From 6f1552ab2738da1f439677625bc13de5d6596d65 Mon Sep 17 00:00:00 2001 From: Bruce Sun Date: Thu, 29 Jun 2017 17:13:22 -0700 Subject: [PATCH 01/45] Bug 1368948: [1/7] Add a script to update PDFium from upstream. r=glandium, r=jwatt MozReview-Commit-ID: 13AQMtDsWXn --- modules/pdfium/README_MOZILLA | 10 +++ modules/pdfium/update.sh | 120 ++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 modules/pdfium/README_MOZILLA create mode 100644 modules/pdfium/update.sh diff --git a/modules/pdfium/README_MOZILLA b/modules/pdfium/README_MOZILLA new file mode 100644 index 000000000000..716a8d07b954 --- /dev/null +++ b/modules/pdfium/README_MOZILLA @@ -0,0 +1,10 @@ +PDFium is a PDF library to view, search, print, and form fill PDF files. + +The source in this directory was copied from upstream by running the +update.sh script from modules/pdfium. Any changes that we make to our +copy of the upstream code should be made by that script (e.g. by applying +patch files after the copy step). + +The upstream repository is https://pdfium.googlesource.com/pdfium + +The git commit ID last used to import was 0000000000000000000000000000000000000000 (0000-00-00 00:00:00 +0000) diff --git a/modules/pdfium/update.sh b/modules/pdfium/update.sh new file mode 100644 index 000000000000..e5df59973a6a --- /dev/null +++ b/modules/pdfium/update.sh @@ -0,0 +1,120 @@ +#!/bin/sh +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# Script to update the mozilla in-tree copy of the PDFium library. +# Run this within the /modules/pdfium directory of the source tree. + +set -e + +COMMIT_SELECTOR="" +COMMIT="" +COMMIT_DATE="" + +print_help() { + echo "usage: ./update.sh [--commit COMMIT]" + echo "" + echo "Update Tool for PDFium Library" + echo "optional arguments:" + echo " --commit COMMIT specify a commit hash or a branch name (default: master)" +} + +checkout_commit() { + if [ -d "pdfium" ]; then + echo "Removing pdfium" + rm -rf pdfium + fi + + echo "Downloading pdfium" + git clone https://pdfium.googlesource.com/pdfium + + echo "Parsing $1" + if [[ $1 =~ ^[0-9A-Fa-f]+$ ]]; then + COMMIT=$(git -C pdfium rev-parse "$1") + else + COMMIT=$(git -C pdfium rev-parse remotes/origin/"$1") + fi + COMMIT_DATE=$(git -C pdfium show -s --format=%ci "$COMMIT") + + echo "Checking out $COMMIT" + git -C pdfium checkout "$COMMIT" +} + +cleanup_files() { + # Remove git source control files. + echo "Removing pdfium/.git and pdfium/.gitignore" + rm -rf pdfium/.git + rm pdfium/.gitignore + + # We remove PDFium's copy of FreeType and link directly to our in-tree copy + # at /modules/freetype2. + # (Our in-tree copy of FreeType is kept up-to-date and the FreeType API is + # generally backwards compatible, so it is unlikely that our copy of the + # PDFium source will be incompatible with our in-tree copy of FreeType.) + echo "Removing pdfium/third_party/freetype" + rm -rf pdfium/third_party/freetype + + # We link PDFium to our in-tree copy of libjpeg at /media/libjpeg + echo "Removing pdfium/third_party/libjpeg" + rm -rf pdfium/third_party/libjpeg + + # We link PDFium to our in-tree copy of zlib at /modules/zlib + echo "Removing pdfium/third_party/zlib_v128" + rm -rf pdfium/third_party/zlib_v128 + + # We don't use libpng since the XFA features are disabled. + echo "Removing pdfium/third_party/libpng16" + rm -rf pdfium/third_party/libpng16 + + # We don't use libtiff since the XFA features are disabled. + echo "Removing pdfium/third_party/libtiff" + rm -rf pdfium/third_party/libtiff + + # We don't use pymock since we don't run the pymock based tests. + echo "Removing pdfium/third_party/pymock" + rm -rf pdfium/third_party/pymock + + # We don't currently need PDfium to support JPEG 2000 since we are not + # currently using PDFium as a general PDF viewer. Currently we only + # process PDF files generated by SkiaPDF, and SkiaPDF doesn't output + # JPEG 2000 images. + echo "Removing pdfium/third_party/libopenjpeg20" + rm -rf pdfium/third_party/libopenjpeg20 + + # We don't currently use any testing data or any testing programs of PDFium. + echo "Removing pdfium/test and pdfium/testing" + rm -rf pdfium/test + rm -rf pdfium/testing + + # We don't need XFA implementations since the XFA features are disabled. + echo "Removing pdfium/xfa" + rm -rf pdfium/xfa +} + +apply_patches() { + # Apply patches, ex: + # patch -p3 < some.patch + return +} + +update_readme() { + echo "Updating README_MOZILLA" + PREFIX="The git commit ID last used to import was" + perl -p -i -e "s/${PREFIX} [0-9A-Fa-f]+ \(.+\)/${PREFIX} ${COMMIT} (${COMMIT_DATE})/" README_MOZILLA +} + +if [ "$#" == 0 ]; then + COMMIT_SELECTOR="master" +elif [ "$#" == 2 -a "$1" == "--commit" ]; then + COMMIT_SELECTOR="$2" +else + print_help + exit 1 +fi + +cd $(dirname $0) +checkout_commit "$COMMIT_SELECTOR" +cleanup_files +apply_patches +update_readme From dd5291a25201d82458d94aaf91561218818e39b2 Mon Sep 17 00:00:00 2001 From: Bruce Sun Date: Thu, 29 Jun 2017 17:14:00 -0700 Subject: [PATCH 02/45] Bug 1368948: [2/7] Add patch files for PDFium. f=glandium, r=jwatt Add patch files for update.sh to automatically modify pdfium sources: - a patch to fix PDFium build errors due to lacking GDI+ prerequisite headers - a patch to let PDFium use freetype library within Gecko - a patch to let PDFium use libjpeg library within Gecko - a patch to let PDFium use zlib library within Gecko - a patch to remove JPEG 2000 support from PDFium MozReview-Commit-ID: HRLLHQnmAZV --- .../bug1368948_gdiplus_prerequisite.patch | 34 ++++ .../patches/bug1368948_remove_openjpeg.patch | 152 ++++++++++++++++++ .../bug1368948_use_gecko_freetype.patch | 32 ++++ .../bug1368948_use_gecko_libjpeg.patch | 32 ++++ .../patches/bug1368948_use_gecko_zlib.patch | 32 ++++ modules/pdfium/update.sh | 22 ++- 6 files changed, 301 insertions(+), 3 deletions(-) create mode 100644 modules/pdfium/patches/bug1368948_gdiplus_prerequisite.patch create mode 100644 modules/pdfium/patches/bug1368948_remove_openjpeg.patch create mode 100644 modules/pdfium/patches/bug1368948_use_gecko_freetype.patch create mode 100644 modules/pdfium/patches/bug1368948_use_gecko_libjpeg.patch create mode 100644 modules/pdfium/patches/bug1368948_use_gecko_zlib.patch diff --git a/modules/pdfium/patches/bug1368948_gdiplus_prerequisite.patch b/modules/pdfium/patches/bug1368948_gdiplus_prerequisite.patch new file mode 100644 index 000000000000..7402002dc0eb --- /dev/null +++ b/modules/pdfium/patches/bug1368948_gdiplus_prerequisite.patch @@ -0,0 +1,34 @@ +# HG changeset patch +# User Bruce Sun +# Date 1498781240 25200 +# Thu Jun 29 17:07:20 2017 -0700 +# Node ID 20556f24d36ccfb4471b9ef86241a6f8912e8a19 +# Parent 5c522cd3d85e88d3cd7415c917985af687a8a0a6 +Bug 1368948: Undefine WIN32_LEAN_AND_MEAN when building PDFium to avoid build errors in GDI+ headers. + +Mozilla build system includes mozilla-config.h, which defines WIN32_LEAN_AND_MEAN. +Some definitions are stripped from header files by WIN32_LEAN_AND_MEAN causing build +errors in GDI+ headers. Including objidl.h would fix these errors, but since Chromium +builds PDFium without WIN32_LEAN_AND_MEAN, we do the same. + +MozReview-Commit-ID: HQYrtJgQXHP + +diff --git a/modules/pdfium/pdfium/core/fxge/win32/fx_win32_gdipext.cpp b/modules/pdfium/pdfium/core/fxge/win32/fx_win32_gdipext.cpp +--- a/modules/pdfium/pdfium/core/fxge/win32/fx_win32_gdipext.cpp ++++ b/modules/pdfium/pdfium/core/fxge/win32/fx_win32_gdipext.cpp +@@ -1,14 +1,15 @@ + // Copyright 2014 PDFium Authors. All rights reserved. + // Use of this source code is governed by a BSD-style license that can be + // found in the LICENSE file. + + // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + ++#undef WIN32_LEAN_AND_MEAN + #include + + #include + #include + + #include "core/fxcrt/fx_system.h" + #include "core/fxge/cfx_gemodule.h" + #include "core/fxge/cfx_graphstatedata.h" diff --git a/modules/pdfium/patches/bug1368948_remove_openjpeg.patch b/modules/pdfium/patches/bug1368948_remove_openjpeg.patch new file mode 100644 index 000000000000..432c53de5049 --- /dev/null +++ b/modules/pdfium/patches/bug1368948_remove_openjpeg.patch @@ -0,0 +1,152 @@ +# HG changeset patch +# User Bruce Sun +# Date 1498781299 25200 +# Thu Jun 29 17:08:19 2017 -0700 +# Node ID ae3e3cc9d3048e4ed01890c362810e3816b7b6ea +# Parent dec90fe0b38375822ff169695c2ac18b96be4f51 +Bug 1368948: Prevent PDFium from trying to use the removed OpenJPEG code. + +Our PDFium update script at modules/pdfium/update.sh removes the OpenJPEG code +from our copy of PDFium. This patch makes sure that the remaining PDFium code +does not try to use OpenJPEG. + +MozReview-Commit-ID: 1ef0OObTzHw + +diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jpxmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jpxmodule.h +--- a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jpxmodule.h ++++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jpxmodule.h +@@ -11,26 +11,26 @@ + + #include "core/fxcrt/fx_system.h" + + class CJPX_Decoder; + class CPDF_ColorSpace; + + class CCodec_JpxModule { + public: +- CCodec_JpxModule(); +- ~CCodec_JpxModule(); ++ CCodec_JpxModule() {} ++ ~CCodec_JpxModule() {} + + CJPX_Decoder* CreateDecoder(const uint8_t* src_buf, + uint32_t src_size, +- CPDF_ColorSpace* cs); ++ CPDF_ColorSpace* cs) { return nullptr; } + void GetImageInfo(CJPX_Decoder* pDecoder, + uint32_t* width, + uint32_t* height, +- uint32_t* components); ++ uint32_t* components) {} + bool Decode(CJPX_Decoder* pDecoder, + uint8_t* dest_data, + int pitch, +- const std::vector& offsets); +- void DestroyDecoder(CJPX_Decoder* pDecoder); ++ const std::vector& offsets) { return false; } ++ void DestroyDecoder(CJPX_Decoder* pDecoder) {} + }; + + #endif // CORE_FXCODEC_CODEC_CCODEC_JPXMODULE_H_ +diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec.cpp +--- a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec.cpp ++++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec.cpp +@@ -6,17 +6,16 @@ + + #include "core/fxcodec/fx_codec.h" + + #include + #include + #include + #include + +-#include "core/fxcodec/codec/codec_int.h" + #include "core/fxcrt/fx_ext.h" + #include "core/fxcrt/fx_safe_types.h" + #include "third_party/base/logging.h" + #include "third_party/base/ptr_util.h" + + CCodec_ModuleMgr::CCodec_ModuleMgr() + : m_pBasicModule(new CCodec_BasicModule), + m_pFaxModule(new CCodec_FaxModule), +diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_fax.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_fax.cpp +--- a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_fax.cpp ++++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_fax.cpp +@@ -3,17 +3,16 @@ + // found in the LICENSE file. + + // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + + #include + #include + #include + +-#include "core/fxcodec/codec/codec_int.h" + #include "core/fxcodec/fx_codec.h" + #include "core/fxcrt/fx_memory.h" + #include "third_party/base/ptr_util.h" + + namespace { + + const uint8_t OneLeadPos[256] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, +diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_flate.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_flate.cpp +--- a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_flate.cpp ++++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_flate.cpp +@@ -1,16 +1,14 @@ + // Copyright 2014 PDFium Authors. All rights reserved. + // Use of this source code is governed by a BSD-style license that can be + // found in the LICENSE file. + + // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +-#include "core/fxcodec/codec/codec_int.h" +- + #include + #include + #include + #include + + #include "core/fxcodec/fx_codec.h" + #include "core/fxcrt/fx_ext.h" + #include "third_party/base/ptr_util.h" +diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_icc.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_icc.cpp +--- a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_icc.cpp ++++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_icc.cpp +@@ -1,15 +1,14 @@ + // Copyright 2014 PDFium Authors. All rights reserved. + // Use of this source code is governed by a BSD-style license that can be + // found in the LICENSE file. + + // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +-#include "core/fxcodec/codec/codec_int.h" + #include "core/fxcodec/fx_codec.h" + #include "third_party/lcms2-2.6/include/lcms2.h" + + struct CLcmsCmm { + cmsHTRANSFORM m_hTransform; + int m_nSrcComponents; + int m_nDstComponents; + bool m_bLab; +diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpeg.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpeg.cpp +--- a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpeg.cpp ++++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpeg.cpp +@@ -4,17 +4,16 @@ + + // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + + #include + + #include + #include + +-#include "core/fxcodec/codec/codec_int.h" + #include "core/fxcodec/fx_codec.h" + #include "core/fxcrt/fx_safe_types.h" + #include "core/fxge/fx_dib.h" + #include "third_party/base/ptr_util.h" + + extern "C" { + #undef FAR + #if defined(USE_SYSTEM_LIBJPEG) diff --git a/modules/pdfium/patches/bug1368948_use_gecko_freetype.patch b/modules/pdfium/patches/bug1368948_use_gecko_freetype.patch new file mode 100644 index 000000000000..b6ee60e2e690 --- /dev/null +++ b/modules/pdfium/patches/bug1368948_use_gecko_freetype.patch @@ -0,0 +1,32 @@ +# HG changeset patch +# User Bruce Sun +# Date 1498781255 25200 +# Thu Jun 29 17:07:35 2017 -0700 +# Node ID 528bde20b353af9b8f075c4d2c54f63061eb0e61 +# Parent 20556f24d36ccfb4471b9ef86241a6f8912e8a19 +Bug 1368948: Make PDFium use Mozilla's in-tree copy of FreeType instead of its own copy. + +MozReview-Commit-ID: 8P48C8xavbs + +diff --git a/modules/pdfium/pdfium/core/fxge/freetype/fx_freetype.cpp b/modules/pdfium/pdfium/core/fxge/freetype/fx_freetype.cpp +--- a/modules/pdfium/pdfium/core/fxge/freetype/fx_freetype.cpp ++++ b/modules/pdfium/pdfium/core/fxge/freetype/fx_freetype.cpp +@@ -1,17 +1,17 @@ + // Copyright 2014 PDFium Authors. All rights reserved. + // Use of this source code is governed by a BSD-style license that can be + // found in the LICENSE file. + + // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + + #include "core/fxge/fx_freetype.h" + +-#include "third_party/freetype/src/psnames/pstables.h" ++#include "psnames/pstables.h" + + static int xyq_search_node(char* glyph_name, + int name_offset, + int table_offset, + wchar_t unicode) { + int i, count; + + // copy letters diff --git a/modules/pdfium/patches/bug1368948_use_gecko_libjpeg.patch b/modules/pdfium/patches/bug1368948_use_gecko_libjpeg.patch new file mode 100644 index 000000000000..b181ff099140 --- /dev/null +++ b/modules/pdfium/patches/bug1368948_use_gecko_libjpeg.patch @@ -0,0 +1,32 @@ +# HG changeset patch +# User Bruce Sun +# Date 1498781267 25200 +# Thu Jun 29 17:07:47 2017 -0700 +# Node ID 7a6b973eaa086031ad64990d96bbf157ef02ea65 +# Parent 528bde20b353af9b8f075c4d2c54f63061eb0e61 +Bug 1368948: Make PDFium use Mozilla's in-tree copy of libjpeg instead of its own copy. + +MozReview-Commit-ID: Fbc6EdA4OBY + +diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpeg.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpeg.cpp +--- a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpeg.cpp ++++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpeg.cpp +@@ -15,17 +15,17 @@ + #include "core/fxge/fx_dib.h" + #include "third_party/base/ptr_util.h" + + extern "C" { + #undef FAR + #if defined(USE_SYSTEM_LIBJPEG) + #include + #elif defined(USE_LIBJPEG_TURBO) +-#include "third_party/libjpeg_turbo/jpeglib.h" ++#include "jpeglib.h" + #else + #include "third_party/libjpeg/jpeglib.h" + #endif + } + + extern "C" { + + static void JpegScanSOI(const uint8_t** src_buf, uint32_t* src_size) { diff --git a/modules/pdfium/patches/bug1368948_use_gecko_zlib.patch b/modules/pdfium/patches/bug1368948_use_gecko_zlib.patch new file mode 100644 index 000000000000..0cde2be44f70 --- /dev/null +++ b/modules/pdfium/patches/bug1368948_use_gecko_zlib.patch @@ -0,0 +1,32 @@ +# HG changeset patch +# User Bruce Sun +# Date 1498781283 25200 +# Thu Jun 29 17:08:03 2017 -0700 +# Node ID dec90fe0b38375822ff169695c2ac18b96be4f51 +# Parent 7a6b973eaa086031ad64990d96bbf157ef02ea65 +Bug 1368948: Make PDFium use Mozilla's in-tree copy of zlip instead of its own copy. + +MozReview-Commit-ID: FlQwnJ9O3cQ + +diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_flate.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_flate.cpp +--- a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_flate.cpp ++++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_flate.cpp +@@ -9,17 +9,17 @@ + #include + #include + #include + #include + + #include "core/fxcodec/fx_codec.h" + #include "core/fxcrt/fx_ext.h" + #include "third_party/base/ptr_util.h" +-#include "third_party/zlib_v128/zlib.h" ++#include "zlib.h" + + extern "C" { + static void* my_alloc_func(void* opaque, + unsigned int items, + unsigned int size) { + return FX_Alloc2D(uint8_t, items, size); + } + static void my_free_func(void* opaque, void* address) { diff --git a/modules/pdfium/update.sh b/modules/pdfium/update.sh index e5df59973a6a..ec4955c5a0b4 100644 --- a/modules/pdfium/update.sh +++ b/modules/pdfium/update.sh @@ -93,9 +93,25 @@ cleanup_files() { } apply_patches() { - # Apply patches, ex: - # patch -p3 < some.patch - return + # Patch to fix build errors due to lacking GDI+ prerequisite headers + echo "Applying patches/bug1368948_gdiplus_prerequisite.patch" + patch -p3 < patches/bug1368948_gdiplus_prerequisite.patch + + # Patch to use freetype library within Gecko + echo "Applying patches/bug1368948_use_gecko_freetype.patch" + patch -p3 < patches/bug1368948_use_gecko_freetype.patch + + # Patch to use libjpeg library within Gecko + echo "Applying patches/bug1368948_use_gecko_libjpeg.patch" + patch -p3 < patches/bug1368948_use_gecko_libjpeg.patch + + # Patch to use zlib library within Gecko + echo "Applying patches/bug1368948_use_gecko_zlib.patch" + patch -p3 < patches/bug1368948_use_gecko_zlib.patch + + # Patch to remove openjpeg support + echo "Applying patches/bug1368948_remove_openjpeg.patch" + patch -p3 < patches/bug1368948_remove_openjpeg.patch } update_readme() { From 8bbccf1c91908f11ca7aafe1355825827f44476d Mon Sep 17 00:00:00 2001 From: Bruce Sun Date: Thu, 29 Jun 2017 17:15:01 -0700 Subject: [PATCH 03/45] Bug 1368948: [3/7] Add PDfium files (chromium/3029) with patches. r=jwatt Corresponding chromium version: 58.0.3029.110 Update command: ./update.sh --commit chromium/3029 MozReview-Commit-ID: HFN3EPkFkN --- modules/pdfium/README_MOZILLA | 2 +- modules/pdfium/pdfium/.clang-format | 2 + modules/pdfium/pdfium/.gn | 15 + modules/pdfium/pdfium/AUTHORS | 41 + modules/pdfium/pdfium/BUILD.gn | 1891 +++ modules/pdfium/pdfium/DEPS | 201 + modules/pdfium/pdfium/LICENSE | 27 + modules/pdfium/pdfium/OWNERS | 13 + modules/pdfium/pdfium/PRESUBMIT.py | 261 + modules/pdfium/pdfium/README.md | 159 + .../pdfium/pdfium/build_overrides/README.md | 28 + .../pdfium/pdfium/build_overrides/build.gni | 62 + .../pdfium/pdfium/build_overrides/gtest.gni | 15 + .../pdfium/pdfium/build_overrides/pdfium.gni | 20 + modules/pdfium/pdfium/codereview.settings | 8 + .../pdfium/core/fdrm/crypto/fx_crypt.cpp | 254 + .../pdfium/pdfium/core/fdrm/crypto/fx_crypt.h | 116 + .../pdfium/core/fdrm/crypto/fx_crypt_aes.cpp | 833 ++ .../pdfium/core/fdrm/crypto/fx_crypt_sha.cpp | 661 + .../core/fdrm/crypto/fx_crypt_unittest.cpp | 229 + .../fpdfapi/cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp | 2131 +++ .../core/fpdfapi/cmaps/CNS1/B5pc-H_0.cpp | 93 + .../core/fpdfapi/cmaps/CNS1/B5pc-V_0.cpp | 14 + .../core/fpdfapi/cmaps/CNS1/CNS-EUC-H_0.cpp | 172 + .../core/fpdfapi/cmaps/CNS1/CNS-EUC-V_0.cpp | 189 + .../core/fpdfapi/cmaps/CNS1/ETen-B5-H_0.cpp | 95 + .../core/fpdfapi/cmaps/CNS1/ETen-B5-V_0.cpp | 15 + .../core/fpdfapi/cmaps/CNS1/ETenms-B5-H_0.cpp | 11 + .../core/fpdfapi/cmaps/CNS1/ETenms-B5-V_0.cpp | 16 + .../core/fpdfapi/cmaps/CNS1/HKscs-B5-H_5.cpp | 414 + .../core/fpdfapi/cmaps/CNS1/HKscs-B5-V_5.cpp | 15 + .../fpdfapi/cmaps/CNS1/UniCNS-UCS2-H_3.cpp | 5483 ++++++++ .../fpdfapi/cmaps/CNS1/UniCNS-UCS2-V_3.cpp | 15 + .../fpdfapi/cmaps/CNS1/UniCNS-UTF16-H_0.cpp | 3245 +++++ .../core/fpdfapi/cmaps/CNS1/cmaps_cns1.cpp | 56 + .../core/fpdfapi/cmaps/CNS1/cmaps_cns1.h | 29 + .../fpdfapi/cmaps/GB1/Adobe-GB1-UCS2_5.cpp | 3375 +++++ .../core/fpdfapi/cmaps/GB1/GB-EUC-H_0.cpp | 40 + .../core/fpdfapi/cmaps/GB1/GB-EUC-V_0.cpp | 17 + .../core/fpdfapi/cmaps/GB1/GBK-EUC-H_2.cpp | 1367 ++ .../core/fpdfapi/cmaps/GB1/GBK-EUC-V_2.cpp | 17 + .../core/fpdfapi/cmaps/GB1/GBK2K-H_5.cpp | 1822 +++ .../core/fpdfapi/cmaps/GB1/GBK2K-V_5.cpp | 24 + .../core/fpdfapi/cmaps/GB1/GBKp-EUC-H_2.cpp | 1367 ++ .../core/fpdfapi/cmaps/GB1/GBKp-EUC-V_2.cpp | 17 + .../core/fpdfapi/cmaps/GB1/GBpc-EUC-H_0.cpp | 41 + .../core/fpdfapi/cmaps/GB1/GBpc-EUC-V_0.cpp | 17 + .../core/fpdfapi/cmaps/GB1/UniGB-UCS2-H_4.cpp | 4619 +++++++ .../core/fpdfapi/cmaps/GB1/UniGB-UCS2-V_4.cpp | 18 + .../core/fpdfapi/cmaps/GB1/cmaps_gb1.cpp | 55 + .../pdfium/core/fpdfapi/cmaps/GB1/cmaps_gb1.h | 27 + .../fpdfapi/cmaps/Japan1/83pv-RKSJ-H_1.cpp | 84 + .../fpdfapi/cmaps/Japan1/90ms-RKSJ-H_2.cpp | 67 + .../fpdfapi/cmaps/Japan1/90ms-RKSJ-V_2.cpp | 36 + .../fpdfapi/cmaps/Japan1/90msp-RKSJ-H_2.cpp | 67 + .../fpdfapi/cmaps/Japan1/90msp-RKSJ-V_2.cpp | 36 + .../fpdfapi/cmaps/Japan1/90pv-RKSJ-H_1.cpp | 98 + .../fpdfapi/cmaps/Japan1/Add-RKSJ-H_1.cpp | 222 + .../fpdfapi/cmaps/Japan1/Add-RKSJ-V_1.cpp | 29 + .../cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp | 1726 +++ .../core/fpdfapi/cmaps/Japan1/EUC-H_1.cpp | 50 + .../core/fpdfapi/cmaps/Japan1/EUC-V_1.cpp | 19 + .../fpdfapi/cmaps/Japan1/Ext-RKSJ-H_2.cpp | 232 + .../fpdfapi/cmaps/Japan1/Ext-RKSJ-V_2.cpp | 23 + .../pdfium/core/fpdfapi/cmaps/Japan1/H_1.cpp | 50 + .../cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp | 12 + .../cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp | 77 + .../fpdfapi/cmaps/Japan1/UniJIS-UCS2-H_4.cpp | 2182 +++ .../fpdfapi/cmaps/Japan1/UniJIS-UCS2-V_4.cpp | 66 + .../pdfium/core/fpdfapi/cmaps/Japan1/V_1.cpp | 19 + .../fpdfapi/cmaps/Japan1/cmaps_japan1.cpp | 68 + .../core/fpdfapi/cmaps/Japan1/cmaps_japan1.h | 35 + .../cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp | 2050 +++ .../core/fpdfapi/cmaps/Korea1/KSC-EUC-H_0.cpp | 166 + .../core/fpdfapi/cmaps/Korea1/KSC-EUC-V_0.cpp | 16 + .../fpdfapi/cmaps/Korea1/KSCms-UHC-HW-H_1.cpp | 235 + .../fpdfapi/cmaps/Korea1/KSCms-UHC-HW-V_1.cpp | 16 + .../fpdfapi/cmaps/Korea1/KSCms-UHC-H_1.cpp | 235 + .../fpdfapi/cmaps/Korea1/KSCms-UHC-V_1.cpp | 16 + .../fpdfapi/cmaps/Korea1/KSCpc-EUC-H_0.cpp | 180 + .../fpdfapi/cmaps/Korea1/UniKS-UCS2-H_1.cpp | 2808 ++++ .../fpdfapi/cmaps/Korea1/UniKS-UCS2-V_1.cpp | 16 + .../fpdfapi/cmaps/Korea1/UniKS-UTF16-H_0.cpp | 46 + .../fpdfapi/cmaps/Korea1/cmaps_korea1.cpp | 50 + .../core/fpdfapi/cmaps/Korea1/cmaps_korea1.h | 24 + .../pdfium/core/fpdfapi/cmaps/cmap_int.h | 33 + .../pdfium/core/fpdfapi/cmaps/fpdf_cmaps.cpp | 154 + .../pdfium/core/fpdfapi/cpdf_modulemgr.cpp | 62 + .../pdfium/core/fpdfapi/cpdf_modulemgr.h | 76 + .../core/fpdfapi/cpdf_pagerendercontext.cpp | 18 + .../core/fpdfapi/cpdf_pagerendercontext.h | 31 + .../pdfium/core/fpdfapi/edit/cpdf_creator.h | 103 + .../edit/cpdf_pagecontentgenerator.cpp | 276 + .../fpdfapi/edit/cpdf_pagecontentgenerator.h | 44 + .../cpdf_pagecontentgenerator_unittest.cpp | 178 + .../pdfium/pdfium/core/fpdfapi/edit/editint.h | 77 + .../core/fpdfapi/edit/fpdf_edit_create.cpp | 1995 +++ .../pdfium/core/fpdfapi/font/cpdf_cidfont.cpp | 851 ++ .../pdfium/core/fpdfapi/font/cpdf_cidfont.h | 92 + .../pdfium/core/fpdfapi/font/cpdf_font.cpp | 470 + .../pdfium/core/fpdfapi/font/cpdf_font.h | 116 + .../core/fpdfapi/font/cpdf_fontencoding.cpp | 1819 +++ .../core/fpdfapi/font/cpdf_fontencoding.h | 63 + .../core/fpdfapi/font/cpdf_simplefont.cpp | 212 + .../core/fpdfapi/font/cpdf_simplefont.h | 49 + .../core/fpdfapi/font/cpdf_truetypefont.cpp | 223 + .../core/fpdfapi/font/cpdf_truetypefont.h | 30 + .../core/fpdfapi/font/cpdf_type1font.cpp | 342 + .../pdfium/core/fpdfapi/font/cpdf_type1font.h | 40 + .../core/fpdfapi/font/cpdf_type3char.cpp | 38 + .../pdfium/core/fpdfapi/font/cpdf_type3char.h | 35 + .../core/fpdfapi/font/cpdf_type3font.cpp | 152 + .../pdfium/core/fpdfapi/font/cpdf_type3font.h | 59 + .../pdfium/core/fpdfapi/font/font_int.h | 211 + .../pdfium/core/fpdfapi/font/fpdf_font.cpp | 315 + .../core/fpdfapi/font/fpdf_font_cid.cpp | 787 ++ .../fpdfapi/font/fpdf_font_cid_unittest.cpp | 70 + .../core/fpdfapi/font/fpdf_font_unittest.cpp | 30 + .../pdfium/core/fpdfapi/font/ttgsubtable.cpp | 426 + .../pdfium/core/fpdfapi/font/ttgsubtable.h | 311 + .../core/fpdfapi/page/cpdf_allstates.cpp | 173 + .../pdfium/core/fpdfapi/page/cpdf_allstates.h | 37 + .../core/fpdfapi/page/cpdf_clippath.cpp | 131 + .../pdfium/core/fpdfapi/page/cpdf_clippath.h | 63 + .../pdfium/core/fpdfapi/page/cpdf_color.cpp | 155 + .../pdfium/core/fpdfapi/page/cpdf_color.h | 41 + .../core/fpdfapi/page/cpdf_colorspace.cpp | 1272 ++ .../core/fpdfapi/page/cpdf_colorspace.h | 118 + .../core/fpdfapi/page/cpdf_colorstate.cpp | 154 + .../core/fpdfapi/page/cpdf_colorstate.h | 77 + .../core/fpdfapi/page/cpdf_contentmark.cpp | 127 + .../core/fpdfapi/page/cpdf_contentmark.h | 64 + .../fpdfapi/page/cpdf_contentmarkitem.cpp | 52 + .../core/fpdfapi/page/cpdf_contentmarkitem.h | 44 + .../core/fpdfapi/page/cpdf_contentparser.cpp | 222 + .../core/fpdfapi/page/cpdf_contentparser.h | 59 + .../core/fpdfapi/page/cpdf_countedobject.h | 50 + .../core/fpdfapi/page/cpdf_docpagedata.cpp | 541 + .../core/fpdfapi/page/cpdf_docpagedata.h | 85 + .../pdfium/core/fpdfapi/page/cpdf_form.cpp | 54 + .../pdfium/core/fpdfapi/page/cpdf_form.h | 39 + .../core/fpdfapi/page/cpdf_formobject.cpp | 43 + .../core/fpdfapi/page/cpdf_formobject.h | 36 + .../core/fpdfapi/page/cpdf_generalstate.cpp | 283 + .../core/fpdfapi/page/cpdf_generalstate.h | 109 + .../core/fpdfapi/page/cpdf_graphicstates.cpp | 24 + .../core/fpdfapi/page/cpdf_graphicstates.h | 31 + .../pdfium/core/fpdfapi/page/cpdf_image.cpp | 384 + .../pdfium/core/fpdfapi/page/cpdf_image.h | 83 + .../core/fpdfapi/page/cpdf_imageobject.cpp | 77 + .../core/fpdfapi/page/cpdf_imageobject.h | 45 + .../core/fpdfapi/page/cpdf_meshstream.cpp | 257 + .../core/fpdfapi/page/cpdf_meshstream.h | 87 + .../pdfium/core/fpdfapi/page/cpdf_page.cpp | 187 + .../pdfium/core/fpdfapi/page/cpdf_page.h | 83 + .../core/fpdfapi/page/cpdf_pagemodule.cpp | 35 + .../core/fpdfapi/page/cpdf_pagemodule.h | 33 + .../core/fpdfapi/page/cpdf_pageobject.cpp | 99 + .../core/fpdfapi/page/cpdf_pageobject.h | 74 + .../fpdfapi/page/cpdf_pageobjectholder.cpp | 80 + .../core/fpdfapi/page/cpdf_pageobjectholder.h | 70 + .../core/fpdfapi/page/cpdf_pageobjectlist.cpp | 16 + .../core/fpdfapi/page/cpdf_pageobjectlist.h | 21 + .../pdfium/core/fpdfapi/page/cpdf_path.cpp | 65 + .../pdfium/core/fpdfapi/page/cpdf_path.h | 49 + .../core/fpdfapi/page/cpdf_pathobject.cpp | 56 + .../core/fpdfapi/page/cpdf_pathobject.h | 35 + .../pdfium/core/fpdfapi/page/cpdf_pattern.cpp | 18 + .../pdfium/core/fpdfapi/page/cpdf_pattern.h | 45 + .../pdfium/core/fpdfapi/page/cpdf_psengine.h | 100 + .../core/fpdfapi/page/cpdf_shadingobject.cpp | 53 + .../core/fpdfapi/page/cpdf_shadingobject.h | 33 + .../core/fpdfapi/page/cpdf_shadingpattern.cpp | 101 + .../core/fpdfapi/page/cpdf_shadingpattern.h | 75 + .../fpdfapi/page/cpdf_streamcontentparser.cpp | 1642 +++ .../fpdfapi/page/cpdf_streamcontentparser.h | 223 + .../cpdf_streamcontentparser_unittest.cpp | 34 + .../core/fpdfapi/page/cpdf_streamparser.cpp | 606 + .../core/fpdfapi/page/cpdf_streamparser.h | 62 + .../page/cpdf_streamparser_unittest.cpp | 47 + .../core/fpdfapi/page/cpdf_textobject.cpp | 294 + .../core/fpdfapi/page/cpdf_textobject.h | 72 + .../core/fpdfapi/page/cpdf_textstate.cpp | 186 + .../pdfium/core/fpdfapi/page/cpdf_textstate.h | 91 + .../core/fpdfapi/page/cpdf_tilingpattern.cpp | 55 + .../core/fpdfapi/page/cpdf_tilingpattern.h | 46 + .../core/fpdfapi/page/fpdf_page_colors.cpp | 240 + .../core/fpdfapi/page/fpdf_page_func.cpp | 862 ++ .../page/fpdf_page_func_embeddertest.cpp | 21 + .../pdfium/pdfium/core/fpdfapi/page/pageint.h | 206 + .../core/fpdfapi/parser/cfdf_document.cpp | 100 + .../core/fpdfapi/parser/cfdf_document.h | 39 + .../pdfium/core/fpdfapi/parser/cpdf_array.cpp | 192 + .../pdfium/core/fpdfapi/parser/cpdf_array.h | 132 + .../fpdfapi/parser/cpdf_array_unittest.cpp | 177 + .../core/fpdfapi/parser/cpdf_boolean.cpp | 46 + .../pdfium/core/fpdfapi/parser/cpdf_boolean.h | 44 + .../fpdfapi/parser/cpdf_crypto_handler.cpp | 342 + .../core/fpdfapi/parser/cpdf_crypto_handler.h | 70 + .../core/fpdfapi/parser/cpdf_data_avail.cpp | 1689 +++ .../core/fpdfapi/parser/cpdf_data_avail.h | 257 + .../core/fpdfapi/parser/cpdf_dictionary.cpp | 238 + .../core/fpdfapi/parser/cpdf_dictionary.h | 131 + .../core/fpdfapi/parser/cpdf_document.cpp | 1054 ++ .../core/fpdfapi/parser/cpdf_document.h | 153 + .../fpdfapi/parser/cpdf_document_unittest.cpp | 221 + .../core/fpdfapi/parser/cpdf_hint_tables.cpp | 512 + .../core/fpdfapi/parser/cpdf_hint_tables.h | 69 + .../parser/cpdf_indirect_object_holder.cpp | 89 + .../parser/cpdf_indirect_object_holder.h | 78 + .../fpdfapi/parser/cpdf_linearized_header.cpp | 72 + .../fpdfapi/parser/cpdf_linearized_header.h | 55 + .../pdfium/core/fpdfapi/parser/cpdf_name.cpp | 51 + .../pdfium/core/fpdfapi/parser/cpdf_name.h | 43 + .../pdfium/core/fpdfapi/parser/cpdf_null.cpp | 18 + .../pdfium/core/fpdfapi/parser/cpdf_null.h | 23 + .../core/fpdfapi/parser/cpdf_number.cpp | 57 + .../pdfium/core/fpdfapi/parser/cpdf_number.h | 53 + .../core/fpdfapi/parser/cpdf_object.cpp | 159 + .../pdfium/core/fpdfapi/parser/cpdf_object.h | 128 + .../fpdfapi/parser/cpdf_object_unittest.cpp | 880 ++ .../core/fpdfapi/parser/cpdf_parser.cpp | 1579 +++ .../pdfium/core/fpdfapi/parser/cpdf_parser.h | 183 + .../parser/cpdf_parser_embeddertest.cpp | 59 + .../fpdfapi/parser/cpdf_parser_unittest.cpp | 209 + .../core/fpdfapi/parser/cpdf_reference.cpp | 84 + .../core/fpdfapi/parser/cpdf_reference.h | 57 + .../fpdfapi/parser/cpdf_security_handler.cpp | 715 + .../fpdfapi/parser/cpdf_security_handler.h | 110 + .../cpdf_security_handler_embeddertest.cpp | 54 + .../fpdfapi/parser/cpdf_simple_parser.cpp | 170 + .../core/fpdfapi/parser/cpdf_simple_parser.h | 35 + .../parser/cpdf_simple_parser_unittest.cpp | 96 + .../core/fpdfapi/parser/cpdf_stream.cpp | 133 + .../pdfium/core/fpdfapi/parser/cpdf_stream.h | 84 + .../core/fpdfapi/parser/cpdf_stream_acc.cpp | 87 + .../core/fpdfapi/parser/cpdf_stream_acc.h | 51 + .../core/fpdfapi/parser/cpdf_string.cpp | 66 + .../pdfium/core/fpdfapi/parser/cpdf_string.h | 52 + .../fpdfapi/parser/cpdf_syntax_parser.cpp | 914 ++ .../core/fpdfapi/parser/cpdf_syntax_parser.h | 104 + .../parser/cpdf_syntax_parser_unittest.cpp | 156 + .../fpdfapi/parser/fpdf_parser_decode.cpp | 575 + .../core/fpdfapi/parser/fpdf_parser_decode.h | 95 + .../fpdf_parser_decode_embeddertest.cpp | 126 + .../parser/fpdf_parser_decode_unittest.cpp | 111 + .../fpdfapi/parser/fpdf_parser_utility.cpp | 222 + .../core/fpdfapi/parser/fpdf_parser_utility.h | 40 + .../core/fpdfapi/render/cpdf_charposlist.cpp | 89 + .../core/fpdfapi/render/cpdf_charposlist.h | 29 + .../core/fpdfapi/render/cpdf_devicebuffer.cpp | 76 + .../core/fpdfapi/render/cpdf_devicebuffer.h | 41 + .../core/fpdfapi/render/cpdf_dibsource.cpp | 1427 ++ .../core/fpdfapi/render/cpdf_dibsource.h | 145 + .../fpdfapi/render/cpdf_dibtransferfunc.cpp | 178 + .../fpdfapi/render/cpdf_dibtransferfunc.h | 37 + .../fpdfapi/render/cpdf_docrenderdata.cpp | 155 + .../core/fpdfapi/render/cpdf_docrenderdata.h | 43 + .../fpdfapi/render/cpdf_imagecacheentry.cpp | 135 + .../fpdfapi/render/cpdf_imagecacheentry.h | 61 + .../core/fpdfapi/render/cpdf_imageloader.cpp | 83 + .../core/fpdfapi/render/cpdf_imageloader.h | 48 + .../fpdfapi/render/cpdf_imagerenderer.cpp | 572 + .../core/fpdfapi/render/cpdf_imagerenderer.h | 80 + .../fpdfapi/render/cpdf_pagerendercache.cpp | 143 + .../fpdfapi/render/cpdf_pagerendercache.h | 57 + .../render/cpdf_progressiverenderer.cpp | 114 + .../fpdfapi/render/cpdf_progressiverenderer.h | 60 + .../fpdfapi/render/cpdf_rendercontext.cpp | 96 + .../core/fpdfapi/render/cpdf_rendercontext.h | 69 + .../fpdfapi/render/cpdf_renderoptions.cpp | 63 + .../core/fpdfapi/render/cpdf_renderoptions.h | 56 + .../core/fpdfapi/render/cpdf_renderstatus.cpp | 2652 ++++ .../core/fpdfapi/render/cpdf_renderstatus.h | 179 + .../render/cpdf_scaledrenderbuffer.cpp | 80 + .../fpdfapi/render/cpdf_scaledrenderbuffer.h | 46 + .../core/fpdfapi/render/cpdf_textrenderer.cpp | 168 + .../core/fpdfapi/render/cpdf_textrenderer.h | 59 + .../core/fpdfapi/render/cpdf_transferfunc.cpp | 25 + .../core/fpdfapi/render/cpdf_transferfunc.h | 26 + .../core/fpdfapi/render/cpdf_type3cache.cpp | 171 + .../core/fpdfapi/render/cpdf_type3cache.h | 40 + .../core/fpdfapi/render/cpdf_type3glyphs.cpp | 46 + .../core/fpdfapi/render/cpdf_type3glyphs.h | 35 + .../fpdf_render_loadimage_embeddertest.cpp | 42 + .../fpdf_render_pattern_embeddertest.cpp | 18 + modules/pdfium/pdfium/core/fpdfdoc/cline.cpp | 38 + modules/pdfium/pdfium/core/fpdfdoc/cline.h | 26 + modules/pdfium/pdfium/core/fpdfdoc/clines.cpp | 52 + modules/pdfium/pdfium/core/fpdfdoc/clines.h | 35 + .../pdfium/core/fpdfdoc/cpdf_aaction.cpp | 24 + .../pdfium/pdfium/core/fpdfdoc/cpdf_aaction.h | 51 + .../pdfium/core/fpdfdoc/cpdf_action.cpp | 137 + .../pdfium/pdfium/core/fpdfdoc/cpdf_action.h | 59 + .../pdfium/core/fpdfdoc/cpdf_actionfields.cpp | 96 + .../pdfium/core/fpdfdoc/cpdf_actionfields.h | 29 + .../pdfium/pdfium/core/fpdfdoc/cpdf_annot.cpp | 507 + .../pdfium/pdfium/core/fpdfdoc/cpdf_annot.h | 130 + .../pdfium/core/fpdfdoc/cpdf_annotlist.cpp | 183 + .../pdfium/core/fpdfdoc/cpdf_annotlist.h | 64 + .../pdfium/core/fpdfdoc/cpdf_apsettings.cpp | 121 + .../pdfium/core/fpdfdoc/cpdf_apsettings.h | 74 + .../pdfium/core/fpdfdoc/cpdf_bookmark.cpp | 73 + .../pdfium/core/fpdfdoc/cpdf_bookmark.h | 33 + .../pdfium/core/fpdfdoc/cpdf_bookmarktree.cpp | 34 + .../pdfium/core/fpdfdoc/cpdf_bookmarktree.h | 26 + .../core/fpdfdoc/cpdf_defaultappearance.cpp | 223 + .../core/fpdfdoc/cpdf_defaultappearance.h | 52 + .../pdfium/pdfium/core/fpdfdoc/cpdf_dest.cpp | 123 + .../pdfium/pdfium/core/fpdfdoc/cpdf_dest.h | 39 + .../core/fpdfdoc/cpdf_dest_unittest.cpp | 61 + .../pdfium/core/fpdfdoc/cpdf_docjsactions.cpp | 40 + .../pdfium/core/fpdfdoc/cpdf_docjsactions.h | 29 + .../pdfium/core/fpdfdoc/cpdf_filespec.cpp | 170 + .../pdfium/core/fpdfdoc/cpdf_filespec.h | 37 + .../core/fpdfdoc/cpdf_filespec_unittest.cpp | 163 + .../pdfium/core/fpdfdoc/cpdf_formcontrol.cpp | 331 + .../pdfium/core/fpdfdoc/cpdf_formcontrol.h | 134 + .../pdfium/core/fpdfdoc/cpdf_formfield.cpp | 984 ++ .../pdfium/core/fpdfdoc/cpdf_formfield.h | 167 + .../core/fpdfdoc/cpdf_formfield_unittest.cpp | 48 + .../pdfium/core/fpdfdoc/cpdf_iconfit.cpp | 48 + .../pdfium/pdfium/core/fpdfdoc/cpdf_iconfit.h | 30 + .../pdfium/core/fpdfdoc/cpdf_interform.cpp | 1323 ++ .../pdfium/core/fpdfdoc/cpdf_interform.h | 120 + .../pdfium/pdfium/core/fpdfdoc/cpdf_link.cpp | 32 + .../pdfium/pdfium/core/fpdfdoc/cpdf_link.h | 31 + .../pdfium/core/fpdfdoc/cpdf_linklist.cpp | 68 + .../pdfium/core/fpdfdoc/cpdf_linklist.h | 35 + .../pdfium/core/fpdfdoc/cpdf_metadata.cpp | 32 + .../pdfium/core/fpdfdoc/cpdf_metadata.h | 26 + .../pdfium/core/fpdfdoc/cpdf_nametree.cpp | 198 + .../pdfium/core/fpdfdoc/cpdf_nametree.h | 34 + .../pdfium/core/fpdfdoc/cpdf_numbertree.cpp | 52 + .../pdfium/core/fpdfdoc/cpdf_numbertree.h | 23 + .../pdfium/core/fpdfdoc/cpdf_occontext.cpp | 279 + .../pdfium/core/fpdfdoc/cpdf_occontext.h | 46 + .../pdfium/core/fpdfdoc/cpdf_pagelabel.cpp | 144 + .../pdfium/core/fpdfdoc/cpdf_pagelabel.h | 26 + .../pdfium/core/fpdfdoc/cpdf_variabletext.cpp | 1140 ++ .../pdfium/core/fpdfdoc/cpdf_variabletext.h | 243 + .../core/fpdfdoc/cpdf_viewerpreferences.cpp | 60 + .../core/fpdfdoc/cpdf_viewerpreferences.h | 39 + .../pdfium/core/fpdfdoc/cpvt_arraytemplate.h | 30 + .../pdfium/pdfium/core/fpdfdoc/cpvt_color.cpp | 51 + .../pdfium/pdfium/core/fpdfdoc/cpvt_color.h | 38 + .../pdfium/pdfium/core/fpdfdoc/cpvt_dash.h | 21 + .../pdfium/core/fpdfdoc/cpvt_floatrect.h | 42 + .../pdfium/core/fpdfdoc/cpvt_fontmap.cpp | 94 + .../pdfium/pdfium/core/fpdfdoc/cpvt_fontmap.h | 50 + .../pdfium/core/fpdfdoc/cpvt_generateap.cpp | 1366 ++ .../pdfium/core/fpdfdoc/cpvt_generateap.h | 74 + .../pdfium/pdfium/core/fpdfdoc/cpvt_line.h | 29 + .../pdfium/core/fpdfdoc/cpvt_lineinfo.h | 36 + .../pdfium/core/fpdfdoc/cpvt_secprops.h | 30 + .../pdfium/pdfium/core/fpdfdoc/cpvt_section.h | 22 + .../pdfium/core/fpdfdoc/cpvt_sectioninfo.cpp | 33 + .../pdfium/core/fpdfdoc/cpvt_sectioninfo.h | 29 + .../pdfium/pdfium/core/fpdfdoc/cpvt_word.h | 39 + .../pdfium/core/fpdfdoc/cpvt_wordinfo.cpp | 55 + .../pdfium/core/fpdfdoc/cpvt_wordinfo.h | 35 + .../pdfium/core/fpdfdoc/cpvt_wordplace.h | 73 + .../pdfium/core/fpdfdoc/cpvt_wordprops.h | 58 + .../pdfium/core/fpdfdoc/cpvt_wordrange.h | 59 + .../pdfium/pdfium/core/fpdfdoc/csection.cpp | 291 + modules/pdfium/pdfium/core/fpdfdoc/csection.h | 63 + .../pdfium/pdfium/core/fpdfdoc/ctypeset.cpp | 493 + modules/pdfium/pdfium/core/fpdfdoc/ctypeset.h | 34 + .../pdfium/pdfium/core/fpdfdoc/doc_tagged.cpp | 418 + .../pdfium/pdfium/core/fpdfdoc/fpdf_tagged.h | 75 + .../pdfium/core/fpdfdoc/ipdf_formnotify.h | 32 + .../pdfium/pdfium/core/fpdfdoc/ipvt_fontmap.h | 29 + .../pdfium/pdfium/core/fpdfdoc/tagged_int.h | 119 + .../pdfium/core/fpdftext/cpdf_linkextract.cpp | 173 + .../pdfium/core/fpdftext/cpdf_linkextract.h | 46 + .../pdfium/core/fpdftext/cpdf_textpage.cpp | 1523 +++ .../pdfium/core/fpdftext/cpdf_textpage.h | 180 + .../core/fpdftext/cpdf_textpagefind.cpp | 407 + .../pdfium/core/fpdftext/cpdf_textpagefind.h | 58 + .../core/fpdftext/fpdf_text_int_unittest.cpp | 59 + .../fpdftext/unicodenormalizationdata.cpp | 8275 ++++++++++++ .../core/fpdftext/unicodenormalizationdata.h | 18 + modules/pdfium/pdfium/core/fxcodec/DEPS | 8 + .../core/fxcodec/JBig2_DocumentContext.h | 34 + modules/pdfium/pdfium/core/fxcodec/codec/DEPS | 4 + .../core/fxcodec/codec/ccodec_basicmodule.h | 35 + .../core/fxcodec/codec/ccodec_bmpmodule.cpp | 131 + .../core/fxcodec/codec/ccodec_bmpmodule.h | 39 + .../core/fxcodec/codec/ccodec_faxmodule.h | 39 + .../core/fxcodec/codec/ccodec_flatemodule.h | 49 + .../core/fxcodec/codec/ccodec_gifmodule.cpp | 198 + .../core/fxcodec/codec/ccodec_gifmodule.h | 45 + .../core/fxcodec/codec/ccodec_iccmodule.h | 36 + .../core/fxcodec/codec/ccodec_jbig2module.h | 55 + .../core/fxcodec/codec/ccodec_jpegmodule.h | 69 + .../core/fxcodec/codec/ccodec_jpxmodule.h | 36 + .../core/fxcodec/codec/ccodec_pngmodule.cpp | 262 + .../core/fxcodec/codec/ccodec_pngmodule.h | 31 + .../fxcodec/codec/ccodec_progressivedecoder.h | 229 + .../fxcodec/codec/ccodec_scanlinedecoder.h | 53 + .../core/fxcodec/codec/ccodec_tiffmodule.cpp | 504 + .../core/fxcodec/codec/ccodec_tiffmodule.h | 31 + .../pdfium/core/fxcodec/codec/codec_int.h | 44 + .../pdfium/core/fxcodec/codec/fx_codec.cpp | 463 + .../fxcodec/codec/fx_codec_a85_unittest.cpp | 211 + .../fxcodec/codec/fx_codec_embeddertest.cpp | 20 + .../core/fxcodec/codec/fx_codec_fax.cpp | 808 ++ .../core/fxcodec/codec/fx_codec_flate.cpp | 870 ++ .../core/fxcodec/codec/fx_codec_icc.cpp | 1667 +++ .../core/fxcodec/codec/fx_codec_jbig.cpp | 106 + .../core/fxcodec/codec/fx_codec_jpeg.cpp | 585 + .../core/fxcodec/codec/fx_codec_jpx_opj.cpp | 919 ++ .../fxcodec/codec/fx_codec_jpx_unittest.cpp | 555 + .../core/fxcodec/codec/fx_codec_progress.cpp | 2353 ++++ .../fxcodec/codec/fx_codec_rle_unittest.cpp | 195 + .../core/fxcodec/codec/icodec_bmpmodule.h | 51 + .../core/fxcodec/codec/icodec_gifmodule.h | 68 + .../core/fxcodec/codec/icodec_pngmodule.h | 47 + .../core/fxcodec/codec/icodec_tiffmodule.h | 36 + modules/pdfium/pdfium/core/fxcodec/fx_codec.h | 145 + .../pdfium/pdfium/core/fxcodec/fx_codec_def.h | 92 + .../core/fxcodec/jbig2/JBig2_ArithDecoder.cpp | 120 + .../core/fxcodec/jbig2/JBig2_ArithDecoder.h | 38 + .../fxcodec/jbig2/JBig2_ArithIntDecoder.cpp | 92 + .../fxcodec/jbig2/JBig2_ArithIntDecoder.h | 41 + .../core/fxcodec/jbig2/JBig2_BitStream.cpp | 189 + .../core/fxcodec/jbig2/JBig2_BitStream.h | 58 + .../core/fxcodec/jbig2/JBig2_Context.cpp | 1396 ++ .../pdfium/core/fxcodec/jbig2/JBig2_Context.h | 110 + .../pdfium/core/fxcodec/jbig2/JBig2_Define.h | 36 + .../core/fxcodec/jbig2/JBig2_GrdProc.cpp | 1164 ++ .../pdfium/core/fxcodec/jbig2/JBig2_GrdProc.h | 124 + .../core/fxcodec/jbig2/JBig2_GrrdProc.cpp | 503 + .../core/fxcodec/jbig2/JBig2_GrrdProc.h | 43 + .../core/fxcodec/jbig2/JBig2_GsidProc.cpp | 112 + .../core/fxcodec/jbig2/JBig2_GsidProc.h | 36 + .../core/fxcodec/jbig2/JBig2_HtrdProc.cpp | 105 + .../core/fxcodec/jbig2/JBig2_HtrdProc.h | 46 + .../fxcodec/jbig2/JBig2_HuffmanDecoder.cpp | 45 + .../core/fxcodec/jbig2/JBig2_HuffmanDecoder.h | 24 + .../core/fxcodec/jbig2/JBig2_HuffmanTable.cpp | 140 + .../core/fxcodec/jbig2/JBig2_HuffmanTable.h | 50 + .../jbig2/JBig2_HuffmanTable_Standard.cpp | 117 + .../jbig2/JBig2_HuffmanTable_Standard.h | 78 + .../pdfium/core/fxcodec/jbig2/JBig2_Image.cpp | 1096 ++ .../pdfium/core/fxcodec/jbig2/JBig2_Image.h | 75 + .../fxcodec/jbig2/JBig2_Image_unittest.cpp | 105 + .../pdfium/core/fxcodec/jbig2/JBig2_Page.h | 22 + .../core/fxcodec/jbig2/JBig2_PatternDict.cpp | 23 + .../core/fxcodec/jbig2/JBig2_PatternDict.h | 23 + .../core/fxcodec/jbig2/JBig2_PddProc.cpp | 83 + .../pdfium/core/fxcodec/jbig2/JBig2_PddProc.h | 34 + .../core/fxcodec/jbig2/JBig2_SddProc.cpp | 627 + .../pdfium/core/fxcodec/jbig2/JBig2_SddProc.h | 49 + .../core/fxcodec/jbig2/JBig2_Segment.cpp | 44 + .../pdfium/core/fxcodec/jbig2/JBig2_Segment.h | 66 + .../core/fxcodec/jbig2/JBig2_SymbolDict.cpp | 26 + .../core/fxcodec/jbig2/JBig2_SymbolDict.h | 50 + .../core/fxcodec/jbig2/JBig2_TrdProc.cpp | 408 + .../pdfium/core/fxcodec/jbig2/JBig2_TrdProc.h | 81 + .../pdfium/core/fxcodec/lbmp/fx_bmp.cpp | 939 ++ .../pdfium/pdfium/core/fxcodec/lbmp/fx_bmp.h | 155 + .../pdfium/core/fxcodec/lgif/fx_gif.cpp | 1262 ++ .../pdfium/pdfium/core/fxcodec/lgif/fx_gif.h | 313 + .../pdfium/core/fxcrt/cfx_maybe_owned.h | 88 + .../core/fxcrt/cfx_maybe_owned_unittest.cpp | 179 + .../pdfium/pdfium/core/fxcrt/cfx_observable.h | 81 + .../core/fxcrt/cfx_observable_unittest.cpp | 186 + .../pdfium/pdfium/core/fxcrt/cfx_retain_ptr.h | 112 + .../core/fxcrt/cfx_retain_ptr_unittest.cpp | 254 + .../core/fxcrt/cfx_shared_copy_on_write.h | 85 + .../cfx_shared_copy_on_write_unittest.cpp | 129 + .../pdfium/core/fxcrt/cfx_string_c_template.h | 170 + .../core/fxcrt/cfx_string_data_template.h | 116 + .../core/fxcrt/cfx_string_pool_template.h | 30 + .../cfx_string_pool_template_unittest.cpp | 94 + .../pdfium/pdfium/core/fxcrt/cfx_weak_ptr.h | 86 + .../core/fxcrt/cfx_weak_ptr_unittest.cpp | 174 + modules/pdfium/pdfium/core/fxcrt/extension.h | 61 + .../pdfium/pdfium/core/fxcrt/fx_arabic.cpp | 733 + modules/pdfium/pdfium/core/fxcrt/fx_arabic.h | 188 + modules/pdfium/pdfium/core/fxcrt/fx_arb.h | 51 + modules/pdfium/pdfium/core/fxcrt/fx_basic.h | 559 + .../pdfium/core/fxcrt/fx_basic_array.cpp | 138 + .../pdfium/core/fxcrt/fx_basic_bstring.cpp | 1012 ++ .../core/fxcrt/fx_basic_bstring_unittest.cpp | 1102 ++ .../pdfium/core/fxcrt/fx_basic_buffer.cpp | 288 + .../pdfium/core/fxcrt/fx_basic_coords.cpp | 416 + .../pdfium/pdfium/core/fxcrt/fx_basic_gcc.cpp | 254 + .../core/fxcrt/fx_basic_gcc_unittest.cpp | 112 + .../pdfium/core/fxcrt/fx_basic_memmgr.cpp | 27 + .../core/fxcrt/fx_basic_memmgr_unittest.cpp | 80 + .../pdfium/pdfium/core/fxcrt/fx_basic_utf.cpp | 85 + .../pdfium/core/fxcrt/fx_basic_util.cpp | 264 + .../core/fxcrt/fx_basic_util_unittest.cpp | 77 + .../pdfium/core/fxcrt/fx_basic_wstring.cpp | 1022 ++ .../core/fxcrt/fx_basic_wstring_unittest.cpp | 941 ++ modules/pdfium/pdfium/core/fxcrt/fx_bidi.cpp | 83 + modules/pdfium/pdfium/core/fxcrt/fx_bidi.h | 75 + .../pdfium/core/fxcrt/fx_bidi_unittest.cpp | 365 + .../pdfium/pdfium/core/fxcrt/fx_coordinates.h | 671 + modules/pdfium/pdfium/core/fxcrt/fx_ext.h | 101 + .../pdfium/pdfium/core/fxcrt/fx_extension.cpp | 676 + .../core/fxcrt/fx_extension_unittest.cpp | 42 + modules/pdfium/pdfium/core/fxcrt/fx_memory.h | 106 + .../pdfium/pdfium/core/fxcrt/fx_safe_types.h | 20 + modules/pdfium/pdfium/core/fxcrt/fx_stream.h | 178 + modules/pdfium/pdfium/core/fxcrt/fx_string.h | 459 + modules/pdfium/pdfium/core/fxcrt/fx_system.h | 329 + .../pdfium/core/fxcrt/fx_system_unittest.cpp | 162 + modules/pdfium/pdfium/core/fxcrt/fx_ucd.h | 204 + .../pdfium/pdfium/core/fxcrt/fx_ucddata.cpp | 11013 ++++++++++++++++ .../pdfium/pdfium/core/fxcrt/fx_unicode.cpp | 67 + modules/pdfium/pdfium/core/fxcrt/fx_xml.h | 163 + .../pdfium/core/fxcrt/fx_xml_composer.cpp | 33 + .../pdfium/core/fxcrt/fx_xml_parser.cpp | 918 ++ .../pdfium/pdfium/core/fxcrt/fxcrt_posix.cpp | 137 + .../pdfium/pdfium/core/fxcrt/fxcrt_posix.h | 41 + .../pdfium/pdfium/core/fxcrt/fxcrt_stream.cpp | 27 + .../pdfium/core/fxcrt/fxcrt_windows.cpp | 188 + .../pdfium/pdfium/core/fxcrt/fxcrt_windows.h | 39 + modules/pdfium/pdfium/core/fxcrt/xml_int.h | 55 + modules/pdfium/pdfium/core/fxge/agg/DEPS | 3 + .../pdfium/core/fxge/agg/fx_agg_driver.cpp | 1763 +++ .../pdfium/core/fxge/agg/fx_agg_driver.h | 124 + .../core/fxge/android/cfpf_skiabufferfont.h | 25 + .../fxge/android/cfpf_skiadevicemodule.cpp | 41 + .../core/fxge/android/cfpf_skiadevicemodule.h | 26 + .../core/fxge/android/cfpf_skiafilefont.h | 27 + .../core/fxge/android/cfpf_skiafont.cpp | 219 + .../pdfium/core/fxge/android/cfpf_skiafont.h | 53 + .../fxge/android/cfpf_skiafontdescriptor.h | 40 + .../core/fxge/android/cfpf_skiafontmgr.cpp | 487 + .../core/fxge/android/cfpf_skiafontmgr.h | 52 + .../core/fxge/android/cfpf_skiapathfont.h | 33 + .../core/fxge/android/cfx_androidfontinfo.cpp | 87 + .../core/fxge/android/cfx_androidfontinfo.h | 45 + .../core/fxge/android/fx_android_imp.cpp | 32 + .../pdfium/pdfium/core/fxge/apple/apple_int.h | 48 + .../core/fxge/apple/fx_apple_platform.cpp | 183 + .../pdfium/core/fxge/apple/fx_mac_imp.cpp | 139 + .../core/fxge/apple/fx_quartz_device.cpp | 128 + .../pdfium/pdfium/core/fxge/cfx_facecache.h | 65 + .../pdfium/pdfium/core/fxge/cfx_fontcache.h | 42 + .../pdfium/pdfium/core/fxge/cfx_fontmapper.h | 86 + modules/pdfium/pdfium/core/fxge/cfx_fontmgr.h | 69 + .../pdfium/pdfium/core/fxge/cfx_fxgedevice.h | 46 + .../pdfium/pdfium/core/fxge/cfx_gemodule.h | 50 + .../pdfium/pdfium/core/fxge/cfx_graphstate.h | 44 + .../pdfium/core/fxge/cfx_graphstatedata.h | 38 + .../pdfium/pdfium/core/fxge/cfx_pathdata.h | 70 + .../pdfium/core/fxge/cfx_renderdevice.h | 256 + .../pdfium/pdfium/core/fxge/cfx_substfont.h | 29 + .../pdfium/core/fxge/cfx_unicodeencoding.h | 46 + .../pdfium/core/fxge/cfx_unicodeencodingex.h | 37 + .../pdfium/core/fxge/cfx_windowsdevice.h | 42 + modules/pdfium/pdfium/core/fxge/dib/dib_int.h | 116 + .../pdfium/core/fxge/dib/fx_dib_composite.cpp | 5040 +++++++ .../pdfium/core/fxge/dib/fx_dib_convert.cpp | 911 ++ .../pdfium/core/fxge/dib/fx_dib_engine.cpp | 1007 ++ .../core/fxge/dib/fx_dib_engine_unittest.cpp | 31 + .../pdfium/core/fxge/dib/fx_dib_main.cpp | 1647 +++ .../pdfium/core/fxge/dib/fx_dib_transform.cpp | 963 ++ .../fontdata/chromefontdata/FoxitDingbats.cpp | 2469 ++++ .../fontdata/chromefontdata/FoxitFixed.cpp | 1476 +++ .../chromefontdata/FoxitFixedBold.cpp | 1514 +++ .../chromefontdata/FoxitFixedBoldItalic.cpp | 1605 +++ .../chromefontdata/FoxitFixedItalic.cpp | 1572 +++ .../fontdata/chromefontdata/FoxitSans.cpp | 1262 ++ .../fontdata/chromefontdata/FoxitSansBold.cpp | 1371 ++ .../chromefontdata/FoxitSansBoldItalic.cpp | 1378 ++ .../chromefontdata/FoxitSansItalic.cpp | 1371 ++ .../fontdata/chromefontdata/FoxitSansMM.cpp | 5587 ++++++++ .../fontdata/chromefontdata/FoxitSerif.cpp | 1632 +++ .../chromefontdata/FoxitSerifBold.cpp | 1626 +++ .../chromefontdata/FoxitSerifBoldItalic.cpp | 1737 +++ .../chromefontdata/FoxitSerifItalic.cpp | 1778 +++ .../fontdata/chromefontdata/FoxitSerifMM.cpp | 9462 +++++++++++++ .../fontdata/chromefontdata/FoxitSymbol.cpp | 1404 ++ .../fontdata/chromefontdata/chromefontdata.h | 35 + modules/pdfium/pdfium/core/fxge/freetype/DEPS | 3 + .../pdfium/core/fxge/freetype/fx_freetype.cpp | 171 + modules/pdfium/pdfium/core/fxge/fx_dib.h | 697 + modules/pdfium/pdfium/core/fxge/fx_font.h | 252 + modules/pdfium/pdfium/core/fxge/fx_freetype.h | 180 + modules/pdfium/pdfium/core/fxge/ge/DEPS | 3 + .../pdfium/core/fxge/ge/cfx_cliprgn.cpp | 103 + .../pdfium/pdfium/core/fxge/ge/cfx_cliprgn.h | 36 + .../pdfium/core/fxge/ge/cfx_facecache.cpp | 394 + .../core/fxge/ge/cfx_folderfontinfo.cpp | 379 + .../pdfium/core/fxge/ge/cfx_folderfontinfo.h | 67 + .../pdfium/pdfium/core/fxge/ge/cfx_font.cpp | 697 + .../pdfium/core/fxge/ge/cfx_fontcache.cpp | 67 + .../pdfium/core/fxge/ge/cfx_fontmapper.cpp | 820 ++ .../pdfium/core/fxge/ge/cfx_fontmgr.cpp | 261 + .../pdfium/core/fxge/ge/cfx_gemodule.cpp | 72 + .../pdfium/core/fxge/ge/cfx_graphstate.cpp | 61 + .../core/fxge/ge/cfx_graphstatedata.cpp | 52 + .../pdfium/core/fxge/ge/cfx_pathdata.cpp | 485 + .../pdfium/core/fxge/ge/cfx_renderdevice.cpp | 1112 ++ .../pdfium/core/fxge/ge/cfx_substfont.cpp | 18 + .../core/fxge/ge/cfx_unicodeencoding.cpp | 33 + .../core/fxge/ge/cfx_unicodeencodingex.cpp | 98 + .../pdfium/core/fxge/ge/cttfontdesc.cpp | 42 + .../pdfium/pdfium/core/fxge/ge/cttfontdesc.h | 40 + .../pdfium/core/fxge/ge/fx_ge_fontmap.cpp | 93 + .../pdfium/core/fxge/ge/fx_ge_linux.cpp | 163 + .../pdfium/pdfium/core/fxge/ge/fx_ge_text.cpp | 126 + .../core/fxge/ge/fx_ge_text_embeddertest.cpp | 18 + .../pdfium/pdfium/core/fxge/ge/fx_text_int.h | 28 + .../core/fxge/ifx_renderdevicedriver.cpp | 105 + .../pdfium/core/fxge/ifx_renderdevicedriver.h | 111 + .../pdfium/core/fxge/ifx_systemfontinfo.h | 51 + modules/pdfium/pdfium/core/fxge/skia/DEPS | 5 + .../pdfium/core/fxge/skia/fx_skia_device.cpp | 3102 +++++ .../pdfium/core/fxge/skia/fx_skia_device.h | 178 + .../fxge/skia/fx_skia_device_unittest.cpp | 174 + .../pdfium/core/fxge/win32/cfx_psrenderer.cpp | 686 + .../pdfium/core/fxge/win32/cfx_psrenderer.h | 101 + .../pdfium/core/fxge/win32/cfx_windowsdib.h | 52 + .../pdfium/core/fxge/win32/cpsoutput.cpp | 40 + .../pdfium/pdfium/core/fxge/win32/cpsoutput.h | 26 + .../pdfium/core/fxge/win32/dwrite_int.h | 66 + .../core/fxge/win32/fx_win32_device.cpp | 1388 ++ .../pdfium/core/fxge/win32/fx_win32_dib.cpp | 218 + .../core/fxge/win32/fx_win32_dwrite.cpp | 446 + .../core/fxge/win32/fx_win32_gdipext.cpp | 1521 +++ .../pdfium/core/fxge/win32/fx_win32_print.cpp | 494 + .../pdfium/pdfium/core/fxge/win32/win32_int.h | 334 + modules/pdfium/pdfium/docs/getting-started.md | 185 + .../pdfium/pdfium/docs/pdfium-edit-guide.md | 1 + .../pdfium/pdfium/docs/v8-getting-started.md | 2 + modules/pdfium/pdfium/fpdfsdk/DEPS | 9 + .../pdfium/fpdfsdk/cba_annotiterator.cpp | 176 + .../pdfium/pdfium/fpdfsdk/cba_annotiterator.h | 45 + .../pdfium/fpdfsdk/cfx_systemhandler.cpp | 141 + .../pdfium/pdfium/fpdfsdk/cfx_systemhandler.h | 78 + .../pdfium/pdfium/fpdfsdk/cpdfsdk_annot.cpp | 98 + modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annot.h | 65 + .../fpdfsdk/cpdfsdk_annothandlermgr.cpp | 309 + .../pdfium/fpdfsdk/cpdfsdk_annothandlermgr.h | 118 + .../pdfium/fpdfsdk/cpdfsdk_annotiteration.cpp | 40 + .../pdfium/fpdfsdk/cpdfsdk_annotiteration.h | 31 + .../pdfium/pdfium/fpdfsdk/cpdfsdk_baannot.cpp | 400 + .../pdfium/pdfium/fpdfsdk/cpdfsdk_baannot.h | 106 + .../pdfium/fpdfsdk/cpdfsdk_baannothandler.cpp | 202 + .../pdfium/fpdfsdk/cpdfsdk_baannothandler.h | 100 + .../pdfium/fpdfsdk/cpdfsdk_datetime.cpp | 412 + .../pdfium/pdfium/fpdfsdk/cpdfsdk_datetime.h | 49 + .../fpdfsdk/cpdfsdk_formfillenvironment.cpp | 760 ++ .../fpdfsdk/cpdfsdk_formfillenvironment.h | 220 + .../pdfium/fpdfsdk/cpdfsdk_interform.cpp | 696 + .../pdfium/pdfium/fpdfsdk/cpdfsdk_interform.h | 143 + .../pdfium/fpdfsdk/cpdfsdk_pageview.cpp | 492 + .../pdfium/pdfium/fpdfsdk/cpdfsdk_pageview.h | 118 + .../pdfium/pdfium/fpdfsdk/cpdfsdk_widget.cpp | 1910 +++ .../pdfium/pdfium/fpdfsdk/cpdfsdk_widget.h | 174 + .../pdfium/fpdfsdk/cpdfsdk_widgethandler.cpp | 286 + .../pdfium/fpdfsdk/cpdfsdk_widgethandler.h | 109 + .../pdfium/fpdfsdk/cpdfsdk_xfawidget.cpp | 35 + .../pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidget.h | 37 + .../fpdfsdk/cpdfsdk_xfawidgethandler.cpp | 356 + .../pdfium/fpdfsdk/cpdfsdk_xfawidgethandler.h | 98 + .../pdfium/fpdfsdk/formfiller/cba_fontmap.cpp | 250 + .../pdfium/fpdfsdk/formfiller/cba_fontmap.h | 46 + .../fpdfsdk/formfiller/cffl_checkbox.cpp | 116 + .../pdfium/fpdfsdk/formfiller/cffl_checkbox.h | 32 + .../fpdfsdk/formfiller/cffl_combobox.cpp | 299 + .../pdfium/fpdfsdk/formfiller/cffl_combobox.h | 63 + .../fpdfsdk/formfiller/cffl_formfiller.cpp | 687 + .../fpdfsdk/formfiller/cffl_formfiller.h | 199 + .../formfiller/cffl_interactiveformfiller.cpp | 968 ++ .../formfiller/cffl_interactiveformfiller.h | 177 + .../fpdfsdk/formfiller/cffl_listbox.cpp | 210 + .../pdfium/fpdfsdk/formfiller/cffl_listbox.h | 44 + .../fpdfsdk/formfiller/cffl_pushbutton.cpp | 37 + .../fpdfsdk/formfiller/cffl_pushbutton.h | 27 + .../fpdfsdk/formfiller/cffl_radiobutton.cpp | 119 + .../fpdfsdk/formfiller/cffl_radiobutton.h | 32 + .../fpdfsdk/formfiller/cffl_textfield.cpp | 286 + .../fpdfsdk/formfiller/cffl_textfield.h | 67 + .../pdfium/pdfium/fpdfsdk/fpdf_dataavail.cpp | 194 + .../fpdfsdk/fpdf_dataavail_embeddertest.cpp | 240 + modules/pdfium/pdfium/fpdfsdk/fpdf_ext.cpp | 200 + .../pdfium/pdfium/fpdfsdk/fpdf_flatten.cpp | 429 + .../fpdfsdk/fpdf_flatten_embeddertest.cpp | 40 + .../pdfium/fpdfsdk/fpdf_progressive.cpp | 95 + .../pdfium/pdfium/fpdfsdk/fpdf_searchex.cpp | 17 + .../pdfium/pdfium/fpdfsdk/fpdf_structtree.cpp | 89 + .../fpdfsdk/fpdf_structtree_embeddertest.cpp | 70 + .../pdfium/fpdfsdk/fpdf_sysfontinfo.cpp | 203 + .../pdfium/fpdfsdk/fpdf_transformpage.cpp | 337 + modules/pdfium/pdfium/fpdfsdk/fpdfdoc.cpp | 418 + .../pdfium/fpdfsdk/fpdfdoc_embeddertest.cpp | 238 + .../pdfium/fpdfsdk/fpdfdoc_unittest.cpp | 274 + .../pdfium/fpdfsdk/fpdfedit_embeddertest.cpp | 505 + modules/pdfium/pdfium/fpdfsdk/fpdfeditimg.cpp | 105 + .../pdfium/fpdfsdk/fpdfeditimg_unittest.cpp | 74 + .../pdfium/pdfium/fpdfsdk/fpdfeditpage.cpp | 315 + .../pdfium/pdfium/fpdfsdk/fpdfeditpath.cpp | 132 + .../pdfium/pdfium/fpdfsdk/fpdfedittext.cpp | 132 + .../pdfium/fpdfsdk/fpdfext_embeddertest.cpp | 24 + .../pdfium/pdfium/fpdfsdk/fpdfformfill.cpp | 749 ++ .../fpdfsdk/fpdfformfill_embeddertest.cpp | 199 + modules/pdfium/pdfium/fpdfsdk/fpdfppo.cpp | 390 + .../pdfium/fpdfsdk/fpdfppo_embeddertest.cpp | 106 + modules/pdfium/pdfium/fpdfsdk/fpdfsave.cpp | 319 + .../pdfium/fpdfsdk/fpdfsave_embeddertest.cpp | 70 + modules/pdfium/pdfium/fpdfsdk/fpdftext.cpp | 352 + .../pdfium/fpdfsdk/fpdftext_embeddertest.cpp | 407 + modules/pdfium/pdfium/fpdfsdk/fpdfview.cpp | 1272 ++ .../pdfium/fpdfsdk/fpdfview_c_api_test.c | 272 + .../pdfium/fpdfsdk/fpdfview_c_api_test.h | 20 + .../pdfium/fpdfsdk/fpdfview_embeddertest.cpp | 380 + .../pdfium/fpdfsdk/fpdfview_unittest.cpp | 20 + modules/pdfium/pdfium/fpdfsdk/fpdfxfa/DEPS | 4 + .../fpdfsdk/fpdfxfa/cpdfxfa_context.cpp | 369 + .../pdfium/fpdfsdk/fpdfxfa/cpdfxfa_context.h | 117 + .../fpdfxfa/cpdfxfa_docenvironment.cpp | 1031 ++ .../fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h | 114 + .../pdfium/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp | 217 + .../pdfium/fpdfsdk/fpdfxfa/cpdfxfa_page.h | 84 + .../fpdfxfa/cxfa_fwladaptertimermgr.cpp | 77 + .../fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h | 35 + .../pdfium/fpdfsdk/fsdk_actionhandler.cpp | 623 + .../pdfium/fpdfsdk/fsdk_actionhandler.h | 126 + .../fpdfsdk/fsdk_baseform_embeddertest.cpp | 126 + modules/pdfium/pdfium/fpdfsdk/fsdk_common.h | 34 + modules/pdfium/pdfium/fpdfsdk/fsdk_define.h | 82 + .../pdfium/fpdfsdk/fsdk_pauseadapter.cpp | 16 + .../pdfium/pdfium/fpdfsdk/fsdk_pauseadapter.h | 25 + .../pdfium/pdfium/fpdfsdk/fxedit/fx_edit.h | 23 + .../pdfium/pdfium/fpdfsdk/fxedit/fxet_ap.cpp | 38 + .../pdfium/fpdfsdk/fxedit/fxet_edit.cpp | 2307 ++++ .../pdfium/pdfium/fpdfsdk/fxedit/fxet_edit.h | 545 + .../pdfium/fpdfsdk/fxedit/fxet_list.cpp | 784 ++ .../pdfium/pdfium/fpdfsdk/fxedit/fxet_list.h | 304 + .../pdfium/fpdfsdk/ipdfsdk_annothandler.h | 103 + .../pdfium/fpdfsdk/javascript/Annot.cpp | 115 + .../pdfium/pdfium/fpdfsdk/javascript/Annot.h | 41 + .../pdfium/fpdfsdk/javascript/Consts.cpp | 204 + .../pdfium/pdfium/fpdfsdk/javascript/Consts.h | 94 + modules/pdfium/pdfium/fpdfsdk/javascript/DEPS | 3 + .../pdfium/fpdfsdk/javascript/Document.cpp | 1658 +++ .../pdfium/fpdfsdk/javascript/Document.h | 402 + .../pdfium/fpdfsdk/javascript/Field.cpp | 3405 +++++ .../pdfium/pdfium/fpdfsdk/javascript/Field.h | 598 + .../pdfium/pdfium/fpdfsdk/javascript/Icon.cpp | 36 + .../pdfium/pdfium/fpdfsdk/javascript/Icon.h | 36 + .../pdfium/fpdfsdk/javascript/JS_Define.h | 456 + .../fpdfsdk/javascript/JS_EventHandler.cpp | 653 + .../fpdfsdk/javascript/JS_EventHandler.h | 196 + .../fpdfsdk/javascript/JS_GlobalData.cpp | 396 + .../pdfium/fpdfsdk/javascript/JS_GlobalData.h | 77 + .../pdfium/fpdfsdk/javascript/JS_KeyValue.cpp | 70 + .../pdfium/fpdfsdk/javascript/JS_KeyValue.h | 46 + .../pdfium/fpdfsdk/javascript/JS_Object.cpp | 45 + .../pdfium/fpdfsdk/javascript/JS_Object.h | 57 + .../fpdfsdk/javascript/JS_Runtime_Stub.cpp | 168 + .../pdfium/fpdfsdk/javascript/JS_Value.cpp | 770 ++ .../pdfium/fpdfsdk/javascript/JS_Value.h | 215 + .../fpdfsdk/javascript/PublicMethods.cpp | 1801 +++ .../pdfium/fpdfsdk/javascript/PublicMethods.h | 162 + .../pdfium/pdfium/fpdfsdk/javascript/app.cpp | 790 ++ .../pdfium/pdfium/fpdfsdk/javascript/app.h | 221 + .../fpdfsdk/javascript/cjs_event_context.cpp | 280 + .../fpdfsdk/javascript/cjs_event_context.h | 135 + .../pdfium/fpdfsdk/javascript/cjs_runtime.cpp | 263 + .../pdfium/fpdfsdk/javascript/cjs_runtime.h | 71 + .../pdfium/fpdfsdk/javascript/color.cpp | 279 + .../pdfium/pdfium/fpdfsdk/javascript/color.h | 96 + .../pdfium/fpdfsdk/javascript/console.cpp | 62 + .../pdfium/fpdfsdk/javascript/console.h | 51 + .../pdfium/fpdfsdk/javascript/event.cpp | 309 + .../pdfium/pdfium/fpdfsdk/javascript/event.h | 90 + .../pdfium/fpdfsdk/javascript/global.cpp | 440 + .../pdfium/pdfium/fpdfsdk/javascript/global.h | 86 + .../fpdfsdk/javascript/ijs_event_context.h | 134 + .../pdfium/fpdfsdk/javascript/ijs_runtime.h | 45 + .../public_methods_embeddertest.cpp | 162 + .../javascript/public_methods_unittest.cpp | 51 + .../pdfium/fpdfsdk/javascript/report.cpp | 43 + .../pdfium/pdfium/fpdfsdk/javascript/report.h | 41 + .../pdfium/fpdfsdk/javascript/resource.cpp | 68 + .../pdfium/fpdfsdk/javascript/resource.h | 40 + .../pdfium/pdfium/fpdfsdk/javascript/util.cpp | 462 + .../pdfium/pdfium/fpdfsdk/javascript/util.h | 59 + .../pdfium/fpdfsdk/pdfsdk_fieldaction.cpp | 18 + .../pdfium/fpdfsdk/pdfsdk_fieldaction.h | 39 + .../pdfium/fpdfsdk/pdfwindow/PWL_Button.cpp | 39 + .../pdfium/fpdfsdk/pdfwindow/PWL_Button.h | 27 + .../pdfium/fpdfsdk/pdfwindow/PWL_Caret.cpp | 147 + .../pdfium/fpdfsdk/pdfwindow/PWL_Caret.h | 53 + .../pdfium/fpdfsdk/pdfwindow/PWL_ComboBox.cpp | 626 + .../pdfium/fpdfsdk/pdfwindow/PWL_ComboBox.h | 104 + .../pdfium/fpdfsdk/pdfwindow/PWL_Edit.cpp | 878 ++ .../pdfium/fpdfsdk/pdfwindow/PWL_Edit.h | 143 + .../pdfium/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp | 577 + .../pdfium/fpdfsdk/pdfwindow/PWL_EditCtrl.h | 141 + .../pdfium/fpdfsdk/pdfwindow/PWL_FontMap.cpp | 426 + .../pdfium/fpdfsdk/pdfwindow/PWL_FontMap.h | 95 + .../pdfium/fpdfsdk/pdfwindow/PWL_Icon.cpp | 225 + .../pdfium/fpdfsdk/pdfwindow/PWL_Icon.h | 57 + .../pdfium/fpdfsdk/pdfwindow/PWL_ListBox.cpp | 459 + .../pdfium/fpdfsdk/pdfwindow/PWL_ListBox.h | 117 + .../fpdfsdk/pdfwindow/PWL_ScrollBar.cpp | 1175 ++ .../pdfium/fpdfsdk/pdfwindow/PWL_ScrollBar.h | 183 + .../fpdfsdk/pdfwindow/PWL_SpecialButton.cpp | 80 + .../fpdfsdk/pdfwindow/PWL_SpecialButton.h | 56 + .../pdfium/fpdfsdk/pdfwindow/PWL_Utils.cpp | 1172 ++ .../pdfium/fpdfsdk/pdfwindow/PWL_Utils.h | 164 + .../pdfium/fpdfsdk/pdfwindow/PWL_Wnd.cpp | 915 ++ .../pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Wnd.h | 410 + .../pdfium/fpdfsdk/pdfwindow/cpwl_color.cpp | 179 + .../pdfium/fpdfsdk/pdfwindow/cpwl_color.h | 53 + modules/pdfium/pdfium/fxjs/DEPS | 4 + .../pdfium/pdfium/fxjs/cfxjse_arguments.cpp | 56 + modules/pdfium/pdfium/fxjs/cfxjse_arguments.h | 38 + modules/pdfium/pdfium/fxjs/cfxjse_class.cpp | 436 + modules/pdfium/pdfium/fxjs/cfxjse_class.h | 45 + modules/pdfium/pdfium/fxjs/cfxjse_context.cpp | 252 + modules/pdfium/pdfium/fxjs/cfxjse_context.h | 65 + .../pdfium/fxjs/cfxjse_isolatetracker.cpp | 42 + .../pdfium/fxjs/cfxjse_isolatetracker.h | 75 + .../pdfium/pdfium/fxjs/cfxjse_runtimedata.cpp | 109 + .../pdfium/pdfium/fxjs/cfxjse_runtimedata.h | 36 + modules/pdfium/pdfium/fxjs/cfxjse_value.cpp | 517 + modules/pdfium/pdfium/fxjs/cfxjse_value.h | 104 + modules/pdfium/pdfium/fxjs/fxjs_v8.cpp | 739 ++ modules/pdfium/pdfium/fxjs/fxjs_v8.h | 239 + .../pdfium/fxjs/fxjs_v8_embeddertest.cpp | 213 + modules/pdfium/pdfium/fxjs/fxjse.h | 74 + modules/pdfium/pdfium/infra/config/cq.cfg | 100 + modules/pdfium/pdfium/navbar.md | 13 + modules/pdfium/pdfium/pdfium.gni | 46 + modules/pdfium/pdfium/public/DEPS | 8 + modules/pdfium/pdfium/public/README | 13 + modules/pdfium/pdfium/public/fpdf_dataavail.h | 198 + modules/pdfium/pdfium/public/fpdf_doc.h | 325 + modules/pdfium/pdfium/public/fpdf_edit.h | 425 + modules/pdfium/pdfium/public/fpdf_ext.h | 98 + modules/pdfium/pdfium/public/fpdf_flatten.h | 44 + modules/pdfium/pdfium/public/fpdf_formfill.h | 1764 +++ modules/pdfium/pdfium/public/fpdf_fwlevent.h | 284 + modules/pdfium/pdfium/public/fpdf_ppo.h | 44 + .../pdfium/pdfium/public/fpdf_progressive.h | 120 + modules/pdfium/pdfium/public/fpdf_save.h | 87 + modules/pdfium/pdfium/public/fpdf_searchex.h | 30 + .../pdfium/pdfium/public/fpdf_structtree.h | 103 + .../pdfium/pdfium/public/fpdf_sysfontinfo.h | 316 + modules/pdfium/pdfium/public/fpdf_text.h | 425 + .../pdfium/pdfium/public/fpdf_transformpage.h | 161 + modules/pdfium/pdfium/public/fpdfview.h | 1039 ++ modules/pdfium/pdfium/samples/BUILD.gn | 101 + modules/pdfium/pdfium/samples/DEPS | 8 + modules/pdfium/pdfium/samples/image_diff.cc | 352 + .../pdfium/pdfium/samples/image_diff_png.cc | 644 + .../pdfium/pdfium/samples/image_diff_png.h | 38 + modules/pdfium/pdfium/samples/pdfium_test.cc | 1018 ++ modules/pdfium/pdfium/skia/BUILD.gn | 505 + .../pdfium/pdfium/skia/config/SkUserConfig.h | 269 + modules/pdfium/pdfium/skia/ext/DEPS | 3 + .../pdfium/pdfium/skia/ext/google_logging.cc | 25 + modules/pdfium/pdfium/third_party/BUILD.gn | 486 + modules/pdfium/pdfium/third_party/DEPS | 7 + .../third_party/agg23/0000-bug-466.patch | 45 + .../third_party/agg23/0001-gcc-warning.patch | 17 + .../agg23/0002-ubsan-error-fixes.patch | 33 + .../agg23/0003-ubsan-render-line-error.patch | 73 + .../pdfium/third_party/agg23/README.pdfium | 18 + .../pdfium/third_party/agg23/agg_array.h | 509 + .../pdfium/third_party/agg23/agg_basics.h | 285 + .../third_party/agg23/agg_clip_liang_barsky.h | 136 + .../pdfium/third_party/agg23/agg_color_gray.h | 50 + .../agg23/agg_conv_adaptor_vcgen.h | 138 + .../pdfium/third_party/agg23/agg_conv_dash.h | 61 + .../third_party/agg23/agg_conv_stroke.h | 110 + .../pdfium/third_party/agg23/agg_curves.cpp | 111 + .../pdfium/third_party/agg23/agg_curves.h | 188 + .../pdfium/third_party/agg23/agg_math.h | 63 + .../third_party/agg23/agg_math_stroke.h | 275 + .../third_party/agg23/agg_path_storage.cpp | 100 + .../third_party/agg23/agg_path_storage.h | 172 + .../third_party/agg23/agg_pixfmt_gray.h | 177 + .../agg23/agg_rasterizer_scanline_aa.cpp | 498 + .../agg23/agg_rasterizer_scanline_aa.h | 477 + .../third_party/agg23/agg_render_scanlines.h | 50 + .../third_party/agg23/agg_renderer_base.h | 163 + .../third_party/agg23/agg_renderer_scanline.h | 93 + .../third_party/agg23/agg_rendering_buffer.h | 145 + .../pdfium/third_party/agg23/agg_scanline_u.h | 150 + .../third_party/agg23/agg_shorten_path.h | 57 + .../third_party/agg23/agg_vcgen_dash.cpp | 178 + .../pdfium/third_party/agg23/agg_vcgen_dash.h | 75 + .../third_party/agg23/agg_vcgen_stroke.cpp | 215 + .../third_party/agg23/agg_vcgen_stroke.h | 120 + .../third_party/agg23/agg_vertex_sequence.h | 100 + .../pdfium/pdfium/third_party/base/logging.h | 26 + .../pdfium/pdfium/third_party/base/macros.h | 31 + .../pdfium/third_party/base/numerics/OWNERS | 3 + .../base/numerics/safe_conversions.h | 272 + .../base/numerics/safe_conversions_impl.h | 734 + .../third_party/base/numerics/safe_math.h | 510 + .../base/numerics/safe_math_impl.h | 643 + .../pdfium/pdfium/third_party/base/ptr_util.h | 74 + .../pdfium/pdfium/third_party/base/stl_util.h | 65 + .../pdfium/third_party/bigint/BigInteger.cc | 409 + .../pdfium/third_party/bigint/BigInteger.hh | 225 + .../third_party/bigint/BigIntegerLibrary.hh | 14 + .../third_party/bigint/BigIntegerUtils.cc | 57 + .../third_party/bigint/BigIntegerUtils.hh | 78 + .../pdfium/third_party/bigint/BigUnsigned.cc | 700 + .../pdfium/third_party/bigint/BigUnsigned.hh | 425 + .../third_party/bigint/BigUnsignedInABase.cc | 131 + .../third_party/bigint/BigUnsignedInABase.hh | 128 + .../pdfium/pdfium/third_party/bigint/LICENSE | 71 + .../third_party/bigint/NumberlikeArray.hh | 184 + .../lcms2-2.6/0000-tag-type-confusion.patch | 14 + .../lcms2-2.6/0001-from16-to-8-overflow.patch | 13 + ...002-infinite-loop-GrowNamedColorList.patch | 34 + .../third_party/lcms2-2.6/0003-uninit.patch | 30 + .../0004-memory-leak-Type_Curve_Read.patch | 28 + ...0005-memory-leak-AllocEmptyTransform.patch | 34 + ...006-memory-leak-Type_NamedColor_Read.patch | 22 + ...007-memory-leak-OptimizeByResampling.patch | 13 + ...0008-memory-leak-Type_MPEmatrix_Read.patch | 30 + .../0009-cmsStageAllocMatrix-param-swap.patch | 20 + .../lcms2-2.6/0010-reject-nan.patch | 13 + .../0011-memory-leak-ReadSegmentedCurve.patch | 36 + .../lcms2-2.6/0012-backport-c0a98d86.patch | 53 + .../third_party/lcms2-2.6/0013-utf8.patch | 99 + .../lcms2-2.6/0014-avoid-fixed-inf.patch | 95 + .../lcms2-2.6/0015-sanitize-float-read.patch | 15 + .../lcms2-2.6/0016-check-LUT-and-MPE.patch | 170 + ...ream-integer-overflow-MPEmatrix_Read.patch | 85 + .../third_party/lcms2-2.6/README.pdfium | 32 + .../third_party/lcms2-2.6/include/lcms2.h | 1882 +++ .../lcms2-2.6/include/lcms2_plugin.h | 637 + .../third_party/lcms2-2.6/src/cmscam02.c | 486 + .../third_party/lcms2-2.6/src/cmscgats.c | 2776 ++++ .../third_party/lcms2-2.6/src/cmscnvrt.c | 1142 ++ .../pdfium/third_party/lcms2-2.6/src/cmserr.c | 707 + .../third_party/lcms2-2.6/src/cmsgamma.c | 1298 ++ .../pdfium/third_party/lcms2-2.6/src/cmsgmt.c | 590 + .../third_party/lcms2-2.6/src/cmshalf.c | 534 + .../third_party/lcms2-2.6/src/cmsintrp.c | 1506 +++ .../pdfium/third_party/lcms2-2.6/src/cmsio0.c | 1895 +++ .../pdfium/third_party/lcms2-2.6/src/cmsio1.c | 1020 ++ .../pdfium/third_party/lcms2-2.6/src/cmslut.c | 1820 +++ .../pdfium/third_party/lcms2-2.6/src/cmsmd5.c | 343 + .../third_party/lcms2-2.6/src/cmsmtrx.c | 175 + .../third_party/lcms2-2.6/src/cmsnamed.c | 937 ++ .../pdfium/third_party/lcms2-2.6/src/cmsopt.c | 1811 +++ .../third_party/lcms2-2.6/src/cmspack.c | 3369 +++++ .../pdfium/third_party/lcms2-2.6/src/cmspcs.c | 931 ++ .../third_party/lcms2-2.6/src/cmsplugin.c | 959 ++ .../pdfium/third_party/lcms2-2.6/src/cmsps2.c | 1597 +++ .../third_party/lcms2-2.6/src/cmssamp.c | 572 + .../pdfium/third_party/lcms2-2.6/src/cmssm.c | 734 + .../third_party/lcms2-2.6/src/cmstypes.c | 5603 ++++++++ .../third_party/lcms2-2.6/src/cmsvirt.c | 1194 ++ .../third_party/lcms2-2.6/src/cmswtpnt.c | 349 + .../third_party/lcms2-2.6/src/cmsxform.c | 1137 ++ .../lcms2-2.6/src/lcms2_internal.h | 1032 ++ .../pdfium/tools/lsan/lsan_suppressions.txt | 12 + .../pdfium/pdfium/tools/msan/blacklist.txt | 5 + 966 files changed, 330811 insertions(+), 1 deletion(-) create mode 100644 modules/pdfium/pdfium/.clang-format create mode 100644 modules/pdfium/pdfium/.gn create mode 100644 modules/pdfium/pdfium/AUTHORS create mode 100644 modules/pdfium/pdfium/BUILD.gn create mode 100644 modules/pdfium/pdfium/DEPS create mode 100644 modules/pdfium/pdfium/LICENSE create mode 100644 modules/pdfium/pdfium/OWNERS create mode 100644 modules/pdfium/pdfium/PRESUBMIT.py create mode 100644 modules/pdfium/pdfium/README.md create mode 100644 modules/pdfium/pdfium/build_overrides/README.md create mode 100644 modules/pdfium/pdfium/build_overrides/build.gni create mode 100644 modules/pdfium/pdfium/build_overrides/gtest.gni create mode 100644 modules/pdfium/pdfium/build_overrides/pdfium.gni create mode 100644 modules/pdfium/pdfium/codereview.settings create mode 100644 modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt.cpp create mode 100644 modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt.h create mode 100644 modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt_aes.cpp create mode 100644 modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt_sha.cpp create mode 100644 modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/B5pc-H_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/B5pc-V_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/CNS-EUC-H_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/CNS-EUC-V_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETen-B5-H_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETen-B5-V_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETenms-B5-H_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETenms-B5-V_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/HKscs-B5-H_5.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/HKscs-B5-V_5.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/UniCNS-UCS2-H_3.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/UniCNS-UCS2-V_3.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/UniCNS-UTF16-H_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/cmaps_cns1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/cmaps_cns1.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/Adobe-GB1-UCS2_5.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GB-EUC-H_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GB-EUC-V_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK-EUC-H_2.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK-EUC-V_2.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK2K-H_5.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK2K-V_5.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBKp-EUC-H_2.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBKp-EUC-V_2.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBpc-EUC-H_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBpc-EUC-V_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/UniGB-UCS2-H_4.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/UniGB-UCS2-V_4.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/cmaps_gb1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/cmaps_gb1.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/83pv-RKSJ-H_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90ms-RKSJ-H_2.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90ms-RKSJ-V_2.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90msp-RKSJ-H_2.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90msp-RKSJ-V_2.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90pv-RKSJ-H_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Add-RKSJ-H_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Add-RKSJ-V_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/EUC-H_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/EUC-V_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Ext-RKSJ-H_2.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Ext-RKSJ-V_2.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/H_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-H_4.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-V_4.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/V_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/cmaps_japan1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/cmaps_japan1.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSC-EUC-H_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSC-EUC-V_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-HW-H_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-HW-V_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-H_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-V_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCpc-EUC-H_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/UniKS-UCS2-H_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/UniKS-UCS2-V_1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/UniKS-UTF16-H_0.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/cmaps_korea1.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/cmaps_korea1.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/cmap_int.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cmaps/fpdf_cmaps.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cpdf_modulemgr.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cpdf_modulemgr.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cpdf_pagerendercontext.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/cpdf_pagerendercontext.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_creator.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_pagecontentgenerator.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/edit/editint.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/edit/fpdf_edit_create.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_cidfont.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_cidfont.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_font.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_font.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_fontencoding.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_fontencoding.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_simplefont.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_simplefont.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_truetypefont.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_truetypefont.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type1font.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type1font.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3char.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3char.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3font.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3font.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/font_int.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font_cid.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font_cid_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/ttgsubtable.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/font/ttgsubtable.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_allstates.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_allstates.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_clippath.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_clippath.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_color.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_color.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorspace.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorspace.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorstate.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorstate.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmark.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmark.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmarkitem.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmarkitem.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentparser.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentparser.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_countedobject.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_docpagedata.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_docpagedata.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_form.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_form.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_formobject.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_formobject.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_generalstate.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_generalstate.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_graphicstates.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_graphicstates.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_image.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_image.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_imageobject.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_imageobject.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_meshstream.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_meshstream.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_page.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_page.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pagemodule.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pagemodule.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobject.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobject.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectholder.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectholder.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectlist.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectlist.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_path.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_path.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pathobject.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pathobject.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pattern.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pattern.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_psengine.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingobject.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingobject.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingpattern.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingpattern.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamcontentparser.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamcontentparser.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamcontentparser_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamparser.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamparser.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamparser_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textobject.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textobject.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textstate.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textstate.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_tilingpattern.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/cpdf_tilingpattern.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/fpdf_page_colors.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/fpdf_page_func.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/fpdf_page_func_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/page/pageint.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cfdf_document.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cfdf_document.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_array.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_array.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_array_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_boolean.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_boolean.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_crypto_handler.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_crypto_handler.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_data_avail.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_data_avail.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_dictionary.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_dictionary.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_document.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_document.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_document_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_hint_tables.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_hint_tables.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_indirect_object_holder.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_linearized_header.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_linearized_header.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_name.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_name.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_null.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_null.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_number.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_number.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_object.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_object.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_object_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_reference.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_reference.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_security_handler.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_security_handler.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_simple_parser.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_simple_parser.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_simple_parser_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream_acc.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream_acc.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_string.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_string.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_syntax_parser.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_syntax_parser.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_syntax_parser_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_utility.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_utility.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_charposlist.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_charposlist.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_devicebuffer.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_devicebuffer.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibsource.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibsource.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibtransferfunc.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibtransferfunc.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_docrenderdata.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_docrenderdata.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagecacheentry.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagecacheentry.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imageloader.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imageloader.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagerenderer.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagerenderer.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_pagerendercache.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_pagerendercache.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_progressiverenderer.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_progressiverenderer.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_rendercontext.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_rendercontext.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderoptions.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderoptions.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderstatus.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderstatus.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_scaledrenderbuffer.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_textrenderer.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_textrenderer.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_transferfunc.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_transferfunc.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3cache.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3cache.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3glyphs.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3glyphs.h create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfapi/render/fpdf_render_pattern_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cline.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cline.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/clines.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/clines.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_aaction.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_aaction.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_action.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_action.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_actionfields.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_actionfields.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_annot.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_annot.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_annotlist.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_annotlist.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_apsettings.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_apsettings.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmark.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmark.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmarktree.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmarktree.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_defaultappearance.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_defaultappearance.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_dest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_dest.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_dest_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_docjsactions.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_docjsactions.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_filespec.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_filespec.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_filespec_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_formcontrol.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_formcontrol.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_formfield.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_formfield.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_formfield_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_iconfit.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_iconfit.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_interform.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_interform.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_link.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_link.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_linklist.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_linklist.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_metadata.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_metadata.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_nametree.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_nametree.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_numbertree.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_numbertree.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_occontext.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_occontext.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_pagelabel.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_pagelabel.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_variabletext.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_variabletext.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_viewerpreferences.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpdf_viewerpreferences.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_arraytemplate.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_color.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_color.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_dash.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_floatrect.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_fontmap.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_fontmap.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_generateap.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_generateap.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_line.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_lineinfo.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_secprops.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_section.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_sectioninfo.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_sectioninfo.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_word.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordinfo.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordinfo.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordplace.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordprops.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordrange.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/csection.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/csection.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/ctypeset.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/ctypeset.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/doc_tagged.cpp create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/fpdf_tagged.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/ipdf_formnotify.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/ipvt_fontmap.h create mode 100644 modules/pdfium/pdfium/core/fpdfdoc/tagged_int.h create mode 100644 modules/pdfium/pdfium/core/fpdftext/cpdf_linkextract.cpp create mode 100644 modules/pdfium/pdfium/core/fpdftext/cpdf_linkextract.h create mode 100644 modules/pdfium/pdfium/core/fpdftext/cpdf_textpage.cpp create mode 100644 modules/pdfium/pdfium/core/fpdftext/cpdf_textpage.h create mode 100644 modules/pdfium/pdfium/core/fpdftext/cpdf_textpagefind.cpp create mode 100644 modules/pdfium/pdfium/core/fpdftext/cpdf_textpagefind.h create mode 100644 modules/pdfium/pdfium/core/fpdftext/fpdf_text_int_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fpdftext/unicodenormalizationdata.cpp create mode 100644 modules/pdfium/pdfium/core/fpdftext/unicodenormalizationdata.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/DEPS create mode 100644 modules/pdfium/pdfium/core/fxcodec/JBig2_DocumentContext.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/DEPS create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_basicmodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_bmpmodule.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_bmpmodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_faxmodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_flatemodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_gifmodule.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_gifmodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_iccmodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jbig2module.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jpegmodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jpxmodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_pngmodule.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_pngmodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_progressivedecoder.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_scanlinedecoder.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_tiffmodule.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/ccodec_tiffmodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/codec_int.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/fx_codec.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_a85_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_fax.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_flate.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_icc.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jbig.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpeg.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpx_opj.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpx_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_progress.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_rle_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/icodec_bmpmodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/icodec_gifmodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/icodec_pngmodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/codec/icodec_tiffmodule.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/fx_codec.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/fx_codec_def.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithDecoder.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithDecoder.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithIntDecoder.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_BitStream.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_BitStream.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Context.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Context.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Define.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrdProc.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrdProc.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrrdProc.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrrdProc.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GsidProc.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GsidProc.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HtrdProc.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HtrdProc.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanDecoder.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Image.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Image.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Image_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Page.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PatternDict.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PatternDict.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PddProc.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PddProc.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SddProc.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SddProc.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Segment.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Segment.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SymbolDict.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SymbolDict.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_TrdProc.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_TrdProc.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/lbmp/fx_bmp.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/lbmp/fx_bmp.h create mode 100644 modules/pdfium/pdfium/core/fxcodec/lgif/fx_gif.cpp create mode 100644 modules/pdfium/pdfium/core/fxcodec/lgif/fx_gif.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_maybe_owned.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_maybe_owned_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_observable.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_observable_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_retain_ptr.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_retain_ptr_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_shared_copy_on_write.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_shared_copy_on_write_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_string_c_template.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_string_data_template.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_string_pool_template.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_string_pool_template_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_weak_ptr.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/cfx_weak_ptr_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/extension.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_arabic.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_arabic.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_arb.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_array.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_bstring.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_bstring_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_buffer.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_coords.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_gcc.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_gcc_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_memmgr.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_memmgr_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_utf.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_util.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_util_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_wstring.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_basic_wstring_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_bidi.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_bidi.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_bidi_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_coordinates.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_ext.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_extension.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_extension_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_memory.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_safe_types.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_stream.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_string.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_system.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_system_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_ucd.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_ucddata.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_unicode.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_xml.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_xml_composer.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fx_xml_parser.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fxcrt_posix.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fxcrt_posix.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/fxcrt_stream.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fxcrt_windows.cpp create mode 100644 modules/pdfium/pdfium/core/fxcrt/fxcrt_windows.h create mode 100644 modules/pdfium/pdfium/core/fxcrt/xml_int.h create mode 100644 modules/pdfium/pdfium/core/fxge/agg/DEPS create mode 100644 modules/pdfium/pdfium/core/fxge/agg/fx_agg_driver.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/agg/fx_agg_driver.h create mode 100644 modules/pdfium/pdfium/core/fxge/android/cfpf_skiabufferfont.h create mode 100644 modules/pdfium/pdfium/core/fxge/android/cfpf_skiadevicemodule.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/android/cfpf_skiadevicemodule.h create mode 100644 modules/pdfium/pdfium/core/fxge/android/cfpf_skiafilefont.h create mode 100644 modules/pdfium/pdfium/core/fxge/android/cfpf_skiafont.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/android/cfpf_skiafont.h create mode 100644 modules/pdfium/pdfium/core/fxge/android/cfpf_skiafontdescriptor.h create mode 100644 modules/pdfium/pdfium/core/fxge/android/cfpf_skiafontmgr.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/android/cfpf_skiafontmgr.h create mode 100644 modules/pdfium/pdfium/core/fxge/android/cfpf_skiapathfont.h create mode 100644 modules/pdfium/pdfium/core/fxge/android/cfx_androidfontinfo.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/android/cfx_androidfontinfo.h create mode 100644 modules/pdfium/pdfium/core/fxge/android/fx_android_imp.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/apple/apple_int.h create mode 100644 modules/pdfium/pdfium/core/fxge/apple/fx_apple_platform.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/apple/fx_mac_imp.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/apple/fx_quartz_device.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_facecache.h create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_fontcache.h create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_fontmapper.h create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_fontmgr.h create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_fxgedevice.h create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_gemodule.h create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_graphstate.h create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_graphstatedata.h create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_pathdata.h create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_renderdevice.h create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_substfont.h create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_unicodeencoding.h create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_unicodeencodingex.h create mode 100644 modules/pdfium/pdfium/core/fxge/cfx_windowsdevice.h create mode 100644 modules/pdfium/pdfium/core/fxge/dib/dib_int.h create mode 100644 modules/pdfium/pdfium/core/fxge/dib/fx_dib_composite.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/dib/fx_dib_convert.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/dib/fx_dib_engine.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/dib/fx_dib_engine_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/dib/fx_dib_main.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/dib/fx_dib_transform.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitDingbats.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixed.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixedBold.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixedItalic.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSans.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansBold.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansItalic.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansMM.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerif.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifBold.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifItalic.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifMM.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSymbol.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/chromefontdata.h create mode 100644 modules/pdfium/pdfium/core/fxge/freetype/DEPS create mode 100644 modules/pdfium/pdfium/core/fxge/freetype/fx_freetype.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/fx_dib.h create mode 100644 modules/pdfium/pdfium/core/fxge/fx_font.h create mode 100644 modules/pdfium/pdfium/core/fxge/fx_freetype.h create mode 100644 modules/pdfium/pdfium/core/fxge/ge/DEPS create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_cliprgn.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_cliprgn.h create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_facecache.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_folderfontinfo.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_folderfontinfo.h create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_font.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_fontcache.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_fontmapper.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_fontmgr.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_gemodule.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_graphstate.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_graphstatedata.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_pathdata.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_renderdevice.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_substfont.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_unicodeencoding.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cfx_unicodeencodingex.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cttfontdesc.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/cttfontdesc.h create mode 100644 modules/pdfium/pdfium/core/fxge/ge/fx_ge_fontmap.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/fx_ge_linux.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/fx_ge_text.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/fx_ge_text_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ge/fx_text_int.h create mode 100644 modules/pdfium/pdfium/core/fxge/ifx_renderdevicedriver.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/ifx_renderdevicedriver.h create mode 100644 modules/pdfium/pdfium/core/fxge/ifx_systemfontinfo.h create mode 100644 modules/pdfium/pdfium/core/fxge/skia/DEPS create mode 100644 modules/pdfium/pdfium/core/fxge/skia/fx_skia_device.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/skia/fx_skia_device.h create mode 100644 modules/pdfium/pdfium/core/fxge/skia/fx_skia_device_unittest.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/win32/cfx_psrenderer.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/win32/cfx_psrenderer.h create mode 100644 modules/pdfium/pdfium/core/fxge/win32/cfx_windowsdib.h create mode 100644 modules/pdfium/pdfium/core/fxge/win32/cpsoutput.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/win32/cpsoutput.h create mode 100644 modules/pdfium/pdfium/core/fxge/win32/dwrite_int.h create mode 100644 modules/pdfium/pdfium/core/fxge/win32/fx_win32_device.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/win32/fx_win32_dib.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/win32/fx_win32_dwrite.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/win32/fx_win32_gdipext.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/win32/fx_win32_print.cpp create mode 100644 modules/pdfium/pdfium/core/fxge/win32/win32_int.h create mode 100644 modules/pdfium/pdfium/docs/getting-started.md create mode 100644 modules/pdfium/pdfium/docs/pdfium-edit-guide.md create mode 100644 modules/pdfium/pdfium/docs/v8-getting-started.md create mode 100644 modules/pdfium/pdfium/fpdfsdk/DEPS create mode 100644 modules/pdfium/pdfium/fpdfsdk/cba_annotiterator.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cba_annotiterator.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cfx_systemhandler.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cfx_systemhandler.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annot.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annot.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annothandlermgr.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annothandlermgr.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annotiteration.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annotiteration.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannot.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannot.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannothandler.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannothandler.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_datetime.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_datetime.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_formfillenvironment.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_formfillenvironment.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_interform.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_interform.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_pageview.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_pageview.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widget.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widget.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widgethandler.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widgethandler.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidget.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidget.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidgethandler.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidgethandler.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cba_fontmap.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cba_fontmap.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_checkbox.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_checkbox.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_combobox.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_combobox.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_formfiller.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_formfiller.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_interactiveformfiller.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_listbox.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_listbox.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_pushbutton.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_pushbutton.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_radiobutton.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_radiobutton.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_textfield.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_textfield.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdf_dataavail.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdf_dataavail_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdf_ext.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdf_flatten.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdf_flatten_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdf_progressive.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdf_searchex.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdf_structtree.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdf_structtree_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdf_sysfontinfo.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdf_transformpage.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfdoc.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfdoc_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfdoc_unittest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfedit_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfeditimg.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfeditimg_unittest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfeditpage.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfeditpath.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfedittext.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfext_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfformfill.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfformfill_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfppo.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfppo_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfsave.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfsave_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdftext.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdftext_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfview.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfview_c_api_test.c create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfview_c_api_test.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfview_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfview_unittest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfxfa/DEPS create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_context.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_page.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/fsdk_actionhandler.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fsdk_actionhandler.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/fsdk_baseform_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fsdk_common.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/fsdk_define.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/fsdk_pauseadapter.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fsdk_pauseadapter.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/fxedit/fx_edit.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_ap.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_edit.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_edit.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_list.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_list.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/ipdfsdk_annothandler.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/Annot.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/Annot.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/Consts.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/Consts.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/DEPS create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/Document.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/Document.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/Field.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/Field.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/Icon.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/Icon.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/JS_Define.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/JS_EventHandler.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/JS_EventHandler.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/JS_GlobalData.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/JS_GlobalData.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/JS_KeyValue.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/JS_KeyValue.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/JS_Object.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/JS_Object.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/JS_Runtime_Stub.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/JS_Value.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/JS_Value.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/PublicMethods.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/PublicMethods.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/app.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/app.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/cjs_event_context.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/cjs_event_context.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/cjs_runtime.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/cjs_runtime.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/color.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/color.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/console.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/console.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/event.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/event.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/global.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/global.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/ijs_event_context.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/ijs_runtime.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/public_methods_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/public_methods_unittest.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/report.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/report.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/resource.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/resource.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/util.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/javascript/util.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfsdk_fieldaction.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfsdk_fieldaction.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Button.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Button.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Caret.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Caret.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ComboBox.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ComboBox.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Edit.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Edit.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_EditCtrl.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_FontMap.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_FontMap.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Icon.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Icon.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ListBox.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ListBox.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ScrollBar.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ScrollBar.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_SpecialButton.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_SpecialButton.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Utils.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Utils.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Wnd.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Wnd.h create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/cpwl_color.cpp create mode 100644 modules/pdfium/pdfium/fpdfsdk/pdfwindow/cpwl_color.h create mode 100644 modules/pdfium/pdfium/fxjs/DEPS create mode 100644 modules/pdfium/pdfium/fxjs/cfxjse_arguments.cpp create mode 100644 modules/pdfium/pdfium/fxjs/cfxjse_arguments.h create mode 100644 modules/pdfium/pdfium/fxjs/cfxjse_class.cpp create mode 100644 modules/pdfium/pdfium/fxjs/cfxjse_class.h create mode 100644 modules/pdfium/pdfium/fxjs/cfxjse_context.cpp create mode 100644 modules/pdfium/pdfium/fxjs/cfxjse_context.h create mode 100644 modules/pdfium/pdfium/fxjs/cfxjse_isolatetracker.cpp create mode 100644 modules/pdfium/pdfium/fxjs/cfxjse_isolatetracker.h create mode 100644 modules/pdfium/pdfium/fxjs/cfxjse_runtimedata.cpp create mode 100644 modules/pdfium/pdfium/fxjs/cfxjse_runtimedata.h create mode 100644 modules/pdfium/pdfium/fxjs/cfxjse_value.cpp create mode 100644 modules/pdfium/pdfium/fxjs/cfxjse_value.h create mode 100644 modules/pdfium/pdfium/fxjs/fxjs_v8.cpp create mode 100644 modules/pdfium/pdfium/fxjs/fxjs_v8.h create mode 100644 modules/pdfium/pdfium/fxjs/fxjs_v8_embeddertest.cpp create mode 100644 modules/pdfium/pdfium/fxjs/fxjse.h create mode 100644 modules/pdfium/pdfium/infra/config/cq.cfg create mode 100644 modules/pdfium/pdfium/navbar.md create mode 100644 modules/pdfium/pdfium/pdfium.gni create mode 100644 modules/pdfium/pdfium/public/DEPS create mode 100644 modules/pdfium/pdfium/public/README create mode 100644 modules/pdfium/pdfium/public/fpdf_dataavail.h create mode 100644 modules/pdfium/pdfium/public/fpdf_doc.h create mode 100644 modules/pdfium/pdfium/public/fpdf_edit.h create mode 100644 modules/pdfium/pdfium/public/fpdf_ext.h create mode 100644 modules/pdfium/pdfium/public/fpdf_flatten.h create mode 100644 modules/pdfium/pdfium/public/fpdf_formfill.h create mode 100644 modules/pdfium/pdfium/public/fpdf_fwlevent.h create mode 100644 modules/pdfium/pdfium/public/fpdf_ppo.h create mode 100644 modules/pdfium/pdfium/public/fpdf_progressive.h create mode 100644 modules/pdfium/pdfium/public/fpdf_save.h create mode 100644 modules/pdfium/pdfium/public/fpdf_searchex.h create mode 100644 modules/pdfium/pdfium/public/fpdf_structtree.h create mode 100644 modules/pdfium/pdfium/public/fpdf_sysfontinfo.h create mode 100644 modules/pdfium/pdfium/public/fpdf_text.h create mode 100644 modules/pdfium/pdfium/public/fpdf_transformpage.h create mode 100644 modules/pdfium/pdfium/public/fpdfview.h create mode 100644 modules/pdfium/pdfium/samples/BUILD.gn create mode 100644 modules/pdfium/pdfium/samples/DEPS create mode 100644 modules/pdfium/pdfium/samples/image_diff.cc create mode 100644 modules/pdfium/pdfium/samples/image_diff_png.cc create mode 100644 modules/pdfium/pdfium/samples/image_diff_png.h create mode 100644 modules/pdfium/pdfium/samples/pdfium_test.cc create mode 100644 modules/pdfium/pdfium/skia/BUILD.gn create mode 100644 modules/pdfium/pdfium/skia/config/SkUserConfig.h create mode 100644 modules/pdfium/pdfium/skia/ext/DEPS create mode 100644 modules/pdfium/pdfium/skia/ext/google_logging.cc create mode 100644 modules/pdfium/pdfium/third_party/BUILD.gn create mode 100644 modules/pdfium/pdfium/third_party/DEPS create mode 100644 modules/pdfium/pdfium/third_party/agg23/0000-bug-466.patch create mode 100644 modules/pdfium/pdfium/third_party/agg23/0001-gcc-warning.patch create mode 100644 modules/pdfium/pdfium/third_party/agg23/0002-ubsan-error-fixes.patch create mode 100644 modules/pdfium/pdfium/third_party/agg23/0003-ubsan-render-line-error.patch create mode 100644 modules/pdfium/pdfium/third_party/agg23/README.pdfium create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_array.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_basics.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_clip_liang_barsky.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_color_gray.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_conv_adaptor_vcgen.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_conv_dash.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_conv_stroke.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_curves.cpp create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_curves.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_math.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_math_stroke.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_path_storage.cpp create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_path_storage.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_pixfmt_gray.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_rasterizer_scanline_aa.cpp create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_rasterizer_scanline_aa.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_render_scanlines.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_renderer_base.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_renderer_scanline.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_rendering_buffer.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_scanline_u.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_shorten_path.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_vcgen_dash.cpp create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_vcgen_dash.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_vcgen_stroke.cpp create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_vcgen_stroke.h create mode 100644 modules/pdfium/pdfium/third_party/agg23/agg_vertex_sequence.h create mode 100644 modules/pdfium/pdfium/third_party/base/logging.h create mode 100644 modules/pdfium/pdfium/third_party/base/macros.h create mode 100644 modules/pdfium/pdfium/third_party/base/numerics/OWNERS create mode 100644 modules/pdfium/pdfium/third_party/base/numerics/safe_conversions.h create mode 100644 modules/pdfium/pdfium/third_party/base/numerics/safe_conversions_impl.h create mode 100644 modules/pdfium/pdfium/third_party/base/numerics/safe_math.h create mode 100644 modules/pdfium/pdfium/third_party/base/numerics/safe_math_impl.h create mode 100644 modules/pdfium/pdfium/third_party/base/ptr_util.h create mode 100644 modules/pdfium/pdfium/third_party/base/stl_util.h create mode 100644 modules/pdfium/pdfium/third_party/bigint/BigInteger.cc create mode 100644 modules/pdfium/pdfium/third_party/bigint/BigInteger.hh create mode 100644 modules/pdfium/pdfium/third_party/bigint/BigIntegerLibrary.hh create mode 100644 modules/pdfium/pdfium/third_party/bigint/BigIntegerUtils.cc create mode 100644 modules/pdfium/pdfium/third_party/bigint/BigIntegerUtils.hh create mode 100644 modules/pdfium/pdfium/third_party/bigint/BigUnsigned.cc create mode 100644 modules/pdfium/pdfium/third_party/bigint/BigUnsigned.hh create mode 100644 modules/pdfium/pdfium/third_party/bigint/BigUnsignedInABase.cc create mode 100644 modules/pdfium/pdfium/third_party/bigint/BigUnsignedInABase.hh create mode 100644 modules/pdfium/pdfium/third_party/bigint/LICENSE create mode 100644 modules/pdfium/pdfium/third_party/bigint/NumberlikeArray.hh create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0000-tag-type-confusion.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0001-from16-to-8-overflow.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0002-infinite-loop-GrowNamedColorList.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0003-uninit.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0004-memory-leak-Type_Curve_Read.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0005-memory-leak-AllocEmptyTransform.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0006-memory-leak-Type_NamedColor_Read.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0007-memory-leak-OptimizeByResampling.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0008-memory-leak-Type_MPEmatrix_Read.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0009-cmsStageAllocMatrix-param-swap.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0010-reject-nan.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0011-memory-leak-ReadSegmentedCurve.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0012-backport-c0a98d86.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0013-utf8.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0014-avoid-fixed-inf.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0015-sanitize-float-read.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0016-check-LUT-and-MPE.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/0017-upstream-integer-overflow-MPEmatrix_Read.patch create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/README.pdfium create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/include/lcms2.h create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/include/lcms2_plugin.h create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmscam02.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmscgats.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmscnvrt.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmserr.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmsgamma.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmsgmt.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmshalf.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmsintrp.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmsio0.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmsio1.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmslut.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmsmd5.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmsmtrx.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmsnamed.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmsopt.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmspack.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmspcs.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmsplugin.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmsps2.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmssamp.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmssm.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmstypes.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmsvirt.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmswtpnt.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/cmsxform.c create mode 100644 modules/pdfium/pdfium/third_party/lcms2-2.6/src/lcms2_internal.h create mode 100644 modules/pdfium/pdfium/tools/lsan/lsan_suppressions.txt create mode 100644 modules/pdfium/pdfium/tools/msan/blacklist.txt diff --git a/modules/pdfium/README_MOZILLA b/modules/pdfium/README_MOZILLA index 716a8d07b954..f3bd5a87178b 100644 --- a/modules/pdfium/README_MOZILLA +++ b/modules/pdfium/README_MOZILLA @@ -7,4 +7,4 @@ patch files after the copy step). The upstream repository is https://pdfium.googlesource.com/pdfium -The git commit ID last used to import was 0000000000000000000000000000000000000000 (0000-00-00 00:00:00 +0000) +The git commit ID last used to import was 84213b529908d2b9095ad4c33ecc9fdf5d881df5 (2017-04-24 19:23:05 +0000) diff --git a/modules/pdfium/pdfium/.clang-format b/modules/pdfium/pdfium/.clang-format new file mode 100644 index 000000000000..2fb833a5df13 --- /dev/null +++ b/modules/pdfium/pdfium/.clang-format @@ -0,0 +1,2 @@ +# http://clang.llvm.org/docs/ClangFormatStyleOptions.html +BasedOnStyle: Chromium diff --git a/modules/pdfium/pdfium/.gn b/modules/pdfium/pdfium/.gn new file mode 100644 index 000000000000..ce525292541c --- /dev/null +++ b/modules/pdfium/pdfium/.gn @@ -0,0 +1,15 @@ +# Copyright 2016 PDFium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +buildconfig = "//build/config/BUILDCONFIG.gn" +secondary_source = "//build/secondary/" + +default_args = { + v8_extra_library_files = [] + v8_experimental_extra_library_files = [] + v8_enable_inspector = false + + # Turns on compiler optimizations in V8 in Debug build. + v8_optimized_debug = true +} diff --git a/modules/pdfium/pdfium/AUTHORS b/modules/pdfium/pdfium/AUTHORS new file mode 100644 index 000000000000..6c2a29599060 --- /dev/null +++ b/modules/pdfium/pdfium/AUTHORS @@ -0,0 +1,41 @@ +# Names should be added to this file with this pattern: +# +# For individuals: +# Name +# +# For organizations: +# Organization +# +# See python fnmatch module documentation for more information. + +Andrey Khalyavin +Antonio Gomes +Brett Wilson +Bruce Dawson +Chery Cherian +Chris Palmer +Dan Sinclair +Finnur Thorarinsson +GiWan Go +Jiang Jiang +Jochen Eisinger +John Abd-El-Malek +Julien Tinnes +Ke Liu +Kostya Serebryany +Lei Zhang +Lucas Nihlen +Matt Giuca +Michael Doppler +Miklos Vajna +Nico Weber +Peter Kasting +Raymes Khoury +Reid Kleckner +Robert Sesek +Sam Clegg +Thomas Sepez + +DocsCorp Pty Ltd. <*@docscorp.com> +Foxit Software Inc <*@foxitsoftware.com> +Google Inc. <*@google.com> diff --git a/modules/pdfium/pdfium/BUILD.gn b/modules/pdfium/pdfium/BUILD.gn new file mode 100644 index 000000000000..de7f21b13028 --- /dev/null +++ b/modules/pdfium/pdfium/BUILD.gn @@ -0,0 +1,1891 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//testing/test.gni") +import("pdfium.gni") + +config("pdfium_common_config") { + cflags = [] + ldflags = [] + include_dirs = [ + ".", + "third_party/freetype/include", + "third_party/freetype/include/freetype", + ] + defines = [ + "OPJ_STATIC", + "PNG_PREFIX", + "PNG_USE_READ_MACROS", + ] + + if (pdf_use_skia) { + defines += [ "_SKIA_SUPPORT_" ] + } + + if (pdf_use_skia_paths) { + defines += [ "_SKIA_SUPPORT_PATHS_" ] + } + + if (pdf_enable_v8) { + defines += [ "PDF_ENABLE_V8" ] + } + + if (pdf_enable_xfa) { + defines += [ "PDF_ENABLE_XFA" ] + if (pdf_enable_xfa_bmp) { + defines += [ "PDF_ENABLE_XFA_BMP" ] + } + if (pdf_enable_xfa_gif) { + defines += [ "PDF_ENABLE_XFA_GIF" ] + } + if (pdf_enable_xfa_png) { + defines += [ "PDF_ENABLE_XFA_PNG" ] + } + if (pdf_enable_xfa_tiff) { + defines += [ "PDF_ENABLE_XFA_TIFF" ] + } + } + + if (pdf_use_win32_gdi) { + defines += [ "PDFIUM_PRINT_TEXT_WITH_GDI" ] + } + + if (use_coverage && is_clang) { + cflags += [ + "--coverage", + "-g", + "-O0", + ] + ldflags += [ "--coverage" ] + } +} + +config("pdfium_core_config") { + cflags = [] + configs = [ ":pdfium_common_config" ] + defines = [ "V8_DEPRECATION_WARNINGS" ] + if (is_linux) { + if (current_cpu == "x64") { + defines += [ "_FX_CPU_=_FX_X64_" ] + cflags += [ "-fPIC" ] + } else if (current_cpu == "x86") { + defines += [ "_FX_CPU_=_FX_X86_" ] + } + } + if (is_win) { + cflags += [ "/wd4267" ] + } +} + +config("xfa_warnings") { + visibility = [ ":*" ] + if (is_posix && !is_clang) { # When GCC. + cflags = [ "-Wno-strict-overflow" ] + } +} + +static_library("pdfium") { + sources = [ + "fpdfsdk/cba_annotiterator.cpp", + "fpdfsdk/cba_annotiterator.h", + "fpdfsdk/cfx_systemhandler.cpp", + "fpdfsdk/cfx_systemhandler.h", + "fpdfsdk/cpdfsdk_annot.cpp", + "fpdfsdk/cpdfsdk_annot.h", + "fpdfsdk/cpdfsdk_annothandlermgr.cpp", + "fpdfsdk/cpdfsdk_annothandlermgr.h", + "fpdfsdk/cpdfsdk_annotiteration.cpp", + "fpdfsdk/cpdfsdk_annotiteration.h", + "fpdfsdk/cpdfsdk_baannot.cpp", + "fpdfsdk/cpdfsdk_baannot.h", + "fpdfsdk/cpdfsdk_baannothandler.cpp", + "fpdfsdk/cpdfsdk_baannothandler.h", + "fpdfsdk/cpdfsdk_datetime.cpp", + "fpdfsdk/cpdfsdk_datetime.h", + "fpdfsdk/cpdfsdk_formfillenvironment.cpp", + "fpdfsdk/cpdfsdk_formfillenvironment.h", + "fpdfsdk/cpdfsdk_interform.cpp", + "fpdfsdk/cpdfsdk_interform.h", + "fpdfsdk/cpdfsdk_pageview.cpp", + "fpdfsdk/cpdfsdk_pageview.h", + "fpdfsdk/cpdfsdk_widget.cpp", + "fpdfsdk/cpdfsdk_widget.h", + "fpdfsdk/cpdfsdk_widgethandler.cpp", + "fpdfsdk/cpdfsdk_widgethandler.h", + "fpdfsdk/fpdf_dataavail.cpp", + "fpdfsdk/fpdf_ext.cpp", + "fpdfsdk/fpdf_flatten.cpp", + "fpdfsdk/fpdf_progressive.cpp", + "fpdfsdk/fpdf_searchex.cpp", + "fpdfsdk/fpdf_structtree.cpp", + "fpdfsdk/fpdf_sysfontinfo.cpp", + "fpdfsdk/fpdf_transformpage.cpp", + "fpdfsdk/fpdfdoc.cpp", + "fpdfsdk/fpdfeditimg.cpp", + "fpdfsdk/fpdfeditpage.cpp", + "fpdfsdk/fpdfeditpath.cpp", + "fpdfsdk/fpdfedittext.cpp", + "fpdfsdk/fpdfformfill.cpp", + "fpdfsdk/fpdfppo.cpp", + "fpdfsdk/fpdfsave.cpp", + "fpdfsdk/fpdftext.cpp", + "fpdfsdk/fpdfview.cpp", + "fpdfsdk/fsdk_actionhandler.cpp", + "fpdfsdk/fsdk_actionhandler.h", + "fpdfsdk/fsdk_pauseadapter.cpp", + "fpdfsdk/fsdk_pauseadapter.h", + "fpdfsdk/pdfsdk_fieldaction.cpp", + "fpdfsdk/pdfsdk_fieldaction.h", + "public/fpdf_dataavail.h", + "public/fpdf_doc.h", + "public/fpdf_edit.h", + "public/fpdf_ext.h", + "public/fpdf_flatten.h", + "public/fpdf_formfill.h", + "public/fpdf_fwlevent.h", + "public/fpdf_ppo.h", + "public/fpdf_progressive.h", + "public/fpdf_save.h", + "public/fpdf_searchex.h", + "public/fpdf_structtree.h", + "public/fpdf_sysfontinfo.h", + "public/fpdf_text.h", + "public/fpdf_transformpage.h", + "public/fpdfview.h", + ] + + libs = [] + configs += [ ":pdfium_core_config" ] + + deps = [ + ":fdrm", + ":formfiller", + ":fpdfapi", + ":fpdfdoc", + ":fpdftext", + ":fxcodec", + ":fxcrt", + ":fxedit", + ":fxge", + ":javascript", + ":pdfwindow", + "third_party:bigint", + "third_party:pdfium_base", + ] + + public_deps = [ + ":fxcrt", + ] + if (pdf_enable_xfa) { + sources += [ + "fpdfsdk/cpdfsdk_xfawidget.cpp", + "fpdfsdk/cpdfsdk_xfawidget.h", + "fpdfsdk/cpdfsdk_xfawidgethandler.cpp", + "fpdfsdk/cpdfsdk_xfawidgethandler.h", + ] + + deps += [ ":fpdfxfa" ] + } + + if (is_win) { + libs += [ + "advapi32.lib", + "gdi32.lib", + "user32.lib", + ] + } + + if (is_mac) { + libs += [ + "AppKit.framework", + "CoreFoundation.framework", + ] + } + + if (pdfium_bundle_freetype) { + deps += [ "third_party:fx_freetype" ] + } else { + libs += [ "freetype" ] + } +} + +static_library("test_support") { + testonly = true + sources = [ + "testing/fx_string_testhelpers.cpp", + "testing/fx_string_testhelpers.h", + "testing/test_support.cpp", + "testing/test_support.h", + "testing/utils/path_service.cpp", + "testing/utils/path_service.h", + ] + data = [ + "testing/resources/", + ] + deps = [ + ":pdfium", + "//testing/gmock", + "//testing/gtest", + ] + include_dirs = [] + if (pdf_enable_v8) { + deps += [ + "//v8", + "//v8:v8_libplatform", + ] + include_dirs += [ + "//v8", + "//v8/include", + ] + configs += [ "//v8:external_startup_data" ] + } + configs += [ ":pdfium_core_config" ] +} + +# Targets below this are only visible within this file (and to the +# top-level gn_visibility target used to help gn_all build everything). +visibility = [ + ":*", + "//:gn_visibility", +] + +static_library("fdrm") { + sources = [ + "core/fdrm/crypto/fx_crypt.cpp", + "core/fdrm/crypto/fx_crypt.h", + "core/fdrm/crypto/fx_crypt_aes.cpp", + "core/fdrm/crypto/fx_crypt_sha.cpp", + ] + configs += [ ":pdfium_core_config" ] + deps = [ + ":fxcrt", + ] +} + +static_library("fpdfdoc") { + sources = [ + "core/fpdfdoc/cline.cpp", + "core/fpdfdoc/cline.h", + "core/fpdfdoc/clines.cpp", + "core/fpdfdoc/clines.h", + "core/fpdfdoc/cpdf_aaction.cpp", + "core/fpdfdoc/cpdf_aaction.h", + "core/fpdfdoc/cpdf_action.cpp", + "core/fpdfdoc/cpdf_action.h", + "core/fpdfdoc/cpdf_actionfields.cpp", + "core/fpdfdoc/cpdf_actionfields.h", + "core/fpdfdoc/cpdf_annot.cpp", + "core/fpdfdoc/cpdf_annot.h", + "core/fpdfdoc/cpdf_annotlist.cpp", + "core/fpdfdoc/cpdf_annotlist.h", + "core/fpdfdoc/cpdf_apsettings.cpp", + "core/fpdfdoc/cpdf_apsettings.h", + "core/fpdfdoc/cpdf_bookmark.cpp", + "core/fpdfdoc/cpdf_bookmark.h", + "core/fpdfdoc/cpdf_bookmarktree.cpp", + "core/fpdfdoc/cpdf_bookmarktree.h", + "core/fpdfdoc/cpdf_defaultappearance.cpp", + "core/fpdfdoc/cpdf_defaultappearance.h", + "core/fpdfdoc/cpdf_dest.cpp", + "core/fpdfdoc/cpdf_dest.h", + "core/fpdfdoc/cpdf_docjsactions.cpp", + "core/fpdfdoc/cpdf_docjsactions.h", + "core/fpdfdoc/cpdf_filespec.cpp", + "core/fpdfdoc/cpdf_filespec.h", + "core/fpdfdoc/cpdf_formcontrol.cpp", + "core/fpdfdoc/cpdf_formcontrol.h", + "core/fpdfdoc/cpdf_formfield.cpp", + "core/fpdfdoc/cpdf_formfield.h", + "core/fpdfdoc/cpdf_iconfit.cpp", + "core/fpdfdoc/cpdf_iconfit.h", + "core/fpdfdoc/cpdf_interform.cpp", + "core/fpdfdoc/cpdf_interform.h", + "core/fpdfdoc/cpdf_link.cpp", + "core/fpdfdoc/cpdf_link.h", + "core/fpdfdoc/cpdf_linklist.cpp", + "core/fpdfdoc/cpdf_linklist.h", + "core/fpdfdoc/cpdf_metadata.cpp", + "core/fpdfdoc/cpdf_metadata.h", + "core/fpdfdoc/cpdf_nametree.cpp", + "core/fpdfdoc/cpdf_nametree.h", + "core/fpdfdoc/cpdf_numbertree.cpp", + "core/fpdfdoc/cpdf_numbertree.h", + "core/fpdfdoc/cpdf_occontext.cpp", + "core/fpdfdoc/cpdf_occontext.h", + "core/fpdfdoc/cpdf_pagelabel.cpp", + "core/fpdfdoc/cpdf_pagelabel.h", + "core/fpdfdoc/cpdf_variabletext.cpp", + "core/fpdfdoc/cpdf_variabletext.h", + "core/fpdfdoc/cpdf_viewerpreferences.cpp", + "core/fpdfdoc/cpdf_viewerpreferences.h", + "core/fpdfdoc/cpvt_arraytemplate.h", + "core/fpdfdoc/cpvt_color.cpp", + "core/fpdfdoc/cpvt_color.h", + "core/fpdfdoc/cpvt_dash.h", + "core/fpdfdoc/cpvt_floatrect.h", + "core/fpdfdoc/cpvt_fontmap.cpp", + "core/fpdfdoc/cpvt_fontmap.h", + "core/fpdfdoc/cpvt_generateap.cpp", + "core/fpdfdoc/cpvt_generateap.h", + "core/fpdfdoc/cpvt_line.h", + "core/fpdfdoc/cpvt_lineinfo.h", + "core/fpdfdoc/cpvt_secprops.h", + "core/fpdfdoc/cpvt_section.h", + "core/fpdfdoc/cpvt_sectioninfo.cpp", + "core/fpdfdoc/cpvt_sectioninfo.h", + "core/fpdfdoc/cpvt_word.h", + "core/fpdfdoc/cpvt_wordinfo.cpp", + "core/fpdfdoc/cpvt_wordinfo.h", + "core/fpdfdoc/cpvt_wordplace.h", + "core/fpdfdoc/cpvt_wordprops.h", + "core/fpdfdoc/cpvt_wordrange.h", + "core/fpdfdoc/csection.cpp", + "core/fpdfdoc/csection.h", + "core/fpdfdoc/ctypeset.cpp", + "core/fpdfdoc/ctypeset.h", + "core/fpdfdoc/doc_tagged.cpp", + "core/fpdfdoc/fpdf_tagged.h", + "core/fpdfdoc/ipdf_formnotify.h", + "core/fpdfdoc/ipvt_fontmap.h", + "core/fpdfdoc/tagged_int.h", + ] + configs += [ ":pdfium_core_config" ] + deps = [ + ":fxcrt", + ] +} + +static_library("fpdfapi") { + sources = [ + "core/fpdfapi/cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp", + "core/fpdfapi/cmaps/CNS1/B5pc-H_0.cpp", + "core/fpdfapi/cmaps/CNS1/B5pc-V_0.cpp", + "core/fpdfapi/cmaps/CNS1/CNS-EUC-H_0.cpp", + "core/fpdfapi/cmaps/CNS1/CNS-EUC-V_0.cpp", + "core/fpdfapi/cmaps/CNS1/ETen-B5-H_0.cpp", + "core/fpdfapi/cmaps/CNS1/ETen-B5-V_0.cpp", + "core/fpdfapi/cmaps/CNS1/ETenms-B5-H_0.cpp", + "core/fpdfapi/cmaps/CNS1/ETenms-B5-V_0.cpp", + "core/fpdfapi/cmaps/CNS1/HKscs-B5-H_5.cpp", + "core/fpdfapi/cmaps/CNS1/HKscs-B5-V_5.cpp", + "core/fpdfapi/cmaps/CNS1/UniCNS-UCS2-H_3.cpp", + "core/fpdfapi/cmaps/CNS1/UniCNS-UCS2-V_3.cpp", + "core/fpdfapi/cmaps/CNS1/UniCNS-UTF16-H_0.cpp", + "core/fpdfapi/cmaps/CNS1/cmaps_cns1.cpp", + "core/fpdfapi/cmaps/GB1/Adobe-GB1-UCS2_5.cpp", + "core/fpdfapi/cmaps/GB1/GB-EUC-H_0.cpp", + "core/fpdfapi/cmaps/GB1/GB-EUC-V_0.cpp", + "core/fpdfapi/cmaps/GB1/GBK-EUC-H_2.cpp", + "core/fpdfapi/cmaps/GB1/GBK-EUC-V_2.cpp", + "core/fpdfapi/cmaps/GB1/GBK2K-H_5.cpp", + "core/fpdfapi/cmaps/GB1/GBK2K-V_5.cpp", + "core/fpdfapi/cmaps/GB1/GBKp-EUC-H_2.cpp", + "core/fpdfapi/cmaps/GB1/GBKp-EUC-V_2.cpp", + "core/fpdfapi/cmaps/GB1/GBpc-EUC-H_0.cpp", + "core/fpdfapi/cmaps/GB1/GBpc-EUC-V_0.cpp", + "core/fpdfapi/cmaps/GB1/UniGB-UCS2-H_4.cpp", + "core/fpdfapi/cmaps/GB1/UniGB-UCS2-V_4.cpp", + "core/fpdfapi/cmaps/GB1/cmaps_gb1.cpp", + "core/fpdfapi/cmaps/Japan1/83pv-RKSJ-H_1.cpp", + "core/fpdfapi/cmaps/Japan1/90ms-RKSJ-H_2.cpp", + "core/fpdfapi/cmaps/Japan1/90ms-RKSJ-V_2.cpp", + "core/fpdfapi/cmaps/Japan1/90msp-RKSJ-H_2.cpp", + "core/fpdfapi/cmaps/Japan1/90msp-RKSJ-V_2.cpp", + "core/fpdfapi/cmaps/Japan1/90pv-RKSJ-H_1.cpp", + "core/fpdfapi/cmaps/Japan1/Add-RKSJ-H_1.cpp", + "core/fpdfapi/cmaps/Japan1/Add-RKSJ-V_1.cpp", + "core/fpdfapi/cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp", + "core/fpdfapi/cmaps/Japan1/EUC-H_1.cpp", + "core/fpdfapi/cmaps/Japan1/EUC-V_1.cpp", + "core/fpdfapi/cmaps/Japan1/Ext-RKSJ-H_2.cpp", + "core/fpdfapi/cmaps/Japan1/Ext-RKSJ-V_2.cpp", + "core/fpdfapi/cmaps/Japan1/H_1.cpp", + "core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp", + "core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp", + "core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-H_4.cpp", + "core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-V_4.cpp", + "core/fpdfapi/cmaps/Japan1/V_1.cpp", + "core/fpdfapi/cmaps/Japan1/cmaps_japan1.cpp", + "core/fpdfapi/cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp", + "core/fpdfapi/cmaps/Korea1/KSC-EUC-H_0.cpp", + "core/fpdfapi/cmaps/Korea1/KSC-EUC-V_0.cpp", + "core/fpdfapi/cmaps/Korea1/KSCms-UHC-HW-H_1.cpp", + "core/fpdfapi/cmaps/Korea1/KSCms-UHC-HW-V_1.cpp", + "core/fpdfapi/cmaps/Korea1/KSCms-UHC-H_1.cpp", + "core/fpdfapi/cmaps/Korea1/KSCms-UHC-V_1.cpp", + "core/fpdfapi/cmaps/Korea1/KSCpc-EUC-H_0.cpp", + "core/fpdfapi/cmaps/Korea1/UniKS-UCS2-H_1.cpp", + "core/fpdfapi/cmaps/Korea1/UniKS-UCS2-V_1.cpp", + "core/fpdfapi/cmaps/Korea1/UniKS-UTF16-H_0.cpp", + "core/fpdfapi/cmaps/Korea1/cmaps_korea1.cpp", + "core/fpdfapi/cmaps/cmap_int.h", + "core/fpdfapi/cmaps/fpdf_cmaps.cpp", + "core/fpdfapi/cpdf_modulemgr.cpp", + "core/fpdfapi/cpdf_modulemgr.h", + "core/fpdfapi/cpdf_pagerendercontext.cpp", + "core/fpdfapi/cpdf_pagerendercontext.h", + "core/fpdfapi/edit/cpdf_creator.h", + "core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp", + "core/fpdfapi/edit/cpdf_pagecontentgenerator.h", + "core/fpdfapi/edit/editint.h", + "core/fpdfapi/edit/fpdf_edit_create.cpp", + "core/fpdfapi/font/cpdf_cidfont.cpp", + "core/fpdfapi/font/cpdf_cidfont.h", + "core/fpdfapi/font/cpdf_font.cpp", + "core/fpdfapi/font/cpdf_font.h", + "core/fpdfapi/font/cpdf_fontencoding.cpp", + "core/fpdfapi/font/cpdf_fontencoding.h", + "core/fpdfapi/font/cpdf_simplefont.cpp", + "core/fpdfapi/font/cpdf_simplefont.h", + "core/fpdfapi/font/cpdf_truetypefont.cpp", + "core/fpdfapi/font/cpdf_truetypefont.h", + "core/fpdfapi/font/cpdf_type1font.cpp", + "core/fpdfapi/font/cpdf_type1font.h", + "core/fpdfapi/font/cpdf_type3char.cpp", + "core/fpdfapi/font/cpdf_type3char.h", + "core/fpdfapi/font/cpdf_type3font.cpp", + "core/fpdfapi/font/cpdf_type3font.h", + "core/fpdfapi/font/font_int.h", + "core/fpdfapi/font/fpdf_font.cpp", + "core/fpdfapi/font/fpdf_font_cid.cpp", + "core/fpdfapi/font/ttgsubtable.cpp", + "core/fpdfapi/font/ttgsubtable.h", + "core/fpdfapi/page/cpdf_allstates.cpp", + "core/fpdfapi/page/cpdf_allstates.h", + "core/fpdfapi/page/cpdf_clippath.cpp", + "core/fpdfapi/page/cpdf_clippath.h", + "core/fpdfapi/page/cpdf_color.cpp", + "core/fpdfapi/page/cpdf_color.h", + "core/fpdfapi/page/cpdf_colorspace.cpp", + "core/fpdfapi/page/cpdf_colorspace.h", + "core/fpdfapi/page/cpdf_colorstate.cpp", + "core/fpdfapi/page/cpdf_colorstate.h", + "core/fpdfapi/page/cpdf_contentmark.cpp", + "core/fpdfapi/page/cpdf_contentmark.h", + "core/fpdfapi/page/cpdf_contentmarkitem.cpp", + "core/fpdfapi/page/cpdf_contentmarkitem.h", + "core/fpdfapi/page/cpdf_contentparser.cpp", + "core/fpdfapi/page/cpdf_contentparser.h", + "core/fpdfapi/page/cpdf_countedobject.h", + "core/fpdfapi/page/cpdf_docpagedata.cpp", + "core/fpdfapi/page/cpdf_docpagedata.h", + "core/fpdfapi/page/cpdf_form.cpp", + "core/fpdfapi/page/cpdf_form.h", + "core/fpdfapi/page/cpdf_formobject.cpp", + "core/fpdfapi/page/cpdf_formobject.h", + "core/fpdfapi/page/cpdf_generalstate.cpp", + "core/fpdfapi/page/cpdf_generalstate.h", + "core/fpdfapi/page/cpdf_graphicstates.cpp", + "core/fpdfapi/page/cpdf_graphicstates.h", + "core/fpdfapi/page/cpdf_image.cpp", + "core/fpdfapi/page/cpdf_image.h", + "core/fpdfapi/page/cpdf_imageobject.cpp", + "core/fpdfapi/page/cpdf_imageobject.h", + "core/fpdfapi/page/cpdf_meshstream.cpp", + "core/fpdfapi/page/cpdf_meshstream.h", + "core/fpdfapi/page/cpdf_page.cpp", + "core/fpdfapi/page/cpdf_page.h", + "core/fpdfapi/page/cpdf_pagemodule.cpp", + "core/fpdfapi/page/cpdf_pagemodule.h", + "core/fpdfapi/page/cpdf_pageobject.cpp", + "core/fpdfapi/page/cpdf_pageobject.h", + "core/fpdfapi/page/cpdf_pageobjectholder.cpp", + "core/fpdfapi/page/cpdf_pageobjectholder.h", + "core/fpdfapi/page/cpdf_pageobjectlist.cpp", + "core/fpdfapi/page/cpdf_pageobjectlist.h", + "core/fpdfapi/page/cpdf_path.cpp", + "core/fpdfapi/page/cpdf_path.h", + "core/fpdfapi/page/cpdf_pathobject.cpp", + "core/fpdfapi/page/cpdf_pathobject.h", + "core/fpdfapi/page/cpdf_pattern.cpp", + "core/fpdfapi/page/cpdf_pattern.h", + "core/fpdfapi/page/cpdf_shadingobject.cpp", + "core/fpdfapi/page/cpdf_shadingobject.h", + "core/fpdfapi/page/cpdf_shadingpattern.cpp", + "core/fpdfapi/page/cpdf_shadingpattern.h", + "core/fpdfapi/page/cpdf_streamcontentparser.cpp", + "core/fpdfapi/page/cpdf_streamcontentparser.h", + "core/fpdfapi/page/cpdf_streamparser.cpp", + "core/fpdfapi/page/cpdf_streamparser.h", + "core/fpdfapi/page/cpdf_textobject.cpp", + "core/fpdfapi/page/cpdf_textobject.h", + "core/fpdfapi/page/cpdf_textstate.cpp", + "core/fpdfapi/page/cpdf_textstate.h", + "core/fpdfapi/page/cpdf_tilingpattern.cpp", + "core/fpdfapi/page/cpdf_tilingpattern.h", + "core/fpdfapi/page/fpdf_page_colors.cpp", + "core/fpdfapi/page/fpdf_page_func.cpp", + "core/fpdfapi/page/pageint.h", + "core/fpdfapi/parser/cfdf_document.cpp", + "core/fpdfapi/parser/cfdf_document.h", + "core/fpdfapi/parser/cpdf_array.cpp", + "core/fpdfapi/parser/cpdf_array.h", + "core/fpdfapi/parser/cpdf_boolean.cpp", + "core/fpdfapi/parser/cpdf_boolean.h", + "core/fpdfapi/parser/cpdf_crypto_handler.cpp", + "core/fpdfapi/parser/cpdf_crypto_handler.h", + "core/fpdfapi/parser/cpdf_data_avail.cpp", + "core/fpdfapi/parser/cpdf_data_avail.h", + "core/fpdfapi/parser/cpdf_dictionary.cpp", + "core/fpdfapi/parser/cpdf_dictionary.h", + "core/fpdfapi/parser/cpdf_document.cpp", + "core/fpdfapi/parser/cpdf_document.h", + "core/fpdfapi/parser/cpdf_hint_tables.cpp", + "core/fpdfapi/parser/cpdf_hint_tables.h", + "core/fpdfapi/parser/cpdf_indirect_object_holder.cpp", + "core/fpdfapi/parser/cpdf_indirect_object_holder.h", + "core/fpdfapi/parser/cpdf_linearized_header.cpp", + "core/fpdfapi/parser/cpdf_linearized_header.h", + "core/fpdfapi/parser/cpdf_name.cpp", + "core/fpdfapi/parser/cpdf_name.h", + "core/fpdfapi/parser/cpdf_null.cpp", + "core/fpdfapi/parser/cpdf_null.h", + "core/fpdfapi/parser/cpdf_number.cpp", + "core/fpdfapi/parser/cpdf_number.h", + "core/fpdfapi/parser/cpdf_object.cpp", + "core/fpdfapi/parser/cpdf_object.h", + "core/fpdfapi/parser/cpdf_parser.cpp", + "core/fpdfapi/parser/cpdf_parser.h", + "core/fpdfapi/parser/cpdf_reference.cpp", + "core/fpdfapi/parser/cpdf_reference.h", + "core/fpdfapi/parser/cpdf_security_handler.cpp", + "core/fpdfapi/parser/cpdf_security_handler.h", + "core/fpdfapi/parser/cpdf_simple_parser.cpp", + "core/fpdfapi/parser/cpdf_simple_parser.h", + "core/fpdfapi/parser/cpdf_stream.cpp", + "core/fpdfapi/parser/cpdf_stream.h", + "core/fpdfapi/parser/cpdf_stream_acc.cpp", + "core/fpdfapi/parser/cpdf_stream_acc.h", + "core/fpdfapi/parser/cpdf_string.cpp", + "core/fpdfapi/parser/cpdf_string.h", + "core/fpdfapi/parser/cpdf_syntax_parser.cpp", + "core/fpdfapi/parser/cpdf_syntax_parser.h", + "core/fpdfapi/parser/fpdf_parser_decode.cpp", + "core/fpdfapi/parser/fpdf_parser_decode.h", + "core/fpdfapi/parser/fpdf_parser_utility.cpp", + "core/fpdfapi/parser/fpdf_parser_utility.h", + "core/fpdfapi/render/cpdf_charposlist.cpp", + "core/fpdfapi/render/cpdf_charposlist.h", + "core/fpdfapi/render/cpdf_devicebuffer.cpp", + "core/fpdfapi/render/cpdf_devicebuffer.h", + "core/fpdfapi/render/cpdf_dibsource.cpp", + "core/fpdfapi/render/cpdf_dibsource.h", + "core/fpdfapi/render/cpdf_dibtransferfunc.cpp", + "core/fpdfapi/render/cpdf_dibtransferfunc.h", + "core/fpdfapi/render/cpdf_docrenderdata.cpp", + "core/fpdfapi/render/cpdf_docrenderdata.h", + "core/fpdfapi/render/cpdf_imagecacheentry.cpp", + "core/fpdfapi/render/cpdf_imagecacheentry.h", + "core/fpdfapi/render/cpdf_imageloader.cpp", + "core/fpdfapi/render/cpdf_imageloader.h", + "core/fpdfapi/render/cpdf_imagerenderer.cpp", + "core/fpdfapi/render/cpdf_imagerenderer.h", + "core/fpdfapi/render/cpdf_pagerendercache.cpp", + "core/fpdfapi/render/cpdf_pagerendercache.h", + "core/fpdfapi/render/cpdf_progressiverenderer.cpp", + "core/fpdfapi/render/cpdf_progressiverenderer.h", + "core/fpdfapi/render/cpdf_rendercontext.cpp", + "core/fpdfapi/render/cpdf_rendercontext.h", + "core/fpdfapi/render/cpdf_renderoptions.cpp", + "core/fpdfapi/render/cpdf_renderoptions.h", + "core/fpdfapi/render/cpdf_renderstatus.cpp", + "core/fpdfapi/render/cpdf_renderstatus.h", + "core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp", + "core/fpdfapi/render/cpdf_scaledrenderbuffer.h", + "core/fpdfapi/render/cpdf_textrenderer.cpp", + "core/fpdfapi/render/cpdf_textrenderer.h", + "core/fpdfapi/render/cpdf_transferfunc.cpp", + "core/fpdfapi/render/cpdf_transferfunc.h", + "core/fpdfapi/render/cpdf_type3cache.cpp", + "core/fpdfapi/render/cpdf_type3cache.h", + "core/fpdfapi/render/cpdf_type3glyphs.cpp", + "core/fpdfapi/render/cpdf_type3glyphs.h", + ] + configs += [ ":pdfium_core_config" ] + deps = [ + ":fxcrt", + ] +} + +static_library("fpdftext") { + sources = [ + "core/fpdftext/cpdf_linkextract.cpp", + "core/fpdftext/cpdf_linkextract.h", + "core/fpdftext/cpdf_textpage.cpp", + "core/fpdftext/cpdf_textpage.h", + "core/fpdftext/cpdf_textpagefind.cpp", + "core/fpdftext/cpdf_textpagefind.h", + "core/fpdftext/unicodenormalizationdata.cpp", + "core/fpdftext/unicodenormalizationdata.h", + ] + configs += [ ":pdfium_core_config" ] + deps = [ + ":fxcrt", + ] +} + +static_library("fxcodec") { + sources = [ + "core/fxcodec/JBig2_DocumentContext.h", + "core/fxcodec/codec/ccodec_basicmodule.h", + "core/fxcodec/codec/ccodec_faxmodule.h", + "core/fxcodec/codec/ccodec_flatemodule.h", + "core/fxcodec/codec/ccodec_iccmodule.h", + "core/fxcodec/codec/ccodec_jbig2module.h", + "core/fxcodec/codec/ccodec_jpegmodule.h", + "core/fxcodec/codec/ccodec_jpxmodule.h", + "core/fxcodec/codec/ccodec_scanlinedecoder.h", + "core/fxcodec/codec/codec_int.h", + "core/fxcodec/codec/fx_codec.cpp", + "core/fxcodec/codec/fx_codec_fax.cpp", + "core/fxcodec/codec/fx_codec_flate.cpp", + "core/fxcodec/codec/fx_codec_icc.cpp", + "core/fxcodec/codec/fx_codec_jbig.cpp", + "core/fxcodec/codec/fx_codec_jpeg.cpp", + "core/fxcodec/codec/fx_codec_jpx_opj.cpp", + "core/fxcodec/fx_codec.h", + "core/fxcodec/fx_codec_def.h", + "core/fxcodec/jbig2/JBig2_ArithDecoder.cpp", + "core/fxcodec/jbig2/JBig2_ArithDecoder.h", + "core/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp", + "core/fxcodec/jbig2/JBig2_ArithIntDecoder.h", + "core/fxcodec/jbig2/JBig2_BitStream.cpp", + "core/fxcodec/jbig2/JBig2_BitStream.h", + "core/fxcodec/jbig2/JBig2_Context.cpp", + "core/fxcodec/jbig2/JBig2_Context.h", + "core/fxcodec/jbig2/JBig2_Define.h", + "core/fxcodec/jbig2/JBig2_GrdProc.cpp", + "core/fxcodec/jbig2/JBig2_GrdProc.h", + "core/fxcodec/jbig2/JBig2_GrrdProc.cpp", + "core/fxcodec/jbig2/JBig2_GrrdProc.h", + "core/fxcodec/jbig2/JBig2_GsidProc.cpp", + "core/fxcodec/jbig2/JBig2_GsidProc.h", + "core/fxcodec/jbig2/JBig2_HtrdProc.cpp", + "core/fxcodec/jbig2/JBig2_HtrdProc.h", + "core/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp", + "core/fxcodec/jbig2/JBig2_HuffmanDecoder.h", + "core/fxcodec/jbig2/JBig2_HuffmanTable.cpp", + "core/fxcodec/jbig2/JBig2_HuffmanTable.h", + "core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.cpp", + "core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h", + "core/fxcodec/jbig2/JBig2_Image.cpp", + "core/fxcodec/jbig2/JBig2_Image.h", + "core/fxcodec/jbig2/JBig2_Page.h", + "core/fxcodec/jbig2/JBig2_PatternDict.cpp", + "core/fxcodec/jbig2/JBig2_PatternDict.h", + "core/fxcodec/jbig2/JBig2_PddProc.cpp", + "core/fxcodec/jbig2/JBig2_PddProc.h", + "core/fxcodec/jbig2/JBig2_SddProc.cpp", + "core/fxcodec/jbig2/JBig2_SddProc.h", + "core/fxcodec/jbig2/JBig2_Segment.cpp", + "core/fxcodec/jbig2/JBig2_Segment.h", + "core/fxcodec/jbig2/JBig2_SymbolDict.cpp", + "core/fxcodec/jbig2/JBig2_SymbolDict.h", + "core/fxcodec/jbig2/JBig2_TrdProc.cpp", + "core/fxcodec/jbig2/JBig2_TrdProc.h", + ] + configs += [ ":pdfium_core_config" ] + include_dirs = [] + deps = [ + ":fxcrt", + "third_party:fx_lcms2", + "third_party:fx_libopenjpeg", + "third_party:fx_zlib", + + # This is a generic JPEG library dependency. + "//third_party:jpeg", + ] + + if (pdf_enable_xfa) { + sources += [ + "core/fxcodec/codec/ccodec_bmpmodule.cpp", + "core/fxcodec/codec/ccodec_bmpmodule.h", + "core/fxcodec/codec/ccodec_gifmodule.cpp", + "core/fxcodec/codec/ccodec_gifmodule.h", + "core/fxcodec/codec/ccodec_pngmodule.cpp", + "core/fxcodec/codec/ccodec_pngmodule.h", + "core/fxcodec/codec/ccodec_progressivedecoder.h", + "core/fxcodec/codec/ccodec_tiffmodule.cpp", + "core/fxcodec/codec/ccodec_tiffmodule.h", + "core/fxcodec/codec/fx_codec_progress.cpp", + "core/fxcodec/codec/icodec_bmpmodule.h", + "core/fxcodec/codec/icodec_gifmodule.h", + "core/fxcodec/codec/icodec_pngmodule.h", + "core/fxcodec/codec/icodec_tiffmodule.h", + "core/fxcodec/lbmp/fx_bmp.cpp", + "core/fxcodec/lbmp/fx_bmp.h", + "core/fxcodec/lgif/fx_gif.cpp", + "core/fxcodec/lgif/fx_gif.h", + ] + deps += [ + "third_party:fx_lpng", + "third_party:fx_tiff", + ] + } + if (is_posix) { + # core/fxcodec/fx_libopenjpeg/src/fx_mct.c does an pointer-to-int + # conversion to check that an address is 16-bit aligned (benign). + cflags_c = [ "-Wno-pointer-to-int-cast" ] + } +} + +config("fxge_warnings") { + if (is_clang) { + cflags = [ + # http://code.google.com/p/pdfium/issues/detail?id=188 + "-Wno-switch", + ] + } +} + +static_library("fxcrt") { + sources = [ + "core/fxcrt/cfx_maybe_owned.h", + "core/fxcrt/cfx_observable.h", + "core/fxcrt/cfx_retain_ptr.h", + "core/fxcrt/cfx_shared_copy_on_write.h", + "core/fxcrt/cfx_string_c_template.h", + "core/fxcrt/cfx_string_data_template.h", + "core/fxcrt/cfx_string_pool_template.h", + "core/fxcrt/cfx_weak_ptr.h", + "core/fxcrt/extension.h", + "core/fxcrt/fx_basic.h", + "core/fxcrt/fx_basic_array.cpp", + "core/fxcrt/fx_basic_bstring.cpp", + "core/fxcrt/fx_basic_buffer.cpp", + "core/fxcrt/fx_basic_coords.cpp", + "core/fxcrt/fx_basic_gcc.cpp", + "core/fxcrt/fx_basic_memmgr.cpp", + "core/fxcrt/fx_basic_utf.cpp", + "core/fxcrt/fx_basic_util.cpp", + "core/fxcrt/fx_basic_wstring.cpp", + "core/fxcrt/fx_bidi.cpp", + "core/fxcrt/fx_bidi.h", + "core/fxcrt/fx_coordinates.h", + "core/fxcrt/fx_ext.h", + "core/fxcrt/fx_extension.cpp", + "core/fxcrt/fx_memory.h", + "core/fxcrt/fx_safe_types.h", + "core/fxcrt/fx_stream.h", + "core/fxcrt/fx_string.h", + "core/fxcrt/fx_system.h", + "core/fxcrt/fx_ucd.h", + "core/fxcrt/fx_ucddata.cpp", + "core/fxcrt/fx_unicode.cpp", + "core/fxcrt/fx_xml.h", + "core/fxcrt/fx_xml_composer.cpp", + "core/fxcrt/fx_xml_parser.cpp", + "core/fxcrt/fxcrt_posix.cpp", + "core/fxcrt/fxcrt_posix.h", + "core/fxcrt/fxcrt_stream.cpp", + "core/fxcrt/fxcrt_windows.cpp", + "core/fxcrt/fxcrt_windows.h", + "core/fxcrt/xml_int.h", + ] + configs += [ ":pdfium_core_config" ] + visibility += [ "third_party:*" ] + deps = [ + "third_party:pdfium_base", + ] + public_deps = [ + "third_party:pdfium_base", + ] + + if (pdf_enable_xfa) { + sources += [ + "core/fxcrt/fx_arabic.cpp", + "core/fxcrt/fx_arabic.h", + "core/fxcrt/fx_arb.h", + ] + } +} + +static_library("fxge") { + sources = [ + "core/fxge/android/cfpf_skiabufferfont.h", + "core/fxge/android/cfpf_skiadevicemodule.cpp", + "core/fxge/android/cfpf_skiadevicemodule.h", + "core/fxge/android/cfpf_skiafilefont.h", + "core/fxge/android/cfpf_skiafont.cpp", + "core/fxge/android/cfpf_skiafont.h", + "core/fxge/android/cfpf_skiafontdescriptor.h", + "core/fxge/android/cfpf_skiafontmgr.cpp", + "core/fxge/android/cfpf_skiafontmgr.h", + "core/fxge/android/cfpf_skiapathfont.h", + "core/fxge/android/cfx_androidfontinfo.cpp", + "core/fxge/android/cfx_androidfontinfo.h", + "core/fxge/android/fx_android_imp.cpp", + "core/fxge/cfx_facecache.h", + "core/fxge/cfx_fontcache.h", + "core/fxge/cfx_fontmapper.h", + "core/fxge/cfx_fontmgr.h", + "core/fxge/cfx_fxgedevice.h", + "core/fxge/cfx_gemodule.h", + "core/fxge/cfx_graphstate.h", + "core/fxge/cfx_graphstatedata.h", + "core/fxge/cfx_pathdata.h", + "core/fxge/cfx_renderdevice.h", + "core/fxge/cfx_substfont.h", + "core/fxge/cfx_unicodeencoding.h", + "core/fxge/cfx_windowsdevice.h", + "core/fxge/dib/dib_int.h", + "core/fxge/dib/fx_dib_composite.cpp", + "core/fxge/dib/fx_dib_convert.cpp", + "core/fxge/dib/fx_dib_engine.cpp", + "core/fxge/dib/fx_dib_main.cpp", + "core/fxge/dib/fx_dib_transform.cpp", + "core/fxge/fontdata/chromefontdata/FoxitDingbats.cpp", + "core/fxge/fontdata/chromefontdata/FoxitFixed.cpp", + "core/fxge/fontdata/chromefontdata/FoxitFixedBold.cpp", + "core/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.cpp", + "core/fxge/fontdata/chromefontdata/FoxitFixedItalic.cpp", + "core/fxge/fontdata/chromefontdata/FoxitSans.cpp", + "core/fxge/fontdata/chromefontdata/FoxitSansBold.cpp", + "core/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.cpp", + "core/fxge/fontdata/chromefontdata/FoxitSansItalic.cpp", + "core/fxge/fontdata/chromefontdata/FoxitSansMM.cpp", + "core/fxge/fontdata/chromefontdata/FoxitSerif.cpp", + "core/fxge/fontdata/chromefontdata/FoxitSerifBold.cpp", + "core/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.cpp", + "core/fxge/fontdata/chromefontdata/FoxitSerifItalic.cpp", + "core/fxge/fontdata/chromefontdata/FoxitSerifMM.cpp", + "core/fxge/fontdata/chromefontdata/FoxitSymbol.cpp", + "core/fxge/fontdata/chromefontdata/chromefontdata.h", + "core/fxge/freetype/fx_freetype.cpp", + "core/fxge/fx_dib.h", + "core/fxge/fx_font.h", + "core/fxge/fx_freetype.h", + "core/fxge/ge/cfx_cliprgn.cpp", + "core/fxge/ge/cfx_cliprgn.h", + "core/fxge/ge/cfx_facecache.cpp", + "core/fxge/ge/cfx_folderfontinfo.cpp", + "core/fxge/ge/cfx_folderfontinfo.h", + "core/fxge/ge/cfx_font.cpp", + "core/fxge/ge/cfx_fontcache.cpp", + "core/fxge/ge/cfx_fontmapper.cpp", + "core/fxge/ge/cfx_fontmgr.cpp", + "core/fxge/ge/cfx_gemodule.cpp", + "core/fxge/ge/cfx_graphstate.cpp", + "core/fxge/ge/cfx_graphstatedata.cpp", + "core/fxge/ge/cfx_pathdata.cpp", + "core/fxge/ge/cfx_renderdevice.cpp", + "core/fxge/ge/cfx_substfont.cpp", + "core/fxge/ge/cfx_unicodeencoding.cpp", + "core/fxge/ge/cttfontdesc.cpp", + "core/fxge/ge/cttfontdesc.h", + "core/fxge/ge/fx_ge_fontmap.cpp", + "core/fxge/ge/fx_ge_linux.cpp", + "core/fxge/ge/fx_ge_text.cpp", + "core/fxge/ge/fx_text_int.h", + "core/fxge/ifx_renderdevicedriver.cpp", + "core/fxge/ifx_renderdevicedriver.h", + "core/fxge/ifx_systemfontinfo.h", + "core/fxge/win32/cfx_windowsdib.h", + ] + + configs += [ + ":fxge_warnings", + ":pdfium_core_config", + ] + + deps = [ + ":fxcrt", + ] + + if (pdf_enable_xfa) { + sources += [ + "core/fxge/cfx_unicodeencodingex.h", + "core/fxge/ge/cfx_unicodeencodingex.cpp", + ] + } + + if (pdf_use_skia || pdf_use_skia_paths) { + sources += [ "core/fxge/skia/fx_skia_device.cpp" ] + deps += [ "//skia" ] + } else { + sources += [ + "core/fxge/agg/fx_agg_driver.cpp", + "core/fxge/agg/fx_agg_driver.h", + ] + deps += [ "third_party:fx_agg" ] + + if (is_mac) { + sources += [ "core/fxge/apple/fx_apple_platform.cpp" ] + } + } + + if (is_win) { + sources += [ + "core/fxge/win32/cfx_psrenderer.cpp", + "core/fxge/win32/cfx_psrenderer.h", + "core/fxge/win32/cpsoutput.cpp", + "core/fxge/win32/cpsoutput.h", + "core/fxge/win32/dwrite_int.h", + "core/fxge/win32/fx_win32_device.cpp", + "core/fxge/win32/fx_win32_dib.cpp", + "core/fxge/win32/fx_win32_dwrite.cpp", + "core/fxge/win32/fx_win32_gdipext.cpp", + "core/fxge/win32/fx_win32_print.cpp", + "core/fxge/win32/win32_int.h", + ] + configs -= [ "//build/config/win:lean_and_mean" ] + } + + if (is_mac) { + sources += [ + "core/fxge/apple/apple_int.h", + "core/fxge/apple/fx_mac_imp.cpp", + "core/fxge/apple/fx_quartz_device.cpp", + ] + } +} + +static_library("fxedit") { + sources = [ + "fpdfsdk/fxedit/fx_edit.h", + "fpdfsdk/fxedit/fxet_ap.cpp", + "fpdfsdk/fxedit/fxet_edit.cpp", + "fpdfsdk/fxedit/fxet_edit.h", + "fpdfsdk/fxedit/fxet_list.cpp", + "fpdfsdk/fxedit/fxet_list.h", + ] + configs += [ ":pdfium_core_config" ] + deps = [ + ":fxcrt", + ] +} + +static_library("pdfwindow") { + sources = [ + "fpdfsdk/pdfwindow/PWL_Button.cpp", + "fpdfsdk/pdfwindow/PWL_Button.h", + "fpdfsdk/pdfwindow/PWL_Caret.cpp", + "fpdfsdk/pdfwindow/PWL_Caret.h", + "fpdfsdk/pdfwindow/PWL_ComboBox.cpp", + "fpdfsdk/pdfwindow/PWL_ComboBox.h", + "fpdfsdk/pdfwindow/PWL_Edit.cpp", + "fpdfsdk/pdfwindow/PWL_Edit.h", + "fpdfsdk/pdfwindow/PWL_EditCtrl.cpp", + "fpdfsdk/pdfwindow/PWL_EditCtrl.h", + "fpdfsdk/pdfwindow/PWL_FontMap.cpp", + "fpdfsdk/pdfwindow/PWL_FontMap.h", + "fpdfsdk/pdfwindow/PWL_Icon.cpp", + "fpdfsdk/pdfwindow/PWL_Icon.h", + "fpdfsdk/pdfwindow/PWL_ListBox.cpp", + "fpdfsdk/pdfwindow/PWL_ListBox.h", + "fpdfsdk/pdfwindow/PWL_ScrollBar.cpp", + "fpdfsdk/pdfwindow/PWL_ScrollBar.h", + "fpdfsdk/pdfwindow/PWL_SpecialButton.cpp", + "fpdfsdk/pdfwindow/PWL_SpecialButton.h", + "fpdfsdk/pdfwindow/PWL_Utils.cpp", + "fpdfsdk/pdfwindow/PWL_Utils.h", + "fpdfsdk/pdfwindow/PWL_Wnd.cpp", + "fpdfsdk/pdfwindow/PWL_Wnd.h", + "fpdfsdk/pdfwindow/cpwl_color.cpp", + "fpdfsdk/pdfwindow/cpwl_color.h", + ] + configs += [ ":pdfium_core_config" ] + deps = [ + ":fxcrt", + ] +} + +static_library("javascript") { + sources = [ + "fpdfsdk/javascript/ijs_event_context.h", + "fpdfsdk/javascript/ijs_runtime.h", + ] + configs += [ ":pdfium_core_config" ] + deps = [ + ":fxcrt", + ] + + if (pdf_enable_v8) { + sources += [ + "fpdfsdk/javascript/Annot.cpp", + "fpdfsdk/javascript/Annot.h", + "fpdfsdk/javascript/Consts.cpp", + "fpdfsdk/javascript/Consts.h", + "fpdfsdk/javascript/Document.cpp", + "fpdfsdk/javascript/Document.h", + "fpdfsdk/javascript/Field.cpp", + "fpdfsdk/javascript/Field.h", + "fpdfsdk/javascript/Icon.cpp", + "fpdfsdk/javascript/Icon.h", + "fpdfsdk/javascript/JS_Define.h", + "fpdfsdk/javascript/JS_EventHandler.cpp", + "fpdfsdk/javascript/JS_EventHandler.h", + "fpdfsdk/javascript/JS_GlobalData.cpp", + "fpdfsdk/javascript/JS_GlobalData.h", + "fpdfsdk/javascript/JS_KeyValue.cpp", + "fpdfsdk/javascript/JS_KeyValue.h", + "fpdfsdk/javascript/JS_Object.cpp", + "fpdfsdk/javascript/JS_Object.h", + "fpdfsdk/javascript/JS_Value.cpp", + "fpdfsdk/javascript/JS_Value.h", + "fpdfsdk/javascript/PublicMethods.cpp", + "fpdfsdk/javascript/PublicMethods.h", + "fpdfsdk/javascript/app.cpp", + "fpdfsdk/javascript/app.h", + "fpdfsdk/javascript/cjs_event_context.cpp", + "fpdfsdk/javascript/cjs_event_context.h", + "fpdfsdk/javascript/cjs_runtime.cpp", + "fpdfsdk/javascript/cjs_runtime.h", + "fpdfsdk/javascript/color.cpp", + "fpdfsdk/javascript/color.h", + "fpdfsdk/javascript/console.cpp", + "fpdfsdk/javascript/console.h", + "fpdfsdk/javascript/event.cpp", + "fpdfsdk/javascript/event.h", + "fpdfsdk/javascript/global.cpp", + "fpdfsdk/javascript/global.h", + "fpdfsdk/javascript/report.cpp", + "fpdfsdk/javascript/report.h", + "fpdfsdk/javascript/resource.cpp", + "fpdfsdk/javascript/resource.h", + "fpdfsdk/javascript/util.cpp", + "fpdfsdk/javascript/util.h", + ] + deps += [ ":fxjs" ] + configs += [ "//v8:external_startup_data" ] + } else { + sources += [ "fpdfsdk/javascript/JS_Runtime_Stub.cpp" ] + } +} + +static_library("formfiller") { + sources = [ + "fpdfsdk/formfiller/cba_fontmap.cpp", + "fpdfsdk/formfiller/cba_fontmap.h", + "fpdfsdk/formfiller/cffl_checkbox.cpp", + "fpdfsdk/formfiller/cffl_checkbox.h", + "fpdfsdk/formfiller/cffl_combobox.cpp", + "fpdfsdk/formfiller/cffl_combobox.h", + "fpdfsdk/formfiller/cffl_formfiller.cpp", + "fpdfsdk/formfiller/cffl_formfiller.h", + "fpdfsdk/formfiller/cffl_interactiveformfiller.cpp", + "fpdfsdk/formfiller/cffl_interactiveformfiller.h", + "fpdfsdk/formfiller/cffl_listbox.cpp", + "fpdfsdk/formfiller/cffl_listbox.h", + "fpdfsdk/formfiller/cffl_pushbutton.cpp", + "fpdfsdk/formfiller/cffl_pushbutton.h", + "fpdfsdk/formfiller/cffl_radiobutton.cpp", + "fpdfsdk/formfiller/cffl_radiobutton.h", + "fpdfsdk/formfiller/cffl_textfield.cpp", + "fpdfsdk/formfiller/cffl_textfield.h", + ] + configs += [ ":pdfium_core_config" ] + deps = [ + ":fxcrt", + ] +} + +if (pdf_enable_v8) { + static_library("fxjs") { + sources = [ + "fxjs/fxjs_v8.cpp", + "fxjs/fxjs_v8.h", + ] + configs += [ ":pdfium_core_config" ] + deps = [ + ":fxcrt", + "//v8", + "//v8:v8_libplatform", + ] + include_dirs = [ + "//v8", + "//v8/include", + ] + public_deps = [ + "//v8", + ] + + if (pdf_enable_xfa) { + sources += [ + "fxjs/cfxjse_arguments.cpp", + "fxjs/cfxjse_arguments.h", + "fxjs/cfxjse_class.cpp", + "fxjs/cfxjse_class.h", + "fxjs/cfxjse_context.cpp", + "fxjs/cfxjse_context.h", + "fxjs/cfxjse_isolatetracker.cpp", + "fxjs/cfxjse_isolatetracker.h", + "fxjs/cfxjse_runtimedata.cpp", + "fxjs/cfxjse_runtimedata.h", + "fxjs/cfxjse_value.cpp", + "fxjs/cfxjse_value.h", + "fxjs/fxjse.h", + ] + } + } +} + +if (pdf_enable_xfa) { + static_library("fpdfxfa") { + sources = [ + "fpdfsdk/fpdfxfa/cpdfxfa_context.cpp", + "fpdfsdk/fpdfxfa/cpdfxfa_context.h", + "fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp", + "fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h", + "fpdfsdk/fpdfxfa/cpdfxfa_page.cpp", + "fpdfsdk/fpdfxfa/cpdfxfa_page.h", + "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.cpp", + "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h", + ] + deps = [ + ":fxcrt", + ":fxjs", + ":xfa", + ] + configs += [ ":pdfium_core_config" ] + } + + static_library("xfa") { + sources = [ + "xfa/fde/cfde_path.cpp", + "xfa/fde/cfde_path.h", + "xfa/fde/cfde_txtedtbuf.cpp", + "xfa/fde/cfde_txtedtbuf.h", + "xfa/fde/cfde_txtedtdorecord_deleterange.cpp", + "xfa/fde/cfde_txtedtdorecord_deleterange.h", + "xfa/fde/cfde_txtedtdorecord_insert.cpp", + "xfa/fde/cfde_txtedtdorecord_insert.h", + "xfa/fde/cfde_txtedtengine.cpp", + "xfa/fde/cfde_txtedtengine.h", + "xfa/fde/cfde_txtedtpage.cpp", + "xfa/fde/cfde_txtedtpage.h", + "xfa/fde/cfde_txtedtparag.cpp", + "xfa/fde/cfde_txtedtparag.h", + "xfa/fde/cfde_txtedttextset.cpp", + "xfa/fde/cfde_txtedttextset.h", + "xfa/fde/cfx_chariter.cpp", + "xfa/fde/cfx_chariter.h", + "xfa/fde/cfx_wordbreak.cpp", + "xfa/fde/cfx_wordbreak.h", + "xfa/fde/css/cfde_csscolorvalue.cpp", + "xfa/fde/css/cfde_csscolorvalue.h", + "xfa/fde/css/cfde_csscomputedstyle.cpp", + "xfa/fde/css/cfde_csscomputedstyle.h", + "xfa/fde/css/cfde_csscustomproperty.cpp", + "xfa/fde/css/cfde_csscustomproperty.h", + "xfa/fde/css/cfde_cssdeclaration.cpp", + "xfa/fde/css/cfde_cssdeclaration.h", + "xfa/fde/css/cfde_cssenumvalue.cpp", + "xfa/fde/css/cfde_cssenumvalue.h", + "xfa/fde/css/cfde_cssnumbervalue.cpp", + "xfa/fde/css/cfde_cssnumbervalue.h", + "xfa/fde/css/cfde_csspropertyholder.cpp", + "xfa/fde/css/cfde_csspropertyholder.h", + "xfa/fde/css/cfde_cssrulecollection.cpp", + "xfa/fde/css/cfde_cssrulecollection.h", + "xfa/fde/css/cfde_cssselector.cpp", + "xfa/fde/css/cfde_cssselector.h", + "xfa/fde/css/cfde_cssstringvalue.cpp", + "xfa/fde/css/cfde_cssstringvalue.h", + "xfa/fde/css/cfde_cssstylerule.cpp", + "xfa/fde/css/cfde_cssstylerule.h", + "xfa/fde/css/cfde_cssstyleselector.cpp", + "xfa/fde/css/cfde_cssstyleselector.h", + "xfa/fde/css/cfde_cssstylesheet.cpp", + "xfa/fde/css/cfde_cssstylesheet.h", + "xfa/fde/css/cfde_csssyntaxparser.cpp", + "xfa/fde/css/cfde_csssyntaxparser.h", + "xfa/fde/css/cfde_csstextbuf.cpp", + "xfa/fde/css/cfde_csstextbuf.h", + "xfa/fde/css/cfde_cssvalue.cpp", + "xfa/fde/css/cfde_cssvalue.h", + "xfa/fde/css/cfde_cssvaluelist.cpp", + "xfa/fde/css/cfde_cssvaluelist.h", + "xfa/fde/css/cfde_cssvaluelistparser.cpp", + "xfa/fde/css/cfde_cssvaluelistparser.h", + "xfa/fde/css/fde_css.h", + "xfa/fde/css/fde_cssdatatable.cpp", + "xfa/fde/css/fde_cssdatatable.h", + "xfa/fde/fde_gedevice.cpp", + "xfa/fde/fde_iterator.cpp", + "xfa/fde/fde_iterator.h", + "xfa/fde/fde_object.h", + "xfa/fde/fde_render.cpp", + "xfa/fde/fde_render.h", + "xfa/fde/ifde_txtedtdorecord.h", + "xfa/fde/ifde_txtedtengine.h", + "xfa/fde/ifde_txtedtpage.h", + "xfa/fde/ifx_chariter.h", + "xfa/fde/tto/fde_textout.cpp", + "xfa/fde/tto/fde_textout.h", + "xfa/fde/xml/cfx_saxreader.cpp", + "xfa/fde/xml/cfx_saxreader.h", + "xfa/fde/xml/fde_xml.h", + "xfa/fde/xml/fde_xml_imp.cpp", + "xfa/fde/xml/fde_xml_imp.h", + "xfa/fgas/crt/fgas_codepage.cpp", + "xfa/fgas/crt/fgas_codepage.h", + "xfa/fgas/crt/fgas_language.h", + "xfa/fgas/crt/fgas_stream.cpp", + "xfa/fgas/crt/fgas_stream.h", + "xfa/fgas/crt/fgas_utils.cpp", + "xfa/fgas/crt/fgas_utils.h", + "xfa/fgas/font/cfgas_fontmgr.cpp", + "xfa/fgas/font/cfgas_fontmgr.h", + "xfa/fgas/font/cfgas_gefont.cpp", + "xfa/fgas/font/cfgas_gefont.h", + "xfa/fgas/font/fgas_fontutils.cpp", + "xfa/fgas/font/fgas_fontutils.h", + "xfa/fgas/layout/fgas_linebreak.cpp", + "xfa/fgas/layout/fgas_linebreak.h", + "xfa/fgas/layout/fgas_rtfbreak.cpp", + "xfa/fgas/layout/fgas_rtfbreak.h", + "xfa/fgas/layout/fgas_textbreak.cpp", + "xfa/fgas/layout/fgas_textbreak.h", + "xfa/fgas/localization/fgas_datetime.cpp", + "xfa/fgas/localization/fgas_datetime.h", + "xfa/fgas/localization/fgas_locale.cpp", + "xfa/fgas/localization/fgas_locale.h", + "xfa/fgas/localization/fgas_localeimp.h", + "xfa/fwl/cfwl_app.cpp", + "xfa/fwl/cfwl_app.h", + "xfa/fwl/cfwl_barcode.cpp", + "xfa/fwl/cfwl_barcode.h", + "xfa/fwl/cfwl_caret.cpp", + "xfa/fwl/cfwl_caret.h", + "xfa/fwl/cfwl_checkbox.cpp", + "xfa/fwl/cfwl_checkbox.h", + "xfa/fwl/cfwl_combobox.cpp", + "xfa/fwl/cfwl_combobox.h", + "xfa/fwl/cfwl_comboboxproxy.cpp", + "xfa/fwl/cfwl_comboboxproxy.h", + "xfa/fwl/cfwl_comboedit.cpp", + "xfa/fwl/cfwl_comboedit.h", + "xfa/fwl/cfwl_combolist.cpp", + "xfa/fwl/cfwl_combolist.h", + "xfa/fwl/cfwl_datetimeedit.cpp", + "xfa/fwl/cfwl_datetimeedit.h", + "xfa/fwl/cfwl_datetimepicker.cpp", + "xfa/fwl/cfwl_datetimepicker.h", + "xfa/fwl/cfwl_edit.cpp", + "xfa/fwl/cfwl_edit.h", + "xfa/fwl/cfwl_event.cpp", + "xfa/fwl/cfwl_event.h", + "xfa/fwl/cfwl_eventcheckword.cpp", + "xfa/fwl/cfwl_eventcheckword.h", + "xfa/fwl/cfwl_eventmouse.cpp", + "xfa/fwl/cfwl_eventmouse.h", + "xfa/fwl/cfwl_eventscroll.cpp", + "xfa/fwl/cfwl_eventscroll.h", + "xfa/fwl/cfwl_eventselectchanged.cpp", + "xfa/fwl/cfwl_eventselectchanged.h", + "xfa/fwl/cfwl_eventtarget.cpp", + "xfa/fwl/cfwl_eventtarget.h", + "xfa/fwl/cfwl_eventtextchanged.cpp", + "xfa/fwl/cfwl_eventtextchanged.h", + "xfa/fwl/cfwl_eventvalidate.cpp", + "xfa/fwl/cfwl_eventvalidate.h", + "xfa/fwl/cfwl_form.cpp", + "xfa/fwl/cfwl_form.h", + "xfa/fwl/cfwl_formproxy.cpp", + "xfa/fwl/cfwl_formproxy.h", + "xfa/fwl/cfwl_listbox.cpp", + "xfa/fwl/cfwl_listbox.h", + "xfa/fwl/cfwl_listitem.cpp", + "xfa/fwl/cfwl_listitem.h", + "xfa/fwl/cfwl_message.cpp", + "xfa/fwl/cfwl_message.h", + "xfa/fwl/cfwl_messagekey.cpp", + "xfa/fwl/cfwl_messagekey.h", + "xfa/fwl/cfwl_messagekillfocus.cpp", + "xfa/fwl/cfwl_messagekillfocus.h", + "xfa/fwl/cfwl_messagemouse.cpp", + "xfa/fwl/cfwl_messagemouse.h", + "xfa/fwl/cfwl_messagemousewheel.cpp", + "xfa/fwl/cfwl_messagemousewheel.h", + "xfa/fwl/cfwl_messagesetfocus.cpp", + "xfa/fwl/cfwl_messagesetfocus.h", + "xfa/fwl/cfwl_monthcalendar.cpp", + "xfa/fwl/cfwl_monthcalendar.h", + "xfa/fwl/cfwl_notedriver.cpp", + "xfa/fwl/cfwl_notedriver.h", + "xfa/fwl/cfwl_noteloop.cpp", + "xfa/fwl/cfwl_noteloop.h", + "xfa/fwl/cfwl_picturebox.cpp", + "xfa/fwl/cfwl_picturebox.h", + "xfa/fwl/cfwl_pushbutton.cpp", + "xfa/fwl/cfwl_pushbutton.h", + "xfa/fwl/cfwl_scrollbar.cpp", + "xfa/fwl/cfwl_scrollbar.h", + "xfa/fwl/cfwl_spinbutton.cpp", + "xfa/fwl/cfwl_spinbutton.h", + "xfa/fwl/cfwl_themebackground.h", + "xfa/fwl/cfwl_themepart.cpp", + "xfa/fwl/cfwl_themepart.h", + "xfa/fwl/cfwl_themetext.h", + "xfa/fwl/cfwl_timer.cpp", + "xfa/fwl/cfwl_timer.h", + "xfa/fwl/cfwl_timerinfo.cpp", + "xfa/fwl/cfwl_timerinfo.h", + "xfa/fwl/cfwl_widget.cpp", + "xfa/fwl/cfwl_widget.h", + "xfa/fwl/cfwl_widgetmgr.cpp", + "xfa/fwl/cfwl_widgetmgr.h", + "xfa/fwl/cfwl_widgetproperties.cpp", + "xfa/fwl/cfwl_widgetproperties.h", + "xfa/fwl/cfx_barcode.cpp", + "xfa/fwl/cfx_barcode.h", + "xfa/fwl/fwl_widgetdef.h", + "xfa/fwl/fwl_widgethit.h", + "xfa/fwl/ifwl_adaptertimermgr.h", + "xfa/fwl/ifwl_themeprovider.h", + "xfa/fwl/ifwl_widgetdelegate.h", + "xfa/fwl/ifwl_widgetmgrdelegate.h", + "xfa/fwl/theme/cfwl_barcodetp.cpp", + "xfa/fwl/theme/cfwl_barcodetp.h", + "xfa/fwl/theme/cfwl_carettp.cpp", + "xfa/fwl/theme/cfwl_carettp.h", + "xfa/fwl/theme/cfwl_checkboxtp.cpp", + "xfa/fwl/theme/cfwl_checkboxtp.h", + "xfa/fwl/theme/cfwl_comboboxtp.cpp", + "xfa/fwl/theme/cfwl_comboboxtp.h", + "xfa/fwl/theme/cfwl_datetimepickertp.cpp", + "xfa/fwl/theme/cfwl_datetimepickertp.h", + "xfa/fwl/theme/cfwl_edittp.cpp", + "xfa/fwl/theme/cfwl_edittp.h", + "xfa/fwl/theme/cfwl_listboxtp.cpp", + "xfa/fwl/theme/cfwl_listboxtp.h", + "xfa/fwl/theme/cfwl_monthcalendartp.cpp", + "xfa/fwl/theme/cfwl_monthcalendartp.h", + "xfa/fwl/theme/cfwl_pictureboxtp.cpp", + "xfa/fwl/theme/cfwl_pictureboxtp.h", + "xfa/fwl/theme/cfwl_pushbuttontp.cpp", + "xfa/fwl/theme/cfwl_pushbuttontp.h", + "xfa/fwl/theme/cfwl_scrollbartp.cpp", + "xfa/fwl/theme/cfwl_scrollbartp.h", + "xfa/fwl/theme/cfwl_utils.h", + "xfa/fwl/theme/cfwl_widgettp.cpp", + "xfa/fwl/theme/cfwl_widgettp.h", + "xfa/fxbarcode/BC_Dimension.cpp", + "xfa/fxbarcode/BC_Dimension.h", + "xfa/fxbarcode/BC_Library.cpp", + "xfa/fxbarcode/BC_Library.h", + "xfa/fxbarcode/BC_TwoDimWriter.cpp", + "xfa/fxbarcode/BC_TwoDimWriter.h", + "xfa/fxbarcode/BC_UtilCodingConvert.cpp", + "xfa/fxbarcode/BC_UtilCodingConvert.h", + "xfa/fxbarcode/BC_Utils.cpp", + "xfa/fxbarcode/BC_Writer.cpp", + "xfa/fxbarcode/BC_Writer.h", + "xfa/fxbarcode/cbc_codabar.cpp", + "xfa/fxbarcode/cbc_codabar.h", + "xfa/fxbarcode/cbc_code128.cpp", + "xfa/fxbarcode/cbc_code128.h", + "xfa/fxbarcode/cbc_code39.cpp", + "xfa/fxbarcode/cbc_code39.h", + "xfa/fxbarcode/cbc_codebase.cpp", + "xfa/fxbarcode/cbc_codebase.h", + "xfa/fxbarcode/cbc_datamatrix.cpp", + "xfa/fxbarcode/cbc_datamatrix.h", + "xfa/fxbarcode/cbc_ean13.cpp", + "xfa/fxbarcode/cbc_ean13.h", + "xfa/fxbarcode/cbc_ean8.cpp", + "xfa/fxbarcode/cbc_ean8.h", + "xfa/fxbarcode/cbc_onecode.cpp", + "xfa/fxbarcode/cbc_onecode.h", + "xfa/fxbarcode/cbc_pdf417i.cpp", + "xfa/fxbarcode/cbc_pdf417i.h", + "xfa/fxbarcode/cbc_qrcode.cpp", + "xfa/fxbarcode/cbc_qrcode.h", + "xfa/fxbarcode/cbc_upca.cpp", + "xfa/fxbarcode/cbc_upca.h", + "xfa/fxbarcode/common/BC_CommonBitArray.cpp", + "xfa/fxbarcode/common/BC_CommonBitArray.h", + "xfa/fxbarcode/common/BC_CommonBitMatrix.cpp", + "xfa/fxbarcode/common/BC_CommonBitMatrix.h", + "xfa/fxbarcode/common/BC_CommonByteArray.cpp", + "xfa/fxbarcode/common/BC_CommonByteArray.h", + "xfa/fxbarcode/common/BC_CommonByteMatrix.cpp", + "xfa/fxbarcode/common/BC_CommonByteMatrix.h", + "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp", + "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h", + "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp", + "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h", + "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.cpp", + "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256Poly.h", + "xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp", + "xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.h", + "xfa/fxbarcode/datamatrix/BC_Base256Encoder.cpp", + "xfa/fxbarcode/datamatrix/BC_Base256Encoder.h", + "xfa/fxbarcode/datamatrix/BC_C40Encoder.cpp", + "xfa/fxbarcode/datamatrix/BC_C40Encoder.h", + "xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp", + "xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h", + "xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp", + "xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.h", + "xfa/fxbarcode/datamatrix/BC_DefaultPlacement.cpp", + "xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h", + "xfa/fxbarcode/datamatrix/BC_EdifactEncoder.cpp", + "xfa/fxbarcode/datamatrix/BC_EdifactEncoder.h", + "xfa/fxbarcode/datamatrix/BC_Encoder.cpp", + "xfa/fxbarcode/datamatrix/BC_Encoder.h", + "xfa/fxbarcode/datamatrix/BC_EncoderContext.cpp", + "xfa/fxbarcode/datamatrix/BC_EncoderContext.h", + "xfa/fxbarcode/datamatrix/BC_ErrorCorrection.cpp", + "xfa/fxbarcode/datamatrix/BC_ErrorCorrection.h", + "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp", + "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h", + "xfa/fxbarcode/datamatrix/BC_SymbolInfo.cpp", + "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h", + "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.cpp", + "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h", + "xfa/fxbarcode/datamatrix/BC_TextEncoder.cpp", + "xfa/fxbarcode/datamatrix/BC_TextEncoder.h", + "xfa/fxbarcode/datamatrix/BC_X12Encoder.cpp", + "xfa/fxbarcode/datamatrix/BC_X12Encoder.h", + "xfa/fxbarcode/oned/BC_OneDimWriter.cpp", + "xfa/fxbarcode/oned/BC_OneDimWriter.h", + "xfa/fxbarcode/oned/BC_OnedCodaBarWriter.cpp", + "xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h", + "xfa/fxbarcode/oned/BC_OnedCode128Writer.cpp", + "xfa/fxbarcode/oned/BC_OnedCode128Writer.h", + "xfa/fxbarcode/oned/BC_OnedCode39Writer.cpp", + "xfa/fxbarcode/oned/BC_OnedCode39Writer.h", + "xfa/fxbarcode/oned/BC_OnedEAN13Writer.cpp", + "xfa/fxbarcode/oned/BC_OnedEAN13Writer.h", + "xfa/fxbarcode/oned/BC_OnedEAN8Writer.cpp", + "xfa/fxbarcode/oned/BC_OnedEAN8Writer.h", + "xfa/fxbarcode/oned/BC_OnedUPCAWriter.cpp", + "xfa/fxbarcode/oned/BC_OnedUPCAWriter.h", + "xfa/fxbarcode/pdf417/BC_PDF417.cpp", + "xfa/fxbarcode/pdf417/BC_PDF417.h", + "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.cpp", + "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h", + "xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp", + "xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h", + "xfa/fxbarcode/pdf417/BC_PDF417Compaction.cpp", + "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h", + "xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp", + "xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.h", + "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp", + "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h", + "xfa/fxbarcode/pdf417/BC_PDF417Writer.cpp", + "xfa/fxbarcode/pdf417/BC_PDF417Writer.h", + "xfa/fxbarcode/qrcode/BC_QRCodeWriter.cpp", + "xfa/fxbarcode/qrcode/BC_QRCodeWriter.h", + "xfa/fxbarcode/qrcode/BC_QRCoder.cpp", + "xfa/fxbarcode/qrcode/BC_QRCoder.h", + "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.cpp", + "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h", + "xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.cpp", + "xfa/fxbarcode/qrcode/BC_QRCoderBlockPair.h", + "xfa/fxbarcode/qrcode/BC_QRCoderECB.cpp", + "xfa/fxbarcode/qrcode/BC_QRCoderECB.h", + "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.cpp", + "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h", + "xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp", + "xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h", + "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.cpp", + "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h", + "xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.cpp", + "xfa/fxbarcode/qrcode/BC_QRCoderMaskUtil.h", + "xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.cpp", + "xfa/fxbarcode/qrcode/BC_QRCoderMatrixUtil.h", + "xfa/fxbarcode/qrcode/BC_QRCoderMode.cpp", + "xfa/fxbarcode/qrcode/BC_QRCoderMode.h", + "xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp", + "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h", + "xfa/fxbarcode/utils.h", + "xfa/fxfa/app/cxfa_csstagprovider.cpp", + "xfa/fxfa/app/cxfa_csstagprovider.h", + "xfa/fxfa/app/cxfa_eventparam.cpp", + "xfa/fxfa/app/cxfa_linkuserdata.cpp", + "xfa/fxfa/app/cxfa_linkuserdata.h", + "xfa/fxfa/app/cxfa_loadercontext.cpp", + "xfa/fxfa/app/cxfa_loadercontext.h", + "xfa/fxfa/app/cxfa_pieceline.cpp", + "xfa/fxfa/app/cxfa_pieceline.h", + "xfa/fxfa/app/cxfa_textlayout.cpp", + "xfa/fxfa/app/cxfa_textlayout.h", + "xfa/fxfa/app/cxfa_textparsecontext.cpp", + "xfa/fxfa/app/cxfa_textparsecontext.h", + "xfa/fxfa/app/cxfa_textparser.cpp", + "xfa/fxfa/app/cxfa_textparser.h", + "xfa/fxfa/app/cxfa_texttabstopscontext.cpp", + "xfa/fxfa/app/cxfa_texttabstopscontext.h", + "xfa/fxfa/app/cxfa_textuserdata.cpp", + "xfa/fxfa/app/cxfa_textuserdata.h", + "xfa/fxfa/app/xfa_checksum.cpp", + "xfa/fxfa/app/xfa_ffapp.cpp", + "xfa/fxfa/app/xfa_ffbarcode.cpp", + "xfa/fxfa/app/xfa_ffbarcode.h", + "xfa/fxfa/app/xfa_ffcheckbutton.cpp", + "xfa/fxfa/app/xfa_ffcheckbutton.h", + "xfa/fxfa/app/xfa_ffchoicelist.cpp", + "xfa/fxfa/app/xfa_ffchoicelist.h", + "xfa/fxfa/app/xfa_ffdoc.cpp", + "xfa/fxfa/app/xfa_ffdochandler.cpp", + "xfa/fxfa/app/xfa_ffdocview.cpp", + "xfa/fxfa/app/xfa_ffdraw.cpp", + "xfa/fxfa/app/xfa_ffdraw.h", + "xfa/fxfa/app/xfa_ffexclgroup.cpp", + "xfa/fxfa/app/xfa_ffexclgroup.h", + "xfa/fxfa/app/xfa_fffield.cpp", + "xfa/fxfa/app/xfa_fffield.h", + "xfa/fxfa/app/xfa_ffimage.cpp", + "xfa/fxfa/app/xfa_ffimage.h", + "xfa/fxfa/app/xfa_ffimageedit.cpp", + "xfa/fxfa/app/xfa_ffimageedit.h", + "xfa/fxfa/app/xfa_ffnotify.cpp", + "xfa/fxfa/app/xfa_ffnotify.h", + "xfa/fxfa/app/xfa_ffpageview.cpp", + "xfa/fxfa/app/xfa_ffpath.cpp", + "xfa/fxfa/app/xfa_ffpath.h", + "xfa/fxfa/app/xfa_ffpushbutton.cpp", + "xfa/fxfa/app/xfa_ffpushbutton.h", + "xfa/fxfa/app/xfa_ffsignature.cpp", + "xfa/fxfa/app/xfa_ffsignature.h", + "xfa/fxfa/app/xfa_ffsubform.cpp", + "xfa/fxfa/app/xfa_ffsubform.h", + "xfa/fxfa/app/xfa_fftext.cpp", + "xfa/fxfa/app/xfa_fftext.h", + "xfa/fxfa/app/xfa_fftextedit.cpp", + "xfa/fxfa/app/xfa_fftextedit.h", + "xfa/fxfa/app/xfa_ffwidget.cpp", + "xfa/fxfa/app/xfa_ffwidgetacc.cpp", + "xfa/fxfa/app/xfa_ffwidgetacc.h", + "xfa/fxfa/app/xfa_ffwidgethandler.cpp", + "xfa/fxfa/app/xfa_fontmgr.cpp", + "xfa/fxfa/app/xfa_fwladapter.cpp", + "xfa/fxfa/app/xfa_fwladapter.h", + "xfa/fxfa/app/xfa_fwltheme.cpp", + "xfa/fxfa/app/xfa_fwltheme.h", + "xfa/fxfa/app/xfa_rendercontext.cpp", + "xfa/fxfa/app/xfa_textpiece.cpp", + "xfa/fxfa/app/xfa_textpiece.h", + "xfa/fxfa/cxfa_eventparam.h", + "xfa/fxfa/fm2js/xfa_error.cpp", + "xfa/fxfa/fm2js/xfa_error.h", + "xfa/fxfa/fm2js/xfa_expression.cpp", + "xfa/fxfa/fm2js/xfa_expression.h", + "xfa/fxfa/fm2js/xfa_fm2jscontext.cpp", + "xfa/fxfa/fm2js/xfa_fm2jscontext.h", + "xfa/fxfa/fm2js/xfa_fmparse.cpp", + "xfa/fxfa/fm2js/xfa_fmparse.h", + "xfa/fxfa/fm2js/xfa_lexer.cpp", + "xfa/fxfa/fm2js/xfa_lexer.h", + "xfa/fxfa/fm2js/xfa_program.cpp", + "xfa/fxfa/fm2js/xfa_program.h", + "xfa/fxfa/fm2js/xfa_simpleexpression.cpp", + "xfa/fxfa/fm2js/xfa_simpleexpression.h", + "xfa/fxfa/fxfa.h", + "xfa/fxfa/fxfa_basic.h", + "xfa/fxfa/fxfa_widget.h", + "xfa/fxfa/parser/cscript_datawindow.cpp", + "xfa/fxfa/parser/cscript_datawindow.h", + "xfa/fxfa/parser/cscript_eventpseudomodel.cpp", + "xfa/fxfa/parser/cscript_eventpseudomodel.h", + "xfa/fxfa/parser/cscript_hostpseudomodel.cpp", + "xfa/fxfa/parser/cscript_hostpseudomodel.h", + "xfa/fxfa/parser/cscript_layoutpseudomodel.cpp", + "xfa/fxfa/parser/cscript_layoutpseudomodel.h", + "xfa/fxfa/parser/cscript_logpseudomodel.cpp", + "xfa/fxfa/parser/cscript_logpseudomodel.h", + "xfa/fxfa/parser/cscript_signaturepseudomodel.cpp", + "xfa/fxfa/parser/cscript_signaturepseudomodel.h", + "xfa/fxfa/parser/cxfa_arc.h", + "xfa/fxfa/parser/cxfa_arraynodelist.cpp", + "xfa/fxfa/parser/cxfa_assist.cpp", + "xfa/fxfa/parser/cxfa_assist.h", + "xfa/fxfa/parser/cxfa_attachnodelist.cpp", + "xfa/fxfa/parser/cxfa_bind.cpp", + "xfa/fxfa/parser/cxfa_bind.h", + "xfa/fxfa/parser/cxfa_binditems.cpp", + "xfa/fxfa/parser/cxfa_binditems.h", + "xfa/fxfa/parser/cxfa_border.h", + "xfa/fxfa/parser/cxfa_box.cpp", + "xfa/fxfa/parser/cxfa_box.h", + "xfa/fxfa/parser/cxfa_calculate.cpp", + "xfa/fxfa/parser/cxfa_calculate.h", + "xfa/fxfa/parser/cxfa_caption.cpp", + "xfa/fxfa/parser/cxfa_caption.h", + "xfa/fxfa/parser/cxfa_containerlayoutitem.cpp", + "xfa/fxfa/parser/cxfa_containerlayoutitem.h", + "xfa/fxfa/parser/cxfa_contentlayoutitem.cpp", + "xfa/fxfa/parser/cxfa_contentlayoutitem.h", + "xfa/fxfa/parser/cxfa_corner.h", + "xfa/fxfa/parser/cxfa_data.cpp", + "xfa/fxfa/parser/cxfa_data.h", + "xfa/fxfa/parser/cxfa_dataexporter.cpp", + "xfa/fxfa/parser/cxfa_dataexporter.h", + "xfa/fxfa/parser/cxfa_dataimporter.cpp", + "xfa/fxfa/parser/cxfa_dataimporter.h", + "xfa/fxfa/parser/cxfa_document.cpp", + "xfa/fxfa/parser/cxfa_document.h", + "xfa/fxfa/parser/cxfa_document_parser.cpp", + "xfa/fxfa/parser/cxfa_document_parser.h", + "xfa/fxfa/parser/cxfa_edge.h", + "xfa/fxfa/parser/cxfa_event.cpp", + "xfa/fxfa/parser/cxfa_event.h", + "xfa/fxfa/parser/cxfa_exdata.cpp", + "xfa/fxfa/parser/cxfa_exdata.h", + "xfa/fxfa/parser/cxfa_fill.cpp", + "xfa/fxfa/parser/cxfa_fill.h", + "xfa/fxfa/parser/cxfa_font.cpp", + "xfa/fxfa/parser/cxfa_font.h", + "xfa/fxfa/parser/cxfa_image.cpp", + "xfa/fxfa/parser/cxfa_image.h", + "xfa/fxfa/parser/cxfa_layoutitem.cpp", + "xfa/fxfa/parser/cxfa_layoutitem.h", + "xfa/fxfa/parser/cxfa_layoutpagemgr.cpp", + "xfa/fxfa/parser/cxfa_layoutpagemgr.h", + "xfa/fxfa/parser/cxfa_layoutprocessor.cpp", + "xfa/fxfa/parser/cxfa_layoutprocessor.h", + "xfa/fxfa/parser/cxfa_line.cpp", + "xfa/fxfa/parser/cxfa_line.h", + "xfa/fxfa/parser/cxfa_margin.cpp", + "xfa/fxfa/parser/cxfa_margin.h", + "xfa/fxfa/parser/cxfa_measurement.cpp", + "xfa/fxfa/parser/cxfa_measurement.h", + "xfa/fxfa/parser/cxfa_node.cpp", + "xfa/fxfa/parser/cxfa_nodehelper.cpp", + "xfa/fxfa/parser/cxfa_nodehelper.h", + "xfa/fxfa/parser/cxfa_nodelist.cpp", + "xfa/fxfa/parser/cxfa_object.cpp", + "xfa/fxfa/parser/cxfa_occur.cpp", + "xfa/fxfa/parser/cxfa_occur.h", + "xfa/fxfa/parser/cxfa_para.cpp", + "xfa/fxfa/parser/cxfa_para.h", + "xfa/fxfa/parser/cxfa_rectangle.h", + "xfa/fxfa/parser/cxfa_resolveprocessor.cpp", + "xfa/fxfa/parser/cxfa_resolveprocessor.h", + "xfa/fxfa/parser/cxfa_script.cpp", + "xfa/fxfa/parser/cxfa_script.h", + "xfa/fxfa/parser/cxfa_scriptcontext.cpp", + "xfa/fxfa/parser/cxfa_scriptcontext.h", + "xfa/fxfa/parser/cxfa_simple_parser.cpp", + "xfa/fxfa/parser/cxfa_simple_parser.h", + "xfa/fxfa/parser/cxfa_stroke.cpp", + "xfa/fxfa/parser/cxfa_stroke.h", + "xfa/fxfa/parser/cxfa_submit.cpp", + "xfa/fxfa/parser/cxfa_submit.h", + "xfa/fxfa/parser/cxfa_text.cpp", + "xfa/fxfa/parser/cxfa_text.h", + "xfa/fxfa/parser/cxfa_thisproxy.cpp", + "xfa/fxfa/parser/cxfa_tooltip.cpp", + "xfa/fxfa/parser/cxfa_tooltip.h", + "xfa/fxfa/parser/cxfa_traversestrategy_contentareacontainerlayoutitem.h", + "xfa/fxfa/parser/cxfa_traversestrategy_contentlayoutitem.h", + "xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h", + "xfa/fxfa/parser/cxfa_validate.cpp", + "xfa/fxfa/parser/cxfa_validate.h", + "xfa/fxfa/parser/cxfa_value.cpp", + "xfa/fxfa/parser/cxfa_value.h", + "xfa/fxfa/parser/cxfa_valuearray.cpp", + "xfa/fxfa/parser/cxfa_valuearray.h", + "xfa/fxfa/parser/cxfa_widetextread.cpp", + "xfa/fxfa/parser/cxfa_widetextread.h", + "xfa/fxfa/parser/cxfa_widgetdata.cpp", + "xfa/fxfa/parser/cxfa_widgetdata.h", + "xfa/fxfa/parser/cxfa_xml_parser.cpp", + "xfa/fxfa/parser/cxfa_xml_parser.h", + "xfa/fxfa/parser/xfa_basic_data.cpp", + "xfa/fxfa/parser/xfa_basic_data.h", + "xfa/fxfa/parser/xfa_basic_data_attributes.cpp", + "xfa/fxfa/parser/xfa_basic_data_element_attributes.cpp", + "xfa/fxfa/parser/xfa_basic_data_element_properties.cpp", + "xfa/fxfa/parser/xfa_basic_data_element_script.cpp", + "xfa/fxfa/parser/xfa_basic_data_enum.cpp", + "xfa/fxfa/parser/xfa_basic_data_packets.cpp", + "xfa/fxfa/parser/xfa_document_datamerger_imp.cpp", + "xfa/fxfa/parser/xfa_document_datamerger_imp.h", + "xfa/fxfa/parser/xfa_layout_itemlayout.cpp", + "xfa/fxfa/parser/xfa_layout_itemlayout.h", + "xfa/fxfa/parser/xfa_locale.cpp", + "xfa/fxfa/parser/xfa_locale.h", + "xfa/fxfa/parser/xfa_localemgr.cpp", + "xfa/fxfa/parser/xfa_localemgr.h", + "xfa/fxfa/parser/xfa_localevalue.cpp", + "xfa/fxfa/parser/xfa_localevalue.h", + "xfa/fxfa/parser/xfa_object.h", + "xfa/fxfa/parser/xfa_resolvenode_rs.h", + "xfa/fxfa/parser/xfa_utils.cpp", + "xfa/fxfa/parser/xfa_utils.h", + "xfa/fxfa/xfa_checksum.h", + "xfa/fxfa/xfa_ffapp.h", + "xfa/fxfa/xfa_ffdoc.h", + "xfa/fxfa/xfa_ffdochandler.h", + "xfa/fxfa/xfa_ffdocview.h", + "xfa/fxfa/xfa_ffpageview.h", + "xfa/fxfa/xfa_ffwidget.h", + "xfa/fxfa/xfa_ffwidgethandler.h", + "xfa/fxfa/xfa_fontmgr.h", + "xfa/fxfa/xfa_rendercontext.h", + "xfa/fxgraphics/cfx_color.cpp", + "xfa/fxgraphics/cfx_color.h", + "xfa/fxgraphics/cfx_graphics.cpp", + "xfa/fxgraphics/cfx_graphics.h", + "xfa/fxgraphics/cfx_path.cpp", + "xfa/fxgraphics/cfx_path.h", + "xfa/fxgraphics/cfx_pattern.cpp", + "xfa/fxgraphics/cfx_pattern.h", + "xfa/fxgraphics/cfx_shading.cpp", + "xfa/fxgraphics/cfx_shading.h", + ] + include_dirs = [ "." ] + deps = [ + ":fxcrt", + ":fxjs", + ] + configs += [ + ":pdfium_core_config", + ":xfa_warnings", + ] + } +} + +test("pdfium_unittests") { + sources = [ + "core/fdrm/crypto/fx_crypt_unittest.cpp", + "core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp", + "core/fpdfapi/font/fpdf_font_cid_unittest.cpp", + "core/fpdfapi/font/fpdf_font_unittest.cpp", + "core/fpdfapi/page/cpdf_streamcontentparser_unittest.cpp", + "core/fpdfapi/page/cpdf_streamparser_unittest.cpp", + "core/fpdfapi/parser/cpdf_array_unittest.cpp", + "core/fpdfapi/parser/cpdf_document_unittest.cpp", + "core/fpdfapi/parser/cpdf_object_unittest.cpp", + "core/fpdfapi/parser/cpdf_parser_unittest.cpp", + "core/fpdfapi/parser/cpdf_simple_parser_unittest.cpp", + "core/fpdfapi/parser/cpdf_syntax_parser_unittest.cpp", + "core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp", + "core/fpdfdoc/cpdf_dest_unittest.cpp", + "core/fpdfdoc/cpdf_filespec_unittest.cpp", + "core/fpdfdoc/cpdf_formfield_unittest.cpp", + "core/fpdftext/fpdf_text_int_unittest.cpp", + "core/fxcodec/codec/fx_codec_a85_unittest.cpp", + "core/fxcodec/codec/fx_codec_jpx_unittest.cpp", + "core/fxcodec/codec/fx_codec_rle_unittest.cpp", + "core/fxcodec/jbig2/JBig2_Image_unittest.cpp", + "core/fxcrt/cfx_maybe_owned_unittest.cpp", + "core/fxcrt/cfx_observable_unittest.cpp", + "core/fxcrt/cfx_retain_ptr_unittest.cpp", + "core/fxcrt/cfx_shared_copy_on_write_unittest.cpp", + "core/fxcrt/cfx_string_pool_template_unittest.cpp", + "core/fxcrt/cfx_weak_ptr_unittest.cpp", + "core/fxcrt/fx_basic_bstring_unittest.cpp", + "core/fxcrt/fx_basic_gcc_unittest.cpp", + "core/fxcrt/fx_basic_memmgr_unittest.cpp", + "core/fxcrt/fx_basic_util_unittest.cpp", + "core/fxcrt/fx_basic_wstring_unittest.cpp", + "core/fxcrt/fx_bidi_unittest.cpp", + "core/fxcrt/fx_extension_unittest.cpp", + "core/fxcrt/fx_system_unittest.cpp", + "core/fxge/dib/fx_dib_engine_unittest.cpp", + "fpdfsdk/fpdfdoc_unittest.cpp", + "fpdfsdk/fpdfeditimg_unittest.cpp", + "fpdfsdk/fpdfview_unittest.cpp", + ] + deps = [ + ":pdfium", + ":test_support", + "//testing/gtest", + "//testing/gtest:gtest_main", + ] + include_dirs = [] + if (pdf_enable_xfa) { + sources += [ + "xfa/fde/cfde_txtedtbuf_unittest.cpp", + "xfa/fde/css/cfde_cssdeclaration_unittest.cpp", + "xfa/fde/css/cfde_cssstylesheet_unittest.cpp", + "xfa/fde/css/cfde_cssvaluelistparser_unittest.cpp", + "xfa/fde/xml/fde_xml_imp_unittest.cpp", + "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder_unittest.cpp", + "xfa/fxfa/app/cxfa_textparser_unittest.cpp", + "xfa/fxfa/app/xfa_ffapp_unittest.cpp", + "xfa/fxfa/fm2js/xfa_simpleexpression_unittest.cpp", + "xfa/fxfa/parser/xfa_utils_unittest.cpp", + ] + } + if (pdf_use_skia || pdf_use_skia_paths) { + sources += [ "core/fxge/skia/fx_skia_device_unittest.cpp" ] + deps += [ "//skia" ] + } + if (pdf_enable_v8) { + sources += [ "fpdfsdk/javascript/public_methods_unittest.cpp" ] + include_dirs += [ + "//v8", + "//v8/include", + ] + } + configs += [ ":pdfium_core_config" ] + if (is_android) { + use_raw_android_executable = true + } +} + +test("pdfium_embeddertests") { + sources = [ + "core/fpdfapi/page/fpdf_page_func_embeddertest.cpp", + "core/fpdfapi/parser/cpdf_parser_embeddertest.cpp", + "core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp", + "core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp", + "core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp", + "core/fpdfapi/render/fpdf_render_pattern_embeddertest.cpp", + "core/fxcodec/codec/fx_codec_embeddertest.cpp", + "core/fxge/ge/fx_ge_text_embeddertest.cpp", + "fpdfsdk/fpdf_dataavail_embeddertest.cpp", + "fpdfsdk/fpdf_flatten_embeddertest.cpp", + "fpdfsdk/fpdf_structtree_embeddertest.cpp", + "fpdfsdk/fpdfdoc_embeddertest.cpp", + "fpdfsdk/fpdfedit_embeddertest.cpp", + "fpdfsdk/fpdfext_embeddertest.cpp", + "fpdfsdk/fpdfformfill_embeddertest.cpp", + "fpdfsdk/fpdfppo_embeddertest.cpp", + "fpdfsdk/fpdfsave_embeddertest.cpp", + "fpdfsdk/fpdftext_embeddertest.cpp", + "fpdfsdk/fpdfview_c_api_test.c", + "fpdfsdk/fpdfview_c_api_test.h", + "fpdfsdk/fpdfview_embeddertest.cpp", + "fpdfsdk/fsdk_baseform_embeddertest.cpp", + "testing/embedder_test.cpp", + "testing/embedder_test.h", + "testing/embedder_test_mock_delegate.h", + "testing/embedder_test_timer_handling_delegate.h", + "xfa/fxfa/parser/cxfa_simple_parser_embeddertest.cpp", + ] + deps = [ + ":pdfium", + ":test_support", + "//testing/gmock", + "//testing/gtest", + ] + include_dirs = [ "testing/gmock/include" ] + configs += [ ":pdfium_core_config" ] + + if (pdf_enable_v8) { + sources += [ + "fpdfsdk/javascript/public_methods_embeddertest.cpp", + "fxjs/fxjs_v8_embeddertest.cpp", + "testing/js_embedder_test.cpp", + "testing/js_embedder_test.h", + ] + deps += [ ":fxjs" ] + configs += [ "//v8:external_startup_data" ] + } + if (is_android) { + ignore_all_data_deps = true + use_raw_android_executable = true + } +} + +if (pdf_is_standalone) { + source_set("samples") { + testonly = true + deps = [ + "//samples", + ] + } + group("fuzzers") { + testonly = true + deps = [ + "//testing/libfuzzer", + ] + } +} diff --git a/modules/pdfium/pdfium/DEPS b/modules/pdfium/pdfium/DEPS new file mode 100644 index 000000000000..7ebf412cdb61 --- /dev/null +++ b/modules/pdfium/pdfium/DEPS @@ -0,0 +1,201 @@ +use_relative_paths = True + +vars = { + 'chromium_git': 'https://chromium.googlesource.com', + 'pdfium_git': 'https://pdfium.googlesource.com', + + 'android_ndk_revision': '26d93ec07f3ce2ec2cdfeae1b21ee6f12ff868d8', + 'build_revision': 'dd795a26b9e43ff3a0d761bfd509c2fa67a3a7a1', + 'buildtools_revision': 'cf493f8b1ae59611b19b000d7af922559b6ae92a', + 'catapult_revision': '86352b966b0245d6883e5f7df27687856978b6d7', + 'clang_revision': '37d701b87a10a2bdee1a5c3523f754ebf64a7e66', + 'cygwin_revision': 'c89e446b273697fadf3a10ff1007a97c0b7de6df', + 'gen_library_loader_revision': '916d4acd8b2cde67a390737dfba90b3c37de23a1', + 'gmock_revision': '29763965ab52f24565299976b936d1265cb6a271', + 'gtest_revision': '8245545b6dc9c4703e6496d1efd19e975ad2b038', + 'icu_revision': '73e24736676b4b438270fda44e5b2c83b49fdd80', + 'instrumented_lib_revision': '45f5814b1543e41ea0be54c771e3840ea52cca4a', + 'pdfium_tests_revision': 'd25a422ab03d6c3109370bc454c629575e969329', + 'skia_revision': '90e3cd78991ef337dbd0023efb30ece864694308', + 'tools_memory_revision': '427f10475e1a8d72424c29d00bf689122b738e5d', + 'trace_event_revision': '06294c8a4a6f744ef284cd63cfe54dbf61eea290', + 'v8_revision': '7a634798302b4ab1f1525a9a881629519c0c2a99', +} + +deps = { + "base/trace_event/common": + Var('chromium_git') + "/chromium/src/base/trace_event/common.git@" + + Var('trace_event_revision'), + + "build": + Var('chromium_git') + "/chromium/src/build.git@" + Var('build_revision'), + + "buildtools": + Var('chromium_git') + "/chromium/buildtools.git@" + Var('buildtools_revision'), + + "testing/corpus": + Var('pdfium_git') + "/pdfium_tests@" + Var('pdfium_tests_revision'), + + "testing/gmock": + Var('chromium_git') + "/external/googlemock.git@" + Var('gmock_revision'), + + "testing/gtest": + Var('chromium_git') + "/external/googletest.git@" + Var('gtest_revision'), + + "third_party/icu": + Var('chromium_git') + "/chromium/deps/icu.git@" + Var('icu_revision'), + + "third_party/instrumented_libraries": + Var('chromium_git') + "/chromium/src/third_party/instrumented_libraries.git@" + Var('instrumented_lib_revision'), + + "third_party/skia": + Var('chromium_git') + '/skia.git' + '@' + Var('skia_revision'), + + "tools/clang": + Var('chromium_git') + "/chromium/src/tools/clang@" + Var('clang_revision'), + + "tools/generate_library_loader": + Var('chromium_git') + "/chromium/src/tools/generate_library_loader@" + + Var('gen_library_loader_revision'), + + # TODO(GYP): Remove this when no tools rely on GYP anymore. + "tools/gyp": + Var('chromium_git') + '/external/gyp.git' + '@' + 'c61b0b35c8396bfd59efc6cfc11401d912b0f510', + + "tools/memory": + Var('chromium_git') + "/chromium/src/tools/memory@" + + Var('tools_memory_revision'), + + "v8": + Var('chromium_git') + "/v8/v8.git@" + Var('v8_revision'), +} + +deps_os = { + "android": { + "third_party/android_ndk": + Var('chromium_git') + "/android_ndk.git@" + Var('android_ndk_revision'), + "third_party/catapult": + Var('chromium_git') + "/external/github.com/catapult-project/catapult.git@" + Var('catapult_revision'), + }, + "win": { + "v8/third_party/cygwin": + Var('chromium_git') + "/chromium/deps/cygwin@" + Var('cygwin_revision'), + }, +} + +recursedeps = [ + # buildtools provides clang_format, libc++, and libc++abi + 'buildtools', +] + +include_rules = [ + # Basic stuff that everyone can use. + # Note: public is not here because core cannot depend on public. + '+testing', + '+third_party/base', +] + +specific_include_rules = { + # Allow embedder tests to use public APIs. + "(.*embeddertest\.cpp)": [ + "+public", + ] +} + +hooks = [ + # Pull GN binaries. This needs to be before running GYP below. + { + 'name': 'gn_win', + 'action': [ 'download_from_google_storage', + '--no_resume', + '--platform=win32', + '--no_auth', + '--bucket', 'chromium-gn', + '-s', 'pdfium/buildtools/win/gn.exe.sha1', + ], + }, + { + 'name': 'gn_mac', + 'pattern': '.', + 'action': [ 'download_from_google_storage', + '--no_resume', + '--platform=darwin', + '--no_auth', + '--bucket', 'chromium-gn', + '-s', 'pdfium/buildtools/mac/gn.sha1', + ], + }, + { + 'name': 'gn_linux64', + 'pattern': '.', + 'action': [ 'download_from_google_storage', + '--no_resume', + '--platform=linux*', + '--no_auth', + '--bucket', 'chromium-gn', + '-s', 'pdfium/buildtools/linux64/gn.sha1', + ], + }, + # Pull clang-format binaries using checked-in hashes. + { + 'name': 'clang_format_win', + 'pattern': '.', + 'action': [ 'download_from_google_storage', + '--no_resume', + '--platform=win32', + '--no_auth', + '--bucket', 'chromium-clang-format', + '-s', 'pdfium/buildtools/win/clang-format.exe.sha1', + ], + }, + { + 'name': 'clang_format_mac', + 'pattern': '.', + 'action': [ 'download_from_google_storage', + '--no_resume', + '--platform=darwin', + '--no_auth', + '--bucket', 'chromium-clang-format', + '-s', 'pdfium/buildtools/mac/clang-format.sha1', + ], + }, + { + 'name': 'clang_format_linux', + 'pattern': '.', + 'action': [ 'download_from_google_storage', + '--no_resume', + '--platform=linux*', + '--no_auth', + '--bucket', 'chromium-clang-format', + '-s', 'pdfium/buildtools/linux64/clang-format.sha1', + ], + }, + { + # Pull clang + 'name': 'clang', + 'pattern': '.', + 'action': ['python', + 'pdfium/tools/clang/scripts/update.py' + ], + }, + { + # Update the Windows toolchain if necessary. + 'name': 'win_toolchain', + 'pattern': '.', + 'action': ['python', 'pdfium/build/vs_toolchain.py', 'update'], + }, + { + # Update the Mac toolchain if necessary. + 'name': 'mac_toolchain', + 'pattern': '.', + 'action': ['python', 'pdfium/build/mac_toolchain.py'], + }, + { + # Pull sanitizer-instrumented third-party libraries if requested via + # GYP_DEFINES. + 'name': 'instrumented_libraries', + 'pattern': '\\.sha1', + 'action': ['python', 'pdfium/third_party/instrumented_libraries/scripts/download_binaries.py'], + }, + +] diff --git a/modules/pdfium/pdfium/LICENSE b/modules/pdfium/pdfium/LICENSE new file mode 100644 index 000000000000..8b4ed6dddf22 --- /dev/null +++ b/modules/pdfium/pdfium/LICENSE @@ -0,0 +1,27 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/modules/pdfium/pdfium/OWNERS b/modules/pdfium/pdfium/OWNERS new file mode 100644 index 000000000000..37876c5ec8e3 --- /dev/null +++ b/modules/pdfium/pdfium/OWNERS @@ -0,0 +1,13 @@ +brucedawson@chromium.org +dsinclair@chromium.org +jam@chromium.org +npm@chromium.org +thestig@chromium.org +tsepez@chromium.org +weili@chromium.org + +# For V8 related changes +jochen@chromium.org + +# For Skia related changes +caryclark@google.com diff --git a/modules/pdfium/pdfium/PRESUBMIT.py b/modules/pdfium/pdfium/PRESUBMIT.py new file mode 100644 index 000000000000..db1bf00eb3c6 --- /dev/null +++ b/modules/pdfium/pdfium/PRESUBMIT.py @@ -0,0 +1,261 @@ +# Copyright 2015 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Presubmit script for pdfium. + +See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts +for more details about the presubmit API built into depot_tools. +""" + +LINT_FILTERS = [ + # Rvalue ref checks are unreliable. + '-build/c++11', + # Need to fix header names not matching cpp names. + '-build/include_order', + # Too many to fix at the moment. + '-readability/casting', + # Need to refactor large methods to fix. + '-readability/fn_size', + # Lots of usage to fix first. + '-runtime/int', + # Lots of non-const references need to be fixed + '-runtime/references', + # We are not thread safe, so this will never pass. + '-runtime/threadsafe_fn', + # Figure out how to deal with #defines that git cl format creates. + '-whitespace/indent', +] + + +_INCLUDE_ORDER_WARNING = ( + 'Your #include order seems to be broken. Remember to use the right ' + 'collation (LC_COLLATE=C) and check\nhttps://google.github.io/styleguide/' + 'cppguide.html#Names_and_Order_of_Includes') + + +def _CheckUnwantedDependencies(input_api, output_api): + """Runs checkdeps on #include statements added in this + change. Breaking - rules is an error, breaking ! rules is a + warning. + """ + import sys + # We need to wait until we have an input_api object and use this + # roundabout construct to import checkdeps because this file is + # eval-ed and thus doesn't have __file__. + original_sys_path = sys.path + try: + sys.path = sys.path + [input_api.os_path.join( + input_api.PresubmitLocalPath(), 'buildtools', 'checkdeps')] + import checkdeps + from cpp_checker import CppChecker + from rules import Rule + except ImportError: + return [output_api.PresubmitError( + 'Unable to run checkdeps, does pdfium/buildtools/checkdeps exist?')] + finally: + # Restore sys.path to what it was before. + sys.path = original_sys_path + + added_includes = [] + for f in input_api.AffectedFiles(): + if not CppChecker.IsCppFile(f.LocalPath()): + continue + + changed_lines = [line for line_num, line in f.ChangedContents()] + added_includes.append([f.LocalPath(), changed_lines]) + + deps_checker = checkdeps.DepsChecker(input_api.PresubmitLocalPath()) + + error_descriptions = [] + warning_descriptions = [] + for path, rule_type, rule_description in deps_checker.CheckAddedCppIncludes( + added_includes): + description_with_path = '%s\n %s' % (path, rule_description) + if rule_type == Rule.DISALLOW: + error_descriptions.append(description_with_path) + else: + warning_descriptions.append(description_with_path) + + results = [] + if error_descriptions: + results.append(output_api.PresubmitError( + 'You added one or more #includes that violate checkdeps rules.', + error_descriptions)) + if warning_descriptions: + results.append(output_api.PresubmitPromptOrNotify( + 'You added one or more #includes of files that are temporarily\n' + 'allowed but being removed. Can you avoid introducing the\n' + '#include? See relevant DEPS file(s) for details and contacts.', + warning_descriptions)) + return results + + +def _CheckIncludeOrderForScope(scope, input_api, file_path, changed_linenums): + """Checks that the lines in scope occur in the right order. + + 1. C system files in alphabetical order + 2. C++ system files in alphabetical order + 3. Project's .h files + """ + + c_system_include_pattern = input_api.re.compile(r'\s*#include <.*\.h>') + cpp_system_include_pattern = input_api.re.compile(r'\s*#include <.*>') + custom_include_pattern = input_api.re.compile(r'\s*#include ".*') + + C_SYSTEM_INCLUDES, CPP_SYSTEM_INCLUDES, CUSTOM_INCLUDES = range(3) + + state = C_SYSTEM_INCLUDES + + previous_line = '' + previous_line_num = 0 + problem_linenums = [] + out_of_order = " - line belongs before previous line" + for line_num, line in scope: + if c_system_include_pattern.match(line): + if state != C_SYSTEM_INCLUDES: + problem_linenums.append((line_num, previous_line_num, + " - C system include file in wrong block")) + elif previous_line and previous_line > line: + problem_linenums.append((line_num, previous_line_num, + out_of_order)) + elif cpp_system_include_pattern.match(line): + if state == C_SYSTEM_INCLUDES: + state = CPP_SYSTEM_INCLUDES + elif state == CUSTOM_INCLUDES: + problem_linenums.append((line_num, previous_line_num, + " - c++ system include file in wrong block")) + elif previous_line and previous_line > line: + problem_linenums.append((line_num, previous_line_num, out_of_order)) + elif custom_include_pattern.match(line): + if state != CUSTOM_INCLUDES: + state = CUSTOM_INCLUDES + elif previous_line and previous_line > line: + problem_linenums.append((line_num, previous_line_num, out_of_order)) + else: + problem_linenums.append((line_num, previous_line_num, + "Unknown include type")) + previous_line = line + previous_line_num = line_num + + warnings = [] + for (line_num, previous_line_num, failure_type) in problem_linenums: + if line_num in changed_linenums or previous_line_num in changed_linenums: + warnings.append(' %s:%d:%s' % (file_path, line_num, failure_type)) + return warnings + + +def _CheckIncludeOrderInFile(input_api, f, changed_linenums): + """Checks the #include order for the given file f.""" + + system_include_pattern = input_api.re.compile(r'\s*#include \<.*') + # Exclude the following includes from the check: + # 1) #include <.../...>, e.g., includes often need to appear in a + # specific order. + # 2) , "build/build_config.h" + excluded_include_pattern = input_api.re.compile( + r'\s*#include (\<.*/.*|\|"build/build_config.h")') + custom_include_pattern = input_api.re.compile(r'\s*#include "(?P.*)"') + # Match the final or penultimate token if it is xxxtest so we can ignore it + # when considering the special first include. + test_file_tag_pattern = input_api.re.compile( + r'_[a-z]+test(?=(_[a-zA-Z0-9]+)?\.)') + if_pattern = input_api.re.compile( + r'\s*#\s*(if|elif|else|endif|define|undef).*') + # Some files need specialized order of includes; exclude such files from this + # check. + uncheckable_includes_pattern = input_api.re.compile( + r'\s*#include ' + '("ipc/.*macros\.h"||".*gl.*autogen.h")\s*') + + contents = f.NewContents() + warnings = [] + line_num = 0 + + # Handle the special first include. If the first include file is + # some/path/file.h, the corresponding including file can be some/path/file.cc, + # some/other/path/file.cc, some/path/file_platform.cc, some/path/file-suffix.h + # etc. It's also possible that no special first include exists. + # If the included file is some/path/file_platform.h the including file could + # also be some/path/file_xxxtest_platform.h. + including_file_base_name = test_file_tag_pattern.sub( + '', input_api.os_path.basename(f.LocalPath())) + + for line in contents: + line_num += 1 + if system_include_pattern.match(line): + # No special first include -> process the line again along with normal + # includes. + line_num -= 1 + break + match = custom_include_pattern.match(line) + if match: + match_dict = match.groupdict() + header_basename = test_file_tag_pattern.sub( + '', input_api.os_path.basename(match_dict['FILE'])).replace('.h', '') + + if header_basename not in including_file_base_name: + # No special first include -> process the line again along with normal + # includes. + line_num -= 1 + break + + # Split into scopes: Each region between #if and #endif is its own scope. + scopes = [] + current_scope = [] + for line in contents[line_num:]: + line_num += 1 + if uncheckable_includes_pattern.match(line): + continue + if if_pattern.match(line): + scopes.append(current_scope) + current_scope = [] + elif ((system_include_pattern.match(line) or + custom_include_pattern.match(line)) and + not excluded_include_pattern.match(line)): + current_scope.append((line_num, line)) + scopes.append(current_scope) + + for scope in scopes: + warnings.extend(_CheckIncludeOrderForScope(scope, input_api, f.LocalPath(), + changed_linenums)) + return warnings + + +def _CheckIncludeOrder(input_api, output_api): + """Checks that the #include order is correct. + + 1. The corresponding header for source files. + 2. C system files in alphabetical order + 3. C++ system files in alphabetical order + 4. Project's .h files in alphabetical order + + Each region separated by #if, #elif, #else, #endif, #define and #undef follows + these rules separately. + """ + def FileFilterIncludeOrder(affected_file): + black_list = (input_api.DEFAULT_BLACK_LIST) + return input_api.FilterSourceFile(affected_file, black_list=black_list) + + warnings = [] + for f in input_api.AffectedFiles(file_filter=FileFilterIncludeOrder): + if f.LocalPath().endswith(('.cc', '.cpp', '.h', '.mm')): + changed_linenums = set(line_num for line_num, _ in f.ChangedContents()) + warnings.extend(_CheckIncludeOrderInFile(input_api, f, changed_linenums)) + + results = [] + if warnings: + results.append(output_api.PresubmitPromptOrNotify(_INCLUDE_ORDER_WARNING, + warnings)) + return results + + +def CheckChangeOnUpload(input_api, output_api): + results = [] + results += _CheckUnwantedDependencies(input_api, output_api) + results += input_api.canned_checks.CheckPatchFormatted(input_api, output_api) + results += input_api.canned_checks.CheckChangeLintsClean( + input_api, output_api, None, LINT_FILTERS) + results += _CheckIncludeOrder(input_api, output_api) + + return results diff --git a/modules/pdfium/pdfium/README.md b/modules/pdfium/pdfium/README.md new file mode 100644 index 000000000000..8e1fbcb93a0e --- /dev/null +++ b/modules/pdfium/pdfium/README.md @@ -0,0 +1,159 @@ +# PDFium + +## Prerequisites + +Get the chromium depot tools via the instructions at +http://www.chromium.org/developers/how-tos/install-depot-tools (this provides +the gclient utility needed below). + +Also install Python, Subversion, and Git and make sure they're in your path. + + +### Windows development + +PDFium uses a similar Windows toolchain as Chromium: + +#### Open source contributors +Visual Studio 2015 Update 2 or later is highly recommended. + +Run `set DEPOT_TOOLS_WIN_TOOLCHAIN=0`, or set that variable in your global +environment. + +Compilation is done through ninja, **not** Visual Studio. + +### CPU Architectures supported + +The default architecture for Windows, Linux, and Mac is "`x64`". On Windows, +"`x86`" is also supported. GN parameter "`target_cpu = "x86"`" can be used to +override the default value. If you specify Android build, the default CPU +architecture will be "`arm`". + + +#### Google employees + +Run: `download_from_google_storage --config` and follow the +authentication instructions. **Note that you must authenticate with your +@google.com credentials**. Enter "0" if asked for a project-id. + +Once you've done this, the toolchain will be installed automatically for +you in [the step](#GenBuild) below. + +The toolchain will be in `depot_tools\win_toolchain\vs_files\`, and windbg +can be found in `depot_tools\win_toolchain\vs_files\\win_sdk\Debuggers`. + +If you want the IDE for debugging and editing, you will need to install +it separately, but this is optional and not needed for building PDFium. + +## Get the code + +The name of the top-level directory does not matter. In our examples, we use +"repo". This directory must not have been used before by `gclient config` as +each directory can only house a single gclient configuration. + +``` +mkdir repo +cd repo +gclient config --unmanaged https://pdfium.googlesource.com/pdfium.git +gclient sync +cd pdfium +``` + +## Generate the build files + +We use GN to generate the build files and +[Ninja](http://martine.github.io/ninja/) (also included with the depot\_tools +checkout) to execute the build files. + +``` +gn gen +``` + +### Selecting build configuration + +PDFium may be built either with or without JavaScript support, and with +or without XFA forms support. Both of these features are enabled by +default. Also note that the XFA feature requires JavaScript. + +Configuration is done by executing `gn args ` to configure the build. +This will launch an editor in which you can set the following arguments. + +``` +use_goma = true # Googlers only. +is_debug = true # Enable debugging features. + +pdf_use_skia = false # Set true to enable experimental skia backend. +pdf_use_skia_paths = false # Set true to enable experimental skia backend (paths only). + +pdf_enable_xfa = true # Set false to remove XFA support (implies JS support). +pdf_enable_v8 = true # Set false to remove Javascript support. +pdf_is_standalone = true # Set for a non-embedded build. +is_component_build = false # Disable component build (must be false) + +clang_use_chrome_plugins = false # Currently must be false. +use_sysroot = false # Currently must be false on Linux. +``` + +Note, you must set `pdf_is_standalone = true` if you want the sample +applications like `pdfium_test` to build. + +When complete the arguments will be stored in `/args.gn`. + +## Building the code + +If you used Ninja, you can build the sample program by: +`ninja -C /pdfium_test` You can build the entire product (which +includes a few unit tests) by: `ninja -C `. + +## Running the sample program + +The pdfium\_test program supports reading, parsing, and rasterizing the pages of +a .pdf file to .ppm or .png output image files (windows supports two other +formats). For example: `/pdfium_test --ppm path/to/myfile.pdf`. Note +that this will write output images to `path/to/myfile.pdf..ppm`. + +## Testing + +There are currently several test suites that can be run: + + * pdfium\_unittests + * pdfium\_embeddertests + * testing/tools/run\_corpus\_tests.py + * testing/tools/run\_javascript\_tests.py + * testing/tools/run\_pixel\_tests.py + +It is possible the tests in the `testing` directory can fail due to font +differences on the various platforms. These tests are reliable on the bots. If +you see failures, it can be a good idea to run the tests on the tip-of-tree +checkout to see if the same failures appear. + +## Waterfall + +The current health of the source tree can be found at +http://build.chromium.org/p/client.pdfium/console + +## Community + +There are several mailing lists that are setup: + + * [PDFium](https://groups.google.com/forum/#!forum/pdfium) + * [PDFium Reviews](https://groups.google.com/forum/#!forum/pdfium-reviews) + * [PDFium Bugs](https://groups.google.com/forum/#!forum/pdfium-bugs) + +Note, the Reviews and Bugs lists are typically read-only. + +## Bugs + + We use this +[bug tracker](https://code.google.com/p/pdfium/issues/list), but for security +bugs, please use [Chromium's security bug template] +(https://code.google.com/p/chromium/issues/entry?template=Security%20Bug) +and add the "Cr-Internals-Plugins-PDF" label. + +## Contributing code + +For contributing code, we will follow +[Chromium's process](http://dev.chromium.org/developers/contributing-code) +as much as possible. The main exceptions is: + +1. Code has to conform to the existing style and not Chromium/Google style. + diff --git a/modules/pdfium/pdfium/build_overrides/README.md b/modules/pdfium/pdfium/build_overrides/README.md new file mode 100644 index 000000000000..cc0efbf40755 --- /dev/null +++ b/modules/pdfium/pdfium/build_overrides/README.md @@ -0,0 +1,28 @@ +# Build overrides in GN + +This directory is used to allow different products to customize settings +for repos which are DEPS'ed in or shared. + +For example: V8 can be built on its own (in a "standalone" configuration), +and it can be built as part of Chromium. V8 defines a top-level +target, //v8:d8 (a simple executable), which will only be built in the +standalone configuration. To indiate itis a standalone configuration, v8 can +create a file, build_overrides/v8.gni, containing a variable, +`build_standalone_d8 = true` and import it (as +import("//build_overrides/v8.gni") from its top-level BUILD.gn file. + +Chromium, on the other hand, does not need to build d8, and so it would +create its own build_overrides/v8.gni file, and in it set +`build_standalone_d8 = false`. + +The two files should define the same set of variables, but the values may +vary as appropriate to suit the the needs of the two different builds. + +The build.gni file provides a way for projects to override defaults for +variables used in //build itself (which we want to be shareable between +projects). + +TODO(crbug.com/588513): Ideally //build_overrides and, in particular, +//build_overrides/build.gni will go away completely in favor of some +mechanism that can re-use other required files like //.gn, so that we don't +have to keep requiring projects to create a bunch of different files to use GN. diff --git a/modules/pdfium/pdfium/build_overrides/build.gni b/modules/pdfium/pdfium/build_overrides/build.gni new file mode 100644 index 000000000000..af65788b83b3 --- /dev/null +++ b/modules/pdfium/pdfium/build_overrides/build.gni @@ -0,0 +1,62 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# See https://bugs.chromium.org/p/webrtc/issues/detail?id=5453. +# Some WebRTC targets require the 10.7 deployment version of the Mac SDK +# and a 10.11 min SDK, but those targets are only used in non-Chromium +# builds. We can remove this when Chromium drops 10.6 support and also +# requires 10.7. +mac_sdk_min_build_override = "10.10" +mac_deployment_target_build_override = "10.7" + +# Variable that can be used to support multiple build scenarios, like having +# Chromium specific targets in a client project's GN file etc. +build_with_chromium = false + +# Support different NDK locations in non-Chromium builds. +default_android_ndk_root = "//third_party/android_ndk" +default_android_ndk_version = "r12b" +default_android_ndk_major_version = 12 + +# PDFium builds don't support building java targets. +enable_java_templates = false + +# Whether to use the neon FPU instruction set or not. +if (current_cpu == "arm") { + arm_use_neon = true +} + +# PDFium builds don't use Chromium's third_party/binutils. +linux_use_bundled_binutils_override = false + +# PDFium just uses the Chromium suppression files for now. +asan_suppressions_file = "//build/sanitizers/asan_suppressions.cc" +lsan_suppressions_file = "//build/sanitizers/lsan_suppressions.cc" +tsan_suppressions_file = "//build/sanitizers/tsan_suppressions.cc" + +declare_args() { + # Android 32-bit non-component, non-clang builds cannot have symbol_level=2 + # due to 4GiB file size limit, see https://crbug.com/648948. + # Set this flag to true to skip the assertion. + ignore_elf32_limitations = false + + # Use the system install of Xcode for tools like ibtool, libtool, etc. + # This does not affect the compiler. When this variable is false, targets will + # instead use a hermetic install of Xcode. [The hermetic install can be + # obtained with gclient sync after setting the environment variable + # FORCE_MAC_TOOLCHAIN]. + use_system_xcode = "" +} + +if (use_system_xcode == "") { + if (target_os == "mac") { + _result = exec_script("//build/mac/should_use_hermetic_xcode.py", + [ target_os ], + "value") + use_system_xcode = _result == 0 + } + if (target_os == "ios") { + use_system_xcode = true + } +} diff --git a/modules/pdfium/pdfium/build_overrides/gtest.gni b/modules/pdfium/pdfium/build_overrides/gtest.gni new file mode 100644 index 000000000000..bf30fb1d7229 --- /dev/null +++ b/modules/pdfium/pdfium/build_overrides/gtest.gni @@ -0,0 +1,15 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Exclude support for registering main function in multi-process tests. +gtest_include_multiprocess = false + +# Exclude support for platform-specific operations across unit tests. +gtest_include_platform_test = false + +# Exclude support for testing Objective C code on OS X and iOS. +gtest_include_objc_support = false + +# Exclude support for flushing coverage files on iOS. +gtest_include_ios_coverage = false diff --git a/modules/pdfium/pdfium/build_overrides/pdfium.gni b/modules/pdfium/pdfium/build_overrides/pdfium.gni new file mode 100644 index 000000000000..18e6a8739944 --- /dev/null +++ b/modules/pdfium/pdfium/build_overrides/pdfium.gni @@ -0,0 +1,20 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This file contains PDFium-related build overrides. + +# Build PDFium either with or without v8 support. +pdf_enable_v8_override = true + +# Build PDFium either with or without XFA Forms support. +pdf_enable_xfa_override = false + +# Build PDFium against skia (experimental) rather than agg, replacing all PDFium graphics. +pdf_use_skia_override = false + +# Build PDFium against skia (experimental) rather than agg, adding only path support. +pdf_use_skia_paths_override = false + +# Build PDFium either with or without experimental win32 GDI APIs. +pdf_use_win32_gdi_override = false diff --git a/modules/pdfium/pdfium/codereview.settings b/modules/pdfium/pdfium/codereview.settings new file mode 100644 index 000000000000..77265c947388 --- /dev/null +++ b/modules/pdfium/pdfium/codereview.settings @@ -0,0 +1,8 @@ +# This file is used by git cl to get repository specific information. +CC_LIST: pdfium-reviews@googlegroups.com +CODE_REVIEW_SERVER: codereview.chromium.org +GERRIT_HOST: True +PROJECT: pdfium +STATUS: http://pdfium-status.appspot.com/status +TRY_ON_UPLOAD: False +VIEW_VC: https://pdfium.googlesource.com/pdfium/+/ diff --git a/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt.cpp b/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt.cpp new file mode 100644 index 000000000000..4010ff49eeb0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt.cpp @@ -0,0 +1,254 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fdrm/crypto/fx_crypt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void CRYPT_ArcFourSetup(CRYPT_rc4_context* s, + const uint8_t* key, + uint32_t length) { + int i, j, k, *m, a; + s->x = 0; + s->y = 0; + m = s->m; + for (i = 0; i < 256; i++) { + m[i] = i; + } + j = k = 0; + for (i = 0; i < 256; i++) { + a = m[i]; + j = (j + a + key[k]) & 0xFF; + m[i] = m[j]; + m[j] = a; + if (++k >= (int)length) { + k = 0; + } + } +} + +void CRYPT_ArcFourCrypt(CRYPT_rc4_context* s, + unsigned char* data, + uint32_t length) { + int i, x, y, *m, a, b; + x = s->x; + y = s->y; + m = s->m; + for (i = 0; i < (int)length; i++) { + x = (x + 1) & 0xFF; + a = m[x]; + y = (y + a) & 0xFF; + m[x] = b = m[y]; + m[y] = a; + data[i] ^= m[(a + b) & 0xFF]; + } + s->x = x; + s->y = y; +} + +void CRYPT_ArcFourCryptBlock(uint8_t* pData, + uint32_t size, + const uint8_t* key, + uint32_t keylen) { + CRYPT_rc4_context s; + CRYPT_ArcFourSetup(&s, key, keylen); + CRYPT_ArcFourCrypt(&s, pData, size); +} + +#define GET_UINT32(n, b, i) \ + { \ + (n) = (uint32_t)((uint8_t*)b)[(i)] | \ + (((uint32_t)((uint8_t*)b)[(i) + 1]) << 8) | \ + (((uint32_t)((uint8_t*)b)[(i) + 2]) << 16) | \ + (((uint32_t)((uint8_t*)b)[(i) + 3]) << 24); \ + } +#define PUT_UINT32(n, b, i) \ + { \ + (((uint8_t*)b)[(i)]) = (uint8_t)(((n)) & 0xFF); \ + (((uint8_t*)b)[(i) + 1]) = (uint8_t)(((n) >> 8) & 0xFF); \ + (((uint8_t*)b)[(i) + 2]) = (uint8_t)(((n) >> 16) & 0xFF); \ + (((uint8_t*)b)[(i) + 3]) = (uint8_t)(((n) >> 24) & 0xFF); \ + } + +void md5_process(CRYPT_md5_context* ctx, const uint8_t data[64]) { + uint32_t A, B, C, D, X[16]; + GET_UINT32(X[0], data, 0); + GET_UINT32(X[1], data, 4); + GET_UINT32(X[2], data, 8); + GET_UINT32(X[3], data, 12); + GET_UINT32(X[4], data, 16); + GET_UINT32(X[5], data, 20); + GET_UINT32(X[6], data, 24); + GET_UINT32(X[7], data, 28); + GET_UINT32(X[8], data, 32); + GET_UINT32(X[9], data, 36); + GET_UINT32(X[10], data, 40); + GET_UINT32(X[11], data, 44); + GET_UINT32(X[12], data, 48); + GET_UINT32(X[13], data, 52); + GET_UINT32(X[14], data, 56); + GET_UINT32(X[15], data, 60); +#define S(x, n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) +#define P(a, b, c, d, k, s, t) \ + { \ + a += F(b, c, d) + X[k] + t; \ + a = S(a, s) + b; \ + } + A = ctx->state[0]; + B = ctx->state[1]; + C = ctx->state[2]; + D = ctx->state[3]; +#define F(x, y, z) (z ^ (x & (y ^ z))) + P(A, B, C, D, 0, 7, 0xD76AA478); + P(D, A, B, C, 1, 12, 0xE8C7B756); + P(C, D, A, B, 2, 17, 0x242070DB); + P(B, C, D, A, 3, 22, 0xC1BDCEEE); + P(A, B, C, D, 4, 7, 0xF57C0FAF); + P(D, A, B, C, 5, 12, 0x4787C62A); + P(C, D, A, B, 6, 17, 0xA8304613); + P(B, C, D, A, 7, 22, 0xFD469501); + P(A, B, C, D, 8, 7, 0x698098D8); + P(D, A, B, C, 9, 12, 0x8B44F7AF); + P(C, D, A, B, 10, 17, 0xFFFF5BB1); + P(B, C, D, A, 11, 22, 0x895CD7BE); + P(A, B, C, D, 12, 7, 0x6B901122); + P(D, A, B, C, 13, 12, 0xFD987193); + P(C, D, A, B, 14, 17, 0xA679438E); + P(B, C, D, A, 15, 22, 0x49B40821); +#undef F +#define F(x, y, z) (y ^ (z & (x ^ y))) + P(A, B, C, D, 1, 5, 0xF61E2562); + P(D, A, B, C, 6, 9, 0xC040B340); + P(C, D, A, B, 11, 14, 0x265E5A51); + P(B, C, D, A, 0, 20, 0xE9B6C7AA); + P(A, B, C, D, 5, 5, 0xD62F105D); + P(D, A, B, C, 10, 9, 0x02441453); + P(C, D, A, B, 15, 14, 0xD8A1E681); + P(B, C, D, A, 4, 20, 0xE7D3FBC8); + P(A, B, C, D, 9, 5, 0x21E1CDE6); + P(D, A, B, C, 14, 9, 0xC33707D6); + P(C, D, A, B, 3, 14, 0xF4D50D87); + P(B, C, D, A, 8, 20, 0x455A14ED); + P(A, B, C, D, 13, 5, 0xA9E3E905); + P(D, A, B, C, 2, 9, 0xFCEFA3F8); + P(C, D, A, B, 7, 14, 0x676F02D9); + P(B, C, D, A, 12, 20, 0x8D2A4C8A); +#undef F +#define F(x, y, z) (x ^ y ^ z) + P(A, B, C, D, 5, 4, 0xFFFA3942); + P(D, A, B, C, 8, 11, 0x8771F681); + P(C, D, A, B, 11, 16, 0x6D9D6122); + P(B, C, D, A, 14, 23, 0xFDE5380C); + P(A, B, C, D, 1, 4, 0xA4BEEA44); + P(D, A, B, C, 4, 11, 0x4BDECFA9); + P(C, D, A, B, 7, 16, 0xF6BB4B60); + P(B, C, D, A, 10, 23, 0xBEBFBC70); + P(A, B, C, D, 13, 4, 0x289B7EC6); + P(D, A, B, C, 0, 11, 0xEAA127FA); + P(C, D, A, B, 3, 16, 0xD4EF3085); + P(B, C, D, A, 6, 23, 0x04881D05); + P(A, B, C, D, 9, 4, 0xD9D4D039); + P(D, A, B, C, 12, 11, 0xE6DB99E5); + P(C, D, A, B, 15, 16, 0x1FA27CF8); + P(B, C, D, A, 2, 23, 0xC4AC5665); +#undef F +#define F(x, y, z) (y ^ (x | ~z)) + P(A, B, C, D, 0, 6, 0xF4292244); + P(D, A, B, C, 7, 10, 0x432AFF97); + P(C, D, A, B, 14, 15, 0xAB9423A7); + P(B, C, D, A, 5, 21, 0xFC93A039); + P(A, B, C, D, 12, 6, 0x655B59C3); + P(D, A, B, C, 3, 10, 0x8F0CCC92); + P(C, D, A, B, 10, 15, 0xFFEFF47D); + P(B, C, D, A, 1, 21, 0x85845DD1); + P(A, B, C, D, 8, 6, 0x6FA87E4F); + P(D, A, B, C, 15, 10, 0xFE2CE6E0); + P(C, D, A, B, 6, 15, 0xA3014314); + P(B, C, D, A, 13, 21, 0x4E0811A1); + P(A, B, C, D, 4, 6, 0xF7537E82); + P(D, A, B, C, 11, 10, 0xBD3AF235); + P(C, D, A, B, 2, 15, 0x2AD7D2BB); + P(B, C, D, A, 9, 21, 0xEB86D391); +#undef F + ctx->state[0] += A; + ctx->state[1] += B; + ctx->state[2] += C; + ctx->state[3] += D; +} + +void CRYPT_MD5Start(CRYPT_md5_context* ctx) { + ctx->total[0] = 0; + ctx->total[1] = 0; + ctx->state[0] = 0x67452301; + ctx->state[1] = 0xEFCDAB89; + ctx->state[2] = 0x98BADCFE; + ctx->state[3] = 0x10325476; +} + +void CRYPT_MD5Update(CRYPT_md5_context* ctx, + const uint8_t* input, + uint32_t length) { + uint32_t left, fill; + if (!length) { + return; + } + left = (ctx->total[0] >> 3) & 0x3F; + fill = 64 - left; + ctx->total[0] += length << 3; + ctx->total[1] += length >> 29; + ctx->total[0] &= 0xFFFFFFFF; + ctx->total[1] += ctx->total[0] < length << 3; + if (left && length >= fill) { + FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, fill); + md5_process(ctx, ctx->buffer); + length -= fill; + input += fill; + left = 0; + } + while (length >= 64) { + md5_process(ctx, input); + length -= 64; + input += 64; + } + if (length) { + FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length); + } +} + +const uint8_t md5_padding[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +void CRYPT_MD5Finish(CRYPT_md5_context* ctx, uint8_t digest[16]) { + uint32_t last, padn; + uint8_t msglen[8]; + PUT_UINT32(ctx->total[0], msglen, 0); + PUT_UINT32(ctx->total[1], msglen, 4); + last = (ctx->total[0] >> 3) & 0x3F; + padn = (last < 56) ? (56 - last) : (120 - last); + CRYPT_MD5Update(ctx, md5_padding, padn); + CRYPT_MD5Update(ctx, msglen, 8); + PUT_UINT32(ctx->state[0], digest, 0); + PUT_UINT32(ctx->state[1], digest, 4); + PUT_UINT32(ctx->state[2], digest, 8); + PUT_UINT32(ctx->state[3], digest, 12); +} + +void CRYPT_MD5Generate(const uint8_t* input, + uint32_t length, + uint8_t digest[16]) { + CRYPT_md5_context ctx; + CRYPT_MD5Start(&ctx); + CRYPT_MD5Update(&ctx, input, length); + CRYPT_MD5Finish(&ctx, digest); +} + +#ifdef __cplusplus +}; +#endif diff --git a/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt.h b/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt.h new file mode 100644 index 000000000000..a498f4e19ba3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt.h @@ -0,0 +1,116 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FDRM_CRYPTO_FX_CRYPT_H_ +#define CORE_FDRM_CRYPTO_FX_CRYPT_H_ + +#include "core/fxcrt/fx_system.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int32_t x; + int32_t y; + int32_t m[256]; +} CRYPT_rc4_context; + +typedef struct { + uint32_t total[2]; + uint32_t state[4]; + uint8_t buffer[64]; +} CRYPT_md5_context; + +typedef struct { + unsigned int h[5]; + unsigned char block[64]; + int blkused; + unsigned int lenhi; + unsigned int lenlo; +} CRYPT_sha1_context; + +typedef struct { + uint32_t total[2]; + uint32_t state[8]; + uint8_t buffer[64]; +} CRYPT_sha256_context; + +typedef struct { + uint64_t total[2]; + uint64_t state[8]; + uint8_t buffer[128]; +} CRYPT_sha384_context; + +void CRYPT_ArcFourCryptBlock(uint8_t* data, + uint32_t size, + const uint8_t* key, + uint32_t keylen); +void CRYPT_ArcFourSetup(CRYPT_rc4_context* context, + const uint8_t* key, + uint32_t length); +void CRYPT_ArcFourCrypt(CRYPT_rc4_context* context, + uint8_t* data, + uint32_t size); + +void CRYPT_AESSetKey(void* context, + uint32_t blocklen, + const uint8_t* key, + uint32_t keylen, + bool bEncrypt); +void CRYPT_AESSetIV(void* context, const uint8_t* iv); +void CRYPT_AESDecrypt(void* context, + uint8_t* dest, + const uint8_t* src, + uint32_t size); +void CRYPT_AESEncrypt(void* context, + uint8_t* dest, + const uint8_t* src, + uint32_t size); + +void CRYPT_MD5Start(CRYPT_md5_context* context); +void CRYPT_MD5Update(CRYPT_md5_context* context, + const uint8_t* data, + uint32_t size); +void CRYPT_MD5Finish(CRYPT_md5_context* context, uint8_t digest[16]); +void CRYPT_MD5Generate(const uint8_t* data, uint32_t size, uint8_t digest[16]); + +void CRYPT_SHA1Start(CRYPT_sha1_context* context); +void CRYPT_SHA1Update(CRYPT_sha1_context* context, + const uint8_t* data, + uint32_t size); +void CRYPT_SHA1Finish(CRYPT_sha1_context* context, uint8_t digest[20]); +void CRYPT_SHA1Generate(const uint8_t* data, uint32_t size, uint8_t digest[20]); + +void CRYPT_SHA256Start(CRYPT_sha256_context* context); +void CRYPT_SHA256Update(CRYPT_sha256_context* context, + const uint8_t* data, + uint32_t size); +void CRYPT_SHA256Finish(CRYPT_sha256_context* context, uint8_t digest[32]); +void CRYPT_SHA256Generate(const uint8_t* data, + uint32_t size, + uint8_t digest[32]); + +void CRYPT_SHA384Start(CRYPT_sha384_context* context); +void CRYPT_SHA384Update(CRYPT_sha384_context* context, + const uint8_t* data, + uint32_t size); +void CRYPT_SHA384Finish(CRYPT_sha384_context* context, uint8_t digest[48]); +void CRYPT_SHA384Generate(const uint8_t* data, + uint32_t size, + uint8_t digest[48]); + +void CRYPT_SHA512Start(void* context); +void CRYPT_SHA512Update(void* context, const uint8_t* data, uint32_t size); +void CRYPT_SHA512Finish(void* context, uint8_t digest[64]); +void CRYPT_SHA512Generate(const uint8_t* data, + uint32_t size, + uint8_t digest[64]); +#ifdef __cplusplus +}; +#endif + +#endif // CORE_FDRM_CRYPTO_FX_CRYPT_H_ diff --git a/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt_aes.cpp b/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt_aes.cpp new file mode 100644 index 000000000000..8484b6f4a506 --- /dev/null +++ b/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt_aes.cpp @@ -0,0 +1,833 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fdrm/crypto/fx_crypt.h" + +#ifdef __cplusplus +extern "C" { +#endif +#define MAX_NR 14 +#define MAX_NK 8 +#define MAX_NB 8 +#define mulby2(x) (((x & 0x7F) << 1) ^ (x & 0x80 ? 0x1B : 0)) +#define GET_32BIT_MSB_FIRST(cp) \ + (((unsigned long)(unsigned char)(cp)[3]) | \ + ((unsigned long)(unsigned char)(cp)[2] << 8) | \ + ((unsigned long)(unsigned char)(cp)[1] << 16) | \ + ((unsigned long)(unsigned char)(cp)[0] << 24)) +#define PUT_32BIT_MSB_FIRST(cp, value) \ + do { \ + (cp)[3] = (value); \ + (cp)[2] = (value) >> 8; \ + (cp)[1] = (value) >> 16; \ + (cp)[0] = (value) >> 24; \ + } while (0) +struct AESContext { + unsigned int keysched[(MAX_NR + 1) * MAX_NB]; + unsigned int invkeysched[(MAX_NR + 1) * MAX_NB]; + void (*encrypt)(AESContext* ctx, unsigned int* block); + void (*decrypt)(AESContext* ctx, unsigned int* block); + unsigned int iv[MAX_NB]; + int Nb, Nr; +}; +static const unsigned char Sbox[256] = { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, + 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, + 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, + 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, + 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, + 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, + 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, + 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, + 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, + 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, + 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, + 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, + 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, + 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, + 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, + 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, + 0xb0, 0x54, 0xbb, 0x16}; +static const unsigned char Sboxinv[256] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, + 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, + 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, + 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, + 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, + 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, + 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, + 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, + 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, + 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, + 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, + 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, + 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, + 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, + 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, + 0x55, 0x21, 0x0c, 0x7d}; +static const unsigned int E0[256] = { + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, + 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, + 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, + 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, + 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, + 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, + 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, + 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, + 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, + 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, + 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, + 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, + 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, + 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, + 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, + 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, + 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, + 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, + 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, + 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, + 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, + 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; +static const unsigned int E1[256] = { + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, + 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, + 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, + 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, + 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, + 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, + 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, + 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, + 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, + 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, + 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, + 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, + 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, + 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, + 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, + 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, + 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, + 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, + 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, + 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, + 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, + 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; +static const unsigned int E2[256] = { + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, + 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, + 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, + 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, + 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, + 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, + 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, + 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, + 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, + 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, + 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, + 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, + 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, + 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, + 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, + 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, + 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, + 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, + 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, + 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, + 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, + 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; +static const unsigned int E3[256] = { + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, + 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, + 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, + 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, + 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, + 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, + 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, + 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, + 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, + 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, + 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, + 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, + 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, + 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, + 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, + 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, + 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, + 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, + 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, + 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, + 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, + 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; +static const unsigned int D0[256] = { + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, + 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, + 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, + 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, + 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, + 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, + 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, + 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, + 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, + 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, + 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, + 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, + 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, + 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, + 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, + 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, + 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, + 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, + 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, + 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, + 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, + 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; +static const unsigned int D1[256] = { + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, + 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, + 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, + 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, + 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, + 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, + 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, + 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, + 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, + 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, + 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, + 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, + 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, + 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, + 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, + 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, + 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, + 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, + 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, + 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, + 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, + 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; +static const unsigned int D2[256] = { + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, + 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, + 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, + 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, + 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, + 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, + 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, + 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, + 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, + 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, + 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, + 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, + 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, + 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, + 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, + 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, + 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, + 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, + 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, + 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, + 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, + 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; +static const unsigned int D3[256] = { + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, + 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, + 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, + 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, + 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, + 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, + 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, + 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, + 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, + 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, + 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, + 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, + 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, + 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, + 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, + 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, + 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, + 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, + 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, + 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, + 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, + 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; +#define ADD_ROUND_KEY_4 \ + (block[0] ^= *keysched++, block[1] ^= *keysched++, block[2] ^= *keysched++, \ + block[3] ^= *keysched++) +#define ADD_ROUND_KEY_6 \ + (block[0] ^= *keysched++, block[1] ^= *keysched++, block[2] ^= *keysched++, \ + block[3] ^= *keysched++, block[4] ^= *keysched++, block[5] ^= *keysched++) +#define ADD_ROUND_KEY_8 \ + (block[0] ^= *keysched++, block[1] ^= *keysched++, block[2] ^= *keysched++, \ + block[3] ^= *keysched++, block[4] ^= *keysched++, block[5] ^= *keysched++, \ + block[6] ^= *keysched++, block[7] ^= *keysched++) +#define MOVEWORD(i) (block[i] = newstate[i]) +#undef MAKEWORD +#define MAKEWORD(i) \ + (newstate[i] = (E0[(block[i] >> 24) & 0xFF] ^ \ + E1[(block[(i + C1) % Nb] >> 16) & 0xFF] ^ \ + E2[(block[(i + C2) % Nb] >> 8) & 0xFF] ^ \ + E3[block[(i + C3) % Nb] & 0xFF])) +#define LASTWORD(i) \ + (newstate[i] = (Sbox[(block[i] >> 24) & 0xFF] << 24) | \ + (Sbox[(block[(i + C1) % Nb] >> 16) & 0xFF] << 16) | \ + (Sbox[(block[(i + C2) % Nb] >> 8) & 0xFF] << 8) | \ + (Sbox[(block[(i + C3) % Nb]) & 0xFF])) +static void aes_encrypt_nb_4(AESContext* ctx, unsigned int* block) { + int i; + static const int C1 = 1, C2 = 2, C3 = 3, Nb = 4; + unsigned int* keysched = ctx->keysched; + unsigned int newstate[4]; + for (i = 0; i < ctx->Nr - 1; i++) { + ADD_ROUND_KEY_4; + MAKEWORD(0); + MAKEWORD(1); + MAKEWORD(2); + MAKEWORD(3); + MOVEWORD(0); + MOVEWORD(1); + MOVEWORD(2); + MOVEWORD(3); + } + ADD_ROUND_KEY_4; + LASTWORD(0); + LASTWORD(1); + LASTWORD(2); + LASTWORD(3); + MOVEWORD(0); + MOVEWORD(1); + MOVEWORD(2); + MOVEWORD(3); + ADD_ROUND_KEY_4; +} +static void aes_encrypt_nb_6(AESContext* ctx, unsigned int* block) { + int i; + static const int C1 = 1, C2 = 2, C3 = 3, Nb = 6; + unsigned int* keysched = ctx->keysched; + unsigned int newstate[6]; + for (i = 0; i < ctx->Nr - 1; i++) { + ADD_ROUND_KEY_6; + MAKEWORD(0); + MAKEWORD(1); + MAKEWORD(2); + MAKEWORD(3); + MAKEWORD(4); + MAKEWORD(5); + MOVEWORD(0); + MOVEWORD(1); + MOVEWORD(2); + MOVEWORD(3); + MOVEWORD(4); + MOVEWORD(5); + } + ADD_ROUND_KEY_6; + LASTWORD(0); + LASTWORD(1); + LASTWORD(2); + LASTWORD(3); + LASTWORD(4); + LASTWORD(5); + MOVEWORD(0); + MOVEWORD(1); + MOVEWORD(2); + MOVEWORD(3); + MOVEWORD(4); + MOVEWORD(5); + ADD_ROUND_KEY_6; +} +static void aes_encrypt_nb_8(AESContext* ctx, unsigned int* block) { + int i; + static const int C1 = 1, C2 = 3, C3 = 4, Nb = 8; + unsigned int* keysched = ctx->keysched; + unsigned int newstate[8]; + for (i = 0; i < ctx->Nr - 1; i++) { + ADD_ROUND_KEY_8; + MAKEWORD(0); + MAKEWORD(1); + MAKEWORD(2); + MAKEWORD(3); + MAKEWORD(4); + MAKEWORD(5); + MAKEWORD(6); + MAKEWORD(7); + MOVEWORD(0); + MOVEWORD(1); + MOVEWORD(2); + MOVEWORD(3); + MOVEWORD(4); + MOVEWORD(5); + MOVEWORD(6); + MOVEWORD(7); + } + ADD_ROUND_KEY_8; + LASTWORD(0); + LASTWORD(1); + LASTWORD(2); + LASTWORD(3); + LASTWORD(4); + LASTWORD(5); + LASTWORD(6); + LASTWORD(7); + MOVEWORD(0); + MOVEWORD(1); + MOVEWORD(2); + MOVEWORD(3); + MOVEWORD(4); + MOVEWORD(5); + MOVEWORD(6); + MOVEWORD(7); + ADD_ROUND_KEY_8; +} +#undef MAKEWORD +#undef LASTWORD +#define MAKEWORD(i) \ + (newstate[i] = (D0[(block[i] >> 24) & 0xFF] ^ \ + D1[(block[(i + C1) % Nb] >> 16) & 0xFF] ^ \ + D2[(block[(i + C2) % Nb] >> 8) & 0xFF] ^ \ + D3[block[(i + C3) % Nb] & 0xFF])) +#define LASTWORD(i) \ + (newstate[i] = (Sboxinv[(block[i] >> 24) & 0xFF] << 24) | \ + (Sboxinv[(block[(i + C1) % Nb] >> 16) & 0xFF] << 16) | \ + (Sboxinv[(block[(i + C2) % Nb] >> 8) & 0xFF] << 8) | \ + (Sboxinv[(block[(i + C3) % Nb]) & 0xFF])) +static void aes_decrypt_nb_4(AESContext* ctx, unsigned int* block) { + int i; + static const int C1 = 4 - 1, C2 = 4 - 2, C3 = 4 - 3, Nb = 4; + unsigned int* keysched = ctx->invkeysched; + unsigned int newstate[4]; + for (i = 0; i < ctx->Nr - 1; i++) { + ADD_ROUND_KEY_4; + MAKEWORD(0); + MAKEWORD(1); + MAKEWORD(2); + MAKEWORD(3); + MOVEWORD(0); + MOVEWORD(1); + MOVEWORD(2); + MOVEWORD(3); + } + ADD_ROUND_KEY_4; + LASTWORD(0); + LASTWORD(1); + LASTWORD(2); + LASTWORD(3); + MOVEWORD(0); + MOVEWORD(1); + MOVEWORD(2); + MOVEWORD(3); + ADD_ROUND_KEY_4; +} +static void aes_decrypt_nb_6(AESContext* ctx, unsigned int* block) { + int i; + static const int C1 = 6 - 1, C2 = 6 - 2, C3 = 6 - 3, Nb = 6; + unsigned int* keysched = ctx->invkeysched; + unsigned int newstate[6]; + for (i = 0; i < ctx->Nr - 1; i++) { + ADD_ROUND_KEY_6; + MAKEWORD(0); + MAKEWORD(1); + MAKEWORD(2); + MAKEWORD(3); + MAKEWORD(4); + MAKEWORD(5); + MOVEWORD(0); + MOVEWORD(1); + MOVEWORD(2); + MOVEWORD(3); + MOVEWORD(4); + MOVEWORD(5); + } + ADD_ROUND_KEY_6; + LASTWORD(0); + LASTWORD(1); + LASTWORD(2); + LASTWORD(3); + LASTWORD(4); + LASTWORD(5); + MOVEWORD(0); + MOVEWORD(1); + MOVEWORD(2); + MOVEWORD(3); + MOVEWORD(4); + MOVEWORD(5); + ADD_ROUND_KEY_6; +} +static void aes_decrypt_nb_8(AESContext* ctx, unsigned int* block) { + int i; + static const int C1 = 8 - 1, C2 = 8 - 3, C3 = 8 - 4, Nb = 8; + unsigned int* keysched = ctx->invkeysched; + unsigned int newstate[8]; + for (i = 0; i < ctx->Nr - 1; i++) { + ADD_ROUND_KEY_8; + MAKEWORD(0); + MAKEWORD(1); + MAKEWORD(2); + MAKEWORD(3); + MAKEWORD(4); + MAKEWORD(5); + MAKEWORD(6); + MAKEWORD(7); + MOVEWORD(0); + MOVEWORD(1); + MOVEWORD(2); + MOVEWORD(3); + MOVEWORD(4); + MOVEWORD(5); + MOVEWORD(6); + MOVEWORD(7); + } + ADD_ROUND_KEY_8; + LASTWORD(0); + LASTWORD(1); + LASTWORD(2); + LASTWORD(3); + LASTWORD(4); + LASTWORD(5); + LASTWORD(6); + LASTWORD(7); + MOVEWORD(0); + MOVEWORD(1); + MOVEWORD(2); + MOVEWORD(3); + MOVEWORD(4); + MOVEWORD(5); + MOVEWORD(6); + MOVEWORD(7); + ADD_ROUND_KEY_8; +} +#undef MAKEWORD +#undef LASTWORD +static void aes_setup(AESContext* ctx, + int blocklen, + const unsigned char* key, + int keylen) { + int i, j, Nk, rconst; + ASSERT(blocklen == 16 || blocklen == 24 || blocklen == 32); + ASSERT(keylen == 16 || keylen == 24 || keylen == 32); + Nk = keylen / 4; + ctx->Nb = blocklen / 4; + ctx->Nr = 6 + (ctx->Nb > Nk ? ctx->Nb : Nk); + if (ctx->Nb == 8) { + ctx->encrypt = aes_encrypt_nb_8, ctx->decrypt = aes_decrypt_nb_8; + } else if (ctx->Nb == 6) { + ctx->encrypt = aes_encrypt_nb_6, ctx->decrypt = aes_decrypt_nb_6; + } else if (ctx->Nb == 4) { + ctx->encrypt = aes_encrypt_nb_4, ctx->decrypt = aes_decrypt_nb_4; + } + rconst = 1; + for (i = 0; i < (ctx->Nr + 1) * ctx->Nb; i++) { + if (i < Nk) { + ctx->keysched[i] = GET_32BIT_MSB_FIRST(key + 4 * i); + } else { + unsigned int temp = ctx->keysched[i - 1]; + if (i % Nk == 0) { + int a, b, c, d; + a = (temp >> 16) & 0xFF; + b = (temp >> 8) & 0xFF; + c = (temp >> 0) & 0xFF; + d = (temp >> 24) & 0xFF; + temp = Sbox[a] ^ rconst; + temp = (temp << 8) | Sbox[b]; + temp = (temp << 8) | Sbox[c]; + temp = (temp << 8) | Sbox[d]; + rconst = mulby2(rconst); + } else if (i % Nk == 4 && Nk > 6) { + int a, b, c, d; + a = (temp >> 24) & 0xFF; + b = (temp >> 16) & 0xFF; + c = (temp >> 8) & 0xFF; + d = (temp >> 0) & 0xFF; + temp = Sbox[a]; + temp = (temp << 8) | Sbox[b]; + temp = (temp << 8) | Sbox[c]; + temp = (temp << 8) | Sbox[d]; + } + ctx->keysched[i] = ctx->keysched[i - Nk] ^ temp; + } + } + for (i = 0; i <= ctx->Nr; i++) { + for (j = 0; j < ctx->Nb; j++) { + unsigned int temp; + temp = ctx->keysched[(ctx->Nr - i) * ctx->Nb + j]; + if (i != 0 && i != ctx->Nr) { + int a, b, c, d; + a = (temp >> 24) & 0xFF; + b = (temp >> 16) & 0xFF; + c = (temp >> 8) & 0xFF; + d = (temp >> 0) & 0xFF; + temp = D0[Sbox[a]]; + temp ^= D1[Sbox[b]]; + temp ^= D2[Sbox[c]]; + temp ^= D3[Sbox[d]]; + } + ctx->invkeysched[i * ctx->Nb + j] = temp; + } + } +} +static void aes_decrypt(AESContext* ctx, unsigned int* block) { + ctx->decrypt(ctx, block); +} +static void aes_decrypt_cbc(unsigned char* dest, + const unsigned char* src, + int len, + AESContext* ctx) { + unsigned int iv[4], x[4], ct[4]; + int i; + ASSERT((len & 15) == 0); + FXSYS_memcpy(iv, ctx->iv, sizeof(iv)); + while (len > 0) { + for (i = 0; i < 4; i++) { + x[i] = ct[i] = GET_32BIT_MSB_FIRST(src + 4 * i); + } + aes_decrypt(ctx, x); + for (i = 0; i < 4; i++) { + PUT_32BIT_MSB_FIRST(dest + 4 * i, iv[i] ^ x[i]); + iv[i] = ct[i]; + } + dest += 16; + src += 16; + len -= 16; + } + FXSYS_memcpy(ctx->iv, iv, sizeof(iv)); +} +static void aes_encrypt(AESContext* ctx, unsigned int* block) { + ctx->encrypt(ctx, block); +} +static void aes_encrypt_cbc(unsigned char* dest, + const unsigned char* src, + int len, + AESContext* ctx) { + unsigned int iv[4]; + int i; + ASSERT((len & 15) == 0); + FXSYS_memcpy(iv, ctx->iv, sizeof(iv)); + while (len > 0) { + for (i = 0; i < 4; i++) { + iv[i] ^= GET_32BIT_MSB_FIRST(src + 4 * i); + } + aes_encrypt(ctx, iv); + for (i = 0; i < 4; i++) { + PUT_32BIT_MSB_FIRST(dest + 4 * i, iv[i]); + } + dest += 16; + src += 16; + len -= 16; + } + FXSYS_memcpy(ctx->iv, iv, sizeof(iv)); +} +void CRYPT_AESSetKey(void* context, + uint32_t blocklen, + const uint8_t* key, + uint32_t keylen, + bool bEncrypt) { + aes_setup((AESContext*)context, blocklen, key, keylen); +} +void CRYPT_AESSetIV(void* context, const uint8_t* iv) { + int i; + for (i = 0; i < ((AESContext*)context)->Nb; i++) { + ((AESContext*)context)->iv[i] = GET_32BIT_MSB_FIRST(iv + 4 * i); + } +} +void CRYPT_AESDecrypt(void* context, + uint8_t* dest, + const uint8_t* src, + uint32_t len) { + aes_decrypt_cbc(dest, src, len, (AESContext*)context); +} +void CRYPT_AESEncrypt(void* context, + uint8_t* dest, + const uint8_t* src, + uint32_t len) { + aes_encrypt_cbc(dest, src, len, (AESContext*)context); +} +#ifdef __cplusplus +}; +#endif diff --git a/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt_sha.cpp b/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt_sha.cpp new file mode 100644 index 000000000000..79ff503334f1 --- /dev/null +++ b/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt_sha.cpp @@ -0,0 +1,661 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fdrm/crypto/fx_crypt.h" + +#ifdef __cplusplus +extern "C" { +#endif +#define rol(x, y) (((x) << (y)) | (((unsigned int)x) >> (32 - y))) +static void SHA_Core_Init(unsigned int h[5]) { + h[0] = 0x67452301; + h[1] = 0xefcdab89; + h[2] = 0x98badcfe; + h[3] = 0x10325476; + h[4] = 0xc3d2e1f0; +} +static void SHATransform(unsigned int* digest, unsigned int* block) { + unsigned int w[80]; + unsigned int a, b, c, d, e; + int t; + for (t = 0; t < 16; t++) { + w[t] = block[t]; + } + for (t = 16; t < 80; t++) { + unsigned int tmp = w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]; + w[t] = rol(tmp, 1); + } + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + for (t = 0; t < 20; t++) { + unsigned int tmp = rol(a, 5) + ((b & c) | (d & ~b)) + e + w[t] + 0x5a827999; + e = d; + d = c; + c = rol(b, 30); + b = a; + a = tmp; + } + for (t = 20; t < 40; t++) { + unsigned int tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0x6ed9eba1; + e = d; + d = c; + c = rol(b, 30); + b = a; + a = tmp; + } + for (t = 40; t < 60; t++) { + unsigned int tmp = + rol(a, 5) + ((b & c) | (b & d) | (c & d)) + e + w[t] + 0x8f1bbcdc; + e = d; + d = c; + c = rol(b, 30); + b = a; + a = tmp; + } + for (t = 60; t < 80; t++) { + unsigned int tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0xca62c1d6; + e = d; + d = c; + c = rol(b, 30); + b = a; + a = tmp; + } + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; +} + +void CRYPT_SHA1Start(CRYPT_sha1_context* s) { + SHA_Core_Init(s->h); + s->blkused = 0; + s->lenhi = s->lenlo = 0; +} + +void CRYPT_SHA1Update(CRYPT_sha1_context* s, + const uint8_t* data, + uint32_t size) { + unsigned char* q = (unsigned char*)data; + unsigned int wordblock[16]; + int len = size; + unsigned int lenw = len; + int i; + s->lenlo += lenw; + s->lenhi += (s->lenlo < lenw); + if (s->blkused && s->blkused + len < 64) { + FXSYS_memcpy(s->block + s->blkused, q, len); + s->blkused += len; + } else { + while (s->blkused + len >= 64) { + FXSYS_memcpy(s->block + s->blkused, q, 64 - s->blkused); + q += 64 - s->blkused; + len -= 64 - s->blkused; + for (i = 0; i < 16; i++) { + wordblock[i] = (((unsigned int)s->block[i * 4 + 0]) << 24) | + (((unsigned int)s->block[i * 4 + 1]) << 16) | + (((unsigned int)s->block[i * 4 + 2]) << 8) | + (((unsigned int)s->block[i * 4 + 3]) << 0); + } + SHATransform(s->h, wordblock); + s->blkused = 0; + } + FXSYS_memcpy(s->block, q, len); + s->blkused = len; + } +} + +void CRYPT_SHA1Finish(CRYPT_sha1_context* s, uint8_t digest[20]) { + int i; + int pad; + unsigned char c[64]; + unsigned int lenhi, lenlo; + if (s->blkused >= 56) { + pad = 56 + 64 - s->blkused; + } else { + pad = 56 - s->blkused; + } + lenhi = (s->lenhi << 3) | (s->lenlo >> (32 - 3)); + lenlo = (s->lenlo << 3); + FXSYS_memset(c, 0, pad); + c[0] = 0x80; + CRYPT_SHA1Update(s, c, pad); + c[0] = (lenhi >> 24) & 0xFF; + c[1] = (lenhi >> 16) & 0xFF; + c[2] = (lenhi >> 8) & 0xFF; + c[3] = (lenhi >> 0) & 0xFF; + c[4] = (lenlo >> 24) & 0xFF; + c[5] = (lenlo >> 16) & 0xFF; + c[6] = (lenlo >> 8) & 0xFF; + c[7] = (lenlo >> 0) & 0xFF; + CRYPT_SHA1Update(s, c, 8); + for (i = 0; i < 5; i++) { + digest[i * 4] = (s->h[i] >> 24) & 0xFF; + digest[i * 4 + 1] = (s->h[i] >> 16) & 0xFF; + digest[i * 4 + 2] = (s->h[i] >> 8) & 0xFF; + digest[i * 4 + 3] = (s->h[i]) & 0xFF; + } +} +void CRYPT_SHA1Generate(const uint8_t* data, + uint32_t size, + uint8_t digest[20]) { + CRYPT_sha1_context s; + CRYPT_SHA1Start(&s); + CRYPT_SHA1Update(&s, data, size); + CRYPT_SHA1Finish(&s, digest); +} +#define GET_UINT32(n, b, i) \ + { \ + (n) = ((uint32_t)(b)[(i)] << 24) | ((uint32_t)(b)[(i) + 1] << 16) | \ + ((uint32_t)(b)[(i) + 2] << 8) | ((uint32_t)(b)[(i) + 3]); \ + } +#define PUT_UINT32(n, b, i) \ + { \ + (b)[(i)] = (uint8_t)((n) >> 24); \ + (b)[(i) + 1] = (uint8_t)((n) >> 16); \ + (b)[(i) + 2] = (uint8_t)((n) >> 8); \ + (b)[(i) + 3] = (uint8_t)((n)); \ + } + +void CRYPT_SHA256Start(CRYPT_sha256_context* ctx) { + ctx->total[0] = 0; + ctx->total[1] = 0; + ctx->state[0] = 0x6A09E667; + ctx->state[1] = 0xBB67AE85; + ctx->state[2] = 0x3C6EF372; + ctx->state[3] = 0xA54FF53A; + ctx->state[4] = 0x510E527F; + ctx->state[5] = 0x9B05688C; + ctx->state[6] = 0x1F83D9AB; + ctx->state[7] = 0x5BE0CD19; +} + +static void sha256_process(CRYPT_sha256_context* ctx, const uint8_t data[64]) { + uint32_t temp1, temp2, W[64]; + uint32_t A, B, C, D, E, F, G, H; + GET_UINT32(W[0], data, 0); + GET_UINT32(W[1], data, 4); + GET_UINT32(W[2], data, 8); + GET_UINT32(W[3], data, 12); + GET_UINT32(W[4], data, 16); + GET_UINT32(W[5], data, 20); + GET_UINT32(W[6], data, 24); + GET_UINT32(W[7], data, 28); + GET_UINT32(W[8], data, 32); + GET_UINT32(W[9], data, 36); + GET_UINT32(W[10], data, 40); + GET_UINT32(W[11], data, 44); + GET_UINT32(W[12], data, 48); + GET_UINT32(W[13], data, 52); + GET_UINT32(W[14], data, 56); + GET_UINT32(W[15], data, 60); +#define SHR(x, n) ((x & 0xFFFFFFFF) >> n) +#define ROTR(x, n) (SHR(x, n) | (x << (32 - n))) +#define S0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) +#define S1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) +#define S2(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) +#define S3(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) +#define F0(x, y, z) ((x & y) | (z & (x | y))) +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define R(t) (W[t] = S1(W[t - 2]) + W[t - 7] + S0(W[t - 15]) + W[t - 16]) +#define P(a, b, c, d, e, f, g, h, x, K) \ + { \ + temp1 = h + S3(e) + F1(e, f, g) + K + x; \ + temp2 = S2(a) + F0(a, b, c); \ + d += temp1; \ + h = temp1 + temp2; \ + } + A = ctx->state[0]; + B = ctx->state[1]; + C = ctx->state[2]; + D = ctx->state[3]; + E = ctx->state[4]; + F = ctx->state[5]; + G = ctx->state[6]; + H = ctx->state[7]; + P(A, B, C, D, E, F, G, H, W[0], 0x428A2F98); + P(H, A, B, C, D, E, F, G, W[1], 0x71374491); + P(G, H, A, B, C, D, E, F, W[2], 0xB5C0FBCF); + P(F, G, H, A, B, C, D, E, W[3], 0xE9B5DBA5); + P(E, F, G, H, A, B, C, D, W[4], 0x3956C25B); + P(D, E, F, G, H, A, B, C, W[5], 0x59F111F1); + P(C, D, E, F, G, H, A, B, W[6], 0x923F82A4); + P(B, C, D, E, F, G, H, A, W[7], 0xAB1C5ED5); + P(A, B, C, D, E, F, G, H, W[8], 0xD807AA98); + P(H, A, B, C, D, E, F, G, W[9], 0x12835B01); + P(G, H, A, B, C, D, E, F, W[10], 0x243185BE); + P(F, G, H, A, B, C, D, E, W[11], 0x550C7DC3); + P(E, F, G, H, A, B, C, D, W[12], 0x72BE5D74); + P(D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE); + P(C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7); + P(B, C, D, E, F, G, H, A, W[15], 0xC19BF174); + P(A, B, C, D, E, F, G, H, R(16), 0xE49B69C1); + P(H, A, B, C, D, E, F, G, R(17), 0xEFBE4786); + P(G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6); + P(F, G, H, A, B, C, D, E, R(19), 0x240CA1CC); + P(E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F); + P(D, E, F, G, H, A, B, C, R(21), 0x4A7484AA); + P(C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC); + P(B, C, D, E, F, G, H, A, R(23), 0x76F988DA); + P(A, B, C, D, E, F, G, H, R(24), 0x983E5152); + P(H, A, B, C, D, E, F, G, R(25), 0xA831C66D); + P(G, H, A, B, C, D, E, F, R(26), 0xB00327C8); + P(F, G, H, A, B, C, D, E, R(27), 0xBF597FC7); + P(E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3); + P(D, E, F, G, H, A, B, C, R(29), 0xD5A79147); + P(C, D, E, F, G, H, A, B, R(30), 0x06CA6351); + P(B, C, D, E, F, G, H, A, R(31), 0x14292967); + P(A, B, C, D, E, F, G, H, R(32), 0x27B70A85); + P(H, A, B, C, D, E, F, G, R(33), 0x2E1B2138); + P(G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC); + P(F, G, H, A, B, C, D, E, R(35), 0x53380D13); + P(E, F, G, H, A, B, C, D, R(36), 0x650A7354); + P(D, E, F, G, H, A, B, C, R(37), 0x766A0ABB); + P(C, D, E, F, G, H, A, B, R(38), 0x81C2C92E); + P(B, C, D, E, F, G, H, A, R(39), 0x92722C85); + P(A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1); + P(H, A, B, C, D, E, F, G, R(41), 0xA81A664B); + P(G, H, A, B, C, D, E, F, R(42), 0xC24B8B70); + P(F, G, H, A, B, C, D, E, R(43), 0xC76C51A3); + P(E, F, G, H, A, B, C, D, R(44), 0xD192E819); + P(D, E, F, G, H, A, B, C, R(45), 0xD6990624); + P(C, D, E, F, G, H, A, B, R(46), 0xF40E3585); + P(B, C, D, E, F, G, H, A, R(47), 0x106AA070); + P(A, B, C, D, E, F, G, H, R(48), 0x19A4C116); + P(H, A, B, C, D, E, F, G, R(49), 0x1E376C08); + P(G, H, A, B, C, D, E, F, R(50), 0x2748774C); + P(F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5); + P(E, F, G, H, A, B, C, D, R(52), 0x391C0CB3); + P(D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A); + P(C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F); + P(B, C, D, E, F, G, H, A, R(55), 0x682E6FF3); + P(A, B, C, D, E, F, G, H, R(56), 0x748F82EE); + P(H, A, B, C, D, E, F, G, R(57), 0x78A5636F); + P(G, H, A, B, C, D, E, F, R(58), 0x84C87814); + P(F, G, H, A, B, C, D, E, R(59), 0x8CC70208); + P(E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA); + P(D, E, F, G, H, A, B, C, R(61), 0xA4506CEB); + P(C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7); + P(B, C, D, E, F, G, H, A, R(63), 0xC67178F2); + ctx->state[0] += A; + ctx->state[1] += B; + ctx->state[2] += C; + ctx->state[3] += D; + ctx->state[4] += E; + ctx->state[5] += F; + ctx->state[6] += G; + ctx->state[7] += H; +} + +void CRYPT_SHA256Update(CRYPT_sha256_context* ctx, + const uint8_t* input, + uint32_t length) { + if (!length) + return; + + uint32_t left = ctx->total[0] & 0x3F; + uint32_t fill = 64 - left; + ctx->total[0] += length; + ctx->total[0] &= 0xFFFFFFFF; + if (ctx->total[0] < length) { + ctx->total[1]++; + } + if (left && length >= fill) { + FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, fill); + sha256_process(ctx, ctx->buffer); + length -= fill; + input += fill; + left = 0; + } + while (length >= 64) { + sha256_process(ctx, input); + length -= 64; + input += 64; + } + if (length) { + FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length); + } +} + +static const uint8_t sha256_padding[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +void CRYPT_SHA256Finish(CRYPT_sha256_context* ctx, uint8_t digest[32]) { + uint32_t last, padn; + uint32_t high, low; + uint8_t msglen[8]; + high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); + low = (ctx->total[0] << 3); + PUT_UINT32(high, msglen, 0); + PUT_UINT32(low, msglen, 4); + last = ctx->total[0] & 0x3F; + padn = (last < 56) ? (56 - last) : (120 - last); + CRYPT_SHA256Update(ctx, sha256_padding, padn); + CRYPT_SHA256Update(ctx, msglen, 8); + PUT_UINT32(ctx->state[0], digest, 0); + PUT_UINT32(ctx->state[1], digest, 4); + PUT_UINT32(ctx->state[2], digest, 8); + PUT_UINT32(ctx->state[3], digest, 12); + PUT_UINT32(ctx->state[4], digest, 16); + PUT_UINT32(ctx->state[5], digest, 20); + PUT_UINT32(ctx->state[6], digest, 24); + PUT_UINT32(ctx->state[7], digest, 28); +} + +void CRYPT_SHA256Generate(const uint8_t* data, + uint32_t size, + uint8_t digest[32]) { + CRYPT_sha256_context ctx; + CRYPT_SHA256Start(&ctx); + CRYPT_SHA256Update(&ctx, data, size); + CRYPT_SHA256Finish(&ctx, digest); +} + +uint64_t FX_ato64i(const FX_CHAR* str) { + ASSERT(str); + uint64_t ret = 0; + int len = (int)FXSYS_strlen(str); + len = len > 16 ? 16 : len; + for (int i = 0; i < len; ++i) { + if (i) { + ret <<= 4; + } + if (str[i] >= '0' && str[i] <= '9') { + ret |= (str[i] - '0') & 0xFF; + } else if (str[i] >= 'a' && str[i] <= 'f') { + ret |= (str[i] - 'a' + 10) & 0xFF; + } else if (str[i] >= 'A' && str[i] <= 'F') { + ret |= (str[i] - 'A' + 10) & 0xFF; + } else { + ASSERT(false); + } + } + return ret; +} + +void CRYPT_SHA384Start(CRYPT_sha384_context* ctx) { + if (!ctx) + return; + + FXSYS_memset(ctx, 0, sizeof(CRYPT_sha384_context)); + ctx->state[0] = FX_ato64i("cbbb9d5dc1059ed8"); + ctx->state[1] = FX_ato64i("629a292a367cd507"); + ctx->state[2] = FX_ato64i("9159015a3070dd17"); + ctx->state[3] = FX_ato64i("152fecd8f70e5939"); + ctx->state[4] = FX_ato64i("67332667ffc00b31"); + ctx->state[5] = FX_ato64i("8eb44a8768581511"); + ctx->state[6] = FX_ato64i("db0c2e0d64f98fa7"); + ctx->state[7] = FX_ato64i("47b5481dbefa4fa4"); +} + +#define SHA384_F0(x, y, z) ((x & y) | (z & (x | y))) +#define SHA384_F1(x, y, z) (z ^ (x & (y ^ z))) +#define SHA384_SHR(x, n) (x >> n) +#define SHA384_ROTR(x, n) (SHA384_SHR(x, n) | x << (64 - n)) +#define SHA384_S0(x) (SHA384_ROTR(x, 1) ^ SHA384_ROTR(x, 8) ^ SHA384_SHR(x, 7)) +#define SHA384_S1(x) \ + (SHA384_ROTR(x, 19) ^ SHA384_ROTR(x, 61) ^ SHA384_SHR(x, 6)) +#define SHA384_S2(x) \ + (SHA384_ROTR(x, 28) ^ SHA384_ROTR(x, 34) ^ SHA384_ROTR(x, 39)) +#define SHA384_S3(x) \ + (SHA384_ROTR(x, 14) ^ SHA384_ROTR(x, 18) ^ SHA384_ROTR(x, 41)) +#define SHA384_P(a, b, c, d, e, f, g, h, x, K) \ + { \ + temp1 = h + SHA384_S3(e) + SHA384_F1(e, f, g) + K + x; \ + temp2 = SHA384_S2(a) + SHA384_F0(a, b, c); \ + d += temp1; \ + h = temp1 + temp2; \ + } +#define SHA384_R(t) \ + (W[t] = SHA384_S1(W[t - 2]) + W[t - 7] + SHA384_S0(W[t - 15]) + W[t - 16]) + +static const uint8_t sha384_padding[128] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static const FX_CHAR* constants[] = { + "428a2f98d728ae22", "7137449123ef65cd", "b5c0fbcfec4d3b2f", + "e9b5dba58189dbbc", "3956c25bf348b538", "59f111f1b605d019", + "923f82a4af194f9b", "ab1c5ed5da6d8118", "d807aa98a3030242", + "12835b0145706fbe", "243185be4ee4b28c", "550c7dc3d5ffb4e2", + "72be5d74f27b896f", "80deb1fe3b1696b1", "9bdc06a725c71235", + "c19bf174cf692694", "e49b69c19ef14ad2", "efbe4786384f25e3", + "0fc19dc68b8cd5b5", "240ca1cc77ac9c65", "2de92c6f592b0275", + "4a7484aa6ea6e483", "5cb0a9dcbd41fbd4", "76f988da831153b5", + "983e5152ee66dfab", "a831c66d2db43210", "b00327c898fb213f", + "bf597fc7beef0ee4", "c6e00bf33da88fc2", "d5a79147930aa725", + "06ca6351e003826f", "142929670a0e6e70", "27b70a8546d22ffc", + "2e1b21385c26c926", "4d2c6dfc5ac42aed", "53380d139d95b3df", + "650a73548baf63de", "766a0abb3c77b2a8", "81c2c92e47edaee6", + "92722c851482353b", "a2bfe8a14cf10364", "a81a664bbc423001", + "c24b8b70d0f89791", "c76c51a30654be30", "d192e819d6ef5218", + "d69906245565a910", "f40e35855771202a", "106aa07032bbd1b8", + "19a4c116b8d2d0c8", "1e376c085141ab53", "2748774cdf8eeb99", + "34b0bcb5e19b48a8", "391c0cb3c5c95a63", "4ed8aa4ae3418acb", + "5b9cca4f7763e373", "682e6ff3d6b2b8a3", "748f82ee5defb2fc", + "78a5636f43172f60", "84c87814a1f0ab72", "8cc702081a6439ec", + "90befffa23631e28", "a4506cebde82bde9", "bef9a3f7b2c67915", + "c67178f2e372532b", "ca273eceea26619c", "d186b8c721c0c207", + "eada7dd6cde0eb1e", "f57d4f7fee6ed178", "06f067aa72176fba", + "0a637dc5a2c898a6", "113f9804bef90dae", "1b710b35131c471b", + "28db77f523047d84", "32caab7b40c72493", "3c9ebe0a15c9bebc", + "431d67c49c100d4c", "4cc5d4becb3e42b6", "597f299cfc657e2a", + "5fcb6fab3ad6faec", "6c44198c4a475817", +}; +#define GET_FX_64WORD(n, b, i) \ + { \ + (n) = ((uint64_t)(b)[(i)] << 56) | ((uint64_t)(b)[(i) + 1] << 48) | \ + ((uint64_t)(b)[(i) + 2] << 40) | ((uint64_t)(b)[(i) + 3] << 32) | \ + ((uint64_t)(b)[(i) + 4] << 24) | ((uint64_t)(b)[(i) + 5] << 16) | \ + ((uint64_t)(b)[(i) + 6] << 8) | ((uint64_t)(b)[(i) + 7]); \ + } +#define PUT_UINT64(n, b, i) \ + { \ + (b)[(i)] = (uint8_t)((n) >> 56); \ + (b)[(i) + 1] = (uint8_t)((n) >> 48); \ + (b)[(i) + 2] = (uint8_t)((n) >> 40); \ + (b)[(i) + 3] = (uint8_t)((n) >> 32); \ + (b)[(i) + 4] = (uint8_t)((n) >> 24); \ + (b)[(i) + 5] = (uint8_t)((n) >> 16); \ + (b)[(i) + 6] = (uint8_t)((n) >> 8); \ + (b)[(i) + 7] = (uint8_t)((n)); \ + } + +static void sha384_process(CRYPT_sha384_context* ctx, const uint8_t data[128]) { + uint64_t temp1, temp2; + uint64_t A, B, C, D, E, F, G, H; + uint64_t W[80]; + GET_FX_64WORD(W[0], data, 0); + GET_FX_64WORD(W[1], data, 8); + GET_FX_64WORD(W[2], data, 16); + GET_FX_64WORD(W[3], data, 24); + GET_FX_64WORD(W[4], data, 32); + GET_FX_64WORD(W[5], data, 40); + GET_FX_64WORD(W[6], data, 48); + GET_FX_64WORD(W[7], data, 56); + GET_FX_64WORD(W[8], data, 64); + GET_FX_64WORD(W[9], data, 72); + GET_FX_64WORD(W[10], data, 80); + GET_FX_64WORD(W[11], data, 88); + GET_FX_64WORD(W[12], data, 96); + GET_FX_64WORD(W[13], data, 104); + GET_FX_64WORD(W[14], data, 112); + GET_FX_64WORD(W[15], data, 120); + A = ctx->state[0]; + B = ctx->state[1]; + C = ctx->state[2]; + D = ctx->state[3]; + E = ctx->state[4]; + F = ctx->state[5]; + G = ctx->state[6]; + H = ctx->state[7]; + for (int i = 0; i < 10; ++i) { + uint64_t temp[8]; + if (i < 2) { + temp[0] = W[i * 8]; + temp[1] = W[i * 8 + 1]; + temp[2] = W[i * 8 + 2]; + temp[3] = W[i * 8 + 3]; + temp[4] = W[i * 8 + 4]; + temp[5] = W[i * 8 + 5]; + temp[6] = W[i * 8 + 6]; + temp[7] = W[i * 8 + 7]; + } else { + temp[0] = SHA384_R(i * 8); + temp[1] = SHA384_R(i * 8 + 1); + temp[2] = SHA384_R(i * 8 + 2); + temp[3] = SHA384_R(i * 8 + 3); + temp[4] = SHA384_R(i * 8 + 4); + temp[5] = SHA384_R(i * 8 + 5); + temp[6] = SHA384_R(i * 8 + 6); + temp[7] = SHA384_R(i * 8 + 7); + } + SHA384_P(A, B, C, D, E, F, G, H, temp[0], FX_ato64i(constants[i * 8])); + SHA384_P(H, A, B, C, D, E, F, G, temp[1], FX_ato64i(constants[i * 8 + 1])); + SHA384_P(G, H, A, B, C, D, E, F, temp[2], FX_ato64i(constants[i * 8 + 2])); + SHA384_P(F, G, H, A, B, C, D, E, temp[3], FX_ato64i(constants[i * 8 + 3])); + SHA384_P(E, F, G, H, A, B, C, D, temp[4], FX_ato64i(constants[i * 8 + 4])); + SHA384_P(D, E, F, G, H, A, B, C, temp[5], FX_ato64i(constants[i * 8 + 5])); + SHA384_P(C, D, E, F, G, H, A, B, temp[6], FX_ato64i(constants[i * 8 + 6])); + SHA384_P(B, C, D, E, F, G, H, A, temp[7], FX_ato64i(constants[i * 8 + 7])); + } + ctx->state[0] += A; + ctx->state[1] += B; + ctx->state[2] += C; + ctx->state[3] += D; + ctx->state[4] += E; + ctx->state[5] += F; + ctx->state[6] += G; + ctx->state[7] += H; +} + +void CRYPT_SHA384Update(CRYPT_sha384_context* ctx, + const uint8_t* input, + uint32_t length) { + uint32_t left, fill; + if (!length) { + return; + } + left = (uint32_t)ctx->total[0] & 0x7F; + fill = 128 - left; + ctx->total[0] += length; + if (ctx->total[0] < length) { + ctx->total[1]++; + } + if (left && length >= fill) { + FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, fill); + sha384_process(ctx, ctx->buffer); + length -= fill; + input += fill; + left = 0; + } + while (length >= 128) { + sha384_process(ctx, input); + length -= 128; + input += 128; + } + if (length) { + FXSYS_memcpy((void*)(ctx->buffer + left), (void*)input, length); + } +} + +void CRYPT_SHA384Finish(CRYPT_sha384_context* ctx, uint8_t digest[48]) { + uint32_t last, padn; + uint8_t msglen[16]; + FXSYS_memset(msglen, 0, 16); + uint64_t high, low; + high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); + low = (ctx->total[0] << 3); + PUT_UINT64(high, msglen, 0); + PUT_UINT64(low, msglen, 8); + last = (uint32_t)ctx->total[0] & 0x7F; + padn = (last < 112) ? (112 - last) : (240 - last); + CRYPT_SHA384Update(ctx, sha384_padding, padn); + CRYPT_SHA384Update(ctx, msglen, 16); + PUT_UINT64(ctx->state[0], digest, 0); + PUT_UINT64(ctx->state[1], digest, 8); + PUT_UINT64(ctx->state[2], digest, 16); + PUT_UINT64(ctx->state[3], digest, 24); + PUT_UINT64(ctx->state[4], digest, 32); + PUT_UINT64(ctx->state[5], digest, 40); +} + +void CRYPT_SHA384Generate(const uint8_t* data, + uint32_t size, + uint8_t digest[64]) { + CRYPT_sha384_context context; + CRYPT_SHA384Start(&context); + CRYPT_SHA384Update(&context, data, size); + CRYPT_SHA384Finish(&context, digest); +} + +void CRYPT_SHA512Start(void* context) { + if (!context) { + return; + } + CRYPT_sha384_context* ctx = (CRYPT_sha384_context*)context; + FXSYS_memset(ctx, 0, sizeof(CRYPT_sha384_context)); + ctx->state[0] = FX_ato64i("6a09e667f3bcc908"); + ctx->state[1] = FX_ato64i("bb67ae8584caa73b"); + ctx->state[2] = FX_ato64i("3c6ef372fe94f82b"); + ctx->state[3] = FX_ato64i("a54ff53a5f1d36f1"); + ctx->state[4] = FX_ato64i("510e527fade682d1"); + ctx->state[5] = FX_ato64i("9b05688c2b3e6c1f"); + ctx->state[6] = FX_ato64i("1f83d9abfb41bd6b"); + ctx->state[7] = FX_ato64i("5be0cd19137e2179"); +} + +void CRYPT_SHA512Update(void* context, const uint8_t* data, uint32_t size) { + CRYPT_sha384_context* ctx = (CRYPT_sha384_context*)context; + CRYPT_SHA384Update(ctx, data, size); +} + +void CRYPT_SHA512Finish(void* context, uint8_t digest[64]) { + CRYPT_sha384_context* ctx = (CRYPT_sha384_context*)context; + uint32_t last, padn; + uint8_t msglen[16]; + FXSYS_memset(msglen, 0, 16); + uint64_t high, low; + high = (ctx->total[0] >> 29) | (ctx->total[1] << 3); + low = (ctx->total[0] << 3); + PUT_UINT64(high, msglen, 0); + PUT_UINT64(low, msglen, 8); + last = (uint32_t)ctx->total[0] & 0x7F; + padn = (last < 112) ? (112 - last) : (240 - last); + CRYPT_SHA512Update(ctx, sha384_padding, padn); + CRYPT_SHA512Update(ctx, msglen, 16); + PUT_UINT64(ctx->state[0], digest, 0); + PUT_UINT64(ctx->state[1], digest, 8); + PUT_UINT64(ctx->state[2], digest, 16); + PUT_UINT64(ctx->state[3], digest, 24); + PUT_UINT64(ctx->state[4], digest, 32); + PUT_UINT64(ctx->state[5], digest, 40); + PUT_UINT64(ctx->state[6], digest, 48); + PUT_UINT64(ctx->state[7], digest, 56); +} + +void CRYPT_SHA512Generate(const uint8_t* data, + uint32_t size, + uint8_t digest[64]) { + CRYPT_sha384_context context; + CRYPT_SHA512Start(&context); + CRYPT_SHA512Update(&context, data, size); + CRYPT_SHA512Finish(&context, digest); +} + +#ifdef __cplusplus +}; +#endif diff --git a/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt_unittest.cpp b/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt_unittest.cpp new file mode 100644 index 000000000000..4e3da6e18638 --- /dev/null +++ b/modules/pdfium/pdfium/core/fdrm/crypto/fx_crypt_unittest.cpp @@ -0,0 +1,229 @@ +// Copyright (c) 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Originally from chromium's /src/base/md5_unittest.cc. + +#include "core/fdrm/crypto/fx_crypt.h" + +#include +#include + +#include "core/fxcrt/fx_basic.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +std::string CRYPT_ToBase16(const uint8_t* digest) { + static char const zEncode[] = "0123456789abcdef"; + std::string ret; + ret.resize(32); + for (int i = 0, j = 0; i < 16; i++, j += 2) { + uint8_t a = digest[i]; + ret[j] = zEncode[(a >> 4) & 0xf]; + ret[j + 1] = zEncode[a & 0xf]; + } + return ret; +} + +std::string CRYPT_MD5String(const char* str) { + uint8_t digest[16]; + CRYPT_MD5Generate(reinterpret_cast(str), strlen(str), digest); + return CRYPT_ToBase16(digest); +} + +} // namespace + +TEST(FXCRYPT, CRYPT_ToBase16) { + uint8_t data[] = {0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04, + 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e}; + + std::string actual = CRYPT_ToBase16(data); + std::string expected = "d41d8cd98f00b204e9800998ecf8427e"; + + EXPECT_EQ(expected, actual); +} + +TEST(FXCRYPT, MD5GenerateEmtpyData) { + uint8_t digest[16]; + const char data[] = ""; + uint32_t length = static_cast(strlen(data)); + + CRYPT_MD5Generate(reinterpret_cast(data), length, digest); + + uint8_t expected[] = {0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04, + 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e}; + + for (int i = 0; i < 16; ++i) + EXPECT_EQ(expected[i], digest[i]); +} + +TEST(FXCRYPT, MD5GenerateOneByteData) { + uint8_t digest[16]; + const char data[] = "a"; + uint32_t length = static_cast(strlen(data)); + + CRYPT_MD5Generate(reinterpret_cast(data), length, digest); + + uint8_t expected[] = {0x0c, 0xc1, 0x75, 0xb9, 0xc0, 0xf1, 0xb6, 0xa8, + 0x31, 0xc3, 0x99, 0xe2, 0x69, 0x77, 0x26, 0x61}; + + for (int i = 0; i < 16; ++i) + EXPECT_EQ(expected[i], digest[i]); +} + +TEST(FXCRYPT, MD5GenerateLongData) { + const uint32_t length = 10 * 1024 * 1024 + 1; + std::unique_ptr data(new char[length]); + + for (uint32_t i = 0; i < length; ++i) + data[i] = i & 0xFF; + + uint8_t digest[16]; + CRYPT_MD5Generate(reinterpret_cast(data.get()), length, + digest); + + uint8_t expected[] = {0x90, 0xbd, 0x6a, 0xd9, 0x0a, 0xce, 0xf5, 0xad, + 0xaa, 0x92, 0x20, 0x3e, 0x21, 0xc7, 0xa1, 0x3e}; + + for (int i = 0; i < 16; ++i) + EXPECT_EQ(expected[i], digest[i]); +} + +TEST(FXCRYPT, ContextWithEmptyData) { + CRYPT_md5_context ctx; + CRYPT_MD5Start(&ctx); + + uint8_t digest[16]; + CRYPT_MD5Finish(&ctx, digest); + + uint8_t expected[] = {0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04, + 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e}; + + for (int i = 0; i < 16; ++i) + EXPECT_EQ(expected[i], digest[i]); +} + +TEST(FXCRYPT, ContextWithLongData) { + CRYPT_md5_context ctx; + CRYPT_MD5Start(&ctx); + + const uint32_t length = 10 * 1024 * 1024 + 1; + std::unique_ptr data(new uint8_t[length]); + + for (uint32_t i = 0; i < length; ++i) + data[i] = i & 0xFF; + + uint32_t total = 0; + while (total < length) { + uint32_t len = 4097; // intentionally not 2^k. + if (len > length - total) + len = length - total; + + CRYPT_MD5Update(&ctx, data.get() + total, len); + total += len; + } + + EXPECT_EQ(length, total); + + uint8_t digest[16]; + CRYPT_MD5Finish(&ctx, digest); + + uint8_t expected[] = {0x90, 0xbd, 0x6a, 0xd9, 0x0a, 0xce, 0xf5, 0xad, + 0xaa, 0x92, 0x20, 0x3e, 0x21, 0xc7, 0xa1, 0x3e}; + + for (int i = 0; i < 16; ++i) + EXPECT_EQ(expected[i], digest[i]); +} + +// Example data from http://www.ietf.org/rfc/rfc1321.txt A.5 Test Suite +TEST(FXCRYPT, MD5StringTestSuite1) { + std::string actual = CRYPT_MD5String(""); + std::string expected = "d41d8cd98f00b204e9800998ecf8427e"; + EXPECT_EQ(expected, actual); +} + +TEST(FXCRYPT, MD5StringTestSuite2) { + std::string actual = CRYPT_MD5String("a"); + std::string expected = "0cc175b9c0f1b6a831c399e269772661"; + EXPECT_EQ(expected, actual); +} + +TEST(FXCRYPT, MD5StringTestSuite3) { + std::string actual = CRYPT_MD5String("abc"); + std::string expected = "900150983cd24fb0d6963f7d28e17f72"; + EXPECT_EQ(expected, actual); +} + +TEST(FXCRYPT, MD5StringTestSuite4) { + std::string actual = CRYPT_MD5String("message digest"); + std::string expected = "f96b697d7cb7938d525a2f31aaf161d0"; + EXPECT_EQ(expected, actual); +} + +TEST(FXCRYPT, MD5StringTestSuite5) { + std::string actual = CRYPT_MD5String("abcdefghijklmnopqrstuvwxyz"); + std::string expected = "c3fcd3d76192e4007dfb496cca67e13b"; + EXPECT_EQ(expected, actual); +} + +TEST(FXCRYPT, MD5StringTestSuite6) { + std::string actual = CRYPT_MD5String( + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789"); + std::string expected = "d174ab98d277d9f5a5611c2c9f419d9f"; + EXPECT_EQ(expected, actual); +} + +TEST(FXCRYPT, MD5StringTestSuite7) { + std::string actual = CRYPT_MD5String( + "12345678901234567890" + "12345678901234567890" + "12345678901234567890" + "12345678901234567890"); + std::string expected = "57edf4a22be3c955ac49da2e2107b67a"; + EXPECT_EQ(expected, actual); +} + +TEST(FXCRYPT, ContextWithStringData) { + CRYPT_md5_context ctx; + CRYPT_MD5Start(&ctx); + CRYPT_MD5Update(&ctx, reinterpret_cast("abc"), 3); + + uint8_t digest[16]; + CRYPT_MD5Finish(&ctx, digest); + + std::string actual = CRYPT_ToBase16(digest); + std::string expected = "900150983cd24fb0d6963f7d28e17f72"; + EXPECT_EQ(expected, actual); +} + +TEST(FXCRYPT, Sha256TestB1) { + // Example B.1 from FIPS 180-2: one-block message. + const char* input = "abc"; + const uint8_t expected[32] = {0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, + 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, + 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, + 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad}; + uint8_t actual[32]; + CRYPT_SHA256Generate(reinterpret_cast(input), strlen(input), + actual); + for (size_t i = 0; i < 32; ++i) + EXPECT_EQ(expected[i], actual[i]) << " at byte " << i; +} + +TEST(FXCRYPT, Sha256TestB2) { + // Example B.2 from FIPS 180-2: multi-block message. + const char* input = + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; + const uint8_t expected[32] = {0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, + 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39, + 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67, + 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1}; + uint8_t actual[32]; + CRYPT_SHA256Generate(reinterpret_cast(input), strlen(input), + actual); + for (size_t i = 0; i < 32; ++i) + EXPECT_EQ(expected[i], actual[i]) << " at byte " << i; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp new file mode 100644 index 000000000000..c9042399c4a5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp @@ -0,0 +1,2131 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_CNS1CID2Unicode_5[19088] = { + 0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, + 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, + 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, + 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, + 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, + 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, + 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, + 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x00A9, 0x2122, 0x2026, + 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2027, 0xFF1B, 0xFF1A, 0xFF1F, + 0xFF01, 0xFE30, 0x22EF, 0x2025, 0xFE50, 0xFE51, 0xFE52, 0x00B7, 0xFE54, + 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2013, 0xFE31, 0x2014, 0xFFFD, 0xFFFD, + 0xFFFD, 0xFFFD, 0xFF08, 0xFF09, 0xFE35, 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, + 0xFE38, 0x3014, 0x3015, 0xFE39, 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, + 0x300A, 0x300B, 0xFE3D, 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, + 0x300D, 0xFE41, 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44, 0xFE59, 0xFE5A, + 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019, 0x201C, 0x201D, 0x301D, + 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A, 0x203B, 0x00A7, 0x3003, + 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE, 0x2606, 0x2605, 0x25C7, 0x25C6, + 0x25A1, 0x25A0, 0x25BD, 0x25BC, 0x32A3, 0x2105, 0x203E, 0xFFE3, 0xFF3F, + 0x02CD, 0xFE49, 0xFE4A, 0xFE4D, 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, + 0xFE61, 0xFF0B, 0xFF0D, 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, + 0xFF1D, 0x2266, 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63, + 0xFE64, 0xFE65, 0xFE66, 0x223C, 0x2229, 0x222A, 0x22A5, 0x2220, 0x221F, + 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234, 0x2640, 0x2642, + 0x2295, 0x2609, 0x2191, 0x2193, 0x2192, 0x2190, 0x2196, 0x2197, 0x2199, + 0x2198, 0x2225, 0x2223, 0xFF0F, 0xFF3C, 0xFF0F, 0xFF3C, 0xFF04, 0x00A5, + 0x3012, 0x00A2, 0x00A3, 0xFF05, 0xFF20, 0x2103, 0x2109, 0xFE69, 0xFE6A, + 0xFE6B, 0x33D5, 0x339C, 0x339D, 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, + 0x33C4, 0x00B0, 0x5159, 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7, + 0x74E9, 0x7CCE, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, + 0x2588, 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A, 0x2589, 0x253C, + 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500, 0x2502, 0x2595, 0x250C, + 0x2510, 0x2514, 0x2518, 0x256D, 0x256E, 0x2570, 0x256F, 0x2550, 0x255E, + 0x256A, 0x2561, 0x25E2, 0x25E3, 0x25E5, 0x25E4, 0x2571, 0x2572, 0x2573, + 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, + 0xFF19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, + 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, + 0x3028, 0x3029, 0x3038, 0x5344, 0x303A, 0xFF21, 0xFF22, 0xFF23, 0xFF24, + 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, + 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, + 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, + 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, + 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, + 0xFF58, 0xFF59, 0xFF5A, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, + 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, + 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, + 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, + 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x3105, 0x3106, 0x3107, + 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, 0x3110, + 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, + 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, 0x3120, 0x3121, 0x3122, + 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02D9, 0x02CA, + 0x02C7, 0x02CB, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, + 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, + 0x247A, 0x247B, 0x247C, 0x247D, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, + 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x4E28, 0x4E36, 0x4E3F, 0x4E85, + 0x4EA0, 0x5182, 0x5196, 0x51AB, 0x52F9, 0x5338, 0x5369, 0x53B6, 0x5902, + 0x5B80, 0x5DDB, 0x5E7A, 0x5E7F, 0x5EF4, 0x5F50, 0x5F61, 0x6534, 0x65E0, + 0x7592, 0x7676, 0x8FB5, 0x96B6, 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, + 0x2405, 0x2406, 0x2407, 0x2408, 0x2409, 0x240A, 0x240B, 0x240C, 0x240D, + 0x240E, 0x240F, 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, 0x2415, 0x2416, + 0x2417, 0x2418, 0x2419, 0x241A, 0x241B, 0x241C, 0x241D, 0x241E, 0x241F, + 0x2421, 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, 0x4E86, 0x4E8C, + 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, 0x5201, 0x529B, 0x5315, + 0x5341, 0x535C, 0x53C8, 0x4E09, 0x4E0B, 0x4E08, 0x4E0A, 0x4E2B, 0x4E38, + 0x51E1, 0x4E45, 0x4E48, 0x4E5F, 0x4E5E, 0x4E8E, 0x4EA1, 0x5140, 0x5203, + 0x52FA, 0x5343, 0x53C9, 0x53E3, 0x571F, 0x58EB, 0x5915, 0x5927, 0x5973, + 0x5B50, 0x5B51, 0x5B53, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD, + 0x5DE5, 0x5DF1, 0x5DF2, 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, 0x5F13, + 0x624D, 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39, 0x4E4B, 0x5C39, + 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2, 0x4EC1, 0x4EC0, 0x4EC3, + 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, 0x4EC4, 0x5143, 0x5141, 0x5167, + 0x516D, 0x516E, 0x516C, 0x5197, 0x51F6, 0x5206, 0x5207, 0x5208, 0x52FB, + 0x52FE, 0x52FF, 0x5316, 0x5339, 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, + 0x53CB, 0x53CA, 0x53CD, 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, + 0x5C11, 0x5C24, 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15, + 0x5FC3, 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597, 0x65A4, + 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, 0x6BCB, + 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A, 0x7236, 0x723B, 0x7247, + 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19, 0x4E16, 0x4E15, 0x4E14, 0x4E18, + 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E, 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, + 0x4ED7, 0x4EE3, 0x4EE4, 0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, + 0x51AC, 0x51F9, 0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, + 0x5317, 0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E, + 0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8, 0x53FC, + 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1, 0x53F0, 0x53E5, + 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916, 0x592E, 0x5931, 0x5974, 0x5976, + 0x5B55, 0x5B83, 0x5C3C, 0x5DE8, 0x5DE7, 0x5DE6, 0x5E02, 0x5E03, 0x5E73, + 0x5E7C, 0x5F01, 0x5F18, 0x5F17, 0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, + 0x6251, 0x65A5, 0x65E6, 0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63, + 0x6BCD, 0x6C11, 0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF, 0x7384, + 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529, 0x7530, 0x7531, + 0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF, 0x76EE, 0x77DB, 0x77E2, + 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB, 0x4E1E, 0x4E1F, 0x4E52, 0x4E53, + 0x4E69, 0x4E99, 0x4EA4, 0x4EA6, 0x4EA5, 0x4EFF, 0x4F09, 0x4F19, 0x4F0A, + 0x4F15, 0x4F0D, 0x4F10, 0x4F11, 0x4F0F, 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, + 0x4EF3, 0x4EFD, 0x4F01, 0x4F0B, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, + 0x5171, 0x518D, 0x51B0, 0x5217, 0x5211, 0x5212, 0x520E, 0x5216, 0x52A3, + 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540F, 0x540C, 0x540A, + 0x5410, 0x5401, 0x540B, 0x5404, 0x5411, 0x540D, 0x5408, 0x5403, 0x540E, + 0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD, 0x5733, 0x5730, 0x5728, 0x572D, + 0x572C, 0x572F, 0x5729, 0x5919, 0x591A, 0x5937, 0x5938, 0x5984, 0x5978, + 0x5983, 0x597D, 0x5979, 0x5982, 0x5981, 0x5B57, 0x5B58, 0x5B87, 0x5B88, + 0x5B85, 0x5B89, 0x5BFA, 0x5C16, 0x5C79, 0x5DDE, 0x5E06, 0x5E76, 0x5E74, + 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6, 0x620E, 0x620C, 0x620D, 0x6210, 0x6263, + 0x625B, 0x6258, 0x6536, 0x65E9, 0x65E8, 0x65EC, 0x65ED, 0x66F2, 0x66F3, + 0x6709, 0x673D, 0x6734, 0x6731, 0x6735, 0x6B21, 0x6B64, 0x6B7B, 0x6C16, + 0x6C5D, 0x6C57, 0x6C59, 0x6C5F, 0x6C60, 0x6C50, 0x6C55, 0x6C61, 0x6C5B, + 0x6C4D, 0x6C4E, 0x7070, 0x725F, 0x725D, 0x767E, 0x7AF9, 0x7C73, 0x7CF8, + 0x7F36, 0x7F8A, 0x7FBD, 0x8001, 0x8003, 0x800C, 0x8012, 0x8033, 0x807F, + 0x8089, 0x808B, 0x808C, 0x81E3, 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B, + 0x821F, 0x826E, 0x8272, 0x827E, 0x866B, 0x8840, 0x884C, 0x8863, 0x897F, + 0x9621, 0x4E32, 0x4EA8, 0x4F4D, 0x4F4F, 0x4F47, 0x4F57, 0x4F5E, 0x4F34, + 0x4F5B, 0x4F55, 0x4F30, 0x4F50, 0x4F51, 0x4F3D, 0x4F3A, 0x4F38, 0x4F43, + 0x4F54, 0x4F3C, 0x4F46, 0x4F63, 0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, 0x4F36, + 0x4F59, 0x4F5D, 0x4F48, 0x4F5A, 0x514C, 0x514B, 0x514D, 0x5175, 0x51B6, + 0x51B7, 0x5225, 0x5224, 0x5229, 0x522A, 0x5228, 0x52AB, 0x52A9, 0x52AA, + 0x52AC, 0x5323, 0x5373, 0x5375, 0x541D, 0x542D, 0x541E, 0x543E, 0x5426, + 0x544E, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541B, 0x5429, + 0x544A, 0x5439, 0x543B, 0x5438, 0x542E, 0x5435, 0x5436, 0x5420, 0x543C, + 0x5440, 0x5431, 0x542B, 0x541F, 0x542C, 0x56EA, 0x56F0, 0x56E4, 0x56EB, + 0x574A, 0x5751, 0x5740, 0x574D, 0x5747, 0x574E, 0x573E, 0x5750, 0x574F, + 0x573B, 0x58EF, 0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, 0x59A3, 0x5999, + 0x5996, 0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A, + 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, 0x5C40, 0x5C41, 0x5C3F, 0x5C3E, + 0x5C90, 0x5C91, 0x5C94, 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F, 0x5E87, 0x5E8A, + 0x5EF7, 0x5F04, 0x5F1F, 0x5F64, 0x5F62, 0x5F77, 0x5F79, 0x5FD8, 0x5FCC, + 0x5FD7, 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8, 0x5FEA, 0x6212, 0x6211, 0x6284, + 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626D, 0x628A, 0x627C, 0x627E, + 0x6279, 0x6273, 0x6292, 0x626F, 0x6298, 0x626E, 0x6295, 0x6293, 0x6291, + 0x6286, 0x6539, 0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, 0x674E, 0x674F, + 0x6750, 0x6751, 0x675C, 0x6756, 0x675E, 0x6749, 0x6746, 0x6760, 0x6753, + 0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, 0x6C99, 0x6C81, 0x6C88, 0x6C89, + 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, 0x6C90, 0x6C70, 0x6C8C, 0x6C68, 0x6C96, + 0x6C92, 0x6C7D, 0x6C83, 0x6C72, 0x6C7E, 0x6C74, 0x6C86, 0x6C76, 0x6C8D, + 0x6C94, 0x6C98, 0x6C82, 0x7076, 0x707C, 0x707D, 0x7078, 0x7262, 0x7261, + 0x7260, 0x72C4, 0x72C2, 0x7396, 0x752C, 0x752B, 0x7537, 0x7538, 0x7682, + 0x76EF, 0x77E3, 0x79C1, 0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, 0x8096, + 0x8093, 0x809D, 0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, 0x8292, 0x828B, + 0x828D, 0x898B, 0x89D2, 0x8A00, 0x8C37, 0x8C46, 0x8C55, 0x8C9D, 0x8D64, + 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, 0x8FB0, 0x8FC2, 0x8FC6, 0x8FC5, + 0x8FC4, 0x5DE1, 0x9091, 0x90A2, 0x90AA, 0x90A6, 0x90A3, 0x9149, 0x91C6, + 0x91CC, 0x9632, 0x962E, 0x9631, 0x962A, 0x962C, 0x4E26, 0x4E56, 0x4E73, + 0x4E8B, 0x4E9B, 0x4E9E, 0x4EAB, 0x4EAC, 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, + 0x4F7F, 0x4F6C, 0x4F9B, 0x4F8B, 0x4F86, 0x4F83, 0x4F70, 0x4F75, 0x4F88, + 0x4F69, 0x4F7B, 0x4F96, 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, 0x5154, 0x5152, + 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51BD, 0x51FD, 0x523B, 0x5238, + 0x5237, 0x523A, 0x5230, 0x522E, 0x5236, 0x5241, 0x52BE, 0x52BB, 0x5352, + 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, 0x53D6, 0x53D4, + 0x53D7, 0x5473, 0x5475, 0x5496, 0x5478, 0x5495, 0x5480, 0x547B, 0x5477, + 0x5484, 0x5492, 0x5486, 0x547C, 0x5490, 0x5471, 0x5476, 0x548C, 0x549A, + 0x5462, 0x5468, 0x548B, 0x547D, 0x548E, 0x56FA, 0x5783, 0x5777, 0x576A, + 0x5769, 0x5761, 0x5766, 0x5764, 0x577C, 0x591C, 0x5949, 0x5947, 0x5948, + 0x5944, 0x5954, 0x59BE, 0x59BB, 0x59D4, 0x59B9, 0x59AE, 0x59D1, 0x59C6, + 0x59D0, 0x59CD, 0x59CB, 0x59D3, 0x59CA, 0x59AF, 0x59B3, 0x59D2, 0x59C5, + 0x5B5F, 0x5B64, 0x5B63, 0x5B97, 0x5B9A, 0x5B98, 0x5B9C, 0x5B99, 0x5B9B, + 0x5C1A, 0x5C48, 0x5C45, 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, 0x5CAB, + 0x5CB1, 0x5CB3, 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B, 0x5E11, 0x5E78, + 0x5E9A, 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6, 0x5F26, 0x5F27, 0x5F29, + 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, 0x5FE0, 0x5FFD, 0x5FF5, 0x5FFF, + 0x600F, 0x6014, 0x602F, 0x6035, 0x6016, 0x602A, 0x6015, 0x6021, 0x6027, + 0x6029, 0x602B, 0x601B, 0x6216, 0x6215, 0x623F, 0x623E, 0x6240, 0x627F, + 0x62C9, 0x62CC, 0x62C4, 0x62BF, 0x62C2, 0x62B9, 0x62D2, 0x62DB, 0x62AB, + 0x62D3, 0x62D4, 0x62CB, 0x62C8, 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9, + 0x62C7, 0x62CD, 0x62B5, 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7, 0x62C6, + 0x62AC, 0x62CE, 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614, 0x6613, 0x660C, + 0x6606, 0x6602, 0x660E, 0x6600, 0x660F, 0x6615, 0x660A, 0x6607, 0x670D, + 0x670B, 0x676D, 0x678B, 0x6795, 0x6771, 0x679C, 0x6773, 0x6777, 0x6787, + 0x679D, 0x6797, 0x676F, 0x6770, 0x677F, 0x6789, 0x677E, 0x6790, 0x6775, + 0x679A, 0x6793, 0x677C, 0x676A, 0x6772, 0x6B23, 0x6B66, 0x6B67, 0x6B7F, + 0x6C13, 0x6C1B, 0x6CE3, 0x6CE8, 0x6CF3, 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, + 0x6CBD, 0x6CBE, 0x6CBC, 0x6CE2, 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, + 0x6CB9, 0x6CC1, 0x6CAE, 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, 0x6CE1, + 0x6CDB, 0x6CCA, 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, 0x7095, 0x708E, + 0x7092, 0x708A, 0x7099, 0x722C, 0x722D, 0x7238, 0x7248, 0x7267, 0x7269, + 0x72C0, 0x72CE, 0x72D9, 0x72D7, 0x72D0, 0x73A9, 0x73A8, 0x739F, 0x73AB, + 0x73A5, 0x753D, 0x759D, 0x7599, 0x759A, 0x7684, 0x76C2, 0x76F2, 0x76F4, + 0x77E5, 0x77FD, 0x793E, 0x7940, 0x7941, 0x79C9, 0x79C8, 0x7A7A, 0x7A79, + 0x7AFA, 0x7CFE, 0x7F54, 0x7F8C, 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2, + 0x80B1, 0x80A1, 0x80AB, 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5, 0x81FE, + 0x820D, 0x82B3, 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F, 0x82B9, 0x82B1, + 0x82AC, 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0, 0x82BE, 0x82B7, 0x864E, + 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE, 0x8FD4, 0x8FD1, 0x90B5, 0x90B8, + 0x90B1, 0x90B6, 0x91C7, 0x91D1, 0x9577, 0x9580, 0x961C, 0x9640, 0x963F, + 0x963B, 0x9644, 0x9642, 0x96B9, 0x96E8, 0x9752, 0x975E, 0x4E9F, 0x4EAD, + 0x4EAE, 0x4FE1, 0x4FB5, 0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD, + 0x4FC3, 0x4FB6, 0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0, 0x4FC4, + 0x4FC2, 0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, 0x5157, 0x5192, 0x5191, 0x51A0, + 0x524E, 0x5243, 0x524A, 0x524D, 0x524C, 0x524B, 0x5247, 0x52C7, 0x52C9, + 0x52C3, 0x52C1, 0x530D, 0x5357, 0x537B, 0x539A, 0x53DB, 0x54AC, 0x54C0, + 0x54A8, 0x54CE, 0x54C9, 0x54B8, 0x54A6, 0x54B3, 0x54C7, 0x54C2, 0x54BD, + 0x54AA, 0x54C1, 0x54C4, 0x54C8, 0x54AF, 0x54AB, 0x54B1, 0x54BB, 0x54A9, + 0x54A7, 0x54BF, 0x56FF, 0x5782, 0x578B, 0x57A0, 0x57A3, 0x57A2, 0x57CE, + 0x57AE, 0x5793, 0x5955, 0x5951, 0x594F, 0x594E, 0x5950, 0x59DC, 0x59D8, + 0x59FF, 0x59E3, 0x59E8, 0x5A03, 0x59E5, 0x59EA, 0x59DA, 0x59E6, 0x5A01, + 0x59FB, 0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, + 0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, 0x5E1F, + 0x5E7D, 0x5EA0, 0x5EA6, 0x5EFA, 0x5F08, 0x5F2D, 0x5F65, 0x5F88, 0x5F85, + 0x5F8A, 0x5F8B, 0x5F87, 0x5F8C, 0x5F89, 0x6012, 0x601D, 0x6020, 0x6025, + 0x600E, 0x6028, 0x604D, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606C, + 0x606B, 0x606A, 0x6064, 0x6241, 0x62DC, 0x6316, 0x6309, 0x62FC, 0x62ED, + 0x6301, 0x62EE, 0x62FD, 0x6307, 0x62F1, 0x62F7, 0x62EF, 0x62EC, 0x62FE, + 0x62F4, 0x6311, 0x6302, 0x653F, 0x6545, 0x65AB, 0x65BD, 0x65E2, 0x6625, + 0x662D, 0x6620, 0x6627, 0x662F, 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7, + 0x67FF, 0x67D3, 0x67F1, 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF, 0x67F5, + 0x67E9, 0x67EF, 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5, 0x67B8, 0x67CF, + 0x67DE, 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD, 0x67D2, 0x6B6A, 0x6B83, + 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, 0x6CC9, 0x6D0B, 0x6D32, 0x6D2A, + 0x6D41, 0x6D25, 0x6D0C, 0x6D31, 0x6D1E, 0x6D17, 0x6D3B, 0x6D3D, 0x6D3E, + 0x6D36, 0x6D1B, 0x6CF5, 0x6D39, 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, + 0x6D0E, 0x6D2B, 0x70AB, 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, + 0x70AE, 0x70A4, 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1, + 0x73B7, 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A, 0x752D, + 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5, 0x75A2, 0x75A3, + 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6, 0x76C3, 0x76C5, 0x7701, + 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE, 0x76FC, 0x7707, 0x77DC, 0x7802, + 0x7814, 0x780C, 0x780D, 0x7946, 0x7949, 0x7948, 0x7947, 0x79B9, 0x79BA, + 0x79D1, 0x79D2, 0x79CB, 0x7A7F, 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, + 0x7D05, 0x7D00, 0x7D09, 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, + 0x8010, 0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3, 0x80C4, + 0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD, 0x81F4, 0x8222, + 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6, 0x8304, 0x82E5, 0x8302, + 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301, 0x82DC, 0x82D4, 0x82D1, 0x82DE, + 0x82D3, 0x82DF, 0x82EF, 0x8306, 0x8650, 0x8679, 0x867B, 0x867A, 0x884D, + 0x886B, 0x8981, 0x89D4, 0x8A08, 0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, + 0x8D73, 0x8DB4, 0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5, + 0x8FED, 0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1, 0x90C3, 0x914B, + 0x914A, 0x91CD, 0x9582, 0x9650, 0x964B, 0x964C, 0x964D, 0x9762, 0x9769, + 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8, 0x98DB, 0x98DF, 0x9996, 0x9999, + 0x4E58, 0x4EB3, 0x500C, 0x500D, 0x5023, 0x4FEF, 0x5026, 0x5025, 0x4FF8, + 0x5029, 0x5016, 0x5006, 0x503C, 0x501F, 0x501A, 0x5012, 0x5011, 0x4FFA, + 0x5000, 0x5014, 0x5028, 0x4FF1, 0x5021, 0x500B, 0x5019, 0x5018, 0x4FF3, + 0x4FEE, 0x502D, 0x502A, 0x4FFE, 0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5, + 0x51A2, 0x51CD, 0x51CC, 0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254, 0x525B, + 0x525D, 0x532A, 0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8, 0x5510, 0x5501, + 0x5537, 0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA, 0x5514, 0x54E9, 0x54ED, + 0x54E1, 0x5509, 0x54EE, 0x54EA, 0x54E6, 0x5527, 0x5507, 0x54FD, 0x550F, + 0x5703, 0x5704, 0x57C2, 0x57D4, 0x57CB, 0x57C3, 0x5809, 0x590F, 0x5957, + 0x5958, 0x595A, 0x5A11, 0x5A18, 0x5A1C, 0x5A1F, 0x5A1B, 0x5A13, 0x59EC, + 0x5A20, 0x5A23, 0x5A29, 0x5A25, 0x5A0C, 0x5A09, 0x5B6B, 0x5C58, 0x5BB0, + 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, 0x5C04, 0x5C51, + 0x5C55, 0x5C50, 0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8, 0x5CF0, 0x5CF6, + 0x5D01, 0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB, 0x5EAD, 0x5EA7, 0x5F31, + 0x5F92, 0x5F91, 0x5F90, 0x6059, 0x6063, 0x6065, 0x6050, 0x6055, 0x606D, + 0x6069, 0x606F, 0x6084, 0x609F, 0x609A, 0x608D, 0x6094, 0x608C, 0x6085, + 0x6096, 0x6247, 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E, 0x632F, 0x6355, + 0x6342, 0x6346, 0x634F, 0x6349, 0x633A, 0x6350, 0x633D, 0x632A, 0x632B, + 0x6328, 0x634D, 0x634C, 0x6548, 0x6549, 0x6599, 0x65C1, 0x65C5, 0x6642, + 0x6649, 0x664F, 0x6643, 0x6652, 0x664C, 0x6645, 0x6641, 0x66F8, 0x6714, + 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, + 0x6854, 0x6829, 0x68B3, 0x6817, 0x684C, 0x6851, 0x683D, 0x67F4, 0x6850, + 0x6840, 0x683C, 0x6843, 0x682A, 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A, + 0x6B89, 0x6BB7, 0x6C23, 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0, 0x6D6A, + 0x6D95, 0x6D88, 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59, 0x6D93, 0x6D6C, + 0x6D89, 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C, 0x6D8A, 0x6D79, 0x6D85, + 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4, 0x70D9, 0x70C8, 0x70CF, 0x7239, + 0x7279, 0x72FC, 0x72F9, 0x72FD, 0x72F8, 0x72F7, 0x7386, 0x73ED, 0x7409, + 0x73EE, 0x73E0, 0x73EA, 0x73DE, 0x7554, 0x755D, 0x755C, 0x755A, 0x7559, + 0x75BE, 0x75C5, 0x75C7, 0x75B2, 0x75B3, 0x75BD, 0x75BC, 0x75B9, 0x75C2, + 0x75B8, 0x768B, 0x76B0, 0x76CA, 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720, + 0x7728, 0x77E9, 0x7830, 0x7827, 0x7838, 0x781D, 0x7834, 0x7837, 0x7825, + 0x782D, 0x7820, 0x781F, 0x7832, 0x7955, 0x7950, 0x7960, 0x795F, 0x7956, + 0x795E, 0x795D, 0x7957, 0x795A, 0x79E4, 0x79E3, 0x79E7, 0x79DF, 0x79E6, + 0x79E9, 0x79D8, 0x7A84, 0x7A88, 0x7AD9, 0x7B06, 0x7B11, 0x7C89, 0x7D21, + 0x7D17, 0x7D0B, 0x7D0A, 0x7D20, 0x7D22, 0x7D14, 0x7D10, 0x7D15, 0x7D1A, + 0x7D1C, 0x7D0D, 0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, 0x7FC5, 0x7FC1, + 0x8006, 0x8004, 0x8018, 0x8015, 0x8019, 0x8017, 0x803D, 0x803F, 0x80F1, + 0x8102, 0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, 0x80F8, 0x80F3, 0x8108, + 0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, 0x81EC, 0x8200, 0x8210, 0x822A, + 0x822B, 0x8228, 0x822C, 0x82BB, 0x832B, 0x8352, 0x8354, 0x834A, 0x8338, + 0x8350, 0x8349, 0x8335, 0x8334, 0x834F, 0x8332, 0x8339, 0x8336, 0x8317, + 0x8340, 0x8331, 0x8328, 0x8343, 0x8654, 0x868A, 0x86AA, 0x8693, 0x86A4, + 0x86A9, 0x868C, 0x86A3, 0x869C, 0x8870, 0x8877, 0x8881, 0x8882, 0x887D, + 0x8879, 0x8A18, 0x8A10, 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, 0x8A13, + 0x8A16, 0x8A0F, 0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, 0x8CA2, 0x8D77, + 0x8EAC, 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, 0x9006, 0x8FF7, 0x9000, + 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, 0x8FF8, 0x9095, 0x90E1, 0x90DD, + 0x90E2, 0x9152, 0x914D, 0x914C, 0x91D8, 0x91DD, 0x91D7, 0x91DC, 0x91D9, + 0x9583, 0x9662, 0x9663, 0x9661, 0x965B, 0x965D, 0x9664, 0x9658, 0x965E, + 0x96BB, 0x98E2, 0x99AC, 0x9AA8, 0x9AD8, 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, + 0x507A, 0x507D, 0x505C, 0x5047, 0x5043, 0x504C, 0x505A, 0x5049, 0x5065, + 0x5076, 0x504E, 0x5055, 0x5075, 0x5074, 0x5077, 0x504F, 0x500F, 0x506F, + 0x506D, 0x515C, 0x5195, 0x51F0, 0x526A, 0x526F, 0x52D2, 0x52D9, 0x52D8, + 0x52D5, 0x5310, 0x530F, 0x5319, 0x533F, 0x5340, 0x533E, 0x53C3, 0x66FC, + 0x5546, 0x556A, 0x5566, 0x5544, 0x555E, 0x5561, 0x5543, 0x554A, 0x5531, + 0x5556, 0x554F, 0x5555, 0x552F, 0x5564, 0x5538, 0x552E, 0x555C, 0x552C, + 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570B, 0x5709, 0x57DF, 0x5805, + 0x580A, 0x5806, 0x57E0, 0x57E4, 0x57FA, 0x5802, 0x5835, 0x57F7, 0x57F9, + 0x5920, 0x5962, 0x5A36, 0x5A41, 0x5A49, 0x5A66, 0x5A6A, 0x5A40, 0x5A3C, + 0x5A62, 0x5A5A, 0x5A46, 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, 0x5BC4, 0x5BC2, + 0x5BBF, 0x5BC6, 0x5C09, 0x5C08, 0x5C07, 0x5C60, 0x5C5C, 0x5C5D, 0x5D07, + 0x5D06, 0x5D0E, 0x5D1B, 0x5D16, 0x5D22, 0x5D11, 0x5D29, 0x5D14, 0x5D19, + 0x5D24, 0x5D27, 0x5D17, 0x5DE2, 0x5E38, 0x5E36, 0x5E33, 0x5E37, 0x5EB7, + 0x5EB8, 0x5EB6, 0x5EB5, 0x5EBE, 0x5F35, 0x5F37, 0x5F57, 0x5F6C, 0x5F69, + 0x5F6B, 0x5F97, 0x5F99, 0x5F9E, 0x5F98, 0x5FA1, 0x5FA0, 0x5F9C, 0x607F, + 0x60A3, 0x6089, 0x60A0, 0x60A8, 0x60CB, 0x60B4, 0x60E6, 0x60BD, 0x60C5, + 0x60BB, 0x60B5, 0x60DC, 0x60BC, 0x60D8, 0x60D5, 0x60C6, 0x60DF, 0x60B8, + 0x60DA, 0x60C7, 0x621A, 0x621B, 0x6248, 0x63A0, 0x63A7, 0x6372, 0x6396, + 0x63A2, 0x63A5, 0x6377, 0x6367, 0x6398, 0x63AA, 0x6371, 0x63A9, 0x6389, + 0x6383, 0x639B, 0x636B, 0x63A8, 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC, + 0x6392, 0x638F, 0x6380, 0x637B, 0x6369, 0x6368, 0x637A, 0x655D, 0x6556, + 0x6551, 0x6559, 0x6557, 0x555F, 0x654F, 0x6558, 0x6555, 0x6554, 0x659C, + 0x659B, 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE, 0x665D, 0x665A, 0x6664, + 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7, 0x671B, 0x6881, 0x68AF, 0x68A2, + 0x6893, 0x68B5, 0x687F, 0x6876, 0x68B1, 0x68A7, 0x6897, 0x68B0, 0x6883, + 0x68C4, 0x68AD, 0x6886, 0x6885, 0x6894, 0x689D, 0x68A8, 0x689F, 0x68A1, + 0x6882, 0x6B32, 0x6BBA, 0x6BEB, 0x6BEC, 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, + 0x6DD9, 0x6DB2, 0x6DE1, 0x6DCC, 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, + 0x6DCB, 0x6DAF, 0x6DD1, 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, 0x6DF5, + 0x6DC5, 0x6DD2, 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, 0x6DEA, 0x6DF1, + 0x6DEE, 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, 0x6DBF, 0x6DE6, 0x70F9, + 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D, 0x727D, 0x7281, 0x731C, 0x731B, + 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740A, 0x7403, 0x7406, 0x73FE, + 0x740D, 0x74E0, 0x74F6, 0x74F7, 0x751C, 0x7522, 0x7565, 0x7566, 0x7562, + 0x7570, 0x758F, 0x75D4, 0x75D5, 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4, + 0x76D2, 0x76DB, 0x7737, 0x773E, 0x773C, 0x7736, 0x7738, 0x773A, 0x786B, + 0x7843, 0x784E, 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92, 0x7A95, 0x7B20, + 0x7B28, 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E, 0x7B2E, 0x7C92, 0x7C97, + 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E, 0x7D39, 0x7D3C, 0x7D40, 0x7D30, + 0x7D33, 0x7D44, 0x7D2F, 0x7D42, 0x7D32, 0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, + 0x7FCC, 0x7FCE, 0x7FD2, 0x801C, 0x804A, 0x8046, 0x812F, 0x8116, 0x8123, + 0x812B, 0x8129, 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, + 0x838E, 0x839E, 0x8398, 0x8378, 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392, + 0x838A, 0x8393, 0x8389, 0x83A0, 0x8377, 0x837B, 0x837C, 0x8386, 0x83A7, + 0x8655, 0x5F6A, 0x86C7, 0x86C0, 0x86B6, 0x86C4, 0x86B5, 0x86C6, 0x86CB, + 0x86B1, 0x86AF, 0x86C9, 0x8853, 0x889E, 0x8888, 0x88AB, 0x8892, 0x8896, + 0x888D, 0x888B, 0x8993, 0x898F, 0x8A2A, 0x8A1D, 0x8A23, 0x8A25, 0x8A31, + 0x8A2D, 0x8A1F, 0x8A1B, 0x8A22, 0x8C49, 0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, + 0x8CA8, 0x8CAA, 0x8CA7, 0x8D67, 0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, 0x8EDF, + 0x9019, 0x900D, 0x901A, 0x9017, 0x9023, 0x901F, 0x901D, 0x9010, 0x9015, + 0x901E, 0x9020, 0x900F, 0x9022, 0x9016, 0x901B, 0x9014, 0x90E8, 0x90ED, + 0x90FD, 0x9157, 0x91CE, 0x91F5, 0x91E6, 0x91E3, 0x91E7, 0x91ED, 0x91E9, + 0x9589, 0x966A, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, + 0x966C, 0x96C0, 0x96EA, 0x96E9, 0x7AE0, 0x7ADF, 0x9802, 0x9803, 0x9B5A, + 0x9CE5, 0x9E75, 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, 0x508D, 0x5085, 0x5099, + 0x5091, 0x5080, 0x5096, 0x5098, 0x509A, 0x6700, 0x51F1, 0x5272, 0x5274, + 0x5275, 0x5269, 0x52DE, 0x52DD, 0x52DB, 0x535A, 0x53A5, 0x557B, 0x5580, + 0x55A7, 0x557C, 0x558A, 0x559D, 0x5598, 0x5582, 0x559C, 0x55AA, 0x5594, + 0x5587, 0x558B, 0x5583, 0x55B3, 0x55AE, 0x559F, 0x553E, 0x55B2, 0x559A, + 0x55BB, 0x55AC, 0x55B1, 0x557E, 0x5589, 0x55AB, 0x5599, 0x570D, 0x582F, + 0x582A, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581D, 0x5820, 0x58F9, + 0x58FA, 0x5960, 0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, 0x5AA7, 0x5B73, + 0x5B71, 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, 0x5C0B, 0x5C31, 0x5D4C, + 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45, 0x5E3D, 0x5E40, 0x5E43, 0x5E7E, + 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, 0x5F3C, 0x5F6D, 0x5FA9, 0x5FAA, 0x5FA8, + 0x60D1, 0x60E1, 0x60B2, 0x60B6, 0x60E0, 0x611C, 0x6123, 0x60FA, 0x6115, + 0x60F0, 0x60FB, 0x60F4, 0x6168, 0x60F1, 0x610E, 0x60F6, 0x6109, 0x6100, + 0x6112, 0x621F, 0x6249, 0x63A3, 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9, + 0x63C6, 0x63CD, 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED, 0x63EE, + 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9, 0x655E, 0x6566, + 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E, 0x6670, 0x6674, 0x6676, + 0x666F, 0x6691, 0x667A, 0x667E, 0x6677, 0x66FE, 0x66FF, 0x671F, 0x671D, + 0x68FA, 0x68D5, 0x68E0, 0x68D8, 0x68D7, 0x6905, 0x68DF, 0x68F5, 0x68EE, + 0x68E7, 0x68F9, 0x68D2, 0x68F2, 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, + 0x690E, 0x68C9, 0x68DA, 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, + 0x6B96, 0x6BBC, 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54, + 0x6E21, 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B, 0x6E5B, + 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, 0x6E34, 0x6E4D, + 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB, 0x6E89, 0x6E19, 0x6E4E, + 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F, 0x7119, 0x711A, 0x7126, 0x7130, + 0x7121, 0x7136, 0x716E, 0x711C, 0x724C, 0x7284, 0x7280, 0x7336, 0x7325, + 0x7334, 0x7329, 0x743A, 0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, + 0x7434, 0x742F, 0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, + 0x75E2, 0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C, + 0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C, 0x786F, + 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98, 0x7A97, 0x7A96, 0x7AE5, + 0x7AE3, 0x7B49, 0x7B56, 0x7B46, 0x7B50, 0x7B52, 0x7B54, 0x7B4D, 0x7B4B, + 0x7B4F, 0x7B51, 0x7C9F, 0x7CA5, 0x7D5E, 0x7D50, 0x7D68, 0x7D55, 0x7D2B, + 0x7D6E, 0x7D72, 0x7D61, 0x7D66, 0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, + 0x7FD5, 0x800B, 0x8052, 0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E, + 0x8139, 0x8146, 0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C, 0x83E9, + 0x8403, 0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1, 0x83EF, 0x83F1, + 0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC, 0x83FD, 0x83F2, 0x83CA, + 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407, 0x83D4, 0x83DF, 0x865B, 0x86DF, + 0x86D9, 0x86ED, 0x86D4, 0x86DB, 0x86E4, 0x86D0, 0x86DE, 0x8857, 0x88C1, + 0x88C2, 0x88B1, 0x8983, 0x8996, 0x8A3B, 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, + 0x8A41, 0x8A54, 0x8A5B, 0x8A50, 0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56, + 0x8C61, 0x8C82, 0x8CAF, 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB, 0x8CC0, + 0x8CB4, 0x8CB7, 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85, 0x8D81, 0x8DCE, + 0x8DDD, 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB, 0x8DC6, 0x8EFB, 0x8EF8, + 0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031, 0x9038, 0x9032, 0x9036, 0x9102, + 0x90F5, 0x9109, 0x90FE, 0x9163, 0x9165, 0x91CF, 0x9214, 0x9215, 0x9223, + 0x9209, 0x921E, 0x920D, 0x9210, 0x9207, 0x9211, 0x9594, 0x958F, 0x958B, + 0x9591, 0x9593, 0x9592, 0x958E, 0x968A, 0x968E, 0x968B, 0x967D, 0x9685, + 0x9686, 0x968D, 0x9672, 0x9684, 0x96C1, 0x96C5, 0x96C4, 0x96C6, 0x96C7, + 0x96EF, 0x96F2, 0x97CC, 0x9805, 0x9806, 0x9808, 0x98E7, 0x98EA, 0x98EF, + 0x98E9, 0x98F2, 0x98ED, 0x99AE, 0x99AD, 0x9EC3, 0x9ECD, 0x9ED1, 0x4E82, + 0x50AD, 0x50B5, 0x50B2, 0x50B3, 0x50C5, 0x50BE, 0x50AC, 0x50B7, 0x50BB, + 0x50AF, 0x50C7, 0x527F, 0x5277, 0x527D, 0x52DF, 0x52E6, 0x52E4, 0x52E2, + 0x52E3, 0x532F, 0x55DF, 0x55E8, 0x55D3, 0x55E6, 0x55CE, 0x55DC, 0x55C7, + 0x55D1, 0x55E3, 0x55E4, 0x55EF, 0x55DA, 0x55E1, 0x55C5, 0x55C6, 0x55E5, + 0x55C9, 0x5712, 0x5713, 0x585E, 0x5851, 0x5858, 0x5857, 0x585A, 0x5854, + 0x586B, 0x584C, 0x586D, 0x584A, 0x5862, 0x5852, 0x584B, 0x5967, 0x5AC1, + 0x5AC9, 0x5ACC, 0x5ABE, 0x5ABD, 0x5ABC, 0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, + 0x5D6F, 0x5E4C, 0x5E79, 0x5EC9, 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, 0x5FAE, + 0x611A, 0x610F, 0x6148, 0x611F, 0x60F3, 0x611B, 0x60F9, 0x6101, 0x6108, + 0x614E, 0x614C, 0x6144, 0x614D, 0x613E, 0x6134, 0x6127, 0x610D, 0x6106, + 0x6137, 0x6221, 0x6222, 0x6413, 0x643E, 0x641E, 0x642A, 0x642D, 0x643D, + 0x642C, 0x640F, 0x641C, 0x6414, 0x640D, 0x6436, 0x6416, 0x6417, 0x6406, + 0x656C, 0x659F, 0x65B0, 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, + 0x6698, 0x668D, 0x6703, 0x6994, 0x696D, 0x695A, 0x6977, 0x6960, 0x6954, + 0x6975, 0x6930, 0x6982, 0x694A, 0x6968, 0x696B, 0x695E, 0x6953, 0x6979, + 0x6986, 0x695D, 0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, 0x6BBF, 0x6BD3, + 0x6BFD, 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7, + 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96, 0x6E9C, + 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, 0x6EB4, 0x714E, 0x7159, 0x7169, 0x7164, + 0x7149, 0x7167, 0x715C, 0x716C, 0x7166, 0x714C, 0x7165, 0x715E, 0x7146, + 0x7168, 0x7156, 0x723A, 0x7252, 0x7337, 0x7345, 0x733F, 0x733E, 0x746F, + 0x745A, 0x7455, 0x745F, 0x745E, 0x7441, 0x743F, 0x7459, 0x745B, 0x745C, + 0x7576, 0x7578, 0x7600, 0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, 0x75FF, + 0x75F4, 0x75F3, 0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, 0x775E, 0x7763, + 0x7779, 0x776A, 0x776C, 0x775C, 0x7765, 0x7768, 0x7762, 0x77EE, 0x788E, + 0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, 0x787C, 0x7891, 0x7893, 0x787F, + 0x797A, 0x797F, 0x7981, 0x842C, 0x79BD, 0x7A1C, 0x7A1A, 0x7A20, 0x7A14, + 0x7A1F, 0x7A1E, 0x7A9F, 0x7AA0, 0x7B77, 0x7BC0, 0x7B60, 0x7B6E, 0x7B67, + 0x7CB1, 0x7CB3, 0x7CB5, 0x7D93, 0x7D79, 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, + 0x7F6E, 0x7F69, 0x7F6A, 0x7F72, 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, + 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816E, 0x8173, 0x816B, + 0x8179, 0x817A, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843D, 0x8431, + 0x8475, 0x8466, 0x846B, 0x8449, 0x846C, 0x845B, 0x843C, 0x8435, 0x8461, + 0x8463, 0x8469, 0x846D, 0x8446, 0x865E, 0x865C, 0x865F, 0x86F9, 0x8713, + 0x8708, 0x8707, 0x8700, 0x86FE, 0x86FB, 0x8702, 0x8703, 0x8706, 0x870A, + 0x8859, 0x88DF, 0x88D4, 0x88D9, 0x88DC, 0x88D8, 0x88DD, 0x88E1, 0x88CA, + 0x88D5, 0x88D2, 0x899C, 0x89E3, 0x8A6B, 0x8A72, 0x8A73, 0x8A66, 0x8A69, + 0x8A70, 0x8A87, 0x8A7C, 0x8A63, 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, 0x8A62, + 0x8A6E, 0x8A6C, 0x8A79, 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, 0x8C8A, 0x8C89, + 0x8CCA, 0x8CC7, 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, 0x8CC2, 0x8CC5, 0x8DE1, + 0x8DDF, 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, 0x8DEA, 0x8DE4, 0x8DE6, 0x8EB2, + 0x8F03, 0x8F09, 0x8EFE, 0x8F0A, 0x8F9F, 0x8FB2, 0x904B, 0x904A, 0x9053, + 0x9042, 0x9054, 0x903C, 0x9055, 0x9050, 0x9047, 0x904F, 0x904E, 0x904D, + 0x9051, 0x903E, 0x9041, 0x9112, 0x9117, 0x916C, 0x916A, 0x9169, 0x91C9, + 0x9237, 0x9257, 0x9238, 0x923D, 0x9240, 0x923E, 0x925B, 0x924B, 0x9264, + 0x9251, 0x9234, 0x9249, 0x924D, 0x9245, 0x9239, 0x923F, 0x925A, 0x9598, + 0x9698, 0x9694, 0x9695, 0x96CD, 0x96CB, 0x96C9, 0x96CA, 0x96F7, 0x96FB, + 0x96F9, 0x96F6, 0x9756, 0x9774, 0x9776, 0x9810, 0x9811, 0x9813, 0x980A, + 0x9812, 0x980C, 0x98FC, 0x98F4, 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4, + 0x9AE1, 0x9CE9, 0x9E82, 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE, 0x50E5, + 0x50D6, 0x50ED, 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1, 0x50CE, 0x50E9, + 0x5162, 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD, 0x55FE, 0x5600, 0x561B, + 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609, 0x560D, 0x560E, 0x55F7, 0x5616, + 0x561F, 0x5608, 0x5610, 0x55F6, 0x5718, 0x5716, 0x5875, 0x587E, 0x5883, + 0x5893, 0x588A, 0x5879, 0x5885, 0x587D, 0x58FD, 0x5925, 0x5922, 0x5924, + 0x596A, 0x5969, 0x5AE1, 0x5AE6, 0x5AE9, 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, + 0x5B75, 0x5BDE, 0x5BE7, 0x5BE1, 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, + 0x5BDF, 0x5C0D, 0x5C62, 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55, 0x5E57, + 0x5E54, 0x5ED3, 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9, 0x6147, 0x613F, + 0x614B, 0x6177, 0x6162, 0x6163, 0x615F, 0x615A, 0x6158, 0x6175, 0x622A, + 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478, 0x645F, 0x647A, 0x6451, 0x6467, + 0x6434, 0x646D, 0x647B, 0x6572, 0x65A1, 0x65D7, 0x65D6, 0x66A2, 0x66A8, + 0x669D, 0x699C, 0x69A8, 0x6995, 0x69C1, 0x69AE, 0x69D3, 0x69CB, 0x699B, + 0x69B7, 0x69BB, 0x69AB, 0x69B4, 0x69D0, 0x69CD, 0x69AD, 0x69CC, 0x69A6, + 0x69C3, 0x69A3, 0x6B49, 0x6B4C, 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13, + 0x6EF4, 0x6F29, 0x6F3E, 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22, 0x6EFF, + 0x6EEF, 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23, 0x6F15, 0x6F2B, 0x6F2F, + 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2, 0x6ECC, 0x6EF7, 0x7194, 0x7199, + 0x717D, 0x718A, 0x7184, 0x7192, 0x723E, 0x7292, 0x7296, 0x7344, 0x7350, + 0x7464, 0x7463, 0x746A, 0x7470, 0x746D, 0x7504, 0x7591, 0x7627, 0x760D, + 0x760B, 0x7609, 0x7613, 0x76E1, 0x76E3, 0x7784, 0x777D, 0x777F, 0x7761, + 0x78C1, 0x789F, 0x78A7, 0x78B3, 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D, + 0x7A2E, 0x7A31, 0x7AAA, 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95, 0x7B8B, + 0x7B75, 0x7B97, 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87, 0x7B84, 0x7CB9, + 0x7CBD, 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD, 0x7DBE, 0x7DA0, 0x7DCA, + 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2, 0x7DBF, 0x7DB5, 0x7DB8, 0x7DAD, + 0x7DD2, 0x7DC7, 0x7DAC, 0x7F70, 0x7FE0, 0x7FE1, 0x7FDF, 0x805E, 0x805A, + 0x8087, 0x8150, 0x8180, 0x818F, 0x8188, 0x818A, 0x817F, 0x8182, 0x81E7, + 0x81FA, 0x8207, 0x8214, 0x821E, 0x824B, 0x84C9, 0x84BF, 0x84C6, 0x84C4, + 0x8499, 0x849E, 0x84B2, 0x849C, 0x84CB, 0x84B8, 0x84C0, 0x84D3, 0x8490, + 0x84BC, 0x84D1, 0x84CA, 0x873F, 0x871C, 0x873B, 0x8722, 0x8725, 0x8734, + 0x8718, 0x8755, 0x8737, 0x8729, 0x88F3, 0x8902, 0x88F4, 0x88F9, 0x88F8, + 0x88FD, 0x88E8, 0x891A, 0x88EF, 0x8AA6, 0x8A8C, 0x8A9E, 0x8AA3, 0x8A8D, + 0x8AA1, 0x8A93, 0x8AA4, 0x8AAA, 0x8AA5, 0x8AA8, 0x8A98, 0x8A91, 0x8A9A, + 0x8AA7, 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, 0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, + 0x8D95, 0x8DFC, 0x8F14, 0x8F12, 0x8F15, 0x8F13, 0x8FA3, 0x9060, 0x9058, + 0x905C, 0x9063, 0x9059, 0x905E, 0x9062, 0x905D, 0x905B, 0x9119, 0x9118, + 0x911E, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x92AC, 0x9280, 0x9285, + 0x9298, 0x9296, 0x927B, 0x9293, 0x929C, 0x92A8, 0x927C, 0x9291, 0x95A1, + 0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4, 0x9699, 0x969C, 0x969B, 0x96CC, + 0x96D2, 0x9700, 0x977C, 0x9785, 0x97F6, 0x9817, 0x9818, 0x98AF, 0x98B1, + 0x9903, 0x9905, 0x990C, 0x9909, 0x99C1, 0x9AAF, 0x9AB0, 0x9AE6, 0x9B41, + 0x9B42, 0x9CF4, 0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, 0x9F4A, 0x5104, 0x5100, + 0x50FB, 0x50F5, 0x50F9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51DC, 0x5287, + 0x5288, 0x5289, 0x528D, 0x528A, 0x52F0, 0x53B2, 0x562E, 0x563B, 0x5639, + 0x5632, 0x563F, 0x5634, 0x5629, 0x5653, 0x564E, 0x5657, 0x5674, 0x5636, + 0x562F, 0x5630, 0x5880, 0x589F, 0x589E, 0x58B3, 0x589C, 0x58AE, 0x58A9, + 0x58A6, 0x596D, 0x5B09, 0x5AFB, 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, + 0x5BEC, 0x5BE9, 0x5BEB, 0x5C64, 0x5C65, 0x5D9D, 0x5D94, 0x5E62, 0x5E5F, + 0x5E61, 0x5EE2, 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, 0x5F48, 0x5F71, + 0x5FB7, 0x5FB5, 0x6176, 0x6167, 0x616E, 0x615D, 0x6155, 0x6182, 0x617C, + 0x6170, 0x616B, 0x617E, 0x61A7, 0x6190, 0x61AB, 0x618E, 0x61AC, 0x619A, + 0x61A4, 0x6194, 0x61AE, 0x622E, 0x6469, 0x646F, 0x6479, 0x649E, 0x64B2, + 0x6488, 0x6490, 0x64B0, 0x64A5, 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, + 0x64AD, 0x64AB, 0x649A, 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577, + 0x6578, 0x66AE, 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8, 0x6A01, + 0x6A1E, 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3, 0x6A02, 0x6A05, + 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, 0x6F3F, 0x6F7C, + 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86, 0x6F6D, 0x6F5B, 0x6F78, 0x6F6E, + 0x6F8E, 0x6F7A, 0x6F70, 0x6F64, 0x6F97, 0x6F58, 0x6ED5, 0x6F6F, 0x6F60, + 0x6F5F, 0x719F, 0x71AC, 0x71B1, 0x71A8, 0x7256, 0x729B, 0x734E, 0x7357, + 0x7469, 0x748B, 0x7483, 0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, + 0x7624, 0x7626, 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787, + 0x778C, 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE, 0x78D5, + 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37, 0x7A3B, 0x7AAF, + 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7, 0x7BC1, 0x7BA0, + 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB, 0x7DD8, 0x7DEC, 0x7DDD, + 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9, 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, + 0x7F75, 0x7F77, 0x7FAF, 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, + 0x819A, 0x8198, 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513, + 0x8511, 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506, 0x8782, + 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, 0x874C, + 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912, 0x8913, 0x8915, 0x890A, + 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95, 0x8ACB, 0x8AF8, 0x8AB2, 0x8AC9, + 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6, 0x8ACD, 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, + 0x8C4E, 0x8C6C, 0x8CE0, 0x8CDE, 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, + 0x8CE3, 0x8CDC, 0x8CEA, 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, + 0x8E1D, 0x8E22, 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D, + 0x8F1B, 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E, 0x8F25, 0x9069, + 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D, 0x9127, 0x9131, 0x9187, + 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB, 0x92B7, 0x92EA, 0x92E4, 0x92C1, + 0x92B3, 0x92BC, 0x92D2, 0x92C7, 0x92F0, 0x92B2, 0x95AD, 0x95B1, 0x9704, + 0x9706, 0x9707, 0x9709, 0x9760, 0x978D, 0x978B, 0x978F, 0x9821, 0x982B, + 0x981C, 0x98B3, 0x990A, 0x9913, 0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF, + 0x99DB, 0x99D1, 0x99D5, 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF, 0x9B27, + 0x9B45, 0x9B44, 0x9B77, 0x9B6F, 0x9D06, 0x9D09, 0x9D03, 0x9EA9, 0x9EBE, + 0x9ECE, 0x58A8, 0x9F52, 0x5112, 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, + 0x51AA, 0x51DD, 0x5291, 0x5293, 0x52F3, 0x5659, 0x566B, 0x5679, 0x5669, + 0x5664, 0x5678, 0x566A, 0x5668, 0x5665, 0x5671, 0x566F, 0x566C, 0x5662, + 0x5676, 0x58C1, 0x58BE, 0x58C7, 0x58C5, 0x596E, 0x5B1D, 0x5B34, 0x5B78, + 0x5BF0, 0x5C0E, 0x5F4A, 0x61B2, 0x6191, 0x61A9, 0x618A, 0x61CD, 0x61B6, + 0x61BE, 0x61CA, 0x61C8, 0x6230, 0x64C5, 0x64C1, 0x64CB, 0x64BB, 0x64BC, + 0x64DA, 0x64C4, 0x64C7, 0x64C2, 0x64CD, 0x64BF, 0x64D2, 0x64D4, 0x64BE, + 0x6574, 0x66C6, 0x66C9, 0x66B9, 0x66C4, 0x66C7, 0x66B8, 0x6A3D, 0x6A38, + 0x6A3A, 0x6A59, 0x6A6B, 0x6A58, 0x6A39, 0x6A44, 0x6A62, 0x6A61, 0x6A4B, + 0x6A47, 0x6A35, 0x6A5F, 0x6A48, 0x6B59, 0x6B77, 0x6C05, 0x6FC2, 0x6FB1, + 0x6FA1, 0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0, 0x6FB9, 0x6FB6, + 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, 0x71C9, 0x71D0, 0x71D2, 0x71C8, 0x71D5, + 0x71B9, 0x71CE, 0x71D9, 0x71DC, 0x71C3, 0x71C4, 0x7368, 0x749C, 0x74A3, + 0x7498, 0x749F, 0x749E, 0x74E2, 0x750C, 0x750D, 0x7634, 0x7638, 0x763A, + 0x76E7, 0x76E5, 0x77A0, 0x779E, 0x779F, 0x77A5, 0x78E8, 0x78DA, 0x78EC, + 0x78E7, 0x79A6, 0x7A4D, 0x7A4E, 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, 0x7BD9, + 0x7C11, 0x7BC9, 0x7BE4, 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6, + 0x7E0A, 0x7E11, 0x7E08, 0x7E1B, 0x7E23, 0x7E1E, 0x7E1D, 0x7E09, 0x7E10, + 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, 0x7FEE, 0x8028, 0x81B3, 0x81A9, 0x81A8, + 0x81FB, 0x8208, 0x8258, 0x8259, 0x854A, 0x8559, 0x8548, 0x8568, 0x8569, + 0x8543, 0x8549, 0x856D, 0x856A, 0x855E, 0x8783, 0x879F, 0x879E, 0x87A2, + 0x878D, 0x8861, 0x892A, 0x8932, 0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, + 0x8AE6, 0x8AFA, 0x8AEB, 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, 0x8AFE, + 0x8B01, 0x8B02, 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, 0x8C6B, 0x8C6D, + 0x8C93, 0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, 0x8E39, 0x8E35, 0x8F3B, + 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, 0x9075, 0x9074, 0x9078, 0x9072, + 0x907C, 0x907A, 0x9134, 0x9192, 0x9320, 0x9336, 0x92F8, 0x9333, 0x932F, + 0x9322, 0x92FC, 0x932B, 0x9304, 0x931A, 0x9310, 0x9326, 0x9321, 0x9315, + 0x932E, 0x9319, 0x95BB, 0x96A7, 0x96A8, 0x96AA, 0x96D5, 0x970E, 0x9711, + 0x9716, 0x970D, 0x9713, 0x970F, 0x975B, 0x975C, 0x9766, 0x9798, 0x9830, + 0x9838, 0x983B, 0x9837, 0x982D, 0x9839, 0x9824, 0x9910, 0x9928, 0x991E, + 0x991B, 0x9921, 0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, 0x9ABC, 0x9AFB, + 0x9AED, 0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, 0x9D28, 0x9D12, 0x9D1B, + 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, 0x511F, 0x5121, 0x5132, 0x52F5, + 0x568E, 0x5680, 0x5690, 0x5685, 0x5687, 0x568F, 0x58D5, 0x58D3, 0x58D1, + 0x58CE, 0x5B30, 0x5B2A, 0x5B24, 0x5B7A, 0x5C37, 0x5C68, 0x5DBC, 0x5DBA, + 0x5DBD, 0x5DB8, 0x5E6B, 0x5F4C, 0x5FBD, 0x61C9, 0x61C2, 0x61C7, 0x61E6, + 0x61CB, 0x6232, 0x6234, 0x64CE, 0x64CA, 0x64D8, 0x64E0, 0x64F0, 0x64E6, + 0x64EC, 0x64F1, 0x64E2, 0x64ED, 0x6582, 0x6583, 0x66D9, 0x66D6, 0x6A80, + 0x6A94, 0x6A84, 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, 0x6A7E, 0x6A97, 0x6A90, + 0x6AA0, 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, 0x6FD8, 0x6FF1, 0x6FDF, 0x6FE0, + 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, 0x6F80, 0x6FEC, 0x6FE1, 0x6FE9, 0x6FD5, + 0x6FEE, 0x6FF0, 0x71E7, 0x71DF, 0x71EE, 0x71E6, 0x71E5, 0x71ED, 0x71EC, + 0x71F4, 0x71E0, 0x7235, 0x7246, 0x7370, 0x7372, 0x74A9, 0x74B0, 0x74A6, + 0x74A8, 0x7646, 0x7642, 0x764C, 0x76EA, 0x77B3, 0x77AA, 0x77B0, 0x77AC, + 0x77A7, 0x77AD, 0x77EF, 0x78F7, 0x78FA, 0x78F4, 0x78EF, 0x7901, 0x79A7, + 0x79AA, 0x7A57, 0x7ABF, 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, 0x7C0C, 0x7BE0, + 0x7CE0, 0x7CDC, 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, 0x7CDD, 0x7E2E, 0x7E3E, + 0x7E46, 0x7E37, 0x7E32, 0x7E43, 0x7E2B, 0x7E3D, 0x7E31, 0x7E45, 0x7E41, + 0x7E34, 0x7E39, 0x7E48, 0x7E35, 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, 0x7FFC, + 0x8071, 0x8072, 0x8070, 0x806F, 0x8073, 0x81C6, 0x81C3, 0x81BA, 0x81C2, + 0x81C0, 0x81BF, 0x81BD, 0x81C9, 0x81BE, 0x81E8, 0x8209, 0x8271, 0x85AA, + 0x8584, 0x857E, 0x859C, 0x8591, 0x8594, 0x85AF, 0x859B, 0x8587, 0x85A8, + 0x858A, 0x85A6, 0x8667, 0x87C0, 0x87D1, 0x87B3, 0x87D2, 0x87C6, 0x87AB, + 0x87BB, 0x87BA, 0x87C8, 0x87CB, 0x893B, 0x8936, 0x8944, 0x8938, 0x893D, + 0x89AC, 0x8B0E, 0x8B17, 0x8B19, 0x8B1B, 0x8B0A, 0x8B20, 0x8B1D, 0x8B04, + 0x8B10, 0x8C41, 0x8C3F, 0x8C73, 0x8CFA, 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB, + 0x8DA8, 0x8E49, 0x8E4B, 0x8E48, 0x8E4A, 0x8F44, 0x8F3E, 0x8F42, 0x8F45, + 0x8F3F, 0x907F, 0x907D, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91A3, + 0x919E, 0x919C, 0x934D, 0x9382, 0x9328, 0x9375, 0x934A, 0x9365, 0x934B, + 0x9318, 0x937E, 0x936C, 0x935B, 0x9370, 0x935A, 0x9354, 0x95CA, 0x95CB, + 0x95CC, 0x95C8, 0x95C6, 0x96B1, 0x96B8, 0x96D6, 0x971C, 0x971E, 0x97A0, + 0x97D3, 0x9846, 0x98B6, 0x9935, 0x9A01, 0x99FF, 0x9BAE, 0x9BAB, 0x9BAA, + 0x9BAD, 0x9D3B, 0x9D3F, 0x9E8B, 0x9ECF, 0x9EDE, 0x9EDC, 0x9EDD, 0x9EDB, + 0x9F3E, 0x9F4B, 0x53E2, 0x5695, 0x56AE, 0x58D9, 0x58D8, 0x5B38, 0x5F5D, + 0x61E3, 0x6233, 0x64F4, 0x64F2, 0x64FE, 0x6506, 0x64FA, 0x64FB, 0x64F7, + 0x65B7, 0x66DC, 0x6726, 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, 0x6AC2, + 0x6AAE, 0x6AAF, 0x6B5F, 0x6B78, 0x6BAF, 0x7009, 0x700B, 0x6FFE, 0x7006, + 0x6FFA, 0x7011, 0x700F, 0x71FB, 0x71FC, 0x71FE, 0x71F8, 0x7377, 0x7375, + 0x74A7, 0x74BF, 0x7515, 0x7656, 0x7658, 0x7652, 0x77BD, 0x77BF, 0x77BB, + 0x77BC, 0x790E, 0x79AE, 0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, 0x7C2B, + 0x7C27, 0x7C2A, 0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, + 0x7E5A, 0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076, + 0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9, 0x85B0, + 0x85BA, 0x85B9, 0x87EF, 0x87EC, 0x87F2, 0x87E0, 0x8986, 0x89B2, 0x89F4, + 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50, 0x8D05, 0x8E59, 0x8E63, 0x8E66, + 0x8E64, 0x8E5F, 0x8E55, 0x8EC0, 0x8F49, 0x8F4D, 0x9087, 0x9083, 0x9088, + 0x91AB, 0x91AC, 0x91D0, 0x9394, 0x938A, 0x9396, 0x93A2, 0x93B3, 0x93AE, + 0x93AC, 0x93B0, 0x9398, 0x939A, 0x9397, 0x95D4, 0x95D6, 0x95D0, 0x95D5, + 0x96E2, 0x96DC, 0x96D9, 0x96DB, 0x96DE, 0x9724, 0x97A3, 0x97A6, 0x97AD, + 0x97F9, 0x984D, 0x984F, 0x984C, 0x984E, 0x9853, 0x98BA, 0x993E, 0x993F, + 0x993D, 0x992E, 0x99A5, 0x9A0E, 0x9AC1, 0x9B03, 0x9B06, 0x9B4F, 0x9B4E, + 0x9B4D, 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8, 0x9BC0, 0x9D51, 0x9D5D, 0x9D60, + 0x9EE0, 0x9F15, 0x9F2C, 0x5133, 0x56A5, 0x56A8, 0x58DE, 0x58DF, 0x58E2, + 0x5BF5, 0x9F90, 0x5EEC, 0x61F2, 0x61F7, 0x61F6, 0x61F5, 0x6500, 0x650F, + 0x66E0, 0x66DD, 0x6AE5, 0x6ADD, 0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, + 0x701A, 0x701D, 0x7015, 0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, 0x7378, + 0x737A, 0x74BD, 0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F, 0x7661, 0x77C7, + 0x7919, 0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, 0x7C38, 0x7C3D, 0x7C37, + 0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69, 0x7E6A, 0x7E73, 0x7F85, 0x7FB6, + 0x7FB9, 0x7FB8, 0x81D8, 0x85E9, 0x85DD, 0x85EA, 0x85D5, 0x85E4, 0x85E5, + 0x85F7, 0x87FB, 0x8805, 0x880D, 0x87F9, 0x87FE, 0x8960, 0x895F, 0x8956, + 0x895E, 0x8B41, 0x8B5C, 0x8B58, 0x8B49, 0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, + 0x8B59, 0x8D08, 0x8D0A, 0x8E7C, 0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A, + 0x8E74, 0x8F54, 0x8F4E, 0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE, 0x93E1, + 0x93D1, 0x93DF, 0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6, 0x93E2, 0x93CD, + 0x93D8, 0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4, 0x96E3, 0x972A, 0x9727, + 0x9761, 0x97DC, 0x97FB, 0x985E, 0x9858, 0x985B, 0x98BC, 0x9945, 0x9949, + 0x9A16, 0x9A19, 0x9B0D, 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, 0x9D61, + 0x9D72, 0x9D6A, 0x9D6C, 0x9E92, 0x9E97, 0x9E93, 0x9EB4, 0x52F8, 0x56B7, + 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40, 0x5B43, 0x5B7D, 0x5BF6, 0x5DC9, + 0x61F8, 0x61FA, 0x6518, 0x6514, 0x6519, 0x66E6, 0x6727, 0x6AEC, 0x703E, + 0x7030, 0x7032, 0x7210, 0x737B, 0x74CF, 0x7662, 0x7665, 0x7926, 0x792A, + 0x792C, 0x792B, 0x7AC7, 0x7AF6, 0x7C4C, 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, + 0x8FAE, 0x7E7D, 0x7E7C, 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB, + 0x85F9, 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814, 0x8815, + 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F, 0x8B5F, 0x8B6B, + 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82, 0x91B4, 0x91CB, 0x9418, + 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4, 0x9952, 0x9951, 0x99A8, 0x9A2B, + 0x9A30, 0x9A37, 0x9A35, 0x9C13, 0x9C0D, 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, + 0x9F5F, 0x9F63, 0x9F61, 0x5137, 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, + 0x5C6C, 0x5DCD, 0x61FC, 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, + 0x6B04, 0x6AFA, 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669, + 0x77D3, 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A, 0x8823, + 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74, 0x8B77, 0x8B7D, + 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF, 0x91BA, 0x942E, 0x9433, + 0x9435, 0x943A, 0x9438, 0x9432, 0x942B, 0x95E2, 0x9738, 0x9739, 0x9732, + 0x97FF, 0x9867, 0x9865, 0x9957, 0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, + 0x9B54, 0x9B51, 0x9C2D, 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, + 0x9EEF, 0x9F19, 0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, + 0x56C9, 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61, + 0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C, 0x79B3, 0x7C60, + 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972, 0x896F, 0x89FC, 0x8B80, 0x8D16, + 0x8D17, 0x8E91, 0x8E93, 0x8F61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973D, + 0x973E, 0x97C3, 0x97C1, 0x986B, 0x9955, 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, + 0x9C49, 0x9C31, 0x9C3E, 0x9C3B, 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, + 0x9F94, 0x56CC, 0x5DD6, 0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10, + 0x74DA, 0x7ACA, 0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94, 0x81E2, + 0x8638, 0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463, 0x9460, 0x9464, + 0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57, 0x9AD3, 0x9AD4, 0x9AD1, + 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F, 0x9EF4, 0x56D1, 0x58E9, 0x652C, + 0x705E, 0x7671, 0x7672, 0x77D7, 0x7F50, 0x7F88, 0x8836, 0x8839, 0x8862, + 0x8B93, 0x8B92, 0x8B96, 0x8277, 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, + 0x9744, 0x97C6, 0x9870, 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA, + 0x9E7C, 0x9E7D, 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063, 0x7C6C, + 0x7C6E, 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470, 0x9871, 0x995E, + 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A, 0x9477, 0x97C9, 0x9A62, + 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5, 0x947D, 0x947E, 0x947C, 0x9C77, + 0x9C78, 0x9EF7, 0x8C54, 0x947F, 0x9E1A, 0x7228, 0x9A6A, 0x9B31, 0x9E1B, + 0x9E1E, 0x7C72, 0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, + 0x4E47, 0x4E8D, 0x56D7, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E, 0x4E2E, + 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8, 0x5198, 0x52FC, 0x536C, 0x53B9, 0x5720, + 0x5903, 0x592C, 0x5C10, 0x5DFF, 0x65E1, 0x6BB3, 0x6BCC, 0x6C14, 0x723F, + 0x4E31, 0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9, 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, + 0x5209, 0x531C, 0x534C, 0x5722, 0x5723, 0x5917, 0x592F, 0x5B81, 0x5B84, + 0x5C12, 0x5C3B, 0x5C74, 0x5C73, 0x5E04, 0x5E80, 0x5E82, 0x5FC9, 0x6209, + 0x6250, 0x6C15, 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE, 0x72B0, 0x738A, + 0x79B8, 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C, 0x4EF5, 0x4F14, 0x4EF1, + 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02, 0x4F05, 0x4F22, 0x4F13, 0x4F04, + 0x4EF4, 0x4F12, 0x51B1, 0x5213, 0x5210, 0x52A6, 0x5322, 0x531F, 0x534D, + 0x538A, 0x5407, 0x56E1, 0x56DF, 0x572E, 0x572A, 0x5734, 0x593C, 0x5980, + 0x597C, 0x5985, 0x597B, 0x597E, 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, + 0x5C7C, 0x5C7A, 0x5C7B, 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A, + 0x5F74, 0x5FD5, 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261, 0x6266, + 0x6262, 0x6259, 0x6260, 0x625A, 0x6265, 0x6537, 0x65EF, 0x65EE, 0x673E, + 0x6739, 0x6738, 0x673B, 0x673A, 0x673F, 0x673C, 0x6733, 0x6C18, 0x6C46, + 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, 0x6C4B, 0x6C4C, 0x7071, 0x725E, + 0x72B4, 0x72B5, 0x738E, 0x752A, 0x767F, 0x7A75, 0x7F51, 0x8278, 0x827C, + 0x8280, 0x827D, 0x827F, 0x864D, 0x897E, 0x9099, 0x9097, 0x9098, 0x909B, + 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, 0x4F56, 0x4F3B, 0x4F62, 0x4F49, + 0x4F53, 0x4F64, 0x4F3E, 0x4F67, 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D, + 0x4F33, 0x4F3F, 0x4F61, 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221, 0x52AD, + 0x52AE, 0x5309, 0x5363, 0x5372, 0x538E, 0x538F, 0x5430, 0x5437, 0x542A, + 0x5454, 0x5445, 0x5419, 0x541C, 0x5425, 0x5418, 0x543D, 0x544F, 0x5441, + 0x5428, 0x5424, 0x5447, 0x56EE, 0x56E7, 0x56E5, 0x5741, 0x5745, 0x574C, + 0x5749, 0x574B, 0x5752, 0x5906, 0x5940, 0x59A6, 0x5998, 0x59A0, 0x5997, + 0x598E, 0x59A2, 0x5990, 0x598F, 0x59A7, 0x59A1, 0x5B8E, 0x5B92, 0x5C28, + 0x5C2A, 0x5C8D, 0x5C8F, 0x5C88, 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86, + 0x5C93, 0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C, 0x5E88, + 0x5E8D, 0x5F05, 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1, 0x5FD0, 0x5FED, + 0x5FE8, 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3, 0x5FFA, 0x5FEF, 0x5FF7, + 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283, 0x628C, 0x628E, 0x628F, 0x6294, + 0x6287, 0x6271, 0x627B, 0x627A, 0x6270, 0x6281, 0x6288, 0x6277, 0x627D, + 0x6272, 0x6274, 0x65F0, 0x65F4, 0x65F3, 0x65F2, 0x65F5, 0x6745, 0x6747, + 0x6759, 0x6755, 0x674C, 0x6748, 0x675D, 0x674D, 0x675A, 0x674B, 0x6BD0, + 0x6C19, 0x6C1A, 0x6C78, 0x6C67, 0x6C6B, 0x6C84, 0x6C8B, 0x6C8F, 0x6C71, + 0x6C6F, 0x6C69, 0x6C9A, 0x6C6D, 0x6C87, 0x6C95, 0x6C9C, 0x6C66, 0x6C73, + 0x6C65, 0x6C7B, 0x6C8E, 0x7074, 0x707A, 0x7263, 0x72BF, 0x72BD, 0x72C3, + 0x72C6, 0x72C1, 0x72BA, 0x72C5, 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, + 0x753A, 0x7539, 0x7594, 0x7595, 0x7681, 0x793D, 0x8034, 0x8095, 0x8099, + 0x8090, 0x8092, 0x809C, 0x8290, 0x828F, 0x8285, 0x828E, 0x8291, 0x8293, + 0x828A, 0x8283, 0x8284, 0x8C78, 0x8FC9, 0x8FBF, 0x909F, 0x90A1, 0x90A5, + 0x909E, 0x90A7, 0x90A0, 0x9630, 0x9628, 0x962F, 0x962D, 0x4E33, 0x4F98, + 0x4F7C, 0x4F85, 0x4F7D, 0x4F80, 0x4F87, 0x4F76, 0x4F74, 0x4F89, 0x4F84, + 0x4F77, 0x4F4C, 0x4F97, 0x4F6A, 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90, + 0x4F9C, 0x4F94, 0x4F9E, 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E, 0x519E, + 0x51BC, 0x51BE, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52BC, 0x530A, + 0x530B, 0x533C, 0x5392, 0x5394, 0x5487, 0x547F, 0x5481, 0x5491, 0x5482, + 0x5488, 0x546B, 0x547A, 0x547E, 0x5465, 0x546C, 0x5474, 0x5466, 0x548D, + 0x546F, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56F7, 0x56F9, + 0x576F, 0x5772, 0x576D, 0x576B, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, + 0x577B, 0x5773, 0x5774, 0x5762, 0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, + 0x59BA, 0x59CF, 0x59CE, 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3, + 0x59D6, 0x59B1, 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62, 0x5B65, + 0x5B93, 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0, 0x5CB5, 0x5CAF, + 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2, 0x5CAA, 0x5CA7, 0x5C9D, + 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17, 0x5E14, 0x5E19, 0x5F28, 0x5F22, + 0x5F23, 0x5F24, 0x5F54, 0x5F82, 0x5F7E, 0x5F7D, 0x5FDE, 0x5FE5, 0x602D, + 0x6026, 0x6019, 0x6032, 0x600B, 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, + 0x601E, 0x602C, 0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, + 0x6009, 0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA, + 0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0, 0x62B8, + 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612, 0x6608, 0x65FB, + 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611, 0x6610, 0x66F6, 0x670A, + 0x6785, 0x676C, 0x678E, 0x6792, 0x6776, 0x677B, 0x6798, 0x6786, 0x6784, + 0x6774, 0x678D, 0x678C, 0x677A, 0x679F, 0x6791, 0x6799, 0x6783, 0x677D, + 0x6781, 0x6778, 0x6779, 0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, + 0x6C93, 0x6CEC, 0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, + 0x6CB7, 0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, 0x6CD2, + 0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, 0x6D30, 0x6CCD, + 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, 0x7094, 0x7098, 0x7085, + 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082, 0x709A, 0x7083, 0x726A, + 0x72D6, 0x72CB, 0x72D8, 0x72C9, 0x72DC, 0x72D2, 0x72D4, 0x72DA, 0x72CC, + 0x72D1, 0x73A4, 0x73A1, 0x73AD, 0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, + 0x74DD, 0x74E8, 0x753F, 0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, + 0x76F1, 0x76F0, 0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA, 0x77F7, + 0x7942, 0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB, 0x7C75, 0x7CFD, 0x8035, + 0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5, 0x80AD, 0x8220, 0x82A0, 0x82C0, + 0x82AB, 0x829A, 0x8298, 0x829B, 0x82B5, 0x82A7, 0x82AE, 0x82BC, 0x829E, + 0x82BA, 0x82B4, 0x82A8, 0x82A1, 0x82A9, 0x82C2, 0x82A4, 0x82C3, 0x82B6, + 0x82A2, 0x8670, 0x866F, 0x866D, 0x866E, 0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, + 0x8FCD, 0x8FD6, 0x8FD5, 0x8FD7, 0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0, + 0x9639, 0x963D, 0x963C, 0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3, 0x4FB2, + 0x4FC9, 0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB, 0x4FB3, 0x4FDB, + 0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC, 0x5244, 0x5249, 0x52C0, + 0x52C2, 0x533D, 0x537C, 0x5397, 0x5396, 0x5399, 0x5398, 0x54BA, 0x54A1, + 0x54AD, 0x54A5, 0x54CF, 0x54C3, 0x830D, 0x54B7, 0x54AE, 0x54D6, 0x54B6, + 0x54C5, 0x54C6, 0x54A0, 0x5470, 0x54BC, 0x54A2, 0x54BE, 0x5472, 0x54DE, + 0x54B0, 0x57B5, 0x579E, 0x579F, 0x57A4, 0x578C, 0x5797, 0x579D, 0x579B, + 0x5794, 0x5798, 0x578F, 0x5799, 0x57A5, 0x579A, 0x5795, 0x58F4, 0x590D, + 0x5953, 0x59E1, 0x59DE, 0x59EE, 0x5A00, 0x59F1, 0x59DD, 0x59FA, 0x59FD, + 0x59FC, 0x59F6, 0x59E4, 0x59F2, 0x59F7, 0x59DB, 0x59E9, 0x59F3, 0x59F5, + 0x59E0, 0x59FE, 0x59F4, 0x59ED, 0x5BA8, 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC, + 0x5CD7, 0x5CCB, 0x5CDB, 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA, 0x5CD6, + 0x5CD3, 0x5CD4, 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF, 0x5CF8, 0x5DF9, + 0x5E21, 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0, 0x5EA4, 0x5EA2, 0x5E9B, + 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56, 0x5F86, 0x6037, 0x6039, 0x6054, + 0x6072, 0x605E, 0x6045, 0x6053, 0x6047, 0x6049, 0x605B, 0x604C, 0x6040, + 0x6042, 0x605F, 0x6024, 0x6044, 0x6058, 0x6066, 0x606E, 0x6242, 0x6243, + 0x62CF, 0x630D, 0x630B, 0x62F5, 0x630E, 0x6303, 0x62EB, 0x62F9, 0x630F, + 0x630C, 0x62F8, 0x62F6, 0x6300, 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB, + 0x62F0, 0x6541, 0x6543, 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632, 0x6635, + 0x661C, 0x6626, 0x6622, 0x6633, 0x662B, 0x663A, 0x661D, 0x6634, 0x6639, + 0x662E, 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8, 0x67BA, 0x67DC, 0x67BB, + 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5, 0x67EB, 0x67E4, 0x67DF, 0x67B5, + 0x67CD, 0x67B3, 0x67F7, 0x67F6, 0x67EE, 0x67E3, 0x67C2, 0x67B9, 0x67CE, + 0x67E7, 0x67F0, 0x67B2, 0x67FC, 0x67C6, 0x67ED, 0x67CC, 0x67AE, 0x67E6, + 0x67DB, 0x67FA, 0x67C9, 0x67CA, 0x67C3, 0x67EA, 0x67CB, 0x6B28, 0x6B82, + 0x6B84, 0x6BB6, 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34, + 0x6D2D, 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33, 0x6D04, + 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42, 0x6D01, 0x6D18, + 0x6D37, 0x6D03, 0x6D0F, 0x6D40, 0x6D07, 0x6D20, 0x6D2C, 0x6D08, 0x6D22, + 0x6D09, 0x6D10, 0x70B7, 0x709F, 0x70BE, 0x70B1, 0x70B0, 0x70A1, 0x70B4, + 0x70B5, 0x70A9, 0x7241, 0x7249, 0x724A, 0x726C, 0x7270, 0x7273, 0x726E, + 0x72CA, 0x72E4, 0x72E8, 0x72EB, 0x72DF, 0x72EA, 0x72E6, 0x72E3, 0x7385, + 0x73CC, 0x73C2, 0x73C8, 0x73C5, 0x73B9, 0x73B6, 0x73B5, 0x73B4, 0x73EB, + 0x73BF, 0x73C7, 0x73BE, 0x73C3, 0x73C6, 0x73B8, 0x73CB, 0x74EC, 0x74EE, + 0x752E, 0x7547, 0x7548, 0x75A7, 0x75AA, 0x7679, 0x76C4, 0x7708, 0x7703, + 0x7704, 0x7705, 0x770A, 0x76F7, 0x76FB, 0x76FA, 0x77E7, 0x77E8, 0x7806, + 0x7811, 0x7812, 0x7805, 0x7810, 0x780F, 0x780E, 0x7809, 0x7803, 0x7813, + 0x794A, 0x794C, 0x794B, 0x7945, 0x7944, 0x79D5, 0x79CD, 0x79CF, 0x79D6, + 0x79CE, 0x7A80, 0x7A7E, 0x7AD1, 0x7B00, 0x7B01, 0x7C7A, 0x7C78, 0x7C79, + 0x7C7F, 0x7C80, 0x7C81, 0x7D03, 0x7D08, 0x7D01, 0x7F58, 0x7F91, 0x7F8D, + 0x7FBE, 0x8007, 0x800E, 0x800F, 0x8014, 0x8037, 0x80D8, 0x80C7, 0x80E0, + 0x80D1, 0x80C8, 0x80C2, 0x80D0, 0x80C5, 0x80E3, 0x80D9, 0x80DC, 0x80CA, + 0x80D5, 0x80C9, 0x80CF, 0x80D7, 0x80E6, 0x80CD, 0x81FF, 0x8221, 0x8294, + 0x82D9, 0x82FE, 0x82F9, 0x8307, 0x82E8, 0x8300, 0x82D5, 0x833A, 0x82EB, + 0x82D6, 0x82F4, 0x82EC, 0x82E1, 0x82F2, 0x82F5, 0x830C, 0x82FB, 0x82F6, + 0x82F0, 0x82EA, 0x82E4, 0x82E0, 0x82FA, 0x82F3, 0x82ED, 0x8677, 0x8674, + 0x867C, 0x8673, 0x8841, 0x884E, 0x8867, 0x886A, 0x8869, 0x89D3, 0x8A04, + 0x8A07, 0x8D72, 0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, 0x90F1, 0x90BD, 0x90BF, + 0x90D5, 0x90C5, 0x90BE, 0x90C7, 0x90CB, 0x90C8, 0x91D4, 0x91D3, 0x9654, + 0x964F, 0x9651, 0x9653, 0x964A, 0x964E, 0x501E, 0x5005, 0x5007, 0x5013, + 0x5022, 0x5030, 0x501B, 0x4FF5, 0x4FF4, 0x5033, 0x5037, 0x502C, 0x4FF6, + 0x4FF7, 0x5017, 0x501C, 0x5020, 0x5027, 0x5035, 0x502F, 0x5031, 0x500E, + 0x515A, 0x5194, 0x5193, 0x51CA, 0x51C4, 0x51C5, 0x51C8, 0x51CE, 0x5261, + 0x525A, 0x5252, 0x525E, 0x525F, 0x5255, 0x5262, 0x52CD, 0x530E, 0x539E, + 0x5526, 0x54E2, 0x5517, 0x5512, 0x54E7, 0x54F3, 0x54E4, 0x551A, 0x54FF, + 0x5504, 0x5508, 0x54EB, 0x5511, 0x5505, 0x54F1, 0x550A, 0x54FB, 0x54F7, + 0x54F8, 0x54E0, 0x550E, 0x5503, 0x550B, 0x5701, 0x5702, 0x57CC, 0x5832, + 0x57D5, 0x57D2, 0x57BA, 0x57C6, 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF, + 0x57C7, 0x57D0, 0x57B9, 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16, 0x5A2D, + 0x5A2E, 0x5A15, 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33, 0x5B6C, 0x5BA7, + 0x5BAD, 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1, + 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28, 0x5EA8, 0x5EAE, 0x5EAA, 0x5EAC, + 0x5F33, 0x5F30, 0x5F67, 0x605D, 0x605A, 0x6067, 0x6041, 0x60A2, 0x6088, + 0x6080, 0x6092, 0x6081, 0x609D, 0x6083, 0x6095, 0x609B, 0x6097, 0x6087, + 0x609C, 0x608E, 0x6219, 0x6246, 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, + 0x6345, 0x6336, 0x6343, 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329, + 0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333, 0x635A, + 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546, 0x65C6, 0x65C3, + 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651, 0x6712, 0x6713, 0x681F, + 0x681A, 0x6849, 0x6832, 0x6833, 0x683B, 0x684B, 0x684F, 0x6816, 0x6831, + 0x681C, 0x6835, 0x682B, 0x682D, 0x682F, 0x684E, 0x6844, 0x6834, 0x681D, + 0x6812, 0x6814, 0x6826, 0x6828, 0x682E, 0x684D, 0x683A, 0x6825, 0x6820, + 0x6B2C, 0x6B2F, 0x6B2D, 0x6B31, 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, + 0x6BE4, 0x6BE8, 0x6BE3, 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64, + 0x6D76, 0x6D0D, 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F, 0x6D91, + 0x6D8D, 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60, 0x6D97, 0x6D70, + 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68, 0x6D8B, 0x6D7E, 0x6D80, + 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D, 0x6D75, 0x6D90, 0x70DC, 0x70D3, + 0x70D1, 0x70DD, 0x70CB, 0x7F39, 0x70E2, 0x70D7, 0x70D2, 0x70DE, 0x70E0, + 0x70D4, 0x70CD, 0x70C5, 0x70C6, 0x70C7, 0x70DA, 0x70CE, 0x70E1, 0x7242, + 0x7278, 0x7277, 0x7276, 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6, 0x72F3, + 0x72FB, 0x7301, 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC, 0x73E7, 0x73E3, + 0x73E9, 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD, 0x73DA, 0x73D7, 0x73D8, + 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5, 0x7521, 0x755B, 0x755F, 0x75B0, + 0x75C1, 0x75BB, 0x75C4, 0x75C0, 0x75BF, 0x75B6, 0x75BA, 0x768A, 0x76C9, + 0x771D, 0x771B, 0x7710, 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, + 0x771A, 0x7722, 0x7727, 0x7823, 0x782C, 0x7822, 0x7835, 0x782F, 0x7828, + 0x782E, 0x782B, 0x7821, 0x7829, 0x7833, 0x782A, 0x7831, 0x7954, 0x795B, + 0x794F, 0x795C, 0x7953, 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0, 0x79EE, + 0x79ED, 0x79EA, 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89, 0x7A85, 0x7A8B, + 0x7A8C, 0x7A8A, 0x7A87, 0x7AD8, 0x7B10, 0x7B04, 0x7B13, 0x7B05, 0x7B0F, + 0x7B08, 0x7B0A, 0x7B0E, 0x7B09, 0x7B12, 0x7C84, 0x7C91, 0x7C8A, 0x7C8C, + 0x7C88, 0x7C8D, 0x7C85, 0x7D1E, 0x7D1D, 0x7D11, 0x7D0E, 0x7D18, 0x7D16, + 0x7D13, 0x7D1F, 0x7D12, 0x7D0F, 0x7D0C, 0x7F5C, 0x7F61, 0x7F5E, 0x7F60, + 0x7F5D, 0x7F5B, 0x7F96, 0x7F92, 0x7FC3, 0x7FC2, 0x7FC0, 0x8016, 0x803E, + 0x8039, 0x80FA, 0x80F2, 0x80F9, 0x80F5, 0x8101, 0x80FB, 0x8100, 0x8201, + 0x822F, 0x8225, 0x8333, 0x832D, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, + 0x833F, 0x8341, 0x8326, 0x831C, 0x8322, 0x8342, 0x834E, 0x831B, 0x832A, + 0x8308, 0x833C, 0x834D, 0x8316, 0x8324, 0x8320, 0x8337, 0x832F, 0x8329, + 0x8347, 0x8345, 0x834C, 0x8353, 0x831E, 0x832C, 0x834B, 0x8327, 0x8348, + 0x8653, 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D, 0x8691, 0x869E, 0x8687, + 0x8697, 0x8686, 0x868B, 0x869A, 0x8685, 0x86A5, 0x8699, 0x86A1, 0x86A7, + 0x8695, 0x8698, 0x868E, 0x869D, 0x8690, 0x8694, 0x8843, 0x8844, 0x886D, + 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887F, 0x886F, 0x8883, 0x887E, + 0x8874, 0x887C, 0x8A12, 0x8C47, 0x8C57, 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, + 0x8D78, 0x8DB5, 0x8DB7, 0x8DB6, 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002, + 0x8FFF, 0x8FFB, 0x9004, 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9, 0x90DA, + 0x90E3, 0x90DF, 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC, 0x90E4, 0x9150, + 0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C, 0x965F, 0x96BC, 0x98E3, + 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A, 0x5061, 0x505E, 0x5060, 0x5053, + 0x504B, 0x505D, 0x5072, 0x5048, 0x504D, 0x5041, 0x505B, 0x504A, 0x5062, + 0x5015, 0x5045, 0x505F, 0x5069, 0x506B, 0x5063, 0x5064, 0x5046, 0x5040, + 0x506E, 0x5073, 0x5057, 0x5051, 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, + 0x52D6, 0x52D3, 0x532D, 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550, + 0x5534, 0x552A, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, + 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, 0x552D, 0x553B, 0x5540, + 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2, 0x57F6, 0x57DC, 0x57F4, + 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8, 0x580B, 0x57F3, 0x57CF, 0x5807, + 0x57EE, 0x57E3, 0x57F2, 0x57E5, 0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, + 0x57E7, 0x5801, 0x580C, 0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, + 0x5A60, 0x5A58, 0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, + 0x5A5F, 0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52, + 0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C, 0x5A70, + 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72, 0x5B6E, 0x5BC1, + 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A, 0x5D20, 0x5D0C, 0x5D28, + 0x5D0D, 0x5D26, 0x5D25, 0x5D0F, 0x5D30, 0x5D12, 0x5D23, 0x5D1F, 0x5D2E, + 0x5E3E, 0x5E34, 0x5EB1, 0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, + 0x5F9B, 0x5F96, 0x5F9F, 0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, + 0x60D3, 0x60D4, 0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB, + 0x60B7, 0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365, 0x638A, + 0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397, 0x63AB, 0x638E, + 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375, 0x639C, 0x636D, 0x63AE, + 0x637C, 0x63A4, 0x633B, 0x639F, 0x6378, 0x6385, 0x6381, 0x6391, 0x638D, + 0x6370, 0x6553, 0x65CD, 0x6665, 0x6661, 0x665B, 0x6659, 0x665C, 0x6662, + 0x6718, 0x6879, 0x6887, 0x6890, 0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB, + 0x6956, 0x686F, 0x68A3, 0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2, 0x688F, + 0x6877, 0x6892, 0x687C, 0x686B, 0x6872, 0x68AA, 0x6880, 0x6871, 0x687E, + 0x689B, 0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4, 0x6878, 0x687B, 0x6891, + 0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33, 0x6B37, 0x6B38, 0x6B91, 0x6B8F, + 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A, 0x6DC0, 0x6DAB, 0x6DB4, 0x6DB3, 0x6E74, + 0x6DAC, 0x6DE9, 0x6DE2, 0x6DB7, 0x6DF6, 0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, + 0x6DDF, 0x6DD6, 0x6DBE, 0x6DE5, 0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, + 0x6DBD, 0x6DED, 0x6DF0, 0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9, 0x6DD0, + 0x6DF2, 0x6DD3, 0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB, 0x70FA, 0x710D, + 0x70F7, 0x7117, 0x70F4, 0x710C, 0x70F0, 0x7104, 0x70F3, 0x7110, 0x70FC, + 0x70FF, 0x7106, 0x7113, 0x7100, 0x70F8, 0x70F6, 0x710B, 0x7102, 0x710E, + 0x727E, 0x727B, 0x727C, 0x727F, 0x731D, 0x7317, 0x7307, 0x7311, 0x7318, + 0x730A, 0x7308, 0x72FF, 0x730F, 0x731E, 0x7388, 0x73F6, 0x73F8, 0x73F5, + 0x7404, 0x7401, 0x73FD, 0x7407, 0x7400, 0x73FA, 0x73FC, 0x73FF, 0x740C, + 0x740B, 0x73F4, 0x7408, 0x7564, 0x7563, 0x75CE, 0x75D2, 0x75CF, 0x75CB, + 0x75CC, 0x75D1, 0x75D0, 0x768F, 0x7689, 0x76D3, 0x7739, 0x772F, 0x772D, + 0x7731, 0x7732, 0x7734, 0x7733, 0x773D, 0x7725, 0x773B, 0x7735, 0x7848, + 0x7852, 0x7849, 0x784D, 0x784A, 0x784C, 0x7826, 0x7845, 0x7850, 0x7964, + 0x7967, 0x7969, 0x796A, 0x7963, 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8, + 0x79F6, 0x79F7, 0x7A8F, 0x7A94, 0x7A90, 0x7B35, 0x7B3B, 0x7B34, 0x7B25, + 0x7B30, 0x7B22, 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D, 0x7B31, 0x7B2B, + 0x7B2D, 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23, 0x7C94, 0x7C98, 0x7C96, + 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36, 0x7D3A, 0x7D45, 0x7D2C, 0x7D29, + 0x7D41, 0x7D47, 0x7D3E, 0x7D3F, 0x7D4A, 0x7D3B, 0x7D28, 0x7F63, 0x7F95, + 0x7F9C, 0x7F9D, 0x7F9B, 0x7FCA, 0x7FCB, 0x7FCD, 0x7FD0, 0x7FD1, 0x7FC7, + 0x7FCF, 0x7FC9, 0x801F, 0x801E, 0x801B, 0x8047, 0x8043, 0x8048, 0x8118, + 0x8125, 0x8119, 0x811B, 0x812D, 0x811F, 0x812C, 0x811E, 0x8121, 0x8115, + 0x8127, 0x811D, 0x8122, 0x8211, 0x8238, 0x8233, 0x823A, 0x8234, 0x8232, + 0x8274, 0x8390, 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373, 0x83A4, 0x8374, + 0x838F, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83A9, 0x837D, 0x8383, + 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B, 0x837E, 0x83A5, 0x83AF, 0x8388, + 0x8397, 0x83B0, 0x837F, 0x83A6, 0x8387, 0x83AE, 0x8376, 0x8659, 0x8656, + 0x86BF, 0x86B7, 0x86C2, 0x86C1, 0x86C5, 0x86BA, 0x86B0, 0x86C8, 0x86B9, + 0x86B3, 0x86B8, 0x86CC, 0x86B4, 0x86BB, 0x86BC, 0x86C3, 0x86BD, 0x86BE, + 0x8852, 0x8889, 0x8895, 0x88A8, 0x88A2, 0x88AA, 0x889A, 0x8891, 0x88A1, + 0x889F, 0x8898, 0x88A7, 0x8899, 0x889B, 0x8897, 0x88A4, 0x88AC, 0x888C, + 0x8893, 0x888E, 0x8982, 0x89D6, 0x89D9, 0x89D5, 0x8A30, 0x8A27, 0x8A2C, + 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, 0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, 0x8D7B, + 0x8D79, 0x8DBC, 0x8DC2, 0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, 0x8EDE, 0x8EDD, + 0x8EDC, 0x8ED7, 0x8EE0, 0x8EE1, 0x9024, 0x900B, 0x9011, 0x901C, 0x900C, + 0x9021, 0x90EF, 0x90EA, 0x90F0, 0x90F4, 0x90F2, 0x90F3, 0x90D4, 0x90EB, + 0x90EC, 0x90E9, 0x9156, 0x9158, 0x915A, 0x9153, 0x9155, 0x91EC, 0x91F4, + 0x91F1, 0x91F3, 0x91F8, 0x91E4, 0x91F9, 0x91EA, 0x91EB, 0x91F7, 0x91E8, + 0x91EE, 0x957A, 0x9586, 0x9588, 0x967C, 0x966D, 0x966B, 0x9671, 0x966F, + 0x96BF, 0x976A, 0x9804, 0x98E5, 0x9997, 0x509B, 0x5095, 0x5094, 0x509E, + 0x508B, 0x50A3, 0x5083, 0x508C, 0x508E, 0x509D, 0x5068, 0x509C, 0x5092, + 0x5082, 0x5087, 0x515F, 0x51D4, 0x5312, 0x5311, 0x53A4, 0x53A7, 0x5591, + 0x55A8, 0x55A5, 0x55AD, 0x5577, 0x5645, 0x55A2, 0x5593, 0x5588, 0x558F, + 0x55B5, 0x5581, 0x55A3, 0x5592, 0x55A4, 0x557D, 0x558C, 0x55A6, 0x557F, + 0x5595, 0x55A1, 0x558E, 0x570C, 0x5829, 0x5837, 0x5819, 0x581E, 0x5827, + 0x5823, 0x5828, 0x57F5, 0x5848, 0x5825, 0x581C, 0x581B, 0x5833, 0x583F, + 0x5836, 0x582E, 0x5839, 0x5838, 0x582D, 0x582C, 0x583B, 0x5961, 0x5AAF, + 0x5A94, 0x5A9F, 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, + 0x5AAC, 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A, 0x5A97, 0x5A83, 0x5A8B, + 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, 0x5A9D, 0x5BEA, + 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, 0x5C0C, 0x5C30, 0x5D37, + 0x5D43, 0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, 0x5D35, 0x5D51, 0x5D4E, 0x5D55, + 0x5D33, 0x5D3A, 0x5D52, 0x5D3D, 0x5D31, 0x5D59, 0x5D42, 0x5D39, 0x5D49, + 0x5D38, 0x5D3C, 0x5D32, 0x5D36, 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58, + 0x5FA6, 0x5FA5, 0x5FAB, 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE, 0x60C4, + 0x6114, 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113, 0x60F8, 0x60FC, + 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110, 0x60FF, 0x6104, 0x610B, + 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE, 0x63E5, 0x63E8, 0x63EF, 0x63C3, + 0x649D, 0x63F3, 0x63CA, 0x63E0, 0x63F6, 0x63D5, 0x63F2, 0x63F5, 0x6461, + 0x63DF, 0x63BE, 0x63DD, 0x63DC, 0x63C4, 0x63D8, 0x63D3, 0x63C2, 0x63C7, + 0x63CC, 0x63CB, 0x63C8, 0x63F0, 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, + 0x6564, 0x655C, 0x6568, 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0, + 0x65D2, 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A, 0x6672, + 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC, 0x68EA, 0x68F1, + 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6, 0x6913, 0x6910, 0x68F3, + 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970, 0x68B4, 0x6911, 0x68EF, 0x68C6, + 0x6914, 0x68F8, 0x68D0, 0x68FD, 0x68FC, 0x68E8, 0x690B, 0x690A, 0x6917, + 0x68CE, 0x68C8, 0x68DD, 0x68DE, 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, + 0x68E9, 0x6915, 0x6925, 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, + 0x6B97, 0x6B99, 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC, + 0x6E46, 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45, 0x6E62, + 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33, 0x6E4B, 0x6E40, + 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E, 0x6E68, 0x6E5C, 0x6E61, 0x6E31, + 0x6E28, 0x6E60, 0x6E71, 0x6E6B, 0x6E39, 0x6E22, 0x6E30, 0x6E53, 0x6E65, + 0x6E27, 0x6E78, 0x6E64, 0x6E77, 0x6E55, 0x6E79, 0x6E52, 0x6E66, 0x6E35, + 0x6E36, 0x6E5A, 0x7120, 0x711E, 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, + 0x7125, 0x7122, 0x7132, 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, + 0x7288, 0x7289, 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, 0x7322, + 0x7331, 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, 0x7335, 0x730C, + 0x742E, 0x742C, 0x7430, 0x742B, 0x7416, 0x741A, 0x7421, 0x742D, 0x7431, + 0x7424, 0x7423, 0x741D, 0x7429, 0x7420, 0x7432, 0x74FB, 0x752F, 0x756F, + 0x756C, 0x75E7, 0x75DA, 0x75E1, 0x75E6, 0x75DD, 0x75DF, 0x75E4, 0x75D7, + 0x7695, 0x7692, 0x76DA, 0x7746, 0x7747, 0x7744, 0x774D, 0x7745, 0x774A, + 0x774E, 0x774B, 0x774C, 0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865, 0x785C, + 0x786D, 0x7871, 0x786A, 0x786E, 0x7870, 0x7869, 0x7868, 0x785E, 0x7862, + 0x7974, 0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A, 0x7A03, 0x7A0C, 0x7A04, + 0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B47, 0x7B44, 0x7B48, 0x7B4C, 0x7B4E, + 0x7B40, 0x7B58, 0x7B45, 0x7CA2, 0x7C9E, 0x7CA8, 0x7CA1, 0x7D58, 0x7D6F, + 0x7D63, 0x7D53, 0x7D56, 0x7D67, 0x7D6A, 0x7D4F, 0x7D6D, 0x7D5C, 0x7D6B, + 0x7D52, 0x7D54, 0x7D69, 0x7D51, 0x7D5F, 0x7D4E, 0x7F3E, 0x7F3F, 0x7F65, + 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1, 0x7FD7, 0x8051, 0x804F, 0x8050, 0x80FE, + 0x80D4, 0x8143, 0x814A, 0x8152, 0x814F, 0x8147, 0x813D, 0x814D, 0x813A, + 0x81E6, 0x81EE, 0x81F7, 0x81F8, 0x81F9, 0x8204, 0x823C, 0x823D, 0x823F, + 0x8275, 0x833B, 0x83CF, 0x83F9, 0x8423, 0x83C0, 0x83E8, 0x8412, 0x83E7, + 0x83E4, 0x83FC, 0x83F6, 0x8410, 0x83C6, 0x83C8, 0x83EB, 0x83E3, 0x83BF, + 0x8401, 0x83DD, 0x83E5, 0x83D8, 0x83FF, 0x83E1, 0x83CB, 0x83CE, 0x83D6, + 0x83F5, 0x83C9, 0x8409, 0x840F, 0x83DE, 0x8411, 0x8406, 0x83C2, 0x83F3, + 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA, 0x8413, 0x839A, 0x83C3, 0x83EC, + 0x83EE, 0x83C4, 0x83FB, 0x83D7, 0x83E2, 0x841B, 0x83DB, 0x83FE, 0x86D8, + 0x86E2, 0x86E6, 0x86D3, 0x86E3, 0x86DA, 0x86EA, 0x86DD, 0x86EB, 0x86DC, + 0x86EC, 0x86E9, 0x86D7, 0x86E8, 0x86D1, 0x8848, 0x8856, 0x8855, 0x88BA, + 0x88D7, 0x88B9, 0x88B8, 0x88C0, 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD, + 0x88B2, 0x8901, 0x88C9, 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA, 0x89DB, + 0x8A4E, 0x8A4D, 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58, 0x8A44, 0x8A45, + 0x8A52, 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F, 0x8C5F, 0x8C81, 0x8C80, + 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5, 0x8D84, 0x8D80, 0x8D89, 0x8DD8, + 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6, 0x8DDC, 0x8DCF, 0x8DD5, 0x8DD9, 0x8DC8, + 0x8DD7, 0x8DC5, 0x8EEF, 0x8EF7, 0x8EFA, 0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, + 0x8EF5, 0x8EE7, 0x8EE8, 0x8EF6, 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, + 0x902D, 0x9034, 0x902F, 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108, + 0x90F9, 0x90FB, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, + 0x915F, 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203, 0x921A, 0x9226, + 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD, 0x9206, 0x9204, 0x9227, + 0x9202, 0x921C, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, 0x957B, 0x958D, + 0x958C, 0x9590, 0x9687, 0x967E, 0x9688, 0x9689, 0x9683, 0x9680, 0x96C2, + 0x96C8, 0x96C3, 0x96F1, 0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, + 0x98EB, 0x9CE6, 0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, + 0x50AE, 0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA, + 0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278, 0x527B, + 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA, 0x55DD, 0x55C0, + 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D, 0x55CF, 0x55D5, 0x55E2, + 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9, 0x55C2, 0x5714, 0x5853, 0x5868, + 0x5864, 0x584F, 0x584D, 0x5849, 0x586F, 0x5855, 0x584E, 0x585D, 0x5859, + 0x5865, 0x585B, 0x583D, 0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, + 0x5ABA, 0x5AB8, 0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, + 0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, 0x5BD6, + 0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A, 0x5D65, 0x5D72, + 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0, 0x5E4F, 0x5E4E, 0x5E4A, + 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, 0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, + 0x5FAD, 0x60F7, 0x6149, 0x614A, 0x612B, 0x6145, 0x6136, 0x6132, 0x612E, + 0x6146, 0x612F, 0x614F, 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, + 0x6224, 0x63C5, 0x63F1, 0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, + 0x6433, 0x6443, 0x641F, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, + 0x640C, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642F, 0x640A, 0x641A, + 0x6440, 0x6425, 0x6427, 0x640B, 0x63E7, 0x641B, 0x642E, 0x6421, 0x640E, + 0x656F, 0x6592, 0x65D3, 0x6686, 0x668C, 0x6695, 0x6690, 0x668B, 0x668A, + 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695F, 0x6938, 0x694E, 0x6962, + 0x6971, 0x693F, 0x6945, 0x696A, 0x6939, 0x6942, 0x6957, 0x6959, 0x697A, + 0x6948, 0x6949, 0x6935, 0x696C, 0x6933, 0x693D, 0x6965, 0x68F0, 0x6978, + 0x6934, 0x6969, 0x6940, 0x696F, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, + 0x694C, 0x693B, 0x694B, 0x6937, 0x695C, 0x694F, 0x6951, 0x6932, 0x6952, + 0x692F, 0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43, 0x6B42, 0x6B48, 0x6B41, + 0x6B9B, 0x6BFB, 0x6BFC, 0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6, 0x6EC8, + 0x6E8F, 0x6EC0, 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, + 0x6ED2, 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, 0x6EA6, + 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, 0x6E92, 0x6E8E, + 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, 0x6ECA, 0x6E97, 0x6EAE, + 0x6EA3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, 0x7141, 0x715D, 0x7162, + 0x7172, 0x7178, 0x716A, 0x7161, 0x7142, 0x7158, 0x7143, 0x714B, 0x7170, + 0x715F, 0x7150, 0x7153, 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C, + 0x7291, 0x7290, 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340, 0x734A, + 0x7349, 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457, 0x7440, 0x744F, + 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454, 0x74E1, 0x74FF, 0x74FE, + 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983, 0x75EF, 0x760F, 0x7603, 0x75F7, + 0x75FE, 0x75FC, 0x75F9, 0x75F8, 0x7610, 0x75FB, 0x75F6, 0x75ED, 0x75F5, + 0x75FD, 0x7699, 0x76B5, 0x76DD, 0x7755, 0x775F, 0x7760, 0x7752, 0x7756, + 0x775A, 0x7769, 0x7767, 0x7754, 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, + 0x7894, 0x788F, 0x7884, 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879, + 0x7899, 0x7880, 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979, 0x7A11, + 0x7A18, 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13, 0x7A1B, 0x7A10, + 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64, 0x7B6D, 0x7B74, 0x7B69, + 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70, 0x7B61, 0x7B78, 0x7B76, 0x7B63, + 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88, 0x7D86, 0x7D80, 0x7D8D, 0x7D7F, 0x7D85, + 0x7D7A, 0x7D8E, 0x7D7B, 0x7D83, 0x7D7C, 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, + 0x7D92, 0x7F6D, 0x7F6B, 0x7F67, 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, + 0x7FDB, 0x7FDC, 0x8021, 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B, + 0x8162, 0x8172, 0x6721, 0x815E, 0x8176, 0x8167, 0x816F, 0x8144, 0x8161, + 0x821D, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84F1, 0x843F, 0x8456, + 0x8476, 0x8479, 0x848F, 0x848D, 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, + 0x8430, 0x844D, 0x847D, 0x845A, 0x8459, 0x8474, 0x8473, 0x845D, 0x8507, + 0x845E, 0x8437, 0x843A, 0x8434, 0x847A, 0x8443, 0x8478, 0x8432, 0x8445, + 0x8429, 0x83D9, 0x844B, 0x842F, 0x8442, 0x842D, 0x845F, 0x8470, 0x8439, + 0x844E, 0x844C, 0x8452, 0x846F, 0x84C5, 0x848E, 0x843B, 0x8447, 0x8436, + 0x8433, 0x8468, 0x847E, 0x8444, 0x842B, 0x8460, 0x8454, 0x846E, 0x8450, + 0x870B, 0x8704, 0x86F7, 0x870C, 0x86FA, 0x86D6, 0x86F5, 0x874D, 0x86F8, + 0x870E, 0x8709, 0x8701, 0x86F6, 0x870D, 0x8705, 0x88D6, 0x88CB, 0x88CD, + 0x88CE, 0x88DE, 0x88DB, 0x88DA, 0x88CC, 0x88D0, 0x8985, 0x899B, 0x89DF, + 0x89E5, 0x89E4, 0x89E1, 0x89E0, 0x89E2, 0x89DC, 0x89E6, 0x8A76, 0x8A86, + 0x8A7F, 0x8A61, 0x8A3F, 0x8A77, 0x8A82, 0x8A84, 0x8A75, 0x8A83, 0x8A81, + 0x8A74, 0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, 0x8C65, 0x8C64, 0x8C66, 0x8C86, + 0x8C84, 0x8C85, 0x8CCC, 0x8D68, 0x8D69, 0x8D91, 0x8D8C, 0x8D8E, 0x8D8F, + 0x8D8D, 0x8D93, 0x8D94, 0x8D90, 0x8D92, 0x8DF0, 0x8DE0, 0x8DEC, 0x8DF1, + 0x8DEE, 0x8DD0, 0x8DE9, 0x8DE3, 0x8DE2, 0x8DE7, 0x8DF2, 0x8DEB, 0x8DF4, + 0x8F06, 0x8EFF, 0x8F01, 0x8F00, 0x8F05, 0x8F07, 0x8F08, 0x8F02, 0x8F0B, + 0x9052, 0x903F, 0x9044, 0x9049, 0x903D, 0x9110, 0x910D, 0x910F, 0x9111, + 0x9116, 0x9114, 0x910B, 0x910E, 0x916E, 0x916F, 0x9248, 0x9252, 0x9230, + 0x923A, 0x9266, 0x9233, 0x9265, 0x925E, 0x9283, 0x922E, 0x924A, 0x9246, + 0x926D, 0x926C, 0x924F, 0x9260, 0x9267, 0x926F, 0x9236, 0x9261, 0x9270, + 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924E, 0x9253, 0x924C, 0x9256, + 0x9232, 0x959F, 0x959C, 0x959E, 0x959B, 0x9692, 0x9693, 0x9691, 0x9697, + 0x96CE, 0x96FA, 0x96FD, 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778, 0x9772, + 0x980F, 0x980D, 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF, 0x99B2, 0x99B0, + 0x99B5, 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED, 0x9CE7, 0x9E80, 0x9EFD, + 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3, 0x50DB, 0x50EA, 0x50DD, 0x50E4, + 0x50D3, 0x50EC, 0x50F0, 0x50EF, 0x50E3, 0x50E0, 0x51D8, 0x5280, 0x5281, + 0x52E9, 0x52EB, 0x5330, 0x53AC, 0x5627, 0x5615, 0x560C, 0x5612, 0x55FC, + 0x560F, 0x561C, 0x5601, 0x5613, 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, + 0x55F9, 0x5889, 0x587C, 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874, + 0x588B, 0x587A, 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888, 0x587B, + 0x5894, 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA, + 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC, 0x5ADE, + 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77, 0x5BE0, 0x5BE3, 0x5C63, 0x5D82, + 0x5D80, 0x5D7D, 0x5D86, 0x5D7A, 0x5D81, 0x5D77, 0x5D8A, 0x5D89, 0x5D88, + 0x5D7E, 0x5D7C, 0x5D8D, 0x5D79, 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, + 0x5ED1, 0x5ED7, 0x5ECE, 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, + 0x5F43, 0x5F6F, 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173, + 0x6152, 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A, 0x615B, + 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227, 0x622B, 0x642B, + 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472, 0x6473, 0x647D, 0x6475, + 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E, 0x645C, 0x644B, 0x6453, 0x6460, + 0x6450, 0x647F, 0x643F, 0x646C, 0x646B, 0x6459, 0x6465, 0x6477, 0x6573, + 0x65A0, 0x66A1, 0x66A0, 0x669F, 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, + 0x69C9, 0x69A0, 0x69CE, 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, + 0x698E, 0x69A7, 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, 0x69BD, + 0x69A4, 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, 0x6993, 0x69AA, + 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, 0x69B5, 0x69A5, 0x69C6, + 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BC3, 0x6BC4, 0x6BFE, + 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, 0x6F25, 0x6EF8, 0x6F37, 0x6EFB, 0x6F2E, + 0x6F09, 0x6F4E, 0x6F19, 0x6F1A, 0x6F27, 0x6F18, 0x6F3B, 0x6F12, 0x6EED, + 0x6F0A, 0x6F36, 0x6F73, 0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30, 0x6F3C, + 0x6F35, 0x6EEB, 0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD, 0x6EF6, 0x6F39, + 0x6F1C, 0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E, 0x6F08, 0x6F21, 0x7187, + 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718F, 0x717B, 0x7186, 0x7181, + 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, 0x734D, 0x7351, + 0x734C, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, 0x7467, 0x746E, 0x7500, + 0x7502, 0x7503, 0x757D, 0x7590, 0x7616, 0x7608, 0x760C, 0x7615, 0x7611, + 0x760A, 0x7614, 0x76B8, 0x7781, 0x777C, 0x7785, 0x7782, 0x776E, 0x7780, + 0x776F, 0x777E, 0x7783, 0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8, 0x787E, + 0x78AB, 0x789E, 0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4, 0x7998, 0x798A, + 0x798B, 0x7996, 0x7995, 0x7994, 0x7993, 0x7997, 0x7988, 0x7992, 0x7990, + 0x7A2B, 0x7A4A, 0x7A30, 0x7A2F, 0x7A28, 0x7A26, 0x7AA8, 0x7AAB, 0x7AAC, + 0x7AEE, 0x7B88, 0x7B9C, 0x7B8A, 0x7B91, 0x7B90, 0x7B96, 0x7B8D, 0x7B8C, + 0x7B9B, 0x7B8E, 0x7B85, 0x7B98, 0x5284, 0x7B99, 0x7BA4, 0x7B82, 0x7CBB, + 0x7CBF, 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7, 0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1, + 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE, 0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC, 0x7DAF, + 0x7DB9, 0x7D96, 0x7DBC, 0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9, 0x7DA1, 0x7DC9, + 0x7F73, 0x7FE2, 0x7FE3, 0x7FE5, 0x7FDE, 0x8024, 0x805D, 0x805C, 0x8189, + 0x8186, 0x8183, 0x8187, 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4, + 0x84A1, 0x849F, 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB, 0x84B9, + 0x84B4, 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0, 0x849D, 0x84A7, + 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B, 0x84A9, 0x84AF, 0x84A8, + 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0, 0x84D7, 0x84D4, 0x84D2, 0x84DB, + 0x84B0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876B, 0x8740, 0x872E, + 0x871E, 0x8721, 0x8719, 0x871B, 0x8743, 0x872C, 0x8741, 0x873E, 0x8746, + 0x8720, 0x8732, 0x872A, 0x872D, 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, + 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7, + 0x88E7, 0x88F1, 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6, 0x88FB, + 0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E, 0x89E9, 0x89EB, + 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F, 0x8A96, 0x8C3D, 0x8C68, + 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96, 0x8E09, 0x8E02, 0x8DFF, 0x8E0D, + 0x8DFD, 0x8E0A, 0x8E03, 0x8E07, 0x8E06, 0x8E05, 0x8DFE, 0x8E00, 0x8E04, + 0x8F10, 0x8F11, 0x8F0E, 0x8F0D, 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, + 0x911D, 0x911A, 0x9124, 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, + 0x92A5, 0x92A4, 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D, + 0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3, 0x92EE, 0x928E, + 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1, 0x928A, 0x9286, 0x928C, + 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9, 0x929D, 0x928B, 0x922D, 0x969E, + 0x96A1, 0x96FF, 0x9758, 0x977D, 0x977A, 0x977E, 0x9783, 0x9780, 0x9782, + 0x977B, 0x9784, 0x9781, 0x977F, 0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, + 0x9902, 0x9900, 0x9907, 0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, + 0x99C2, 0x99BD, 0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60, + 0x9B61, 0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103, 0x5130, + 0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C, 0x50FD, 0x510A, + 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642, 0x564C, 0x5635, 0x5641, + 0x564A, 0x5649, 0x5646, 0x5658, 0x565A, 0x5640, 0x5633, 0x563D, 0x562C, + 0x563E, 0x5638, 0x562A, 0x563A, 0x571A, 0x58AB, 0x589D, 0x58B1, 0x58A0, + 0x58A3, 0x58AF, 0x58AC, 0x58A5, 0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, + 0x5AF7, 0x5AF6, 0x5B03, 0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05, + 0x5B0F, 0x5C67, 0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, 0x5D95, + 0x5DA0, 0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, 0x5E60, 0x5E5C, + 0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, 0x618B, 0x6183, 0x6179, + 0x61B1, 0x61B0, 0x61A2, 0x6189, 0x619B, 0x6193, 0x61AF, 0x61AD, 0x619F, + 0x6192, 0x61AA, 0x61A1, 0x618D, 0x6166, 0x61B3, 0x622D, 0x646E, 0x6470, + 0x6496, 0x64A0, 0x6485, 0x6497, 0x649C, 0x648F, 0x648B, 0x648A, 0x648C, + 0x64A3, 0x649F, 0x6468, 0x64B1, 0x6498, 0x6576, 0x657A, 0x6579, 0x657B, + 0x65B2, 0x65B3, 0x66B5, 0x66B0, 0x66A9, 0x66B2, 0x66B7, 0x66AA, 0x66AF, + 0x6A00, 0x6A06, 0x6A17, 0x69E5, 0x69F8, 0x6A15, 0x69F1, 0x69E4, 0x6A20, + 0x69FF, 0x69EC, 0x69E2, 0x6A1B, 0x6A1D, 0x69FE, 0x6A27, 0x69F2, 0x69EE, + 0x6A14, 0x69F7, 0x69E7, 0x6A40, 0x6A08, 0x69E6, 0x69FB, 0x6A0D, 0x69FC, + 0x69EB, 0x6A09, 0x6A04, 0x6A18, 0x6A25, 0x6A0F, 0x69F6, 0x6A26, 0x6A07, + 0x69F4, 0x6A16, 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, 0x6C00, + 0x6BFF, 0x6C02, 0x6F41, 0x6F26, 0x6F7E, 0x6F87, 0x6FC6, 0x6F92, 0x6F8D, + 0x6F89, 0x6F8C, 0x6F62, 0x6F4F, 0x6F85, 0x6F5A, 0x6F96, 0x6F76, 0x6F6C, + 0x6F82, 0x6F55, 0x6F72, 0x6F52, 0x6F50, 0x6F57, 0x6F94, 0x6F93, 0x6F5D, + 0x6F00, 0x6F61, 0x6F6B, 0x6F7D, 0x6F67, 0x6F90, 0x6F53, 0x6F8B, 0x6F69, + 0x6F7F, 0x6F95, 0x6F63, 0x6F77, 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B, + 0x71B0, 0x71A0, 0x719A, 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E, 0x71A4, + 0x71A1, 0x71AA, 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A, 0x7358, 0x7352, + 0x735E, 0x735F, 0x7360, 0x735D, 0x735B, 0x7361, 0x735A, 0x7359, 0x7362, + 0x7487, 0x7489, 0x748A, 0x7486, 0x7481, 0x747D, 0x7485, 0x7488, 0x747C, + 0x7479, 0x7508, 0x7507, 0x757E, 0x7625, 0x761E, 0x7619, 0x761D, 0x761C, + 0x7623, 0x761A, 0x7628, 0x761B, 0x769C, 0x769D, 0x769E, 0x769B, 0x778D, + 0x778F, 0x7789, 0x7788, 0x78CD, 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, + 0x78D4, 0x78C8, 0x78C3, 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C, + 0x79A2, 0x799B, 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7, 0x7BCB, + 0x7BBE, 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5, 0x7CC5, 0x7CC8, + 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7, 0x7DD7, 0x7DE1, 0x7E03, + 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0, 0x7DEE, 0x7DDF, 0x7F76, 0x7FAC, + 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB, 0x7FEA, 0x7FEC, 0x7FE6, 0x7FE8, 0x8064, + 0x8067, 0x81A3, 0x819F, 0x819E, 0x8195, 0x81A2, 0x8199, 0x8197, 0x8216, + 0x824F, 0x8253, 0x8252, 0x8250, 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, + 0x8500, 0x8529, 0x850E, 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C, + 0x84FB, 0x852B, 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2, 0x8515, + 0x84F7, 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9, 0x8516, 0x84FE, + 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E, 0x84F6, 0x8531, 0x8526, + 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9, 0x8518, 0x8520, 0x8530, 0x850B, + 0x8519, 0x852F, 0x8662, 0x8756, 0x8763, 0x8764, 0x8777, 0x87E1, 0x8773, + 0x8758, 0x8754, 0x875B, 0x8752, 0x8761, 0x875A, 0x8751, 0x875E, 0x876D, + 0x876A, 0x8750, 0x874E, 0x875F, 0x875D, 0x876F, 0x876C, 0x877A, 0x876E, + 0x875C, 0x8765, 0x874F, 0x877B, 0x8775, 0x8762, 0x8767, 0x8769, 0x885A, + 0x8905, 0x890C, 0x8914, 0x890B, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, + 0x8911, 0x890E, 0x8909, 0x89A2, 0x89A4, 0x89A3, 0x89ED, 0x89F0, 0x89EC, + 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, 0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, 0x8AD7, + 0x8ABE, 0x8AC0, 0x8AC5, 0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, 0x8AD9, 0x8C3E, + 0x8C4D, 0x8C8F, 0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, 0x8CDA, 0x8CDD, 0x8CE7, + 0x8DA0, 0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, 0x8E23, 0x8E25, 0x8E24, 0x8E2E, + 0x8E15, 0x8E1B, 0x8E16, 0x8E11, 0x8E19, 0x8E26, 0x8E27, 0x8E14, 0x8E12, + 0x8E18, 0x8E13, 0x8E1C, 0x8E17, 0x8E1A, 0x8F2C, 0x8F24, 0x8F18, 0x8F1A, + 0x8F20, 0x8F23, 0x8F16, 0x8F17, 0x9073, 0x9070, 0x906F, 0x9067, 0x906B, + 0x912F, 0x912B, 0x9129, 0x912A, 0x9132, 0x9126, 0x912E, 0x9185, 0x9186, + 0x918A, 0x9181, 0x9182, 0x9184, 0x9180, 0x92D0, 0x92C3, 0x92C4, 0x92C0, + 0x92D9, 0x92B6, 0x92CF, 0x92F1, 0x92DF, 0x92D8, 0x92E9, 0x92D7, 0x92DD, + 0x92CC, 0x92EF, 0x92C2, 0x92E8, 0x92CA, 0x92C8, 0x92CE, 0x92E6, 0x92CD, + 0x92D5, 0x92C9, 0x92E0, 0x92DE, 0x92E7, 0x92D1, 0x92D3, 0x92B5, 0x92E1, + 0x9325, 0x92C6, 0x92B4, 0x957C, 0x95AC, 0x95AB, 0x95AE, 0x95B0, 0x96A4, + 0x96A2, 0x96D3, 0x9705, 0x9708, 0x9702, 0x975A, 0x978A, 0x978E, 0x9788, + 0x97D0, 0x97CF, 0x981E, 0x981D, 0x9826, 0x9829, 0x9828, 0x9820, 0x981B, + 0x9827, 0x98B2, 0x9908, 0x98FA, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, + 0x99DC, 0x99CD, 0x99CF, 0x99D3, 0x99D4, 0x99CE, 0x99C9, 0x99D6, 0x99D8, + 0x99CB, 0x99D7, 0x99CC, 0x9AB3, 0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, 0x9AF1, + 0x9B46, 0x9B43, 0x9B67, 0x9B74, 0x9B71, 0x9B66, 0x9B76, 0x9B75, 0x9B70, + 0x9B68, 0x9B64, 0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, 0x9CFF, 0x9CF7, 0x9D07, + 0x9D00, 0x9CF9, 0x9CFB, 0x9D08, 0x9D05, 0x9D04, 0x9E83, 0x9ED3, 0x9F0F, + 0x9F10, 0x511C, 0x5113, 0x5117, 0x511A, 0x5111, 0x51DE, 0x5334, 0x53E1, + 0x5670, 0x5660, 0x566E, 0x5673, 0x5666, 0x5663, 0x566D, 0x5672, 0x565E, + 0x5677, 0x571C, 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF, 0x58BA, 0x58C2, + 0x58BC, 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21, 0x5B14, 0x5B13, 0x5B10, + 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1, 0x5DA9, + 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2, 0x5DAD, 0x5DAF, + 0x5DB4, 0x5E67, 0x5E68, 0x5E66, 0x5E6F, 0x5EE9, 0x5EE7, 0x5EE6, 0x5EE8, + 0x5EE5, 0x5F4B, 0x5FBC, 0x5FBB, 0x619D, 0x61A8, 0x6196, 0x61C5, 0x61B4, + 0x61C6, 0x61C1, 0x61CC, 0x61BA, 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6, + 0x64D0, 0x64CF, 0x64C9, 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3, 0x64D9, + 0x6533, 0x657F, 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0, 0x66CA, 0x66CB, + 0x66CF, 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723, 0x6A34, 0x6A66, 0x6A49, + 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D, 0x6A6D, 0x6A76, 0x6A5B, 0x6A51, + 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, 0x6A41, 0x6A6A, 0x6A64, 0x6A50, 0x6A4F, + 0x6A54, 0x6A6F, 0x6A69, 0x6A60, 0x6A3C, 0x6A5E, 0x6A56, 0x6A55, 0x6A4D, + 0x6A4E, 0x6A46, 0x6B55, 0x6B54, 0x6B56, 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, + 0x6BC7, 0x6C04, 0x6C03, 0x6C06, 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, + 0x6FCE, 0x6FC8, 0x6F5E, 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, 0x7004, + 0x6FA5, 0x6FAE, 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, 0x6FB8, 0x6FA2, + 0x6FC9, 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, 0x71C5, 0x71C2, 0x71BF, + 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB, 0x71D4, 0x71CA, 0x71C7, 0x71CF, + 0x71BD, 0x71D8, 0x71BC, 0x71C6, 0x71DA, 0x71DB, 0x729D, 0x729E, 0x7369, + 0x7366, 0x7367, 0x736C, 0x7365, 0x736B, 0x736A, 0x747F, 0x749A, 0x74A0, + 0x7494, 0x7492, 0x7495, 0x74A1, 0x750B, 0x7580, 0x762F, 0x762D, 0x7631, + 0x763D, 0x7633, 0x763C, 0x7635, 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A, + 0x779D, 0x77A1, 0x779C, 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799, 0x7797, + 0x78DD, 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3, 0x78DB, 0x78E1, 0x78E2, + 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44, 0x7A48, 0x7A47, 0x7AB6, 0x7AB8, + 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE, 0x7BE3, 0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, + 0x7BDA, 0x7BE8, 0x7BF9, 0x7BD4, 0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, 0x7BD8, + 0x7BDF, 0x7CD2, 0x7CD4, 0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, 0x7E21, 0x7E17, + 0x7E0C, 0x7E1F, 0x7E20, 0x7E13, 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22, + 0x7E0B, 0x7E0F, 0x7E16, 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43, 0x7F7B, + 0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C, 0x81B1, 0x81A6, + 0x81AE, 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC, 0x81B4, 0x81B2, 0x81B7, + 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856B, 0x854D, + 0x8553, 0x8561, 0x8558, 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, + 0x8551, 0x8547, 0x8563, 0x853E, 0x855B, 0x8571, 0x854E, 0x856E, 0x8575, + 0x8555, 0x8567, 0x8560, 0x858C, 0x8566, 0x855D, 0x8554, 0x8565, 0x856C, + 0x8663, 0x8665, 0x8664, 0x87A4, 0x879B, 0x878F, 0x8797, 0x8793, 0x8792, + 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87A3, 0x8785, 0x8790, + 0x8791, 0x879D, 0x8784, 0x8794, 0x879C, 0x879A, 0x8789, 0x891E, 0x8926, + 0x8930, 0x892D, 0x892E, 0x8927, 0x8931, 0x8922, 0x8929, 0x8923, 0x892F, + 0x892C, 0x891F, 0x89F1, 0x8AE0, 0x8AE2, 0x8AF2, 0x8AF4, 0x8AF5, 0x8ADD, + 0x8B14, 0x8AE4, 0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, + 0x8AEF, 0x8AFB, 0x8C91, 0x8C92, 0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, + 0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38, 0x8E40, + 0x8E45, 0x8E36, 0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F, 0x8EBD, 0x8F36, + 0x8F2E, 0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34, 0x9076, 0x9079, 0x907B, + 0x9086, 0x90FA, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191, 0x918D, + 0x918F, 0x9327, 0x931E, 0x9308, 0x931F, 0x9306, 0x930F, 0x937A, 0x9338, + 0x933C, 0x931B, 0x9323, 0x9312, 0x9301, 0x9346, 0x932D, 0x930E, 0x930D, + 0x92CB, 0x931D, 0x92FA, 0x9313, 0x92F9, 0x92F7, 0x9334, 0x9302, 0x9324, + 0x92FF, 0x9329, 0x9339, 0x9335, 0x932A, 0x9314, 0x930C, 0x930B, 0x92FE, + 0x9309, 0x9300, 0x92FB, 0x9316, 0x95BC, 0x95CD, 0x95BE, 0x95B9, 0x95BA, + 0x95B6, 0x95BF, 0x95B5, 0x95BD, 0x96A9, 0x96D4, 0x970B, 0x9712, 0x9710, + 0x9799, 0x9797, 0x9794, 0x97F0, 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924, + 0x991F, 0x9927, 0x9929, 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4, 0x99F0, + 0x99E3, 0x99EA, 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, 0x9ABB, 0x9AF6, + 0x9AFA, 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85, 0x9B87, 0x9B7C, 0x9B7E, + 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90, 0x9B7A, 0x9B95, 0x9B7D, 0x9B88, + 0x9D25, 0x9D17, 0x9D20, 0x9D1E, 0x9D14, 0x9D29, 0x9D1D, 0x9D18, 0x9D22, + 0x9D10, 0x9D19, 0x9D1F, 0x9E88, 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, + 0x9ED6, 0x9EFA, 0x9F12, 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, + 0x5129, 0x52F4, 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E, + 0x5682, 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D, 0x5B25, + 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E, 0x5B7B, 0x5BF1, + 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x61C3, 0x61B5, 0x61BC, 0x61E7, + 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE, 0x64EF, 0x64E9, 0x64E3, 0x64EB, + 0x64E4, 0x64E8, 0x6581, 0x6580, 0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, + 0x6A81, 0x6AA5, 0x6A89, 0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, + 0x6A8E, 0x6A95, 0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, + 0x6A85, 0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, 0x6FF4, + 0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, 0x6FF2, 0x6FDD, + 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2, 0x71E4, 0x71F0, 0x71E2, + 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2, 0x74AB, 0x7490, 0x74AA, 0x74AD, + 0x74B1, 0x74A5, 0x74AF, 0x7510, 0x7511, 0x7512, 0x750F, 0x7584, 0x7643, + 0x7648, 0x7649, 0x7647, 0x76A4, 0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, + 0x77B6, 0x77B4, 0x77B1, 0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902, 0x78FB, + 0x78FC, 0x78FF, 0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB, 0x79A8, + 0x7A5C, 0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE, 0x7AC0, 0x7AC1, + 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB, 0x7C0E, 0x7BF4, 0x7C0B, + 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01, 0x7BF8, 0x7BFD, 0x7C06, 0x7BF0, + 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8, 0x7E2D, 0x7E3C, 0x7E42, 0x7E33, 0x9848, + 0x7E38, 0x7E2A, 0x7E49, 0x7E40, 0x7E47, 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, + 0x7E36, 0x7E44, 0x7E3A, 0x7F45, 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, + 0x802C, 0x81BB, 0x81C4, 0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9, + 0x825B, 0x825A, 0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595, 0x85A0, + 0x858B, 0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E, 0x8577, 0x857C, 0x8589, + 0x85A1, 0x857A, 0x8578, 0x8557, 0x858E, 0x8596, 0x8586, 0x858D, 0x8599, + 0x859D, 0x8581, 0x85A2, 0x8582, 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, + 0x8590, 0x859F, 0x8668, 0x87BE, 0x87AA, 0x87AD, 0x87C5, 0x87B0, 0x87AC, + 0x87B9, 0x87B5, 0x87BC, 0x87AE, 0x87C9, 0x87C3, 0x87C2, 0x87CC, 0x87B7, + 0x87AF, 0x87C4, 0x87CA, 0x87B4, 0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE, + 0x87B2, 0x8935, 0x8933, 0x893C, 0x893E, 0x8941, 0x8952, 0x8937, 0x8942, + 0x89AD, 0x89AF, 0x89AE, 0x89F2, 0x89F3, 0x8B1E, 0x8B18, 0x8B16, 0x8B11, + 0x8B05, 0x8B0B, 0x8B22, 0x8B0F, 0x8B12, 0x8B15, 0x8B07, 0x8B0D, 0x8B08, + 0x8B06, 0x8B1C, 0x8B13, 0x8B1A, 0x8C4F, 0x8C70, 0x8C72, 0x8C71, 0x8C6F, + 0x8C95, 0x8C94, 0x8CF9, 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53, 0x8E50, 0x8E4C, + 0x8E47, 0x8F43, 0x8F40, 0x9085, 0x907E, 0x9138, 0x919A, 0x91A2, 0x919B, + 0x9199, 0x919F, 0x91A1, 0x919D, 0x91A0, 0x93A1, 0x9383, 0x93AF, 0x9364, + 0x9356, 0x9347, 0x937C, 0x9358, 0x935C, 0x9376, 0x9349, 0x9350, 0x9351, + 0x9360, 0x936D, 0x938F, 0x934C, 0x936A, 0x9379, 0x9357, 0x9355, 0x9352, + 0x934F, 0x9371, 0x9377, 0x937B, 0x9361, 0x935E, 0x9363, 0x9367, 0x934E, + 0x9359, 0x95C7, 0x95C0, 0x95C9, 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0, + 0x96AC, 0x9720, 0x971F, 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1, 0x979C, + 0x979E, 0x979D, 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844, 0x984A, 0x9849, + 0x9845, 0x9843, 0x9925, 0x992B, 0x992C, 0x992A, 0x9933, 0x9932, 0x992F, + 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3, 0x99A1, 0x9A02, 0x99FA, 0x99F4, + 0x99F7, 0x99F9, 0x99F8, 0x99F6, 0x99FB, 0x99FD, 0x99FE, 0x99FC, 0x9A03, + 0x9ABE, 0x9AFE, 0x9AFD, 0x9B01, 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, 0x9B9E, + 0x9B9B, 0x9BA6, 0x9BA1, 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, + 0x9D33, 0x9D41, 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30, + 0x9D45, 0x9D42, 0x9D43, 0x9D3E, 0x9D37, 0x9D40, 0x9D3D, 0x7FF5, 0x9D2D, + 0x9E8A, 0x9E89, 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, 0x9EFB, 0x9EFF, 0x9F24, + 0x9F23, 0x9F22, 0x9F54, 0x9FA0, 0x5131, 0x512D, 0x512E, 0x5698, 0x569C, + 0x5697, 0x569A, 0x569D, 0x5699, 0x5970, 0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, + 0x5E6D, 0x5E6E, 0x61D8, 0x61DF, 0x61ED, 0x61EE, 0x61F1, 0x61EA, 0x61F0, + 0x61EB, 0x61D6, 0x61E9, 0x64FF, 0x6504, 0x64FD, 0x64F8, 0x6501, 0x6503, + 0x64FC, 0x6594, 0x65DB, 0x66DA, 0x66DB, 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, + 0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, 0x6B5E, + 0x6BC9, 0x6C0B, 0x7007, 0x700C, 0x700D, 0x7001, 0x7005, 0x7014, 0x700E, + 0x6FFF, 0x7000, 0x6FFB, 0x7026, 0x6FFC, 0x6FF7, 0x700A, 0x7201, 0x71FF, + 0x71F9, 0x7203, 0x71FD, 0x7376, 0x74B8, 0x74C0, 0x74B5, 0x74C1, 0x74BE, + 0x74B6, 0x74BB, 0x74C2, 0x7514, 0x7513, 0x765C, 0x7664, 0x7659, 0x7650, + 0x7653, 0x7657, 0x765A, 0x76A6, 0x76BD, 0x76EC, 0x77C2, 0x77BA, 0x790C, + 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79AD, 0x79AC, 0x7A5F, + 0x7C1C, 0x7C29, 0x7C19, 0x7C20, 0x7C1F, 0x7C2D, 0x7C1D, 0x7C26, 0x7C28, + 0x7C22, 0x7C25, 0x7C30, 0x7E5C, 0x7E50, 0x7E56, 0x7E63, 0x7E58, 0x7E62, + 0x7E5F, 0x7E51, 0x7E60, 0x7E57, 0x7E53, 0x7FB5, 0x7FB3, 0x7FF7, 0x7FF8, + 0x8075, 0x81D1, 0x81D2, 0x81D0, 0x825F, 0x825E, 0x85B4, 0x85C6, 0x85C0, + 0x85C3, 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7, 0x85C4, 0x85BF, 0x85CB, + 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6, 0x85D2, 0x8624, 0x85B8, 0x85B7, + 0x85BE, 0x8669, 0x87E7, 0x87E6, 0x87E2, 0x87DB, 0x87EB, 0x87EA, 0x87E5, + 0x87DF, 0x87F3, 0x87E4, 0x87D4, 0x87DC, 0x87D3, 0x87ED, 0x87D8, 0x87E3, + 0x87D7, 0x87D9, 0x8801, 0x87F4, 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, + 0x894C, 0x8946, 0x8950, 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33, + 0x8B30, 0x8B35, 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25, 0x8B37, + 0x8B26, 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, 0x8C75, + 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02, 0x8D00, 0x8E5C, 0x8E62, + 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65, 0x8E67, 0x8E5B, 0x8E5A, 0x8E61, + 0x8E5D, 0x8E69, 0x8E54, 0x8F46, 0x8F47, 0x8F48, 0x8F4B, 0x9128, 0x913A, + 0x913B, 0x913E, 0x91A8, 0x91A5, 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, + 0x9392, 0x93B7, 0x939B, 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, + 0x93A6, 0x9395, 0x9388, 0x9399, 0x939F, 0x9380, 0x938D, 0x93B1, 0x9391, + 0x93B2, 0x93A4, 0x93A8, 0x93B4, 0x93A3, 0x95D2, 0x95D3, 0x95D1, 0x96B3, + 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723, 0x9722, 0x9725, + 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA, 0x97A2, 0x97A5, 0x97D7, + 0x97D9, 0x97D6, 0x97D8, 0x97FA, 0x9850, 0x9851, 0x9852, 0x98B8, 0x9941, + 0x993C, 0x993A, 0x9A0F, 0x9A0B, 0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, + 0x9A05, 0x9A07, 0x9A06, 0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, + 0x9B35, 0x9B4A, 0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, + 0x9BB5, 0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, 0x9D53, + 0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, 0x9D57, 0x9D52, + 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, 0x9EDF, 0x9F01, 0x9F00, + 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, 0x9F28, 0x9F4C, 0x9F55, 0x5134, + 0x5135, 0x5296, 0x52F7, 0x53B4, 0x56AB, 0x56AD, 0x56A6, 0x56A7, 0x56AA, + 0x56AC, 0x58DA, 0x58DD, 0x58DB, 0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, + 0x5E70, 0x5FBF, 0x61FB, 0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, + 0x6584, 0x65DE, 0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, 0x6AD9, + 0x6ACB, 0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, 0x6ADE, 0x6B60, + 0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, 0x702B, 0x7021, 0x7022, + 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, 0x720C, 0x720A, 0x7207, 0x7202, + 0x7205, 0x72A5, 0x72A6, 0x72A4, 0x72A3, 0x72A1, 0x74CB, 0x74C5, 0x74B7, + 0x74C3, 0x7516, 0x7660, 0x77C9, 0x77CA, 0x77C4, 0x77F1, 0x791D, 0x791B, + 0x7921, 0x791C, 0x7917, 0x791E, 0x79B0, 0x7A67, 0x7A68, 0x7C33, 0x7C3C, + 0x7C39, 0x7C2C, 0x7C3B, 0x7CEC, 0x7CEA, 0x7E76, 0x7E75, 0x7E78, 0x7E70, + 0x7E77, 0x7E6F, 0x7E7A, 0x7E72, 0x7E74, 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, + 0x7F86, 0x7FB7, 0x7FFD, 0x7FFE, 0x8078, 0x81D7, 0x81D5, 0x820B, 0x8264, + 0x8261, 0x8263, 0x85EB, 0x85F1, 0x85ED, 0x85D9, 0x85E1, 0x85E8, 0x85DA, + 0x85D7, 0x85EC, 0x85F2, 0x85F8, 0x85D8, 0x85DF, 0x85E3, 0x85DC, 0x85D1, + 0x85F0, 0x85E6, 0x85EF, 0x85DE, 0x85E2, 0x8800, 0x87FA, 0x8803, 0x87F6, + 0x87F7, 0x8809, 0x880C, 0x880B, 0x8806, 0x87FC, 0x8808, 0x87FF, 0x880A, + 0x8802, 0x8962, 0x895A, 0x895B, 0x8957, 0x8961, 0x895C, 0x8958, 0x895D, + 0x8959, 0x8988, 0x89B7, 0x89B6, 0x89F6, 0x8B50, 0x8B48, 0x8B4A, 0x8B40, + 0x8B53, 0x8B56, 0x8B54, 0x8B4B, 0x8B55, 0x8B51, 0x8B42, 0x8B52, 0x8B57, + 0x8C43, 0x8C77, 0x8C76, 0x8C9A, 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA, + 0x8DAD, 0x8DAB, 0x8E6D, 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B, 0x8EC2, + 0x8F52, 0x8F51, 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140, 0x913F, 0x91B0, + 0x91AD, 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA, 0x93D0, 0x93F9, 0x93EC, + 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA, 0x93D4, 0x93EE, 0x93E3, 0x93D5, + 0x93C4, 0x93CE, 0x93C0, 0x93D2, 0x93A5, 0x93E7, 0x957D, 0x95DA, 0x95DB, + 0x96E1, 0x9729, 0x972B, 0x972C, 0x9728, 0x9726, 0x97B3, 0x97B7, 0x97B6, + 0x97DD, 0x97DE, 0x97DF, 0x985C, 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, + 0x98BB, 0x98BE, 0x9948, 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15, + 0x9A25, 0x9A1D, 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23, 0x9A1E, + 0x9A1C, 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C, 0x9B37, 0x9BEA, + 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2, 0x9BF0, 0x9BD4, 0x9BD7, + 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5, 0x9BE1, 0x9BDA, 0x9D77, 0x9D81, + 0x9D8A, 0x9D84, 0x9D88, 0x9D71, 0x9D80, 0x9D78, 0x9D86, 0x9D8B, 0x9D8C, + 0x9D7D, 0x9D6B, 0x9D74, 0x9D75, 0x9D70, 0x9D69, 0x9D85, 0x9D73, 0x9D7B, + 0x9D82, 0x9D6F, 0x9D79, 0x9D7F, 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, + 0x9EFC, 0x9F2D, 0x9F40, 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337, + 0x56B2, 0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE, 0x5EEF, + 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65DF, 0x66E8, + 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8, 0x6AF9, 0x6AF1, 0x6AEE, + 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, + 0x703F, 0x703A, 0x7039, 0x702A, 0x7040, 0x703B, 0x7033, 0x7041, 0x7213, + 0x7214, 0x72A8, 0x737D, 0x737C, 0x74BA, 0x76AB, 0x76AA, 0x76BE, 0x76ED, + 0x77CC, 0x77CE, 0x77CF, 0x77CD, 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, + 0x7924, 0x7929, 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48, + 0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80, 0x7FBA, + 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x8268, 0x8269, 0x8622, 0x85FF, 0x8601, + 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604, 0x8609, 0x8605, 0x860C, 0x85FD, + 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, 0x8963, 0x8966, 0x89B9, + 0x89F7, 0x8B60, 0x8B6A, 0x8B5D, 0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, + 0x8DAE, 0x8E86, 0x8E88, 0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, + 0x8F5A, 0x908D, 0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B, + 0x9413, 0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410, 0x9428, + 0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E, 0x9416, 0x9412, + 0x93FA, 0x9409, 0x93F8, 0x943C, 0x940A, 0x93FF, 0x93FC, 0x940C, 0x93F6, + 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF, 0x972E, 0x972F, 0x97B9, 0x97BB, + 0x97FD, 0x97FE, 0x9860, 0x9862, 0x9863, 0x985F, 0x98C1, 0x98C2, 0x9950, + 0x994E, 0x9959, 0x994C, 0x994B, 0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, + 0x9A2A, 0x9A36, 0x9A29, 0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, + 0x9B10, 0x9B12, 0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, + 0x9C40, 0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F, 0x9D99, + 0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B, 0x9DA0, 0x9D94, 0x9D9C, + 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A, 0x9DA2, 0x9DA8, 0x9D9E, 0x9DA3, 0x9DBF, + 0x9DA9, 0x9D96, 0x9DA6, 0x9DA7, 0x9E99, 0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, + 0x9EE7, 0x9EE6, 0x9F30, 0x9F2E, 0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, 0x9F59, + 0x9F91, 0x513A, 0x5139, 0x5298, 0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48, + 0x5B47, 0x5DCB, 0x5DCF, 0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC, 0x6B03, + 0x6AF8, 0x6B00, 0x7043, 0x7044, 0x704A, 0x7048, 0x7049, 0x7045, 0x7046, + 0x721D, 0x721A, 0x7219, 0x737E, 0x7517, 0x766A, 0x77D0, 0x792D, 0x7931, + 0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A, 0x7E87, 0x7E88, 0x7E8B, 0x7E86, + 0x7E8D, 0x7F4D, 0x7FBB, 0x8030, 0x81DD, 0x8618, 0x862A, 0x8626, 0x861F, + 0x8623, 0x861C, 0x8619, 0x8627, 0x862E, 0x8621, 0x8620, 0x8629, 0x861E, + 0x8625, 0x8829, 0x881D, 0x881B, 0x8820, 0x8824, 0x881C, 0x882B, 0x884A, + 0x896D, 0x8969, 0x896E, 0x896B, 0x89FA, 0x8B79, 0x8B78, 0x8B45, 0x8B7A, + 0x8B7B, 0x8D10, 0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E, 0x8F5B, 0x8F5D, + 0x9146, 0x9144, 0x9145, 0x91B9, 0x943F, 0x943B, 0x9436, 0x9429, 0x943D, + 0x9430, 0x9439, 0x942A, 0x9437, 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4, + 0x95E3, 0x9735, 0x973A, 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6, 0x98C0, + 0x9958, 0x9956, 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42, 0x9A41, 0x9A3A, + 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16, 0x9B3A, 0x9B52, 0x9C2B, + 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28, 0x9C29, 0x9C24, 0x9C21, 0x9DB7, + 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7, 0x9DCA, 0x9DCF, 0x9DBE, 0x9DC5, 0x9DC3, + 0x9DBB, 0x9DB5, 0x9DCE, 0x9DB9, 0x9DBA, 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, + 0x9DCC, 0x9DB3, 0x9DCD, 0x9DB2, 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, + 0x9F1B, 0x9F18, 0x9F1A, 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9, + 0x56C6, 0x56C5, 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1, 0x5EF2, + 0x6521, 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09, 0x6C0D, 0x7055, + 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9, 0x737F, 0x74D8, 0x74D5, + 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935, 0x79B4, 0x7A70, 0x7A71, 0x7C57, + 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A, 0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, 0x7F87, + 0x81DE, 0x826B, 0x8634, 0x8635, 0x8633, 0x862C, 0x8632, 0x8636, 0x882C, + 0x8828, 0x8826, 0x882A, 0x8825, 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, + 0x8B84, 0x8B82, 0x8B86, 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A, + 0x8E92, 0x8E90, 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C, 0x9450, + 0x944A, 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973F, + 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B, 0x9A4E, 0x9A53, 0x9A54, + 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A, 0x9A49, 0x9A52, 0x9A50, 0x9AD0, 0x9B19, + 0x9B2B, 0x9B3B, 0x9B56, 0x9B55, 0x9C46, 0x9C48, 0x9C3F, 0x9C44, 0x9C39, + 0x9C33, 0x9C41, 0x9C3C, 0x9C37, 0x9C34, 0x9C32, 0x9C3D, 0x9C36, 0x9DDB, + 0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, 0x9DE9, + 0x9DD9, 0x9DD8, 0x9DD6, 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, 0x9EF0, 0x9F35, + 0x9F33, 0x9F32, 0x9F42, 0x9F6B, 0x9F95, 0x9FA2, 0x513D, 0x5299, 0x58E8, + 0x58E7, 0x5972, 0x5B4D, 0x5DD8, 0x882F, 0x5F4F, 0x6201, 0x6203, 0x6204, + 0x6529, 0x6525, 0x6596, 0x66EB, 0x6B11, 0x6B12, 0x6B0F, 0x6BCA, 0x705B, + 0x705A, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77D4, 0x7C67, 0x7C66, + 0x7E95, 0x826C, 0x863A, 0x8640, 0x8639, 0x863C, 0x8631, 0x863B, 0x863E, + 0x8830, 0x8832, 0x882E, 0x8833, 0x8976, 0x8974, 0x8973, 0x89FE, 0x8B8C, + 0x8B8E, 0x8B8B, 0x8B88, 0x8C45, 0x8D19, 0x8E98, 0x8F64, 0x8F63, 0x91BC, + 0x9462, 0x9455, 0x945D, 0x9457, 0x945E, 0x97C4, 0x97C5, 0x9800, 0x9A56, + 0x9A59, 0x9B1E, 0x9B1F, 0x9B20, 0x9C52, 0x9C58, 0x9C50, 0x9C4A, 0x9C4D, + 0x9C4B, 0x9C55, 0x9C59, 0x9C4C, 0x9C4E, 0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, + 0x9DEB, 0x9DF8, 0x9DE4, 0x9DF6, 0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, 0x9DF0, + 0x9DE2, 0x9DEC, 0x9DF4, 0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, 0x9ED0, 0x9EF2, + 0x9EF3, 0x9F06, 0x9F1C, 0x9F38, 0x9F37, 0x9F36, 0x9F43, 0x9F4F, 0x9F71, + 0x9F70, 0x9F6E, 0x9F6F, 0x56D3, 0x56CD, 0x5B4E, 0x5C6D, 0x652D, 0x66ED, + 0x66EE, 0x6B13, 0x705F, 0x7061, 0x705D, 0x7060, 0x7223, 0x74DB, 0x74E5, + 0x77D5, 0x7938, 0x79B7, 0x79B6, 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643, + 0x8838, 0x8837, 0x8835, 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F, 0x8EA0, + 0x8E9D, 0x91BE, 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469, 0x96E5, 0x9746, + 0x9743, 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5, 0x9B59, 0x9C63, 0x9C67, + 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02, 0x9DFE, 0x9E07, 0x9E03, 0x9E06, + 0x9E05, 0x9E00, 0x9E01, 0x9E09, 0x9DFF, 0x9DFD, 0x9E04, 0x9EA0, 0x9F1E, + 0x9F46, 0x9F74, 0x9F75, 0x9F76, 0x56D4, 0x652E, 0x65B8, 0x6B18, 0x6B19, + 0x6B17, 0x6B1A, 0x7062, 0x7226, 0x72AA, 0x77D8, 0x77D9, 0x7939, 0x7C69, + 0x7C6B, 0x7CF6, 0x7E9A, 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646, + 0x8647, 0x8648, 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98, 0x8B99, + 0x8EA5, 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471, 0x9473, 0x9749, + 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B, 0x9E0D, 0x9E10, 0x9E0F, + 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09, 0x9F47, 0x9F78, 0x9F7B, 0x9F7A, + 0x9F79, 0x571E, 0x7066, 0x7C6F, 0x883C, 0x8DB2, 0x8EA6, 0x91C3, 0x9474, + 0x9478, 0x9476, 0x9475, 0x9A60, 0x9B2E, 0x9C74, 0x9C73, 0x9C71, 0x9C75, + 0x9E14, 0x9E13, 0x9EF6, 0x9F0A, 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, + 0x883E, 0x883D, 0x883F, 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873, + 0x9874, 0x98CC, 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24, 0x9E15, + 0x9E17, 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482, 0x9480, + 0x9481, 0x9A69, 0x9A68, 0x9E19, 0x864B, 0x8B9F, 0x9483, 0x9C79, 0x9EB7, + 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, 0x7069, 0x706A, 0x7229, 0x9EA4, 0x9F7E, + 0x9F49, 0x9F98, 0xFE19, 0x223C, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, + 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, + 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, + 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, + 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, + 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, + 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, + 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, + 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, + 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, + 0xFE33, 0x2574, 0xFE34, 0xFE4F, 0x0308, 0xFF3E, 0x30FD, 0x30FE, 0x309D, + 0x309E, 0xFFFD, 0x3005, 0x3006, 0x3007, 0x30FC, 0xFF3B, 0xFF3D, 0x273D, + 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, + 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, + 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, + 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, + 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, + 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, + 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, + 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, + 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, + 0x3092, 0x3093, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, + 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, + 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, + 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, + 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, + 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, + 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, + 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, + 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, + 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x0410, 0x0411, + 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, + 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, + 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, + 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, + 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, + 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, + 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, + 0x044F, 0x21E7, 0x21B8, 0x21B9, 0x4E41, 0x0000, 0x4E5A, 0x0000, 0x5202, + 0x4491, 0x9FB0, 0x5188, 0x9FB1, 0x0000, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, + 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, + 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, + 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, + 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, + 0x00AC, 0xFFE4, 0xFF07, 0xFF02, 0x3231, 0x2116, 0x2121, 0x7881, 0x92B9, + 0x88CF, 0x58BB, 0x6052, 0x7CA7, 0x5AFA, 0x2554, 0x2566, 0x2557, 0x2560, + 0x256C, 0x2563, 0x255A, 0x2569, 0x255D, 0x2552, 0x2564, 0x2555, 0xFFFD, + 0xFFFD, 0xFFFD, 0x2558, 0x2567, 0x255B, 0x2553, 0x2565, 0x2556, 0x255F, + 0x256B, 0x2562, 0x2559, 0x2568, 0x255C, 0x2551, 0xFFFD, 0xFFFD, 0xFFFD, + 0xFFFD, 0xFFFD, 0x2593, 0xFFFD, 0xFFFD, 0xFE10, 0xFE11, 0xFE12, 0xFFFD, + 0xFE14, 0xFE13, 0xFE16, 0xFE15, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, + 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, + 0xFFFD, 0xFFFD, 0x0000, 0x57BE, 0x0000, 0x713E, 0x0000, 0x69A2, 0x0000, + 0x5B74, 0x7A49, 0x0000, 0x0000, 0x7A65, 0x7A7D, 0x0000, 0x7ABB, 0x7AB0, + 0x7AC2, 0x7AC3, 0x71D1, 0x0000, 0x41CA, 0x7ADA, 0x7ADD, 0x7AEA, 0x41EF, + 0x54B2, 0x0000, 0x7B0B, 0x7B55, 0x7B29, 0x0000, 0x0000, 0x7BA2, 0x7B6F, + 0x839C, 0x0000, 0x0000, 0x7BD0, 0x8421, 0x7B92, 0xFFFD, 0x0000, 0xFFFD, + 0x8492, 0x7BFA, 0xFFFD, 0x7C35, 0x0000, 0x7C44, 0x7C83, 0x0000, 0x7CA6, + 0x0000, 0x7CC9, 0x7CC7, 0x7CE6, 0xFFFD, 0x7CF3, 0x7CF5, 0x7E67, 0x451D, + 0x0000, 0x7D5D, 0x0000, 0x7D89, 0x7DAB, 0x7135, 0x7DB3, 0x7DD6, 0x0000, + 0x0000, 0x7DE4, 0x3D13, 0x7DF5, 0x0000, 0x7DE5, 0x0000, 0xFFFD, 0x0000, + 0x0000, 0x7E6E, 0xFFFD, 0x432B, 0x946C, 0x7E27, 0x7F40, 0x7F41, 0x7F47, + 0x7936, 0x0000, 0x99E1, 0x7F97, 0x0000, 0x7FA3, 0x0000, 0x0000, 0x455C, + 0x0000, 0x0000, 0x7FFA, 0x0000, 0xFA5B, 0x8008, 0x801D, 0xFFFD, 0x802F, + 0x0000, 0x0000, 0x803B, 0x803C, 0x8061, 0x0000, 0x4989, 0x0000, 0x0000, + 0x0000, 0x6725, 0x80A7, 0x0000, 0x8107, 0x811A, 0x58B0, 0x0000, 0x6C7F, + 0x0000, 0x64E7, 0x0000, 0x8218, 0x0000, 0x6A53, 0x0000, 0x0000, 0x447A, + 0x8229, 0x0000, 0x0000, 0x4FF9, 0x0000, 0x84E2, 0x8362, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x82AA, 0x691B, 0x0000, 0x41DB, 0x854B, 0x82D0, + 0x831A, 0x0000, 0x0000, 0x36C1, 0x0000, 0x0000, 0x827B, 0x82E2, 0x8318, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3DBF, 0x831D, 0x55EC, 0x8385, + 0x450B, 0x0000, 0x83AC, 0xFFFD, 0x83D3, 0x0000, 0x6A57, 0x855A, 0x3496, + 0x0000, 0x8458, 0x0000, 0x8471, 0x3DD3, 0x44E4, 0x6AA7, 0x844A, 0x7958, + 0xFFFD, 0x0000, 0x0000, 0x0000, 0x84DE, 0xFFFD, 0x8391, 0x44A0, 0x8493, + 0x84E4, 0x0000, 0x4240, 0x0000, 0x4543, 0x8534, 0x5AF2, 0x4523, 0x4527, + 0x8573, 0x4516, 0x67BF, 0x8616, 0x0000, 0x0000, 0x85C1, 0x0000, 0x8602, + 0x0000, 0x0000, 0x0000, 0x456A, 0x8628, 0x3648, 0x0000, 0x53F7, 0x0000, + 0x867E, 0xFFFD, 0x0000, 0x87EE, 0x0000, 0x87B1, 0x87DA, 0x880F, 0x5661, + 0x866C, 0x6856, 0x460F, 0x8845, 0x8846, 0x0000, 0x0000, 0x0000, 0x885E, + 0x889C, 0x465B, 0x88B4, 0x88B5, 0x88C5, 0x0000, 0x8987, 0xFFFD, 0xFFFD, + 0xFFFD, 0x89A7, 0x89BC, 0x0000, 0x89E7, 0x0000, 0x0000, 0x8A9C, 0x7793, + 0x91FE, 0x8A90, 0x0000, 0x7AE9, 0x0000, 0x4713, 0x0000, 0x717C, 0x8B0C, + 0x8B1F, 0x0000, 0x0000, 0x8B3F, 0xFFFD, 0x8B4D, 0x8AA9, 0x0000, 0x8B90, + 0x8B9B, 0x8AAF, 0x0000, 0x4615, 0x884F, 0x8C9B, 0x0000, 0x0000, 0x0000, + 0x3725, 0x0000, 0x8CD6, 0x0000, 0x0000, 0x8D12, 0x8D03, 0x0000, 0x8CDB, + 0x705C, 0x8D11, 0x3ED0, 0x0000, 0x8DA9, 0x0000, 0x0000, 0x0000, 0x3B7C, + 0x0000, 0x0000, 0x7AE7, 0x8EAD, 0x8EB6, 0x8EC3, 0x92D4, 0x8F19, 0x8F2D, + 0x0000, 0x0000, 0x8FA5, 0x9303, 0x0000, 0x0000, 0x8FB3, 0xFFFD, 0x0000, + 0x0000, 0x0000, 0x5EF8, 0x0000, 0x8FF9, 0xFFFD, 0x0000, 0x3980, 0x0000, + 0x9037, 0x0000, 0x0000, 0x9061, 0x0000, 0x0000, 0x90A8, 0x0000, 0x90C4, + 0x0000, 0x90AE, 0xFA26, 0x9167, 0x91A9, 0x91C4, 0x7CAC, 0x0000, 0x0000, + 0x920E, 0x6C9F, 0x9241, 0x9262, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x932C, 0x936B, 0x0000, 0x0000, 0x5AC3, 0x0000, 0x0000, 0x4965, + 0x9244, 0x0000, 0x0000, 0x0000, 0x9373, 0x945B, 0x8EBC, 0x9585, 0x95A6, + 0x9426, 0x95A0, 0x6FF6, 0x42B9, 0x0000, 0x0000, 0x0000, 0x49DF, 0x6C1C, + 0x967B, 0x9696, 0x416C, 0x96A3, 0x0000, 0x61DA, 0xE4AD, 0x78F5, 0x0000, + 0x96BD, 0x53CC, 0x49A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x9731, 0x8642, 0x9736, 0x4A0F, 0x453D, 0x4585, 0x0000, + 0x7075, 0x5B41, 0x971B, 0xFFFD, 0x0000, 0x9757, 0x5B4A, 0x0000, 0x975F, + 0x9425, 0x50D0, 0x0000, 0x0000, 0x9789, 0x979F, 0x97B1, 0x97BE, 0x97C0, + 0x97D2, 0x97E0, 0x0000, 0x97EE, 0x741C, 0x0000, 0xFFFD, 0x97F5, 0x0000, + 0x0000, 0x4AD1, 0x9834, 0x9833, 0x984B, 0x9866, 0x3B0E, 0x0000, 0x3D51, + 0x0000, 0x0000, 0x0000, 0x98CA, 0x98B7, 0x98C8, 0x98C7, 0x4AFF, 0x0000, + 0x0000, 0x55B0, 0x98E1, 0x98E6, 0x98EC, 0x9378, 0x9939, 0x0000, 0x4B72, + 0x0000, 0x0000, 0x99F5, 0x9A0C, 0x9A3B, 0x9A10, 0x9A58, 0x0000, 0x36C4, + 0x0000, 0x0000, 0x9AE0, 0x9AE2, 0x0000, 0x9AF4, 0x4C0E, 0x9B14, 0x9B2D, + 0x0000, 0x5034, 0x9B34, 0x38C3, 0x0000, 0x9B50, 0x9B40, 0x0000, 0x5A45, + 0x0000, 0x9B8E, 0x9C02, 0x9BFF, 0x9C0C, 0x0000, 0x9DD4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x9D7E, 0x9D83, 0x0000, 0x9E0E, 0x9DC4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x9D39, 0x0000, 0x0000, 0x9E90, 0x9E95, + 0x9E9E, 0x9EA2, 0x4D34, 0x9EAA, 0x9EAF, 0x0000, 0x9EC1, 0x3B60, 0x39E5, + 0x3D1D, 0x4F32, 0x37BE, 0x0000, 0x9F02, 0x9F08, 0x4B96, 0x9424, 0x0000, + 0x9F17, 0x0000, 0x9F39, 0x569F, 0x568A, 0x9F45, 0x99B8, 0x0000, 0x97F2, + 0x847F, 0xFFFD, 0x9F69, 0x7ADC, 0x9F8E, 0x7216, 0x4BBE, 0x0000, 0x0000, + 0x7177, 0x0000, 0x0000, 0x0000, 0x739E, 0x0000, 0x0000, 0x799F, 0x0000, + 0x0000, 0x9369, 0x93F3, 0x0000, 0x92EC, 0x9381, 0x93CB, 0x0000, 0x0000, + 0x7217, 0x3EEB, 0x7772, 0x7A43, 0x70D0, 0x0000, 0x0000, 0x717E, 0x0000, + 0x70A3, 0x0000, 0x0000, 0x3EC7, 0x0000, 0x0000, 0x0000, 0x3722, 0x0000, + 0x0000, 0x36E1, 0x0000, 0x0000, 0x0000, 0x3723, 0x0000, 0x575B, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8503, 0x0000, 0xFFFD, 0x8455, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x44F4, 0x0000, 0x0000, 0x0000, + 0x67F9, 0x3733, 0x3C15, 0x3DE7, 0x586C, 0x0000, 0x6810, 0x4057, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x54CB, 0x569E, 0x0000, 0x5692, 0x0000, + 0x0000, 0x0000, 0xFFFD, 0x0000, 0x939C, 0x4EF8, 0x512B, 0x3819, 0x0000, + 0x4EBC, 0x0000, 0xFFFD, 0x4F4B, 0x4F8A, 0x0000, 0x5A68, 0x0000, 0x0000, + 0x3999, 0x0000, 0x0000, 0x3435, 0x4F29, 0x0000, 0x0000, 0x0000, 0x8ADA, + 0x0000, 0x4E98, 0x50CD, 0x510D, 0x4FA2, 0x4F03, 0x0000, 0x0000, 0x4F42, + 0x502E, 0x506C, 0x5081, 0x4FCC, 0x4FE5, 0x5058, 0x50FC, 0x6E76, 0x0000, + 0x0000, 0x0000, 0x6D72, 0x0000, 0x0000, 0x51A8, 0x51C3, 0x0000, 0x44DD, + 0x0000, 0x0000, 0x0000, 0x8D7A, 0x0000, 0x0000, 0x5259, 0x52A4, 0x0000, + 0x52E1, 0xFFFD, 0x467A, 0x718C, 0x0000, 0x0000, 0x0000, 0x0000, 0x69D1, + 0x0000, 0xFFFD, 0x3EDE, 0x7499, 0x7414, 0x7456, 0x7398, 0x4B8E, 0x0000, + 0x0000, 0x53D0, 0x3584, 0x720F, 0x0000, 0x55B4, 0x0000, 0x54CD, 0x0000, + 0x571D, 0x925D, 0x96F4, 0x57DD, 0x578D, 0x577F, 0x363E, 0x58CB, 0x5A99, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5A2C, 0x59B8, 0x5A7E, 0x5ACF, 0x5A12, + 0x0000, 0x0000, 0x0000, 0x0000, 0x36F5, 0x6D05, 0x7443, 0x5A21, 0x0000, + 0x5A81, 0x0000, 0x0000, 0x93E0, 0x748C, 0x0000, 0x7105, 0x4972, 0x9408, + 0x0000, 0x93BD, 0x37A0, 0x5C1E, 0x5C9E, 0x5E5E, 0x5E48, 0x0000, 0x0000, + 0x0000, 0x5ECD, 0x5B4F, 0x0000, 0x0000, 0x3701, 0x0000, 0x36DD, 0x0000, + 0x36D3, 0x812A, 0x0000, 0x0000, 0x0000, 0x0000, 0x5F0C, 0x5F0E, 0x0000, + 0x0000, 0x5A6B, 0x0000, 0x5B44, 0x0000, 0x8860, 0x607E, 0x0000, 0x0000, + 0x5FDB, 0x3EB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x61C0, 0x0000, 0x0000, + 0x0000, 0x6199, 0x6198, 0x6075, 0x0000, 0x0000, 0x0000, 0x0000, 0x6471, + 0x0000, 0x0000, 0x3A29, 0x0000, 0x0000, 0x0000, 0x0000, 0x6337, 0x64B6, + 0x6331, 0x63D1, 0x0000, 0x0000, 0x62A4, 0x0000, 0x643B, 0x656B, 0x6972, + 0x3BF4, 0x0000, 0x0000, 0x0000, 0x0000, 0x550D, 0x0000, 0x0000, 0x0000, + 0x66CE, 0x0000, 0x0000, 0x3AE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x78EE, 0x0000, 0x0000, 0x0000, 0x3464, 0x0000, 0x0000, 0x0000, + 0x668E, 0x0000, 0x666B, 0x4B93, 0x6630, 0x0000, 0x0000, 0x6663, 0x0000, + 0x0000, 0x661E, 0x0000, 0x38D1, 0x0000, 0x0000, 0x3B99, 0x0000, 0x0000, + 0x74D0, 0x3B96, 0x0000, 0x68B6, 0xFFFD, 0x3BC4, 0x6ABE, 0x0000, 0x0000, + 0x6A33, 0x6A52, 0x6AC9, 0x6B05, 0x0000, 0x6511, 0x6898, 0x6A4C, 0x3BD7, + 0x6A7A, 0x6B57, 0x0000, 0x0000, 0x93A0, 0x92F2, 0x0000, 0x0000, 0x9289, + 0x0000, 0x0000, 0x9467, 0x6DA5, 0x6F0B, 0xFFFD, 0x0000, 0x3D8F, 0x6E04, + 0x0000, 0x5A3D, 0x6E0A, 0x5847, 0x6D24, 0x7842, 0x713B, 0x0000, 0x0000, + 0x70F1, 0x7250, 0x7287, 0x7294, 0x0000, 0x0000, 0x5179, 0x0000, 0x0000, + 0x747A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3F06, 0x3EB1, 0x0000, + 0x0000, 0x0000, 0x60A7, 0x3EF3, 0x74CC, 0x743C, 0x9387, 0x7437, 0x449F, + 0x0000, 0x4551, 0x7583, 0x3F63, 0x0000, 0x0000, 0x3F58, 0x7555, 0x7673, + 0x0000, 0xFFFD, 0x7468, 0x0000, 0x0000, 0x0000, 0x3AFB, 0x3DCD, 0x0000, + 0x3EFF, 0x0000, 0x0000, 0x91FA, 0x5732, 0x9342, 0x0000, 0x0000, 0x50DF, + 0x0000, 0x0000, 0x7778, 0x0000, 0x770E, 0x770F, 0x777B, 0x0000, 0x0000, + 0x3A5E, 0x0000, 0x7438, 0x749B, 0x3EBF, 0x0000, 0x0000, 0x40C8, 0x0000, + 0x0000, 0x9307, 0x0000, 0x781E, 0x788D, 0x7888, 0x78D2, 0x73D0, 0x7959, + 0x0000, 0x0000, 0x410E, 0xFFFD, 0xFFFD, 0x79A5, 0x6A2D, 0x0000, 0x7A3A, + 0x79F4, 0x416E, 0x0000, 0x4132, 0x9235, 0x79F1, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3597, 0x556B, 0x3570, 0x36AA, 0x0000, 0x0000, 0x7AE2, + 0x5A59, 0x0000, 0x0000, 0x0000, 0x5A0D, 0x0000, 0x78F0, 0x5A2A, 0x0000, + 0x7AFE, 0x41F9, 0x7C5D, 0x7C6D, 0x4211, 0x0000, 0x0000, 0x0000, 0x7CCD, + 0x0000, 0x0000, 0x7C8E, 0x7C7C, 0x7CAE, 0x6AB2, 0x7DDC, 0x7E07, 0x7DD3, + 0x7F4E, 0x0000, 0x0000, 0x0000, 0x7D97, 0x0000, 0x426A, 0x0000, 0x0000, + 0x67D6, 0x0000, 0x0000, 0x57C4, 0x0000, 0x0000, 0x7FDD, 0x7B27, 0x0000, + 0x0000, 0x0000, 0x7B0C, 0x0000, 0x99E6, 0x8645, 0x9A63, 0x6A1C, 0x0000, + 0x0000, 0x0000, 0x9A1F, 0x0000, 0x8495, 0x0000, 0x0000, 0x44EA, 0x8137, + 0x4402, 0x80C6, 0x8109, 0x8142, 0x0000, 0x98C3, 0x0000, 0x8262, 0x8265, + 0x0000, 0x8453, 0x0000, 0x8610, 0x0000, 0x5A86, 0x417F, 0x0000, 0x5B2B, + 0x0000, 0x5AE4, 0x0000, 0x86A0, 0x0000, 0x0000, 0x882D, 0x0000, 0x5A02, + 0x886E, 0x4F45, 0x8887, 0x88BF, 0x88E6, 0x8965, 0x894D, 0x0000, 0x8954, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3EAD, 0x84A3, 0x46F5, + 0x46CF, 0x37F2, 0x8A3D, 0x8A1C, 0x0000, 0x5F4D, 0x922B, 0x0000, 0x65D4, + 0x7129, 0x70C4, 0x0000, 0x9D6D, 0x8C9F, 0x8CE9, 0x0000, 0x599A, 0x77C3, + 0x59F0, 0x36D4, 0x8E2A, 0x8EA7, 0x0000, 0x8F30, 0x8F4A, 0x42F4, 0x6C58, + 0x6FBB, 0x0000, 0x489B, 0x6F79, 0x6E8B, 0x0000, 0x9BE9, 0x36B5, 0x0000, + 0x90BB, 0x48B4, 0x5571, 0x4906, 0x91BB, 0x9404, 0x0000, 0x4062, 0x0000, + 0x9427, 0x0000, 0x0000, 0x84E5, 0x8A2B, 0x9599, 0x95A7, 0x9597, 0x9596, + 0x0000, 0x7445, 0x3EC2, 0x0000, 0x0000, 0x0000, 0x3EE7, 0x0000, 0x968F, + 0x0000, 0x0000, 0x0000, 0x3ECC, 0x0000, 0x0000, 0x0000, 0x7412, 0x746B, + 0x3EFC, 0x9741, 0x0000, 0x6847, 0x4A1D, 0x0000, 0x0000, 0xFFFD, 0x9368, + 0x0000, 0x0000, 0x0000, 0x0000, 0x92BA, 0x5B11, 0x8B69, 0x493C, 0x73F9, + 0x0000, 0x979B, 0xFFFD, 0x9938, 0x0000, 0x5DC1, 0x0000, 0x0000, 0x981F, + 0x0000, 0x92F6, 0x0000, 0x91E5, 0x44C0, 0x0000, 0x0000, 0x0000, 0x98DC, + 0x0000, 0x3F00, 0x922A, 0x4925, 0x8414, 0x993B, 0x994D, 0x0000, 0x3DFD, + 0xFFFD, 0x4B6F, 0x99AA, 0x9A5C, 0x0000, 0x0000, 0x6A8F, 0x9A21, 0x5AFE, + 0x9A2F, 0x0000, 0x4B90, 0x0000, 0x99BC, 0x4BBD, 0x4B97, 0x937D, 0x5872, + 0x0000, 0x5822, 0x0000, 0x0000, 0x7844, 0x0000, 0x0000, 0x68C5, 0x3D7D, + 0x9458, 0x3927, 0x6150, 0x0000, 0x0000, 0x6107, 0x9C4F, 0x9C53, 0x9C7B, + 0x9C35, 0x9C10, 0x9B7F, 0x9BCF, 0x0000, 0x9B9F, 0x0000, 0x0000, 0x9D21, + 0x4CAE, 0x0000, 0x9E18, 0x4CB0, 0x9D0C, 0x0000, 0x0000, 0x0000, 0x0000, + 0x9DA5, 0x84BD, 0x0000, 0x0000, 0x0000, 0x85FC, 0x4533, 0x0000, 0x0000, + 0x0000, 0x8420, 0x85EE, 0x0000, 0x0000, 0x0000, 0x79E2, 0x0000, 0x0000, + 0x0000, 0x3D62, 0x93DB, 0x92BE, 0x9348, 0x0000, 0x78B9, 0x9277, 0x944D, + 0x4FE4, 0x3440, 0x9064, 0x0000, 0x783D, 0x7854, 0x78B6, 0x784B, 0x0000, + 0x0000, 0x0000, 0x369A, 0x4F72, 0x6FDA, 0x6FD9, 0xFFFD, 0x701E, 0x5414, + 0x0000, 0x57BB, 0x58F3, 0x578A, 0x9D16, 0x57D7, 0x7134, 0x34AF, 0x0000, + 0x71EB, 0x0000, 0x0000, 0xFFFD, 0x0000, 0x0000, 0x610C, 0x5ACE, 0x5A0B, + 0x42BC, 0x0000, 0x372C, 0x4B7B, 0x0000, 0x93BB, 0x93B8, 0x0000, 0x0000, + 0x8472, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5994, 0x0000, 0x0000, + 0x7DA8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92E5, 0x73E2, 0x3EE9, + 0x74B4, 0x0000, 0x0000, 0x3EE1, 0x0000, 0x6AD8, 0x73F3, 0x73FB, 0x3ED6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7448, 0x0000, + 0x70A5, 0x0000, 0x9284, 0x73E6, 0x935F, 0x0000, 0x9331, 0x0000, 0x0000, + 0x9386, 0x0000, 0x0000, 0x4935, 0x0000, 0x716B, 0x0000, 0x0000, 0x56A4, + 0x0000, 0x0000, 0x0000, 0x5502, 0x79C4, 0x0000, 0x7DFE, 0x0000, 0x0000, + 0x0000, 0x452E, 0x9401, 0x370A, 0x0000, 0x0000, 0x59B0, 0x0000, 0x0000, + 0x0000, 0x5AA1, 0x36E2, 0x0000, 0x36B0, 0x925F, 0x5A79, 0x0000, 0x0000, + 0x9374, 0x3CCD, 0x0000, 0x4A96, 0x398A, 0x50F4, 0x3D69, 0x3D4C, 0x0000, + 0x7175, 0x42FB, 0x0000, 0x6E0F, 0x0000, 0x44EB, 0x6D57, 0x0000, 0x7067, + 0x6CAF, 0x3CD6, 0x0000, 0x0000, 0x6E02, 0x6F0C, 0x3D6F, 0x0000, 0x7551, + 0x36BC, 0x34C8, 0x4680, 0x3EDA, 0x4871, 0x59C4, 0x926E, 0x493E, 0x8F41, + 0x0000, 0x0000, 0x5812, 0x57C8, 0x36D6, 0x0000, 0x70FE, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x68B9, 0x6967, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6A1A, 0x0000, 0x0000, 0x843E, 0x44DF, + 0x44CE, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFD, 0xFFFD, 0x833D, 0x0000, + 0x83ED, 0x0000, 0x0000, 0x0000, 0x5989, 0x5A82, 0x0000, 0x5A61, 0x5A71, + 0x0000, 0x0000, 0x372D, 0x59EF, 0x0000, 0x36C7, 0x718E, 0x9390, 0x669A, + 0x0000, 0x5A6E, 0x5A2B, 0x0000, 0x6A2B, 0x0000, 0x0000, 0x0000, 0x0000, + 0x711D, 0x0000, 0x0000, 0x4FB0, 0x0000, 0x5CC2, 0x0000, 0x0000, 0x0000, + 0x6A0C, 0x0000, 0x0000, 0xFFFD, 0x7133, 0x0000, 0x3DA5, 0x6CDF, 0x0000, + 0x59EB, 0x5F5C, 0x0000, 0x7CD3, 0x0000, 0x0000, 0x0000, 0x906C, 0x81F6, + 0x770C, 0x6CA2, 0x56FD, 0x5869, 0x6761, 0x5C5E, 0x58F2, 0x70B9, 0x6803, + 0x8FBB, 0x8FBC, 0x4E21, 0x7B39, 0x3DCC, 0x732A, 0x7560, 0x583A, 0x82A6, + 0x698A, 0x60E3, 0x4EEE, 0x99C4, 0x9EBF, 0x5301, 0x67A0, 0x60E8, 0x51B4, + 0x7A83, 0x9C3A, 0x7AC8, 0x691A, 0x59AC, 0x5840, 0x546A, 0x60E7, 0x567A, + 0x6955, 0x9C2F, 0x87A5, 0x5C20, 0x5E0B, 0x671E, 0x84AD, 0x8B81, 0x4E78, + 0x62C3, 0x6855, 0xFFFD, 0x82FD, 0x89A5, 0x8FA0, 0x97B8, 0x9847, 0x9ABD, + 0x5FB1, 0x6648, 0x66BF, 0x0000, 0xFFFD, 0x0000, 0xFFFD, 0xFFFD, 0x0000, + 0x670E, 0x6918, 0x0000, 0x0000, 0x0000, 0x0000, 0x48D0, 0x4AB8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x51D2, 0x0000, 0x599F, 0x0000, 0x3BBE, 0x0000, + 0x399B, 0x0000, 0x0000, 0x3762, 0x0000, 0x8B5E, 0x0000, 0xFFFD, 0x7209, + 0x0000, 0x0000, 0x8EDA, 0x528F, 0x7171, 0x0000, 0x0000, 0x55BC, 0x0000, + 0x3473, 0x0000, 0x4718, 0x0000, 0x5066, 0x34FB, 0x0000, 0xFFFD, 0x477C, + 0x0000, 0x0000, 0xFFFD, 0x0000, 0x9056, 0x0000, 0x8B62, 0x5D5B, 0x0000, + 0xFFFD, 0x0000, 0x8AEA, 0x0000, 0x0000, 0x4BC0, 0x0000, 0x9465, 0x0000, + 0x6195, 0x5A27, 0x0000, 0x0000, 0x0000, 0x4E6A, 0x0000, 0x9656, 0x6D8F, + 0x0000, 0x8977, 0x0000, 0xFFFD, 0x7B42, 0x0000, 0x0000, 0xFFFD, 0x7A45, + 0x9A26, 0x365F, 0x0000, 0x0000, 0x7983, 0x5D2C, 0x0000, 0xFFFD, 0x46D0, + 0x753B, 0x8865, 0x58B6, 0x371C, 0x0000, 0x3C54, 0x9281, 0x0000, 0x9330, + 0x0000, 0x6C39, 0x0000, 0x8827, 0x88F5, 0x0000, 0x0000, 0x0000, 0x6EB8, + 0x0000, 0x0000, 0x39A4, 0xFFFD, 0xFFFD, 0x453F, 0x66B6, 0x0000, 0x0000, + 0x8943, 0x40DF, 0x0000, 0x39A1, 0x0000, 0x0000, 0x0000, 0x71AD, 0x8366, + 0x0000, 0xFFFD, 0x4CB7, 0x0000, 0x0000, 0x0000, 0x7B43, 0x797E, 0x6FB5, + 0x0000, 0x6A03, 0x0000, 0x53A2, 0x0000, 0x93BF, 0x6836, 0x975D, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5D85, 0x0000, 0x5715, 0x9823, 0x0000, 0x5DAB, + 0x0000, 0x65BE, 0x69D5, 0x53D2, 0x0000, 0x0000, 0x3C11, 0x6736, 0x0000, + 0x35CA, 0x48FA, 0xFFFD, 0x7808, 0x9255, 0x43F2, 0x43DF, 0x59F8, 0xFFFD, + 0x568B, 0x0000, 0x9012, 0x55C1, 0x4509, 0x7E7F, 0x6F56, 0x6AB1, 0x34E4, + 0x0000, 0x373A, 0xFFFD, 0x0000, 0x0000, 0x3DEB, 0x0000, 0x0000, 0x56BF, + 0x8E0E, 0x5B6D, 0x63DE, 0xFFFD, 0x6530, 0x562D, 0x541A, 0x0000, 0x4C7D, + 0x5622, 0x561E, 0x7F49, 0x5975, 0x0000, 0x8770, 0x8117, 0x9D5E, 0x8D18, + 0x763B, 0x9C45, 0x764E, 0x77B9, 0x9345, 0x5432, 0x8148, 0x82F7, 0x5625, + 0x8132, 0x8418, 0x80BD, 0x55EA, 0x7962, 0x5643, 0x5416, 0x0000, 0x35CE, + 0x5605, 0x55F1, 0x66F1, 0x0000, 0x362D, 0x7534, 0x55F0, 0x55BA, 0x5497, + 0x5572, 0x0000, 0x0000, 0x5ED0, 0x0000, 0x0000, 0x0000, 0x9EAB, 0x7D5A, + 0xFFFD, 0x0000, 0x629D, 0x976D, 0x5494, 0x8CCD, 0x71F6, 0x9176, 0x63FC, + 0x63B9, 0x63FE, 0x5569, 0x0000, 0x9C72, 0x0000, 0x519A, 0x34DF, 0x0000, + 0x51A7, 0x544D, 0x551E, 0x5513, 0x7666, 0x8E2D, 0x0000, 0x75B1, 0x80B6, + 0x8804, 0xFFFD, 0x88C7, 0x81B6, 0x841C, 0x44EC, 0x7304, 0x830B, 0x567B, + 0x9170, 0x9208, 0x0000, 0x7266, 0x474E, 0x0000, 0x40FA, 0x9C5D, 0x651F, + 0x48F3, 0x0000, 0x0000, 0xFFFD, 0x0000, 0xED2B, 0x0000, 0x71A3, 0x7E8E, + 0x9D50, 0x3577, 0x6CB2, 0x5367, 0x39DC, 0x0000, 0x822D, 0x544B, 0xED43, + 0x3A52, 0x7374, 0x0000, 0x4D09, 0x9BED, 0xFFFD, 0x4C5B, 0x0000, 0x845C, + 0x0000, 0x632E, 0x7D25, 0x3A2A, 0x9008, 0x52CC, 0x3E74, 0x367A, 0x45E9, + 0x0000, 0x7640, 0x5AF0, 0x0000, 0x787A, 0x0000, 0x58A7, 0x40BF, 0x567C, + 0x9B8B, 0x5D74, 0x7654, 0x0000, 0x9E85, 0x4CE1, 0xFFFD, 0x37FB, 0x6119, + 0x0000, 0xED73, 0x565D, 0x0000, 0x5234, 0x35AD, 0xFFFD, 0x9D7C, 0x7C56, + 0x9B39, 0x57DE, 0x5C53, 0x64D3, 0x0000, 0x0000, 0x86AD, 0x0000, 0x0000, + 0xED8C, 0x51FE, 0x0000, 0x5D8E, 0x9703, 0x0000, 0x9E81, 0x904C, 0x7B1F, + 0x9B02, 0x5CD1, 0x7BA3, 0x6268, 0x6335, 0x9AFF, 0x7BCF, 0x9B2A, 0x7C7E, + 0xFFFD, 0x7C42, 0x7C86, 0x9C15, 0x7BFC, 0x9B09, 0xFFFD, 0x9C2E, 0x9F5A, + 0x5573, 0x5BC3, 0x4FFD, 0x9E98, 0x4FF2, 0x5260, 0x52D1, 0x5767, 0x5056, + 0x59B7, 0x5E12, 0x97C8, 0x9DAB, 0x8F5C, 0x5469, 0x97B4, 0x9940, 0x97BA, + 0x532C, 0x6130, 0x692C, 0x53DA, 0x9C0A, 0x9D02, 0x4C3B, 0x9641, 0x6980, + 0x50A6, 0x7546, 0x0000, 0x99DA, 0x5273, 0xEDC9, 0x9159, 0x9681, 0x915C, + 0xEDCD, 0x9151, 0x0000, 0x637F, 0x6ACA, 0x5611, 0x918E, 0x757A, 0x6285, + 0x734F, 0x7C70, 0x0000, 0xEDDC, 0x76D6, 0x9B9D, 0x4E2A, 0x0000, 0x83BE, + 0x8842, 0xEDE4, 0x5C4A, 0x69C0, 0xFFFD, 0xFFFD, 0x521F, 0x5DF5, 0x4ECE, + 0x6C31, 0x0000, 0x4F39, 0x549C, 0xFFFD, 0x529A, 0x8D82, 0x35FE, 0xFFFD, + 0x35F3, 0xEDF6, 0x6B52, 0x917C, 0x9FA5, 0x9B97, 0x982E, 0x98B4, 0x9ABA, + 0x9EA8, 0x9E84, 0x7B14, 0xEE02, 0x6BFA, 0x8818, 0x7F78, 0xEE06, 0x5620, + 0x0000, 0x8E77, 0x9F53, 0xEE0B, 0x8DD4, 0x8E4F, 0x9E1C, 0x8E01, 0x6282, + 0x0000, 0x8E28, 0x8E75, 0x7AD3, 0x7A3E, 0x78D8, 0x6CEA, 0x8A67, 0x7607, + 0x9F26, 0x6CCE, 0x87D6, 0x75C3, 0x0000, 0x7853, 0x8D0C, 0x72E2, 0x7371, + 0x8B2D, 0x7302, 0x74F1, 0x8CEB, 0x0000, 0x862F, 0x5FBA, 0x88A0, 0x44B7, + 0xEE2F, 0x0000, 0xEE32, 0x8A7E, 0x0000, 0xEE35, 0x60FD, 0x7667, 0x9AD7, + 0x9D44, 0x936E, 0x9B8F, 0x87F5, 0xEE3D, 0xFFFD, 0x8CF7, 0x732C, 0x9721, + 0x9BB0, 0x35D6, 0x72B2, 0x4C07, 0x7C51, 0x994A, 0x6159, 0x4C04, 0x9E96, + 0x617D, 0xEE4D, 0x575F, 0x616F, 0x62A6, 0x6239, 0xFFFD, 0x3A5C, 0x61E2, + 0x53AA, 0x6364, 0x6802, 0x35D2, 0x5D57, 0x8FDA, 0x0000, 0xEE5E, 0x50D9, + 0x7906, 0x5332, 0x9638, 0x0000, 0x4065, 0xEE66, 0x77FE, 0xEE68, 0x7CC2, + 0x0000, 0x7CDA, 0x7A2D, 0x8066, 0x8063, 0x7D4D, 0x7505, 0x74F2, 0x8994, + 0x821A, 0x670C, 0x8062, 0x0000, 0x805B, 0x74F0, 0x8103, 0x7724, 0x8989, + 0x0000, 0x7553, 0x87A9, 0x87CE, 0x81C8, 0x878C, 0x8A49, 0x8CAD, 0x8B43, + 0x772B, 0x74F8, 0x84DA, 0x69B2, 0x8DA6, 0xEE8C, 0x89A9, 0xFFFD, 0x6DB9, + 0x87C1, 0x0000, 0x74E7, 0x3DDB, 0x7176, 0x60A4, 0x619C, 0x3CD1, 0xFFFD, + 0x6077, 0xEE9A, 0x7F71, 0x0000, 0x60E9, 0x4B7E, 0x0000, 0x92DB, 0x0000, + 0x0000, 0x854C, 0x42B5, 0x73EF, 0x51B5, 0x3649, 0x0000, 0x0000, 0x9344, + 0x0000, 0x82EE, 0x0000, 0x783C, 0x6744, 0x62DF, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4FAB, 0x0000, 0x5008, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFFD, 0x0000, 0x5FA4, 0x0000, 0x0000, 0x6EDB, 0x0000, 0x50DE, + 0x5101, 0x347A, 0x510E, 0x986C, 0x3743, 0x8416, 0x0000, 0x0000, 0x5160, + 0x0000, 0x516A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5B82, 0x877D, 0x0000, 0x0000, 0x51B2, 0x51B8, 0x9D34, 0x51C9, 0x51CF, + 0x51D1, 0x3CDC, 0x51D3, 0x0000, 0x51B3, 0xFFFD, 0xFFFD, 0x51ED, 0x83CD, + 0x693E, 0x0000, 0x5F7B, 0x520B, 0x5226, 0x523C, 0x52B5, 0x5257, 0x5294, + 0x52B9, 0x52C5, 0x7C15, 0x8542, 0x52E0, 0x860D, 0x0000, 0x0000, 0x0000, + 0x5549, 0x6ED9, 0x0000, 0x0000, 0x0000, 0x5333, 0xFFFD, 0x0000, 0x6CCB, + 0x0000, 0x681B, 0x73D5, 0x604A, 0x3EAA, 0x38CC, 0x0000, 0x71DD, 0x44A2, + 0x536D, 0x5374, 0x0000, 0x537E, 0x0000, 0x0000, 0x0000, 0x77E6, 0x5393, + 0x0000, 0x53A0, 0x53AB, 0x53AE, 0x73A7, 0x0000, 0x3F59, 0x739C, 0x53C1, + 0x53C5, 0x6C49, 0x4E49, 0x57FE, 0x53D9, 0x3AAB, 0x0000, 0x53E0, 0x0000, + 0x0000, 0x53F6, 0x0000, 0x5413, 0x7079, 0x552B, 0x6657, 0x6D5B, 0x546D, + 0x0000, 0x0000, 0x555D, 0x548F, 0x54A4, 0x47A6, 0x0000, 0x0000, 0x3DB4, + 0x0000, 0x0000, 0x0000, 0x5547, 0x4CED, 0x542F, 0x7417, 0x5586, 0x55A9, + 0xFFFD, 0x0000, 0x0000, 0x4552, 0x0000, 0x66B3, 0x0000, 0x5637, 0x66CD, + 0x0000, 0x66A4, 0xFFFD, 0x564D, 0x564F, 0x78F1, 0x56F1, 0x9787, 0x53FE, + 0x5700, 0x56EF, 0x56ED, 0x0000, 0x3623, 0x0000, 0x5746, 0x0000, 0x6C6E, + 0x708B, 0x5742, 0x36B1, 0x0000, 0x57E6, 0x0000, 0x5803, 0x0000, 0x0000, + 0x5826, 0x0000, 0x581F, 0x58AA, 0x3561, 0x58E0, 0x58DC, 0x0000, 0x58FB, + 0x5BFF, 0x5743, 0x0000, 0x0000, 0x93D3, 0x35A1, 0x591F, 0x68A6, 0x36C3, + 0x6E59, 0x0000, 0x5A24, 0xFFFD, 0x0000, 0x8505, 0x59C9, 0x0000, 0x0000, + 0x0000, 0x0000, 0x59D9, 0x0000, 0x0000, 0x0000, 0x6D71, 0x0000, 0x0000, + 0x59F9, 0x0000, 0x5AAB, 0x5A63, 0x36E6, 0x0000, 0xFFFD, 0x3708, 0x5A96, + 0x7465, 0x5AD3, 0x0000, 0x0000, 0x0000, 0x3732, 0x0000, 0x5E83, 0x52D0, + 0x5B76, 0x6588, 0x5B7C, 0x0000, 0x4004, 0x485D, 0x0000, 0x5BD5, 0x0000, + 0x0000, 0x0000, 0x5BF3, 0x5B9D, 0x4D10, 0x5C05, 0x0000, 0x5C13, 0x73CE, + 0x5C14, 0x0000, 0x0000, 0x5C49, 0x48DD, 0x5C85, 0x5CE9, 0x5CEF, 0x5D8B, + 0x0000, 0x0000, 0x5D10, 0x5D18, 0x5D46, 0x0000, 0x5CBA, 0x5DD7, 0x82FC, + 0x382D, 0x0000, 0x0000, 0x0000, 0x8287, 0x3836, 0x3BC2, 0x5E2E, 0x6A8A, + 0xFFFD, 0xE12F, 0x0000, 0x0000, 0x53A6, 0x4EB7, 0xFFFD, 0x53A8, 0x0000, + 0x5E09, 0xE138, 0x0000, 0x5EF9, 0x5EFB, 0x38A0, 0x5EFC, 0x683E, 0x941B, + 0x5F0D, 0x0000, 0x0000, 0x3ADE, 0x0000, 0x5F3A, 0x0000, 0x0000, 0x0000, + 0x5F63, 0x0000, 0x5F72, 0x9340, 0x0000, 0x5FA7, 0x5DB6, 0x3D5F, 0x0000, + 0x0000, 0x0000, 0x0000, 0x91D6, 0x0000, 0x0000, 0x6031, 0x6685, 0x3963, + 0x3DC7, 0x3639, 0x5790, 0x0000, 0x7971, 0x3E40, 0x609E, 0xFFFD, 0x60EA, + 0x0000, 0x0000, 0x0000, 0x74A4, 0x50E1, 0x5AA0, 0x6164, 0x6142, 0x0000, + 0x0000, 0x6181, 0x51F4, 0x0000, 0x6187, 0x5BAA, 0x0000, 0x0000, 0x61D3, + 0x0000, 0x0000, 0x61D0, 0x3932, 0x0000, 0x0000, 0x6023, 0x615C, 0x651E, + 0x638B, 0x0000, 0x62C5, 0x0000, 0x62D5, 0x0000, 0x636C, 0x0000, 0x3A17, + 0x6438, 0x63F8, 0x0000, 0x0000, 0x6F8A, 0x0000, 0xFFFD, 0x0000, 0x64E1, + 0x64E5, 0x947B, 0x3A66, 0x643A, 0x3A57, 0x654D, 0x6F16, 0x0000, 0x0000, + 0x6585, 0x656D, 0x655F, 0xFFFD, 0x65B5, 0x0000, 0x4B37, 0x65D1, 0x40D8, + 0x0000, 0xE1AB, 0x65E3, 0x5FDF, 0x0000, 0x6618, 0x0000, 0x0000, 0x6644, + 0x0000, 0x0000, 0x664B, 0x0000, 0x6667, 0x0000, 0x6673, 0xFA12, 0x0000, + 0x0000, 0x0000, 0x0000, 0x77C5, 0x0000, 0x99A4, 0x6702, 0x0000, 0x0000, + 0x69FA, 0x0000, 0x0000, 0x6767, 0x6762, 0x0000, 0x0000, 0x67D7, 0x44E9, + 0x6822, 0x6E50, 0x923C, 0x6801, 0x0000, 0x0000, 0x685D, 0x0000, 0x69E1, + 0x6A0B, 0x0000, 0x6973, 0x68C3, 0x0000, 0x6901, 0x6900, 0x3A01, 0x0000, + 0x3B80, 0x67AC, 0x6961, 0x0000, 0x42FC, 0x6936, 0x6998, 0x3BA1, 0x0000, + 0x8363, 0x5090, 0x69F9, 0x0000, 0x0000, 0x6A45, 0x0000, 0x6A9D, 0x3BF3, + 0x67B1, 0x6AC8, 0x0000, 0x3C0D, 0x6B1D, 0x0000, 0x60DE, 0x6B35, 0x6B74, + 0x0000, 0x6EB5, 0x0000, 0xFFFD, 0x0000, 0x3740, 0x5421, 0x0000, 0x6BE1, + 0x0000, 0x6BDC, 0x6C37, 0x0000, 0x0000, 0x0000, 0x6C5A, 0x8226, 0x6C79, + 0x0000, 0x44C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x36E5, 0x3CEB, + 0x0000, 0x9B83, 0x0000, 0x0000, 0x7F8F, 0x6837, 0x0000, 0x0000, 0x0000, + 0x6D96, 0x6D5C, 0x6E7C, 0x6F04, 0x0000, 0x0000, 0x0000, 0x8533, 0x0000, + 0x51C7, 0xFFFD, 0xFFFD, 0x842E, 0x0000, 0x0000, 0x0000, 0x7453, 0x0000, + 0x79CC, 0x6E4F, 0x5A91, 0x0000, 0x6FF8, 0x370D, 0x6F9D, 0x0000, 0x6EFA, + 0x0000, 0x0000, 0x4555, 0x93F0, 0x6F44, 0x6F5C, 0x3D4E, 0x6F74, 0x0000, + 0x3D3B, 0x6F9F, 0x0000, 0x6FD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x51DF, 0xE251, 0xE252, 0x0000, 0x0000, 0x704B, 0x707E, 0x70A7, + 0xFFFD, 0x70CC, 0x70D5, 0x70D6, 0x70DF, 0x4104, 0x3DE8, 0x71B4, 0x7196, + 0x0000, 0x712B, 0x7145, 0x5A88, 0x714A, 0xFA48, 0x0000, 0x714F, 0x9362, + 0x0000, 0x712C, 0x0000, 0x0000, 0x0000, 0x71BA, 0x0000, 0x70BD, 0x720E, + 0x9442, 0x7215, 0x5911, 0x9443, 0x7224, 0x9341, 0x0000, 0x722E, 0x7240, + 0x0000, 0x68BD, 0x7255, 0x7257, 0x3E55, 0x0000, 0x680D, 0x6F3D, 0x7282, + 0xFFFD, 0x732B, 0x0000, 0x0000, 0x48ED, 0x0000, 0x7328, 0x732E, 0x73CF, + 0x73AA, 0x0000, 0x0000, 0x73C9, 0x7449, 0x0000, 0x0000, 0x0000, 0x6623, + 0x36C5, 0x0000, 0x0000, 0x0000, 0x73F7, 0x7415, 0x6903, 0x0000, 0x7439, + 0x3ED7, 0x0000, 0x0000, 0x7460, 0x0000, 0x7447, 0x73E4, 0x7476, 0x83B9, + 0x746C, 0x7474, 0x93F1, 0x6A2C, 0x7482, 0x4953, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5B46, 0x0000, 0x0000, 0x74C8, 0x0000, 0x750E, 0x751E, 0x0000, + 0x0000, 0x5BD7, 0x0000, 0x9385, 0x754D, 0x754A, 0x7567, 0x756E, 0x0000, + 0x3F04, 0x0000, 0x758E, 0x745D, 0x759E, 0x75B4, 0x7602, 0x762C, 0x7651, + 0x764F, 0x766F, 0xE2D3, 0x0000, 0x7690, 0x81EF, 0x37F8, 0x0000, 0x0000, + 0x76A1, 0x76A5, 0x76B7, 0x76CC, 0x0000, 0x8462, 0x0000, 0x0000, 0x0000, + 0x771E, 0x7726, 0x7740, 0x64AF, 0x0000, 0x7758, 0x0000, 0x77AF, 0x0000, + 0x0000, 0x0000, 0x77F4, 0xFFFD, 0x68CA, 0x78AF, 0x78C7, 0x78D3, 0x96A5, + 0x792E, 0x0000, 0x78D7, 0x7934, 0x78B1, 0x0000, 0x8FB8, 0x8884, 0x0000, + 0x7986, 0x8900, 0x6902, 0x7980, 0x0000, 0x799D, 0x0000, 0x793C, 0x79A9, + 0x6E2A, 0x0000, 0x3EA8, 0x79C6, 0x0000, 0x79D4, 0xFFFD, 0x5525, 0xFFFD, + 0x0000, 0x0000, 0x0000, 0x5590, 0x0000, 0x39EC, 0x0000, 0x8E46, 0x0000, + 0x0000, 0xFFFD, 0x0000, 0x777A, 0x0000, 0x3A34, 0x47D5, 0x0000, 0x0000, + 0x0000, 0x64DD, 0x0000, 0x0000, 0x0000, 0xFFFD, 0x648D, 0x8E7E, 0x0000, + 0xFFFD, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFD, 0x0000, 0x0000, 0x0000, + 0x47F4, 0x0000, 0x0000, 0x9AB2, 0x3A67, 0x0000, 0x3FED, 0x3506, 0x0000, + 0x0000, 0xFFFD, 0x0000, 0x9D6E, 0x9815, 0xFFFD, 0x43D9, 0xFFFD, 0x64B4, + 0x54E3, 0xFFFD, 0x0000, 0xFFFD, 0x39FB, 0xFFFD, 0x0000, 0x0000, 0x0000, + 0x64EA, 0x0000, 0x0000, 0x8E68, 0xFFFD, 0x0000, 0x0000, 0xFFFD, 0x480B, + 0x0000, 0x3FFA, 0x5873, 0x0000, 0xFFFD, 0x0000, 0x0000, 0x0000, 0x0000, + 0xFFFD, 0x5579, 0xFFFD, 0x43BA, 0xFFFD, 0x4AB4, 0x0000, 0x0000, 0x81AA, + 0x98F5, 0x0000, 0x6379, 0x39FE, 0x0000, 0x8DC0, 0x56A1, 0x647C, 0x3E43, + 0xFFFD, 0x0000, 0x0000, 0x0000, 0xFFFD, 0xFFFD, 0x0000, 0x0000, 0x3992, + 0x3A06, 0x0000, 0x3578, 0x0000, 0x0000, 0xFFFD, 0xFFFD, 0x0000, 0x0000, + 0x34BC, 0x6C3D, 0x0000, 0xFFFD, 0xFFFD, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3A18, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x95AA, 0xFFFD, 0x0000, 0x7140, 0xFFFD, 0x5156, + 0x4EFE, 0x5088, 0xFFFD, 0x3493, 0x5186, 0x5E42, 0x5205, 0x5227, 0x5279, + 0x0000, 0x3553, 0x53C2, 0x535F, 0xFFFD, 0x553F, 0xFFFD, 0x55D8, 0x35DD, + 0x5621, 0xFFFD, 0x5654, 0x0000, 0xFFFD, 0x0000, 0xFFFD, 0x0000, 0xFFFD, + 0xFFFD, 0x37B9, 0x5CC1, 0x5D15, 0x5D56, 0x3838, 0x4E81, 0x5EBD, 0x3914, + 0x61B9, 0x6290, 0x6318, 0x645A, 0x6491, 0x816D, 0x8184, 0x8193, 0x6800, + 0x3BBC, 0x728F, 0x72CD, 0x0000, 0x7339, 0x7542, 0x75DC, 0x3FC0, 0x0000, + 0x3FD7, 0xFFFD, 0x7680, 0x768C, 0x40A8, 0x7839, 0x4103, 0x7A91, 0x7C1B, + 0x7CED, 0x7F93, 0x7FAE, 0xFFFD, 0x82FF, 0x585F, 0x86B2, 0x45AC, 0x878B, + 0x8947, 0xFFFD, 0x8A29, 0xFFFD, 0x8E71, 0x0000, 0x8EB0, 0xFFFD, 0x915E, + 0x918C, 0x990E, 0x991C, 0xFFFD, 0xFFFD, 0x9B81, 0x9DC0, 0x9D93, 0x9EAC, + 0x4D91, 0xFFFD, 0x93BA, 0x9E7B, 0x7089, 0x7348, 0xFFFD, 0x7999, 0x8FB7, + 0xFFFD, 0x9942, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, + 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, + 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, + 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, + 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, + 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, + 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, + 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, + 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x00A9, 0x2122, + 0x2026, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, + 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, + 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, + 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, + 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, + 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, + 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, + 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x20AC, 0x20AC, 0x2110, + 0x20AC, 0x20AC, 0x309B, 0x309C, 0x2E80, 0x31C0, 0x31C1, 0x31C2, 0x31C3, + 0x31C4, 0x0000, 0x31C5, 0x0000, 0x0000, 0x31C6, 0x31C7, 0x0000, 0x0000, + 0x31C8, 0x0000, 0x31C9, 0x31CA, 0x31CB, 0x31CC, 0x0000, 0x31CD, 0x31CE, + 0xF538, 0xF539, 0x0000, 0x0000, 0x9751, 0x0000, 0x4E5B, 0x4EBB, 0x353E, + 0x5C23, 0x5F51, 0x5FC4, 0x38FA, 0x624C, 0x6535, 0x6B7A, 0x6C35, 0x6C3A, + 0x706C, 0x722B, 0x4E2C, 0x72AD, 0x0000, 0x7F52, 0x793B, 0x7CF9, 0x7F53, + 0x0000, 0x34C1, 0x0000, 0x8002, 0x8080, 0x0000, 0x0000, 0x535D, 0x8864, + 0x89C1, 0x0000, 0x8BA0, 0x8D1D, 0x9485, 0x9578, 0x957F, 0x95E8, 0x0000, + 0x97E6, 0x9875, 0x98CE, 0x98DE, 0x9963, 0x0000, 0x9C7C, 0x9E1F, 0x9EC4, + 0x6B6F, 0xF907, 0x4E37, 0x0000, 0x961D, 0x6237, 0x94A2, 0x2E84, 0x2E86, + 0x2E87, 0x2E88, 0x2E8A, 0x2E8C, 0x2E8D, 0x2E95, 0x2E9C, 0x2EA5, 0x2EA7, + 0x2EAA, 0x2EAC, 0x2EAE, 0x2EB6, 0x2EBC, 0x2EBE, 0x2ECA, 0x2ECC, 0x2ECD, + 0x2ECF, 0x2ED6, 0x2ED7, 0x2EDE, 0x0000, 0x0000, 0x650A, 0x4E3D, 0x6EDD, + 0x9D4E, 0x91DF, 0x0000, 0x4F1A, 0x4F28, 0x4FA8, 0x5174, 0x519C, 0x51E4, + 0x52A1, 0x52A8, 0x533B, 0x534E, 0x53D1, 0x53D8, 0x56E2, 0x58F0, 0x5904, + 0x5907, 0x5932, 0x5934, 0x5B66, 0x5B9E, 0x5B9F, 0x5C9A, 0x5E86, 0x603B, + 0x6589, 0x67FE, 0x6804, 0x6865, 0x6D4E, 0x70BC, 0x7535, 0x7EA4, 0x7EAC, + 0x7EBA, 0x7EC7, 0x7ECF, 0x7EDF, 0x7F06, 0x7F37, 0x827A, 0x82CF, 0x836F, + 0x89C6, 0x8BBE, 0x8BE2, 0x8F66, 0x8F67, 0x8F6E, 0x7411, 0x7CFC, 0x7DCD, + 0x6946, 0x7AC9, 0x78B8, 0x80BC, 0x8D0B, 0x80F6, 0x0000, 0x809F, 0x9EC7, + 0x4CCD, 0x9DC9, 0x9E0C, 0x4C3E, 0x0000, 0x0000, 0x9E0A, 0x0000, 0x35C1, + 0x6E9A, 0x823E, 0x7519, 0x4911, 0x9A6C, 0x9A8F, 0x9F99, 0x7987, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4E24, 0x4E80, 0x4E87, 0x4EBF, 0x4EEB, 0x4F37, + 0x344C, 0x4FBD, 0x3E48, 0x5003, 0x347D, 0x34A5, 0x5905, 0x51DB, 0x51FC, + 0x4E89, 0x5290, 0x5327, 0x35C7, 0x53A9, 0x3551, 0x53B0, 0x5423, 0x356D, + 0x3572, 0x3681, 0x5493, 0x54A3, 0x54B4, 0x54B9, 0x54D0, 0x54EF, 0x5518, + 0x5523, 0x5528, 0x3598, 0x35A5, 0x35BF, 0x55D7, 0x35C5, 0x0000, 0x4053, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x40BB, 0x0000, 0x5652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x35FB, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3F93, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3FF9, 0x0000, 0x6432, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x54CC, 0x82C4, + 0x55B9, 0x0000, 0x9C26, 0x9AB6, 0x0000, 0x80EC, 0x5C1C, 0x0000, 0x8134, + 0x3797, 0x0000, 0x91B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3609, + 0x0000, 0x56AF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5A54, 0x0000, 0x0000, 0x0000, 0x0000, + 0x579C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3703, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5899, 0x5268, + 0x361A, 0x0000, 0x7BB2, 0x5B68, 0x4800, 0x4B2C, 0x9F27, 0x49E7, 0x9C1F, + 0x9B8D, 0x0000, 0x0000, 0x55FB, 0x35F2, 0x5689, 0x5D3E, 0x5D48, 0x3DFC, + 0x380F, 0x5DA4, 0x5DB9, 0x3820, 0x5F25, 0x5F83, 0x3908, 0x393F, 0x394D, + 0x60D7, 0x613D, 0x5CE5, 0x3989, 0x61B7, 0x61CF, 0x39B8, 0x622C, 0x62E5, + 0x39F8, 0x56B1, 0x3A03, 0x63E2, 0x63FB, 0x6407, 0x3A4B, 0x64C0, 0x9F9F, + 0x3A97, 0x6586, 0x3ABD, 0x65FF, 0x6653, 0x3AF2, 0x6692, 0x3B22, 0x6716, + 0x3B42, 0x67A4, 0x3B58, 0x684A, 0x6884, 0x3B72, 0x3B71, 0x3B7B, 0x6909, + 0x6943, 0x725C, 0x6964, 0x699F, 0x6985, 0x69D6, 0x3BDD, 0x6A65, 0x6A74, + 0x6A71, 0x6A82, 0x3BEC, 0x6A99, 0x3BF2, 0x6AAB, 0x6AB5, 0x6AD4, 0x6AF6, + 0x6B81, 0x6BC1, 0x6BEA, 0x6C75, 0x6CAA, 0x3CCB, 0x6D02, 0x6D06, 0x6D26, + 0x6D81, 0x3CEF, 0x6DA4, 0x6DB1, 0x6E15, 0x6E18, 0x6E29, 0x6E86, 0x0000, + 0x6EBB, 0x6EE2, 0x6EDA, 0x9F7F, 0x6EE8, 0x6EE9, 0x6F24, 0x6F34, 0x3D46, + 0x0000, 0x6F81, 0x6FBE, 0x3D6A, 0x3D75, 0x71B7, 0x5C99, 0x3D8A, 0x702C, + 0x3D91, 0x7050, 0x7054, 0x706F, 0x707F, 0x0000, 0x43C1, 0x35F1, 0x0000, + 0x364E, 0x3DAD, 0x0000, 0x667D, 0x7C74, 0x748D, 0x7E92, 0x4503, 0x0000, + 0x0000, 0x0000, 0x347E, 0x0000, 0x0000, 0x0000, 0x8771, 0x63C1, 0x7777, + 0x898A, 0x0000, 0x8B4C, 0x0000, 0x492A, 0x0000, 0x0000, 0x0000, 0x3AF0, + 0x708F, 0x0000, 0x0000, 0x0000, 0x6888, 0x0000, 0x9F62, 0x93C6, 0x0000, + 0x9366, 0x928F, 0x8614, 0x0000, 0x4190, 0x678F, 0x681E, 0x3863, 0x0000, + 0x3B19, 0x8496, 0x0000, 0x39E2, 0x8480, 0x436E, 0x9771, 0x999B, 0x492D, + 0x6F17, 0x0000, 0x70A6, 0x0000, 0x7E65, 0x5D2F, 0x3DF3, 0x0000, 0x0000, + 0x7DA4, 0x8426, 0x5485, 0x0000, 0x0000, 0x577E, 0x0000, 0x0000, 0x3FE5, + 0x0000, 0x0000, 0x7003, 0x0000, 0x5D70, 0x738F, 0x0000, 0x0000, 0x4FC8, + 0x7FE7, 0x7310, 0x7338, 0x7341, 0x3EA9, 0x71F5, 0x0000, 0x73E1, 0x3ECA, + 0x3ED1, 0x7419, 0x741E, 0x741F, 0x3EE2, 0x3EF0, 0x3EF4, 0x3EFA, 0x74D3, + 0x3F0E, 0x3F53, 0x756D, 0x7572, 0x758D, 0x3F7C, 0x75C8, 0x764D, 0x7674, + 0x3FDC, 0x767A, 0x7188, 0x5623, 0x8980, 0x401D, 0x7743, 0x4039, 0x4045, + 0x35DB, 0x7798, 0x406A, 0x406F, 0x77BE, 0x77CB, 0x7818, 0x781C, 0x7847, + 0x7851, 0x7866, 0x8448, 0x0000, 0x7933, 0x7932, 0x4109, 0x7991, 0x7A06, + 0x4167, 0x41B2, 0x7ABC, 0x8279, 0x41C4, 0x7ACF, 0x7ADB, 0x41CF, 0x7B62, + 0x7B6C, 0x7B7B, 0x7C12, 0x4260, 0x427A, 0x7C7B, 0x7C9C, 0x428C, 0x7CB8, + 0x4294, 0x8F93, 0x70C0, 0x0000, 0x7DCF, 0x7DD4, 0x7DD0, 0x7DFD, 0x7FB4, + 0x729F, 0x4397, 0x8020, 0x8025, 0x802E, 0x8031, 0x8054, 0x57B4, 0x70A0, + 0x80B7, 0x80E9, 0x43ED, 0x810C, 0x810E, 0x8112, 0x8114, 0x4401, 0x3B39, + 0x8156, 0x8159, 0x815A, 0x4413, 0x817C, 0x4425, 0x442D, 0x81A5, 0x57EF, + 0x81C1, 0x81E4, 0x8254, 0x448F, 0x8276, 0x82CA, 0x82D8, 0x44B0, 0x8357, + 0x9669, 0x8405, 0x70F5, 0x8464, 0x8488, 0x4504, 0x84BE, 0x84E1, 0x84F8, + 0x8510, 0x8538, 0x8552, 0x453B, 0x856F, 0x8570, 0x85E0, 0x4577, 0x8672, + 0x8692, 0x86EF, 0x9645, 0x4606, 0x4617, 0x88AE, 0x88FF, 0x8924, 0x8991, + 0x0000, 0x8A38, 0x8A94, 0x8AB4, 0x8C51, 0x8CD4, 0x8CF2, 0x8D1C, 0x4798, + 0x8DC3, 0x47ED, 0x8E3A, 0x5754, 0x55F5, 0x4837, 0x8ECE, 0x8EE2, 0x8EE4, + 0x8EED, 0x8EF2, 0x8FC1, 0x8FCA, 0x8FCC, 0x9033, 0x48AD, 0x98E0, 0x9213, + 0x491E, 0x9228, 0x9258, 0x926B, 0x92B1, 0x92AE, 0x92BF, 0x92E3, 0x92EB, + 0x92F3, 0x92F4, 0x92FD, 0x9343, 0x9384, 0x93AD, 0x4945, 0x4951, 0x9417, + 0x941D, 0x942D, 0x943E, 0x496A, 0x9454, 0x9479, 0x952D, 0x95A2, 0x49A7, + 0x95F4, 0x9633, 0x49E5, 0x4A24, 0x9740, 0x4A35, 0x97B2, 0x97C2, 0x4AE4, + 0x98B9, 0x4B19, 0x98F1, 0x5844, 0x9919, 0x9937, 0x995D, 0x9962, 0x4B70, + 0x99C5, 0x4B9D, 0x9A3C, 0x9B0F, 0x9B69, 0x9BDD, 0x9BF1, 0x9BF4, 0x4C6D, + 0x9C20, 0x376F, 0x0000, 0x9D49, 0x9EFE, 0x5650, 0x9DBD, 0x9DFC, 0x94F6, + 0x8FB6, 0x9EB1, 0x9EBD, 0x9EC6, 0x94DC, 0x9EE2, 0x9EF1, 0x9EF8, 0x9F44, + 0x0000, 0x0000, 0x0000, 0x94C3, 0x0000, 0x94C1, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5757, 0x7173, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x549E, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3647, 0x0000, 0x0000, + 0x0000, 0x5364, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x70BB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7198, 0x0000, 0x69E9, 0x36C8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x58B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5788, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5965, 0x0000, 0x0000, 0x573F, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x57A1, 0x7151, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x56B9, 0x0000, 0x3618, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x949F, 0x0000, + 0x36B9, 0x0000, 0x0000, 0x56D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63E6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3DF7, 0x0000, 0x0000, 0x8FD0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7E9F, 0x0000, + 0x0000, 0x4CA4, 0x9547, 0x0000, 0x71A2, 0x0000, 0x0000, 0x4D9C, 0x0000, + 0x8FBE, 0x8FBA, 0x0000, 0x8FB9, 0x0000, 0x4EEA, 0x0000, 0x8E80, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4E9A, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3DC6, 0x0000, 0x4E1C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x55DE, 0x8786, 0x0000, 0x0000, 0x5B90, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4E1A, 0x4E04, 0x5B0D, 0x36AC, 0x537D, 0x36A5, 0x589A, 0x0000, + 0x57AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x57A7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x9C1B, 0x0000, 0x3E06, 0x0000, 0x0000, + 0x0000, 0x0000, 0x577A, 0x54DA, 0x717A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3635, 0x0000, 0x5220, 0x3C18, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4562, 0x5B1F, 0x0000, 0x9F50, + 0x9EA6, 0x0000, 0x51E2, 0x5342, 0x66AD, 0x585C, 0x5553, 0x3D85, 0x6160, + 0x48AE, 0x97BD, 0x0000, 0x60B3, 0x8424, 0x9814, 0x0000, 0x0000, 0x0000, + 0x3B2B, 0x3D32, 0x0000, 0x7081, 0x5C9C, 0x0000, 0x3730, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0100, 0x00C1, 0x01CD, 0x00C0, 0x0112, 0x00C9, 0x011A, + 0x00C8, 0x014C, 0x00D3, 0x01D1, 0x00D2, 0xF325, 0x1EBE, 0xF327, 0x1EC0, + 0x00CA, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0251, 0x0113, 0x00E9, 0x011B, + 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, 0x00F2, + 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, + 0xF344, 0x1EBF, 0xF346, 0x1EC1, 0x00EA, 0x0261, 0x0283, 0x0250, 0x025B, + 0x0254, 0x0275, 0x0153, 0x00F8, 0x014B, 0x028A, 0x026A, 0x23DA, 0x23DB, + 0x2E9D, 0x2EC6, 0x2EE3, 0x503B, 0x6DFE, 0x0000, 0x9FA6, 0x3DC9, 0x888F, + 0x0000, 0x7077, 0x5CF5, 0x4B20, 0x0000, 0x3559, 0x0000, 0x6122, 0x0000, + 0x8FA7, 0x91F6, 0x7191, 0x6719, 0x73BA, 0x0000, 0x0000, 0x3C8B, 0x0000, + 0x4B10, 0x78E4, 0x7402, 0x51AE, 0x0000, 0x4009, 0x6A63, 0x0000, 0x4223, + 0x860F, 0x7A2A, 0x0000, 0x0000, 0x9755, 0x704D, 0x5324, 0x0000, 0x93F4, + 0x76D9, 0x0000, 0x9FA7, 0x77DD, 0x4EA3, 0x4FF0, 0x50BC, 0x4E2F, 0x4F17, + 0x9FA8, 0x5434, 0x7D8B, 0x5892, 0x58D0, 0x0000, 0x5E92, 0x5E99, 0x5FC2, + 0x0000, 0x658B, 0x0000, 0x6919, 0x6A43, 0x0000, 0x6CFF, 0x7200, 0x0000, + 0x738C, 0x3EDB, 0x0000, 0x5B15, 0x74B9, 0x8B83, 0x0000, 0x0000, 0x7A93, + 0x7BEC, 0x7CC3, 0x7E6C, 0x82F8, 0x8597, 0x9FA9, 0x8890, 0x9FAA, 0x8EB9, + 0x9FAB, 0x8FCF, 0x855F, 0x99E0, 0x9221, 0x9FAC, 0x0000, 0x0000, 0x4071, + 0x42A2, 0x5A1A, 0x9868, 0x676B, 0x4276, 0x573D, 0x85D6, 0x0000, 0x82BF, + 0x0000, 0x4C81, 0x0000, 0x5D7B, 0x0000, 0x0000, 0x9FAD, 0x9FAE, 0x5B96, + 0x9FAF, 0x7E5B, 0x43F0, 0x4C32, 0x4603, 0x45A6, 0x4578, 0x0000, 0x4D77, + 0x45B3, 0x0000, 0x4CE2, 0x0000, 0x3B95, 0x4736, 0x4744, 0x4C47, 0x4C40, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4C57, 0x0000, 0x474F, 0x45DA, + 0x4C85, 0x0000, 0x4D07, 0x4AA4, 0x46A1, 0x0000, 0x7225, 0x0000, 0x0000, + 0x0000, 0x0000, 0x664D, 0x56FB, 0x7D95, 0x591D, 0x0000, 0x3DF4, 0x9734, + 0x0000, 0x5BDB, 0x0000, 0x5AA4, 0x3625, 0x0000, 0x5AD1, 0x5BB7, 0x5CFC, + 0x676E, 0x8593, 0x0000, 0x7461, 0x749D, 0x0000, 0x66E7, 0x6E57, 0x79CA, + 0x3D88, 0x44C3, 0x0000, 0x0000, 0x439A, 0x4536, 0x5CD5, 0x0000, 0x8AF9, + 0x5C78, 0x3D12, 0x0000, 0x5D78, 0x9FB2, 0x7157, 0x4558, 0x0000, 0x0000, + 0x4C77, 0x3978, 0x344A, 0x0000, 0x0000, 0x8ACC, 0x4FB4, 0x0000, 0x59BF, + 0x816C, 0x9856, 0x0000, 0x5F3B, 0x0000, 0x0000, 0x0000, 0x4102, 0x46BB, + 0x0000, 0x3F07, 0x9FB3, 0x0000, 0x40F8, 0x37D6, 0x46F7, 0x0000, 0x417C, + 0x0000, 0x0000, 0x456D, 0x38D4, 0x0000, 0x4561, 0x451B, 0x4D89, 0x4C7B, + 0x4D76, 0x45EA, 0x3FC8, 0x0000, 0x3661, 0x44DE, 0x44BD, 0x41ED, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/B5pc-H_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/B5pc-H_0.cpp new file mode 100644 index 000000000000..0c9606513a34 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/B5pc-H_0.cpp @@ -0,0 +1,93 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_B5pc_H_0[247 * 3] = { + 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x003D, 0x00FD, 0x00FF, 0x0060, + 0xA140, 0xA158, 0x0063, 0xA159, 0xA15C, 0x35AF, 0xA15D, 0xA17E, 0x0080, + 0xA1A1, 0xA1F5, 0x00A2, 0xA1F6, 0xA1F6, 0x00F8, 0xA1F7, 0xA1F7, 0x00F7, + 0xA1F8, 0xA1FE, 0x00F9, 0xA240, 0xA27E, 0x0100, 0xA2A1, 0xA2FE, 0x013F, + 0xA340, 0xA37E, 0x019D, 0xA3A1, 0xA3BB, 0x01DC, 0xA3BD, 0xA3BF, 0x01F7, + 0xA3C0, 0xA3E0, 0x0232, 0xA440, 0xA47E, 0x0253, 0xA4A1, 0xA4FE, 0x0292, + 0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F, 0xA640, 0xA67E, 0x038D, + 0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A, 0xA7A1, 0xA7FE, 0x0469, + 0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506, 0xA940, 0xA97E, 0x0564, + 0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601, 0xAAA1, 0xAAFE, 0x0640, + 0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD, 0xAC40, 0xAC7E, 0x073B, + 0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F, 0xAD40, 0xAD7E, 0x07D7, + 0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874, 0xAEA1, 0xAEFE, 0x08B3, + 0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950, 0xAFD0, 0xAFFE, 0x0980, + 0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE, 0xB140, 0xB17E, 0x0A4C, + 0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9, 0xB2A1, 0xB2FE, 0x0B28, + 0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5, 0xB440, 0xB47E, 0x0C23, + 0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0, 0xB5A1, 0xB5FE, 0x0CFF, + 0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C, 0xB740, 0xB77E, 0x0DFA, + 0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97, 0xB8A1, 0xB8FE, 0x0ED6, + 0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73, 0xBA40, 0xBA7E, 0x0FD1, + 0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E, 0xBBA1, 0xBBC7, 0x10AD, + 0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C, 0xBCA1, 0xBCFE, 0x114B, + 0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8, 0xBE40, 0xBE51, 0x1246, + 0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258, 0xBEA1, 0xBEFE, 0x1284, + 0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321, 0xC040, 0xC07E, 0x137F, + 0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C, 0xC1A1, 0xC1AA, 0x145B, + 0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA, 0xC2A1, 0xC2CA, 0x14F9, + 0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523, 0xC340, 0xC360, 0x1556, + 0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596, 0xC3B9, 0xC3B9, 0x15AF, + 0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0, 0xC440, 0xC455, 0x15F4, + 0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A, 0xC4A1, 0xC4FE, 0x1632, + 0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF, 0xC640, 0xC67E, 0x172D, + 0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776, + 0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797, + 0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809, + 0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E, + 0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942, + 0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E, + 0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19, + 0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5, + 0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0, + 0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC, + 0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7, + 0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3, + 0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001, + 0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F, + 0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A, + 0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216, + 0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274, + 0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312, + 0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE, + 0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B, + 0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527, + 0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622, + 0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE, + 0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9, + 0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5, + 0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0, + 0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC, + 0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42, + 0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8, + 0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86, + 0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3, + 0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F, + 0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8, + 0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014, + 0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8, + 0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C, + 0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE, + 0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160, + 0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E, + 0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC, + 0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161, + 0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0, + 0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D, + 0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6, + 0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327, + 0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF, + 0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA, + 0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511, + 0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E, + 0xF9D2, 0xF9D5, 0x354A, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/B5pc-V_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/B5pc-V_0.cpp new file mode 100644 index 000000000000..88768d692131 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/B5pc-V_0.cpp @@ -0,0 +1,14 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_B5pc_V_0[12 * 3] = { + 0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1, + 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A, + 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096, + 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/CNS-EUC-H_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/CNS-EUC-H_0.cpp new file mode 100644 index 000000000000..efbe352257d0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/CNS-EUC-H_0.cpp @@ -0,0 +1,172 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_CNS_EUC_H_0[157 * 3] = { + 0x0020, 0x007E, 0x3550, 0xA1A1, 0xA1FE, 0x0063, 0xA2A1, 0xA2FE, 0x00C1, + 0xA3A1, 0xA3CE, 0x011F, 0xA4A1, 0xA4FE, 0x014D, 0xA5A1, 0xA5EC, 0x01AB, + 0xA5EE, 0xA5F0, 0x01F7, 0xA6A1, 0xA6BE, 0x01FA, 0xA7A1, 0xA7A1, 0x0253, + 0xA7A2, 0xA7A4, 0x0218, 0xA7A5, 0xA7A5, 0x0254, 0xA7A6, 0xA7A6, 0x021B, + 0xA7A7, 0xA7A7, 0x025A, 0xA7A8, 0xA7A8, 0x021C, 0xA7A9, 0xA7AC, 0x025B, + 0xA7AD, 0xA7AF, 0x021D, 0xA7B0, 0xA7B0, 0x025F, 0xA7B1, 0xA7B1, 0x176E, + 0xA7B2, 0xA7B2, 0x0260, 0xA7B3, 0xA7B3, 0x0262, 0xA7B4, 0xA7B4, 0x0220, + 0xA7B5, 0xA7B5, 0x0263, 0xA7B6, 0xA7B6, 0x176F, 0xA7B7, 0xA7B7, 0x0221, + 0xA7B8, 0xA7B9, 0x0264, 0xA7BA, 0xA7BA, 0x0222, 0xA7BB, 0xA7BB, 0x1770, + 0xA7BC, 0xA7BC, 0x0223, 0xA7BD, 0xA7BD, 0x0266, 0xA7BE, 0xA7BE, 0x0279, + 0xA7BF, 0xA7BF, 0x1775, 0xA7C0, 0xA7C1, 0x027A, 0xA7C2, 0xA7C2, 0x0224, + 0xA7C3, 0xA7C6, 0x027C, 0xA7C7, 0xA7C7, 0x0225, 0xA7C8, 0xA7CB, 0x0282, + 0xA7CC, 0xA7CC, 0x1776, 0xA7CD, 0xA7CD, 0x0286, 0xA7CE, 0xA7CE, 0x0226, + 0xA7CF, 0xA7D0, 0x0288, 0xA7D1, 0xA7D2, 0x028C, 0xA7D3, 0xA7D5, 0x0227, + 0xA7D6, 0xA7D8, 0x028E, 0xA7D9, 0xA7DA, 0x022A, 0xA7DB, 0xA7DB, 0x1777, + 0xA7DC, 0xA7DF, 0x02D0, 0xA7E0, 0xA7E0, 0x02D5, 0xA7E1, 0xA7E1, 0x022C, + 0xA7E2, 0xA7E5, 0x02D6, 0xA7E6, 0xA7E6, 0x022D, 0xA7E7, 0xA7ED, 0x02DA, + 0xA7EE, 0xA7EE, 0x178A, 0xA7EF, 0xA7F2, 0x02E1, 0xA7F3, 0xA7F3, 0x178C, + 0xA7F4, 0xA7F8, 0x02E5, 0xA7F9, 0xA7F9, 0x178D, 0xA7FA, 0xA7FD, 0x02EA, + 0xA7FE, 0xA7FE, 0x0356, 0xA8A1, 0xA8A6, 0x0357, 0xA8A7, 0xA8A7, 0x035E, + 0xA8A8, 0xA8A8, 0x0362, 0xA8A9, 0xA8AA, 0x022E, 0xA8AB, 0xA8B2, 0x0363, + 0xA8B3, 0xA8B3, 0x17B2, 0xA8B4, 0xA8B6, 0x036B, 0xA8B7, 0xA8BA, 0x03F6, + 0xA8BB, 0xA8BB, 0x1812, 0xA8BC, 0xA8BE, 0x03FA, 0xA8BF, 0xA8C3, 0x03FE, + 0xA8C4, 0xA8CC, 0x0405, 0xA8CD, 0xA8CD, 0x1813, 0xA8CE, 0xA8CE, 0x1818, + 0xA8CF, 0xA8D2, 0x040F, 0xA8D3, 0xA8D3, 0x1819, 0xA8D4, 0xA8D9, 0x0508, + 0xA8DA, 0xA8DA, 0x18E7, 0xA8DB, 0xA8E2, 0x050E, 0xA8E3, 0xA8E3, 0x0230, + 0xA8E4, 0xA8E4, 0x051B, 0xA8E5, 0xA8E7, 0x0520, 0xA8E8, 0xA8EB, 0x0696, + 0xA8EC, 0xA8EC, 0x0231, 0xA8ED, 0xA8F0, 0x069F, 0xA8F1, 0xA8FB, 0x0826, + 0xA8FC, 0xA8FE, 0x09F5, 0xA9A1, 0xA9A1, 0x1E33, 0xA9A2, 0xA9A2, 0x09F8, + 0xA9A3, 0xA9A3, 0x1E34, 0xA9A4, 0xA9A5, 0x09F9, 0xA9A6, 0xA9AB, 0x0BE1, + 0xA9AC, 0xA9AE, 0x0DBB, 0xA9AF, 0xA9AF, 0x2360, 0xA9B0, 0xA9B0, 0x2612, + 0xA9B1, 0xA9B3, 0x0F7B, 0xA9B4, 0xA9B5, 0x1100, 0xA9B6, 0xA9B6, 0x1289, + 0xA9B7, 0xA9B8, 0x13B2, 0xA9B9, 0xA9B9, 0x2F0D, 0xC2A1, 0xC2C1, 0x0232, + 0xC4A1, 0xC4FE, 0x0253, 0xC5A1, 0xC5FE, 0x02B1, 0xC6A1, 0xC6FE, 0x030F, + 0xC7A1, 0xC7FE, 0x036D, 0xC8A1, 0xC8FE, 0x03CB, 0xC9A1, 0xC9FE, 0x0429, + 0xCAA1, 0xCAFE, 0x0487, 0xCBA1, 0xCBFE, 0x04E5, 0xCCA1, 0xCCFE, 0x0543, + 0xCDA1, 0xCDFE, 0x05A1, 0xCEA1, 0xCEFE, 0x05FF, 0xCFA1, 0xCFFE, 0x065D, + 0xD0A1, 0xD0FE, 0x06BB, 0xD1A1, 0xD1FE, 0x0719, 0xD2A1, 0xD2FE, 0x0777, + 0xD3A1, 0xD3FE, 0x07D5, 0xD4A1, 0xD4FE, 0x0833, 0xD5A1, 0xD5FE, 0x0891, + 0xD6A1, 0xD6FE, 0x08EF, 0xD7A1, 0xD7FE, 0x094D, 0xD8A1, 0xD8FE, 0x09AB, + 0xD9A1, 0xD9FE, 0x0A09, 0xDAA1, 0xDAFE, 0x0A67, 0xDBA1, 0xDBFE, 0x0AC5, + 0xDCA1, 0xDCFE, 0x0B23, 0xDDA1, 0xDDFE, 0x0B81, 0xDEA1, 0xDEFE, 0x0BDF, + 0xDFA1, 0xDFFE, 0x0C3D, 0xE0A1, 0xE0FE, 0x0C9B, 0xE1A1, 0xE1FE, 0x0CF9, + 0xE2A1, 0xE2FE, 0x0D57, 0xE3A1, 0xE3FE, 0x0DB5, 0xE4A1, 0xE4FE, 0x0E13, + 0xE5A1, 0xE5FE, 0x0E71, 0xE6A1, 0xE6FE, 0x0ECF, 0xE7A1, 0xE7FE, 0x0F2D, + 0xE8A1, 0xE8FE, 0x0F8B, 0xE9A1, 0xE9FE, 0x0FE9, 0xEAA1, 0xEAFE, 0x1047, + 0xEBA1, 0xEBFE, 0x10A5, 0xECA1, 0xECFE, 0x1103, 0xEDA1, 0xEDFE, 0x1161, + 0xEEA1, 0xEEFE, 0x11BF, 0xEFA1, 0xEFFE, 0x121D, 0xF0A1, 0xF0FE, 0x127B, + 0xF1A1, 0xF1FE, 0x12D9, 0xF2A1, 0xF2FE, 0x1337, 0xF3A1, 0xF3FE, 0x1395, + 0xF4A1, 0xF4FE, 0x13F3, 0xF5A1, 0xF5FE, 0x1451, 0xF6A1, 0xF6FE, 0x14AF, + 0xF7A1, 0xF7FE, 0x150D, 0xF8A1, 0xF8FE, 0x156B, 0xF9A1, 0xF9FE, 0x15C9, + 0xFAA1, 0xFAFE, 0x1627, 0xFBA1, 0xFBFE, 0x1685, 0xFCA1, 0xFCFE, 0x16E3, + 0xFDA1, 0xFDCB, 0x1741, +}; + +const uint16_t g_FXCMAP_CNS_EUC_H_0_DWord[238 * 4] = { + 0x8EA1, 0xA1A1, 0xA1FE, 0x0063, 0x8EA1, 0xA2A1, 0xA2FE, 0x00C1, 0x8EA1, + 0xA3A1, 0xA3CE, 0x011F, 0x8EA1, 0xA4A1, 0xA4FE, 0x014D, 0x8EA1, 0xA5A1, + 0xA5EC, 0x01AB, 0x8EA1, 0xA5EE, 0xA5F0, 0x01F7, 0x8EA1, 0xA6A1, 0xA6BE, + 0x01FA, 0x8EA1, 0xA7A1, 0xA7A1, 0x0253, 0x8EA1, 0xA7A2, 0xA7A4, 0x0218, + 0x8EA1, 0xA7A5, 0xA7A5, 0x0254, 0x8EA1, 0xA7A6, 0xA7A6, 0x021B, 0x8EA1, + 0xA7A7, 0xA7A7, 0x025A, 0x8EA1, 0xA7A8, 0xA7A8, 0x021C, 0x8EA1, 0xA7A9, + 0xA7AC, 0x025B, 0x8EA1, 0xA7AD, 0xA7AF, 0x021D, 0x8EA1, 0xA7B0, 0xA7B0, + 0x025F, 0x8EA1, 0xA7B1, 0xA7B1, 0x176E, 0x8EA1, 0xA7B2, 0xA7B2, 0x0260, + 0x8EA1, 0xA7B3, 0xA7B3, 0x0262, 0x8EA1, 0xA7B4, 0xA7B4, 0x0220, 0x8EA1, + 0xA7B5, 0xA7B5, 0x0263, 0x8EA1, 0xA7B6, 0xA7B6, 0x176F, 0x8EA1, 0xA7B7, + 0xA7B7, 0x0221, 0x8EA1, 0xA7B8, 0xA7B9, 0x0264, 0x8EA1, 0xA7BA, 0xA7BA, + 0x0222, 0x8EA1, 0xA7BB, 0xA7BB, 0x1770, 0x8EA1, 0xA7BC, 0xA7BC, 0x0223, + 0x8EA1, 0xA7BD, 0xA7BD, 0x0266, 0x8EA1, 0xA7BE, 0xA7BE, 0x0279, 0x8EA1, + 0xA7BF, 0xA7BF, 0x1775, 0x8EA1, 0xA7C0, 0xA7C1, 0x027A, 0x8EA1, 0xA7C2, + 0xA7C2, 0x0224, 0x8EA1, 0xA7C3, 0xA7C6, 0x027C, 0x8EA1, 0xA7C7, 0xA7C7, + 0x0225, 0x8EA1, 0xA7C8, 0xA7CB, 0x0282, 0x8EA1, 0xA7CC, 0xA7CC, 0x1776, + 0x8EA1, 0xA7CD, 0xA7CD, 0x0286, 0x8EA1, 0xA7CE, 0xA7CE, 0x0226, 0x8EA1, + 0xA7CF, 0xA7D0, 0x0288, 0x8EA1, 0xA7D1, 0xA7D2, 0x028C, 0x8EA1, 0xA7D3, + 0xA7D5, 0x0227, 0x8EA1, 0xA7D6, 0xA7D8, 0x028E, 0x8EA1, 0xA7D9, 0xA7DA, + 0x022A, 0x8EA1, 0xA7DB, 0xA7DB, 0x1777, 0x8EA1, 0xA7DC, 0xA7DF, 0x02D0, + 0x8EA1, 0xA7E0, 0xA7E0, 0x02D5, 0x8EA1, 0xA7E1, 0xA7E1, 0x022C, 0x8EA1, + 0xA7E2, 0xA7E5, 0x02D6, 0x8EA1, 0xA7E6, 0xA7E6, 0x022D, 0x8EA1, 0xA7E7, + 0xA7ED, 0x02DA, 0x8EA1, 0xA7EE, 0xA7EE, 0x178A, 0x8EA1, 0xA7EF, 0xA7F2, + 0x02E1, 0x8EA1, 0xA7F3, 0xA7F3, 0x178C, 0x8EA1, 0xA7F4, 0xA7F8, 0x02E5, + 0x8EA1, 0xA7F9, 0xA7F9, 0x178D, 0x8EA1, 0xA7FA, 0xA7FD, 0x02EA, 0x8EA1, + 0xA7FE, 0xA7FE, 0x0356, 0x8EA1, 0xA8A1, 0xA8A6, 0x0357, 0x8EA1, 0xA8A7, + 0xA8A7, 0x035E, 0x8EA1, 0xA8A8, 0xA8A8, 0x0362, 0x8EA1, 0xA8A9, 0xA8AA, + 0x022E, 0x8EA1, 0xA8AB, 0xA8B2, 0x0363, 0x8EA1, 0xA8B3, 0xA8B3, 0x17B2, + 0x8EA1, 0xA8B4, 0xA8B6, 0x036B, 0x8EA1, 0xA8B7, 0xA8BA, 0x03F6, 0x8EA1, + 0xA8BB, 0xA8BB, 0x1812, 0x8EA1, 0xA8BC, 0xA8BE, 0x03FA, 0x8EA1, 0xA8BF, + 0xA8C3, 0x03FE, 0x8EA1, 0xA8C4, 0xA8CC, 0x0405, 0x8EA1, 0xA8CD, 0xA8CD, + 0x1813, 0x8EA1, 0xA8CE, 0xA8CE, 0x1818, 0x8EA1, 0xA8CF, 0xA8D2, 0x040F, + 0x8EA1, 0xA8D3, 0xA8D3, 0x1819, 0x8EA1, 0xA8D4, 0xA8D9, 0x0508, 0x8EA1, + 0xA8DA, 0xA8DA, 0x18E7, 0x8EA1, 0xA8DB, 0xA8E2, 0x050E, 0x8EA1, 0xA8E3, + 0xA8E3, 0x0230, 0x8EA1, 0xA8E4, 0xA8E4, 0x051B, 0x8EA1, 0xA8E5, 0xA8E7, + 0x0520, 0x8EA1, 0xA8E8, 0xA8EB, 0x0696, 0x8EA1, 0xA8EC, 0xA8EC, 0x0231, + 0x8EA1, 0xA8ED, 0xA8F0, 0x069F, 0x8EA1, 0xA8F1, 0xA8FB, 0x0826, 0x8EA1, + 0xA8FC, 0xA8FE, 0x09F5, 0x8EA1, 0xA9A1, 0xA9A1, 0x1E33, 0x8EA1, 0xA9A2, + 0xA9A2, 0x09F8, 0x8EA1, 0xA9A3, 0xA9A3, 0x1E34, 0x8EA1, 0xA9A4, 0xA9A5, + 0x09F9, 0x8EA1, 0xA9A6, 0xA9AB, 0x0BE1, 0x8EA1, 0xA9AC, 0xA9AE, 0x0DBB, + 0x8EA1, 0xA9AF, 0xA9AF, 0x2360, 0x8EA1, 0xA9B0, 0xA9B0, 0x2612, 0x8EA1, + 0xA9B1, 0xA9B3, 0x0F7B, 0x8EA1, 0xA9B4, 0xA9B5, 0x1100, 0x8EA1, 0xA9B6, + 0xA9B6, 0x1289, 0x8EA1, 0xA9B7, 0xA9B8, 0x13B2, 0x8EA1, 0xA9B9, 0xA9B9, + 0x2F0D, 0x8EA1, 0xC2A1, 0xC2C1, 0x0232, 0x8EA1, 0xC4A1, 0xC4FE, 0x0253, + 0x8EA1, 0xC5A1, 0xC5FE, 0x02B1, 0x8EA1, 0xC6A1, 0xC6FE, 0x030F, 0x8EA1, + 0xC7A1, 0xC7FE, 0x036D, 0x8EA1, 0xC8A1, 0xC8FE, 0x03CB, 0x8EA1, 0xC9A1, + 0xC9FE, 0x0429, 0x8EA1, 0xCAA1, 0xCAFE, 0x0487, 0x8EA1, 0xCBA1, 0xCBFE, + 0x04E5, 0x8EA1, 0xCCA1, 0xCCFE, 0x0543, 0x8EA1, 0xCDA1, 0xCDFE, 0x05A1, + 0x8EA1, 0xCEA1, 0xCEFE, 0x05FF, 0x8EA1, 0xCFA1, 0xCFFE, 0x065D, 0x8EA1, + 0xD0A1, 0xD0FE, 0x06BB, 0x8EA1, 0xD1A1, 0xD1FE, 0x0719, 0x8EA1, 0xD2A1, + 0xD2FE, 0x0777, 0x8EA1, 0xD3A1, 0xD3FE, 0x07D5, 0x8EA1, 0xD4A1, 0xD4FE, + 0x0833, 0x8EA1, 0xD5A1, 0xD5FE, 0x0891, 0x8EA1, 0xD6A1, 0xD6FE, 0x08EF, + 0x8EA1, 0xD7A1, 0xD7FE, 0x094D, 0x8EA1, 0xD8A1, 0xD8FE, 0x09AB, 0x8EA1, + 0xD9A1, 0xD9FE, 0x0A09, 0x8EA1, 0xDAA1, 0xDAFE, 0x0A67, 0x8EA1, 0xDBA1, + 0xDBFE, 0x0AC5, 0x8EA1, 0xDCA1, 0xDCFE, 0x0B23, 0x8EA1, 0xDDA1, 0xDDFE, + 0x0B81, 0x8EA1, 0xDEA1, 0xDEFE, 0x0BDF, 0x8EA1, 0xDFA1, 0xDFFE, 0x0C3D, + 0x8EA1, 0xE0A1, 0xE0FE, 0x0C9B, 0x8EA1, 0xE1A1, 0xE1FE, 0x0CF9, 0x8EA1, + 0xE2A1, 0xE2FE, 0x0D57, 0x8EA1, 0xE3A1, 0xE3FE, 0x0DB5, 0x8EA1, 0xE4A1, + 0xE4FE, 0x0E13, 0x8EA1, 0xE5A1, 0xE5FE, 0x0E71, 0x8EA1, 0xE6A1, 0xE6FE, + 0x0ECF, 0x8EA1, 0xE7A1, 0xE7FE, 0x0F2D, 0x8EA1, 0xE8A1, 0xE8FE, 0x0F8B, + 0x8EA1, 0xE9A1, 0xE9FE, 0x0FE9, 0x8EA1, 0xEAA1, 0xEAFE, 0x1047, 0x8EA1, + 0xEBA1, 0xEBFE, 0x10A5, 0x8EA1, 0xECA1, 0xECFE, 0x1103, 0x8EA1, 0xEDA1, + 0xEDFE, 0x1161, 0x8EA1, 0xEEA1, 0xEEFE, 0x11BF, 0x8EA1, 0xEFA1, 0xEFFE, + 0x121D, 0x8EA1, 0xF0A1, 0xF0FE, 0x127B, 0x8EA1, 0xF1A1, 0xF1FE, 0x12D9, + 0x8EA1, 0xF2A1, 0xF2FE, 0x1337, 0x8EA1, 0xF3A1, 0xF3FE, 0x1395, 0x8EA1, + 0xF4A1, 0xF4FE, 0x13F3, 0x8EA1, 0xF5A1, 0xF5FE, 0x1451, 0x8EA1, 0xF6A1, + 0xF6FE, 0x14AF, 0x8EA1, 0xF7A1, 0xF7FE, 0x150D, 0x8EA1, 0xF8A1, 0xF8FE, + 0x156B, 0x8EA1, 0xF9A1, 0xF9FE, 0x15C9, 0x8EA1, 0xFAA1, 0xFAFE, 0x1627, + 0x8EA1, 0xFBA1, 0xFBFE, 0x1685, 0x8EA1, 0xFCA1, 0xFCFE, 0x16E3, 0x8EA1, + 0xFDA1, 0xFDCB, 0x1741, 0x8EA2, 0xA1A1, 0xA1FE, 0x176C, 0x8EA2, 0xA2A1, + 0xA2FE, 0x17CA, 0x8EA2, 0xA3A1, 0xA3FE, 0x1828, 0x8EA2, 0xA4A1, 0xA4FE, + 0x1886, 0x8EA2, 0xA5A1, 0xA5FE, 0x18E4, 0x8EA2, 0xA6A1, 0xA6FE, 0x1942, + 0x8EA2, 0xA7A1, 0xA7FE, 0x19A0, 0x8EA2, 0xA8A1, 0xA8FE, 0x19FE, 0x8EA2, + 0xA9A1, 0xA9FE, 0x1A5C, 0x8EA2, 0xAAA1, 0xAAFE, 0x1ABA, 0x8EA2, 0xABA1, + 0xABFE, 0x1B18, 0x8EA2, 0xACA1, 0xACFE, 0x1B76, 0x8EA2, 0xADA1, 0xADFE, + 0x1BD4, 0x8EA2, 0xAEA1, 0xAEFE, 0x1C32, 0x8EA2, 0xAFA1, 0xAFFE, 0x1C90, + 0x8EA2, 0xB0A1, 0xB0FE, 0x1CEE, 0x8EA2, 0xB1A1, 0xB1FE, 0x1D4C, 0x8EA2, + 0xB2A1, 0xB2FE, 0x1DAA, 0x8EA2, 0xB3A1, 0xB3FE, 0x1E08, 0x8EA2, 0xB4A1, + 0xB4FE, 0x1E66, 0x8EA2, 0xB5A1, 0xB5FE, 0x1EC4, 0x8EA2, 0xB6A1, 0xB6FE, + 0x1F22, 0x8EA2, 0xB7A1, 0xB7FE, 0x1F80, 0x8EA2, 0xB8A1, 0xB8FE, 0x1FDE, + 0x8EA2, 0xB9A1, 0xB9FE, 0x203C, 0x8EA2, 0xBAA1, 0xBAFE, 0x209A, 0x8EA2, + 0xBBA1, 0xBBFE, 0x20F8, 0x8EA2, 0xBCA1, 0xBCFE, 0x2156, 0x8EA2, 0xBDA1, + 0xBDFE, 0x21B4, 0x8EA2, 0xBEA1, 0xBEFE, 0x2212, 0x8EA2, 0xBFA1, 0xBFFE, + 0x2270, 0x8EA2, 0xC0A1, 0xC0FE, 0x22CE, 0x8EA2, 0xC1A1, 0xC1FE, 0x232C, + 0x8EA2, 0xC2A1, 0xC2FE, 0x238A, 0x8EA2, 0xC3A1, 0xC3FE, 0x23E8, 0x8EA2, + 0xC4A1, 0xC4FE, 0x2446, 0x8EA2, 0xC5A1, 0xC5FE, 0x24A4, 0x8EA2, 0xC6A1, + 0xC6FE, 0x2502, 0x8EA2, 0xC7A1, 0xC7FE, 0x2560, 0x8EA2, 0xC8A1, 0xC8FE, + 0x25BE, 0x8EA2, 0xC9A1, 0xC9FE, 0x261C, 0x8EA2, 0xCAA1, 0xCAFE, 0x267A, + 0x8EA2, 0xCBA1, 0xCBFE, 0x26D8, 0x8EA2, 0xCCA1, 0xCCFE, 0x2736, 0x8EA2, + 0xCDA1, 0xCDFE, 0x2794, 0x8EA2, 0xCEA1, 0xCEFE, 0x27F2, 0x8EA2, 0xCFA1, + 0xCFFE, 0x2850, 0x8EA2, 0xD0A1, 0xD0FE, 0x28AE, 0x8EA2, 0xD1A1, 0xD1FE, + 0x290C, 0x8EA2, 0xD2A1, 0xD2FE, 0x296A, 0x8EA2, 0xD3A1, 0xD3FE, 0x29C8, + 0x8EA2, 0xD4A1, 0xD4FE, 0x2A26, 0x8EA2, 0xD5A1, 0xD5FE, 0x2A84, 0x8EA2, + 0xD6A1, 0xD6FE, 0x2AE2, 0x8EA2, 0xD7A1, 0xD7FE, 0x2B40, 0x8EA2, 0xD8A1, + 0xD8FE, 0x2B9E, 0x8EA2, 0xD9A1, 0xD9FE, 0x2BFC, 0x8EA2, 0xDAA1, 0xDAFE, + 0x2C5A, 0x8EA2, 0xDBA1, 0xDBFE, 0x2CB8, 0x8EA2, 0xDCA1, 0xDCFE, 0x2D16, + 0x8EA2, 0xDDA1, 0xDDFE, 0x2D74, 0x8EA2, 0xDEA1, 0xDEFE, 0x2DD2, 0x8EA2, + 0xDFA1, 0xDFFE, 0x2E30, 0x8EA2, 0xE0A1, 0xE0FE, 0x2E8E, 0x8EA2, 0xE1A1, + 0xE1FE, 0x2EEC, 0x8EA2, 0xE2A1, 0xE2FE, 0x2F4A, 0x8EA2, 0xE3A1, 0xE3FE, + 0x2FA8, 0x8EA2, 0xE4A1, 0xE4FE, 0x3006, 0x8EA2, 0xE5A1, 0xE5FE, 0x3064, + 0x8EA2, 0xE6A1, 0xE6FE, 0x30C2, 0x8EA2, 0xE7A1, 0xE7FE, 0x3120, 0x8EA2, + 0xE8A1, 0xE8FE, 0x317E, 0x8EA2, 0xE9A1, 0xE9FE, 0x31DC, 0x8EA2, 0xEAA1, + 0xEAFE, 0x323A, 0x8EA2, 0xEBA1, 0xEBFE, 0x3298, 0x8EA2, 0xECA1, 0xECFE, + 0x32F6, 0x8EA2, 0xEDA1, 0xEDFE, 0x3354, 0x8EA2, 0xEEA1, 0xEEFE, 0x33B2, + 0x8EA2, 0xEFA1, 0xEFFE, 0x3410, 0x8EA2, 0xF0A1, 0xF0FE, 0x346E, 0x8EA2, + 0xF1A1, 0xF1FE, 0x34CC, 0x8EA2, 0xF2A1, 0xF2C4, 0x352A, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/CNS-EUC-V_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/CNS-EUC-V_0.cpp new file mode 100644 index 000000000000..2090969e7921 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/CNS-EUC-V_0.cpp @@ -0,0 +1,189 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_CNS_EUC_V_0[180 * 3] = { + 0x0020, 0x007E, 0x3550, 0xA1A1, 0xA1AB, 0x0063, 0xA1AC, 0xA1AC, 0x354E, + 0xA1AD, 0xA1BA, 0x006F, 0xA1BB, 0xA1BB, 0x007C, 0xA1BC, 0xA1BC, 0x007E, + 0xA1BD, 0xA1BD, 0x007E, 0xA1BE, 0xA1BF, 0x0082, 0xA1C0, 0xA1C1, 0x0082, + 0xA1C2, 0xA1C3, 0x0086, 0xA1C4, 0xA1C5, 0x0086, 0xA1C6, 0xA1C7, 0x008A, + 0xA1C8, 0xA1C9, 0x008A, 0xA1CA, 0xA1CB, 0x008E, 0xA1CC, 0xA1CD, 0x008E, + 0xA1CE, 0xA1CF, 0x0092, 0xA1D0, 0xA1D1, 0x0092, 0xA1D2, 0xA1D3, 0x0096, + 0xA1D4, 0xA1D5, 0x0096, 0xA1D6, 0xA1D7, 0x009A, 0xA1D8, 0xA1D9, 0x009A, + 0xA1DA, 0xA1DB, 0x009E, 0xA1DC, 0xA1FE, 0x009E, 0xA2A1, 0xA2C3, 0x00C1, + 0xA2C4, 0xA2C4, 0x354F, 0xA2C5, 0xA2FE, 0x00E5, 0xA3A1, 0xA3CE, 0x011F, + 0xA4A1, 0xA4FE, 0x014D, 0xA5A1, 0xA5EC, 0x01AB, 0xA5EE, 0xA5F0, 0x01F7, + 0xA6A1, 0xA6BE, 0x01FA, 0xA7A1, 0xA7A1, 0x0253, 0xA7A2, 0xA7A4, 0x0218, + 0xA7A5, 0xA7A5, 0x0254, 0xA7A6, 0xA7A6, 0x021B, 0xA7A7, 0xA7A7, 0x025A, + 0xA7A8, 0xA7A8, 0x021C, 0xA7A9, 0xA7AC, 0x025B, 0xA7AD, 0xA7AF, 0x021D, + 0xA7B0, 0xA7B0, 0x025F, 0xA7B1, 0xA7B1, 0x176E, 0xA7B2, 0xA7B2, 0x0260, + 0xA7B3, 0xA7B3, 0x0262, 0xA7B4, 0xA7B4, 0x0220, 0xA7B5, 0xA7B5, 0x0263, + 0xA7B6, 0xA7B6, 0x176F, 0xA7B7, 0xA7B7, 0x0221, 0xA7B8, 0xA7B9, 0x0264, + 0xA7BA, 0xA7BA, 0x0222, 0xA7BB, 0xA7BB, 0x1770, 0xA7BC, 0xA7BC, 0x0223, + 0xA7BD, 0xA7BD, 0x0266, 0xA7BE, 0xA7BE, 0x0279, 0xA7BF, 0xA7BF, 0x1775, + 0xA7C0, 0xA7C1, 0x027A, 0xA7C2, 0xA7C2, 0x0224, 0xA7C3, 0xA7C6, 0x027C, + 0xA7C7, 0xA7C7, 0x0225, 0xA7C8, 0xA7CB, 0x0282, 0xA7CC, 0xA7CC, 0x1776, + 0xA7CD, 0xA7CD, 0x0286, 0xA7CE, 0xA7CE, 0x0226, 0xA7CF, 0xA7D0, 0x0288, + 0xA7D1, 0xA7D2, 0x028C, 0xA7D3, 0xA7D5, 0x0227, 0xA7D6, 0xA7D8, 0x028E, + 0xA7D9, 0xA7DA, 0x022A, 0xA7DB, 0xA7DB, 0x1777, 0xA7DC, 0xA7DF, 0x02D0, + 0xA7E0, 0xA7E0, 0x02D5, 0xA7E1, 0xA7E1, 0x022C, 0xA7E2, 0xA7E5, 0x02D6, + 0xA7E6, 0xA7E6, 0x022D, 0xA7E7, 0xA7ED, 0x02DA, 0xA7EE, 0xA7EE, 0x178A, + 0xA7EF, 0xA7F2, 0x02E1, 0xA7F3, 0xA7F3, 0x178C, 0xA7F4, 0xA7F8, 0x02E5, + 0xA7F9, 0xA7F9, 0x178D, 0xA7FA, 0xA7FD, 0x02EA, 0xA7FE, 0xA7FE, 0x0356, + 0xA8A1, 0xA8A6, 0x0357, 0xA8A7, 0xA8A7, 0x035E, 0xA8A8, 0xA8A8, 0x0362, + 0xA8A9, 0xA8AA, 0x022E, 0xA8AB, 0xA8B2, 0x0363, 0xA8B3, 0xA8B3, 0x17B2, + 0xA8B4, 0xA8B6, 0x036B, 0xA8B7, 0xA8BA, 0x03F6, 0xA8BB, 0xA8BB, 0x1812, + 0xA8BC, 0xA8BE, 0x03FA, 0xA8BF, 0xA8C3, 0x03FE, 0xA8C4, 0xA8CC, 0x0405, + 0xA8CD, 0xA8CD, 0x1813, 0xA8CE, 0xA8CE, 0x1818, 0xA8CF, 0xA8D2, 0x040F, + 0xA8D3, 0xA8D3, 0x1819, 0xA8D4, 0xA8D9, 0x0508, 0xA8DA, 0xA8DA, 0x18E7, + 0xA8DB, 0xA8E2, 0x050E, 0xA8E3, 0xA8E3, 0x0230, 0xA8E4, 0xA8E4, 0x051B, + 0xA8E5, 0xA8E7, 0x0520, 0xA8E8, 0xA8EB, 0x0696, 0xA8EC, 0xA8EC, 0x0231, + 0xA8ED, 0xA8F0, 0x069F, 0xA8F1, 0xA8FB, 0x0826, 0xA8FC, 0xA8FE, 0x09F5, + 0xA9A1, 0xA9A1, 0x1E33, 0xA9A2, 0xA9A2, 0x09F8, 0xA9A3, 0xA9A3, 0x1E34, + 0xA9A4, 0xA9A5, 0x09F9, 0xA9A6, 0xA9AB, 0x0BE1, 0xA9AC, 0xA9AE, 0x0DBB, + 0xA9AF, 0xA9AF, 0x2360, 0xA9B0, 0xA9B0, 0x2612, 0xA9B1, 0xA9B3, 0x0F7B, + 0xA9B4, 0xA9B5, 0x1100, 0xA9B6, 0xA9B6, 0x1289, 0xA9B7, 0xA9B8, 0x13B2, + 0xA9B9, 0xA9B9, 0x2F0D, 0xC2A1, 0xC2C1, 0x0232, 0xC4A1, 0xC4FE, 0x0253, + 0xC5A1, 0xC5FE, 0x02B1, 0xC6A1, 0xC6FE, 0x030F, 0xC7A1, 0xC7FE, 0x036D, + 0xC8A1, 0xC8FE, 0x03CB, 0xC9A1, 0xC9FE, 0x0429, 0xCAA1, 0xCAFE, 0x0487, + 0xCBA1, 0xCBFE, 0x04E5, 0xCCA1, 0xCCFE, 0x0543, 0xCDA1, 0xCDFE, 0x05A1, + 0xCEA1, 0xCEFE, 0x05FF, 0xCFA1, 0xCFFE, 0x065D, 0xD0A1, 0xD0FE, 0x06BB, + 0xD1A1, 0xD1FE, 0x0719, 0xD2A1, 0xD2FE, 0x0777, 0xD3A1, 0xD3FE, 0x07D5, + 0xD4A1, 0xD4FE, 0x0833, 0xD5A1, 0xD5FE, 0x0891, 0xD6A1, 0xD6FE, 0x08EF, + 0xD7A1, 0xD7FE, 0x094D, 0xD8A1, 0xD8FE, 0x09AB, 0xD9A1, 0xD9FE, 0x0A09, + 0xDAA1, 0xDAFE, 0x0A67, 0xDBA1, 0xDBFE, 0x0AC5, 0xDCA1, 0xDCFE, 0x0B23, + 0xDDA1, 0xDDFE, 0x0B81, 0xDEA1, 0xDEFE, 0x0BDF, 0xDFA1, 0xDFFE, 0x0C3D, + 0xE0A1, 0xE0FE, 0x0C9B, 0xE1A1, 0xE1FE, 0x0CF9, 0xE2A1, 0xE2FE, 0x0D57, + 0xE3A1, 0xE3FE, 0x0DB5, 0xE4A1, 0xE4FE, 0x0E13, 0xE5A1, 0xE5FE, 0x0E71, + 0xE6A1, 0xE6FE, 0x0ECF, 0xE7A1, 0xE7FE, 0x0F2D, 0xE8A1, 0xE8FE, 0x0F8B, + 0xE9A1, 0xE9FE, 0x0FE9, 0xEAA1, 0xEAFE, 0x1047, 0xEBA1, 0xEBFE, 0x10A5, + 0xECA1, 0xECFE, 0x1103, 0xEDA1, 0xEDFE, 0x1161, 0xEEA1, 0xEEFE, 0x11BF, + 0xEFA1, 0xEFFE, 0x121D, 0xF0A1, 0xF0FE, 0x127B, 0xF1A1, 0xF1FE, 0x12D9, + 0xF2A1, 0xF2FE, 0x1337, 0xF3A1, 0xF3FE, 0x1395, 0xF4A1, 0xF4FE, 0x13F3, + 0xF5A1, 0xF5FE, 0x1451, 0xF6A1, 0xF6FE, 0x14AF, 0xF7A1, 0xF7FE, 0x150D, + 0xF8A1, 0xF8FE, 0x156B, 0xF9A1, 0xF9FE, 0x15C9, 0xFAA1, 0xFAFE, 0x1627, + 0xFBA1, 0xFBFE, 0x1685, 0xFCA1, 0xFCFE, 0x16E3, 0xFDA1, 0xFDCB, 0x1741, +}; + +const uint16_t g_FXCMAP_CNS_EUC_V_0_DWord[261 * 4] = { + 0x8EA1, 0xA1A1, 0xA1AB, 0x0063, 0x8EA1, 0xA1AC, 0xA1AC, 0x354E, 0x8EA1, + 0xA1AD, 0xA1BA, 0x006F, 0x8EA1, 0xA1BB, 0xA1BB, 0x007C, 0x8EA1, 0xA1BC, + 0xA1BC, 0x007E, 0x8EA1, 0xA1BD, 0xA1BD, 0x007E, 0x8EA1, 0xA1BE, 0xA1BF, + 0x0082, 0x8EA1, 0xA1C0, 0xA1C1, 0x0082, 0x8EA1, 0xA1C2, 0xA1C3, 0x0086, + 0x8EA1, 0xA1C4, 0xA1C5, 0x0086, 0x8EA1, 0xA1C6, 0xA1C7, 0x008A, 0x8EA1, + 0xA1C8, 0xA1C9, 0x008A, 0x8EA1, 0xA1CA, 0xA1CB, 0x008E, 0x8EA1, 0xA1CC, + 0xA1CD, 0x008E, 0x8EA1, 0xA1CE, 0xA1CF, 0x0092, 0x8EA1, 0xA1D0, 0xA1D1, + 0x0092, 0x8EA1, 0xA1D2, 0xA1D3, 0x0096, 0x8EA1, 0xA1D4, 0xA1D5, 0x0096, + 0x8EA1, 0xA1D6, 0xA1D7, 0x009A, 0x8EA1, 0xA1D8, 0xA1D9, 0x009A, 0x8EA1, + 0xA1DA, 0xA1DB, 0x009E, 0x8EA1, 0xA1DC, 0xA1FE, 0x009E, 0x8EA1, 0xA2A1, + 0xA2C3, 0x00C1, 0x8EA1, 0xA2C4, 0xA2C4, 0x354F, 0x8EA1, 0xA2C5, 0xA2FE, + 0x00E5, 0x8EA1, 0xA3A1, 0xA3CE, 0x011F, 0x8EA1, 0xA4A1, 0xA4FE, 0x014D, + 0x8EA1, 0xA5A1, 0xA5EC, 0x01AB, 0x8EA1, 0xA5EE, 0xA5F0, 0x01F7, 0x8EA1, + 0xA6A1, 0xA6BE, 0x01FA, 0x8EA1, 0xA7A1, 0xA7A1, 0x0253, 0x8EA1, 0xA7A2, + 0xA7A4, 0x0218, 0x8EA1, 0xA7A5, 0xA7A5, 0x0254, 0x8EA1, 0xA7A6, 0xA7A6, + 0x021B, 0x8EA1, 0xA7A7, 0xA7A7, 0x025A, 0x8EA1, 0xA7A8, 0xA7A8, 0x021C, + 0x8EA1, 0xA7A9, 0xA7AC, 0x025B, 0x8EA1, 0xA7AD, 0xA7AF, 0x021D, 0x8EA1, + 0xA7B0, 0xA7B0, 0x025F, 0x8EA1, 0xA7B1, 0xA7B1, 0x176E, 0x8EA1, 0xA7B2, + 0xA7B2, 0x0260, 0x8EA1, 0xA7B3, 0xA7B3, 0x0262, 0x8EA1, 0xA7B4, 0xA7B4, + 0x0220, 0x8EA1, 0xA7B5, 0xA7B5, 0x0263, 0x8EA1, 0xA7B6, 0xA7B6, 0x176F, + 0x8EA1, 0xA7B7, 0xA7B7, 0x0221, 0x8EA1, 0xA7B8, 0xA7B9, 0x0264, 0x8EA1, + 0xA7BA, 0xA7BA, 0x0222, 0x8EA1, 0xA7BB, 0xA7BB, 0x1770, 0x8EA1, 0xA7BC, + 0xA7BC, 0x0223, 0x8EA1, 0xA7BD, 0xA7BD, 0x0266, 0x8EA1, 0xA7BE, 0xA7BE, + 0x0279, 0x8EA1, 0xA7BF, 0xA7BF, 0x1775, 0x8EA1, 0xA7C0, 0xA7C1, 0x027A, + 0x8EA1, 0xA7C2, 0xA7C2, 0x0224, 0x8EA1, 0xA7C3, 0xA7C6, 0x027C, 0x8EA1, + 0xA7C7, 0xA7C7, 0x0225, 0x8EA1, 0xA7C8, 0xA7CB, 0x0282, 0x8EA1, 0xA7CC, + 0xA7CC, 0x1776, 0x8EA1, 0xA7CD, 0xA7CD, 0x0286, 0x8EA1, 0xA7CE, 0xA7CE, + 0x0226, 0x8EA1, 0xA7CF, 0xA7D0, 0x0288, 0x8EA1, 0xA7D1, 0xA7D2, 0x028C, + 0x8EA1, 0xA7D3, 0xA7D5, 0x0227, 0x8EA1, 0xA7D6, 0xA7D8, 0x028E, 0x8EA1, + 0xA7D9, 0xA7DA, 0x022A, 0x8EA1, 0xA7DB, 0xA7DB, 0x1777, 0x8EA1, 0xA7DC, + 0xA7DF, 0x02D0, 0x8EA1, 0xA7E0, 0xA7E0, 0x02D5, 0x8EA1, 0xA7E1, 0xA7E1, + 0x022C, 0x8EA1, 0xA7E2, 0xA7E5, 0x02D6, 0x8EA1, 0xA7E6, 0xA7E6, 0x022D, + 0x8EA1, 0xA7E7, 0xA7ED, 0x02DA, 0x8EA1, 0xA7EE, 0xA7EE, 0x178A, 0x8EA1, + 0xA7EF, 0xA7F2, 0x02E1, 0x8EA1, 0xA7F3, 0xA7F3, 0x178C, 0x8EA1, 0xA7F4, + 0xA7F8, 0x02E5, 0x8EA1, 0xA7F9, 0xA7F9, 0x178D, 0x8EA1, 0xA7FA, 0xA7FD, + 0x02EA, 0x8EA1, 0xA7FE, 0xA7FE, 0x0356, 0x8EA1, 0xA8A1, 0xA8A6, 0x0357, + 0x8EA1, 0xA8A7, 0xA8A7, 0x035E, 0x8EA1, 0xA8A8, 0xA8A8, 0x0362, 0x8EA1, + 0xA8A9, 0xA8AA, 0x022E, 0x8EA1, 0xA8AB, 0xA8B2, 0x0363, 0x8EA1, 0xA8B3, + 0xA8B3, 0x17B2, 0x8EA1, 0xA8B4, 0xA8B6, 0x036B, 0x8EA1, 0xA8B7, 0xA8BA, + 0x03F6, 0x8EA1, 0xA8BB, 0xA8BB, 0x1812, 0x8EA1, 0xA8BC, 0xA8BE, 0x03FA, + 0x8EA1, 0xA8BF, 0xA8C3, 0x03FE, 0x8EA1, 0xA8C4, 0xA8CC, 0x0405, 0x8EA1, + 0xA8CD, 0xA8CD, 0x1813, 0x8EA1, 0xA8CE, 0xA8CE, 0x1818, 0x8EA1, 0xA8CF, + 0xA8D2, 0x040F, 0x8EA1, 0xA8D3, 0xA8D3, 0x1819, 0x8EA1, 0xA8D4, 0xA8D9, + 0x0508, 0x8EA1, 0xA8DA, 0xA8DA, 0x18E7, 0x8EA1, 0xA8DB, 0xA8E2, 0x050E, + 0x8EA1, 0xA8E3, 0xA8E3, 0x0230, 0x8EA1, 0xA8E4, 0xA8E4, 0x051B, 0x8EA1, + 0xA8E5, 0xA8E7, 0x0520, 0x8EA1, 0xA8E8, 0xA8EB, 0x0696, 0x8EA1, 0xA8EC, + 0xA8EC, 0x0231, 0x8EA1, 0xA8ED, 0xA8F0, 0x069F, 0x8EA1, 0xA8F1, 0xA8FB, + 0x0826, 0x8EA1, 0xA8FC, 0xA8FE, 0x09F5, 0x8EA1, 0xA9A1, 0xA9A1, 0x1E33, + 0x8EA1, 0xA9A2, 0xA9A2, 0x09F8, 0x8EA1, 0xA9A3, 0xA9A3, 0x1E34, 0x8EA1, + 0xA9A4, 0xA9A5, 0x09F9, 0x8EA1, 0xA9A6, 0xA9AB, 0x0BE1, 0x8EA1, 0xA9AC, + 0xA9AE, 0x0DBB, 0x8EA1, 0xA9AF, 0xA9AF, 0x2360, 0x8EA1, 0xA9B0, 0xA9B0, + 0x2612, 0x8EA1, 0xA9B1, 0xA9B3, 0x0F7B, 0x8EA1, 0xA9B4, 0xA9B5, 0x1100, + 0x8EA1, 0xA9B6, 0xA9B6, 0x1289, 0x8EA1, 0xA9B7, 0xA9B8, 0x13B2, 0x8EA1, + 0xA9B9, 0xA9B9, 0x2F0D, 0x8EA1, 0xC2A1, 0xC2C1, 0x0232, 0x8EA1, 0xC4A1, + 0xC4FE, 0x0253, 0x8EA1, 0xC5A1, 0xC5FE, 0x02B1, 0x8EA1, 0xC6A1, 0xC6FE, + 0x030F, 0x8EA1, 0xC7A1, 0xC7FE, 0x036D, 0x8EA1, 0xC8A1, 0xC8FE, 0x03CB, + 0x8EA1, 0xC9A1, 0xC9FE, 0x0429, 0x8EA1, 0xCAA1, 0xCAFE, 0x0487, 0x8EA1, + 0xCBA1, 0xCBFE, 0x04E5, 0x8EA1, 0xCCA1, 0xCCFE, 0x0543, 0x8EA1, 0xCDA1, + 0xCDFE, 0x05A1, 0x8EA1, 0xCEA1, 0xCEFE, 0x05FF, 0x8EA1, 0xCFA1, 0xCFFE, + 0x065D, 0x8EA1, 0xD0A1, 0xD0FE, 0x06BB, 0x8EA1, 0xD1A1, 0xD1FE, 0x0719, + 0x8EA1, 0xD2A1, 0xD2FE, 0x0777, 0x8EA1, 0xD3A1, 0xD3FE, 0x07D5, 0x8EA1, + 0xD4A1, 0xD4FE, 0x0833, 0x8EA1, 0xD5A1, 0xD5FE, 0x0891, 0x8EA1, 0xD6A1, + 0xD6FE, 0x08EF, 0x8EA1, 0xD7A1, 0xD7FE, 0x094D, 0x8EA1, 0xD8A1, 0xD8FE, + 0x09AB, 0x8EA1, 0xD9A1, 0xD9FE, 0x0A09, 0x8EA1, 0xDAA1, 0xDAFE, 0x0A67, + 0x8EA1, 0xDBA1, 0xDBFE, 0x0AC5, 0x8EA1, 0xDCA1, 0xDCFE, 0x0B23, 0x8EA1, + 0xDDA1, 0xDDFE, 0x0B81, 0x8EA1, 0xDEA1, 0xDEFE, 0x0BDF, 0x8EA1, 0xDFA1, + 0xDFFE, 0x0C3D, 0x8EA1, 0xE0A1, 0xE0FE, 0x0C9B, 0x8EA1, 0xE1A1, 0xE1FE, + 0x0CF9, 0x8EA1, 0xE2A1, 0xE2FE, 0x0D57, 0x8EA1, 0xE3A1, 0xE3FE, 0x0DB5, + 0x8EA1, 0xE4A1, 0xE4FE, 0x0E13, 0x8EA1, 0xE5A1, 0xE5FE, 0x0E71, 0x8EA1, + 0xE6A1, 0xE6FE, 0x0ECF, 0x8EA1, 0xE7A1, 0xE7FE, 0x0F2D, 0x8EA1, 0xE8A1, + 0xE8FE, 0x0F8B, 0x8EA1, 0xE9A1, 0xE9FE, 0x0FE9, 0x8EA1, 0xEAA1, 0xEAFE, + 0x1047, 0x8EA1, 0xEBA1, 0xEBFE, 0x10A5, 0x8EA1, 0xECA1, 0xECFE, 0x1103, + 0x8EA1, 0xEDA1, 0xEDFE, 0x1161, 0x8EA1, 0xEEA1, 0xEEFE, 0x11BF, 0x8EA1, + 0xEFA1, 0xEFFE, 0x121D, 0x8EA1, 0xF0A1, 0xF0FE, 0x127B, 0x8EA1, 0xF1A1, + 0xF1FE, 0x12D9, 0x8EA1, 0xF2A1, 0xF2FE, 0x1337, 0x8EA1, 0xF3A1, 0xF3FE, + 0x1395, 0x8EA1, 0xF4A1, 0xF4FE, 0x13F3, 0x8EA1, 0xF5A1, 0xF5FE, 0x1451, + 0x8EA1, 0xF6A1, 0xF6FE, 0x14AF, 0x8EA1, 0xF7A1, 0xF7FE, 0x150D, 0x8EA1, + 0xF8A1, 0xF8FE, 0x156B, 0x8EA1, 0xF9A1, 0xF9FE, 0x15C9, 0x8EA1, 0xFAA1, + 0xFAFE, 0x1627, 0x8EA1, 0xFBA1, 0xFBFE, 0x1685, 0x8EA1, 0xFCA1, 0xFCFE, + 0x16E3, 0x8EA1, 0xFDA1, 0xFDCB, 0x1741, 0x8EA2, 0xA1A1, 0xA1FE, 0x176C, + 0x8EA2, 0xA2A1, 0xA2FE, 0x17CA, 0x8EA2, 0xA3A1, 0xA3FE, 0x1828, 0x8EA2, + 0xA4A1, 0xA4FE, 0x1886, 0x8EA2, 0xA5A1, 0xA5FE, 0x18E4, 0x8EA2, 0xA6A1, + 0xA6FE, 0x1942, 0x8EA2, 0xA7A1, 0xA7FE, 0x19A0, 0x8EA2, 0xA8A1, 0xA8FE, + 0x19FE, 0x8EA2, 0xA9A1, 0xA9FE, 0x1A5C, 0x8EA2, 0xAAA1, 0xAAFE, 0x1ABA, + 0x8EA2, 0xABA1, 0xABFE, 0x1B18, 0x8EA2, 0xACA1, 0xACFE, 0x1B76, 0x8EA2, + 0xADA1, 0xADFE, 0x1BD4, 0x8EA2, 0xAEA1, 0xAEFE, 0x1C32, 0x8EA2, 0xAFA1, + 0xAFFE, 0x1C90, 0x8EA2, 0xB0A1, 0xB0FE, 0x1CEE, 0x8EA2, 0xB1A1, 0xB1FE, + 0x1D4C, 0x8EA2, 0xB2A1, 0xB2FE, 0x1DAA, 0x8EA2, 0xB3A1, 0xB3FE, 0x1E08, + 0x8EA2, 0xB4A1, 0xB4FE, 0x1E66, 0x8EA2, 0xB5A1, 0xB5FE, 0x1EC4, 0x8EA2, + 0xB6A1, 0xB6FE, 0x1F22, 0x8EA2, 0xB7A1, 0xB7FE, 0x1F80, 0x8EA2, 0xB8A1, + 0xB8FE, 0x1FDE, 0x8EA2, 0xB9A1, 0xB9FE, 0x203C, 0x8EA2, 0xBAA1, 0xBAFE, + 0x209A, 0x8EA2, 0xBBA1, 0xBBFE, 0x20F8, 0x8EA2, 0xBCA1, 0xBCFE, 0x2156, + 0x8EA2, 0xBDA1, 0xBDFE, 0x21B4, 0x8EA2, 0xBEA1, 0xBEFE, 0x2212, 0x8EA2, + 0xBFA1, 0xBFFE, 0x2270, 0x8EA2, 0xC0A1, 0xC0FE, 0x22CE, 0x8EA2, 0xC1A1, + 0xC1FE, 0x232C, 0x8EA2, 0xC2A1, 0xC2FE, 0x238A, 0x8EA2, 0xC3A1, 0xC3FE, + 0x23E8, 0x8EA2, 0xC4A1, 0xC4FE, 0x2446, 0x8EA2, 0xC5A1, 0xC5FE, 0x24A4, + 0x8EA2, 0xC6A1, 0xC6FE, 0x2502, 0x8EA2, 0xC7A1, 0xC7FE, 0x2560, 0x8EA2, + 0xC8A1, 0xC8FE, 0x25BE, 0x8EA2, 0xC9A1, 0xC9FE, 0x261C, 0x8EA2, 0xCAA1, + 0xCAFE, 0x267A, 0x8EA2, 0xCBA1, 0xCBFE, 0x26D8, 0x8EA2, 0xCCA1, 0xCCFE, + 0x2736, 0x8EA2, 0xCDA1, 0xCDFE, 0x2794, 0x8EA2, 0xCEA1, 0xCEFE, 0x27F2, + 0x8EA2, 0xCFA1, 0xCFFE, 0x2850, 0x8EA2, 0xD0A1, 0xD0FE, 0x28AE, 0x8EA2, + 0xD1A1, 0xD1FE, 0x290C, 0x8EA2, 0xD2A1, 0xD2FE, 0x296A, 0x8EA2, 0xD3A1, + 0xD3FE, 0x29C8, 0x8EA2, 0xD4A1, 0xD4FE, 0x2A26, 0x8EA2, 0xD5A1, 0xD5FE, + 0x2A84, 0x8EA2, 0xD6A1, 0xD6FE, 0x2AE2, 0x8EA2, 0xD7A1, 0xD7FE, 0x2B40, + 0x8EA2, 0xD8A1, 0xD8FE, 0x2B9E, 0x8EA2, 0xD9A1, 0xD9FE, 0x2BFC, 0x8EA2, + 0xDAA1, 0xDAFE, 0x2C5A, 0x8EA2, 0xDBA1, 0xDBFE, 0x2CB8, 0x8EA2, 0xDCA1, + 0xDCFE, 0x2D16, 0x8EA2, 0xDDA1, 0xDDFE, 0x2D74, 0x8EA2, 0xDEA1, 0xDEFE, + 0x2DD2, 0x8EA2, 0xDFA1, 0xDFFE, 0x2E30, 0x8EA2, 0xE0A1, 0xE0FE, 0x2E8E, + 0x8EA2, 0xE1A1, 0xE1FE, 0x2EEC, 0x8EA2, 0xE2A1, 0xE2FE, 0x2F4A, 0x8EA2, + 0xE3A1, 0xE3FE, 0x2FA8, 0x8EA2, 0xE4A1, 0xE4FE, 0x3006, 0x8EA2, 0xE5A1, + 0xE5FE, 0x3064, 0x8EA2, 0xE6A1, 0xE6FE, 0x30C2, 0x8EA2, 0xE7A1, 0xE7FE, + 0x3120, 0x8EA2, 0xE8A1, 0xE8FE, 0x317E, 0x8EA2, 0xE9A1, 0xE9FE, 0x31DC, + 0x8EA2, 0xEAA1, 0xEAFE, 0x323A, 0x8EA2, 0xEBA1, 0xEBFE, 0x3298, 0x8EA2, + 0xECA1, 0xECFE, 0x32F6, 0x8EA2, 0xEDA1, 0xEDFE, 0x3354, 0x8EA2, 0xEEA1, + 0xEEFE, 0x33B2, 0x8EA2, 0xEFA1, 0xEFFE, 0x3410, 0x8EA2, 0xF0A1, 0xF0FE, + 0x346E, 0x8EA2, 0xF1A1, 0xF1FE, 0x34CC, 0x8EA2, 0xF2A1, 0xF2C4, 0x352A, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETen-B5-H_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETen-B5-H_0.cpp new file mode 100644 index 000000000000..3138ae99f4b6 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETen-B5-H_0.cpp @@ -0,0 +1,95 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_ETen_B5_H_0[254 * 3] = { + 0x0020, 0x007E, 0x3550, 0xA140, 0xA158, 0x0063, 0xA159, 0xA15C, 0x35AF, + 0xA15D, 0xA17E, 0x0080, 0xA1A1, 0xA1F5, 0x00A2, 0xA1F6, 0xA1F6, 0x00F8, + 0xA1F7, 0xA1F7, 0x00F7, 0xA1F8, 0xA1FE, 0x00F9, 0xA240, 0xA27E, 0x0100, + 0xA2A1, 0xA2FE, 0x013F, 0xA340, 0xA37E, 0x019D, 0xA3A1, 0xA3BB, 0x01DC, + 0xA3BD, 0xA3BF, 0x01F7, 0xA440, 0xA47E, 0x0253, 0xA4A1, 0xA4FE, 0x0292, + 0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F, 0xA640, 0xA67E, 0x038D, + 0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A, 0xA7A1, 0xA7FE, 0x0469, + 0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506, 0xA940, 0xA97E, 0x0564, + 0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601, 0xAAA1, 0xAAFE, 0x0640, + 0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD, 0xAC40, 0xAC7E, 0x073B, + 0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F, 0xAD40, 0xAD7E, 0x07D7, + 0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874, 0xAEA1, 0xAEFE, 0x08B3, + 0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950, 0xAFD0, 0xAFFE, 0x0980, + 0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE, 0xB140, 0xB17E, 0x0A4C, + 0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9, 0xB2A1, 0xB2FE, 0x0B28, + 0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5, 0xB440, 0xB47E, 0x0C23, + 0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0, 0xB5A1, 0xB5FE, 0x0CFF, + 0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C, 0xB740, 0xB77E, 0x0DFA, + 0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97, 0xB8A1, 0xB8FE, 0x0ED6, + 0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73, 0xBA40, 0xBA7E, 0x0FD1, + 0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E, 0xBBA1, 0xBBC7, 0x10AD, + 0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C, 0xBCA1, 0xBCFE, 0x114B, + 0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8, 0xBE40, 0xBE51, 0x1246, + 0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258, 0xBEA1, 0xBEFE, 0x1284, + 0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321, 0xC040, 0xC07E, 0x137F, + 0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C, 0xC1A1, 0xC1AA, 0x145B, + 0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA, 0xC2A1, 0xC2CA, 0x14F9, + 0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523, 0xC340, 0xC360, 0x1556, + 0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596, 0xC3B9, 0xC3B9, 0x15AF, + 0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0, 0xC440, 0xC455, 0x15F4, + 0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A, 0xC4A1, 0xC4FE, 0x1632, + 0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF, 0xC640, 0xC67E, 0x172D, + 0xC6A1, 0xC6BE, 0x01FA, 0xC6BF, 0xC6D7, 0x0219, 0xC6D8, 0xC6DE, 0x35B3, + 0xC6DF, 0xC6DF, 0x1794, 0xC6E0, 0xC6FE, 0x35BA, 0xC740, 0xC77E, 0x35D9, + 0xC7A1, 0xC7FE, 0x3618, 0xC840, 0xC87E, 0x3676, 0xC8A1, 0xC8D3, 0x36B5, + 0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776, + 0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797, + 0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809, + 0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E, + 0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942, + 0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E, + 0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19, + 0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5, + 0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0, + 0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC, + 0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7, + 0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3, + 0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001, + 0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F, + 0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A, + 0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216, + 0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274, + 0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312, + 0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE, + 0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B, + 0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527, + 0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622, + 0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE, + 0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9, + 0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5, + 0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0, + 0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC, + 0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42, + 0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8, + 0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86, + 0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3, + 0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F, + 0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8, + 0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014, + 0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8, + 0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C, + 0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE, + 0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160, + 0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E, + 0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC, + 0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161, + 0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0, + 0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D, + 0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6, + 0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327, + 0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF, + 0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA, + 0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511, + 0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E, + 0xF9D2, 0xF9D5, 0x354A, 0xF9D6, 0xF9FE, 0x36E8, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETen-B5-V_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETen-B5-V_0.cpp new file mode 100644 index 000000000000..622f2ff255c6 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETen-B5-V_0.cpp @@ -0,0 +1,15 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_ETen_B5_V_0[13 * 3] = { + 0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, + 0x35B1, 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, + 0xA166, 0x008A, 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, + 0xA171, 0xA172, 0x0096, 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, + 0x009E, 0xA1E3, 0xA1E3, 0x354F, 0xC6E4, 0xC6E5, 0x3711, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETenms-B5-H_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETenms-B5-H_0.cpp new file mode 100644 index 000000000000..e02f9ed800f5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETenms-B5-H_0.cpp @@ -0,0 +1,11 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_ETenms_B5_H_0[1 * 3] = { + 0x0020, 0x007E, 0x0001, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETenms-B5-V_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETenms-B5-V_0.cpp new file mode 100644 index 000000000000..de922490caa2 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/ETenms-B5-V_0.cpp @@ -0,0 +1,16 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_ETenms_B5_V_0[18 * 3] = { + 0xA14B, 0xA14B, 0x354E, 0xA14C, 0xA14C, 0x006D, 0xA156, 0xA156, 0x0138, + 0xA158, 0xA158, 0x007A, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1, + 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A, + 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096, + 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA17D, 0xA17E, 0x0082, + 0xA1A1, 0xA1A2, 0x0086, 0xA1A3, 0xA1A4, 0x008A, 0xC6E4, 0xC6E5, 0x3711, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/HKscs-B5-H_5.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/HKscs-B5-H_5.cpp new file mode 100644 index 000000000000..47f7d6ac84f3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/HKscs-B5-H_5.cpp @@ -0,0 +1,414 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_HKscs_B5_H_5[1210 * 3] = { + 0x0020, 0x007E, 0x0001, 0x8740, 0x8765, 0x4A15, 0x8767, 0x8779, 0x4A3B, + 0x8840, 0x8855, 0x44C9, 0x8856, 0x887E, 0x4961, 0x88A1, 0x88A8, 0x498A, + 0x88A9, 0x88AA, 0x499C, 0x8940, 0x8941, 0x4534, 0x8943, 0x8943, 0x4536, + 0x8946, 0x8949, 0x4537, 0x894C, 0x894C, 0x453B, 0x894D, 0x894D, 0x43C3, + 0x894E, 0x8950, 0x453C, 0x8951, 0x8951, 0x439A, 0x8952, 0x897E, 0x453F, + 0x89A1, 0x89A5, 0x456C, 0x89A6, 0x89A6, 0x43A2, 0x89AB, 0x89AB, 0x43EC, + 0x89AC, 0x89AC, 0x4571, 0x89AD, 0x89AD, 0x43EB, 0x89AE, 0x89AE, 0x4572, + 0x89B0, 0x89B2, 0x4573, 0x89B5, 0x89BF, 0x4576, 0x89C1, 0x89C3, 0x4581, + 0x89C5, 0x89CE, 0x4584, 0x89CF, 0x89CF, 0x43BC, 0x89D0, 0x89D8, 0x458E, + 0x89D9, 0x89D9, 0x439C, 0x89DA, 0x89DA, 0x4597, 0x89DB, 0x89DB, 0x439E, + 0x89DC, 0x89DC, 0x4598, 0x89DD, 0x89DD, 0x439F, 0x89DE, 0x89E0, 0x4599, + 0x89E1, 0x89E1, 0x43A1, 0x89E2, 0x89E2, 0x459C, 0x89E3, 0x89E3, 0x43A3, + 0x89E4, 0x89E9, 0x459D, 0x89EA, 0x89EB, 0x43A5, 0x89EC, 0x89F9, 0x45A3, + 0x89FA, 0x89FA, 0x43A9, 0x89FB, 0x89FE, 0x45B1, 0x8A40, 0x8A40, 0x45B5, + 0x8A41, 0x8A41, 0x4309, 0x8A43, 0x8A4C, 0x430B, 0x8A4D, 0x8A4D, 0x45B6, + 0x8A4E, 0x8A59, 0x4316, 0x8A5A, 0x8A5A, 0x45B7, 0x8A5B, 0x8A5D, 0x4323, + 0x8A5E, 0x8A5E, 0x45B8, 0x8A5F, 0x8A62, 0x4327, 0x8A64, 0x8A70, 0x432C, + 0x8A71, 0x8A71, 0x45B9, 0x8A72, 0x8A74, 0x433A, 0x8A76, 0x8A76, 0x433E, + 0x8A77, 0x8A77, 0x45BA, 0x8A78, 0x8A79, 0x4340, 0x8A7A, 0x8A7A, 0x45BB, + 0x8A7B, 0x8A7B, 0x4343, 0x8A7C, 0x8A7C, 0x45BC, 0x8A7D, 0x8A7D, 0x4345, + 0x8A7E, 0x8A7E, 0x45BD, 0x8AA1, 0x8AA7, 0x4347, 0x8AA8, 0x8AA8, 0x45BE, + 0x8AA9, 0x8AAA, 0x434F, 0x8AAC, 0x8AB0, 0x4352, 0x8AB2, 0x8AB5, 0x4358, + 0x8AB6, 0x8AB6, 0x45BF, 0x8AB7, 0x8AB7, 0x435D, 0x8AB8, 0x8AB8, 0x45C0, + 0x8AB9, 0x8AB9, 0x435F, 0x8ABB, 0x8AC7, 0x4361, 0x8AC9, 0x8ACB, 0x436F, + 0x8ACC, 0x8ACC, 0x45C1, 0x8ACE, 0x8AD5, 0x4374, 0x8AD6, 0x8AD7, 0x45C2, + 0x8AD8, 0x8ADC, 0x437E, 0x8ADF, 0x8AE5, 0x4385, 0x8AE6, 0x8AE6, 0x45C4, + 0x8AE7, 0x8AE7, 0x43DB, 0x8AE8, 0x8AF4, 0x45C5, 0x8AF6, 0x8AFE, 0x45D2, + 0x8B40, 0x8B40, 0x45DB, 0x8B41, 0x8B42, 0x438C, 0x8B43, 0x8B44, 0x45DC, + 0x8B45, 0x8B45, 0x438E, 0x8B46, 0x8B46, 0x45DE, 0x8B47, 0x8B47, 0x438F, + 0x8B48, 0x8B48, 0x45DF, 0x8B49, 0x8B49, 0x4390, 0x8B4A, 0x8B4A, 0x45E0, + 0x8B4B, 0x8B4B, 0x4391, 0x8B4C, 0x8B4C, 0x45E1, 0x8B4D, 0x8B50, 0x4392, + 0x8B51, 0x8B53, 0x45E2, 0x8B55, 0x8B57, 0x45E5, 0x8B58, 0x8B58, 0x4397, + 0x8B59, 0x8B59, 0x45E8, 0x8B5A, 0x8B5A, 0x4398, 0x8B5B, 0x8B5B, 0x43C4, + 0x8B5C, 0x8B60, 0x45E9, 0x8B61, 0x8B61, 0x43A7, 0x8B62, 0x8B67, 0x45EE, + 0x8B68, 0x8B68, 0x43AC, 0x8B69, 0x8B7E, 0x45F4, 0x8BA1, 0x8BBF, 0x460A, + 0x8BC0, 0x8BDC, 0x44DF, 0x8BDE, 0x8BFD, 0x44FC, 0x8C40, 0x8C61, 0x49A1, + 0x8C62, 0x8C62, 0x4A4E, 0x8C63, 0x8C7E, 0x49C3, 0x8CA1, 0x8CA5, 0x49DF, + 0x8CA7, 0x8CC5, 0x49E4, 0x8CC9, 0x8CCC, 0x4A03, 0x8CCE, 0x8CDA, 0x4A07, + 0x8CDB, 0x8CDB, 0x4A4F, 0x8CDC, 0x8CDC, 0x4A14, 0x8CDD, 0x8CE4, 0x4A50, + 0x8CE6, 0x8CFE, 0x4A58, 0x8D40, 0x8D40, 0x4A71, 0x8D42, 0x8D5F, 0x4A72, + 0x8D60, 0x8D61, 0x4629, 0x8D62, 0x8D62, 0x43BA, 0x8D63, 0x8D67, 0x462B, + 0x8D68, 0x8D68, 0x43BB, 0x8D69, 0x8D69, 0x43A0, 0x8D6A, 0x8D6A, 0x43BD, + 0x8D6B, 0x8D6D, 0x4630, 0x8D6E, 0x8D6E, 0x43BE, 0x8D6F, 0x8D75, 0x4633, + 0x8D76, 0x8D76, 0x43BF, 0x8D77, 0x8D79, 0x463A, 0x8D7A, 0x8D7A, 0x43C0, + 0x8D7B, 0x8D7B, 0x463D, 0x8D7C, 0x8D7C, 0x43C1, 0x8D7D, 0x8D7E, 0x463E, + 0x8DA1, 0x8DA4, 0x4640, 0x8DA5, 0x8DA5, 0x43C2, 0x8DA6, 0x8DA7, 0x4644, + 0x8DA8, 0x8DA8, 0x43B9, 0x8DA9, 0x8DA9, 0x43AD, 0x8DAA, 0x8DB5, 0x4646, + 0x8DB6, 0x8DB6, 0x43C7, 0x8DB7, 0x8DC2, 0x4652, 0x8DC3, 0x8DC3, 0x43C8, + 0x8DC4, 0x8DF9, 0x465E, 0x8DFA, 0x8DFA, 0x43F9, 0x8DFB, 0x8DFE, 0x4694, + 0x8E40, 0x8E44, 0x372B, 0x8E45, 0x8E45, 0x4698, 0x8E46, 0x8E68, 0x3730, + 0x8E69, 0x8E69, 0x1055, 0x8E6A, 0x8E6A, 0x3754, 0x8E6B, 0x8E6C, 0x4699, + 0x8E6D, 0x8E6E, 0x3756, 0x8E6F, 0x8E6F, 0x2DE8, 0x8E70, 0x8E75, 0x3759, + 0x8E76, 0x8E76, 0x469B, 0x8E77, 0x8E7A, 0x375F, 0x8E7B, 0x8E7B, 0x469C, + 0x8E7C, 0x8E7D, 0x3764, 0x8E7E, 0x8E7E, 0x0121, 0x8EA1, 0x8EA5, 0x3766, + 0x8EA6, 0x8EA6, 0x469D, 0x8EA7, 0x8EAA, 0x376B, 0x8EAB, 0x8EAB, 0x106B, + 0x8EAC, 0x8EB3, 0x3770, 0x8EB4, 0x8EB4, 0x1326, 0x8EB5, 0x8EB7, 0x3779, + 0x8EB8, 0x8EB8, 0x469E, 0x8EB9, 0x8EC8, 0x377D, 0x8EC9, 0x8EC9, 0x469F, + 0x8ECA, 0x8ECC, 0x378D, 0x8ECD, 0x8ECD, 0x066B, 0x8ECE, 0x8ECF, 0x3791, + 0x8ED0, 0x8ED0, 0x132E, 0x8ED1, 0x8EE4, 0x3794, 0x8EE5, 0x8EE5, 0x46A0, + 0x8EE6, 0x8EEE, 0x37A8, 0x8EEF, 0x8EEF, 0x46A1, 0x8EF0, 0x8EF5, 0x37B1, + 0x8EF6, 0x8EF6, 0x46A2, 0x8EF7, 0x8EFE, 0x37B8, 0x8F40, 0x8F56, 0x37C0, + 0x8F57, 0x8F57, 0x0D35, 0x8F58, 0x8F58, 0x37D8, 0x8F59, 0x8F59, 0x46A3, + 0x8F5A, 0x8F5E, 0x37D9, 0x8F5F, 0x8F5F, 0x46A4, 0x8F60, 0x8F66, 0x37DE, + 0x8F67, 0x8F67, 0x46A5, 0x8F68, 0x8F68, 0x37E5, 0x8F69, 0x8F69, 0x27C2, + 0x8F6A, 0x8F6D, 0x37E7, 0x8F6E, 0x8F6E, 0x22AD, 0x8F6F, 0x8F78, 0x37EC, + 0x8F79, 0x8F79, 0x46A6, 0x8F7A, 0x8F7E, 0x37F7, 0x8FA1, 0x8FAF, 0x37FC, + 0x8FB0, 0x8FB0, 0x46A7, 0x8FB1, 0x8FC4, 0x380C, 0x8FC5, 0x8FC5, 0x46A8, + 0x8FC6, 0x8FC6, 0x3820, 0x8FC7, 0x8FC7, 0x46A9, 0x8FC8, 0x8FC9, 0x3821, + 0x8FCA, 0x8FCA, 0x46AA, 0x8FCB, 0x8FCB, 0x134C, 0x8FCC, 0x8FCC, 0x3FF9, + 0x8FCD, 0x8FD9, 0x3826, 0x8FDA, 0x8FDA, 0x46AB, 0x8FDB, 0x8FE2, 0x3833, + 0x8FE3, 0x8FE3, 0x46AC, 0x8FE4, 0x8FFB, 0x383C, 0x8FFC, 0x8FFC, 0x46AD, + 0x8FFD, 0x8FFD, 0x3854, 0x8FFE, 0x8FFE, 0x09CE, 0x9040, 0x9054, 0x3856, + 0x9055, 0x9055, 0x46AE, 0x9056, 0x905B, 0x386C, 0x905C, 0x905E, 0x46AF, + 0x905F, 0x906C, 0x3873, 0x906D, 0x906D, 0x0BC7, 0x906E, 0x906E, 0x3882, + 0x906F, 0x906F, 0x46B2, 0x9070, 0x9079, 0x3883, 0x907A, 0x907A, 0x36E9, + 0x907B, 0x907E, 0x388D, 0x90A1, 0x90A5, 0x3891, 0x90A6, 0x90A6, 0x46B3, + 0x90A7, 0x90B7, 0x3896, 0x90B8, 0x90B8, 0x46B4, 0x90B9, 0x90DB, 0x38A7, + 0x90DC, 0x90DC, 0x1391, 0x90DD, 0x90F0, 0x38CB, 0x90F1, 0x90F1, 0x16A4, + 0x90F2, 0x90FE, 0x38E0, 0x9140, 0x9164, 0x38ED, 0x9165, 0x9165, 0x46B5, + 0x9166, 0x916D, 0x3912, 0x916E, 0x916E, 0x46B6, 0x916F, 0x917D, 0x391A, + 0x917E, 0x917E, 0x46B7, 0x91A1, 0x91A1, 0x3929, 0x91A2, 0x91A2, 0x46B8, + 0x91A3, 0x91BE, 0x392A, 0x91BF, 0x91BF, 0x3072, 0x91C0, 0x91C7, 0x3947, + 0x91C8, 0x91C8, 0x46B9, 0x91C9, 0x91FE, 0x3950, 0x9240, 0x9243, 0x3986, + 0x9244, 0x9244, 0x3988, 0x9245, 0x9263, 0x398B, 0x9264, 0x9264, 0x46BA, + 0x9265, 0x926C, 0x39AB, 0x926D, 0x926D, 0x46BB, 0x926E, 0x927E, 0x39B4, + 0x92A1, 0x92AE, 0x39C5, 0x92AF, 0x92B0, 0x0119, 0x92B1, 0x92B1, 0x011C, + 0x92B2, 0x92B2, 0x011B, 0x92B3, 0x92C7, 0x39D3, 0x92C8, 0x92C8, 0x3FAC, + 0x92C9, 0x92D0, 0x39E9, 0x92D1, 0x92D1, 0x297C, 0x92D2, 0x92E4, 0x39F2, + 0x92E5, 0x92E5, 0x46BC, 0x92E6, 0x92F1, 0x3A05, 0x92F2, 0x92F2, 0x46BD, + 0x92F3, 0x92FE, 0x3A11, 0x9340, 0x9367, 0x3A1D, 0x9368, 0x9368, 0x46BE, + 0x9369, 0x937E, 0x3A45, 0x93A1, 0x93A9, 0x3A5B, 0x93AA, 0x93AA, 0x46BF, + 0x93AB, 0x93C1, 0x3A64, 0x93C2, 0x93C2, 0x46C0, 0x93C3, 0x93E4, 0x3A7B, + 0x93E5, 0x93E5, 0x46C1, 0x93E6, 0x93E7, 0x3A9D, 0x93E8, 0x93E8, 0x46C2, + 0x93E9, 0x93EA, 0x3AA0, 0x93EB, 0x93EB, 0x46C3, 0x93EC, 0x93FE, 0x3AA2, + 0x9440, 0x9445, 0x3AB5, 0x9446, 0x9446, 0x46C4, 0x9447, 0x9447, 0x1D06, + 0x9448, 0x9478, 0x3ABC, 0x9479, 0x9479, 0x46C5, 0x947A, 0x947E, 0x3AEE, + 0x94A1, 0x94C9, 0x3AF3, 0x94CA, 0x94CA, 0x29A1, 0x94CB, 0x94CB, 0x46C6, + 0x94CC, 0x94FE, 0x3B1E, 0x9540, 0x954C, 0x3B51, 0x954D, 0x954D, 0x46C7, + 0x954E, 0x9559, 0x3B5E, 0x955A, 0x955A, 0x46C8, 0x955B, 0x955E, 0x3B6A, + 0x955F, 0x955F, 0x46C9, 0x9560, 0x957E, 0x3B6F, 0x95A1, 0x95C5, 0x3B8E, + 0x95C6, 0x95C6, 0x46CA, 0x95C7, 0x95D8, 0x3BB3, 0x95D9, 0x95D9, 0x181B, + 0x95DA, 0x95FE, 0x3BC6, 0x9640, 0x9643, 0x3BEB, 0x9644, 0x9644, 0x3E2F, + 0x9645, 0x9650, 0x3BF0, 0x9651, 0x9651, 0x46CB, 0x9652, 0x9669, 0x3BFD, + 0x966A, 0x966A, 0x46CC, 0x966B, 0x967E, 0x3C16, 0x96A1, 0x96D3, 0x3C2A, + 0x96D4, 0x96D4, 0x46CD, 0x96D5, 0x96EC, 0x3C5D, 0x96ED, 0x96ED, 0x3C76, + 0x96EE, 0x96FB, 0x3C76, 0x96FC, 0x96FC, 0x2B24, 0x96FD, 0x96FE, 0x3C85, + 0x9740, 0x977E, 0x3C87, 0x97A1, 0x97FE, 0x3CC6, 0x9840, 0x9843, 0x3D24, + 0x9844, 0x9845, 0x46CE, 0x9846, 0x986E, 0x3D2A, 0x986F, 0x986F, 0x46D0, + 0x9870, 0x9874, 0x3D54, 0x9875, 0x9876, 0x46D1, 0x9877, 0x9877, 0x3D59, + 0x9878, 0x9879, 0x46D3, 0x987A, 0x987A, 0x3D5A, 0x987B, 0x987E, 0x46D5, + 0x98A1, 0x98A2, 0x46D9, 0x98A3, 0x98A3, 0x3D5B, 0x98A4, 0x98AE, 0x46DB, + 0x98AF, 0x98AF, 0x3D5C, 0x98B0, 0x98B3, 0x46E6, 0x98B4, 0x98B4, 0x43CA, + 0x98B5, 0x98B5, 0x46EA, 0x98B6, 0x98B6, 0x3D5D, 0x98B7, 0x98B7, 0x46EB, + 0x98B8, 0x98B8, 0x43CC, 0x98B9, 0x98B9, 0x3D5E, 0x98BA, 0x98BA, 0x46EC, + 0x98BB, 0x98BB, 0x43FA, 0x98BC, 0x98BC, 0x46ED, 0x98BD, 0x98BE, 0x3D5F, + 0x98BF, 0x98C1, 0x46EE, 0x98C2, 0x98C2, 0x3D61, 0x98C3, 0x98C3, 0x46F1, + 0x98C4, 0x98C4, 0x3D62, 0x98C5, 0x98C5, 0x46F2, 0x98C6, 0x98C7, 0x3D63, + 0x98C8, 0x98D1, 0x46F3, 0x98D2, 0x98D2, 0x43CD, 0x98D3, 0x98D7, 0x46FD, + 0x98D8, 0x98D9, 0x43CE, 0x98DA, 0x98DA, 0x4702, 0x98DB, 0x98DB, 0x43D1, + 0x98DC, 0x98DE, 0x4703, 0x98DF, 0x98DF, 0x43D4, 0x98E0, 0x98E2, 0x4706, + 0x98E3, 0x98E3, 0x3D65, 0x98E4, 0x98E6, 0x4709, 0x98E7, 0x98E7, 0x3D66, + 0x98E8, 0x98EC, 0x470C, 0x98ED, 0x98ED, 0x3D67, 0x98EE, 0x98EF, 0x4711, + 0x98F0, 0x98F0, 0x3D68, 0x98F1, 0x98F1, 0x4713, 0x98F2, 0x98F2, 0x3D69, + 0x98F3, 0x98F3, 0x4714, 0x98F4, 0x98F5, 0x43D5, 0x98F6, 0x98FB, 0x4715, + 0x98FC, 0x98FC, 0x3D6A, 0x98FD, 0x98FD, 0x471B, 0x98FE, 0x98FE, 0x43D7, + 0x9940, 0x9941, 0x471C, 0x9942, 0x9942, 0x43FC, 0x9943, 0x9943, 0x3D6B, + 0x9944, 0x9944, 0x471E, 0x9945, 0x9945, 0x3D6C, 0x9946, 0x9946, 0x471F, + 0x9947, 0x9947, 0x43D8, 0x9948, 0x994E, 0x4720, 0x994F, 0x994F, 0x3D6D, + 0x9950, 0x9953, 0x4727, 0x9954, 0x9954, 0x43D9, 0x9955, 0x995B, 0x472B, + 0x995C, 0x995C, 0x43DA, 0x995D, 0x9963, 0x4732, 0x9964, 0x9964, 0x43DC, + 0x9965, 0x9969, 0x4739, 0x996A, 0x996A, 0x3D6E, 0x996B, 0x996D, 0x473E, + 0x996E, 0x996E, 0x3D6F, 0x996F, 0x9974, 0x4741, 0x9975, 0x9975, 0x3D70, + 0x9976, 0x9977, 0x4747, 0x9978, 0x9978, 0x3D71, 0x9979, 0x997E, 0x4749, + 0x99A1, 0x99A1, 0x474F, 0x99A2, 0x99A2, 0x3D72, 0x99A3, 0x99A3, 0x4750, + 0x99A4, 0x99A4, 0x43C5, 0x99A5, 0x99A5, 0x4751, 0x99A6, 0x99A6, 0x43C6, + 0x99A7, 0x99AD, 0x4752, 0x99AE, 0x99AE, 0x3D73, 0x99AF, 0x99B1, 0x4759, + 0x99B2, 0x99B2, 0x43DE, 0x99B3, 0x99B5, 0x475C, 0x99B6, 0x99B6, 0x3D74, + 0x99B7, 0x99B9, 0x475F, 0x99BA, 0x99BA, 0x3D75, 0x99BB, 0x99C9, 0x4762, + 0x99CA, 0x99CA, 0x43E0, 0x99CB, 0x99CC, 0x4771, 0x99CD, 0x99CD, 0x43E2, + 0x99CE, 0x99D2, 0x4773, 0x99D3, 0x99D3, 0x43E3, 0x99D4, 0x99D5, 0x4778, + 0x99D6, 0x99D6, 0x43E5, 0x99D7, 0x99DE, 0x477A, 0x99DF, 0x99DF, 0x43DF, + 0x99E0, 0x99E1, 0x4782, 0x99E2, 0x99E2, 0x3D76, 0x99E3, 0x99E3, 0x4784, + 0x99E4, 0x99E4, 0x43AB, 0x99E5, 0x99E5, 0x4785, 0x99E6, 0x99E6, 0x43E7, + 0x99E7, 0x99E7, 0x4786, 0x99E8, 0x99E8, 0x43E9, 0x99E9, 0x99EE, 0x4787, + 0x99EF, 0x99EF, 0x43FD, 0x99F0, 0x99F3, 0x478D, 0x99F4, 0x99F4, 0x3D77, + 0x99F5, 0x99FE, 0x4791, 0x9A40, 0x9A49, 0x479B, 0x9A4A, 0x9A4A, 0x3D78, + 0x9A4B, 0x9A4B, 0x47A5, 0x9A4C, 0x9A4C, 0x3D79, 0x9A4D, 0x9A58, 0x47A6, + 0x9A59, 0x9A59, 0x3D7A, 0x9A5A, 0x9A5E, 0x47B2, 0x9A5F, 0x9A5F, 0x43AF, + 0x9A60, 0x9A60, 0x47B7, 0x9A61, 0x9A61, 0x3D7B, 0x9A62, 0x9A65, 0x47B8, + 0x9A66, 0x9A66, 0x43ED, 0x9A67, 0x9A67, 0x47BC, 0x9A68, 0x9A68, 0x3D7C, + 0x9A69, 0x9A69, 0x43EE, 0x9A6A, 0x9A6A, 0x47BD, 0x9A6B, 0x9A6B, 0x43FF, + 0x9A6C, 0x9A72, 0x47BE, 0x9A73, 0x9A73, 0x3D7D, 0x9A74, 0x9A74, 0x47C5, + 0x9A75, 0x9A75, 0x43F1, 0x9A76, 0x9A7D, 0x47C6, 0x9A7E, 0x9A7E, 0x3D7E, + 0x9AA1, 0x9AA2, 0x47CE, 0x9AA3, 0x9AA3, 0x43F3, 0x9AA4, 0x9AA4, 0x47D0, + 0x9AA5, 0x9AA5, 0x43F2, 0x9AA6, 0x9AA8, 0x47D1, 0x9AA9, 0x9AA9, 0x43F8, + 0x9AAA, 0x9AAA, 0x43F4, 0x9AAB, 0x9AB1, 0x47D4, 0x9AB2, 0x9AB2, 0x3D7F, + 0x9AB3, 0x9AB6, 0x47DB, 0x9AB7, 0x9AB7, 0x3D80, 0x9AB8, 0x9AB8, 0x47DF, + 0x9AB9, 0x9AB9, 0x3D81, 0x9ABA, 0x9ABA, 0x47E0, 0x9ABB, 0x9ABB, 0x3D82, + 0x9ABC, 0x9ABC, 0x47E1, 0x9ABD, 0x9ABD, 0x43B7, 0x9ABE, 0x9AC6, 0x47E2, + 0x9AC7, 0x9AC7, 0x3D83, 0x9AC8, 0x9ACF, 0x47EB, 0x9AD0, 0x9AD0, 0x3D84, + 0x9AD1, 0x9AD1, 0x47F3, 0x9AD2, 0x9AD2, 0x3D85, 0x9AD3, 0x9AD8, 0x47F4, + 0x9AD9, 0x9ADB, 0x3D86, 0x9ADC, 0x9AE1, 0x47FA, 0x9AE2, 0x9AE2, 0x3D89, + 0x9AE3, 0x9AE3, 0x4800, 0x9AE4, 0x9AE4, 0x3D8A, 0x9AE5, 0x9AE7, 0x4801, + 0x9AE8, 0x9AE8, 0x3D8B, 0x9AE9, 0x9AE9, 0x43B0, 0x9AEA, 0x9AED, 0x4804, + 0x9AEE, 0x9AEE, 0x43B2, 0x9AEF, 0x9AF1, 0x4808, 0x9AF2, 0x9AF2, 0x3D8C, + 0x9AF3, 0x9AF5, 0x480B, 0x9AF6, 0x9AF6, 0x3D8D, 0x9AF7, 0x9AFA, 0x480E, + 0x9AFB, 0x9AFB, 0x3D8E, 0x9AFC, 0x9AFE, 0x4812, 0x9B40, 0x9B45, 0x4815, + 0x9B46, 0x9B46, 0x3D8F, 0x9B47, 0x9B49, 0x481B, 0x9B4A, 0x9B4A, 0x3D90, + 0x9B4B, 0x9B53, 0x481E, 0x9B54, 0x9B54, 0x3D92, 0x9B55, 0x9B57, 0x4827, + 0x9B58, 0x9B58, 0x3D93, 0x9B59, 0x9B59, 0x482A, 0x9B5A, 0x9B5A, 0x3D94, + 0x9B5B, 0x9B5B, 0x482B, 0x9B5C, 0x9B5C, 0x3D95, 0x9B5D, 0x9B5D, 0x482C, + 0x9B5E, 0x9B5F, 0x3D96, 0x9B60, 0x9B60, 0x482D, 0x9B62, 0x9B6F, 0x482E, + 0x9B70, 0x9B73, 0x3D98, 0x9B74, 0x9B75, 0x483C, 0x9B76, 0x9B76, 0x2F50, + 0x9B77, 0x9B77, 0x3D9D, 0x9B78, 0x9B78, 0x1725, 0x9B79, 0x9B7A, 0x483E, + 0x9B7B, 0x9B7B, 0x32ED, 0x9B7C, 0x9B7C, 0x3DA0, 0x9B7D, 0x9B7D, 0x4840, + 0x9B7E, 0x9B7E, 0x3DA1, 0x9BA1, 0x9BA1, 0x3DA2, 0x9BA2, 0x9BA2, 0x4841, + 0x9BA3, 0x9BA4, 0x3DA3, 0x9BA5, 0x9BA6, 0x4842, 0x9BA7, 0x9BAA, 0x3DA5, + 0x9BAB, 0x9BAB, 0x4844, 0x9BAC, 0x9BAC, 0x3DA9, 0x9BAD, 0x9BAE, 0x4845, + 0x9BAF, 0x9BAF, 0x3DAA, 0x9BB0, 0x9BB1, 0x4847, 0x9BB2, 0x9BB9, 0x3DAB, + 0x9BBA, 0x9BBD, 0x4849, 0x9BBE, 0x9BBE, 0x3DB3, 0x9BBF, 0x9BBF, 0x484D, + 0x9BC0, 0x9BC5, 0x3DB4, 0x9BC6, 0x9BC6, 0x2AD9, 0x9BC7, 0x9BC9, 0x484E, + 0x9BCA, 0x9BCA, 0x3DBB, 0x9BCB, 0x9BCB, 0x4851, 0x9BCC, 0x9BCC, 0x3DBC, + 0x9BCD, 0x9BCD, 0x4852, 0x9BCE, 0x9BCE, 0x43D0, 0x9BCF, 0x9BCF, 0x4853, + 0x9BD0, 0x9BD1, 0x3DBD, 0x9BD2, 0x9BD2, 0x4854, 0x9BD3, 0x9BD3, 0x3DBF, + 0x9BD4, 0x9BD4, 0x4855, 0x9BD5, 0x9BD5, 0x3DC0, 0x9BD6, 0x9BD7, 0x4856, + 0x9BD8, 0x9BDA, 0x3DC1, 0x9BDB, 0x9BDC, 0x4858, 0x9BDD, 0x9BDD, 0x3DC4, + 0x9BDE, 0x9BDE, 0x1C14, 0x9BDF, 0x9BDF, 0x3DC5, 0x9BE0, 0x9BE0, 0x485A, + 0x9BE1, 0x9BE1, 0x3DC6, 0x9BE2, 0x9BE2, 0x485B, 0x9BE3, 0x9BE3, 0x3DC7, + 0x9BE4, 0x9BE6, 0x485C, 0x9BE7, 0x9BE7, 0x3DC8, 0x9BE8, 0x9BE8, 0x485F, + 0x9BE9, 0x9BEB, 0x3DC9, 0x9BEC, 0x9BEC, 0x41FA, 0x9BED, 0x9BED, 0x4860, + 0x9BEE, 0x9BEF, 0x3DCD, 0x9BF0, 0x9BF2, 0x4861, 0x9BF3, 0x9BF3, 0x3DCF, + 0x9BF4, 0x9BF5, 0x4864, 0x9BF6, 0x9BF6, 0x12E9, 0x9BF7, 0x9BF7, 0x4866, + 0x9BF8, 0x9BF9, 0x3DD1, 0x9BFA, 0x9BFA, 0x4867, 0x9BFB, 0x9BFC, 0x3DD3, + 0x9BFD, 0x9BFE, 0x4868, 0x9C40, 0x9C41, 0x3DD5, 0x9C42, 0x9C42, 0x2CAE, + 0x9C43, 0x9C43, 0x486A, 0x9C44, 0x9C46, 0x3DD8, 0x9C47, 0x9C47, 0x486B, + 0x9C48, 0x9C48, 0x3DDB, 0x9C49, 0x9C49, 0x486C, 0x9C4A, 0x9C4A, 0x3DDC, + 0x9C4B, 0x9C4C, 0x486D, 0x9C4D, 0x9C52, 0x3DDD, 0x9C53, 0x9C53, 0x1A64, + 0x9C54, 0x9C54, 0x486F, 0x9C55, 0x9C55, 0x3DE4, 0x9C56, 0x9C56, 0x4870, + 0x9C57, 0x9C5B, 0x3DE5, 0x9C5C, 0x9C5C, 0x4871, 0x9C5D, 0x9C5D, 0x3DEA, + 0x9C5E, 0x9C5F, 0x4872, 0x9C60, 0x9C60, 0x3DEB, 0x9C61, 0x9C61, 0x4874, + 0x9C62, 0x9C62, 0x1404, 0x9C63, 0x9C63, 0x4875, 0x9C64, 0x9C66, 0x3DED, + 0x9C67, 0x9C67, 0x4876, 0x9C68, 0x9C68, 0x2324, 0x9C69, 0x9C69, 0x4877, + 0x9C6A, 0x9C6A, 0x3DF1, 0x9C6B, 0x9C6B, 0x346A, 0x9C6C, 0x9C6C, 0x4878, + 0x9C6D, 0x9C6D, 0x3DF2, 0x9C6E, 0x9C6E, 0x4879, 0x9C6F, 0x9C72, 0x3DF3, + 0x9C73, 0x9C74, 0x487A, 0x9C75, 0x9C76, 0x3DF7, 0x9C77, 0x9C77, 0x2291, + 0x9C78, 0x9C78, 0x487C, 0x9C79, 0x9C79, 0x3DFA, 0x9C7A, 0x9C7A, 0x487D, + 0x9C7B, 0x9C7C, 0x3DFB, 0x9C7D, 0x9C7D, 0x487E, 0x9C7E, 0x9C7E, 0x3DFD, + 0x9CA1, 0x9CA2, 0x3DFE, 0x9CA3, 0x9CA4, 0x487F, 0x9CA5, 0x9CA5, 0x3E00, + 0x9CA6, 0x9CA7, 0x4881, 0x9CA8, 0x9CA9, 0x3E01, 0x9CAA, 0x9CAA, 0x4883, + 0x9CAB, 0x9CAB, 0x3E03, 0x9CAC, 0x9CAC, 0x4884, 0x9CAD, 0x9CAE, 0x3E04, + 0x9CAF, 0x9CB0, 0x4885, 0x9CB1, 0x9CBA, 0x3E06, 0x9CBB, 0x9CBB, 0x4887, + 0x9CBC, 0x9CBC, 0x1787, 0x9CBD, 0x9CBD, 0x095F, 0x9CBE, 0x9CC2, 0x3E12, + 0x9CC3, 0x9CC5, 0x4888, 0x9CC6, 0x9CCD, 0x3E17, 0x9CCE, 0x9CCE, 0x488B, + 0x9CCF, 0x9CCF, 0x3E1F, 0x9CD0, 0x9CD0, 0x1E99, 0x9CD1, 0x9CD3, 0x3E21, + 0x9CD4, 0x9CD7, 0x488C, 0x9CD8, 0x9CDA, 0x3E24, 0x9CDB, 0x9CDB, 0x4890, + 0x9CDC, 0x9CE5, 0x3E27, 0x9CE6, 0x9CE6, 0x4891, 0x9CE7, 0x9CE9, 0x3E31, + 0x9CEA, 0x9CEA, 0x4892, 0x9CEB, 0x9CEC, 0x3E34, 0x9CED, 0x9CED, 0x4893, + 0x9CEE, 0x9CF9, 0x3E36, 0x9CFA, 0x9CFC, 0x4894, 0x9CFD, 0x9CFD, 0x3E42, + 0x9CFE, 0x9CFE, 0x4897, 0x9D40, 0x9D40, 0x43E8, 0x9D41, 0x9D45, 0x4898, + 0x9D46, 0x9D46, 0x3E43, 0x9D47, 0x9D48, 0x489D, 0x9D49, 0x9D49, 0x3E44, + 0x9D4A, 0x9D4B, 0x489F, 0x9D4C, 0x9D4D, 0x3E46, 0x9D4E, 0x9D4E, 0x48A1, + 0x9D4F, 0x9D4F, 0x3E48, 0x9D50, 0x9D50, 0x48A2, 0x9D51, 0x9D51, 0x3E49, + 0x9D52, 0x9D54, 0x48A3, 0x9D55, 0x9D55, 0x3E4A, 0x9D56, 0x9D56, 0x48A6, + 0x9D57, 0x9D57, 0x25C1, 0x9D58, 0x9D59, 0x48A7, 0x9D5A, 0x9D5A, 0x0D0C, + 0x9D5B, 0x9D60, 0x48A9, 0x9D61, 0x9D61, 0x43C9, 0x9D62, 0x9D62, 0x3E4C, + 0x9D63, 0x9D63, 0x48AF, 0x9D64, 0x9D64, 0x3E4D, 0x9D65, 0x9D77, 0x48B0, + 0x9D78, 0x9D78, 0x43F5, 0x9D79, 0x9D79, 0x3E4E, 0x9D7A, 0x9D7D, 0x48C3, + 0x9D7E, 0x9D7E, 0x3E4F, 0x9DA1, 0x9DA4, 0x48C7, 0x9DA5, 0x9DA8, 0x3E50, + 0x9DA9, 0x9DA9, 0x48CB, 0x9DAA, 0x9DAA, 0x3E54, 0x9DAB, 0x9DAB, 0x48CC, + 0x9DAC, 0x9DAD, 0x3E55, 0x9DAE, 0x9DAF, 0x48CD, 0x9DB0, 0x9DB0, 0x3E58, + 0x9DB1, 0x9DB2, 0x48CF, 0x9DB3, 0x9DB3, 0x3E59, 0x9DB4, 0x9DB4, 0x48D1, + 0x9DB5, 0x9DB5, 0x3E5A, 0x9DB6, 0x9DB6, 0x48D2, 0x9DB7, 0x9DB7, 0x3E5B, + 0x9DB8, 0x9DBB, 0x48D3, 0x9DBC, 0x9DBD, 0x3E5C, 0x9DBE, 0x9DBE, 0x48D7, + 0x9DBF, 0x9DC0, 0x3E5E, 0x9DC1, 0x9DC2, 0x48D8, 0x9DC3, 0x9DC3, 0x3E60, + 0x9DC4, 0x9DC4, 0x05E6, 0x9DC5, 0x9DC6, 0x48DA, 0x9DC7, 0x9DC8, 0x3E62, + 0x9DC9, 0x9DC9, 0x48DC, 0x9DCA, 0x9DCA, 0x3E64, 0x9DCB, 0x9DCC, 0x48DD, + 0x9DCD, 0x9DD1, 0x3E65, 0x9DD2, 0x9DD2, 0x48DF, 0x9DD3, 0x9DD5, 0x3E6A, + 0x9DD6, 0x9DD9, 0x48E0, 0x9DDA, 0x9DFB, 0x3E6D, 0x9DFC, 0x9DFC, 0x48E4, + 0x9DFD, 0x9DFE, 0x3E8F, 0x9E40, 0x9E42, 0x3E91, 0x9E43, 0x9E43, 0x48E5, + 0x9E44, 0x9E5E, 0x3E95, 0x9E5F, 0x9E5F, 0x48E6, 0x9E60, 0x9E62, 0x3EB1, + 0x9E63, 0x9E63, 0x48E7, 0x9E64, 0x9E65, 0x3EB4, 0x9E66, 0x9E67, 0x48E8, + 0x9E68, 0x9E68, 0x3EB6, 0x9E69, 0x9E69, 0x48EA, 0x9E6A, 0x9E6A, 0x3EB7, + 0x9E6B, 0x9E70, 0x48EB, 0x9E71, 0x9E71, 0x3EB8, 0x9E72, 0x9E72, 0x48F1, + 0x9E73, 0x9E73, 0x3EB9, 0x9E74, 0x9E76, 0x48F2, 0x9E77, 0x9E78, 0x3EBA, + 0x9E79, 0x9E79, 0x48F5, 0x9E7A, 0x9E7A, 0x3EBC, 0x9E7B, 0x9E7B, 0x48F6, + 0x9E7C, 0x9E7C, 0x3EBD, 0x9E7D, 0x9E7D, 0x48F7, 0x9E7E, 0x9E7E, 0x3EBE, + 0x9EA1, 0x9EA2, 0x3EBF, 0x9EA3, 0x9EA3, 0x48F8, 0x9EA4, 0x9EA6, 0x3EC1, + 0x9EA7, 0x9EA8, 0x48F9, 0x9EA9, 0x9EA9, 0x0728, 0x9EAA, 0x9EAA, 0x3EC5, + 0x9EAB, 0x9EAB, 0x48FB, 0x9EAC, 0x9EAD, 0x3EC6, 0x9EAE, 0x9EAE, 0x48FC, + 0x9EAF, 0x9EB1, 0x3EC8, 0x9EB2, 0x9EB3, 0x48FD, 0x9EB4, 0x9EB4, 0x3ECB, + 0x9EB5, 0x9EB5, 0x48FF, 0x9EB6, 0x9EB7, 0x3ECC, 0x9EB8, 0x9EB8, 0x4900, + 0x9EB9, 0x9EB9, 0x3ECE, 0x9EBA, 0x9EBB, 0x4901, 0x9EBC, 0x9EBC, 0x3ECF, + 0x9EBD, 0x9EBE, 0x4903, 0x9EBF, 0x9EC0, 0x3ED0, 0x9EC1, 0x9EC3, 0x4905, + 0x9EC4, 0x9EC5, 0x3ED2, 0x9EC6, 0x9EC6, 0x4908, 0x9EC7, 0x9ECA, 0x3ED4, + 0x9ECB, 0x9ECC, 0x4909, 0x9ECD, 0x9ECD, 0x3ED9, 0x9ECE, 0x9ECF, 0x490B, + 0x9ED0, 0x9ED1, 0x3EDA, 0x9ED2, 0x9ED2, 0x490D, 0x9ED3, 0x9ED3, 0x3EDC, + 0x9ED4, 0x9ED5, 0x490E, 0x9ED6, 0x9ED7, 0x3EDD, 0x9ED8, 0x9ED9, 0x4910, + 0x9EDA, 0x9EEE, 0x3EDF, 0x9EEF, 0x9EEF, 0x24B6, 0x9EF0, 0x9EF1, 0x3EF5, + 0x9EF2, 0x9EF2, 0x4912, 0x9EF3, 0x9EF5, 0x3EF7, 0x9EF6, 0x9EF8, 0x4913, + 0x9EF9, 0x9EFA, 0x3EFA, 0x9EFB, 0x9EFB, 0x4916, 0x9EFC, 0x9EFC, 0x3EFC, + 0x9EFD, 0x9EFD, 0x1806, 0x9EFE, 0x9EFE, 0x3EFE, 0x9F40, 0x9F42, 0x3EFF, + 0x9F43, 0x9F43, 0x4917, 0x9F44, 0x9F47, 0x3F02, 0x9F48, 0x9F48, 0x4918, + 0x9F49, 0x9F4A, 0x3F06, 0x9F4B, 0x9F4C, 0x4919, 0x9F4D, 0x9F5F, 0x3F08, + 0x9F60, 0x9F60, 0x3511, 0x9F61, 0x9F65, 0x3F1C, 0x9F66, 0x9F66, 0x3945, + 0x9F67, 0x9F68, 0x491B, 0x9F69, 0x9F6F, 0x3F23, 0x9F70, 0x9F70, 0x491D, + 0x9F71, 0x9F7E, 0x3F2A, 0x9FA1, 0x9FB4, 0x3F38, 0x9FB5, 0x9FB5, 0x491E, + 0x9FB6, 0x9FBA, 0x3F4C, 0x9FBB, 0x9FBB, 0x491F, 0x9FBC, 0x9FBE, 0x3F51, + 0x9FBF, 0x9FBF, 0x4920, 0x9FC0, 0x9FC0, 0x3F54, 0x9FC1, 0x9FC1, 0x4921, + 0x9FC2, 0x9FCA, 0x3F55, 0x9FCB, 0x9FCB, 0x0F82, 0x9FCC, 0x9FCC, 0x4922, + 0x9FCD, 0x9FD3, 0x3F60, 0x9FD4, 0x9FD4, 0x4923, 0x9FD5, 0x9FD7, 0x3F68, + 0x9FD8, 0x9FD8, 0x3A3E, 0x9FD9, 0x9FE3, 0x3F6C, 0x9FE4, 0x9FE4, 0x4924, + 0x9FE5, 0x9FF8, 0x3F77, 0x9FF9, 0x9FF9, 0x4925, 0x9FFA, 0x9FFE, 0x3F8B, + 0xA040, 0xA040, 0x4926, 0xA041, 0xA046, 0x3F90, 0xA047, 0xA047, 0x4927, + 0xA048, 0xA054, 0x3F96, 0xA055, 0xA055, 0x4928, 0xA056, 0xA062, 0x3FA3, + 0xA063, 0xA063, 0x3811, 0xA064, 0xA06C, 0x3FB1, 0xA06D, 0xA06D, 0x4929, + 0xA06E, 0xA076, 0x3FBA, 0xA077, 0xA077, 0x05F2, 0xA078, 0xA07A, 0x3FC4, + 0xA07B, 0xA07B, 0x492A, 0xA07C, 0xA07E, 0x3FC7, 0xA0A1, 0xA0A1, 0x3FCA, + 0xA0A2, 0xA0A2, 0x492B, 0xA0A3, 0xA0A6, 0x3FCB, 0xA0A7, 0xA0A7, 0x492C, + 0xA0A8, 0xA0C4, 0x3FCF, 0xA0C5, 0xA0C5, 0x492D, 0xA0C6, 0xA0CF, 0x3FEC, + 0xA0D0, 0xA0D0, 0x492E, 0xA0D1, 0xA0D4, 0x3FF6, 0xA0D5, 0xA0D5, 0x3AEE, + 0xA0D6, 0xA0DE, 0x3FFB, 0xA0DF, 0xA0DF, 0x247D, 0xA0E0, 0xA0E2, 0x4005, + 0xA0E3, 0xA0E3, 0x492F, 0xA0E4, 0xA0E4, 0x3AC9, 0xA0E5, 0xA0E6, 0x4009, + 0xA0E7, 0xA0ED, 0x4930, 0xA0EE, 0xA0EE, 0x43B4, 0xA0EF, 0xA0F1, 0x4937, + 0xA0F2, 0xA0F2, 0x43B8, 0xA0F3, 0xA0FE, 0x493A, 0xA140, 0xA158, 0x0063, + 0xA159, 0xA15C, 0x35AF, 0xA15D, 0xA17E, 0x0080, 0xA1A1, 0xA1F5, 0x00A2, + 0xA1F6, 0xA1F6, 0x00F8, 0xA1F7, 0xA1F7, 0x00F7, 0xA1F8, 0xA1FE, 0x00F9, + 0xA240, 0xA27E, 0x0100, 0xA2A1, 0xA2FE, 0x013F, 0xA340, 0xA37E, 0x019D, + 0xA3A1, 0xA3BB, 0x01DC, 0xA3BD, 0xA3BF, 0x01F7, 0xA440, 0xA47E, 0x0253, + 0xA4A1, 0xA4FE, 0x0292, 0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F, + 0xA640, 0xA67E, 0x038D, 0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A, + 0xA7A1, 0xA7FE, 0x0469, 0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506, + 0xA940, 0xA97E, 0x0564, 0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601, + 0xAAA1, 0xAAFE, 0x0640, 0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD, + 0xAC40, 0xAC7E, 0x073B, 0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F, + 0xAD40, 0xAD7E, 0x07D7, 0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874, + 0xAEA1, 0xAEFE, 0x08B3, 0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950, + 0xAFD0, 0xAFFE, 0x0980, 0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE, + 0xB140, 0xB17E, 0x0A4C, 0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9, + 0xB2A1, 0xB2FE, 0x0B28, 0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5, + 0xB440, 0xB47E, 0x0C23, 0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0, + 0xB5A1, 0xB5FE, 0x0CFF, 0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C, + 0xB740, 0xB77E, 0x0DFA, 0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97, + 0xB8A1, 0xB8FE, 0x0ED6, 0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73, + 0xBA40, 0xBA7E, 0x0FD1, 0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E, + 0xBBA1, 0xBBC7, 0x10AD, 0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C, + 0xBCA1, 0xBCFE, 0x114B, 0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8, + 0xBE40, 0xBE51, 0x1246, 0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258, + 0xBEA1, 0xBEFE, 0x1284, 0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321, + 0xC040, 0xC07E, 0x137F, 0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C, + 0xC1A1, 0xC1AA, 0x145B, 0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA, + 0xC2A1, 0xC2CA, 0x14F9, 0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523, + 0xC340, 0xC360, 0x1556, 0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596, + 0xC3B9, 0xC3B9, 0x15AF, 0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0, + 0xC440, 0xC455, 0x15F4, 0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A, + 0xC4A1, 0xC4FE, 0x1632, 0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF, + 0xC640, 0xC67E, 0x172D, 0xC6A1, 0xC6BE, 0x01FA, 0xC6BF, 0xC6CE, 0x0219, + 0xC6D0, 0xC6D2, 0x022A, 0xC6D4, 0xC6D4, 0x022E, 0xC6D6, 0xC6D6, 0x0230, + 0xC6D8, 0xC6DD, 0x35B3, 0xC6E0, 0xC6FE, 0x35BA, 0xC740, 0xC77E, 0x35D9, + 0xC7A1, 0xC7FE, 0x3618, 0xC840, 0xC87E, 0x3676, 0xC8A1, 0xC8A4, 0x36B5, + 0xC8CD, 0xC8D3, 0x36E1, 0xC8D4, 0xC8D6, 0x44C6, 0xC8D7, 0xC8DF, 0x451C, + 0xC8E0, 0xC8E0, 0x499E, 0xC8E1, 0xC8E8, 0x4525, 0xC8E9, 0xC8E9, 0x499F, + 0xC8EA, 0xC8F0, 0x452D, 0xC8F1, 0xC8F1, 0x49A0, 0xC8F5, 0xC8FE, 0x4992, + 0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776, + 0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797, + 0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809, + 0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E, + 0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942, + 0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E, + 0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19, + 0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5, + 0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0, + 0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC, + 0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7, + 0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3, + 0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001, + 0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F, + 0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A, + 0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216, + 0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274, + 0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312, + 0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE, + 0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B, + 0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527, + 0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622, + 0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE, + 0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9, + 0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5, + 0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0, + 0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC, + 0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42, + 0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8, + 0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86, + 0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3, + 0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F, + 0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8, + 0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014, + 0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8, + 0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C, + 0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE, + 0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160, + 0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E, + 0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC, + 0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161, + 0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0, + 0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D, + 0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6, + 0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327, + 0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF, + 0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA, + 0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511, + 0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E, + 0xF9D2, 0xF9D5, 0x354A, 0xF9D6, 0xF9FE, 0x36E8, 0xFA40, 0xFA5E, 0x400B, + 0xFA5F, 0xFA5F, 0x083A, 0xFA60, 0xFA65, 0x402B, 0xFA66, 0xFA66, 0x09FD, + 0xFA67, 0xFA7E, 0x4032, 0xFAA1, 0xFAA8, 0x404A, 0xFAA9, 0xFAAA, 0x4946, + 0xFAAB, 0xFABC, 0x4054, 0xFABD, 0xFABD, 0x030D, 0xFABE, 0xFAC4, 0x4067, + 0xFAC5, 0xFAC5, 0x016B, 0xFAC6, 0xFAD4, 0x406F, 0xFAD5, 0xFAD5, 0x0860, + 0xFAD6, 0xFAFE, 0x407F, 0xFB40, 0xFB47, 0x40A8, 0xFB48, 0xFB48, 0x3E82, + 0xFB49, 0xFB52, 0x40B1, 0xFB53, 0xFB53, 0x4948, 0xFB54, 0xFB6D, 0x40BC, + 0xFB6E, 0xFB6E, 0x4949, 0xFB6F, 0xFB7E, 0x40D7, 0xFBA1, 0xFBA2, 0x40E7, + 0xFBA3, 0xFBA3, 0x494A, 0xFBA4, 0xFBB7, 0x40EA, 0xFBB8, 0xFBB8, 0x0C23, + 0xFBB9, 0xFBBE, 0x40FF, 0xFBBF, 0xFBBF, 0x494B, 0xFBC0, 0xFBCC, 0x4105, + 0xFBCD, 0xFBCD, 0x494C, 0xFBCE, 0xFBF2, 0x4112, 0xFBF3, 0xFBF3, 0x17E4, + 0xFBF4, 0xFBF8, 0x4138, 0xFBF9, 0xFBF9, 0x3E8E, 0xFBFA, 0xFBFE, 0x413E, + 0xFC40, 0xFC49, 0x4143, 0xFC4A, 0xFC4A, 0x494D, 0xFC4B, 0xFC4E, 0x414D, + 0xFC4F, 0xFC4F, 0x212F, 0xFC50, 0xFC51, 0x4151, 0xFC52, 0xFC52, 0x494E, + 0xFC53, 0xFC62, 0x4153, 0xFC63, 0xFC63, 0x494F, 0xFC64, 0xFC6B, 0x4163, + 0xFC6C, 0xFC6C, 0x4001, 0xFC6D, 0xFC6D, 0x4950, 0xFC6E, 0xFC74, 0x416D, + 0xFC75, 0xFC75, 0x4951, 0xFC76, 0xFC7E, 0x4174, 0xFCA1, 0xFCB8, 0x417D, + 0xFCB9, 0xFCB9, 0x115F, 0xFCBA, 0xFCBB, 0x4195, 0xFCBC, 0xFCBD, 0x4952, + 0xFCBE, 0xFCCB, 0x4198, 0xFCCC, 0xFCCC, 0x4954, 0xFCCD, 0xFCE1, 0x41A7, + 0xFCE2, 0xFCE2, 0x0C79, 0xFCE3, 0xFCE3, 0x4955, 0xFCE4, 0xFCED, 0x41BD, + 0xFCEE, 0xFCEE, 0x4956, 0xFCEF, 0xFCF0, 0x41C7, 0xFCF1, 0xFCF1, 0x04C3, + 0xFCF2, 0xFCFE, 0x41CA, 0xFD40, 0xFD48, 0x41D7, 0xFD49, 0xFD49, 0x4957, + 0xFD4A, 0xFD69, 0x41E0, 0xFD6A, 0xFD6A, 0x4958, 0xFD6B, 0xFD7E, 0x4201, + 0xFDA1, 0xFDB6, 0x4215, 0xFDB7, 0xFDB7, 0x18BD, 0xFDB8, 0xFDB8, 0x0CBD, + 0xFDB9, 0xFDBA, 0x422D, 0xFDBB, 0xFDBB, 0x0CA5, 0xFDBC, 0xFDE2, 0x4230, + 0xFDE3, 0xFDE3, 0x4959, 0xFDE4, 0xFDF0, 0x4258, 0xFDF1, 0xFDF1, 0x0CCE, + 0xFDF2, 0xFDF2, 0x495A, 0xFDF3, 0xFDFE, 0x4266, 0xFE40, 0xFE51, 0x4272, + 0xFE52, 0xFE52, 0x3D70, 0xFE53, 0xFE6C, 0x4285, 0xFE6D, 0xFE6D, 0x495B, + 0xFE6E, 0xFE6E, 0x429F, 0xFE6F, 0xFE6F, 0x0E84, 0xFE70, 0xFE77, 0x42A1, + 0xFE78, 0xFE78, 0x495C, 0xFE79, 0xFE7E, 0x42A9, 0xFEA1, 0xFEA9, 0x42AF, + 0xFEAA, 0xFEAA, 0x0120, 0xFEAB, 0xFEDC, 0x42B8, 0xFEDD, 0xFEDD, 0x1BA8, + 0xFEDE, 0xFEDF, 0x495D, 0xFEE0, 0xFEEC, 0x42EB, 0xFEED, 0xFEEE, 0x495F, + 0xFEEF, 0xFEFE, 0x42F8, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/HKscs-B5-V_5.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/HKscs-B5-V_5.cpp new file mode 100644 index 000000000000..a833497f6a54 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/HKscs-B5-V_5.cpp @@ -0,0 +1,15 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_HKscs_B5_V_5[13 * 3] = { + 0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, + 0x35B1, 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, + 0xA166, 0x008A, 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, + 0xA171, 0xA172, 0x0096, 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, + 0x009E, 0xA1E3, 0xA1E3, 0x354F, 0xC6E4, 0xC6E5, 0x3711, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/UniCNS-UCS2-H_3.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/UniCNS-UCS2-H_3.cpp new file mode 100644 index 000000000000..bfe6a3425417 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/UniCNS-UCS2-H_3.cpp @@ -0,0 +1,5483 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_UniCNS_UCS2_H_3[16418 * 3] = { + 0x0020, 0x007E, 0x0001, 0x00A2, 0x00A3, 0x0106, 0x00A5, 0x00A5, 0x0104, + 0x00A7, 0x00A7, 0x00B2, 0x00A8, 0x00A8, 0x35B3, 0x00AC, 0x00AC, 0x36E1, + 0x00B0, 0x00B0, 0x0118, 0x00B1, 0x00B1, 0x00D4, 0x00B7, 0x00B7, 0x0073, + 0x00C0, 0x00C0, 0x4964, 0x00C1, 0x00C1, 0x4962, 0x00C8, 0x00C8, 0x4968, + 0x00C9, 0x00C9, 0x4966, 0x00CA, 0x00CA, 0x4971, 0x00D2, 0x00D2, 0x496C, + 0x00D3, 0x00D3, 0x496A, 0x00D7, 0x00D7, 0x00D2, 0x00E0, 0x00E0, 0x4975, + 0x00E1, 0x00E1, 0x4973, 0x00E8, 0x00E8, 0x497A, 0x00E9, 0x00E9, 0x4978, + 0x00EA, 0x00EA, 0x4990, 0x00EC, 0x00EC, 0x497E, 0x00ED, 0x00ED, 0x497C, + 0x00F2, 0x00F2, 0x4982, 0x00F3, 0x00F3, 0x4980, 0x00F7, 0x00F7, 0x00D3, + 0x00F8, 0x00F8, 0x4998, 0x00F9, 0x00F9, 0x4986, 0x00FA, 0x00FA, 0x4984, + 0x00FC, 0x00FC, 0x498B, 0x0100, 0x0100, 0x4961, 0x0101, 0x0101, 0x4972, + 0x0112, 0x0112, 0x4965, 0x0113, 0x0113, 0x4977, 0x011A, 0x011A, 0x4967, + 0x011B, 0x011B, 0x4979, 0x012B, 0x012B, 0x497B, 0x014B, 0x014B, 0x4999, + 0x014C, 0x014C, 0x4969, 0x014D, 0x014D, 0x497F, 0x0153, 0x0153, 0x4997, + 0x016B, 0x016B, 0x4983, 0x01CD, 0x01CD, 0x4963, 0x01CE, 0x01CE, 0x4974, + 0x01D0, 0x01D0, 0x497D, 0x01D1, 0x01D1, 0x496B, 0x01D2, 0x01D2, 0x4981, + 0x01D4, 0x01D4, 0x4985, 0x01D6, 0x01D6, 0x4987, 0x01D8, 0x01D8, 0x4988, + 0x01DA, 0x01DA, 0x4989, 0x01DC, 0x01DC, 0x498A, 0x0250, 0x0250, 0x4993, + 0x0251, 0x0251, 0x4976, 0x0254, 0x0254, 0x4995, 0x025B, 0x025B, 0x4994, + 0x0261, 0x0261, 0x4991, 0x026A, 0x026A, 0x499B, 0x0275, 0x0275, 0x4996, + 0x0283, 0x0283, 0x4992, 0x028A, 0x028A, 0x499A, 0x02C6, 0x02C6, 0x35B4, + 0x02C7, 0x02C7, 0x01F8, 0x02CA, 0x02CA, 0x01F7, 0x02CB, 0x02CB, 0x01F9, + 0x02D9, 0x02D9, 0x01F6, 0x0308, 0x0308, 0x35B3, 0x0391, 0x03A1, 0x01A1, + 0x03A3, 0x03A9, 0x01B2, 0x03B1, 0x03C1, 0x01B9, 0x03C3, 0x03C9, 0x01CA, + 0x0401, 0x0401, 0x3670, 0x0410, 0x0415, 0x366A, 0x0416, 0x0435, 0x3671, + 0x0436, 0x044F, 0x3692, 0x0451, 0x0451, 0x3691, 0x1EBE, 0x1EBE, 0x496E, + 0x1EBF, 0x1EBF, 0x498D, 0x1EC0, 0x1EC0, 0x4970, 0x1EC1, 0x1EC1, 0x498F, + 0x2013, 0x2013, 0x0079, 0x2014, 0x2014, 0x007B, 0x2018, 0x2019, 0x00A6, + 0x201C, 0x201D, 0x00A8, 0x2022, 0x2022, 0x0068, 0x2025, 0x2025, 0x006F, + 0x2026, 0x2026, 0x006E, 0x2032, 0x2032, 0x00AD, 0x2035, 0x2035, 0x00AC, + 0x203B, 0x203B, 0x00B1, 0x203E, 0x203E, 0x00C3, 0x20AC, 0x20AC, 0x44C1, + 0x2103, 0x2103, 0x010A, 0x2105, 0x2105, 0x00C2, 0x2109, 0x2109, 0x010B, + 0x2116, 0x2116, 0x36E6, 0x2121, 0x2121, 0x36E7, 0x2160, 0x2169, 0x0157, + 0x2170, 0x2179, 0x020E, 0x2190, 0x2190, 0x00F8, 0x2191, 0x2191, 0x00F5, + 0x2192, 0x2192, 0x00F7, 0x2193, 0x2193, 0x00F6, 0x2196, 0x2197, 0x00F9, + 0x2198, 0x2198, 0x00FC, 0x2199, 0x2199, 0x00FB, 0x21B8, 0x21B9, 0x36AD, + 0x21E7, 0x21E7, 0x36AC, 0x221A, 0x221A, 0x00D5, 0x221E, 0x221E, 0x00DC, + 0x221F, 0x221F, 0x00E9, 0x2220, 0x2220, 0x00E8, 0x2223, 0x2223, 0x00FE, + 0x2225, 0x2225, 0x00FD, 0x2229, 0x222A, 0x00E5, 0x222B, 0x222B, 0x00ED, + 0x222E, 0x222E, 0x00EE, 0x2234, 0x2234, 0x00F0, 0x2235, 0x2235, 0x00EF, + 0x223C, 0x223C, 0x00E4, 0x2252, 0x2252, 0x00DD, 0x2260, 0x2260, 0x00DB, + 0x2261, 0x2261, 0x00DE, 0x2266, 0x2267, 0x00D9, 0x22A5, 0x22A5, 0x00E7, + 0x22BF, 0x22BF, 0x00EA, 0x2400, 0x241F, 0x0232, 0x2421, 0x2421, 0x0252, + 0x2460, 0x2469, 0x01FA, 0x2474, 0x247D, 0x0204, 0x2500, 0x2500, 0x0137, + 0x2502, 0x2502, 0x0138, 0x250C, 0x250C, 0x013A, 0x2510, 0x2510, 0x013B, + 0x2514, 0x2514, 0x013C, 0x2518, 0x2518, 0x013D, 0x251C, 0x251C, 0x0135, + 0x2524, 0x2524, 0x0134, 0x252C, 0x252C, 0x0133, 0x2534, 0x2534, 0x0132, + 0x253C, 0x253C, 0x0131, 0x2550, 0x2550, 0x0142, 0x2551, 0x2551, 0x370A, + 0x2552, 0x2552, 0x36F8, 0x2553, 0x2553, 0x3701, 0x2554, 0x2554, 0x36EF, + 0x2555, 0x2555, 0x36FA, 0x2556, 0x2556, 0x3703, 0x2557, 0x2557, 0x36F1, + 0x2558, 0x2558, 0x36FE, 0x2559, 0x2559, 0x3707, 0x255A, 0x255A, 0x36F5, + 0x255B, 0x255B, 0x3700, 0x255C, 0x255C, 0x3709, 0x255D, 0x255D, 0x36F7, + 0x255E, 0x255E, 0x0143, 0x255F, 0x255F, 0x3704, 0x2560, 0x2560, 0x36F2, + 0x2561, 0x2561, 0x0145, 0x2562, 0x2562, 0x3706, 0x2563, 0x2563, 0x36F4, + 0x2564, 0x2564, 0x36F9, 0x2565, 0x2565, 0x3702, 0x2566, 0x2566, 0x36F0, + 0x2567, 0x2567, 0x36FF, 0x2568, 0x2568, 0x3708, 0x2569, 0x2569, 0x36F6, + 0x256A, 0x256A, 0x0144, 0x256B, 0x256B, 0x3705, 0x256C, 0x256C, 0x36F3, + 0x256D, 0x256E, 0x013E, 0x256F, 0x256F, 0x0141, 0x2570, 0x2570, 0x0140, + 0x2571, 0x2573, 0x014A, 0x2581, 0x2588, 0x0122, 0x2589, 0x2589, 0x0130, + 0x258A, 0x258A, 0x012F, 0x258B, 0x258B, 0x012E, 0x258C, 0x258C, 0x012D, + 0x258D, 0x258D, 0x012C, 0x258E, 0x258E, 0x012B, 0x258F, 0x258F, 0x012A, + 0x2593, 0x2593, 0x3710, 0x2594, 0x2594, 0x0136, 0x2595, 0x2595, 0x0139, + 0x25A0, 0x25A0, 0x00BE, 0x25A1, 0x25A1, 0x00BD, 0x25B2, 0x25B2, 0x00B7, + 0x25B3, 0x25B3, 0x00B6, 0x25BC, 0x25BC, 0x00C0, 0x25BD, 0x25BD, 0x00BF, + 0x25C6, 0x25C6, 0x00BC, 0x25C7, 0x25C7, 0x00BB, 0x25CB, 0x25CB, 0x00B4, + 0x25CE, 0x25CE, 0x00B8, 0x25CF, 0x25CF, 0x00B5, 0x25E2, 0x25E3, 0x0146, + 0x25E4, 0x25E4, 0x0149, 0x25E5, 0x25E5, 0x0148, 0x2605, 0x2605, 0x00BA, + 0x2606, 0x2606, 0x00B9, 0x2609, 0x2609, 0x00F4, 0x2640, 0x2640, 0x00F1, + 0x2641, 0x2641, 0x00F3, 0x2642, 0x2642, 0x00F2, 0x273D, 0x273D, 0x35C0, + 0x2E80, 0x2E80, 0x44C8, 0x2E84, 0x2E84, 0x451C, 0x2E86, 0x2E88, 0x451D, + 0x2E8A, 0x2E8A, 0x4520, 0x2E8C, 0x2E8D, 0x4521, 0x2E95, 0x2E95, 0x4523, + 0x2E9C, 0x2E9C, 0x4524, 0x2E9D, 0x2E9D, 0x02DC, 0x2EA5, 0x2EA5, 0x4525, + 0x2EA7, 0x2EA7, 0x4526, 0x2EAA, 0x2EAA, 0x4527, 0x2EAC, 0x2EAC, 0x4528, + 0x2EAE, 0x2EAE, 0x4529, 0x2EB6, 0x2EB6, 0x452A, 0x2EBC, 0x2EBC, 0x452B, + 0x2EBE, 0x2EBE, 0x452C, 0x2EC6, 0x2EC6, 0x0509, 0x2ECA, 0x2ECA, 0x452D, + 0x2ECC, 0x2ECD, 0x452E, 0x2ECF, 0x2ECF, 0x4530, 0x2ED6, 0x2ED7, 0x4531, + 0x2EDE, 0x2EDE, 0x4533, 0x2EE3, 0x2EE3, 0x09F6, 0x2F33, 0x2F33, 0x0227, + 0x3000, 0x3000, 0x0063, 0x3001, 0x3002, 0x0065, 0x3003, 0x3003, 0x00B3, + 0x3005, 0x3007, 0x35BA, 0x3008, 0x3009, 0x0094, 0x300A, 0x300B, 0x0090, + 0x300C, 0x300D, 0x0098, 0x300E, 0x300F, 0x009C, 0x3010, 0x3011, 0x008C, + 0x3012, 0x3012, 0x0105, 0x3014, 0x3015, 0x0088, 0x301D, 0x301E, 0x00AA, + 0x3021, 0x3029, 0x0161, 0x3041, 0x3093, 0x35C1, 0x309B, 0x309C, 0x44C6, + 0x309D, 0x309E, 0x35B7, 0x30A1, 0x30F6, 0x3614, 0x30FC, 0x30FC, 0x35BD, + 0x30FD, 0x30FE, 0x35B5, 0x3105, 0x3129, 0x01D1, 0x3231, 0x3231, 0x36E5, + 0x32A3, 0x32A3, 0x00C1, 0x338E, 0x338F, 0x0115, 0x339C, 0x339E, 0x0110, + 0x33A1, 0x33A1, 0x0114, 0x33C4, 0x33C4, 0x0117, 0x33CE, 0x33CE, 0x0113, + 0x33D1, 0x33D1, 0x00EC, 0x33D2, 0x33D2, 0x00EB, 0x33D5, 0x33D5, 0x010F, + 0x3435, 0x3435, 0x39BD, 0x3440, 0x3440, 0x3C67, 0x344C, 0x344C, 0x4593, + 0x3464, 0x3464, 0x3A85, 0x3473, 0x3473, 0x3DC5, 0x347A, 0x347A, 0x4033, + 0x347D, 0x347D, 0x4597, 0x347E, 0x347E, 0x46A3, 0x3493, 0x3493, 0x439E, + 0x3496, 0x3496, 0x37DC, 0x34A5, 0x34A5, 0x4598, 0x34AF, 0x34AF, 0x3C7F, + 0x34BC, 0x34BC, 0x4380, 0x34C1, 0x34C1, 0x44FB, 0x34C8, 0x34C8, 0x3D00, + 0x34DF, 0x34DF, 0x3EA4, 0x34E4, 0x34E4, 0x3E54, 0x34FB, 0x34FB, 0x3DCA, + 0x3506, 0x3506, 0x4336, 0x353E, 0x353E, 0x44E7, 0x3551, 0x3551, 0x45A1, + 0x3553, 0x3553, 0x43A5, 0x3561, 0x3561, 0x40D8, 0x356D, 0x356D, 0x45A4, + 0x3570, 0x3570, 0x3B2F, 0x3572, 0x3572, 0x45A5, 0x3577, 0x3577, 0x3ECB, + 0x3578, 0x3578, 0x4379, 0x3584, 0x3584, 0x39FB, 0x3597, 0x3597, 0x3B2D, + 0x3598, 0x3598, 0x45B0, 0x35A1, 0x35A1, 0x40E2, 0x35A5, 0x35A5, 0x45B1, + 0x35AD, 0x35AD, 0x3EFC, 0x35BF, 0x35BF, 0x45B2, 0x35C1, 0x35C1, 0x4580, + 0x35C5, 0x35C5, 0x45B4, 0x35C7, 0x35C7, 0x459F, 0x35CA, 0x35CA, 0x3E43, + 0x35CE, 0x35CE, 0x3E81, 0x35D2, 0x35D2, 0x3FC9, 0x35D6, 0x35D6, 0x3FB5, + 0x35DB, 0x35DB, 0x470D, 0x35DD, 0x35DD, 0x43AC, 0x35F1, 0x35F1, 0x4696, + 0x35F2, 0x35F2, 0x4627, 0x35F3, 0x35F3, 0x3F6C, 0x35FB, 0x35FB, 0x45C8, + 0x35FE, 0x35FE, 0x3F6A, 0x3609, 0x3609, 0x45F5, 0x3618, 0x3618, 0x4871, + 0x361A, 0x361A, 0x461A, 0x3623, 0x3623, 0x40C6, 0x362D, 0x362D, 0x3E86, + 0x3635, 0x3635, 0x492E, 0x3639, 0x3639, 0x4165, 0x363E, 0x363E, 0x3A08, + 0x3647, 0x3647, 0x4806, 0x3648, 0x3648, 0x3806, 0x3649, 0x3649, 0x4013, + 0x364E, 0x364E, 0x4698, 0x365F, 0x365F, 0x3DF3, 0x367A, 0x367A, 0x3EE3, + 0x3681, 0x3681, 0x45A6, 0x369A, 0x369A, 0x3C71, 0x36A5, 0x36A5, 0x4902, + 0x36AA, 0x36AA, 0x3B30, 0x36AC, 0x36AC, 0x4900, 0x36B0, 0x36B0, 0x3CDF, + 0x36B1, 0x36B1, 0x40CD, 0x36B5, 0x36B5, 0x3BC2, 0x36B9, 0x36B9, 0x4887, + 0x36BC, 0x36BC, 0x3CFF, 0x36C1, 0x36C1, 0x37C5, 0x36C3, 0x36C3, 0x40E5, + 0x36C4, 0x36C4, 0x3905, 0x36C5, 0x36C5, 0x4296, 0x36C7, 0x36C7, 0x3D3A, + 0x36C8, 0x36C8, 0x4820, 0x36D3, 0x36D3, 0x3A38, 0x36D4, 0x36D4, 0x3BB3, + 0x36D6, 0x36D6, 0x3D0C, 0x36DD, 0x36DD, 0x3A36, 0x36E1, 0x36E1, 0x397C, + 0x36E2, 0x36E2, 0x3CDD, 0x36E5, 0x36E5, 0x4216, 0x36E6, 0x36E6, 0x40FC, + 0x36F5, 0x36F5, 0x3A18, 0x3701, 0x3701, 0x3A34, 0x3703, 0x3703, 0x460F, + 0x3708, 0x3708, 0x40FF, 0x370A, 0x370A, 0x3CD5, 0x370D, 0x370D, 0x4238, + 0x371C, 0x371C, 0x3DFE, 0x3722, 0x3722, 0x3979, 0x3723, 0x3723, 0x3980, + 0x3725, 0x3725, 0x3849, 0x372C, 0x372C, 0x3C8C, 0x372D, 0x372D, 0x3D37, + 0x3730, 0x3730, 0x495C, 0x3732, 0x3732, 0x4106, 0x3733, 0x3733, 0x3997, + 0x373A, 0x373A, 0x3E56, 0x3740, 0x3740, 0x4202, 0x3743, 0x3743, 0x4036, + 0x3762, 0x3762, 0x3DB6, 0x376F, 0x376F, 0x47CB, 0x3797, 0x3797, 0x45ED, + 0x37A0, 0x37A0, 0x3A28, 0x37B9, 0x37B9, 0x43B7, 0x37BE, 0x37BE, 0x393E, + 0x37F2, 0x37F2, 0x3BA1, 0x37F8, 0x37F8, 0x42D2, 0x37FB, 0x37FB, 0x3EF5, + 0x380F, 0x380F, 0x462C, 0x3819, 0x3819, 0x39AF, 0x3820, 0x3820, 0x462F, + 0x382D, 0x382D, 0x412E, 0x3836, 0x3836, 0x4133, 0x3838, 0x3838, 0x43BB, + 0x3863, 0x3863, 0x46C3, 0x38A0, 0x38A0, 0x4145, 0x38C3, 0x38C3, 0x3912, + 0x38CC, 0x38CC, 0x4076, 0x38D1, 0x38D1, 0x3A95, 0x38FA, 0x38FA, 0x44EB, + 0x3908, 0x3908, 0x4632, 0x3914, 0x3914, 0x43BE, 0x3927, 0x3927, 0x3C31, + 0x3932, 0x3932, 0x4182, 0x393F, 0x393F, 0x4633, 0x394D, 0x394D, 0x4634, + 0x3963, 0x3963, 0x4163, 0x3980, 0x3980, 0x3874, 0x3989, 0x3989, 0x4638, + 0x398A, 0x398A, 0x3CE8, 0x3992, 0x3992, 0x4376, 0x3999, 0x3999, 0x39BA, + 0x399B, 0x399B, 0x3DB3, 0x39A1, 0x39A1, 0x3E19, 0x39A4, 0x39A4, 0x3E0F, + 0x39B8, 0x39B8, 0x463B, 0x39DC, 0x39DC, 0x3ECE, 0x39E2, 0x39E2, 0x46C8, + 0x39E5, 0x39E5, 0x393B, 0x39EC, 0x39EC, 0x4310, 0x39F8, 0x39F8, 0x463E, + 0x39FB, 0x39FB, 0x4345, 0x39FE, 0x39FE, 0x4368, 0x3A01, 0x3A01, 0x41E0, + 0x3A03, 0x3A03, 0x4640, 0x3A06, 0x3A06, 0x4377, 0x3A17, 0x3A17, 0x4190, + 0x3A18, 0x3A18, 0x438F, 0x3A29, 0x3A29, 0x3A5E, 0x3A2A, 0x3A2A, 0x3EDF, + 0x3A34, 0x3A34, 0x4319, 0x3A4B, 0x3A4B, 0x4644, 0x3A52, 0x3A52, 0x3ED3, + 0x3A57, 0x3A57, 0x419E, 0x3A5C, 0x3A5C, 0x3FC4, 0x3A5E, 0x3A5E, 0x3B07, + 0x3A66, 0x3A66, 0x419C, 0x3A67, 0x3A67, 0x4333, 0x3A97, 0x3A97, 0x4647, + 0x3AAB, 0x3AAB, 0x4091, 0x3ABD, 0x3ABD, 0x4649, 0x3ADE, 0x3ADE, 0x414C, + 0x3AE0, 0x3AE0, 0x3A7A, 0x3AF0, 0x3AF0, 0x46B2, 0x3AF2, 0x3AF2, 0x464C, + 0x3AFB, 0x3AFB, 0x3AF2, 0x3B0E, 0x3B0E, 0x38E8, 0x3B19, 0x3B19, 0x46C5, + 0x3B22, 0x3B22, 0x464E, 0x3B2B, 0x3B2B, 0x4956, 0x3B39, 0x3B39, 0x474B, + 0x3B42, 0x3B42, 0x4650, 0x3B58, 0x3B58, 0x4652, 0x3B60, 0x3B60, 0x393A, + 0x3B71, 0x3B71, 0x4656, 0x3B72, 0x3B72, 0x4655, 0x3B7B, 0x3B7B, 0x4657, + 0x3B7C, 0x3B7C, 0x385A, 0x3B80, 0x3B80, 0x41E2, 0x3B96, 0x3B96, 0x3A9C, + 0x3B99, 0x3B99, 0x3A98, 0x3BA1, 0x3BA1, 0x41E9, 0x3BBC, 0x3BBC, 0x43C8, + 0x3BBE, 0x3BBE, 0x3DB1, 0x3BC2, 0x3BC2, 0x4134, 0x3BC4, 0x3BC4, 0x3AA0, + 0x3BD7, 0x3BD7, 0x3AAC, 0x3BDD, 0x3BDD, 0x465F, 0x3BEC, 0x3BEC, 0x4664, + 0x3BF2, 0x3BF2, 0x4666, 0x3BF3, 0x3BF3, 0x41F3, 0x3BF4, 0x3BF4, 0x3A6E, + 0x3C0D, 0x3C0D, 0x41F7, 0x3C11, 0x3C11, 0x3E40, 0x3C15, 0x3C15, 0x3998, + 0x3C54, 0x3C54, 0x3E00, 0x3CCB, 0x3CCB, 0x4670, 0x3CCD, 0x3CCD, 0x3CE5, + 0x3CD1, 0x3CD1, 0x4003, 0x3CD6, 0x3CD6, 0x3CF7, 0x3CDC, 0x3CDC, 0x404E, + 0x3CEB, 0x3CEB, 0x4217, 0x3CEF, 0x3CEF, 0x4675, 0x3D13, 0x3D13, 0x3773, + 0x3D1D, 0x3D1D, 0x393C, 0x3D32, 0x3D32, 0x4957, 0x3D3B, 0x3D3B, 0x4245, + 0x3D46, 0x3D46, 0x4685, 0x3D4C, 0x3D4C, 0x3CEB, 0x3D4E, 0x3D4E, 0x4242, + 0x3D51, 0x3D51, 0x38EA, 0x3D5F, 0x3D5F, 0x4159, 0x3D62, 0x3D62, 0x3C5E, + 0x3D69, 0x3D69, 0x3CEA, 0x3D6A, 0x3D6A, 0x4689, 0x3D6F, 0x3D6F, 0x3CFC, + 0x3D75, 0x3D75, 0x468A, 0x3D7D, 0x3D7D, 0x3C2F, 0x3D85, 0x3D85, 0x494B, + 0x3D8A, 0x3D8A, 0x468D, 0x3D8F, 0x3D8F, 0x3ABD, 0x3D91, 0x3D91, 0x468F, + 0x3DA5, 0x3DA5, 0x3D56, 0x3DAD, 0x3DAD, 0x4699, 0x3DB4, 0x3DB4, 0x40A6, + 0x3DBF, 0x3DBF, 0x37D0, 0x3DC6, 0x3DC6, 0x48DE, 0x3DC7, 0x3DC7, 0x4164, + 0x3DCC, 0x3DCC, 0x3D6F, 0x3DCD, 0x3DCD, 0x3AF3, 0x3DD3, 0x3DD3, 0x37E1, + 0x3DDB, 0x3DDB, 0x3FFF, 0x3DE7, 0x3DE7, 0x3999, 0x3DE8, 0x3DE8, 0x425D, + 0x3DEB, 0x3DEB, 0x3E5A, 0x3DF3, 0x3DF3, 0x46D4, 0x3DF7, 0x3DF7, 0x48AB, + 0x3DFC, 0x3DFC, 0x462B, 0x3DFD, 0x3DFD, 0x3C14, 0x3E06, 0x3E06, 0x491D, + 0x3E40, 0x3E40, 0x4169, 0x3E43, 0x3E43, 0x436D, 0x3E48, 0x3E48, 0x4595, + 0x3E55, 0x3E55, 0x427F, 0x3E74, 0x3E74, 0x3EE2, 0x3EA8, 0x3EA8, 0x4304, + 0x3EA9, 0x3EA9, 0x46ED, 0x3EAA, 0x3EAA, 0x4075, 0x3EAD, 0x3EAD, 0x3B9D, + 0x3EB1, 0x3EB1, 0x3AD8, 0x3EB8, 0x3EB8, 0x3A4B, 0x3EBF, 0x3EBF, 0x3B0B, + 0x3EC2, 0x3EC2, 0x3BD8, 0x3EC7, 0x3EC7, 0x3975, 0x3ECA, 0x3ECA, 0x46F1, + 0x3ECC, 0x3ECC, 0x3BE2, 0x3ED0, 0x3ED0, 0x3854, 0x3ED1, 0x3ED1, 0x46F2, + 0x3ED6, 0x3ED6, 0x3CAD, 0x3ED7, 0x3ED7, 0x429F, 0x3EDA, 0x3EDA, 0x3D02, + 0x3EDE, 0x3EDE, 0x39F2, 0x3EE1, 0x3EE1, 0x3CA8, 0x3EE2, 0x3EE2, 0x46F6, + 0x3EE7, 0x3EE7, 0x3BDC, 0x3EE9, 0x3EE9, 0x3CA4, 0x3EEB, 0x3EEB, 0x396A, + 0x3EF0, 0x3EF0, 0x46F7, 0x3EF3, 0x3EF3, 0x3ADD, 0x3EF4, 0x3EF4, 0x46F8, + 0x3EFA, 0x3EFA, 0x46F9, 0x3EFC, 0x3EFC, 0x3BE8, 0x3EFF, 0x3EFF, 0x3AF5, + 0x3F00, 0x3F00, 0x3C0D, 0x3F04, 0x3F04, 0x42C3, 0x3F06, 0x3F06, 0x3AD7, + 0x3F0E, 0x3F0E, 0x46FB, 0x3F53, 0x3F53, 0x46FC, 0x3F58, 0x3F58, 0x3AE9, + 0x3F59, 0x3F59, 0x4089, 0x3F63, 0x3F63, 0x3AE6, 0x3F7C, 0x3F7C, 0x4700, + 0x3F93, 0x3F93, 0x45CD, 0x3FC0, 0x3FC0, 0x43CF, 0x3FD7, 0x3FD7, 0x43D1, + 0x3FDC, 0x3FDC, 0x4704, 0x3FE5, 0x3FE5, 0x46DF, 0x3FED, 0x3FED, 0x4335, + 0x3FF9, 0x3FF9, 0x45D7, 0x3FFA, 0x3FFA, 0x4354, 0x4004, 0x4004, 0x410E, + 0x401D, 0x401D, 0x4709, 0x4039, 0x4039, 0x470B, 0x4045, 0x4045, 0x470C, + 0x4053, 0x4053, 0x45B6, 0x4057, 0x4057, 0x399D, 0x4062, 0x4062, 0x3BCB, + 0x4065, 0x4065, 0x3FD3, 0x406A, 0x406A, 0x470F, 0x406F, 0x406F, 0x4710, + 0x40A8, 0x40A8, 0x43D5, 0x40BB, 0x40BB, 0x45C0, 0x40BF, 0x40BF, 0x3EEC, + 0x40C8, 0x40C8, 0x3B0E, 0x40D8, 0x40D8, 0x41AB, 0x40DF, 0x40DF, 0x3E17, + 0x40FA, 0x40FA, 0x3EBE, 0x4103, 0x4103, 0x43D7, 0x4104, 0x4104, 0x425C, + 0x4109, 0x4109, 0x471C, 0x410E, 0x410E, 0x3B1B, 0x4132, 0x4132, 0x3B25, + 0x4167, 0x4167, 0x471F, 0x416C, 0x416C, 0x38AE, 0x416E, 0x416E, 0x3B23, + 0x417F, 0x417F, 0x3B82, 0x4190, 0x4190, 0x46C0, 0x41B2, 0x41B2, 0x4720, + 0x41C4, 0x41C4, 0x4723, 0x41CA, 0x41CA, 0x373F, 0x41CF, 0x41CF, 0x4726, + 0x41DB, 0x41DB, 0x37BF, 0x41EF, 0x41EF, 0x3743, 0x41F9, 0x41F9, 0x3B3E, + 0x4211, 0x4211, 0x3B41, 0x4240, 0x4240, 0x37F1, 0x4260, 0x4260, 0x472B, + 0x426A, 0x426A, 0x3B55, 0x427A, 0x427A, 0x472C, 0x428C, 0x428C, 0x472F, + 0x4294, 0x4294, 0x4731, 0x42B5, 0x42B5, 0x4010, 0x42B9, 0x42B9, 0x38A6, + 0x42BC, 0x42BC, 0x3C8A, 0x42F4, 0x42F4, 0x3BB9, 0x42FB, 0x42FB, 0x3CEE, + 0x42FC, 0x42FC, 0x41E6, 0x432B, 0x432B, 0x377D, 0x436E, 0x436E, 0x46CA, + 0x4397, 0x4397, 0x473B, 0x43BA, 0x43BA, 0x435F, 0x43C1, 0x43C1, 0x4695, + 0x43D9, 0x43D9, 0x433E, 0x43DF, 0x43DF, 0x3E49, 0x43ED, 0x43ED, 0x4745, + 0x43F2, 0x43F2, 0x3E48, 0x4401, 0x4401, 0x474A, 0x4402, 0x4402, 0x3B73, + 0x4413, 0x4413, 0x474F, 0x4425, 0x4425, 0x4751, 0x442D, 0x442D, 0x4752, + 0x447A, 0x447A, 0x37AF, 0x448F, 0x448F, 0x4758, 0x449F, 0x449F, 0x3AE2, + 0x44A0, 0x44A0, 0x37ED, 0x44A2, 0x44A2, 0x4079, 0x44B0, 0x44B0, 0x475C, + 0x44B7, 0x44B7, 0x3FA1, 0x44C0, 0x44C0, 0x3C07, 0x44C5, 0x44C5, 0x4210, + 0x44CE, 0x44CE, 0x3D23, 0x44DD, 0x44DD, 0x39DD, 0x44DF, 0x44DF, 0x3D22, + 0x44E4, 0x44E4, 0x37E2, 0x44E9, 0x44E9, 0x41CF, 0x44EA, 0x44EA, 0x3B71, + 0x44EB, 0x44EB, 0x3CF2, 0x44EC, 0x44EC, 0x3EB4, 0x44F4, 0x44F4, 0x3992, + 0x4503, 0x4503, 0x469F, 0x4504, 0x4504, 0x4763, 0x4509, 0x4509, 0x3E50, + 0x450B, 0x450B, 0x37D4, 0x4516, 0x4516, 0x37F9, 0x451D, 0x451D, 0x3767, + 0x4527, 0x4527, 0x37F7, 0x452E, 0x452E, 0x3CD3, 0x4533, 0x4533, 0x3C51, + 0x453B, 0x453B, 0x476A, 0x453D, 0x453D, 0x38C4, 0x453F, 0x453F, 0x3E12, + 0x4543, 0x4543, 0x37F3, 0x4551, 0x4551, 0x3AE4, 0x4552, 0x4552, 0x40B3, + 0x4555, 0x4555, 0x423E, 0x455C, 0x455C, 0x378B, 0x4562, 0x4562, 0x4940, + 0x456A, 0x456A, 0x3804, 0x4577, 0x4577, 0x476E, 0x4585, 0x4585, 0x38C5, + 0x45E9, 0x45E9, 0x3EE4, 0x4606, 0x4606, 0x4773, 0x460F, 0x460F, 0x3815, + 0x4615, 0x4615, 0x3843, 0x4617, 0x4617, 0x4774, 0x465B, 0x465B, 0x381D, + 0x467A, 0x467A, 0x39E9, 0x4680, 0x4680, 0x3D01, 0x46CF, 0x46CF, 0x3BA0, + 0x46D0, 0x46D0, 0x3DFA, 0x46F5, 0x46F5, 0x3B9F, 0x4713, 0x4713, 0x3833, + 0x4718, 0x4718, 0x3DC7, 0x474E, 0x474E, 0x3EBC, 0x477C, 0x477C, 0x3DCD, + 0x4798, 0x4798, 0x4781, 0x47A6, 0x47A6, 0x40A3, 0x47B6, 0x47B6, 0x3EEA, + 0x47D5, 0x47D5, 0x431A, 0x47ED, 0x47ED, 0x4783, 0x47F4, 0x47F4, 0x432F, + 0x4800, 0x4800, 0x461E, 0x480B, 0x480B, 0x4352, 0x4837, 0x4837, 0x4787, + 0x485D, 0x485D, 0x410F, 0x4871, 0x4871, 0x3D03, 0x489B, 0x489B, 0x3BBD, + 0x48AD, 0x48AD, 0x4791, 0x48AE, 0x48AE, 0x494D, 0x48D0, 0x48D0, 0x3DA7, + 0x48DD, 0x48DD, 0x4120, 0x48ED, 0x48ED, 0x4288, 0x48F3, 0x48F3, 0x3EC1, + 0x48FA, 0x48FA, 0x3E44, 0x4906, 0x4906, 0x3BC7, 0x4911, 0x4911, 0x4584, + 0x491E, 0x491E, 0x4794, 0x4925, 0x4925, 0x3C0F, 0x492A, 0x492A, 0x46AE, + 0x492D, 0x492D, 0x46CD, 0x4935, 0x4935, 0x3CC3, 0x493C, 0x493C, 0x3BF8, + 0x493E, 0x493E, 0x3D06, 0x4945, 0x4945, 0x47A3, 0x4951, 0x4951, 0x47A4, + 0x4953, 0x4953, 0x42AD, 0x4965, 0x4965, 0x3899, 0x496A, 0x496A, 0x47A9, + 0x4972, 0x4972, 0x3A24, 0x4989, 0x4989, 0x379B, 0x49A1, 0x49A1, 0x38B7, + 0x49A7, 0x49A7, 0x47AE, 0x49DF, 0x49DF, 0x38AA, 0x49E5, 0x49E5, 0x47B1, + 0x49E7, 0x49E7, 0x4621, 0x4A0F, 0x4A0F, 0x38C3, 0x4A1D, 0x4A1D, 0x3BEC, + 0x4A24, 0x4A24, 0x47B2, 0x4A35, 0x4A35, 0x47B4, 0x4A96, 0x4A96, 0x3CE7, + 0x4AB4, 0x4AB4, 0x4361, 0x4AB8, 0x4AB8, 0x3DA8, 0x4AD1, 0x4AD1, 0x38E3, + 0x4AE4, 0x4AE4, 0x47B7, 0x4AFF, 0x4AFF, 0x38F2, 0x4B19, 0x4B19, 0x47B9, + 0x4B2C, 0x4B2C, 0x461F, 0x4B37, 0x4B37, 0x41A9, 0x4B6F, 0x4B6F, 0x3C16, + 0x4B70, 0x4B70, 0x47C0, 0x4B72, 0x4B72, 0x38FC, 0x4B7B, 0x4B7B, 0x3C8D, + 0x4B7E, 0x4B7E, 0x400A, 0x4B8E, 0x4B8E, 0x39F7, 0x4B90, 0x4B90, 0x3C20, + 0x4B93, 0x4B93, 0x3A8C, 0x4B96, 0x4B96, 0x3942, 0x4B97, 0x4B97, 0x3C24, + 0x4B9D, 0x4B9D, 0x47C2, 0x4BBD, 0x4BBD, 0x3C23, 0x4BBE, 0x4BBE, 0x3954, + 0x4BC0, 0x4BC0, 0x3DDC, 0x4C04, 0x4C04, 0x3FBB, 0x4C07, 0x4C07, 0x3FB7, + 0x4C0E, 0x4C0E, 0x390C, 0x4C3B, 0x4C3B, 0x3F3C, 0x4C3E, 0x4C3E, 0x457B, + 0x4C5B, 0x4C5B, 0x3ED9, 0x4C6D, 0x4C6D, 0x47C9, 0x4C7D, 0x4C7D, 0x3E66, + 0x4CA4, 0x4CA4, 0x48BE, 0x4CAE, 0x4CAE, 0x3C42, 0x4CB0, 0x4CB0, 0x3C45, + 0x4CB7, 0x4CB7, 0x3E21, 0x4CCD, 0x4CCD, 0x4578, 0x4CE1, 0x4CE1, 0x3EF3, + 0x4CED, 0x4CED, 0x40AB, 0x4D09, 0x4D09, 0x3ED6, 0x4D10, 0x4D10, 0x4117, + 0x4D34, 0x4D34, 0x3935, 0x4D91, 0x4D91, 0x43F5, 0x4D9C, 0x4D9C, 0x48C4, + 0x4E00, 0x4E00, 0x0253, 0x4E01, 0x4E01, 0x0255, 0x4E03, 0x4E03, 0x0256, + 0x4E04, 0x4E04, 0x48FE, 0x4E07, 0x4E07, 0x1771, 0x4E08, 0x4E08, 0x0269, + 0x4E09, 0x4E09, 0x0267, 0x4E0A, 0x4E0A, 0x026A, 0x4E0B, 0x4E0B, 0x0268, + 0x4E0C, 0x4E0C, 0x1772, 0x4E0D, 0x4E0D, 0x0294, 0x4E0E, 0x4E0E, 0x177A, + 0x4E0F, 0x4E0F, 0x1778, 0x4E10, 0x4E10, 0x0293, 0x4E11, 0x4E11, 0x0292, + 0x4E14, 0x4E14, 0x02F2, 0x4E15, 0x4E15, 0x02F1, 0x4E16, 0x4E16, 0x02F0, + 0x4E18, 0x4E18, 0x02F3, 0x4E19, 0x4E19, 0x02EF, 0x4E1A, 0x4E1A, 0x48FD, + 0x4E1C, 0x4E1C, 0x48E0, 0x4E1E, 0x4E1F, 0x036E, 0x4E21, 0x4E21, 0x3D6D, + 0x4E24, 0x4E24, 0x458D, 0x4E26, 0x4E26, 0x0528, 0x4E28, 0x4E28, 0x0218, + 0x4E2A, 0x4E2A, 0x3F57, 0x4E2B, 0x4E2B, 0x026B, 0x4E2C, 0x4E2C, 0x44F3, + 0x4E2D, 0x4E2D, 0x0295, 0x4E2E, 0x4E2E, 0x177B, 0x4E30, 0x4E30, 0x0296, + 0x4E31, 0x4E31, 0x178E, 0x4E32, 0x4E32, 0x0415, 0x4E33, 0x4E33, 0x18F4, + 0x4E36, 0x4E36, 0x0219, 0x4E37, 0x4E37, 0x4517, 0x4E38, 0x4E38, 0x026C, + 0x4E39, 0x4E39, 0x0297, 0x4E3B, 0x4E3B, 0x02F4, 0x4E3C, 0x4E3C, 0x178F, + 0x4E3D, 0x4E3D, 0x4537, 0x4E3F, 0x4E3F, 0x021A, 0x4E41, 0x4E41, 0x36AF, + 0x4E42, 0x4E42, 0x176C, 0x4E43, 0x4E43, 0x0257, 0x4E45, 0x4E45, 0x026E, + 0x4E47, 0x4E47, 0x1773, 0x4E48, 0x4E48, 0x026F, 0x4E49, 0x4E49, 0x408E, + 0x4E4B, 0x4E4B, 0x0298, 0x4E4D, 0x4E4D, 0x02F5, 0x4E4E, 0x4E4E, 0x02F7, + 0x4E4F, 0x4E4F, 0x02F6, 0x4E52, 0x4E53, 0x0370, 0x4E56, 0x4E56, 0x0529, + 0x4E58, 0x4E58, 0x0831, 0x4E59, 0x4E59, 0x0254, 0x4E5A, 0x4E5A, 0x36B1, + 0x4E5B, 0x4E5B, 0x44E5, 0x4E5C, 0x4E5C, 0x176D, 0x4E5D, 0x4E5D, 0x0258, + 0x4E5E, 0x4E5E, 0x0271, 0x4E5F, 0x4E5F, 0x0270, 0x4E69, 0x4E69, 0x0372, + 0x4E6A, 0x4E6A, 0x3DE5, 0x4E73, 0x4E73, 0x052A, 0x4E78, 0x4E78, 0x3D8E, + 0x4E7E, 0x4E7E, 0x09FB, 0x4E7F, 0x4E7F, 0x1E35, 0x4E80, 0x4E80, 0x458E, + 0x4E81, 0x4E81, 0x43BC, 0x4E82, 0x4E82, 0x0DBE, 0x4E83, 0x4E84, 0x2361, + 0x4E85, 0x4E85, 0x021B, 0x4E86, 0x4E86, 0x0259, 0x4E87, 0x4E87, 0x458F, + 0x4E88, 0x4E88, 0x029A, 0x4E89, 0x4E89, 0x459C, 0x4E8B, 0x4E8B, 0x052B, + 0x4E8C, 0x4E8C, 0x025A, 0x4E8D, 0x4E8D, 0x1774, 0x4E8E, 0x4E8E, 0x0272, + 0x4E91, 0x4E91, 0x029B, 0x4E92, 0x4E92, 0x029D, 0x4E93, 0x4E93, 0x177C, + 0x4E94, 0x4E94, 0x029E, 0x4E95, 0x4E95, 0x029C, 0x4E98, 0x4E98, 0x39C4, + 0x4E99, 0x4E99, 0x0373, 0x4E9A, 0x4E9A, 0x48D5, 0x4E9B, 0x4E9B, 0x052C, + 0x4E9E, 0x4E9E, 0x052D, 0x4E9F, 0x4E9F, 0x06A3, 0x4EA0, 0x4EA0, 0x021C, + 0x4EA1, 0x4EA1, 0x0273, 0x4EA2, 0x4EA2, 0x029F, 0x4EA4, 0x4EA4, 0x0374, + 0x4EA5, 0x4EA5, 0x0376, 0x4EA6, 0x4EA6, 0x0375, 0x4EA8, 0x4EA8, 0x0416, + 0x4EAB, 0x4EAC, 0x052E, 0x4EAD, 0x4EAE, 0x06A4, 0x4EB3, 0x4EB3, 0x0832, + 0x4EB6, 0x4EB6, 0x2363, 0x4EB7, 0x4EB7, 0x413C, 0x4EB9, 0x4EB9, 0x3377, + 0x4EBA, 0x4EBA, 0x025B, 0x4EBB, 0x4EBB, 0x44E6, 0x4EBC, 0x4EBC, 0x39B1, + 0x4EBF, 0x4EBF, 0x4590, 0x4EC0, 0x4EC0, 0x02A1, 0x4EC1, 0x4EC1, 0x02A0, + 0x4EC2, 0x4EC2, 0x177D, 0x4EC3, 0x4EC3, 0x02A2, 0x4EC4, 0x4EC4, 0x02A8, + 0x4EC6, 0x4EC7, 0x02A3, 0x4EC8, 0x4EC8, 0x177F, 0x4EC9, 0x4EC9, 0x177E, + 0x4ECA, 0x4ECB, 0x02A6, 0x4ECD, 0x4ECD, 0x02A5, 0x4ECE, 0x4ECE, 0x3F62, + 0x4ED4, 0x4ED7, 0x02FA, 0x4ED8, 0x4ED8, 0x02F9, 0x4ED9, 0x4ED9, 0x0300, + 0x4EDA, 0x4EDA, 0x1795, 0x4EDC, 0x4EDC, 0x1791, 0x4EDD, 0x4EDD, 0x1794, + 0x4EDE, 0x4EDE, 0x0301, 0x4EDF, 0x4EDF, 0x0311, 0x4EE1, 0x4EE1, 0x1793, + 0x4EE3, 0x4EE4, 0x02FE, 0x4EE5, 0x4EE5, 0x02F8, 0x4EE8, 0x4EE8, 0x1790, + 0x4EE9, 0x4EE9, 0x1792, 0x4EEA, 0x4EEA, 0x48CB, 0x4EEB, 0x4EEB, 0x4591, + 0x4EEE, 0x4EEE, 0x3D76, 0x4EF0, 0x4EF0, 0x0383, 0x4EF1, 0x4EF1, 0x17BA, + 0x4EF2, 0x4EF2, 0x0380, 0x4EF3, 0x4EF3, 0x0384, 0x4EF4, 0x4EF4, 0x17C4, + 0x4EF5, 0x4EF5, 0x17B8, 0x4EF6, 0x4EF6, 0x0381, 0x4EF7, 0x4EF7, 0x17BC, + 0x4EF8, 0x4EF8, 0x39AD, 0x4EFB, 0x4EFB, 0x0382, 0x4EFD, 0x4EFD, 0x0385, + 0x4EFF, 0x4EFF, 0x0377, 0x4F00, 0x4F00, 0x17BB, 0x4F01, 0x4F01, 0x0386, + 0x4F02, 0x4F02, 0x17BF, 0x4F03, 0x4F03, 0x39C8, 0x4F04, 0x4F04, 0x17C3, + 0x4F05, 0x4F05, 0x17C0, 0x4F08, 0x4F08, 0x17BD, 0x4F09, 0x4F09, 0x0378, + 0x4F0A, 0x4F0A, 0x037A, 0x4F0B, 0x4F0B, 0x0387, 0x4F0D, 0x4F0D, 0x037C, + 0x4F0E, 0x4F0E, 0x17B5, 0x4F0F, 0x4F0F, 0x037F, 0x4F10, 0x4F11, 0x037D, + 0x4F12, 0x4F12, 0x17C5, 0x4F13, 0x4F13, 0x17C2, 0x4F14, 0x4F14, 0x17B9, + 0x4F15, 0x4F15, 0x037B, 0x4F18, 0x4F18, 0x17B6, 0x4F19, 0x4F19, 0x0379, + 0x4F1A, 0x4F1A, 0x453C, 0x4F1D, 0x4F1D, 0x17BE, 0x4F22, 0x4F22, 0x17C1, + 0x4F28, 0x4F28, 0x453D, 0x4F29, 0x4F29, 0x39BE, 0x4F2C, 0x4F2C, 0x17B7, + 0x4F2D, 0x4F2D, 0x182F, 0x4F2F, 0x4F2F, 0x042C, 0x4F30, 0x4F30, 0x041F, + 0x4F32, 0x4F32, 0x393D, 0x4F33, 0x4F33, 0x1830, 0x4F34, 0x4F34, 0x041C, + 0x4F36, 0x4F36, 0x042E, 0x4F37, 0x4F37, 0x4592, 0x4F38, 0x4F38, 0x0424, + 0x4F39, 0x4F39, 0x3F65, 0x4F3A, 0x4F3A, 0x0423, 0x4F3B, 0x4F3B, 0x1824, + 0x4F3C, 0x4F3C, 0x0427, 0x4F3D, 0x4F3D, 0x0422, 0x4F3E, 0x4F3E, 0x1829, + 0x4F3F, 0x4F3F, 0x1831, 0x4F41, 0x4F41, 0x182D, 0x4F42, 0x4F42, 0x39CB, + 0x4F43, 0x4F43, 0x0425, 0x4F45, 0x4F45, 0x3B8F, 0x4F46, 0x4F46, 0x0428, + 0x4F47, 0x4F47, 0x0419, 0x4F48, 0x4F48, 0x0431, 0x4F49, 0x4F49, 0x1826, + 0x4F4B, 0x4F4B, 0x39B4, 0x4F4C, 0x4F4C, 0x1900, 0x4F4D, 0x4F4D, 0x0417, + 0x4F4E, 0x4F4E, 0x042D, 0x4F4F, 0x4F4F, 0x0418, 0x4F50, 0x4F51, 0x0420, + 0x4F52, 0x4F52, 0x182B, 0x4F53, 0x4F53, 0x1827, 0x4F54, 0x4F54, 0x0426, + 0x4F55, 0x4F55, 0x041E, 0x4F56, 0x4F56, 0x1823, 0x4F57, 0x4F57, 0x041A, + 0x4F58, 0x4F58, 0x182E, 0x4F59, 0x4F59, 0x042F, 0x4F5A, 0x4F5A, 0x0432, + 0x4F5B, 0x4F5B, 0x041D, 0x4F5C, 0x4F5C, 0x042A, 0x4F5D, 0x4F5D, 0x0430, + 0x4F5E, 0x4F5E, 0x041B, 0x4F5F, 0x4F5F, 0x182C, 0x4F60, 0x4F60, 0x042B, + 0x4F61, 0x4F61, 0x1832, 0x4F62, 0x4F62, 0x1825, 0x4F63, 0x4F63, 0x0429, + 0x4F64, 0x4F64, 0x1828, 0x4F67, 0x4F67, 0x182A, 0x4F69, 0x4F69, 0x053D, + 0x4F6A, 0x4F6A, 0x1902, 0x4F6B, 0x4F6B, 0x190E, 0x4F6C, 0x4F6C, 0x0535, + 0x4F6E, 0x4F6E, 0x190F, 0x4F6F, 0x4F6F, 0x0530, 0x4F70, 0x4F70, 0x053A, + 0x4F72, 0x4F72, 0x3C72, 0x4F73, 0x4F73, 0x0533, 0x4F74, 0x4F74, 0x18FC, + 0x4F75, 0x4F75, 0x053B, 0x4F76, 0x4F76, 0x18FB, 0x4F77, 0x4F77, 0x18FF, + 0x4F78, 0x4F78, 0x1906, 0x4F79, 0x4F79, 0x1904, 0x4F7A, 0x4F7A, 0x0543, + 0x4F7B, 0x4F7B, 0x053E, 0x4F7C, 0x4F7C, 0x18F6, 0x4F7D, 0x4F7D, 0x18F8, + 0x4F7E, 0x4F7E, 0x0540, 0x4F7F, 0x4F7F, 0x0534, 0x4F80, 0x4F80, 0x18F9, + 0x4F81, 0x4F81, 0x1905, 0x4F82, 0x4F82, 0x190C, 0x4F83, 0x4F83, 0x0539, + 0x4F84, 0x4F84, 0x18FE, 0x4F85, 0x4F85, 0x18F7, 0x4F86, 0x4F86, 0x0538, + 0x4F87, 0x4F87, 0x18FA, 0x4F88, 0x4F88, 0x053C, 0x4F89, 0x4F89, 0x18FD, + 0x4F8A, 0x4F8A, 0x39B5, 0x4F8B, 0x4F8B, 0x0537, 0x4F8D, 0x4F8D, 0x0532, + 0x4F8F, 0x4F8F, 0x0541, 0x4F90, 0x4F90, 0x1907, 0x4F91, 0x4F91, 0x0542, + 0x4F92, 0x4F92, 0x190B, 0x4F94, 0x4F94, 0x1909, 0x4F95, 0x4F95, 0x190D, + 0x4F96, 0x4F96, 0x053F, 0x4F97, 0x4F97, 0x1901, 0x4F98, 0x4F98, 0x18F5, + 0x4F9A, 0x4F9A, 0x1903, 0x4F9B, 0x4F9B, 0x0536, 0x4F9C, 0x4F9C, 0x1908, + 0x4F9D, 0x4F9D, 0x0531, 0x4F9E, 0x4F9E, 0x190A, 0x4FA2, 0x4FA2, 0x39C7, + 0x4FA8, 0x4FA8, 0x453E, 0x4FAB, 0x4FAB, 0x4022, 0x4FAE, 0x4FAE, 0x06B4, + 0x4FAF, 0x4FAF, 0x06A8, 0x4FB0, 0x4FB0, 0x3D4A, 0x4FB2, 0x4FB2, 0x1A5D, + 0x4FB3, 0x4FB3, 0x1A65, 0x4FB5, 0x4FB5, 0x06A7, 0x4FB6, 0x4FB6, 0x06AF, + 0x4FB7, 0x4FB7, 0x06BB, 0x4FB9, 0x4FB9, 0x1A6B, 0x4FBA, 0x4FBA, 0x1A69, + 0x4FBB, 0x4FBB, 0x1A64, 0x4FBD, 0x4FBD, 0x4594, 0x4FBF, 0x4FBF, 0x06A9, + 0x4FC0, 0x4FC0, 0x1A6A, 0x4FC1, 0x4FC1, 0x1A60, 0x4FC2, 0x4FC2, 0x06B7, + 0x4FC3, 0x4FC3, 0x06AE, 0x4FC4, 0x4FC4, 0x06B6, 0x4FC5, 0x4FC5, 0x1A5B, + 0x4FC7, 0x4FC7, 0x1A67, 0x4FC8, 0x4FC8, 0x46E8, 0x4FC9, 0x4FC9, 0x1A5E, + 0x4FCA, 0x4FCA, 0x06B2, 0x4FCB, 0x4FCB, 0x1A5F, 0x4FCC, 0x4FCC, 0x39CF, + 0x4FCD, 0x4FCD, 0x1A5A, 0x4FCE, 0x4FCE, 0x06B9, 0x4FCF, 0x4FCF, 0x06AC, + 0x4FD0, 0x4FD0, 0x06B5, 0x4FD1, 0x4FD1, 0x06AB, 0x4FD3, 0x4FD3, 0x1A5C, + 0x4FD4, 0x4FD4, 0x1A61, 0x4FD6, 0x4FD6, 0x1A68, 0x4FD7, 0x4FD7, 0x06B3, + 0x4FD8, 0x4FD8, 0x06B0, 0x4FD9, 0x4FD9, 0x1A63, 0x4FDA, 0x4FDA, 0x06B8, + 0x4FDB, 0x4FDB, 0x1A66, 0x4FDC, 0x4FDC, 0x1A62, 0x4FDD, 0x4FDD, 0x06AD, + 0x4FDE, 0x4FDE, 0x06BA, 0x4FDF, 0x4FDF, 0x06B1, 0x4FE0, 0x4FE0, 0x06AA, + 0x4FE1, 0x4FE1, 0x06A6, 0x4FE4, 0x4FE4, 0x3C66, 0x4FE5, 0x4FE5, 0x39D0, + 0x4FEC, 0x4FEC, 0x1A6C, 0x4FEE, 0x4FEE, 0x084C, 0x4FEF, 0x4FEF, 0x0836, + 0x4FF1, 0x4FF1, 0x0846, 0x4FF2, 0x4FF2, 0x3F28, 0x4FF3, 0x4FF3, 0x084B, + 0x4FF4, 0x4FF4, 0x1C24, 0x4FF5, 0x4FF5, 0x1C23, 0x4FF6, 0x4FF7, 0x1C28, + 0x4FF8, 0x4FF8, 0x0839, 0x4FF9, 0x4FF9, 0x37B3, 0x4FFA, 0x4FFA, 0x0842, + 0x4FFD, 0x4FFD, 0x3F26, 0x4FFE, 0x4FFE, 0x084F, 0x5000, 0x5000, 0x0843, + 0x5003, 0x5003, 0x4596, 0x5005, 0x5005, 0x1C1D, 0x5006, 0x5006, 0x083C, + 0x5007, 0x5007, 0x1C1E, 0x5008, 0x5008, 0x4024, 0x5009, 0x5009, 0x0851, + 0x500B, 0x500B, 0x0848, 0x500C, 0x500D, 0x0833, 0x500E, 0x500E, 0x1C31, + 0x500F, 0x500F, 0x0A0C, 0x5011, 0x5011, 0x0841, 0x5012, 0x5012, 0x0840, + 0x5013, 0x5013, 0x1C1F, 0x5014, 0x5014, 0x0844, 0x5015, 0x5015, 0x1E45, + 0x5016, 0x5016, 0x083B, 0x5017, 0x5017, 0x1C2A, 0x5018, 0x5018, 0x084A, + 0x5019, 0x5019, 0x0849, 0x501A, 0x501A, 0x083F, 0x501B, 0x501B, 0x1C22, + 0x501C, 0x501C, 0x1C2B, 0x501E, 0x501E, 0x1C1C, 0x501F, 0x501F, 0x083E, + 0x5020, 0x5020, 0x1C2C, 0x5021, 0x5021, 0x0847, 0x5022, 0x5022, 0x1C20, + 0x5023, 0x5023, 0x0835, 0x5025, 0x5025, 0x0838, 0x5026, 0x5026, 0x0837, + 0x5027, 0x5027, 0x1C2D, 0x5028, 0x5028, 0x0845, 0x5029, 0x5029, 0x083A, + 0x502A, 0x502A, 0x084E, 0x502B, 0x502B, 0x0850, 0x502C, 0x502C, 0x1C27, + 0x502D, 0x502D, 0x084D, 0x502E, 0x502E, 0x39CC, 0x502F, 0x502F, 0x1C2F, + 0x5030, 0x5030, 0x1C21, 0x5031, 0x5031, 0x1C30, 0x5033, 0x5033, 0x1C25, + 0x5034, 0x5034, 0x3910, 0x5035, 0x5035, 0x1C2E, 0x5037, 0x5037, 0x1C26, + 0x503C, 0x503C, 0x083D, 0x5040, 0x5040, 0x1E4D, 0x5041, 0x5041, 0x1E41, + 0x5043, 0x5043, 0x0A00, 0x5045, 0x5045, 0x1E46, 0x5046, 0x5046, 0x1E4C, + 0x5047, 0x5047, 0x09FF, 0x5048, 0x5048, 0x1E3F, 0x5049, 0x5049, 0x0A03, + 0x504A, 0x504A, 0x1E43, 0x504B, 0x504B, 0x1E3C, 0x504C, 0x504C, 0x0A01, + 0x504D, 0x504D, 0x1E40, 0x504E, 0x504E, 0x0A06, 0x504F, 0x504F, 0x0A0B, + 0x5051, 0x5051, 0x1E51, 0x5053, 0x5053, 0x1E3B, 0x5055, 0x5055, 0x0A07, + 0x5056, 0x5056, 0x3F2C, 0x5057, 0x5057, 0x1E50, 0x5058, 0x5058, 0x39D1, + 0x505A, 0x505A, 0x0A02, 0x505B, 0x505B, 0x1E42, 0x505C, 0x505C, 0x09FE, + 0x505D, 0x505D, 0x1E3D, 0x505E, 0x505E, 0x1E39, 0x505F, 0x505F, 0x1E47, + 0x5060, 0x5060, 0x1E3A, 0x5061, 0x5061, 0x1E38, 0x5062, 0x5062, 0x1E44, + 0x5063, 0x5064, 0x1E4A, 0x5065, 0x5065, 0x0A04, 0x5066, 0x5066, 0x3DC9, + 0x5068, 0x5068, 0x20B8, 0x5069, 0x5069, 0x1E48, 0x506A, 0x506A, 0x1E37, + 0x506B, 0x506B, 0x1E49, 0x506C, 0x506C, 0x39CD, 0x506D, 0x506D, 0x0A0E, + 0x506E, 0x506E, 0x1E4E, 0x506F, 0x506F, 0x0A0D, 0x5070, 0x5070, 0x1E36, + 0x5072, 0x5072, 0x1E3E, 0x5073, 0x5073, 0x1E4F, 0x5074, 0x5074, 0x0A09, + 0x5075, 0x5075, 0x0A08, 0x5076, 0x5076, 0x0A05, 0x5077, 0x5077, 0x0A0A, + 0x507A, 0x507A, 0x09FC, 0x507D, 0x507D, 0x09FD, 0x5080, 0x5080, 0x0BEC, + 0x5081, 0x5081, 0x39CE, 0x5082, 0x5082, 0x20BB, 0x5083, 0x5083, 0x20B4, + 0x5085, 0x5085, 0x0BE9, 0x5087, 0x5087, 0x20BC, 0x5088, 0x5088, 0x439C, + 0x508B, 0x508B, 0x20B2, 0x508C, 0x508C, 0x20B5, 0x508D, 0x508D, 0x0BE8, + 0x508E, 0x508E, 0x20B6, 0x5090, 0x5090, 0x41EC, 0x5091, 0x5091, 0x0BEB, + 0x5092, 0x5092, 0x20BA, 0x5094, 0x5094, 0x20B0, 0x5095, 0x5095, 0x20AF, + 0x5096, 0x5096, 0x0BED, 0x5098, 0x5098, 0x0BEE, 0x5099, 0x5099, 0x0BEA, + 0x509A, 0x509A, 0x0BEF, 0x509B, 0x509B, 0x20AE, 0x509C, 0x509C, 0x20B9, + 0x509D, 0x509D, 0x20B7, 0x509E, 0x509E, 0x20B1, 0x50A2, 0x50A2, 0x0BE7, + 0x50A3, 0x50A3, 0x20B3, 0x50A6, 0x50A6, 0x3F3F, 0x50AC, 0x50AC, 0x0DC5, + 0x50AD, 0x50AD, 0x0DBF, 0x50AE, 0x50AE, 0x2367, 0x50AF, 0x50AF, 0x0DC8, + 0x50B0, 0x50B0, 0x236D, 0x50B1, 0x50B1, 0x2370, 0x50B2, 0x50B3, 0x0DC1, + 0x50B4, 0x50B4, 0x236A, 0x50B5, 0x50B5, 0x0DC0, 0x50B6, 0x50B6, 0x2373, + 0x50B7, 0x50B7, 0x0DC6, 0x50B8, 0x50B8, 0x2374, 0x50BA, 0x50BA, 0x236F, + 0x50BB, 0x50BB, 0x0DC7, 0x50BD, 0x50BD, 0x2364, 0x50BE, 0x50BE, 0x0DC4, + 0x50BF, 0x50BF, 0x2365, 0x50C1, 0x50C1, 0x236E, 0x50C2, 0x50C2, 0x236C, + 0x50C4, 0x50C4, 0x2368, 0x50C5, 0x50C5, 0x0DC3, 0x50C6, 0x50C6, 0x2366, + 0x50C7, 0x50C7, 0x0DC9, 0x50C8, 0x50C8, 0x236B, 0x50C9, 0x50C9, 0x2372, + 0x50CA, 0x50CA, 0x2369, 0x50CB, 0x50CB, 0x2371, 0x50CD, 0x50CD, 0x39C5, + 0x50CE, 0x50CE, 0x0F88, 0x50CF, 0x50CF, 0x0F85, 0x50D0, 0x50D0, 0x38D1, + 0x50D1, 0x50D1, 0x0F86, 0x50D3, 0x50D3, 0x261C, 0x50D4, 0x50D4, 0x2614, + 0x50D5, 0x50D5, 0x0F84, 0x50D6, 0x50D6, 0x0F81, 0x50D7, 0x50D7, 0x2615, + 0x50D9, 0x50D9, 0x3FCE, 0x50DA, 0x50DA, 0x0F83, 0x50DB, 0x50DB, 0x2618, + 0x50DD, 0x50DD, 0x261A, 0x50DE, 0x50DE, 0x4031, 0x50DF, 0x50DF, 0x3AFD, + 0x50E0, 0x50E0, 0x2621, 0x50E1, 0x50E1, 0x4171, 0x50E3, 0x50E3, 0x2620, + 0x50E4, 0x50E4, 0x261B, 0x50E5, 0x50E5, 0x0F80, 0x50E6, 0x50E6, 0x2613, + 0x50E7, 0x50E7, 0x0F7E, 0x50E8, 0x50E8, 0x2616, 0x50E9, 0x50E9, 0x0F89, + 0x50EA, 0x50EA, 0x2619, 0x50EC, 0x50EC, 0x261D, 0x50ED, 0x50ED, 0x0F82, + 0x50EE, 0x50EE, 0x0F7F, 0x50EF, 0x50EF, 0x261F, 0x50F0, 0x50F0, 0x261E, + 0x50F1, 0x50F1, 0x0F87, 0x50F3, 0x50F3, 0x2617, 0x50F4, 0x50F4, 0x3CE9, + 0x50F5, 0x50F5, 0x1105, 0x50F6, 0x50F6, 0x2883, 0x50F8, 0x50F8, 0x2880, + 0x50F9, 0x50F9, 0x1106, 0x50FB, 0x50FB, 0x1104, 0x50FC, 0x50FC, 0x39D2, + 0x50FD, 0x50FD, 0x2887, 0x50FE, 0x50FE, 0x2884, 0x50FF, 0x50FF, 0x287D, + 0x5100, 0x5100, 0x1103, 0x5101, 0x5101, 0x4032, 0x5102, 0x5102, 0x1107, + 0x5103, 0x5103, 0x287E, 0x5104, 0x5104, 0x1102, 0x5105, 0x5105, 0x110A, + 0x5106, 0x5107, 0x2881, 0x5108, 0x5109, 0x1108, 0x510A, 0x510A, 0x2888, + 0x510B, 0x510C, 0x2885, 0x510D, 0x510D, 0x39C6, 0x510E, 0x510E, 0x4034, + 0x5110, 0x5110, 0x128D, 0x5111, 0x5111, 0x2B04, 0x5112, 0x5112, 0x128A, + 0x5113, 0x5113, 0x2B01, 0x5114, 0x5114, 0x128C, 0x5115, 0x5115, 0x128E, + 0x5117, 0x5117, 0x2B02, 0x5118, 0x5118, 0x128B, 0x511A, 0x511A, 0x2B03, + 0x511C, 0x511C, 0x2B00, 0x511F, 0x511F, 0x13B5, 0x5120, 0x5120, 0x2D3E, + 0x5121, 0x5121, 0x13B6, 0x5122, 0x5122, 0x2D3C, 0x5124, 0x5124, 0x2D3D, + 0x5125, 0x5125, 0x2D3B, 0x5126, 0x5126, 0x2D3A, 0x5129, 0x5129, 0x2D3F, + 0x512A, 0x512A, 0x13B4, 0x512B, 0x512B, 0x39AE, 0x512D, 0x512E, 0x2F0F, + 0x5130, 0x5130, 0x287F, 0x5131, 0x5131, 0x2F0E, 0x5132, 0x5132, 0x13B7, + 0x5133, 0x5133, 0x1575, 0x5134, 0x5135, 0x307A, 0x5137, 0x5138, 0x1668, + 0x5139, 0x5139, 0x32C6, 0x513A, 0x513A, 0x32C5, 0x513B, 0x513B, 0x16BC, + 0x513C, 0x513C, 0x16BB, 0x513D, 0x513D, 0x340E, 0x513F, 0x513F, 0x025C, + 0x5140, 0x5140, 0x0274, 0x5141, 0x5141, 0x02AA, 0x5143, 0x5143, 0x02A9, + 0x5144, 0x5144, 0x0303, 0x5145, 0x5145, 0x0302, 0x5146, 0x5146, 0x038A, + 0x5147, 0x5147, 0x0389, 0x5148, 0x5148, 0x038B, 0x5149, 0x5149, 0x0388, + 0x514B, 0x514B, 0x0434, 0x514C, 0x514C, 0x0433, 0x514D, 0x514D, 0x0435, + 0x5152, 0x5152, 0x0545, 0x5154, 0x5154, 0x0544, 0x5155, 0x5155, 0x0546, + 0x5156, 0x5156, 0x439A, 0x5157, 0x5157, 0x06BC, 0x5159, 0x5159, 0x0119, + 0x515A, 0x515A, 0x1C32, 0x515B, 0x515B, 0x011A, 0x515C, 0x515C, 0x0A0F, + 0x515D, 0x515D, 0x011C, 0x515E, 0x515E, 0x011B, 0x515F, 0x515F, 0x20BD, + 0x5160, 0x5160, 0x403A, 0x5161, 0x5161, 0x011D, 0x5162, 0x5162, 0x0F8A, + 0x5163, 0x5163, 0x011E, 0x5165, 0x5165, 0x025D, 0x5167, 0x5167, 0x02AB, + 0x5168, 0x5168, 0x038C, 0x5169, 0x5169, 0x0547, 0x516A, 0x516A, 0x403C, + 0x516B, 0x516B, 0x025E, 0x516C, 0x516C, 0x02AE, 0x516D, 0x516E, 0x02AC, + 0x5171, 0x5171, 0x038D, 0x5174, 0x5174, 0x453F, 0x5175, 0x5175, 0x0436, + 0x5176, 0x5176, 0x0549, 0x5177, 0x5177, 0x0548, 0x5178, 0x5178, 0x054A, + 0x5179, 0x5179, 0x3ACE, 0x517C, 0x517C, 0x0852, 0x5180, 0x5180, 0x128F, + 0x5182, 0x5182, 0x021D, 0x5186, 0x5186, 0x439F, 0x5187, 0x5187, 0x1779, + 0x5188, 0x5188, 0x36B6, 0x5189, 0x518A, 0x0304, 0x518D, 0x518D, 0x038E, + 0x518F, 0x518F, 0x1833, 0x5191, 0x5191, 0x06BE, 0x5192, 0x5192, 0x06BD, + 0x5193, 0x5193, 0x1C34, 0x5194, 0x5194, 0x1C33, 0x5195, 0x5195, 0x0A10, + 0x5196, 0x5196, 0x021E, 0x5197, 0x5197, 0x02AF, 0x5198, 0x5198, 0x1780, + 0x519A, 0x519A, 0x3EA3, 0x519C, 0x519C, 0x4540, 0x519E, 0x519E, 0x1910, + 0x51A0, 0x51A0, 0x06BF, 0x51A2, 0x51A2, 0x0855, 0x51A4, 0x51A5, 0x0853, + 0x51A7, 0x51A7, 0x3EA6, 0x51A8, 0x51A8, 0x39DA, 0x51AA, 0x51AA, 0x1290, + 0x51AB, 0x51AB, 0x021F, 0x51AC, 0x51AC, 0x0306, 0x51B0, 0x51B0, 0x038F, + 0x51B1, 0x51B1, 0x17C6, 0x51B2, 0x51B2, 0x4048, 0x51B3, 0x51B3, 0x4051, + 0x51B4, 0x51B4, 0x3D7C, 0x51B5, 0x51B5, 0x4012, 0x51B6, 0x51B7, 0x0437, + 0x51B8, 0x51B8, 0x4049, 0x51B9, 0x51B9, 0x1834, 0x51BC, 0x51BC, 0x1911, + 0x51BD, 0x51BD, 0x054B, 0x51BE, 0x51BE, 0x1912, 0x51C3, 0x51C3, 0x39DB, + 0x51C4, 0x51C5, 0x1C36, 0x51C6, 0x51C6, 0x0858, 0x51C7, 0x51C7, 0x422A, + 0x51C8, 0x51C8, 0x1C38, 0x51C9, 0x51C9, 0x404B, 0x51CA, 0x51CA, 0x1C35, + 0x51CB, 0x51CB, 0x0859, 0x51CC, 0x51CC, 0x0857, 0x51CD, 0x51CD, 0x0856, + 0x51CE, 0x51CE, 0x1C39, 0x51CF, 0x51CF, 0x404C, 0x51D0, 0x51D0, 0x1E52, + 0x51D1, 0x51D1, 0x404D, 0x51D2, 0x51D2, 0x3DAD, 0x51D3, 0x51D3, 0x404F, + 0x51D4, 0x51D4, 0x20BE, 0x51D7, 0x51D7, 0x2375, 0x51D8, 0x51D8, 0x2622, + 0x51DB, 0x51DB, 0x459A, 0x51DC, 0x51DC, 0x110B, 0x51DD, 0x51DD, 0x1291, + 0x51DE, 0x51DE, 0x2B05, 0x51DF, 0x51DF, 0x424F, 0x51E0, 0x51E0, 0x025F, + 0x51E1, 0x51E1, 0x026D, 0x51E2, 0x51E2, 0x4052, 0x51E4, 0x51E4, 0x4541, + 0x51ED, 0x51ED, 0x4054, 0x51F0, 0x51F0, 0x0A11, 0x51F1, 0x51F1, 0x0BF1, + 0x51F3, 0x51F3, 0x0F8B, 0x51F4, 0x51F4, 0x4178, 0x51F5, 0x51F5, 0x176E, + 0x51F6, 0x51F6, 0x02B0, 0x51F8, 0x51F8, 0x0309, 0x51F9, 0x51FA, 0x0307, + 0x51FC, 0x51FC, 0x459B, 0x51FD, 0x51FD, 0x054C, 0x51FE, 0x51FE, 0x3F0A, + 0x5200, 0x5201, 0x0260, 0x5202, 0x5202, 0x36B3, 0x5203, 0x5203, 0x0275, + 0x5205, 0x5205, 0x43A1, 0x5206, 0x5208, 0x02B1, 0x5209, 0x5209, 0x1797, + 0x520A, 0x520A, 0x030A, 0x520B, 0x520B, 0x4059, 0x520C, 0x520C, 0x1796, + 0x520E, 0x520E, 0x0393, 0x5210, 0x5210, 0x17C8, 0x5211, 0x5212, 0x0391, + 0x5213, 0x5213, 0x17C7, 0x5216, 0x5216, 0x0394, 0x5217, 0x5217, 0x0390, + 0x521C, 0x521C, 0x1835, 0x521D, 0x521D, 0x068B, 0x521E, 0x521E, 0x1836, + 0x521F, 0x521F, 0x3F60, 0x5220, 0x5220, 0x4930, 0x5221, 0x5221, 0x1837, + 0x5224, 0x5224, 0x043A, 0x5225, 0x5225, 0x0439, 0x5226, 0x5226, 0x405A, + 0x5227, 0x5227, 0x43A2, 0x5228, 0x5228, 0x043D, 0x5229, 0x522A, 0x043B, + 0x522E, 0x522E, 0x0552, 0x5230, 0x5230, 0x0551, 0x5231, 0x5231, 0x1917, + 0x5232, 0x5233, 0x1914, 0x5234, 0x5234, 0x3EFB, 0x5235, 0x5235, 0x1913, + 0x5236, 0x5236, 0x0553, 0x5237, 0x5237, 0x054F, 0x5238, 0x5238, 0x054E, + 0x523A, 0x523A, 0x0550, 0x523B, 0x523B, 0x054D, 0x523C, 0x523C, 0x405B, + 0x5241, 0x5241, 0x0554, 0x5243, 0x5243, 0x06C1, 0x5244, 0x5244, 0x1A6D, + 0x5246, 0x5246, 0x1916, 0x5247, 0x5247, 0x06C6, 0x5249, 0x5249, 0x1A6E, + 0x524A, 0x524A, 0x06C2, 0x524B, 0x524B, 0x06C5, 0x524C, 0x524C, 0x06C4, + 0x524D, 0x524D, 0x06C3, 0x524E, 0x524E, 0x06C0, 0x5252, 0x5252, 0x1C3C, + 0x5254, 0x5254, 0x085C, 0x5255, 0x5255, 0x1C3F, 0x5256, 0x5256, 0x085A, + 0x5257, 0x5257, 0x405D, 0x5259, 0x5259, 0x39E4, 0x525A, 0x525A, 0x1C3B, + 0x525B, 0x525B, 0x085D, 0x525C, 0x525C, 0x085B, 0x525D, 0x525D, 0x085E, + 0x525E, 0x525F, 0x1C3D, 0x5260, 0x5260, 0x3F29, 0x5261, 0x5261, 0x1C3A, + 0x5262, 0x5262, 0x1C40, 0x5268, 0x5268, 0x4619, 0x5269, 0x5269, 0x0BF5, + 0x526A, 0x526A, 0x0A12, 0x526B, 0x526B, 0x1E53, 0x526C, 0x526C, 0x1E55, + 0x526D, 0x526D, 0x1E54, 0x526E, 0x526E, 0x1E56, 0x526F, 0x526F, 0x0A13, + 0x5272, 0x5272, 0x0BF2, 0x5273, 0x5273, 0x3F43, 0x5274, 0x5275, 0x0BF3, + 0x5277, 0x5277, 0x0DCB, 0x5278, 0x5278, 0x2377, 0x5279, 0x5279, 0x43A3, + 0x527A, 0x527A, 0x2376, 0x527B, 0x527C, 0x2378, 0x527D, 0x527D, 0x0DCC, + 0x527F, 0x527F, 0x0DCA, 0x5280, 0x5281, 0x2623, 0x5282, 0x5282, 0x0F8D, + 0x5283, 0x5283, 0x0F8C, 0x5284, 0x5284, 0x2776, 0x5287, 0x5289, 0x110C, + 0x528A, 0x528A, 0x1110, 0x528B, 0x528C, 0x2889, 0x528D, 0x528D, 0x110F, + 0x528F, 0x528F, 0x3DBF, 0x5290, 0x5290, 0x459D, 0x5291, 0x5291, 0x1292, + 0x5293, 0x5293, 0x1293, 0x5294, 0x5294, 0x405E, 0x5296, 0x5296, 0x307C, + 0x5297, 0x5297, 0x32C8, 0x5298, 0x5298, 0x32C7, 0x5299, 0x5299, 0x340F, + 0x529A, 0x529A, 0x3F68, 0x529B, 0x529B, 0x0262, 0x529F, 0x529F, 0x030C, + 0x52A0, 0x52A0, 0x030B, 0x52A1, 0x52A1, 0x4542, 0x52A3, 0x52A3, 0x0395, + 0x52A4, 0x52A4, 0x39E5, 0x52A6, 0x52A6, 0x17C9, 0x52A8, 0x52A8, 0x4543, + 0x52A9, 0x52AA, 0x043F, 0x52AB, 0x52AB, 0x043E, 0x52AC, 0x52AC, 0x0441, + 0x52AD, 0x52AE, 0x1838, 0x52B5, 0x52B5, 0x405C, 0x52B9, 0x52B9, 0x405F, + 0x52BB, 0x52BB, 0x0556, 0x52BC, 0x52BC, 0x1918, 0x52BE, 0x52BE, 0x0555, + 0x52C0, 0x52C0, 0x1A6F, 0x52C1, 0x52C1, 0x06CA, 0x52C2, 0x52C2, 0x1A70, + 0x52C3, 0x52C3, 0x06C9, 0x52C5, 0x52C5, 0x4060, 0x52C7, 0x52C7, 0x06C7, + 0x52C9, 0x52C9, 0x06C8, 0x52CC, 0x52CC, 0x3EE1, 0x52CD, 0x52CD, 0x1C41, + 0x52D0, 0x52D0, 0x4109, 0x52D1, 0x52D1, 0x3F2A, 0x52D2, 0x52D2, 0x0A14, + 0x52D3, 0x52D3, 0x1E58, 0x52D5, 0x52D5, 0x0A17, 0x52D6, 0x52D6, 0x1E57, + 0x52D7, 0x52D7, 0x0ACF, 0x52D8, 0x52D8, 0x0A16, 0x52D9, 0x52D9, 0x0A15, + 0x52DB, 0x52DB, 0x0BF8, 0x52DD, 0x52DD, 0x0BF7, 0x52DE, 0x52DE, 0x0BF6, + 0x52DF, 0x52DF, 0x0DCD, 0x52E0, 0x52E0, 0x4063, 0x52E1, 0x52E1, 0x39E7, + 0x52E2, 0x52E3, 0x0DD0, 0x52E4, 0x52E4, 0x0DCF, 0x52E6, 0x52E6, 0x0DCE, + 0x52E9, 0x52E9, 0x2625, 0x52EB, 0x52EB, 0x2626, 0x52EF, 0x52EF, 0x288C, + 0x52F0, 0x52F0, 0x1111, 0x52F1, 0x52F1, 0x288B, 0x52F3, 0x52F3, 0x1294, + 0x52F4, 0x52F4, 0x2D40, 0x52F5, 0x52F5, 0x13B8, 0x52F7, 0x52F7, 0x307D, + 0x52F8, 0x52F8, 0x1609, 0x52F9, 0x52F9, 0x0220, 0x52FA, 0x52FA, 0x0276, + 0x52FB, 0x52FB, 0x02B4, 0x52FC, 0x52FC, 0x1781, 0x52FE, 0x52FF, 0x02B5, + 0x5301, 0x5301, 0x3D79, 0x5305, 0x5306, 0x030D, 0x5308, 0x5308, 0x0396, + 0x5309, 0x5309, 0x183A, 0x530A, 0x530B, 0x1919, 0x530D, 0x530D, 0x06CB, + 0x530E, 0x530E, 0x1C42, 0x530F, 0x530F, 0x0A19, 0x5310, 0x5310, 0x0A18, + 0x5311, 0x5311, 0x20C0, 0x5312, 0x5312, 0x20BF, 0x5315, 0x5315, 0x0263, + 0x5316, 0x5316, 0x02B7, 0x5317, 0x5317, 0x030F, 0x5319, 0x5319, 0x0A1A, + 0x531A, 0x531A, 0x176F, 0x531C, 0x531C, 0x1798, 0x531D, 0x531D, 0x0310, + 0x531F, 0x531F, 0x17CB, 0x5320, 0x5320, 0x0398, 0x5321, 0x5321, 0x0397, + 0x5322, 0x5322, 0x17CA, 0x5323, 0x5323, 0x0442, 0x5327, 0x5327, 0x459E, + 0x532A, 0x532A, 0x085F, 0x532C, 0x532C, 0x3F36, 0x532D, 0x532D, 0x1E59, + 0x532F, 0x532F, 0x0DD2, 0x5330, 0x5330, 0x2627, 0x5331, 0x5331, 0x0F8E, + 0x5332, 0x5332, 0x3FD0, 0x5333, 0x5333, 0x406D, 0x5334, 0x5334, 0x2B06, + 0x5337, 0x5337, 0x31C7, 0x5338, 0x5338, 0x0221, 0x5339, 0x5339, 0x02B8, + 0x533B, 0x533B, 0x4544, 0x533C, 0x533C, 0x191B, 0x533D, 0x533D, 0x1A71, + 0x533E, 0x533E, 0x0A1D, 0x533F, 0x5340, 0x0A1B, 0x5341, 0x5341, 0x0264, + 0x5342, 0x5342, 0x4947, 0x5343, 0x5343, 0x0277, 0x5344, 0x5344, 0x016B, + 0x5345, 0x5345, 0x02BB, 0x5347, 0x5347, 0x02BA, 0x5348, 0x5348, 0x02B9, + 0x5349, 0x5349, 0x0313, 0x534A, 0x534A, 0x0312, 0x534C, 0x534C, 0x1799, + 0x534D, 0x534D, 0x17CC, 0x534E, 0x534E, 0x4545, 0x5351, 0x5351, 0x055A, + 0x5352, 0x5352, 0x0557, 0x5353, 0x5353, 0x0559, 0x5354, 0x5354, 0x0558, + 0x5357, 0x5357, 0x06CC, 0x535A, 0x535A, 0x0BF9, 0x535C, 0x535C, 0x0265, + 0x535D, 0x535D, 0x4501, 0x535E, 0x535E, 0x02BC, 0x535F, 0x535F, 0x43A7, + 0x5360, 0x5360, 0x0315, 0x5361, 0x5361, 0x0314, 0x5363, 0x5363, 0x183B, + 0x5364, 0x5364, 0x480A, 0x5366, 0x5366, 0x055B, 0x5367, 0x5367, 0x3ECD, + 0x5369, 0x5369, 0x0222, 0x536C, 0x536C, 0x1782, 0x536D, 0x536D, 0x407A, + 0x536E, 0x536E, 0x0317, 0x536F, 0x536F, 0x0316, 0x5370, 0x5371, 0x0399, + 0x5372, 0x5372, 0x183C, 0x5373, 0x5373, 0x0443, 0x5374, 0x5374, 0x407B, + 0x5375, 0x5375, 0x0444, 0x5377, 0x5379, 0x055C, 0x537B, 0x537B, 0x06CD, + 0x537C, 0x537C, 0x1A72, 0x537D, 0x537D, 0x4901, 0x537E, 0x537E, 0x407D, + 0x537F, 0x537F, 0x0860, 0x5382, 0x5382, 0x1770, 0x5384, 0x5384, 0x02BD, + 0x538A, 0x538A, 0x17CD, 0x538E, 0x538F, 0x183D, 0x5392, 0x5392, 0x191C, + 0x5393, 0x5393, 0x4082, 0x5394, 0x5394, 0x191D, 0x5396, 0x5396, 0x1A74, + 0x5397, 0x5397, 0x1A73, 0x5398, 0x5398, 0x1A76, 0x5399, 0x5399, 0x1A75, + 0x539A, 0x539A, 0x06CE, 0x539C, 0x539C, 0x1E5A, 0x539D, 0x539D, 0x0862, + 0x539E, 0x539E, 0x1C43, 0x539F, 0x539F, 0x0861, 0x53A0, 0x53A0, 0x4084, + 0x53A2, 0x53A2, 0x3E2B, 0x53A4, 0x53A4, 0x20C1, 0x53A5, 0x53A5, 0x0BFA, + 0x53A6, 0x53A6, 0x413B, 0x53A7, 0x53A7, 0x20C2, 0x53A8, 0x53A8, 0x413E, + 0x53A9, 0x53A9, 0x45A0, 0x53AA, 0x53AA, 0x3FC6, 0x53AB, 0x53AB, 0x4085, + 0x53AC, 0x53AC, 0x2628, 0x53AD, 0x53AD, 0x0F8F, 0x53AE, 0x53AE, 0x4086, + 0x53B0, 0x53B0, 0x45A2, 0x53B2, 0x53B2, 0x1112, 0x53B4, 0x53B4, 0x307E, + 0x53B6, 0x53B6, 0x0223, 0x53B9, 0x53B9, 0x1783, 0x53BB, 0x53BB, 0x0318, + 0x53C1, 0x53C1, 0x408B, 0x53C2, 0x53C2, 0x43A6, 0x53C3, 0x53C3, 0x0A1E, + 0x53C5, 0x53C5, 0x408C, 0x53C8, 0x53C8, 0x0266, 0x53C9, 0x53C9, 0x0278, + 0x53CA, 0x53CA, 0x02BF, 0x53CB, 0x53CB, 0x02BE, 0x53CC, 0x53CC, 0x38B6, + 0x53CD, 0x53CD, 0x02C0, 0x53D0, 0x53D0, 0x39FA, 0x53D1, 0x53D1, 0x4546, + 0x53D2, 0x53D2, 0x3E3D, 0x53D4, 0x53D4, 0x0560, 0x53D6, 0x53D6, 0x055F, + 0x53D7, 0x53D7, 0x0561, 0x53D8, 0x53D8, 0x4547, 0x53D9, 0x53D9, 0x4090, + 0x53DA, 0x53DA, 0x3F39, 0x53DB, 0x53DB, 0x06CF, 0x53DF, 0x53DF, 0x0863, + 0x53E0, 0x53E0, 0x4093, 0x53E1, 0x53E1, 0x2B07, 0x53E2, 0x53E2, 0x14C9, + 0x53E3, 0x53E3, 0x0279, 0x53E4, 0x53E4, 0x031A, 0x53E5, 0x53E5, 0x0329, + 0x53E6, 0x53E6, 0x0324, 0x53E8, 0x53E8, 0x031F, 0x53E9, 0x53E9, 0x031E, + 0x53EA, 0x53EA, 0x0325, 0x53EB, 0x53EB, 0x0323, 0x53EC, 0x53EC, 0x031C, + 0x53ED, 0x53ED, 0x032A, 0x53EE, 0x53EE, 0x031D, 0x53EF, 0x53EF, 0x0319, + 0x53F0, 0x53F0, 0x0328, 0x53F1, 0x53F1, 0x0327, 0x53F2, 0x53F2, 0x0326, + 0x53F3, 0x53F3, 0x031B, 0x53F5, 0x53F5, 0x0322, 0x53F6, 0x53F6, 0x4096, + 0x53F7, 0x53F7, 0x3808, 0x53F8, 0x53F8, 0x0321, 0x53FB, 0x53FB, 0x032B, + 0x53FC, 0x53FC, 0x0320, 0x53FE, 0x53FE, 0x40C1, 0x5401, 0x5401, 0x03A0, + 0x5403, 0x5403, 0x03A6, 0x5404, 0x5404, 0x03A2, 0x5406, 0x5406, 0x03A8, + 0x5407, 0x5407, 0x17CE, 0x5408, 0x5408, 0x03A5, 0x5409, 0x5409, 0x039B, + 0x540A, 0x540A, 0x039E, 0x540B, 0x540B, 0x03A1, 0x540C, 0x540C, 0x039D, + 0x540D, 0x540D, 0x03A4, 0x540E, 0x540E, 0x03A7, 0x540F, 0x540F, 0x039C, + 0x5410, 0x5410, 0x039F, 0x5411, 0x5411, 0x03A3, 0x5412, 0x5412, 0x03A9, + 0x5413, 0x5413, 0x4098, 0x5414, 0x5414, 0x3C77, 0x5416, 0x5416, 0x3E7F, + 0x5418, 0x5418, 0x1847, 0x5419, 0x5419, 0x1844, 0x541A, 0x541A, 0x3E64, + 0x541B, 0x541B, 0x0451, 0x541C, 0x541C, 0x1845, 0x541D, 0x541D, 0x0445, + 0x541E, 0x541E, 0x0447, 0x541F, 0x541F, 0x045F, 0x5420, 0x5420, 0x045A, + 0x5421, 0x5421, 0x4203, 0x5423, 0x5423, 0x45A3, 0x5424, 0x5424, 0x184C, + 0x5425, 0x5425, 0x1846, 0x5426, 0x5426, 0x0449, 0x5427, 0x5427, 0x044B, + 0x5428, 0x5428, 0x184B, 0x5429, 0x5429, 0x0452, 0x542A, 0x542A, 0x1841, + 0x542B, 0x542B, 0x045E, 0x542C, 0x542C, 0x0460, 0x542D, 0x542D, 0x0446, + 0x542E, 0x542E, 0x0457, 0x542F, 0x542F, 0x40AC, 0x5430, 0x5430, 0x183F, + 0x5431, 0x5431, 0x045D, 0x5432, 0x5432, 0x3E75, 0x5433, 0x5433, 0x044E, + 0x5435, 0x5436, 0x0458, 0x5437, 0x5437, 0x1840, 0x5438, 0x5438, 0x0456, + 0x5439, 0x5439, 0x0454, 0x543B, 0x543B, 0x0455, 0x543C, 0x543C, 0x045B, + 0x543D, 0x543D, 0x1848, 0x543E, 0x543E, 0x0448, 0x5440, 0x5440, 0x045C, + 0x5441, 0x5441, 0x184A, 0x5442, 0x5442, 0x0450, 0x5443, 0x5443, 0x044D, + 0x5445, 0x5445, 0x1843, 0x5446, 0x5446, 0x044C, 0x5447, 0x5447, 0x184D, + 0x5448, 0x5448, 0x044F, 0x544A, 0x544A, 0x0453, 0x544B, 0x544B, 0x3ED1, + 0x544D, 0x544D, 0x3EA7, 0x544E, 0x544E, 0x044A, 0x544F, 0x544F, 0x1849, + 0x5454, 0x5454, 0x1842, 0x5460, 0x5460, 0x192E, 0x5461, 0x5461, 0x192D, + 0x5462, 0x5462, 0x0573, 0x5463, 0x5463, 0x1930, 0x5464, 0x5464, 0x1932, + 0x5465, 0x5465, 0x1927, 0x5466, 0x5466, 0x192A, 0x5467, 0x5467, 0x1931, + 0x5468, 0x5468, 0x0574, 0x5469, 0x5469, 0x3F32, 0x546A, 0x546A, 0x3D83, + 0x546B, 0x546B, 0x1924, 0x546C, 0x546C, 0x1928, 0x546D, 0x546D, 0x409D, + 0x546F, 0x546F, 0x192C, 0x5470, 0x5470, 0x1A85, 0x5471, 0x5471, 0x056F, + 0x5472, 0x5472, 0x1A89, 0x5473, 0x5473, 0x0562, 0x5474, 0x5474, 0x1929, + 0x5475, 0x5475, 0x0563, 0x5476, 0x5476, 0x0570, 0x5477, 0x5477, 0x0569, + 0x5478, 0x5478, 0x0565, 0x547A, 0x547A, 0x1925, 0x547B, 0x547B, 0x0568, + 0x547C, 0x547C, 0x056D, 0x547D, 0x547D, 0x0576, 0x547E, 0x547E, 0x1926, + 0x547F, 0x547F, 0x191F, 0x5480, 0x5480, 0x0567, 0x5481, 0x5481, 0x1920, + 0x5482, 0x5482, 0x1922, 0x5484, 0x5484, 0x056A, 0x5485, 0x5485, 0x46D9, + 0x5486, 0x5486, 0x056C, 0x5487, 0x5487, 0x191E, 0x5488, 0x5488, 0x1923, + 0x548B, 0x548B, 0x0575, 0x548C, 0x548C, 0x0571, 0x548D, 0x548D, 0x192B, + 0x548E, 0x548E, 0x0577, 0x548F, 0x548F, 0x40A1, 0x5490, 0x5490, 0x056E, + 0x5491, 0x5491, 0x1921, 0x5492, 0x5492, 0x056B, 0x5493, 0x5493, 0x45A7, + 0x5494, 0x5494, 0x3E98, 0x5495, 0x5495, 0x0566, 0x5496, 0x5496, 0x0564, + 0x5497, 0x5497, 0x3E8A, 0x5498, 0x5498, 0x192F, 0x549A, 0x549A, 0x0572, + 0x549C, 0x549C, 0x3F66, 0x549E, 0x549E, 0x47ED, 0x54A0, 0x54A0, 0x1A84, + 0x54A1, 0x54A1, 0x1A78, 0x54A2, 0x54A2, 0x1A87, 0x54A3, 0x54A3, 0x45A8, + 0x54A4, 0x54A4, 0x40A2, 0x54A5, 0x54A5, 0x1A7A, 0x54A6, 0x54A6, 0x06D6, + 0x54A7, 0x54A7, 0x06E4, 0x54A8, 0x54A8, 0x06D2, 0x54A9, 0x54A9, 0x06E3, + 0x54AA, 0x54AA, 0x06DB, 0x54AB, 0x54AB, 0x06E0, 0x54AC, 0x54AC, 0x06D0, + 0x54AD, 0x54AD, 0x1A79, 0x54AE, 0x54AE, 0x1A7F, 0x54AF, 0x54AF, 0x06DF, + 0x54B0, 0x54B0, 0x1A8B, 0x54B1, 0x54B1, 0x06E1, 0x54B2, 0x54B2, 0x3744, + 0x54B3, 0x54B3, 0x06D7, 0x54B4, 0x54B4, 0x45A9, 0x54B6, 0x54B6, 0x1A81, + 0x54B7, 0x54B7, 0x1A7E, 0x54B8, 0x54B8, 0x06D5, 0x54B9, 0x54B9, 0x45AA, + 0x54BA, 0x54BA, 0x1A77, 0x54BB, 0x54BB, 0x06E2, 0x54BC, 0x54BC, 0x1A86, + 0x54BD, 0x54BD, 0x06DA, 0x54BE, 0x54BE, 0x1A88, 0x54BF, 0x54BF, 0x06E5, + 0x54C0, 0x54C0, 0x06D1, 0x54C1, 0x54C1, 0x06DC, 0x54C2, 0x54C2, 0x06D9, + 0x54C3, 0x54C3, 0x1A7C, 0x54C4, 0x54C4, 0x06DD, 0x54C5, 0x54C6, 0x1A82, + 0x54C7, 0x54C7, 0x06D8, 0x54C8, 0x54C8, 0x06DE, 0x54C9, 0x54C9, 0x06D4, + 0x54CB, 0x54CB, 0x39A3, 0x54CC, 0x54CC, 0x43A8, 0x54CD, 0x54CD, 0x3A00, + 0x54CE, 0x54CE, 0x06D3, 0x54CF, 0x54CF, 0x1A7B, 0x54D0, 0x54D0, 0x45AB, + 0x54D6, 0x54D6, 0x1A80, 0x54DA, 0x54DA, 0x4923, 0x54DE, 0x54DE, 0x1A8A, + 0x54E0, 0x54E0, 0x1C57, 0x54E1, 0x54E1, 0x0870, 0x54E2, 0x54E2, 0x1C45, + 0x54E3, 0x54E3, 0x4341, 0x54E4, 0x54E4, 0x1C4A, 0x54E5, 0x54E5, 0x0869, + 0x54E6, 0x54E6, 0x0874, 0x54E7, 0x54E7, 0x1C48, 0x54E8, 0x54E8, 0x0864, + 0x54E9, 0x54E9, 0x086E, 0x54EA, 0x54EA, 0x0873, 0x54EB, 0x54EB, 0x1C4F, + 0x54ED, 0x54ED, 0x086F, 0x54EE, 0x54EE, 0x0872, 0x54EF, 0x54EF, 0x45AC, + 0x54F1, 0x54F1, 0x1C52, 0x54F2, 0x54F2, 0x086A, 0x54F3, 0x54F3, 0x1C49, + 0x54F7, 0x54F8, 0x1C55, 0x54FA, 0x54FA, 0x086C, 0x54FB, 0x54FB, 0x1C54, + 0x54FC, 0x54FC, 0x0868, 0x54FD, 0x54FD, 0x0877, 0x54FF, 0x54FF, 0x1C4C, + 0x5501, 0x5501, 0x0866, 0x5502, 0x5502, 0x3CCC, 0x5503, 0x5503, 0x1C59, + 0x5504, 0x5504, 0x1C4D, 0x5505, 0x5505, 0x1C51, 0x5506, 0x5506, 0x086B, + 0x5507, 0x5507, 0x0876, 0x5508, 0x5508, 0x1C4E, 0x5509, 0x5509, 0x0871, + 0x550A, 0x550A, 0x1C53, 0x550B, 0x550B, 0x1C5A, 0x550C, 0x550C, 0x1E69, + 0x550D, 0x550D, 0x3A73, 0x550E, 0x550E, 0x1C58, 0x550F, 0x550F, 0x0878, + 0x5510, 0x5510, 0x0865, 0x5511, 0x5511, 0x1C50, 0x5512, 0x5512, 0x1C47, + 0x5513, 0x5513, 0x3EA9, 0x5514, 0x5514, 0x086D, 0x5517, 0x5517, 0x1C46, + 0x5518, 0x5518, 0x45AD, 0x551A, 0x551A, 0x1C4B, 0x551E, 0x551E, 0x3EA8, + 0x5523, 0x5523, 0x45AE, 0x5525, 0x5525, 0x4309, 0x5526, 0x5526, 0x1C44, + 0x5527, 0x5527, 0x0875, 0x5528, 0x5528, 0x45AF, 0x552A, 0x552A, 0x1E61, + 0x552B, 0x552B, 0x409A, 0x552C, 0x552C, 0x0A31, 0x552D, 0x552D, 0x1E6F, + 0x552E, 0x552E, 0x0A2F, 0x552F, 0x552F, 0x0A2C, 0x5530, 0x5530, 0x1E66, + 0x5531, 0x5531, 0x0A28, 0x5532, 0x5532, 0x1E6A, 0x5533, 0x5533, 0x0A33, + 0x5534, 0x5534, 0x1E60, 0x5535, 0x5535, 0x1E65, 0x5536, 0x5536, 0x1E64, + 0x5537, 0x5537, 0x0867, 0x5538, 0x5538, 0x0A2E, 0x5539, 0x5539, 0x1E6D, + 0x553B, 0x553B, 0x1E70, 0x553C, 0x553C, 0x1E5D, 0x553E, 0x553E, 0x0C0C, + 0x553F, 0x553F, 0x43A9, 0x5540, 0x5540, 0x1E71, 0x5541, 0x5541, 0x0A34, + 0x5543, 0x5543, 0x0A26, 0x5544, 0x5544, 0x0A23, 0x5545, 0x5545, 0x1E68, + 0x5546, 0x5546, 0x0A20, 0x5547, 0x5547, 0x40AA, 0x5548, 0x5548, 0x1E6E, + 0x5549, 0x5549, 0x4068, 0x554A, 0x554A, 0x0A27, 0x554B, 0x554B, 0x1E72, + 0x554D, 0x554D, 0x1E5E, 0x554E, 0x554E, 0x1E6C, 0x554F, 0x554F, 0x0A2A, + 0x5550, 0x5550, 0x1E5F, 0x5551, 0x5551, 0x1E62, 0x5552, 0x5552, 0x1E67, + 0x5553, 0x5553, 0x43AE, 0x5555, 0x5555, 0x0A2B, 0x5556, 0x5556, 0x0A29, + 0x5557, 0x5557, 0x0A35, 0x555C, 0x555C, 0x0A30, 0x555D, 0x555D, 0x40A0, + 0x555E, 0x555E, 0x0A24, 0x555F, 0x555F, 0x0ABC, 0x5561, 0x5561, 0x0A25, + 0x5562, 0x5562, 0x1E63, 0x5563, 0x5563, 0x0A32, 0x5564, 0x5564, 0x0A2D, + 0x5565, 0x5565, 0x1E6B, 0x5566, 0x5566, 0x0A22, 0x5569, 0x5569, 0x3E9F, + 0x556A, 0x556A, 0x0A21, 0x556B, 0x556B, 0x3B2E, 0x5571, 0x5571, 0x3BC6, + 0x5572, 0x5572, 0x3E8B, 0x5573, 0x5573, 0x3F24, 0x5575, 0x5576, 0x1E5B, + 0x5577, 0x5577, 0x20C7, 0x5579, 0x5579, 0x435D, 0x557B, 0x557B, 0x0BFB, + 0x557C, 0x557C, 0x0BFE, 0x557D, 0x557D, 0x20D2, 0x557E, 0x557E, 0x0C12, + 0x557F, 0x557F, 0x20D5, 0x5580, 0x5580, 0x0BFC, 0x5581, 0x5581, 0x20CE, + 0x5582, 0x5582, 0x0C02, 0x5583, 0x5583, 0x0C08, 0x5584, 0x5584, 0x0D1B, + 0x5586, 0x5586, 0x40AE, 0x5587, 0x5587, 0x0C06, 0x5588, 0x5588, 0x20CB, + 0x5589, 0x5589, 0x0C13, 0x558A, 0x558A, 0x0BFF, 0x558B, 0x558B, 0x0C07, + 0x558C, 0x558C, 0x20D3, 0x558D, 0x558D, 0x2387, 0x558E, 0x558E, 0x20D8, + 0x558F, 0x558F, 0x20CC, 0x5590, 0x5590, 0x430E, 0x5591, 0x5591, 0x20C3, + 0x5592, 0x5592, 0x20D0, 0x5593, 0x5593, 0x20CA, 0x5594, 0x5594, 0x0C05, + 0x5595, 0x5595, 0x20D6, 0x5598, 0x5598, 0x0C01, 0x5599, 0x5599, 0x0C15, + 0x559A, 0x559A, 0x0C0E, 0x559C, 0x559C, 0x0C03, 0x559D, 0x559D, 0x0C00, + 0x559F, 0x559F, 0x0C0B, 0x55A1, 0x55A1, 0x20D7, 0x55A2, 0x55A2, 0x20C9, + 0x55A3, 0x55A3, 0x20CF, 0x55A4, 0x55A4, 0x20D1, 0x55A5, 0x55A5, 0x20C5, + 0x55A6, 0x55A6, 0x20D4, 0x55A7, 0x55A7, 0x0BFD, 0x55A8, 0x55A8, 0x20C4, + 0x55A9, 0x55A9, 0x40AF, 0x55AA, 0x55AA, 0x0C04, 0x55AB, 0x55AB, 0x0C14, + 0x55AC, 0x55AC, 0x0C10, 0x55AD, 0x55AD, 0x20C6, 0x55AE, 0x55AE, 0x0C0A, + 0x55B0, 0x55B0, 0x38F5, 0x55B1, 0x55B1, 0x0C11, 0x55B2, 0x55B2, 0x0C0D, + 0x55B3, 0x55B3, 0x0C09, 0x55B4, 0x55B4, 0x39FE, 0x55B5, 0x55B5, 0x20CD, + 0x55B9, 0x55B9, 0x43AA, 0x55BA, 0x55BA, 0x3E89, 0x55BB, 0x55BB, 0x0C0F, + 0x55BC, 0x55BC, 0x3DC3, 0x55BF, 0x55BF, 0x2385, 0x55C0, 0x55C0, 0x2381, + 0x55C1, 0x55C1, 0x3E4F, 0x55C2, 0x55C2, 0x2390, 0x55C3, 0x55C3, 0x237A, + 0x55C4, 0x55C4, 0x2383, 0x55C5, 0x55C6, 0x0DE0, 0x55C7, 0x55C7, 0x0DD9, + 0x55C8, 0x55C8, 0x238C, 0x55C9, 0x55C9, 0x0DE3, 0x55CA, 0x55CA, 0x237F, + 0x55CB, 0x55CB, 0x237E, 0x55CC, 0x55CC, 0x237C, 0x55CD, 0x55CD, 0x238E, + 0x55CE, 0x55CE, 0x0DD7, 0x55CF, 0x55CF, 0x2388, 0x55D0, 0x55D0, 0x237D, + 0x55D1, 0x55D1, 0x0DDA, 0x55D2, 0x55D2, 0x2386, 0x55D3, 0x55D3, 0x0DD5, + 0x55D4, 0x55D4, 0x2382, 0x55D5, 0x55D5, 0x2389, 0x55D6, 0x55D6, 0x238B, + 0x55D7, 0x55D7, 0x45B3, 0x55D8, 0x55D8, 0x43AB, 0x55D9, 0x55D9, 0x238F, + 0x55DA, 0x55DA, 0x0DDE, 0x55DB, 0x55DB, 0x237B, 0x55DC, 0x55DC, 0x0DD8, + 0x55DD, 0x55DD, 0x2380, 0x55DE, 0x55DE, 0x3E94, 0x55DF, 0x55DF, 0x0DD3, + 0x55E1, 0x55E1, 0x0DDF, 0x55E2, 0x55E2, 0x238A, 0x55E3, 0x55E4, 0x0DDB, + 0x55E5, 0x55E5, 0x0DE2, 0x55E6, 0x55E6, 0x0DD6, 0x55E7, 0x55E7, 0x011F, + 0x55E8, 0x55E8, 0x0DD4, 0x55E9, 0x55E9, 0x2384, 0x55EA, 0x55EA, 0x3E7C, + 0x55EC, 0x55EC, 0x37D2, 0x55EF, 0x55EF, 0x0DDD, 0x55F0, 0x55F0, 0x3E88, + 0x55F1, 0x55F1, 0x3E83, 0x55F2, 0x55F2, 0x238D, 0x55F5, 0x55F5, 0x4786, + 0x55F6, 0x55F6, 0x0F9F, 0x55F7, 0x55F7, 0x0F9A, 0x55F9, 0x55F9, 0x2637, + 0x55FA, 0x55FA, 0x2633, 0x55FB, 0x55FB, 0x4626, 0x55FC, 0x55FC, 0x262D, + 0x55FD, 0x55FD, 0x0F94, 0x55FE, 0x55FE, 0x0F90, 0x55FF, 0x55FF, 0x2636, + 0x5600, 0x5600, 0x0F91, 0x5601, 0x5601, 0x2630, 0x5602, 0x5602, 0x2632, + 0x5604, 0x5604, 0x2635, 0x5605, 0x5605, 0x3E82, 0x5606, 0x5606, 0x0F96, + 0x5608, 0x5608, 0x0F9D, 0x5609, 0x5609, 0x0F97, 0x560C, 0x560C, 0x262B, + 0x560D, 0x560E, 0x0F98, 0x560F, 0x560F, 0x262E, 0x5610, 0x5610, 0x0F9E, + 0x5611, 0x5611, 0x3F4D, 0x5612, 0x5612, 0x262C, 0x5613, 0x5613, 0x2631, + 0x5614, 0x5614, 0x0F95, 0x5615, 0x5615, 0x262A, 0x5616, 0x5616, 0x0F9B, + 0x5617, 0x5617, 0x0F93, 0x561B, 0x561B, 0x0F92, 0x561C, 0x561C, 0x262F, + 0x561D, 0x561D, 0x2634, 0x561E, 0x561E, 0x3E68, 0x561F, 0x561F, 0x0F9C, + 0x5620, 0x5620, 0x3F7D, 0x5621, 0x5621, 0x43AD, 0x5622, 0x5622, 0x3E67, + 0x5623, 0x5623, 0x4707, 0x5625, 0x5625, 0x3E78, 0x5627, 0x5627, 0x2629, + 0x5629, 0x5629, 0x1119, 0x562A, 0x562A, 0x289D, 0x562C, 0x562C, 0x289A, + 0x562D, 0x562D, 0x3E63, 0x562E, 0x562E, 0x1113, 0x562F, 0x5630, 0x111F, + 0x5632, 0x5632, 0x1116, 0x5633, 0x5633, 0x2898, 0x5634, 0x5634, 0x1118, + 0x5635, 0x5635, 0x2890, 0x5636, 0x5636, 0x111E, 0x5637, 0x5637, 0x40B7, + 0x5638, 0x5638, 0x289C, 0x5639, 0x5639, 0x1115, 0x563A, 0x563A, 0x289E, + 0x563B, 0x563B, 0x1114, 0x563D, 0x563D, 0x2899, 0x563E, 0x563E, 0x289B, + 0x563F, 0x563F, 0x1117, 0x5640, 0x5640, 0x2897, 0x5641, 0x5641, 0x2891, + 0x5642, 0x5642, 0x288E, 0x5643, 0x5643, 0x3E7E, 0x5645, 0x5645, 0x20C8, + 0x5646, 0x5646, 0x2894, 0x5648, 0x5648, 0x288D, 0x5649, 0x5649, 0x2893, + 0x564A, 0x564A, 0x2892, 0x564C, 0x564C, 0x288F, 0x564D, 0x564D, 0x40BC, + 0x564E, 0x564E, 0x111B, 0x564F, 0x564F, 0x40BD, 0x5650, 0x5650, 0x47CF, + 0x5652, 0x5652, 0x45C2, 0x5653, 0x5653, 0x111A, 0x5654, 0x5654, 0x43AF, + 0x5657, 0x5657, 0x111C, 0x5658, 0x5658, 0x2895, 0x5659, 0x5659, 0x1295, + 0x565A, 0x565A, 0x2896, 0x565D, 0x565D, 0x3EF9, 0x565E, 0x565E, 0x2B10, + 0x5660, 0x5660, 0x2B09, 0x5661, 0x5661, 0x3812, 0x5662, 0x5662, 0x12A1, + 0x5663, 0x5663, 0x2B0D, 0x5664, 0x5664, 0x1299, 0x5665, 0x5665, 0x129D, + 0x5666, 0x5666, 0x2B0C, 0x5668, 0x5668, 0x129C, 0x5669, 0x5669, 0x1298, + 0x566A, 0x566A, 0x129B, 0x566B, 0x566B, 0x1296, 0x566C, 0x566C, 0x12A0, + 0x566D, 0x566D, 0x2B0E, 0x566E, 0x566E, 0x2B0A, 0x566F, 0x566F, 0x129F, + 0x5670, 0x5670, 0x2B08, 0x5671, 0x5671, 0x129E, 0x5672, 0x5672, 0x2B0F, + 0x5673, 0x5673, 0x2B0B, 0x5674, 0x5674, 0x111D, 0x5676, 0x5676, 0x12A2, + 0x5677, 0x5677, 0x2B11, 0x5678, 0x5678, 0x129A, 0x5679, 0x5679, 0x1297, + 0x567A, 0x567A, 0x3D85, 0x567B, 0x567B, 0x3EB7, 0x567C, 0x567C, 0x3EED, + 0x567E, 0x567E, 0x2D47, 0x567F, 0x567F, 0x2D49, 0x5680, 0x5680, 0x13BA, + 0x5681, 0x5681, 0x2D4A, 0x5682, 0x5682, 0x2D48, 0x5683, 0x5683, 0x2D46, + 0x5684, 0x5684, 0x2D45, 0x5685, 0x5685, 0x13BC, 0x5686, 0x5686, 0x2D44, + 0x5687, 0x5687, 0x13BD, 0x5689, 0x5689, 0x4628, 0x568A, 0x568A, 0x3949, + 0x568B, 0x568B, 0x3E4C, 0x568C, 0x568D, 0x2D42, 0x568E, 0x568E, 0x13B9, + 0x568F, 0x568F, 0x13BE, 0x5690, 0x5690, 0x13BB, 0x5692, 0x5692, 0x39A6, + 0x5693, 0x5693, 0x2D41, 0x5695, 0x5695, 0x14CA, 0x5697, 0x5697, 0x2F13, + 0x5698, 0x5698, 0x2F11, 0x5699, 0x5699, 0x2F16, 0x569A, 0x569A, 0x2F14, + 0x569C, 0x569C, 0x2F12, 0x569D, 0x569D, 0x2F15, 0x569E, 0x569E, 0x39A4, + 0x569F, 0x569F, 0x3948, 0x56A1, 0x56A1, 0x436B, 0x56A4, 0x56A4, 0x3CC8, + 0x56A5, 0x56A5, 0x1576, 0x56A6, 0x56A7, 0x3081, 0x56A8, 0x56A8, 0x1577, + 0x56AA, 0x56AA, 0x3083, 0x56AB, 0x56AB, 0x307F, 0x56AC, 0x56AC, 0x3084, + 0x56AD, 0x56AD, 0x3080, 0x56AE, 0x56AE, 0x14CB, 0x56AF, 0x56AF, 0x45F7, + 0x56B1, 0x56B1, 0x463F, 0x56B2, 0x56B2, 0x31C8, 0x56B3, 0x56B3, 0x31CA, + 0x56B4, 0x56B4, 0x160C, 0x56B5, 0x56B5, 0x31C9, 0x56B6, 0x56B6, 0x160B, + 0x56B7, 0x56B7, 0x160A, 0x56B9, 0x56B9, 0x486F, 0x56BC, 0x56BC, 0x160D, + 0x56BD, 0x56BE, 0x32CA, 0x56BF, 0x56BF, 0x3E5D, 0x56C0, 0x56C0, 0x166B, + 0x56C1, 0x56C1, 0x166A, 0x56C2, 0x56C2, 0x166C, 0x56C3, 0x56C3, 0x32C9, + 0x56C5, 0x56C5, 0x3379, 0x56C6, 0x56C6, 0x3378, 0x56C8, 0x56C8, 0x16BD, + 0x56C9, 0x56C9, 0x16BF, 0x56CA, 0x56CA, 0x16BE, 0x56CB, 0x56CB, 0x337A, + 0x56CC, 0x56CC, 0x16F6, 0x56CD, 0x56CD, 0x3481, 0x56D1, 0x56D1, 0x171F, + 0x56D3, 0x56D3, 0x3480, 0x56D4, 0x56D4, 0x34C9, 0x56D6, 0x56D6, 0x488A, + 0x56D7, 0x56D7, 0x1775, 0x56DA, 0x56DA, 0x032D, 0x56DB, 0x56DB, 0x032C, + 0x56DD, 0x56DD, 0x03AC, 0x56DE, 0x56DE, 0x03AB, 0x56DF, 0x56DF, 0x17D0, + 0x56E0, 0x56E0, 0x03AA, 0x56E1, 0x56E1, 0x17CF, 0x56E2, 0x56E2, 0x4548, + 0x56E4, 0x56E4, 0x0463, 0x56E5, 0x56E5, 0x1850, 0x56E7, 0x56E7, 0x184F, + 0x56EA, 0x56EA, 0x0461, 0x56EB, 0x56EB, 0x0464, 0x56ED, 0x56ED, 0x40C4, + 0x56EE, 0x56EE, 0x184E, 0x56EF, 0x56EF, 0x40C3, 0x56F0, 0x56F0, 0x0462, + 0x56F1, 0x56F1, 0x40BF, 0x56F7, 0x56F7, 0x1933, 0x56F9, 0x56F9, 0x1934, + 0x56FA, 0x56FA, 0x0578, 0x56FD, 0x56FD, 0x3D64, 0x56FF, 0x56FF, 0x06E6, + 0x5700, 0x5700, 0x40C2, 0x5701, 0x5702, 0x1C5B, 0x5703, 0x5704, 0x0879, + 0x5707, 0x5707, 0x1E74, 0x5708, 0x5708, 0x0A36, 0x5709, 0x5709, 0x0A38, + 0x570A, 0x570A, 0x1E73, 0x570B, 0x570B, 0x0A37, 0x570C, 0x570C, 0x20D9, + 0x570D, 0x570D, 0x0C16, 0x5712, 0x5713, 0x0DE4, 0x5714, 0x5714, 0x2391, + 0x5715, 0x5715, 0x3E36, 0x5716, 0x5716, 0x0FA1, 0x5718, 0x5718, 0x0FA0, + 0x571A, 0x571A, 0x289F, 0x571B, 0x571B, 0x2B13, 0x571C, 0x571C, 0x2B12, + 0x571D, 0x571D, 0x3A02, 0x571E, 0x571E, 0x3505, 0x571F, 0x571F, 0x027A, + 0x5720, 0x5720, 0x1784, 0x5722, 0x5723, 0x179A, 0x5728, 0x5728, 0x03AF, + 0x5729, 0x5729, 0x03B3, 0x572A, 0x572A, 0x17D2, 0x572C, 0x572C, 0x03B1, + 0x572D, 0x572D, 0x03B0, 0x572E, 0x572E, 0x17D1, 0x572F, 0x572F, 0x03B2, + 0x5730, 0x5730, 0x03AE, 0x5732, 0x5732, 0x3AF9, 0x5733, 0x5733, 0x03AD, + 0x5734, 0x5734, 0x17D3, 0x573B, 0x573B, 0x046E, 0x573E, 0x573E, 0x046B, + 0x573F, 0x573F, 0x4855, 0x5740, 0x5740, 0x0467, 0x5741, 0x5741, 0x1851, + 0x5742, 0x5742, 0x40CC, 0x5743, 0x5743, 0x40DE, 0x5745, 0x5745, 0x1852, + 0x5746, 0x5746, 0x40C8, 0x5747, 0x5747, 0x0469, 0x5749, 0x5749, 0x1854, + 0x574A, 0x574A, 0x0465, 0x574B, 0x574B, 0x1855, 0x574C, 0x574C, 0x1853, + 0x574D, 0x574D, 0x0468, 0x574E, 0x574E, 0x046A, 0x574F, 0x574F, 0x046D, + 0x5750, 0x5750, 0x046C, 0x5751, 0x5751, 0x0466, 0x5752, 0x5752, 0x1856, + 0x5754, 0x5754, 0x4785, 0x5757, 0x5757, 0x47E6, 0x575B, 0x575B, 0x3982, + 0x575F, 0x575F, 0x3FBF, 0x5761, 0x5761, 0x057D, 0x5762, 0x5762, 0x1941, + 0x5764, 0x5764, 0x057F, 0x5766, 0x5766, 0x057E, 0x5767, 0x5767, 0x3F2B, + 0x5768, 0x5768, 0x1942, 0x5769, 0x5769, 0x057C, 0x576A, 0x576A, 0x057B, + 0x576B, 0x576B, 0x1938, 0x576D, 0x576D, 0x1937, 0x576F, 0x576F, 0x1935, + 0x5770, 0x5770, 0x193A, 0x5771, 0x5771, 0x1939, 0x5772, 0x5772, 0x1936, + 0x5773, 0x5774, 0x193F, 0x5775, 0x5775, 0x193D, 0x5776, 0x5776, 0x193B, + 0x5777, 0x5777, 0x057A, 0x577A, 0x577A, 0x3F5F, 0x577B, 0x577B, 0x193E, + 0x577C, 0x577C, 0x0580, 0x577D, 0x577D, 0x1943, 0x577E, 0x577E, 0x46DC, + 0x577F, 0x577F, 0x3A07, 0x5780, 0x5780, 0x193C, 0x5782, 0x5782, 0x06E7, + 0x5783, 0x5783, 0x0579, 0x5788, 0x5788, 0x484B, 0x578A, 0x578A, 0x3C7B, + 0x578B, 0x578B, 0x06E8, 0x578C, 0x578C, 0x1A90, 0x578D, 0x578D, 0x3A06, + 0x578F, 0x578F, 0x1A96, 0x5790, 0x5790, 0x4166, 0x5793, 0x5793, 0x06EE, + 0x5794, 0x5794, 0x1A94, 0x5795, 0x5795, 0x1A9A, 0x5797, 0x5797, 0x1A91, + 0x5798, 0x5798, 0x1A95, 0x5799, 0x5799, 0x1A97, 0x579A, 0x579A, 0x1A99, + 0x579B, 0x579B, 0x1A93, 0x579C, 0x579C, 0x4608, 0x579D, 0x579D, 0x1A92, + 0x579E, 0x579F, 0x1A8D, 0x57A0, 0x57A0, 0x06E9, 0x57A1, 0x57A1, 0x4864, + 0x57A2, 0x57A2, 0x06EB, 0x57A3, 0x57A3, 0x06EA, 0x57A4, 0x57A4, 0x1A8F, + 0x57A5, 0x57A5, 0x1A98, 0x57A7, 0x57A7, 0x4914, 0x57AA, 0x57AA, 0x4905, + 0x57AE, 0x57AE, 0x06ED, 0x57B4, 0x57B4, 0x4741, 0x57B5, 0x57B5, 0x1A8C, + 0x57B6, 0x57B6, 0x1C66, 0x57B8, 0x57B8, 0x1C65, 0x57B9, 0x57B9, 0x1C6A, + 0x57BA, 0x57BA, 0x1C61, 0x57BB, 0x57BB, 0x3C79, 0x57BC, 0x57BC, 0x1C64, + 0x57BD, 0x57BD, 0x1C63, 0x57BE, 0x57BE, 0x372C, 0x57BF, 0x57BF, 0x1C67, + 0x57C1, 0x57C1, 0x1C6B, 0x57C2, 0x57C2, 0x087B, 0x57C3, 0x57C3, 0x087E, + 0x57C4, 0x57C4, 0x3B5B, 0x57C6, 0x57C6, 0x1C62, 0x57C7, 0x57C7, 0x1C68, + 0x57C8, 0x57C8, 0x3D0B, 0x57CB, 0x57CB, 0x087D, 0x57CC, 0x57CC, 0x1C5D, + 0x57CE, 0x57CE, 0x06EC, 0x57CF, 0x57CF, 0x1E82, 0x57D0, 0x57D0, 0x1C69, + 0x57D2, 0x57D2, 0x1C60, 0x57D4, 0x57D4, 0x087C, 0x57D5, 0x57D5, 0x1C5F, + 0x57D7, 0x57D7, 0x3C7D, 0x57DC, 0x57DC, 0x1E79, 0x57DD, 0x57DD, 0x3A05, + 0x57DE, 0x57DE, 0x3F01, 0x57DF, 0x57DF, 0x0A39, 0x57E0, 0x57E0, 0x0A3D, + 0x57E1, 0x57E1, 0x1E89, 0x57E2, 0x57E2, 0x1E77, 0x57E3, 0x57E3, 0x1E85, + 0x57E4, 0x57E4, 0x0A3E, 0x57E5, 0x57E5, 0x1E87, 0x57E6, 0x57E6, 0x40CF, + 0x57E7, 0x57E7, 0x1E8D, 0x57E9, 0x57E9, 0x1E91, 0x57EC, 0x57EC, 0x1E88, + 0x57ED, 0x57ED, 0x1E7C, 0x57EE, 0x57EE, 0x1E84, 0x57EF, 0x57EF, 0x4754, + 0x57F0, 0x57F0, 0x1E92, 0x57F1, 0x57F1, 0x1E90, 0x57F2, 0x57F2, 0x1E86, + 0x57F3, 0x57F3, 0x1E81, 0x57F4, 0x57F4, 0x1E7A, 0x57F5, 0x57F5, 0x20E1, + 0x57F6, 0x57F6, 0x1E78, 0x57F7, 0x57F7, 0x0A42, 0x57F8, 0x57F8, 0x1E7F, + 0x57F9, 0x57F9, 0x0A43, 0x57FA, 0x57FA, 0x0A3F, 0x57FB, 0x57FB, 0x1E75, + 0x57FC, 0x57FC, 0x1E8B, 0x57FD, 0x57FD, 0x1E7D, 0x57FE, 0x57FE, 0x408F, + 0x5800, 0x5800, 0x1E7B, 0x5801, 0x5801, 0x1E8E, 0x5802, 0x5802, 0x0A40, + 0x5803, 0x5803, 0x40D1, 0x5804, 0x5804, 0x1E94, 0x5805, 0x5805, 0x0A3A, + 0x5806, 0x5806, 0x0A3C, 0x5807, 0x5807, 0x1E83, 0x5808, 0x5808, 0x1E7E, + 0x5809, 0x5809, 0x087F, 0x580A, 0x580A, 0x0A3B, 0x580B, 0x580B, 0x1E80, + 0x580C, 0x580C, 0x1E8F, 0x580D, 0x580D, 0x1E93, 0x580E, 0x580E, 0x1E8A, + 0x5810, 0x5810, 0x1E8C, 0x5812, 0x5812, 0x3D0A, 0x5814, 0x5814, 0x1E76, + 0x5819, 0x5819, 0x20DC, 0x581B, 0x581B, 0x20E5, 0x581C, 0x581C, 0x20E4, + 0x581D, 0x581D, 0x0C1E, 0x581E, 0x581E, 0x20DD, 0x5820, 0x5820, 0x0C1F, + 0x5821, 0x5821, 0x0C1D, 0x5822, 0x5822, 0x3C28, 0x5823, 0x5823, 0x20DF, + 0x5824, 0x5824, 0x0C1A, 0x5825, 0x5825, 0x20E3, 0x5826, 0x5826, 0x40D4, + 0x5827, 0x5827, 0x20DE, 0x5828, 0x5828, 0x20E0, 0x5829, 0x5829, 0x20DA, + 0x582A, 0x582A, 0x0C18, 0x582C, 0x582C, 0x20ED, 0x582D, 0x582D, 0x20EC, + 0x582E, 0x582E, 0x20E9, 0x582F, 0x582F, 0x0C17, 0x5830, 0x5831, 0x0C1B, + 0x5832, 0x5832, 0x1C5E, 0x5833, 0x5833, 0x20E6, 0x5834, 0x5834, 0x0C19, + 0x5835, 0x5835, 0x0A41, 0x5836, 0x5836, 0x20E8, 0x5837, 0x5837, 0x20DB, + 0x5838, 0x5838, 0x20EB, 0x5839, 0x5839, 0x20EA, 0x583A, 0x583A, 0x3D72, + 0x583B, 0x583B, 0x20EE, 0x583D, 0x583D, 0x239F, 0x583F, 0x583F, 0x20E7, + 0x5840, 0x5840, 0x3D82, 0x5844, 0x5844, 0x47BB, 0x5847, 0x5847, 0x3AC2, + 0x5848, 0x5848, 0x20E2, 0x5849, 0x5849, 0x2397, 0x584A, 0x584A, 0x0DEF, + 0x584B, 0x584B, 0x0DF2, 0x584C, 0x584C, 0x0DED, 0x584D, 0x584D, 0x2396, + 0x584E, 0x584E, 0x239A, 0x584F, 0x584F, 0x2395, 0x5851, 0x5851, 0x0DE7, + 0x5852, 0x5852, 0x0DF1, 0x5853, 0x5853, 0x2392, 0x5854, 0x5854, 0x0DEB, + 0x5855, 0x5855, 0x2399, 0x5857, 0x5857, 0x0DE9, 0x5858, 0x5858, 0x0DE8, + 0x5859, 0x5859, 0x239C, 0x585A, 0x585A, 0x0DEA, 0x585B, 0x585B, 0x239E, + 0x585C, 0x585C, 0x4949, 0x585D, 0x585D, 0x239B, 0x585E, 0x585E, 0x0DE6, + 0x585F, 0x585F, 0x43DF, 0x5862, 0x5862, 0x0DF0, 0x5863, 0x5863, 0x23A0, + 0x5864, 0x5864, 0x2394, 0x5865, 0x5865, 0x239D, 0x5868, 0x5868, 0x2393, + 0x5869, 0x5869, 0x3D65, 0x586B, 0x586B, 0x0DEC, 0x586C, 0x586C, 0x399A, + 0x586D, 0x586D, 0x0DEE, 0x586F, 0x586F, 0x2398, 0x5871, 0x5871, 0x23A1, + 0x5872, 0x5872, 0x3C26, 0x5873, 0x5873, 0x4355, 0x5874, 0x5874, 0x263F, + 0x5875, 0x5875, 0x0FA2, 0x5876, 0x5876, 0x2645, 0x5879, 0x5879, 0x0FA7, + 0x587A, 0x587A, 0x2641, 0x587B, 0x587B, 0x2648, 0x587C, 0x587C, 0x2639, + 0x587D, 0x587D, 0x0FA9, 0x587E, 0x587E, 0x0FA3, 0x587F, 0x587F, 0x263E, + 0x5880, 0x5880, 0x1121, 0x5881, 0x5881, 0x263D, 0x5882, 0x5882, 0x2646, + 0x5883, 0x5883, 0x0FA4, 0x5885, 0x5885, 0x0FA8, 0x5886, 0x5886, 0x263C, + 0x5887, 0x5887, 0x2642, 0x5888, 0x5888, 0x2647, 0x5889, 0x5889, 0x2638, + 0x588A, 0x588A, 0x0FA6, 0x588B, 0x588B, 0x2640, 0x588E, 0x588E, 0x2644, + 0x588F, 0x588F, 0x264A, 0x5890, 0x5890, 0x263A, 0x5891, 0x5891, 0x2643, + 0x5893, 0x5893, 0x0FA5, 0x5894, 0x5894, 0x2649, 0x5898, 0x5898, 0x263B, + 0x5899, 0x5899, 0x4618, 0x589A, 0x589A, 0x4903, 0x589C, 0x589C, 0x1125, + 0x589D, 0x589D, 0x28A1, 0x589E, 0x589E, 0x1123, 0x589F, 0x589F, 0x1122, + 0x58A0, 0x58A0, 0x28A3, 0x58A1, 0x58A1, 0x28A8, 0x58A3, 0x58A3, 0x28A4, + 0x58A5, 0x58A5, 0x28A7, 0x58A6, 0x58A6, 0x1128, 0x58A7, 0x58A7, 0x3EEB, + 0x58A8, 0x58A8, 0x1288, 0x58A9, 0x58A9, 0x1127, 0x58AA, 0x58AA, 0x40D7, + 0x58AB, 0x58AB, 0x28A0, 0x58AC, 0x58AC, 0x28A6, 0x58AE, 0x58AE, 0x1126, + 0x58AF, 0x58AF, 0x28A5, 0x58B0, 0x58B0, 0x37A4, 0x58B1, 0x58B1, 0x28A2, + 0x58B3, 0x58B3, 0x1124, 0x58B5, 0x58B5, 0x4840, 0x58B6, 0x58B6, 0x3DFD, + 0x58BA, 0x58BA, 0x2B18, 0x58BB, 0x58BB, 0x36EB, 0x58BC, 0x58BC, 0x2B1A, + 0x58BD, 0x58BD, 0x2B15, 0x58BE, 0x58BE, 0x12A4, 0x58BF, 0x58BF, 0x2B17, + 0x58C1, 0x58C1, 0x12A3, 0x58C2, 0x58C2, 0x2B19, 0x58C5, 0x58C5, 0x12A6, + 0x58C6, 0x58C6, 0x2B1B, 0x58C7, 0x58C7, 0x12A5, 0x58C8, 0x58C8, 0x2B14, + 0x58C9, 0x58C9, 0x2B16, 0x58CB, 0x58CB, 0x3A09, 0x58CE, 0x58CE, 0x13C2, + 0x58CF, 0x58CF, 0x2D4D, 0x58D1, 0x58D1, 0x13C1, 0x58D2, 0x58D2, 0x2D4E, + 0x58D3, 0x58D3, 0x13C0, 0x58D4, 0x58D4, 0x2D4C, 0x58D5, 0x58D5, 0x13BF, + 0x58D6, 0x58D6, 0x2D4B, 0x58D8, 0x58D8, 0x14CD, 0x58D9, 0x58D9, 0x14CC, + 0x58DA, 0x58DA, 0x3085, 0x58DB, 0x58DB, 0x3087, 0x58DC, 0x58DC, 0x40DA, + 0x58DD, 0x58DD, 0x3086, 0x58DE, 0x58DF, 0x1578, 0x58E0, 0x58E0, 0x40D9, + 0x58E2, 0x58E2, 0x157A, 0x58E3, 0x58E3, 0x31CB, 0x58E4, 0x58E4, 0x160E, + 0x58E7, 0x58E7, 0x3411, 0x58E8, 0x58E8, 0x3410, 0x58E9, 0x58E9, 0x1720, + 0x58EB, 0x58EB, 0x027B, 0x58EC, 0x58EC, 0x02C1, 0x58EF, 0x58EF, 0x046F, + 0x58F0, 0x58F0, 0x4549, 0x58F2, 0x58F2, 0x3D68, 0x58F3, 0x58F3, 0x3C7A, + 0x58F4, 0x58F4, 0x1A9B, 0x58F9, 0x58FA, 0x0C20, 0x58FB, 0x58FB, 0x40DC, + 0x58FC, 0x58FC, 0x23A2, 0x58FD, 0x58FD, 0x0FAA, 0x58FE, 0x58FE, 0x264B, + 0x58FF, 0x58FF, 0x28A9, 0x5902, 0x5902, 0x0224, 0x5903, 0x5903, 0x1785, + 0x5904, 0x5904, 0x454A, 0x5905, 0x5905, 0x4599, 0x5906, 0x5906, 0x1857, + 0x5907, 0x5907, 0x454B, 0x590A, 0x590A, 0x0224, 0x590C, 0x590C, 0x1944, + 0x590D, 0x590D, 0x1A9C, 0x590E, 0x590E, 0x1C6C, 0x590F, 0x590F, 0x0880, + 0x5911, 0x5911, 0x4274, 0x5912, 0x5912, 0x3088, 0x5914, 0x5914, 0x166D, + 0x5915, 0x5915, 0x027C, 0x5916, 0x5916, 0x032E, 0x5917, 0x5917, 0x179C, + 0x5919, 0x591A, 0x03B4, 0x591C, 0x591C, 0x0581, 0x591F, 0x591F, 0x40E3, + 0x5920, 0x5920, 0x0A44, 0x5922, 0x5922, 0x0FAC, 0x5924, 0x5924, 0x0FAD, + 0x5925, 0x5925, 0x0FAB, 0x5927, 0x5927, 0x027D, 0x5929, 0x5929, 0x02C2, + 0x592A, 0x592A, 0x02C4, 0x592B, 0x592B, 0x02C3, 0x592C, 0x592C, 0x1786, + 0x592D, 0x592D, 0x02C5, 0x592E, 0x592E, 0x032F, 0x592F, 0x592F, 0x179D, + 0x5931, 0x5931, 0x0330, 0x5932, 0x5932, 0x454C, 0x5934, 0x5934, 0x454D, + 0x5937, 0x5938, 0x03B6, 0x593C, 0x593C, 0x17D4, 0x593E, 0x593E, 0x0470, + 0x5940, 0x5940, 0x1858, 0x5944, 0x5944, 0x0585, 0x5945, 0x5945, 0x1945, + 0x5947, 0x5948, 0x0583, 0x5949, 0x5949, 0x0582, 0x594A, 0x594A, 0x1C6D, + 0x594E, 0x594E, 0x06F2, 0x594F, 0x594F, 0x06F1, 0x5950, 0x5950, 0x06F3, + 0x5951, 0x5951, 0x06F0, 0x5953, 0x5953, 0x1A9D, 0x5954, 0x5954, 0x0586, + 0x5955, 0x5955, 0x06EF, 0x5957, 0x5958, 0x0881, 0x595A, 0x595A, 0x0883, + 0x595C, 0x595C, 0x1E95, 0x5960, 0x5960, 0x0C22, 0x5961, 0x5961, 0x20EF, + 0x5962, 0x5962, 0x0A45, 0x5965, 0x5965, 0x4852, 0x5967, 0x5967, 0x0DF3, + 0x5969, 0x5969, 0x0FAF, 0x596A, 0x596A, 0x0FAE, 0x596B, 0x596B, 0x264C, + 0x596D, 0x596D, 0x1129, 0x596E, 0x596E, 0x12A7, 0x5970, 0x5970, 0x2F17, + 0x5971, 0x5971, 0x337B, 0x5972, 0x5972, 0x3412, 0x5973, 0x5973, 0x027E, + 0x5974, 0x5974, 0x0331, 0x5975, 0x5975, 0x3E6A, 0x5976, 0x5976, 0x0332, + 0x5977, 0x5977, 0x17DA, 0x5978, 0x5978, 0x03B9, 0x5979, 0x5979, 0x03BC, + 0x597B, 0x597B, 0x17D8, 0x597C, 0x597C, 0x17D6, 0x597D, 0x597D, 0x03BB, + 0x597E, 0x597E, 0x17D9, 0x597F, 0x597F, 0x17DB, 0x5980, 0x5980, 0x17D5, + 0x5981, 0x5981, 0x03BE, 0x5982, 0x5982, 0x03BD, 0x5983, 0x5983, 0x03BA, + 0x5984, 0x5984, 0x03B8, 0x5985, 0x5985, 0x17D7, 0x5989, 0x5989, 0x3D30, + 0x598A, 0x598A, 0x047B, 0x598D, 0x598D, 0x0478, 0x598E, 0x598E, 0x185D, + 0x598F, 0x598F, 0x1860, 0x5990, 0x5990, 0x185F, 0x5992, 0x5992, 0x0472, + 0x5993, 0x5993, 0x047A, 0x5994, 0x5994, 0x3C99, 0x5996, 0x5996, 0x0477, + 0x5997, 0x5997, 0x185C, 0x5998, 0x5998, 0x185A, 0x5999, 0x5999, 0x0476, + 0x599A, 0x599A, 0x3BB0, 0x599D, 0x599D, 0x0471, 0x599E, 0x599E, 0x0474, + 0x599F, 0x599F, 0x3DAF, 0x59A0, 0x59A0, 0x185B, 0x59A1, 0x59A1, 0x1862, + 0x59A2, 0x59A2, 0x185E, 0x59A3, 0x59A3, 0x0475, 0x59A4, 0x59A4, 0x0479, + 0x59A5, 0x59A5, 0x047C, 0x59A6, 0x59A6, 0x1859, 0x59A7, 0x59A7, 0x1861, + 0x59A8, 0x59A8, 0x0473, 0x59AC, 0x59AC, 0x3D81, 0x59AE, 0x59AE, 0x058B, + 0x59AF, 0x59AF, 0x0593, 0x59B0, 0x59B0, 0x3CD8, 0x59B1, 0x59B1, 0x1951, + 0x59B2, 0x59B2, 0x194A, 0x59B3, 0x59B3, 0x0594, 0x59B4, 0x59B4, 0x1955, + 0x59B5, 0x59B5, 0x1946, 0x59B6, 0x59B6, 0x194D, 0x59B7, 0x59B7, 0x3F2D, + 0x59B8, 0x59B8, 0x3A10, 0x59B9, 0x59B9, 0x058A, 0x59BA, 0x59BA, 0x1947, + 0x59BB, 0x59BB, 0x0588, 0x59BC, 0x59BC, 0x194E, 0x59BD, 0x59BD, 0x1952, + 0x59BE, 0x59BE, 0x0587, 0x59C0, 0x59C0, 0x1953, 0x59C1, 0x59C1, 0x194C, + 0x59C3, 0x59C3, 0x194F, 0x59C4, 0x59C4, 0x3D04, 0x59C5, 0x59C5, 0x0596, + 0x59C6, 0x59C6, 0x058D, 0x59C7, 0x59C7, 0x1956, 0x59C8, 0x59C8, 0x1954, + 0x59C9, 0x59C9, 0x40EC, 0x59CA, 0x59CA, 0x0592, 0x59CB, 0x59CB, 0x0590, + 0x59CC, 0x59CC, 0x194B, 0x59CD, 0x59CD, 0x058F, 0x59CE, 0x59CE, 0x1949, + 0x59CF, 0x59CF, 0x1948, 0x59D0, 0x59D0, 0x058E, 0x59D1, 0x59D1, 0x058C, + 0x59D2, 0x59D2, 0x0595, 0x59D3, 0x59D3, 0x0591, 0x59D4, 0x59D4, 0x0589, + 0x59D6, 0x59D6, 0x1950, 0x59D8, 0x59D8, 0x06F5, 0x59D9, 0x59D9, 0x40F1, + 0x59DA, 0x59DA, 0x06FC, 0x59DB, 0x59DB, 0x1AAB, 0x59DC, 0x59DC, 0x06F4, + 0x59DD, 0x59DD, 0x1AA3, 0x59DE, 0x59DE, 0x1A9F, 0x59E0, 0x59E0, 0x1AAF, + 0x59E1, 0x59E1, 0x1A9E, 0x59E3, 0x59E3, 0x06F7, 0x59E4, 0x59E4, 0x1AA8, + 0x59E5, 0x59E5, 0x06FA, 0x59E6, 0x59E6, 0x06FD, 0x59E8, 0x59E8, 0x06F8, + 0x59E9, 0x59E9, 0x1AAC, 0x59EA, 0x59EA, 0x06FB, 0x59EB, 0x59EB, 0x3D59, + 0x59EC, 0x59EC, 0x088A, 0x59ED, 0x59ED, 0x1AB2, 0x59EE, 0x59EE, 0x1AA0, + 0x59EF, 0x59EF, 0x3D38, 0x59F0, 0x59F0, 0x3BB2, 0x59F1, 0x59F1, 0x1AA2, + 0x59F2, 0x59F2, 0x1AA9, 0x59F3, 0x59F3, 0x1AAD, 0x59F4, 0x59F4, 0x1AB1, + 0x59F5, 0x59F5, 0x1AAE, 0x59F6, 0x59F6, 0x1AA7, 0x59F7, 0x59F7, 0x1AAA, + 0x59F8, 0x59F8, 0x3E4A, 0x59F9, 0x59F9, 0x40F8, 0x59FA, 0x59FA, 0x1AA4, + 0x59FB, 0x59FB, 0x06FF, 0x59FC, 0x59FC, 0x1AA6, 0x59FD, 0x59FD, 0x1AA5, + 0x59FE, 0x59FE, 0x1AB0, 0x59FF, 0x59FF, 0x06F6, 0x5A00, 0x5A00, 0x1AA1, + 0x5A01, 0x5A01, 0x06FE, 0x5A02, 0x5A02, 0x3B8D, 0x5A03, 0x5A03, 0x06F9, + 0x5A09, 0x5A09, 0x0890, 0x5A0A, 0x5A0A, 0x1C75, 0x5A0B, 0x5A0B, 0x3C89, + 0x5A0C, 0x5A0C, 0x088F, 0x5A0D, 0x5A0D, 0x3B38, 0x5A0F, 0x5A0F, 0x1C73, + 0x5A11, 0x5A11, 0x0884, 0x5A12, 0x5A12, 0x3A13, 0x5A13, 0x5A13, 0x0889, + 0x5A15, 0x5A15, 0x1C72, 0x5A16, 0x5A16, 0x1C6F, 0x5A17, 0x5A17, 0x1C74, + 0x5A18, 0x5A18, 0x0885, 0x5A19, 0x5A19, 0x1C6E, 0x5A1B, 0x5A1B, 0x0888, + 0x5A1C, 0x5A1C, 0x0886, 0x5A1E, 0x5A1E, 0x1C76, 0x5A1F, 0x5A1F, 0x0887, + 0x5A20, 0x5A20, 0x088B, 0x5A21, 0x5A21, 0x3A1B, 0x5A23, 0x5A23, 0x088C, + 0x5A24, 0x5A24, 0x40E8, 0x5A25, 0x5A25, 0x088E, 0x5A27, 0x5A27, 0x3DE1, + 0x5A29, 0x5A29, 0x088D, 0x5A2A, 0x5A2A, 0x3B3B, 0x5A2B, 0x5A2B, 0x3D40, + 0x5A2C, 0x5A2C, 0x3A0F, 0x5A2D, 0x5A2E, 0x1C70, 0x5A33, 0x5A33, 0x1C77, + 0x5A35, 0x5A35, 0x1E9C, 0x5A36, 0x5A36, 0x0A46, 0x5A37, 0x5A37, 0x20FD, + 0x5A38, 0x5A38, 0x1E9B, 0x5A39, 0x5A39, 0x1EAE, 0x5A3C, 0x5A3C, 0x0A4C, + 0x5A3D, 0x5A3D, 0x3AC0, 0x5A3E, 0x5A3E, 0x1EAC, 0x5A40, 0x5A40, 0x0A4B, + 0x5A41, 0x5A41, 0x0A47, 0x5A42, 0x5A42, 0x1EB5, 0x5A43, 0x5A43, 0x1EA5, + 0x5A44, 0x5A44, 0x1EA8, 0x5A45, 0x5A45, 0x3917, 0x5A46, 0x5A46, 0x0A4F, + 0x5A47, 0x5A47, 0x1EB2, 0x5A48, 0x5A48, 0x1EAA, 0x5A49, 0x5A49, 0x0A48, + 0x5A4A, 0x5A4A, 0x0A50, 0x5A4C, 0x5A4C, 0x1EAF, 0x5A4D, 0x5A4D, 0x1EAD, + 0x5A50, 0x5A50, 0x1E9E, 0x5A51, 0x5A51, 0x1EB3, 0x5A52, 0x5A52, 0x1EA7, + 0x5A53, 0x5A53, 0x1EA2, 0x5A54, 0x5A54, 0x4603, 0x5A55, 0x5A55, 0x1E98, + 0x5A56, 0x5A56, 0x1EB4, 0x5A57, 0x5A57, 0x1EA4, 0x5A58, 0x5A58, 0x1E97, + 0x5A59, 0x5A59, 0x3B34, 0x5A5A, 0x5A5A, 0x0A4E, 0x5A5B, 0x5A5B, 0x1EA9, + 0x5A5C, 0x5A5C, 0x1EB6, 0x5A5D, 0x5A5D, 0x1EA6, 0x5A5E, 0x5A5E, 0x1E9A, + 0x5A5F, 0x5A5F, 0x1E9F, 0x5A60, 0x5A60, 0x1E96, 0x5A61, 0x5A61, 0x3D33, + 0x5A62, 0x5A62, 0x0A4D, 0x5A63, 0x5A63, 0x40FB, 0x5A64, 0x5A64, 0x1EA3, + 0x5A65, 0x5A65, 0x1EA0, 0x5A66, 0x5A66, 0x0A49, 0x5A67, 0x5A67, 0x1E99, + 0x5A68, 0x5A68, 0x39B7, 0x5A69, 0x5A69, 0x1EB1, 0x5A6A, 0x5A6A, 0x0A4A, + 0x5A6B, 0x5A6B, 0x3A42, 0x5A6C, 0x5A6C, 0x1EA1, 0x5A6D, 0x5A6D, 0x1E9D, + 0x5A6E, 0x5A6E, 0x3D3F, 0x5A70, 0x5A70, 0x1EB0, 0x5A71, 0x5A71, 0x3D34, + 0x5A77, 0x5A77, 0x0C23, 0x5A78, 0x5A78, 0x20F6, 0x5A79, 0x5A79, 0x3CE1, + 0x5A7A, 0x5A7A, 0x20F3, 0x5A7B, 0x5A7B, 0x2104, 0x5A7C, 0x5A7C, 0x20F8, + 0x5A7D, 0x5A7D, 0x2105, 0x5A7E, 0x5A7E, 0x3A11, 0x5A7F, 0x5A7F, 0x0C25, + 0x5A81, 0x5A81, 0x3A1D, 0x5A82, 0x5A82, 0x3D31, 0x5A83, 0x5A83, 0x2101, + 0x5A84, 0x5A84, 0x20FE, 0x5A86, 0x5A86, 0x3B81, 0x5A88, 0x5A88, 0x4263, + 0x5A8A, 0x5A8A, 0x20FF, 0x5A8B, 0x5A8B, 0x2102, 0x5A8C, 0x5A8C, 0x2106, + 0x5A8E, 0x5A8E, 0x1EAB, 0x5A8F, 0x5A8F, 0x2108, 0x5A90, 0x5A90, 0x23B6, + 0x5A91, 0x5A91, 0x4235, 0x5A92, 0x5A92, 0x0C26, 0x5A93, 0x5A93, 0x2109, + 0x5A94, 0x5A94, 0x20F1, 0x5A95, 0x5A95, 0x20FB, 0x5A96, 0x5A96, 0x4100, + 0x5A97, 0x5A97, 0x2100, 0x5A99, 0x5A99, 0x3A0A, 0x5A9A, 0x5A9A, 0x0C24, + 0x5A9B, 0x5A9B, 0x0C27, 0x5A9C, 0x5A9C, 0x2107, 0x5A9D, 0x5A9D, 0x210A, + 0x5A9E, 0x5A9E, 0x20F5, 0x5A9F, 0x5A9F, 0x20F2, 0x5AA0, 0x5AA0, 0x4172, + 0x5AA1, 0x5AA1, 0x3CDC, 0x5AA2, 0x5AA2, 0x20F4, 0x5AA5, 0x5AA5, 0x20F9, + 0x5AA6, 0x5AA6, 0x20F7, 0x5AA7, 0x5AA7, 0x0C28, 0x5AA9, 0x5AA9, 0x2103, + 0x5AAB, 0x5AAB, 0x40FA, 0x5AAC, 0x5AAC, 0x20FA, 0x5AAE, 0x5AAE, 0x20FC, + 0x5AAF, 0x5AAF, 0x20F0, 0x5AB0, 0x5AB0, 0x23AA, 0x5AB1, 0x5AB1, 0x23A8, + 0x5AB2, 0x5AB2, 0x0DFC, 0x5AB3, 0x5AB3, 0x0DFA, 0x5AB4, 0x5AB4, 0x23B2, + 0x5AB5, 0x5AB5, 0x23A9, 0x5AB6, 0x5AB6, 0x23B3, 0x5AB7, 0x5AB7, 0x23AF, + 0x5AB8, 0x5AB8, 0x23A7, 0x5AB9, 0x5AB9, 0x23B5, 0x5ABA, 0x5ABA, 0x23A6, + 0x5ABB, 0x5ABB, 0x23AD, 0x5ABC, 0x5ABC, 0x0DF9, 0x5ABD, 0x5ABD, 0x0DF8, + 0x5ABE, 0x5ABE, 0x0DF7, 0x5ABF, 0x5ABF, 0x23AB, 0x5AC0, 0x5AC0, 0x23B0, + 0x5AC1, 0x5AC1, 0x0DF4, 0x5AC2, 0x5AC2, 0x0DFB, 0x5AC3, 0x5AC3, 0x3896, + 0x5AC4, 0x5AC4, 0x23A4, 0x5AC6, 0x5AC6, 0x23AE, 0x5AC7, 0x5AC7, 0x23A3, + 0x5AC8, 0x5AC8, 0x23AC, 0x5AC9, 0x5AC9, 0x0DF5, 0x5ACA, 0x5ACA, 0x23B1, + 0x5ACB, 0x5ACB, 0x23A5, 0x5ACC, 0x5ACC, 0x0DF6, 0x5ACD, 0x5ACD, 0x23B4, + 0x5ACE, 0x5ACE, 0x3C88, 0x5ACF, 0x5ACF, 0x43B5, 0x5AD3, 0x5AD3, 0x4102, + 0x5AD5, 0x5AD5, 0x2650, 0x5AD6, 0x5AD6, 0x0FB4, 0x5AD7, 0x5AD7, 0x0FB3, + 0x5AD8, 0x5AD8, 0x0FB5, 0x5AD9, 0x5AD9, 0x265C, 0x5ADA, 0x5ADA, 0x2652, + 0x5ADB, 0x5ADB, 0x2658, 0x5ADC, 0x5ADC, 0x264D, 0x5ADD, 0x5ADD, 0x265B, + 0x5ADE, 0x5ADE, 0x265A, 0x5ADF, 0x5ADF, 0x265E, 0x5AE0, 0x5AE0, 0x2657, + 0x5AE1, 0x5AE1, 0x0FB0, 0x5AE2, 0x5AE2, 0x2656, 0x5AE3, 0x5AE3, 0x0FB6, + 0x5AE4, 0x5AE4, 0x3B86, 0x5AE5, 0x5AE5, 0x264F, 0x5AE6, 0x5AE6, 0x0FB1, + 0x5AE8, 0x5AE8, 0x265D, 0x5AE9, 0x5AE9, 0x0FB2, 0x5AEA, 0x5AEA, 0x2651, + 0x5AEB, 0x5AEB, 0x2654, 0x5AEC, 0x5AEC, 0x2659, 0x5AED, 0x5AED, 0x2653, + 0x5AEE, 0x5AEE, 0x264E, 0x5AF0, 0x5AF0, 0x3EE7, 0x5AF2, 0x5AF2, 0x37F5, + 0x5AF3, 0x5AF3, 0x2655, 0x5AF4, 0x5AF4, 0x28AB, 0x5AF5, 0x5AF5, 0x112D, + 0x5AF6, 0x5AF6, 0x28AE, 0x5AF7, 0x5AF7, 0x28AD, 0x5AF8, 0x5AF8, 0x28B0, + 0x5AF9, 0x5AF9, 0x28B2, 0x5AFA, 0x5AFA, 0x36EE, 0x5AFB, 0x5AFB, 0x112B, + 0x5AFD, 0x5AFD, 0x28AC, 0x5AFE, 0x5AFE, 0x3C1D, 0x5AFF, 0x5AFF, 0x28AA, + 0x5B01, 0x5B01, 0x28B3, 0x5B02, 0x5B02, 0x28B1, 0x5B03, 0x5B03, 0x28AF, + 0x5B05, 0x5B05, 0x28B5, 0x5B07, 0x5B07, 0x28B4, 0x5B08, 0x5B08, 0x112F, + 0x5B09, 0x5B09, 0x112A, 0x5B0B, 0x5B0B, 0x112C, 0x5B0C, 0x5B0C, 0x112E, + 0x5B0D, 0x5B0D, 0x48FF, 0x5B0F, 0x5B0F, 0x28B6, 0x5B10, 0x5B10, 0x2B22, + 0x5B11, 0x5B11, 0x3BF6, 0x5B13, 0x5B13, 0x2B21, 0x5B14, 0x5B14, 0x2B20, + 0x5B16, 0x5B16, 0x2B23, 0x5B17, 0x5B17, 0x2B1C, 0x5B19, 0x5B19, 0x2B1D, + 0x5B1A, 0x5B1A, 0x2B25, 0x5B1B, 0x5B1B, 0x2B1E, 0x5B1D, 0x5B1D, 0x12A8, + 0x5B1E, 0x5B1E, 0x2B27, 0x5B1F, 0x5B1F, 0x4941, 0x5B20, 0x5B20, 0x2B26, + 0x5B21, 0x5B21, 0x2B1F, 0x5B23, 0x5B23, 0x2D52, 0x5B24, 0x5B24, 0x13C5, + 0x5B25, 0x5B25, 0x2D50, 0x5B26, 0x5B26, 0x2D55, 0x5B27, 0x5B27, 0x2D54, + 0x5B28, 0x5B28, 0x2B24, 0x5B2A, 0x5B2A, 0x13C4, 0x5B2B, 0x5B2B, 0x3B84, + 0x5B2C, 0x5B2C, 0x2D53, 0x5B2D, 0x5B2D, 0x2D4F, 0x5B2E, 0x5B2E, 0x2D57, + 0x5B2F, 0x5B2F, 0x2D56, 0x5B30, 0x5B30, 0x13C3, 0x5B32, 0x5B32, 0x2D51, + 0x5B34, 0x5B34, 0x12A9, 0x5B38, 0x5B38, 0x14CE, 0x5B3C, 0x5B3C, 0x2F18, + 0x5B3D, 0x5B3F, 0x3089, 0x5B40, 0x5B40, 0x160F, 0x5B41, 0x5B41, 0x38C8, + 0x5B43, 0x5B43, 0x1610, 0x5B44, 0x5B44, 0x3A44, 0x5B45, 0x5B45, 0x31CC, + 0x5B46, 0x5B46, 0x42B2, 0x5B47, 0x5B47, 0x32CD, 0x5B48, 0x5B48, 0x32CC, + 0x5B4A, 0x5B4A, 0x38CD, 0x5B4B, 0x5B4C, 0x337C, 0x5B4D, 0x5B4D, 0x3413, + 0x5B4E, 0x5B4E, 0x3482, 0x5B4F, 0x5B4F, 0x3A31, 0x5B50, 0x5B51, 0x027F, + 0x5B53, 0x5B53, 0x0281, 0x5B54, 0x5B54, 0x02C6, 0x5B55, 0x5B55, 0x0333, + 0x5B56, 0x5B56, 0x17DC, 0x5B57, 0x5B58, 0x03BF, 0x5B5A, 0x5B5B, 0x047F, + 0x5B5C, 0x5B5C, 0x047E, 0x5B5D, 0x5B5D, 0x047D, 0x5B5F, 0x5B5F, 0x0597, + 0x5B62, 0x5B62, 0x1957, 0x5B63, 0x5B63, 0x0599, 0x5B64, 0x5B64, 0x0598, + 0x5B65, 0x5B65, 0x1958, 0x5B66, 0x5B66, 0x454E, 0x5B68, 0x5B68, 0x461D, + 0x5B69, 0x5B69, 0x0700, 0x5B6B, 0x5B6B, 0x0891, 0x5B6C, 0x5B6C, 0x1C78, + 0x5B6D, 0x5B6D, 0x3E5F, 0x5B6E, 0x5B6E, 0x1EB8, 0x5B70, 0x5B70, 0x0A51, + 0x5B71, 0x5B71, 0x0C2A, 0x5B72, 0x5B72, 0x1EB7, 0x5B73, 0x5B73, 0x0C29, + 0x5B74, 0x5B74, 0x3732, 0x5B75, 0x5B75, 0x0FB7, 0x5B76, 0x5B76, 0x410A, + 0x5B77, 0x5B77, 0x265F, 0x5B78, 0x5B78, 0x12AA, 0x5B7A, 0x5B7A, 0x13C6, + 0x5B7B, 0x5B7B, 0x2D58, 0x5B7C, 0x5B7C, 0x410C, 0x5B7D, 0x5B7D, 0x1611, + 0x5B7F, 0x5B7F, 0x16C0, 0x5B80, 0x5B80, 0x0225, 0x5B81, 0x5B81, 0x179E, + 0x5B82, 0x5B82, 0x4044, 0x5B83, 0x5B83, 0x0334, 0x5B84, 0x5B84, 0x179F, + 0x5B85, 0x5B85, 0x03C3, 0x5B87, 0x5B88, 0x03C1, 0x5B89, 0x5B89, 0x03C4, + 0x5B8B, 0x5B8B, 0x0482, 0x5B8C, 0x5B8C, 0x0481, 0x5B8E, 0x5B8E, 0x1863, + 0x5B8F, 0x5B8F, 0x0483, 0x5B90, 0x5B90, 0x48E9, 0x5B92, 0x5B92, 0x1864, + 0x5B93, 0x5B93, 0x1959, 0x5B95, 0x5B95, 0x195A, 0x5B97, 0x5B97, 0x059A, + 0x5B98, 0x5B98, 0x059C, 0x5B99, 0x5B99, 0x059E, 0x5B9A, 0x5B9A, 0x059B, + 0x5B9B, 0x5B9B, 0x059F, 0x5B9C, 0x5B9C, 0x059D, 0x5B9D, 0x5B9D, 0x4116, + 0x5B9E, 0x5B9F, 0x454F, 0x5BA2, 0x5BA2, 0x0704, 0x5BA3, 0x5BA3, 0x0701, + 0x5BA4, 0x5BA4, 0x0703, 0x5BA5, 0x5BA5, 0x0705, 0x5BA6, 0x5BA6, 0x0702, + 0x5BA7, 0x5BA7, 0x1C79, 0x5BA8, 0x5BA8, 0x1AB3, 0x5BAA, 0x5BAA, 0x417B, + 0x5BAC, 0x5BAC, 0x1C7B, 0x5BAD, 0x5BAD, 0x1C7A, 0x5BAE, 0x5BAE, 0x0897, + 0x5BB0, 0x5BB0, 0x0893, 0x5BB3, 0x5BB3, 0x0894, 0x5BB4, 0x5BB4, 0x0896, + 0x5BB5, 0x5BB5, 0x0898, 0x5BB6, 0x5BB6, 0x0895, 0x5BB8, 0x5BB8, 0x089A, + 0x5BB9, 0x5BB9, 0x0899, 0x5BBF, 0x5BBF, 0x0A56, 0x5BC0, 0x5BC0, 0x1EBA, + 0x5BC1, 0x5BC1, 0x1EB9, 0x5BC2, 0x5BC2, 0x0A55, 0x5BC3, 0x5BC3, 0x3F25, + 0x5BC4, 0x5BC4, 0x0A54, 0x5BC5, 0x5BC5, 0x0A53, 0x5BC6, 0x5BC6, 0x0A57, + 0x5BC7, 0x5BC7, 0x0A52, 0x5BCA, 0x5BCA, 0x2110, 0x5BCB, 0x5BCB, 0x210D, + 0x5BCC, 0x5BCC, 0x0C2C, 0x5BCD, 0x5BCD, 0x210C, 0x5BCE, 0x5BCE, 0x2111, + 0x5BD0, 0x5BD0, 0x0C2E, 0x5BD1, 0x5BD1, 0x210F, 0x5BD2, 0x5BD2, 0x0C2B, + 0x5BD3, 0x5BD3, 0x0C2D, 0x5BD4, 0x5BD4, 0x210E, 0x5BD5, 0x5BD5, 0x4111, + 0x5BD6, 0x5BD6, 0x23B7, 0x5BD7, 0x5BD7, 0x42BB, 0x5BD8, 0x5BD9, 0x23B8, + 0x5BDE, 0x5BDE, 0x0FB8, 0x5BDF, 0x5BDF, 0x0FC0, 0x5BE0, 0x5BE0, 0x2660, + 0x5BE1, 0x5BE1, 0x0FBA, 0x5BE2, 0x5BE2, 0x0FBE, 0x5BE3, 0x5BE3, 0x2661, + 0x5BE4, 0x5BE4, 0x0FBF, 0x5BE5, 0x5BE6, 0x0FBB, 0x5BE7, 0x5BE7, 0x0FB9, + 0x5BE8, 0x5BE8, 0x0FBD, 0x5BE9, 0x5BE9, 0x1132, 0x5BEA, 0x5BEA, 0x210B, + 0x5BEB, 0x5BEB, 0x1133, 0x5BEC, 0x5BEC, 0x1131, 0x5BEE, 0x5BEE, 0x1130, + 0x5BEF, 0x5BEF, 0x2B28, 0x5BF0, 0x5BF0, 0x12AB, 0x5BF1, 0x5BF2, 0x2D59, + 0x5BF3, 0x5BF3, 0x4115, 0x5BF5, 0x5BF5, 0x157B, 0x5BF6, 0x5BF6, 0x1612, + 0x5BF8, 0x5BF8, 0x0282, 0x5BFA, 0x5BFA, 0x03C5, 0x5BFF, 0x5BFF, 0x40DD, + 0x5C01, 0x5C01, 0x0706, 0x5C03, 0x5C03, 0x1C7C, 0x5C04, 0x5C04, 0x089B, + 0x5C05, 0x5C05, 0x4118, 0x5C07, 0x5C07, 0x0A5A, 0x5C08, 0x5C08, 0x0A59, + 0x5C09, 0x5C09, 0x0A58, 0x5C0A, 0x5C0B, 0x0C2F, 0x5C0C, 0x5C0C, 0x2112, + 0x5C0D, 0x5C0D, 0x0FC1, 0x5C0E, 0x5C0E, 0x12AC, 0x5C0F, 0x5C0F, 0x0283, + 0x5C10, 0x5C10, 0x1787, 0x5C11, 0x5C11, 0x02C7, 0x5C12, 0x5C12, 0x17A0, + 0x5C13, 0x5C13, 0x411A, 0x5C14, 0x5C14, 0x411C, 0x5C15, 0x5C15, 0x17DD, + 0x5C16, 0x5C16, 0x03C6, 0x5C1A, 0x5C1A, 0x05A0, 0x5C1C, 0x5C1C, 0x45EA, + 0x5C1E, 0x5C1E, 0x3A29, 0x5C1F, 0x5C1F, 0x23BA, 0x5C20, 0x5C20, 0x3D89, + 0x5C22, 0x5C22, 0x0284, 0x5C23, 0x5C23, 0x44E8, 0x5C24, 0x5C24, 0x02C8, + 0x5C25, 0x5C25, 0x17DE, 0x5C28, 0x5C28, 0x1865, 0x5C2A, 0x5C2A, 0x1866, + 0x5C2C, 0x5C2C, 0x0484, 0x5C30, 0x5C30, 0x2113, 0x5C31, 0x5C31, 0x0C31, + 0x5C33, 0x5C33, 0x23BB, 0x5C37, 0x5C37, 0x13C7, 0x5C38, 0x5C38, 0x0285, + 0x5C39, 0x5C39, 0x0299, 0x5C3A, 0x5C3A, 0x02C9, 0x5C3B, 0x5C3B, 0x17A1, + 0x5C3C, 0x5C3C, 0x0335, 0x5C3E, 0x5C3E, 0x0488, 0x5C3F, 0x5C3F, 0x0487, + 0x5C40, 0x5C41, 0x0485, 0x5C44, 0x5C44, 0x195B, 0x5C45, 0x5C46, 0x05A2, + 0x5C47, 0x5C47, 0x195C, 0x5C48, 0x5C48, 0x05A1, 0x5C49, 0x5C49, 0x411F, + 0x5C4A, 0x5C4A, 0x3F5C, 0x5C4B, 0x5C4B, 0x070A, 0x5C4C, 0x5C4C, 0x1AB4, + 0x5C4D, 0x5C4D, 0x0709, 0x5C4E, 0x5C4F, 0x0707, 0x5C50, 0x5C50, 0x089E, + 0x5C51, 0x5C51, 0x089C, 0x5C53, 0x5C53, 0x3F02, 0x5C54, 0x5C54, 0x1C7E, + 0x5C55, 0x5C55, 0x089D, 0x5C56, 0x5C56, 0x1C7D, 0x5C58, 0x5C58, 0x0892, + 0x5C59, 0x5C59, 0x1EBB, 0x5C5C, 0x5C5D, 0x0A5C, 0x5C5E, 0x5C5E, 0x3D67, + 0x5C60, 0x5C60, 0x0A5B, 0x5C62, 0x5C62, 0x0FC2, 0x5C63, 0x5C63, 0x2662, + 0x5C64, 0x5C65, 0x1134, 0x5C67, 0x5C67, 0x28B7, 0x5C68, 0x5C68, 0x13C8, + 0x5C69, 0x5C6A, 0x2F19, 0x5C6C, 0x5C6C, 0x166E, 0x5C6D, 0x5C6D, 0x3483, + 0x5C6E, 0x5C6E, 0x1776, 0x5C6F, 0x5C6F, 0x02CA, 0x5C71, 0x5C71, 0x0286, + 0x5C73, 0x5C73, 0x17A3, 0x5C74, 0x5C74, 0x17A2, 0x5C79, 0x5C79, 0x03C7, + 0x5C7A, 0x5C7B, 0x17E0, 0x5C7C, 0x5C7C, 0x17DF, 0x5C7E, 0x5C7E, 0x17E2, + 0x5C85, 0x5C85, 0x4121, 0x5C86, 0x5C86, 0x186E, 0x5C88, 0x5C88, 0x1869, + 0x5C89, 0x5C89, 0x186B, 0x5C8A, 0x5C8A, 0x186D, 0x5C8B, 0x5C8B, 0x186A, + 0x5C8C, 0x5C8C, 0x048C, 0x5C8D, 0x5C8D, 0x1867, 0x5C8F, 0x5C8F, 0x1868, + 0x5C90, 0x5C91, 0x0489, 0x5C92, 0x5C92, 0x186C, 0x5C93, 0x5C93, 0x186F, + 0x5C94, 0x5C94, 0x048B, 0x5C95, 0x5C95, 0x1870, 0x5C99, 0x5C99, 0x468C, + 0x5C9A, 0x5C9A, 0x4551, 0x5C9C, 0x5C9C, 0x495A, 0x5C9D, 0x5C9D, 0x196A, + 0x5C9E, 0x5C9E, 0x3A2A, 0x5C9F, 0x5C9F, 0x1964, 0x5CA0, 0x5CA0, 0x195F, + 0x5CA1, 0x5CA1, 0x05A5, 0x5CA2, 0x5CA2, 0x1967, 0x5CA3, 0x5CA3, 0x1965, + 0x5CA4, 0x5CA4, 0x195E, 0x5CA5, 0x5CA5, 0x196B, 0x5CA6, 0x5CA6, 0x196E, + 0x5CA7, 0x5CA7, 0x1969, 0x5CA8, 0x5CA8, 0x1962, 0x5CA9, 0x5CA9, 0x05A7, + 0x5CAA, 0x5CAA, 0x1968, 0x5CAB, 0x5CAB, 0x05A8, 0x5CAC, 0x5CAC, 0x1963, + 0x5CAD, 0x5CAD, 0x1966, 0x5CAE, 0x5CAE, 0x195D, 0x5CAF, 0x5CAF, 0x1961, + 0x5CB0, 0x5CB0, 0x196D, 0x5CB1, 0x5CB1, 0x05A9, 0x5CB3, 0x5CB3, 0x05AA, + 0x5CB5, 0x5CB5, 0x1960, 0x5CB6, 0x5CB6, 0x196C, 0x5CB7, 0x5CB7, 0x05A4, + 0x5CB8, 0x5CB8, 0x05A6, 0x5CBA, 0x5CBA, 0x412B, 0x5CC1, 0x5CC1, 0x43B8, + 0x5CC2, 0x5CC2, 0x3D4C, 0x5CC6, 0x5CC6, 0x1AC5, 0x5CC7, 0x5CC7, 0x1ABE, + 0x5CC8, 0x5CC8, 0x1AC4, 0x5CC9, 0x5CC9, 0x1ABD, 0x5CCA, 0x5CCA, 0x1ABF, + 0x5CCB, 0x5CCB, 0x1AB9, 0x5CCC, 0x5CCC, 0x1AB7, 0x5CCE, 0x5CCE, 0x1AC6, + 0x5CCF, 0x5CCF, 0x1AC3, 0x5CD0, 0x5CD0, 0x1AB5, 0x5CD1, 0x5CD1, 0x3F13, + 0x5CD2, 0x5CD2, 0x070C, 0x5CD3, 0x5CD4, 0x1AC1, 0x5CD6, 0x5CD6, 0x1AC0, + 0x5CD7, 0x5CD7, 0x1AB8, 0x5CD8, 0x5CD8, 0x1AB6, 0x5CD9, 0x5CD9, 0x070B, + 0x5CDA, 0x5CDA, 0x1ABC, 0x5CDB, 0x5CDB, 0x1ABA, 0x5CDE, 0x5CDE, 0x1ABB, + 0x5CDF, 0x5CDF, 0x1AC7, 0x5CE5, 0x5CE5, 0x4637, 0x5CE8, 0x5CE8, 0x08A3, + 0x5CE9, 0x5CE9, 0x4122, 0x5CEA, 0x5CEA, 0x08A2, 0x5CEC, 0x5CEC, 0x1C7F, + 0x5CED, 0x5CED, 0x089F, 0x5CEE, 0x5CEE, 0x1C81, 0x5CEF, 0x5CEF, 0x4123, + 0x5CF0, 0x5CF0, 0x08A4, 0x5CF1, 0x5CF1, 0x1C82, 0x5CF4, 0x5CF4, 0x08A7, + 0x5CF6, 0x5CF6, 0x08A5, 0x5CF7, 0x5CF7, 0x1C83, 0x5CF8, 0x5CF8, 0x1AC8, + 0x5CF9, 0x5CF9, 0x1C85, 0x5CFB, 0x5CFB, 0x08A1, 0x5CFD, 0x5CFD, 0x08A0, + 0x5CFF, 0x5CFF, 0x1C80, 0x5D00, 0x5D00, 0x1C84, 0x5D01, 0x5D01, 0x08A6, + 0x5D06, 0x5D06, 0x0A5F, 0x5D07, 0x5D07, 0x0A5E, 0x5D0B, 0x5D0B, 0x1EBD, + 0x5D0C, 0x5D0C, 0x1EC1, 0x5D0D, 0x5D0D, 0x1EC3, 0x5D0E, 0x5D0E, 0x0A60, + 0x5D0F, 0x5D0F, 0x1EC6, 0x5D10, 0x5D10, 0x4127, 0x5D11, 0x5D11, 0x0A64, + 0x5D12, 0x5D12, 0x1EC8, 0x5D14, 0x5D14, 0x0A66, 0x5D15, 0x5D15, 0x43B9, + 0x5D16, 0x5D16, 0x0A62, 0x5D17, 0x5D17, 0x0A6A, 0x5D18, 0x5D18, 0x4128, + 0x5D19, 0x5D19, 0x0A67, 0x5D1A, 0x5D1A, 0x1EBF, 0x5D1B, 0x5D1B, 0x0A61, + 0x5D1D, 0x5D1D, 0x1EBE, 0x5D1E, 0x5D1E, 0x1EBC, 0x5D1F, 0x5D1F, 0x1ECA, + 0x5D20, 0x5D20, 0x1EC0, 0x5D22, 0x5D22, 0x0A63, 0x5D23, 0x5D23, 0x1EC9, + 0x5D24, 0x5D24, 0x0A68, 0x5D25, 0x5D25, 0x1EC5, 0x5D26, 0x5D26, 0x1EC4, + 0x5D27, 0x5D27, 0x0A69, 0x5D28, 0x5D28, 0x1EC2, 0x5D29, 0x5D29, 0x0A65, + 0x5D2C, 0x5D2C, 0x3DF7, 0x5D2E, 0x5D2E, 0x1ECB, 0x5D2F, 0x5D2F, 0x46D3, + 0x5D30, 0x5D30, 0x1EC7, 0x5D31, 0x5D31, 0x2122, 0x5D32, 0x5D32, 0x2129, + 0x5D33, 0x5D33, 0x211E, 0x5D34, 0x5D34, 0x0C34, 0x5D35, 0x5D35, 0x211A, + 0x5D36, 0x5D36, 0x212A, 0x5D37, 0x5D37, 0x2114, 0x5D38, 0x5D38, 0x2127, + 0x5D39, 0x5D39, 0x2125, 0x5D3A, 0x5D3A, 0x211F, 0x5D3C, 0x5D3C, 0x2128, + 0x5D3D, 0x5D3D, 0x2121, 0x5D3E, 0x5D3E, 0x4629, 0x5D3F, 0x5D3F, 0x2119, + 0x5D40, 0x5D40, 0x212B, 0x5D41, 0x5D41, 0x2117, 0x5D42, 0x5D42, 0x2124, + 0x5D43, 0x5D43, 0x2115, 0x5D45, 0x5D45, 0x212C, 0x5D46, 0x5D46, 0x4129, + 0x5D47, 0x5D47, 0x0C35, 0x5D48, 0x5D48, 0x462A, 0x5D49, 0x5D49, 0x2126, + 0x5D4A, 0x5D4A, 0x23BE, 0x5D4B, 0x5D4B, 0x2118, 0x5D4C, 0x5D4C, 0x0C32, + 0x5D4E, 0x5D4E, 0x211C, 0x5D50, 0x5D50, 0x0C33, 0x5D51, 0x5D51, 0x211B, + 0x5D52, 0x5D52, 0x2120, 0x5D55, 0x5D55, 0x211D, 0x5D56, 0x5D56, 0x43BA, + 0x5D57, 0x5D57, 0x3FCA, 0x5D59, 0x5D59, 0x2123, 0x5D5B, 0x5D5B, 0x3DD5, + 0x5D5E, 0x5D5E, 0x23C2, 0x5D62, 0x5D62, 0x23C5, 0x5D63, 0x5D63, 0x23BD, + 0x5D65, 0x5D65, 0x23BF, 0x5D67, 0x5D67, 0x23C4, 0x5D68, 0x5D68, 0x23C3, + 0x5D69, 0x5D69, 0x0DFD, 0x5D6B, 0x5D6B, 0x2116, 0x5D6C, 0x5D6C, 0x23C1, + 0x5D6F, 0x5D6F, 0x0DFE, 0x5D70, 0x5D70, 0x46E4, 0x5D71, 0x5D71, 0x23BC, + 0x5D72, 0x5D72, 0x23C0, 0x5D74, 0x5D74, 0x3EEF, 0x5D77, 0x5D77, 0x2669, + 0x5D79, 0x5D79, 0x2670, 0x5D7A, 0x5D7A, 0x2667, 0x5D7C, 0x5D7C, 0x266E, + 0x5D7D, 0x5D7D, 0x2665, 0x5D7E, 0x5D7E, 0x266D, 0x5D7F, 0x5D7F, 0x2671, + 0x5D80, 0x5D80, 0x2664, 0x5D81, 0x5D81, 0x2668, 0x5D82, 0x5D82, 0x2663, + 0x5D84, 0x5D84, 0x0FC3, 0x5D85, 0x5D85, 0x3E34, 0x5D86, 0x5D86, 0x2666, + 0x5D87, 0x5D87, 0x0FC4, 0x5D88, 0x5D88, 0x266C, 0x5D89, 0x5D89, 0x266B, + 0x5D8A, 0x5D8A, 0x266A, 0x5D8B, 0x5D8B, 0x4124, 0x5D8D, 0x5D8D, 0x266F, + 0x5D8E, 0x5D8E, 0x3F0C, 0x5D92, 0x5D92, 0x28BB, 0x5D93, 0x5D93, 0x28BD, + 0x5D94, 0x5D94, 0x1137, 0x5D95, 0x5D95, 0x28BE, 0x5D97, 0x5D97, 0x28B9, + 0x5D99, 0x5D99, 0x28B8, 0x5D9A, 0x5D9A, 0x28C2, 0x5D9C, 0x5D9C, 0x28C0, + 0x5D9D, 0x5D9D, 0x1136, 0x5D9E, 0x5D9E, 0x28C3, 0x5D9F, 0x5D9F, 0x28BA, + 0x5DA0, 0x5DA0, 0x28BF, 0x5DA1, 0x5DA1, 0x28C1, 0x5DA2, 0x5DA2, 0x28BC, + 0x5DA4, 0x5DA4, 0x462D, 0x5DA7, 0x5DA7, 0x2B2C, 0x5DA8, 0x5DA8, 0x2B31, + 0x5DA9, 0x5DA9, 0x2B2B, 0x5DAA, 0x5DAA, 0x2B30, 0x5DAB, 0x5DAB, 0x3E39, + 0x5DAC, 0x5DAC, 0x2B29, 0x5DAD, 0x5DAD, 0x2B33, 0x5DAE, 0x5DAE, 0x2B2F, + 0x5DAF, 0x5DAF, 0x2B34, 0x5DB0, 0x5DB0, 0x2B2E, 0x5DB1, 0x5DB1, 0x2B2A, + 0x5DB2, 0x5DB2, 0x2B32, 0x5DB4, 0x5DB4, 0x2B35, 0x5DB5, 0x5DB5, 0x2B2D, + 0x5DB6, 0x5DB6, 0x4158, 0x5DB7, 0x5DB7, 0x2D5B, 0x5DB8, 0x5DB8, 0x13CC, + 0x5DB9, 0x5DB9, 0x462E, 0x5DBA, 0x5DBA, 0x13CA, 0x5DBC, 0x5DBC, 0x13C9, + 0x5DBD, 0x5DBD, 0x13CB, 0x5DC0, 0x5DC0, 0x2F1B, 0x5DC1, 0x5DC1, 0x3BFF, + 0x5DC2, 0x5DC2, 0x3023, 0x5DC3, 0x5DC3, 0x308C, 0x5DC6, 0x5DC7, 0x31CD, + 0x5DC9, 0x5DC9, 0x1613, 0x5DCB, 0x5DCB, 0x32CE, 0x5DCD, 0x5DCD, 0x166F, + 0x5DCF, 0x5DCF, 0x32CF, 0x5DD1, 0x5DD1, 0x337F, 0x5DD2, 0x5DD2, 0x16C2, + 0x5DD4, 0x5DD4, 0x16C1, 0x5DD5, 0x5DD5, 0x337E, 0x5DD6, 0x5DD6, 0x16F7, + 0x5DD7, 0x5DD7, 0x412C, 0x5DD8, 0x5DD8, 0x3414, 0x5DDB, 0x5DDB, 0x0226, + 0x5DDD, 0x5DDD, 0x0287, 0x5DDE, 0x5DDE, 0x03C8, 0x5DDF, 0x5DDF, 0x17E3, + 0x5DE0, 0x5DE0, 0x1871, 0x5DE1, 0x5DE1, 0x051A, 0x5DE2, 0x5DE2, 0x0A6B, + 0x5DE5, 0x5DE5, 0x0288, 0x5DE6, 0x5DE6, 0x0338, 0x5DE7, 0x5DE7, 0x0337, + 0x5DE8, 0x5DE8, 0x0336, 0x5DEB, 0x5DEB, 0x048D, 0x5DEE, 0x5DEE, 0x08A8, + 0x5DF0, 0x5DF0, 0x23C6, 0x5DF1, 0x5DF3, 0x0289, 0x5DF4, 0x5DF4, 0x02CB, + 0x5DF5, 0x5DF5, 0x3F61, 0x5DF7, 0x5DF7, 0x070D, 0x5DF9, 0x5DF9, 0x1AC9, + 0x5DFD, 0x5DFD, 0x0C36, 0x5DFE, 0x5DFE, 0x028C, 0x5DFF, 0x5DFF, 0x1788, + 0x5E02, 0x5E03, 0x0339, 0x5E04, 0x5E04, 0x17A4, 0x5E06, 0x5E06, 0x03C9, + 0x5E09, 0x5E09, 0x4140, 0x5E0A, 0x5E0A, 0x1872, 0x5E0B, 0x5E0B, 0x3D8A, + 0x5E0C, 0x5E0C, 0x048E, 0x5E0E, 0x5E0E, 0x1873, 0x5E11, 0x5E11, 0x05B0, + 0x5E12, 0x5E12, 0x3F2E, 0x5E14, 0x5E14, 0x1970, 0x5E15, 0x5E15, 0x05AE, + 0x5E16, 0x5E16, 0x05AD, 0x5E17, 0x5E17, 0x196F, 0x5E18, 0x5E18, 0x05AB, + 0x5E19, 0x5E19, 0x1971, 0x5E1A, 0x5E1A, 0x05AC, 0x5E1B, 0x5E1B, 0x05AF, + 0x5E1D, 0x5E1D, 0x070E, 0x5E1F, 0x5E1F, 0x0710, 0x5E20, 0x5E20, 0x1ACD, + 0x5E21, 0x5E23, 0x1ACA, 0x5E24, 0x5E24, 0x1ACE, 0x5E25, 0x5E25, 0x070F, + 0x5E28, 0x5E28, 0x1C87, 0x5E29, 0x5E29, 0x1C86, 0x5E2B, 0x5E2B, 0x08AA, + 0x5E2D, 0x5E2D, 0x08A9, 0x5E2E, 0x5E2E, 0x4135, 0x5E33, 0x5E33, 0x0A6E, + 0x5E34, 0x5E34, 0x1ECD, 0x5E36, 0x5E36, 0x0A6D, 0x5E37, 0x5E37, 0x0A6F, + 0x5E38, 0x5E38, 0x0A6C, 0x5E3D, 0x5E3D, 0x0C38, 0x5E3E, 0x5E3E, 0x1ECC, + 0x5E40, 0x5E40, 0x0C39, 0x5E41, 0x5E41, 0x212E, 0x5E42, 0x5E42, 0x43A0, + 0x5E43, 0x5E43, 0x0C3A, 0x5E44, 0x5E44, 0x212D, 0x5E45, 0x5E45, 0x0C37, + 0x5E48, 0x5E48, 0x3A2C, 0x5E4A, 0x5E4A, 0x23C9, 0x5E4B, 0x5E4B, 0x23CB, + 0x5E4C, 0x5E4C, 0x0DFF, 0x5E4D, 0x5E4D, 0x23CA, 0x5E4E, 0x5E4E, 0x23C8, + 0x5E4F, 0x5E4F, 0x23C7, 0x5E53, 0x5E53, 0x2674, 0x5E54, 0x5E54, 0x0FC9, + 0x5E55, 0x5E55, 0x0FC7, 0x5E57, 0x5E57, 0x0FC8, 0x5E58, 0x5E59, 0x2672, + 0x5E5B, 0x5E5B, 0x0FC5, 0x5E5C, 0x5E5C, 0x28C7, 0x5E5D, 0x5E5D, 0x28C5, + 0x5E5E, 0x5E5E, 0x3A2B, 0x5E5F, 0x5E5F, 0x1139, 0x5E60, 0x5E60, 0x28C6, + 0x5E61, 0x5E61, 0x113A, 0x5E62, 0x5E62, 0x1138, 0x5E63, 0x5E63, 0x0FC6, + 0x5E66, 0x5E66, 0x2B38, 0x5E67, 0x5E68, 0x2B36, 0x5E69, 0x5E69, 0x28C4, + 0x5E6A, 0x5E6A, 0x2D5D, 0x5E6B, 0x5E6B, 0x13CD, 0x5E6C, 0x5E6C, 0x2D5C, + 0x5E6D, 0x5E6E, 0x2F1C, 0x5E6F, 0x5E6F, 0x2B39, 0x5E70, 0x5E70, 0x308D, + 0x5E72, 0x5E72, 0x028D, 0x5E73, 0x5E73, 0x033B, 0x5E74, 0x5E74, 0x03CB, + 0x5E75, 0x5E75, 0x17E4, 0x5E76, 0x5E76, 0x03CA, 0x5E78, 0x5E78, 0x05B1, + 0x5E79, 0x5E79, 0x0E00, 0x5E7A, 0x5E7A, 0x0227, 0x5E7B, 0x5E7B, 0x02CC, + 0x5E7C, 0x5E7C, 0x033C, 0x5E7D, 0x5E7D, 0x0711, 0x5E7E, 0x5E7E, 0x0C3B, + 0x5E7F, 0x5E7F, 0x0228, 0x5E80, 0x5E80, 0x17A5, 0x5E82, 0x5E82, 0x17A6, + 0x5E83, 0x5E83, 0x4108, 0x5E84, 0x5E84, 0x17E5, 0x5E86, 0x5E86, 0x4552, + 0x5E87, 0x5E87, 0x0490, 0x5E88, 0x5E88, 0x1877, 0x5E89, 0x5E89, 0x1875, + 0x5E8A, 0x5E8A, 0x0491, 0x5E8B, 0x5E8B, 0x1874, 0x5E8C, 0x5E8C, 0x1876, + 0x5E8D, 0x5E8D, 0x1878, 0x5E8F, 0x5E8F, 0x048F, 0x5E95, 0x5E96, 0x05B5, + 0x5E97, 0x5E97, 0x05B3, 0x5E9A, 0x5E9A, 0x05B2, 0x5E9B, 0x5E9B, 0x1AD2, + 0x5E9C, 0x5E9C, 0x05B4, 0x5EA0, 0x5EA0, 0x0712, 0x5EA2, 0x5EA2, 0x1AD1, + 0x5EA3, 0x5EA3, 0x1AD3, 0x5EA4, 0x5EA4, 0x1AD0, 0x5EA5, 0x5EA5, 0x1AD4, + 0x5EA6, 0x5EA6, 0x0713, 0x5EA7, 0x5EA7, 0x08AD, 0x5EA8, 0x5EA8, 0x1C88, + 0x5EAA, 0x5EAA, 0x1C8A, 0x5EAB, 0x5EAB, 0x08AB, 0x5EAC, 0x5EAC, 0x1C8B, + 0x5EAD, 0x5EAD, 0x08AC, 0x5EAE, 0x5EAE, 0x1C89, 0x5EB0, 0x5EB0, 0x1ACF, + 0x5EB1, 0x5EB1, 0x1ECE, 0x5EB2, 0x5EB3, 0x1ED1, 0x5EB4, 0x5EB4, 0x1ECF, + 0x5EB5, 0x5EB5, 0x0A73, 0x5EB6, 0x5EB6, 0x0A72, 0x5EB7, 0x5EB8, 0x0A70, + 0x5EB9, 0x5EB9, 0x1ED0, 0x5EBD, 0x5EBD, 0x43BD, 0x5EBE, 0x5EBE, 0x0A74, + 0x5EC1, 0x5EC2, 0x0C3D, 0x5EC4, 0x5EC4, 0x0C3F, 0x5EC5, 0x5EC5, 0x23CC, + 0x5EC6, 0x5EC6, 0x23CE, 0x5EC7, 0x5EC7, 0x23D0, 0x5EC8, 0x5EC8, 0x0E02, + 0x5EC9, 0x5EC9, 0x0E01, 0x5ECA, 0x5ECA, 0x0C3C, 0x5ECB, 0x5ECB, 0x23CF, + 0x5ECC, 0x5ECC, 0x23CD, 0x5ECD, 0x5ECD, 0x3A30, 0x5ECE, 0x5ECE, 0x2678, + 0x5ED0, 0x5ED0, 0x413D, 0x5ED1, 0x5ED1, 0x2676, 0x5ED2, 0x5ED2, 0x267C, + 0x5ED3, 0x5ED3, 0x0FCA, 0x5ED4, 0x5ED4, 0x267D, 0x5ED5, 0x5ED5, 0x267A, + 0x5ED6, 0x5ED6, 0x0FCB, 0x5ED7, 0x5ED7, 0x2677, 0x5ED8, 0x5ED8, 0x2675, + 0x5ED9, 0x5ED9, 0x267B, 0x5EDA, 0x5EDA, 0x113C, 0x5EDB, 0x5EDB, 0x28C9, + 0x5EDC, 0x5EDC, 0x2679, 0x5EDD, 0x5EDD, 0x113E, 0x5EDE, 0x5EDE, 0x28CA, + 0x5EDF, 0x5EDF, 0x113D, 0x5EE0, 0x5EE0, 0x1140, 0x5EE1, 0x5EE1, 0x28CB, + 0x5EE2, 0x5EE2, 0x113B, 0x5EE3, 0x5EE3, 0x113F, 0x5EE5, 0x5EE5, 0x2B3E, + 0x5EE6, 0x5EE6, 0x2B3C, 0x5EE7, 0x5EE7, 0x2B3B, 0x5EE8, 0x5EE8, 0x2B3D, + 0x5EE9, 0x5EE9, 0x2B3A, 0x5EEC, 0x5EEC, 0x157D, 0x5EEE, 0x5EEF, 0x31CF, + 0x5EF1, 0x5EF1, 0x32D0, 0x5EF2, 0x5EF2, 0x3380, 0x5EF3, 0x5EF3, 0x1742, + 0x5EF4, 0x5EF4, 0x0229, 0x5EF6, 0x5EF6, 0x05B7, 0x5EF7, 0x5EF7, 0x0492, + 0x5EF8, 0x5EF8, 0x386F, 0x5EF9, 0x5EF9, 0x4143, 0x5EFA, 0x5EFA, 0x0714, + 0x5EFB, 0x5EFB, 0x4144, 0x5EFC, 0x5EFC, 0x4146, 0x5EFE, 0x5EFE, 0x028E, + 0x5EFF, 0x5EFF, 0x02CD, 0x5F01, 0x5F01, 0x033D, 0x5F02, 0x5F02, 0x17E6, + 0x5F04, 0x5F04, 0x0493, 0x5F05, 0x5F05, 0x1879, 0x5F07, 0x5F07, 0x1AD5, + 0x5F08, 0x5F08, 0x0715, 0x5F0A, 0x5F0A, 0x0FCC, 0x5F0B, 0x5F0B, 0x028F, + 0x5F0C, 0x5F0C, 0x3A3E, 0x5F0D, 0x5F0D, 0x4149, 0x5F0E, 0x5F0E, 0x3A3F, + 0x5F0F, 0x5F0F, 0x03CC, 0x5F12, 0x5F12, 0x0E03, 0x5F13, 0x5F13, 0x0290, + 0x5F14, 0x5F15, 0x02CE, 0x5F17, 0x5F17, 0x033F, 0x5F18, 0x5F18, 0x033E, + 0x5F1A, 0x5F1A, 0x17E7, 0x5F1B, 0x5F1B, 0x03CD, 0x5F1D, 0x5F1D, 0x187A, + 0x5F1F, 0x5F1F, 0x0494, 0x5F22, 0x5F24, 0x1973, 0x5F25, 0x5F25, 0x4630, + 0x5F26, 0x5F27, 0x05B8, 0x5F28, 0x5F28, 0x1972, 0x5F29, 0x5F29, 0x05BA, + 0x5F2D, 0x5F2D, 0x0716, 0x5F2E, 0x5F2E, 0x1AD6, 0x5F30, 0x5F30, 0x1C8D, + 0x5F31, 0x5F31, 0x08AE, 0x5F33, 0x5F33, 0x1C8C, 0x5F35, 0x5F35, 0x0A75, + 0x5F36, 0x5F36, 0x1ED3, 0x5F37, 0x5F37, 0x0A76, 0x5F38, 0x5F38, 0x1ED4, + 0x5F3A, 0x5F3A, 0x414E, 0x5F3C, 0x5F3C, 0x0C40, 0x5F40, 0x5F40, 0x23D1, + 0x5F43, 0x5F43, 0x267F, 0x5F44, 0x5F44, 0x267E, 0x5F46, 0x5F46, 0x0FCD, + 0x5F48, 0x5F48, 0x1141, 0x5F49, 0x5F49, 0x28CC, 0x5F4A, 0x5F4A, 0x12AD, + 0x5F4B, 0x5F4B, 0x2B3F, 0x5F4C, 0x5F4C, 0x13CE, 0x5F4D, 0x5F4D, 0x3BA5, + 0x5F4E, 0x5F4E, 0x16C3, 0x5F4F, 0x5F4F, 0x3416, 0x5F50, 0x5F50, 0x022A, + 0x5F51, 0x5F51, 0x44E9, 0x5F54, 0x5F54, 0x1976, 0x5F56, 0x5F56, 0x1AD7, + 0x5F57, 0x5F57, 0x0A77, 0x5F58, 0x5F58, 0x212F, 0x5F59, 0x5F59, 0x0E04, + 0x5F5C, 0x5F5C, 0x3D5A, 0x5F5D, 0x5F5D, 0x14CF, 0x5F61, 0x5F61, 0x022B, + 0x5F62, 0x5F62, 0x0496, 0x5F63, 0x5F63, 0x4152, 0x5F64, 0x5F64, 0x0495, + 0x5F65, 0x5F65, 0x0717, 0x5F67, 0x5F67, 0x1C8E, 0x5F69, 0x5F69, 0x0A79, + 0x5F6A, 0x5F6A, 0x0B89, 0x5F6B, 0x5F6B, 0x0A7A, 0x5F6C, 0x5F6C, 0x0A78, + 0x5F6D, 0x5F6D, 0x0C41, 0x5F6F, 0x5F6F, 0x2680, 0x5F70, 0x5F70, 0x0FCE, + 0x5F71, 0x5F71, 0x1142, 0x5F72, 0x5F72, 0x4154, 0x5F73, 0x5F73, 0x1777, + 0x5F74, 0x5F74, 0x17E8, 0x5F76, 0x5F76, 0x187C, 0x5F77, 0x5F77, 0x0497, + 0x5F78, 0x5F78, 0x187B, 0x5F79, 0x5F79, 0x0498, 0x5F7B, 0x5F7B, 0x4058, + 0x5F7C, 0x5F7C, 0x05BE, 0x5F7D, 0x5F7D, 0x1979, 0x5F7E, 0x5F7E, 0x1978, + 0x5F7F, 0x5F7F, 0x05BD, 0x5F80, 0x5F81, 0x05BB, 0x5F82, 0x5F82, 0x1977, + 0x5F83, 0x5F83, 0x4631, 0x5F85, 0x5F85, 0x0719, 0x5F86, 0x5F86, 0x1AD8, + 0x5F87, 0x5F87, 0x071C, 0x5F88, 0x5F88, 0x0718, 0x5F89, 0x5F89, 0x071E, + 0x5F8A, 0x5F8B, 0x071A, 0x5F8C, 0x5F8C, 0x071D, 0x5F90, 0x5F90, 0x08B1, + 0x5F91, 0x5F91, 0x08B0, 0x5F92, 0x5F92, 0x08AF, 0x5F96, 0x5F96, 0x1ED6, + 0x5F97, 0x5F97, 0x0A7B, 0x5F98, 0x5F98, 0x0A7E, 0x5F99, 0x5F99, 0x0A7C, + 0x5F9B, 0x5F9B, 0x1ED5, 0x5F9C, 0x5F9C, 0x0A81, 0x5F9E, 0x5F9E, 0x0A7D, + 0x5F9F, 0x5F9F, 0x1ED7, 0x5FA0, 0x5FA0, 0x0A80, 0x5FA1, 0x5FA1, 0x0A7F, + 0x5FA4, 0x5FA4, 0x402C, 0x5FA5, 0x5FA5, 0x2131, 0x5FA6, 0x5FA6, 0x2130, + 0x5FA7, 0x5FA7, 0x4157, 0x5FA8, 0x5FA8, 0x0C44, 0x5FA9, 0x5FAA, 0x0C42, + 0x5FAB, 0x5FAB, 0x2132, 0x5FAC, 0x5FAC, 0x0E05, 0x5FAD, 0x5FAD, 0x23D3, + 0x5FAE, 0x5FAE, 0x0E06, 0x5FAF, 0x5FAF, 0x23D2, 0x5FB1, 0x5FB1, 0x3D98, + 0x5FB2, 0x5FB2, 0x28CD, 0x5FB5, 0x5FB5, 0x1144, 0x5FB6, 0x5FB6, 0x2681, + 0x5FB7, 0x5FB7, 0x1143, 0x5FB9, 0x5FB9, 0x0FCF, 0x5FBA, 0x5FBA, 0x3F9F, + 0x5FBB, 0x5FBB, 0x2B41, 0x5FBC, 0x5FBC, 0x2B40, 0x5FBD, 0x5FBD, 0x13CF, + 0x5FBE, 0x5FBE, 0x2D5E, 0x5FBF, 0x5FBF, 0x308E, 0x5FC0, 0x5FC1, 0x31D1, + 0x5FC3, 0x5FC3, 0x02D0, 0x5FC4, 0x5FC4, 0x44EA, 0x5FC5, 0x5FC5, 0x0340, + 0x5FC9, 0x5FC9, 0x17A7, 0x5FCC, 0x5FCC, 0x049A, 0x5FCD, 0x5FCD, 0x049C, + 0x5FCF, 0x5FCF, 0x17EB, 0x5FD0, 0x5FD0, 0x187F, 0x5FD1, 0x5FD1, 0x187E, + 0x5FD2, 0x5FD2, 0x187D, 0x5FD4, 0x5FD4, 0x17EA, 0x5FD5, 0x5FD5, 0x17E9, + 0x5FD6, 0x5FD6, 0x03CF, 0x5FD7, 0x5FD7, 0x049B, 0x5FD8, 0x5FD8, 0x0499, + 0x5FD9, 0x5FD9, 0x03CE, 0x5FDB, 0x5FDB, 0x3A4A, 0x5FDD, 0x5FDD, 0x05BF, + 0x5FDE, 0x5FDE, 0x197A, 0x5FDF, 0x5FDF, 0x41AF, 0x5FE0, 0x5FE0, 0x05C0, + 0x5FE1, 0x5FE1, 0x1884, 0x5FE3, 0x5FE3, 0x1886, 0x5FE4, 0x5FE4, 0x1885, + 0x5FE5, 0x5FE5, 0x197B, 0x5FE8, 0x5FE8, 0x1881, 0x5FEA, 0x5FEA, 0x04A0, + 0x5FEB, 0x5FEB, 0x049E, 0x5FED, 0x5FED, 0x1880, 0x5FEE, 0x5FEE, 0x1882, + 0x5FEF, 0x5FEF, 0x1888, 0x5FF1, 0x5FF1, 0x049D, 0x5FF3, 0x5FF3, 0x1883, + 0x5FF4, 0x5FF4, 0x188C, 0x5FF5, 0x5FF5, 0x05C2, 0x5FF7, 0x5FF7, 0x1889, + 0x5FF8, 0x5FF8, 0x049F, 0x5FFA, 0x5FFA, 0x1887, 0x5FFB, 0x5FFB, 0x188A, + 0x5FFD, 0x5FFD, 0x05C1, 0x5FFF, 0x5FFF, 0x05C3, 0x6000, 0x6000, 0x188B, + 0x6009, 0x6009, 0x198F, 0x600A, 0x600A, 0x1982, 0x600B, 0x600B, 0x1980, + 0x600C, 0x600C, 0x198E, 0x600D, 0x600D, 0x1989, 0x600E, 0x600E, 0x0723, + 0x600F, 0x600F, 0x05C4, 0x6010, 0x6010, 0x198A, 0x6011, 0x6011, 0x198D, + 0x6012, 0x6012, 0x071F, 0x6013, 0x6013, 0x198C, 0x6014, 0x6014, 0x05C5, + 0x6015, 0x6015, 0x05CA, 0x6016, 0x6016, 0x05C8, 0x6017, 0x6017, 0x1983, + 0x6019, 0x6019, 0x197E, 0x601A, 0x601A, 0x1985, 0x601B, 0x601B, 0x05CF, + 0x601C, 0x601C, 0x1990, 0x601D, 0x601D, 0x0720, 0x601E, 0x601E, 0x1986, + 0x6020, 0x6020, 0x0721, 0x6021, 0x6021, 0x05CB, 0x6022, 0x6022, 0x1988, + 0x6023, 0x6023, 0x4185, 0x6024, 0x6024, 0x1AE7, 0x6025, 0x6025, 0x0722, + 0x6026, 0x6026, 0x197D, 0x6027, 0x6027, 0x05CC, 0x6028, 0x6028, 0x0724, + 0x6029, 0x6029, 0x05CD, 0x602A, 0x602A, 0x05C9, 0x602B, 0x602B, 0x05CE, + 0x602C, 0x602C, 0x1987, 0x602D, 0x602D, 0x197C, 0x602E, 0x602E, 0x198B, + 0x602F, 0x602F, 0x05C6, 0x6031, 0x6031, 0x4161, 0x6032, 0x6032, 0x197F, + 0x6033, 0x6033, 0x1984, 0x6034, 0x6034, 0x1981, 0x6035, 0x6035, 0x05C7, + 0x6037, 0x6037, 0x1AD9, 0x6039, 0x6039, 0x1ADA, 0x603B, 0x603B, 0x4553, + 0x6040, 0x6040, 0x1AE4, 0x6041, 0x6041, 0x1C92, 0x6042, 0x6042, 0x1AE5, + 0x6043, 0x6043, 0x072A, 0x6044, 0x6044, 0x1AE8, 0x6045, 0x6045, 0x1ADE, + 0x6046, 0x6046, 0x0729, 0x6047, 0x6047, 0x1AE0, 0x6049, 0x6049, 0x1AE1, + 0x604A, 0x604A, 0x4074, 0x604C, 0x604C, 0x1AE3, 0x604D, 0x604D, 0x0725, + 0x6050, 0x6050, 0x08B5, 0x6052, 0x6052, 0x36EC, 0x6053, 0x6053, 0x1ADF, + 0x6054, 0x6054, 0x1ADB, 0x6055, 0x6055, 0x08B6, 0x6058, 0x6058, 0x1AE9, + 0x6059, 0x6059, 0x08B2, 0x605A, 0x605A, 0x1C90, 0x605B, 0x605B, 0x1AE2, + 0x605D, 0x605D, 0x1C8F, 0x605E, 0x605E, 0x1ADD, 0x605F, 0x605F, 0x1AE6, + 0x6062, 0x6062, 0x0728, 0x6063, 0x6063, 0x08B3, 0x6064, 0x6064, 0x072E, + 0x6065, 0x6065, 0x08B4, 0x6066, 0x6066, 0x1AEA, 0x6067, 0x6067, 0x1C91, + 0x6068, 0x6068, 0x0727, 0x6069, 0x6069, 0x08B8, 0x606A, 0x606A, 0x072D, + 0x606B, 0x606B, 0x072C, 0x606C, 0x606C, 0x072B, 0x606D, 0x606D, 0x08B7, + 0x606E, 0x606E, 0x1AEB, 0x606F, 0x606F, 0x08B9, 0x6070, 0x6070, 0x0726, + 0x6072, 0x6072, 0x1ADC, 0x6075, 0x6075, 0x3A56, 0x6077, 0x6077, 0x4005, + 0x607E, 0x607E, 0x3A47, 0x607F, 0x607F, 0x0A82, 0x6080, 0x6080, 0x1C95, + 0x6081, 0x6081, 0x1C97, 0x6083, 0x6083, 0x1C99, 0x6084, 0x6084, 0x08BA, + 0x6085, 0x6085, 0x08C0, 0x6086, 0x6086, 0x1EDA, 0x6087, 0x6087, 0x1C9D, + 0x6088, 0x6088, 0x1C94, 0x6089, 0x6089, 0x0A84, 0x608A, 0x608A, 0x1ED8, + 0x608C, 0x608C, 0x08BF, 0x608D, 0x608D, 0x08BD, 0x608E, 0x608E, 0x1C9F, + 0x6090, 0x6090, 0x1ED9, 0x6092, 0x6092, 0x1C96, 0x6094, 0x6094, 0x08BE, + 0x6095, 0x6095, 0x1C9A, 0x6096, 0x6096, 0x08C1, 0x6097, 0x6097, 0x1C9C, + 0x609A, 0x609A, 0x08BC, 0x609B, 0x609B, 0x1C9B, 0x609C, 0x609C, 0x1C9E, + 0x609D, 0x609D, 0x1C98, 0x609E, 0x609E, 0x416A, 0x609F, 0x609F, 0x08BB, + 0x60A0, 0x60A0, 0x0A85, 0x60A2, 0x60A2, 0x1C93, 0x60A3, 0x60A3, 0x0A83, + 0x60A4, 0x60A4, 0x4001, 0x60A7, 0x60A7, 0x3ADC, 0x60A8, 0x60A8, 0x0A86, + 0x60B0, 0x60B0, 0x1EDC, 0x60B1, 0x60B1, 0x1EE5, 0x60B2, 0x60B2, 0x0C47, + 0x60B3, 0x60B3, 0x416C, 0x60B4, 0x60B4, 0x0A88, 0x60B5, 0x60B5, 0x0A8D, + 0x60B6, 0x60B6, 0x0C48, 0x60B7, 0x60B7, 0x1EE7, 0x60B8, 0x60B8, 0x0A94, + 0x60B9, 0x60B9, 0x2134, 0x60BA, 0x60BA, 0x1EDD, 0x60BB, 0x60BB, 0x0A8C, + 0x60BC, 0x60BC, 0x0A8F, 0x60BD, 0x60BD, 0x0A8A, 0x60BE, 0x60BE, 0x1EDB, + 0x60BF, 0x60BF, 0x1EE9, 0x60C0, 0x60C0, 0x1EEC, 0x60C1, 0x60C1, 0x2143, + 0x60C3, 0x60C3, 0x1EEA, 0x60C4, 0x60C4, 0x2138, 0x60C5, 0x60C5, 0x0A8B, + 0x60C6, 0x60C6, 0x0A92, 0x60C7, 0x60C7, 0x0A96, 0x60C8, 0x60C8, 0x1EE4, + 0x60C9, 0x60C9, 0x2133, 0x60CA, 0x60CA, 0x1EE8, 0x60CB, 0x60CB, 0x0A87, + 0x60CC, 0x60CC, 0x2135, 0x60CD, 0x60CD, 0x1EEB, 0x60CE, 0x60CE, 0x2137, + 0x60CF, 0x60CF, 0x1EE0, 0x60D1, 0x60D1, 0x0C45, 0x60D3, 0x60D4, 0x1EDE, + 0x60D5, 0x60D5, 0x0A91, 0x60D7, 0x60D7, 0x4635, 0x60D8, 0x60D8, 0x0A90, + 0x60D9, 0x60D9, 0x1EE2, 0x60DA, 0x60DA, 0x0A95, 0x60DB, 0x60DB, 0x1EE6, + 0x60DC, 0x60DC, 0x0A8E, 0x60DD, 0x60DD, 0x1EE3, 0x60DE, 0x60DE, 0x3DCC, + 0x60DF, 0x60DF, 0x0A93, 0x60E0, 0x60E0, 0x0C49, 0x60E1, 0x60E1, 0x0C46, + 0x60E2, 0x60E2, 0x2136, 0x60E3, 0x60E3, 0x3D75, 0x60E4, 0x60E4, 0x1EE1, + 0x60E6, 0x60E6, 0x0A89, 0x60E7, 0x60E7, 0x3D84, 0x60E8, 0x60E8, 0x3D7B, + 0x60E9, 0x60E9, 0x4009, 0x60F0, 0x60F0, 0x0C4E, 0x60F1, 0x60F1, 0x0C52, + 0x60F2, 0x60F2, 0x213A, 0x60F3, 0x60F3, 0x0E0B, 0x60F4, 0x60F4, 0x0C50, + 0x60F5, 0x60F5, 0x213E, 0x60F6, 0x60F6, 0x0C54, 0x60F7, 0x60F7, 0x23D4, + 0x60F8, 0x60F8, 0x2140, 0x60F9, 0x60F9, 0x0E0D, 0x60FA, 0x60FA, 0x0C4C, + 0x60FB, 0x60FB, 0x0C4F, 0x60FC, 0x60FC, 0x2141, 0x60FD, 0x60FD, 0x3FA8, + 0x60FE, 0x60FE, 0x2142, 0x60FF, 0x60FF, 0x2148, 0x6100, 0x6100, 0x0C56, + 0x6101, 0x6101, 0x0E0E, 0x6103, 0x6103, 0x2144, 0x6104, 0x6104, 0x2149, + 0x6105, 0x6105, 0x213D, 0x6106, 0x6106, 0x0E18, 0x6107, 0x6107, 0x3C35, + 0x6108, 0x6108, 0x0E0F, 0x6109, 0x6109, 0x0C55, 0x610A, 0x610A, 0x213B, + 0x610B, 0x610B, 0x214A, 0x610C, 0x610C, 0x3C87, 0x610D, 0x610D, 0x0E17, + 0x610E, 0x610E, 0x0C53, 0x610F, 0x610F, 0x0E08, 0x6110, 0x6110, 0x2147, + 0x6112, 0x6112, 0x0C57, 0x6113, 0x6113, 0x213F, 0x6114, 0x6114, 0x2139, + 0x6115, 0x6115, 0x0C4D, 0x6116, 0x6116, 0x213C, 0x6118, 0x6118, 0x2145, + 0x6119, 0x6119, 0x3EF6, 0x611A, 0x611A, 0x0E07, 0x611B, 0x611B, 0x0E0C, + 0x611C, 0x611C, 0x0C4A, 0x611D, 0x611D, 0x2146, 0x611F, 0x611F, 0x0E0A, + 0x6123, 0x6123, 0x0C4B, 0x6127, 0x6127, 0x0E16, 0x6128, 0x6128, 0x2683, + 0x6129, 0x6129, 0x23DF, 0x612B, 0x612B, 0x23D7, 0x612C, 0x612C, 0x2682, + 0x612E, 0x612E, 0x23DB, 0x612F, 0x612F, 0x23DD, 0x6130, 0x6130, 0x3F37, + 0x6132, 0x6132, 0x23DA, 0x6134, 0x6134, 0x0E15, 0x6136, 0x6136, 0x23D9, + 0x6137, 0x6137, 0x0E19, 0x613B, 0x613B, 0x2692, 0x613D, 0x613D, 0x4636, + 0x613E, 0x613E, 0x0E14, 0x613F, 0x613F, 0x0FD1, 0x6140, 0x6140, 0x23E0, + 0x6141, 0x6141, 0x2684, 0x6142, 0x6142, 0x4174, 0x6144, 0x6144, 0x0E12, + 0x6145, 0x6145, 0x23D8, 0x6146, 0x6146, 0x23DC, 0x6147, 0x6147, 0x0FD0, + 0x6148, 0x6148, 0x0E09, 0x6149, 0x614A, 0x23D5, 0x614B, 0x614B, 0x0FD2, + 0x614C, 0x614C, 0x0E11, 0x614D, 0x614D, 0x0E13, 0x614E, 0x614E, 0x0E10, + 0x614F, 0x614F, 0x23DE, 0x6150, 0x6150, 0x3C32, 0x6152, 0x6153, 0x2688, + 0x6154, 0x6154, 0x268E, 0x6155, 0x6155, 0x1149, 0x6156, 0x6156, 0x2695, + 0x6158, 0x6158, 0x0FD8, 0x6159, 0x6159, 0x3FBA, 0x615A, 0x615A, 0x0FD7, + 0x615B, 0x615B, 0x2690, 0x615C, 0x615C, 0x4186, 0x615D, 0x615D, 0x1148, + 0x615E, 0x615E, 0x2685, 0x615F, 0x615F, 0x0FD6, 0x6160, 0x6160, 0x494C, + 0x6161, 0x6161, 0x2694, 0x6162, 0x6163, 0x0FD4, 0x6164, 0x6164, 0x4173, + 0x6165, 0x6165, 0x2691, 0x6166, 0x6166, 0x28DE, 0x6167, 0x6167, 0x1146, + 0x6168, 0x6168, 0x0C51, 0x616A, 0x616A, 0x2693, 0x616B, 0x616B, 0x114D, + 0x616C, 0x616C, 0x268B, 0x616E, 0x616E, 0x1147, 0x616F, 0x616F, 0x3FC0, + 0x6170, 0x6170, 0x114C, 0x6171, 0x6171, 0x2686, 0x6172, 0x6172, 0x268A, + 0x6173, 0x6173, 0x2687, 0x6174, 0x6174, 0x268D, 0x6175, 0x6175, 0x0FD9, + 0x6176, 0x6176, 0x1145, 0x6177, 0x6177, 0x0FD3, 0x6179, 0x6179, 0x28D0, + 0x617A, 0x617A, 0x268F, 0x617C, 0x617C, 0x114B, 0x617D, 0x617D, 0x3FBD, + 0x617E, 0x617E, 0x114E, 0x6180, 0x6180, 0x268C, 0x6181, 0x6181, 0x4177, + 0x6182, 0x6182, 0x114A, 0x6183, 0x6183, 0x28CF, 0x6187, 0x6187, 0x417A, + 0x6189, 0x6189, 0x28D4, 0x618A, 0x618A, 0x12B1, 0x618B, 0x618B, 0x28CE, + 0x618C, 0x618C, 0x2B4D, 0x618D, 0x618D, 0x28DD, 0x618E, 0x618E, 0x1152, + 0x6190, 0x6190, 0x1150, 0x6191, 0x6191, 0x12AF, 0x6192, 0x6192, 0x28DA, + 0x6193, 0x6193, 0x28D6, 0x6194, 0x6194, 0x1156, 0x6195, 0x6195, 0x3DE0, + 0x6196, 0x6196, 0x2B44, 0x6198, 0x6198, 0x3A55, 0x6199, 0x6199, 0x3A54, + 0x619A, 0x619A, 0x1154, 0x619B, 0x619B, 0x28D5, 0x619C, 0x619C, 0x4002, + 0x619D, 0x619D, 0x2B42, 0x619F, 0x619F, 0x28D9, 0x61A1, 0x61A1, 0x28DC, + 0x61A2, 0x61A2, 0x28D3, 0x61A4, 0x61A4, 0x1155, 0x61A7, 0x61A7, 0x114F, + 0x61A8, 0x61A8, 0x2B43, 0x61A9, 0x61A9, 0x12B0, 0x61AA, 0x61AA, 0x28DB, + 0x61AB, 0x61AB, 0x1151, 0x61AC, 0x61AC, 0x1153, 0x61AD, 0x61AD, 0x28D8, + 0x61AE, 0x61AE, 0x1157, 0x61AF, 0x61AF, 0x28D7, 0x61B0, 0x61B0, 0x28D2, + 0x61B1, 0x61B1, 0x28D1, 0x61B2, 0x61B2, 0x12AE, 0x61B3, 0x61B3, 0x28DF, + 0x61B4, 0x61B4, 0x2B46, 0x61B5, 0x61B5, 0x2D60, 0x61B6, 0x61B6, 0x12B3, + 0x61B7, 0x61B7, 0x4639, 0x61B8, 0x61B8, 0x2B4C, 0x61B9, 0x61B9, 0x43BF, + 0x61BA, 0x61BA, 0x2B4A, 0x61BC, 0x61BC, 0x2D61, 0x61BE, 0x61BE, 0x12B4, + 0x61BF, 0x61BF, 0x2B4B, 0x61C0, 0x61C0, 0x3A50, 0x61C1, 0x61C1, 0x2B48, + 0x61C2, 0x61C2, 0x13D1, 0x61C3, 0x61C3, 0x2D5F, 0x61C5, 0x61C5, 0x2B45, + 0x61C6, 0x61C6, 0x2B47, 0x61C7, 0x61C7, 0x13D2, 0x61C8, 0x61C8, 0x12B6, + 0x61C9, 0x61C9, 0x13D0, 0x61CA, 0x61CA, 0x12B5, 0x61CB, 0x61CB, 0x13D4, + 0x61CC, 0x61CC, 0x2B49, 0x61CD, 0x61CD, 0x12B2, 0x61CF, 0x61CF, 0x463A, + 0x61D0, 0x61D0, 0x4181, 0x61D3, 0x61D3, 0x417E, 0x61D6, 0x61D6, 0x2F26, + 0x61D8, 0x61D8, 0x2F1E, 0x61DA, 0x61DA, 0x38B1, 0x61DE, 0x61DE, 0x2D67, + 0x61DF, 0x61DF, 0x2F1F, 0x61E0, 0x61E0, 0x2D63, 0x61E2, 0x61E2, 0x3FC5, + 0x61E3, 0x61E3, 0x14D0, 0x61E4, 0x61E4, 0x2D65, 0x61E5, 0x61E5, 0x2D64, + 0x61E6, 0x61E6, 0x13D3, 0x61E7, 0x61E7, 0x2D62, 0x61E8, 0x61E8, 0x2D66, + 0x61E9, 0x61E9, 0x2F27, 0x61EA, 0x61EA, 0x2F23, 0x61EB, 0x61EB, 0x2F25, + 0x61ED, 0x61EE, 0x2F20, 0x61F0, 0x61F0, 0x2F24, 0x61F1, 0x61F1, 0x2F22, + 0x61F2, 0x61F2, 0x157E, 0x61F5, 0x61F5, 0x1581, 0x61F6, 0x61F6, 0x1580, + 0x61F7, 0x61F7, 0x157F, 0x61F8, 0x61F8, 0x1614, 0x61F9, 0x61F9, 0x31D3, + 0x61FA, 0x61FA, 0x1615, 0x61FB, 0x61FB, 0x308F, 0x61FC, 0x61FC, 0x1670, + 0x61FD, 0x61FD, 0x32D1, 0x61FE, 0x61FE, 0x1671, 0x61FF, 0x61FF, 0x16C4, + 0x6200, 0x6200, 0x16F8, 0x6201, 0x6201, 0x3417, 0x6203, 0x6204, 0x3418, + 0x6207, 0x6207, 0x3533, 0x6208, 0x6208, 0x02D1, 0x6209, 0x6209, 0x17A8, + 0x620A, 0x620A, 0x0341, 0x620C, 0x620D, 0x03D1, 0x620E, 0x620E, 0x03D0, + 0x6210, 0x6210, 0x03D3, 0x6211, 0x6211, 0x04A2, 0x6212, 0x6212, 0x04A1, + 0x6214, 0x6214, 0x1991, 0x6215, 0x6215, 0x05D1, 0x6216, 0x6216, 0x05D0, + 0x6219, 0x6219, 0x1CA0, 0x621A, 0x621B, 0x0A97, 0x621F, 0x621F, 0x0C58, + 0x6220, 0x6220, 0x23E1, 0x6221, 0x6222, 0x0E1A, 0x6223, 0x6223, 0x23E3, + 0x6224, 0x6224, 0x23E5, 0x6225, 0x6225, 0x23E4, 0x6227, 0x6227, 0x2697, + 0x6229, 0x6229, 0x2696, 0x622A, 0x622A, 0x0FDA, 0x622B, 0x622B, 0x2698, + 0x622C, 0x622C, 0x463C, 0x622D, 0x622D, 0x28E0, 0x622E, 0x622E, 0x1158, + 0x6230, 0x6230, 0x12B7, 0x6232, 0x6232, 0x13D5, 0x6233, 0x6233, 0x14D1, + 0x6234, 0x6234, 0x13D6, 0x6236, 0x6236, 0x02D2, 0x6237, 0x6237, 0x451A, + 0x6239, 0x6239, 0x3FC2, 0x623A, 0x623A, 0x188D, 0x623D, 0x623D, 0x1992, + 0x623E, 0x623E, 0x05D3, 0x623F, 0x623F, 0x05D2, 0x6240, 0x6240, 0x05D4, + 0x6241, 0x6241, 0x072F, 0x6242, 0x6243, 0x1AEC, 0x6246, 0x6246, 0x1CA1, + 0x6247, 0x6247, 0x08C2, 0x6248, 0x6248, 0x0A99, 0x6249, 0x6249, 0x0C59, + 0x624A, 0x624A, 0x214B, 0x624B, 0x624B, 0x02D3, 0x624C, 0x624C, 0x44EC, + 0x624D, 0x624D, 0x0291, 0x624E, 0x624E, 0x02D4, 0x6250, 0x6250, 0x17A9, + 0x6251, 0x6251, 0x0345, 0x6252, 0x6252, 0x0344, 0x6253, 0x6254, 0x0342, + 0x6258, 0x6258, 0x03D6, 0x6259, 0x6259, 0x17F2, 0x625A, 0x625A, 0x17F4, + 0x625B, 0x625B, 0x03D5, 0x625C, 0x625C, 0x17EC, 0x625E, 0x625E, 0x17ED, + 0x6260, 0x6260, 0x17F3, 0x6261, 0x6261, 0x17EF, 0x6262, 0x6262, 0x17F1, + 0x6263, 0x6263, 0x03D4, 0x6264, 0x6264, 0x17EE, 0x6265, 0x6265, 0x17F5, + 0x6266, 0x6266, 0x17F0, 0x6268, 0x6268, 0x3F15, 0x626D, 0x626D, 0x04A9, + 0x626E, 0x626E, 0x04B2, 0x626F, 0x626F, 0x04B0, 0x6270, 0x6270, 0x1897, + 0x6271, 0x6271, 0x1894, 0x6272, 0x6272, 0x189C, 0x6273, 0x6273, 0x04AE, + 0x6274, 0x6274, 0x189D, 0x6276, 0x6276, 0x04A7, 0x6277, 0x6277, 0x189A, + 0x6279, 0x6279, 0x04AD, 0x627A, 0x627A, 0x1896, 0x627B, 0x627B, 0x1895, + 0x627C, 0x627C, 0x04AB, 0x627D, 0x627D, 0x189B, 0x627E, 0x627E, 0x04AC, + 0x627F, 0x627F, 0x05D5, 0x6280, 0x6280, 0x04A6, 0x6281, 0x6281, 0x1898, + 0x6282, 0x6282, 0x3F86, 0x6283, 0x6283, 0x188E, 0x6284, 0x6284, 0x04A3, + 0x6285, 0x6285, 0x3F50, 0x6286, 0x6286, 0x04B6, 0x6287, 0x6287, 0x1893, + 0x6288, 0x6288, 0x1899, 0x6289, 0x6289, 0x04A8, 0x628A, 0x628A, 0x04AA, + 0x628C, 0x628C, 0x188F, 0x628E, 0x628F, 0x1890, 0x6290, 0x6290, 0x43C0, + 0x6291, 0x6291, 0x04B5, 0x6292, 0x6292, 0x04AF, 0x6293, 0x6293, 0x04B4, + 0x6294, 0x6294, 0x1892, 0x6295, 0x6295, 0x04B3, 0x6296, 0x6296, 0x04A5, + 0x6297, 0x6297, 0x04A4, 0x6298, 0x6298, 0x04B1, 0x629D, 0x629D, 0x3E96, + 0x62A4, 0x62A4, 0x3A69, 0x62A6, 0x62A6, 0x3FC1, 0x62A8, 0x62A8, 0x05E3, + 0x62A9, 0x62A9, 0x199E, 0x62AA, 0x62AA, 0x1997, 0x62AB, 0x62AB, 0x05DE, + 0x62AC, 0x62AC, 0x05F1, 0x62AD, 0x62AD, 0x1993, 0x62AE, 0x62AE, 0x199A, + 0x62AF, 0x62AF, 0x199C, 0x62B0, 0x62B0, 0x199F, 0x62B1, 0x62B1, 0x05EC, + 0x62B3, 0x62B3, 0x199B, 0x62B4, 0x62B4, 0x1994, 0x62B5, 0x62B5, 0x05EA, + 0x62B6, 0x62B6, 0x1998, 0x62B8, 0x62B8, 0x19A0, 0x62B9, 0x62B9, 0x05DB, + 0x62BB, 0x62BB, 0x199D, 0x62BC, 0x62BC, 0x05E5, 0x62BD, 0x62BD, 0x05E4, + 0x62BE, 0x62BE, 0x1996, 0x62BF, 0x62BF, 0x05D9, 0x62C2, 0x62C2, 0x05DA, + 0x62C3, 0x62C3, 0x3D8F, 0x62C4, 0x62C4, 0x05D8, 0x62C5, 0x62C5, 0x418A, + 0x62C6, 0x62C6, 0x05F0, 0x62C7, 0x62C7, 0x05E8, 0x62C8, 0x62C8, 0x05E2, + 0x62C9, 0x62C9, 0x05D6, 0x62CA, 0x62CA, 0x1999, 0x62CB, 0x62CB, 0x05E1, + 0x62CC, 0x62CC, 0x05D7, 0x62CD, 0x62CD, 0x05E9, 0x62CE, 0x62CE, 0x05F2, + 0x62CF, 0x62CF, 0x1AEE, 0x62D0, 0x62D0, 0x05E6, 0x62D1, 0x62D1, 0x1995, + 0x62D2, 0x62D2, 0x05DC, 0x62D3, 0x62D4, 0x05DF, 0x62D5, 0x62D5, 0x418C, + 0x62D6, 0x62D7, 0x05EE, 0x62D8, 0x62D8, 0x05ED, 0x62D9, 0x62D9, 0x05E7, + 0x62DA, 0x62DA, 0x05EB, 0x62DB, 0x62DB, 0x05DD, 0x62DC, 0x62DC, 0x0730, + 0x62DF, 0x62DF, 0x401C, 0x62E5, 0x62E5, 0x463D, 0x62EB, 0x62EB, 0x1AF4, + 0x62EC, 0x62EC, 0x073C, 0x62ED, 0x62ED, 0x0734, 0x62EE, 0x62EE, 0x0736, + 0x62EF, 0x62EF, 0x073B, 0x62F0, 0x62F0, 0x1B00, 0x62F1, 0x62F1, 0x0739, + 0x62F2, 0x62F2, 0x1CA2, 0x62F3, 0x62F3, 0x08C3, 0x62F4, 0x62F4, 0x073E, + 0x62F5, 0x62F5, 0x1AF1, 0x62F6, 0x62F6, 0x1AF9, 0x62F7, 0x62F7, 0x073A, + 0x62F8, 0x62F8, 0x1AF8, 0x62F9, 0x62F9, 0x1AF5, 0x62FA, 0x62FA, 0x1AFD, + 0x62FB, 0x62FB, 0x1AFF, 0x62FC, 0x62FC, 0x0733, 0x62FD, 0x62FD, 0x0737, + 0x62FE, 0x62FE, 0x073D, 0x62FF, 0x62FF, 0x08C5, 0x6300, 0x6300, 0x1AFA, + 0x6301, 0x6301, 0x0735, 0x6302, 0x6302, 0x0740, 0x6303, 0x6303, 0x1AF3, + 0x6307, 0x6307, 0x0738, 0x6308, 0x6308, 0x08C4, 0x6309, 0x6309, 0x0732, + 0x630B, 0x630B, 0x1AF0, 0x630C, 0x630C, 0x1AF7, 0x630D, 0x630D, 0x1AEF, + 0x630E, 0x630E, 0x1AF2, 0x630F, 0x630F, 0x1AF6, 0x6310, 0x6310, 0x1CA3, + 0x6311, 0x6311, 0x073F, 0x6313, 0x6314, 0x1AFB, 0x6315, 0x6315, 0x1AFE, + 0x6316, 0x6316, 0x0731, 0x6318, 0x6318, 0x43C1, 0x6328, 0x6328, 0x08D3, + 0x6329, 0x6329, 0x1CAF, 0x632A, 0x632B, 0x08D1, 0x632C, 0x632C, 0x1CA5, + 0x632D, 0x632D, 0x1CB5, 0x632E, 0x632E, 0x3EDD, 0x632F, 0x632F, 0x08C8, + 0x6331, 0x6331, 0x3A65, 0x6332, 0x6332, 0x1EED, 0x6333, 0x6333, 0x1CB7, + 0x6334, 0x6334, 0x1CB1, 0x6335, 0x6335, 0x3F16, 0x6336, 0x6336, 0x1CA8, + 0x6337, 0x6337, 0x3A63, 0x6338, 0x6338, 0x1CBA, 0x6339, 0x6339, 0x1CAB, + 0x633A, 0x633A, 0x08CE, 0x633B, 0x633B, 0x1F04, 0x633C, 0x633C, 0x1CAE, + 0x633D, 0x633D, 0x08D0, 0x633E, 0x633E, 0x08C7, 0x6340, 0x6340, 0x1CBC, + 0x6341, 0x6341, 0x1CB0, 0x6342, 0x6342, 0x08CA, 0x6343, 0x6343, 0x1CA9, + 0x6344, 0x6345, 0x1CA6, 0x6346, 0x6346, 0x08CB, 0x6347, 0x6347, 0x1CB6, + 0x6348, 0x6348, 0x1CBD, 0x6349, 0x6349, 0x08CD, 0x634A, 0x634A, 0x1CAD, + 0x634B, 0x634B, 0x1CAC, 0x634C, 0x634C, 0x08D5, 0x634D, 0x634D, 0x08D4, + 0x634E, 0x634E, 0x08C6, 0x634F, 0x634F, 0x08CC, 0x6350, 0x6350, 0x08CF, + 0x6351, 0x6351, 0x1CB9, 0x6354, 0x6354, 0x1CB3, 0x6355, 0x6355, 0x08C9, + 0x6356, 0x6356, 0x1CA4, 0x6357, 0x6357, 0x1CBB, 0x6358, 0x6358, 0x1CB2, + 0x6359, 0x6359, 0x1CB4, 0x635A, 0x635A, 0x1CB8, 0x6364, 0x6364, 0x3FC7, + 0x6365, 0x6365, 0x1EEE, 0x6367, 0x6367, 0x0AA1, 0x6368, 0x6368, 0x0AB5, + 0x6369, 0x6369, 0x0AB4, 0x636B, 0x636B, 0x0AA9, 0x636C, 0x636C, 0x418E, + 0x636D, 0x636D, 0x1F00, 0x636E, 0x636E, 0x1EFC, 0x636F, 0x636F, 0x1EF9, + 0x6370, 0x6370, 0x1F0B, 0x6371, 0x6371, 0x0AA4, 0x6372, 0x6372, 0x0A9C, + 0x6375, 0x6375, 0x1EFE, 0x6376, 0x6376, 0x0C69, 0x6377, 0x6377, 0x0AA0, + 0x6378, 0x6378, 0x1F06, 0x6379, 0x6379, 0x4367, 0x637A, 0x637A, 0x0AB6, + 0x637B, 0x637B, 0x0AB3, 0x637C, 0x637C, 0x1F02, 0x637D, 0x637D, 0x1EF1, + 0x637F, 0x637F, 0x3F4B, 0x6380, 0x6380, 0x0AB2, 0x6381, 0x6381, 0x1F08, + 0x6382, 0x6382, 0x1EF0, 0x6383, 0x6383, 0x0AA7, 0x6384, 0x6384, 0x0AAB, + 0x6385, 0x6385, 0x1F07, 0x6387, 0x6387, 0x1EFA, 0x6388, 0x6388, 0x0AAC, + 0x6389, 0x6389, 0x0AA6, 0x638A, 0x638A, 0x1EEF, 0x638B, 0x638B, 0x4188, + 0x638C, 0x638C, 0x0C5B, 0x638D, 0x638D, 0x1F0A, 0x638E, 0x638E, 0x1EF8, + 0x638F, 0x638F, 0x0AB1, 0x6390, 0x6390, 0x1EFB, 0x6391, 0x6391, 0x1F09, + 0x6392, 0x6392, 0x0AB0, 0x6394, 0x6394, 0x214C, 0x6396, 0x6396, 0x0A9D, + 0x6397, 0x6397, 0x1EF6, 0x6398, 0x6398, 0x0AA2, 0x6399, 0x6399, 0x0AAD, + 0x639B, 0x639B, 0x0AA8, 0x639C, 0x639C, 0x1EFF, 0x639D, 0x639D, 0x1EF5, + 0x639E, 0x639E, 0x1EF3, 0x639F, 0x639F, 0x1F05, 0x63A0, 0x63A0, 0x0A9A, + 0x63A1, 0x63A1, 0x0AAE, 0x63A2, 0x63A2, 0x0A9E, 0x63A3, 0x63A3, 0x0C5A, + 0x63A4, 0x63A4, 0x1F03, 0x63A5, 0x63A5, 0x0A9F, 0x63A7, 0x63A7, 0x0A9B, + 0x63A8, 0x63A8, 0x0AAA, 0x63A9, 0x63A9, 0x0AA5, 0x63AA, 0x63AA, 0x0AA3, + 0x63AB, 0x63AB, 0x1EF7, 0x63AC, 0x63AC, 0x0AAF, 0x63AD, 0x63AD, 0x1EF4, + 0x63AE, 0x63AE, 0x1F01, 0x63AF, 0x63AF, 0x1EFD, 0x63B0, 0x63B0, 0x214E, + 0x63B1, 0x63B1, 0x214D, 0x63B9, 0x63B9, 0x3E9D, 0x63BD, 0x63BD, 0x1EF2, + 0x63BE, 0x63BE, 0x215E, 0x63C0, 0x63C0, 0x0C5D, 0x63C1, 0x63C1, 0x46A8, + 0x63C2, 0x63C2, 0x2164, 0x63C3, 0x63C3, 0x2153, 0x63C4, 0x63C4, 0x2161, + 0x63C5, 0x63C5, 0x23E6, 0x63C6, 0x63C6, 0x0C60, 0x63C7, 0x63C7, 0x2165, + 0x63C8, 0x63C8, 0x2168, 0x63C9, 0x63C9, 0x0C5F, 0x63CA, 0x63CA, 0x2156, + 0x63CB, 0x63CB, 0x2167, 0x63CC, 0x63CC, 0x2166, 0x63CD, 0x63CD, 0x0C61, + 0x63CE, 0x63CE, 0x214F, 0x63CF, 0x63CF, 0x0C5C, 0x63D0, 0x63D0, 0x0C64, + 0x63D1, 0x63D1, 0x3A66, 0x63D2, 0x63D2, 0x0C62, 0x63D3, 0x63D3, 0x2163, + 0x63D5, 0x63D5, 0x2159, 0x63D6, 0x63D6, 0x0C66, 0x63D7, 0x63D7, 0x216A, + 0x63D8, 0x63D8, 0x2162, 0x63D9, 0x63D9, 0x216B, 0x63DA, 0x63DA, 0x0C6E, + 0x63DB, 0x63DB, 0x0C6C, 0x63DC, 0x63DC, 0x2160, 0x63DD, 0x63DD, 0x215F, + 0x63DE, 0x63DE, 0x3E60, 0x63DF, 0x63DF, 0x215D, 0x63E0, 0x63E0, 0x2157, + 0x63E1, 0x63E1, 0x0C65, 0x63E2, 0x63E2, 0x4641, 0x63E3, 0x63E3, 0x0C63, + 0x63E4, 0x63E4, 0x1CAA, 0x63E5, 0x63E5, 0x2150, 0x63E6, 0x63E6, 0x489F, + 0x63E7, 0x63E7, 0x2404, 0x63E8, 0x63E8, 0x2151, 0x63E9, 0x63E9, 0x0C5E, + 0x63EA, 0x63EA, 0x0C6B, 0x63EB, 0x63EB, 0x23E8, 0x63ED, 0x63EE, 0x0C67, + 0x63EF, 0x63EF, 0x2152, 0x63F0, 0x63F0, 0x2169, 0x63F1, 0x63F1, 0x23E7, + 0x63F2, 0x63F2, 0x215A, 0x63F3, 0x63F3, 0x2155, 0x63F4, 0x63F4, 0x0C6A, + 0x63F5, 0x63F5, 0x215B, 0x63F6, 0x63F6, 0x2158, 0x63F8, 0x63F8, 0x4192, + 0x63F9, 0x63F9, 0x0C6F, 0x63FB, 0x63FB, 0x4642, 0x63FC, 0x63FC, 0x3E9C, + 0x63FE, 0x63FE, 0x3E9E, 0x6406, 0x6406, 0x0E2A, 0x6407, 0x6407, 0x4643, + 0x6409, 0x6409, 0x23EB, 0x640A, 0x640A, 0x23FE, 0x640B, 0x640B, 0x2403, + 0x640C, 0x640C, 0x23F7, 0x640D, 0x640D, 0x0E26, 0x640E, 0x640E, 0x2408, + 0x640F, 0x640F, 0x0E23, 0x6410, 0x6410, 0x23E9, 0x6412, 0x6412, 0x23EA, + 0x6413, 0x6413, 0x0E1C, 0x6414, 0x6414, 0x0E25, 0x6415, 0x6415, 0x23F1, + 0x6416, 0x6417, 0x0E28, 0x6418, 0x6418, 0x23F2, 0x641A, 0x641A, 0x23FF, + 0x641B, 0x641B, 0x2405, 0x641C, 0x641C, 0x0E24, 0x641E, 0x641E, 0x0E1E, + 0x641F, 0x641F, 0x23F0, 0x6420, 0x6420, 0x23EC, 0x6421, 0x6421, 0x2407, + 0x6422, 0x6423, 0x23F5, 0x6424, 0x6424, 0x23ED, 0x6425, 0x6425, 0x2401, + 0x6426, 0x6426, 0x23F8, 0x6427, 0x6427, 0x2402, 0x6428, 0x6428, 0x23FA, + 0x642A, 0x642A, 0x0E1F, 0x642B, 0x642B, 0x2699, 0x642C, 0x642C, 0x0E22, + 0x642D, 0x642D, 0x0E20, 0x642E, 0x642E, 0x2406, 0x642F, 0x642F, 0x23FD, + 0x6430, 0x6430, 0x23F9, 0x6432, 0x6432, 0x45D9, 0x6433, 0x6433, 0x23EE, + 0x6434, 0x6434, 0x0FE4, 0x6435, 0x6435, 0x23FC, 0x6436, 0x6436, 0x0E27, + 0x6437, 0x6437, 0x23F4, 0x6438, 0x6438, 0x4191, 0x6439, 0x6439, 0x23F3, + 0x643A, 0x643A, 0x419D, 0x643B, 0x643B, 0x3A6B, 0x643D, 0x643D, 0x0E21, + 0x643E, 0x643E, 0x0E1D, 0x643F, 0x643F, 0x26AE, 0x6440, 0x6440, 0x2400, + 0x6441, 0x6441, 0x23FB, 0x6443, 0x6443, 0x23EF, 0x644B, 0x644B, 0x26A9, + 0x644D, 0x644D, 0x269A, 0x644E, 0x644E, 0x26A5, 0x6450, 0x6450, 0x26AC, + 0x6451, 0x6451, 0x0FE2, 0x6452, 0x6452, 0x0C6D, 0x6453, 0x6453, 0x26AA, + 0x6454, 0x6454, 0x0FDD, 0x6458, 0x6458, 0x0FDC, 0x6459, 0x6459, 0x26B1, + 0x645A, 0x645A, 0x43C2, 0x645B, 0x645B, 0x269B, 0x645C, 0x645C, 0x26A8, + 0x645D, 0x645D, 0x269C, 0x645E, 0x645E, 0x26A7, 0x645F, 0x645F, 0x0FE0, + 0x6460, 0x6460, 0x26AB, 0x6461, 0x6461, 0x215C, 0x6465, 0x6465, 0x26B2, + 0x6466, 0x6466, 0x26A3, 0x6467, 0x6467, 0x0FE3, 0x6468, 0x6468, 0x28EE, + 0x6469, 0x6469, 0x1159, 0x646B, 0x646B, 0x26B0, 0x646C, 0x646C, 0x26AF, + 0x646D, 0x646D, 0x0FE5, 0x646E, 0x646E, 0x28E1, 0x646F, 0x646F, 0x115A, + 0x6470, 0x6470, 0x28E2, 0x6471, 0x6471, 0x3A5B, 0x6472, 0x6473, 0x269F, + 0x6474, 0x6474, 0x269D, 0x6475, 0x6475, 0x26A2, 0x6476, 0x6476, 0x269E, + 0x6477, 0x6477, 0x26B3, 0x6478, 0x6478, 0x0FDF, 0x6479, 0x6479, 0x115B, + 0x647A, 0x647A, 0x0FE1, 0x647B, 0x647B, 0x0FE6, 0x647C, 0x647C, 0x436C, + 0x647D, 0x647D, 0x26A1, 0x647F, 0x647F, 0x26AD, 0x6482, 0x6482, 0x26A6, + 0x6485, 0x6485, 0x28E5, 0x6487, 0x6487, 0x0FDB, 0x6488, 0x6488, 0x115E, + 0x6489, 0x6489, 0x2B54, 0x648A, 0x648A, 0x28EA, 0x648B, 0x648B, 0x28E9, + 0x648C, 0x648C, 0x28EB, 0x648D, 0x648D, 0x4323, 0x648F, 0x648F, 0x28E8, + 0x6490, 0x6490, 0x115F, 0x6491, 0x6491, 0x43C3, 0x6492, 0x6492, 0x1165, + 0x6493, 0x6493, 0x1162, 0x6495, 0x6495, 0x1163, 0x6496, 0x6496, 0x28E3, + 0x6497, 0x6497, 0x28E6, 0x6498, 0x6498, 0x28F0, 0x6499, 0x6499, 0x116B, + 0x649A, 0x649A, 0x1169, 0x649C, 0x649C, 0x28E7, 0x649D, 0x649D, 0x2154, + 0x649E, 0x649E, 0x115C, 0x649F, 0x649F, 0x28ED, 0x64A0, 0x64A0, 0x28E4, + 0x64A2, 0x64A2, 0x116C, 0x64A3, 0x64A3, 0x28EC, 0x64A4, 0x64A4, 0x0FDE, + 0x64A5, 0x64A5, 0x1161, 0x64A6, 0x64A6, 0x26A4, 0x64A9, 0x64A9, 0x1164, + 0x64AB, 0x64AB, 0x1168, 0x64AC, 0x64AC, 0x116A, 0x64AD, 0x64AD, 0x1167, + 0x64AE, 0x64AE, 0x1166, 0x64AF, 0x64AF, 0x42E1, 0x64B0, 0x64B0, 0x1160, + 0x64B1, 0x64B1, 0x28EF, 0x64B2, 0x64B2, 0x115D, 0x64B3, 0x64B3, 0x116D, + 0x64B4, 0x64B4, 0x4340, 0x64B6, 0x64B6, 0x3A64, 0x64BB, 0x64BC, 0x12BB, + 0x64BD, 0x64BD, 0x2B53, 0x64BE, 0x64BE, 0x12C5, 0x64BF, 0x64BF, 0x12C2, + 0x64C0, 0x64C0, 0x4645, 0x64C1, 0x64C1, 0x12B9, 0x64C2, 0x64C2, 0x12C0, + 0x64C3, 0x64C3, 0x2B55, 0x64C4, 0x64C4, 0x12BE, 0x64C5, 0x64C5, 0x12B8, + 0x64C7, 0x64C7, 0x12BF, 0x64C9, 0x64C9, 0x2B52, 0x64CA, 0x64CA, 0x13D8, + 0x64CB, 0x64CB, 0x12BA, 0x64CD, 0x64CD, 0x12C1, 0x64CE, 0x64CE, 0x13D7, + 0x64CF, 0x64CF, 0x2B51, 0x64D0, 0x64D0, 0x2B50, 0x64D2, 0x64D2, 0x12C3, + 0x64D3, 0x64D3, 0x3F03, 0x64D4, 0x64D4, 0x12C4, 0x64D6, 0x64D6, 0x2B4F, + 0x64D7, 0x64D7, 0x2B4E, 0x64D8, 0x64D8, 0x13D9, 0x64D9, 0x64D9, 0x2B58, + 0x64DA, 0x64DA, 0x12BD, 0x64DB, 0x64DB, 0x2B56, 0x64DD, 0x64DD, 0x431E, + 0x64E0, 0x64E0, 0x13DA, 0x64E1, 0x64E1, 0x4199, 0x64E2, 0x64E2, 0x13DF, + 0x64E3, 0x64E3, 0x2D6A, 0x64E4, 0x64E4, 0x2D6C, 0x64E5, 0x64E5, 0x419A, + 0x64E6, 0x64E6, 0x13DC, 0x64E7, 0x64E7, 0x37A8, 0x64E8, 0x64E8, 0x2D6D, + 0x64E9, 0x64E9, 0x2D69, 0x64EA, 0x64EA, 0x434A, 0x64EB, 0x64EB, 0x2D6B, + 0x64EC, 0x64EC, 0x13DD, 0x64ED, 0x64ED, 0x13E0, 0x64EF, 0x64EF, 0x2D68, + 0x64F0, 0x64F0, 0x13DB, 0x64F1, 0x64F1, 0x13DE, 0x64F2, 0x64F2, 0x14D3, + 0x64F3, 0x64F3, 0x2B57, 0x64F4, 0x64F4, 0x14D2, 0x64F7, 0x64F7, 0x14D8, + 0x64F8, 0x64F8, 0x2F2B, 0x64FA, 0x64FB, 0x14D6, 0x64FC, 0x64FC, 0x2F2E, + 0x64FD, 0x64FD, 0x2F2A, 0x64FE, 0x64FE, 0x14D4, 0x64FF, 0x64FF, 0x2F28, + 0x6500, 0x6500, 0x1582, 0x6501, 0x6501, 0x2F2C, 0x6503, 0x6503, 0x2F2D, + 0x6504, 0x6504, 0x2F29, 0x6506, 0x6506, 0x14D5, 0x6507, 0x6507, 0x3090, + 0x6509, 0x6509, 0x3093, 0x650A, 0x650A, 0x4536, 0x650C, 0x650C, 0x3094, + 0x650D, 0x650D, 0x3092, 0x650E, 0x650E, 0x3095, 0x650F, 0x650F, 0x1583, + 0x6510, 0x6510, 0x3091, 0x6511, 0x6511, 0x3AA9, 0x6513, 0x6513, 0x31D7, + 0x6514, 0x6514, 0x1617, 0x6515, 0x6515, 0x31D6, 0x6516, 0x6516, 0x31D5, + 0x6517, 0x6517, 0x31D4, 0x6518, 0x6518, 0x1616, 0x6519, 0x6519, 0x1618, + 0x651B, 0x651B, 0x32D2, 0x651C, 0x651C, 0x1673, 0x651D, 0x651D, 0x1672, + 0x651E, 0x651E, 0x4187, 0x651F, 0x651F, 0x3EC0, 0x6520, 0x6520, 0x3382, + 0x6521, 0x6521, 0x3381, 0x6522, 0x6522, 0x3384, 0x6523, 0x6523, 0x16F9, + 0x6524, 0x6524, 0x16C5, 0x6525, 0x6525, 0x341B, 0x6526, 0x6526, 0x3383, + 0x6529, 0x6529, 0x341A, 0x652A, 0x652A, 0x16FB, 0x652B, 0x652B, 0x16FA, + 0x652C, 0x652C, 0x1721, 0x652D, 0x652D, 0x3484, 0x652E, 0x652E, 0x34CA, + 0x652F, 0x652F, 0x02D5, 0x6530, 0x6530, 0x3E62, 0x6532, 0x6532, 0x216C, + 0x6533, 0x6533, 0x2B59, 0x6534, 0x6534, 0x022C, 0x6535, 0x6535, 0x44ED, + 0x6536, 0x6536, 0x03D7, 0x6537, 0x6537, 0x17F6, 0x6538, 0x6538, 0x04B9, + 0x6539, 0x6539, 0x04B7, 0x653B, 0x653B, 0x04B8, 0x653D, 0x653D, 0x19A1, + 0x653E, 0x653E, 0x05F3, 0x653F, 0x653F, 0x0741, 0x6541, 0x6541, 0x1B01, + 0x6543, 0x6543, 0x1B02, 0x6545, 0x6545, 0x0742, 0x6546, 0x6546, 0x1CBF, + 0x6548, 0x6549, 0x08D6, 0x654A, 0x654A, 0x1CBE, 0x654D, 0x654D, 0x419F, + 0x654F, 0x654F, 0x0ABD, 0x6551, 0x6551, 0x0AB9, 0x6553, 0x6553, 0x1F0C, + 0x6554, 0x6554, 0x0AC0, 0x6555, 0x6555, 0x0ABF, 0x6556, 0x6556, 0x0AB8, + 0x6557, 0x6557, 0x0ABB, 0x6558, 0x6558, 0x0ABE, 0x6559, 0x6559, 0x0ABA, + 0x655C, 0x655C, 0x2170, 0x655D, 0x655D, 0x0AB7, 0x655E, 0x655E, 0x0C70, + 0x655F, 0x655F, 0x41A5, 0x6562, 0x6563, 0x0C72, 0x6564, 0x6564, 0x216F, + 0x6565, 0x6565, 0x2172, 0x6566, 0x6566, 0x0C71, 0x6567, 0x6567, 0x216D, + 0x6568, 0x6568, 0x2171, 0x656A, 0x656A, 0x216E, 0x656B, 0x656B, 0x3A6C, + 0x656C, 0x656C, 0x0E2B, 0x656D, 0x656D, 0x41A4, 0x656F, 0x656F, 0x2409, + 0x6572, 0x6572, 0x0FE7, 0x6573, 0x6573, 0x26B4, 0x6574, 0x6574, 0x12C6, + 0x6575, 0x6575, 0x116E, 0x6576, 0x6576, 0x28F1, 0x6577, 0x6578, 0x116F, + 0x6579, 0x6579, 0x28F3, 0x657A, 0x657A, 0x28F2, 0x657B, 0x657B, 0x28F4, + 0x657C, 0x657C, 0x2B5B, 0x657F, 0x657F, 0x2B5A, 0x6580, 0x6580, 0x2D6F, + 0x6581, 0x6581, 0x2D6E, 0x6582, 0x6583, 0x13E1, 0x6584, 0x6584, 0x3096, + 0x6585, 0x6585, 0x41A3, 0x6586, 0x6586, 0x4648, 0x6587, 0x6587, 0x02D6, + 0x6588, 0x6588, 0x410B, 0x6589, 0x6589, 0x4554, 0x658C, 0x658C, 0x2173, + 0x6590, 0x6590, 0x0C75, 0x6591, 0x6591, 0x0C74, 0x6592, 0x6592, 0x240A, + 0x6594, 0x6594, 0x2F2F, 0x6595, 0x6595, 0x1674, 0x6596, 0x6596, 0x341C, + 0x6597, 0x6597, 0x02D7, 0x6599, 0x6599, 0x08D8, 0x659B, 0x659B, 0x0AC2, + 0x659C, 0x659C, 0x0AC1, 0x659D, 0x659E, 0x2174, 0x659F, 0x659F, 0x0E2C, + 0x65A0, 0x65A0, 0x26B5, 0x65A1, 0x65A1, 0x0FE8, 0x65A2, 0x65A2, 0x2B5C, + 0x65A4, 0x65A4, 0x02D8, 0x65A5, 0x65A5, 0x0346, 0x65A7, 0x65A7, 0x05F4, + 0x65A8, 0x65A8, 0x19A2, 0x65AA, 0x65AA, 0x1B03, 0x65AB, 0x65AB, 0x0743, + 0x65AC, 0x65AC, 0x0AC3, 0x65AE, 0x65AE, 0x2176, 0x65AF, 0x65AF, 0x0C76, + 0x65B0, 0x65B0, 0x0E2D, 0x65B2, 0x65B3, 0x28F5, 0x65B5, 0x65B5, 0x41A7, + 0x65B6, 0x65B6, 0x2D70, 0x65B7, 0x65B7, 0x14D9, 0x65B8, 0x65B8, 0x34CB, + 0x65B9, 0x65B9, 0x02D9, 0x65BB, 0x65BB, 0x19A3, 0x65BC, 0x65BC, 0x05F5, + 0x65BD, 0x65BD, 0x0744, 0x65BE, 0x65BE, 0x3E3B, 0x65BF, 0x65BF, 0x1B04, + 0x65C1, 0x65C1, 0x08D9, 0x65C2, 0x65C2, 0x1CC3, 0x65C3, 0x65C4, 0x1CC1, + 0x65C5, 0x65C5, 0x08DA, 0x65C6, 0x65C6, 0x1CC0, 0x65CB, 0x65CC, 0x0AC5, + 0x65CD, 0x65CD, 0x1F0D, 0x65CE, 0x65CE, 0x0AC7, 0x65CF, 0x65CF, 0x0AC4, + 0x65D0, 0x65D0, 0x2177, 0x65D1, 0x65D1, 0x41AA, 0x65D2, 0x65D2, 0x2178, + 0x65D3, 0x65D3, 0x240B, 0x65D4, 0x65D4, 0x3BA8, 0x65D6, 0x65D6, 0x0FEA, + 0x65D7, 0x65D7, 0x0FE9, 0x65DA, 0x65DA, 0x2D71, 0x65DB, 0x65DB, 0x2F30, + 0x65DD, 0x65DD, 0x3098, 0x65DE, 0x65DE, 0x3097, 0x65DF, 0x65DF, 0x31D8, + 0x65E0, 0x65E0, 0x022D, 0x65E1, 0x65E1, 0x1789, 0x65E2, 0x65E2, 0x0745, + 0x65E3, 0x65E3, 0x41AE, 0x65E5, 0x65E5, 0x02DA, 0x65E6, 0x65E6, 0x0347, + 0x65E8, 0x65E8, 0x03D9, 0x65E9, 0x65E9, 0x03D8, 0x65EC, 0x65ED, 0x03DA, + 0x65EE, 0x65EE, 0x17F8, 0x65EF, 0x65EF, 0x17F7, 0x65F0, 0x65F0, 0x189E, + 0x65F1, 0x65F1, 0x04BA, 0x65F2, 0x65F2, 0x18A1, 0x65F3, 0x65F3, 0x18A0, + 0x65F4, 0x65F4, 0x189F, 0x65F5, 0x65F5, 0x18A2, 0x65FA, 0x65FA, 0x05F6, + 0x65FB, 0x65FB, 0x19A9, 0x65FC, 0x65FC, 0x19A5, 0x65FD, 0x65FD, 0x19AE, + 0x65FF, 0x65FF, 0x464A, 0x6600, 0x6600, 0x05FD, 0x6602, 0x6602, 0x05FB, + 0x6603, 0x6603, 0x19AA, 0x6604, 0x6604, 0x19A6, 0x6605, 0x6605, 0x19AD, + 0x6606, 0x6606, 0x05FA, 0x6607, 0x6607, 0x0601, 0x6608, 0x6608, 0x19A8, + 0x6609, 0x6609, 0x19A4, 0x660A, 0x660A, 0x0600, 0x660B, 0x660B, 0x19AB, + 0x660C, 0x660C, 0x05F9, 0x660D, 0x660D, 0x19AC, 0x660E, 0x660E, 0x05FC, + 0x660F, 0x660F, 0x05FE, 0x6610, 0x6610, 0x19B0, 0x6611, 0x6611, 0x19AF, + 0x6612, 0x6612, 0x19A7, 0x6613, 0x6613, 0x05F8, 0x6614, 0x6614, 0x05F7, + 0x6615, 0x6615, 0x05FF, 0x6618, 0x6618, 0x41B1, 0x661C, 0x661C, 0x1B09, + 0x661D, 0x661D, 0x1B0F, 0x661E, 0x661E, 0x3A93, 0x661F, 0x661F, 0x074B, + 0x6620, 0x6620, 0x0748, 0x6621, 0x6621, 0x1B06, 0x6622, 0x6622, 0x1B0B, + 0x6623, 0x6623, 0x4295, 0x6624, 0x6624, 0x074E, 0x6625, 0x6625, 0x0746, + 0x6626, 0x6626, 0x1B0A, 0x6627, 0x6627, 0x0749, 0x6628, 0x6628, 0x074C, + 0x662B, 0x662B, 0x1B0D, 0x662D, 0x662D, 0x0747, 0x662E, 0x662E, 0x1B12, + 0x662F, 0x662F, 0x074A, 0x6630, 0x6630, 0x3A8D, 0x6631, 0x6631, 0x074D, + 0x6632, 0x6632, 0x1B07, 0x6633, 0x6633, 0x1B0C, 0x6634, 0x6634, 0x1B10, + 0x6635, 0x6635, 0x1B08, 0x6636, 0x6636, 0x1B05, 0x6639, 0x6639, 0x1B11, + 0x663A, 0x663A, 0x1B0E, 0x6641, 0x6641, 0x08E2, 0x6642, 0x6642, 0x08DB, + 0x6643, 0x6643, 0x08DE, 0x6644, 0x6644, 0x41B4, 0x6645, 0x6645, 0x08E1, + 0x6647, 0x6647, 0x1CC6, 0x6648, 0x6648, 0x3D99, 0x6649, 0x6649, 0x08DC, + 0x664A, 0x664A, 0x1CC4, 0x664B, 0x664B, 0x41B7, 0x664C, 0x664C, 0x08E0, + 0x664F, 0x664F, 0x08DD, 0x6651, 0x6651, 0x1CC7, 0x6652, 0x6652, 0x08DF, + 0x6653, 0x6653, 0x464B, 0x6657, 0x6657, 0x409B, 0x6659, 0x6659, 0x1F11, + 0x665A, 0x665A, 0x0AC9, 0x665B, 0x665B, 0x1F10, 0x665C, 0x665C, 0x1F12, + 0x665D, 0x665D, 0x0AC8, 0x665E, 0x665E, 0x0ACD, 0x665F, 0x665F, 0x1CC5, + 0x6661, 0x6661, 0x1F0F, 0x6662, 0x6662, 0x1F13, 0x6663, 0x6663, 0x3A90, + 0x6664, 0x6664, 0x0ACA, 0x6665, 0x6665, 0x1F0E, 0x6666, 0x6666, 0x0ACC, + 0x6667, 0x6667, 0x41B9, 0x6668, 0x6668, 0x0ACB, 0x666A, 0x666A, 0x217F, + 0x666B, 0x666B, 0x3A8B, 0x666C, 0x666C, 0x217A, 0x666E, 0x666E, 0x0C77, + 0x666F, 0x666F, 0x0C7B, 0x6670, 0x6670, 0x0C78, 0x6671, 0x6671, 0x217D, + 0x6672, 0x6672, 0x2180, 0x6673, 0x6673, 0x41BB, 0x6674, 0x6674, 0x0C79, + 0x6676, 0x6676, 0x0C7A, 0x6677, 0x6677, 0x0C7F, 0x6678, 0x6678, 0x2414, + 0x6679, 0x6679, 0x217E, 0x667A, 0x667A, 0x0C7D, 0x667B, 0x667B, 0x217B, + 0x667C, 0x667C, 0x2179, 0x667D, 0x667D, 0x469B, 0x667E, 0x667E, 0x0C7E, + 0x6680, 0x6680, 0x217C, 0x6684, 0x6684, 0x0E33, 0x6685, 0x6685, 0x4162, + 0x6686, 0x6686, 0x240C, 0x6687, 0x6688, 0x0E30, 0x6689, 0x6689, 0x0E2F, + 0x668A, 0x668A, 0x2411, 0x668B, 0x668B, 0x2410, 0x668C, 0x668C, 0x240D, + 0x668D, 0x668D, 0x0E35, 0x668E, 0x668E, 0x3A89, 0x6690, 0x6690, 0x240F, + 0x6691, 0x6691, 0x0C7C, 0x6692, 0x6692, 0x464D, 0x6694, 0x6694, 0x2413, + 0x6695, 0x6695, 0x240E, 0x6696, 0x6696, 0x0E32, 0x6697, 0x6697, 0x0E2E, + 0x6698, 0x6698, 0x0E34, 0x6699, 0x6699, 0x2412, 0x669A, 0x669A, 0x3D3D, + 0x669D, 0x669D, 0x0FED, 0x669F, 0x669F, 0x26B8, 0x66A0, 0x66A0, 0x26B7, + 0x66A1, 0x66A1, 0x26B6, 0x66A2, 0x66A2, 0x0FEB, 0x66A4, 0x66A4, 0x40BA, + 0x66A8, 0x66A8, 0x0FEC, 0x66A9, 0x66A9, 0x28F9, 0x66AA, 0x66AA, 0x28FC, + 0x66AB, 0x66AB, 0x1172, 0x66AD, 0x66AD, 0x4948, 0x66AE, 0x66AE, 0x1171, + 0x66AF, 0x66AF, 0x28FD, 0x66B0, 0x66B0, 0x28F8, 0x66B1, 0x66B1, 0x1174, + 0x66B2, 0x66B2, 0x28FA, 0x66B3, 0x66B3, 0x40B5, 0x66B4, 0x66B4, 0x1173, + 0x66B5, 0x66B5, 0x28F7, 0x66B6, 0x66B6, 0x3E13, 0x66B7, 0x66B7, 0x28FB, + 0x66B8, 0x66B8, 0x12CC, 0x66B9, 0x66B9, 0x12C9, 0x66BA, 0x66BA, 0x2B65, + 0x66BB, 0x66BB, 0x2B64, 0x66BD, 0x66BD, 0x2B63, 0x66BE, 0x66BE, 0x2B5E, + 0x66BF, 0x66BF, 0x3D9A, 0x66C0, 0x66C0, 0x2B5F, 0x66C4, 0x66C4, 0x12CA, + 0x66C6, 0x66C6, 0x12C7, 0x66C7, 0x66C7, 0x12CB, 0x66C8, 0x66C8, 0x2B5D, + 0x66C9, 0x66C9, 0x12C8, 0x66CA, 0x66CB, 0x2B60, 0x66CC, 0x66CC, 0x2B66, + 0x66CD, 0x66CD, 0x40B8, 0x66CE, 0x66CE, 0x3A77, 0x66CF, 0x66CF, 0x2B62, + 0x66D2, 0x66D2, 0x2D72, 0x66D6, 0x66D6, 0x13E4, 0x66D8, 0x66D8, 0x2F33, + 0x66D9, 0x66D9, 0x13E3, 0x66DA, 0x66DB, 0x2F31, 0x66DC, 0x66DC, 0x14DA, + 0x66DD, 0x66DD, 0x1585, 0x66DE, 0x66DE, 0x3099, 0x66E0, 0x66E0, 0x1584, + 0x66E3, 0x66E4, 0x31DA, 0x66E6, 0x66E6, 0x1619, 0x66E8, 0x66E8, 0x31D9, + 0x66E9, 0x66E9, 0x1675, 0x66EB, 0x66EB, 0x341D, 0x66EC, 0x66EC, 0x16FC, + 0x66ED, 0x66EE, 0x3485, 0x66F0, 0x66F0, 0x02DB, 0x66F1, 0x66F1, 0x3E84, + 0x66F2, 0x66F3, 0x03DC, 0x66F4, 0x66F4, 0x04BB, 0x66F6, 0x66F6, 0x19B1, + 0x66F7, 0x66F7, 0x074F, 0x66F8, 0x66F8, 0x08E3, 0x66F9, 0x66F9, 0x0ACE, + 0x66FC, 0x66FC, 0x0A1F, 0x66FE, 0x66FF, 0x0C80, 0x6700, 0x6700, 0x0BF0, + 0x6701, 0x6701, 0x2181, 0x6702, 0x6702, 0x41C4, 0x6703, 0x6703, 0x0E36, + 0x6704, 0x6704, 0x26BA, 0x6705, 0x6705, 0x26B9, 0x6708, 0x6708, 0x02DC, + 0x6709, 0x6709, 0x03DE, 0x670A, 0x670A, 0x19B2, 0x670B, 0x670B, 0x0603, + 0x670C, 0x670C, 0x3FE2, 0x670D, 0x670D, 0x0602, 0x670E, 0x670E, 0x3DA1, + 0x670F, 0x6710, 0x1B13, 0x6712, 0x6713, 0x1CC8, 0x6714, 0x6715, 0x08E4, + 0x6716, 0x6716, 0x464F, 0x6717, 0x6717, 0x08E6, 0x6718, 0x6718, 0x1F14, + 0x671B, 0x671B, 0x0AD0, 0x671D, 0x671D, 0x0C83, 0x671E, 0x671E, 0x3D8B, + 0x671F, 0x671F, 0x0C82, 0x6720, 0x6720, 0x2415, 0x6721, 0x6721, 0x2522, + 0x6722, 0x6722, 0x26BB, 0x6723, 0x6723, 0x2B67, 0x6725, 0x6725, 0x379F, + 0x6726, 0x6726, 0x14DB, 0x6727, 0x6727, 0x161A, 0x6728, 0x6728, 0x02DD, + 0x672A, 0x672B, 0x034A, 0x672C, 0x672C, 0x0349, 0x672D, 0x672D, 0x034C, + 0x672E, 0x672E, 0x0348, 0x6731, 0x6731, 0x03E1, 0x6733, 0x6733, 0x1800, + 0x6734, 0x6734, 0x03E0, 0x6735, 0x6735, 0x03E2, 0x6736, 0x6736, 0x3E41, + 0x6738, 0x6738, 0x17FB, 0x6739, 0x6739, 0x17FA, 0x673A, 0x673A, 0x17FD, + 0x673B, 0x673B, 0x17FC, 0x673C, 0x673C, 0x17FF, 0x673D, 0x673D, 0x03DF, + 0x673E, 0x673E, 0x17F9, 0x673F, 0x673F, 0x17FE, 0x6744, 0x6744, 0x401B, + 0x6745, 0x6745, 0x18A3, 0x6746, 0x6746, 0x04C5, 0x6747, 0x6747, 0x18A4, + 0x6748, 0x6748, 0x18A8, 0x6749, 0x6749, 0x04C4, 0x674B, 0x674B, 0x18AC, + 0x674C, 0x674C, 0x18A7, 0x674D, 0x674D, 0x18AA, 0x674E, 0x6751, 0x04BD, + 0x6753, 0x6753, 0x04C7, 0x6755, 0x6755, 0x18A6, 0x6756, 0x6756, 0x04C2, + 0x6757, 0x6757, 0x04C8, 0x6759, 0x6759, 0x18A5, 0x675A, 0x675A, 0x18AB, + 0x675C, 0x675C, 0x04C1, 0x675D, 0x675D, 0x18A9, 0x675E, 0x675E, 0x04C3, + 0x675F, 0x675F, 0x04BC, 0x6760, 0x6760, 0x04C6, 0x6761, 0x6761, 0x3D66, + 0x6762, 0x6762, 0x41CB, 0x6767, 0x6767, 0x41CA, 0x676A, 0x676A, 0x0618, + 0x676C, 0x676C, 0x19B4, 0x676D, 0x676D, 0x0604, 0x676F, 0x6770, 0x060E, + 0x6771, 0x6771, 0x0607, 0x6772, 0x6772, 0x0619, 0x6773, 0x6773, 0x0609, + 0x6774, 0x6774, 0x19BC, 0x6775, 0x6775, 0x0614, 0x6776, 0x6776, 0x19B7, + 0x6777, 0x6777, 0x060A, 0x6778, 0x6779, 0x19C6, 0x677A, 0x677A, 0x19BF, + 0x677B, 0x677B, 0x19B8, 0x677C, 0x677C, 0x0617, 0x677D, 0x677D, 0x19C4, + 0x677E, 0x677E, 0x0612, 0x677F, 0x677F, 0x0610, 0x6781, 0x6781, 0x19C5, + 0x6783, 0x6783, 0x19C3, 0x6784, 0x6784, 0x19BB, 0x6785, 0x6785, 0x19B3, + 0x6786, 0x6786, 0x19BA, 0x6787, 0x6787, 0x060B, 0x6789, 0x6789, 0x0611, + 0x678B, 0x678B, 0x0605, 0x678C, 0x678C, 0x19BE, 0x678D, 0x678D, 0x19BD, + 0x678E, 0x678E, 0x19B5, 0x678F, 0x678F, 0x46C1, 0x6790, 0x6790, 0x0613, + 0x6791, 0x6791, 0x19C1, 0x6792, 0x6792, 0x19B6, 0x6793, 0x6793, 0x0616, + 0x6794, 0x6794, 0x19C8, 0x6795, 0x6795, 0x0606, 0x6797, 0x6797, 0x060D, + 0x6798, 0x6798, 0x19B9, 0x6799, 0x6799, 0x19C2, 0x679A, 0x679A, 0x0615, + 0x679C, 0x679C, 0x0608, 0x679D, 0x679D, 0x060C, 0x679F, 0x679F, 0x19C0, + 0x67A0, 0x67A0, 0x3D7A, 0x67A4, 0x67A4, 0x4651, 0x67AC, 0x67AC, 0x41E3, + 0x67AE, 0x67AE, 0x1B34, 0x67AF, 0x67AF, 0x0757, 0x67B0, 0x67B0, 0x0764, + 0x67B1, 0x67B1, 0x41F4, 0x67B2, 0x67B2, 0x1B2F, 0x67B3, 0x67B3, 0x1B25, + 0x67B4, 0x67B4, 0x075D, 0x67B5, 0x67B5, 0x1B23, 0x67B6, 0x67B6, 0x0756, + 0x67B7, 0x67B7, 0x1B1E, 0x67B8, 0x67B8, 0x0760, 0x67B9, 0x67B9, 0x1B2B, + 0x67BA, 0x67BA, 0x1B18, 0x67BB, 0x67BB, 0x1B1A, 0x67BF, 0x67BF, 0x37FA, + 0x67C0, 0x67C0, 0x1B1D, 0x67C1, 0x67C1, 0x1B15, 0x67C2, 0x67C2, 0x1B2A, + 0x67C3, 0x67C3, 0x1B3A, 0x67C4, 0x67C4, 0x075B, 0x67C5, 0x67C5, 0x1B1F, + 0x67C6, 0x67C6, 0x1B31, 0x67C8, 0x67C8, 0x1B17, 0x67C9, 0x67CA, 0x1B38, + 0x67CB, 0x67CB, 0x1B3C, 0x67CC, 0x67CC, 0x1B33, 0x67CD, 0x67CD, 0x1B24, + 0x67CE, 0x67CE, 0x1B2C, 0x67CF, 0x67CF, 0x0761, 0x67D0, 0x67D0, 0x0754, + 0x67D1, 0x67D1, 0x075C, 0x67D2, 0x67D2, 0x0768, 0x67D3, 0x67D3, 0x0751, + 0x67D4, 0x67D4, 0x0753, 0x67D6, 0x67D6, 0x3B58, 0x67D7, 0x67D7, 0x41CE, + 0x67D8, 0x67D8, 0x1B1C, 0x67D9, 0x67D9, 0x0765, 0x67DA, 0x67DA, 0x075E, + 0x67DB, 0x67DB, 0x1B36, 0x67DC, 0x67DC, 0x1B19, 0x67DD, 0x67DD, 0x0767, + 0x67DE, 0x67DE, 0x0762, 0x67DF, 0x67DF, 0x1B22, 0x67E2, 0x67E2, 0x0766, + 0x67E3, 0x67E3, 0x1B29, 0x67E4, 0x67E4, 0x1B21, 0x67E5, 0x67E5, 0x075F, + 0x67E6, 0x67E6, 0x1B35, 0x67E7, 0x67E7, 0x1B2D, 0x67E9, 0x67E9, 0x0759, + 0x67EA, 0x67EA, 0x1B3B, 0x67EB, 0x67EB, 0x1B20, 0x67EC, 0x67EC, 0x0755, + 0x67ED, 0x67ED, 0x1B32, 0x67EE, 0x67EE, 0x1B28, 0x67EF, 0x67EF, 0x075A, + 0x67F0, 0x67F0, 0x1B2E, 0x67F1, 0x67F1, 0x0752, 0x67F2, 0x67F2, 0x1B16, + 0x67F3, 0x67F3, 0x0763, 0x67F4, 0x67F4, 0x08F5, 0x67F5, 0x67F5, 0x0758, + 0x67F6, 0x67F6, 0x1B27, 0x67F7, 0x67F7, 0x1B26, 0x67F8, 0x67F8, 0x1B1B, + 0x67F9, 0x67F9, 0x3996, 0x67FA, 0x67FA, 0x1B37, 0x67FC, 0x67FC, 0x1B30, + 0x67FE, 0x67FE, 0x4555, 0x67FF, 0x67FF, 0x0750, 0x6800, 0x6800, 0x43C7, + 0x6801, 0x6801, 0x41D3, 0x6802, 0x6802, 0x3FC8, 0x6803, 0x6803, 0x3D6A, + 0x6804, 0x6804, 0x4556, 0x680D, 0x680D, 0x4281, 0x6810, 0x6810, 0x399C, + 0x6812, 0x6812, 0x1CDD, 0x6813, 0x6813, 0x08FC, 0x6814, 0x6814, 0x1CDE, + 0x6816, 0x6816, 0x1CD2, 0x6817, 0x6817, 0x08F1, 0x6818, 0x6818, 0x08FD, + 0x681A, 0x681A, 0x1CCB, 0x681B, 0x681B, 0x4072, 0x681C, 0x681C, 0x1CD4, + 0x681D, 0x681D, 0x1CDC, 0x681E, 0x681E, 0x46C2, 0x681F, 0x681F, 0x1CCA, + 0x6820, 0x6820, 0x1CE5, 0x6821, 0x6821, 0x08E7, 0x6822, 0x6822, 0x41D0, + 0x6825, 0x6825, 0x1CE4, 0x6826, 0x6826, 0x1CDF, 0x6828, 0x6828, 0x1CE0, + 0x6829, 0x6829, 0x08EF, 0x682A, 0x682A, 0x08FA, 0x682B, 0x682B, 0x1CD6, + 0x682D, 0x682D, 0x1CD7, 0x682E, 0x682E, 0x1CE1, 0x682F, 0x682F, 0x1CD8, + 0x6831, 0x6831, 0x1CD3, 0x6832, 0x6833, 0x1CCD, 0x6834, 0x6834, 0x1CDB, + 0x6835, 0x6835, 0x1CD5, 0x6836, 0x6836, 0x3E2E, 0x6837, 0x6837, 0x421D, + 0x6838, 0x6838, 0x08E8, 0x6839, 0x6839, 0x08EC, 0x683A, 0x683A, 0x1CE3, + 0x683B, 0x683B, 0x1CCF, 0x683C, 0x683C, 0x08F8, 0x683D, 0x683D, 0x08F4, + 0x683E, 0x683E, 0x4147, 0x6840, 0x6840, 0x08F7, 0x6841, 0x6841, 0x08FE, + 0x6842, 0x6842, 0x08ED, 0x6843, 0x6843, 0x08F9, 0x6844, 0x6844, 0x1CDA, + 0x6845, 0x6845, 0x08FB, 0x6846, 0x6846, 0x08EA, 0x6847, 0x6847, 0x3BEB, + 0x6848, 0x6848, 0x08E9, 0x6849, 0x6849, 0x1CCC, 0x684A, 0x684A, 0x4653, + 0x684B, 0x684B, 0x1CD0, 0x684C, 0x684C, 0x08F2, 0x684D, 0x684D, 0x1CE2, + 0x684E, 0x684E, 0x1CD9, 0x684F, 0x684F, 0x1CD1, 0x6850, 0x6850, 0x08F6, + 0x6851, 0x6851, 0x08F3, 0x6853, 0x6853, 0x08EB, 0x6854, 0x6854, 0x08EE, + 0x6855, 0x6855, 0x3D90, 0x6856, 0x6856, 0x3814, 0x685D, 0x685D, 0x41D6, + 0x6865, 0x6865, 0x4557, 0x686B, 0x686B, 0x1F29, 0x686D, 0x686E, 0x1F19, + 0x686F, 0x686F, 0x1F1E, 0x6871, 0x6871, 0x1F2D, 0x6872, 0x6872, 0x1F2A, + 0x6874, 0x6874, 0x1F23, 0x6875, 0x6875, 0x1F22, 0x6876, 0x6876, 0x0AD7, + 0x6877, 0x6877, 0x1F26, 0x6878, 0x6878, 0x1F35, 0x6879, 0x6879, 0x1F15, + 0x687B, 0x687B, 0x1F36, 0x687C, 0x687C, 0x1F28, 0x687D, 0x687D, 0x1F3A, + 0x687E, 0x687E, 0x1F2E, 0x687F, 0x687F, 0x0AD6, 0x6880, 0x6880, 0x1F2C, + 0x6881, 0x6881, 0x0AD1, 0x6882, 0x6882, 0x0AE6, 0x6883, 0x6883, 0x0ADC, + 0x6884, 0x6884, 0x4654, 0x6885, 0x6885, 0x0AE0, 0x6886, 0x6886, 0x0ADF, + 0x6887, 0x6887, 0x1F16, 0x6888, 0x6888, 0x46B7, 0x6889, 0x6889, 0x1F33, + 0x688A, 0x688A, 0x1F39, 0x688B, 0x688B, 0x1F31, 0x688C, 0x688C, 0x1F38, + 0x688F, 0x688F, 0x1F25, 0x6890, 0x6890, 0x1F17, 0x6891, 0x6891, 0x1F37, + 0x6892, 0x6892, 0x1F27, 0x6893, 0x6893, 0x0AD4, 0x6894, 0x6894, 0x0AE1, + 0x6896, 0x6896, 0x1F30, 0x6897, 0x6897, 0x0ADA, 0x6898, 0x6898, 0x3AAA, + 0x689B, 0x689B, 0x1F2F, 0x689C, 0x689C, 0x1F18, 0x689D, 0x689D, 0x0AE2, + 0x689F, 0x689F, 0x0AE4, 0x68A0, 0x68A0, 0x1F32, 0x68A1, 0x68A1, 0x0AE5, + 0x68A2, 0x68A2, 0x0AD3, 0x68A3, 0x68A3, 0x1F1F, 0x68A4, 0x68A4, 0x1F34, + 0x68A6, 0x68A6, 0x40E4, 0x68A7, 0x68A7, 0x0AD9, 0x68A8, 0x68A8, 0x0AE3, + 0x68A9, 0x68A9, 0x1F21, 0x68AA, 0x68AA, 0x1F2B, 0x68AB, 0x68AB, 0x1F1C, + 0x68AC, 0x68AC, 0x1F20, 0x68AD, 0x68AD, 0x0ADE, 0x68AE, 0x68AE, 0x1F1B, + 0x68AF, 0x68AF, 0x0AD2, 0x68B0, 0x68B0, 0x0ADB, 0x68B1, 0x68B1, 0x0AD8, + 0x68B2, 0x68B2, 0x1F24, 0x68B3, 0x68B3, 0x08F0, 0x68B4, 0x68B4, 0x2198, + 0x68B5, 0x68B5, 0x0AD5, 0x68B6, 0x68B6, 0x3A9E, 0x68B9, 0x68B9, 0x3D14, + 0x68BD, 0x68BD, 0x427C, 0x68C3, 0x68C3, 0x41DC, 0x68C4, 0x68C4, 0x0ADD, + 0x68C5, 0x68C5, 0x3C2E, 0x68C6, 0x68C6, 0x219B, 0x68C7, 0x68C7, 0x21B1, + 0x68C8, 0x68C8, 0x21A6, 0x68C9, 0x68C9, 0x0C97, 0x68CA, 0x68CA, 0x42EB, + 0x68CB, 0x68CB, 0x0C92, 0x68CC, 0x68CC, 0x2195, 0x68CD, 0x68CD, 0x0C93, + 0x68CE, 0x68CE, 0x21A5, 0x68D0, 0x68D0, 0x219E, 0x68D1, 0x68D1, 0x21AB, + 0x68D2, 0x68D2, 0x0C8F, 0x68D3, 0x68D3, 0x2183, 0x68D4, 0x68D4, 0x21AD, + 0x68D5, 0x68D5, 0x0C85, 0x68D6, 0x68D6, 0x218B, 0x68D7, 0x68D7, 0x0C88, + 0x68D8, 0x68D8, 0x0C87, 0x68DA, 0x68DA, 0x0C98, 0x68DC, 0x68DC, 0x2185, + 0x68DD, 0x68DE, 0x21A7, 0x68DF, 0x68DF, 0x0C8A, 0x68E0, 0x68E0, 0x0C86, + 0x68E1, 0x68E1, 0x2193, 0x68E3, 0x68E3, 0x0C91, 0x68E4, 0x68E4, 0x218E, + 0x68E6, 0x68E6, 0x21A9, 0x68E7, 0x68E7, 0x0C8D, 0x68E8, 0x68E8, 0x21A1, + 0x68E9, 0x68E9, 0x21AE, 0x68EA, 0x68EA, 0x2188, 0x68EB, 0x68EB, 0x218D, + 0x68EC, 0x68EC, 0x2187, 0x68EE, 0x68EE, 0x0C8C, 0x68EF, 0x68EF, 0x219A, + 0x68F0, 0x68F0, 0x242B, 0x68F1, 0x68F1, 0x2189, 0x68F2, 0x68F2, 0x0C90, + 0x68F3, 0x68F3, 0x2192, 0x68F4, 0x68F4, 0x21AA, 0x68F5, 0x68F5, 0x0C8B, + 0x68F6, 0x68F6, 0x218F, 0x68F7, 0x68F7, 0x218C, 0x68F8, 0x68F8, 0x219D, + 0x68F9, 0x68F9, 0x0C8E, 0x68FA, 0x68FA, 0x0C84, 0x68FB, 0x68FB, 0x0C9A, + 0x68FC, 0x68FC, 0x21A0, 0x68FD, 0x68FD, 0x219F, 0x6900, 0x6900, 0x41DF, + 0x6901, 0x6901, 0x41DE, 0x6902, 0x6902, 0x42FB, 0x6903, 0x6903, 0x429C, + 0x6904, 0x6904, 0x2184, 0x6905, 0x6905, 0x0C89, 0x6906, 0x6906, 0x21AC, + 0x6907, 0x6907, 0x2194, 0x6908, 0x6908, 0x2196, 0x6909, 0x6909, 0x4658, + 0x690A, 0x690A, 0x21A3, 0x690B, 0x690B, 0x21A2, 0x690C, 0x690C, 0x2182, + 0x690D, 0x690D, 0x0C94, 0x690E, 0x690E, 0x0C96, 0x690F, 0x690F, 0x218A, + 0x6910, 0x6910, 0x2191, 0x6911, 0x6911, 0x2199, 0x6912, 0x6912, 0x0C95, + 0x6913, 0x6913, 0x2190, 0x6914, 0x6914, 0x219C, 0x6915, 0x6915, 0x21AF, + 0x6917, 0x6917, 0x21A4, 0x6918, 0x6918, 0x3DA2, 0x691A, 0x691A, 0x3D80, + 0x691B, 0x691B, 0x37BD, 0x6925, 0x6925, 0x21B0, 0x692A, 0x692A, 0x2186, + 0x692C, 0x692C, 0x3F38, 0x692F, 0x692F, 0x243F, 0x6930, 0x6930, 0x0E3E, + 0x6932, 0x6932, 0x243D, 0x6933, 0x6933, 0x2428, 0x6934, 0x6934, 0x242D, + 0x6935, 0x6935, 0x2426, 0x6936, 0x6936, 0x41E7, 0x6937, 0x6937, 0x2439, + 0x6938, 0x6938, 0x2418, 0x6939, 0x6939, 0x241F, 0x693B, 0x693B, 0x2437, + 0x693C, 0x693C, 0x2441, 0x693D, 0x693D, 0x2429, 0x693E, 0x693E, 0x4056, + 0x693F, 0x693F, 0x241C, 0x6940, 0x6940, 0x242F, 0x6941, 0x6941, 0x2434, + 0x6942, 0x6942, 0x2420, 0x6943, 0x6943, 0x4659, 0x6944, 0x6944, 0x2431, + 0x6945, 0x6945, 0x241D, 0x6946, 0x6946, 0x456F, 0x6948, 0x6949, 0x2424, + 0x694A, 0x694A, 0x0E40, 0x694B, 0x694B, 0x2438, 0x694C, 0x694C, 0x2436, + 0x694E, 0x694E, 0x2419, 0x694F, 0x694F, 0x243B, 0x6951, 0x6951, 0x243C, + 0x6952, 0x6952, 0x243E, 0x6953, 0x6953, 0x0E44, 0x6954, 0x6954, 0x0E3C, + 0x6955, 0x6955, 0x3D86, 0x6956, 0x6956, 0x1F1D, 0x6957, 0x6957, 0x2421, + 0x6958, 0x6958, 0x2433, 0x6959, 0x6959, 0x2422, 0x695A, 0x695A, 0x0E39, + 0x695B, 0x695B, 0x0E49, 0x695C, 0x695C, 0x243A, 0x695D, 0x695D, 0x0E47, + 0x695E, 0x695E, 0x0E43, 0x695F, 0x695F, 0x2417, 0x6960, 0x6960, 0x0E3B, + 0x6961, 0x6961, 0x41E4, 0x6962, 0x6962, 0x241A, 0x6963, 0x6963, 0x0E48, + 0x6964, 0x6964, 0x465B, 0x6965, 0x6965, 0x242A, 0x6966, 0x6966, 0x2416, + 0x6967, 0x6967, 0x3D15, 0x6968, 0x6968, 0x0E41, 0x6969, 0x6969, 0x242E, + 0x696A, 0x696A, 0x241E, 0x696B, 0x696B, 0x0E42, 0x696C, 0x696C, 0x2427, + 0x696D, 0x696D, 0x0E38, 0x696E, 0x696E, 0x0C99, 0x696F, 0x696F, 0x2430, + 0x6970, 0x6970, 0x2197, 0x6971, 0x6971, 0x241B, 0x6972, 0x6972, 0x3A6D, + 0x6973, 0x6973, 0x41DB, 0x6974, 0x6974, 0x2435, 0x6975, 0x6975, 0x0E3D, + 0x6976, 0x6976, 0x2432, 0x6977, 0x6977, 0x0E3A, 0x6978, 0x6978, 0x242C, + 0x6979, 0x6979, 0x0E45, 0x697A, 0x697A, 0x2423, 0x697B, 0x697B, 0x2440, + 0x6980, 0x6980, 0x3F3E, 0x6982, 0x6982, 0x0E3F, 0x6983, 0x6983, 0x24AF, + 0x6985, 0x6985, 0x465D, 0x6986, 0x6986, 0x0E46, 0x698A, 0x698A, 0x3D74, + 0x698D, 0x698D, 0x26C9, 0x698E, 0x698E, 0x26C7, 0x6990, 0x6990, 0x26DD, + 0x6991, 0x6991, 0x26C5, 0x6993, 0x6993, 0x26D7, 0x6994, 0x6994, 0x0E37, + 0x6995, 0x6995, 0x0FF0, 0x6996, 0x6996, 0x26C1, 0x6997, 0x6997, 0x26DC, + 0x6998, 0x6998, 0x41E8, 0x6999, 0x6999, 0x26C6, 0x699A, 0x699A, 0x26D4, + 0x699B, 0x699B, 0x0FF5, 0x699C, 0x699C, 0x0FEE, 0x699E, 0x699E, 0x26DA, + 0x699F, 0x699F, 0x465C, 0x69A0, 0x69A0, 0x26BF, 0x69A1, 0x69A1, 0x26D9, + 0x69A2, 0x69A2, 0x3730, 0x69A3, 0x69A3, 0x1000, 0x69A4, 0x69A4, 0x26D0, + 0x69A5, 0x69A5, 0x26E0, 0x69A6, 0x69A6, 0x0FFE, 0x69A7, 0x69A7, 0x26C8, + 0x69A8, 0x69A8, 0x0FEF, 0x69A9, 0x69A9, 0x26CA, 0x69AA, 0x69AA, 0x26D8, + 0x69AB, 0x69AB, 0x0FF8, 0x69AC, 0x69AC, 0x26C3, 0x69AD, 0x69AD, 0x0FFC, + 0x69AE, 0x69AE, 0x0FF2, 0x69AF, 0x69AF, 0x26CC, 0x69B0, 0x69B0, 0x26C2, + 0x69B1, 0x69B1, 0x26BC, 0x69B2, 0x69B2, 0x3FF6, 0x69B3, 0x69B3, 0x26D6, + 0x69B4, 0x69B4, 0x0FF9, 0x69B5, 0x69B5, 0x26DF, 0x69B6, 0x69B6, 0x26BD, + 0x69B7, 0x69B7, 0x0FF6, 0x69B9, 0x69B9, 0x26D2, 0x69BB, 0x69BB, 0x0FF7, + 0x69BC, 0x69BC, 0x26C4, 0x69BD, 0x69BD, 0x26CF, 0x69BE, 0x69BE, 0x26CB, + 0x69BF, 0x69BF, 0x26CD, 0x69C0, 0x69C0, 0x3F5D, 0x69C1, 0x69C1, 0x0FF1, + 0x69C2, 0x69C2, 0x26DE, 0x69C3, 0x69C3, 0x0FFF, 0x69C4, 0x69C4, 0x26CE, + 0x69C6, 0x69C6, 0x26E1, 0x69C9, 0x69C9, 0x26BE, 0x69CA, 0x69CA, 0x26D3, + 0x69CB, 0x69CB, 0x0FF4, 0x69CC, 0x69CC, 0x0FFD, 0x69CD, 0x69CD, 0x0FFB, + 0x69CE, 0x69CE, 0x26C0, 0x69CF, 0x69CF, 0x26D5, 0x69D0, 0x69D0, 0x0FFA, + 0x69D1, 0x69D1, 0x39EF, 0x69D3, 0x69D3, 0x0FF3, 0x69D4, 0x69D4, 0x26D1, + 0x69D5, 0x69D5, 0x3E3C, 0x69D6, 0x69D6, 0x465E, 0x69D9, 0x69D9, 0x26DB, + 0x69E1, 0x69E1, 0x41D8, 0x69E2, 0x69E2, 0x2909, 0x69E4, 0x69E4, 0x2905, + 0x69E5, 0x69E5, 0x2901, 0x69E6, 0x69E6, 0x2915, 0x69E7, 0x69E7, 0x2912, + 0x69E8, 0x69E8, 0x1177, 0x69E9, 0x69E9, 0x3D91, 0x69EB, 0x69EB, 0x2919, + 0x69EC, 0x69EC, 0x2908, 0x69ED, 0x69ED, 0x1182, 0x69EE, 0x69EE, 0x290F, + 0x69F1, 0x69F1, 0x2904, 0x69F2, 0x69F2, 0x290E, 0x69F3, 0x69F3, 0x117F, + 0x69F4, 0x69F4, 0x2922, 0x69F6, 0x69F6, 0x291F, 0x69F7, 0x69F7, 0x2911, + 0x69F8, 0x69F8, 0x2902, 0x69F9, 0x69F9, 0x41ED, 0x69FA, 0x69FA, 0x41C7, + 0x69FB, 0x69FB, 0x2916, 0x69FC, 0x69FC, 0x2918, 0x69FD, 0x69FD, 0x117B, + 0x69FE, 0x69FE, 0x290C, 0x69FF, 0x69FF, 0x2907, 0x6A00, 0x6A00, 0x28FE, + 0x6A01, 0x6A01, 0x1178, 0x6A02, 0x6A02, 0x1180, 0x6A03, 0x6A03, 0x3E29, + 0x6A04, 0x6A04, 0x291B, 0x6A05, 0x6A05, 0x1181, 0x6A06, 0x6A06, 0x28FF, + 0x6A07, 0x6A07, 0x2921, 0x6A08, 0x6A08, 0x2914, 0x6A09, 0x6A09, 0x291A, + 0x6A0A, 0x6A0A, 0x117E, 0x6A0B, 0x6A0B, 0x41D9, 0x6A0C, 0x6A0C, 0x3D50, + 0x6A0D, 0x6A0D, 0x2917, 0x6A0F, 0x6A0F, 0x291E, 0x6A11, 0x6A11, 0x1183, + 0x6A13, 0x6A13, 0x117D, 0x6A14, 0x6A14, 0x2910, 0x6A15, 0x6A15, 0x2903, + 0x6A16, 0x6A16, 0x2923, 0x6A17, 0x6A17, 0x2900, 0x6A18, 0x6A18, 0x291C, + 0x6A19, 0x6A19, 0x117A, 0x6A1A, 0x6A1A, 0x3D1E, 0x6A1B, 0x6A1B, 0x290A, + 0x6A1C, 0x6A1C, 0x3B68, 0x6A1D, 0x6A1D, 0x290B, 0x6A1E, 0x6A1E, 0x1179, + 0x6A1F, 0x6A1F, 0x1176, 0x6A20, 0x6A20, 0x2906, 0x6A21, 0x6A21, 0x117C, + 0x6A23, 0x6A23, 0x1175, 0x6A25, 0x6A25, 0x291D, 0x6A26, 0x6A26, 0x2920, + 0x6A27, 0x6A27, 0x290D, 0x6A28, 0x6A28, 0x2B74, 0x6A2B, 0x6A2B, 0x3D42, + 0x6A2C, 0x6A2C, 0x42AB, 0x6A2D, 0x6A2D, 0x3B1F, 0x6A32, 0x6A32, 0x2B6C, + 0x6A33, 0x6A33, 0x3AA4, 0x6A34, 0x6A34, 0x2B68, 0x6A35, 0x6A35, 0x12D9, + 0x6A38, 0x6A38, 0x12CE, 0x6A39, 0x6A39, 0x12D3, 0x6A3A, 0x6A3A, 0x12CF, + 0x6A3B, 0x6A3B, 0x2B76, 0x6A3C, 0x6A3C, 0x2B81, 0x6A3D, 0x6A3D, 0x12CD, + 0x6A3E, 0x6A3E, 0x2B6E, 0x6A3F, 0x6A3F, 0x2B77, 0x6A40, 0x6A40, 0x2913, + 0x6A41, 0x6A41, 0x2B78, 0x6A44, 0x6A44, 0x12D4, 0x6A45, 0x6A45, 0x41F0, + 0x6A46, 0x6A46, 0x2B87, 0x6A47, 0x6A47, 0x12D8, 0x6A48, 0x6A48, 0x12DB, + 0x6A49, 0x6A49, 0x2B6A, 0x6A4B, 0x6A4B, 0x12D7, 0x6A4C, 0x6A4C, 0x3AAB, + 0x6A4D, 0x6A4E, 0x2B85, 0x6A4F, 0x6A4F, 0x2B7C, 0x6A50, 0x6A50, 0x2B7B, + 0x6A51, 0x6A51, 0x2B73, 0x6A52, 0x6A52, 0x3AA5, 0x6A53, 0x6A53, 0x37AC, + 0x6A54, 0x6A54, 0x2B7D, 0x6A55, 0x6A55, 0x2B84, 0x6A56, 0x6A56, 0x2B83, + 0x6A57, 0x6A57, 0x37DA, 0x6A58, 0x6A58, 0x12D2, 0x6A59, 0x6A59, 0x12D0, + 0x6A5A, 0x6A5A, 0x2B75, 0x6A5B, 0x6A5B, 0x2B72, 0x6A5D, 0x6A5D, 0x2B6F, + 0x6A5E, 0x6A5E, 0x2B82, 0x6A5F, 0x6A5F, 0x12DA, 0x6A60, 0x6A60, 0x2B80, + 0x6A61, 0x6A61, 0x12D6, 0x6A62, 0x6A62, 0x12D5, 0x6A64, 0x6A64, 0x2B7A, + 0x6A65, 0x6A65, 0x4660, 0x6A66, 0x6A66, 0x2B69, 0x6A67, 0x6A67, 0x2B6B, + 0x6A68, 0x6A68, 0x2B6D, 0x6A69, 0x6A69, 0x2B7F, 0x6A6A, 0x6A6A, 0x2B79, + 0x6A6B, 0x6A6B, 0x12D1, 0x6A6D, 0x6A6D, 0x2B70, 0x6A6F, 0x6A6F, 0x2B7E, + 0x6A71, 0x6A71, 0x4662, 0x6A74, 0x6A74, 0x4661, 0x6A76, 0x6A76, 0x2B71, + 0x6A7A, 0x6A7A, 0x3AAD, 0x6A7E, 0x6A7E, 0x13EC, 0x6A7F, 0x6A7F, 0x2D84, + 0x6A80, 0x6A80, 0x13E5, 0x6A81, 0x6A81, 0x2D75, 0x6A82, 0x6A82, 0x4663, + 0x6A83, 0x6A83, 0x2D80, 0x6A84, 0x6A84, 0x13E7, 0x6A85, 0x6A85, 0x2D87, + 0x6A87, 0x6A87, 0x2D7C, 0x6A89, 0x6A89, 0x2D77, 0x6A8A, 0x6A8A, 0x4136, + 0x6A8C, 0x6A8C, 0x2D88, 0x6A8D, 0x6A8D, 0x2D73, 0x6A8E, 0x6A8E, 0x2D7E, + 0x6A8F, 0x6A8F, 0x3C1B, 0x6A90, 0x6A90, 0x13EE, 0x6A91, 0x6A91, 0x2D83, + 0x6A92, 0x6A92, 0x2D89, 0x6A93, 0x6A93, 0x2D7D, 0x6A94, 0x6A94, 0x13E6, + 0x6A95, 0x6A95, 0x2D7F, 0x6A96, 0x6A96, 0x2D74, 0x6A97, 0x6A97, 0x13ED, + 0x6A99, 0x6A99, 0x4665, 0x6A9A, 0x6A9A, 0x2D86, 0x6A9B, 0x6A9B, 0x2D79, + 0x6A9C, 0x6A9C, 0x13E9, 0x6A9D, 0x6A9D, 0x41F2, 0x6A9E, 0x6A9E, 0x2D7B, + 0x6A9F, 0x6A9F, 0x2D78, 0x6AA0, 0x6AA0, 0x13EF, 0x6AA1, 0x6AA1, 0x2D7A, + 0x6AA2, 0x6AA2, 0x13E8, 0x6AA3, 0x6AA3, 0x13EB, 0x6AA4, 0x6AA4, 0x2D82, + 0x6AA5, 0x6AA5, 0x2D76, 0x6AA6, 0x6AA6, 0x2D85, 0x6AA7, 0x6AA7, 0x37E3, + 0x6AA8, 0x6AA8, 0x2D81, 0x6AAB, 0x6AAB, 0x4667, 0x6AAC, 0x6AAC, 0x14DD, + 0x6AAD, 0x6AAD, 0x2F3E, 0x6AAE, 0x6AAF, 0x14E2, 0x6AB1, 0x6AB1, 0x3E53, + 0x6AB2, 0x6AB2, 0x3B4B, 0x6AB3, 0x6AB3, 0x14DC, 0x6AB4, 0x6AB4, 0x2F3D, + 0x6AB5, 0x6AB5, 0x4668, 0x6AB6, 0x6AB7, 0x2F3A, 0x6AB8, 0x6AB8, 0x14E0, + 0x6AB9, 0x6AB9, 0x2F35, 0x6ABA, 0x6ABA, 0x2F39, 0x6ABB, 0x6ABB, 0x14DF, + 0x6ABD, 0x6ABD, 0x2F36, 0x6ABE, 0x6ABE, 0x3AA1, 0x6AC2, 0x6AC2, 0x14E1, + 0x6AC3, 0x6AC3, 0x14DE, 0x6AC5, 0x6AC5, 0x2F34, 0x6AC6, 0x6AC6, 0x2F38, + 0x6AC7, 0x6AC7, 0x2F3C, 0x6AC8, 0x6AC8, 0x41F5, 0x6AC9, 0x6AC9, 0x3AA6, + 0x6ACA, 0x6ACA, 0x3F4C, 0x6ACB, 0x6ACB, 0x309F, 0x6ACC, 0x6ACC, 0x309C, + 0x6ACD, 0x6ACD, 0x30A5, 0x6ACF, 0x6ACF, 0x30A4, 0x6AD0, 0x6AD0, 0x30A2, + 0x6AD1, 0x6AD1, 0x309D, 0x6AD3, 0x6AD3, 0x1589, 0x6AD4, 0x6AD4, 0x4669, + 0x6AD8, 0x6AD8, 0x3CAA, 0x6AD9, 0x6AD9, 0x309E, 0x6ADA, 0x6ADA, 0x1588, + 0x6ADB, 0x6ADB, 0x13EA, 0x6ADC, 0x6ADC, 0x30A1, 0x6ADD, 0x6ADD, 0x1587, + 0x6ADE, 0x6ADE, 0x30A6, 0x6ADF, 0x6ADF, 0x30A0, 0x6AE0, 0x6AE0, 0x309B, + 0x6AE1, 0x6AE1, 0x2F37, 0x6AE5, 0x6AE5, 0x1586, 0x6AE7, 0x6AE7, 0x309A, + 0x6AE8, 0x6AE8, 0x31DF, 0x6AEA, 0x6AEA, 0x31DE, 0x6AEB, 0x6AEB, 0x30A3, + 0x6AEC, 0x6AEC, 0x161B, 0x6AEE, 0x6AEF, 0x31E2, 0x6AF0, 0x6AF0, 0x31DD, + 0x6AF1, 0x6AF1, 0x31E1, 0x6AF3, 0x6AF3, 0x31DC, 0x6AF6, 0x6AF6, 0x466A, + 0x6AF8, 0x6AF8, 0x32D6, 0x6AF9, 0x6AF9, 0x31E0, 0x6AFA, 0x6AFA, 0x1678, + 0x6AFB, 0x6AFB, 0x1676, 0x6AFC, 0x6AFC, 0x32D4, 0x6B00, 0x6B00, 0x32D7, + 0x6B02, 0x6B02, 0x32D3, 0x6B03, 0x6B03, 0x32D5, 0x6B04, 0x6B04, 0x1677, + 0x6B05, 0x6B05, 0x3AA7, 0x6B08, 0x6B09, 0x3386, 0x6B0A, 0x6B0A, 0x16C6, + 0x6B0B, 0x6B0B, 0x3385, 0x6B0F, 0x6B0F, 0x3420, 0x6B10, 0x6B10, 0x16FD, + 0x6B11, 0x6B12, 0x341E, 0x6B13, 0x6B13, 0x3487, 0x6B16, 0x6B16, 0x1743, + 0x6B17, 0x6B17, 0x34CE, 0x6B18, 0x6B19, 0x34CC, 0x6B1A, 0x6B1A, 0x34CF, + 0x6B1D, 0x6B1D, 0x41F8, 0x6B1E, 0x6B1E, 0x3534, 0x6B20, 0x6B20, 0x02DE, + 0x6B21, 0x6B21, 0x03E3, 0x6B23, 0x6B23, 0x061A, 0x6B25, 0x6B25, 0x19C9, + 0x6B28, 0x6B28, 0x1B3D, 0x6B2C, 0x6B2C, 0x1CE6, 0x6B2D, 0x6B2D, 0x1CE8, + 0x6B2F, 0x6B2F, 0x1CE7, 0x6B31, 0x6B31, 0x1CE9, 0x6B32, 0x6B32, 0x0AE7, + 0x6B33, 0x6B33, 0x1F3C, 0x6B34, 0x6B34, 0x1CEA, 0x6B35, 0x6B35, 0x41FB, + 0x6B36, 0x6B36, 0x1F3B, 0x6B37, 0x6B38, 0x1F3D, 0x6B39, 0x6B39, 0x21B2, + 0x6B3A, 0x6B3A, 0x0C9C, 0x6B3B, 0x6B3B, 0x21B3, 0x6B3C, 0x6B3C, 0x21B5, + 0x6B3D, 0x6B3D, 0x0C9D, 0x6B3E, 0x6B3E, 0x0C9B, 0x6B3F, 0x6B3F, 0x21B4, + 0x6B41, 0x6B41, 0x2447, 0x6B42, 0x6B42, 0x2445, 0x6B43, 0x6B43, 0x2444, + 0x6B45, 0x6B45, 0x2443, 0x6B46, 0x6B46, 0x2442, 0x6B47, 0x6B47, 0x0E4A, + 0x6B48, 0x6B48, 0x2446, 0x6B49, 0x6B49, 0x1001, 0x6B4A, 0x6B4A, 0x26E2, + 0x6B4B, 0x6B4B, 0x26E4, 0x6B4C, 0x6B4C, 0x1002, 0x6B4D, 0x6B4D, 0x26E3, + 0x6B4E, 0x6B4E, 0x1185, 0x6B50, 0x6B50, 0x1184, 0x6B51, 0x6B51, 0x2924, + 0x6B52, 0x6B52, 0x3F6E, 0x6B54, 0x6B54, 0x2B89, 0x6B55, 0x6B55, 0x2B88, + 0x6B56, 0x6B56, 0x2B8A, 0x6B57, 0x6B57, 0x3AAE, 0x6B59, 0x6B59, 0x12DC, + 0x6B5B, 0x6B5B, 0x2D8A, 0x6B5C, 0x6B5C, 0x13F0, 0x6B5E, 0x6B5E, 0x2F3F, + 0x6B5F, 0x6B5F, 0x14E4, 0x6B60, 0x6B60, 0x30A7, 0x6B61, 0x6B61, 0x16C7, + 0x6B62, 0x6B62, 0x02DF, 0x6B63, 0x6B63, 0x034D, 0x6B64, 0x6B64, 0x03E4, + 0x6B65, 0x6B65, 0x04C9, 0x6B66, 0x6B67, 0x061B, 0x6B6A, 0x6B6A, 0x0769, + 0x6B6D, 0x6B6D, 0x1CEB, 0x6B6F, 0x6B6F, 0x4515, 0x6B72, 0x6B72, 0x0E4B, + 0x6B74, 0x6B74, 0x41FC, 0x6B76, 0x6B76, 0x29A2, 0x6B77, 0x6B77, 0x12DD, + 0x6B78, 0x6B78, 0x14E5, 0x6B79, 0x6B79, 0x02E0, 0x6B7A, 0x6B7A, 0x44EE, + 0x6B7B, 0x6B7B, 0x03E5, 0x6B7E, 0x6B7E, 0x19CB, 0x6B7F, 0x6B7F, 0x061D, + 0x6B80, 0x6B80, 0x19CA, 0x6B81, 0x6B81, 0x466B, 0x6B82, 0x6B82, 0x1B3E, + 0x6B83, 0x6B83, 0x076A, 0x6B84, 0x6B84, 0x1B3F, 0x6B86, 0x6B86, 0x076B, + 0x6B88, 0x6B88, 0x1CED, 0x6B89, 0x6B89, 0x0900, 0x6B8A, 0x6B8A, 0x08FF, + 0x6B8C, 0x6B8C, 0x1F43, 0x6B8D, 0x6B8E, 0x1F41, 0x6B8F, 0x6B8F, 0x1F40, + 0x6B91, 0x6B91, 0x1F3F, 0x6B94, 0x6B94, 0x21B6, 0x6B95, 0x6B95, 0x21B9, + 0x6B96, 0x6B96, 0x0C9F, 0x6B97, 0x6B97, 0x21B7, 0x6B98, 0x6B98, 0x0C9E, + 0x6B99, 0x6B99, 0x21B8, 0x6B9B, 0x6B9B, 0x2448, 0x6B9E, 0x6BA0, 0x26E5, + 0x6BA2, 0x6BA2, 0x2927, 0x6BA3, 0x6BA3, 0x2926, 0x6BA4, 0x6BA4, 0x1186, + 0x6BA5, 0x6BA5, 0x2925, 0x6BA6, 0x6BA6, 0x2928, 0x6BA7, 0x6BA7, 0x2B8B, + 0x6BAA, 0x6BAB, 0x2B8C, 0x6BAD, 0x6BAD, 0x2D8B, 0x6BAE, 0x6BAE, 0x13F1, + 0x6BAF, 0x6BAF, 0x14E6, 0x6BB0, 0x6BB0, 0x30A8, 0x6BB2, 0x6BB2, 0x1679, + 0x6BB3, 0x6BB3, 0x178A, 0x6BB5, 0x6BB5, 0x076C, 0x6BB6, 0x6BB6, 0x1B40, + 0x6BB7, 0x6BB7, 0x0901, 0x6BBA, 0x6BBA, 0x0AE8, 0x6BBC, 0x6BBC, 0x0CA0, + 0x6BBD, 0x6BBD, 0x21BA, 0x6BBF, 0x6BBF, 0x0E4D, 0x6BC0, 0x6BC0, 0x0E4C, + 0x6BC1, 0x6BC1, 0x466C, 0x6BC3, 0x6BC4, 0x26E8, 0x6BC5, 0x6BC6, 0x1187, + 0x6BC7, 0x6BC7, 0x2B8F, 0x6BC8, 0x6BC8, 0x2B8E, 0x6BC9, 0x6BC9, 0x2F40, + 0x6BCA, 0x6BCA, 0x3421, 0x6BCB, 0x6BCB, 0x02E1, 0x6BCC, 0x6BCC, 0x178B, + 0x6BCD, 0x6BCD, 0x034E, 0x6BCF, 0x6BCF, 0x04CA, 0x6BD0, 0x6BD0, 0x18AD, + 0x6BD2, 0x6BD2, 0x076D, 0x6BD3, 0x6BD3, 0x0E4E, 0x6BD4, 0x6BD4, 0x02E2, + 0x6BD6, 0x6BD6, 0x1B41, 0x6BD7, 0x6BD7, 0x076E, 0x6BD8, 0x6BD8, 0x1B42, + 0x6BDA, 0x6BDA, 0x13F2, 0x6BDB, 0x6BDB, 0x02E3, 0x6BDC, 0x6BDC, 0x4207, + 0x6BDE, 0x6BDE, 0x19CC, 0x6BE0, 0x6BE0, 0x1B43, 0x6BE1, 0x6BE1, 0x4205, + 0x6BE2, 0x6BE2, 0x1CF2, 0x6BE3, 0x6BE3, 0x1CF1, 0x6BE4, 0x6BE4, 0x1CEF, + 0x6BE6, 0x6BE6, 0x1CEE, 0x6BE7, 0x6BE7, 0x1CF3, 0x6BE8, 0x6BE8, 0x1CF0, + 0x6BEA, 0x6BEA, 0x466D, 0x6BEB, 0x6BEC, 0x0AE9, 0x6BEF, 0x6BEF, 0x0CA1, + 0x6BF0, 0x6BF0, 0x21BB, 0x6BF2, 0x6BF3, 0x21BC, 0x6BF7, 0x6BF8, 0x244C, + 0x6BF9, 0x6BF9, 0x244B, 0x6BFA, 0x6BFA, 0x3F79, 0x6BFB, 0x6BFC, 0x2449, + 0x6BFD, 0x6BFD, 0x0E4F, 0x6BFE, 0x6BFE, 0x26EA, 0x6BFF, 0x6BFF, 0x292B, + 0x6C00, 0x6C00, 0x292A, 0x6C01, 0x6C01, 0x2929, 0x6C02, 0x6C02, 0x292C, + 0x6C03, 0x6C03, 0x2B91, 0x6C04, 0x6C04, 0x2B90, 0x6C05, 0x6C05, 0x12DE, + 0x6C06, 0x6C06, 0x2B92, 0x6C08, 0x6C08, 0x13F3, 0x6C09, 0x6C09, 0x2D8C, + 0x6C0B, 0x6C0B, 0x2F41, 0x6C0C, 0x6C0C, 0x30A9, 0x6C0D, 0x6C0D, 0x3388, + 0x6C0F, 0x6C0F, 0x02E4, 0x6C10, 0x6C10, 0x0350, 0x6C11, 0x6C11, 0x034F, + 0x6C13, 0x6C13, 0x061E, 0x6C14, 0x6C14, 0x178C, 0x6C15, 0x6C15, 0x17AA, + 0x6C16, 0x6C16, 0x03E6, 0x6C18, 0x6C18, 0x1801, 0x6C19, 0x6C1A, 0x18AE, + 0x6C1B, 0x6C1B, 0x061F, 0x6C1C, 0x6C1C, 0x38AB, 0x6C1D, 0x6C1D, 0x19CD, + 0x6C1F, 0x6C1F, 0x076F, 0x6C20, 0x6C21, 0x1B44, 0x6C23, 0x6C23, 0x0902, + 0x6C24, 0x6C24, 0x0906, 0x6C25, 0x6C25, 0x1CF4, 0x6C26, 0x6C26, 0x0905, + 0x6C27, 0x6C28, 0x0903, 0x6C2A, 0x6C2A, 0x1F44, 0x6C2B, 0x6C2B, 0x0AEB, + 0x6C2C, 0x6C2C, 0x0CA4, 0x6C2E, 0x6C2F, 0x0CA2, 0x6C30, 0x6C30, 0x21BE, + 0x6C31, 0x6C31, 0x3F63, 0x6C33, 0x6C33, 0x1003, 0x6C34, 0x6C34, 0x02E5, + 0x6C35, 0x6C35, 0x44EF, 0x6C36, 0x6C36, 0x17AB, 0x6C37, 0x6C37, 0x4208, + 0x6C38, 0x6C38, 0x0351, 0x6C39, 0x6C39, 0x3E05, 0x6C3A, 0x6C3A, 0x44F0, + 0x6C3B, 0x6C3B, 0x17AE, 0x6C3D, 0x6C3D, 0x4381, 0x6C3E, 0x6C3E, 0x0354, + 0x6C3F, 0x6C3F, 0x17AD, 0x6C40, 0x6C40, 0x0353, 0x6C41, 0x6C41, 0x0352, + 0x6C42, 0x6C42, 0x04CB, 0x6C43, 0x6C43, 0x17AC, 0x6C46, 0x6C46, 0x1802, + 0x6C49, 0x6C49, 0x408D, 0x6C4A, 0x6C4A, 0x1806, 0x6C4B, 0x6C4C, 0x1808, + 0x6C4D, 0x6C4E, 0x03F0, 0x6C4F, 0x6C4F, 0x1805, 0x6C50, 0x6C50, 0x03EC, + 0x6C52, 0x6C52, 0x1803, 0x6C54, 0x6C54, 0x1807, 0x6C55, 0x6C55, 0x03ED, + 0x6C57, 0x6C57, 0x03E8, 0x6C58, 0x6C58, 0x3BBA, 0x6C59, 0x6C59, 0x03E9, + 0x6C5A, 0x6C5A, 0x420C, 0x6C5B, 0x6C5B, 0x03EF, 0x6C5C, 0x6C5C, 0x1804, + 0x6C5D, 0x6C5D, 0x03E7, 0x6C5E, 0x6C5E, 0x04CC, 0x6C5F, 0x6C60, 0x03EA, + 0x6C61, 0x6C61, 0x03EE, 0x6C65, 0x6C65, 0x18C0, 0x6C66, 0x6C66, 0x18BE, + 0x6C67, 0x6C67, 0x18B1, 0x6C68, 0x6C68, 0x04D8, 0x6C69, 0x6C69, 0x18B8, + 0x6C6A, 0x6C6A, 0x04D3, 0x6C6B, 0x6C6B, 0x18B2, 0x6C6D, 0x6C6D, 0x18BA, + 0x6C6E, 0x6C6E, 0x40CA, 0x6C6F, 0x6C6F, 0x18B7, 0x6C70, 0x6C70, 0x04D6, + 0x6C71, 0x6C71, 0x18B6, 0x6C72, 0x6C72, 0x04DD, 0x6C73, 0x6C73, 0x18BF, + 0x6C74, 0x6C74, 0x04DF, 0x6C75, 0x6C75, 0x466E, 0x6C76, 0x6C76, 0x04E1, + 0x6C78, 0x6C78, 0x18B0, 0x6C79, 0x6C79, 0x420E, 0x6C7A, 0x6C7A, 0x04D4, + 0x6C7B, 0x6C7B, 0x18C1, 0x6C7D, 0x6C7D, 0x04DB, 0x6C7E, 0x6C7E, 0x04DE, + 0x6C7F, 0x6C7F, 0x37A6, 0x6C80, 0x6C80, 0x19E4, 0x6C81, 0x6C81, 0x04CE, + 0x6C82, 0x6C82, 0x04E5, 0x6C83, 0x6C83, 0x04DC, 0x6C84, 0x6C84, 0x18B3, + 0x6C85, 0x6C85, 0x04D1, 0x6C86, 0x6C86, 0x04E0, 0x6C87, 0x6C87, 0x18BB, + 0x6C88, 0x6C89, 0x04CF, 0x6C8A, 0x6C8A, 0x19E2, 0x6C8B, 0x6C8B, 0x18B4, + 0x6C8C, 0x6C8C, 0x04D7, 0x6C8D, 0x6C8D, 0x04E2, 0x6C8E, 0x6C8E, 0x18C2, + 0x6C8F, 0x6C8F, 0x18B5, 0x6C90, 0x6C90, 0x04D5, 0x6C92, 0x6C92, 0x04DA, + 0x6C93, 0x6C93, 0x19CE, 0x6C94, 0x6C94, 0x04E3, 0x6C95, 0x6C95, 0x18BC, + 0x6C96, 0x6C96, 0x04D9, 0x6C98, 0x6C98, 0x04E4, 0x6C99, 0x6C99, 0x04CD, + 0x6C9A, 0x6C9A, 0x18B9, 0x6C9B, 0x6C9B, 0x04D2, 0x6C9C, 0x6C9C, 0x18BD, + 0x6C9D, 0x6C9D, 0x19E3, 0x6C9F, 0x6C9F, 0x3889, 0x6CA2, 0x6CA2, 0x3D63, + 0x6CAA, 0x6CAA, 0x466F, 0x6CAB, 0x6CAB, 0x062B, 0x6CAC, 0x6CAC, 0x063B, + 0x6CAD, 0x6CAD, 0x19D5, 0x6CAE, 0x6CAE, 0x0632, 0x6CAF, 0x6CAF, 0x3CF6, + 0x6CB0, 0x6CB0, 0x19EA, 0x6CB1, 0x6CB1, 0x0623, 0x6CB2, 0x6CB2, 0x3ECC, + 0x6CB3, 0x6CB3, 0x0626, 0x6CB4, 0x6CB4, 0x19E1, 0x6CB6, 0x6CB6, 0x19D3, + 0x6CB7, 0x6CB7, 0x19D7, 0x6CB8, 0x6CB8, 0x062E, 0x6CB9, 0x6CB9, 0x0630, + 0x6CBA, 0x6CBA, 0x19DA, 0x6CBB, 0x6CBB, 0x0637, 0x6CBC, 0x6CBC, 0x0629, + 0x6CBD, 0x6CBE, 0x0627, 0x6CBF, 0x6CBF, 0x0636, 0x6CC0, 0x6CC0, 0x19E6, + 0x6CC1, 0x6CC1, 0x0631, 0x6CC2, 0x6CC2, 0x19D9, 0x6CC3, 0x6CC3, 0x19DB, + 0x6CC4, 0x6CC4, 0x062F, 0x6CC5, 0x6CC5, 0x0634, 0x6CC6, 0x6CC6, 0x19DC, + 0x6CC7, 0x6CC7, 0x19E9, 0x6CC9, 0x6CC9, 0x0770, 0x6CCA, 0x6CCA, 0x063A, + 0x6CCB, 0x6CCB, 0x4070, 0x6CCC, 0x6CCC, 0x0624, 0x6CCD, 0x6CCD, 0x19E8, + 0x6CCE, 0x6CCE, 0x3F91, 0x6CCF, 0x6CCF, 0x19EC, 0x6CD0, 0x6CD0, 0x19D8, + 0x6CD1, 0x6CD1, 0x19EE, 0x6CD2, 0x6CD2, 0x19DF, 0x6CD3, 0x6CD3, 0x062D, + 0x6CD4, 0x6CD4, 0x19D4, 0x6CD5, 0x6CD5, 0x062C, 0x6CD6, 0x6CD6, 0x063E, + 0x6CD7, 0x6CD7, 0x0633, 0x6CD9, 0x6CD9, 0x19D2, 0x6CDA, 0x6CDA, 0x1B4E, + 0x6CDB, 0x6CDB, 0x0639, 0x6CDC, 0x6CDC, 0x063D, 0x6CDD, 0x6CDD, 0x19E0, + 0x6CDE, 0x6CDE, 0x19E5, 0x6CDF, 0x6CDF, 0x3D57, 0x6CE0, 0x6CE0, 0x063F, + 0x6CE1, 0x6CE1, 0x0638, 0x6CE2, 0x6CE2, 0x062A, 0x6CE3, 0x6CE3, 0x0620, + 0x6CE5, 0x6CE5, 0x0625, 0x6CE7, 0x6CE7, 0x19D6, 0x6CE8, 0x6CE8, 0x0621, + 0x6CE9, 0x6CE9, 0x19ED, 0x6CEA, 0x6CEA, 0x3F8D, 0x6CEB, 0x6CEB, 0x19D0, + 0x6CEC, 0x6CEC, 0x19CF, 0x6CED, 0x6CED, 0x19DD, 0x6CEE, 0x6CEE, 0x19D1, + 0x6CEF, 0x6CEF, 0x063C, 0x6CF0, 0x6CF0, 0x0907, 0x6CF1, 0x6CF1, 0x0635, + 0x6CF2, 0x6CF2, 0x19DE, 0x6CF3, 0x6CF3, 0x0622, 0x6CF5, 0x6CF5, 0x077F, + 0x6CF9, 0x6CF9, 0x19EB, 0x6D00, 0x6D00, 0x1B55, 0x6D01, 0x6D01, 0x1B58, + 0x6D02, 0x6D02, 0x4671, 0x6D03, 0x6D03, 0x1B5B, 0x6D04, 0x6D04, 0x1B50, + 0x6D05, 0x6D05, 0x3A19, 0x6D06, 0x6D06, 0x4672, 0x6D07, 0x6D07, 0x1B5E, + 0x6D08, 0x6D08, 0x1B61, 0x6D09, 0x6D09, 0x1B63, 0x6D0A, 0x6D0A, 0x1B4D, + 0x6D0B, 0x6D0B, 0x0771, 0x6D0C, 0x6D0C, 0x0776, 0x6D0D, 0x6D0D, 0x1CF9, + 0x6D0E, 0x6D0E, 0x0786, 0x6D0F, 0x6D0F, 0x1B5C, 0x6D10, 0x6D10, 0x1B64, + 0x6D11, 0x6D11, 0x1B54, 0x6D12, 0x6D12, 0x1B4C, 0x6D16, 0x6D16, 0x1D14, + 0x6D17, 0x6D17, 0x0779, 0x6D18, 0x6D18, 0x1B59, 0x6D19, 0x6D19, 0x1B51, + 0x6D1A, 0x6D1A, 0x1B53, 0x6D1B, 0x6D1B, 0x077E, 0x6D1D, 0x6D1D, 0x1B56, + 0x6D1E, 0x6D1E, 0x0778, 0x6D1F, 0x6D1F, 0x1B49, 0x6D20, 0x6D20, 0x1B5F, + 0x6D22, 0x6D22, 0x1B62, 0x6D24, 0x6D24, 0x3AC3, 0x6D25, 0x6D25, 0x0775, + 0x6D26, 0x6D26, 0x4673, 0x6D27, 0x6D27, 0x0781, 0x6D28, 0x6D28, 0x1B46, + 0x6D29, 0x6D29, 0x0783, 0x6D2A, 0x6D2A, 0x0773, 0x6D2B, 0x6D2B, 0x0787, + 0x6D2C, 0x6D2C, 0x1B60, 0x6D2D, 0x6D2D, 0x1B48, 0x6D2E, 0x6D2E, 0x0784, + 0x6D2F, 0x6D2F, 0x1D0E, 0x6D30, 0x6D30, 0x19E7, 0x6D31, 0x6D31, 0x0777, + 0x6D32, 0x6D32, 0x0772, 0x6D33, 0x6D33, 0x1B4F, 0x6D34, 0x6D34, 0x1B47, + 0x6D35, 0x6D35, 0x0785, 0x6D36, 0x6D36, 0x077D, 0x6D37, 0x6D37, 0x1B5A, + 0x6D38, 0x6D38, 0x0782, 0x6D39, 0x6D39, 0x0780, 0x6D3A, 0x6D3A, 0x1B52, + 0x6D3B, 0x6D3B, 0x077A, 0x6D3C, 0x6D3C, 0x1B4A, 0x6D3D, 0x6D3E, 0x077B, + 0x6D3F, 0x6D3F, 0x1B4B, 0x6D40, 0x6D40, 0x1B5D, 0x6D41, 0x6D41, 0x0774, + 0x6D42, 0x6D42, 0x1B57, 0x6D4E, 0x6D4E, 0x4558, 0x6D57, 0x6D57, 0x3CF3, + 0x6D58, 0x6D58, 0x1CFC, 0x6D59, 0x6D59, 0x090F, 0x6D5A, 0x6D5A, 0x0914, + 0x6D5B, 0x6D5B, 0x409C, 0x6D5C, 0x6D5C, 0x4222, 0x6D5E, 0x6D5E, 0x1D05, + 0x6D5F, 0x6D5F, 0x1D0B, 0x6D60, 0x6D60, 0x1D07, 0x6D61, 0x6D61, 0x1CFA, + 0x6D62, 0x6D62, 0x1CFD, 0x6D63, 0x6D64, 0x1CF6, 0x6D65, 0x6D65, 0x091B, + 0x6D66, 0x6D66, 0x090C, 0x6D67, 0x6D67, 0x1D06, 0x6D68, 0x6D68, 0x1D0F, + 0x6D69, 0x6D69, 0x0916, 0x6D6A, 0x6D6A, 0x0908, 0x6D6C, 0x6D6C, 0x0911, + 0x6D6D, 0x6D6D, 0x1CFE, 0x6D6E, 0x6D6E, 0x0913, 0x6D6F, 0x6D6F, 0x1CFF, + 0x6D70, 0x6D70, 0x1D09, 0x6D71, 0x6D71, 0x40F5, 0x6D72, 0x6D72, 0x39D7, + 0x6D74, 0x6D74, 0x0915, 0x6D75, 0x6D75, 0x1D18, 0x6D76, 0x6D76, 0x1CF8, + 0x6D77, 0x6D77, 0x090E, 0x6D78, 0x6D78, 0x090D, 0x6D79, 0x6D79, 0x0919, + 0x6D7A, 0x6D7A, 0x1CF5, 0x6D7B, 0x6D7B, 0x1D16, 0x6D7C, 0x6D7C, 0x1D0A, + 0x6D7D, 0x6D7D, 0x1D17, 0x6D7E, 0x6D7E, 0x1D11, 0x6D7F, 0x6D7F, 0x1D03, + 0x6D80, 0x6D80, 0x1D12, 0x6D81, 0x6D81, 0x4674, 0x6D82, 0x6D82, 0x1D0C, + 0x6D83, 0x6D83, 0x1D15, 0x6D84, 0x6D84, 0x1D13, 0x6D85, 0x6D85, 0x091A, + 0x6D86, 0x6D86, 0x1D04, 0x6D87, 0x6D87, 0x090B, 0x6D88, 0x6D88, 0x090A, + 0x6D89, 0x6D89, 0x0912, 0x6D8A, 0x6D8A, 0x0918, 0x6D8B, 0x6D8B, 0x1D10, + 0x6D8C, 0x6D8C, 0x0917, 0x6D8D, 0x6D8D, 0x1D01, 0x6D8E, 0x6D8E, 0x0AEC, + 0x6D8F, 0x6D8F, 0x3DE8, 0x6D90, 0x6D90, 0x1D19, 0x6D91, 0x6D91, 0x1D00, + 0x6D92, 0x6D92, 0x1CFB, 0x6D93, 0x6D93, 0x0910, 0x6D94, 0x6D94, 0x091C, + 0x6D95, 0x6D95, 0x0909, 0x6D96, 0x6D96, 0x4221, 0x6D97, 0x6D97, 0x1D08, + 0x6D98, 0x6D98, 0x1D0D, 0x6DA4, 0x6DA4, 0x4676, 0x6DA5, 0x6DA5, 0x3AB9, + 0x6DAA, 0x6DAA, 0x0B0E, 0x6DAB, 0x6DAB, 0x1F46, 0x6DAC, 0x6DAC, 0x1F4A, + 0x6DAE, 0x6DAE, 0x0AFB, 0x6DAF, 0x6DAF, 0x0AF9, 0x6DB1, 0x6DB1, 0x4677, + 0x6DB2, 0x6DB2, 0x0AF0, 0x6DB3, 0x6DB3, 0x1F48, 0x6DB4, 0x6DB4, 0x1F47, + 0x6DB5, 0x6DB5, 0x0B04, 0x6DB7, 0x6DB7, 0x1F4D, 0x6DB8, 0x6DB8, 0x0AFE, + 0x6DB9, 0x6DB9, 0x3FFB, 0x6DBA, 0x6DBA, 0x1F5F, 0x6DBB, 0x6DBB, 0x1F6B, + 0x6DBC, 0x6DBC, 0x0AED, 0x6DBD, 0x6DBD, 0x1F5C, 0x6DBE, 0x6DBE, 0x1F55, + 0x6DBF, 0x6DBF, 0x0B10, 0x6DC0, 0x6DC0, 0x1F45, 0x6DC2, 0x6DC2, 0x1F61, + 0x6DC4, 0x6DC4, 0x0B0D, 0x6DC5, 0x6DC5, 0x0B01, 0x6DC6, 0x6DC6, 0x0B0C, + 0x6DC7, 0x6DC7, 0x0AF7, 0x6DC8, 0x6DC8, 0x1F51, 0x6DC9, 0x6DC9, 0x1F63, + 0x6DCA, 0x6DCA, 0x1F5B, 0x6DCB, 0x6DCB, 0x0AF8, 0x6DCC, 0x6DCC, 0x0AF2, + 0x6DCD, 0x6DCD, 0x1F69, 0x6DCF, 0x6DCF, 0x1F62, 0x6DD0, 0x6DD0, 0x1F64, + 0x6DD1, 0x6DD1, 0x0AFA, 0x6DD2, 0x6DD2, 0x0B02, 0x6DD3, 0x6DD3, 0x1F66, + 0x6DD4, 0x6DD4, 0x1F4F, 0x6DD5, 0x6DD5, 0x1F60, 0x6DD6, 0x6DD6, 0x1F54, + 0x6DD7, 0x6DD7, 0x1F68, 0x6DD8, 0x6DD8, 0x0B07, 0x6DD9, 0x6DD9, 0x0AEF, + 0x6DDA, 0x6DDA, 0x0B05, 0x6DDB, 0x6DDB, 0x1F59, 0x6DDC, 0x6DDD, 0x1F57, + 0x6DDE, 0x6DDE, 0x0AFC, 0x6DDF, 0x6DDF, 0x1F53, 0x6DE0, 0x6DE0, 0x1F52, + 0x6DE1, 0x6DE1, 0x0AF1, 0x6DE2, 0x6DE2, 0x1F4C, 0x6DE3, 0x6DE3, 0x1F6A, + 0x6DE4, 0x6DE4, 0x0AF3, 0x6DE5, 0x6DE5, 0x1F56, 0x6DE6, 0x6DE6, 0x0B11, + 0x6DE8, 0x6DE8, 0x0B0B, 0x6DE9, 0x6DE9, 0x1F4B, 0x6DEA, 0x6DEA, 0x0B08, + 0x6DEB, 0x6DEB, 0x0B06, 0x6DEC, 0x6DEC, 0x0B0F, 0x6DED, 0x6DED, 0x1F5D, + 0x6DEE, 0x6DEE, 0x0B0A, 0x6DEF, 0x6DEF, 0x1D02, 0x6DF0, 0x6DF0, 0x1F5E, + 0x6DF1, 0x6DF1, 0x0B09, 0x6DF2, 0x6DF2, 0x1F65, 0x6DF3, 0x6DF3, 0x0AEE, + 0x6DF4, 0x6DF4, 0x1F5A, 0x6DF5, 0x6DF5, 0x0B00, 0x6DF6, 0x6DF6, 0x1F4E, + 0x6DF7, 0x6DF7, 0x0AFF, 0x6DF9, 0x6DF9, 0x0AFD, 0x6DFA, 0x6DFA, 0x0AF5, + 0x6DFB, 0x6DFB, 0x0AF4, 0x6DFC, 0x6DFC, 0x21BF, 0x6DFD, 0x6DFD, 0x1F67, + 0x6E00, 0x6E00, 0x1F50, 0x6E02, 0x6E02, 0x3CFA, 0x6E03, 0x6E03, 0x21D4, + 0x6E04, 0x6E04, 0x3ABE, 0x6E05, 0x6E05, 0x0AF6, 0x6E0A, 0x6E0A, 0x3AC1, + 0x6E0F, 0x6E0F, 0x3CF0, 0x6E15, 0x6E15, 0x4678, 0x6E18, 0x6E18, 0x4679, + 0x6E19, 0x6E19, 0x0CC1, 0x6E1A, 0x6E1A, 0x0B03, 0x6E1B, 0x6E1B, 0x0CAF, + 0x6E1C, 0x6E1C, 0x21CE, 0x6E1D, 0x6E1D, 0x0CBD, 0x6E1F, 0x6E1F, 0x21C2, + 0x6E20, 0x6E20, 0x0CAC, 0x6E21, 0x6E21, 0x0CA8, 0x6E22, 0x6E22, 0x21E0, + 0x6E23, 0x6E23, 0x0CAE, 0x6E24, 0x6E24, 0x0CB2, 0x6E25, 0x6E25, 0x0CAD, + 0x6E26, 0x6E26, 0x0CB6, 0x6E27, 0x6E27, 0x21E4, 0x6E28, 0x6E28, 0x21DB, + 0x6E29, 0x6E29, 0x467A, 0x6E2A, 0x6E2A, 0x4302, 0x6E2B, 0x6E2B, 0x21C9, + 0x6E2C, 0x6E2C, 0x0CBB, 0x6E2D, 0x6E2D, 0x0CB5, 0x6E2E, 0x6E2E, 0x21D5, + 0x6E2F, 0x6E2F, 0x0CA5, 0x6E30, 0x6E30, 0x21E1, 0x6E31, 0x6E31, 0x21DA, + 0x6E32, 0x6E32, 0x0CA9, 0x6E33, 0x6E33, 0x21CF, 0x6E34, 0x6E34, 0x0CB8, + 0x6E35, 0x6E36, 0x21EC, 0x6E38, 0x6E38, 0x0CA6, 0x6E39, 0x6E39, 0x21DF, + 0x6E3A, 0x6E3A, 0x0CBA, 0x6E3B, 0x6E3B, 0x21D3, 0x6E3C, 0x6E3D, 0x21C5, + 0x6E3E, 0x6E3E, 0x0CBE, 0x6E3F, 0x6E3F, 0x21CA, 0x6E40, 0x6E40, 0x21D1, + 0x6E41, 0x6E41, 0x21CB, 0x6E43, 0x6E43, 0x0CBC, 0x6E44, 0x6E44, 0x0CC4, + 0x6E45, 0x6E45, 0x21C7, 0x6E46, 0x6E47, 0x21C0, 0x6E49, 0x6E49, 0x21C3, + 0x6E4A, 0x6E4A, 0x0CAB, 0x6E4B, 0x6E4B, 0x21D0, 0x6E4D, 0x6E4D, 0x0CB9, + 0x6E4E, 0x6E4E, 0x0CC2, 0x6E4F, 0x6E4F, 0x4234, 0x6E50, 0x6E50, 0x41D1, + 0x6E51, 0x6E51, 0x21D2, 0x6E52, 0x6E52, 0x21EA, 0x6E53, 0x6E53, 0x21E2, + 0x6E54, 0x6E54, 0x0CA7, 0x6E55, 0x6E55, 0x21E8, 0x6E56, 0x6E56, 0x0CB3, + 0x6E58, 0x6E58, 0x0CB1, 0x6E59, 0x6E59, 0x40E6, 0x6E5A, 0x6E5A, 0x21EE, + 0x6E5B, 0x6E5B, 0x0CB0, 0x6E5C, 0x6E5C, 0x21D8, 0x6E5D, 0x6E5D, 0x21CC, + 0x6E5E, 0x6E5E, 0x21D6, 0x6E5F, 0x6E5F, 0x0CC7, 0x6E60, 0x6E60, 0x21DC, + 0x6E61, 0x6E61, 0x21D9, 0x6E62, 0x6E62, 0x21C8, 0x6E63, 0x6E63, 0x0CC3, + 0x6E64, 0x6E64, 0x21E6, 0x6E65, 0x6E65, 0x21E3, 0x6E66, 0x6E66, 0x21EB, + 0x6E67, 0x6E67, 0x0CAA, 0x6E68, 0x6E68, 0x21D7, 0x6E69, 0x6E69, 0x0CC6, + 0x6E6B, 0x6E6B, 0x21DE, 0x6E6E, 0x6E6E, 0x0CB4, 0x6E6F, 0x6E6F, 0x0CB7, + 0x6E71, 0x6E71, 0x21DD, 0x6E72, 0x6E72, 0x0CC5, 0x6E73, 0x6E73, 0x21CD, + 0x6E74, 0x6E74, 0x1F49, 0x6E76, 0x6E76, 0x39D3, 0x6E77, 0x6E77, 0x21E7, + 0x6E78, 0x6E78, 0x21E5, 0x6E79, 0x6E79, 0x21E9, 0x6E7C, 0x6E7C, 0x4223, + 0x6E86, 0x6E86, 0x467B, 0x6E88, 0x6E88, 0x21C4, 0x6E89, 0x6E89, 0x0CC0, + 0x6E8B, 0x6E8B, 0x3BBF, 0x6E8D, 0x6E8D, 0x246C, 0x6E8E, 0x6E8E, 0x246B, + 0x6E8F, 0x6E8F, 0x2451, 0x6E90, 0x6E90, 0x0E55, 0x6E92, 0x6E92, 0x246A, + 0x6E93, 0x6E94, 0x2454, 0x6E96, 0x6E96, 0x0E5F, 0x6E97, 0x6E97, 0x2473, + 0x6E98, 0x6E98, 0x0E5A, 0x6E99, 0x6E99, 0x2469, 0x6E9A, 0x6E9A, 0x4581, + 0x6E9B, 0x6E9B, 0x244E, 0x6E9C, 0x6E9C, 0x0E60, 0x6E9D, 0x6E9D, 0x0E56, + 0x6E9E, 0x6E9E, 0x245D, 0x6E9F, 0x6E9F, 0x2453, 0x6EA0, 0x6EA0, 0x2456, + 0x6EA1, 0x6EA1, 0x246E, 0x6EA2, 0x6EA2, 0x0E50, 0x6EA3, 0x6EA3, 0x2475, + 0x6EA4, 0x6EA4, 0x246D, 0x6EA5, 0x6EA5, 0x0E59, 0x6EA6, 0x6EA6, 0x2462, + 0x6EA7, 0x6EA7, 0x0E64, 0x6EAA, 0x6EAA, 0x0E63, 0x6EAB, 0x6EAB, 0x0E5D, + 0x6EAE, 0x6EAE, 0x2474, 0x6EAF, 0x6EAF, 0x0E51, 0x6EB0, 0x6EB0, 0x2460, + 0x6EB1, 0x6EB1, 0x2457, 0x6EB2, 0x6EB2, 0x2464, 0x6EB3, 0x6EB3, 0x2470, + 0x6EB4, 0x6EB4, 0x0E65, 0x6EB5, 0x6EB5, 0x41FE, 0x6EB6, 0x6EB6, 0x0E53, + 0x6EB7, 0x6EB7, 0x245F, 0x6EB8, 0x6EB8, 0x3E0C, 0x6EB9, 0x6EB9, 0x2458, + 0x6EBA, 0x6EBA, 0x0E5C, 0x6EBB, 0x6EBB, 0x467D, 0x6EBC, 0x6EBC, 0x0E5B, + 0x6EBD, 0x6EBD, 0x245B, 0x6EBE, 0x6EBE, 0x2465, 0x6EBF, 0x6EBF, 0x246F, + 0x6EC0, 0x6EC0, 0x2452, 0x6EC1, 0x6EC1, 0x245C, 0x6EC2, 0x6EC2, 0x0E54, + 0x6EC3, 0x6EC3, 0x2466, 0x6EC4, 0x6EC4, 0x0E61, 0x6EC5, 0x6EC5, 0x0E58, + 0x6EC6, 0x6EC6, 0x2459, 0x6EC7, 0x6EC7, 0x0E57, 0x6EC8, 0x6EC8, 0x2450, + 0x6EC9, 0x6EC9, 0x245E, 0x6ECA, 0x6ECA, 0x2472, 0x6ECB, 0x6ECB, 0x0CBF, + 0x6ECC, 0x6ECC, 0x101F, 0x6ECD, 0x6ECD, 0x2461, 0x6ECE, 0x6ECE, 0x26EB, + 0x6ECF, 0x6ECF, 0x2463, 0x6ED0, 0x6ED0, 0x2471, 0x6ED1, 0x6ED1, 0x0E5E, + 0x6ED2, 0x6ED2, 0x245A, 0x6ED3, 0x6ED3, 0x0E52, 0x6ED4, 0x6ED4, 0x0E62, + 0x6ED5, 0x6ED5, 0x119A, 0x6ED6, 0x6ED6, 0x244F, 0x6ED8, 0x6ED8, 0x2468, + 0x6ED9, 0x6ED9, 0x4069, 0x6EDA, 0x6EDA, 0x467F, 0x6EDB, 0x6EDB, 0x402F, + 0x6EDC, 0x6EDC, 0x2467, 0x6EDD, 0x6EDD, 0x4538, 0x6EE2, 0x6EE2, 0x467E, + 0x6EE8, 0x6EE9, 0x4681, 0x6EEB, 0x6EEB, 0x2707, 0x6EEC, 0x6EEC, 0x101C, + 0x6EED, 0x6EED, 0x26FC, 0x6EEE, 0x6EEE, 0x2701, 0x6EEF, 0x6EEF, 0x1011, + 0x6EF1, 0x6EF1, 0x26ED, 0x6EF2, 0x6EF2, 0x101E, 0x6EF4, 0x6EF4, 0x1008, + 0x6EF5, 0x6EF5, 0x26EC, 0x6EF6, 0x6EF6, 0x270D, 0x6EF7, 0x6EF7, 0x1020, + 0x6EF8, 0x6EF8, 0x26F0, 0x6EF9, 0x6EF9, 0x2700, 0x6EFA, 0x6EFA, 0x423B, + 0x6EFB, 0x6EFB, 0x26F2, 0x6EFC, 0x6EFC, 0x2710, 0x6EFD, 0x6EFD, 0x270C, + 0x6EFE, 0x6EFE, 0x1006, 0x6EFF, 0x6EFF, 0x1010, 0x6F00, 0x6F00, 0x2946, + 0x6F01, 0x6F01, 0x101D, 0x6F02, 0x6F02, 0x100E, 0x6F03, 0x6F03, 0x26EE, + 0x6F04, 0x6F04, 0x4224, 0x6F05, 0x6F05, 0x270B, 0x6F06, 0x6F06, 0x1012, + 0x6F07, 0x6F07, 0x2708, 0x6F08, 0x6F08, 0x2715, 0x6F09, 0x6F09, 0x26F4, + 0x6F0A, 0x6F0A, 0x26FD, 0x6F0B, 0x6F0B, 0x3ABA, 0x6F0C, 0x6F0C, 0x3CFB, + 0x6F0D, 0x6F0D, 0x2713, 0x6F0E, 0x6F0E, 0x2709, 0x6F0F, 0x6F0F, 0x100D, + 0x6F12, 0x6F12, 0x26FB, 0x6F13, 0x6F13, 0x1007, 0x6F14, 0x6F14, 0x1005, + 0x6F15, 0x6F15, 0x1017, 0x6F16, 0x6F16, 0x41A0, 0x6F17, 0x6F17, 0x46CE, + 0x6F18, 0x6F18, 0x26F9, 0x6F19, 0x6F1A, 0x26F6, 0x6F1C, 0x6F1C, 0x270F, + 0x6F1E, 0x6F1E, 0x2714, 0x6F1F, 0x6F1F, 0x2712, 0x6F20, 0x6F20, 0x100B, + 0x6F21, 0x6F21, 0x2716, 0x6F22, 0x6F22, 0x100F, 0x6F23, 0x6F23, 0x1016, + 0x6F24, 0x6F24, 0x4683, 0x6F25, 0x6F25, 0x26EF, 0x6F26, 0x6F26, 0x292E, + 0x6F27, 0x6F27, 0x26F8, 0x6F29, 0x6F29, 0x1009, 0x6F2A, 0x6F2A, 0x101B, + 0x6F2B, 0x6F2B, 0x1018, 0x6F2C, 0x6F2C, 0x100C, 0x6F2D, 0x6F2D, 0x2702, + 0x6F2E, 0x6F2E, 0x26F3, 0x6F2F, 0x6F2F, 0x1019, 0x6F30, 0x6F30, 0x2704, + 0x6F31, 0x6F31, 0x1013, 0x6F32, 0x6F32, 0x1015, 0x6F33, 0x6F33, 0x1004, + 0x6F34, 0x6F34, 0x4684, 0x6F35, 0x6F35, 0x2706, 0x6F36, 0x6F36, 0x26FE, + 0x6F37, 0x6F37, 0x26F1, 0x6F38, 0x6F38, 0x1014, 0x6F39, 0x6F39, 0x270E, + 0x6F3A, 0x6F3A, 0x2711, 0x6F3B, 0x6F3B, 0x26FA, 0x6F3C, 0x6F3C, 0x2705, + 0x6F3D, 0x6F3D, 0x4282, 0x6F3E, 0x6F3E, 0x100A, 0x6F3F, 0x6F3F, 0x1189, + 0x6F40, 0x6F40, 0x2703, 0x6F41, 0x6F41, 0x292D, 0x6F43, 0x6F43, 0x270A, + 0x6F44, 0x6F44, 0x4240, 0x6F4E, 0x6F4E, 0x26F5, 0x6F4F, 0x6F4F, 0x2937, + 0x6F50, 0x6F50, 0x2941, 0x6F51, 0x6F51, 0x118C, 0x6F52, 0x6F52, 0x2940, + 0x6F53, 0x6F53, 0x294C, 0x6F54, 0x6F54, 0x118E, 0x6F55, 0x6F55, 0x293E, + 0x6F56, 0x6F56, 0x3E52, 0x6F57, 0x6F57, 0x2942, 0x6F58, 0x6F58, 0x1199, + 0x6F5A, 0x6F5A, 0x2939, 0x6F5B, 0x6F5B, 0x1191, 0x6F5C, 0x6F5C, 0x4241, + 0x6F5D, 0x6F5D, 0x2945, 0x6F5E, 0x6F5E, 0x2B9A, 0x6F5F, 0x6F5F, 0x119D, + 0x6F60, 0x6F60, 0x119C, 0x6F61, 0x6F61, 0x2947, 0x6F62, 0x6F62, 0x2936, + 0x6F63, 0x6F63, 0x2951, 0x6F64, 0x6F64, 0x1197, 0x6F66, 0x6F66, 0x118D, + 0x6F67, 0x6F67, 0x294A, 0x6F69, 0x6F69, 0x294E, 0x6F6A, 0x6F6A, 0x2953, + 0x6F6B, 0x6F6B, 0x2948, 0x6F6C, 0x6F6C, 0x293C, 0x6F6D, 0x6F6D, 0x1190, + 0x6F6E, 0x6F6E, 0x1193, 0x6F6F, 0x6F6F, 0x119B, 0x6F70, 0x6F70, 0x1196, + 0x6F72, 0x6F72, 0x293F, 0x6F73, 0x6F73, 0x26FF, 0x6F74, 0x6F74, 0x4243, + 0x6F76, 0x6F76, 0x293B, 0x6F77, 0x6F77, 0x2952, 0x6F78, 0x6F78, 0x1192, + 0x6F79, 0x6F79, 0x3BBE, 0x6F7A, 0x6F7A, 0x1195, 0x6F7B, 0x6F7B, 0x2954, + 0x6F7C, 0x6F7C, 0x118A, 0x6F7D, 0x6F7D, 0x2949, 0x6F7E, 0x6F7E, 0x292F, + 0x6F7F, 0x6F7F, 0x294F, 0x6F80, 0x6F80, 0x13FC, 0x6F81, 0x6F81, 0x4687, + 0x6F82, 0x6F82, 0x293D, 0x6F84, 0x6F84, 0x118B, 0x6F85, 0x6F85, 0x2938, + 0x6F86, 0x6F86, 0x118F, 0x6F87, 0x6F87, 0x2930, 0x6F88, 0x6F88, 0x101A, + 0x6F89, 0x6F89, 0x2934, 0x6F8A, 0x6F8A, 0x4195, 0x6F8B, 0x6F8B, 0x294D, + 0x6F8C, 0x6F8C, 0x2935, 0x6F8D, 0x6F8D, 0x2933, 0x6F8E, 0x6F8E, 0x1194, + 0x6F90, 0x6F90, 0x294B, 0x6F92, 0x6F92, 0x2932, 0x6F93, 0x6F93, 0x2944, + 0x6F94, 0x6F94, 0x2943, 0x6F95, 0x6F95, 0x2950, 0x6F96, 0x6F96, 0x293A, + 0x6F97, 0x6F97, 0x1198, 0x6F9D, 0x6F9D, 0x4239, 0x6F9E, 0x6F9E, 0x2B9D, + 0x6F9F, 0x6F9F, 0x4246, 0x6FA0, 0x6FA0, 0x12EB, 0x6FA1, 0x6FA1, 0x12E1, + 0x6FA2, 0x6FA2, 0x2BA9, 0x6FA3, 0x6FA3, 0x2B95, 0x6FA4, 0x6FA4, 0x12E3, + 0x6FA5, 0x6FA5, 0x2BA1, 0x6FA6, 0x6FA6, 0x12EA, 0x6FA7, 0x6FA7, 0x12E5, + 0x6FA8, 0x6FA8, 0x2B9F, 0x6FA9, 0x6FA9, 0x2D8E, 0x6FAA, 0x6FAA, 0x2BA5, + 0x6FAB, 0x6FAB, 0x2BAB, 0x6FAC, 0x6FAC, 0x2BA4, 0x6FAD, 0x6FAD, 0x2B93, + 0x6FAE, 0x6FAE, 0x2BA2, 0x6FAF, 0x6FAF, 0x2BAD, 0x6FB0, 0x6FB0, 0x2BAF, + 0x6FB1, 0x6FB1, 0x12E0, 0x6FB2, 0x6FB2, 0x2BAE, 0x6FB3, 0x6FB3, 0x12E6, + 0x6FB4, 0x6FB4, 0x12EC, 0x6FB5, 0x6FB5, 0x3E27, 0x6FB6, 0x6FB6, 0x12E9, + 0x6FB8, 0x6FB8, 0x2BA8, 0x6FB9, 0x6FB9, 0x12E8, 0x6FBA, 0x6FBA, 0x2BA3, + 0x6FBB, 0x6FBB, 0x3BBB, 0x6FBC, 0x6FBC, 0x2B97, 0x6FBD, 0x6FBD, 0x2B9C, + 0x6FBE, 0x6FBE, 0x4688, 0x6FBF, 0x6FBF, 0x2BA7, 0x6FC0, 0x6FC0, 0x12E7, + 0x6FC1, 0x6FC1, 0x12E4, 0x6FC2, 0x6FC2, 0x12DF, 0x6FC3, 0x6FC3, 0x12E2, + 0x6FC4, 0x6FC4, 0x2B9B, 0x6FC6, 0x6FC6, 0x2931, 0x6FC7, 0x6FC7, 0x2B96, + 0x6FC8, 0x6FC8, 0x2B99, 0x6FC9, 0x6FC9, 0x2BAA, 0x6FCA, 0x6FCA, 0x2B9E, + 0x6FCB, 0x6FCB, 0x2B94, 0x6FCC, 0x6FCC, 0x2D8D, 0x6FCD, 0x6FCD, 0x2BAC, + 0x6FCE, 0x6FCE, 0x2B98, 0x6FCF, 0x6FCF, 0x2BA6, 0x6FD3, 0x6FD3, 0x4248, + 0x6FD4, 0x6FD4, 0x2D90, 0x6FD5, 0x6FD5, 0x1400, 0x6FD8, 0x6FD8, 0x13F4, + 0x6FD9, 0x6FD9, 0x3C74, 0x6FDA, 0x6FDA, 0x3C73, 0x6FDB, 0x6FDB, 0x13F8, + 0x6FDC, 0x6FDC, 0x2D92, 0x6FDD, 0x6FDD, 0x2D98, 0x6FDE, 0x6FDE, 0x2D96, + 0x6FDF, 0x6FE0, 0x13F6, 0x6FE1, 0x6FE1, 0x13FE, 0x6FE2, 0x6FE2, 0x2D99, + 0x6FE3, 0x6FE3, 0x2D91, 0x6FE4, 0x6FE4, 0x13F9, 0x6FE6, 0x6FE6, 0x2D95, + 0x6FE7, 0x6FE7, 0x2D94, 0x6FE8, 0x6FE8, 0x2D9A, 0x6FE9, 0x6FE9, 0x13FF, + 0x6FEB, 0x6FEB, 0x13FA, 0x6FEC, 0x6FEC, 0x13FD, 0x6FED, 0x6FED, 0x2D93, + 0x6FEE, 0x6FEE, 0x1401, 0x6FEF, 0x6FEF, 0x13FB, 0x6FF0, 0x6FF0, 0x1402, + 0x6FF1, 0x6FF1, 0x13F5, 0x6FF2, 0x6FF2, 0x2D97, 0x6FF4, 0x6FF4, 0x2D8F, + 0x6FF6, 0x6FF6, 0x38A5, 0x6FF7, 0x6FF7, 0x2F4E, 0x6FF8, 0x6FF8, 0x4237, + 0x6FFA, 0x6FFA, 0x14EB, 0x6FFB, 0x6FFB, 0x2F4B, 0x6FFC, 0x6FFC, 0x2F4D, + 0x6FFE, 0x6FFE, 0x14E9, 0x6FFF, 0x6FFF, 0x2F49, 0x7000, 0x7000, 0x2F4A, + 0x7001, 0x7001, 0x2F45, 0x7003, 0x7003, 0x46E2, 0x7004, 0x7004, 0x2BA0, + 0x7005, 0x7005, 0x2F46, 0x7006, 0x7006, 0x14EA, 0x7007, 0x7007, 0x2F42, + 0x7009, 0x7009, 0x14E7, 0x700A, 0x700A, 0x2F4F, 0x700B, 0x700B, 0x14E8, + 0x700C, 0x700D, 0x2F43, 0x700E, 0x700E, 0x2F48, 0x700F, 0x700F, 0x14ED, + 0x7011, 0x7011, 0x14EC, 0x7014, 0x7014, 0x2F47, 0x7015, 0x7015, 0x158F, + 0x7016, 0x7016, 0x30AD, 0x7017, 0x7017, 0x30B3, 0x7018, 0x7018, 0x1590, + 0x7019, 0x7019, 0x30AA, 0x701A, 0x701A, 0x158D, 0x701B, 0x701B, 0x158A, + 0x701C, 0x701C, 0x30B5, 0x701D, 0x701D, 0x158E, 0x701E, 0x701E, 0x3C76, + 0x701F, 0x701F, 0x158B, 0x7020, 0x7020, 0x30AC, 0x7021, 0x7023, 0x30AF, + 0x7024, 0x7024, 0x30B4, 0x7026, 0x7026, 0x2F4C, 0x7027, 0x7027, 0x30AB, + 0x7028, 0x7028, 0x158C, 0x7029, 0x7029, 0x30B2, 0x702A, 0x702A, 0x31EF, + 0x702B, 0x702B, 0x30AE, 0x702C, 0x702C, 0x468E, 0x702F, 0x702F, 0x31E6, + 0x7030, 0x7030, 0x161D, 0x7031, 0x7031, 0x31E9, 0x7032, 0x7032, 0x161E, + 0x7033, 0x7033, 0x31F2, 0x7034, 0x7034, 0x31E8, 0x7035, 0x7035, 0x31E5, + 0x7037, 0x7037, 0x31E7, 0x7038, 0x7038, 0x31EB, 0x7039, 0x7039, 0x31EE, + 0x703A, 0x703A, 0x31ED, 0x703B, 0x703B, 0x31F1, 0x703C, 0x703C, 0x31E4, + 0x703E, 0x703E, 0x161C, 0x703F, 0x703F, 0x31EC, 0x7040, 0x7040, 0x31F0, + 0x7041, 0x7041, 0x31F3, 0x7042, 0x7042, 0x31EA, 0x7043, 0x7044, 0x32D8, + 0x7045, 0x7046, 0x32DD, 0x7048, 0x7049, 0x32DB, 0x704A, 0x704A, 0x32DA, + 0x704B, 0x704B, 0x4254, 0x704C, 0x704C, 0x167A, 0x7050, 0x7050, 0x4690, + 0x7051, 0x7051, 0x16C8, 0x7052, 0x7052, 0x338C, 0x7054, 0x7054, 0x4691, + 0x7055, 0x7057, 0x3389, 0x7058, 0x7058, 0x16C9, 0x705A, 0x705A, 0x3423, + 0x705B, 0x705B, 0x3422, 0x705C, 0x705C, 0x3852, 0x705D, 0x705D, 0x348A, + 0x705E, 0x705E, 0x1722, 0x705F, 0x705F, 0x3488, 0x7060, 0x7060, 0x348B, + 0x7061, 0x7061, 0x3489, 0x7062, 0x7062, 0x34D0, 0x7063, 0x7063, 0x1744, + 0x7064, 0x7064, 0x1752, 0x7065, 0x7065, 0x351C, 0x7066, 0x7066, 0x3506, + 0x7067, 0x7067, 0x3CF5, 0x7068, 0x7068, 0x351B, 0x7069, 0x706A, 0x3547, + 0x706B, 0x706B, 0x02E6, 0x706C, 0x706C, 0x44F1, 0x706F, 0x706F, 0x4692, + 0x7070, 0x7070, 0x03F2, 0x7071, 0x7071, 0x180A, 0x7074, 0x7074, 0x18C3, + 0x7075, 0x7075, 0x38C7, 0x7076, 0x7076, 0x04E6, 0x7078, 0x7078, 0x04E9, + 0x7079, 0x7079, 0x4099, 0x707A, 0x707A, 0x18C4, 0x707C, 0x707D, 0x04E7, + 0x707E, 0x707E, 0x4255, 0x707F, 0x707F, 0x4693, 0x7081, 0x7081, 0x4959, + 0x7082, 0x7082, 0x19F7, 0x7083, 0x7083, 0x19F9, 0x7084, 0x7084, 0x19F4, + 0x7085, 0x7085, 0x19F1, 0x7086, 0x7086, 0x19F3, 0x7089, 0x7089, 0x43F9, + 0x708A, 0x708A, 0x0643, 0x708B, 0x708B, 0x40CB, 0x708E, 0x708E, 0x0641, + 0x708F, 0x708F, 0x46B3, 0x7091, 0x7091, 0x19F5, 0x7092, 0x7092, 0x0642, + 0x7093, 0x7093, 0x19F2, 0x7094, 0x7094, 0x19EF, 0x7095, 0x7095, 0x0640, + 0x7096, 0x7096, 0x19F6, 0x7098, 0x7098, 0x19F0, 0x7099, 0x7099, 0x0644, + 0x709A, 0x709A, 0x19F8, 0x709F, 0x709F, 0x1B66, 0x70A0, 0x70A0, 0x4742, + 0x70A1, 0x70A1, 0x1B6A, 0x70A3, 0x70A3, 0x3972, 0x70A4, 0x70A4, 0x0790, + 0x70A5, 0x70A5, 0x3CB7, 0x70A6, 0x70A6, 0x3D53, 0x70A7, 0x70A7, 0x4256, + 0x70A9, 0x70A9, 0x1B6D, 0x70AB, 0x70AB, 0x0788, 0x70AC, 0x70AC, 0x078B, + 0x70AD, 0x70AD, 0x078D, 0x70AE, 0x70AE, 0x078F, 0x70AF, 0x70AF, 0x078C, + 0x70B0, 0x70B0, 0x1B69, 0x70B1, 0x70B1, 0x1B68, 0x70B3, 0x70B3, 0x078A, + 0x70B4, 0x70B5, 0x1B6B, 0x70B7, 0x70B7, 0x1B65, 0x70B8, 0x70B8, 0x078E, + 0x70B9, 0x70B9, 0x3D69, 0x70BA, 0x70BA, 0x0789, 0x70BB, 0x70BB, 0x4812, + 0x70BC, 0x70BC, 0x4559, 0x70BD, 0x70BD, 0x4270, 0x70BE, 0x70BE, 0x1B67, + 0x70C0, 0x70C0, 0x4733, 0x70C4, 0x70C4, 0x3BAA, 0x70C5, 0x70C7, 0x1D27, + 0x70C8, 0x70C8, 0x0921, 0x70CA, 0x70CA, 0x091D, 0x70CB, 0x70CB, 0x1D1E, + 0x70CC, 0x70CC, 0x4258, 0x70CD, 0x70CD, 0x1D26, 0x70CE, 0x70CE, 0x1D2B, + 0x70CF, 0x70CF, 0x0922, 0x70D0, 0x70D0, 0x396D, 0x70D1, 0x70D1, 0x1D1C, + 0x70D2, 0x70D2, 0x1D22, 0x70D3, 0x70D3, 0x1D1B, 0x70D4, 0x70D4, 0x1D25, + 0x70D5, 0x70D6, 0x4259, 0x70D7, 0x70D7, 0x1D21, 0x70D8, 0x70D8, 0x091E, + 0x70D9, 0x70D9, 0x0920, 0x70DA, 0x70DA, 0x1D2A, 0x70DC, 0x70DC, 0x1D1A, + 0x70DD, 0x70DD, 0x1D1D, 0x70DE, 0x70DE, 0x1D23, 0x70DF, 0x70DF, 0x425B, + 0x70E0, 0x70E0, 0x1D24, 0x70E1, 0x70E1, 0x1D2C, 0x70E2, 0x70E2, 0x1D20, + 0x70E4, 0x70E4, 0x091F, 0x70EF, 0x70EF, 0x0B16, 0x70F0, 0x70F0, 0x1F72, + 0x70F1, 0x70F1, 0x3AC8, 0x70F3, 0x70F3, 0x1F74, 0x70F4, 0x70F4, 0x1F70, + 0x70F5, 0x70F5, 0x4760, 0x70F6, 0x70F6, 0x1F7C, 0x70F7, 0x70F7, 0x1F6E, + 0x70F8, 0x70F8, 0x1F7B, 0x70F9, 0x70F9, 0x0B12, 0x70FA, 0x70FA, 0x1F6C, + 0x70FB, 0x70FB, 0x21F2, 0x70FC, 0x70FC, 0x1F76, 0x70FD, 0x70FD, 0x0B15, + 0x70FE, 0x70FE, 0x3D0E, 0x70FF, 0x70FF, 0x1F77, 0x7100, 0x7100, 0x1F7A, + 0x7102, 0x7102, 0x1F7E, 0x7104, 0x7104, 0x1F73, 0x7105, 0x7105, 0x3A23, + 0x7106, 0x7106, 0x1F78, 0x7109, 0x710A, 0x0B13, 0x710B, 0x710B, 0x1F7D, + 0x710C, 0x710C, 0x1F71, 0x710D, 0x710D, 0x1F6D, 0x710E, 0x710E, 0x1F7F, + 0x7110, 0x7110, 0x1F75, 0x7113, 0x7113, 0x1F79, 0x7117, 0x7117, 0x1F6F, + 0x7119, 0x711A, 0x0CC8, 0x711B, 0x711B, 0x21FC, 0x711C, 0x711C, 0x0CCF, + 0x711D, 0x711D, 0x3D47, 0x711E, 0x711E, 0x21F0, 0x711F, 0x711F, 0x21F9, + 0x7120, 0x7120, 0x21EF, 0x7121, 0x7121, 0x0CCC, 0x7122, 0x7122, 0x21F7, + 0x7123, 0x7123, 0x21F5, 0x7125, 0x7125, 0x21F6, 0x7126, 0x7126, 0x0CCA, + 0x7128, 0x7128, 0x21FA, 0x7129, 0x7129, 0x3BA9, 0x712B, 0x712B, 0x4261, + 0x712C, 0x712C, 0x426A, 0x712E, 0x712E, 0x21F3, 0x712F, 0x712F, 0x21F1, + 0x7130, 0x7130, 0x0CCB, 0x7131, 0x7131, 0x21F4, 0x7132, 0x7132, 0x21F8, + 0x7133, 0x7133, 0x3D54, 0x7134, 0x7134, 0x3C7E, 0x7135, 0x7135, 0x376D, + 0x7136, 0x7136, 0x0CCD, 0x713A, 0x713A, 0x21FB, 0x713B, 0x713B, 0x3AC5, + 0x713E, 0x713E, 0x372E, 0x7140, 0x7140, 0x4398, 0x7141, 0x7141, 0x247B, + 0x7142, 0x7142, 0x2482, 0x7143, 0x7143, 0x2484, 0x7144, 0x7144, 0x248A, + 0x7145, 0x7145, 0x4262, 0x7146, 0x7146, 0x0E72, 0x7147, 0x7147, 0x2476, + 0x7149, 0x7149, 0x0E6A, 0x714A, 0x714A, 0x4264, 0x714B, 0x714B, 0x2485, + 0x714C, 0x714C, 0x0E6F, 0x714D, 0x714D, 0x248B, 0x714E, 0x714E, 0x0E66, + 0x714F, 0x714F, 0x4267, 0x7150, 0x7150, 0x2488, 0x7151, 0x7151, 0x4865, + 0x7152, 0x7152, 0x2478, 0x7153, 0x7153, 0x2489, 0x7154, 0x7154, 0x2477, + 0x7156, 0x7156, 0x0E74, 0x7158, 0x7158, 0x2483, 0x7159, 0x7159, 0x0E67, + 0x715A, 0x715A, 0x248C, 0x715C, 0x715C, 0x0E6C, 0x715D, 0x715D, 0x247C, + 0x715E, 0x715E, 0x0E71, 0x715F, 0x715F, 0x2487, 0x7160, 0x7160, 0x247A, + 0x7161, 0x7161, 0x2481, 0x7162, 0x7162, 0x247D, 0x7163, 0x7163, 0x2479, + 0x7164, 0x7164, 0x0E69, 0x7165, 0x7165, 0x0E70, 0x7166, 0x7166, 0x0E6E, + 0x7167, 0x7167, 0x0E6B, 0x7168, 0x7168, 0x0E73, 0x7169, 0x7169, 0x0E68, + 0x716A, 0x716A, 0x2480, 0x716B, 0x716B, 0x3CC5, 0x716C, 0x716C, 0x0E6D, + 0x716E, 0x716E, 0x0CCE, 0x7170, 0x7170, 0x2486, 0x7171, 0x7171, 0x3DC0, + 0x7172, 0x7172, 0x247E, 0x7173, 0x7173, 0x47E7, 0x7175, 0x7175, 0x3CED, + 0x7176, 0x7176, 0x4000, 0x7177, 0x7177, 0x3957, 0x7178, 0x7178, 0x247F, + 0x717A, 0x717A, 0x4924, 0x717B, 0x717B, 0x271E, 0x717C, 0x717C, 0x3835, + 0x717D, 0x717D, 0x1023, 0x717E, 0x717E, 0x3970, 0x7180, 0x7180, 0x271A, + 0x7181, 0x7181, 0x2720, 0x7182, 0x7182, 0x271C, 0x7184, 0x7184, 0x1025, + 0x7185, 0x7185, 0x271B, 0x7186, 0x7186, 0x271F, 0x7187, 0x7187, 0x2717, + 0x7188, 0x7188, 0x4706, 0x7189, 0x7189, 0x2719, 0x718A, 0x718A, 0x1024, + 0x718C, 0x718C, 0x39EA, 0x718E, 0x718E, 0x3D3B, 0x718F, 0x718F, 0x271D, + 0x7190, 0x7190, 0x2718, 0x7192, 0x7192, 0x1026, 0x7194, 0x7194, 0x1021, + 0x7196, 0x7196, 0x425F, 0x7197, 0x7197, 0x2721, 0x7198, 0x7198, 0x481D, + 0x7199, 0x7199, 0x1022, 0x719A, 0x719A, 0x295A, 0x719B, 0x719B, 0x2957, + 0x719C, 0x719C, 0x2963, 0x719D, 0x719D, 0x295D, 0x719E, 0x719E, 0x295F, + 0x719F, 0x719F, 0x119E, 0x71A0, 0x71A0, 0x2959, 0x71A1, 0x71A1, 0x2961, + 0x71A2, 0x71A2, 0x48C1, 0x71A3, 0x71A3, 0x3EC8, 0x71A4, 0x71A4, 0x2960, + 0x71A5, 0x71A5, 0x295E, 0x71A7, 0x71A7, 0x2964, 0x71A8, 0x71A8, 0x11A1, + 0x71A9, 0x71A9, 0x295B, 0x71AA, 0x71AA, 0x2962, 0x71AC, 0x71AC, 0x119F, + 0x71AD, 0x71AD, 0x3E1D, 0x71AF, 0x71AF, 0x2956, 0x71B0, 0x71B0, 0x2958, + 0x71B1, 0x71B1, 0x11A0, 0x71B2, 0x71B2, 0x2955, 0x71B3, 0x71B3, 0x2965, + 0x71B4, 0x71B4, 0x425E, 0x71B5, 0x71B5, 0x295C, 0x71B7, 0x71B7, 0x468B, + 0x71B8, 0x71B8, 0x2BB3, 0x71B9, 0x71B9, 0x12F3, 0x71BA, 0x71BA, 0x426E, + 0x71BC, 0x71BC, 0x2BBE, 0x71BD, 0x71BD, 0x2BBC, 0x71BE, 0x71BE, 0x12ED, + 0x71BF, 0x71BF, 0x2BB2, 0x71C0, 0x71C1, 0x2BB5, 0x71C2, 0x71C2, 0x2BB1, + 0x71C3, 0x71C4, 0x12F7, 0x71C5, 0x71C5, 0x2BB0, 0x71C6, 0x71C6, 0x2BBF, + 0x71C7, 0x71C7, 0x2BBA, 0x71C8, 0x71C8, 0x12F1, 0x71C9, 0x71C9, 0x12EE, + 0x71CA, 0x71CA, 0x2BB9, 0x71CB, 0x71CB, 0x2BB7, 0x71CE, 0x71CE, 0x12F4, + 0x71CF, 0x71CF, 0x2BBB, 0x71D0, 0x71D0, 0x12EF, 0x71D1, 0x71D1, 0x373D, + 0x71D2, 0x71D2, 0x12F0, 0x71D4, 0x71D4, 0x2BB8, 0x71D5, 0x71D5, 0x12F2, + 0x71D6, 0x71D6, 0x2BB4, 0x71D8, 0x71D8, 0x2BBD, 0x71D9, 0x71D9, 0x12F5, + 0x71DA, 0x71DB, 0x2BC0, 0x71DC, 0x71DC, 0x12F6, 0x71DD, 0x71DD, 0x4078, + 0x71DF, 0x71DF, 0x1404, 0x71E0, 0x71E0, 0x140B, 0x71E1, 0x71E1, 0x2D9B, + 0x71E2, 0x71E2, 0x2DA1, 0x71E4, 0x71E4, 0x2D9F, 0x71E5, 0x71E5, 0x1407, + 0x71E6, 0x71E6, 0x1406, 0x71E7, 0x71E7, 0x1403, 0x71E8, 0x71E8, 0x2D9D, + 0x71EB, 0x71EB, 0x3C81, 0x71EC, 0x71EC, 0x1409, 0x71ED, 0x71ED, 0x1408, + 0x71EE, 0x71EE, 0x1405, 0x71F0, 0x71F0, 0x2DA0, 0x71F1, 0x71F1, 0x2D9C, + 0x71F2, 0x71F2, 0x2D9E, 0x71F4, 0x71F4, 0x140A, 0x71F5, 0x71F5, 0x46EE, + 0x71F6, 0x71F6, 0x3E9A, 0x71F8, 0x71F8, 0x14F1, 0x71F9, 0x71F9, 0x2F52, + 0x71FB, 0x71FC, 0x14EE, 0x71FD, 0x71FD, 0x2F54, 0x71FE, 0x71FE, 0x14F0, + 0x71FF, 0x71FF, 0x2F51, 0x7201, 0x7201, 0x2F50, 0x7202, 0x7202, 0x30B9, + 0x7203, 0x7203, 0x2F53, 0x7205, 0x7205, 0x30BA, 0x7206, 0x7206, 0x1591, + 0x7207, 0x7207, 0x30B8, 0x7209, 0x7209, 0x3DBB, 0x720A, 0x720A, 0x30B7, + 0x720C, 0x720C, 0x30B6, 0x720D, 0x720D, 0x1592, 0x720E, 0x720E, 0x4271, + 0x720F, 0x720F, 0x39FC, 0x7210, 0x7210, 0x161F, 0x7213, 0x7214, 0x31F4, + 0x7215, 0x7215, 0x4273, 0x7216, 0x7216, 0x3953, 0x7217, 0x7217, 0x3969, + 0x7219, 0x7219, 0x32E1, 0x721A, 0x721A, 0x32E0, 0x721B, 0x721B, 0x167B, + 0x721D, 0x721D, 0x32DF, 0x721E, 0x721F, 0x338D, 0x7222, 0x7222, 0x3424, + 0x7223, 0x7223, 0x348C, 0x7224, 0x7224, 0x4276, 0x7226, 0x7226, 0x34D1, + 0x7227, 0x7227, 0x3535, 0x7228, 0x7228, 0x1766, 0x7229, 0x7229, 0x3549, + 0x722A, 0x722A, 0x02E7, 0x722B, 0x722B, 0x44F2, 0x722C, 0x722D, 0x0645, + 0x722E, 0x722E, 0x4279, 0x7230, 0x7230, 0x0791, 0x7235, 0x7235, 0x140C, + 0x7236, 0x7236, 0x02E8, 0x7238, 0x7238, 0x0647, 0x7239, 0x7239, 0x0923, + 0x723A, 0x723A, 0x0E75, 0x723B, 0x723B, 0x02E9, 0x723D, 0x723D, 0x0B17, + 0x723E, 0x723E, 0x1027, 0x723F, 0x723F, 0x178D, 0x7240, 0x7240, 0x427A, + 0x7241, 0x7241, 0x1B6E, 0x7242, 0x7242, 0x1D2D, 0x7244, 0x7244, 0x2722, + 0x7246, 0x7246, 0x140D, 0x7247, 0x7247, 0x02EA, 0x7248, 0x7248, 0x0648, + 0x7249, 0x724A, 0x1B6F, 0x724B, 0x724B, 0x21FD, 0x724C, 0x724C, 0x0CD0, + 0x724F, 0x724F, 0x248D, 0x7250, 0x7250, 0x3AC9, 0x7252, 0x7252, 0x0E76, + 0x7253, 0x7253, 0x2723, 0x7255, 0x7255, 0x427D, 0x7256, 0x7256, 0x11A2, + 0x7257, 0x7257, 0x427E, 0x7258, 0x7258, 0x1593, 0x7259, 0x7259, 0x02EB, + 0x725A, 0x725A, 0x21FE, 0x725B, 0x725B, 0x02EC, 0x725C, 0x725C, 0x465A, + 0x725D, 0x725D, 0x03F4, 0x725E, 0x725E, 0x180B, 0x725F, 0x725F, 0x03F3, + 0x7260, 0x7260, 0x04EC, 0x7261, 0x7261, 0x04EB, 0x7262, 0x7262, 0x04EA, + 0x7263, 0x7263, 0x18C5, 0x7266, 0x7266, 0x3EBB, 0x7267, 0x7267, 0x0649, + 0x7269, 0x7269, 0x064A, 0x726A, 0x726A, 0x19FA, 0x726C, 0x726C, 0x1B71, + 0x726E, 0x726E, 0x1B74, 0x726F, 0x726F, 0x0793, 0x7270, 0x7270, 0x1B72, + 0x7272, 0x7272, 0x0792, 0x7273, 0x7273, 0x1B73, 0x7274, 0x7274, 0x0794, + 0x7276, 0x7276, 0x1D30, 0x7277, 0x7277, 0x1D2F, 0x7278, 0x7278, 0x1D2E, + 0x7279, 0x7279, 0x0924, 0x727B, 0x727C, 0x1F81, 0x727D, 0x727D, 0x0B18, + 0x727E, 0x727E, 0x1F80, 0x727F, 0x727F, 0x1F83, 0x7280, 0x7280, 0x0CD2, + 0x7281, 0x7281, 0x0B19, 0x7282, 0x7282, 0x4283, 0x7284, 0x7284, 0x0CD1, + 0x7285, 0x7285, 0x2202, 0x7286, 0x7286, 0x2201, 0x7287, 0x7287, 0x3ACA, + 0x7288, 0x7289, 0x21FF, 0x728B, 0x728B, 0x2203, 0x728C, 0x728C, 0x248F, + 0x728D, 0x728D, 0x248E, 0x728E, 0x728E, 0x2492, 0x728F, 0x728F, 0x43C9, + 0x7290, 0x7290, 0x2491, 0x7291, 0x7291, 0x2490, 0x7292, 0x7292, 0x1028, + 0x7293, 0x7293, 0x2726, 0x7294, 0x7294, 0x3ACB, 0x7295, 0x7295, 0x2725, + 0x7296, 0x7296, 0x1029, 0x7297, 0x7297, 0x2724, 0x7298, 0x7298, 0x2966, + 0x729A, 0x729A, 0x2967, 0x729B, 0x729B, 0x11A3, 0x729D, 0x729E, 0x2BC2, + 0x729F, 0x729F, 0x473A, 0x72A1, 0x72A1, 0x30BF, 0x72A2, 0x72A2, 0x1594, + 0x72A3, 0x72A3, 0x30BE, 0x72A4, 0x72A4, 0x30BD, 0x72A5, 0x72A6, 0x30BB, + 0x72A7, 0x72A7, 0x167C, 0x72A8, 0x72A8, 0x31F6, 0x72A9, 0x72A9, 0x338F, + 0x72AA, 0x72AA, 0x34D2, 0x72AC, 0x72AC, 0x02ED, 0x72AD, 0x72AD, 0x44F4, + 0x72AE, 0x72AE, 0x17AF, 0x72AF, 0x72AF, 0x0355, 0x72B0, 0x72B0, 0x17B0, + 0x72B2, 0x72B2, 0x3FB6, 0x72B4, 0x72B5, 0x180C, 0x72BA, 0x72BA, 0x18CB, + 0x72BD, 0x72BD, 0x18C7, 0x72BF, 0x72BF, 0x18C6, 0x72C0, 0x72C0, 0x064B, + 0x72C1, 0x72C1, 0x18CA, 0x72C2, 0x72C2, 0x04EE, 0x72C3, 0x72C3, 0x18C8, + 0x72C4, 0x72C4, 0x04ED, 0x72C5, 0x72C5, 0x18CC, 0x72C6, 0x72C6, 0x18C9, + 0x72C9, 0x72C9, 0x19FE, 0x72CA, 0x72CA, 0x1B75, 0x72CB, 0x72CB, 0x19FC, + 0x72CC, 0x72CC, 0x1A03, 0x72CD, 0x72CD, 0x43CA, 0x72CE, 0x72CE, 0x064C, + 0x72D0, 0x72D0, 0x064F, 0x72D1, 0x72D1, 0x1A04, 0x72D2, 0x72D2, 0x1A00, + 0x72D4, 0x72D4, 0x1A01, 0x72D6, 0x72D6, 0x19FB, 0x72D7, 0x72D7, 0x064E, + 0x72D8, 0x72D8, 0x19FD, 0x72D9, 0x72D9, 0x064D, 0x72DA, 0x72DA, 0x1A02, + 0x72DC, 0x72DC, 0x19FF, 0x72DF, 0x72DF, 0x1B79, 0x72E0, 0x72E1, 0x0796, + 0x72E2, 0x72E2, 0x3F97, 0x72E3, 0x72E3, 0x1B7C, 0x72E4, 0x72E4, 0x1B76, + 0x72E6, 0x72E6, 0x1B7B, 0x72E8, 0x72E8, 0x1B77, 0x72E9, 0x72E9, 0x0795, + 0x72EA, 0x72EA, 0x1B7A, 0x72EB, 0x72EB, 0x1B78, 0x72F3, 0x72F3, 0x1D36, + 0x72F4, 0x72F4, 0x1D33, 0x72F6, 0x72F6, 0x1D35, 0x72F7, 0x72F7, 0x0929, + 0x72F8, 0x72F8, 0x0928, 0x72F9, 0x72F9, 0x0926, 0x72FA, 0x72FA, 0x1D32, + 0x72FB, 0x72FB, 0x1D37, 0x72FC, 0x72FC, 0x0925, 0x72FD, 0x72FD, 0x0927, + 0x72FE, 0x72FE, 0x1D34, 0x72FF, 0x72FF, 0x1F8B, 0x7300, 0x7300, 0x1D31, + 0x7301, 0x7301, 0x1D38, 0x7302, 0x7302, 0x3F9A, 0x7304, 0x7304, 0x3EB5, + 0x7307, 0x7307, 0x1F86, 0x7308, 0x7308, 0x1F8A, 0x730A, 0x730A, 0x1F89, + 0x730B, 0x730B, 0x2205, 0x730C, 0x730C, 0x2210, 0x730F, 0x730F, 0x1F8C, + 0x7310, 0x7310, 0x46EA, 0x7311, 0x7311, 0x1F87, 0x7312, 0x7312, 0x2204, + 0x7313, 0x7313, 0x0B1D, 0x7316, 0x7316, 0x0B1C, 0x7317, 0x7317, 0x1F85, + 0x7318, 0x7318, 0x1F88, 0x7319, 0x7319, 0x0B1E, 0x731B, 0x731B, 0x0B1B, + 0x731C, 0x731C, 0x0B1A, 0x731D, 0x731D, 0x1F84, 0x731E, 0x731E, 0x1F8D, + 0x7322, 0x7322, 0x2207, 0x7323, 0x7323, 0x220E, 0x7325, 0x7325, 0x0CD4, + 0x7326, 0x7326, 0x220D, 0x7327, 0x7327, 0x220A, 0x7328, 0x7328, 0x428A, + 0x7329, 0x7329, 0x0CD6, 0x732A, 0x732A, 0x3D70, 0x732B, 0x732B, 0x4285, + 0x732C, 0x732C, 0x3FB2, 0x732D, 0x732D, 0x220C, 0x732E, 0x732E, 0x428B, + 0x7330, 0x7330, 0x2206, 0x7331, 0x7331, 0x2208, 0x7332, 0x7332, 0x220B, + 0x7333, 0x7333, 0x2209, 0x7334, 0x7334, 0x0CD5, 0x7335, 0x7335, 0x220F, + 0x7336, 0x7336, 0x0CD3, 0x7337, 0x7337, 0x0E77, 0x7338, 0x7338, 0x46EB, + 0x7339, 0x7339, 0x43CC, 0x733A, 0x733A, 0x2496, 0x733B, 0x733B, 0x2495, + 0x733C, 0x733C, 0x2493, 0x733E, 0x733E, 0x0E7A, 0x733F, 0x733F, 0x0E79, + 0x7340, 0x7340, 0x2497, 0x7341, 0x7341, 0x46EC, 0x7342, 0x7342, 0x2494, + 0x7343, 0x7343, 0x2727, 0x7344, 0x7344, 0x102A, 0x7345, 0x7345, 0x0E78, + 0x7348, 0x7348, 0x43FA, 0x7349, 0x7349, 0x2499, 0x734A, 0x734A, 0x2498, + 0x734C, 0x734C, 0x272A, 0x734D, 0x734D, 0x2728, 0x734E, 0x734E, 0x11A4, + 0x734F, 0x734F, 0x3F51, 0x7350, 0x7350, 0x102B, 0x7351, 0x7351, 0x2729, + 0x7352, 0x7352, 0x2969, 0x7357, 0x7357, 0x11A5, 0x7358, 0x7358, 0x2968, + 0x7359, 0x7359, 0x2971, 0x735A, 0x735A, 0x2970, 0x735B, 0x735B, 0x296E, + 0x735D, 0x735D, 0x296D, 0x735E, 0x7360, 0x296A, 0x7361, 0x7361, 0x296F, + 0x7362, 0x7362, 0x2972, 0x7365, 0x7365, 0x2BC8, 0x7366, 0x7367, 0x2BC5, + 0x7368, 0x7368, 0x12F9, 0x7369, 0x7369, 0x2BC4, 0x736A, 0x736A, 0x2BCA, + 0x736B, 0x736B, 0x2BC9, 0x736C, 0x736C, 0x2BC7, 0x736E, 0x736F, 0x2DA3, + 0x7370, 0x7370, 0x140E, 0x7371, 0x7371, 0x3F98, 0x7372, 0x7372, 0x140F, + 0x7373, 0x7373, 0x2DA2, 0x7374, 0x7374, 0x3ED4, 0x7375, 0x7375, 0x14F3, + 0x7376, 0x7376, 0x2F55, 0x7377, 0x7377, 0x14F2, 0x7378, 0x7378, 0x1595, + 0x737A, 0x737A, 0x1596, 0x737B, 0x737B, 0x1620, 0x737C, 0x737C, 0x31F8, + 0x737D, 0x737D, 0x31F7, 0x737E, 0x737E, 0x32E2, 0x737F, 0x737F, 0x3390, + 0x7380, 0x7380, 0x16CA, 0x7381, 0x7381, 0x3426, 0x7382, 0x7382, 0x3425, + 0x7383, 0x7383, 0x3427, 0x7384, 0x7384, 0x0356, 0x7385, 0x7385, 0x1B7D, + 0x7386, 0x7386, 0x092A, 0x7387, 0x7387, 0x0B1F, 0x7388, 0x7388, 0x1F8E, + 0x7389, 0x7389, 0x0357, 0x738A, 0x738A, 0x17B1, 0x738B, 0x738B, 0x02EE, + 0x738E, 0x738E, 0x180E, 0x738F, 0x738F, 0x46E5, 0x7392, 0x7392, 0x18D1, + 0x7393, 0x7394, 0x18CF, 0x7395, 0x7395, 0x18CD, 0x7396, 0x7396, 0x04EF, + 0x7397, 0x7397, 0x18CE, 0x7398, 0x7398, 0x39F6, 0x739C, 0x739C, 0x408A, + 0x739D, 0x739D, 0x1A0C, 0x739E, 0x739E, 0x395B, 0x739F, 0x739F, 0x0652, + 0x73A0, 0x73A0, 0x1A0A, 0x73A1, 0x73A1, 0x1A06, 0x73A2, 0x73A2, 0x1A09, + 0x73A4, 0x73A4, 0x1A05, 0x73A5, 0x73A5, 0x0654, 0x73A6, 0x73A6, 0x1A08, + 0x73A7, 0x73A7, 0x4087, 0x73A8, 0x73A8, 0x0651, 0x73A9, 0x73A9, 0x0650, + 0x73AA, 0x73AA, 0x428D, 0x73AB, 0x73AB, 0x0653, 0x73AC, 0x73AC, 0x1A0B, + 0x73AD, 0x73AD, 0x1A07, 0x73B2, 0x73B2, 0x079B, 0x73B3, 0x73B3, 0x079E, + 0x73B4, 0x73B4, 0x1B85, 0x73B5, 0x73B5, 0x1B84, 0x73B6, 0x73B6, 0x1B83, + 0x73B7, 0x73B7, 0x0798, 0x73B8, 0x73B8, 0x1B8C, 0x73B9, 0x73B9, 0x1B82, + 0x73BB, 0x73BB, 0x079A, 0x73BC, 0x73BC, 0x1D3D, 0x73BE, 0x73BE, 0x1B89, + 0x73BF, 0x73BF, 0x1B87, 0x73C0, 0x73C0, 0x079D, 0x73C2, 0x73C2, 0x1B7F, + 0x73C3, 0x73C3, 0x1B8A, 0x73C5, 0x73C5, 0x1B81, 0x73C6, 0x73C6, 0x1B8B, + 0x73C7, 0x73C7, 0x1B88, 0x73C8, 0x73C8, 0x1B80, 0x73C9, 0x73C9, 0x4290, + 0x73CA, 0x73CA, 0x0799, 0x73CB, 0x73CB, 0x1B8D, 0x73CC, 0x73CC, 0x1B7E, + 0x73CD, 0x73CD, 0x079C, 0x73CE, 0x73CE, 0x411B, 0x73CF, 0x73CF, 0x428C, + 0x73D0, 0x73D0, 0x3B17, 0x73D2, 0x73D2, 0x1D42, 0x73D3, 0x73D3, 0x1D39, + 0x73D4, 0x73D4, 0x1D44, 0x73D5, 0x73D5, 0x4073, 0x73D6, 0x73D6, 0x1D3C, + 0x73D7, 0x73D8, 0x1D47, 0x73D9, 0x73D9, 0x1D3A, 0x73DA, 0x73DA, 0x1D46, + 0x73DB, 0x73DB, 0x1D43, 0x73DC, 0x73DC, 0x1D41, 0x73DD, 0x73DD, 0x1D45, + 0x73DE, 0x73DE, 0x0930, 0x73E0, 0x73E0, 0x092E, 0x73E1, 0x73E1, 0x46F0, + 0x73E2, 0x73E2, 0x3CA3, 0x73E3, 0x73E3, 0x1D3F, 0x73E4, 0x73E4, 0x42A5, + 0x73E5, 0x73E5, 0x1D3B, 0x73E6, 0x73E6, 0x3CBA, 0x73E7, 0x73E7, 0x1D3E, + 0x73E8, 0x73E8, 0x1D49, 0x73E9, 0x73E9, 0x1D40, 0x73EA, 0x73EA, 0x092F, + 0x73EB, 0x73EB, 0x1B86, 0x73ED, 0x73ED, 0x092B, 0x73EE, 0x73EE, 0x092D, + 0x73EF, 0x73EF, 0x4011, 0x73F3, 0x73F3, 0x3CAB, 0x73F4, 0x73F4, 0x1F9C, + 0x73F5, 0x73F5, 0x1F91, 0x73F6, 0x73F6, 0x1F8F, 0x73F7, 0x73F7, 0x429A, + 0x73F8, 0x73F8, 0x1F90, 0x73F9, 0x73F9, 0x3BF9, 0x73FA, 0x73FA, 0x1F97, + 0x73FB, 0x73FB, 0x3CAC, 0x73FC, 0x73FC, 0x1F98, 0x73FD, 0x73FD, 0x1F94, + 0x73FE, 0x73FE, 0x0B24, 0x73FF, 0x73FF, 0x1F99, 0x7400, 0x7400, 0x1F96, + 0x7401, 0x7401, 0x1F93, 0x7403, 0x7403, 0x0B22, 0x7404, 0x7404, 0x1F92, + 0x7405, 0x7405, 0x0B20, 0x7406, 0x7406, 0x0B23, 0x7407, 0x7407, 0x1F95, + 0x7408, 0x7408, 0x1F9D, 0x7409, 0x7409, 0x092C, 0x740A, 0x740A, 0x0B21, + 0x740B, 0x740B, 0x1F9B, 0x740C, 0x740C, 0x1F9A, 0x740D, 0x740D, 0x0B25, + 0x7411, 0x7411, 0x456C, 0x7412, 0x7412, 0x3BE6, 0x7414, 0x7414, 0x39F4, + 0x7415, 0x7415, 0x429B, 0x7416, 0x7416, 0x2215, 0x7417, 0x7417, 0x40AD, + 0x7419, 0x7419, 0x46F3, 0x741A, 0x741A, 0x2216, 0x741B, 0x741B, 0x0CE0, + 0x741C, 0x741C, 0x38DD, 0x741D, 0x741D, 0x221C, 0x741E, 0x741F, 0x46F4, + 0x7420, 0x7420, 0x221E, 0x7421, 0x7421, 0x2217, 0x7422, 0x7422, 0x0CDA, + 0x7423, 0x7423, 0x221B, 0x7424, 0x7424, 0x221A, 0x7425, 0x7425, 0x0CDB, + 0x7426, 0x7426, 0x0CE1, 0x7428, 0x7428, 0x0CE2, 0x7429, 0x7429, 0x221D, + 0x742A, 0x742A, 0x0CD8, 0x742B, 0x742B, 0x2214, 0x742C, 0x742C, 0x2212, + 0x742D, 0x742D, 0x2218, 0x742E, 0x742E, 0x2211, 0x742F, 0x742F, 0x0CDF, + 0x7430, 0x7430, 0x2213, 0x7431, 0x7431, 0x2219, 0x7432, 0x7432, 0x221F, + 0x7433, 0x7433, 0x0CD9, 0x7434, 0x7434, 0x0CDE, 0x7435, 0x7436, 0x0CDC, + 0x7437, 0x7437, 0x3AE1, 0x7438, 0x7438, 0x3B09, 0x7439, 0x7439, 0x429E, + 0x743A, 0x743A, 0x0CD7, 0x743C, 0x743C, 0x3ADF, 0x743F, 0x743F, 0x0E81, + 0x7440, 0x7440, 0x24A0, 0x7441, 0x7441, 0x0E80, 0x7442, 0x7442, 0x24A4, + 0x7443, 0x7443, 0x3A1A, 0x7444, 0x7444, 0x249A, 0x7445, 0x7445, 0x3BD7, + 0x7446, 0x7446, 0x24A5, 0x7447, 0x7447, 0x42A4, 0x7448, 0x7448, 0x3CB5, + 0x7449, 0x7449, 0x4291, 0x744A, 0x744B, 0x249B, 0x744D, 0x744D, 0x24A6, + 0x744E, 0x744E, 0x24A3, 0x744F, 0x7450, 0x24A1, 0x7451, 0x7451, 0x249E, + 0x7452, 0x7452, 0x249D, 0x7453, 0x7453, 0x4231, 0x7454, 0x7454, 0x24A7, + 0x7455, 0x7455, 0x0E7D, 0x7456, 0x7456, 0x39F5, 0x7457, 0x7457, 0x249F, + 0x7459, 0x7459, 0x0E82, 0x745A, 0x745A, 0x0E7C, 0x745B, 0x745C, 0x0E83, + 0x745D, 0x745D, 0x42C6, 0x745E, 0x745E, 0x0E7F, 0x745F, 0x745F, 0x0E7E, + 0x7460, 0x7460, 0x42A2, 0x7462, 0x7462, 0x272B, 0x7463, 0x7463, 0x102D, + 0x7464, 0x7464, 0x102C, 0x7465, 0x7465, 0x4101, 0x7467, 0x7467, 0x2730, + 0x7468, 0x7468, 0x3AEE, 0x7469, 0x7469, 0x11A6, 0x746A, 0x746A, 0x102E, + 0x746B, 0x746B, 0x3BE7, 0x746C, 0x746C, 0x42A8, 0x746D, 0x746D, 0x1030, + 0x746E, 0x746E, 0x2731, 0x746F, 0x746F, 0x0E7B, 0x7470, 0x7470, 0x102F, + 0x7471, 0x7471, 0x272D, 0x7472, 0x7472, 0x272F, 0x7473, 0x7473, 0x272C, + 0x7474, 0x7474, 0x42A9, 0x7475, 0x7475, 0x272E, 0x7476, 0x7476, 0x42A6, + 0x7479, 0x7479, 0x297C, 0x747A, 0x747A, 0x3AD1, 0x747C, 0x747C, 0x297B, + 0x747D, 0x747D, 0x2978, 0x747E, 0x747E, 0x11A9, 0x747F, 0x747F, 0x2BCB, + 0x7480, 0x7480, 0x11AA, 0x7481, 0x7481, 0x2977, 0x7482, 0x7482, 0x42AC, + 0x7483, 0x7483, 0x11A8, 0x7485, 0x7485, 0x2979, 0x7486, 0x7486, 0x2976, + 0x7487, 0x7487, 0x2973, 0x7488, 0x7488, 0x297A, 0x7489, 0x748A, 0x2974, + 0x748B, 0x748B, 0x11A7, 0x748C, 0x748C, 0x3A21, 0x748D, 0x748D, 0x469D, + 0x7490, 0x7490, 0x2DA8, 0x7492, 0x7492, 0x2BCF, 0x7494, 0x7494, 0x2BCE, + 0x7495, 0x7495, 0x2BD0, 0x7497, 0x7497, 0x2DA5, 0x7498, 0x7498, 0x12FC, + 0x7499, 0x7499, 0x39F3, 0x749A, 0x749A, 0x2BCC, 0x749B, 0x749B, 0x3B0A, + 0x749C, 0x749C, 0x12FA, 0x749E, 0x749E, 0x12FE, 0x749F, 0x749F, 0x12FD, + 0x74A0, 0x74A0, 0x2BCD, 0x74A1, 0x74A1, 0x2BD1, 0x74A3, 0x74A3, 0x12FB, + 0x74A4, 0x74A4, 0x4170, 0x74A5, 0x74A5, 0x2DAC, 0x74A6, 0x74A6, 0x1412, + 0x74A7, 0x74A7, 0x14F4, 0x74A8, 0x74A8, 0x1413, 0x74A9, 0x74A9, 0x1410, + 0x74AA, 0x74AA, 0x2DA9, 0x74AB, 0x74AB, 0x2DA7, 0x74AD, 0x74AD, 0x2DAA, + 0x74AF, 0x74AF, 0x2DAD, 0x74B0, 0x74B0, 0x1411, 0x74B1, 0x74B1, 0x2DAB, + 0x74B2, 0x74B2, 0x2DA6, 0x74B4, 0x74B4, 0x3CA5, 0x74B5, 0x74B5, 0x2F58, + 0x74B6, 0x74B6, 0x2F5B, 0x74B7, 0x74B7, 0x30C2, 0x74B8, 0x74B8, 0x2F56, + 0x74BA, 0x74BA, 0x31F9, 0x74BB, 0x74BB, 0x2F5C, 0x74BD, 0x74BD, 0x1597, + 0x74BE, 0x74BE, 0x2F5A, 0x74BF, 0x74BF, 0x14F5, 0x74C0, 0x74C0, 0x2F57, + 0x74C1, 0x74C1, 0x2F59, 0x74C2, 0x74C2, 0x2F5D, 0x74C3, 0x74C3, 0x30C3, + 0x74C5, 0x74C5, 0x30C1, 0x74C8, 0x74C8, 0x42B5, 0x74CA, 0x74CA, 0x1598, + 0x74CB, 0x74CB, 0x30C0, 0x74CC, 0x74CC, 0x3ADE, 0x74CF, 0x74CF, 0x1621, + 0x74D0, 0x74D0, 0x3A9B, 0x74D3, 0x74D3, 0x46FA, 0x74D4, 0x74D4, 0x167E, + 0x74D5, 0x74D5, 0x3392, 0x74D6, 0x74D6, 0x167D, 0x74D7, 0x74D7, 0x3394, + 0x74D8, 0x74D8, 0x3391, 0x74D9, 0x74D9, 0x3393, 0x74DA, 0x74DA, 0x16FE, + 0x74DB, 0x74DB, 0x348D, 0x74DC, 0x74DC, 0x0358, 0x74DD, 0x74DD, 0x1A0D, + 0x74DE, 0x74DF, 0x1D4A, 0x74E0, 0x74E0, 0x0B26, 0x74E1, 0x74E1, 0x24A8, + 0x74E2, 0x74E2, 0x12FF, 0x74E3, 0x74E3, 0x1599, 0x74E4, 0x74E4, 0x16CB, + 0x74E5, 0x74E5, 0x348E, 0x74E6, 0x74E6, 0x0359, 0x74E7, 0x74E7, 0x3FFE, + 0x74E8, 0x74E8, 0x1A0E, 0x74E9, 0x74E9, 0x0120, 0x74EC, 0x74EC, 0x1B8E, + 0x74EE, 0x74EE, 0x1B8F, 0x74F0, 0x74F0, 0x3FE6, 0x74F1, 0x74F1, 0x3F9B, + 0x74F2, 0x74F2, 0x3FDF, 0x74F4, 0x74F5, 0x1D4C, 0x74F6, 0x74F7, 0x0B27, + 0x74F8, 0x74F8, 0x3FF4, 0x74FB, 0x74FB, 0x2220, 0x74FD, 0x74FD, 0x24AB, + 0x74FE, 0x74FE, 0x24AA, 0x74FF, 0x74FF, 0x24A9, 0x7500, 0x7500, 0x2732, + 0x7502, 0x7503, 0x2733, 0x7504, 0x7504, 0x1031, 0x7505, 0x7505, 0x3FDE, + 0x7507, 0x7507, 0x297E, 0x7508, 0x7508, 0x297D, 0x750B, 0x750B, 0x2BD2, + 0x750C, 0x750D, 0x1300, 0x750E, 0x750E, 0x42B7, 0x750F, 0x750F, 0x2DB1, + 0x7510, 0x7512, 0x2DAE, 0x7513, 0x7513, 0x2F5F, 0x7514, 0x7514, 0x2F5E, + 0x7515, 0x7515, 0x14F6, 0x7516, 0x7516, 0x30C4, 0x7517, 0x7517, 0x32E3, + 0x7518, 0x7518, 0x035A, 0x7519, 0x7519, 0x4583, 0x751A, 0x751A, 0x079F, + 0x751C, 0x751C, 0x0B29, 0x751D, 0x751D, 0x24AC, 0x751E, 0x751E, 0x42B8, + 0x751F, 0x751F, 0x035B, 0x7521, 0x7521, 0x1D4E, 0x7522, 0x7522, 0x0B2A, + 0x7525, 0x7526, 0x0CE3, 0x7528, 0x7529, 0x035C, 0x752A, 0x752A, 0x180F, + 0x752B, 0x752B, 0x04F1, 0x752C, 0x752C, 0x04F0, 0x752D, 0x752D, 0x07A0, + 0x752E, 0x752E, 0x1B90, 0x752F, 0x752F, 0x2221, 0x7530, 0x7533, 0x035E, + 0x7534, 0x7534, 0x3E87, 0x7535, 0x7535, 0x455A, 0x7537, 0x7538, 0x04F2, + 0x7539, 0x7539, 0x18D3, 0x753A, 0x753A, 0x18D2, 0x753B, 0x753B, 0x3DFB, + 0x753D, 0x753D, 0x0655, 0x753E, 0x753E, 0x1A11, 0x753F, 0x7540, 0x1A0F, + 0x7542, 0x7542, 0x43CD, 0x7546, 0x7546, 0x3F40, 0x7547, 0x7548, 0x1B91, + 0x754A, 0x754A, 0x42BF, 0x754B, 0x754B, 0x07A4, 0x754C, 0x754C, 0x07A2, + 0x754D, 0x754D, 0x42BE, 0x754E, 0x754E, 0x07A3, 0x754F, 0x754F, 0x07A1, + 0x7551, 0x7551, 0x3CFE, 0x7553, 0x7553, 0x3FEB, 0x7554, 0x7554, 0x0931, + 0x7555, 0x7555, 0x3AEA, 0x7559, 0x7559, 0x0935, 0x755A, 0x755A, 0x0934, + 0x755B, 0x755B, 0x1D4F, 0x755C, 0x755C, 0x0933, 0x755D, 0x755D, 0x0932, + 0x755F, 0x755F, 0x1D50, 0x7560, 0x7560, 0x3D71, 0x7562, 0x7562, 0x0B2D, + 0x7563, 0x7563, 0x1F9F, 0x7564, 0x7564, 0x1F9E, 0x7565, 0x7566, 0x0B2B, + 0x7567, 0x7567, 0x42C0, 0x756A, 0x756A, 0x0CE6, 0x756B, 0x756B, 0x0CE5, + 0x756C, 0x756C, 0x2223, 0x756D, 0x756D, 0x46FD, 0x756E, 0x756E, 0x42C1, + 0x756F, 0x756F, 0x2222, 0x7570, 0x7570, 0x0B2E, 0x7572, 0x7572, 0x46FE, + 0x7576, 0x7576, 0x0E85, 0x7577, 0x7577, 0x24AE, 0x7578, 0x7578, 0x0E86, + 0x7579, 0x7579, 0x24AD, 0x757A, 0x757A, 0x3F4F, 0x757D, 0x757D, 0x2735, + 0x757E, 0x757E, 0x297F, 0x757F, 0x757F, 0x11AB, 0x7580, 0x7580, 0x2BD3, + 0x7583, 0x7583, 0x3AE5, 0x7584, 0x7584, 0x2DB2, 0x7586, 0x7586, 0x159B, + 0x7587, 0x7587, 0x159A, 0x758A, 0x758A, 0x16CC, 0x758B, 0x758B, 0x0362, + 0x758C, 0x758C, 0x1A12, 0x758D, 0x758D, 0x46FF, 0x758E, 0x758E, 0x42C5, + 0x758F, 0x758F, 0x0B2F, 0x7590, 0x7590, 0x2736, 0x7591, 0x7591, 0x1032, + 0x7592, 0x7592, 0x022E, 0x7594, 0x7595, 0x18D4, 0x7598, 0x7598, 0x1A13, + 0x7599, 0x759A, 0x0657, 0x759D, 0x759D, 0x0656, 0x759E, 0x759E, 0x42C7, + 0x75A2, 0x75A3, 0x07A8, 0x75A4, 0x75A5, 0x07A6, 0x75A7, 0x75A7, 0x1B93, + 0x75AA, 0x75AA, 0x1B94, 0x75AB, 0x75AB, 0x07A5, 0x75B0, 0x75B0, 0x1D51, + 0x75B1, 0x75B1, 0x3EAD, 0x75B2, 0x75B3, 0x0939, 0x75B4, 0x75B4, 0x42C8, + 0x75B5, 0x75B5, 0x0B32, 0x75B6, 0x75B6, 0x1D57, 0x75B8, 0x75B8, 0x093F, + 0x75B9, 0x75B9, 0x093D, 0x75BA, 0x75BA, 0x1D58, 0x75BB, 0x75BB, 0x1D53, + 0x75BC, 0x75BC, 0x093C, 0x75BD, 0x75BD, 0x093B, 0x75BE, 0x75BE, 0x0936, + 0x75BF, 0x75BF, 0x1D56, 0x75C0, 0x75C0, 0x1D55, 0x75C1, 0x75C1, 0x1D52, + 0x75C2, 0x75C2, 0x093E, 0x75C3, 0x75C3, 0x3F93, 0x75C4, 0x75C4, 0x1D54, + 0x75C5, 0x75C5, 0x0937, 0x75C7, 0x75C7, 0x0938, 0x75C8, 0x75C8, 0x4701, + 0x75CA, 0x75CA, 0x0B33, 0x75CB, 0x75CC, 0x1FA3, 0x75CD, 0x75CD, 0x0B34, + 0x75CE, 0x75CE, 0x1FA0, 0x75CF, 0x75CF, 0x1FA2, 0x75D0, 0x75D0, 0x1FA6, + 0x75D1, 0x75D1, 0x1FA5, 0x75D2, 0x75D2, 0x1FA1, 0x75D4, 0x75D5, 0x0B30, + 0x75D7, 0x75D7, 0x222B, 0x75D8, 0x75D8, 0x0CEB, 0x75D9, 0x75D9, 0x0CEA, + 0x75DA, 0x75DA, 0x2225, 0x75DB, 0x75DB, 0x0CE8, 0x75DC, 0x75DC, 0x43CE, + 0x75DD, 0x75DD, 0x2228, 0x75DE, 0x75DE, 0x0CEC, 0x75DF, 0x75DF, 0x2229, + 0x75E0, 0x75E0, 0x0CED, 0x75E1, 0x75E1, 0x2226, 0x75E2, 0x75E2, 0x0CE7, + 0x75E3, 0x75E3, 0x0CE9, 0x75E4, 0x75E4, 0x222A, 0x75E6, 0x75E6, 0x2227, + 0x75E7, 0x75E7, 0x2224, 0x75ED, 0x75ED, 0x24BB, 0x75EF, 0x75EF, 0x24B0, + 0x75F0, 0x75F0, 0x0E88, 0x75F1, 0x75F1, 0x0E8B, 0x75F2, 0x75F2, 0x0E8A, + 0x75F3, 0x75F3, 0x0E8F, 0x75F4, 0x75F4, 0x0E8E, 0x75F5, 0x75F5, 0x24BC, + 0x75F6, 0x75F6, 0x24BA, 0x75F7, 0x75F7, 0x24B3, 0x75F8, 0x75F8, 0x24B7, + 0x75F9, 0x75F9, 0x24B6, 0x75FA, 0x75FA, 0x0E8C, 0x75FB, 0x75FB, 0x24B9, + 0x75FC, 0x75FC, 0x24B5, 0x75FD, 0x75FD, 0x24BD, 0x75FE, 0x75FE, 0x24B4, + 0x75FF, 0x75FF, 0x0E8D, 0x7600, 0x7600, 0x0E87, 0x7601, 0x7601, 0x0E89, + 0x7602, 0x7602, 0x42C9, 0x7603, 0x7603, 0x24B2, 0x7607, 0x7607, 0x3F8F, + 0x7608, 0x7608, 0x2738, 0x7609, 0x7609, 0x1036, 0x760A, 0x760A, 0x273C, + 0x760B, 0x760B, 0x1035, 0x760C, 0x760C, 0x2739, 0x760D, 0x760D, 0x1034, + 0x760F, 0x760F, 0x24B1, 0x7610, 0x7610, 0x24B8, 0x7611, 0x7611, 0x273B, + 0x7613, 0x7613, 0x1037, 0x7614, 0x7614, 0x273D, 0x7615, 0x7615, 0x273A, + 0x7616, 0x7616, 0x2737, 0x7619, 0x7619, 0x2982, 0x761A, 0x761A, 0x2986, + 0x761B, 0x761B, 0x2988, 0x761C, 0x761C, 0x2984, 0x761D, 0x761D, 0x2983, + 0x761E, 0x761E, 0x2981, 0x761F, 0x761F, 0x11AE, 0x7620, 0x7620, 0x11AC, + 0x7621, 0x7622, 0x11B1, 0x7623, 0x7623, 0x2985, 0x7624, 0x7624, 0x11AF, + 0x7625, 0x7625, 0x2980, 0x7626, 0x7626, 0x11B0, 0x7627, 0x7627, 0x1033, + 0x7628, 0x7628, 0x2987, 0x7629, 0x7629, 0x11AD, 0x762C, 0x762C, 0x42CA, + 0x762D, 0x762D, 0x2BD5, 0x762F, 0x762F, 0x2BD4, 0x7630, 0x7630, 0x2BDC, + 0x7631, 0x7631, 0x2BD6, 0x7632, 0x7632, 0x2BDB, 0x7633, 0x7633, 0x2BD8, + 0x7634, 0x7634, 0x1302, 0x7635, 0x7635, 0x2BDA, 0x7638, 0x7638, 0x1303, + 0x763A, 0x763A, 0x1304, 0x763B, 0x763B, 0x3E70, 0x763C, 0x763C, 0x2BD9, + 0x763D, 0x763D, 0x2BD7, 0x7640, 0x7640, 0x3EE6, 0x7642, 0x7642, 0x1415, + 0x7643, 0x7643, 0x2DB3, 0x7646, 0x7646, 0x1414, 0x7647, 0x7647, 0x2DB6, + 0x7648, 0x7649, 0x2DB4, 0x764C, 0x764C, 0x1416, 0x764D, 0x764D, 0x4702, + 0x764E, 0x764E, 0x3E72, 0x764F, 0x764F, 0x42CC, 0x7650, 0x7650, 0x2F63, + 0x7651, 0x7651, 0x42CB, 0x7652, 0x7652, 0x14F9, 0x7653, 0x7653, 0x2F64, + 0x7654, 0x7654, 0x3EF0, 0x7656, 0x7656, 0x14F7, 0x7657, 0x7657, 0x2F65, + 0x7658, 0x7658, 0x14F8, 0x7659, 0x7659, 0x2F62, 0x765A, 0x765A, 0x2F66, + 0x765C, 0x765C, 0x2F60, 0x765F, 0x765F, 0x159C, 0x7660, 0x7660, 0x30C5, + 0x7661, 0x7661, 0x159D, 0x7662, 0x7662, 0x1622, 0x7664, 0x7664, 0x2F61, + 0x7665, 0x7665, 0x1623, 0x7666, 0x7666, 0x3EAA, 0x7667, 0x7667, 0x3FA9, + 0x7669, 0x7669, 0x167F, 0x766A, 0x766A, 0x32E4, 0x766C, 0x766C, 0x16CE, + 0x766D, 0x766D, 0x3395, 0x766E, 0x766E, 0x16CD, 0x766F, 0x766F, 0x42CD, + 0x7670, 0x7670, 0x3428, 0x7671, 0x7672, 0x1723, 0x7673, 0x7673, 0x3AEB, + 0x7674, 0x7674, 0x4703, 0x7675, 0x7675, 0x3543, 0x7676, 0x7676, 0x022F, + 0x7678, 0x7678, 0x07AA, 0x7679, 0x7679, 0x1B95, 0x767A, 0x767A, 0x4705, + 0x767B, 0x767C, 0x0CEE, 0x767D, 0x767D, 0x0363, 0x767E, 0x767E, 0x03F5, + 0x767F, 0x767F, 0x1810, 0x7680, 0x7680, 0x43D3, 0x7681, 0x7681, 0x18D6, + 0x7682, 0x7682, 0x04F4, 0x7684, 0x7684, 0x0659, 0x7686, 0x7688, 0x07AB, + 0x7689, 0x7689, 0x1FA8, 0x768A, 0x768A, 0x1D59, 0x768B, 0x768B, 0x0940, + 0x768C, 0x768C, 0x43D4, 0x768E, 0x768E, 0x0B35, 0x768F, 0x768F, 0x1FA7, + 0x7690, 0x7690, 0x42D0, 0x7692, 0x7692, 0x222D, 0x7693, 0x7693, 0x0CF1, + 0x7695, 0x7695, 0x222C, 0x7696, 0x7696, 0x0CF0, 0x7699, 0x7699, 0x24BE, + 0x769A, 0x769A, 0x11B3, 0x769B, 0x769B, 0x298C, 0x769C, 0x769E, 0x2989, + 0x76A1, 0x76A1, 0x42D5, 0x76A4, 0x76A4, 0x2DB7, 0x76A5, 0x76A5, 0x42D6, + 0x76A6, 0x76A6, 0x2F67, 0x76AA, 0x76AA, 0x31FB, 0x76AB, 0x76AB, 0x31FA, + 0x76AD, 0x76AD, 0x3396, 0x76AE, 0x76AE, 0x0364, 0x76AF, 0x76AF, 0x1A14, + 0x76B0, 0x76B0, 0x0941, 0x76B4, 0x76B4, 0x0CF2, 0x76B5, 0x76B5, 0x24BF, + 0x76B7, 0x76B7, 0x42D7, 0x76B8, 0x76B8, 0x273E, 0x76BA, 0x76BA, 0x11B4, + 0x76BB, 0x76BB, 0x2BDD, 0x76BD, 0x76BD, 0x2F68, 0x76BE, 0x76BE, 0x31FC, + 0x76BF, 0x76BF, 0x0365, 0x76C2, 0x76C2, 0x065A, 0x76C3, 0x76C3, 0x07B0, + 0x76C4, 0x76C4, 0x1B96, 0x76C5, 0x76C5, 0x07B1, 0x76C6, 0x76C6, 0x07AF, + 0x76C8, 0x76C8, 0x07AE, 0x76C9, 0x76C9, 0x1D5A, 0x76CA, 0x76CA, 0x0942, + 0x76CC, 0x76CC, 0x42D8, 0x76CD, 0x76CE, 0x0943, 0x76D2, 0x76D2, 0x0B37, + 0x76D3, 0x76D3, 0x1FA9, 0x76D4, 0x76D4, 0x0B36, 0x76D6, 0x76D6, 0x3F55, + 0x76DA, 0x76DA, 0x222E, 0x76DB, 0x76DB, 0x0B38, 0x76DC, 0x76DC, 0x0CF3, + 0x76DD, 0x76DD, 0x24C0, 0x76DE, 0x76DF, 0x0E90, 0x76E1, 0x76E1, 0x1038, + 0x76E3, 0x76E3, 0x1039, 0x76E4, 0x76E4, 0x11B5, 0x76E5, 0x76E5, 0x1306, + 0x76E6, 0x76E6, 0x2BDE, 0x76E7, 0x76E7, 0x1305, 0x76E9, 0x76E9, 0x2DB8, + 0x76EA, 0x76EA, 0x1417, 0x76EC, 0x76EC, 0x2F69, 0x76ED, 0x76ED, 0x31FD, + 0x76EE, 0x76EE, 0x0366, 0x76EF, 0x76EF, 0x04F5, 0x76F0, 0x76F0, 0x1A17, + 0x76F1, 0x76F1, 0x1A16, 0x76F2, 0x76F2, 0x065B, 0x76F3, 0x76F3, 0x1A15, + 0x76F4, 0x76F4, 0x065C, 0x76F5, 0x76F5, 0x1A18, 0x76F7, 0x76F7, 0x1B9C, + 0x76F8, 0x76F8, 0x07B4, 0x76F9, 0x76F9, 0x07B3, 0x76FA, 0x76FA, 0x1B9E, + 0x76FB, 0x76FB, 0x1B9D, 0x76FC, 0x76FC, 0x07B8, 0x76FE, 0x76FE, 0x07B7, + 0x7701, 0x7701, 0x07B2, 0x7703, 0x7705, 0x1B98, 0x7707, 0x7707, 0x07B9, + 0x7708, 0x7708, 0x1B97, 0x7709, 0x7709, 0x07B5, 0x770A, 0x770A, 0x1B9B, + 0x770B, 0x770B, 0x07B6, 0x770C, 0x770C, 0x3D62, 0x770E, 0x770F, 0x3B02, + 0x7710, 0x7710, 0x1D5D, 0x7711, 0x7711, 0x1D61, 0x7712, 0x7712, 0x1D5F, + 0x7713, 0x7713, 0x1D5E, 0x7715, 0x7715, 0x1D62, 0x7719, 0x771A, 0x1D63, + 0x771B, 0x771B, 0x1D5C, 0x771D, 0x771D, 0x1D5B, 0x771E, 0x771E, 0x42DE, + 0x771F, 0x7720, 0x0946, 0x7722, 0x7722, 0x1D65, 0x7723, 0x7723, 0x1D60, + 0x7724, 0x7724, 0x3FE8, 0x7725, 0x7725, 0x1FB2, 0x7726, 0x7726, 0x42DF, + 0x7727, 0x7727, 0x1D66, 0x7728, 0x7728, 0x0948, 0x7729, 0x7729, 0x0945, + 0x772B, 0x772B, 0x3FF3, 0x772D, 0x772D, 0x1FAC, 0x772F, 0x772F, 0x1FAB, + 0x7731, 0x7732, 0x1FAD, 0x7733, 0x7733, 0x1FB0, 0x7734, 0x7734, 0x1FAF, + 0x7735, 0x7735, 0x1FB4, 0x7736, 0x7736, 0x0B3C, 0x7737, 0x7737, 0x0B39, + 0x7738, 0x7738, 0x0B3D, 0x7739, 0x7739, 0x1FAA, 0x773A, 0x773A, 0x0B3E, + 0x773B, 0x773B, 0x1FB3, 0x773C, 0x773C, 0x0B3B, 0x773D, 0x773D, 0x1FB1, + 0x773E, 0x773E, 0x0B3A, 0x7740, 0x7740, 0x42E0, 0x7743, 0x7743, 0x470A, + 0x7744, 0x7744, 0x2231, 0x7745, 0x7745, 0x2233, 0x7746, 0x7747, 0x222F, + 0x774A, 0x774A, 0x2234, 0x774B, 0x774C, 0x2236, 0x774D, 0x774D, 0x2232, + 0x774E, 0x774E, 0x2235, 0x774F, 0x774F, 0x0CF4, 0x7752, 0x7752, 0x24C4, + 0x7754, 0x7754, 0x24C9, 0x7755, 0x7755, 0x24C1, 0x7756, 0x7756, 0x24C5, + 0x7758, 0x7758, 0x42E3, 0x7759, 0x7759, 0x24CA, 0x775A, 0x775A, 0x24C6, + 0x775B, 0x775B, 0x0E92, 0x775C, 0x775C, 0x0E9A, 0x775E, 0x775E, 0x0E95, + 0x775F, 0x7760, 0x24C2, 0x7761, 0x7761, 0x103D, 0x7762, 0x7762, 0x0E9D, + 0x7763, 0x7763, 0x0E96, 0x7765, 0x7765, 0x0E9B, 0x7766, 0x7766, 0x0E94, + 0x7767, 0x7767, 0x24C8, 0x7768, 0x7768, 0x0E9C, 0x7769, 0x7769, 0x24C7, + 0x776A, 0x776A, 0x0E98, 0x776B, 0x776B, 0x0E93, 0x776C, 0x776C, 0x0E99, + 0x776D, 0x776D, 0x24CB, 0x776E, 0x776E, 0x2743, 0x776F, 0x776F, 0x2745, + 0x7772, 0x7772, 0x396B, 0x7777, 0x7777, 0x46A9, 0x7778, 0x7778, 0x3B00, + 0x7779, 0x7779, 0x0E97, 0x777A, 0x777A, 0x4317, 0x777B, 0x777B, 0x3B04, + 0x777C, 0x777C, 0x2740, 0x777D, 0x777D, 0x103B, 0x777E, 0x777E, 0x2746, + 0x777F, 0x777F, 0x103C, 0x7780, 0x7780, 0x2744, 0x7781, 0x7781, 0x273F, + 0x7782, 0x7782, 0x2742, 0x7783, 0x7783, 0x2747, 0x7784, 0x7784, 0x103A, + 0x7785, 0x7785, 0x2741, 0x7787, 0x7787, 0x11B7, 0x7788, 0x7788, 0x2990, + 0x7789, 0x7789, 0x298F, 0x778B, 0x778B, 0x11BA, 0x778C, 0x778C, 0x11B8, + 0x778D, 0x778D, 0x298D, 0x778E, 0x778E, 0x11B6, 0x778F, 0x778F, 0x298E, + 0x7791, 0x7791, 0x11B9, 0x7793, 0x7793, 0x382D, 0x7795, 0x7795, 0x2BE6, + 0x7797, 0x7797, 0x2BE8, 0x7798, 0x7798, 0x470E, 0x7799, 0x7799, 0x2BE7, + 0x779A, 0x779A, 0x2BDF, 0x779B, 0x779B, 0x2BE3, 0x779C, 0x779C, 0x2BE2, + 0x779D, 0x779D, 0x2BE0, 0x779E, 0x779F, 0x1308, 0x77A0, 0x77A0, 0x1307, + 0x77A1, 0x77A1, 0x2BE1, 0x77A2, 0x77A3, 0x2BE4, 0x77A5, 0x77A5, 0x130A, + 0x77A7, 0x77A7, 0x141C, 0x77A8, 0x77A8, 0x2DC0, 0x77AA, 0x77AA, 0x1419, + 0x77AB, 0x77AB, 0x2DBA, 0x77AC, 0x77AC, 0x141B, 0x77AD, 0x77AD, 0x141D, + 0x77AF, 0x77AF, 0x42E5, 0x77B0, 0x77B0, 0x141A, 0x77B1, 0x77B1, 0x2DBF, + 0x77B2, 0x77B2, 0x2DBB, 0x77B3, 0x77B3, 0x1418, 0x77B4, 0x77B4, 0x2DBE, + 0x77B5, 0x77B5, 0x2DB9, 0x77B6, 0x77B6, 0x2DBD, 0x77B7, 0x77B7, 0x2DBC, + 0x77B9, 0x77B9, 0x3E73, 0x77BA, 0x77BA, 0x2F6B, 0x77BB, 0x77BC, 0x14FC, + 0x77BD, 0x77BD, 0x14FA, 0x77BE, 0x77BE, 0x4711, 0x77BF, 0x77BF, 0x14FB, + 0x77C2, 0x77C2, 0x2F6A, 0x77C3, 0x77C3, 0x3BB1, 0x77C4, 0x77C4, 0x30C8, + 0x77C5, 0x77C5, 0x41C1, 0x77C7, 0x77C7, 0x159E, 0x77C9, 0x77CA, 0x30C6, + 0x77CB, 0x77CB, 0x4712, 0x77CC, 0x77CC, 0x31FE, 0x77CD, 0x77CD, 0x3201, + 0x77CE, 0x77CF, 0x31FF, 0x77D0, 0x77D0, 0x32E5, 0x77D3, 0x77D3, 0x1680, + 0x77D4, 0x77D4, 0x3429, 0x77D5, 0x77D5, 0x348F, 0x77D7, 0x77D7, 0x1725, + 0x77D8, 0x77D9, 0x34D3, 0x77DA, 0x77DA, 0x1753, 0x77DB, 0x77DB, 0x0367, + 0x77DC, 0x77DC, 0x07BA, 0x77DE, 0x77DE, 0x2238, 0x77E0, 0x77E0, 0x24CC, + 0x77E2, 0x77E2, 0x0368, 0x77E3, 0x77E3, 0x04F6, 0x77E5, 0x77E5, 0x065D, + 0x77E6, 0x77E6, 0x4081, 0x77E7, 0x77E8, 0x1B9F, 0x77E9, 0x77E9, 0x0949, + 0x77EC, 0x77EC, 0x2239, 0x77ED, 0x77ED, 0x0CF5, 0x77EE, 0x77EE, 0x0E9E, + 0x77EF, 0x77EF, 0x141E, 0x77F0, 0x77F0, 0x2DC1, 0x77F1, 0x77F1, 0x30C9, + 0x77F2, 0x77F2, 0x3202, 0x77F3, 0x77F3, 0x0369, 0x77F4, 0x77F4, 0x42E9, + 0x77F7, 0x77F7, 0x1A1E, 0x77F8, 0x77F8, 0x1A19, 0x77F9, 0x77F9, 0x1A1B, + 0x77FA, 0x77FA, 0x1A1D, 0x77FB, 0x77FB, 0x1A1C, 0x77FC, 0x77FC, 0x1A1A, + 0x77FD, 0x77FD, 0x065E, 0x77FE, 0x77FE, 0x3FD5, 0x7802, 0x7802, 0x07BB, + 0x7803, 0x7803, 0x1BA9, 0x7805, 0x7805, 0x1BA4, 0x7806, 0x7806, 0x1BA1, + 0x7808, 0x7808, 0x3E46, 0x7809, 0x7809, 0x1BA8, 0x780C, 0x780D, 0x07BD, + 0x780E, 0x780E, 0x1BA7, 0x780F, 0x780F, 0x1BA6, 0x7810, 0x7810, 0x1BA5, + 0x7811, 0x7812, 0x1BA2, 0x7813, 0x7813, 0x1BAA, 0x7814, 0x7814, 0x07BC, + 0x7818, 0x7818, 0x4713, 0x781C, 0x781C, 0x4714, 0x781D, 0x781D, 0x094D, + 0x781E, 0x781E, 0x3B13, 0x781F, 0x781F, 0x0953, 0x7820, 0x7820, 0x0952, + 0x7821, 0x7821, 0x1D6F, 0x7822, 0x7822, 0x1D69, 0x7823, 0x7823, 0x1D67, + 0x7825, 0x7825, 0x0950, 0x7826, 0x7826, 0x1FBB, 0x7827, 0x7827, 0x094B, + 0x7828, 0x7828, 0x1D6C, 0x7829, 0x7829, 0x1D70, 0x782A, 0x782A, 0x1D72, + 0x782B, 0x782B, 0x1D6E, 0x782C, 0x782C, 0x1D68, 0x782D, 0x782D, 0x0951, + 0x782E, 0x782E, 0x1D6D, 0x782F, 0x782F, 0x1D6B, 0x7830, 0x7830, 0x094A, + 0x7831, 0x7831, 0x1D73, 0x7832, 0x7832, 0x0954, 0x7833, 0x7833, 0x1D71, + 0x7834, 0x7834, 0x094E, 0x7835, 0x7835, 0x1D6A, 0x7837, 0x7837, 0x094F, + 0x7838, 0x7838, 0x094C, 0x7839, 0x7839, 0x43D6, 0x783C, 0x783C, 0x401A, + 0x783D, 0x783D, 0x3C6A, 0x7842, 0x7842, 0x3AC4, 0x7843, 0x7843, 0x0B40, + 0x7844, 0x7844, 0x3C2B, 0x7845, 0x7845, 0x1FBC, 0x7847, 0x7847, 0x4715, + 0x7848, 0x7848, 0x1FB5, 0x7849, 0x7849, 0x1FB7, 0x784A, 0x784A, 0x1FB9, + 0x784B, 0x784B, 0x3C6D, 0x784C, 0x784C, 0x1FBA, 0x784D, 0x784D, 0x1FB8, + 0x784E, 0x784E, 0x0B41, 0x7850, 0x7850, 0x1FBD, 0x7851, 0x7851, 0x4716, + 0x7852, 0x7852, 0x1FB6, 0x7853, 0x7853, 0x3F95, 0x7854, 0x7854, 0x3C6B, + 0x785C, 0x785C, 0x223D, 0x785D, 0x785D, 0x0CF6, 0x785E, 0x785E, 0x2245, + 0x7860, 0x7860, 0x223A, 0x7862, 0x7862, 0x2246, 0x7864, 0x7865, 0x223B, + 0x7866, 0x7866, 0x4717, 0x7868, 0x7868, 0x2244, 0x7869, 0x7869, 0x2243, + 0x786A, 0x786A, 0x2240, 0x786B, 0x786B, 0x0B3F, 0x786C, 0x786C, 0x0CF7, + 0x786D, 0x786D, 0x223E, 0x786E, 0x786E, 0x2241, 0x786F, 0x786F, 0x0CF8, + 0x7870, 0x7870, 0x2242, 0x7871, 0x7871, 0x223F, 0x7879, 0x7879, 0x24D7, + 0x787A, 0x787A, 0x3EE9, 0x787B, 0x787B, 0x24DB, 0x787C, 0x787C, 0x0EA5, + 0x787E, 0x787E, 0x274D, 0x787F, 0x787F, 0x0EA8, 0x7880, 0x7880, 0x24D9, + 0x7881, 0x7881, 0x36E8, 0x7883, 0x7883, 0x24D6, 0x7884, 0x7884, 0x24D1, + 0x7885, 0x7886, 0x24D3, 0x7887, 0x7887, 0x24CD, 0x7888, 0x7888, 0x3B15, + 0x7889, 0x7889, 0x0EA4, 0x788C, 0x788C, 0x0EA3, 0x788D, 0x788D, 0x3B14, + 0x788E, 0x788E, 0x0E9F, 0x788F, 0x788F, 0x24D0, 0x7891, 0x7891, 0x0EA6, + 0x7893, 0x7893, 0x0EA7, 0x7894, 0x7894, 0x24CF, 0x7895, 0x7895, 0x24D2, + 0x7896, 0x7896, 0x24DA, 0x7897, 0x7898, 0x0EA1, 0x7899, 0x7899, 0x24D8, + 0x789A, 0x789A, 0x24CE, 0x789E, 0x789E, 0x274F, 0x789F, 0x789F, 0x103F, + 0x78A0, 0x78A0, 0x2751, 0x78A1, 0x78A1, 0x24D5, 0x78A2, 0x78A2, 0x2753, + 0x78A3, 0x78A3, 0x1043, 0x78A4, 0x78A4, 0x2754, 0x78A5, 0x78A5, 0x2750, + 0x78A7, 0x78A7, 0x1040, 0x78A8, 0x78A8, 0x274C, 0x78A9, 0x78A9, 0x1042, + 0x78AA, 0x78AA, 0x2749, 0x78AB, 0x78AB, 0x274E, 0x78AC, 0x78AC, 0x2752, + 0x78AD, 0x78AD, 0x274B, 0x78AF, 0x78AF, 0x42EC, 0x78B0, 0x78B0, 0x0EA0, + 0x78B1, 0x78B1, 0x42F4, 0x78B2, 0x78B2, 0x2748, 0x78B3, 0x78B3, 0x1041, + 0x78B4, 0x78B4, 0x274A, 0x78B6, 0x78B6, 0x3C6C, 0x78B8, 0x78B8, 0x4571, + 0x78B9, 0x78B9, 0x3C63, 0x78BA, 0x78BA, 0x11BD, 0x78BB, 0x78BB, 0x2992, + 0x78BC, 0x78BC, 0x11C1, 0x78BE, 0x78BE, 0x11BF, 0x78C1, 0x78C1, 0x103E, + 0x78C3, 0x78C4, 0x2999, 0x78C5, 0x78C5, 0x11BC, 0x78C7, 0x78C7, 0x42ED, + 0x78C8, 0x78C8, 0x2998, 0x78C9, 0x78C9, 0x299B, 0x78CA, 0x78CA, 0x11BE, + 0x78CB, 0x78CB, 0x11BB, 0x78CC, 0x78CC, 0x2994, 0x78CD, 0x78CD, 0x2991, + 0x78CE, 0x78CE, 0x2996, 0x78CF, 0x78CF, 0x2993, 0x78D0, 0x78D0, 0x11C2, + 0x78D1, 0x78D1, 0x2995, 0x78D2, 0x78D2, 0x3B16, 0x78D3, 0x78D3, 0x42EE, + 0x78D4, 0x78D4, 0x2997, 0x78D5, 0x78D5, 0x11C0, 0x78D7, 0x78D7, 0x42F2, + 0x78D8, 0x78D8, 0x3F8C, 0x78DA, 0x78DA, 0x130C, 0x78DB, 0x78DB, 0x2BEF, + 0x78DD, 0x78DD, 0x2BE9, 0x78DE, 0x78DE, 0x2BED, 0x78DF, 0x78E0, 0x2BF3, + 0x78E1, 0x78E2, 0x2BF0, 0x78E3, 0x78E3, 0x2BEE, 0x78E5, 0x78E5, 0x2BEB, + 0x78E7, 0x78E7, 0x130E, 0x78E8, 0x78E8, 0x130B, 0x78E9, 0x78E9, 0x2BEA, + 0x78EA, 0x78EA, 0x2BEC, 0x78EC, 0x78EC, 0x130D, 0x78ED, 0x78ED, 0x2BF2, + 0x78EE, 0x78EE, 0x3A81, 0x78EF, 0x78EF, 0x1422, 0x78F0, 0x78F0, 0x3B3A, + 0x78F1, 0x78F1, 0x40BE, 0x78F2, 0x78F2, 0x2DC8, 0x78F3, 0x78F3, 0x2DC2, + 0x78F4, 0x78F4, 0x1421, 0x78F5, 0x78F5, 0x38B3, 0x78F7, 0x78F7, 0x141F, + 0x78F9, 0x78F9, 0x2DCA, 0x78FA, 0x78FA, 0x1420, 0x78FB, 0x78FC, 0x2DC5, + 0x78FD, 0x78FD, 0x2DC3, 0x78FE, 0x78FE, 0x2DCB, 0x78FF, 0x78FF, 0x2DC7, + 0x7901, 0x7901, 0x1423, 0x7902, 0x7902, 0x2DC4, 0x7904, 0x7904, 0x2DCC, + 0x7905, 0x7905, 0x2DC9, 0x7906, 0x7906, 0x3FCF, 0x7909, 0x7909, 0x2F6F, + 0x790C, 0x790C, 0x2F6C, 0x790E, 0x790E, 0x14FE, 0x7910, 0x7910, 0x2F70, + 0x7911, 0x7911, 0x2F72, 0x7912, 0x7912, 0x2F71, 0x7913, 0x7914, 0x2F6D, + 0x7917, 0x7917, 0x30CE, 0x7919, 0x7919, 0x159F, 0x791B, 0x791B, 0x30CB, + 0x791C, 0x791C, 0x30CD, 0x791D, 0x791D, 0x30CA, 0x791E, 0x791E, 0x30CF, + 0x7921, 0x7921, 0x30CC, 0x7923, 0x7923, 0x3204, 0x7924, 0x7924, 0x3207, + 0x7925, 0x7925, 0x3203, 0x7926, 0x7926, 0x1624, 0x7927, 0x7928, 0x3205, + 0x7929, 0x7929, 0x3208, 0x792A, 0x792A, 0x1625, 0x792B, 0x792B, 0x1627, + 0x792C, 0x792C, 0x1626, 0x792D, 0x792D, 0x32E6, 0x792E, 0x792E, 0x42F0, + 0x792F, 0x792F, 0x32E8, 0x7931, 0x7931, 0x32E7, 0x7932, 0x7932, 0x471B, + 0x7933, 0x7933, 0x471A, 0x7934, 0x7934, 0x42F3, 0x7935, 0x7935, 0x3397, + 0x7936, 0x7936, 0x3783, 0x7938, 0x7938, 0x3490, 0x7939, 0x7939, 0x34D5, + 0x793A, 0x793A, 0x036A, 0x793B, 0x793B, 0x44F7, 0x793C, 0x793C, 0x4300, + 0x793D, 0x793D, 0x18D7, 0x793E, 0x793E, 0x065F, 0x793F, 0x793F, 0x1A20, + 0x7940, 0x7941, 0x0660, 0x7942, 0x7942, 0x1A1F, 0x7944, 0x7944, 0x1BAF, + 0x7945, 0x7945, 0x1BAE, 0x7946, 0x7946, 0x07BF, 0x7947, 0x7947, 0x07C2, + 0x7948, 0x7948, 0x07C1, 0x7949, 0x7949, 0x07C0, 0x794A, 0x794A, 0x1BAB, + 0x794B, 0x794B, 0x1BAD, 0x794C, 0x794C, 0x1BAC, 0x794F, 0x794F, 0x1D76, + 0x7950, 0x7950, 0x0956, 0x7951, 0x7951, 0x1D7A, 0x7952, 0x7952, 0x1D79, + 0x7953, 0x7953, 0x1D78, 0x7954, 0x7954, 0x1D74, 0x7955, 0x7955, 0x0955, + 0x7956, 0x7956, 0x0959, 0x7957, 0x7957, 0x095C, 0x7958, 0x7958, 0x37E5, + 0x7959, 0x7959, 0x3B18, 0x795A, 0x795A, 0x095D, 0x795B, 0x795B, 0x1D75, + 0x795C, 0x795C, 0x1D77, 0x795D, 0x795D, 0x095B, 0x795E, 0x795E, 0x095A, + 0x795F, 0x795F, 0x0958, 0x7960, 0x7960, 0x0957, 0x7961, 0x7961, 0x1FC4, + 0x7962, 0x7962, 0x3E7D, 0x7963, 0x7963, 0x1FC2, 0x7964, 0x7964, 0x1FBE, + 0x7965, 0x7965, 0x0B42, 0x7967, 0x7967, 0x1FBF, 0x7968, 0x7968, 0x0B43, + 0x7969, 0x796A, 0x1FC0, 0x796B, 0x796B, 0x1FC3, 0x796D, 0x796D, 0x0B44, + 0x7970, 0x7970, 0x224A, 0x7971, 0x7971, 0x4168, 0x7972, 0x7972, 0x2249, + 0x7973, 0x7973, 0x2248, 0x7974, 0x7974, 0x2247, 0x7979, 0x7979, 0x24DF, + 0x797A, 0x797A, 0x0EA9, 0x797C, 0x797C, 0x24DC, 0x797D, 0x797D, 0x24DE, + 0x797E, 0x797E, 0x3E26, 0x797F, 0x797F, 0x0EAA, 0x7980, 0x7980, 0x42FC, + 0x7981, 0x7981, 0x0EAB, 0x7982, 0x7982, 0x24DD, 0x7983, 0x7983, 0x3DF6, + 0x7986, 0x7986, 0x42F9, 0x7987, 0x7987, 0x4588, 0x7988, 0x7988, 0x275D, + 0x798A, 0x798B, 0x2756, 0x798D, 0x798D, 0x1046, 0x798E, 0x798F, 0x1044, + 0x7990, 0x7990, 0x275F, 0x7991, 0x7991, 0x471D, 0x7992, 0x7992, 0x275E, + 0x7993, 0x7993, 0x275B, 0x7994, 0x7994, 0x275A, 0x7995, 0x7995, 0x2759, + 0x7996, 0x7996, 0x2758, 0x7997, 0x7997, 0x275C, 0x7998, 0x7998, 0x2755, + 0x7999, 0x7999, 0x43FC, 0x799A, 0x799A, 0x299C, 0x799B, 0x799B, 0x29A1, + 0x799C, 0x799C, 0x299F, 0x799D, 0x799D, 0x42FE, 0x799F, 0x799F, 0x395E, + 0x79A0, 0x79A0, 0x299E, 0x79A1, 0x79A1, 0x299D, 0x79A2, 0x79A2, 0x29A0, + 0x79A4, 0x79A4, 0x2BF5, 0x79A5, 0x79A5, 0x3B1E, 0x79A6, 0x79A6, 0x130F, + 0x79A7, 0x79A7, 0x1424, 0x79A8, 0x79A8, 0x2DCE, 0x79A9, 0x79A9, 0x4301, + 0x79AA, 0x79AA, 0x1425, 0x79AB, 0x79AB, 0x2DCD, 0x79AC, 0x79AC, 0x2F74, + 0x79AD, 0x79AD, 0x2F73, 0x79AE, 0x79AE, 0x14FF, 0x79B0, 0x79B0, 0x30D0, + 0x79B1, 0x79B1, 0x15A0, 0x79B2, 0x79B2, 0x3209, 0x79B3, 0x79B3, 0x16CF, + 0x79B4, 0x79B4, 0x3398, 0x79B6, 0x79B6, 0x3492, 0x79B7, 0x79B7, 0x3491, + 0x79B8, 0x79B8, 0x17B2, 0x79B9, 0x79BA, 0x07C3, 0x79BB, 0x79BB, 0x1FC5, + 0x79BD, 0x79BD, 0x0EAD, 0x79BE, 0x79BE, 0x036B, 0x79BF, 0x79BF, 0x04F9, + 0x79C0, 0x79C0, 0x04F8, 0x79C1, 0x79C1, 0x04F7, 0x79C4, 0x79C4, 0x3CCD, + 0x79C5, 0x79C5, 0x1A21, 0x79C6, 0x79C6, 0x4305, 0x79C8, 0x79C8, 0x0663, + 0x79C9, 0x79C9, 0x0662, 0x79CB, 0x79CB, 0x07C7, 0x79CC, 0x79CC, 0x4233, + 0x79CD, 0x79CD, 0x1BB1, 0x79CE, 0x79CE, 0x1BB4, 0x79CF, 0x79CF, 0x1BB2, + 0x79D1, 0x79D2, 0x07C5, 0x79D4, 0x79D4, 0x4307, 0x79D5, 0x79D5, 0x1BB0, + 0x79D6, 0x79D6, 0x1BB3, 0x79D8, 0x79D8, 0x0964, 0x79DC, 0x79DC, 0x1D81, + 0x79DD, 0x79DD, 0x1D83, 0x79DE, 0x79DE, 0x1D82, 0x79DF, 0x79DF, 0x0961, + 0x79E0, 0x79E0, 0x1D7D, 0x79E2, 0x79E2, 0x3C5A, 0x79E3, 0x79E3, 0x095F, + 0x79E4, 0x79E4, 0x095E, 0x79E6, 0x79E6, 0x0962, 0x79E7, 0x79E7, 0x0960, + 0x79E9, 0x79E9, 0x0963, 0x79EA, 0x79EA, 0x1D80, 0x79EB, 0x79EC, 0x1D7B, + 0x79ED, 0x79ED, 0x1D7F, 0x79EE, 0x79EE, 0x1D7E, 0x79F1, 0x79F1, 0x3B27, + 0x79F4, 0x79F4, 0x3B22, 0x79F6, 0x79F7, 0x1FC8, 0x79F8, 0x79F8, 0x1FC7, + 0x79FA, 0x79FA, 0x1FC6, 0x79FB, 0x79FB, 0x0B45, 0x7A00, 0x7A00, 0x0CFD, + 0x7A02, 0x7A02, 0x224B, 0x7A03, 0x7A03, 0x224D, 0x7A04, 0x7A04, 0x224F, + 0x7A05, 0x7A05, 0x0CFC, 0x7A06, 0x7A06, 0x471E, 0x7A08, 0x7A08, 0x0CFA, + 0x7A0A, 0x7A0A, 0x224C, 0x7A0B, 0x7A0B, 0x0CFB, 0x7A0C, 0x7A0C, 0x224E, + 0x7A0D, 0x7A0D, 0x0CF9, 0x7A10, 0x7A10, 0x24E9, 0x7A11, 0x7A11, 0x24E0, + 0x7A12, 0x7A12, 0x24E3, 0x7A13, 0x7A13, 0x24E7, 0x7A14, 0x7A14, 0x0EB1, + 0x7A15, 0x7A15, 0x24E5, 0x7A17, 0x7A17, 0x24E4, 0x7A18, 0x7A19, 0x24E1, + 0x7A1A, 0x7A1A, 0x0EAF, 0x7A1B, 0x7A1B, 0x24E8, 0x7A1C, 0x7A1C, 0x0EAE, + 0x7A1E, 0x7A1E, 0x0EB3, 0x7A1F, 0x7A1F, 0x0EB2, 0x7A20, 0x7A20, 0x0EB0, + 0x7A22, 0x7A22, 0x24E6, 0x7A26, 0x7A26, 0x2765, 0x7A28, 0x7A28, 0x2764, + 0x7A2B, 0x7A2B, 0x2760, 0x7A2D, 0x7A2D, 0x3FDA, 0x7A2E, 0x7A2E, 0x1047, + 0x7A2F, 0x7A2F, 0x2763, 0x7A30, 0x7A30, 0x2762, 0x7A31, 0x7A31, 0x1048, + 0x7A37, 0x7A37, 0x11C7, 0x7A39, 0x7A39, 0x29A3, 0x7A3A, 0x7A3A, 0x3B21, + 0x7A3B, 0x7A3B, 0x11C8, 0x7A3C, 0x7A3C, 0x11C4, 0x7A3D, 0x7A3D, 0x11C6, + 0x7A3E, 0x7A3E, 0x3F8B, 0x7A3F, 0x7A3F, 0x11C3, 0x7A40, 0x7A40, 0x11C5, + 0x7A43, 0x7A43, 0x396C, 0x7A44, 0x7A44, 0x2BF6, 0x7A45, 0x7A45, 0x3DF1, + 0x7A46, 0x7A46, 0x1312, 0x7A47, 0x7A47, 0x2BF8, 0x7A48, 0x7A48, 0x2BF7, + 0x7A49, 0x7A49, 0x3733, 0x7A4A, 0x7A4A, 0x2761, 0x7A4B, 0x7A4B, 0x1314, + 0x7A4C, 0x7A4C, 0x1313, 0x7A4D, 0x7A4E, 0x1310, 0x7A54, 0x7A54, 0x2DD3, + 0x7A56, 0x7A56, 0x2DD1, 0x7A57, 0x7A57, 0x1426, 0x7A58, 0x7A58, 0x2DD2, + 0x7A5A, 0x7A5A, 0x2DD4, 0x7A5B, 0x7A5B, 0x2DD0, 0x7A5C, 0x7A5C, 0x2DCF, + 0x7A5F, 0x7A5F, 0x2F75, 0x7A60, 0x7A60, 0x1502, 0x7A61, 0x7A62, 0x1500, + 0x7A65, 0x7A65, 0x3736, 0x7A67, 0x7A68, 0x30D1, 0x7A69, 0x7A69, 0x15A2, + 0x7A6B, 0x7A6B, 0x15A1, 0x7A6C, 0x7A6D, 0x320B, 0x7A6E, 0x7A6E, 0x320A, + 0x7A70, 0x7A71, 0x3399, 0x7A74, 0x7A74, 0x036C, 0x7A75, 0x7A75, 0x1811, + 0x7A76, 0x7A76, 0x04FA, 0x7A78, 0x7A78, 0x1A22, 0x7A79, 0x7A79, 0x0665, + 0x7A7A, 0x7A7A, 0x0664, 0x7A7B, 0x7A7B, 0x1A23, 0x7A7D, 0x7A7D, 0x3737, + 0x7A7E, 0x7A7E, 0x1BB6, 0x7A7F, 0x7A7F, 0x07C8, 0x7A80, 0x7A80, 0x1BB5, + 0x7A81, 0x7A81, 0x07C9, 0x7A83, 0x7A83, 0x3D7D, 0x7A84, 0x7A84, 0x0965, + 0x7A85, 0x7A85, 0x1D86, 0x7A86, 0x7A86, 0x1D84, 0x7A87, 0x7A87, 0x1D8A, + 0x7A88, 0x7A88, 0x0966, 0x7A89, 0x7A89, 0x1D85, 0x7A8A, 0x7A8A, 0x1D89, + 0x7A8B, 0x7A8C, 0x1D87, 0x7A8F, 0x7A8F, 0x1FCA, 0x7A90, 0x7A90, 0x1FCC, + 0x7A91, 0x7A91, 0x43D8, 0x7A92, 0x7A92, 0x0B46, 0x7A94, 0x7A94, 0x1FCB, + 0x7A95, 0x7A95, 0x0B47, 0x7A96, 0x7A96, 0x0D00, 0x7A97, 0x7A97, 0x0CFF, + 0x7A98, 0x7A98, 0x0CFE, 0x7A99, 0x7A99, 0x2250, 0x7A9E, 0x7A9E, 0x24EC, + 0x7A9F, 0x7AA0, 0x0EB4, 0x7AA2, 0x7AA2, 0x24EB, 0x7AA3, 0x7AA3, 0x24EA, + 0x7AA8, 0x7AA8, 0x2766, 0x7AA9, 0x7AA9, 0x104A, 0x7AAA, 0x7AAA, 0x1049, + 0x7AAB, 0x7AAC, 0x2767, 0x7AAE, 0x7AAE, 0x11CA, 0x7AAF, 0x7AAF, 0x11C9, + 0x7AB0, 0x7AB0, 0x373A, 0x7AB1, 0x7AB1, 0x2BFC, 0x7AB2, 0x7AB2, 0x29A4, + 0x7AB3, 0x7AB3, 0x29A6, 0x7AB4, 0x7AB4, 0x29A5, 0x7AB5, 0x7AB5, 0x2BFB, + 0x7AB6, 0x7AB6, 0x2BF9, 0x7AB7, 0x7AB7, 0x2BFD, 0x7AB8, 0x7AB8, 0x2BFA, + 0x7ABA, 0x7ABA, 0x1315, 0x7ABB, 0x7ABB, 0x3739, 0x7ABC, 0x7ABC, 0x4721, + 0x7ABE, 0x7ABE, 0x2DD5, 0x7ABF, 0x7ABF, 0x1427, 0x7AC0, 0x7AC1, 0x2DD6, + 0x7AC2, 0x7AC3, 0x373B, 0x7AC4, 0x7AC5, 0x1503, 0x7AC7, 0x7AC7, 0x1628, + 0x7AC8, 0x7AC8, 0x3D7F, 0x7AC9, 0x7AC9, 0x4570, 0x7ACA, 0x7ACA, 0x16FF, + 0x7ACB, 0x7ACB, 0x036D, 0x7ACF, 0x7ACF, 0x4724, 0x7AD1, 0x7AD1, 0x1BB7, + 0x7AD3, 0x7AD3, 0x3F8A, 0x7AD8, 0x7AD8, 0x1D8B, 0x7AD9, 0x7AD9, 0x0967, + 0x7ADA, 0x7ADA, 0x3740, 0x7ADB, 0x7ADB, 0x4725, 0x7ADC, 0x7ADC, 0x3951, + 0x7ADD, 0x7ADD, 0x3741, 0x7ADF, 0x7ADF, 0x0BDE, 0x7AE0, 0x7AE0, 0x0BDD, + 0x7AE2, 0x7AE2, 0x3B33, 0x7AE3, 0x7AE3, 0x0D02, 0x7AE4, 0x7AE4, 0x2252, + 0x7AE5, 0x7AE5, 0x0D01, 0x7AE6, 0x7AE6, 0x2251, 0x7AE7, 0x7AE7, 0x385D, + 0x7AE9, 0x7AE9, 0x3831, 0x7AEA, 0x7AEA, 0x3742, 0x7AEB, 0x7AEB, 0x24ED, + 0x7AED, 0x7AED, 0x104B, 0x7AEE, 0x7AEE, 0x2769, 0x7AEF, 0x7AEF, 0x104C, + 0x7AF6, 0x7AF6, 0x1629, 0x7AF7, 0x7AF7, 0x320D, 0x7AF9, 0x7AF9, 0x03F6, + 0x7AFA, 0x7AFA, 0x0666, 0x7AFB, 0x7AFB, 0x1A24, 0x7AFD, 0x7AFD, 0x07CB, + 0x7AFE, 0x7AFE, 0x3B3D, 0x7AFF, 0x7AFF, 0x07CA, 0x7B00, 0x7B01, 0x1BB8, + 0x7B04, 0x7B04, 0x1D8D, 0x7B05, 0x7B05, 0x1D8F, 0x7B06, 0x7B06, 0x0968, + 0x7B08, 0x7B08, 0x1D91, 0x7B09, 0x7B09, 0x1D94, 0x7B0A, 0x7B0A, 0x1D92, + 0x7B0B, 0x7B0B, 0x3746, 0x7B0C, 0x7B0C, 0x3B63, 0x7B0E, 0x7B0E, 0x1D93, + 0x7B0F, 0x7B0F, 0x1D90, 0x7B10, 0x7B10, 0x1D8C, 0x7B11, 0x7B11, 0x0969, + 0x7B12, 0x7B12, 0x1D95, 0x7B13, 0x7B13, 0x1D8E, 0x7B14, 0x7B14, 0x3F77, + 0x7B18, 0x7B18, 0x1FD5, 0x7B19, 0x7B19, 0x0B4D, 0x7B1A, 0x7B1A, 0x1FDE, + 0x7B1B, 0x7B1B, 0x0B4A, 0x7B1D, 0x7B1D, 0x1FD7, 0x7B1E, 0x7B1E, 0x0B4E, + 0x7B1F, 0x7B1F, 0x3F11, 0x7B20, 0x7B20, 0x0B48, 0x7B22, 0x7B22, 0x1FD2, + 0x7B23, 0x7B23, 0x1FDF, 0x7B24, 0x7B24, 0x1FD3, 0x7B25, 0x7B25, 0x1FD0, + 0x7B26, 0x7B26, 0x0B4C, 0x7B27, 0x7B27, 0x3B5F, 0x7B28, 0x7B28, 0x0B49, + 0x7B29, 0x7B29, 0x3748, 0x7B2A, 0x7B2A, 0x1FD6, 0x7B2B, 0x7B2B, 0x1FD9, + 0x7B2C, 0x7B2C, 0x0B4B, 0x7B2D, 0x7B2D, 0x1FDA, 0x7B2E, 0x7B2E, 0x0B4F, + 0x7B2F, 0x7B2F, 0x1FDB, 0x7B30, 0x7B30, 0x1FD1, 0x7B31, 0x7B31, 0x1FD8, + 0x7B32, 0x7B32, 0x1FDC, 0x7B33, 0x7B33, 0x1FD4, 0x7B34, 0x7B34, 0x1FCF, + 0x7B35, 0x7B35, 0x1FCD, 0x7B38, 0x7B38, 0x1FDD, 0x7B39, 0x7B39, 0x3D6E, + 0x7B3B, 0x7B3B, 0x1FCE, 0x7B40, 0x7B40, 0x2259, 0x7B42, 0x7B42, 0x3DED, + 0x7B43, 0x7B43, 0x3E25, 0x7B44, 0x7B44, 0x2255, 0x7B45, 0x7B45, 0x225B, + 0x7B46, 0x7B46, 0x0D05, 0x7B47, 0x7B47, 0x2254, 0x7B48, 0x7B48, 0x2256, + 0x7B49, 0x7B49, 0x0D03, 0x7B4A, 0x7B4A, 0x2253, 0x7B4B, 0x7B4B, 0x0D0A, + 0x7B4C, 0x7B4C, 0x2257, 0x7B4D, 0x7B4D, 0x0D09, 0x7B4E, 0x7B4E, 0x2258, + 0x7B4F, 0x7B4F, 0x0D0B, 0x7B50, 0x7B50, 0x0D06, 0x7B51, 0x7B51, 0x0D0C, + 0x7B52, 0x7B52, 0x0D07, 0x7B54, 0x7B54, 0x0D08, 0x7B55, 0x7B55, 0x3747, + 0x7B56, 0x7B56, 0x0D04, 0x7B58, 0x7B58, 0x225A, 0x7B60, 0x7B60, 0x0EB8, + 0x7B61, 0x7B61, 0x24F8, 0x7B62, 0x7B62, 0x4727, 0x7B63, 0x7B63, 0x24FB, + 0x7B64, 0x7B64, 0x24EF, 0x7B65, 0x7B65, 0x24F4, 0x7B66, 0x7B66, 0x24EE, + 0x7B67, 0x7B67, 0x0EBA, 0x7B69, 0x7B69, 0x24F2, 0x7B6C, 0x7B6C, 0x4728, + 0x7B6D, 0x7B6D, 0x24F0, 0x7B6E, 0x7B6E, 0x0EB9, 0x7B6F, 0x7B6F, 0x374C, + 0x7B70, 0x7B70, 0x24F7, 0x7B71, 0x7B71, 0x24F6, 0x7B72, 0x7B72, 0x24F3, + 0x7B73, 0x7B73, 0x24F5, 0x7B74, 0x7B74, 0x24F1, 0x7B75, 0x7B75, 0x1050, + 0x7B76, 0x7B76, 0x24FA, 0x7B77, 0x7B77, 0x0EB6, 0x7B78, 0x7B78, 0x24F9, + 0x7B7B, 0x7B7B, 0x4729, 0x7B82, 0x7B82, 0x2779, 0x7B84, 0x7B84, 0x1057, + 0x7B85, 0x7B85, 0x2774, 0x7B87, 0x7B87, 0x1056, 0x7B88, 0x7B88, 0x276A, + 0x7B8A, 0x7B8A, 0x276C, 0x7B8B, 0x7B8B, 0x104F, 0x7B8C, 0x7B8C, 0x2771, + 0x7B8D, 0x7B8D, 0x2770, 0x7B8E, 0x7B8E, 0x2773, 0x7B8F, 0x7B8F, 0x1054, + 0x7B90, 0x7B90, 0x276E, 0x7B91, 0x7B91, 0x276D, 0x7B92, 0x7B92, 0x3752, + 0x7B94, 0x7B94, 0x1053, 0x7B95, 0x7B95, 0x104E, 0x7B96, 0x7B96, 0x276F, + 0x7B97, 0x7B97, 0x1051, 0x7B98, 0x7B98, 0x2775, 0x7B99, 0x7B99, 0x2777, + 0x7B9B, 0x7B9B, 0x2772, 0x7B9C, 0x7B9C, 0x276B, 0x7B9D, 0x7B9D, 0x1052, + 0x7BA0, 0x7BA0, 0x11D2, 0x7BA1, 0x7BA1, 0x104D, 0x7BA2, 0x7BA2, 0x374B, + 0x7BA3, 0x7BA3, 0x3F14, 0x7BA4, 0x7BA4, 0x2778, 0x7BAC, 0x7BAC, 0x29AA, + 0x7BAD, 0x7BAD, 0x11CB, 0x7BAF, 0x7BAF, 0x29AC, 0x7BB1, 0x7BB1, 0x11CC, + 0x7BB2, 0x7BB2, 0x461C, 0x7BB4, 0x7BB4, 0x11CE, 0x7BB5, 0x7BB5, 0x29AF, + 0x7BB7, 0x7BB7, 0x29A7, 0x7BB8, 0x7BB8, 0x1055, 0x7BB9, 0x7BB9, 0x29AD, + 0x7BBE, 0x7BBE, 0x29A9, 0x7BC0, 0x7BC0, 0x0EB7, 0x7BC1, 0x7BC1, 0x11D1, + 0x7BC4, 0x7BC4, 0x11CD, 0x7BC6, 0x7BC7, 0x11CF, 0x7BC9, 0x7BC9, 0x1318, + 0x7BCA, 0x7BCA, 0x29AE, 0x7BCB, 0x7BCB, 0x29A8, 0x7BCC, 0x7BCC, 0x11D3, + 0x7BCE, 0x7BCE, 0x29AB, 0x7BCF, 0x7BCF, 0x3F18, 0x7BD0, 0x7BD0, 0x3750, + 0x7BD4, 0x7BD4, 0x2C07, 0x7BD5, 0x7BD5, 0x2C02, 0x7BD8, 0x7BD8, 0x2C0C, + 0x7BD9, 0x7BD9, 0x1316, 0x7BDA, 0x7BDA, 0x2C04, 0x7BDB, 0x7BDB, 0x131A, + 0x7BDC, 0x7BDC, 0x2C0A, 0x7BDD, 0x7BDD, 0x2C01, 0x7BDE, 0x7BDE, 0x2BFE, + 0x7BDF, 0x7BDF, 0x2C0D, 0x7BE0, 0x7BE0, 0x142D, 0x7BE1, 0x7BE1, 0x131B, + 0x7BE2, 0x7BE2, 0x2C09, 0x7BE3, 0x7BE3, 0x2BFF, 0x7BE4, 0x7BE4, 0x1319, + 0x7BE5, 0x7BE5, 0x2C03, 0x7BE6, 0x7BE6, 0x131D, 0x7BE7, 0x7BE7, 0x2C00, + 0x7BE8, 0x7BE8, 0x2C05, 0x7BE9, 0x7BE9, 0x131C, 0x7BEA, 0x7BEA, 0x2C08, + 0x7BEB, 0x7BEB, 0x2C0B, 0x7BF0, 0x7BF1, 0x2DE9, 0x7BF2, 0x7BF2, 0x2DDA, + 0x7BF3, 0x7BF3, 0x2DE1, 0x7BF4, 0x7BF4, 0x2DDF, 0x7BF7, 0x7BF7, 0x142B, + 0x7BF8, 0x7BF8, 0x2DE6, 0x7BF9, 0x7BF9, 0x2C06, 0x7BFA, 0x7BFA, 0x3757, + 0x7BFB, 0x7BFB, 0x2DDD, 0x7BFC, 0x7BFC, 0x3F1F, 0x7BFD, 0x7BFD, 0x2DE7, + 0x7BFE, 0x7BFE, 0x142A, 0x7BFF, 0x7BFF, 0x2DDC, 0x7C00, 0x7C00, 0x2DDB, + 0x7C01, 0x7C01, 0x2DE5, 0x7C02, 0x7C02, 0x2DE2, 0x7C03, 0x7C03, 0x2DE4, + 0x7C05, 0x7C05, 0x2DD8, 0x7C06, 0x7C06, 0x2DE8, 0x7C07, 0x7C07, 0x1428, + 0x7C09, 0x7C09, 0x2DE3, 0x7C0A, 0x7C0A, 0x2DEC, 0x7C0B, 0x7C0B, 0x2DE0, + 0x7C0C, 0x7C0C, 0x142C, 0x7C0D, 0x7C0D, 0x1429, 0x7C0E, 0x7C0E, 0x2DDE, + 0x7C0F, 0x7C0F, 0x2DD9, 0x7C10, 0x7C10, 0x2DEB, 0x7C11, 0x7C11, 0x1317, + 0x7C12, 0x7C12, 0x472A, 0x7C15, 0x7C15, 0x4061, 0x7C19, 0x7C19, 0x2F78, + 0x7C1B, 0x7C1B, 0x43D9, 0x7C1C, 0x7C1C, 0x2F76, 0x7C1D, 0x7C1D, 0x2F7C, + 0x7C1E, 0x7C1E, 0x1508, 0x7C1F, 0x7C1F, 0x2F7A, 0x7C20, 0x7C20, 0x2F79, + 0x7C21, 0x7C21, 0x150A, 0x7C22, 0x7C22, 0x2F7F, 0x7C23, 0x7C23, 0x1509, + 0x7C25, 0x7C25, 0x2F80, 0x7C26, 0x7C26, 0x2F7D, 0x7C27, 0x7C27, 0x1506, + 0x7C28, 0x7C28, 0x2F7E, 0x7C29, 0x7C29, 0x2F77, 0x7C2A, 0x7C2A, 0x1507, + 0x7C2B, 0x7C2B, 0x1505, 0x7C2C, 0x7C2C, 0x30D6, 0x7C2D, 0x7C2D, 0x2F7B, + 0x7C30, 0x7C30, 0x2F81, 0x7C33, 0x7C33, 0x30D3, 0x7C35, 0x7C35, 0x3759, + 0x7C37, 0x7C37, 0x15A7, 0x7C38, 0x7C38, 0x15A5, 0x7C39, 0x7C39, 0x30D5, + 0x7C3B, 0x7C3B, 0x30D7, 0x7C3C, 0x7C3C, 0x30D4, 0x7C3D, 0x7C3D, 0x15A6, + 0x7C3E, 0x7C3F, 0x15A3, 0x7C40, 0x7C40, 0x15A8, 0x7C42, 0x7C42, 0x3F1C, + 0x7C43, 0x7C43, 0x162B, 0x7C44, 0x7C44, 0x375B, 0x7C45, 0x7C45, 0x3212, + 0x7C47, 0x7C47, 0x3211, 0x7C48, 0x7C48, 0x320F, 0x7C49, 0x7C49, 0x320E, + 0x7C4A, 0x7C4A, 0x3210, 0x7C4C, 0x7C4C, 0x162A, 0x7C4D, 0x7C4D, 0x162C, + 0x7C50, 0x7C50, 0x1681, 0x7C51, 0x7C51, 0x3FB8, 0x7C53, 0x7C53, 0x32EA, + 0x7C54, 0x7C54, 0x32E9, 0x7C56, 0x7C56, 0x3EFF, 0x7C57, 0x7C57, 0x339B, + 0x7C59, 0x7C59, 0x339D, 0x7C5A, 0x7C5A, 0x339F, 0x7C5B, 0x7C5B, 0x339E, + 0x7C5C, 0x7C5C, 0x339C, 0x7C5D, 0x7C5D, 0x3B3F, 0x7C5F, 0x7C5F, 0x16D1, + 0x7C60, 0x7C60, 0x16D0, 0x7C63, 0x7C63, 0x1701, 0x7C64, 0x7C64, 0x1700, + 0x7C65, 0x7C65, 0x1702, 0x7C66, 0x7C66, 0x342B, 0x7C67, 0x7C67, 0x342A, + 0x7C69, 0x7C69, 0x34D6, 0x7C6A, 0x7C6A, 0x3493, 0x7C6B, 0x7C6B, 0x34D7, + 0x7C6C, 0x7C6C, 0x1745, 0x7C6D, 0x7C6D, 0x3B40, 0x7C6E, 0x7C6E, 0x1746, + 0x7C6F, 0x7C6F, 0x3507, 0x7C70, 0x7C70, 0x3F52, 0x7C72, 0x7C72, 0x176B, + 0x7C73, 0x7C73, 0x03F7, 0x7C74, 0x7C74, 0x469C, 0x7C75, 0x7C75, 0x1A25, + 0x7C78, 0x7C79, 0x1BBB, 0x7C7A, 0x7C7A, 0x1BBA, 0x7C7B, 0x7C7B, 0x472D, + 0x7C7C, 0x7C7C, 0x3B49, 0x7C7D, 0x7C7D, 0x07CC, 0x7C7E, 0x7C7E, 0x3F1A, + 0x7C7F, 0x7C81, 0x1BBD, 0x7C83, 0x7C83, 0x375C, 0x7C84, 0x7C84, 0x1D96, + 0x7C85, 0x7C85, 0x1D9C, 0x7C86, 0x7C86, 0x3F1D, 0x7C88, 0x7C88, 0x1D9A, + 0x7C89, 0x7C89, 0x096A, 0x7C8A, 0x7C8A, 0x1D98, 0x7C8C, 0x7C8C, 0x1D99, + 0x7C8D, 0x7C8D, 0x1D9B, 0x7C8E, 0x7C8E, 0x3B48, 0x7C91, 0x7C91, 0x1D97, + 0x7C92, 0x7C92, 0x0B50, 0x7C94, 0x7C94, 0x1FE0, 0x7C95, 0x7C95, 0x0B52, + 0x7C96, 0x7C96, 0x1FE2, 0x7C97, 0x7C97, 0x0B51, 0x7C98, 0x7C98, 0x1FE1, + 0x7C9C, 0x7C9C, 0x472E, 0x7C9E, 0x7C9E, 0x225D, 0x7C9F, 0x7C9F, 0x0D0D, + 0x7CA1, 0x7CA1, 0x225F, 0x7CA2, 0x7CA2, 0x225C, 0x7CA3, 0x7CA3, 0x1FE3, + 0x7CA5, 0x7CA5, 0x0D0E, 0x7CA6, 0x7CA6, 0x375E, 0x7CA7, 0x7CA7, 0x36ED, + 0x7CA8, 0x7CA8, 0x225E, 0x7CAC, 0x7CAC, 0x3885, 0x7CAE, 0x7CAE, 0x3B4A, + 0x7CAF, 0x7CAF, 0x24FE, 0x7CB1, 0x7CB1, 0x0EBB, 0x7CB2, 0x7CB2, 0x24FC, + 0x7CB3, 0x7CB3, 0x0EBC, 0x7CB4, 0x7CB4, 0x24FD, 0x7CB5, 0x7CB5, 0x0EBD, + 0x7CB8, 0x7CB8, 0x4730, 0x7CB9, 0x7CB9, 0x1058, 0x7CBA, 0x7CBA, 0x277D, + 0x7CBB, 0x7CBB, 0x277A, 0x7CBC, 0x7CBC, 0x277C, 0x7CBD, 0x7CBE, 0x1059, + 0x7CBF, 0x7CBF, 0x277B, 0x7CC2, 0x7CC2, 0x3FD7, 0x7CC5, 0x7CC5, 0x29B0, + 0x7CC7, 0x7CC7, 0x3761, 0x7CC8, 0x7CC8, 0x29B1, 0x7CC9, 0x7CC9, 0x3760, + 0x7CCA, 0x7CCA, 0x11D4, 0x7CCB, 0x7CCB, 0x29B3, 0x7CCC, 0x7CCC, 0x29B2, + 0x7CCD, 0x7CCD, 0x3B45, 0x7CCE, 0x7CCE, 0x0121, 0x7CD0, 0x7CD1, 0x2C11, + 0x7CD2, 0x7CD2, 0x2C0E, 0x7CD3, 0x7CD3, 0x3D5C, 0x7CD4, 0x7CD4, 0x2C0F, + 0x7CD5, 0x7CD6, 0x131E, 0x7CD7, 0x7CD7, 0x2C10, 0x7CD9, 0x7CD9, 0x1433, + 0x7CDA, 0x7CDA, 0x3FD9, 0x7CDC, 0x7CDC, 0x142F, 0x7CDD, 0x7CDD, 0x1434, + 0x7CDE, 0x7CDE, 0x1430, 0x7CDF, 0x7CDF, 0x1432, 0x7CE0, 0x7CE0, 0x142E, + 0x7CE2, 0x7CE2, 0x1431, 0x7CE6, 0x7CE6, 0x3762, 0x7CE7, 0x7CE7, 0x150B, + 0x7CE8, 0x7CE8, 0x2DED, 0x7CEA, 0x7CEA, 0x30D9, 0x7CEC, 0x7CEC, 0x30D8, + 0x7CED, 0x7CED, 0x43DA, 0x7CEE, 0x7CEE, 0x3213, 0x7CEF, 0x7CF0, 0x162D, + 0x7CF1, 0x7CF1, 0x33A1, 0x7CF2, 0x7CF2, 0x32EB, 0x7CF3, 0x7CF3, 0x3764, + 0x7CF4, 0x7CF4, 0x33A0, 0x7CF5, 0x7CF5, 0x3765, 0x7CF6, 0x7CF6, 0x34D8, + 0x7CF7, 0x7CF7, 0x351D, 0x7CF8, 0x7CF8, 0x03F8, 0x7CF9, 0x7CF9, 0x44F8, + 0x7CFB, 0x7CFB, 0x04FB, 0x7CFC, 0x7CFC, 0x456D, 0x7CFD, 0x7CFD, 0x1A26, + 0x7CFE, 0x7CFE, 0x0667, 0x7D00, 0x7D00, 0x07CF, 0x7D01, 0x7D01, 0x1BC2, + 0x7D02, 0x7D02, 0x07CD, 0x7D03, 0x7D03, 0x1BC0, 0x7D04, 0x7D04, 0x07D2, + 0x7D05, 0x7D05, 0x07CE, 0x7D06, 0x7D06, 0x07D3, 0x7D07, 0x7D07, 0x07D1, + 0x7D08, 0x7D08, 0x1BC1, 0x7D09, 0x7D09, 0x07D0, 0x7D0A, 0x7D0A, 0x096E, + 0x7D0B, 0x7D0B, 0x096D, 0x7D0C, 0x7D0C, 0x1DA7, 0x7D0D, 0x7D0D, 0x0976, + 0x7D0E, 0x7D0E, 0x1DA0, 0x7D0F, 0x7D0F, 0x1DA6, 0x7D10, 0x7D10, 0x0972, + 0x7D11, 0x7D11, 0x1D9F, 0x7D12, 0x7D12, 0x1DA5, 0x7D13, 0x7D13, 0x1DA3, + 0x7D14, 0x7D14, 0x0971, 0x7D15, 0x7D15, 0x0973, 0x7D16, 0x7D16, 0x1DA2, + 0x7D17, 0x7D17, 0x096C, 0x7D18, 0x7D18, 0x1DA1, 0x7D19, 0x7D19, 0x0977, + 0x7D1A, 0x7D1A, 0x0974, 0x7D1B, 0x7D1B, 0x0978, 0x7D1C, 0x7D1C, 0x0975, + 0x7D1D, 0x7D1D, 0x1D9E, 0x7D1E, 0x7D1E, 0x1D9D, 0x7D1F, 0x7D1F, 0x1DA4, + 0x7D20, 0x7D20, 0x096F, 0x7D21, 0x7D21, 0x096B, 0x7D22, 0x7D22, 0x0970, + 0x7D25, 0x7D25, 0x3EDE, 0x7D28, 0x7D28, 0x1FF2, 0x7D29, 0x7D29, 0x1FEB, + 0x7D2B, 0x7D2B, 0x0D13, 0x7D2C, 0x7D2C, 0x1FEA, 0x7D2E, 0x7D2E, 0x0B56, + 0x7D2F, 0x7D2F, 0x0B5D, 0x7D30, 0x7D30, 0x0B5A, 0x7D31, 0x7D31, 0x0B60, + 0x7D32, 0x7D32, 0x0B5F, 0x7D33, 0x7D33, 0x0B5B, 0x7D35, 0x7D35, 0x1FE4, + 0x7D36, 0x7D36, 0x1FE7, 0x7D38, 0x7D38, 0x1FE6, 0x7D39, 0x7D39, 0x0B57, + 0x7D3A, 0x7D3A, 0x1FE8, 0x7D3B, 0x7D3B, 0x1FF1, 0x7D3C, 0x7D3C, 0x0B58, + 0x7D3D, 0x7D3D, 0x1FE5, 0x7D3E, 0x7D3F, 0x1FEE, 0x7D40, 0x7D40, 0x0B59, + 0x7D41, 0x7D41, 0x1FEC, 0x7D42, 0x7D42, 0x0B5E, 0x7D43, 0x7D43, 0x0B54, + 0x7D44, 0x7D44, 0x0B5C, 0x7D45, 0x7D45, 0x1FE9, 0x7D46, 0x7D46, 0x0B53, + 0x7D47, 0x7D47, 0x1FED, 0x7D4A, 0x7D4A, 0x1FF0, 0x7D4D, 0x7D4D, 0x3FDD, + 0x7D4E, 0x7D4E, 0x2270, 0x7D4F, 0x7D4F, 0x2267, 0x7D50, 0x7D50, 0x0D10, + 0x7D51, 0x7D51, 0x226E, 0x7D52, 0x7D52, 0x226B, 0x7D53, 0x7D53, 0x2263, + 0x7D54, 0x7D54, 0x226C, 0x7D55, 0x7D55, 0x0D12, 0x7D56, 0x7D56, 0x2264, + 0x7D58, 0x7D58, 0x2260, 0x7D5A, 0x7D5A, 0x3E93, 0x7D5B, 0x7D5B, 0x0EC3, + 0x7D5C, 0x7D5C, 0x2269, 0x7D5D, 0x7D5D, 0x3769, 0x7D5E, 0x7D5E, 0x0D0F, + 0x7D5F, 0x7D5F, 0x226F, 0x7D61, 0x7D61, 0x0D16, 0x7D62, 0x7D62, 0x0D18, + 0x7D63, 0x7D63, 0x2262, 0x7D66, 0x7D66, 0x0D17, 0x7D67, 0x7D67, 0x2265, + 0x7D68, 0x7D68, 0x0D11, 0x7D69, 0x7D69, 0x226D, 0x7D6A, 0x7D6A, 0x2266, + 0x7D6B, 0x7D6B, 0x226A, 0x7D6D, 0x7D6D, 0x2268, 0x7D6E, 0x7D6E, 0x0D14, + 0x7D6F, 0x7D6F, 0x2261, 0x7D70, 0x7D70, 0x0D19, 0x7D71, 0x7D71, 0x0B55, + 0x7D72, 0x7D72, 0x0D15, 0x7D73, 0x7D73, 0x0D1A, 0x7D79, 0x7D79, 0x0EBF, + 0x7D7A, 0x7D7A, 0x2505, 0x7D7B, 0x7D7B, 0x2507, 0x7D7C, 0x7D7C, 0x2509, + 0x7D7D, 0x7D7D, 0x250D, 0x7D7F, 0x7D7F, 0x2503, 0x7D80, 0x7D80, 0x2501, + 0x7D81, 0x7D81, 0x0EC1, 0x7D83, 0x7D83, 0x2508, 0x7D84, 0x7D84, 0x250C, + 0x7D85, 0x7D85, 0x2504, 0x7D86, 0x7D86, 0x2500, 0x7D88, 0x7D88, 0x24FF, + 0x7D89, 0x7D89, 0x376B, 0x7D8C, 0x7D8C, 0x250A, 0x7D8D, 0x7D8D, 0x2502, + 0x7D8E, 0x7D8E, 0x2506, 0x7D8F, 0x7D8F, 0x0EC2, 0x7D91, 0x7D91, 0x0EC0, + 0x7D92, 0x7D92, 0x250E, 0x7D93, 0x7D93, 0x0EBE, 0x7D94, 0x7D94, 0x250B, + 0x7D96, 0x7D96, 0x278E, 0x7D97, 0x7D97, 0x3B53, 0x7D9C, 0x7D9C, 0x105D, + 0x7D9D, 0x7D9D, 0x2786, 0x7D9E, 0x7D9E, 0x11E1, 0x7D9F, 0x7D9F, 0x2790, + 0x7DA0, 0x7DA0, 0x1060, 0x7DA1, 0x7DA1, 0x2794, 0x7DA2, 0x7DA2, 0x1066, + 0x7DA3, 0x7DA3, 0x2781, 0x7DA4, 0x7DA4, 0x46D7, 0x7DA6, 0x7DA6, 0x2791, + 0x7DA7, 0x7DA7, 0x277E, 0x7DA8, 0x7DA8, 0x3C9C, 0x7DA9, 0x7DA9, 0x2793, + 0x7DAA, 0x7DAA, 0x2782, 0x7DAB, 0x7DAB, 0x376C, 0x7DAC, 0x7DAC, 0x106D, + 0x7DAD, 0x7DAD, 0x106A, 0x7DAE, 0x7DAE, 0x2792, 0x7DAF, 0x7DAF, 0x278C, + 0x7DB0, 0x7DB0, 0x105C, 0x7DB1, 0x7DB1, 0x1064, 0x7DB2, 0x7DB2, 0x1063, + 0x7DB3, 0x7DB3, 0x376E, 0x7DB4, 0x7DB4, 0x1062, 0x7DB5, 0x7DB5, 0x1068, + 0x7DB7, 0x7DB7, 0x277F, 0x7DB8, 0x7DB8, 0x1069, 0x7DB9, 0x7DB9, 0x278D, + 0x7DBA, 0x7DBA, 0x1065, 0x7DBB, 0x7DBB, 0x105B, 0x7DBC, 0x7DBC, 0x278F, + 0x7DBD, 0x7DBE, 0x105E, 0x7DBF, 0x7DBF, 0x1067, 0x7DC0, 0x7DC0, 0x2784, + 0x7DC1, 0x7DC1, 0x2783, 0x7DC2, 0x7DC2, 0x2780, 0x7DC4, 0x7DC4, 0x2788, + 0x7DC5, 0x7DC5, 0x2785, 0x7DC6, 0x7DC6, 0x2789, 0x7DC7, 0x7DC7, 0x106C, + 0x7DC9, 0x7DC9, 0x2795, 0x7DCA, 0x7DCA, 0x1061, 0x7DCB, 0x7DCC, 0x278A, + 0x7DCD, 0x7DCD, 0x456E, 0x7DCE, 0x7DCE, 0x2787, 0x7DCF, 0x7DCF, 0x4735, + 0x7DD0, 0x7DD0, 0x4737, 0x7DD2, 0x7DD2, 0x106B, 0x7DD3, 0x7DD3, 0x3B4E, + 0x7DD4, 0x7DD4, 0x4736, 0x7DD6, 0x7DD6, 0x376F, 0x7DD7, 0x7DD7, 0x29B8, + 0x7DD8, 0x7DD8, 0x11D9, 0x7DD9, 0x7DD9, 0x11E2, 0x7DDA, 0x7DDA, 0x11DE, + 0x7DDB, 0x7DDB, 0x29B5, 0x7DDC, 0x7DDC, 0x3B4C, 0x7DDD, 0x7DDD, 0x11DB, + 0x7DDE, 0x7DDE, 0x11DF, 0x7DDF, 0x7DDF, 0x29C1, 0x7DE0, 0x7DE0, 0x11D5, + 0x7DE1, 0x7DE1, 0x29B9, 0x7DE3, 0x7DE3, 0x11DD, 0x7DE4, 0x7DE4, 0x3772, + 0x7DE5, 0x7DE5, 0x3776, 0x7DE6, 0x7DE6, 0x29BC, 0x7DE7, 0x7DE7, 0x29B7, + 0x7DE8, 0x7DE8, 0x11DC, 0x7DE9, 0x7DE9, 0x11E0, 0x7DEA, 0x7DEA, 0x29B6, + 0x7DEC, 0x7DEC, 0x11DA, 0x7DEE, 0x7DEE, 0x29C0, 0x7DEF, 0x7DEF, 0x11D7, + 0x7DF0, 0x7DF0, 0x29BF, 0x7DF1, 0x7DF1, 0x29BE, 0x7DF2, 0x7DF2, 0x11E3, + 0x7DF3, 0x7DF3, 0x28C8, 0x7DF4, 0x7DF4, 0x11D6, 0x7DF5, 0x7DF5, 0x3774, + 0x7DF6, 0x7DF6, 0x29BD, 0x7DF7, 0x7DF7, 0x29B4, 0x7DF9, 0x7DF9, 0x11E4, + 0x7DFA, 0x7DFA, 0x29BB, 0x7DFB, 0x7DFB, 0x11D8, 0x7DFD, 0x7DFD, 0x4738, + 0x7DFE, 0x7DFE, 0x3CCF, 0x7E03, 0x7E03, 0x29BA, 0x7E07, 0x7E07, 0x3B4D, + 0x7E08, 0x7E08, 0x1322, 0x7E09, 0x7E09, 0x1327, 0x7E0A, 0x7E0A, 0x1320, + 0x7E0B, 0x7E0B, 0x2C1F, 0x7E0C, 0x7E0C, 0x2C16, 0x7E0D, 0x7E0D, 0x2C22, + 0x7E0E, 0x7E0E, 0x2C1A, 0x7E0F, 0x7E0F, 0x2C20, 0x7E10, 0x7E10, 0x1328, + 0x7E11, 0x7E11, 0x1321, 0x7E12, 0x7E12, 0x2C13, 0x7E13, 0x7E13, 0x2C19, + 0x7E14, 0x7E14, 0x2C23, 0x7E15, 0x7E15, 0x2C1C, 0x7E16, 0x7E16, 0x2C21, + 0x7E17, 0x7E17, 0x2C15, 0x7E1A, 0x7E1A, 0x2C1D, 0x7E1B, 0x7E1B, 0x1323, + 0x7E1C, 0x7E1C, 0x2C1B, 0x7E1D, 0x7E1D, 0x1326, 0x7E1E, 0x7E1E, 0x1325, + 0x7E1F, 0x7E20, 0x2C17, 0x7E21, 0x7E21, 0x2C14, 0x7E22, 0x7E22, 0x2C1E, + 0x7E23, 0x7E23, 0x1324, 0x7E24, 0x7E24, 0x2C25, 0x7E25, 0x7E25, 0x2C24, + 0x7E27, 0x7E27, 0x377F, 0x7E29, 0x7E29, 0x2DF8, 0x7E2A, 0x7E2A, 0x2DF4, + 0x7E2B, 0x7E2B, 0x143B, 0x7E2D, 0x7E2D, 0x2DEE, 0x7E2E, 0x7E2E, 0x1435, + 0x7E2F, 0x7E2F, 0x1445, 0x7E30, 0x7E30, 0x2DFA, 0x7E31, 0x7E31, 0x143D, + 0x7E32, 0x7E32, 0x1439, 0x7E33, 0x7E33, 0x2DF1, 0x7E34, 0x7E34, 0x1440, + 0x7E35, 0x7E35, 0x1443, 0x7E36, 0x7E36, 0x2DFC, 0x7E37, 0x7E37, 0x1438, + 0x7E38, 0x7E38, 0x2DF3, 0x7E39, 0x7E39, 0x1441, 0x7E3A, 0x7E3A, 0x2DFE, + 0x7E3B, 0x7E3B, 0x2DFB, 0x7E3C, 0x7E3C, 0x2DEF, 0x7E3D, 0x7E3D, 0x143C, + 0x7E3E, 0x7E3E, 0x1436, 0x7E3F, 0x7E3F, 0x1444, 0x7E40, 0x7E40, 0x2DF6, + 0x7E41, 0x7E41, 0x143F, 0x7E42, 0x7E42, 0x2DF0, 0x7E43, 0x7E43, 0x143A, + 0x7E44, 0x7E44, 0x2DFD, 0x7E45, 0x7E45, 0x143E, 0x7E46, 0x7E46, 0x1437, + 0x7E47, 0x7E47, 0x2DF7, 0x7E48, 0x7E48, 0x1442, 0x7E49, 0x7E49, 0x2DF5, + 0x7E4C, 0x7E4C, 0x2DF9, 0x7E50, 0x7E50, 0x2F83, 0x7E51, 0x7E51, 0x2F89, + 0x7E52, 0x7E52, 0x1511, 0x7E53, 0x7E53, 0x2F8C, 0x7E54, 0x7E55, 0x150C, + 0x7E56, 0x7E56, 0x2F84, 0x7E57, 0x7E57, 0x2F8B, 0x7E58, 0x7E58, 0x2F86, + 0x7E59, 0x7E59, 0x1512, 0x7E5A, 0x7E5A, 0x150F, 0x7E5C, 0x7E5C, 0x2F82, + 0x7E5E, 0x7E5E, 0x150E, 0x7E5F, 0x7E5F, 0x2F88, 0x7E60, 0x7E60, 0x2F8A, + 0x7E61, 0x7E61, 0x1510, 0x7E62, 0x7E62, 0x2F87, 0x7E63, 0x7E63, 0x2F85, + 0x7E65, 0x7E65, 0x46D2, 0x7E67, 0x7E67, 0x3766, 0x7E68, 0x7E68, 0x30E3, + 0x7E69, 0x7E6A, 0x15AC, 0x7E6B, 0x7E6B, 0x15A9, 0x7E6D, 0x7E6D, 0x15AA, + 0x7E6E, 0x7E6E, 0x377B, 0x7E6F, 0x7E6F, 0x30DF, 0x7E70, 0x7E70, 0x30DD, + 0x7E72, 0x7E72, 0x30E1, 0x7E73, 0x7E73, 0x15AE, 0x7E74, 0x7E74, 0x30E2, + 0x7E75, 0x7E75, 0x30DB, 0x7E76, 0x7E76, 0x30DA, 0x7E77, 0x7E77, 0x30DE, + 0x7E78, 0x7E78, 0x30DC, 0x7E79, 0x7E79, 0x15AB, 0x7E7A, 0x7E7A, 0x30E0, + 0x7E7B, 0x7E7B, 0x3214, 0x7E7C, 0x7E7C, 0x1631, 0x7E7D, 0x7E7D, 0x1630, + 0x7E7E, 0x7E7E, 0x3215, 0x7E7F, 0x7E7F, 0x3E51, 0x7E80, 0x7E80, 0x3217, + 0x7E81, 0x7E81, 0x3216, 0x7E82, 0x7E82, 0x1632, 0x7E86, 0x7E86, 0x32F0, + 0x7E87, 0x7E88, 0x32ED, 0x7E8A, 0x7E8A, 0x32EC, 0x7E8B, 0x7E8B, 0x32EF, + 0x7E8C, 0x7E8C, 0x1683, 0x7E8D, 0x7E8D, 0x32F1, 0x7E8E, 0x7E8E, 0x3EC9, + 0x7E8F, 0x7E8F, 0x1682, 0x7E91, 0x7E91, 0x33A2, 0x7E92, 0x7E92, 0x469E, + 0x7E93, 0x7E93, 0x1703, 0x7E94, 0x7E94, 0x1705, 0x7E95, 0x7E95, 0x342C, + 0x7E96, 0x7E96, 0x1704, 0x7E97, 0x7E97, 0x3494, 0x7E98, 0x7E98, 0x34DA, + 0x7E99, 0x7E99, 0x34DC, 0x7E9A, 0x7E9A, 0x34D9, 0x7E9B, 0x7E9B, 0x34DB, + 0x7E9C, 0x7E9C, 0x1759, 0x7E9F, 0x7E9F, 0x48BB, 0x7EA4, 0x7EA4, 0x455B, + 0x7EAC, 0x7EAC, 0x455C, 0x7EBA, 0x7EBA, 0x455D, 0x7EC7, 0x7EC7, 0x455E, + 0x7ECF, 0x7ECF, 0x455F, 0x7EDF, 0x7EDF, 0x4560, 0x7F06, 0x7F06, 0x4561, + 0x7F36, 0x7F36, 0x03F9, 0x7F37, 0x7F37, 0x4562, 0x7F38, 0x7F38, 0x07D4, + 0x7F39, 0x7F39, 0x1D1F, 0x7F3A, 0x7F3A, 0x0979, 0x7F3D, 0x7F3D, 0x0B61, + 0x7F3E, 0x7F3F, 0x2271, 0x7F40, 0x7F41, 0x3780, 0x7F43, 0x7F43, 0x2C26, + 0x7F44, 0x7F44, 0x1446, 0x7F45, 0x7F45, 0x2DFF, 0x7F47, 0x7F47, 0x3782, + 0x7F48, 0x7F48, 0x1513, 0x7F49, 0x7F49, 0x3E69, 0x7F4A, 0x7F4A, 0x30E5, + 0x7F4B, 0x7F4B, 0x30E4, 0x7F4C, 0x7F4C, 0x1633, 0x7F4D, 0x7F4D, 0x32F2, + 0x7F4E, 0x7F4E, 0x3B4F, 0x7F4F, 0x7F4F, 0x33A3, 0x7F50, 0x7F50, 0x1726, + 0x7F51, 0x7F51, 0x1812, 0x7F52, 0x7F52, 0x44F6, 0x7F53, 0x7F53, 0x44F9, + 0x7F54, 0x7F54, 0x0668, 0x7F55, 0x7F55, 0x04FC, 0x7F58, 0x7F58, 0x1BC3, + 0x7F5B, 0x7F5B, 0x1DAD, 0x7F5C, 0x7F5C, 0x1DA8, 0x7F5D, 0x7F5D, 0x1DAC, + 0x7F5E, 0x7F5E, 0x1DAA, 0x7F5F, 0x7F5F, 0x097A, 0x7F60, 0x7F60, 0x1DAB, + 0x7F61, 0x7F61, 0x1DA9, 0x7F63, 0x7F63, 0x1FF3, 0x7F65, 0x7F66, 0x2273, + 0x7F67, 0x7F68, 0x2511, 0x7F69, 0x7F6A, 0x0EC5, 0x7F6B, 0x7F6B, 0x2510, + 0x7F6C, 0x7F6C, 0x2513, 0x7F6D, 0x7F6D, 0x250F, 0x7F6E, 0x7F6E, 0x0EC4, + 0x7F70, 0x7F70, 0x106E, 0x7F71, 0x7F71, 0x4007, 0x7F72, 0x7F72, 0x0EC7, + 0x7F73, 0x7F73, 0x2796, 0x7F75, 0x7F75, 0x11E5, 0x7F76, 0x7F76, 0x29C2, + 0x7F77, 0x7F77, 0x11E6, 0x7F78, 0x7F78, 0x3F7B, 0x7F79, 0x7F79, 0x1329, + 0x7F7A, 0x7F7A, 0x2C29, 0x7F7B, 0x7F7C, 0x2C27, 0x7F7D, 0x7F7D, 0x2E02, + 0x7F7E, 0x7F7E, 0x2E01, 0x7F7F, 0x7F7F, 0x2E00, 0x7F83, 0x7F83, 0x30E6, + 0x7F85, 0x7F85, 0x15AF, 0x7F86, 0x7F86, 0x30E7, 0x7F87, 0x7F87, 0x33A4, + 0x7F88, 0x7F88, 0x1727, 0x7F89, 0x7F89, 0x3495, 0x7F8A, 0x7F8A, 0x03FA, + 0x7F8B, 0x7F8B, 0x066A, 0x7F8C, 0x7F8C, 0x0669, 0x7F8D, 0x7F8D, 0x1BC5, + 0x7F8E, 0x7F8E, 0x07D5, 0x7F8F, 0x7F8F, 0x421C, 0x7F91, 0x7F91, 0x1BC4, + 0x7F92, 0x7F92, 0x1DAF, 0x7F93, 0x7F93, 0x43DB, 0x7F94, 0x7F94, 0x097B, + 0x7F95, 0x7F95, 0x1FF4, 0x7F96, 0x7F96, 0x1DAE, 0x7F97, 0x7F97, 0x3786, + 0x7F9A, 0x7F9A, 0x0B63, 0x7F9B, 0x7F9B, 0x1FF7, 0x7F9C, 0x7F9D, 0x1FF5, + 0x7F9E, 0x7F9E, 0x0B62, 0x7FA0, 0x7FA1, 0x2276, 0x7FA2, 0x7FA2, 0x2275, + 0x7FA3, 0x7FA3, 0x3788, 0x7FA4, 0x7FA4, 0x0ECA, 0x7FA5, 0x7FA5, 0x2515, + 0x7FA6, 0x7FA6, 0x2514, 0x7FA7, 0x7FA7, 0x2516, 0x7FA8, 0x7FA8, 0x0EC9, + 0x7FA9, 0x7FA9, 0x0EC8, 0x7FAC, 0x7FAC, 0x29C3, 0x7FAD, 0x7FAD, 0x29C5, + 0x7FAE, 0x7FAE, 0x43DC, 0x7FAF, 0x7FAF, 0x11E7, 0x7FB0, 0x7FB0, 0x29C4, + 0x7FB1, 0x7FB1, 0x2C2A, 0x7FB2, 0x7FB2, 0x132A, 0x7FB3, 0x7FB3, 0x2F8E, + 0x7FB4, 0x7FB4, 0x4739, 0x7FB5, 0x7FB5, 0x2F8D, 0x7FB6, 0x7FB6, 0x15B0, + 0x7FB7, 0x7FB7, 0x30E8, 0x7FB8, 0x7FB8, 0x15B2, 0x7FB9, 0x7FB9, 0x15B1, + 0x7FBA, 0x7FBA, 0x3218, 0x7FBB, 0x7FBB, 0x32F3, 0x7FBC, 0x7FBC, 0x1684, + 0x7FBD, 0x7FBD, 0x03FB, 0x7FBE, 0x7FBE, 0x1BC6, 0x7FBF, 0x7FBF, 0x07D6, + 0x7FC0, 0x7FC0, 0x1DB2, 0x7FC1, 0x7FC1, 0x097D, 0x7FC2, 0x7FC2, 0x1DB1, + 0x7FC3, 0x7FC3, 0x1DB0, 0x7FC5, 0x7FC5, 0x097C, 0x7FC7, 0x7FC7, 0x1FFD, + 0x7FC9, 0x7FC9, 0x1FFF, 0x7FCA, 0x7FCB, 0x1FF8, 0x7FCC, 0x7FCC, 0x0B64, + 0x7FCD, 0x7FCD, 0x1FFA, 0x7FCE, 0x7FCE, 0x0B65, 0x7FCF, 0x7FCF, 0x1FFE, + 0x7FD0, 0x7FD1, 0x1FFB, 0x7FD2, 0x7FD2, 0x0B66, 0x7FD4, 0x7FD5, 0x0D1C, + 0x7FD7, 0x7FD7, 0x2278, 0x7FDB, 0x7FDC, 0x2517, 0x7FDD, 0x7FDD, 0x3B5E, + 0x7FDE, 0x7FDE, 0x279A, 0x7FDF, 0x7FDF, 0x1071, 0x7FE0, 0x7FE1, 0x106F, + 0x7FE2, 0x7FE3, 0x2797, 0x7FE5, 0x7FE5, 0x2799, 0x7FE6, 0x7FE6, 0x29CA, + 0x7FE7, 0x7FE7, 0x46E9, 0x7FE8, 0x7FE8, 0x29CB, 0x7FE9, 0x7FE9, 0x11E8, + 0x7FEA, 0x7FEA, 0x29C8, 0x7FEB, 0x7FEB, 0x29C7, 0x7FEC, 0x7FEC, 0x29C9, + 0x7FED, 0x7FED, 0x29C6, 0x7FEE, 0x7FEE, 0x132D, 0x7FEF, 0x7FEF, 0x2C2B, + 0x7FF0, 0x7FF1, 0x132B, 0x7FF2, 0x7FF2, 0x2E04, 0x7FF3, 0x7FF3, 0x1447, + 0x7FF4, 0x7FF4, 0x2E03, 0x7FF5, 0x7FF5, 0x2EFF, 0x7FF7, 0x7FF8, 0x2F8F, + 0x7FF9, 0x7FF9, 0x1514, 0x7FFA, 0x7FFA, 0x378E, 0x7FFB, 0x7FFB, 0x1515, + 0x7FFC, 0x7FFC, 0x1448, 0x7FFD, 0x7FFE, 0x30E9, 0x7FFF, 0x7FFF, 0x3219, + 0x8000, 0x8000, 0x1634, 0x8001, 0x8001, 0x03FC, 0x8002, 0x8002, 0x44FD, + 0x8003, 0x8003, 0x03FD, 0x8004, 0x8004, 0x097F, 0x8005, 0x8005, 0x066B, + 0x8006, 0x8006, 0x097E, 0x8007, 0x8007, 0x1BC7, 0x8008, 0x8008, 0x3791, + 0x800B, 0x800B, 0x0D1E, 0x800C, 0x800C, 0x03FE, 0x800D, 0x800D, 0x07D8, + 0x800E, 0x800F, 0x1BC8, 0x8010, 0x8010, 0x07D7, 0x8011, 0x8011, 0x07D9, + 0x8012, 0x8012, 0x03FF, 0x8014, 0x8014, 0x1BCA, 0x8015, 0x8015, 0x0981, + 0x8016, 0x8016, 0x1DB3, 0x8017, 0x8017, 0x0983, 0x8018, 0x8018, 0x0980, + 0x8019, 0x8019, 0x0982, 0x801B, 0x801B, 0x2002, 0x801C, 0x801C, 0x0B67, + 0x801D, 0x801D, 0x3792, 0x801E, 0x801E, 0x2001, 0x801F, 0x801F, 0x2000, + 0x8020, 0x8020, 0x473C, 0x8021, 0x8021, 0x2519, 0x8024, 0x8024, 0x279B, + 0x8025, 0x8025, 0x473D, 0x8026, 0x8026, 0x11E9, 0x8028, 0x8028, 0x132E, + 0x8029, 0x8029, 0x2C2D, 0x802A, 0x802A, 0x2C2C, 0x802C, 0x802C, 0x2E05, + 0x802E, 0x802E, 0x473E, 0x802F, 0x802F, 0x3794, 0x8030, 0x8030, 0x32F4, + 0x8031, 0x8031, 0x473F, 0x8033, 0x8033, 0x0400, 0x8034, 0x8034, 0x18D8, + 0x8035, 0x8035, 0x1A27, 0x8036, 0x8036, 0x07DA, 0x8037, 0x8037, 0x1BCB, + 0x8039, 0x8039, 0x1DB5, 0x803B, 0x803C, 0x3797, 0x803D, 0x803D, 0x0984, + 0x803E, 0x803E, 0x1DB4, 0x803F, 0x803F, 0x0985, 0x8043, 0x8043, 0x2004, + 0x8046, 0x8046, 0x0B69, 0x8047, 0x8047, 0x2003, 0x8048, 0x8048, 0x2005, + 0x804A, 0x804A, 0x0B68, 0x804F, 0x8050, 0x227A, 0x8051, 0x8051, 0x2279, + 0x8052, 0x8052, 0x0D1F, 0x8054, 0x8054, 0x4740, 0x8056, 0x8056, 0x0ECB, + 0x8058, 0x8058, 0x0ECC, 0x805A, 0x805A, 0x1073, 0x805B, 0x805B, 0x3FE5, + 0x805C, 0x805C, 0x279D, 0x805D, 0x805D, 0x279C, 0x805E, 0x805E, 0x1072, + 0x8061, 0x8061, 0x3799, 0x8062, 0x8062, 0x3FE3, 0x8063, 0x8063, 0x3FDC, + 0x8064, 0x8064, 0x29CC, 0x8066, 0x8066, 0x3FDB, 0x8067, 0x8067, 0x29CD, + 0x806C, 0x806C, 0x2C2E, 0x806F, 0x806F, 0x144C, 0x8070, 0x8070, 0x144B, + 0x8071, 0x8072, 0x1449, 0x8073, 0x8073, 0x144D, 0x8075, 0x8075, 0x2F91, + 0x8076, 0x8076, 0x1517, 0x8077, 0x8077, 0x1516, 0x8078, 0x8078, 0x30EB, + 0x8079, 0x8079, 0x321A, 0x807D, 0x807D, 0x16D3, 0x807E, 0x807E, 0x16D2, + 0x807F, 0x807F, 0x0401, 0x8080, 0x8080, 0x44FE, 0x8082, 0x8082, 0x1CEC, + 0x8084, 0x8084, 0x0ECE, 0x8085, 0x8085, 0x0D20, 0x8086, 0x8086, 0x0ECD, + 0x8087, 0x8087, 0x1074, 0x8089, 0x8089, 0x0402, 0x808A, 0x808A, 0x17B3, + 0x808B, 0x808C, 0x0403, 0x808F, 0x808F, 0x1A28, 0x8090, 0x8090, 0x18DB, + 0x8092, 0x8092, 0x18DC, 0x8093, 0x8093, 0x04FE, 0x8095, 0x8095, 0x18D9, + 0x8096, 0x8096, 0x04FD, 0x8098, 0x8098, 0x0500, 0x8099, 0x8099, 0x18DA, + 0x809A, 0x809A, 0x0502, 0x809B, 0x809B, 0x0501, 0x809C, 0x809C, 0x18DD, + 0x809D, 0x809D, 0x04FF, 0x809F, 0x809F, 0x4576, 0x80A1, 0x80A1, 0x0670, + 0x80A2, 0x80A2, 0x066E, 0x80A3, 0x80A3, 0x1A2A, 0x80A5, 0x80A5, 0x066D, + 0x80A7, 0x80A7, 0x37A0, 0x80A9, 0x80A9, 0x0672, 0x80AA, 0x80AA, 0x0674, + 0x80AB, 0x80AB, 0x0671, 0x80AD, 0x80AD, 0x1A2D, 0x80AE, 0x80AE, 0x1A29, + 0x80AF, 0x80AF, 0x0675, 0x80B1, 0x80B1, 0x066F, 0x80B2, 0x80B2, 0x0503, + 0x80B4, 0x80B4, 0x0673, 0x80B5, 0x80B5, 0x1A2C, 0x80B6, 0x80B6, 0x3EAE, + 0x80B7, 0x80B7, 0x4743, 0x80B8, 0x80B8, 0x1A2B, 0x80BA, 0x80BA, 0x066C, + 0x80BC, 0x80BC, 0x4572, 0x80BD, 0x80BD, 0x3E7B, 0x80C2, 0x80C2, 0x1BD1, + 0x80C3, 0x80C4, 0x07DE, 0x80C5, 0x80C5, 0x1BD3, 0x80C6, 0x80C6, 0x3B74, + 0x80C7, 0x80C7, 0x1BCD, 0x80C8, 0x80C8, 0x1BD0, 0x80C9, 0x80C9, 0x1BD9, + 0x80CA, 0x80CA, 0x1BD7, 0x80CC, 0x80CC, 0x07E0, 0x80CD, 0x80CD, 0x1BDD, + 0x80CE, 0x80CE, 0x07E3, 0x80CF, 0x80CF, 0x1BDA, 0x80D0, 0x80D0, 0x1BD2, + 0x80D1, 0x80D1, 0x1BCF, 0x80D4, 0x80D4, 0x227D, 0x80D5, 0x80D5, 0x1BD8, + 0x80D6, 0x80D6, 0x07DB, 0x80D7, 0x80D7, 0x1BDB, 0x80D8, 0x80D8, 0x1BCC, + 0x80D9, 0x80D9, 0x1BD5, 0x80DA, 0x80DA, 0x07DD, 0x80DB, 0x80DB, 0x07E2, + 0x80DC, 0x80DC, 0x1BD6, 0x80DD, 0x80DD, 0x07E6, 0x80DE, 0x80DE, 0x07E4, + 0x80E0, 0x80E0, 0x1BCE, 0x80E1, 0x80E1, 0x07E1, 0x80E3, 0x80E3, 0x1BD4, + 0x80E4, 0x80E4, 0x07E5, 0x80E5, 0x80E5, 0x07DC, 0x80E6, 0x80E6, 0x1BDC, + 0x80E9, 0x80E9, 0x4744, 0x80EC, 0x80EC, 0x45E9, 0x80ED, 0x80ED, 0x098A, + 0x80EF, 0x80EF, 0x0993, 0x80F0, 0x80F0, 0x0988, 0x80F1, 0x80F1, 0x0986, + 0x80F2, 0x80F2, 0x1DB7, 0x80F3, 0x80F3, 0x098E, 0x80F4, 0x80F4, 0x098B, + 0x80F5, 0x80F5, 0x1DB9, 0x80F6, 0x80F6, 0x4574, 0x80F8, 0x80F8, 0x098D, + 0x80F9, 0x80F9, 0x1DB8, 0x80FA, 0x80FA, 0x1DB6, 0x80FB, 0x80FB, 0x1DBB, + 0x80FC, 0x80FC, 0x0992, 0x80FD, 0x80FD, 0x0990, 0x80FE, 0x80FE, 0x227C, + 0x8100, 0x8100, 0x1DBC, 0x8101, 0x8101, 0x1DBA, 0x8102, 0x8102, 0x0987, + 0x8103, 0x8103, 0x3FE7, 0x8105, 0x8105, 0x0989, 0x8106, 0x8106, 0x098C, + 0x8107, 0x8107, 0x37A2, 0x8108, 0x8108, 0x098F, 0x8109, 0x8109, 0x3B75, + 0x810A, 0x810A, 0x0991, 0x810C, 0x810C, 0x4746, 0x810E, 0x810E, 0x4747, + 0x8112, 0x8112, 0x4748, 0x8114, 0x8114, 0x4749, 0x8115, 0x8115, 0x200F, + 0x8116, 0x8116, 0x0B6B, 0x8117, 0x8117, 0x3E6D, 0x8118, 0x8118, 0x2006, + 0x8119, 0x8119, 0x2008, 0x811A, 0x811A, 0x37A3, 0x811B, 0x811B, 0x2009, + 0x811D, 0x811D, 0x2011, 0x811E, 0x811E, 0x200D, 0x811F, 0x811F, 0x200B, + 0x8121, 0x8121, 0x200E, 0x8122, 0x8122, 0x2012, 0x8123, 0x8123, 0x0B6C, + 0x8124, 0x8124, 0x0B70, 0x8125, 0x8125, 0x2007, 0x8127, 0x8127, 0x2010, + 0x8129, 0x8129, 0x0B6E, 0x812A, 0x812A, 0x3A39, 0x812B, 0x812B, 0x0B6D, + 0x812C, 0x812C, 0x200C, 0x812D, 0x812D, 0x200A, 0x812F, 0x812F, 0x0B6A, + 0x8130, 0x8130, 0x0B6F, 0x8132, 0x8132, 0x3E79, 0x8134, 0x8134, 0x45EC, + 0x8137, 0x8137, 0x3B72, 0x8139, 0x8139, 0x0D26, 0x813A, 0x813A, 0x2285, + 0x813D, 0x813D, 0x2283, 0x813E, 0x813E, 0x0D28, 0x8142, 0x8142, 0x3B76, + 0x8143, 0x8143, 0x227E, 0x8144, 0x8144, 0x2527, 0x8146, 0x8146, 0x0D27, + 0x8147, 0x8147, 0x2282, 0x8148, 0x8148, 0x3E76, 0x814A, 0x814A, 0x227F, + 0x814B, 0x814B, 0x0D23, 0x814C, 0x814C, 0x0D29, 0x814D, 0x814D, 0x2284, + 0x814E, 0x814E, 0x0D25, 0x814F, 0x814F, 0x2281, 0x8150, 0x8150, 0x1075, + 0x8151, 0x8151, 0x0D24, 0x8152, 0x8152, 0x2280, 0x8153, 0x8153, 0x0D2A, + 0x8154, 0x8154, 0x0D22, 0x8155, 0x8155, 0x0D21, 0x8156, 0x8156, 0x474C, + 0x8159, 0x815A, 0x474D, 0x815B, 0x815B, 0x251F, 0x815C, 0x815C, 0x251D, + 0x815E, 0x815E, 0x2523, 0x8160, 0x8160, 0x251B, 0x8161, 0x8161, 0x2528, + 0x8162, 0x8162, 0x2520, 0x8164, 0x8164, 0x251A, 0x8165, 0x8165, 0x0ED2, + 0x8166, 0x8166, 0x0ED8, 0x8167, 0x8167, 0x2525, 0x8169, 0x8169, 0x251E, + 0x816B, 0x816B, 0x0ED5, 0x816D, 0x816D, 0x43C4, 0x816E, 0x816E, 0x0ED3, + 0x816F, 0x816F, 0x2526, 0x8170, 0x8170, 0x0ED0, 0x8171, 0x8171, 0x0ECF, + 0x8172, 0x8172, 0x2521, 0x8173, 0x8173, 0x0ED4, 0x8174, 0x8174, 0x0D2B, + 0x8176, 0x8176, 0x2524, 0x8177, 0x8177, 0x251C, 0x8178, 0x8178, 0x0ED1, + 0x8179, 0x817A, 0x0ED6, 0x817C, 0x817C, 0x4750, 0x817F, 0x817F, 0x107A, + 0x8180, 0x8180, 0x1076, 0x8182, 0x8182, 0x107B, 0x8183, 0x8183, 0x27A0, + 0x8184, 0x8184, 0x43C5, 0x8186, 0x8186, 0x279F, 0x8187, 0x8187, 0x27A1, + 0x8188, 0x8188, 0x1078, 0x8189, 0x8189, 0x279E, 0x818A, 0x818A, 0x1079, + 0x818B, 0x818B, 0x27A4, 0x818C, 0x818C, 0x27A3, 0x818D, 0x818D, 0x27A2, + 0x818F, 0x818F, 0x1077, 0x8193, 0x8193, 0x43C6, 0x8195, 0x8195, 0x29D1, + 0x8197, 0x8197, 0x29D4, 0x8198, 0x8198, 0x11EF, 0x8199, 0x8199, 0x29D3, + 0x819A, 0x819A, 0x11EE, 0x819B, 0x819D, 0x11EA, 0x819E, 0x819E, 0x29D0, + 0x819F, 0x819F, 0x29CF, 0x81A0, 0x81A0, 0x11ED, 0x81A2, 0x81A2, 0x29D2, + 0x81A3, 0x81A3, 0x29CE, 0x81A5, 0x81A5, 0x4753, 0x81A6, 0x81A6, 0x2C30, + 0x81A7, 0x81A7, 0x2C3A, 0x81A8, 0x81A8, 0x1331, 0x81A9, 0x81A9, 0x1330, + 0x81AA, 0x81AA, 0x4364, 0x81AB, 0x81AB, 0x2C34, 0x81AC, 0x81AC, 0x2C36, + 0x81AE, 0x81AE, 0x2C31, 0x81B0, 0x81B0, 0x2C35, 0x81B1, 0x81B1, 0x2C2F, + 0x81B2, 0x81B2, 0x2C38, 0x81B3, 0x81B3, 0x132F, 0x81B4, 0x81B4, 0x2C37, + 0x81B5, 0x81B5, 0x2C33, 0x81B6, 0x81B6, 0x3EB2, 0x81B7, 0x81B7, 0x2C39, + 0x81B9, 0x81B9, 0x2C32, 0x81BA, 0x81BA, 0x1450, 0x81BB, 0x81BB, 0x2E06, + 0x81BC, 0x81BC, 0x2E0C, 0x81BD, 0x81BD, 0x1454, 0x81BE, 0x81BE, 0x1456, + 0x81BF, 0x81BF, 0x1453, 0x81C0, 0x81C0, 0x1452, 0x81C1, 0x81C1, 0x4755, + 0x81C2, 0x81C2, 0x1451, 0x81C3, 0x81C3, 0x144F, 0x81C4, 0x81C4, 0x2E07, + 0x81C5, 0x81C5, 0x2E0A, 0x81C6, 0x81C6, 0x144E, 0x81C7, 0x81C7, 0x2E0B, + 0x81C8, 0x81C8, 0x3FEE, 0x81C9, 0x81C9, 0x1455, 0x81CA, 0x81CA, 0x2E09, + 0x81CC, 0x81CC, 0x2E08, 0x81CD, 0x81CD, 0x1518, 0x81CF, 0x81CF, 0x1519, + 0x81D0, 0x81D0, 0x2F94, 0x81D1, 0x81D2, 0x2F92, 0x81D5, 0x81D5, 0x30ED, + 0x81D7, 0x81D7, 0x30EC, 0x81D8, 0x81D8, 0x15B3, 0x81D9, 0x81D9, 0x321C, + 0x81DA, 0x81DA, 0x1635, 0x81DB, 0x81DB, 0x321B, 0x81DD, 0x81DD, 0x32F5, + 0x81DE, 0x81DE, 0x33A5, 0x81DF, 0x81DF, 0x16D4, 0x81E0, 0x81E1, 0x34DD, + 0x81E2, 0x81E2, 0x1706, 0x81E3, 0x81E3, 0x0405, 0x81E4, 0x81E4, 0x4756, + 0x81E5, 0x81E5, 0x0676, 0x81E6, 0x81E6, 0x2286, 0x81E7, 0x81E7, 0x107C, + 0x81E8, 0x81E8, 0x1457, 0x81E9, 0x81E9, 0x2E0D, 0x81EA, 0x81EA, 0x0406, + 0x81EC, 0x81EC, 0x0995, 0x81ED, 0x81ED, 0x0994, 0x81EE, 0x81EE, 0x2287, + 0x81EF, 0x81EF, 0x42D1, 0x81F2, 0x81F2, 0x2C3B, 0x81F3, 0x81F3, 0x0407, + 0x81F4, 0x81F4, 0x07E7, 0x81F6, 0x81F6, 0x3D61, 0x81F7, 0x81F9, 0x2288, + 0x81FA, 0x81FA, 0x107D, 0x81FB, 0x81FB, 0x1332, 0x81FC, 0x81FC, 0x0408, + 0x81FE, 0x81FE, 0x0677, 0x81FF, 0x81FF, 0x1BDE, 0x8200, 0x8200, 0x0996, + 0x8201, 0x8201, 0x1DBD, 0x8202, 0x8202, 0x0B71, 0x8204, 0x8204, 0x228B, + 0x8205, 0x8205, 0x0ED9, 0x8207, 0x8207, 0x107E, 0x8208, 0x8208, 0x1333, + 0x8209, 0x8209, 0x1458, 0x820A, 0x820A, 0x151A, 0x820B, 0x820B, 0x30EE, + 0x820C, 0x820C, 0x0409, 0x820D, 0x820D, 0x0678, 0x8210, 0x8210, 0x0997, + 0x8211, 0x8211, 0x2013, 0x8212, 0x8212, 0x0D2C, 0x8214, 0x8214, 0x107F, + 0x8215, 0x8215, 0x27A5, 0x8216, 0x8216, 0x29D5, 0x8218, 0x8218, 0x37AA, + 0x821A, 0x821A, 0x3FE1, 0x821B, 0x821B, 0x040A, 0x821C, 0x821C, 0x0D2D, + 0x821D, 0x821D, 0x2529, 0x821E, 0x821E, 0x1080, 0x821F, 0x821F, 0x040B, + 0x8220, 0x8220, 0x1A2E, 0x8221, 0x8221, 0x1BDF, 0x8222, 0x8222, 0x07E8, + 0x8225, 0x8225, 0x1DBF, 0x8226, 0x8226, 0x420D, 0x8228, 0x8228, 0x099A, + 0x8229, 0x8229, 0x37B0, 0x822A, 0x822B, 0x0998, 0x822C, 0x822C, 0x099B, + 0x822D, 0x822D, 0x3ED0, 0x822F, 0x822F, 0x1DBE, 0x8232, 0x8232, 0x2018, + 0x8233, 0x8233, 0x2015, 0x8234, 0x8234, 0x2017, 0x8235, 0x8235, 0x0B72, + 0x8236, 0x8236, 0x0B74, 0x8237, 0x8237, 0x0B73, 0x8238, 0x8238, 0x2014, + 0x8239, 0x8239, 0x0B75, 0x823A, 0x823A, 0x2016, 0x823C, 0x823D, 0x228C, + 0x823E, 0x823E, 0x4582, 0x823F, 0x823F, 0x228E, 0x8240, 0x8240, 0x252C, + 0x8242, 0x8242, 0x252D, 0x8244, 0x8244, 0x252B, 0x8245, 0x8245, 0x252E, + 0x8247, 0x8247, 0x0EDA, 0x8249, 0x8249, 0x252A, 0x824B, 0x824B, 0x1081, + 0x824E, 0x824E, 0x29DA, 0x824F, 0x824F, 0x29D6, 0x8250, 0x8250, 0x29D9, + 0x8251, 0x8251, 0x29DB, 0x8252, 0x8252, 0x29D8, 0x8253, 0x8253, 0x29D7, + 0x8254, 0x8254, 0x4757, 0x8255, 0x8257, 0x2C3C, 0x8258, 0x8259, 0x1334, + 0x825A, 0x825A, 0x2E0F, 0x825B, 0x825B, 0x2E0E, 0x825C, 0x825C, 0x2E10, + 0x825E, 0x825E, 0x2F96, 0x825F, 0x825F, 0x2F95, 0x8261, 0x8261, 0x30F0, + 0x8262, 0x8262, 0x3B7A, 0x8263, 0x8263, 0x30F1, 0x8264, 0x8264, 0x30EF, + 0x8265, 0x8265, 0x3B7B, 0x8266, 0x8266, 0x1636, 0x8268, 0x8269, 0x321D, + 0x826B, 0x826B, 0x33A6, 0x826C, 0x826C, 0x342D, 0x826D, 0x826D, 0x3496, + 0x826E, 0x826E, 0x040C, 0x826F, 0x826F, 0x0504, 0x8271, 0x8271, 0x1459, + 0x8272, 0x8272, 0x040D, 0x8274, 0x8274, 0x2019, 0x8275, 0x8275, 0x228F, + 0x8276, 0x8276, 0x4759, 0x8277, 0x8277, 0x172E, 0x8278, 0x8278, 0x1813, + 0x8279, 0x8279, 0x4722, 0x827A, 0x827A, 0x4563, 0x827B, 0x827B, 0x37C8, + 0x827C, 0x827C, 0x1814, 0x827D, 0x827D, 0x1816, 0x827E, 0x827E, 0x040E, + 0x827F, 0x827F, 0x1817, 0x8280, 0x8280, 0x1815, 0x8283, 0x8284, 0x18E5, + 0x8285, 0x8285, 0x18E0, 0x8287, 0x8287, 0x4132, 0x828A, 0x828A, 0x18E4, + 0x828B, 0x828B, 0x0506, 0x828D, 0x828D, 0x0507, 0x828E, 0x828E, 0x18E1, + 0x828F, 0x828F, 0x18DF, 0x8290, 0x8290, 0x18DE, 0x8291, 0x8291, 0x18E2, + 0x8292, 0x8292, 0x0505, 0x8293, 0x8293, 0x18E3, 0x8294, 0x8294, 0x1BE0, + 0x8298, 0x8298, 0x1A33, 0x8299, 0x8299, 0x067B, 0x829A, 0x829A, 0x1A32, + 0x829B, 0x829B, 0x1A34, 0x829D, 0x829D, 0x067A, 0x829E, 0x829E, 0x1A39, + 0x829F, 0x829F, 0x067E, 0x82A0, 0x82A0, 0x1A2F, 0x82A1, 0x82A1, 0x1A3D, + 0x82A2, 0x82A2, 0x1A43, 0x82A3, 0x82A3, 0x0685, 0x82A4, 0x82A4, 0x1A40, + 0x82A5, 0x82A5, 0x0682, 0x82A6, 0x82A6, 0x3D73, 0x82A7, 0x82A7, 0x1A36, + 0x82A8, 0x82A8, 0x1A3C, 0x82A9, 0x82A9, 0x1A3E, 0x82AA, 0x82AA, 0x37BC, + 0x82AB, 0x82AB, 0x1A31, 0x82AC, 0x82AC, 0x0681, 0x82AD, 0x82AD, 0x067C, + 0x82AE, 0x82AE, 0x1A37, 0x82AF, 0x82AF, 0x0683, 0x82B0, 0x82B0, 0x0686, + 0x82B1, 0x82B1, 0x0680, 0x82B3, 0x82B3, 0x0679, 0x82B4, 0x82B4, 0x1A3B, + 0x82B5, 0x82B5, 0x1A35, 0x82B6, 0x82B6, 0x1A42, 0x82B7, 0x82B7, 0x0688, + 0x82B8, 0x82B8, 0x0684, 0x82B9, 0x82B9, 0x067F, 0x82BA, 0x82BA, 0x1A3A, + 0x82BB, 0x82BB, 0x099C, 0x82BC, 0x82BC, 0x1A38, 0x82BD, 0x82BD, 0x067D, + 0x82BE, 0x82BE, 0x0687, 0x82C0, 0x82C0, 0x1A30, 0x82C2, 0x82C2, 0x1A3F, + 0x82C3, 0x82C3, 0x1A41, 0x82C4, 0x82C4, 0x45E3, 0x82CA, 0x82CA, 0x475A, + 0x82CF, 0x82CF, 0x4564, 0x82D0, 0x82D0, 0x37C1, 0x82D1, 0x82D1, 0x07F9, + 0x82D2, 0x82D2, 0x07F3, 0x82D3, 0x82D3, 0x07FB, 0x82D4, 0x82D4, 0x07F8, + 0x82D5, 0x82D5, 0x1BE7, 0x82D6, 0x82D6, 0x1BEA, 0x82D7, 0x82D7, 0x07F4, + 0x82D8, 0x82D8, 0x475B, 0x82D9, 0x82D9, 0x1BE1, 0x82DB, 0x82DB, 0x07ED, + 0x82DC, 0x82DC, 0x07F7, 0x82DE, 0x82DE, 0x07FA, 0x82DF, 0x82DF, 0x07FC, + 0x82E0, 0x82E0, 0x1BF6, 0x82E1, 0x82E1, 0x1BED, 0x82E2, 0x82E2, 0x37C9, + 0x82E3, 0x82E3, 0x07EC, 0x82E4, 0x82E4, 0x1BF5, 0x82E5, 0x82E5, 0x07F0, + 0x82E6, 0x82E6, 0x07EE, 0x82E7, 0x82E7, 0x07E9, 0x82E8, 0x82E8, 0x1BE5, + 0x82EA, 0x82EA, 0x1BF4, 0x82EB, 0x82EB, 0x1BE9, 0x82EC, 0x82EC, 0x1BEC, + 0x82ED, 0x82ED, 0x1BF9, 0x82EE, 0x82EE, 0x4018, 0x82EF, 0x82EF, 0x07FD, + 0x82F0, 0x82F0, 0x1BF3, 0x82F1, 0x82F1, 0x07F5, 0x82F2, 0x82F2, 0x1BEE, + 0x82F3, 0x82F3, 0x1BF8, 0x82F4, 0x82F4, 0x1BEB, 0x82F5, 0x82F5, 0x1BEF, + 0x82F6, 0x82F6, 0x1BF2, 0x82F7, 0x82F7, 0x3E77, 0x82F9, 0x82F9, 0x1BE3, + 0x82FA, 0x82FA, 0x1BF7, 0x82FB, 0x82FB, 0x1BF1, 0x82FC, 0x82FC, 0x412D, + 0x82FD, 0x82FD, 0x3D92, 0x82FE, 0x82FE, 0x1BE2, 0x82FF, 0x82FF, 0x43DE, + 0x8300, 0x8300, 0x1BE6, 0x8301, 0x8301, 0x07F6, 0x8302, 0x8302, 0x07F1, + 0x8303, 0x8303, 0x07EA, 0x8304, 0x8304, 0x07EF, 0x8305, 0x8305, 0x07EB, + 0x8306, 0x8306, 0x07FE, 0x8307, 0x8307, 0x1BE4, 0x8308, 0x8308, 0x1DD0, + 0x8309, 0x8309, 0x07F2, 0x830B, 0x830B, 0x3EB6, 0x830C, 0x830C, 0x1BF0, + 0x830D, 0x830D, 0x1A7D, 0x8316, 0x8316, 0x1DD3, 0x8317, 0x8317, 0x09AA, + 0x8318, 0x8318, 0x37CA, 0x8319, 0x8319, 0x1DC3, 0x831A, 0x831A, 0x37C2, + 0x831B, 0x831B, 0x1DCE, 0x831C, 0x831C, 0x1DCA, 0x831D, 0x831D, 0x37D1, + 0x831E, 0x831E, 0x1DDD, 0x8320, 0x8320, 0x1DD5, 0x8322, 0x8322, 0x1DCB, + 0x8324, 0x8324, 0x1DD4, 0x8325, 0x8325, 0x1DC5, 0x8326, 0x8326, 0x1DC9, + 0x8327, 0x8327, 0x1DE0, 0x8328, 0x8328, 0x09AD, 0x8329, 0x8329, 0x1DD8, + 0x832A, 0x832A, 0x1DCF, 0x832B, 0x832B, 0x099D, 0x832C, 0x832C, 0x1DDE, + 0x832D, 0x832D, 0x1DC1, 0x832F, 0x832F, 0x1DD7, 0x8331, 0x8331, 0x09AC, + 0x8332, 0x8332, 0x09A7, 0x8333, 0x8333, 0x1DC0, 0x8334, 0x8334, 0x09A5, + 0x8335, 0x8335, 0x09A4, 0x8336, 0x8336, 0x09A9, 0x8337, 0x8337, 0x1DD6, + 0x8338, 0x8338, 0x09A1, 0x8339, 0x8339, 0x09A8, 0x833A, 0x833A, 0x1BE8, + 0x833B, 0x833B, 0x2290, 0x833C, 0x833C, 0x1DD1, 0x833D, 0x833D, 0x3D2A, + 0x833F, 0x833F, 0x1DC7, 0x8340, 0x8340, 0x09AB, 0x8341, 0x8341, 0x1DC8, + 0x8342, 0x8342, 0x1DCC, 0x8343, 0x8343, 0x09AE, 0x8344, 0x8344, 0x1DC2, + 0x8345, 0x8345, 0x1DDA, 0x8347, 0x8347, 0x1DD9, 0x8348, 0x8348, 0x1DE1, + 0x8349, 0x8349, 0x09A3, 0x834A, 0x834A, 0x09A0, 0x834B, 0x834B, 0x1DDF, + 0x834C, 0x834C, 0x1DDB, 0x834D, 0x834D, 0x1DD2, 0x834E, 0x834E, 0x1DCD, + 0x834F, 0x834F, 0x09A6, 0x8350, 0x8350, 0x09A2, 0x8351, 0x8351, 0x1DC4, + 0x8352, 0x8352, 0x099E, 0x8353, 0x8353, 0x1DDC, 0x8354, 0x8354, 0x099F, + 0x8356, 0x8356, 0x1DC6, 0x8357, 0x8357, 0x475D, 0x8362, 0x8362, 0x37B6, + 0x8363, 0x8363, 0x41EB, 0x8366, 0x8366, 0x3E1E, 0x836F, 0x836F, 0x4565, + 0x8373, 0x8373, 0x201F, 0x8374, 0x8374, 0x2021, 0x8375, 0x8375, 0x2026, + 0x8376, 0x8376, 0x203A, 0x8377, 0x8377, 0x0B83, 0x8378, 0x8378, 0x0B79, + 0x837A, 0x837A, 0x201E, 0x837B, 0x837C, 0x0B84, 0x837D, 0x837D, 0x2029, + 0x837E, 0x837E, 0x2030, 0x837F, 0x837F, 0x2036, 0x8381, 0x8381, 0x2023, + 0x8383, 0x8383, 0x202A, 0x8385, 0x8385, 0x37D3, 0x8386, 0x8386, 0x0B86, + 0x8387, 0x8387, 0x2038, 0x8388, 0x8388, 0x2033, 0x8389, 0x8389, 0x0B81, + 0x838A, 0x838A, 0x0B7F, 0x838B, 0x838B, 0x202F, 0x838C, 0x838C, 0x202B, + 0x838D, 0x838D, 0x201D, 0x838E, 0x838E, 0x0B76, 0x838F, 0x838F, 0x2022, + 0x8390, 0x8390, 0x201A, 0x8391, 0x8391, 0x37EC, 0x8392, 0x8392, 0x0B7E, + 0x8393, 0x8393, 0x0B80, 0x8394, 0x8394, 0x2027, 0x8395, 0x8395, 0x2024, + 0x8396, 0x8396, 0x0B7B, 0x8397, 0x8397, 0x2034, 0x8398, 0x8398, 0x0B78, + 0x8399, 0x8399, 0x2025, 0x839A, 0x839A, 0x22B9, 0x839B, 0x839B, 0x202D, + 0x839C, 0x839C, 0x374D, 0x839D, 0x839D, 0x202C, 0x839E, 0x839E, 0x0B77, + 0x83A0, 0x83A0, 0x0B82, 0x83A2, 0x83A2, 0x0B7A, 0x83A3, 0x83A3, 0x201B, + 0x83A4, 0x83A4, 0x2020, 0x83A5, 0x83A5, 0x2031, 0x83A6, 0x83A6, 0x2037, + 0x83A7, 0x83A7, 0x0B87, 0x83A8, 0x83A8, 0x201C, 0x83A9, 0x83A9, 0x2028, + 0x83AA, 0x83AA, 0x202E, 0x83AB, 0x83AB, 0x0B7D, 0x83AC, 0x83AC, 0x37D6, + 0x83AE, 0x83AE, 0x2039, 0x83AF, 0x83AF, 0x2032, 0x83B0, 0x83B0, 0x2035, + 0x83B9, 0x83B9, 0x42A7, 0x83BD, 0x83BD, 0x0B7C, 0x83BE, 0x83BE, 0x3F59, + 0x83BF, 0x83BF, 0x22A0, 0x83C0, 0x83C0, 0x2294, 0x83C1, 0x83C1, 0x0D35, + 0x83C2, 0x83C2, 0x22B1, 0x83C3, 0x83C3, 0x22BA, 0x83C4, 0x83C4, 0x22BD, + 0x83C5, 0x83C5, 0x0D33, 0x83C6, 0x83C6, 0x229C, 0x83C7, 0x83C7, 0x22B5, + 0x83C8, 0x83C8, 0x229D, 0x83C9, 0x83C9, 0x22AB, 0x83CA, 0x83CA, 0x0D40, + 0x83CB, 0x83CB, 0x22A7, 0x83CC, 0x83CC, 0x0D3D, 0x83CD, 0x83CD, 0x4055, + 0x83CE, 0x83CE, 0x22A8, 0x83CF, 0x83CF, 0x2291, 0x83D1, 0x83D1, 0x22B6, + 0x83D3, 0x83D3, 0x37D8, 0x83D4, 0x83D4, 0x0D46, 0x83D5, 0x83D5, 0x22B3, + 0x83D6, 0x83D6, 0x22A9, 0x83D7, 0x83D7, 0x22BF, 0x83D8, 0x83D8, 0x22A4, + 0x83D9, 0x83D9, 0x254E, 0x83DB, 0x83DB, 0x22C2, 0x83DC, 0x83DC, 0x0D44, + 0x83DD, 0x83DD, 0x22A2, 0x83DE, 0x83DE, 0x22AE, 0x83DF, 0x83DF, 0x0D47, + 0x83E0, 0x83E0, 0x0D32, 0x83E1, 0x83E1, 0x22A6, 0x83E2, 0x83E2, 0x22C0, + 0x83E3, 0x83E3, 0x229F, 0x83E4, 0x83E4, 0x2298, 0x83E5, 0x83E5, 0x22A3, + 0x83E7, 0x83E7, 0x2297, 0x83E8, 0x83E8, 0x2295, 0x83E9, 0x83E9, 0x0D2E, + 0x83EA, 0x83EA, 0x22B7, 0x83EB, 0x83EB, 0x229E, 0x83EC, 0x83EC, 0x22BB, + 0x83ED, 0x83ED, 0x3D2C, 0x83EE, 0x83EE, 0x22BC, 0x83EF, 0x83EF, 0x0D36, + 0x83F0, 0x83F0, 0x0D3B, 0x83F1, 0x83F1, 0x0D37, 0x83F2, 0x83F2, 0x0D3F, + 0x83F3, 0x83F3, 0x22B2, 0x83F4, 0x83F4, 0x0D38, 0x83F5, 0x83F5, 0x22AA, + 0x83F6, 0x83F6, 0x229A, 0x83F8, 0x83F8, 0x0D30, 0x83F9, 0x83F9, 0x2292, + 0x83FA, 0x83FA, 0x22B4, 0x83FB, 0x83FB, 0x22BE, 0x83FC, 0x83FC, 0x2299, + 0x83FD, 0x83FD, 0x0D3E, 0x83FE, 0x83FE, 0x22C3, 0x83FF, 0x83FF, 0x22A5, + 0x8401, 0x8401, 0x22A1, 0x8403, 0x8403, 0x0D2F, 0x8404, 0x8404, 0x0D43, + 0x8405, 0x8405, 0x475F, 0x8406, 0x8406, 0x22B0, 0x8407, 0x8407, 0x0D45, + 0x8409, 0x8409, 0x22AC, 0x840A, 0x840A, 0x0D3A, 0x840B, 0x840B, 0x0D34, + 0x840C, 0x840C, 0x0D3C, 0x840D, 0x840D, 0x0D31, 0x840E, 0x840E, 0x0D42, + 0x840F, 0x840F, 0x22AD, 0x8410, 0x8410, 0x229B, 0x8411, 0x8411, 0x22AF, + 0x8412, 0x8412, 0x2296, 0x8413, 0x8413, 0x22B8, 0x8414, 0x8414, 0x3C10, + 0x8416, 0x8416, 0x4037, 0x8418, 0x8418, 0x3E7A, 0x841B, 0x841B, 0x22C1, + 0x841C, 0x841C, 0x3EB3, 0x8420, 0x8420, 0x3C55, 0x8421, 0x8421, 0x3751, + 0x8423, 0x8423, 0x2293, 0x8424, 0x8424, 0x4951, 0x8426, 0x8426, 0x46D8, + 0x8429, 0x8429, 0x254D, 0x842B, 0x842B, 0x2563, 0x842C, 0x842C, 0x0EAC, + 0x842D, 0x842D, 0x2552, 0x842E, 0x842E, 0x422D, 0x842F, 0x842F, 0x2550, + 0x8430, 0x8430, 0x253B, 0x8431, 0x8431, 0x0EDE, 0x8432, 0x8432, 0x254B, + 0x8433, 0x8433, 0x255F, 0x8434, 0x8434, 0x2547, 0x8435, 0x8435, 0x0EE6, + 0x8436, 0x8436, 0x255E, 0x8437, 0x8437, 0x2545, 0x8438, 0x8438, 0x0D41, + 0x8439, 0x8439, 0x2555, 0x843A, 0x843A, 0x2546, 0x843B, 0x843B, 0x255C, + 0x843C, 0x843C, 0x0EE5, 0x843D, 0x843D, 0x0EDD, 0x843E, 0x843E, 0x3D21, + 0x843F, 0x843F, 0x2530, 0x8440, 0x8440, 0x2538, 0x8442, 0x8442, 0x2551, + 0x8443, 0x8443, 0x2549, 0x8444, 0x8444, 0x2562, 0x8445, 0x8445, 0x254C, + 0x8446, 0x8446, 0x0EEB, 0x8447, 0x8447, 0x255D, 0x8448, 0x8448, 0x4718, + 0x8449, 0x8449, 0x0EE2, 0x844A, 0x844A, 0x37E4, 0x844B, 0x844B, 0x254F, + 0x844C, 0x844C, 0x2557, 0x844D, 0x844D, 0x253C, 0x844E, 0x844E, 0x2556, + 0x8450, 0x8450, 0x2567, 0x8451, 0x8451, 0x2537, 0x8452, 0x8452, 0x2558, + 0x8453, 0x8453, 0x3B7D, 0x8454, 0x8454, 0x2565, 0x8455, 0x8455, 0x398B, + 0x8456, 0x8456, 0x2531, 0x8457, 0x8457, 0x0D39, 0x8458, 0x8458, 0x37DE, + 0x8459, 0x8459, 0x253F, 0x845A, 0x845A, 0x253E, 0x845B, 0x845B, 0x0EE4, + 0x845C, 0x845C, 0x3EDB, 0x845D, 0x845D, 0x2542, 0x845E, 0x845E, 0x2544, + 0x845F, 0x845F, 0x2553, 0x8460, 0x8460, 0x2564, 0x8461, 0x8461, 0x0EE7, + 0x8462, 0x8462, 0x42DA, 0x8463, 0x8463, 0x0EE8, 0x8464, 0x8464, 0x4761, + 0x8465, 0x8465, 0x2536, 0x8466, 0x8466, 0x0EE0, 0x8467, 0x8467, 0x253A, + 0x8468, 0x8468, 0x2560, 0x8469, 0x8469, 0x0EE9, 0x846B, 0x846B, 0x0EE1, + 0x846C, 0x846C, 0x0EE3, 0x846D, 0x846D, 0x0EEA, 0x846E, 0x846E, 0x2566, + 0x846F, 0x846F, 0x2559, 0x8470, 0x8470, 0x2554, 0x8471, 0x8471, 0x37E0, + 0x8472, 0x8472, 0x3C93, 0x8473, 0x8473, 0x2541, 0x8474, 0x8474, 0x2540, + 0x8475, 0x8475, 0x0EDF, 0x8476, 0x8476, 0x2532, 0x8477, 0x8477, 0x0EDC, + 0x8478, 0x8478, 0x254A, 0x8479, 0x8479, 0x2533, 0x847A, 0x847A, 0x2548, + 0x847D, 0x847D, 0x253D, 0x847E, 0x847E, 0x2561, 0x847F, 0x847F, 0x394E, + 0x8480, 0x8480, 0x3B6E, 0x8482, 0x8482, 0x0EDB, 0x8486, 0x8486, 0x2539, + 0x8488, 0x8488, 0x4762, 0x848D, 0x848D, 0x2535, 0x848E, 0x848E, 0x255B, + 0x848F, 0x848F, 0x2534, 0x8490, 0x8490, 0x108E, 0x8491, 0x8491, 0x27CD, + 0x8492, 0x8492, 0x3756, 0x8493, 0x8493, 0x37EE, 0x8494, 0x8494, 0x27BC, + 0x8496, 0x8496, 0x3B1D, 0x8497, 0x8497, 0x27A6, 0x8498, 0x8498, 0x27C4, + 0x8499, 0x8499, 0x1086, 0x849A, 0x849A, 0x27B5, 0x849B, 0x849B, 0x27BF, + 0x849C, 0x849C, 0x1089, 0x849D, 0x849D, 0x27B8, 0x849E, 0x849E, 0x1087, + 0x849F, 0x849F, 0x27A9, 0x84A0, 0x84A0, 0x27C7, 0x84A1, 0x84A1, 0x27A8, + 0x84A2, 0x84A2, 0x27BB, 0x84A3, 0x84A3, 0x3B9E, 0x84A4, 0x84A4, 0x27A7, + 0x84A7, 0x84A7, 0x27B9, 0x84A8, 0x84A8, 0x27C2, 0x84A9, 0x84A9, 0x27C0, + 0x84AA, 0x84AA, 0x27B4, 0x84AB, 0x84AB, 0x27AF, 0x84AC, 0x84AC, 0x27AD, + 0x84AD, 0x84AD, 0x3D8C, 0x84AE, 0x84AE, 0x27AE, 0x84AF, 0x84AF, 0x27C1, + 0x84B0, 0x84B0, 0x27CC, 0x84B1, 0x84B1, 0x27B6, 0x84B2, 0x84B2, 0x1088, + 0x84B4, 0x84B4, 0x27B1, 0x84B6, 0x84B6, 0x27C5, 0x84B8, 0x84B8, 0x108B, + 0x84B9, 0x84B9, 0x27B0, 0x84BA, 0x84BA, 0x27AA, 0x84BB, 0x84BB, 0x27BA, + 0x84BC, 0x84BC, 0x108F, 0x84BD, 0x84BD, 0x3C4C, 0x84BE, 0x84BE, 0x4764, + 0x84BF, 0x84BF, 0x1083, 0x84C0, 0x84C0, 0x108C, 0x84C1, 0x84C1, 0x27B2, + 0x84C2, 0x84C2, 0x27AC, 0x84C4, 0x84C4, 0x1085, 0x84C5, 0x84C5, 0x255A, + 0x84C6, 0x84C6, 0x1084, 0x84C7, 0x84C7, 0x27BD, 0x84C9, 0x84C9, 0x1082, + 0x84CA, 0x84CA, 0x1091, 0x84CB, 0x84CB, 0x108A, 0x84CC, 0x84CC, 0x27BE, + 0x84CD, 0x84CD, 0x27B3, 0x84CE, 0x84CE, 0x27AB, 0x84CF, 0x84CF, 0x27C6, + 0x84D0, 0x84D0, 0x27B7, 0x84D1, 0x84D1, 0x1090, 0x84D2, 0x84D2, 0x27CA, + 0x84D3, 0x84D3, 0x108D, 0x84D4, 0x84D4, 0x27C9, 0x84D6, 0x84D6, 0x27C3, + 0x84D7, 0x84D7, 0x27C8, 0x84DA, 0x84DA, 0x3FF5, 0x84DB, 0x84DB, 0x27CB, + 0x84DE, 0x84DE, 0x37EA, 0x84E1, 0x84E1, 0x4765, 0x84E2, 0x84E2, 0x37B5, + 0x84E4, 0x84E4, 0x37EF, 0x84E5, 0x84E5, 0x3BD0, 0x84E7, 0x84E8, 0x2A03, + 0x84E9, 0x84E9, 0x29F7, 0x84EA, 0x84EA, 0x29F6, 0x84EB, 0x84EB, 0x29F2, + 0x84EC, 0x84EC, 0x11FB, 0x84EE, 0x84EE, 0x11F3, 0x84EF, 0x84EF, 0x2A06, + 0x84F0, 0x84F0, 0x2A05, 0x84F1, 0x84F1, 0x252F, 0x84F2, 0x84F2, 0x29EF, + 0x84F3, 0x84F3, 0x29F3, 0x84F4, 0x84F4, 0x29ED, 0x84F6, 0x84F6, 0x2A00, + 0x84F7, 0x84F7, 0x29F1, 0x84F8, 0x84F8, 0x4766, 0x84F9, 0x84F9, 0x2A07, + 0x84FA, 0x84FA, 0x29EA, 0x84FB, 0x84FB, 0x29E8, 0x84FC, 0x84FC, 0x29F4, + 0x84FD, 0x84FD, 0x29FE, 0x84FE, 0x84FE, 0x29F9, 0x84FF, 0x84FF, 0x11FD, + 0x8500, 0x8500, 0x29DF, 0x8502, 0x8502, 0x29FD, 0x8503, 0x8503, 0x398A, + 0x8505, 0x8505, 0x40EB, 0x8506, 0x8506, 0x11FE, 0x8507, 0x8507, 0x2543, + 0x8508, 0x8508, 0x29EB, 0x8509, 0x8509, 0x29E2, 0x850A, 0x850A, 0x29E5, + 0x850B, 0x850B, 0x2A0B, 0x850C, 0x850C, 0x29EC, 0x850D, 0x850D, 0x29E3, + 0x850E, 0x850E, 0x29E1, 0x850F, 0x850F, 0x29DE, 0x8510, 0x8510, 0x4767, + 0x8511, 0x8511, 0x11F7, 0x8512, 0x8512, 0x29F5, 0x8513, 0x8513, 0x11F6, + 0x8514, 0x8514, 0x11FA, 0x8515, 0x8515, 0x29F0, 0x8516, 0x8516, 0x29F8, + 0x8517, 0x8517, 0x11F0, 0x8518, 0x8518, 0x2A08, 0x8519, 0x8519, 0x2A0C, + 0x851A, 0x851A, 0x11F2, 0x851C, 0x851C, 0x29E7, 0x851D, 0x851D, 0x29FB, + 0x851E, 0x851E, 0x29FF, 0x851F, 0x851F, 0x29E4, 0x8520, 0x8520, 0x2A09, + 0x8521, 0x8521, 0x11F9, 0x8523, 0x8523, 0x11F8, 0x8524, 0x8524, 0x29DC, + 0x8525, 0x8525, 0x11FC, 0x8526, 0x8526, 0x2A02, 0x8527, 0x8527, 0x29E6, + 0x8528, 0x8528, 0x29FA, 0x8529, 0x8529, 0x29E0, 0x852A, 0x852A, 0x29EE, + 0x852B, 0x852B, 0x29E9, 0x852C, 0x852D, 0x11F4, 0x852E, 0x852E, 0x29FC, + 0x852F, 0x852F, 0x2A0D, 0x8530, 0x8530, 0x2A0A, 0x8531, 0x8531, 0x2A01, + 0x8533, 0x8533, 0x4228, 0x8534, 0x8534, 0x37F4, 0x8538, 0x8538, 0x4768, + 0x853B, 0x853B, 0x29DD, 0x853D, 0x853D, 0x11F1, 0x853E, 0x853E, 0x2C4F, + 0x8540, 0x8540, 0x2C46, 0x8541, 0x8541, 0x2C49, 0x8542, 0x8542, 0x4062, + 0x8543, 0x8543, 0x133B, 0x8544, 0x8544, 0x2C4B, 0x8545, 0x8545, 0x2C40, + 0x8546, 0x8546, 0x2C47, 0x8547, 0x8547, 0x2C4D, 0x8548, 0x8548, 0x1338, + 0x8549, 0x8549, 0x133C, 0x854A, 0x854A, 0x1336, 0x854B, 0x854B, 0x37C0, + 0x854C, 0x854C, 0x400F, 0x854D, 0x854D, 0x2C42, 0x854E, 0x854E, 0x2C52, + 0x8551, 0x8551, 0x2C4C, 0x8552, 0x8552, 0x4769, 0x8553, 0x8553, 0x2C43, + 0x8554, 0x8554, 0x2C5B, 0x8555, 0x8555, 0x2C55, 0x8556, 0x8556, 0x2C3F, + 0x8557, 0x8557, 0x2E23, 0x8558, 0x8558, 0x2C45, 0x8559, 0x8559, 0x1337, + 0x855A, 0x855A, 0x37DB, 0x855B, 0x855B, 0x2C50, 0x855D, 0x855D, 0x2C5A, + 0x855E, 0x855E, 0x133F, 0x8560, 0x8560, 0x2C57, 0x8561, 0x8561, 0x2C44, + 0x8562, 0x8562, 0x2C4A, 0x8563, 0x8563, 0x2C4E, 0x8564, 0x8564, 0x2C48, + 0x8565, 0x8565, 0x2C5C, 0x8566, 0x8566, 0x2C59, 0x8567, 0x8567, 0x2C56, + 0x8568, 0x8569, 0x1339, 0x856A, 0x856A, 0x133E, 0x856B, 0x856B, 0x2C41, + 0x856C, 0x856C, 0x2C5D, 0x856D, 0x856D, 0x133D, 0x856E, 0x856E, 0x2C53, + 0x856F, 0x8570, 0x476B, 0x8571, 0x8571, 0x2C51, 0x8573, 0x8573, 0x37F8, + 0x8575, 0x8575, 0x2C54, 0x8576, 0x8576, 0x2E30, 0x8577, 0x8577, 0x2E1D, + 0x8578, 0x8578, 0x2E22, 0x8579, 0x8579, 0x2E2F, 0x857A, 0x857A, 0x2E21, + 0x857B, 0x857B, 0x2E19, 0x857C, 0x857C, 0x2E1E, 0x857E, 0x857E, 0x145C, + 0x8580, 0x8580, 0x2E12, 0x8581, 0x8581, 0x2E2A, 0x8582, 0x8582, 0x2E2C, + 0x8583, 0x8583, 0x2E11, 0x8584, 0x8584, 0x145B, 0x8585, 0x8585, 0x2E2E, + 0x8586, 0x8586, 0x2E26, 0x8587, 0x8587, 0x1462, 0x8588, 0x8588, 0x2E2D, + 0x8589, 0x8589, 0x2E1F, 0x858A, 0x858A, 0x1464, 0x858B, 0x858B, 0x2E17, + 0x858C, 0x858C, 0x2C58, 0x858D, 0x858D, 0x2E27, 0x858E, 0x858E, 0x2E24, + 0x858F, 0x858F, 0x2E13, 0x8590, 0x8590, 0x2E32, 0x8591, 0x8591, 0x145E, + 0x8594, 0x8594, 0x145F, 0x8595, 0x8595, 0x2E15, 0x8596, 0x8596, 0x2E25, + 0x8598, 0x8598, 0x2E31, 0x8599, 0x8599, 0x2E28, 0x859A, 0x859A, 0x2E1B, + 0x859B, 0x859B, 0x1461, 0x859C, 0x859C, 0x145D, 0x859D, 0x859D, 0x2E29, + 0x859E, 0x859E, 0x2E1C, 0x859F, 0x859F, 0x2E33, 0x85A0, 0x85A0, 0x2E16, + 0x85A1, 0x85A1, 0x2E20, 0x85A2, 0x85A2, 0x2E2B, 0x85A3, 0x85A3, 0x2E18, + 0x85A4, 0x85A4, 0x2E1A, 0x85A6, 0x85A6, 0x1465, 0x85A7, 0x85A7, 0x2E14, + 0x85A8, 0x85A8, 0x1463, 0x85A9, 0x85A9, 0x151C, 0x85AA, 0x85AA, 0x145A, + 0x85AF, 0x85AF, 0x1460, 0x85B0, 0x85B0, 0x1520, 0x85B1, 0x85B1, 0x2FA6, + 0x85B3, 0x85B3, 0x2F9C, 0x85B4, 0x85B4, 0x2F97, 0x85B5, 0x85B5, 0x2F9D, + 0x85B6, 0x85B6, 0x2FA7, 0x85B7, 0x85B7, 0x2FAB, 0x85B8, 0x85B8, 0x2FAA, + 0x85B9, 0x85B9, 0x1522, 0x85BA, 0x85BA, 0x1521, 0x85BD, 0x85BD, 0x2F9E, + 0x85BE, 0x85BE, 0x2FAC, 0x85BF, 0x85BF, 0x2FA1, 0x85C0, 0x85C0, 0x2F99, + 0x85C1, 0x85C1, 0x37FE, 0x85C2, 0x85C2, 0x2F9B, 0x85C3, 0x85C3, 0x2F9A, + 0x85C4, 0x85C4, 0x2FA0, 0x85C5, 0x85C5, 0x2FA5, 0x85C6, 0x85C6, 0x2F98, + 0x85C7, 0x85C7, 0x2F9F, 0x85C8, 0x85C8, 0x2FA4, 0x85C9, 0x85C9, 0x151F, + 0x85CB, 0x85CB, 0x2FA2, 0x85CD, 0x85CD, 0x151D, 0x85CE, 0x85CE, 0x2FA3, + 0x85CF, 0x85CF, 0x151B, 0x85D0, 0x85D0, 0x151E, 0x85D1, 0x85D1, 0x3101, + 0x85D2, 0x85D2, 0x2FA8, 0x85D5, 0x85D5, 0x15B7, 0x85D7, 0x85D7, 0x30F9, + 0x85D8, 0x85D8, 0x30FD, 0x85D9, 0x85D9, 0x30F5, 0x85DA, 0x85DA, 0x30F8, + 0x85DC, 0x85DC, 0x3100, 0x85DD, 0x85DD, 0x15B5, 0x85DE, 0x85DE, 0x3105, + 0x85DF, 0x85DF, 0x30FE, 0x85E0, 0x85E0, 0x476D, 0x85E1, 0x85E1, 0x30F6, + 0x85E2, 0x85E2, 0x3106, 0x85E3, 0x85E3, 0x30FF, 0x85E4, 0x85E5, 0x15B8, + 0x85E6, 0x85E6, 0x3103, 0x85E8, 0x85E8, 0x30F7, 0x85E9, 0x85E9, 0x15B4, + 0x85EA, 0x85EA, 0x15B6, 0x85EB, 0x85EB, 0x30F2, 0x85EC, 0x85EC, 0x30FA, + 0x85ED, 0x85ED, 0x30F4, 0x85EE, 0x85EE, 0x3C56, 0x85EF, 0x85EF, 0x3104, + 0x85F0, 0x85F0, 0x3102, 0x85F1, 0x85F1, 0x30F3, 0x85F2, 0x85F2, 0x30FB, + 0x85F6, 0x85F6, 0x3225, 0x85F7, 0x85F7, 0x15BA, 0x85F8, 0x85F8, 0x30FC, + 0x85F9, 0x85F9, 0x1638, 0x85FA, 0x85FA, 0x163A, 0x85FB, 0x85FB, 0x1637, + 0x85FC, 0x85FC, 0x3C50, 0x85FD, 0x85FD, 0x322A, 0x85FE, 0x85FE, 0x3222, + 0x85FF, 0x85FF, 0x3220, 0x8600, 0x8600, 0x3224, 0x8601, 0x8601, 0x3221, + 0x8602, 0x8602, 0x3800, 0x8604, 0x8604, 0x3226, 0x8605, 0x8605, 0x3228, + 0x8606, 0x8606, 0x163B, 0x8607, 0x8607, 0x163D, 0x8609, 0x8609, 0x3227, + 0x860A, 0x860A, 0x163E, 0x860B, 0x860B, 0x163C, 0x860C, 0x860C, 0x3229, + 0x860D, 0x860D, 0x4064, 0x8610, 0x8610, 0x3B7F, 0x8611, 0x8611, 0x1639, + 0x8614, 0x8614, 0x46BE, 0x8616, 0x8616, 0x37FB, 0x8617, 0x8617, 0x1685, + 0x8618, 0x8618, 0x32F6, 0x8619, 0x8619, 0x32FC, 0x861A, 0x861A, 0x1687, + 0x861B, 0x861B, 0x3223, 0x861C, 0x861C, 0x32FB, 0x861E, 0x861E, 0x3302, + 0x861F, 0x861F, 0x32F9, 0x8620, 0x8620, 0x3300, 0x8621, 0x8621, 0x32FF, + 0x8622, 0x8622, 0x321F, 0x8623, 0x8623, 0x32FA, 0x8624, 0x8624, 0x2FA9, + 0x8625, 0x8625, 0x3303, 0x8626, 0x8626, 0x32F8, 0x8627, 0x8627, 0x32FD, + 0x8628, 0x8628, 0x3805, 0x8629, 0x8629, 0x3301, 0x862A, 0x862A, 0x32F7, + 0x862C, 0x862C, 0x33AA, 0x862D, 0x862D, 0x1686, 0x862E, 0x862E, 0x32FE, + 0x862F, 0x862F, 0x3F9E, 0x8631, 0x8631, 0x3432, 0x8632, 0x8632, 0x33AB, + 0x8633, 0x8633, 0x33A9, 0x8634, 0x8635, 0x33A7, 0x8636, 0x8636, 0x33AC, + 0x8638, 0x8638, 0x1707, 0x8639, 0x8639, 0x3430, 0x863A, 0x863A, 0x342E, + 0x863B, 0x863B, 0x3433, 0x863C, 0x863C, 0x3431, 0x863E, 0x863E, 0x3434, + 0x863F, 0x863F, 0x1708, 0x8640, 0x8640, 0x342F, 0x8642, 0x8642, 0x38C1, + 0x8643, 0x8643, 0x3497, 0x8645, 0x8645, 0x3B66, 0x8646, 0x8648, 0x34DF, + 0x864B, 0x864B, 0x353E, 0x864C, 0x864C, 0x3536, 0x864D, 0x864D, 0x1818, + 0x864E, 0x864E, 0x0689, 0x8650, 0x8650, 0x07FF, 0x8652, 0x8652, 0x1DE3, + 0x8653, 0x8653, 0x1DE2, 0x8654, 0x8654, 0x09AF, 0x8655, 0x8655, 0x0B88, + 0x8656, 0x8656, 0x203C, 0x8659, 0x8659, 0x203B, 0x865B, 0x865B, 0x0D48, + 0x865C, 0x865C, 0x0EED, 0x865E, 0x865E, 0x0EEC, 0x865F, 0x865F, 0x0EEE, + 0x8661, 0x8661, 0x27CE, 0x8662, 0x8662, 0x2A0E, 0x8663, 0x8663, 0x2C5E, + 0x8664, 0x8664, 0x2C60, 0x8665, 0x8665, 0x2C5F, 0x8667, 0x8667, 0x1466, + 0x8668, 0x8668, 0x2E34, 0x8669, 0x8669, 0x2FAD, 0x866A, 0x866A, 0x351E, + 0x866B, 0x866B, 0x040F, 0x866C, 0x866C, 0x3813, 0x866D, 0x866E, 0x1A46, + 0x866F, 0x866F, 0x1A45, 0x8670, 0x8670, 0x1A44, 0x8671, 0x8671, 0x068A, + 0x8672, 0x8672, 0x476F, 0x8673, 0x8673, 0x1BFD, 0x8674, 0x8674, 0x1BFB, + 0x8677, 0x8677, 0x1BFA, 0x8679, 0x8679, 0x0800, 0x867A, 0x867A, 0x0802, + 0x867B, 0x867B, 0x0801, 0x867C, 0x867C, 0x1BFC, 0x867E, 0x867E, 0x380A, + 0x8685, 0x8685, 0x1DEF, 0x8686, 0x8686, 0x1DEC, 0x8687, 0x8687, 0x1DEA, + 0x868A, 0x868A, 0x09B0, 0x868B, 0x868B, 0x1DED, 0x868C, 0x868C, 0x09B5, + 0x868D, 0x868D, 0x1DE7, 0x868E, 0x868E, 0x1DF6, 0x8690, 0x8690, 0x1DF8, + 0x8691, 0x8691, 0x1DE8, 0x8692, 0x8692, 0x4770, 0x8693, 0x8693, 0x09B2, + 0x8694, 0x8694, 0x1DF9, 0x8695, 0x8695, 0x1DF4, 0x8696, 0x8696, 0x1DE6, + 0x8697, 0x8697, 0x1DEB, 0x8698, 0x8698, 0x1DF5, 0x8699, 0x8699, 0x1DF1, + 0x869A, 0x869A, 0x1DEE, 0x869C, 0x869C, 0x09B7, 0x869D, 0x869D, 0x1DF7, + 0x869E, 0x869E, 0x1DE9, 0x86A0, 0x86A0, 0x3B88, 0x86A1, 0x86A1, 0x1DF2, + 0x86A2, 0x86A2, 0x1DE4, 0x86A3, 0x86A3, 0x09B6, 0x86A4, 0x86A4, 0x09B3, + 0x86A5, 0x86A5, 0x1DF0, 0x86A7, 0x86A7, 0x1DF3, 0x86A8, 0x86A8, 0x1DE5, + 0x86A9, 0x86A9, 0x09B4, 0x86AA, 0x86AA, 0x09B1, 0x86AD, 0x86AD, 0x3F06, + 0x86AF, 0x86AF, 0x0B92, 0x86B0, 0x86B0, 0x2043, 0x86B1, 0x86B1, 0x0B91, + 0x86B2, 0x86B2, 0x43E0, 0x86B3, 0x86B3, 0x2046, 0x86B4, 0x86B4, 0x2049, + 0x86B5, 0x86B5, 0x0B8E, 0x86B6, 0x86B6, 0x0B8C, 0x86B7, 0x86B7, 0x203E, + 0x86B8, 0x86B8, 0x2047, 0x86B9, 0x86B9, 0x2045, 0x86BA, 0x86BA, 0x2042, + 0x86BB, 0x86BC, 0x204A, 0x86BD, 0x86BE, 0x204D, 0x86BF, 0x86BF, 0x203D, + 0x86C0, 0x86C0, 0x0B8B, 0x86C1, 0x86C1, 0x2040, 0x86C2, 0x86C2, 0x203F, + 0x86C3, 0x86C3, 0x204C, 0x86C4, 0x86C4, 0x0B8D, 0x86C5, 0x86C5, 0x2041, + 0x86C6, 0x86C6, 0x0B8F, 0x86C7, 0x86C7, 0x0B8A, 0x86C8, 0x86C8, 0x2044, + 0x86C9, 0x86C9, 0x0B93, 0x86CB, 0x86CB, 0x0B90, 0x86CC, 0x86CC, 0x2048, + 0x86D0, 0x86D0, 0x0D4F, 0x86D1, 0x86D1, 0x22D2, 0x86D3, 0x86D3, 0x22C7, + 0x86D4, 0x86D4, 0x0D4C, 0x86D6, 0x86D6, 0x256D, 0x86D7, 0x86D7, 0x22D0, + 0x86D8, 0x86D8, 0x22C4, 0x86D9, 0x86D9, 0x0D4A, 0x86DA, 0x86DA, 0x22C9, + 0x86DB, 0x86DB, 0x0D4D, 0x86DC, 0x86DC, 0x22CD, 0x86DD, 0x86DD, 0x22CB, + 0x86DE, 0x86DE, 0x0D50, 0x86DF, 0x86DF, 0x0D49, 0x86E2, 0x86E2, 0x22C5, + 0x86E3, 0x86E3, 0x22C8, 0x86E4, 0x86E4, 0x0D4E, 0x86E6, 0x86E6, 0x22C6, + 0x86E8, 0x86E8, 0x22D1, 0x86E9, 0x86E9, 0x22CF, 0x86EA, 0x86EA, 0x22CA, + 0x86EB, 0x86EB, 0x22CC, 0x86EC, 0x86EC, 0x22CE, 0x86ED, 0x86ED, 0x0D4B, + 0x86EF, 0x86EF, 0x4771, 0x86F5, 0x86F5, 0x256E, 0x86F6, 0x86F6, 0x2574, + 0x86F7, 0x86F7, 0x256A, 0x86F8, 0x86F8, 0x2570, 0x86F9, 0x86F9, 0x0EEF, + 0x86FA, 0x86FA, 0x256C, 0x86FB, 0x86FB, 0x0EF5, 0x86FE, 0x86FE, 0x0EF4, + 0x8700, 0x8700, 0x0EF3, 0x8701, 0x8701, 0x2573, 0x8702, 0x8703, 0x0EF6, + 0x8704, 0x8704, 0x2569, 0x8705, 0x8705, 0x2576, 0x8706, 0x8706, 0x0EF8, + 0x8707, 0x8707, 0x0EF2, 0x8708, 0x8708, 0x0EF1, 0x8709, 0x8709, 0x2572, + 0x870A, 0x870A, 0x0EF9, 0x870B, 0x870B, 0x2568, 0x870C, 0x870C, 0x256B, + 0x870D, 0x870D, 0x2575, 0x870E, 0x870E, 0x2571, 0x8711, 0x8711, 0x27EE, + 0x8712, 0x8712, 0x27E3, 0x8713, 0x8713, 0x0EF0, 0x8718, 0x8718, 0x1098, + 0x8719, 0x8719, 0x27D7, 0x871A, 0x871A, 0x27EC, 0x871B, 0x871B, 0x27D8, + 0x871C, 0x871C, 0x1093, 0x871E, 0x871E, 0x27D5, 0x8720, 0x8720, 0x27DE, + 0x8721, 0x8721, 0x27D6, 0x8722, 0x8722, 0x1095, 0x8723, 0x8723, 0x27D0, + 0x8724, 0x8724, 0x27EB, 0x8725, 0x8725, 0x1096, 0x8726, 0x8727, 0x27E8, + 0x8728, 0x8728, 0x27D1, 0x8729, 0x8729, 0x109B, 0x872A, 0x872A, 0x27E0, + 0x872C, 0x872C, 0x27DA, 0x872D, 0x872D, 0x27E1, 0x872E, 0x872E, 0x27D4, + 0x8730, 0x8730, 0x27ED, 0x8731, 0x8731, 0x27E5, 0x8732, 0x8732, 0x27DF, + 0x8733, 0x8733, 0x27CF, 0x8734, 0x8734, 0x1097, 0x8735, 0x8735, 0x27E6, + 0x8737, 0x8737, 0x109A, 0x8738, 0x8738, 0x27EA, 0x873A, 0x873A, 0x27E4, + 0x873B, 0x873B, 0x1094, 0x873C, 0x873C, 0x27E2, 0x873E, 0x873E, 0x27DC, + 0x873F, 0x873F, 0x1092, 0x8740, 0x8740, 0x27D3, 0x8741, 0x8741, 0x27DB, + 0x8742, 0x8742, 0x27E7, 0x8743, 0x8743, 0x27D9, 0x8746, 0x8746, 0x27DD, + 0x874C, 0x874C, 0x1208, 0x874D, 0x874D, 0x256F, 0x874E, 0x874E, 0x2A20, + 0x874F, 0x874F, 0x2A29, 0x8750, 0x8750, 0x2A1F, 0x8751, 0x8751, 0x2A1B, + 0x8752, 0x8752, 0x2A18, 0x8753, 0x8753, 0x1209, 0x8754, 0x8754, 0x2A16, + 0x8755, 0x8755, 0x1099, 0x8756, 0x8756, 0x2A0F, 0x8757, 0x8757, 0x1207, + 0x8758, 0x8758, 0x2A15, 0x8759, 0x8759, 0x1206, 0x875A, 0x875A, 0x2A1A, + 0x875B, 0x875B, 0x2A17, 0x875C, 0x875C, 0x2A27, 0x875D, 0x875D, 0x2A22, + 0x875E, 0x875E, 0x2A1C, 0x875F, 0x875F, 0x2A21, 0x8760, 0x8760, 0x1202, + 0x8761, 0x8761, 0x2A19, 0x8762, 0x8762, 0x2A2C, 0x8763, 0x8764, 0x2A10, + 0x8765, 0x8765, 0x2A28, 0x8766, 0x8766, 0x1203, 0x8767, 0x8767, 0x2A2D, + 0x8768, 0x8768, 0x1205, 0x8769, 0x8769, 0x2A2E, 0x876A, 0x876A, 0x2A1E, + 0x876B, 0x876B, 0x27D2, 0x876C, 0x876C, 0x2A24, 0x876D, 0x876D, 0x2A1D, + 0x876E, 0x876E, 0x2A26, 0x876F, 0x876F, 0x2A23, 0x8770, 0x8770, 0x3E6C, + 0x8771, 0x8771, 0x380B, 0x8773, 0x8773, 0x2A14, 0x8774, 0x8774, 0x1200, + 0x8775, 0x8775, 0x2A2B, 0x8776, 0x8776, 0x1201, 0x8777, 0x8777, 0x2A12, + 0x8778, 0x8778, 0x1204, 0x8779, 0x8779, 0x2C6B, 0x877A, 0x877A, 0x2A25, + 0x877B, 0x877B, 0x2A2A, 0x877D, 0x877D, 0x4045, 0x8781, 0x8781, 0x2C68, + 0x8782, 0x8782, 0x11FF, 0x8783, 0x8783, 0x1340, 0x8784, 0x8784, 0x2C72, + 0x8785, 0x8785, 0x2C6E, 0x8786, 0x8786, 0x3EB0, 0x8787, 0x8787, 0x2C6C, + 0x8788, 0x8788, 0x2C67, 0x8789, 0x8789, 0x2C76, 0x878B, 0x878B, 0x43E2, + 0x878C, 0x878C, 0x3FEF, 0x878D, 0x878D, 0x1344, 0x878F, 0x878F, 0x2C63, + 0x8790, 0x8791, 0x2C6F, 0x8792, 0x8792, 0x2C66, 0x8793, 0x8793, 0x2C65, + 0x8794, 0x8794, 0x2C73, 0x8796, 0x8796, 0x2C69, 0x8797, 0x8797, 0x2C64, + 0x8798, 0x8798, 0x2C6A, 0x879A, 0x879A, 0x2C75, 0x879B, 0x879B, 0x2C62, + 0x879C, 0x879C, 0x2C74, 0x879D, 0x879D, 0x2C71, 0x879E, 0x879E, 0x1342, + 0x879F, 0x879F, 0x1341, 0x87A2, 0x87A2, 0x1343, 0x87A3, 0x87A3, 0x2C6D, + 0x87A4, 0x87A4, 0x2C61, 0x87A5, 0x87A5, 0x3D88, 0x87A9, 0x87A9, 0x3FEC, + 0x87AA, 0x87AA, 0x2E36, 0x87AB, 0x87AB, 0x146C, 0x87AC, 0x87AC, 0x2E3A, + 0x87AD, 0x87AD, 0x2E37, 0x87AE, 0x87AE, 0x2E3E, 0x87AF, 0x87AF, 0x2E44, + 0x87B0, 0x87B0, 0x2E39, 0x87B1, 0x87B1, 0x380F, 0x87B2, 0x87B2, 0x2E4D, + 0x87B3, 0x87B3, 0x1469, 0x87B4, 0x87B4, 0x2E47, 0x87B5, 0x87B5, 0x2E3C, + 0x87B6, 0x87B6, 0x2E48, 0x87B7, 0x87B7, 0x2E43, 0x87B8, 0x87B8, 0x2E4A, + 0x87B9, 0x87B9, 0x2E3B, 0x87BA, 0x87BA, 0x146E, 0x87BB, 0x87BB, 0x146D, + 0x87BC, 0x87BC, 0x2E3D, 0x87BD, 0x87BD, 0x2E4B, 0x87BE, 0x87BE, 0x2E35, + 0x87BF, 0x87BF, 0x2E49, 0x87C0, 0x87C0, 0x1467, 0x87C1, 0x87C1, 0x3FFC, + 0x87C2, 0x87C2, 0x2E41, 0x87C3, 0x87C3, 0x2E40, 0x87C4, 0x87C4, 0x2E45, + 0x87C5, 0x87C5, 0x2E38, 0x87C6, 0x87C6, 0x146B, 0x87C8, 0x87C8, 0x146F, + 0x87C9, 0x87C9, 0x2E3F, 0x87CA, 0x87CA, 0x2E46, 0x87CB, 0x87CB, 0x1470, + 0x87CC, 0x87CC, 0x2E42, 0x87CE, 0x87CE, 0x3FED, 0x87D1, 0x87D1, 0x1468, + 0x87D2, 0x87D2, 0x146A, 0x87D3, 0x87D3, 0x2FBA, 0x87D4, 0x87D4, 0x2FB8, + 0x87D6, 0x87D6, 0x3F92, 0x87D7, 0x87D7, 0x2FBE, 0x87D8, 0x87D8, 0x2FBC, + 0x87D9, 0x87D9, 0x2FBF, 0x87DA, 0x87DA, 0x3810, 0x87DB, 0x87DB, 0x2FB1, + 0x87DC, 0x87DC, 0x2FB9, 0x87DD, 0x87DD, 0x2FC3, 0x87DE, 0x87DE, 0x2E4C, + 0x87DF, 0x87DF, 0x2FB5, 0x87E0, 0x87E0, 0x1526, 0x87E1, 0x87E1, 0x2A13, + 0x87E2, 0x87E2, 0x2FB0, 0x87E3, 0x87E3, 0x2FBD, 0x87E4, 0x87E4, 0x2FB7, + 0x87E5, 0x87E5, 0x2FB4, 0x87E6, 0x87E6, 0x2FAF, 0x87E7, 0x87E7, 0x2FAE, + 0x87E8, 0x87E8, 0x2FC2, 0x87EA, 0x87EA, 0x2FB3, 0x87EB, 0x87EB, 0x2FB2, + 0x87EC, 0x87EC, 0x1524, 0x87ED, 0x87ED, 0x2FBB, 0x87EE, 0x87EE, 0x380D, + 0x87EF, 0x87EF, 0x1523, 0x87F2, 0x87F2, 0x1525, 0x87F3, 0x87F3, 0x2FB6, + 0x87F4, 0x87F4, 0x2FC1, 0x87F5, 0x87F5, 0x3FAE, 0x87F6, 0x87F7, 0x310A, + 0x87F9, 0x87F9, 0x15BE, 0x87FA, 0x87FA, 0x3108, 0x87FB, 0x87FB, 0x15BB, + 0x87FC, 0x87FC, 0x3110, 0x87FE, 0x87FE, 0x15BF, 0x87FF, 0x87FF, 0x3112, + 0x8800, 0x8800, 0x3107, 0x8801, 0x8801, 0x2FC0, 0x8802, 0x8802, 0x3114, + 0x8803, 0x8803, 0x3109, 0x8804, 0x8804, 0x3EAF, 0x8805, 0x8805, 0x15BC, + 0x8806, 0x8806, 0x310F, 0x8808, 0x8808, 0x3111, 0x8809, 0x8809, 0x310C, + 0x880A, 0x880A, 0x3113, 0x880B, 0x880B, 0x310E, 0x880C, 0x880C, 0x310D, + 0x880D, 0x880D, 0x15BD, 0x880F, 0x880F, 0x3811, 0x8810, 0x8811, 0x322C, + 0x8813, 0x8813, 0x322F, 0x8814, 0x8815, 0x163F, 0x8816, 0x8816, 0x3230, + 0x8817, 0x8817, 0x322E, 0x8818, 0x8818, 0x3F7A, 0x8819, 0x8819, 0x322B, + 0x881B, 0x881B, 0x3306, 0x881C, 0x881C, 0x3309, 0x881D, 0x881D, 0x3305, + 0x881F, 0x881F, 0x168B, 0x8820, 0x8820, 0x3307, 0x8821, 0x8821, 0x168A, + 0x8822, 0x8822, 0x1689, 0x8823, 0x8823, 0x1688, 0x8824, 0x8824, 0x3308, + 0x8825, 0x8825, 0x33B1, 0x8826, 0x8826, 0x33AF, 0x8827, 0x8827, 0x3E07, + 0x8828, 0x8828, 0x33AE, 0x8829, 0x8829, 0x3304, 0x882A, 0x882A, 0x33B0, + 0x882B, 0x882B, 0x330A, 0x882C, 0x882C, 0x33AD, 0x882D, 0x882D, 0x3B8B, + 0x882E, 0x882E, 0x3437, 0x882F, 0x882F, 0x3415, 0x8830, 0x8830, 0x3435, + 0x8831, 0x8831, 0x1709, 0x8832, 0x8832, 0x3436, 0x8833, 0x8833, 0x3438, + 0x8835, 0x8835, 0x349A, 0x8836, 0x8836, 0x1728, 0x8837, 0x8837, 0x3499, + 0x8838, 0x8838, 0x3498, 0x8839, 0x8839, 0x1729, 0x883B, 0x883B, 0x1747, + 0x883C, 0x883C, 0x3508, 0x883D, 0x883D, 0x3520, 0x883E, 0x883E, 0x351F, + 0x883F, 0x883F, 0x3521, 0x8840, 0x8840, 0x0410, 0x8841, 0x8841, 0x1BFE, + 0x8842, 0x8842, 0x3F5A, 0x8843, 0x8844, 0x1DFA, 0x8845, 0x8846, 0x3816, + 0x8848, 0x8848, 0x22D3, 0x884A, 0x884A, 0x330B, 0x884B, 0x884B, 0x349B, + 0x884C, 0x884C, 0x0411, 0x884D, 0x884D, 0x0803, 0x884E, 0x884E, 0x1BFF, + 0x884F, 0x884F, 0x3844, 0x8852, 0x8852, 0x204F, 0x8853, 0x8853, 0x0B94, + 0x8855, 0x8855, 0x22D5, 0x8856, 0x8856, 0x22D4, 0x8857, 0x8857, 0x0D51, + 0x8859, 0x8859, 0x0EFA, 0x885A, 0x885A, 0x2A2F, 0x885B, 0x885B, 0x120A, + 0x885D, 0x885D, 0x120B, 0x885E, 0x885E, 0x381B, 0x8860, 0x8860, 0x3A46, + 0x8861, 0x8861, 0x1345, 0x8862, 0x8862, 0x172A, 0x8863, 0x8863, 0x0412, + 0x8864, 0x8864, 0x4502, 0x8865, 0x8865, 0x3DFC, 0x8867, 0x8867, 0x1C00, + 0x8868, 0x8868, 0x068C, 0x8869, 0x8869, 0x1C02, 0x886A, 0x886A, 0x1C01, + 0x886B, 0x886B, 0x0804, 0x886D, 0x886D, 0x1DFC, 0x886E, 0x886E, 0x3B8E, + 0x886F, 0x886F, 0x1E03, 0x8870, 0x8870, 0x09B8, 0x8871, 0x8871, 0x1E01, + 0x8872, 0x8872, 0x1DFF, 0x8874, 0x8874, 0x1E06, 0x8875, 0x8876, 0x1DFD, + 0x8877, 0x8877, 0x09B9, 0x8879, 0x8879, 0x09BD, 0x887C, 0x887C, 0x1E07, + 0x887D, 0x887D, 0x09BC, 0x887E, 0x887E, 0x1E05, 0x887F, 0x887F, 0x1E02, + 0x8880, 0x8880, 0x1E00, 0x8881, 0x8882, 0x09BA, 0x8883, 0x8883, 0x1E04, + 0x8884, 0x8884, 0x42F7, 0x8887, 0x8887, 0x3B90, 0x8888, 0x8888, 0x0B96, + 0x8889, 0x8889, 0x2050, 0x888B, 0x888B, 0x0B9B, 0x888C, 0x888C, 0x2060, + 0x888D, 0x888D, 0x0B9A, 0x888E, 0x888E, 0x2062, 0x8891, 0x8891, 0x2056, + 0x8892, 0x8892, 0x0B98, 0x8893, 0x8893, 0x2061, 0x8895, 0x8895, 0x2051, + 0x8896, 0x8896, 0x0B99, 0x8897, 0x8897, 0x205D, 0x8898, 0x8898, 0x2059, + 0x8899, 0x8899, 0x205B, 0x889A, 0x889A, 0x2055, 0x889B, 0x889B, 0x205C, + 0x889C, 0x889C, 0x381C, 0x889E, 0x889E, 0x0B95, 0x889F, 0x889F, 0x2058, + 0x88A0, 0x88A0, 0x3FA0, 0x88A1, 0x88A1, 0x2057, 0x88A2, 0x88A2, 0x2053, + 0x88A4, 0x88A4, 0x205E, 0x88A7, 0x88A7, 0x205A, 0x88A8, 0x88A8, 0x2052, + 0x88AA, 0x88AA, 0x2054, 0x88AB, 0x88AB, 0x0B97, 0x88AC, 0x88AC, 0x205F, + 0x88AE, 0x88AE, 0x4775, 0x88B1, 0x88B1, 0x0D54, 0x88B2, 0x88B2, 0x22E0, + 0x88B4, 0x88B5, 0x381E, 0x88B6, 0x88B6, 0x22DC, 0x88B7, 0x88B7, 0x22DE, + 0x88B8, 0x88B8, 0x22D9, 0x88B9, 0x88B9, 0x22D8, 0x88BA, 0x88BA, 0x22D6, + 0x88BC, 0x88BC, 0x22DD, 0x88BD, 0x88BD, 0x22DF, 0x88BE, 0x88BE, 0x22DB, + 0x88BF, 0x88BF, 0x3B91, 0x88C0, 0x88C0, 0x22DA, 0x88C1, 0x88C2, 0x0D52, + 0x88C5, 0x88C5, 0x3820, 0x88C7, 0x88C7, 0x3EB1, 0x88C9, 0x88C9, 0x22E2, + 0x88CA, 0x88CA, 0x0F02, 0x88CB, 0x88CB, 0x2578, 0x88CC, 0x88CC, 0x257E, + 0x88CD, 0x88CE, 0x2579, 0x88CF, 0x88CF, 0x36EA, 0x88D0, 0x88D0, 0x257F, + 0x88D2, 0x88D2, 0x0F04, 0x88D4, 0x88D4, 0x0EFC, 0x88D5, 0x88D5, 0x0F03, + 0x88D6, 0x88D6, 0x2577, 0x88D7, 0x88D7, 0x22D7, 0x88D8, 0x88D8, 0x0EFF, + 0x88D9, 0x88D9, 0x0EFD, 0x88DA, 0x88DA, 0x257D, 0x88DB, 0x88DB, 0x257C, + 0x88DC, 0x88DC, 0x0EFE, 0x88DD, 0x88DD, 0x0F00, 0x88DE, 0x88DE, 0x257B, + 0x88DF, 0x88DF, 0x0EFB, 0x88E1, 0x88E1, 0x0F01, 0x88E6, 0x88E6, 0x3B92, + 0x88E7, 0x88E7, 0x27F0, 0x88E8, 0x88E8, 0x10A2, 0x88EB, 0x88EB, 0x27FB, + 0x88EC, 0x88EC, 0x27FA, 0x88EE, 0x88EE, 0x27F5, 0x88EF, 0x88EF, 0x10A4, + 0x88F0, 0x88F0, 0x27F9, 0x88F1, 0x88F2, 0x27F1, 0x88F3, 0x88F3, 0x109C, + 0x88F4, 0x88F4, 0x109E, 0x88F5, 0x88F5, 0x3E08, 0x88F6, 0x88F6, 0x27F7, + 0x88F7, 0x88F7, 0x27EF, 0x88F8, 0x88F8, 0x10A0, 0x88F9, 0x88F9, 0x109F, + 0x88FA, 0x88FA, 0x27F3, 0x88FB, 0x88FB, 0x27F8, 0x88FC, 0x88FC, 0x27F6, + 0x88FD, 0x88FD, 0x10A1, 0x88FE, 0x88FE, 0x27F4, 0x88FF, 0x88FF, 0x4776, + 0x8900, 0x8900, 0x42FA, 0x8901, 0x8901, 0x22E1, 0x8902, 0x8902, 0x109D, + 0x8905, 0x8905, 0x2A30, 0x8906, 0x8906, 0x2A37, 0x8907, 0x8907, 0x120D, + 0x8909, 0x8909, 0x2A3B, 0x890A, 0x890A, 0x1211, 0x890B, 0x890B, 0x2A33, + 0x890C, 0x890C, 0x2A31, 0x890E, 0x890E, 0x2A3A, 0x8910, 0x8910, 0x120C, + 0x8911, 0x8911, 0x2A39, 0x8912, 0x8913, 0x120E, 0x8914, 0x8914, 0x2A32, + 0x8915, 0x8915, 0x1210, 0x8916, 0x8916, 0x2A38, 0x8917, 0x8919, 0x2A34, + 0x891A, 0x891A, 0x10A3, 0x891E, 0x891E, 0x2C77, 0x891F, 0x891F, 0x2C83, + 0x8921, 0x8921, 0x134A, 0x8922, 0x8922, 0x2C7E, 0x8923, 0x8923, 0x2C80, + 0x8924, 0x8924, 0x4777, 0x8925, 0x8925, 0x1348, 0x8926, 0x8926, 0x2C78, + 0x8927, 0x8927, 0x2C7C, 0x8929, 0x8929, 0x2C7F, 0x892A, 0x892A, 0x1346, + 0x892B, 0x892B, 0x1349, 0x892C, 0x892C, 0x2C82, 0x892D, 0x892E, 0x2C7A, + 0x892F, 0x892F, 0x2C81, 0x8930, 0x8930, 0x2C79, 0x8931, 0x8931, 0x2C7D, + 0x8932, 0x8932, 0x1347, 0x8933, 0x8933, 0x2E4F, 0x8935, 0x8935, 0x2E4E, + 0x8936, 0x8936, 0x1472, 0x8937, 0x8937, 0x2E54, 0x8938, 0x8938, 0x1474, + 0x893B, 0x893B, 0x1471, 0x893C, 0x893C, 0x2E50, 0x893D, 0x893D, 0x1475, + 0x893E, 0x893E, 0x2E51, 0x8941, 0x8941, 0x2E52, 0x8942, 0x8942, 0x2E55, + 0x8943, 0x8943, 0x3E16, 0x8944, 0x8944, 0x1473, 0x8946, 0x8946, 0x2FC8, + 0x8947, 0x8947, 0x43E3, 0x8949, 0x8949, 0x2FCB, 0x894B, 0x894B, 0x2FC5, + 0x894C, 0x894C, 0x2FC7, 0x894D, 0x894D, 0x3B94, 0x894F, 0x894F, 0x2FC6, + 0x8950, 0x8951, 0x2FC9, 0x8952, 0x8952, 0x2E53, 0x8953, 0x8953, 0x2FC4, + 0x8954, 0x8954, 0x3B96, 0x8956, 0x8956, 0x15C2, 0x8957, 0x8957, 0x3118, + 0x8958, 0x8958, 0x311B, 0x8959, 0x8959, 0x311D, 0x895A, 0x895B, 0x3116, + 0x895C, 0x895C, 0x311A, 0x895D, 0x895D, 0x311C, 0x895E, 0x895E, 0x15C3, + 0x895F, 0x895F, 0x15C1, 0x8960, 0x8960, 0x15C0, 0x8961, 0x8961, 0x3119, + 0x8962, 0x8962, 0x3115, 0x8963, 0x8963, 0x3231, 0x8964, 0x8964, 0x1641, + 0x8965, 0x8965, 0x3B93, 0x8966, 0x8966, 0x3232, 0x8969, 0x8969, 0x330D, + 0x896A, 0x896A, 0x168C, 0x896B, 0x896B, 0x330F, 0x896C, 0x896C, 0x168D, + 0x896D, 0x896D, 0x330C, 0x896E, 0x896E, 0x330E, 0x896F, 0x896F, 0x16D6, + 0x8971, 0x8971, 0x33B2, 0x8972, 0x8972, 0x16D5, 0x8973, 0x8973, 0x343B, + 0x8974, 0x8974, 0x343A, 0x8976, 0x8976, 0x3439, 0x8977, 0x8977, 0x3DEA, + 0x8979, 0x897A, 0x34E2, 0x897B, 0x897B, 0x34E5, 0x897C, 0x897C, 0x34E4, + 0x897E, 0x897E, 0x1819, 0x897F, 0x897F, 0x0413, 0x8980, 0x8980, 0x4708, + 0x8981, 0x8981, 0x0805, 0x8982, 0x8982, 0x2063, 0x8983, 0x8983, 0x0D55, + 0x8985, 0x8985, 0x2580, 0x8986, 0x8986, 0x1527, 0x8987, 0x8987, 0x3822, + 0x8988, 0x8988, 0x311E, 0x8989, 0x8989, 0x3FE9, 0x898A, 0x898A, 0x3823, + 0x898B, 0x898B, 0x0508, 0x898F, 0x898F, 0x0B9D, 0x8991, 0x8991, 0x4778, + 0x8993, 0x8993, 0x0B9C, 0x8994, 0x8994, 0x3FE0, 0x8995, 0x8995, 0x22E3, + 0x8996, 0x8996, 0x0D56, 0x8997, 0x8997, 0x22E5, 0x8998, 0x8998, 0x22E4, + 0x899B, 0x899B, 0x2581, 0x899C, 0x899C, 0x0F05, 0x899D, 0x899D, 0x27FC, + 0x899E, 0x899E, 0x27FF, 0x899F, 0x899F, 0x27FE, 0x89A1, 0x89A1, 0x27FD, + 0x89A2, 0x89A2, 0x2A3C, 0x89A3, 0x89A3, 0x2A3E, 0x89A4, 0x89A4, 0x2A3D, + 0x89A5, 0x89A5, 0x3D93, 0x89A6, 0x89A6, 0x134C, 0x89A7, 0x89A7, 0x3826, + 0x89A9, 0x89A9, 0x3825, 0x89AA, 0x89AA, 0x134B, 0x89AC, 0x89AC, 0x1476, + 0x89AD, 0x89AD, 0x2E56, 0x89AE, 0x89AE, 0x2E58, 0x89AF, 0x89AF, 0x2E57, + 0x89B2, 0x89B2, 0x1528, 0x89B6, 0x89B6, 0x3120, 0x89B7, 0x89B7, 0x311F, + 0x89B9, 0x89B9, 0x3233, 0x89BA, 0x89BA, 0x1642, 0x89BC, 0x89BC, 0x3827, + 0x89BD, 0x89BD, 0x168E, 0x89BE, 0x89BE, 0x33B4, 0x89BF, 0x89BF, 0x33B3, + 0x89C0, 0x89C0, 0x1748, 0x89C1, 0x89C1, 0x4503, 0x89C6, 0x89C6, 0x4566, + 0x89D2, 0x89D2, 0x0509, 0x89D3, 0x89D3, 0x1C03, 0x89D4, 0x89D4, 0x0806, + 0x89D5, 0x89D5, 0x2066, 0x89D6, 0x89D6, 0x2064, 0x89D9, 0x89D9, 0x2065, + 0x89DA, 0x89DB, 0x22E7, 0x89DC, 0x89DC, 0x2588, 0x89DD, 0x89DD, 0x22E6, + 0x89DF, 0x89DF, 0x2582, 0x89E0, 0x89E0, 0x2586, 0x89E1, 0x89E1, 0x2585, + 0x89E2, 0x89E2, 0x2587, 0x89E3, 0x89E3, 0x0F06, 0x89E4, 0x89E4, 0x2584, + 0x89E5, 0x89E5, 0x2583, 0x89E6, 0x89E6, 0x2589, 0x89E7, 0x89E7, 0x3829, + 0x89E8, 0x89E8, 0x2802, 0x89E9, 0x89E9, 0x2800, 0x89EB, 0x89EB, 0x2801, + 0x89EC, 0x89EC, 0x2A41, 0x89ED, 0x89ED, 0x2A3F, 0x89F0, 0x89F0, 0x2A40, + 0x89F1, 0x89F1, 0x2C84, 0x89F2, 0x89F3, 0x2E59, 0x89F4, 0x89F4, 0x1529, + 0x89F6, 0x89F6, 0x3121, 0x89F7, 0x89F7, 0x3234, 0x89F8, 0x89F8, 0x1643, + 0x89FA, 0x89FA, 0x3310, 0x89FB, 0x89FB, 0x33B5, 0x89FC, 0x89FC, 0x16D7, + 0x89FE, 0x89FE, 0x343C, 0x89FF, 0x89FF, 0x34E6, 0x8A00, 0x8A00, 0x050A, + 0x8A02, 0x8A03, 0x0808, 0x8A04, 0x8A04, 0x1C04, 0x8A07, 0x8A07, 0x1C05, + 0x8A08, 0x8A08, 0x0807, 0x8A0A, 0x8A0A, 0x09C3, 0x8A0C, 0x8A0C, 0x09C1, + 0x8A0E, 0x8A0E, 0x09C0, 0x8A0F, 0x8A0F, 0x09C7, 0x8A10, 0x8A10, 0x09BF, + 0x8A11, 0x8A11, 0x09C8, 0x8A12, 0x8A12, 0x1E08, 0x8A13, 0x8A13, 0x09C5, + 0x8A15, 0x8A15, 0x09C2, 0x8A16, 0x8A16, 0x09C6, 0x8A17, 0x8A17, 0x09C4, + 0x8A18, 0x8A18, 0x09BE, 0x8A1B, 0x8A1B, 0x0BA5, 0x8A1C, 0x8A1C, 0x3BA3, + 0x8A1D, 0x8A1D, 0x0B9F, 0x8A1E, 0x8A1E, 0x206A, 0x8A1F, 0x8A1F, 0x0BA4, + 0x8A22, 0x8A22, 0x0BA6, 0x8A23, 0x8A23, 0x0BA0, 0x8A25, 0x8A25, 0x0BA1, + 0x8A27, 0x8A27, 0x2068, 0x8A29, 0x8A29, 0x43E5, 0x8A2A, 0x8A2A, 0x0B9E, + 0x8A2B, 0x8A2B, 0x3BD1, 0x8A2C, 0x8A2C, 0x2069, 0x8A2D, 0x8A2D, 0x0BA3, + 0x8A30, 0x8A30, 0x2067, 0x8A31, 0x8A31, 0x0BA2, 0x8A34, 0x8A34, 0x0D61, + 0x8A36, 0x8A36, 0x0D63, 0x8A38, 0x8A38, 0x477A, 0x8A39, 0x8A39, 0x22EB, + 0x8A3A, 0x8A3A, 0x0D62, 0x8A3B, 0x8A3B, 0x0D57, 0x8A3C, 0x8A3C, 0x0D5B, + 0x8A3D, 0x8A3D, 0x3BA2, 0x8A3E, 0x8A3E, 0x0F19, 0x8A3F, 0x8A3F, 0x258E, + 0x8A40, 0x8A40, 0x22ED, 0x8A41, 0x8A41, 0x0D5C, 0x8A44, 0x8A45, 0x22F0, + 0x8A46, 0x8A46, 0x0D60, 0x8A48, 0x8A48, 0x22F3, 0x8A49, 0x8A49, 0x3FF0, + 0x8A4A, 0x8A4A, 0x22F5, 0x8A4C, 0x8A4C, 0x22F6, 0x8A4D, 0x8A4D, 0x22EA, + 0x8A4E, 0x8A4E, 0x22E9, 0x8A4F, 0x8A4F, 0x22F7, 0x8A50, 0x8A50, 0x0D5F, + 0x8A51, 0x8A51, 0x22F4, 0x8A52, 0x8A52, 0x22F2, 0x8A54, 0x8A54, 0x0D5D, + 0x8A55, 0x8A55, 0x0D59, 0x8A56, 0x8A56, 0x0D64, 0x8A57, 0x8A58, 0x22EE, + 0x8A59, 0x8A59, 0x22EC, 0x8A5B, 0x8A5B, 0x0D5E, 0x8A5E, 0x8A5E, 0x0D5A, + 0x8A60, 0x8A60, 0x0D58, 0x8A61, 0x8A61, 0x258D, 0x8A62, 0x8A62, 0x0F14, + 0x8A63, 0x8A63, 0x0F0F, 0x8A66, 0x8A66, 0x0F0A, 0x8A67, 0x8A67, 0x3F8E, + 0x8A68, 0x8A68, 0x0F1A, 0x8A69, 0x8A69, 0x0F0B, 0x8A6B, 0x8A6B, 0x0F07, + 0x8A6C, 0x8A6C, 0x0F16, 0x8A6D, 0x8A6D, 0x0F13, 0x8A6E, 0x8A6E, 0x0F15, + 0x8A70, 0x8A70, 0x0F0C, 0x8A71, 0x8A71, 0x0F11, 0x8A72, 0x8A73, 0x0F08, + 0x8A74, 0x8A74, 0x2595, 0x8A75, 0x8A75, 0x2592, 0x8A76, 0x8A76, 0x258A, + 0x8A77, 0x8A77, 0x258F, 0x8A79, 0x8A79, 0x0F17, 0x8A7A, 0x8A7A, 0x2596, + 0x8A7B, 0x8A7B, 0x0F18, 0x8A7C, 0x8A7C, 0x0F0E, 0x8A7E, 0x8A7E, 0x3FA5, + 0x8A7F, 0x8A7F, 0x258C, 0x8A81, 0x8A81, 0x2594, 0x8A82, 0x8A82, 0x2590, + 0x8A83, 0x8A83, 0x2593, 0x8A84, 0x8A84, 0x2591, 0x8A85, 0x8A85, 0x0F12, + 0x8A86, 0x8A86, 0x258B, 0x8A87, 0x8A87, 0x0F0D, 0x8A8B, 0x8A8B, 0x2805, + 0x8A8C, 0x8A8C, 0x10A6, 0x8A8D, 0x8A8D, 0x10A9, 0x8A8F, 0x8A8F, 0x2807, + 0x8A90, 0x8A90, 0x382F, 0x8A91, 0x8A91, 0x10B1, 0x8A92, 0x8A92, 0x2806, + 0x8A93, 0x8A93, 0x10AB, 0x8A94, 0x8A94, 0x477B, 0x8A95, 0x8A95, 0x1216, + 0x8A96, 0x8A96, 0x2808, 0x8A98, 0x8A98, 0x10B0, 0x8A99, 0x8A99, 0x2804, + 0x8A9A, 0x8A9A, 0x10B2, 0x8A9C, 0x8A9C, 0x382C, 0x8A9E, 0x8A9E, 0x10A7, + 0x8AA0, 0x8AA0, 0x0F10, 0x8AA1, 0x8AA1, 0x10AA, 0x8AA3, 0x8AA3, 0x10A8, + 0x8AA4, 0x8AA4, 0x10AC, 0x8AA5, 0x8AA5, 0x10AE, 0x8AA6, 0x8AA6, 0x10A5, + 0x8AA7, 0x8AA7, 0x10B3, 0x8AA8, 0x8AA8, 0x10AF, 0x8AA9, 0x8AA9, 0x383D, + 0x8AAA, 0x8AAA, 0x10AD, 0x8AAB, 0x8AAB, 0x2803, 0x8AAF, 0x8AAF, 0x3841, + 0x8AB0, 0x8AB0, 0x121D, 0x8AB2, 0x8AB2, 0x1219, 0x8AB4, 0x8AB4, 0x477C, + 0x8AB6, 0x8AB6, 0x1220, 0x8AB8, 0x8AB8, 0x2A44, 0x8AB9, 0x8AB9, 0x1221, + 0x8ABA, 0x8ABA, 0x2A50, 0x8ABB, 0x8ABB, 0x2A49, 0x8ABC, 0x8ABC, 0x1212, + 0x8ABD, 0x8ABD, 0x2A51, 0x8ABE, 0x8ABE, 0x2A4B, 0x8ABF, 0x8ABF, 0x121C, + 0x8AC0, 0x8AC0, 0x2A4C, 0x8AC2, 0x8AC2, 0x121B, 0x8AC3, 0x8AC3, 0x2A4F, + 0x8AC4, 0x8AC4, 0x1215, 0x8AC5, 0x8AC5, 0x2A4D, 0x8AC6, 0x8AC6, 0x2A43, + 0x8AC7, 0x8AC7, 0x1214, 0x8AC8, 0x8AC8, 0x2C8F, 0x8AC9, 0x8AC9, 0x121A, + 0x8ACB, 0x8ACB, 0x1217, 0x8ACD, 0x8ACD, 0x121F, 0x8ACF, 0x8ACF, 0x2A42, + 0x8AD1, 0x8AD1, 0x2A46, 0x8AD2, 0x8AD2, 0x1213, 0x8AD3, 0x8AD3, 0x2A45, + 0x8AD4, 0x8AD5, 0x2A47, 0x8AD6, 0x8AD6, 0x121E, 0x8AD7, 0x8AD7, 0x2A4A, + 0x8AD8, 0x8AD8, 0x2A4E, 0x8AD9, 0x8AD9, 0x2A52, 0x8ADA, 0x8ADA, 0x39C2, + 0x8ADB, 0x8ADB, 0x1222, 0x8ADC, 0x8ADC, 0x1352, 0x8ADD, 0x8ADD, 0x2C8A, + 0x8ADE, 0x8ADE, 0x2C90, 0x8ADF, 0x8ADF, 0x2C8D, 0x8AE0, 0x8AE0, 0x2C85, + 0x8AE1, 0x8AE1, 0x2C91, 0x8AE2, 0x8AE2, 0x2C86, 0x8AE4, 0x8AE4, 0x2C8C, + 0x8AE6, 0x8AE6, 0x134D, 0x8AE7, 0x8AE7, 0x1353, 0x8AE8, 0x8AE8, 0x2C92, + 0x8AEA, 0x8AEA, 0x3DD9, 0x8AEB, 0x8AEB, 0x134F, 0x8AED, 0x8AED, 0x1359, + 0x8AEE, 0x8AEE, 0x1354, 0x8AEF, 0x8AEF, 0x2C94, 0x8AF0, 0x8AF0, 0x2C8E, + 0x8AF1, 0x8AF1, 0x1350, 0x8AF2, 0x8AF2, 0x2C87, 0x8AF3, 0x8AF3, 0x135A, + 0x8AF4, 0x8AF5, 0x2C88, 0x8AF6, 0x8AF6, 0x135B, 0x8AF7, 0x8AF7, 0x1358, + 0x8AF8, 0x8AF8, 0x1218, 0x8AFA, 0x8AFA, 0x134E, 0x8AFB, 0x8AFB, 0x2C95, + 0x8AFC, 0x8AFC, 0x135C, 0x8AFE, 0x8AFE, 0x1355, 0x8AFF, 0x8AFF, 0x2C93, + 0x8B00, 0x8B00, 0x1351, 0x8B01, 0x8B02, 0x1356, 0x8B04, 0x8B04, 0x147E, + 0x8B05, 0x8B05, 0x2E5F, 0x8B06, 0x8B06, 0x2E68, 0x8B07, 0x8B07, 0x2E65, + 0x8B08, 0x8B08, 0x2E67, 0x8B0A, 0x8B0A, 0x147B, 0x8B0B, 0x8B0B, 0x2E60, + 0x8B0C, 0x8B0C, 0x3836, 0x8B0D, 0x8B0D, 0x2E66, 0x8B0E, 0x8B0E, 0x1477, + 0x8B0F, 0x8B0F, 0x2E62, 0x8B10, 0x8B10, 0x147F, 0x8B11, 0x8B11, 0x2E5E, + 0x8B12, 0x8B12, 0x2E63, 0x8B13, 0x8B13, 0x2E6A, 0x8B14, 0x8B14, 0x2C8B, + 0x8B15, 0x8B15, 0x2E64, 0x8B16, 0x8B16, 0x2E5D, 0x8B17, 0x8B17, 0x1478, + 0x8B18, 0x8B18, 0x2E5C, 0x8B19, 0x8B19, 0x1479, 0x8B1A, 0x8B1A, 0x2E6B, + 0x8B1B, 0x8B1B, 0x147A, 0x8B1C, 0x8B1C, 0x2E69, 0x8B1D, 0x8B1D, 0x147D, + 0x8B1E, 0x8B1E, 0x2E5B, 0x8B1F, 0x8B1F, 0x3837, 0x8B20, 0x8B20, 0x147C, + 0x8B22, 0x8B22, 0x2E61, 0x8B23, 0x8B23, 0x2FCE, 0x8B24, 0x8B24, 0x2FDC, + 0x8B25, 0x8B25, 0x2FD7, 0x8B26, 0x8B26, 0x2FD9, 0x8B27, 0x8B27, 0x2FCD, + 0x8B28, 0x8B28, 0x152A, 0x8B2A, 0x8B2A, 0x2FCC, 0x8B2B, 0x8B2B, 0x152D, + 0x8B2C, 0x8B2C, 0x152C, 0x8B2D, 0x8B2D, 0x3F99, 0x8B2E, 0x8B2E, 0x2FDB, + 0x8B2F, 0x8B2F, 0x2FD3, 0x8B30, 0x8B30, 0x2FD0, 0x8B31, 0x8B31, 0x2FD6, + 0x8B33, 0x8B33, 0x2FCF, 0x8B35, 0x8B35, 0x2FD1, 0x8B36, 0x8B36, 0x2FDA, + 0x8B37, 0x8B37, 0x2FD8, 0x8B39, 0x8B39, 0x152B, 0x8B3A, 0x8B3A, 0x2FDF, + 0x8B3B, 0x8B3B, 0x2FDD, 0x8B3C, 0x8B3C, 0x2FD4, 0x8B3D, 0x8B3D, 0x2FDE, + 0x8B3E, 0x8B3E, 0x2FD5, 0x8B3F, 0x8B3F, 0x383A, 0x8B40, 0x8B40, 0x3125, + 0x8B41, 0x8B41, 0x15C4, 0x8B42, 0x8B42, 0x312C, 0x8B43, 0x8B43, 0x3FF2, + 0x8B45, 0x8B45, 0x3313, 0x8B46, 0x8B46, 0x15CB, 0x8B47, 0x8B47, 0x2FD2, + 0x8B48, 0x8B48, 0x3123, 0x8B49, 0x8B49, 0x15C7, 0x8B4A, 0x8B4A, 0x3124, + 0x8B4B, 0x8B4B, 0x3129, 0x8B4C, 0x8B4D, 0x383B, 0x8B4E, 0x8B4F, 0x15C9, + 0x8B50, 0x8B50, 0x3122, 0x8B51, 0x8B51, 0x312B, 0x8B52, 0x8B52, 0x312D, + 0x8B53, 0x8B53, 0x3126, 0x8B54, 0x8B54, 0x3128, 0x8B55, 0x8B55, 0x312A, + 0x8B56, 0x8B56, 0x3127, 0x8B57, 0x8B57, 0x312E, 0x8B58, 0x8B58, 0x15C6, + 0x8B59, 0x8B59, 0x15CC, 0x8B5A, 0x8B5A, 0x15C8, 0x8B5C, 0x8B5C, 0x15C5, + 0x8B5D, 0x8B5D, 0x3237, 0x8B5E, 0x8B5E, 0x3DB8, 0x8B5F, 0x8B5F, 0x1648, + 0x8B60, 0x8B60, 0x3235, 0x8B62, 0x8B62, 0x3DD4, 0x8B63, 0x8B63, 0x3239, + 0x8B65, 0x8B65, 0x323A, 0x8B66, 0x8B66, 0x1646, 0x8B67, 0x8B67, 0x323B, + 0x8B68, 0x8B68, 0x3238, 0x8B69, 0x8B69, 0x3BF7, 0x8B6A, 0x8B6A, 0x3236, + 0x8B6B, 0x8B6B, 0x1649, 0x8B6C, 0x8B6C, 0x1645, 0x8B6D, 0x8B6D, 0x323C, + 0x8B6F, 0x8B6F, 0x1647, 0x8B70, 0x8B70, 0x1644, 0x8B74, 0x8B74, 0x168F, + 0x8B77, 0x8B77, 0x1690, 0x8B78, 0x8B78, 0x3312, 0x8B79, 0x8B79, 0x3311, + 0x8B7A, 0x8B7B, 0x3314, 0x8B7D, 0x8B7D, 0x1691, 0x8B7E, 0x8B7E, 0x33B6, + 0x8B7F, 0x8B7F, 0x33BB, 0x8B80, 0x8B80, 0x16D8, 0x8B81, 0x8B81, 0x3D8D, + 0x8B82, 0x8B82, 0x33B8, 0x8B84, 0x8B84, 0x33B7, 0x8B85, 0x8B85, 0x33BA, + 0x8B86, 0x8B86, 0x33B9, 0x8B88, 0x8B88, 0x3440, 0x8B8A, 0x8B8A, 0x170A, + 0x8B8B, 0x8B8B, 0x343F, 0x8B8C, 0x8B8C, 0x343D, 0x8B8E, 0x8B8E, 0x343E, + 0x8B90, 0x8B90, 0x383F, 0x8B92, 0x8B92, 0x172C, 0x8B93, 0x8B93, 0x172B, + 0x8B94, 0x8B95, 0x349C, 0x8B96, 0x8B96, 0x172D, 0x8B98, 0x8B99, 0x34E7, + 0x8B9A, 0x8B9A, 0x1754, 0x8B9B, 0x8B9B, 0x3840, 0x8B9C, 0x8B9C, 0x175A, + 0x8B9E, 0x8B9E, 0x3522, 0x8B9F, 0x8B9F, 0x353F, 0x8BA0, 0x8BA0, 0x4505, + 0x8BBE, 0x8BBE, 0x4567, 0x8BE2, 0x8BE2, 0x4568, 0x8C37, 0x8C37, 0x050B, + 0x8C39, 0x8C39, 0x206B, 0x8C3B, 0x8C3B, 0x206C, 0x8C3C, 0x8C3C, 0x2597, + 0x8C3D, 0x8C3D, 0x2809, 0x8C3E, 0x8C3E, 0x2A53, 0x8C3F, 0x8C3F, 0x1481, + 0x8C41, 0x8C41, 0x1480, 0x8C42, 0x8C42, 0x2FE0, 0x8C43, 0x8C43, 0x312F, + 0x8C45, 0x8C45, 0x3441, 0x8C46, 0x8C46, 0x050C, 0x8C47, 0x8C47, 0x1E09, + 0x8C48, 0x8C48, 0x09C9, 0x8C49, 0x8C49, 0x0BA7, 0x8C4A, 0x8C4A, 0x2599, + 0x8C4B, 0x8C4B, 0x2598, 0x8C4C, 0x8C4C, 0x1223, 0x8C4D, 0x8C4D, 0x2A54, + 0x8C4E, 0x8C4E, 0x1224, 0x8C4F, 0x8C4F, 0x2E6C, 0x8C50, 0x8C50, 0x152E, + 0x8C51, 0x8C51, 0x477D, 0x8C54, 0x8C54, 0x1763, 0x8C55, 0x8C55, 0x050D, + 0x8C56, 0x8C56, 0x1A48, 0x8C57, 0x8C57, 0x1E0A, 0x8C5A, 0x8C5A, 0x0BA8, + 0x8C5C, 0x8C5D, 0x206D, 0x8C5F, 0x8C5F, 0x22F8, 0x8C61, 0x8C61, 0x0D65, + 0x8C62, 0x8C62, 0x0F1B, 0x8C64, 0x8C64, 0x259B, 0x8C65, 0x8C65, 0x259A, + 0x8C66, 0x8C66, 0x259C, 0x8C68, 0x8C69, 0x280A, 0x8C6A, 0x8C6A, 0x10B4, + 0x8C6B, 0x8C6B, 0x135D, 0x8C6C, 0x8C6C, 0x1225, 0x8C6D, 0x8C6D, 0x135E, + 0x8C6F, 0x8C6F, 0x2E70, 0x8C70, 0x8C70, 0x2E6D, 0x8C71, 0x8C71, 0x2E6F, + 0x8C72, 0x8C72, 0x2E6E, 0x8C73, 0x8C73, 0x1482, 0x8C75, 0x8C75, 0x2FE1, + 0x8C76, 0x8C76, 0x3131, 0x8C77, 0x8C77, 0x3130, 0x8C78, 0x8C78, 0x18E7, + 0x8C79, 0x8C79, 0x09CB, 0x8C7A, 0x8C7A, 0x09CA, 0x8C7B, 0x8C7B, 0x1E0B, + 0x8C7D, 0x8C7D, 0x206F, 0x8C80, 0x8C80, 0x22FA, 0x8C81, 0x8C81, 0x22F9, + 0x8C82, 0x8C82, 0x0D66, 0x8C84, 0x8C85, 0x259E, 0x8C86, 0x8C86, 0x259D, + 0x8C89, 0x8C89, 0x0F1D, 0x8C8A, 0x8C8A, 0x0F1C, 0x8C8C, 0x8C8C, 0x10B6, + 0x8C8D, 0x8C8D, 0x10B5, 0x8C8F, 0x8C8F, 0x2A55, 0x8C90, 0x8C90, 0x2C98, + 0x8C91, 0x8C92, 0x2C96, 0x8C93, 0x8C93, 0x135F, 0x8C94, 0x8C94, 0x2E72, + 0x8C95, 0x8C95, 0x2E71, 0x8C97, 0x8C97, 0x2FE4, 0x8C98, 0x8C98, 0x2FE3, + 0x8C99, 0x8C99, 0x2FE2, 0x8C9A, 0x8C9A, 0x3132, 0x8C9B, 0x8C9B, 0x3845, + 0x8C9C, 0x8C9C, 0x3523, 0x8C9D, 0x8C9D, 0x050E, 0x8C9E, 0x8C9E, 0x080A, + 0x8C9F, 0x8C9F, 0x3BAD, 0x8CA0, 0x8CA0, 0x080B, 0x8CA1, 0x8CA2, 0x09CC, + 0x8CA3, 0x8CA3, 0x1E0D, 0x8CA4, 0x8CA4, 0x1E0C, 0x8CA5, 0x8CA5, 0x2070, + 0x8CA7, 0x8CA7, 0x0BAE, 0x8CA8, 0x8CA8, 0x0BAC, 0x8CA9, 0x8CA9, 0x0BA9, + 0x8CAA, 0x8CAA, 0x0BAD, 0x8CAB, 0x8CAB, 0x0BAB, 0x8CAC, 0x8CAC, 0x0BAA, + 0x8CAD, 0x8CAD, 0x3FF1, 0x8CAF, 0x8CAF, 0x0D67, 0x8CB0, 0x8CB0, 0x22FD, + 0x8CB2, 0x8CB2, 0x0F22, 0x8CB3, 0x8CB3, 0x0D69, 0x8CB4, 0x8CB4, 0x0D6E, + 0x8CB5, 0x8CB5, 0x22FF, 0x8CB6, 0x8CB6, 0x0D70, 0x8CB7, 0x8CB7, 0x0D6F, + 0x8CB8, 0x8CB8, 0x0D72, 0x8CB9, 0x8CB9, 0x22FE, 0x8CBA, 0x8CBA, 0x22FB, + 0x8CBB, 0x8CBB, 0x0D6C, 0x8CBC, 0x8CBC, 0x0D68, 0x8CBD, 0x8CBD, 0x0D6A, + 0x8CBE, 0x8CBE, 0x22FC, 0x8CBF, 0x8CBF, 0x0D71, 0x8CC0, 0x8CC0, 0x0D6D, + 0x8CC1, 0x8CC1, 0x0D6B, 0x8CC2, 0x8CC2, 0x0F24, 0x8CC3, 0x8CC3, 0x0F23, + 0x8CC4, 0x8CC4, 0x0F21, 0x8CC5, 0x8CC5, 0x0F25, 0x8CC7, 0x8CC8, 0x0F1F, + 0x8CCA, 0x8CCA, 0x0F1E, 0x8CCC, 0x8CCC, 0x25A0, 0x8CCD, 0x8CCD, 0x3E99, + 0x8CCF, 0x8CCF, 0x280D, 0x8CD1, 0x8CD2, 0x10B8, 0x8CD3, 0x8CD3, 0x10B7, + 0x8CD4, 0x8CD4, 0x477E, 0x8CD5, 0x8CD5, 0x280C, 0x8CD6, 0x8CD6, 0x384B, + 0x8CD7, 0x8CD7, 0x280E, 0x8CD9, 0x8CD9, 0x2A58, 0x8CDA, 0x8CDA, 0x2A5A, + 0x8CDB, 0x8CDB, 0x3851, 0x8CDC, 0x8CDC, 0x122E, 0x8CDD, 0x8CDD, 0x2A5B, + 0x8CDE, 0x8CDE, 0x1227, 0x8CDF, 0x8CDF, 0x2A57, 0x8CE0, 0x8CE0, 0x1226, + 0x8CE1, 0x8CE1, 0x1230, 0x8CE2, 0x8CE3, 0x122C, 0x8CE4, 0x8CE4, 0x1229, + 0x8CE5, 0x8CE5, 0x2A56, 0x8CE6, 0x8CE6, 0x1228, 0x8CE7, 0x8CE7, 0x2A5C, + 0x8CE8, 0x8CE8, 0x2A59, 0x8CE9, 0x8CE9, 0x3BAE, 0x8CEA, 0x8CEA, 0x122F, + 0x8CEB, 0x8CEB, 0x3F9C, 0x8CEC, 0x8CED, 0x122A, 0x8CEE, 0x8CEE, 0x2C9A, + 0x8CF0, 0x8CF0, 0x2C9C, 0x8CF1, 0x8CF1, 0x2C9B, 0x8CF2, 0x8CF2, 0x477F, + 0x8CF3, 0x8CF3, 0x2C9D, 0x8CF4, 0x8CF4, 0x1360, 0x8CF5, 0x8CF5, 0x2C99, + 0x8CF7, 0x8CF7, 0x3FB1, 0x8CF8, 0x8CF8, 0x1486, 0x8CF9, 0x8CF9, 0x2E73, + 0x8CFA, 0x8CFA, 0x1483, 0x8CFB, 0x8CFB, 0x1487, 0x8CFC, 0x8CFC, 0x1485, + 0x8CFD, 0x8CFD, 0x1484, 0x8CFE, 0x8CFE, 0x2FE5, 0x8D00, 0x8D00, 0x2FE8, + 0x8D02, 0x8D02, 0x2FE7, 0x8D03, 0x8D03, 0x384F, 0x8D04, 0x8D04, 0x2FE6, + 0x8D05, 0x8D05, 0x152F, 0x8D06, 0x8D07, 0x3133, 0x8D08, 0x8D08, 0x15CD, + 0x8D09, 0x8D09, 0x3135, 0x8D0A, 0x8D0A, 0x15CE, 0x8D0B, 0x8D0B, 0x4573, + 0x8D0C, 0x8D0C, 0x3F96, 0x8D0D, 0x8D0D, 0x164B, 0x8D0F, 0x8D0F, 0x164A, + 0x8D10, 0x8D10, 0x3316, 0x8D11, 0x8D11, 0x3853, 0x8D12, 0x8D12, 0x384E, + 0x8D13, 0x8D13, 0x1692, 0x8D14, 0x8D14, 0x3317, 0x8D15, 0x8D15, 0x33BC, + 0x8D16, 0x8D17, 0x16D9, 0x8D18, 0x8D18, 0x3E6F, 0x8D19, 0x8D19, 0x3442, + 0x8D1B, 0x8D1B, 0x172F, 0x8D1C, 0x8D1C, 0x4780, 0x8D1D, 0x8D1D, 0x4506, + 0x8D64, 0x8D64, 0x050F, 0x8D66, 0x8D66, 0x0BB0, 0x8D67, 0x8D67, 0x0BAF, + 0x8D68, 0x8D69, 0x25A1, 0x8D6B, 0x8D6B, 0x10BA, 0x8D6C, 0x8D6C, 0x2C9E, + 0x8D6D, 0x8D6D, 0x1231, 0x8D6E, 0x8D6E, 0x2C9F, 0x8D6F, 0x8D6F, 0x2E74, + 0x8D70, 0x8D70, 0x0510, 0x8D72, 0x8D72, 0x1C06, 0x8D73, 0x8D73, 0x080D, + 0x8D74, 0x8D74, 0x080C, 0x8D76, 0x8D76, 0x1E0E, 0x8D77, 0x8D77, 0x09CE, + 0x8D78, 0x8D78, 0x1E0F, 0x8D79, 0x8D79, 0x2073, 0x8D7A, 0x8D7A, 0x39E1, + 0x8D7B, 0x8D7B, 0x2072, 0x8D7D, 0x8D7D, 0x2071, 0x8D80, 0x8D80, 0x2301, + 0x8D81, 0x8D81, 0x0D75, 0x8D82, 0x8D82, 0x3F69, 0x8D84, 0x8D84, 0x2300, + 0x8D85, 0x8D85, 0x0D74, 0x8D89, 0x8D89, 0x2302, 0x8D8A, 0x8D8A, 0x0D73, + 0x8D8C, 0x8D8C, 0x25A4, 0x8D8D, 0x8D8D, 0x25A7, 0x8D8E, 0x8D8F, 0x25A5, + 0x8D90, 0x8D90, 0x25AA, 0x8D91, 0x8D91, 0x25A3, 0x8D92, 0x8D92, 0x25AB, + 0x8D93, 0x8D94, 0x25A8, 0x8D95, 0x8D95, 0x10BC, 0x8D96, 0x8D96, 0x280F, + 0x8D99, 0x8D99, 0x10BB, 0x8D9B, 0x8D9B, 0x2A60, 0x8D9C, 0x8D9C, 0x2A5E, + 0x8D9F, 0x8D9F, 0x1232, 0x8DA0, 0x8DA0, 0x2A5D, 0x8DA1, 0x8DA1, 0x2A5F, + 0x8DA3, 0x8DA3, 0x1233, 0x8DA5, 0x8DA5, 0x2CA0, 0x8DA6, 0x8DA6, 0x3FF7, + 0x8DA7, 0x8DA7, 0x2CA1, 0x8DA8, 0x8DA8, 0x1488, 0x8DA9, 0x8DA9, 0x3856, + 0x8DAA, 0x8DAA, 0x3137, 0x8DAB, 0x8DAB, 0x3139, 0x8DAC, 0x8DAC, 0x3136, + 0x8DAD, 0x8DAD, 0x3138, 0x8DAE, 0x8DAE, 0x323D, 0x8DAF, 0x8DAF, 0x3318, + 0x8DB2, 0x8DB2, 0x3509, 0x8DB3, 0x8DB3, 0x0511, 0x8DB4, 0x8DB4, 0x080E, + 0x8DB5, 0x8DB5, 0x1E10, 0x8DB6, 0x8DB6, 0x1E12, 0x8DB7, 0x8DB7, 0x1E11, + 0x8DB9, 0x8DB9, 0x2076, 0x8DBA, 0x8DBA, 0x0BB2, 0x8DBC, 0x8DBC, 0x2074, + 0x8DBE, 0x8DBE, 0x0BB1, 0x8DBF, 0x8DBF, 0x2077, 0x8DC0, 0x8DC0, 0x436A, + 0x8DC1, 0x8DC1, 0x2078, 0x8DC2, 0x8DC2, 0x2075, 0x8DC3, 0x8DC3, 0x4782, + 0x8DC5, 0x8DC5, 0x230E, 0x8DC6, 0x8DC6, 0x0D7D, 0x8DC7, 0x8DC7, 0x2306, + 0x8DC8, 0x8DC8, 0x230C, 0x8DCB, 0x8DCB, 0x0D78, 0x8DCC, 0x8DCC, 0x0D7B, + 0x8DCD, 0x8DCD, 0x2305, 0x8DCE, 0x8DCE, 0x0D76, 0x8DCF, 0x8DCF, 0x2309, + 0x8DD0, 0x8DD0, 0x25B1, 0x8DD1, 0x8DD1, 0x0D7A, 0x8DD3, 0x8DD3, 0x2304, + 0x8DD4, 0x8DD4, 0x3F82, 0x8DD5, 0x8DD5, 0x230A, 0x8DD6, 0x8DD6, 0x2307, + 0x8DD7, 0x8DD7, 0x230D, 0x8DD8, 0x8DD8, 0x2303, 0x8DD9, 0x8DD9, 0x230B, + 0x8DDA, 0x8DDA, 0x0D79, 0x8DDB, 0x8DDB, 0x0D7C, 0x8DDC, 0x8DDC, 0x2308, + 0x8DDD, 0x8DDD, 0x0D77, 0x8DDF, 0x8DDF, 0x0F27, 0x8DE0, 0x8DE0, 0x25AD, + 0x8DE1, 0x8DE1, 0x0F26, 0x8DE2, 0x8DE2, 0x25B4, 0x8DE3, 0x8DE3, 0x25B3, + 0x8DE4, 0x8DE4, 0x0F2D, 0x8DE6, 0x8DE6, 0x0F2E, 0x8DE7, 0x8DE7, 0x25B5, + 0x8DE8, 0x8DE8, 0x0F28, 0x8DE9, 0x8DE9, 0x25B2, 0x8DEA, 0x8DEA, 0x0F2C, + 0x8DEB, 0x8DEB, 0x25B7, 0x8DEC, 0x8DEC, 0x25AE, 0x8DEE, 0x8DEE, 0x25B0, + 0x8DEF, 0x8DEF, 0x0F29, 0x8DF0, 0x8DF0, 0x25AC, 0x8DF1, 0x8DF1, 0x25AF, + 0x8DF2, 0x8DF2, 0x25B6, 0x8DF3, 0x8DF3, 0x0F2A, 0x8DF4, 0x8DF4, 0x25B8, + 0x8DFA, 0x8DFA, 0x0F2B, 0x8DFC, 0x8DFC, 0x10BD, 0x8DFD, 0x8DFD, 0x2814, + 0x8DFE, 0x8DFE, 0x281A, 0x8DFF, 0x8DFF, 0x2812, 0x8E00, 0x8E00, 0x281B, + 0x8E01, 0x8E01, 0x3F85, 0x8E02, 0x8E02, 0x2811, 0x8E03, 0x8E03, 0x2816, + 0x8E04, 0x8E04, 0x281C, 0x8E05, 0x8E05, 0x2819, 0x8E06, 0x8E06, 0x2818, + 0x8E07, 0x8E07, 0x2817, 0x8E09, 0x8E09, 0x2810, 0x8E0A, 0x8E0A, 0x2815, + 0x8E0D, 0x8E0D, 0x2813, 0x8E0E, 0x8E0E, 0x3E5E, 0x8E0F, 0x8E0F, 0x1238, + 0x8E10, 0x8E10, 0x1235, 0x8E11, 0x8E11, 0x2A69, 0x8E12, 0x8E12, 0x2A6E, + 0x8E13, 0x8E13, 0x2A70, 0x8E14, 0x8E14, 0x2A6D, 0x8E15, 0x8E15, 0x2A66, + 0x8E16, 0x8E16, 0x2A68, 0x8E17, 0x8E17, 0x2A72, 0x8E18, 0x8E18, 0x2A6F, + 0x8E19, 0x8E19, 0x2A6A, 0x8E1A, 0x8E1A, 0x2A73, 0x8E1B, 0x8E1B, 0x2A67, + 0x8E1C, 0x8E1C, 0x2A71, 0x8E1D, 0x8E1D, 0x1236, 0x8E1E, 0x8E1E, 0x123C, + 0x8E1F, 0x8E1F, 0x123A, 0x8E20, 0x8E20, 0x2A61, 0x8E21, 0x8E21, 0x123B, + 0x8E22, 0x8E22, 0x1237, 0x8E23, 0x8E23, 0x2A62, 0x8E24, 0x8E24, 0x2A64, + 0x8E25, 0x8E25, 0x2A63, 0x8E26, 0x8E27, 0x2A6B, 0x8E28, 0x8E28, 0x3F88, + 0x8E29, 0x8E29, 0x1239, 0x8E2A, 0x8E2A, 0x3BB4, 0x8E2B, 0x8E2B, 0x1234, + 0x8E2D, 0x8E2D, 0x3EAB, 0x8E2E, 0x8E2E, 0x2A65, 0x8E30, 0x8E30, 0x2CAB, + 0x8E31, 0x8E31, 0x1362, 0x8E33, 0x8E33, 0x2CA2, 0x8E34, 0x8E34, 0x1363, + 0x8E35, 0x8E35, 0x1366, 0x8E36, 0x8E36, 0x2CA7, 0x8E38, 0x8E38, 0x2CA4, + 0x8E39, 0x8E39, 0x1365, 0x8E3A, 0x8E3A, 0x4784, 0x8E3C, 0x8E3D, 0x2CA8, + 0x8E3E, 0x8E3E, 0x2CA3, 0x8E3F, 0x8E3F, 0x2CAC, 0x8E40, 0x8E40, 0x2CA5, + 0x8E41, 0x8E41, 0x2CAA, 0x8E42, 0x8E42, 0x1364, 0x8E44, 0x8E44, 0x1361, + 0x8E45, 0x8E45, 0x2CA6, 0x8E46, 0x8E46, 0x4312, 0x8E47, 0x8E47, 0x2E7A, + 0x8E48, 0x8E48, 0x148B, 0x8E49, 0x8E49, 0x1489, 0x8E4A, 0x8E4A, 0x148C, + 0x8E4B, 0x8E4B, 0x148A, 0x8E4C, 0x8E4C, 0x2E79, 0x8E4D, 0x8E4D, 0x2E76, + 0x8E4E, 0x8E4E, 0x2E75, 0x8E4F, 0x8E4F, 0x3F83, 0x8E50, 0x8E50, 0x2E78, + 0x8E53, 0x8E53, 0x2E77, 0x8E54, 0x8E54, 0x2FF6, 0x8E55, 0x8E55, 0x1535, + 0x8E56, 0x8E56, 0x2FED, 0x8E57, 0x8E57, 0x2FEC, 0x8E59, 0x8E59, 0x1530, + 0x8E5A, 0x8E5A, 0x2FF2, 0x8E5B, 0x8E5B, 0x2FF1, 0x8E5C, 0x8E5C, 0x2FE9, + 0x8E5D, 0x8E5D, 0x2FF4, 0x8E5E, 0x8E5E, 0x2FEE, 0x8E5F, 0x8E5F, 0x1534, + 0x8E60, 0x8E60, 0x2FEB, 0x8E61, 0x8E61, 0x2FF3, 0x8E62, 0x8E62, 0x2FEA, + 0x8E63, 0x8E63, 0x1531, 0x8E64, 0x8E64, 0x1533, 0x8E65, 0x8E65, 0x2FEF, + 0x8E66, 0x8E66, 0x1532, 0x8E67, 0x8E67, 0x2FF0, 0x8E68, 0x8E68, 0x434D, + 0x8E69, 0x8E69, 0x2FF5, 0x8E6A, 0x8E6A, 0x313D, 0x8E6C, 0x8E6C, 0x15D3, + 0x8E6D, 0x8E6D, 0x313A, 0x8E6F, 0x8E6F, 0x313E, 0x8E71, 0x8E71, 0x43E7, + 0x8E72, 0x8E72, 0x15D0, 0x8E73, 0x8E73, 0x313C, 0x8E74, 0x8E74, 0x15D5, + 0x8E75, 0x8E75, 0x3F89, 0x8E76, 0x8E76, 0x15D2, 0x8E77, 0x8E77, 0x3F7F, + 0x8E78, 0x8E78, 0x313B, 0x8E7A, 0x8E7A, 0x15D4, 0x8E7B, 0x8E7B, 0x313F, + 0x8E7C, 0x8E7C, 0x15CF, 0x8E7E, 0x8E7E, 0x4324, 0x8E80, 0x8E80, 0x3E57, + 0x8E81, 0x8E81, 0x164D, 0x8E82, 0x8E82, 0x164F, 0x8E84, 0x8E84, 0x3240, + 0x8E85, 0x8E85, 0x164E, 0x8E86, 0x8E86, 0x323E, 0x8E87, 0x8E87, 0x15D1, + 0x8E88, 0x8E88, 0x323F, 0x8E89, 0x8E89, 0x164C, 0x8E8A, 0x8E8A, 0x1693, + 0x8E8B, 0x8E8B, 0x1695, 0x8E8C, 0x8E8C, 0x331A, 0x8E8D, 0x8E8D, 0x1694, + 0x8E8E, 0x8E8E, 0x3319, 0x8E90, 0x8E90, 0x33C1, 0x8E91, 0x8E91, 0x16DB, + 0x8E92, 0x8E92, 0x33C0, 0x8E93, 0x8E93, 0x16DC, 0x8E94, 0x8E94, 0x33BE, + 0x8E95, 0x8E95, 0x33BD, 0x8E96, 0x8E97, 0x33C2, 0x8E98, 0x8E98, 0x3443, + 0x8E9A, 0x8E9A, 0x33BF, 0x8E9D, 0x8E9D, 0x34A1, 0x8E9E, 0x8EA0, 0x349E, + 0x8EA1, 0x8EA1, 0x1749, 0x8EA3, 0x8EA3, 0x34EB, 0x8EA4, 0x8EA4, 0x34EA, + 0x8EA5, 0x8EA5, 0x34E9, 0x8EA6, 0x8EA6, 0x350A, 0x8EA7, 0x8EA7, 0x3BB5, + 0x8EA8, 0x8EA8, 0x3537, 0x8EA9, 0x8EA9, 0x3524, 0x8EAA, 0x8EAA, 0x175B, + 0x8EAB, 0x8EAB, 0x0512, 0x8EAC, 0x8EAC, 0x09CF, 0x8EAD, 0x8EAD, 0x385E, + 0x8EB0, 0x8EB0, 0x43E9, 0x8EB2, 0x8EB2, 0x0F2F, 0x8EB6, 0x8EB6, 0x385F, + 0x8EBA, 0x8EBA, 0x123D, 0x8EBC, 0x8EBC, 0x38A0, 0x8EBD, 0x8EBD, 0x2CAD, + 0x8EC0, 0x8EC0, 0x1536, 0x8EC2, 0x8EC2, 0x3140, 0x8EC3, 0x8EC3, 0x3860, + 0x8EC9, 0x8EC9, 0x3525, 0x8ECA, 0x8ECA, 0x0513, 0x8ECB, 0x8ECB, 0x068D, + 0x8ECC, 0x8ECC, 0x0810, 0x8ECD, 0x8ECD, 0x080F, 0x8ECE, 0x8ECE, 0x4788, + 0x8ECF, 0x8ECF, 0x09D2, 0x8ED1, 0x8ED1, 0x1E13, 0x8ED2, 0x8ED2, 0x09D0, + 0x8ED3, 0x8ED3, 0x1E14, 0x8ED4, 0x8ED4, 0x09D1, 0x8ED7, 0x8ED7, 0x207D, + 0x8ED8, 0x8ED8, 0x2079, 0x8EDA, 0x8EDA, 0x3DBE, 0x8EDB, 0x8EDB, 0x0BB3, + 0x8EDC, 0x8EDC, 0x207C, 0x8EDD, 0x8EDD, 0x207B, 0x8EDE, 0x8EDE, 0x207A, + 0x8EDF, 0x8EDF, 0x0BB4, 0x8EE0, 0x8EE1, 0x207E, 0x8EE2, 0x8EE2, 0x4789, + 0x8EE4, 0x8EE4, 0x478A, 0x8EE5, 0x8EE5, 0x2315, 0x8EE6, 0x8EE6, 0x2313, + 0x8EE7, 0x8EE8, 0x2317, 0x8EE9, 0x8EE9, 0x231E, 0x8EEB, 0x8EEB, 0x231A, + 0x8EEC, 0x8EEC, 0x231C, 0x8EED, 0x8EED, 0x478B, 0x8EEE, 0x8EEE, 0x2314, + 0x8EEF, 0x8EEF, 0x230F, 0x8EF1, 0x8EF1, 0x231B, 0x8EF2, 0x8EF2, 0x478C, + 0x8EF4, 0x8EF4, 0x231D, 0x8EF5, 0x8EF5, 0x2316, 0x8EF6, 0x8EF6, 0x2319, + 0x8EF7, 0x8EF7, 0x2310, 0x8EF8, 0x8EF8, 0x0D7F, 0x8EF9, 0x8EF9, 0x2312, + 0x8EFA, 0x8EFA, 0x2311, 0x8EFB, 0x8EFB, 0x0D7E, 0x8EFC, 0x8EFC, 0x0D80, + 0x8EFE, 0x8EFE, 0x0F32, 0x8EFF, 0x8EFF, 0x25BA, 0x8F00, 0x8F00, 0x25BC, + 0x8F01, 0x8F01, 0x25BB, 0x8F02, 0x8F02, 0x25C0, 0x8F03, 0x8F03, 0x0F30, + 0x8F05, 0x8F05, 0x25BD, 0x8F06, 0x8F06, 0x25B9, 0x8F07, 0x8F08, 0x25BE, + 0x8F09, 0x8F09, 0x0F31, 0x8F0A, 0x8F0A, 0x0F33, 0x8F0B, 0x8F0B, 0x25C1, + 0x8F0D, 0x8F0D, 0x2820, 0x8F0E, 0x8F0E, 0x281F, 0x8F10, 0x8F11, 0x281D, + 0x8F12, 0x8F12, 0x10BF, 0x8F13, 0x8F13, 0x10C1, 0x8F14, 0x8F14, 0x10BE, + 0x8F15, 0x8F15, 0x10C0, 0x8F16, 0x8F17, 0x2A7A, 0x8F18, 0x8F18, 0x2A76, + 0x8F19, 0x8F19, 0x3862, 0x8F1A, 0x8F1A, 0x2A77, 0x8F1B, 0x8F1B, 0x123F, + 0x8F1C, 0x8F1C, 0x1244, 0x8F1D, 0x8F1D, 0x123E, 0x8F1E, 0x8F1E, 0x1245, + 0x8F1F, 0x8F1F, 0x1240, 0x8F20, 0x8F20, 0x2A78, 0x8F23, 0x8F23, 0x2A79, + 0x8F24, 0x8F24, 0x2A75, 0x8F25, 0x8F25, 0x1246, 0x8F26, 0x8F26, 0x1242, + 0x8F29, 0x8F29, 0x1241, 0x8F2A, 0x8F2A, 0x1243, 0x8F2C, 0x8F2C, 0x2A74, + 0x8F2D, 0x8F2D, 0x3863, 0x8F2E, 0x8F2E, 0x2CAF, 0x8F2F, 0x8F2F, 0x1368, + 0x8F30, 0x8F30, 0x3BB7, 0x8F32, 0x8F32, 0x2CB1, 0x8F33, 0x8F33, 0x136A, + 0x8F34, 0x8F34, 0x2CB4, 0x8F35, 0x8F35, 0x2CB0, 0x8F36, 0x8F36, 0x2CAE, + 0x8F37, 0x8F37, 0x2CB3, 0x8F38, 0x8F38, 0x1369, 0x8F39, 0x8F39, 0x2CB2, + 0x8F3B, 0x8F3B, 0x1367, 0x8F3E, 0x8F3E, 0x148E, 0x8F3F, 0x8F3F, 0x1491, + 0x8F40, 0x8F40, 0x2E7C, 0x8F41, 0x8F41, 0x3D07, 0x8F42, 0x8F42, 0x148F, + 0x8F43, 0x8F43, 0x2E7B, 0x8F44, 0x8F44, 0x148D, 0x8F45, 0x8F45, 0x1490, + 0x8F46, 0x8F48, 0x2FF7, 0x8F49, 0x8F49, 0x1537, 0x8F4A, 0x8F4A, 0x3BB8, + 0x8F4B, 0x8F4B, 0x2FFA, 0x8F4D, 0x8F4D, 0x1538, 0x8F4E, 0x8F4E, 0x15D7, + 0x8F4F, 0x8F50, 0x3143, 0x8F51, 0x8F51, 0x3142, 0x8F52, 0x8F52, 0x3141, + 0x8F53, 0x8F53, 0x3145, 0x8F54, 0x8F54, 0x15D6, 0x8F55, 0x8F55, 0x3244, + 0x8F56, 0x8F57, 0x3242, 0x8F58, 0x8F58, 0x3245, 0x8F59, 0x8F59, 0x3241, + 0x8F5A, 0x8F5A, 0x3246, 0x8F5B, 0x8F5B, 0x331C, 0x8F5C, 0x8F5C, 0x3F31, + 0x8F5D, 0x8F5D, 0x331D, 0x8F5E, 0x8F5E, 0x331B, 0x8F5F, 0x8F5F, 0x1696, + 0x8F60, 0x8F60, 0x33C4, 0x8F61, 0x8F61, 0x16DD, 0x8F62, 0x8F62, 0x33C5, + 0x8F63, 0x8F63, 0x3445, 0x8F64, 0x8F64, 0x3444, 0x8F66, 0x8F67, 0x4569, + 0x8F6E, 0x8F6E, 0x456B, 0x8F93, 0x8F93, 0x4732, 0x8F9B, 0x8F9B, 0x0514, + 0x8F9C, 0x8F9C, 0x0D81, 0x8F9F, 0x8F9F, 0x0F34, 0x8FA0, 0x8FA0, 0x3D94, + 0x8FA3, 0x8FA3, 0x10C2, 0x8FA5, 0x8FA5, 0x3866, 0x8FA6, 0x8FA6, 0x136C, + 0x8FA8, 0x8FA8, 0x136B, 0x8FAD, 0x8FAD, 0x15D8, 0x8FAE, 0x8FAE, 0x162F, + 0x8FAF, 0x8FAF, 0x1697, 0x8FB0, 0x8FB0, 0x0515, 0x8FB1, 0x8FB1, 0x09D3, + 0x8FB2, 0x8FB2, 0x0F35, 0x8FB3, 0x8FB3, 0x386A, 0x8FB4, 0x8FB4, 0x3146, + 0x8FB5, 0x8FB5, 0x0230, 0x8FB6, 0x8FB6, 0x47D3, 0x8FB7, 0x8FB7, 0x43FD, + 0x8FB8, 0x8FB8, 0x42F6, 0x8FB9, 0x8FB9, 0x48C9, 0x8FBA, 0x8FBA, 0x48C7, + 0x8FBB, 0x8FBC, 0x3D6B, 0x8FBE, 0x8FBE, 0x48C6, 0x8FBF, 0x8FBF, 0x18E9, + 0x8FC1, 0x8FC1, 0x478D, 0x8FC2, 0x8FC2, 0x0516, 0x8FC4, 0x8FC4, 0x0519, + 0x8FC5, 0x8FC5, 0x0518, 0x8FC6, 0x8FC6, 0x0517, 0x8FC9, 0x8FC9, 0x18E8, + 0x8FCA, 0x8FCA, 0x478E, 0x8FCB, 0x8FCB, 0x1A4A, 0x8FCC, 0x8FCC, 0x478F, + 0x8FCD, 0x8FCD, 0x1A4C, 0x8FCE, 0x8FCE, 0x068E, 0x8FD0, 0x8FD0, 0x48AE, + 0x8FD1, 0x8FD1, 0x0690, 0x8FD2, 0x8FD2, 0x1A49, 0x8FD3, 0x8FD3, 0x1A4B, + 0x8FD4, 0x8FD4, 0x068F, 0x8FD5, 0x8FD5, 0x1A4E, 0x8FD6, 0x8FD6, 0x1A4D, + 0x8FD7, 0x8FD7, 0x1A4F, 0x8FDA, 0x8FDA, 0x3FCB, 0x8FE0, 0x8FE0, 0x1C0A, + 0x8FE1, 0x8FE1, 0x1C08, 0x8FE2, 0x8FE2, 0x0813, 0x8FE3, 0x8FE3, 0x1C07, + 0x8FE4, 0x8FE4, 0x0818, 0x8FE5, 0x8FE5, 0x0815, 0x8FE6, 0x8FE6, 0x0812, + 0x8FE8, 0x8FE8, 0x0819, 0x8FEA, 0x8FEA, 0x0814, 0x8FEB, 0x8FEB, 0x0817, + 0x8FED, 0x8FED, 0x0816, 0x8FEE, 0x8FEE, 0x1C09, 0x8FF0, 0x8FF0, 0x0811, + 0x8FF4, 0x8FF4, 0x09D9, 0x8FF5, 0x8FF5, 0x1E16, 0x8FF6, 0x8FF6, 0x1E1C, + 0x8FF7, 0x8FF7, 0x09D6, 0x8FF8, 0x8FF8, 0x09DD, 0x8FF9, 0x8FF9, 0x3871, + 0x8FFA, 0x8FFA, 0x09D8, 0x8FFB, 0x8FFB, 0x1E19, 0x8FFC, 0x8FFC, 0x1E1B, + 0x8FFD, 0x8FFD, 0x09DB, 0x8FFE, 0x8FFE, 0x1E15, 0x8FFF, 0x8FFF, 0x1E18, + 0x9000, 0x9000, 0x09D7, 0x9001, 0x9001, 0x09D4, 0x9002, 0x9002, 0x1E17, + 0x9003, 0x9003, 0x09DA, 0x9004, 0x9004, 0x1E1A, 0x9005, 0x9005, 0x09DC, + 0x9006, 0x9006, 0x09D5, 0x9008, 0x9008, 0x3EE0, 0x900B, 0x900B, 0x2081, + 0x900C, 0x900C, 0x2084, 0x900D, 0x900D, 0x0BB6, 0x900F, 0x900F, 0x0BC0, + 0x9010, 0x9010, 0x0BBC, 0x9011, 0x9011, 0x2082, 0x9012, 0x9012, 0x3E4E, + 0x9014, 0x9014, 0x0BC4, 0x9015, 0x9015, 0x0BBD, 0x9016, 0x9016, 0x0BC2, + 0x9017, 0x9017, 0x0BB8, 0x9019, 0x9019, 0x0BB5, 0x901A, 0x901A, 0x0BB7, + 0x901B, 0x901B, 0x0BC3, 0x901C, 0x901C, 0x2083, 0x901D, 0x901D, 0x0BBB, + 0x901E, 0x901E, 0x0BBE, 0x901F, 0x901F, 0x0BBA, 0x9020, 0x9020, 0x0BBF, + 0x9021, 0x9021, 0x2085, 0x9022, 0x9022, 0x0BC1, 0x9023, 0x9023, 0x0BB9, + 0x9024, 0x9024, 0x2080, 0x902D, 0x902D, 0x231F, 0x902E, 0x902E, 0x0D82, + 0x902F, 0x902F, 0x2321, 0x9031, 0x9031, 0x0D84, 0x9032, 0x9032, 0x0D86, + 0x9033, 0x9033, 0x4790, 0x9034, 0x9034, 0x2320, 0x9035, 0x9035, 0x0D83, + 0x9036, 0x9036, 0x0D87, 0x9037, 0x9037, 0x3876, 0x9038, 0x9038, 0x0D85, + 0x903C, 0x903C, 0x0F3B, 0x903D, 0x903D, 0x25C6, 0x903E, 0x903E, 0x0F43, + 0x903F, 0x903F, 0x25C3, 0x9041, 0x9041, 0x0F44, 0x9042, 0x9042, 0x0F39, + 0x9044, 0x9044, 0x25C4, 0x9047, 0x9047, 0x0F3E, 0x9049, 0x9049, 0x25C5, + 0x904A, 0x904A, 0x0F37, 0x904B, 0x904B, 0x0F36, 0x904C, 0x904C, 0x3F10, + 0x904D, 0x904D, 0x0F41, 0x904E, 0x904E, 0x0F40, 0x904F, 0x904F, 0x0F3F, + 0x9050, 0x9050, 0x0F3D, 0x9051, 0x9051, 0x0F42, 0x9052, 0x9052, 0x25C2, + 0x9053, 0x9053, 0x0F38, 0x9054, 0x9054, 0x0F3A, 0x9055, 0x9055, 0x0F3C, + 0x9056, 0x9056, 0x3DD2, 0x9058, 0x9058, 0x10C4, 0x9059, 0x9059, 0x10C7, + 0x905B, 0x905B, 0x10CB, 0x905C, 0x905C, 0x10C5, 0x905D, 0x905D, 0x10CA, + 0x905E, 0x905E, 0x10C8, 0x9060, 0x9060, 0x10C3, 0x9061, 0x9061, 0x3879, + 0x9062, 0x9062, 0x10C9, 0x9063, 0x9063, 0x10C6, 0x9064, 0x9064, 0x3C68, + 0x9067, 0x9067, 0x2A7F, 0x9068, 0x9068, 0x1249, 0x9069, 0x9069, 0x1247, + 0x906B, 0x906B, 0x2A80, 0x906C, 0x906C, 0x3D60, 0x906D, 0x906D, 0x124A, + 0x906E, 0x906E, 0x1248, 0x906F, 0x906F, 0x2A7E, 0x9070, 0x9070, 0x2A7D, + 0x9072, 0x9072, 0x1370, 0x9073, 0x9073, 0x2A7C, 0x9074, 0x9074, 0x136E, + 0x9075, 0x9075, 0x136D, 0x9076, 0x9076, 0x2CB5, 0x9077, 0x9077, 0x124B, + 0x9078, 0x9078, 0x136F, 0x9079, 0x9079, 0x2CB6, 0x907A, 0x907A, 0x1372, + 0x907B, 0x907B, 0x2CB7, 0x907C, 0x907C, 0x1371, 0x907D, 0x907D, 0x1493, + 0x907E, 0x907E, 0x2E7E, 0x907F, 0x907F, 0x1492, 0x9080, 0x9080, 0x1497, + 0x9081, 0x9082, 0x1495, 0x9083, 0x9083, 0x153A, 0x9084, 0x9084, 0x1494, + 0x9085, 0x9085, 0x2E7D, 0x9086, 0x9086, 0x2CB8, 0x9087, 0x9087, 0x1539, + 0x9088, 0x9088, 0x153B, 0x908A, 0x908B, 0x15D9, 0x908D, 0x908D, 0x3247, + 0x908F, 0x908F, 0x170C, 0x9090, 0x9090, 0x170B, 0x9091, 0x9091, 0x051B, + 0x9094, 0x9094, 0x181E, 0x9095, 0x9095, 0x09DE, 0x9097, 0x9098, 0x181B, + 0x9099, 0x9099, 0x181A, 0x909B, 0x909B, 0x181D, 0x909E, 0x909E, 0x18ED, + 0x909F, 0x909F, 0x18EA, 0x90A0, 0x90A0, 0x18EF, 0x90A1, 0x90A1, 0x18EB, + 0x90A2, 0x90A2, 0x051C, 0x90A3, 0x90A3, 0x051F, 0x90A5, 0x90A5, 0x18EC, + 0x90A6, 0x90A6, 0x051E, 0x90A7, 0x90A7, 0x18EE, 0x90A8, 0x90A8, 0x387C, + 0x90AA, 0x90AA, 0x051D, 0x90AE, 0x90AE, 0x3880, 0x90AF, 0x90AF, 0x1A52, + 0x90B0, 0x90B0, 0x1A54, 0x90B1, 0x90B1, 0x0693, 0x90B2, 0x90B2, 0x1A50, + 0x90B3, 0x90B3, 0x1A53, 0x90B4, 0x90B4, 0x1A51, 0x90B5, 0x90B5, 0x0691, + 0x90B6, 0x90B6, 0x0694, 0x90B8, 0x90B8, 0x0692, 0x90BB, 0x90BB, 0x3BC4, + 0x90BD, 0x90BD, 0x1C0C, 0x90BE, 0x90BE, 0x1C10, 0x90BF, 0x90BF, 0x1C0D, + 0x90C1, 0x90C1, 0x081C, 0x90C3, 0x90C3, 0x081D, 0x90C4, 0x90C4, 0x387E, + 0x90C5, 0x90C5, 0x1C0F, 0x90C7, 0x90C7, 0x1C11, 0x90C8, 0x90C8, 0x1C13, + 0x90CA, 0x90CA, 0x081A, 0x90CB, 0x90CB, 0x1C12, 0x90CE, 0x90CE, 0x081B, + 0x90D4, 0x90D4, 0x208C, 0x90D5, 0x90D5, 0x1C0E, 0x90D6, 0x90D6, 0x1E1D, + 0x90D7, 0x90D7, 0x1E26, 0x90D8, 0x90D8, 0x1E24, 0x90D9, 0x90DA, 0x1E1F, + 0x90DB, 0x90DB, 0x1E25, 0x90DC, 0x90DC, 0x1E27, 0x90DD, 0x90DD, 0x09E0, + 0x90DF, 0x90DF, 0x1E22, 0x90E0, 0x90E0, 0x1E1E, 0x90E1, 0x90E1, 0x09DF, + 0x90E2, 0x90E2, 0x09E1, 0x90E3, 0x90E3, 0x1E21, 0x90E4, 0x90E4, 0x1E28, + 0x90E5, 0x90E5, 0x1E23, 0x90E8, 0x90E8, 0x0BC5, 0x90E9, 0x90E9, 0x208F, + 0x90EA, 0x90EA, 0x2087, 0x90EB, 0x90EC, 0x208D, 0x90ED, 0x90ED, 0x0BC6, + 0x90EF, 0x90EF, 0x2086, 0x90F0, 0x90F0, 0x2088, 0x90F1, 0x90F1, 0x1C0B, + 0x90F2, 0x90F3, 0x208A, 0x90F4, 0x90F4, 0x2089, 0x90F5, 0x90F5, 0x0D89, + 0x90F9, 0x90F9, 0x2328, 0x90FA, 0x90FA, 0x2CB9, 0x90FB, 0x90FB, 0x2329, + 0x90FC, 0x90FC, 0x2326, 0x90FD, 0x90FD, 0x0BC7, 0x90FE, 0x90FE, 0x0D8B, + 0x90FF, 0x90FF, 0x2325, 0x9100, 0x9100, 0x232B, 0x9101, 0x9101, 0x232A, + 0x9102, 0x9102, 0x0D88, 0x9103, 0x9103, 0x232E, 0x9104, 0x9104, 0x2324, + 0x9105, 0x9105, 0x232D, 0x9106, 0x9106, 0x2322, 0x9107, 0x9107, 0x232C, + 0x9108, 0x9108, 0x2327, 0x9109, 0x9109, 0x0D8A, 0x910B, 0x910B, 0x25CD, + 0x910D, 0x910D, 0x25C8, 0x910E, 0x910E, 0x25CE, 0x910F, 0x910F, 0x25C9, + 0x9110, 0x9110, 0x25C7, 0x9111, 0x9111, 0x25CA, 0x9112, 0x9112, 0x0F45, + 0x9114, 0x9114, 0x25CC, 0x9116, 0x9116, 0x25CB, 0x9117, 0x9117, 0x0F46, + 0x9118, 0x9118, 0x10CD, 0x9119, 0x9119, 0x10CC, 0x911A, 0x911A, 0x2827, + 0x911B, 0x911B, 0x282A, 0x911C, 0x911C, 0x2822, 0x911D, 0x911D, 0x2826, + 0x911E, 0x911E, 0x10CE, 0x911F, 0x911F, 0x2825, 0x9120, 0x9120, 0x2823, + 0x9121, 0x9121, 0x2829, 0x9122, 0x9122, 0x2824, 0x9123, 0x9123, 0x2821, + 0x9124, 0x9124, 0x2828, 0x9126, 0x9126, 0x2A86, 0x9127, 0x9127, 0x124E, + 0x9128, 0x9128, 0x2FFB, 0x9129, 0x912A, 0x2A83, 0x912B, 0x912B, 0x2A82, + 0x912C, 0x912C, 0x2323, 0x912D, 0x912D, 0x124D, 0x912E, 0x912E, 0x2A87, + 0x912F, 0x912F, 0x2A81, 0x9130, 0x9130, 0x124C, 0x9131, 0x9131, 0x124F, + 0x9132, 0x9132, 0x2A85, 0x9133, 0x9133, 0x2CBA, 0x9134, 0x9134, 0x1373, + 0x9135, 0x9136, 0x2CBB, 0x9138, 0x9138, 0x2E7F, 0x9139, 0x9139, 0x1498, + 0x913A, 0x913B, 0x2FFC, 0x913E, 0x913E, 0x2FFE, 0x913F, 0x913F, 0x3148, + 0x9140, 0x9140, 0x3147, 0x9141, 0x9141, 0x3249, 0x9143, 0x9143, 0x3248, + 0x9144, 0x9145, 0x331F, 0x9146, 0x9146, 0x331E, 0x9147, 0x9147, 0x33C6, + 0x9148, 0x9148, 0x16DE, 0x9149, 0x9149, 0x0520, 0x914A, 0x914A, 0x081F, + 0x914B, 0x914B, 0x081E, 0x914C, 0x914C, 0x09E4, 0x914D, 0x914D, 0x09E3, + 0x914E, 0x914F, 0x1E2A, 0x9150, 0x9150, 0x1E29, 0x9151, 0x9151, 0x3F49, + 0x9152, 0x9152, 0x09E2, 0x9153, 0x9153, 0x2093, 0x9155, 0x9155, 0x2094, + 0x9156, 0x9156, 0x2090, 0x9157, 0x9157, 0x0BC8, 0x9158, 0x9158, 0x2091, + 0x9159, 0x9159, 0x3F45, 0x915A, 0x915A, 0x2092, 0x915C, 0x915C, 0x3F47, + 0x915E, 0x915E, 0x43EB, 0x915F, 0x915F, 0x2331, 0x9160, 0x9160, 0x2333, + 0x9161, 0x9161, 0x232F, 0x9162, 0x9162, 0x2332, 0x9163, 0x9163, 0x0D8C, + 0x9164, 0x9164, 0x2330, 0x9165, 0x9165, 0x0D8D, 0x9167, 0x9167, 0x3882, + 0x9168, 0x9168, 0x23E2, 0x9169, 0x9169, 0x0F49, 0x916A, 0x916A, 0x0F48, + 0x916C, 0x916C, 0x0F47, 0x916E, 0x916F, 0x25CF, 0x9170, 0x9170, 0x3EB8, + 0x9172, 0x9172, 0x282C, 0x9173, 0x9173, 0x282E, 0x9174, 0x9174, 0x10D2, + 0x9175, 0x9175, 0x10CF, 0x9176, 0x9176, 0x3E9B, 0x9177, 0x9177, 0x10D1, + 0x9178, 0x9178, 0x10D0, 0x9179, 0x9179, 0x282D, 0x917A, 0x917A, 0x282B, + 0x917C, 0x917C, 0x3F6F, 0x9180, 0x9180, 0x2A8E, 0x9181, 0x9182, 0x2A8B, + 0x9183, 0x9183, 0x1253, 0x9184, 0x9184, 0x2A8D, 0x9185, 0x9186, 0x2A88, + 0x9187, 0x9187, 0x1250, 0x9189, 0x9189, 0x1251, 0x918A, 0x918A, 0x2A8A, + 0x918B, 0x918B, 0x1252, 0x918C, 0x918C, 0x43EC, 0x918D, 0x918D, 0x2CC0, + 0x918E, 0x918E, 0x3F4E, 0x918F, 0x918F, 0x2CC1, 0x9190, 0x9191, 0x2CBE, + 0x9192, 0x9192, 0x1374, 0x9193, 0x9193, 0x2CBD, 0x9199, 0x9199, 0x2E83, + 0x919A, 0x919A, 0x2E80, 0x919B, 0x919B, 0x2E82, 0x919C, 0x919C, 0x149B, + 0x919D, 0x919D, 0x2E86, 0x919E, 0x919E, 0x149A, 0x919F, 0x919F, 0x2E84, + 0x91A0, 0x91A0, 0x2E87, 0x91A1, 0x91A1, 0x2E85, 0x91A2, 0x91A2, 0x2E81, + 0x91A3, 0x91A3, 0x1499, 0x91A5, 0x91A5, 0x3000, 0x91A7, 0x91A7, 0x3001, + 0x91A8, 0x91A8, 0x2FFF, 0x91A9, 0x91A9, 0x3883, 0x91AA, 0x91AA, 0x3003, + 0x91AB, 0x91AC, 0x153C, 0x91AD, 0x91AD, 0x314A, 0x91AE, 0x91AE, 0x15DC, + 0x91AF, 0x91AF, 0x3002, 0x91B0, 0x91B0, 0x3149, 0x91B1, 0x91B1, 0x15DB, + 0x91B2, 0x91B3, 0x324C, 0x91B4, 0x91B4, 0x1650, 0x91B5, 0x91B5, 0x324B, + 0x91B6, 0x91B6, 0x45EF, 0x91B7, 0x91B7, 0x324A, 0x91B9, 0x91B9, 0x3321, + 0x91BA, 0x91BA, 0x1698, 0x91BB, 0x91BB, 0x3BC8, 0x91BC, 0x91BC, 0x3446, + 0x91BD, 0x91BD, 0x34A3, 0x91BE, 0x91BE, 0x34A2, 0x91C0, 0x91C0, 0x1730, + 0x91C1, 0x91C1, 0x174A, 0x91C2, 0x91C2, 0x34A4, 0x91C3, 0x91C3, 0x350B, + 0x91C4, 0x91C4, 0x3884, 0x91C5, 0x91C5, 0x175C, 0x91C6, 0x91C6, 0x0521, + 0x91C7, 0x91C7, 0x0695, 0x91C9, 0x91C9, 0x0F4A, 0x91CB, 0x91CB, 0x1651, + 0x91CC, 0x91CC, 0x0522, 0x91CD, 0x91CD, 0x0820, 0x91CE, 0x91CE, 0x0BC9, + 0x91CF, 0x91CF, 0x0D8E, 0x91D0, 0x91D0, 0x153E, 0x91D1, 0x91D1, 0x0696, + 0x91D3, 0x91D3, 0x1C15, 0x91D4, 0x91D4, 0x1C14, 0x91D5, 0x91D5, 0x1E2C, + 0x91D6, 0x91D6, 0x415E, 0x91D7, 0x91D7, 0x09E7, 0x91D8, 0x91D8, 0x09E5, + 0x91D9, 0x91D9, 0x09E9, 0x91DA, 0x91DA, 0x1E2E, 0x91DC, 0x91DC, 0x09E8, + 0x91DD, 0x91DD, 0x09E6, 0x91DF, 0x91DF, 0x453A, 0x91E2, 0x91E2, 0x1E2D, + 0x91E3, 0x91E3, 0x0BCC, 0x91E4, 0x91E4, 0x209A, 0x91E5, 0x91E5, 0x3C06, + 0x91E6, 0x91E6, 0x0BCB, 0x91E7, 0x91E7, 0x0BCD, 0x91E8, 0x91E8, 0x209F, + 0x91E9, 0x91E9, 0x0BCF, 0x91EA, 0x91EB, 0x209C, 0x91EC, 0x91EC, 0x2095, + 0x91ED, 0x91ED, 0x0BCE, 0x91EE, 0x91EE, 0x20A0, 0x91F1, 0x91F1, 0x2097, + 0x91F3, 0x91F3, 0x2098, 0x91F4, 0x91F4, 0x2096, 0x91F5, 0x91F5, 0x0BCA, + 0x91F7, 0x91F7, 0x209E, 0x91F8, 0x91F8, 0x2099, 0x91F9, 0x91F9, 0x209B, + 0x91FA, 0x91FA, 0x3AF8, 0x91FD, 0x91FD, 0x233F, 0x91FE, 0x91FE, 0x382E, + 0x91FF, 0x91FF, 0x233E, 0x9200, 0x9200, 0x233C, 0x9201, 0x9201, 0x2334, + 0x9202, 0x9202, 0x2343, 0x9203, 0x9203, 0x2337, 0x9204, 0x9204, 0x2341, + 0x9205, 0x9205, 0x2348, 0x9206, 0x9206, 0x2340, 0x9207, 0x9207, 0x0D96, + 0x9208, 0x9208, 0x3EB9, 0x9209, 0x9209, 0x0D92, 0x920A, 0x920A, 0x2335, + 0x920C, 0x920C, 0x233B, 0x920D, 0x920D, 0x0D94, 0x920E, 0x920E, 0x3888, + 0x920F, 0x920F, 0x233A, 0x9210, 0x9210, 0x0D95, 0x9211, 0x9211, 0x0D97, + 0x9212, 0x9212, 0x233D, 0x9213, 0x9213, 0x4793, 0x9214, 0x9215, 0x0D8F, + 0x9216, 0x9216, 0x2349, 0x9217, 0x9217, 0x2347, 0x9219, 0x9219, 0x2346, + 0x921A, 0x921A, 0x2338, 0x921C, 0x921C, 0x2344, 0x921E, 0x921E, 0x0D93, + 0x9223, 0x9223, 0x0D91, 0x9224, 0x9224, 0x2345, 0x9225, 0x9225, 0x2336, + 0x9226, 0x9226, 0x2339, 0x9227, 0x9227, 0x2342, 0x9228, 0x9228, 0x4795, + 0x922A, 0x922A, 0x3C0E, 0x922B, 0x922B, 0x3BA6, 0x922D, 0x922D, 0x2851, + 0x922E, 0x922E, 0x25DA, 0x9230, 0x9230, 0x25D3, 0x9231, 0x9231, 0x25E6, + 0x9232, 0x9232, 0x25EF, 0x9233, 0x9233, 0x25D6, 0x9234, 0x9234, 0x0F55, + 0x9235, 0x9235, 0x3B26, 0x9236, 0x9236, 0x25E3, 0x9237, 0x9237, 0x0F4B, + 0x9238, 0x9238, 0x0F4D, 0x9239, 0x9239, 0x0F59, 0x923A, 0x923A, 0x25D4, + 0x923C, 0x923C, 0x41D2, 0x923D, 0x923D, 0x0F4E, 0x923E, 0x923E, 0x0F50, + 0x923F, 0x923F, 0x0F5A, 0x9240, 0x9240, 0x0F4F, 0x9241, 0x9241, 0x388A, + 0x9244, 0x9244, 0x389A, 0x9245, 0x9245, 0x0F58, 0x9246, 0x9246, 0x25DC, + 0x9248, 0x9248, 0x25D1, 0x9249, 0x9249, 0x0F56, 0x924A, 0x924A, 0x25DB, + 0x924B, 0x924B, 0x0F52, 0x924C, 0x924C, 0x25ED, 0x924D, 0x924D, 0x0F57, + 0x924E, 0x924E, 0x25EB, 0x924F, 0x924F, 0x25DF, 0x9250, 0x9250, 0x25E9, + 0x9251, 0x9251, 0x0F54, 0x9252, 0x9252, 0x25D2, 0x9253, 0x9253, 0x25EC, + 0x9254, 0x9254, 0x25E7, 0x9255, 0x9255, 0x3E47, 0x9256, 0x9256, 0x25EE, + 0x9257, 0x9257, 0x0F4C, 0x9258, 0x9258, 0x4796, 0x925A, 0x925A, 0x0F5B, + 0x925B, 0x925B, 0x0F51, 0x925D, 0x925D, 0x3A03, 0x925E, 0x925E, 0x25D8, + 0x925F, 0x925F, 0x3CE0, 0x9260, 0x9260, 0x25E0, 0x9261, 0x9261, 0x25E4, + 0x9262, 0x9262, 0x388B, 0x9263, 0x9263, 0x25E8, 0x9264, 0x9264, 0x0F53, + 0x9265, 0x9265, 0x25D7, 0x9266, 0x9266, 0x25D5, 0x9267, 0x9267, 0x25E1, + 0x926B, 0x926B, 0x4797, 0x926C, 0x926C, 0x25DE, 0x926D, 0x926D, 0x25DD, + 0x926E, 0x926E, 0x3D05, 0x926F, 0x926F, 0x25E2, 0x9270, 0x9270, 0x25E5, + 0x9272, 0x9272, 0x25EA, 0x9276, 0x9276, 0x2831, 0x9277, 0x9277, 0x3C64, + 0x9278, 0x9278, 0x10D3, 0x9279, 0x9279, 0x283B, 0x927A, 0x927A, 0x2833, + 0x927B, 0x927B, 0x10D9, 0x927C, 0x927C, 0x10DD, 0x927D, 0x927D, 0x2844, + 0x927E, 0x927E, 0x284C, 0x927F, 0x927F, 0x283D, 0x9280, 0x9280, 0x10D5, + 0x9281, 0x9281, 0x3E01, 0x9282, 0x9282, 0x2841, 0x9283, 0x9283, 0x25D9, + 0x9284, 0x9284, 0x3CB9, 0x9285, 0x9285, 0x10D6, 0x9286, 0x9286, 0x2848, + 0x9287, 0x9287, 0x284D, 0x9288, 0x9288, 0x2845, 0x9289, 0x9289, 0x3AB5, + 0x928A, 0x928A, 0x2847, 0x928B, 0x928B, 0x2850, 0x928C, 0x928C, 0x2849, + 0x928D, 0x928D, 0x2837, 0x928E, 0x928E, 0x2840, 0x928F, 0x928F, 0x46BD, + 0x9291, 0x9291, 0x10DE, 0x9293, 0x9293, 0x10DA, 0x9294, 0x9294, 0x2835, + 0x9295, 0x9295, 0x2842, 0x9296, 0x9296, 0x10D8, 0x9297, 0x9297, 0x283C, + 0x9298, 0x9298, 0x10D7, 0x9299, 0x9299, 0x284A, 0x929A, 0x929A, 0x2839, + 0x929B, 0x929B, 0x2832, 0x929C, 0x929C, 0x10DB, 0x929D, 0x929D, 0x284F, + 0x92A0, 0x92A0, 0x2834, 0x92A1, 0x92A1, 0x2846, 0x92A2, 0x92A2, 0x2843, + 0x92A3, 0x92A3, 0x283E, 0x92A4, 0x92A4, 0x2830, 0x92A5, 0x92A5, 0x282F, + 0x92A6, 0x92A6, 0x2838, 0x92A7, 0x92A7, 0x284B, 0x92A8, 0x92A8, 0x10DC, + 0x92A9, 0x92A9, 0x284E, 0x92AA, 0x92AA, 0x2836, 0x92AB, 0x92AB, 0x283A, + 0x92AC, 0x92AC, 0x10D4, 0x92AE, 0x92AE, 0x4799, 0x92B1, 0x92B1, 0x4798, + 0x92B2, 0x92B2, 0x125F, 0x92B3, 0x92B3, 0x125A, 0x92B4, 0x92B4, 0x2AB0, + 0x92B5, 0x92B5, 0x2AAC, 0x92B6, 0x92B6, 0x2A94, 0x92B7, 0x92B7, 0x1256, + 0x92B9, 0x92B9, 0x36E9, 0x92BA, 0x92BA, 0x3BF5, 0x92BB, 0x92BB, 0x1255, + 0x92BC, 0x92BC, 0x125B, 0x92BE, 0x92BE, 0x3C60, 0x92BF, 0x92BF, 0x479A, + 0x92C0, 0x92C0, 0x2A92, 0x92C1, 0x92C1, 0x1259, 0x92C2, 0x92C2, 0x2A9E, + 0x92C3, 0x92C4, 0x2A90, 0x92C5, 0x92C5, 0x1254, 0x92C6, 0x92C6, 0x2AAF, + 0x92C7, 0x92C7, 0x125D, 0x92C8, 0x92C8, 0x2AA1, 0x92C9, 0x92C9, 0x2AA6, + 0x92CA, 0x92CA, 0x2AA0, 0x92CB, 0x92CB, 0x2CD3, 0x92CC, 0x92CC, 0x2A9C, + 0x92CD, 0x92CD, 0x2AA4, 0x92CE, 0x92CE, 0x2AA2, 0x92CF, 0x92CF, 0x2A95, + 0x92D0, 0x92D0, 0x2A8F, 0x92D1, 0x92D1, 0x2AAA, 0x92D2, 0x92D2, 0x125C, + 0x92D3, 0x92D3, 0x2AAB, 0x92D4, 0x92D4, 0x3861, 0x92D5, 0x92D5, 0x2AA5, + 0x92D7, 0x92D7, 0x2A9A, 0x92D8, 0x92D8, 0x2A98, 0x92D9, 0x92D9, 0x2A93, + 0x92DB, 0x92DB, 0x400C, 0x92DD, 0x92DD, 0x2A9B, 0x92DE, 0x92DE, 0x2AA8, + 0x92DF, 0x92DF, 0x2A97, 0x92E0, 0x92E0, 0x2AA7, 0x92E1, 0x92E1, 0x2AAD, + 0x92E3, 0x92E3, 0x479B, 0x92E4, 0x92E4, 0x1258, 0x92E5, 0x92E5, 0x3CA2, + 0x92E6, 0x92E6, 0x2AA3, 0x92E7, 0x92E7, 0x2AA9, 0x92E8, 0x92E8, 0x2A9F, + 0x92E9, 0x92E9, 0x2A99, 0x92EA, 0x92EA, 0x1257, 0x92EB, 0x92EB, 0x479C, + 0x92EC, 0x92EC, 0x3964, 0x92EE, 0x92EE, 0x283F, 0x92EF, 0x92EF, 0x2A9D, + 0x92F0, 0x92F0, 0x125E, 0x92F1, 0x92F1, 0x2A96, 0x92F2, 0x92F2, 0x3AB2, + 0x92F3, 0x92F4, 0x479D, 0x92F6, 0x92F6, 0x3C04, 0x92F7, 0x92F7, 0x2CD8, + 0x92F8, 0x92F8, 0x1377, 0x92F9, 0x92F9, 0x2CD7, 0x92FA, 0x92FA, 0x2CD5, + 0x92FB, 0x92FB, 0x2CE7, 0x92FC, 0x92FC, 0x137B, 0x92FD, 0x92FD, 0x479F, + 0x92FE, 0x92FE, 0x2CE4, 0x92FF, 0x92FF, 0x2CDC, 0x9300, 0x9300, 0x2CE6, + 0x9301, 0x9301, 0x2CCE, 0x9302, 0x9302, 0x2CDA, 0x9303, 0x9303, 0x3867, + 0x9304, 0x9304, 0x137D, 0x9306, 0x9306, 0x2CC6, 0x9307, 0x9307, 0x3B11, + 0x9308, 0x9308, 0x2CC4, 0x9309, 0x9309, 0x2CE5, 0x930B, 0x930B, 0x2CE3, + 0x930C, 0x930C, 0x2CE2, 0x930D, 0x930D, 0x2CD2, 0x930E, 0x930E, 0x2CD1, + 0x930F, 0x930F, 0x2CC7, 0x9310, 0x9310, 0x137F, 0x9312, 0x9312, 0x2CCD, + 0x9313, 0x9313, 0x2CD6, 0x9314, 0x9314, 0x2CE1, 0x9315, 0x9315, 0x1382, + 0x9316, 0x9316, 0x2CE8, 0x9318, 0x9318, 0x14A3, 0x9319, 0x9319, 0x1384, + 0x931A, 0x931A, 0x137E, 0x931B, 0x931B, 0x2CCB, 0x931D, 0x931D, 0x2CD4, + 0x931E, 0x931E, 0x2CC3, 0x931F, 0x931F, 0x2CC5, 0x9320, 0x9320, 0x1375, + 0x9321, 0x9321, 0x1381, 0x9322, 0x9322, 0x137A, 0x9323, 0x9323, 0x2CCC, + 0x9324, 0x9324, 0x2CDB, 0x9325, 0x9325, 0x2AAE, 0x9326, 0x9326, 0x1380, + 0x9327, 0x9327, 0x2CC2, 0x9328, 0x9328, 0x149E, 0x9329, 0x9329, 0x2CDD, + 0x932A, 0x932A, 0x2CE0, 0x932B, 0x932B, 0x137C, 0x932C, 0x932C, 0x3892, + 0x932D, 0x932D, 0x2CD0, 0x932E, 0x932E, 0x1383, 0x932F, 0x932F, 0x1379, + 0x9330, 0x9330, 0x3E03, 0x9331, 0x9331, 0x3CBD, 0x9333, 0x9333, 0x1378, + 0x9334, 0x9334, 0x2CD9, 0x9335, 0x9335, 0x2CDF, 0x9336, 0x9336, 0x1376, + 0x9338, 0x9338, 0x2CC9, 0x9339, 0x9339, 0x2CDE, 0x933C, 0x933C, 0x2CCA, + 0x9340, 0x9340, 0x4155, 0x9341, 0x9341, 0x4277, 0x9342, 0x9342, 0x3AFA, + 0x9343, 0x9343, 0x47A0, 0x9344, 0x9344, 0x4016, 0x9345, 0x9345, 0x3E74, + 0x9346, 0x9346, 0x2CCF, 0x9347, 0x9347, 0x2E8D, 0x9348, 0x9348, 0x3C61, + 0x9349, 0x9349, 0x2E92, 0x934A, 0x934A, 0x14A0, 0x934B, 0x934B, 0x14A2, + 0x934C, 0x934C, 0x2E98, 0x934D, 0x934D, 0x149C, 0x934E, 0x934E, 0x2EA6, + 0x934F, 0x934F, 0x2E9E, 0x9350, 0x9351, 0x2E93, 0x9352, 0x9352, 0x2E9D, + 0x9354, 0x9354, 0x14A9, 0x9355, 0x9355, 0x2E9C, 0x9356, 0x9356, 0x2E8C, + 0x9357, 0x9357, 0x2E9B, 0x9358, 0x9358, 0x2E8F, 0x9359, 0x9359, 0x2EA7, + 0x935A, 0x935A, 0x14A8, 0x935B, 0x935B, 0x14A6, 0x935C, 0x935C, 0x2E90, + 0x935E, 0x935E, 0x2EA3, 0x935F, 0x935F, 0x3CBB, 0x9360, 0x9360, 0x2E95, + 0x9361, 0x9361, 0x2EA2, 0x9362, 0x9362, 0x4268, 0x9363, 0x9363, 0x2EA4, + 0x9364, 0x9364, 0x2E8B, 0x9365, 0x9365, 0x14A1, 0x9366, 0x9366, 0x46BC, + 0x9367, 0x9367, 0x2EA5, 0x9368, 0x9368, 0x3BF0, 0x9369, 0x9369, 0x3961, + 0x936A, 0x936A, 0x2E99, 0x936B, 0x936B, 0x3893, 0x936C, 0x936C, 0x14A5, + 0x936D, 0x936D, 0x2E96, 0x936E, 0x936E, 0x39E8, 0x9370, 0x9370, 0x14A7, + 0x9371, 0x9371, 0x2E9F, 0x9373, 0x9373, 0x389E, 0x9374, 0x9374, 0x3CE4, + 0x9375, 0x9375, 0x149F, 0x9376, 0x9376, 0x2E91, 0x9377, 0x9377, 0x2EA0, + 0x9378, 0x9378, 0x38F9, 0x9379, 0x9379, 0x2E9A, 0x937A, 0x937A, 0x2CC8, + 0x937B, 0x937B, 0x2EA1, 0x937C, 0x937C, 0x2E8E, 0x937D, 0x937D, 0x3C25, + 0x937E, 0x937E, 0x14A4, 0x9380, 0x9380, 0x3014, 0x9381, 0x9381, 0x3965, + 0x9382, 0x9382, 0x149D, 0x9383, 0x9383, 0x2E89, 0x9384, 0x9384, 0x47A1, + 0x9385, 0x9385, 0x42BD, 0x9386, 0x9386, 0x3CC0, 0x9387, 0x9387, 0x3AE0, + 0x9388, 0x9388, 0x3011, 0x9389, 0x9389, 0x300A, 0x938A, 0x938A, 0x1540, + 0x938C, 0x938C, 0x3005, 0x938D, 0x938D, 0x3015, 0x938E, 0x938E, 0x300C, + 0x938F, 0x938F, 0x2E97, 0x9390, 0x9390, 0x3D3C, 0x9391, 0x9391, 0x3017, + 0x9392, 0x9392, 0x3006, 0x9394, 0x9394, 0x153F, 0x9395, 0x9395, 0x3010, + 0x9396, 0x9396, 0x1541, 0x9397, 0x9397, 0x1549, 0x9398, 0x9398, 0x1547, + 0x9399, 0x9399, 0x3012, 0x939A, 0x939A, 0x1548, 0x939B, 0x939B, 0x3008, + 0x939C, 0x939C, 0x39AC, 0x939D, 0x939D, 0x3009, 0x939E, 0x939E, 0x300E, + 0x939F, 0x939F, 0x3013, 0x93A0, 0x93A0, 0x3AB1, 0x93A1, 0x93A1, 0x2E88, + 0x93A2, 0x93A2, 0x1542, 0x93A3, 0x93A3, 0x301C, 0x93A4, 0x93A4, 0x3019, + 0x93A5, 0x93A5, 0x3160, 0x93A6, 0x93A6, 0x300F, 0x93A7, 0x93A7, 0x300B, + 0x93A8, 0x93A8, 0x301A, 0x93A9, 0x93A9, 0x3155, 0x93AA, 0x93AA, 0x300D, + 0x93AC, 0x93AC, 0x1545, 0x93AD, 0x93AD, 0x47A2, 0x93AE, 0x93AE, 0x1544, + 0x93AF, 0x93AF, 0x2E8A, 0x93B0, 0x93B0, 0x1546, 0x93B1, 0x93B1, 0x3016, + 0x93B2, 0x93B2, 0x3018, 0x93B3, 0x93B3, 0x1543, 0x93B4, 0x93B4, 0x301B, + 0x93B5, 0x93B5, 0x3004, 0x93B7, 0x93B7, 0x3007, 0x93B8, 0x93B8, 0x3C90, + 0x93BA, 0x93BA, 0x43F7, 0x93BB, 0x93BB, 0x3C8F, 0x93BD, 0x93BD, 0x3A27, + 0x93BF, 0x93BF, 0x3E2D, 0x93C0, 0x93C0, 0x315E, 0x93C2, 0x93C2, 0x314E, + 0x93C3, 0x93C3, 0x15E0, 0x93C4, 0x93C4, 0x315C, 0x93C6, 0x93C6, 0x39AA, + 0x93C7, 0x93C7, 0x314C, 0x93C8, 0x93C8, 0x15E1, 0x93CA, 0x93CA, 0x3157, + 0x93CB, 0x93CB, 0x3966, 0x93CC, 0x93CC, 0x3153, 0x93CD, 0x93CD, 0x15E6, + 0x93CE, 0x93CE, 0x315D, 0x93CF, 0x93CF, 0x314D, 0x93D0, 0x93D0, 0x3150, + 0x93D1, 0x93D1, 0x15DE, 0x93D2, 0x93D2, 0x315F, 0x93D3, 0x93D3, 0x40E1, + 0x93D4, 0x93D4, 0x3158, 0x93D5, 0x93D5, 0x315B, 0x93D6, 0x93D6, 0x15E4, + 0x93D7, 0x93D7, 0x15E9, 0x93D8, 0x93D8, 0x15E7, 0x93D9, 0x93D9, 0x3154, + 0x93DA, 0x93DA, 0x314F, 0x93DB, 0x93DB, 0x3C5F, 0x93DC, 0x93DD, 0x15E2, + 0x93DE, 0x93DE, 0x314B, 0x93DF, 0x93DF, 0x15DF, 0x93E0, 0x93E0, 0x3A20, + 0x93E1, 0x93E1, 0x15DD, 0x93E2, 0x93E2, 0x15E5, 0x93E3, 0x93E3, 0x315A, + 0x93E4, 0x93E4, 0x15E8, 0x93E6, 0x93E6, 0x3156, 0x93E7, 0x93E7, 0x3161, + 0x93E8, 0x93E8, 0x15EA, 0x93EC, 0x93EC, 0x3152, 0x93EE, 0x93EE, 0x3159, + 0x93F0, 0x93F0, 0x423F, 0x93F1, 0x93F1, 0x42AA, 0x93F3, 0x93F3, 0x3962, + 0x93F5, 0x93F5, 0x325A, 0x93F6, 0x93F6, 0x3269, 0x93F7, 0x93F7, 0x325C, + 0x93F8, 0x93F8, 0x3263, 0x93F9, 0x93F9, 0x3151, 0x93FA, 0x93FA, 0x3261, + 0x93FB, 0x93FB, 0x3250, 0x93FC, 0x93FC, 0x3267, 0x93FD, 0x93FD, 0x1654, + 0x93FE, 0x93FE, 0x3254, 0x93FF, 0x93FF, 0x3266, 0x9400, 0x9400, 0x325B, + 0x9401, 0x9401, 0x3CD4, 0x9403, 0x9403, 0x1653, 0x9404, 0x9404, 0x3BC9, + 0x9406, 0x9406, 0x326B, 0x9407, 0x9407, 0x325D, 0x9408, 0x9408, 0x3A25, + 0x9409, 0x9409, 0x3262, 0x940A, 0x940A, 0x3265, 0x940B, 0x940B, 0x324E, + 0x940C, 0x940C, 0x3268, 0x940D, 0x940D, 0x3259, 0x940E, 0x940E, 0x325E, + 0x940F, 0x940F, 0x3252, 0x9410, 0x9410, 0x3256, 0x9411, 0x9411, 0x326A, + 0x9412, 0x9412, 0x3260, 0x9413, 0x9413, 0x324F, 0x9414, 0x9414, 0x3253, + 0x9415, 0x9415, 0x3255, 0x9416, 0x9416, 0x325F, 0x9417, 0x9417, 0x47A5, + 0x9418, 0x9418, 0x1652, 0x9419, 0x9419, 0x3258, 0x941B, 0x941B, 0x4148, + 0x941D, 0x941D, 0x47A6, 0x9420, 0x9420, 0x3251, 0x9424, 0x9424, 0x3943, + 0x9425, 0x9425, 0x38D0, 0x9426, 0x9426, 0x38A3, 0x9427, 0x9427, 0x3BCD, + 0x9428, 0x9428, 0x3257, 0x9429, 0x9429, 0x3325, 0x942A, 0x942A, 0x3329, + 0x942B, 0x942B, 0x169F, 0x942C, 0x942C, 0x332B, 0x942D, 0x942D, 0x47A7, + 0x942E, 0x942E, 0x1699, 0x9430, 0x9430, 0x3327, 0x9431, 0x9431, 0x332D, + 0x9432, 0x9432, 0x169E, 0x9433, 0x9433, 0x169A, 0x9435, 0x9435, 0x169B, + 0x9436, 0x9436, 0x3324, 0x9437, 0x9437, 0x332A, 0x9438, 0x9438, 0x169D, + 0x9439, 0x9439, 0x3328, 0x943A, 0x943A, 0x169C, 0x943B, 0x943B, 0x3323, + 0x943C, 0x943C, 0x3264, 0x943D, 0x943D, 0x3326, 0x943E, 0x943E, 0x47A8, + 0x943F, 0x943F, 0x3322, 0x9440, 0x9440, 0x332C, 0x9442, 0x9442, 0x4272, + 0x9443, 0x9443, 0x4275, 0x9444, 0x9444, 0x16DF, 0x9445, 0x9445, 0x33CD, + 0x9446, 0x9446, 0x33D0, 0x9447, 0x9447, 0x33CC, 0x9448, 0x9449, 0x33CE, + 0x944A, 0x944B, 0x33C9, 0x944C, 0x944C, 0x33C7, 0x944D, 0x944D, 0x3C65, + 0x944F, 0x944F, 0x33CB, 0x9450, 0x9450, 0x33C8, 0x9451, 0x9452, 0x16E0, + 0x9454, 0x9454, 0x47AA, 0x9455, 0x9455, 0x3448, 0x9457, 0x9457, 0x344A, + 0x9458, 0x9458, 0x3C30, 0x945B, 0x945B, 0x389F, 0x945D, 0x945D, 0x3449, + 0x945E, 0x945E, 0x344B, 0x9460, 0x9460, 0x170E, 0x9462, 0x9462, 0x3447, + 0x9463, 0x9463, 0x170D, 0x9464, 0x9464, 0x170F, 0x9465, 0x9465, 0x3DDE, + 0x9467, 0x9467, 0x3AB8, 0x9468, 0x9469, 0x34A6, 0x946A, 0x946A, 0x1731, + 0x946B, 0x946B, 0x34A5, 0x946C, 0x946C, 0x377E, 0x946D, 0x946D, 0x34ED, + 0x946E, 0x946E, 0x34EC, 0x946F, 0x946F, 0x34EE, 0x9470, 0x9470, 0x174C, + 0x9471, 0x9471, 0x34EF, 0x9472, 0x9472, 0x174B, 0x9473, 0x9473, 0x34F0, + 0x9474, 0x9474, 0x350C, 0x9475, 0x9475, 0x350F, 0x9476, 0x9476, 0x350E, + 0x9477, 0x9477, 0x1755, 0x9478, 0x9478, 0x350D, 0x9479, 0x9479, 0x47AB, + 0x947B, 0x947B, 0x419B, 0x947C, 0x947C, 0x175F, 0x947D, 0x947E, 0x175D, + 0x947F, 0x947F, 0x1764, 0x9480, 0x9481, 0x3539, 0x9482, 0x9482, 0x3538, + 0x9483, 0x9483, 0x3540, 0x9485, 0x9485, 0x4507, 0x949F, 0x949F, 0x4885, + 0x94A2, 0x94A2, 0x451B, 0x94C1, 0x94C1, 0x47E1, 0x94C3, 0x94C3, 0x47DF, + 0x94DC, 0x94DC, 0x47D7, 0x94F6, 0x94F6, 0x47D2, 0x952D, 0x952D, 0x47AC, + 0x9547, 0x9547, 0x48BF, 0x9577, 0x9577, 0x0697, 0x9578, 0x9578, 0x4508, + 0x957A, 0x957A, 0x20A1, 0x957B, 0x957B, 0x234A, 0x957C, 0x957C, 0x2AB1, + 0x957D, 0x957D, 0x3162, 0x957F, 0x957F, 0x4509, 0x9580, 0x9580, 0x0698, + 0x9582, 0x9582, 0x0821, 0x9583, 0x9583, 0x09EA, 0x9585, 0x9585, 0x38A1, + 0x9586, 0x9586, 0x20A2, 0x9588, 0x9588, 0x20A3, 0x9589, 0x9589, 0x0BD0, + 0x958B, 0x958B, 0x0D9A, 0x958C, 0x958C, 0x234C, 0x958D, 0x958D, 0x234B, + 0x958E, 0x958E, 0x0D9E, 0x958F, 0x958F, 0x0D99, 0x9590, 0x9590, 0x234D, + 0x9591, 0x9591, 0x0D9B, 0x9592, 0x9592, 0x0D9D, 0x9593, 0x9593, 0x0D9C, + 0x9594, 0x9594, 0x0D98, 0x9596, 0x9596, 0x3BD5, 0x9597, 0x9597, 0x3BD4, + 0x9598, 0x9598, 0x0F5C, 0x9599, 0x9599, 0x3BD2, 0x959B, 0x959B, 0x25F3, + 0x959C, 0x959C, 0x25F1, 0x959E, 0x959E, 0x25F2, 0x959F, 0x959F, 0x25F0, + 0x95A0, 0x95A0, 0x38A4, 0x95A1, 0x95A1, 0x10DF, 0x95A2, 0x95A2, 0x47AD, + 0x95A3, 0x95A3, 0x10E2, 0x95A4, 0x95A4, 0x10E4, 0x95A5, 0x95A5, 0x10E3, + 0x95A6, 0x95A6, 0x38A2, 0x95A7, 0x95A7, 0x3BD3, 0x95A8, 0x95A9, 0x10E0, + 0x95AA, 0x95AA, 0x4395, 0x95AB, 0x95AB, 0x2AB3, 0x95AC, 0x95AC, 0x2AB2, + 0x95AD, 0x95AD, 0x1260, 0x95AE, 0x95AE, 0x2AB4, 0x95B0, 0x95B0, 0x2AB5, + 0x95B1, 0x95B1, 0x1261, 0x95B5, 0x95B5, 0x2CF0, 0x95B6, 0x95B6, 0x2CEE, + 0x95B7, 0x95B7, 0x2EAD, 0x95B9, 0x95BA, 0x2CEC, 0x95BB, 0x95BB, 0x1385, + 0x95BC, 0x95BC, 0x2CE9, 0x95BD, 0x95BD, 0x2CF1, 0x95BE, 0x95BE, 0x2CEB, + 0x95BF, 0x95BF, 0x2CEF, 0x95C0, 0x95C0, 0x2EA9, 0x95C3, 0x95C3, 0x2EAB, + 0x95C5, 0x95C5, 0x2EAC, 0x95C6, 0x95C6, 0x14AE, 0x95C7, 0x95C7, 0x2EA8, + 0x95C8, 0x95C8, 0x14AD, 0x95C9, 0x95C9, 0x2EAA, 0x95CA, 0x95CC, 0x14AA, + 0x95CD, 0x95CD, 0x2CEA, 0x95D0, 0x95D0, 0x154C, 0x95D1, 0x95D1, 0x301F, + 0x95D2, 0x95D3, 0x301D, 0x95D4, 0x95D4, 0x154A, 0x95D5, 0x95D5, 0x154D, + 0x95D6, 0x95D6, 0x154B, 0x95DA, 0x95DB, 0x3163, 0x95DC, 0x95DC, 0x15EB, + 0x95DE, 0x95DE, 0x326C, 0x95DF, 0x95DF, 0x326E, 0x95E0, 0x95E0, 0x326D, + 0x95E1, 0x95E1, 0x1655, 0x95E2, 0x95E2, 0x16A0, 0x95E3, 0x95E3, 0x3330, + 0x95E4, 0x95E4, 0x332F, 0x95E5, 0x95E5, 0x332E, 0x95E8, 0x95E8, 0x450A, + 0x95F4, 0x95F4, 0x47AF, 0x961C, 0x961C, 0x0699, 0x961D, 0x961D, 0x4519, + 0x961E, 0x961E, 0x17B4, 0x9620, 0x9620, 0x1821, 0x9621, 0x9621, 0x0414, + 0x9622, 0x9622, 0x181F, 0x9623, 0x9623, 0x1822, 0x9624, 0x9624, 0x1820, + 0x9628, 0x9628, 0x18F1, 0x962A, 0x962A, 0x0526, 0x962C, 0x962C, 0x0527, + 0x962D, 0x962D, 0x18F3, 0x962E, 0x962E, 0x0524, 0x962F, 0x962F, 0x18F2, + 0x9630, 0x9630, 0x18F0, 0x9631, 0x9631, 0x0525, 0x9632, 0x9632, 0x0523, + 0x9633, 0x9633, 0x47B0, 0x9638, 0x9638, 0x3FD1, 0x9639, 0x9639, 0x1A55, + 0x963A, 0x963A, 0x1A58, 0x963B, 0x963B, 0x069C, 0x963C, 0x963C, 0x1A57, + 0x963D, 0x963D, 0x1A56, 0x963F, 0x963F, 0x069B, 0x9640, 0x9640, 0x069A, + 0x9641, 0x9641, 0x3F3D, 0x9642, 0x9642, 0x069E, 0x9643, 0x9643, 0x1A59, + 0x9644, 0x9644, 0x069D, 0x9645, 0x9645, 0x4772, 0x964A, 0x964A, 0x1C1A, + 0x964B, 0x964D, 0x0823, 0x964E, 0x964E, 0x1C1B, 0x964F, 0x964F, 0x1C17, + 0x9650, 0x9650, 0x0822, 0x9651, 0x9651, 0x1C18, 0x9653, 0x9653, 0x1C19, + 0x9654, 0x9654, 0x1C16, 0x9656, 0x9656, 0x3DE7, 0x9658, 0x9658, 0x09F1, + 0x965B, 0x965B, 0x09EE, 0x965C, 0x965C, 0x1E2F, 0x965D, 0x965D, 0x09EF, + 0x965E, 0x965E, 0x09F2, 0x965F, 0x965F, 0x1E30, 0x9661, 0x9661, 0x09ED, + 0x9662, 0x9663, 0x09EB, 0x9664, 0x9664, 0x09F0, 0x9669, 0x9669, 0x475E, + 0x966A, 0x966A, 0x0BD1, 0x966B, 0x966B, 0x20A6, 0x966C, 0x966C, 0x0BD9, + 0x966D, 0x966D, 0x20A5, 0x966F, 0x966F, 0x20A8, 0x9670, 0x9670, 0x0BD5, + 0x9671, 0x9671, 0x20A7, 0x9672, 0x9672, 0x0DA6, 0x9673, 0x9673, 0x0BD3, + 0x9674, 0x9674, 0x0BD6, 0x9675, 0x9675, 0x0BD2, 0x9676, 0x9677, 0x0BD7, + 0x9678, 0x9678, 0x0BD4, 0x967B, 0x967B, 0x38AC, 0x967C, 0x967C, 0x20A4, + 0x967D, 0x967D, 0x0DA2, 0x967E, 0x967E, 0x234F, 0x9680, 0x9680, 0x2353, + 0x9681, 0x9681, 0x3F46, 0x9683, 0x9683, 0x2352, 0x9684, 0x9684, 0x0DA7, + 0x9685, 0x9686, 0x0DA3, 0x9687, 0x9687, 0x234E, 0x9688, 0x9689, 0x2350, + 0x968A, 0x968A, 0x0D9F, 0x968B, 0x968B, 0x0DA1, 0x968D, 0x968D, 0x0DA5, + 0x968E, 0x968E, 0x0DA0, 0x968F, 0x968F, 0x3BDE, 0x9691, 0x9691, 0x25F6, + 0x9692, 0x9693, 0x25F4, 0x9694, 0x9695, 0x0F5E, 0x9696, 0x9696, 0x38AD, + 0x9697, 0x9697, 0x25F7, 0x9698, 0x9698, 0x0F5D, 0x9699, 0x9699, 0x10E5, + 0x969B, 0x969B, 0x10E7, 0x969C, 0x969C, 0x10E6, 0x969E, 0x969E, 0x2852, + 0x96A1, 0x96A1, 0x2853, 0x96A2, 0x96A2, 0x2AB7, 0x96A3, 0x96A3, 0x38AF, + 0x96A4, 0x96A4, 0x2AB6, 0x96A5, 0x96A5, 0x42EF, 0x96A7, 0x96A8, 0x1386, + 0x96A9, 0x96A9, 0x2CF2, 0x96AA, 0x96AA, 0x1388, 0x96AC, 0x96AC, 0x2EB0, + 0x96AE, 0x96AE, 0x2EAE, 0x96B0, 0x96B0, 0x2EAF, 0x96B1, 0x96B1, 0x14AF, + 0x96B3, 0x96B3, 0x3020, 0x96B4, 0x96B4, 0x15EC, 0x96B6, 0x96B6, 0x0231, + 0x96B8, 0x96B8, 0x14B0, 0x96B9, 0x96B9, 0x069F, 0x96BB, 0x96BB, 0x09F3, + 0x96BC, 0x96BC, 0x1E31, 0x96BD, 0x96BD, 0x38B5, 0x96BF, 0x96BF, 0x20A9, + 0x96C0, 0x96C0, 0x0BDA, 0x96C1, 0x96C1, 0x0DA8, 0x96C2, 0x96C2, 0x2354, + 0x96C3, 0x96C3, 0x2356, 0x96C4, 0x96C4, 0x0DAA, 0x96C5, 0x96C5, 0x0DA9, + 0x96C6, 0x96C7, 0x0DAB, 0x96C8, 0x96C8, 0x2355, 0x96C9, 0x96CA, 0x0F62, + 0x96CB, 0x96CB, 0x0F61, 0x96CC, 0x96CC, 0x10E8, 0x96CD, 0x96CD, 0x0F60, + 0x96CE, 0x96CE, 0x25F8, 0x96D2, 0x96D2, 0x10E9, 0x96D3, 0x96D3, 0x2AB8, + 0x96D4, 0x96D4, 0x2CF3, 0x96D5, 0x96D5, 0x1389, 0x96D6, 0x96D6, 0x14B1, + 0x96D7, 0x96D7, 0x3021, 0x96D8, 0x96D8, 0x3025, 0x96D9, 0x96D9, 0x1550, + 0x96DA, 0x96DA, 0x3022, 0x96DB, 0x96DB, 0x1551, 0x96DC, 0x96DC, 0x154F, + 0x96DD, 0x96DD, 0x3026, 0x96DE, 0x96DE, 0x1552, 0x96DF, 0x96DF, 0x3024, + 0x96E1, 0x96E1, 0x3165, 0x96E2, 0x96E2, 0x154E, 0x96E3, 0x96E3, 0x15ED, + 0x96E5, 0x96E5, 0x34A8, 0x96E8, 0x96E8, 0x06A0, 0x96E9, 0x96E9, 0x0BDC, + 0x96EA, 0x96EA, 0x0BDB, 0x96EF, 0x96EF, 0x0DAD, 0x96F0, 0x96F0, 0x2358, + 0x96F1, 0x96F1, 0x2357, 0x96F2, 0x96F2, 0x0DAE, 0x96F4, 0x96F4, 0x3A04, + 0x96F5, 0x96F5, 0x25FC, 0x96F6, 0x96F6, 0x0F67, 0x96F7, 0x96F7, 0x0F64, + 0x96F8, 0x96F8, 0x25FB, 0x96F9, 0x96F9, 0x0F66, 0x96FA, 0x96FA, 0x25F9, + 0x96FB, 0x96FB, 0x0F65, 0x96FD, 0x96FD, 0x25FA, 0x96FF, 0x96FF, 0x2854, + 0x9700, 0x9700, 0x10EA, 0x9702, 0x9702, 0x2ABB, 0x9703, 0x9703, 0x3F0D, + 0x9704, 0x9704, 0x1262, 0x9705, 0x9705, 0x2AB9, 0x9706, 0x9707, 0x1263, + 0x9708, 0x9708, 0x2ABA, 0x9709, 0x9709, 0x1265, 0x970B, 0x970B, 0x2CF4, + 0x970D, 0x970D, 0x138D, 0x970E, 0x970E, 0x138A, 0x970F, 0x970F, 0x138F, + 0x9710, 0x9710, 0x2CF6, 0x9711, 0x9711, 0x138B, 0x9712, 0x9712, 0x2CF5, + 0x9713, 0x9713, 0x138E, 0x9716, 0x9716, 0x138C, 0x9718, 0x9718, 0x2EB3, + 0x9719, 0x9719, 0x2EB5, 0x971B, 0x971B, 0x38C9, 0x971C, 0x971C, 0x14B2, + 0x971D, 0x971D, 0x2EB4, 0x971E, 0x971E, 0x14B3, 0x971F, 0x971F, 0x2EB2, + 0x9720, 0x9720, 0x2EB1, 0x9721, 0x9721, 0x3FB3, 0x9722, 0x9722, 0x3028, + 0x9723, 0x9723, 0x3027, 0x9724, 0x9724, 0x1553, 0x9725, 0x9725, 0x3029, + 0x9726, 0x9726, 0x316A, 0x9727, 0x9727, 0x15EF, 0x9728, 0x9728, 0x3169, + 0x9729, 0x9729, 0x3166, 0x972A, 0x972A, 0x15EE, 0x972B, 0x972C, 0x3167, + 0x972E, 0x972F, 0x326F, 0x9730, 0x9730, 0x1656, 0x9731, 0x9731, 0x38C0, + 0x9732, 0x9732, 0x16A3, 0x9735, 0x9735, 0x3331, 0x9736, 0x9736, 0x38C2, + 0x9738, 0x9739, 0x16A1, 0x973A, 0x973A, 0x3332, 0x973D, 0x973E, 0x16E2, + 0x973F, 0x973F, 0x33D1, 0x9740, 0x9740, 0x47B3, 0x9741, 0x9741, 0x3BE9, + 0x9742, 0x9742, 0x1732, 0x9743, 0x9743, 0x34AA, 0x9744, 0x9744, 0x1734, + 0x9746, 0x9746, 0x34A9, 0x9747, 0x9747, 0x34AB, 0x9748, 0x9748, 0x1733, + 0x9749, 0x9749, 0x34F1, 0x974B, 0x974B, 0x3526, 0x9751, 0x9751, 0x44E3, + 0x9752, 0x9752, 0x06A1, 0x9756, 0x9756, 0x0F68, 0x9757, 0x9757, 0x38CC, + 0x9758, 0x9758, 0x2855, 0x975A, 0x975A, 0x2ABC, 0x975B, 0x975C, 0x1390, + 0x975D, 0x975D, 0x3BEF, 0x975E, 0x975E, 0x06A2, 0x975F, 0x975F, 0x38CF, + 0x9760, 0x9760, 0x1266, 0x9761, 0x9761, 0x15F0, 0x9762, 0x9762, 0x0826, + 0x9766, 0x9766, 0x1392, 0x9768, 0x9768, 0x1710, 0x9769, 0x9769, 0x0827, + 0x976A, 0x976A, 0x20AA, 0x976C, 0x976C, 0x2359, 0x976D, 0x976D, 0x3E97, + 0x976E, 0x976E, 0x235B, 0x9770, 0x9770, 0x235A, 0x9771, 0x9771, 0x3BFC, + 0x9772, 0x9772, 0x2600, 0x9773, 0x9773, 0x25FD, 0x9774, 0x9774, 0x0F69, + 0x9776, 0x9776, 0x0F6A, 0x9777, 0x9778, 0x25FE, 0x977A, 0x977A, 0x2857, + 0x977B, 0x977B, 0x285C, 0x977C, 0x977C, 0x10EB, 0x977D, 0x977D, 0x2856, + 0x977E, 0x977E, 0x2858, 0x977F, 0x977F, 0x285F, 0x9780, 0x9780, 0x285A, + 0x9781, 0x9781, 0x285E, 0x9782, 0x9782, 0x285B, 0x9783, 0x9783, 0x2859, + 0x9784, 0x9784, 0x285D, 0x9785, 0x9785, 0x10EC, 0x9787, 0x9787, 0x40C0, + 0x9788, 0x9788, 0x2ABF, 0x9789, 0x9789, 0x38D4, 0x978A, 0x978A, 0x2ABD, + 0x978B, 0x978B, 0x1268, 0x978D, 0x978D, 0x1267, 0x978E, 0x978E, 0x2ABE, + 0x978F, 0x978F, 0x1269, 0x9794, 0x9794, 0x2CF9, 0x9797, 0x9797, 0x2CF8, + 0x9798, 0x9798, 0x1393, 0x9799, 0x9799, 0x2CF7, 0x979A, 0x979A, 0x2EB6, + 0x979B, 0x979B, 0x3BFB, 0x979C, 0x979C, 0x2EB8, 0x979D, 0x979D, 0x2EBA, + 0x979E, 0x979E, 0x2EB9, 0x979F, 0x979F, 0x38D5, 0x97A0, 0x97A0, 0x14B4, + 0x97A1, 0x97A1, 0x2EB7, 0x97A2, 0x97A2, 0x3030, 0x97A3, 0x97A3, 0x1554, + 0x97A4, 0x97A4, 0x302E, 0x97A5, 0x97A5, 0x3031, 0x97A6, 0x97A6, 0x1555, + 0x97A8, 0x97A8, 0x302C, 0x97AA, 0x97AA, 0x302F, 0x97AB, 0x97AB, 0x302D, + 0x97AC, 0x97AC, 0x302A, 0x97AD, 0x97AD, 0x1556, 0x97AE, 0x97AE, 0x302B, + 0x97B1, 0x97B1, 0x38D6, 0x97B2, 0x97B2, 0x47B5, 0x97B3, 0x97B3, 0x316B, + 0x97B4, 0x97B4, 0x3F33, 0x97B6, 0x97B6, 0x316D, 0x97B7, 0x97B7, 0x316C, + 0x97B8, 0x97B8, 0x3D95, 0x97B9, 0x97B9, 0x3271, 0x97BA, 0x97BA, 0x3F35, + 0x97BB, 0x97BB, 0x3272, 0x97BD, 0x97BD, 0x494E, 0x97BE, 0x97BE, 0x38D7, + 0x97BF, 0x97BF, 0x3333, 0x97C0, 0x97C0, 0x38D8, 0x97C1, 0x97C1, 0x16E5, + 0x97C2, 0x97C2, 0x47B6, 0x97C3, 0x97C3, 0x16E4, 0x97C4, 0x97C5, 0x344C, + 0x97C6, 0x97C6, 0x1735, 0x97C7, 0x97C7, 0x34AC, 0x97C8, 0x97C8, 0x3F2F, + 0x97C9, 0x97C9, 0x1756, 0x97CB, 0x97CB, 0x0828, 0x97CC, 0x97CC, 0x0DAF, + 0x97CD, 0x97CD, 0x2861, 0x97CE, 0x97CE, 0x2860, 0x97CF, 0x97CF, 0x2AC1, + 0x97D0, 0x97D0, 0x2AC0, 0x97D2, 0x97D2, 0x38D9, 0x97D3, 0x97D3, 0x14B5, + 0x97D4, 0x97D4, 0x2EBC, 0x97D5, 0x97D5, 0x2EBB, 0x97D6, 0x97D6, 0x3034, + 0x97D7, 0x97D7, 0x3032, 0x97D8, 0x97D8, 0x3035, 0x97D9, 0x97D9, 0x3033, + 0x97DC, 0x97DC, 0x15F1, 0x97DD, 0x97DF, 0x316E, 0x97E0, 0x97E0, 0x38DA, + 0x97E1, 0x97E1, 0x3334, 0x97E3, 0x97E3, 0x33D2, 0x97E5, 0x97E5, 0x34AD, + 0x97E6, 0x97E6, 0x450C, 0x97ED, 0x97ED, 0x0829, 0x97EE, 0x97EE, 0x38DC, + 0x97F0, 0x97F0, 0x2CFA, 0x97F1, 0x97F1, 0x2EBD, 0x97F2, 0x97F2, 0x394D, + 0x97F3, 0x97F3, 0x082A, 0x97F5, 0x97F5, 0x38E0, 0x97F6, 0x97F6, 0x10ED, + 0x97F8, 0x97F8, 0x2CFB, 0x97F9, 0x97F9, 0x1557, 0x97FA, 0x97FA, 0x3036, + 0x97FB, 0x97FB, 0x15F2, 0x97FD, 0x97FE, 0x3273, 0x97FF, 0x97FF, 0x16A4, + 0x9800, 0x9800, 0x344E, 0x9801, 0x9801, 0x082B, 0x9802, 0x9803, 0x0BDF, + 0x9804, 0x9804, 0x20AB, 0x9805, 0x9806, 0x0DB0, 0x9807, 0x9807, 0x235C, + 0x9808, 0x9808, 0x0DB2, 0x980A, 0x980A, 0x0F6E, 0x980C, 0x980C, 0x0F70, + 0x980D, 0x980E, 0x2602, 0x980F, 0x980F, 0x2601, 0x9810, 0x9811, 0x0F6B, + 0x9812, 0x9812, 0x0F6F, 0x9813, 0x9813, 0x0F6D, 0x9814, 0x9814, 0x4952, + 0x9815, 0x9815, 0x433C, 0x9816, 0x9816, 0x2862, 0x9817, 0x9818, 0x10EE, + 0x981B, 0x981B, 0x2AC8, 0x981C, 0x981C, 0x126C, 0x981D, 0x981D, 0x2AC3, + 0x981E, 0x981E, 0x2AC2, 0x981F, 0x981F, 0x3C02, 0x9820, 0x9820, 0x2AC7, + 0x9821, 0x9821, 0x126A, 0x9823, 0x9823, 0x3E37, 0x9824, 0x9824, 0x139A, + 0x9826, 0x9826, 0x2AC4, 0x9827, 0x9827, 0x2AC9, 0x9828, 0x9828, 0x2AC6, + 0x9829, 0x9829, 0x2AC5, 0x982B, 0x982B, 0x126B, 0x982D, 0x982D, 0x1398, + 0x982E, 0x982E, 0x3F72, 0x982F, 0x982F, 0x2CFD, 0x9830, 0x9830, 0x1394, + 0x9832, 0x9832, 0x2CFE, 0x9833, 0x9833, 0x38E5, 0x9834, 0x9834, 0x38E4, + 0x9835, 0x9835, 0x2CFC, 0x9837, 0x9837, 0x1397, 0x9838, 0x9838, 0x1395, + 0x9839, 0x9839, 0x1399, 0x983B, 0x983B, 0x1396, 0x9841, 0x9841, 0x2EBE, + 0x9843, 0x9843, 0x2EC3, 0x9844, 0x9844, 0x2EBF, 0x9845, 0x9845, 0x2EC2, + 0x9846, 0x9846, 0x14B6, 0x9847, 0x9847, 0x3D96, 0x9848, 0x9848, 0x2DF2, + 0x9849, 0x9849, 0x2EC1, 0x984A, 0x984A, 0x2EC0, 0x984B, 0x984B, 0x38E6, + 0x984C, 0x984C, 0x155A, 0x984D, 0x984D, 0x1558, 0x984E, 0x984E, 0x155B, + 0x984F, 0x984F, 0x1559, 0x9850, 0x9852, 0x3037, 0x9853, 0x9853, 0x155C, + 0x9857, 0x9857, 0x3174, 0x9858, 0x9858, 0x15F4, 0x9859, 0x9859, 0x3172, + 0x985B, 0x985B, 0x15F5, 0x985C, 0x985C, 0x3171, 0x985D, 0x985D, 0x3173, + 0x985E, 0x985E, 0x15F3, 0x985F, 0x985F, 0x3278, 0x9860, 0x9860, 0x3275, + 0x9862, 0x9863, 0x3276, 0x9864, 0x9864, 0x3335, 0x9865, 0x9865, 0x16A6, + 0x9866, 0x9866, 0x38E7, 0x9867, 0x9867, 0x16A5, 0x9869, 0x9869, 0x33D4, + 0x986A, 0x986A, 0x33D3, 0x986B, 0x986B, 0x16E6, 0x986C, 0x986C, 0x4035, + 0x986F, 0x986F, 0x1711, 0x9870, 0x9870, 0x1736, 0x9871, 0x9871, 0x174D, + 0x9872, 0x9872, 0x34F2, 0x9873, 0x9874, 0x3527, 0x9875, 0x9875, 0x450D, + 0x98A8, 0x98A8, 0x082C, 0x98A9, 0x98A9, 0x235D, 0x98AC, 0x98AC, 0x2604, + 0x98AD, 0x98AE, 0x2863, 0x98AF, 0x98AF, 0x10F0, 0x98B1, 0x98B1, 0x10F1, + 0x98B2, 0x98B2, 0x2ACA, 0x98B3, 0x98B3, 0x126D, 0x98B4, 0x98B4, 0x3F73, + 0x98B6, 0x98B6, 0x14B7, 0x98B7, 0x98B7, 0x38EF, 0x98B8, 0x98B8, 0x303A, + 0x98B9, 0x98B9, 0x47B8, 0x98BA, 0x98BA, 0x155D, 0x98BB, 0x98BB, 0x3177, + 0x98BC, 0x98BC, 0x15F6, 0x98BD, 0x98BD, 0x3176, 0x98BE, 0x98BE, 0x3178, + 0x98BF, 0x98BF, 0x3175, 0x98C0, 0x98C0, 0x3338, 0x98C1, 0x98C2, 0x3279, + 0x98C3, 0x98C3, 0x3B78, 0x98C4, 0x98C4, 0x1657, 0x98C6, 0x98C6, 0x3337, + 0x98C7, 0x98C7, 0x38F1, 0x98C8, 0x98C8, 0x38F0, 0x98C9, 0x98C9, 0x3336, + 0x98CA, 0x98CA, 0x38EE, 0x98CB, 0x98CB, 0x33D5, 0x98CC, 0x98CC, 0x3529, + 0x98CE, 0x98CE, 0x450E, 0x98DB, 0x98DB, 0x082D, 0x98DC, 0x98DC, 0x3C0B, + 0x98DE, 0x98DE, 0x450F, 0x98DF, 0x98DF, 0x082E, 0x98E0, 0x98E0, 0x4792, + 0x98E1, 0x98E1, 0x38F6, 0x98E2, 0x98E2, 0x09F4, 0x98E3, 0x98E3, 0x1E32, + 0x98E5, 0x98E5, 0x20AC, 0x98E6, 0x98E6, 0x38F7, 0x98E7, 0x98E7, 0x0DB3, + 0x98E9, 0x98E9, 0x0DB6, 0x98EA, 0x98EA, 0x0DB4, 0x98EB, 0x98EB, 0x235E, + 0x98EC, 0x98EC, 0x38F8, 0x98ED, 0x98ED, 0x0DB8, 0x98EF, 0x98EF, 0x0DB5, + 0x98F1, 0x98F1, 0x47BA, 0x98F2, 0x98F2, 0x0DB7, 0x98F4, 0x98F4, 0x0F72, + 0x98F5, 0x98F5, 0x4365, 0x98F6, 0x98F6, 0x2605, 0x98F9, 0x98F9, 0x2606, + 0x98FA, 0x98FA, 0x2ACC, 0x98FC, 0x98FC, 0x0F71, 0x98FD, 0x98FE, 0x0F73, + 0x9900, 0x9900, 0x2866, 0x9902, 0x9902, 0x2865, 0x9903, 0x9903, 0x10F2, + 0x9905, 0x9905, 0x10F3, 0x9907, 0x9907, 0x2867, 0x9908, 0x9908, 0x2ACB, + 0x9909, 0x9909, 0x10F5, 0x990A, 0x990A, 0x126E, 0x990C, 0x990C, 0x10F4, + 0x990E, 0x990E, 0x43ED, 0x9910, 0x9910, 0x139B, 0x9911, 0x9911, 0x2ACD, + 0x9912, 0x9912, 0x1270, 0x9913, 0x9913, 0x126F, 0x9914, 0x9914, 0x2ACE, + 0x9915, 0x9915, 0x2AD1, 0x9916, 0x9917, 0x2ACF, 0x9918, 0x9918, 0x1271, + 0x9919, 0x9919, 0x47BC, 0x991A, 0x991A, 0x13A0, 0x991B, 0x991B, 0x139E, + 0x991C, 0x991C, 0x43EE, 0x991E, 0x991E, 0x139D, 0x991F, 0x991F, 0x2D00, + 0x9921, 0x9921, 0x139F, 0x9924, 0x9924, 0x2CFF, 0x9925, 0x9925, 0x2EC4, + 0x9927, 0x9927, 0x2D01, 0x9928, 0x9928, 0x139C, 0x9929, 0x9929, 0x2D02, + 0x992A, 0x992A, 0x2EC7, 0x992B, 0x992C, 0x2EC5, 0x992D, 0x992D, 0x2ECB, + 0x992E, 0x992E, 0x1561, 0x992F, 0x992F, 0x2ECA, 0x9930, 0x9930, 0x2ECD, + 0x9931, 0x9931, 0x2ECC, 0x9932, 0x9932, 0x2EC9, 0x9933, 0x9933, 0x2EC8, + 0x9935, 0x9935, 0x14B8, 0x9937, 0x9937, 0x47BD, 0x9938, 0x9938, 0x3BFD, + 0x9939, 0x9939, 0x38FA, 0x993A, 0x993A, 0x303D, 0x993B, 0x993B, 0x3C11, + 0x993C, 0x993C, 0x303C, 0x993D, 0x993D, 0x1560, 0x993E, 0x993F, 0x155E, + 0x9940, 0x9940, 0x3F34, 0x9941, 0x9941, 0x303B, 0x9942, 0x9942, 0x43FF, + 0x9943, 0x9943, 0x317B, 0x9945, 0x9945, 0x15F7, 0x9947, 0x9947, 0x317A, + 0x9948, 0x9948, 0x3179, 0x9949, 0x9949, 0x15F8, 0x994A, 0x994A, 0x3FB9, + 0x994B, 0x994B, 0x327F, 0x994C, 0x994C, 0x327E, 0x994D, 0x994D, 0x3C12, + 0x994E, 0x994E, 0x327C, 0x9950, 0x9950, 0x327B, 0x9951, 0x9951, 0x1659, + 0x9952, 0x9952, 0x1658, 0x9953, 0x9953, 0x3280, 0x9954, 0x9954, 0x33D6, + 0x9955, 0x9955, 0x16E7, 0x9956, 0x9956, 0x333A, 0x9957, 0x9957, 0x16A7, + 0x9958, 0x9958, 0x3339, 0x9959, 0x9959, 0x327D, 0x995B, 0x995B, 0x33D7, + 0x995C, 0x995C, 0x1712, 0x995D, 0x995D, 0x47BE, 0x995E, 0x995E, 0x174E, + 0x995F, 0x995F, 0x34F3, 0x9961, 0x9961, 0x352A, 0x9962, 0x9962, 0x43EF, + 0x9963, 0x9963, 0x4510, 0x9996, 0x9996, 0x082F, 0x9997, 0x9997, 0x20AD, + 0x9998, 0x9998, 0x2ECE, 0x9999, 0x9999, 0x0830, 0x999B, 0x999B, 0x3C15, + 0x999C, 0x999C, 0x2869, 0x999D, 0x999D, 0x2868, 0x999E, 0x999E, 0x2D03, + 0x99A1, 0x99A1, 0x2ED0, 0x99A3, 0x99A3, 0x2ECF, 0x99A4, 0x99A4, 0x41C3, + 0x99A5, 0x99A5, 0x1562, 0x99A6, 0x99A7, 0x317C, 0x99A8, 0x99A8, 0x165A, + 0x99AA, 0x99AA, 0x3C17, 0x99AB, 0x99AB, 0x352B, 0x99AC, 0x99AC, 0x09F5, + 0x99AD, 0x99AD, 0x0DBA, 0x99AE, 0x99AE, 0x0DB9, 0x99AF, 0x99AF, 0x2607, + 0x99B0, 0x99B0, 0x2609, 0x99B1, 0x99B1, 0x0F76, 0x99B2, 0x99B2, 0x2608, + 0x99B3, 0x99B3, 0x0F75, 0x99B4, 0x99B4, 0x0F77, 0x99B5, 0x99B5, 0x260A, + 0x99B8, 0x99B8, 0x394B, 0x99B9, 0x99B9, 0x286B, 0x99BA, 0x99BA, 0x286D, + 0x99BB, 0x99BB, 0x286C, 0x99BC, 0x99BC, 0x3C22, 0x99BD, 0x99BD, 0x286F, + 0x99C1, 0x99C1, 0x10F6, 0x99C2, 0x99C2, 0x286E, 0x99C3, 0x99C3, 0x286A, + 0x99C4, 0x99C4, 0x3D77, 0x99C5, 0x99C5, 0x47C1, 0x99C7, 0x99C7, 0x2870, + 0x99C9, 0x99C9, 0x2AD8, 0x99CB, 0x99CB, 0x2ADB, 0x99CC, 0x99CC, 0x2ADD, + 0x99CD, 0x99CD, 0x2AD3, 0x99CE, 0x99CE, 0x2AD7, 0x99CF, 0x99CF, 0x2AD4, + 0x99D0, 0x99D0, 0x1273, 0x99D1, 0x99D1, 0x1276, 0x99D2, 0x99D2, 0x1278, + 0x99D3, 0x99D4, 0x2AD5, 0x99D5, 0x99D5, 0x1277, 0x99D6, 0x99D6, 0x2AD9, + 0x99D7, 0x99D7, 0x2ADC, 0x99D8, 0x99D8, 0x2ADA, 0x99D9, 0x99D9, 0x1279, + 0x99DA, 0x99DA, 0x3F42, 0x99DB, 0x99DB, 0x1275, 0x99DC, 0x99DC, 0x2AD2, + 0x99DD, 0x99DD, 0x1272, 0x99DF, 0x99DF, 0x1274, 0x99E1, 0x99E1, 0x3785, + 0x99E2, 0x99E2, 0x13A2, 0x99E3, 0x99E3, 0x2D09, 0x99E4, 0x99E4, 0x2D07, + 0x99E5, 0x99E5, 0x2D06, 0x99E6, 0x99E6, 0x3B65, 0x99E7, 0x99E7, 0x2D0C, + 0x99E9, 0x99E9, 0x2D0B, 0x99EA, 0x99EA, 0x2D0A, 0x99EC, 0x99EC, 0x2D05, + 0x99ED, 0x99ED, 0x13A1, 0x99EE, 0x99EE, 0x2D04, 0x99F0, 0x99F0, 0x2D08, + 0x99F1, 0x99F1, 0x13A3, 0x99F4, 0x99F4, 0x2ED3, 0x99F5, 0x99F5, 0x38FF, + 0x99F6, 0x99F6, 0x2ED7, 0x99F7, 0x99F7, 0x2ED4, 0x99F8, 0x99F8, 0x2ED6, + 0x99F9, 0x99F9, 0x2ED5, 0x99FA, 0x99FA, 0x2ED2, 0x99FB, 0x99FB, 0x2ED8, + 0x99FC, 0x99FC, 0x2EDB, 0x99FD, 0x99FE, 0x2ED9, 0x99FF, 0x99FF, 0x14BA, + 0x9A01, 0x9A01, 0x14B9, 0x9A02, 0x9A02, 0x2ED1, 0x9A03, 0x9A03, 0x2EDC, + 0x9A04, 0x9A04, 0x3042, 0x9A05, 0x9A05, 0x3045, 0x9A06, 0x9A06, 0x3047, + 0x9A07, 0x9A07, 0x3046, 0x9A09, 0x9A09, 0x3040, 0x9A0A, 0x9A0A, 0x3044, + 0x9A0B, 0x9A0B, 0x303F, 0x9A0C, 0x9A0C, 0x3900, 0x9A0D, 0x9A0D, 0x3041, + 0x9A0E, 0x9A0E, 0x1563, 0x9A0F, 0x9A0F, 0x303E, 0x9A10, 0x9A10, 0x3902, + 0x9A11, 0x9A11, 0x3043, 0x9A14, 0x9A14, 0x318A, 0x9A15, 0x9A15, 0x317F, + 0x9A16, 0x9A16, 0x15F9, 0x9A19, 0x9A19, 0x15FA, 0x9A1A, 0x9A1A, 0x317E, + 0x9A1B, 0x9A1B, 0x3183, 0x9A1C, 0x9A1C, 0x3189, 0x9A1D, 0x9A1D, 0x3181, + 0x9A1E, 0x9A1E, 0x3188, 0x9A1F, 0x9A1F, 0x3B6C, 0x9A20, 0x9A20, 0x3185, + 0x9A21, 0x9A21, 0x3C1C, 0x9A22, 0x9A22, 0x3184, 0x9A23, 0x9A23, 0x3187, + 0x9A24, 0x9A24, 0x3182, 0x9A25, 0x9A25, 0x3180, 0x9A26, 0x9A26, 0x3DF2, + 0x9A27, 0x9A27, 0x3186, 0x9A29, 0x9A29, 0x3287, 0x9A2A, 0x9A2A, 0x3285, + 0x9A2B, 0x9A2B, 0x165B, 0x9A2C, 0x9A2C, 0x3284, 0x9A2D, 0x9A2D, 0x328A, + 0x9A2E, 0x9A2E, 0x3288, 0x9A2F, 0x9A2F, 0x3C1E, 0x9A30, 0x9A30, 0x165C, + 0x9A31, 0x9A31, 0x3283, 0x9A32, 0x9A32, 0x3281, 0x9A34, 0x9A34, 0x3282, + 0x9A35, 0x9A35, 0x165E, 0x9A36, 0x9A36, 0x3286, 0x9A37, 0x9A37, 0x165D, + 0x9A38, 0x9A38, 0x3289, 0x9A39, 0x9A39, 0x333B, 0x9A3A, 0x9A3A, 0x3341, + 0x9A3B, 0x9A3B, 0x3901, 0x9A3C, 0x9A3C, 0x47C3, 0x9A3D, 0x9A3D, 0x333C, + 0x9A3E, 0x9A3E, 0x16AB, 0x9A3F, 0x9A3F, 0x3342, 0x9A40, 0x9A40, 0x16AA, + 0x9A41, 0x9A41, 0x3340, 0x9A42, 0x9A42, 0x333F, 0x9A43, 0x9A43, 0x16A9, + 0x9A44, 0x9A44, 0x333E, 0x9A45, 0x9A45, 0x16A8, 0x9A46, 0x9A46, 0x333D, + 0x9A48, 0x9A48, 0x33DD, 0x9A49, 0x9A49, 0x33DF, 0x9A4A, 0x9A4A, 0x33DE, + 0x9A4C, 0x9A4C, 0x33DB, 0x9A4D, 0x9A4D, 0x16E9, 0x9A4E, 0x9A4E, 0x33D8, + 0x9A4F, 0x9A4F, 0x33DC, 0x9A50, 0x9A50, 0x33E1, 0x9A52, 0x9A52, 0x33E0, + 0x9A53, 0x9A54, 0x33D9, 0x9A55, 0x9A55, 0x16E8, 0x9A56, 0x9A56, 0x344F, + 0x9A57, 0x9A57, 0x1715, 0x9A58, 0x9A58, 0x3903, 0x9A59, 0x9A59, 0x3450, + 0x9A5A, 0x9A5B, 0x1713, 0x9A5C, 0x9A5C, 0x3C18, 0x9A5E, 0x9A5E, 0x34AE, + 0x9A5F, 0x9A5F, 0x1737, 0x9A60, 0x9A60, 0x3510, 0x9A62, 0x9A62, 0x1757, + 0x9A63, 0x9A63, 0x3B67, 0x9A64, 0x9A64, 0x352C, 0x9A65, 0x9A65, 0x1758, + 0x9A66, 0x9A67, 0x352D, 0x9A68, 0x9A68, 0x353C, 0x9A69, 0x9A69, 0x353B, + 0x9A6A, 0x9A6A, 0x1767, 0x9A6B, 0x9A6B, 0x3544, 0x9A6C, 0x9A6C, 0x4585, + 0x9A8F, 0x9A8F, 0x4586, 0x9AA8, 0x9AA8, 0x09F6, 0x9AAB, 0x9AAB, 0x260C, + 0x9AAD, 0x9AAD, 0x260B, 0x9AAF, 0x9AB0, 0x10F7, 0x9AB1, 0x9AB1, 0x2871, + 0x9AB2, 0x9AB2, 0x4332, 0x9AB3, 0x9AB3, 0x2ADE, 0x9AB4, 0x9AB4, 0x2D0F, + 0x9AB6, 0x9AB6, 0x43F0, 0x9AB7, 0x9AB7, 0x127A, 0x9AB8, 0x9AB8, 0x13A4, + 0x9AB9, 0x9AB9, 0x2D0D, 0x9ABA, 0x9ABA, 0x3F74, 0x9ABB, 0x9ABB, 0x2D10, + 0x9ABC, 0x9ABC, 0x13A5, 0x9ABD, 0x9ABD, 0x3D97, 0x9ABE, 0x9ABE, 0x2EDD, + 0x9ABF, 0x9ABF, 0x2D0E, 0x9AC0, 0x9AC0, 0x3048, 0x9AC1, 0x9AC1, 0x1564, + 0x9AC2, 0x9AC2, 0x318B, 0x9AC6, 0x9AC6, 0x328D, 0x9AC7, 0x9AC7, 0x328B, + 0x9ACA, 0x9ACA, 0x328C, 0x9ACD, 0x9ACD, 0x3343, 0x9ACF, 0x9ACF, 0x16AC, + 0x9AD0, 0x9AD0, 0x33E2, 0x9AD1, 0x9AD1, 0x1718, 0x9AD2, 0x9AD2, 0x16EA, + 0x9AD3, 0x9AD4, 0x1716, 0x9AD5, 0x9AD5, 0x34AF, 0x9AD6, 0x9AD6, 0x174F, + 0x9AD7, 0x9AD7, 0x3FAA, 0x9AD8, 0x9AD8, 0x09F7, 0x9ADC, 0x9ADC, 0x3049, + 0x9ADF, 0x9ADF, 0x1E33, 0x9AE0, 0x9AE0, 0x3908, 0x9AE1, 0x9AE1, 0x0F78, + 0x9AE2, 0x9AE2, 0x3909, 0x9AE3, 0x9AE3, 0x2872, 0x9AE6, 0x9AE6, 0x10F9, + 0x9AE7, 0x9AE7, 0x2873, 0x9AEB, 0x9AEB, 0x2AE0, 0x9AEC, 0x9AEC, 0x2ADF, + 0x9AED, 0x9AED, 0x13A7, 0x9AEE, 0x9AEF, 0x127B, 0x9AF1, 0x9AF1, 0x2AE3, + 0x9AF2, 0x9AF2, 0x2AE2, 0x9AF3, 0x9AF3, 0x2AE1, 0x9AF4, 0x9AF4, 0x390B, + 0x9AF6, 0x9AF6, 0x2D11, 0x9AF7, 0x9AF7, 0x2D14, 0x9AF9, 0x9AF9, 0x2D13, + 0x9AFA, 0x9AFA, 0x2D12, 0x9AFB, 0x9AFB, 0x13A6, 0x9AFC, 0x9AFC, 0x2EE1, + 0x9AFD, 0x9AFD, 0x2EDF, 0x9AFE, 0x9AFE, 0x2EDE, 0x9AFF, 0x9AFF, 0x3F17, + 0x9B01, 0x9B01, 0x2EE0, 0x9B02, 0x9B02, 0x3F12, 0x9B03, 0x9B03, 0x1565, + 0x9B04, 0x9B05, 0x304B, 0x9B06, 0x9B06, 0x1566, 0x9B08, 0x9B08, 0x304A, + 0x9B09, 0x9B09, 0x3F20, 0x9B0A, 0x9B0A, 0x318D, 0x9B0B, 0x9B0B, 0x318C, + 0x9B0C, 0x9B0C, 0x318F, 0x9B0D, 0x9B0D, 0x15FB, 0x9B0E, 0x9B0E, 0x318E, + 0x9B0F, 0x9B0F, 0x47C4, 0x9B10, 0x9B10, 0x328E, 0x9B11, 0x9B11, 0x3290, + 0x9B12, 0x9B12, 0x328F, 0x9B14, 0x9B14, 0x390D, 0x9B15, 0x9B15, 0x3344, + 0x9B16, 0x9B16, 0x3347, 0x9B17, 0x9B18, 0x3345, 0x9B19, 0x9B19, 0x33E3, + 0x9B1A, 0x9B1A, 0x16EB, 0x9B1E, 0x9B20, 0x3451, 0x9B22, 0x9B22, 0x1738, + 0x9B23, 0x9B23, 0x1750, 0x9B24, 0x9B24, 0x352F, 0x9B25, 0x9B25, 0x09F8, + 0x9B27, 0x9B27, 0x127D, 0x9B28, 0x9B28, 0x13A8, 0x9B29, 0x9B29, 0x304D, + 0x9B2A, 0x9B2A, 0x3F19, 0x9B2B, 0x9B2B, 0x33E4, 0x9B2D, 0x9B2D, 0x390E, + 0x9B2E, 0x9B2E, 0x3511, 0x9B2F, 0x9B2F, 0x1E34, 0x9B31, 0x9B31, 0x1768, + 0x9B32, 0x9B32, 0x09F9, 0x9B33, 0x9B33, 0x2D15, 0x9B34, 0x9B34, 0x3911, + 0x9B35, 0x9B35, 0x304E, 0x9B37, 0x9B37, 0x3190, 0x9B39, 0x9B39, 0x3F00, + 0x9B3A, 0x9B3A, 0x3348, 0x9B3B, 0x9B3B, 0x33E5, 0x9B3C, 0x9B3C, 0x09FA, + 0x9B3E, 0x9B3F, 0x2874, 0x9B40, 0x9B40, 0x3915, 0x9B41, 0x9B42, 0x10FA, + 0x9B43, 0x9B43, 0x2AE5, 0x9B44, 0x9B44, 0x127F, 0x9B45, 0x9B45, 0x127E, + 0x9B46, 0x9B46, 0x2AE4, 0x9B48, 0x9B48, 0x2EE2, 0x9B4A, 0x9B4A, 0x304F, + 0x9B4B, 0x9B4B, 0x3051, 0x9B4C, 0x9B4C, 0x3050, 0x9B4D, 0x9B4D, 0x1569, + 0x9B4E, 0x9B4E, 0x1568, 0x9B4F, 0x9B4F, 0x1567, 0x9B50, 0x9B50, 0x3914, + 0x9B51, 0x9B51, 0x16AE, 0x9B52, 0x9B52, 0x3349, 0x9B54, 0x9B54, 0x16AD, + 0x9B55, 0x9B55, 0x33E7, 0x9B56, 0x9B56, 0x33E6, 0x9B58, 0x9B58, 0x1739, + 0x9B59, 0x9B59, 0x34B0, 0x9B5A, 0x9B5A, 0x0BE1, 0x9B5B, 0x9B5B, 0x260D, + 0x9B5F, 0x9B5F, 0x2878, 0x9B60, 0x9B61, 0x2876, 0x9B64, 0x9B64, 0x2AEE, + 0x9B66, 0x9B66, 0x2AE9, 0x9B67, 0x9B67, 0x2AE6, 0x9B68, 0x9B68, 0x2AED, + 0x9B69, 0x9B69, 0x47C5, 0x9B6C, 0x9B6C, 0x2AEF, 0x9B6F, 0x9B6F, 0x1281, + 0x9B70, 0x9B70, 0x2AEC, 0x9B71, 0x9B71, 0x2AE8, 0x9B74, 0x9B74, 0x2AE7, + 0x9B75, 0x9B75, 0x2AEB, 0x9B76, 0x9B76, 0x2AEA, 0x9B77, 0x9B77, 0x1280, + 0x9B7A, 0x9B7A, 0x2D20, 0x9B7B, 0x9B7B, 0x2D1B, 0x9B7C, 0x9B7C, 0x2D19, + 0x9B7D, 0x9B7D, 0x2D22, 0x9B7E, 0x9B7E, 0x2D1A, 0x9B7F, 0x9B7F, 0x3C3B, + 0x9B80, 0x9B80, 0x2D16, 0x9B81, 0x9B81, 0x43F1, 0x9B82, 0x9B82, 0x2D1C, + 0x9B83, 0x9B83, 0x4219, 0x9B85, 0x9B85, 0x2D17, 0x9B86, 0x9B86, 0x2EEB, + 0x9B87, 0x9B87, 0x2D18, 0x9B88, 0x9B88, 0x2D23, 0x9B8B, 0x9B8B, 0x3EEE, + 0x9B8D, 0x9B8D, 0x4623, 0x9B8E, 0x9B8E, 0x3919, 0x9B8F, 0x9B8F, 0x3FAD, + 0x9B90, 0x9B90, 0x2D1F, 0x9B91, 0x9B91, 0x13A9, 0x9B92, 0x9B92, 0x2D1E, + 0x9B93, 0x9B93, 0x2D1D, 0x9B95, 0x9B95, 0x2D21, 0x9B97, 0x9B97, 0x3F71, + 0x9B9A, 0x9B9A, 0x2EE3, 0x9B9B, 0x9B9B, 0x2EE6, 0x9B9D, 0x9B9D, 0x3F56, + 0x9B9E, 0x9B9E, 0x2EE5, 0x9B9F, 0x9B9F, 0x3C3E, 0x9BA0, 0x9BA0, 0x2EED, + 0x9BA1, 0x9BA1, 0x2EE8, 0x9BA2, 0x9BA2, 0x2EEC, 0x9BA4, 0x9BA4, 0x2EEA, + 0x9BA5, 0x9BA5, 0x2EE9, 0x9BA6, 0x9BA6, 0x2EE7, 0x9BA8, 0x9BA8, 0x2EE4, + 0x9BAA, 0x9BAA, 0x14BD, 0x9BAB, 0x9BAB, 0x14BC, 0x9BAD, 0x9BAD, 0x14BE, + 0x9BAE, 0x9BAE, 0x14BB, 0x9BAF, 0x9BAF, 0x2EEE, 0x9BB0, 0x9BB0, 0x3FB4, + 0x9BB5, 0x9BB5, 0x3057, 0x9BB6, 0x9BB6, 0x305A, 0x9BB8, 0x9BB8, 0x3058, + 0x9BB9, 0x9BB9, 0x305C, 0x9BBD, 0x9BBD, 0x305D, 0x9BBF, 0x9BBF, 0x3055, + 0x9BC0, 0x9BC0, 0x156E, 0x9BC1, 0x9BC1, 0x3056, 0x9BC3, 0x9BC3, 0x3054, + 0x9BC4, 0x9BC4, 0x305B, 0x9BC6, 0x9BC6, 0x3053, 0x9BC7, 0x9BC7, 0x3052, + 0x9BC8, 0x9BC8, 0x156D, 0x9BC9, 0x9BC9, 0x156B, 0x9BCA, 0x9BCA, 0x156A, + 0x9BCF, 0x9BCF, 0x3C3C, 0x9BD3, 0x9BD3, 0x3059, 0x9BD4, 0x9BD4, 0x3199, + 0x9BD5, 0x9BD5, 0x319F, 0x9BD6, 0x9BD6, 0x15FE, 0x9BD7, 0x9BD7, 0x319A, + 0x9BD9, 0x9BD9, 0x319D, 0x9BDA, 0x9BDA, 0x31A1, 0x9BDB, 0x9BDB, 0x15FF, + 0x9BDC, 0x9BDC, 0x319C, 0x9BDD, 0x9BDD, 0x47C6, 0x9BDE, 0x9BDE, 0x3194, + 0x9BE0, 0x9BE0, 0x3193, 0x9BE1, 0x9BE1, 0x31A0, 0x9BE2, 0x9BE2, 0x3197, + 0x9BE4, 0x9BE4, 0x3195, 0x9BE5, 0x9BE5, 0x319E, 0x9BE6, 0x9BE6, 0x3196, + 0x9BE7, 0x9BE7, 0x15FD, 0x9BE8, 0x9BE8, 0x15FC, 0x9BE9, 0x9BE9, 0x3BC1, + 0x9BEA, 0x9BEB, 0x3191, 0x9BEC, 0x9BEC, 0x319B, 0x9BED, 0x9BED, 0x3ED7, + 0x9BF0, 0x9BF0, 0x3198, 0x9BF1, 0x9BF1, 0x47C7, 0x9BF4, 0x9BF4, 0x47C8, + 0x9BF7, 0x9BF7, 0x3293, 0x9BF8, 0x9BF8, 0x3296, 0x9BFD, 0x9BFD, 0x156C, + 0x9BFF, 0x9BFF, 0x391B, 0x9C02, 0x9C02, 0x391A, 0x9C05, 0x9C05, 0x3294, + 0x9C06, 0x9C06, 0x329A, 0x9C07, 0x9C07, 0x3298, 0x9C08, 0x9C08, 0x3292, + 0x9C09, 0x9C09, 0x329D, 0x9C0A, 0x9C0A, 0x3F3A, 0x9C0B, 0x9C0B, 0x3291, + 0x9C0C, 0x9C0C, 0x391C, 0x9C0D, 0x9C0D, 0x1660, 0x9C0E, 0x9C0E, 0x3299, + 0x9C10, 0x9C10, 0x3C3A, 0x9C12, 0x9C12, 0x3295, 0x9C13, 0x9C13, 0x165F, + 0x9C14, 0x9C14, 0x329C, 0x9C15, 0x9C15, 0x3F1E, 0x9C17, 0x9C17, 0x329B, + 0x9C1B, 0x9C1B, 0x491B, 0x9C1C, 0x9C1C, 0x334C, 0x9C1D, 0x9C1D, 0x334B, + 0x9C1F, 0x9C1F, 0x4622, 0x9C20, 0x9C20, 0x47CA, 0x9C21, 0x9C21, 0x3352, + 0x9C23, 0x9C23, 0x334E, 0x9C24, 0x9C24, 0x3351, 0x9C25, 0x9C25, 0x16B0, + 0x9C26, 0x9C26, 0x45E6, 0x9C28, 0x9C29, 0x334F, 0x9C2B, 0x9C2B, 0x334A, + 0x9C2C, 0x9C2C, 0x334D, 0x9C2D, 0x9C2D, 0x16AF, 0x9C2E, 0x9C2E, 0x3F22, + 0x9C2F, 0x9C2F, 0x3D87, 0x9C31, 0x9C31, 0x16ED, 0x9C32, 0x9C32, 0x33F2, + 0x9C33, 0x9C33, 0x33ED, 0x9C34, 0x9C34, 0x33F1, 0x9C35, 0x9C35, 0x3C39, + 0x9C36, 0x9C36, 0x33F4, 0x9C37, 0x9C37, 0x33F0, 0x9C39, 0x9C39, 0x33EC, + 0x9C3A, 0x9C3A, 0x3D7E, 0x9C3B, 0x9C3B, 0x16EF, 0x9C3C, 0x9C3C, 0x33EF, + 0x9C3D, 0x9C3D, 0x33F3, 0x9C3E, 0x9C3E, 0x16EE, 0x9C3F, 0x9C3F, 0x33EA, + 0x9C40, 0x9C40, 0x3297, 0x9C41, 0x9C41, 0x33EE, 0x9C44, 0x9C44, 0x33EB, + 0x9C45, 0x9C45, 0x3E71, 0x9C46, 0x9C46, 0x33E8, 0x9C48, 0x9C48, 0x33E9, + 0x9C49, 0x9C49, 0x16EC, 0x9C4A, 0x9C4A, 0x3457, 0x9C4B, 0x9C4B, 0x3459, + 0x9C4C, 0x9C4C, 0x345C, 0x9C4D, 0x9C4D, 0x3458, 0x9C4E, 0x9C4E, 0x345D, + 0x9C4F, 0x9C4F, 0x3C36, 0x9C50, 0x9C50, 0x3456, 0x9C52, 0x9C52, 0x3454, + 0x9C53, 0x9C53, 0x3C37, 0x9C54, 0x9C54, 0x1719, 0x9C55, 0x9C55, 0x345A, + 0x9C56, 0x9C56, 0x171B, 0x9C57, 0x9C57, 0x171A, 0x9C58, 0x9C58, 0x3455, + 0x9C59, 0x9C59, 0x345B, 0x9C5D, 0x9C5D, 0x3EBF, 0x9C5E, 0x9C5E, 0x34B5, + 0x9C5F, 0x9C5F, 0x173A, 0x9C60, 0x9C60, 0x34B6, 0x9C62, 0x9C62, 0x34B4, + 0x9C63, 0x9C63, 0x34B1, 0x9C66, 0x9C66, 0x34B3, 0x9C67, 0x9C67, 0x34B2, + 0x9C68, 0x9C68, 0x34F4, 0x9C6D, 0x9C6D, 0x34F6, 0x9C6E, 0x9C6E, 0x34F5, + 0x9C71, 0x9C71, 0x3514, 0x9C72, 0x9C72, 0x3EA1, 0x9C73, 0x9C73, 0x3513, + 0x9C74, 0x9C74, 0x3512, 0x9C75, 0x9C75, 0x3515, 0x9C77, 0x9C78, 0x1760, + 0x9C79, 0x9C79, 0x3541, 0x9C7A, 0x9C7A, 0x3545, 0x9C7B, 0x9C7B, 0x3C38, + 0x9C7C, 0x9C7C, 0x4512, 0x9CE5, 0x9CE5, 0x0BE2, 0x9CE6, 0x9CE6, 0x235F, + 0x9CE7, 0x9CE7, 0x2610, 0x9CE9, 0x9CE9, 0x0F79, 0x9CEA, 0x9CEA, 0x260E, + 0x9CED, 0x9CED, 0x260F, 0x9CF1, 0x9CF2, 0x2879, 0x9CF3, 0x9CF3, 0x10FE, + 0x9CF4, 0x9CF4, 0x10FC, 0x9CF5, 0x9CF5, 0x287B, 0x9CF6, 0x9CF6, 0x10FD, + 0x9CF7, 0x9CF7, 0x2AF4, 0x9CF9, 0x9CF9, 0x2AF7, 0x9CFA, 0x9CFA, 0x2AF1, + 0x9CFB, 0x9CFB, 0x2AF8, 0x9CFC, 0x9CFC, 0x2AF0, 0x9CFD, 0x9CFD, 0x2AF2, + 0x9CFF, 0x9CFF, 0x2AF3, 0x9D00, 0x9D00, 0x2AF6, 0x9D02, 0x9D02, 0x3F3B, + 0x9D03, 0x9D03, 0x1284, 0x9D04, 0x9D04, 0x2AFB, 0x9D05, 0x9D05, 0x2AFA, + 0x9D06, 0x9D06, 0x1282, 0x9D07, 0x9D07, 0x2AF5, 0x9D08, 0x9D08, 0x2AF9, + 0x9D09, 0x9D09, 0x1283, 0x9D0C, 0x9D0C, 0x3C46, 0x9D10, 0x9D10, 0x2D2D, + 0x9D12, 0x9D12, 0x13AE, 0x9D14, 0x9D14, 0x2D28, 0x9D15, 0x9D15, 0x13AA, + 0x9D16, 0x9D16, 0x3C7C, 0x9D17, 0x9D17, 0x2D25, 0x9D18, 0x9D18, 0x2D2B, + 0x9D19, 0x9D19, 0x2D2E, 0x9D1B, 0x9D1B, 0x13AF, 0x9D1D, 0x9D1D, 0x2D2A, + 0x9D1E, 0x9D1E, 0x2D27, 0x9D1F, 0x9D1F, 0x2D2F, 0x9D20, 0x9D20, 0x2D26, + 0x9D21, 0x9D21, 0x3C41, 0x9D22, 0x9D22, 0x2D2C, 0x9D23, 0x9D23, 0x13AB, + 0x9D25, 0x9D25, 0x2D24, 0x9D26, 0x9D26, 0x13AC, 0x9D28, 0x9D28, 0x13AD, + 0x9D29, 0x9D29, 0x2D29, 0x9D2D, 0x9D2D, 0x2F00, 0x9D2E, 0x9D2F, 0x2EF3, + 0x9D30, 0x9D30, 0x2EF7, 0x9D31, 0x9D31, 0x2EF5, 0x9D33, 0x9D33, 0x2EEF, + 0x9D34, 0x9D34, 0x404A, 0x9D36, 0x9D36, 0x2EF2, 0x9D37, 0x9D37, 0x2EFC, + 0x9D38, 0x9D38, 0x2EF6, 0x9D39, 0x9D39, 0x392E, 0x9D3B, 0x9D3B, 0x14BF, + 0x9D3D, 0x9D3D, 0x2EFE, 0x9D3E, 0x9D3E, 0x2EFB, 0x9D3F, 0x9D3F, 0x14C0, + 0x9D40, 0x9D40, 0x2EFD, 0x9D41, 0x9D41, 0x2EF0, 0x9D42, 0x9D43, 0x2EF9, + 0x9D44, 0x9D44, 0x3FAB, 0x9D45, 0x9D45, 0x2EF8, 0x9D49, 0x9D49, 0x47CD, + 0x9D4A, 0x9D4A, 0x3061, 0x9D4B, 0x9D4B, 0x3063, 0x9D4C, 0x9D4C, 0x3066, + 0x9D4E, 0x9D4E, 0x4539, 0x9D4F, 0x9D4F, 0x3060, 0x9D50, 0x9D50, 0x3ECA, + 0x9D51, 0x9D51, 0x156F, 0x9D52, 0x9D52, 0x3068, 0x9D53, 0x9D53, 0x305F, + 0x9D54, 0x9D54, 0x3069, 0x9D56, 0x9D56, 0x3065, 0x9D57, 0x9D57, 0x3067, + 0x9D58, 0x9D58, 0x306B, 0x9D59, 0x9D59, 0x3064, 0x9D5A, 0x9D5A, 0x306C, + 0x9D5B, 0x9D5B, 0x3062, 0x9D5C, 0x9D5C, 0x305E, 0x9D5D, 0x9D5D, 0x1570, + 0x9D5E, 0x9D5E, 0x3E6E, 0x9D5F, 0x9D5F, 0x306A, 0x9D60, 0x9D60, 0x1571, + 0x9D61, 0x9D61, 0x1601, 0x9D67, 0x9D67, 0x2EF1, 0x9D68, 0x9D68, 0x31BB, + 0x9D69, 0x9D69, 0x31B2, 0x9D6A, 0x9D6A, 0x1603, 0x9D6B, 0x9D6B, 0x31AE, + 0x9D6C, 0x9D6C, 0x1604, 0x9D6D, 0x9D6D, 0x3BAC, 0x9D6E, 0x9D6E, 0x433B, + 0x9D6F, 0x9D6F, 0x31B7, 0x9D70, 0x9D70, 0x31B1, 0x9D71, 0x9D71, 0x31A7, + 0x9D72, 0x9D72, 0x1602, 0x9D73, 0x9D73, 0x31B4, 0x9D74, 0x9D75, 0x31AF, + 0x9D77, 0x9D77, 0x31A2, 0x9D78, 0x9D78, 0x31A9, 0x9D79, 0x9D79, 0x31B8, + 0x9D7B, 0x9D7B, 0x31B5, 0x9D7C, 0x9D7C, 0x3EFE, 0x9D7D, 0x9D7D, 0x31AD, + 0x9D7E, 0x9D7E, 0x3925, 0x9D7F, 0x9D7F, 0x31B9, 0x9D80, 0x9D80, 0x31A8, + 0x9D81, 0x9D81, 0x31A3, 0x9D82, 0x9D82, 0x31B6, 0x9D83, 0x9D83, 0x3926, + 0x9D84, 0x9D84, 0x31A5, 0x9D85, 0x9D85, 0x31B3, 0x9D86, 0x9D86, 0x31AA, + 0x9D87, 0x9D87, 0x31BA, 0x9D88, 0x9D88, 0x31A6, 0x9D89, 0x9D89, 0x1600, + 0x9D8A, 0x9D8A, 0x31A4, 0x9D8B, 0x9D8C, 0x31AB, 0x9D90, 0x9D90, 0x32A4, + 0x9D92, 0x9D92, 0x32A2, 0x9D93, 0x9D93, 0x43F3, 0x9D94, 0x9D94, 0x32A7, + 0x9D96, 0x9D96, 0x32B3, 0x9D97, 0x9D97, 0x32AA, 0x9D98, 0x9D98, 0x32A3, + 0x9D99, 0x9D99, 0x329F, 0x9D9A, 0x9D9A, 0x32AC, 0x9D9B, 0x9D9B, 0x32A5, + 0x9D9C, 0x9D9C, 0x32A8, 0x9D9D, 0x9D9D, 0x32A1, 0x9D9E, 0x9D9E, 0x32AF, + 0x9D9F, 0x9D9F, 0x329E, 0x9DA0, 0x9DA0, 0x32A6, 0x9DA1, 0x9DA1, 0x32AB, + 0x9DA2, 0x9DA2, 0x32AD, 0x9DA3, 0x9DA3, 0x32B0, 0x9DA4, 0x9DA4, 0x32A0, + 0x9DA5, 0x9DA5, 0x3C4B, 0x9DA6, 0x9DA7, 0x32B4, 0x9DA8, 0x9DA8, 0x32AE, + 0x9DA9, 0x9DA9, 0x32B2, 0x9DAA, 0x9DAA, 0x32A9, 0x9DAB, 0x9DAB, 0x3F30, + 0x9DAC, 0x9DAC, 0x3362, 0x9DAD, 0x9DAD, 0x3365, 0x9DAF, 0x9DAF, 0x16B1, + 0x9DB1, 0x9DB1, 0x3364, 0x9DB2, 0x9DB2, 0x3369, 0x9DB3, 0x9DB3, 0x3367, + 0x9DB4, 0x9DB4, 0x16B2, 0x9DB5, 0x9DB5, 0x335E, 0x9DB6, 0x9DB6, 0x3354, + 0x9DB7, 0x9DB7, 0x3353, 0x9DB8, 0x9DB8, 0x16B4, 0x9DB9, 0x9DBA, 0x3360, + 0x9DBB, 0x9DBB, 0x335D, 0x9DBC, 0x9DBC, 0x3355, 0x9DBD, 0x9DBD, 0x47D0, + 0x9DBE, 0x9DBE, 0x335A, 0x9DBF, 0x9DBF, 0x32B1, 0x9DC0, 0x9DC0, 0x43F2, + 0x9DC1, 0x9DC1, 0x3356, 0x9DC2, 0x9DC2, 0x16B3, 0x9DC3, 0x9DC3, 0x335C, + 0x9DC4, 0x9DC4, 0x3929, 0x9DC5, 0x9DC5, 0x335B, 0x9DC7, 0x9DC7, 0x3357, + 0x9DC8, 0x9DC8, 0x3363, 0x9DC9, 0x9DC9, 0x4579, 0x9DCA, 0x9DCA, 0x3358, + 0x9DCB, 0x9DCB, 0x33F9, 0x9DCC, 0x9DCC, 0x3366, 0x9DCD, 0x9DCD, 0x3368, + 0x9DCE, 0x9DCE, 0x335F, 0x9DCF, 0x9DCF, 0x3359, 0x9DD0, 0x9DD0, 0x33FA, + 0x9DD1, 0x9DD1, 0x33FC, 0x9DD2, 0x9DD2, 0x33F6, 0x9DD3, 0x9DD3, 0x16F0, + 0x9DD4, 0x9DD4, 0x391E, 0x9DD5, 0x9DD5, 0x3403, 0x9DD6, 0x9DD6, 0x3401, + 0x9DD7, 0x9DD7, 0x16F1, 0x9DD8, 0x9DD8, 0x3400, 0x9DD9, 0x9DD9, 0x33FF, + 0x9DDA, 0x9DDA, 0x33F8, 0x9DDB, 0x9DDB, 0x33F5, 0x9DDC, 0x9DDC, 0x33FB, + 0x9DDD, 0x9DDD, 0x3404, 0x9DDE, 0x9DDE, 0x33F7, 0x9DDF, 0x9DDF, 0x33FD, + 0x9DE1, 0x9DE1, 0x3466, 0x9DE2, 0x9DE2, 0x346B, 0x9DE3, 0x9DE3, 0x3461, + 0x9DE4, 0x9DE4, 0x3464, 0x9DE5, 0x9DE5, 0x171C, 0x9DE6, 0x9DE6, 0x3468, + 0x9DE8, 0x9DE8, 0x346F, 0x9DE9, 0x9DE9, 0x33FE, 0x9DEB, 0x9DEB, 0x3462, + 0x9DEC, 0x9DEC, 0x346C, 0x9DED, 0x9DED, 0x3470, 0x9DEE, 0x9DEE, 0x3467, + 0x9DEF, 0x9DEF, 0x3460, 0x9DF0, 0x9DF0, 0x346A, 0x9DF2, 0x9DF2, 0x3469, + 0x9DF3, 0x9DF3, 0x346E, 0x9DF4, 0x9DF4, 0x346D, 0x9DF5, 0x9DF5, 0x3402, + 0x9DF6, 0x9DF6, 0x3465, 0x9DF7, 0x9DF7, 0x345F, 0x9DF8, 0x9DF8, 0x3463, + 0x9DF9, 0x9DFA, 0x173B, 0x9DFB, 0x9DFB, 0x345E, 0x9DFC, 0x9DFC, 0x47D1, + 0x9DFD, 0x9DFD, 0x34C1, 0x9DFE, 0x9DFE, 0x34B8, 0x9DFF, 0x9DFF, 0x34C0, + 0x9E00, 0x9E01, 0x34BD, 0x9E02, 0x9E02, 0x34B7, 0x9E03, 0x9E03, 0x34BA, + 0x9E04, 0x9E04, 0x34C2, 0x9E05, 0x9E05, 0x34BC, 0x9E06, 0x9E06, 0x34BB, + 0x9E07, 0x9E07, 0x34B9, 0x9E09, 0x9E09, 0x34BF, 0x9E0A, 0x9E0A, 0x457E, + 0x9E0B, 0x9E0B, 0x34F7, 0x9E0C, 0x9E0C, 0x457A, 0x9E0D, 0x9E0D, 0x34F8, + 0x9E0E, 0x9E0E, 0x3928, 0x9E0F, 0x9E0F, 0x34FA, 0x9E10, 0x9E10, 0x34F9, + 0x9E11, 0x9E11, 0x34FC, 0x9E12, 0x9E12, 0x34FB, 0x9E13, 0x9E13, 0x3517, + 0x9E14, 0x9E14, 0x3516, 0x9E15, 0x9E15, 0x3530, 0x9E17, 0x9E17, 0x3531, + 0x9E18, 0x9E18, 0x3C44, 0x9E19, 0x9E19, 0x353D, 0x9E1A, 0x9E1A, 0x1765, + 0x9E1B, 0x9E1B, 0x1769, 0x9E1C, 0x9E1C, 0x3F84, 0x9E1D, 0x9E1D, 0x3546, + 0x9E1E, 0x9E1E, 0x176A, 0x9E1F, 0x9E1F, 0x4513, 0x9E75, 0x9E75, 0x0BE3, + 0x9E79, 0x9E79, 0x1661, 0x9E7A, 0x9E7A, 0x336A, 0x9E7B, 0x9E7B, 0x43F8, + 0x9E7C, 0x9E7D, 0x173D, 0x9E7F, 0x9E7F, 0x0BE4, 0x9E80, 0x9E80, 0x2611, + 0x9E81, 0x9E81, 0x3F0F, 0x9E82, 0x9E82, 0x0F7A, 0x9E83, 0x9E83, 0x2AFC, + 0x9E84, 0x9E84, 0x3F76, 0x9E85, 0x9E85, 0x3EF2, 0x9E86, 0x9E87, 0x2D31, + 0x9E88, 0x9E88, 0x2D30, 0x9E89, 0x9E89, 0x2F02, 0x9E8A, 0x9E8A, 0x2F01, + 0x9E8B, 0x9E8B, 0x14C1, 0x9E8C, 0x9E8C, 0x306E, 0x9E8D, 0x9E8D, 0x2F03, + 0x9E8E, 0x9E8E, 0x306D, 0x9E90, 0x9E90, 0x3931, 0x9E91, 0x9E91, 0x31BD, + 0x9E92, 0x9E92, 0x1605, 0x9E93, 0x9E93, 0x1607, 0x9E94, 0x9E94, 0x31BC, + 0x9E95, 0x9E95, 0x3932, 0x9E96, 0x9E96, 0x3FBC, 0x9E97, 0x9E97, 0x1606, + 0x9E98, 0x9E98, 0x3F27, 0x9E99, 0x9E99, 0x32B6, 0x9E9A, 0x9E9A, 0x32B8, + 0x9E9B, 0x9E9B, 0x32B7, 0x9E9C, 0x9E9C, 0x336B, 0x9E9D, 0x9E9D, 0x16B5, + 0x9E9E, 0x9E9E, 0x3933, 0x9E9F, 0x9E9F, 0x171D, 0x9EA0, 0x9EA0, 0x34C3, + 0x9EA1, 0x9EA1, 0x34FD, 0x9EA2, 0x9EA2, 0x3934, 0x9EA4, 0x9EA4, 0x354A, + 0x9EA5, 0x9EA5, 0x0BE5, 0x9EA6, 0x9EA6, 0x4944, 0x9EA7, 0x9EA7, 0x287C, + 0x9EA8, 0x9EA8, 0x3F75, 0x9EA9, 0x9EA9, 0x1285, 0x9EAA, 0x9EAA, 0x3936, + 0x9EAB, 0x9EAB, 0x3E92, 0x9EAC, 0x9EAC, 0x43F4, 0x9EAD, 0x9EAD, 0x2D34, + 0x9EAE, 0x9EAE, 0x2D33, 0x9EAF, 0x9EAF, 0x3937, 0x9EB0, 0x9EB0, 0x2F04, + 0x9EB1, 0x9EB1, 0x47D4, 0x9EB4, 0x9EB4, 0x1608, 0x9EB5, 0x9EB5, 0x1662, + 0x9EB6, 0x9EB6, 0x3405, 0x9EB7, 0x9EB7, 0x3542, 0x9EBB, 0x9EBB, 0x0BE6, + 0x9EBC, 0x9EBC, 0x10FF, 0x9EBD, 0x9EBD, 0x47D5, 0x9EBE, 0x9EBE, 0x1286, + 0x9EBF, 0x9EBF, 0x3D78, 0x9EC0, 0x9EC0, 0x31BE, 0x9EC1, 0x9EC1, 0x3939, + 0x9EC2, 0x9EC2, 0x3471, 0x9EC3, 0x9EC3, 0x0DBB, 0x9EC4, 0x9EC4, 0x4514, + 0x9EC6, 0x9EC6, 0x47D6, 0x9EC7, 0x9EC7, 0x4577, 0x9EC8, 0x9EC8, 0x2F05, + 0x9ECC, 0x9ECC, 0x1751, 0x9ECD, 0x9ECD, 0x0DBC, 0x9ECE, 0x9ECE, 0x1287, + 0x9ECF, 0x9ECF, 0x14C2, 0x9ED0, 0x9ED0, 0x3472, 0x9ED1, 0x9ED1, 0x0DBD, + 0x9ED3, 0x9ED3, 0x2AFD, 0x9ED4, 0x9ED4, 0x13B1, 0x9ED5, 0x9ED6, 0x2D35, + 0x9ED8, 0x9ED8, 0x13B0, 0x9EDA, 0x9EDA, 0x2F06, 0x9EDB, 0x9EDB, 0x14C6, + 0x9EDC, 0x9EDD, 0x14C4, 0x9EDE, 0x9EDE, 0x14C3, 0x9EDF, 0x9EDF, 0x306F, + 0x9EE0, 0x9EE0, 0x1572, 0x9EE2, 0x9EE2, 0x47D8, 0x9EE4, 0x9EE4, 0x32BA, + 0x9EE5, 0x9EE5, 0x32B9, 0x9EE6, 0x9EE6, 0x32BC, 0x9EE7, 0x9EE7, 0x32BB, + 0x9EE8, 0x9EE8, 0x1663, 0x9EEB, 0x9EEB, 0x336C, 0x9EED, 0x9EED, 0x336E, + 0x9EEE, 0x9EEE, 0x336D, 0x9EEF, 0x9EEF, 0x16B6, 0x9EF0, 0x9EF0, 0x3406, + 0x9EF1, 0x9EF1, 0x47D9, 0x9EF2, 0x9EF3, 0x3473, 0x9EF4, 0x9EF4, 0x171E, + 0x9EF5, 0x9EF5, 0x34FE, 0x9EF6, 0x9EF6, 0x3518, 0x9EF7, 0x9EF7, 0x1762, + 0x9EF8, 0x9EF8, 0x47DA, 0x9EF9, 0x9EF9, 0x2360, 0x9EFA, 0x9EFA, 0x2D37, + 0x9EFB, 0x9EFB, 0x2F07, 0x9EFC, 0x9EFC, 0x31BF, 0x9EFD, 0x9EFD, 0x2612, + 0x9EFE, 0x9EFE, 0x47CE, 0x9EFF, 0x9EFF, 0x2F08, 0x9F00, 0x9F00, 0x3071, + 0x9F01, 0x9F01, 0x3070, 0x9F02, 0x9F02, 0x3940, 0x9F06, 0x9F06, 0x3475, + 0x9F07, 0x9F07, 0x173F, 0x9F08, 0x9F08, 0x3941, 0x9F09, 0x9F09, 0x34FF, + 0x9F0A, 0x9F0A, 0x3519, 0x9F0E, 0x9F0E, 0x0F7B, 0x9F0F, 0x9F10, 0x2AFE, + 0x9F12, 0x9F12, 0x2D38, 0x9F13, 0x9F13, 0x0F7C, 0x9F15, 0x9F15, 0x1573, + 0x9F16, 0x9F16, 0x3072, 0x9F17, 0x9F17, 0x3945, 0x9F18, 0x9F18, 0x3370, + 0x9F19, 0x9F19, 0x16B7, 0x9F1A, 0x9F1A, 0x3371, 0x9F1B, 0x9F1B, 0x336F, + 0x9F1C, 0x9F1C, 0x3476, 0x9F1E, 0x9F1E, 0x34C4, 0x9F20, 0x9F20, 0x0F7D, + 0x9F22, 0x9F22, 0x2F0B, 0x9F23, 0x9F23, 0x2F0A, 0x9F24, 0x9F24, 0x2F09, + 0x9F25, 0x9F25, 0x3073, 0x9F26, 0x9F26, 0x3F90, 0x9F27, 0x9F27, 0x4620, + 0x9F28, 0x9F28, 0x3077, 0x9F29, 0x9F29, 0x3076, 0x9F2A, 0x9F2A, 0x3075, + 0x9F2B, 0x9F2B, 0x3074, 0x9F2C, 0x9F2C, 0x1574, 0x9F2D, 0x9F2D, 0x31C0, + 0x9F2E, 0x9F2E, 0x32BE, 0x9F2F, 0x9F2F, 0x1664, 0x9F30, 0x9F30, 0x32BD, + 0x9F31, 0x9F31, 0x3372, 0x9F32, 0x9F32, 0x3409, 0x9F33, 0x9F33, 0x3408, + 0x9F34, 0x9F34, 0x16F2, 0x9F35, 0x9F35, 0x3407, 0x9F36, 0x9F36, 0x3479, + 0x9F37, 0x9F37, 0x3478, 0x9F38, 0x9F38, 0x3477, 0x9F39, 0x9F39, 0x3947, + 0x9F3B, 0x9F3B, 0x1100, 0x9F3D, 0x9F3D, 0x2D39, 0x9F3E, 0x9F3E, 0x14C7, + 0x9F40, 0x9F41, 0x31C1, 0x9F42, 0x9F42, 0x340A, 0x9F43, 0x9F43, 0x347A, + 0x9F44, 0x9F44, 0x47DB, 0x9F45, 0x9F45, 0x394A, 0x9F46, 0x9F46, 0x34C5, + 0x9F47, 0x9F47, 0x3500, 0x9F48, 0x9F48, 0x3532, 0x9F49, 0x9F49, 0x354C, + 0x9F4A, 0x9F4A, 0x1101, 0x9F4B, 0x9F4B, 0x14C8, 0x9F4C, 0x9F4C, 0x3078, + 0x9F4D, 0x9F4D, 0x31C3, 0x9F4E, 0x9F4E, 0x3373, 0x9F4F, 0x9F4F, 0x347B, + 0x9F50, 0x9F50, 0x4943, 0x9F52, 0x9F52, 0x1289, 0x9F53, 0x9F53, 0x3F80, + 0x9F54, 0x9F54, 0x2F0C, 0x9F55, 0x9F55, 0x3079, 0x9F56, 0x9F58, 0x31C4, + 0x9F59, 0x9F59, 0x32C3, 0x9F5A, 0x9F5A, 0x3F23, 0x9F5B, 0x9F5B, 0x32BF, + 0x9F5C, 0x9F5C, 0x16B8, 0x9F5D, 0x9F5D, 0x32C2, 0x9F5E, 0x9F5E, 0x32C1, + 0x9F5F, 0x9F5F, 0x1665, 0x9F60, 0x9F60, 0x32C0, 0x9F61, 0x9F61, 0x1667, + 0x9F62, 0x9F62, 0x394F, 0x9F63, 0x9F63, 0x1666, 0x9F64, 0x9F64, 0x3375, + 0x9F65, 0x9F65, 0x3374, 0x9F66, 0x9F67, 0x16B9, 0x9F69, 0x9F69, 0x3950, + 0x9F6A, 0x9F6A, 0x16F4, 0x9F6B, 0x9F6B, 0x340B, 0x9F6C, 0x9F6C, 0x16F3, + 0x9F6E, 0x9F6F, 0x347E, 0x9F70, 0x9F70, 0x347D, 0x9F71, 0x9F71, 0x347C, + 0x9F72, 0x9F72, 0x1741, 0x9F74, 0x9F76, 0x34C6, 0x9F77, 0x9F77, 0x1740, + 0x9F78, 0x9F78, 0x3501, 0x9F79, 0x9F79, 0x3504, 0x9F7A, 0x9F7A, 0x3503, + 0x9F7B, 0x9F7B, 0x3502, 0x9F7E, 0x9F7E, 0x354B, 0x9F7F, 0x9F7F, 0x4680, + 0x9F8D, 0x9F8D, 0x13B2, 0x9F8E, 0x9F8E, 0x3952, 0x9F90, 0x9F90, 0x157C, + 0x9F91, 0x9F91, 0x32C4, 0x9F92, 0x9F92, 0x3376, 0x9F94, 0x9F94, 0x16F5, + 0x9F95, 0x9F95, 0x340C, 0x9F98, 0x9F98, 0x354D, 0x9F99, 0x9F99, 0x4587, + 0x9F9C, 0x9F9C, 0x13B3, 0x9F9F, 0x9F9F, 0x4646, 0x9FA0, 0x9FA0, 0x2F0D, + 0x9FA2, 0x9FA2, 0x340D, 0x9FA4, 0x9FA4, 0x351A, 0x9FA5, 0x9FA5, 0x3F70, + 0xE000, 0xE000, 0x400B, 0xE002, 0xE003, 0x400D, 0xE009, 0xE00A, 0x4014, + 0xE00C, 0xE00C, 0x4017, 0xE00E, 0xE00E, 0x4019, 0xE012, 0xE016, 0x401D, + 0xE018, 0xE018, 0x4023, 0xE01A, 0xE01E, 0x4025, 0xE020, 0xE020, 0x402B, + 0xE022, 0xE023, 0x402D, 0xE025, 0xE025, 0x4030, 0xE02D, 0xE02E, 0x4038, + 0xE030, 0xE030, 0x403B, 0xE032, 0xE038, 0x403D, 0xE03B, 0xE03C, 0x4046, + 0xE045, 0xE045, 0x4050, 0xE04C, 0xE04C, 0x4057, 0xE05A, 0xE05A, 0x4065, + 0xE05C, 0xE05C, 0x4067, 0xE05F, 0xE061, 0x406A, 0xE064, 0xE064, 0x406F, + 0xE066, 0xE066, 0x4071, 0xE06C, 0xE06C, 0x4077, 0xE071, 0xE071, 0x407C, + 0xE074, 0xE075, 0x407F, 0xE078, 0xE078, 0x4083, 0xE07D, 0xE07D, 0x4088, + 0xE087, 0xE087, 0x4092, 0xE089, 0xE08A, 0x4094, 0xE08C, 0xE08C, 0x4097, + 0xE093, 0xE094, 0x409E, 0xE099, 0xE09A, 0x40A4, 0xE09C, 0xE09E, 0x40A7, + 0xE0A6, 0xE0A7, 0x40B1, 0xE0A9, 0xE0A9, 0x40B4, 0xE0AB, 0xE0AB, 0x40B6, + 0xE0AE, 0xE0AE, 0x40B9, 0xE0BA, 0xE0BA, 0x40C5, 0xE0BC, 0xE0BC, 0x40C7, + 0xE0BE, 0xE0BE, 0x40C9, 0xE0C3, 0xE0C3, 0x40CE, 0xE0C5, 0xE0C5, 0x40D0, + 0xE0C7, 0xE0C8, 0x40D2, 0xE0CA, 0xE0CA, 0x40D5, 0xE0D0, 0xE0D0, 0x40DB, + 0xE0D4, 0xE0D5, 0x40DF, 0xE0DC, 0xE0DC, 0x40E7, 0xE0DF, 0xE0DF, 0x40EA, + 0xE0E2, 0xE0E5, 0x40ED, 0xE0E7, 0xE0E9, 0x40F2, 0xE0EB, 0xE0EC, 0x40F6, + 0xE0EE, 0xE0EE, 0x40F9, 0xE0F2, 0xE0F2, 0x40FD, 0xE0F8, 0xE0F9, 0x4103, + 0xE0FB, 0xE0FB, 0x4105, 0xE0FD, 0xE0FD, 0x4107, 0xE103, 0xE103, 0x410D, + 0xE106, 0xE106, 0x4110, 0xE109, 0xE10B, 0x4112, 0xE110, 0xE110, 0x4119, + 0xE114, 0xE115, 0x411D, 0xE11C, 0xE11D, 0x4125, 0xE121, 0xE121, 0x412A, + 0xE126, 0xE128, 0x412F, 0xE130, 0xE131, 0x4139, 0xE136, 0xE136, 0x413F, + 0xE139, 0xE139, 0x4142, 0xE141, 0xE142, 0x414A, 0xE145, 0xE145, 0x414D, + 0xE147, 0xE148, 0x414F, 0xE14A, 0xE14A, 0x4151, 0xE14D, 0xE14D, 0x4153, + 0xE150, 0xE150, 0x4156, 0xE154, 0xE157, 0x415A, 0xE159, 0xE15A, 0x415F, + 0xE15D, 0xE15D, 0x494F, 0xE162, 0xE162, 0x4167, 0xE168, 0xE16A, 0x416D, + 0xE171, 0xE172, 0x4175, 0xE175, 0xE175, 0x4179, 0xE178, 0xE179, 0x417C, + 0xE17B, 0xE17C, 0x417F, 0xE17F, 0xE180, 0x4183, 0xE185, 0xE185, 0x4189, + 0xE187, 0xE187, 0x418B, 0xE189, 0xE189, 0x418D, 0xE18B, 0xE18B, 0x418F, + 0xE18F, 0xE190, 0x4193, 0xE193, 0xE193, 0x4196, 0xE195, 0xE195, 0x4953, + 0xE196, 0xE196, 0x4198, 0xE19F, 0xE1A0, 0x41A1, 0xE1A4, 0xE1A4, 0x4954, + 0xE1A6, 0xE1A6, 0x41A8, 0xE1AA, 0xE1AA, 0x41AC, 0xE1AE, 0xE1AE, 0x41B0, + 0xE1B0, 0xE1B1, 0x41B2, 0xE1B3, 0xE1B4, 0x41B5, 0xE1B6, 0xE1B6, 0x41B8, + 0xE1B8, 0xE1B8, 0x41BA, 0xE1BB, 0xE1BB, 0x4955, 0xE1BC, 0xE1BF, 0x41BD, + 0xE1C1, 0xE1C1, 0x41C2, 0xE1C4, 0xE1C5, 0x41C5, 0xE1C8, 0xE1C8, 0x41C8, + 0xE1CC, 0xE1CD, 0x41CC, 0xE1D4, 0xE1D5, 0x41D4, 0xE1D7, 0xE1D7, 0x41D7, + 0xE1DA, 0xE1DA, 0x41DA, 0xE1DD, 0xE1DD, 0x41DD, 0xE1E2, 0xE1E2, 0x41E1, + 0xE1E6, 0xE1E6, 0x41E5, 0xE1EB, 0xE1EB, 0x41EA, 0xE1EF, 0xE1F0, 0x41EE, + 0xE1F2, 0xE1F2, 0x41F1, 0xE1F7, 0xE1F7, 0x41F6, 0xE1FA, 0xE1FA, 0x41F9, + 0xE1FE, 0xE1FE, 0x41FD, 0xE200, 0xE200, 0x41FF, 0xE201, 0xE201, 0x4958, + 0xE202, 0xE202, 0x4201, 0xE205, 0xE205, 0x4204, 0xE207, 0xE207, 0x4206, + 0xE20A, 0xE20C, 0x4209, 0xE210, 0xE210, 0x420F, 0xE212, 0xE216, 0x4211, + 0xE219, 0xE219, 0x4218, 0xE21B, 0xE21C, 0x421A, 0xE21F, 0xE221, 0x421E, + 0xE226, 0xE228, 0x4225, 0xE22A, 0xE22A, 0x4229, 0xE22F, 0xE22F, 0x422E, + 0xE231, 0xE231, 0x4230, 0xE233, 0xE233, 0x4232, 0xE237, 0xE237, 0x4236, + 0xE23B, 0xE23B, 0x423A, 0xE23D, 0xE23E, 0x423C, 0xE245, 0xE245, 0x4244, + 0xE248, 0xE248, 0x4247, 0xE24A, 0xE24F, 0x4249, 0xE251, 0xE254, 0x4250, + 0xE261, 0xE261, 0x4260, 0xE268, 0xE268, 0x4266, 0xE26B, 0xE26B, 0x4269, + 0xE26D, 0xE26F, 0x426B, 0xE271, 0xE271, 0x426F, 0xE27A, 0xE27A, 0x4278, + 0xE27D, 0xE27D, 0x427B, 0xE282, 0xE282, 0x4280, 0xE288, 0xE289, 0x4286, + 0xE28B, 0xE28B, 0x4289, 0xE290, 0xE291, 0x428E, 0xE294, 0xE296, 0x4292, + 0xE299, 0xE29B, 0x4297, 0xE29F, 0xE29F, 0x429D, 0xE2A1, 0xE2A1, 0x495B, + 0xE2A4, 0xE2A4, 0x42A1, 0xE2A6, 0xE2A6, 0x42A3, 0xE2B2, 0xE2B5, 0x42AE, + 0xE2B7, 0xE2B8, 0x42B3, 0xE2BA, 0xE2BA, 0x42B6, 0xE2BE, 0xE2BF, 0x42B9, + 0xE2C1, 0xE2C1, 0x42BC, 0xE2C7, 0xE2C7, 0x42C2, 0xE2C9, 0xE2C9, 0x42C4, + 0xE2D4, 0xE2D4, 0x42CF, 0xE2D8, 0xE2D9, 0x42D3, 0xE2DE, 0xE2DE, 0x42D9, + 0xE2E0, 0xE2E2, 0x42DB, 0xE2E7, 0xE2E7, 0x42E2, 0xE2E9, 0xE2E9, 0x42E4, + 0xE2EB, 0xE2ED, 0x42E6, 0xE2F0, 0xE2F1, 0x495D, 0xE2F8, 0xE2F8, 0x42F1, + 0xE2FC, 0xE2FC, 0x42F5, 0xE2FF, 0xE2FF, 0x495F, 0xE300, 0xE300, 0x4960, + 0xE301, 0xE301, 0x42F8, 0xE306, 0xE306, 0x42FD, 0xE308, 0xE308, 0x42FF, + 0xE30C, 0xE30C, 0x4303, 0xE30F, 0xE30F, 0x4306, 0xE311, 0xE311, 0x372B, + 0xE313, 0xE313, 0x372D, 0xE315, 0xE315, 0x372F, 0xE318, 0xE318, 0x3731, + 0xE31B, 0xE31C, 0x3734, 0xE31F, 0xE31F, 0x3738, 0xE325, 0xE325, 0x373E, + 0xE32C, 0xE32C, 0x3745, 0xE330, 0xE331, 0x3749, 0xE335, 0xE336, 0x374E, + 0xE33B, 0xE33B, 0x3754, 0xE33D, 0xE33D, 0x469A, 0xE342, 0xE342, 0x375A, + 0xE345, 0xE345, 0x375D, 0xE348, 0xE348, 0x375F, 0xE352, 0xE352, 0x3768, + 0xE354, 0xE354, 0x376A, 0xE35B, 0xE35C, 0x3770, 0xE360, 0xE360, 0x3775, + 0xE362, 0xE362, 0x3777, 0xE364, 0xE365, 0x3779, 0xE36F, 0xE36F, 0x3784, + 0xE372, 0xE372, 0x3787, 0xE374, 0xE375, 0x3789, 0xE377, 0xE377, 0x378C, + 0xE379, 0xE379, 0x378D, 0xE37B, 0xE37B, 0x378F, 0xE381, 0xE382, 0x3795, + 0xE386, 0xE386, 0x379A, 0xE388, 0xE38A, 0x379C, 0xE38D, 0xE38D, 0x37A1, + 0xE391, 0xE391, 0x37A5, 0xE393, 0xE393, 0x37A7, 0xE394, 0xE394, 0x46A0, + 0xE396, 0xE396, 0x37A9, 0xE398, 0xE398, 0x37AB, 0xE39A, 0xE39B, 0x37AD, + 0xE39E, 0xE39E, 0x46A1, 0xE39F, 0xE3A0, 0x37B1, 0xE3A2, 0xE3A2, 0x37B4, + 0xE3A5, 0xE3A5, 0x46A2, 0xE3A6, 0xE3A9, 0x37B8, 0xE3AC, 0xE3AC, 0x37BE, + 0xE3B1, 0xE3B2, 0x37C3, 0xE3B4, 0xE3B5, 0x37C6, 0xE3B9, 0xE3BD, 0x37CB, + 0xE3C3, 0xE3C3, 0x37D5, 0xE3C8, 0xE3C8, 0x37D9, 0xE3CC, 0xE3CC, 0x37DD, + 0xE3CD, 0xE3CD, 0x46A4, 0xE3CF, 0xE3CF, 0x37DF, 0xE3D5, 0xE3D5, 0x46A5, + 0xE3D8, 0xE3DA, 0x37E7, 0xE3E1, 0xE3E1, 0x37F0, 0xE3E3, 0xE3E3, 0x37F2, + 0xE3E7, 0xE3E7, 0x46A6, 0xE3ED, 0xE3EE, 0x37FC, 0xE3F0, 0xE3F0, 0x37FF, + 0xE3F2, 0xE3F4, 0x3801, 0xE3F8, 0xE3F8, 0x3807, 0xE3FA, 0xE3FA, 0x3809, + 0xE3FD, 0xE3FD, 0x380C, 0xE3FF, 0xE3FF, 0x380E, 0xE409, 0xE40B, 0x3818, + 0xE414, 0xE414, 0x3821, 0xE41B, 0xE41B, 0x3828, 0xE41D, 0xE41E, 0x382A, + 0xE423, 0xE423, 0x3830, 0xE425, 0xE425, 0x3832, 0xE426, 0xE426, 0x46AB, + 0xE428, 0xE428, 0x3834, 0xE42C, 0xE42D, 0x3838, 0xE432, 0xE432, 0x383E, + 0xE436, 0xE436, 0x3842, 0xE43A, 0xE43C, 0x3846, 0xE43E, 0xE43E, 0x384A, + 0xE440, 0xE441, 0x384C, 0xE444, 0xE444, 0x3850, 0xE448, 0xE448, 0x46AD, + 0xE44C, 0xE44E, 0x3857, 0xE450, 0xE451, 0x385B, 0xE459, 0xE45A, 0x3864, + 0xE45D, 0xE45E, 0x3868, 0xE461, 0xE463, 0x386C, 0xE465, 0xE465, 0x3870, + 0xE467, 0xE469, 0x46AF, 0xE46A, 0xE46A, 0x3873, 0xE46C, 0xE46C, 0x3875, + 0xE46E, 0xE46F, 0x3877, 0xE471, 0xE472, 0x387A, 0xE474, 0xE474, 0x387D, + 0xE476, 0xE476, 0x387F, 0xE47E, 0xE47F, 0x3886, 0xE484, 0xE484, 0x388C, + 0xE486, 0xE48A, 0x388D, 0xE48D, 0xE48E, 0x3894, 0xE491, 0xE492, 0x3897, + 0xE495, 0xE497, 0x389B, 0xE4A1, 0xE4A1, 0x46B4, 0xE4A2, 0xE4A4, 0x38A7, + 0xE4AB, 0xE4AB, 0x38B0, 0xE4AF, 0xE4AF, 0x38B4, 0xE4B3, 0xE4BA, 0x38B8, + 0xE4C1, 0xE4C1, 0x38C6, 0xE4C6, 0xE4C6, 0x38CB, 0xE4C9, 0xE4C9, 0x38CE, + 0xE4CD, 0xE4CE, 0x38D2, 0xE4D6, 0xE4D6, 0x38DB, 0xE4D9, 0xE4D9, 0x38DE, + 0xE4DC, 0xE4DD, 0x38E1, 0xE4E4, 0xE4E4, 0x38E9, 0xE4E6, 0xE4E8, 0x38EB, + 0xE4EE, 0xE4EF, 0x38F3, 0xE4F6, 0xE4F6, 0x38FB, 0xE4F8, 0xE4F9, 0x38FD, + 0xE4FF, 0xE4FF, 0x3904, 0xE501, 0xE502, 0x3906, 0xE505, 0xE505, 0x390A, + 0xE50A, 0xE50A, 0x390F, 0xE50D, 0xE50D, 0x46B5, 0xE50F, 0xE50F, 0x3913, + 0xE512, 0xE512, 0x3916, 0xE514, 0xE514, 0x3918, 0xE516, 0xE516, 0x46B6, + 0xE51A, 0xE51A, 0x391D, 0xE51C, 0xE521, 0x391F, 0xE524, 0xE524, 0x3927, + 0xE528, 0xE528, 0x46B8, 0xE529, 0xE52C, 0x392A, 0xE52E, 0xE52F, 0x392F, + 0xE537, 0xE537, 0x3938, 0xE53E, 0xE53E, 0x393F, 0xE543, 0xE543, 0x3944, + 0xE54B, 0xE54B, 0x394C, 0xE554, 0xE555, 0x3955, 0xE557, 0xE559, 0x3958, + 0xE55B, 0xE55C, 0x395C, 0xE55E, 0xE55F, 0x395F, 0xE562, 0xE562, 0x3963, + 0xE566, 0xE567, 0x3967, 0xE56D, 0xE56E, 0x396E, 0xE570, 0xE570, 0x3971, + 0xE572, 0xE573, 0x3973, 0xE575, 0xE577, 0x3976, 0xE579, 0xE57A, 0x397A, + 0xE57C, 0xE57E, 0x397D, 0xE580, 0xE580, 0x3981, 0xE582, 0xE586, 0x3983, + 0xE588, 0xE588, 0x3989, 0xE58B, 0xE590, 0x398C, 0xE592, 0xE594, 0x3993, + 0xE59A, 0xE59A, 0x399B, 0xE59D, 0xE5A1, 0x399E, 0xE5A4, 0xE5A4, 0x39A5, + 0xE5A6, 0xE5A8, 0x39A7, 0xE5AA, 0xE5AA, 0x39AB, 0xE5AF, 0xE5AF, 0x39B0, + 0xE5B1, 0xE5B1, 0x39B2, 0xE5B2, 0xE5B2, 0x46BB, 0xE5B5, 0xE5B5, 0x39B6, + 0xE5B7, 0xE5B8, 0x39B8, 0xE5BA, 0xE5BB, 0x39BB, 0xE5BE, 0xE5C0, 0x39BF, + 0xE5C2, 0xE5C2, 0x39C3, 0xE5C8, 0xE5C9, 0x39C9, 0xE5D7, 0xE5D9, 0x39D4, + 0xE5DB, 0xE5DC, 0x39D8, 0xE5DF, 0xE5DF, 0x39DC, 0xE5E1, 0xE5E3, 0x39DE, + 0xE5E5, 0xE5E6, 0x39E2, 0xE5E9, 0xE5E9, 0x39E6, 0xE5EE, 0xE5F1, 0x39EB, + 0xE5F3, 0xE5F3, 0x39F0, 0xE5FB, 0xE5FC, 0x39F8, 0xE600, 0xE600, 0x39FD, + 0xE602, 0xE602, 0x39FF, 0xE604, 0xE604, 0x3A01, 0xE60F, 0xE612, 0x3A0B, + 0xE619, 0xE61C, 0x3A14, 0xE621, 0xE621, 0x3A1C, 0xE623, 0xE624, 0x3A1E, + 0xE627, 0xE627, 0x3A22, 0xE62B, 0xE62B, 0x3A26, 0xE632, 0xE634, 0x3A2D, + 0xE637, 0xE638, 0x3A32, 0xE63A, 0xE63A, 0x3A35, 0xE63C, 0xE63C, 0x3A37, + 0xE63F, 0xE642, 0x3A3A, 0xE645, 0xE646, 0x3A40, 0xE648, 0xE648, 0x3A43, + 0xE64B, 0xE64B, 0x3A45, 0xE64E, 0xE64F, 0x3A48, 0xE652, 0xE655, 0x3A4C, + 0xE657, 0xE659, 0x3A51, 0xE65D, 0xE660, 0x3A57, 0xE662, 0xE663, 0x3A5C, + 0xE665, 0xE668, 0x3A5F, 0xE66A, 0xE66A, 0x46BF, 0xE66E, 0xE66F, 0x3A67, + 0xE671, 0xE671, 0x3A6A, 0xE676, 0xE679, 0x3A6F, 0xE67B, 0xE67D, 0x3A74, + 0xE67F, 0xE680, 0x3A78, 0xE683, 0xE688, 0x3A7B, 0xE68A, 0xE68C, 0x3A82, + 0xE68E, 0xE690, 0x3A86, 0xE692, 0xE692, 0x3A8A, 0xE696, 0xE697, 0x3A8E, + 0xE699, 0xE69A, 0x3A91, 0xE69C, 0xE69C, 0x3A94, 0xE69E, 0xE69F, 0x3A96, + 0xE6A1, 0xE6A2, 0x3A99, 0xE6A6, 0xE6A6, 0x3A9D, 0xE6AC, 0xE6AD, 0x3AA2, + 0xE6B2, 0xE6B2, 0x3AA8, 0xE6B9, 0xE6BA, 0x3AAF, 0xE6BD, 0xE6BE, 0x3AB3, + 0xE6C0, 0xE6C1, 0x3AB6, 0xE6C5, 0xE6C5, 0x46C4, 0xE6C7, 0xE6C7, 0x3ABC, + 0xE6CA, 0xE6CA, 0x3ABF, 0xE6D1, 0xE6D2, 0x3AC6, 0xE6D7, 0xE6D8, 0x3ACC, + 0xE6DA, 0xE6DB, 0x3ACF, 0xE6DD, 0xE6E1, 0x3AD2, 0xE6E4, 0xE6E6, 0x3AD9, + 0xE6EE, 0xE6EE, 0x3AE3, 0xE6F2, 0xE6F3, 0x3AE7, 0xE6F7, 0xE6F7, 0x3AEC, + 0xE6FA, 0xE6FC, 0x3AEF, 0xE6FF, 0xE6FF, 0x3AF4, 0xE701, 0xE702, 0x3AF6, + 0xE706, 0xE707, 0x3AFB, 0xE709, 0xE70A, 0x3AFE, 0xE70C, 0xE70C, 0x3B01, + 0xE710, 0xE711, 0x3B05, 0xE713, 0xE713, 0x3B08, 0xE717, 0xE718, 0x3B0C, + 0xE71A, 0xE71B, 0x3B0F, 0xE71D, 0xE71D, 0x3B12, 0xE724, 0xE725, 0x3B19, + 0xE72B, 0xE72B, 0x3B20, 0xE72F, 0xE72F, 0x3B24, 0xE733, 0xE737, 0x3B28, + 0xE73C, 0xE73D, 0x3B31, 0xE740, 0xE742, 0x3B35, 0xE744, 0xE744, 0x3B39, + 0xE747, 0xE747, 0x3B3C, 0xE74D, 0xE74F, 0x3B42, 0xE751, 0xE752, 0x3B46, + 0xE75B, 0xE75D, 0x3B50, 0xE75F, 0xE75F, 0x3B54, 0xE761, 0xE762, 0x3B56, + 0xE764, 0xE765, 0x3B59, 0xE767, 0xE768, 0x3B5C, 0xE769, 0xE769, 0x46C7, + 0xE76C, 0xE76E, 0x3B60, 0xE770, 0xE770, 0x3B64, 0xE775, 0xE775, 0x3B69, + 0xE777, 0xE778, 0x3B6A, 0xE77A, 0xE77A, 0x3B6D, 0xE77C, 0xE77D, 0x3B6F, + 0xE784, 0xE784, 0x3B77, 0xE786, 0xE786, 0x3B79, 0xE789, 0xE789, 0x3B7C, + 0xE78B, 0xE78B, 0x3B7E, 0xE78D, 0xE78D, 0x3B80, 0xE790, 0xE790, 0x3B83, + 0xE792, 0xE792, 0x3B85, 0xE794, 0xE794, 0x3B87, 0xE796, 0xE797, 0x3B89, + 0xE799, 0xE799, 0x3B8C, 0xE7A2, 0xE7A2, 0x3B95, 0xE7A4, 0xE7A9, 0x3B97, + 0xE7B1, 0xE7B1, 0x3BA4, 0xE7B4, 0xE7B4, 0x3BA7, 0xE7B8, 0xE7B8, 0x3BAB, + 0xE7BC, 0xE7BC, 0x3BAF, 0xE7C4, 0xE7C4, 0x3BB6, 0xE7CA, 0xE7CA, 0x3BBC, + 0xE7CE, 0xE7CE, 0x3BC0, 0xE7D1, 0xE7D1, 0x3BC3, 0xE7D8, 0xE7D8, 0x3BCA, + 0xE7DA, 0xE7DA, 0x3BCC, 0xE7DC, 0xE7DD, 0x3BCE, 0xE7E4, 0xE7E4, 0x3BD6, + 0xE7E7, 0xE7E9, 0x3BD9, 0xE7EB, 0xE7EB, 0x3BDD, 0xE7ED, 0xE7EF, 0x3BDF, + 0xE7F1, 0xE7F3, 0x3BE3, 0xE7F8, 0xE7F8, 0x3BEA, 0xE7FB, 0xE7FC, 0x3BED, + 0xE7FF, 0xE7FF, 0x3BF1, 0xE800, 0xE802, 0x3BF2, 0xE808, 0xE808, 0x3BFA, + 0xE80C, 0xE80C, 0x3BFE, 0xE80E, 0xE80F, 0x3C00, 0xE811, 0xE811, 0x3C03, + 0xE813, 0xE813, 0x3C05, 0xE816, 0xE818, 0x3C08, 0xE81A, 0xE81A, 0x3C0C, + 0xE821, 0xE821, 0x3C13, 0xE827, 0xE828, 0x3C19, 0xE82D, 0xE82D, 0x3C1F, + 0xE82F, 0xE82F, 0x3C21, 0xE835, 0xE835, 0x3C27, 0xE837, 0xE838, 0x3C29, + 0xE83A, 0xE83B, 0x3C2C, 0xE841, 0xE842, 0x3C33, 0xE84B, 0xE84B, 0x3C3D, + 0xE84D, 0xE84E, 0x3C3F, 0xE851, 0xE851, 0x3C43, 0xE855, 0xE858, 0x3C47, + 0xE85B, 0xE85D, 0x3C4D, 0xE860, 0xE862, 0x3C52, 0xE865, 0xE867, 0x3C57, + 0xE869, 0xE86A, 0x3C5B, 0xE86C, 0xE86C, 0x3C5D, 0xE871, 0xE871, 0x3C62, + 0xE878, 0xE878, 0x3C69, 0xE87D, 0xE87F, 0x3C6E, 0xE887, 0xE887, 0x3C78, + 0xE88F, 0xE88F, 0x3C80, 0xE891, 0xE892, 0x3C82, 0xE894, 0xE895, 0x3C85, + 0xE89A, 0xE89A, 0x3C8B, 0xE89D, 0xE89D, 0x3C8E, 0xE8A0, 0xE8A1, 0x3C91, + 0xE8A3, 0xE8A7, 0x3C94, 0xE8A9, 0xE8AA, 0x3C9A, 0xE8AC, 0xE8B0, 0x3C9D, + 0xE8B5, 0xE8B6, 0x3CA6, 0xE8B8, 0xE8B8, 0x3CA9, 0xE8BD, 0xE8C3, 0x3CAE, + 0xE8C5, 0xE8C5, 0x3CB6, 0xE8C7, 0xE8C7, 0x3CB8, 0xE8CB, 0xE8CB, 0x3CBC, + 0xE8CD, 0xE8CE, 0x3CBE, 0xE8D0, 0xE8D1, 0x3CC1, 0xE8D3, 0xE8D3, 0x3CC4, + 0xE8D5, 0xE8D6, 0x3CC6, 0xE8D8, 0xE8DA, 0x3CC9, 0xE8DD, 0xE8DD, 0x3CCE, + 0xE8DF, 0xE8E1, 0x3CD0, 0xE8E5, 0xE8E6, 0x3CD6, 0xE8E8, 0xE8EA, 0x3CD9, + 0xE8ED, 0xE8ED, 0x3CDE, 0xE8F1, 0xE8F2, 0x3CE2, 0xE8F5, 0xE8F5, 0x3CE6, + 0xE8FB, 0xE8FB, 0x3CEC, 0xE8FE, 0xE8FE, 0x3CEF, 0xE900, 0xE900, 0x3CF1, + 0xE903, 0xE903, 0x3CF4, 0xE907, 0xE908, 0x3CF8, 0xE90C, 0xE90C, 0x3CFD, + 0xE917, 0xE918, 0x3D08, 0xE91C, 0xE91C, 0x3D0D, 0xE91E, 0xE922, 0x3D0F, + 0xE925, 0xE92C, 0x3D16, 0xE92E, 0xE92F, 0x3D1F, 0xE933, 0xE936, 0x3D24, + 0xE938, 0xE938, 0x46CF, 0xE93A, 0xE93A, 0x3D2B, 0xE93C, 0xE93E, 0x3D2D, + 0xE941, 0xE941, 0x3D32, 0xE944, 0xE945, 0x3D35, 0xE948, 0xE948, 0x3D39, + 0xE94D, 0xE94D, 0x3D3E, 0xE950, 0xE950, 0x3D41, 0xE952, 0xE955, 0x3D43, + 0xE957, 0xE958, 0x3D48, 0xE95A, 0xE95A, 0x3D4B, 0xE95C, 0xE95E, 0x3D4D, + 0xE960, 0xE961, 0x3D51, 0xE964, 0xE964, 0x3D55, 0xE967, 0xE967, 0x3D58, + 0xE968, 0xE968, 0x46D1, 0xE96E, 0xE96F, 0x46D5, 0xE973, 0xE973, 0x46DA, + 0xE974, 0xE974, 0x3D5B, 0xE975, 0xE975, 0x46DB, 0xE977, 0xE978, 0x46DD, + 0xE97A, 0xE97B, 0x46E0, 0xE97D, 0xE97D, 0x46E3, 0xE981, 0xE982, 0x46E6, + 0xE987, 0xE987, 0x3D5D, 0xE98A, 0xE98A, 0x3D5E, 0xE98E, 0xE98E, 0x3D5F, + 0xE991, 0xE991, 0x46EF, 0xE9B0, 0xE9B0, 0x43D4, 0xE9CB, 0xE9CB, 0x4719, + 0xE9EF, 0xE9EF, 0x4734, 0xEA43, 0xEA43, 0x4779, 0xEAA9, 0xEAA9, 0x47CC, + 0xEABF, 0xEAC1, 0x47DC, 0xEAC5, 0xEAC5, 0x47E0, 0xEAC9, 0xEACC, 0x47E2, + 0xEACF, 0xEAD1, 0x47E8, 0xEAD3, 0xEAD4, 0x47EB, 0xEAD6, 0xEADA, 0x47EE, + 0xEADC, 0xEADC, 0x47F3, 0xEADE, 0xEAE3, 0x47F4, 0xEAE7, 0xEAEC, 0x47FA, + 0xEAEE, 0xEAEE, 0x4800, 0xEAF0, 0xEAF2, 0x4801, 0xEAF4, 0xEAF4, 0x43B0, + 0xEAF5, 0xEAF6, 0x4804, 0xEAF8, 0xEAF8, 0x4807, 0xEAF9, 0xEAF9, 0x43B2, + 0xEAFA, 0xEAFB, 0x4808, 0xEAFE, 0xEAFF, 0x480B, 0xEB00, 0xEB00, 0x480D, + 0xEB02, 0xEB05, 0x480E, 0xEB08, 0xEB0F, 0x4813, 0xEB11, 0xEB12, 0x481B, + 0xEB15, 0xEB15, 0x481E, 0xEB18, 0xEB1D, 0x4821, 0xEB1F, 0xEB21, 0x4827, + 0xEB23, 0xEB23, 0x482A, 0xEB25, 0xEB25, 0x482B, 0xEB27, 0xEB27, 0x482C, + 0xEB2A, 0xEB2A, 0x482D, 0xEB2C, 0xEB39, 0x482E, 0xEB3D, 0xEB3D, 0x3D9B, + 0xEB3E, 0xEB3F, 0x483C, 0xEB41, 0xEB41, 0x3D9D, 0xEB43, 0xEB44, 0x483E, + 0xEB46, 0xEB46, 0x3DA0, 0xEB4A, 0xEB4A, 0x4841, 0xEB4B, 0xEB4C, 0x3DA3, + 0xEB4D, 0xEB4E, 0x4842, 0xEB4F, 0xEB50, 0x3DA5, 0xEB53, 0xEB53, 0x4844, + 0xEB54, 0xEB54, 0x3DA9, 0xEB55, 0xEB56, 0x4845, 0xEB57, 0xEB57, 0x3DAA, + 0xEB58, 0xEB59, 0x4847, 0xEB5A, 0xEB5B, 0x3DAB, 0xEB5D, 0xEB5D, 0x3DAE, + 0xEB5F, 0xEB5F, 0x3DB0, 0xEB61, 0xEB61, 0x3DB2, 0xEB62, 0xEB63, 0x4849, + 0xEB65, 0xEB65, 0x484C, 0xEB67, 0xEB67, 0x484D, 0xEB68, 0xEB69, 0x3DB4, + 0xEB6B, 0xEB6B, 0x3DB7, 0xEB6D, 0xEB6D, 0x3DB9, 0xEB6F, 0xEB71, 0x484E, + 0xEB73, 0xEB73, 0x4851, 0xEB74, 0xEB74, 0x3DBC, 0xEB76, 0xEB76, 0x43D0, + 0xEB77, 0xEB77, 0x4853, 0xEB78, 0xEB78, 0x3DBD, 0xEB7A, 0xEB7A, 0x4854, + 0xEB7E, 0xEB7F, 0x4856, 0xEB80, 0xEB81, 0x3DC1, 0xEB83, 0xEB84, 0x4858, + 0xEB85, 0xEB85, 0x3DC4, 0xEB88, 0xEB88, 0x485A, 0xEB89, 0xEB89, 0x3DC6, + 0xEB8A, 0xEB8A, 0x485B, 0xEB8C, 0xEB8E, 0x485C, 0xEB8F, 0xEB8F, 0x3DC8, + 0xEB90, 0xEB90, 0x485F, 0xEB93, 0xEB93, 0x3DCB, 0xEB95, 0xEB95, 0x4860, + 0xEB97, 0xEB97, 0x3DCE, 0xEB98, 0xEB9A, 0x4861, 0xEB9B, 0xEB9B, 0x3DCF, + 0xEB9F, 0xEB9F, 0x4866, 0xEBA0, 0xEBA0, 0x3DD1, 0xEBA2, 0xEBA2, 0x4867, + 0xEBA3, 0xEBA3, 0x3DD3, 0xEBA5, 0xEBA6, 0x4868, 0xEBA8, 0xEBA8, 0x3DD6, + 0xEBAA, 0xEBAA, 0x486A, 0xEBAB, 0xEBAB, 0x3DD8, 0xEBAD, 0xEBAD, 0x3DDA, + 0xEBAE, 0xEBAE, 0x486B, 0xEBAF, 0xEBAF, 0x3DDB, 0xEBB0, 0xEBB0, 0x486C, + 0xEBB2, 0xEBB3, 0x486D, 0xEBB4, 0xEBB4, 0x3DDD, 0xEBB6, 0xEBB6, 0x3DDF, + 0xEBB9, 0xEBB9, 0x3DE2, 0xEBBC, 0xEBBC, 0x3DE4, 0xEBBD, 0xEBBD, 0x4870, + 0xEBBF, 0xEBBF, 0x3DE6, 0xEBC2, 0xEBC2, 0x3DE9, 0xEBC5, 0xEBC6, 0x4872, + 0xEBC7, 0xEBC7, 0x3DEB, 0xEBC8, 0xEBC8, 0x4874, 0xEBCA, 0xEBCA, 0x4875, + 0xEBCC, 0xEBCD, 0x3DEE, 0xEBCE, 0xEBCE, 0x4876, 0xEBD0, 0xEBD0, 0x4877, + 0xEBD3, 0xEBD3, 0x4878, 0xEBD5, 0xEBD5, 0x4879, 0xEBD7, 0xEBD8, 0x3DF4, + 0xEBDA, 0xEBDB, 0x487A, 0xEBDD, 0xEBDD, 0x3DF8, 0xEBDF, 0xEBDF, 0x487C, + 0xEBE1, 0xEBE1, 0x487D, 0xEBE4, 0xEBE4, 0x487E, 0xEBE7, 0xEBE7, 0x3DFF, + 0xEBE8, 0xEBE9, 0x487F, 0xEBEB, 0xEBEC, 0x4881, 0xEBEE, 0xEBEE, 0x3E02, + 0xEBEF, 0xEBEF, 0x4883, 0xEBF1, 0xEBF1, 0x4884, 0xEBF2, 0xEBF2, 0x3E04, + 0xEBF5, 0xEBF5, 0x4886, 0xEBF6, 0xEBF6, 0x3E06, 0xEBF9, 0xEBFB, 0x3E09, + 0xEBFD, 0xEBFE, 0x3E0D, 0xEC05, 0xEC06, 0x3E14, 0xEC08, 0xEC09, 0x4888, + 0xEC0C, 0xEC0C, 0x3E18, 0xEC0E, 0xEC10, 0x3E1A, 0xEC13, 0xEC13, 0x488B, + 0xEC14, 0xEC14, 0x3E1F, 0xEC17, 0xEC18, 0x3E22, 0xEC19, 0xEC1C, 0x488C, + 0xEC1D, 0xEC1D, 0x3E24, 0xEC20, 0xEC20, 0x4890, 0xEC22, 0xEC22, 0x3E28, + 0xEC24, 0xEC24, 0x3E2A, 0xEC26, 0xEC26, 0x3E2C, 0xEC2A, 0xEC2A, 0x3E30, + 0xEC2B, 0xEC2B, 0x4891, 0xEC2C, 0xEC2E, 0x3E31, 0xEC2F, 0xEC2F, 0x4892, + 0xEC31, 0xEC31, 0x3E35, 0xEC32, 0xEC32, 0x4893, 0xEC35, 0xEC35, 0x3E38, + 0xEC37, 0xEC37, 0x3E3A, 0xEC3B, 0xEC3C, 0x3E3E, 0xEC3F, 0xEC41, 0x4894, + 0xEC42, 0xEC42, 0x3E42, 0xEC43, 0xEC43, 0x4897, 0xEC44, 0xEC44, 0x43E8, + 0xEC45, 0xEC49, 0x4898, 0xEC4B, 0xEC4C, 0x489D, 0xEC4F, 0xEC4F, 0x48A0, + 0xEC52, 0xEC52, 0x48A1, 0xEC54, 0xEC54, 0x48A2, 0xEC56, 0xEC58, 0x48A3, + 0xEC5A, 0xEC5A, 0x48A6, 0xEC5C, 0xEC5D, 0x48A7, 0xEC5F, 0xEC60, 0x48A9, + 0xEC62, 0xEC63, 0x48AC, 0xEC67, 0xEC67, 0x48AF, 0xEC68, 0xEC68, 0x3E4D, + 0xEC69, 0xEC73, 0x48B0, 0xEC75, 0xEC76, 0x48BC, 0xEC79, 0xEC79, 0x48C0, + 0xEC7B, 0xEC7B, 0x48C2, 0xEC7E, 0xEC7E, 0x48C3, 0xEC80, 0xEC80, 0x48C5, + 0xEC84, 0xEC84, 0x48C8, 0xEC86, 0xEC86, 0x48CA, 0xEC8D, 0xEC8D, 0x48CC, + 0xEC8E, 0xEC8E, 0x3E55, 0xEC91, 0xEC91, 0x48CE, 0xEC92, 0xEC92, 0x3E58, + 0xEC93, 0xEC94, 0x48CF, 0xEC95, 0xEC95, 0x3E59, 0xEC96, 0xEC96, 0x48D1, + 0xEC98, 0xEC98, 0x48D2, 0xEC99, 0xEC99, 0x3E5B, 0xEC9A, 0xEC9B, 0x48D3, + 0xEC9D, 0xEC9D, 0x48D6, 0xEC9E, 0xEC9E, 0x3E5C, 0xECA0, 0xECA0, 0x48D7, + 0xECA3, 0xECA4, 0x48D8, 0xECA7, 0xECA8, 0x48DA, 0xECAB, 0xECAB, 0x48DC, + 0xECAD, 0xECAD, 0x48DD, 0xECAF, 0xECAF, 0x3E65, 0xECB4, 0xECB4, 0x48DF, + 0xECB6, 0xECB6, 0x3E6B, 0xECB9, 0xECBB, 0x48E1, 0xECCF, 0xECCF, 0x3E80, + 0xECD4, 0xECD4, 0x3E85, 0xECDB, 0xECDC, 0x3E8C, 0xECDE, 0xECDE, 0x48E4, + 0xECDF, 0xECE1, 0x3E8F, 0xECE5, 0xECE5, 0x3E95, 0xECF0, 0xECF0, 0x3EA0, + 0xECF2, 0xECF2, 0x3EA2, 0xECF5, 0xECF5, 0x3EA5, 0xECFC, 0xECFC, 0x3EAC, + 0xED04, 0xED04, 0x48E7, 0xED07, 0xED07, 0x48E8, 0xED0A, 0xED0A, 0x48EA, + 0xED0C, 0xED11, 0x48EB, 0xED13, 0xED13, 0x48F1, 0xED15, 0xED17, 0x48F2, + 0xED18, 0xED18, 0x3EBA, 0xED1A, 0xED1A, 0x48F5, 0xED1C, 0xED1C, 0x48F6, + 0xED1D, 0xED1D, 0x3EBD, 0xED1E, 0xED1E, 0x48F7, 0xED22, 0xED22, 0x48F8, + 0xED24, 0xED25, 0x3EC2, 0xED26, 0xED27, 0x48F9, 0xED29, 0xED29, 0x3EC5, + 0xED2A, 0xED2A, 0x48FB, 0xED2C, 0xED2C, 0x3EC7, 0xED2D, 0xED2D, 0x48FC, + 0xED3B, 0xED3B, 0x3ECF, 0xED3D, 0xED3D, 0x4904, 0xED41, 0xED42, 0x4906, + 0xED45, 0xED45, 0x4908, 0xED47, 0xED47, 0x3ED5, 0xED4A, 0xED4B, 0x4909, + 0xED4D, 0xED4E, 0x490B, 0xED4F, 0xED4F, 0x3EDA, 0xED51, 0xED51, 0x490D, + 0xED52, 0xED52, 0x3EDC, 0xED53, 0xED54, 0x490E, 0xED57, 0xED58, 0x4910, + 0xED5F, 0xED5F, 0x3EE5, 0xED62, 0xED62, 0x3EE8, 0xED6B, 0xED6B, 0x3EF1, + 0xED71, 0xED71, 0x4912, 0xED72, 0xED72, 0x3EF7, 0xED75, 0xED75, 0x4913, + 0xED77, 0xED77, 0x4915, 0xED78, 0xED78, 0x3EFA, 0xED7A, 0xED7A, 0x4916, + 0xED81, 0xED81, 0x4917, 0xED84, 0xED85, 0x3F04, 0xED86, 0xED86, 0x4918, + 0xED88, 0xED88, 0x3F07, 0xED89, 0xED8A, 0x4919, 0xED8B, 0xED8B, 0x3F08, + 0xED8E, 0xED8E, 0x3F0B, 0xED91, 0xED91, 0x3F0E, 0xEDA6, 0xEDA6, 0x491C, + 0xEDC6, 0xEDC6, 0x3F41, 0xEDCF, 0xEDCF, 0x3F4A, 0xEDD1, 0xEDD1, 0x491E, + 0xEDD7, 0xEDD7, 0x491F, 0xEDDA, 0xEDDA, 0x3F53, 0xEDDB, 0xEDDB, 0x4920, + 0xEDDD, 0xEDDD, 0x4921, 0xEDE1, 0xEDE1, 0x3F58, 0xEDED, 0xEDED, 0x3F64, + 0xEE08, 0xEE08, 0x3F7E, 0xEE11, 0xEE11, 0x3F87, 0xEE15, 0xEE15, 0x4925, + 0xEE1B, 0xEE1B, 0x4926, 0xEE20, 0xEE20, 0x3F94, 0xEE22, 0xEE22, 0x4927, + 0xEE2A, 0xEE2A, 0x3F9D, 0xEE30, 0xEE30, 0x4928, 0xEE31, 0xEE31, 0x3FA3, + 0xEE34, 0xEE34, 0x3FA6, 0xEE48, 0xEE48, 0x4929, 0xEE56, 0xEE56, 0x492A, + 0xEE5B, 0xEE5B, 0x492B, 0xEE5D, 0xEE5D, 0x3FCC, 0xEE60, 0xEE60, 0x492C, + 0xEE64, 0xEE64, 0x3FD2, 0xEE6A, 0xEE6A, 0x3FD8, 0xEE76, 0xEE76, 0x3FE4, + 0xEE7C, 0xEE7C, 0x3FEA, 0xEE7E, 0xEE7E, 0x492D, 0xEE91, 0xEE91, 0x3FFD, + 0xEE9C, 0xEE9C, 0x492F, 0xEEA1, 0xEEA6, 0x4931, 0xEEA7, 0xEEA7, 0x43B4, + 0xEEA8, 0xEEAA, 0x4937, 0xEEAC, 0xEEB1, 0x493A, 0xEEB4, 0xEEB4, 0x4942, + 0xEEB7, 0xEEB7, 0x4945, 0xF303, 0xF318, 0x44C9, 0xF325, 0xF325, 0x496D, + 0xF327, 0xF327, 0x496F, 0xF344, 0xF344, 0x498C, 0xF346, 0xF346, 0x498E, + 0xF34A, 0xF34B, 0x499C, 0xF3A0, 0xF3A1, 0x4534, 0xF3AC, 0xF3AC, 0x453B, + 0xF3F0, 0xF3F0, 0x4575, 0xF3F9, 0xF3FA, 0x457C, 0xF3FC, 0xF3FC, 0x457F, + 0xF408, 0xF40B, 0x4589, 0xF43D, 0xF43D, 0x45B5, 0xF440, 0xF442, 0x430B, + 0xF444, 0xF444, 0x430F, 0xF446, 0xF446, 0x4311, 0xF448, 0xF449, 0x4313, + 0xF44B, 0xF44B, 0x4316, 0xF44D, 0xF44D, 0x4318, 0xF450, 0xF452, 0x431B, + 0xF454, 0xF456, 0x431F, 0xF457, 0xF457, 0x45B7, 0xF45A, 0xF45A, 0x4325, + 0xF45B, 0xF45B, 0x45B8, 0xF45C, 0xF45F, 0x4327, 0xF461, 0xF463, 0x432C, + 0xF465, 0xF466, 0x4330, 0xF469, 0xF469, 0x4334, 0xF46C, 0xF46D, 0x4337, + 0xF46E, 0xF46E, 0x45B9, 0xF46F, 0xF46F, 0x433A, 0xF474, 0xF474, 0x45BA, + 0xF477, 0xF477, 0x45BB, 0xF478, 0xF478, 0x4343, 0xF479, 0xF479, 0x45BC, + 0xF47B, 0xF47B, 0x45BD, 0xF47C, 0xF47E, 0x4347, 0xF480, 0xF481, 0x434B, + 0xF483, 0xF483, 0x45BE, 0xF484, 0xF485, 0x434F, 0xF488, 0xF488, 0x4353, + 0xF48B, 0xF48B, 0x4356, 0xF48D, 0xF490, 0x4358, 0xF491, 0xF491, 0x45BF, + 0xF497, 0xF498, 0x4362, 0xF49B, 0xF49B, 0x4366, 0xF49E, 0xF49E, 0x4369, + 0xF4A4, 0xF4A6, 0x436F, 0xF4A7, 0xF4A7, 0x45C1, 0xF4A9, 0xF4AA, 0x4374, + 0xF4AD, 0xF4AD, 0x4378, 0xF4AF, 0xF4B0, 0x437A, 0xF4B2, 0xF4B2, 0x45C3, + 0xF4B3, 0xF4B4, 0x437E, 0xF4B7, 0xF4B7, 0x4382, 0xF4BA, 0xF4C0, 0x4385, + 0xF4C1, 0xF4C1, 0x45C4, 0xF4C3, 0xF4C5, 0x45C5, 0xF4C7, 0xF4CA, 0x45C9, + 0xF4CC, 0xF4CF, 0x45CE, 0xF4D1, 0xF4D5, 0x45D2, 0xF4D7, 0xF4D7, 0x45D8, + 0xF4D9, 0xF4DA, 0x45DA, 0xF4DB, 0xF4DC, 0x438C, 0xF4DD, 0xF4DE, 0x45DC, + 0xF4DF, 0xF4DF, 0x438E, 0xF4E0, 0xF4E0, 0x45DE, 0xF4E2, 0xF4E2, 0x45DF, + 0xF4E3, 0xF4E3, 0x4390, 0xF4E4, 0xF4E4, 0x45E0, 0xF4E5, 0xF4E5, 0x4391, + 0xF4E6, 0xF4E6, 0x45E1, 0xF4E7, 0xF4E9, 0x4392, 0xF4EF, 0xF4EF, 0x45E5, + 0xF4F2, 0xF4F2, 0x4397, 0xF4F3, 0xF4F3, 0x45E8, 0xF4F8, 0xF4F8, 0x45EB, + 0xF4FC, 0xF4FC, 0x45EE, 0xF4FE, 0xF4FF, 0x45F0, 0xF500, 0xF501, 0x45F2, + 0xF503, 0xF503, 0x45F4, 0xF505, 0xF505, 0x45F6, 0xF507, 0xF511, 0x45F8, + 0xF513, 0xF516, 0x4604, 0xF518, 0xF51D, 0x4609, 0xF51F, 0xF526, 0x4610, + 0xF52A, 0xF52A, 0x461B, 0xF533, 0xF534, 0x4624, 0xF53A, 0xF53B, 0x44E1, + 0xF53D, 0xF53D, 0x44E4, 0xF54E, 0xF54E, 0x44F5, 0xF553, 0xF553, 0x44FA, + 0xF556, 0xF556, 0x44FC, 0xF559, 0xF55A, 0x44FF, 0xF55E, 0xF55E, 0x4504, + 0xF565, 0xF565, 0x450B, 0xF56B, 0xF56B, 0x4511, 0xF572, 0xF572, 0x4518, + 0xF694, 0xF694, 0x467C, 0xF69E, 0xF69E, 0x4686, 0xF6AD, 0xF6AD, 0x4694, + 0xF6B0, 0xF6B0, 0x4697, 0xF7E5, 0xF7E6, 0x36AF, 0xF7E8, 0xF7E8, 0x36B2, + 0xF7EA, 0xF7EB, 0x36B4, 0xF7ED, 0xF7EE, 0x36B7, 0xFA0C, 0xFA0C, 0x0274, + 0xFA0D, 0xFA0D, 0x2381, 0xFE30, 0xFE30, 0x006D, 0xFE31, 0xFE31, 0x007A, + 0xFE33, 0xFE33, 0x35AF, 0xFE34, 0xFE34, 0x35B1, 0xFE35, 0xFE36, 0x0082, + 0xFE37, 0xFE38, 0x0086, 0xFE39, 0xFE3A, 0x008A, 0xFE3B, 0xFE3C, 0x008E, + 0xFE3D, 0xFE3E, 0x0092, 0xFE3F, 0xFE40, 0x0096, 0xFE41, 0xFE42, 0x009A, + 0xFE43, 0xFE44, 0x009E, 0xFE49, 0xFE4A, 0x00C7, 0xFE4B, 0xFE4C, 0x00CB, + 0xFE4D, 0xFE4E, 0x00C9, 0xFE4F, 0xFE4F, 0x35B2, 0xFE50, 0xFE50, 0x0070, + 0xFE52, 0xFE52, 0x0072, 0xFE54, 0xFE57, 0x0074, 0xFE59, 0xFE5E, 0x00A0, + 0xFE5F, 0xFE61, 0x00CD, 0xFE62, 0xFE66, 0x00DF, 0xFE69, 0xFE6B, 0x010C, + 0xFF01, 0xFF01, 0x006C, 0xFF02, 0xFF02, 0x36E4, 0xFF03, 0xFF03, 0x00AE, + 0xFF04, 0xFF04, 0x0103, 0xFF05, 0xFF05, 0x0108, 0xFF06, 0xFF06, 0x00AF, + 0xFF07, 0xFF07, 0x36E3, 0xFF08, 0xFF09, 0x0080, 0xFF0A, 0xFF0A, 0x00B0, + 0xFF0B, 0xFF0B, 0x00D0, 0xFF0C, 0xFF0C, 0x0064, 0xFF0D, 0xFF0D, 0x00D1, + 0xFF0E, 0xFF0E, 0x0067, 0xFF0F, 0xFF0F, 0x0101, 0xFF10, 0xFF19, 0x014D, + 0xFF1A, 0xFF1A, 0x006A, 0xFF1B, 0xFF1B, 0x0069, 0xFF1C, 0xFF1C, 0x00D6, + 0xFF1D, 0xFF1D, 0x00D8, 0xFF1E, 0xFF1E, 0x00D7, 0xFF1F, 0xFF1F, 0x006B, + 0xFF20, 0xFF20, 0x0109, 0xFF21, 0xFF3A, 0x016D, 0xFF3B, 0xFF3B, 0x35BE, + 0xFF3C, 0xFF3C, 0x0102, 0xFF3D, 0xFF3D, 0x35BF, 0xFF3E, 0xFF3E, 0x35B4, + 0xFF3F, 0xFF3F, 0x00C5, 0xFF41, 0xFF5A, 0x0187, 0xFF5B, 0xFF5B, 0x0084, + 0xFF5C, 0xFF5C, 0x0078, 0xFF5D, 0xFF5D, 0x0085, 0xFF64, 0xFF64, 0x0071, + 0xFFE2, 0xFFE2, 0x36E1, 0xFFE4, 0xFFE4, 0x36E2, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/UniCNS-UCS2-V_3.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/UniCNS-UCS2-V_3.cpp new file mode 100644 index 000000000000..dfa7b879df2d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/UniCNS-UCS2-V_3.cpp @@ -0,0 +1,15 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_UniCNS_UCS2_V_3[13 * 3] = { + 0x2013, 0x2013, 0x0078, 0x2014, 0x2014, 0x007A, 0x2025, 0x2025, + 0x006D, 0x3008, 0x3009, 0x0096, 0x300A, 0x300B, 0x0092, 0x300C, + 0x300D, 0x009A, 0x300E, 0x300F, 0x009E, 0x3010, 0x3011, 0x008E, + 0x3014, 0x3015, 0x008A, 0xFE4F, 0xFE4F, 0x35B1, 0xFF08, 0xFF09, + 0x0082, 0xFF5B, 0xFF5B, 0x0086, 0xFF5D, 0xFF5D, 0x0087, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/UniCNS-UTF16-H_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/UniCNS-UTF16-H_0.cpp new file mode 100644 index 000000000000..a033c13dccc0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/UniCNS-UTF16-H_0.cpp @@ -0,0 +1,3245 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +const uint16_t g_FXCMAP_UniCNS_UTF16_H_0[14557 * 2] = { + 0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004, 0x0024, + 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008, 0x0028, 0x0009, + 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C, 0x002C, 0x000D, 0x002D, + 0x000E, 0x002E, 0x000F, 0x002F, 0x0010, 0x0030, 0x0011, 0x0031, 0x0012, + 0x0032, 0x0013, 0x0033, 0x0014, 0x0034, 0x0015, 0x0035, 0x0016, 0x0036, + 0x0017, 0x0037, 0x0018, 0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, + 0x003B, 0x001C, 0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, + 0x0020, 0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024, + 0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028, 0x0048, + 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C, 0x004C, 0x002D, + 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030, 0x0050, 0x0031, 0x0051, + 0x0032, 0x0052, 0x0033, 0x0053, 0x0034, 0x0054, 0x0035, 0x0055, 0x0036, + 0x0056, 0x0037, 0x0057, 0x0038, 0x0058, 0x0039, 0x0059, 0x003A, 0x005A, + 0x003B, 0x005B, 0x003C, 0x005C, 0x003D, 0x005D, 0x003E, 0x005E, 0x003F, + 0x005F, 0x0040, 0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, + 0x0044, 0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048, + 0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C, 0x006C, + 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050, 0x0070, 0x0051, + 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054, 0x0074, 0x0055, 0x0075, + 0x0056, 0x0076, 0x0057, 0x0077, 0x0058, 0x0078, 0x0059, 0x0079, 0x005A, + 0x007A, 0x005B, 0x007B, 0x005C, 0x007C, 0x005D, 0x007D, 0x005E, 0x007E, + 0x005F, 0x00A2, 0x0106, 0x00A3, 0x0107, 0x00A5, 0x0104, 0x00A7, 0x00B2, + 0x00A8, 0x35B3, 0x00AC, 0x36E1, 0x00AF, 0x00C3, 0x00B0, 0x0118, 0x00B1, + 0x00D4, 0x00B7, 0x0073, 0x00D7, 0x00D2, 0x00F7, 0x00D3, 0x02C6, 0x35B4, + 0x02C7, 0x01F8, 0x02CA, 0x01F7, 0x02CB, 0x01F9, 0x02CD, 0x00C6, 0x02D9, + 0x01F6, 0x0308, 0x35B3, 0x0391, 0x01A1, 0x0392, 0x01A2, 0x0393, 0x01A3, + 0x0394, 0x01A4, 0x0395, 0x01A5, 0x0396, 0x01A6, 0x0397, 0x01A7, 0x0398, + 0x01A8, 0x0399, 0x01A9, 0x039A, 0x01AA, 0x039B, 0x01AB, 0x039C, 0x01AC, + 0x039D, 0x01AD, 0x039E, 0x01AE, 0x039F, 0x01AF, 0x03A0, 0x01B0, 0x03A1, + 0x01B1, 0x03A3, 0x01B2, 0x03A4, 0x01B3, 0x03A5, 0x01B4, 0x03A6, 0x01B5, + 0x03A7, 0x01B6, 0x03A8, 0x01B7, 0x03A9, 0x01B8, 0x03B1, 0x01B9, 0x03B2, + 0x01BA, 0x03B3, 0x01BB, 0x03B4, 0x01BC, 0x03B5, 0x01BD, 0x03B6, 0x01BE, + 0x03B7, 0x01BF, 0x03B8, 0x01C0, 0x03B9, 0x01C1, 0x03BA, 0x01C2, 0x03BB, + 0x01C3, 0x03BC, 0x01C4, 0x03BD, 0x01C5, 0x03BE, 0x01C6, 0x03BF, 0x01C7, + 0x03C0, 0x01C8, 0x03C1, 0x01C9, 0x03C3, 0x01CA, 0x03C4, 0x01CB, 0x03C5, + 0x01CC, 0x03C6, 0x01CD, 0x03C7, 0x01CE, 0x03C8, 0x01CF, 0x03C9, 0x01D0, + 0x0401, 0x3670, 0x0410, 0x366A, 0x0411, 0x366B, 0x0412, 0x366C, 0x0413, + 0x366D, 0x0414, 0x366E, 0x0415, 0x366F, 0x0416, 0x3671, 0x0417, 0x3672, + 0x0418, 0x3673, 0x0419, 0x3674, 0x041A, 0x3675, 0x041B, 0x3676, 0x041C, + 0x3677, 0x041D, 0x3678, 0x041E, 0x3679, 0x041F, 0x367A, 0x0420, 0x367B, + 0x0421, 0x367C, 0x0422, 0x367D, 0x0423, 0x367E, 0x0424, 0x367F, 0x0425, + 0x3680, 0x0426, 0x3681, 0x0427, 0x3682, 0x0428, 0x3683, 0x0429, 0x3684, + 0x042A, 0x3685, 0x042B, 0x3686, 0x042C, 0x3687, 0x042D, 0x3688, 0x042E, + 0x3689, 0x042F, 0x368A, 0x0430, 0x368B, 0x0431, 0x368C, 0x0432, 0x368D, + 0x0433, 0x368E, 0x0434, 0x368F, 0x0435, 0x3690, 0x0436, 0x3692, 0x0437, + 0x3693, 0x0438, 0x3694, 0x0439, 0x3695, 0x043A, 0x3696, 0x043B, 0x3697, + 0x043C, 0x3698, 0x043D, 0x3699, 0x043E, 0x369A, 0x043F, 0x369B, 0x0440, + 0x369C, 0x0441, 0x369D, 0x0442, 0x369E, 0x0443, 0x369F, 0x0444, 0x36A0, + 0x0445, 0x36A1, 0x0446, 0x36A2, 0x0447, 0x36A3, 0x0448, 0x36A4, 0x0449, + 0x36A5, 0x044A, 0x36A6, 0x044B, 0x36A7, 0x044C, 0x36A8, 0x044D, 0x36A9, + 0x044E, 0x36AA, 0x044F, 0x36AB, 0x0451, 0x3691, 0x2013, 0x0079, 0x2014, + 0x007B, 0x2018, 0x00A6, 0x2019, 0x00A7, 0x201C, 0x00A8, 0x201D, 0x00A9, + 0x2022, 0x0068, 0x2025, 0x006F, 0x2026, 0x006E, 0x2027, 0x0068, 0x2032, + 0x00AD, 0x2035, 0x00AC, 0x203B, 0x00B1, 0x203E, 0x00C3, 0x2103, 0x010A, + 0x2105, 0x00C2, 0x2109, 0x010B, 0x2116, 0x36E6, 0x2121, 0x36E7, 0x2160, + 0x0157, 0x2161, 0x0158, 0x2162, 0x0159, 0x2163, 0x015A, 0x2164, 0x015B, + 0x2165, 0x015C, 0x2166, 0x015D, 0x2167, 0x015E, 0x2168, 0x015F, 0x2169, + 0x0160, 0x2170, 0x020E, 0x2171, 0x020F, 0x2172, 0x0210, 0x2173, 0x0211, + 0x2174, 0x0212, 0x2175, 0x0213, 0x2176, 0x0214, 0x2177, 0x0215, 0x2178, + 0x0216, 0x2179, 0x0217, 0x2190, 0x00F8, 0x2191, 0x00F5, 0x2192, 0x00F7, + 0x2193, 0x00F6, 0x2196, 0x00F9, 0x2197, 0x00FA, 0x2198, 0x00FC, 0x2199, + 0x00FB, 0x21B8, 0x36AD, 0x21B9, 0x36AE, 0x21E7, 0x36AC, 0x2215, 0x0101, + 0x221A, 0x00D5, 0x221E, 0x00DC, 0x221F, 0x00E9, 0x2220, 0x00E8, 0x2223, + 0x00FE, 0x2225, 0x00FD, 0x2229, 0x00E5, 0x222A, 0x00E6, 0x222B, 0x00ED, + 0x222E, 0x00EE, 0x2234, 0x00F0, 0x2235, 0x00EF, 0x223C, 0x00E4, 0x2252, + 0x00DD, 0x2260, 0x00DB, 0x2261, 0x00DE, 0x2266, 0x00D9, 0x2267, 0x00DA, + 0x2295, 0x00F3, 0x2299, 0x00F4, 0x22A5, 0x00E7, 0x22BF, 0x00EA, 0x22EF, + 0x006E, 0x2400, 0x0232, 0x2401, 0x0233, 0x2402, 0x0234, 0x2403, 0x0235, + 0x2404, 0x0236, 0x2405, 0x0237, 0x2406, 0x0238, 0x2407, 0x0239, 0x2408, + 0x023A, 0x2409, 0x023B, 0x240A, 0x023C, 0x240B, 0x023D, 0x240C, 0x023E, + 0x240D, 0x023F, 0x240E, 0x0240, 0x240F, 0x0241, 0x2410, 0x0242, 0x2411, + 0x0243, 0x2412, 0x0244, 0x2413, 0x0245, 0x2414, 0x0246, 0x2415, 0x0247, + 0x2416, 0x0248, 0x2417, 0x0249, 0x2418, 0x024A, 0x2419, 0x024B, 0x241A, + 0x024C, 0x241B, 0x024D, 0x241C, 0x024E, 0x241D, 0x024F, 0x241E, 0x0250, + 0x241F, 0x0251, 0x2421, 0x0252, 0x2460, 0x01FA, 0x2461, 0x01FB, 0x2462, + 0x01FC, 0x2463, 0x01FD, 0x2464, 0x01FE, 0x2465, 0x01FF, 0x2466, 0x0200, + 0x2467, 0x0201, 0x2468, 0x0202, 0x2469, 0x0203, 0x2474, 0x0204, 0x2475, + 0x0205, 0x2476, 0x0206, 0x2477, 0x0207, 0x2478, 0x0208, 0x2479, 0x0209, + 0x247A, 0x020A, 0x247B, 0x020B, 0x247C, 0x020C, 0x247D, 0x020D, 0x2500, + 0x0137, 0x2502, 0x0138, 0x250C, 0x013A, 0x2510, 0x013B, 0x2514, 0x013C, + 0x2518, 0x013D, 0x251C, 0x0135, 0x2524, 0x0134, 0x252C, 0x0133, 0x2534, + 0x0132, 0x253C, 0x0131, 0x2550, 0x0142, 0x2551, 0x370A, 0x2552, 0x36F8, + 0x2553, 0x3701, 0x2554, 0x36EF, 0x2555, 0x36FA, 0x2556, 0x3703, 0x2557, + 0x36F1, 0x2558, 0x36FE, 0x2559, 0x3707, 0x255A, 0x36F5, 0x255B, 0x3700, + 0x255C, 0x3709, 0x255D, 0x36F7, 0x255E, 0x0143, 0x255F, 0x3704, 0x2560, + 0x36F2, 0x2561, 0x0145, 0x2562, 0x3706, 0x2563, 0x36F4, 0x2564, 0x36F9, + 0x2565, 0x3702, 0x2566, 0x36F0, 0x2567, 0x36FF, 0x2568, 0x3708, 0x2569, + 0x36F6, 0x256A, 0x0144, 0x256B, 0x3705, 0x256C, 0x36F3, 0x256D, 0x013E, + 0x256E, 0x013F, 0x256F, 0x0141, 0x2570, 0x0140, 0x2571, 0x014A, 0x2572, + 0x014B, 0x2573, 0x014C, 0x2574, 0x35B0, 0x2581, 0x0122, 0x2582, 0x0123, + 0x2583, 0x0124, 0x2584, 0x0125, 0x2585, 0x0126, 0x2586, 0x0127, 0x2587, + 0x0128, 0x2588, 0x0129, 0x2589, 0x0130, 0x258A, 0x012F, 0x258B, 0x012E, + 0x258C, 0x012D, 0x258D, 0x012C, 0x258E, 0x012B, 0x258F, 0x012A, 0x2593, + 0x3710, 0x2594, 0x0136, 0x2595, 0x0139, 0x25A0, 0x00BE, 0x25A1, 0x00BD, + 0x25B2, 0x00B7, 0x25B3, 0x00B6, 0x25BC, 0x00C0, 0x25BD, 0x00BF, 0x25C6, + 0x00BC, 0x25C7, 0x00BB, 0x25CB, 0x00B4, 0x25CE, 0x00B8, 0x25CF, 0x00B5, + 0x25E2, 0x0146, 0x25E3, 0x0147, 0x25E4, 0x0149, 0x25E5, 0x0148, 0x2605, + 0x00BA, 0x2606, 0x00B9, 0x2609, 0x00F4, 0x2640, 0x00F1, 0x2641, 0x00F3, + 0x2642, 0x00F2, 0x273D, 0x35C0, 0x2F00, 0x0253, 0x2F01, 0x0218, 0x2F02, + 0x0219, 0x2F03, 0x021A, 0x2F04, 0x0254, 0x2F05, 0x021B, 0x2F06, 0x025A, + 0x2F07, 0x021C, 0x2F08, 0x025B, 0x2F09, 0x025C, 0x2F0A, 0x025D, 0x2F0B, + 0x025E, 0x2F0C, 0x021D, 0x2F0D, 0x021E, 0x2F0E, 0x021F, 0x2F0F, 0x025F, + 0x2F10, 0x176E, 0x2F11, 0x0260, 0x2F12, 0x0262, 0x2F13, 0x0220, 0x2F14, + 0x0263, 0x2F15, 0x176F, 0x2F16, 0x0221, 0x2F17, 0x0264, 0x2F18, 0x0265, + 0x2F19, 0x0222, 0x2F1A, 0x1770, 0x2F1B, 0x0223, 0x2F1C, 0x0266, 0x2F1D, + 0x0279, 0x2F1E, 0x1775, 0x2F1F, 0x027A, 0x2F20, 0x027B, 0x2F21, 0x0224, + 0x2F22, 0x0224, 0x2F23, 0x027C, 0x2F24, 0x027D, 0x2F25, 0x027E, 0x2F26, + 0x027F, 0x2F27, 0x0225, 0x2F28, 0x0282, 0x2F29, 0x0283, 0x2F2A, 0x0284, + 0x2F2B, 0x0285, 0x2F2C, 0x1776, 0x2F2D, 0x0286, 0x2F2E, 0x0226, 0x2F2F, + 0x0288, 0x2F30, 0x0289, 0x2F31, 0x028C, 0x2F32, 0x028D, 0x2F33, 0x0227, + 0x2F34, 0x0228, 0x2F35, 0x0229, 0x2F36, 0x028E, 0x2F37, 0x028F, 0x2F38, + 0x0290, 0x2F39, 0x022A, 0x2F3A, 0x022B, 0x2F3B, 0x1777, 0x2F3C, 0x02D0, + 0x2F3D, 0x02D1, 0x2F3E, 0x02D2, 0x2F3F, 0x02D3, 0x2F40, 0x02D5, 0x2F41, + 0x022C, 0x2F42, 0x02D6, 0x2F43, 0x02D7, 0x2F44, 0x02D8, 0x2F45, 0x02D9, + 0x2F46, 0x022D, 0x2F47, 0x02DA, 0x2F48, 0x02DB, 0x2F49, 0x02DC, 0x2F4A, + 0x02DD, 0x2F4B, 0x02DE, 0x2F4C, 0x02DF, 0x2F4D, 0x02E0, 0x2F4E, 0x178A, + 0x2F4F, 0x02E1, 0x2F50, 0x02E2, 0x2F51, 0x02E3, 0x2F52, 0x02E4, 0x2F53, + 0x178C, 0x2F54, 0x02E5, 0x2F55, 0x02E6, 0x2F56, 0x02E7, 0x2F57, 0x02E8, + 0x2F58, 0x02E9, 0x2F59, 0x178D, 0x2F5A, 0x02EA, 0x2F5B, 0x02EB, 0x2F5C, + 0x02EC, 0x2F5D, 0x02ED, 0x2F5E, 0x0356, 0x2F5F, 0x0357, 0x2F60, 0x0358, + 0x2F61, 0x0359, 0x2F62, 0x035A, 0x2F63, 0x035B, 0x2F64, 0x035C, 0x2F65, + 0x035E, 0x2F66, 0x0362, 0x2F67, 0x022E, 0x2F68, 0x022F, 0x2F69, 0x0363, + 0x2F6A, 0x0364, 0x2F6B, 0x0365, 0x2F6C, 0x0366, 0x2F6D, 0x0367, 0x2F6E, + 0x0368, 0x2F6F, 0x0369, 0x2F70, 0x036A, 0x2F71, 0x17B2, 0x2F72, 0x036B, + 0x2F73, 0x036C, 0x2F74, 0x036D, 0x2F75, 0x03F6, 0x2F76, 0x03F7, 0x2F77, + 0x03F8, 0x2F78, 0x03F9, 0x2F79, 0x1812, 0x2F7A, 0x03FA, 0x2F7B, 0x03FB, + 0x2F7C, 0x03FC, 0x2F7D, 0x03FE, 0x2F7E, 0x03FF, 0x2F7F, 0x0400, 0x2F80, + 0x0401, 0x2F81, 0x0402, 0x2F82, 0x0405, 0x2F83, 0x0406, 0x2F84, 0x0407, + 0x2F85, 0x0408, 0x2F86, 0x0409, 0x2F87, 0x040A, 0x2F88, 0x040B, 0x2F89, + 0x040C, 0x2F8A, 0x040D, 0x2F8B, 0x1813, 0x2F8C, 0x1818, 0x2F8D, 0x040F, + 0x2F8E, 0x0410, 0x2F8F, 0x0411, 0x2F90, 0x0412, 0x2F91, 0x1819, 0x2F92, + 0x0508, 0x2F93, 0x0509, 0x2F94, 0x050A, 0x2F95, 0x050B, 0x2F96, 0x050C, + 0x2F97, 0x050D, 0x2F98, 0x18E7, 0x2F99, 0x050E, 0x2F9A, 0x050F, 0x2F9B, + 0x0510, 0x2F9C, 0x0511, 0x2F9D, 0x0512, 0x2F9E, 0x0513, 0x2F9F, 0x0514, + 0x2FA0, 0x0515, 0x2FA1, 0x0230, 0x2FA2, 0x051B, 0x2FA3, 0x0520, 0x2FA4, + 0x0521, 0x2FA5, 0x0522, 0x2FA6, 0x0696, 0x2FA7, 0x0697, 0x2FA8, 0x0698, + 0x2FA9, 0x0699, 0x2FAA, 0x0231, 0x2FAB, 0x069F, 0x2FAC, 0x06A0, 0x2FAE, + 0x06A2, 0x2FAF, 0x0826, 0x2FB0, 0x0827, 0x2FB1, 0x0828, 0x2FB2, 0x0829, + 0x2FB3, 0x082A, 0x2FB4, 0x082B, 0x2FB5, 0x082C, 0x2FB6, 0x082D, 0x2FB7, + 0x082E, 0x2FB8, 0x082F, 0x2FB9, 0x0830, 0x2FBA, 0x09F5, 0x2FBB, 0x09F6, + 0x2FBC, 0x09F7, 0x2FBD, 0x1E33, 0x2FBE, 0x09F8, 0x2FBF, 0x1E34, 0x2FC0, + 0x09F9, 0x2FC1, 0x09FA, 0x2FC2, 0x0BE1, 0x2FC3, 0x0BE2, 0x2FC4, 0x0BE3, + 0x2FC5, 0x0BE4, 0x2FC6, 0x0BE5, 0x2FC7, 0x0BE6, 0x2FC8, 0x0DBB, 0x2FC9, + 0x0DBC, 0x2FCA, 0x0DBD, 0x2FCB, 0x2360, 0x2FCC, 0x2612, 0x2FCD, 0x0F7B, + 0x2FCE, 0x0F7C, 0x2FCF, 0x0F7D, 0x2FD0, 0x1100, 0x2FD1, 0x1101, 0x2FD2, + 0x1289, 0x2FD3, 0x13B2, 0x2FD4, 0x13B3, 0x2FD5, 0x2F0D, 0x3000, 0x0063, + 0x3001, 0x0065, 0x3002, 0x0066, 0x3003, 0x00B3, 0x3005, 0x35BA, 0x3006, + 0x35BB, 0x3007, 0x35BC, 0x3008, 0x0094, 0x3009, 0x0095, 0x300A, 0x0090, + 0x300B, 0x0091, 0x300C, 0x0098, 0x300D, 0x0099, 0x300E, 0x009C, 0x300F, + 0x009D, 0x3010, 0x008C, 0x3011, 0x008D, 0x3012, 0x0105, 0x3014, 0x0088, + 0x3015, 0x0089, 0x301D, 0x00AA, 0x301E, 0x00AB, 0x3021, 0x0161, 0x3022, + 0x0162, 0x3023, 0x0163, 0x3024, 0x0164, 0x3025, 0x0165, 0x3026, 0x0166, + 0x3027, 0x0167, 0x3028, 0x0168, 0x3029, 0x0169, 0x3038, 0x016A, 0x3039, + 0x016B, 0x303A, 0x016C, 0x3041, 0x35C1, 0x3042, 0x35C2, 0x3043, 0x35C3, + 0x3044, 0x35C4, 0x3045, 0x35C5, 0x3046, 0x35C6, 0x3047, 0x35C7, 0x3048, + 0x35C8, 0x3049, 0x35C9, 0x304A, 0x35CA, 0x304B, 0x35CB, 0x304C, 0x35CC, + 0x304D, 0x35CD, 0x304E, 0x35CE, 0x304F, 0x35CF, 0x3050, 0x35D0, 0x3051, + 0x35D1, 0x3052, 0x35D2, 0x3053, 0x35D3, 0x3054, 0x35D4, 0x3055, 0x35D5, + 0x3056, 0x35D6, 0x3057, 0x35D7, 0x3058, 0x35D8, 0x3059, 0x35D9, 0x305A, + 0x35DA, 0x305B, 0x35DB, 0x305C, 0x35DC, 0x305D, 0x35DD, 0x305E, 0x35DE, + 0x305F, 0x35DF, 0x3060, 0x35E0, 0x3061, 0x35E1, 0x3062, 0x35E2, 0x3063, + 0x35E3, 0x3064, 0x35E4, 0x3065, 0x35E5, 0x3066, 0x35E6, 0x3067, 0x35E7, + 0x3068, 0x35E8, 0x3069, 0x35E9, 0x306A, 0x35EA, 0x306B, 0x35EB, 0x306C, + 0x35EC, 0x306D, 0x35ED, 0x306E, 0x35EE, 0x306F, 0x35EF, 0x3070, 0x35F0, + 0x3071, 0x35F1, 0x3072, 0x35F2, 0x3073, 0x35F3, 0x3074, 0x35F4, 0x3075, + 0x35F5, 0x3076, 0x35F6, 0x3077, 0x35F7, 0x3078, 0x35F8, 0x3079, 0x35F9, + 0x307A, 0x35FA, 0x307B, 0x35FB, 0x307C, 0x35FC, 0x307D, 0x35FD, 0x307E, + 0x35FE, 0x307F, 0x35FF, 0x3080, 0x3600, 0x3081, 0x3601, 0x3082, 0x3602, + 0x3083, 0x3603, 0x3084, 0x3604, 0x3085, 0x3605, 0x3086, 0x3606, 0x3087, + 0x3607, 0x3088, 0x3608, 0x3089, 0x3609, 0x308A, 0x360A, 0x308B, 0x360B, + 0x308C, 0x360C, 0x308D, 0x360D, 0x308E, 0x360E, 0x308F, 0x360F, 0x3090, + 0x3610, 0x3091, 0x3611, 0x3092, 0x3612, 0x3093, 0x3613, 0x309D, 0x35B7, + 0x309E, 0x35B8, 0x30A1, 0x3614, 0x30A2, 0x3615, 0x30A3, 0x3616, 0x30A4, + 0x3617, 0x30A5, 0x3618, 0x30A6, 0x3619, 0x30A7, 0x361A, 0x30A8, 0x361B, + 0x30A9, 0x361C, 0x30AA, 0x361D, 0x30AB, 0x361E, 0x30AC, 0x361F, 0x30AD, + 0x3620, 0x30AE, 0x3621, 0x30AF, 0x3622, 0x30B0, 0x3623, 0x30B1, 0x3624, + 0x30B2, 0x3625, 0x30B3, 0x3626, 0x30B4, 0x3627, 0x30B5, 0x3628, 0x30B6, + 0x3629, 0x30B7, 0x362A, 0x30B8, 0x362B, 0x30B9, 0x362C, 0x30BA, 0x362D, + 0x30BB, 0x362E, 0x30BC, 0x362F, 0x30BD, 0x3630, 0x30BE, 0x3631, 0x30BF, + 0x3632, 0x30C0, 0x3633, 0x30C1, 0x3634, 0x30C2, 0x3635, 0x30C3, 0x3636, + 0x30C4, 0x3637, 0x30C5, 0x3638, 0x30C6, 0x3639, 0x30C7, 0x363A, 0x30C8, + 0x363B, 0x30C9, 0x363C, 0x30CA, 0x363D, 0x30CB, 0x363E, 0x30CC, 0x363F, + 0x30CD, 0x3640, 0x30CE, 0x3641, 0x30CF, 0x3642, 0x30D0, 0x3643, 0x30D1, + 0x3644, 0x30D2, 0x3645, 0x30D3, 0x3646, 0x30D4, 0x3647, 0x30D5, 0x3648, + 0x30D6, 0x3649, 0x30D7, 0x364A, 0x30D8, 0x364B, 0x30D9, 0x364C, 0x30DA, + 0x364D, 0x30DB, 0x364E, 0x30DC, 0x364F, 0x30DD, 0x3650, 0x30DE, 0x3651, + 0x30DF, 0x3652, 0x30E0, 0x3653, 0x30E1, 0x3654, 0x30E2, 0x3655, 0x30E3, + 0x3656, 0x30E4, 0x3657, 0x30E5, 0x3658, 0x30E6, 0x3659, 0x30E7, 0x365A, + 0x30E8, 0x365B, 0x30E9, 0x365C, 0x30EA, 0x365D, 0x30EB, 0x365E, 0x30EC, + 0x365F, 0x30ED, 0x3660, 0x30EE, 0x3661, 0x30EF, 0x3662, 0x30F0, 0x3663, + 0x30F1, 0x3664, 0x30F2, 0x3665, 0x30F3, 0x3666, 0x30F4, 0x3667, 0x30F5, + 0x3668, 0x30F6, 0x3669, 0x30FC, 0x35BD, 0x30FD, 0x35B5, 0x30FE, 0x35B6, + 0x3105, 0x01D1, 0x3106, 0x01D2, 0x3107, 0x01D3, 0x3108, 0x01D4, 0x3109, + 0x01D5, 0x310A, 0x01D6, 0x310B, 0x01D7, 0x310C, 0x01D8, 0x310D, 0x01D9, + 0x310E, 0x01DA, 0x310F, 0x01DB, 0x3110, 0x01DC, 0x3111, 0x01DD, 0x3112, + 0x01DE, 0x3113, 0x01DF, 0x3114, 0x01E0, 0x3115, 0x01E1, 0x3116, 0x01E2, + 0x3117, 0x01E3, 0x3118, 0x01E4, 0x3119, 0x01E5, 0x311A, 0x01E6, 0x311B, + 0x01E7, 0x311C, 0x01E8, 0x311D, 0x01E9, 0x311E, 0x01EA, 0x311F, 0x01EB, + 0x3120, 0x01EC, 0x3121, 0x01ED, 0x3122, 0x01EE, 0x3123, 0x01EF, 0x3124, + 0x01F0, 0x3125, 0x01F1, 0x3126, 0x01F2, 0x3127, 0x01F3, 0x3128, 0x01F4, + 0x3129, 0x01F5, 0x3231, 0x36E5, 0x32A3, 0x00C1, 0x338E, 0x0115, 0x338F, + 0x0116, 0x339C, 0x0110, 0x339D, 0x0111, 0x339E, 0x0112, 0x33A1, 0x0114, + 0x33C4, 0x0117, 0x33CE, 0x0113, 0x33D1, 0x00EC, 0x33D2, 0x00EB, 0x33D5, + 0x010F, 0x361D, 0x36B7, 0x4491, 0x36B4, 0x4E00, 0x0253, 0x4E01, 0x0255, + 0x4E03, 0x0256, 0x4E07, 0x1771, 0x4E08, 0x0269, 0x4E09, 0x0267, 0x4E0A, + 0x026A, 0x4E0B, 0x0268, 0x4E0C, 0x1772, 0x4E0D, 0x0294, 0x4E0E, 0x177A, + 0x4E0F, 0x1778, 0x4E10, 0x0293, 0x4E11, 0x0292, 0x4E14, 0x02F2, 0x4E15, + 0x02F1, 0x4E16, 0x02F0, 0x4E18, 0x02F3, 0x4E19, 0x02EF, 0x4E1E, 0x036E, + 0x4E1F, 0x036F, 0x4E26, 0x0528, 0x4E28, 0x0218, 0x4E2B, 0x026B, 0x4E2D, + 0x0295, 0x4E2E, 0x177B, 0x4E30, 0x0296, 0x4E31, 0x178E, 0x4E32, 0x0415, + 0x4E33, 0x18F4, 0x4E36, 0x0219, 0x4E38, 0x026C, 0x4E39, 0x0297, 0x4E3B, + 0x02F4, 0x4E3C, 0x178F, 0x4E3F, 0x021A, 0x4E41, 0x36AF, 0x4E42, 0x176C, + 0x4E43, 0x0257, 0x4E45, 0x026E, 0x4E47, 0x1773, 0x4E48, 0x026F, 0x4E4B, + 0x0298, 0x4E4D, 0x02F5, 0x4E4E, 0x02F7, 0x4E4F, 0x02F6, 0x4E52, 0x0370, + 0x4E53, 0x0371, 0x4E56, 0x0529, 0x4E58, 0x0831, 0x4E59, 0x0254, 0x4E5A, + 0x36B1, 0x4E5C, 0x176D, 0x4E5D, 0x0258, 0x4E5E, 0x0271, 0x4E5F, 0x0270, + 0x4E69, 0x0372, 0x4E73, 0x052A, 0x4E7E, 0x09FB, 0x4E7F, 0x1E35, 0x4E82, + 0x0DBE, 0x4E83, 0x2361, 0x4E84, 0x2362, 0x4E85, 0x021B, 0x4E86, 0x0259, + 0x4E88, 0x029A, 0x4E8B, 0x052B, 0x4E8C, 0x025A, 0x4E8D, 0x1774, 0x4E8E, + 0x0272, 0x4E91, 0x029B, 0x4E92, 0x029D, 0x4E93, 0x177C, 0x4E94, 0x029E, + 0x4E95, 0x029C, 0x4E99, 0x0373, 0x4E9B, 0x052C, 0x4E9E, 0x052D, 0x4E9F, + 0x06A3, 0x4EA0, 0x021C, 0x4EA1, 0x0273, 0x4EA2, 0x029F, 0x4EA4, 0x0374, + 0x4EA5, 0x0376, 0x4EA6, 0x0375, 0x4EA8, 0x0416, 0x4EAB, 0x052E, 0x4EAC, + 0x052F, 0x4EAD, 0x06A4, 0x4EAE, 0x06A5, 0x4EB3, 0x0832, 0x4EB6, 0x2363, + 0x4EB9, 0x3377, 0x4EBA, 0x025B, 0x4EC0, 0x02A1, 0x4EC1, 0x02A0, 0x4EC2, + 0x177D, 0x4EC3, 0x02A2, 0x4EC4, 0x02A8, 0x4EC6, 0x02A3, 0x4EC7, 0x02A4, + 0x4EC8, 0x177F, 0x4EC9, 0x177E, 0x4ECA, 0x02A6, 0x4ECB, 0x02A7, 0x4ECD, + 0x02A5, 0x4ED4, 0x02FA, 0x4ED5, 0x02FB, 0x4ED6, 0x02FC, 0x4ED7, 0x02FD, + 0x4ED8, 0x02F9, 0x4ED9, 0x0300, 0x4EDA, 0x1795, 0x4EDC, 0x1791, 0x4EDD, + 0x1794, 0x4EDE, 0x0301, 0x4EDF, 0x0311, 0x4EE1, 0x1793, 0x4EE3, 0x02FE, + 0x4EE4, 0x02FF, 0x4EE5, 0x02F8, 0x4EE8, 0x1790, 0x4EE9, 0x1792, 0x4EF0, + 0x0383, 0x4EF1, 0x17BA, 0x4EF2, 0x0380, 0x4EF3, 0x0384, 0x4EF4, 0x17C4, + 0x4EF5, 0x17B8, 0x4EF6, 0x0381, 0x4EF7, 0x17BC, 0x4EFB, 0x0382, 0x4EFD, + 0x0385, 0x4EFF, 0x0377, 0x4F00, 0x17BB, 0x4F01, 0x0386, 0x4F02, 0x17BF, + 0x4F04, 0x17C3, 0x4F05, 0x17C0, 0x4F08, 0x17BD, 0x4F09, 0x0378, 0x4F0A, + 0x037A, 0x4F0B, 0x0387, 0x4F0D, 0x037C, 0x4F0E, 0x17B5, 0x4F0F, 0x037F, + 0x4F10, 0x037D, 0x4F11, 0x037E, 0x4F12, 0x17C5, 0x4F13, 0x17C2, 0x4F14, + 0x17B9, 0x4F15, 0x037B, 0x4F18, 0x17B6, 0x4F19, 0x0379, 0x4F1D, 0x17BE, + 0x4F22, 0x17C1, 0x4F2C, 0x17B7, 0x4F2D, 0x182F, 0x4F2F, 0x042C, 0x4F30, + 0x041F, 0x4F33, 0x1830, 0x4F34, 0x041C, 0x4F36, 0x042E, 0x4F38, 0x0424, + 0x4F3A, 0x0423, 0x4F3B, 0x1824, 0x4F3C, 0x0427, 0x4F3D, 0x0422, 0x4F3E, + 0x1829, 0x4F3F, 0x1831, 0x4F41, 0x182D, 0x4F43, 0x0425, 0x4F46, 0x0428, + 0x4F47, 0x0419, 0x4F48, 0x0431, 0x4F49, 0x1826, 0x4F4C, 0x1900, 0x4F4D, + 0x0417, 0x4F4E, 0x042D, 0x4F4F, 0x0418, 0x4F50, 0x0420, 0x4F51, 0x0421, + 0x4F52, 0x182B, 0x4F53, 0x1827, 0x4F54, 0x0426, 0x4F55, 0x041E, 0x4F56, + 0x1823, 0x4F57, 0x041A, 0x4F58, 0x182E, 0x4F59, 0x042F, 0x4F5A, 0x0432, + 0x4F5B, 0x041D, 0x4F5C, 0x042A, 0x4F5D, 0x0430, 0x4F5E, 0x041B, 0x4F5F, + 0x182C, 0x4F60, 0x042B, 0x4F61, 0x1832, 0x4F62, 0x1825, 0x4F63, 0x0429, + 0x4F64, 0x1828, 0x4F67, 0x182A, 0x4F69, 0x053D, 0x4F6A, 0x1902, 0x4F6B, + 0x190E, 0x4F6C, 0x0535, 0x4F6E, 0x190F, 0x4F6F, 0x0530, 0x4F70, 0x053A, + 0x4F73, 0x0533, 0x4F74, 0x18FC, 0x4F75, 0x053B, 0x4F76, 0x18FB, 0x4F77, + 0x18FF, 0x4F78, 0x1906, 0x4F79, 0x1904, 0x4F7A, 0x0543, 0x4F7B, 0x053E, + 0x4F7C, 0x18F6, 0x4F7D, 0x18F8, 0x4F7E, 0x0540, 0x4F7F, 0x0534, 0x4F80, + 0x18F9, 0x4F81, 0x1905, 0x4F82, 0x190C, 0x4F83, 0x0539, 0x4F84, 0x18FE, + 0x4F85, 0x18F7, 0x4F86, 0x0538, 0x4F87, 0x18FA, 0x4F88, 0x053C, 0x4F89, + 0x18FD, 0x4F8B, 0x0537, 0x4F8D, 0x0532, 0x4F8F, 0x0541, 0x4F90, 0x1907, + 0x4F91, 0x0542, 0x4F92, 0x190B, 0x4F94, 0x1909, 0x4F95, 0x190D, 0x4F96, + 0x053F, 0x4F97, 0x1901, 0x4F98, 0x18F5, 0x4F9A, 0x1903, 0x4F9B, 0x0536, + 0x4F9C, 0x1908, 0x4F9D, 0x0531, 0x4F9E, 0x190A, 0x4FAE, 0x06B4, 0x4FAF, + 0x06A8, 0x4FB2, 0x1A5D, 0x4FB3, 0x1A65, 0x4FB5, 0x06A7, 0x4FB6, 0x06AF, + 0x4FB7, 0x06BB, 0x4FB9, 0x1A6B, 0x4FBA, 0x1A69, 0x4FBB, 0x1A64, 0x4FBF, + 0x06A9, 0x4FC0, 0x1A6A, 0x4FC1, 0x1A60, 0x4FC2, 0x06B7, 0x4FC3, 0x06AE, + 0x4FC4, 0x06B6, 0x4FC5, 0x1A5B, 0x4FC7, 0x1A67, 0x4FC9, 0x1A5E, 0x4FCA, + 0x06B2, 0x4FCB, 0x1A5F, 0x4FCD, 0x1A5A, 0x4FCE, 0x06B9, 0x4FCF, 0x06AC, + 0x4FD0, 0x06B5, 0x4FD1, 0x06AB, 0x4FD3, 0x1A5C, 0x4FD4, 0x1A61, 0x4FD6, + 0x1A68, 0x4FD7, 0x06B3, 0x4FD8, 0x06B0, 0x4FD9, 0x1A63, 0x4FDA, 0x06B8, + 0x4FDB, 0x1A66, 0x4FDC, 0x1A62, 0x4FDD, 0x06AD, 0x4FDE, 0x06BA, 0x4FDF, + 0x06B1, 0x4FE0, 0x06AA, 0x4FE1, 0x06A6, 0x4FEC, 0x1A6C, 0x4FEE, 0x084C, + 0x4FEF, 0x0836, 0x4FF1, 0x0846, 0x4FF3, 0x084B, 0x4FF4, 0x1C24, 0x4FF5, + 0x1C23, 0x4FF6, 0x1C28, 0x4FF7, 0x1C29, 0x4FF8, 0x0839, 0x4FFA, 0x0842, + 0x4FFE, 0x084F, 0x5000, 0x0843, 0x5005, 0x1C1D, 0x5006, 0x083C, 0x5007, + 0x1C1E, 0x5009, 0x0851, 0x500B, 0x0848, 0x500C, 0x0833, 0x500D, 0x0834, + 0x500E, 0x1C31, 0x500F, 0x0A0C, 0x5011, 0x0841, 0x5012, 0x0840, 0x5013, + 0x1C1F, 0x5014, 0x0844, 0x5015, 0x1E45, 0x5016, 0x083B, 0x5017, 0x1C2A, + 0x5018, 0x084A, 0x5019, 0x0849, 0x501A, 0x083F, 0x501B, 0x1C22, 0x501C, + 0x1C2B, 0x501E, 0x1C1C, 0x501F, 0x083E, 0x5020, 0x1C2C, 0x5021, 0x0847, + 0x5022, 0x1C20, 0x5023, 0x0835, 0x5025, 0x0838, 0x5026, 0x0837, 0x5027, + 0x1C2D, 0x5028, 0x0845, 0x5029, 0x083A, 0x502A, 0x084E, 0x502B, 0x0850, + 0x502C, 0x1C27, 0x502D, 0x084D, 0x502F, 0x1C2F, 0x5030, 0x1C21, 0x5031, + 0x1C30, 0x5033, 0x1C25, 0x5035, 0x1C2E, 0x5037, 0x1C26, 0x503C, 0x083D, + 0x5040, 0x1E4D, 0x5041, 0x1E41, 0x5043, 0x0A00, 0x5045, 0x1E46, 0x5046, + 0x1E4C, 0x5047, 0x09FF, 0x5048, 0x1E3F, 0x5049, 0x0A03, 0x504A, 0x1E43, + 0x504B, 0x1E3C, 0x504C, 0x0A01, 0x504D, 0x1E40, 0x504E, 0x0A06, 0x504F, + 0x0A0B, 0x5051, 0x1E51, 0x5053, 0x1E3B, 0x5055, 0x0A07, 0x5057, 0x1E50, + 0x505A, 0x0A02, 0x505B, 0x1E42, 0x505C, 0x09FE, 0x505D, 0x1E3D, 0x505E, + 0x1E39, 0x505F, 0x1E47, 0x5060, 0x1E3A, 0x5061, 0x1E38, 0x5062, 0x1E44, + 0x5063, 0x1E4A, 0x5064, 0x1E4B, 0x5065, 0x0A04, 0x5068, 0x20B8, 0x5069, + 0x1E48, 0x506A, 0x1E37, 0x506B, 0x1E49, 0x506D, 0x0A0E, 0x506E, 0x1E4E, + 0x506F, 0x0A0D, 0x5070, 0x1E36, 0x5072, 0x1E3E, 0x5073, 0x1E4F, 0x5074, + 0x0A09, 0x5075, 0x0A08, 0x5076, 0x0A05, 0x5077, 0x0A0A, 0x507A, 0x09FC, + 0x507D, 0x09FD, 0x5080, 0x0BEC, 0x5082, 0x20BB, 0x5083, 0x20B4, 0x5085, + 0x0BE9, 0x5087, 0x20BC, 0x508B, 0x20B2, 0x508C, 0x20B5, 0x508D, 0x0BE8, + 0x508E, 0x20B6, 0x5091, 0x0BEB, 0x5092, 0x20BA, 0x5094, 0x20B0, 0x5095, + 0x20AF, 0x5096, 0x0BED, 0x5098, 0x0BEE, 0x5099, 0x0BEA, 0x509A, 0x0BEF, + 0x509B, 0x20AE, 0x509C, 0x20B9, 0x509D, 0x20B7, 0x509E, 0x20B1, 0x50A2, + 0x0BE7, 0x50A3, 0x20B3, 0x50AC, 0x0DC5, 0x50AD, 0x0DBF, 0x50AE, 0x2367, + 0x50AF, 0x0DC8, 0x50B0, 0x236D, 0x50B1, 0x2370, 0x50B2, 0x0DC1, 0x50B3, + 0x0DC2, 0x50B4, 0x236A, 0x50B5, 0x0DC0, 0x50B6, 0x2373, 0x50B7, 0x0DC6, + 0x50B8, 0x2374, 0x50BA, 0x236F, 0x50BB, 0x0DC7, 0x50BD, 0x2364, 0x50BE, + 0x0DC4, 0x50BF, 0x2365, 0x50C1, 0x236E, 0x50C2, 0x236C, 0x50C4, 0x2368, + 0x50C5, 0x0DC3, 0x50C6, 0x2366, 0x50C7, 0x0DC9, 0x50C8, 0x236B, 0x50C9, + 0x2372, 0x50CA, 0x2369, 0x50CB, 0x2371, 0x50CE, 0x0F88, 0x50CF, 0x0F85, + 0x50D1, 0x0F86, 0x50D3, 0x261C, 0x50D4, 0x2614, 0x50D5, 0x0F84, 0x50D6, + 0x0F81, 0x50D7, 0x2615, 0x50DA, 0x0F83, 0x50DB, 0x2618, 0x50DD, 0x261A, + 0x50E0, 0x2621, 0x50E3, 0x2620, 0x50E4, 0x261B, 0x50E5, 0x0F80, 0x50E6, + 0x2613, 0x50E7, 0x0F7E, 0x50E8, 0x2616, 0x50E9, 0x0F89, 0x50EA, 0x2619, + 0x50EC, 0x261D, 0x50ED, 0x0F82, 0x50EE, 0x0F7F, 0x50EF, 0x261F, 0x50F0, + 0x261E, 0x50F1, 0x0F87, 0x50F3, 0x2617, 0x50F5, 0x1105, 0x50F6, 0x2883, + 0x50F8, 0x2880, 0x50F9, 0x1106, 0x50FB, 0x1104, 0x50FD, 0x2887, 0x50FE, + 0x2884, 0x50FF, 0x287D, 0x5100, 0x1103, 0x5102, 0x1107, 0x5103, 0x287E, + 0x5104, 0x1102, 0x5105, 0x110A, 0x5106, 0x2881, 0x5107, 0x2882, 0x5108, + 0x1108, 0x5109, 0x1109, 0x510A, 0x2888, 0x510B, 0x2885, 0x510C, 0x2886, + 0x5110, 0x128D, 0x5111, 0x2B04, 0x5112, 0x128A, 0x5113, 0x2B01, 0x5114, + 0x128C, 0x5115, 0x128E, 0x5117, 0x2B02, 0x5118, 0x128B, 0x511A, 0x2B03, + 0x511C, 0x2B00, 0x511F, 0x13B5, 0x5120, 0x2D3E, 0x5121, 0x13B6, 0x5122, + 0x2D3C, 0x5124, 0x2D3D, 0x5125, 0x2D3B, 0x5126, 0x2D3A, 0x5129, 0x2D3F, + 0x512A, 0x13B4, 0x512D, 0x2F0F, 0x512E, 0x2F10, 0x5130, 0x287F, 0x5131, + 0x2F0E, 0x5132, 0x13B7, 0x5133, 0x1575, 0x5134, 0x307A, 0x5135, 0x307B, + 0x5137, 0x1668, 0x5138, 0x1669, 0x5139, 0x32C6, 0x513A, 0x32C5, 0x513B, + 0x16BC, 0x513C, 0x16BB, 0x513D, 0x340E, 0x513F, 0x025C, 0x5140, 0x0274, + 0x5141, 0x02AA, 0x5143, 0x02A9, 0x5144, 0x0303, 0x5145, 0x0302, 0x5146, + 0x038A, 0x5147, 0x0389, 0x5148, 0x038B, 0x5149, 0x0388, 0x514B, 0x0434, + 0x514C, 0x0433, 0x514D, 0x0435, 0x5152, 0x0545, 0x5154, 0x0544, 0x5155, + 0x0546, 0x5157, 0x06BC, 0x5159, 0x0119, 0x515A, 0x1C32, 0x515B, 0x011A, + 0x515C, 0x0A0F, 0x515D, 0x011C, 0x515E, 0x011B, 0x515F, 0x20BD, 0x5161, + 0x011D, 0x5162, 0x0F8A, 0x5163, 0x011E, 0x5165, 0x025D, 0x5167, 0x02AB, + 0x5168, 0x038C, 0x5169, 0x0547, 0x516B, 0x025E, 0x516C, 0x02AE, 0x516D, + 0x02AC, 0x516E, 0x02AD, 0x5171, 0x038D, 0x5175, 0x0436, 0x5176, 0x0549, + 0x5177, 0x0548, 0x5178, 0x054A, 0x517C, 0x0852, 0x5180, 0x128F, 0x5182, + 0x021D, 0x5187, 0x1779, 0x5188, 0x36B6, 0x5189, 0x0304, 0x518A, 0x0305, + 0x518D, 0x038E, 0x518F, 0x1833, 0x5191, 0x06BE, 0x5192, 0x06BD, 0x5193, + 0x1C34, 0x5194, 0x1C33, 0x5195, 0x0A10, 0x5196, 0x021E, 0x5197, 0x02AF, + 0x5198, 0x1780, 0x519E, 0x1910, 0x51A0, 0x06BF, 0x51A2, 0x0855, 0x51A4, + 0x0853, 0x51A5, 0x0854, 0x51AA, 0x1290, 0x51AB, 0x021F, 0x51AC, 0x0306, + 0x51B0, 0x038F, 0x51B1, 0x17C6, 0x51B6, 0x0437, 0x51B7, 0x0438, 0x51B9, + 0x1834, 0x51BC, 0x1911, 0x51BD, 0x054B, 0x51BE, 0x1912, 0x51C4, 0x1C36, + 0x51C5, 0x1C37, 0x51C6, 0x0858, 0x51C8, 0x1C38, 0x51CA, 0x1C35, 0x51CB, + 0x0859, 0x51CC, 0x0857, 0x51CD, 0x0856, 0x51CE, 0x1C39, 0x51D0, 0x1E52, + 0x51D4, 0x20BE, 0x51D7, 0x2375, 0x51D8, 0x2622, 0x51DC, 0x110B, 0x51DD, + 0x1291, 0x51DE, 0x2B05, 0x51E0, 0x025F, 0x51E1, 0x026D, 0x51F0, 0x0A11, + 0x51F1, 0x0BF1, 0x51F3, 0x0F8B, 0x51F5, 0x176E, 0x51F6, 0x02B0, 0x51F8, + 0x0309, 0x51F9, 0x0307, 0x51FA, 0x0308, 0x51FD, 0x054C, 0x5200, 0x0260, + 0x5201, 0x0261, 0x5202, 0x36B3, 0x5203, 0x0275, 0x5206, 0x02B1, 0x5207, + 0x02B2, 0x5208, 0x02B3, 0x5209, 0x1797, 0x520A, 0x030A, 0x520C, 0x1796, + 0x520E, 0x0393, 0x5210, 0x17C8, 0x5211, 0x0391, 0x5212, 0x0392, 0x5213, + 0x17C7, 0x5216, 0x0394, 0x5217, 0x0390, 0x521C, 0x1835, 0x521D, 0x068B, + 0x521E, 0x1836, 0x5221, 0x1837, 0x5224, 0x043A, 0x5225, 0x0439, 0x5228, + 0x043D, 0x5229, 0x043B, 0x522A, 0x043C, 0x522E, 0x0552, 0x5230, 0x0551, + 0x5231, 0x1917, 0x5232, 0x1914, 0x5233, 0x1915, 0x5235, 0x1913, 0x5236, + 0x0553, 0x5237, 0x054F, 0x5238, 0x054E, 0x523A, 0x0550, 0x523B, 0x054D, + 0x5241, 0x0554, 0x5243, 0x06C1, 0x5244, 0x1A6D, 0x5246, 0x1916, 0x5247, + 0x06C6, 0x5249, 0x1A6E, 0x524A, 0x06C2, 0x524B, 0x06C5, 0x524C, 0x06C4, + 0x524D, 0x06C3, 0x524E, 0x06C0, 0x5252, 0x1C3C, 0x5254, 0x085C, 0x5255, + 0x1C3F, 0x5256, 0x085A, 0x525A, 0x1C3B, 0x525B, 0x085D, 0x525C, 0x085B, + 0x525D, 0x085E, 0x525E, 0x1C3D, 0x525F, 0x1C3E, 0x5261, 0x1C3A, 0x5262, + 0x1C40, 0x5269, 0x0BF5, 0x526A, 0x0A12, 0x526B, 0x1E53, 0x526C, 0x1E55, + 0x526D, 0x1E54, 0x526E, 0x1E56, 0x526F, 0x0A13, 0x5272, 0x0BF2, 0x5274, + 0x0BF3, 0x5275, 0x0BF4, 0x5277, 0x0DCB, 0x5278, 0x2377, 0x527A, 0x2376, + 0x527B, 0x2378, 0x527C, 0x2379, 0x527D, 0x0DCC, 0x527F, 0x0DCA, 0x5280, + 0x2623, 0x5281, 0x2624, 0x5282, 0x0F8D, 0x5283, 0x0F8C, 0x5284, 0x2776, + 0x5287, 0x110C, 0x5288, 0x110D, 0x5289, 0x110E, 0x528A, 0x1110, 0x528B, + 0x2889, 0x528C, 0x288A, 0x528D, 0x110F, 0x5291, 0x1292, 0x5293, 0x1293, + 0x5296, 0x307C, 0x5297, 0x32C8, 0x5298, 0x32C7, 0x5299, 0x340F, 0x529B, + 0x0262, 0x529F, 0x030C, 0x52A0, 0x030B, 0x52A3, 0x0395, 0x52A6, 0x17C9, + 0x52A9, 0x043F, 0x52AA, 0x0440, 0x52AB, 0x043E, 0x52AC, 0x0441, 0x52AD, + 0x1838, 0x52AE, 0x1839, 0x52BB, 0x0556, 0x52BC, 0x1918, 0x52BE, 0x0555, + 0x52C0, 0x1A6F, 0x52C1, 0x06CA, 0x52C2, 0x1A70, 0x52C3, 0x06C9, 0x52C7, + 0x06C7, 0x52C9, 0x06C8, 0x52CD, 0x1C41, 0x52D2, 0x0A14, 0x52D3, 0x1E58, + 0x52D5, 0x0A17, 0x52D6, 0x1E57, 0x52D7, 0x0ACF, 0x52D8, 0x0A16, 0x52D9, + 0x0A15, 0x52DB, 0x0BF8, 0x52DD, 0x0BF7, 0x52DE, 0x0BF6, 0x52DF, 0x0DCD, + 0x52E2, 0x0DD0, 0x52E3, 0x0DD1, 0x52E4, 0x0DCF, 0x52E6, 0x0DCE, 0x52E9, + 0x2625, 0x52EB, 0x2626, 0x52EF, 0x288C, 0x52F0, 0x1111, 0x52F1, 0x288B, + 0x52F3, 0x1294, 0x52F4, 0x2D40, 0x52F5, 0x13B8, 0x52F7, 0x307D, 0x52F8, + 0x1609, 0x52F9, 0x0220, 0x52FA, 0x0276, 0x52FB, 0x02B4, 0x52FC, 0x1781, + 0x52FE, 0x02B5, 0x52FF, 0x02B6, 0x5305, 0x030D, 0x5306, 0x030E, 0x5308, + 0x0396, 0x5309, 0x183A, 0x530A, 0x1919, 0x530B, 0x191A, 0x530D, 0x06CB, + 0x530E, 0x1C42, 0x530F, 0x0A19, 0x5310, 0x0A18, 0x5311, 0x20C0, 0x5312, + 0x20BF, 0x5315, 0x0263, 0x5316, 0x02B7, 0x5317, 0x030F, 0x5319, 0x0A1A, + 0x531A, 0x176F, 0x531C, 0x1798, 0x531D, 0x0310, 0x531F, 0x17CB, 0x5320, + 0x0398, 0x5321, 0x0397, 0x5322, 0x17CA, 0x5323, 0x0442, 0x532A, 0x085F, + 0x532D, 0x1E59, 0x532F, 0x0DD2, 0x5330, 0x2627, 0x5331, 0x0F8E, 0x5334, + 0x2B06, 0x5337, 0x31C7, 0x5338, 0x0221, 0x5339, 0x02B8, 0x533C, 0x191B, + 0x533D, 0x1A71, 0x533E, 0x0A1D, 0x533F, 0x0A1B, 0x5340, 0x0A1C, 0x5341, + 0x0264, 0x5343, 0x0277, 0x5344, 0x016B, 0x5345, 0x02BB, 0x5347, 0x02BA, + 0x5348, 0x02B9, 0x5349, 0x0313, 0x534A, 0x0312, 0x534C, 0x1799, 0x534D, + 0x17CC, 0x5351, 0x055A, 0x5352, 0x0557, 0x5353, 0x0559, 0x5354, 0x0558, + 0x5357, 0x06CC, 0x535A, 0x0BF9, 0x535C, 0x0265, 0x535E, 0x02BC, 0x5360, + 0x0315, 0x5361, 0x0314, 0x5363, 0x183B, 0x5366, 0x055B, 0x5369, 0x0222, + 0x536C, 0x1782, 0x536E, 0x0317, 0x536F, 0x0316, 0x5370, 0x0399, 0x5371, + 0x039A, 0x5372, 0x183C, 0x5373, 0x0443, 0x5375, 0x0444, 0x5377, 0x055C, + 0x5378, 0x055D, 0x5379, 0x055E, 0x537B, 0x06CD, 0x537C, 0x1A72, 0x537F, + 0x0860, 0x5382, 0x1770, 0x5384, 0x02BD, 0x538A, 0x17CD, 0x538E, 0x183D, + 0x538F, 0x183E, 0x5392, 0x191C, 0x5394, 0x191D, 0x5396, 0x1A74, 0x5397, + 0x1A73, 0x5398, 0x1A76, 0x5399, 0x1A75, 0x539A, 0x06CE, 0x539C, 0x1E5A, + 0x539D, 0x0862, 0x539E, 0x1C43, 0x539F, 0x0861, 0x53A4, 0x20C1, 0x53A5, + 0x0BFA, 0x53A7, 0x20C2, 0x53AC, 0x2628, 0x53AD, 0x0F8F, 0x53B2, 0x1112, + 0x53B4, 0x307E, 0x53B6, 0x0223, 0x53B9, 0x1783, 0x53BB, 0x0318, 0x53C3, + 0x0A1E, 0x53C8, 0x0266, 0x53C9, 0x0278, 0x53CA, 0x02BF, 0x53CB, 0x02BE, + 0x53CD, 0x02C0, 0x53D4, 0x0560, 0x53D6, 0x055F, 0x53D7, 0x0561, 0x53DB, + 0x06CF, 0x53DF, 0x0863, 0x53E1, 0x2B07, 0x53E2, 0x14C9, 0x53E3, 0x0279, + 0x53E4, 0x031A, 0x53E5, 0x0329, 0x53E6, 0x0324, 0x53E8, 0x031F, 0x53E9, + 0x031E, 0x53EA, 0x0325, 0x53EB, 0x0323, 0x53EC, 0x031C, 0x53ED, 0x032A, + 0x53EE, 0x031D, 0x53EF, 0x0319, 0x53F0, 0x0328, 0x53F1, 0x0327, 0x53F2, + 0x0326, 0x53F3, 0x031B, 0x53F5, 0x0322, 0x53F8, 0x0321, 0x53FB, 0x032B, + 0x53FC, 0x0320, 0x5401, 0x03A0, 0x5403, 0x03A6, 0x5404, 0x03A2, 0x5406, + 0x03A8, 0x5407, 0x17CE, 0x5408, 0x03A5, 0x5409, 0x039B, 0x540A, 0x039E, + 0x540B, 0x03A1, 0x540C, 0x039D, 0x540D, 0x03A4, 0x540E, 0x03A7, 0x540F, + 0x039C, 0x5410, 0x039F, 0x5411, 0x03A3, 0x5412, 0x03A9, 0x5418, 0x1847, + 0x5419, 0x1844, 0x541B, 0x0451, 0x541C, 0x1845, 0x541D, 0x0445, 0x541E, + 0x0447, 0x541F, 0x045F, 0x5420, 0x045A, 0x5424, 0x184C, 0x5425, 0x1846, + 0x5426, 0x0449, 0x5427, 0x044B, 0x5428, 0x184B, 0x5429, 0x0452, 0x542A, + 0x1841, 0x542B, 0x045E, 0x542C, 0x0460, 0x542D, 0x0446, 0x542E, 0x0457, + 0x5430, 0x183F, 0x5431, 0x045D, 0x5433, 0x044E, 0x5435, 0x0458, 0x5436, + 0x0459, 0x5437, 0x1840, 0x5438, 0x0456, 0x5439, 0x0454, 0x543B, 0x0455, + 0x543C, 0x045B, 0x543D, 0x1848, 0x543E, 0x0448, 0x5440, 0x045C, 0x5441, + 0x184A, 0x5442, 0x0450, 0x5443, 0x044D, 0x5445, 0x1843, 0x5446, 0x044C, + 0x5447, 0x184D, 0x5448, 0x044F, 0x544A, 0x0453, 0x544E, 0x044A, 0x544F, + 0x1849, 0x5454, 0x1842, 0x5460, 0x192E, 0x5461, 0x192D, 0x5462, 0x0573, + 0x5463, 0x1930, 0x5464, 0x1932, 0x5465, 0x1927, 0x5466, 0x192A, 0x5467, + 0x1931, 0x5468, 0x0574, 0x546B, 0x1924, 0x546C, 0x1928, 0x546F, 0x192C, + 0x5470, 0x1A85, 0x5471, 0x056F, 0x5472, 0x1A89, 0x5473, 0x0562, 0x5474, + 0x1929, 0x5475, 0x0563, 0x5476, 0x0570, 0x5477, 0x0569, 0x5478, 0x0565, + 0x547A, 0x1925, 0x547B, 0x0568, 0x547C, 0x056D, 0x547D, 0x0576, 0x547E, + 0x1926, 0x547F, 0x191F, 0x5480, 0x0567, 0x5481, 0x1920, 0x5482, 0x1922, + 0x5484, 0x056A, 0x5486, 0x056C, 0x5487, 0x191E, 0x5488, 0x1923, 0x548B, + 0x0575, 0x548C, 0x0571, 0x548D, 0x192B, 0x548E, 0x0577, 0x5490, 0x056E, + 0x5491, 0x1921, 0x5492, 0x056B, 0x5495, 0x0566, 0x5496, 0x0564, 0x5498, + 0x192F, 0x549A, 0x0572, 0x54A0, 0x1A84, 0x54A1, 0x1A78, 0x54A2, 0x1A87, + 0x54A5, 0x1A7A, 0x54A6, 0x06D6, 0x54A7, 0x06E4, 0x54A8, 0x06D2, 0x54A9, + 0x06E3, 0x54AA, 0x06DB, 0x54AB, 0x06E0, 0x54AC, 0x06D0, 0x54AD, 0x1A79, + 0x54AE, 0x1A7F, 0x54AF, 0x06DF, 0x54B0, 0x1A8B, 0x54B1, 0x06E1, 0x54B3, + 0x06D7, 0x54B6, 0x1A81, 0x54B7, 0x1A7E, 0x54B8, 0x06D5, 0x54BA, 0x1A77, + 0x54BB, 0x06E2, 0x54BC, 0x1A86, 0x54BD, 0x06DA, 0x54BE, 0x1A88, 0x54BF, + 0x06E5, 0x54C0, 0x06D1, 0x54C1, 0x06DC, 0x54C2, 0x06D9, 0x54C3, 0x1A7C, + 0x54C4, 0x06DD, 0x54C5, 0x1A82, 0x54C6, 0x1A83, 0x54C7, 0x06D8, 0x54C8, + 0x06DE, 0x54C9, 0x06D4, 0x54CE, 0x06D3, 0x54CF, 0x1A7B, 0x54D6, 0x1A80, + 0x54DE, 0x1A8A, 0x54E0, 0x1C57, 0x54E1, 0x0870, 0x54E2, 0x1C45, 0x54E4, + 0x1C4A, 0x54E5, 0x0869, 0x54E6, 0x0874, 0x54E7, 0x1C48, 0x54E8, 0x0864, + 0x54E9, 0x086E, 0x54EA, 0x0873, 0x54EB, 0x1C4F, 0x54ED, 0x086F, 0x54EE, + 0x0872, 0x54F1, 0x1C52, 0x54F2, 0x086A, 0x54F3, 0x1C49, 0x54F7, 0x1C55, + 0x54F8, 0x1C56, 0x54FA, 0x086C, 0x54FB, 0x1C54, 0x54FC, 0x0868, 0x54FD, + 0x0877, 0x54FF, 0x1C4C, 0x5501, 0x0866, 0x5503, 0x1C59, 0x5504, 0x1C4D, + 0x5505, 0x1C51, 0x5506, 0x086B, 0x5507, 0x0876, 0x5508, 0x1C4E, 0x5509, + 0x0871, 0x550A, 0x1C53, 0x550B, 0x1C5A, 0x550C, 0x1E69, 0x550E, 0x1C58, + 0x550F, 0x0878, 0x5510, 0x0865, 0x5511, 0x1C50, 0x5512, 0x1C47, 0x5514, + 0x086D, 0x5517, 0x1C46, 0x551A, 0x1C4B, 0x5526, 0x1C44, 0x5527, 0x0875, + 0x552A, 0x1E61, 0x552C, 0x0A31, 0x552D, 0x1E6F, 0x552E, 0x0A2F, 0x552F, + 0x0A2C, 0x5530, 0x1E66, 0x5531, 0x0A28, 0x5532, 0x1E6A, 0x5533, 0x0A33, + 0x5534, 0x1E60, 0x5535, 0x1E65, 0x5536, 0x1E64, 0x5537, 0x0867, 0x5538, + 0x0A2E, 0x5539, 0x1E6D, 0x553B, 0x1E70, 0x553C, 0x1E5D, 0x553E, 0x0C0C, + 0x5540, 0x1E71, 0x5541, 0x0A34, 0x5543, 0x0A26, 0x5544, 0x0A23, 0x5545, + 0x1E68, 0x5546, 0x0A20, 0x5548, 0x1E6E, 0x554A, 0x0A27, 0x554B, 0x1E72, + 0x554D, 0x1E5E, 0x554E, 0x1E6C, 0x554F, 0x0A2A, 0x5550, 0x1E5F, 0x5551, + 0x1E62, 0x5552, 0x1E67, 0x5555, 0x0A2B, 0x5556, 0x0A29, 0x5557, 0x0A35, + 0x555C, 0x0A30, 0x555E, 0x0A24, 0x555F, 0x0ABC, 0x5561, 0x0A25, 0x5562, + 0x1E63, 0x5563, 0x0A32, 0x5564, 0x0A2D, 0x5565, 0x1E6B, 0x5566, 0x0A22, + 0x556A, 0x0A21, 0x5575, 0x1E5B, 0x5576, 0x1E5C, 0x5577, 0x20C7, 0x557B, + 0x0BFB, 0x557C, 0x0BFE, 0x557D, 0x20D2, 0x557E, 0x0C12, 0x557F, 0x20D5, + 0x5580, 0x0BFC, 0x5581, 0x20CE, 0x5582, 0x0C02, 0x5583, 0x0C08, 0x5584, + 0x0D1B, 0x5587, 0x0C06, 0x5588, 0x20CB, 0x5589, 0x0C13, 0x558A, 0x0BFF, + 0x558B, 0x0C07, 0x558C, 0x20D3, 0x558D, 0x2387, 0x558E, 0x20D8, 0x558F, + 0x20CC, 0x5591, 0x20C3, 0x5592, 0x20D0, 0x5593, 0x20CA, 0x5594, 0x0C05, + 0x5595, 0x20D6, 0x5598, 0x0C01, 0x5599, 0x0C15, 0x559A, 0x0C0E, 0x559C, + 0x0C03, 0x559D, 0x0C00, 0x559F, 0x0C0B, 0x55A1, 0x20D7, 0x55A2, 0x20C9, + 0x55A3, 0x20CF, 0x55A4, 0x20D1, 0x55A5, 0x20C5, 0x55A6, 0x20D4, 0x55A7, + 0x0BFD, 0x55A8, 0x20C4, 0x55AA, 0x0C04, 0x55AB, 0x0C14, 0x55AC, 0x0C10, + 0x55AD, 0x20C6, 0x55AE, 0x0C0A, 0x55B1, 0x0C11, 0x55B2, 0x0C0D, 0x55B3, + 0x0C09, 0x55B5, 0x20CD, 0x55BB, 0x0C0F, 0x55BF, 0x2385, 0x55C0, 0x2381, + 0x55C2, 0x2390, 0x55C3, 0x237A, 0x55C4, 0x2383, 0x55C5, 0x0DE0, 0x55C6, + 0x0DE1, 0x55C7, 0x0DD9, 0x55C8, 0x238C, 0x55C9, 0x0DE3, 0x55CA, 0x237F, + 0x55CB, 0x237E, 0x55CC, 0x237C, 0x55CD, 0x238E, 0x55CE, 0x0DD7, 0x55CF, + 0x2388, 0x55D0, 0x237D, 0x55D1, 0x0DDA, 0x55D2, 0x2386, 0x55D3, 0x0DD5, + 0x55D4, 0x2382, 0x55D5, 0x2389, 0x55D6, 0x238B, 0x55D9, 0x238F, 0x55DA, + 0x0DDE, 0x55DB, 0x237B, 0x55DC, 0x0DD8, 0x55DD, 0x2380, 0x55DF, 0x0DD3, + 0x55E1, 0x0DDF, 0x55E2, 0x238A, 0x55E3, 0x0DDB, 0x55E4, 0x0DDC, 0x55E5, + 0x0DE2, 0x55E6, 0x0DD6, 0x55E7, 0x011F, 0x55E8, 0x0DD4, 0x55E9, 0x2384, + 0x55EF, 0x0DDD, 0x55F2, 0x238D, 0x55F6, 0x0F9F, 0x55F7, 0x0F9A, 0x55F9, + 0x2637, 0x55FA, 0x2633, 0x55FC, 0x262D, 0x55FD, 0x0F94, 0x55FE, 0x0F90, + 0x55FF, 0x2636, 0x5600, 0x0F91, 0x5601, 0x2630, 0x5602, 0x2632, 0x5604, + 0x2635, 0x5606, 0x0F96, 0x5608, 0x0F9D, 0x5609, 0x0F97, 0x560C, 0x262B, + 0x560D, 0x0F98, 0x560E, 0x0F99, 0x560F, 0x262E, 0x5610, 0x0F9E, 0x5612, + 0x262C, 0x5613, 0x2631, 0x5614, 0x0F95, 0x5615, 0x262A, 0x5616, 0x0F9B, + 0x5617, 0x0F93, 0x561B, 0x0F92, 0x561C, 0x262F, 0x561D, 0x2634, 0x561F, + 0x0F9C, 0x5627, 0x2629, 0x5629, 0x1119, 0x562A, 0x289D, 0x562C, 0x289A, + 0x562E, 0x1113, 0x562F, 0x111F, 0x5630, 0x1120, 0x5632, 0x1116, 0x5633, + 0x2898, 0x5634, 0x1118, 0x5635, 0x2890, 0x5636, 0x111E, 0x5638, 0x289C, + 0x5639, 0x1115, 0x563A, 0x289E, 0x563B, 0x1114, 0x563D, 0x2899, 0x563E, + 0x289B, 0x563F, 0x1117, 0x5640, 0x2897, 0x5641, 0x2891, 0x5642, 0x288E, + 0x5645, 0x20C8, 0x5646, 0x2894, 0x5648, 0x288D, 0x5649, 0x2893, 0x564A, + 0x2892, 0x564C, 0x288F, 0x564E, 0x111B, 0x5653, 0x111A, 0x5657, 0x111C, + 0x5658, 0x2895, 0x5659, 0x1295, 0x565A, 0x2896, 0x565E, 0x2B10, 0x5660, + 0x2B09, 0x5662, 0x12A1, 0x5663, 0x2B0D, 0x5664, 0x1299, 0x5665, 0x129D, + 0x5666, 0x2B0C, 0x5668, 0x129C, 0x5669, 0x1298, 0x566A, 0x129B, 0x566B, + 0x1296, 0x566C, 0x12A0, 0x566D, 0x2B0E, 0x566E, 0x2B0A, 0x566F, 0x129F, + 0x5670, 0x2B08, 0x5671, 0x129E, 0x5672, 0x2B0F, 0x5673, 0x2B0B, 0x5674, + 0x111D, 0x5676, 0x12A2, 0x5677, 0x2B11, 0x5678, 0x129A, 0x5679, 0x1297, + 0x567E, 0x2D47, 0x567F, 0x2D49, 0x5680, 0x13BA, 0x5681, 0x2D4A, 0x5682, + 0x2D48, 0x5683, 0x2D46, 0x5684, 0x2D45, 0x5685, 0x13BC, 0x5686, 0x2D44, + 0x5687, 0x13BD, 0x568C, 0x2D42, 0x568D, 0x2D43, 0x568E, 0x13B9, 0x568F, + 0x13BE, 0x5690, 0x13BB, 0x5693, 0x2D41, 0x5695, 0x14CA, 0x5697, 0x2F13, + 0x5698, 0x2F11, 0x5699, 0x2F16, 0x569A, 0x2F14, 0x569C, 0x2F12, 0x569D, + 0x2F15, 0x56A5, 0x1576, 0x56A6, 0x3081, 0x56A7, 0x3082, 0x56A8, 0x1577, + 0x56AA, 0x3083, 0x56AB, 0x307F, 0x56AC, 0x3084, 0x56AD, 0x3080, 0x56AE, + 0x14CB, 0x56B2, 0x31C8, 0x56B3, 0x31CA, 0x56B4, 0x160C, 0x56B5, 0x31C9, + 0x56B6, 0x160B, 0x56B7, 0x160A, 0x56BC, 0x160D, 0x56BD, 0x32CA, 0x56BE, + 0x32CB, 0x56C0, 0x166B, 0x56C1, 0x166A, 0x56C2, 0x166C, 0x56C3, 0x32C9, + 0x56C5, 0x3379, 0x56C6, 0x3378, 0x56C8, 0x16BD, 0x56C9, 0x16BF, 0x56CA, + 0x16BE, 0x56CB, 0x337A, 0x56CC, 0x16F6, 0x56CD, 0x3481, 0x56D1, 0x171F, + 0x56D3, 0x3480, 0x56D4, 0x34C9, 0x56D7, 0x1775, 0x56DA, 0x032D, 0x56DB, + 0x032C, 0x56DD, 0x03AC, 0x56DE, 0x03AB, 0x56DF, 0x17D0, 0x56E0, 0x03AA, + 0x56E1, 0x17CF, 0x56E4, 0x0463, 0x56E5, 0x1850, 0x56E7, 0x184F, 0x56EA, + 0x0461, 0x56EB, 0x0464, 0x56EE, 0x184E, 0x56F0, 0x0462, 0x56F7, 0x1933, + 0x56F9, 0x1934, 0x56FA, 0x0578, 0x56FF, 0x06E6, 0x5701, 0x1C5B, 0x5702, + 0x1C5C, 0x5703, 0x0879, 0x5704, 0x087A, 0x5707, 0x1E74, 0x5708, 0x0A36, + 0x5709, 0x0A38, 0x570A, 0x1E73, 0x570B, 0x0A37, 0x570C, 0x20D9, 0x570D, + 0x0C16, 0x5712, 0x0DE4, 0x5713, 0x0DE5, 0x5714, 0x2391, 0x5716, 0x0FA1, + 0x5718, 0x0FA0, 0x571A, 0x289F, 0x571B, 0x2B13, 0x571C, 0x2B12, 0x571E, + 0x3505, 0x571F, 0x027A, 0x5720, 0x1784, 0x5722, 0x179A, 0x5723, 0x179B, + 0x5728, 0x03AF, 0x5729, 0x03B3, 0x572A, 0x17D2, 0x572C, 0x03B1, 0x572D, + 0x03B0, 0x572E, 0x17D1, 0x572F, 0x03B2, 0x5730, 0x03AE, 0x5733, 0x03AD, + 0x5734, 0x17D3, 0x573B, 0x046E, 0x573E, 0x046B, 0x5740, 0x0467, 0x5741, + 0x1851, 0x5745, 0x1852, 0x5747, 0x0469, 0x5749, 0x1854, 0x574A, 0x0465, + 0x574B, 0x1855, 0x574C, 0x1853, 0x574D, 0x0468, 0x574E, 0x046A, 0x574F, + 0x046D, 0x5750, 0x046C, 0x5751, 0x0466, 0x5752, 0x1856, 0x5761, 0x057D, + 0x5762, 0x1941, 0x5764, 0x057F, 0x5766, 0x057E, 0x5768, 0x1942, 0x5769, + 0x057C, 0x576A, 0x057B, 0x576B, 0x1938, 0x576D, 0x1937, 0x576F, 0x1935, + 0x5770, 0x193A, 0x5771, 0x1939, 0x5772, 0x1936, 0x5773, 0x193F, 0x5774, + 0x1940, 0x5775, 0x193D, 0x5776, 0x193B, 0x5777, 0x057A, 0x577B, 0x193E, + 0x577C, 0x0580, 0x577D, 0x1943, 0x5780, 0x193C, 0x5782, 0x06E7, 0x5783, + 0x0579, 0x578B, 0x06E8, 0x578C, 0x1A90, 0x578F, 0x1A96, 0x5793, 0x06EE, + 0x5794, 0x1A94, 0x5795, 0x1A9A, 0x5797, 0x1A91, 0x5798, 0x1A95, 0x5799, + 0x1A97, 0x579A, 0x1A99, 0x579B, 0x1A93, 0x579D, 0x1A92, 0x579E, 0x1A8D, + 0x579F, 0x1A8E, 0x57A0, 0x06E9, 0x57A2, 0x06EB, 0x57A3, 0x06EA, 0x57A4, + 0x1A8F, 0x57A5, 0x1A98, 0x57AE, 0x06ED, 0x57B5, 0x1A8C, 0x57B6, 0x1C66, + 0x57B8, 0x1C65, 0x57B9, 0x1C6A, 0x57BA, 0x1C61, 0x57BC, 0x1C64, 0x57BD, + 0x1C63, 0x57BF, 0x1C67, 0x57C1, 0x1C6B, 0x57C2, 0x087B, 0x57C3, 0x087E, + 0x57C6, 0x1C62, 0x57C7, 0x1C68, 0x57CB, 0x087D, 0x57CC, 0x1C5D, 0x57CE, + 0x06EC, 0x57CF, 0x1E82, 0x57D0, 0x1C69, 0x57D2, 0x1C60, 0x57D4, 0x087C, + 0x57D5, 0x1C5F, 0x57DC, 0x1E79, 0x57DF, 0x0A39, 0x57E0, 0x0A3D, 0x57E1, + 0x1E89, 0x57E2, 0x1E77, 0x57E3, 0x1E85, 0x57E4, 0x0A3E, 0x57E5, 0x1E87, + 0x57E7, 0x1E8D, 0x57E9, 0x1E91, 0x57EC, 0x1E88, 0x57ED, 0x1E7C, 0x57EE, + 0x1E84, 0x57F0, 0x1E92, 0x57F1, 0x1E90, 0x57F2, 0x1E86, 0x57F3, 0x1E81, + 0x57F4, 0x1E7A, 0x57F5, 0x20E1, 0x57F6, 0x1E78, 0x57F7, 0x0A42, 0x57F8, + 0x1E7F, 0x57F9, 0x0A43, 0x57FA, 0x0A3F, 0x57FB, 0x1E75, 0x57FC, 0x1E8B, + 0x57FD, 0x1E7D, 0x5800, 0x1E7B, 0x5801, 0x1E8E, 0x5802, 0x0A40, 0x5804, + 0x1E94, 0x5805, 0x0A3A, 0x5806, 0x0A3C, 0x5807, 0x1E83, 0x5808, 0x1E7E, + 0x5809, 0x087F, 0x580A, 0x0A3B, 0x580B, 0x1E80, 0x580C, 0x1E8F, 0x580D, + 0x1E93, 0x580E, 0x1E8A, 0x5810, 0x1E8C, 0x5814, 0x1E76, 0x5819, 0x20DC, + 0x581B, 0x20E5, 0x581C, 0x20E4, 0x581D, 0x0C1E, 0x581E, 0x20DD, 0x5820, + 0x0C1F, 0x5821, 0x0C1D, 0x5823, 0x20DF, 0x5824, 0x0C1A, 0x5825, 0x20E3, + 0x5827, 0x20DE, 0x5828, 0x20E0, 0x5829, 0x20DA, 0x582A, 0x0C18, 0x582C, + 0x20ED, 0x582D, 0x20EC, 0x582E, 0x20E9, 0x582F, 0x0C17, 0x5830, 0x0C1B, + 0x5831, 0x0C1C, 0x5832, 0x1C5E, 0x5833, 0x20E6, 0x5834, 0x0C19, 0x5835, + 0x0A41, 0x5836, 0x20E8, 0x5837, 0x20DB, 0x5838, 0x20EB, 0x5839, 0x20EA, + 0x583B, 0x20EE, 0x583D, 0x239F, 0x583F, 0x20E7, 0x5848, 0x20E2, 0x5849, + 0x2397, 0x584A, 0x0DEF, 0x584B, 0x0DF2, 0x584C, 0x0DED, 0x584D, 0x2396, + 0x584E, 0x239A, 0x584F, 0x2395, 0x5851, 0x0DE7, 0x5852, 0x0DF1, 0x5853, + 0x2392, 0x5854, 0x0DEB, 0x5855, 0x2399, 0x5857, 0x0DE9, 0x5858, 0x0DE8, + 0x5859, 0x239C, 0x585A, 0x0DEA, 0x585B, 0x239E, 0x585D, 0x239B, 0x585E, + 0x0DE6, 0x5862, 0x0DF0, 0x5863, 0x23A0, 0x5864, 0x2394, 0x5865, 0x239D, + 0x5868, 0x2393, 0x586B, 0x0DEC, 0x586D, 0x0DEE, 0x586F, 0x2398, 0x5871, + 0x23A1, 0x5874, 0x263F, 0x5875, 0x0FA2, 0x5876, 0x2645, 0x5879, 0x0FA7, + 0x587A, 0x2641, 0x587B, 0x2648, 0x587C, 0x2639, 0x587D, 0x0FA9, 0x587E, + 0x0FA3, 0x587F, 0x263E, 0x5880, 0x1121, 0x5881, 0x263D, 0x5882, 0x2646, + 0x5883, 0x0FA4, 0x5885, 0x0FA8, 0x5886, 0x263C, 0x5887, 0x2642, 0x5888, + 0x2647, 0x5889, 0x2638, 0x588A, 0x0FA6, 0x588B, 0x2640, 0x588E, 0x2644, + 0x588F, 0x264A, 0x5890, 0x263A, 0x5891, 0x2643, 0x5893, 0x0FA5, 0x5894, + 0x2649, 0x5898, 0x263B, 0x589C, 0x1125, 0x589D, 0x28A1, 0x589E, 0x1123, + 0x589F, 0x1122, 0x58A0, 0x28A3, 0x58A1, 0x28A8, 0x58A3, 0x28A4, 0x58A5, + 0x28A7, 0x58A6, 0x1128, 0x58A8, 0x1288, 0x58A9, 0x1127, 0x58AB, 0x28A0, + 0x58AC, 0x28A6, 0x58AE, 0x1126, 0x58AF, 0x28A5, 0x58B1, 0x28A2, 0x58B3, + 0x1124, 0x58BA, 0x2B18, 0x58BB, 0x36EB, 0x58BC, 0x2B1A, 0x58BD, 0x2B15, + 0x58BE, 0x12A4, 0x58BF, 0x2B17, 0x58C1, 0x12A3, 0x58C2, 0x2B19, 0x58C5, + 0x12A6, 0x58C6, 0x2B1B, 0x58C7, 0x12A5, 0x58C8, 0x2B14, 0x58C9, 0x2B16, + 0x58CE, 0x13C2, 0x58CF, 0x2D4D, 0x58D1, 0x13C1, 0x58D2, 0x2D4E, 0x58D3, + 0x13C0, 0x58D4, 0x2D4C, 0x58D5, 0x13BF, 0x58D6, 0x2D4B, 0x58D8, 0x14CD, + 0x58D9, 0x14CC, 0x58DA, 0x3085, 0x58DB, 0x3087, 0x58DD, 0x3086, 0x58DE, + 0x1578, 0x58DF, 0x1579, 0x58E2, 0x157A, 0x58E3, 0x31CB, 0x58E4, 0x160E, + 0x58E7, 0x3411, 0x58E8, 0x3410, 0x58E9, 0x1720, 0x58EB, 0x027B, 0x58EC, + 0x02C1, 0x58EF, 0x046F, 0x58F4, 0x1A9B, 0x58F9, 0x0C20, 0x58FA, 0x0C21, + 0x58FC, 0x23A2, 0x58FD, 0x0FAA, 0x58FE, 0x264B, 0x58FF, 0x28A9, 0x5902, + 0x0224, 0x5903, 0x1785, 0x5906, 0x1857, 0x590A, 0x0224, 0x590C, 0x1944, + 0x590D, 0x1A9C, 0x590E, 0x1C6C, 0x590F, 0x0880, 0x5912, 0x3088, 0x5914, + 0x166D, 0x5915, 0x027C, 0x5916, 0x032E, 0x5917, 0x179C, 0x5919, 0x03B4, + 0x591A, 0x03B5, 0x591C, 0x0581, 0x5920, 0x0A44, 0x5922, 0x0FAC, 0x5924, + 0x0FAD, 0x5925, 0x0FAB, 0x5927, 0x027D, 0x5929, 0x02C2, 0x592A, 0x02C4, + 0x592B, 0x02C3, 0x592C, 0x1786, 0x592D, 0x02C5, 0x592E, 0x032F, 0x592F, + 0x179D, 0x5931, 0x0330, 0x5937, 0x03B6, 0x5938, 0x03B7, 0x593C, 0x17D4, + 0x593E, 0x0470, 0x5940, 0x1858, 0x5944, 0x0585, 0x5945, 0x1945, 0x5947, + 0x0583, 0x5948, 0x0584, 0x5949, 0x0582, 0x594A, 0x1C6D, 0x594E, 0x06F2, + 0x594F, 0x06F1, 0x5950, 0x06F3, 0x5951, 0x06F0, 0x5953, 0x1A9D, 0x5954, + 0x0586, 0x5955, 0x06EF, 0x5957, 0x0881, 0x5958, 0x0882, 0x595A, 0x0883, + 0x595C, 0x1E95, 0x5960, 0x0C22, 0x5961, 0x20EF, 0x5962, 0x0A45, 0x5967, + 0x0DF3, 0x5969, 0x0FAF, 0x596A, 0x0FAE, 0x596B, 0x264C, 0x596D, 0x1129, + 0x596E, 0x12A7, 0x5970, 0x2F17, 0x5971, 0x337B, 0x5972, 0x3412, 0x5973, + 0x027E, 0x5974, 0x0331, 0x5976, 0x0332, 0x5977, 0x17DA, 0x5978, 0x03B9, + 0x5979, 0x03BC, 0x597B, 0x17D8, 0x597C, 0x17D6, 0x597D, 0x03BB, 0x597E, + 0x17D9, 0x597F, 0x17DB, 0x5980, 0x17D5, 0x5981, 0x03BE, 0x5982, 0x03BD, + 0x5983, 0x03BA, 0x5984, 0x03B8, 0x5985, 0x17D7, 0x598A, 0x047B, 0x598D, + 0x0478, 0x598E, 0x185D, 0x598F, 0x1860, 0x5990, 0x185F, 0x5992, 0x0472, + 0x5993, 0x047A, 0x5996, 0x0477, 0x5997, 0x185C, 0x5998, 0x185A, 0x5999, + 0x0476, 0x599D, 0x0471, 0x599E, 0x0474, 0x59A0, 0x185B, 0x59A1, 0x1862, + 0x59A2, 0x185E, 0x59A3, 0x0475, 0x59A4, 0x0479, 0x59A5, 0x047C, 0x59A6, + 0x1859, 0x59A7, 0x1861, 0x59A8, 0x0473, 0x59AE, 0x058B, 0x59AF, 0x0593, + 0x59B1, 0x1951, 0x59B2, 0x194A, 0x59B3, 0x0594, 0x59B4, 0x1955, 0x59B5, + 0x1946, 0x59B6, 0x194D, 0x59B9, 0x058A, 0x59BA, 0x1947, 0x59BB, 0x0588, + 0x59BC, 0x194E, 0x59BD, 0x1952, 0x59BE, 0x0587, 0x59C0, 0x1953, 0x59C1, + 0x194C, 0x59C3, 0x194F, 0x59C5, 0x0596, 0x59C6, 0x058D, 0x59C7, 0x1956, + 0x59C8, 0x1954, 0x59CA, 0x0592, 0x59CB, 0x0590, 0x59CC, 0x194B, 0x59CD, + 0x058F, 0x59CE, 0x1949, 0x59CF, 0x1948, 0x59D0, 0x058E, 0x59D1, 0x058C, + 0x59D2, 0x0595, 0x59D3, 0x0591, 0x59D4, 0x0589, 0x59D6, 0x1950, 0x59D8, + 0x06F5, 0x59DA, 0x06FC, 0x59DB, 0x1AAB, 0x59DC, 0x06F4, 0x59DD, 0x1AA3, + 0x59DE, 0x1A9F, 0x59E0, 0x1AAF, 0x59E1, 0x1A9E, 0x59E3, 0x06F7, 0x59E4, + 0x1AA8, 0x59E5, 0x06FA, 0x59E6, 0x06FD, 0x59E8, 0x06F8, 0x59E9, 0x1AAC, + 0x59EA, 0x06FB, 0x59EC, 0x088A, 0x59ED, 0x1AB2, 0x59EE, 0x1AA0, 0x59F1, + 0x1AA2, 0x59F2, 0x1AA9, 0x59F3, 0x1AAD, 0x59F4, 0x1AB1, 0x59F5, 0x1AAE, + 0x59F6, 0x1AA7, 0x59F7, 0x1AAA, 0x59FA, 0x1AA4, 0x59FB, 0x06FF, 0x59FC, + 0x1AA6, 0x59FD, 0x1AA5, 0x59FE, 0x1AB0, 0x59FF, 0x06F6, 0x5A00, 0x1AA1, + 0x5A01, 0x06FE, 0x5A03, 0x06F9, 0x5A09, 0x0890, 0x5A0A, 0x1C75, 0x5A0C, + 0x088F, 0x5A0F, 0x1C73, 0x5A11, 0x0884, 0x5A13, 0x0889, 0x5A15, 0x1C72, + 0x5A16, 0x1C6F, 0x5A17, 0x1C74, 0x5A18, 0x0885, 0x5A19, 0x1C6E, 0x5A1B, + 0x0888, 0x5A1C, 0x0886, 0x5A1E, 0x1C76, 0x5A1F, 0x0887, 0x5A20, 0x088B, + 0x5A23, 0x088C, 0x5A25, 0x088E, 0x5A29, 0x088D, 0x5A2D, 0x1C70, 0x5A2E, + 0x1C71, 0x5A33, 0x1C77, 0x5A35, 0x1E9C, 0x5A36, 0x0A46, 0x5A37, 0x20FD, + 0x5A38, 0x1E9B, 0x5A39, 0x1EAE, 0x5A3C, 0x0A4C, 0x5A3E, 0x1EAC, 0x5A40, + 0x0A4B, 0x5A41, 0x0A47, 0x5A42, 0x1EB5, 0x5A43, 0x1EA5, 0x5A44, 0x1EA8, + 0x5A46, 0x0A4F, 0x5A47, 0x1EB2, 0x5A48, 0x1EAA, 0x5A49, 0x0A48, 0x5A4A, + 0x0A50, 0x5A4C, 0x1EAF, 0x5A4D, 0x1EAD, 0x5A50, 0x1E9E, 0x5A51, 0x1EB3, + 0x5A52, 0x1EA7, 0x5A53, 0x1EA2, 0x5A55, 0x1E98, 0x5A56, 0x1EB4, 0x5A57, + 0x1EA4, 0x5A58, 0x1E97, 0x5A5A, 0x0A4E, 0x5A5B, 0x1EA9, 0x5A5C, 0x1EB6, + 0x5A5D, 0x1EA6, 0x5A5E, 0x1E9A, 0x5A5F, 0x1E9F, 0x5A60, 0x1E96, 0x5A62, + 0x0A4D, 0x5A64, 0x1EA3, 0x5A65, 0x1EA0, 0x5A66, 0x0A49, 0x5A67, 0x1E99, + 0x5A69, 0x1EB1, 0x5A6A, 0x0A4A, 0x5A6C, 0x1EA1, 0x5A6D, 0x1E9D, 0x5A70, + 0x1EB0, 0x5A77, 0x0C23, 0x5A78, 0x20F6, 0x5A7A, 0x20F3, 0x5A7B, 0x2104, + 0x5A7C, 0x20F8, 0x5A7D, 0x2105, 0x5A7F, 0x0C25, 0x5A83, 0x2101, 0x5A84, + 0x20FE, 0x5A8A, 0x20FF, 0x5A8B, 0x2102, 0x5A8C, 0x2106, 0x5A8E, 0x1EAB, + 0x5A8F, 0x2108, 0x5A90, 0x23B6, 0x5A92, 0x0C26, 0x5A93, 0x2109, 0x5A94, + 0x20F1, 0x5A95, 0x20FB, 0x5A97, 0x2100, 0x5A9A, 0x0C24, 0x5A9B, 0x0C27, + 0x5A9C, 0x2107, 0x5A9D, 0x210A, 0x5A9E, 0x20F5, 0x5A9F, 0x20F2, 0x5AA2, + 0x20F4, 0x5AA5, 0x20F9, 0x5AA6, 0x20F7, 0x5AA7, 0x0C28, 0x5AA9, 0x2103, + 0x5AAC, 0x20FA, 0x5AAE, 0x20FC, 0x5AAF, 0x20F0, 0x5AB0, 0x23AA, 0x5AB1, + 0x23A8, 0x5AB2, 0x0DFC, 0x5AB3, 0x0DFA, 0x5AB4, 0x23B2, 0x5AB5, 0x23A9, + 0x5AB6, 0x23B3, 0x5AB7, 0x23AF, 0x5AB8, 0x23A7, 0x5AB9, 0x23B5, 0x5ABA, + 0x23A6, 0x5ABB, 0x23AD, 0x5ABC, 0x0DF9, 0x5ABD, 0x0DF8, 0x5ABE, 0x0DF7, + 0x5ABF, 0x23AB, 0x5AC0, 0x23B0, 0x5AC1, 0x0DF4, 0x5AC2, 0x0DFB, 0x5AC4, + 0x23A4, 0x5AC6, 0x23AE, 0x5AC7, 0x23A3, 0x5AC8, 0x23AC, 0x5AC9, 0x0DF5, + 0x5ACA, 0x23B1, 0x5ACB, 0x23A5, 0x5ACC, 0x0DF6, 0x5ACD, 0x23B4, 0x5AD5, + 0x2650, 0x5AD6, 0x0FB4, 0x5AD7, 0x0FB3, 0x5AD8, 0x0FB5, 0x5AD9, 0x265C, + 0x5ADA, 0x2652, 0x5ADB, 0x2658, 0x5ADC, 0x264D, 0x5ADD, 0x265B, 0x5ADE, + 0x265A, 0x5ADF, 0x265E, 0x5AE0, 0x2657, 0x5AE1, 0x0FB0, 0x5AE2, 0x2656, + 0x5AE3, 0x0FB6, 0x5AE5, 0x264F, 0x5AE6, 0x0FB1, 0x5AE8, 0x265D, 0x5AE9, + 0x0FB2, 0x5AEA, 0x2651, 0x5AEB, 0x2654, 0x5AEC, 0x2659, 0x5AED, 0x2653, + 0x5AEE, 0x264E, 0x5AF3, 0x2655, 0x5AF4, 0x28AB, 0x5AF5, 0x112D, 0x5AF6, + 0x28AE, 0x5AF7, 0x28AD, 0x5AF8, 0x28B0, 0x5AF9, 0x28B2, 0x5AFA, 0x36EE, + 0x5AFB, 0x112B, 0x5AFD, 0x28AC, 0x5AFF, 0x28AA, 0x5B01, 0x28B3, 0x5B02, + 0x28B1, 0x5B03, 0x28AF, 0x5B05, 0x28B5, 0x5B07, 0x28B4, 0x5B08, 0x112F, + 0x5B09, 0x112A, 0x5B0B, 0x112C, 0x5B0C, 0x112E, 0x5B0F, 0x28B6, 0x5B10, + 0x2B22, 0x5B13, 0x2B21, 0x5B14, 0x2B20, 0x5B16, 0x2B23, 0x5B17, 0x2B1C, + 0x5B19, 0x2B1D, 0x5B1A, 0x2B25, 0x5B1B, 0x2B1E, 0x5B1D, 0x12A8, 0x5B1E, + 0x2B27, 0x5B20, 0x2B26, 0x5B21, 0x2B1F, 0x5B23, 0x2D52, 0x5B24, 0x13C5, + 0x5B25, 0x2D50, 0x5B26, 0x2D55, 0x5B27, 0x2D54, 0x5B28, 0x2B24, 0x5B2A, + 0x13C4, 0x5B2C, 0x2D53, 0x5B2D, 0x2D4F, 0x5B2E, 0x2D57, 0x5B2F, 0x2D56, + 0x5B30, 0x13C3, 0x5B32, 0x2D51, 0x5B34, 0x12A9, 0x5B38, 0x14CE, 0x5B3C, + 0x2F18, 0x5B3D, 0x3089, 0x5B3E, 0x308A, 0x5B3F, 0x308B, 0x5B40, 0x160F, + 0x5B43, 0x1610, 0x5B45, 0x31CC, 0x5B47, 0x32CD, 0x5B48, 0x32CC, 0x5B4B, + 0x337C, 0x5B4C, 0x337D, 0x5B4D, 0x3413, 0x5B4E, 0x3482, 0x5B50, 0x027F, + 0x5B51, 0x0280, 0x5B53, 0x0281, 0x5B54, 0x02C6, 0x5B55, 0x0333, 0x5B56, + 0x17DC, 0x5B57, 0x03BF, 0x5B58, 0x03C0, 0x5B5A, 0x047F, 0x5B5B, 0x0480, + 0x5B5C, 0x047E, 0x5B5D, 0x047D, 0x5B5F, 0x0597, 0x5B62, 0x1957, 0x5B63, + 0x0599, 0x5B64, 0x0598, 0x5B65, 0x1958, 0x5B69, 0x0700, 0x5B6B, 0x0891, + 0x5B6C, 0x1C78, 0x5B6E, 0x1EB8, 0x5B70, 0x0A51, 0x5B71, 0x0C2A, 0x5B72, + 0x1EB7, 0x5B73, 0x0C29, 0x5B75, 0x0FB7, 0x5B77, 0x265F, 0x5B78, 0x12AA, + 0x5B7A, 0x13C6, 0x5B7B, 0x2D58, 0x5B7D, 0x1611, 0x5B7F, 0x16C0, 0x5B80, + 0x0225, 0x5B81, 0x179E, 0x5B83, 0x0334, 0x5B84, 0x179F, 0x5B85, 0x03C3, + 0x5B87, 0x03C1, 0x5B88, 0x03C2, 0x5B89, 0x03C4, 0x5B8B, 0x0482, 0x5B8C, + 0x0481, 0x5B8E, 0x1863, 0x5B8F, 0x0483, 0x5B92, 0x1864, 0x5B93, 0x1959, + 0x5B95, 0x195A, 0x5B97, 0x059A, 0x5B98, 0x059C, 0x5B99, 0x059E, 0x5B9A, + 0x059B, 0x5B9B, 0x059F, 0x5B9C, 0x059D, 0x5BA2, 0x0704, 0x5BA3, 0x0701, + 0x5BA4, 0x0703, 0x5BA5, 0x0705, 0x5BA6, 0x0702, 0x5BA7, 0x1C79, 0x5BA8, + 0x1AB3, 0x5BAC, 0x1C7B, 0x5BAD, 0x1C7A, 0x5BAE, 0x0897, 0x5BB0, 0x0893, + 0x5BB3, 0x0894, 0x5BB4, 0x0896, 0x5BB5, 0x0898, 0x5BB6, 0x0895, 0x5BB8, + 0x089A, 0x5BB9, 0x0899, 0x5BBF, 0x0A56, 0x5BC0, 0x1EBA, 0x5BC1, 0x1EB9, + 0x5BC2, 0x0A55, 0x5BC4, 0x0A54, 0x5BC5, 0x0A53, 0x5BC6, 0x0A57, 0x5BC7, + 0x0A52, 0x5BCA, 0x2110, 0x5BCB, 0x210D, 0x5BCC, 0x0C2C, 0x5BCD, 0x210C, + 0x5BCE, 0x2111, 0x5BD0, 0x0C2E, 0x5BD1, 0x210F, 0x5BD2, 0x0C2B, 0x5BD3, + 0x0C2D, 0x5BD4, 0x210E, 0x5BD6, 0x23B7, 0x5BD8, 0x23B8, 0x5BD9, 0x23B9, + 0x5BDE, 0x0FB8, 0x5BDF, 0x0FC0, 0x5BE0, 0x2660, 0x5BE1, 0x0FBA, 0x5BE2, + 0x0FBE, 0x5BE3, 0x2661, 0x5BE4, 0x0FBF, 0x5BE5, 0x0FBB, 0x5BE6, 0x0FBC, + 0x5BE7, 0x0FB9, 0x5BE8, 0x0FBD, 0x5BE9, 0x1132, 0x5BEA, 0x210B, 0x5BEB, + 0x1133, 0x5BEC, 0x1131, 0x5BEE, 0x1130, 0x5BEF, 0x2B28, 0x5BF0, 0x12AB, + 0x5BF1, 0x2D59, 0x5BF2, 0x2D5A, 0x5BF5, 0x157B, 0x5BF6, 0x1612, 0x5BF8, + 0x0282, 0x5BFA, 0x03C5, 0x5C01, 0x0706, 0x5C03, 0x1C7C, 0x5C04, 0x089B, + 0x5C07, 0x0A5A, 0x5C08, 0x0A59, 0x5C09, 0x0A58, 0x5C0A, 0x0C2F, 0x5C0B, + 0x0C30, 0x5C0C, 0x2112, 0x5C0D, 0x0FC1, 0x5C0E, 0x12AC, 0x5C0F, 0x0283, + 0x5C10, 0x1787, 0x5C11, 0x02C7, 0x5C12, 0x17A0, 0x5C15, 0x17DD, 0x5C16, + 0x03C6, 0x5C1A, 0x05A0, 0x5C1F, 0x23BA, 0x5C22, 0x0284, 0x5C24, 0x02C8, + 0x5C25, 0x17DE, 0x5C28, 0x1865, 0x5C2A, 0x1866, 0x5C2C, 0x0484, 0x5C30, + 0x2113, 0x5C31, 0x0C31, 0x5C33, 0x23BB, 0x5C37, 0x13C7, 0x5C38, 0x0285, + 0x5C39, 0x0299, 0x5C3A, 0x02C9, 0x5C3B, 0x17A1, 0x5C3C, 0x0335, 0x5C3E, + 0x0488, 0x5C3F, 0x0487, 0x5C40, 0x0485, 0x5C41, 0x0486, 0x5C44, 0x195B, + 0x5C45, 0x05A2, 0x5C46, 0x05A3, 0x5C47, 0x195C, 0x5C48, 0x05A1, 0x5C4B, + 0x070A, 0x5C4C, 0x1AB4, 0x5C4D, 0x0709, 0x5C4E, 0x0707, 0x5C4F, 0x0708, + 0x5C50, 0x089E, 0x5C51, 0x089C, 0x5C54, 0x1C7E, 0x5C55, 0x089D, 0x5C56, + 0x1C7D, 0x5C58, 0x0892, 0x5C59, 0x1EBB, 0x5C5C, 0x0A5C, 0x5C5D, 0x0A5D, + 0x5C60, 0x0A5B, 0x5C62, 0x0FC2, 0x5C63, 0x2662, 0x5C64, 0x1134, 0x5C65, + 0x1135, 0x5C67, 0x28B7, 0x5C68, 0x13C8, 0x5C69, 0x2F19, 0x5C6A, 0x2F1A, + 0x5C6C, 0x166E, 0x5C6D, 0x3483, 0x5C6E, 0x1776, 0x5C6F, 0x02CA, 0x5C71, + 0x0286, 0x5C73, 0x17A3, 0x5C74, 0x17A2, 0x5C79, 0x03C7, 0x5C7A, 0x17E0, + 0x5C7B, 0x17E1, 0x5C7C, 0x17DF, 0x5C7E, 0x17E2, 0x5C86, 0x186E, 0x5C88, + 0x1869, 0x5C89, 0x186B, 0x5C8A, 0x186D, 0x5C8B, 0x186A, 0x5C8C, 0x048C, + 0x5C8D, 0x1867, 0x5C8F, 0x1868, 0x5C90, 0x0489, 0x5C91, 0x048A, 0x5C92, + 0x186C, 0x5C93, 0x186F, 0x5C94, 0x048B, 0x5C95, 0x1870, 0x5C9D, 0x196A, + 0x5C9F, 0x1964, 0x5CA0, 0x195F, 0x5CA1, 0x05A5, 0x5CA2, 0x1967, 0x5CA3, + 0x1965, 0x5CA4, 0x195E, 0x5CA5, 0x196B, 0x5CA6, 0x196E, 0x5CA7, 0x1969, + 0x5CA8, 0x1962, 0x5CA9, 0x05A7, 0x5CAA, 0x1968, 0x5CAB, 0x05A8, 0x5CAC, + 0x1963, 0x5CAD, 0x1966, 0x5CAE, 0x195D, 0x5CAF, 0x1961, 0x5CB0, 0x196D, + 0x5CB1, 0x05A9, 0x5CB3, 0x05AA, 0x5CB5, 0x1960, 0x5CB6, 0x196C, 0x5CB7, + 0x05A4, 0x5CB8, 0x05A6, 0x5CC6, 0x1AC5, 0x5CC7, 0x1ABE, 0x5CC8, 0x1AC4, + 0x5CC9, 0x1ABD, 0x5CCA, 0x1ABF, 0x5CCB, 0x1AB9, 0x5CCC, 0x1AB7, 0x5CCE, + 0x1AC6, 0x5CCF, 0x1AC3, 0x5CD0, 0x1AB5, 0x5CD2, 0x070C, 0x5CD3, 0x1AC1, + 0x5CD4, 0x1AC2, 0x5CD6, 0x1AC0, 0x5CD7, 0x1AB8, 0x5CD8, 0x1AB6, 0x5CD9, + 0x070B, 0x5CDA, 0x1ABC, 0x5CDB, 0x1ABA, 0x5CDE, 0x1ABB, 0x5CDF, 0x1AC7, + 0x5CE8, 0x08A3, 0x5CEA, 0x08A2, 0x5CEC, 0x1C7F, 0x5CED, 0x089F, 0x5CEE, + 0x1C81, 0x5CF0, 0x08A4, 0x5CF1, 0x1C82, 0x5CF4, 0x08A7, 0x5CF6, 0x08A5, + 0x5CF7, 0x1C83, 0x5CF8, 0x1AC8, 0x5CF9, 0x1C85, 0x5CFB, 0x08A1, 0x5CFD, + 0x08A0, 0x5CFF, 0x1C80, 0x5D00, 0x1C84, 0x5D01, 0x08A6, 0x5D06, 0x0A5F, + 0x5D07, 0x0A5E, 0x5D0B, 0x1EBD, 0x5D0C, 0x1EC1, 0x5D0D, 0x1EC3, 0x5D0E, + 0x0A60, 0x5D0F, 0x1EC6, 0x5D11, 0x0A64, 0x5D12, 0x1EC8, 0x5D14, 0x0A66, + 0x5D16, 0x0A62, 0x5D17, 0x0A6A, 0x5D19, 0x0A67, 0x5D1A, 0x1EBF, 0x5D1B, + 0x0A61, 0x5D1D, 0x1EBE, 0x5D1E, 0x1EBC, 0x5D1F, 0x1ECA, 0x5D20, 0x1EC0, + 0x5D22, 0x0A63, 0x5D23, 0x1EC9, 0x5D24, 0x0A68, 0x5D25, 0x1EC5, 0x5D26, + 0x1EC4, 0x5D27, 0x0A69, 0x5D28, 0x1EC2, 0x5D29, 0x0A65, 0x5D2E, 0x1ECB, + 0x5D30, 0x1EC7, 0x5D31, 0x2122, 0x5D32, 0x2129, 0x5D33, 0x211E, 0x5D34, + 0x0C34, 0x5D35, 0x211A, 0x5D36, 0x212A, 0x5D37, 0x2114, 0x5D38, 0x2127, + 0x5D39, 0x2125, 0x5D3A, 0x211F, 0x5D3C, 0x2128, 0x5D3D, 0x2121, 0x5D3F, + 0x2119, 0x5D40, 0x212B, 0x5D41, 0x2117, 0x5D42, 0x2124, 0x5D43, 0x2115, + 0x5D45, 0x212C, 0x5D47, 0x0C35, 0x5D49, 0x2126, 0x5D4A, 0x23BE, 0x5D4B, + 0x2118, 0x5D4C, 0x0C32, 0x5D4E, 0x211C, 0x5D50, 0x0C33, 0x5D51, 0x211B, + 0x5D52, 0x2120, 0x5D55, 0x211D, 0x5D59, 0x2123, 0x5D5E, 0x23C2, 0x5D62, + 0x23C5, 0x5D63, 0x23BD, 0x5D65, 0x23BF, 0x5D67, 0x23C4, 0x5D68, 0x23C3, + 0x5D69, 0x0DFD, 0x5D6B, 0x2116, 0x5D6C, 0x23C1, 0x5D6F, 0x0DFE, 0x5D71, + 0x23BC, 0x5D72, 0x23C0, 0x5D77, 0x2669, 0x5D79, 0x2670, 0x5D7A, 0x2667, + 0x5D7C, 0x266E, 0x5D7D, 0x2665, 0x5D7E, 0x266D, 0x5D7F, 0x2671, 0x5D80, + 0x2664, 0x5D81, 0x2668, 0x5D82, 0x2663, 0x5D84, 0x0FC3, 0x5D86, 0x2666, + 0x5D87, 0x0FC4, 0x5D88, 0x266C, 0x5D89, 0x266B, 0x5D8A, 0x266A, 0x5D8D, + 0x266F, 0x5D92, 0x28BB, 0x5D93, 0x28BD, 0x5D94, 0x1137, 0x5D95, 0x28BE, + 0x5D97, 0x28B9, 0x5D99, 0x28B8, 0x5D9A, 0x28C2, 0x5D9C, 0x28C0, 0x5D9D, + 0x1136, 0x5D9E, 0x28C3, 0x5D9F, 0x28BA, 0x5DA0, 0x28BF, 0x5DA1, 0x28C1, + 0x5DA2, 0x28BC, 0x5DA7, 0x2B2C, 0x5DA8, 0x2B31, 0x5DA9, 0x2B2B, 0x5DAA, + 0x2B30, 0x5DAC, 0x2B29, 0x5DAD, 0x2B33, 0x5DAE, 0x2B2F, 0x5DAF, 0x2B34, + 0x5DB0, 0x2B2E, 0x5DB1, 0x2B2A, 0x5DB2, 0x2B32, 0x5DB4, 0x2B35, 0x5DB5, + 0x2B2D, 0x5DB7, 0x2D5B, 0x5DB8, 0x13CC, 0x5DBA, 0x13CA, 0x5DBC, 0x13C9, + 0x5DBD, 0x13CB, 0x5DC0, 0x2F1B, 0x5DC2, 0x3023, 0x5DC3, 0x308C, 0x5DC6, + 0x31CD, 0x5DC7, 0x31CE, 0x5DC9, 0x1613, 0x5DCB, 0x32CE, 0x5DCD, 0x166F, + 0x5DCF, 0x32CF, 0x5DD1, 0x337F, 0x5DD2, 0x16C2, 0x5DD4, 0x16C1, 0x5DD5, + 0x337E, 0x5DD6, 0x16F7, 0x5DD8, 0x3414, 0x5DDB, 0x0226, 0x5DDD, 0x0287, + 0x5DDE, 0x03C8, 0x5DDF, 0x17E3, 0x5DE0, 0x1871, 0x5DE1, 0x051A, 0x5DE2, + 0x0A6B, 0x5DE5, 0x0288, 0x5DE6, 0x0338, 0x5DE7, 0x0337, 0x5DE8, 0x0336, + 0x5DEB, 0x048D, 0x5DEE, 0x08A8, 0x5DF0, 0x23C6, 0x5DF1, 0x0289, 0x5DF2, + 0x028A, 0x5DF3, 0x028B, 0x5DF4, 0x02CB, 0x5DF7, 0x070D, 0x5DF9, 0x1AC9, + 0x5DFD, 0x0C36, 0x5DFE, 0x028C, 0x5DFF, 0x1788, 0x5E02, 0x0339, 0x5E03, + 0x033A, 0x5E04, 0x17A4, 0x5E06, 0x03C9, 0x5E0A, 0x1872, 0x5E0C, 0x048E, + 0x5E0E, 0x1873, 0x5E11, 0x05B0, 0x5E14, 0x1970, 0x5E15, 0x05AE, 0x5E16, + 0x05AD, 0x5E17, 0x196F, 0x5E18, 0x05AB, 0x5E19, 0x1971, 0x5E1A, 0x05AC, + 0x5E1B, 0x05AF, 0x5E1D, 0x070E, 0x5E1F, 0x0710, 0x5E20, 0x1ACD, 0x5E21, + 0x1ACA, 0x5E22, 0x1ACB, 0x5E23, 0x1ACC, 0x5E24, 0x1ACE, 0x5E25, 0x070F, + 0x5E28, 0x1C87, 0x5E29, 0x1C86, 0x5E2B, 0x08AA, 0x5E2D, 0x08A9, 0x5E33, + 0x0A6E, 0x5E34, 0x1ECD, 0x5E36, 0x0A6D, 0x5E37, 0x0A6F, 0x5E38, 0x0A6C, + 0x5E3D, 0x0C38, 0x5E3E, 0x1ECC, 0x5E40, 0x0C39, 0x5E41, 0x212E, 0x5E43, + 0x0C3A, 0x5E44, 0x212D, 0x5E45, 0x0C37, 0x5E4A, 0x23C9, 0x5E4B, 0x23CB, + 0x5E4C, 0x0DFF, 0x5E4D, 0x23CA, 0x5E4E, 0x23C8, 0x5E4F, 0x23C7, 0x5E53, + 0x2674, 0x5E54, 0x0FC9, 0x5E55, 0x0FC7, 0x5E57, 0x0FC8, 0x5E58, 0x2672, + 0x5E59, 0x2673, 0x5E5B, 0x0FC5, 0x5E5C, 0x28C7, 0x5E5D, 0x28C5, 0x5E5F, + 0x1139, 0x5E60, 0x28C6, 0x5E61, 0x113A, 0x5E62, 0x1138, 0x5E63, 0x0FC6, + 0x5E66, 0x2B38, 0x5E67, 0x2B36, 0x5E68, 0x2B37, 0x5E69, 0x28C4, 0x5E6A, + 0x2D5D, 0x5E6B, 0x13CD, 0x5E6C, 0x2D5C, 0x5E6D, 0x2F1C, 0x5E6E, 0x2F1D, + 0x5E6F, 0x2B39, 0x5E70, 0x308D, 0x5E72, 0x028D, 0x5E73, 0x033B, 0x5E74, + 0x03CB, 0x5E75, 0x17E4, 0x5E76, 0x03CA, 0x5E78, 0x05B1, 0x5E79, 0x0E00, + 0x5E7A, 0x0227, 0x5E7B, 0x02CC, 0x5E7C, 0x033C, 0x5E7D, 0x0711, 0x5E7E, + 0x0C3B, 0x5E7F, 0x0228, 0x5E80, 0x17A5, 0x5E82, 0x17A6, 0x5E84, 0x17E5, + 0x5E87, 0x0490, 0x5E88, 0x1877, 0x5E89, 0x1875, 0x5E8A, 0x0491, 0x5E8B, + 0x1874, 0x5E8C, 0x1876, 0x5E8D, 0x1878, 0x5E8F, 0x048F, 0x5E95, 0x05B5, + 0x5E96, 0x05B6, 0x5E97, 0x05B3, 0x5E9A, 0x05B2, 0x5E9B, 0x1AD2, 0x5E9C, + 0x05B4, 0x5EA0, 0x0712, 0x5EA2, 0x1AD1, 0x5EA3, 0x1AD3, 0x5EA4, 0x1AD0, + 0x5EA5, 0x1AD4, 0x5EA6, 0x0713, 0x5EA7, 0x08AD, 0x5EA8, 0x1C88, 0x5EAA, + 0x1C8A, 0x5EAB, 0x08AB, 0x5EAC, 0x1C8B, 0x5EAD, 0x08AC, 0x5EAE, 0x1C89, + 0x5EB0, 0x1ACF, 0x5EB1, 0x1ECE, 0x5EB2, 0x1ED1, 0x5EB3, 0x1ED2, 0x5EB4, + 0x1ECF, 0x5EB5, 0x0A73, 0x5EB6, 0x0A72, 0x5EB7, 0x0A70, 0x5EB8, 0x0A71, + 0x5EB9, 0x1ED0, 0x5EBE, 0x0A74, 0x5EC1, 0x0C3D, 0x5EC2, 0x0C3E, 0x5EC4, + 0x0C3F, 0x5EC5, 0x23CC, 0x5EC6, 0x23CE, 0x5EC7, 0x23D0, 0x5EC8, 0x0E02, + 0x5EC9, 0x0E01, 0x5ECA, 0x0C3C, 0x5ECB, 0x23CF, 0x5ECC, 0x23CD, 0x5ECE, + 0x2678, 0x5ED1, 0x2676, 0x5ED2, 0x267C, 0x5ED3, 0x0FCA, 0x5ED4, 0x267D, + 0x5ED5, 0x267A, 0x5ED6, 0x0FCB, 0x5ED7, 0x2677, 0x5ED8, 0x2675, 0x5ED9, + 0x267B, 0x5EDA, 0x113C, 0x5EDB, 0x28C9, 0x5EDC, 0x2679, 0x5EDD, 0x113E, + 0x5EDE, 0x28CA, 0x5EDF, 0x113D, 0x5EE0, 0x1140, 0x5EE1, 0x28CB, 0x5EE2, + 0x113B, 0x5EE3, 0x113F, 0x5EE5, 0x2B3E, 0x5EE6, 0x2B3C, 0x5EE7, 0x2B3B, + 0x5EE8, 0x2B3D, 0x5EE9, 0x2B3A, 0x5EEC, 0x157D, 0x5EEE, 0x31CF, 0x5EEF, + 0x31D0, 0x5EF1, 0x32D0, 0x5EF2, 0x3380, 0x5EF3, 0x1742, 0x5EF4, 0x0229, + 0x5EF6, 0x05B7, 0x5EF7, 0x0492, 0x5EFA, 0x0714, 0x5EFE, 0x028E, 0x5EFF, + 0x02CD, 0x5F01, 0x033D, 0x5F02, 0x17E6, 0x5F04, 0x0493, 0x5F05, 0x1879, + 0x5F07, 0x1AD5, 0x5F08, 0x0715, 0x5F0A, 0x0FCC, 0x5F0B, 0x028F, 0x5F0F, + 0x03CC, 0x5F12, 0x0E03, 0x5F13, 0x0290, 0x5F14, 0x02CE, 0x5F15, 0x02CF, + 0x5F17, 0x033F, 0x5F18, 0x033E, 0x5F1A, 0x17E7, 0x5F1B, 0x03CD, 0x5F1D, + 0x187A, 0x5F1F, 0x0494, 0x5F22, 0x1973, 0x5F23, 0x1974, 0x5F24, 0x1975, + 0x5F26, 0x05B8, 0x5F27, 0x05B9, 0x5F28, 0x1972, 0x5F29, 0x05BA, 0x5F2D, + 0x0716, 0x5F2E, 0x1AD6, 0x5F30, 0x1C8D, 0x5F31, 0x08AE, 0x5F33, 0x1C8C, + 0x5F35, 0x0A75, 0x5F36, 0x1ED3, 0x5F37, 0x0A76, 0x5F38, 0x1ED4, 0x5F3C, + 0x0C40, 0x5F40, 0x23D1, 0x5F43, 0x267F, 0x5F44, 0x267E, 0x5F46, 0x0FCD, + 0x5F48, 0x1141, 0x5F49, 0x28CC, 0x5F4A, 0x12AD, 0x5F4B, 0x2B3F, 0x5F4C, + 0x13CE, 0x5F4E, 0x16C3, 0x5F4F, 0x3416, 0x5F50, 0x022A, 0x5F54, 0x1976, + 0x5F56, 0x1AD7, 0x5F57, 0x0A77, 0x5F58, 0x212F, 0x5F59, 0x0E04, 0x5F5D, + 0x14CF, 0x5F61, 0x022B, 0x5F62, 0x0496, 0x5F64, 0x0495, 0x5F65, 0x0717, + 0x5F67, 0x1C8E, 0x5F69, 0x0A79, 0x5F6A, 0x0B89, 0x5F6B, 0x0A7A, 0x5F6C, + 0x0A78, 0x5F6D, 0x0C41, 0x5F6F, 0x2680, 0x5F70, 0x0FCE, 0x5F71, 0x1142, + 0x5F73, 0x1777, 0x5F74, 0x17E8, 0x5F76, 0x187C, 0x5F77, 0x0497, 0x5F78, + 0x187B, 0x5F79, 0x0498, 0x5F7C, 0x05BE, 0x5F7D, 0x1979, 0x5F7E, 0x1978, + 0x5F7F, 0x05BD, 0x5F80, 0x05BB, 0x5F81, 0x05BC, 0x5F82, 0x1977, 0x5F85, + 0x0719, 0x5F86, 0x1AD8, 0x5F87, 0x071C, 0x5F88, 0x0718, 0x5F89, 0x071E, + 0x5F8A, 0x071A, 0x5F8B, 0x071B, 0x5F8C, 0x071D, 0x5F90, 0x08B1, 0x5F91, + 0x08B0, 0x5F92, 0x08AF, 0x5F96, 0x1ED6, 0x5F97, 0x0A7B, 0x5F98, 0x0A7E, + 0x5F99, 0x0A7C, 0x5F9B, 0x1ED5, 0x5F9C, 0x0A81, 0x5F9E, 0x0A7D, 0x5F9F, + 0x1ED7, 0x5FA0, 0x0A80, 0x5FA1, 0x0A7F, 0x5FA5, 0x2131, 0x5FA6, 0x2130, + 0x5FA8, 0x0C44, 0x5FA9, 0x0C42, 0x5FAA, 0x0C43, 0x5FAB, 0x2132, 0x5FAC, + 0x0E05, 0x5FAD, 0x23D3, 0x5FAE, 0x0E06, 0x5FAF, 0x23D2, 0x5FB2, 0x28CD, + 0x5FB5, 0x1144, 0x5FB6, 0x2681, 0x5FB7, 0x1143, 0x5FB9, 0x0FCF, 0x5FBB, + 0x2B41, 0x5FBC, 0x2B40, 0x5FBD, 0x13CF, 0x5FBE, 0x2D5E, 0x5FBF, 0x308E, + 0x5FC0, 0x31D1, 0x5FC1, 0x31D2, 0x5FC3, 0x02D0, 0x5FC5, 0x0340, 0x5FC9, + 0x17A7, 0x5FCC, 0x049A, 0x5FCD, 0x049C, 0x5FCF, 0x17EB, 0x5FD0, 0x187F, + 0x5FD1, 0x187E, 0x5FD2, 0x187D, 0x5FD4, 0x17EA, 0x5FD5, 0x17E9, 0x5FD6, + 0x03CF, 0x5FD7, 0x049B, 0x5FD8, 0x0499, 0x5FD9, 0x03CE, 0x5FDD, 0x05BF, + 0x5FDE, 0x197A, 0x5FE0, 0x05C0, 0x5FE1, 0x1884, 0x5FE3, 0x1886, 0x5FE4, + 0x1885, 0x5FE5, 0x197B, 0x5FE8, 0x1881, 0x5FEA, 0x04A0, 0x5FEB, 0x049E, + 0x5FED, 0x1880, 0x5FEE, 0x1882, 0x5FEF, 0x1888, 0x5FF1, 0x049D, 0x5FF3, + 0x1883, 0x5FF4, 0x188C, 0x5FF5, 0x05C2, 0x5FF7, 0x1889, 0x5FF8, 0x049F, + 0x5FFA, 0x1887, 0x5FFB, 0x188A, 0x5FFD, 0x05C1, 0x5FFF, 0x05C3, 0x6000, + 0x188B, 0x6009, 0x198F, 0x600A, 0x1982, 0x600B, 0x1980, 0x600C, 0x198E, + 0x600D, 0x1989, 0x600E, 0x0723, 0x600F, 0x05C4, 0x6010, 0x198A, 0x6011, + 0x198D, 0x6012, 0x071F, 0x6013, 0x198C, 0x6014, 0x05C5, 0x6015, 0x05CA, + 0x6016, 0x05C8, 0x6017, 0x1983, 0x6019, 0x197E, 0x601A, 0x1985, 0x601B, + 0x05CF, 0x601C, 0x1990, 0x601D, 0x0720, 0x601E, 0x1986, 0x6020, 0x0721, + 0x6021, 0x05CB, 0x6022, 0x1988, 0x6024, 0x1AE7, 0x6025, 0x0722, 0x6026, + 0x197D, 0x6027, 0x05CC, 0x6028, 0x0724, 0x6029, 0x05CD, 0x602A, 0x05C9, + 0x602B, 0x05CE, 0x602C, 0x1987, 0x602D, 0x197C, 0x602E, 0x198B, 0x602F, + 0x05C6, 0x6032, 0x197F, 0x6033, 0x1984, 0x6034, 0x1981, 0x6035, 0x05C7, + 0x6037, 0x1AD9, 0x6039, 0x1ADA, 0x6040, 0x1AE4, 0x6041, 0x1C92, 0x6042, + 0x1AE5, 0x6043, 0x072A, 0x6044, 0x1AE8, 0x6045, 0x1ADE, 0x6046, 0x0729, + 0x6047, 0x1AE0, 0x6049, 0x1AE1, 0x604C, 0x1AE3, 0x604D, 0x0725, 0x6050, + 0x08B5, 0x6052, 0x36EC, 0x6053, 0x1ADF, 0x6054, 0x1ADB, 0x6055, 0x08B6, + 0x6058, 0x1AE9, 0x6059, 0x08B2, 0x605A, 0x1C90, 0x605B, 0x1AE2, 0x605D, + 0x1C8F, 0x605E, 0x1ADD, 0x605F, 0x1AE6, 0x6062, 0x0728, 0x6063, 0x08B3, + 0x6064, 0x072E, 0x6065, 0x08B4, 0x6066, 0x1AEA, 0x6067, 0x1C91, 0x6068, + 0x0727, 0x6069, 0x08B8, 0x606A, 0x072D, 0x606B, 0x072C, 0x606C, 0x072B, + 0x606D, 0x08B7, 0x606E, 0x1AEB, 0x606F, 0x08B9, 0x6070, 0x0726, 0x6072, + 0x1ADC, 0x607F, 0x0A82, 0x6080, 0x1C95, 0x6081, 0x1C97, 0x6083, 0x1C99, + 0x6084, 0x08BA, 0x6085, 0x08C0, 0x6086, 0x1EDA, 0x6087, 0x1C9D, 0x6088, + 0x1C94, 0x6089, 0x0A84, 0x608A, 0x1ED8, 0x608C, 0x08BF, 0x608D, 0x08BD, + 0x608E, 0x1C9F, 0x6090, 0x1ED9, 0x6092, 0x1C96, 0x6094, 0x08BE, 0x6095, + 0x1C9A, 0x6096, 0x08C1, 0x6097, 0x1C9C, 0x609A, 0x08BC, 0x609B, 0x1C9B, + 0x609C, 0x1C9E, 0x609D, 0x1C98, 0x609F, 0x08BB, 0x60A0, 0x0A85, 0x60A2, + 0x1C93, 0x60A3, 0x0A83, 0x60A8, 0x0A86, 0x60B0, 0x1EDC, 0x60B1, 0x1EE5, + 0x60B2, 0x0C47, 0x60B4, 0x0A88, 0x60B5, 0x0A8D, 0x60B6, 0x0C48, 0x60B7, + 0x1EE7, 0x60B8, 0x0A94, 0x60B9, 0x2134, 0x60BA, 0x1EDD, 0x60BB, 0x0A8C, + 0x60BC, 0x0A8F, 0x60BD, 0x0A8A, 0x60BE, 0x1EDB, 0x60BF, 0x1EE9, 0x60C0, + 0x1EEC, 0x60C1, 0x2143, 0x60C3, 0x1EEA, 0x60C4, 0x2138, 0x60C5, 0x0A8B, + 0x60C6, 0x0A92, 0x60C7, 0x0A96, 0x60C8, 0x1EE4, 0x60C9, 0x2133, 0x60CA, + 0x1EE8, 0x60CB, 0x0A87, 0x60CC, 0x2135, 0x60CD, 0x1EEB, 0x60CE, 0x2137, + 0x60CF, 0x1EE0, 0x60D1, 0x0C45, 0x60D3, 0x1EDE, 0x60D4, 0x1EDF, 0x60D5, + 0x0A91, 0x60D8, 0x0A90, 0x60D9, 0x1EE2, 0x60DA, 0x0A95, 0x60DB, 0x1EE6, + 0x60DC, 0x0A8E, 0x60DD, 0x1EE3, 0x60DF, 0x0A93, 0x60E0, 0x0C49, 0x60E1, + 0x0C46, 0x60E2, 0x2136, 0x60E4, 0x1EE1, 0x60E6, 0x0A89, 0x60F0, 0x0C4E, + 0x60F1, 0x0C52, 0x60F2, 0x213A, 0x60F3, 0x0E0B, 0x60F4, 0x0C50, 0x60F5, + 0x213E, 0x60F6, 0x0C54, 0x60F7, 0x23D4, 0x60F8, 0x2140, 0x60F9, 0x0E0D, + 0x60FA, 0x0C4C, 0x60FB, 0x0C4F, 0x60FC, 0x2141, 0x60FE, 0x2142, 0x60FF, + 0x2148, 0x6100, 0x0C56, 0x6101, 0x0E0E, 0x6103, 0x2144, 0x6104, 0x2149, + 0x6105, 0x213D, 0x6106, 0x0E18, 0x6108, 0x0E0F, 0x6109, 0x0C55, 0x610A, + 0x213B, 0x610B, 0x214A, 0x610D, 0x0E17, 0x610E, 0x0C53, 0x610F, 0x0E08, + 0x6110, 0x2147, 0x6112, 0x0C57, 0x6113, 0x213F, 0x6114, 0x2139, 0x6115, + 0x0C4D, 0x6116, 0x213C, 0x6118, 0x2145, 0x611A, 0x0E07, 0x611B, 0x0E0C, + 0x611C, 0x0C4A, 0x611D, 0x2146, 0x611F, 0x0E0A, 0x6123, 0x0C4B, 0x6127, + 0x0E16, 0x6128, 0x2683, 0x6129, 0x23DF, 0x612B, 0x23D7, 0x612C, 0x2682, + 0x612E, 0x23DB, 0x612F, 0x23DD, 0x6132, 0x23DA, 0x6134, 0x0E15, 0x6136, + 0x23D9, 0x6137, 0x0E19, 0x613B, 0x2692, 0x613E, 0x0E14, 0x613F, 0x0FD1, + 0x6140, 0x23E0, 0x6141, 0x2684, 0x6144, 0x0E12, 0x6145, 0x23D8, 0x6146, + 0x23DC, 0x6147, 0x0FD0, 0x6148, 0x0E09, 0x6149, 0x23D5, 0x614A, 0x23D6, + 0x614B, 0x0FD2, 0x614C, 0x0E11, 0x614D, 0x0E13, 0x614E, 0x0E10, 0x614F, + 0x23DE, 0x6152, 0x2688, 0x6153, 0x2689, 0x6154, 0x268E, 0x6155, 0x1149, + 0x6156, 0x2695, 0x6158, 0x0FD8, 0x615A, 0x0FD7, 0x615B, 0x2690, 0x615D, + 0x1148, 0x615E, 0x2685, 0x615F, 0x0FD6, 0x6161, 0x2694, 0x6162, 0x0FD4, + 0x6163, 0x0FD5, 0x6165, 0x2691, 0x6166, 0x28DE, 0x6167, 0x1146, 0x6168, + 0x0C51, 0x616A, 0x2693, 0x616B, 0x114D, 0x616C, 0x268B, 0x616E, 0x1147, + 0x6170, 0x114C, 0x6171, 0x2686, 0x6172, 0x268A, 0x6173, 0x2687, 0x6174, + 0x268D, 0x6175, 0x0FD9, 0x6176, 0x1145, 0x6177, 0x0FD3, 0x6179, 0x28D0, + 0x617A, 0x268F, 0x617C, 0x114B, 0x617E, 0x114E, 0x6180, 0x268C, 0x6182, + 0x114A, 0x6183, 0x28CF, 0x6189, 0x28D4, 0x618A, 0x12B1, 0x618B, 0x28CE, + 0x618C, 0x2B4D, 0x618D, 0x28DD, 0x618E, 0x1152, 0x6190, 0x1150, 0x6191, + 0x12AF, 0x6192, 0x28DA, 0x6193, 0x28D6, 0x6194, 0x1156, 0x6196, 0x2B44, + 0x619A, 0x1154, 0x619B, 0x28D5, 0x619D, 0x2B42, 0x619F, 0x28D9, 0x61A1, + 0x28DC, 0x61A2, 0x28D3, 0x61A4, 0x1155, 0x61A7, 0x114F, 0x61A8, 0x2B43, + 0x61A9, 0x12B0, 0x61AA, 0x28DB, 0x61AB, 0x1151, 0x61AC, 0x1153, 0x61AD, + 0x28D8, 0x61AE, 0x1157, 0x61AF, 0x28D7, 0x61B0, 0x28D2, 0x61B1, 0x28D1, + 0x61B2, 0x12AE, 0x61B3, 0x28DF, 0x61B4, 0x2B46, 0x61B5, 0x2D60, 0x61B6, + 0x12B3, 0x61B8, 0x2B4C, 0x61BA, 0x2B4A, 0x61BC, 0x2D61, 0x61BE, 0x12B4, + 0x61BF, 0x2B4B, 0x61C1, 0x2B48, 0x61C2, 0x13D1, 0x61C3, 0x2D5F, 0x61C5, + 0x2B45, 0x61C6, 0x2B47, 0x61C7, 0x13D2, 0x61C8, 0x12B6, 0x61C9, 0x13D0, + 0x61CA, 0x12B5, 0x61CB, 0x13D4, 0x61CC, 0x2B49, 0x61CD, 0x12B2, 0x61D6, + 0x2F26, 0x61D8, 0x2F1E, 0x61DE, 0x2D67, 0x61DF, 0x2F1F, 0x61E0, 0x2D63, + 0x61E3, 0x14D0, 0x61E4, 0x2D65, 0x61E5, 0x2D64, 0x61E6, 0x13D3, 0x61E7, + 0x2D62, 0x61E8, 0x2D66, 0x61E9, 0x2F27, 0x61EA, 0x2F23, 0x61EB, 0x2F25, + 0x61ED, 0x2F20, 0x61EE, 0x2F21, 0x61F0, 0x2F24, 0x61F1, 0x2F22, 0x61F2, + 0x157E, 0x61F5, 0x1581, 0x61F6, 0x1580, 0x61F7, 0x157F, 0x61F8, 0x1614, + 0x61F9, 0x31D3, 0x61FA, 0x1615, 0x61FB, 0x308F, 0x61FC, 0x1670, 0x61FD, + 0x32D1, 0x61FE, 0x1671, 0x61FF, 0x16C4, 0x6200, 0x16F8, 0x6201, 0x3417, + 0x6203, 0x3418, 0x6204, 0x3419, 0x6207, 0x3533, 0x6208, 0x02D1, 0x6209, + 0x17A8, 0x620A, 0x0341, 0x620C, 0x03D1, 0x620D, 0x03D2, 0x620E, 0x03D0, + 0x6210, 0x03D3, 0x6211, 0x04A2, 0x6212, 0x04A1, 0x6214, 0x1991, 0x6215, + 0x05D1, 0x6216, 0x05D0, 0x6219, 0x1CA0, 0x621A, 0x0A97, 0x621B, 0x0A98, + 0x621F, 0x0C58, 0x6220, 0x23E1, 0x6221, 0x0E1A, 0x6222, 0x0E1B, 0x6223, + 0x23E3, 0x6224, 0x23E5, 0x6225, 0x23E4, 0x6227, 0x2697, 0x6229, 0x2696, + 0x622A, 0x0FDA, 0x622B, 0x2698, 0x622D, 0x28E0, 0x622E, 0x1158, 0x6230, + 0x12B7, 0x6232, 0x13D5, 0x6233, 0x14D1, 0x6234, 0x13D6, 0x6236, 0x02D2, + 0x623A, 0x188D, 0x623D, 0x1992, 0x623E, 0x05D3, 0x623F, 0x05D2, 0x6240, + 0x05D4, 0x6241, 0x072F, 0x6242, 0x1AEC, 0x6243, 0x1AED, 0x6246, 0x1CA1, + 0x6247, 0x08C2, 0x6248, 0x0A99, 0x6249, 0x0C59, 0x624A, 0x214B, 0x624B, + 0x02D3, 0x624D, 0x0291, 0x624E, 0x02D4, 0x6250, 0x17A9, 0x6251, 0x0345, + 0x6252, 0x0344, 0x6253, 0x0342, 0x6254, 0x0343, 0x6258, 0x03D6, 0x6259, + 0x17F2, 0x625A, 0x17F4, 0x625B, 0x03D5, 0x625C, 0x17EC, 0x625E, 0x17ED, + 0x6260, 0x17F3, 0x6261, 0x17EF, 0x6262, 0x17F1, 0x6263, 0x03D4, 0x6264, + 0x17EE, 0x6265, 0x17F5, 0x6266, 0x17F0, 0x626D, 0x04A9, 0x626E, 0x04B2, + 0x626F, 0x04B0, 0x6270, 0x1897, 0x6271, 0x1894, 0x6272, 0x189C, 0x6273, + 0x04AE, 0x6274, 0x189D, 0x6276, 0x04A7, 0x6277, 0x189A, 0x6279, 0x04AD, + 0x627A, 0x1896, 0x627B, 0x1895, 0x627C, 0x04AB, 0x627D, 0x189B, 0x627E, + 0x04AC, 0x627F, 0x05D5, 0x6280, 0x04A6, 0x6281, 0x1898, 0x6283, 0x188E, + 0x6284, 0x04A3, 0x6286, 0x04B6, 0x6287, 0x1893, 0x6288, 0x1899, 0x6289, + 0x04A8, 0x628A, 0x04AA, 0x628C, 0x188F, 0x628E, 0x1890, 0x628F, 0x1891, + 0x6291, 0x04B5, 0x6292, 0x04AF, 0x6293, 0x04B4, 0x6294, 0x1892, 0x6295, + 0x04B3, 0x6296, 0x04A5, 0x6297, 0x04A4, 0x6298, 0x04B1, 0x62A8, 0x05E3, + 0x62A9, 0x199E, 0x62AA, 0x1997, 0x62AB, 0x05DE, 0x62AC, 0x05F1, 0x62AD, + 0x1993, 0x62AE, 0x199A, 0x62AF, 0x199C, 0x62B0, 0x199F, 0x62B1, 0x05EC, + 0x62B3, 0x199B, 0x62B4, 0x1994, 0x62B5, 0x05EA, 0x62B6, 0x1998, 0x62B8, + 0x19A0, 0x62B9, 0x05DB, 0x62BB, 0x199D, 0x62BC, 0x05E5, 0x62BD, 0x05E4, + 0x62BE, 0x1996, 0x62BF, 0x05D9, 0x62C2, 0x05DA, 0x62C4, 0x05D8, 0x62C6, + 0x05F0, 0x62C7, 0x05E8, 0x62C8, 0x05E2, 0x62C9, 0x05D6, 0x62CA, 0x1999, + 0x62CB, 0x05E1, 0x62CC, 0x05D7, 0x62CD, 0x05E9, 0x62CE, 0x05F2, 0x62CF, + 0x1AEE, 0x62D0, 0x05E6, 0x62D1, 0x1995, 0x62D2, 0x05DC, 0x62D3, 0x05DF, + 0x62D4, 0x05E0, 0x62D6, 0x05EE, 0x62D7, 0x05EF, 0x62D8, 0x05ED, 0x62D9, + 0x05E7, 0x62DA, 0x05EB, 0x62DB, 0x05DD, 0x62DC, 0x0730, 0x62EB, 0x1AF4, + 0x62EC, 0x073C, 0x62ED, 0x0734, 0x62EE, 0x0736, 0x62EF, 0x073B, 0x62F0, + 0x1B00, 0x62F1, 0x0739, 0x62F2, 0x1CA2, 0x62F3, 0x08C3, 0x62F4, 0x073E, + 0x62F5, 0x1AF1, 0x62F6, 0x1AF9, 0x62F7, 0x073A, 0x62F8, 0x1AF8, 0x62F9, + 0x1AF5, 0x62FA, 0x1AFD, 0x62FB, 0x1AFF, 0x62FC, 0x0733, 0x62FD, 0x0737, + 0x62FE, 0x073D, 0x62FF, 0x08C5, 0x6300, 0x1AFA, 0x6301, 0x0735, 0x6302, + 0x0740, 0x6303, 0x1AF3, 0x6307, 0x0738, 0x6308, 0x08C4, 0x6309, 0x0732, + 0x630B, 0x1AF0, 0x630C, 0x1AF7, 0x630D, 0x1AEF, 0x630E, 0x1AF2, 0x630F, + 0x1AF6, 0x6310, 0x1CA3, 0x6311, 0x073F, 0x6313, 0x1AFB, 0x6314, 0x1AFC, + 0x6315, 0x1AFE, 0x6316, 0x0731, 0x6328, 0x08D3, 0x6329, 0x1CAF, 0x632A, + 0x08D1, 0x632B, 0x08D2, 0x632C, 0x1CA5, 0x632D, 0x1CB5, 0x632F, 0x08C8, + 0x6332, 0x1EED, 0x6333, 0x1CB7, 0x6334, 0x1CB1, 0x6336, 0x1CA8, 0x6338, + 0x1CBA, 0x6339, 0x1CAB, 0x633A, 0x08CE, 0x633B, 0x1F04, 0x633C, 0x1CAE, + 0x633D, 0x08D0, 0x633E, 0x08C7, 0x6340, 0x1CBC, 0x6341, 0x1CB0, 0x6342, + 0x08CA, 0x6343, 0x1CA9, 0x6344, 0x1CA6, 0x6345, 0x1CA7, 0x6346, 0x08CB, + 0x6347, 0x1CB6, 0x6348, 0x1CBD, 0x6349, 0x08CD, 0x634A, 0x1CAD, 0x634B, + 0x1CAC, 0x634C, 0x08D5, 0x634D, 0x08D4, 0x634E, 0x08C6, 0x634F, 0x08CC, + 0x6350, 0x08CF, 0x6351, 0x1CB9, 0x6354, 0x1CB3, 0x6355, 0x08C9, 0x6356, + 0x1CA4, 0x6357, 0x1CBB, 0x6358, 0x1CB2, 0x6359, 0x1CB4, 0x635A, 0x1CB8, + 0x6365, 0x1EEE, 0x6367, 0x0AA1, 0x6368, 0x0AB5, 0x6369, 0x0AB4, 0x636B, + 0x0AA9, 0x636D, 0x1F00, 0x636E, 0x1EFC, 0x636F, 0x1EF9, 0x6370, 0x1F0B, + 0x6371, 0x0AA4, 0x6372, 0x0A9C, 0x6375, 0x1EFE, 0x6376, 0x0C69, 0x6377, + 0x0AA0, 0x6378, 0x1F06, 0x637A, 0x0AB6, 0x637B, 0x0AB3, 0x637C, 0x1F02, + 0x637D, 0x1EF1, 0x6380, 0x0AB2, 0x6381, 0x1F08, 0x6382, 0x1EF0, 0x6383, + 0x0AA7, 0x6384, 0x0AAB, 0x6385, 0x1F07, 0x6387, 0x1EFA, 0x6388, 0x0AAC, + 0x6389, 0x0AA6, 0x638A, 0x1EEF, 0x638C, 0x0C5B, 0x638D, 0x1F0A, 0x638E, + 0x1EF8, 0x638F, 0x0AB1, 0x6390, 0x1EFB, 0x6391, 0x1F09, 0x6392, 0x0AB0, + 0x6394, 0x214C, 0x6396, 0x0A9D, 0x6397, 0x1EF6, 0x6398, 0x0AA2, 0x6399, + 0x0AAD, 0x639B, 0x0AA8, 0x639C, 0x1EFF, 0x639D, 0x1EF5, 0x639E, 0x1EF3, + 0x639F, 0x1F05, 0x63A0, 0x0A9A, 0x63A1, 0x0AAE, 0x63A2, 0x0A9E, 0x63A3, + 0x0C5A, 0x63A4, 0x1F03, 0x63A5, 0x0A9F, 0x63A7, 0x0A9B, 0x63A8, 0x0AAA, + 0x63A9, 0x0AA5, 0x63AA, 0x0AA3, 0x63AB, 0x1EF7, 0x63AC, 0x0AAF, 0x63AD, + 0x1EF4, 0x63AE, 0x1F01, 0x63AF, 0x1EFD, 0x63B0, 0x214E, 0x63B1, 0x214D, + 0x63BD, 0x1EF2, 0x63BE, 0x215E, 0x63C0, 0x0C5D, 0x63C2, 0x2164, 0x63C3, + 0x2153, 0x63C4, 0x2161, 0x63C5, 0x23E6, 0x63C6, 0x0C60, 0x63C7, 0x2165, + 0x63C8, 0x2168, 0x63C9, 0x0C5F, 0x63CA, 0x2156, 0x63CB, 0x2167, 0x63CC, + 0x2166, 0x63CD, 0x0C61, 0x63CE, 0x214F, 0x63CF, 0x0C5C, 0x63D0, 0x0C64, + 0x63D2, 0x0C62, 0x63D3, 0x2163, 0x63D5, 0x2159, 0x63D6, 0x0C66, 0x63D7, + 0x216A, 0x63D8, 0x2162, 0x63D9, 0x216B, 0x63DA, 0x0C6E, 0x63DB, 0x0C6C, + 0x63DC, 0x2160, 0x63DD, 0x215F, 0x63DF, 0x215D, 0x63E0, 0x2157, 0x63E1, + 0x0C65, 0x63E3, 0x0C63, 0x63E4, 0x1CAA, 0x63E5, 0x2150, 0x63E7, 0x2404, + 0x63E8, 0x2151, 0x63E9, 0x0C5E, 0x63EA, 0x0C6B, 0x63EB, 0x23E8, 0x63ED, + 0x0C67, 0x63EE, 0x0C68, 0x63EF, 0x2152, 0x63F0, 0x2169, 0x63F1, 0x23E7, + 0x63F2, 0x215A, 0x63F3, 0x2155, 0x63F4, 0x0C6A, 0x63F5, 0x215B, 0x63F6, + 0x2158, 0x63F9, 0x0C6F, 0x6406, 0x0E2A, 0x6409, 0x23EB, 0x640A, 0x23FE, + 0x640B, 0x2403, 0x640C, 0x23F7, 0x640D, 0x0E26, 0x640E, 0x2408, 0x640F, + 0x0E23, 0x6410, 0x23E9, 0x6412, 0x23EA, 0x6413, 0x0E1C, 0x6414, 0x0E25, + 0x6415, 0x23F1, 0x6416, 0x0E28, 0x6417, 0x0E29, 0x6418, 0x23F2, 0x641A, + 0x23FF, 0x641B, 0x2405, 0x641C, 0x0E24, 0x641E, 0x0E1E, 0x641F, 0x23F0, + 0x6420, 0x23EC, 0x6421, 0x2407, 0x6422, 0x23F5, 0x6423, 0x23F6, 0x6424, + 0x23ED, 0x6425, 0x2401, 0x6426, 0x23F8, 0x6427, 0x2402, 0x6428, 0x23FA, + 0x642A, 0x0E1F, 0x642B, 0x2699, 0x642C, 0x0E22, 0x642D, 0x0E20, 0x642E, + 0x2406, 0x642F, 0x23FD, 0x6430, 0x23F9, 0x6433, 0x23EE, 0x6434, 0x0FE4, + 0x6435, 0x23FC, 0x6436, 0x0E27, 0x6437, 0x23F4, 0x6439, 0x23F3, 0x643D, + 0x0E21, 0x643E, 0x0E1D, 0x643F, 0x26AE, 0x6440, 0x2400, 0x6441, 0x23FB, + 0x6443, 0x23EF, 0x644B, 0x26A9, 0x644D, 0x269A, 0x644E, 0x26A5, 0x6450, + 0x26AC, 0x6451, 0x0FE2, 0x6452, 0x0C6D, 0x6453, 0x26AA, 0x6454, 0x0FDD, + 0x6458, 0x0FDC, 0x6459, 0x26B1, 0x645B, 0x269B, 0x645C, 0x26A8, 0x645D, + 0x269C, 0x645E, 0x26A7, 0x645F, 0x0FE0, 0x6460, 0x26AB, 0x6461, 0x215C, + 0x6465, 0x26B2, 0x6466, 0x26A3, 0x6467, 0x0FE3, 0x6468, 0x28EE, 0x6469, + 0x1159, 0x646B, 0x26B0, 0x646C, 0x26AF, 0x646D, 0x0FE5, 0x646E, 0x28E1, + 0x646F, 0x115A, 0x6470, 0x28E2, 0x6472, 0x269F, 0x6473, 0x26A0, 0x6474, + 0x269D, 0x6475, 0x26A2, 0x6476, 0x269E, 0x6477, 0x26B3, 0x6478, 0x0FDF, + 0x6479, 0x115B, 0x647A, 0x0FE1, 0x647B, 0x0FE6, 0x647D, 0x26A1, 0x647F, + 0x26AD, 0x6482, 0x26A6, 0x6485, 0x28E5, 0x6487, 0x0FDB, 0x6488, 0x115E, + 0x6489, 0x2B54, 0x648A, 0x28EA, 0x648B, 0x28E9, 0x648C, 0x28EB, 0x648F, + 0x28E8, 0x6490, 0x115F, 0x6492, 0x1165, 0x6493, 0x1162, 0x6495, 0x1163, + 0x6496, 0x28E3, 0x6497, 0x28E6, 0x6498, 0x28F0, 0x6499, 0x116B, 0x649A, + 0x1169, 0x649C, 0x28E7, 0x649D, 0x2154, 0x649E, 0x115C, 0x649F, 0x28ED, + 0x64A0, 0x28E4, 0x64A2, 0x116C, 0x64A3, 0x28EC, 0x64A4, 0x0FDE, 0x64A5, + 0x1161, 0x64A6, 0x26A4, 0x64A9, 0x1164, 0x64AB, 0x1168, 0x64AC, 0x116A, + 0x64AD, 0x1167, 0x64AE, 0x1166, 0x64B0, 0x1160, 0x64B1, 0x28EF, 0x64B2, + 0x115D, 0x64B3, 0x116D, 0x64BB, 0x12BB, 0x64BC, 0x12BC, 0x64BD, 0x2B53, + 0x64BE, 0x12C5, 0x64BF, 0x12C2, 0x64C1, 0x12B9, 0x64C2, 0x12C0, 0x64C3, + 0x2B55, 0x64C4, 0x12BE, 0x64C5, 0x12B8, 0x64C7, 0x12BF, 0x64C9, 0x2B52, + 0x64CA, 0x13D8, 0x64CB, 0x12BA, 0x64CD, 0x12C1, 0x64CE, 0x13D7, 0x64CF, + 0x2B51, 0x64D0, 0x2B50, 0x64D2, 0x12C3, 0x64D4, 0x12C4, 0x64D6, 0x2B4F, + 0x64D7, 0x2B4E, 0x64D8, 0x13D9, 0x64D9, 0x2B58, 0x64DA, 0x12BD, 0x64DB, + 0x2B56, 0x64E0, 0x13DA, 0x64E2, 0x13DF, 0x64E3, 0x2D6A, 0x64E4, 0x2D6C, + 0x64E6, 0x13DC, 0x64E8, 0x2D6D, 0x64E9, 0x2D69, 0x64EB, 0x2D6B, 0x64EC, + 0x13DD, 0x64ED, 0x13E0, 0x64EF, 0x2D68, 0x64F0, 0x13DB, 0x64F1, 0x13DE, + 0x64F2, 0x14D3, 0x64F3, 0x2B57, 0x64F4, 0x14D2, 0x64F7, 0x14D8, 0x64F8, + 0x2F2B, 0x64FA, 0x14D6, 0x64FB, 0x14D7, 0x64FC, 0x2F2E, 0x64FD, 0x2F2A, + 0x64FE, 0x14D4, 0x64FF, 0x2F28, 0x6500, 0x1582, 0x6501, 0x2F2C, 0x6503, + 0x2F2D, 0x6504, 0x2F29, 0x6506, 0x14D5, 0x6507, 0x3090, 0x6509, 0x3093, + 0x650C, 0x3094, 0x650D, 0x3092, 0x650E, 0x3095, 0x650F, 0x1583, 0x6510, + 0x3091, 0x6513, 0x31D7, 0x6514, 0x1617, 0x6515, 0x31D6, 0x6516, 0x31D5, + 0x6517, 0x31D4, 0x6518, 0x1616, 0x6519, 0x1618, 0x651B, 0x32D2, 0x651C, + 0x1673, 0x651D, 0x1672, 0x6520, 0x3382, 0x6521, 0x3381, 0x6522, 0x3384, + 0x6523, 0x16F9, 0x6524, 0x16C5, 0x6525, 0x341B, 0x6526, 0x3383, 0x6529, + 0x341A, 0x652A, 0x16FB, 0x652B, 0x16FA, 0x652C, 0x1721, 0x652D, 0x3484, + 0x652E, 0x34CA, 0x652F, 0x02D5, 0x6532, 0x216C, 0x6533, 0x2B59, 0x6534, + 0x022C, 0x6536, 0x03D7, 0x6537, 0x17F6, 0x6538, 0x04B9, 0x6539, 0x04B7, + 0x653B, 0x04B8, 0x653D, 0x19A1, 0x653E, 0x05F3, 0x653F, 0x0741, 0x6541, + 0x1B01, 0x6543, 0x1B02, 0x6545, 0x0742, 0x6546, 0x1CBF, 0x6548, 0x08D6, + 0x6549, 0x08D7, 0x654A, 0x1CBE, 0x654F, 0x0ABD, 0x6551, 0x0AB9, 0x6553, + 0x1F0C, 0x6554, 0x0AC0, 0x6555, 0x0ABF, 0x6556, 0x0AB8, 0x6557, 0x0ABB, + 0x6558, 0x0ABE, 0x6559, 0x0ABA, 0x655C, 0x2170, 0x655D, 0x0AB7, 0x655E, + 0x0C70, 0x6562, 0x0C72, 0x6563, 0x0C73, 0x6564, 0x216F, 0x6565, 0x2172, + 0x6566, 0x0C71, 0x6567, 0x216D, 0x6568, 0x2171, 0x656A, 0x216E, 0x656C, + 0x0E2B, 0x656F, 0x2409, 0x6572, 0x0FE7, 0x6573, 0x26B4, 0x6574, 0x12C6, + 0x6575, 0x116E, 0x6576, 0x28F1, 0x6577, 0x116F, 0x6578, 0x1170, 0x6579, + 0x28F3, 0x657A, 0x28F2, 0x657B, 0x28F4, 0x657C, 0x2B5B, 0x657F, 0x2B5A, + 0x6580, 0x2D6F, 0x6581, 0x2D6E, 0x6582, 0x13E1, 0x6583, 0x13E2, 0x6584, + 0x3096, 0x6587, 0x02D6, 0x658C, 0x2173, 0x6590, 0x0C75, 0x6591, 0x0C74, + 0x6592, 0x240A, 0x6594, 0x2F2F, 0x6595, 0x1674, 0x6596, 0x341C, 0x6597, + 0x02D7, 0x6599, 0x08D8, 0x659B, 0x0AC2, 0x659C, 0x0AC1, 0x659D, 0x2174, + 0x659E, 0x2175, 0x659F, 0x0E2C, 0x65A0, 0x26B5, 0x65A1, 0x0FE8, 0x65A2, + 0x2B5C, 0x65A4, 0x02D8, 0x65A5, 0x0346, 0x65A7, 0x05F4, 0x65A8, 0x19A2, + 0x65AA, 0x1B03, 0x65AB, 0x0743, 0x65AC, 0x0AC3, 0x65AE, 0x2176, 0x65AF, + 0x0C76, 0x65B0, 0x0E2D, 0x65B2, 0x28F5, 0x65B3, 0x28F6, 0x65B6, 0x2D70, + 0x65B7, 0x14D9, 0x65B8, 0x34CB, 0x65B9, 0x02D9, 0x65BB, 0x19A3, 0x65BC, + 0x05F5, 0x65BD, 0x0744, 0x65BF, 0x1B04, 0x65C1, 0x08D9, 0x65C2, 0x1CC3, + 0x65C3, 0x1CC1, 0x65C4, 0x1CC2, 0x65C5, 0x08DA, 0x65C6, 0x1CC0, 0x65CB, + 0x0AC5, 0x65CC, 0x0AC6, 0x65CD, 0x1F0D, 0x65CE, 0x0AC7, 0x65CF, 0x0AC4, + 0x65D0, 0x2177, 0x65D2, 0x2178, 0x65D3, 0x240B, 0x65D6, 0x0FEA, 0x65D7, + 0x0FE9, 0x65DA, 0x2D71, 0x65DB, 0x2F30, 0x65DD, 0x3098, 0x65DE, 0x3097, + 0x65DF, 0x31D8, 0x65E0, 0x022D, 0x65E1, 0x1789, 0x65E2, 0x0745, 0x65E5, + 0x02DA, 0x65E6, 0x0347, 0x65E8, 0x03D9, 0x65E9, 0x03D8, 0x65EC, 0x03DA, + 0x65ED, 0x03DB, 0x65EE, 0x17F8, 0x65EF, 0x17F7, 0x65F0, 0x189E, 0x65F1, + 0x04BA, 0x65F2, 0x18A1, 0x65F3, 0x18A0, 0x65F4, 0x189F, 0x65F5, 0x18A2, + 0x65FA, 0x05F6, 0x65FB, 0x19A9, 0x65FC, 0x19A5, 0x65FD, 0x19AE, 0x6600, + 0x05FD, 0x6602, 0x05FB, 0x6603, 0x19AA, 0x6604, 0x19A6, 0x6605, 0x19AD, + 0x6606, 0x05FA, 0x6607, 0x0601, 0x6608, 0x19A8, 0x6609, 0x19A4, 0x660A, + 0x0600, 0x660B, 0x19AB, 0x660C, 0x05F9, 0x660D, 0x19AC, 0x660E, 0x05FC, + 0x660F, 0x05FE, 0x6610, 0x19B0, 0x6611, 0x19AF, 0x6612, 0x19A7, 0x6613, + 0x05F8, 0x6614, 0x05F7, 0x6615, 0x05FF, 0x661C, 0x1B09, 0x661D, 0x1B0F, + 0x661F, 0x074B, 0x6620, 0x0748, 0x6621, 0x1B06, 0x6622, 0x1B0B, 0x6624, + 0x074E, 0x6625, 0x0746, 0x6626, 0x1B0A, 0x6627, 0x0749, 0x6628, 0x074C, + 0x662B, 0x1B0D, 0x662D, 0x0747, 0x662E, 0x1B12, 0x662F, 0x074A, 0x6631, + 0x074D, 0x6632, 0x1B07, 0x6633, 0x1B0C, 0x6634, 0x1B10, 0x6635, 0x1B08, + 0x6636, 0x1B05, 0x6639, 0x1B11, 0x663A, 0x1B0E, 0x6641, 0x08E2, 0x6642, + 0x08DB, 0x6643, 0x08DE, 0x6645, 0x08E1, 0x6647, 0x1CC6, 0x6649, 0x08DC, + 0x664A, 0x1CC4, 0x664C, 0x08E0, 0x664F, 0x08DD, 0x6651, 0x1CC7, 0x6652, + 0x08DF, 0x6659, 0x1F11, 0x665A, 0x0AC9, 0x665B, 0x1F10, 0x665C, 0x1F12, + 0x665D, 0x0AC8, 0x665E, 0x0ACD, 0x665F, 0x1CC5, 0x6661, 0x1F0F, 0x6662, + 0x1F13, 0x6664, 0x0ACA, 0x6665, 0x1F0E, 0x6666, 0x0ACC, 0x6668, 0x0ACB, + 0x666A, 0x217F, 0x666C, 0x217A, 0x666E, 0x0C77, 0x666F, 0x0C7B, 0x6670, + 0x0C78, 0x6671, 0x217D, 0x6672, 0x2180, 0x6674, 0x0C79, 0x6676, 0x0C7A, + 0x6677, 0x0C7F, 0x6678, 0x2414, 0x6679, 0x217E, 0x667A, 0x0C7D, 0x667B, + 0x217B, 0x667C, 0x2179, 0x667E, 0x0C7E, 0x6680, 0x217C, 0x6684, 0x0E33, + 0x6686, 0x240C, 0x6687, 0x0E30, 0x6688, 0x0E31, 0x6689, 0x0E2F, 0x668A, + 0x2411, 0x668B, 0x2410, 0x668C, 0x240D, 0x668D, 0x0E35, 0x6690, 0x240F, + 0x6691, 0x0C7C, 0x6694, 0x2413, 0x6695, 0x240E, 0x6696, 0x0E32, 0x6697, + 0x0E2E, 0x6698, 0x0E34, 0x6699, 0x2412, 0x669D, 0x0FED, 0x669F, 0x26B8, + 0x66A0, 0x26B7, 0x66A1, 0x26B6, 0x66A2, 0x0FEB, 0x66A8, 0x0FEC, 0x66A9, + 0x28F9, 0x66AA, 0x28FC, 0x66AB, 0x1172, 0x66AE, 0x1171, 0x66AF, 0x28FD, + 0x66B0, 0x28F8, 0x66B1, 0x1174, 0x66B2, 0x28FA, 0x66B4, 0x1173, 0x66B5, + 0x28F7, 0x66B7, 0x28FB, 0x66B8, 0x12CC, 0x66B9, 0x12C9, 0x66BA, 0x2B65, + 0x66BB, 0x2B64, 0x66BD, 0x2B63, 0x66BE, 0x2B5E, 0x66C0, 0x2B5F, 0x66C4, + 0x12CA, 0x66C6, 0x12C7, 0x66C7, 0x12CB, 0x66C8, 0x2B5D, 0x66C9, 0x12C8, + 0x66CA, 0x2B60, 0x66CB, 0x2B61, 0x66CC, 0x2B66, 0x66CF, 0x2B62, 0x66D2, + 0x2D72, 0x66D6, 0x13E4, 0x66D8, 0x2F33, 0x66D9, 0x13E3, 0x66DA, 0x2F31, + 0x66DB, 0x2F32, 0x66DC, 0x14DA, 0x66DD, 0x1585, 0x66DE, 0x3099, 0x66E0, + 0x1584, 0x66E3, 0x31DA, 0x66E4, 0x31DB, 0x66E6, 0x1619, 0x66E8, 0x31D9, + 0x66E9, 0x1675, 0x66EB, 0x341D, 0x66EC, 0x16FC, 0x66ED, 0x3485, 0x66EE, + 0x3486, 0x66F0, 0x02DB, 0x66F2, 0x03DC, 0x66F3, 0x03DD, 0x66F4, 0x04BB, + 0x66F6, 0x19B1, 0x66F7, 0x074F, 0x66F8, 0x08E3, 0x66F9, 0x0ACE, 0x66FC, + 0x0A1F, 0x66FE, 0x0C80, 0x66FF, 0x0C81, 0x6700, 0x0BF0, 0x6701, 0x2181, + 0x6703, 0x0E36, 0x6704, 0x26BA, 0x6705, 0x26B9, 0x6708, 0x02DC, 0x6709, + 0x03DE, 0x670A, 0x19B2, 0x670B, 0x0603, 0x670D, 0x0602, 0x670F, 0x1B13, + 0x6710, 0x1B14, 0x6712, 0x1CC8, 0x6713, 0x1CC9, 0x6714, 0x08E4, 0x6715, + 0x08E5, 0x6717, 0x08E6, 0x6718, 0x1F14, 0x671B, 0x0AD0, 0x671D, 0x0C83, + 0x671F, 0x0C82, 0x6720, 0x2415, 0x6721, 0x2522, 0x6722, 0x26BB, 0x6723, + 0x2B67, 0x6726, 0x14DB, 0x6727, 0x161A, 0x6728, 0x02DD, 0x672A, 0x034A, + 0x672B, 0x034B, 0x672C, 0x0349, 0x672D, 0x034C, 0x672E, 0x0348, 0x6731, + 0x03E1, 0x6733, 0x1800, 0x6734, 0x03E0, 0x6735, 0x03E2, 0x6738, 0x17FB, + 0x6739, 0x17FA, 0x673A, 0x17FD, 0x673B, 0x17FC, 0x673C, 0x17FF, 0x673D, + 0x03DF, 0x673E, 0x17F9, 0x673F, 0x17FE, 0x6745, 0x18A3, 0x6746, 0x04C5, + 0x6747, 0x18A4, 0x6748, 0x18A8, 0x6749, 0x04C4, 0x674B, 0x18AC, 0x674C, + 0x18A7, 0x674D, 0x18AA, 0x674E, 0x04BD, 0x674F, 0x04BE, 0x6750, 0x04BF, + 0x6751, 0x04C0, 0x6753, 0x04C7, 0x6755, 0x18A6, 0x6756, 0x04C2, 0x6757, + 0x04C8, 0x6759, 0x18A5, 0x675A, 0x18AB, 0x675C, 0x04C1, 0x675D, 0x18A9, + 0x675E, 0x04C3, 0x675F, 0x04BC, 0x6760, 0x04C6, 0x676A, 0x0618, 0x676C, + 0x19B4, 0x676D, 0x0604, 0x676F, 0x060E, 0x6770, 0x060F, 0x6771, 0x0607, + 0x6772, 0x0619, 0x6773, 0x0609, 0x6774, 0x19BC, 0x6775, 0x0614, 0x6776, + 0x19B7, 0x6777, 0x060A, 0x6778, 0x19C6, 0x6779, 0x19C7, 0x677A, 0x19BF, + 0x677B, 0x19B8, 0x677C, 0x0617, 0x677D, 0x19C4, 0x677E, 0x0612, 0x677F, + 0x0610, 0x6781, 0x19C5, 0x6783, 0x19C3, 0x6784, 0x19BB, 0x6785, 0x19B3, + 0x6786, 0x19BA, 0x6787, 0x060B, 0x6789, 0x0611, 0x678B, 0x0605, 0x678C, + 0x19BE, 0x678D, 0x19BD, 0x678E, 0x19B5, 0x6790, 0x0613, 0x6791, 0x19C1, + 0x6792, 0x19B6, 0x6793, 0x0616, 0x6794, 0x19C8, 0x6795, 0x0606, 0x6797, + 0x060D, 0x6798, 0x19B9, 0x6799, 0x19C2, 0x679A, 0x0615, 0x679C, 0x0608, + 0x679D, 0x060C, 0x679F, 0x19C0, 0x67AE, 0x1B34, 0x67AF, 0x0757, 0x67B0, + 0x0764, 0x67B2, 0x1B2F, 0x67B3, 0x1B25, 0x67B4, 0x075D, 0x67B5, 0x1B23, + 0x67B6, 0x0756, 0x67B7, 0x1B1E, 0x67B8, 0x0760, 0x67B9, 0x1B2B, 0x67BA, + 0x1B18, 0x67BB, 0x1B1A, 0x67C0, 0x1B1D, 0x67C1, 0x1B15, 0x67C2, 0x1B2A, + 0x67C3, 0x1B3A, 0x67C4, 0x075B, 0x67C5, 0x1B1F, 0x67C6, 0x1B31, 0x67C8, + 0x1B17, 0x67C9, 0x1B38, 0x67CA, 0x1B39, 0x67CB, 0x1B3C, 0x67CC, 0x1B33, + 0x67CD, 0x1B24, 0x67CE, 0x1B2C, 0x67CF, 0x0761, 0x67D0, 0x0754, 0x67D1, + 0x075C, 0x67D2, 0x0768, 0x67D3, 0x0751, 0x67D4, 0x0753, 0x67D8, 0x1B1C, + 0x67D9, 0x0765, 0x67DA, 0x075E, 0x67DB, 0x1B36, 0x67DC, 0x1B19, 0x67DD, + 0x0767, 0x67DE, 0x0762, 0x67DF, 0x1B22, 0x67E2, 0x0766, 0x67E3, 0x1B29, + 0x67E4, 0x1B21, 0x67E5, 0x075F, 0x67E6, 0x1B35, 0x67E7, 0x1B2D, 0x67E9, + 0x0759, 0x67EA, 0x1B3B, 0x67EB, 0x1B20, 0x67EC, 0x0755, 0x67ED, 0x1B32, + 0x67EE, 0x1B28, 0x67EF, 0x075A, 0x67F0, 0x1B2E, 0x67F1, 0x0752, 0x67F2, + 0x1B16, 0x67F3, 0x0763, 0x67F4, 0x08F5, 0x67F5, 0x0758, 0x67F6, 0x1B27, + 0x67F7, 0x1B26, 0x67F8, 0x1B1B, 0x67FA, 0x1B37, 0x67FC, 0x1B30, 0x67FF, + 0x0750, 0x6812, 0x1CDD, 0x6813, 0x08FC, 0x6814, 0x1CDE, 0x6816, 0x1CD2, + 0x6817, 0x08F1, 0x6818, 0x08FD, 0x681A, 0x1CCB, 0x681C, 0x1CD4, 0x681D, + 0x1CDC, 0x681F, 0x1CCA, 0x6820, 0x1CE5, 0x6821, 0x08E7, 0x6825, 0x1CE4, + 0x6826, 0x1CDF, 0x6828, 0x1CE0, 0x6829, 0x08EF, 0x682A, 0x08FA, 0x682B, + 0x1CD6, 0x682D, 0x1CD7, 0x682E, 0x1CE1, 0x682F, 0x1CD8, 0x6831, 0x1CD3, + 0x6832, 0x1CCD, 0x6833, 0x1CCE, 0x6834, 0x1CDB, 0x6835, 0x1CD5, 0x6838, + 0x08E8, 0x6839, 0x08EC, 0x683A, 0x1CE3, 0x683B, 0x1CCF, 0x683C, 0x08F8, + 0x683D, 0x08F4, 0x6840, 0x08F7, 0x6841, 0x08FE, 0x6842, 0x08ED, 0x6843, + 0x08F9, 0x6844, 0x1CDA, 0x6845, 0x08FB, 0x6846, 0x08EA, 0x6848, 0x08E9, + 0x6849, 0x1CCC, 0x684B, 0x1CD0, 0x684C, 0x08F2, 0x684D, 0x1CE2, 0x684E, + 0x1CD9, 0x684F, 0x1CD1, 0x6850, 0x08F6, 0x6851, 0x08F3, 0x6853, 0x08EB, + 0x6854, 0x08EE, 0x686B, 0x1F29, 0x686D, 0x1F19, 0x686E, 0x1F1A, 0x686F, + 0x1F1E, 0x6871, 0x1F2D, 0x6872, 0x1F2A, 0x6874, 0x1F23, 0x6875, 0x1F22, + 0x6876, 0x0AD7, 0x6877, 0x1F26, 0x6878, 0x1F35, 0x6879, 0x1F15, 0x687B, + 0x1F36, 0x687C, 0x1F28, 0x687D, 0x1F3A, 0x687E, 0x1F2E, 0x687F, 0x0AD6, + 0x6880, 0x1F2C, 0x6881, 0x0AD1, 0x6882, 0x0AE6, 0x6883, 0x0ADC, 0x6885, + 0x0AE0, 0x6886, 0x0ADF, 0x6887, 0x1F16, 0x6889, 0x1F33, 0x688A, 0x1F39, + 0x688B, 0x1F31, 0x688C, 0x1F38, 0x688F, 0x1F25, 0x6890, 0x1F17, 0x6891, + 0x1F37, 0x6892, 0x1F27, 0x6893, 0x0AD4, 0x6894, 0x0AE1, 0x6896, 0x1F30, + 0x6897, 0x0ADA, 0x689B, 0x1F2F, 0x689C, 0x1F18, 0x689D, 0x0AE2, 0x689F, + 0x0AE4, 0x68A0, 0x1F32, 0x68A1, 0x0AE5, 0x68A2, 0x0AD3, 0x68A3, 0x1F1F, + 0x68A4, 0x1F34, 0x68A7, 0x0AD9, 0x68A8, 0x0AE3, 0x68A9, 0x1F21, 0x68AA, + 0x1F2B, 0x68AB, 0x1F1C, 0x68AC, 0x1F20, 0x68AD, 0x0ADE, 0x68AE, 0x1F1B, + 0x68AF, 0x0AD2, 0x68B0, 0x0ADB, 0x68B1, 0x0AD8, 0x68B2, 0x1F24, 0x68B3, + 0x08F0, 0x68B4, 0x2198, 0x68B5, 0x0AD5, 0x68C4, 0x0ADD, 0x68C6, 0x219B, + 0x68C7, 0x21B1, 0x68C8, 0x21A6, 0x68C9, 0x0C97, 0x68CB, 0x0C92, 0x68CC, + 0x2195, 0x68CD, 0x0C93, 0x68CE, 0x21A5, 0x68D0, 0x219E, 0x68D1, 0x21AB, + 0x68D2, 0x0C8F, 0x68D3, 0x2183, 0x68D4, 0x21AD, 0x68D5, 0x0C85, 0x68D6, + 0x218B, 0x68D7, 0x0C88, 0x68D8, 0x0C87, 0x68DA, 0x0C98, 0x68DC, 0x2185, + 0x68DD, 0x21A7, 0x68DE, 0x21A8, 0x68DF, 0x0C8A, 0x68E0, 0x0C86, 0x68E1, + 0x2193, 0x68E3, 0x0C91, 0x68E4, 0x218E, 0x68E6, 0x21A9, 0x68E7, 0x0C8D, + 0x68E8, 0x21A1, 0x68E9, 0x21AE, 0x68EA, 0x2188, 0x68EB, 0x218D, 0x68EC, + 0x2187, 0x68EE, 0x0C8C, 0x68EF, 0x219A, 0x68F0, 0x242B, 0x68F1, 0x2189, + 0x68F2, 0x0C90, 0x68F3, 0x2192, 0x68F4, 0x21AA, 0x68F5, 0x0C8B, 0x68F6, + 0x218F, 0x68F7, 0x218C, 0x68F8, 0x219D, 0x68F9, 0x0C8E, 0x68FA, 0x0C84, + 0x68FB, 0x0C9A, 0x68FC, 0x21A0, 0x68FD, 0x219F, 0x6904, 0x2184, 0x6905, + 0x0C89, 0x6906, 0x21AC, 0x6907, 0x2194, 0x6908, 0x2196, 0x690A, 0x21A3, + 0x690B, 0x21A2, 0x690C, 0x2182, 0x690D, 0x0C94, 0x690E, 0x0C96, 0x690F, + 0x218A, 0x6910, 0x2191, 0x6911, 0x2199, 0x6912, 0x0C95, 0x6913, 0x2190, + 0x6914, 0x219C, 0x6915, 0x21AF, 0x6917, 0x21A4, 0x6925, 0x21B0, 0x692A, + 0x2186, 0x692F, 0x243F, 0x6930, 0x0E3E, 0x6932, 0x243D, 0x6933, 0x2428, + 0x6934, 0x242D, 0x6935, 0x2426, 0x6937, 0x2439, 0x6938, 0x2418, 0x6939, + 0x241F, 0x693B, 0x2437, 0x693C, 0x2441, 0x693D, 0x2429, 0x693F, 0x241C, + 0x6940, 0x242F, 0x6941, 0x2434, 0x6942, 0x2420, 0x6944, 0x2431, 0x6945, + 0x241D, 0x6948, 0x2424, 0x6949, 0x2425, 0x694A, 0x0E40, 0x694B, 0x2438, + 0x694C, 0x2436, 0x694E, 0x2419, 0x694F, 0x243B, 0x6951, 0x243C, 0x6952, + 0x243E, 0x6953, 0x0E44, 0x6954, 0x0E3C, 0x6956, 0x1F1D, 0x6957, 0x2421, + 0x6958, 0x2433, 0x6959, 0x2422, 0x695A, 0x0E39, 0x695B, 0x0E49, 0x695C, + 0x243A, 0x695D, 0x0E47, 0x695E, 0x0E43, 0x695F, 0x2417, 0x6960, 0x0E3B, + 0x6962, 0x241A, 0x6963, 0x0E48, 0x6965, 0x242A, 0x6966, 0x2416, 0x6968, + 0x0E41, 0x6969, 0x242E, 0x696A, 0x241E, 0x696B, 0x0E42, 0x696C, 0x2427, + 0x696D, 0x0E38, 0x696E, 0x0C99, 0x696F, 0x2430, 0x6970, 0x2197, 0x6971, + 0x241B, 0x6974, 0x2435, 0x6975, 0x0E3D, 0x6976, 0x2432, 0x6977, 0x0E3A, + 0x6978, 0x242C, 0x6979, 0x0E45, 0x697A, 0x2423, 0x697B, 0x2440, 0x6982, + 0x0E3F, 0x6983, 0x24AF, 0x6986, 0x0E46, 0x698D, 0x26C9, 0x698E, 0x26C7, + 0x6990, 0x26DD, 0x6991, 0x26C5, 0x6993, 0x26D7, 0x6994, 0x0E37, 0x6995, + 0x0FF0, 0x6996, 0x26C1, 0x6997, 0x26DC, 0x6999, 0x26C6, 0x699A, 0x26D4, + 0x699B, 0x0FF5, 0x699C, 0x0FEE, 0x699E, 0x26DA, 0x69A0, 0x26BF, 0x69A1, + 0x26D9, 0x69A3, 0x1000, 0x69A4, 0x26D0, 0x69A5, 0x26E0, 0x69A6, 0x0FFE, + 0x69A7, 0x26C8, 0x69A8, 0x0FEF, 0x69A9, 0x26CA, 0x69AA, 0x26D8, 0x69AB, + 0x0FF8, 0x69AC, 0x26C3, 0x69AD, 0x0FFC, 0x69AE, 0x0FF2, 0x69AF, 0x26CC, + 0x69B0, 0x26C2, 0x69B1, 0x26BC, 0x69B3, 0x26D6, 0x69B4, 0x0FF9, 0x69B5, + 0x26DF, 0x69B6, 0x26BD, 0x69B7, 0x0FF6, 0x69B9, 0x26D2, 0x69BB, 0x0FF7, + 0x69BC, 0x26C4, 0x69BD, 0x26CF, 0x69BE, 0x26CB, 0x69BF, 0x26CD, 0x69C1, + 0x0FF1, 0x69C2, 0x26DE, 0x69C3, 0x0FFF, 0x69C4, 0x26CE, 0x69C6, 0x26E1, + 0x69C9, 0x26BE, 0x69CA, 0x26D3, 0x69CB, 0x0FF4, 0x69CC, 0x0FFD, 0x69CD, + 0x0FFB, 0x69CE, 0x26C0, 0x69CF, 0x26D5, 0x69D0, 0x0FFA, 0x69D3, 0x0FF3, + 0x69D4, 0x26D1, 0x69D9, 0x26DB, 0x69E2, 0x2909, 0x69E4, 0x2905, 0x69E5, + 0x2901, 0x69E6, 0x2915, 0x69E7, 0x2912, 0x69E8, 0x1177, 0x69EB, 0x2919, + 0x69EC, 0x2908, 0x69ED, 0x1182, 0x69EE, 0x290F, 0x69F1, 0x2904, 0x69F2, + 0x290E, 0x69F3, 0x117F, 0x69F4, 0x2922, 0x69F6, 0x291F, 0x69F7, 0x2911, + 0x69F8, 0x2902, 0x69FB, 0x2916, 0x69FC, 0x2918, 0x69FD, 0x117B, 0x69FE, + 0x290C, 0x69FF, 0x2907, 0x6A00, 0x28FE, 0x6A01, 0x1178, 0x6A02, 0x1180, + 0x6A04, 0x291B, 0x6A05, 0x1181, 0x6A06, 0x28FF, 0x6A07, 0x2921, 0x6A08, + 0x2914, 0x6A09, 0x291A, 0x6A0A, 0x117E, 0x6A0D, 0x2917, 0x6A0F, 0x291E, + 0x6A11, 0x1183, 0x6A13, 0x117D, 0x6A14, 0x2910, 0x6A15, 0x2903, 0x6A16, + 0x2923, 0x6A17, 0x2900, 0x6A18, 0x291C, 0x6A19, 0x117A, 0x6A1B, 0x290A, + 0x6A1D, 0x290B, 0x6A1E, 0x1179, 0x6A1F, 0x1176, 0x6A20, 0x2906, 0x6A21, + 0x117C, 0x6A23, 0x1175, 0x6A25, 0x291D, 0x6A26, 0x2920, 0x6A27, 0x290D, + 0x6A28, 0x2B74, 0x6A32, 0x2B6C, 0x6A34, 0x2B68, 0x6A35, 0x12D9, 0x6A38, + 0x12CE, 0x6A39, 0x12D3, 0x6A3A, 0x12CF, 0x6A3B, 0x2B76, 0x6A3C, 0x2B81, + 0x6A3D, 0x12CD, 0x6A3E, 0x2B6E, 0x6A3F, 0x2B77, 0x6A40, 0x2913, 0x6A41, + 0x2B78, 0x6A44, 0x12D4, 0x6A46, 0x2B87, 0x6A47, 0x12D8, 0x6A48, 0x12DB, + 0x6A49, 0x2B6A, 0x6A4B, 0x12D7, 0x6A4D, 0x2B85, 0x6A4E, 0x2B86, 0x6A4F, + 0x2B7C, 0x6A50, 0x2B7B, 0x6A51, 0x2B73, 0x6A54, 0x2B7D, 0x6A55, 0x2B84, + 0x6A56, 0x2B83, 0x6A58, 0x12D2, 0x6A59, 0x12D0, 0x6A5A, 0x2B75, 0x6A5B, + 0x2B72, 0x6A5D, 0x2B6F, 0x6A5E, 0x2B82, 0x6A5F, 0x12DA, 0x6A60, 0x2B80, + 0x6A61, 0x12D6, 0x6A62, 0x12D5, 0x6A64, 0x2B7A, 0x6A66, 0x2B69, 0x6A67, + 0x2B6B, 0x6A68, 0x2B6D, 0x6A69, 0x2B7F, 0x6A6A, 0x2B79, 0x6A6B, 0x12D1, + 0x6A6D, 0x2B70, 0x6A6F, 0x2B7E, 0x6A76, 0x2B71, 0x6A7E, 0x13EC, 0x6A7F, + 0x2D84, 0x6A80, 0x13E5, 0x6A81, 0x2D75, 0x6A83, 0x2D80, 0x6A84, 0x13E7, + 0x6A85, 0x2D87, 0x6A87, 0x2D7C, 0x6A89, 0x2D77, 0x6A8C, 0x2D88, 0x6A8D, + 0x2D73, 0x6A8E, 0x2D7E, 0x6A90, 0x13EE, 0x6A91, 0x2D83, 0x6A92, 0x2D89, + 0x6A93, 0x2D7D, 0x6A94, 0x13E6, 0x6A95, 0x2D7F, 0x6A96, 0x2D74, 0x6A97, + 0x13ED, 0x6A9A, 0x2D86, 0x6A9B, 0x2D79, 0x6A9C, 0x13E9, 0x6A9E, 0x2D7B, + 0x6A9F, 0x2D78, 0x6AA0, 0x13EF, 0x6AA1, 0x2D7A, 0x6AA2, 0x13E8, 0x6AA3, + 0x13EB, 0x6AA4, 0x2D82, 0x6AA5, 0x2D76, 0x6AA6, 0x2D85, 0x6AA8, 0x2D81, + 0x6AAC, 0x14DD, 0x6AAD, 0x2F3E, 0x6AAE, 0x14E2, 0x6AAF, 0x14E3, 0x6AB3, + 0x14DC, 0x6AB4, 0x2F3D, 0x6AB6, 0x2F3A, 0x6AB7, 0x2F3B, 0x6AB8, 0x14E0, + 0x6AB9, 0x2F35, 0x6ABA, 0x2F39, 0x6ABB, 0x14DF, 0x6ABD, 0x2F36, 0x6AC2, + 0x14E1, 0x6AC3, 0x14DE, 0x6AC5, 0x2F34, 0x6AC6, 0x2F38, 0x6AC7, 0x2F3C, + 0x6ACB, 0x309F, 0x6ACC, 0x309C, 0x6ACD, 0x30A5, 0x6ACF, 0x30A4, 0x6AD0, + 0x30A2, 0x6AD1, 0x309D, 0x6AD3, 0x1589, 0x6AD9, 0x309E, 0x6ADA, 0x1588, + 0x6ADB, 0x13EA, 0x6ADC, 0x30A1, 0x6ADD, 0x1587, 0x6ADE, 0x30A6, 0x6ADF, + 0x30A0, 0x6AE0, 0x309B, 0x6AE1, 0x2F37, 0x6AE5, 0x1586, 0x6AE7, 0x309A, + 0x6AE8, 0x31DF, 0x6AEA, 0x31DE, 0x6AEB, 0x30A3, 0x6AEC, 0x161B, 0x6AEE, + 0x31E2, 0x6AEF, 0x31E3, 0x6AF0, 0x31DD, 0x6AF1, 0x31E1, 0x6AF3, 0x31DC, + 0x6AF8, 0x32D6, 0x6AF9, 0x31E0, 0x6AFA, 0x1678, 0x6AFB, 0x1676, 0x6AFC, + 0x32D4, 0x6B00, 0x32D7, 0x6B02, 0x32D3, 0x6B03, 0x32D5, 0x6B04, 0x1677, + 0x6B08, 0x3386, 0x6B09, 0x3387, 0x6B0A, 0x16C6, 0x6B0B, 0x3385, 0x6B0F, + 0x3420, 0x6B10, 0x16FD, 0x6B11, 0x341E, 0x6B12, 0x341F, 0x6B13, 0x3487, + 0x6B16, 0x1743, 0x6B17, 0x34CE, 0x6B18, 0x34CC, 0x6B19, 0x34CD, 0x6B1A, + 0x34CF, 0x6B1E, 0x3534, 0x6B20, 0x02DE, 0x6B21, 0x03E3, 0x6B23, 0x061A, + 0x6B25, 0x19C9, 0x6B28, 0x1B3D, 0x6B2C, 0x1CE6, 0x6B2D, 0x1CE8, 0x6B2F, + 0x1CE7, 0x6B31, 0x1CE9, 0x6B32, 0x0AE7, 0x6B33, 0x1F3C, 0x6B34, 0x1CEA, + 0x6B36, 0x1F3B, 0x6B37, 0x1F3D, 0x6B38, 0x1F3E, 0x6B39, 0x21B2, 0x6B3A, + 0x0C9C, 0x6B3B, 0x21B3, 0x6B3C, 0x21B5, 0x6B3D, 0x0C9D, 0x6B3E, 0x0C9B, + 0x6B3F, 0x21B4, 0x6B41, 0x2447, 0x6B42, 0x2445, 0x6B43, 0x2444, 0x6B45, + 0x2443, 0x6B46, 0x2442, 0x6B47, 0x0E4A, 0x6B48, 0x2446, 0x6B49, 0x1001, + 0x6B4A, 0x26E2, 0x6B4B, 0x26E4, 0x6B4C, 0x1002, 0x6B4D, 0x26E3, 0x6B4E, + 0x1185, 0x6B50, 0x1184, 0x6B51, 0x2924, 0x6B54, 0x2B89, 0x6B55, 0x2B88, + 0x6B56, 0x2B8A, 0x6B59, 0x12DC, 0x6B5B, 0x2D8A, 0x6B5C, 0x13F0, 0x6B5E, + 0x2F3F, 0x6B5F, 0x14E4, 0x6B60, 0x30A7, 0x6B61, 0x16C7, 0x6B62, 0x02DF, + 0x6B63, 0x034D, 0x6B64, 0x03E4, 0x6B65, 0x04C9, 0x6B66, 0x061B, 0x6B67, + 0x061C, 0x6B6A, 0x0769, 0x6B6D, 0x1CEB, 0x6B72, 0x0E4B, 0x6B76, 0x29A2, + 0x6B77, 0x12DD, 0x6B78, 0x14E5, 0x6B79, 0x02E0, 0x6B7B, 0x03E5, 0x6B7E, + 0x19CB, 0x6B7F, 0x061D, 0x6B80, 0x19CA, 0x6B82, 0x1B3E, 0x6B83, 0x076A, + 0x6B84, 0x1B3F, 0x6B86, 0x076B, 0x6B88, 0x1CED, 0x6B89, 0x0900, 0x6B8A, + 0x08FF, 0x6B8C, 0x1F43, 0x6B8D, 0x1F41, 0x6B8E, 0x1F42, 0x6B8F, 0x1F40, + 0x6B91, 0x1F3F, 0x6B94, 0x21B6, 0x6B95, 0x21B9, 0x6B96, 0x0C9F, 0x6B97, + 0x21B7, 0x6B98, 0x0C9E, 0x6B99, 0x21B8, 0x6B9B, 0x2448, 0x6B9E, 0x26E5, + 0x6B9F, 0x26E6, 0x6BA0, 0x26E7, 0x6BA2, 0x2927, 0x6BA3, 0x2926, 0x6BA4, + 0x1186, 0x6BA5, 0x2925, 0x6BA6, 0x2928, 0x6BA7, 0x2B8B, 0x6BAA, 0x2B8C, + 0x6BAB, 0x2B8D, 0x6BAD, 0x2D8B, 0x6BAE, 0x13F1, 0x6BAF, 0x14E6, 0x6BB0, + 0x30A8, 0x6BB2, 0x1679, 0x6BB3, 0x178A, 0x6BB5, 0x076C, 0x6BB6, 0x1B40, + 0x6BB7, 0x0901, 0x6BBA, 0x0AE8, 0x6BBC, 0x0CA0, 0x6BBD, 0x21BA, 0x6BBF, + 0x0E4D, 0x6BC0, 0x0E4C, 0x6BC3, 0x26E8, 0x6BC4, 0x26E9, 0x6BC5, 0x1187, + 0x6BC6, 0x1188, 0x6BC7, 0x2B8F, 0x6BC8, 0x2B8E, 0x6BC9, 0x2F40, 0x6BCA, + 0x3421, 0x6BCB, 0x02E1, 0x6BCC, 0x178B, 0x6BCD, 0x034E, 0x6BCF, 0x04CA, + 0x6BD0, 0x18AD, 0x6BD2, 0x076D, 0x6BD3, 0x0E4E, 0x6BD4, 0x02E2, 0x6BD6, + 0x1B41, 0x6BD7, 0x076E, 0x6BD8, 0x1B42, 0x6BDA, 0x13F2, 0x6BDB, 0x02E3, + 0x6BDE, 0x19CC, 0x6BE0, 0x1B43, 0x6BE2, 0x1CF2, 0x6BE3, 0x1CF1, 0x6BE4, + 0x1CEF, 0x6BE6, 0x1CEE, 0x6BE7, 0x1CF3, 0x6BE8, 0x1CF0, 0x6BEB, 0x0AE9, + 0x6BEC, 0x0AEA, 0x6BEF, 0x0CA1, 0x6BF0, 0x21BB, 0x6BF2, 0x21BC, 0x6BF3, + 0x21BD, 0x6BF7, 0x244C, 0x6BF8, 0x244D, 0x6BF9, 0x244B, 0x6BFB, 0x2449, + 0x6BFC, 0x244A, 0x6BFD, 0x0E4F, 0x6BFE, 0x26EA, 0x6BFF, 0x292B, 0x6C00, + 0x292A, 0x6C01, 0x2929, 0x6C02, 0x292C, 0x6C03, 0x2B91, 0x6C04, 0x2B90, + 0x6C05, 0x12DE, 0x6C06, 0x2B92, 0x6C08, 0x13F3, 0x6C09, 0x2D8C, 0x6C0B, + 0x2F41, 0x6C0C, 0x30A9, 0x6C0D, 0x3388, 0x6C0F, 0x02E4, 0x6C10, 0x0350, + 0x6C11, 0x034F, 0x6C13, 0x061E, 0x6C14, 0x178C, 0x6C15, 0x17AA, 0x6C16, + 0x03E6, 0x6C18, 0x1801, 0x6C19, 0x18AE, 0x6C1A, 0x18AF, 0x6C1B, 0x061F, + 0x6C1D, 0x19CD, 0x6C1F, 0x076F, 0x6C20, 0x1B44, 0x6C21, 0x1B45, 0x6C23, + 0x0902, 0x6C24, 0x0906, 0x6C25, 0x1CF4, 0x6C26, 0x0905, 0x6C27, 0x0903, + 0x6C28, 0x0904, 0x6C2A, 0x1F44, 0x6C2B, 0x0AEB, 0x6C2C, 0x0CA4, 0x6C2E, + 0x0CA2, 0x6C2F, 0x0CA3, 0x6C30, 0x21BE, 0x6C33, 0x1003, 0x6C34, 0x02E5, + 0x6C36, 0x17AB, 0x6C38, 0x0351, 0x6C3B, 0x17AE, 0x6C3E, 0x0354, 0x6C3F, + 0x17AD, 0x6C40, 0x0353, 0x6C41, 0x0352, 0x6C42, 0x04CB, 0x6C43, 0x17AC, + 0x6C46, 0x1802, 0x6C4A, 0x1806, 0x6C4B, 0x1808, 0x6C4C, 0x1809, 0x6C4D, + 0x03F0, 0x6C4E, 0x03F1, 0x6C4F, 0x1805, 0x6C50, 0x03EC, 0x6C52, 0x1803, + 0x6C54, 0x1807, 0x6C55, 0x03ED, 0x6C57, 0x03E8, 0x6C59, 0x03E9, 0x6C5B, + 0x03EF, 0x6C5C, 0x1804, 0x6C5D, 0x03E7, 0x6C5E, 0x04CC, 0x6C5F, 0x03EA, + 0x6C60, 0x03EB, 0x6C61, 0x03EE, 0x6C65, 0x18C0, 0x6C66, 0x18BE, 0x6C67, + 0x18B1, 0x6C68, 0x04D8, 0x6C69, 0x18B8, 0x6C6A, 0x04D3, 0x6C6B, 0x18B2, + 0x6C6D, 0x18BA, 0x6C6F, 0x18B7, 0x6C70, 0x04D6, 0x6C71, 0x18B6, 0x6C72, + 0x04DD, 0x6C73, 0x18BF, 0x6C74, 0x04DF, 0x6C76, 0x04E1, 0x6C78, 0x18B0, + 0x6C7A, 0x04D4, 0x6C7B, 0x18C1, 0x6C7D, 0x04DB, 0x6C7E, 0x04DE, 0x6C80, + 0x19E4, 0x6C81, 0x04CE, 0x6C82, 0x04E5, 0x6C83, 0x04DC, 0x6C84, 0x18B3, + 0x6C85, 0x04D1, 0x6C86, 0x04E0, 0x6C87, 0x18BB, 0x6C88, 0x04CF, 0x6C89, + 0x04D0, 0x6C8A, 0x19E2, 0x6C8B, 0x18B4, 0x6C8C, 0x04D7, 0x6C8D, 0x04E2, + 0x6C8E, 0x18C2, 0x6C8F, 0x18B5, 0x6C90, 0x04D5, 0x6C92, 0x04DA, 0x6C93, + 0x19CE, 0x6C94, 0x04E3, 0x6C95, 0x18BC, 0x6C96, 0x04D9, 0x6C98, 0x04E4, + 0x6C99, 0x04CD, 0x6C9A, 0x18B9, 0x6C9B, 0x04D2, 0x6C9C, 0x18BD, 0x6C9D, + 0x19E3, 0x6CAB, 0x062B, 0x6CAC, 0x063B, 0x6CAD, 0x19D5, 0x6CAE, 0x0632, + 0x6CB0, 0x19EA, 0x6CB1, 0x0623, 0x6CB3, 0x0626, 0x6CB4, 0x19E1, 0x6CB6, + 0x19D3, 0x6CB7, 0x19D7, 0x6CB8, 0x062E, 0x6CB9, 0x0630, 0x6CBA, 0x19DA, + 0x6CBB, 0x0637, 0x6CBC, 0x0629, 0x6CBD, 0x0627, 0x6CBE, 0x0628, 0x6CBF, + 0x0636, 0x6CC0, 0x19E6, 0x6CC1, 0x0631, 0x6CC2, 0x19D9, 0x6CC3, 0x19DB, + 0x6CC4, 0x062F, 0x6CC5, 0x0634, 0x6CC6, 0x19DC, 0x6CC7, 0x19E9, 0x6CC9, + 0x0770, 0x6CCA, 0x063A, 0x6CCC, 0x0624, 0x6CCD, 0x19E8, 0x6CCF, 0x19EC, + 0x6CD0, 0x19D8, 0x6CD1, 0x19EE, 0x6CD2, 0x19DF, 0x6CD3, 0x062D, 0x6CD4, + 0x19D4, 0x6CD5, 0x062C, 0x6CD6, 0x063E, 0x6CD7, 0x0633, 0x6CD9, 0x19D2, + 0x6CDA, 0x1B4E, 0x6CDB, 0x0639, 0x6CDC, 0x063D, 0x6CDD, 0x19E0, 0x6CDE, + 0x19E5, 0x6CE0, 0x063F, 0x6CE1, 0x0638, 0x6CE2, 0x062A, 0x6CE3, 0x0620, + 0x6CE5, 0x0625, 0x6CE7, 0x19D6, 0x6CE8, 0x0621, 0x6CE9, 0x19ED, 0x6CEB, + 0x19D0, 0x6CEC, 0x19CF, 0x6CED, 0x19DD, 0x6CEE, 0x19D1, 0x6CEF, 0x063C, + 0x6CF0, 0x0907, 0x6CF1, 0x0635, 0x6CF2, 0x19DE, 0x6CF3, 0x0622, 0x6CF5, + 0x077F, 0x6CF9, 0x19EB, 0x6D00, 0x1B55, 0x6D01, 0x1B58, 0x6D03, 0x1B5B, + 0x6D04, 0x1B50, 0x6D07, 0x1B5E, 0x6D08, 0x1B61, 0x6D09, 0x1B63, 0x6D0A, + 0x1B4D, 0x6D0B, 0x0771, 0x6D0C, 0x0776, 0x6D0D, 0x1CF9, 0x6D0E, 0x0786, + 0x6D0F, 0x1B5C, 0x6D10, 0x1B64, 0x6D11, 0x1B54, 0x6D12, 0x1B4C, 0x6D16, + 0x1D14, 0x6D17, 0x0779, 0x6D18, 0x1B59, 0x6D19, 0x1B51, 0x6D1A, 0x1B53, + 0x6D1B, 0x077E, 0x6D1D, 0x1B56, 0x6D1E, 0x0778, 0x6D1F, 0x1B49, 0x6D20, + 0x1B5F, 0x6D22, 0x1B62, 0x6D25, 0x0775, 0x6D27, 0x0781, 0x6D28, 0x1B46, + 0x6D29, 0x0783, 0x6D2A, 0x0773, 0x6D2B, 0x0787, 0x6D2C, 0x1B60, 0x6D2D, + 0x1B48, 0x6D2E, 0x0784, 0x6D2F, 0x1D0E, 0x6D30, 0x19E7, 0x6D31, 0x0777, + 0x6D32, 0x0772, 0x6D33, 0x1B4F, 0x6D34, 0x1B47, 0x6D35, 0x0785, 0x6D36, + 0x077D, 0x6D37, 0x1B5A, 0x6D38, 0x0782, 0x6D39, 0x0780, 0x6D3A, 0x1B52, + 0x6D3B, 0x077A, 0x6D3C, 0x1B4A, 0x6D3D, 0x077B, 0x6D3E, 0x077C, 0x6D3F, + 0x1B4B, 0x6D40, 0x1B5D, 0x6D41, 0x0774, 0x6D42, 0x1B57, 0x6D58, 0x1CFC, + 0x6D59, 0x090F, 0x6D5A, 0x0914, 0x6D5E, 0x1D05, 0x6D5F, 0x1D0B, 0x6D60, + 0x1D07, 0x6D61, 0x1CFA, 0x6D62, 0x1CFD, 0x6D63, 0x1CF6, 0x6D64, 0x1CF7, + 0x6D65, 0x091B, 0x6D66, 0x090C, 0x6D67, 0x1D06, 0x6D68, 0x1D0F, 0x6D69, + 0x0916, 0x6D6A, 0x0908, 0x6D6C, 0x0911, 0x6D6D, 0x1CFE, 0x6D6E, 0x0913, + 0x6D6F, 0x1CFF, 0x6D70, 0x1D09, 0x6D74, 0x0915, 0x6D75, 0x1D18, 0x6D76, + 0x1CF8, 0x6D77, 0x090E, 0x6D78, 0x090D, 0x6D79, 0x0919, 0x6D7A, 0x1CF5, + 0x6D7B, 0x1D16, 0x6D7C, 0x1D0A, 0x6D7D, 0x1D17, 0x6D7E, 0x1D11, 0x6D7F, + 0x1D03, 0x6D80, 0x1D12, 0x6D82, 0x1D0C, 0x6D83, 0x1D15, 0x6D84, 0x1D13, + 0x6D85, 0x091A, 0x6D86, 0x1D04, 0x6D87, 0x090B, 0x6D88, 0x090A, 0x6D89, + 0x0912, 0x6D8A, 0x0918, 0x6D8B, 0x1D10, 0x6D8C, 0x0917, 0x6D8D, 0x1D01, + 0x6D8E, 0x0AEC, 0x6D90, 0x1D19, 0x6D91, 0x1D00, 0x6D92, 0x1CFB, 0x6D93, + 0x0910, 0x6D94, 0x091C, 0x6D95, 0x0909, 0x6D97, 0x1D08, 0x6D98, 0x1D0D, + 0x6DAA, 0x0B0E, 0x6DAB, 0x1F46, 0x6DAC, 0x1F4A, 0x6DAE, 0x0AFB, 0x6DAF, + 0x0AF9, 0x6DB2, 0x0AF0, 0x6DB3, 0x1F48, 0x6DB4, 0x1F47, 0x6DB5, 0x0B04, + 0x6DB7, 0x1F4D, 0x6DB8, 0x0AFE, 0x6DBA, 0x1F5F, 0x6DBB, 0x1F6B, 0x6DBC, + 0x0AED, 0x6DBD, 0x1F5C, 0x6DBE, 0x1F55, 0x6DBF, 0x0B10, 0x6DC0, 0x1F45, + 0x6DC2, 0x1F61, 0x6DC4, 0x0B0D, 0x6DC5, 0x0B01, 0x6DC6, 0x0B0C, 0x6DC7, + 0x0AF7, 0x6DC8, 0x1F51, 0x6DC9, 0x1F63, 0x6DCA, 0x1F5B, 0x6DCB, 0x0AF8, + 0x6DCC, 0x0AF2, 0x6DCD, 0x1F69, 0x6DCF, 0x1F62, 0x6DD0, 0x1F64, 0x6DD1, + 0x0AFA, 0x6DD2, 0x0B02, 0x6DD3, 0x1F66, 0x6DD4, 0x1F4F, 0x6DD5, 0x1F60, + 0x6DD6, 0x1F54, 0x6DD7, 0x1F68, 0x6DD8, 0x0B07, 0x6DD9, 0x0AEF, 0x6DDA, + 0x0B05, 0x6DDB, 0x1F59, 0x6DDC, 0x1F57, 0x6DDD, 0x1F58, 0x6DDE, 0x0AFC, + 0x6DDF, 0x1F53, 0x6DE0, 0x1F52, 0x6DE1, 0x0AF1, 0x6DE2, 0x1F4C, 0x6DE3, + 0x1F6A, 0x6DE4, 0x0AF3, 0x6DE5, 0x1F56, 0x6DE6, 0x0B11, 0x6DE8, 0x0B0B, + 0x6DE9, 0x1F4B, 0x6DEA, 0x0B08, 0x6DEB, 0x0B06, 0x6DEC, 0x0B0F, 0x6DED, + 0x1F5D, 0x6DEE, 0x0B0A, 0x6DEF, 0x1D02, 0x6DF0, 0x1F5E, 0x6DF1, 0x0B09, + 0x6DF2, 0x1F65, 0x6DF3, 0x0AEE, 0x6DF4, 0x1F5A, 0x6DF5, 0x0B00, 0x6DF6, + 0x1F4E, 0x6DF7, 0x0AFF, 0x6DF9, 0x0AFD, 0x6DFA, 0x0AF5, 0x6DFB, 0x0AF4, + 0x6DFC, 0x21BF, 0x6DFD, 0x1F67, 0x6E00, 0x1F50, 0x6E03, 0x21D4, 0x6E05, + 0x0AF6, 0x6E19, 0x0CC1, 0x6E1A, 0x0B03, 0x6E1B, 0x0CAF, 0x6E1C, 0x21CE, + 0x6E1D, 0x0CBD, 0x6E1F, 0x21C2, 0x6E20, 0x0CAC, 0x6E21, 0x0CA8, 0x6E22, + 0x21E0, 0x6E23, 0x0CAE, 0x6E24, 0x0CB2, 0x6E25, 0x0CAD, 0x6E26, 0x0CB6, + 0x6E27, 0x21E4, 0x6E28, 0x21DB, 0x6E2B, 0x21C9, 0x6E2C, 0x0CBB, 0x6E2D, + 0x0CB5, 0x6E2E, 0x21D5, 0x6E2F, 0x0CA5, 0x6E30, 0x21E1, 0x6E31, 0x21DA, + 0x6E32, 0x0CA9, 0x6E33, 0x21CF, 0x6E34, 0x0CB8, 0x6E35, 0x21EC, 0x6E36, + 0x21ED, 0x6E38, 0x0CA6, 0x6E39, 0x21DF, 0x6E3A, 0x0CBA, 0x6E3B, 0x21D3, + 0x6E3C, 0x21C5, 0x6E3D, 0x21C6, 0x6E3E, 0x0CBE, 0x6E3F, 0x21CA, 0x6E40, + 0x21D1, 0x6E41, 0x21CB, 0x6E43, 0x0CBC, 0x6E44, 0x0CC4, 0x6E45, 0x21C7, + 0x6E46, 0x21C0, 0x6E47, 0x21C1, 0x6E49, 0x21C3, 0x6E4A, 0x0CAB, 0x6E4B, + 0x21D0, 0x6E4D, 0x0CB9, 0x6E4E, 0x0CC2, 0x6E51, 0x21D2, 0x6E52, 0x21EA, + 0x6E53, 0x21E2, 0x6E54, 0x0CA7, 0x6E55, 0x21E8, 0x6E56, 0x0CB3, 0x6E58, + 0x0CB1, 0x6E5A, 0x21EE, 0x6E5B, 0x0CB0, 0x6E5C, 0x21D8, 0x6E5D, 0x21CC, + 0x6E5E, 0x21D6, 0x6E5F, 0x0CC7, 0x6E60, 0x21DC, 0x6E61, 0x21D9, 0x6E62, + 0x21C8, 0x6E63, 0x0CC3, 0x6E64, 0x21E6, 0x6E65, 0x21E3, 0x6E66, 0x21EB, + 0x6E67, 0x0CAA, 0x6E68, 0x21D7, 0x6E69, 0x0CC6, 0x6E6B, 0x21DE, 0x6E6E, + 0x0CB4, 0x6E6F, 0x0CB7, 0x6E71, 0x21DD, 0x6E72, 0x0CC5, 0x6E73, 0x21CD, + 0x6E74, 0x1F49, 0x6E77, 0x21E7, 0x6E78, 0x21E5, 0x6E79, 0x21E9, 0x6E88, + 0x21C4, 0x6E89, 0x0CC0, 0x6E8D, 0x246C, 0x6E8E, 0x246B, 0x6E8F, 0x2451, + 0x6E90, 0x0E55, 0x6E92, 0x246A, 0x6E93, 0x2454, 0x6E94, 0x2455, 0x6E96, + 0x0E5F, 0x6E97, 0x2473, 0x6E98, 0x0E5A, 0x6E99, 0x2469, 0x6E9B, 0x244E, + 0x6E9C, 0x0E60, 0x6E9D, 0x0E56, 0x6E9E, 0x245D, 0x6E9F, 0x2453, 0x6EA0, + 0x2456, 0x6EA1, 0x246E, 0x6EA2, 0x0E50, 0x6EA3, 0x2475, 0x6EA4, 0x246D, + 0x6EA5, 0x0E59, 0x6EA6, 0x2462, 0x6EA7, 0x0E64, 0x6EAA, 0x0E63, 0x6EAB, + 0x0E5D, 0x6EAE, 0x2474, 0x6EAF, 0x0E51, 0x6EB0, 0x2460, 0x6EB1, 0x2457, + 0x6EB2, 0x2464, 0x6EB3, 0x2470, 0x6EB4, 0x0E65, 0x6EB6, 0x0E53, 0x6EB7, + 0x245F, 0x6EB9, 0x2458, 0x6EBA, 0x0E5C, 0x6EBC, 0x0E5B, 0x6EBD, 0x245B, + 0x6EBE, 0x2465, 0x6EBF, 0x246F, 0x6EC0, 0x2452, 0x6EC1, 0x245C, 0x6EC2, + 0x0E54, 0x6EC3, 0x2466, 0x6EC4, 0x0E61, 0x6EC5, 0x0E58, 0x6EC6, 0x2459, + 0x6EC7, 0x0E57, 0x6EC8, 0x2450, 0x6EC9, 0x245E, 0x6ECA, 0x2472, 0x6ECB, + 0x0CBF, 0x6ECC, 0x101F, 0x6ECD, 0x2461, 0x6ECE, 0x26EB, 0x6ECF, 0x2463, + 0x6ED0, 0x2471, 0x6ED1, 0x0E5E, 0x6ED2, 0x245A, 0x6ED3, 0x0E52, 0x6ED4, + 0x0E62, 0x6ED5, 0x119A, 0x6ED6, 0x244F, 0x6ED8, 0x2468, 0x6EDC, 0x2467, + 0x6EEB, 0x2707, 0x6EEC, 0x101C, 0x6EED, 0x26FC, 0x6EEE, 0x2701, 0x6EEF, + 0x1011, 0x6EF1, 0x26ED, 0x6EF2, 0x101E, 0x6EF4, 0x1008, 0x6EF5, 0x26EC, + 0x6EF6, 0x270D, 0x6EF7, 0x1020, 0x6EF8, 0x26F0, 0x6EF9, 0x2700, 0x6EFB, + 0x26F2, 0x6EFC, 0x2710, 0x6EFD, 0x270C, 0x6EFE, 0x1006, 0x6EFF, 0x1010, + 0x6F00, 0x2946, 0x6F01, 0x101D, 0x6F02, 0x100E, 0x6F03, 0x26EE, 0x6F05, + 0x270B, 0x6F06, 0x1012, 0x6F07, 0x2708, 0x6F08, 0x2715, 0x6F09, 0x26F4, + 0x6F0A, 0x26FD, 0x6F0D, 0x2713, 0x6F0E, 0x2709, 0x6F0F, 0x100D, 0x6F12, + 0x26FB, 0x6F13, 0x1007, 0x6F14, 0x1005, 0x6F15, 0x1017, 0x6F18, 0x26F9, + 0x6F19, 0x26F6, 0x6F1A, 0x26F7, 0x6F1C, 0x270F, 0x6F1E, 0x2714, 0x6F1F, + 0x2712, 0x6F20, 0x100B, 0x6F21, 0x2716, 0x6F22, 0x100F, 0x6F23, 0x1016, + 0x6F25, 0x26EF, 0x6F26, 0x292E, 0x6F27, 0x26F8, 0x6F29, 0x1009, 0x6F2A, + 0x101B, 0x6F2B, 0x1018, 0x6F2C, 0x100C, 0x6F2D, 0x2702, 0x6F2E, 0x26F3, + 0x6F2F, 0x1019, 0x6F30, 0x2704, 0x6F31, 0x1013, 0x6F32, 0x1015, 0x6F33, + 0x1004, 0x6F35, 0x2706, 0x6F36, 0x26FE, 0x6F37, 0x26F1, 0x6F38, 0x1014, + 0x6F39, 0x270E, 0x6F3A, 0x2711, 0x6F3B, 0x26FA, 0x6F3C, 0x2705, 0x6F3E, + 0x100A, 0x6F3F, 0x1189, 0x6F40, 0x2703, 0x6F41, 0x292D, 0x6F43, 0x270A, + 0x6F4E, 0x26F5, 0x6F4F, 0x2937, 0x6F50, 0x2941, 0x6F51, 0x118C, 0x6F52, + 0x2940, 0x6F53, 0x294C, 0x6F54, 0x118E, 0x6F55, 0x293E, 0x6F57, 0x2942, + 0x6F58, 0x1199, 0x6F5A, 0x2939, 0x6F5B, 0x1191, 0x6F5D, 0x2945, 0x6F5E, + 0x2B9A, 0x6F5F, 0x119D, 0x6F60, 0x119C, 0x6F61, 0x2947, 0x6F62, 0x2936, + 0x6F63, 0x2951, 0x6F64, 0x1197, 0x6F66, 0x118D, 0x6F67, 0x294A, 0x6F69, + 0x294E, 0x6F6A, 0x2953, 0x6F6B, 0x2948, 0x6F6C, 0x293C, 0x6F6D, 0x1190, + 0x6F6E, 0x1193, 0x6F6F, 0x119B, 0x6F70, 0x1196, 0x6F72, 0x293F, 0x6F73, + 0x26FF, 0x6F76, 0x293B, 0x6F77, 0x2952, 0x6F78, 0x1192, 0x6F7A, 0x1195, + 0x6F7B, 0x2954, 0x6F7C, 0x118A, 0x6F7D, 0x2949, 0x6F7E, 0x292F, 0x6F7F, + 0x294F, 0x6F80, 0x13FC, 0x6F82, 0x293D, 0x6F84, 0x118B, 0x6F85, 0x2938, + 0x6F86, 0x118F, 0x6F87, 0x2930, 0x6F88, 0x101A, 0x6F89, 0x2934, 0x6F8B, + 0x294D, 0x6F8C, 0x2935, 0x6F8D, 0x2933, 0x6F8E, 0x1194, 0x6F90, 0x294B, + 0x6F92, 0x2932, 0x6F93, 0x2944, 0x6F94, 0x2943, 0x6F95, 0x2950, 0x6F96, + 0x293A, 0x6F97, 0x1198, 0x6F9E, 0x2B9D, 0x6FA0, 0x12EB, 0x6FA1, 0x12E1, + 0x6FA2, 0x2BA9, 0x6FA3, 0x2B95, 0x6FA4, 0x12E3, 0x6FA5, 0x2BA1, 0x6FA6, + 0x12EA, 0x6FA7, 0x12E5, 0x6FA8, 0x2B9F, 0x6FA9, 0x2D8E, 0x6FAA, 0x2BA5, + 0x6FAB, 0x2BAB, 0x6FAC, 0x2BA4, 0x6FAD, 0x2B93, 0x6FAE, 0x2BA2, 0x6FAF, + 0x2BAD, 0x6FB0, 0x2BAF, 0x6FB1, 0x12E0, 0x6FB2, 0x2BAE, 0x6FB3, 0x12E6, + 0x6FB4, 0x12EC, 0x6FB6, 0x12E9, 0x6FB8, 0x2BA8, 0x6FB9, 0x12E8, 0x6FBA, + 0x2BA3, 0x6FBC, 0x2B97, 0x6FBD, 0x2B9C, 0x6FBF, 0x2BA7, 0x6FC0, 0x12E7, + 0x6FC1, 0x12E4, 0x6FC2, 0x12DF, 0x6FC3, 0x12E2, 0x6FC4, 0x2B9B, 0x6FC6, + 0x2931, 0x6FC7, 0x2B96, 0x6FC8, 0x2B99, 0x6FC9, 0x2BAA, 0x6FCA, 0x2B9E, + 0x6FCB, 0x2B94, 0x6FCC, 0x2D8D, 0x6FCD, 0x2BAC, 0x6FCE, 0x2B98, 0x6FCF, + 0x2BA6, 0x6FD4, 0x2D90, 0x6FD5, 0x1400, 0x6FD8, 0x13F4, 0x6FDB, 0x13F8, + 0x6FDC, 0x2D92, 0x6FDD, 0x2D98, 0x6FDE, 0x2D96, 0x6FDF, 0x13F6, 0x6FE0, + 0x13F7, 0x6FE1, 0x13FE, 0x6FE2, 0x2D99, 0x6FE3, 0x2D91, 0x6FE4, 0x13F9, + 0x6FE6, 0x2D95, 0x6FE7, 0x2D94, 0x6FE8, 0x2D9A, 0x6FE9, 0x13FF, 0x6FEB, + 0x13FA, 0x6FEC, 0x13FD, 0x6FED, 0x2D93, 0x6FEE, 0x1401, 0x6FEF, 0x13FB, + 0x6FF0, 0x1402, 0x6FF1, 0x13F5, 0x6FF2, 0x2D97, 0x6FF4, 0x2D8F, 0x6FF7, + 0x2F4E, 0x6FFA, 0x14EB, 0x6FFB, 0x2F4B, 0x6FFC, 0x2F4D, 0x6FFE, 0x14E9, + 0x6FFF, 0x2F49, 0x7000, 0x2F4A, 0x7001, 0x2F45, 0x7004, 0x2BA0, 0x7005, + 0x2F46, 0x7006, 0x14EA, 0x7007, 0x2F42, 0x7009, 0x14E7, 0x700A, 0x2F4F, + 0x700B, 0x14E8, 0x700C, 0x2F43, 0x700D, 0x2F44, 0x700E, 0x2F48, 0x700F, + 0x14ED, 0x7011, 0x14EC, 0x7014, 0x2F47, 0x7015, 0x158F, 0x7016, 0x30AD, + 0x7017, 0x30B3, 0x7018, 0x1590, 0x7019, 0x30AA, 0x701A, 0x158D, 0x701B, + 0x158A, 0x701C, 0x30B5, 0x701D, 0x158E, 0x701F, 0x158B, 0x7020, 0x30AC, + 0x7021, 0x30AF, 0x7022, 0x30B0, 0x7023, 0x30B1, 0x7024, 0x30B4, 0x7026, + 0x2F4C, 0x7027, 0x30AB, 0x7028, 0x158C, 0x7029, 0x30B2, 0x702A, 0x31EF, + 0x702B, 0x30AE, 0x702F, 0x31E6, 0x7030, 0x161D, 0x7031, 0x31E9, 0x7032, + 0x161E, 0x7033, 0x31F2, 0x7034, 0x31E8, 0x7035, 0x31E5, 0x7037, 0x31E7, + 0x7038, 0x31EB, 0x7039, 0x31EE, 0x703A, 0x31ED, 0x703B, 0x31F1, 0x703C, + 0x31E4, 0x703E, 0x161C, 0x703F, 0x31EC, 0x7040, 0x31F0, 0x7041, 0x31F3, + 0x7042, 0x31EA, 0x7043, 0x32D8, 0x7044, 0x32D9, 0x7045, 0x32DD, 0x7046, + 0x32DE, 0x7048, 0x32DB, 0x7049, 0x32DC, 0x704A, 0x32DA, 0x704C, 0x167A, + 0x7051, 0x16C8, 0x7052, 0x338C, 0x7055, 0x3389, 0x7056, 0x338A, 0x7057, + 0x338B, 0x7058, 0x16C9, 0x705A, 0x3423, 0x705B, 0x3422, 0x705D, 0x348A, + 0x705E, 0x1722, 0x705F, 0x3488, 0x7060, 0x348B, 0x7061, 0x3489, 0x7062, + 0x34D0, 0x7063, 0x1744, 0x7064, 0x1752, 0x7065, 0x351C, 0x7066, 0x3506, + 0x7068, 0x351B, 0x7069, 0x3547, 0x706A, 0x3548, 0x706B, 0x02E6, 0x7070, + 0x03F2, 0x7071, 0x180A, 0x7074, 0x18C3, 0x7076, 0x04E6, 0x7078, 0x04E9, + 0x707A, 0x18C4, 0x707C, 0x04E7, 0x707D, 0x04E8, 0x7082, 0x19F7, 0x7083, + 0x19F9, 0x7084, 0x19F4, 0x7085, 0x19F1, 0x7086, 0x19F3, 0x708A, 0x0643, + 0x708E, 0x0641, 0x7091, 0x19F5, 0x7092, 0x0642, 0x7093, 0x19F2, 0x7094, + 0x19EF, 0x7095, 0x0640, 0x7096, 0x19F6, 0x7098, 0x19F0, 0x7099, 0x0644, + 0x709A, 0x19F8, 0x709F, 0x1B66, 0x70A1, 0x1B6A, 0x70A4, 0x0790, 0x70A9, + 0x1B6D, 0x70AB, 0x0788, 0x70AC, 0x078B, 0x70AD, 0x078D, 0x70AE, 0x078F, + 0x70AF, 0x078C, 0x70B0, 0x1B69, 0x70B1, 0x1B68, 0x70B3, 0x078A, 0x70B4, + 0x1B6B, 0x70B5, 0x1B6C, 0x70B7, 0x1B65, 0x70B8, 0x078E, 0x70BA, 0x0789, + 0x70BE, 0x1B67, 0x70C5, 0x1D27, 0x70C6, 0x1D28, 0x70C7, 0x1D29, 0x70C8, + 0x0921, 0x70CA, 0x091D, 0x70CB, 0x1D1E, 0x70CD, 0x1D26, 0x70CE, 0x1D2B, + 0x70CF, 0x0922, 0x70D1, 0x1D1C, 0x70D2, 0x1D22, 0x70D3, 0x1D1B, 0x70D4, + 0x1D25, 0x70D7, 0x1D21, 0x70D8, 0x091E, 0x70D9, 0x0920, 0x70DA, 0x1D2A, + 0x70DC, 0x1D1A, 0x70DD, 0x1D1D, 0x70DE, 0x1D23, 0x70E0, 0x1D24, 0x70E1, + 0x1D2C, 0x70E2, 0x1D20, 0x70E4, 0x091F, 0x70EF, 0x0B16, 0x70F0, 0x1F72, + 0x70F3, 0x1F74, 0x70F4, 0x1F70, 0x70F6, 0x1F7C, 0x70F7, 0x1F6E, 0x70F8, + 0x1F7B, 0x70F9, 0x0B12, 0x70FA, 0x1F6C, 0x70FB, 0x21F2, 0x70FC, 0x1F76, + 0x70FD, 0x0B15, 0x70FF, 0x1F77, 0x7100, 0x1F7A, 0x7102, 0x1F7E, 0x7104, + 0x1F73, 0x7106, 0x1F78, 0x7109, 0x0B13, 0x710A, 0x0B14, 0x710B, 0x1F7D, + 0x710C, 0x1F71, 0x710D, 0x1F6D, 0x710E, 0x1F7F, 0x7110, 0x1F75, 0x7113, + 0x1F79, 0x7117, 0x1F6F, 0x7119, 0x0CC8, 0x711A, 0x0CC9, 0x711B, 0x21FC, + 0x711C, 0x0CCF, 0x711E, 0x21F0, 0x711F, 0x21F9, 0x7120, 0x21EF, 0x7121, + 0x0CCC, 0x7122, 0x21F7, 0x7123, 0x21F5, 0x7125, 0x21F6, 0x7126, 0x0CCA, + 0x7128, 0x21FA, 0x712E, 0x21F3, 0x712F, 0x21F1, 0x7130, 0x0CCB, 0x7131, + 0x21F4, 0x7132, 0x21F8, 0x7136, 0x0CCD, 0x713A, 0x21FB, 0x7141, 0x247B, + 0x7142, 0x2482, 0x7143, 0x2484, 0x7144, 0x248A, 0x7146, 0x0E72, 0x7147, + 0x2476, 0x7149, 0x0E6A, 0x714B, 0x2485, 0x714C, 0x0E6F, 0x714D, 0x248B, + 0x714E, 0x0E66, 0x7150, 0x2488, 0x7152, 0x2478, 0x7153, 0x2489, 0x7154, + 0x2477, 0x7156, 0x0E74, 0x7158, 0x2483, 0x7159, 0x0E67, 0x715A, 0x248C, + 0x715C, 0x0E6C, 0x715D, 0x247C, 0x715E, 0x0E71, 0x715F, 0x2487, 0x7160, + 0x247A, 0x7161, 0x2481, 0x7162, 0x247D, 0x7163, 0x2479, 0x7164, 0x0E69, + 0x7165, 0x0E70, 0x7166, 0x0E6E, 0x7167, 0x0E6B, 0x7168, 0x0E73, 0x7169, + 0x0E68, 0x716A, 0x2480, 0x716C, 0x0E6D, 0x716E, 0x0CCE, 0x7170, 0x2486, + 0x7172, 0x247E, 0x7178, 0x247F, 0x717B, 0x271E, 0x717D, 0x1023, 0x7180, + 0x271A, 0x7181, 0x2720, 0x7182, 0x271C, 0x7184, 0x1025, 0x7185, 0x271B, + 0x7186, 0x271F, 0x7187, 0x2717, 0x7189, 0x2719, 0x718A, 0x1024, 0x718F, + 0x271D, 0x7190, 0x2718, 0x7192, 0x1026, 0x7194, 0x1021, 0x7197, 0x2721, + 0x7199, 0x1022, 0x719A, 0x295A, 0x719B, 0x2957, 0x719C, 0x2963, 0x719D, + 0x295D, 0x719E, 0x295F, 0x719F, 0x119E, 0x71A0, 0x2959, 0x71A1, 0x2961, + 0x71A4, 0x2960, 0x71A5, 0x295E, 0x71A7, 0x2964, 0x71A8, 0x11A1, 0x71A9, + 0x295B, 0x71AA, 0x2962, 0x71AC, 0x119F, 0x71AF, 0x2956, 0x71B0, 0x2958, + 0x71B1, 0x11A0, 0x71B2, 0x2955, 0x71B3, 0x2965, 0x71B5, 0x295C, 0x71B8, + 0x2BB3, 0x71B9, 0x12F3, 0x71BC, 0x2BBE, 0x71BD, 0x2BBC, 0x71BE, 0x12ED, + 0x71BF, 0x2BB2, 0x71C0, 0x2BB5, 0x71C1, 0x2BB6, 0x71C2, 0x2BB1, 0x71C3, + 0x12F7, 0x71C4, 0x12F8, 0x71C5, 0x2BB0, 0x71C6, 0x2BBF, 0x71C7, 0x2BBA, + 0x71C8, 0x12F1, 0x71C9, 0x12EE, 0x71CA, 0x2BB9, 0x71CB, 0x2BB7, 0x71CE, + 0x12F4, 0x71CF, 0x2BBB, 0x71D0, 0x12EF, 0x71D2, 0x12F0, 0x71D4, 0x2BB8, + 0x71D5, 0x12F2, 0x71D6, 0x2BB4, 0x71D8, 0x2BBD, 0x71D9, 0x12F5, 0x71DA, + 0x2BC0, 0x71DB, 0x2BC1, 0x71DC, 0x12F6, 0x71DF, 0x1404, 0x71E0, 0x140B, + 0x71E1, 0x2D9B, 0x71E2, 0x2DA1, 0x71E4, 0x2D9F, 0x71E5, 0x1407, 0x71E6, + 0x1406, 0x71E7, 0x1403, 0x71E8, 0x2D9D, 0x71EC, 0x1409, 0x71ED, 0x1408, + 0x71EE, 0x1405, 0x71F0, 0x2DA0, 0x71F1, 0x2D9C, 0x71F2, 0x2D9E, 0x71F4, + 0x140A, 0x71F8, 0x14F1, 0x71F9, 0x2F52, 0x71FB, 0x14EE, 0x71FC, 0x14EF, + 0x71FD, 0x2F54, 0x71FE, 0x14F0, 0x71FF, 0x2F51, 0x7201, 0x2F50, 0x7202, + 0x30B9, 0x7203, 0x2F53, 0x7205, 0x30BA, 0x7206, 0x1591, 0x7207, 0x30B8, + 0x720A, 0x30B7, 0x720C, 0x30B6, 0x720D, 0x1592, 0x7210, 0x161F, 0x7213, + 0x31F4, 0x7214, 0x31F5, 0x7219, 0x32E1, 0x721A, 0x32E0, 0x721B, 0x167B, + 0x721D, 0x32DF, 0x721E, 0x338D, 0x721F, 0x338E, 0x7222, 0x3424, 0x7223, + 0x348C, 0x7226, 0x34D1, 0x7227, 0x3535, 0x7228, 0x1766, 0x7229, 0x3549, + 0x722A, 0x02E7, 0x722C, 0x0645, 0x722D, 0x0646, 0x7230, 0x0791, 0x7235, + 0x140C, 0x7236, 0x02E8, 0x7238, 0x0647, 0x7239, 0x0923, 0x723A, 0x0E75, + 0x723B, 0x02E9, 0x723D, 0x0B17, 0x723E, 0x1027, 0x723F, 0x178D, 0x7241, + 0x1B6E, 0x7242, 0x1D2D, 0x7244, 0x2722, 0x7246, 0x140D, 0x7247, 0x02EA, + 0x7248, 0x0648, 0x7249, 0x1B6F, 0x724A, 0x1B70, 0x724B, 0x21FD, 0x724C, + 0x0CD0, 0x724F, 0x248D, 0x7252, 0x0E76, 0x7253, 0x2723, 0x7256, 0x11A2, + 0x7258, 0x1593, 0x7259, 0x02EB, 0x725A, 0x21FE, 0x725B, 0x02EC, 0x725D, + 0x03F4, 0x725E, 0x180B, 0x725F, 0x03F3, 0x7260, 0x04EC, 0x7261, 0x04EB, + 0x7262, 0x04EA, 0x7263, 0x18C5, 0x7267, 0x0649, 0x7269, 0x064A, 0x726A, + 0x19FA, 0x726C, 0x1B71, 0x726E, 0x1B74, 0x726F, 0x0793, 0x7270, 0x1B72, + 0x7272, 0x0792, 0x7273, 0x1B73, 0x7274, 0x0794, 0x7276, 0x1D30, 0x7277, + 0x1D2F, 0x7278, 0x1D2E, 0x7279, 0x0924, 0x727B, 0x1F81, 0x727C, 0x1F82, + 0x727D, 0x0B18, 0x727E, 0x1F80, 0x727F, 0x1F83, 0x7280, 0x0CD2, 0x7281, + 0x0B19, 0x7284, 0x0CD1, 0x7285, 0x2202, 0x7286, 0x2201, 0x7288, 0x21FF, + 0x7289, 0x2200, 0x728B, 0x2203, 0x728C, 0x248F, 0x728D, 0x248E, 0x728E, + 0x2492, 0x7290, 0x2491, 0x7291, 0x2490, 0x7292, 0x1028, 0x7293, 0x2726, + 0x7295, 0x2725, 0x7296, 0x1029, 0x7297, 0x2724, 0x7298, 0x2966, 0x729A, + 0x2967, 0x729B, 0x11A3, 0x729D, 0x2BC2, 0x729E, 0x2BC3, 0x72A1, 0x30BF, + 0x72A2, 0x1594, 0x72A3, 0x30BE, 0x72A4, 0x30BD, 0x72A5, 0x30BB, 0x72A6, + 0x30BC, 0x72A7, 0x167C, 0x72A8, 0x31F6, 0x72A9, 0x338F, 0x72AA, 0x34D2, + 0x72AC, 0x02ED, 0x72AE, 0x17AF, 0x72AF, 0x0355, 0x72B0, 0x17B0, 0x72B4, + 0x180C, 0x72B5, 0x180D, 0x72BA, 0x18CB, 0x72BD, 0x18C7, 0x72BF, 0x18C6, + 0x72C0, 0x064B, 0x72C1, 0x18CA, 0x72C2, 0x04EE, 0x72C3, 0x18C8, 0x72C4, + 0x04ED, 0x72C5, 0x18CC, 0x72C6, 0x18C9, 0x72C9, 0x19FE, 0x72CA, 0x1B75, + 0x72CB, 0x19FC, 0x72CC, 0x1A03, 0x72CE, 0x064C, 0x72D0, 0x064F, 0x72D1, + 0x1A04, 0x72D2, 0x1A00, 0x72D4, 0x1A01, 0x72D6, 0x19FB, 0x72D7, 0x064E, + 0x72D8, 0x19FD, 0x72D9, 0x064D, 0x72DA, 0x1A02, 0x72DC, 0x19FF, 0x72DF, + 0x1B79, 0x72E0, 0x0796, 0x72E1, 0x0797, 0x72E3, 0x1B7C, 0x72E4, 0x1B76, + 0x72E6, 0x1B7B, 0x72E8, 0x1B77, 0x72E9, 0x0795, 0x72EA, 0x1B7A, 0x72EB, + 0x1B78, 0x72F3, 0x1D36, 0x72F4, 0x1D33, 0x72F6, 0x1D35, 0x72F7, 0x0929, + 0x72F8, 0x0928, 0x72F9, 0x0926, 0x72FA, 0x1D32, 0x72FB, 0x1D37, 0x72FC, + 0x0925, 0x72FD, 0x0927, 0x72FE, 0x1D34, 0x72FF, 0x1F8B, 0x7300, 0x1D31, + 0x7301, 0x1D38, 0x7307, 0x1F86, 0x7308, 0x1F8A, 0x730A, 0x1F89, 0x730B, + 0x2205, 0x730C, 0x2210, 0x730F, 0x1F8C, 0x7311, 0x1F87, 0x7312, 0x2204, + 0x7313, 0x0B1D, 0x7316, 0x0B1C, 0x7317, 0x1F85, 0x7318, 0x1F88, 0x7319, + 0x0B1E, 0x731B, 0x0B1B, 0x731C, 0x0B1A, 0x731D, 0x1F84, 0x731E, 0x1F8D, + 0x7322, 0x2207, 0x7323, 0x220E, 0x7325, 0x0CD4, 0x7326, 0x220D, 0x7327, + 0x220A, 0x7329, 0x0CD6, 0x732D, 0x220C, 0x7330, 0x2206, 0x7331, 0x2208, + 0x7332, 0x220B, 0x7333, 0x2209, 0x7334, 0x0CD5, 0x7335, 0x220F, 0x7336, + 0x0CD3, 0x7337, 0x0E77, 0x733A, 0x2496, 0x733B, 0x2495, 0x733C, 0x2493, + 0x733E, 0x0E7A, 0x733F, 0x0E79, 0x7340, 0x2497, 0x7342, 0x2494, 0x7343, + 0x2727, 0x7344, 0x102A, 0x7345, 0x0E78, 0x7349, 0x2499, 0x734A, 0x2498, + 0x734C, 0x272A, 0x734D, 0x2728, 0x734E, 0x11A4, 0x7350, 0x102B, 0x7351, + 0x2729, 0x7352, 0x2969, 0x7357, 0x11A5, 0x7358, 0x2968, 0x7359, 0x2971, + 0x735A, 0x2970, 0x735B, 0x296E, 0x735D, 0x296D, 0x735E, 0x296A, 0x735F, + 0x296B, 0x7360, 0x296C, 0x7361, 0x296F, 0x7362, 0x2972, 0x7365, 0x2BC8, + 0x7366, 0x2BC5, 0x7367, 0x2BC6, 0x7368, 0x12F9, 0x7369, 0x2BC4, 0x736A, + 0x2BCA, 0x736B, 0x2BC9, 0x736C, 0x2BC7, 0x736E, 0x2DA3, 0x736F, 0x2DA4, + 0x7370, 0x140E, 0x7372, 0x140F, 0x7373, 0x2DA2, 0x7375, 0x14F3, 0x7376, + 0x2F55, 0x7377, 0x14F2, 0x7378, 0x1595, 0x737A, 0x1596, 0x737B, 0x1620, + 0x737C, 0x31F8, 0x737D, 0x31F7, 0x737E, 0x32E2, 0x737F, 0x3390, 0x7380, + 0x16CA, 0x7381, 0x3426, 0x7382, 0x3425, 0x7383, 0x3427, 0x7384, 0x0356, + 0x7385, 0x1B7D, 0x7386, 0x092A, 0x7387, 0x0B1F, 0x7388, 0x1F8E, 0x7389, + 0x0357, 0x738A, 0x17B1, 0x738B, 0x02EE, 0x738E, 0x180E, 0x7392, 0x18D1, + 0x7393, 0x18CF, 0x7394, 0x18D0, 0x7395, 0x18CD, 0x7396, 0x04EF, 0x7397, + 0x18CE, 0x739D, 0x1A0C, 0x739F, 0x0652, 0x73A0, 0x1A0A, 0x73A1, 0x1A06, + 0x73A2, 0x1A09, 0x73A4, 0x1A05, 0x73A5, 0x0654, 0x73A6, 0x1A08, 0x73A8, + 0x0651, 0x73A9, 0x0650, 0x73AB, 0x0653, 0x73AC, 0x1A0B, 0x73AD, 0x1A07, + 0x73B2, 0x079B, 0x73B3, 0x079E, 0x73B4, 0x1B85, 0x73B5, 0x1B84, 0x73B6, + 0x1B83, 0x73B7, 0x0798, 0x73B8, 0x1B8C, 0x73B9, 0x1B82, 0x73BB, 0x079A, + 0x73BC, 0x1D3D, 0x73BE, 0x1B89, 0x73BF, 0x1B87, 0x73C0, 0x079D, 0x73C2, + 0x1B7F, 0x73C3, 0x1B8A, 0x73C5, 0x1B81, 0x73C6, 0x1B8B, 0x73C7, 0x1B88, + 0x73C8, 0x1B80, 0x73CA, 0x0799, 0x73CB, 0x1B8D, 0x73CC, 0x1B7E, 0x73CD, + 0x079C, 0x73D2, 0x1D42, 0x73D3, 0x1D39, 0x73D4, 0x1D44, 0x73D6, 0x1D3C, + 0x73D7, 0x1D47, 0x73D8, 0x1D48, 0x73D9, 0x1D3A, 0x73DA, 0x1D46, 0x73DB, + 0x1D43, 0x73DC, 0x1D41, 0x73DD, 0x1D45, 0x73DE, 0x0930, 0x73E0, 0x092E, + 0x73E3, 0x1D3F, 0x73E5, 0x1D3B, 0x73E7, 0x1D3E, 0x73E8, 0x1D49, 0x73E9, + 0x1D40, 0x73EA, 0x092F, 0x73EB, 0x1B86, 0x73ED, 0x092B, 0x73EE, 0x092D, + 0x73F4, 0x1F9C, 0x73F5, 0x1F91, 0x73F6, 0x1F8F, 0x73F8, 0x1F90, 0x73FA, + 0x1F97, 0x73FC, 0x1F98, 0x73FD, 0x1F94, 0x73FE, 0x0B24, 0x73FF, 0x1F99, + 0x7400, 0x1F96, 0x7401, 0x1F93, 0x7403, 0x0B22, 0x7404, 0x1F92, 0x7405, + 0x0B20, 0x7406, 0x0B23, 0x7407, 0x1F95, 0x7408, 0x1F9D, 0x7409, 0x092C, + 0x740A, 0x0B21, 0x740B, 0x1F9B, 0x740C, 0x1F9A, 0x740D, 0x0B25, 0x7416, + 0x2215, 0x741A, 0x2216, 0x741B, 0x0CE0, 0x741D, 0x221C, 0x7420, 0x221E, + 0x7421, 0x2217, 0x7422, 0x0CDA, 0x7423, 0x221B, 0x7424, 0x221A, 0x7425, + 0x0CDB, 0x7426, 0x0CE1, 0x7428, 0x0CE2, 0x7429, 0x221D, 0x742A, 0x0CD8, + 0x742B, 0x2214, 0x742C, 0x2212, 0x742D, 0x2218, 0x742E, 0x2211, 0x742F, + 0x0CDF, 0x7430, 0x2213, 0x7431, 0x2219, 0x7432, 0x221F, 0x7433, 0x0CD9, + 0x7434, 0x0CDE, 0x7435, 0x0CDC, 0x7436, 0x0CDD, 0x743A, 0x0CD7, 0x743F, + 0x0E81, 0x7440, 0x24A0, 0x7441, 0x0E80, 0x7442, 0x24A4, 0x7444, 0x249A, + 0x7446, 0x24A5, 0x744A, 0x249B, 0x744B, 0x249C, 0x744D, 0x24A6, 0x744E, + 0x24A3, 0x744F, 0x24A1, 0x7450, 0x24A2, 0x7451, 0x249E, 0x7452, 0x249D, + 0x7454, 0x24A7, 0x7455, 0x0E7D, 0x7457, 0x249F, 0x7459, 0x0E82, 0x745A, + 0x0E7C, 0x745B, 0x0E83, 0x745C, 0x0E84, 0x745E, 0x0E7F, 0x745F, 0x0E7E, + 0x7462, 0x272B, 0x7463, 0x102D, 0x7464, 0x102C, 0x7467, 0x2730, 0x7469, + 0x11A6, 0x746A, 0x102E, 0x746D, 0x1030, 0x746E, 0x2731, 0x746F, 0x0E7B, + 0x7470, 0x102F, 0x7471, 0x272D, 0x7472, 0x272F, 0x7473, 0x272C, 0x7475, + 0x272E, 0x7479, 0x297C, 0x747C, 0x297B, 0x747D, 0x2978, 0x747E, 0x11A9, + 0x747F, 0x2BCB, 0x7480, 0x11AA, 0x7481, 0x2977, 0x7483, 0x11A8, 0x7485, + 0x2979, 0x7486, 0x2976, 0x7487, 0x2973, 0x7488, 0x297A, 0x7489, 0x2974, + 0x748A, 0x2975, 0x748B, 0x11A7, 0x7490, 0x2DA8, 0x7492, 0x2BCF, 0x7494, + 0x2BCE, 0x7495, 0x2BD0, 0x7497, 0x2DA5, 0x7498, 0x12FC, 0x749A, 0x2BCC, + 0x749C, 0x12FA, 0x749E, 0x12FE, 0x749F, 0x12FD, 0x74A0, 0x2BCD, 0x74A1, + 0x2BD1, 0x74A3, 0x12FB, 0x74A5, 0x2DAC, 0x74A6, 0x1412, 0x74A7, 0x14F4, + 0x74A8, 0x1413, 0x74A9, 0x1410, 0x74AA, 0x2DA9, 0x74AB, 0x2DA7, 0x74AD, + 0x2DAA, 0x74AF, 0x2DAD, 0x74B0, 0x1411, 0x74B1, 0x2DAB, 0x74B2, 0x2DA6, + 0x74B5, 0x2F58, 0x74B6, 0x2F5B, 0x74B7, 0x30C2, 0x74B8, 0x2F56, 0x74BA, + 0x31F9, 0x74BB, 0x2F5C, 0x74BD, 0x1597, 0x74BE, 0x2F5A, 0x74BF, 0x14F5, + 0x74C0, 0x2F57, 0x74C1, 0x2F59, 0x74C2, 0x2F5D, 0x74C3, 0x30C3, 0x74C5, + 0x30C1, 0x74CA, 0x1598, 0x74CB, 0x30C0, 0x74CF, 0x1621, 0x74D4, 0x167E, + 0x74D5, 0x3392, 0x74D6, 0x167D, 0x74D7, 0x3394, 0x74D8, 0x3391, 0x74D9, + 0x3393, 0x74DA, 0x16FE, 0x74DB, 0x348D, 0x74DC, 0x0358, 0x74DD, 0x1A0D, + 0x74DE, 0x1D4A, 0x74DF, 0x1D4B, 0x74E0, 0x0B26, 0x74E1, 0x24A8, 0x74E2, + 0x12FF, 0x74E3, 0x1599, 0x74E4, 0x16CB, 0x74E5, 0x348E, 0x74E6, 0x0359, + 0x74E8, 0x1A0E, 0x74E9, 0x0120, 0x74EC, 0x1B8E, 0x74EE, 0x1B8F, 0x74F4, + 0x1D4C, 0x74F5, 0x1D4D, 0x74F6, 0x0B27, 0x74F7, 0x0B28, 0x74FB, 0x2220, + 0x74FD, 0x24AB, 0x74FE, 0x24AA, 0x74FF, 0x24A9, 0x7500, 0x2732, 0x7502, + 0x2733, 0x7503, 0x2734, 0x7504, 0x1031, 0x7507, 0x297E, 0x7508, 0x297D, + 0x750B, 0x2BD2, 0x750C, 0x1300, 0x750D, 0x1301, 0x750F, 0x2DB1, 0x7510, + 0x2DAE, 0x7511, 0x2DAF, 0x7512, 0x2DB0, 0x7513, 0x2F5F, 0x7514, 0x2F5E, + 0x7515, 0x14F6, 0x7516, 0x30C4, 0x7517, 0x32E3, 0x7518, 0x035A, 0x751A, + 0x079F, 0x751C, 0x0B29, 0x751D, 0x24AC, 0x751F, 0x035B, 0x7521, 0x1D4E, + 0x7522, 0x0B2A, 0x7525, 0x0CE3, 0x7526, 0x0CE4, 0x7528, 0x035C, 0x7529, + 0x035D, 0x752A, 0x180F, 0x752B, 0x04F1, 0x752C, 0x04F0, 0x752D, 0x07A0, + 0x752E, 0x1B90, 0x752F, 0x2221, 0x7530, 0x035E, 0x7531, 0x035F, 0x7532, + 0x0360, 0x7533, 0x0361, 0x7537, 0x04F2, 0x7538, 0x04F3, 0x7539, 0x18D3, + 0x753A, 0x18D2, 0x753D, 0x0655, 0x753E, 0x1A11, 0x753F, 0x1A0F, 0x7540, + 0x1A10, 0x7547, 0x1B91, 0x7548, 0x1B92, 0x754B, 0x07A4, 0x754C, 0x07A2, + 0x754E, 0x07A3, 0x754F, 0x07A1, 0x7554, 0x0931, 0x7559, 0x0935, 0x755A, + 0x0934, 0x755B, 0x1D4F, 0x755C, 0x0933, 0x755D, 0x0932, 0x755F, 0x1D50, + 0x7562, 0x0B2D, 0x7563, 0x1F9F, 0x7564, 0x1F9E, 0x7565, 0x0B2B, 0x7566, + 0x0B2C, 0x756A, 0x0CE6, 0x756B, 0x0CE5, 0x756C, 0x2223, 0x756F, 0x2222, + 0x7570, 0x0B2E, 0x7576, 0x0E85, 0x7577, 0x24AE, 0x7578, 0x0E86, 0x7579, + 0x24AD, 0x757D, 0x2735, 0x757E, 0x297F, 0x757F, 0x11AB, 0x7580, 0x2BD3, + 0x7584, 0x2DB2, 0x7586, 0x159B, 0x7587, 0x159A, 0x758A, 0x16CC, 0x758B, + 0x0362, 0x758C, 0x1A12, 0x758F, 0x0B2F, 0x7590, 0x2736, 0x7591, 0x1032, + 0x7592, 0x022E, 0x7594, 0x18D4, 0x7595, 0x18D5, 0x7598, 0x1A13, 0x7599, + 0x0657, 0x759A, 0x0658, 0x759D, 0x0656, 0x75A2, 0x07A8, 0x75A3, 0x07A9, + 0x75A4, 0x07A6, 0x75A5, 0x07A7, 0x75A7, 0x1B93, 0x75AA, 0x1B94, 0x75AB, + 0x07A5, 0x75B0, 0x1D51, 0x75B2, 0x0939, 0x75B3, 0x093A, 0x75B5, 0x0B32, + 0x75B6, 0x1D57, 0x75B8, 0x093F, 0x75B9, 0x093D, 0x75BA, 0x1D58, 0x75BB, + 0x1D53, 0x75BC, 0x093C, 0x75BD, 0x093B, 0x75BE, 0x0936, 0x75BF, 0x1D56, + 0x75C0, 0x1D55, 0x75C1, 0x1D52, 0x75C2, 0x093E, 0x75C4, 0x1D54, 0x75C5, + 0x0937, 0x75C7, 0x0938, 0x75CA, 0x0B33, 0x75CB, 0x1FA3, 0x75CC, 0x1FA4, + 0x75CD, 0x0B34, 0x75CE, 0x1FA0, 0x75CF, 0x1FA2, 0x75D0, 0x1FA6, 0x75D1, + 0x1FA5, 0x75D2, 0x1FA1, 0x75D4, 0x0B30, 0x75D5, 0x0B31, 0x75D7, 0x222B, + 0x75D8, 0x0CEB, 0x75D9, 0x0CEA, 0x75DA, 0x2225, 0x75DB, 0x0CE8, 0x75DD, + 0x2228, 0x75DE, 0x0CEC, 0x75DF, 0x2229, 0x75E0, 0x0CED, 0x75E1, 0x2226, + 0x75E2, 0x0CE7, 0x75E3, 0x0CE9, 0x75E4, 0x222A, 0x75E6, 0x2227, 0x75E7, + 0x2224, 0x75ED, 0x24BB, 0x75EF, 0x24B0, 0x75F0, 0x0E88, 0x75F1, 0x0E8B, + 0x75F2, 0x0E8A, 0x75F3, 0x0E8F, 0x75F4, 0x0E8E, 0x75F5, 0x24BC, 0x75F6, + 0x24BA, 0x75F7, 0x24B3, 0x75F8, 0x24B7, 0x75F9, 0x24B6, 0x75FA, 0x0E8C, + 0x75FB, 0x24B9, 0x75FC, 0x24B5, 0x75FD, 0x24BD, 0x75FE, 0x24B4, 0x75FF, + 0x0E8D, 0x7600, 0x0E87, 0x7601, 0x0E89, 0x7603, 0x24B2, 0x7608, 0x2738, + 0x7609, 0x1036, 0x760A, 0x273C, 0x760B, 0x1035, 0x760C, 0x2739, 0x760D, + 0x1034, 0x760F, 0x24B1, 0x7610, 0x24B8, 0x7611, 0x273B, 0x7613, 0x1037, + 0x7614, 0x273D, 0x7615, 0x273A, 0x7616, 0x2737, 0x7619, 0x2982, 0x761A, + 0x2986, 0x761B, 0x2988, 0x761C, 0x2984, 0x761D, 0x2983, 0x761E, 0x2981, + 0x761F, 0x11AE, 0x7620, 0x11AC, 0x7621, 0x11B1, 0x7622, 0x11B2, 0x7623, + 0x2985, 0x7624, 0x11AF, 0x7625, 0x2980, 0x7626, 0x11B0, 0x7627, 0x1033, + 0x7628, 0x2987, 0x7629, 0x11AD, 0x762D, 0x2BD5, 0x762F, 0x2BD4, 0x7630, + 0x2BDC, 0x7631, 0x2BD6, 0x7632, 0x2BDB, 0x7633, 0x2BD8, 0x7634, 0x1302, + 0x7635, 0x2BDA, 0x7638, 0x1303, 0x763A, 0x1304, 0x763C, 0x2BD9, 0x763D, + 0x2BD7, 0x7642, 0x1415, 0x7643, 0x2DB3, 0x7646, 0x1414, 0x7647, 0x2DB6, + 0x7648, 0x2DB4, 0x7649, 0x2DB5, 0x764C, 0x1416, 0x7650, 0x2F63, 0x7652, + 0x14F9, 0x7653, 0x2F64, 0x7656, 0x14F7, 0x7657, 0x2F65, 0x7658, 0x14F8, + 0x7659, 0x2F62, 0x765A, 0x2F66, 0x765C, 0x2F60, 0x765F, 0x159C, 0x7660, + 0x30C5, 0x7661, 0x159D, 0x7662, 0x1622, 0x7664, 0x2F61, 0x7665, 0x1623, + 0x7669, 0x167F, 0x766A, 0x32E4, 0x766C, 0x16CE, 0x766D, 0x3395, 0x766E, + 0x16CD, 0x7670, 0x3428, 0x7671, 0x1723, 0x7672, 0x1724, 0x7675, 0x3543, + 0x7676, 0x022F, 0x7678, 0x07AA, 0x7679, 0x1B95, 0x767B, 0x0CEE, 0x767C, + 0x0CEF, 0x767D, 0x0363, 0x767E, 0x03F5, 0x767F, 0x1810, 0x7681, 0x18D6, + 0x7682, 0x04F4, 0x7684, 0x0659, 0x7686, 0x07AB, 0x7687, 0x07AC, 0x7688, + 0x07AD, 0x7689, 0x1FA8, 0x768A, 0x1D59, 0x768B, 0x0940, 0x768E, 0x0B35, + 0x768F, 0x1FA7, 0x7692, 0x222D, 0x7693, 0x0CF1, 0x7695, 0x222C, 0x7696, + 0x0CF0, 0x7699, 0x24BE, 0x769A, 0x11B3, 0x769B, 0x298C, 0x769C, 0x2989, + 0x769D, 0x298A, 0x769E, 0x298B, 0x76A4, 0x2DB7, 0x76A6, 0x2F67, 0x76AA, + 0x31FB, 0x76AB, 0x31FA, 0x76AD, 0x3396, 0x76AE, 0x0364, 0x76AF, 0x1A14, + 0x76B0, 0x0941, 0x76B4, 0x0CF2, 0x76B5, 0x24BF, 0x76B8, 0x273E, 0x76BA, + 0x11B4, 0x76BB, 0x2BDD, 0x76BD, 0x2F68, 0x76BE, 0x31FC, 0x76BF, 0x0365, + 0x76C2, 0x065A, 0x76C3, 0x07B0, 0x76C4, 0x1B96, 0x76C5, 0x07B1, 0x76C6, + 0x07AF, 0x76C8, 0x07AE, 0x76C9, 0x1D5A, 0x76CA, 0x0942, 0x76CD, 0x0943, + 0x76CE, 0x0944, 0x76D2, 0x0B37, 0x76D3, 0x1FA9, 0x76D4, 0x0B36, 0x76DA, + 0x222E, 0x76DB, 0x0B38, 0x76DC, 0x0CF3, 0x76DD, 0x24C0, 0x76DE, 0x0E90, + 0x76DF, 0x0E91, 0x76E1, 0x1038, 0x76E3, 0x1039, 0x76E4, 0x11B5, 0x76E5, + 0x1306, 0x76E6, 0x2BDE, 0x76E7, 0x1305, 0x76E9, 0x2DB8, 0x76EA, 0x1417, + 0x76EC, 0x2F69, 0x76ED, 0x31FD, 0x76EE, 0x0366, 0x76EF, 0x04F5, 0x76F0, + 0x1A17, 0x76F1, 0x1A16, 0x76F2, 0x065B, 0x76F3, 0x1A15, 0x76F4, 0x065C, + 0x76F5, 0x1A18, 0x76F7, 0x1B9C, 0x76F8, 0x07B4, 0x76F9, 0x07B3, 0x76FA, + 0x1B9E, 0x76FB, 0x1B9D, 0x76FC, 0x07B8, 0x76FE, 0x07B7, 0x7701, 0x07B2, + 0x7703, 0x1B98, 0x7704, 0x1B99, 0x7705, 0x1B9A, 0x7707, 0x07B9, 0x7708, + 0x1B97, 0x7709, 0x07B5, 0x770A, 0x1B9B, 0x770B, 0x07B6, 0x7710, 0x1D5D, + 0x7711, 0x1D61, 0x7712, 0x1D5F, 0x7713, 0x1D5E, 0x7715, 0x1D62, 0x7719, + 0x1D63, 0x771A, 0x1D64, 0x771B, 0x1D5C, 0x771D, 0x1D5B, 0x771F, 0x0946, + 0x7720, 0x0947, 0x7722, 0x1D65, 0x7723, 0x1D60, 0x7725, 0x1FB2, 0x7727, + 0x1D66, 0x7728, 0x0948, 0x7729, 0x0945, 0x772D, 0x1FAC, 0x772F, 0x1FAB, + 0x7731, 0x1FAD, 0x7732, 0x1FAE, 0x7733, 0x1FB0, 0x7734, 0x1FAF, 0x7735, + 0x1FB4, 0x7736, 0x0B3C, 0x7737, 0x0B39, 0x7738, 0x0B3D, 0x7739, 0x1FAA, + 0x773A, 0x0B3E, 0x773B, 0x1FB3, 0x773C, 0x0B3B, 0x773D, 0x1FB1, 0x773E, + 0x0B3A, 0x7744, 0x2231, 0x7745, 0x2233, 0x7746, 0x222F, 0x7747, 0x2230, + 0x774A, 0x2234, 0x774B, 0x2236, 0x774C, 0x2237, 0x774D, 0x2232, 0x774E, + 0x2235, 0x774F, 0x0CF4, 0x7752, 0x24C4, 0x7754, 0x24C9, 0x7755, 0x24C1, + 0x7756, 0x24C5, 0x7759, 0x24CA, 0x775A, 0x24C6, 0x775B, 0x0E92, 0x775C, + 0x0E9A, 0x775E, 0x0E95, 0x775F, 0x24C2, 0x7760, 0x24C3, 0x7761, 0x103D, + 0x7762, 0x0E9D, 0x7763, 0x0E96, 0x7765, 0x0E9B, 0x7766, 0x0E94, 0x7767, + 0x24C8, 0x7768, 0x0E9C, 0x7769, 0x24C7, 0x776A, 0x0E98, 0x776B, 0x0E93, + 0x776C, 0x0E99, 0x776D, 0x24CB, 0x776E, 0x2743, 0x776F, 0x2745, 0x7779, + 0x0E97, 0x777C, 0x2740, 0x777D, 0x103B, 0x777E, 0x2746, 0x777F, 0x103C, + 0x7780, 0x2744, 0x7781, 0x273F, 0x7782, 0x2742, 0x7783, 0x2747, 0x7784, + 0x103A, 0x7785, 0x2741, 0x7787, 0x11B7, 0x7788, 0x2990, 0x7789, 0x298F, + 0x778B, 0x11BA, 0x778C, 0x11B8, 0x778D, 0x298D, 0x778E, 0x11B6, 0x778F, + 0x298E, 0x7791, 0x11B9, 0x7795, 0x2BE6, 0x7797, 0x2BE8, 0x7799, 0x2BE7, + 0x779A, 0x2BDF, 0x779B, 0x2BE3, 0x779C, 0x2BE2, 0x779D, 0x2BE0, 0x779E, + 0x1308, 0x779F, 0x1309, 0x77A0, 0x1307, 0x77A1, 0x2BE1, 0x77A2, 0x2BE4, + 0x77A3, 0x2BE5, 0x77A5, 0x130A, 0x77A7, 0x141C, 0x77A8, 0x2DC0, 0x77AA, + 0x1419, 0x77AB, 0x2DBA, 0x77AC, 0x141B, 0x77AD, 0x141D, 0x77B0, 0x141A, + 0x77B1, 0x2DBF, 0x77B2, 0x2DBB, 0x77B3, 0x1418, 0x77B4, 0x2DBE, 0x77B5, + 0x2DB9, 0x77B6, 0x2DBD, 0x77B7, 0x2DBC, 0x77BA, 0x2F6B, 0x77BB, 0x14FC, + 0x77BC, 0x14FD, 0x77BD, 0x14FA, 0x77BF, 0x14FB, 0x77C2, 0x2F6A, 0x77C4, + 0x30C8, 0x77C7, 0x159E, 0x77C9, 0x30C6, 0x77CA, 0x30C7, 0x77CC, 0x31FE, + 0x77CD, 0x3201, 0x77CE, 0x31FF, 0x77CF, 0x3200, 0x77D0, 0x32E5, 0x77D3, + 0x1680, 0x77D4, 0x3429, 0x77D5, 0x348F, 0x77D7, 0x1725, 0x77D8, 0x34D3, + 0x77D9, 0x34D4, 0x77DA, 0x1753, 0x77DB, 0x0367, 0x77DC, 0x07BA, 0x77DE, + 0x2238, 0x77E0, 0x24CC, 0x77E2, 0x0368, 0x77E3, 0x04F6, 0x77E5, 0x065D, + 0x77E7, 0x1B9F, 0x77E8, 0x1BA0, 0x77E9, 0x0949, 0x77EC, 0x2239, 0x77ED, + 0x0CF5, 0x77EE, 0x0E9E, 0x77EF, 0x141E, 0x77F0, 0x2DC1, 0x77F1, 0x30C9, + 0x77F2, 0x3202, 0x77F3, 0x0369, 0x77F7, 0x1A1E, 0x77F8, 0x1A19, 0x77F9, + 0x1A1B, 0x77FA, 0x1A1D, 0x77FB, 0x1A1C, 0x77FC, 0x1A1A, 0x77FD, 0x065E, + 0x7802, 0x07BB, 0x7803, 0x1BA9, 0x7805, 0x1BA4, 0x7806, 0x1BA1, 0x7809, + 0x1BA8, 0x780C, 0x07BD, 0x780D, 0x07BE, 0x780E, 0x1BA7, 0x780F, 0x1BA6, + 0x7810, 0x1BA5, 0x7811, 0x1BA2, 0x7812, 0x1BA3, 0x7813, 0x1BAA, 0x7814, + 0x07BC, 0x781D, 0x094D, 0x781F, 0x0953, 0x7820, 0x0952, 0x7821, 0x1D6F, + 0x7822, 0x1D69, 0x7823, 0x1D67, 0x7825, 0x0950, 0x7826, 0x1FBB, 0x7827, + 0x094B, 0x7828, 0x1D6C, 0x7829, 0x1D70, 0x782A, 0x1D72, 0x782B, 0x1D6E, + 0x782C, 0x1D68, 0x782D, 0x0951, 0x782E, 0x1D6D, 0x782F, 0x1D6B, 0x7830, + 0x094A, 0x7831, 0x1D73, 0x7832, 0x0954, 0x7833, 0x1D71, 0x7834, 0x094E, + 0x7835, 0x1D6A, 0x7837, 0x094F, 0x7838, 0x094C, 0x7843, 0x0B40, 0x7845, + 0x1FBC, 0x7848, 0x1FB5, 0x7849, 0x1FB7, 0x784A, 0x1FB9, 0x784C, 0x1FBA, + 0x784D, 0x1FB8, 0x784E, 0x0B41, 0x7850, 0x1FBD, 0x7852, 0x1FB6, 0x785C, + 0x223D, 0x785D, 0x0CF6, 0x785E, 0x2245, 0x7860, 0x223A, 0x7862, 0x2246, + 0x7864, 0x223B, 0x7865, 0x223C, 0x7868, 0x2244, 0x7869, 0x2243, 0x786A, + 0x2240, 0x786B, 0x0B3F, 0x786C, 0x0CF7, 0x786D, 0x223E, 0x786E, 0x2241, + 0x786F, 0x0CF8, 0x7870, 0x2242, 0x7871, 0x223F, 0x7879, 0x24D7, 0x787B, + 0x24DB, 0x787C, 0x0EA5, 0x787E, 0x274D, 0x787F, 0x0EA8, 0x7880, 0x24D9, + 0x7881, 0x36E8, 0x7883, 0x24D6, 0x7884, 0x24D1, 0x7885, 0x24D3, 0x7886, + 0x24D4, 0x7887, 0x24CD, 0x7889, 0x0EA4, 0x788C, 0x0EA3, 0x788E, 0x0E9F, + 0x788F, 0x24D0, 0x7891, 0x0EA6, 0x7893, 0x0EA7, 0x7894, 0x24CF, 0x7895, + 0x24D2, 0x7896, 0x24DA, 0x7897, 0x0EA1, 0x7898, 0x0EA2, 0x7899, 0x24D8, + 0x789A, 0x24CE, 0x789E, 0x274F, 0x789F, 0x103F, 0x78A0, 0x2751, 0x78A1, + 0x24D5, 0x78A2, 0x2753, 0x78A3, 0x1043, 0x78A4, 0x2754, 0x78A5, 0x2750, + 0x78A7, 0x1040, 0x78A8, 0x274C, 0x78A9, 0x1042, 0x78AA, 0x2749, 0x78AB, + 0x274E, 0x78AC, 0x2752, 0x78AD, 0x274B, 0x78B0, 0x0EA0, 0x78B2, 0x2748, + 0x78B3, 0x1041, 0x78B4, 0x274A, 0x78BA, 0x11BD, 0x78BB, 0x2992, 0x78BC, + 0x11C1, 0x78BE, 0x11BF, 0x78C1, 0x103E, 0x78C3, 0x2999, 0x78C4, 0x299A, + 0x78C5, 0x11BC, 0x78C8, 0x2998, 0x78C9, 0x299B, 0x78CA, 0x11BE, 0x78CB, + 0x11BB, 0x78CC, 0x2994, 0x78CD, 0x2991, 0x78CE, 0x2996, 0x78CF, 0x2993, + 0x78D0, 0x11C2, 0x78D1, 0x2995, 0x78D4, 0x2997, 0x78D5, 0x11C0, 0x78DA, + 0x130C, 0x78DB, 0x2BEF, 0x78DD, 0x2BE9, 0x78DE, 0x2BED, 0x78DF, 0x2BF3, + 0x78E0, 0x2BF4, 0x78E1, 0x2BF0, 0x78E2, 0x2BF1, 0x78E3, 0x2BEE, 0x78E5, + 0x2BEB, 0x78E7, 0x130E, 0x78E8, 0x130B, 0x78E9, 0x2BEA, 0x78EA, 0x2BEC, + 0x78EC, 0x130D, 0x78ED, 0x2BF2, 0x78EF, 0x1422, 0x78F2, 0x2DC8, 0x78F3, + 0x2DC2, 0x78F4, 0x1421, 0x78F7, 0x141F, 0x78F9, 0x2DCA, 0x78FA, 0x1420, + 0x78FB, 0x2DC5, 0x78FC, 0x2DC6, 0x78FD, 0x2DC3, 0x78FE, 0x2DCB, 0x78FF, + 0x2DC7, 0x7901, 0x1423, 0x7902, 0x2DC4, 0x7904, 0x2DCC, 0x7905, 0x2DC9, + 0x7909, 0x2F6F, 0x790C, 0x2F6C, 0x790E, 0x14FE, 0x7910, 0x2F70, 0x7911, + 0x2F72, 0x7912, 0x2F71, 0x7913, 0x2F6D, 0x7914, 0x2F6E, 0x7917, 0x30CE, + 0x7919, 0x159F, 0x791B, 0x30CB, 0x791C, 0x30CD, 0x791D, 0x30CA, 0x791E, + 0x30CF, 0x7921, 0x30CC, 0x7923, 0x3204, 0x7924, 0x3207, 0x7925, 0x3203, + 0x7926, 0x1624, 0x7927, 0x3205, 0x7928, 0x3206, 0x7929, 0x3208, 0x792A, + 0x1625, 0x792B, 0x1627, 0x792C, 0x1626, 0x792D, 0x32E6, 0x792F, 0x32E8, + 0x7931, 0x32E7, 0x7935, 0x3397, 0x7938, 0x3490, 0x7939, 0x34D5, 0x793A, + 0x036A, 0x793D, 0x18D7, 0x793E, 0x065F, 0x793F, 0x1A20, 0x7940, 0x0660, + 0x7941, 0x0661, 0x7942, 0x1A1F, 0x7944, 0x1BAF, 0x7945, 0x1BAE, 0x7946, + 0x07BF, 0x7947, 0x07C2, 0x7948, 0x07C1, 0x7949, 0x07C0, 0x794A, 0x1BAB, + 0x794B, 0x1BAD, 0x794C, 0x1BAC, 0x794F, 0x1D76, 0x7950, 0x0956, 0x7951, + 0x1D7A, 0x7952, 0x1D79, 0x7953, 0x1D78, 0x7954, 0x1D74, 0x7955, 0x0955, + 0x7956, 0x0959, 0x7957, 0x095C, 0x795A, 0x095D, 0x795B, 0x1D75, 0x795C, + 0x1D77, 0x795D, 0x095B, 0x795E, 0x095A, 0x795F, 0x0958, 0x7960, 0x0957, + 0x7961, 0x1FC4, 0x7963, 0x1FC2, 0x7964, 0x1FBE, 0x7965, 0x0B42, 0x7967, + 0x1FBF, 0x7968, 0x0B43, 0x7969, 0x1FC0, 0x796A, 0x1FC1, 0x796B, 0x1FC3, + 0x796D, 0x0B44, 0x7970, 0x224A, 0x7972, 0x2249, 0x7973, 0x2248, 0x7974, + 0x2247, 0x7979, 0x24DF, 0x797A, 0x0EA9, 0x797C, 0x24DC, 0x797D, 0x24DE, + 0x797F, 0x0EAA, 0x7981, 0x0EAB, 0x7982, 0x24DD, 0x7988, 0x275D, 0x798A, + 0x2756, 0x798B, 0x2757, 0x798D, 0x1046, 0x798E, 0x1044, 0x798F, 0x1045, + 0x7990, 0x275F, 0x7992, 0x275E, 0x7993, 0x275B, 0x7994, 0x275A, 0x7995, + 0x2759, 0x7996, 0x2758, 0x7997, 0x275C, 0x7998, 0x2755, 0x799A, 0x299C, + 0x799B, 0x29A1, 0x799C, 0x299F, 0x79A0, 0x299E, 0x79A1, 0x299D, 0x79A2, + 0x29A0, 0x79A4, 0x2BF5, 0x79A6, 0x130F, 0x79A7, 0x1424, 0x79A8, 0x2DCE, + 0x79AA, 0x1425, 0x79AB, 0x2DCD, 0x79AC, 0x2F74, 0x79AD, 0x2F73, 0x79AE, + 0x14FF, 0x79B0, 0x30D0, 0x79B1, 0x15A0, 0x79B2, 0x3209, 0x79B3, 0x16CF, + 0x79B4, 0x3398, 0x79B6, 0x3492, 0x79B7, 0x3491, 0x79B8, 0x17B2, 0x79B9, + 0x07C3, 0x79BA, 0x07C4, 0x79BB, 0x1FC5, 0x79BD, 0x0EAD, 0x79BE, 0x036B, + 0x79BF, 0x04F9, 0x79C0, 0x04F8, 0x79C1, 0x04F7, 0x79C5, 0x1A21, 0x79C8, + 0x0663, 0x79C9, 0x0662, 0x79CB, 0x07C7, 0x79CD, 0x1BB1, 0x79CE, 0x1BB4, + 0x79CF, 0x1BB2, 0x79D1, 0x07C5, 0x79D2, 0x07C6, 0x79D5, 0x1BB0, 0x79D6, + 0x1BB3, 0x79D8, 0x0964, 0x79DC, 0x1D81, 0x79DD, 0x1D83, 0x79DE, 0x1D82, + 0x79DF, 0x0961, 0x79E0, 0x1D7D, 0x79E3, 0x095F, 0x79E4, 0x095E, 0x79E6, + 0x0962, 0x79E7, 0x0960, 0x79E9, 0x0963, 0x79EA, 0x1D80, 0x79EB, 0x1D7B, + 0x79EC, 0x1D7C, 0x79ED, 0x1D7F, 0x79EE, 0x1D7E, 0x79F6, 0x1FC8, 0x79F7, + 0x1FC9, 0x79F8, 0x1FC7, 0x79FA, 0x1FC6, 0x79FB, 0x0B45, 0x7A00, 0x0CFD, + 0x7A02, 0x224B, 0x7A03, 0x224D, 0x7A04, 0x224F, 0x7A05, 0x0CFC, 0x7A08, + 0x0CFA, 0x7A0A, 0x224C, 0x7A0B, 0x0CFB, 0x7A0C, 0x224E, 0x7A0D, 0x0CF9, + 0x7A10, 0x24E9, 0x7A11, 0x24E0, 0x7A12, 0x24E3, 0x7A13, 0x24E7, 0x7A14, + 0x0EB1, 0x7A15, 0x24E5, 0x7A17, 0x24E4, 0x7A18, 0x24E1, 0x7A19, 0x24E2, + 0x7A1A, 0x0EAF, 0x7A1B, 0x24E8, 0x7A1C, 0x0EAE, 0x7A1E, 0x0EB3, 0x7A1F, + 0x0EB2, 0x7A20, 0x0EB0, 0x7A22, 0x24E6, 0x7A26, 0x2765, 0x7A28, 0x2764, + 0x7A2B, 0x2760, 0x7A2E, 0x1047, 0x7A2F, 0x2763, 0x7A30, 0x2762, 0x7A31, + 0x1048, 0x7A37, 0x11C7, 0x7A39, 0x29A3, 0x7A3B, 0x11C8, 0x7A3C, 0x11C4, + 0x7A3D, 0x11C6, 0x7A3F, 0x11C3, 0x7A40, 0x11C5, 0x7A44, 0x2BF6, 0x7A46, + 0x1312, 0x7A47, 0x2BF8, 0x7A48, 0x2BF7, 0x7A4A, 0x2761, 0x7A4B, 0x1314, + 0x7A4C, 0x1313, 0x7A4D, 0x1310, 0x7A4E, 0x1311, 0x7A54, 0x2DD3, 0x7A56, + 0x2DD1, 0x7A57, 0x1426, 0x7A58, 0x2DD2, 0x7A5A, 0x2DD4, 0x7A5B, 0x2DD0, + 0x7A5C, 0x2DCF, 0x7A5F, 0x2F75, 0x7A60, 0x1502, 0x7A61, 0x1500, 0x7A62, + 0x1501, 0x7A67, 0x30D1, 0x7A68, 0x30D2, 0x7A69, 0x15A2, 0x7A6B, 0x15A1, + 0x7A6C, 0x320B, 0x7A6D, 0x320C, 0x7A6E, 0x320A, 0x7A70, 0x3399, 0x7A71, + 0x339A, 0x7A74, 0x036C, 0x7A75, 0x1811, 0x7A76, 0x04FA, 0x7A78, 0x1A22, + 0x7A79, 0x0665, 0x7A7A, 0x0664, 0x7A7B, 0x1A23, 0x7A7E, 0x1BB6, 0x7A7F, + 0x07C8, 0x7A80, 0x1BB5, 0x7A81, 0x07C9, 0x7A84, 0x0965, 0x7A85, 0x1D86, + 0x7A86, 0x1D84, 0x7A87, 0x1D8A, 0x7A88, 0x0966, 0x7A89, 0x1D85, 0x7A8A, + 0x1D89, 0x7A8B, 0x1D87, 0x7A8C, 0x1D88, 0x7A8F, 0x1FCA, 0x7A90, 0x1FCC, + 0x7A92, 0x0B46, 0x7A94, 0x1FCB, 0x7A95, 0x0B47, 0x7A96, 0x0D00, 0x7A97, + 0x0CFF, 0x7A98, 0x0CFE, 0x7A99, 0x2250, 0x7A9E, 0x24EC, 0x7A9F, 0x0EB4, + 0x7AA0, 0x0EB5, 0x7AA2, 0x24EB, 0x7AA3, 0x24EA, 0x7AA8, 0x2766, 0x7AA9, + 0x104A, 0x7AAA, 0x1049, 0x7AAB, 0x2767, 0x7AAC, 0x2768, 0x7AAE, 0x11CA, + 0x7AAF, 0x11C9, 0x7AB1, 0x2BFC, 0x7AB2, 0x29A4, 0x7AB3, 0x29A6, 0x7AB4, + 0x29A5, 0x7AB5, 0x2BFB, 0x7AB6, 0x2BF9, 0x7AB7, 0x2BFD, 0x7AB8, 0x2BFA, + 0x7ABA, 0x1315, 0x7ABE, 0x2DD5, 0x7ABF, 0x1427, 0x7AC0, 0x2DD6, 0x7AC1, + 0x2DD7, 0x7AC4, 0x1503, 0x7AC5, 0x1504, 0x7AC7, 0x1628, 0x7ACA, 0x16FF, + 0x7ACB, 0x036D, 0x7AD1, 0x1BB7, 0x7AD8, 0x1D8B, 0x7AD9, 0x0967, 0x7ADF, + 0x0BDE, 0x7AE0, 0x0BDD, 0x7AE3, 0x0D02, 0x7AE4, 0x2252, 0x7AE5, 0x0D01, + 0x7AE6, 0x2251, 0x7AEB, 0x24ED, 0x7AED, 0x104B, 0x7AEE, 0x2769, 0x7AEF, + 0x104C, 0x7AF6, 0x1629, 0x7AF7, 0x320D, 0x7AF9, 0x03F6, 0x7AFA, 0x0666, + 0x7AFB, 0x1A24, 0x7AFD, 0x07CB, 0x7AFF, 0x07CA, 0x7B00, 0x1BB8, 0x7B01, + 0x1BB9, 0x7B04, 0x1D8D, 0x7B05, 0x1D8F, 0x7B06, 0x0968, 0x7B08, 0x1D91, + 0x7B09, 0x1D94, 0x7B0A, 0x1D92, 0x7B0E, 0x1D93, 0x7B0F, 0x1D90, 0x7B10, + 0x1D8C, 0x7B11, 0x0969, 0x7B12, 0x1D95, 0x7B13, 0x1D8E, 0x7B18, 0x1FD5, + 0x7B19, 0x0B4D, 0x7B1A, 0x1FDE, 0x7B1B, 0x0B4A, 0x7B1D, 0x1FD7, 0x7B1E, + 0x0B4E, 0x7B20, 0x0B48, 0x7B22, 0x1FD2, 0x7B23, 0x1FDF, 0x7B24, 0x1FD3, + 0x7B25, 0x1FD0, 0x7B26, 0x0B4C, 0x7B28, 0x0B49, 0x7B2A, 0x1FD6, 0x7B2B, + 0x1FD9, 0x7B2C, 0x0B4B, 0x7B2D, 0x1FDA, 0x7B2E, 0x0B4F, 0x7B2F, 0x1FDB, + 0x7B30, 0x1FD1, 0x7B31, 0x1FD8, 0x7B32, 0x1FDC, 0x7B33, 0x1FD4, 0x7B34, + 0x1FCF, 0x7B35, 0x1FCD, 0x7B38, 0x1FDD, 0x7B3B, 0x1FCE, 0x7B40, 0x2259, + 0x7B44, 0x2255, 0x7B45, 0x225B, 0x7B46, 0x0D05, 0x7B47, 0x2254, 0x7B48, + 0x2256, 0x7B49, 0x0D03, 0x7B4A, 0x2253, 0x7B4B, 0x0D0A, 0x7B4C, 0x2257, + 0x7B4D, 0x0D09, 0x7B4E, 0x2258, 0x7B4F, 0x0D0B, 0x7B50, 0x0D06, 0x7B51, + 0x0D0C, 0x7B52, 0x0D07, 0x7B54, 0x0D08, 0x7B56, 0x0D04, 0x7B58, 0x225A, + 0x7B60, 0x0EB8, 0x7B61, 0x24F8, 0x7B63, 0x24FB, 0x7B64, 0x24EF, 0x7B65, + 0x24F4, 0x7B66, 0x24EE, 0x7B67, 0x0EBA, 0x7B69, 0x24F2, 0x7B6D, 0x24F0, + 0x7B6E, 0x0EB9, 0x7B70, 0x24F7, 0x7B71, 0x24F6, 0x7B72, 0x24F3, 0x7B73, + 0x24F5, 0x7B74, 0x24F1, 0x7B75, 0x1050, 0x7B76, 0x24FA, 0x7B77, 0x0EB6, + 0x7B78, 0x24F9, 0x7B82, 0x2779, 0x7B84, 0x1057, 0x7B85, 0x2774, 0x7B87, + 0x1056, 0x7B88, 0x276A, 0x7B8A, 0x276C, 0x7B8B, 0x104F, 0x7B8C, 0x2771, + 0x7B8D, 0x2770, 0x7B8E, 0x2773, 0x7B8F, 0x1054, 0x7B90, 0x276E, 0x7B91, + 0x276D, 0x7B94, 0x1053, 0x7B95, 0x104E, 0x7B96, 0x276F, 0x7B97, 0x1051, + 0x7B98, 0x2775, 0x7B99, 0x2777, 0x7B9B, 0x2772, 0x7B9C, 0x276B, 0x7B9D, + 0x1052, 0x7BA0, 0x11D2, 0x7BA1, 0x104D, 0x7BA4, 0x2778, 0x7BAC, 0x29AA, + 0x7BAD, 0x11CB, 0x7BAF, 0x29AC, 0x7BB1, 0x11CC, 0x7BB4, 0x11CE, 0x7BB5, + 0x29AF, 0x7BB7, 0x29A7, 0x7BB8, 0x1055, 0x7BB9, 0x29AD, 0x7BBE, 0x29A9, + 0x7BC0, 0x0EB7, 0x7BC1, 0x11D1, 0x7BC4, 0x11CD, 0x7BC6, 0x11CF, 0x7BC7, + 0x11D0, 0x7BC9, 0x1318, 0x7BCA, 0x29AE, 0x7BCB, 0x29A8, 0x7BCC, 0x11D3, + 0x7BCE, 0x29AB, 0x7BD4, 0x2C07, 0x7BD5, 0x2C02, 0x7BD8, 0x2C0C, 0x7BD9, + 0x1316, 0x7BDA, 0x2C04, 0x7BDB, 0x131A, 0x7BDC, 0x2C0A, 0x7BDD, 0x2C01, + 0x7BDE, 0x2BFE, 0x7BDF, 0x2C0D, 0x7BE0, 0x142D, 0x7BE1, 0x131B, 0x7BE2, + 0x2C09, 0x7BE3, 0x2BFF, 0x7BE4, 0x1319, 0x7BE5, 0x2C03, 0x7BE6, 0x131D, + 0x7BE7, 0x2C00, 0x7BE8, 0x2C05, 0x7BE9, 0x131C, 0x7BEA, 0x2C08, 0x7BEB, + 0x2C0B, 0x7BF0, 0x2DE9, 0x7BF1, 0x2DEA, 0x7BF2, 0x2DDA, 0x7BF3, 0x2DE1, + 0x7BF4, 0x2DDF, 0x7BF7, 0x142B, 0x7BF8, 0x2DE6, 0x7BF9, 0x2C06, 0x7BFB, + 0x2DDD, 0x7BFD, 0x2DE7, 0x7BFE, 0x142A, 0x7BFF, 0x2DDC, 0x7C00, 0x2DDB, + 0x7C01, 0x2DE5, 0x7C02, 0x2DE2, 0x7C03, 0x2DE4, 0x7C05, 0x2DD8, 0x7C06, + 0x2DE8, 0x7C07, 0x1428, 0x7C09, 0x2DE3, 0x7C0A, 0x2DEC, 0x7C0B, 0x2DE0, + 0x7C0C, 0x142C, 0x7C0D, 0x1429, 0x7C0E, 0x2DDE, 0x7C0F, 0x2DD9, 0x7C10, + 0x2DEB, 0x7C11, 0x1317, 0x7C19, 0x2F78, 0x7C1C, 0x2F76, 0x7C1D, 0x2F7C, + 0x7C1E, 0x1508, 0x7C1F, 0x2F7A, 0x7C20, 0x2F79, 0x7C21, 0x150A, 0x7C22, + 0x2F7F, 0x7C23, 0x1509, 0x7C25, 0x2F80, 0x7C26, 0x2F7D, 0x7C27, 0x1506, + 0x7C28, 0x2F7E, 0x7C29, 0x2F77, 0x7C2A, 0x1507, 0x7C2B, 0x1505, 0x7C2C, + 0x30D6, 0x7C2D, 0x2F7B, 0x7C30, 0x2F81, 0x7C33, 0x30D3, 0x7C37, 0x15A7, + 0x7C38, 0x15A5, 0x7C39, 0x30D5, 0x7C3B, 0x30D7, 0x7C3C, 0x30D4, 0x7C3D, + 0x15A6, 0x7C3E, 0x15A3, 0x7C3F, 0x15A4, 0x7C40, 0x15A8, 0x7C43, 0x162B, + 0x7C45, 0x3212, 0x7C47, 0x3211, 0x7C48, 0x320F, 0x7C49, 0x320E, 0x7C4A, + 0x3210, 0x7C4C, 0x162A, 0x7C4D, 0x162C, 0x7C50, 0x1681, 0x7C53, 0x32EA, + 0x7C54, 0x32E9, 0x7C57, 0x339B, 0x7C59, 0x339D, 0x7C5A, 0x339F, 0x7C5B, + 0x339E, 0x7C5C, 0x339C, 0x7C5F, 0x16D1, 0x7C60, 0x16D0, 0x7C63, 0x1701, + 0x7C64, 0x1700, 0x7C65, 0x1702, 0x7C66, 0x342B, 0x7C67, 0x342A, 0x7C69, + 0x34D6, 0x7C6A, 0x3493, 0x7C6B, 0x34D7, 0x7C6C, 0x1745, 0x7C6E, 0x1746, + 0x7C6F, 0x3507, 0x7C72, 0x176B, 0x7C73, 0x03F7, 0x7C75, 0x1A25, 0x7C78, + 0x1BBB, 0x7C79, 0x1BBC, 0x7C7A, 0x1BBA, 0x7C7D, 0x07CC, 0x7C7F, 0x1BBD, + 0x7C80, 0x1BBE, 0x7C81, 0x1BBF, 0x7C84, 0x1D96, 0x7C85, 0x1D9C, 0x7C88, + 0x1D9A, 0x7C89, 0x096A, 0x7C8A, 0x1D98, 0x7C8C, 0x1D99, 0x7C8D, 0x1D9B, + 0x7C91, 0x1D97, 0x7C92, 0x0B50, 0x7C94, 0x1FE0, 0x7C95, 0x0B52, 0x7C96, + 0x1FE2, 0x7C97, 0x0B51, 0x7C98, 0x1FE1, 0x7C9E, 0x225D, 0x7C9F, 0x0D0D, + 0x7CA1, 0x225F, 0x7CA2, 0x225C, 0x7CA3, 0x1FE3, 0x7CA5, 0x0D0E, 0x7CA7, + 0x36ED, 0x7CA8, 0x225E, 0x7CAF, 0x24FE, 0x7CB1, 0x0EBB, 0x7CB2, 0x24FC, + 0x7CB3, 0x0EBC, 0x7CB4, 0x24FD, 0x7CB5, 0x0EBD, 0x7CB9, 0x1058, 0x7CBA, + 0x277D, 0x7CBB, 0x277A, 0x7CBC, 0x277C, 0x7CBD, 0x1059, 0x7CBE, 0x105A, + 0x7CBF, 0x277B, 0x7CC5, 0x29B0, 0x7CC8, 0x29B1, 0x7CCA, 0x11D4, 0x7CCB, + 0x29B3, 0x7CCC, 0x29B2, 0x7CCE, 0x0121, 0x7CD0, 0x2C11, 0x7CD1, 0x2C12, + 0x7CD2, 0x2C0E, 0x7CD4, 0x2C0F, 0x7CD5, 0x131E, 0x7CD6, 0x131F, 0x7CD7, + 0x2C10, 0x7CD9, 0x1433, 0x7CDC, 0x142F, 0x7CDD, 0x1434, 0x7CDE, 0x1430, + 0x7CDF, 0x1432, 0x7CE0, 0x142E, 0x7CE2, 0x1431, 0x7CE7, 0x150B, 0x7CE8, + 0x2DED, 0x7CEA, 0x30D9, 0x7CEC, 0x30D8, 0x7CEE, 0x3213, 0x7CEF, 0x162D, + 0x7CF0, 0x162E, 0x7CF1, 0x33A1, 0x7CF2, 0x32EB, 0x7CF4, 0x33A0, 0x7CF6, + 0x34D8, 0x7CF7, 0x351D, 0x7CF8, 0x03F8, 0x7CFB, 0x04FB, 0x7CFD, 0x1A26, + 0x7CFE, 0x0667, 0x7D00, 0x07CF, 0x7D01, 0x1BC2, 0x7D02, 0x07CD, 0x7D03, + 0x1BC0, 0x7D04, 0x07D2, 0x7D05, 0x07CE, 0x7D06, 0x07D3, 0x7D07, 0x07D1, + 0x7D08, 0x1BC1, 0x7D09, 0x07D0, 0x7D0A, 0x096E, 0x7D0B, 0x096D, 0x7D0C, + 0x1DA7, 0x7D0D, 0x0976, 0x7D0E, 0x1DA0, 0x7D0F, 0x1DA6, 0x7D10, 0x0972, + 0x7D11, 0x1D9F, 0x7D12, 0x1DA5, 0x7D13, 0x1DA3, 0x7D14, 0x0971, 0x7D15, + 0x0973, 0x7D16, 0x1DA2, 0x7D17, 0x096C, 0x7D18, 0x1DA1, 0x7D19, 0x0977, + 0x7D1A, 0x0974, 0x7D1B, 0x0978, 0x7D1C, 0x0975, 0x7D1D, 0x1D9E, 0x7D1E, + 0x1D9D, 0x7D1F, 0x1DA4, 0x7D20, 0x096F, 0x7D21, 0x096B, 0x7D22, 0x0970, + 0x7D28, 0x1FF2, 0x7D29, 0x1FEB, 0x7D2B, 0x0D13, 0x7D2C, 0x1FEA, 0x7D2E, + 0x0B56, 0x7D2F, 0x0B5D, 0x7D30, 0x0B5A, 0x7D31, 0x0B60, 0x7D32, 0x0B5F, + 0x7D33, 0x0B5B, 0x7D35, 0x1FE4, 0x7D36, 0x1FE7, 0x7D38, 0x1FE6, 0x7D39, + 0x0B57, 0x7D3A, 0x1FE8, 0x7D3B, 0x1FF1, 0x7D3C, 0x0B58, 0x7D3D, 0x1FE5, + 0x7D3E, 0x1FEE, 0x7D3F, 0x1FEF, 0x7D40, 0x0B59, 0x7D41, 0x1FEC, 0x7D42, + 0x0B5E, 0x7D43, 0x0B54, 0x7D44, 0x0B5C, 0x7D45, 0x1FE9, 0x7D46, 0x0B53, + 0x7D47, 0x1FED, 0x7D4A, 0x1FF0, 0x7D4E, 0x2270, 0x7D4F, 0x2267, 0x7D50, + 0x0D10, 0x7D51, 0x226E, 0x7D52, 0x226B, 0x7D53, 0x2263, 0x7D54, 0x226C, + 0x7D55, 0x0D12, 0x7D56, 0x2264, 0x7D58, 0x2260, 0x7D5B, 0x0EC3, 0x7D5C, + 0x2269, 0x7D5E, 0x0D0F, 0x7D5F, 0x226F, 0x7D61, 0x0D16, 0x7D62, 0x0D18, + 0x7D63, 0x2262, 0x7D66, 0x0D17, 0x7D67, 0x2265, 0x7D68, 0x0D11, 0x7D69, + 0x226D, 0x7D6A, 0x2266, 0x7D6B, 0x226A, 0x7D6D, 0x2268, 0x7D6E, 0x0D14, + 0x7D6F, 0x2261, 0x7D70, 0x0D19, 0x7D71, 0x0B55, 0x7D72, 0x0D15, 0x7D73, + 0x0D1A, 0x7D79, 0x0EBF, 0x7D7A, 0x2505, 0x7D7B, 0x2507, 0x7D7C, 0x2509, + 0x7D7D, 0x250D, 0x7D7F, 0x2503, 0x7D80, 0x2501, 0x7D81, 0x0EC1, 0x7D83, + 0x2508, 0x7D84, 0x250C, 0x7D85, 0x2504, 0x7D86, 0x2500, 0x7D88, 0x24FF, + 0x7D8C, 0x250A, 0x7D8D, 0x2502, 0x7D8E, 0x2506, 0x7D8F, 0x0EC2, 0x7D91, + 0x0EC0, 0x7D92, 0x250E, 0x7D93, 0x0EBE, 0x7D94, 0x250B, 0x7D96, 0x278E, + 0x7D9C, 0x105D, 0x7D9D, 0x2786, 0x7D9E, 0x11E1, 0x7D9F, 0x2790, 0x7DA0, + 0x1060, 0x7DA1, 0x2794, 0x7DA2, 0x1066, 0x7DA3, 0x2781, 0x7DA6, 0x2791, + 0x7DA7, 0x277E, 0x7DA9, 0x2793, 0x7DAA, 0x2782, 0x7DAC, 0x106D, 0x7DAD, + 0x106A, 0x7DAE, 0x2792, 0x7DAF, 0x278C, 0x7DB0, 0x105C, 0x7DB1, 0x1064, + 0x7DB2, 0x1063, 0x7DB4, 0x1062, 0x7DB5, 0x1068, 0x7DB7, 0x277F, 0x7DB8, + 0x1069, 0x7DB9, 0x278D, 0x7DBA, 0x1065, 0x7DBB, 0x105B, 0x7DBC, 0x278F, + 0x7DBD, 0x105E, 0x7DBE, 0x105F, 0x7DBF, 0x1067, 0x7DC0, 0x2784, 0x7DC1, + 0x2783, 0x7DC2, 0x2780, 0x7DC4, 0x2788, 0x7DC5, 0x2785, 0x7DC6, 0x2789, + 0x7DC7, 0x106C, 0x7DC9, 0x2795, 0x7DCA, 0x1061, 0x7DCB, 0x278A, 0x7DCC, + 0x278B, 0x7DCE, 0x2787, 0x7DD2, 0x106B, 0x7DD7, 0x29B8, 0x7DD8, 0x11D9, + 0x7DD9, 0x11E2, 0x7DDA, 0x11DE, 0x7DDB, 0x29B5, 0x7DDD, 0x11DB, 0x7DDE, + 0x11DF, 0x7DDF, 0x29C1, 0x7DE0, 0x11D5, 0x7DE1, 0x29B9, 0x7DE3, 0x11DD, + 0x7DE6, 0x29BC, 0x7DE7, 0x29B7, 0x7DE8, 0x11DC, 0x7DE9, 0x11E0, 0x7DEA, + 0x29B6, 0x7DEC, 0x11DA, 0x7DEE, 0x29C0, 0x7DEF, 0x11D7, 0x7DF0, 0x29BF, + 0x7DF1, 0x29BE, 0x7DF2, 0x11E3, 0x7DF3, 0x28C8, 0x7DF4, 0x11D6, 0x7DF6, + 0x29BD, 0x7DF7, 0x29B4, 0x7DF9, 0x11E4, 0x7DFA, 0x29BB, 0x7DFB, 0x11D8, + 0x7E03, 0x29BA, 0x7E08, 0x1322, 0x7E09, 0x1327, 0x7E0A, 0x1320, 0x7E0B, + 0x2C1F, 0x7E0C, 0x2C16, 0x7E0D, 0x2C22, 0x7E0E, 0x2C1A, 0x7E0F, 0x2C20, + 0x7E10, 0x1328, 0x7E11, 0x1321, 0x7E12, 0x2C13, 0x7E13, 0x2C19, 0x7E14, + 0x2C23, 0x7E15, 0x2C1C, 0x7E16, 0x2C21, 0x7E17, 0x2C15, 0x7E1A, 0x2C1D, + 0x7E1B, 0x1323, 0x7E1C, 0x2C1B, 0x7E1D, 0x1326, 0x7E1E, 0x1325, 0x7E1F, + 0x2C17, 0x7E20, 0x2C18, 0x7E21, 0x2C14, 0x7E22, 0x2C1E, 0x7E23, 0x1324, + 0x7E24, 0x2C25, 0x7E25, 0x2C24, 0x7E29, 0x2DF8, 0x7E2A, 0x2DF4, 0x7E2B, + 0x143B, 0x7E2D, 0x2DEE, 0x7E2E, 0x1435, 0x7E2F, 0x1445, 0x7E30, 0x2DFA, + 0x7E31, 0x143D, 0x7E32, 0x1439, 0x7E33, 0x2DF1, 0x7E34, 0x1440, 0x7E35, + 0x1443, 0x7E36, 0x2DFC, 0x7E37, 0x1438, 0x7E38, 0x2DF3, 0x7E39, 0x1441, + 0x7E3A, 0x2DFE, 0x7E3B, 0x2DFB, 0x7E3C, 0x2DEF, 0x7E3D, 0x143C, 0x7E3E, + 0x1436, 0x7E3F, 0x1444, 0x7E40, 0x2DF6, 0x7E41, 0x143F, 0x7E42, 0x2DF0, + 0x7E43, 0x143A, 0x7E44, 0x2DFD, 0x7E45, 0x143E, 0x7E46, 0x1437, 0x7E47, + 0x2DF7, 0x7E48, 0x1442, 0x7E49, 0x2DF5, 0x7E4C, 0x2DF9, 0x7E50, 0x2F83, + 0x7E51, 0x2F89, 0x7E52, 0x1511, 0x7E53, 0x2F8C, 0x7E54, 0x150C, 0x7E55, + 0x150D, 0x7E56, 0x2F84, 0x7E57, 0x2F8B, 0x7E58, 0x2F86, 0x7E59, 0x1512, + 0x7E5A, 0x150F, 0x7E5C, 0x2F82, 0x7E5E, 0x150E, 0x7E5F, 0x2F88, 0x7E60, + 0x2F8A, 0x7E61, 0x1510, 0x7E62, 0x2F87, 0x7E63, 0x2F85, 0x7E68, 0x30E3, + 0x7E69, 0x15AC, 0x7E6A, 0x15AD, 0x7E6B, 0x15A9, 0x7E6D, 0x15AA, 0x7E6F, + 0x30DF, 0x7E70, 0x30DD, 0x7E72, 0x30E1, 0x7E73, 0x15AE, 0x7E74, 0x30E2, + 0x7E75, 0x30DB, 0x7E76, 0x30DA, 0x7E77, 0x30DE, 0x7E78, 0x30DC, 0x7E79, + 0x15AB, 0x7E7A, 0x30E0, 0x7E7B, 0x3214, 0x7E7C, 0x1631, 0x7E7D, 0x1630, + 0x7E7E, 0x3215, 0x7E80, 0x3217, 0x7E81, 0x3216, 0x7E82, 0x1632, 0x7E86, + 0x32F0, 0x7E87, 0x32ED, 0x7E88, 0x32EE, 0x7E8A, 0x32EC, 0x7E8B, 0x32EF, + 0x7E8C, 0x1683, 0x7E8D, 0x32F1, 0x7E8F, 0x1682, 0x7E91, 0x33A2, 0x7E93, + 0x1703, 0x7E94, 0x1705, 0x7E95, 0x342C, 0x7E96, 0x1704, 0x7E97, 0x3494, + 0x7E98, 0x34DA, 0x7E99, 0x34DC, 0x7E9A, 0x34D9, 0x7E9B, 0x34DB, 0x7E9C, + 0x1759, 0x7F36, 0x03F9, 0x7F38, 0x07D4, 0x7F39, 0x1D1F, 0x7F3A, 0x0979, + 0x7F3D, 0x0B61, 0x7F3E, 0x2271, 0x7F3F, 0x2272, 0x7F43, 0x2C26, 0x7F44, + 0x1446, 0x7F45, 0x2DFF, 0x7F48, 0x1513, 0x7F4A, 0x30E5, 0x7F4B, 0x30E4, + 0x7F4C, 0x1633, 0x7F4D, 0x32F2, 0x7F4F, 0x33A3, 0x7F50, 0x1726, 0x7F51, + 0x1812, 0x7F54, 0x0668, 0x7F55, 0x04FC, 0x7F58, 0x1BC3, 0x7F5B, 0x1DAD, + 0x7F5C, 0x1DA8, 0x7F5D, 0x1DAC, 0x7F5E, 0x1DAA, 0x7F5F, 0x097A, 0x7F60, + 0x1DAB, 0x7F61, 0x1DA9, 0x7F63, 0x1FF3, 0x7F65, 0x2273, 0x7F66, 0x2274, + 0x7F67, 0x2511, 0x7F68, 0x2512, 0x7F69, 0x0EC5, 0x7F6A, 0x0EC6, 0x7F6B, + 0x2510, 0x7F6C, 0x2513, 0x7F6D, 0x250F, 0x7F6E, 0x0EC4, 0x7F70, 0x106E, + 0x7F72, 0x0EC7, 0x7F73, 0x2796, 0x7F75, 0x11E5, 0x7F76, 0x29C2, 0x7F77, + 0x11E6, 0x7F79, 0x1329, 0x7F7A, 0x2C29, 0x7F7B, 0x2C27, 0x7F7C, 0x2C28, + 0x7F7D, 0x2E02, 0x7F7E, 0x2E01, 0x7F7F, 0x2E00, 0x7F83, 0x30E6, 0x7F85, + 0x15AF, 0x7F86, 0x30E7, 0x7F87, 0x33A4, 0x7F88, 0x1727, 0x7F89, 0x3495, + 0x7F8A, 0x03FA, 0x7F8B, 0x066A, 0x7F8C, 0x0669, 0x7F8D, 0x1BC5, 0x7F8E, + 0x07D5, 0x7F91, 0x1BC4, 0x7F92, 0x1DAF, 0x7F94, 0x097B, 0x7F95, 0x1FF4, + 0x7F96, 0x1DAE, 0x7F9A, 0x0B63, 0x7F9B, 0x1FF7, 0x7F9C, 0x1FF5, 0x7F9D, + 0x1FF6, 0x7F9E, 0x0B62, 0x7FA0, 0x2276, 0x7FA1, 0x2277, 0x7FA2, 0x2275, + 0x7FA4, 0x0ECA, 0x7FA5, 0x2515, 0x7FA6, 0x2514, 0x7FA7, 0x2516, 0x7FA8, + 0x0EC9, 0x7FA9, 0x0EC8, 0x7FAC, 0x29C3, 0x7FAD, 0x29C5, 0x7FAF, 0x11E7, + 0x7FB0, 0x29C4, 0x7FB1, 0x2C2A, 0x7FB2, 0x132A, 0x7FB3, 0x2F8E, 0x7FB5, + 0x2F8D, 0x7FB6, 0x15B0, 0x7FB7, 0x30E8, 0x7FB8, 0x15B2, 0x7FB9, 0x15B1, + 0x7FBA, 0x3218, 0x7FBB, 0x32F3, 0x7FBC, 0x1684, 0x7FBD, 0x03FB, 0x7FBE, + 0x1BC6, 0x7FBF, 0x07D6, 0x7FC0, 0x1DB2, 0x7FC1, 0x097D, 0x7FC2, 0x1DB1, + 0x7FC3, 0x1DB0, 0x7FC5, 0x097C, 0x7FC7, 0x1FFD, 0x7FC9, 0x1FFF, 0x7FCA, + 0x1FF8, 0x7FCB, 0x1FF9, 0x7FCC, 0x0B64, 0x7FCD, 0x1FFA, 0x7FCE, 0x0B65, + 0x7FCF, 0x1FFE, 0x7FD0, 0x1FFB, 0x7FD1, 0x1FFC, 0x7FD2, 0x0B66, 0x7FD4, + 0x0D1C, 0x7FD5, 0x0D1D, 0x7FD7, 0x2278, 0x7FDB, 0x2517, 0x7FDC, 0x2518, + 0x7FDE, 0x279A, 0x7FDF, 0x1071, 0x7FE0, 0x106F, 0x7FE1, 0x1070, 0x7FE2, + 0x2797, 0x7FE3, 0x2798, 0x7FE5, 0x2799, 0x7FE6, 0x29CA, 0x7FE8, 0x29CB, + 0x7FE9, 0x11E8, 0x7FEA, 0x29C8, 0x7FEB, 0x29C7, 0x7FEC, 0x29C9, 0x7FED, + 0x29C6, 0x7FEE, 0x132D, 0x7FEF, 0x2C2B, 0x7FF0, 0x132B, 0x7FF1, 0x132C, + 0x7FF2, 0x2E04, 0x7FF3, 0x1447, 0x7FF4, 0x2E03, 0x7FF5, 0x2EFF, 0x7FF7, + 0x2F8F, 0x7FF8, 0x2F90, 0x7FF9, 0x1514, 0x7FFB, 0x1515, 0x7FFC, 0x1448, + 0x7FFD, 0x30E9, 0x7FFE, 0x30EA, 0x7FFF, 0x3219, 0x8000, 0x1634, 0x8001, + 0x03FC, 0x8003, 0x03FD, 0x8004, 0x097F, 0x8005, 0x066B, 0x8006, 0x097E, + 0x8007, 0x1BC7, 0x800B, 0x0D1E, 0x800C, 0x03FE, 0x800D, 0x07D8, 0x800E, + 0x1BC8, 0x800F, 0x1BC9, 0x8010, 0x07D7, 0x8011, 0x07D9, 0x8012, 0x03FF, + 0x8014, 0x1BCA, 0x8015, 0x0981, 0x8016, 0x1DB3, 0x8017, 0x0983, 0x8018, + 0x0980, 0x8019, 0x0982, 0x801B, 0x2002, 0x801C, 0x0B67, 0x801E, 0x2001, + 0x801F, 0x2000, 0x8021, 0x2519, 0x8024, 0x279B, 0x8026, 0x11E9, 0x8028, + 0x132E, 0x8029, 0x2C2D, 0x802A, 0x2C2C, 0x802C, 0x2E05, 0x8030, 0x32F4, + 0x8033, 0x0400, 0x8034, 0x18D8, 0x8035, 0x1A27, 0x8036, 0x07DA, 0x8037, + 0x1BCB, 0x8039, 0x1DB5, 0x803D, 0x0984, 0x803E, 0x1DB4, 0x803F, 0x0985, + 0x8043, 0x2004, 0x8046, 0x0B69, 0x8047, 0x2003, 0x8048, 0x2005, 0x804A, + 0x0B68, 0x804F, 0x227A, 0x8050, 0x227B, 0x8051, 0x2279, 0x8052, 0x0D1F, + 0x8056, 0x0ECB, 0x8058, 0x0ECC, 0x805A, 0x1073, 0x805C, 0x279D, 0x805D, + 0x279C, 0x805E, 0x1072, 0x8064, 0x29CC, 0x8067, 0x29CD, 0x806C, 0x2C2E, + 0x806F, 0x144C, 0x8070, 0x144B, 0x8071, 0x1449, 0x8072, 0x144A, 0x8073, + 0x144D, 0x8075, 0x2F91, 0x8076, 0x1517, 0x8077, 0x1516, 0x8078, 0x30EB, + 0x8079, 0x321A, 0x807D, 0x16D3, 0x807E, 0x16D2, 0x807F, 0x0401, 0x8082, + 0x1CEC, 0x8084, 0x0ECE, 0x8085, 0x0D20, 0x8086, 0x0ECD, 0x8087, 0x1074, + 0x8089, 0x0402, 0x808A, 0x17B3, 0x808B, 0x0403, 0x808C, 0x0404, 0x808F, + 0x1A28, 0x8090, 0x18DB, 0x8092, 0x18DC, 0x8093, 0x04FE, 0x8095, 0x18D9, + 0x8096, 0x04FD, 0x8098, 0x0500, 0x8099, 0x18DA, 0x809A, 0x0502, 0x809B, + 0x0501, 0x809C, 0x18DD, 0x809D, 0x04FF, 0x80A1, 0x0670, 0x80A2, 0x066E, + 0x80A3, 0x1A2A, 0x80A5, 0x066D, 0x80A9, 0x0672, 0x80AA, 0x0674, 0x80AB, + 0x0671, 0x80AD, 0x1A2D, 0x80AE, 0x1A29, 0x80AF, 0x0675, 0x80B1, 0x066F, + 0x80B2, 0x0503, 0x80B4, 0x0673, 0x80B5, 0x1A2C, 0x80B8, 0x1A2B, 0x80BA, + 0x066C, 0x80C2, 0x1BD1, 0x80C3, 0x07DE, 0x80C4, 0x07DF, 0x80C5, 0x1BD3, + 0x80C7, 0x1BCD, 0x80C8, 0x1BD0, 0x80C9, 0x1BD9, 0x80CA, 0x1BD7, 0x80CC, + 0x07E0, 0x80CD, 0x1BDD, 0x80CE, 0x07E3, 0x80CF, 0x1BDA, 0x80D0, 0x1BD2, + 0x80D1, 0x1BCF, 0x80D4, 0x227D, 0x80D5, 0x1BD8, 0x80D6, 0x07DB, 0x80D7, + 0x1BDB, 0x80D8, 0x1BCC, 0x80D9, 0x1BD5, 0x80DA, 0x07DD, 0x80DB, 0x07E2, + 0x80DC, 0x1BD6, 0x80DD, 0x07E6, 0x80DE, 0x07E4, 0x80E0, 0x1BCE, 0x80E1, + 0x07E1, 0x80E3, 0x1BD4, 0x80E4, 0x07E5, 0x80E5, 0x07DC, 0x80E6, 0x1BDC, + 0x80ED, 0x098A, 0x80EF, 0x0993, 0x80F0, 0x0988, 0x80F1, 0x0986, 0x80F2, + 0x1DB7, 0x80F3, 0x098E, 0x80F4, 0x098B, 0x80F5, 0x1DB9, 0x80F8, 0x098D, + 0x80F9, 0x1DB8, 0x80FA, 0x1DB6, 0x80FB, 0x1DBB, 0x80FC, 0x0992, 0x80FD, + 0x0990, 0x80FE, 0x227C, 0x8100, 0x1DBC, 0x8101, 0x1DBA, 0x8102, 0x0987, + 0x8105, 0x0989, 0x8106, 0x098C, 0x8108, 0x098F, 0x810A, 0x0991, 0x8115, + 0x200F, 0x8116, 0x0B6B, 0x8118, 0x2006, 0x8119, 0x2008, 0x811B, 0x2009, + 0x811D, 0x2011, 0x811E, 0x200D, 0x811F, 0x200B, 0x8121, 0x200E, 0x8122, + 0x2012, 0x8123, 0x0B6C, 0x8124, 0x0B70, 0x8125, 0x2007, 0x8127, 0x2010, + 0x8129, 0x0B6E, 0x812B, 0x0B6D, 0x812C, 0x200C, 0x812D, 0x200A, 0x812F, + 0x0B6A, 0x8130, 0x0B6F, 0x8139, 0x0D26, 0x813A, 0x2285, 0x813D, 0x2283, + 0x813E, 0x0D28, 0x8143, 0x227E, 0x8144, 0x2527, 0x8146, 0x0D27, 0x8147, + 0x2282, 0x814A, 0x227F, 0x814B, 0x0D23, 0x814C, 0x0D29, 0x814D, 0x2284, + 0x814E, 0x0D25, 0x814F, 0x2281, 0x8150, 0x1075, 0x8151, 0x0D24, 0x8152, + 0x2280, 0x8153, 0x0D2A, 0x8154, 0x0D22, 0x8155, 0x0D21, 0x815B, 0x251F, + 0x815C, 0x251D, 0x815E, 0x2523, 0x8160, 0x251B, 0x8161, 0x2528, 0x8162, + 0x2520, 0x8164, 0x251A, 0x8165, 0x0ED2, 0x8166, 0x0ED8, 0x8167, 0x2525, + 0x8169, 0x251E, 0x816B, 0x0ED5, 0x816E, 0x0ED3, 0x816F, 0x2526, 0x8170, + 0x0ED0, 0x8171, 0x0ECF, 0x8172, 0x2521, 0x8173, 0x0ED4, 0x8174, 0x0D2B, + 0x8176, 0x2524, 0x8177, 0x251C, 0x8178, 0x0ED1, 0x8179, 0x0ED6, 0x817A, + 0x0ED7, 0x817F, 0x107A, 0x8180, 0x1076, 0x8182, 0x107B, 0x8183, 0x27A0, + 0x8186, 0x279F, 0x8187, 0x27A1, 0x8188, 0x1078, 0x8189, 0x279E, 0x818A, + 0x1079, 0x818B, 0x27A4, 0x818C, 0x27A3, 0x818D, 0x27A2, 0x818F, 0x1077, + 0x8195, 0x29D1, 0x8197, 0x29D4, 0x8198, 0x11EF, 0x8199, 0x29D3, 0x819A, + 0x11EE, 0x819B, 0x11EA, 0x819C, 0x11EB, 0x819D, 0x11EC, 0x819E, 0x29D0, + 0x819F, 0x29CF, 0x81A0, 0x11ED, 0x81A2, 0x29D2, 0x81A3, 0x29CE, 0x81A6, + 0x2C30, 0x81A7, 0x2C3A, 0x81A8, 0x1331, 0x81A9, 0x1330, 0x81AB, 0x2C34, + 0x81AC, 0x2C36, 0x81AE, 0x2C31, 0x81B0, 0x2C35, 0x81B1, 0x2C2F, 0x81B2, + 0x2C38, 0x81B3, 0x132F, 0x81B4, 0x2C37, 0x81B5, 0x2C33, 0x81B7, 0x2C39, + 0x81B9, 0x2C32, 0x81BA, 0x1450, 0x81BB, 0x2E06, 0x81BC, 0x2E0C, 0x81BD, + 0x1454, 0x81BE, 0x1456, 0x81BF, 0x1453, 0x81C0, 0x1452, 0x81C2, 0x1451, + 0x81C3, 0x144F, 0x81C4, 0x2E07, 0x81C5, 0x2E0A, 0x81C6, 0x144E, 0x81C7, + 0x2E0B, 0x81C9, 0x1455, 0x81CA, 0x2E09, 0x81CC, 0x2E08, 0x81CD, 0x1518, + 0x81CF, 0x1519, 0x81D0, 0x2F94, 0x81D1, 0x2F92, 0x81D2, 0x2F93, 0x81D5, + 0x30ED, 0x81D7, 0x30EC, 0x81D8, 0x15B3, 0x81D9, 0x321C, 0x81DA, 0x1635, + 0x81DB, 0x321B, 0x81DD, 0x32F5, 0x81DE, 0x33A5, 0x81DF, 0x16D4, 0x81E0, + 0x34DD, 0x81E1, 0x34DE, 0x81E2, 0x1706, 0x81E3, 0x0405, 0x81E5, 0x0676, + 0x81E6, 0x2286, 0x81E7, 0x107C, 0x81E8, 0x1457, 0x81E9, 0x2E0D, 0x81EA, + 0x0406, 0x81EC, 0x0995, 0x81ED, 0x0994, 0x81EE, 0x2287, 0x81F2, 0x2C3B, + 0x81F3, 0x0407, 0x81F4, 0x07E7, 0x81F7, 0x2288, 0x81F8, 0x2289, 0x81F9, + 0x228A, 0x81FA, 0x107D, 0x81FB, 0x1332, 0x81FC, 0x0408, 0x81FE, 0x0677, + 0x81FF, 0x1BDE, 0x8200, 0x0996, 0x8201, 0x1DBD, 0x8202, 0x0B71, 0x8204, + 0x228B, 0x8205, 0x0ED9, 0x8207, 0x107E, 0x8208, 0x1333, 0x8209, 0x1458, + 0x820A, 0x151A, 0x820B, 0x30EE, 0x820C, 0x0409, 0x820D, 0x0678, 0x8210, + 0x0997, 0x8211, 0x2013, 0x8212, 0x0D2C, 0x8214, 0x107F, 0x8215, 0x27A5, + 0x8216, 0x29D5, 0x821B, 0x040A, 0x821C, 0x0D2D, 0x821D, 0x2529, 0x821E, + 0x1080, 0x821F, 0x040B, 0x8220, 0x1A2E, 0x8221, 0x1BDF, 0x8222, 0x07E8, + 0x8225, 0x1DBF, 0x8228, 0x099A, 0x822A, 0x0998, 0x822B, 0x0999, 0x822C, + 0x099B, 0x822F, 0x1DBE, 0x8232, 0x2018, 0x8233, 0x2015, 0x8234, 0x2017, + 0x8235, 0x0B72, 0x8236, 0x0B74, 0x8237, 0x0B73, 0x8238, 0x2014, 0x8239, + 0x0B75, 0x823A, 0x2016, 0x823C, 0x228C, 0x823D, 0x228D, 0x823F, 0x228E, + 0x8240, 0x252C, 0x8242, 0x252D, 0x8244, 0x252B, 0x8245, 0x252E, 0x8247, + 0x0EDA, 0x8249, 0x252A, 0x824B, 0x1081, 0x824E, 0x29DA, 0x824F, 0x29D6, + 0x8250, 0x29D9, 0x8251, 0x29DB, 0x8252, 0x29D8, 0x8253, 0x29D7, 0x8255, + 0x2C3C, 0x8256, 0x2C3D, 0x8257, 0x2C3E, 0x8258, 0x1334, 0x8259, 0x1335, + 0x825A, 0x2E0F, 0x825B, 0x2E0E, 0x825C, 0x2E10, 0x825E, 0x2F96, 0x825F, + 0x2F95, 0x8261, 0x30F0, 0x8263, 0x30F1, 0x8264, 0x30EF, 0x8266, 0x1636, + 0x8268, 0x321D, 0x8269, 0x321E, 0x826B, 0x33A6, 0x826C, 0x342D, 0x826D, + 0x3496, 0x826E, 0x040C, 0x826F, 0x0504, 0x8271, 0x1459, 0x8272, 0x040D, + 0x8274, 0x2019, 0x8275, 0x228F, 0x8277, 0x172E, 0x8278, 0x1813, 0x827C, + 0x1814, 0x827D, 0x1816, 0x827E, 0x040E, 0x827F, 0x1817, 0x8280, 0x1815, + 0x8283, 0x18E5, 0x8284, 0x18E6, 0x8285, 0x18E0, 0x828A, 0x18E4, 0x828B, + 0x0506, 0x828D, 0x0507, 0x828E, 0x18E1, 0x828F, 0x18DF, 0x8290, 0x18DE, + 0x8291, 0x18E2, 0x8292, 0x0505, 0x8293, 0x18E3, 0x8294, 0x1BE0, 0x8298, + 0x1A33, 0x8299, 0x067B, 0x829A, 0x1A32, 0x829B, 0x1A34, 0x829D, 0x067A, + 0x829E, 0x1A39, 0x829F, 0x067E, 0x82A0, 0x1A2F, 0x82A1, 0x1A3D, 0x82A2, + 0x1A43, 0x82A3, 0x0685, 0x82A4, 0x1A40, 0x82A5, 0x0682, 0x82A7, 0x1A36, + 0x82A8, 0x1A3C, 0x82A9, 0x1A3E, 0x82AB, 0x1A31, 0x82AC, 0x0681, 0x82AD, + 0x067C, 0x82AE, 0x1A37, 0x82AF, 0x0683, 0x82B0, 0x0686, 0x82B1, 0x0680, + 0x82B3, 0x0679, 0x82B4, 0x1A3B, 0x82B5, 0x1A35, 0x82B6, 0x1A42, 0x82B7, + 0x0688, 0x82B8, 0x0684, 0x82B9, 0x067F, 0x82BA, 0x1A3A, 0x82BB, 0x099C, + 0x82BC, 0x1A38, 0x82BD, 0x067D, 0x82BE, 0x0687, 0x82C0, 0x1A30, 0x82C2, + 0x1A3F, 0x82C3, 0x1A41, 0x82D1, 0x07F9, 0x82D2, 0x07F3, 0x82D3, 0x07FB, + 0x82D4, 0x07F8, 0x82D5, 0x1BE7, 0x82D6, 0x1BEA, 0x82D7, 0x07F4, 0x82D9, + 0x1BE1, 0x82DB, 0x07ED, 0x82DC, 0x07F7, 0x82DE, 0x07FA, 0x82DF, 0x07FC, + 0x82E0, 0x1BF6, 0x82E1, 0x1BED, 0x82E3, 0x07EC, 0x82E4, 0x1BF5, 0x82E5, + 0x07F0, 0x82E6, 0x07EE, 0x82E7, 0x07E9, 0x82E8, 0x1BE5, 0x82EA, 0x1BF4, + 0x82EB, 0x1BE9, 0x82EC, 0x1BEC, 0x82ED, 0x1BF9, 0x82EF, 0x07FD, 0x82F0, + 0x1BF3, 0x82F1, 0x07F5, 0x82F2, 0x1BEE, 0x82F3, 0x1BF8, 0x82F4, 0x1BEB, + 0x82F5, 0x1BEF, 0x82F6, 0x1BF2, 0x82F9, 0x1BE3, 0x82FA, 0x1BF7, 0x82FB, + 0x1BF1, 0x82FE, 0x1BE2, 0x8300, 0x1BE6, 0x8301, 0x07F6, 0x8302, 0x07F1, + 0x8303, 0x07EA, 0x8304, 0x07EF, 0x8305, 0x07EB, 0x8306, 0x07FE, 0x8307, + 0x1BE4, 0x8308, 0x1DD0, 0x8309, 0x07F2, 0x830C, 0x1BF0, 0x830D, 0x1A7D, + 0x8316, 0x1DD3, 0x8317, 0x09AA, 0x8319, 0x1DC3, 0x831B, 0x1DCE, 0x831C, + 0x1DCA, 0x831E, 0x1DDD, 0x8320, 0x1DD5, 0x8322, 0x1DCB, 0x8324, 0x1DD4, + 0x8325, 0x1DC5, 0x8326, 0x1DC9, 0x8327, 0x1DE0, 0x8328, 0x09AD, 0x8329, + 0x1DD8, 0x832A, 0x1DCF, 0x832B, 0x099D, 0x832C, 0x1DDE, 0x832D, 0x1DC1, + 0x832F, 0x1DD7, 0x8331, 0x09AC, 0x8332, 0x09A7, 0x8333, 0x1DC0, 0x8334, + 0x09A5, 0x8335, 0x09A4, 0x8336, 0x09A9, 0x8337, 0x1DD6, 0x8338, 0x09A1, + 0x8339, 0x09A8, 0x833A, 0x1BE8, 0x833B, 0x2290, 0x833C, 0x1DD1, 0x833F, + 0x1DC7, 0x8340, 0x09AB, 0x8341, 0x1DC8, 0x8342, 0x1DCC, 0x8343, 0x09AE, + 0x8344, 0x1DC2, 0x8345, 0x1DDA, 0x8347, 0x1DD9, 0x8348, 0x1DE1, 0x8349, + 0x09A3, 0x834A, 0x09A0, 0x834B, 0x1DDF, 0x834C, 0x1DDB, 0x834D, 0x1DD2, + 0x834E, 0x1DCD, 0x834F, 0x09A6, 0x8350, 0x09A2, 0x8351, 0x1DC4, 0x8352, + 0x099E, 0x8353, 0x1DDC, 0x8354, 0x099F, 0x8356, 0x1DC6, 0x8373, 0x201F, + 0x8374, 0x2021, 0x8375, 0x2026, 0x8376, 0x203A, 0x8377, 0x0B83, 0x8378, + 0x0B79, 0x837A, 0x201E, 0x837B, 0x0B84, 0x837C, 0x0B85, 0x837D, 0x2029, + 0x837E, 0x2030, 0x837F, 0x2036, 0x8381, 0x2023, 0x8383, 0x202A, 0x8386, + 0x0B86, 0x8387, 0x2038, 0x8388, 0x2033, 0x8389, 0x0B81, 0x838A, 0x0B7F, + 0x838B, 0x202F, 0x838C, 0x202B, 0x838D, 0x201D, 0x838E, 0x0B76, 0x838F, + 0x2022, 0x8390, 0x201A, 0x8392, 0x0B7E, 0x8393, 0x0B80, 0x8394, 0x2027, + 0x8395, 0x2024, 0x8396, 0x0B7B, 0x8397, 0x2034, 0x8398, 0x0B78, 0x8399, + 0x2025, 0x839A, 0x22B9, 0x839B, 0x202D, 0x839D, 0x202C, 0x839E, 0x0B77, + 0x83A0, 0x0B82, 0x83A2, 0x0B7A, 0x83A3, 0x201B, 0x83A4, 0x2020, 0x83A5, + 0x2031, 0x83A6, 0x2037, 0x83A7, 0x0B87, 0x83A8, 0x201C, 0x83A9, 0x2028, + 0x83AA, 0x202E, 0x83AB, 0x0B7D, 0x83AE, 0x2039, 0x83AF, 0x2032, 0x83B0, + 0x2035, 0x83BD, 0x0B7C, 0x83BF, 0x22A0, 0x83C0, 0x2294, 0x83C1, 0x0D35, + 0x83C2, 0x22B1, 0x83C3, 0x22BA, 0x83C4, 0x22BD, 0x83C5, 0x0D33, 0x83C6, + 0x229C, 0x83C7, 0x22B5, 0x83C8, 0x229D, 0x83C9, 0x22AB, 0x83CA, 0x0D40, + 0x83CB, 0x22A7, 0x83CC, 0x0D3D, 0x83CE, 0x22A8, 0x83CF, 0x2291, 0x83D1, + 0x22B6, 0x83D4, 0x0D46, 0x83D5, 0x22B3, 0x83D6, 0x22A9, 0x83D7, 0x22BF, + 0x83D8, 0x22A4, 0x83D9, 0x254E, 0x83DB, 0x22C2, 0x83DC, 0x0D44, 0x83DD, + 0x22A2, 0x83DE, 0x22AE, 0x83DF, 0x0D47, 0x83E0, 0x0D32, 0x83E1, 0x22A6, + 0x83E2, 0x22C0, 0x83E3, 0x229F, 0x83E4, 0x2298, 0x83E5, 0x22A3, 0x83E7, + 0x2297, 0x83E8, 0x2295, 0x83E9, 0x0D2E, 0x83EA, 0x22B7, 0x83EB, 0x229E, + 0x83EC, 0x22BB, 0x83EE, 0x22BC, 0x83EF, 0x0D36, 0x83F0, 0x0D3B, 0x83F1, + 0x0D37, 0x83F2, 0x0D3F, 0x83F3, 0x22B2, 0x83F4, 0x0D38, 0x83F5, 0x22AA, + 0x83F6, 0x229A, 0x83F8, 0x0D30, 0x83F9, 0x2292, 0x83FA, 0x22B4, 0x83FB, + 0x22BE, 0x83FC, 0x2299, 0x83FD, 0x0D3E, 0x83FE, 0x22C3, 0x83FF, 0x22A5, + 0x8401, 0x22A1, 0x8403, 0x0D2F, 0x8404, 0x0D43, 0x8406, 0x22B0, 0x8407, + 0x0D45, 0x8409, 0x22AC, 0x840A, 0x0D3A, 0x840B, 0x0D34, 0x840C, 0x0D3C, + 0x840D, 0x0D31, 0x840E, 0x0D42, 0x840F, 0x22AD, 0x8410, 0x229B, 0x8411, + 0x22AF, 0x8412, 0x2296, 0x8413, 0x22B8, 0x841B, 0x22C1, 0x8423, 0x2293, + 0x8429, 0x254D, 0x842B, 0x2563, 0x842C, 0x0EAC, 0x842D, 0x2552, 0x842F, + 0x2550, 0x8430, 0x253B, 0x8431, 0x0EDE, 0x8432, 0x254B, 0x8433, 0x255F, + 0x8434, 0x2547, 0x8435, 0x0EE6, 0x8436, 0x255E, 0x8437, 0x2545, 0x8438, + 0x0D41, 0x8439, 0x2555, 0x843A, 0x2546, 0x843B, 0x255C, 0x843C, 0x0EE5, + 0x843D, 0x0EDD, 0x843F, 0x2530, 0x8440, 0x2538, 0x8442, 0x2551, 0x8443, + 0x2549, 0x8444, 0x2562, 0x8445, 0x254C, 0x8446, 0x0EEB, 0x8447, 0x255D, + 0x8449, 0x0EE2, 0x844B, 0x254F, 0x844C, 0x2557, 0x844D, 0x253C, 0x844E, + 0x2556, 0x8450, 0x2567, 0x8451, 0x2537, 0x8452, 0x2558, 0x8454, 0x2565, + 0x8456, 0x2531, 0x8457, 0x0D39, 0x8459, 0x253F, 0x845A, 0x253E, 0x845B, + 0x0EE4, 0x845D, 0x2542, 0x845E, 0x2544, 0x845F, 0x2553, 0x8460, 0x2564, + 0x8461, 0x0EE7, 0x8463, 0x0EE8, 0x8465, 0x2536, 0x8466, 0x0EE0, 0x8467, + 0x253A, 0x8468, 0x2560, 0x8469, 0x0EE9, 0x846B, 0x0EE1, 0x846C, 0x0EE3, + 0x846D, 0x0EEA, 0x846E, 0x2566, 0x846F, 0x2559, 0x8470, 0x2554, 0x8473, + 0x2541, 0x8474, 0x2540, 0x8475, 0x0EDF, 0x8476, 0x2532, 0x8477, 0x0EDC, + 0x8478, 0x254A, 0x8479, 0x2533, 0x847A, 0x2548, 0x847D, 0x253D, 0x847E, + 0x2561, 0x8482, 0x0EDB, 0x8486, 0x2539, 0x848D, 0x2535, 0x848E, 0x255B, + 0x848F, 0x2534, 0x8490, 0x108E, 0x8491, 0x27CD, 0x8494, 0x27BC, 0x8497, + 0x27A6, 0x8498, 0x27C4, 0x8499, 0x1086, 0x849A, 0x27B5, 0x849B, 0x27BF, + 0x849C, 0x1089, 0x849D, 0x27B8, 0x849E, 0x1087, 0x849F, 0x27A9, 0x84A0, + 0x27C7, 0x84A1, 0x27A8, 0x84A2, 0x27BB, 0x84A4, 0x27A7, 0x84A7, 0x27B9, + 0x84A8, 0x27C2, 0x84A9, 0x27C0, 0x84AA, 0x27B4, 0x84AB, 0x27AF, 0x84AC, + 0x27AD, 0x84AE, 0x27AE, 0x84AF, 0x27C1, 0x84B0, 0x27CC, 0x84B1, 0x27B6, + 0x84B2, 0x1088, 0x84B4, 0x27B1, 0x84B6, 0x27C5, 0x84B8, 0x108B, 0x84B9, + 0x27B0, 0x84BA, 0x27AA, 0x84BB, 0x27BA, 0x84BC, 0x108F, 0x84BF, 0x1083, + 0x84C0, 0x108C, 0x84C1, 0x27B2, 0x84C2, 0x27AC, 0x84C4, 0x1085, 0x84C5, + 0x255A, 0x84C6, 0x1084, 0x84C7, 0x27BD, 0x84C9, 0x1082, 0x84CA, 0x1091, + 0x84CB, 0x108A, 0x84CC, 0x27BE, 0x84CD, 0x27B3, 0x84CE, 0x27AB, 0x84CF, + 0x27C6, 0x84D0, 0x27B7, 0x84D1, 0x1090, 0x84D2, 0x27CA, 0x84D3, 0x108D, + 0x84D4, 0x27C9, 0x84D6, 0x27C3, 0x84D7, 0x27C8, 0x84DB, 0x27CB, 0x84E7, + 0x2A03, 0x84E8, 0x2A04, 0x84E9, 0x29F7, 0x84EA, 0x29F6, 0x84EB, 0x29F2, + 0x84EC, 0x11FB, 0x84EE, 0x11F3, 0x84EF, 0x2A06, 0x84F0, 0x2A05, 0x84F1, + 0x252F, 0x84F2, 0x29EF, 0x84F3, 0x29F3, 0x84F4, 0x29ED, 0x84F6, 0x2A00, + 0x84F7, 0x29F1, 0x84F9, 0x2A07, 0x84FA, 0x29EA, 0x84FB, 0x29E8, 0x84FC, + 0x29F4, 0x84FD, 0x29FE, 0x84FE, 0x29F9, 0x84FF, 0x11FD, 0x8500, 0x29DF, + 0x8502, 0x29FD, 0x8506, 0x11FE, 0x8507, 0x2543, 0x8508, 0x29EB, 0x8509, + 0x29E2, 0x850A, 0x29E5, 0x850B, 0x2A0B, 0x850C, 0x29EC, 0x850D, 0x29E3, + 0x850E, 0x29E1, 0x850F, 0x29DE, 0x8511, 0x11F7, 0x8512, 0x29F5, 0x8513, + 0x11F6, 0x8514, 0x11FA, 0x8515, 0x29F0, 0x8516, 0x29F8, 0x8517, 0x11F0, + 0x8518, 0x2A08, 0x8519, 0x2A0C, 0x851A, 0x11F2, 0x851C, 0x29E7, 0x851D, + 0x29FB, 0x851E, 0x29FF, 0x851F, 0x29E4, 0x8520, 0x2A09, 0x8521, 0x11F9, + 0x8523, 0x11F8, 0x8524, 0x29DC, 0x8525, 0x11FC, 0x8526, 0x2A02, 0x8527, + 0x29E6, 0x8528, 0x29FA, 0x8529, 0x29E0, 0x852A, 0x29EE, 0x852B, 0x29E9, + 0x852C, 0x11F4, 0x852D, 0x11F5, 0x852E, 0x29FC, 0x852F, 0x2A0D, 0x8530, + 0x2A0A, 0x8531, 0x2A01, 0x853B, 0x29DD, 0x853D, 0x11F1, 0x853E, 0x2C4F, + 0x8540, 0x2C46, 0x8541, 0x2C49, 0x8543, 0x133B, 0x8544, 0x2C4B, 0x8545, + 0x2C40, 0x8546, 0x2C47, 0x8547, 0x2C4D, 0x8548, 0x1338, 0x8549, 0x133C, + 0x854A, 0x1336, 0x854D, 0x2C42, 0x854E, 0x2C52, 0x8551, 0x2C4C, 0x8553, + 0x2C43, 0x8554, 0x2C5B, 0x8555, 0x2C55, 0x8556, 0x2C3F, 0x8557, 0x2E23, + 0x8558, 0x2C45, 0x8559, 0x1337, 0x855B, 0x2C50, 0x855D, 0x2C5A, 0x855E, + 0x133F, 0x8560, 0x2C57, 0x8561, 0x2C44, 0x8562, 0x2C4A, 0x8563, 0x2C4E, + 0x8564, 0x2C48, 0x8565, 0x2C5C, 0x8566, 0x2C59, 0x8567, 0x2C56, 0x8568, + 0x1339, 0x8569, 0x133A, 0x856A, 0x133E, 0x856B, 0x2C41, 0x856C, 0x2C5D, + 0x856D, 0x133D, 0x856E, 0x2C53, 0x8571, 0x2C51, 0x8575, 0x2C54, 0x8576, + 0x2E30, 0x8577, 0x2E1D, 0x8578, 0x2E22, 0x8579, 0x2E2F, 0x857A, 0x2E21, + 0x857B, 0x2E19, 0x857C, 0x2E1E, 0x857E, 0x145C, 0x8580, 0x2E12, 0x8581, + 0x2E2A, 0x8582, 0x2E2C, 0x8583, 0x2E11, 0x8584, 0x145B, 0x8585, 0x2E2E, + 0x8586, 0x2E26, 0x8587, 0x1462, 0x8588, 0x2E2D, 0x8589, 0x2E1F, 0x858A, + 0x1464, 0x858B, 0x2E17, 0x858C, 0x2C58, 0x858D, 0x2E27, 0x858E, 0x2E24, + 0x858F, 0x2E13, 0x8590, 0x2E32, 0x8591, 0x145E, 0x8594, 0x145F, 0x8595, + 0x2E15, 0x8596, 0x2E25, 0x8598, 0x2E31, 0x8599, 0x2E28, 0x859A, 0x2E1B, + 0x859B, 0x1461, 0x859C, 0x145D, 0x859D, 0x2E29, 0x859E, 0x2E1C, 0x859F, + 0x2E33, 0x85A0, 0x2E16, 0x85A1, 0x2E20, 0x85A2, 0x2E2B, 0x85A3, 0x2E18, + 0x85A4, 0x2E1A, 0x85A6, 0x1465, 0x85A7, 0x2E14, 0x85A8, 0x1463, 0x85A9, + 0x151C, 0x85AA, 0x145A, 0x85AF, 0x1460, 0x85B0, 0x1520, 0x85B1, 0x2FA6, + 0x85B3, 0x2F9C, 0x85B4, 0x2F97, 0x85B5, 0x2F9D, 0x85B6, 0x2FA7, 0x85B7, + 0x2FAB, 0x85B8, 0x2FAA, 0x85B9, 0x1522, 0x85BA, 0x1521, 0x85BD, 0x2F9E, + 0x85BE, 0x2FAC, 0x85BF, 0x2FA1, 0x85C0, 0x2F99, 0x85C2, 0x2F9B, 0x85C3, + 0x2F9A, 0x85C4, 0x2FA0, 0x85C5, 0x2FA5, 0x85C6, 0x2F98, 0x85C7, 0x2F9F, + 0x85C8, 0x2FA4, 0x85C9, 0x151F, 0x85CB, 0x2FA2, 0x85CD, 0x151D, 0x85CE, + 0x2FA3, 0x85CF, 0x151B, 0x85D0, 0x151E, 0x85D1, 0x3101, 0x85D2, 0x2FA8, + 0x85D5, 0x15B7, 0x85D7, 0x30F9, 0x85D8, 0x30FD, 0x85D9, 0x30F5, 0x85DA, + 0x30F8, 0x85DC, 0x3100, 0x85DD, 0x15B5, 0x85DE, 0x3105, 0x85DF, 0x30FE, + 0x85E1, 0x30F6, 0x85E2, 0x3106, 0x85E3, 0x30FF, 0x85E4, 0x15B8, 0x85E5, + 0x15B9, 0x85E6, 0x3103, 0x85E8, 0x30F7, 0x85E9, 0x15B4, 0x85EA, 0x15B6, + 0x85EB, 0x30F2, 0x85EC, 0x30FA, 0x85ED, 0x30F4, 0x85EF, 0x3104, 0x85F0, + 0x3102, 0x85F1, 0x30F3, 0x85F2, 0x30FB, 0x85F6, 0x3225, 0x85F7, 0x15BA, + 0x85F8, 0x30FC, 0x85F9, 0x1638, 0x85FA, 0x163A, 0x85FB, 0x1637, 0x85FD, + 0x322A, 0x85FE, 0x3222, 0x85FF, 0x3220, 0x8600, 0x3224, 0x8601, 0x3221, + 0x8604, 0x3226, 0x8605, 0x3228, 0x8606, 0x163B, 0x8607, 0x163D, 0x8609, + 0x3227, 0x860A, 0x163E, 0x860B, 0x163C, 0x860C, 0x3229, 0x8611, 0x1639, + 0x8617, 0x1685, 0x8618, 0x32F6, 0x8619, 0x32FC, 0x861A, 0x1687, 0x861B, + 0x3223, 0x861C, 0x32FB, 0x861E, 0x3302, 0x861F, 0x32F9, 0x8620, 0x3300, + 0x8621, 0x32FF, 0x8622, 0x321F, 0x8623, 0x32FA, 0x8624, 0x2FA9, 0x8625, + 0x3303, 0x8626, 0x32F8, 0x8627, 0x32FD, 0x8629, 0x3301, 0x862A, 0x32F7, + 0x862C, 0x33AA, 0x862D, 0x1686, 0x862E, 0x32FE, 0x8631, 0x3432, 0x8632, + 0x33AB, 0x8633, 0x33A9, 0x8634, 0x33A7, 0x8635, 0x33A8, 0x8636, 0x33AC, + 0x8638, 0x1707, 0x8639, 0x3430, 0x863A, 0x342E, 0x863B, 0x3433, 0x863C, + 0x3431, 0x863E, 0x3434, 0x863F, 0x1708, 0x8640, 0x342F, 0x8643, 0x3497, + 0x8646, 0x34DF, 0x8647, 0x34E0, 0x8648, 0x34E1, 0x864B, 0x353E, 0x864C, + 0x3536, 0x864D, 0x1818, 0x864E, 0x0689, 0x8650, 0x07FF, 0x8652, 0x1DE3, + 0x8653, 0x1DE2, 0x8654, 0x09AF, 0x8655, 0x0B88, 0x8656, 0x203C, 0x8659, + 0x203B, 0x865B, 0x0D48, 0x865C, 0x0EED, 0x865E, 0x0EEC, 0x865F, 0x0EEE, + 0x8661, 0x27CE, 0x8662, 0x2A0E, 0x8663, 0x2C5E, 0x8664, 0x2C60, 0x8665, + 0x2C5F, 0x8667, 0x1466, 0x8668, 0x2E34, 0x8669, 0x2FAD, 0x866A, 0x351E, + 0x866B, 0x040F, 0x866D, 0x1A46, 0x866E, 0x1A47, 0x866F, 0x1A45, 0x8670, + 0x1A44, 0x8671, 0x068A, 0x8673, 0x1BFD, 0x8674, 0x1BFB, 0x8677, 0x1BFA, + 0x8679, 0x0800, 0x867A, 0x0802, 0x867B, 0x0801, 0x867C, 0x1BFC, 0x8685, + 0x1DEF, 0x8686, 0x1DEC, 0x8687, 0x1DEA, 0x868A, 0x09B0, 0x868B, 0x1DED, + 0x868C, 0x09B5, 0x868D, 0x1DE7, 0x868E, 0x1DF6, 0x8690, 0x1DF8, 0x8691, + 0x1DE8, 0x8693, 0x09B2, 0x8694, 0x1DF9, 0x8695, 0x1DF4, 0x8696, 0x1DE6, + 0x8697, 0x1DEB, 0x8698, 0x1DF5, 0x8699, 0x1DF1, 0x869A, 0x1DEE, 0x869C, + 0x09B7, 0x869D, 0x1DF7, 0x869E, 0x1DE9, 0x86A1, 0x1DF2, 0x86A2, 0x1DE4, + 0x86A3, 0x09B6, 0x86A4, 0x09B3, 0x86A5, 0x1DF0, 0x86A7, 0x1DF3, 0x86A8, + 0x1DE5, 0x86A9, 0x09B4, 0x86AA, 0x09B1, 0x86AF, 0x0B92, 0x86B0, 0x2043, + 0x86B1, 0x0B91, 0x86B3, 0x2046, 0x86B4, 0x2049, 0x86B5, 0x0B8E, 0x86B6, + 0x0B8C, 0x86B7, 0x203E, 0x86B8, 0x2047, 0x86B9, 0x2045, 0x86BA, 0x2042, + 0x86BB, 0x204A, 0x86BC, 0x204B, 0x86BD, 0x204D, 0x86BE, 0x204E, 0x86BF, + 0x203D, 0x86C0, 0x0B8B, 0x86C1, 0x2040, 0x86C2, 0x203F, 0x86C3, 0x204C, + 0x86C4, 0x0B8D, 0x86C5, 0x2041, 0x86C6, 0x0B8F, 0x86C7, 0x0B8A, 0x86C8, + 0x2044, 0x86C9, 0x0B93, 0x86CB, 0x0B90, 0x86CC, 0x2048, 0x86D0, 0x0D4F, + 0x86D1, 0x22D2, 0x86D3, 0x22C7, 0x86D4, 0x0D4C, 0x86D6, 0x256D, 0x86D7, + 0x22D0, 0x86D8, 0x22C4, 0x86D9, 0x0D4A, 0x86DA, 0x22C9, 0x86DB, 0x0D4D, + 0x86DC, 0x22CD, 0x86DD, 0x22CB, 0x86DE, 0x0D50, 0x86DF, 0x0D49, 0x86E2, + 0x22C5, 0x86E3, 0x22C8, 0x86E4, 0x0D4E, 0x86E6, 0x22C6, 0x86E8, 0x22D1, + 0x86E9, 0x22CF, 0x86EA, 0x22CA, 0x86EB, 0x22CC, 0x86EC, 0x22CE, 0x86ED, + 0x0D4B, 0x86F5, 0x256E, 0x86F6, 0x2574, 0x86F7, 0x256A, 0x86F8, 0x2570, + 0x86F9, 0x0EEF, 0x86FA, 0x256C, 0x86FB, 0x0EF5, 0x86FE, 0x0EF4, 0x8700, + 0x0EF3, 0x8701, 0x2573, 0x8702, 0x0EF6, 0x8703, 0x0EF7, 0x8704, 0x2569, + 0x8705, 0x2576, 0x8706, 0x0EF8, 0x8707, 0x0EF2, 0x8708, 0x0EF1, 0x8709, + 0x2572, 0x870A, 0x0EF9, 0x870B, 0x2568, 0x870C, 0x256B, 0x870D, 0x2575, + 0x870E, 0x2571, 0x8711, 0x27EE, 0x8712, 0x27E3, 0x8713, 0x0EF0, 0x8718, + 0x1098, 0x8719, 0x27D7, 0x871A, 0x27EC, 0x871B, 0x27D8, 0x871C, 0x1093, + 0x871E, 0x27D5, 0x8720, 0x27DE, 0x8721, 0x27D6, 0x8722, 0x1095, 0x8723, + 0x27D0, 0x8724, 0x27EB, 0x8725, 0x1096, 0x8726, 0x27E8, 0x8727, 0x27E9, + 0x8728, 0x27D1, 0x8729, 0x109B, 0x872A, 0x27E0, 0x872C, 0x27DA, 0x872D, + 0x27E1, 0x872E, 0x27D4, 0x8730, 0x27ED, 0x8731, 0x27E5, 0x8732, 0x27DF, + 0x8733, 0x27CF, 0x8734, 0x1097, 0x8735, 0x27E6, 0x8737, 0x109A, 0x8738, + 0x27EA, 0x873A, 0x27E4, 0x873B, 0x1094, 0x873C, 0x27E2, 0x873E, 0x27DC, + 0x873F, 0x1092, 0x8740, 0x27D3, 0x8741, 0x27DB, 0x8742, 0x27E7, 0x8743, + 0x27D9, 0x8746, 0x27DD, 0x874C, 0x1208, 0x874D, 0x256F, 0x874E, 0x2A20, + 0x874F, 0x2A29, 0x8750, 0x2A1F, 0x8751, 0x2A1B, 0x8752, 0x2A18, 0x8753, + 0x1209, 0x8754, 0x2A16, 0x8755, 0x1099, 0x8756, 0x2A0F, 0x8757, 0x1207, + 0x8758, 0x2A15, 0x8759, 0x1206, 0x875A, 0x2A1A, 0x875B, 0x2A17, 0x875C, + 0x2A27, 0x875D, 0x2A22, 0x875E, 0x2A1C, 0x875F, 0x2A21, 0x8760, 0x1202, + 0x8761, 0x2A19, 0x8762, 0x2A2C, 0x8763, 0x2A10, 0x8764, 0x2A11, 0x8765, + 0x2A28, 0x8766, 0x1203, 0x8767, 0x2A2D, 0x8768, 0x1205, 0x8769, 0x2A2E, + 0x876A, 0x2A1E, 0x876B, 0x27D2, 0x876C, 0x2A24, 0x876D, 0x2A1D, 0x876E, + 0x2A26, 0x876F, 0x2A23, 0x8773, 0x2A14, 0x8774, 0x1200, 0x8775, 0x2A2B, + 0x8776, 0x1201, 0x8777, 0x2A12, 0x8778, 0x1204, 0x8779, 0x2C6B, 0x877A, + 0x2A25, 0x877B, 0x2A2A, 0x8781, 0x2C68, 0x8782, 0x11FF, 0x8783, 0x1340, + 0x8784, 0x2C72, 0x8785, 0x2C6E, 0x8787, 0x2C6C, 0x8788, 0x2C67, 0x8789, + 0x2C76, 0x878D, 0x1344, 0x878F, 0x2C63, 0x8790, 0x2C6F, 0x8791, 0x2C70, + 0x8792, 0x2C66, 0x8793, 0x2C65, 0x8794, 0x2C73, 0x8796, 0x2C69, 0x8797, + 0x2C64, 0x8798, 0x2C6A, 0x879A, 0x2C75, 0x879B, 0x2C62, 0x879C, 0x2C74, + 0x879D, 0x2C71, 0x879E, 0x1342, 0x879F, 0x1341, 0x87A2, 0x1343, 0x87A3, + 0x2C6D, 0x87A4, 0x2C61, 0x87AA, 0x2E36, 0x87AB, 0x146C, 0x87AC, 0x2E3A, + 0x87AD, 0x2E37, 0x87AE, 0x2E3E, 0x87AF, 0x2E44, 0x87B0, 0x2E39, 0x87B2, + 0x2E4D, 0x87B3, 0x1469, 0x87B4, 0x2E47, 0x87B5, 0x2E3C, 0x87B6, 0x2E48, + 0x87B7, 0x2E43, 0x87B8, 0x2E4A, 0x87B9, 0x2E3B, 0x87BA, 0x146E, 0x87BB, + 0x146D, 0x87BC, 0x2E3D, 0x87BD, 0x2E4B, 0x87BE, 0x2E35, 0x87BF, 0x2E49, + 0x87C0, 0x1467, 0x87C2, 0x2E41, 0x87C3, 0x2E40, 0x87C4, 0x2E45, 0x87C5, + 0x2E38, 0x87C6, 0x146B, 0x87C8, 0x146F, 0x87C9, 0x2E3F, 0x87CA, 0x2E46, + 0x87CB, 0x1470, 0x87CC, 0x2E42, 0x87D1, 0x1468, 0x87D2, 0x146A, 0x87D3, + 0x2FBA, 0x87D4, 0x2FB8, 0x87D7, 0x2FBE, 0x87D8, 0x2FBC, 0x87D9, 0x2FBF, + 0x87DB, 0x2FB1, 0x87DC, 0x2FB9, 0x87DD, 0x2FC3, 0x87DE, 0x2E4C, 0x87DF, + 0x2FB5, 0x87E0, 0x1526, 0x87E1, 0x2A13, 0x87E2, 0x2FB0, 0x87E3, 0x2FBD, + 0x87E4, 0x2FB7, 0x87E5, 0x2FB4, 0x87E6, 0x2FAF, 0x87E7, 0x2FAE, 0x87E8, + 0x2FC2, 0x87EA, 0x2FB3, 0x87EB, 0x2FB2, 0x87EC, 0x1524, 0x87ED, 0x2FBB, + 0x87EF, 0x1523, 0x87F2, 0x1525, 0x87F3, 0x2FB6, 0x87F4, 0x2FC1, 0x87F6, + 0x310A, 0x87F7, 0x310B, 0x87F9, 0x15BE, 0x87FA, 0x3108, 0x87FB, 0x15BB, + 0x87FC, 0x3110, 0x87FE, 0x15BF, 0x87FF, 0x3112, 0x8800, 0x3107, 0x8801, + 0x2FC0, 0x8802, 0x3114, 0x8803, 0x3109, 0x8805, 0x15BC, 0x8806, 0x310F, + 0x8808, 0x3111, 0x8809, 0x310C, 0x880A, 0x3113, 0x880B, 0x310E, 0x880C, + 0x310D, 0x880D, 0x15BD, 0x8810, 0x322C, 0x8811, 0x322D, 0x8813, 0x322F, + 0x8814, 0x163F, 0x8815, 0x1640, 0x8816, 0x3230, 0x8817, 0x322E, 0x8819, + 0x322B, 0x881B, 0x3306, 0x881C, 0x3309, 0x881D, 0x3305, 0x881F, 0x168B, + 0x8820, 0x3307, 0x8821, 0x168A, 0x8822, 0x1689, 0x8823, 0x1688, 0x8824, + 0x3308, 0x8825, 0x33B1, 0x8826, 0x33AF, 0x8828, 0x33AE, 0x8829, 0x3304, + 0x882A, 0x33B0, 0x882B, 0x330A, 0x882C, 0x33AD, 0x882E, 0x3437, 0x882F, + 0x3415, 0x8830, 0x3435, 0x8831, 0x1709, 0x8832, 0x3436, 0x8833, 0x3438, + 0x8835, 0x349A, 0x8836, 0x1728, 0x8837, 0x3499, 0x8838, 0x3498, 0x8839, + 0x1729, 0x883B, 0x1747, 0x883C, 0x3508, 0x883D, 0x3520, 0x883E, 0x351F, + 0x883F, 0x3521, 0x8840, 0x0410, 0x8841, 0x1BFE, 0x8843, 0x1DFA, 0x8844, + 0x1DFB, 0x8848, 0x22D3, 0x884A, 0x330B, 0x884B, 0x349B, 0x884C, 0x0411, + 0x884D, 0x0803, 0x884E, 0x1BFF, 0x8852, 0x204F, 0x8853, 0x0B94, 0x8855, + 0x22D5, 0x8856, 0x22D4, 0x8857, 0x0D51, 0x8859, 0x0EFA, 0x885A, 0x2A2F, + 0x885B, 0x120A, 0x885D, 0x120B, 0x8861, 0x1345, 0x8862, 0x172A, 0x8863, + 0x0412, 0x8867, 0x1C00, 0x8868, 0x068C, 0x8869, 0x1C02, 0x886A, 0x1C01, + 0x886B, 0x0804, 0x886D, 0x1DFC, 0x886F, 0x1E03, 0x8870, 0x09B8, 0x8871, + 0x1E01, 0x8872, 0x1DFF, 0x8874, 0x1E06, 0x8875, 0x1DFD, 0x8876, 0x1DFE, + 0x8877, 0x09B9, 0x8879, 0x09BD, 0x887C, 0x1E07, 0x887D, 0x09BC, 0x887E, + 0x1E05, 0x887F, 0x1E02, 0x8880, 0x1E00, 0x8881, 0x09BA, 0x8882, 0x09BB, + 0x8883, 0x1E04, 0x8888, 0x0B96, 0x8889, 0x2050, 0x888B, 0x0B9B, 0x888C, + 0x2060, 0x888D, 0x0B9A, 0x888E, 0x2062, 0x8891, 0x2056, 0x8892, 0x0B98, + 0x8893, 0x2061, 0x8895, 0x2051, 0x8896, 0x0B99, 0x8897, 0x205D, 0x8898, + 0x2059, 0x8899, 0x205B, 0x889A, 0x2055, 0x889B, 0x205C, 0x889E, 0x0B95, + 0x889F, 0x2058, 0x88A1, 0x2057, 0x88A2, 0x2053, 0x88A4, 0x205E, 0x88A7, + 0x205A, 0x88A8, 0x2052, 0x88AA, 0x2054, 0x88AB, 0x0B97, 0x88AC, 0x205F, + 0x88B1, 0x0D54, 0x88B2, 0x22E0, 0x88B6, 0x22DC, 0x88B7, 0x22DE, 0x88B8, + 0x22D9, 0x88B9, 0x22D8, 0x88BA, 0x22D6, 0x88BC, 0x22DD, 0x88BD, 0x22DF, + 0x88BE, 0x22DB, 0x88C0, 0x22DA, 0x88C1, 0x0D52, 0x88C2, 0x0D53, 0x88C9, + 0x22E2, 0x88CA, 0x0F02, 0x88CB, 0x2578, 0x88CC, 0x257E, 0x88CD, 0x2579, + 0x88CE, 0x257A, 0x88CF, 0x36EA, 0x88D0, 0x257F, 0x88D2, 0x0F04, 0x88D4, + 0x0EFC, 0x88D5, 0x0F03, 0x88D6, 0x2577, 0x88D7, 0x22D7, 0x88D8, 0x0EFF, + 0x88D9, 0x0EFD, 0x88DA, 0x257D, 0x88DB, 0x257C, 0x88DC, 0x0EFE, 0x88DD, + 0x0F00, 0x88DE, 0x257B, 0x88DF, 0x0EFB, 0x88E1, 0x0F01, 0x88E7, 0x27F0, + 0x88E8, 0x10A2, 0x88EB, 0x27FB, 0x88EC, 0x27FA, 0x88EE, 0x27F5, 0x88EF, + 0x10A4, 0x88F0, 0x27F9, 0x88F1, 0x27F1, 0x88F2, 0x27F2, 0x88F3, 0x109C, + 0x88F4, 0x109E, 0x88F6, 0x27F7, 0x88F7, 0x27EF, 0x88F8, 0x10A0, 0x88F9, + 0x109F, 0x88FA, 0x27F3, 0x88FB, 0x27F8, 0x88FC, 0x27F6, 0x88FD, 0x10A1, + 0x88FE, 0x27F4, 0x8901, 0x22E1, 0x8902, 0x109D, 0x8905, 0x2A30, 0x8906, + 0x2A37, 0x8907, 0x120D, 0x8909, 0x2A3B, 0x890A, 0x1211, 0x890B, 0x2A33, + 0x890C, 0x2A31, 0x890E, 0x2A3A, 0x8910, 0x120C, 0x8911, 0x2A39, 0x8912, + 0x120E, 0x8913, 0x120F, 0x8914, 0x2A32, 0x8915, 0x1210, 0x8916, 0x2A38, + 0x8917, 0x2A34, 0x8918, 0x2A35, 0x8919, 0x2A36, 0x891A, 0x10A3, 0x891E, + 0x2C77, 0x891F, 0x2C83, 0x8921, 0x134A, 0x8922, 0x2C7E, 0x8923, 0x2C80, + 0x8925, 0x1348, 0x8926, 0x2C78, 0x8927, 0x2C7C, 0x8929, 0x2C7F, 0x892A, + 0x1346, 0x892B, 0x1349, 0x892C, 0x2C82, 0x892D, 0x2C7A, 0x892E, 0x2C7B, + 0x892F, 0x2C81, 0x8930, 0x2C79, 0x8931, 0x2C7D, 0x8932, 0x1347, 0x8933, + 0x2E4F, 0x8935, 0x2E4E, 0x8936, 0x1472, 0x8937, 0x2E54, 0x8938, 0x1474, + 0x893B, 0x1471, 0x893C, 0x2E50, 0x893D, 0x1475, 0x893E, 0x2E51, 0x8941, + 0x2E52, 0x8942, 0x2E55, 0x8944, 0x1473, 0x8946, 0x2FC8, 0x8949, 0x2FCB, + 0x894B, 0x2FC5, 0x894C, 0x2FC7, 0x894F, 0x2FC6, 0x8950, 0x2FC9, 0x8951, + 0x2FCA, 0x8952, 0x2E53, 0x8953, 0x2FC4, 0x8956, 0x15C2, 0x8957, 0x3118, + 0x8958, 0x311B, 0x8959, 0x311D, 0x895A, 0x3116, 0x895B, 0x3117, 0x895C, + 0x311A, 0x895D, 0x311C, 0x895E, 0x15C3, 0x895F, 0x15C1, 0x8960, 0x15C0, + 0x8961, 0x3119, 0x8962, 0x3115, 0x8963, 0x3231, 0x8964, 0x1641, 0x8966, + 0x3232, 0x8969, 0x330D, 0x896A, 0x168C, 0x896B, 0x330F, 0x896C, 0x168D, + 0x896D, 0x330C, 0x896E, 0x330E, 0x896F, 0x16D6, 0x8971, 0x33B2, 0x8972, + 0x16D5, 0x8973, 0x343B, 0x8974, 0x343A, 0x8976, 0x3439, 0x8979, 0x34E2, + 0x897A, 0x34E3, 0x897B, 0x34E5, 0x897C, 0x34E4, 0x897E, 0x1819, 0x897F, + 0x0413, 0x8981, 0x0805, 0x8982, 0x2063, 0x8983, 0x0D55, 0x8985, 0x2580, + 0x8986, 0x1527, 0x8988, 0x311E, 0x898B, 0x0508, 0x898F, 0x0B9D, 0x8993, + 0x0B9C, 0x8995, 0x22E3, 0x8996, 0x0D56, 0x8997, 0x22E5, 0x8998, 0x22E4, + 0x899B, 0x2581, 0x899C, 0x0F05, 0x899D, 0x27FC, 0x899E, 0x27FF, 0x899F, + 0x27FE, 0x89A1, 0x27FD, 0x89A2, 0x2A3C, 0x89A3, 0x2A3E, 0x89A4, 0x2A3D, + 0x89A6, 0x134C, 0x89AA, 0x134B, 0x89AC, 0x1476, 0x89AD, 0x2E56, 0x89AE, + 0x2E58, 0x89AF, 0x2E57, 0x89B2, 0x1528, 0x89B6, 0x3120, 0x89B7, 0x311F, + 0x89B9, 0x3233, 0x89BA, 0x1642, 0x89BD, 0x168E, 0x89BE, 0x33B4, 0x89BF, + 0x33B3, 0x89C0, 0x1748, 0x89D2, 0x0509, 0x89D3, 0x1C03, 0x89D4, 0x0806, + 0x89D5, 0x2066, 0x89D6, 0x2064, 0x89D9, 0x2065, 0x89DA, 0x22E7, 0x89DB, + 0x22E8, 0x89DC, 0x2588, 0x89DD, 0x22E6, 0x89DF, 0x2582, 0x89E0, 0x2586, + 0x89E1, 0x2585, 0x89E2, 0x2587, 0x89E3, 0x0F06, 0x89E4, 0x2584, 0x89E5, + 0x2583, 0x89E6, 0x2589, 0x89E8, 0x2802, 0x89E9, 0x2800, 0x89EB, 0x2801, + 0x89EC, 0x2A41, 0x89ED, 0x2A3F, 0x89F0, 0x2A40, 0x89F1, 0x2C84, 0x89F2, + 0x2E59, 0x89F3, 0x2E5A, 0x89F4, 0x1529, 0x89F6, 0x3121, 0x89F7, 0x3234, + 0x89F8, 0x1643, 0x89FA, 0x3310, 0x89FB, 0x33B5, 0x89FC, 0x16D7, 0x89FE, + 0x343C, 0x89FF, 0x34E6, 0x8A00, 0x050A, 0x8A02, 0x0808, 0x8A03, 0x0809, + 0x8A04, 0x1C04, 0x8A07, 0x1C05, 0x8A08, 0x0807, 0x8A0A, 0x09C3, 0x8A0C, + 0x09C1, 0x8A0E, 0x09C0, 0x8A0F, 0x09C7, 0x8A10, 0x09BF, 0x8A11, 0x09C8, + 0x8A12, 0x1E08, 0x8A13, 0x09C5, 0x8A15, 0x09C2, 0x8A16, 0x09C6, 0x8A17, + 0x09C4, 0x8A18, 0x09BE, 0x8A1B, 0x0BA5, 0x8A1D, 0x0B9F, 0x8A1E, 0x206A, + 0x8A1F, 0x0BA4, 0x8A22, 0x0BA6, 0x8A23, 0x0BA0, 0x8A25, 0x0BA1, 0x8A27, + 0x2068, 0x8A2A, 0x0B9E, 0x8A2C, 0x2069, 0x8A2D, 0x0BA3, 0x8A30, 0x2067, + 0x8A31, 0x0BA2, 0x8A34, 0x0D61, 0x8A36, 0x0D63, 0x8A39, 0x22EB, 0x8A3A, + 0x0D62, 0x8A3B, 0x0D57, 0x8A3C, 0x0D5B, 0x8A3E, 0x0F19, 0x8A3F, 0x258E, + 0x8A40, 0x22ED, 0x8A41, 0x0D5C, 0x8A44, 0x22F0, 0x8A45, 0x22F1, 0x8A46, + 0x0D60, 0x8A48, 0x22F3, 0x8A4A, 0x22F5, 0x8A4C, 0x22F6, 0x8A4D, 0x22EA, + 0x8A4E, 0x22E9, 0x8A4F, 0x22F7, 0x8A50, 0x0D5F, 0x8A51, 0x22F4, 0x8A52, + 0x22F2, 0x8A54, 0x0D5D, 0x8A55, 0x0D59, 0x8A56, 0x0D64, 0x8A57, 0x22EE, + 0x8A58, 0x22EF, 0x8A59, 0x22EC, 0x8A5B, 0x0D5E, 0x8A5E, 0x0D5A, 0x8A60, + 0x0D58, 0x8A61, 0x258D, 0x8A62, 0x0F14, 0x8A63, 0x0F0F, 0x8A66, 0x0F0A, + 0x8A68, 0x0F1A, 0x8A69, 0x0F0B, 0x8A6B, 0x0F07, 0x8A6C, 0x0F16, 0x8A6D, + 0x0F13, 0x8A6E, 0x0F15, 0x8A70, 0x0F0C, 0x8A71, 0x0F11, 0x8A72, 0x0F08, + 0x8A73, 0x0F09, 0x8A74, 0x2595, 0x8A75, 0x2592, 0x8A76, 0x258A, 0x8A77, + 0x258F, 0x8A79, 0x0F17, 0x8A7A, 0x2596, 0x8A7B, 0x0F18, 0x8A7C, 0x0F0E, + 0x8A7F, 0x258C, 0x8A81, 0x2594, 0x8A82, 0x2590, 0x8A83, 0x2593, 0x8A84, + 0x2591, 0x8A85, 0x0F12, 0x8A86, 0x258B, 0x8A87, 0x0F0D, 0x8A8B, 0x2805, + 0x8A8C, 0x10A6, 0x8A8D, 0x10A9, 0x8A8F, 0x2807, 0x8A91, 0x10B1, 0x8A92, + 0x2806, 0x8A93, 0x10AB, 0x8A95, 0x1216, 0x8A96, 0x2808, 0x8A98, 0x10B0, + 0x8A99, 0x2804, 0x8A9A, 0x10B2, 0x8A9E, 0x10A7, 0x8AA0, 0x0F10, 0x8AA1, + 0x10AA, 0x8AA3, 0x10A8, 0x8AA4, 0x10AC, 0x8AA5, 0x10AE, 0x8AA6, 0x10A5, + 0x8AA7, 0x10B3, 0x8AA8, 0x10AF, 0x8AAA, 0x10AD, 0x8AAB, 0x2803, 0x8AB0, + 0x121D, 0x8AB2, 0x1219, 0x8AB6, 0x1220, 0x8AB8, 0x2A44, 0x8AB9, 0x1221, + 0x8ABA, 0x2A50, 0x8ABB, 0x2A49, 0x8ABC, 0x1212, 0x8ABD, 0x2A51, 0x8ABE, + 0x2A4B, 0x8ABF, 0x121C, 0x8AC0, 0x2A4C, 0x8AC2, 0x121B, 0x8AC3, 0x2A4F, + 0x8AC4, 0x1215, 0x8AC5, 0x2A4D, 0x8AC6, 0x2A43, 0x8AC7, 0x1214, 0x8AC8, + 0x2C8F, 0x8AC9, 0x121A, 0x8ACB, 0x1217, 0x8ACD, 0x121F, 0x8ACF, 0x2A42, + 0x8AD1, 0x2A46, 0x8AD2, 0x1213, 0x8AD3, 0x2A45, 0x8AD4, 0x2A47, 0x8AD5, + 0x2A48, 0x8AD6, 0x121E, 0x8AD7, 0x2A4A, 0x8AD8, 0x2A4E, 0x8AD9, 0x2A52, + 0x8ADB, 0x1222, 0x8ADC, 0x1352, 0x8ADD, 0x2C8A, 0x8ADE, 0x2C90, 0x8ADF, + 0x2C8D, 0x8AE0, 0x2C85, 0x8AE1, 0x2C91, 0x8AE2, 0x2C86, 0x8AE4, 0x2C8C, + 0x8AE6, 0x134D, 0x8AE7, 0x1353, 0x8AE8, 0x2C92, 0x8AEB, 0x134F, 0x8AED, + 0x1359, 0x8AEE, 0x1354, 0x8AEF, 0x2C94, 0x8AF0, 0x2C8E, 0x8AF1, 0x1350, + 0x8AF2, 0x2C87, 0x8AF3, 0x135A, 0x8AF4, 0x2C88, 0x8AF5, 0x2C89, 0x8AF6, + 0x135B, 0x8AF7, 0x1358, 0x8AF8, 0x1218, 0x8AFA, 0x134E, 0x8AFB, 0x2C95, + 0x8AFC, 0x135C, 0x8AFE, 0x1355, 0x8AFF, 0x2C93, 0x8B00, 0x1351, 0x8B01, + 0x1356, 0x8B02, 0x1357, 0x8B04, 0x147E, 0x8B05, 0x2E5F, 0x8B06, 0x2E68, + 0x8B07, 0x2E65, 0x8B08, 0x2E67, 0x8B0A, 0x147B, 0x8B0B, 0x2E60, 0x8B0D, + 0x2E66, 0x8B0E, 0x1477, 0x8B0F, 0x2E62, 0x8B10, 0x147F, 0x8B11, 0x2E5E, + 0x8B12, 0x2E63, 0x8B13, 0x2E6A, 0x8B14, 0x2C8B, 0x8B15, 0x2E64, 0x8B16, + 0x2E5D, 0x8B17, 0x1478, 0x8B18, 0x2E5C, 0x8B19, 0x1479, 0x8B1A, 0x2E6B, + 0x8B1B, 0x147A, 0x8B1C, 0x2E69, 0x8B1D, 0x147D, 0x8B1E, 0x2E5B, 0x8B20, + 0x147C, 0x8B22, 0x2E61, 0x8B23, 0x2FCE, 0x8B24, 0x2FDC, 0x8B25, 0x2FD7, + 0x8B26, 0x2FD9, 0x8B27, 0x2FCD, 0x8B28, 0x152A, 0x8B2A, 0x2FCC, 0x8B2B, + 0x152D, 0x8B2C, 0x152C, 0x8B2E, 0x2FDB, 0x8B2F, 0x2FD3, 0x8B30, 0x2FD0, + 0x8B31, 0x2FD6, 0x8B33, 0x2FCF, 0x8B35, 0x2FD1, 0x8B36, 0x2FDA, 0x8B37, + 0x2FD8, 0x8B39, 0x152B, 0x8B3A, 0x2FDF, 0x8B3B, 0x2FDD, 0x8B3C, 0x2FD4, + 0x8B3D, 0x2FDE, 0x8B3E, 0x2FD5, 0x8B40, 0x3125, 0x8B41, 0x15C4, 0x8B42, + 0x312C, 0x8B45, 0x3313, 0x8B46, 0x15CB, 0x8B47, 0x2FD2, 0x8B48, 0x3123, + 0x8B49, 0x15C7, 0x8B4A, 0x3124, 0x8B4B, 0x3129, 0x8B4E, 0x15C9, 0x8B4F, + 0x15CA, 0x8B50, 0x3122, 0x8B51, 0x312B, 0x8B52, 0x312D, 0x8B53, 0x3126, + 0x8B54, 0x3128, 0x8B55, 0x312A, 0x8B56, 0x3127, 0x8B57, 0x312E, 0x8B58, + 0x15C6, 0x8B59, 0x15CC, 0x8B5A, 0x15C8, 0x8B5C, 0x15C5, 0x8B5D, 0x3237, + 0x8B5F, 0x1648, 0x8B60, 0x3235, 0x8B63, 0x3239, 0x8B65, 0x323A, 0x8B66, + 0x1646, 0x8B67, 0x323B, 0x8B68, 0x3238, 0x8B6A, 0x3236, 0x8B6B, 0x1649, + 0x8B6C, 0x1645, 0x8B6D, 0x323C, 0x8B6F, 0x1647, 0x8B70, 0x1644, 0x8B74, + 0x168F, 0x8B77, 0x1690, 0x8B78, 0x3312, 0x8B79, 0x3311, 0x8B7A, 0x3314, + 0x8B7B, 0x3315, 0x8B7D, 0x1691, 0x8B7E, 0x33B6, 0x8B7F, 0x33BB, 0x8B80, + 0x16D8, 0x8B82, 0x33B8, 0x8B84, 0x33B7, 0x8B85, 0x33BA, 0x8B86, 0x33B9, + 0x8B88, 0x3440, 0x8B8A, 0x170A, 0x8B8B, 0x343F, 0x8B8C, 0x343D, 0x8B8E, + 0x343E, 0x8B92, 0x172C, 0x8B93, 0x172B, 0x8B94, 0x349C, 0x8B95, 0x349D, + 0x8B96, 0x172D, 0x8B98, 0x34E7, 0x8B99, 0x34E8, 0x8B9A, 0x1754, 0x8B9C, + 0x175A, 0x8B9E, 0x3522, 0x8B9F, 0x353F, 0x8C37, 0x050B, 0x8C39, 0x206B, + 0x8C3B, 0x206C, 0x8C3C, 0x2597, 0x8C3D, 0x2809, 0x8C3E, 0x2A53, 0x8C3F, + 0x1481, 0x8C41, 0x1480, 0x8C42, 0x2FE0, 0x8C43, 0x312F, 0x8C45, 0x3441, + 0x8C46, 0x050C, 0x8C47, 0x1E09, 0x8C48, 0x09C9, 0x8C49, 0x0BA7, 0x8C4A, + 0x2599, 0x8C4B, 0x2598, 0x8C4C, 0x1223, 0x8C4D, 0x2A54, 0x8C4E, 0x1224, + 0x8C4F, 0x2E6C, 0x8C50, 0x152E, 0x8C54, 0x1763, 0x8C55, 0x050D, 0x8C56, + 0x1A48, 0x8C57, 0x1E0A, 0x8C5A, 0x0BA8, 0x8C5C, 0x206D, 0x8C5D, 0x206E, + 0x8C5F, 0x22F8, 0x8C61, 0x0D65, 0x8C62, 0x0F1B, 0x8C64, 0x259B, 0x8C65, + 0x259A, 0x8C66, 0x259C, 0x8C68, 0x280A, 0x8C69, 0x280B, 0x8C6A, 0x10B4, + 0x8C6B, 0x135D, 0x8C6C, 0x1225, 0x8C6D, 0x135E, 0x8C6F, 0x2E70, 0x8C70, + 0x2E6D, 0x8C71, 0x2E6F, 0x8C72, 0x2E6E, 0x8C73, 0x1482, 0x8C75, 0x2FE1, + 0x8C76, 0x3131, 0x8C77, 0x3130, 0x8C78, 0x18E7, 0x8C79, 0x09CB, 0x8C7A, + 0x09CA, 0x8C7B, 0x1E0B, 0x8C7D, 0x206F, 0x8C80, 0x22FA, 0x8C81, 0x22F9, + 0x8C82, 0x0D66, 0x8C84, 0x259E, 0x8C85, 0x259F, 0x8C86, 0x259D, 0x8C89, + 0x0F1D, 0x8C8A, 0x0F1C, 0x8C8C, 0x10B6, 0x8C8D, 0x10B5, 0x8C8F, 0x2A55, + 0x8C90, 0x2C98, 0x8C91, 0x2C96, 0x8C92, 0x2C97, 0x8C93, 0x135F, 0x8C94, + 0x2E72, 0x8C95, 0x2E71, 0x8C97, 0x2FE4, 0x8C98, 0x2FE3, 0x8C99, 0x2FE2, + 0x8C9A, 0x3132, 0x8C9C, 0x3523, 0x8C9D, 0x050E, 0x8C9E, 0x080A, 0x8CA0, + 0x080B, 0x8CA1, 0x09CC, 0x8CA2, 0x09CD, 0x8CA3, 0x1E0D, 0x8CA4, 0x1E0C, + 0x8CA5, 0x2070, 0x8CA7, 0x0BAE, 0x8CA8, 0x0BAC, 0x8CA9, 0x0BA9, 0x8CAA, + 0x0BAD, 0x8CAB, 0x0BAB, 0x8CAC, 0x0BAA, 0x8CAF, 0x0D67, 0x8CB0, 0x22FD, + 0x8CB2, 0x0F22, 0x8CB3, 0x0D69, 0x8CB4, 0x0D6E, 0x8CB5, 0x22FF, 0x8CB6, + 0x0D70, 0x8CB7, 0x0D6F, 0x8CB8, 0x0D72, 0x8CB9, 0x22FE, 0x8CBA, 0x22FB, + 0x8CBB, 0x0D6C, 0x8CBC, 0x0D68, 0x8CBD, 0x0D6A, 0x8CBE, 0x22FC, 0x8CBF, + 0x0D71, 0x8CC0, 0x0D6D, 0x8CC1, 0x0D6B, 0x8CC2, 0x0F24, 0x8CC3, 0x0F23, + 0x8CC4, 0x0F21, 0x8CC5, 0x0F25, 0x8CC7, 0x0F1F, 0x8CC8, 0x0F20, 0x8CCA, + 0x0F1E, 0x8CCC, 0x25A0, 0x8CCF, 0x280D, 0x8CD1, 0x10B8, 0x8CD2, 0x10B9, + 0x8CD3, 0x10B7, 0x8CD5, 0x280C, 0x8CD7, 0x280E, 0x8CD9, 0x2A58, 0x8CDA, + 0x2A5A, 0x8CDC, 0x122E, 0x8CDD, 0x2A5B, 0x8CDE, 0x1227, 0x8CDF, 0x2A57, + 0x8CE0, 0x1226, 0x8CE1, 0x1230, 0x8CE2, 0x122C, 0x8CE3, 0x122D, 0x8CE4, + 0x1229, 0x8CE5, 0x2A56, 0x8CE6, 0x1228, 0x8CE7, 0x2A5C, 0x8CE8, 0x2A59, + 0x8CEA, 0x122F, 0x8CEC, 0x122A, 0x8CED, 0x122B, 0x8CEE, 0x2C9A, 0x8CF0, + 0x2C9C, 0x8CF1, 0x2C9B, 0x8CF3, 0x2C9D, 0x8CF4, 0x1360, 0x8CF5, 0x2C99, + 0x8CF8, 0x1486, 0x8CF9, 0x2E73, 0x8CFA, 0x1483, 0x8CFB, 0x1487, 0x8CFC, + 0x1485, 0x8CFD, 0x1484, 0x8CFE, 0x2FE5, 0x8D00, 0x2FE8, 0x8D02, 0x2FE7, + 0x8D04, 0x2FE6, 0x8D05, 0x152F, 0x8D06, 0x3133, 0x8D07, 0x3134, 0x8D08, + 0x15CD, 0x8D09, 0x3135, 0x8D0A, 0x15CE, 0x8D0D, 0x164B, 0x8D0F, 0x164A, + 0x8D10, 0x3316, 0x8D13, 0x1692, 0x8D14, 0x3317, 0x8D15, 0x33BC, 0x8D16, + 0x16D9, 0x8D17, 0x16DA, 0x8D19, 0x3442, 0x8D1B, 0x172F, 0x8D64, 0x050F, + 0x8D66, 0x0BB0, 0x8D67, 0x0BAF, 0x8D68, 0x25A1, 0x8D69, 0x25A2, 0x8D6B, + 0x10BA, 0x8D6C, 0x2C9E, 0x8D6D, 0x1231, 0x8D6E, 0x2C9F, 0x8D6F, 0x2E74, + 0x8D70, 0x0510, 0x8D72, 0x1C06, 0x8D73, 0x080D, 0x8D74, 0x080C, 0x8D76, + 0x1E0E, 0x8D77, 0x09CE, 0x8D78, 0x1E0F, 0x8D79, 0x2073, 0x8D7B, 0x2072, + 0x8D7D, 0x2071, 0x8D80, 0x2301, 0x8D81, 0x0D75, 0x8D84, 0x2300, 0x8D85, + 0x0D74, 0x8D89, 0x2302, 0x8D8A, 0x0D73, 0x8D8C, 0x25A4, 0x8D8D, 0x25A7, + 0x8D8E, 0x25A5, 0x8D8F, 0x25A6, 0x8D90, 0x25AA, 0x8D91, 0x25A3, 0x8D92, + 0x25AB, 0x8D93, 0x25A8, 0x8D94, 0x25A9, 0x8D95, 0x10BC, 0x8D96, 0x280F, + 0x8D99, 0x10BB, 0x8D9B, 0x2A60, 0x8D9C, 0x2A5E, 0x8D9F, 0x1232, 0x8DA0, + 0x2A5D, 0x8DA1, 0x2A5F, 0x8DA3, 0x1233, 0x8DA5, 0x2CA0, 0x8DA7, 0x2CA1, + 0x8DA8, 0x1488, 0x8DAA, 0x3137, 0x8DAB, 0x3139, 0x8DAC, 0x3136, 0x8DAD, + 0x3138, 0x8DAE, 0x323D, 0x8DAF, 0x3318, 0x8DB2, 0x3509, 0x8DB3, 0x0511, + 0x8DB4, 0x080E, 0x8DB5, 0x1E10, 0x8DB6, 0x1E12, 0x8DB7, 0x1E11, 0x8DB9, + 0x2076, 0x8DBA, 0x0BB2, 0x8DBC, 0x2074, 0x8DBE, 0x0BB1, 0x8DBF, 0x2077, + 0x8DC1, 0x2078, 0x8DC2, 0x2075, 0x8DC5, 0x230E, 0x8DC6, 0x0D7D, 0x8DC7, + 0x2306, 0x8DC8, 0x230C, 0x8DCB, 0x0D78, 0x8DCC, 0x0D7B, 0x8DCD, 0x2305, + 0x8DCE, 0x0D76, 0x8DCF, 0x2309, 0x8DD0, 0x25B1, 0x8DD1, 0x0D7A, 0x8DD3, + 0x2304, 0x8DD5, 0x230A, 0x8DD6, 0x2307, 0x8DD7, 0x230D, 0x8DD8, 0x2303, + 0x8DD9, 0x230B, 0x8DDA, 0x0D79, 0x8DDB, 0x0D7C, 0x8DDC, 0x2308, 0x8DDD, + 0x0D77, 0x8DDF, 0x0F27, 0x8DE0, 0x25AD, 0x8DE1, 0x0F26, 0x8DE2, 0x25B4, + 0x8DE3, 0x25B3, 0x8DE4, 0x0F2D, 0x8DE6, 0x0F2E, 0x8DE7, 0x25B5, 0x8DE8, + 0x0F28, 0x8DE9, 0x25B2, 0x8DEA, 0x0F2C, 0x8DEB, 0x25B7, 0x8DEC, 0x25AE, + 0x8DEE, 0x25B0, 0x8DEF, 0x0F29, 0x8DF0, 0x25AC, 0x8DF1, 0x25AF, 0x8DF2, + 0x25B6, 0x8DF3, 0x0F2A, 0x8DF4, 0x25B8, 0x8DFA, 0x0F2B, 0x8DFC, 0x10BD, + 0x8DFD, 0x2814, 0x8DFE, 0x281A, 0x8DFF, 0x2812, 0x8E00, 0x281B, 0x8E02, + 0x2811, 0x8E03, 0x2816, 0x8E04, 0x281C, 0x8E05, 0x2819, 0x8E06, 0x2818, + 0x8E07, 0x2817, 0x8E09, 0x2810, 0x8E0A, 0x2815, 0x8E0D, 0x2813, 0x8E0F, + 0x1238, 0x8E10, 0x1235, 0x8E11, 0x2A69, 0x8E12, 0x2A6E, 0x8E13, 0x2A70, + 0x8E14, 0x2A6D, 0x8E15, 0x2A66, 0x8E16, 0x2A68, 0x8E17, 0x2A72, 0x8E18, + 0x2A6F, 0x8E19, 0x2A6A, 0x8E1A, 0x2A73, 0x8E1B, 0x2A67, 0x8E1C, 0x2A71, + 0x8E1D, 0x1236, 0x8E1E, 0x123C, 0x8E1F, 0x123A, 0x8E20, 0x2A61, 0x8E21, + 0x123B, 0x8E22, 0x1237, 0x8E23, 0x2A62, 0x8E24, 0x2A64, 0x8E25, 0x2A63, + 0x8E26, 0x2A6B, 0x8E27, 0x2A6C, 0x8E29, 0x1239, 0x8E2B, 0x1234, 0x8E2E, + 0x2A65, 0x8E30, 0x2CAB, 0x8E31, 0x1362, 0x8E33, 0x2CA2, 0x8E34, 0x1363, + 0x8E35, 0x1366, 0x8E36, 0x2CA7, 0x8E38, 0x2CA4, 0x8E39, 0x1365, 0x8E3C, + 0x2CA8, 0x8E3D, 0x2CA9, 0x8E3E, 0x2CA3, 0x8E3F, 0x2CAC, 0x8E40, 0x2CA5, + 0x8E41, 0x2CAA, 0x8E42, 0x1364, 0x8E44, 0x1361, 0x8E45, 0x2CA6, 0x8E47, + 0x2E7A, 0x8E48, 0x148B, 0x8E49, 0x1489, 0x8E4A, 0x148C, 0x8E4B, 0x148A, + 0x8E4C, 0x2E79, 0x8E4D, 0x2E76, 0x8E4E, 0x2E75, 0x8E50, 0x2E78, 0x8E53, + 0x2E77, 0x8E54, 0x2FF6, 0x8E55, 0x1535, 0x8E56, 0x2FED, 0x8E57, 0x2FEC, + 0x8E59, 0x1530, 0x8E5A, 0x2FF2, 0x8E5B, 0x2FF1, 0x8E5C, 0x2FE9, 0x8E5D, + 0x2FF4, 0x8E5E, 0x2FEE, 0x8E5F, 0x1534, 0x8E60, 0x2FEB, 0x8E61, 0x2FF3, + 0x8E62, 0x2FEA, 0x8E63, 0x1531, 0x8E64, 0x1533, 0x8E65, 0x2FEF, 0x8E66, + 0x1532, 0x8E67, 0x2FF0, 0x8E69, 0x2FF5, 0x8E6A, 0x313D, 0x8E6C, 0x15D3, + 0x8E6D, 0x313A, 0x8E6F, 0x313E, 0x8E72, 0x15D0, 0x8E73, 0x313C, 0x8E74, + 0x15D5, 0x8E76, 0x15D2, 0x8E78, 0x313B, 0x8E7A, 0x15D4, 0x8E7B, 0x313F, + 0x8E7C, 0x15CF, 0x8E81, 0x164D, 0x8E82, 0x164F, 0x8E84, 0x3240, 0x8E85, + 0x164E, 0x8E86, 0x323E, 0x8E87, 0x15D1, 0x8E88, 0x323F, 0x8E89, 0x164C, + 0x8E8A, 0x1693, 0x8E8B, 0x1695, 0x8E8C, 0x331A, 0x8E8D, 0x1694, 0x8E8E, + 0x3319, 0x8E90, 0x33C1, 0x8E91, 0x16DB, 0x8E92, 0x33C0, 0x8E93, 0x16DC, + 0x8E94, 0x33BE, 0x8E95, 0x33BD, 0x8E96, 0x33C2, 0x8E97, 0x33C3, 0x8E98, + 0x3443, 0x8E9A, 0x33BF, 0x8E9D, 0x34A1, 0x8E9E, 0x349E, 0x8E9F, 0x349F, + 0x8EA0, 0x34A0, 0x8EA1, 0x1749, 0x8EA3, 0x34EB, 0x8EA4, 0x34EA, 0x8EA5, + 0x34E9, 0x8EA6, 0x350A, 0x8EA8, 0x3537, 0x8EA9, 0x3524, 0x8EAA, 0x175B, + 0x8EAB, 0x0512, 0x8EAC, 0x09CF, 0x8EB2, 0x0F2F, 0x8EBA, 0x123D, 0x8EBD, + 0x2CAD, 0x8EC0, 0x1536, 0x8EC2, 0x3140, 0x8EC9, 0x3525, 0x8ECA, 0x0513, + 0x8ECB, 0x068D, 0x8ECC, 0x0810, 0x8ECD, 0x080F, 0x8ECF, 0x09D2, 0x8ED1, + 0x1E13, 0x8ED2, 0x09D0, 0x8ED3, 0x1E14, 0x8ED4, 0x09D1, 0x8ED7, 0x207D, + 0x8ED8, 0x2079, 0x8EDB, 0x0BB3, 0x8EDC, 0x207C, 0x8EDD, 0x207B, 0x8EDE, + 0x207A, 0x8EDF, 0x0BB4, 0x8EE0, 0x207E, 0x8EE1, 0x207F, 0x8EE5, 0x2315, + 0x8EE6, 0x2313, 0x8EE7, 0x2317, 0x8EE8, 0x2318, 0x8EE9, 0x231E, 0x8EEB, + 0x231A, 0x8EEC, 0x231C, 0x8EEE, 0x2314, 0x8EEF, 0x230F, 0x8EF1, 0x231B, + 0x8EF4, 0x231D, 0x8EF5, 0x2316, 0x8EF6, 0x2319, 0x8EF7, 0x2310, 0x8EF8, + 0x0D7F, 0x8EF9, 0x2312, 0x8EFA, 0x2311, 0x8EFB, 0x0D7E, 0x8EFC, 0x0D80, + 0x8EFE, 0x0F32, 0x8EFF, 0x25BA, 0x8F00, 0x25BC, 0x8F01, 0x25BB, 0x8F02, + 0x25C0, 0x8F03, 0x0F30, 0x8F05, 0x25BD, 0x8F06, 0x25B9, 0x8F07, 0x25BE, + 0x8F08, 0x25BF, 0x8F09, 0x0F31, 0x8F0A, 0x0F33, 0x8F0B, 0x25C1, 0x8F0D, + 0x2820, 0x8F0E, 0x281F, 0x8F10, 0x281D, 0x8F11, 0x281E, 0x8F12, 0x10BF, + 0x8F13, 0x10C1, 0x8F14, 0x10BE, 0x8F15, 0x10C0, 0x8F16, 0x2A7A, 0x8F17, + 0x2A7B, 0x8F18, 0x2A76, 0x8F1A, 0x2A77, 0x8F1B, 0x123F, 0x8F1C, 0x1244, + 0x8F1D, 0x123E, 0x8F1E, 0x1245, 0x8F1F, 0x1240, 0x8F20, 0x2A78, 0x8F23, + 0x2A79, 0x8F24, 0x2A75, 0x8F25, 0x1246, 0x8F26, 0x1242, 0x8F29, 0x1241, + 0x8F2A, 0x1243, 0x8F2C, 0x2A74, 0x8F2E, 0x2CAF, 0x8F2F, 0x1368, 0x8F32, + 0x2CB1, 0x8F33, 0x136A, 0x8F34, 0x2CB4, 0x8F35, 0x2CB0, 0x8F36, 0x2CAE, + 0x8F37, 0x2CB3, 0x8F38, 0x1369, 0x8F39, 0x2CB2, 0x8F3B, 0x1367, 0x8F3E, + 0x148E, 0x8F3F, 0x1491, 0x8F40, 0x2E7C, 0x8F42, 0x148F, 0x8F43, 0x2E7B, + 0x8F44, 0x148D, 0x8F45, 0x1490, 0x8F46, 0x2FF7, 0x8F47, 0x2FF8, 0x8F48, + 0x2FF9, 0x8F49, 0x1537, 0x8F4B, 0x2FFA, 0x8F4D, 0x1538, 0x8F4E, 0x15D7, + 0x8F4F, 0x3143, 0x8F50, 0x3144, 0x8F51, 0x3142, 0x8F52, 0x3141, 0x8F53, + 0x3145, 0x8F54, 0x15D6, 0x8F55, 0x3244, 0x8F56, 0x3242, 0x8F57, 0x3243, + 0x8F58, 0x3245, 0x8F59, 0x3241, 0x8F5A, 0x3246, 0x8F5B, 0x331C, 0x8F5D, + 0x331D, 0x8F5E, 0x331B, 0x8F5F, 0x1696, 0x8F60, 0x33C4, 0x8F61, 0x16DD, + 0x8F62, 0x33C5, 0x8F63, 0x3445, 0x8F64, 0x3444, 0x8F9B, 0x0514, 0x8F9C, + 0x0D81, 0x8F9F, 0x0F34, 0x8FA3, 0x10C2, 0x8FA6, 0x136C, 0x8FA8, 0x136B, + 0x8FAD, 0x15D8, 0x8FAE, 0x162F, 0x8FAF, 0x1697, 0x8FB0, 0x0515, 0x8FB1, + 0x09D3, 0x8FB2, 0x0F35, 0x8FB4, 0x3146, 0x8FB5, 0x0230, 0x8FBF, 0x18E9, + 0x8FC2, 0x0516, 0x8FC4, 0x0519, 0x8FC5, 0x0518, 0x8FC6, 0x0517, 0x8FC9, + 0x18E8, 0x8FCB, 0x1A4A, 0x8FCD, 0x1A4C, 0x8FCE, 0x068E, 0x8FD1, 0x0690, + 0x8FD2, 0x1A49, 0x8FD3, 0x1A4B, 0x8FD4, 0x068F, 0x8FD5, 0x1A4E, 0x8FD6, + 0x1A4D, 0x8FD7, 0x1A4F, 0x8FE0, 0x1C0A, 0x8FE1, 0x1C08, 0x8FE2, 0x0813, + 0x8FE3, 0x1C07, 0x8FE4, 0x0818, 0x8FE5, 0x0815, 0x8FE6, 0x0812, 0x8FE8, + 0x0819, 0x8FEA, 0x0814, 0x8FEB, 0x0817, 0x8FED, 0x0816, 0x8FEE, 0x1C09, + 0x8FF0, 0x0811, 0x8FF4, 0x09D9, 0x8FF5, 0x1E16, 0x8FF6, 0x1E1C, 0x8FF7, + 0x09D6, 0x8FF8, 0x09DD, 0x8FFA, 0x09D8, 0x8FFB, 0x1E19, 0x8FFC, 0x1E1B, + 0x8FFD, 0x09DB, 0x8FFE, 0x1E15, 0x8FFF, 0x1E18, 0x9000, 0x09D7, 0x9001, + 0x09D4, 0x9002, 0x1E17, 0x9003, 0x09DA, 0x9004, 0x1E1A, 0x9005, 0x09DC, + 0x9006, 0x09D5, 0x900B, 0x2081, 0x900C, 0x2084, 0x900D, 0x0BB6, 0x900F, + 0x0BC0, 0x9010, 0x0BBC, 0x9011, 0x2082, 0x9014, 0x0BC4, 0x9015, 0x0BBD, + 0x9016, 0x0BC2, 0x9017, 0x0BB8, 0x9019, 0x0BB5, 0x901A, 0x0BB7, 0x901B, + 0x0BC3, 0x901C, 0x2083, 0x901D, 0x0BBB, 0x901E, 0x0BBE, 0x901F, 0x0BBA, + 0x9020, 0x0BBF, 0x9021, 0x2085, 0x9022, 0x0BC1, 0x9023, 0x0BB9, 0x9024, + 0x2080, 0x902D, 0x231F, 0x902E, 0x0D82, 0x902F, 0x2321, 0x9031, 0x0D84, + 0x9032, 0x0D86, 0x9034, 0x2320, 0x9035, 0x0D83, 0x9036, 0x0D87, 0x9038, + 0x0D85, 0x903C, 0x0F3B, 0x903D, 0x25C6, 0x903E, 0x0F43, 0x903F, 0x25C3, + 0x9041, 0x0F44, 0x9042, 0x0F39, 0x9044, 0x25C4, 0x9047, 0x0F3E, 0x9049, + 0x25C5, 0x904A, 0x0F37, 0x904B, 0x0F36, 0x904D, 0x0F41, 0x904E, 0x0F40, + 0x904F, 0x0F3F, 0x9050, 0x0F3D, 0x9051, 0x0F42, 0x9052, 0x25C2, 0x9053, + 0x0F38, 0x9054, 0x0F3A, 0x9055, 0x0F3C, 0x9058, 0x10C4, 0x9059, 0x10C7, + 0x905B, 0x10CB, 0x905C, 0x10C5, 0x905D, 0x10CA, 0x905E, 0x10C8, 0x9060, + 0x10C3, 0x9062, 0x10C9, 0x9063, 0x10C6, 0x9067, 0x2A7F, 0x9068, 0x1249, + 0x9069, 0x1247, 0x906B, 0x2A80, 0x906D, 0x124A, 0x906E, 0x1248, 0x906F, + 0x2A7E, 0x9070, 0x2A7D, 0x9072, 0x1370, 0x9073, 0x2A7C, 0x9074, 0x136E, + 0x9075, 0x136D, 0x9076, 0x2CB5, 0x9077, 0x124B, 0x9078, 0x136F, 0x9079, + 0x2CB6, 0x907A, 0x1372, 0x907B, 0x2CB7, 0x907C, 0x1371, 0x907D, 0x1493, + 0x907E, 0x2E7E, 0x907F, 0x1492, 0x9080, 0x1497, 0x9081, 0x1495, 0x9082, + 0x1496, 0x9083, 0x153A, 0x9084, 0x1494, 0x9085, 0x2E7D, 0x9086, 0x2CB8, + 0x9087, 0x1539, 0x9088, 0x153B, 0x908A, 0x15D9, 0x908B, 0x15DA, 0x908D, + 0x3247, 0x908F, 0x170C, 0x9090, 0x170B, 0x9091, 0x051B, 0x9094, 0x181E, + 0x9095, 0x09DE, 0x9097, 0x181B, 0x9098, 0x181C, 0x9099, 0x181A, 0x909B, + 0x181D, 0x909E, 0x18ED, 0x909F, 0x18EA, 0x90A0, 0x18EF, 0x90A1, 0x18EB, + 0x90A2, 0x051C, 0x90A3, 0x051F, 0x90A5, 0x18EC, 0x90A6, 0x051E, 0x90A7, + 0x18EE, 0x90AA, 0x051D, 0x90AF, 0x1A52, 0x90B0, 0x1A54, 0x90B1, 0x0693, + 0x90B2, 0x1A50, 0x90B3, 0x1A53, 0x90B4, 0x1A51, 0x90B5, 0x0691, 0x90B6, + 0x0694, 0x90B8, 0x0692, 0x90BD, 0x1C0C, 0x90BE, 0x1C10, 0x90BF, 0x1C0D, + 0x90C1, 0x081C, 0x90C3, 0x081D, 0x90C5, 0x1C0F, 0x90C7, 0x1C11, 0x90C8, + 0x1C13, 0x90CA, 0x081A, 0x90CB, 0x1C12, 0x90CE, 0x081B, 0x90D4, 0x208C, + 0x90D5, 0x1C0E, 0x90D6, 0x1E1D, 0x90D7, 0x1E26, 0x90D8, 0x1E24, 0x90D9, + 0x1E1F, 0x90DA, 0x1E20, 0x90DB, 0x1E25, 0x90DC, 0x1E27, 0x90DD, 0x09E0, + 0x90DF, 0x1E22, 0x90E0, 0x1E1E, 0x90E1, 0x09DF, 0x90E2, 0x09E1, 0x90E3, + 0x1E21, 0x90E4, 0x1E28, 0x90E5, 0x1E23, 0x90E8, 0x0BC5, 0x90E9, 0x208F, + 0x90EA, 0x2087, 0x90EB, 0x208D, 0x90EC, 0x208E, 0x90ED, 0x0BC6, 0x90EF, + 0x2086, 0x90F0, 0x2088, 0x90F1, 0x1C0B, 0x90F2, 0x208A, 0x90F3, 0x208B, + 0x90F4, 0x2089, 0x90F5, 0x0D89, 0x90F9, 0x2328, 0x90FA, 0x2CB9, 0x90FB, + 0x2329, 0x90FC, 0x2326, 0x90FD, 0x0BC7, 0x90FE, 0x0D8B, 0x90FF, 0x2325, + 0x9100, 0x232B, 0x9101, 0x232A, 0x9102, 0x0D88, 0x9103, 0x232E, 0x9104, + 0x2324, 0x9105, 0x232D, 0x9106, 0x2322, 0x9107, 0x232C, 0x9108, 0x2327, + 0x9109, 0x0D8A, 0x910B, 0x25CD, 0x910D, 0x25C8, 0x910E, 0x25CE, 0x910F, + 0x25C9, 0x9110, 0x25C7, 0x9111, 0x25CA, 0x9112, 0x0F45, 0x9114, 0x25CC, + 0x9116, 0x25CB, 0x9117, 0x0F46, 0x9118, 0x10CD, 0x9119, 0x10CC, 0x911A, + 0x2827, 0x911B, 0x282A, 0x911C, 0x2822, 0x911D, 0x2826, 0x911E, 0x10CE, + 0x911F, 0x2825, 0x9120, 0x2823, 0x9121, 0x2829, 0x9122, 0x2824, 0x9123, + 0x2821, 0x9124, 0x2828, 0x9126, 0x2A86, 0x9127, 0x124E, 0x9128, 0x2FFB, + 0x9129, 0x2A83, 0x912A, 0x2A84, 0x912B, 0x2A82, 0x912C, 0x2323, 0x912D, + 0x124D, 0x912E, 0x2A87, 0x912F, 0x2A81, 0x9130, 0x124C, 0x9131, 0x124F, + 0x9132, 0x2A85, 0x9133, 0x2CBA, 0x9134, 0x1373, 0x9135, 0x2CBB, 0x9136, + 0x2CBC, 0x9138, 0x2E7F, 0x9139, 0x1498, 0x913A, 0x2FFC, 0x913B, 0x2FFD, + 0x913E, 0x2FFE, 0x913F, 0x3148, 0x9140, 0x3147, 0x9141, 0x3249, 0x9143, + 0x3248, 0x9144, 0x331F, 0x9145, 0x3320, 0x9146, 0x331E, 0x9147, 0x33C6, + 0x9148, 0x16DE, 0x9149, 0x0520, 0x914A, 0x081F, 0x914B, 0x081E, 0x914C, + 0x09E4, 0x914D, 0x09E3, 0x914E, 0x1E2A, 0x914F, 0x1E2B, 0x9150, 0x1E29, + 0x9152, 0x09E2, 0x9153, 0x2093, 0x9155, 0x2094, 0x9156, 0x2090, 0x9157, + 0x0BC8, 0x9158, 0x2091, 0x915A, 0x2092, 0x915F, 0x2331, 0x9160, 0x2333, + 0x9161, 0x232F, 0x9162, 0x2332, 0x9163, 0x0D8C, 0x9164, 0x2330, 0x9165, + 0x0D8D, 0x9168, 0x23E2, 0x9169, 0x0F49, 0x916A, 0x0F48, 0x916C, 0x0F47, + 0x916E, 0x25CF, 0x916F, 0x25D0, 0x9172, 0x282C, 0x9173, 0x282E, 0x9174, + 0x10D2, 0x9175, 0x10CF, 0x9177, 0x10D1, 0x9178, 0x10D0, 0x9179, 0x282D, + 0x917A, 0x282B, 0x9180, 0x2A8E, 0x9181, 0x2A8B, 0x9182, 0x2A8C, 0x9183, + 0x1253, 0x9184, 0x2A8D, 0x9185, 0x2A88, 0x9186, 0x2A89, 0x9187, 0x1250, + 0x9189, 0x1251, 0x918A, 0x2A8A, 0x918B, 0x1252, 0x918D, 0x2CC0, 0x918F, + 0x2CC1, 0x9190, 0x2CBE, 0x9191, 0x2CBF, 0x9192, 0x1374, 0x9193, 0x2CBD, + 0x9199, 0x2E83, 0x919A, 0x2E80, 0x919B, 0x2E82, 0x919C, 0x149B, 0x919D, + 0x2E86, 0x919E, 0x149A, 0x919F, 0x2E84, 0x91A0, 0x2E87, 0x91A1, 0x2E85, + 0x91A2, 0x2E81, 0x91A3, 0x1499, 0x91A5, 0x3000, 0x91A7, 0x3001, 0x91A8, + 0x2FFF, 0x91AA, 0x3003, 0x91AB, 0x153C, 0x91AC, 0x153D, 0x91AD, 0x314A, + 0x91AE, 0x15DC, 0x91AF, 0x3002, 0x91B0, 0x3149, 0x91B1, 0x15DB, 0x91B2, + 0x324C, 0x91B3, 0x324D, 0x91B4, 0x1650, 0x91B5, 0x324B, 0x91B7, 0x324A, + 0x91B9, 0x3321, 0x91BA, 0x1698, 0x91BC, 0x3446, 0x91BD, 0x34A3, 0x91BE, + 0x34A2, 0x91C0, 0x1730, 0x91C1, 0x174A, 0x91C2, 0x34A4, 0x91C3, 0x350B, + 0x91C5, 0x175C, 0x91C6, 0x0521, 0x91C7, 0x0695, 0x91C9, 0x0F4A, 0x91CB, + 0x1651, 0x91CC, 0x0522, 0x91CD, 0x0820, 0x91CE, 0x0BC9, 0x91CF, 0x0D8E, + 0x91D0, 0x153E, 0x91D1, 0x0696, 0x91D3, 0x1C15, 0x91D4, 0x1C14, 0x91D5, + 0x1E2C, 0x91D7, 0x09E7, 0x91D8, 0x09E5, 0x91D9, 0x09E9, 0x91DA, 0x1E2E, + 0x91DC, 0x09E8, 0x91DD, 0x09E6, 0x91E2, 0x1E2D, 0x91E3, 0x0BCC, 0x91E4, + 0x209A, 0x91E6, 0x0BCB, 0x91E7, 0x0BCD, 0x91E8, 0x209F, 0x91E9, 0x0BCF, + 0x91EA, 0x209C, 0x91EB, 0x209D, 0x91EC, 0x2095, 0x91ED, 0x0BCE, 0x91EE, + 0x20A0, 0x91F1, 0x2097, 0x91F3, 0x2098, 0x91F4, 0x2096, 0x91F5, 0x0BCA, + 0x91F7, 0x209E, 0x91F8, 0x2099, 0x91F9, 0x209B, 0x91FD, 0x233F, 0x91FF, + 0x233E, 0x9200, 0x233C, 0x9201, 0x2334, 0x9202, 0x2343, 0x9203, 0x2337, + 0x9204, 0x2341, 0x9205, 0x2348, 0x9206, 0x2340, 0x9207, 0x0D96, 0x9209, + 0x0D92, 0x920A, 0x2335, 0x920C, 0x233B, 0x920D, 0x0D94, 0x920F, 0x233A, + 0x9210, 0x0D95, 0x9211, 0x0D97, 0x9212, 0x233D, 0x9214, 0x0D8F, 0x9215, + 0x0D90, 0x9216, 0x2349, 0x9217, 0x2347, 0x9219, 0x2346, 0x921A, 0x2338, + 0x921C, 0x2344, 0x921E, 0x0D93, 0x9223, 0x0D91, 0x9224, 0x2345, 0x9225, + 0x2336, 0x9226, 0x2339, 0x9227, 0x2342, 0x922D, 0x2851, 0x922E, 0x25DA, + 0x9230, 0x25D3, 0x9231, 0x25E6, 0x9232, 0x25EF, 0x9233, 0x25D6, 0x9234, + 0x0F55, 0x9236, 0x25E3, 0x9237, 0x0F4B, 0x9238, 0x0F4D, 0x9239, 0x0F59, + 0x923A, 0x25D4, 0x923D, 0x0F4E, 0x923E, 0x0F50, 0x923F, 0x0F5A, 0x9240, + 0x0F4F, 0x9245, 0x0F58, 0x9246, 0x25DC, 0x9248, 0x25D1, 0x9249, 0x0F56, + 0x924A, 0x25DB, 0x924B, 0x0F52, 0x924C, 0x25ED, 0x924D, 0x0F57, 0x924E, + 0x25EB, 0x924F, 0x25DF, 0x9250, 0x25E9, 0x9251, 0x0F54, 0x9252, 0x25D2, + 0x9253, 0x25EC, 0x9254, 0x25E7, 0x9256, 0x25EE, 0x9257, 0x0F4C, 0x925A, + 0x0F5B, 0x925B, 0x0F51, 0x925E, 0x25D8, 0x9260, 0x25E0, 0x9261, 0x25E4, + 0x9263, 0x25E8, 0x9264, 0x0F53, 0x9265, 0x25D7, 0x9266, 0x25D5, 0x9267, + 0x25E1, 0x926C, 0x25DE, 0x926D, 0x25DD, 0x926F, 0x25E2, 0x9270, 0x25E5, + 0x9272, 0x25EA, 0x9276, 0x2831, 0x9278, 0x10D3, 0x9279, 0x283B, 0x927A, + 0x2833, 0x927B, 0x10D9, 0x927C, 0x10DD, 0x927D, 0x2844, 0x927E, 0x284C, + 0x927F, 0x283D, 0x9280, 0x10D5, 0x9282, 0x2841, 0x9283, 0x25D9, 0x9285, + 0x10D6, 0x9286, 0x2848, 0x9287, 0x284D, 0x9288, 0x2845, 0x928A, 0x2847, + 0x928B, 0x2850, 0x928C, 0x2849, 0x928D, 0x2837, 0x928E, 0x2840, 0x9291, + 0x10DE, 0x9293, 0x10DA, 0x9294, 0x2835, 0x9295, 0x2842, 0x9296, 0x10D8, + 0x9297, 0x283C, 0x9298, 0x10D7, 0x9299, 0x284A, 0x929A, 0x2839, 0x929B, + 0x2832, 0x929C, 0x10DB, 0x929D, 0x284F, 0x92A0, 0x2834, 0x92A1, 0x2846, + 0x92A2, 0x2843, 0x92A3, 0x283E, 0x92A4, 0x2830, 0x92A5, 0x282F, 0x92A6, + 0x2838, 0x92A7, 0x284B, 0x92A8, 0x10DC, 0x92A9, 0x284E, 0x92AA, 0x2836, + 0x92AB, 0x283A, 0x92AC, 0x10D4, 0x92B2, 0x125F, 0x92B3, 0x125A, 0x92B4, + 0x2AB0, 0x92B5, 0x2AAC, 0x92B6, 0x2A94, 0x92B7, 0x1256, 0x92B9, 0x36E9, + 0x92BB, 0x1255, 0x92BC, 0x125B, 0x92C0, 0x2A92, 0x92C1, 0x1259, 0x92C2, + 0x2A9E, 0x92C3, 0x2A90, 0x92C4, 0x2A91, 0x92C5, 0x1254, 0x92C6, 0x2AAF, + 0x92C7, 0x125D, 0x92C8, 0x2AA1, 0x92C9, 0x2AA6, 0x92CA, 0x2AA0, 0x92CB, + 0x2CD3, 0x92CC, 0x2A9C, 0x92CD, 0x2AA4, 0x92CE, 0x2AA2, 0x92CF, 0x2A95, + 0x92D0, 0x2A8F, 0x92D1, 0x2AAA, 0x92D2, 0x125C, 0x92D3, 0x2AAB, 0x92D5, + 0x2AA5, 0x92D7, 0x2A9A, 0x92D8, 0x2A98, 0x92D9, 0x2A93, 0x92DD, 0x2A9B, + 0x92DE, 0x2AA8, 0x92DF, 0x2A97, 0x92E0, 0x2AA7, 0x92E1, 0x2AAD, 0x92E4, + 0x1258, 0x92E6, 0x2AA3, 0x92E7, 0x2AA9, 0x92E8, 0x2A9F, 0x92E9, 0x2A99, + 0x92EA, 0x1257, 0x92EE, 0x283F, 0x92EF, 0x2A9D, 0x92F0, 0x125E, 0x92F1, + 0x2A96, 0x92F7, 0x2CD8, 0x92F8, 0x1377, 0x92F9, 0x2CD7, 0x92FA, 0x2CD5, + 0x92FB, 0x2CE7, 0x92FC, 0x137B, 0x92FE, 0x2CE4, 0x92FF, 0x2CDC, 0x9300, + 0x2CE6, 0x9301, 0x2CCE, 0x9302, 0x2CDA, 0x9304, 0x137D, 0x9306, 0x2CC6, + 0x9308, 0x2CC4, 0x9309, 0x2CE5, 0x930B, 0x2CE3, 0x930C, 0x2CE2, 0x930D, + 0x2CD2, 0x930E, 0x2CD1, 0x930F, 0x2CC7, 0x9310, 0x137F, 0x9312, 0x2CCD, + 0x9313, 0x2CD6, 0x9314, 0x2CE1, 0x9315, 0x1382, 0x9316, 0x2CE8, 0x9318, + 0x14A3, 0x9319, 0x1384, 0x931A, 0x137E, 0x931B, 0x2CCB, 0x931D, 0x2CD4, + 0x931E, 0x2CC3, 0x931F, 0x2CC5, 0x9320, 0x1375, 0x9321, 0x1381, 0x9322, + 0x137A, 0x9323, 0x2CCC, 0x9324, 0x2CDB, 0x9325, 0x2AAE, 0x9326, 0x1380, + 0x9327, 0x2CC2, 0x9328, 0x149E, 0x9329, 0x2CDD, 0x932A, 0x2CE0, 0x932B, + 0x137C, 0x932D, 0x2CD0, 0x932E, 0x1383, 0x932F, 0x1379, 0x9333, 0x1378, + 0x9334, 0x2CD9, 0x9335, 0x2CDF, 0x9336, 0x1376, 0x9338, 0x2CC9, 0x9339, + 0x2CDE, 0x933C, 0x2CCA, 0x9346, 0x2CCF, 0x9347, 0x2E8D, 0x9349, 0x2E92, + 0x934A, 0x14A0, 0x934B, 0x14A2, 0x934C, 0x2E98, 0x934D, 0x149C, 0x934E, + 0x2EA6, 0x934F, 0x2E9E, 0x9350, 0x2E93, 0x9351, 0x2E94, 0x9352, 0x2E9D, + 0x9354, 0x14A9, 0x9355, 0x2E9C, 0x9356, 0x2E8C, 0x9357, 0x2E9B, 0x9358, + 0x2E8F, 0x9359, 0x2EA7, 0x935A, 0x14A8, 0x935B, 0x14A6, 0x935C, 0x2E90, + 0x935E, 0x2EA3, 0x9360, 0x2E95, 0x9361, 0x2EA2, 0x9363, 0x2EA4, 0x9364, + 0x2E8B, 0x9365, 0x14A1, 0x9367, 0x2EA5, 0x936A, 0x2E99, 0x936C, 0x14A5, + 0x936D, 0x2E96, 0x9370, 0x14A7, 0x9371, 0x2E9F, 0x9375, 0x149F, 0x9376, + 0x2E91, 0x9377, 0x2EA0, 0x9379, 0x2E9A, 0x937A, 0x2CC8, 0x937B, 0x2EA1, + 0x937C, 0x2E8E, 0x937E, 0x14A4, 0x9380, 0x3014, 0x9382, 0x149D, 0x9383, + 0x2E89, 0x9388, 0x3011, 0x9389, 0x300A, 0x938A, 0x1540, 0x938C, 0x3005, + 0x938D, 0x3015, 0x938E, 0x300C, 0x938F, 0x2E97, 0x9391, 0x3017, 0x9392, + 0x3006, 0x9394, 0x153F, 0x9395, 0x3010, 0x9396, 0x1541, 0x9397, 0x1549, + 0x9398, 0x1547, 0x9399, 0x3012, 0x939A, 0x1548, 0x939B, 0x3008, 0x939D, + 0x3009, 0x939E, 0x300E, 0x939F, 0x3013, 0x93A1, 0x2E88, 0x93A2, 0x1542, + 0x93A3, 0x301C, 0x93A4, 0x3019, 0x93A5, 0x3160, 0x93A6, 0x300F, 0x93A7, + 0x300B, 0x93A8, 0x301A, 0x93A9, 0x3155, 0x93AA, 0x300D, 0x93AC, 0x1545, + 0x93AE, 0x1544, 0x93AF, 0x2E8A, 0x93B0, 0x1546, 0x93B1, 0x3016, 0x93B2, + 0x3018, 0x93B3, 0x1543, 0x93B4, 0x301B, 0x93B5, 0x3004, 0x93B7, 0x3007, + 0x93C0, 0x315E, 0x93C2, 0x314E, 0x93C3, 0x15E0, 0x93C4, 0x315C, 0x93C7, + 0x314C, 0x93C8, 0x15E1, 0x93CA, 0x3157, 0x93CC, 0x3153, 0x93CD, 0x15E6, + 0x93CE, 0x315D, 0x93CF, 0x314D, 0x93D0, 0x3150, 0x93D1, 0x15DE, 0x93D2, + 0x315F, 0x93D4, 0x3158, 0x93D5, 0x315B, 0x93D6, 0x15E4, 0x93D7, 0x15E9, + 0x93D8, 0x15E7, 0x93D9, 0x3154, 0x93DA, 0x314F, 0x93DC, 0x15E2, 0x93DD, + 0x15E3, 0x93DE, 0x314B, 0x93DF, 0x15DF, 0x93E1, 0x15DD, 0x93E2, 0x15E5, + 0x93E3, 0x315A, 0x93E4, 0x15E8, 0x93E6, 0x3156, 0x93E7, 0x3161, 0x93E8, + 0x15EA, 0x93EC, 0x3152, 0x93EE, 0x3159, 0x93F5, 0x325A, 0x93F6, 0x3269, + 0x93F7, 0x325C, 0x93F8, 0x3263, 0x93F9, 0x3151, 0x93FA, 0x3261, 0x93FB, + 0x3250, 0x93FC, 0x3267, 0x93FD, 0x1654, 0x93FE, 0x3254, 0x93FF, 0x3266, + 0x9400, 0x325B, 0x9403, 0x1653, 0x9406, 0x326B, 0x9407, 0x325D, 0x9409, + 0x3262, 0x940A, 0x3265, 0x940B, 0x324E, 0x940C, 0x3268, 0x940D, 0x3259, + 0x940E, 0x325E, 0x940F, 0x3252, 0x9410, 0x3256, 0x9411, 0x326A, 0x9412, + 0x3260, 0x9413, 0x324F, 0x9414, 0x3253, 0x9415, 0x3255, 0x9416, 0x325F, + 0x9418, 0x1652, 0x9419, 0x3258, 0x9420, 0x3251, 0x9428, 0x3257, 0x9429, + 0x3325, 0x942A, 0x3329, 0x942B, 0x169F, 0x942C, 0x332B, 0x942E, 0x1699, + 0x9430, 0x3327, 0x9431, 0x332D, 0x9432, 0x169E, 0x9433, 0x169A, 0x9435, + 0x169B, 0x9436, 0x3324, 0x9437, 0x332A, 0x9438, 0x169D, 0x9439, 0x3328, + 0x943A, 0x169C, 0x943B, 0x3323, 0x943C, 0x3264, 0x943D, 0x3326, 0x943F, + 0x3322, 0x9440, 0x332C, 0x9444, 0x16DF, 0x9445, 0x33CD, 0x9446, 0x33D0, + 0x9447, 0x33CC, 0x9448, 0x33CE, 0x9449, 0x33CF, 0x944A, 0x33C9, 0x944B, + 0x33CA, 0x944C, 0x33C7, 0x944F, 0x33CB, 0x9450, 0x33C8, 0x9451, 0x16E0, + 0x9452, 0x16E1, 0x9455, 0x3448, 0x9457, 0x344A, 0x945D, 0x3449, 0x945E, + 0x344B, 0x9460, 0x170E, 0x9462, 0x3447, 0x9463, 0x170D, 0x9464, 0x170F, + 0x9468, 0x34A6, 0x9469, 0x34A7, 0x946A, 0x1731, 0x946B, 0x34A5, 0x946D, + 0x34ED, 0x946E, 0x34EC, 0x946F, 0x34EE, 0x9470, 0x174C, 0x9471, 0x34EF, + 0x9472, 0x174B, 0x9473, 0x34F0, 0x9474, 0x350C, 0x9475, 0x350F, 0x9476, + 0x350E, 0x9477, 0x1755, 0x9478, 0x350D, 0x947C, 0x175F, 0x947D, 0x175D, + 0x947E, 0x175E, 0x947F, 0x1764, 0x9480, 0x3539, 0x9481, 0x353A, 0x9482, + 0x3538, 0x9483, 0x3540, 0x9577, 0x0697, 0x957A, 0x20A1, 0x957B, 0x234A, + 0x957C, 0x2AB1, 0x957D, 0x3162, 0x9580, 0x0698, 0x9582, 0x0821, 0x9583, + 0x09EA, 0x9586, 0x20A2, 0x9588, 0x20A3, 0x9589, 0x0BD0, 0x958B, 0x0D9A, + 0x958C, 0x234C, 0x958D, 0x234B, 0x958E, 0x0D9E, 0x958F, 0x0D99, 0x9590, + 0x234D, 0x9591, 0x0D9B, 0x9592, 0x0D9D, 0x9593, 0x0D9C, 0x9594, 0x0D98, + 0x9598, 0x0F5C, 0x959B, 0x25F3, 0x959C, 0x25F1, 0x959E, 0x25F2, 0x959F, + 0x25F0, 0x95A1, 0x10DF, 0x95A3, 0x10E2, 0x95A4, 0x10E4, 0x95A5, 0x10E3, + 0x95A8, 0x10E0, 0x95A9, 0x10E1, 0x95AB, 0x2AB3, 0x95AC, 0x2AB2, 0x95AD, + 0x1260, 0x95AE, 0x2AB4, 0x95B0, 0x2AB5, 0x95B1, 0x1261, 0x95B5, 0x2CF0, + 0x95B6, 0x2CEE, 0x95B7, 0x2EAD, 0x95B9, 0x2CEC, 0x95BA, 0x2CED, 0x95BB, + 0x1385, 0x95BC, 0x2CE9, 0x95BD, 0x2CF1, 0x95BE, 0x2CEB, 0x95BF, 0x2CEF, + 0x95C0, 0x2EA9, 0x95C3, 0x2EAB, 0x95C5, 0x2EAC, 0x95C6, 0x14AE, 0x95C7, + 0x2EA8, 0x95C8, 0x14AD, 0x95C9, 0x2EAA, 0x95CA, 0x14AA, 0x95CB, 0x14AB, + 0x95CC, 0x14AC, 0x95CD, 0x2CEA, 0x95D0, 0x154C, 0x95D1, 0x301F, 0x95D2, + 0x301D, 0x95D3, 0x301E, 0x95D4, 0x154A, 0x95D5, 0x154D, 0x95D6, 0x154B, + 0x95DA, 0x3163, 0x95DB, 0x3164, 0x95DC, 0x15EB, 0x95DE, 0x326C, 0x95DF, + 0x326E, 0x95E0, 0x326D, 0x95E1, 0x1655, 0x95E2, 0x16A0, 0x95E3, 0x3330, + 0x95E4, 0x332F, 0x95E5, 0x332E, 0x961C, 0x0699, 0x961E, 0x17B4, 0x9620, + 0x1821, 0x9621, 0x0414, 0x9622, 0x181F, 0x9623, 0x1822, 0x9624, 0x1820, + 0x9628, 0x18F1, 0x962A, 0x0526, 0x962C, 0x0527, 0x962D, 0x18F3, 0x962E, + 0x0524, 0x962F, 0x18F2, 0x9630, 0x18F0, 0x9631, 0x0525, 0x9632, 0x0523, + 0x9639, 0x1A55, 0x963A, 0x1A58, 0x963B, 0x069C, 0x963C, 0x1A57, 0x963D, + 0x1A56, 0x963F, 0x069B, 0x9640, 0x069A, 0x9642, 0x069E, 0x9643, 0x1A59, + 0x9644, 0x069D, 0x964A, 0x1C1A, 0x964B, 0x0823, 0x964C, 0x0824, 0x964D, + 0x0825, 0x964E, 0x1C1B, 0x964F, 0x1C17, 0x9650, 0x0822, 0x9651, 0x1C18, + 0x9653, 0x1C19, 0x9654, 0x1C16, 0x9658, 0x09F1, 0x965B, 0x09EE, 0x965C, + 0x1E2F, 0x965D, 0x09EF, 0x965E, 0x09F2, 0x965F, 0x1E30, 0x9661, 0x09ED, + 0x9662, 0x09EB, 0x9663, 0x09EC, 0x9664, 0x09F0, 0x966A, 0x0BD1, 0x966B, + 0x20A6, 0x966C, 0x0BD9, 0x966D, 0x20A5, 0x966F, 0x20A8, 0x9670, 0x0BD5, + 0x9671, 0x20A7, 0x9672, 0x0DA6, 0x9673, 0x0BD3, 0x9674, 0x0BD6, 0x9675, + 0x0BD2, 0x9676, 0x0BD7, 0x9677, 0x0BD8, 0x9678, 0x0BD4, 0x967C, 0x20A4, + 0x967D, 0x0DA2, 0x967E, 0x234F, 0x9680, 0x2353, 0x9683, 0x2352, 0x9684, + 0x0DA7, 0x9685, 0x0DA3, 0x9686, 0x0DA4, 0x9687, 0x234E, 0x9688, 0x2350, + 0x9689, 0x2351, 0x968A, 0x0D9F, 0x968B, 0x0DA1, 0x968D, 0x0DA5, 0x968E, + 0x0DA0, 0x9691, 0x25F6, 0x9692, 0x25F4, 0x9693, 0x25F5, 0x9694, 0x0F5E, + 0x9695, 0x0F5F, 0x9697, 0x25F7, 0x9698, 0x0F5D, 0x9699, 0x10E5, 0x969B, + 0x10E7, 0x969C, 0x10E6, 0x969E, 0x2852, 0x96A1, 0x2853, 0x96A2, 0x2AB7, + 0x96A4, 0x2AB6, 0x96A7, 0x1386, 0x96A8, 0x1387, 0x96A9, 0x2CF2, 0x96AA, + 0x1388, 0x96AC, 0x2EB0, 0x96AE, 0x2EAE, 0x96B0, 0x2EAF, 0x96B1, 0x14AF, + 0x96B3, 0x3020, 0x96B4, 0x15EC, 0x96B6, 0x0231, 0x96B8, 0x14B0, 0x96B9, + 0x069F, 0x96BB, 0x09F3, 0x96BC, 0x1E31, 0x96BF, 0x20A9, 0x96C0, 0x0BDA, + 0x96C1, 0x0DA8, 0x96C2, 0x2354, 0x96C3, 0x2356, 0x96C4, 0x0DAA, 0x96C5, + 0x0DA9, 0x96C6, 0x0DAB, 0x96C7, 0x0DAC, 0x96C8, 0x2355, 0x96C9, 0x0F62, + 0x96CA, 0x0F63, 0x96CB, 0x0F61, 0x96CC, 0x10E8, 0x96CD, 0x0F60, 0x96CE, + 0x25F8, 0x96D2, 0x10E9, 0x96D3, 0x2AB8, 0x96D4, 0x2CF3, 0x96D5, 0x1389, + 0x96D6, 0x14B1, 0x96D7, 0x3021, 0x96D8, 0x3025, 0x96D9, 0x1550, 0x96DA, + 0x3022, 0x96DB, 0x1551, 0x96DC, 0x154F, 0x96DD, 0x3026, 0x96DE, 0x1552, + 0x96DF, 0x3024, 0x96E1, 0x3165, 0x96E2, 0x154E, 0x96E3, 0x15ED, 0x96E5, + 0x34A8, 0x96E8, 0x06A0, 0x96E9, 0x0BDC, 0x96EA, 0x0BDB, 0x96EF, 0x0DAD, + 0x96F0, 0x2358, 0x96F1, 0x2357, 0x96F2, 0x0DAE, 0x96F5, 0x25FC, 0x96F6, + 0x0F67, 0x96F7, 0x0F64, 0x96F8, 0x25FB, 0x96F9, 0x0F66, 0x96FA, 0x25F9, + 0x96FB, 0x0F65, 0x96FD, 0x25FA, 0x96FF, 0x2854, 0x9700, 0x10EA, 0x9702, + 0x2ABB, 0x9704, 0x1262, 0x9705, 0x2AB9, 0x9706, 0x1263, 0x9707, 0x1264, + 0x9708, 0x2ABA, 0x9709, 0x1265, 0x970B, 0x2CF4, 0x970D, 0x138D, 0x970E, + 0x138A, 0x970F, 0x138F, 0x9710, 0x2CF6, 0x9711, 0x138B, 0x9712, 0x2CF5, + 0x9713, 0x138E, 0x9716, 0x138C, 0x9718, 0x2EB3, 0x9719, 0x2EB5, 0x971C, + 0x14B2, 0x971D, 0x2EB4, 0x971E, 0x14B3, 0x971F, 0x2EB2, 0x9720, 0x2EB1, + 0x9722, 0x3028, 0x9723, 0x3027, 0x9724, 0x1553, 0x9725, 0x3029, 0x9726, + 0x316A, 0x9727, 0x15EF, 0x9728, 0x3169, 0x9729, 0x3166, 0x972A, 0x15EE, + 0x972B, 0x3167, 0x972C, 0x3168, 0x972E, 0x326F, 0x972F, 0x3270, 0x9730, + 0x1656, 0x9732, 0x16A3, 0x9735, 0x3331, 0x9738, 0x16A1, 0x9739, 0x16A2, + 0x973A, 0x3332, 0x973D, 0x16E2, 0x973E, 0x16E3, 0x973F, 0x33D1, 0x9742, + 0x1732, 0x9743, 0x34AA, 0x9744, 0x1734, 0x9746, 0x34A9, 0x9747, 0x34AB, + 0x9748, 0x1733, 0x9749, 0x34F1, 0x974B, 0x3526, 0x9752, 0x06A1, 0x9756, + 0x0F68, 0x9758, 0x2855, 0x975A, 0x2ABC, 0x975B, 0x1390, 0x975C, 0x1391, + 0x975E, 0x06A2, 0x9760, 0x1266, 0x9761, 0x15F0, 0x9762, 0x0826, 0x9766, + 0x1392, 0x9768, 0x1710, 0x9769, 0x0827, 0x976A, 0x20AA, 0x976C, 0x2359, + 0x976E, 0x235B, 0x9770, 0x235A, 0x9772, 0x2600, 0x9773, 0x25FD, 0x9774, + 0x0F69, 0x9776, 0x0F6A, 0x9777, 0x25FE, 0x9778, 0x25FF, 0x977A, 0x2857, + 0x977B, 0x285C, 0x977C, 0x10EB, 0x977D, 0x2856, 0x977E, 0x2858, 0x977F, + 0x285F, 0x9780, 0x285A, 0x9781, 0x285E, 0x9782, 0x285B, 0x9783, 0x2859, + 0x9784, 0x285D, 0x9785, 0x10EC, 0x9788, 0x2ABF, 0x978A, 0x2ABD, 0x978B, + 0x1268, 0x978D, 0x1267, 0x978E, 0x2ABE, 0x978F, 0x1269, 0x9794, 0x2CF9, + 0x9797, 0x2CF8, 0x9798, 0x1393, 0x9799, 0x2CF7, 0x979A, 0x2EB6, 0x979C, + 0x2EB8, 0x979D, 0x2EBA, 0x979E, 0x2EB9, 0x97A0, 0x14B4, 0x97A1, 0x2EB7, + 0x97A2, 0x3030, 0x97A3, 0x1554, 0x97A4, 0x302E, 0x97A5, 0x3031, 0x97A6, + 0x1555, 0x97A8, 0x302C, 0x97AA, 0x302F, 0x97AB, 0x302D, 0x97AC, 0x302A, + 0x97AD, 0x1556, 0x97AE, 0x302B, 0x97B3, 0x316B, 0x97B6, 0x316D, 0x97B7, + 0x316C, 0x97B9, 0x3271, 0x97BB, 0x3272, 0x97BF, 0x3333, 0x97C1, 0x16E5, + 0x97C3, 0x16E4, 0x97C4, 0x344C, 0x97C5, 0x344D, 0x97C6, 0x1735, 0x97C7, + 0x34AC, 0x97C9, 0x1756, 0x97CB, 0x0828, 0x97CC, 0x0DAF, 0x97CD, 0x2861, + 0x97CE, 0x2860, 0x97CF, 0x2AC1, 0x97D0, 0x2AC0, 0x97D3, 0x14B5, 0x97D4, + 0x2EBC, 0x97D5, 0x2EBB, 0x97D6, 0x3034, 0x97D7, 0x3032, 0x97D8, 0x3035, + 0x97D9, 0x3033, 0x97DC, 0x15F1, 0x97DD, 0x316E, 0x97DE, 0x316F, 0x97DF, + 0x3170, 0x97E1, 0x3334, 0x97E3, 0x33D2, 0x97E5, 0x34AD, 0x97ED, 0x0829, + 0x97F0, 0x2CFA, 0x97F1, 0x2EBD, 0x97F3, 0x082A, 0x97F6, 0x10ED, 0x97F8, + 0x2CFB, 0x97F9, 0x1557, 0x97FA, 0x3036, 0x97FB, 0x15F2, 0x97FD, 0x3273, + 0x97FE, 0x3274, 0x97FF, 0x16A4, 0x9800, 0x344E, 0x9801, 0x082B, 0x9802, + 0x0BDF, 0x9803, 0x0BE0, 0x9804, 0x20AB, 0x9805, 0x0DB0, 0x9806, 0x0DB1, + 0x9807, 0x235C, 0x9808, 0x0DB2, 0x980A, 0x0F6E, 0x980C, 0x0F70, 0x980D, + 0x2602, 0x980E, 0x2603, 0x980F, 0x2601, 0x9810, 0x0F6B, 0x9811, 0x0F6C, + 0x9812, 0x0F6F, 0x9813, 0x0F6D, 0x9816, 0x2862, 0x9817, 0x10EE, 0x9818, + 0x10EF, 0x981B, 0x2AC8, 0x981C, 0x126C, 0x981D, 0x2AC3, 0x981E, 0x2AC2, + 0x9820, 0x2AC7, 0x9821, 0x126A, 0x9824, 0x139A, 0x9826, 0x2AC4, 0x9827, + 0x2AC9, 0x9828, 0x2AC6, 0x9829, 0x2AC5, 0x982B, 0x126B, 0x982D, 0x1398, + 0x982F, 0x2CFD, 0x9830, 0x1394, 0x9832, 0x2CFE, 0x9835, 0x2CFC, 0x9837, + 0x1397, 0x9838, 0x1395, 0x9839, 0x1399, 0x983B, 0x1396, 0x9841, 0x2EBE, + 0x9843, 0x2EC3, 0x9844, 0x2EBF, 0x9845, 0x2EC2, 0x9846, 0x14B6, 0x9848, + 0x2DF2, 0x9849, 0x2EC1, 0x984A, 0x2EC0, 0x984C, 0x155A, 0x984D, 0x1558, + 0x984E, 0x155B, 0x984F, 0x1559, 0x9850, 0x3037, 0x9851, 0x3038, 0x9852, + 0x3039, 0x9853, 0x155C, 0x9857, 0x3174, 0x9858, 0x15F4, 0x9859, 0x3172, + 0x985B, 0x15F5, 0x985C, 0x3171, 0x985D, 0x3173, 0x985E, 0x15F3, 0x985F, + 0x3278, 0x9860, 0x3275, 0x9862, 0x3276, 0x9863, 0x3277, 0x9864, 0x3335, + 0x9865, 0x16A6, 0x9867, 0x16A5, 0x9869, 0x33D4, 0x986A, 0x33D3, 0x986B, + 0x16E6, 0x986F, 0x1711, 0x9870, 0x1736, 0x9871, 0x174D, 0x9872, 0x34F2, + 0x9873, 0x3527, 0x9874, 0x3528, 0x98A8, 0x082C, 0x98A9, 0x235D, 0x98AC, + 0x2604, 0x98AD, 0x2863, 0x98AE, 0x2864, 0x98AF, 0x10F0, 0x98B1, 0x10F1, + 0x98B2, 0x2ACA, 0x98B3, 0x126D, 0x98B6, 0x14B7, 0x98B8, 0x303A, 0x98BA, + 0x155D, 0x98BB, 0x3177, 0x98BC, 0x15F6, 0x98BD, 0x3176, 0x98BE, 0x3178, + 0x98BF, 0x3175, 0x98C0, 0x3338, 0x98C1, 0x3279, 0x98C2, 0x327A, 0x98C4, + 0x1657, 0x98C6, 0x3337, 0x98C9, 0x3336, 0x98CB, 0x33D5, 0x98CC, 0x3529, + 0x98DB, 0x082D, 0x98DF, 0x082E, 0x98E2, 0x09F4, 0x98E3, 0x1E32, 0x98E5, + 0x20AC, 0x98E7, 0x0DB3, 0x98E9, 0x0DB6, 0x98EA, 0x0DB4, 0x98EB, 0x235E, + 0x98ED, 0x0DB8, 0x98EF, 0x0DB5, 0x98F2, 0x0DB7, 0x98F4, 0x0F72, 0x98F6, + 0x2605, 0x98F9, 0x2606, 0x98FA, 0x2ACC, 0x98FC, 0x0F71, 0x98FD, 0x0F73, + 0x98FE, 0x0F74, 0x9900, 0x2866, 0x9902, 0x2865, 0x9903, 0x10F2, 0x9905, + 0x10F3, 0x9907, 0x2867, 0x9908, 0x2ACB, 0x9909, 0x10F5, 0x990A, 0x126E, + 0x990C, 0x10F4, 0x9910, 0x139B, 0x9911, 0x2ACD, 0x9912, 0x1270, 0x9913, + 0x126F, 0x9914, 0x2ACE, 0x9915, 0x2AD1, 0x9916, 0x2ACF, 0x9917, 0x2AD0, + 0x9918, 0x1271, 0x991A, 0x13A0, 0x991B, 0x139E, 0x991E, 0x139D, 0x991F, + 0x2D00, 0x9921, 0x139F, 0x9924, 0x2CFF, 0x9925, 0x2EC4, 0x9927, 0x2D01, + 0x9928, 0x139C, 0x9929, 0x2D02, 0x992A, 0x2EC7, 0x992B, 0x2EC5, 0x992C, + 0x2EC6, 0x992D, 0x2ECB, 0x992E, 0x1561, 0x992F, 0x2ECA, 0x9930, 0x2ECD, + 0x9931, 0x2ECC, 0x9932, 0x2EC9, 0x9933, 0x2EC8, 0x9935, 0x14B8, 0x993A, + 0x303D, 0x993C, 0x303C, 0x993D, 0x1560, 0x993E, 0x155E, 0x993F, 0x155F, + 0x9941, 0x303B, 0x9943, 0x317B, 0x9945, 0x15F7, 0x9947, 0x317A, 0x9948, + 0x3179, 0x9949, 0x15F8, 0x994B, 0x327F, 0x994C, 0x327E, 0x994E, 0x327C, + 0x9950, 0x327B, 0x9951, 0x1659, 0x9952, 0x1658, 0x9953, 0x3280, 0x9954, + 0x33D6, 0x9955, 0x16E7, 0x9956, 0x333A, 0x9957, 0x16A7, 0x9958, 0x3339, + 0x9959, 0x327D, 0x995B, 0x33D7, 0x995C, 0x1712, 0x995E, 0x174E, 0x995F, + 0x34F3, 0x9961, 0x352A, 0x9996, 0x082F, 0x9997, 0x20AD, 0x9998, 0x2ECE, + 0x9999, 0x0830, 0x999C, 0x2869, 0x999D, 0x2868, 0x999E, 0x2D03, 0x99A1, + 0x2ED0, 0x99A3, 0x2ECF, 0x99A5, 0x1562, 0x99A6, 0x317C, 0x99A7, 0x317D, + 0x99A8, 0x165A, 0x99AB, 0x352B, 0x99AC, 0x09F5, 0x99AD, 0x0DBA, 0x99AE, + 0x0DB9, 0x99AF, 0x2607, 0x99B0, 0x2609, 0x99B1, 0x0F76, 0x99B2, 0x2608, + 0x99B3, 0x0F75, 0x99B4, 0x0F77, 0x99B5, 0x260A, 0x99B9, 0x286B, 0x99BA, + 0x286D, 0x99BB, 0x286C, 0x99BD, 0x286F, 0x99C1, 0x10F6, 0x99C2, 0x286E, + 0x99C3, 0x286A, 0x99C7, 0x2870, 0x99C9, 0x2AD8, 0x99CB, 0x2ADB, 0x99CC, + 0x2ADD, 0x99CD, 0x2AD3, 0x99CE, 0x2AD7, 0x99CF, 0x2AD4, 0x99D0, 0x1273, + 0x99D1, 0x1276, 0x99D2, 0x1278, 0x99D3, 0x2AD5, 0x99D4, 0x2AD6, 0x99D5, + 0x1277, 0x99D6, 0x2AD9, 0x99D7, 0x2ADC, 0x99D8, 0x2ADA, 0x99D9, 0x1279, + 0x99DB, 0x1275, 0x99DC, 0x2AD2, 0x99DD, 0x1272, 0x99DF, 0x1274, 0x99E2, + 0x13A2, 0x99E3, 0x2D09, 0x99E4, 0x2D07, 0x99E5, 0x2D06, 0x99E7, 0x2D0C, + 0x99E9, 0x2D0B, 0x99EA, 0x2D0A, 0x99EC, 0x2D05, 0x99ED, 0x13A1, 0x99EE, + 0x2D04, 0x99F0, 0x2D08, 0x99F1, 0x13A3, 0x99F4, 0x2ED3, 0x99F6, 0x2ED7, + 0x99F7, 0x2ED4, 0x99F8, 0x2ED6, 0x99F9, 0x2ED5, 0x99FA, 0x2ED2, 0x99FB, + 0x2ED8, 0x99FC, 0x2EDB, 0x99FD, 0x2ED9, 0x99FE, 0x2EDA, 0x99FF, 0x14BA, + 0x9A01, 0x14B9, 0x9A02, 0x2ED1, 0x9A03, 0x2EDC, 0x9A04, 0x3042, 0x9A05, + 0x3045, 0x9A06, 0x3047, 0x9A07, 0x3046, 0x9A09, 0x3040, 0x9A0A, 0x3044, + 0x9A0B, 0x303F, 0x9A0D, 0x3041, 0x9A0E, 0x1563, 0x9A0F, 0x303E, 0x9A11, + 0x3043, 0x9A14, 0x318A, 0x9A15, 0x317F, 0x9A16, 0x15F9, 0x9A19, 0x15FA, + 0x9A1A, 0x317E, 0x9A1B, 0x3183, 0x9A1C, 0x3189, 0x9A1D, 0x3181, 0x9A1E, + 0x3188, 0x9A20, 0x3185, 0x9A22, 0x3184, 0x9A23, 0x3187, 0x9A24, 0x3182, + 0x9A25, 0x3180, 0x9A27, 0x3186, 0x9A29, 0x3287, 0x9A2A, 0x3285, 0x9A2B, + 0x165B, 0x9A2C, 0x3284, 0x9A2D, 0x328A, 0x9A2E, 0x3288, 0x9A30, 0x165C, + 0x9A31, 0x3283, 0x9A32, 0x3281, 0x9A34, 0x3282, 0x9A35, 0x165E, 0x9A36, + 0x3286, 0x9A37, 0x165D, 0x9A38, 0x3289, 0x9A39, 0x333B, 0x9A3A, 0x3341, + 0x9A3D, 0x333C, 0x9A3E, 0x16AB, 0x9A3F, 0x3342, 0x9A40, 0x16AA, 0x9A41, + 0x3340, 0x9A42, 0x333F, 0x9A43, 0x16A9, 0x9A44, 0x333E, 0x9A45, 0x16A8, + 0x9A46, 0x333D, 0x9A48, 0x33DD, 0x9A49, 0x33DF, 0x9A4A, 0x33DE, 0x9A4C, + 0x33DB, 0x9A4D, 0x16E9, 0x9A4E, 0x33D8, 0x9A4F, 0x33DC, 0x9A50, 0x33E1, + 0x9A52, 0x33E0, 0x9A53, 0x33D9, 0x9A54, 0x33DA, 0x9A55, 0x16E8, 0x9A56, + 0x344F, 0x9A57, 0x1715, 0x9A59, 0x3450, 0x9A5A, 0x1713, 0x9A5B, 0x1714, + 0x9A5E, 0x34AE, 0x9A5F, 0x1737, 0x9A60, 0x3510, 0x9A62, 0x1757, 0x9A64, + 0x352C, 0x9A65, 0x1758, 0x9A66, 0x352D, 0x9A67, 0x352E, 0x9A68, 0x353C, + 0x9A69, 0x353B, 0x9A6A, 0x1767, 0x9A6B, 0x3544, 0x9AA8, 0x09F6, 0x9AAB, + 0x260C, 0x9AAD, 0x260B, 0x9AAF, 0x10F7, 0x9AB0, 0x10F8, 0x9AB1, 0x2871, + 0x9AB3, 0x2ADE, 0x9AB4, 0x2D0F, 0x9AB7, 0x127A, 0x9AB8, 0x13A4, 0x9AB9, + 0x2D0D, 0x9ABB, 0x2D10, 0x9ABC, 0x13A5, 0x9ABE, 0x2EDD, 0x9ABF, 0x2D0E, + 0x9AC0, 0x3048, 0x9AC1, 0x1564, 0x9AC2, 0x318B, 0x9AC6, 0x328D, 0x9AC7, + 0x328B, 0x9ACA, 0x328C, 0x9ACD, 0x3343, 0x9ACF, 0x16AC, 0x9AD0, 0x33E2, + 0x9AD1, 0x1718, 0x9AD2, 0x16EA, 0x9AD3, 0x1716, 0x9AD4, 0x1717, 0x9AD5, + 0x34AF, 0x9AD6, 0x174F, 0x9AD8, 0x09F7, 0x9ADC, 0x3049, 0x9ADF, 0x1E33, + 0x9AE1, 0x0F78, 0x9AE3, 0x2872, 0x9AE6, 0x10F9, 0x9AE7, 0x2873, 0x9AEB, + 0x2AE0, 0x9AEC, 0x2ADF, 0x9AED, 0x13A7, 0x9AEE, 0x127B, 0x9AEF, 0x127C, + 0x9AF1, 0x2AE3, 0x9AF2, 0x2AE2, 0x9AF3, 0x2AE1, 0x9AF6, 0x2D11, 0x9AF7, + 0x2D14, 0x9AF9, 0x2D13, 0x9AFA, 0x2D12, 0x9AFB, 0x13A6, 0x9AFC, 0x2EE1, + 0x9AFD, 0x2EDF, 0x9AFE, 0x2EDE, 0x9B01, 0x2EE0, 0x9B03, 0x1565, 0x9B04, + 0x304B, 0x9B05, 0x304C, 0x9B06, 0x1566, 0x9B08, 0x304A, 0x9B0A, 0x318D, + 0x9B0B, 0x318C, 0x9B0C, 0x318F, 0x9B0D, 0x15FB, 0x9B0E, 0x318E, 0x9B10, + 0x328E, 0x9B11, 0x3290, 0x9B12, 0x328F, 0x9B15, 0x3344, 0x9B16, 0x3347, + 0x9B17, 0x3345, 0x9B18, 0x3346, 0x9B19, 0x33E3, 0x9B1A, 0x16EB, 0x9B1E, + 0x3451, 0x9B1F, 0x3452, 0x9B20, 0x3453, 0x9B22, 0x1738, 0x9B23, 0x1750, + 0x9B24, 0x352F, 0x9B25, 0x09F8, 0x9B27, 0x127D, 0x9B28, 0x13A8, 0x9B29, + 0x304D, 0x9B2B, 0x33E4, 0x9B2E, 0x3511, 0x9B2F, 0x1E34, 0x9B31, 0x1768, + 0x9B32, 0x09F9, 0x9B33, 0x2D15, 0x9B35, 0x304E, 0x9B37, 0x3190, 0x9B3A, + 0x3348, 0x9B3B, 0x33E5, 0x9B3C, 0x09FA, 0x9B3E, 0x2874, 0x9B3F, 0x2875, + 0x9B41, 0x10FA, 0x9B42, 0x10FB, 0x9B43, 0x2AE5, 0x9B44, 0x127F, 0x9B45, + 0x127E, 0x9B46, 0x2AE4, 0x9B48, 0x2EE2, 0x9B4A, 0x304F, 0x9B4B, 0x3051, + 0x9B4C, 0x3050, 0x9B4D, 0x1569, 0x9B4E, 0x1568, 0x9B4F, 0x1567, 0x9B51, + 0x16AE, 0x9B52, 0x3349, 0x9B54, 0x16AD, 0x9B55, 0x33E7, 0x9B56, 0x33E6, + 0x9B58, 0x1739, 0x9B59, 0x34B0, 0x9B5A, 0x0BE1, 0x9B5B, 0x260D, 0x9B5F, + 0x2878, 0x9B60, 0x2876, 0x9B61, 0x2877, 0x9B64, 0x2AEE, 0x9B66, 0x2AE9, + 0x9B67, 0x2AE6, 0x9B68, 0x2AED, 0x9B6C, 0x2AEF, 0x9B6F, 0x1281, 0x9B70, + 0x2AEC, 0x9B71, 0x2AE8, 0x9B74, 0x2AE7, 0x9B75, 0x2AEB, 0x9B76, 0x2AEA, + 0x9B77, 0x1280, 0x9B7A, 0x2D20, 0x9B7B, 0x2D1B, 0x9B7C, 0x2D19, 0x9B7D, + 0x2D22, 0x9B7E, 0x2D1A, 0x9B80, 0x2D16, 0x9B82, 0x2D1C, 0x9B85, 0x2D17, + 0x9B86, 0x2EEB, 0x9B87, 0x2D18, 0x9B88, 0x2D23, 0x9B90, 0x2D1F, 0x9B91, + 0x13A9, 0x9B92, 0x2D1E, 0x9B93, 0x2D1D, 0x9B95, 0x2D21, 0x9B9A, 0x2EE3, + 0x9B9B, 0x2EE6, 0x9B9E, 0x2EE5, 0x9BA0, 0x2EED, 0x9BA1, 0x2EE8, 0x9BA2, + 0x2EEC, 0x9BA4, 0x2EEA, 0x9BA5, 0x2EE9, 0x9BA6, 0x2EE7, 0x9BA8, 0x2EE4, + 0x9BAA, 0x14BD, 0x9BAB, 0x14BC, 0x9BAD, 0x14BE, 0x9BAE, 0x14BB, 0x9BAF, + 0x2EEE, 0x9BB5, 0x3057, 0x9BB6, 0x305A, 0x9BB8, 0x3058, 0x9BB9, 0x305C, + 0x9BBD, 0x305D, 0x9BBF, 0x3055, 0x9BC0, 0x156E, 0x9BC1, 0x3056, 0x9BC3, + 0x3054, 0x9BC4, 0x305B, 0x9BC6, 0x3053, 0x9BC7, 0x3052, 0x9BC8, 0x156D, + 0x9BC9, 0x156B, 0x9BCA, 0x156A, 0x9BD3, 0x3059, 0x9BD4, 0x3199, 0x9BD5, + 0x319F, 0x9BD6, 0x15FE, 0x9BD7, 0x319A, 0x9BD9, 0x319D, 0x9BDA, 0x31A1, + 0x9BDB, 0x15FF, 0x9BDC, 0x319C, 0x9BDE, 0x3194, 0x9BE0, 0x3193, 0x9BE1, + 0x31A0, 0x9BE2, 0x3197, 0x9BE4, 0x3195, 0x9BE5, 0x319E, 0x9BE6, 0x3196, + 0x9BE7, 0x15FD, 0x9BE8, 0x15FC, 0x9BEA, 0x3191, 0x9BEB, 0x3192, 0x9BEC, + 0x319B, 0x9BF0, 0x3198, 0x9BF7, 0x3293, 0x9BF8, 0x3296, 0x9BFD, 0x156C, + 0x9C05, 0x3294, 0x9C06, 0x329A, 0x9C07, 0x3298, 0x9C08, 0x3292, 0x9C09, + 0x329D, 0x9C0B, 0x3291, 0x9C0D, 0x1660, 0x9C0E, 0x3299, 0x9C12, 0x3295, + 0x9C13, 0x165F, 0x9C14, 0x329C, 0x9C17, 0x329B, 0x9C1C, 0x334C, 0x9C1D, + 0x334B, 0x9C21, 0x3352, 0x9C23, 0x334E, 0x9C24, 0x3351, 0x9C25, 0x16B0, + 0x9C28, 0x334F, 0x9C29, 0x3350, 0x9C2B, 0x334A, 0x9C2C, 0x334D, 0x9C2D, + 0x16AF, 0x9C31, 0x16ED, 0x9C32, 0x33F2, 0x9C33, 0x33ED, 0x9C34, 0x33F1, + 0x9C36, 0x33F4, 0x9C37, 0x33F0, 0x9C39, 0x33EC, 0x9C3B, 0x16EF, 0x9C3C, + 0x33EF, 0x9C3D, 0x33F3, 0x9C3E, 0x16EE, 0x9C3F, 0x33EA, 0x9C40, 0x3297, + 0x9C41, 0x33EE, 0x9C44, 0x33EB, 0x9C46, 0x33E8, 0x9C48, 0x33E9, 0x9C49, + 0x16EC, 0x9C4A, 0x3457, 0x9C4B, 0x3459, 0x9C4C, 0x345C, 0x9C4D, 0x3458, + 0x9C4E, 0x345D, 0x9C50, 0x3456, 0x9C52, 0x3454, 0x9C54, 0x1719, 0x9C55, + 0x345A, 0x9C56, 0x171B, 0x9C57, 0x171A, 0x9C58, 0x3455, 0x9C59, 0x345B, + 0x9C5E, 0x34B5, 0x9C5F, 0x173A, 0x9C60, 0x34B6, 0x9C62, 0x34B4, 0x9C63, + 0x34B1, 0x9C66, 0x34B3, 0x9C67, 0x34B2, 0x9C68, 0x34F4, 0x9C6D, 0x34F6, + 0x9C6E, 0x34F5, 0x9C71, 0x3514, 0x9C73, 0x3513, 0x9C74, 0x3512, 0x9C75, + 0x3515, 0x9C77, 0x1760, 0x9C78, 0x1761, 0x9C79, 0x3541, 0x9C7A, 0x3545, + 0x9CE5, 0x0BE2, 0x9CE6, 0x235F, 0x9CE7, 0x2610, 0x9CE9, 0x0F79, 0x9CEA, + 0x260E, 0x9CED, 0x260F, 0x9CF1, 0x2879, 0x9CF2, 0x287A, 0x9CF3, 0x10FE, + 0x9CF4, 0x10FC, 0x9CF5, 0x287B, 0x9CF6, 0x10FD, 0x9CF7, 0x2AF4, 0x9CF9, + 0x2AF7, 0x9CFA, 0x2AF1, 0x9CFB, 0x2AF8, 0x9CFC, 0x2AF0, 0x9CFD, 0x2AF2, + 0x9CFF, 0x2AF3, 0x9D00, 0x2AF6, 0x9D03, 0x1284, 0x9D04, 0x2AFB, 0x9D05, + 0x2AFA, 0x9D06, 0x1282, 0x9D07, 0x2AF5, 0x9D08, 0x2AF9, 0x9D09, 0x1283, + 0x9D10, 0x2D2D, 0x9D12, 0x13AE, 0x9D14, 0x2D28, 0x9D15, 0x13AA, 0x9D17, + 0x2D25, 0x9D18, 0x2D2B, 0x9D19, 0x2D2E, 0x9D1B, 0x13AF, 0x9D1D, 0x2D2A, + 0x9D1E, 0x2D27, 0x9D1F, 0x2D2F, 0x9D20, 0x2D26, 0x9D22, 0x2D2C, 0x9D23, + 0x13AB, 0x9D25, 0x2D24, 0x9D26, 0x13AC, 0x9D28, 0x13AD, 0x9D29, 0x2D29, + 0x9D2D, 0x2F00, 0x9D2E, 0x2EF3, 0x9D2F, 0x2EF4, 0x9D30, 0x2EF7, 0x9D31, + 0x2EF5, 0x9D33, 0x2EEF, 0x9D36, 0x2EF2, 0x9D37, 0x2EFC, 0x9D38, 0x2EF6, + 0x9D3B, 0x14BF, 0x9D3D, 0x2EFE, 0x9D3E, 0x2EFB, 0x9D3F, 0x14C0, 0x9D40, + 0x2EFD, 0x9D41, 0x2EF0, 0x9D42, 0x2EF9, 0x9D43, 0x2EFA, 0x9D45, 0x2EF8, + 0x9D4A, 0x3061, 0x9D4B, 0x3063, 0x9D4C, 0x3066, 0x9D4F, 0x3060, 0x9D51, + 0x156F, 0x9D52, 0x3068, 0x9D53, 0x305F, 0x9D54, 0x3069, 0x9D56, 0x3065, + 0x9D57, 0x3067, 0x9D58, 0x306B, 0x9D59, 0x3064, 0x9D5A, 0x306C, 0x9D5B, + 0x3062, 0x9D5C, 0x305E, 0x9D5D, 0x1570, 0x9D5F, 0x306A, 0x9D60, 0x1571, + 0x9D61, 0x1601, 0x9D67, 0x2EF1, 0x9D68, 0x31BB, 0x9D69, 0x31B2, 0x9D6A, + 0x1603, 0x9D6B, 0x31AE, 0x9D6C, 0x1604, 0x9D6F, 0x31B7, 0x9D70, 0x31B1, + 0x9D71, 0x31A7, 0x9D72, 0x1602, 0x9D73, 0x31B4, 0x9D74, 0x31AF, 0x9D75, + 0x31B0, 0x9D77, 0x31A2, 0x9D78, 0x31A9, 0x9D79, 0x31B8, 0x9D7B, 0x31B5, + 0x9D7D, 0x31AD, 0x9D7F, 0x31B9, 0x9D80, 0x31A8, 0x9D81, 0x31A3, 0x9D82, + 0x31B6, 0x9D84, 0x31A5, 0x9D85, 0x31B3, 0x9D86, 0x31AA, 0x9D87, 0x31BA, + 0x9D88, 0x31A6, 0x9D89, 0x1600, 0x9D8A, 0x31A4, 0x9D8B, 0x31AB, 0x9D8C, + 0x31AC, 0x9D90, 0x32A4, 0x9D92, 0x32A2, 0x9D94, 0x32A7, 0x9D96, 0x32B3, + 0x9D97, 0x32AA, 0x9D98, 0x32A3, 0x9D99, 0x329F, 0x9D9A, 0x32AC, 0x9D9B, + 0x32A5, 0x9D9C, 0x32A8, 0x9D9D, 0x32A1, 0x9D9E, 0x32AF, 0x9D9F, 0x329E, + 0x9DA0, 0x32A6, 0x9DA1, 0x32AB, 0x9DA2, 0x32AD, 0x9DA3, 0x32B0, 0x9DA4, + 0x32A0, 0x9DA6, 0x32B4, 0x9DA7, 0x32B5, 0x9DA8, 0x32AE, 0x9DA9, 0x32B2, + 0x9DAA, 0x32A9, 0x9DAC, 0x3362, 0x9DAD, 0x3365, 0x9DAF, 0x16B1, 0x9DB1, + 0x3364, 0x9DB2, 0x3369, 0x9DB3, 0x3367, 0x9DB4, 0x16B2, 0x9DB5, 0x335E, + 0x9DB6, 0x3354, 0x9DB7, 0x3353, 0x9DB8, 0x16B4, 0x9DB9, 0x3360, 0x9DBA, + 0x3361, 0x9DBB, 0x335D, 0x9DBC, 0x3355, 0x9DBE, 0x335A, 0x9DBF, 0x32B1, + 0x9DC1, 0x3356, 0x9DC2, 0x16B3, 0x9DC3, 0x335C, 0x9DC5, 0x335B, 0x9DC7, + 0x3357, 0x9DC8, 0x3363, 0x9DCA, 0x3358, 0x9DCB, 0x33F9, 0x9DCC, 0x3366, + 0x9DCD, 0x3368, 0x9DCE, 0x335F, 0x9DCF, 0x3359, 0x9DD0, 0x33FA, 0x9DD1, + 0x33FC, 0x9DD2, 0x33F6, 0x9DD3, 0x16F0, 0x9DD5, 0x3403, 0x9DD6, 0x3401, + 0x9DD7, 0x16F1, 0x9DD8, 0x3400, 0x9DD9, 0x33FF, 0x9DDA, 0x33F8, 0x9DDB, + 0x33F5, 0x9DDC, 0x33FB, 0x9DDD, 0x3404, 0x9DDE, 0x33F7, 0x9DDF, 0x33FD, + 0x9DE1, 0x3466, 0x9DE2, 0x346B, 0x9DE3, 0x3461, 0x9DE4, 0x3464, 0x9DE5, + 0x171C, 0x9DE6, 0x3468, 0x9DE8, 0x346F, 0x9DE9, 0x33FE, 0x9DEB, 0x3462, + 0x9DEC, 0x346C, 0x9DED, 0x3470, 0x9DEE, 0x3467, 0x9DEF, 0x3460, 0x9DF0, + 0x346A, 0x9DF2, 0x3469, 0x9DF3, 0x346E, 0x9DF4, 0x346D, 0x9DF5, 0x3402, + 0x9DF6, 0x3465, 0x9DF7, 0x345F, 0x9DF8, 0x3463, 0x9DF9, 0x173B, 0x9DFA, + 0x173C, 0x9DFB, 0x345E, 0x9DFD, 0x34C1, 0x9DFE, 0x34B8, 0x9DFF, 0x34C0, + 0x9E00, 0x34BD, 0x9E01, 0x34BE, 0x9E02, 0x34B7, 0x9E03, 0x34BA, 0x9E04, + 0x34C2, 0x9E05, 0x34BC, 0x9E06, 0x34BB, 0x9E07, 0x34B9, 0x9E09, 0x34BF, + 0x9E0B, 0x34F7, 0x9E0D, 0x34F8, 0x9E0F, 0x34FA, 0x9E10, 0x34F9, 0x9E11, + 0x34FC, 0x9E12, 0x34FB, 0x9E13, 0x3517, 0x9E14, 0x3516, 0x9E15, 0x3530, + 0x9E17, 0x3531, 0x9E19, 0x353D, 0x9E1A, 0x1765, 0x9E1B, 0x1769, 0x9E1D, + 0x3546, 0x9E1E, 0x176A, 0x9E75, 0x0BE3, 0x9E79, 0x1661, 0x9E7A, 0x336A, + 0x9E7C, 0x173D, 0x9E7D, 0x173E, 0x9E7F, 0x0BE4, 0x9E80, 0x2611, 0x9E82, + 0x0F7A, 0x9E83, 0x2AFC, 0x9E86, 0x2D31, 0x9E87, 0x2D32, 0x9E88, 0x2D30, + 0x9E89, 0x2F02, 0x9E8A, 0x2F01, 0x9E8B, 0x14C1, 0x9E8C, 0x306E, 0x9E8D, + 0x2F03, 0x9E8E, 0x306D, 0x9E91, 0x31BD, 0x9E92, 0x1605, 0x9E93, 0x1607, + 0x9E94, 0x31BC, 0x9E97, 0x1606, 0x9E99, 0x32B6, 0x9E9A, 0x32B8, 0x9E9B, + 0x32B7, 0x9E9C, 0x336B, 0x9E9D, 0x16B5, 0x9E9F, 0x171D, 0x9EA0, 0x34C3, + 0x9EA1, 0x34FD, 0x9EA4, 0x354A, 0x9EA5, 0x0BE5, 0x9EA7, 0x287C, 0x9EA9, + 0x1285, 0x9EAD, 0x2D34, 0x9EAE, 0x2D33, 0x9EB0, 0x2F04, 0x9EB4, 0x1608, + 0x9EB5, 0x1662, 0x9EB6, 0x3405, 0x9EB7, 0x3542, 0x9EBB, 0x0BE6, 0x9EBC, + 0x10FF, 0x9EBE, 0x1286, 0x9EC0, 0x31BE, 0x9EC2, 0x3471, 0x9EC3, 0x0DBB, + 0x9EC8, 0x2F05, 0x9ECC, 0x1751, 0x9ECD, 0x0DBC, 0x9ECE, 0x1287, 0x9ECF, + 0x14C2, 0x9ED0, 0x3472, 0x9ED1, 0x0DBD, 0x9ED3, 0x2AFD, 0x9ED4, 0x13B1, + 0x9ED5, 0x2D35, 0x9ED6, 0x2D36, 0x9ED8, 0x13B0, 0x9EDA, 0x2F06, 0x9EDB, + 0x14C6, 0x9EDC, 0x14C4, 0x9EDD, 0x14C5, 0x9EDE, 0x14C3, 0x9EDF, 0x306F, + 0x9EE0, 0x1572, 0x9EE4, 0x32BA, 0x9EE5, 0x32B9, 0x9EE6, 0x32BC, 0x9EE7, + 0x32BB, 0x9EE8, 0x1663, 0x9EEB, 0x336C, 0x9EED, 0x336E, 0x9EEE, 0x336D, + 0x9EEF, 0x16B6, 0x9EF0, 0x3406, 0x9EF2, 0x3473, 0x9EF3, 0x3474, 0x9EF4, + 0x171E, 0x9EF5, 0x34FE, 0x9EF6, 0x3518, 0x9EF7, 0x1762, 0x9EF9, 0x2360, + 0x9EFA, 0x2D37, 0x9EFB, 0x2F07, 0x9EFC, 0x31BF, 0x9EFD, 0x2612, 0x9EFF, + 0x2F08, 0x9F00, 0x3071, 0x9F01, 0x3070, 0x9F06, 0x3475, 0x9F07, 0x173F, + 0x9F09, 0x34FF, 0x9F0A, 0x3519, 0x9F0E, 0x0F7B, 0x9F0F, 0x2AFE, 0x9F10, + 0x2AFF, 0x9F12, 0x2D38, 0x9F13, 0x0F7C, 0x9F15, 0x1573, 0x9F16, 0x3072, + 0x9F18, 0x3370, 0x9F19, 0x16B7, 0x9F1A, 0x3371, 0x9F1B, 0x336F, 0x9F1C, + 0x3476, 0x9F1E, 0x34C4, 0x9F20, 0x0F7D, 0x9F22, 0x2F0B, 0x9F23, 0x2F0A, + 0x9F24, 0x2F09, 0x9F25, 0x3073, 0x9F28, 0x3077, 0x9F29, 0x3076, 0x9F2A, + 0x3075, 0x9F2B, 0x3074, 0x9F2C, 0x1574, 0x9F2D, 0x31C0, 0x9F2E, 0x32BE, + 0x9F2F, 0x1664, 0x9F30, 0x32BD, 0x9F31, 0x3372, 0x9F32, 0x3409, 0x9F33, + 0x3408, 0x9F34, 0x16F2, 0x9F35, 0x3407, 0x9F36, 0x3479, 0x9F37, 0x3478, + 0x9F38, 0x3477, 0x9F3B, 0x1100, 0x9F3D, 0x2D39, 0x9F3E, 0x14C7, 0x9F40, + 0x31C1, 0x9F41, 0x31C2, 0x9F42, 0x340A, 0x9F43, 0x347A, 0x9F46, 0x34C5, + 0x9F47, 0x3500, 0x9F48, 0x3532, 0x9F49, 0x354C, 0x9F4A, 0x1101, 0x9F4B, + 0x14C8, 0x9F4C, 0x3078, 0x9F4D, 0x31C3, 0x9F4E, 0x3373, 0x9F4F, 0x347B, + 0x9F52, 0x1289, 0x9F54, 0x2F0C, 0x9F55, 0x3079, 0x9F56, 0x31C4, 0x9F57, + 0x31C5, 0x9F58, 0x31C6, 0x9F59, 0x32C3, 0x9F5B, 0x32BF, 0x9F5C, 0x16B8, + 0x9F5D, 0x32C2, 0x9F5E, 0x32C1, 0x9F5F, 0x1665, 0x9F60, 0x32C0, 0x9F61, + 0x1667, 0x9F63, 0x1666, 0x9F64, 0x3375, 0x9F65, 0x3374, 0x9F66, 0x16B9, + 0x9F67, 0x16BA, 0x9F6A, 0x16F4, 0x9F6B, 0x340B, 0x9F6C, 0x16F3, 0x9F6E, + 0x347E, 0x9F6F, 0x347F, 0x9F70, 0x347D, 0x9F71, 0x347C, 0x9F72, 0x1741, + 0x9F74, 0x34C6, 0x9F75, 0x34C7, 0x9F76, 0x34C8, 0x9F77, 0x1740, 0x9F78, + 0x3501, 0x9F79, 0x3504, 0x9F7A, 0x3503, 0x9F7B, 0x3502, 0x9F7E, 0x354B, + 0x9F8D, 0x13B2, 0x9F90, 0x157C, 0x9F91, 0x32C4, 0x9F92, 0x3376, 0x9F94, + 0x16F5, 0x9F95, 0x340C, 0x9F98, 0x354D, 0x9F9C, 0x13B3, 0x9FA0, 0x2F0D, + 0x9FA2, 0x340D, 0x9FA4, 0x351A, 0xE01F, 0x083A, 0xE026, 0x09FD, 0xE05B, + 0x030D, 0xE063, 0x016B, 0xE073, 0x0860, 0xE0F3, 0x0C23, 0xE12E, 0x17E4, + 0xE149, 0x212F, 0xE191, 0x115F, 0xE1BA, 0x0C79, 0xE1C9, 0x04C3, 0xE22C, + 0x18BD, 0xE22D, 0x0CBD, 0xE230, 0x0CA5, 0xE266, 0x0CCE, 0xE2A3, 0x0E84, + 0xE2BC, 0x0120, 0xE2EF, 0x1BA8, 0xE33A, 0x1055, 0xE340, 0x2DE8, 0xE34F, + 0x0121, 0xE35A, 0x106B, 0xE363, 0x1326, 0xE37C, 0x066B, 0xE37F, 0x132E, + 0xE3C5, 0x0D35, 0xE3D7, 0x27C2, 0xE3DC, 0x22AD, 0xE417, 0x134C, 0xE44A, + 0x09CE, 0xE478, 0x0BC7, 0xE485, 0x36E9, 0xE4C5, 0x1391, 0xE4DA, 0x16A4, + 0xE545, 0x3072, 0xE5D2, 0x0119, 0xE5D3, 0x011A, 0xE5D4, 0x011C, 0xE5D5, + 0x011B, 0xE5F4, 0x297C, 0xE6C6, 0x1D06, 0xE727, 0x29A1, 0xE7D3, 0x181B, + 0xE893, 0x2B24, 0xEB40, 0x2F50, 0xEB42, 0x1725, 0xEB45, 0x32ED, 0xEB6E, + 0x2AD9, 0xEB86, 0x1C14, 0xEB9E, 0x12E9, 0xEBA9, 0x2CAE, 0xEBBA, 0x1A64, + 0xEBC9, 0x1404, 0xEBCF, 0x2324, 0xEBD2, 0x346A, 0xEBDE, 0x2291, 0xEC01, + 0x1787, 0xEC02, 0x095F, 0xEC15, 0x1E99, 0xEC5B, 0x25C1, 0xEC5E, 0x0D0C, + 0xECA6, 0x05E6, 0xED28, 0x0728, 0xED6E, 0x24B6, 0xED7C, 0x1806, 0xED9E, + 0x3511, 0xEDE7, 0x0F82, 0xEE52, 0x05F2, 0xEE98, 0x247D, 0xF6B1, 0x01FA, + 0xF6B2, 0x01FB, 0xF6B3, 0x01FC, 0xF6B4, 0x01FD, 0xF6B5, 0x01FE, 0xF6B6, + 0x01FF, 0xF6B7, 0x0200, 0xF6B8, 0x0201, 0xF6B9, 0x0202, 0xF6BA, 0x0203, + 0xF6BB, 0x0204, 0xF6BC, 0x0205, 0xF6BD, 0x0206, 0xF6BE, 0x0207, 0xF6BF, + 0x0208, 0xF6C0, 0x0209, 0xF6C1, 0x020A, 0xF6C2, 0x020B, 0xF6C3, 0x020C, + 0xF6C4, 0x020D, 0xF6C5, 0x020E, 0xF6C6, 0x020F, 0xF6C7, 0x0210, 0xF6C8, + 0x0211, 0xF6C9, 0x0212, 0xF6CA, 0x0213, 0xF6CB, 0x0214, 0xF6CC, 0x0215, + 0xF6CD, 0x0216, 0xF6CE, 0x0217, 0xF6CF, 0x0219, 0xF6D0, 0x021A, 0xF6D1, + 0x021B, 0xF6D2, 0x021C, 0xF6D3, 0x021D, 0xF6D4, 0x021E, 0xF6D5, 0x021F, + 0xF6D6, 0x0220, 0xF6D7, 0x0221, 0xF6D8, 0x0222, 0xF6D9, 0x0223, 0xF6DA, + 0x0224, 0xF6DB, 0x0225, 0xF6DC, 0x0226, 0xF6DD, 0x0227, 0xF6DE, 0x0228, + 0xF6E0, 0x022A, 0xF6E1, 0x022B, 0xF6E2, 0x022C, 0xF6E4, 0x022E, 0xF6E6, + 0x0230, 0xF6E8, 0x35B3, 0xF6E9, 0x35B4, 0xF6EA, 0x35B5, 0xF6EB, 0x35B6, + 0xF6EC, 0x35B7, 0xF6ED, 0x35B8, 0xF6F0, 0x35BA, 0xF6F1, 0x35BB, 0xF6F2, + 0x35BC, 0xF6F3, 0x35BD, 0xF6F4, 0x35BE, 0xF6F5, 0x35BF, 0xF6F6, 0x35C0, + 0xF6F7, 0x35C1, 0xF6F8, 0x35C2, 0xF6F9, 0x35C3, 0xF6FA, 0x35C4, 0xF6FB, + 0x35C5, 0xF6FC, 0x35C6, 0xF6FD, 0x35C7, 0xF6FE, 0x35C8, 0xF6FF, 0x35C9, + 0xF700, 0x35CA, 0xF701, 0x35CB, 0xF702, 0x35CC, 0xF703, 0x35CD, 0xF704, + 0x35CE, 0xF705, 0x35CF, 0xF706, 0x35D0, 0xF707, 0x35D1, 0xF708, 0x35D2, + 0xF709, 0x35D3, 0xF70A, 0x35D4, 0xF70B, 0x35D5, 0xF70C, 0x35D6, 0xF70D, + 0x35D7, 0xF70E, 0x35D8, 0xF70F, 0x35D9, 0xF710, 0x35DA, 0xF711, 0x35DB, + 0xF712, 0x35DC, 0xF713, 0x35DD, 0xF714, 0x35DE, 0xF715, 0x35DF, 0xF716, + 0x35E0, 0xF717, 0x35E1, 0xF718, 0x35E2, 0xF719, 0x35E3, 0xF71A, 0x35E4, + 0xF71B, 0x35E5, 0xF71C, 0x35E6, 0xF71D, 0x35E7, 0xF71E, 0x35E8, 0xF71F, + 0x35E9, 0xF720, 0x35EA, 0xF721, 0x35EB, 0xF722, 0x35EC, 0xF723, 0x35ED, + 0xF724, 0x35EE, 0xF725, 0x35EF, 0xF726, 0x35F0, 0xF727, 0x35F1, 0xF728, + 0x35F2, 0xF729, 0x35F3, 0xF72A, 0x35F4, 0xF72B, 0x35F5, 0xF72C, 0x35F6, + 0xF72D, 0x35F7, 0xF72E, 0x35F8, 0xF72F, 0x35F9, 0xF730, 0x35FA, 0xF731, + 0x35FB, 0xF732, 0x35FC, 0xF733, 0x35FD, 0xF734, 0x35FE, 0xF735, 0x35FF, + 0xF736, 0x3600, 0xF737, 0x3601, 0xF738, 0x3602, 0xF739, 0x3603, 0xF73A, + 0x3604, 0xF73B, 0x3605, 0xF73C, 0x3606, 0xF73D, 0x3607, 0xF73E, 0x3608, + 0xF73F, 0x3609, 0xF740, 0x360A, 0xF741, 0x360B, 0xF742, 0x360C, 0xF743, + 0x360D, 0xF744, 0x360E, 0xF745, 0x360F, 0xF746, 0x3610, 0xF747, 0x3611, + 0xF748, 0x3612, 0xF749, 0x3613, 0xF74A, 0x3614, 0xF74B, 0x3615, 0xF74C, + 0x3616, 0xF74D, 0x3617, 0xF74E, 0x3618, 0xF74F, 0x3619, 0xF750, 0x361A, + 0xF751, 0x361B, 0xF752, 0x361C, 0xF753, 0x361D, 0xF754, 0x361E, 0xF755, + 0x361F, 0xF756, 0x3620, 0xF757, 0x3621, 0xF758, 0x3622, 0xF759, 0x3623, + 0xF75A, 0x3624, 0xF75B, 0x3625, 0xF75C, 0x3626, 0xF75D, 0x3627, 0xF75E, + 0x3628, 0xF75F, 0x3629, 0xF760, 0x362A, 0xF761, 0x362B, 0xF762, 0x362C, + 0xF763, 0x362D, 0xF764, 0x362E, 0xF765, 0x362F, 0xF766, 0x3630, 0xF767, + 0x3631, 0xF768, 0x3632, 0xF769, 0x3633, 0xF76A, 0x3634, 0xF76B, 0x3635, + 0xF76C, 0x3636, 0xF76D, 0x3637, 0xF76E, 0x3638, 0xF76F, 0x3639, 0xF770, + 0x363A, 0xF771, 0x363B, 0xF772, 0x363C, 0xF773, 0x363D, 0xF774, 0x363E, + 0xF775, 0x363F, 0xF776, 0x3640, 0xF777, 0x3641, 0xF778, 0x3642, 0xF779, + 0x3643, 0xF77A, 0x3644, 0xF77B, 0x3645, 0xF77C, 0x3646, 0xF77D, 0x3647, + 0xF77E, 0x3648, 0xF77F, 0x3649, 0xF780, 0x364A, 0xF781, 0x364B, 0xF782, + 0x364C, 0xF783, 0x364D, 0xF784, 0x364E, 0xF785, 0x364F, 0xF786, 0x3650, + 0xF787, 0x3651, 0xF788, 0x3652, 0xF789, 0x3653, 0xF78A, 0x3654, 0xF78B, + 0x3655, 0xF78C, 0x3656, 0xF78D, 0x3657, 0xF78E, 0x3658, 0xF78F, 0x3659, + 0xF790, 0x365A, 0xF791, 0x365B, 0xF792, 0x365C, 0xF793, 0x365D, 0xF794, + 0x365E, 0xF795, 0x365F, 0xF796, 0x3660, 0xF797, 0x3661, 0xF798, 0x3662, + 0xF799, 0x3663, 0xF79A, 0x3664, 0xF79B, 0x3665, 0xF79C, 0x3666, 0xF79D, + 0x3667, 0xF79E, 0x3668, 0xF79F, 0x3669, 0xF7A0, 0x366A, 0xF7A1, 0x366B, + 0xF7A2, 0x366C, 0xF7A3, 0x366D, 0xF7A4, 0x366E, 0xF7A5, 0x366F, 0xF7A6, + 0x3670, 0xF7A7, 0x3671, 0xF7A8, 0x3672, 0xF7A9, 0x3673, 0xF7AA, 0x3674, + 0xF7AB, 0x3675, 0xF7AC, 0x3676, 0xF7AD, 0x3677, 0xF7AE, 0x3678, 0xF7AF, + 0x3679, 0xF7B0, 0x367A, 0xF7B1, 0x367B, 0xF7B2, 0x367C, 0xF7B3, 0x367D, + 0xF7B4, 0x367E, 0xF7B5, 0x367F, 0xF7B6, 0x3680, 0xF7B7, 0x3681, 0xF7B8, + 0x3682, 0xF7B9, 0x3683, 0xF7BA, 0x3684, 0xF7BB, 0x3685, 0xF7BC, 0x3686, + 0xF7BD, 0x3687, 0xF7BE, 0x3688, 0xF7BF, 0x3689, 0xF7C0, 0x368A, 0xF7C1, + 0x368B, 0xF7C2, 0x368C, 0xF7C3, 0x368D, 0xF7C4, 0x368E, 0xF7C5, 0x368F, + 0xF7C6, 0x3690, 0xF7C7, 0x3691, 0xF7C8, 0x3692, 0xF7C9, 0x3693, 0xF7CA, + 0x3694, 0xF7CB, 0x3695, 0xF7CC, 0x3696, 0xF7CD, 0x3697, 0xF7CE, 0x3698, + 0xF7CF, 0x3699, 0xF7D0, 0x369A, 0xF7D1, 0x369B, 0xF7D2, 0x369C, 0xF7D3, + 0x369D, 0xF7D4, 0x369E, 0xF7D5, 0x369F, 0xF7D6, 0x36A0, 0xF7D7, 0x36A1, + 0xF7D8, 0x36A2, 0xF7D9, 0x36A3, 0xF7DA, 0x36A4, 0xF7DB, 0x36A5, 0xF7DC, + 0x36A6, 0xF7DD, 0x36A7, 0xF7DE, 0x36A8, 0xF7DF, 0x36A9, 0xF7E0, 0x36AA, + 0xF7E1, 0x36AB, 0xF7E2, 0x36AC, 0xF7E3, 0x36AD, 0xF7E4, 0x36AE, 0xF7E5, + 0x36AF, 0xF7E6, 0x36B0, 0xF7E7, 0x36B1, 0xF7E8, 0x36B2, 0xF7E9, 0x36B3, + 0xF7EA, 0x36B4, 0xF7EB, 0x36B5, 0xF7EC, 0x36B6, 0xF7ED, 0x36B7, 0xF7EE, + 0x36B8, 0xF817, 0x36E1, 0xF818, 0x36E2, 0xF819, 0x36E3, 0xF81A, 0x36E4, + 0xF81B, 0x36E5, 0xF81C, 0x36E6, 0xF81D, 0x36E7, 0xFA0C, 0x0274, 0xFA0D, + 0x2381, 0xFE30, 0x006D, 0xFE31, 0x007A, 0xFE33, 0x35AF, 0xFE34, 0x35B1, + 0xFE35, 0x0082, 0xFE36, 0x0083, 0xFE37, 0x0086, 0xFE38, 0x0087, 0xFE39, + 0x008A, 0xFE3A, 0x008B, 0xFE3B, 0x008E, 0xFE3C, 0x008F, 0xFE3D, 0x0092, + 0xFE3E, 0x0093, 0xFE3F, 0x0096, 0xFE40, 0x0097, 0xFE41, 0x009A, 0xFE42, + 0x009B, 0xFE43, 0x009E, 0xFE44, 0x009F, 0xFE49, 0x00C7, 0xFE4A, 0x00C8, + 0xFE4B, 0x00CB, 0xFE4C, 0x00CC, 0xFE4D, 0x00C9, 0xFE4E, 0x00CA, 0xFE4F, + 0x35B2, 0xFE50, 0x0070, 0xFE51, 0x0071, 0xFE52, 0x0072, 0xFE54, 0x0074, + 0xFE55, 0x0075, 0xFE56, 0x0076, 0xFE57, 0x0077, 0xFE59, 0x00A0, 0xFE5A, + 0x00A1, 0xFE5B, 0x00A2, 0xFE5C, 0x00A3, 0xFE5D, 0x00A4, 0xFE5E, 0x00A5, + 0xFE5F, 0x00CD, 0xFE60, 0x00CE, 0xFE61, 0x00CF, 0xFE62, 0x00DF, 0xFE63, + 0x00E0, 0xFE64, 0x00E1, 0xFE65, 0x00E2, 0xFE66, 0x00E3, 0xFE68, 0x0102, + 0xFE69, 0x010C, 0xFE6A, 0x010D, 0xFE6B, 0x010E, 0xFF01, 0x006C, 0xFF02, + 0x36E4, 0xFF03, 0x00AE, 0xFF04, 0x0103, 0xFF05, 0x0108, 0xFF06, 0x00AF, + 0xFF07, 0x36E3, 0xFF08, 0x0080, 0xFF09, 0x0081, 0xFF0A, 0x00B0, 0xFF0B, + 0x00D0, 0xFF0C, 0x0064, 0xFF0D, 0x00D1, 0xFF0E, 0x0067, 0xFF0F, 0x0101, + 0xFF10, 0x014D, 0xFF11, 0x014E, 0xFF12, 0x014F, 0xFF13, 0x0150, 0xFF14, + 0x0151, 0xFF15, 0x0152, 0xFF16, 0x0153, 0xFF17, 0x0154, 0xFF18, 0x0155, + 0xFF19, 0x0156, 0xFF1A, 0x006A, 0xFF1B, 0x0069, 0xFF1C, 0x00D6, 0xFF1D, + 0x00D8, 0xFF1E, 0x00D7, 0xFF1F, 0x006B, 0xFF20, 0x0109, 0xFF21, 0x016D, + 0xFF22, 0x016E, 0xFF23, 0x016F, 0xFF24, 0x0170, 0xFF25, 0x0171, 0xFF26, + 0x0172, 0xFF27, 0x0173, 0xFF28, 0x0174, 0xFF29, 0x0175, 0xFF2A, 0x0176, + 0xFF2B, 0x0177, 0xFF2C, 0x0178, 0xFF2D, 0x0179, 0xFF2E, 0x017A, 0xFF2F, + 0x017B, 0xFF30, 0x017C, 0xFF31, 0x017D, 0xFF32, 0x017E, 0xFF33, 0x017F, + 0xFF34, 0x0180, 0xFF35, 0x0181, 0xFF36, 0x0182, 0xFF37, 0x0183, 0xFF38, + 0x0184, 0xFF39, 0x0185, 0xFF3A, 0x0186, 0xFF3B, 0x35BE, 0xFF3C, 0x0102, + 0xFF3D, 0x35BF, 0xFF3E, 0x35B4, 0xFF3F, 0x00C5, 0xFF41, 0x0187, 0xFF42, + 0x0188, 0xFF43, 0x0189, 0xFF44, 0x018A, 0xFF45, 0x018B, 0xFF46, 0x018C, + 0xFF47, 0x018D, 0xFF48, 0x018E, 0xFF49, 0x018F, 0xFF4A, 0x0190, 0xFF4B, + 0x0191, 0xFF4C, 0x0192, 0xFF4D, 0x0193, 0xFF4E, 0x0194, 0xFF4F, 0x0195, + 0xFF50, 0x0196, 0xFF51, 0x0197, 0xFF52, 0x0198, 0xFF53, 0x0199, 0xFF54, + 0x019A, 0xFF55, 0x019B, 0xFF56, 0x019C, 0xFF57, 0x019D, 0xFF58, 0x019E, + 0xFF59, 0x019F, 0xFF5A, 0x01A0, 0xFF5B, 0x0084, 0xFF5C, 0x0078, 0xFF5D, + 0x0085, 0xFF5E, 0x00E4, 0xFF64, 0x0071, 0xFFE0, 0x0106, 0xFFE1, 0x0107, + 0xFFE2, 0x36E1, 0xFFE3, 0x00C4, 0xFFE4, 0x36E2, 0xFFE5, 0x0104, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/cmaps_cns1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/cmaps_cns1.cpp new file mode 100644 index 000000000000..a1bbefc1ab87 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/cmaps_cns1.cpp @@ -0,0 +1,56 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/CNS1/cmaps_cns1.h" + +#include "core/fpdfapi/cmaps/cmap_int.h" +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/font/font_int.h" +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fxcrt/fx_basic.h" + +static const FXCMAP_CMap g_FXCMAP_CNS1_cmaps[] = { + {"B5pc-H", FXCMAP_CMap::Range, g_FXCMAP_B5pc_H_0, 247, FXCMAP_CMap::None, + nullptr, 0, 0}, + {"B5pc-V", FXCMAP_CMap::Range, g_FXCMAP_B5pc_V_0, 12, FXCMAP_CMap::None, + nullptr, 0, -1}, + {"HKscs-B5-H", FXCMAP_CMap::Range, g_FXCMAP_HKscs_B5_H_5, 1210, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"HKscs-B5-V", FXCMAP_CMap::Range, g_FXCMAP_HKscs_B5_V_5, 13, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"ETen-B5-H", FXCMAP_CMap::Range, g_FXCMAP_ETen_B5_H_0, 254, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"ETen-B5-V", FXCMAP_CMap::Range, g_FXCMAP_ETen_B5_V_0, 13, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"ETenms-B5-H", FXCMAP_CMap::Range, g_FXCMAP_ETenms_B5_H_0, 1, + FXCMAP_CMap::None, nullptr, 0, -2}, + {"ETenms-B5-V", FXCMAP_CMap::Range, g_FXCMAP_ETenms_B5_V_0, 18, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"CNS-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_H_0, 157, + FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_H_0_DWord, 238, 0}, + {"CNS-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_V_0, 180, + FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_V_0_DWord, 261, 0}, + {"UniCNS-UCS2-H", FXCMAP_CMap::Range, g_FXCMAP_UniCNS_UCS2_H_3, 16418, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"UniCNS-UCS2-V", FXCMAP_CMap::Range, g_FXCMAP_UniCNS_UCS2_V_3, 13, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"UniCNS-UTF16-H", FXCMAP_CMap::Single, g_FXCMAP_UniCNS_UTF16_H_0, 14557, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"UniCNS-UTF16-V", FXCMAP_CMap::Range, g_FXCMAP_UniCNS_UCS2_V_3, 13, + FXCMAP_CMap::None, nullptr, 0, -1}, +}; + +void CPDF_ModuleMgr::LoadEmbeddedCNS1CMaps() { + CPDF_FontGlobals* pFontGlobals = + CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); + pFontGlobals->m_EmbeddedCharsets[CIDSET_CNS1].m_pMapList = + g_FXCMAP_CNS1_cmaps; + pFontGlobals->m_EmbeddedCharsets[CIDSET_CNS1].m_Count = + FX_ArraySize(g_FXCMAP_CNS1_cmaps); + pFontGlobals->m_EmbeddedToUnicodes[CIDSET_CNS1].m_pMap = + g_FXCMAP_CNS1CID2Unicode_5; + pFontGlobals->m_EmbeddedToUnicodes[CIDSET_CNS1].m_Count = 19088; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/cmaps_cns1.h b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/cmaps_cns1.h new file mode 100644 index 000000000000..a87a47fca307 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/CNS1/cmaps_cns1.h @@ -0,0 +1,29 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_CMAPS_CNS1_CMAPS_CNS1_H_ +#define CORE_FPDFAPI_CMAPS_CNS1_CMAPS_CNS1_H_ + +#include + +extern const uint16_t g_FXCMAP_B5pc_H_0[]; +extern const uint16_t g_FXCMAP_B5pc_V_0[]; +extern const uint16_t g_FXCMAP_HKscs_B5_H_5[]; +extern const uint16_t g_FXCMAP_HKscs_B5_V_5[]; +extern const uint16_t g_FXCMAP_ETen_B5_H_0[]; +extern const uint16_t g_FXCMAP_ETen_B5_V_0[]; +extern const uint16_t g_FXCMAP_ETenms_B5_H_0[]; +extern const uint16_t g_FXCMAP_ETenms_B5_V_0[]; +extern const uint16_t g_FXCMAP_CNS_EUC_H_0[]; +extern const uint16_t g_FXCMAP_CNS_EUC_H_0_DWord[]; +extern const uint16_t g_FXCMAP_CNS_EUC_V_0[]; +extern const uint16_t g_FXCMAP_CNS_EUC_V_0_DWord[]; +extern const uint16_t g_FXCMAP_UniCNS_UCS2_H_3[]; +extern const uint16_t g_FXCMAP_UniCNS_UCS2_V_3[]; +extern const uint16_t g_FXCMAP_UniCNS_UTF16_H_0[]; +extern const uint16_t g_FXCMAP_CNS1CID2Unicode_5[]; + +#endif // CORE_FPDFAPI_CMAPS_CNS1_CMAPS_CNS1_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/Adobe-GB1-UCS2_5.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/Adobe-GB1-UCS2_5.cpp new file mode 100644 index 000000000000..5a5ae048aba7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/Adobe-GB1-UCS2_5.cpp @@ -0,0 +1,3375 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +const uint16_t g_FXCMAP_GB1CID2Unicode_5[30284] = { + 0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, + 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, + 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, + 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, + 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, + 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, + 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, + 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x3000, 0x3001, 0x3002, + 0x00B7, 0x02C9, 0x02C7, 0x00A8, 0x3003, 0x3005, 0x2014, 0xFF5E, 0x2016, + 0x2026, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, + 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, + 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, + 0x222A, 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, 0x2312, + 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, 0x221D, 0x2260, + 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, 0x2234, 0x2642, 0x2640, + 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, 0x00A4, 0xFFE0, 0xFFE1, 0x2030, + 0x00A7, 0x2116, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, + 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, + 0x3013, 0x2488, 0x2489, 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, + 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, + 0x2499, 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, + 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, + 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, + 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x3220, 0x3221, 0x3222, + 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0x2160, 0x2161, + 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, + 0x216B, 0xFF01, 0xFF02, 0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07, 0xFF08, + 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, 0xFF11, + 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A, + 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, 0xFF21, 0xFF22, 0xFF23, + 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, + 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, + 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, + 0xFF3F, 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, + 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, + 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, + 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0x3041, 0x3042, 0x3043, 0x3044, + 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, + 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, + 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, + 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, + 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, + 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, + 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, + 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, + 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2, + 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, + 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, + 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, + 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, + 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, + 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, + 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, + 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, + 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, + 0x30F4, 0x30F5, 0x30F6, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, + 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, + 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, + 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, + 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0xFF0C, 0x3002, 0x3001, + 0xFF1A, 0xFF1B, 0xFF01, 0xFF1F, 0xFE35, 0xFE36, 0xFE39, 0xFE3A, 0xFE3F, + 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0x3016, 0x3017, + 0xFE3B, 0xFE3C, 0xFE37, 0xFE38, 0xFE31, 0x2026, 0xFE33, 0xFE34, 0x0410, + 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, + 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, + 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, + 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, + 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, + 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, + 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, + 0x044E, 0x044F, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, + 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, 0x00F2, + 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, + 0x00EA, 0x0251, 0x1E3F, 0x0144, 0x0148, 0x01F9, 0x0261, 0x3105, 0x3106, + 0x3107, 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, + 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, + 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, 0x3120, 0x3121, + 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0xE7CD, + 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, + 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, + 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, + 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, + 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, + 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, + 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E, + 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, + 0x2548, 0x2549, 0x254A, 0x254B, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, + 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, + 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, + 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, + 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, + 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, + 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, + 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, + 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, + 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x0101, + 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, + 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, + 0x00F9, 0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0x0251, 0x1E3F, + 0x0144, 0x0148, 0x01F9, 0x0261, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, + 0x5509, 0x54C0, 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, + 0x9698, 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, 0x80FA, + 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, 0x7FF1, 0x8884, + 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, 0x6252, 0x53ED, 0x5427, + 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, 0x8DCB, 0x9776, 0x628A, 0x8019, + 0x575D, 0x9738, 0x7F62, 0x7238, 0x767D, 0x67CF, 0x767E, 0x6446, 0x4F70, + 0x8D25, 0x62DC, 0x7A17, 0x6591, 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, + 0x677F, 0x7248, 0x626E, 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, + 0x90A6, 0x5E2E, 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, + 0x9551, 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265, 0x8584, + 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, 0x62A5, 0x66B4, 0x8C79, + 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, 0x5351, 0x5317, 0x8F88, 0x80CC, + 0x8D1D, 0x94A1, 0x500D, 0x72C8, 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, + 0x82EF, 0x672C, 0x7B28, 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, + 0x903C, 0x9F3B, 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, + 0x6BD5, 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, + 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, 0x7F16, + 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, 0x8FAB, 0x904D, + 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, 0x522B, 0x762A, 0x5F6C, + 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, 0x5175, 0x51B0, 0x67C4, 0x4E19, + 0x79C9, 0x997C, 0x70B3, 0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, + 0x94B5, 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, + 0x8236, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, 0x54FA, + 0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, 0x6016, 0x64E6, + 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, 0x8E29, 0x91C7, 0x5F69, + 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, 0x6B8B, 0x60ED, 0x60E8, 0x707F, + 0x82CD, 0x8231, 0x4ED3, 0x6CA7, 0x85CF, 0x64CD, 0x7CD9, 0x69FD, 0x66F9, + 0x8349, 0x5395, 0x7B56, 0x4FA7, 0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, + 0x53C9, 0x832C, 0x8336, 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, + 0x8BE7, 0x62C6, 0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, + 0x7F20, 0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316, 0x573A, 0x5C1D, + 0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382, 0x655E, 0x7545, 0x5531, 0x5021, + 0x8D85, 0x6284, 0x949E, 0x671D, 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, + 0x8F66, 0x626F, 0x64A4, 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, 0x8FB0, + 0x5C18, 0x6668, 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, 0x6491, 0x79F0, + 0x57CE, 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA, + 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, 0x6C60, + 0x8FDF, 0x5F1B, 0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A, 0x8D64, 0x7FC5, + 0x65A5, 0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07, 0x5BA0, 0x62BD, 0x916C, + 0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79, 0x4EC7, 0x7EF8, 0x7785, 0x4E11, + 0x81ED, 0x521D, 0x51FA, 0x6A71, 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, + 0x9664, 0x695A, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, 0x63E3, + 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, 0x75AE, 0x7A97, + 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, 0x6376, 0x9524, 0x5782, + 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, 0x7EAF, 0x8822, 0x6233, 0x7EF0, + 0x75B5, 0x8328, 0x78C1, 0x96CC, 0x8F9E, 0x6148, 0x74F7, 0x8BCD, 0x6B64, + 0x523A, 0x8D50, 0x6B21, 0x806A, 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, + 0x51D1, 0x7C97, 0x918B, 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, + 0x5D14, 0x50AC, 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, + 0x5BF8, 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, 0x8FBE, + 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, 0x6234, 0x5E26, + 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E, 0x6020, 0x803D, 0x62C5, + 0x4E39, 0x5355, 0x90F8, 0x63B8, 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, + 0x6DE1, 0x8BDE, 0x5F39, 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, + 0x5200, 0x6363, 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, + 0x60BC, 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, + 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, 0x654C, + 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, 0x5730, 0x8482, + 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, 0x6382, 0x6EC7, 0x7898, + 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, 0x4F43, 0x7538, 0x5E97, 0x60E6, + 0x5960, 0x6DC0, 0x6BBF, 0x7889, 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, + 0x540A, 0x9493, 0x8C03, 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, + 0x53E0, 0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, 0x5B9A, + 0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, 0x680B, 0x4F97, + 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, 0x9661, 0x8C46, 0x9017, + 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, 0x72EC, 0x8BFB, 0x5835, 0x7779, + 0x8D4C, 0x675C, 0x9540, 0x809A, 0x5EA6, 0x6E21, 0x5992, 0x7AEF, 0x77ED, + 0x953B, 0x6BB5, 0x65AD, 0x7F0E, 0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, + 0x5428, 0x8E72, 0x6566, 0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, + 0x54C6, 0x591A, 0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, + 0x60F0, 0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, 0x5A25, + 0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, 0x800C, 0x513F, + 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, + 0x4F10, 0x4E4F, 0x9600, 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, 0x7FFB, + 0x6A0A, 0x77FE, 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, 0x8FD4, 0x8303, + 0x8D29, 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, + 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E, 0x5561, + 0x98DE, 0x80A5, 0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F, 0x6CB8, 0x8D39, + 0x82AC, 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7, 0x575F, 0x711A, 0x6C7E, + 0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124, 0x7CAA, 0x4E30, 0x5C01, 0x67AB, + 0x8702, 0x5CF0, 0x950B, 0x98CE, 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, + 0x8BBD, 0x5949, 0x51E4, 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, 0x5B75, + 0x6276, 0x62C2, 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, 0x4FD8, 0x670D, + 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, 0x629A, 0x8F85, 0x4FEF, + 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, 0x8150, 0x8D74, 0x526F, 0x8986, + 0x8D4B, 0x590D, 0x5085, 0x4ED8, 0x961C, 0x7236, 0x8179, 0x8D1F, 0x5BCC, + 0x8BA3, 0x9644, 0x5987, 0x7F1A, 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, + 0x6982, 0x9499, 0x76D6, 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, + 0x809D, 0x8D76, 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, + 0x7F38, 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, 0x9AD8, + 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, 0x54E5, 0x6B4C, + 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, 0x9769, 0x845B, 0x683C, + 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, 0x5404, 0x7ED9, 0x6839, 0x8DDF, + 0x8015, 0x66F4, 0x5E9A, 0x7FB9, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, + 0x529F, 0x606D, 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, + 0x6C5E, 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, + 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, 0x4F30, + 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, 0x8C37, 0x80A1, + 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, 0x5250, 0x5BE1, 0x6302, + 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, 0x5173, 0x5B98, 0x51A0, 0x89C2, + 0x7BA1, 0x9986, 0x7F50, 0x60EF, 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, + 0x7470, 0x89C4, 0x572D, 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, + 0x8BE1, 0x7678, 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, + 0x68CD, 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8, 0x9AB8, + 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, 0x9163, 0x61A8, 0x90AF, + 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, 0x558A, 0x7F55, 0x7FF0, 0x64BC, + 0x634D, 0x65F1, 0x61BE, 0x608D, 0x710A, 0x6C57, 0x6C49, 0x592F, 0x676D, + 0x822A, 0x58D5, 0x568E, 0x8C6A, 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, + 0x6D69, 0x5475, 0x559D, 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, + 0x5408, 0x76D2, 0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, + 0x8D3A, 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, 0x4EA8, + 0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, 0x9E3F, 0x6D2A, + 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, 0x543C, 0x539A, 0x5019, + 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, 0x58F6, 0x846B, 0x80E1, 0x8774, + 0x72D0, 0x7CCA, 0x6E56, 0x5F27, 0x864E, 0x552C, 0x62A4, 0x4E92, 0x6CAA, + 0x6237, 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316, + 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF, 0x6853, + 0x8FD8, 0x7F13, 0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62, 0x7115, 0x6DA3, + 0x5BA6, 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, 0x8757, 0x7C27, 0x7687, + 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, 0x604D, 0x8C0E, 0x7070, 0x6325, + 0x8F89, 0x5FBD, 0x6062, 0x86D4, 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, + 0x60E0, 0x6666, 0x8D3F, 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, 0x8BF2, + 0x7ED8, 0x8364, 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, 0x8C41, 0x6D3B, + 0x4F19, 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB, + 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, 0x79EF, 0x7B95, 0x808C, 0x9965, + 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, 0x59EC, 0x7EE9, 0x7F09, 0x5409, 0x6781, + 0x68D8, 0x8F91, 0x7C4D, 0x96C6, 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, + 0x5AC9, 0x7EA7, 0x6324, 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, + 0x5B63, 0x4F0E, 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, + 0x8BB0, 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, 0x67B7, + 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, 0x7532, 0x94BE, + 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, 0x6B7C, 0x76D1, 0x575A, + 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, 0x80A9, 0x8270, 0x5978, 0x7F04, + 0x8327, 0x68C0, 0x67EC, 0x78B1, 0x7877, 0x62E3, 0x6361, 0x7B80, 0x4FED, + 0x526A, 0x51CF, 0x8350, 0x69DB, 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, + 0x7BAD, 0x4EF6, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, + 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, 0x6868, + 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, 0x7901, 0x7126, + 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, 0x56BC, 0x6405, 0x94F0, + 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, 0x997A, 0x7F34, 0x7EDE, 0x527F, + 0x6559, 0x9175, 0x8F7F, 0x8F83, 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, + 0x79F8, 0x8857, 0x9636, 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, + 0x776B, 0x7AED, 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, + 0x754C, 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, + 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, 0x8FDB, + 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78, 0x5C3D, 0x52B2, 0x8346, + 0x5162, 0x830E, 0x775B, 0x6676, 0x9CB8, 0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, + 0x7ECF, 0x4E95, 0x8B66, 0x666F, 0x9888, 0x9759, 0x5883, 0x656C, 0x955C, + 0x5F84, 0x75C9, 0x9756, 0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, + 0x7A76, 0x7EA0, 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, + 0x6551, 0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, 0x62D8, + 0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, 0x77E9, 0x4E3E, + 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, 0x8DDD, 0x8E1E, 0x952F, + 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, 0x6350, 0x9E43, 0x5A1F, 0x5026, + 0x7737, 0x5377, 0x7EE2, 0x6485, 0x652B, 0x6289, 0x6398, 0x5014, 0x7235, + 0x89C9, 0x51B3, 0x8BC0, 0x7EDD, 0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, + 0x5CFB, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496, 0x5361, + 0x54AF, 0x5F00, 0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A, 0x582A, 0x52D8, + 0x574E, 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, 0x625B, 0x6297, 0x4EA2, + 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, 0x5777, 0x82DB, 0x67EF, 0x68F5, + 0x78D5, 0x9897, 0x79D1, 0x58F3, 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, + 0x5BA2, 0x8BFE, 0x80AF, 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, 0x7A7A, + 0x6050, 0x5B54, 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, 0x67AF, 0x54ED, + 0x7A9F, 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8, + 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321, 0x7B50, + 0x72C2, 0x6846, 0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F, 0x76D4, 0x5CBF, + 0x7AA5, 0x8475, 0x594E, 0x9B41, 0x5080, 0x9988, 0x6127, 0x6E83, 0x5764, + 0x6606, 0x6346, 0x56F0, 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, + 0x5587, 0x8721, 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, + 0x5A6A, 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, 0x63FD, + 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, 0x72FC, 0x5ECA, + 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, 0x8001, 0x4F6C, 0x59E5, + 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, 0x96F7, 0x956D, 0x857E, 0x78CA, + 0x7D2F, 0x5121, 0x5792, 0x64C2, 0x808B, 0x7C7B, 0x6CEA, 0x68F1, 0x695E, + 0x51B7, 0x5398, 0x68A8, 0x7281, 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, + 0x7406, 0x674E, 0x91CC, 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, + 0x4E3D, 0x5389, 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0, + 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, 0x54E9, 0x4FE9, + 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, 0x6D9F, 0x5E18, 0x655B, + 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, 0x7CAE, 0x51C9, 0x6881, 0x7CB1, + 0x826F, 0x4E24, 0x8F86, 0x91CF, 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, + 0x50DA, 0x7597, 0x71CE, 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, + 0x5ED6, 0x6599, 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, + 0x78F7, 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, + 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, 0x51CC, + 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, 0x7409, 0x69B4, + 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, 0x67F3, 0x516D, 0x9F99, + 0x804B, 0x5499, 0x7B3C, 0x7ABF, 0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, + 0x5A04, 0x6402, 0x7BD3, 0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, + 0x7089, 0x63B3, 0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, + 0x8D42, 0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, 0x5415, + 0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, 0x6C2F, 0x5F8B, + 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, 0x6EE6, 0x5375, 0x4E71, + 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, 0x4ED1, 0x6CA6, 0x7EB6, 0x8BBA, + 0x841D, 0x87BA, 0x7F57, 0x903B, 0x9523, 0x7BA9, 0x9AA1, 0x88F8, 0x843D, + 0x6D1B, 0x9A86, 0x7EDC, 0x5988, 0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, + 0x9A82, 0x561B, 0x5417, 0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, + 0x7792, 0x9992, 0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B, 0x8C29, + 0x8292, 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, 0x732B, 0x8305, 0x951A, + 0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302, 0x5192, 0x5E3D, 0x8C8C, 0x8D38, + 0x4E48, 0x73AB, 0x679A, 0x6885, 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, + 0x5A92, 0x9541, 0x6BCF, 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, 0x95E8, + 0x95F7, 0x4EEC, 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, 0x731B, 0x68A6, + 0x5B5F, 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73, + 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, 0x7EF5, + 0x5195, 0x514D, 0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7, 0x63CF, 0x7784, + 0x85D0, 0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511, 0x706D, 0x6C11, 0x62BF, + 0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E, 0x879F, 0x9E23, 0x94ED, 0x540D, + 0x547D, 0x8C2C, 0x6478, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, + 0x9B54, 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, 0x5BDE, + 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, 0x59C6, 0x6BCD, + 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, 0x76EE, 0x7766, 0x7267, + 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, 0x90A3, 0x5A1C, 0x7EB3, 0x6C16, + 0x4E43, 0x5976, 0x8010, 0x5948, 0x5357, 0x7537, 0x96BE, 0x56CA, 0x6320, + 0x8111, 0x607C, 0x95F9, 0x6DD6, 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, + 0x59AE, 0x9713, 0x502A, 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, + 0x9006, 0x6EBA, 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, + 0x5A18, 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, 0x954A, + 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81, 0x62E7, 0x6CDE, + 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, 0x6D53, 0x519C, 0x5F04, 0x5974, + 0x52AA, 0x6012, 0x5973, 0x6696, 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, + 0x8BFA, 0x54E6, 0x6B27, 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, + 0x556A, 0x8DB4, 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, + 0x5F98, 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, + 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, 0x5486, + 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, 0x57F9, 0x88F4, + 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, 0x76C6, 0x7830, 0x62A8, + 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, 0x787C, 0x7BF7, 0x81A8, 0x670B, + 0x9E4F, 0x6367, 0x78B0, 0x576F, 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, + 0x7435, 0x6BD7, 0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, + 0x5C41, 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, 0x74E2, + 0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, 0x8058, 0x4E52, + 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, 0x8BC4, 0x5C4F, 0x5761, + 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, 0x8FEB, 0x7C95, 0x5256, 0x6251, + 0x94FA, 0x4EC6, 0x8386, 0x8461, 0x83E9, 0x84B2, 0x57D4, 0x6734, 0x5703, + 0x666E, 0x6D66, 0x8C31, 0x66DD, 0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, + 0x59BB, 0x4E03, 0x51C4, 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, + 0x6B67, 0x7566, 0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, + 0x8D77, 0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, 0x6C14, + 0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, 0x6070, 0x6D3D, 0x7275, + 0x6266, 0x948E, 0x94C5, 0x5343, 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, + 0x9ED4, 0x94B1, 0x94B3, 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, 0x5811, + 0x5D4C, 0x6B20, 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, 0x5899, 0x8537, + 0x5F3A, 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54, + 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D, 0x5207, + 0x8304, 0x4E14, 0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2, 0x79E6, 0x7434, + 0x52E4, 0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81, 0x9752, 0x8F7B, 0x6C22, + 0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674, 0x6C30, 0x60C5, 0x9877, 0x8BF7, + 0x5E86, 0x743C, 0x7A77, 0x79CB, 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, + 0x914B, 0x6CC5, 0x8D8B, 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, 0x9A71, + 0x6E20, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, 0x98A7, 0x6743, + 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, 0x5238, 0x529D, 0x7F3A, + 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, 0x786E, 0x96C0, 0x88D9, 0x7FA4, + 0x7136, 0x71C3, 0x5189, 0x67D3, 0x74E4, 0x58E4, 0x6518, 0x56B7, 0x8BA9, + 0x9976, 0x6270, 0x7ED5, 0x60F9, 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, + 0x97E7, 0x4EFB, 0x8BA4, 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, + 0x620E, 0x8338, 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, + 0x5197, 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, 0x5982, + 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, 0x854A, 0x745E, + 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, 0x6D12, 0x8428, 0x816E, + 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1, 0x4F1E, 0x6563, 0x6851, 0x55D3, + 0x4E27, 0x6414, 0x9A9A, 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, + 0x50E7, 0x838E, 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, + 0x715E, 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, + 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, 0x6247, + 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, 0x5C1A, 0x88F3, + 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, 0x97F6, 0x5C11, 0x54E8, + 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, 0x820C, 0x820D, 0x8D66, 0x6444, + 0x5C04, 0x6151, 0x6D89, 0x793E, 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, + 0x8EAB, 0x6DF1, 0x5A20, 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, + 0x80BE, 0x614E, 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3, + 0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, 0x72EE, 0x65BD, + 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, 0x62FE, 0x65F6, 0x4EC0, + 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, 0x77E2, 0x4F7F, 0x5C4E, 0x9A76, + 0x59CB, 0x5F0F, 0x793A, 0x58EB, 0x4E16, 0x67FF, 0x4E8B, 0x62ED, 0x8A93, + 0x901D, 0x52BF, 0x662F, 0x55DC, 0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, + 0x9970, 0x6C0F, 0x5E02, 0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, + 0x9996, 0x5B88, 0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, + 0x67A2, 0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, 0x758F, + 0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, 0x7F72, 0x8700, + 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, 0x675F, 0x620D, 0x7AD6, + 0x5885, 0x5EB6, 0x6570, 0x6F31, 0x6055, 0x5237, 0x800D, 0x6454, 0x8870, + 0x7529, 0x5E05, 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, 0x8C01, 0x6C34, + 0x7761, 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714, + 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D, 0x6B7B, + 0x8086, 0x5BFA, 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972, 0x5DF3, 0x677E, + 0x8038, 0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC, 0x8BF5, 0x641C, 0x8258, + 0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7, 0x7D20, 0x901F, 0x7C9F, 0x50F3, + 0x5851, 0x6EAF, 0x5BBF, 0x8BC9, 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, + 0x968B, 0x968F, 0x7EE5, 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, 0x96A7, + 0x795F, 0x5B59, 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, 0x7F29, 0x7410, + 0x7D22, 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, 0x5979, 0x5854, 0x736D, + 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, 0x62AC, 0x53F0, 0x6CF0, 0x915E, + 0x592A, 0x6001, 0x6C70, 0x574D, 0x644A, 0x8D2A, 0x762B, 0x6EE9, 0x575B, + 0x6A80, 0x75F0, 0x6F6D, 0x8C2D, 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, + 0x63A2, 0x53F9, 0x70AD, 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, + 0x5510, 0x7CD6, 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, + 0x6ED4, 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, 0x5957, + 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, 0x8E22, 0x9511, + 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, 0x568F, 0x60D5, 0x6D95, + 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, 0x7530, 0x751C, 0x606C, 0x8214, + 0x8146, 0x6311, 0x6761, 0x8FE2, 0x773A, 0x8DF3, 0x8D34, 0x94C1, 0x5E16, + 0x5385, 0x542C, 0x70C3, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, + 0x8247, 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, + 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, 0x900F, + 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, 0x5C60, 0x571F, + 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, 0x817F, 0x8715, 0x892A, + 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, 0x6258, 0x8131, 0x9E35, 0x9640, + 0x9A6E, 0x9A7C, 0x692D, 0x59A5, 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, + 0x6D3C, 0x5A03, 0x74E6, 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, + 0x73A9, 0x987D, 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, + 0x60CB, 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, + 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01, 0x5DCD, 0x5FAE, + 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, 0x552F, 0x60DF, 0x4E3A, 0x6F4D, + 0x7EF4, 0x82C7, 0x840E, 0x59D4, 0x4F1F, 0x4F2A, 0x5C3E, 0x7EAC, 0x672A, + 0x851A, 0x5473, 0x754F, 0x80C3, 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, + 0x5C09, 0x6170, 0x536B, 0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, + 0x543B, 0x7A33, 0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, + 0x6DA1, 0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, 0x545C, + 0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, 0x68A7, 0x543E, + 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, 0x821E, 0x4F0D, 0x4FAE, + 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, 0x52FF, 0x52A1, 0x609F, 0x8BEF, + 0x6614, 0x7199, 0x6790, 0x897F, 0x7852, 0x77FD, 0x6670, 0x563B, 0x5438, + 0x9521, 0x727A, 0x7A00, 0x606F, 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, + 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D, 0x4E60, + 0x5AB3, 0x559C, 0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F, 0x7EC6, 0x778E, + 0x867E, 0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1, 0x4FA0, 0x72ED, 0x4E0B, + 0x53A6, 0x590F, 0x5413, 0x6380, 0x9528, 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, + 0x54B8, 0x8D24, 0x8854, 0x8237, 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, + 0x9669, 0x73B0, 0x732E, 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, 0x9677, + 0x9650, 0x7EBF, 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, 0x8944, 0x6E58, + 0x4E61, 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7, + 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, 0x785D, 0x9704, 0x524A, 0x54EE, + 0x56A3, 0x9500, 0x6D88, 0x5BB5, 0x6DC6, 0x6653, 0x5C0F, 0x5B5D, 0x6821, + 0x8096, 0x5578, 0x7B11, 0x6548, 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, + 0x534F, 0x631F, 0x643A, 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, + 0x5378, 0x87F9, 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, + 0x950C, 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, 0x661F, + 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, 0x90A2, 0x884C, + 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, 0x51F6, 0x80F8, 0x5308, + 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, 0x7F9E, 0x673D, 0x55C5, 0x9508, + 0x79C0, 0x8896, 0x7EE3, 0x589F, 0x620C, 0x9700, 0x865A, 0x5618, 0x987B, + 0x5F90, 0x8BB8, 0x84C4, 0x9157, 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, + 0x7D6E, 0x5A7F, 0x7EEA, 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, + 0x7384, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, 0x7A74, + 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, 0x5BFB, 0x9A6F, + 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, 0x8FC5, 0x538B, 0x62BC, + 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, 0x7259, 0x869C, 0x5D16, 0x8859, + 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, + 0x6DF9, 0x76D0, 0x4E25, 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, + 0x960E, 0x708E, 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, + 0x5830, 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, + 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, 0x4F6F, + 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, 0x517B, 0x6837, + 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476, 0x6447, 0x5C27, 0x9065, 0x7A91, + 0x8C23, 0x59DA, 0x54AC, 0x8200, 0x836F, 0x8981, 0x8000, 0x6930, 0x564E, + 0x8036, 0x7237, 0x91CE, 0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, + 0x66F3, 0x814B, 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, + 0x4F9D, 0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, 0x80F0, + 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, 0x501A, 0x5DF2, + 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, 0x9091, 0x5C79, 0x4EBF, + 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, 0x4EA6, 0x88D4, 0x610F, 0x6BC5, + 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, 0x8BE3, 0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, + 0x7FFC, 0x7FCC, 0x7ECE, 0x8335, 0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, + 0x59FB, 0x541F, 0x94F6, 0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690, + 0x5370, 0x82F1, 0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28, 0x83B9, 0x8424, + 0x8425, 0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8, 0x5F71, 0x9896, 0x786C, + 0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3, 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, + 0x86F9, 0x548F, 0x6CF3, 0x6D8C, 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, + 0x4F18, 0x60A0, 0x5FE7, 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, 0x6CB9, + 0x6E38, 0x9149, 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, 0x8BF1, 0x53C8, + 0x5E7C, 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, 0x865E, 0x611A, 0x8206, + 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685, 0x4E88, + 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED, 0x7FBD, 0x7389, + 0x57DF, 0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB, 0x5CEA, 0x5FA1, 0x6108, + 0x6B32, 0x72F1, 0x80B2, 0x8A89, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, + 0x9A6D, 0x9E33, 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, + 0x8F95, 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, 0x82D1, + 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, 0x94A5, 0x5CB3, + 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, 0x90E7, 0x5300, 0x9668, + 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, 0x97F5, 0x5B55, 0x531D, 0x7838, + 0x6742, 0x683D, 0x54C9, 0x707E, 0x5BB0, 0x8F7D, 0x518D, 0x5728, 0x54B1, + 0x6512, 0x6682, 0x8D5E, 0x8D43, 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, + 0x85FB, 0x67A3, 0x65E9, 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, + 0x7076, 0x71E5, 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, + 0x618E, 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67, 0x94E1, + 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, 0x70B8, 0x8BC8, 0x6458, + 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, 0x77BB, 0x6BE1, 0x8A79, 0x7C98, + 0x6CBE, 0x76CF, 0x65A9, 0x8F97, 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, + 0x6218, 0x7AD9, 0x6E5B, 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, + 0x638C, 0x6DA8, 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, + 0x969C, 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, + 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, 0x9517, + 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, 0x7827, 0x81FB, + 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, 0x9707, 0x632F, 0x9547, + 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, 0x72F0, 0x4E89, 0x6014, 0x6574, + 0x62EF, 0x6B63, 0x653F, 0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, + 0x652F, 0x5431, 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, + 0x804C, 0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, 0x6307, + 0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, 0x63B7, 0x81F3, + 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, 0x79E9, 0x7A1A, 0x8D28, + 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, 0x4E2D, 0x76C5, 0x5FE0, 0x949F, + 0x8877, 0x7EC8, 0x79CD, 0x80BF, 0x91CD, 0x4EF2, 0x4F17, 0x821F, 0x5468, + 0x5DDE, 0x6D32, 0x8BCC, 0x7CA5, 0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, + 0x5B99, 0x663C, 0x9AA4, 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, + 0x8BDB, 0x9010, 0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, + 0x8457, 0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51, 0x4F4F, 0x6CE8, + 0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD, 0x4E13, 0x7816, 0x8F6C, 0x64B0, + 0x8D5A, 0x7BC6, 0x6869, 0x5E84, 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, + 0x690E, 0x9525, 0x8FFD, 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, 0x6349, + 0x62D9, 0x5353, 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, 0x7740, 0x707C, + 0x6D4A, 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, + 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03, 0x68D5, + 0x8E2A, 0x5B97, 0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70, 0x594F, 0x63CD, + 0x79DF, 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5, 0x963B, 0x7EC4, 0x94BB, + 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, 0x5C0A, 0x9075, 0x6628, 0x5DE6, + 0x4F50, 0x67DE, 0x505A, 0x4F5C, 0x5750, 0x5EA7, 0x4E8D, 0x4E0C, 0x5140, + 0x4E10, 0x5EFF, 0x5345, 0x4E15, 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, + 0x4E28, 0x79BA, 0x4E3F, 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, + 0x56DF, 0x80E4, 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, + 0x4E5C, 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D, + 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5, 0x5326, + 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208, 0x520E, 0x522D, + 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261, 0x525C, 0x84AF, 0x527D, + 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, + 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, + 0x4EF5, 0x4F25, 0x4F27, 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, + 0x4F5D, 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, 0x4F89, + 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, 0x4FE6, + 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, 0x4FDF, 0x4FF8, + 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, 0x502E, 0x502D, 0x4FFE, 0x501C, + 0x500C, 0x5025, 0x5028, 0x507E, 0x5043, 0x5055, 0x5048, 0x504E, 0x506C, + 0x507B, 0x50A5, 0x50A7, 0x50A9, 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, + 0x50E6, 0x50EE, 0x5107, 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, + 0x9FA0, 0x6C46, 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, + 0x52F9, 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, 0x5156, + 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, 0x5B34, 0x8803, + 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC, 0x51C7, 0x5196, 0x51A2, 0x51A5, + 0x8BA0, 0x8BA6, 0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3, + 0x8BCB, 0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, + 0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, + 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, 0x8C0C, + 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, 0x8C1B, 0x8C18, + 0x8C1D, 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, + 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, 0x5369, 0x537A, 0x961D, 0x9622, + 0x9621, 0x9631, 0x962A, 0x963D, 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, + 0x9667, 0x966C, 0x9672, 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097, + 0x909B, 0x909D, 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6, 0x90BA, + 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4, 0x90C7, 0x90D3, + 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB, 0x90EF, 0x90FE, 0x9104, + 0x9122, 0x911E, 0x9123, 0x9131, 0x912F, 0x9139, 0x9143, 0x9146, 0x520D, + 0x5942, 0x52A2, 0x52AC, 0x52AD, 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, + 0x53DF, 0x71EE, 0x77CD, 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, + 0x755A, 0x5DEF, 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, + 0x5729, 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B, + 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768, 0x576D, + 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF, 0x57A7, 0x57B4, + 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9, 0x57D2, 0x57B8, 0x57F4, + 0x57EF, 0x57F8, 0x57E4, 0x57DD, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, + 0x581E, 0x5819, 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, + 0x5880, 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, + 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8, 0x82BE, + 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, 0x82CB, 0x82CC, + 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, 0x82C4, 0x82CE, 0x82A4, + 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F, 0x8307, 0x82DC, 0x82F4, 0x82D2, + 0x82D8, 0x830C, 0x82FB, 0x82D3, 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, + 0x82E0, 0x82D5, 0x831C, 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, + 0x8334, 0x8331, 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, + 0x8340, 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365, 0x8368, + 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, 0x83B0, 0x8378, 0x83B3, + 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, 0x8385, 0x837C, 0x83B6, 0x83A9, + 0x837D, 0x83B8, 0x837B, 0x8398, 0x839E, 0x83A8, 0x83BA, 0x83BC, 0x83C1, + 0x8401, 0x83E5, 0x83D8, 0x5807, 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, + 0x841C, 0x8438, 0x8411, 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, + 0x83F9, 0x83EA, 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, + 0x845A, 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, 0x843C, + 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, 0x84C1, 0x84CD, + 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, 0x84BA, 0x84E0, 0x84A1, + 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, 0x850C, 0x750D, 0x8538, 0x84F0, + 0x8539, 0x851F, 0x853A, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559, 0x8548, + 0x8568, 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, + 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, 0x85B7, + 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, 0x8629, 0x8616, + 0x863C, 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, 0x5955, 0x595A, 0x5958, + 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, 0x624C, 0x626A, 0x629F, 0x62BB, + 0x62CA, 0x62DA, 0x62D7, 0x62EE, 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, + 0x63AD, 0x63F6, 0x6371, 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A, + 0x6369, 0x63AE, 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4, 0x63DE, + 0x63CE, 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, + 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D, 0x6496, 0x647A, 0x64B7, + 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0, 0x64D7, 0x64E4, 0x64E2, 0x6509, + 0x6525, 0x652E, 0x5F0B, 0x5FD2, 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, + 0x53E9, 0x53E8, 0x53FB, 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, + 0x5454, 0x5456, 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, + 0x5494, 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466, + 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6, 0x54D3, + 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC, 0x54D9, 0x54DA, + 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF, 0x54DE, 0x551B, 0x54E7, + 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522, 0x5523, 0x550F, 0x5511, 0x5527, + 0x552A, 0x5567, 0x558F, 0x55B5, 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, + 0x5550, 0x553C, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, + 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, 0x559F, + 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE, 0x5594, 0x5599, + 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB, 0x55EC, 0x55D4, 0x55E6, + 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, 0x55F3, 0x55CC, 0x55CD, 0x55E8, + 0x55F5, 0x55E4, 0x8F94, 0x561E, 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, + 0x55FE, 0x5600, 0x5627, 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, + 0x5662, 0x5659, 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, + 0x567B, 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, + 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, 0x5E0F, + 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, 0x5E37, 0x5E44, 0x5E54, + 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, 0x5C8D, 0x5C90, 0x5C96, 0x5C88, + 0x5C98, 0x5C99, 0x5C91, 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, + 0x5CAB, 0x5CB1, 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, + 0x5CE5, 0x5D02, 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, + 0x5D1B, 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, + 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, 0x5D9D, 0x8C73, + 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, 0x5F89, 0x5F8C, 0x5F95, + 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, 0x8862, 0x5F61, 0x72AD, + 0x72B0, 0x72B4, 0x72B7, 0x72B8, 0x72C3, 0x72C1, 0x72CE, 0x72CD, 0x72D2, + 0x72E8, 0x72EF, 0x72E9, 0x72F2, 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, + 0x72FA, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, 0x7315, + 0x7322, 0x7339, 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, 0x734D, 0x7357, + 0x7360, 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, 0x98E7, 0x5924, 0x5902, + 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, 0x996B, 0x996C, 0x9974, 0x9977, + 0x997D, 0x9980, 0x9984, 0x9987, 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, + 0x9994, 0x9995, 0x5E80, 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9, + 0x5EB5, 0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, + 0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, + 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, 0x6035, + 0x6026, 0x601B, 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, 0x603F, 0x6021, + 0x6078, 0x6079, 0x607B, 0x607A, 0x6042, 0x606A, 0x607D, 0x6096, 0x609A, + 0x60AD, 0x609D, 0x6083, 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, + 0x60DD, 0x60D8, 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, + 0x60F4, 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7, + 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1, 0x95F3, + 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606, 0x9608, 0x960A, + 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615, 0x9616, 0x9617, 0x9619, + 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35, 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, + 0x6C85, 0x6C90, 0x6C94, 0x6C8C, 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, + 0x6CA9, 0x6CD0, 0x6CD4, 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, + 0x6CE0, 0x6CD6, 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE, + 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04, 0x6D19, 0x6D0E, + 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F, 0x6D52, 0x6D54, 0x6D33, + 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E, 0x6D93, 0x6D94, 0x6D5C, 0x6D60, + 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, + 0x6E11, 0x6DE6, 0x6DDD, 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, + 0x6E6E, 0x6E4E, 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, + 0x6E25, 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5, + 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F, 0x6EC2, + 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9, 0x6F2F, 0x6F36, + 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, 0x6F8D, 0x6F8C, 0x6F78, + 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, + 0x6FE1, 0x6FEE, 0x6FDE, 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, + 0x7035, 0x704F, 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, + 0x752F, 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, 0x8B07, + 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, 0x8FF3, + 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, 0x900D, 0x9016, 0x9021, + 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, 0x9051, 0x9052, 0x9050, 0x9068, + 0x9058, 0x9062, 0x905B, 0x66B9, 0x9074, 0x907D, 0x9082, 0x9088, 0x9083, + 0x908B, 0x5F50, 0x5F57, 0x5F56, 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, + 0x5B71, 0x5C63, 0x5C66, 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, + 0x9B3B, 0x5C6E, 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3, 0x5997, + 0x59CA, 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, 0x59AF, 0x59D7, 0x59BE, + 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, 0x59D8, 0x59F9, 0x5A0C, 0x5A09, + 0x5A32, 0x5A34, 0x5A11, 0x5A23, 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, + 0x5A3C, 0x5A62, 0x5A75, 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE, + 0x5AEB, 0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, + 0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, + 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, 0x9A75, + 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, 0x9A85, 0x9A88, + 0x9A8A, 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, + 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, + 0x7EA5, 0x7EA8, 0x7EA9, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, + 0x7EC9, 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1, + 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6, 0x7EFA, + 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08, 0x7F0B, 0x7F0C, + 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C, 0x7F1B, 0x7F1F, 0x7F21, + 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26, 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, + 0x7F2D, 0x7F2F, 0x7F30, 0x7F31, 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, + 0x5DDB, 0x753E, 0x9095, 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, + 0x73C2, 0x73D1, 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, + 0x987C, 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A, + 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C, 0x741B, 0x741A, + 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, 0x7477, 0x746D, 0x747E, 0x749C, + 0x748E, 0x7480, 0x7481, 0x7487, 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, + 0x74A7, 0x74D2, 0x74BA, 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, + 0x6748, 0x6769, 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, + 0x67A8, 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8, + 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3, 0x67DD, + 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD, 0x6832, 0x6833, + 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864, 0x6883, 0x681D, 0x6855, + 0x6866, 0x6841, 0x6867, 0x6840, 0x683E, 0x684A, 0x6849, 0x6829, 0x68B5, + 0x688F, 0x6874, 0x6877, 0x6893, 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, + 0x6920, 0x68F9, 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, + 0x6971, 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, 0x6998, + 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, 0x6966, 0x6963, + 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, 0x69D4, 0x69B1, 0x69C1, + 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, 0x69FF, 0x6A2F, 0x69ED, 0x6A17, + 0x6A18, 0x6A65, 0x69F2, 0x6A44, 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, + 0x6A8E, 0x6A79, 0x6A3D, 0x6A28, 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, + 0x6A97, 0x6AAB, 0x7337, 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, + 0x6B93, 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, + 0x8F72, 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, 0x8F7C, + 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B, 0x8F8D, 0x8F8E, 0x8F8F, + 0x8F98, 0x8F9A, 0x8ECE, 0x620B, 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, + 0x6225, 0x6224, 0x622C, 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511, + 0x7513, 0x6534, 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772, 0x6603, + 0x6615, 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, + 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, 0x6677, + 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, 0x66E6, 0x66E9, + 0x8D32, 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, 0x8D45, 0x8D46, 0x8D48, + 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, 0x89C7, 0x89CA, 0x89CB, 0x89CC, + 0x89CE, 0x89CF, 0x89D0, 0x89D1, 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, + 0x727E, 0x727F, 0x7284, 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332, + 0x63B0, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, + 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19, 0x6C1A, 0x6C21, + 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555, 0x656B, 0x724D, 0x7252, + 0x7256, 0x7230, 0x8662, 0x5216, 0x809F, 0x809C, 0x8093, 0x80BC, 0x670A, + 0x80BD, 0x80B1, 0x80AB, 0x80AD, 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, + 0x80EA, 0x80DB, 0x80C2, 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, + 0x80EB, 0x80F1, 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, + 0x8112, 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C, + 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C, 0x817D, + 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191, 0x6ED5, 0x81A3, + 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB, 0x81C1, 0x81A6, 0x6B24, 0x6B37, + 0x6B39, 0x6B43, 0x6B46, 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, + 0x98DA, 0x6BB3, 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, + 0x65C6, 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C, + 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8, 0x70CA, + 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C, 0x7168, 0x7145, + 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, 0x71B5, 0x71A8, 0x71A0, + 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, 0x7228, 0x706C, 0x7118, 0x7166, + 0x71B9, 0x623E, 0x623D, 0x6243, 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, + 0x7949, 0x795B, 0x795C, 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, + 0x7967, 0x797A, 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, + 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, 0x60AB, 0x6106, + 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, 0x6206, 0x8080, 0x807F, + 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, 0x7800, 0x7809, 0x7817, 0x7818, + 0x7811, 0x65AB, 0x782D, 0x781C, 0x781D, 0x7839, 0x783A, 0x783B, 0x781F, + 0x783C, 0x7825, 0x782C, 0x7823, 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, + 0x7826, 0x7850, 0x7847, 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, + 0x789C, 0x78A1, 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, + 0x78EC, 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, 0x9F9B, + 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, 0x7707, 0x7708, + 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, 0x7738, 0x7750, 0x7751, + 0x7747, 0x7743, 0x775A, 0x7768, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D, + 0x7780, 0x778C, 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD, 0x753A, + 0x7540, 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, + 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, 0x7F7E, + 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, 0x948A, 0x948C, + 0x948D, 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, 0x949A, 0x949B, 0x949C, + 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, 0x94AC, 0x94AF, 0x94B0, 0x94B2, + 0x94B4, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, + 0x94C4, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0, + 0x94D1, 0x94D2, 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB, 0x94DE, + 0x94DF, 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8, 0x94EA, 0x94E9, + 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5, 0x94F7, 0x94F9, 0x94FC, + 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506, 0x9507, 0x9509, 0x950A, 0x950D, + 0x950E, 0x950F, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, + 0x951D, 0x951E, 0x951F, 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, + 0x9532, 0x9534, 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, + 0x9535, 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552, + 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E, 0x955F, + 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, + 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572, 0x9573, 0x953A, 0x77E7, + 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3, 0x79EB, 0x7A06, 0x5D47, 0x7A03, + 0x7A02, 0x7A1E, 0x7A14, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, + 0x7688, 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20, + 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31, 0x9E36, + 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42, 0x9E44, 0x9E46, + 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E, 0x9E51, 0x9E55, 0x9E57, + 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63, 0x9E66, 0x9E67, 0x9E68, 0x9E69, + 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71, 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, + 0x75A0, 0x759D, 0x75AC, 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, + 0x75B0, 0x75C3, 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, + 0x75EB, 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605, + 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619, 0x761B, 0x763C, + 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, 0x763F, 0x7635, 0x7643, 0x763E, + 0x7633, 0x764D, 0x765E, 0x7654, 0x765C, 0x7656, 0x766B, 0x766F, 0x7FCA, + 0x7AE6, 0x7A78, 0x7A79, 0x7A80, 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, + 0x7AAC, 0x7AA8, 0x7AAD, 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, + 0x8882, 0x88A2, 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, + 0x88E5, 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, 0x8919, + 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, 0x8966, 0x897B, + 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, 0x8014, 0x8016, 0x801C, + 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, 0x8028, 0x8031, 0x800B, + 0x8035, 0x8043, 0x8046, 0x804D, 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, + 0x9880, 0x9883, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, + 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, 0x866C, + 0x866E, 0x867F, 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, 0x868B, 0x86AC, + 0x869D, 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, 0x86B6, 0x86C4, 0x86B5, + 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, 0x86C9, 0x86CF, 0x86B4, 0x86E9, + 0x86F1, 0x86F2, 0x86ED, 0x86F3, 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, + 0x86D8, 0x86D1, 0x8703, 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709, + 0x8723, 0x873B, 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748, 0x8734, + 0x8731, 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, + 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, 0x8764, + 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8, 0x87D2, 0x87C6, 0x8788, 0x8785, + 0x87AD, 0x8797, 0x8783, 0x87AB, 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, + 0x87D3, 0x87BD, 0x87D1, 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, + 0x8816, 0x8813, 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, + 0x7F42, 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04, + 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19, 0x7B2E, + 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E, 0x7B58, 0x7B5A, + 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E, 0x7B7B, 0x7B62, 0x7B72, + 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8, 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, + 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB, 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, + 0x7BDA, 0x7BE5, 0x7BE6, 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, + 0x7C0B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE, 0x8201, + 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223, 0x822D, 0x822F, + 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234, 0x823E, 0x8244, 0x8249, + 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, 0x887E, 0x8885, 0x8888, 0x88D8, + 0x88DF, 0x895E, 0x7F9D, 0x7F9F, 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, + 0x6549, 0x7C91, 0x7C9D, 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, + 0x7CC1, 0x7CC7, 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, + 0x66A8, 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, + 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8, 0x9EB4, + 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D, 0x8C47, 0x8C49, + 0x914A, 0x9150, 0x914E, 0x914F, 0x9164, 0x9162, 0x9161, 0x9170, 0x9169, + 0x916F, 0x917D, 0x917E, 0x9172, 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, + 0x918D, 0x9191, 0x91A2, 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, + 0x91B4, 0x91BA, 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, + 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, + 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, 0x8DF9, + 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, 0x8E2C, 0x8E2E, + 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, 0x8E35, 0x8E3D, 0x8E31, 0x8E49, + 0x8E41, 0x8E42, 0x8E51, 0x8E52, 0x8E4A, 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, + 0x8E74, 0x8E85, 0x8E8F, 0x8E94, 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, + 0x8C8A, 0x8C85, 0x8C98, 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC, + 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, 0x96F3, 0x96EF, + 0x9706, 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, 0x972D, 0x9730, 0x973E, + 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, + 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, + 0x96E0, 0x928E, 0x92AE, 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E, + 0x946B, 0x9C7F, 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23, 0x9C8B, + 0x9C8E, 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, + 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, 0x9CA8, + 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, 0x9CB3, 0x9CB4, + 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, + 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, + 0x9CD3, 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, + 0x9CE2, 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3, + 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA, 0x9ABC, + 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1, 0x9B45, 0x9B43, + 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8, 0x990D, 0x992E, 0x9955, + 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF, 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, + 0x9B08, 0x9B0F, 0x9B13, 0x9B1F, 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, + 0x9E87, 0x9E88, 0x9E8B, 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, + 0x9EDD, 0x9EE0, 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, + 0x9F22, 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44, 0x3007, + 0xFF5E, 0x2016, 0x3013, 0xFF0E, 0xFF1D, 0xFF3B, 0xFF3D, 0xFFE3, 0x00FC, + 0x00A9, 0x2122, 0x2026, 0x0020, 0x769A, 0x85F9, 0x7919, 0x611B, 0x9AAF, + 0x8956, 0x58E9, 0x7F77, 0x64FA, 0x6557, 0x9812, 0x8FA6, 0x7D46, 0x5E6B, + 0x7D81, 0x938A, 0x8B17, 0x98FD, 0x5BF6, 0x5831, 0x9B91, 0x8F29, 0x8C9D, + 0x92C7, 0x72FD, 0x5099, 0x618A, 0x7DB3, 0x7B46, 0x7562, 0x6583, 0x5E63, + 0x9589, 0x908A, 0x7DE8, 0x8CB6, 0x8B8A, 0x8FAF, 0x8FAE, 0x6A19, 0x9C49, + 0x765F, 0x7015, 0x6FF1, 0x8CD3, 0x64EF, 0x9905, 0x64A5, 0x9262, 0x9251, + 0x99C1, 0x88DC, 0x8CA1, 0x53C3, 0x8836, 0x6B98, 0x615A, 0x6158, 0x71E6, + 0x84BC, 0x8259, 0x5009, 0x6EC4, 0x53A0, 0x5074, 0x6E2C, 0x5C64, 0x8A6B, + 0x6519, 0x647B, 0x87EC, 0x995E, 0x8B92, 0x7E8F, 0x93DF, 0x7523, 0x95E1, + 0x986B, 0x5834, 0x5617, 0x9577, 0x511F, 0x8178, 0x5EE0, 0x66A2, 0x9214, + 0x8ECA, 0x5FB9, 0x5875, 0x9673, 0x896F, 0x7A31, 0x61F2, 0x8AA0, 0x9A01, + 0x9072, 0x99B3, 0x9F52, 0x71BE, 0x885D, 0x87F2, 0x5BF5, 0x7587, 0x8E8A, + 0x7C4C, 0x7DA2, 0x919C, 0x92E4, 0x96DB, 0x790E, 0x5132, 0x89F8, 0x8655, + 0x50B3, 0x7621, 0x95D6, 0x5275, 0x9318, 0x7D14, 0x7DBD, 0x8FAD, 0x8A5E, + 0x8CDC, 0x8070, 0x5F9E, 0x53E2, 0x8EA5, 0x7AC4, 0x932F, 0x9054, 0x5E36, + 0x8CB8, 0x64D4, 0x55AE, 0x9132, 0x64A3, 0x81BD, 0x619A, 0x8A95, 0x5F48, + 0x7576, 0x64CB, 0x9EE8, 0x8569, 0x6A94, 0x6417, 0x5CF6, 0x79B1, 0x5C0E, + 0x71C8, 0x9127, 0x6575, 0x6ECC, 0x905E, 0x7DE0, 0x985B, 0x9EDE, 0x588A, + 0x96FB, 0x6FB1, 0x91E3, 0x8ABF, 0x8ADC, 0x91D8, 0x9802, 0x9320, 0x8A02, + 0x6771, 0x52D5, 0x68DF, 0x51CD, 0x9B25, 0x72A2, 0x7368, 0x8B80, 0x8CED, + 0x934D, 0x935B, 0x65B7, 0x7DDE, 0x968A, 0x5C0D, 0x5678, 0x9813, 0x920D, + 0x596A, 0x58AE, 0x9D5D, 0x984D, 0x8A1B, 0x60E1, 0x9913, 0x5152, 0x723E, + 0x990C, 0x8CB3, 0x767C, 0x7F70, 0x95A5, 0x792C, 0x91E9, 0x7169, 0x7BC4, + 0x8CA9, 0x98EF, 0x8A2A, 0x7D21, 0x98DB, 0x8AB9, 0x5EE2, 0x8CBB, 0x7D1B, + 0x58B3, 0x596E, 0x61A4, 0x7CDE, 0x8C50, 0x6953, 0x92D2, 0x98A8, 0x760B, + 0x99AE, 0x7E2B, 0x8AF7, 0x9CF3, 0x819A, 0x8F3B, 0x64AB, 0x8F14, 0x8CE6, + 0x5FA9, 0x8CA0, 0x8A03, 0x5A66, 0x7E1B, 0x8A72, 0x9223, 0x84CB, 0x5E79, + 0x8D95, 0x8D1B, 0x5CA1, 0x525B, 0x92FC, 0x7DB1, 0x5D17, 0x93AC, 0x64F1, + 0x9D3F, 0x95A3, 0x927B, 0x500B, 0x7D66, 0x9F94, 0x978F, 0x8CA2, 0x920E, + 0x6E9D, 0x69CB, 0x8CFC, 0x8831, 0x9867, 0x526E, 0x95DC, 0x89C0, 0x9928, + 0x6163, 0x8CAB, 0x5EE3, 0x898F, 0x6B78, 0x9F9C, 0x95A8, 0x8ECC, 0x8A6D, + 0x6AC3, 0x8CB4, 0x528A, 0x8F25, 0x934B, 0x570B, 0x904E, 0x99ED, 0x97D3, + 0x6F22, 0x865F, 0x95A1, 0x9DB4, 0x8CC0, 0x8F5F, 0x9D3B, 0x7D05, 0x58FA, + 0x8B77, 0x6EEC, 0x5629, 0x83EF, 0x756B, 0x5283, 0x8A71, 0x61F7, 0x58DE, + 0x6B61, 0x74B0, 0x9084, 0x7DE9, 0x8B0A, 0x63EE, 0x8F1D, 0x8CC4, 0x7A62, + 0x6703, 0x71F4, 0x532F, 0x8AF1, 0x8AA8, 0x7E6A, 0x8477, 0x6E3E, 0x7372, + 0x8CA8, 0x798D, 0x64CA, 0x6A5F, 0x7A4D, 0x9951, 0x8B4F, 0x9DC4, 0x7E3E, + 0x7DDD, 0x6975, 0x8F2F, 0x7D1A, 0x64E0, 0x5E7E, 0x858A, 0x5291, 0x6FDF, + 0x8A08, 0x8A18, 0x969B, 0x7E7C, 0x7D00, 0x593E, 0x83A2, 0x9830, 0x8CC8, + 0x9240, 0x50F9, 0x99D5, 0x6BB2, 0x76E3, 0x5805, 0x7B8B, 0x9593, 0x8271, + 0x7DD8, 0x7E6D, 0x6AA2, 0x9E7C, 0x63C0, 0x64BF, 0x7C21, 0x5109, 0x85A6, + 0x6ABB, 0x9452, 0x8E10, 0x8CE4, 0x898B, 0x9375, 0x8266, 0x528D, 0x991E, + 0x6F38, 0x6FFA, 0x6F97, 0x5C07, 0x6F3F, 0x8523, 0x69F3, 0x596C, 0x8B1B, + 0x91AC, 0x81A0, 0x6F86, 0x9A55, 0x5B0C, 0x652A, 0x9278, 0x77EF, 0x50E5, + 0x9903, 0x7E73, 0x7D5E, 0x8F4E, 0x8F03, 0x968E, 0x7BC0, 0x6F54, 0x7D50, + 0x8AA1, 0x7DCA, 0x9326, 0x50C5, 0x8B39, 0x9032, 0x71FC, 0x76E1, 0x52C1, + 0x8396, 0x9BE8, 0x9A5A, 0x7D93, 0x9838, 0x93E1, 0x5F91, 0x75D9, 0x7AF6, + 0x7CFE, 0x820A, 0x99D2, 0x8209, 0x64DA, 0x92F8, 0x61FC, 0x5287, 0x9D51, + 0x7D79, 0x89BA, 0x8A23, 0x7D76, 0x921E, 0x8ECD, 0x99FF, 0x958B, 0x51F1, + 0x9846, 0x6BBB, 0x8AB2, 0x58BE, 0x61C7, 0x6473, 0x5EAB, 0x8932, 0x8A87, + 0x584A, 0x5108, 0x5BEC, 0x7926, 0x66E0, 0x8667, 0x5DCB, 0x7ABA, 0x994B, + 0x6F70, 0x64F4, 0x95CA, 0x881F, 0x81D8, 0x840A, 0x4F86, 0x8CF4, 0x85CD, + 0x6B04, 0x6514, 0x7C43, 0x95CC, 0x862D, 0x703E, 0x8B95, 0x652C, 0x89BD, + 0x61F6, 0x7E9C, 0x721B, 0x6FEB, 0x6488, 0x52DE, 0x6F87, 0x6A02, 0x9433, + 0x58D8, 0x985E, 0x7C6C, 0x96E2, 0x7055, 0x88CF, 0x9BC9, 0x79AE, 0x9E97, + 0x53B2, 0x52F5, 0x792B, 0x6B77, 0x701D, 0x96B8, 0x5006, 0x806F, 0x84EE, + 0x9023, 0x942E, 0x6190, 0x6F23, 0x7C3E, 0x6582, 0x81C9, 0x93C8, 0x6200, + 0x7149, 0x7DF4, 0x7CE7, 0x5169, 0x8F1B, 0x8AD2, 0x7642, 0x907C, 0x9410, + 0x7375, 0x81E8, 0x9130, 0x9C57, 0x8CC3, 0x9F61, 0x9234, 0x9748, 0x5DBA, + 0x9818, 0x993E, 0x5289, 0x9F8D, 0x807E, 0x56A8, 0x7C60, 0x58DF, 0x650F, + 0x96B4, 0x6A13, 0x5A41, 0x645F, 0x7C0D, 0x8606, 0x76E7, 0x9871, 0x5EEC, + 0x7210, 0x64C4, 0x6EF7, 0x865C, 0x9B6F, 0x8CC2, 0x9332, 0x9678, 0x9A62, + 0x92C1, 0x5C62, 0x7E37, 0x616E, 0x6FFE, 0x7DD1, 0x5DD2, 0x6523, 0x5B7F, + 0x7064, 0x4E82, 0x6384, 0x8F2A, 0x502B, 0x4F96, 0x6DEA, 0x7DB8, 0x8AD6, + 0x863F, 0x7F85, 0x908F, 0x947C, 0x7C6E, 0x9A3E, 0x99F1, 0x7D61, 0x5ABD, + 0x746A, 0x78BC, 0x879E, 0x99AC, 0x99E1, 0x55CE, 0x8CB7, 0x9EA5, 0x8CE3, + 0x9081, 0x779E, 0x9945, 0x883B, 0x6EFF, 0x8B3E, 0x9328, 0x925A, 0x8CBF, + 0x9382, 0x9580, 0x60B6, 0x5011, 0x9333, 0x5922, 0x8B0E, 0x5F4C, 0x8993, + 0x7DBF, 0x7DEC, 0x5EDF, 0x6EC5, 0x61AB, 0x95A9, 0x9CF4, 0x9298, 0x8B2C, + 0x8B00, 0x755D, 0x9209, 0x7D0D, 0x96E3, 0x6493, 0x8166, 0x60F1, 0x9B27, + 0x9912, 0x64EC, 0x81A9, 0x6506, 0x91C0, 0x9CE5, 0x8076, 0x5699, 0x9477, + 0x93B3, 0x6AB8, 0x7370, 0x5BE7, 0x64F0, 0x6FD8, 0x9215, 0x7D10, 0x81BF, + 0x6FC3, 0x8FB2, 0x7627, 0x8AFE, 0x6B50, 0x9DD7, 0x6BC6, 0x5614, 0x6F1A, + 0x76E4, 0x9F90, 0x8CE0, 0x5674, 0x9D6C, 0x9A19, 0x98C4, 0x983B, 0x8CA7, + 0x860B, 0x6191, 0x8A55, 0x6F51, 0x9817, 0x64B2, 0x92EA, 0x50D5, 0x6A38, + 0x8B5C, 0x81CD, 0x9F4A, 0x9A0E, 0x8C48, 0x5553, 0x6C23, 0x8A16, 0x727D, + 0x91FA, 0x925B, 0x9077, 0x7C3D, 0x8B19, 0x9322, 0x9257, 0x6DFA, 0x8B74, + 0x5879, 0x69CD, 0x55C6, 0x58BB, 0x8594, 0x6436, 0x936C, 0x6A4B, 0x55AC, + 0x50D1, 0x7FF9, 0x7AC5, 0x7ACA, 0x6B3D, 0x89AA, 0x5BE2, 0x8F15, 0x6C2B, + 0x50BE, 0x9803, 0x8ACB, 0x6176, 0x74CA, 0x7AAE, 0x8DA8, 0x5340, 0x8EC0, + 0x9A45, 0x9F72, 0x9874, 0x6B0A, 0x52F8, 0x9D72, 0x78BA, 0x8B93, 0x9952, + 0x64FE, 0x7E5E, 0x71B1, 0x97CC, 0x8A8D, 0x7D09, 0x69AE, 0x7D68, 0x8EDF, + 0x92ED, 0x958F, 0x6F64, 0x7051, 0x85A9, 0x9C13, 0x8CFD, 0x5098, 0x55AA, + 0x9A37, 0x6383, 0x6F80, 0x6BBA, 0x7D17, 0x7BE9, 0x66EC, 0x9583, 0x965D, + 0x8D0D, 0x7E55, 0x50B7, 0x8CDE, 0x71D2, 0x7D39, 0x8CD2, 0x6368, 0x651D, + 0x61FE, 0x8A2D, 0x7D33, 0x5BE9, 0x5B38, 0x814E, 0x6EF2, 0x8072, 0x7E69, + 0x52DD, 0x8056, 0x5E2B, 0x7345, 0x6FD5, 0x8A69, 0x6642, 0x8755, 0x5BE6, + 0x8B58, 0x99DB, 0x52E2, 0x9069, 0x91CB, 0x98FE, 0x8996, 0x8A66, 0x58FD, + 0x7378, 0x6A1E, 0x8F38, 0x66F8, 0x8D16, 0x5C6C, 0x8853, 0x6A39, 0x7AEA, + 0x6578, 0x5E25, 0x96D9, 0x8AB0, 0x9806, 0x8AAC, 0x78A9, 0x720D, 0x7D72, + 0x98FC, 0x9B06, 0x8073, 0x616B, 0x980C, 0x8A1F, 0x8AA6, 0x64FB, 0x8607, + 0x8A34, 0x8085, 0x96D6, 0x96A8, 0x7D8F, 0x6B72, 0x5B6B, 0x640D, 0x7E2E, + 0x7463, 0x9396, 0x737A, 0x64BB, 0x81FA, 0x614B, 0x6524, 0x8CAA, 0x7671, + 0x7058, 0x58C7, 0x8B5A, 0x8AC7, 0x5606, 0x6E6F, 0x71D9, 0x6FE4, 0x7E27, + 0x8A0E, 0x9A30, 0x8B04, 0x92BB, 0x984C, 0x9AD4, 0x689D, 0x8CBC, 0x9435, + 0x5EF3, 0x807D, 0x70F4, 0x9285, 0x7D71, 0x982D, 0x5716, 0x5857, 0x5718, + 0x983D, 0x9D15, 0x99B1, 0x99DD, 0x6A62, 0x7AAA, 0x896A, 0x5F4E, 0x7063, + 0x9811, 0x842C, 0x7DB2, 0x97CB, 0x9055, 0x570D, 0x7232, 0x6FF0, 0x7DAD, + 0x8466, 0x5049, 0x50DE, 0x7DEF, 0x8B02, 0x885B, 0x805E, 0x7D0B, 0x7A69, + 0x554F, 0x64BE, 0x8778, 0x6E26, 0x7AA9, 0x55DA, 0x93A2, 0x70CF, 0x8AA3, + 0x7121, 0x856A, 0x5862, 0x9727, 0x52D9, 0x8AA4, 0x932B, 0x72A7, 0x8972, + 0x7FD2, 0x9291, 0x6232, 0x7D30, 0x8766, 0x8F44, 0x5CFD, 0x4FE0, 0x72F9, + 0x5687, 0x9341, 0x9BAE, 0x7E96, 0x8CE2, 0x929C, 0x9591, 0x986F, 0x96AA, + 0x73FE, 0x737B, 0x7E23, 0x9921, 0x61B2, 0x7DAB, 0x9472, 0x9109, 0x8A73, + 0x97FF, 0x9805, 0x856D, 0x56C2, 0x92B7, 0x66C9, 0x562F, 0x5354, 0x633E, + 0x8105, 0x8AE7, 0x5BEB, 0x7009, 0x8B1D, 0x92C5, 0x91C1, 0x8208, 0x92B9, + 0x7D89, 0x9808, 0x8A31, 0x7DD2, 0x7E8C, 0x8ED2, 0x61F8, 0x9078, 0x766C, + 0x7D62, 0x5B78, 0x52DB, 0x8A62, 0x5C0B, 0x99B4, 0x8A13, 0x8A0A, 0x905C, + 0x58D3, 0x9D09, 0x9D28, 0x555E, 0x4E9E, 0x8A1D, 0x95B9, 0x9E7D, 0x56B4, + 0x9854, 0x95BB, 0x8277, 0x53AD, 0x786F, 0x8AFA, 0x9A57, 0x9D26, 0x694A, + 0x63DA, 0x760D, 0x967D, 0x7662, 0x990A, 0x6A23, 0x582F, 0x8B21, 0x85E5, + 0x723A, 0x9801, 0x696D, 0x8449, 0x91AB, 0x92A5, 0x9824, 0x907A, 0x5100, + 0x87FB, 0x85DD, 0x5104, 0x61B6, 0x7FA9, 0x8A63, 0x8B70, 0x8ABC, 0x8B6F, + 0x7E79, 0x852D, 0x9670, 0x9280, 0x98F2, 0x96B1, 0x6AFB, 0x5B30, 0x9DF9, + 0x61C9, 0x7E93, 0x7469, 0x87A2, 0x71DF, 0x7192, 0x8805, 0x8D0F, 0x7A4E, + 0x55B2, 0x64C1, 0x50AD, 0x7670, 0x8E34, 0x512A, 0x6182, 0x90F5, 0x923E, + 0x7336, 0x8A98, 0x8F3F, 0x9918, 0x9B5A, 0x6F01, 0x8207, 0x5DBC, 0x8A9E, + 0x9B31, 0x7344, 0x8B7D, 0x9810, 0x99AD, 0x9D1B, 0x6DF5, 0x8F45, 0x5712, + 0x54E1, 0x5713, 0x7DE3, 0x9060, 0x9858, 0x7D04, 0x8E8D, 0x9470, 0x95B2, + 0x96F2, 0x9116, 0x9695, 0x904B, 0x85F4, 0x9196, 0x6688, 0x96DC, 0x8F09, + 0x6522, 0x66AB, 0x8D0A, 0x8D1C, 0x81DF, 0x947F, 0x68D7, 0x7AC8, 0x8CAC, + 0x64C7, 0x5247, 0x6FA4, 0x8CCA, 0x8D08, 0x8ECB, 0x9358, 0x9598, 0x8A50, + 0x9F4B, 0x50B5, 0x6C08, 0x76DE, 0x65AC, 0x8F3E, 0x5D84, 0x68E7, 0x6230, + 0x7DBB, 0x5F35, 0x6F32, 0x5E33, 0x8CEC, 0x8139, 0x8D99, 0x87C4, 0x8F4D, + 0x937A, 0x9019, 0x8C9E, 0x91DD, 0x5075, 0x8A3A, 0x93AE, 0x9663, 0x5E40, + 0x7665, 0x912D, 0x8B49, 0x7E54, 0x8077, 0x57F7, 0x8879, 0x7D19, 0x646F, + 0x64F2, 0x5E5F, 0x8CEA, 0x6EEF, 0x9418, 0x7D42, 0x7A2E, 0x816B, 0x8846, + 0x8B05, 0x8EF8, 0x76BA, 0x665D, 0x9A5F, 0x8AF8, 0x8A85, 0x71ED, 0x77DA, + 0x56D1, 0x8CAF, 0x9444, 0x7BC9, 0x99D0, 0x5C08, 0x78DA, 0x8F49, 0x8CFA, + 0x6A01, 0x838A, 0x88DD, 0x599D, 0x58EF, 0x72C0, 0x9310, 0x8D05, 0x589C, + 0x7DB4, 0x8AC4, 0x6E96, 0x6FC1, 0x8CC7, 0x6F2C, 0x7D9C, 0x7E3D, 0x7E31, + 0x9112, 0x8A5B, 0x7D44, 0x947D, 0x55C7, 0x5399, 0x53B4, 0x9768, 0x8D0B, + 0x532D, 0x5331, 0x8CFE, 0x5244, 0x528C, 0x5274, 0x50B4, 0x5000, 0x5096, + 0x5115, 0x5102, 0x5114, 0x513C, 0x5137, 0x50E8, 0x50C2, 0x513B, 0x5110, + 0x513A, 0x50C9, 0x7CF4, 0x9ECC, 0x56C5, 0x9CEC, 0x893B, 0x81E0, 0x8A01, + 0x8A10, 0x8A0C, 0x8A15, 0x8B33, 0x8A4E, 0x8A25, 0x8A41, 0x8A36, 0x8A46, + 0x8A54, 0x8A58, 0x8A52, 0x8A86, 0x8A84, 0x8A7F, 0x8A70, 0x8A7C, 0x8A75, + 0x8A6C, 0x8A6E, 0x8ACD, 0x8AE2, 0x8A61, 0x8A9A, 0x8AA5, 0x8A91, 0x8A92, + 0x8ACF, 0x8AD1, 0x8AC9, 0x8ADB, 0x8AD7, 0x8AC2, 0x8AB6, 0x8AF6, 0x8AEB, + 0x8B14, 0x8B01, 0x8AE4, 0x8AED, 0x8AFC, 0x8AF3, 0x8AE6, 0x8AEE, 0x8ADE, + 0x8B28, 0x8B9C, 0x8B16, 0x8B1A, 0x8B10, 0x8B2B, 0x8B2D, 0x8B56, 0x8B59, + 0x8B4E, 0x8B9E, 0x8B6B, 0x8B96, 0x9658, 0x913A, 0x9114, 0x9134, 0x90DF, + 0x9136, 0x9106, 0x9148, 0x82BB, 0x52F1, 0x5DF0, 0x580A, 0x58D9, 0x58E2, + 0x58E0, 0x58DA, 0x57E1, 0x584F, 0x5816, 0x5852, 0x581D, 0x5864, 0x858C, + 0x8553, 0x85F6, 0x83A7, 0x8407, 0x84EF, 0x82E7, 0x8622, 0x8526, 0x584B, + 0x7162, 0x8558, 0x84FD, 0x854E, 0x8588, 0x85BA, 0x7296, 0x6ECE, 0x8541, + 0x85CE, 0x8552, 0x84C0, 0x8452, 0x8464, 0x8494, 0x8435, 0x859F, 0x8555, + 0x9DAF, 0x8493, 0x7E08, 0x8546, 0x8562, 0x851E, 0x9A40, 0x863A, 0x93A3, + 0x8577, 0x861E, 0x85FA, 0x8604, 0x85EA, 0x861A, 0x5969, 0x5C37, 0x636B, + 0x6476, 0x649F, 0x6451, 0x645C, 0x64B3, 0x6504, 0x6516, 0x64F7, 0x64FC, + 0x651B, 0x5630, 0x5638, 0x56C8, 0x56A6, 0x5504, 0x54BC, 0x5680, 0x565D, + 0x5660, 0x5635, 0x55F6, 0x5666, 0x5672, 0x568C, 0x5665, 0x561C, 0x562E, + 0x55E9, 0x5616, 0x56C0, 0x560D, 0x56B3, 0x56C1, 0x566F, 0x8F61, 0x56B6, + 0x5695, 0x5707, 0x5E43, 0x5E6C, 0x5E58, 0x5E57, 0x5D87, 0x5CF4, 0x5D50, + 0x5D2C, 0x5DA7, 0x5DA0, 0x5D97, 0x5D0D, 0x5DB8, 0x5D81, 0x5DD4, 0x5FA0, + 0x7377, 0x7341, 0x736A, 0x733B, 0x736B, 0x7380, 0x737C, 0x98E0, 0x9933, + 0x98E9, 0x993C, 0x98EA, 0x98EB, 0x98ED, 0x98F4, 0x9909, 0x9911, 0x991B, + 0x9937, 0x993F, 0x9943, 0x9948, 0x9949, 0x994A, 0x994C, 0x9962, 0x5EE1, + 0x8CE1, 0x61FA, 0x61AE, 0x616A, 0x613E, 0x60B5, 0x6134, 0x61CC, 0x615F, + 0x61E8, 0x60FB, 0x6137, 0x60F2, 0x6173, 0x611C, 0x6192, 0x9582, 0x9586, + 0x95C8, 0x958E, 0x9594, 0x958C, 0x95E5, 0x95AD, 0x95AB, 0x9B2E, 0x95AC, + 0x95BE, 0x95B6, 0x9B29, 0x95BF, 0x95BD, 0x95BC, 0x95C3, 0x95CB, 0x95D4, + 0x95D0, 0x95D5, 0x95DE, 0x7043, 0x6F59, 0x7027, 0x7018, 0x6FFC, 0x6D87, + 0x6D79, 0x6E5E, 0x6FAE, 0x700F, 0x6EF8, 0x6F6F, 0x6DF6, 0x6F7F, 0x7006, + 0x6FA0, 0x700B, 0x7067, 0x7044, 0x7005, 0x6F77, 0x7020, 0x701F, 0x7032, + 0x7028, 0x705D, 0x9A2B, 0x9087, 0x9015, 0x9090, 0x5C68, 0x5F33, 0x5AF5, + 0x5AD7, 0x5B00, 0x5A6D, 0x5B08, 0x5B4C, 0x5AA7, 0x5AFB, 0x5B0B, 0x5B21, + 0x5B2A, 0x5B19, 0x99D4, 0x99DF, 0x99D9, 0x9A36, 0x9A5B, 0x99D1, 0x99D8, + 0x9A4D, 0x9A4A, 0x99E2, 0x9A6A, 0x9A0F, 0x9A0D, 0x9A05, 0x9A42, 0x9A2D, + 0x9A16, 0x9A41, 0x9A2E, 0x9A38, 0x9A43, 0x9A44, 0x9A4F, 0x9A65, 0x9A64, + 0x7CF9, 0x7D06, 0x7D02, 0x7D07, 0x7D08, 0x7E8A, 0x7D1C, 0x7D15, 0x7D13, + 0x7D3A, 0x7D32, 0x7D31, 0x7E10, 0x7D3C, 0x7D40, 0x7D3F, 0x7D5D, 0x7D4E, + 0x7D73, 0x7D86, 0x7D83, 0x7D88, 0x7DBE, 0x7DBA, 0x7DCB, 0x7DD4, 0x7DC4, + 0x7D9E, 0x7DAC, 0x7DB9, 0x7DA3, 0x7DB0, 0x7DC7, 0x7DD9, 0x7DD7, 0x7DF9, + 0x7DF2, 0x7E62, 0x7DE6, 0x7DF6, 0x7DF1, 0x7E0B, 0x7DE1, 0x7E09, 0x7E1D, + 0x7E1F, 0x7E1E, 0x7E2D, 0x7E0A, 0x7E11, 0x7E7D, 0x7E39, 0x7E35, 0x7E32, + 0x7E46, 0x7E45, 0x7E88, 0x7E5A, 0x7E52, 0x7E6E, 0x7E7E, 0x7E70, 0x7E6F, + 0x7E98, 0x74A3, 0x744B, 0x74CF, 0x980A, 0x74BD, 0x743F, 0x7489, 0x74A6, + 0x74D4, 0x74DA, 0x97D9, 0x97DE, 0x97DC, 0x69AA, 0x6AEA, 0x6898, 0x68D6, + 0x6A05, 0x689F, 0x6ADB, 0x6AF3, 0x6AE8, 0x6ADF, 0x6A89, 0x690F, 0x6A48, + 0x6968, 0x69BF, 0x6A3A, 0x6A9C, 0x6B12, 0x6B1E, 0x6ADD, 0x69E7, 0x6B0F, + 0x6B16, 0x6AEC, 0x6ADA, 0x6AF8, 0x6AB3, 0x6AE7, 0x6AA3, 0x6AD3, 0x6ADE, + 0x6BA4, 0x6B9E, 0x6BAE, 0x6BAB, 0x6BAF, 0x8ED4, 0x8EDB, 0x8EF2, 0x8EFB, + 0x8F64, 0x8EF9, 0x8EFC, 0x8EEB, 0x8EE4, 0x8F62, 0x8EFA, 0x8EFE, 0x8F0A, + 0x8F07, 0x8F05, 0x8F12, 0x8F26, 0x8F1E, 0x8F1F, 0x8F1C, 0x8F33, 0x8F46, + 0x8F54, 0x6214, 0x6227, 0x750C, 0x66C7, 0x66C4, 0x6689, 0x66D6, 0x8CC1, + 0x8CB0, 0x8CBA, 0x8CBD, 0x8D04, 0x8CB2, 0x8CC5, 0x8D10, 0x8CD1, 0x8CDA, + 0x8CD5, 0x8CEB, 0x8CE7, 0x8CFB, 0x8998, 0x89AC, 0x89A1, 0x89BF, 0x89A6, + 0x89AF, 0x89B2, 0x89B7, 0x6BFF, 0x6C0C, 0x6C2C, 0x7258, 0x6727, 0x8156, + 0x81DA, 0x811B, 0x81BE, 0x8161, 0x81CF, 0x6B5F, 0x98AE, 0x98AF, 0x98B6, + 0x98BC, 0x98C6, 0x98C8, 0x8F42, 0x9F4F, 0x6595, 0x716C, 0x7152, 0x7197, + 0x71C1, 0x71DC, 0x71FE, 0x79B0, 0x798E, 0x79AA, 0x61DF, 0x6164, 0x61E3, + 0x6207, 0x6FA9, 0x78EF, 0x78AD, 0x7868, 0x78B8, 0x792A, 0x7931, 0x7864, + 0x78FD, 0x78E7, 0x78E3, 0x9F95, 0x7798, 0x775E, 0x77BC, 0x7F86, 0x7F88, + 0x91D2, 0x91D3, 0x91D4, 0x91D9, 0x91D7, 0x91D5, 0x91F7, 0x91E7, 0x91E4, + 0x9346, 0x91F5, 0x91F9, 0x9208, 0x9226, 0x9245, 0x9211, 0x9210, 0x9201, + 0x9227, 0x9204, 0x9225, 0x9200, 0x923A, 0x9266, 0x9237, 0x9233, 0x9255, + 0x923D, 0x9238, 0x925E, 0x926C, 0x926D, 0x923F, 0x9460, 0x9230, 0x9249, + 0x9248, 0x924D, 0x922E, 0x9239, 0x9438, 0x92AC, 0x92A0, 0x927A, 0x92AA, + 0x92EE, 0x92CF, 0x9403, 0x92E3, 0x943A, 0x92B1, 0x92A6, 0x93A7, 0x9296, + 0x92CC, 0x92A9, 0x93F5, 0x9293, 0x927F, 0x93A9, 0x929A, 0x931A, 0x92AB, + 0x9283, 0x940B, 0x92A8, 0x92A3, 0x9412, 0x9338, 0x92F1, 0x93D7, 0x92E5, + 0x92F0, 0x92EF, 0x92E8, 0x92BC, 0x92DD, 0x92F6, 0x9426, 0x9427, 0x92C3, + 0x92DF, 0x92E6, 0x9312, 0x9306, 0x9369, 0x931B, 0x9340, 0x9301, 0x9315, + 0x932E, 0x9343, 0x9307, 0x9308, 0x931F, 0x9319, 0x9365, 0x9347, 0x9376, + 0x9354, 0x9364, 0x93AA, 0x9370, 0x9384, 0x93E4, 0x93D8, 0x9428, 0x9387, + 0x93CC, 0x9398, 0x93B8, 0x93BF, 0x93A6, 0x93B0, 0x93B5, 0x944C, 0x93E2, + 0x93DC, 0x93DD, 0x93CD, 0x93DE, 0x93C3, 0x93C7, 0x93D1, 0x9414, 0x941D, + 0x93F7, 0x9465, 0x9413, 0x946D, 0x9420, 0x9479, 0x93F9, 0x9419, 0x944A, + 0x9432, 0x943F, 0x9454, 0x9463, 0x937E, 0x7A61, 0x9CE9, 0x9CF6, 0x9D07, + 0x9D06, 0x9D23, 0x9D87, 0x9E15, 0x9D1D, 0x9D1F, 0x9DE5, 0x9D2F, 0x9DD9, + 0x9D30, 0x9D42, 0x9E1E, 0x9D53, 0x9E1D, 0x9D60, 0x9D52, 0x9DF3, 0x9D5C, + 0x9D61, 0x9D93, 0x9D6A, 0x9D6F, 0x9D89, 0x9D98, 0x9D9A, 0x9DC0, 0x9DA5, + 0x9DA9, 0x9DC2, 0x9DBC, 0x9E1A, 0x9DD3, 0x9DDA, 0x9DEF, 0x9DE6, 0x9DF2, + 0x9DF8, 0x9E0C, 0x9DFA, 0x9E1B, 0x7664, 0x7658, 0x7667, 0x7602, 0x7646, + 0x7647, 0x7649, 0x761E, 0x763B, 0x766D, 0x766E, 0x7669, 0x7672, 0x7AC7, + 0x7AB6, 0x8960, 0x8933, 0x895D, 0x8947, 0x8938, 0x8964, 0x76B8, 0x802E, + 0x802C, 0x8079, 0x8075, 0x9807, 0x980E, 0x980F, 0x9821, 0x981C, 0x6F41, + 0x9826, 0x9837, 0x984E, 0x9853, 0x9873, 0x9862, 0x9859, 0x9865, 0x986C, + 0x9870, 0x87E3, 0x8806, 0x8706, 0x8823, 0x87F6, 0x86FA, 0x87EF, 0x8784, + 0x8810, 0x87C8, 0x8811, 0x87BB, 0x87CE, 0x7F4C, 0x7BE4, 0x7B67, 0x7C69, + 0x7BF3, 0x7C00, 0x7BCB, 0x7C5C, 0x7C1E, 0x7C2B, 0x7C23, 0x7C6A, 0x7C5F, + 0x8264, 0x826B, 0x88CA, 0x7FA5, 0x7CF2, 0x7CF6, 0x7CDD, 0x7E36, 0x9EA9, + 0x8DB2, 0x91C5, 0x91C3, 0x9E7A, 0x8E89, 0x8E4C, 0x8E92, 0x8E7A, 0x8E55, + 0x8E9A, 0x8E8B, 0x8E93, 0x8E91, 0x8EA1, 0x8E63, 0x8EAA, 0x8EA6, 0x89F4, + 0x89F6, 0x975A, 0x9742, 0x973D, 0x9744, 0x9F54, 0x9F5F, 0x9F59, 0x9F60, + 0x9F5C, 0x9F66, 0x9F6C, 0x9F6A, 0x9F77, 0x9EFD, 0x9EFF, 0x9F09, 0x8B8E, + 0x947E, 0x93E8, 0x9B77, 0x9B74, 0x9B81, 0x9B83, 0x9B8E, 0x9C78, 0x7A4C, + 0x9B92, 0x9C5F, 0x9B90, 0x9BAD, 0x9B9A, 0x9BAA, 0x9B9E, 0x9C6D, 0x9BAB, + 0x9B9D, 0x9C58, 0x9BC1, 0x9C7A, 0x9C31, 0x9C39, 0x9C23, 0x9C37, 0x9BC0, + 0x9BCA, 0x9BC7, 0x9BFD, 0x9BD6, 0x9BEA, 0x9BEB, 0x9BE1, 0x9BE4, 0x9BE7, + 0x9BDD, 0x9BE2, 0x9BF0, 0x9BDB, 0x9BF4, 0x9BD4, 0x9C5D, 0x9C08, 0x9C10, + 0x9C0D, 0x9C12, 0x9C09, 0x9BFF, 0x9C20, 0x9C32, 0x9C2D, 0x9C28, 0x9C25, + 0x9C29, 0x9C33, 0x9C3E, 0x9C48, 0x9C3B, 0x9C35, 0x9C45, 0x9C56, 0x9C54, + 0x9C52, 0x9C67, 0x97C3, 0x97BD, 0x97C9, 0x9DBB, 0x9ACF, 0x9AD6, 0x9AD5, + 0x9B58, 0x9B4E, 0x9957, 0x995C, 0x9B22, 0x9EF7, 0x9EF2, 0x896C, 0x95C6, + 0x9336, 0x5F46, 0x8514, 0x7E94, 0x9F63, 0x5679, 0x9F15, 0x5641, 0x9AEE, + 0x8907, 0x7A40, 0x98B3, 0x95A4, 0x9B0D, 0x8FF4, 0x5F59, 0x7A6B, 0x98E2, + 0x50A2, 0x8591, 0x5118, 0x6372, 0x524B, 0x774F, 0x7E8D, 0x66C6, 0x77AD, + 0x9E75, 0x56C9, 0x9EF4, 0x6FDB, 0x61DE, 0x77C7, 0x7030, 0x9EB5, 0x884A, + 0x95E2, 0x97C6, 0x7C64, 0x7E34, 0x97A6, 0x9EAF, 0x56CC, 0x98B1, 0x6AAF, + 0x7F4E, 0x7CF0, 0x4FC2, 0x7E6B, 0x9E79, 0x56AE, 0x9B1A, 0x846F, 0x79A6, + 0x7C72, 0x9AD2, 0x96BB, 0x7DFB, 0x88FD, 0x7843, 0x2170, 0x2171, 0x2172, + 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x02CA, 0x02CB, + 0x02D9, 0x2013, 0x2015, 0x2025, 0x2035, 0x2105, 0x2109, 0x2196, 0x2197, + 0x2198, 0x2199, 0x2215, 0x221F, 0x2223, 0x2252, 0x2266, 0x2267, 0x22BF, + 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, + 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E, 0x255F, 0x2560, 0x2561, + 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, + 0x256B, 0x256C, 0x256D, 0x256E, 0x256F, 0x2570, 0x2571, 0x2572, 0x2573, + 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x2589, + 0x258A, 0x258B, 0x258C, 0x258D, 0x258E, 0x258F, 0x2593, 0x2594, 0x2595, + 0x25BC, 0x25BD, 0x25E2, 0x25E3, 0x25E4, 0x25E5, 0x2609, 0x2295, 0x3012, + 0x301D, 0x301E, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, + 0x3028, 0x3029, 0x32A3, 0x338E, 0x338F, 0x339C, 0x339D, 0x339E, 0x33A1, + 0x33C4, 0x33CE, 0x33D1, 0x33D2, 0x33D5, 0xFE30, 0xFFE2, 0xFFE4, 0x2121, + 0x3231, 0x2010, 0x30FC, 0x309B, 0x309C, 0x30FD, 0x30FE, 0x3006, 0x309D, + 0x309E, 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, 0xFE50, + 0xFE51, 0xFE52, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFE59, 0xFE5A, 0xFE5B, + 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, 0xFE60, 0xFE61, 0xFE62, 0xFE63, 0xFE64, + 0xFE65, 0xFE66, 0xFE68, 0xFE69, 0xFE6A, 0xFE6B, 0x303E, 0x2FF0, 0x2FF1, + 0x2FF2, 0x2FF3, 0x2FF4, 0x2FF5, 0x2FF6, 0x2FF7, 0x2FF8, 0x2FF9, 0x2FFA, + 0x2FFB, 0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F, + 0x4E20, 0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31, 0x4E33, + 0x4E35, 0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44, 0x4E46, 0x4E4A, + 0x4E51, 0x4E55, 0x4E57, 0x4E5A, 0x4E5B, 0x4E62, 0x4E63, 0x4E64, 0x4E65, + 0x4E67, 0x4E68, 0x4E6A, 0x4E6B, 0x4E6C, 0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, + 0x4E74, 0x4E75, 0x4E76, 0x4E77, 0x4E78, 0x4E79, 0x4E7A, 0x4E7B, 0x4E7C, + 0x4E7D, 0x4E7F, 0x4E80, 0x4E81, 0x4E83, 0x4E84, 0x4E85, 0x4E87, 0x4E8A, + 0x4E90, 0x4E96, 0x4E97, 0x4E99, 0x4E9C, 0x4E9D, 0x4EA3, 0x4EAA, 0x4EAF, + 0x4EB0, 0x4EB1, 0x4EB4, 0x4EB6, 0x4EB7, 0x4EB8, 0x4EB9, 0x4EBC, 0x4EBD, + 0x4EBE, 0x4EC8, 0x4ECC, 0x4ECF, 0x4ED0, 0x4ED2, 0x4EDA, 0x4EDB, 0x4EDC, + 0x4EE0, 0x4EE2, 0x4EE6, 0x4EE7, 0x4EE9, 0x4EED, 0x4EEE, 0x4EEF, 0x4EF1, + 0x4EF4, 0x4EF8, 0x4EF9, 0x4EFA, 0x4EFC, 0x4EFE, 0x4F00, 0x4F02, 0x4F03, + 0x4F04, 0x4F05, 0x4F06, 0x4F07, 0x4F08, 0x4F0B, 0x4F0C, 0x4F12, 0x4F13, + 0x4F14, 0x4F15, 0x4F16, 0x4F1C, 0x4F1D, 0x4F21, 0x4F23, 0x4F28, 0x4F29, + 0x4F2C, 0x4F2D, 0x4F2E, 0x4F31, 0x4F33, 0x4F35, 0x4F37, 0x4F39, 0x4F3B, + 0x4F3E, 0x4F3F, 0x4F40, 0x4F41, 0x4F42, 0x4F44, 0x4F45, 0x4F47, 0x4F48, + 0x4F49, 0x4F4A, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, 0x4F56, 0x4F61, 0x4F62, + 0x4F66, 0x4F68, 0x4F6A, 0x4F6B, 0x4F6D, 0x4F6E, 0x4F71, 0x4F72, 0x4F75, + 0x4F77, 0x4F78, 0x4F79, 0x4F7A, 0x4F7D, 0x4F80, 0x4F81, 0x4F82, 0x4F85, + 0x4F87, 0x4F8A, 0x4F8C, 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x4F95, 0x4F98, + 0x4F99, 0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F, 0x4FA1, 0x4FA2, 0x4FA4, 0x4FAB, + 0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2, 0x4FB3, 0x4FB4, 0x4FB6, 0x4FB7, 0x4FB8, + 0x4FB9, 0x4FBA, 0x4FBB, 0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, 0x4FC1, 0x4FC6, + 0x4FC7, 0x4FC8, 0x4FC9, 0x4FCB, 0x4FCC, 0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, + 0x4FD5, 0x4FD6, 0x4FD9, 0x4FDB, 0x4FE2, 0x4FE4, 0x4FE5, 0x4FE7, 0x4FEB, + 0x4FEC, 0x4FF0, 0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, 0x4FF7, 0x4FF9, 0x4FFB, + 0x4FFC, 0x4FFD, 0x4FFF, 0x5001, 0x5002, 0x5003, 0x5004, 0x5005, 0x5007, + 0x5008, 0x500A, 0x500E, 0x5010, 0x5013, 0x5015, 0x5016, 0x5017, 0x501B, + 0x501D, 0x501E, 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, 0x502F, 0x5030, + 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, 0x5036, 0x5037, 0x5038, 0x5039, + 0x503B, 0x503D, 0x503F, 0x5040, 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, + 0x504A, 0x504B, 0x504D, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, + 0x5057, 0x5058, 0x5059, 0x505B, 0x505D, 0x505E, 0x505F, 0x5060, 0x5061, + 0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506A, 0x506B, + 0x506D, 0x506E, 0x506F, 0x5070, 0x5071, 0x5072, 0x5073, 0x5078, 0x5079, + 0x507A, 0x507C, 0x507D, 0x5081, 0x5082, 0x5083, 0x5084, 0x5086, 0x5087, + 0x5089, 0x508A, 0x508B, 0x508C, 0x508E, 0x508F, 0x5090, 0x5091, 0x5092, + 0x5093, 0x5094, 0x5095, 0x5097, 0x509A, 0x509B, 0x509C, 0x509D, 0x509E, + 0x509F, 0x50A0, 0x50A1, 0x50A4, 0x50A6, 0x50AA, 0x50AB, 0x50AE, 0x50AF, + 0x50B0, 0x50B1, 0x50B6, 0x50B8, 0x50B9, 0x50BC, 0x50BD, 0x50BF, 0x50C0, + 0x50C1, 0x50C3, 0x50C4, 0x50C6, 0x50C7, 0x50C8, 0x50CA, 0x50CB, 0x50CC, + 0x50CD, 0x50CE, 0x50D0, 0x50D2, 0x50D3, 0x50D4, 0x50D7, 0x50D8, 0x50D9, + 0x50DB, 0x50DC, 0x50DD, 0x50DF, 0x50E0, 0x50E1, 0x50E2, 0x50E3, 0x50E4, + 0x50E9, 0x50EA, 0x50EB, 0x50EF, 0x50F0, 0x50F1, 0x50F2, 0x50F4, 0x50F6, + 0x50F7, 0x50F8, 0x50FA, 0x50FC, 0x50FD, 0x50FE, 0x50FF, 0x5101, 0x5103, + 0x5105, 0x510A, 0x510C, 0x510D, 0x510E, 0x510F, 0x5111, 0x5113, 0x5116, + 0x5117, 0x5119, 0x511A, 0x511B, 0x511C, 0x511D, 0x511E, 0x5120, 0x5122, + 0x5123, 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512B, 0x512C, + 0x512D, 0x512E, 0x512F, 0x5130, 0x5131, 0x5133, 0x5134, 0x5135, 0x5136, + 0x5138, 0x5139, 0x513D, 0x513E, 0x5142, 0x5147, 0x514A, 0x514C, 0x514E, + 0x514F, 0x5150, 0x5153, 0x5157, 0x5158, 0x5159, 0x515B, 0x515D, 0x515E, + 0x515F, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166, 0x5167, 0x516A, 0x516F, + 0x5172, 0x517A, 0x517E, 0x517F, 0x5183, 0x5184, 0x5186, 0x5187, 0x518A, + 0x518B, 0x518E, 0x518F, 0x5190, 0x5191, 0x5193, 0x5194, 0x5198, 0x519A, + 0x519D, 0x519E, 0x519F, 0x51A1, 0x51A3, 0x51A6, 0x51A7, 0x51A8, 0x51A9, + 0x51AA, 0x51AD, 0x51AE, 0x51B4, 0x51B8, 0x51B9, 0x51BA, 0x51BE, 0x51BF, + 0x51C1, 0x51C2, 0x51C3, 0x51C5, 0x51C8, 0x51CA, 0x51CE, 0x51D0, 0x51D2, + 0x51D3, 0x51D4, 0x51D5, 0x51D6, 0x51D7, 0x51D8, 0x51D9, 0x51DA, 0x51DC, + 0x51DE, 0x51DF, 0x51E2, 0x51E3, 0x51E5, 0x51E6, 0x51E7, 0x51E8, 0x51E9, + 0x51EA, 0x51EC, 0x51EE, 0x51F2, 0x51F4, 0x51F7, 0x51FE, 0x5204, 0x5205, + 0x5209, 0x520B, 0x520C, 0x520F, 0x5210, 0x5213, 0x5214, 0x5215, 0x521C, + 0x521E, 0x521F, 0x5221, 0x5222, 0x5223, 0x5225, 0x5226, 0x5227, 0x522A, + 0x522C, 0x522F, 0x5231, 0x5232, 0x5234, 0x5235, 0x523C, 0x523E, 0x5245, + 0x5246, 0x5248, 0x5249, 0x524E, 0x524F, 0x5252, 0x5253, 0x5255, 0x5257, + 0x5258, 0x5259, 0x525A, 0x525D, 0x525F, 0x5260, 0x5262, 0x5263, 0x5264, + 0x5266, 0x5268, 0x526B, 0x526C, 0x526D, 0x5270, 0x5271, 0x5273, 0x5276, + 0x5277, 0x5278, 0x5279, 0x527A, 0x527B, 0x527C, 0x527E, 0x5280, 0x5284, + 0x5285, 0x5286, 0x528B, 0x528E, 0x528F, 0x5292, 0x5294, 0x5295, 0x5296, + 0x5297, 0x5298, 0x5299, 0x529A, 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, + 0x52AE, 0x52AF, 0x52B0, 0x52B4, 0x52B5, 0x52B6, 0x52B7, 0x52B8, 0x52B9, + 0x52BA, 0x52BB, 0x52BC, 0x52BD, 0x52C0, 0x52C2, 0x52C4, 0x52C5, 0x52C6, + 0x52C8, 0x52CA, 0x52CC, 0x52CD, 0x52CE, 0x52CF, 0x52D1, 0x52D3, 0x52D4, + 0x52D7, 0x52DA, 0x52DC, 0x52E0, 0x52E1, 0x52E3, 0x52E5, 0x52E6, 0x52E7, + 0x52E8, 0x52E9, 0x52EA, 0x52EB, 0x52EC, 0x52ED, 0x52EE, 0x52EF, 0x52F2, + 0x52F3, 0x52F4, 0x52F6, 0x52F7, 0x52FB, 0x52FC, 0x52FD, 0x5301, 0x5302, + 0x5303, 0x5304, 0x5307, 0x5309, 0x530A, 0x530B, 0x530C, 0x530E, 0x5311, + 0x5312, 0x5313, 0x5314, 0x5318, 0x531B, 0x531C, 0x531E, 0x531F, 0x5322, + 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B, 0x532C, 0x5330, 0x5332, + 0x5333, 0x5334, 0x5335, 0x5336, 0x5337, 0x5338, 0x533C, 0x533D, 0x5342, + 0x5344, 0x5346, 0x534B, 0x534C, 0x534D, 0x5350, 0x5358, 0x5359, 0x535B, + 0x535D, 0x5365, 0x5368, 0x536A, 0x536C, 0x536D, 0x5372, 0x5376, 0x5379, + 0x537B, 0x537C, 0x537D, 0x537E, 0x5380, 0x5381, 0x5383, 0x5387, 0x5388, + 0x538A, 0x538E, 0x538F, 0x5390, 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, + 0x5397, 0x539B, 0x539C, 0x539E, 0x53A1, 0x53A4, 0x53A7, 0x53AA, 0x53AB, + 0x53AC, 0x53AF, 0x53B0, 0x53B1, 0x53B3, 0x53B5, 0x53B7, 0x53B8, 0x53B9, + 0x53BA, 0x53BC, 0x53BD, 0x53BE, 0x53C0, 0x53C4, 0x53C5, 0x53C6, 0x53C7, + 0x53CE, 0x53CF, 0x53D0, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DC, 0x53DD, + 0x53DE, 0x53E1, 0x53E7, 0x53F4, 0x53FA, 0x53FE, 0x53FF, 0x5400, 0x5402, + 0x5405, 0x5407, 0x540B, 0x5414, 0x5418, 0x5419, 0x541A, 0x541C, 0x5422, + 0x5424, 0x5425, 0x542A, 0x5430, 0x5433, 0x5436, 0x5437, 0x543A, 0x543D, + 0x543F, 0x5441, 0x5442, 0x5444, 0x5445, 0x5447, 0x5449, 0x544C, 0x544D, + 0x544E, 0x544F, 0x5451, 0x545A, 0x545D, 0x545E, 0x545F, 0x5460, 0x5461, + 0x5463, 0x5465, 0x5467, 0x5469, 0x546A, 0x546B, 0x546C, 0x546D, 0x546E, + 0x546F, 0x5470, 0x5474, 0x5479, 0x547A, 0x547E, 0x547F, 0x5481, 0x5483, + 0x5485, 0x5487, 0x5488, 0x5489, 0x548A, 0x548D, 0x5491, 0x5493, 0x5497, + 0x5498, 0x549C, 0x549E, 0x549F, 0x54A0, 0x54A1, 0x54A2, 0x54A5, 0x54AE, + 0x54B0, 0x54B2, 0x54B5, 0x54B6, 0x54B7, 0x54B9, 0x54BA, 0x54BE, 0x54C3, + 0x54C5, 0x54CA, 0x54CB, 0x54D6, 0x54D8, 0x54DB, 0x54E0, 0x54E2, 0x54E3, + 0x54E4, 0x54EB, 0x54EC, 0x54EF, 0x54F0, 0x54F1, 0x54F4, 0x54F5, 0x54F6, + 0x54F7, 0x54F8, 0x54F9, 0x54FB, 0x54FE, 0x5500, 0x5502, 0x5503, 0x5505, + 0x5508, 0x550A, 0x550B, 0x550C, 0x550D, 0x550E, 0x5512, 0x5513, 0x5515, + 0x5516, 0x5517, 0x5518, 0x5519, 0x551A, 0x551C, 0x551D, 0x551E, 0x551F, + 0x5521, 0x5525, 0x5526, 0x5528, 0x5529, 0x552B, 0x552D, 0x5532, 0x5534, + 0x5535, 0x5536, 0x5538, 0x5539, 0x553A, 0x553B, 0x553D, 0x5540, 0x5542, + 0x5545, 0x5547, 0x5548, 0x554B, 0x554C, 0x554D, 0x554E, 0x5551, 0x5552, + 0x5554, 0x5557, 0x5558, 0x5559, 0x555A, 0x555B, 0x555D, 0x555F, 0x5560, + 0x5562, 0x5563, 0x5568, 0x5569, 0x556B, 0x556F, 0x5570, 0x5571, 0x5572, + 0x5573, 0x5574, 0x5579, 0x557A, 0x557D, 0x557F, 0x5585, 0x5586, 0x558C, + 0x558D, 0x558E, 0x5590, 0x5592, 0x5593, 0x5595, 0x5596, 0x5597, 0x559A, + 0x559B, 0x559E, 0x55A0, 0x55A1, 0x55A2, 0x55A3, 0x55A4, 0x55A5, 0x55A6, + 0x55A8, 0x55A9, 0x55AB, 0x55AD, 0x55AF, 0x55B0, 0x55B4, 0x55B6, 0x55B8, + 0x55BA, 0x55BC, 0x55BF, 0x55C0, 0x55C1, 0x55C2, 0x55C3, 0x55C8, 0x55CA, + 0x55CB, 0x55CF, 0x55D0, 0x55D5, 0x55D7, 0x55D8, 0x55D9, 0x55DB, 0x55DE, + 0x55E0, 0x55E2, 0x55E7, 0x55ED, 0x55EE, 0x55F0, 0x55F1, 0x55F4, 0x55F8, + 0x55F9, 0x55FA, 0x55FB, 0x55FC, 0x55FF, 0x5602, 0x5603, 0x5604, 0x5605, + 0x5607, 0x560A, 0x560B, 0x5610, 0x5611, 0x5612, 0x5613, 0x5615, 0x5619, + 0x561A, 0x561D, 0x5620, 0x5621, 0x5622, 0x5625, 0x5626, 0x5628, 0x562A, + 0x562B, 0x5633, 0x5637, 0x563A, 0x563C, 0x563D, 0x563E, 0x5640, 0x5642, + 0x5643, 0x5644, 0x5645, 0x5646, 0x5647, 0x5648, 0x5649, 0x564A, 0x564B, + 0x564F, 0x5650, 0x5651, 0x5652, 0x5653, 0x5655, 0x5656, 0x565A, 0x565B, + 0x565E, 0x565F, 0x5661, 0x5663, 0x5667, 0x566D, 0x566E, 0x5670, 0x5673, + 0x5675, 0x5677, 0x567A, 0x567D, 0x567E, 0x567F, 0x5681, 0x5682, 0x5683, + 0x5684, 0x5688, 0x5689, 0x568A, 0x568B, 0x568D, 0x5690, 0x5691, 0x5692, + 0x5694, 0x5696, 0x5697, 0x5698, 0x569A, 0x569B, 0x569C, 0x569D, 0x569E, + 0x569F, 0x56A0, 0x56A1, 0x56A2, 0x56A4, 0x56A5, 0x56A7, 0x56A9, 0x56AA, + 0x56AB, 0x56AC, 0x56AD, 0x56B0, 0x56B1, 0x56B2, 0x56B5, 0x56B8, 0x56B9, + 0x56BA, 0x56BB, 0x56BD, 0x56BE, 0x56BF, 0x56C3, 0x56C4, 0x56C6, 0x56C7, + 0x56CB, 0x56CD, 0x56CE, 0x56CF, 0x56D0, 0x56D2, 0x56D3, 0x56D5, 0x56D6, + 0x56D8, 0x56D9, 0x56DC, 0x56E3, 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56E9, + 0x56EA, 0x56EC, 0x56EE, 0x56EF, 0x56F2, 0x56F3, 0x56F6, 0x56F7, 0x56F8, + 0x56FB, 0x56FC, 0x5700, 0x5701, 0x5702, 0x5705, 0x570C, 0x570E, 0x570F, + 0x5710, 0x5711, 0x5714, 0x5715, 0x5717, 0x5719, 0x571A, 0x571B, 0x571D, + 0x571E, 0x5720, 0x5721, 0x5722, 0x5724, 0x5725, 0x5726, 0x5727, 0x572B, + 0x5731, 0x5732, 0x5734, 0x5735, 0x5736, 0x5737, 0x5738, 0x573C, 0x573D, + 0x573F, 0x5741, 0x5743, 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574B, + 0x5752, 0x5753, 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, + 0x5765, 0x5767, 0x576C, 0x576E, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775, + 0x5778, 0x5779, 0x577A, 0x577D, 0x577E, 0x577F, 0x5780, 0x5781, 0x5787, + 0x5788, 0x5789, 0x578A, 0x578D, 0x578E, 0x578F, 0x5790, 0x5791, 0x5794, + 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, 0x579A, 0x579C, 0x579D, 0x579E, + 0x579F, 0x57A5, 0x57A8, 0x57AA, 0x57AC, 0x57AF, 0x57B0, 0x57B1, 0x57B3, + 0x57B5, 0x57B6, 0x57B7, 0x57B9, 0x57BA, 0x57BB, 0x57BC, 0x57BD, 0x57BE, + 0x57BF, 0x57C0, 0x57C1, 0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, + 0x57CA, 0x57CC, 0x57CD, 0x57D0, 0x57D1, 0x57D3, 0x57D6, 0x57D7, 0x57DB, + 0x57DC, 0x57DE, 0x57E2, 0x57E3, 0x57E5, 0x57E6, 0x57E7, 0x57E8, 0x57E9, + 0x57EA, 0x57EB, 0x57EC, 0x57EE, 0x57F0, 0x57F1, 0x57F2, 0x57F3, 0x57F5, + 0x57F6, 0x57FB, 0x57FC, 0x57FE, 0x57FF, 0x5801, 0x5803, 0x5804, 0x5808, + 0x5809, 0x580C, 0x580E, 0x580F, 0x5810, 0x5812, 0x5813, 0x5814, 0x5817, + 0x5818, 0x581A, 0x581B, 0x581C, 0x581F, 0x5822, 0x5823, 0x5825, 0x5826, + 0x5827, 0x5828, 0x5829, 0x582B, 0x582C, 0x582D, 0x582E, 0x5832, 0x5833, + 0x5836, 0x5837, 0x5838, 0x5839, 0x583A, 0x583B, 0x583C, 0x583D, 0x583E, + 0x583F, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846, 0x5847, 0x5848, + 0x5849, 0x584E, 0x5850, 0x5853, 0x5855, 0x5856, 0x5859, 0x585A, 0x585B, + 0x585C, 0x585D, 0x585F, 0x5860, 0x5861, 0x5863, 0x5866, 0x5867, 0x5868, + 0x5869, 0x586A, 0x586D, 0x586E, 0x586F, 0x5870, 0x5871, 0x5872, 0x5873, + 0x5874, 0x5876, 0x5877, 0x5878, 0x587A, 0x587B, 0x587C, 0x587D, 0x587F, + 0x5882, 0x5884, 0x5886, 0x5887, 0x5888, 0x588B, 0x588C, 0x588D, 0x588E, + 0x588F, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, 0x5897, 0x5898, 0x589B, + 0x589D, 0x58A0, 0x58A1, 0x58A2, 0x58A3, 0x58A4, 0x58A5, 0x58A6, 0x58A7, + 0x58AA, 0x58AB, 0x58AC, 0x58AD, 0x58AF, 0x58B0, 0x58B1, 0x58B2, 0x58B4, + 0x58B5, 0x58B6, 0x58B7, 0x58B8, 0x58B9, 0x58BA, 0x58BD, 0x58BF, 0x58C0, + 0x58C2, 0x58C3, 0x58C4, 0x58C6, 0x58C8, 0x58C9, 0x58CA, 0x58CB, 0x58CC, + 0x58CD, 0x58CE, 0x58CF, 0x58D0, 0x58D2, 0x58D4, 0x58D6, 0x58D7, 0x58DB, + 0x58DC, 0x58DD, 0x58E1, 0x58E3, 0x58E5, 0x58E6, 0x58E7, 0x58E8, 0x58EA, + 0x58ED, 0x58F1, 0x58F2, 0x58F4, 0x58F5, 0x58F7, 0x58F8, 0x58FB, 0x58FC, + 0x58FE, 0x58FF, 0x5900, 0x5901, 0x5903, 0x5905, 0x5906, 0x5908, 0x5909, + 0x590A, 0x590B, 0x590C, 0x590E, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, + 0x5918, 0x591B, 0x591D, 0x591E, 0x5920, 0x5921, 0x5923, 0x5926, 0x5928, + 0x592C, 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593B, 0x593D, 0x593F, + 0x5940, 0x5943, 0x5945, 0x5946, 0x594A, 0x594C, 0x594D, 0x5950, 0x5952, + 0x5953, 0x5959, 0x595B, 0x595C, 0x595D, 0x595E, 0x595F, 0x5961, 0x5963, + 0x5964, 0x5966, 0x5967, 0x5968, 0x596B, 0x596D, 0x596F, 0x5970, 0x5971, + 0x5972, 0x5975, 0x5977, 0x597A, 0x597B, 0x597C, 0x597E, 0x597F, 0x5980, + 0x5985, 0x5989, 0x598B, 0x598C, 0x598E, 0x598F, 0x5990, 0x5991, 0x5994, + 0x5995, 0x5998, 0x599A, 0x599B, 0x599C, 0x599F, 0x59A0, 0x59A1, 0x59A2, + 0x59A6, 0x59A7, 0x59AC, 0x59AD, 0x59B0, 0x59B1, 0x59B3, 0x59B4, 0x59B5, + 0x59B6, 0x59B7, 0x59B8, 0x59BA, 0x59BC, 0x59BD, 0x59BF, 0x59C0, 0x59C1, + 0x59C2, 0x59C3, 0x59C4, 0x59C5, 0x59C7, 0x59C8, 0x59C9, 0x59CC, 0x59CD, + 0x59CE, 0x59CF, 0x59D5, 0x59D6, 0x59D9, 0x59DB, 0x59DE, 0x59DF, 0x59E0, + 0x59E1, 0x59E2, 0x59E4, 0x59E6, 0x59E7, 0x59E9, 0x59EA, 0x59EB, 0x59ED, + 0x59EE, 0x59EF, 0x59F0, 0x59F1, 0x59F2, 0x59F3, 0x59F4, 0x59F5, 0x59F6, + 0x59F7, 0x59F8, 0x59FA, 0x59FC, 0x59FD, 0x59FE, 0x5A00, 0x5A02, 0x5A0A, + 0x5A0B, 0x5A0D, 0x5A0E, 0x5A0F, 0x5A10, 0x5A12, 0x5A14, 0x5A15, 0x5A16, + 0x5A17, 0x5A19, 0x5A1A, 0x5A1B, 0x5A1D, 0x5A1E, 0x5A21, 0x5A22, 0x5A24, + 0x5A26, 0x5A27, 0x5A28, 0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, 0x5A2E, 0x5A2F, + 0x5A30, 0x5A33, 0x5A35, 0x5A37, 0x5A38, 0x5A39, 0x5A3A, 0x5A3B, 0x5A3D, + 0x5A3E, 0x5A3F, 0x5A42, 0x5A43, 0x5A44, 0x5A45, 0x5A47, 0x5A48, 0x5A4B, + 0x5A4C, 0x5A4D, 0x5A4E, 0x5A4F, 0x5A50, 0x5A51, 0x5A52, 0x5A53, 0x5A54, + 0x5A56, 0x5A57, 0x5A58, 0x5A59, 0x5A5B, 0x5A5C, 0x5A5D, 0x5A5E, 0x5A5F, + 0x5A60, 0x5A61, 0x5A63, 0x5A64, 0x5A65, 0x5A68, 0x5A69, 0x5A6B, 0x5A6C, + 0x5A6E, 0x5A6F, 0x5A70, 0x5A71, 0x5A72, 0x5A73, 0x5A78, 0x5A79, 0x5A7B, + 0x5A7C, 0x5A7D, 0x5A7E, 0x5A80, 0x5A81, 0x5A82, 0x5A83, 0x5A84, 0x5A85, + 0x5A86, 0x5A87, 0x5A88, 0x5A89, 0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, 0x5A8E, + 0x5A8F, 0x5A90, 0x5A91, 0x5A93, 0x5A94, 0x5A95, 0x5A96, 0x5A97, 0x5A98, + 0x5A99, 0x5A9C, 0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA1, 0x5AA2, 0x5AA3, + 0x5AA4, 0x5AA5, 0x5AA6, 0x5AA8, 0x5AA9, 0x5AAB, 0x5AAC, 0x5AAD, 0x5AAE, + 0x5AAF, 0x5AB0, 0x5AB1, 0x5AB4, 0x5AB6, 0x5AB7, 0x5AB9, 0x5ABA, 0x5ABB, + 0x5ABC, 0x5ABF, 0x5AC0, 0x5AC3, 0x5AC4, 0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, + 0x5ACA, 0x5ACB, 0x5ACD, 0x5ACE, 0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, 0x5AD5, + 0x5AD9, 0x5ADA, 0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, 0x5AE2, 0x5AE4, 0x5AE5, + 0x5AE7, 0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, 0x5AEE, 0x5AEF, 0x5AF0, 0x5AF2, + 0x5AF3, 0x5AF4, 0x5AF6, 0x5AF7, 0x5AF8, 0x5AF9, 0x5AFA, 0x5AFC, 0x5AFD, + 0x5AFE, 0x5AFF, 0x5B01, 0x5B02, 0x5B03, 0x5B04, 0x5B05, 0x5B06, 0x5B07, + 0x5B0A, 0x5B0D, 0x5B0E, 0x5B0F, 0x5B10, 0x5B11, 0x5B12, 0x5B13, 0x5B14, + 0x5B15, 0x5B18, 0x5B1A, 0x5B1B, 0x5B1C, 0x5B1D, 0x5B1E, 0x5B1F, 0x5B20, + 0x5B22, 0x5B23, 0x5B24, 0x5B25, 0x5B26, 0x5B27, 0x5B28, 0x5B29, 0x5B2B, + 0x5B2C, 0x5B2D, 0x5B2E, 0x5B2F, 0x5B31, 0x5B33, 0x5B35, 0x5B36, 0x5B39, + 0x5B3A, 0x5B3B, 0x5B3C, 0x5B3D, 0x5B3E, 0x5B3F, 0x5B41, 0x5B42, 0x5B43, + 0x5B44, 0x5B45, 0x5B46, 0x5B47, 0x5B48, 0x5B49, 0x5B4A, 0x5B4B, 0x5B4D, + 0x5B4E, 0x5B4F, 0x5B52, 0x5B56, 0x5B5E, 0x5B60, 0x5B61, 0x5B67, 0x5B68, + 0x5B6D, 0x5B6E, 0x5B6F, 0x5B72, 0x5B74, 0x5B76, 0x5B77, 0x5B79, 0x5B7B, + 0x5B7C, 0x5B7E, 0x5B82, 0x5B86, 0x5B8A, 0x5B8D, 0x5B8E, 0x5B90, 0x5B91, + 0x5B92, 0x5B94, 0x5B96, 0x5B9F, 0x5BA7, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, + 0x5BAE, 0x5BAF, 0x5BB1, 0x5BB2, 0x5BB7, 0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, + 0x5BC1, 0x5BC3, 0x5BC8, 0x5BC9, 0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, 0x5BCF, + 0x5BD1, 0x5BD4, 0x5BD5, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA, 0x5BDB, + 0x5BDC, 0x5BE0, 0x5BE3, 0x5BEA, 0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, 0x5BF3, + 0x5BF4, 0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, 0x5C02, 0x5C03, 0x5C05, 0x5C0C, + 0x5C10, 0x5C12, 0x5C13, 0x5C17, 0x5C19, 0x5C1B, 0x5C1E, 0x5C1F, 0x5C20, + 0x5C21, 0x5C23, 0x5C26, 0x5C28, 0x5C29, 0x5C2A, 0x5C2B, 0x5C2D, 0x5C2E, + 0x5C2F, 0x5C30, 0x5C32, 0x5C33, 0x5C35, 0x5C36, 0x5C43, 0x5C44, 0x5C46, + 0x5C47, 0x5C4C, 0x5C4D, 0x5C52, 0x5C53, 0x5C54, 0x5C56, 0x5C57, 0x5C58, + 0x5C5A, 0x5C5B, 0x5C5C, 0x5C5D, 0x5C5F, 0x5C67, 0x5C69, 0x5C6A, 0x5C6B, + 0x5C6D, 0x5C70, 0x5C72, 0x5C73, 0x5C74, 0x5C75, 0x5C76, 0x5C77, 0x5C78, + 0x5C7B, 0x5C7C, 0x5C7D, 0x5C7E, 0x5C80, 0x5C83, 0x5C84, 0x5C85, 0x5C86, + 0x5C87, 0x5C89, 0x5C8A, 0x5C8B, 0x5C8E, 0x5C8F, 0x5C92, 0x5C93, 0x5C95, + 0x5C9D, 0x5C9E, 0x5C9F, 0x5CA0, 0x5CA4, 0x5CA5, 0x5CA6, 0x5CA7, 0x5CA8, + 0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, 0x5CB2, 0x5CB4, 0x5CB6, 0x5CB9, 0x5CBA, + 0x5CBB, 0x5CBC, 0x5CBE, 0x5CC0, 0x5CC2, 0x5CC3, 0x5CC5, 0x5CC6, 0x5CC7, + 0x5CC8, 0x5CC9, 0x5CCA, 0x5CCC, 0x5CCD, 0x5CCE, 0x5CCF, 0x5CD0, 0x5CD1, + 0x5CD3, 0x5CD4, 0x5CD5, 0x5CD6, 0x5CD7, 0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, + 0x5CDD, 0x5CDE, 0x5CDF, 0x5CE0, 0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, 0x5CEB, + 0x5CEC, 0x5CEE, 0x5CEF, 0x5CF1, 0x5CF2, 0x5CF3, 0x5CF5, 0x5CF7, 0x5CF8, + 0x5CF9, 0x5CFA, 0x5CFC, 0x5CFE, 0x5CFF, 0x5D00, 0x5D01, 0x5D04, 0x5D05, + 0x5D08, 0x5D09, 0x5D0A, 0x5D0B, 0x5D0C, 0x5D0F, 0x5D10, 0x5D11, 0x5D12, + 0x5D13, 0x5D15, 0x5D18, 0x5D19, 0x5D1A, 0x5D1C, 0x5D1D, 0x5D1F, 0x5D20, + 0x5D21, 0x5D22, 0x5D23, 0x5D25, 0x5D28, 0x5D2A, 0x5D2B, 0x5D2F, 0x5D30, + 0x5D31, 0x5D32, 0x5D33, 0x5D35, 0x5D36, 0x5D37, 0x5D38, 0x5D39, 0x5D3A, + 0x5D3B, 0x5D3C, 0x5D3F, 0x5D40, 0x5D41, 0x5D42, 0x5D43, 0x5D44, 0x5D45, + 0x5D46, 0x5D48, 0x5D49, 0x5D4D, 0x5D4E, 0x5D4F, 0x5D51, 0x5D52, 0x5D53, + 0x5D54, 0x5D55, 0x5D56, 0x5D57, 0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, 0x5D5F, + 0x5D60, 0x5D61, 0x5D62, 0x5D63, 0x5D64, 0x5D65, 0x5D66, 0x5D67, 0x5D68, + 0x5D6A, 0x5D6D, 0x5D6E, 0x5D70, 0x5D71, 0x5D72, 0x5D73, 0x5D75, 0x5D76, + 0x5D77, 0x5D78, 0x5D79, 0x5D7A, 0x5D7B, 0x5D7C, 0x5D7D, 0x5D7E, 0x5D7F, + 0x5D80, 0x5D83, 0x5D85, 0x5D86, 0x5D88, 0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, + 0x5D8D, 0x5D8E, 0x5D8F, 0x5D90, 0x5D91, 0x5D92, 0x5D93, 0x5D94, 0x5D95, + 0x5D96, 0x5D98, 0x5D9A, 0x5D9B, 0x5D9C, 0x5D9E, 0x5D9F, 0x5DA1, 0x5DA2, + 0x5DA3, 0x5DA4, 0x5DA5, 0x5DA6, 0x5DA8, 0x5DA9, 0x5DAA, 0x5DAB, 0x5DAC, + 0x5DAD, 0x5DAE, 0x5DAF, 0x5DB0, 0x5DB1, 0x5DB2, 0x5DB3, 0x5DB4, 0x5DB5, + 0x5DB6, 0x5DB9, 0x5DBB, 0x5DBD, 0x5DBE, 0x5DBF, 0x5DC0, 0x5DC1, 0x5DC2, + 0x5DC3, 0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, 0x5DC9, 0x5DCA, 0x5DCC, 0x5DCE, + 0x5DCF, 0x5DD0, 0x5DD1, 0x5DD3, 0x5DD5, 0x5DD6, 0x5DD7, 0x5DD8, 0x5DD9, + 0x5DDA, 0x5DDC, 0x5DDF, 0x5DE0, 0x5DE3, 0x5DE4, 0x5DEA, 0x5DEC, 0x5DED, + 0x5DF5, 0x5DF6, 0x5DF8, 0x5DF9, 0x5DFA, 0x5DFB, 0x5DFC, 0x5DFF, 0x5E00, + 0x5E04, 0x5E07, 0x5E09, 0x5E0A, 0x5E0B, 0x5E0D, 0x5E0E, 0x5E12, 0x5E13, + 0x5E17, 0x5E1E, 0x5E1F, 0x5E20, 0x5E21, 0x5E22, 0x5E23, 0x5E24, 0x5E28, + 0x5E29, 0x5E2A, 0x5E2C, 0x5E2F, 0x5E30, 0x5E32, 0x5E34, 0x5E35, 0x5E39, + 0x5E3A, 0x5E3E, 0x5E3F, 0x5E41, 0x5E46, 0x5E47, 0x5E48, 0x5E49, 0x5E4A, + 0x5E4B, 0x5E4D, 0x5E4E, 0x5E4F, 0x5E50, 0x5E51, 0x5E52, 0x5E53, 0x5E56, + 0x5E59, 0x5E5A, 0x5E5C, 0x5E5D, 0x5E60, 0x5E64, 0x5E65, 0x5E66, 0x5E67, + 0x5E68, 0x5E69, 0x5E6A, 0x5E6D, 0x5E6E, 0x5E6F, 0x5E70, 0x5E71, 0x5E75, + 0x5E77, 0x5E81, 0x5E82, 0x5E83, 0x5E85, 0x5E88, 0x5E89, 0x5E8C, 0x5E8D, + 0x5E8E, 0x5E92, 0x5E98, 0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, 0x5EA3, 0x5EA4, + 0x5EA8, 0x5EA9, 0x5EAA, 0x5EAC, 0x5EAE, 0x5EAF, 0x5EB0, 0x5EB1, 0x5EB2, + 0x5EB4, 0x5EBA, 0x5EBB, 0x5EBC, 0x5EBD, 0x5EBF, 0x5EC0, 0x5EC1, 0x5EC2, + 0x5EC3, 0x5EC4, 0x5EC5, 0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, 0x5ECC, 0x5ECD, + 0x5ECE, 0x5ECF, 0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, 0x5ED8, 0x5ED9, 0x5EDA, + 0x5EDC, 0x5EDD, 0x5EDE, 0x5EE4, 0x5EE5, 0x5EE6, 0x5EE7, 0x5EE9, 0x5EEB, + 0x5EED, 0x5EEE, 0x5EEF, 0x5EF0, 0x5EF1, 0x5EF2, 0x5EF5, 0x5EF8, 0x5EF9, + 0x5EFB, 0x5EFC, 0x5EFD, 0x5F05, 0x5F06, 0x5F07, 0x5F09, 0x5F0C, 0x5F0D, + 0x5F0E, 0x5F10, 0x5F12, 0x5F14, 0x5F16, 0x5F19, 0x5F1A, 0x5F1C, 0x5F1D, + 0x5F1E, 0x5F21, 0x5F22, 0x5F23, 0x5F24, 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, + 0x5F30, 0x5F32, 0x5F34, 0x5F36, 0x5F37, 0x5F38, 0x5F3B, 0x5F3D, 0x5F3E, + 0x5F3F, 0x5F41, 0x5F42, 0x5F43, 0x5F44, 0x5F45, 0x5F47, 0x5F49, 0x5F4A, + 0x5F4B, 0x5F4D, 0x5F4F, 0x5F51, 0x5F54, 0x5F5A, 0x5F5B, 0x5F5C, 0x5F5E, + 0x5F5F, 0x5F60, 0x5F63, 0x5F65, 0x5F67, 0x5F68, 0x5F6B, 0x5F6E, 0x5F6F, + 0x5F72, 0x5F74, 0x5F75, 0x5F76, 0x5F78, 0x5F7A, 0x5F7D, 0x5F7E, 0x5F7F, + 0x5F83, 0x5F86, 0x5F8D, 0x5F8E, 0x5F8F, 0x5F93, 0x5F94, 0x5F96, 0x5F9A, + 0x5F9B, 0x5F9D, 0x5F9F, 0x5FA2, 0x5FA3, 0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, + 0x5FAB, 0x5FAC, 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, 0x5FB4, 0x5FB6, + 0x5FB8, 0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, 0x5FC0, 0x5FC1, 0x5FC2, 0x5FC7, + 0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, 0x5FD3, 0x5FD4, 0x5FD5, 0x5FDA, 0x5FDB, + 0x5FDC, 0x5FDE, 0x5FDF, 0x5FE2, 0x5FE3, 0x5FE5, 0x5FE6, 0x5FE8, 0x5FE9, + 0x5FEC, 0x5FEF, 0x5FF0, 0x5FF2, 0x5FF3, 0x5FF4, 0x5FF6, 0x5FF7, 0x5FF9, + 0x5FFA, 0x5FFC, 0x6007, 0x6008, 0x6009, 0x600B, 0x600C, 0x6010, 0x6011, + 0x6013, 0x6017, 0x6018, 0x601A, 0x601E, 0x601F, 0x6022, 0x6023, 0x6024, + 0x602C, 0x602D, 0x602E, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, + 0x6037, 0x6038, 0x6039, 0x603A, 0x603D, 0x603E, 0x6040, 0x6044, 0x6045, + 0x6046, 0x6047, 0x6048, 0x6049, 0x604A, 0x604C, 0x604E, 0x604F, 0x6051, + 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605B, 0x605C, 0x605E, 0x605F, + 0x6060, 0x6061, 0x6065, 0x6066, 0x606E, 0x6071, 0x6072, 0x6074, 0x6075, + 0x6077, 0x607E, 0x6080, 0x6081, 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, + 0x608A, 0x608B, 0x608E, 0x608F, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, + 0x6098, 0x6099, 0x609C, 0x609E, 0x60A1, 0x60A2, 0x60A4, 0x60A5, 0x60A7, + 0x60A9, 0x60AA, 0x60AE, 0x60B0, 0x60B3, 0x60B7, 0x60B9, 0x60BA, 0x60BD, + 0x60BE, 0x60BF, 0x60C0, 0x60C1, 0x60C2, 0x60C3, 0x60C4, 0x60C7, 0x60C8, + 0x60C9, 0x60CC, 0x60CD, 0x60CE, 0x60CF, 0x60D0, 0x60D2, 0x60D3, 0x60D4, + 0x60D6, 0x60D7, 0x60D9, 0x60DB, 0x60DE, 0x60E2, 0x60E3, 0x60E4, 0x60E5, + 0x60EA, 0x60F5, 0x60F7, 0x60F8, 0x60FC, 0x60FD, 0x60FE, 0x60FF, 0x6102, + 0x6103, 0x6104, 0x6105, 0x6107, 0x610A, 0x610B, 0x610C, 0x6110, 0x6111, + 0x6112, 0x6113, 0x6114, 0x6116, 0x6117, 0x6118, 0x6119, 0x611D, 0x611E, + 0x6121, 0x6122, 0x6125, 0x6128, 0x6129, 0x612A, 0x612C, 0x612D, 0x612E, + 0x612F, 0x6130, 0x6131, 0x6132, 0x6133, 0x6135, 0x6136, 0x6138, 0x6139, + 0x613A, 0x613B, 0x613C, 0x613D, 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, + 0x6145, 0x6146, 0x6147, 0x6149, 0x614D, 0x614F, 0x6150, 0x6152, 0x6153, + 0x6154, 0x6156, 0x6157, 0x6159, 0x615B, 0x615C, 0x615E, 0x6160, 0x6161, + 0x6165, 0x6166, 0x6169, 0x616C, 0x616D, 0x616F, 0x6171, 0x6172, 0x6174, + 0x6178, 0x6179, 0x617A, 0x617B, 0x617C, 0x617D, 0x617E, 0x617F, 0x6180, + 0x6181, 0x6183, 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618C, + 0x618D, 0x618F, 0x6193, 0x6195, 0x6196, 0x6197, 0x6198, 0x6199, 0x619B, + 0x619C, 0x619E, 0x619F, 0x61A0, 0x61A1, 0x61A2, 0x61A3, 0x61A5, 0x61A6, + 0x61AA, 0x61AD, 0x61AF, 0x61B0, 0x61B1, 0x61B3, 0x61B4, 0x61B5, 0x61B8, + 0x61B9, 0x61BA, 0x61BB, 0x61BC, 0x61BD, 0x61BF, 0x61C0, 0x61C1, 0x61C3, + 0x61C4, 0x61C5, 0x61C6, 0x61CD, 0x61CE, 0x61CF, 0x61D0, 0x61D3, 0x61D5, + 0x61D6, 0x61D7, 0x61D8, 0x61D9, 0x61DA, 0x61DB, 0x61DC, 0x61DD, 0x61E0, + 0x61E1, 0x61E2, 0x61E4, 0x61E5, 0x61E7, 0x61E9, 0x61EA, 0x61EB, 0x61EC, + 0x61ED, 0x61EE, 0x61EF, 0x61F0, 0x61F1, 0x61F3, 0x61F4, 0x61F9, 0x61FB, + 0x61FD, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6209, 0x6213, 0x6219, + 0x621C, 0x621D, 0x621E, 0x6220, 0x6223, 0x6226, 0x6228, 0x6229, 0x622B, + 0x622D, 0x622F, 0x6231, 0x6235, 0x6236, 0x6238, 0x6239, 0x623A, 0x623B, + 0x623C, 0x6242, 0x6244, 0x6245, 0x6246, 0x624A, 0x624F, 0x6250, 0x6255, + 0x6256, 0x6257, 0x6259, 0x625A, 0x625C, 0x625D, 0x625E, 0x625F, 0x6260, + 0x6261, 0x6262, 0x6264, 0x6265, 0x6268, 0x6271, 0x6272, 0x6274, 0x6275, + 0x6277, 0x6278, 0x627A, 0x627B, 0x627D, 0x6281, 0x6282, 0x6283, 0x6285, + 0x6286, 0x6287, 0x6288, 0x628B, 0x628C, 0x628D, 0x628E, 0x628F, 0x6290, + 0x6294, 0x6299, 0x629C, 0x629D, 0x629E, 0x62A3, 0x62A6, 0x62A7, 0x62A9, + 0x62AA, 0x62AD, 0x62AE, 0x62AF, 0x62B0, 0x62B2, 0x62B3, 0x62B4, 0x62B6, + 0x62B7, 0x62B8, 0x62BA, 0x62BE, 0x62C0, 0x62C1, 0x62C3, 0x62CB, 0x62CF, + 0x62D1, 0x62D5, 0x62DD, 0x62DE, 0x62E0, 0x62E1, 0x62E4, 0x62EA, 0x62EB, + 0x62F0, 0x62F2, 0x62F5, 0x62F8, 0x62F9, 0x62FA, 0x62FB, 0x6300, 0x6303, + 0x6304, 0x6305, 0x6306, 0x630A, 0x630B, 0x630C, 0x630D, 0x630F, 0x6310, + 0x6312, 0x6313, 0x6314, 0x6315, 0x6317, 0x6318, 0x6319, 0x631C, 0x6326, + 0x6327, 0x6329, 0x632C, 0x632D, 0x632E, 0x6330, 0x6331, 0x6333, 0x6334, + 0x6335, 0x6336, 0x6337, 0x6338, 0x633B, 0x633C, 0x633F, 0x6340, 0x6341, + 0x6344, 0x6347, 0x6348, 0x634A, 0x6351, 0x6352, 0x6353, 0x6354, 0x6356, + 0x6357, 0x6358, 0x6359, 0x635A, 0x635B, 0x635C, 0x635D, 0x6360, 0x6364, + 0x6365, 0x6366, 0x636A, 0x636C, 0x636F, 0x6370, 0x6373, 0x6374, 0x6375, + 0x6378, 0x6379, 0x637C, 0x637D, 0x637E, 0x637F, 0x6381, 0x6385, 0x6386, + 0x638B, 0x638D, 0x6391, 0x6393, 0x6394, 0x6395, 0x6397, 0x6399, 0x639A, + 0x639B, 0x639C, 0x639D, 0x639E, 0x639F, 0x63A1, 0x63A4, 0x63A6, 0x63AB, + 0x63AF, 0x63B1, 0x63B2, 0x63B5, 0x63B6, 0x63B9, 0x63BB, 0x63BD, 0x63BF, + 0x63C1, 0x63C2, 0x63C3, 0x63C5, 0x63C7, 0x63C8, 0x63CA, 0x63CB, 0x63CC, + 0x63D1, 0x63D3, 0x63D4, 0x63D5, 0x63D7, 0x63D8, 0x63D9, 0x63DB, 0x63DC, + 0x63DD, 0x63DF, 0x63E2, 0x63E4, 0x63E5, 0x63E6, 0x63E7, 0x63E8, 0x63EB, + 0x63EC, 0x63EF, 0x63F0, 0x63F1, 0x63F3, 0x63F5, 0x63F7, 0x63F9, 0x63FA, + 0x63FB, 0x63FC, 0x63FE, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408, 0x6409, + 0x640A, 0x640E, 0x6411, 0x6412, 0x6415, 0x6416, 0x6418, 0x6419, 0x641A, + 0x641D, 0x641F, 0x6422, 0x6423, 0x6424, 0x6425, 0x6427, 0x6428, 0x6429, + 0x642B, 0x642E, 0x642F, 0x6430, 0x6431, 0x6432, 0x6433, 0x6435, 0x6437, + 0x6438, 0x6439, 0x643B, 0x643C, 0x643E, 0x6440, 0x6442, 0x6443, 0x6449, + 0x644B, 0x644C, 0x644D, 0x644E, 0x644F, 0x6450, 0x6453, 0x6455, 0x6456, + 0x6457, 0x6459, 0x645A, 0x645B, 0x645D, 0x6460, 0x6461, 0x6462, 0x6463, + 0x6464, 0x6465, 0x6466, 0x6468, 0x646A, 0x646B, 0x646C, 0x646E, 0x6470, + 0x6471, 0x6472, 0x6474, 0x6475, 0x6477, 0x647C, 0x647D, 0x647E, 0x647F, + 0x6480, 0x6481, 0x6483, 0x6486, 0x6489, 0x648A, 0x648B, 0x648C, 0x648D, + 0x648E, 0x648F, 0x6490, 0x6494, 0x6497, 0x6498, 0x649A, 0x649B, 0x649C, + 0x649D, 0x64A0, 0x64A1, 0x64A2, 0x64A6, 0x64A7, 0x64A8, 0x64AA, 0x64AF, + 0x64B1, 0x64B4, 0x64B6, 0x64B9, 0x64BD, 0x64C3, 0x64C6, 0x64C8, 0x64C9, + 0x64CC, 0x64CF, 0x64D1, 0x64D3, 0x64D5, 0x64D6, 0x64D9, 0x64DB, 0x64DC, + 0x64DD, 0x64DF, 0x64E1, 0x64E3, 0x64E5, 0x64E7, 0x64E8, 0x64E9, 0x64EA, + 0x64EB, 0x64ED, 0x64EE, 0x64F3, 0x64F5, 0x64F6, 0x64F8, 0x64F9, 0x64FD, + 0x64FF, 0x6501, 0x6502, 0x6503, 0x6505, 0x6507, 0x6508, 0x650A, 0x650B, + 0x650C, 0x650D, 0x650E, 0x6510, 0x6511, 0x6513, 0x6515, 0x6517, 0x651A, + 0x651C, 0x651E, 0x651F, 0x6520, 0x6521, 0x6526, 0x6527, 0x6528, 0x6529, + 0x652D, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, 0x653A, 0x653C, 0x653D, + 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6546, 0x6547, 0x654A, 0x654B, + 0x654D, 0x654E, 0x6550, 0x6552, 0x6553, 0x6554, 0x6558, 0x655A, 0x655C, + 0x655F, 0x6560, 0x6561, 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656A, + 0x656D, 0x656E, 0x656F, 0x6571, 0x6573, 0x6576, 0x6579, 0x657A, 0x657B, + 0x657C, 0x657D, 0x657E, 0x657F, 0x6580, 0x6581, 0x6584, 0x6585, 0x6586, + 0x6588, 0x6589, 0x658A, 0x658D, 0x658E, 0x658F, 0x6592, 0x6594, 0x6596, + 0x6598, 0x659A, 0x659D, 0x659E, 0x65A0, 0x65A2, 0x65A3, 0x65A6, 0x65A8, + 0x65AA, 0x65AE, 0x65B1, 0x65B2, 0x65B3, 0x65B4, 0x65B5, 0x65B6, 0x65B8, + 0x65BA, 0x65BB, 0x65BE, 0x65BF, 0x65C0, 0x65C2, 0x65C7, 0x65C8, 0x65C9, + 0x65CA, 0x65CD, 0x65D0, 0x65D1, 0x65D3, 0x65D4, 0x65D5, 0x65D8, 0x65D9, + 0x65DA, 0x65DB, 0x65DC, 0x65DD, 0x65DE, 0x65DF, 0x65E1, 0x65E3, 0x65E4, + 0x65EA, 0x65EB, 0x65F2, 0x65F3, 0x65F4, 0x65F5, 0x65F8, 0x65F9, 0x65FB, + 0x65FC, 0x65FD, 0x65FE, 0x65FF, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608, + 0x6609, 0x660B, 0x660D, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617, 0x6618, + 0x661A, 0x661B, 0x661C, 0x661E, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, + 0x6629, 0x662A, 0x662B, 0x662C, 0x662E, 0x6630, 0x6632, 0x6633, 0x6637, + 0x6638, 0x6639, 0x663A, 0x663B, 0x663D, 0x663F, 0x6640, 0x6644, 0x6645, + 0x6646, 0x6647, 0x6648, 0x6649, 0x664A, 0x664D, 0x664E, 0x6650, 0x6651, + 0x6658, 0x6659, 0x665B, 0x665C, 0x665E, 0x6660, 0x6662, 0x6663, 0x6665, + 0x6667, 0x6669, 0x666A, 0x666B, 0x666C, 0x666D, 0x6671, 0x6672, 0x6673, + 0x6675, 0x6678, 0x6679, 0x667B, 0x667C, 0x667D, 0x667F, 0x6680, 0x6681, + 0x6683, 0x6685, 0x6686, 0x668A, 0x668B, 0x668D, 0x668E, 0x668F, 0x6690, + 0x6692, 0x6693, 0x6694, 0x6695, 0x6698, 0x6699, 0x669A, 0x669B, 0x669C, + 0x669E, 0x669F, 0x66A0, 0x66A1, 0x66A3, 0x66A4, 0x66A5, 0x66A6, 0x66A9, + 0x66AA, 0x66AC, 0x66AD, 0x66AF, 0x66B0, 0x66B1, 0x66B2, 0x66B3, 0x66B5, + 0x66B6, 0x66B7, 0x66B8, 0x66BA, 0x66BB, 0x66BC, 0x66BD, 0x66BF, 0x66C0, + 0x66C1, 0x66C2, 0x66C3, 0x66C5, 0x66C8, 0x66CA, 0x66CB, 0x66CC, 0x66CD, + 0x66CE, 0x66CF, 0x66D0, 0x66D1, 0x66D2, 0x66D3, 0x66D4, 0x66D5, 0x66D7, + 0x66D8, 0x66DA, 0x66DE, 0x66DF, 0x66E1, 0x66E2, 0x66E3, 0x66E4, 0x66E5, + 0x66E7, 0x66E8, 0x66EA, 0x66EB, 0x66ED, 0x66EE, 0x66EF, 0x66F1, 0x66F5, + 0x66F6, 0x66FA, 0x66FB, 0x66FD, 0x6701, 0x6702, 0x6704, 0x6705, 0x6706, + 0x6707, 0x670C, 0x670E, 0x670F, 0x6711, 0x6712, 0x6713, 0x6716, 0x6718, + 0x6719, 0x671A, 0x671C, 0x671E, 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, + 0x6725, 0x6729, 0x672E, 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, + 0x6739, 0x673B, 0x673C, 0x673E, 0x673F, 0x6741, 0x6744, 0x6745, 0x6747, + 0x674A, 0x674B, 0x674D, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, 0x6759, + 0x675A, 0x675B, 0x675D, 0x6762, 0x6763, 0x6764, 0x6766, 0x6767, 0x676B, + 0x676C, 0x676E, 0x6774, 0x6776, 0x6778, 0x6779, 0x677A, 0x677B, 0x677D, + 0x6780, 0x6782, 0x6783, 0x6785, 0x6786, 0x6788, 0x678A, 0x678C, 0x678D, + 0x678E, 0x678F, 0x6791, 0x6792, 0x6793, 0x6794, 0x6796, 0x6799, 0x679B, + 0x679F, 0x67A0, 0x67A1, 0x67A4, 0x67A6, 0x67A9, 0x67AC, 0x67AE, 0x67B1, + 0x67B2, 0x67B4, 0x67B9, 0x67BA, 0x67BB, 0x67BC, 0x67BD, 0x67BE, 0x67BF, + 0x67C0, 0x67C2, 0x67C5, 0x67C6, 0x67C7, 0x67C8, 0x67C9, 0x67CA, 0x67CB, + 0x67CC, 0x67CD, 0x67CE, 0x67D5, 0x67D6, 0x67D7, 0x67DB, 0x67DF, 0x67E1, + 0x67E3, 0x67E4, 0x67E6, 0x67E7, 0x67E8, 0x67EA, 0x67EB, 0x67ED, 0x67EE, + 0x67F2, 0x67F5, 0x67F6, 0x67F7, 0x67F8, 0x67F9, 0x67FA, 0x67FB, 0x67FC, + 0x67FE, 0x6801, 0x6802, 0x6803, 0x6804, 0x6806, 0x680D, 0x6810, 0x6812, + 0x6814, 0x6815, 0x6818, 0x6819, 0x681A, 0x681B, 0x681C, 0x681E, 0x681F, + 0x6820, 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x682B, + 0x682C, 0x682D, 0x682E, 0x682F, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836, + 0x683A, 0x683B, 0x683F, 0x6847, 0x684B, 0x684D, 0x684F, 0x6852, 0x6856, + 0x6857, 0x6858, 0x6859, 0x685A, 0x685B, 0x685C, 0x685D, 0x685E, 0x685F, + 0x686A, 0x686C, 0x686D, 0x686E, 0x686F, 0x6870, 0x6871, 0x6872, 0x6873, + 0x6875, 0x6878, 0x6879, 0x687A, 0x687B, 0x687C, 0x687D, 0x687E, 0x687F, + 0x6880, 0x6882, 0x6884, 0x6887, 0x6888, 0x6889, 0x688A, 0x688B, 0x688C, + 0x688D, 0x688E, 0x6890, 0x6891, 0x6892, 0x6894, 0x6895, 0x6896, 0x6899, + 0x689A, 0x689B, 0x689C, 0x689E, 0x68A0, 0x68A1, 0x68A3, 0x68A4, 0x68A5, + 0x68A9, 0x68AA, 0x68AB, 0x68AC, 0x68AE, 0x68B1, 0x68B2, 0x68B4, 0x68B6, + 0x68B7, 0x68B8, 0x68B9, 0x68BA, 0x68BB, 0x68BC, 0x68BD, 0x68BE, 0x68BF, + 0x68C1, 0x68C3, 0x68C4, 0x68C5, 0x68C6, 0x68C7, 0x68C8, 0x68CA, 0x68CC, + 0x68CE, 0x68CF, 0x68D0, 0x68D1, 0x68D3, 0x68D4, 0x68D9, 0x68DB, 0x68DC, + 0x68DD, 0x68DE, 0x68E1, 0x68E2, 0x68E4, 0x68E5, 0x68E6, 0x68E8, 0x68E9, + 0x68EA, 0x68EB, 0x68EC, 0x68ED, 0x68EF, 0x68F2, 0x68F3, 0x68F4, 0x68F6, + 0x68F7, 0x68F8, 0x68FB, 0x68FD, 0x68FE, 0x68FF, 0x6900, 0x6902, 0x6903, + 0x6904, 0x6906, 0x6907, 0x6908, 0x6909, 0x690A, 0x690C, 0x6911, 0x6913, + 0x6914, 0x6915, 0x6916, 0x6917, 0x6918, 0x6919, 0x691A, 0x691B, 0x691C, + 0x691D, 0x691E, 0x6921, 0x6922, 0x6923, 0x6925, 0x6926, 0x6927, 0x6928, + 0x6929, 0x692A, 0x692B, 0x692C, 0x692E, 0x692F, 0x6931, 0x6932, 0x6933, + 0x6935, 0x6936, 0x6937, 0x6938, 0x693A, 0x693B, 0x693C, 0x693E, 0x6940, + 0x6941, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, 0x6949, 0x694B, + 0x694C, 0x694D, 0x694E, 0x694F, 0x6950, 0x6951, 0x6952, 0x6955, 0x6956, + 0x6958, 0x6959, 0x695B, 0x695C, 0x695F, 0x6961, 0x6962, 0x6964, 0x6965, + 0x6967, 0x6969, 0x696A, 0x696C, 0x696F, 0x6970, 0x6972, 0x6973, 0x6974, + 0x6976, 0x697A, 0x697B, 0x697D, 0x697E, 0x697F, 0x6981, 0x6983, 0x6985, + 0x698A, 0x698B, 0x698C, 0x698E, 0x698F, 0x6990, 0x6991, 0x6992, 0x6993, + 0x6996, 0x6997, 0x6999, 0x699A, 0x699D, 0x699E, 0x699F, 0x69A0, 0x69A1, + 0x69A2, 0x69A3, 0x69A4, 0x69A5, 0x69A6, 0x69A9, 0x69AC, 0x69AF, 0x69B0, + 0x69B2, 0x69B3, 0x69B5, 0x69B6, 0x69B8, 0x69B9, 0x69BA, 0x69BC, 0x69BD, + 0x69BE, 0x69C0, 0x69C2, 0x69C3, 0x69C4, 0x69C5, 0x69C6, 0x69C7, 0x69C8, + 0x69C9, 0x69CF, 0x69D1, 0x69D2, 0x69D3, 0x69D5, 0x69D6, 0x69D7, 0x69D8, + 0x69D9, 0x69DA, 0x69DC, 0x69DD, 0x69DE, 0x69E1, 0x69E2, 0x69E3, 0x69E4, + 0x69E5, 0x69E6, 0x69E8, 0x69E9, 0x69EA, 0x69EB, 0x69EC, 0x69EE, 0x69EF, + 0x69F0, 0x69F1, 0x69F4, 0x69F5, 0x69F6, 0x69F7, 0x69F8, 0x69F9, 0x69FA, + 0x69FB, 0x69FC, 0x69FE, 0x6A00, 0x6A03, 0x6A04, 0x6A06, 0x6A07, 0x6A08, + 0x6A09, 0x6A0B, 0x6A0C, 0x6A0D, 0x6A0E, 0x6A0F, 0x6A10, 0x6A11, 0x6A12, + 0x6A14, 0x6A15, 0x6A16, 0x6A1A, 0x6A1B, 0x6A1C, 0x6A1D, 0x6A20, 0x6A22, + 0x6A24, 0x6A25, 0x6A26, 0x6A27, 0x6A29, 0x6A2B, 0x6A2C, 0x6A2D, 0x6A2E, + 0x6A30, 0x6A32, 0x6A33, 0x6A34, 0x6A36, 0x6A37, 0x6A3B, 0x6A3C, 0x6A3F, + 0x6A40, 0x6A41, 0x6A42, 0x6A43, 0x6A45, 0x6A46, 0x6A49, 0x6A4A, 0x6A4C, + 0x6A4D, 0x6A4E, 0x6A4F, 0x6A51, 0x6A52, 0x6A53, 0x6A54, 0x6A55, 0x6A56, + 0x6A57, 0x6A5A, 0x6A5C, 0x6A5D, 0x6A5E, 0x6A60, 0x6A63, 0x6A64, 0x6A66, + 0x6A67, 0x6A68, 0x6A69, 0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D, 0x6A6E, 0x6A6F, + 0x6A70, 0x6A72, 0x6A73, 0x6A74, 0x6A75, 0x6A76, 0x6A77, 0x6A78, 0x6A7A, + 0x6A7B, 0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, 0x6A82, 0x6A83, 0x6A85, 0x6A86, + 0x6A87, 0x6A88, 0x6A8A, 0x6A8B, 0x6A8C, 0x6A8D, 0x6A8F, 0x6A92, 0x6A93, + 0x6A95, 0x6A96, 0x6A98, 0x6A99, 0x6A9A, 0x6A9B, 0x6A9D, 0x6A9E, 0x6A9F, + 0x6AA1, 0x6AA4, 0x6AA5, 0x6AA6, 0x6AA7, 0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, + 0x6AB0, 0x6AB1, 0x6AB2, 0x6AB4, 0x6AB5, 0x6AB6, 0x6AB7, 0x6AB9, 0x6ABA, + 0x6ABC, 0x6ABD, 0x6ABE, 0x6ABF, 0x6AC0, 0x6AC1, 0x6AC2, 0x6AC4, 0x6AC5, + 0x6AC6, 0x6AC7, 0x6AC8, 0x6AC9, 0x6ACA, 0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE, + 0x6ACF, 0x6AD0, 0x6AD1, 0x6AD2, 0x6AD4, 0x6AD5, 0x6AD6, 0x6AD7, 0x6AD8, + 0x6AD9, 0x6ADC, 0x6AE0, 0x6AE1, 0x6AE2, 0x6AE3, 0x6AE4, 0x6AE5, 0x6AE6, + 0x6AE9, 0x6AEB, 0x6AED, 0x6AEE, 0x6AEF, 0x6AF0, 0x6AF1, 0x6AF2, 0x6AF4, + 0x6AF5, 0x6AF6, 0x6AF7, 0x6AF9, 0x6AFA, 0x6AFC, 0x6AFD, 0x6AFE, 0x6AFF, + 0x6B00, 0x6B01, 0x6B02, 0x6B03, 0x6B05, 0x6B06, 0x6B07, 0x6B08, 0x6B09, + 0x6B0B, 0x6B0C, 0x6B0D, 0x6B0E, 0x6B10, 0x6B11, 0x6B13, 0x6B14, 0x6B15, + 0x6B17, 0x6B18, 0x6B19, 0x6B1A, 0x6B1B, 0x6B1C, 0x6B1D, 0x6B1F, 0x6B25, + 0x6B26, 0x6B28, 0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, 0x6B2D, 0x6B2E, 0x6B2F, + 0x6B30, 0x6B31, 0x6B33, 0x6B34, 0x6B35, 0x6B36, 0x6B38, 0x6B3B, 0x6B3C, + 0x6B3F, 0x6B40, 0x6B41, 0x6B42, 0x6B44, 0x6B45, 0x6B48, 0x6B4A, 0x6B4B, + 0x6B4D, 0x6B4E, 0x6B4F, 0x6B51, 0x6B52, 0x6B53, 0x6B54, 0x6B55, 0x6B56, + 0x6B57, 0x6B58, 0x6B5A, 0x6B5B, 0x6B5C, 0x6B5D, 0x6B5E, 0x6B60, 0x6B68, + 0x6B69, 0x6B6B, 0x6B6C, 0x6B6D, 0x6B6E, 0x6B6F, 0x6B70, 0x6B71, 0x6B73, + 0x6B74, 0x6B75, 0x6B76, 0x6B7A, 0x6B7D, 0x6B7E, 0x6B7F, 0x6B80, 0x6B85, + 0x6B88, 0x6B8C, 0x6B8E, 0x6B8F, 0x6B90, 0x6B91, 0x6B94, 0x6B95, 0x6B97, + 0x6B99, 0x6B9C, 0x6B9D, 0x6B9F, 0x6BA0, 0x6BA2, 0x6BA3, 0x6BA5, 0x6BA6, + 0x6BA7, 0x6BA8, 0x6BA9, 0x6BAC, 0x6BAD, 0x6BB0, 0x6BB1, 0x6BB6, 0x6BB8, + 0x6BB9, 0x6BBC, 0x6BBD, 0x6BBE, 0x6BC0, 0x6BC3, 0x6BC4, 0x6BC7, 0x6BC8, + 0x6BC9, 0x6BCA, 0x6BCC, 0x6BCE, 0x6BD0, 0x6BD1, 0x6BD8, 0x6BDA, 0x6BDC, + 0x6BDD, 0x6BDE, 0x6BDF, 0x6BE0, 0x6BE2, 0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, + 0x6BE7, 0x6BE8, 0x6BE9, 0x6BEC, 0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, 0x6BF2, + 0x6BF4, 0x6BF6, 0x6BF7, 0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, 0x6BFE, 0x6C00, + 0x6C01, 0x6C02, 0x6C03, 0x6C04, 0x6C09, 0x6C0A, 0x6C0B, 0x6C0E, 0x6C12, + 0x6C17, 0x6C1C, 0x6C1D, 0x6C1E, 0x6C20, 0x6C25, 0x6C2D, 0x6C31, 0x6C33, + 0x6C36, 0x6C37, 0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, 0x6C3E, 0x6C3F, 0x6C43, + 0x6C44, 0x6C45, 0x6C48, 0x6C4B, 0x6C4C, 0x6C4D, 0x6C4E, 0x6C4F, 0x6C51, + 0x6C52, 0x6C53, 0x6C56, 0x6C58, 0x6C59, 0x6C5A, 0x6C62, 0x6C63, 0x6C65, + 0x6C66, 0x6C67, 0x6C6B, 0x6C6C, 0x6C6D, 0x6C6E, 0x6C6F, 0x6C71, 0x6C73, + 0x6C75, 0x6C77, 0x6C78, 0x6C7A, 0x6C7B, 0x6C7C, 0x6C7F, 0x6C80, 0x6C84, + 0x6C87, 0x6C8A, 0x6C8B, 0x6C8D, 0x6C8E, 0x6C91, 0x6C92, 0x6C95, 0x6C96, + 0x6C97, 0x6C98, 0x6C9A, 0x6C9C, 0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, 0x6CA8, + 0x6CAC, 0x6CAF, 0x6CB0, 0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, 0x6CBA, 0x6CC0, + 0x6CC1, 0x6CC2, 0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, 0x6CCB, 0x6CCD, 0x6CCE, + 0x6CCF, 0x6CD1, 0x6CD2, 0x6CD8, 0x6CD9, 0x6CDA, 0x6CDC, 0x6CDD, 0x6CDF, + 0x6CE4, 0x6CE6, 0x6CE7, 0x6CE9, 0x6CEC, 0x6CED, 0x6CF2, 0x6CF4, 0x6CF9, + 0x6CFF, 0x6D00, 0x6D02, 0x6D03, 0x6D05, 0x6D06, 0x6D08, 0x6D09, 0x6D0A, + 0x6D0D, 0x6D0F, 0x6D10, 0x6D11, 0x6D13, 0x6D14, 0x6D15, 0x6D16, 0x6D18, + 0x6D1C, 0x6D1D, 0x6D1F, 0x6D20, 0x6D21, 0x6D22, 0x6D23, 0x6D24, 0x6D26, + 0x6D28, 0x6D29, 0x6D2C, 0x6D2D, 0x6D2F, 0x6D30, 0x6D34, 0x6D36, 0x6D37, + 0x6D38, 0x6D3A, 0x6D3F, 0x6D40, 0x6D42, 0x6D44, 0x6D49, 0x6D4C, 0x6D50, + 0x6D55, 0x6D56, 0x6D57, 0x6D58, 0x6D5B, 0x6D5D, 0x6D5F, 0x6D61, 0x6D62, + 0x6D64, 0x6D65, 0x6D67, 0x6D68, 0x6D6B, 0x6D6C, 0x6D6D, 0x6D70, 0x6D71, + 0x6D72, 0x6D73, 0x6D75, 0x6D76, 0x6D7A, 0x6D7B, 0x6D7D, 0x6D7E, 0x6D7F, + 0x6D80, 0x6D81, 0x6D83, 0x6D84, 0x6D86, 0x6D8A, 0x6D8B, 0x6D8D, 0x6D8F, + 0x6D90, 0x6D92, 0x6D96, 0x6D97, 0x6D98, 0x6D99, 0x6D9A, 0x6D9C, 0x6DA2, + 0x6DA5, 0x6DAC, 0x6DAD, 0x6DB0, 0x6DB1, 0x6DB3, 0x6DB4, 0x6DB6, 0x6DB7, + 0x6DB9, 0x6DBA, 0x6DBB, 0x6DBC, 0x6DBD, 0x6DBE, 0x6DC1, 0x6DC2, 0x6DC3, + 0x6DC8, 0x6DC9, 0x6DCA, 0x6DCD, 0x6DCE, 0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3, + 0x6DD4, 0x6DD5, 0x6DD7, 0x6DDA, 0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2, 0x6DE3, + 0x6DE5, 0x6DE7, 0x6DE8, 0x6DE9, 0x6DED, 0x6DEF, 0x6DF0, 0x6DF2, 0x6DF4, + 0x6DF8, 0x6DFD, 0x6DFE, 0x6DFF, 0x6E00, 0x6E01, 0x6E02, 0x6E03, 0x6E04, + 0x6E06, 0x6E07, 0x6E08, 0x6E09, 0x6E0B, 0x6E0F, 0x6E12, 0x6E13, 0x6E15, + 0x6E18, 0x6E19, 0x6E1B, 0x6E1C, 0x6E1E, 0x6E1F, 0x6E22, 0x6E27, 0x6E28, + 0x6E2A, 0x6E2E, 0x6E30, 0x6E31, 0x6E33, 0x6E35, 0x6E36, 0x6E37, 0x6E39, + 0x6E3B, 0x6E3C, 0x6E3D, 0x6E3F, 0x6E40, 0x6E41, 0x6E42, 0x6E45, 0x6E46, + 0x6E47, 0x6E48, 0x6E49, 0x6E4A, 0x6E4B, 0x6E4C, 0x6E4F, 0x6E50, 0x6E51, + 0x6E52, 0x6E55, 0x6E57, 0x6E59, 0x6E5A, 0x6E5C, 0x6E5D, 0x6E60, 0x6E61, + 0x6E62, 0x6E63, 0x6E64, 0x6E65, 0x6E66, 0x6E67, 0x6E68, 0x6E69, 0x6E6A, + 0x6E6C, 0x6E6D, 0x6E70, 0x6E71, 0x6E72, 0x6E73, 0x6E74, 0x6E75, 0x6E76, + 0x6E77, 0x6E78, 0x6E79, 0x6E7A, 0x6E7B, 0x6E7C, 0x6E7D, 0x6E80, 0x6E81, + 0x6E82, 0x6E84, 0x6E87, 0x6E88, 0x6E8A, 0x6E8B, 0x6E8C, 0x6E8D, 0x6E8E, + 0x6E91, 0x6E92, 0x6E93, 0x6E94, 0x6E95, 0x6E97, 0x6E99, 0x6E9A, 0x6E9B, + 0x6E9E, 0x6EA0, 0x6EA1, 0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, 0x6EA9, 0x6EAB, + 0x6EAC, 0x6EAD, 0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, 0x6EB8, 0x6EB9, 0x6EBC, + 0x6EBE, 0x6EBF, 0x6EC0, 0x6EC3, 0x6EC6, 0x6EC8, 0x6EC9, 0x6ECA, 0x6ECD, + 0x6ED0, 0x6ED2, 0x6ED6, 0x6ED8, 0x6ED9, 0x6EDB, 0x6EDC, 0x6EDD, 0x6EE3, + 0x6EE7, 0x6EEA, 0x6EEB, 0x6EED, 0x6EEE, 0x6EF0, 0x6EF1, 0x6EF3, 0x6EF5, + 0x6EF6, 0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD, 0x6EFE, 0x6F00, 0x6F03, 0x6F04, + 0x6F05, 0x6F07, 0x6F08, 0x6F0A, 0x6F0B, 0x6F0C, 0x6F0D, 0x6F0E, 0x6F10, + 0x6F11, 0x6F12, 0x6F16, 0x6F17, 0x6F18, 0x6F19, 0x6F1B, 0x6F1C, 0x6F1D, + 0x6F1E, 0x6F1F, 0x6F21, 0x6F25, 0x6F26, 0x6F27, 0x6F28, 0x6F2E, 0x6F30, + 0x6F34, 0x6F35, 0x6F37, 0x6F39, 0x6F3A, 0x6F3B, 0x6F3C, 0x6F3D, 0x6F40, + 0x6F42, 0x6F43, 0x6F44, 0x6F45, 0x6F48, 0x6F49, 0x6F4A, 0x6F4C, 0x6F4E, + 0x6F4F, 0x6F50, 0x6F52, 0x6F53, 0x6F55, 0x6F56, 0x6F57, 0x6F5A, 0x6F5B, + 0x6F5D, 0x6F5F, 0x6F60, 0x6F61, 0x6F63, 0x6F65, 0x6F67, 0x6F68, 0x6F69, + 0x6F6A, 0x6F6B, 0x6F6C, 0x6F71, 0x6F73, 0x6F75, 0x6F76, 0x6F79, 0x6F7B, + 0x6F7D, 0x6F7E, 0x6F81, 0x6F82, 0x6F83, 0x6F85, 0x6F8A, 0x6F8B, 0x6F8F, + 0x6F90, 0x6F91, 0x6F92, 0x6F93, 0x6F94, 0x6F95, 0x6F96, 0x6F98, 0x6F99, + 0x6F9A, 0x6F9B, 0x6F9D, 0x6F9E, 0x6F9F, 0x6FA2, 0x6FA3, 0x6FA5, 0x6FA6, + 0x6FA8, 0x6FAA, 0x6FAB, 0x6FAC, 0x6FAD, 0x6FAF, 0x6FB0, 0x6FB2, 0x6FB4, + 0x6FB5, 0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, 0x6FBC, 0x6FBD, 0x6FBE, 0x6FBF, + 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8, 0x6FCA, 0x6FCB, 0x6FCC, 0x6FCD, + 0x6FCE, 0x6FCF, 0x6FD0, 0x6FD3, 0x6FD4, 0x6FD6, 0x6FD7, 0x6FD9, 0x6FDA, + 0x6FDC, 0x6FDD, 0x6FE2, 0x6FE3, 0x6FE5, 0x6FE6, 0x6FE7, 0x6FE8, 0x6FE9, + 0x6FEA, 0x6FEC, 0x6FED, 0x6FF2, 0x6FF3, 0x6FF4, 0x6FF5, 0x6FF6, 0x6FF7, + 0x6FF8, 0x6FF9, 0x6FFB, 0x6FFD, 0x6FFF, 0x7000, 0x7001, 0x7002, 0x7003, + 0x7004, 0x7007, 0x7008, 0x700A, 0x700C, 0x700D, 0x700E, 0x7010, 0x7012, + 0x7013, 0x7014, 0x7016, 0x7017, 0x7019, 0x701C, 0x701E, 0x7021, 0x7022, + 0x7024, 0x7025, 0x7026, 0x7029, 0x702A, 0x702B, 0x702C, 0x702D, 0x702E, + 0x702F, 0x7031, 0x7033, 0x7034, 0x7036, 0x7037, 0x7038, 0x703A, 0x703B, + 0x703C, 0x703D, 0x703F, 0x7040, 0x7041, 0x7042, 0x7045, 0x7046, 0x7047, + 0x7048, 0x7049, 0x704A, 0x704B, 0x704D, 0x704E, 0x7050, 0x7052, 0x7053, + 0x7054, 0x7056, 0x7057, 0x7059, 0x705A, 0x705B, 0x705C, 0x705F, 0x7060, + 0x7061, 0x7062, 0x7065, 0x7066, 0x7068, 0x7069, 0x706A, 0x706E, 0x7071, + 0x7072, 0x7073, 0x7074, 0x7077, 0x7079, 0x707A, 0x707B, 0x707D, 0x7081, + 0x7082, 0x7083, 0x7084, 0x7086, 0x7087, 0x7088, 0x708B, 0x708C, 0x708D, + 0x708F, 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709A, 0x709B, 0x709E, + 0x709F, 0x70A0, 0x70A1, 0x70A2, 0x70A3, 0x70A4, 0x70A5, 0x70A6, 0x70A7, + 0x70A8, 0x70A9, 0x70AA, 0x70B0, 0x70B2, 0x70B4, 0x70B5, 0x70B6, 0x70BA, + 0x70BE, 0x70BF, 0x70C4, 0x70C5, 0x70C6, 0x70C7, 0x70C9, 0x70CB, 0x70CC, + 0x70CD, 0x70CE, 0x70D0, 0x70D1, 0x70D2, 0x70D3, 0x70D4, 0x70D5, 0x70D6, + 0x70D7, 0x70DA, 0x70DC, 0x70DD, 0x70DE, 0x70E0, 0x70E1, 0x70E2, 0x70E3, + 0x70E5, 0x70EA, 0x70EE, 0x70F0, 0x70F1, 0x70F2, 0x70F3, 0x70F5, 0x70F6, + 0x70F8, 0x70FA, 0x70FB, 0x70FC, 0x70FE, 0x70FF, 0x7100, 0x7101, 0x7102, + 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108, 0x710B, 0x710C, 0x710D, + 0x710E, 0x710F, 0x7111, 0x7112, 0x7114, 0x7117, 0x711B, 0x711C, 0x711D, + 0x711E, 0x711F, 0x7120, 0x7122, 0x7123, 0x7124, 0x7125, 0x7127, 0x7128, + 0x7129, 0x712A, 0x712B, 0x712C, 0x712D, 0x712E, 0x7132, 0x7133, 0x7134, + 0x7135, 0x7137, 0x7138, 0x7139, 0x713A, 0x713B, 0x713C, 0x713D, 0x713E, + 0x713F, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7146, 0x7147, 0x7148, + 0x714B, 0x714D, 0x714F, 0x7150, 0x7151, 0x7153, 0x7154, 0x7155, 0x7156, + 0x7157, 0x7158, 0x7159, 0x715A, 0x715B, 0x715D, 0x715F, 0x7160, 0x7161, + 0x7163, 0x7165, 0x716A, 0x716B, 0x716D, 0x716F, 0x7170, 0x7171, 0x7174, + 0x7175, 0x7176, 0x7177, 0x7179, 0x717B, 0x717C, 0x717E, 0x717F, 0x7180, + 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, 0x7187, 0x7188, 0x7189, 0x718B, + 0x718C, 0x718D, 0x718E, 0x7190, 0x7191, 0x7193, 0x7195, 0x7196, 0x719A, + 0x719B, 0x719C, 0x719D, 0x719E, 0x71A1, 0x71A2, 0x71A3, 0x71A4, 0x71A5, + 0x71A6, 0x71A7, 0x71A9, 0x71AA, 0x71AB, 0x71AD, 0x71AE, 0x71AF, 0x71B0, + 0x71B2, 0x71B4, 0x71B6, 0x71B7, 0x71B8, 0x71BA, 0x71BB, 0x71BC, 0x71BD, + 0x71BF, 0x71C0, 0x71C2, 0x71C4, 0x71C5, 0x71C6, 0x71C7, 0x71C9, 0x71CA, + 0x71CB, 0x71CC, 0x71CD, 0x71CF, 0x71D0, 0x71D1, 0x71D3, 0x71D6, 0x71D7, + 0x71D8, 0x71DA, 0x71DB, 0x71DD, 0x71DE, 0x71E1, 0x71E2, 0x71E3, 0x71E4, + 0x71E8, 0x71E9, 0x71EA, 0x71EB, 0x71EC, 0x71EF, 0x71F0, 0x71F1, 0x71F2, + 0x71F3, 0x71F5, 0x71F6, 0x71F7, 0x71F8, 0x71FA, 0x71FB, 0x71FD, 0x71FF, + 0x7200, 0x7201, 0x7202, 0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, + 0x720A, 0x720B, 0x720C, 0x720E, 0x720F, 0x7211, 0x7212, 0x7213, 0x7214, + 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, 0x721A, 0x721C, 0x721E, 0x721F, + 0x7220, 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7229, + 0x722B, 0x722D, 0x722E, 0x722F, 0x7233, 0x7234, 0x723C, 0x7240, 0x7241, + 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724A, 0x724B, 0x724E, + 0x724F, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255, 0x7257, 0x725A, 0x725C, + 0x725E, 0x7260, 0x7263, 0x7264, 0x7265, 0x7268, 0x726A, 0x726B, 0x726C, + 0x726D, 0x7270, 0x7271, 0x7273, 0x7274, 0x7276, 0x7277, 0x7278, 0x727B, + 0x727C, 0x7282, 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728C, + 0x728E, 0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7297, 0x7298, 0x7299, + 0x729A, 0x729B, 0x729C, 0x729D, 0x729E, 0x72A0, 0x72A1, 0x72A3, 0x72A4, + 0x72A5, 0x72A6, 0x72A8, 0x72A9, 0x72AA, 0x72AB, 0x72AE, 0x72B1, 0x72B2, + 0x72B3, 0x72B5, 0x72BA, 0x72BB, 0x72BC, 0x72BD, 0x72BE, 0x72BF, 0x72C5, + 0x72C6, 0x72C7, 0x72C9, 0x72CA, 0x72CB, 0x72CC, 0x72CF, 0x72D1, 0x72D3, + 0x72D4, 0x72D5, 0x72D6, 0x72D8, 0x72DA, 0x72DB, 0x72DC, 0x72DD, 0x72DF, + 0x72E2, 0x72E3, 0x72E4, 0x72E5, 0x72E6, 0x72E7, 0x72EA, 0x72EB, 0x72F5, + 0x72F6, 0x72FE, 0x72FF, 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, + 0x7308, 0x7309, 0x730B, 0x730C, 0x730D, 0x730F, 0x7310, 0x7311, 0x7312, + 0x7314, 0x7318, 0x7319, 0x731A, 0x731F, 0x7320, 0x7323, 0x7324, 0x7326, + 0x7327, 0x7328, 0x732D, 0x732F, 0x7330, 0x7332, 0x7333, 0x7335, 0x733A, + 0x733C, 0x733D, 0x7340, 0x7342, 0x7343, 0x7346, 0x7347, 0x7348, 0x7349, + 0x734A, 0x734B, 0x734C, 0x734E, 0x734F, 0x7351, 0x7353, 0x7354, 0x7355, + 0x7356, 0x7358, 0x7359, 0x735A, 0x735B, 0x735C, 0x735D, 0x735E, 0x735F, + 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, 0x7369, 0x736E, + 0x7371, 0x7373, 0x7374, 0x7376, 0x7379, 0x737D, 0x737F, 0x7381, 0x7382, + 0x7383, 0x7385, 0x7386, 0x7388, 0x738A, 0x738C, 0x738D, 0x738F, 0x7390, + 0x7392, 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, 0x739A, 0x739C, + 0x739D, 0x739E, 0x73A0, 0x73A1, 0x73A3, 0x73A4, 0x73A5, 0x73A6, 0x73A7, + 0x73A8, 0x73AA, 0x73AC, 0x73AD, 0x73B1, 0x73B4, 0x73B5, 0x73B6, 0x73B8, + 0x73B9, 0x73BC, 0x73BD, 0x73BE, 0x73BF, 0x73C1, 0x73C3, 0x73C4, 0x73C5, + 0x73C6, 0x73C7, 0x73CB, 0x73CC, 0x73CE, 0x73D2, 0x73D3, 0x73D4, 0x73D5, + 0x73D6, 0x73D7, 0x73D8, 0x73DA, 0x73DB, 0x73DC, 0x73DD, 0x73DF, 0x73E1, + 0x73E2, 0x73E3, 0x73E4, 0x73E6, 0x73E8, 0x73EA, 0x73EB, 0x73EC, 0x73EE, + 0x73EF, 0x73F0, 0x73F1, 0x73F3, 0x73F4, 0x73F5, 0x73F6, 0x73F7, 0x73F8, + 0x73F9, 0x73FA, 0x73FB, 0x73FC, 0x73FD, 0x73FF, 0x7400, 0x7401, 0x7402, + 0x7404, 0x7407, 0x7408, 0x740B, 0x740C, 0x740D, 0x740E, 0x7411, 0x7412, + 0x7413, 0x7414, 0x7415, 0x7416, 0x7417, 0x7418, 0x7419, 0x741C, 0x741D, + 0x741E, 0x741F, 0x7420, 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742B, + 0x742D, 0x742F, 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743A, 0x743B, + 0x743D, 0x743E, 0x7440, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446, 0x7447, + 0x7448, 0x7449, 0x744A, 0x744C, 0x744D, 0x744E, 0x744F, 0x7450, 0x7451, + 0x7452, 0x7453, 0x7454, 0x7456, 0x7458, 0x745D, 0x7460, 0x7461, 0x7462, + 0x7464, 0x7465, 0x7466, 0x7467, 0x7468, 0x746B, 0x746C, 0x746E, 0x746F, + 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, 0x747A, 0x747B, + 0x747C, 0x747D, 0x747F, 0x7482, 0x7484, 0x7485, 0x7486, 0x7488, 0x748A, + 0x748C, 0x748D, 0x748F, 0x7491, 0x7492, 0x7493, 0x7494, 0x7495, 0x7496, + 0x7497, 0x7498, 0x7499, 0x749A, 0x749B, 0x749D, 0x749F, 0x74A0, 0x74A1, + 0x74A2, 0x74A4, 0x74A5, 0x74AA, 0x74AB, 0x74AC, 0x74AD, 0x74AE, 0x74AF, + 0x74B1, 0x74B2, 0x74B3, 0x74B4, 0x74B5, 0x74B6, 0x74B7, 0x74B8, 0x74B9, + 0x74BB, 0x74BC, 0x74BE, 0x74BF, 0x74C0, 0x74C1, 0x74C2, 0x74C3, 0x74C4, + 0x74C5, 0x74C6, 0x74C7, 0x74C8, 0x74C9, 0x74CB, 0x74CC, 0x74CD, 0x74CE, + 0x74D0, 0x74D1, 0x74D3, 0x74D5, 0x74D6, 0x74D7, 0x74D8, 0x74D9, 0x74DB, + 0x74DD, 0x74DF, 0x74E1, 0x74E5, 0x74E7, 0x74E8, 0x74E9, 0x74EA, 0x74EB, + 0x74EC, 0x74ED, 0x74F0, 0x74F1, 0x74F2, 0x74F3, 0x74F5, 0x74F8, 0x74F9, + 0x74FA, 0x74FB, 0x74FC, 0x74FD, 0x74FE, 0x7500, 0x7501, 0x7502, 0x7503, + 0x7505, 0x7506, 0x7507, 0x7508, 0x7509, 0x750A, 0x750B, 0x750E, 0x7510, + 0x7512, 0x7514, 0x7515, 0x7516, 0x7517, 0x751B, 0x751D, 0x751E, 0x7520, + 0x7521, 0x7522, 0x7524, 0x7526, 0x7527, 0x752A, 0x752E, 0x7534, 0x7536, + 0x7539, 0x753C, 0x753D, 0x753F, 0x7541, 0x7542, 0x7543, 0x7544, 0x7546, + 0x7547, 0x7549, 0x754A, 0x754D, 0x7550, 0x7551, 0x7552, 0x7553, 0x7555, + 0x7556, 0x7557, 0x7558, 0x755E, 0x755F, 0x7560, 0x7561, 0x7563, 0x7564, + 0x7567, 0x7568, 0x7569, 0x756C, 0x756D, 0x756E, 0x756F, 0x7570, 0x7571, + 0x7573, 0x7575, 0x7577, 0x757A, 0x757B, 0x757C, 0x757D, 0x757E, 0x7580, + 0x7581, 0x7582, 0x7584, 0x7585, 0x7588, 0x7589, 0x758A, 0x758C, 0x758D, + 0x758E, 0x7590, 0x7593, 0x7595, 0x7598, 0x759B, 0x759C, 0x759E, 0x75A2, + 0x75A6, 0x75A7, 0x75A8, 0x75A9, 0x75AA, 0x75AD, 0x75B6, 0x75B7, 0x75BA, + 0x75BB, 0x75BF, 0x75C0, 0x75C1, 0x75C6, 0x75CB, 0x75CC, 0x75CE, 0x75CF, + 0x75D0, 0x75D1, 0x75D3, 0x75D7, 0x75DA, 0x75DC, 0x75DD, 0x75DF, 0x75E0, + 0x75E1, 0x75E5, 0x75E9, 0x75EC, 0x75ED, 0x75EE, 0x75EF, 0x75F2, 0x75F3, + 0x75F5, 0x75F6, 0x75F7, 0x75F8, 0x75FA, 0x75FB, 0x75FD, 0x75FE, 0x7604, + 0x7606, 0x7607, 0x7608, 0x7609, 0x760E, 0x760F, 0x7611, 0x7612, 0x7613, + 0x7614, 0x7616, 0x761A, 0x761C, 0x761D, 0x7623, 0x7628, 0x762C, 0x762E, + 0x762F, 0x7631, 0x7632, 0x7636, 0x7637, 0x7639, 0x763A, 0x763D, 0x7641, + 0x7644, 0x7645, 0x7648, 0x764A, 0x764B, 0x764E, 0x764F, 0x7650, 0x7651, + 0x7652, 0x7653, 0x7655, 0x7657, 0x7659, 0x765A, 0x765B, 0x765D, 0x7660, + 0x7661, 0x7666, 0x7668, 0x766A, 0x7673, 0x7674, 0x7675, 0x7676, 0x7677, + 0x7679, 0x767A, 0x767F, 0x7680, 0x7681, 0x7683, 0x7685, 0x7689, 0x768A, + 0x768C, 0x768D, 0x768F, 0x7690, 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, + 0x769B, 0x769C, 0x769D, 0x769E, 0x769F, 0x76A0, 0x76A1, 0x76A2, 0x76A3, + 0x76A5, 0x76A6, 0x76A7, 0x76A8, 0x76A9, 0x76AA, 0x76AB, 0x76AC, 0x76AD, + 0x76AF, 0x76B0, 0x76B3, 0x76B5, 0x76B6, 0x76B7, 0x76B9, 0x76BB, 0x76BC, + 0x76BD, 0x76BE, 0x76C0, 0x76C1, 0x76C3, 0x76C4, 0x76C7, 0x76C9, 0x76CB, + 0x76CC, 0x76D3, 0x76D5, 0x76D9, 0x76DA, 0x76DC, 0x76DD, 0x76E0, 0x76E2, + 0x76E6, 0x76E8, 0x76E9, 0x76EA, 0x76EB, 0x76EC, 0x76ED, 0x76F0, 0x76F3, + 0x76F5, 0x76F6, 0x76F7, 0x76FA, 0x76FB, 0x76FD, 0x76FF, 0x7700, 0x7702, + 0x7703, 0x7705, 0x7706, 0x770A, 0x770C, 0x770E, 0x770F, 0x7710, 0x7711, + 0x7712, 0x7713, 0x7714, 0x7715, 0x7716, 0x7717, 0x7718, 0x771B, 0x771C, + 0x771D, 0x771E, 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772A, 0x772B, + 0x772C, 0x772E, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773B, + 0x773D, 0x773E, 0x773F, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748, 0x7749, + 0x774A, 0x774B, 0x774C, 0x774D, 0x774E, 0x7752, 0x7753, 0x7754, 0x7755, + 0x7756, 0x7757, 0x7758, 0x7759, 0x775C, 0x775D, 0x775F, 0x7760, 0x7764, + 0x7767, 0x7769, 0x776A, 0x776D, 0x776E, 0x776F, 0x7770, 0x7771, 0x7772, + 0x7773, 0x7774, 0x7775, 0x7776, 0x7777, 0x7778, 0x777A, 0x777B, 0x777C, + 0x7781, 0x7782, 0x7783, 0x7786, 0x7787, 0x7788, 0x7789, 0x778A, 0x778B, + 0x778F, 0x7790, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7799, 0x779A, + 0x779B, 0x779C, 0x779D, 0x77A1, 0x77A3, 0x77A4, 0x77A6, 0x77A8, 0x77AB, + 0x77AE, 0x77AF, 0x77B1, 0x77B2, 0x77B4, 0x77B6, 0x77B7, 0x77B8, 0x77B9, + 0x77BA, 0x77BE, 0x77C0, 0x77C1, 0x77C2, 0x77C3, 0x77C4, 0x77C5, 0x77C6, + 0x77C8, 0x77C9, 0x77CA, 0x77CB, 0x77CC, 0x77CE, 0x77CF, 0x77D0, 0x77D1, + 0x77D2, 0x77D3, 0x77D4, 0x77D5, 0x77D6, 0x77D8, 0x77D9, 0x77DD, 0x77DE, + 0x77DF, 0x77E0, 0x77E1, 0x77E4, 0x77E6, 0x77E8, 0x77EA, 0x77F0, 0x77F1, + 0x77F2, 0x77F4, 0x77F5, 0x77F7, 0x77F9, 0x77FA, 0x77FB, 0x77FC, 0x7803, + 0x7804, 0x7805, 0x7806, 0x7807, 0x7808, 0x780A, 0x780B, 0x780E, 0x780F, + 0x7810, 0x7813, 0x7815, 0x7819, 0x781B, 0x781E, 0x7820, 0x7821, 0x7822, + 0x7824, 0x7828, 0x782A, 0x782B, 0x782E, 0x782F, 0x7831, 0x7832, 0x7833, + 0x7835, 0x7836, 0x783D, 0x783F, 0x7841, 0x7842, 0x7844, 0x7846, 0x7848, + 0x7849, 0x784A, 0x784B, 0x784D, 0x784F, 0x7851, 0x7853, 0x7854, 0x7858, + 0x7859, 0x785A, 0x785B, 0x785C, 0x785E, 0x785F, 0x7860, 0x7861, 0x7862, + 0x7863, 0x7865, 0x7866, 0x7867, 0x7869, 0x7870, 0x7871, 0x7872, 0x7873, + 0x7874, 0x7875, 0x7876, 0x7878, 0x7879, 0x787A, 0x787B, 0x787D, 0x787E, + 0x787F, 0x7880, 0x7881, 0x7882, 0x7883, 0x7884, 0x7885, 0x7886, 0x7888, + 0x788A, 0x788B, 0x788F, 0x7890, 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, + 0x789D, 0x789E, 0x78A0, 0x78A2, 0x78A4, 0x78A6, 0x78A8, 0x78AA, 0x78AB, + 0x78AC, 0x78AE, 0x78AF, 0x78B5, 0x78B6, 0x78B7, 0x78BB, 0x78BD, 0x78BF, + 0x78C0, 0x78C2, 0x78C3, 0x78C4, 0x78C6, 0x78C7, 0x78C8, 0x78CC, 0x78CD, + 0x78CE, 0x78CF, 0x78D1, 0x78D2, 0x78D3, 0x78D6, 0x78D7, 0x78D8, 0x78DB, + 0x78DC, 0x78DD, 0x78DE, 0x78DF, 0x78E0, 0x78E1, 0x78E2, 0x78E4, 0x78E5, + 0x78E6, 0x78E9, 0x78EA, 0x78EB, 0x78ED, 0x78EE, 0x78F0, 0x78F1, 0x78F3, + 0x78F5, 0x78F6, 0x78F8, 0x78F9, 0x78FB, 0x78FC, 0x78FE, 0x78FF, 0x7900, + 0x7902, 0x7903, 0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790A, 0x790B, + 0x790C, 0x790D, 0x790F, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, 0x7916, + 0x7917, 0x7918, 0x791A, 0x791B, 0x791C, 0x791D, 0x791F, 0x7920, 0x7921, + 0x7922, 0x7923, 0x7925, 0x7927, 0x7928, 0x7929, 0x792D, 0x792E, 0x792F, + 0x7930, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938, 0x7939, 0x793D, + 0x793F, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947, 0x794A, 0x794B, 0x794C, + 0x794D, 0x794E, 0x794F, 0x7950, 0x7951, 0x7952, 0x7954, 0x7955, 0x7958, + 0x7959, 0x7961, 0x7963, 0x7964, 0x7966, 0x7969, 0x796A, 0x796B, 0x796C, + 0x796E, 0x7970, 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, + 0x797B, 0x797C, 0x797D, 0x797E, 0x797F, 0x7982, 0x7983, 0x7986, 0x7987, + 0x7988, 0x7989, 0x798B, 0x798C, 0x7990, 0x7991, 0x7992, 0x7993, 0x7994, + 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799B, 0x799C, 0x799D, 0x799E, + 0x799F, 0x79A0, 0x79A1, 0x79A2, 0x79A3, 0x79A4, 0x79A5, 0x79A8, 0x79A9, + 0x79AB, 0x79AC, 0x79AD, 0x79AF, 0x79B2, 0x79B4, 0x79B5, 0x79B6, 0x79B7, + 0x79B8, 0x79BC, 0x79BF, 0x79C2, 0x79C4, 0x79C5, 0x79C7, 0x79C8, 0x79CA, + 0x79CC, 0x79CE, 0x79CF, 0x79D0, 0x79D3, 0x79D4, 0x79D6, 0x79D7, 0x79D9, + 0x79DA, 0x79DB, 0x79DC, 0x79DD, 0x79DE, 0x79E0, 0x79E1, 0x79E2, 0x79E5, + 0x79E8, 0x79EA, 0x79EC, 0x79EE, 0x79F1, 0x79F2, 0x79F3, 0x79F4, 0x79F5, + 0x79F6, 0x79F7, 0x79F9, 0x79FA, 0x79FC, 0x79FE, 0x79FF, 0x7A01, 0x7A04, + 0x7A05, 0x7A07, 0x7A08, 0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, 0x7A10, 0x7A11, + 0x7A12, 0x7A13, 0x7A15, 0x7A16, 0x7A18, 0x7A19, 0x7A1B, 0x7A1C, 0x7A1D, + 0x7A1F, 0x7A21, 0x7A22, 0x7A24, 0x7A25, 0x7A26, 0x7A27, 0x7A28, 0x7A29, + 0x7A2A, 0x7A2B, 0x7A2C, 0x7A2D, 0x7A2F, 0x7A30, 0x7A32, 0x7A34, 0x7A35, + 0x7A36, 0x7A38, 0x7A3A, 0x7A3E, 0x7A41, 0x7A42, 0x7A43, 0x7A44, 0x7A45, + 0x7A47, 0x7A48, 0x7A49, 0x7A4A, 0x7A4B, 0x7A4F, 0x7A50, 0x7A52, 0x7A53, + 0x7A54, 0x7A55, 0x7A56, 0x7A58, 0x7A59, 0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, + 0x7A5E, 0x7A5F, 0x7A60, 0x7A63, 0x7A64, 0x7A65, 0x7A66, 0x7A67, 0x7A68, + 0x7A6A, 0x7A6C, 0x7A6D, 0x7A6E, 0x7A6F, 0x7A71, 0x7A72, 0x7A73, 0x7A75, + 0x7A7B, 0x7A7C, 0x7A7D, 0x7A7E, 0x7A82, 0x7A85, 0x7A87, 0x7A89, 0x7A8A, + 0x7A8B, 0x7A8C, 0x7A8E, 0x7A8F, 0x7A90, 0x7A93, 0x7A94, 0x7A99, 0x7A9A, + 0x7A9B, 0x7A9E, 0x7AA1, 0x7AA2, 0x7AA3, 0x7AA4, 0x7AA7, 0x7AAB, 0x7AAF, + 0x7AB0, 0x7AB1, 0x7AB2, 0x7AB4, 0x7AB5, 0x7AB7, 0x7AB8, 0x7AB9, 0x7ABB, + 0x7ABC, 0x7ABD, 0x7ABE, 0x7AC0, 0x7AC1, 0x7AC2, 0x7AC3, 0x7AC6, 0x7AC9, + 0x7ACC, 0x7ACD, 0x7ACE, 0x7ACF, 0x7AD0, 0x7AD1, 0x7AD2, 0x7AD3, 0x7AD4, + 0x7AD5, 0x7AD7, 0x7AD8, 0x7ADA, 0x7ADB, 0x7ADC, 0x7ADD, 0x7AE1, 0x7AE2, + 0x7AE4, 0x7AE7, 0x7AE8, 0x7AE9, 0x7AEB, 0x7AEC, 0x7AEE, 0x7AF0, 0x7AF1, + 0x7AF2, 0x7AF3, 0x7AF4, 0x7AF5, 0x7AF7, 0x7AF8, 0x7AFB, 0x7AFC, 0x7AFE, + 0x7B00, 0x7B01, 0x7B02, 0x7B05, 0x7B07, 0x7B09, 0x7B0C, 0x7B0D, 0x7B0E, + 0x7B10, 0x7B12, 0x7B13, 0x7B16, 0x7B17, 0x7B18, 0x7B1A, 0x7B1C, 0x7B1D, + 0x7B1F, 0x7B21, 0x7B22, 0x7B23, 0x7B27, 0x7B29, 0x7B2D, 0x7B2F, 0x7B30, + 0x7B32, 0x7B34, 0x7B35, 0x7B36, 0x7B37, 0x7B39, 0x7B3B, 0x7B3D, 0x7B3F, + 0x7B40, 0x7B41, 0x7B42, 0x7B43, 0x7B44, 0x7B48, 0x7B4A, 0x7B4D, 0x7B4E, + 0x7B53, 0x7B55, 0x7B57, 0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, 0x7B61, 0x7B63, + 0x7B64, 0x7B65, 0x7B66, 0x7B68, 0x7B69, 0x7B6A, 0x7B6B, 0x7B6C, 0x7B6D, + 0x7B6F, 0x7B70, 0x7B73, 0x7B74, 0x7B76, 0x7B78, 0x7B7A, 0x7B7C, 0x7B7D, + 0x7B7F, 0x7B81, 0x7B82, 0x7B83, 0x7B84, 0x7B86, 0x7B87, 0x7B88, 0x7B89, + 0x7B8A, 0x7B8C, 0x7B8E, 0x7B8F, 0x7B91, 0x7B92, 0x7B93, 0x7B96, 0x7B98, + 0x7B99, 0x7B9A, 0x7B9B, 0x7B9E, 0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, 0x7BA5, + 0x7BAE, 0x7BAF, 0x7BB0, 0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, 0x7BB7, 0x7BB9, + 0x7BBA, 0x7BBB, 0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, 0x7BC2, 0x7BC3, 0x7BC5, + 0x7BC8, 0x7BCA, 0x7BCD, 0x7BCE, 0x7BCF, 0x7BD0, 0x7BD2, 0x7BD4, 0x7BD5, + 0x7BD6, 0x7BD7, 0x7BD8, 0x7BDB, 0x7BDC, 0x7BDE, 0x7BDF, 0x7BE0, 0x7BE2, + 0x7BE3, 0x7BE7, 0x7BE8, 0x7BEB, 0x7BEC, 0x7BED, 0x7BEF, 0x7BF0, 0x7BF2, + 0x7BF4, 0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, 0x7BFA, 0x7BFB, 0x7BFD, 0x7BFF, + 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C05, 0x7C06, 0x7C08, 0x7C09, 0x7C0A, + 0x7C0E, 0x7C10, 0x7C11, 0x7C12, 0x7C13, 0x7C14, 0x7C15, 0x7C17, 0x7C18, + 0x7C19, 0x7C1A, 0x7C1B, 0x7C1C, 0x7C1D, 0x7C20, 0x7C22, 0x7C24, 0x7C25, + 0x7C28, 0x7C29, 0x7C2C, 0x7C2D, 0x7C2E, 0x7C2F, 0x7C30, 0x7C31, 0x7C32, + 0x7C33, 0x7C34, 0x7C35, 0x7C36, 0x7C37, 0x7C39, 0x7C3A, 0x7C3B, 0x7C3C, + 0x7C42, 0x7C44, 0x7C45, 0x7C46, 0x7C47, 0x7C48, 0x7C49, 0x7C4A, 0x7C4B, + 0x7C4E, 0x7C4F, 0x7C50, 0x7C51, 0x7C52, 0x7C53, 0x7C54, 0x7C55, 0x7C56, + 0x7C57, 0x7C58, 0x7C59, 0x7C5A, 0x7C5B, 0x7C5D, 0x7C5E, 0x7C61, 0x7C62, + 0x7C63, 0x7C65, 0x7C66, 0x7C67, 0x7C68, 0x7C6B, 0x7C6D, 0x7C6F, 0x7C70, + 0x7C71, 0x7C75, 0x7C76, 0x7C77, 0x7C78, 0x7C79, 0x7C7A, 0x7C7E, 0x7C7F, + 0x7C80, 0x7C81, 0x7C82, 0x7C83, 0x7C84, 0x7C85, 0x7C86, 0x7C87, 0x7C88, + 0x7C8A, 0x7C8B, 0x7C8C, 0x7C8D, 0x7C8E, 0x7C8F, 0x7C90, 0x7C93, 0x7C94, + 0x7C96, 0x7C99, 0x7C9A, 0x7C9B, 0x7CA0, 0x7CA1, 0x7CA3, 0x7CA6, 0x7CA7, + 0x7CA8, 0x7CA9, 0x7CAB, 0x7CAC, 0x7CAD, 0x7CAF, 0x7CB0, 0x7CB4, 0x7CB5, + 0x7CB6, 0x7CB7, 0x7CB8, 0x7CBA, 0x7CBB, 0x7CBF, 0x7CC0, 0x7CC2, 0x7CC3, + 0x7CC4, 0x7CC6, 0x7CC9, 0x7CCB, 0x7CCE, 0x7CCF, 0x7CD0, 0x7CD1, 0x7CD2, + 0x7CD3, 0x7CD4, 0x7CD8, 0x7CDA, 0x7CDB, 0x7CE1, 0x7CE2, 0x7CE3, 0x7CE4, + 0x7CE5, 0x7CE6, 0x7CE9, 0x7CEA, 0x7CEB, 0x7CEC, 0x7CED, 0x7CEE, 0x7CF1, + 0x7CF3, 0x7CF5, 0x7CF7, 0x7CFA, 0x7CFC, 0x7CFD, 0x7CFF, 0x7D01, 0x7D03, + 0x7D0C, 0x7D0E, 0x7D0F, 0x7D11, 0x7D12, 0x7D16, 0x7D18, 0x7D1D, 0x7D1E, + 0x7D1F, 0x7D23, 0x7D24, 0x7D25, 0x7D26, 0x7D28, 0x7D29, 0x7D2A, 0x7D2C, + 0x7D2D, 0x7D2E, 0x7D34, 0x7D35, 0x7D36, 0x7D37, 0x7D38, 0x7D3B, 0x7D3D, + 0x7D3E, 0x7D41, 0x7D43, 0x7D45, 0x7D47, 0x7D48, 0x7D49, 0x7D4A, 0x7D4B, + 0x7D4C, 0x7D4D, 0x7D4F, 0x7D51, 0x7D52, 0x7D53, 0x7D54, 0x7D55, 0x7D56, + 0x7D57, 0x7D58, 0x7D59, 0x7D5A, 0x7D5B, 0x7D5C, 0x7D5F, 0x7D60, 0x7D63, + 0x7D64, 0x7D65, 0x7D67, 0x7D69, 0x7D6A, 0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F, + 0x7D70, 0x7D74, 0x7D75, 0x7D78, 0x7D7A, 0x7D7B, 0x7D7C, 0x7D7D, 0x7D7E, + 0x7D7F, 0x7D80, 0x7D82, 0x7D84, 0x7D85, 0x7D87, 0x7D8A, 0x7D8B, 0x7D8C, + 0x7D8D, 0x7D8E, 0x7D90, 0x7D91, 0x7D92, 0x7D94, 0x7D95, 0x7D96, 0x7D97, + 0x7D98, 0x7D99, 0x7D9A, 0x7D9B, 0x7D9D, 0x7D9F, 0x7DA0, 0x7DA1, 0x7DA4, + 0x7DA5, 0x7DA7, 0x7DA8, 0x7DA9, 0x7DAA, 0x7DAF, 0x7DB5, 0x7DB6, 0x7DB7, + 0x7DBC, 0x7DC0, 0x7DC1, 0x7DC2, 0x7DC3, 0x7DC5, 0x7DC6, 0x7DC8, 0x7DC9, + 0x7DCC, 0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0, 0x7DD3, 0x7DD5, 0x7DD6, 0x7DDA, + 0x7DDB, 0x7DDC, 0x7DDF, 0x7DE2, 0x7DE4, 0x7DE5, 0x7DE7, 0x7DEA, 0x7DEB, + 0x7DED, 0x7DEE, 0x7DF0, 0x7DF3, 0x7DF5, 0x7DF7, 0x7DF8, 0x7DFA, 0x7DFC, + 0x7DFD, 0x7DFE, 0x7DFF, 0x7E00, 0x7E01, 0x7E02, 0x7E03, 0x7E04, 0x7E05, + 0x7E06, 0x7E07, 0x7E0C, 0x7E0D, 0x7E0E, 0x7E0F, 0x7E12, 0x7E13, 0x7E14, + 0x7E15, 0x7E16, 0x7E17, 0x7E18, 0x7E19, 0x7E1A, 0x7E1C, 0x7E20, 0x7E21, + 0x7E22, 0x7E24, 0x7E25, 0x7E26, 0x7E28, 0x7E29, 0x7E2A, 0x7E2C, 0x7E2F, + 0x7E30, 0x7E33, 0x7E38, 0x7E3A, 0x7E3C, 0x7E3F, 0x7E40, 0x7E42, 0x7E43, + 0x7E44, 0x7E48, 0x7E49, 0x7E4A, 0x7E4B, 0x7E4C, 0x7E4D, 0x7E4E, 0x7E4F, + 0x7E50, 0x7E51, 0x7E53, 0x7E56, 0x7E57, 0x7E58, 0x7E59, 0x7E5B, 0x7E5C, + 0x7E5D, 0x7E5F, 0x7E60, 0x7E61, 0x7E63, 0x7E64, 0x7E65, 0x7E66, 0x7E67, + 0x7E68, 0x7E6C, 0x7E71, 0x7E72, 0x7E74, 0x7E75, 0x7E76, 0x7E77, 0x7E78, + 0x7E7A, 0x7E7B, 0x7E7F, 0x7E80, 0x7E81, 0x7E83, 0x7E84, 0x7E85, 0x7E86, + 0x7E87, 0x7E89, 0x7E8B, 0x7E8E, 0x7E90, 0x7E91, 0x7E92, 0x7E95, 0x7E97, + 0x7E99, 0x7E9A, 0x7E9D, 0x7E9E, 0x7EAE, 0x7EB4, 0x7EBB, 0x7EBC, 0x7ED6, + 0x7EE4, 0x7EEC, 0x7EF9, 0x7F0A, 0x7F10, 0x7F1E, 0x7F37, 0x7F39, 0x7F3B, + 0x7F3C, 0x7F3D, 0x7F3E, 0x7F3F, 0x7F40, 0x7F41, 0x7F43, 0x7F46, 0x7F47, + 0x7F48, 0x7F49, 0x7F4A, 0x7F4B, 0x7F4D, 0x7F4F, 0x7F52, 0x7F53, 0x7F56, + 0x7F59, 0x7F5B, 0x7F5C, 0x7F5D, 0x7F5E, 0x7F60, 0x7F63, 0x7F64, 0x7F65, + 0x7F66, 0x7F67, 0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, 0x7F73, 0x7F75, 0x7F76, + 0x7F78, 0x7F7A, 0x7F7B, 0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, 0x7F82, 0x7F83, + 0x7F84, 0x7F87, 0x7F89, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, 0x7F91, 0x7F92, + 0x7F93, 0x7F95, 0x7F96, 0x7F97, 0x7F98, 0x7F99, 0x7F9B, 0x7F9C, 0x7FA0, + 0x7FA2, 0x7FA3, 0x7FA6, 0x7FA8, 0x7FAA, 0x7FAB, 0x7FAC, 0x7FAD, 0x7FAE, + 0x7FB1, 0x7FB3, 0x7FB4, 0x7FB5, 0x7FB6, 0x7FB7, 0x7FBA, 0x7FBB, 0x7FBE, + 0x7FC0, 0x7FC2, 0x7FC3, 0x7FC4, 0x7FC6, 0x7FC7, 0x7FC8, 0x7FC9, 0x7FCB, + 0x7FCD, 0x7FCF, 0x7FD0, 0x7FD1, 0x7FD3, 0x7FD6, 0x7FD7, 0x7FD9, 0x7FDA, + 0x7FDB, 0x7FDC, 0x7FDD, 0x7FDE, 0x7FE2, 0x7FE3, 0x7FE4, 0x7FE7, 0x7FE8, + 0x7FEA, 0x7FEB, 0x7FEC, 0x7FED, 0x7FEF, 0x7FF2, 0x7FF4, 0x7FF5, 0x7FF6, + 0x7FF7, 0x7FF8, 0x7FFA, 0x7FFD, 0x7FFE, 0x7FFF, 0x8002, 0x8007, 0x8008, + 0x8009, 0x800A, 0x800E, 0x800F, 0x8011, 0x8013, 0x801A, 0x801B, 0x801D, + 0x801E, 0x801F, 0x8021, 0x8023, 0x8024, 0x802B, 0x802D, 0x802F, 0x8030, + 0x8032, 0x8034, 0x8039, 0x803A, 0x803C, 0x803E, 0x8040, 0x8041, 0x8044, + 0x8045, 0x8047, 0x8048, 0x8049, 0x804E, 0x804F, 0x8050, 0x8051, 0x8053, + 0x8055, 0x8057, 0x8059, 0x805B, 0x805C, 0x805D, 0x805F, 0x8060, 0x8061, + 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806B, 0x806C, + 0x806D, 0x806E, 0x8074, 0x8078, 0x807A, 0x807B, 0x807C, 0x8081, 0x8082, + 0x8088, 0x808A, 0x808D, 0x808E, 0x808F, 0x8090, 0x8091, 0x8092, 0x8094, + 0x8095, 0x8097, 0x8099, 0x809E, 0x80A3, 0x80A6, 0x80A7, 0x80A8, 0x80AC, + 0x80B0, 0x80B3, 0x80B5, 0x80B6, 0x80B8, 0x80B9, 0x80BB, 0x80C5, 0x80C7, + 0x80C8, 0x80C9, 0x80CA, 0x80CB, 0x80CF, 0x80D0, 0x80D1, 0x80D2, 0x80D3, + 0x80D4, 0x80D5, 0x80D8, 0x80DF, 0x80E0, 0x80E2, 0x80E3, 0x80E6, 0x80EE, + 0x80F5, 0x80F7, 0x80F9, 0x80FB, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8103, + 0x8104, 0x8107, 0x8108, 0x810B, 0x810C, 0x8115, 0x8117, 0x8119, 0x811C, + 0x811D, 0x811F, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, + 0x8127, 0x8128, 0x8129, 0x812A, 0x812B, 0x812D, 0x812E, 0x8130, 0x8133, + 0x8134, 0x8135, 0x8137, 0x813A, 0x813B, 0x813C, 0x813D, 0x813F, 0x8140, + 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147, 0x8149, 0x814D, 0x814F, + 0x8152, 0x8157, 0x8158, 0x815B, 0x815C, 0x815D, 0x815E, 0x815F, 0x8162, + 0x8163, 0x8164, 0x8168, 0x816A, 0x816C, 0x816F, 0x8172, 0x8173, 0x8175, + 0x8176, 0x8177, 0x8181, 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8189, + 0x818B, 0x818C, 0x818D, 0x818E, 0x8190, 0x8192, 0x8193, 0x8194, 0x8195, + 0x8196, 0x8197, 0x8199, 0x819E, 0x819F, 0x81A1, 0x81A2, 0x81A4, 0x81A5, + 0x81A7, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, 0x81B1, 0x81B2, + 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0x81BC, 0x81C4, 0x81C5, + 0x81C7, 0x81C8, 0x81CB, 0x81CE, 0x81D0, 0x81D1, 0x81D2, 0x81D3, 0x81D4, + 0x81D5, 0x81D6, 0x81D7, 0x81D9, 0x81DB, 0x81DC, 0x81DD, 0x81DE, 0x81E1, + 0x81E2, 0x81E4, 0x81E5, 0x81E6, 0x81E9, 0x81EB, 0x81EE, 0x81EF, 0x81F0, + 0x81F1, 0x81F2, 0x81F5, 0x81F6, 0x81F7, 0x81F8, 0x81F9, 0x81FD, 0x81FF, + 0x8203, 0x820B, 0x820E, 0x820F, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, + 0x8218, 0x8219, 0x821A, 0x821D, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227, + 0x8229, 0x822E, 0x8232, 0x823A, 0x823C, 0x823D, 0x823F, 0x8240, 0x8241, + 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824A, 0x824C, 0x824D, 0x824E, + 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x825B, + 0x825C, 0x825D, 0x825E, 0x8260, 0x8261, 0x8262, 0x8263, 0x8265, 0x8267, + 0x8269, 0x826A, 0x826C, 0x826D, 0x8275, 0x8276, 0x8278, 0x827B, 0x827C, + 0x8280, 0x8281, 0x8283, 0x8285, 0x8286, 0x8287, 0x8289, 0x828C, 0x8290, + 0x8293, 0x8294, 0x8295, 0x8296, 0x829A, 0x829B, 0x829E, 0x82A0, 0x82A2, + 0x82A3, 0x82A7, 0x82B2, 0x82B5, 0x82B6, 0x82BA, 0x82BC, 0x82BF, 0x82C0, + 0x82C2, 0x82C3, 0x82C5, 0x82C6, 0x82C9, 0x82D0, 0x82D6, 0x82D9, 0x82DA, + 0x82DD, 0x82E2, 0x82E8, 0x82E9, 0x82EA, 0x82EC, 0x82ED, 0x82EE, 0x82F0, + 0x82F2, 0x82F3, 0x82F5, 0x82F6, 0x82F8, 0x82FA, 0x82FC, 0x82FD, 0x82FE, + 0x82FF, 0x8300, 0x830A, 0x830B, 0x830D, 0x8310, 0x8312, 0x8313, 0x8316, + 0x8318, 0x8319, 0x831D, 0x831E, 0x831F, 0x8320, 0x8321, 0x8322, 0x8323, + 0x8324, 0x8325, 0x8326, 0x8329, 0x832A, 0x832E, 0x8330, 0x8332, 0x8337, + 0x833B, 0x833D, 0x833E, 0x833F, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, + 0x834A, 0x834B, 0x834C, 0x834D, 0x834E, 0x8353, 0x8355, 0x8356, 0x8357, + 0x8358, 0x8359, 0x835D, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, + 0x8375, 0x8376, 0x8379, 0x837A, 0x837E, 0x837F, 0x8380, 0x8381, 0x8382, + 0x8383, 0x8384, 0x8387, 0x8388, 0x838B, 0x838C, 0x838D, 0x838F, 0x8390, + 0x8391, 0x8394, 0x8395, 0x8397, 0x8399, 0x839A, 0x839D, 0x839F, 0x83A1, + 0x83A3, 0x83A4, 0x83A5, 0x83A6, 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B5, + 0x83BB, 0x83BE, 0x83BF, 0x83C2, 0x83C3, 0x83C4, 0x83C6, 0x83C8, 0x83C9, + 0x83CB, 0x83CD, 0x83CE, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D5, 0x83D7, + 0x83D9, 0x83DA, 0x83DB, 0x83DE, 0x83E2, 0x83E3, 0x83E4, 0x83E6, 0x83E7, + 0x83E8, 0x83EB, 0x83EC, 0x83ED, 0x83EE, 0x83F3, 0x83F4, 0x83F5, 0x83F6, + 0x83F7, 0x83FA, 0x83FB, 0x83FC, 0x83FE, 0x83FF, 0x8400, 0x8402, 0x8405, + 0x8408, 0x8409, 0x8410, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, + 0x8419, 0x841A, 0x841B, 0x841E, 0x841F, 0x8420, 0x8421, 0x8422, 0x8423, + 0x8429, 0x842A, 0x842B, 0x842D, 0x842E, 0x842F, 0x8430, 0x8432, 0x8433, + 0x8434, 0x8436, 0x8437, 0x8439, 0x843A, 0x843B, 0x843E, 0x843F, 0x8440, + 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x844A, 0x844B, + 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, 0x8453, 0x8454, 0x8455, 0x8456, + 0x8458, 0x845D, 0x845E, 0x845F, 0x8460, 0x8462, 0x8465, 0x8467, 0x8468, + 0x846A, 0x846E, 0x8470, 0x8472, 0x8474, 0x8479, 0x847B, 0x847C, 0x847D, + 0x847E, 0x847F, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485, 0x8486, 0x848A, + 0x848D, 0x848F, 0x8490, 0x8491, 0x8492, 0x8495, 0x8496, 0x8498, 0x849A, + 0x849B, 0x849D, 0x849E, 0x849F, 0x84A0, 0x84A2, 0x84A3, 0x84A4, 0x84A5, + 0x84A6, 0x84A7, 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, + 0x84B0, 0x84B1, 0x84B3, 0x84B5, 0x84B6, 0x84B7, 0x84BB, 0x84BE, 0x84C2, + 0x84C3, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84CC, 0x84CE, 0x84CF, 0x84D2, + 0x84D4, 0x84D5, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0x84DB, 0x84DC, 0x84DE, + 0x84E1, 0x84E2, 0x84E4, 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x84EB, 0x84ED, + 0x84F1, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7, 0x84F8, 0x84F9, + 0x84FA, 0x84FB, 0x84FE, 0x8500, 0x8501, 0x8502, 0x8503, 0x8504, 0x8505, + 0x8506, 0x8507, 0x8508, 0x8509, 0x850A, 0x850B, 0x850D, 0x850E, 0x850F, + 0x8510, 0x8512, 0x8515, 0x8516, 0x8518, 0x8519, 0x851B, 0x851C, 0x851D, + 0x8520, 0x8522, 0x8524, 0x8525, 0x8527, 0x8528, 0x8529, 0x852A, 0x852E, + 0x852F, 0x8530, 0x8531, 0x8532, 0x8533, 0x8534, 0x8535, 0x8536, 0x853E, + 0x853F, 0x8540, 0x8542, 0x8544, 0x8545, 0x8547, 0x854B, 0x854C, 0x854D, + 0x854F, 0x8550, 0x8551, 0x8554, 0x8557, 0x855A, 0x855B, 0x855C, 0x855D, + 0x855F, 0x8560, 0x8561, 0x8563, 0x8565, 0x8566, 0x8567, 0x856B, 0x856C, + 0x856E, 0x856F, 0x8570, 0x8571, 0x8573, 0x8575, 0x8576, 0x8578, 0x857C, + 0x857D, 0x857F, 0x8580, 0x8581, 0x8582, 0x8583, 0x8586, 0x8589, 0x858B, + 0x858D, 0x858E, 0x8590, 0x8592, 0x8593, 0x8595, 0x8596, 0x8597, 0x8598, + 0x8599, 0x859A, 0x859D, 0x859E, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A5, + 0x85A7, 0x85AB, 0x85AC, 0x85AD, 0x85B1, 0x85B2, 0x85B3, 0x85B4, 0x85B5, + 0x85B6, 0x85B8, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0, 0x85C2, + 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85CA, 0x85CB, 0x85CC, + 0x85D1, 0x85D2, 0x85D4, 0x85D6, 0x85D7, 0x85D8, 0x85D9, 0x85DA, 0x85DB, + 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E6, 0x85E7, 0x85E8, + 0x85EB, 0x85EC, 0x85ED, 0x85EE, 0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, + 0x85F5, 0x85F7, 0x85F8, 0x85FC, 0x85FD, 0x85FE, 0x8600, 0x8601, 0x8602, + 0x8603, 0x8608, 0x8609, 0x860A, 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, + 0x8612, 0x8613, 0x8614, 0x8615, 0x8617, 0x8618, 0x8619, 0x861B, 0x861C, + 0x861D, 0x861F, 0x8620, 0x8621, 0x8623, 0x8624, 0x8625, 0x8626, 0x8628, + 0x862A, 0x862B, 0x862C, 0x862E, 0x862F, 0x8630, 0x8631, 0x8632, 0x8633, + 0x8634, 0x8635, 0x8636, 0x8637, 0x8639, 0x863B, 0x863D, 0x863E, 0x8640, + 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, + 0x864A, 0x864B, 0x864C, 0x8652, 0x8653, 0x8656, 0x8657, 0x8658, 0x8659, + 0x865B, 0x865D, 0x8660, 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8668, + 0x8669, 0x866A, 0x866D, 0x866F, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, + 0x8676, 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, + 0x8689, 0x868E, 0x868F, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696, 0x8697, + 0x8698, 0x8699, 0x869A, 0x869B, 0x869E, 0x869F, 0x86A0, 0x86A1, 0x86A2, + 0x86A5, 0x86A6, 0x86AB, 0x86AD, 0x86AE, 0x86B2, 0x86B3, 0x86B7, 0x86B8, + 0x86B9, 0x86BB, 0x86BC, 0x86BD, 0x86BE, 0x86BF, 0x86C1, 0x86C2, 0x86C3, + 0x86C5, 0x86C8, 0x86CC, 0x86CD, 0x86D2, 0x86D3, 0x86D5, 0x86D6, 0x86D7, + 0x86DA, 0x86DC, 0x86DD, 0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E5, 0x86E6, + 0x86E7, 0x86E8, 0x86EA, 0x86EB, 0x86EC, 0x86EF, 0x86F5, 0x86F6, 0x86F7, + 0x86FB, 0x86FC, 0x86FD, 0x86FF, 0x8701, 0x8704, 0x8705, 0x870B, 0x870C, + 0x870E, 0x870F, 0x8710, 0x8711, 0x8714, 0x8716, 0x8719, 0x871B, 0x871D, + 0x871F, 0x8720, 0x8724, 0x8726, 0x8727, 0x8728, 0x872A, 0x872B, 0x872C, + 0x872D, 0x872F, 0x8730, 0x8732, 0x8733, 0x8735, 0x8736, 0x8738, 0x8739, + 0x873A, 0x873C, 0x873D, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, + 0x8746, 0x874A, 0x874B, 0x874D, 0x874F, 0x8750, 0x8751, 0x8752, 0x8754, + 0x8756, 0x8758, 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8761, + 0x8762, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, 0x876F, + 0x8771, 0x8772, 0x8773, 0x8775, 0x8777, 0x8779, 0x877A, 0x877F, 0x8780, + 0x8781, 0x8786, 0x8787, 0x8789, 0x878A, 0x878C, 0x878E, 0x878F, 0x8790, + 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799, 0x879A, 0x879B, + 0x879C, 0x879D, 0x87A0, 0x87A1, 0x87A3, 0x87A4, 0x87A5, 0x87A6, 0x87A7, + 0x87A9, 0x87AA, 0x87AE, 0x87B0, 0x87B1, 0x87B2, 0x87B4, 0x87B6, 0x87B7, + 0x87B8, 0x87B9, 0x87BC, 0x87BE, 0x87BF, 0x87C1, 0x87C2, 0x87C3, 0x87C5, + 0x87C7, 0x87C9, 0x87CC, 0x87CD, 0x87CF, 0x87D0, 0x87D4, 0x87D5, 0x87D6, + 0x87D7, 0x87D8, 0x87D9, 0x87DA, 0x87DC, 0x87DD, 0x87DE, 0x87DF, 0x87E1, + 0x87E2, 0x87E4, 0x87E6, 0x87E7, 0x87E8, 0x87E9, 0x87EB, 0x87ED, 0x87F0, + 0x87F1, 0x87F3, 0x87F4, 0x87F5, 0x87F7, 0x87F8, 0x87FA, 0x87FC, 0x87FD, + 0x87FF, 0x8800, 0x8801, 0x8802, 0x8804, 0x8807, 0x8808, 0x8809, 0x880B, + 0x880C, 0x880D, 0x880E, 0x880F, 0x8812, 0x8814, 0x8817, 0x8818, 0x8819, + 0x881A, 0x881C, 0x881D, 0x881E, 0x8820, 0x8824, 0x8825, 0x8826, 0x8827, + 0x8828, 0x8829, 0x882A, 0x882B, 0x882C, 0x882D, 0x882E, 0x882F, 0x8830, + 0x8833, 0x8834, 0x8835, 0x8837, 0x8838, 0x883A, 0x883D, 0x883E, 0x883F, + 0x8841, 0x8842, 0x8843, 0x8847, 0x8848, 0x8849, 0x884B, 0x884E, 0x884F, + 0x8850, 0x8851, 0x8852, 0x8855, 0x8856, 0x8858, 0x885A, 0x885C, 0x885E, + 0x885F, 0x8860, 0x8866, 0x8867, 0x886A, 0x886D, 0x886F, 0x8871, 0x8873, + 0x8874, 0x8875, 0x8876, 0x8878, 0x887A, 0x887B, 0x887C, 0x8880, 0x8883, + 0x8886, 0x8887, 0x8889, 0x888A, 0x888C, 0x888E, 0x888F, 0x8890, 0x8891, + 0x8893, 0x8894, 0x8895, 0x8897, 0x8898, 0x8899, 0x889A, 0x889B, 0x889D, + 0x889E, 0x889F, 0x88A0, 0x88A1, 0x88A3, 0x88A5, 0x88A6, 0x88A7, 0x88A8, + 0x88A9, 0x88AA, 0x88AC, 0x88AE, 0x88AF, 0x88B0, 0x88B2, 0x88B3, 0x88B4, + 0x88B5, 0x88B6, 0x88B8, 0x88B9, 0x88BA, 0x88BB, 0x88BD, 0x88BE, 0x88BF, + 0x88C0, 0x88C3, 0x88C4, 0x88C7, 0x88C8, 0x88CB, 0x88CC, 0x88CD, 0x88D0, + 0x88D1, 0x88D3, 0x88D6, 0x88D7, 0x88DA, 0x88DB, 0x88DE, 0x88E0, 0x88E1, + 0x88E6, 0x88E7, 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED, 0x88EE, 0x88EF, + 0x88F2, 0x88F5, 0x88F6, 0x88F7, 0x88FA, 0x88FB, 0x88FF, 0x8900, 0x8901, + 0x8903, 0x8904, 0x8905, 0x8906, 0x8908, 0x8909, 0x890B, 0x890C, 0x890D, + 0x890E, 0x890F, 0x8911, 0x8914, 0x8915, 0x8916, 0x8917, 0x8918, 0x891C, + 0x891D, 0x891E, 0x891F, 0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, + 0x8928, 0x8929, 0x892C, 0x892D, 0x892E, 0x892F, 0x8931, 0x8935, 0x8937, + 0x8939, 0x893A, 0x893C, 0x893D, 0x893E, 0x893F, 0x8940, 0x8942, 0x8943, + 0x8945, 0x8946, 0x8948, 0x8949, 0x894A, 0x894B, 0x894C, 0x894D, 0x894E, + 0x894F, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955, 0x8957, 0x8958, + 0x8959, 0x895A, 0x895B, 0x895C, 0x8961, 0x8962, 0x8963, 0x8965, 0x8967, + 0x8968, 0x8969, 0x896B, 0x896D, 0x896E, 0x8970, 0x8971, 0x8973, 0x8974, + 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897A, 0x897C, 0x897D, 0x897E, + 0x8980, 0x8982, 0x8984, 0x8985, 0x8987, 0x8988, 0x8989, 0x898A, 0x898C, + 0x898D, 0x898E, 0x8990, 0x8991, 0x8992, 0x8994, 0x8995, 0x8997, 0x8999, + 0x899A, 0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, 0x89A2, 0x89A3, + 0x89A4, 0x89A5, 0x89A7, 0x89A8, 0x89A9, 0x89AB, 0x89AD, 0x89AE, 0x89B0, + 0x89B1, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B8, 0x89B9, 0x89BB, 0x89BC, + 0x89BE, 0x89C3, 0x89CD, 0x89D3, 0x89D4, 0x89D5, 0x89D7, 0x89D8, 0x89D9, + 0x89DB, 0x89DD, 0x89DF, 0x89E0, 0x89E1, 0x89E2, 0x89E4, 0x89E7, 0x89E8, + 0x89E9, 0x89EA, 0x89EC, 0x89ED, 0x89EE, 0x89F0, 0x89F1, 0x89F2, 0x89F5, + 0x89F7, 0x89F9, 0x89FA, 0x89FB, 0x89FC, 0x89FD, 0x89FE, 0x89FF, 0x8A04, + 0x8A05, 0x8A06, 0x8A09, 0x8A0B, 0x8A0D, 0x8A0F, 0x8A11, 0x8A12, 0x8A14, + 0x8A17, 0x8A19, 0x8A1A, 0x8A1C, 0x8A1E, 0x8A20, 0x8A21, 0x8A22, 0x8A24, + 0x8A26, 0x8A27, 0x8A28, 0x8A29, 0x8A2B, 0x8A2C, 0x8A2E, 0x8A2F, 0x8A30, + 0x8A32, 0x8A33, 0x8A35, 0x8A37, 0x8A38, 0x8A39, 0x8A3B, 0x8A3C, 0x8A3D, + 0x8A3F, 0x8A40, 0x8A42, 0x8A43, 0x8A44, 0x8A45, 0x8A47, 0x8A49, 0x8A4A, + 0x8A4B, 0x8A4C, 0x8A4D, 0x8A4F, 0x8A51, 0x8A53, 0x8A56, 0x8A57, 0x8A59, + 0x8A5A, 0x8A5C, 0x8A5D, 0x8A5F, 0x8A60, 0x8A64, 0x8A65, 0x8A67, 0x8A68, + 0x8A6A, 0x8A6F, 0x8A74, 0x8A76, 0x8A77, 0x8A78, 0x8A7A, 0x8A7B, 0x8A7D, + 0x8A7E, 0x8A80, 0x8A81, 0x8A82, 0x8A83, 0x8A88, 0x8A8B, 0x8A8C, 0x8A8E, + 0x8A8F, 0x8A90, 0x8A94, 0x8A96, 0x8A97, 0x8A99, 0x8A9B, 0x8A9C, 0x8A9D, + 0x8A9F, 0x8AA2, 0x8AA7, 0x8AA9, 0x8AAA, 0x8AAB, 0x8AAD, 0x8AAE, 0x8AAF, + 0x8AB1, 0x8AB3, 0x8AB4, 0x8AB5, 0x8AB7, 0x8AB8, 0x8ABA, 0x8ABB, 0x8ABD, + 0x8ABE, 0x8AC0, 0x8AC1, 0x8AC3, 0x8AC5, 0x8AC6, 0x8AC8, 0x8ACA, 0x8ACC, + 0x8ACE, 0x8AD0, 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD8, 0x8AD9, 0x8ADA, 0x8ADD, + 0x8ADF, 0x8AE0, 0x8AE1, 0x8AE3, 0x8AE5, 0x8AE8, 0x8AE9, 0x8AEA, 0x8AEC, + 0x8AEF, 0x8AF0, 0x8AF2, 0x8AF4, 0x8AF5, 0x8AF9, 0x8AFB, 0x8AFD, 0x8AFF, + 0x8B03, 0x8B06, 0x8B08, 0x8B09, 0x8B0B, 0x8B0C, 0x8B0D, 0x8B0F, 0x8B11, + 0x8B12, 0x8B13, 0x8B15, 0x8B18, 0x8B1C, 0x8B1E, 0x8B1F, 0x8B20, 0x8B22, + 0x8B23, 0x8B24, 0x8B25, 0x8B27, 0x8B29, 0x8B2A, 0x8B2E, 0x8B2F, 0x8B30, + 0x8B31, 0x8B32, 0x8B34, 0x8B35, 0x8B36, 0x8B37, 0x8B38, 0x8B3A, 0x8B3B, + 0x8B3C, 0x8B3D, 0x8B3F, 0x8B40, 0x8B41, 0x8B42, 0x8B43, 0x8B44, 0x8B45, + 0x8B46, 0x8B47, 0x8B48, 0x8B4A, 0x8B4B, 0x8B4C, 0x8B4D, 0x8B50, 0x8B51, + 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0x8B57, 0x8B5B, 0x8B5D, 0x8B5E, 0x8B5F, + 0x8B60, 0x8B61, 0x8B62, 0x8B63, 0x8B64, 0x8B65, 0x8B67, 0x8B68, 0x8B69, + 0x8B6A, 0x8B6D, 0x8B6E, 0x8B71, 0x8B72, 0x8B73, 0x8B75, 0x8B76, 0x8B78, + 0x8B79, 0x8B7A, 0x8B7B, 0x8B7C, 0x8B7E, 0x8B7F, 0x8B81, 0x8B82, 0x8B83, + 0x8B84, 0x8B85, 0x8B86, 0x8B87, 0x8B88, 0x8B89, 0x8B8B, 0x8B8C, 0x8B8D, + 0x8B8F, 0x8B90, 0x8B91, 0x8B94, 0x8B97, 0x8B98, 0x8B99, 0x8B9A, 0x8B9B, + 0x8B9D, 0x8B9F, 0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7, 0x8BD0, 0x8BEA, 0x8C09, + 0x8C1E, 0x8C38, 0x8C39, 0x8C3A, 0x8C3B, 0x8C3C, 0x8C3D, 0x8C3E, 0x8C3F, + 0x8C40, 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C4A, 0x8C4B, 0x8C4D, 0x8C4E, + 0x8C4F, 0x8C51, 0x8C52, 0x8C53, 0x8C54, 0x8C56, 0x8C57, 0x8C58, 0x8C59, + 0x8C5B, 0x8C5C, 0x8C5D, 0x8C5E, 0x8C5F, 0x8C60, 0x8C63, 0x8C64, 0x8C65, + 0x8C66, 0x8C67, 0x8C68, 0x8C69, 0x8C6C, 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70, + 0x8C71, 0x8C72, 0x8C74, 0x8C75, 0x8C76, 0x8C77, 0x8C7B, 0x8C7C, 0x8C7D, + 0x8C7E, 0x8C7F, 0x8C80, 0x8C81, 0x8C83, 0x8C84, 0x8C86, 0x8C87, 0x8C88, + 0x8C8B, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91, 0x8C92, 0x8C93, 0x8C95, + 0x8C96, 0x8C97, 0x8C99, 0x8C9A, 0x8C9B, 0x8C9C, 0x8C9F, 0x8CA3, 0x8CA4, + 0x8CA5, 0x8CA6, 0x8CAD, 0x8CAE, 0x8CB1, 0x8CB5, 0x8CB9, 0x8CBE, 0x8CC6, + 0x8CC9, 0x8CCB, 0x8CCC, 0x8CCD, 0x8CCE, 0x8CCF, 0x8CD0, 0x8CD4, 0x8CD6, + 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDB, 0x8CDD, 0x8CDF, 0x8CE5, 0x8CE8, 0x8CE9, + 0x8CEE, 0x8CEF, 0x8CF0, 0x8CF1, 0x8CF2, 0x8CF3, 0x8CF5, 0x8CF6, 0x8CF7, + 0x8CF8, 0x8CF9, 0x8CFF, 0x8D00, 0x8D01, 0x8D02, 0x8D03, 0x8D06, 0x8D07, + 0x8D09, 0x8D0C, 0x8D0E, 0x8D11, 0x8D12, 0x8D13, 0x8D14, 0x8D15, 0x8D17, + 0x8D18, 0x8D19, 0x8D1A, 0x8D20, 0x8D51, 0x8D52, 0x8D57, 0x8D5F, 0x8D65, + 0x8D68, 0x8D69, 0x8D6A, 0x8D6C, 0x8D6E, 0x8D6F, 0x8D71, 0x8D72, 0x8D78, + 0x8D79, 0x8D7A, 0x8D7B, 0x8D7C, 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D82, + 0x8D83, 0x8D86, 0x8D87, 0x8D88, 0x8D89, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, + 0x8D90, 0x8D92, 0x8D93, 0x8D96, 0x8D97, 0x8D98, 0x8D9A, 0x8D9B, 0x8D9C, + 0x8D9D, 0x8D9E, 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA4, 0x8DA5, 0x8DA6, 0x8DA7, + 0x8DA9, 0x8DAA, 0x8DAB, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x8DB6, + 0x8DB7, 0x8DB9, 0x8DBB, 0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2, 0x8DC5, 0x8DC7, + 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2, 0x8DD3, 0x8DD4, 0x8DD5, + 0x8DD8, 0x8DD9, 0x8DDC, 0x8DE0, 0x8DE1, 0x8DE2, 0x8DE5, 0x8DE6, 0x8DE7, + 0x8DE9, 0x8DED, 0x8DEE, 0x8DF0, 0x8DF1, 0x8DF2, 0x8DF4, 0x8DF6, 0x8DFC, + 0x8DFE, 0x8DFF, 0x8E00, 0x8E01, 0x8E02, 0x8E03, 0x8E04, 0x8E06, 0x8E07, + 0x8E08, 0x8E0B, 0x8E0D, 0x8E0E, 0x8E11, 0x8E12, 0x8E13, 0x8E15, 0x8E16, + 0x8E17, 0x8E18, 0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, 0x8E20, 0x8E21, 0x8E24, + 0x8E25, 0x8E26, 0x8E27, 0x8E28, 0x8E2B, 0x8E2D, 0x8E30, 0x8E32, 0x8E33, + 0x8E36, 0x8E37, 0x8E38, 0x8E3B, 0x8E3C, 0x8E3E, 0x8E3F, 0x8E43, 0x8E45, + 0x8E46, 0x8E4D, 0x8E4E, 0x8E4F, 0x8E50, 0x8E53, 0x8E54, 0x8E56, 0x8E57, + 0x8E58, 0x8E5A, 0x8E5B, 0x8E5C, 0x8E5D, 0x8E5E, 0x8E5F, 0x8E60, 0x8E61, + 0x8E62, 0x8E64, 0x8E65, 0x8E67, 0x8E68, 0x8E6A, 0x8E6B, 0x8E6E, 0x8E71, + 0x8E73, 0x8E75, 0x8E77, 0x8E78, 0x8E79, 0x8E7B, 0x8E7D, 0x8E7E, 0x8E80, + 0x8E82, 0x8E83, 0x8E84, 0x8E86, 0x8E88, 0x8E8C, 0x8E8E, 0x8E95, 0x8E96, + 0x8E97, 0x8E98, 0x8E99, 0x8E9B, 0x8E9D, 0x8E9F, 0x8EA0, 0x8EA2, 0x8EA3, + 0x8EA4, 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAD, 0x8EAE, 0x8EB0, 0x8EB1, 0x8EB3, + 0x8EB4, 0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBB, 0x8EBC, 0x8EBD, + 0x8EBE, 0x8EBF, 0x8EC1, 0x8EC2, 0x8EC3, 0x8EC4, 0x8EC5, 0x8EC6, 0x8EC7, + 0x8EC8, 0x8EC9, 0x8ECF, 0x8ED0, 0x8ED1, 0x8ED3, 0x8ED5, 0x8ED6, 0x8ED7, + 0x8ED8, 0x8ED9, 0x8EDA, 0x8EDC, 0x8EDD, 0x8EDE, 0x8EE0, 0x8EE1, 0x8EE2, + 0x8EE3, 0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEC, 0x8EED, + 0x8EEE, 0x8EEF, 0x8EF0, 0x8EF1, 0x8EF3, 0x8EF4, 0x8EF5, 0x8EF6, 0x8EF7, + 0x8EFD, 0x8EFF, 0x8F00, 0x8F01, 0x8F02, 0x8F04, 0x8F06, 0x8F08, 0x8F0B, + 0x8F0C, 0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, 0x8F11, 0x8F13, 0x8F16, 0x8F17, + 0x8F18, 0x8F19, 0x8F1A, 0x8F20, 0x8F21, 0x8F22, 0x8F23, 0x8F24, 0x8F27, + 0x8F28, 0x8F2B, 0x8F2C, 0x8F2D, 0x8F2E, 0x8F30, 0x8F31, 0x8F32, 0x8F34, + 0x8F35, 0x8F36, 0x8F37, 0x8F39, 0x8F3A, 0x8F3C, 0x8F3D, 0x8F40, 0x8F41, + 0x8F43, 0x8F47, 0x8F48, 0x8F4A, 0x8F4B, 0x8F4C, 0x8F4F, 0x8F50, 0x8F51, + 0x8F52, 0x8F53, 0x8F55, 0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A, 0x8F5B, + 0x8F5C, 0x8F5D, 0x8F5E, 0x8F60, 0x8F63, 0x8F65, 0x8F6A, 0x8F80, 0x8F8C, + 0x8F92, 0x8F9D, 0x8FA0, 0x8FA1, 0x8FA2, 0x8FA4, 0x8FA5, 0x8FA7, 0x8FAA, + 0x8FAC, 0x8FB3, 0x8FB4, 0x8FB5, 0x8FB7, 0x8FB8, 0x8FBA, 0x8FBB, 0x8FBC, + 0x8FBF, 0x8FC0, 0x8FC3, 0x8FC6, 0x8FC9, 0x8FCA, 0x8FCB, 0x8FCC, 0x8FCD, + 0x8FCF, 0x8FD2, 0x8FD6, 0x8FD7, 0x8FDA, 0x8FE0, 0x8FE1, 0x8FE3, 0x8FE7, + 0x8FEC, 0x8FEF, 0x8FF1, 0x8FF2, 0x8FF5, 0x8FF6, 0x8FFA, 0x8FFB, 0x8FFC, + 0x8FFE, 0x8FFF, 0x9007, 0x9008, 0x900C, 0x900E, 0x9013, 0x9018, 0x901C, + 0x9024, 0x9025, 0x9027, 0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x9030, + 0x9031, 0x9033, 0x9034, 0x9037, 0x9039, 0x903A, 0x903D, 0x903F, 0x9040, + 0x9043, 0x9045, 0x9046, 0x9048, 0x9049, 0x904A, 0x904C, 0x9056, 0x9059, + 0x905A, 0x905D, 0x905F, 0x9061, 0x9064, 0x9066, 0x9067, 0x906A, 0x906B, + 0x906C, 0x906F, 0x9070, 0x9071, 0x9073, 0x9076, 0x9079, 0x907B, 0x907E, + 0x9085, 0x9086, 0x9089, 0x908C, 0x908D, 0x908E, 0x9092, 0x9094, 0x9096, + 0x9098, 0x909A, 0x909C, 0x909E, 0x909F, 0x90A0, 0x90A4, 0x90A5, 0x90A7, + 0x90A8, 0x90A9, 0x90AB, 0x90AD, 0x90B2, 0x90B7, 0x90BC, 0x90BD, 0x90BF, + 0x90C0, 0x90C2, 0x90C3, 0x90C6, 0x90C8, 0x90C9, 0x90CB, 0x90CC, 0x90CD, + 0x90D2, 0x90D4, 0x90D5, 0x90D6, 0x90D8, 0x90D9, 0x90DA, 0x90DE, 0x90E0, + 0x90E3, 0x90E4, 0x90E5, 0x90E9, 0x90EA, 0x90EC, 0x90EE, 0x90F0, 0x90F1, + 0x90F2, 0x90F3, 0x90F6, 0x90F7, 0x90F9, 0x90FA, 0x90FB, 0x90FC, 0x90FF, + 0x9100, 0x9101, 0x9103, 0x9105, 0x9107, 0x9108, 0x910A, 0x910B, 0x910C, + 0x910D, 0x910E, 0x910F, 0x9110, 0x9111, 0x9113, 0x9115, 0x9117, 0x9118, + 0x911A, 0x911B, 0x911C, 0x911D, 0x911F, 0x9120, 0x9121, 0x9124, 0x9125, + 0x9126, 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912E, 0x9133, 0x9135, + 0x9137, 0x9138, 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, + 0x9142, 0x9144, 0x9145, 0x9147, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, + 0x9158, 0x9159, 0x915B, 0x915C, 0x915F, 0x9160, 0x9166, 0x9167, 0x9168, + 0x916B, 0x916D, 0x9173, 0x917A, 0x917B, 0x917C, 0x9180, 0x9181, 0x9182, + 0x9183, 0x9184, 0x9186, 0x9188, 0x918A, 0x918E, 0x918F, 0x9193, 0x9194, + 0x9195, 0x9197, 0x9198, 0x9199, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, + 0x91A4, 0x91A5, 0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91B0, 0x91B1, 0x91B2, + 0x91B3, 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BB, 0x91BC, 0x91BD, 0x91BE, + 0x91BF, 0x91C2, 0x91C4, 0x91C6, 0x91C8, 0x91D0, 0x91D6, 0x91DA, 0x91DB, + 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E5, 0x91E6, 0x91E8, 0x91EA, + 0x91EB, 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3, + 0x91F4, 0x91F6, 0x91F8, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF, 0x9202, + 0x9203, 0x9205, 0x9206, 0x9207, 0x920A, 0x920B, 0x920C, 0x920F, 0x9212, + 0x9213, 0x9216, 0x9217, 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, + 0x921F, 0x9220, 0x9221, 0x9222, 0x9224, 0x9228, 0x9229, 0x922A, 0x922B, + 0x922C, 0x922D, 0x922F, 0x9231, 0x9232, 0x9235, 0x9236, 0x923B, 0x923C, + 0x9241, 0x9242, 0x9243, 0x9244, 0x9246, 0x9247, 0x924A, 0x924B, 0x924C, + 0x924E, 0x924F, 0x9250, 0x9252, 0x9253, 0x9254, 0x9256, 0x9258, 0x9259, + 0x925C, 0x925D, 0x925F, 0x9260, 0x9261, 0x9263, 0x9264, 0x9265, 0x9267, + 0x9268, 0x9269, 0x926A, 0x926B, 0x926E, 0x926F, 0x9270, 0x9271, 0x9272, + 0x9273, 0x9275, 0x9276, 0x9277, 0x9279, 0x927C, 0x927D, 0x927E, 0x9281, + 0x9282, 0x9284, 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, + 0x928D, 0x928F, 0x9290, 0x9292, 0x9294, 0x9295, 0x9297, 0x9299, 0x929B, + 0x929D, 0x929E, 0x929F, 0x92A1, 0x92A2, 0x92A4, 0x92A7, 0x92AD, 0x92AF, + 0x92B0, 0x92B2, 0x92B3, 0x92B4, 0x92B5, 0x92B6, 0x92B8, 0x92BA, 0x92BD, + 0x92BE, 0x92BF, 0x92C0, 0x92C2, 0x92C4, 0x92C6, 0x92C9, 0x92CA, 0x92CB, + 0x92CD, 0x92CE, 0x92D0, 0x92D1, 0x92D3, 0x92D4, 0x92D5, 0x92D6, 0x92D7, + 0x92D8, 0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DE, 0x92E0, 0x92E1, 0x92E2, + 0x92E7, 0x92E9, 0x92EB, 0x92EC, 0x92F2, 0x92F3, 0x92F4, 0x92F5, 0x92F7, + 0x92F9, 0x92FA, 0x92FB, 0x92FD, 0x92FE, 0x92FF, 0x9300, 0x9302, 0x9303, + 0x9304, 0x9305, 0x9309, 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, + 0x9311, 0x9313, 0x9314, 0x9316, 0x9317, 0x931C, 0x931D, 0x931E, 0x9321, + 0x9323, 0x9324, 0x9325, 0x9327, 0x9329, 0x932A, 0x932C, 0x932D, 0x9330, + 0x9331, 0x9334, 0x9335, 0x9337, 0x9339, 0x933A, 0x933B, 0x933C, 0x933D, + 0x933F, 0x9342, 0x9344, 0x9345, 0x9348, 0x9349, 0x934A, 0x934C, 0x934E, + 0x934F, 0x9350, 0x9351, 0x9352, 0x9353, 0x9355, 0x9356, 0x9357, 0x9359, + 0x935A, 0x935C, 0x935D, 0x935E, 0x935F, 0x9360, 0x9361, 0x9362, 0x9363, + 0x9366, 0x9367, 0x9368, 0x936B, 0x936D, 0x936E, 0x936F, 0x9371, 0x9372, + 0x9373, 0x9374, 0x9377, 0x9378, 0x9379, 0x937B, 0x937C, 0x937D, 0x937F, + 0x9380, 0x9381, 0x9383, 0x9385, 0x9386, 0x9388, 0x9389, 0x938B, 0x938C, + 0x938D, 0x938E, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9397, + 0x9399, 0x939A, 0x939B, 0x939C, 0x939D, 0x939E, 0x939F, 0x93A0, 0x93A1, + 0x93A4, 0x93A5, 0x93A8, 0x93AB, 0x93AD, 0x93AF, 0x93B1, 0x93B2, 0x93B4, + 0x93B6, 0x93B7, 0x93B9, 0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x93BE, 0x93C0, + 0x93C1, 0x93C2, 0x93C4, 0x93C5, 0x93C6, 0x93C9, 0x93CB, 0x93CE, 0x93CF, + 0x93D0, 0x93D2, 0x93D3, 0x93D4, 0x93D5, 0x93D9, 0x93DA, 0x93DB, 0x93E0, + 0x93E3, 0x93E5, 0x93E6, 0x93E7, 0x93E9, 0x93EA, 0x93EB, 0x93EC, 0x93ED, + 0x93EE, 0x93EF, 0x93F0, 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F6, 0x93F8, + 0x93FA, 0x93FB, 0x93FC, 0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, + 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409, 0x940A, 0x940C, 0x940D, + 0x940E, 0x940F, 0x9411, 0x9415, 0x9416, 0x9417, 0x941A, 0x941B, 0x941C, + 0x941E, 0x941F, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9429, 0x942A, + 0x942B, 0x942C, 0x942D, 0x942F, 0x9430, 0x9431, 0x9434, 0x9436, 0x9437, + 0x9439, 0x943B, 0x943C, 0x943D, 0x9440, 0x9441, 0x9442, 0x9443, 0x9445, + 0x9446, 0x9447, 0x9448, 0x9449, 0x944B, 0x944D, 0x944E, 0x944F, 0x9450, + 0x9451, 0x9453, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945A, 0x945B, + 0x945C, 0x945D, 0x945E, 0x945F, 0x9461, 0x9462, 0x9464, 0x9466, 0x9467, + 0x9468, 0x9469, 0x946A, 0x946C, 0x946E, 0x946F, 0x9471, 0x9473, 0x9474, + 0x9475, 0x9476, 0x9478, 0x947A, 0x947B, 0x9480, 0x9481, 0x9482, 0x9483, + 0x9484, 0x9491, 0x9496, 0x9498, 0x94C7, 0x94CF, 0x94D3, 0x94D4, 0x94DA, + 0x94E6, 0x94FB, 0x951C, 0x9520, 0x9527, 0x9533, 0x953D, 0x9543, 0x9548, + 0x954B, 0x9555, 0x955A, 0x9560, 0x956E, 0x9574, 0x9575, 0x9578, 0x9579, + 0x957A, 0x957B, 0x957C, 0x957D, 0x957E, 0x9581, 0x9584, 0x9585, 0x9587, + 0x9588, 0x958A, 0x958D, 0x9590, 0x9592, 0x9595, 0x9596, 0x9597, 0x9599, + 0x959A, 0x959B, 0x959C, 0x959D, 0x959E, 0x959F, 0x95A0, 0x95A2, 0x95A6, + 0x95A7, 0x95AA, 0x95AE, 0x95AF, 0x95B0, 0x95B1, 0x95B3, 0x95B4, 0x95B5, + 0x95B7, 0x95B8, 0x95BA, 0x95C0, 0x95C1, 0x95C2, 0x95C4, 0x95C5, 0x95C7, + 0x95C9, 0x95CD, 0x95CE, 0x95CF, 0x95D1, 0x95D2, 0x95D3, 0x95D7, 0x95D8, + 0x95D9, 0x95DA, 0x95DB, 0x95DD, 0x95DF, 0x95E0, 0x95E3, 0x95E4, 0x95E6, + 0x95E7, 0x95EC, 0x95FF, 0x9607, 0x9613, 0x9618, 0x961B, 0x961E, 0x9620, + 0x9623, 0x9624, 0x9625, 0x9626, 0x9627, 0x9628, 0x9629, 0x962B, 0x962C, + 0x962D, 0x962F, 0x9630, 0x9637, 0x9638, 0x9639, 0x963A, 0x963E, 0x9641, + 0x9643, 0x964A, 0x964E, 0x964F, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, + 0x9659, 0x965A, 0x965C, 0x965E, 0x9660, 0x9665, 0x9666, 0x966B, 0x966D, + 0x966E, 0x966F, 0x9671, 0x9679, 0x967A, 0x967B, 0x967C, 0x967E, 0x967F, + 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, 0x968C, 0x9691, + 0x9692, 0x9693, 0x9696, 0x969A, 0x969D, 0x969E, 0x969F, 0x96A0, 0x96A1, + 0x96A2, 0x96A3, 0x96A4, 0x96A5, 0x96A6, 0x96A9, 0x96AB, 0x96AC, 0x96AD, + 0x96AE, 0x96AF, 0x96B2, 0x96B5, 0x96B7, 0x96BA, 0x96BF, 0x96C2, 0x96C3, + 0x96C8, 0x96CA, 0x96CB, 0x96D0, 0x96D1, 0x96D3, 0x96D4, 0x96D7, 0x96D8, + 0x96DA, 0x96DD, 0x96DE, 0x96DF, 0x96E1, 0x96E4, 0x96E5, 0x96E6, 0x96E7, + 0x96EB, 0x96EC, 0x96ED, 0x96EE, 0x96F0, 0x96F1, 0x96F4, 0x96F5, 0x96F8, + 0x96FA, 0x96FC, 0x96FD, 0x96FF, 0x9702, 0x9703, 0x9705, 0x970A, 0x970B, + 0x970C, 0x9710, 0x9711, 0x9712, 0x9714, 0x9715, 0x9717, 0x9718, 0x9719, + 0x971A, 0x971B, 0x971D, 0x971F, 0x9720, 0x9721, 0x9722, 0x9723, 0x9724, + 0x9725, 0x9726, 0x9728, 0x9729, 0x972B, 0x972C, 0x972E, 0x972F, 0x9731, + 0x9733, 0x9734, 0x9735, 0x9736, 0x9737, 0x973A, 0x973B, 0x973C, 0x973F, + 0x9740, 0x9741, 0x9743, 0x9745, 0x9746, 0x9747, 0x9749, 0x974A, 0x974B, + 0x974C, 0x974D, 0x974E, 0x974F, 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, + 0x9758, 0x975C, 0x975D, 0x975F, 0x9763, 0x9764, 0x9766, 0x9767, 0x976A, + 0x976B, 0x976C, 0x976D, 0x976E, 0x976F, 0x9770, 0x9771, 0x9772, 0x9775, + 0x9777, 0x9778, 0x9779, 0x977A, 0x977B, 0x977D, 0x977E, 0x977F, 0x9780, + 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, 0x9787, 0x9788, 0x9789, 0x978A, + 0x978C, 0x978E, 0x9790, 0x9793, 0x9795, 0x9796, 0x9797, 0x9799, 0x979A, + 0x979B, 0x979C, 0x979D, 0x979E, 0x979F, 0x97A1, 0x97A2, 0x97A4, 0x97A5, + 0x97A7, 0x97A8, 0x97A9, 0x97AA, 0x97AC, 0x97AE, 0x97B0, 0x97B1, 0x97B3, + 0x97B5, 0x97B6, 0x97B7, 0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC, 0x97BE, + 0x97BF, 0x97C0, 0x97C1, 0x97C2, 0x97C4, 0x97C5, 0x97C7, 0x97C8, 0x97CA, + 0x97CD, 0x97CE, 0x97CF, 0x97D0, 0x97D1, 0x97D2, 0x97D4, 0x97D5, 0x97D6, + 0x97D7, 0x97D8, 0x97DA, 0x97DB, 0x97DD, 0x97DF, 0x97E0, 0x97E1, 0x97E2, + 0x97E3, 0x97E4, 0x97E5, 0x97E8, 0x97EE, 0x97EF, 0x97F0, 0x97F1, 0x97F2, + 0x97F4, 0x97F7, 0x97F8, 0x97F9, 0x97FA, 0x97FB, 0x97FC, 0x97FD, 0x97FE, + 0x9800, 0x9804, 0x9809, 0x980B, 0x980D, 0x9814, 0x9815, 0x9816, 0x9819, + 0x981A, 0x981B, 0x981D, 0x981E, 0x981F, 0x9820, 0x9822, 0x9823, 0x9825, + 0x9827, 0x9828, 0x9829, 0x982A, 0x982B, 0x982C, 0x982E, 0x982F, 0x9831, + 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, 0x9839, 0x983A, 0x983C, 0x983E, + 0x983F, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9847, 0x9848, + 0x9849, 0x984A, 0x984B, 0x984F, 0x9850, 0x9851, 0x9852, 0x9855, 0x9856, + 0x9857, 0x985A, 0x985C, 0x985D, 0x985F, 0x9860, 0x9861, 0x9863, 0x9864, + 0x9866, 0x9868, 0x9869, 0x986A, 0x986D, 0x986E, 0x9872, 0x988B, 0x988E, + 0x9892, 0x9895, 0x9899, 0x98A3, 0x98A9, 0x98AA, 0x98AB, 0x98AC, 0x98AD, + 0x98B0, 0x98B2, 0x98B4, 0x98B5, 0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB, + 0x98BD, 0x98BE, 0x98BF, 0x98C0, 0x98C1, 0x98C2, 0x98C3, 0x98C5, 0x98C7, + 0x98C9, 0x98CA, 0x98CB, 0x98CC, 0x98CD, 0x98CF, 0x98D0, 0x98D4, 0x98D6, + 0x98D7, 0x98DC, 0x98DD, 0x98E1, 0x98E3, 0x98E4, 0x98E5, 0x98E6, 0x98EC, + 0x98EE, 0x98F0, 0x98F1, 0x98F3, 0x98F5, 0x98F6, 0x98F7, 0x98F8, 0x98F9, + 0x98FA, 0x98FB, 0x98FF, 0x9900, 0x9901, 0x9902, 0x9904, 0x9906, 0x9907, + 0x9908, 0x990B, 0x990E, 0x990F, 0x9914, 0x9915, 0x9916, 0x9917, 0x9919, + 0x991A, 0x991C, 0x991D, 0x991F, 0x9920, 0x9922, 0x9923, 0x9924, 0x9925, + 0x9926, 0x9927, 0x9929, 0x992A, 0x992B, 0x992C, 0x992D, 0x992F, 0x9930, + 0x9931, 0x9932, 0x9934, 0x9935, 0x9936, 0x9938, 0x9939, 0x993A, 0x993B, + 0x993D, 0x9940, 0x9941, 0x9942, 0x9944, 0x9946, 0x9947, 0x994D, 0x994E, + 0x994F, 0x9950, 0x9953, 0x9956, 0x9958, 0x9959, 0x995A, 0x995B, 0x995D, + 0x995F, 0x9960, 0x9961, 0x9964, 0x9966, 0x9973, 0x9978, 0x9979, 0x997B, + 0x997E, 0x9982, 0x9983, 0x9989, 0x998C, 0x998E, 0x999A, 0x999B, 0x999C, + 0x999D, 0x999E, 0x999F, 0x99A0, 0x99A1, 0x99A2, 0x99A3, 0x99A4, 0x99A6, + 0x99A7, 0x99A9, 0x99AA, 0x99AB, 0x99AF, 0x99B0, 0x99B2, 0x99B5, 0x99B6, + 0x99B7, 0x99B8, 0x99B9, 0x99BA, 0x99BB, 0x99BC, 0x99BD, 0x99BE, 0x99BF, + 0x99C0, 0x99C2, 0x99C3, 0x99C4, 0x99C5, 0x99C6, 0x99C7, 0x99C8, 0x99C9, + 0x99CA, 0x99CB, 0x99CC, 0x99CD, 0x99CE, 0x99CF, 0x99D3, 0x99D6, 0x99D7, + 0x99DA, 0x99DC, 0x99DE, 0x99E0, 0x99E3, 0x99E4, 0x99E5, 0x99E6, 0x99E7, + 0x99E8, 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99EE, 0x99EF, 0x99F0, 0x99F2, + 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, 0x99F8, 0x99F9, 0x99FA, 0x99FB, + 0x99FC, 0x99FD, 0x99FE, 0x9A00, 0x9A02, 0x9A03, 0x9A04, 0x9A06, 0x9A07, + 0x9A08, 0x9A09, 0x9A0A, 0x9A0B, 0x9A0C, 0x9A10, 0x9A11, 0x9A12, 0x9A13, + 0x9A14, 0x9A15, 0x9A17, 0x9A18, 0x9A1A, 0x9A1B, 0x9A1C, 0x9A1D, 0x9A1E, + 0x9A1F, 0x9A20, 0x9A21, 0x9A22, 0x9A23, 0x9A24, 0x9A25, 0x9A26, 0x9A27, + 0x9A28, 0x9A29, 0x9A2A, 0x9A2C, 0x9A2F, 0x9A31, 0x9A32, 0x9A33, 0x9A34, + 0x9A35, 0x9A39, 0x9A3A, 0x9A3B, 0x9A3C, 0x9A3D, 0x9A3F, 0x9A46, 0x9A47, + 0x9A48, 0x9A49, 0x9A4B, 0x9A4C, 0x9A4E, 0x9A50, 0x9A51, 0x9A52, 0x9A53, + 0x9A54, 0x9A56, 0x9A58, 0x9A59, 0x9A5C, 0x9A5D, 0x9A5E, 0x9A60, 0x9A61, + 0x9A63, 0x9A66, 0x9A67, 0x9A68, 0x9A69, 0x9A6B, 0x9A72, 0x9A83, 0x9A89, + 0x9A8D, 0x9A8E, 0x9A94, 0x9A95, 0x9A99, 0x9AA6, 0x9AA9, 0x9AAA, 0x9AAB, + 0x9AAC, 0x9AAD, 0x9AAE, 0x9AB2, 0x9AB3, 0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, + 0x9ABD, 0x9ABE, 0x9ABF, 0x9AC3, 0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, 0x9AC9, + 0x9ACA, 0x9ACD, 0x9ACE, 0x9AD0, 0x9AD7, 0x9AD9, 0x9ADA, 0x9ADB, 0x9ADC, + 0x9ADD, 0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, 0x9AE4, 0x9AE5, 0x9AE7, 0x9AE8, + 0x9AE9, 0x9AEA, 0x9AEC, 0x9AF0, 0x9AF1, 0x9AF2, 0x9AF3, 0x9AF4, 0x9AF5, + 0x9AF6, 0x9AF7, 0x9AF8, 0x9AFA, 0x9AFC, 0x9AFD, 0x9AFE, 0x9AFF, 0x9B00, + 0x9B01, 0x9B02, 0x9B04, 0x9B05, 0x9B07, 0x9B09, 0x9B0A, 0x9B0B, 0x9B0C, + 0x9B0E, 0x9B10, 0x9B11, 0x9B12, 0x9B14, 0x9B15, 0x9B16, 0x9B17, 0x9B18, + 0x9B19, 0x9B1B, 0x9B1C, 0x9B1D, 0x9B1E, 0x9B20, 0x9B21, 0x9B24, 0x9B26, + 0x9B28, 0x9B2A, 0x9B2B, 0x9B2C, 0x9B2D, 0x9B30, 0x9B33, 0x9B34, 0x9B35, + 0x9B36, 0x9B37, 0x9B38, 0x9B39, 0x9B3A, 0x9B3D, 0x9B3E, 0x9B3F, 0x9B40, + 0x9B46, 0x9B4A, 0x9B4B, 0x9B4C, 0x9B50, 0x9B52, 0x9B53, 0x9B55, 0x9B56, + 0x9B57, 0x9B59, 0x9B5B, 0x9B5C, 0x9B5D, 0x9B5E, 0x9B5F, 0x9B60, 0x9B61, + 0x9B62, 0x9B63, 0x9B64, 0x9B65, 0x9B66, 0x9B67, 0x9B68, 0x9B69, 0x9B6A, + 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B70, 0x9B71, 0x9B72, 0x9B73, 0x9B75, + 0x9B76, 0x9B78, 0x9B79, 0x9B7A, 0x9B7B, 0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, + 0x9B80, 0x9B82, 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, + 0x9B8B, 0x9B8C, 0x9B8D, 0x9B8F, 0x9B93, 0x9B94, 0x9B95, 0x9B96, 0x9B97, + 0x9B98, 0x9B99, 0x9B9B, 0x9B9C, 0x9B9F, 0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3, + 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0x9BA8, 0x9BA9, 0x9BAC, 0x9BAF, 0x9BB0, + 0x9BB1, 0x9BB2, 0x9BB3, 0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, 0x9BB8, 0x9BB9, + 0x9BBA, 0x9BBB, 0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, 0x9BC2, 0x9BC3, 0x9BC4, + 0x9BC5, 0x9BC6, 0x9BC8, 0x9BCB, 0x9BCC, 0x9BCD, 0x9BCE, 0x9BCF, 0x9BD0, + 0x9BD1, 0x9BD2, 0x9BD3, 0x9BD5, 0x9BD7, 0x9BD8, 0x9BD9, 0x9BDA, 0x9BDC, + 0x9BDE, 0x9BDF, 0x9BE0, 0x9BE3, 0x9BE5, 0x9BE6, 0x9BE9, 0x9BEC, 0x9BED, + 0x9BEE, 0x9BEF, 0x9BF1, 0x9BF2, 0x9BF3, 0x9BF5, 0x9BF6, 0x9BF7, 0x9BF8, + 0x9BF9, 0x9BFA, 0x9BFB, 0x9BFC, 0x9BFE, 0x9C00, 0x9C01, 0x9C02, 0x9C03, + 0x9C04, 0x9C05, 0x9C06, 0x9C07, 0x9C0A, 0x9C0B, 0x9C0C, 0x9C0E, 0x9C0F, + 0x9C11, 0x9C14, 0x9C15, 0x9C16, 0x9C17, 0x9C18, 0x9C19, 0x9C1A, 0x9C1B, + 0x9C1C, 0x9C1D, 0x9C1E, 0x9C1F, 0x9C21, 0x9C22, 0x9C24, 0x9C26, 0x9C27, + 0x9C2A, 0x9C2B, 0x9C2C, 0x9C2E, 0x9C2F, 0x9C30, 0x9C34, 0x9C36, 0x9C38, + 0x9C3A, 0x9C3C, 0x9C3D, 0x9C3F, 0x9C40, 0x9C41, 0x9C42, 0x9C43, 0x9C44, + 0x9C46, 0x9C47, 0x9C4A, 0x9C4B, 0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, 0x9C50, + 0x9C51, 0x9C53, 0x9C55, 0x9C59, 0x9C5A, 0x9C5B, 0x9C5C, 0x9C5E, 0x9C60, + 0x9C61, 0x9C62, 0x9C63, 0x9C64, 0x9C65, 0x9C66, 0x9C68, 0x9C69, 0x9C6A, + 0x9C6B, 0x9C6C, 0x9C6E, 0x9C6F, 0x9C70, 0x9C71, 0x9C72, 0x9C73, 0x9C74, + 0x9C75, 0x9C76, 0x9C77, 0x9C79, 0x9C7B, 0x9C7D, 0x9C7E, 0x9C80, 0x9C83, + 0x9C84, 0x9C89, 0x9C8A, 0x9C8C, 0x9C8F, 0x9C93, 0x9C96, 0x9C97, 0x9C98, + 0x9C99, 0x9C9D, 0x9CAA, 0x9CAC, 0x9CAF, 0x9CB9, 0x9CBE, 0x9CBF, 0x9CC0, + 0x9CC1, 0x9CC2, 0x9CC8, 0x9CC9, 0x9CD1, 0x9CD2, 0x9CDA, 0x9CDB, 0x9CE0, + 0x9CE1, 0x9CE3, 0x9CE4, 0x9CE6, 0x9CE7, 0x9CE8, 0x9CEA, 0x9CEB, 0x9CED, + 0x9CEE, 0x9CEF, 0x9CF0, 0x9CF1, 0x9CF2, 0x9CF5, 0x9CF7, 0x9CF8, 0x9CF9, + 0x9CFA, 0x9CFB, 0x9CFC, 0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, 0x9D01, 0x9D02, + 0x9D03, 0x9D04, 0x9D05, 0x9D08, 0x9D0A, 0x9D0B, 0x9D0C, 0x9D0D, 0x9D0E, + 0x9D0F, 0x9D10, 0x9D11, 0x9D12, 0x9D13, 0x9D14, 0x9D16, 0x9D17, 0x9D18, + 0x9D19, 0x9D1A, 0x9D1C, 0x9D1E, 0x9D20, 0x9D21, 0x9D22, 0x9D24, 0x9D25, + 0x9D27, 0x9D29, 0x9D2A, 0x9D2B, 0x9D2C, 0x9D2D, 0x9D2E, 0x9D31, 0x9D32, + 0x9D33, 0x9D34, 0x9D35, 0x9D36, 0x9D37, 0x9D38, 0x9D39, 0x9D3A, 0x9D3C, + 0x9D3D, 0x9D3E, 0x9D40, 0x9D41, 0x9D43, 0x9D44, 0x9D45, 0x9D46, 0x9D47, + 0x9D48, 0x9D49, 0x9D4A, 0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, 0x9D4F, 0x9D50, + 0x9D54, 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0x9D5A, 0x9D5B, 0x9D5E, + 0x9D5F, 0x9D62, 0x9D63, 0x9D64, 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69, + 0x9D6B, 0x9D6D, 0x9D6E, 0x9D70, 0x9D71, 0x9D73, 0x9D74, 0x9D75, 0x9D76, + 0x9D77, 0x9D78, 0x9D79, 0x9D7A, 0x9D7B, 0x9D7C, 0x9D7D, 0x9D7E, 0x9D7F, + 0x9D80, 0x9D81, 0x9D82, 0x9D83, 0x9D84, 0x9D85, 0x9D86, 0x9D88, 0x9D8A, + 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90, 0x9D91, 0x9D92, 0x9D94, + 0x9D95, 0x9D96, 0x9D97, 0x9D99, 0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, + 0x9DA0, 0x9DA1, 0x9DA2, 0x9DA3, 0x9DA4, 0x9DA6, 0x9DA7, 0x9DA8, 0x9DAA, + 0x9DAB, 0x9DAC, 0x9DAD, 0x9DAE, 0x9DB0, 0x9DB1, 0x9DB2, 0x9DB3, 0x9DB5, + 0x9DB6, 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBD, 0x9DBE, 0x9DBF, 0x9DC1, + 0x9DC3, 0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, 0x9DCB, 0x9DCC, + 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, 0x9DD4, 0x9DD5, 0x9DD6, + 0x9DD8, 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0, 0x9DE1, 0x9DE2, + 0x9DE3, 0x9DE4, 0x9DE7, 0x9DE8, 0x9DE9, 0x9DEA, 0x9DEB, 0x9DEC, 0x9DED, + 0x9DEE, 0x9DF0, 0x9DF1, 0x9DF4, 0x9DF5, 0x9DF6, 0x9DF7, 0x9DFB, 0x9DFC, + 0x9DFD, 0x9DFE, 0x9DFF, 0x9E00, 0x9E01, 0x9E02, 0x9E03, 0x9E04, 0x9E05, + 0x9E06, 0x9E07, 0x9E08, 0x9E09, 0x9E0A, 0x9E0B, 0x9E0D, 0x9E0E, 0x9E0F, + 0x9E10, 0x9E11, 0x9E12, 0x9E13, 0x9E14, 0x9E16, 0x9E17, 0x9E18, 0x9E19, + 0x9E1C, 0x9E24, 0x9E27, 0x9E2E, 0x9E30, 0x9E34, 0x9E3B, 0x9E3C, 0x9E40, + 0x9E4D, 0x9E50, 0x9E52, 0x9E53, 0x9E54, 0x9E56, 0x9E59, 0x9E5D, 0x9E5F, + 0x9E60, 0x9E61, 0x9E62, 0x9E65, 0x9E6E, 0x9E6F, 0x9E72, 0x9E74, 0x9E76, + 0x9E77, 0x9E78, 0x9E7B, 0x9E80, 0x9E81, 0x9E83, 0x9E84, 0x9E85, 0x9E86, + 0x9E89, 0x9E8A, 0x9E8C, 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, 0x9E94, + 0x9E95, 0x9E96, 0x9E98, 0x9E99, 0x9E9A, 0x9E9B, 0x9E9C, 0x9E9E, 0x9EA0, + 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA7, 0x9EA8, 0x9EAA, 0x9EAB, 0x9EAC, + 0x9EAD, 0x9EAE, 0x9EB0, 0x9EB1, 0x9EB2, 0x9EB3, 0x9EB6, 0x9EB7, 0x9EB9, + 0x9EBA, 0x9EBC, 0x9EBF, 0x9EC0, 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC5, 0x9EC6, + 0x9EC7, 0x9EC8, 0x9ECA, 0x9ECB, 0x9ED0, 0x9ED2, 0x9ED3, 0x9ED5, 0x9ED6, + 0x9ED7, 0x9ED9, 0x9EDA, 0x9EE1, 0x9EE3, 0x9EE4, 0x9EE6, 0x9EEB, 0x9EEC, + 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF3, 0x9EF5, 0x9EF6, 0x9EF8, 0x9EFA, + 0x9F00, 0x9F01, 0x9F02, 0x9F03, 0x9F04, 0x9F05, 0x9F06, 0x9F07, 0x9F08, + 0x9F0A, 0x9F0C, 0x9F0F, 0x9F11, 0x9F12, 0x9F14, 0x9F16, 0x9F18, 0x9F1A, + 0x9F1B, 0x9F1C, 0x9F1D, 0x9F1E, 0x9F1F, 0x9F21, 0x9F23, 0x9F24, 0x9F25, + 0x9F26, 0x9F27, 0x9F28, 0x9F29, 0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, 0x9F30, + 0x9F31, 0x9F32, 0x9F33, 0x9F34, 0x9F35, 0x9F36, 0x9F38, 0x9F3A, 0x9F3C, + 0x9F3F, 0x9F40, 0x9F41, 0x9F42, 0x9F43, 0x9F45, 0x9F46, 0x9F47, 0x9F48, + 0x9F49, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F53, 0x9F55, 0x9F56, 0x9F57, 0x9F58, + 0x9F5A, 0x9F5B, 0x9F5D, 0x9F5E, 0x9F62, 0x9F64, 0x9F65, 0x9F67, 0x9F68, + 0x9F69, 0x9F6B, 0x9F6D, 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, 0x9F73, 0x9F74, + 0x9F75, 0x9F76, 0x9F78, 0x9F79, 0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, 0x9F7E, + 0x9F81, 0x9F82, 0x9F8E, 0x9F8F, 0x9F91, 0x9F92, 0x9F93, 0x9F96, 0x9F97, + 0x9F98, 0x9F9D, 0x9F9E, 0x9FA1, 0x9FA2, 0x9FA3, 0x9FA4, 0x9FA5, 0xF92C, + 0xFA0D, 0xFA0E, 0xFA0F, 0xFA11, 0xFA13, 0xFA14, 0xFA18, 0xFA1F, 0xFA20, + 0xFA21, 0xFA23, 0xFA24, 0xFA27, 0xFA28, 0xFA29, 0x2E81, 0x0000, 0x0000, + 0x0000, 0x2E84, 0x3473, 0x3447, 0x2E88, 0x2E8B, 0x9FB4, 0x359E, 0x361A, + 0x360E, 0x2E8C, 0x2E97, 0x396E, 0x3918, 0x9FB5, 0x39CF, 0x39DF, 0x3A73, + 0x39D0, 0x9FB6, 0x9FB7, 0x3B4E, 0x3C6E, 0x3CE0, 0x2EA7, 0x0000, 0x9FB8, + 0x2EAA, 0x4056, 0x415F, 0x2EAE, 0x4337, 0x2EB3, 0x2EB6, 0x2EB7, 0x0000, + 0x43B1, 0x43AC, 0x2EBB, 0x43DD, 0x44D6, 0x4661, 0x464C, 0x9FB9, 0x4723, + 0x4729, 0x477C, 0x478D, 0x2ECA, 0x4947, 0x497A, 0x497D, 0x4982, 0x4983, + 0x4985, 0x4986, 0x499F, 0x499B, 0x49B7, 0x49B6, 0x9FBA, 0x0000, 0x4CA3, + 0x4C9F, 0x4CA0, 0x4CA1, 0x4C77, 0x4CA2, 0x4D13, 0x4D14, 0x4D15, 0x4D16, + 0x4D17, 0x4D18, 0x4D19, 0x4DAE, 0x9FBB, 0x0020, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, + 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, + 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, + 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, + 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, + 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, + 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, + 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, + 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, + 0x007E, 0x00FC, 0x00A9, 0x2122, 0x2026, 0x0021, 0x0022, 0x0023, 0x0024, + 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, + 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, + 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, + 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, + 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, + 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, + 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, + 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, + 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, + 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, 0x00E8, 0x012B, + 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, + 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0x0251, + 0x1E3F, 0x0144, 0x0148, 0x01F9, 0x0261, 0x0020, 0x20AC, 0x00A5, 0x20AC, + 0x0024, 0x303F, 0x20AC, 0x3041, 0x3047, 0x3043, 0x304B, 0x304B, 0x3051, + 0x3051, 0x3053, 0x3053, 0x3049, 0x3064, 0x3045, 0x308E, 0x3083, 0x3087, + 0x3085, 0x3094, 0x30A1, 0x30A7, 0x30A3, 0x30F5, 0x30F6, 0x30B3, 0x30B3, + 0x30A9, 0x30C3, 0x30A5, 0x30EE, 0x30E3, 0x30E7, 0x30E5, 0x30F7, 0x30F9, + 0x30F8, 0x30FA, 0x30FC, 0x3033, 0x3034, 0x3035, 0x3038, 0x3039, 0x303A, + 0x312A, 0x312B, 0x312C, 0x31A0, 0x31A1, 0x31A2, 0x31A3, 0x31A4, 0x31A5, + 0x31A6, 0x31A7, 0x31A8, 0x31A9, 0x31AA, 0x31AB, 0x31AC, 0x31AD, 0x31AE, + 0x31AF, 0x31B0, 0x31B1, 0x31B2, 0x31B3, 0x31B4, 0x31B5, 0x31B6, 0x31B7, + 0x2E80, 0x2E82, 0x2E83, 0x2E85, 0x2E86, 0x2E87, 0x2E89, 0x2E8A, 0x2E8D, + 0x2E8E, 0x2E8F, 0x2E90, 0x2E91, 0x2E92, 0x2E93, 0x2E94, 0x2E95, 0x2E96, + 0x2E98, 0x2E99, 0x2E9B, 0x2E9C, 0x2E9D, 0x2E9E, 0x2E9F, 0x2EA0, 0x2EA1, + 0x2EA2, 0x2EA3, 0x2EA4, 0x2EA5, 0x2EA6, 0x2EA8, 0x2EA9, 0x2EAB, 0x2EAC, + 0x2EAD, 0x2EAF, 0x2EB0, 0x2EB1, 0x2EB2, 0x2EB4, 0x2EB5, 0x2EB8, 0x2EB9, + 0x2EBA, 0x2EBC, 0x2EBD, 0x2EBE, 0x2EBF, 0x2EC0, 0x2EC1, 0x2EC2, 0x2EC3, + 0x2EC4, 0x2EC5, 0x2EC6, 0x2EC7, 0x2EC8, 0x2EC9, 0x2ECB, 0x2ECC, 0x2ECD, + 0x2ECE, 0x2ECF, 0x2ED0, 0x2ED1, 0x2ED2, 0x2ED3, 0x2ED4, 0x2ED5, 0x2ED6, + 0x2ED7, 0x2ED8, 0x2ED9, 0x2EDA, 0x2EDB, 0x2EDC, 0x2EDD, 0x2EDE, 0x2EDF, + 0x2EE0, 0x2EE1, 0x2EE2, 0x2EE3, 0x2EE4, 0x2EE5, 0x2EE6, 0x2EE7, 0x2EE8, + 0x2EE9, 0x2EEA, 0x2EEB, 0x2EEC, 0x2EED, 0x2EEE, 0x2EEF, 0x2EF0, 0x2EF1, + 0x2EF2, 0x2EF3, 0x3400, 0x3401, 0x3402, 0x3403, 0x3404, 0x3405, 0x3406, + 0x3407, 0x3408, 0x3409, 0x340A, 0x340B, 0x340C, 0x340D, 0x340E, 0x340F, + 0x3410, 0x3411, 0x3412, 0x3413, 0x3414, 0x3415, 0x3416, 0x3417, 0x3418, + 0x3419, 0x341A, 0x341B, 0x341C, 0x341D, 0x341E, 0x341F, 0x3420, 0x3421, + 0x3422, 0x3423, 0x3424, 0x3425, 0x3426, 0x3427, 0x3428, 0x3429, 0x342A, + 0x342B, 0x342C, 0x342D, 0x342E, 0x342F, 0x3430, 0x3431, 0x3432, 0x3433, + 0x3434, 0x3435, 0x3436, 0x3437, 0x3438, 0x3439, 0x343A, 0x343B, 0x343C, + 0x343D, 0x343E, 0x343F, 0x3440, 0x3441, 0x3442, 0x3443, 0x3444, 0x3445, + 0x3446, 0x3448, 0x3449, 0x344A, 0x344B, 0x344C, 0x344D, 0x344E, 0x344F, + 0x3450, 0x3451, 0x3452, 0x3453, 0x3454, 0x3455, 0x3456, 0x3457, 0x3458, + 0x3459, 0x345A, 0x345B, 0x345C, 0x345D, 0x345E, 0x345F, 0x3460, 0x3461, + 0x3462, 0x3463, 0x3464, 0x3465, 0x3466, 0x3467, 0x3468, 0x3469, 0x346A, + 0x346B, 0x346C, 0x346D, 0x346E, 0x346F, 0x3470, 0x3471, 0x3472, 0x3474, + 0x3475, 0x3476, 0x3477, 0x3478, 0x3479, 0x347A, 0x347B, 0x347C, 0x347D, + 0x347E, 0x347F, 0x3480, 0x3481, 0x3482, 0x3483, 0x3484, 0x3485, 0x3486, + 0x3487, 0x3488, 0x3489, 0x348A, 0x348B, 0x348C, 0x348D, 0x348E, 0x348F, + 0x3490, 0x3491, 0x3492, 0x3493, 0x3494, 0x3495, 0x3496, 0x3497, 0x3498, + 0x3499, 0x349A, 0x349B, 0x349C, 0x349D, 0x349E, 0x349F, 0x34A0, 0x34A1, + 0x34A2, 0x34A3, 0x34A4, 0x34A5, 0x34A6, 0x34A7, 0x34A8, 0x34A9, 0x34AA, + 0x34AB, 0x34AC, 0x34AD, 0x34AE, 0x34AF, 0x34B0, 0x34B1, 0x34B2, 0x34B3, + 0x34B4, 0x34B5, 0x34B6, 0x34B7, 0x34B8, 0x34B9, 0x34BA, 0x34BB, 0x34BC, + 0x34BD, 0x34BE, 0x34BF, 0x34C0, 0x34C1, 0x34C2, 0x34C3, 0x34C4, 0x34C5, + 0x34C6, 0x34C7, 0x34C8, 0x34C9, 0x34CA, 0x34CB, 0x34CC, 0x34CD, 0x34CE, + 0x34CF, 0x34D0, 0x34D1, 0x34D2, 0x34D3, 0x34D4, 0x34D5, 0x34D6, 0x34D7, + 0x34D8, 0x34D9, 0x34DA, 0x34DB, 0x34DC, 0x34DD, 0x34DE, 0x34DF, 0x34E0, + 0x34E1, 0x34E2, 0x34E3, 0x34E4, 0x34E5, 0x34E6, 0x34E7, 0x34E8, 0x34E9, + 0x34EA, 0x34EB, 0x34EC, 0x34ED, 0x34EE, 0x34EF, 0x34F0, 0x34F1, 0x34F2, + 0x34F3, 0x34F4, 0x34F5, 0x34F6, 0x34F7, 0x34F8, 0x34F9, 0x34FA, 0x34FB, + 0x34FC, 0x34FD, 0x34FE, 0x34FF, 0x3500, 0x3501, 0x3502, 0x3503, 0x3504, + 0x3505, 0x3506, 0x3507, 0x3508, 0x3509, 0x350A, 0x350B, 0x350C, 0x350D, + 0x350E, 0x350F, 0x3510, 0x3511, 0x3512, 0x3513, 0x3514, 0x3515, 0x3516, + 0x3517, 0x3518, 0x3519, 0x351A, 0x351B, 0x351C, 0x351D, 0x351E, 0x351F, + 0x3520, 0x3521, 0x3522, 0x3523, 0x3524, 0x3525, 0x3526, 0x3527, 0x3528, + 0x3529, 0x352A, 0x352B, 0x352C, 0x352D, 0x352E, 0x352F, 0x3530, 0x3531, + 0x3532, 0x3533, 0x3534, 0x3535, 0x3536, 0x3537, 0x3538, 0x3539, 0x353A, + 0x353B, 0x353C, 0x353D, 0x353E, 0x353F, 0x3540, 0x3541, 0x3542, 0x3543, + 0x3544, 0x3545, 0x3546, 0x3547, 0x3548, 0x3549, 0x354A, 0x354B, 0x354C, + 0x354D, 0x354E, 0x354F, 0x3550, 0x3551, 0x3552, 0x3553, 0x3554, 0x3555, + 0x3556, 0x3557, 0x3558, 0x3559, 0x355A, 0x355B, 0x355C, 0x355D, 0x355E, + 0x355F, 0x3560, 0x3561, 0x3562, 0x3563, 0x3564, 0x3565, 0x3566, 0x3567, + 0x3568, 0x3569, 0x356A, 0x356B, 0x356C, 0x356D, 0x356E, 0x356F, 0x3570, + 0x3571, 0x3572, 0x3573, 0x3574, 0x3575, 0x3576, 0x3577, 0x3578, 0x3579, + 0x357A, 0x357B, 0x357C, 0x357D, 0x357E, 0x357F, 0x3580, 0x3581, 0x3582, + 0x3583, 0x3584, 0x3585, 0x3586, 0x3587, 0x3588, 0x3589, 0x358A, 0x358B, + 0x358C, 0x358D, 0x358E, 0x358F, 0x3590, 0x3591, 0x3592, 0x3593, 0x3594, + 0x3595, 0x3596, 0x3597, 0x3598, 0x3599, 0x359A, 0x359B, 0x359C, 0x359D, + 0x359F, 0x35A0, 0x35A1, 0x35A2, 0x35A3, 0x35A4, 0x35A5, 0x35A6, 0x35A7, + 0x35A8, 0x35A9, 0x35AA, 0x35AB, 0x35AC, 0x35AD, 0x35AE, 0x35AF, 0x35B0, + 0x35B1, 0x35B2, 0x35B3, 0x35B4, 0x35B5, 0x35B6, 0x35B7, 0x35B8, 0x35B9, + 0x35BA, 0x35BB, 0x35BC, 0x35BD, 0x35BE, 0x35BF, 0x35C0, 0x35C1, 0x35C2, + 0x35C3, 0x35C4, 0x35C5, 0x35C6, 0x35C7, 0x35C8, 0x35C9, 0x35CA, 0x35CB, + 0x35CC, 0x35CD, 0x35CE, 0x35CF, 0x35D0, 0x35D1, 0x35D2, 0x35D3, 0x35D4, + 0x35D5, 0x35D6, 0x35D7, 0x35D8, 0x35D9, 0x35DA, 0x35DB, 0x35DC, 0x35DD, + 0x35DE, 0x35DF, 0x35E0, 0x35E1, 0x35E2, 0x35E3, 0x35E4, 0x35E5, 0x35E6, + 0x35E7, 0x35E8, 0x35E9, 0x35EA, 0x35EB, 0x35EC, 0x35ED, 0x35EE, 0x35EF, + 0x35F0, 0x35F1, 0x35F2, 0x35F3, 0x35F4, 0x35F5, 0x35F6, 0x35F7, 0x35F8, + 0x35F9, 0x35FA, 0x35FB, 0x35FC, 0x35FD, 0x35FE, 0x35FF, 0x3600, 0x3601, + 0x3602, 0x3603, 0x3604, 0x3605, 0x3606, 0x3607, 0x3608, 0x3609, 0x360A, + 0x360B, 0x360C, 0x360D, 0x360F, 0x3610, 0x3611, 0x3612, 0x3613, 0x3614, + 0x3615, 0x3616, 0x3617, 0x3618, 0x3619, 0x361B, 0x361C, 0x361D, 0x361E, + 0x361F, 0x3620, 0x3621, 0x3622, 0x3623, 0x3624, 0x3625, 0x3626, 0x3627, + 0x3628, 0x3629, 0x362A, 0x362B, 0x362C, 0x362D, 0x362E, 0x362F, 0x3630, + 0x3631, 0x3632, 0x3633, 0x3634, 0x3635, 0x3636, 0x3637, 0x3638, 0x3639, + 0x363A, 0x363B, 0x363C, 0x363D, 0x363E, 0x363F, 0x3640, 0x3641, 0x3642, + 0x3643, 0x3644, 0x3645, 0x3646, 0x3647, 0x3648, 0x3649, 0x364A, 0x364B, + 0x364C, 0x364D, 0x364E, 0x364F, 0x3650, 0x3651, 0x3652, 0x3653, 0x3654, + 0x3655, 0x3656, 0x3657, 0x3658, 0x3659, 0x365A, 0x365B, 0x365C, 0x365D, + 0x365E, 0x365F, 0x3660, 0x3661, 0x3662, 0x3663, 0x3664, 0x3665, 0x3666, + 0x3667, 0x3668, 0x3669, 0x366A, 0x366B, 0x366C, 0x366D, 0x366E, 0x366F, + 0x3670, 0x3671, 0x3672, 0x3673, 0x3674, 0x3675, 0x3676, 0x3677, 0x3678, + 0x3679, 0x367A, 0x367B, 0x367C, 0x367D, 0x367E, 0x367F, 0x3680, 0x3681, + 0x3682, 0x3683, 0x3684, 0x3685, 0x3686, 0x3687, 0x3688, 0x3689, 0x368A, + 0x368B, 0x368C, 0x368D, 0x368E, 0x368F, 0x3690, 0x3691, 0x3692, 0x3693, + 0x3694, 0x3695, 0x3696, 0x3697, 0x3698, 0x3699, 0x369A, 0x369B, 0x369C, + 0x369D, 0x369E, 0x369F, 0x36A0, 0x36A1, 0x36A2, 0x36A3, 0x36A4, 0x36A5, + 0x36A6, 0x36A7, 0x36A8, 0x36A9, 0x36AA, 0x36AB, 0x36AC, 0x36AD, 0x36AE, + 0x36AF, 0x36B0, 0x36B1, 0x36B2, 0x36B3, 0x36B4, 0x36B5, 0x36B6, 0x36B7, + 0x36B8, 0x36B9, 0x36BA, 0x36BB, 0x36BC, 0x36BD, 0x36BE, 0x36BF, 0x36C0, + 0x36C1, 0x36C2, 0x36C3, 0x36C4, 0x36C5, 0x36C6, 0x36C7, 0x36C8, 0x36C9, + 0x36CA, 0x36CB, 0x36CC, 0x36CD, 0x36CE, 0x36CF, 0x36D0, 0x36D1, 0x36D2, + 0x36D3, 0x36D4, 0x36D5, 0x36D6, 0x36D7, 0x36D8, 0x36D9, 0x36DA, 0x36DB, + 0x36DC, 0x36DD, 0x36DE, 0x36DF, 0x36E0, 0x36E1, 0x36E2, 0x36E3, 0x36E4, + 0x36E5, 0x36E6, 0x36E7, 0x36E8, 0x36E9, 0x36EA, 0x36EB, 0x36EC, 0x36ED, + 0x36EE, 0x36EF, 0x36F0, 0x36F1, 0x36F2, 0x36F3, 0x36F4, 0x36F5, 0x36F6, + 0x36F7, 0x36F8, 0x36F9, 0x36FA, 0x36FB, 0x36FC, 0x36FD, 0x36FE, 0x36FF, + 0x3700, 0x3701, 0x3702, 0x3703, 0x3704, 0x3705, 0x3706, 0x3707, 0x3708, + 0x3709, 0x370A, 0x370B, 0x370C, 0x370D, 0x370E, 0x370F, 0x3710, 0x3711, + 0x3712, 0x3713, 0x3714, 0x3715, 0x3716, 0x3717, 0x3718, 0x3719, 0x371A, + 0x371B, 0x371C, 0x371D, 0x371E, 0x371F, 0x3720, 0x3721, 0x3722, 0x3723, + 0x3724, 0x3725, 0x3726, 0x3727, 0x3728, 0x3729, 0x372A, 0x372B, 0x372C, + 0x372D, 0x372E, 0x372F, 0x3730, 0x3731, 0x3732, 0x3733, 0x3734, 0x3735, + 0x3736, 0x3737, 0x3738, 0x3739, 0x373A, 0x373B, 0x373C, 0x373D, 0x373E, + 0x373F, 0x3740, 0x3741, 0x3742, 0x3743, 0x3744, 0x3745, 0x3746, 0x3747, + 0x3748, 0x3749, 0x374A, 0x374B, 0x374C, 0x374D, 0x374E, 0x374F, 0x3750, + 0x3751, 0x3752, 0x3753, 0x3754, 0x3755, 0x3756, 0x3757, 0x3758, 0x3759, + 0x375A, 0x375B, 0x375C, 0x375D, 0x375E, 0x375F, 0x3760, 0x3761, 0x3762, + 0x3763, 0x3764, 0x3765, 0x3766, 0x3767, 0x3768, 0x3769, 0x376A, 0x376B, + 0x376C, 0x376D, 0x376E, 0x376F, 0x3770, 0x3771, 0x3772, 0x3773, 0x3774, + 0x3775, 0x3776, 0x3777, 0x3778, 0x3779, 0x377A, 0x377B, 0x377C, 0x377D, + 0x377E, 0x377F, 0x3780, 0x3781, 0x3782, 0x3783, 0x3784, 0x3785, 0x3786, + 0x3787, 0x3788, 0x3789, 0x378A, 0x378B, 0x378C, 0x378D, 0x378E, 0x378F, + 0x3790, 0x3791, 0x3792, 0x3793, 0x3794, 0x3795, 0x3796, 0x3797, 0x3798, + 0x3799, 0x379A, 0x379B, 0x379C, 0x379D, 0x379E, 0x379F, 0x37A0, 0x37A1, + 0x37A2, 0x37A3, 0x37A4, 0x37A5, 0x37A6, 0x37A7, 0x37A8, 0x37A9, 0x37AA, + 0x37AB, 0x37AC, 0x37AD, 0x37AE, 0x37AF, 0x37B0, 0x37B1, 0x37B2, 0x37B3, + 0x37B4, 0x37B5, 0x37B6, 0x37B7, 0x37B8, 0x37B9, 0x37BA, 0x37BB, 0x37BC, + 0x37BD, 0x37BE, 0x37BF, 0x37C0, 0x37C1, 0x37C2, 0x37C3, 0x37C4, 0x37C5, + 0x37C6, 0x37C7, 0x37C8, 0x37C9, 0x37CA, 0x37CB, 0x37CC, 0x37CD, 0x37CE, + 0x37CF, 0x37D0, 0x37D1, 0x37D2, 0x37D3, 0x37D4, 0x37D5, 0x37D6, 0x37D7, + 0x37D8, 0x37D9, 0x37DA, 0x37DB, 0x37DC, 0x37DD, 0x37DE, 0x37DF, 0x37E0, + 0x37E1, 0x37E2, 0x37E3, 0x37E4, 0x37E5, 0x37E6, 0x37E7, 0x37E8, 0x37E9, + 0x37EA, 0x37EB, 0x37EC, 0x37ED, 0x37EE, 0x37EF, 0x37F0, 0x37F1, 0x37F2, + 0x37F3, 0x37F4, 0x37F5, 0x37F6, 0x37F7, 0x37F8, 0x37F9, 0x37FA, 0x37FB, + 0x37FC, 0x37FD, 0x37FE, 0x37FF, 0x3800, 0x3801, 0x3802, 0x3803, 0x3804, + 0x3805, 0x3806, 0x3807, 0x3808, 0x3809, 0x380A, 0x380B, 0x380C, 0x380D, + 0x380E, 0x380F, 0x3810, 0x3811, 0x3812, 0x3813, 0x3814, 0x3815, 0x3816, + 0x3817, 0x3818, 0x3819, 0x381A, 0x381B, 0x381C, 0x381D, 0x381E, 0x381F, + 0x3820, 0x3821, 0x3822, 0x3823, 0x3824, 0x3825, 0x3826, 0x3827, 0x3828, + 0x3829, 0x382A, 0x382B, 0x382C, 0x382D, 0x382E, 0x382F, 0x3830, 0x3831, + 0x3832, 0x3833, 0x3834, 0x3835, 0x3836, 0x3837, 0x3838, 0x3839, 0x383A, + 0x383B, 0x383C, 0x383D, 0x383E, 0x383F, 0x3840, 0x3841, 0x3842, 0x3843, + 0x3844, 0x3845, 0x3846, 0x3847, 0x3848, 0x3849, 0x384A, 0x384B, 0x384C, + 0x384D, 0x384E, 0x384F, 0x3850, 0x3851, 0x3852, 0x3853, 0x3854, 0x3855, + 0x3856, 0x3857, 0x3858, 0x3859, 0x385A, 0x385B, 0x385C, 0x385D, 0x385E, + 0x385F, 0x3860, 0x3861, 0x3862, 0x3863, 0x3864, 0x3865, 0x3866, 0x3867, + 0x3868, 0x3869, 0x386A, 0x386B, 0x386C, 0x386D, 0x386E, 0x386F, 0x3870, + 0x3871, 0x3872, 0x3873, 0x3874, 0x3875, 0x3876, 0x3877, 0x3878, 0x3879, + 0x387A, 0x387B, 0x387C, 0x387D, 0x387E, 0x387F, 0x3880, 0x3881, 0x3882, + 0x3883, 0x3884, 0x3885, 0x3886, 0x3887, 0x3888, 0x3889, 0x388A, 0x388B, + 0x388C, 0x388D, 0x388E, 0x388F, 0x3890, 0x3891, 0x3892, 0x3893, 0x3894, + 0x3895, 0x3896, 0x3897, 0x3898, 0x3899, 0x389A, 0x389B, 0x389C, 0x389D, + 0x389E, 0x389F, 0x38A0, 0x38A1, 0x38A2, 0x38A3, 0x38A4, 0x38A5, 0x38A6, + 0x38A7, 0x38A8, 0x38A9, 0x38AA, 0x38AB, 0x38AC, 0x38AD, 0x38AE, 0x38AF, + 0x38B0, 0x38B1, 0x38B2, 0x38B3, 0x38B4, 0x38B5, 0x38B6, 0x38B7, 0x38B8, + 0x38B9, 0x38BA, 0x38BB, 0x38BC, 0x38BD, 0x38BE, 0x38BF, 0x38C0, 0x38C1, + 0x38C2, 0x38C3, 0x38C4, 0x38C5, 0x38C6, 0x38C7, 0x38C8, 0x38C9, 0x38CA, + 0x38CB, 0x38CC, 0x38CD, 0x38CE, 0x38CF, 0x38D0, 0x38D1, 0x38D2, 0x38D3, + 0x38D4, 0x38D5, 0x38D6, 0x38D7, 0x38D8, 0x38D9, 0x38DA, 0x38DB, 0x38DC, + 0x38DD, 0x38DE, 0x38DF, 0x38E0, 0x38E1, 0x38E2, 0x38E3, 0x38E4, 0x38E5, + 0x38E6, 0x38E7, 0x38E8, 0x38E9, 0x38EA, 0x38EB, 0x38EC, 0x38ED, 0x38EE, + 0x38EF, 0x38F0, 0x38F1, 0x38F2, 0x38F3, 0x38F4, 0x38F5, 0x38F6, 0x38F7, + 0x38F8, 0x38F9, 0x38FA, 0x38FB, 0x38FC, 0x38FD, 0x38FE, 0x38FF, 0x3900, + 0x3901, 0x3902, 0x3903, 0x3904, 0x3905, 0x3906, 0x3907, 0x3908, 0x3909, + 0x390A, 0x390B, 0x390C, 0x390D, 0x390E, 0x390F, 0x3910, 0x3911, 0x3912, + 0x3913, 0x3914, 0x3915, 0x3916, 0x3917, 0x3919, 0x391A, 0x391B, 0x391C, + 0x391D, 0x391E, 0x391F, 0x3920, 0x3921, 0x3922, 0x3923, 0x3924, 0x3925, + 0x3926, 0x3927, 0x3928, 0x3929, 0x392A, 0x392B, 0x392C, 0x392D, 0x392E, + 0x392F, 0x3930, 0x3931, 0x3932, 0x3933, 0x3934, 0x3935, 0x3936, 0x3937, + 0x3938, 0x3939, 0x393A, 0x393B, 0x393C, 0x393D, 0x393E, 0x393F, 0x3940, + 0x3941, 0x3942, 0x3943, 0x3944, 0x3945, 0x3946, 0x3947, 0x3948, 0x3949, + 0x394A, 0x394B, 0x394C, 0x394D, 0x394E, 0x394F, 0x3950, 0x3951, 0x3952, + 0x3953, 0x3954, 0x3955, 0x3956, 0x3957, 0x3958, 0x3959, 0x395A, 0x395B, + 0x395C, 0x395D, 0x395E, 0x395F, 0x3960, 0x3961, 0x3962, 0x3963, 0x3964, + 0x3965, 0x3966, 0x3967, 0x3968, 0x3969, 0x396A, 0x396B, 0x396C, 0x396D, + 0x396F, 0x3970, 0x3971, 0x3972, 0x3973, 0x3974, 0x3975, 0x3976, 0x3977, + 0x3978, 0x3979, 0x397A, 0x397B, 0x397C, 0x397D, 0x397E, 0x397F, 0x3980, + 0x3981, 0x3982, 0x3983, 0x3984, 0x3985, 0x3986, 0x3987, 0x3988, 0x3989, + 0x398A, 0x398B, 0x398C, 0x398D, 0x398E, 0x398F, 0x3990, 0x3991, 0x3992, + 0x3993, 0x3994, 0x3995, 0x3996, 0x3997, 0x3998, 0x3999, 0x399A, 0x399B, + 0x399C, 0x399D, 0x399E, 0x399F, 0x39A0, 0x39A1, 0x39A2, 0x39A3, 0x39A4, + 0x39A5, 0x39A6, 0x39A7, 0x39A8, 0x39A9, 0x39AA, 0x39AB, 0x39AC, 0x39AD, + 0x39AE, 0x39AF, 0x39B0, 0x39B1, 0x39B2, 0x39B3, 0x39B4, 0x39B5, 0x39B6, + 0x39B7, 0x39B8, 0x39B9, 0x39BA, 0x39BB, 0x39BC, 0x39BD, 0x39BE, 0x39BF, + 0x39C0, 0x39C1, 0x39C2, 0x39C3, 0x39C4, 0x39C5, 0x39C6, 0x39C7, 0x39C8, + 0x39C9, 0x39CA, 0x39CB, 0x39CC, 0x39CD, 0x39CE, 0x39D1, 0x39D2, 0x39D3, + 0x39D4, 0x39D5, 0x39D6, 0x39D7, 0x39D8, 0x39D9, 0x39DA, 0x39DB, 0x39DC, + 0x39DD, 0x39DE, 0x39E0, 0x39E1, 0x39E2, 0x39E3, 0x39E4, 0x39E5, 0x39E6, + 0x39E7, 0x39E8, 0x39E9, 0x39EA, 0x39EB, 0x39EC, 0x39ED, 0x39EE, 0x39EF, + 0x39F0, 0x39F1, 0x39F2, 0x39F3, 0x39F4, 0x39F5, 0x39F6, 0x39F7, 0x39F8, + 0x39F9, 0x39FA, 0x39FB, 0x39FC, 0x39FD, 0x39FE, 0x39FF, 0x3A00, 0x3A01, + 0x3A02, 0x3A03, 0x3A04, 0x3A05, 0x3A06, 0x3A07, 0x3A08, 0x3A09, 0x3A0A, + 0x3A0B, 0x3A0C, 0x3A0D, 0x3A0E, 0x3A0F, 0x3A10, 0x3A11, 0x3A12, 0x3A13, + 0x3A14, 0x3A15, 0x3A16, 0x3A17, 0x3A18, 0x3A19, 0x3A1A, 0x3A1B, 0x3A1C, + 0x3A1D, 0x3A1E, 0x3A1F, 0x3A20, 0x3A21, 0x3A22, 0x3A23, 0x3A24, 0x3A25, + 0x3A26, 0x3A27, 0x3A28, 0x3A29, 0x3A2A, 0x3A2B, 0x3A2C, 0x3A2D, 0x3A2E, + 0x3A2F, 0x3A30, 0x3A31, 0x3A32, 0x3A33, 0x3A34, 0x3A35, 0x3A36, 0x3A37, + 0x3A38, 0x3A39, 0x3A3A, 0x3A3B, 0x3A3C, 0x3A3D, 0x3A3E, 0x3A3F, 0x3A40, + 0x3A41, 0x3A42, 0x3A43, 0x3A44, 0x3A45, 0x3A46, 0x3A47, 0x3A48, 0x3A49, + 0x3A4A, 0x3A4B, 0x3A4C, 0x3A4D, 0x3A4E, 0x3A4F, 0x3A50, 0x3A51, 0x3A52, + 0x3A53, 0x3A54, 0x3A55, 0x3A56, 0x3A57, 0x3A58, 0x3A59, 0x3A5A, 0x3A5B, + 0x3A5C, 0x3A5D, 0x3A5E, 0x3A5F, 0x3A60, 0x3A61, 0x3A62, 0x3A63, 0x3A64, + 0x3A65, 0x3A66, 0x3A67, 0x3A68, 0x3A69, 0x3A6A, 0x3A6B, 0x3A6C, 0x3A6D, + 0x3A6E, 0x3A6F, 0x3A70, 0x3A71, 0x3A72, 0x3A74, 0x3A75, 0x3A76, 0x3A77, + 0x3A78, 0x3A79, 0x3A7A, 0x3A7B, 0x3A7C, 0x3A7D, 0x3A7E, 0x3A7F, 0x3A80, + 0x3A81, 0x3A82, 0x3A83, 0x3A84, 0x3A85, 0x3A86, 0x3A87, 0x3A88, 0x3A89, + 0x3A8A, 0x3A8B, 0x3A8C, 0x3A8D, 0x3A8E, 0x3A8F, 0x3A90, 0x3A91, 0x3A92, + 0x3A93, 0x3A94, 0x3A95, 0x3A96, 0x3A97, 0x3A98, 0x3A99, 0x3A9A, 0x3A9B, + 0x3A9C, 0x3A9D, 0x3A9E, 0x3A9F, 0x3AA0, 0x3AA1, 0x3AA2, 0x3AA3, 0x3AA4, + 0x3AA5, 0x3AA6, 0x3AA7, 0x3AA8, 0x3AA9, 0x3AAA, 0x3AAB, 0x3AAC, 0x3AAD, + 0x3AAE, 0x3AAF, 0x3AB0, 0x3AB1, 0x3AB2, 0x3AB3, 0x3AB4, 0x3AB5, 0x3AB6, + 0x3AB7, 0x3AB8, 0x3AB9, 0x3ABA, 0x3ABB, 0x3ABC, 0x3ABD, 0x3ABE, 0x3ABF, + 0x3AC0, 0x3AC1, 0x3AC2, 0x3AC3, 0x3AC4, 0x3AC5, 0x3AC6, 0x3AC7, 0x3AC8, + 0x3AC9, 0x3ACA, 0x3ACB, 0x3ACC, 0x3ACD, 0x3ACE, 0x3ACF, 0x3AD0, 0x3AD1, + 0x3AD2, 0x3AD3, 0x3AD4, 0x3AD5, 0x3AD6, 0x3AD7, 0x3AD8, 0x3AD9, 0x3ADA, + 0x3ADB, 0x3ADC, 0x3ADD, 0x3ADE, 0x3ADF, 0x3AE0, 0x3AE1, 0x3AE2, 0x3AE3, + 0x3AE4, 0x3AE5, 0x3AE6, 0x3AE7, 0x3AE8, 0x3AE9, 0x3AEA, 0x3AEB, 0x3AEC, + 0x3AED, 0x3AEE, 0x3AEF, 0x3AF0, 0x3AF1, 0x3AF2, 0x3AF3, 0x3AF4, 0x3AF5, + 0x3AF6, 0x3AF7, 0x3AF8, 0x3AF9, 0x3AFA, 0x3AFB, 0x3AFC, 0x3AFD, 0x3AFE, + 0x3AFF, 0x3B00, 0x3B01, 0x3B02, 0x3B03, 0x3B04, 0x3B05, 0x3B06, 0x3B07, + 0x3B08, 0x3B09, 0x3B0A, 0x3B0B, 0x3B0C, 0x3B0D, 0x3B0E, 0x3B0F, 0x3B10, + 0x3B11, 0x3B12, 0x3B13, 0x3B14, 0x3B15, 0x3B16, 0x3B17, 0x3B18, 0x3B19, + 0x3B1A, 0x3B1B, 0x3B1C, 0x3B1D, 0x3B1E, 0x3B1F, 0x3B20, 0x3B21, 0x3B22, + 0x3B23, 0x3B24, 0x3B25, 0x3B26, 0x3B27, 0x3B28, 0x3B29, 0x3B2A, 0x3B2B, + 0x3B2C, 0x3B2D, 0x3B2E, 0x3B2F, 0x3B30, 0x3B31, 0x3B32, 0x3B33, 0x3B34, + 0x3B35, 0x3B36, 0x3B37, 0x3B38, 0x3B39, 0x3B3A, 0x3B3B, 0x3B3C, 0x3B3D, + 0x3B3E, 0x3B3F, 0x3B40, 0x3B41, 0x3B42, 0x3B43, 0x3B44, 0x3B45, 0x3B46, + 0x3B47, 0x3B48, 0x3B49, 0x3B4A, 0x3B4B, 0x3B4C, 0x3B4D, 0x3B4F, 0x3B50, + 0x3B51, 0x3B52, 0x3B53, 0x3B54, 0x3B55, 0x3B56, 0x3B57, 0x3B58, 0x3B59, + 0x3B5A, 0x3B5B, 0x3B5C, 0x3B5D, 0x3B5E, 0x3B5F, 0x3B60, 0x3B61, 0x3B62, + 0x3B63, 0x3B64, 0x3B65, 0x3B66, 0x3B67, 0x3B68, 0x3B69, 0x3B6A, 0x3B6B, + 0x3B6C, 0x3B6D, 0x3B6E, 0x3B6F, 0x3B70, 0x3B71, 0x3B72, 0x3B73, 0x3B74, + 0x3B75, 0x3B76, 0x3B77, 0x3B78, 0x3B79, 0x3B7A, 0x3B7B, 0x3B7C, 0x3B7D, + 0x3B7E, 0x3B7F, 0x3B80, 0x3B81, 0x3B82, 0x3B83, 0x3B84, 0x3B85, 0x3B86, + 0x3B87, 0x3B88, 0x3B89, 0x3B8A, 0x3B8B, 0x3B8C, 0x3B8D, 0x3B8E, 0x3B8F, + 0x3B90, 0x3B91, 0x3B92, 0x3B93, 0x3B94, 0x3B95, 0x3B96, 0x3B97, 0x3B98, + 0x3B99, 0x3B9A, 0x3B9B, 0x3B9C, 0x3B9D, 0x3B9E, 0x3B9F, 0x3BA0, 0x3BA1, + 0x3BA2, 0x3BA3, 0x3BA4, 0x3BA5, 0x3BA6, 0x3BA7, 0x3BA8, 0x3BA9, 0x3BAA, + 0x3BAB, 0x3BAC, 0x3BAD, 0x3BAE, 0x3BAF, 0x3BB0, 0x3BB1, 0x3BB2, 0x3BB3, + 0x3BB4, 0x3BB5, 0x3BB6, 0x3BB7, 0x3BB8, 0x3BB9, 0x3BBA, 0x3BBB, 0x3BBC, + 0x3BBD, 0x3BBE, 0x3BBF, 0x3BC0, 0x3BC1, 0x3BC2, 0x3BC3, 0x3BC4, 0x3BC5, + 0x3BC6, 0x3BC7, 0x3BC8, 0x3BC9, 0x3BCA, 0x3BCB, 0x3BCC, 0x3BCD, 0x3BCE, + 0x3BCF, 0x3BD0, 0x3BD1, 0x3BD2, 0x3BD3, 0x3BD4, 0x3BD5, 0x3BD6, 0x3BD7, + 0x3BD8, 0x3BD9, 0x3BDA, 0x3BDB, 0x3BDC, 0x3BDD, 0x3BDE, 0x3BDF, 0x3BE0, + 0x3BE1, 0x3BE2, 0x3BE3, 0x3BE4, 0x3BE5, 0x3BE6, 0x3BE7, 0x3BE8, 0x3BE9, + 0x3BEA, 0x3BEB, 0x3BEC, 0x3BED, 0x3BEE, 0x3BEF, 0x3BF0, 0x3BF1, 0x3BF2, + 0x3BF3, 0x3BF4, 0x3BF5, 0x3BF6, 0x3BF7, 0x3BF8, 0x3BF9, 0x3BFA, 0x3BFB, + 0x3BFC, 0x3BFD, 0x3BFE, 0x3BFF, 0x3C00, 0x3C01, 0x3C02, 0x3C03, 0x3C04, + 0x3C05, 0x3C06, 0x3C07, 0x3C08, 0x3C09, 0x3C0A, 0x3C0B, 0x3C0C, 0x3C0D, + 0x3C0E, 0x3C0F, 0x3C10, 0x3C11, 0x3C12, 0x3C13, 0x3C14, 0x3C15, 0x3C16, + 0x3C17, 0x3C18, 0x3C19, 0x3C1A, 0x3C1B, 0x3C1C, 0x3C1D, 0x3C1E, 0x3C1F, + 0x3C20, 0x3C21, 0x3C22, 0x3C23, 0x3C24, 0x3C25, 0x3C26, 0x3C27, 0x3C28, + 0x3C29, 0x3C2A, 0x3C2B, 0x3C2C, 0x3C2D, 0x3C2E, 0x3C2F, 0x3C30, 0x3C31, + 0x3C32, 0x3C33, 0x3C34, 0x3C35, 0x3C36, 0x3C37, 0x3C38, 0x3C39, 0x3C3A, + 0x3C3B, 0x3C3C, 0x3C3D, 0x3C3E, 0x3C3F, 0x3C40, 0x3C41, 0x3C42, 0x3C43, + 0x3C44, 0x3C45, 0x3C46, 0x3C47, 0x3C48, 0x3C49, 0x3C4A, 0x3C4B, 0x3C4C, + 0x3C4D, 0x3C4E, 0x3C4F, 0x3C50, 0x3C51, 0x3C52, 0x3C53, 0x3C54, 0x3C55, + 0x3C56, 0x3C57, 0x3C58, 0x3C59, 0x3C5A, 0x3C5B, 0x3C5C, 0x3C5D, 0x3C5E, + 0x3C5F, 0x3C60, 0x3C61, 0x3C62, 0x3C63, 0x3C64, 0x3C65, 0x3C66, 0x3C67, + 0x3C68, 0x3C69, 0x3C6A, 0x3C6B, 0x3C6C, 0x3C6D, 0x3C6F, 0x3C70, 0x3C71, + 0x3C72, 0x3C73, 0x3C74, 0x3C75, 0x3C76, 0x3C77, 0x3C78, 0x3C79, 0x3C7A, + 0x3C7B, 0x3C7C, 0x3C7D, 0x3C7E, 0x3C7F, 0x3C80, 0x3C81, 0x3C82, 0x3C83, + 0x3C84, 0x3C85, 0x3C86, 0x3C87, 0x3C88, 0x3C89, 0x3C8A, 0x3C8B, 0x3C8C, + 0x3C8D, 0x3C8E, 0x3C8F, 0x3C90, 0x3C91, 0x3C92, 0x3C93, 0x3C94, 0x3C95, + 0x3C96, 0x3C97, 0x3C98, 0x3C99, 0x3C9A, 0x3C9B, 0x3C9C, 0x3C9D, 0x3C9E, + 0x3C9F, 0x3CA0, 0x3CA1, 0x3CA2, 0x3CA3, 0x3CA4, 0x3CA5, 0x3CA6, 0x3CA7, + 0x3CA8, 0x3CA9, 0x3CAA, 0x3CAB, 0x3CAC, 0x3CAD, 0x3CAE, 0x3CAF, 0x3CB0, + 0x3CB1, 0x3CB2, 0x3CB3, 0x3CB4, 0x3CB5, 0x3CB6, 0x3CB7, 0x3CB8, 0x3CB9, + 0x3CBA, 0x3CBB, 0x3CBC, 0x3CBD, 0x3CBE, 0x3CBF, 0x3CC0, 0x3CC1, 0x3CC2, + 0x3CC3, 0x3CC4, 0x3CC5, 0x3CC6, 0x3CC7, 0x3CC8, 0x3CC9, 0x3CCA, 0x3CCB, + 0x3CCC, 0x3CCD, 0x3CCE, 0x3CCF, 0x3CD0, 0x3CD1, 0x3CD2, 0x3CD3, 0x3CD4, + 0x3CD5, 0x3CD6, 0x3CD7, 0x3CD8, 0x3CD9, 0x3CDA, 0x3CDB, 0x3CDC, 0x3CDD, + 0x3CDE, 0x3CDF, 0x3CE1, 0x3CE2, 0x3CE3, 0x3CE4, 0x3CE5, 0x3CE6, 0x3CE7, + 0x3CE8, 0x3CE9, 0x3CEA, 0x3CEB, 0x3CEC, 0x3CED, 0x3CEE, 0x3CEF, 0x3CF0, + 0x3CF1, 0x3CF2, 0x3CF3, 0x3CF4, 0x3CF5, 0x3CF6, 0x3CF7, 0x3CF8, 0x3CF9, + 0x3CFA, 0x3CFB, 0x3CFC, 0x3CFD, 0x3CFE, 0x3CFF, 0x3D00, 0x3D01, 0x3D02, + 0x3D03, 0x3D04, 0x3D05, 0x3D06, 0x3D07, 0x3D08, 0x3D09, 0x3D0A, 0x3D0B, + 0x3D0C, 0x3D0D, 0x3D0E, 0x3D0F, 0x3D10, 0x3D11, 0x3D12, 0x3D13, 0x3D14, + 0x3D15, 0x3D16, 0x3D17, 0x3D18, 0x3D19, 0x3D1A, 0x3D1B, 0x3D1C, 0x3D1D, + 0x3D1E, 0x3D1F, 0x3D20, 0x3D21, 0x3D22, 0x3D23, 0x3D24, 0x3D25, 0x3D26, + 0x3D27, 0x3D28, 0x3D29, 0x3D2A, 0x3D2B, 0x3D2C, 0x3D2D, 0x3D2E, 0x3D2F, + 0x3D30, 0x3D31, 0x3D32, 0x3D33, 0x3D34, 0x3D35, 0x3D36, 0x3D37, 0x3D38, + 0x3D39, 0x3D3A, 0x3D3B, 0x3D3C, 0x3D3D, 0x3D3E, 0x3D3F, 0x3D40, 0x3D41, + 0x3D42, 0x3D43, 0x3D44, 0x3D45, 0x3D46, 0x3D47, 0x3D48, 0x3D49, 0x3D4A, + 0x3D4B, 0x3D4C, 0x3D4D, 0x3D4E, 0x3D4F, 0x3D50, 0x3D51, 0x3D52, 0x3D53, + 0x3D54, 0x3D55, 0x3D56, 0x3D57, 0x3D58, 0x3D59, 0x3D5A, 0x3D5B, 0x3D5C, + 0x3D5D, 0x3D5E, 0x3D5F, 0x3D60, 0x3D61, 0x3D62, 0x3D63, 0x3D64, 0x3D65, + 0x3D66, 0x3D67, 0x3D68, 0x3D69, 0x3D6A, 0x3D6B, 0x3D6C, 0x3D6D, 0x3D6E, + 0x3D6F, 0x3D70, 0x3D71, 0x3D72, 0x3D73, 0x3D74, 0x3D75, 0x3D76, 0x3D77, + 0x3D78, 0x3D79, 0x3D7A, 0x3D7B, 0x3D7C, 0x3D7D, 0x3D7E, 0x3D7F, 0x3D80, + 0x3D81, 0x3D82, 0x3D83, 0x3D84, 0x3D85, 0x3D86, 0x3D87, 0x3D88, 0x3D89, + 0x3D8A, 0x3D8B, 0x3D8C, 0x3D8D, 0x3D8E, 0x3D8F, 0x3D90, 0x3D91, 0x3D92, + 0x3D93, 0x3D94, 0x3D95, 0x3D96, 0x3D97, 0x3D98, 0x3D99, 0x3D9A, 0x3D9B, + 0x3D9C, 0x3D9D, 0x3D9E, 0x3D9F, 0x3DA0, 0x3DA1, 0x3DA2, 0x3DA3, 0x3DA4, + 0x3DA5, 0x3DA6, 0x3DA7, 0x3DA8, 0x3DA9, 0x3DAA, 0x3DAB, 0x3DAC, 0x3DAD, + 0x3DAE, 0x3DAF, 0x3DB0, 0x3DB1, 0x3DB2, 0x3DB3, 0x3DB4, 0x3DB5, 0x3DB6, + 0x3DB7, 0x3DB8, 0x3DB9, 0x3DBA, 0x3DBB, 0x3DBC, 0x3DBD, 0x3DBE, 0x3DBF, + 0x3DC0, 0x3DC1, 0x3DC2, 0x3DC3, 0x3DC4, 0x3DC5, 0x3DC6, 0x3DC7, 0x3DC8, + 0x3DC9, 0x3DCA, 0x3DCB, 0x3DCC, 0x3DCD, 0x3DCE, 0x3DCF, 0x3DD0, 0x3DD1, + 0x3DD2, 0x3DD3, 0x3DD4, 0x3DD5, 0x3DD6, 0x3DD7, 0x3DD8, 0x3DD9, 0x3DDA, + 0x3DDB, 0x3DDC, 0x3DDD, 0x3DDE, 0x3DDF, 0x3DE0, 0x3DE1, 0x3DE2, 0x3DE3, + 0x3DE4, 0x3DE5, 0x3DE6, 0x3DE7, 0x3DE8, 0x3DE9, 0x3DEA, 0x3DEB, 0x3DEC, + 0x3DED, 0x3DEE, 0x3DEF, 0x3DF0, 0x3DF1, 0x3DF2, 0x3DF3, 0x3DF4, 0x3DF5, + 0x3DF6, 0x3DF7, 0x3DF8, 0x3DF9, 0x3DFA, 0x3DFB, 0x3DFC, 0x3DFD, 0x3DFE, + 0x3DFF, 0x3E00, 0x3E01, 0x3E02, 0x3E03, 0x3E04, 0x3E05, 0x3E06, 0x3E07, + 0x3E08, 0x3E09, 0x3E0A, 0x3E0B, 0x3E0C, 0x3E0D, 0x3E0E, 0x3E0F, 0x3E10, + 0x3E11, 0x3E12, 0x3E13, 0x3E14, 0x3E15, 0x3E16, 0x3E17, 0x3E18, 0x3E19, + 0x3E1A, 0x3E1B, 0x3E1C, 0x3E1D, 0x3E1E, 0x3E1F, 0x3E20, 0x3E21, 0x3E22, + 0x3E23, 0x3E24, 0x3E25, 0x3E26, 0x3E27, 0x3E28, 0x3E29, 0x3E2A, 0x3E2B, + 0x3E2C, 0x3E2D, 0x3E2E, 0x3E2F, 0x3E30, 0x3E31, 0x3E32, 0x3E33, 0x3E34, + 0x3E35, 0x3E36, 0x3E37, 0x3E38, 0x3E39, 0x3E3A, 0x3E3B, 0x3E3C, 0x3E3D, + 0x3E3E, 0x3E3F, 0x3E40, 0x3E41, 0x3E42, 0x3E43, 0x3E44, 0x3E45, 0x3E46, + 0x3E47, 0x3E48, 0x3E49, 0x3E4A, 0x3E4B, 0x3E4C, 0x3E4D, 0x3E4E, 0x3E4F, + 0x3E50, 0x3E51, 0x3E52, 0x3E53, 0x3E54, 0x3E55, 0x3E56, 0x3E57, 0x3E58, + 0x3E59, 0x3E5A, 0x3E5B, 0x3E5C, 0x3E5D, 0x3E5E, 0x3E5F, 0x3E60, 0x3E61, + 0x3E62, 0x3E63, 0x3E64, 0x3E65, 0x3E66, 0x3E67, 0x3E68, 0x3E69, 0x3E6A, + 0x3E6B, 0x3E6C, 0x3E6D, 0x3E6E, 0x3E6F, 0x3E70, 0x3E71, 0x3E72, 0x3E73, + 0x3E74, 0x3E75, 0x3E76, 0x3E77, 0x3E78, 0x3E79, 0x3E7A, 0x3E7B, 0x3E7C, + 0x3E7D, 0x3E7E, 0x3E7F, 0x3E80, 0x3E81, 0x3E82, 0x3E83, 0x3E84, 0x3E85, + 0x3E86, 0x3E87, 0x3E88, 0x3E89, 0x3E8A, 0x3E8B, 0x3E8C, 0x3E8D, 0x3E8E, + 0x3E8F, 0x3E90, 0x3E91, 0x3E92, 0x3E93, 0x3E94, 0x3E95, 0x3E96, 0x3E97, + 0x3E98, 0x3E99, 0x3E9A, 0x3E9B, 0x3E9C, 0x3E9D, 0x3E9E, 0x3E9F, 0x3EA0, + 0x3EA1, 0x3EA2, 0x3EA3, 0x3EA4, 0x3EA5, 0x3EA6, 0x3EA7, 0x3EA8, 0x3EA9, + 0x3EAA, 0x3EAB, 0x3EAC, 0x3EAD, 0x3EAE, 0x3EAF, 0x3EB0, 0x3EB1, 0x3EB2, + 0x3EB3, 0x3EB4, 0x3EB5, 0x3EB6, 0x3EB7, 0x3EB8, 0x3EB9, 0x3EBA, 0x3EBB, + 0x3EBC, 0x3EBD, 0x3EBE, 0x3EBF, 0x3EC0, 0x3EC1, 0x3EC2, 0x3EC3, 0x3EC4, + 0x3EC5, 0x3EC6, 0x3EC7, 0x3EC8, 0x3EC9, 0x3ECA, 0x3ECB, 0x3ECC, 0x3ECD, + 0x3ECE, 0x3ECF, 0x3ED0, 0x3ED1, 0x3ED2, 0x3ED3, 0x3ED4, 0x3ED5, 0x3ED6, + 0x3ED7, 0x3ED8, 0x3ED9, 0x3EDA, 0x3EDB, 0x3EDC, 0x3EDD, 0x3EDE, 0x3EDF, + 0x3EE0, 0x3EE1, 0x3EE2, 0x3EE3, 0x3EE4, 0x3EE5, 0x3EE6, 0x3EE7, 0x3EE8, + 0x3EE9, 0x3EEA, 0x3EEB, 0x3EEC, 0x3EED, 0x3EEE, 0x3EEF, 0x3EF0, 0x3EF1, + 0x3EF2, 0x3EF3, 0x3EF4, 0x3EF5, 0x3EF6, 0x3EF7, 0x3EF8, 0x3EF9, 0x3EFA, + 0x3EFB, 0x3EFC, 0x3EFD, 0x3EFE, 0x3EFF, 0x3F00, 0x3F01, 0x3F02, 0x3F03, + 0x3F04, 0x3F05, 0x3F06, 0x3F07, 0x3F08, 0x3F09, 0x3F0A, 0x3F0B, 0x3F0C, + 0x3F0D, 0x3F0E, 0x3F0F, 0x3F10, 0x3F11, 0x3F12, 0x3F13, 0x3F14, 0x3F15, + 0x3F16, 0x3F17, 0x3F18, 0x3F19, 0x3F1A, 0x3F1B, 0x3F1C, 0x3F1D, 0x3F1E, + 0x3F1F, 0x3F20, 0x3F21, 0x3F22, 0x3F23, 0x3F24, 0x3F25, 0x3F26, 0x3F27, + 0x3F28, 0x3F29, 0x3F2A, 0x3F2B, 0x3F2C, 0x3F2D, 0x3F2E, 0x3F2F, 0x3F30, + 0x3F31, 0x3F32, 0x3F33, 0x3F34, 0x3F35, 0x3F36, 0x3F37, 0x3F38, 0x3F39, + 0x3F3A, 0x3F3B, 0x3F3C, 0x3F3D, 0x3F3E, 0x3F3F, 0x3F40, 0x3F41, 0x3F42, + 0x3F43, 0x3F44, 0x3F45, 0x3F46, 0x3F47, 0x3F48, 0x3F49, 0x3F4A, 0x3F4B, + 0x3F4C, 0x3F4D, 0x3F4E, 0x3F4F, 0x3F50, 0x3F51, 0x3F52, 0x3F53, 0x3F54, + 0x3F55, 0x3F56, 0x3F57, 0x3F58, 0x3F59, 0x3F5A, 0x3F5B, 0x3F5C, 0x3F5D, + 0x3F5E, 0x3F5F, 0x3F60, 0x3F61, 0x3F62, 0x3F63, 0x3F64, 0x3F65, 0x3F66, + 0x3F67, 0x3F68, 0x3F69, 0x3F6A, 0x3F6B, 0x3F6C, 0x3F6D, 0x3F6E, 0x3F6F, + 0x3F70, 0x3F71, 0x3F72, 0x3F73, 0x3F74, 0x3F75, 0x3F76, 0x3F77, 0x3F78, + 0x3F79, 0x3F7A, 0x3F7B, 0x3F7C, 0x3F7D, 0x3F7E, 0x3F7F, 0x3F80, 0x3F81, + 0x3F82, 0x3F83, 0x3F84, 0x3F85, 0x3F86, 0x3F87, 0x3F88, 0x3F89, 0x3F8A, + 0x3F8B, 0x3F8C, 0x3F8D, 0x3F8E, 0x3F8F, 0x3F90, 0x3F91, 0x3F92, 0x3F93, + 0x3F94, 0x3F95, 0x3F96, 0x3F97, 0x3F98, 0x3F99, 0x3F9A, 0x3F9B, 0x3F9C, + 0x3F9D, 0x3F9E, 0x3F9F, 0x3FA0, 0x3FA1, 0x3FA2, 0x3FA3, 0x3FA4, 0x3FA5, + 0x3FA6, 0x3FA7, 0x3FA8, 0x3FA9, 0x3FAA, 0x3FAB, 0x3FAC, 0x3FAD, 0x3FAE, + 0x3FAF, 0x3FB0, 0x3FB1, 0x3FB2, 0x3FB3, 0x3FB4, 0x3FB5, 0x3FB6, 0x3FB7, + 0x3FB8, 0x3FB9, 0x3FBA, 0x3FBB, 0x3FBC, 0x3FBD, 0x3FBE, 0x3FBF, 0x3FC0, + 0x3FC1, 0x3FC2, 0x3FC3, 0x3FC4, 0x3FC5, 0x3FC6, 0x3FC7, 0x3FC8, 0x3FC9, + 0x3FCA, 0x3FCB, 0x3FCC, 0x3FCD, 0x3FCE, 0x3FCF, 0x3FD0, 0x3FD1, 0x3FD2, + 0x3FD3, 0x3FD4, 0x3FD5, 0x3FD6, 0x3FD7, 0x3FD8, 0x3FD9, 0x3FDA, 0x3FDB, + 0x3FDC, 0x3FDD, 0x3FDE, 0x3FDF, 0x3FE0, 0x3FE1, 0x3FE2, 0x3FE3, 0x3FE4, + 0x3FE5, 0x3FE6, 0x3FE7, 0x3FE8, 0x3FE9, 0x3FEA, 0x3FEB, 0x3FEC, 0x3FED, + 0x3FEE, 0x3FEF, 0x3FF0, 0x3FF1, 0x3FF2, 0x3FF3, 0x3FF4, 0x3FF5, 0x3FF6, + 0x3FF7, 0x3FF8, 0x3FF9, 0x3FFA, 0x3FFB, 0x3FFC, 0x3FFD, 0x3FFE, 0x3FFF, + 0x4000, 0x4001, 0x4002, 0x4003, 0x4004, 0x4005, 0x4006, 0x4007, 0x4008, + 0x4009, 0x400A, 0x400B, 0x400C, 0x400D, 0x400E, 0x400F, 0x4010, 0x4011, + 0x4012, 0x4013, 0x4014, 0x4015, 0x4016, 0x4017, 0x4018, 0x4019, 0x401A, + 0x401B, 0x401C, 0x401D, 0x401E, 0x401F, 0x4020, 0x4021, 0x4022, 0x4023, + 0x4024, 0x4025, 0x4026, 0x4027, 0x4028, 0x4029, 0x402A, 0x402B, 0x402C, + 0x402D, 0x402E, 0x402F, 0x4030, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, + 0x4036, 0x4037, 0x4038, 0x4039, 0x403A, 0x403B, 0x403C, 0x403D, 0x403E, + 0x403F, 0x4040, 0x4041, 0x4042, 0x4043, 0x4044, 0x4045, 0x4046, 0x4047, + 0x4048, 0x4049, 0x404A, 0x404B, 0x404C, 0x404D, 0x404E, 0x404F, 0x4050, + 0x4051, 0x4052, 0x4053, 0x4054, 0x4055, 0x4057, 0x4058, 0x4059, 0x405A, + 0x405B, 0x405C, 0x405D, 0x405E, 0x405F, 0x4060, 0x4061, 0x4062, 0x4063, + 0x4064, 0x4065, 0x4066, 0x4067, 0x4068, 0x4069, 0x406A, 0x406B, 0x406C, + 0x406D, 0x406E, 0x406F, 0x4070, 0x4071, 0x4072, 0x4073, 0x4074, 0x4075, + 0x4076, 0x4077, 0x4078, 0x4079, 0x407A, 0x407B, 0x407C, 0x407D, 0x407E, + 0x407F, 0x4080, 0x4081, 0x4082, 0x4083, 0x4084, 0x4085, 0x4086, 0x4087, + 0x4088, 0x4089, 0x408A, 0x408B, 0x408C, 0x408D, 0x408E, 0x408F, 0x4090, + 0x4091, 0x4092, 0x4093, 0x4094, 0x4095, 0x4096, 0x4097, 0x4098, 0x4099, + 0x409A, 0x409B, 0x409C, 0x409D, 0x409E, 0x409F, 0x40A0, 0x40A1, 0x40A2, + 0x40A3, 0x40A4, 0x40A5, 0x40A6, 0x40A7, 0x40A8, 0x40A9, 0x40AA, 0x40AB, + 0x40AC, 0x40AD, 0x40AE, 0x40AF, 0x40B0, 0x40B1, 0x40B2, 0x40B3, 0x40B4, + 0x40B5, 0x40B6, 0x40B7, 0x40B8, 0x40B9, 0x40BA, 0x40BB, 0x40BC, 0x40BD, + 0x40BE, 0x40BF, 0x40C0, 0x40C1, 0x40C2, 0x40C3, 0x40C4, 0x40C5, 0x40C6, + 0x40C7, 0x40C8, 0x40C9, 0x40CA, 0x40CB, 0x40CC, 0x40CD, 0x40CE, 0x40CF, + 0x40D0, 0x40D1, 0x40D2, 0x40D3, 0x40D4, 0x40D5, 0x40D6, 0x40D7, 0x40D8, + 0x40D9, 0x40DA, 0x40DB, 0x40DC, 0x40DD, 0x40DE, 0x40DF, 0x40E0, 0x40E1, + 0x40E2, 0x40E3, 0x40E4, 0x40E5, 0x40E6, 0x40E7, 0x40E8, 0x40E9, 0x40EA, + 0x40EB, 0x40EC, 0x40ED, 0x40EE, 0x40EF, 0x40F0, 0x40F1, 0x40F2, 0x40F3, + 0x40F4, 0x40F5, 0x40F6, 0x40F7, 0x40F8, 0x40F9, 0x40FA, 0x40FB, 0x40FC, + 0x40FD, 0x40FE, 0x40FF, 0x4100, 0x4101, 0x4102, 0x4103, 0x4104, 0x4105, + 0x4106, 0x4107, 0x4108, 0x4109, 0x410A, 0x410B, 0x410C, 0x410D, 0x410E, + 0x410F, 0x4110, 0x4111, 0x4112, 0x4113, 0x4114, 0x4115, 0x4116, 0x4117, + 0x4118, 0x4119, 0x411A, 0x411B, 0x411C, 0x411D, 0x411E, 0x411F, 0x4120, + 0x4121, 0x4122, 0x4123, 0x4124, 0x4125, 0x4126, 0x4127, 0x4128, 0x4129, + 0x412A, 0x412B, 0x412C, 0x412D, 0x412E, 0x412F, 0x4130, 0x4131, 0x4132, + 0x4133, 0x4134, 0x4135, 0x4136, 0x4137, 0x4138, 0x4139, 0x413A, 0x413B, + 0x413C, 0x413D, 0x413E, 0x413F, 0x4140, 0x4141, 0x4142, 0x4143, 0x4144, + 0x4145, 0x4146, 0x4147, 0x4148, 0x4149, 0x414A, 0x414B, 0x414C, 0x414D, + 0x414E, 0x414F, 0x4150, 0x4151, 0x4152, 0x4153, 0x4154, 0x4155, 0x4156, + 0x4157, 0x4158, 0x4159, 0x415A, 0x415B, 0x415C, 0x415D, 0x415E, 0x4160, + 0x4161, 0x4162, 0x4163, 0x4164, 0x4165, 0x4166, 0x4167, 0x4168, 0x4169, + 0x416A, 0x416B, 0x416C, 0x416D, 0x416E, 0x416F, 0x4170, 0x4171, 0x4172, + 0x4173, 0x4174, 0x4175, 0x4176, 0x4177, 0x4178, 0x4179, 0x417A, 0x417B, + 0x417C, 0x417D, 0x417E, 0x417F, 0x4180, 0x4181, 0x4182, 0x4183, 0x4184, + 0x4185, 0x4186, 0x4187, 0x4188, 0x4189, 0x418A, 0x418B, 0x418C, 0x418D, + 0x418E, 0x418F, 0x4190, 0x4191, 0x4192, 0x4193, 0x4194, 0x4195, 0x4196, + 0x4197, 0x4198, 0x4199, 0x419A, 0x419B, 0x419C, 0x419D, 0x419E, 0x419F, + 0x41A0, 0x41A1, 0x41A2, 0x41A3, 0x41A4, 0x41A5, 0x41A6, 0x41A7, 0x41A8, + 0x41A9, 0x41AA, 0x41AB, 0x41AC, 0x41AD, 0x41AE, 0x41AF, 0x41B0, 0x41B1, + 0x41B2, 0x41B3, 0x41B4, 0x41B5, 0x41B6, 0x41B7, 0x41B8, 0x41B9, 0x41BA, + 0x41BB, 0x41BC, 0x41BD, 0x41BE, 0x41BF, 0x41C0, 0x41C1, 0x41C2, 0x41C3, + 0x41C4, 0x41C5, 0x41C6, 0x41C7, 0x41C8, 0x41C9, 0x41CA, 0x41CB, 0x41CC, + 0x41CD, 0x41CE, 0x41CF, 0x41D0, 0x41D1, 0x41D2, 0x41D3, 0x41D4, 0x41D5, + 0x41D6, 0x41D7, 0x41D8, 0x41D9, 0x41DA, 0x41DB, 0x41DC, 0x41DD, 0x41DE, + 0x41DF, 0x41E0, 0x41E1, 0x41E2, 0x41E3, 0x41E4, 0x41E5, 0x41E6, 0x41E7, + 0x41E8, 0x41E9, 0x41EA, 0x41EB, 0x41EC, 0x41ED, 0x41EE, 0x41EF, 0x41F0, + 0x41F1, 0x41F2, 0x41F3, 0x41F4, 0x41F5, 0x41F6, 0x41F7, 0x41F8, 0x41F9, + 0x41FA, 0x41FB, 0x41FC, 0x41FD, 0x41FE, 0x41FF, 0x4200, 0x4201, 0x4202, + 0x4203, 0x4204, 0x4205, 0x4206, 0x4207, 0x4208, 0x4209, 0x420A, 0x420B, + 0x420C, 0x420D, 0x420E, 0x420F, 0x4210, 0x4211, 0x4212, 0x4213, 0x4214, + 0x4215, 0x4216, 0x4217, 0x4218, 0x4219, 0x421A, 0x421B, 0x421C, 0x421D, + 0x421E, 0x421F, 0x4220, 0x4221, 0x4222, 0x4223, 0x4224, 0x4225, 0x4226, + 0x4227, 0x4228, 0x4229, 0x422A, 0x422B, 0x422C, 0x422D, 0x422E, 0x422F, + 0x4230, 0x4231, 0x4232, 0x4233, 0x4234, 0x4235, 0x4236, 0x4237, 0x4238, + 0x4239, 0x423A, 0x423B, 0x423C, 0x423D, 0x423E, 0x423F, 0x4240, 0x4241, + 0x4242, 0x4243, 0x4244, 0x4245, 0x4246, 0x4247, 0x4248, 0x4249, 0x424A, + 0x424B, 0x424C, 0x424D, 0x424E, 0x424F, 0x4250, 0x4251, 0x4252, 0x4253, + 0x4254, 0x4255, 0x4256, 0x4257, 0x4258, 0x4259, 0x425A, 0x425B, 0x425C, + 0x425D, 0x425E, 0x425F, 0x4260, 0x4261, 0x4262, 0x4263, 0x4264, 0x4265, + 0x4266, 0x4267, 0x4268, 0x4269, 0x426A, 0x426B, 0x426C, 0x426D, 0x426E, + 0x426F, 0x4270, 0x4271, 0x4272, 0x4273, 0x4274, 0x4275, 0x4276, 0x4277, + 0x4278, 0x4279, 0x427A, 0x427B, 0x427C, 0x427D, 0x427E, 0x427F, 0x4280, + 0x4281, 0x4282, 0x4283, 0x4284, 0x4285, 0x4286, 0x4287, 0x4288, 0x4289, + 0x428A, 0x428B, 0x428C, 0x428D, 0x428E, 0x428F, 0x4290, 0x4291, 0x4292, + 0x4293, 0x4294, 0x4295, 0x4296, 0x4297, 0x4298, 0x4299, 0x429A, 0x429B, + 0x429C, 0x429D, 0x429E, 0x429F, 0x42A0, 0x42A1, 0x42A2, 0x42A3, 0x42A4, + 0x42A5, 0x42A6, 0x42A7, 0x42A8, 0x42A9, 0x42AA, 0x42AB, 0x42AC, 0x42AD, + 0x42AE, 0x42AF, 0x42B0, 0x42B1, 0x42B2, 0x42B3, 0x42B4, 0x42B5, 0x42B6, + 0x42B7, 0x42B8, 0x42B9, 0x42BA, 0x42BB, 0x42BC, 0x42BD, 0x42BE, 0x42BF, + 0x42C0, 0x42C1, 0x42C2, 0x42C3, 0x42C4, 0x42C5, 0x42C6, 0x42C7, 0x42C8, + 0x42C9, 0x42CA, 0x42CB, 0x42CC, 0x42CD, 0x42CE, 0x42CF, 0x42D0, 0x42D1, + 0x42D2, 0x42D3, 0x42D4, 0x42D5, 0x42D6, 0x42D7, 0x42D8, 0x42D9, 0x42DA, + 0x42DB, 0x42DC, 0x42DD, 0x42DE, 0x42DF, 0x42E0, 0x42E1, 0x42E2, 0x42E3, + 0x42E4, 0x42E5, 0x42E6, 0x42E7, 0x42E8, 0x42E9, 0x42EA, 0x42EB, 0x42EC, + 0x42ED, 0x42EE, 0x42EF, 0x42F0, 0x42F1, 0x42F2, 0x42F3, 0x42F4, 0x42F5, + 0x42F6, 0x42F7, 0x42F8, 0x42F9, 0x42FA, 0x42FB, 0x42FC, 0x42FD, 0x42FE, + 0x42FF, 0x4300, 0x4301, 0x4302, 0x4303, 0x4304, 0x4305, 0x4306, 0x4307, + 0x4308, 0x4309, 0x430A, 0x430B, 0x430C, 0x430D, 0x430E, 0x430F, 0x4310, + 0x4311, 0x4312, 0x4313, 0x4314, 0x4315, 0x4316, 0x4317, 0x4318, 0x4319, + 0x431A, 0x431B, 0x431C, 0x431D, 0x431E, 0x431F, 0x4320, 0x4321, 0x4322, + 0x4323, 0x4324, 0x4325, 0x4326, 0x4327, 0x4328, 0x4329, 0x432A, 0x432B, + 0x432C, 0x432D, 0x432E, 0x432F, 0x4330, 0x4331, 0x4332, 0x4333, 0x4334, + 0x4335, 0x4336, 0x4338, 0x4339, 0x433A, 0x433B, 0x433C, 0x433D, 0x433E, + 0x433F, 0x4340, 0x4341, 0x4342, 0x4343, 0x4344, 0x4345, 0x4346, 0x4347, + 0x4348, 0x4349, 0x434A, 0x434B, 0x434C, 0x434D, 0x434E, 0x434F, 0x4350, + 0x4351, 0x4352, 0x4353, 0x4354, 0x4355, 0x4356, 0x4357, 0x4358, 0x4359, + 0x435A, 0x435B, 0x435C, 0x435D, 0x435E, 0x435F, 0x4360, 0x4361, 0x4362, + 0x4363, 0x4364, 0x4365, 0x4366, 0x4367, 0x4368, 0x4369, 0x436A, 0x436B, + 0x436C, 0x436D, 0x436E, 0x436F, 0x4370, 0x4371, 0x4372, 0x4373, 0x4374, + 0x4375, 0x4376, 0x4377, 0x4378, 0x4379, 0x437A, 0x437B, 0x437C, 0x437D, + 0x437E, 0x437F, 0x4380, 0x4381, 0x4382, 0x4383, 0x4384, 0x4385, 0x4386, + 0x4387, 0x4388, 0x4389, 0x438A, 0x438B, 0x438C, 0x438D, 0x438E, 0x438F, + 0x4390, 0x4391, 0x4392, 0x4393, 0x4394, 0x4395, 0x4396, 0x4397, 0x4398, + 0x4399, 0x439A, 0x439B, 0x439C, 0x439D, 0x439E, 0x439F, 0x43A0, 0x43A1, + 0x43A2, 0x43A3, 0x43A4, 0x43A5, 0x43A6, 0x43A7, 0x43A8, 0x43A9, 0x43AA, + 0x43AB, 0x43AD, 0x43AE, 0x43AF, 0x43B0, 0x43B2, 0x43B3, 0x43B4, 0x43B5, + 0x43B6, 0x43B7, 0x43B8, 0x43B9, 0x43BA, 0x43BB, 0x43BC, 0x43BD, 0x43BE, + 0x43BF, 0x43C0, 0x43C1, 0x43C2, 0x43C3, 0x43C4, 0x43C5, 0x43C6, 0x43C7, + 0x43C8, 0x43C9, 0x43CA, 0x43CB, 0x43CC, 0x43CD, 0x43CE, 0x43CF, 0x43D0, + 0x43D1, 0x43D2, 0x43D3, 0x43D4, 0x43D5, 0x43D6, 0x43D7, 0x43D8, 0x43D9, + 0x43DA, 0x43DB, 0x43DC, 0x43DE, 0x43DF, 0x43E0, 0x43E1, 0x43E2, 0x43E3, + 0x43E4, 0x43E5, 0x43E6, 0x43E7, 0x43E8, 0x43E9, 0x43EA, 0x43EB, 0x43EC, + 0x43ED, 0x43EE, 0x43EF, 0x43F0, 0x43F1, 0x43F2, 0x43F3, 0x43F4, 0x43F5, + 0x43F6, 0x43F7, 0x43F8, 0x43F9, 0x43FA, 0x43FB, 0x43FC, 0x43FD, 0x43FE, + 0x43FF, 0x4400, 0x4401, 0x4402, 0x4403, 0x4404, 0x4405, 0x4406, 0x4407, + 0x4408, 0x4409, 0x440A, 0x440B, 0x440C, 0x440D, 0x440E, 0x440F, 0x4410, + 0x4411, 0x4412, 0x4413, 0x4414, 0x4415, 0x4416, 0x4417, 0x4418, 0x4419, + 0x441A, 0x441B, 0x441C, 0x441D, 0x441E, 0x441F, 0x4420, 0x4421, 0x4422, + 0x4423, 0x4424, 0x4425, 0x4426, 0x4427, 0x4428, 0x4429, 0x442A, 0x442B, + 0x442C, 0x442D, 0x442E, 0x442F, 0x4430, 0x4431, 0x4432, 0x4433, 0x4434, + 0x4435, 0x4436, 0x4437, 0x4438, 0x4439, 0x443A, 0x443B, 0x443C, 0x443D, + 0x443E, 0x443F, 0x4440, 0x4441, 0x4442, 0x4443, 0x4444, 0x4445, 0x4446, + 0x4447, 0x4448, 0x4449, 0x444A, 0x444B, 0x444C, 0x444D, 0x444E, 0x444F, + 0x4450, 0x4451, 0x4452, 0x4453, 0x4454, 0x4455, 0x4456, 0x4457, 0x4458, + 0x4459, 0x445A, 0x445B, 0x445C, 0x445D, 0x445E, 0x445F, 0x4460, 0x4461, + 0x4462, 0x4463, 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, 0x4469, 0x446A, + 0x446B, 0x446C, 0x446D, 0x446E, 0x446F, 0x4470, 0x4471, 0x4472, 0x4473, + 0x4474, 0x4475, 0x4476, 0x4477, 0x4478, 0x4479, 0x447A, 0x447B, 0x447C, + 0x447D, 0x447E, 0x447F, 0x4480, 0x4481, 0x4482, 0x4483, 0x4484, 0x4485, + 0x4486, 0x4487, 0x4488, 0x4489, 0x448A, 0x448B, 0x448C, 0x448D, 0x448E, + 0x448F, 0x4490, 0x4491, 0x4492, 0x4493, 0x4494, 0x4495, 0x4496, 0x4497, + 0x4498, 0x4499, 0x449A, 0x449B, 0x449C, 0x449D, 0x449E, 0x449F, 0x44A0, + 0x44A1, 0x44A2, 0x44A3, 0x44A4, 0x44A5, 0x44A6, 0x44A7, 0x44A8, 0x44A9, + 0x44AA, 0x44AB, 0x44AC, 0x44AD, 0x44AE, 0x44AF, 0x44B0, 0x44B1, 0x44B2, + 0x44B3, 0x44B4, 0x44B5, 0x44B6, 0x44B7, 0x44B8, 0x44B9, 0x44BA, 0x44BB, + 0x44BC, 0x44BD, 0x44BE, 0x44BF, 0x44C0, 0x44C1, 0x44C2, 0x44C3, 0x44C4, + 0x44C5, 0x44C6, 0x44C7, 0x44C8, 0x44C9, 0x44CA, 0x44CB, 0x44CC, 0x44CD, + 0x44CE, 0x44CF, 0x44D0, 0x44D1, 0x44D2, 0x44D3, 0x44D4, 0x44D5, 0x44D7, + 0x44D8, 0x44D9, 0x44DA, 0x44DB, 0x44DC, 0x44DD, 0x44DE, 0x44DF, 0x44E0, + 0x44E1, 0x44E2, 0x44E3, 0x44E4, 0x44E5, 0x44E6, 0x44E7, 0x44E8, 0x44E9, + 0x44EA, 0x44EB, 0x44EC, 0x44ED, 0x44EE, 0x44EF, 0x44F0, 0x44F1, 0x44F2, + 0x44F3, 0x44F4, 0x44F5, 0x44F6, 0x44F7, 0x44F8, 0x44F9, 0x44FA, 0x44FB, + 0x44FC, 0x44FD, 0x44FE, 0x44FF, 0x4500, 0x4501, 0x4502, 0x4503, 0x4504, + 0x4505, 0x4506, 0x4507, 0x4508, 0x4509, 0x450A, 0x450B, 0x450C, 0x450D, + 0x450E, 0x450F, 0x4510, 0x4511, 0x4512, 0x4513, 0x4514, 0x4515, 0x4516, + 0x4517, 0x4518, 0x4519, 0x451A, 0x451B, 0x451C, 0x451D, 0x451E, 0x451F, + 0x4520, 0x4521, 0x4522, 0x4523, 0x4524, 0x4525, 0x4526, 0x4527, 0x4528, + 0x4529, 0x452A, 0x452B, 0x452C, 0x452D, 0x452E, 0x452F, 0x4530, 0x4531, + 0x4532, 0x4533, 0x4534, 0x4535, 0x4536, 0x4537, 0x4538, 0x4539, 0x453A, + 0x453B, 0x453C, 0x453D, 0x453E, 0x453F, 0x4540, 0x4541, 0x4542, 0x4543, + 0x4544, 0x4545, 0x4546, 0x4547, 0x4548, 0x4549, 0x454A, 0x454B, 0x454C, + 0x454D, 0x454E, 0x454F, 0x4550, 0x4551, 0x4552, 0x4553, 0x4554, 0x4555, + 0x4556, 0x4557, 0x4558, 0x4559, 0x455A, 0x455B, 0x455C, 0x455D, 0x455E, + 0x455F, 0x4560, 0x4561, 0x4562, 0x4563, 0x4564, 0x4565, 0x4566, 0x4567, + 0x4568, 0x4569, 0x456A, 0x456B, 0x456C, 0x456D, 0x456E, 0x456F, 0x4570, + 0x4571, 0x4572, 0x4573, 0x4574, 0x4575, 0x4576, 0x4577, 0x4578, 0x4579, + 0x457A, 0x457B, 0x457C, 0x457D, 0x457E, 0x457F, 0x4580, 0x4581, 0x4582, + 0x4583, 0x4584, 0x4585, 0x4586, 0x4587, 0x4588, 0x4589, 0x458A, 0x458B, + 0x458C, 0x458D, 0x458E, 0x458F, 0x4590, 0x4591, 0x4592, 0x4593, 0x4594, + 0x4595, 0x4596, 0x4597, 0x4598, 0x4599, 0x459A, 0x459B, 0x459C, 0x459D, + 0x459E, 0x459F, 0x45A0, 0x45A1, 0x45A2, 0x45A3, 0x45A4, 0x45A5, 0x45A6, + 0x45A7, 0x45A8, 0x45A9, 0x45AA, 0x45AB, 0x45AC, 0x45AD, 0x45AE, 0x45AF, + 0x45B0, 0x45B1, 0x45B2, 0x45B3, 0x45B4, 0x45B5, 0x45B6, 0x45B7, 0x45B8, + 0x45B9, 0x45BA, 0x45BB, 0x45BC, 0x45BD, 0x45BE, 0x45BF, 0x45C0, 0x45C1, + 0x45C2, 0x45C3, 0x45C4, 0x45C5, 0x45C6, 0x45C7, 0x45C8, 0x45C9, 0x45CA, + 0x45CB, 0x45CC, 0x45CD, 0x45CE, 0x45CF, 0x45D0, 0x45D1, 0x45D2, 0x45D3, + 0x45D4, 0x45D5, 0x45D6, 0x45D7, 0x45D8, 0x45D9, 0x45DA, 0x45DB, 0x45DC, + 0x45DD, 0x45DE, 0x45DF, 0x45E0, 0x45E1, 0x45E2, 0x45E3, 0x45E4, 0x45E5, + 0x45E6, 0x45E7, 0x45E8, 0x45E9, 0x45EA, 0x45EB, 0x45EC, 0x45ED, 0x45EE, + 0x45EF, 0x45F0, 0x45F1, 0x45F2, 0x45F3, 0x45F4, 0x45F5, 0x45F6, 0x45F7, + 0x45F8, 0x45F9, 0x45FA, 0x45FB, 0x45FC, 0x45FD, 0x45FE, 0x45FF, 0x4600, + 0x4601, 0x4602, 0x4603, 0x4604, 0x4605, 0x4606, 0x4607, 0x4608, 0x4609, + 0x460A, 0x460B, 0x460C, 0x460D, 0x460E, 0x460F, 0x4610, 0x4611, 0x4612, + 0x4613, 0x4614, 0x4615, 0x4616, 0x4617, 0x4618, 0x4619, 0x461A, 0x461B, + 0x461C, 0x461D, 0x461E, 0x461F, 0x4620, 0x4621, 0x4622, 0x4623, 0x4624, + 0x4625, 0x4626, 0x4627, 0x4628, 0x4629, 0x462A, 0x462B, 0x462C, 0x462D, + 0x462E, 0x462F, 0x4630, 0x4631, 0x4632, 0x4633, 0x4634, 0x4635, 0x4636, + 0x4637, 0x4638, 0x4639, 0x463A, 0x463B, 0x463C, 0x463D, 0x463E, 0x463F, + 0x4640, 0x4641, 0x4642, 0x4643, 0x4644, 0x4645, 0x4646, 0x4647, 0x4648, + 0x4649, 0x464A, 0x464B, 0x464D, 0x464E, 0x464F, 0x4650, 0x4651, 0x4652, + 0x4653, 0x4654, 0x4655, 0x4656, 0x4657, 0x4658, 0x4659, 0x465A, 0x465B, + 0x465C, 0x465D, 0x465E, 0x465F, 0x4660, 0x4662, 0x4663, 0x4664, 0x4665, + 0x4666, 0x4667, 0x4668, 0x4669, 0x466A, 0x466B, 0x466C, 0x466D, 0x466E, + 0x466F, 0x4670, 0x4671, 0x4672, 0x4673, 0x4674, 0x4675, 0x4676, 0x4677, + 0x4678, 0x4679, 0x467A, 0x467B, 0x467C, 0x467D, 0x467E, 0x467F, 0x4680, + 0x4681, 0x4682, 0x4683, 0x4684, 0x4685, 0x4686, 0x4687, 0x4688, 0x4689, + 0x468A, 0x468B, 0x468C, 0x468D, 0x468E, 0x468F, 0x4690, 0x4691, 0x4692, + 0x4693, 0x4694, 0x4695, 0x4696, 0x4697, 0x4698, 0x4699, 0x469A, 0x469B, + 0x469C, 0x469D, 0x469E, 0x469F, 0x46A0, 0x46A1, 0x46A2, 0x46A3, 0x46A4, + 0x46A5, 0x46A6, 0x46A7, 0x46A8, 0x46A9, 0x46AA, 0x46AB, 0x46AC, 0x46AD, + 0x46AE, 0x46AF, 0x46B0, 0x46B1, 0x46B2, 0x46B3, 0x46B4, 0x46B5, 0x46B6, + 0x46B7, 0x46B8, 0x46B9, 0x46BA, 0x46BB, 0x46BC, 0x46BD, 0x46BE, 0x46BF, + 0x46C0, 0x46C1, 0x46C2, 0x46C3, 0x46C4, 0x46C5, 0x46C6, 0x46C7, 0x46C8, + 0x46C9, 0x46CA, 0x46CB, 0x46CC, 0x46CD, 0x46CE, 0x46CF, 0x46D0, 0x46D1, + 0x46D2, 0x46D3, 0x46D4, 0x46D5, 0x46D6, 0x46D7, 0x46D8, 0x46D9, 0x46DA, + 0x46DB, 0x46DC, 0x46DD, 0x46DE, 0x46DF, 0x46E0, 0x46E1, 0x46E2, 0x46E3, + 0x46E4, 0x46E5, 0x46E6, 0x46E7, 0x46E8, 0x46E9, 0x46EA, 0x46EB, 0x46EC, + 0x46ED, 0x46EE, 0x46EF, 0x46F0, 0x46F1, 0x46F2, 0x46F3, 0x46F4, 0x46F5, + 0x46F6, 0x46F7, 0x46F8, 0x46F9, 0x46FA, 0x46FB, 0x46FC, 0x46FD, 0x46FE, + 0x46FF, 0x4700, 0x4701, 0x4702, 0x4703, 0x4704, 0x4705, 0x4706, 0x4707, + 0x4708, 0x4709, 0x470A, 0x470B, 0x470C, 0x470D, 0x470E, 0x470F, 0x4710, + 0x4711, 0x4712, 0x4713, 0x4714, 0x4715, 0x4716, 0x4717, 0x4718, 0x4719, + 0x471A, 0x471B, 0x471C, 0x471D, 0x471E, 0x471F, 0x4720, 0x4721, 0x4722, + 0x4724, 0x4725, 0x4726, 0x4727, 0x4728, 0x472A, 0x472B, 0x472C, 0x472D, + 0x472E, 0x472F, 0x4730, 0x4731, 0x4732, 0x4733, 0x4734, 0x4735, 0x4736, + 0x4737, 0x4738, 0x4739, 0x473A, 0x473B, 0x473C, 0x473D, 0x473E, 0x473F, + 0x4740, 0x4741, 0x4742, 0x4743, 0x4744, 0x4745, 0x4746, 0x4747, 0x4748, + 0x4749, 0x474A, 0x474B, 0x474C, 0x474D, 0x474E, 0x474F, 0x4750, 0x4751, + 0x4752, 0x4753, 0x4754, 0x4755, 0x4756, 0x4757, 0x4758, 0x4759, 0x475A, + 0x475B, 0x475C, 0x475D, 0x475E, 0x475F, 0x4760, 0x4761, 0x4762, 0x4763, + 0x4764, 0x4765, 0x4766, 0x4767, 0x4768, 0x4769, 0x476A, 0x476B, 0x476C, + 0x476D, 0x476E, 0x476F, 0x4770, 0x4771, 0x4772, 0x4773, 0x4774, 0x4775, + 0x4776, 0x4777, 0x4778, 0x4779, 0x477A, 0x477B, 0x477D, 0x477E, 0x477F, + 0x4780, 0x4781, 0x4782, 0x4783, 0x4784, 0x4785, 0x4786, 0x4787, 0x4788, + 0x4789, 0x478A, 0x478B, 0x478C, 0x478E, 0x478F, 0x4790, 0x4791, 0x4792, + 0x4793, 0x4794, 0x4795, 0x4796, 0x4797, 0x4798, 0x4799, 0x479A, 0x479B, + 0x479C, 0x479D, 0x479E, 0x479F, 0x47A0, 0x47A1, 0x47A2, 0x47A3, 0x47A4, + 0x47A5, 0x47A6, 0x47A7, 0x47A8, 0x47A9, 0x47AA, 0x47AB, 0x47AC, 0x47AD, + 0x47AE, 0x47AF, 0x47B0, 0x47B1, 0x47B2, 0x47B3, 0x47B4, 0x47B5, 0x47B6, + 0x47B7, 0x47B8, 0x47B9, 0x47BA, 0x47BB, 0x47BC, 0x47BD, 0x47BE, 0x47BF, + 0x47C0, 0x47C1, 0x47C2, 0x47C3, 0x47C4, 0x47C5, 0x47C6, 0x47C7, 0x47C8, + 0x47C9, 0x47CA, 0x47CB, 0x47CC, 0x47CD, 0x47CE, 0x47CF, 0x47D0, 0x47D1, + 0x47D2, 0x47D3, 0x47D4, 0x47D5, 0x47D6, 0x47D7, 0x47D8, 0x47D9, 0x47DA, + 0x47DB, 0x47DC, 0x47DD, 0x47DE, 0x47DF, 0x47E0, 0x47E1, 0x47E2, 0x47E3, + 0x47E4, 0x47E5, 0x47E6, 0x47E7, 0x47E8, 0x47E9, 0x47EA, 0x47EB, 0x47EC, + 0x47ED, 0x47EE, 0x47EF, 0x47F0, 0x47F1, 0x47F2, 0x47F3, 0x47F4, 0x47F5, + 0x47F6, 0x47F7, 0x47F8, 0x47F9, 0x47FA, 0x47FB, 0x47FC, 0x47FD, 0x47FE, + 0x47FF, 0x4800, 0x4801, 0x4802, 0x4803, 0x4804, 0x4805, 0x4806, 0x4807, + 0x4808, 0x4809, 0x480A, 0x480B, 0x480C, 0x480D, 0x480E, 0x480F, 0x4810, + 0x4811, 0x4812, 0x4813, 0x4814, 0x4815, 0x4816, 0x4817, 0x4818, 0x4819, + 0x481A, 0x481B, 0x481C, 0x481D, 0x481E, 0x481F, 0x4820, 0x4821, 0x4822, + 0x4823, 0x4824, 0x4825, 0x4826, 0x4827, 0x4828, 0x4829, 0x482A, 0x482B, + 0x482C, 0x482D, 0x482E, 0x482F, 0x4830, 0x4831, 0x4832, 0x4833, 0x4834, + 0x4835, 0x4836, 0x4837, 0x4838, 0x4839, 0x483A, 0x483B, 0x483C, 0x483D, + 0x483E, 0x483F, 0x4840, 0x4841, 0x4842, 0x4843, 0x4844, 0x4845, 0x4846, + 0x4847, 0x4848, 0x4849, 0x484A, 0x484B, 0x484C, 0x484D, 0x484E, 0x484F, + 0x4850, 0x4851, 0x4852, 0x4853, 0x4854, 0x4855, 0x4856, 0x4857, 0x4858, + 0x4859, 0x485A, 0x485B, 0x485C, 0x485D, 0x485E, 0x485F, 0x4860, 0x4861, + 0x4862, 0x4863, 0x4864, 0x4865, 0x4866, 0x4867, 0x4868, 0x4869, 0x486A, + 0x486B, 0x486C, 0x486D, 0x486E, 0x486F, 0x4870, 0x4871, 0x4872, 0x4873, + 0x4874, 0x4875, 0x4876, 0x4877, 0x4878, 0x4879, 0x487A, 0x487B, 0x487C, + 0x487D, 0x487E, 0x487F, 0x4880, 0x4881, 0x4882, 0x4883, 0x4884, 0x4885, + 0x4886, 0x4887, 0x4888, 0x4889, 0x488A, 0x488B, 0x488C, 0x488D, 0x488E, + 0x488F, 0x4890, 0x4891, 0x4892, 0x4893, 0x4894, 0x4895, 0x4896, 0x4897, + 0x4898, 0x4899, 0x489A, 0x489B, 0x489C, 0x489D, 0x489E, 0x489F, 0x48A0, + 0x48A1, 0x48A2, 0x48A3, 0x48A4, 0x48A5, 0x48A6, 0x48A7, 0x48A8, 0x48A9, + 0x48AA, 0x48AB, 0x48AC, 0x48AD, 0x48AE, 0x48AF, 0x48B0, 0x48B1, 0x48B2, + 0x48B3, 0x48B4, 0x48B5, 0x48B6, 0x48B7, 0x48B8, 0x48B9, 0x48BA, 0x48BB, + 0x48BC, 0x48BD, 0x48BE, 0x48BF, 0x48C0, 0x48C1, 0x48C2, 0x48C3, 0x48C4, + 0x48C5, 0x48C6, 0x48C7, 0x48C8, 0x48C9, 0x48CA, 0x48CB, 0x48CC, 0x48CD, + 0x48CE, 0x48CF, 0x48D0, 0x48D1, 0x48D2, 0x48D3, 0x48D4, 0x48D5, 0x48D6, + 0x48D7, 0x48D8, 0x48D9, 0x48DA, 0x48DB, 0x48DC, 0x48DD, 0x48DE, 0x48DF, + 0x48E0, 0x48E1, 0x48E2, 0x48E3, 0x48E4, 0x48E5, 0x48E6, 0x48E7, 0x48E8, + 0x48E9, 0x48EA, 0x48EB, 0x48EC, 0x48ED, 0x48EE, 0x48EF, 0x48F0, 0x48F1, + 0x48F2, 0x48F3, 0x48F4, 0x48F5, 0x48F6, 0x48F7, 0x48F8, 0x48F9, 0x48FA, + 0x48FB, 0x48FC, 0x48FD, 0x48FE, 0x48FF, 0x4900, 0x4901, 0x4902, 0x4903, + 0x4904, 0x4905, 0x4906, 0x4907, 0x4908, 0x4909, 0x490A, 0x490B, 0x490C, + 0x490D, 0x490E, 0x490F, 0x4910, 0x4911, 0x4912, 0x4913, 0x4914, 0x4915, + 0x4916, 0x4917, 0x4918, 0x4919, 0x491A, 0x491B, 0x491C, 0x491D, 0x491E, + 0x491F, 0x4920, 0x4921, 0x4922, 0x4923, 0x4924, 0x4925, 0x4926, 0x4927, + 0x4928, 0x4929, 0x492A, 0x492B, 0x492C, 0x492D, 0x492E, 0x492F, 0x4930, + 0x4931, 0x4932, 0x4933, 0x4934, 0x4935, 0x4936, 0x4937, 0x4938, 0x4939, + 0x493A, 0x493B, 0x493C, 0x493D, 0x493E, 0x493F, 0x4940, 0x4941, 0x4942, + 0x4943, 0x4944, 0x4945, 0x4946, 0x4948, 0x4949, 0x494A, 0x494B, 0x494C, + 0x494D, 0x494E, 0x494F, 0x4950, 0x4951, 0x4952, 0x4953, 0x4954, 0x4955, + 0x4956, 0x4957, 0x4958, 0x4959, 0x495A, 0x495B, 0x495C, 0x495D, 0x495E, + 0x495F, 0x4960, 0x4961, 0x4962, 0x4963, 0x4964, 0x4965, 0x4966, 0x4967, + 0x4968, 0x4969, 0x496A, 0x496B, 0x496C, 0x496D, 0x496E, 0x496F, 0x4970, + 0x4971, 0x4972, 0x4973, 0x4974, 0x4975, 0x4976, 0x4977, 0x4978, 0x4979, + 0x497B, 0x497C, 0x497E, 0x497F, 0x4980, 0x4981, 0x4984, 0x4987, 0x4988, + 0x4989, 0x498A, 0x498B, 0x498C, 0x498D, 0x498E, 0x498F, 0x4990, 0x4991, + 0x4992, 0x4993, 0x4994, 0x4995, 0x4996, 0x4997, 0x4998, 0x4999, 0x499A, + 0x499C, 0x499D, 0x499E, 0x49A0, 0x49A1, 0x49A2, 0x49A3, 0x49A4, 0x49A5, + 0x49A6, 0x49A7, 0x49A8, 0x49A9, 0x49AA, 0x49AB, 0x49AC, 0x49AD, 0x49AE, + 0x49AF, 0x49B0, 0x49B1, 0x49B2, 0x49B3, 0x49B4, 0x49B5, 0x49B8, 0x49B9, + 0x49BA, 0x49BB, 0x49BC, 0x49BD, 0x49BE, 0x49BF, 0x49C0, 0x49C1, 0x49C2, + 0x49C3, 0x49C4, 0x49C5, 0x49C6, 0x49C7, 0x49C8, 0x49C9, 0x49CA, 0x49CB, + 0x49CC, 0x49CD, 0x49CE, 0x49CF, 0x49D0, 0x49D1, 0x49D2, 0x49D3, 0x49D4, + 0x49D5, 0x49D6, 0x49D7, 0x49D8, 0x49D9, 0x49DA, 0x49DB, 0x49DC, 0x49DD, + 0x49DE, 0x49DF, 0x49E0, 0x49E1, 0x49E2, 0x49E3, 0x49E4, 0x49E5, 0x49E6, + 0x49E7, 0x49E8, 0x49E9, 0x49EA, 0x49EB, 0x49EC, 0x49ED, 0x49EE, 0x49EF, + 0x49F0, 0x49F1, 0x49F2, 0x49F3, 0x49F4, 0x49F5, 0x49F6, 0x49F7, 0x49F8, + 0x49F9, 0x49FA, 0x49FB, 0x49FC, 0x49FD, 0x49FE, 0x49FF, 0x4A00, 0x4A01, + 0x4A02, 0x4A03, 0x4A04, 0x4A05, 0x4A06, 0x4A07, 0x4A08, 0x4A09, 0x4A0A, + 0x4A0B, 0x4A0C, 0x4A0D, 0x4A0E, 0x4A0F, 0x4A10, 0x4A11, 0x4A12, 0x4A13, + 0x4A14, 0x4A15, 0x4A16, 0x4A17, 0x4A18, 0x4A19, 0x4A1A, 0x4A1B, 0x4A1C, + 0x4A1D, 0x4A1E, 0x4A1F, 0x4A20, 0x4A21, 0x4A22, 0x4A23, 0x4A24, 0x4A25, + 0x4A26, 0x4A27, 0x4A28, 0x4A29, 0x4A2A, 0x4A2B, 0x4A2C, 0x4A2D, 0x4A2E, + 0x4A2F, 0x4A30, 0x4A31, 0x4A32, 0x4A33, 0x4A34, 0x4A35, 0x4A36, 0x4A37, + 0x4A38, 0x4A39, 0x4A3A, 0x4A3B, 0x4A3C, 0x4A3D, 0x4A3E, 0x4A3F, 0x4A40, + 0x4A41, 0x4A42, 0x4A43, 0x4A44, 0x4A45, 0x4A46, 0x4A47, 0x4A48, 0x4A49, + 0x4A4A, 0x4A4B, 0x4A4C, 0x4A4D, 0x4A4E, 0x4A4F, 0x4A50, 0x4A51, 0x4A52, + 0x4A53, 0x4A54, 0x4A55, 0x4A56, 0x4A57, 0x4A58, 0x4A59, 0x4A5A, 0x4A5B, + 0x4A5C, 0x4A5D, 0x4A5E, 0x4A5F, 0x4A60, 0x4A61, 0x4A62, 0x4A63, 0x4A64, + 0x4A65, 0x4A66, 0x4A67, 0x4A68, 0x4A69, 0x4A6A, 0x4A6B, 0x4A6C, 0x4A6D, + 0x4A6E, 0x4A6F, 0x4A70, 0x4A71, 0x4A72, 0x4A73, 0x4A74, 0x4A75, 0x4A76, + 0x4A77, 0x4A78, 0x4A79, 0x4A7A, 0x4A7B, 0x4A7C, 0x4A7D, 0x4A7E, 0x4A7F, + 0x4A80, 0x4A81, 0x4A82, 0x4A83, 0x4A84, 0x4A85, 0x4A86, 0x4A87, 0x4A88, + 0x4A89, 0x4A8A, 0x4A8B, 0x4A8C, 0x4A8D, 0x4A8E, 0x4A8F, 0x4A90, 0x4A91, + 0x4A92, 0x4A93, 0x4A94, 0x4A95, 0x4A96, 0x4A97, 0x4A98, 0x4A99, 0x4A9A, + 0x4A9B, 0x4A9C, 0x4A9D, 0x4A9E, 0x4A9F, 0x4AA0, 0x4AA1, 0x4AA2, 0x4AA3, + 0x4AA4, 0x4AA5, 0x4AA6, 0x4AA7, 0x4AA8, 0x4AA9, 0x4AAA, 0x4AAB, 0x4AAC, + 0x4AAD, 0x4AAE, 0x4AAF, 0x4AB0, 0x4AB1, 0x4AB2, 0x4AB3, 0x4AB4, 0x4AB5, + 0x4AB6, 0x4AB7, 0x4AB8, 0x4AB9, 0x4ABA, 0x4ABB, 0x4ABC, 0x4ABD, 0x4ABE, + 0x4ABF, 0x4AC0, 0x4AC1, 0x4AC2, 0x4AC3, 0x4AC4, 0x4AC5, 0x4AC6, 0x4AC7, + 0x4AC8, 0x4AC9, 0x4ACA, 0x4ACB, 0x4ACC, 0x4ACD, 0x4ACE, 0x4ACF, 0x4AD0, + 0x4AD1, 0x4AD2, 0x4AD3, 0x4AD4, 0x4AD5, 0x4AD6, 0x4AD7, 0x4AD8, 0x4AD9, + 0x4ADA, 0x4ADB, 0x4ADC, 0x4ADD, 0x4ADE, 0x4ADF, 0x4AE0, 0x4AE1, 0x4AE2, + 0x4AE3, 0x4AE4, 0x4AE5, 0x4AE6, 0x4AE7, 0x4AE8, 0x4AE9, 0x4AEA, 0x4AEB, + 0x4AEC, 0x4AED, 0x4AEE, 0x4AEF, 0x4AF0, 0x4AF1, 0x4AF2, 0x4AF3, 0x4AF4, + 0x4AF5, 0x4AF6, 0x4AF7, 0x4AF8, 0x4AF9, 0x4AFA, 0x4AFB, 0x4AFC, 0x4AFD, + 0x4AFE, 0x4AFF, 0x4B00, 0x4B01, 0x4B02, 0x4B03, 0x4B04, 0x4B05, 0x4B06, + 0x4B07, 0x4B08, 0x4B09, 0x4B0A, 0x4B0B, 0x4B0C, 0x4B0D, 0x4B0E, 0x4B0F, + 0x4B10, 0x4B11, 0x4B12, 0x4B13, 0x4B14, 0x4B15, 0x4B16, 0x4B17, 0x4B18, + 0x4B19, 0x4B1A, 0x4B1B, 0x4B1C, 0x4B1D, 0x4B1E, 0x4B1F, 0x4B20, 0x4B21, + 0x4B22, 0x4B23, 0x4B24, 0x4B25, 0x4B26, 0x4B27, 0x4B28, 0x4B29, 0x4B2A, + 0x4B2B, 0x4B2C, 0x4B2D, 0x4B2E, 0x4B2F, 0x4B30, 0x4B31, 0x4B32, 0x4B33, + 0x4B34, 0x4B35, 0x4B36, 0x4B37, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x4B3C, + 0x4B3D, 0x4B3E, 0x4B3F, 0x4B40, 0x4B41, 0x4B42, 0x4B43, 0x4B44, 0x4B45, + 0x4B46, 0x4B47, 0x4B48, 0x4B49, 0x4B4A, 0x4B4B, 0x4B4C, 0x4B4D, 0x4B4E, + 0x4B4F, 0x4B50, 0x4B51, 0x4B52, 0x4B53, 0x4B54, 0x4B55, 0x4B56, 0x4B57, + 0x4B58, 0x4B59, 0x4B5A, 0x4B5B, 0x4B5C, 0x4B5D, 0x4B5E, 0x4B5F, 0x4B60, + 0x4B61, 0x4B62, 0x4B63, 0x4B64, 0x4B65, 0x4B66, 0x4B67, 0x4B68, 0x4B69, + 0x4B6A, 0x4B6B, 0x4B6C, 0x4B6D, 0x4B6E, 0x4B6F, 0x4B70, 0x4B71, 0x4B72, + 0x4B73, 0x4B74, 0x4B75, 0x4B76, 0x4B77, 0x4B78, 0x4B79, 0x4B7A, 0x4B7B, + 0x4B7C, 0x4B7D, 0x4B7E, 0x4B7F, 0x4B80, 0x4B81, 0x4B82, 0x4B83, 0x4B84, + 0x4B85, 0x4B86, 0x4B87, 0x4B88, 0x4B89, 0x4B8A, 0x4B8B, 0x4B8C, 0x4B8D, + 0x4B8E, 0x4B8F, 0x4B90, 0x4B91, 0x4B92, 0x4B93, 0x4B94, 0x4B95, 0x4B96, + 0x4B97, 0x4B98, 0x4B99, 0x4B9A, 0x4B9B, 0x4B9C, 0x4B9D, 0x4B9E, 0x4B9F, + 0x4BA0, 0x4BA1, 0x4BA2, 0x4BA3, 0x4BA4, 0x4BA5, 0x4BA6, 0x4BA7, 0x4BA8, + 0x4BA9, 0x4BAA, 0x4BAB, 0x4BAC, 0x4BAD, 0x4BAE, 0x4BAF, 0x4BB0, 0x4BB1, + 0x4BB2, 0x4BB3, 0x4BB4, 0x4BB5, 0x4BB6, 0x4BB7, 0x4BB8, 0x4BB9, 0x4BBA, + 0x4BBB, 0x4BBC, 0x4BBD, 0x4BBE, 0x4BBF, 0x4BC0, 0x4BC1, 0x4BC2, 0x4BC3, + 0x4BC4, 0x4BC5, 0x4BC6, 0x4BC7, 0x4BC8, 0x4BC9, 0x4BCA, 0x4BCB, 0x4BCC, + 0x4BCD, 0x4BCE, 0x4BCF, 0x4BD0, 0x4BD1, 0x4BD2, 0x4BD3, 0x4BD4, 0x4BD5, + 0x4BD6, 0x4BD7, 0x4BD8, 0x4BD9, 0x4BDA, 0x4BDB, 0x4BDC, 0x4BDD, 0x4BDE, + 0x4BDF, 0x4BE0, 0x4BE1, 0x4BE2, 0x4BE3, 0x4BE4, 0x4BE5, 0x4BE6, 0x4BE7, + 0x4BE8, 0x4BE9, 0x4BEA, 0x4BEB, 0x4BEC, 0x4BED, 0x4BEE, 0x4BEF, 0x4BF0, + 0x4BF1, 0x4BF2, 0x4BF3, 0x4BF4, 0x4BF5, 0x4BF6, 0x4BF7, 0x4BF8, 0x4BF9, + 0x4BFA, 0x4BFB, 0x4BFC, 0x4BFD, 0x4BFE, 0x4BFF, 0x4C00, 0x4C01, 0x4C02, + 0x4C03, 0x4C04, 0x4C05, 0x4C06, 0x4C07, 0x4C08, 0x4C09, 0x4C0A, 0x4C0B, + 0x4C0C, 0x4C0D, 0x4C0E, 0x4C0F, 0x4C10, 0x4C11, 0x4C12, 0x4C13, 0x4C14, + 0x4C15, 0x4C16, 0x4C17, 0x4C18, 0x4C19, 0x4C1A, 0x4C1B, 0x4C1C, 0x4C1D, + 0x4C1E, 0x4C1F, 0x4C20, 0x4C21, 0x4C22, 0x4C23, 0x4C24, 0x4C25, 0x4C26, + 0x4C27, 0x4C28, 0x4C29, 0x4C2A, 0x4C2B, 0x4C2C, 0x4C2D, 0x4C2E, 0x4C2F, + 0x4C30, 0x4C31, 0x4C32, 0x4C33, 0x4C34, 0x4C35, 0x4C36, 0x4C37, 0x4C38, + 0x4C39, 0x4C3A, 0x4C3B, 0x4C3C, 0x4C3D, 0x4C3E, 0x4C3F, 0x4C40, 0x4C41, + 0x4C42, 0x4C43, 0x4C44, 0x4C45, 0x4C46, 0x4C47, 0x4C48, 0x4C49, 0x4C4A, + 0x4C4B, 0x4C4C, 0x4C4D, 0x4C4E, 0x4C4F, 0x4C50, 0x4C51, 0x4C52, 0x4C53, + 0x4C54, 0x4C55, 0x4C56, 0x4C57, 0x4C58, 0x4C59, 0x4C5A, 0x4C5B, 0x4C5C, + 0x4C5D, 0x4C5E, 0x4C5F, 0x4C60, 0x4C61, 0x4C62, 0x4C63, 0x4C64, 0x4C65, + 0x4C66, 0x4C67, 0x4C68, 0x4C69, 0x4C6A, 0x4C6B, 0x4C6C, 0x4C6D, 0x4C6E, + 0x4C6F, 0x4C70, 0x4C71, 0x4C72, 0x4C73, 0x4C74, 0x4C75, 0x4C76, 0x4C78, + 0x4C79, 0x4C7A, 0x4C7B, 0x4C7C, 0x4C7D, 0x4C7E, 0x4C7F, 0x4C80, 0x4C81, + 0x4C82, 0x4C83, 0x4C84, 0x4C85, 0x4C86, 0x4C87, 0x4C88, 0x4C89, 0x4C8A, + 0x4C8B, 0x4C8C, 0x4C8D, 0x4C8E, 0x4C8F, 0x4C90, 0x4C91, 0x4C92, 0x4C93, + 0x4C94, 0x4C95, 0x4C96, 0x4C97, 0x4C98, 0x4C99, 0x4C9A, 0x4C9B, 0x4C9C, + 0x4C9D, 0x4C9E, 0x4CA4, 0x4CA5, 0x4CA6, 0x4CA7, 0x4CA8, 0x4CA9, 0x4CAA, + 0x4CAB, 0x4CAC, 0x4CAD, 0x4CAE, 0x4CAF, 0x4CB0, 0x4CB1, 0x4CB2, 0x4CB3, + 0x4CB4, 0x4CB5, 0x4CB6, 0x4CB7, 0x4CB8, 0x4CB9, 0x4CBA, 0x4CBB, 0x4CBC, + 0x4CBD, 0x4CBE, 0x4CBF, 0x4CC0, 0x4CC1, 0x4CC2, 0x4CC3, 0x4CC4, 0x4CC5, + 0x4CC6, 0x4CC7, 0x4CC8, 0x4CC9, 0x4CCA, 0x4CCB, 0x4CCC, 0x4CCD, 0x4CCE, + 0x4CCF, 0x4CD0, 0x4CD1, 0x4CD2, 0x4CD3, 0x4CD4, 0x4CD5, 0x4CD6, 0x4CD7, + 0x4CD8, 0x4CD9, 0x4CDA, 0x4CDB, 0x4CDC, 0x4CDD, 0x4CDE, 0x4CDF, 0x4CE0, + 0x4CE1, 0x4CE2, 0x4CE3, 0x4CE4, 0x4CE5, 0x4CE6, 0x4CE7, 0x4CE8, 0x4CE9, + 0x4CEA, 0x4CEB, 0x4CEC, 0x4CED, 0x4CEE, 0x4CEF, 0x4CF0, 0x4CF1, 0x4CF2, + 0x4CF3, 0x4CF4, 0x4CF5, 0x4CF6, 0x4CF7, 0x4CF8, 0x4CF9, 0x4CFA, 0x4CFB, + 0x4CFC, 0x4CFD, 0x4CFE, 0x4CFF, 0x4D00, 0x4D01, 0x4D02, 0x4D03, 0x4D04, + 0x4D05, 0x4D06, 0x4D07, 0x4D08, 0x4D09, 0x4D0A, 0x4D0B, 0x4D0C, 0x4D0D, + 0x4D0E, 0x4D0F, 0x4D10, 0x4D11, 0x4D12, 0x4D1A, 0x4D1B, 0x4D1C, 0x4D1D, + 0x4D1E, 0x4D1F, 0x4D20, 0x4D21, 0x4D22, 0x4D23, 0x4D24, 0x4D25, 0x4D26, + 0x4D27, 0x4D28, 0x4D29, 0x4D2A, 0x4D2B, 0x4D2C, 0x4D2D, 0x4D2E, 0x4D2F, + 0x4D30, 0x4D31, 0x4D32, 0x4D33, 0x4D34, 0x4D35, 0x4D36, 0x4D37, 0x4D38, + 0x4D39, 0x4D3A, 0x4D3B, 0x4D3C, 0x4D3D, 0x4D3E, 0x4D3F, 0x4D40, 0x4D41, + 0x4D42, 0x4D43, 0x4D44, 0x4D45, 0x4D46, 0x4D47, 0x4D48, 0x4D49, 0x4D4A, + 0x4D4B, 0x4D4C, 0x4D4D, 0x4D4E, 0x4D4F, 0x4D50, 0x4D51, 0x4D52, 0x4D53, + 0x4D54, 0x4D55, 0x4D56, 0x4D57, 0x4D58, 0x4D59, 0x4D5A, 0x4D5B, 0x4D5C, + 0x4D5D, 0x4D5E, 0x4D5F, 0x4D60, 0x4D61, 0x4D62, 0x4D63, 0x4D64, 0x4D65, + 0x4D66, 0x4D67, 0x4D68, 0x4D69, 0x4D6A, 0x4D6B, 0x4D6C, 0x4D6D, 0x4D6E, + 0x4D6F, 0x4D70, 0x4D71, 0x4D72, 0x4D73, 0x4D74, 0x4D75, 0x4D76, 0x4D77, + 0x4D78, 0x4D79, 0x4D7A, 0x4D7B, 0x4D7C, 0x4D7D, 0x4D7E, 0x4D7F, 0x4D80, + 0x4D81, 0x4D82, 0x4D83, 0x4D84, 0x4D85, 0x4D86, 0x4D87, 0x4D88, 0x4D89, + 0x4D8A, 0x4D8B, 0x4D8C, 0x4D8D, 0x4D8E, 0x4D8F, 0x4D90, 0x4D91, 0x4D92, + 0x4D93, 0x4D94, 0x4D95, 0x4D96, 0x4D97, 0x4D98, 0x4D99, 0x4D9A, 0x4D9B, + 0x4D9C, 0x4D9D, 0x4D9E, 0x4D9F, 0x4DA0, 0x4DA1, 0x4DA2, 0x4DA3, 0x4DA4, + 0x4DA5, 0x4DA6, 0x4DA7, 0x4DA8, 0x4DA9, 0x4DAA, 0x4DAB, 0x4DAC, 0x4DAD, + 0x4DAF, 0x4DB0, 0x4DB1, 0x4DB2, 0x4DB3, 0x4DB4, 0x4DB5, 0x20AC, 0x00A5, + 0x20AC, 0x0024, 0x303F, 0xA000, 0xA001, 0xA002, 0xA003, 0xA004, 0xA005, + 0xA006, 0xA007, 0xA008, 0xA009, 0xA00A, 0xA00B, 0xA00C, 0xA00D, 0xA00E, + 0xA00F, 0xA010, 0xA011, 0xA012, 0xA013, 0xA014, 0xA015, 0xA016, 0xA017, + 0xA018, 0xA019, 0xA01A, 0xA01B, 0xA01C, 0xA01D, 0xA01E, 0xA01F, 0xA020, + 0xA021, 0xA022, 0xA023, 0xA024, 0xA025, 0xA026, 0xA027, 0xA028, 0xA029, + 0xA02A, 0xA02B, 0xA02C, 0xA02D, 0xA02E, 0xA02F, 0xA030, 0xA031, 0xA032, + 0xA033, 0xA034, 0xA035, 0xA036, 0xA037, 0xA038, 0xA039, 0xA03A, 0xA03B, + 0xA03C, 0xA03D, 0xA03E, 0xA03F, 0xA040, 0xA041, 0xA042, 0xA043, 0xA044, + 0xA045, 0xA046, 0xA047, 0xA048, 0xA049, 0xA04A, 0xA04B, 0xA04C, 0xA04D, + 0xA04E, 0xA04F, 0xA050, 0xA051, 0xA052, 0xA053, 0xA054, 0xA055, 0xA056, + 0xA057, 0xA058, 0xA059, 0xA05A, 0xA05B, 0xA05C, 0xA05D, 0xA05E, 0xA05F, + 0xA060, 0xA061, 0xA062, 0xA063, 0xA064, 0xA065, 0xA066, 0xA067, 0xA068, + 0xA069, 0xA06A, 0xA06B, 0xA06C, 0xA06D, 0xA06E, 0xA06F, 0xA070, 0xA071, + 0xA072, 0xA073, 0xA074, 0xA075, 0xA076, 0xA077, 0xA078, 0xA079, 0xA07A, + 0xA07B, 0xA07C, 0xA07D, 0xA07E, 0xA07F, 0xA080, 0xA081, 0xA082, 0xA083, + 0xA084, 0xA085, 0xA086, 0xA087, 0xA088, 0xA089, 0xA08A, 0xA08B, 0xA08C, + 0xA08D, 0xA08E, 0xA08F, 0xA090, 0xA091, 0xA092, 0xA093, 0xA094, 0xA095, + 0xA096, 0xA097, 0xA098, 0xA099, 0xA09A, 0xA09B, 0xA09C, 0xA09D, 0xA09E, + 0xA09F, 0xA0A0, 0xA0A1, 0xA0A2, 0xA0A3, 0xA0A4, 0xA0A5, 0xA0A6, 0xA0A7, + 0xA0A8, 0xA0A9, 0xA0AA, 0xA0AB, 0xA0AC, 0xA0AD, 0xA0AE, 0xA0AF, 0xA0B0, + 0xA0B1, 0xA0B2, 0xA0B3, 0xA0B4, 0xA0B5, 0xA0B6, 0xA0B7, 0xA0B8, 0xA0B9, + 0xA0BA, 0xA0BB, 0xA0BC, 0xA0BD, 0xA0BE, 0xA0BF, 0xA0C0, 0xA0C1, 0xA0C2, + 0xA0C3, 0xA0C4, 0xA0C5, 0xA0C6, 0xA0C7, 0xA0C8, 0xA0C9, 0xA0CA, 0xA0CB, + 0xA0CC, 0xA0CD, 0xA0CE, 0xA0CF, 0xA0D0, 0xA0D1, 0xA0D2, 0xA0D3, 0xA0D4, + 0xA0D5, 0xA0D6, 0xA0D7, 0xA0D8, 0xA0D9, 0xA0DA, 0xA0DB, 0xA0DC, 0xA0DD, + 0xA0DE, 0xA0DF, 0xA0E0, 0xA0E1, 0xA0E2, 0xA0E3, 0xA0E4, 0xA0E5, 0xA0E6, + 0xA0E7, 0xA0E8, 0xA0E9, 0xA0EA, 0xA0EB, 0xA0EC, 0xA0ED, 0xA0EE, 0xA0EF, + 0xA0F0, 0xA0F1, 0xA0F2, 0xA0F3, 0xA0F4, 0xA0F5, 0xA0F6, 0xA0F7, 0xA0F8, + 0xA0F9, 0xA0FA, 0xA0FB, 0xA0FC, 0xA0FD, 0xA0FE, 0xA0FF, 0xA100, 0xA101, + 0xA102, 0xA103, 0xA104, 0xA105, 0xA106, 0xA107, 0xA108, 0xA109, 0xA10A, + 0xA10B, 0xA10C, 0xA10D, 0xA10E, 0xA10F, 0xA110, 0xA111, 0xA112, 0xA113, + 0xA114, 0xA115, 0xA116, 0xA117, 0xA118, 0xA119, 0xA11A, 0xA11B, 0xA11C, + 0xA11D, 0xA11E, 0xA11F, 0xA120, 0xA121, 0xA122, 0xA123, 0xA124, 0xA125, + 0xA126, 0xA127, 0xA128, 0xA129, 0xA12A, 0xA12B, 0xA12C, 0xA12D, 0xA12E, + 0xA12F, 0xA130, 0xA131, 0xA132, 0xA133, 0xA134, 0xA135, 0xA136, 0xA137, + 0xA138, 0xA139, 0xA13A, 0xA13B, 0xA13C, 0xA13D, 0xA13E, 0xA13F, 0xA140, + 0xA141, 0xA142, 0xA143, 0xA144, 0xA145, 0xA146, 0xA147, 0xA148, 0xA149, + 0xA14A, 0xA14B, 0xA14C, 0xA14D, 0xA14E, 0xA14F, 0xA150, 0xA151, 0xA152, + 0xA153, 0xA154, 0xA155, 0xA156, 0xA157, 0xA158, 0xA159, 0xA15A, 0xA15B, + 0xA15C, 0xA15D, 0xA15E, 0xA15F, 0xA160, 0xA161, 0xA162, 0xA163, 0xA164, + 0xA165, 0xA166, 0xA167, 0xA168, 0xA169, 0xA16A, 0xA16B, 0xA16C, 0xA16D, + 0xA16E, 0xA16F, 0xA170, 0xA171, 0xA172, 0xA173, 0xA174, 0xA175, 0xA176, + 0xA177, 0xA178, 0xA179, 0xA17A, 0xA17B, 0xA17C, 0xA17D, 0xA17E, 0xA17F, + 0xA180, 0xA181, 0xA182, 0xA183, 0xA184, 0xA185, 0xA186, 0xA187, 0xA188, + 0xA189, 0xA18A, 0xA18B, 0xA18C, 0xA18D, 0xA18E, 0xA18F, 0xA190, 0xA191, + 0xA192, 0xA193, 0xA194, 0xA195, 0xA196, 0xA197, 0xA198, 0xA199, 0xA19A, + 0xA19B, 0xA19C, 0xA19D, 0xA19E, 0xA19F, 0xA1A0, 0xA1A1, 0xA1A2, 0xA1A3, + 0xA1A4, 0xA1A5, 0xA1A6, 0xA1A7, 0xA1A8, 0xA1A9, 0xA1AA, 0xA1AB, 0xA1AC, + 0xA1AD, 0xA1AE, 0xA1AF, 0xA1B0, 0xA1B1, 0xA1B2, 0xA1B3, 0xA1B4, 0xA1B5, + 0xA1B6, 0xA1B7, 0xA1B8, 0xA1B9, 0xA1BA, 0xA1BB, 0xA1BC, 0xA1BD, 0xA1BE, + 0xA1BF, 0xA1C0, 0xA1C1, 0xA1C2, 0xA1C3, 0xA1C4, 0xA1C5, 0xA1C6, 0xA1C7, + 0xA1C8, 0xA1C9, 0xA1CA, 0xA1CB, 0xA1CC, 0xA1CD, 0xA1CE, 0xA1CF, 0xA1D0, + 0xA1D1, 0xA1D2, 0xA1D3, 0xA1D4, 0xA1D5, 0xA1D6, 0xA1D7, 0xA1D8, 0xA1D9, + 0xA1DA, 0xA1DB, 0xA1DC, 0xA1DD, 0xA1DE, 0xA1DF, 0xA1E0, 0xA1E1, 0xA1E2, + 0xA1E3, 0xA1E4, 0xA1E5, 0xA1E6, 0xA1E7, 0xA1E8, 0xA1E9, 0xA1EA, 0xA1EB, + 0xA1EC, 0xA1ED, 0xA1EE, 0xA1EF, 0xA1F0, 0xA1F1, 0xA1F2, 0xA1F3, 0xA1F4, + 0xA1F5, 0xA1F6, 0xA1F7, 0xA1F8, 0xA1F9, 0xA1FA, 0xA1FB, 0xA1FC, 0xA1FD, + 0xA1FE, 0xA1FF, 0xA200, 0xA201, 0xA202, 0xA203, 0xA204, 0xA205, 0xA206, + 0xA207, 0xA208, 0xA209, 0xA20A, 0xA20B, 0xA20C, 0xA20D, 0xA20E, 0xA20F, + 0xA210, 0xA211, 0xA212, 0xA213, 0xA214, 0xA215, 0xA216, 0xA217, 0xA218, + 0xA219, 0xA21A, 0xA21B, 0xA21C, 0xA21D, 0xA21E, 0xA21F, 0xA220, 0xA221, + 0xA222, 0xA223, 0xA224, 0xA225, 0xA226, 0xA227, 0xA228, 0xA229, 0xA22A, + 0xA22B, 0xA22C, 0xA22D, 0xA22E, 0xA22F, 0xA230, 0xA231, 0xA232, 0xA233, + 0xA234, 0xA235, 0xA236, 0xA237, 0xA238, 0xA239, 0xA23A, 0xA23B, 0xA23C, + 0xA23D, 0xA23E, 0xA23F, 0xA240, 0xA241, 0xA242, 0xA243, 0xA244, 0xA245, + 0xA246, 0xA247, 0xA248, 0xA249, 0xA24A, 0xA24B, 0xA24C, 0xA24D, 0xA24E, + 0xA24F, 0xA250, 0xA251, 0xA252, 0xA253, 0xA254, 0xA255, 0xA256, 0xA257, + 0xA258, 0xA259, 0xA25A, 0xA25B, 0xA25C, 0xA25D, 0xA25E, 0xA25F, 0xA260, + 0xA261, 0xA262, 0xA263, 0xA264, 0xA265, 0xA266, 0xA267, 0xA268, 0xA269, + 0xA26A, 0xA26B, 0xA26C, 0xA26D, 0xA26E, 0xA26F, 0xA270, 0xA271, 0xA272, + 0xA273, 0xA274, 0xA275, 0xA276, 0xA277, 0xA278, 0xA279, 0xA27A, 0xA27B, + 0xA27C, 0xA27D, 0xA27E, 0xA27F, 0xA280, 0xA281, 0xA282, 0xA283, 0xA284, + 0xA285, 0xA286, 0xA287, 0xA288, 0xA289, 0xA28A, 0xA28B, 0xA28C, 0xA28D, + 0xA28E, 0xA28F, 0xA290, 0xA291, 0xA292, 0xA293, 0xA294, 0xA295, 0xA296, + 0xA297, 0xA298, 0xA299, 0xA29A, 0xA29B, 0xA29C, 0xA29D, 0xA29E, 0xA29F, + 0xA2A0, 0xA2A1, 0xA2A2, 0xA2A3, 0xA2A4, 0xA2A5, 0xA2A6, 0xA2A7, 0xA2A8, + 0xA2A9, 0xA2AA, 0xA2AB, 0xA2AC, 0xA2AD, 0xA2AE, 0xA2AF, 0xA2B0, 0xA2B1, + 0xA2B2, 0xA2B3, 0xA2B4, 0xA2B5, 0xA2B6, 0xA2B7, 0xA2B8, 0xA2B9, 0xA2BA, + 0xA2BB, 0xA2BC, 0xA2BD, 0xA2BE, 0xA2BF, 0xA2C0, 0xA2C1, 0xA2C2, 0xA2C3, + 0xA2C4, 0xA2C5, 0xA2C6, 0xA2C7, 0xA2C8, 0xA2C9, 0xA2CA, 0xA2CB, 0xA2CC, + 0xA2CD, 0xA2CE, 0xA2CF, 0xA2D0, 0xA2D1, 0xA2D2, 0xA2D3, 0xA2D4, 0xA2D5, + 0xA2D6, 0xA2D7, 0xA2D8, 0xA2D9, 0xA2DA, 0xA2DB, 0xA2DC, 0xA2DD, 0xA2DE, + 0xA2DF, 0xA2E0, 0xA2E1, 0xA2E2, 0xA2E3, 0xA2E4, 0xA2E5, 0xA2E6, 0xA2E7, + 0xA2E8, 0xA2E9, 0xA2EA, 0xA2EB, 0xA2EC, 0xA2ED, 0xA2EE, 0xA2EF, 0xA2F0, + 0xA2F1, 0xA2F2, 0xA2F3, 0xA2F4, 0xA2F5, 0xA2F6, 0xA2F7, 0xA2F8, 0xA2F9, + 0xA2FA, 0xA2FB, 0xA2FC, 0xA2FD, 0xA2FE, 0xA2FF, 0xA300, 0xA301, 0xA302, + 0xA303, 0xA304, 0xA305, 0xA306, 0xA307, 0xA308, 0xA309, 0xA30A, 0xA30B, + 0xA30C, 0xA30D, 0xA30E, 0xA30F, 0xA310, 0xA311, 0xA312, 0xA313, 0xA314, + 0xA315, 0xA316, 0xA317, 0xA318, 0xA319, 0xA31A, 0xA31B, 0xA31C, 0xA31D, + 0xA31E, 0xA31F, 0xA320, 0xA321, 0xA322, 0xA323, 0xA324, 0xA325, 0xA326, + 0xA327, 0xA328, 0xA329, 0xA32A, 0xA32B, 0xA32C, 0xA32D, 0xA32E, 0xA32F, + 0xA330, 0xA331, 0xA332, 0xA333, 0xA334, 0xA335, 0xA336, 0xA337, 0xA338, + 0xA339, 0xA33A, 0xA33B, 0xA33C, 0xA33D, 0xA33E, 0xA33F, 0xA340, 0xA341, + 0xA342, 0xA343, 0xA344, 0xA345, 0xA346, 0xA347, 0xA348, 0xA349, 0xA34A, + 0xA34B, 0xA34C, 0xA34D, 0xA34E, 0xA34F, 0xA350, 0xA351, 0xA352, 0xA353, + 0xA354, 0xA355, 0xA356, 0xA357, 0xA358, 0xA359, 0xA35A, 0xA35B, 0xA35C, + 0xA35D, 0xA35E, 0xA35F, 0xA360, 0xA361, 0xA362, 0xA363, 0xA364, 0xA365, + 0xA366, 0xA367, 0xA368, 0xA369, 0xA36A, 0xA36B, 0xA36C, 0xA36D, 0xA36E, + 0xA36F, 0xA370, 0xA371, 0xA372, 0xA373, 0xA374, 0xA375, 0xA376, 0xA377, + 0xA378, 0xA379, 0xA37A, 0xA37B, 0xA37C, 0xA37D, 0xA37E, 0xA37F, 0xA380, + 0xA381, 0xA382, 0xA383, 0xA384, 0xA385, 0xA386, 0xA387, 0xA388, 0xA389, + 0xA38A, 0xA38B, 0xA38C, 0xA38D, 0xA38E, 0xA38F, 0xA390, 0xA391, 0xA392, + 0xA393, 0xA394, 0xA395, 0xA396, 0xA397, 0xA398, 0xA399, 0xA39A, 0xA39B, + 0xA39C, 0xA39D, 0xA39E, 0xA39F, 0xA3A0, 0xA3A1, 0xA3A2, 0xA3A3, 0xA3A4, + 0xA3A5, 0xA3A6, 0xA3A7, 0xA3A8, 0xA3A9, 0xA3AA, 0xA3AB, 0xA3AC, 0xA3AD, + 0xA3AE, 0xA3AF, 0xA3B0, 0xA3B1, 0xA3B2, 0xA3B3, 0xA3B4, 0xA3B5, 0xA3B6, + 0xA3B7, 0xA3B8, 0xA3B9, 0xA3BA, 0xA3BB, 0xA3BC, 0xA3BD, 0xA3BE, 0xA3BF, + 0xA3C0, 0xA3C1, 0xA3C2, 0xA3C3, 0xA3C4, 0xA3C5, 0xA3C6, 0xA3C7, 0xA3C8, + 0xA3C9, 0xA3CA, 0xA3CB, 0xA3CC, 0xA3CD, 0xA3CE, 0xA3CF, 0xA3D0, 0xA3D1, + 0xA3D2, 0xA3D3, 0xA3D4, 0xA3D5, 0xA3D6, 0xA3D7, 0xA3D8, 0xA3D9, 0xA3DA, + 0xA3DB, 0xA3DC, 0xA3DD, 0xA3DE, 0xA3DF, 0xA3E0, 0xA3E1, 0xA3E2, 0xA3E3, + 0xA3E4, 0xA3E5, 0xA3E6, 0xA3E7, 0xA3E8, 0xA3E9, 0xA3EA, 0xA3EB, 0xA3EC, + 0xA3ED, 0xA3EE, 0xA3EF, 0xA3F0, 0xA3F1, 0xA3F2, 0xA3F3, 0xA3F4, 0xA3F5, + 0xA3F6, 0xA3F7, 0xA3F8, 0xA3F9, 0xA3FA, 0xA3FB, 0xA3FC, 0xA3FD, 0xA3FE, + 0xA3FF, 0xA400, 0xA401, 0xA402, 0xA403, 0xA404, 0xA405, 0xA406, 0xA407, + 0xA408, 0xA409, 0xA40A, 0xA40B, 0xA40C, 0xA40D, 0xA40E, 0xA40F, 0xA410, + 0xA411, 0xA412, 0xA413, 0xA414, 0xA415, 0xA416, 0xA417, 0xA418, 0xA419, + 0xA41A, 0xA41B, 0xA41C, 0xA41D, 0xA41E, 0xA41F, 0xA420, 0xA421, 0xA422, + 0xA423, 0xA424, 0xA425, 0xA426, 0xA427, 0xA428, 0xA429, 0xA42A, 0xA42B, + 0xA42C, 0xA42D, 0xA42E, 0xA42F, 0xA430, 0xA431, 0xA432, 0xA433, 0xA434, + 0xA435, 0xA436, 0xA437, 0xA438, 0xA439, 0xA43A, 0xA43B, 0xA43C, 0xA43D, + 0xA43E, 0xA43F, 0xA440, 0xA441, 0xA442, 0xA443, 0xA444, 0xA445, 0xA446, + 0xA447, 0xA448, 0xA449, 0xA44A, 0xA44B, 0xA44C, 0xA44D, 0xA44E, 0xA44F, + 0xA450, 0xA451, 0xA452, 0xA453, 0xA454, 0xA455, 0xA456, 0xA457, 0xA458, + 0xA459, 0xA45A, 0xA45B, 0xA45C, 0xA45D, 0xA45E, 0xA45F, 0xA460, 0xA461, + 0xA462, 0xA463, 0xA464, 0xA465, 0xA466, 0xA467, 0xA468, 0xA469, 0xA46A, + 0xA46B, 0xA46C, 0xA46D, 0xA46E, 0xA46F, 0xA470, 0xA471, 0xA472, 0xA473, + 0xA474, 0xA475, 0xA476, 0xA477, 0xA478, 0xA479, 0xA47A, 0xA47B, 0xA47C, + 0xA47D, 0xA47E, 0xA47F, 0xA480, 0xA481, 0xA482, 0xA483, 0xA484, 0xA485, + 0xA486, 0xA487, 0xA488, 0xA489, 0xA48A, 0xA48B, 0xA48C, 0xA490, 0xA491, + 0xA492, 0xA493, 0xA494, 0xA495, 0xA496, 0xA497, 0xA498, 0xA499, 0xA49A, + 0xA49B, 0xA49C, 0xA49D, 0xA49E, 0xA49F, 0xA4A0, 0xA4A1, 0xA4A2, 0xA4A3, + 0xA4A4, 0xA4A5, 0xA4A6, 0xA4A7, 0xA4A8, 0xA4A9, 0xA4AA, 0xA4AB, 0xA4AC, + 0xA4AD, 0xA4AE, 0xA4AF, 0xA4B0, 0xA4B1, 0xA4B2, 0xA4B3, 0xA4B4, 0xA4B5, + 0xA4B6, 0xA4B7, 0xA4B8, 0xA4B9, 0xA4BA, 0xA4BB, 0xA4BC, 0xA4BD, 0xA4BE, + 0xA4BF, 0xA4C0, 0xA4C1, 0xA4C2, 0xA4C3, 0xA4C4, 0xA4C5, 0xA4C6, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GB-EUC-H_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GB-EUC-H_0.cpp new file mode 100644 index 000000000000..9bbfe32ec06d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GB-EUC-H_0.cpp @@ -0,0 +1,40 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +const uint16_t g_FXCMAP_GB_EUC_H_0[90 * 3] = { + 0x0020, 0x0020, 0x1E24, 0x0021, 0x007E, 0x032E, 0xA1A1, 0xA1FE, 0x0060, + 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA, + 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7, + 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A, + 0xA7D1, 0xA7F1, 0x027B, 0xA8A1, 0xA8C0, 0x029C, 0xA8C5, 0xA8EA, 0x02BC, + 0xA9A4, 0xA9EF, 0x02E2, 0xAAA1, 0xAAFE, 0x032E, 0xABA1, 0xABC0, 0x038C, + 0xB0A1, 0xB0FE, 0x03AC, 0xB1A1, 0xB1FE, 0x040A, 0xB2A1, 0xB2FE, 0x0468, + 0xB3A1, 0xB3FE, 0x04C6, 0xB4A1, 0xB4FE, 0x0524, 0xB5A1, 0xB5FE, 0x0582, + 0xB6A1, 0xB6FE, 0x05E0, 0xB7A1, 0xB7FE, 0x063E, 0xB8A1, 0xB8FE, 0x069C, + 0xB9A1, 0xB9FE, 0x06FA, 0xBAA1, 0xBAFE, 0x0758, 0xBBA1, 0xBBFE, 0x07B6, + 0xBCA1, 0xBCFE, 0x0814, 0xBDA1, 0xBDFE, 0x0872, 0xBEA1, 0xBEFE, 0x08D0, + 0xBFA1, 0xBFFE, 0x092E, 0xC0A1, 0xC0FE, 0x098C, 0xC1A1, 0xC1FE, 0x09EA, + 0xC2A1, 0xC2FE, 0x0A48, 0xC3A1, 0xC3FE, 0x0AA6, 0xC4A1, 0xC4FE, 0x0B04, + 0xC5A1, 0xC5FE, 0x0B62, 0xC6A1, 0xC6FE, 0x0BC0, 0xC7A1, 0xC7FE, 0x0C1E, + 0xC8A1, 0xC8FE, 0x0C7C, 0xC9A1, 0xC9FE, 0x0CDA, 0xCAA1, 0xCAFE, 0x0D38, + 0xCBA1, 0xCBFE, 0x0D96, 0xCCA1, 0xCCFE, 0x0DF4, 0xCDA1, 0xCDFE, 0x0E52, + 0xCEA1, 0xCEFE, 0x0EB0, 0xCFA1, 0xCFFE, 0x0F0E, 0xD0A1, 0xD0FE, 0x0F6C, + 0xD1A1, 0xD1FE, 0x0FCA, 0xD2A1, 0xD2FE, 0x1028, 0xD3A1, 0xD3FE, 0x1086, + 0xD4A1, 0xD4FE, 0x10E4, 0xD5A1, 0xD5FE, 0x1142, 0xD6A1, 0xD6FE, 0x11A0, + 0xD7A1, 0xD7F9, 0x11FE, 0xD8A1, 0xD8FE, 0x1257, 0xD9A1, 0xD9FE, 0x12B5, + 0xDAA1, 0xDAFE, 0x1313, 0xDBA1, 0xDBFE, 0x1371, 0xDCA1, 0xDCFE, 0x13CF, + 0xDDA1, 0xDDFE, 0x142D, 0xDEA1, 0xDEFE, 0x148B, 0xDFA1, 0xDFFE, 0x14E9, + 0xE0A1, 0xE0FE, 0x1547, 0xE1A1, 0xE1FE, 0x15A5, 0xE2A1, 0xE2FE, 0x1603, + 0xE3A1, 0xE3FE, 0x1661, 0xE4A1, 0xE4FE, 0x16BF, 0xE5A1, 0xE5FE, 0x171D, + 0xE6A1, 0xE6FE, 0x177B, 0xE7A1, 0xE7FE, 0x17D9, 0xE8A1, 0xE8FE, 0x1837, + 0xE9A1, 0xE9FE, 0x1895, 0xEAA1, 0xEAFE, 0x18F3, 0xEBA1, 0xEBFE, 0x1951, + 0xECA1, 0xECFE, 0x19AF, 0xEDA1, 0xEDFE, 0x1A0D, 0xEEA1, 0xEEFE, 0x1A6B, + 0xEFA1, 0xEFFE, 0x1AC9, 0xF0A1, 0xF0FE, 0x1B27, 0xF1A1, 0xF1FE, 0x1B85, + 0xF2A1, 0xF2FE, 0x1BE3, 0xF3A1, 0xF3FE, 0x1C41, 0xF4A1, 0xF4FE, 0x1C9F, + 0xF5A1, 0xF5FE, 0x1CFD, 0xF6A1, 0xF6FE, 0x1D5B, 0xF7A1, 0xF7FE, 0x1DB9, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GB-EUC-V_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GB-EUC-V_0.cpp new file mode 100644 index 000000000000..19bd4182fb54 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GB-EUC-V_0.cpp @@ -0,0 +1,17 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +const uint16_t g_FXCMAP_GB_EUC_V_0[20 * 3] = { + 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256, + 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246, + 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244, + 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240, + 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D, + 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254, + 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK-EUC-H_2.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK-EUC-H_2.cpp new file mode 100644 index 000000000000..617f020b8411 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK-EUC-H_2.cpp @@ -0,0 +1,1367 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +const uint16_t g_FXCMAP_GBK_EUC_H_2[4071 * 3] = { + 0x0020, 0x0020, 0x1E24, 0x0021, 0x007E, 0x032E, 0x8140, 0x8178, 0x2758, + 0x8179, 0x8179, 0x2059, 0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796, + 0x8186, 0x8186, 0x21F1, 0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2, + 0x81EE, 0x81F5, 0x2802, 0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A, + 0x8240, 0x8252, 0x2812, 0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825, + 0x8262, 0x8262, 0x21B5, 0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC, + 0x8275, 0x8279, 0x2844, 0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849, + 0x827D, 0x827D, 0x1E62, 0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20, + 0x8281, 0x8282, 0x284C, 0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E, + 0x8290, 0x8290, 0x205C, 0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194, + 0x82A6, 0x82C7, 0x286E, 0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281, + 0x82CA, 0x82E0, 0x2890, 0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7, + 0x82E3, 0x82E3, 0x210A, 0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8, + 0x82ED, 0x82ED, 0x267F, 0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E, + 0x82F3, 0x82F6, 0x28B4, 0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB, + 0x82F9, 0x82F9, 0x226C, 0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117, + 0x82FC, 0x82FE, 0x28B9, 0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8, + 0x8342, 0x8344, 0x28BD, 0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0, + 0x8348, 0x8348, 0x1FB9, 0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8, + 0x834D, 0x8352, 0x28C5, 0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB, + 0x8357, 0x8357, 0x20C2, 0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195, + 0x835F, 0x8364, 0x28D4, 0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3, + 0x8367, 0x8371, 0x28DA, 0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5, + 0x8378, 0x8378, 0x2210, 0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF, + 0x837B, 0x837B, 0x28EB, 0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC, + 0x837E, 0x837E, 0x1FE4, 0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED, + 0x8386, 0x8386, 0x22D6, 0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0, + 0x838A, 0x838A, 0x22CE, 0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681, + 0x838E, 0x8393, 0x28F6, 0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC, + 0x839E, 0x839E, 0x2231, 0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93, + 0x83A7, 0x83AA, 0x290C, 0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910, + 0x83AE, 0x83AE, 0x22D7, 0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1, + 0x83B1, 0x83B9, 0x2912, 0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B, + 0x83C9, 0x83C9, 0x2025, 0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF, + 0x83F7, 0x83FE, 0x2955, 0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9, + 0x8451, 0x8470, 0x296D, 0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D, + 0x8474, 0x8474, 0x2263, 0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683, + 0x8478, 0x847E, 0x2991, 0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17, + 0x8483, 0x848D, 0x299A, 0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5, + 0x8492, 0x8492, 0x22CA, 0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8, + 0x849D, 0x849D, 0x1F4F, 0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF, + 0x84A2, 0x84A2, 0x2036, 0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4, + 0x84A5, 0x84A5, 0x22C9, 0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5, + 0x84A9, 0x84A9, 0x1F75, 0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE, + 0x84C6, 0x84D2, 0x29D2, 0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF, + 0x84D5, 0x84D5, 0x21A9, 0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6, + 0x84D8, 0x84D8, 0x29E1, 0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003, + 0x84DB, 0x84DC, 0x29E2, 0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4, + 0x84EA, 0x84EA, 0x2323, 0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011, + 0x84EF, 0x84F0, 0x29F3, 0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5, + 0x8540, 0x8550, 0x2A02, 0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E, + 0x8553, 0x8553, 0x2A13, 0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14, + 0x855E, 0x855E, 0x20EF, 0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0, + 0x8567, 0x857E, 0x2A24, 0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1, + 0x8588, 0x858A, 0x2A43, 0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46, + 0x8592, 0x8592, 0x21F9, 0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010, + 0x8597, 0x8597, 0x2A4F, 0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50, + 0x85A2, 0x85A2, 0x1E5A, 0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2, + 0x85B3, 0x85FE, 0x2A68, 0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D, + 0x864B, 0x8653, 0x2ABE, 0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7, + 0x8668, 0x8668, 0x236C, 0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0, + 0x8696, 0x8696, 0x219C, 0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9, + 0x869A, 0x86A0, 0x2B08, 0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F, + 0x86CA, 0x86CA, 0x210B, 0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE, + 0x86CD, 0x86CD, 0x2B38, 0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39, + 0x86D1, 0x86D1, 0x222C, 0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8, + 0x86DD, 0x86DD, 0x22C0, 0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F, + 0x86E2, 0x86E7, 0x2B48, 0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E, + 0x86EE, 0x86EE, 0x2379, 0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372, + 0x86F5, 0x86FE, 0x2B58, 0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62, + 0x8744, 0x8744, 0x237C, 0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0, + 0x874A, 0x874A, 0x2B69, 0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74, + 0x874D, 0x874E, 0x2B6A, 0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C, + 0x8757, 0x8757, 0x1F4C, 0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378, + 0x875B, 0x875B, 0x21CF, 0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75, + 0x875E, 0x875E, 0x2371, 0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369, + 0x8761, 0x8765, 0x2B77, 0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C, + 0x877A, 0x877A, 0x236F, 0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370, + 0x877E, 0x877E, 0x2B91, 0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376, + 0x8782, 0x8782, 0x2373, 0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F, + 0x8787, 0x8787, 0x2B96, 0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97, + 0x878A, 0x878A, 0x20B5, 0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB, + 0x878E, 0x878E, 0x2672, 0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E, + 0x8794, 0x8797, 0x2B9E, 0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2, + 0x879D, 0x879D, 0x2375, 0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382, + 0x87A4, 0x87A6, 0x2BAB, 0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE, + 0x87B3, 0x87B3, 0x236B, 0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039, + 0x87B6, 0x87BA, 0x2BBA, 0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF, + 0x87BF, 0x87BF, 0x237D, 0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2, + 0x87C2, 0x87C2, 0x2381, 0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B, + 0x87CB, 0x87CB, 0x237E, 0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA, + 0x87CF, 0x87CF, 0x22DB, 0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A, + 0x87D3, 0x87D3, 0x2689, 0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697, + 0x87D6, 0x87D9, 0x2BCF, 0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3, + 0x87F7, 0x87F7, 0x2383, 0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF, + 0x87FA, 0x87FA, 0x218F, 0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246, + 0x8841, 0x8841, 0x2248, 0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E, + 0x8845, 0x8845, 0x2BF6, 0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7, + 0x8880, 0x88B9, 0x2C2F, 0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69, + 0x88CC, 0x88CC, 0x228B, 0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85, + 0x88D5, 0x88D6, 0x2C81, 0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83, + 0x88DF, 0x88DF, 0x232C, 0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E, + 0x88E6, 0x88F1, 0x2C8F, 0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38, + 0x88F4, 0x88F5, 0x2C9B, 0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D, + 0x8940, 0x894A, 0x2CA5, 0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339, + 0x894D, 0x894D, 0x2CB0, 0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1, + 0x8950, 0x8950, 0x232D, 0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F, + 0x8955, 0x895C, 0x2CB5, 0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD, + 0x895F, 0x895F, 0x232F, 0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D, + 0x896E, 0x8970, 0x2CCB, 0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE, + 0x897C, 0x897C, 0x1EC2, 0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA, + 0x898B, 0x898B, 0x22B2, 0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF, + 0x899A, 0x899D, 0x2CF2, 0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6, + 0x89A6, 0x89A6, 0x20D9, 0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD, + 0x89A9, 0x89AE, 0x2CFE, 0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04, + 0x89BA, 0x89BA, 0x21ED, 0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007, + 0x89BF, 0x89BF, 0x2326, 0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11, + 0x89C4, 0x89C4, 0x1F52, 0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328, + 0x89C7, 0x89C7, 0x2D14, 0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15, + 0x89CE, 0x89CE, 0x1E2B, 0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE, + 0x89D2, 0x89D7, 0x2D1C, 0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22, + 0x89DB, 0x89DB, 0x2138, 0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081, + 0x89F5, 0x89FE, 0x2D3C, 0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C, + 0x8A42, 0x8A58, 0x2D47, 0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE, + 0x8A5B, 0x8A5B, 0x2D5E, 0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F, + 0x8A5E, 0x8A5E, 0x1EFA, 0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD, + 0x8A7A, 0x8A7E, 0x2D7A, 0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F, + 0x8AE5, 0x8AFE, 0x2DE3, 0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E, + 0x8B45, 0x8B48, 0x2E01, 0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05, + 0x8B7A, 0x8B7A, 0x23FC, 0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39, + 0x8B8C, 0x8B8C, 0x2069, 0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7, + 0x8B9F, 0x8BB2, 0x2E56, 0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A, + 0x8BB9, 0x8BB9, 0x23FD, 0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8, + 0x8BBF, 0x8BC5, 0x2E73, 0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A, + 0x8BC8, 0x8BC8, 0x23FE, 0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B, + 0x8BD4, 0x8BD4, 0x2401, 0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF, + 0x8BDD, 0x8BE4, 0x2E8C, 0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94, + 0x8BEB, 0x8BEB, 0x2221, 0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122, + 0x8BF1, 0x8BFE, 0x2E9D, 0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB, + 0x8C45, 0x8C4E, 0x2EAF, 0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9, + 0x8C57, 0x8C57, 0x21E5, 0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057, + 0x8C5D, 0x8C7E, 0x2EC4, 0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5, + 0x8C8C, 0x8C8C, 0x2EF1, 0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3, + 0x8C8F, 0x8C8F, 0x2121, 0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4, + 0x8C92, 0x8C92, 0x1FE5, 0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A, + 0x8C9A, 0x8C9A, 0x1E37, 0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E, + 0x8CA3, 0x8CA3, 0x22A6, 0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00, + 0x8CA6, 0x8CA6, 0x1EDA, 0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01, + 0x8CC0, 0x8CC0, 0x235C, 0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050, + 0x8CD3, 0x8CD3, 0x1E67, 0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4, + 0x8CD6, 0x8CD8, 0x2F2B, 0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E, + 0x8CF9, 0x8CF9, 0x1F16, 0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52, + 0x8D73, 0x8D73, 0x2389, 0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7, + 0x8D76, 0x8D7A, 0x2F86, 0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B, + 0x8D80, 0x8D87, 0x2F8E, 0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96, + 0x8D8F, 0x8D8F, 0x1F1A, 0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B, + 0x8D9F, 0x8DB8, 0x2FAA, 0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4, + 0x8DE2, 0x8DE2, 0x2391, 0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271, + 0x8DE5, 0x8DE6, 0x2FED, 0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF, + 0x8DF7, 0x8DF7, 0x238E, 0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D, + 0x8E40, 0x8E45, 0x3004, 0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A, + 0x8E56, 0x8E56, 0x2390, 0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033, + 0x8E59, 0x8E59, 0x301A, 0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B, + 0x8E68, 0x8E68, 0x1FE9, 0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055, + 0x8E6F, 0x8E6F, 0x302D, 0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E, + 0x8E80, 0x8E80, 0x2324, 0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143, + 0x8E9C, 0x8E9E, 0x3056, 0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059, + 0x8EA4, 0x8EA4, 0x2277, 0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7, + 0x8EA8, 0x8EAB, 0x305F, 0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063, + 0x8EAE, 0x8EAE, 0x2384, 0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387, + 0x8EBE, 0x8EBE, 0x2386, 0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290, + 0x8EC4, 0x8EC4, 0x3076, 0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077, + 0x8ECD, 0x8ECD, 0x1E32, 0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E, + 0x8ED6, 0x8ED6, 0x1F13, 0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085, + 0x8EEC, 0x8EEC, 0x1FE0, 0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB, + 0x8F52, 0x8F52, 0x2087, 0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE, + 0x8F55, 0x8F55, 0x1EF6, 0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD, + 0x8F5D, 0x8F5D, 0x2045, 0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178, + 0x8F65, 0x8F7E, 0x30C9, 0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5, + 0x8F87, 0x8F87, 0x30E9, 0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA, + 0x8F95, 0x8F95, 0x266E, 0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0, + 0x8F98, 0x8F9A, 0x30F7, 0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA, + 0x8F9D, 0x8F9D, 0x2188, 0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C, + 0x8FA2, 0x8FBC, 0x30FE, 0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119, + 0x8FC4, 0x8FC4, 0x1EA1, 0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393, + 0x8FC7, 0x8FCC, 0x3120, 0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126, + 0x8FD8, 0x8FD8, 0x1E7C, 0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156, + 0x9080, 0x909C, 0x3195, 0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E, + 0x909F, 0x90B9, 0x31B2, 0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD, + 0x90C0, 0x90C0, 0x2095, 0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2, + 0x90C5, 0x90C5, 0x23B9, 0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28, + 0x90DC, 0x90DC, 0x23BD, 0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5, + 0x90EE, 0x90EF, 0x31FA, 0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC, + 0x90F7, 0x90F7, 0x23B3, 0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209, + 0x9142, 0x9142, 0x2162, 0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E, + 0x914C, 0x914C, 0x3213, 0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214, + 0x9151, 0x9151, 0x23B7, 0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F, + 0x9155, 0x9155, 0x24DF, 0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2, + 0x915A, 0x915A, 0x214E, 0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052, + 0x915E, 0x9160, 0x321E, 0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221, + 0x9163, 0x9163, 0x20EB, 0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232, + 0x916F, 0x9175, 0x322C, 0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233, + 0x917A, 0x917A, 0x201B, 0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE, + 0x917D, 0x917E, 0x3236, 0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE, + 0x9185, 0x918C, 0x323C, 0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244, + 0x9191, 0x9191, 0x2089, 0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1, + 0x9194, 0x9196, 0x3248, 0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B, + 0x919B, 0x919B, 0x2214, 0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE, + 0x91AA, 0x91AA, 0x2223, 0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B, + 0x91BA, 0x91BA, 0x268C, 0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269, + 0x91BF, 0x91BF, 0x24E0, 0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8, + 0x91C4, 0x91CC, 0x326F, 0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278, + 0x91D0, 0x91D0, 0x1FFE, 0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1, + 0x91D3, 0x91D3, 0x327A, 0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B, + 0x91D6, 0x91D6, 0x1FCE, 0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E, + 0x91D9, 0x91D9, 0x2021, 0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1, + 0x91E0, 0x91E1, 0x3282, 0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284, + 0x91EA, 0x91EA, 0x24A4, 0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273, + 0x91F1, 0x91F1, 0x3290, 0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291, + 0x9240, 0x927E, 0x329D, 0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1, + 0x92B7, 0x92CD, 0x3312, 0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329, + 0x92D0, 0x92D0, 0x235D, 0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682, + 0x92D5, 0x92DE, 0x332D, 0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A, + 0x92E1, 0x92FD, 0x3337, 0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354, + 0x9350, 0x9350, 0x21FF, 0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58, + 0x935E, 0x936F, 0x3370, 0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382, + 0x9376, 0x9376, 0x1EB6, 0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F, + 0x938C, 0x938C, 0x20DB, 0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360, + 0x939E, 0x93A4, 0x33AB, 0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2, + 0x93A7, 0x93A7, 0x2040, 0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E, + 0x93B5, 0x93B7, 0x33BF, 0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2, + 0x93BB, 0x93BB, 0x235E, 0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A, + 0x93BE, 0x93C5, 0x33C5, 0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD, + 0x93CF, 0x93CF, 0x2093, 0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F, + 0x93D8, 0x93DA, 0x33DC, 0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54, + 0x93DD, 0x93E0, 0x33DF, 0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3, + 0x93E4, 0x93E4, 0x20C0, 0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5, + 0x93E9, 0x93E9, 0x2160, 0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D, + 0x93EC, 0x93EC, 0x1F8E, 0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9, + 0x93EF, 0x93EF, 0x2047, 0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262, + 0x93F2, 0x93F3, 0x33EB, 0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2, + 0x93F6, 0x93F9, 0x33ED, 0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1, + 0x93FE, 0x93FE, 0x1FCC, 0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72, + 0x9445, 0x944C, 0x33F8, 0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400, + 0x9450, 0x9450, 0x1E52, 0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C, + 0x9453, 0x9453, 0x228F, 0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED, + 0x9456, 0x9457, 0x3403, 0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405, + 0x945B, 0x945B, 0x1E2D, 0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366, + 0x945E, 0x945E, 0x3407, 0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408, + 0x9464, 0x9464, 0x2363, 0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A, + 0x9467, 0x946D, 0x340D, 0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414, + 0x9472, 0x9472, 0x1FF6, 0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364, + 0x9475, 0x9475, 0x3418, 0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419, + 0x9478, 0x9478, 0x2367, 0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D, + 0x947B, 0x947E, 0x341B, 0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056, + 0x9482, 0x9482, 0x2163, 0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9, + 0x9488, 0x9488, 0x1FFC, 0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E, + 0x94A2, 0x94B2, 0x343B, 0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C, + 0x94B5, 0x94B5, 0x2142, 0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E, + 0x94C0, 0x94C0, 0x1E43, 0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4, + 0x94CD, 0x94D7, 0x3461, 0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C, + 0x94E0, 0x94E0, 0x1ED7, 0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491, + 0x9572, 0x9572, 0x212D, 0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF, + 0x9583, 0x9583, 0x229B, 0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256, + 0x959F, 0x959F, 0x24A8, 0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79, + 0x95B4, 0x95B9, 0x34FF, 0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505, + 0x95CF, 0x95CF, 0x24A7, 0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686, + 0x95D2, 0x95D2, 0x24A6, 0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE, + 0x95D5, 0x95E0, 0x351B, 0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527, + 0x95E7, 0x95E7, 0x1FE7, 0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112, + 0x95F2, 0x95F7, 0x3535, 0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B, + 0x95FE, 0x95FE, 0x1F5C, 0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4, + 0x9657, 0x967B, 0x3556, 0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B, + 0x9680, 0x96FE, 0x357D, 0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A, + 0x9768, 0x976B, 0x3623, 0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627, + 0x976E, 0x976E, 0x246D, 0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638, + 0x9796, 0x9796, 0x246B, 0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E, + 0x979D, 0x979D, 0x1ECE, 0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272, + 0x97A4, 0x97BE, 0x3658, 0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673, + 0x97EE, 0x97EE, 0x21FE, 0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE, + 0x97F8, 0x97FE, 0x36A9, 0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475, + 0x9846, 0x9848, 0x36B5, 0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8, + 0x984F, 0x984F, 0x1F6F, 0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468, + 0x9872, 0x9872, 0x36DE, 0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF, + 0x9880, 0x9880, 0x36EA, 0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB, + 0x988B, 0x988B, 0x1F27, 0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4, + 0x98A0, 0x98A0, 0x247C, 0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1, + 0x98AB, 0x98B5, 0x3710, 0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005, + 0x98B8, 0x98B9, 0x371B, 0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D, + 0x98C7, 0x98C7, 0x203E, 0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C, + 0x98CC, 0x98CF, 0x372C, 0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730, + 0x98D3, 0x98D3, 0x2204, 0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3, + 0x98E4, 0x98E4, 0x2140, 0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741, + 0x98EF, 0x98EF, 0x2474, 0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD, + 0x98F3, 0x98FE, 0x374C, 0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68, + 0x9944, 0x9944, 0x375B, 0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C, + 0x9966, 0x9966, 0x2472, 0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5, + 0x996F, 0x9974, 0x3783, 0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789, + 0x997A, 0x997A, 0x1F8B, 0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D, + 0x9980, 0x9984, 0x3790, 0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795, + 0x9989, 0x9989, 0x2482, 0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1, + 0x998F, 0x9990, 0x379C, 0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E, + 0x9999, 0x9999, 0x1F38, 0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485, + 0x99AA, 0x99AF, 0x37B4, 0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E, + 0x99B2, 0x99B2, 0x37BA, 0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486, + 0x99B5, 0x99B5, 0x2471, 0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483, + 0x99BE, 0x99BE, 0x2470, 0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469, + 0x99C1, 0x99C1, 0x37C3, 0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4, + 0x99C9, 0x99C9, 0x246F, 0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481, + 0x99CF, 0x99D0, 0x37CE, 0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0, + 0x99DA, 0x99DA, 0x1FF5, 0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4, + 0x99E1, 0x99E4, 0x37DD, 0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1, + 0x99E8, 0x99E8, 0x2479, 0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E, + 0x99ED, 0x99F3, 0x37E6, 0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED, + 0x9A40, 0x9A49, 0x37F7, 0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801, + 0x9A57, 0x9A57, 0x20AD, 0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB, + 0x9A66, 0x9A66, 0x381A, 0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B, + 0x9A71, 0x9A71, 0x2159, 0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013, + 0x9A77, 0x9A77, 0x1F33, 0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F, + 0x9A88, 0x9A88, 0x1E5C, 0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488, + 0x9A8D, 0x9A90, 0x383A, 0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E, + 0x9A97, 0x9A97, 0x248A, 0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489, + 0x9A9B, 0x9A9B, 0x248B, 0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83, + 0x9A9F, 0x9AA1, 0x3847, 0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB, + 0x9AA4, 0x9AA9, 0x384A, 0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850, + 0x9AD0, 0x9AD0, 0x24C0, 0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D, + 0x9AD7, 0x9AD9, 0x387A, 0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D, + 0x9AE2, 0x9AE2, 0x20CA, 0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7, + 0x9AE5, 0x9AE5, 0x24C2, 0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E, + 0x9B80, 0x9BD0, 0x38DD, 0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E, + 0x9BDC, 0x9BDC, 0x23DB, 0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A, + 0x9C53, 0x9C53, 0x205E, 0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244, + 0x9C5A, 0x9C5A, 0x23E2, 0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4, + 0x9C5D, 0x9C74, 0x3973, 0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B, + 0x9C79, 0x9C79, 0x1E66, 0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993, + 0x9C86, 0x9C86, 0x1F63, 0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD, + 0x9C9E, 0x9CAA, 0x39AF, 0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC, + 0x9CCA, 0x9CCA, 0x22B5, 0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26, + 0x9CD0, 0x9CE5, 0x39DE, 0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088, + 0x9CE8, 0x9CEB, 0x39F4, 0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8, + 0x9CEE, 0x9CEE, 0x2341, 0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B, + 0x9CFC, 0x9CFD, 0x3A05, 0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07, + 0x9D42, 0x9D42, 0x2124, 0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048, + 0x9D47, 0x9D47, 0x23E0, 0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077, + 0x9D4E, 0x9D4E, 0x3A11, 0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12, + 0x9D61, 0x9D61, 0x20B1, 0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41, + 0x9D69, 0x9D69, 0x201C, 0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8, + 0x9D6F, 0x9D70, 0x3A2D, 0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F, + 0x9D75, 0x9D75, 0x1F9B, 0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F, + 0x9D7C, 0x9D7C, 0x3A37, 0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38, + 0x9D80, 0x9D89, 0x3A39, 0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43, + 0x9D8D, 0x9D8D, 0x1FB4, 0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7, + 0x9D92, 0x9D98, 0x3A48, 0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F, + 0x9DA1, 0x9DA1, 0x23E1, 0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56, + 0x9DA7, 0x9DA7, 0x23EA, 0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3, + 0x9DAD, 0x9DAD, 0x210E, 0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6, + 0x9DB3, 0x9DB3, 0x2004, 0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D, + 0x9DBF, 0x9DC5, 0x3A6C, 0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73, + 0x9DC9, 0x9DC9, 0x2264, 0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2, + 0x9DCE, 0x9DD1, 0x3A78, 0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C, + 0x9DD5, 0x9DD5, 0x1EC4, 0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6, + 0x9DE2, 0x9DE2, 0x20A9, 0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B, + 0x9DF2, 0x9DF3, 0x3A97, 0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99, + 0x9DF7, 0x9DF7, 0x268B, 0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76, + 0x9DFB, 0x9DFC, 0x3A9D, 0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F, + 0x9E40, 0x9E44, 0x3AA0, 0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5, + 0x9E48, 0x9E48, 0x2191, 0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7, + 0x9E52, 0x9E52, 0x1F9C, 0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA, + 0x9E55, 0x9E55, 0x3AB0, 0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1, + 0x9E5D, 0x9E5D, 0x23E9, 0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7, + 0x9E61, 0x9E61, 0x21D5, 0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6, + 0x9E64, 0x9E66, 0x3ABA, 0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD, + 0x9E6C, 0x9E6C, 0x1E4F, 0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9, + 0x9E70, 0x9E71, 0x3AC3, 0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5, + 0x9E74, 0x9E74, 0x23EC, 0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6, + 0x9E7B, 0x9E7B, 0x23D8, 0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB, + 0x9E80, 0x9E84, 0x3ACD, 0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2, + 0x9E87, 0x9E87, 0x23ED, 0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA, + 0x9E92, 0x9E95, 0x3ADC, 0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8, + 0x9E98, 0x9EA1, 0x3AE0, 0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA, + 0x9EA6, 0x9EA6, 0x200B, 0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166, + 0x9EAA, 0x9EAD, 0x3AEF, 0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3, + 0x9EB3, 0x9EB3, 0x2189, 0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7, + 0x9EB7, 0x9EB7, 0x23E7, 0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3, + 0x9EF6, 0x9EFE, 0x3B36, 0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A, + 0x9F4F, 0x9F6E, 0x3B4D, 0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D, + 0x9F80, 0x9F91, 0x3B7C, 0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E, + 0x9F98, 0x9F98, 0x24D6, 0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A, + 0x9FA7, 0x9FA8, 0x3BA0, 0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2, + 0x9FAC, 0x9FAC, 0x24D5, 0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228, + 0x9FCA, 0x9FCC, 0x3BC0, 0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3, + 0x9FE1, 0x9FE1, 0x20FC, 0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87, + 0x9FEC, 0x9FED, 0x3BDF, 0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1, + 0x9FF4, 0x9FF4, 0x1EBA, 0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119, + 0x9FFE, 0x9FFE, 0x3BEE, 0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C, + 0xA044, 0xA045, 0x3BF2, 0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4, + 0xA049, 0xA049, 0x2227, 0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F, + 0xA04F, 0xA053, 0x3BFA, 0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF, + 0xA05A, 0xA05A, 0x1F5D, 0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC, + 0xA062, 0xA062, 0x3C0A, 0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B, + 0xA071, 0xA071, 0x2149, 0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046, + 0xA075, 0xA07E, 0x3C1A, 0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24, + 0xA091, 0xA091, 0x2190, 0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208, + 0xA095, 0xA095, 0x3C36, 0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37, + 0xA0A9, 0xA0A9, 0x24C3, 0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC, + 0xA0C0, 0xA0CD, 0x3C5E, 0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C, + 0xA0D9, 0xA0D9, 0x1ED1, 0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC, + 0xA0DF, 0xA0ED, 0x3C7A, 0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89, + 0xA1A1, 0xA1FE, 0x0060, 0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE, + 0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, + 0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, + 0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, + 0xA840, 0xA87E, 0x26B3, 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C, + 0xA8C5, 0xA8EA, 0x02BC, 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720, + 0xA95C, 0xA95C, 0x2722, 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742, + 0xA996, 0xA996, 0x1E17, 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99, + 0xAA4D, 0xAA4D, 0x21B6, 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6, + 0xAA71, 0xAA71, 0x2235, 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397, + 0xAA74, 0xAA76, 0x3CC9, 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC, + 0xAA7A, 0xAA7A, 0x223F, 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE, + 0xAA80, 0xAA99, 0x3CD1, 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB, + 0xAA9C, 0xAA9C, 0x2396, 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC, + 0xAA9F, 0xAA9F, 0x20A2, 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E, + 0xAB40, 0xAB40, 0x1F64, 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B, + 0xAB44, 0xAB44, 0x3CF0, 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139, + 0xAB47, 0xAB47, 0x3CF1, 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1, + 0xAB4A, 0xAB4A, 0x239A, 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399, + 0xAB4E, 0xAB7E, 0x3CF4, 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C, + 0xAC40, 0xAC45, 0x3D46, 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C, + 0xAC71, 0xAC71, 0x2460, 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C, + 0xAC7D, 0xAC7E, 0x3D80, 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D, + 0xAC8E, 0xAC92, 0x3D8F, 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A, + 0xAC95, 0xACA0, 0x3D94, 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461, + 0xAD4A, 0xAD5D, 0x3DA9, 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD, + 0xAD61, 0xAD61, 0x2462, 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54, + 0xAD69, 0xAD73, 0x3DC5, 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0, + 0xAD80, 0xAD81, 0x3DDA, 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC, + 0xAD87, 0xAD87, 0x245D, 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463, + 0xAD8C, 0xAD90, 0x3DE3, 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8, + 0xAE40, 0xAE53, 0x3DF7, 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B, + 0xAE62, 0xAE62, 0x1E70, 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F, + 0xAE81, 0xAE84, 0x3E34, 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38, + 0xAE8B, 0xAE8B, 0x1F4E, 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1, + 0xAE95, 0xAE9F, 0x3E45, 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50, + 0xAF64, 0xAF64, 0x1FC6, 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE, + 0xAF7C, 0xAF7E, 0x3E8A, 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01, + 0xAF83, 0xAF83, 0x2200, 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2, + 0xAF8F, 0xAF8F, 0x1E97, 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB, + 0xAF92, 0xAF9B, 0x3E9A, 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4, + 0xAF9F, 0xAF9F, 0x2028, 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7, + 0xB041, 0xB042, 0x25AF, 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1, + 0xB045, 0xB04E, 0x3EA9, 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3, + 0xB054, 0xB054, 0x1E4E, 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202, + 0xB058, 0xB058, 0x25AB, 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9, + 0xB05B, 0xB05B, 0x25AD, 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6, + 0xB05E, 0xB05E, 0x3EBB, 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4, + 0xB062, 0xB062, 0x222F, 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7, + 0xB065, 0xB06B, 0x3EBC, 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3, + 0xB07D, 0xB07D, 0x1E25, 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4, + 0xB097, 0xB097, 0x25C0, 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A, + 0xB09A, 0xB0A0, 0x3EEC, 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3, + 0xB14B, 0xB14B, 0x226E, 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD, + 0xB14E, 0xB14E, 0x3EFF, 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2, + 0xB151, 0xB151, 0x3F00, 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01, + 0xB180, 0xB196, 0x3F2D, 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44, + 0xB1A1, 0xB1FE, 0x040A, 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF, + 0xB242, 0xB266, 0x3F4E, 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73, + 0xB26D, 0xB26D, 0x2074, 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687, + 0xB275, 0xB27E, 0x3F7E, 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88, + 0xB289, 0xB289, 0x268D, 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0, + 0xB29B, 0xB2A0, 0x3FA0, 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6, + 0xB343, 0xB343, 0x1FAB, 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8, + 0xB371, 0xB37E, 0x3FD5, 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9, + 0xB389, 0xB38B, 0x3FEB, 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE, + 0xB38E, 0xB38E, 0x21FA, 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6, + 0xB440, 0xB453, 0x4001, 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015, + 0xB458, 0xB458, 0x24E4, 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6, + 0xB45F, 0xB45F, 0x20F7, 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B, + 0xB462, 0xB474, 0x401E, 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031, + 0xB47E, 0xB47E, 0x24EC, 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB, + 0xB484, 0xB488, 0x403C, 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041, + 0xB493, 0xB493, 0x24EA, 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524, + 0xB540, 0xB540, 0x4057, 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058, + 0xB54B, 0xB54B, 0x1E27, 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6, + 0xB557, 0xB559, 0x406B, 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012, + 0xB55C, 0xB55C, 0x1EEC, 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8, + 0xB562, 0xB57E, 0x4072, 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66, + 0xB59D, 0xB59D, 0x24DC, 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582, + 0xB640, 0xB651, 0x40AE, 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0, + 0xB655, 0xB655, 0x24DD, 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E, + 0xB65A, 0xB65A, 0x40C5, 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8, + 0xB65D, 0xB67E, 0x40C6, 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0, + 0xB740, 0xB74D, 0x4109, 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117, + 0xB751, 0xB751, 0x1E80, 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677, + 0xB75A, 0xB763, 0x4120, 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69, + 0xB766, 0xB766, 0x222B, 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F, + 0xB778, 0xB778, 0x1F5B, 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B, + 0xB781, 0xB781, 0x4140, 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141, + 0xB7A1, 0xB7FE, 0x063E, 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0, + 0xB844, 0xB844, 0x2186, 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED, + 0xB847, 0xB84C, 0x4163, 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169, + 0xB851, 0xB851, 0x1FEA, 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4, + 0xB85B, 0xB85B, 0x20E1, 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8, + 0xB85E, 0xB85E, 0x2260, 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2, + 0xB861, 0xB876, 0x4176, 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C, + 0xB880, 0xB881, 0x4193, 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195, + 0xB8A1, 0xB8FE, 0x069C, 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41, + 0xB951, 0xB960, 0x41C3, 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3, + 0xB97B, 0xB97B, 0x1F86, 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF, + 0xB99D, 0xB99D, 0x1FB3, 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF, + 0xB9A1, 0xB9FE, 0x06FA, 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4, + 0xBA43, 0xBA43, 0x4210, 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211, + 0xBA56, 0xBA56, 0x25E3, 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111, + 0xBA5A, 0xBA5F, 0x4224, 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A, + 0xBA6A, 0xBA6A, 0x25E7, 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041, + 0xBA75, 0xBA7E, 0x423C, 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA, + 0xBA85, 0xBA85, 0x424A, 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B, + 0xBA88, 0xBA88, 0x25EC, 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB, + 0xBA8E, 0xBA9D, 0x4250, 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D, + 0xBAA0, 0xBAA0, 0x4260, 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7, + 0xBB41, 0xBB48, 0x4261, 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269, + 0xBB58, 0xBB58, 0x25E9, 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE, + 0xBB5C, 0xBB5C, 0x203A, 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693, + 0xBB61, 0xBB64, 0x427C, 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED, + 0xBB67, 0xBB67, 0x4280, 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281, + 0xBB6A, 0xBB6A, 0x2065, 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3, + 0xBB6F, 0xBB7E, 0x4285, 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6, + 0xBC40, 0xBC51, 0x42B6, 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC, + 0xBC54, 0xBC59, 0x42C8, 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE, + 0xBC61, 0xBC61, 0x269B, 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3, + 0xBC64, 0xBC64, 0x42D5, 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6, + 0xBC67, 0xBC67, 0x25F4, 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B, + 0xBC6A, 0xBC6C, 0x42D8, 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB, + 0xBC6F, 0xBC6F, 0x1F7B, 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D, + 0xBC72, 0xBC72, 0x42DD, 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48, + 0xBC75, 0xBC75, 0x241C, 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF, + 0xBC79, 0xBC79, 0x219A, 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091, + 0xBC7C, 0xBC7D, 0x42DF, 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1, + 0xBC82, 0xBC82, 0x2423, 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422, + 0xBC85, 0xBC85, 0x42E3, 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4, + 0xBC88, 0xBC88, 0x228D, 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8, + 0xBC8B, 0xBC8B, 0x2421, 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3, + 0xBC90, 0xBC99, 0x42E8, 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426, + 0xBC9C, 0xBC9C, 0x2425, 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2, + 0xBCA1, 0xBCFE, 0x0814, 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A, + 0xBD43, 0xBD43, 0x2424, 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428, + 0xBD46, 0xBD47, 0x42F8, 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429, + 0xBD4A, 0xBD4A, 0x42FA, 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB, + 0xBD4D, 0xBD4D, 0x22BE, 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31, + 0xBD50, 0xBD56, 0x42FD, 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304, + 0xBD59, 0xBD59, 0x1FB5, 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B, + 0xBD67, 0xBD67, 0x1FAF, 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068, + 0xBD6B, 0xBD6B, 0x21E4, 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21, + 0xBD70, 0xBD70, 0x4316, 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317, + 0xBD79, 0xBD79, 0x217C, 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D, + 0xBD7C, 0xBD7D, 0x431E, 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320, + 0xBD81, 0xBD81, 0x1FD1, 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33, + 0xBD8A, 0xBD8A, 0x4328, 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329, + 0xBD8E, 0xBD8E, 0x242E, 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430, + 0xBD91, 0xBD91, 0x21DB, 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158, + 0xBD98, 0xBD9A, 0x4331, 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334, + 0xBDA1, 0xBDFE, 0x0872, 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9, + 0xBE44, 0xBE44, 0x433C, 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D, + 0xBE49, 0xBE49, 0x1E8E, 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340, + 0xBE51, 0xBE51, 0x21C5, 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192, + 0xBE54, 0xBE54, 0x4346, 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19, + 0xBE57, 0xBE57, 0x218C, 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3, + 0xBE5A, 0xBE5C, 0x4347, 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438, + 0xBE5F, 0xBE5F, 0x2432, 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A, + 0xBE62, 0xBE62, 0x1E9C, 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085, + 0xBE65, 0xBE68, 0x434B, 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F, + 0xBE6C, 0xBE6C, 0x243B, 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7, + 0xBE70, 0xBE70, 0x2433, 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054, + 0xBE77, 0xBE77, 0x21DE, 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434, + 0xBE7A, 0xBE7B, 0x4359, 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89, + 0xBE7E, 0xBE7E, 0x243C, 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E, + 0xBE84, 0xBE84, 0x1ED8, 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF, + 0xBE87, 0xBE87, 0x2445, 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249, + 0xBE8A, 0xBE8B, 0x4360, 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362, + 0xBE8E, 0xBE8E, 0x1E47, 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363, + 0xBE92, 0xBE92, 0x2086, 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196, + 0xBE96, 0xBE96, 0x4367, 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F, + 0xBE99, 0xBE99, 0x4368, 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369, + 0xBE9C, 0xBE9C, 0x2442, 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E, + 0xBEA0, 0xBEA0, 0x436C, 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6, + 0xBF41, 0xBF4C, 0x436D, 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446, + 0xBF4F, 0xBF4F, 0x244B, 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379, + 0xBF55, 0xBF55, 0x2427, 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D, + 0xBF60, 0xBF60, 0x1F0F, 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447, + 0xBF63, 0xBF63, 0x2449, 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387, + 0xBF68, 0xBF68, 0x21C2, 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E, + 0xBF6D, 0xBF6F, 0x438D, 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390, + 0xBF72, 0xBF72, 0x244A, 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391, + 0xBF76, 0xBF76, 0x22BB, 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393, + 0xBF79, 0xBF79, 0x2694, 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6, + 0xBF7C, 0xBF7C, 0x2051, 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E, + 0xBF80, 0xBF81, 0x4395, 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D, + 0xBF84, 0xBF88, 0x4397, 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451, + 0xBF8B, 0xBF94, 0x439C, 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6, + 0xBF97, 0xBF97, 0x2289, 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7, + 0xBF9D, 0xBF9D, 0x2454, 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E, + 0xC040, 0xC040, 0x20FB, 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440, + 0xC045, 0xC04A, 0x43B1, 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61, + 0xC04D, 0xC04D, 0x269D, 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A, + 0xC050, 0xC050, 0x2456, 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458, + 0xC053, 0xC054, 0x43B8, 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA, + 0xC05B, 0xC05B, 0x221A, 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A, + 0xC05F, 0xC05F, 0x244D, 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1, + 0xC069, 0xC069, 0x2453, 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420, + 0xC06C, 0xC06C, 0x43CA, 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685, + 0xC06F, 0xC06F, 0x43CB, 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC, + 0xC074, 0xC074, 0x2224, 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF, + 0xC077, 0xC077, 0x21BA, 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A, + 0xC07A, 0xC07B, 0x43D1, 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3, + 0xC080, 0xC09A, 0x43D5, 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0, + 0xC09D, 0xC09D, 0x269A, 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C, + 0xC140, 0xC14F, 0x43F4, 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404, + 0xC154, 0xC154, 0x1E2C, 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062, + 0xC160, 0xC160, 0x24F1, 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2, + 0xC163, 0xC174, 0x4412, 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424, + 0xC178, 0xC178, 0x2215, 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C, + 0xC195, 0xC195, 0x21AE, 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA, + 0xC240, 0xC24D, 0x444C, 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A, + 0xC265, 0xC265, 0x25C2, 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1, + 0xC268, 0xC27C, 0x4471, 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486, + 0xC280, 0xC283, 0x4487, 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B, + 0xC293, 0xC293, 0x2017, 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125, + 0xC296, 0xC296, 0x214D, 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4, + 0xC299, 0xC299, 0x209D, 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A, + 0xC29C, 0xC29C, 0x25C3, 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179, + 0xC2A1, 0xC2FE, 0x0A48, 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E, + 0xC343, 0xC343, 0x2155, 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2, + 0xC37C, 0xC37E, 0x44D7, 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7, + 0xC385, 0xC39A, 0x44DE, 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4, + 0xC3A1, 0xC3FE, 0x0AA6, 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123, + 0xC44A, 0xC44B, 0x4502, 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504, + 0xC454, 0xC454, 0x24C9, 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094, + 0xC459, 0xC45A, 0x450E, 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510, + 0xC463, 0xC463, 0x1E77, 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06, + 0xC478, 0xC479, 0x452A, 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C, + 0xC480, 0xC480, 0x4530, 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531, + 0xC491, 0xC491, 0x1EAD, 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8, + 0xC494, 0xC497, 0x4540, 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544, + 0xC49A, 0xC49A, 0x20C5, 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA, + 0xC49D, 0xC4A0, 0x4546, 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A, + 0xC544, 0xC544, 0x1FF0, 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6, + 0xC547, 0xC54A, 0x454F, 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE, + 0xC54D, 0xC551, 0x4553, 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558, + 0xC55F, 0xC55F, 0x2161, 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B, + 0xC564, 0xC564, 0x21D9, 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9, + 0xC567, 0xC57E, 0x4567, 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61, + 0xC594, 0xC59B, 0x4592, 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A, + 0xC59E, 0xC59E, 0x1F98, 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62, + 0xC640, 0xC640, 0x459D, 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E, + 0xC644, 0xC644, 0x1F88, 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8, + 0xC648, 0xC662, 0x45A2, 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD, + 0xC672, 0xC672, 0x2336, 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7, + 0xC6A1, 0xC6FE, 0x0BC0, 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB, + 0xC767, 0xC76E, 0x461E, 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626, + 0xC776, 0xC776, 0x1F7D, 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333, + 0xC77C, 0xC77E, 0x4630, 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E, + 0xC840, 0xC840, 0x4654, 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655, + 0xC84F, 0xC84F, 0x2334, 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1, + 0xC853, 0xC865, 0x4664, 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677, + 0xC86E, 0xC86E, 0x2349, 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B, + 0xC880, 0xC886, 0x468D, 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694, + 0xC892, 0xC892, 0x2347, 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193, + 0xC895, 0xC898, 0x469F, 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3, + 0xC89D, 0xC89D, 0x1F62, 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C, + 0xC940, 0xC94E, 0x46A9, 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348, + 0xC951, 0xC96D, 0x46B8, 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5, + 0xC970, 0xC970, 0x2345, 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12, + 0xC978, 0xC97E, 0x46DC, 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018, + 0xC990, 0xC990, 0x2335, 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C, + 0xC99D, 0xC9A0, 0x46FD, 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701, + 0xCA4E, 0xCA4E, 0x266F, 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351, + 0xCA57, 0xCA58, 0x4716, 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718, + 0xCA5C, 0xCA5C, 0x2338, 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B, + 0xCA62, 0xCA6D, 0x471E, 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A, + 0xCA72, 0xCA72, 0x234F, 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D, + 0xCA78, 0xCA7A, 0x4731, 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331, + 0xCA7D, 0xCA7D, 0x4734, 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735, + 0xCA81, 0xCA81, 0x233B, 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350, + 0xCA8A, 0xCA8D, 0x473D, 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6, + 0xCA90, 0xCA91, 0x4741, 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743, + 0xCA9A, 0xCA9A, 0x2355, 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38, + 0xCB40, 0xCB42, 0x4750, 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753, + 0xCB45, 0xCB45, 0x1F74, 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330, + 0xCB48, 0xCB4A, 0x4755, 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758, + 0xCB4E, 0xCB4E, 0x20DA, 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A, + 0xCB58, 0xCB5C, 0x4762, 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767, + 0xCB5F, 0xCB5F, 0x2107, 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F, + 0xCB6B, 0xCB7A, 0x4772, 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343, + 0xCB7D, 0xCB7E, 0x4782, 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212, + 0xCB88, 0xCB8D, 0x478B, 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791, + 0xCB92, 0xCB92, 0x2359, 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254, + 0xCB9D, 0xCB9D, 0x479D, 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E, + 0xCBA1, 0xCBFE, 0x0D96, 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357, + 0xCC42, 0xCC48, 0x47A0, 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042, + 0xCC4B, 0xCC4B, 0x2153, 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB, + 0xCC50, 0xCC5B, 0x47AA, 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6, + 0xCC60, 0xCC60, 0x2356, 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337, + 0xCC65, 0xCC6C, 0x47BC, 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4, + 0xCC79, 0xCC79, 0x2353, 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061, + 0xCC7E, 0xCC7E, 0x47D2, 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95, + 0xCC8F, 0xCC93, 0x47E1, 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6, + 0xCC96, 0xCC96, 0x1F42, 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8, + 0xCC9E, 0xCCA0, 0x47ED, 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0, + 0xCD80, 0xCD8F, 0x482F, 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F, + 0xCD98, 0xCD98, 0x25D7, 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52, + 0xCE40, 0xCE66, 0x484E, 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875, + 0xCE72, 0xCE72, 0x21B2, 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B, + 0xCE81, 0xCE81, 0x219E, 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC, + 0xCE88, 0xCE9A, 0x4891, 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4, + 0xCE9E, 0xCE9E, 0x2226, 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0, + 0xCF40, 0xCF4D, 0x48A8, 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6, + 0xCF55, 0xCF55, 0x227B, 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE, + 0xCF59, 0xCF5B, 0x48BE, 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1, + 0xCF6C, 0xCF6C, 0x25D5, 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B, + 0xCF74, 0xCF74, 0x48D6, 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7, + 0xCF78, 0xCF78, 0x1E89, 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9, + 0xCF7D, 0xCF7E, 0x48DC, 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211, + 0xCF82, 0xCF88, 0x48DF, 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6, + 0xCF8B, 0xCF92, 0x48E6, 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF, + 0xCF95, 0xCF9D, 0x48EE, 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7, + 0xCFA0, 0xCFA0, 0x25D8, 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8, + 0xD04D, 0xD04D, 0x1F29, 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B, + 0xD052, 0xD054, 0x4908, 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B, + 0xD05C, 0xD05C, 0x2297, 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690, + 0xD061, 0xD066, 0x4914, 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A, + 0xD06C, 0xD06C, 0x2198, 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88, + 0xD06F, 0xD07C, 0x491F, 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D, + 0xD080, 0xD0A0, 0x492E, 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F, + 0xD155, 0xD155, 0x25F1, 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C, + 0xD15A, 0xD160, 0x4967, 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC, + 0xD163, 0xD174, 0x496E, 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980, + 0xD17D, 0xD17D, 0x2676, 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988, + 0xD19D, 0xD19D, 0x1FE1, 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5, + 0xD1A1, 0xD1FE, 0x0FCA, 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7, + 0xD243, 0xD243, 0x22DD, 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD, + 0xD24E, 0xD25B, 0x49B2, 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0, + 0xD263, 0xD263, 0x25BC, 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6, + 0xD268, 0xD268, 0x25BF, 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187, + 0xD26E, 0xD26E, 0x49CD, 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE, + 0xD272, 0xD272, 0x1E7F, 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD, + 0xD276, 0xD27E, 0x49D2, 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96, + 0xD28B, 0xD28D, 0x49E5, 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8, + 0xD292, 0xD292, 0x2084, 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136, + 0xD296, 0xD296, 0x49ED, 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE, + 0xD2A0, 0xD2A0, 0x24BA, 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6, + 0xD344, 0xD344, 0x24BC, 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4, + 0xD349, 0xD349, 0x49FD, 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE, + 0xD34D, 0xD34D, 0x24BD, 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE, + 0xD351, 0xD354, 0x4A02, 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06, + 0xD358, 0xD358, 0x1FD2, 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD, + 0xD35C, 0xD35C, 0x4A0A, 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D, + 0xD35F, 0xD377, 0x4A0B, 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24, + 0xD37A, 0xD37A, 0x260A, 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94, + 0xD37D, 0xD37E, 0x4A26, 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF, + 0xD386, 0xD386, 0x1ECB, 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D, + 0xD38B, 0xD38B, 0x1F77, 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB, + 0xD38E, 0xD38E, 0x4A31, 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32, + 0xD391, 0xD391, 0x216F, 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0, + 0xD394, 0xD395, 0x4A34, 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36, + 0xD398, 0xD398, 0x22E2, 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37, + 0xD39B, 0xD39B, 0x1F78, 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2, + 0xD39F, 0xD39F, 0x4A3A, 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086, + 0xD440, 0xD440, 0x4A3B, 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C, + 0xD445, 0xD445, 0x1FD3, 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5, + 0xD448, 0xD44B, 0x4A40, 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44, + 0xD44F, 0xD44F, 0x211F, 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD, + 0xD454, 0xD455, 0x4A49, 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B, + 0xD458, 0xD458, 0x22E7, 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282, + 0xD45D, 0xD461, 0x4A4F, 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54, + 0xD467, 0xD467, 0x22E8, 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4, + 0xD46F, 0xD46F, 0x4A5E, 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F, + 0xD472, 0xD472, 0x22EB, 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9, + 0xD475, 0xD475, 0x20BD, 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA, + 0xD479, 0xD47A, 0x4A63, 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65, + 0xD47E, 0xD47E, 0x1E9E, 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6, + 0xD483, 0xD483, 0x21E7, 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69, + 0xD487, 0xD487, 0x2137, 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C, + 0xD48B, 0xD48B, 0x4A6D, 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2, + 0xD48E, 0xD48E, 0x1F37, 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E, + 0xD491, 0xD491, 0x22EF, 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10, + 0xD494, 0xD494, 0x21C8, 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1, + 0xD497, 0xD49B, 0x4A70, 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75, + 0xD49F, 0xD49F, 0x22EE, 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4, + 0xD540, 0xD542, 0x4A78, 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E, + 0xD545, 0xD545, 0x22EC, 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B, + 0xD54A, 0xD54A, 0x20FE, 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9, + 0xD550, 0xD550, 0x4A81, 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82, + 0xD554, 0xD554, 0x2236, 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7, + 0xD557, 0xD559, 0x4A85, 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88, + 0xD55C, 0xD55C, 0x1E82, 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89, + 0xD55F, 0xD55F, 0x21A4, 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8, + 0xD562, 0xD562, 0x2151, 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60, + 0xD565, 0xD567, 0x4A8B, 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E, + 0xD56C, 0xD56C, 0x2145, 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC, + 0xD56F, 0xD571, 0x4A92, 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95, + 0xD575, 0xD575, 0x1EF5, 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218, + 0xD579, 0xD57A, 0x4A99, 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B, + 0xD57E, 0xD57E, 0x2300, 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4, + 0xD582, 0xD583, 0x4A9E, 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0, + 0xD586, 0xD586, 0x22FD, 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA, + 0xD589, 0xD589, 0x4AA2, 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3, + 0xD58C, 0xD58C, 0x22FB, 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC, + 0xD58F, 0xD58F, 0x2027, 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060, + 0xD594, 0xD594, 0x22FF, 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE, + 0xD599, 0xD599, 0x1EC7, 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C, + 0xD59C, 0xD59E, 0x4AAC, 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF, + 0xD5A1, 0xD5FE, 0x1142, 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0, + 0xD642, 0xD642, 0x230A, 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1, + 0xD647, 0xD647, 0x2303, 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307, + 0xD64A, 0xD64A, 0x230B, 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F, + 0xD64E, 0xD64E, 0x4AB7, 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8, + 0xD652, 0xD652, 0x2302, 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D, + 0xD655, 0xD655, 0x4ABA, 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB, + 0xD658, 0xD658, 0x2308, 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC, + 0xD65B, 0xD65B, 0x4ABD, 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305, + 0xD65E, 0xD65E, 0x2197, 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171, + 0xD661, 0xD661, 0x2298, 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57, + 0xD666, 0xD668, 0x4AC2, 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5, + 0xD66B, 0xD66B, 0x2311, 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304, + 0xD670, 0xD670, 0x4AC9, 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35, + 0xD673, 0xD673, 0x4ACA, 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310, + 0xD676, 0xD676, 0x1FA3, 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6, + 0xD679, 0xD67B, 0x4ACC, 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF, + 0xD680, 0xD682, 0x4AD1, 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4, + 0xD686, 0xD686, 0x2312, 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313, + 0xD689, 0xD68D, 0x4AD6, 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB, + 0xD694, 0xD694, 0x1FBA, 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078, + 0xD69A, 0xD6A0, 0x4AE4, 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB, + 0xD743, 0xD743, 0x2288, 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316, + 0xD749, 0xD749, 0x1F6B, 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314, + 0xD751, 0xD751, 0x4AF8, 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315, + 0xD754, 0xD754, 0x2168, 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4, + 0xD757, 0xD763, 0x4AFA, 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07, + 0xD767, 0xD767, 0x2219, 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09, + 0xD76C, 0xD76C, 0x20D5, 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A, + 0xD770, 0xD774, 0x4B0E, 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13, + 0xD778, 0xD778, 0x1ED3, 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B, + 0xD783, 0xD783, 0x1E49, 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B, + 0xD788, 0xD78A, 0x4B21, 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8, + 0xD78D, 0xD78D, 0x4B24, 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319, + 0xD790, 0xD794, 0x4B25, 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A, + 0xD797, 0xD797, 0x2317, 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE, + 0xD840, 0xD84C, 0x4B34, 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41, + 0xD853, 0xD853, 0x1EFD, 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71, + 0xD890, 0xD890, 0x1E3B, 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81, + 0xD893, 0xD893, 0x1F0C, 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24, + 0xD896, 0xD899, 0x4B82, 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65, + 0xD89C, 0xD89C, 0x1EF0, 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30, + 0xD89F, 0xD89F, 0x2261, 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257, + 0xD940, 0xD940, 0x4B87, 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB, + 0xD943, 0xD943, 0x4B88, 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8, + 0xD946, 0xD946, 0x1F39, 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48, + 0xD949, 0xD949, 0x2070, 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A, + 0xD94C, 0xD94C, 0x24AC, 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176, + 0xD94F, 0xD94F, 0x24AD, 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B, + 0xD952, 0xD952, 0x1F45, 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B, + 0xD955, 0xD955, 0x202F, 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0, + 0xD958, 0xD958, 0x4B8C, 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F, + 0xD95B, 0xD95B, 0x4B8D, 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E, + 0xD963, 0xD963, 0x24B2, 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51, + 0xD966, 0xD966, 0x4B94, 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95, + 0xD96C, 0xD96C, 0x24B3, 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F, + 0xD96F, 0xD96F, 0x4B9A, 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B, + 0xD972, 0xD972, 0x20B4, 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB, + 0xD975, 0xD975, 0x2072, 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C, + 0xD978, 0xD978, 0x1F0A, 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D, + 0xD97C, 0xD97C, 0x2291, 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278, + 0xD980, 0xD980, 0x1ED4, 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3, + 0xD988, 0xD98C, 0x4BA5, 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7, + 0xD98F, 0xD98F, 0x1F28, 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7, + 0xD992, 0xD996, 0x4BAA, 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1, + 0xD999, 0xD99A, 0x4BAF, 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1, + 0xD99D, 0xD99D, 0x225B, 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2, + 0xD9A0, 0xD9A0, 0x2115, 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3, + 0xDA41, 0xDA41, 0x222A, 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4, + 0xDA48, 0xDA48, 0x213D, 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15, + 0xDA4E, 0xDA4E, 0x225C, 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14, + 0xDA74, 0xDA76, 0x4BE1, 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4, + 0xDA80, 0xDA84, 0x4BEB, 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0, + 0xDA8E, 0xDA8E, 0x25F8, 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313, + 0xDB40, 0xDB5F, 0x4C0A, 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A, + 0xDB78, 0xDB78, 0x2230, 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47, + 0xDB84, 0xDB84, 0x25FD, 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600, + 0xDB8C, 0xDB97, 0x4C51, 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D, + 0xDBA1, 0xDBFE, 0x1371, 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF, + 0xDC46, 0xDC4E, 0x4C6A, 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C, + 0xDC51, 0xDC51, 0x2602, 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D, + 0xDC54, 0xDC54, 0x4C74, 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE, + 0xDC57, 0xDC57, 0x2603, 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601, + 0xDC5E, 0xDC61, 0x4C7A, 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E, + 0xDC66, 0xDC66, 0x1EA3, 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81, + 0xDC6B, 0xDC6B, 0x2607, 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0, + 0xDC7D, 0xDC7E, 0x4C94, 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B, + 0xDC88, 0xDC88, 0x2267, 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6, + 0xDC8B, 0xDC8D, 0x4C9D, 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0, + 0xDC90, 0xDC90, 0x248C, 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D, + 0xDC98, 0xDC9A, 0x4CA7, 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA, + 0xDCA0, 0xDCA0, 0x2494, 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE, + 0xDD46, 0xDD46, 0x2493, 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E, + 0xDD4E, 0xDD52, 0x4CBA, 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491, + 0xDD55, 0xDD55, 0x2496, 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492, + 0xDD58, 0xDD58, 0x4CBF, 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0, + 0xDD5E, 0xDD5E, 0x1FB1, 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A, + 0xDD61, 0xDD61, 0x4CC5, 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6, + 0xDD64, 0xDD64, 0x2258, 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7, + 0xDD6D, 0xDD6D, 0x249B, 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09, + 0xDD70, 0xDD70, 0x20E6, 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026, + 0xDD77, 0xDD77, 0x249F, 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D, + 0xDD7B, 0xDD7E, 0x4CD4, 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B, + 0xDD82, 0xDD82, 0x249C, 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A, + 0xDD86, 0xDD86, 0x205B, 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70, + 0xDD8C, 0xDD8E, 0x4CDF, 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2, + 0xDD94, 0xDD94, 0x213B, 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07, + 0xDD98, 0xDD99, 0x4CE8, 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237, + 0xDD9C, 0xDD9D, 0x4CEA, 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC, + 0xDDA0, 0xDDA0, 0x21B3, 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245, + 0xDE41, 0xDE41, 0x24A1, 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8, + 0xDE45, 0xDE47, 0x4CEF, 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0, + 0xDE4A, 0xDE4E, 0x4CF2, 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7, + 0xDE5A, 0xDE5A, 0x1F46, 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380, + 0xDE5D, 0xDE5D, 0x2495, 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490, + 0xDE60, 0xDE6A, 0x4D03, 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E, + 0xDE6F, 0xDE6F, 0x1E9D, 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A, + 0xDE72, 0xDE72, 0x20AA, 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D, + 0xDE92, 0xDE92, 0x267B, 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2, + 0xDEA0, 0xDEA0, 0x4D3B, 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E, + 0xDF41, 0xDF41, 0x4D3C, 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D, + 0xDF4D, 0xDF4D, 0x1FBB, 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253, + 0xDF5D, 0xDF5D, 0x4D55, 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6, + 0xDF60, 0xDF60, 0x218E, 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC, + 0xDF65, 0xDF65, 0x4D59, 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A, + 0xDF68, 0xDF68, 0x224A, 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133, + 0xDF6E, 0xDF73, 0x4D5F, 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65, + 0xDF77, 0xDF77, 0x20CF, 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67, + 0xDF7A, 0xDF7A, 0x220F, 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029, + 0xDF7D, 0xDF7D, 0x4D69, 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55, + 0xDF81, 0xDF82, 0x4D6A, 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C, + 0xDF85, 0xDF85, 0x1E46, 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063, + 0xDF8A, 0xDF8A, 0x23F3, 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9, + 0xE040, 0xE04F, 0x4D86, 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96, + 0xE05D, 0xE05D, 0x2233, 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320, + 0xE06A, 0xE06B, 0x4DAD, 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF, + 0xE075, 0xE075, 0x22BC, 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C, + 0xE078, 0xE078, 0x4DB8, 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9, + 0xE080, 0xE086, 0x4DBE, 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5, + 0xE08D, 0xE08D, 0x2287, 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D, + 0xE090, 0xE090, 0x1EAB, 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D, + 0xE093, 0xE093, 0x4DCC, 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD, + 0xE097, 0xE097, 0x231B, 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547, + 0xE140, 0xE141, 0x4DD8, 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA, + 0xE164, 0xE164, 0x2255, 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F, + 0xE169, 0xE173, 0x4DFE, 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4, + 0xE176, 0xE17E, 0x4E09, 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B, + 0xE185, 0xE185, 0x21D8, 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA, + 0xE188, 0xE188, 0x4E17, 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18, + 0xE18C, 0xE18C, 0x2134, 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3, + 0xE191, 0xE191, 0x24F8, 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7, + 0xE194, 0xE194, 0x1EC8, 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C, + 0xE198, 0xE198, 0x2280, 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5, + 0xE19F, 0xE19F, 0x24FB, 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5, + 0xE240, 0xE240, 0x4E24, 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25, + 0xE243, 0xE243, 0x1EED, 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD, + 0xE250, 0xE250, 0x4E31, 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32, + 0xE253, 0xE253, 0x24FE, 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33, + 0xE25A, 0xE25A, 0x2508, 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38, + 0xE25E, 0xE25E, 0x2506, 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF, + 0xE263, 0xE263, 0x2090, 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD, + 0xE268, 0xE268, 0x1F25, 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503, + 0xE26B, 0xE26B, 0x2502, 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A, + 0xE26F, 0xE26F, 0x20A6, 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5, + 0xE279, 0xE27C, 0x4E4B, 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F, + 0xE280, 0xE280, 0x2507, 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505, + 0xE283, 0xE288, 0x4E50, 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56, + 0xE28B, 0xE28B, 0x2515, 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C, + 0xE28F, 0xE28F, 0x2031, 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B, + 0xE293, 0xE293, 0x250F, 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509, + 0xE296, 0xE297, 0x4E5B, 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234, + 0xE29A, 0xE29A, 0x2513, 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D, + 0xE2A0, 0xE2A0, 0x2501, 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61, + 0xE342, 0xE342, 0x2517, 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63, + 0xE347, 0xE347, 0x2518, 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56, + 0xE34C, 0xE34E, 0x4E69, 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C, + 0xE351, 0xE351, 0x20D3, 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A, + 0xE355, 0xE355, 0x20CE, 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510, + 0xE359, 0xE35B, 0x4E71, 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74, + 0xE360, 0xE360, 0x250A, 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511, + 0xE368, 0xE370, 0x4E7C, 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85, + 0xE373, 0xE373, 0x251E, 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86, + 0xE378, 0xE378, 0x252D, 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89, + 0xE37C, 0xE37C, 0x2532, 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B, + 0xE380, 0xE389, 0x4E8C, 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96, + 0xE38C, 0xE38C, 0x252C, 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528, + 0xE390, 0xE390, 0x4E99, 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A, + 0xE393, 0xE393, 0x252F, 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC, + 0xE396, 0xE398, 0x4E9C, 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F, + 0xE39C, 0xE39C, 0x2535, 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D, + 0xE39F, 0xE39F, 0x2526, 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661, + 0xE440, 0xE440, 0x2534, 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F, + 0xE443, 0xE443, 0x2531, 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3, + 0xE448, 0xE448, 0x2525, 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD, + 0xE44F, 0xE44F, 0x4EAB, 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC, + 0xE452, 0xE452, 0x2172, 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD, + 0xE458, 0xE458, 0x204F, 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543, + 0xE45B, 0xE45B, 0x4EB2, 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3, + 0xE45E, 0xE45E, 0x1E3C, 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529, + 0xE463, 0xE464, 0x4EB7, 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9, + 0xE468, 0xE468, 0x1EFF, 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F, + 0xE474, 0xE474, 0x4EC5, 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6, + 0xE479, 0xE479, 0x2523, 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A, + 0xE47C, 0xE47C, 0x2545, 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D, + 0xE480, 0xE480, 0x4ECA, 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB, + 0xE484, 0xE484, 0x2103, 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C, + 0xE487, 0xE487, 0x253B, 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD, + 0xE48D, 0xE48D, 0x2540, 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD, + 0xE490, 0xE492, 0x4ED2, 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5, + 0xE498, 0xE498, 0x254B, 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547, + 0xE49E, 0xE49F, 0x254F, 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF, + 0xE540, 0xE545, 0x4EDE, 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4, + 0xE548, 0xE548, 0x2546, 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C, + 0xE54C, 0xE54D, 0x4EE7, 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552, + 0xE550, 0xE550, 0x2530, 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9, + 0xE555, 0xE555, 0x2551, 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC, + 0xE558, 0xE558, 0x20D2, 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8, + 0xE55D, 0xE55D, 0x4EF0, 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1, + 0xE561, 0xE561, 0x21AB, 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D, + 0xE565, 0xE565, 0x1EA5, 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C, + 0xE569, 0xE569, 0x2080, 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D, + 0xE56D, 0xE56D, 0x4EF9, 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA, + 0xE575, 0xE575, 0x254A, 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00, + 0xE578, 0xE578, 0x254E, 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC, + 0xE57C, 0xE57C, 0x2554, 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05, + 0xE581, 0xE581, 0x1F3C, 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5, + 0xE584, 0xE589, 0x4F07, 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D, + 0xE58E, 0xE58E, 0x2268, 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6, + 0xE592, 0xE599, 0x4F12, 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553, + 0xE59C, 0xE59E, 0x4F1A, 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D, + 0xE5A1, 0xE5FE, 0x171D, 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E, + 0xE644, 0xE644, 0x2559, 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97, + 0xE64A, 0xE64A, 0x2555, 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D, + 0xE64F, 0xE651, 0x4F28, 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B, + 0xE656, 0xE656, 0x207C, 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A, + 0xE659, 0xE65A, 0x4F2F, 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31, + 0xE65E, 0xE65E, 0x1E34, 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E, + 0xE66A, 0xE66A, 0x4F3D, 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E, + 0xE675, 0xE675, 0x21A2, 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47, + 0xE679, 0xE679, 0x2563, 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49, + 0xE67C, 0xE67C, 0x252E, 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A, + 0xE680, 0xE680, 0x1F1B, 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283, + 0xE683, 0xE683, 0x4F4C, 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D, + 0xE687, 0xE687, 0x20A0, 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565, + 0xE68A, 0xE68B, 0x4F50, 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52, + 0xE693, 0xE693, 0x2562, 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C, + 0xE698, 0xE69A, 0x4F5B, 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020, + 0xE69D, 0xE69E, 0x4F5E, 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A, + 0xE6A1, 0xE6FE, 0x177B, 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E, + 0xE744, 0xE747, 0x4F63, 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C, + 0xE74A, 0xE74C, 0x4F67, 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B, + 0xE750, 0xE750, 0x1E6F, 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4, + 0xE753, 0xE753, 0x2567, 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B, + 0xE756, 0xE758, 0x4F6C, 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F, + 0xE766, 0xE766, 0x252B, 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571, + 0xE769, 0xE769, 0x4F7C, 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D, + 0xE774, 0xE774, 0x2522, 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533, + 0xE77D, 0xE77E, 0x4F8D, 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A, + 0xE783, 0xE783, 0x4F91, 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573, + 0xE786, 0xE786, 0x256F, 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293, + 0xE78B, 0xE78B, 0x2578, 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570, + 0xE790, 0xE791, 0x4F98, 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A, + 0xE798, 0xE799, 0x2541, 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F, + 0xE7A0, 0xE7A0, 0x201A, 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4, + 0xE843, 0xE843, 0x257A, 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7, + 0xE846, 0xE846, 0x2177, 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B, + 0xE84A, 0xE84A, 0x4FAA, 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB, + 0xE84F, 0xE84F, 0x257B, 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3, + 0xE855, 0xE859, 0x4FB2, 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7, + 0xE85C, 0xE85C, 0x2566, 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93, + 0xE863, 0xE863, 0x4FBD, 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE, + 0xE870, 0xE870, 0x2514, 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D, + 0xE874, 0xE874, 0x4FCB, 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC, + 0xE87C, 0xE87C, 0x2574, 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E, + 0xE881, 0xE881, 0x4FD4, 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5, + 0xE887, 0xE887, 0x209F, 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576, + 0xE88A, 0xE88B, 0x4FDA, 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF, + 0xE88E, 0xE88E, 0x261C, 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC, + 0xE8A1, 0xE8FE, 0x1837, 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75, + 0xE94D, 0xE953, 0x4FF9, 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000, + 0xE956, 0xE956, 0x23BF, 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001, + 0xE95A, 0xE95A, 0x23C0, 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45, + 0xE95E, 0xE95E, 0x5005, 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4, + 0xE961, 0xE961, 0x5006, 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104, + 0xE964, 0xE964, 0x5007, 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008, + 0xE967, 0xE967, 0x1F87, 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009, + 0xE96C, 0xE96C, 0x2269, 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43, + 0xE976, 0xE976, 0x5014, 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679, + 0xE979, 0xE979, 0x1EEB, 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35, + 0xE97D, 0xE97D, 0x208A, 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7, + 0xE981, 0xE981, 0x23C9, 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018, + 0xE987, 0xE987, 0x224F, 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB, + 0xE98C, 0xE98D, 0x501F, 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021, + 0xE990, 0xE990, 0x21F7, 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE, + 0xE993, 0xE993, 0x23CA, 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022, + 0xE998, 0xE998, 0x23D0, 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C, + 0xE99C, 0xE99C, 0x5027, 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028, + 0xE99F, 0xE99F, 0x1FEE, 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895, + 0xEA40, 0xEA40, 0x1FF8, 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3, + 0xEA45, 0xEA47, 0x502C, 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4, + 0xEA4A, 0xEA4A, 0x1E98, 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C, + 0xEA51, 0xEA51, 0x5034, 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035, + 0xEA55, 0xEA55, 0x1E71, 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037, + 0xEA59, 0xEA59, 0x23C5, 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A, + 0xEA81, 0xEA83, 0x505E, 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061, + 0xEA87, 0xEA87, 0x2284, 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C, + 0xEA8F, 0xEA8F, 0x5069, 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D, + 0xEA92, 0xEA95, 0x506A, 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E, + 0xEAA0, 0xEAA0, 0x1ED9, 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077, + 0xEB41, 0xEB41, 0x1FB2, 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252, + 0xEB46, 0xEB47, 0x507B, 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D, + 0xEB53, 0xEB53, 0x2157, 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF, + 0xEB56, 0xEB5A, 0x5088, 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D, + 0xEB5D, 0xEB5D, 0x203D, 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015, + 0xEB61, 0xEB61, 0x5090, 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091, + 0xEB6D, 0xEB6D, 0x2156, 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144, + 0xEB71, 0xEB71, 0x509D, 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257, + 0xEB74, 0xEB77, 0x509E, 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092, + 0xEB7A, 0xEB7E, 0x50A2, 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250, + 0xEB86, 0xEB89, 0x50AC, 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0, + 0xEBA1, 0xEBFE, 0x1951, 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8, + 0xEC47, 0xEC55, 0x50CC, 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB, + 0xEC5A, 0xEC5A, 0x260C, 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E, + 0xEC5D, 0xEC5F, 0x50DF, 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2, + 0xEC6E, 0xEC6E, 0x260B, 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3, + 0xEC77, 0xEC7E, 0x50F6, 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23, + 0xEC97, 0xECA0, 0x5114, 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E, + 0xED46, 0xED46, 0x2695, 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E, + 0xED59, 0xED5D, 0x5135, 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A, + 0xED61, 0xED61, 0x2692, 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F, + 0xED65, 0xED65, 0x513E, 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD, + 0xED68, 0xED6D, 0x513F, 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145, + 0xED74, 0xED74, 0x2465, 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467, + 0xED78, 0xED78, 0x514C, 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D, + 0xED80, 0xED90, 0x5152, 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163, + 0xED93, 0xED93, 0x2209, 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9, + 0xED96, 0xED96, 0x5164, 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146, + 0xED99, 0xED99, 0x25C5, 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165, + 0xED9C, 0xED9C, 0x245E, 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F, + 0xED9F, 0xED9F, 0x5167, 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D, + 0xEE40, 0xEE40, 0x25C7, 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A, + 0xEE43, 0xEE43, 0x1E2F, 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168, + 0xEE48, 0xEE48, 0x20BF, 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B, + 0xEE4D, 0xEE4D, 0x25C9, 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8, + 0xEE53, 0xEE54, 0x5172, 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174, + 0xEE57, 0xEE57, 0x25CB, 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D, + 0xEE5F, 0xEE60, 0x517B, 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D, + 0xEE68, 0xEE68, 0x25CC, 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183, + 0xEE6C, 0xEE6C, 0x20B9, 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181, + 0xEE6F, 0xEE76, 0x5186, 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E, + 0xEE7D, 0xEE7D, 0x2173, 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD, + 0xEE81, 0xEE84, 0x5193, 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6, + 0xEE87, 0xEE89, 0x5197, 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1, + 0xEE8C, 0xEE8C, 0x519A, 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B, + 0xEE90, 0xEE90, 0x2008, 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0, + 0xEE95, 0xEE96, 0x51A0, 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2, + 0xEE99, 0xEE99, 0x1F2A, 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72, + 0xEE9E, 0xEE9E, 0x25D3, 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B, + 0xEF40, 0xEF40, 0x21BE, 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044, + 0xEF43, 0xEF43, 0x51A8, 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3, + 0xEF46, 0xEF4B, 0x51A9, 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF, + 0xEF52, 0xEF53, 0x24CC, 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698, + 0xEF56, 0xEF56, 0x51B5, 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6, + 0xEF5A, 0xEF5A, 0x24CE, 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF, + 0xEF61, 0xEF67, 0x51BD, 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4, + 0xEF6A, 0xEF6A, 0x24D0, 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1, + 0xEF6D, 0xEF76, 0x51C6, 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0, + 0xEF7A, 0xEF7A, 0x239B, 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E, + 0xEF7D, 0xEF7E, 0x51D3, 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D, + 0xEF83, 0xEF84, 0x239F, 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1, + 0xEF87, 0xEF87, 0x51D8, 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9, + 0xEF8B, 0xEF8B, 0x221E, 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2, + 0xEF8E, 0xEF94, 0x51DC, 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36, + 0xEF97, 0xEF97, 0x2135, 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD, + 0xEF9D, 0xEF9D, 0x51E7, 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8, + 0xEFA1, 0xEFFE, 0x1AC9, 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3, + 0xF042, 0xF042, 0x2203, 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7, + 0xF045, 0xF046, 0x51EC, 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097, + 0xF049, 0xF049, 0x1EE4, 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238, + 0xF04F, 0xF050, 0x51F2, 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4, + 0xF054, 0xF054, 0x1F9A, 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3, + 0xF058, 0xF05D, 0x51F8, 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE, + 0xF068, 0xF068, 0x239C, 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6, + 0xF06D, 0xF070, 0x520A, 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E, + 0xF073, 0xF073, 0x2035, 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F, + 0xF078, 0xF078, 0x23A8, 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075, + 0xF07B, 0xF07C, 0x5213, 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB, + 0xF081, 0xF081, 0x1FEB, 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215, + 0xF087, 0xF087, 0x1F6A, 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219, + 0xF08B, 0xF08B, 0x2666, 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667, + 0xF091, 0xF091, 0x521F, 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220, + 0xF096, 0xF096, 0x23AD, 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27, + 0xF140, 0xF151, 0x522D, 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242, + 0xF154, 0xF154, 0x1F02, 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183, + 0xF158, 0xF158, 0x5241, 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9, + 0xF15B, 0xF166, 0x5242, 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E, + 0xF176, 0xF176, 0x22A5, 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA, + 0xF179, 0xF179, 0x525C, 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82, + 0xF17C, 0xF17D, 0x525D, 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404, + 0xF181, 0xF181, 0x525F, 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260, + 0xF184, 0xF184, 0x2184, 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403, + 0xF187, 0xF187, 0x5262, 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B, + 0xF18A, 0xF193, 0x5263, 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D, + 0xF198, 0xF198, 0x2067, 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85, + 0xF240, 0xF244, 0x5278, 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D, + 0xF247, 0xF247, 0x1E83, 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F, + 0xF24C, 0xF252, 0x5281, 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7, + 0xF255, 0xF255, 0x240D, 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412, + 0xF25D, 0xF25E, 0x528E, 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290, + 0xF271, 0xF271, 0x23F0, 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411, + 0xF274, 0xF274, 0x2414, 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170, + 0xF277, 0xF27B, 0x52A3, 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C, + 0xF27E, 0xF27E, 0x2415, 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066, + 0xF286, 0xF286, 0x52AD, 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413, + 0xF289, 0xF289, 0x2410, 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1, + 0xF28D, 0xF290, 0x52AE, 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2, + 0xF294, 0xF294, 0x2409, 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418, + 0xF297, 0xF29B, 0x52B5, 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA, + 0xF29E, 0xF29E, 0x21FC, 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3, + 0xF340, 0xF340, 0x1FC1, 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD, + 0xF345, 0xF345, 0x229C, 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E, + 0xF349, 0xF349, 0x52C2, 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419, + 0xF34C, 0xF34F, 0x52C3, 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7, + 0xF361, 0xF361, 0x1E29, 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661, + 0xF375, 0xF375, 0x52E9, 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174, + 0xF378, 0xF378, 0x2663, 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA, + 0xF380, 0xF38B, 0x52EF, 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB, + 0xF3A0, 0xF3A0, 0x214C, 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E, + 0xF445, 0xF445, 0x267A, 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0, + 0xF451, 0xF456, 0x531D, 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323, + 0xF459, 0xF459, 0x1ED0, 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096, + 0xF45C, 0xF45C, 0x5325, 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326, + 0xF462, 0xF462, 0x23C8, 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E, + 0xF465, 0xF474, 0x532B, 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B, + 0xF47C, 0xF47C, 0x2664, 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239, + 0xF480, 0xF493, 0x5342, 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356, + 0xF499, 0xF499, 0x261F, 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E, + 0xF49D, 0xF4A0, 0x535C, 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360, + 0xF545, 0xF545, 0x2620, 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621, + 0xF548, 0xF551, 0x5366, 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370, + 0xF554, 0xF554, 0x2627, 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625, + 0xF557, 0xF55D, 0x5371, 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378, + 0xF561, 0xF561, 0x262E, 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A, + 0xF56E, 0xF56E, 0x262A, 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385, + 0xF571, 0xF571, 0x2628, 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386, + 0xF580, 0xF584, 0x5392, 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630, + 0xF587, 0xF58B, 0x5397, 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C, + 0xF58E, 0xF58E, 0x200D, 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D, + 0xF599, 0xF599, 0x2645, 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A, + 0xF59C, 0xF59F, 0x53A7, 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD, + 0xF640, 0xF640, 0x53AB, 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC, + 0xF645, 0xF645, 0x263D, 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF, + 0xF648, 0xF648, 0x263E, 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F, + 0xF64C, 0xF64C, 0x1FC0, 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B, + 0xF650, 0xF653, 0x53B3, 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7, + 0xF658, 0xF658, 0x2644, 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639, + 0xF662, 0xF662, 0x53C2, 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3, + 0xF66C, 0xF66C, 0x2647, 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB, + 0xF671, 0xF671, 0x2649, 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648, + 0xF675, 0xF675, 0x53D0, 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108, + 0xF678, 0xF67E, 0x53D1, 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D, + 0xF686, 0xF687, 0x53DD, 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF, + 0xF68A, 0xF68A, 0x2651, 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650, + 0xF68E, 0xF68E, 0x2652, 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F, + 0xF693, 0xF695, 0x53E5, 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E, + 0xF698, 0xF698, 0x2653, 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657, + 0xF69B, 0xF69B, 0x53E9, 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA, + 0xF69E, 0xF69E, 0x2633, 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656, + 0xF6A1, 0xF6FE, 0x1D5B, 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654, + 0xF743, 0xF748, 0x53EE, 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4, + 0xF74C, 0xF74C, 0x2655, 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6, + 0xF756, 0xF756, 0x265B, 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A, + 0xF759, 0xF759, 0x53FF, 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E, + 0xF75C, 0xF75C, 0x262F, 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646, + 0xF762, 0xF762, 0x5404, 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405, + 0xF76B, 0xF76B, 0x265C, 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C, + 0xF772, 0xF77B, 0x5411, 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B, + 0xF77E, 0xF77E, 0x2631, 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9, + 0xF840, 0xF841, 0x543D, 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F, + 0xF846, 0xF846, 0x2580, 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC, + 0xF84A, 0xF84F, 0x5444, 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B, + 0xF852, 0xF852, 0x544A, 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B, + 0xF863, 0xF863, 0x2583, 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A, + 0xF866, 0xF866, 0x21EE, 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182, + 0xF873, 0xF877, 0x5466, 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B, + 0xF87A, 0xF87A, 0x2587, 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588, + 0xF87D, 0xF87E, 0x546D, 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584, + 0xF882, 0xF883, 0x5470, 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472, + 0xF886, 0xF886, 0x21EF, 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A, + 0xF88E, 0xF88E, 0x258C, 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47, + 0xF89A, 0xF89C, 0x5483, 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486, + 0xF8A0, 0xF8A0, 0x258D, 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0, + 0xF94F, 0xF94F, 0x2592, 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496, + 0xF959, 0xF959, 0x2594, 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E, + 0xF95D, 0xF95D, 0x2591, 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0, + 0xF967, 0xF967, 0x2597, 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6, + 0xF96A, 0xF96B, 0x54A9, 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB, + 0xF96F, 0xF96F, 0x20F6, 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC, + 0xF985, 0xF985, 0x2585, 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599, + 0xF988, 0xF990, 0x54C2, 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB, + 0xF996, 0xF996, 0x259A, 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B, + 0xF999, 0xF9A0, 0x54D0, 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D, + 0xFA43, 0xFA45, 0x54DA, 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD, + 0xFA4C, 0xFA4C, 0x234C, 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44, + 0xFA52, 0xFA57, 0x54E6, 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0, + 0xFA5A, 0xFA5C, 0x54EC, 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF, + 0xFA5F, 0xFA5F, 0x259F, 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C, + 0xFA62, 0xFA6F, 0x54F1, 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF, + 0xFA74, 0xFA74, 0x20AE, 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B, + 0xFA77, 0xFA77, 0x25A3, 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A, + 0xFA83, 0xFA83, 0x2589, 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D, + 0xFA8D, 0xFA8D, 0x25A4, 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6, + 0xFA91, 0xFA91, 0x2593, 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7, + 0xFA97, 0xFA97, 0x2222, 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B, + 0xFB40, 0xFB48, 0x5523, 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C, + 0xFB52, 0xFB52, 0x2586, 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1, + 0xFB58, 0xFB58, 0x25AA, 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590, + 0xFB5B, 0xFB5B, 0x258E, 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688, + 0xFB76, 0xFB78, 0x5552, 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB, + 0xFB7B, 0xFB7B, 0x5555, 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4, + 0xFB7E, 0xFB7E, 0x5556, 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F, + 0xFB91, 0xFB9B, 0x5567, 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572, + 0xFB9F, 0xFB9F, 0x25F7, 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575, + 0xFC44, 0xFC44, 0x2696, 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F, + 0xFC4A, 0xFC59, 0x557D, 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D, + 0xFC63, 0xFC63, 0x1EC1, 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3, + 0xFC69, 0xFC6E, 0x5599, 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F, + 0xFC71, 0xFC71, 0x268A, 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669, + 0xFC75, 0xFC76, 0x55A2, 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4, + 0xFC80, 0xFC82, 0x55AA, 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD, + 0xFC8A, 0xFC8A, 0x2673, 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9, + 0xFD52, 0xFD52, 0x20C6, 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB, + 0xFD57, 0xFD57, 0x24D3, 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE, + 0xFD5A, 0xFD5A, 0x260F, 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611, + 0xFD60, 0xFD61, 0x55E3, 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5, + 0xFD65, 0xFD65, 0x2610, 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030, + 0xFD68, 0xFD68, 0x55E7, 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8, + 0xFD6C, 0xFD6C, 0x2614, 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616, + 0xFD71, 0xFD71, 0x55ED, 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE, + 0xFD78, 0xFD78, 0x20F2, 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617, + 0xFD7E, 0xFD7E, 0x55F7, 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037, + 0xFD89, 0xFD8A, 0x5600, 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602, + 0xFD8F, 0xFD8F, 0x1F22, 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605, + 0xFD94, 0xFD94, 0x1F34, 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02, + 0xFD9E, 0xFD9E, 0x40D3, 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083, + 0xFE40, 0xFE40, 0x1259, 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK-EUC-V_2.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK-EUC-V_2.cpp new file mode 100644 index 000000000000..87e53a7b7070 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK-EUC-V_2.cpp @@ -0,0 +1,17 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +const uint16_t g_FXCMAP_GBK_EUC_V_2[20 * 3] = { + 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256, + 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246, + 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244, + 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240, + 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D, + 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254, + 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK2K-H_5.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK2K-H_5.cpp new file mode 100644 index 000000000000..37b8803cc27f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK2K-H_5.cpp @@ -0,0 +1,1822 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +const uint16_t g_FXCMAP_GBK2K_H_5[4071 * 3] = { + 0x0020, 0x007E, 0x0001, 0x8140, 0x8178, 0x2758, 0x8179, 0x8179, 0x2059, + 0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796, 0x8186, 0x8186, 0x21F1, + 0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2, 0x81EE, 0x81F5, 0x2802, + 0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A, 0x8240, 0x8252, 0x2812, + 0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825, 0x8262, 0x8262, 0x21B5, + 0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC, 0x8275, 0x8279, 0x2844, + 0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849, 0x827D, 0x827D, 0x1E62, + 0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20, 0x8281, 0x8282, 0x284C, + 0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E, 0x8290, 0x8290, 0x205C, + 0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194, 0x82A6, 0x82C7, 0x286E, + 0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281, 0x82CA, 0x82E0, 0x2890, + 0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7, 0x82E3, 0x82E3, 0x210A, + 0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8, 0x82ED, 0x82ED, 0x267F, + 0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E, 0x82F3, 0x82F6, 0x28B4, + 0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB, 0x82F9, 0x82F9, 0x226C, + 0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117, 0x82FC, 0x82FE, 0x28B9, + 0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8, 0x8342, 0x8344, 0x28BD, + 0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0, 0x8348, 0x8348, 0x1FB9, + 0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8, 0x834D, 0x8352, 0x28C5, + 0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB, 0x8357, 0x8357, 0x20C2, + 0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195, 0x835F, 0x8364, 0x28D4, + 0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3, 0x8367, 0x8371, 0x28DA, + 0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5, 0x8378, 0x8378, 0x2210, + 0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF, 0x837B, 0x837B, 0x28EB, + 0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC, 0x837E, 0x837E, 0x1FE4, + 0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED, 0x8386, 0x8386, 0x22D6, + 0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0, 0x838A, 0x838A, 0x22CE, + 0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681, 0x838E, 0x8393, 0x28F6, + 0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC, 0x839E, 0x839E, 0x2231, + 0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93, 0x83A7, 0x83AA, 0x290C, + 0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910, 0x83AE, 0x83AE, 0x22D7, + 0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1, 0x83B1, 0x83B9, 0x2912, + 0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B, 0x83C9, 0x83C9, 0x2025, + 0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF, 0x83F7, 0x83FE, 0x2955, + 0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9, 0x8451, 0x8470, 0x296D, + 0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D, 0x8474, 0x8474, 0x2263, + 0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683, 0x8478, 0x847E, 0x2991, + 0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17, 0x8483, 0x848D, 0x299A, + 0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5, 0x8492, 0x8492, 0x22CA, + 0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8, 0x849D, 0x849D, 0x1F4F, + 0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF, 0x84A2, 0x84A2, 0x2036, + 0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4, 0x84A5, 0x84A5, 0x22C9, + 0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5, 0x84A9, 0x84A9, 0x1F75, + 0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE, 0x84C6, 0x84D2, 0x29D2, + 0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF, 0x84D5, 0x84D5, 0x21A9, + 0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6, 0x84D8, 0x84D8, 0x29E1, + 0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003, 0x84DB, 0x84DC, 0x29E2, + 0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4, 0x84EA, 0x84EA, 0x2323, + 0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011, 0x84EF, 0x84F0, 0x29F3, + 0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5, 0x8540, 0x8550, 0x2A02, + 0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E, 0x8553, 0x8553, 0x2A13, + 0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14, 0x855E, 0x855E, 0x20EF, + 0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0, 0x8567, 0x857E, 0x2A24, + 0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1, 0x8588, 0x858A, 0x2A43, + 0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46, 0x8592, 0x8592, 0x21F9, + 0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010, 0x8597, 0x8597, 0x2A4F, + 0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50, 0x85A2, 0x85A2, 0x1E5A, + 0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2, 0x85B3, 0x85FE, 0x2A68, + 0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D, 0x864B, 0x8653, 0x2ABE, + 0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7, 0x8668, 0x8668, 0x236C, + 0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0, 0x8696, 0x8696, 0x219C, + 0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9, 0x869A, 0x86A0, 0x2B08, + 0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F, 0x86CA, 0x86CA, 0x210B, + 0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE, 0x86CD, 0x86CD, 0x2B38, + 0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39, 0x86D1, 0x86D1, 0x222C, + 0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8, 0x86DD, 0x86DD, 0x22C0, + 0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F, 0x86E2, 0x86E7, 0x2B48, + 0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E, 0x86EE, 0x86EE, 0x2379, + 0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372, 0x86F5, 0x86FE, 0x2B58, + 0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62, 0x8744, 0x8744, 0x237C, + 0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0, 0x874A, 0x874A, 0x2B69, + 0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74, 0x874D, 0x874E, 0x2B6A, + 0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C, 0x8757, 0x8757, 0x1F4C, + 0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378, 0x875B, 0x875B, 0x21CF, + 0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75, 0x875E, 0x875E, 0x2371, + 0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369, 0x8761, 0x8765, 0x2B77, + 0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C, 0x877A, 0x877A, 0x236F, + 0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370, 0x877E, 0x877E, 0x2B91, + 0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376, 0x8782, 0x8782, 0x2373, + 0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F, 0x8787, 0x8787, 0x2B96, + 0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97, 0x878A, 0x878A, 0x20B5, + 0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB, 0x878E, 0x878E, 0x2672, + 0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E, 0x8794, 0x8797, 0x2B9E, + 0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2, 0x879D, 0x879D, 0x2375, + 0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382, 0x87A4, 0x87A6, 0x2BAB, + 0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE, 0x87B3, 0x87B3, 0x236B, + 0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039, 0x87B6, 0x87BA, 0x2BBA, + 0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF, 0x87BF, 0x87BF, 0x237D, + 0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2, 0x87C2, 0x87C2, 0x2381, + 0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B, 0x87CB, 0x87CB, 0x237E, + 0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA, 0x87CF, 0x87CF, 0x22DB, + 0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A, 0x87D3, 0x87D3, 0x2689, + 0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697, 0x87D6, 0x87D9, 0x2BCF, + 0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3, 0x87F7, 0x87F7, 0x2383, + 0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF, 0x87FA, 0x87FA, 0x218F, + 0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246, 0x8841, 0x8841, 0x2248, + 0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E, 0x8845, 0x8845, 0x2BF6, + 0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7, 0x8880, 0x88B9, 0x2C2F, + 0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69, 0x88CC, 0x88CC, 0x228B, + 0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85, 0x88D5, 0x88D6, 0x2C81, + 0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83, 0x88DF, 0x88DF, 0x232C, + 0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E, 0x88E6, 0x88F1, 0x2C8F, + 0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38, 0x88F4, 0x88F5, 0x2C9B, + 0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D, 0x8940, 0x894A, 0x2CA5, + 0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339, 0x894D, 0x894D, 0x2CB0, + 0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1, 0x8950, 0x8950, 0x232D, + 0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F, 0x8955, 0x895C, 0x2CB5, + 0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD, 0x895F, 0x895F, 0x232F, + 0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D, 0x896E, 0x8970, 0x2CCB, + 0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE, 0x897C, 0x897C, 0x1EC2, + 0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA, 0x898B, 0x898B, 0x22B2, + 0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF, 0x899A, 0x899D, 0x2CF2, + 0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6, 0x89A6, 0x89A6, 0x20D9, + 0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD, 0x89A9, 0x89AE, 0x2CFE, + 0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04, 0x89BA, 0x89BA, 0x21ED, + 0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007, 0x89BF, 0x89BF, 0x2326, + 0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11, 0x89C4, 0x89C4, 0x1F52, + 0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328, 0x89C7, 0x89C7, 0x2D14, + 0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15, 0x89CE, 0x89CE, 0x1E2B, + 0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE, 0x89D2, 0x89D7, 0x2D1C, + 0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22, 0x89DB, 0x89DB, 0x2138, + 0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081, 0x89F5, 0x89FE, 0x2D3C, + 0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C, 0x8A42, 0x8A58, 0x2D47, + 0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE, 0x8A5B, 0x8A5B, 0x2D5E, + 0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F, 0x8A5E, 0x8A5E, 0x1EFA, + 0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD, 0x8A7A, 0x8A7E, 0x2D7A, + 0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F, 0x8AE5, 0x8AFE, 0x2DE3, + 0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E, 0x8B45, 0x8B48, 0x2E01, + 0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05, 0x8B7A, 0x8B7A, 0x23FC, + 0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39, 0x8B8C, 0x8B8C, 0x2069, + 0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7, 0x8B9F, 0x8BB2, 0x2E56, + 0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A, 0x8BB9, 0x8BB9, 0x23FD, + 0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8, 0x8BBF, 0x8BC5, 0x2E73, + 0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A, 0x8BC8, 0x8BC8, 0x23FE, + 0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B, 0x8BD4, 0x8BD4, 0x2401, + 0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF, 0x8BDD, 0x8BE4, 0x2E8C, + 0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94, 0x8BEB, 0x8BEB, 0x2221, + 0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122, 0x8BF1, 0x8BFE, 0x2E9D, + 0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB, 0x8C45, 0x8C4E, 0x2EAF, + 0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9, 0x8C57, 0x8C57, 0x21E5, + 0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057, 0x8C5D, 0x8C7E, 0x2EC4, + 0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5, 0x8C8C, 0x8C8C, 0x2EF1, + 0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3, 0x8C8F, 0x8C8F, 0x2121, + 0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4, 0x8C92, 0x8C92, 0x1FE5, + 0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A, 0x8C9A, 0x8C9A, 0x1E37, + 0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E, 0x8CA3, 0x8CA3, 0x22A6, + 0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00, 0x8CA6, 0x8CA6, 0x1EDA, + 0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01, 0x8CC0, 0x8CC0, 0x235C, + 0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050, 0x8CD3, 0x8CD3, 0x1E67, + 0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4, 0x8CD6, 0x8CD8, 0x2F2B, + 0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E, 0x8CF9, 0x8CF9, 0x1F16, + 0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52, 0x8D73, 0x8D73, 0x2389, + 0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7, 0x8D76, 0x8D7A, 0x2F86, + 0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B, 0x8D80, 0x8D87, 0x2F8E, + 0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96, 0x8D8F, 0x8D8F, 0x1F1A, + 0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B, 0x8D9F, 0x8DB8, 0x2FAA, + 0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4, 0x8DE2, 0x8DE2, 0x2391, + 0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271, 0x8DE5, 0x8DE6, 0x2FED, + 0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF, 0x8DF7, 0x8DF7, 0x238E, + 0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D, 0x8E40, 0x8E45, 0x3004, + 0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A, 0x8E56, 0x8E56, 0x2390, + 0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033, 0x8E59, 0x8E59, 0x301A, + 0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B, 0x8E68, 0x8E68, 0x1FE9, + 0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055, 0x8E6F, 0x8E6F, 0x302D, + 0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E, 0x8E80, 0x8E80, 0x2324, + 0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143, 0x8E9C, 0x8E9E, 0x3056, + 0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059, 0x8EA4, 0x8EA4, 0x2277, + 0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7, 0x8EA8, 0x8EAB, 0x305F, + 0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063, 0x8EAE, 0x8EAE, 0x2384, + 0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387, 0x8EBE, 0x8EBE, 0x2386, + 0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290, 0x8EC4, 0x8EC4, 0x3076, + 0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077, 0x8ECD, 0x8ECD, 0x1E32, + 0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E, 0x8ED6, 0x8ED6, 0x1F13, + 0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085, 0x8EEC, 0x8EEC, 0x1FE0, + 0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB, 0x8F52, 0x8F52, 0x2087, + 0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE, 0x8F55, 0x8F55, 0x1EF6, + 0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD, 0x8F5D, 0x8F5D, 0x2045, + 0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178, 0x8F65, 0x8F7E, 0x30C9, + 0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5, 0x8F87, 0x8F87, 0x30E9, + 0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA, 0x8F95, 0x8F95, 0x266E, + 0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0, 0x8F98, 0x8F9A, 0x30F7, + 0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA, 0x8F9D, 0x8F9D, 0x2188, + 0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C, 0x8FA2, 0x8FBC, 0x30FE, + 0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119, 0x8FC4, 0x8FC4, 0x1EA1, + 0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393, 0x8FC7, 0x8FCC, 0x3120, + 0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126, 0x8FD8, 0x8FD8, 0x1E7C, + 0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156, 0x9080, 0x909C, 0x3195, + 0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E, 0x909F, 0x90B9, 0x31B2, + 0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD, 0x90C0, 0x90C0, 0x2095, + 0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2, 0x90C5, 0x90C5, 0x23B9, + 0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28, 0x90DC, 0x90DC, 0x23BD, + 0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5, 0x90EE, 0x90EF, 0x31FA, + 0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC, 0x90F7, 0x90F7, 0x23B3, + 0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209, 0x9142, 0x9142, 0x2162, + 0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E, 0x914C, 0x914C, 0x3213, + 0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214, 0x9151, 0x9151, 0x23B7, + 0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F, 0x9155, 0x9155, 0x24DF, + 0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2, 0x915A, 0x915A, 0x214E, + 0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052, 0x915E, 0x9160, 0x321E, + 0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221, 0x9163, 0x9163, 0x20EB, + 0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232, 0x916F, 0x9175, 0x322C, + 0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233, 0x917A, 0x917A, 0x201B, + 0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE, 0x917D, 0x917E, 0x3236, + 0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE, 0x9185, 0x918C, 0x323C, + 0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244, 0x9191, 0x9191, 0x2089, + 0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1, 0x9194, 0x9196, 0x3248, + 0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B, 0x919B, 0x919B, 0x2214, + 0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE, 0x91AA, 0x91AA, 0x2223, + 0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B, 0x91BA, 0x91BA, 0x268C, + 0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269, 0x91BF, 0x91BF, 0x24E0, + 0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8, 0x91C4, 0x91CC, 0x326F, + 0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278, 0x91D0, 0x91D0, 0x1FFE, + 0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1, 0x91D3, 0x91D3, 0x327A, + 0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B, 0x91D6, 0x91D6, 0x1FCE, + 0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E, 0x91D9, 0x91D9, 0x2021, + 0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1, 0x91E0, 0x91E1, 0x3282, + 0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284, 0x91EA, 0x91EA, 0x24A4, + 0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273, 0x91F1, 0x91F1, 0x3290, + 0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291, 0x9240, 0x927E, 0x329D, + 0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1, 0x92B7, 0x92CD, 0x3312, + 0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329, 0x92D0, 0x92D0, 0x235D, + 0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682, 0x92D5, 0x92DE, 0x332D, + 0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A, 0x92E1, 0x92FD, 0x3337, + 0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354, 0x9350, 0x9350, 0x21FF, + 0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58, 0x935E, 0x936F, 0x3370, + 0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382, 0x9376, 0x9376, 0x1EB6, + 0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F, 0x938C, 0x938C, 0x20DB, + 0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360, 0x939E, 0x93A4, 0x33AB, + 0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2, 0x93A7, 0x93A7, 0x2040, + 0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E, 0x93B5, 0x93B7, 0x33BF, + 0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2, 0x93BB, 0x93BB, 0x235E, + 0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A, 0x93BE, 0x93C5, 0x33C5, + 0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD, 0x93CF, 0x93CF, 0x2093, + 0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F, 0x93D8, 0x93DA, 0x33DC, + 0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54, 0x93DD, 0x93E0, 0x33DF, + 0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3, 0x93E4, 0x93E4, 0x20C0, + 0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5, 0x93E9, 0x93E9, 0x2160, + 0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D, 0x93EC, 0x93EC, 0x1F8E, + 0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9, 0x93EF, 0x93EF, 0x2047, + 0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262, 0x93F2, 0x93F3, 0x33EB, + 0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2, 0x93F6, 0x93F9, 0x33ED, + 0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1, 0x93FE, 0x93FE, 0x1FCC, + 0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72, 0x9445, 0x944C, 0x33F8, + 0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400, 0x9450, 0x9450, 0x1E52, + 0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C, 0x9453, 0x9453, 0x228F, + 0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED, 0x9456, 0x9457, 0x3403, + 0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405, 0x945B, 0x945B, 0x1E2D, + 0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366, 0x945E, 0x945E, 0x3407, + 0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408, 0x9464, 0x9464, 0x2363, + 0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A, 0x9467, 0x946D, 0x340D, + 0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414, 0x9472, 0x9472, 0x1FF6, + 0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364, 0x9475, 0x9475, 0x3418, + 0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419, 0x9478, 0x9478, 0x2367, + 0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D, 0x947B, 0x947E, 0x341B, + 0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056, 0x9482, 0x9482, 0x2163, + 0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9, 0x9488, 0x9488, 0x1FFC, + 0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E, 0x94A2, 0x94B2, 0x343B, + 0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C, 0x94B5, 0x94B5, 0x2142, + 0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E, 0x94C0, 0x94C0, 0x1E43, + 0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4, 0x94CD, 0x94D7, 0x3461, + 0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C, 0x94E0, 0x94E0, 0x1ED7, + 0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491, 0x9572, 0x9572, 0x212D, + 0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF, 0x9583, 0x9583, 0x229B, + 0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256, 0x959F, 0x959F, 0x24A8, + 0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79, 0x95B4, 0x95B9, 0x34FF, + 0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505, 0x95CF, 0x95CF, 0x24A7, + 0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686, 0x95D2, 0x95D2, 0x24A6, + 0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE, 0x95D5, 0x95E0, 0x351B, + 0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527, 0x95E7, 0x95E7, 0x1FE7, + 0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112, 0x95F2, 0x95F7, 0x3535, + 0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B, 0x95FE, 0x95FE, 0x1F5C, + 0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4, 0x9657, 0x967B, 0x3556, + 0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B, 0x9680, 0x96FE, 0x357D, + 0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A, 0x9768, 0x976B, 0x3623, + 0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627, 0x976E, 0x976E, 0x246D, + 0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638, 0x9796, 0x9796, 0x246B, + 0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E, 0x979D, 0x979D, 0x1ECE, + 0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272, 0x97A4, 0x97BE, 0x3658, + 0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673, 0x97EE, 0x97EE, 0x21FE, + 0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE, 0x97F8, 0x97FE, 0x36A9, + 0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475, 0x9846, 0x9848, 0x36B5, + 0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8, 0x984F, 0x984F, 0x1F6F, + 0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468, 0x9872, 0x9872, 0x36DE, + 0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF, 0x9880, 0x9880, 0x36EA, + 0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB, 0x988B, 0x988B, 0x1F27, + 0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4, 0x98A0, 0x98A0, 0x247C, + 0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1, 0x98AB, 0x98B5, 0x3710, + 0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005, 0x98B8, 0x98B9, 0x371B, + 0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D, 0x98C7, 0x98C7, 0x203E, + 0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C, 0x98CC, 0x98CF, 0x372C, + 0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730, 0x98D3, 0x98D3, 0x2204, + 0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3, 0x98E4, 0x98E4, 0x2140, + 0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741, 0x98EF, 0x98EF, 0x2474, + 0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD, 0x98F3, 0x98FE, 0x374C, + 0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68, 0x9944, 0x9944, 0x375B, + 0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C, 0x9966, 0x9966, 0x2472, + 0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5, 0x996F, 0x9974, 0x3783, + 0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789, 0x997A, 0x997A, 0x1F8B, + 0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D, 0x9980, 0x9984, 0x3790, + 0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795, 0x9989, 0x9989, 0x2482, + 0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1, 0x998F, 0x9990, 0x379C, + 0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E, 0x9999, 0x9999, 0x1F38, + 0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485, 0x99AA, 0x99AF, 0x37B4, + 0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E, 0x99B2, 0x99B2, 0x37BA, + 0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486, 0x99B5, 0x99B5, 0x2471, + 0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483, 0x99BE, 0x99BE, 0x2470, + 0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469, 0x99C1, 0x99C1, 0x37C3, + 0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4, 0x99C9, 0x99C9, 0x246F, + 0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481, 0x99CF, 0x99D0, 0x37CE, + 0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0, 0x99DA, 0x99DA, 0x1FF5, + 0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4, 0x99E1, 0x99E4, 0x37DD, + 0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1, 0x99E8, 0x99E8, 0x2479, + 0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E, 0x99ED, 0x99F3, 0x37E6, + 0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED, 0x9A40, 0x9A49, 0x37F7, + 0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801, 0x9A57, 0x9A57, 0x20AD, + 0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB, 0x9A66, 0x9A66, 0x381A, + 0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B, 0x9A71, 0x9A71, 0x2159, + 0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013, 0x9A77, 0x9A77, 0x1F33, + 0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F, 0x9A88, 0x9A88, 0x1E5C, + 0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488, 0x9A8D, 0x9A90, 0x383A, + 0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E, 0x9A97, 0x9A97, 0x248A, + 0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489, 0x9A9B, 0x9A9B, 0x248B, + 0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83, 0x9A9F, 0x9AA1, 0x3847, + 0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB, 0x9AA4, 0x9AA9, 0x384A, + 0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850, 0x9AD0, 0x9AD0, 0x24C0, + 0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D, 0x9AD7, 0x9AD9, 0x387A, + 0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D, 0x9AE2, 0x9AE2, 0x20CA, + 0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7, 0x9AE5, 0x9AE5, 0x24C2, + 0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E, 0x9B80, 0x9BD0, 0x38DD, + 0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E, 0x9BDC, 0x9BDC, 0x23DB, + 0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A, 0x9C53, 0x9C53, 0x205E, + 0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244, 0x9C5A, 0x9C5A, 0x23E2, + 0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4, 0x9C5D, 0x9C74, 0x3973, + 0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B, 0x9C79, 0x9C79, 0x1E66, + 0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993, 0x9C86, 0x9C86, 0x1F63, + 0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD, 0x9C9E, 0x9CAA, 0x39AF, + 0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC, 0x9CCA, 0x9CCA, 0x22B5, + 0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26, 0x9CD0, 0x9CE5, 0x39DE, + 0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088, 0x9CE8, 0x9CEB, 0x39F4, + 0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8, 0x9CEE, 0x9CEE, 0x2341, + 0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B, 0x9CFC, 0x9CFD, 0x3A05, + 0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07, 0x9D42, 0x9D42, 0x2124, + 0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048, 0x9D47, 0x9D47, 0x23E0, + 0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077, 0x9D4E, 0x9D4E, 0x3A11, + 0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12, 0x9D61, 0x9D61, 0x20B1, + 0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41, 0x9D69, 0x9D69, 0x201C, + 0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8, 0x9D6F, 0x9D70, 0x3A2D, + 0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F, 0x9D75, 0x9D75, 0x1F9B, + 0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F, 0x9D7C, 0x9D7C, 0x3A37, + 0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38, 0x9D80, 0x9D89, 0x3A39, + 0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43, 0x9D8D, 0x9D8D, 0x1FB4, + 0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7, 0x9D92, 0x9D98, 0x3A48, + 0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F, 0x9DA1, 0x9DA1, 0x23E1, + 0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56, 0x9DA7, 0x9DA7, 0x23EA, + 0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3, 0x9DAD, 0x9DAD, 0x210E, + 0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6, 0x9DB3, 0x9DB3, 0x2004, + 0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D, 0x9DBF, 0x9DC5, 0x3A6C, + 0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73, 0x9DC9, 0x9DC9, 0x2264, + 0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2, 0x9DCE, 0x9DD1, 0x3A78, + 0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C, 0x9DD5, 0x9DD5, 0x1EC4, + 0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6, 0x9DE2, 0x9DE2, 0x20A9, + 0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B, 0x9DF2, 0x9DF3, 0x3A97, + 0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99, 0x9DF7, 0x9DF7, 0x268B, + 0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76, 0x9DFB, 0x9DFC, 0x3A9D, + 0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F, 0x9E40, 0x9E44, 0x3AA0, + 0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5, 0x9E48, 0x9E48, 0x2191, + 0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7, 0x9E52, 0x9E52, 0x1F9C, + 0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA, 0x9E55, 0x9E55, 0x3AB0, + 0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1, 0x9E5D, 0x9E5D, 0x23E9, + 0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7, 0x9E61, 0x9E61, 0x21D5, + 0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6, 0x9E64, 0x9E66, 0x3ABA, + 0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD, 0x9E6C, 0x9E6C, 0x1E4F, + 0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9, 0x9E70, 0x9E71, 0x3AC3, + 0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5, 0x9E74, 0x9E74, 0x23EC, + 0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6, 0x9E7B, 0x9E7B, 0x23D8, + 0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB, 0x9E80, 0x9E84, 0x3ACD, + 0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2, 0x9E87, 0x9E87, 0x23ED, + 0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA, 0x9E92, 0x9E95, 0x3ADC, + 0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8, 0x9E98, 0x9EA1, 0x3AE0, + 0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA, 0x9EA6, 0x9EA6, 0x200B, + 0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166, 0x9EAA, 0x9EAD, 0x3AEF, + 0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3, 0x9EB3, 0x9EB3, 0x2189, + 0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7, 0x9EB7, 0x9EB7, 0x23E7, + 0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3, 0x9EF6, 0x9EFE, 0x3B36, + 0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A, 0x9F4F, 0x9F6E, 0x3B4D, + 0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D, 0x9F80, 0x9F91, 0x3B7C, + 0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E, 0x9F98, 0x9F98, 0x24D6, + 0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A, 0x9FA7, 0x9FA8, 0x3BA0, + 0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2, 0x9FAC, 0x9FAC, 0x24D5, + 0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228, 0x9FCA, 0x9FCC, 0x3BC0, + 0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3, 0x9FE1, 0x9FE1, 0x20FC, + 0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87, 0x9FEC, 0x9FED, 0x3BDF, + 0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1, 0x9FF4, 0x9FF4, 0x1EBA, + 0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119, 0x9FFE, 0x9FFE, 0x3BEE, + 0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C, 0xA044, 0xA045, 0x3BF2, + 0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4, 0xA049, 0xA049, 0x2227, + 0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F, 0xA04F, 0xA053, 0x3BFA, + 0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF, 0xA05A, 0xA05A, 0x1F5D, + 0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC, 0xA062, 0xA062, 0x3C0A, + 0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B, 0xA071, 0xA071, 0x2149, + 0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046, 0xA075, 0xA07E, 0x3C1A, + 0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24, 0xA091, 0xA091, 0x2190, + 0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208, 0xA095, 0xA095, 0x3C36, + 0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37, 0xA0A9, 0xA0A9, 0x24C3, + 0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC, 0xA0C0, 0xA0CD, 0x3C5E, + 0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C, 0xA0D9, 0xA0D9, 0x1ED1, + 0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC, 0xA0DF, 0xA0ED, 0x3C7A, + 0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89, 0xA1A1, 0xA1FE, 0x0060, + 0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E3, 0xA2E3, 0x5751, + 0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, + 0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, + 0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, + 0xA840, 0xA87E, 0x26B3, 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C, + 0xA8C5, 0xA8EA, 0x02BC, 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720, + 0xA95C, 0xA95C, 0x2722, 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742, + 0xA996, 0xA996, 0x1E17, 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99, + 0xAA4D, 0xAA4D, 0x21B6, 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6, + 0xAA71, 0xAA71, 0x2235, 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397, + 0xAA74, 0xAA76, 0x3CC9, 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC, + 0xAA7A, 0xAA7A, 0x223F, 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE, + 0xAA80, 0xAA99, 0x3CD1, 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB, + 0xAA9C, 0xAA9C, 0x2396, 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC, + 0xAA9F, 0xAA9F, 0x20A2, 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E, + 0xAB40, 0xAB40, 0x1F64, 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B, + 0xAB44, 0xAB44, 0x3CF0, 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139, + 0xAB47, 0xAB47, 0x3CF1, 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1, + 0xAB4A, 0xAB4A, 0x239A, 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399, + 0xAB4E, 0xAB7E, 0x3CF4, 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C, + 0xAC40, 0xAC45, 0x3D46, 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C, + 0xAC71, 0xAC71, 0x2460, 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C, + 0xAC7D, 0xAC7E, 0x3D80, 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D, + 0xAC8E, 0xAC92, 0x3D8F, 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A, + 0xAC95, 0xACA0, 0x3D94, 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461, + 0xAD4A, 0xAD5D, 0x3DA9, 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD, + 0xAD61, 0xAD61, 0x2462, 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54, + 0xAD69, 0xAD73, 0x3DC5, 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0, + 0xAD80, 0xAD81, 0x3DDA, 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC, + 0xAD87, 0xAD87, 0x245D, 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463, + 0xAD8C, 0xAD90, 0x3DE3, 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8, + 0xAE40, 0xAE53, 0x3DF7, 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B, + 0xAE62, 0xAE62, 0x1E70, 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F, + 0xAE81, 0xAE84, 0x3E34, 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38, + 0xAE8B, 0xAE8B, 0x1F4E, 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1, + 0xAE95, 0xAE9F, 0x3E45, 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50, + 0xAF64, 0xAF64, 0x1FC6, 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE, + 0xAF7C, 0xAF7E, 0x3E8A, 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01, + 0xAF83, 0xAF83, 0x2200, 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2, + 0xAF8F, 0xAF8F, 0x1E97, 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB, + 0xAF92, 0xAF9B, 0x3E9A, 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4, + 0xAF9F, 0xAF9F, 0x2028, 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7, + 0xB041, 0xB042, 0x25AF, 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1, + 0xB045, 0xB04E, 0x3EA9, 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3, + 0xB054, 0xB054, 0x1E4E, 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202, + 0xB058, 0xB058, 0x25AB, 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9, + 0xB05B, 0xB05B, 0x25AD, 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6, + 0xB05E, 0xB05E, 0x3EBB, 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4, + 0xB062, 0xB062, 0x222F, 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7, + 0xB065, 0xB06B, 0x3EBC, 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3, + 0xB07D, 0xB07D, 0x1E25, 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4, + 0xB097, 0xB097, 0x25C0, 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A, + 0xB09A, 0xB0A0, 0x3EEC, 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3, + 0xB14B, 0xB14B, 0x226E, 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD, + 0xB14E, 0xB14E, 0x3EFF, 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2, + 0xB151, 0xB151, 0x3F00, 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01, + 0xB180, 0xB196, 0x3F2D, 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44, + 0xB1A1, 0xB1FE, 0x040A, 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF, + 0xB242, 0xB266, 0x3F4E, 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73, + 0xB26D, 0xB26D, 0x2074, 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687, + 0xB275, 0xB27E, 0x3F7E, 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88, + 0xB289, 0xB289, 0x268D, 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0, + 0xB29B, 0xB2A0, 0x3FA0, 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6, + 0xB343, 0xB343, 0x1FAB, 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8, + 0xB371, 0xB37E, 0x3FD5, 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9, + 0xB389, 0xB38B, 0x3FEB, 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE, + 0xB38E, 0xB38E, 0x21FA, 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6, + 0xB440, 0xB453, 0x4001, 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015, + 0xB458, 0xB458, 0x24E4, 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6, + 0xB45F, 0xB45F, 0x20F7, 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B, + 0xB462, 0xB474, 0x401E, 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031, + 0xB47E, 0xB47E, 0x24EC, 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB, + 0xB484, 0xB488, 0x403C, 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041, + 0xB493, 0xB493, 0x24EA, 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524, + 0xB540, 0xB540, 0x4057, 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058, + 0xB54B, 0xB54B, 0x1E27, 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6, + 0xB557, 0xB559, 0x406B, 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012, + 0xB55C, 0xB55C, 0x1EEC, 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8, + 0xB562, 0xB57E, 0x4072, 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66, + 0xB59D, 0xB59D, 0x24DC, 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582, + 0xB640, 0xB651, 0x40AE, 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0, + 0xB655, 0xB655, 0x24DD, 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E, + 0xB65A, 0xB65A, 0x40C5, 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8, + 0xB65D, 0xB67E, 0x40C6, 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0, + 0xB740, 0xB74D, 0x4109, 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117, + 0xB751, 0xB751, 0x1E80, 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677, + 0xB75A, 0xB763, 0x4120, 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69, + 0xB766, 0xB766, 0x222B, 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F, + 0xB778, 0xB778, 0x1F5B, 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B, + 0xB781, 0xB781, 0x4140, 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141, + 0xB7A1, 0xB7FE, 0x063E, 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0, + 0xB844, 0xB844, 0x2186, 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED, + 0xB847, 0xB84C, 0x4163, 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169, + 0xB851, 0xB851, 0x1FEA, 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4, + 0xB85B, 0xB85B, 0x20E1, 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8, + 0xB85E, 0xB85E, 0x2260, 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2, + 0xB861, 0xB876, 0x4176, 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C, + 0xB880, 0xB881, 0x4193, 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195, + 0xB8A1, 0xB8FE, 0x069C, 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41, + 0xB951, 0xB960, 0x41C3, 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3, + 0xB97B, 0xB97B, 0x1F86, 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF, + 0xB99D, 0xB99D, 0x1FB3, 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF, + 0xB9A1, 0xB9FE, 0x06FA, 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4, + 0xBA43, 0xBA43, 0x4210, 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211, + 0xBA56, 0xBA56, 0x25E3, 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111, + 0xBA5A, 0xBA5F, 0x4224, 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A, + 0xBA6A, 0xBA6A, 0x25E7, 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041, + 0xBA75, 0xBA7E, 0x423C, 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA, + 0xBA85, 0xBA85, 0x424A, 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B, + 0xBA88, 0xBA88, 0x25EC, 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB, + 0xBA8E, 0xBA9D, 0x4250, 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D, + 0xBAA0, 0xBAA0, 0x4260, 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7, + 0xBB41, 0xBB48, 0x4261, 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269, + 0xBB58, 0xBB58, 0x25E9, 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE, + 0xBB5C, 0xBB5C, 0x203A, 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693, + 0xBB61, 0xBB64, 0x427C, 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED, + 0xBB67, 0xBB67, 0x4280, 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281, + 0xBB6A, 0xBB6A, 0x2065, 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3, + 0xBB6F, 0xBB7E, 0x4285, 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6, + 0xBC40, 0xBC51, 0x42B6, 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC, + 0xBC54, 0xBC59, 0x42C8, 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE, + 0xBC61, 0xBC61, 0x269B, 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3, + 0xBC64, 0xBC64, 0x42D5, 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6, + 0xBC67, 0xBC67, 0x25F4, 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B, + 0xBC6A, 0xBC6C, 0x42D8, 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB, + 0xBC6F, 0xBC6F, 0x1F7B, 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D, + 0xBC72, 0xBC72, 0x42DD, 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48, + 0xBC75, 0xBC75, 0x241C, 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF, + 0xBC79, 0xBC79, 0x219A, 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091, + 0xBC7C, 0xBC7D, 0x42DF, 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1, + 0xBC82, 0xBC82, 0x2423, 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422, + 0xBC85, 0xBC85, 0x42E3, 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4, + 0xBC88, 0xBC88, 0x228D, 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8, + 0xBC8B, 0xBC8B, 0x2421, 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3, + 0xBC90, 0xBC99, 0x42E8, 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426, + 0xBC9C, 0xBC9C, 0x2425, 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2, + 0xBCA1, 0xBCFE, 0x0814, 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A, + 0xBD43, 0xBD43, 0x2424, 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428, + 0xBD46, 0xBD47, 0x42F8, 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429, + 0xBD4A, 0xBD4A, 0x42FA, 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB, + 0xBD4D, 0xBD4D, 0x22BE, 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31, + 0xBD50, 0xBD56, 0x42FD, 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304, + 0xBD59, 0xBD59, 0x1FB5, 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B, + 0xBD67, 0xBD67, 0x1FAF, 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068, + 0xBD6B, 0xBD6B, 0x21E4, 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21, + 0xBD70, 0xBD70, 0x4316, 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317, + 0xBD79, 0xBD79, 0x217C, 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D, + 0xBD7C, 0xBD7D, 0x431E, 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320, + 0xBD81, 0xBD81, 0x1FD1, 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33, + 0xBD8A, 0xBD8A, 0x4328, 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329, + 0xBD8E, 0xBD8E, 0x242E, 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430, + 0xBD91, 0xBD91, 0x21DB, 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158, + 0xBD98, 0xBD9A, 0x4331, 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334, + 0xBDA1, 0xBDFE, 0x0872, 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9, + 0xBE44, 0xBE44, 0x433C, 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D, + 0xBE49, 0xBE49, 0x1E8E, 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340, + 0xBE51, 0xBE51, 0x21C5, 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192, + 0xBE54, 0xBE54, 0x4346, 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19, + 0xBE57, 0xBE57, 0x218C, 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3, + 0xBE5A, 0xBE5C, 0x4347, 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438, + 0xBE5F, 0xBE5F, 0x2432, 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A, + 0xBE62, 0xBE62, 0x1E9C, 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085, + 0xBE65, 0xBE68, 0x434B, 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F, + 0xBE6C, 0xBE6C, 0x243B, 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7, + 0xBE70, 0xBE70, 0x2433, 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054, + 0xBE77, 0xBE77, 0x21DE, 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434, + 0xBE7A, 0xBE7B, 0x4359, 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89, + 0xBE7E, 0xBE7E, 0x243C, 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E, + 0xBE84, 0xBE84, 0x1ED8, 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF, + 0xBE87, 0xBE87, 0x2445, 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249, + 0xBE8A, 0xBE8B, 0x4360, 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362, + 0xBE8E, 0xBE8E, 0x1E47, 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363, + 0xBE92, 0xBE92, 0x2086, 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196, + 0xBE96, 0xBE96, 0x4367, 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F, + 0xBE99, 0xBE99, 0x4368, 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369, + 0xBE9C, 0xBE9C, 0x2442, 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E, + 0xBEA0, 0xBEA0, 0x436C, 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6, + 0xBF41, 0xBF4C, 0x436D, 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446, + 0xBF4F, 0xBF4F, 0x244B, 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379, + 0xBF55, 0xBF55, 0x2427, 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D, + 0xBF60, 0xBF60, 0x1F0F, 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447, + 0xBF63, 0xBF63, 0x2449, 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387, + 0xBF68, 0xBF68, 0x21C2, 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E, + 0xBF6D, 0xBF6F, 0x438D, 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390, + 0xBF72, 0xBF72, 0x244A, 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391, + 0xBF76, 0xBF76, 0x22BB, 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393, + 0xBF79, 0xBF79, 0x2694, 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6, + 0xBF7C, 0xBF7C, 0x2051, 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E, + 0xBF80, 0xBF81, 0x4395, 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D, + 0xBF84, 0xBF88, 0x4397, 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451, + 0xBF8B, 0xBF94, 0x439C, 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6, + 0xBF97, 0xBF97, 0x2289, 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7, + 0xBF9D, 0xBF9D, 0x2454, 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E, + 0xC040, 0xC040, 0x20FB, 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440, + 0xC045, 0xC04A, 0x43B1, 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61, + 0xC04D, 0xC04D, 0x269D, 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A, + 0xC050, 0xC050, 0x2456, 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458, + 0xC053, 0xC054, 0x43B8, 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA, + 0xC05B, 0xC05B, 0x221A, 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A, + 0xC05F, 0xC05F, 0x244D, 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1, + 0xC069, 0xC069, 0x2453, 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420, + 0xC06C, 0xC06C, 0x43CA, 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685, + 0xC06F, 0xC06F, 0x43CB, 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC, + 0xC074, 0xC074, 0x2224, 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF, + 0xC077, 0xC077, 0x21BA, 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A, + 0xC07A, 0xC07B, 0x43D1, 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3, + 0xC080, 0xC09A, 0x43D5, 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0, + 0xC09D, 0xC09D, 0x269A, 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C, + 0xC140, 0xC14F, 0x43F4, 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404, + 0xC154, 0xC154, 0x1E2C, 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062, + 0xC160, 0xC160, 0x24F1, 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2, + 0xC163, 0xC174, 0x4412, 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424, + 0xC178, 0xC178, 0x2215, 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C, + 0xC195, 0xC195, 0x21AE, 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA, + 0xC240, 0xC24D, 0x444C, 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A, + 0xC265, 0xC265, 0x25C2, 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1, + 0xC268, 0xC27C, 0x4471, 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486, + 0xC280, 0xC283, 0x4487, 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B, + 0xC293, 0xC293, 0x2017, 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125, + 0xC296, 0xC296, 0x214D, 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4, + 0xC299, 0xC299, 0x209D, 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A, + 0xC29C, 0xC29C, 0x25C3, 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179, + 0xC2A1, 0xC2FE, 0x0A48, 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E, + 0xC343, 0xC343, 0x2155, 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2, + 0xC37C, 0xC37E, 0x44D7, 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7, + 0xC385, 0xC39A, 0x44DE, 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4, + 0xC3A1, 0xC3FE, 0x0AA6, 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123, + 0xC44A, 0xC44B, 0x4502, 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504, + 0xC454, 0xC454, 0x24C9, 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094, + 0xC459, 0xC45A, 0x450E, 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510, + 0xC463, 0xC463, 0x1E77, 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06, + 0xC478, 0xC479, 0x452A, 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C, + 0xC480, 0xC480, 0x4530, 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531, + 0xC491, 0xC491, 0x1EAD, 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8, + 0xC494, 0xC497, 0x4540, 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544, + 0xC49A, 0xC49A, 0x20C5, 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA, + 0xC49D, 0xC4A0, 0x4546, 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A, + 0xC544, 0xC544, 0x1FF0, 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6, + 0xC547, 0xC54A, 0x454F, 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE, + 0xC54D, 0xC551, 0x4553, 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558, + 0xC55F, 0xC55F, 0x2161, 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B, + 0xC564, 0xC564, 0x21D9, 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9, + 0xC567, 0xC57E, 0x4567, 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61, + 0xC594, 0xC59B, 0x4592, 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A, + 0xC59E, 0xC59E, 0x1F98, 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62, + 0xC640, 0xC640, 0x459D, 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E, + 0xC644, 0xC644, 0x1F88, 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8, + 0xC648, 0xC662, 0x45A2, 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD, + 0xC672, 0xC672, 0x2336, 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7, + 0xC6A1, 0xC6FE, 0x0BC0, 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB, + 0xC767, 0xC76E, 0x461E, 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626, + 0xC776, 0xC776, 0x1F7D, 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333, + 0xC77C, 0xC77E, 0x4630, 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E, + 0xC840, 0xC840, 0x4654, 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655, + 0xC84F, 0xC84F, 0x2334, 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1, + 0xC853, 0xC865, 0x4664, 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677, + 0xC86E, 0xC86E, 0x2349, 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B, + 0xC880, 0xC886, 0x468D, 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694, + 0xC892, 0xC892, 0x2347, 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193, + 0xC895, 0xC898, 0x469F, 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3, + 0xC89D, 0xC89D, 0x1F62, 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C, + 0xC940, 0xC94E, 0x46A9, 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348, + 0xC951, 0xC96D, 0x46B8, 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5, + 0xC970, 0xC970, 0x2345, 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12, + 0xC978, 0xC97E, 0x46DC, 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018, + 0xC990, 0xC990, 0x2335, 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C, + 0xC99D, 0xC9A0, 0x46FD, 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701, + 0xCA4E, 0xCA4E, 0x266F, 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351, + 0xCA57, 0xCA58, 0x4716, 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718, + 0xCA5C, 0xCA5C, 0x2338, 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B, + 0xCA62, 0xCA6D, 0x471E, 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A, + 0xCA72, 0xCA72, 0x234F, 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D, + 0xCA78, 0xCA7A, 0x4731, 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331, + 0xCA7D, 0xCA7D, 0x4734, 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735, + 0xCA81, 0xCA81, 0x233B, 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350, + 0xCA8A, 0xCA8D, 0x473D, 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6, + 0xCA90, 0xCA91, 0x4741, 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743, + 0xCA9A, 0xCA9A, 0x2355, 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38, + 0xCB40, 0xCB42, 0x4750, 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753, + 0xCB45, 0xCB45, 0x1F74, 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330, + 0xCB48, 0xCB4A, 0x4755, 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758, + 0xCB4E, 0xCB4E, 0x20DA, 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A, + 0xCB58, 0xCB5C, 0x4762, 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767, + 0xCB5F, 0xCB5F, 0x2107, 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F, + 0xCB6B, 0xCB7A, 0x4772, 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343, + 0xCB7D, 0xCB7E, 0x4782, 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212, + 0xCB88, 0xCB8D, 0x478B, 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791, + 0xCB92, 0xCB92, 0x2359, 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254, + 0xCB9D, 0xCB9D, 0x479D, 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E, + 0xCBA1, 0xCBFE, 0x0D96, 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357, + 0xCC42, 0xCC48, 0x47A0, 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042, + 0xCC4B, 0xCC4B, 0x2153, 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB, + 0xCC50, 0xCC5B, 0x47AA, 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6, + 0xCC60, 0xCC60, 0x2356, 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337, + 0xCC65, 0xCC6C, 0x47BC, 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4, + 0xCC79, 0xCC79, 0x2353, 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061, + 0xCC7E, 0xCC7E, 0x47D2, 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95, + 0xCC8F, 0xCC93, 0x47E1, 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6, + 0xCC96, 0xCC96, 0x1F42, 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8, + 0xCC9E, 0xCCA0, 0x47ED, 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0, + 0xCD80, 0xCD8F, 0x482F, 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F, + 0xCD98, 0xCD98, 0x25D7, 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52, + 0xCE40, 0xCE66, 0x484E, 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875, + 0xCE72, 0xCE72, 0x21B2, 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B, + 0xCE81, 0xCE81, 0x219E, 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC, + 0xCE88, 0xCE9A, 0x4891, 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4, + 0xCE9E, 0xCE9E, 0x2226, 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0, + 0xCF40, 0xCF4D, 0x48A8, 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6, + 0xCF55, 0xCF55, 0x227B, 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE, + 0xCF59, 0xCF5B, 0x48BE, 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1, + 0xCF6C, 0xCF6C, 0x25D5, 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B, + 0xCF74, 0xCF74, 0x48D6, 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7, + 0xCF78, 0xCF78, 0x1E89, 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9, + 0xCF7D, 0xCF7E, 0x48DC, 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211, + 0xCF82, 0xCF88, 0x48DF, 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6, + 0xCF8B, 0xCF92, 0x48E6, 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF, + 0xCF95, 0xCF9D, 0x48EE, 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7, + 0xCFA0, 0xCFA0, 0x25D8, 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8, + 0xD04D, 0xD04D, 0x1F29, 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B, + 0xD052, 0xD054, 0x4908, 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B, + 0xD05C, 0xD05C, 0x2297, 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690, + 0xD061, 0xD066, 0x4914, 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A, + 0xD06C, 0xD06C, 0x2198, 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88, + 0xD06F, 0xD07C, 0x491F, 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D, + 0xD080, 0xD0A0, 0x492E, 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F, + 0xD155, 0xD155, 0x25F1, 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C, + 0xD15A, 0xD160, 0x4967, 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC, + 0xD163, 0xD174, 0x496E, 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980, + 0xD17D, 0xD17D, 0x2676, 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988, + 0xD19D, 0xD19D, 0x1FE1, 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5, + 0xD1A1, 0xD1FE, 0x0FCA, 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7, + 0xD243, 0xD243, 0x22DD, 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD, + 0xD24E, 0xD25B, 0x49B2, 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0, + 0xD263, 0xD263, 0x25BC, 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6, + 0xD268, 0xD268, 0x25BF, 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187, + 0xD26E, 0xD26E, 0x49CD, 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE, + 0xD272, 0xD272, 0x1E7F, 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD, + 0xD276, 0xD27E, 0x49D2, 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96, + 0xD28B, 0xD28D, 0x49E5, 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8, + 0xD292, 0xD292, 0x2084, 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136, + 0xD296, 0xD296, 0x49ED, 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE, + 0xD2A0, 0xD2A0, 0x24BA, 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6, + 0xD344, 0xD344, 0x24BC, 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4, + 0xD349, 0xD349, 0x49FD, 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE, + 0xD34D, 0xD34D, 0x24BD, 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE, + 0xD351, 0xD354, 0x4A02, 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06, + 0xD358, 0xD358, 0x1FD2, 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD, + 0xD35C, 0xD35C, 0x4A0A, 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D, + 0xD35F, 0xD377, 0x4A0B, 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24, + 0xD37A, 0xD37A, 0x260A, 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94, + 0xD37D, 0xD37E, 0x4A26, 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF, + 0xD386, 0xD386, 0x1ECB, 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D, + 0xD38B, 0xD38B, 0x1F77, 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB, + 0xD38E, 0xD38E, 0x4A31, 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32, + 0xD391, 0xD391, 0x216F, 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0, + 0xD394, 0xD395, 0x4A34, 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36, + 0xD398, 0xD398, 0x22E2, 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37, + 0xD39B, 0xD39B, 0x1F78, 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2, + 0xD39F, 0xD39F, 0x4A3A, 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086, + 0xD440, 0xD440, 0x4A3B, 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C, + 0xD445, 0xD445, 0x1FD3, 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5, + 0xD448, 0xD44B, 0x4A40, 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44, + 0xD44F, 0xD44F, 0x211F, 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD, + 0xD454, 0xD455, 0x4A49, 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B, + 0xD458, 0xD458, 0x22E7, 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282, + 0xD45D, 0xD461, 0x4A4F, 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54, + 0xD467, 0xD467, 0x22E8, 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4, + 0xD46F, 0xD46F, 0x4A5E, 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F, + 0xD472, 0xD472, 0x22EB, 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9, + 0xD475, 0xD475, 0x20BD, 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA, + 0xD479, 0xD47A, 0x4A63, 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65, + 0xD47E, 0xD47E, 0x1E9E, 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6, + 0xD483, 0xD483, 0x21E7, 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69, + 0xD487, 0xD487, 0x2137, 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C, + 0xD48B, 0xD48B, 0x4A6D, 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2, + 0xD48E, 0xD48E, 0x1F37, 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E, + 0xD491, 0xD491, 0x22EF, 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10, + 0xD494, 0xD494, 0x21C8, 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1, + 0xD497, 0xD49B, 0x4A70, 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75, + 0xD49F, 0xD49F, 0x22EE, 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4, + 0xD540, 0xD542, 0x4A78, 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E, + 0xD545, 0xD545, 0x22EC, 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B, + 0xD54A, 0xD54A, 0x20FE, 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9, + 0xD550, 0xD550, 0x4A81, 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82, + 0xD554, 0xD554, 0x2236, 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7, + 0xD557, 0xD559, 0x4A85, 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88, + 0xD55C, 0xD55C, 0x1E82, 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89, + 0xD55F, 0xD55F, 0x21A4, 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8, + 0xD562, 0xD562, 0x2151, 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60, + 0xD565, 0xD567, 0x4A8B, 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E, + 0xD56C, 0xD56C, 0x2145, 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC, + 0xD56F, 0xD571, 0x4A92, 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95, + 0xD575, 0xD575, 0x1EF5, 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218, + 0xD579, 0xD57A, 0x4A99, 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B, + 0xD57E, 0xD57E, 0x2300, 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4, + 0xD582, 0xD583, 0x4A9E, 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0, + 0xD586, 0xD586, 0x22FD, 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA, + 0xD589, 0xD589, 0x4AA2, 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3, + 0xD58C, 0xD58C, 0x22FB, 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC, + 0xD58F, 0xD58F, 0x2027, 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060, + 0xD594, 0xD594, 0x22FF, 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE, + 0xD599, 0xD599, 0x1EC7, 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C, + 0xD59C, 0xD59E, 0x4AAC, 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF, + 0xD5A1, 0xD5FE, 0x1142, 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0, + 0xD642, 0xD642, 0x230A, 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1, + 0xD647, 0xD647, 0x2303, 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307, + 0xD64A, 0xD64A, 0x230B, 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F, + 0xD64E, 0xD64E, 0x4AB7, 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8, + 0xD652, 0xD652, 0x2302, 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D, + 0xD655, 0xD655, 0x4ABA, 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB, + 0xD658, 0xD658, 0x2308, 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC, + 0xD65B, 0xD65B, 0x4ABD, 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305, + 0xD65E, 0xD65E, 0x2197, 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171, + 0xD661, 0xD661, 0x2298, 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57, + 0xD666, 0xD668, 0x4AC2, 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5, + 0xD66B, 0xD66B, 0x2311, 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304, + 0xD670, 0xD670, 0x4AC9, 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35, + 0xD673, 0xD673, 0x4ACA, 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310, + 0xD676, 0xD676, 0x1FA3, 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6, + 0xD679, 0xD67B, 0x4ACC, 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF, + 0xD680, 0xD682, 0x4AD1, 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4, + 0xD686, 0xD686, 0x2312, 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313, + 0xD689, 0xD68D, 0x4AD6, 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB, + 0xD694, 0xD694, 0x1FBA, 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078, + 0xD69A, 0xD6A0, 0x4AE4, 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB, + 0xD743, 0xD743, 0x2288, 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316, + 0xD749, 0xD749, 0x1F6B, 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314, + 0xD751, 0xD751, 0x4AF8, 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315, + 0xD754, 0xD754, 0x2168, 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4, + 0xD757, 0xD763, 0x4AFA, 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07, + 0xD767, 0xD767, 0x2219, 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09, + 0xD76C, 0xD76C, 0x20D5, 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A, + 0xD770, 0xD774, 0x4B0E, 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13, + 0xD778, 0xD778, 0x1ED3, 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B, + 0xD783, 0xD783, 0x1E49, 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B, + 0xD788, 0xD78A, 0x4B21, 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8, + 0xD78D, 0xD78D, 0x4B24, 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319, + 0xD790, 0xD794, 0x4B25, 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A, + 0xD797, 0xD797, 0x2317, 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE, + 0xD840, 0xD84C, 0x4B34, 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41, + 0xD853, 0xD853, 0x1EFD, 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71, + 0xD890, 0xD890, 0x1E3B, 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81, + 0xD893, 0xD893, 0x1F0C, 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24, + 0xD896, 0xD899, 0x4B82, 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65, + 0xD89C, 0xD89C, 0x1EF0, 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30, + 0xD89F, 0xD89F, 0x2261, 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257, + 0xD940, 0xD940, 0x4B87, 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB, + 0xD943, 0xD943, 0x4B88, 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8, + 0xD946, 0xD946, 0x1F39, 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48, + 0xD949, 0xD949, 0x2070, 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A, + 0xD94C, 0xD94C, 0x24AC, 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176, + 0xD94F, 0xD94F, 0x24AD, 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B, + 0xD952, 0xD952, 0x1F45, 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B, + 0xD955, 0xD955, 0x202F, 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0, + 0xD958, 0xD958, 0x4B8C, 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F, + 0xD95B, 0xD95B, 0x4B8D, 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E, + 0xD963, 0xD963, 0x24B2, 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51, + 0xD966, 0xD966, 0x4B94, 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95, + 0xD96C, 0xD96C, 0x24B3, 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F, + 0xD96F, 0xD96F, 0x4B9A, 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B, + 0xD972, 0xD972, 0x20B4, 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB, + 0xD975, 0xD975, 0x2072, 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C, + 0xD978, 0xD978, 0x1F0A, 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D, + 0xD97C, 0xD97C, 0x2291, 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278, + 0xD980, 0xD980, 0x1ED4, 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3, + 0xD988, 0xD98C, 0x4BA5, 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7, + 0xD98F, 0xD98F, 0x1F28, 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7, + 0xD992, 0xD996, 0x4BAA, 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1, + 0xD999, 0xD99A, 0x4BAF, 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1, + 0xD99D, 0xD99D, 0x225B, 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2, + 0xD9A0, 0xD9A0, 0x2115, 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3, + 0xDA41, 0xDA41, 0x222A, 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4, + 0xDA48, 0xDA48, 0x213D, 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15, + 0xDA4E, 0xDA4E, 0x225C, 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14, + 0xDA74, 0xDA76, 0x4BE1, 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4, + 0xDA80, 0xDA84, 0x4BEB, 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0, + 0xDA8E, 0xDA8E, 0x25F8, 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313, + 0xDB40, 0xDB5F, 0x4C0A, 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A, + 0xDB78, 0xDB78, 0x2230, 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47, + 0xDB84, 0xDB84, 0x25FD, 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600, + 0xDB8C, 0xDB97, 0x4C51, 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D, + 0xDBA1, 0xDBFE, 0x1371, 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF, + 0xDC46, 0xDC4E, 0x4C6A, 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C, + 0xDC51, 0xDC51, 0x2602, 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D, + 0xDC54, 0xDC54, 0x4C74, 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE, + 0xDC57, 0xDC57, 0x2603, 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601, + 0xDC5E, 0xDC61, 0x4C7A, 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E, + 0xDC66, 0xDC66, 0x1EA3, 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81, + 0xDC6B, 0xDC6B, 0x2607, 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0, + 0xDC7D, 0xDC7E, 0x4C94, 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B, + 0xDC88, 0xDC88, 0x2267, 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6, + 0xDC8B, 0xDC8D, 0x4C9D, 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0, + 0xDC90, 0xDC90, 0x248C, 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D, + 0xDC98, 0xDC9A, 0x4CA7, 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA, + 0xDCA0, 0xDCA0, 0x2494, 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE, + 0xDD46, 0xDD46, 0x2493, 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E, + 0xDD4E, 0xDD52, 0x4CBA, 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491, + 0xDD55, 0xDD55, 0x2496, 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492, + 0xDD58, 0xDD58, 0x4CBF, 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0, + 0xDD5E, 0xDD5E, 0x1FB1, 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A, + 0xDD61, 0xDD61, 0x4CC5, 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6, + 0xDD64, 0xDD64, 0x2258, 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7, + 0xDD6D, 0xDD6D, 0x249B, 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09, + 0xDD70, 0xDD70, 0x20E6, 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026, + 0xDD77, 0xDD77, 0x249F, 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D, + 0xDD7B, 0xDD7E, 0x4CD4, 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B, + 0xDD82, 0xDD82, 0x249C, 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A, + 0xDD86, 0xDD86, 0x205B, 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70, + 0xDD8C, 0xDD8E, 0x4CDF, 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2, + 0xDD94, 0xDD94, 0x213B, 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07, + 0xDD98, 0xDD99, 0x4CE8, 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237, + 0xDD9C, 0xDD9D, 0x4CEA, 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC, + 0xDDA0, 0xDDA0, 0x21B3, 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245, + 0xDE41, 0xDE41, 0x24A1, 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8, + 0xDE45, 0xDE47, 0x4CEF, 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0, + 0xDE4A, 0xDE4E, 0x4CF2, 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7, + 0xDE5A, 0xDE5A, 0x1F46, 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380, + 0xDE5D, 0xDE5D, 0x2495, 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490, + 0xDE60, 0xDE6A, 0x4D03, 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E, + 0xDE6F, 0xDE6F, 0x1E9D, 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A, + 0xDE72, 0xDE72, 0x20AA, 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D, + 0xDE92, 0xDE92, 0x267B, 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2, + 0xDEA0, 0xDEA0, 0x4D3B, 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E, + 0xDF41, 0xDF41, 0x4D3C, 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D, + 0xDF4D, 0xDF4D, 0x1FBB, 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253, + 0xDF5D, 0xDF5D, 0x4D55, 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6, + 0xDF60, 0xDF60, 0x218E, 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC, + 0xDF65, 0xDF65, 0x4D59, 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A, + 0xDF68, 0xDF68, 0x224A, 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133, + 0xDF6E, 0xDF73, 0x4D5F, 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65, + 0xDF77, 0xDF77, 0x20CF, 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67, + 0xDF7A, 0xDF7A, 0x220F, 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029, + 0xDF7D, 0xDF7D, 0x4D69, 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55, + 0xDF81, 0xDF82, 0x4D6A, 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C, + 0xDF85, 0xDF85, 0x1E46, 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063, + 0xDF8A, 0xDF8A, 0x23F3, 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9, + 0xE040, 0xE04F, 0x4D86, 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96, + 0xE05D, 0xE05D, 0x2233, 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320, + 0xE06A, 0xE06B, 0x4DAD, 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF, + 0xE075, 0xE075, 0x22BC, 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C, + 0xE078, 0xE078, 0x4DB8, 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9, + 0xE080, 0xE086, 0x4DBE, 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5, + 0xE08D, 0xE08D, 0x2287, 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D, + 0xE090, 0xE090, 0x1EAB, 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D, + 0xE093, 0xE093, 0x4DCC, 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD, + 0xE097, 0xE097, 0x231B, 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547, + 0xE140, 0xE141, 0x4DD8, 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA, + 0xE164, 0xE164, 0x2255, 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F, + 0xE169, 0xE173, 0x4DFE, 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4, + 0xE176, 0xE17E, 0x4E09, 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B, + 0xE185, 0xE185, 0x21D8, 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA, + 0xE188, 0xE188, 0x4E17, 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18, + 0xE18C, 0xE18C, 0x2134, 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3, + 0xE191, 0xE191, 0x24F8, 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7, + 0xE194, 0xE194, 0x1EC8, 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C, + 0xE198, 0xE198, 0x2280, 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5, + 0xE19F, 0xE19F, 0x24FB, 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5, + 0xE240, 0xE240, 0x4E24, 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25, + 0xE243, 0xE243, 0x1EED, 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD, + 0xE250, 0xE250, 0x4E31, 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32, + 0xE253, 0xE253, 0x24FE, 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33, + 0xE25A, 0xE25A, 0x2508, 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38, + 0xE25E, 0xE25E, 0x2506, 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF, + 0xE263, 0xE263, 0x2090, 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD, + 0xE268, 0xE268, 0x1F25, 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503, + 0xE26B, 0xE26B, 0x2502, 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A, + 0xE26F, 0xE26F, 0x20A6, 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5, + 0xE279, 0xE27C, 0x4E4B, 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F, + 0xE280, 0xE280, 0x2507, 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505, + 0xE283, 0xE288, 0x4E50, 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56, + 0xE28B, 0xE28B, 0x2515, 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C, + 0xE28F, 0xE28F, 0x2031, 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B, + 0xE293, 0xE293, 0x250F, 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509, + 0xE296, 0xE297, 0x4E5B, 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234, + 0xE29A, 0xE29A, 0x2513, 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D, + 0xE2A0, 0xE2A0, 0x2501, 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61, + 0xE342, 0xE342, 0x2517, 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63, + 0xE347, 0xE347, 0x2518, 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56, + 0xE34C, 0xE34E, 0x4E69, 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C, + 0xE351, 0xE351, 0x20D3, 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A, + 0xE355, 0xE355, 0x20CE, 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510, + 0xE359, 0xE35B, 0x4E71, 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74, + 0xE360, 0xE360, 0x250A, 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511, + 0xE368, 0xE370, 0x4E7C, 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85, + 0xE373, 0xE373, 0x251E, 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86, + 0xE378, 0xE378, 0x252D, 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89, + 0xE37C, 0xE37C, 0x2532, 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B, + 0xE380, 0xE389, 0x4E8C, 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96, + 0xE38C, 0xE38C, 0x252C, 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528, + 0xE390, 0xE390, 0x4E99, 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A, + 0xE393, 0xE393, 0x252F, 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC, + 0xE396, 0xE398, 0x4E9C, 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F, + 0xE39C, 0xE39C, 0x2535, 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D, + 0xE39F, 0xE39F, 0x2526, 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661, + 0xE440, 0xE440, 0x2534, 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F, + 0xE443, 0xE443, 0x2531, 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3, + 0xE448, 0xE448, 0x2525, 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD, + 0xE44F, 0xE44F, 0x4EAB, 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC, + 0xE452, 0xE452, 0x2172, 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD, + 0xE458, 0xE458, 0x204F, 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543, + 0xE45B, 0xE45B, 0x4EB2, 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3, + 0xE45E, 0xE45E, 0x1E3C, 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529, + 0xE463, 0xE464, 0x4EB7, 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9, + 0xE468, 0xE468, 0x1EFF, 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F, + 0xE474, 0xE474, 0x4EC5, 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6, + 0xE479, 0xE479, 0x2523, 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A, + 0xE47C, 0xE47C, 0x2545, 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D, + 0xE480, 0xE480, 0x4ECA, 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB, + 0xE484, 0xE484, 0x2103, 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C, + 0xE487, 0xE487, 0x253B, 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD, + 0xE48D, 0xE48D, 0x2540, 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD, + 0xE490, 0xE492, 0x4ED2, 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5, + 0xE498, 0xE498, 0x254B, 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547, + 0xE49E, 0xE49F, 0x254F, 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF, + 0xE540, 0xE545, 0x4EDE, 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4, + 0xE548, 0xE548, 0x2546, 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C, + 0xE54C, 0xE54D, 0x4EE7, 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552, + 0xE550, 0xE550, 0x2530, 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9, + 0xE555, 0xE555, 0x2551, 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC, + 0xE558, 0xE558, 0x20D2, 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8, + 0xE55D, 0xE55D, 0x4EF0, 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1, + 0xE561, 0xE561, 0x21AB, 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D, + 0xE565, 0xE565, 0x1EA5, 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C, + 0xE569, 0xE569, 0x2080, 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D, + 0xE56D, 0xE56D, 0x4EF9, 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA, + 0xE575, 0xE575, 0x254A, 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00, + 0xE578, 0xE578, 0x254E, 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC, + 0xE57C, 0xE57C, 0x2554, 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05, + 0xE581, 0xE581, 0x1F3C, 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5, + 0xE584, 0xE589, 0x4F07, 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D, + 0xE58E, 0xE58E, 0x2268, 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6, + 0xE592, 0xE599, 0x4F12, 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553, + 0xE59C, 0xE59E, 0x4F1A, 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D, + 0xE5A1, 0xE5FE, 0x171D, 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E, + 0xE644, 0xE644, 0x2559, 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97, + 0xE64A, 0xE64A, 0x2555, 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D, + 0xE64F, 0xE651, 0x4F28, 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B, + 0xE656, 0xE656, 0x207C, 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A, + 0xE659, 0xE65A, 0x4F2F, 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31, + 0xE65E, 0xE65E, 0x1E34, 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E, + 0xE66A, 0xE66A, 0x4F3D, 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E, + 0xE675, 0xE675, 0x21A2, 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47, + 0xE679, 0xE679, 0x2563, 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49, + 0xE67C, 0xE67C, 0x252E, 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A, + 0xE680, 0xE680, 0x1F1B, 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283, + 0xE683, 0xE683, 0x4F4C, 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D, + 0xE687, 0xE687, 0x20A0, 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565, + 0xE68A, 0xE68B, 0x4F50, 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52, + 0xE693, 0xE693, 0x2562, 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C, + 0xE698, 0xE69A, 0x4F5B, 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020, + 0xE69D, 0xE69E, 0x4F5E, 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A, + 0xE6A1, 0xE6FE, 0x177B, 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E, + 0xE744, 0xE747, 0x4F63, 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C, + 0xE74A, 0xE74C, 0x4F67, 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B, + 0xE750, 0xE750, 0x1E6F, 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4, + 0xE753, 0xE753, 0x2567, 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B, + 0xE756, 0xE758, 0x4F6C, 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F, + 0xE766, 0xE766, 0x252B, 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571, + 0xE769, 0xE769, 0x4F7C, 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D, + 0xE774, 0xE774, 0x2522, 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533, + 0xE77D, 0xE77E, 0x4F8D, 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A, + 0xE783, 0xE783, 0x4F91, 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573, + 0xE786, 0xE786, 0x256F, 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293, + 0xE78B, 0xE78B, 0x2578, 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570, + 0xE790, 0xE791, 0x4F98, 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A, + 0xE798, 0xE799, 0x2541, 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F, + 0xE7A0, 0xE7A0, 0x201A, 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4, + 0xE843, 0xE843, 0x257A, 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7, + 0xE846, 0xE846, 0x2177, 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B, + 0xE84A, 0xE84A, 0x4FAA, 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB, + 0xE84F, 0xE84F, 0x257B, 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3, + 0xE855, 0xE859, 0x4FB2, 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7, + 0xE85C, 0xE85C, 0x2566, 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93, + 0xE863, 0xE863, 0x4FBD, 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE, + 0xE870, 0xE870, 0x2514, 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D, + 0xE874, 0xE874, 0x4FCB, 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC, + 0xE87C, 0xE87C, 0x2574, 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E, + 0xE881, 0xE881, 0x4FD4, 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5, + 0xE887, 0xE887, 0x209F, 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576, + 0xE88A, 0xE88B, 0x4FDA, 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF, + 0xE88E, 0xE88E, 0x261C, 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC, + 0xE8A1, 0xE8FE, 0x1837, 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75, + 0xE94D, 0xE953, 0x4FF9, 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000, + 0xE956, 0xE956, 0x23BF, 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001, + 0xE95A, 0xE95A, 0x23C0, 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45, + 0xE95E, 0xE95E, 0x5005, 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4, + 0xE961, 0xE961, 0x5006, 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104, + 0xE964, 0xE964, 0x5007, 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008, + 0xE967, 0xE967, 0x1F87, 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009, + 0xE96C, 0xE96C, 0x2269, 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43, + 0xE976, 0xE976, 0x5014, 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679, + 0xE979, 0xE979, 0x1EEB, 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35, + 0xE97D, 0xE97D, 0x208A, 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7, + 0xE981, 0xE981, 0x23C9, 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018, + 0xE987, 0xE987, 0x224F, 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB, + 0xE98C, 0xE98D, 0x501F, 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021, + 0xE990, 0xE990, 0x21F7, 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE, + 0xE993, 0xE993, 0x23CA, 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022, + 0xE998, 0xE998, 0x23D0, 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C, + 0xE99C, 0xE99C, 0x5027, 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028, + 0xE99F, 0xE99F, 0x1FEE, 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895, + 0xEA40, 0xEA40, 0x1FF8, 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3, + 0xEA45, 0xEA47, 0x502C, 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4, + 0xEA4A, 0xEA4A, 0x1E98, 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C, + 0xEA51, 0xEA51, 0x5034, 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035, + 0xEA55, 0xEA55, 0x1E71, 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037, + 0xEA59, 0xEA59, 0x23C5, 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A, + 0xEA81, 0xEA83, 0x505E, 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061, + 0xEA87, 0xEA87, 0x2284, 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C, + 0xEA8F, 0xEA8F, 0x5069, 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D, + 0xEA92, 0xEA95, 0x506A, 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E, + 0xEAA0, 0xEAA0, 0x1ED9, 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077, + 0xEB41, 0xEB41, 0x1FB2, 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252, + 0xEB46, 0xEB47, 0x507B, 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D, + 0xEB53, 0xEB53, 0x2157, 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF, + 0xEB56, 0xEB5A, 0x5088, 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D, + 0xEB5D, 0xEB5D, 0x203D, 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015, + 0xEB61, 0xEB61, 0x5090, 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091, + 0xEB6D, 0xEB6D, 0x2156, 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144, + 0xEB71, 0xEB71, 0x509D, 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257, + 0xEB74, 0xEB77, 0x509E, 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092, + 0xEB7A, 0xEB7E, 0x50A2, 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250, + 0xEB86, 0xEB89, 0x50AC, 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0, + 0xEBA1, 0xEBFE, 0x1951, 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8, + 0xEC47, 0xEC55, 0x50CC, 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB, + 0xEC5A, 0xEC5A, 0x260C, 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E, + 0xEC5D, 0xEC5F, 0x50DF, 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2, + 0xEC6E, 0xEC6E, 0x260B, 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3, + 0xEC77, 0xEC7E, 0x50F6, 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23, + 0xEC97, 0xECA0, 0x5114, 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E, + 0xED46, 0xED46, 0x2695, 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E, + 0xED59, 0xED5D, 0x5135, 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A, + 0xED61, 0xED61, 0x2692, 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F, + 0xED65, 0xED65, 0x513E, 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD, + 0xED68, 0xED6D, 0x513F, 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145, + 0xED74, 0xED74, 0x2465, 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467, + 0xED78, 0xED78, 0x514C, 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D, + 0xED80, 0xED90, 0x5152, 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163, + 0xED93, 0xED93, 0x2209, 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9, + 0xED96, 0xED96, 0x5164, 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146, + 0xED99, 0xED99, 0x25C5, 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165, + 0xED9C, 0xED9C, 0x245E, 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F, + 0xED9F, 0xED9F, 0x5167, 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D, + 0xEE40, 0xEE40, 0x25C7, 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A, + 0xEE43, 0xEE43, 0x1E2F, 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168, + 0xEE48, 0xEE48, 0x20BF, 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B, + 0xEE4D, 0xEE4D, 0x25C9, 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8, + 0xEE53, 0xEE54, 0x5172, 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174, + 0xEE57, 0xEE57, 0x25CB, 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D, + 0xEE5F, 0xEE60, 0x517B, 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D, + 0xEE68, 0xEE68, 0x25CC, 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183, + 0xEE6C, 0xEE6C, 0x20B9, 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181, + 0xEE6F, 0xEE76, 0x5186, 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E, + 0xEE7D, 0xEE7D, 0x2173, 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD, + 0xEE81, 0xEE84, 0x5193, 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6, + 0xEE87, 0xEE89, 0x5197, 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1, + 0xEE8C, 0xEE8C, 0x519A, 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B, + 0xEE90, 0xEE90, 0x2008, 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0, + 0xEE95, 0xEE96, 0x51A0, 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2, + 0xEE99, 0xEE99, 0x1F2A, 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72, + 0xEE9E, 0xEE9E, 0x25D3, 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B, + 0xEF40, 0xEF40, 0x21BE, 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044, + 0xEF43, 0xEF43, 0x51A8, 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3, + 0xEF46, 0xEF4B, 0x51A9, 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF, + 0xEF52, 0xEF53, 0x24CC, 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698, + 0xEF56, 0xEF56, 0x51B5, 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6, + 0xEF5A, 0xEF5A, 0x24CE, 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF, + 0xEF61, 0xEF67, 0x51BD, 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4, + 0xEF6A, 0xEF6A, 0x24D0, 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1, + 0xEF6D, 0xEF76, 0x51C6, 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0, + 0xEF7A, 0xEF7A, 0x239B, 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E, + 0xEF7D, 0xEF7E, 0x51D3, 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D, + 0xEF83, 0xEF84, 0x239F, 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1, + 0xEF87, 0xEF87, 0x51D8, 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9, + 0xEF8B, 0xEF8B, 0x221E, 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2, + 0xEF8E, 0xEF94, 0x51DC, 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36, + 0xEF97, 0xEF97, 0x2135, 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD, + 0xEF9D, 0xEF9D, 0x51E7, 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8, + 0xEFA1, 0xEFFE, 0x1AC9, 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3, + 0xF042, 0xF042, 0x2203, 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7, + 0xF045, 0xF046, 0x51EC, 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097, + 0xF049, 0xF049, 0x1EE4, 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238, + 0xF04F, 0xF050, 0x51F2, 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4, + 0xF054, 0xF054, 0x1F9A, 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3, + 0xF058, 0xF05D, 0x51F8, 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE, + 0xF068, 0xF068, 0x239C, 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6, + 0xF06D, 0xF070, 0x520A, 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E, + 0xF073, 0xF073, 0x2035, 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F, + 0xF078, 0xF078, 0x23A8, 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075, + 0xF07B, 0xF07C, 0x5213, 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB, + 0xF081, 0xF081, 0x1FEB, 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215, + 0xF087, 0xF087, 0x1F6A, 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219, + 0xF08B, 0xF08B, 0x2666, 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667, + 0xF091, 0xF091, 0x521F, 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220, + 0xF096, 0xF096, 0x23AD, 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27, + 0xF140, 0xF151, 0x522D, 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242, + 0xF154, 0xF154, 0x1F02, 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183, + 0xF158, 0xF158, 0x5241, 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9, + 0xF15B, 0xF166, 0x5242, 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E, + 0xF176, 0xF176, 0x22A5, 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA, + 0xF179, 0xF179, 0x525C, 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82, + 0xF17C, 0xF17D, 0x525D, 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404, + 0xF181, 0xF181, 0x525F, 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260, + 0xF184, 0xF184, 0x2184, 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403, + 0xF187, 0xF187, 0x5262, 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B, + 0xF18A, 0xF193, 0x5263, 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D, + 0xF198, 0xF198, 0x2067, 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85, + 0xF240, 0xF244, 0x5278, 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D, + 0xF247, 0xF247, 0x1E83, 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F, + 0xF24C, 0xF252, 0x5281, 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7, + 0xF255, 0xF255, 0x240D, 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412, + 0xF25D, 0xF25E, 0x528E, 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290, + 0xF271, 0xF271, 0x23F0, 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411, + 0xF274, 0xF274, 0x2414, 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170, + 0xF277, 0xF27B, 0x52A3, 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C, + 0xF27E, 0xF27E, 0x2415, 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066, + 0xF286, 0xF286, 0x52AD, 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413, + 0xF289, 0xF289, 0x2410, 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1, + 0xF28D, 0xF290, 0x52AE, 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2, + 0xF294, 0xF294, 0x2409, 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418, + 0xF297, 0xF29B, 0x52B5, 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA, + 0xF29E, 0xF29E, 0x21FC, 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3, + 0xF340, 0xF340, 0x1FC1, 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD, + 0xF345, 0xF345, 0x229C, 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E, + 0xF349, 0xF349, 0x52C2, 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419, + 0xF34C, 0xF34F, 0x52C3, 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7, + 0xF361, 0xF361, 0x1E29, 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661, + 0xF375, 0xF375, 0x52E9, 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174, + 0xF378, 0xF378, 0x2663, 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA, + 0xF380, 0xF38B, 0x52EF, 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB, + 0xF3A0, 0xF3A0, 0x214C, 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E, + 0xF445, 0xF445, 0x267A, 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0, + 0xF451, 0xF456, 0x531D, 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323, + 0xF459, 0xF459, 0x1ED0, 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096, + 0xF45C, 0xF45C, 0x5325, 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326, + 0xF462, 0xF462, 0x23C8, 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E, + 0xF465, 0xF474, 0x532B, 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B, + 0xF47C, 0xF47C, 0x2664, 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239, + 0xF480, 0xF493, 0x5342, 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356, + 0xF499, 0xF499, 0x261F, 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E, + 0xF49D, 0xF4A0, 0x535C, 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360, + 0xF545, 0xF545, 0x2620, 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621, + 0xF548, 0xF551, 0x5366, 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370, + 0xF554, 0xF554, 0x2627, 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625, + 0xF557, 0xF55D, 0x5371, 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378, + 0xF561, 0xF561, 0x262E, 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A, + 0xF56E, 0xF56E, 0x262A, 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385, + 0xF571, 0xF571, 0x2628, 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386, + 0xF580, 0xF584, 0x5392, 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630, + 0xF587, 0xF58B, 0x5397, 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C, + 0xF58E, 0xF58E, 0x200D, 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D, + 0xF599, 0xF599, 0x2645, 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A, + 0xF59C, 0xF59F, 0x53A7, 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD, + 0xF640, 0xF640, 0x53AB, 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC, + 0xF645, 0xF645, 0x263D, 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF, + 0xF648, 0xF648, 0x263E, 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F, + 0xF64C, 0xF64C, 0x1FC0, 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B, + 0xF650, 0xF653, 0x53B3, 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7, + 0xF658, 0xF658, 0x2644, 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639, + 0xF662, 0xF662, 0x53C2, 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3, + 0xF66C, 0xF66C, 0x2647, 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB, + 0xF671, 0xF671, 0x2649, 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648, + 0xF675, 0xF675, 0x53D0, 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108, + 0xF678, 0xF67E, 0x53D1, 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D, + 0xF686, 0xF687, 0x53DD, 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF, + 0xF68A, 0xF68A, 0x2651, 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650, + 0xF68E, 0xF68E, 0x2652, 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F, + 0xF693, 0xF695, 0x53E5, 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E, + 0xF698, 0xF698, 0x2653, 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657, + 0xF69B, 0xF69B, 0x53E9, 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA, + 0xF69E, 0xF69E, 0x2633, 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656, + 0xF6A1, 0xF6FE, 0x1D5B, 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654, + 0xF743, 0xF748, 0x53EE, 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4, + 0xF74C, 0xF74C, 0x2655, 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6, + 0xF756, 0xF756, 0x265B, 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A, + 0xF759, 0xF759, 0x53FF, 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E, + 0xF75C, 0xF75C, 0x262F, 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646, + 0xF762, 0xF762, 0x5404, 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405, + 0xF76B, 0xF76B, 0x265C, 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C, + 0xF772, 0xF77B, 0x5411, 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B, + 0xF77E, 0xF77E, 0x2631, 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9, + 0xF840, 0xF841, 0x543D, 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F, + 0xF846, 0xF846, 0x2580, 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC, + 0xF84A, 0xF84F, 0x5444, 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B, + 0xF852, 0xF852, 0x544A, 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B, + 0xF863, 0xF863, 0x2583, 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A, + 0xF866, 0xF866, 0x21EE, 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182, + 0xF873, 0xF877, 0x5466, 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B, + 0xF87A, 0xF87A, 0x2587, 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588, + 0xF87D, 0xF87E, 0x546D, 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584, + 0xF882, 0xF883, 0x5470, 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472, + 0xF886, 0xF886, 0x21EF, 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A, + 0xF88E, 0xF88E, 0x258C, 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47, + 0xF89A, 0xF89C, 0x5483, 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486, + 0xF8A0, 0xF8A0, 0x258D, 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0, + 0xF94F, 0xF94F, 0x2592, 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496, + 0xF959, 0xF959, 0x2594, 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E, + 0xF95D, 0xF95D, 0x2591, 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0, + 0xF967, 0xF967, 0x2597, 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6, + 0xF96A, 0xF96B, 0x54A9, 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB, + 0xF96F, 0xF96F, 0x20F6, 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC, + 0xF985, 0xF985, 0x2585, 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599, + 0xF988, 0xF990, 0x54C2, 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB, + 0xF996, 0xF996, 0x259A, 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B, + 0xF999, 0xF9A0, 0x54D0, 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D, + 0xFA43, 0xFA45, 0x54DA, 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD, + 0xFA4C, 0xFA4C, 0x234C, 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44, + 0xFA52, 0xFA57, 0x54E6, 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0, + 0xFA5A, 0xFA5C, 0x54EC, 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF, + 0xFA5F, 0xFA5F, 0x259F, 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C, + 0xFA62, 0xFA6F, 0x54F1, 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF, + 0xFA74, 0xFA74, 0x20AE, 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B, + 0xFA77, 0xFA77, 0x25A3, 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A, + 0xFA83, 0xFA83, 0x2589, 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D, + 0xFA8D, 0xFA8D, 0x25A4, 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6, + 0xFA91, 0xFA91, 0x2593, 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7, + 0xFA97, 0xFA97, 0x2222, 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B, + 0xFB40, 0xFB48, 0x5523, 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C, + 0xFB52, 0xFB52, 0x2586, 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1, + 0xFB58, 0xFB58, 0x25AA, 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590, + 0xFB5B, 0xFB5B, 0x258E, 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688, + 0xFB76, 0xFB78, 0x5552, 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB, + 0xFB7B, 0xFB7B, 0x5555, 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4, + 0xFB7E, 0xFB7E, 0x5556, 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F, + 0xFB91, 0xFB9B, 0x5567, 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572, + 0xFB9F, 0xFB9F, 0x25F7, 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575, + 0xFC44, 0xFC44, 0x2696, 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F, + 0xFC4A, 0xFC59, 0x557D, 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D, + 0xFC63, 0xFC63, 0x1EC1, 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3, + 0xFC69, 0xFC6E, 0x5599, 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F, + 0xFC71, 0xFC71, 0x268A, 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669, + 0xFC75, 0xFC76, 0x55A2, 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4, + 0xFC80, 0xFC82, 0x55AA, 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD, + 0xFC8A, 0xFC8A, 0x2673, 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9, + 0xFD52, 0xFD52, 0x20C6, 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB, + 0xFD57, 0xFD57, 0x24D3, 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE, + 0xFD5A, 0xFD5A, 0x260F, 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611, + 0xFD60, 0xFD61, 0x55E3, 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5, + 0xFD65, 0xFD65, 0x2610, 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030, + 0xFD68, 0xFD68, 0x55E7, 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8, + 0xFD6C, 0xFD6C, 0x2614, 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616, + 0xFD71, 0xFD71, 0x55ED, 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE, + 0xFD78, 0xFD78, 0x20F2, 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617, + 0xFD7E, 0xFD7E, 0x55F7, 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037, + 0xFD89, 0xFD8A, 0x5600, 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602, + 0xFD8F, 0xFD8F, 0x1F22, 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605, + 0xFD94, 0xFD94, 0x1F34, 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02, + 0xFD9E, 0xFD9E, 0x40D3, 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083, + 0xFE40, 0xFE40, 0x1259, 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E, +}; + +const uint16_t g_FXCMAP_GBK2K_H_5_DWord[1017 * 4] = { + 0x8130, 0x8436, 0x8436, 0x5752, 0x8138, 0xFD38, 0xFD39, 0x579C, 0x8138, + 0xFE30, 0xFE39, 0x579E, 0x8139, 0x8130, 0x8137, 0x57A8, 0x8139, 0x8139, + 0x8139, 0x57B0, 0x8139, 0x8230, 0x8239, 0x57B1, 0x8139, 0x8330, 0x8339, + 0x57BB, 0x8139, 0x8430, 0x8439, 0x57C5, 0x8139, 0x8530, 0x8539, 0x57CF, + 0x8139, 0x8630, 0x8639, 0x57D9, 0x8139, 0x8730, 0x8739, 0x57E3, 0x8139, + 0x8830, 0x8839, 0x57ED, 0x8139, 0x8930, 0x8939, 0x57F7, 0x8139, 0x8B32, + 0x8B32, 0x1042, 0x8139, 0x8B33, 0x8B33, 0x1263, 0x8139, 0x8B34, 0x8B34, + 0x1272, 0x8139, 0x8B35, 0x8B35, 0x1265, 0x8139, 0x8B36, 0x8B36, 0x1059, + 0x8139, 0x8B37, 0x8B37, 0x2793, 0x8139, 0x8B38, 0x8B38, 0x063D, 0x8139, + 0x8B39, 0x8B39, 0x1303, 0x8139, 0x8C30, 0x8C30, 0x0CA6, 0x8139, 0x8C31, + 0x8C31, 0x0638, 0x8139, 0x8C32, 0x8C32, 0x0CC6, 0x8139, 0x8C33, 0x8C33, + 0x03D6, 0x8139, 0x8C34, 0x8C34, 0x129D, 0x8139, 0x8C35, 0x8C35, 0x1314, + 0x8139, 0x8C36, 0x8C36, 0x130F, 0x8139, 0x8C37, 0x8C37, 0x082B, 0x8139, + 0x8C38, 0x8C38, 0x1399, 0x8139, 0x8C39, 0x8C39, 0x0597, 0x8139, 0x8D30, + 0x8D30, 0x09EF, 0x8139, 0x8D31, 0x8D31, 0x12FC, 0x8139, 0x8D32, 0x8D32, + 0x1266, 0x8139, 0x8D33, 0x8D33, 0x1284, 0x8139, 0x8D34, 0x8D34, 0x2A1A, + 0x8139, 0x8D35, 0x8D35, 0x0D45, 0x8139, 0x8D36, 0x8D36, 0x047E, 0x8139, + 0x8D37, 0x8D37, 0x1352, 0x8139, 0x8D38, 0x8D38, 0x04CC, 0x8139, 0x8D39, + 0x8D39, 0x139C, 0x8139, 0x8E30, 0x8E30, 0x10BB, 0x8139, 0x8E31, 0x8E31, + 0x0967, 0x8139, 0x8E32, 0x8E32, 0x1593, 0x8139, 0x8E33, 0x8E33, 0x0E72, + 0x8139, 0x8E34, 0x8E34, 0x0D56, 0x8139, 0x8E35, 0x8E35, 0x161C, 0x8139, + 0x8E36, 0x8E36, 0x2D2D, 0x8139, 0x8E37, 0x8E37, 0x0F13, 0x8139, 0x8E38, + 0x8E38, 0x0576, 0x8139, 0x8E39, 0x8E39, 0x0B6F, 0x8139, 0x8F30, 0x8F30, + 0x1230, 0x8139, 0x8F31, 0x8F31, 0x172E, 0x8139, 0x8F32, 0x8F32, 0x056A, + 0x8139, 0x8F33, 0x8F33, 0x0F6C, 0x8139, 0x8F34, 0x8F34, 0x14B6, 0x8139, + 0x8F35, 0x8F35, 0x0D43, 0x8139, 0x8F36, 0x8F36, 0x1774, 0x8139, 0x8F37, + 0x8F37, 0x0CF6, 0x8139, 0x8F38, 0x8F38, 0x1815, 0x8139, 0x8F39, 0x8F39, + 0x06FD, 0x8139, 0x9030, 0x9030, 0x082D, 0x8139, 0x9031, 0x9031, 0x08BE, + 0x8139, 0x9032, 0x9032, 0x06C4, 0x8139, 0x9033, 0x9033, 0x1813, 0x8139, + 0x9034, 0x9034, 0x073C, 0x8139, 0x9035, 0x9035, 0x1398, 0x8139, 0x9036, + 0x9036, 0x14AD, 0x8139, 0x9037, 0x9037, 0x14F6, 0x8139, 0x9038, 0x9038, + 0x0706, 0x8139, 0x9039, 0x9039, 0x1762, 0x8139, 0x9130, 0x9130, 0x15EE, + 0x8139, 0x9131, 0x9131, 0x15E0, 0x8139, 0x9132, 0x9132, 0x0F8F, 0x8139, + 0x9133, 0x9133, 0x06E5, 0x8139, 0x9134, 0x9134, 0x3292, 0x8139, 0x9135, + 0x9135, 0x0D6D, 0x8139, 0x9136, 0x9136, 0x11A6, 0x8139, 0x9137, 0x9137, + 0x1909, 0x8139, 0x9138, 0x9138, 0x0ED3, 0x8139, 0x9139, 0x9139, 0x05F6, + 0x8139, 0x9230, 0x9230, 0x08C0, 0x8139, 0x9231, 0x9231, 0x065A, 0x8139, + 0x9232, 0x9232, 0x0EED, 0x8139, 0x9233, 0x9233, 0x0CB0, 0x8139, 0x9234, + 0x9234, 0x10FE, 0x8139, 0x9235, 0x9235, 0x1105, 0x8139, 0x9236, 0x9236, + 0x0B21, 0x8139, 0x9237, 0x9237, 0x0C34, 0x8139, 0x9238, 0x9238, 0x11B8, + 0x8139, 0x9239, 0x9239, 0x0578, 0x8139, 0x9330, 0x9330, 0x19BD, 0x8139, + 0x9331, 0x9331, 0x0EF2, 0x8139, 0x9332, 0x9332, 0x0431, 0x8139, 0x9333, + 0x9333, 0x0AB0, 0x8139, 0x9334, 0x9334, 0x0D66, 0x8139, 0x9335, 0x9335, + 0x0C17, 0x8139, 0x9336, 0x9336, 0x0DA3, 0x8139, 0x9337, 0x9337, 0x0805, + 0x8139, 0x9338, 0x9338, 0x1203, 0x8139, 0x9339, 0x9339, 0x06B3, 0x8139, + 0x9430, 0x9430, 0x1269, 0x8139, 0x9431, 0x9431, 0x169D, 0x8139, 0x9432, + 0x9432, 0x0BCB, 0x8139, 0x9433, 0x9433, 0x0FE9, 0x8139, 0x9434, 0x9434, + 0x0B64, 0x8139, 0x9435, 0x9435, 0x0C89, 0x8139, 0x9436, 0x9436, 0x0FC9, + 0x8139, 0x9437, 0x9437, 0x10D6, 0x8139, 0x9438, 0x9438, 0x0728, 0x8139, + 0x9439, 0x9439, 0x0E90, 0x8139, 0x9530, 0x9530, 0x06C5, 0x8139, 0x9531, + 0x9531, 0x0D33, 0x8139, 0x9532, 0x9532, 0x10A8, 0x8139, 0x9533, 0x9533, + 0x0E42, 0x8139, 0x9534, 0x9534, 0x1BC6, 0x8139, 0x9535, 0x9535, 0x1B60, + 0x8139, 0x9536, 0x9536, 0x3EBF, 0x8139, 0x9537, 0x9537, 0x03E2, 0x8139, + 0x9538, 0x9538, 0x0BC3, 0x8139, 0x9539, 0x9539, 0x0AF8, 0x8139, 0x9630, + 0x9630, 0x0B22, 0x8139, 0x9631, 0x9631, 0x0AB1, 0x8139, 0x9632, 0x9632, + 0x0D4F, 0x8139, 0x9633, 0x9633, 0x0D46, 0x8139, 0x9634, 0x9634, 0x0D55, + 0x8139, 0x9635, 0x9635, 0x40CB, 0x8139, 0x9636, 0x9636, 0x0783, 0x8139, + 0x9637, 0x9637, 0x0FD1, 0x8139, 0x9638, 0x9638, 0x09EB, 0x8139, 0x9639, + 0x9639, 0x11F0, 0x8139, 0x9730, 0x9730, 0x0ADC, 0x8139, 0x9731, 0x9731, + 0x1CE7, 0x8139, 0x9732, 0x9732, 0x1C5E, 0x8139, 0x9733, 0x9733, 0x0EA9, + 0x8139, 0x9734, 0x9734, 0x101B, 0x8139, 0x9735, 0x9735, 0x10D5, 0x8139, + 0x9736, 0x9736, 0x09BA, 0x8139, 0x9737, 0x9737, 0x0637, 0x8139, 0x9738, + 0x9738, 0x1BCB, 0x8139, 0x9739, 0x9739, 0x0639, 0x8139, 0x9830, 0x9830, + 0x1A1E, 0x8139, 0x9831, 0x9831, 0x0CBD, 0x8139, 0x9832, 0x9832, 0x04E1, + 0x8139, 0x9833, 0x9833, 0x1231, 0x8139, 0x9834, 0x9834, 0x11C0, 0x8139, + 0x9835, 0x9835, 0x08F9, 0x8139, 0x9836, 0x9836, 0x0D19, 0x8139, 0x9837, + 0x9837, 0x1618, 0x8139, 0x9838, 0x9838, 0x11DA, 0x8139, 0x9839, 0x9839, + 0x1CDC, 0x8139, 0x9930, 0x9930, 0x0CE4, 0x8139, 0x9931, 0x9931, 0x45A2, + 0x8139, 0x9932, 0x9932, 0x1BF0, 0x8139, 0x9933, 0x9933, 0x050B, 0x8139, + 0x9934, 0x9934, 0x0FD3, 0x8139, 0x9935, 0x9935, 0x0F9B, 0x8139, 0x9936, + 0x9936, 0x1049, 0x8139, 0x9937, 0x9937, 0x49DC, 0x8139, 0x9938, 0x9938, + 0x1F96, 0x8139, 0x9939, 0x9939, 0x0898, 0x8139, 0x9A30, 0x9A30, 0x0FFD, + 0x8139, 0x9A31, 0x9A31, 0x0721, 0x8139, 0x9A32, 0x9A32, 0x05F8, 0x8139, + 0x9A33, 0x9A33, 0x1D15, 0x8139, 0x9A34, 0x9A34, 0x1D50, 0x8139, 0x9A35, + 0x9A35, 0x1E3B, 0x8139, 0x9A36, 0x9A36, 0x0505, 0x8139, 0x9A37, 0x9A37, + 0x123C, 0x8139, 0x9A38, 0x9A38, 0x1240, 0x8139, 0x9A39, 0x9A39, 0x0D26, + 0x8139, 0x9B30, 0x9B30, 0x1E7B, 0x8139, 0x9B31, 0x9B31, 0x0F8C, 0x8139, + 0x9B32, 0x9B32, 0x04E2, 0x8139, 0x9B33, 0x9B33, 0x4D13, 0x8139, 0x9B34, + 0x9B34, 0x105F, 0x8139, 0x9B35, 0x9B35, 0x10B4, 0x8139, 0x9B36, 0x9B36, + 0x4E18, 0x8139, 0x9B37, 0x9B37, 0x09DA, 0x8139, 0x9B38, 0x9B38, 0x08C1, + 0x8139, 0x9B39, 0x9B39, 0x1E75, 0x8139, 0x9C30, 0x9C30, 0x207D, 0x8139, + 0x9C31, 0x9C31, 0x06B2, 0x8139, 0x9C32, 0x9C32, 0x09EE, 0x8139, 0x9C33, + 0x9C33, 0x1D79, 0x8139, 0x9C34, 0x9C34, 0x10CF, 0x8139, 0x9C35, 0x9C35, + 0x50EA, 0x8139, 0x9C36, 0x9C36, 0x0664, 0x8139, 0x9C37, 0x9C37, 0x0AEB, + 0x8139, 0x9C38, 0x9C38, 0x06EA, 0x8139, 0x9C39, 0x9C39, 0x218D, 0x8139, + 0x9D30, 0x9D30, 0x08F1, 0x8139, 0x9D31, 0x9D31, 0x107B, 0x8139, 0x9D32, + 0x9D32, 0x2209, 0x8139, 0x9D33, 0x9D33, 0x1F00, 0x8139, 0x9D34, 0x9D34, + 0x1EF4, 0x8139, 0x9D35, 0x9D35, 0x0D4A, 0x8139, 0x9D36, 0x9D36, 0x0D6E, + 0x8139, 0x9D37, 0x9D37, 0x0F50, 0x8139, 0x9D38, 0x9D38, 0x206D, 0x8139, + 0x9D39, 0x9D39, 0x0720, 0x8139, 0x9E30, 0x9E30, 0x06DA, 0x8139, 0x9E31, + 0x9E31, 0x1DEC, 0x8139, 0x9E32, 0x9E32, 0x1ED0, 0x8139, 0x9E33, 0x9E33, + 0x139B, 0x8139, 0x9E34, 0x9E34, 0x1260, 0x8139, 0x9E35, 0x9E35, 0x0746, + 0x8139, 0x9E36, 0x9E36, 0x2239, 0x8139, 0x9E37, 0x9E37, 0x209C, 0x8139, + 0x9E38, 0x9E38, 0x2688, 0x8139, 0x9E39, 0x9E39, 0x0A60, 0x8139, 0x9F30, + 0x9F30, 0x2071, 0x8139, 0x9F31, 0x9F31, 0x0A90, 0x8139, 0x9F32, 0x9F32, + 0x5586, 0x8139, 0x9F33, 0x9F33, 0x0D89, 0x8139, 0x9F34, 0x9F34, 0x0791, + 0x8139, 0x9F35, 0x9F35, 0x1A55, 0x8139, 0x9F36, 0x9F36, 0x2618, 0x8139, + 0x9F37, 0x9F37, 0x05E5, 0x8139, 0x9F38, 0x9F38, 0x071D, 0x8139, 0x9F39, + 0x9F39, 0x0D8A, 0x8139, 0xA030, 0xA030, 0x0430, 0x8139, 0xA031, 0xA031, + 0x20C6, 0x8139, 0xA032, 0xA032, 0x1E86, 0x8139, 0xA033, 0xA033, 0x2037, + 0x8139, 0xA034, 0xA034, 0x1F34, 0x8139, 0xA035, 0xA035, 0x12F3, 0x8139, + 0xA533, 0xA535, 0x577B, 0x8139, 0xA538, 0xA539, 0x577E, 0x8139, 0xA630, + 0xA630, 0x5780, 0x8139, 0xA634, 0xA634, 0x5755, 0x8139, 0xA636, 0xA636, + 0x5767, 0x8139, 0xA735, 0xA735, 0x5776, 0x8139, 0xA736, 0xA736, 0x5778, + 0x8139, 0xA737, 0xA737, 0x5777, 0x8139, 0xA738, 0xA738, 0x5779, 0x8139, + 0xA836, 0xA838, 0x5781, 0x8139, 0xB434, 0xB439, 0x5784, 0x8139, 0xB530, + 0xB539, 0x578A, 0x8139, 0xB630, 0xB637, 0x5794, 0x8139, 0xEE39, 0xEE39, + 0x5801, 0x8139, 0xEF30, 0xEF39, 0x5802, 0x8139, 0xF030, 0xF039, 0x580C, + 0x8139, 0xF130, 0xF139, 0x5816, 0x8139, 0xF230, 0xF239, 0x5820, 0x8139, + 0xF330, 0xF339, 0x582A, 0x8139, 0xF430, 0xF439, 0x5834, 0x8139, 0xF530, + 0xF539, 0x583E, 0x8139, 0xF630, 0xF639, 0x5848, 0x8139, 0xF730, 0xF739, + 0x5852, 0x8139, 0xF830, 0xF839, 0x585C, 0x8139, 0xF930, 0xF939, 0x5866, + 0x8139, 0xFA30, 0xFA39, 0x5870, 0x8139, 0xFB30, 0xFB39, 0x587A, 0x8139, + 0xFC30, 0xFC39, 0x5884, 0x8139, 0xFD30, 0xFD39, 0x588E, 0x8139, 0xFE30, + 0xFE39, 0x5898, 0x8230, 0x8130, 0x8139, 0x58A2, 0x8230, 0x8230, 0x8239, + 0x58AC, 0x8230, 0x8330, 0x8339, 0x58B6, 0x8230, 0x8430, 0x8439, 0x58C0, + 0x8230, 0x8530, 0x8539, 0x58CA, 0x8230, 0x8630, 0x8639, 0x58D4, 0x8230, + 0x8730, 0x8739, 0x58DE, 0x8230, 0x8830, 0x8839, 0x58E8, 0x8230, 0x8930, + 0x8939, 0x58F2, 0x8230, 0x8A30, 0x8A39, 0x58FC, 0x8230, 0x8B30, 0x8B39, + 0x5906, 0x8230, 0x8C30, 0x8C39, 0x5910, 0x8230, 0x8D30, 0x8D39, 0x591A, + 0x8230, 0x8E30, 0x8E39, 0x5924, 0x8230, 0x8F30, 0x8F39, 0x592E, 0x8230, + 0x9030, 0x9039, 0x5938, 0x8230, 0x9130, 0x9139, 0x5942, 0x8230, 0x9230, + 0x9239, 0x594C, 0x8230, 0x9330, 0x9339, 0x5956, 0x8230, 0x9430, 0x9439, + 0x5960, 0x8230, 0x9530, 0x9539, 0x596A, 0x8230, 0x9630, 0x9639, 0x5974, + 0x8230, 0x9730, 0x9739, 0x597E, 0x8230, 0x9830, 0x9839, 0x5988, 0x8230, + 0x9930, 0x9939, 0x5992, 0x8230, 0x9A30, 0x9A39, 0x599C, 0x8230, 0x9B30, + 0x9B39, 0x59A6, 0x8230, 0x9C30, 0x9C39, 0x59B0, 0x8230, 0x9D30, 0x9D39, + 0x59BA, 0x8230, 0x9E30, 0x9E39, 0x59C4, 0x8230, 0x9F30, 0x9F39, 0x59CE, + 0x8230, 0xA030, 0xA039, 0x59D8, 0x8230, 0xA130, 0xA139, 0x59E2, 0x8230, + 0xA230, 0xA239, 0x59EC, 0x8230, 0xA330, 0xA339, 0x59F6, 0x8230, 0xA430, + 0xA439, 0x5A00, 0x8230, 0xA530, 0xA539, 0x5A0A, 0x8230, 0xA630, 0xA639, + 0x5A14, 0x8230, 0xA730, 0xA739, 0x5A1E, 0x8230, 0xA830, 0xA839, 0x5A28, + 0x8230, 0xA930, 0xA939, 0x5A32, 0x8230, 0xAA30, 0xAA39, 0x5A3C, 0x8230, + 0xAB30, 0xAB39, 0x5A46, 0x8230, 0xAC30, 0xAC39, 0x5A50, 0x8230, 0xAD30, + 0xAD39, 0x5A5A, 0x8230, 0xAE30, 0xAE39, 0x5A64, 0x8230, 0xAF30, 0xAF39, + 0x5A6E, 0x8230, 0xB030, 0xB039, 0x5A78, 0x8230, 0xB130, 0xB139, 0x5A82, + 0x8230, 0xB230, 0xB239, 0x5A8C, 0x8230, 0xB330, 0xB339, 0x5A96, 0x8230, + 0xB430, 0xB439, 0x5AA0, 0x8230, 0xB530, 0xB539, 0x5AAA, 0x8230, 0xB630, + 0xB639, 0x5AB4, 0x8230, 0xB730, 0xB739, 0x5ABE, 0x8230, 0xB830, 0xB839, + 0x5AC8, 0x8230, 0xB930, 0xB939, 0x5AD2, 0x8230, 0xBA30, 0xBA39, 0x5ADC, + 0x8230, 0xBB30, 0xBB39, 0x5AE6, 0x8230, 0xBC30, 0xBC39, 0x5AF0, 0x8230, + 0xBD30, 0xBD39, 0x5AFA, 0x8230, 0xBE30, 0xBE39, 0x5B04, 0x8230, 0xBF30, + 0xBF39, 0x5B0E, 0x8230, 0xC030, 0xC039, 0x5B18, 0x8230, 0xC130, 0xC139, + 0x5B22, 0x8230, 0xC230, 0xC239, 0x5B2C, 0x8230, 0xC330, 0xC339, 0x5B36, + 0x8230, 0xC430, 0xC439, 0x5B40, 0x8230, 0xC530, 0xC539, 0x5B4A, 0x8230, + 0xC630, 0xC639, 0x5B54, 0x8230, 0xC730, 0xC739, 0x5B5E, 0x8230, 0xC830, + 0xC839, 0x5B68, 0x8230, 0xC930, 0xC939, 0x5B72, 0x8230, 0xCA30, 0xCA39, + 0x5B7C, 0x8230, 0xCB30, 0xCB39, 0x5B86, 0x8230, 0xCC30, 0xCC39, 0x5B90, + 0x8230, 0xCD30, 0xCD39, 0x5B9A, 0x8230, 0xCE30, 0xCE39, 0x5BA4, 0x8230, + 0xCF30, 0xCF39, 0x5BAE, 0x8230, 0xD030, 0xD039, 0x5BB8, 0x8230, 0xD130, + 0xD139, 0x5BC2, 0x8230, 0xD230, 0xD239, 0x5BCC, 0x8230, 0xD330, 0xD339, + 0x5BD6, 0x8230, 0xD430, 0xD439, 0x5BE0, 0x8230, 0xD530, 0xD539, 0x5BEA, + 0x8230, 0xD630, 0xD639, 0x5BF4, 0x8230, 0xD730, 0xD739, 0x5BFE, 0x8230, + 0xD830, 0xD839, 0x5C08, 0x8230, 0xD930, 0xD939, 0x5C12, 0x8230, 0xDA30, + 0xDA39, 0x5C1C, 0x8230, 0xDB30, 0xDB39, 0x5C26, 0x8230, 0xDC30, 0xDC39, + 0x5C30, 0x8230, 0xDD30, 0xDD39, 0x5C3A, 0x8230, 0xDE30, 0xDE39, 0x5C44, + 0x8230, 0xDF30, 0xDF39, 0x5C4E, 0x8230, 0xE030, 0xE039, 0x5C58, 0x8230, + 0xE130, 0xE139, 0x5C62, 0x8230, 0xE230, 0xE239, 0x5C6C, 0x8230, 0xE330, + 0xE339, 0x5C76, 0x8230, 0xE430, 0xE439, 0x5C80, 0x8230, 0xE530, 0xE539, + 0x5C8A, 0x8230, 0xE630, 0xE639, 0x5C94, 0x8230, 0xE730, 0xE739, 0x5C9E, + 0x8230, 0xE830, 0xE839, 0x5CA8, 0x8230, 0xE930, 0xE939, 0x5CB2, 0x8230, + 0xEA30, 0xEA39, 0x5CBC, 0x8230, 0xEB30, 0xEB39, 0x5CC6, 0x8230, 0xEC30, + 0xEC39, 0x5CD0, 0x8230, 0xED30, 0xED39, 0x5CDA, 0x8230, 0xEE30, 0xEE39, + 0x5CE4, 0x8230, 0xEF30, 0xEF39, 0x5CEE, 0x8230, 0xF030, 0xF039, 0x5CF8, + 0x8230, 0xF130, 0xF139, 0x5D02, 0x8230, 0xF230, 0xF239, 0x5D0C, 0x8230, + 0xF330, 0xF339, 0x5D16, 0x8230, 0xF430, 0xF439, 0x5D20, 0x8230, 0xF530, + 0xF539, 0x5D2A, 0x8230, 0xF630, 0xF639, 0x5D34, 0x8230, 0xF730, 0xF739, + 0x5D3E, 0x8230, 0xF830, 0xF839, 0x5D48, 0x8230, 0xF930, 0xF939, 0x5D52, + 0x8230, 0xFA30, 0xFA39, 0x5D5C, 0x8230, 0xFB30, 0xFB39, 0x5D66, 0x8230, + 0xFC30, 0xFC39, 0x5D70, 0x8230, 0xFD30, 0xFD39, 0x5D7A, 0x8230, 0xFE30, + 0xFE39, 0x5D84, 0x8231, 0x8130, 0x8139, 0x5D8E, 0x8231, 0x8230, 0x8239, + 0x5D98, 0x8231, 0x8330, 0x8339, 0x5DA2, 0x8231, 0x8430, 0x8439, 0x5DAC, + 0x8231, 0x8530, 0x8539, 0x5DB6, 0x8231, 0x8630, 0x8639, 0x5DC0, 0x8231, + 0x8730, 0x8739, 0x5DCA, 0x8231, 0x8830, 0x8839, 0x5DD4, 0x8231, 0x8930, + 0x8939, 0x5DDE, 0x8231, 0x8A30, 0x8A39, 0x5DE8, 0x8231, 0x8B30, 0x8B39, + 0x5DF2, 0x8231, 0x8C30, 0x8C39, 0x5DFC, 0x8231, 0x8D30, 0x8D39, 0x5E06, + 0x8231, 0x8E30, 0x8E39, 0x5E10, 0x8231, 0x8F30, 0x8F39, 0x5E1A, 0x8231, + 0x9030, 0x9039, 0x5E24, 0x8231, 0x9130, 0x9139, 0x5E2E, 0x8231, 0x9230, + 0x9239, 0x5E38, 0x8231, 0x9330, 0x9339, 0x5E42, 0x8231, 0x9430, 0x9439, + 0x5E4C, 0x8231, 0x9530, 0x9539, 0x5E56, 0x8231, 0x9630, 0x9639, 0x5E60, + 0x8231, 0x9730, 0x9739, 0x5E6A, 0x8231, 0x9830, 0x9839, 0x5E74, 0x8231, + 0x9930, 0x9939, 0x5E7E, 0x8231, 0x9A30, 0x9A39, 0x5E88, 0x8231, 0x9B30, + 0x9B39, 0x5E92, 0x8231, 0x9C30, 0x9C39, 0x5E9C, 0x8231, 0x9D30, 0x9D39, + 0x5EA6, 0x8231, 0x9E30, 0x9E39, 0x5EB0, 0x8231, 0x9F30, 0x9F39, 0x5EBA, + 0x8231, 0xA030, 0xA039, 0x5EC4, 0x8231, 0xA130, 0xA139, 0x5ECE, 0x8231, + 0xA230, 0xA239, 0x5ED8, 0x8231, 0xA330, 0xA339, 0x5EE2, 0x8231, 0xA430, + 0xA439, 0x5EEC, 0x8231, 0xA530, 0xA539, 0x5EF6, 0x8231, 0xA630, 0xA639, + 0x5F00, 0x8231, 0xA730, 0xA739, 0x5F0A, 0x8231, 0xA830, 0xA839, 0x5F14, + 0x8231, 0xA930, 0xA939, 0x5F1E, 0x8231, 0xAA30, 0xAA39, 0x5F28, 0x8231, + 0xAB30, 0xAB39, 0x5F32, 0x8231, 0xAC30, 0xAC39, 0x5F3C, 0x8231, 0xAD30, + 0xAD39, 0x5F46, 0x8231, 0xAE30, 0xAE39, 0x5F50, 0x8231, 0xAF30, 0xAF39, + 0x5F5A, 0x8231, 0xB030, 0xB039, 0x5F64, 0x8231, 0xB130, 0xB139, 0x5F6E, + 0x8231, 0xB230, 0xB239, 0x5F78, 0x8231, 0xB330, 0xB339, 0x5F82, 0x8231, + 0xB430, 0xB439, 0x5F8C, 0x8231, 0xB530, 0xB539, 0x5F96, 0x8231, 0xB630, + 0xB639, 0x5FA0, 0x8231, 0xB730, 0xB739, 0x5FAA, 0x8231, 0xB830, 0xB839, + 0x5FB4, 0x8231, 0xB930, 0xB939, 0x5FBE, 0x8231, 0xBA30, 0xBA39, 0x5FC8, + 0x8231, 0xBB30, 0xBB39, 0x5FD2, 0x8231, 0xBC30, 0xBC39, 0x5FDC, 0x8231, + 0xBD30, 0xBD39, 0x5FE6, 0x8231, 0xBE30, 0xBE39, 0x5FF0, 0x8231, 0xBF30, + 0xBF39, 0x5FFA, 0x8231, 0xC030, 0xC039, 0x6004, 0x8231, 0xC130, 0xC139, + 0x600E, 0x8231, 0xC230, 0xC239, 0x6018, 0x8231, 0xC330, 0xC339, 0x6022, + 0x8231, 0xC430, 0xC439, 0x602C, 0x8231, 0xC530, 0xC539, 0x6036, 0x8231, + 0xC630, 0xC639, 0x6040, 0x8231, 0xC730, 0xC739, 0x604A, 0x8231, 0xC830, + 0xC839, 0x6054, 0x8231, 0xC930, 0xC939, 0x605E, 0x8231, 0xCA30, 0xCA39, + 0x6068, 0x8231, 0xCB30, 0xCB39, 0x6072, 0x8231, 0xCC30, 0xCC39, 0x607C, + 0x8231, 0xCD30, 0xCD39, 0x6086, 0x8231, 0xCE30, 0xCE39, 0x6090, 0x8231, + 0xCF30, 0xCF39, 0x609A, 0x8231, 0xD030, 0xD039, 0x60A4, 0x8231, 0xD130, + 0xD139, 0x60AE, 0x8231, 0xD230, 0xD239, 0x60B8, 0x8231, 0xD330, 0xD339, + 0x60C2, 0x8231, 0xD430, 0xD439, 0x60CC, 0x8231, 0xD530, 0xD539, 0x60D6, + 0x8231, 0xD630, 0xD639, 0x60E0, 0x8231, 0xD730, 0xD739, 0x60EA, 0x8231, + 0xD830, 0xD839, 0x60F4, 0x8231, 0xD930, 0xD939, 0x60FE, 0x8231, 0xDA30, + 0xDA39, 0x6108, 0x8231, 0xDB30, 0xDB39, 0x6112, 0x8231, 0xDC30, 0xDC39, + 0x611C, 0x8231, 0xDD30, 0xDD39, 0x6126, 0x8231, 0xDE30, 0xDE39, 0x6130, + 0x8231, 0xDF30, 0xDF39, 0x613A, 0x8231, 0xE030, 0xE039, 0x6144, 0x8231, + 0xE130, 0xE139, 0x614E, 0x8231, 0xE230, 0xE239, 0x6158, 0x8231, 0xE330, + 0xE339, 0x6162, 0x8231, 0xE430, 0xE439, 0x616C, 0x8231, 0xE530, 0xE539, + 0x6176, 0x8231, 0xE630, 0xE639, 0x6180, 0x8231, 0xE730, 0xE739, 0x618A, + 0x8231, 0xE830, 0xE839, 0x6194, 0x8231, 0xE930, 0xE939, 0x619E, 0x8231, + 0xEA30, 0xEA39, 0x61A8, 0x8231, 0xEB30, 0xEB39, 0x61B2, 0x8231, 0xEC30, + 0xEC39, 0x61BC, 0x8231, 0xED30, 0xED39, 0x61C6, 0x8231, 0xEE30, 0xEE39, + 0x61D0, 0x8231, 0xEF30, 0xEF39, 0x61DA, 0x8231, 0xF030, 0xF039, 0x61E4, + 0x8231, 0xF130, 0xF139, 0x61EE, 0x8231, 0xF230, 0xF239, 0x61F8, 0x8231, + 0xF330, 0xF339, 0x6202, 0x8231, 0xF430, 0xF439, 0x620C, 0x8231, 0xF530, + 0xF539, 0x6216, 0x8231, 0xF630, 0xF639, 0x6220, 0x8231, 0xF730, 0xF739, + 0x622A, 0x8231, 0xF830, 0xF839, 0x6234, 0x8231, 0xF930, 0xF939, 0x623E, + 0x8231, 0xFA30, 0xFA39, 0x6248, 0x8231, 0xFB30, 0xFB39, 0x6252, 0x8231, + 0xFC30, 0xFC39, 0x625C, 0x8231, 0xFD30, 0xFD39, 0x6266, 0x8231, 0xFE30, + 0xFE39, 0x6270, 0x8232, 0x8130, 0x8139, 0x627A, 0x8232, 0x8230, 0x8239, + 0x6284, 0x8232, 0x8330, 0x8339, 0x628E, 0x8232, 0x8430, 0x8439, 0x6298, + 0x8232, 0x8530, 0x8539, 0x62A2, 0x8232, 0x8630, 0x8639, 0x62AC, 0x8232, + 0x8730, 0x8739, 0x62B6, 0x8232, 0x8830, 0x8839, 0x62C0, 0x8232, 0x8930, + 0x8939, 0x62CA, 0x8232, 0x8A30, 0x8A39, 0x62D4, 0x8232, 0x8B30, 0x8B39, + 0x62DE, 0x8232, 0x8C30, 0x8C39, 0x62E8, 0x8232, 0x8D30, 0x8D39, 0x62F2, + 0x8232, 0x8E30, 0x8E39, 0x62FC, 0x8232, 0x8F30, 0x8F39, 0x6306, 0x8232, + 0x9030, 0x9039, 0x6310, 0x8232, 0x9130, 0x9139, 0x631A, 0x8232, 0x9230, + 0x9239, 0x6324, 0x8232, 0x9330, 0x9339, 0x632E, 0x8232, 0x9430, 0x9439, + 0x6338, 0x8232, 0x9530, 0x9539, 0x6342, 0x8232, 0x9630, 0x9639, 0x634C, + 0x8232, 0x9730, 0x9739, 0x6356, 0x8232, 0x9830, 0x9839, 0x6360, 0x8232, + 0x9930, 0x9939, 0x636A, 0x8232, 0x9A30, 0x9A39, 0x6374, 0x8232, 0x9B30, + 0x9B39, 0x637E, 0x8232, 0x9C30, 0x9C39, 0x6388, 0x8232, 0x9D30, 0x9D39, + 0x6392, 0x8232, 0x9E30, 0x9E39, 0x639C, 0x8232, 0x9F30, 0x9F39, 0x63A6, + 0x8232, 0xA030, 0xA039, 0x63B0, 0x8232, 0xA130, 0xA139, 0x63BA, 0x8232, + 0xA230, 0xA239, 0x63C4, 0x8232, 0xA330, 0xA339, 0x63CE, 0x8232, 0xA430, + 0xA439, 0x63D8, 0x8232, 0xA530, 0xA539, 0x63E2, 0x8232, 0xA630, 0xA639, + 0x63EC, 0x8232, 0xA730, 0xA739, 0x63F6, 0x8232, 0xA830, 0xA839, 0x6400, + 0x8232, 0xA930, 0xA939, 0x640A, 0x8232, 0xAA30, 0xAA39, 0x6414, 0x8232, + 0xAB30, 0xAB39, 0x641E, 0x8232, 0xAC30, 0xAC39, 0x6428, 0x8232, 0xAD30, + 0xAD39, 0x6432, 0x8232, 0xAE30, 0xAE39, 0x643C, 0x8232, 0xAF30, 0xAF39, + 0x6446, 0x8232, 0xB030, 0xB039, 0x6450, 0x8232, 0xB130, 0xB139, 0x645A, + 0x8232, 0xB230, 0xB239, 0x6464, 0x8232, 0xB330, 0xB339, 0x646E, 0x8232, + 0xB430, 0xB439, 0x6478, 0x8232, 0xB530, 0xB539, 0x6482, 0x8232, 0xB630, + 0xB639, 0x648C, 0x8232, 0xB730, 0xB739, 0x6496, 0x8232, 0xB830, 0xB839, + 0x64A0, 0x8232, 0xB930, 0xB939, 0x64AA, 0x8232, 0xBA30, 0xBA39, 0x64B4, + 0x8232, 0xBB30, 0xBB39, 0x64BE, 0x8232, 0xBC30, 0xBC39, 0x64C8, 0x8232, + 0xBD30, 0xBD39, 0x64D2, 0x8232, 0xBE30, 0xBE39, 0x64DC, 0x8232, 0xBF30, + 0xBF39, 0x64E6, 0x8232, 0xC030, 0xC039, 0x64F0, 0x8232, 0xC130, 0xC139, + 0x64FA, 0x8232, 0xC230, 0xC239, 0x6504, 0x8232, 0xC330, 0xC339, 0x650E, + 0x8232, 0xC430, 0xC439, 0x6518, 0x8232, 0xC530, 0xC539, 0x6522, 0x8232, + 0xC630, 0xC639, 0x652C, 0x8232, 0xC730, 0xC739, 0x6536, 0x8232, 0xC830, + 0xC839, 0x6540, 0x8232, 0xC930, 0xC939, 0x654A, 0x8232, 0xCA30, 0xCA39, + 0x6554, 0x8232, 0xCB30, 0xCB39, 0x655E, 0x8232, 0xCC30, 0xCC39, 0x6568, + 0x8232, 0xCD30, 0xCD39, 0x6572, 0x8232, 0xCE30, 0xCE39, 0x657C, 0x8232, + 0xCF30, 0xCF39, 0x6586, 0x8232, 0xD030, 0xD039, 0x6590, 0x8232, 0xD130, + 0xD139, 0x659A, 0x8232, 0xD230, 0xD239, 0x65A4, 0x8232, 0xD330, 0xD339, + 0x65AE, 0x8232, 0xD430, 0xD439, 0x65B8, 0x8232, 0xD530, 0xD539, 0x65C2, + 0x8232, 0xD630, 0xD639, 0x65CC, 0x8232, 0xD730, 0xD739, 0x65D6, 0x8232, + 0xD830, 0xD839, 0x65E0, 0x8232, 0xD930, 0xD939, 0x65EA, 0x8232, 0xDA30, + 0xDA39, 0x65F4, 0x8232, 0xDB30, 0xDB39, 0x65FE, 0x8232, 0xDC30, 0xDC39, + 0x6608, 0x8232, 0xDD30, 0xDD39, 0x6612, 0x8232, 0xDE30, 0xDE39, 0x661C, + 0x8232, 0xDF30, 0xDF39, 0x6626, 0x8232, 0xE030, 0xE039, 0x6630, 0x8232, + 0xE130, 0xE139, 0x663A, 0x8232, 0xE230, 0xE239, 0x6644, 0x8232, 0xE330, + 0xE339, 0x664E, 0x8232, 0xE430, 0xE439, 0x6658, 0x8232, 0xE530, 0xE539, + 0x6662, 0x8232, 0xE630, 0xE639, 0x666C, 0x8232, 0xE730, 0xE739, 0x6676, + 0x8232, 0xE830, 0xE839, 0x6680, 0x8232, 0xE930, 0xE939, 0x668A, 0x8232, + 0xEA30, 0xEA39, 0x6694, 0x8232, 0xEB30, 0xEB39, 0x669E, 0x8232, 0xEC30, + 0xEC39, 0x66A8, 0x8232, 0xED30, 0xED39, 0x66B2, 0x8232, 0xEE30, 0xEE39, + 0x66BC, 0x8232, 0xEF30, 0xEF39, 0x66C6, 0x8232, 0xF030, 0xF039, 0x66D0, + 0x8232, 0xF130, 0xF139, 0x66DA, 0x8232, 0xF230, 0xF239, 0x66E4, 0x8232, + 0xF330, 0xF339, 0x66EE, 0x8232, 0xF430, 0xF439, 0x66F8, 0x8232, 0xF530, + 0xF539, 0x6702, 0x8232, 0xF630, 0xF639, 0x670C, 0x8232, 0xF730, 0xF739, + 0x6716, 0x8232, 0xF830, 0xF839, 0x6720, 0x8232, 0xF930, 0xF939, 0x672A, + 0x8232, 0xFA30, 0xFA39, 0x6734, 0x8232, 0xFB30, 0xFB39, 0x673E, 0x8232, + 0xFC30, 0xFC39, 0x6748, 0x8232, 0xFD30, 0xFD39, 0x6752, 0x8232, 0xFE30, + 0xFE39, 0x675C, 0x8233, 0x8130, 0x8139, 0x6766, 0x8233, 0x8230, 0x8239, + 0x6770, 0x8233, 0x8330, 0x8339, 0x677A, 0x8233, 0x8430, 0x8439, 0x6784, + 0x8233, 0x8530, 0x8539, 0x678E, 0x8233, 0x8630, 0x8639, 0x6798, 0x8233, + 0x8730, 0x8739, 0x67A2, 0x8233, 0x8830, 0x8839, 0x67AC, 0x8233, 0x8930, + 0x8939, 0x67B6, 0x8233, 0x8A30, 0x8A39, 0x67C0, 0x8233, 0x8B30, 0x8B39, + 0x67CA, 0x8233, 0x8C30, 0x8C39, 0x67D4, 0x8233, 0x8D30, 0x8D39, 0x67DE, + 0x8233, 0x8E30, 0x8E39, 0x67E8, 0x8233, 0x8F30, 0x8F39, 0x67F2, 0x8233, + 0x9030, 0x9039, 0x67FC, 0x8233, 0x9130, 0x9139, 0x6806, 0x8233, 0x9230, + 0x9239, 0x6810, 0x8233, 0x9330, 0x9339, 0x681A, 0x8233, 0x9430, 0x9439, + 0x6824, 0x8233, 0x9530, 0x9539, 0x682E, 0x8233, 0x9630, 0x9639, 0x6838, + 0x8233, 0x9730, 0x9739, 0x6842, 0x8233, 0x9830, 0x9839, 0x684C, 0x8233, + 0x9930, 0x9939, 0x6856, 0x8233, 0x9A30, 0x9A39, 0x6860, 0x8233, 0x9B30, + 0x9B39, 0x686A, 0x8233, 0x9C30, 0x9C39, 0x6874, 0x8233, 0x9D30, 0x9D39, + 0x687E, 0x8233, 0x9E30, 0x9E39, 0x6888, 0x8233, 0x9F30, 0x9F39, 0x6892, + 0x8233, 0xA030, 0xA039, 0x689C, 0x8233, 0xA130, 0xA139, 0x68A6, 0x8233, + 0xA230, 0xA239, 0x68B0, 0x8233, 0xA330, 0xA339, 0x68BA, 0x8233, 0xA430, + 0xA439, 0x68C4, 0x8233, 0xA530, 0xA539, 0x68CE, 0x8233, 0xA630, 0xA639, + 0x68D8, 0x8233, 0xA730, 0xA739, 0x68E2, 0x8233, 0xA830, 0xA839, 0x68EC, + 0x8233, 0xA930, 0xA939, 0x68F6, 0x8233, 0xAA30, 0xAA39, 0x6900, 0x8233, + 0xAB30, 0xAB39, 0x690A, 0x8233, 0xAC30, 0xAC39, 0x6914, 0x8233, 0xAD30, + 0xAD39, 0x691E, 0x8233, 0xAE30, 0xAE39, 0x6928, 0x8233, 0xAF30, 0xAF39, + 0x6932, 0x8233, 0xB030, 0xB039, 0x693C, 0x8233, 0xB130, 0xB139, 0x6946, + 0x8233, 0xB230, 0xB239, 0x6950, 0x8233, 0xB330, 0xB339, 0x695A, 0x8233, + 0xB430, 0xB439, 0x6964, 0x8233, 0xB530, 0xB539, 0x696E, 0x8233, 0xB630, + 0xB639, 0x6978, 0x8233, 0xB730, 0xB739, 0x6982, 0x8233, 0xB830, 0xB839, + 0x698C, 0x8233, 0xB930, 0xB939, 0x6996, 0x8233, 0xBA30, 0xBA39, 0x69A0, + 0x8233, 0xBB30, 0xBB39, 0x69AA, 0x8233, 0xBC30, 0xBC39, 0x69B4, 0x8233, + 0xBD30, 0xBD39, 0x69BE, 0x8233, 0xBE30, 0xBE39, 0x69C8, 0x8233, 0xBF30, + 0xBF39, 0x69D2, 0x8233, 0xC030, 0xC039, 0x69DC, 0x8233, 0xC130, 0xC139, + 0x69E6, 0x8233, 0xC230, 0xC239, 0x69F0, 0x8233, 0xC330, 0xC339, 0x69FA, + 0x8233, 0xC430, 0xC439, 0x6A04, 0x8233, 0xC530, 0xC539, 0x6A0E, 0x8233, + 0xC630, 0xC639, 0x6A18, 0x8233, 0xC730, 0xC739, 0x6A22, 0x8233, 0xC830, + 0xC839, 0x6A2C, 0x8233, 0xC930, 0xC939, 0x6A36, 0x8233, 0xCA30, 0xCA39, + 0x6A40, 0x8233, 0xCB30, 0xCB39, 0x6A4A, 0x8233, 0xCC30, 0xCC39, 0x6A54, + 0x8233, 0xCD30, 0xCD39, 0x6A5E, 0x8233, 0xCE30, 0xCE39, 0x6A68, 0x8233, + 0xCF30, 0xCF39, 0x6A72, 0x8233, 0xD030, 0xD039, 0x6A7C, 0x8233, 0xD130, + 0xD139, 0x6A86, 0x8233, 0xD230, 0xD239, 0x6A90, 0x8233, 0xD330, 0xD339, + 0x6A9A, 0x8233, 0xD430, 0xD439, 0x6AA4, 0x8233, 0xD530, 0xD539, 0x6AAE, + 0x8233, 0xD630, 0xD639, 0x6AB8, 0x8233, 0xD730, 0xD739, 0x6AC2, 0x8233, + 0xD830, 0xD839, 0x6ACC, 0x8233, 0xD930, 0xD939, 0x6AD6, 0x8233, 0xDA30, + 0xDA39, 0x6AE0, 0x8233, 0xDB30, 0xDB39, 0x6AEA, 0x8233, 0xDC30, 0xDC39, + 0x6AF4, 0x8233, 0xDD30, 0xDD39, 0x6AFE, 0x8233, 0xDE30, 0xDE39, 0x6B08, + 0x8233, 0xDF30, 0xDF39, 0x6B12, 0x8233, 0xE030, 0xE039, 0x6B1C, 0x8233, + 0xE130, 0xE139, 0x6B26, 0x8233, 0xE230, 0xE239, 0x6B30, 0x8233, 0xE330, + 0xE339, 0x6B3A, 0x8233, 0xE430, 0xE439, 0x6B44, 0x8233, 0xE530, 0xE539, + 0x6B4E, 0x8233, 0xE630, 0xE639, 0x6B58, 0x8233, 0xE730, 0xE739, 0x6B62, + 0x8233, 0xE830, 0xE839, 0x6B6C, 0x8233, 0xE930, 0xE939, 0x6B76, 0x8233, + 0xEA30, 0xEA39, 0x6B80, 0x8233, 0xEB30, 0xEB39, 0x6B8A, 0x8233, 0xEC30, + 0xEC39, 0x6B94, 0x8233, 0xED30, 0xED39, 0x6B9E, 0x8233, 0xEE30, 0xEE39, + 0x6BA8, 0x8233, 0xEF30, 0xEF39, 0x6BB2, 0x8233, 0xF030, 0xF039, 0x6BBC, + 0x8233, 0xF130, 0xF139, 0x6BC6, 0x8233, 0xF230, 0xF239, 0x6BD0, 0x8233, + 0xF330, 0xF339, 0x6BDA, 0x8233, 0xF430, 0xF439, 0x6BE4, 0x8233, 0xF530, + 0xF539, 0x6BEE, 0x8233, 0xF630, 0xF639, 0x6BF8, 0x8233, 0xF730, 0xF739, + 0x6C02, 0x8233, 0xF830, 0xF839, 0x6C0C, 0x8233, 0xF930, 0xF939, 0x6C16, + 0x8233, 0xFA30, 0xFA39, 0x6C20, 0x8233, 0xFB30, 0xFB39, 0x6C2A, 0x8233, + 0xFC30, 0xFC39, 0x6C34, 0x8233, 0xFD30, 0xFD39, 0x6C3E, 0x8233, 0xFE30, + 0xFE39, 0x6C48, 0x8234, 0x8130, 0x8139, 0x6C52, 0x8234, 0x8230, 0x8239, + 0x6C5C, 0x8234, 0x8330, 0x8339, 0x6C66, 0x8234, 0x8430, 0x8439, 0x6C70, + 0x8234, 0x8530, 0x8539, 0x6C7A, 0x8234, 0x8630, 0x8639, 0x6C84, 0x8234, + 0x8730, 0x8739, 0x6C8E, 0x8234, 0x8830, 0x8839, 0x6C98, 0x8234, 0x8930, + 0x8939, 0x6CA2, 0x8234, 0x8A30, 0x8A39, 0x6CAC, 0x8234, 0x8B30, 0x8B39, + 0x6CB6, 0x8234, 0x8C30, 0x8C39, 0x6CC0, 0x8234, 0x8D30, 0x8D39, 0x6CCA, + 0x8234, 0x8E30, 0x8E39, 0x6CD4, 0x8234, 0x8F30, 0x8F39, 0x6CDE, 0x8234, + 0x9030, 0x9039, 0x6CE8, 0x8234, 0x9130, 0x9139, 0x6CF2, 0x8234, 0x9230, + 0x9239, 0x6CFC, 0x8234, 0x9330, 0x9339, 0x6D06, 0x8234, 0x9430, 0x9439, + 0x6D10, 0x8234, 0x9530, 0x9539, 0x6D1A, 0x8234, 0x9630, 0x9639, 0x6D24, + 0x8234, 0x9730, 0x9739, 0x6D2E, 0x8234, 0x9830, 0x9839, 0x6D38, 0x8234, + 0x9930, 0x9939, 0x6D42, 0x8234, 0x9A30, 0x9A39, 0x6D4C, 0x8234, 0x9B30, + 0x9B39, 0x6D56, 0x8234, 0x9C30, 0x9C39, 0x6D60, 0x8234, 0x9D30, 0x9D39, + 0x6D6A, 0x8234, 0x9E30, 0x9E39, 0x6D74, 0x8234, 0x9F30, 0x9F39, 0x6D7E, + 0x8234, 0xA030, 0xA039, 0x6D88, 0x8234, 0xA130, 0xA139, 0x6D92, 0x8234, + 0xA230, 0xA239, 0x6D9C, 0x8234, 0xA330, 0xA339, 0x6DA6, 0x8234, 0xA430, + 0xA439, 0x6DB0, 0x8234, 0xA530, 0xA539, 0x6DBA, 0x8234, 0xA630, 0xA639, + 0x6DC4, 0x8234, 0xA730, 0xA739, 0x6DCE, 0x8234, 0xA830, 0xA839, 0x6DD8, + 0x8234, 0xA930, 0xA939, 0x6DE2, 0x8234, 0xAA30, 0xAA39, 0x6DEC, 0x8234, + 0xAB30, 0xAB39, 0x6DF6, 0x8234, 0xAC30, 0xAC39, 0x6E00, 0x8234, 0xAD30, + 0xAD39, 0x6E0A, 0x8234, 0xAE30, 0xAE39, 0x6E14, 0x8234, 0xAF30, 0xAF39, + 0x6E1E, 0x8234, 0xB030, 0xB039, 0x6E28, 0x8234, 0xB130, 0xB139, 0x6E32, + 0x8234, 0xB230, 0xB239, 0x6E3C, 0x8234, 0xB330, 0xB339, 0x6E46, 0x8234, + 0xB430, 0xB439, 0x6E50, 0x8234, 0xB530, 0xB539, 0x6E5A, 0x8234, 0xB630, + 0xB639, 0x6E64, 0x8234, 0xB730, 0xB739, 0x6E6E, 0x8234, 0xB830, 0xB839, + 0x6E78, 0x8234, 0xB930, 0xB939, 0x6E82, 0x8234, 0xBA30, 0xBA39, 0x6E8C, + 0x8234, 0xBB30, 0xBB39, 0x6E96, 0x8234, 0xBC30, 0xBC39, 0x6EA0, 0x8234, + 0xBD30, 0xBD39, 0x6EAA, 0x8234, 0xBE30, 0xBE39, 0x6EB4, 0x8234, 0xBF30, + 0xBF39, 0x6EBE, 0x8234, 0xC030, 0xC039, 0x6EC8, 0x8234, 0xC130, 0xC139, + 0x6ED2, 0x8234, 0xC230, 0xC239, 0x6EDC, 0x8234, 0xC330, 0xC339, 0x6EE6, + 0x8234, 0xC430, 0xC439, 0x6EF0, 0x8234, 0xC530, 0xC539, 0x6EFA, 0x8234, + 0xC630, 0xC639, 0x6F04, 0x8234, 0xC730, 0xC739, 0x6F0E, 0x8234, 0xC830, + 0xC839, 0x6F18, 0x8234, 0xC930, 0xC939, 0x6F22, 0x8234, 0xCA30, 0xCA39, + 0x6F2C, 0x8234, 0xCB30, 0xCB39, 0x6F36, 0x8234, 0xCC30, 0xCC39, 0x6F40, + 0x8234, 0xCD30, 0xCD39, 0x6F4A, 0x8234, 0xCE30, 0xCE39, 0x6F54, 0x8234, + 0xCF30, 0xCF39, 0x6F5E, 0x8234, 0xD030, 0xD039, 0x6F68, 0x8234, 0xD130, + 0xD139, 0x6F72, 0x8234, 0xD230, 0xD239, 0x6F7C, 0x8234, 0xD330, 0xD339, + 0x6F86, 0x8234, 0xD430, 0xD439, 0x6F90, 0x8234, 0xD530, 0xD539, 0x6F9A, + 0x8234, 0xD630, 0xD639, 0x6FA4, 0x8234, 0xD730, 0xD739, 0x6FAE, 0x8234, + 0xD830, 0xD839, 0x6FB8, 0x8234, 0xD930, 0xD939, 0x6FC2, 0x8234, 0xDA30, + 0xDA39, 0x6FCC, 0x8234, 0xDB30, 0xDB39, 0x6FD6, 0x8234, 0xDC30, 0xDC39, + 0x6FE0, 0x8234, 0xDD30, 0xDD39, 0x6FEA, 0x8234, 0xDE30, 0xDE39, 0x6FF4, + 0x8234, 0xDF30, 0xDF39, 0x6FFE, 0x8234, 0xE030, 0xE039, 0x7008, 0x8234, + 0xE130, 0xE139, 0x7012, 0x8234, 0xE230, 0xE239, 0x701C, 0x8234, 0xE330, + 0xE339, 0x7026, 0x8234, 0xE430, 0xE439, 0x7030, 0x8234, 0xE530, 0xE539, + 0x703A, 0x8234, 0xE630, 0xE639, 0x7044, 0x8234, 0xE730, 0xE739, 0x704E, + 0x8234, 0xE830, 0xE839, 0x7058, 0x8234, 0xE930, 0xE939, 0x7062, 0x8234, + 0xEA30, 0xEA39, 0x706C, 0x8234, 0xEB30, 0xEB39, 0x7076, 0x8234, 0xEC30, + 0xEC39, 0x7080, 0x8234, 0xED30, 0xED39, 0x708A, 0x8234, 0xEE30, 0xEE39, + 0x7094, 0x8234, 0xEF30, 0xEF39, 0x709E, 0x8234, 0xF030, 0xF039, 0x70A8, + 0x8234, 0xF130, 0xF139, 0x70B2, 0x8234, 0xF230, 0xF239, 0x70BC, 0x8234, + 0xF330, 0xF339, 0x70C6, 0x8234, 0xF430, 0xF439, 0x70D0, 0x8234, 0xF530, + 0xF539, 0x70DA, 0x8234, 0xF630, 0xF639, 0x70E4, 0x8234, 0xF730, 0xF739, + 0x70EE, 0x8234, 0xF830, 0xF839, 0x70F8, 0x8234, 0xF930, 0xF939, 0x7102, + 0x8234, 0xFA30, 0xFA39, 0x710C, 0x8234, 0xFB30, 0xFB39, 0x7116, 0x8234, + 0xFC30, 0xFC39, 0x7120, 0x8234, 0xFD30, 0xFD39, 0x712A, 0x8234, 0xFE30, + 0xFE39, 0x7134, 0x8235, 0x8130, 0x8139, 0x713E, 0x8235, 0x8230, 0x8239, + 0x7148, 0x8235, 0x8330, 0x8339, 0x7152, 0x8235, 0x8430, 0x8439, 0x715C, + 0x8235, 0x8530, 0x8539, 0x7166, 0x8235, 0x8630, 0x8639, 0x7170, 0x8235, + 0x8730, 0x8738, 0x717A, 0x8235, 0x9833, 0x9839, 0x7188, 0x8235, 0x9930, + 0x9939, 0x718F, 0x8235, 0x9A30, 0x9A39, 0x7199, 0x8235, 0x9B30, 0x9B39, + 0x71A3, 0x8235, 0x9C30, 0x9C39, 0x71AD, 0x8235, 0x9D30, 0x9D39, 0x71B7, + 0x8235, 0x9E30, 0x9E39, 0x71C1, 0x8235, 0x9F30, 0x9F39, 0x71CB, 0x8235, + 0xA030, 0xA039, 0x71D5, 0x8235, 0xA130, 0xA139, 0x71DF, 0x8235, 0xA230, + 0xA239, 0x71E9, 0x8235, 0xA330, 0xA339, 0x71F3, 0x8235, 0xA430, 0xA439, + 0x71FD, 0x8235, 0xA530, 0xA539, 0x7207, 0x8235, 0xA630, 0xA639, 0x7211, + 0x8235, 0xA730, 0xA739, 0x721B, 0x8235, 0xA830, 0xA839, 0x7225, 0x8235, + 0xA930, 0xA939, 0x722F, 0x8235, 0xAA30, 0xAA39, 0x7239, 0x8235, 0xAB30, + 0xAB39, 0x7243, 0x8235, 0xAC30, 0xAC39, 0x724D, 0x8235, 0xAD30, 0xAD39, + 0x7257, 0x8235, 0xAE30, 0xAE39, 0x7261, 0x8235, 0xAF30, 0xAF39, 0x726B, + 0x8235, 0xB030, 0xB039, 0x7275, 0x8235, 0xB130, 0xB139, 0x727F, 0x8235, + 0xB230, 0xB239, 0x7289, 0x8235, 0xB330, 0xB339, 0x7293, 0x8235, 0xB430, + 0xB439, 0x729D, 0x8235, 0xB530, 0xB539, 0x72A7, 0x8235, 0xB630, 0xB639, + 0x72B1, 0x8235, 0xB730, 0xB739, 0x72BB, 0x8235, 0xB830, 0xB839, 0x72C5, + 0x8235, 0xB930, 0xB939, 0x72CF, 0x8235, 0xBA30, 0xBA39, 0x72D9, 0x8235, + 0xBB30, 0xBB39, 0x72E3, 0x8235, 0xBC30, 0xBC39, 0x72ED, 0x8235, 0xBD30, + 0xBD39, 0x72F7, 0x8235, 0xBE30, 0xBE39, 0x7301, 0x8235, 0xBF30, 0xBF39, + 0x730B, 0x8235, 0xC030, 0xC039, 0x7315, 0x8235, 0xC130, 0xC139, 0x731F, + 0x8235, 0xC230, 0xC239, 0x7329, 0x8235, 0xC330, 0xC339, 0x7333, 0x8235, + 0xC430, 0xC439, 0x733D, 0x8235, 0xC530, 0xC539, 0x7347, 0x8235, 0xC630, + 0xC639, 0x7351, 0x8235, 0xC730, 0xC739, 0x735B, 0x8235, 0xC830, 0xC839, + 0x7365, 0x8235, 0xC930, 0xC939, 0x736F, 0x8235, 0xCA30, 0xCA39, 0x7379, + 0x8235, 0xCB30, 0xCB39, 0x7383, 0x8235, 0xCC30, 0xCC39, 0x738D, 0x8235, + 0xCD30, 0xCD39, 0x7397, 0x8235, 0xCE30, 0xCE39, 0x73A1, 0x8235, 0xCF30, + 0xCF39, 0x73AB, 0x8235, 0xD030, 0xD039, 0x73B5, 0x8235, 0xD130, 0xD139, + 0x73BF, 0x8235, 0xD230, 0xD239, 0x73C9, 0x8235, 0xD330, 0xD339, 0x73D3, + 0x8235, 0xD430, 0xD439, 0x73DD, 0x8235, 0xD530, 0xD539, 0x73E7, 0x8235, + 0xD630, 0xD639, 0x73F1, 0x8235, 0xD730, 0xD739, 0x73FB, 0x8235, 0xD830, + 0xD839, 0x7405, 0x8235, 0xD930, 0xD939, 0x740F, 0x8235, 0xDA30, 0xDA39, + 0x7419, 0x8235, 0xDB30, 0xDB39, 0x7423, 0x8235, 0xDC30, 0xDC39, 0x742D, + 0x8235, 0xDD30, 0xDD39, 0x7437, 0x8235, 0xDE30, 0xDE39, 0x7441, 0x8235, + 0xDF30, 0xDF39, 0x744B, 0x8235, 0xE030, 0xE039, 0x7455, 0x8235, 0xE130, + 0xE139, 0x745F, 0x8235, 0xE230, 0xE239, 0x7469, 0x8235, 0xE330, 0xE339, + 0x7473, 0x8235, 0xE430, 0xE439, 0x747D, 0x8235, 0xE530, 0xE539, 0x7487, + 0x8235, 0xE630, 0xE639, 0x7491, 0x8235, 0xE730, 0xE739, 0x749B, 0x8235, + 0xE830, 0xE839, 0x74A5, 0x8235, 0xE930, 0xE939, 0x74AF, 0x8235, 0xEA30, + 0xEA39, 0x74B9, 0x8235, 0xEB30, 0xEB39, 0x74C3, 0x8235, 0xEC30, 0xEC39, + 0x74CD, 0x8235, 0xED30, 0xED39, 0x74D7, 0x8235, 0xEE30, 0xEE39, 0x74E1, + 0x8235, 0xEF30, 0xEF39, 0x74EB, 0x8235, 0xF030, 0xF039, 0x74F5, 0x8235, + 0xF130, 0xF139, 0x74FF, 0x8235, 0xF230, 0xF239, 0x7509, 0x8235, 0xF330, + 0xF339, 0x7513, 0x8235, 0xF430, 0xF439, 0x751D, 0x8235, 0xF530, 0xF539, + 0x7527, 0x8235, 0xF630, 0xF639, 0x7531, 0x8235, 0xF730, 0xF739, 0x753B, + 0x8235, 0xF830, 0xF839, 0x7545, 0x8235, 0xF930, 0xF939, 0x754F, 0x8235, + 0xFA30, 0xFA39, 0x7559, 0x8235, 0xFB30, 0xFB39, 0x7563, 0x8235, 0xFC30, + 0xFC39, 0x756D, 0x8235, 0xFD30, 0xFD39, 0x7577, 0x8235, 0xFE30, 0xFE39, + 0x7581, 0x8236, 0x8130, 0x8139, 0x758B, 0x8236, 0x8230, 0x8239, 0x7595, + 0x8236, 0x8330, 0x8339, 0x759F, 0x8236, 0x8430, 0x8439, 0x75A9, 0x8236, + 0x8530, 0x8539, 0x75B3, 0x8236, 0x8630, 0x8639, 0x75BD, 0x8236, 0x8730, + 0x8739, 0x75C7, 0x8236, 0x8830, 0x8839, 0x75D1, 0x8236, 0x8930, 0x8939, + 0x75DB, 0x8236, 0x8A30, 0x8A39, 0x75E5, 0x8236, 0x8B30, 0x8B39, 0x75EF, + 0x8236, 0x8C30, 0x8C39, 0x75F9, 0x8236, 0x8D30, 0x8D39, 0x7603, 0x8236, + 0x8E30, 0x8E37, 0x760D, 0x8236, 0x8F31, 0x8F39, 0x7615, 0x8236, 0x9030, + 0x9039, 0x761E, 0x8236, 0x9130, 0x9139, 0x7628, 0x8236, 0x9230, 0x9239, + 0x7632, 0x8236, 0x9330, 0x9339, 0x763C, 0x8236, 0x9430, 0x9435, 0x7646, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK2K-V_5.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK2K-V_5.cpp new file mode 100644 index 000000000000..8efedd063c16 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBK2K-V_5.cpp @@ -0,0 +1,24 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +const uint16_t g_FXCMAP_GBK2K_V_5[41 * 3] = { + 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256, + 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246, + 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244, + 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240, + 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D, + 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254, + 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F, 0xA4A1, 0xA4A1, 0x5757, + 0xA4A3, 0xA4A3, 0x5759, 0xA4A5, 0xA4A5, 0x5762, 0xA4A7, 0xA4A7, 0x5758, + 0xA4A9, 0xA4A9, 0x5760, 0xA4C3, 0xA4C3, 0x5761, 0xA4E3, 0xA4E3, 0x5764, + 0xA4E5, 0xA4E5, 0x5766, 0xA4E7, 0xA4E7, 0x5765, 0xA4EE, 0xA4EE, 0x5763, + 0xA5A1, 0xA5A1, 0x5768, 0xA5A3, 0xA5A3, 0x576A, 0xA5A5, 0xA5A5, 0x5771, + 0xA5A7, 0xA5A7, 0x5769, 0xA5A9, 0xA5A9, 0x576F, 0xA5C3, 0xA5C3, 0x5770, + 0xA5E3, 0xA5E3, 0x5773, 0xA5E5, 0xA5E5, 0x5775, 0xA5E7, 0xA5E7, 0x5774, + 0xA5EE, 0xA5EE, 0x5772, 0xA960, 0xA960, 0x577A, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBKp-EUC-H_2.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBKp-EUC-H_2.cpp new file mode 100644 index 000000000000..3145980b3a3f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBKp-EUC-H_2.cpp @@ -0,0 +1,1367 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +const uint16_t g_FXCMAP_GBKp_EUC_H_2[4070 * 3] = { + 0x0020, 0x007E, 0x0001, 0x8140, 0x8178, 0x2758, 0x8179, 0x8179, 0x2059, + 0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796, 0x8186, 0x8186, 0x21F1, + 0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2, 0x81EE, 0x81F5, 0x2802, + 0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A, 0x8240, 0x8252, 0x2812, + 0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825, 0x8262, 0x8262, 0x21B5, + 0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC, 0x8275, 0x8279, 0x2844, + 0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849, 0x827D, 0x827D, 0x1E62, + 0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20, 0x8281, 0x8282, 0x284C, + 0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E, 0x8290, 0x8290, 0x205C, + 0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194, 0x82A6, 0x82C7, 0x286E, + 0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281, 0x82CA, 0x82E0, 0x2890, + 0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7, 0x82E3, 0x82E3, 0x210A, + 0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8, 0x82ED, 0x82ED, 0x267F, + 0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E, 0x82F3, 0x82F6, 0x28B4, + 0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB, 0x82F9, 0x82F9, 0x226C, + 0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117, 0x82FC, 0x82FE, 0x28B9, + 0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8, 0x8342, 0x8344, 0x28BD, + 0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0, 0x8348, 0x8348, 0x1FB9, + 0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8, 0x834D, 0x8352, 0x28C5, + 0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB, 0x8357, 0x8357, 0x20C2, + 0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195, 0x835F, 0x8364, 0x28D4, + 0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3, 0x8367, 0x8371, 0x28DA, + 0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5, 0x8378, 0x8378, 0x2210, + 0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF, 0x837B, 0x837B, 0x28EB, + 0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC, 0x837E, 0x837E, 0x1FE4, + 0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED, 0x8386, 0x8386, 0x22D6, + 0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0, 0x838A, 0x838A, 0x22CE, + 0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681, 0x838E, 0x8393, 0x28F6, + 0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC, 0x839E, 0x839E, 0x2231, + 0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93, 0x83A7, 0x83AA, 0x290C, + 0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910, 0x83AE, 0x83AE, 0x22D7, + 0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1, 0x83B1, 0x83B9, 0x2912, + 0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B, 0x83C9, 0x83C9, 0x2025, + 0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF, 0x83F7, 0x83FE, 0x2955, + 0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9, 0x8451, 0x8470, 0x296D, + 0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D, 0x8474, 0x8474, 0x2263, + 0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683, 0x8478, 0x847E, 0x2991, + 0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17, 0x8483, 0x848D, 0x299A, + 0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5, 0x8492, 0x8492, 0x22CA, + 0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8, 0x849D, 0x849D, 0x1F4F, + 0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF, 0x84A2, 0x84A2, 0x2036, + 0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4, 0x84A5, 0x84A5, 0x22C9, + 0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5, 0x84A9, 0x84A9, 0x1F75, + 0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE, 0x84C6, 0x84D2, 0x29D2, + 0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF, 0x84D5, 0x84D5, 0x21A9, + 0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6, 0x84D8, 0x84D8, 0x29E1, + 0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003, 0x84DB, 0x84DC, 0x29E2, + 0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4, 0x84EA, 0x84EA, 0x2323, + 0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011, 0x84EF, 0x84F0, 0x29F3, + 0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5, 0x8540, 0x8550, 0x2A02, + 0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E, 0x8553, 0x8553, 0x2A13, + 0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14, 0x855E, 0x855E, 0x20EF, + 0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0, 0x8567, 0x857E, 0x2A24, + 0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1, 0x8588, 0x858A, 0x2A43, + 0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46, 0x8592, 0x8592, 0x21F9, + 0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010, 0x8597, 0x8597, 0x2A4F, + 0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50, 0x85A2, 0x85A2, 0x1E5A, + 0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2, 0x85B3, 0x85FE, 0x2A68, + 0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D, 0x864B, 0x8653, 0x2ABE, + 0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7, 0x8668, 0x8668, 0x236C, + 0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0, 0x8696, 0x8696, 0x219C, + 0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9, 0x869A, 0x86A0, 0x2B08, + 0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F, 0x86CA, 0x86CA, 0x210B, + 0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE, 0x86CD, 0x86CD, 0x2B38, + 0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39, 0x86D1, 0x86D1, 0x222C, + 0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8, 0x86DD, 0x86DD, 0x22C0, + 0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F, 0x86E2, 0x86E7, 0x2B48, + 0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E, 0x86EE, 0x86EE, 0x2379, + 0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372, 0x86F5, 0x86FE, 0x2B58, + 0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62, 0x8744, 0x8744, 0x237C, + 0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0, 0x874A, 0x874A, 0x2B69, + 0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74, 0x874D, 0x874E, 0x2B6A, + 0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C, 0x8757, 0x8757, 0x1F4C, + 0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378, 0x875B, 0x875B, 0x21CF, + 0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75, 0x875E, 0x875E, 0x2371, + 0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369, 0x8761, 0x8765, 0x2B77, + 0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C, 0x877A, 0x877A, 0x236F, + 0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370, 0x877E, 0x877E, 0x2B91, + 0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376, 0x8782, 0x8782, 0x2373, + 0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F, 0x8787, 0x8787, 0x2B96, + 0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97, 0x878A, 0x878A, 0x20B5, + 0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB, 0x878E, 0x878E, 0x2672, + 0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E, 0x8794, 0x8797, 0x2B9E, + 0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2, 0x879D, 0x879D, 0x2375, + 0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382, 0x87A4, 0x87A6, 0x2BAB, + 0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE, 0x87B3, 0x87B3, 0x236B, + 0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039, 0x87B6, 0x87BA, 0x2BBA, + 0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF, 0x87BF, 0x87BF, 0x237D, + 0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2, 0x87C2, 0x87C2, 0x2381, + 0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B, 0x87CB, 0x87CB, 0x237E, + 0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA, 0x87CF, 0x87CF, 0x22DB, + 0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A, 0x87D3, 0x87D3, 0x2689, + 0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697, 0x87D6, 0x87D9, 0x2BCF, + 0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3, 0x87F7, 0x87F7, 0x2383, + 0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF, 0x87FA, 0x87FA, 0x218F, + 0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246, 0x8841, 0x8841, 0x2248, + 0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E, 0x8845, 0x8845, 0x2BF6, + 0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7, 0x8880, 0x88B9, 0x2C2F, + 0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69, 0x88CC, 0x88CC, 0x228B, + 0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85, 0x88D5, 0x88D6, 0x2C81, + 0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83, 0x88DF, 0x88DF, 0x232C, + 0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E, 0x88E6, 0x88F1, 0x2C8F, + 0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38, 0x88F4, 0x88F5, 0x2C9B, + 0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D, 0x8940, 0x894A, 0x2CA5, + 0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339, 0x894D, 0x894D, 0x2CB0, + 0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1, 0x8950, 0x8950, 0x232D, + 0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F, 0x8955, 0x895C, 0x2CB5, + 0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD, 0x895F, 0x895F, 0x232F, + 0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D, 0x896E, 0x8970, 0x2CCB, + 0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE, 0x897C, 0x897C, 0x1EC2, + 0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA, 0x898B, 0x898B, 0x22B2, + 0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF, 0x899A, 0x899D, 0x2CF2, + 0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6, 0x89A6, 0x89A6, 0x20D9, + 0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD, 0x89A9, 0x89AE, 0x2CFE, + 0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04, 0x89BA, 0x89BA, 0x21ED, + 0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007, 0x89BF, 0x89BF, 0x2326, + 0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11, 0x89C4, 0x89C4, 0x1F52, + 0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328, 0x89C7, 0x89C7, 0x2D14, + 0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15, 0x89CE, 0x89CE, 0x1E2B, + 0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE, 0x89D2, 0x89D7, 0x2D1C, + 0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22, 0x89DB, 0x89DB, 0x2138, + 0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081, 0x89F5, 0x89FE, 0x2D3C, + 0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C, 0x8A42, 0x8A58, 0x2D47, + 0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE, 0x8A5B, 0x8A5B, 0x2D5E, + 0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F, 0x8A5E, 0x8A5E, 0x1EFA, + 0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD, 0x8A7A, 0x8A7E, 0x2D7A, + 0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F, 0x8AE5, 0x8AFE, 0x2DE3, + 0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E, 0x8B45, 0x8B48, 0x2E01, + 0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05, 0x8B7A, 0x8B7A, 0x23FC, + 0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39, 0x8B8C, 0x8B8C, 0x2069, + 0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7, 0x8B9F, 0x8BB2, 0x2E56, + 0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A, 0x8BB9, 0x8BB9, 0x23FD, + 0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8, 0x8BBF, 0x8BC5, 0x2E73, + 0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A, 0x8BC8, 0x8BC8, 0x23FE, + 0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B, 0x8BD4, 0x8BD4, 0x2401, + 0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF, 0x8BDD, 0x8BE4, 0x2E8C, + 0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94, 0x8BEB, 0x8BEB, 0x2221, + 0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122, 0x8BF1, 0x8BFE, 0x2E9D, + 0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB, 0x8C45, 0x8C4E, 0x2EAF, + 0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9, 0x8C57, 0x8C57, 0x21E5, + 0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057, 0x8C5D, 0x8C7E, 0x2EC4, + 0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5, 0x8C8C, 0x8C8C, 0x2EF1, + 0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3, 0x8C8F, 0x8C8F, 0x2121, + 0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4, 0x8C92, 0x8C92, 0x1FE5, + 0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A, 0x8C9A, 0x8C9A, 0x1E37, + 0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E, 0x8CA3, 0x8CA3, 0x22A6, + 0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00, 0x8CA6, 0x8CA6, 0x1EDA, + 0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01, 0x8CC0, 0x8CC0, 0x235C, + 0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050, 0x8CD3, 0x8CD3, 0x1E67, + 0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4, 0x8CD6, 0x8CD8, 0x2F2B, + 0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E, 0x8CF9, 0x8CF9, 0x1F16, + 0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52, 0x8D73, 0x8D73, 0x2389, + 0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7, 0x8D76, 0x8D7A, 0x2F86, + 0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B, 0x8D80, 0x8D87, 0x2F8E, + 0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96, 0x8D8F, 0x8D8F, 0x1F1A, + 0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B, 0x8D9F, 0x8DB8, 0x2FAA, + 0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4, 0x8DE2, 0x8DE2, 0x2391, + 0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271, 0x8DE5, 0x8DE6, 0x2FED, + 0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF, 0x8DF7, 0x8DF7, 0x238E, + 0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D, 0x8E40, 0x8E45, 0x3004, + 0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A, 0x8E56, 0x8E56, 0x2390, + 0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033, 0x8E59, 0x8E59, 0x301A, + 0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B, 0x8E68, 0x8E68, 0x1FE9, + 0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055, 0x8E6F, 0x8E6F, 0x302D, + 0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E, 0x8E80, 0x8E80, 0x2324, + 0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143, 0x8E9C, 0x8E9E, 0x3056, + 0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059, 0x8EA4, 0x8EA4, 0x2277, + 0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7, 0x8EA8, 0x8EAB, 0x305F, + 0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063, 0x8EAE, 0x8EAE, 0x2384, + 0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387, 0x8EBE, 0x8EBE, 0x2386, + 0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290, 0x8EC4, 0x8EC4, 0x3076, + 0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077, 0x8ECD, 0x8ECD, 0x1E32, + 0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E, 0x8ED6, 0x8ED6, 0x1F13, + 0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085, 0x8EEC, 0x8EEC, 0x1FE0, + 0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB, 0x8F52, 0x8F52, 0x2087, + 0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE, 0x8F55, 0x8F55, 0x1EF6, + 0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD, 0x8F5D, 0x8F5D, 0x2045, + 0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178, 0x8F65, 0x8F7E, 0x30C9, + 0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5, 0x8F87, 0x8F87, 0x30E9, + 0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA, 0x8F95, 0x8F95, 0x266E, + 0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0, 0x8F98, 0x8F9A, 0x30F7, + 0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA, 0x8F9D, 0x8F9D, 0x2188, + 0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C, 0x8FA2, 0x8FBC, 0x30FE, + 0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119, 0x8FC4, 0x8FC4, 0x1EA1, + 0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393, 0x8FC7, 0x8FCC, 0x3120, + 0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126, 0x8FD8, 0x8FD8, 0x1E7C, + 0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156, 0x9080, 0x909C, 0x3195, + 0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E, 0x909F, 0x90B9, 0x31B2, + 0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD, 0x90C0, 0x90C0, 0x2095, + 0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2, 0x90C5, 0x90C5, 0x23B9, + 0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28, 0x90DC, 0x90DC, 0x23BD, + 0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5, 0x90EE, 0x90EF, 0x31FA, + 0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC, 0x90F7, 0x90F7, 0x23B3, + 0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209, 0x9142, 0x9142, 0x2162, + 0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E, 0x914C, 0x914C, 0x3213, + 0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214, 0x9151, 0x9151, 0x23B7, + 0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F, 0x9155, 0x9155, 0x24DF, + 0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2, 0x915A, 0x915A, 0x214E, + 0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052, 0x915E, 0x9160, 0x321E, + 0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221, 0x9163, 0x9163, 0x20EB, + 0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232, 0x916F, 0x9175, 0x322C, + 0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233, 0x917A, 0x917A, 0x201B, + 0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE, 0x917D, 0x917E, 0x3236, + 0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE, 0x9185, 0x918C, 0x323C, + 0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244, 0x9191, 0x9191, 0x2089, + 0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1, 0x9194, 0x9196, 0x3248, + 0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B, 0x919B, 0x919B, 0x2214, + 0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE, 0x91AA, 0x91AA, 0x2223, + 0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B, 0x91BA, 0x91BA, 0x268C, + 0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269, 0x91BF, 0x91BF, 0x24E0, + 0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8, 0x91C4, 0x91CC, 0x326F, + 0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278, 0x91D0, 0x91D0, 0x1FFE, + 0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1, 0x91D3, 0x91D3, 0x327A, + 0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B, 0x91D6, 0x91D6, 0x1FCE, + 0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E, 0x91D9, 0x91D9, 0x2021, + 0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1, 0x91E0, 0x91E1, 0x3282, + 0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284, 0x91EA, 0x91EA, 0x24A4, + 0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273, 0x91F1, 0x91F1, 0x3290, + 0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291, 0x9240, 0x927E, 0x329D, + 0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1, 0x92B7, 0x92CD, 0x3312, + 0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329, 0x92D0, 0x92D0, 0x235D, + 0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682, 0x92D5, 0x92DE, 0x332D, + 0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A, 0x92E1, 0x92FD, 0x3337, + 0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354, 0x9350, 0x9350, 0x21FF, + 0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58, 0x935E, 0x936F, 0x3370, + 0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382, 0x9376, 0x9376, 0x1EB6, + 0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F, 0x938C, 0x938C, 0x20DB, + 0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360, 0x939E, 0x93A4, 0x33AB, + 0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2, 0x93A7, 0x93A7, 0x2040, + 0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E, 0x93B5, 0x93B7, 0x33BF, + 0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2, 0x93BB, 0x93BB, 0x235E, + 0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A, 0x93BE, 0x93C5, 0x33C5, + 0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD, 0x93CF, 0x93CF, 0x2093, + 0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F, 0x93D8, 0x93DA, 0x33DC, + 0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54, 0x93DD, 0x93E0, 0x33DF, + 0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3, 0x93E4, 0x93E4, 0x20C0, + 0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5, 0x93E9, 0x93E9, 0x2160, + 0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D, 0x93EC, 0x93EC, 0x1F8E, + 0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9, 0x93EF, 0x93EF, 0x2047, + 0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262, 0x93F2, 0x93F3, 0x33EB, + 0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2, 0x93F6, 0x93F9, 0x33ED, + 0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1, 0x93FE, 0x93FE, 0x1FCC, + 0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72, 0x9445, 0x944C, 0x33F8, + 0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400, 0x9450, 0x9450, 0x1E52, + 0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C, 0x9453, 0x9453, 0x228F, + 0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED, 0x9456, 0x9457, 0x3403, + 0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405, 0x945B, 0x945B, 0x1E2D, + 0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366, 0x945E, 0x945E, 0x3407, + 0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408, 0x9464, 0x9464, 0x2363, + 0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A, 0x9467, 0x946D, 0x340D, + 0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414, 0x9472, 0x9472, 0x1FF6, + 0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364, 0x9475, 0x9475, 0x3418, + 0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419, 0x9478, 0x9478, 0x2367, + 0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D, 0x947B, 0x947E, 0x341B, + 0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056, 0x9482, 0x9482, 0x2163, + 0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9, 0x9488, 0x9488, 0x1FFC, + 0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E, 0x94A2, 0x94B2, 0x343B, + 0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C, 0x94B5, 0x94B5, 0x2142, + 0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E, 0x94C0, 0x94C0, 0x1E43, + 0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4, 0x94CD, 0x94D7, 0x3461, + 0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C, 0x94E0, 0x94E0, 0x1ED7, + 0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491, 0x9572, 0x9572, 0x212D, + 0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF, 0x9583, 0x9583, 0x229B, + 0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256, 0x959F, 0x959F, 0x24A8, + 0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79, 0x95B4, 0x95B9, 0x34FF, + 0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505, 0x95CF, 0x95CF, 0x24A7, + 0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686, 0x95D2, 0x95D2, 0x24A6, + 0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE, 0x95D5, 0x95E0, 0x351B, + 0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527, 0x95E7, 0x95E7, 0x1FE7, + 0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112, 0x95F2, 0x95F7, 0x3535, + 0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B, 0x95FE, 0x95FE, 0x1F5C, + 0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4, 0x9657, 0x967B, 0x3556, + 0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B, 0x9680, 0x96FE, 0x357D, + 0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A, 0x9768, 0x976B, 0x3623, + 0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627, 0x976E, 0x976E, 0x246D, + 0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638, 0x9796, 0x9796, 0x246B, + 0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E, 0x979D, 0x979D, 0x1ECE, + 0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272, 0x97A4, 0x97BE, 0x3658, + 0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673, 0x97EE, 0x97EE, 0x21FE, + 0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE, 0x97F8, 0x97FE, 0x36A9, + 0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475, 0x9846, 0x9848, 0x36B5, + 0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8, 0x984F, 0x984F, 0x1F6F, + 0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468, 0x9872, 0x9872, 0x36DE, + 0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF, 0x9880, 0x9880, 0x36EA, + 0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB, 0x988B, 0x988B, 0x1F27, + 0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4, 0x98A0, 0x98A0, 0x247C, + 0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1, 0x98AB, 0x98B5, 0x3710, + 0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005, 0x98B8, 0x98B9, 0x371B, + 0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D, 0x98C7, 0x98C7, 0x203E, + 0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C, 0x98CC, 0x98CF, 0x372C, + 0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730, 0x98D3, 0x98D3, 0x2204, + 0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3, 0x98E4, 0x98E4, 0x2140, + 0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741, 0x98EF, 0x98EF, 0x2474, + 0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD, 0x98F3, 0x98FE, 0x374C, + 0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68, 0x9944, 0x9944, 0x375B, + 0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C, 0x9966, 0x9966, 0x2472, + 0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5, 0x996F, 0x9974, 0x3783, + 0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789, 0x997A, 0x997A, 0x1F8B, + 0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D, 0x9980, 0x9984, 0x3790, + 0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795, 0x9989, 0x9989, 0x2482, + 0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1, 0x998F, 0x9990, 0x379C, + 0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E, 0x9999, 0x9999, 0x1F38, + 0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485, 0x99AA, 0x99AF, 0x37B4, + 0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E, 0x99B2, 0x99B2, 0x37BA, + 0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486, 0x99B5, 0x99B5, 0x2471, + 0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483, 0x99BE, 0x99BE, 0x2470, + 0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469, 0x99C1, 0x99C1, 0x37C3, + 0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4, 0x99C9, 0x99C9, 0x246F, + 0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481, 0x99CF, 0x99D0, 0x37CE, + 0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0, 0x99DA, 0x99DA, 0x1FF5, + 0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4, 0x99E1, 0x99E4, 0x37DD, + 0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1, 0x99E8, 0x99E8, 0x2479, + 0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E, 0x99ED, 0x99F3, 0x37E6, + 0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED, 0x9A40, 0x9A49, 0x37F7, + 0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801, 0x9A57, 0x9A57, 0x20AD, + 0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB, 0x9A66, 0x9A66, 0x381A, + 0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B, 0x9A71, 0x9A71, 0x2159, + 0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013, 0x9A77, 0x9A77, 0x1F33, + 0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F, 0x9A88, 0x9A88, 0x1E5C, + 0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488, 0x9A8D, 0x9A90, 0x383A, + 0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E, 0x9A97, 0x9A97, 0x248A, + 0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489, 0x9A9B, 0x9A9B, 0x248B, + 0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83, 0x9A9F, 0x9AA1, 0x3847, + 0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB, 0x9AA4, 0x9AA9, 0x384A, + 0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850, 0x9AD0, 0x9AD0, 0x24C0, + 0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D, 0x9AD7, 0x9AD9, 0x387A, + 0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D, 0x9AE2, 0x9AE2, 0x20CA, + 0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7, 0x9AE5, 0x9AE5, 0x24C2, + 0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E, 0x9B80, 0x9BD0, 0x38DD, + 0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E, 0x9BDC, 0x9BDC, 0x23DB, + 0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A, 0x9C53, 0x9C53, 0x205E, + 0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244, 0x9C5A, 0x9C5A, 0x23E2, + 0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4, 0x9C5D, 0x9C74, 0x3973, + 0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B, 0x9C79, 0x9C79, 0x1E66, + 0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993, 0x9C86, 0x9C86, 0x1F63, + 0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD, 0x9C9E, 0x9CAA, 0x39AF, + 0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC, 0x9CCA, 0x9CCA, 0x22B5, + 0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26, 0x9CD0, 0x9CE5, 0x39DE, + 0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088, 0x9CE8, 0x9CEB, 0x39F4, + 0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8, 0x9CEE, 0x9CEE, 0x2341, + 0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B, 0x9CFC, 0x9CFD, 0x3A05, + 0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07, 0x9D42, 0x9D42, 0x2124, + 0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048, 0x9D47, 0x9D47, 0x23E0, + 0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077, 0x9D4E, 0x9D4E, 0x3A11, + 0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12, 0x9D61, 0x9D61, 0x20B1, + 0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41, 0x9D69, 0x9D69, 0x201C, + 0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8, 0x9D6F, 0x9D70, 0x3A2D, + 0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F, 0x9D75, 0x9D75, 0x1F9B, + 0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F, 0x9D7C, 0x9D7C, 0x3A37, + 0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38, 0x9D80, 0x9D89, 0x3A39, + 0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43, 0x9D8D, 0x9D8D, 0x1FB4, + 0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7, 0x9D92, 0x9D98, 0x3A48, + 0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F, 0x9DA1, 0x9DA1, 0x23E1, + 0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56, 0x9DA7, 0x9DA7, 0x23EA, + 0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3, 0x9DAD, 0x9DAD, 0x210E, + 0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6, 0x9DB3, 0x9DB3, 0x2004, + 0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D, 0x9DBF, 0x9DC5, 0x3A6C, + 0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73, 0x9DC9, 0x9DC9, 0x2264, + 0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2, 0x9DCE, 0x9DD1, 0x3A78, + 0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C, 0x9DD5, 0x9DD5, 0x1EC4, + 0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6, 0x9DE2, 0x9DE2, 0x20A9, + 0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B, 0x9DF2, 0x9DF3, 0x3A97, + 0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99, 0x9DF7, 0x9DF7, 0x268B, + 0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76, 0x9DFB, 0x9DFC, 0x3A9D, + 0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F, 0x9E40, 0x9E44, 0x3AA0, + 0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5, 0x9E48, 0x9E48, 0x2191, + 0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7, 0x9E52, 0x9E52, 0x1F9C, + 0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA, 0x9E55, 0x9E55, 0x3AB0, + 0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1, 0x9E5D, 0x9E5D, 0x23E9, + 0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7, 0x9E61, 0x9E61, 0x21D5, + 0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6, 0x9E64, 0x9E66, 0x3ABA, + 0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD, 0x9E6C, 0x9E6C, 0x1E4F, + 0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9, 0x9E70, 0x9E71, 0x3AC3, + 0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5, 0x9E74, 0x9E74, 0x23EC, + 0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6, 0x9E7B, 0x9E7B, 0x23D8, + 0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB, 0x9E80, 0x9E84, 0x3ACD, + 0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2, 0x9E87, 0x9E87, 0x23ED, + 0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA, 0x9E92, 0x9E95, 0x3ADC, + 0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8, 0x9E98, 0x9EA1, 0x3AE0, + 0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA, 0x9EA6, 0x9EA6, 0x200B, + 0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166, 0x9EAA, 0x9EAD, 0x3AEF, + 0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3, 0x9EB3, 0x9EB3, 0x2189, + 0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7, 0x9EB7, 0x9EB7, 0x23E7, + 0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3, 0x9EF6, 0x9EFE, 0x3B36, + 0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A, 0x9F4F, 0x9F6E, 0x3B4D, + 0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D, 0x9F80, 0x9F91, 0x3B7C, + 0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E, 0x9F98, 0x9F98, 0x24D6, + 0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A, 0x9FA7, 0x9FA8, 0x3BA0, + 0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2, 0x9FAC, 0x9FAC, 0x24D5, + 0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228, 0x9FCA, 0x9FCC, 0x3BC0, + 0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3, 0x9FE1, 0x9FE1, 0x20FC, + 0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87, 0x9FEC, 0x9FED, 0x3BDF, + 0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1, 0x9FF4, 0x9FF4, 0x1EBA, + 0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119, 0x9FFE, 0x9FFE, 0x3BEE, + 0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C, 0xA044, 0xA045, 0x3BF2, + 0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4, 0xA049, 0xA049, 0x2227, + 0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F, 0xA04F, 0xA053, 0x3BFA, + 0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF, 0xA05A, 0xA05A, 0x1F5D, + 0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC, 0xA062, 0xA062, 0x3C0A, + 0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B, 0xA071, 0xA071, 0x2149, + 0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046, 0xA075, 0xA07E, 0x3C1A, + 0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24, 0xA091, 0xA091, 0x2190, + 0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208, 0xA095, 0xA095, 0x3C36, + 0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37, 0xA0A9, 0xA0A9, 0x24C3, + 0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC, 0xA0C0, 0xA0CD, 0x3C5E, + 0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C, 0xA0D9, 0xA0D9, 0x1ED1, + 0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC, 0xA0DF, 0xA0ED, 0x3C7A, + 0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89, 0xA1A1, 0xA1FE, 0x0060, + 0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0, + 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164, + 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225, + 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, 0xA840, 0xA87E, 0x26B3, + 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C, 0xA8C5, 0xA8EA, 0x02BC, + 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720, 0xA95C, 0xA95C, 0x2722, + 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742, 0xA996, 0xA996, 0x1E17, + 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99, 0xAA4D, 0xAA4D, 0x21B6, + 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6, 0xAA71, 0xAA71, 0x2235, + 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397, 0xAA74, 0xAA76, 0x3CC9, + 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC, 0xAA7A, 0xAA7A, 0x223F, + 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE, 0xAA80, 0xAA99, 0x3CD1, + 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB, 0xAA9C, 0xAA9C, 0x2396, + 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC, 0xAA9F, 0xAA9F, 0x20A2, + 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E, 0xAB40, 0xAB40, 0x1F64, + 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B, 0xAB44, 0xAB44, 0x3CF0, + 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139, 0xAB47, 0xAB47, 0x3CF1, + 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1, 0xAB4A, 0xAB4A, 0x239A, + 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399, 0xAB4E, 0xAB7E, 0x3CF4, + 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C, 0xAC40, 0xAC45, 0x3D46, + 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C, 0xAC71, 0xAC71, 0x2460, + 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C, 0xAC7D, 0xAC7E, 0x3D80, + 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D, 0xAC8E, 0xAC92, 0x3D8F, + 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A, 0xAC95, 0xACA0, 0x3D94, + 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461, 0xAD4A, 0xAD5D, 0x3DA9, + 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD, 0xAD61, 0xAD61, 0x2462, + 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54, 0xAD69, 0xAD73, 0x3DC5, + 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0, 0xAD80, 0xAD81, 0x3DDA, + 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC, 0xAD87, 0xAD87, 0x245D, + 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463, 0xAD8C, 0xAD90, 0x3DE3, + 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8, 0xAE40, 0xAE53, 0x3DF7, + 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B, 0xAE62, 0xAE62, 0x1E70, + 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F, 0xAE81, 0xAE84, 0x3E34, + 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38, 0xAE8B, 0xAE8B, 0x1F4E, + 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1, 0xAE95, 0xAE9F, 0x3E45, + 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50, 0xAF64, 0xAF64, 0x1FC6, + 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE, 0xAF7C, 0xAF7E, 0x3E8A, + 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01, 0xAF83, 0xAF83, 0x2200, + 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2, 0xAF8F, 0xAF8F, 0x1E97, + 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB, 0xAF92, 0xAF9B, 0x3E9A, + 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4, 0xAF9F, 0xAF9F, 0x2028, + 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7, 0xB041, 0xB042, 0x25AF, + 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1, 0xB045, 0xB04E, 0x3EA9, + 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3, 0xB054, 0xB054, 0x1E4E, + 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202, 0xB058, 0xB058, 0x25AB, + 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9, 0xB05B, 0xB05B, 0x25AD, + 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6, 0xB05E, 0xB05E, 0x3EBB, + 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4, 0xB062, 0xB062, 0x222F, + 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7, 0xB065, 0xB06B, 0x3EBC, + 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3, 0xB07D, 0xB07D, 0x1E25, + 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4, 0xB097, 0xB097, 0x25C0, + 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A, 0xB09A, 0xB0A0, 0x3EEC, + 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3, 0xB14B, 0xB14B, 0x226E, + 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD, 0xB14E, 0xB14E, 0x3EFF, + 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2, 0xB151, 0xB151, 0x3F00, + 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01, 0xB180, 0xB196, 0x3F2D, + 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44, 0xB1A1, 0xB1FE, 0x040A, + 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF, 0xB242, 0xB266, 0x3F4E, + 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73, 0xB26D, 0xB26D, 0x2074, + 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687, 0xB275, 0xB27E, 0x3F7E, + 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88, 0xB289, 0xB289, 0x268D, + 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0, 0xB29B, 0xB2A0, 0x3FA0, + 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6, 0xB343, 0xB343, 0x1FAB, + 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8, 0xB371, 0xB37E, 0x3FD5, + 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9, 0xB389, 0xB38B, 0x3FEB, + 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE, 0xB38E, 0xB38E, 0x21FA, + 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6, 0xB440, 0xB453, 0x4001, + 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015, 0xB458, 0xB458, 0x24E4, + 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6, 0xB45F, 0xB45F, 0x20F7, + 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B, 0xB462, 0xB474, 0x401E, + 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031, 0xB47E, 0xB47E, 0x24EC, + 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB, 0xB484, 0xB488, 0x403C, + 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041, 0xB493, 0xB493, 0x24EA, + 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524, 0xB540, 0xB540, 0x4057, + 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058, 0xB54B, 0xB54B, 0x1E27, + 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6, 0xB557, 0xB559, 0x406B, + 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012, 0xB55C, 0xB55C, 0x1EEC, + 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8, 0xB562, 0xB57E, 0x4072, + 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66, 0xB59D, 0xB59D, 0x24DC, + 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582, 0xB640, 0xB651, 0x40AE, + 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0, 0xB655, 0xB655, 0x24DD, + 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E, 0xB65A, 0xB65A, 0x40C5, + 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8, 0xB65D, 0xB67E, 0x40C6, + 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0, 0xB740, 0xB74D, 0x4109, + 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117, 0xB751, 0xB751, 0x1E80, + 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677, 0xB75A, 0xB763, 0x4120, + 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69, 0xB766, 0xB766, 0x222B, + 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F, 0xB778, 0xB778, 0x1F5B, + 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B, 0xB781, 0xB781, 0x4140, + 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141, 0xB7A1, 0xB7FE, 0x063E, + 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0, 0xB844, 0xB844, 0x2186, + 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED, 0xB847, 0xB84C, 0x4163, + 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169, 0xB851, 0xB851, 0x1FEA, + 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4, 0xB85B, 0xB85B, 0x20E1, + 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8, 0xB85E, 0xB85E, 0x2260, + 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2, 0xB861, 0xB876, 0x4176, + 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C, 0xB880, 0xB881, 0x4193, + 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195, 0xB8A1, 0xB8FE, 0x069C, + 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41, 0xB951, 0xB960, 0x41C3, + 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3, 0xB97B, 0xB97B, 0x1F86, + 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF, 0xB99D, 0xB99D, 0x1FB3, + 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF, 0xB9A1, 0xB9FE, 0x06FA, + 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4, 0xBA43, 0xBA43, 0x4210, + 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211, 0xBA56, 0xBA56, 0x25E3, + 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111, 0xBA5A, 0xBA5F, 0x4224, + 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A, 0xBA6A, 0xBA6A, 0x25E7, + 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041, 0xBA75, 0xBA7E, 0x423C, + 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA, 0xBA85, 0xBA85, 0x424A, + 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B, 0xBA88, 0xBA88, 0x25EC, + 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB, 0xBA8E, 0xBA9D, 0x4250, + 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D, 0xBAA0, 0xBAA0, 0x4260, + 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7, 0xBB41, 0xBB48, 0x4261, + 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269, 0xBB58, 0xBB58, 0x25E9, + 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE, 0xBB5C, 0xBB5C, 0x203A, + 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693, 0xBB61, 0xBB64, 0x427C, + 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED, 0xBB67, 0xBB67, 0x4280, + 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281, 0xBB6A, 0xBB6A, 0x2065, + 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3, 0xBB6F, 0xBB7E, 0x4285, + 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6, 0xBC40, 0xBC51, 0x42B6, + 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC, 0xBC54, 0xBC59, 0x42C8, + 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE, 0xBC61, 0xBC61, 0x269B, + 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3, 0xBC64, 0xBC64, 0x42D5, + 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6, 0xBC67, 0xBC67, 0x25F4, + 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B, 0xBC6A, 0xBC6C, 0x42D8, + 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB, 0xBC6F, 0xBC6F, 0x1F7B, + 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D, 0xBC72, 0xBC72, 0x42DD, + 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48, 0xBC75, 0xBC75, 0x241C, + 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF, 0xBC79, 0xBC79, 0x219A, + 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091, 0xBC7C, 0xBC7D, 0x42DF, + 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1, 0xBC82, 0xBC82, 0x2423, + 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422, 0xBC85, 0xBC85, 0x42E3, + 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4, 0xBC88, 0xBC88, 0x228D, + 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8, 0xBC8B, 0xBC8B, 0x2421, + 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3, 0xBC90, 0xBC99, 0x42E8, + 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426, 0xBC9C, 0xBC9C, 0x2425, + 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2, 0xBCA1, 0xBCFE, 0x0814, + 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A, 0xBD43, 0xBD43, 0x2424, + 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428, 0xBD46, 0xBD47, 0x42F8, + 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429, 0xBD4A, 0xBD4A, 0x42FA, + 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB, 0xBD4D, 0xBD4D, 0x22BE, + 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31, 0xBD50, 0xBD56, 0x42FD, + 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304, 0xBD59, 0xBD59, 0x1FB5, + 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B, 0xBD67, 0xBD67, 0x1FAF, + 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068, 0xBD6B, 0xBD6B, 0x21E4, + 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21, 0xBD70, 0xBD70, 0x4316, + 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317, 0xBD79, 0xBD79, 0x217C, + 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D, 0xBD7C, 0xBD7D, 0x431E, + 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320, 0xBD81, 0xBD81, 0x1FD1, + 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33, 0xBD8A, 0xBD8A, 0x4328, + 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329, 0xBD8E, 0xBD8E, 0x242E, + 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430, 0xBD91, 0xBD91, 0x21DB, + 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158, 0xBD98, 0xBD9A, 0x4331, + 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334, 0xBDA1, 0xBDFE, 0x0872, + 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9, 0xBE44, 0xBE44, 0x433C, + 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D, 0xBE49, 0xBE49, 0x1E8E, + 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340, 0xBE51, 0xBE51, 0x21C5, + 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192, 0xBE54, 0xBE54, 0x4346, + 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19, 0xBE57, 0xBE57, 0x218C, + 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3, 0xBE5A, 0xBE5C, 0x4347, + 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438, 0xBE5F, 0xBE5F, 0x2432, + 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A, 0xBE62, 0xBE62, 0x1E9C, + 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085, 0xBE65, 0xBE68, 0x434B, + 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F, 0xBE6C, 0xBE6C, 0x243B, + 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7, 0xBE70, 0xBE70, 0x2433, + 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054, 0xBE77, 0xBE77, 0x21DE, + 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434, 0xBE7A, 0xBE7B, 0x4359, + 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89, 0xBE7E, 0xBE7E, 0x243C, + 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E, 0xBE84, 0xBE84, 0x1ED8, + 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF, 0xBE87, 0xBE87, 0x2445, + 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249, 0xBE8A, 0xBE8B, 0x4360, + 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362, 0xBE8E, 0xBE8E, 0x1E47, + 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363, 0xBE92, 0xBE92, 0x2086, + 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196, 0xBE96, 0xBE96, 0x4367, + 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F, 0xBE99, 0xBE99, 0x4368, + 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369, 0xBE9C, 0xBE9C, 0x2442, + 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E, 0xBEA0, 0xBEA0, 0x436C, + 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6, 0xBF41, 0xBF4C, 0x436D, + 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446, 0xBF4F, 0xBF4F, 0x244B, + 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379, 0xBF55, 0xBF55, 0x2427, + 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D, 0xBF60, 0xBF60, 0x1F0F, + 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447, 0xBF63, 0xBF63, 0x2449, + 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387, 0xBF68, 0xBF68, 0x21C2, + 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E, 0xBF6D, 0xBF6F, 0x438D, + 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390, 0xBF72, 0xBF72, 0x244A, + 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391, 0xBF76, 0xBF76, 0x22BB, + 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393, 0xBF79, 0xBF79, 0x2694, + 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6, 0xBF7C, 0xBF7C, 0x2051, + 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E, 0xBF80, 0xBF81, 0x4395, + 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D, 0xBF84, 0xBF88, 0x4397, + 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451, 0xBF8B, 0xBF94, 0x439C, + 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6, 0xBF97, 0xBF97, 0x2289, + 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7, 0xBF9D, 0xBF9D, 0x2454, + 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E, 0xC040, 0xC040, 0x20FB, + 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440, 0xC045, 0xC04A, 0x43B1, + 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61, 0xC04D, 0xC04D, 0x269D, + 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A, 0xC050, 0xC050, 0x2456, + 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458, 0xC053, 0xC054, 0x43B8, + 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA, 0xC05B, 0xC05B, 0x221A, + 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A, 0xC05F, 0xC05F, 0x244D, + 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1, 0xC069, 0xC069, 0x2453, + 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420, 0xC06C, 0xC06C, 0x43CA, + 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685, 0xC06F, 0xC06F, 0x43CB, + 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC, 0xC074, 0xC074, 0x2224, + 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF, 0xC077, 0xC077, 0x21BA, + 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A, 0xC07A, 0xC07B, 0x43D1, + 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3, 0xC080, 0xC09A, 0x43D5, + 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0, 0xC09D, 0xC09D, 0x269A, + 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C, 0xC140, 0xC14F, 0x43F4, + 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404, 0xC154, 0xC154, 0x1E2C, + 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062, 0xC160, 0xC160, 0x24F1, + 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2, 0xC163, 0xC174, 0x4412, + 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424, 0xC178, 0xC178, 0x2215, + 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C, 0xC195, 0xC195, 0x21AE, + 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA, 0xC240, 0xC24D, 0x444C, + 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A, 0xC265, 0xC265, 0x25C2, + 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1, 0xC268, 0xC27C, 0x4471, + 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486, 0xC280, 0xC283, 0x4487, + 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B, 0xC293, 0xC293, 0x2017, + 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125, 0xC296, 0xC296, 0x214D, + 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4, 0xC299, 0xC299, 0x209D, + 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A, 0xC29C, 0xC29C, 0x25C3, + 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179, 0xC2A1, 0xC2FE, 0x0A48, + 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E, 0xC343, 0xC343, 0x2155, + 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2, 0xC37C, 0xC37E, 0x44D7, + 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7, 0xC385, 0xC39A, 0x44DE, + 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4, 0xC3A1, 0xC3FE, 0x0AA6, + 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123, 0xC44A, 0xC44B, 0x4502, + 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504, 0xC454, 0xC454, 0x24C9, + 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094, 0xC459, 0xC45A, 0x450E, + 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510, 0xC463, 0xC463, 0x1E77, + 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06, 0xC478, 0xC479, 0x452A, + 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C, 0xC480, 0xC480, 0x4530, + 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531, 0xC491, 0xC491, 0x1EAD, + 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8, 0xC494, 0xC497, 0x4540, + 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544, 0xC49A, 0xC49A, 0x20C5, + 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA, 0xC49D, 0xC4A0, 0x4546, + 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A, 0xC544, 0xC544, 0x1FF0, + 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6, 0xC547, 0xC54A, 0x454F, + 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE, 0xC54D, 0xC551, 0x4553, + 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558, 0xC55F, 0xC55F, 0x2161, + 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B, 0xC564, 0xC564, 0x21D9, + 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9, 0xC567, 0xC57E, 0x4567, + 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61, 0xC594, 0xC59B, 0x4592, + 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A, 0xC59E, 0xC59E, 0x1F98, + 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62, 0xC640, 0xC640, 0x459D, + 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E, 0xC644, 0xC644, 0x1F88, + 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8, 0xC648, 0xC662, 0x45A2, + 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD, 0xC672, 0xC672, 0x2336, + 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7, 0xC6A1, 0xC6FE, 0x0BC0, + 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB, 0xC767, 0xC76E, 0x461E, + 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626, 0xC776, 0xC776, 0x1F7D, + 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333, 0xC77C, 0xC77E, 0x4630, + 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E, 0xC840, 0xC840, 0x4654, + 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655, 0xC84F, 0xC84F, 0x2334, + 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1, 0xC853, 0xC865, 0x4664, + 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677, 0xC86E, 0xC86E, 0x2349, + 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B, 0xC880, 0xC886, 0x468D, + 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694, 0xC892, 0xC892, 0x2347, + 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193, 0xC895, 0xC898, 0x469F, + 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3, 0xC89D, 0xC89D, 0x1F62, + 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C, 0xC940, 0xC94E, 0x46A9, + 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348, 0xC951, 0xC96D, 0x46B8, + 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5, 0xC970, 0xC970, 0x2345, + 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12, 0xC978, 0xC97E, 0x46DC, + 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018, 0xC990, 0xC990, 0x2335, + 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C, 0xC99D, 0xC9A0, 0x46FD, + 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701, 0xCA4E, 0xCA4E, 0x266F, + 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351, 0xCA57, 0xCA58, 0x4716, + 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718, 0xCA5C, 0xCA5C, 0x2338, + 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B, 0xCA62, 0xCA6D, 0x471E, + 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A, 0xCA72, 0xCA72, 0x234F, + 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D, 0xCA78, 0xCA7A, 0x4731, + 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331, 0xCA7D, 0xCA7D, 0x4734, + 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735, 0xCA81, 0xCA81, 0x233B, + 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350, 0xCA8A, 0xCA8D, 0x473D, + 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6, 0xCA90, 0xCA91, 0x4741, + 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743, 0xCA9A, 0xCA9A, 0x2355, + 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38, 0xCB40, 0xCB42, 0x4750, + 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753, 0xCB45, 0xCB45, 0x1F74, + 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330, 0xCB48, 0xCB4A, 0x4755, + 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758, 0xCB4E, 0xCB4E, 0x20DA, + 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A, 0xCB58, 0xCB5C, 0x4762, + 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767, 0xCB5F, 0xCB5F, 0x2107, + 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F, 0xCB6B, 0xCB7A, 0x4772, + 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343, 0xCB7D, 0xCB7E, 0x4782, + 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212, 0xCB88, 0xCB8D, 0x478B, + 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791, 0xCB92, 0xCB92, 0x2359, + 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254, 0xCB9D, 0xCB9D, 0x479D, + 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E, 0xCBA1, 0xCBFE, 0x0D96, + 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357, 0xCC42, 0xCC48, 0x47A0, + 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042, 0xCC4B, 0xCC4B, 0x2153, + 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB, 0xCC50, 0xCC5B, 0x47AA, + 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6, 0xCC60, 0xCC60, 0x2356, + 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337, 0xCC65, 0xCC6C, 0x47BC, + 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4, 0xCC79, 0xCC79, 0x2353, + 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061, 0xCC7E, 0xCC7E, 0x47D2, + 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95, 0xCC8F, 0xCC93, 0x47E1, + 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6, 0xCC96, 0xCC96, 0x1F42, + 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8, 0xCC9E, 0xCCA0, 0x47ED, + 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0, 0xCD80, 0xCD8F, 0x482F, + 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F, 0xCD98, 0xCD98, 0x25D7, + 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52, 0xCE40, 0xCE66, 0x484E, + 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875, 0xCE72, 0xCE72, 0x21B2, + 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B, 0xCE81, 0xCE81, 0x219E, + 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC, 0xCE88, 0xCE9A, 0x4891, + 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4, 0xCE9E, 0xCE9E, 0x2226, + 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0, 0xCF40, 0xCF4D, 0x48A8, + 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6, 0xCF55, 0xCF55, 0x227B, + 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE, 0xCF59, 0xCF5B, 0x48BE, + 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1, 0xCF6C, 0xCF6C, 0x25D5, + 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B, 0xCF74, 0xCF74, 0x48D6, + 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7, 0xCF78, 0xCF78, 0x1E89, + 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9, 0xCF7D, 0xCF7E, 0x48DC, + 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211, 0xCF82, 0xCF88, 0x48DF, + 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6, 0xCF8B, 0xCF92, 0x48E6, + 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF, 0xCF95, 0xCF9D, 0x48EE, + 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7, 0xCFA0, 0xCFA0, 0x25D8, + 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8, 0xD04D, 0xD04D, 0x1F29, + 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B, 0xD052, 0xD054, 0x4908, + 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B, 0xD05C, 0xD05C, 0x2297, + 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690, 0xD061, 0xD066, 0x4914, + 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A, 0xD06C, 0xD06C, 0x2198, + 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88, 0xD06F, 0xD07C, 0x491F, + 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D, 0xD080, 0xD0A0, 0x492E, + 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F, 0xD155, 0xD155, 0x25F1, + 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C, 0xD15A, 0xD160, 0x4967, + 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC, 0xD163, 0xD174, 0x496E, + 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980, 0xD17D, 0xD17D, 0x2676, + 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988, 0xD19D, 0xD19D, 0x1FE1, + 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5, 0xD1A1, 0xD1FE, 0x0FCA, + 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7, 0xD243, 0xD243, 0x22DD, + 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD, 0xD24E, 0xD25B, 0x49B2, + 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0, 0xD263, 0xD263, 0x25BC, + 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6, 0xD268, 0xD268, 0x25BF, + 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187, 0xD26E, 0xD26E, 0x49CD, + 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE, 0xD272, 0xD272, 0x1E7F, + 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD, 0xD276, 0xD27E, 0x49D2, + 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96, 0xD28B, 0xD28D, 0x49E5, + 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8, 0xD292, 0xD292, 0x2084, + 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136, 0xD296, 0xD296, 0x49ED, + 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE, 0xD2A0, 0xD2A0, 0x24BA, + 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6, 0xD344, 0xD344, 0x24BC, + 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4, 0xD349, 0xD349, 0x49FD, + 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE, 0xD34D, 0xD34D, 0x24BD, + 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE, 0xD351, 0xD354, 0x4A02, + 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06, 0xD358, 0xD358, 0x1FD2, + 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD, 0xD35C, 0xD35C, 0x4A0A, + 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D, 0xD35F, 0xD377, 0x4A0B, + 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24, 0xD37A, 0xD37A, 0x260A, + 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94, 0xD37D, 0xD37E, 0x4A26, + 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF, 0xD386, 0xD386, 0x1ECB, + 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D, 0xD38B, 0xD38B, 0x1F77, + 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB, 0xD38E, 0xD38E, 0x4A31, + 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32, 0xD391, 0xD391, 0x216F, + 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0, 0xD394, 0xD395, 0x4A34, + 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36, 0xD398, 0xD398, 0x22E2, + 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37, 0xD39B, 0xD39B, 0x1F78, + 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2, 0xD39F, 0xD39F, 0x4A3A, + 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086, 0xD440, 0xD440, 0x4A3B, + 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C, 0xD445, 0xD445, 0x1FD3, + 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5, 0xD448, 0xD44B, 0x4A40, + 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44, 0xD44F, 0xD44F, 0x211F, + 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD, 0xD454, 0xD455, 0x4A49, + 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B, 0xD458, 0xD458, 0x22E7, + 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282, 0xD45D, 0xD461, 0x4A4F, + 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54, 0xD467, 0xD467, 0x22E8, + 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4, 0xD46F, 0xD46F, 0x4A5E, + 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F, 0xD472, 0xD472, 0x22EB, + 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9, 0xD475, 0xD475, 0x20BD, + 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA, 0xD479, 0xD47A, 0x4A63, + 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65, 0xD47E, 0xD47E, 0x1E9E, + 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6, 0xD483, 0xD483, 0x21E7, + 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69, 0xD487, 0xD487, 0x2137, + 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C, 0xD48B, 0xD48B, 0x4A6D, + 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2, 0xD48E, 0xD48E, 0x1F37, + 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E, 0xD491, 0xD491, 0x22EF, + 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10, 0xD494, 0xD494, 0x21C8, + 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1, 0xD497, 0xD49B, 0x4A70, + 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75, 0xD49F, 0xD49F, 0x22EE, + 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4, 0xD540, 0xD542, 0x4A78, + 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E, 0xD545, 0xD545, 0x22EC, + 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B, 0xD54A, 0xD54A, 0x20FE, + 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9, 0xD550, 0xD550, 0x4A81, + 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82, 0xD554, 0xD554, 0x2236, + 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7, 0xD557, 0xD559, 0x4A85, + 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88, 0xD55C, 0xD55C, 0x1E82, + 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89, 0xD55F, 0xD55F, 0x21A4, + 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8, 0xD562, 0xD562, 0x2151, + 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60, 0xD565, 0xD567, 0x4A8B, + 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E, 0xD56C, 0xD56C, 0x2145, + 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC, 0xD56F, 0xD571, 0x4A92, + 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95, 0xD575, 0xD575, 0x1EF5, + 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218, 0xD579, 0xD57A, 0x4A99, + 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B, 0xD57E, 0xD57E, 0x2300, + 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4, 0xD582, 0xD583, 0x4A9E, + 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0, 0xD586, 0xD586, 0x22FD, + 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA, 0xD589, 0xD589, 0x4AA2, + 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3, 0xD58C, 0xD58C, 0x22FB, + 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC, 0xD58F, 0xD58F, 0x2027, + 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060, 0xD594, 0xD594, 0x22FF, + 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE, 0xD599, 0xD599, 0x1EC7, + 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C, 0xD59C, 0xD59E, 0x4AAC, + 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF, 0xD5A1, 0xD5FE, 0x1142, + 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0, 0xD642, 0xD642, 0x230A, + 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1, 0xD647, 0xD647, 0x2303, + 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307, 0xD64A, 0xD64A, 0x230B, + 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F, 0xD64E, 0xD64E, 0x4AB7, + 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8, 0xD652, 0xD652, 0x2302, + 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D, 0xD655, 0xD655, 0x4ABA, + 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB, 0xD658, 0xD658, 0x2308, + 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC, 0xD65B, 0xD65B, 0x4ABD, + 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305, 0xD65E, 0xD65E, 0x2197, + 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171, 0xD661, 0xD661, 0x2298, + 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57, 0xD666, 0xD668, 0x4AC2, + 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5, 0xD66B, 0xD66B, 0x2311, + 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304, 0xD670, 0xD670, 0x4AC9, + 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35, 0xD673, 0xD673, 0x4ACA, + 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310, 0xD676, 0xD676, 0x1FA3, + 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6, 0xD679, 0xD67B, 0x4ACC, + 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF, 0xD680, 0xD682, 0x4AD1, + 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4, 0xD686, 0xD686, 0x2312, + 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313, 0xD689, 0xD68D, 0x4AD6, + 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB, 0xD694, 0xD694, 0x1FBA, + 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078, 0xD69A, 0xD6A0, 0x4AE4, + 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB, 0xD743, 0xD743, 0x2288, + 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316, 0xD749, 0xD749, 0x1F6B, + 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314, 0xD751, 0xD751, 0x4AF8, + 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315, 0xD754, 0xD754, 0x2168, + 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4, 0xD757, 0xD763, 0x4AFA, + 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07, 0xD767, 0xD767, 0x2219, + 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09, 0xD76C, 0xD76C, 0x20D5, + 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A, 0xD770, 0xD774, 0x4B0E, + 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13, 0xD778, 0xD778, 0x1ED3, + 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B, 0xD783, 0xD783, 0x1E49, + 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B, 0xD788, 0xD78A, 0x4B21, + 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8, 0xD78D, 0xD78D, 0x4B24, + 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319, 0xD790, 0xD794, 0x4B25, + 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A, 0xD797, 0xD797, 0x2317, + 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE, 0xD840, 0xD84C, 0x4B34, + 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41, 0xD853, 0xD853, 0x1EFD, + 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71, 0xD890, 0xD890, 0x1E3B, + 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81, 0xD893, 0xD893, 0x1F0C, + 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24, 0xD896, 0xD899, 0x4B82, + 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65, 0xD89C, 0xD89C, 0x1EF0, + 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30, 0xD89F, 0xD89F, 0x2261, + 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257, 0xD940, 0xD940, 0x4B87, + 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB, 0xD943, 0xD943, 0x4B88, + 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8, 0xD946, 0xD946, 0x1F39, + 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48, 0xD949, 0xD949, 0x2070, + 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A, 0xD94C, 0xD94C, 0x24AC, + 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176, 0xD94F, 0xD94F, 0x24AD, + 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B, 0xD952, 0xD952, 0x1F45, + 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B, 0xD955, 0xD955, 0x202F, + 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0, 0xD958, 0xD958, 0x4B8C, + 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F, 0xD95B, 0xD95B, 0x4B8D, + 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E, 0xD963, 0xD963, 0x24B2, + 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51, 0xD966, 0xD966, 0x4B94, + 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95, 0xD96C, 0xD96C, 0x24B3, + 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F, 0xD96F, 0xD96F, 0x4B9A, + 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B, 0xD972, 0xD972, 0x20B4, + 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB, 0xD975, 0xD975, 0x2072, + 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C, 0xD978, 0xD978, 0x1F0A, + 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D, 0xD97C, 0xD97C, 0x2291, + 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278, 0xD980, 0xD980, 0x1ED4, + 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3, 0xD988, 0xD98C, 0x4BA5, + 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7, 0xD98F, 0xD98F, 0x1F28, + 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7, 0xD992, 0xD996, 0x4BAA, + 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1, 0xD999, 0xD99A, 0x4BAF, + 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1, 0xD99D, 0xD99D, 0x225B, + 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2, 0xD9A0, 0xD9A0, 0x2115, + 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3, 0xDA41, 0xDA41, 0x222A, + 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4, 0xDA48, 0xDA48, 0x213D, + 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15, 0xDA4E, 0xDA4E, 0x225C, + 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14, 0xDA74, 0xDA76, 0x4BE1, + 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4, 0xDA80, 0xDA84, 0x4BEB, + 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0, 0xDA8E, 0xDA8E, 0x25F8, + 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313, 0xDB40, 0xDB5F, 0x4C0A, + 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A, 0xDB78, 0xDB78, 0x2230, + 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47, 0xDB84, 0xDB84, 0x25FD, + 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600, 0xDB8C, 0xDB97, 0x4C51, + 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D, 0xDBA1, 0xDBFE, 0x1371, + 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF, 0xDC46, 0xDC4E, 0x4C6A, + 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C, 0xDC51, 0xDC51, 0x2602, + 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D, 0xDC54, 0xDC54, 0x4C74, + 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE, 0xDC57, 0xDC57, 0x2603, + 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601, 0xDC5E, 0xDC61, 0x4C7A, + 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E, 0xDC66, 0xDC66, 0x1EA3, + 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81, 0xDC6B, 0xDC6B, 0x2607, + 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0, 0xDC7D, 0xDC7E, 0x4C94, + 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B, 0xDC88, 0xDC88, 0x2267, + 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6, 0xDC8B, 0xDC8D, 0x4C9D, + 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0, 0xDC90, 0xDC90, 0x248C, + 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D, 0xDC98, 0xDC9A, 0x4CA7, + 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA, 0xDCA0, 0xDCA0, 0x2494, + 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE, 0xDD46, 0xDD46, 0x2493, + 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E, 0xDD4E, 0xDD52, 0x4CBA, + 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491, 0xDD55, 0xDD55, 0x2496, + 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492, 0xDD58, 0xDD58, 0x4CBF, + 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0, 0xDD5E, 0xDD5E, 0x1FB1, + 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A, 0xDD61, 0xDD61, 0x4CC5, + 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6, 0xDD64, 0xDD64, 0x2258, + 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7, 0xDD6D, 0xDD6D, 0x249B, + 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09, 0xDD70, 0xDD70, 0x20E6, + 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026, 0xDD77, 0xDD77, 0x249F, + 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D, 0xDD7B, 0xDD7E, 0x4CD4, + 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B, 0xDD82, 0xDD82, 0x249C, + 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A, 0xDD86, 0xDD86, 0x205B, + 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70, 0xDD8C, 0xDD8E, 0x4CDF, + 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2, 0xDD94, 0xDD94, 0x213B, + 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07, 0xDD98, 0xDD99, 0x4CE8, + 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237, 0xDD9C, 0xDD9D, 0x4CEA, + 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC, 0xDDA0, 0xDDA0, 0x21B3, + 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245, 0xDE41, 0xDE41, 0x24A1, + 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8, 0xDE45, 0xDE47, 0x4CEF, + 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0, 0xDE4A, 0xDE4E, 0x4CF2, + 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7, 0xDE5A, 0xDE5A, 0x1F46, + 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380, 0xDE5D, 0xDE5D, 0x2495, + 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490, 0xDE60, 0xDE6A, 0x4D03, + 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E, 0xDE6F, 0xDE6F, 0x1E9D, + 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A, 0xDE72, 0xDE72, 0x20AA, + 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D, 0xDE92, 0xDE92, 0x267B, + 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2, 0xDEA0, 0xDEA0, 0x4D3B, + 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E, 0xDF41, 0xDF41, 0x4D3C, + 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D, 0xDF4D, 0xDF4D, 0x1FBB, + 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253, 0xDF5D, 0xDF5D, 0x4D55, + 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6, 0xDF60, 0xDF60, 0x218E, + 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC, 0xDF65, 0xDF65, 0x4D59, + 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A, 0xDF68, 0xDF68, 0x224A, + 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133, 0xDF6E, 0xDF73, 0x4D5F, + 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65, 0xDF77, 0xDF77, 0x20CF, + 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67, 0xDF7A, 0xDF7A, 0x220F, + 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029, 0xDF7D, 0xDF7D, 0x4D69, + 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55, 0xDF81, 0xDF82, 0x4D6A, + 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C, 0xDF85, 0xDF85, 0x1E46, + 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063, 0xDF8A, 0xDF8A, 0x23F3, + 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9, 0xE040, 0xE04F, 0x4D86, + 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96, 0xE05D, 0xE05D, 0x2233, + 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320, 0xE06A, 0xE06B, 0x4DAD, + 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF, 0xE075, 0xE075, 0x22BC, + 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C, 0xE078, 0xE078, 0x4DB8, + 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9, 0xE080, 0xE086, 0x4DBE, + 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5, 0xE08D, 0xE08D, 0x2287, + 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D, 0xE090, 0xE090, 0x1EAB, + 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D, 0xE093, 0xE093, 0x4DCC, + 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD, 0xE097, 0xE097, 0x231B, + 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547, 0xE140, 0xE141, 0x4DD8, + 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA, 0xE164, 0xE164, 0x2255, + 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F, 0xE169, 0xE173, 0x4DFE, + 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4, 0xE176, 0xE17E, 0x4E09, + 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B, 0xE185, 0xE185, 0x21D8, + 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA, 0xE188, 0xE188, 0x4E17, + 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18, 0xE18C, 0xE18C, 0x2134, + 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3, 0xE191, 0xE191, 0x24F8, + 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7, 0xE194, 0xE194, 0x1EC8, + 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C, 0xE198, 0xE198, 0x2280, + 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5, 0xE19F, 0xE19F, 0x24FB, + 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5, 0xE240, 0xE240, 0x4E24, + 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25, 0xE243, 0xE243, 0x1EED, + 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD, 0xE250, 0xE250, 0x4E31, + 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32, 0xE253, 0xE253, 0x24FE, + 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33, 0xE25A, 0xE25A, 0x2508, + 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38, 0xE25E, 0xE25E, 0x2506, + 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF, 0xE263, 0xE263, 0x2090, + 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD, 0xE268, 0xE268, 0x1F25, + 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503, 0xE26B, 0xE26B, 0x2502, + 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A, 0xE26F, 0xE26F, 0x20A6, + 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5, 0xE279, 0xE27C, 0x4E4B, + 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F, 0xE280, 0xE280, 0x2507, + 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505, 0xE283, 0xE288, 0x4E50, + 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56, 0xE28B, 0xE28B, 0x2515, + 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C, 0xE28F, 0xE28F, 0x2031, + 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B, 0xE293, 0xE293, 0x250F, + 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509, 0xE296, 0xE297, 0x4E5B, + 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234, 0xE29A, 0xE29A, 0x2513, + 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D, 0xE2A0, 0xE2A0, 0x2501, + 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61, 0xE342, 0xE342, 0x2517, + 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63, 0xE347, 0xE347, 0x2518, + 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56, 0xE34C, 0xE34E, 0x4E69, + 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C, 0xE351, 0xE351, 0x20D3, + 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A, 0xE355, 0xE355, 0x20CE, + 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510, 0xE359, 0xE35B, 0x4E71, + 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74, 0xE360, 0xE360, 0x250A, + 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511, 0xE368, 0xE370, 0x4E7C, + 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85, 0xE373, 0xE373, 0x251E, + 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86, 0xE378, 0xE378, 0x252D, + 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89, 0xE37C, 0xE37C, 0x2532, + 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B, 0xE380, 0xE389, 0x4E8C, + 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96, 0xE38C, 0xE38C, 0x252C, + 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528, 0xE390, 0xE390, 0x4E99, + 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A, 0xE393, 0xE393, 0x252F, + 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC, 0xE396, 0xE398, 0x4E9C, + 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F, 0xE39C, 0xE39C, 0x2535, + 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D, 0xE39F, 0xE39F, 0x2526, + 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661, 0xE440, 0xE440, 0x2534, + 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F, 0xE443, 0xE443, 0x2531, + 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3, 0xE448, 0xE448, 0x2525, + 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD, 0xE44F, 0xE44F, 0x4EAB, + 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC, 0xE452, 0xE452, 0x2172, + 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD, 0xE458, 0xE458, 0x204F, + 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543, 0xE45B, 0xE45B, 0x4EB2, + 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3, 0xE45E, 0xE45E, 0x1E3C, + 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529, 0xE463, 0xE464, 0x4EB7, + 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9, 0xE468, 0xE468, 0x1EFF, + 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F, 0xE474, 0xE474, 0x4EC5, + 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6, 0xE479, 0xE479, 0x2523, + 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A, 0xE47C, 0xE47C, 0x2545, + 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D, 0xE480, 0xE480, 0x4ECA, + 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB, 0xE484, 0xE484, 0x2103, + 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C, 0xE487, 0xE487, 0x253B, + 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD, 0xE48D, 0xE48D, 0x2540, + 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD, 0xE490, 0xE492, 0x4ED2, + 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5, 0xE498, 0xE498, 0x254B, + 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547, 0xE49E, 0xE49F, 0x254F, + 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF, 0xE540, 0xE545, 0x4EDE, + 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4, 0xE548, 0xE548, 0x2546, + 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C, 0xE54C, 0xE54D, 0x4EE7, + 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552, 0xE550, 0xE550, 0x2530, + 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9, 0xE555, 0xE555, 0x2551, + 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC, 0xE558, 0xE558, 0x20D2, + 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8, 0xE55D, 0xE55D, 0x4EF0, + 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1, 0xE561, 0xE561, 0x21AB, + 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D, 0xE565, 0xE565, 0x1EA5, + 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C, 0xE569, 0xE569, 0x2080, + 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D, 0xE56D, 0xE56D, 0x4EF9, + 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA, 0xE575, 0xE575, 0x254A, + 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00, 0xE578, 0xE578, 0x254E, + 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC, 0xE57C, 0xE57C, 0x2554, + 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05, 0xE581, 0xE581, 0x1F3C, + 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5, 0xE584, 0xE589, 0x4F07, + 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D, 0xE58E, 0xE58E, 0x2268, + 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6, 0xE592, 0xE599, 0x4F12, + 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553, 0xE59C, 0xE59E, 0x4F1A, + 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D, 0xE5A1, 0xE5FE, 0x171D, + 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E, 0xE644, 0xE644, 0x2559, + 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97, 0xE64A, 0xE64A, 0x2555, + 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D, 0xE64F, 0xE651, 0x4F28, + 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B, 0xE656, 0xE656, 0x207C, + 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A, 0xE659, 0xE65A, 0x4F2F, + 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31, 0xE65E, 0xE65E, 0x1E34, + 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E, 0xE66A, 0xE66A, 0x4F3D, + 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E, 0xE675, 0xE675, 0x21A2, + 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47, 0xE679, 0xE679, 0x2563, + 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49, 0xE67C, 0xE67C, 0x252E, + 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A, 0xE680, 0xE680, 0x1F1B, + 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283, 0xE683, 0xE683, 0x4F4C, + 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D, 0xE687, 0xE687, 0x20A0, + 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565, 0xE68A, 0xE68B, 0x4F50, + 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52, 0xE693, 0xE693, 0x2562, + 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C, 0xE698, 0xE69A, 0x4F5B, + 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020, 0xE69D, 0xE69E, 0x4F5E, + 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A, 0xE6A1, 0xE6FE, 0x177B, + 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E, 0xE744, 0xE747, 0x4F63, + 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C, 0xE74A, 0xE74C, 0x4F67, + 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B, 0xE750, 0xE750, 0x1E6F, + 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4, 0xE753, 0xE753, 0x2567, + 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B, 0xE756, 0xE758, 0x4F6C, + 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F, 0xE766, 0xE766, 0x252B, + 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571, 0xE769, 0xE769, 0x4F7C, + 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D, 0xE774, 0xE774, 0x2522, + 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533, 0xE77D, 0xE77E, 0x4F8D, + 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A, 0xE783, 0xE783, 0x4F91, + 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573, 0xE786, 0xE786, 0x256F, + 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293, 0xE78B, 0xE78B, 0x2578, + 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570, 0xE790, 0xE791, 0x4F98, + 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A, 0xE798, 0xE799, 0x2541, + 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F, 0xE7A0, 0xE7A0, 0x201A, + 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4, 0xE843, 0xE843, 0x257A, + 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7, 0xE846, 0xE846, 0x2177, + 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B, 0xE84A, 0xE84A, 0x4FAA, + 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB, 0xE84F, 0xE84F, 0x257B, + 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3, 0xE855, 0xE859, 0x4FB2, + 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7, 0xE85C, 0xE85C, 0x2566, + 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93, 0xE863, 0xE863, 0x4FBD, + 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE, 0xE870, 0xE870, 0x2514, + 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D, 0xE874, 0xE874, 0x4FCB, + 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC, 0xE87C, 0xE87C, 0x2574, + 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E, 0xE881, 0xE881, 0x4FD4, + 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5, 0xE887, 0xE887, 0x209F, + 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576, 0xE88A, 0xE88B, 0x4FDA, + 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF, 0xE88E, 0xE88E, 0x261C, + 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC, 0xE8A1, 0xE8FE, 0x1837, + 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75, 0xE94D, 0xE953, 0x4FF9, + 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000, 0xE956, 0xE956, 0x23BF, + 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001, 0xE95A, 0xE95A, 0x23C0, + 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45, 0xE95E, 0xE95E, 0x5005, + 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4, 0xE961, 0xE961, 0x5006, + 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104, 0xE964, 0xE964, 0x5007, + 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008, 0xE967, 0xE967, 0x1F87, + 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009, 0xE96C, 0xE96C, 0x2269, + 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43, 0xE976, 0xE976, 0x5014, + 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679, 0xE979, 0xE979, 0x1EEB, + 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35, 0xE97D, 0xE97D, 0x208A, + 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7, 0xE981, 0xE981, 0x23C9, + 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018, 0xE987, 0xE987, 0x224F, + 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB, 0xE98C, 0xE98D, 0x501F, + 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021, 0xE990, 0xE990, 0x21F7, + 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE, 0xE993, 0xE993, 0x23CA, + 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022, 0xE998, 0xE998, 0x23D0, + 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C, 0xE99C, 0xE99C, 0x5027, + 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028, 0xE99F, 0xE99F, 0x1FEE, + 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895, 0xEA40, 0xEA40, 0x1FF8, + 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3, 0xEA45, 0xEA47, 0x502C, + 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4, 0xEA4A, 0xEA4A, 0x1E98, + 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C, 0xEA51, 0xEA51, 0x5034, + 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035, 0xEA55, 0xEA55, 0x1E71, + 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037, 0xEA59, 0xEA59, 0x23C5, + 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A, 0xEA81, 0xEA83, 0x505E, + 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061, 0xEA87, 0xEA87, 0x2284, + 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C, 0xEA8F, 0xEA8F, 0x5069, + 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D, 0xEA92, 0xEA95, 0x506A, + 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E, 0xEAA0, 0xEAA0, 0x1ED9, + 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077, 0xEB41, 0xEB41, 0x1FB2, + 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252, 0xEB46, 0xEB47, 0x507B, + 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D, 0xEB53, 0xEB53, 0x2157, + 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF, 0xEB56, 0xEB5A, 0x5088, + 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D, 0xEB5D, 0xEB5D, 0x203D, + 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015, 0xEB61, 0xEB61, 0x5090, + 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091, 0xEB6D, 0xEB6D, 0x2156, + 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144, 0xEB71, 0xEB71, 0x509D, + 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257, 0xEB74, 0xEB77, 0x509E, + 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092, 0xEB7A, 0xEB7E, 0x50A2, + 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250, 0xEB86, 0xEB89, 0x50AC, + 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0, 0xEBA1, 0xEBFE, 0x1951, + 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8, 0xEC47, 0xEC55, 0x50CC, + 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB, 0xEC5A, 0xEC5A, 0x260C, + 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E, 0xEC5D, 0xEC5F, 0x50DF, + 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2, 0xEC6E, 0xEC6E, 0x260B, + 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3, 0xEC77, 0xEC7E, 0x50F6, + 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23, 0xEC97, 0xECA0, 0x5114, + 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E, 0xED46, 0xED46, 0x2695, + 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E, 0xED59, 0xED5D, 0x5135, + 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A, 0xED61, 0xED61, 0x2692, + 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F, 0xED65, 0xED65, 0x513E, + 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD, 0xED68, 0xED6D, 0x513F, + 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145, 0xED74, 0xED74, 0x2465, + 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467, 0xED78, 0xED78, 0x514C, + 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D, 0xED80, 0xED90, 0x5152, + 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163, 0xED93, 0xED93, 0x2209, + 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9, 0xED96, 0xED96, 0x5164, + 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146, 0xED99, 0xED99, 0x25C5, + 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165, 0xED9C, 0xED9C, 0x245E, + 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F, 0xED9F, 0xED9F, 0x5167, + 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D, 0xEE40, 0xEE40, 0x25C7, + 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A, 0xEE43, 0xEE43, 0x1E2F, + 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168, 0xEE48, 0xEE48, 0x20BF, + 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B, 0xEE4D, 0xEE4D, 0x25C9, + 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8, 0xEE53, 0xEE54, 0x5172, + 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174, 0xEE57, 0xEE57, 0x25CB, + 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D, 0xEE5F, 0xEE60, 0x517B, + 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D, 0xEE68, 0xEE68, 0x25CC, + 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183, 0xEE6C, 0xEE6C, 0x20B9, + 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181, 0xEE6F, 0xEE76, 0x5186, + 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E, 0xEE7D, 0xEE7D, 0x2173, + 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD, 0xEE81, 0xEE84, 0x5193, + 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6, 0xEE87, 0xEE89, 0x5197, + 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1, 0xEE8C, 0xEE8C, 0x519A, + 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B, 0xEE90, 0xEE90, 0x2008, + 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0, 0xEE95, 0xEE96, 0x51A0, + 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2, 0xEE99, 0xEE99, 0x1F2A, + 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72, 0xEE9E, 0xEE9E, 0x25D3, + 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B, 0xEF40, 0xEF40, 0x21BE, + 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044, 0xEF43, 0xEF43, 0x51A8, + 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3, 0xEF46, 0xEF4B, 0x51A9, + 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF, 0xEF52, 0xEF53, 0x24CC, + 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698, 0xEF56, 0xEF56, 0x51B5, + 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6, 0xEF5A, 0xEF5A, 0x24CE, + 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF, 0xEF61, 0xEF67, 0x51BD, + 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4, 0xEF6A, 0xEF6A, 0x24D0, + 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1, 0xEF6D, 0xEF76, 0x51C6, + 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0, 0xEF7A, 0xEF7A, 0x239B, + 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E, 0xEF7D, 0xEF7E, 0x51D3, + 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D, 0xEF83, 0xEF84, 0x239F, + 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1, 0xEF87, 0xEF87, 0x51D8, + 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9, 0xEF8B, 0xEF8B, 0x221E, + 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2, 0xEF8E, 0xEF94, 0x51DC, + 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36, 0xEF97, 0xEF97, 0x2135, + 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD, 0xEF9D, 0xEF9D, 0x51E7, + 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8, 0xEFA1, 0xEFFE, 0x1AC9, + 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3, 0xF042, 0xF042, 0x2203, + 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7, 0xF045, 0xF046, 0x51EC, + 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097, 0xF049, 0xF049, 0x1EE4, + 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238, 0xF04F, 0xF050, 0x51F2, + 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4, 0xF054, 0xF054, 0x1F9A, + 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3, 0xF058, 0xF05D, 0x51F8, + 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE, 0xF068, 0xF068, 0x239C, + 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6, 0xF06D, 0xF070, 0x520A, + 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E, 0xF073, 0xF073, 0x2035, + 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F, 0xF078, 0xF078, 0x23A8, + 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075, 0xF07B, 0xF07C, 0x5213, + 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB, 0xF081, 0xF081, 0x1FEB, + 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215, 0xF087, 0xF087, 0x1F6A, + 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219, 0xF08B, 0xF08B, 0x2666, + 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667, 0xF091, 0xF091, 0x521F, + 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220, 0xF096, 0xF096, 0x23AD, + 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27, 0xF140, 0xF151, 0x522D, + 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242, 0xF154, 0xF154, 0x1F02, + 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183, 0xF158, 0xF158, 0x5241, + 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9, 0xF15B, 0xF166, 0x5242, + 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E, 0xF176, 0xF176, 0x22A5, + 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA, 0xF179, 0xF179, 0x525C, + 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82, 0xF17C, 0xF17D, 0x525D, + 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404, 0xF181, 0xF181, 0x525F, + 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260, 0xF184, 0xF184, 0x2184, + 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403, 0xF187, 0xF187, 0x5262, + 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B, 0xF18A, 0xF193, 0x5263, + 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D, 0xF198, 0xF198, 0x2067, + 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85, 0xF240, 0xF244, 0x5278, + 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D, 0xF247, 0xF247, 0x1E83, + 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F, 0xF24C, 0xF252, 0x5281, + 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7, 0xF255, 0xF255, 0x240D, + 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412, 0xF25D, 0xF25E, 0x528E, + 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290, 0xF271, 0xF271, 0x23F0, + 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411, 0xF274, 0xF274, 0x2414, + 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170, 0xF277, 0xF27B, 0x52A3, + 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C, 0xF27E, 0xF27E, 0x2415, + 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066, 0xF286, 0xF286, 0x52AD, + 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413, 0xF289, 0xF289, 0x2410, + 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1, 0xF28D, 0xF290, 0x52AE, + 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2, 0xF294, 0xF294, 0x2409, + 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418, 0xF297, 0xF29B, 0x52B5, + 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA, 0xF29E, 0xF29E, 0x21FC, + 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3, 0xF340, 0xF340, 0x1FC1, + 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD, 0xF345, 0xF345, 0x229C, + 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E, 0xF349, 0xF349, 0x52C2, + 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419, 0xF34C, 0xF34F, 0x52C3, + 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7, 0xF361, 0xF361, 0x1E29, + 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661, 0xF375, 0xF375, 0x52E9, + 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174, 0xF378, 0xF378, 0x2663, + 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA, 0xF380, 0xF38B, 0x52EF, + 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB, 0xF3A0, 0xF3A0, 0x214C, + 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E, 0xF445, 0xF445, 0x267A, + 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0, 0xF451, 0xF456, 0x531D, + 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323, 0xF459, 0xF459, 0x1ED0, + 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096, 0xF45C, 0xF45C, 0x5325, + 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326, 0xF462, 0xF462, 0x23C8, + 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E, 0xF465, 0xF474, 0x532B, + 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B, 0xF47C, 0xF47C, 0x2664, + 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239, 0xF480, 0xF493, 0x5342, + 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356, 0xF499, 0xF499, 0x261F, + 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E, 0xF49D, 0xF4A0, 0x535C, + 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360, 0xF545, 0xF545, 0x2620, + 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621, 0xF548, 0xF551, 0x5366, + 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370, 0xF554, 0xF554, 0x2627, + 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625, 0xF557, 0xF55D, 0x5371, + 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378, 0xF561, 0xF561, 0x262E, + 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A, 0xF56E, 0xF56E, 0x262A, + 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385, 0xF571, 0xF571, 0x2628, + 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386, 0xF580, 0xF584, 0x5392, + 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630, 0xF587, 0xF58B, 0x5397, + 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C, 0xF58E, 0xF58E, 0x200D, + 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D, 0xF599, 0xF599, 0x2645, + 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A, 0xF59C, 0xF59F, 0x53A7, + 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD, 0xF640, 0xF640, 0x53AB, + 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC, 0xF645, 0xF645, 0x263D, + 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF, 0xF648, 0xF648, 0x263E, + 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F, 0xF64C, 0xF64C, 0x1FC0, + 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B, 0xF650, 0xF653, 0x53B3, + 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7, 0xF658, 0xF658, 0x2644, + 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639, 0xF662, 0xF662, 0x53C2, + 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3, 0xF66C, 0xF66C, 0x2647, + 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB, 0xF671, 0xF671, 0x2649, + 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648, 0xF675, 0xF675, 0x53D0, + 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108, 0xF678, 0xF67E, 0x53D1, + 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D, 0xF686, 0xF687, 0x53DD, + 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF, 0xF68A, 0xF68A, 0x2651, + 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650, 0xF68E, 0xF68E, 0x2652, + 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F, 0xF693, 0xF695, 0x53E5, + 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E, 0xF698, 0xF698, 0x2653, + 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657, 0xF69B, 0xF69B, 0x53E9, + 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA, 0xF69E, 0xF69E, 0x2633, + 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656, 0xF6A1, 0xF6FE, 0x1D5B, + 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654, 0xF743, 0xF748, 0x53EE, + 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4, 0xF74C, 0xF74C, 0x2655, + 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6, 0xF756, 0xF756, 0x265B, + 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A, 0xF759, 0xF759, 0x53FF, + 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E, 0xF75C, 0xF75C, 0x262F, + 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646, 0xF762, 0xF762, 0x5404, + 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405, 0xF76B, 0xF76B, 0x265C, + 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C, 0xF772, 0xF77B, 0x5411, + 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B, 0xF77E, 0xF77E, 0x2631, + 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9, 0xF840, 0xF841, 0x543D, + 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F, 0xF846, 0xF846, 0x2580, + 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC, 0xF84A, 0xF84F, 0x5444, + 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B, 0xF852, 0xF852, 0x544A, + 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B, 0xF863, 0xF863, 0x2583, + 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A, 0xF866, 0xF866, 0x21EE, + 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182, 0xF873, 0xF877, 0x5466, + 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B, 0xF87A, 0xF87A, 0x2587, + 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588, 0xF87D, 0xF87E, 0x546D, + 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584, 0xF882, 0xF883, 0x5470, + 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472, 0xF886, 0xF886, 0x21EF, + 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A, 0xF88E, 0xF88E, 0x258C, + 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47, 0xF89A, 0xF89C, 0x5483, + 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486, 0xF8A0, 0xF8A0, 0x258D, + 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0, 0xF94F, 0xF94F, 0x2592, + 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496, 0xF959, 0xF959, 0x2594, + 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E, 0xF95D, 0xF95D, 0x2591, + 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0, 0xF967, 0xF967, 0x2597, + 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6, 0xF96A, 0xF96B, 0x54A9, + 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB, 0xF96F, 0xF96F, 0x20F6, + 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC, 0xF985, 0xF985, 0x2585, + 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599, 0xF988, 0xF990, 0x54C2, + 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB, 0xF996, 0xF996, 0x259A, + 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B, 0xF999, 0xF9A0, 0x54D0, + 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D, 0xFA43, 0xFA45, 0x54DA, + 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD, 0xFA4C, 0xFA4C, 0x234C, + 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44, 0xFA52, 0xFA57, 0x54E6, + 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0, 0xFA5A, 0xFA5C, 0x54EC, + 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF, 0xFA5F, 0xFA5F, 0x259F, + 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C, 0xFA62, 0xFA6F, 0x54F1, + 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF, 0xFA74, 0xFA74, 0x20AE, + 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B, 0xFA77, 0xFA77, 0x25A3, + 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A, 0xFA83, 0xFA83, 0x2589, + 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D, 0xFA8D, 0xFA8D, 0x25A4, + 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6, 0xFA91, 0xFA91, 0x2593, + 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7, 0xFA97, 0xFA97, 0x2222, + 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B, 0xFB40, 0xFB48, 0x5523, + 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C, 0xFB52, 0xFB52, 0x2586, + 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1, 0xFB58, 0xFB58, 0x25AA, + 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590, 0xFB5B, 0xFB5B, 0x258E, + 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688, 0xFB76, 0xFB78, 0x5552, + 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB, 0xFB7B, 0xFB7B, 0x5555, + 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4, 0xFB7E, 0xFB7E, 0x5556, + 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F, 0xFB91, 0xFB9B, 0x5567, + 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572, 0xFB9F, 0xFB9F, 0x25F7, + 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575, 0xFC44, 0xFC44, 0x2696, + 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F, 0xFC4A, 0xFC59, 0x557D, + 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D, 0xFC63, 0xFC63, 0x1EC1, + 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3, 0xFC69, 0xFC6E, 0x5599, + 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F, 0xFC71, 0xFC71, 0x268A, + 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669, 0xFC75, 0xFC76, 0x55A2, + 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4, 0xFC80, 0xFC82, 0x55AA, + 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD, 0xFC8A, 0xFC8A, 0x2673, + 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9, 0xFD52, 0xFD52, 0x20C6, + 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB, 0xFD57, 0xFD57, 0x24D3, + 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE, 0xFD5A, 0xFD5A, 0x260F, + 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611, 0xFD60, 0xFD61, 0x55E3, + 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5, 0xFD65, 0xFD65, 0x2610, + 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030, 0xFD68, 0xFD68, 0x55E7, + 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8, 0xFD6C, 0xFD6C, 0x2614, + 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616, 0xFD71, 0xFD71, 0x55ED, + 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE, 0xFD78, 0xFD78, 0x20F2, + 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617, 0xFD7E, 0xFD7E, 0x55F7, + 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037, 0xFD89, 0xFD8A, 0x5600, + 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602, 0xFD8F, 0xFD8F, 0x1F22, + 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605, 0xFD94, 0xFD94, 0x1F34, + 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02, 0xFD9E, 0xFD9E, 0x40D3, + 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083, 0xFE40, 0xFE40, 0x1259, + 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBKp-EUC-V_2.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBKp-EUC-V_2.cpp new file mode 100644 index 000000000000..014ae70a1cae --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBKp-EUC-V_2.cpp @@ -0,0 +1,17 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +const uint16_t g_FXCMAP_GBKp_EUC_V_2[20 * 3] = { + 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256, + 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246, + 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244, + 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240, + 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D, + 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254, + 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBpc-EUC-H_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBpc-EUC-H_0.cpp new file mode 100644 index 000000000000..ff437d7255a5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBpc-EUC-H_0.cpp @@ -0,0 +1,41 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +const uint16_t g_FXCMAP_GBpc_EUC_H_0[91 * 3] = { + 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x1E20, 0x00FD, 0x00FF, 0x1E21, + 0xA1A1, 0xA1FE, 0x0060, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0, + 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164, + 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225, + 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, 0xA8A1, 0xA8C0, 0x029C, + 0xA8C5, 0xA8EA, 0x02BC, 0xA9A4, 0xA9EF, 0x02E2, 0xAAA1, 0xAAFE, 0x032E, + 0xABA1, 0xABC0, 0x038C, 0xB0A1, 0xB0FE, 0x03AC, 0xB1A1, 0xB1FE, 0x040A, + 0xB2A1, 0xB2FE, 0x0468, 0xB3A1, 0xB3FE, 0x04C6, 0xB4A1, 0xB4FE, 0x0524, + 0xB5A1, 0xB5FE, 0x0582, 0xB6A1, 0xB6FE, 0x05E0, 0xB7A1, 0xB7FE, 0x063E, + 0xB8A1, 0xB8FE, 0x069C, 0xB9A1, 0xB9FE, 0x06FA, 0xBAA1, 0xBAFE, 0x0758, + 0xBBA1, 0xBBFE, 0x07B6, 0xBCA1, 0xBCFE, 0x0814, 0xBDA1, 0xBDFE, 0x0872, + 0xBEA1, 0xBEFE, 0x08D0, 0xBFA1, 0xBFFE, 0x092E, 0xC0A1, 0xC0FE, 0x098C, + 0xC1A1, 0xC1FE, 0x09EA, 0xC2A1, 0xC2FE, 0x0A48, 0xC3A1, 0xC3FE, 0x0AA6, + 0xC4A1, 0xC4FE, 0x0B04, 0xC5A1, 0xC5FE, 0x0B62, 0xC6A1, 0xC6FE, 0x0BC0, + 0xC7A1, 0xC7FE, 0x0C1E, 0xC8A1, 0xC8FE, 0x0C7C, 0xC9A1, 0xC9FE, 0x0CDA, + 0xCAA1, 0xCAFE, 0x0D38, 0xCBA1, 0xCBFE, 0x0D96, 0xCCA1, 0xCCFE, 0x0DF4, + 0xCDA1, 0xCDFE, 0x0E52, 0xCEA1, 0xCEFE, 0x0EB0, 0xCFA1, 0xCFFE, 0x0F0E, + 0xD0A1, 0xD0FE, 0x0F6C, 0xD1A1, 0xD1FE, 0x0FCA, 0xD2A1, 0xD2FE, 0x1028, + 0xD3A1, 0xD3FE, 0x1086, 0xD4A1, 0xD4FE, 0x10E4, 0xD5A1, 0xD5FE, 0x1142, + 0xD6A1, 0xD6FE, 0x11A0, 0xD7A1, 0xD7F9, 0x11FE, 0xD8A1, 0xD8FE, 0x1257, + 0xD9A1, 0xD9FE, 0x12B5, 0xDAA1, 0xDAFE, 0x1313, 0xDBA1, 0xDBFE, 0x1371, + 0xDCA1, 0xDCFE, 0x13CF, 0xDDA1, 0xDDFE, 0x142D, 0xDEA1, 0xDEFE, 0x148B, + 0xDFA1, 0xDFFE, 0x14E9, 0xE0A1, 0xE0FE, 0x1547, 0xE1A1, 0xE1FE, 0x15A5, + 0xE2A1, 0xE2FE, 0x1603, 0xE3A1, 0xE3FE, 0x1661, 0xE4A1, 0xE4FE, 0x16BF, + 0xE5A1, 0xE5FE, 0x171D, 0xE6A1, 0xE6FE, 0x177B, 0xE7A1, 0xE7FE, 0x17D9, + 0xE8A1, 0xE8FE, 0x1837, 0xE9A1, 0xE9FE, 0x1895, 0xEAA1, 0xEAFE, 0x18F3, + 0xEBA1, 0xEBFE, 0x1951, 0xECA1, 0xECFE, 0x19AF, 0xEDA1, 0xEDFE, 0x1A0D, + 0xEEA1, 0xEEFE, 0x1A6B, 0xEFA1, 0xEFFE, 0x1AC9, 0xF0A1, 0xF0FE, 0x1B27, + 0xF1A1, 0xF1FE, 0x1B85, 0xF2A1, 0xF2FE, 0x1BE3, 0xF3A1, 0xF3FE, 0x1C41, + 0xF4A1, 0xF4FE, 0x1C9F, 0xF5A1, 0xF5FE, 0x1CFD, 0xF6A1, 0xF6FE, 0x1D5B, + 0xF7A1, 0xF7FE, 0x1DB9, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBpc-EUC-V_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBpc-EUC-V_0.cpp new file mode 100644 index 000000000000..a35858f21b42 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/GBpc-EUC-V_0.cpp @@ -0,0 +1,17 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +const uint16_t g_FXCMAP_GBpc_EUC_V_0[20 * 3] = { + 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256, + 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246, + 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244, + 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240, + 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D, + 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254, + 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/UniGB-UCS2-H_4.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/UniGB-UCS2-H_4.cpp new file mode 100644 index 000000000000..e135f40da7b5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/UniGB-UCS2-H_4.cpp @@ -0,0 +1,4619 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +const uint16_t g_FXCMAP_UniGB_UCS2_H_4[13825 * 3] = { + 0x0020, 0x007E, 0x0001, 0x00A4, 0x00A4, 0x00A7, 0x00A5, 0x00A5, 0x5752, + 0x00A7, 0x00A7, 0x00AB, 0x00A8, 0x00A8, 0x0066, 0x00B0, 0x00B0, 0x00A2, + 0x00B1, 0x00B1, 0x007F, 0x00D7, 0x00D7, 0x0080, 0x00E0, 0x00E0, 0x029F, + 0x00E1, 0x00E1, 0x029D, 0x00E8, 0x00E8, 0x02A3, 0x00E9, 0x00E9, 0x02A1, + 0x00EA, 0x00EA, 0x02B5, 0x00EC, 0x00EC, 0x02A7, 0x00ED, 0x00ED, 0x02A5, + 0x00F2, 0x00F2, 0x02AB, 0x00F3, 0x00F3, 0x02A9, 0x00F7, 0x00F7, 0x0081, + 0x00F9, 0x00F9, 0x02AF, 0x00FA, 0x00FA, 0x02AD, 0x00FC, 0x00FC, 0x02B4, + 0x0101, 0x0101, 0x029C, 0x0113, 0x0113, 0x02A0, 0x011B, 0x011B, 0x02A2, + 0x012B, 0x012B, 0x02A4, 0x014D, 0x014D, 0x02A8, 0x016B, 0x016B, 0x02AC, + 0x01CE, 0x01CE, 0x029E, 0x01D0, 0x01D0, 0x02A6, 0x01D2, 0x01D2, 0x02AA, + 0x01D4, 0x01D4, 0x02AE, 0x01D6, 0x01D6, 0x02B0, 0x01D8, 0x01D8, 0x02B1, + 0x01DA, 0x01DA, 0x02B2, 0x01DC, 0x01DC, 0x02B3, 0x01F9, 0x01F9, 0x02BA, + 0x02C7, 0x02C7, 0x0065, 0x02C9, 0x02C9, 0x0064, 0x02CA, 0x02CB, 0x26B3, + 0x02D9, 0x02D9, 0x26B5, 0x0391, 0x03A1, 0x020D, 0x03A3, 0x03A9, 0x021E, + 0x03B1, 0x03C1, 0x0225, 0x03C3, 0x03C9, 0x0236, 0x0401, 0x0401, 0x0260, + 0x0410, 0x0415, 0x025A, 0x0416, 0x0435, 0x0261, 0x0436, 0x044F, 0x0282, + 0x0451, 0x0451, 0x0281, 0x1E3F, 0x1E3F, 0x02B7, 0x2010, 0x2010, 0x2722, + 0x2013, 0x2013, 0x26B6, 0x2014, 0x2014, 0x0069, 0x2015, 0x2015, 0x26B7, + 0x2016, 0x2016, 0x006B, 0x2018, 0x2019, 0x006D, 0x201C, 0x201D, 0x006F, + 0x2025, 0x2025, 0x26B8, 0x2026, 0x2026, 0x006C, 0x2030, 0x2030, 0x00AA, + 0x2032, 0x2033, 0x00A3, 0x2035, 0x2035, 0x26B9, 0x203B, 0x203B, 0x00B8, + 0x20AC, 0x20AC, 0x5751, 0x2103, 0x2103, 0x00A5, 0x2105, 0x2105, 0x26BA, + 0x2109, 0x2109, 0x26BB, 0x2116, 0x2116, 0x00AC, 0x2121, 0x2121, 0x2720, + 0x2160, 0x216B, 0x00FA, 0x2170, 0x2179, 0x26A9, 0x2190, 0x2191, 0x00BA, + 0x2192, 0x2192, 0x00B9, 0x2193, 0x2193, 0x00BC, 0x2196, 0x2199, 0x26BC, + 0x2208, 0x2208, 0x0089, 0x220F, 0x220F, 0x0086, 0x2211, 0x2211, 0x0085, + 0x2215, 0x2215, 0x26C0, 0x221A, 0x221A, 0x008B, 0x221D, 0x221D, 0x0097, + 0x221E, 0x221E, 0x009D, 0x221F, 0x221F, 0x26C1, 0x2220, 0x2220, 0x008E, + 0x2223, 0x2223, 0x26C2, 0x2225, 0x2225, 0x008D, 0x2227, 0x2228, 0x0083, + 0x2229, 0x2229, 0x0088, 0x222A, 0x222A, 0x0087, 0x222B, 0x222B, 0x0091, + 0x222E, 0x222E, 0x0092, 0x2234, 0x2234, 0x009F, 0x2235, 0x2235, 0x009E, + 0x2236, 0x2236, 0x0082, 0x2237, 0x2237, 0x008A, 0x223D, 0x223D, 0x0096, + 0x2248, 0x2248, 0x0095, 0x224C, 0x224C, 0x0094, 0x2252, 0x2252, 0x26C3, + 0x2260, 0x2260, 0x0098, 0x2261, 0x2261, 0x0093, 0x2264, 0x2265, 0x009B, + 0x2266, 0x2267, 0x26C4, 0x226E, 0x226F, 0x0099, 0x2295, 0x2295, 0x2704, + 0x2299, 0x2299, 0x0090, 0x22A5, 0x22A5, 0x008C, 0x22BF, 0x22BF, 0x26C6, + 0x22EF, 0x22EF, 0x006C, 0x2312, 0x2312, 0x008F, 0x2460, 0x2469, 0x00E6, + 0x2474, 0x2487, 0x00D2, 0x2488, 0x249B, 0x00BE, 0x2500, 0x254B, 0x02E2, + 0x2550, 0x2573, 0x26C7, 0x2581, 0x258F, 0x26EB, 0x2593, 0x2595, 0x26FA, + 0x25A0, 0x25A0, 0x00B5, 0x25A1, 0x25A1, 0x00B4, 0x25B2, 0x25B2, 0x00B7, + 0x25B3, 0x25B3, 0x00B6, 0x25BC, 0x25BD, 0x26FD, 0x25C6, 0x25C6, 0x00B3, + 0x25C7, 0x25C7, 0x00B2, 0x25CB, 0x25CB, 0x00AF, 0x25CE, 0x25CE, 0x00B1, + 0x25CF, 0x25CF, 0x00B0, 0x25E2, 0x25E5, 0x26FF, 0x2605, 0x2605, 0x00AE, + 0x2606, 0x2606, 0x00AD, 0x2609, 0x2609, 0x2703, 0x2640, 0x2640, 0x00A1, + 0x2642, 0x2642, 0x00A0, 0x2E80, 0x2E80, 0x579C, 0x2E81, 0x2E81, 0x561F, + 0x2E82, 0x2E83, 0x579D, 0x2E84, 0x2E84, 0x5623, 0x2E85, 0x2E87, 0x579F, + 0x2E88, 0x2E88, 0x5626, 0x2E89, 0x2E8A, 0x57A2, 0x2E8B, 0x2E8B, 0x5627, + 0x2E8C, 0x2E8C, 0x562C, 0x2E8D, 0x2E96, 0x57A4, 0x2E97, 0x2E97, 0x562D, + 0x2E98, 0x2E99, 0x57AE, 0x2E9B, 0x2EA6, 0x57B0, 0x2EA7, 0x2EA7, 0x563A, + 0x2EA8, 0x2EA9, 0x57BC, 0x2EAA, 0x2EAA, 0x563D, 0x2EAB, 0x2EAD, 0x57BE, + 0x2EAE, 0x2EAE, 0x5640, 0x2EAF, 0x2EB2, 0x57C1, 0x2EB3, 0x2EB3, 0x5642, + 0x2EB4, 0x2EB5, 0x57C5, 0x2EB6, 0x2EB7, 0x5643, 0x2EB8, 0x2EBA, 0x57C7, + 0x2EBB, 0x2EBB, 0x5648, 0x2EBC, 0x2EC9, 0x57CA, 0x2ECA, 0x2ECA, 0x5652, + 0x2ECB, 0x2EF3, 0x57D8, 0x2F00, 0x2F00, 0x1042, 0x2F01, 0x2F01, 0x1263, + 0x2F02, 0x2F02, 0x1272, 0x2F03, 0x2F03, 0x1265, 0x2F04, 0x2F04, 0x1059, + 0x2F05, 0x2F05, 0x2793, 0x2F06, 0x2F06, 0x063D, 0x2F07, 0x2F07, 0x1303, + 0x2F08, 0x2F08, 0x0CA6, 0x2F09, 0x2F09, 0x0638, 0x2F0A, 0x2F0A, 0x0CC6, + 0x2F0B, 0x2F0B, 0x03D6, 0x2F0C, 0x2F0C, 0x129D, 0x2F0D, 0x2F0D, 0x1314, + 0x2F0E, 0x2F0E, 0x130F, 0x2F0F, 0x2F0F, 0x082B, 0x2F10, 0x2F10, 0x1399, + 0x2F11, 0x2F11, 0x0597, 0x2F12, 0x2F12, 0x09EF, 0x2F13, 0x2F13, 0x12FC, + 0x2F14, 0x2F14, 0x1266, 0x2F15, 0x2F15, 0x1284, 0x2F16, 0x2F16, 0x2A1A, + 0x2F17, 0x2F17, 0x0D45, 0x2F18, 0x2F18, 0x047E, 0x2F19, 0x2F19, 0x1352, + 0x2F1A, 0x2F1A, 0x04CC, 0x2F1B, 0x2F1B, 0x139C, 0x2F1C, 0x2F1C, 0x10BB, + 0x2F1D, 0x2F1D, 0x0967, 0x2F1E, 0x2F1E, 0x1593, 0x2F1F, 0x2F1F, 0x0E72, + 0x2F20, 0x2F20, 0x0D56, 0x2F21, 0x2F21, 0x161C, 0x2F22, 0x2F22, 0x2D2D, + 0x2F23, 0x2F23, 0x0F13, 0x2F24, 0x2F24, 0x0576, 0x2F25, 0x2F25, 0x0B6F, + 0x2F26, 0x2F26, 0x1230, 0x2F27, 0x2F27, 0x172E, 0x2F28, 0x2F28, 0x056A, + 0x2F29, 0x2F29, 0x0F6C, 0x2F2A, 0x2F2A, 0x14B6, 0x2F2B, 0x2F2B, 0x0D43, + 0x2F2C, 0x2F2C, 0x1774, 0x2F2D, 0x2F2D, 0x0CF6, 0x2F2E, 0x2F2E, 0x1815, + 0x2F2F, 0x2F2F, 0x06FD, 0x2F30, 0x2F30, 0x082D, 0x2F31, 0x2F31, 0x08BE, + 0x2F32, 0x2F32, 0x06C4, 0x2F33, 0x2F33, 0x1813, 0x2F34, 0x2F34, 0x073C, + 0x2F35, 0x2F35, 0x1398, 0x2F36, 0x2F36, 0x14AD, 0x2F37, 0x2F37, 0x14F6, + 0x2F38, 0x2F38, 0x0706, 0x2F39, 0x2F39, 0x1762, 0x2F3A, 0x2F3A, 0x15EE, + 0x2F3B, 0x2F3B, 0x15E0, 0x2F3C, 0x2F3C, 0x0F8F, 0x2F3D, 0x2F3D, 0x06E5, + 0x2F3E, 0x2F3E, 0x3292, 0x2F3F, 0x2F3F, 0x0D6D, 0x2F40, 0x2F40, 0x11A6, + 0x2F41, 0x2F41, 0x1909, 0x2F42, 0x2F42, 0x0ED3, 0x2F43, 0x2F43, 0x05F6, + 0x2F44, 0x2F44, 0x08C0, 0x2F45, 0x2F45, 0x065A, 0x2F46, 0x2F46, 0x0EED, + 0x2F47, 0x2F47, 0x0CB0, 0x2F48, 0x2F48, 0x10FE, 0x2F49, 0x2F49, 0x1105, + 0x2F4A, 0x2F4A, 0x0B21, 0x2F4B, 0x2F4B, 0x0C34, 0x2F4C, 0x2F4C, 0x11B8, + 0x2F4D, 0x2F4D, 0x0578, 0x2F4E, 0x2F4E, 0x19BD, 0x2F4F, 0x2F4F, 0x0EF2, + 0x2F50, 0x2F50, 0x0431, 0x2F51, 0x2F51, 0x0AB0, 0x2F52, 0x2F52, 0x0D66, + 0x2F53, 0x2F53, 0x0C17, 0x2F54, 0x2F54, 0x0DA3, 0x2F55, 0x2F55, 0x0805, + 0x2F56, 0x2F56, 0x1203, 0x2F57, 0x2F57, 0x06B3, 0x2F58, 0x2F58, 0x1269, + 0x2F59, 0x2F59, 0x169D, 0x2F5A, 0x2F5A, 0x0BCB, 0x2F5B, 0x2F5B, 0x0FE9, + 0x2F5C, 0x2F5C, 0x0B64, 0x2F5D, 0x2F5D, 0x0C89, 0x2F5E, 0x2F5E, 0x0FC9, + 0x2F5F, 0x2F5F, 0x10D6, 0x2F60, 0x2F60, 0x0728, 0x2F61, 0x2F61, 0x0E90, + 0x2F62, 0x2F62, 0x06C5, 0x2F63, 0x2F63, 0x0D33, 0x2F64, 0x2F64, 0x10A8, + 0x2F65, 0x2F65, 0x0E42, 0x2F66, 0x2F66, 0x1BC6, 0x2F67, 0x2F67, 0x1B60, + 0x2F68, 0x2F68, 0x3EBF, 0x2F69, 0x2F69, 0x03E2, 0x2F6A, 0x2F6A, 0x0BC3, + 0x2F6B, 0x2F6B, 0x0AF8, 0x2F6C, 0x2F6C, 0x0B22, 0x2F6D, 0x2F6D, 0x0AB1, + 0x2F6E, 0x2F6E, 0x0D4F, 0x2F6F, 0x2F6F, 0x0D46, 0x2F70, 0x2F70, 0x0D55, + 0x2F71, 0x2F71, 0x40CB, 0x2F72, 0x2F72, 0x0783, 0x2F73, 0x2F73, 0x0FD1, + 0x2F74, 0x2F74, 0x09EB, 0x2F75, 0x2F75, 0x11F0, 0x2F76, 0x2F76, 0x0ADC, + 0x2F77, 0x2F77, 0x1CE7, 0x2F78, 0x2F78, 0x1C5E, 0x2F79, 0x2F79, 0x0EA9, + 0x2F7A, 0x2F7A, 0x101B, 0x2F7B, 0x2F7B, 0x10D5, 0x2F7C, 0x2F7C, 0x09BA, + 0x2F7D, 0x2F7D, 0x0637, 0x2F7E, 0x2F7E, 0x1BCB, 0x2F7F, 0x2F7F, 0x0639, + 0x2F80, 0x2F80, 0x1A1E, 0x2F81, 0x2F81, 0x0CBD, 0x2F82, 0x2F82, 0x04E1, + 0x2F83, 0x2F83, 0x1231, 0x2F84, 0x2F84, 0x11C0, 0x2F85, 0x2F85, 0x08F9, + 0x2F86, 0x2F86, 0x0D19, 0x2F87, 0x2F87, 0x1618, 0x2F88, 0x2F88, 0x11DA, + 0x2F89, 0x2F89, 0x1CDC, 0x2F8A, 0x2F8A, 0x0CE4, 0x2F8B, 0x2F8B, 0x45A2, + 0x2F8C, 0x2F8C, 0x1BF0, 0x2F8D, 0x2F8D, 0x050B, 0x2F8E, 0x2F8E, 0x0FD3, + 0x2F8F, 0x2F8F, 0x0F9B, 0x2F90, 0x2F90, 0x1049, 0x2F91, 0x2F91, 0x49DC, + 0x2F92, 0x2F92, 0x1F96, 0x2F93, 0x2F93, 0x0898, 0x2F94, 0x2F94, 0x0FFD, + 0x2F95, 0x2F95, 0x0721, 0x2F96, 0x2F96, 0x05F8, 0x2F97, 0x2F97, 0x1D15, + 0x2F98, 0x2F98, 0x1D50, 0x2F99, 0x2F99, 0x1E3B, 0x2F9A, 0x2F9A, 0x0505, + 0x2F9B, 0x2F9B, 0x123C, 0x2F9C, 0x2F9C, 0x1240, 0x2F9D, 0x2F9D, 0x0D26, + 0x2F9E, 0x2F9E, 0x1E7B, 0x2F9F, 0x2F9F, 0x0F8C, 0x2FA0, 0x2FA0, 0x04E2, + 0x2FA1, 0x2FA1, 0x4D13, 0x2FA2, 0x2FA2, 0x105F, 0x2FA3, 0x2FA3, 0x10B4, + 0x2FA4, 0x2FA4, 0x4E18, 0x2FA5, 0x2FA5, 0x09DA, 0x2FA6, 0x2FA6, 0x08C1, + 0x2FA7, 0x2FA7, 0x1E75, 0x2FA8, 0x2FA8, 0x207D, 0x2FA9, 0x2FA9, 0x06B2, + 0x2FAA, 0x2FAA, 0x09EE, 0x2FAB, 0x2FAB, 0x1D79, 0x2FAC, 0x2FAC, 0x10CF, + 0x2FAD, 0x2FAD, 0x50EA, 0x2FAE, 0x2FAE, 0x0664, 0x2FAF, 0x2FAF, 0x0AEB, + 0x2FB0, 0x2FB0, 0x06EA, 0x2FB1, 0x2FB1, 0x218D, 0x2FB2, 0x2FB2, 0x08F1, + 0x2FB3, 0x2FB3, 0x107B, 0x2FB4, 0x2FB4, 0x2209, 0x2FB5, 0x2FB5, 0x1F00, + 0x2FB6, 0x2FB6, 0x1EF4, 0x2FB7, 0x2FB7, 0x0D4A, 0x2FB8, 0x2FB8, 0x0D6E, + 0x2FB9, 0x2FB9, 0x0F50, 0x2FBA, 0x2FBA, 0x206D, 0x2FBB, 0x2FBB, 0x0720, + 0x2FBC, 0x2FBC, 0x06DA, 0x2FBD, 0x2FBD, 0x1DEC, 0x2FBE, 0x2FBE, 0x1ED0, + 0x2FBF, 0x2FBF, 0x139B, 0x2FC0, 0x2FC0, 0x1260, 0x2FC1, 0x2FC1, 0x0746, + 0x2FC2, 0x2FC2, 0x2239, 0x2FC3, 0x2FC3, 0x209C, 0x2FC4, 0x2FC4, 0x2688, + 0x2FC5, 0x2FC5, 0x0A60, 0x2FC6, 0x2FC6, 0x2071, 0x2FC7, 0x2FC7, 0x0A90, + 0x2FC8, 0x2FC8, 0x5586, 0x2FC9, 0x2FC9, 0x0D89, 0x2FCA, 0x2FCA, 0x0791, + 0x2FCB, 0x2FCB, 0x1A55, 0x2FCC, 0x2FCC, 0x2618, 0x2FCD, 0x2FCD, 0x05E5, + 0x2FCE, 0x2FCE, 0x071D, 0x2FCF, 0x2FCF, 0x0D8A, 0x2FD0, 0x2FD0, 0x0430, + 0x2FD1, 0x2FD1, 0x20C6, 0x2FD2, 0x2FD2, 0x1E86, 0x2FD3, 0x2FD3, 0x2037, + 0x2FD4, 0x2FD4, 0x1F34, 0x2FD5, 0x2FD5, 0x12F3, 0x2FF0, 0x2FFB, 0x274C, + 0x3000, 0x3002, 0x0060, 0x3003, 0x3003, 0x0067, 0x3005, 0x3005, 0x0068, + 0x3006, 0x3006, 0x2728, 0x3007, 0x3007, 0x1E17, 0x3008, 0x300F, 0x0073, + 0x3010, 0x3011, 0x007D, 0x3012, 0x3012, 0x2705, 0x3013, 0x3013, 0x00BD, + 0x3014, 0x3015, 0x0071, 0x3016, 0x3017, 0x007B, 0x301D, 0x301E, 0x2706, + 0x3021, 0x3029, 0x2708, 0x3033, 0x3035, 0x577B, 0x3038, 0x303A, 0x577E, + 0x303E, 0x303E, 0x274B, 0x303F, 0x303F, 0x5755, 0x3041, 0x3093, 0x0164, + 0x3094, 0x3094, 0x5767, 0x309B, 0x309C, 0x2724, 0x309D, 0x309E, 0x2729, + 0x30A1, 0x30F6, 0x01B7, 0x30F7, 0x30FA, 0x5776, 0x30FB, 0x30FB, 0x0063, + 0x30FC, 0x30FC, 0x2723, 0x30FD, 0x30FE, 0x2726, 0x3105, 0x3129, 0x02BC, + 0x312A, 0x312C, 0x5781, 0x31A0, 0x31B7, 0x5784, 0x3220, 0x3229, 0x00F0, + 0x3231, 0x3231, 0x2721, 0x32A3, 0x32A3, 0x2711, 0x338E, 0x338F, 0x2712, + 0x339C, 0x339E, 0x2714, 0x33A1, 0x33A1, 0x2717, 0x33C4, 0x33C4, 0x2718, + 0x33CE, 0x33CE, 0x2719, 0x33D1, 0x33D2, 0x271A, 0x33D5, 0x33D5, 0x271C, + 0x3400, 0x3446, 0x5801, 0x3447, 0x3447, 0x5625, 0x3448, 0x3472, 0x5848, + 0x3473, 0x3473, 0x5624, 0x3474, 0x34FF, 0x5873, 0x3500, 0x359D, 0x58FF, + 0x359E, 0x359E, 0x5629, 0x359F, 0x35FF, 0x599D, 0x3600, 0x360D, 0x59FE, + 0x360E, 0x360E, 0x562B, 0x360F, 0x3619, 0x5A0C, 0x361A, 0x361A, 0x562A, + 0x361B, 0x36FF, 0x5A17, 0x3700, 0x37FF, 0x5AFC, 0x3800, 0x38FF, 0x5BFC, + 0x3900, 0x3917, 0x5CFC, 0x3918, 0x3918, 0x562F, 0x3919, 0x396D, 0x5D14, + 0x396E, 0x396E, 0x562E, 0x396F, 0x39CE, 0x5D69, 0x39CF, 0x39CF, 0x5631, + 0x39D0, 0x39D0, 0x5634, 0x39D1, 0x39DE, 0x5DC9, 0x39DF, 0x39DF, 0x5632, + 0x39E0, 0x39FF, 0x5DD7, 0x3A00, 0x3A72, 0x5DF7, 0x3A73, 0x3A73, 0x5633, + 0x3A74, 0x3AFF, 0x5E6A, 0x3B00, 0x3B4D, 0x5EF6, 0x3B4E, 0x3B4E, 0x5637, + 0x3B4F, 0x3BFF, 0x5F44, 0x3C00, 0x3C6D, 0x5FF5, 0x3C6E, 0x3C6E, 0x5638, + 0x3C6F, 0x3CDF, 0x6063, 0x3CE0, 0x3CE0, 0x5639, 0x3CE1, 0x3CFF, 0x60D4, + 0x3D00, 0x3DFF, 0x60F3, 0x3E00, 0x3EFF, 0x61F3, 0x3F00, 0x3FFF, 0x62F3, + 0x4000, 0x4055, 0x63F3, 0x4056, 0x4056, 0x563E, 0x4057, 0x40FF, 0x6449, + 0x4100, 0x415E, 0x64F2, 0x415F, 0x415F, 0x563F, 0x4160, 0x41FF, 0x6551, + 0x4200, 0x42FF, 0x65F1, 0x4300, 0x4336, 0x66F1, 0x4337, 0x4337, 0x5641, + 0x4338, 0x43AB, 0x6728, 0x43AC, 0x43AC, 0x5647, 0x43AD, 0x43B0, 0x679C, + 0x43B1, 0x43B1, 0x5646, 0x43B2, 0x43DC, 0x67A0, 0x43DD, 0x43DD, 0x5649, + 0x43DE, 0x43FF, 0x67CB, 0x4400, 0x44D5, 0x67ED, 0x44D6, 0x44D6, 0x564A, + 0x44D7, 0x44FF, 0x68C3, 0x4500, 0x45FF, 0x68EC, 0x4600, 0x464B, 0x69EC, + 0x464C, 0x464C, 0x564C, 0x464D, 0x4660, 0x6A38, 0x4661, 0x4661, 0x564B, + 0x4662, 0x46FF, 0x6A4C, 0x4700, 0x4722, 0x6AEA, 0x4723, 0x4723, 0x564E, + 0x4724, 0x4728, 0x6B0D, 0x4729, 0x4729, 0x564F, 0x472A, 0x477B, 0x6B12, + 0x477C, 0x477C, 0x5650, 0x477D, 0x478C, 0x6B64, 0x478D, 0x478D, 0x5651, + 0x478E, 0x47FF, 0x6B74, 0x4800, 0x48FF, 0x6BE6, 0x4900, 0x4946, 0x6CE6, + 0x4947, 0x4947, 0x5653, 0x4948, 0x4979, 0x6D2D, 0x497A, 0x497A, 0x5654, + 0x497B, 0x497C, 0x6D5F, 0x497D, 0x497D, 0x5655, 0x497E, 0x4981, 0x6D61, + 0x4982, 0x4983, 0x5656, 0x4984, 0x4984, 0x6D65, 0x4985, 0x4986, 0x5658, + 0x4987, 0x499A, 0x6D66, 0x499B, 0x499B, 0x565B, 0x499C, 0x499E, 0x6D7A, + 0x499F, 0x499F, 0x565A, 0x49A0, 0x49B5, 0x6D7D, 0x49B6, 0x49B6, 0x565D, + 0x49B7, 0x49B7, 0x565C, 0x49B8, 0x49FF, 0x6D93, 0x4A00, 0x4AFF, 0x6DDB, + 0x4B00, 0x4BFF, 0x6EDB, 0x4C00, 0x4C76, 0x6FDB, 0x4C77, 0x4C77, 0x5664, + 0x4C78, 0x4C9E, 0x7052, 0x4C9F, 0x4CA1, 0x5661, 0x4CA2, 0x4CA2, 0x5665, + 0x4CA3, 0x4CA3, 0x5660, 0x4CA4, 0x4CFF, 0x7079, 0x4D00, 0x4D12, 0x70D5, + 0x4D13, 0x4D19, 0x5666, 0x4D1A, 0x4DAD, 0x70E8, 0x4DAE, 0x4DAE, 0x566D, + 0x4DAF, 0x4DB5, 0x717C, 0x4E00, 0x4E00, 0x1042, 0x4E01, 0x4E01, 0x05E0, + 0x4E02, 0x4E02, 0x2758, 0x4E03, 0x4E03, 0x0BFE, 0x4E04, 0x4E06, 0x2759, + 0x4E07, 0x4E07, 0x0EA3, 0x4E08, 0x4E08, 0x116A, 0x4E09, 0x4E09, 0x0CD8, + 0x4E0A, 0x4E0A, 0x0D08, 0x4E0B, 0x4E0B, 0x0F2F, 0x4E0C, 0x4E0C, 0x1258, + 0x4E0D, 0x4E0D, 0x0482, 0x4E0E, 0x4E0E, 0x10D0, 0x4E0F, 0x4E0F, 0x275C, + 0x4E10, 0x4E10, 0x125A, 0x4E11, 0x4E11, 0x0518, 0x4E12, 0x4E12, 0x275D, + 0x4E13, 0x4E13, 0x1205, 0x4E14, 0x4E14, 0x0C4F, 0x4E15, 0x4E15, 0x125D, + 0x4E16, 0x4E16, 0x0D57, 0x4E17, 0x4E17, 0x275E, 0x4E18, 0x4E18, 0x0C6D, + 0x4E19, 0x4E19, 0x0464, 0x4E1A, 0x4E1A, 0x103C, 0x4E1B, 0x4E1B, 0x0557, + 0x4E1C, 0x4E1C, 0x05EA, 0x4E1D, 0x4E1D, 0x0DB4, 0x4E1E, 0x4E1E, 0x125F, + 0x4E1F, 0x4E21, 0x275F, 0x4E22, 0x4E22, 0x05E9, 0x4E23, 0x4E23, 0x2762, + 0x4E24, 0x4E24, 0x0A06, 0x4E25, 0x4E25, 0x0FF8, 0x4E26, 0x4E26, 0x2763, + 0x4E27, 0x4E27, 0x0CDE, 0x4E28, 0x4E28, 0x1263, 0x4E29, 0x4E29, 0x2764, + 0x4E2A, 0x4E2A, 0x06F1, 0x4E2B, 0x4E2B, 0x0FE7, 0x4E2C, 0x4E2C, 0x169C, + 0x4E2D, 0x4E2D, 0x11CF, 0x4E2E, 0x4E2F, 0x2765, 0x4E30, 0x4E30, 0x067E, + 0x4E31, 0x4E31, 0x2767, 0x4E32, 0x4E32, 0x0531, 0x4E33, 0x4E33, 0x2768, + 0x4E34, 0x4E34, 0x0A22, 0x4E35, 0x4E35, 0x2769, 0x4E36, 0x4E36, 0x1272, + 0x4E37, 0x4E37, 0x276A, 0x4E38, 0x4E38, 0x0E99, 0x4E39, 0x4E39, 0x0585, + 0x4E3A, 0x4E3A, 0x0EB9, 0x4E3B, 0x4E3B, 0x11F6, 0x4E3C, 0x4E3C, 0x276B, + 0x4E3D, 0x4E3D, 0x09E1, 0x4E3E, 0x4E3E, 0x0908, 0x4E3F, 0x4E3F, 0x1265, + 0x4E40, 0x4E42, 0x276C, 0x4E43, 0x4E43, 0x0B2E, 0x4E44, 0x4E44, 0x276F, + 0x4E45, 0x4E45, 0x08F2, 0x4E46, 0x4E46, 0x2770, 0x4E47, 0x4E47, 0x1267, + 0x4E48, 0x4E48, 0x0AB9, 0x4E49, 0x4E49, 0x106C, 0x4E4A, 0x4E4A, 0x2771, + 0x4E4B, 0x4E4B, 0x11AD, 0x4E4C, 0x4E4C, 0x0EE9, 0x4E4D, 0x4E4D, 0x1148, + 0x4E4E, 0x4E4E, 0x07AC, 0x4E4F, 0x4E4F, 0x0643, 0x4E50, 0x4E50, 0x09C1, + 0x4E51, 0x4E51, 0x2772, 0x4E52, 0x4E52, 0x0BD8, 0x4E53, 0x4E53, 0x0B93, + 0x4E54, 0x4E54, 0x0C44, 0x4E55, 0x4E55, 0x2773, 0x4E56, 0x4E56, 0x072D, + 0x4E57, 0x4E57, 0x2774, 0x4E58, 0x4E58, 0x04F0, 0x4E59, 0x4E59, 0x1059, + 0x4E5A, 0x4E5B, 0x2775, 0x4E5C, 0x4E5C, 0x1275, 0x4E5D, 0x4E5D, 0x08F4, + 0x4E5E, 0x4E5E, 0x0C11, 0x4E5F, 0x4E5F, 0x1039, 0x4E60, 0x4E60, 0x0F1D, + 0x4E61, 0x4E61, 0x0F54, 0x4E62, 0x4E65, 0x2777, 0x4E66, 0x4E66, 0x0D80, + 0x4E67, 0x4E68, 0x277B, 0x4E69, 0x4E69, 0x1276, 0x4E6A, 0x4E6F, 0x277D, + 0x4E70, 0x4E70, 0x0A99, 0x4E71, 0x4E71, 0x0A79, 0x4E72, 0x4E72, 0x2783, + 0x4E73, 0x4E73, 0x0CC4, 0x4E74, 0x4E7D, 0x2784, 0x4E7E, 0x4E7E, 0x0C29, + 0x4E7F, 0x4E81, 0x278E, 0x4E82, 0x4E82, 0x2059, 0x4E83, 0x4E85, 0x2791, + 0x4E86, 0x4E86, 0x0A14, 0x4E87, 0x4E87, 0x2794, 0x4E88, 0x4E88, 0x10CD, + 0x4E89, 0x4E89, 0x119A, 0x4E8A, 0x4E8A, 0x2795, 0x4E8B, 0x4E8B, 0x0D59, + 0x4E8C, 0x4E8C, 0x063D, 0x4E8D, 0x4E8D, 0x1257, 0x4E8E, 0x4E8E, 0x10BF, + 0x4E8F, 0x4E8F, 0x0984, 0x4E90, 0x4E90, 0x2796, 0x4E91, 0x4E91, 0x1109, + 0x4E92, 0x4E92, 0x07BA, 0x4E93, 0x4E93, 0x1277, 0x4E94, 0x4E94, 0x0EF4, + 0x4E95, 0x4E95, 0x08DD, 0x4E96, 0x4E97, 0x2797, 0x4E98, 0x4E98, 0x125E, + 0x4E99, 0x4E99, 0x2799, 0x4E9A, 0x4E9A, 0x0FF0, 0x4E9B, 0x4E9B, 0x0F74, + 0x4E9C, 0x4E9D, 0x279A, 0x4E9E, 0x4E9E, 0x21F1, 0x4E9F, 0x4E9F, 0x1273, + 0x4EA0, 0x4EA0, 0x1303, 0x4EA1, 0x4EA1, 0x0EA7, 0x4EA2, 0x4EA2, 0x0947, + 0x4EA3, 0x4EA3, 0x279C, 0x4EA4, 0x4EA4, 0x088C, 0x4EA5, 0x4EA5, 0x075C, + 0x4EA6, 0x4EA6, 0x1067, 0x4EA7, 0x4EA7, 0x04C1, 0x4EA8, 0x4EA8, 0x0797, + 0x4EA9, 0x4EA9, 0x0B19, 0x4EAA, 0x4EAA, 0x279D, 0x4EAB, 0x4EAB, 0x0F5A, + 0x4EAC, 0x4EAC, 0x08D8, 0x4EAD, 0x4EAD, 0x0E55, 0x4EAE, 0x4EAE, 0x0A0A, + 0x4EAF, 0x4EB1, 0x279E, 0x4EB2, 0x4EB2, 0x0C54, 0x4EB3, 0x4EB3, 0x1305, + 0x4EB4, 0x4EB4, 0x27A1, 0x4EB5, 0x4EB5, 0x1308, 0x4EB6, 0x4EB9, 0x27A2, + 0x4EBA, 0x4EBA, 0x0CA6, 0x4EBB, 0x4EBB, 0x129F, 0x4EBC, 0x4EBE, 0x27A6, + 0x4EBF, 0x4EBF, 0x1061, 0x4EC0, 0x4EC0, 0x0D49, 0x4EC1, 0x4EC1, 0x0CA5, + 0x4EC2, 0x4EC2, 0x12A2, 0x4EC3, 0x4EC3, 0x12A0, 0x4EC4, 0x4EC4, 0x127C, + 0x4EC5, 0x4EC5, 0x08C7, 0x4EC6, 0x4EC6, 0x0BEC, 0x4EC7, 0x4EC7, 0x0515, + 0x4EC8, 0x4EC8, 0x27A9, 0x4EC9, 0x4EC9, 0x12A1, 0x4ECA, 0x4ECA, 0x08C2, + 0x4ECB, 0x4ECB, 0x08BA, 0x4ECC, 0x4ECC, 0x27AA, 0x4ECD, 0x4ECD, 0x0CAF, + 0x4ECE, 0x4ECE, 0x0556, 0x4ECF, 0x4ED0, 0x27AB, 0x4ED1, 0x4ED1, 0x0A7F, + 0x4ED2, 0x4ED2, 0x27AD, 0x4ED3, 0x4ED3, 0x049D, 0x4ED4, 0x4ED4, 0x122D, + 0x4ED5, 0x4ED5, 0x0D62, 0x4ED6, 0x4ED6, 0x0DF0, 0x4ED7, 0x4ED7, 0x116D, + 0x4ED8, 0x4ED8, 0x06B1, 0x4ED9, 0x4ED9, 0x0F36, 0x4EDA, 0x4EDC, 0x27AE, + 0x4EDD, 0x4EDD, 0x12EE, 0x4EDE, 0x4EDE, 0x12A6, 0x4EDF, 0x4EDF, 0x0C27, + 0x4EE0, 0x4EE0, 0x27B1, 0x4EE1, 0x4EE1, 0x12A4, 0x4EE2, 0x4EE2, 0x27B2, + 0x4EE3, 0x4EE3, 0x057D, 0x4EE4, 0x4EE4, 0x0A37, 0x4EE5, 0x4EE5, 0x105B, + 0x4EE6, 0x4EE7, 0x27B3, 0x4EE8, 0x4EE8, 0x12A3, 0x4EE9, 0x4EE9, 0x27B5, + 0x4EEA, 0x4EEA, 0x104E, 0x4EEB, 0x4EEB, 0x12A5, 0x4EEC, 0x4EEC, 0x0ACC, + 0x4EED, 0x4EEF, 0x27B6, 0x4EF0, 0x4EF0, 0x101F, 0x4EF1, 0x4EF1, 0x27B9, + 0x4EF2, 0x4EF2, 0x11D8, 0x4EF3, 0x4EF3, 0x12A8, 0x4EF4, 0x4EF4, 0x27BA, + 0x4EF5, 0x4EF5, 0x12AB, 0x4EF6, 0x4EF6, 0x0871, 0x4EF7, 0x4EF7, 0x084E, + 0x4EF8, 0x4EFA, 0x27BB, 0x4EFB, 0x4EFB, 0x0CA9, 0x4EFC, 0x4EFC, 0x27BE, + 0x4EFD, 0x4EFD, 0x067A, 0x4EFE, 0x4EFE, 0x27BF, 0x4EFF, 0x4EFF, 0x065F, + 0x4F00, 0x4F00, 0x27C0, 0x4F01, 0x4F01, 0x0C12, 0x4F02, 0x4F08, 0x27C1, + 0x4F09, 0x4F09, 0x12AE, 0x4F0A, 0x4F0A, 0x1048, 0x4F0B, 0x4F0C, 0x27C8, + 0x4F0D, 0x4F0D, 0x0EF8, 0x4F0E, 0x4F0E, 0x0832, 0x4F0F, 0x4F0F, 0x0699, + 0x4F10, 0x4F10, 0x0642, 0x4F11, 0x4F11, 0x0FA8, 0x4F12, 0x4F16, 0x27CA, + 0x4F17, 0x4F17, 0x11D9, 0x4F18, 0x4F18, 0x10AA, 0x4F19, 0x4F19, 0x0804, + 0x4F1A, 0x4F1A, 0x07F6, 0x4F1B, 0x4F1B, 0x12A7, 0x4F1C, 0x4F1D, 0x27CF, + 0x4F1E, 0x4F1E, 0x0CDA, 0x4F1F, 0x4F1F, 0x0EBF, 0x4F20, 0x4F20, 0x052E, + 0x4F21, 0x4F21, 0x27D1, 0x4F22, 0x4F22, 0x12A9, 0x4F23, 0x4F23, 0x27D2, + 0x4F24, 0x4F24, 0x0D04, 0x4F25, 0x4F25, 0x12AC, 0x4F26, 0x4F26, 0x0A7E, + 0x4F27, 0x4F27, 0x12AD, 0x4F28, 0x4F29, 0x27D3, 0x4F2A, 0x4F2A, 0x0EC0, + 0x4F2B, 0x4F2B, 0x12AF, 0x4F2C, 0x4F2E, 0x27D5, 0x4F2F, 0x4F2F, 0x0475, + 0x4F30, 0x4F30, 0x0719, 0x4F31, 0x4F31, 0x27D8, 0x4F32, 0x4F32, 0x12B7, + 0x4F33, 0x4F33, 0x27D9, 0x4F34, 0x4F34, 0x03F4, 0x4F35, 0x4F35, 0x27DA, + 0x4F36, 0x4F36, 0x0A2F, 0x4F37, 0x4F37, 0x27DB, 0x4F38, 0x4F38, 0x0D25, + 0x4F39, 0x4F39, 0x27DC, 0x4F3A, 0x4F3A, 0x0DBA, 0x4F3B, 0x4F3B, 0x27DD, + 0x4F3C, 0x4F3C, 0x0DBB, 0x4F3D, 0x4F3D, 0x12B8, 0x4F3E, 0x4F42, 0x27DE, + 0x4F43, 0x4F43, 0x05C9, 0x4F44, 0x4F45, 0x27E3, 0x4F46, 0x4F46, 0x058C, + 0x4F47, 0x4F4C, 0x27E5, 0x4F4D, 0x4F4D, 0x0ECA, 0x4F4E, 0x4F4E, 0x05AE, + 0x4F4F, 0x4F4F, 0x11FE, 0x4F50, 0x4F50, 0x1251, 0x4F51, 0x4F51, 0x10B8, + 0x4F52, 0x4F52, 0x27EB, 0x4F53, 0x4F53, 0x0E38, 0x4F54, 0x4F54, 0x27EC, + 0x4F55, 0x4F55, 0x0785, 0x4F56, 0x4F56, 0x27ED, 0x4F57, 0x4F57, 0x12B6, + 0x4F58, 0x4F58, 0x12F0, 0x4F59, 0x4F59, 0x10C5, 0x4F5A, 0x4F5A, 0x12B3, + 0x4F5B, 0x4F5B, 0x068D, 0x4F5C, 0x4F5C, 0x1254, 0x4F5D, 0x4F5D, 0x12B4, + 0x4F5E, 0x4F5E, 0x12B0, 0x4F5F, 0x4F5F, 0x12B5, 0x4F60, 0x4F60, 0x0B46, + 0x4F61, 0x4F62, 0x27EE, 0x4F63, 0x4F63, 0x109B, 0x4F64, 0x4F64, 0x12AA, + 0x4F65, 0x4F65, 0x12F1, 0x4F66, 0x4F66, 0x27F0, 0x4F67, 0x4F67, 0x12B1, + 0x4F68, 0x4F68, 0x27F1, 0x4F69, 0x4F69, 0x0BA6, 0x4F6A, 0x4F6B, 0x27F2, + 0x4F6C, 0x4F6C, 0x09BB, 0x4F6D, 0x4F6E, 0x27F4, 0x4F6F, 0x4F6F, 0x1019, + 0x4F70, 0x4F70, 0x03E6, 0x4F71, 0x4F72, 0x27F6, 0x4F73, 0x4F73, 0x0844, + 0x4F74, 0x4F74, 0x12BA, 0x4F75, 0x4F75, 0x27F8, 0x4F76, 0x4F76, 0x12B9, + 0x4F77, 0x4F7A, 0x27F9, 0x4F7B, 0x4F7B, 0x12C0, 0x4F7C, 0x4F7C, 0x12C2, + 0x4F7D, 0x4F7D, 0x27FD, 0x4F7E, 0x4F7E, 0x12BF, 0x4F7F, 0x4F7F, 0x0D50, + 0x4F80, 0x4F82, 0x27FE, 0x4F83, 0x4F83, 0x12BD, 0x4F84, 0x4F84, 0x11B5, + 0x4F85, 0x4F85, 0x2801, 0x4F86, 0x4F86, 0x1FF2, 0x4F87, 0x4F87, 0x2802, + 0x4F88, 0x4F88, 0x0503, 0x4F89, 0x4F89, 0x12BC, 0x4F8A, 0x4F8A, 0x2803, + 0x4F8B, 0x4F8B, 0x09E8, 0x4F8C, 0x4F8C, 0x2804, 0x4F8D, 0x4F8D, 0x0D63, + 0x4F8E, 0x4F8E, 0x2805, 0x4F8F, 0x4F8F, 0x12BE, 0x4F90, 0x4F90, 0x2806, + 0x4F91, 0x4F91, 0x12BB, 0x4F92, 0x4F93, 0x2807, 0x4F94, 0x4F94, 0x12C4, + 0x4F95, 0x4F95, 0x2809, 0x4F96, 0x4F96, 0x205D, 0x4F97, 0x4F97, 0x05F0, + 0x4F98, 0x4F9A, 0x280A, 0x4F9B, 0x4F9B, 0x0702, 0x4F9C, 0x4F9C, 0x280D, + 0x4F9D, 0x4F9D, 0x1047, 0x4F9E, 0x4F9F, 0x280E, 0x4FA0, 0x4FA0, 0x0F2D, + 0x4FA1, 0x4FA2, 0x2810, 0x4FA3, 0x4FA3, 0x0A69, 0x4FA4, 0x4FA4, 0x2812, + 0x4FA5, 0x4FA5, 0x0895, 0x4FA6, 0x4FA6, 0x118D, 0x4FA7, 0x4FA7, 0x04A7, + 0x4FA8, 0x4FA8, 0x0C45, 0x4FA9, 0x4FA9, 0x0978, 0x4FAA, 0x4FAA, 0x12C1, + 0x4FAB, 0x4FAB, 0x2813, 0x4FAC, 0x4FAC, 0x12C3, 0x4FAD, 0x4FAD, 0x2814, + 0x4FAE, 0x4FAE, 0x0EF9, 0x4FAF, 0x4FAF, 0x07A5, 0x4FB0, 0x4FB4, 0x2815, + 0x4FB5, 0x4FB5, 0x0C53, 0x4FB6, 0x4FBE, 0x281A, 0x4FBF, 0x4FBF, 0x044C, + 0x4FC0, 0x4FC1, 0x2823, 0x4FC2, 0x4FC2, 0x269C, 0x4FC3, 0x4FC3, 0x055C, + 0x4FC4, 0x4FC4, 0x062C, 0x4FC5, 0x4FC5, 0x12C8, 0x4FC6, 0x4FC9, 0x2825, + 0x4FCA, 0x4FCA, 0x092E, 0x4FCB, 0x4FCD, 0x2829, 0x4FCE, 0x4FCE, 0x12F2, + 0x4FCF, 0x4FCF, 0x0C4B, 0x4FD0, 0x4FD0, 0x09E9, 0x4FD1, 0x4FD1, 0x12CC, + 0x4FD2, 0x4FD6, 0x282C, 0x4FD7, 0x4FD7, 0x0DCC, 0x4FD8, 0x4FD8, 0x069A, + 0x4FD9, 0x4FD9, 0x2831, 0x4FDA, 0x4FDA, 0x12C9, 0x4FDB, 0x4FDB, 0x2832, + 0x4FDC, 0x4FDC, 0x12CB, 0x4FDD, 0x4FDD, 0x040C, 0x4FDE, 0x4FDE, 0x10C6, + 0x4FDF, 0x4FDF, 0x12CD, 0x4FE0, 0x4FE0, 0x21B5, 0x4FE1, 0x4FE1, 0x0F90, + 0x4FE2, 0x4FE2, 0x2833, 0x4FE3, 0x4FE3, 0x12CA, 0x4FE4, 0x4FE5, 0x2834, + 0x4FE6, 0x4FE6, 0x12C5, 0x4FE7, 0x4FE7, 0x2836, 0x4FE8, 0x4FE8, 0x12C6, + 0x4FE9, 0x4FE9, 0x09F2, 0x4FEA, 0x4FEA, 0x12C7, 0x4FEB, 0x4FEC, 0x2837, + 0x4FED, 0x4FED, 0x0866, 0x4FEE, 0x4FEE, 0x0FA9, 0x4FEF, 0x4FEF, 0x06A4, + 0x4FF0, 0x4FF0, 0x2839, 0x4FF1, 0x4FF1, 0x0912, 0x4FF2, 0x4FF2, 0x283A, + 0x4FF3, 0x4FF3, 0x12D1, 0x4FF4, 0x4FF7, 0x283B, 0x4FF8, 0x4FF8, 0x12CE, + 0x4FF9, 0x4FF9, 0x283F, 0x4FFA, 0x4FFA, 0x03BE, 0x4FFB, 0x4FFD, 0x2840, + 0x4FFE, 0x4FFE, 0x12D6, 0x4FFF, 0x4FFF, 0x2843, 0x5000, 0x5000, 0x22CC, + 0x5001, 0x5005, 0x2844, 0x5006, 0x5006, 0x2016, 0x5007, 0x5008, 0x2849, + 0x5009, 0x5009, 0x1E62, 0x500A, 0x500A, 0x284B, 0x500B, 0x500B, 0x1F20, + 0x500C, 0x500C, 0x12D8, 0x500D, 0x500D, 0x041F, 0x500E, 0x500E, 0x284C, + 0x500F, 0x500F, 0x12D3, 0x5010, 0x5010, 0x284D, 0x5011, 0x5011, 0x207F, + 0x5012, 0x5012, 0x059A, 0x5013, 0x5013, 0x284E, 0x5014, 0x5014, 0x0922, + 0x5015, 0x5017, 0x284F, 0x5018, 0x5018, 0x0E1B, 0x5019, 0x5019, 0x07A9, + 0x501A, 0x501A, 0x1057, 0x501B, 0x501B, 0x2852, 0x501C, 0x501C, 0x12D7, + 0x501D, 0x501E, 0x2853, 0x501F, 0x501F, 0x08B9, 0x5020, 0x5020, 0x2855, + 0x5021, 0x5021, 0x04D0, 0x5022, 0x5024, 0x2856, 0x5025, 0x5025, 0x12D9, + 0x5026, 0x5026, 0x091A, 0x5027, 0x5027, 0x2859, 0x5028, 0x5028, 0x12DA, + 0x5029, 0x5029, 0x12CF, 0x502A, 0x502A, 0x0B42, 0x502B, 0x502B, 0x205C, + 0x502C, 0x502C, 0x12D2, 0x502D, 0x502D, 0x12D5, 0x502E, 0x502E, 0x12D4, + 0x502F, 0x5039, 0x285A, 0x503A, 0x503A, 0x114F, 0x503B, 0x503B, 0x2865, + 0x503C, 0x503C, 0x11B4, 0x503D, 0x503D, 0x2866, 0x503E, 0x503E, 0x0C60, + 0x503F, 0x5042, 0x2867, 0x5043, 0x5043, 0x12DC, 0x5044, 0x5046, 0x286B, + 0x5047, 0x5047, 0x084C, 0x5048, 0x5048, 0x12DE, 0x5049, 0x5049, 0x2194, + 0x504A, 0x504B, 0x286E, 0x504C, 0x504C, 0x12D0, 0x504D, 0x504D, 0x2870, + 0x504E, 0x504E, 0x12DF, 0x504F, 0x504F, 0x0BCA, 0x5050, 0x5054, 0x2871, + 0x5055, 0x5055, 0x12DD, 0x5056, 0x5059, 0x2876, 0x505A, 0x505A, 0x1253, + 0x505B, 0x505B, 0x287A, 0x505C, 0x505C, 0x0E54, 0x505D, 0x5064, 0x287B, + 0x5065, 0x5065, 0x0872, 0x5066, 0x506B, 0x2883, 0x506C, 0x506C, 0x12E0, + 0x506D, 0x5073, 0x2889, 0x5074, 0x5074, 0x1E65, 0x5075, 0x5075, 0x2281, + 0x5076, 0x5076, 0x0B7D, 0x5077, 0x5077, 0x0E66, 0x5078, 0x507A, 0x2890, + 0x507B, 0x507B, 0x12E1, 0x507C, 0x507D, 0x2893, 0x507E, 0x507E, 0x12DB, + 0x507F, 0x507F, 0x04CA, 0x5080, 0x5080, 0x098B, 0x5081, 0x5084, 0x2895, + 0x5085, 0x5085, 0x06B0, 0x5086, 0x5087, 0x2899, 0x5088, 0x5088, 0x09E7, + 0x5089, 0x508C, 0x289B, 0x508D, 0x508D, 0x0403, 0x508E, 0x5095, 0x289F, + 0x5096, 0x5096, 0x22CD, 0x5097, 0x5097, 0x28A7, 0x5098, 0x5098, 0x210A, + 0x5099, 0x5099, 0x1E3E, 0x509A, 0x50A1, 0x28A8, 0x50A2, 0x50A2, 0x267F, + 0x50A3, 0x50A3, 0x0579, 0x50A4, 0x50A4, 0x28B0, 0x50A5, 0x50A5, 0x12E2, + 0x50A6, 0x50A6, 0x28B1, 0x50A7, 0x50A7, 0x12E3, 0x50A8, 0x50A8, 0x0525, + 0x50A9, 0x50A9, 0x12E4, 0x50AA, 0x50AB, 0x28B2, 0x50AC, 0x50AC, 0x0562, + 0x50AD, 0x50AD, 0x222E, 0x50AE, 0x50B1, 0x28B4, 0x50B2, 0x50B2, 0x03CC, + 0x50B3, 0x50B3, 0x1E96, 0x50B4, 0x50B4, 0x22CB, 0x50B5, 0x50B5, 0x226C, + 0x50B6, 0x50B6, 0x28B8, 0x50B7, 0x50B7, 0x2117, 0x50B8, 0x50B9, 0x28B9, + 0x50BA, 0x50BA, 0x12E5, 0x50BB, 0x50BB, 0x0CEE, 0x50BC, 0x50BD, 0x28BB, + 0x50BE, 0x50BE, 0x20E8, 0x50BF, 0x50C1, 0x28BD, 0x50C2, 0x50C2, 0x22D4, + 0x50C3, 0x50C4, 0x28C0, 0x50C5, 0x50C5, 0x1FB9, 0x50C6, 0x50C8, 0x28C2, + 0x50C9, 0x50C9, 0x22D8, 0x50CA, 0x50CE, 0x28C5, 0x50CF, 0x50CF, 0x0F5E, + 0x50D0, 0x50D0, 0x28CA, 0x50D1, 0x50D1, 0x20DF, 0x50D2, 0x50D4, 0x28CB, + 0x50D5, 0x50D5, 0x20C2, 0x50D6, 0x50D6, 0x12E6, 0x50D7, 0x50D9, 0x28CE, + 0x50DA, 0x50DA, 0x0A0E, 0x50DB, 0x50DD, 0x28D1, 0x50DE, 0x50DE, 0x2195, + 0x50DF, 0x50E4, 0x28D4, 0x50E5, 0x50E5, 0x1FAC, 0x50E6, 0x50E6, 0x12EA, + 0x50E7, 0x50E7, 0x0CE7, 0x50E8, 0x50E8, 0x22D3, 0x50E9, 0x50EB, 0x28DA, + 0x50EC, 0x50EC, 0x12E9, 0x50ED, 0x50ED, 0x12E8, 0x50EE, 0x50EE, 0x12EB, + 0x50EF, 0x50F2, 0x28DD, 0x50F3, 0x50F3, 0x0DD0, 0x50F4, 0x50F4, 0x28E1, + 0x50F5, 0x50F5, 0x087A, 0x50F6, 0x50F8, 0x28E2, 0x50F9, 0x50F9, 0x1F81, + 0x50FA, 0x50FA, 0x28E5, 0x50FB, 0x50FB, 0x0BC6, 0x50FC, 0x50FF, 0x28E6, + 0x5100, 0x5100, 0x2210, 0x5101, 0x5101, 0x28EA, 0x5102, 0x5102, 0x22CF, + 0x5103, 0x5103, 0x28EB, 0x5104, 0x5104, 0x2213, 0x5105, 0x5105, 0x28EC, + 0x5106, 0x5106, 0x12E7, 0x5107, 0x5107, 0x12EC, 0x5108, 0x5108, 0x1FE4, + 0x5109, 0x5109, 0x1F90, 0x510A, 0x510A, 0x28ED, 0x510B, 0x510B, 0x12ED, + 0x510C, 0x510F, 0x28EE, 0x5110, 0x5110, 0x22D6, 0x5111, 0x5111, 0x28F2, + 0x5112, 0x5112, 0x0CC0, 0x5113, 0x5113, 0x28F3, 0x5114, 0x5114, 0x22D0, + 0x5115, 0x5115, 0x22CE, 0x5116, 0x5117, 0x28F4, 0x5118, 0x5118, 0x2681, + 0x5119, 0x511E, 0x28F6, 0x511F, 0x511F, 0x1E76, 0x5120, 0x5120, 0x28FC, + 0x5121, 0x5121, 0x09C7, 0x5122, 0x5129, 0x28FD, 0x512A, 0x512A, 0x2231, + 0x512B, 0x5131, 0x2905, 0x5132, 0x5132, 0x1E93, 0x5133, 0x5136, 0x290C, + 0x5137, 0x5137, 0x22D2, 0x5138, 0x5139, 0x2910, 0x513A, 0x513A, 0x22D7, + 0x513B, 0x513B, 0x22D5, 0x513C, 0x513C, 0x22D1, 0x513D, 0x513E, 0x2912, + 0x513F, 0x513F, 0x0638, 0x5140, 0x5140, 0x1259, 0x5141, 0x5141, 0x110D, + 0x5142, 0x5142, 0x2914, 0x5143, 0x5143, 0x10ED, 0x5144, 0x5144, 0x0FA1, + 0x5145, 0x5145, 0x0509, 0x5146, 0x5146, 0x1178, 0x5147, 0x5147, 0x2915, + 0x5148, 0x5148, 0x0F35, 0x5149, 0x5149, 0x073B, 0x514A, 0x514A, 0x2916, + 0x514B, 0x514B, 0x0958, 0x514C, 0x514C, 0x2917, 0x514D, 0x514D, 0x0AE7, + 0x514E, 0x5150, 0x2918, 0x5151, 0x5151, 0x0611, 0x5152, 0x5152, 0x1EE5, + 0x5153, 0x5153, 0x291B, 0x5154, 0x5154, 0x0E74, 0x5155, 0x5155, 0x1302, + 0x5156, 0x5156, 0x1304, 0x5157, 0x5159, 0x291C, 0x515A, 0x515A, 0x0594, + 0x515B, 0x515B, 0x291F, 0x515C, 0x515C, 0x05F4, 0x515D, 0x5161, 0x2920, + 0x5162, 0x5162, 0x08D3, 0x5163, 0x5164, 0x2925, 0x5165, 0x5165, 0x0CC6, + 0x5166, 0x5167, 0x2927, 0x5168, 0x5168, 0x0C86, 0x5169, 0x5169, 0x2025, + 0x516A, 0x516A, 0x2929, 0x516B, 0x516B, 0x03D6, 0x516C, 0x516C, 0x0704, + 0x516D, 0x516D, 0x0A42, 0x516E, 0x516E, 0x12F6, 0x516F, 0x516F, 0x292A, + 0x5170, 0x5170, 0x09A7, 0x5171, 0x5171, 0x070B, 0x5172, 0x5172, 0x292B, + 0x5173, 0x5173, 0x0731, 0x5174, 0x5174, 0x0F96, 0x5175, 0x5175, 0x0461, + 0x5176, 0x5176, 0x0C03, 0x5177, 0x5177, 0x090E, 0x5178, 0x5178, 0x05C5, + 0x5179, 0x5179, 0x1225, 0x517A, 0x517A, 0x292C, 0x517B, 0x517B, 0x1021, + 0x517C, 0x517C, 0x0859, 0x517D, 0x517D, 0x0D75, 0x517E, 0x517F, 0x292D, + 0x5180, 0x5180, 0x0830, 0x5181, 0x5181, 0x12FA, 0x5182, 0x5182, 0x129D, + 0x5183, 0x5184, 0x292F, 0x5185, 0x5185, 0x0B3D, 0x5186, 0x5187, 0x2931, + 0x5188, 0x5188, 0x06CF, 0x5189, 0x5189, 0x0C98, 0x518A, 0x518B, 0x2933, + 0x518C, 0x518C, 0x04A8, 0x518D, 0x518D, 0x111C, 0x518E, 0x5191, 0x2935, + 0x5192, 0x5192, 0x0AB5, 0x5193, 0x5194, 0x2939, 0x5195, 0x5195, 0x0AE6, + 0x5196, 0x5196, 0x1314, 0x5197, 0x5197, 0x0CBA, 0x5198, 0x5198, 0x293B, + 0x5199, 0x5199, 0x0F7F, 0x519A, 0x519A, 0x293C, 0x519B, 0x519B, 0x092B, + 0x519C, 0x519C, 0x0B6A, 0x519D, 0x519F, 0x293D, 0x51A0, 0x51A0, 0x0733, + 0x51A1, 0x51A1, 0x2940, 0x51A2, 0x51A2, 0x1315, 0x51A3, 0x51A3, 0x2941, + 0x51A4, 0x51A4, 0x10EC, 0x51A5, 0x51A5, 0x1316, 0x51A6, 0x51AA, 0x2942, + 0x51AB, 0x51AB, 0x130F, 0x51AC, 0x51AC, 0x05EB, 0x51AD, 0x51AE, 0x2947, + 0x51AF, 0x51AF, 0x0688, 0x51B0, 0x51B0, 0x0462, 0x51B1, 0x51B1, 0x1310, + 0x51B2, 0x51B2, 0x050A, 0x51B3, 0x51B3, 0x0925, 0x51B4, 0x51B4, 0x2949, + 0x51B5, 0x51B5, 0x0983, 0x51B6, 0x51B6, 0x1038, 0x51B7, 0x51B7, 0x09CF, + 0x51B8, 0x51BA, 0x294A, 0x51BB, 0x51BB, 0x05F2, 0x51BC, 0x51BC, 0x1312, + 0x51BD, 0x51BD, 0x1311, 0x51BE, 0x51BF, 0x294D, 0x51C0, 0x51C0, 0x08EA, + 0x51C1, 0x51C3, 0x294F, 0x51C4, 0x51C4, 0x0BFF, 0x51C5, 0x51C5, 0x2952, + 0x51C6, 0x51C6, 0x1219, 0x51C7, 0x51C7, 0x1313, 0x51C8, 0x51C8, 0x2953, + 0x51C9, 0x51C9, 0x0A02, 0x51CA, 0x51CA, 0x2954, 0x51CB, 0x51CB, 0x05D3, + 0x51CC, 0x51CC, 0x0A31, 0x51CD, 0x51CD, 0x1ECF, 0x51CE, 0x51CE, 0x2955, + 0x51CF, 0x51CF, 0x0868, 0x51D0, 0x51D0, 0x2956, 0x51D1, 0x51D1, 0x0558, + 0x51D2, 0x51DA, 0x2957, 0x51DB, 0x51DB, 0x0A26, 0x51DC, 0x51DC, 0x2960, + 0x51DD, 0x51DD, 0x0B60, 0x51DE, 0x51DF, 0x2961, 0x51E0, 0x51E0, 0x082B, + 0x51E1, 0x51E1, 0x064F, 0x51E2, 0x51E3, 0x2963, 0x51E4, 0x51E4, 0x068C, + 0x51E5, 0x51EA, 0x2965, 0x51EB, 0x51EB, 0x1300, 0x51EC, 0x51EC, 0x296B, + 0x51ED, 0x51ED, 0x0BDD, 0x51EE, 0x51EE, 0x296C, 0x51EF, 0x51EF, 0x093A, + 0x51F0, 0x51F0, 0x07E0, 0x51F1, 0x51F1, 0x1FD9, 0x51F2, 0x51F2, 0x296D, + 0x51F3, 0x51F3, 0x05AB, 0x51F4, 0x51F4, 0x296E, 0x51F5, 0x51F5, 0x1399, + 0x51F6, 0x51F6, 0x0FA2, 0x51F7, 0x51F7, 0x296F, 0x51F8, 0x51F8, 0x0E6A, + 0x51F9, 0x51F9, 0x03C7, 0x51FA, 0x51FA, 0x051B, 0x51FB, 0x51FB, 0x080C, + 0x51FC, 0x51FC, 0x139A, 0x51FD, 0x51FD, 0x0766, 0x51FE, 0x51FE, 0x2970, + 0x51FF, 0x51FF, 0x1127, 0x5200, 0x5200, 0x0597, 0x5201, 0x5201, 0x05D4, + 0x5202, 0x5202, 0x128C, 0x5203, 0x5203, 0x0CAB, 0x5204, 0x5205, 0x2971, + 0x5206, 0x5206, 0x0673, 0x5207, 0x5207, 0x0C4D, 0x5208, 0x5208, 0x128D, + 0x5209, 0x5209, 0x2973, 0x520A, 0x520A, 0x093C, 0x520B, 0x520C, 0x2974, + 0x520D, 0x520D, 0x138B, 0x520E, 0x520E, 0x128E, 0x520F, 0x5210, 0x2976, + 0x5211, 0x5211, 0x0F97, 0x5212, 0x5212, 0x07C3, 0x5213, 0x5215, 0x2978, + 0x5216, 0x5216, 0x196E, 0x5217, 0x5217, 0x0A19, 0x5218, 0x5218, 0x0A3E, + 0x5219, 0x5219, 0x1135, 0x521A, 0x521A, 0x06D0, 0x521B, 0x521B, 0x0537, + 0x521C, 0x521C, 0x297B, 0x521D, 0x521D, 0x051A, 0x521E, 0x521F, 0x297C, + 0x5220, 0x5220, 0x0CF7, 0x5221, 0x5223, 0x297E, 0x5224, 0x5224, 0x0B91, + 0x5225, 0x5227, 0x2981, 0x5228, 0x5228, 0x0B9A, 0x5229, 0x5229, 0x09E6, + 0x522A, 0x522A, 0x2984, 0x522B, 0x522B, 0x0459, 0x522C, 0x522C, 0x2985, + 0x522D, 0x522D, 0x128F, 0x522E, 0x522E, 0x0727, 0x522F, 0x522F, 0x2986, + 0x5230, 0x5230, 0x059E, 0x5231, 0x5232, 0x2987, 0x5233, 0x5233, 0x1290, + 0x5234, 0x5235, 0x2989, 0x5236, 0x5236, 0x11C5, 0x5237, 0x5237, 0x0D97, + 0x5238, 0x5238, 0x0C8A, 0x5239, 0x5239, 0x0CEB, 0x523A, 0x523A, 0x054F, + 0x523B, 0x523B, 0x0959, 0x523C, 0x523C, 0x298B, 0x523D, 0x523D, 0x074D, + 0x523E, 0x523E, 0x298C, 0x523F, 0x5240, 0x1291, 0x5241, 0x5241, 0x0626, + 0x5242, 0x5242, 0x0834, 0x5243, 0x5243, 0x0E3D, 0x5244, 0x5244, 0x22C8, + 0x5245, 0x5246, 0x298D, 0x5247, 0x5247, 0x2263, 0x5248, 0x5249, 0x298F, + 0x524A, 0x524A, 0x0F64, 0x524B, 0x524B, 0x2683, 0x524C, 0x524C, 0x1293, + 0x524D, 0x524D, 0x0C2D, 0x524E, 0x524F, 0x2991, 0x5250, 0x5250, 0x0729, + 0x5251, 0x5251, 0x0874, 0x5252, 0x5253, 0x2993, 0x5254, 0x5254, 0x0E31, + 0x5255, 0x5255, 0x2995, 0x5256, 0x5256, 0x0BE9, 0x5257, 0x525A, 0x2996, + 0x525B, 0x525B, 0x1F17, 0x525C, 0x525C, 0x1296, 0x525D, 0x525D, 0x299A, + 0x525E, 0x525E, 0x1294, 0x525F, 0x5260, 0x299B, 0x5261, 0x5261, 0x1295, + 0x5262, 0x5264, 0x299D, 0x5265, 0x5265, 0x0409, 0x5266, 0x5266, 0x29A0, + 0x5267, 0x5267, 0x0916, 0x5268, 0x5268, 0x29A1, 0x5269, 0x5269, 0x0D3A, + 0x526A, 0x526A, 0x0867, 0x526B, 0x526D, 0x29A2, 0x526E, 0x526E, 0x1F2B, + 0x526F, 0x526F, 0x06AC, 0x5270, 0x5271, 0x29A5, 0x5272, 0x5272, 0x06E9, + 0x5273, 0x5273, 0x29A7, 0x5274, 0x5274, 0x22CA, 0x5275, 0x5275, 0x1E99, + 0x5276, 0x527C, 0x29A8, 0x527D, 0x527D, 0x1298, 0x527E, 0x527E, 0x29AF, + 0x527F, 0x527F, 0x089C, 0x5280, 0x5280, 0x29B0, 0x5281, 0x5281, 0x129A, + 0x5282, 0x5282, 0x1299, 0x5283, 0x5283, 0x1F4F, 0x5284, 0x5286, 0x29B1, + 0x5287, 0x5287, 0x1FCF, 0x5288, 0x5288, 0x0BBD, 0x5289, 0x5289, 0x2036, + 0x528A, 0x528A, 0x1F3A, 0x528B, 0x528B, 0x29B4, 0x528C, 0x528C, 0x22C9, + 0x528D, 0x528D, 0x1F99, 0x528E, 0x528F, 0x29B5, 0x5290, 0x5290, 0x129B, + 0x5291, 0x5291, 0x1F75, 0x5292, 0x5292, 0x29B7, 0x5293, 0x5293, 0x129C, + 0x5294, 0x529A, 0x29B8, 0x529B, 0x529B, 0x09EF, 0x529C, 0x529C, 0x29BF, + 0x529D, 0x529D, 0x0C8B, 0x529E, 0x529E, 0x03F7, 0x529F, 0x529F, 0x06FF, + 0x52A0, 0x52A0, 0x0846, 0x52A1, 0x52A1, 0x0F00, 0x52A2, 0x52A2, 0x138D, + 0x52A3, 0x52A3, 0x0A1C, 0x52A4, 0x52A7, 0x29C0, 0x52A8, 0x52A8, 0x05EE, + 0x52A9, 0x52A9, 0x11F9, 0x52AA, 0x52AA, 0x0B6D, 0x52AB, 0x52AB, 0x08AA, + 0x52AC, 0x52AD, 0x138E, 0x52AE, 0x52B0, 0x29C4, 0x52B1, 0x52B1, 0x09E3, + 0x52B2, 0x52B2, 0x08D1, 0x52B3, 0x52B3, 0x09B8, 0x52B4, 0x52BD, 0x29C7, + 0x52BE, 0x52BE, 0x1390, 0x52BF, 0x52BF, 0x0D5D, 0x52C0, 0x52C0, 0x29D1, + 0x52C1, 0x52C1, 0x1FBE, 0x52C2, 0x52C2, 0x29D2, 0x52C3, 0x52C3, 0x0471, + 0x52C4, 0x52C6, 0x29D3, 0x52C7, 0x52C7, 0x10A7, 0x52C8, 0x52C8, 0x29D6, + 0x52C9, 0x52C9, 0x0AE8, 0x52CA, 0x52CA, 0x29D7, 0x52CB, 0x52CB, 0x0FD4, + 0x52CC, 0x52CF, 0x29D8, 0x52D0, 0x52D0, 0x1392, 0x52D1, 0x52D1, 0x29DC, + 0x52D2, 0x52D2, 0x09C0, 0x52D3, 0x52D4, 0x29DD, 0x52D5, 0x52D5, 0x1ECD, + 0x52D6, 0x52D6, 0x1393, 0x52D7, 0x52D7, 0x29DF, 0x52D8, 0x52D8, 0x093E, + 0x52D9, 0x52D9, 0x21A9, 0x52DA, 0x52DA, 0x29E0, 0x52DB, 0x52DB, 0x21E6, + 0x52DC, 0x52DC, 0x29E1, 0x52DD, 0x52DD, 0x2127, 0x52DE, 0x52DE, 0x2003, + 0x52DF, 0x52DF, 0x0B1F, 0x52E0, 0x52E1, 0x29E2, 0x52E2, 0x52E2, 0x2132, + 0x52E3, 0x52E3, 0x29E4, 0x52E4, 0x52E4, 0x0C57, 0x52E5, 0x52EF, 0x29E5, + 0x52F0, 0x52F0, 0x1394, 0x52F1, 0x52F1, 0x2323, 0x52F2, 0x52F4, 0x29F0, + 0x52F5, 0x52F5, 0x2011, 0x52F6, 0x52F7, 0x29F3, 0x52F8, 0x52F8, 0x20F5, + 0x52F9, 0x52F9, 0x12FC, 0x52FA, 0x52FA, 0x0D10, 0x52FB, 0x52FD, 0x29F5, + 0x52FE, 0x52FE, 0x070D, 0x52FF, 0x52FF, 0x0EFF, 0x5300, 0x5300, 0x110B, + 0x5301, 0x5304, 0x29F8, 0x5305, 0x5305, 0x0407, 0x5306, 0x5306, 0x0555, + 0x5307, 0x5307, 0x29FC, 0x5308, 0x5308, 0x0FA4, 0x5309, 0x530C, 0x29FD, + 0x530D, 0x530D, 0x12FD, 0x530E, 0x530E, 0x2A01, 0x530F, 0x530F, 0x14B5, + 0x5310, 0x5310, 0x12FF, 0x5311, 0x5314, 0x2A02, 0x5315, 0x5315, 0x1266, + 0x5316, 0x5316, 0x07C4, 0x5317, 0x5317, 0x041A, 0x5318, 0x5318, 0x2A06, + 0x5319, 0x5319, 0x04FC, 0x531A, 0x531A, 0x1284, 0x531B, 0x531C, 0x2A07, + 0x531D, 0x531D, 0x1114, 0x531E, 0x531F, 0x2A09, 0x5320, 0x5320, 0x0884, + 0x5321, 0x5321, 0x097C, 0x5322, 0x5322, 0x2A0B, 0x5323, 0x5323, 0x0F28, + 0x5324, 0x5325, 0x2A0C, 0x5326, 0x5326, 0x1286, 0x5327, 0x5329, 0x2A0E, + 0x532A, 0x532A, 0x0668, 0x532B, 0x532C, 0x2A11, 0x532D, 0x532D, 0x22C5, + 0x532E, 0x532E, 0x1287, 0x532F, 0x532F, 0x1F5E, 0x5330, 0x5330, 0x2A13, + 0x5331, 0x5331, 0x22C6, 0x5332, 0x5338, 0x2A14, 0x5339, 0x5339, 0x0BC4, + 0x533A, 0x533A, 0x0C75, 0x533B, 0x533B, 0x1044, 0x533C, 0x533D, 0x2A1B, + 0x533E, 0x533E, 0x1288, 0x533F, 0x533F, 0x0B47, 0x5340, 0x5340, 0x20EF, + 0x5341, 0x5341, 0x0D45, 0x5342, 0x5342, 0x2A1D, 0x5343, 0x5343, 0x0C24, + 0x5344, 0x5344, 0x2A1E, 0x5345, 0x5345, 0x125C, 0x5346, 0x5346, 0x2A1F, + 0x5347, 0x5347, 0x0D36, 0x5348, 0x5348, 0x0EF6, 0x5349, 0x5349, 0x07F1, + 0x534A, 0x534A, 0x03F6, 0x534B, 0x534D, 0x2A20, 0x534E, 0x534E, 0x07BF, + 0x534F, 0x534F, 0x0F78, 0x5350, 0x5350, 0x2A23, 0x5351, 0x5351, 0x0419, + 0x5352, 0x5352, 0x1241, 0x5353, 0x5353, 0x121C, 0x5354, 0x5354, 0x21D0, + 0x5355, 0x5355, 0x0586, 0x5356, 0x5356, 0x0A9B, 0x5357, 0x5357, 0x0B32, + 0x5358, 0x5359, 0x2A24, 0x535A, 0x535A, 0x0470, 0x535B, 0x535B, 0x2A26, + 0x535C, 0x535C, 0x047E, 0x535D, 0x535D, 0x2A27, 0x535E, 0x535E, 0x044E, + 0x535F, 0x535F, 0x14FA, 0x5360, 0x5360, 0x115D, 0x5361, 0x5361, 0x0935, + 0x5362, 0x5362, 0x0A53, 0x5363, 0x5363, 0x128B, 0x5364, 0x5364, 0x0A58, + 0x5365, 0x5365, 0x2A28, 0x5366, 0x5366, 0x128A, 0x5367, 0x5367, 0x0EE3, + 0x5368, 0x5368, 0x2A29, 0x5369, 0x5369, 0x1352, 0x536A, 0x536A, 0x2A2A, + 0x536B, 0x536B, 0x0ECF, 0x536C, 0x536D, 0x2A2B, 0x536E, 0x536E, 0x126A, + 0x536F, 0x536F, 0x0AB3, 0x5370, 0x5370, 0x1086, 0x5371, 0x5371, 0x0EB2, + 0x5372, 0x5372, 0x2A2D, 0x5373, 0x5373, 0x0827, 0x5374, 0x5374, 0x0C8F, + 0x5375, 0x5375, 0x0A78, 0x5376, 0x5376, 0x2A2E, 0x5377, 0x5377, 0x091C, + 0x5378, 0x5378, 0x0F81, 0x5379, 0x5379, 0x2A2F, 0x537A, 0x537A, 0x1353, + 0x537B, 0x537E, 0x2A30, 0x537F, 0x537F, 0x0C61, 0x5380, 0x5381, 0x2A34, + 0x5382, 0x5382, 0x04CC, 0x5383, 0x5383, 0x2A36, 0x5384, 0x5384, 0x0631, + 0x5385, 0x5385, 0x0E4F, 0x5386, 0x5386, 0x09E5, 0x5387, 0x5388, 0x2A37, + 0x5389, 0x5389, 0x09E2, 0x538A, 0x538A, 0x2A39, 0x538B, 0x538B, 0x0FE2, + 0x538C, 0x538C, 0x100A, 0x538D, 0x538D, 0x127D, 0x538E, 0x5394, 0x2A3A, + 0x5395, 0x5395, 0x04A5, 0x5396, 0x5397, 0x2A41, 0x5398, 0x5398, 0x09D0, + 0x5399, 0x5399, 0x22C1, 0x539A, 0x539A, 0x07A8, 0x539B, 0x539C, 0x2A43, + 0x539D, 0x539D, 0x127E, 0x539E, 0x539E, 0x2A45, 0x539F, 0x539F, 0x10F0, + 0x53A0, 0x53A0, 0x1E64, 0x53A1, 0x53A1, 0x2A46, 0x53A2, 0x53A2, 0x0F4E, + 0x53A3, 0x53A3, 0x127F, 0x53A4, 0x53A4, 0x2A47, 0x53A5, 0x53A5, 0x1280, + 0x53A6, 0x53A6, 0x0F30, 0x53A7, 0x53A7, 0x2A48, 0x53A8, 0x53A8, 0x051D, + 0x53A9, 0x53A9, 0x08F6, 0x53AA, 0x53AC, 0x2A49, 0x53AD, 0x53AD, 0x21F9, + 0x53AE, 0x53AE, 0x1281, 0x53AF, 0x53B1, 0x2A4C, 0x53B2, 0x53B2, 0x2010, + 0x53B3, 0x53B3, 0x2A4F, 0x53B4, 0x53B4, 0x22C2, 0x53B5, 0x53B5, 0x2A50, + 0x53B6, 0x53B6, 0x139C, 0x53B7, 0x53BA, 0x2A51, 0x53BB, 0x53BB, 0x0C80, + 0x53BC, 0x53BE, 0x2A55, 0x53BF, 0x53BF, 0x0F45, 0x53C0, 0x53C0, 0x2A58, + 0x53C1, 0x53C1, 0x0CD9, 0x53C2, 0x53C2, 0x0495, 0x53C3, 0x53C3, 0x1E5A, + 0x53C4, 0x53C7, 0x2A59, 0x53C8, 0x53C8, 0x10BB, 0x53C9, 0x53C9, 0x04AD, + 0x53CA, 0x53CA, 0x0823, 0x53CB, 0x53CB, 0x10B6, 0x53CC, 0x53CC, 0x0DA0, + 0x53CD, 0x53CD, 0x0651, 0x53CE, 0x53D0, 0x2A5D, 0x53D1, 0x53D1, 0x063F, + 0x53D2, 0x53D3, 0x2A60, 0x53D4, 0x53D4, 0x0D7C, 0x53D5, 0x53D5, 0x2A62, + 0x53D6, 0x53D6, 0x0C7C, 0x53D7, 0x53D7, 0x0D73, 0x53D8, 0x53D8, 0x044D, + 0x53D9, 0x53D9, 0x0FBB, 0x53DA, 0x53DA, 0x2A63, 0x53DB, 0x53DB, 0x0B92, + 0x53DC, 0x53DE, 0x2A64, 0x53DF, 0x53DF, 0x1395, 0x53E0, 0x53E0, 0x05DF, + 0x53E1, 0x53E1, 0x2A67, 0x53E2, 0x53E2, 0x1EA2, 0x53E3, 0x53E3, 0x0967, + 0x53E4, 0x53E4, 0x071E, 0x53E5, 0x53E5, 0x0913, 0x53E6, 0x53E6, 0x0A36, + 0x53E7, 0x53E7, 0x2A68, 0x53E8, 0x53E8, 0x14FE, 0x53E9, 0x53E9, 0x14FD, + 0x53EA, 0x53EA, 0x11BA, 0x53EB, 0x53EB, 0x08A1, 0x53EC, 0x53EC, 0x117A, + 0x53ED, 0x53ED, 0x03D3, 0x53EE, 0x53EE, 0x05E2, 0x53EF, 0x53EF, 0x0956, + 0x53F0, 0x53F0, 0x0DFB, 0x53F1, 0x53F1, 0x14FB, 0x53F2, 0x53F2, 0x0D4E, + 0x53F3, 0x53F3, 0x10B7, 0x53F4, 0x53F4, 0x2A69, 0x53F5, 0x53F5, 0x1285, + 0x53F6, 0x53F6, 0x103D, 0x53F7, 0x53F7, 0x077C, 0x53F8, 0x53F8, 0x0DB3, + 0x53F9, 0x53F9, 0x0E11, 0x53FA, 0x53FA, 0x2A6A, 0x53FB, 0x53FB, 0x14FF, + 0x53FC, 0x53FC, 0x05D1, 0x53FD, 0x53FD, 0x14FC, 0x53FE, 0x53FF, 0x2A6B, + 0x5400, 0x5400, 0x2A6D, 0x5401, 0x5401, 0x10DA, 0x5402, 0x5402, 0x2A6E, + 0x5403, 0x5403, 0x04F9, 0x5404, 0x5404, 0x06F2, 0x5405, 0x5405, 0x2A6F, + 0x5406, 0x5406, 0x1502, 0x5407, 0x5407, 0x2A70, 0x5408, 0x5408, 0x0786, + 0x5409, 0x5409, 0x081D, 0x540A, 0x540A, 0x05D6, 0x540B, 0x540B, 0x2A71, + 0x540C, 0x540C, 0x0E5D, 0x540D, 0x540D, 0x0B00, 0x540E, 0x540E, 0x07AA, + 0x540F, 0x540F, 0x09DF, 0x5410, 0x5410, 0x0E73, 0x5411, 0x5411, 0x0F5F, + 0x5412, 0x5412, 0x1500, 0x5413, 0x5413, 0x0F32, 0x5414, 0x5414, 0x2A72, + 0x5415, 0x5415, 0x0A67, 0x5416, 0x5416, 0x1501, 0x5417, 0x5417, 0x0A97, + 0x5418, 0x541A, 0x2A73, 0x541B, 0x541B, 0x092C, 0x541C, 0x541C, 0x2A76, + 0x541D, 0x541D, 0x0A28, 0x541E, 0x541E, 0x0E7D, 0x541F, 0x541F, 0x107E, + 0x5420, 0x5420, 0x066A, 0x5421, 0x5421, 0x1509, 0x5422, 0x5422, 0x2A77, + 0x5423, 0x5423, 0x150C, 0x5424, 0x5425, 0x2A78, 0x5426, 0x5426, 0x068E, + 0x5427, 0x5427, 0x03D4, 0x5428, 0x5428, 0x0615, 0x5429, 0x5429, 0x0671, + 0x542A, 0x542A, 0x2A7A, 0x542B, 0x542B, 0x0763, 0x542C, 0x542C, 0x0E50, + 0x542D, 0x542D, 0x0961, 0x542E, 0x542E, 0x0DA6, 0x542F, 0x542F, 0x0C13, + 0x5430, 0x5430, 0x2A7B, 0x5431, 0x5431, 0x11A7, 0x5432, 0x5432, 0x150D, + 0x5433, 0x5433, 0x2A7C, 0x5434, 0x5434, 0x0EF1, 0x5435, 0x5435, 0x04D8, + 0x5436, 0x5437, 0x2A7D, 0x5438, 0x5438, 0x0F0B, 0x5439, 0x5439, 0x0538, + 0x543A, 0x543A, 0x2A7F, 0x543B, 0x543B, 0x0ED6, 0x543C, 0x543C, 0x07A7, + 0x543D, 0x543D, 0x2A80, 0x543E, 0x543E, 0x0EF0, 0x543F, 0x543F, 0x2A81, + 0x5440, 0x5440, 0x0FE6, 0x5441, 0x5442, 0x2A82, 0x5443, 0x5443, 0x1508, + 0x5444, 0x5445, 0x2A84, 0x5446, 0x5446, 0x0577, 0x5447, 0x5447, 0x2A86, + 0x5448, 0x5448, 0x04EF, 0x5449, 0x5449, 0x2A87, 0x544A, 0x544A, 0x06E1, + 0x544B, 0x544B, 0x1503, 0x544C, 0x544F, 0x2A88, 0x5450, 0x5450, 0x0B28, + 0x5451, 0x5451, 0x2A8C, 0x5452, 0x5454, 0x1504, 0x5455, 0x5455, 0x0B7C, + 0x5456, 0x5456, 0x1507, 0x5457, 0x5457, 0x150A, 0x5458, 0x5458, 0x10F4, + 0x5459, 0x5459, 0x150B, 0x545A, 0x545A, 0x2A8D, 0x545B, 0x545B, 0x0C37, + 0x545C, 0x545C, 0x0EE7, 0x545D, 0x5461, 0x2A8E, 0x5462, 0x5462, 0x0B3B, + 0x5463, 0x5463, 0x2A93, 0x5464, 0x5464, 0x1512, 0x5465, 0x5465, 0x2A94, + 0x5466, 0x5466, 0x1517, 0x5467, 0x5467, 0x2A95, 0x5468, 0x5468, 0x11DB, + 0x5469, 0x5470, 0x2A96, 0x5471, 0x5471, 0x1511, 0x5472, 0x5472, 0x1522, + 0x5473, 0x5473, 0x0EC5, 0x5474, 0x5474, 0x2A9E, 0x5475, 0x5475, 0x077E, + 0x5476, 0x5476, 0x1516, 0x5477, 0x5477, 0x1510, 0x5478, 0x5478, 0x0B9F, + 0x5479, 0x547A, 0x2A9F, 0x547B, 0x547B, 0x0D24, 0x547C, 0x547C, 0x07AB, + 0x547D, 0x547D, 0x0B01, 0x547E, 0x547F, 0x2AA1, 0x5480, 0x5480, 0x0906, + 0x5481, 0x5481, 0x2AA3, 0x5482, 0x5482, 0x150E, 0x5483, 0x5483, 0x2AA4, + 0x5484, 0x5484, 0x1515, 0x5485, 0x5485, 0x2AA5, 0x5486, 0x5486, 0x0B99, + 0x5487, 0x548A, 0x2AA6, 0x548B, 0x548B, 0x1147, 0x548C, 0x548C, 0x0784, + 0x548D, 0x548D, 0x2AAA, 0x548E, 0x548E, 0x08FB, 0x548F, 0x548F, 0x10A2, + 0x5490, 0x5490, 0x06BB, 0x5491, 0x5491, 0x2AAB, 0x5492, 0x5492, 0x11E3, + 0x5493, 0x5493, 0x2AAC, 0x5494, 0x5494, 0x150F, 0x5495, 0x5495, 0x0717, + 0x5496, 0x5496, 0x0934, 0x5497, 0x5498, 0x2AAD, 0x5499, 0x5499, 0x0A45, + 0x549A, 0x549B, 0x1513, 0x549C, 0x549C, 0x2AAF, 0x549D, 0x549D, 0x1518, + 0x549E, 0x54A2, 0x2AB0, 0x54A3, 0x54A3, 0x1523, 0x54A4, 0x54A4, 0x152D, + 0x54A5, 0x54A5, 0x2AB5, 0x54A6, 0x54A6, 0x151F, 0x54A7, 0x54A7, 0x151E, + 0x54A8, 0x54A8, 0x1226, 0x54A9, 0x54AA, 0x152B, 0x54AB, 0x54AB, 0x1767, + 0x54AC, 0x54AC, 0x102E, 0x54AD, 0x54AD, 0x151A, 0x54AE, 0x54AE, 0x2AB6, + 0x54AF, 0x54AF, 0x0936, 0x54B0, 0x54B0, 0x2AB7, 0x54B1, 0x54B1, 0x111E, + 0x54B2, 0x54B2, 0x2AB8, 0x54B3, 0x54B3, 0x0955, 0x54B4, 0x54B4, 0x151C, + 0x54B5, 0x54B7, 0x2AB9, 0x54B8, 0x54B8, 0x0F39, 0x54B9, 0x54BA, 0x2ABC, + 0x54BB, 0x54BB, 0x1525, 0x54BC, 0x54BC, 0x236D, 0x54BD, 0x54BD, 0x0FF3, + 0x54BE, 0x54BE, 0x2ABE, 0x54BF, 0x54BF, 0x1526, 0x54C0, 0x54C0, 0x03B2, + 0x54C1, 0x54C1, 0x0BD6, 0x54C2, 0x54C2, 0x151B, 0x54C3, 0x54C3, 0x2ABF, + 0x54C4, 0x54C4, 0x079C, 0x54C5, 0x54C5, 0x2AC0, 0x54C6, 0x54C6, 0x061E, + 0x54C7, 0x54C7, 0x0E8C, 0x54C8, 0x54C8, 0x0757, 0x54C9, 0x54C9, 0x1118, + 0x54CA, 0x54CB, 0x2AC1, 0x54CC, 0x54CC, 0x1527, 0x54CD, 0x54CD, 0x0F59, + 0x54CE, 0x54CE, 0x03B0, 0x54CF, 0x54CF, 0x152F, 0x54D0, 0x54D0, 0x1519, + 0x54D1, 0x54D1, 0x0FEF, 0x54D2, 0x54D2, 0x151D, 0x54D3, 0x54D4, 0x1520, + 0x54D5, 0x54D5, 0x1524, 0x54D6, 0x54D6, 0x2AC3, 0x54D7, 0x54D7, 0x07BE, + 0x54D8, 0x54D8, 0x2AC4, 0x54D9, 0x54DA, 0x1528, 0x54DB, 0x54DB, 0x2AC5, + 0x54DC, 0x54DC, 0x152A, 0x54DD, 0x54DD, 0x152E, 0x54DE, 0x54DE, 0x1530, + 0x54DF, 0x54DF, 0x1099, 0x54E0, 0x54E0, 0x2AC6, 0x54E1, 0x54E1, 0x2247, + 0x54E2, 0x54E4, 0x2AC7, 0x54E5, 0x54E5, 0x06E2, 0x54E6, 0x54E6, 0x0B77, + 0x54E7, 0x54E7, 0x1532, 0x54E8, 0x54E8, 0x0D13, 0x54E9, 0x54E9, 0x09F1, + 0x54EA, 0x54EA, 0x0B27, 0x54EB, 0x54EC, 0x2ACA, 0x54ED, 0x54ED, 0x096B, + 0x54EE, 0x54EE, 0x0F65, 0x54EF, 0x54F1, 0x2ACC, 0x54F2, 0x54F2, 0x117D, + 0x54F3, 0x54F3, 0x1536, 0x54F4, 0x54F9, 0x2ACF, 0x54FA, 0x54FA, 0x047F, + 0x54FB, 0x54FB, 0x2AD5, 0x54FC, 0x54FC, 0x0796, 0x54FD, 0x54FD, 0x1534, + 0x54FE, 0x54FE, 0x2AD6, 0x54FF, 0x54FF, 0x1391, 0x5500, 0x5500, 0x2AD7, + 0x5501, 0x5501, 0x100D, 0x5502, 0x5503, 0x2AD8, 0x5504, 0x5504, 0x236C, + 0x5505, 0x5505, 0x2ADA, 0x5506, 0x5506, 0x0DE9, 0x5507, 0x5507, 0x0540, + 0x5508, 0x5508, 0x2ADB, 0x5509, 0x5509, 0x03B1, 0x550A, 0x550E, 0x2ADC, + 0x550F, 0x550F, 0x1539, 0x5510, 0x5510, 0x0E19, 0x5511, 0x5511, 0x153A, + 0x5512, 0x5513, 0x2AE1, 0x5514, 0x5514, 0x1535, 0x5515, 0x551A, 0x2AE3, + 0x551B, 0x551B, 0x1531, 0x551C, 0x551F, 0x2AE9, 0x5520, 0x5520, 0x1533, + 0x5521, 0x5521, 0x2AED, 0x5522, 0x5523, 0x1537, 0x5524, 0x5524, 0x07D2, + 0x5525, 0x5526, 0x2AEE, 0x5527, 0x5527, 0x153B, 0x5528, 0x5529, 0x2AF0, + 0x552A, 0x552A, 0x153C, 0x552B, 0x552B, 0x2AF2, 0x552C, 0x552C, 0x07B8, + 0x552D, 0x552D, 0x2AF3, 0x552E, 0x552E, 0x0D72, 0x552F, 0x552F, 0x0EB7, + 0x5530, 0x5530, 0x154D, 0x5531, 0x5531, 0x04CF, 0x5532, 0x5532, 0x2AF4, + 0x5533, 0x5533, 0x154C, 0x5534, 0x5536, 0x2AF5, 0x5537, 0x5537, 0x1547, + 0x5538, 0x553B, 0x2AF8, 0x553C, 0x553C, 0x1546, 0x553D, 0x553D, 0x2AFC, + 0x553E, 0x553E, 0x0E8A, 0x553F, 0x553F, 0x1544, 0x5540, 0x5540, 0x2AFD, + 0x5541, 0x5541, 0x1542, 0x5542, 0x5542, 0x2AFE, 0x5543, 0x5543, 0x095D, + 0x5544, 0x5544, 0x1221, 0x5545, 0x5545, 0x2AFF, 0x5546, 0x5546, 0x0D05, + 0x5547, 0x5548, 0x2B00, 0x5549, 0x5549, 0x1540, 0x554A, 0x554A, 0x03AC, + 0x554B, 0x554E, 0x2B02, 0x554F, 0x554F, 0x219C, 0x5550, 0x5550, 0x1545, + 0x5551, 0x5552, 0x2B06, 0x5553, 0x5553, 0x20C9, 0x5554, 0x5554, 0x2B08, + 0x5555, 0x5555, 0x1543, 0x5556, 0x5556, 0x1548, 0x5557, 0x555B, 0x2B09, + 0x555C, 0x555C, 0x154E, 0x555D, 0x555D, 0x2B0E, 0x555E, 0x555E, 0x21F0, + 0x555F, 0x5560, 0x2B0F, 0x5561, 0x5561, 0x0665, 0x5562, 0x5563, 0x2B11, + 0x5564, 0x5564, 0x0BC0, 0x5565, 0x5565, 0x0CEF, 0x5566, 0x5566, 0x099D, + 0x5567, 0x5567, 0x153D, 0x5568, 0x5569, 0x2B13, 0x556A, 0x556A, 0x0B7F, + 0x556B, 0x556B, 0x2B15, 0x556C, 0x556C, 0x127A, 0x556D, 0x556D, 0x1541, + 0x556E, 0x556E, 0x0B59, 0x556F, 0x5574, 0x2B16, 0x5575, 0x5577, 0x1549, + 0x5578, 0x5578, 0x0F70, 0x5579, 0x557A, 0x2B1C, 0x557B, 0x557B, 0x155A, + 0x557C, 0x557C, 0x0E37, 0x557D, 0x557D, 0x2B1E, 0x557E, 0x557E, 0x1557, + 0x557F, 0x557F, 0x2B1F, 0x5580, 0x5580, 0x0933, 0x5581, 0x5581, 0x1555, + 0x5582, 0x5582, 0x0EC8, 0x5583, 0x5583, 0x1551, 0x5584, 0x5584, 0x0CFF, + 0x5585, 0x5586, 0x2B20, 0x5587, 0x5587, 0x0999, 0x5588, 0x5588, 0x1554, + 0x5589, 0x5589, 0x07A4, 0x558A, 0x558A, 0x0767, 0x558B, 0x558B, 0x154F, + 0x558C, 0x558E, 0x2B22, 0x558F, 0x558F, 0x153E, 0x5590, 0x5590, 0x2B25, + 0x5591, 0x5591, 0x1559, 0x5592, 0x5593, 0x2B26, 0x5594, 0x5594, 0x155E, + 0x5595, 0x5597, 0x2B28, 0x5598, 0x5598, 0x0530, 0x5599, 0x5599, 0x155F, + 0x559A, 0x559B, 0x2B2B, 0x559C, 0x559C, 0x0F1F, 0x559D, 0x559D, 0x077F, + 0x559E, 0x559E, 0x2B2D, 0x559F, 0x559F, 0x1556, 0x55A0, 0x55A6, 0x2B2E, + 0x55A7, 0x55A7, 0x0FC5, 0x55A8, 0x55A9, 0x2B35, 0x55AA, 0x55AA, 0x210B, + 0x55AB, 0x55AB, 0x2B37, 0x55AC, 0x55AC, 0x20DE, 0x55AD, 0x55AD, 0x2B38, + 0x55AE, 0x55AE, 0x1EAA, 0x55AF, 0x55B0, 0x2B39, 0x55B1, 0x55B1, 0x1552, + 0x55B2, 0x55B2, 0x222C, 0x55B3, 0x55B3, 0x113E, 0x55B4, 0x55B4, 0x2B3B, + 0x55B5, 0x55B5, 0x153F, 0x55B6, 0x55B6, 0x2B3C, 0x55B7, 0x55B7, 0x0BA8, + 0x55B8, 0x55B8, 0x2B3D, 0x55B9, 0x55B9, 0x1553, 0x55BA, 0x55BA, 0x2B3E, + 0x55BB, 0x55BB, 0x10DC, 0x55BC, 0x55BC, 0x2B3F, 0x55BD, 0x55BE, 0x155C, + 0x55BF, 0x55C3, 0x2B40, 0x55C4, 0x55C4, 0x156A, 0x55C5, 0x55C5, 0x0FAC, + 0x55C6, 0x55C6, 0x20D8, 0x55C7, 0x55C7, 0x22C0, 0x55C8, 0x55C8, 0x2B45, + 0x55C9, 0x55C9, 0x1562, 0x55CA, 0x55CB, 0x2B46, 0x55CC, 0x55CD, 0x156F, + 0x55CE, 0x55CE, 0x206F, 0x55CF, 0x55D0, 0x2B48, 0x55D1, 0x55D1, 0x1564, + 0x55D2, 0x55D2, 0x1550, 0x55D3, 0x55D3, 0x0CDD, 0x55D4, 0x55D4, 0x1567, + 0x55D5, 0x55D5, 0x2B4A, 0x55D6, 0x55D6, 0x1558, 0x55D7, 0x55D9, 0x2B4B, + 0x55DA, 0x55DA, 0x21A1, 0x55DB, 0x55DB, 0x2B4E, 0x55DC, 0x55DC, 0x0D5F, + 0x55DD, 0x55DD, 0x1569, 0x55DE, 0x55DE, 0x2B4F, 0x55DF, 0x55DF, 0x155B, + 0x55E0, 0x55E0, 0x2B50, 0x55E1, 0x55E1, 0x0EDA, 0x55E2, 0x55E2, 0x2B51, + 0x55E3, 0x55E3, 0x0DB8, 0x55E4, 0x55E4, 0x1573, 0x55E5, 0x55E5, 0x156C, + 0x55E6, 0x55E6, 0x1568, 0x55E7, 0x55E7, 0x2B52, 0x55E8, 0x55E8, 0x1571, + 0x55E9, 0x55E9, 0x2379, 0x55EA, 0x55EA, 0x1560, 0x55EB, 0x55EC, 0x1565, + 0x55ED, 0x55EE, 0x2B53, 0x55EF, 0x55EF, 0x156B, 0x55F0, 0x55F1, 0x2B55, + 0x55F2, 0x55F3, 0x156D, 0x55F4, 0x55F4, 0x2B57, 0x55F5, 0x55F5, 0x1572, + 0x55F6, 0x55F6, 0x2372, 0x55F7, 0x55F7, 0x1561, 0x55F8, 0x55FC, 0x2B58, + 0x55FD, 0x55FD, 0x0DC9, 0x55FE, 0x55FE, 0x157B, 0x55FF, 0x55FF, 0x2B5D, + 0x5600, 0x5600, 0x157C, 0x5601, 0x5601, 0x1578, 0x5602, 0x5605, 0x2B5E, + 0x5606, 0x5606, 0x216A, 0x5607, 0x5607, 0x2B62, 0x5608, 0x5608, 0x1576, + 0x5609, 0x5609, 0x0841, 0x560A, 0x560B, 0x2B63, 0x560C, 0x560C, 0x1577, + 0x560D, 0x560D, 0x237C, 0x560E, 0x560E, 0x06BD, 0x560F, 0x560F, 0x127B, + 0x5610, 0x5613, 0x2B65, 0x5614, 0x5614, 0x20B0, 0x5615, 0x5615, 0x2B69, + 0x5616, 0x5616, 0x237A, 0x5617, 0x5617, 0x1E74, 0x5618, 0x5618, 0x0FB5, + 0x5619, 0x561A, 0x2B6A, 0x561B, 0x561B, 0x0A96, 0x561C, 0x561C, 0x2377, + 0x561D, 0x561D, 0x2B6C, 0x561E, 0x561E, 0x1575, 0x561F, 0x561F, 0x1563, + 0x5620, 0x5622, 0x2B6D, 0x5623, 0x5623, 0x157A, 0x5624, 0x5624, 0x1579, + 0x5625, 0x5626, 0x2B70, 0x5627, 0x5627, 0x157D, 0x5628, 0x5628, 0x2B72, + 0x5629, 0x5629, 0x1F4C, 0x562A, 0x562B, 0x2B73, 0x562C, 0x562C, 0x1582, + 0x562D, 0x562D, 0x157E, 0x562E, 0x562E, 0x2378, 0x562F, 0x562F, 0x21CF, + 0x5630, 0x5630, 0x2368, 0x5631, 0x5631, 0x11F5, 0x5632, 0x5632, 0x04D5, + 0x5633, 0x5633, 0x2B75, 0x5634, 0x5634, 0x1249, 0x5635, 0x5635, 0x2371, + 0x5636, 0x5636, 0x0DB0, 0x5637, 0x5637, 0x2B76, 0x5638, 0x5638, 0x2369, + 0x5639, 0x5639, 0x1580, 0x563A, 0x563A, 0x2B77, 0x563B, 0x563B, 0x0F0A, + 0x563C, 0x563E, 0x2B78, 0x563F, 0x563F, 0x0790, 0x5640, 0x5640, 0x2B7B, + 0x5641, 0x5641, 0x2674, 0x5642, 0x564B, 0x2B7C, 0x564C, 0x564C, 0x1587, + 0x564D, 0x564D, 0x1583, 0x564E, 0x564E, 0x1034, 0x564F, 0x5653, 0x2B86, + 0x5654, 0x5654, 0x1588, 0x5655, 0x5656, 0x2B8B, 0x5657, 0x5657, 0x1581, + 0x5658, 0x5658, 0x157F, 0x5659, 0x5659, 0x1585, 0x565A, 0x565B, 0x2B8D, + 0x565C, 0x565C, 0x1586, 0x565D, 0x565D, 0x236F, 0x565E, 0x565F, 0x2B8F, + 0x5660, 0x5660, 0x2370, 0x5661, 0x5661, 0x2B91, 0x5662, 0x5662, 0x1584, + 0x5663, 0x5663, 0x2B92, 0x5664, 0x5664, 0x158A, 0x5665, 0x5665, 0x2376, + 0x5666, 0x5666, 0x2373, 0x5667, 0x5667, 0x2B93, 0x5668, 0x5668, 0x0C16, + 0x5669, 0x5669, 0x1262, 0x566A, 0x566A, 0x112E, 0x566B, 0x566B, 0x158C, + 0x566C, 0x566C, 0x0D60, 0x566D, 0x566E, 0x2B94, 0x566F, 0x566F, 0x237F, + 0x5670, 0x5670, 0x2B96, 0x5671, 0x5671, 0x158B, 0x5672, 0x5672, 0x2374, + 0x5673, 0x5673, 0x2B97, 0x5674, 0x5674, 0x20B5, 0x5675, 0x5675, 0x2B98, + 0x5676, 0x5676, 0x06BC, 0x5677, 0x5677, 0x2B99, 0x5678, 0x5678, 0x1EDB, + 0x5679, 0x5679, 0x2672, 0x567A, 0x567A, 0x2B9A, 0x567B, 0x567C, 0x158D, + 0x567D, 0x567F, 0x2B9B, 0x5680, 0x5680, 0x236E, 0x5681, 0x5684, 0x2B9E, + 0x5685, 0x5685, 0x158F, 0x5686, 0x5686, 0x1589, 0x5687, 0x5687, 0x21B7, + 0x5688, 0x568B, 0x2BA2, 0x568C, 0x568C, 0x2375, 0x568D, 0x568D, 0x2BA6, + 0x568E, 0x568E, 0x0776, 0x568F, 0x568F, 0x0E3A, 0x5690, 0x5692, 0x2BA7, + 0x5693, 0x5693, 0x1590, 0x5694, 0x5694, 0x2BAA, 0x5695, 0x5695, 0x2382, + 0x5696, 0x5698, 0x2BAB, 0x5699, 0x5699, 0x209E, 0x569A, 0x56A2, 0x2BAE, + 0x56A3, 0x56A3, 0x0F66, 0x56A4, 0x56A5, 0x2BB7, 0x56A6, 0x56A6, 0x236B, + 0x56A7, 0x56A7, 0x2BB9, 0x56A8, 0x56A8, 0x2039, 0x56A9, 0x56AD, 0x2BBA, + 0x56AE, 0x56AE, 0x269F, 0x56AF, 0x56AF, 0x1591, 0x56B0, 0x56B2, 0x2BBF, + 0x56B3, 0x56B3, 0x237D, 0x56B4, 0x56B4, 0x21F5, 0x56B5, 0x56B5, 0x2BC2, + 0x56B6, 0x56B6, 0x2381, 0x56B7, 0x56B7, 0x0C9D, 0x56B8, 0x56BB, 0x2BC3, + 0x56BC, 0x56BC, 0x0891, 0x56BD, 0x56BF, 0x2BC7, 0x56C0, 0x56C0, 0x237B, + 0x56C1, 0x56C1, 0x237E, 0x56C2, 0x56C2, 0x21CC, 0x56C3, 0x56C4, 0x2BCA, + 0x56C5, 0x56C5, 0x22DB, 0x56C6, 0x56C7, 0x2BCC, 0x56C8, 0x56C8, 0x236A, + 0x56C9, 0x56C9, 0x2689, 0x56CA, 0x56CA, 0x0B35, 0x56CB, 0x56CB, 0x2BCE, + 0x56CC, 0x56CC, 0x2697, 0x56CD, 0x56D0, 0x2BCF, 0x56D1, 0x56D1, 0x22A1, + 0x56D2, 0x56D3, 0x2BD3, 0x56D4, 0x56D4, 0x1592, 0x56D5, 0x56D6, 0x2BD5, + 0x56D7, 0x56D7, 0x1593, 0x56D8, 0x56D9, 0x2BD7, 0x56DA, 0x56DA, 0x0C71, + 0x56DB, 0x56DB, 0x0DB9, 0x56DC, 0x56DC, 0x2BD9, 0x56DD, 0x56DD, 0x1594, + 0x56DE, 0x56DE, 0x07ED, 0x56DF, 0x56DF, 0x126C, 0x56E0, 0x56E0, 0x1079, + 0x56E1, 0x56E1, 0x1595, 0x56E2, 0x56E2, 0x0E76, 0x56E3, 0x56E3, 0x2BDA, + 0x56E4, 0x56E4, 0x0619, 0x56E5, 0x56EA, 0x2BDB, 0x56EB, 0x56EB, 0x1597, + 0x56EC, 0x56EC, 0x2BE1, 0x56ED, 0x56ED, 0x10F3, 0x56EE, 0x56EF, 0x2BE2, + 0x56F0, 0x56F0, 0x0992, 0x56F1, 0x56F1, 0x0554, 0x56F2, 0x56F3, 0x2BE4, + 0x56F4, 0x56F4, 0x0EB6, 0x56F5, 0x56F5, 0x1596, 0x56F6, 0x56F8, 0x2BE6, + 0x56F9, 0x56F9, 0x1598, 0x56FA, 0x56FA, 0x0725, 0x56FB, 0x56FC, 0x2BE9, + 0x56FD, 0x56FD, 0x0753, 0x56FE, 0x56FE, 0x0E6D, 0x56FF, 0x56FF, 0x1599, + 0x5700, 0x5702, 0x2BEB, 0x5703, 0x5703, 0x0BF3, 0x5704, 0x5704, 0x159A, + 0x5705, 0x5705, 0x2BEE, 0x5706, 0x5706, 0x10F5, 0x5707, 0x5707, 0x2383, + 0x5708, 0x5708, 0x0C81, 0x5709, 0x5709, 0x159C, 0x570A, 0x570A, 0x159B, + 0x570B, 0x570B, 0x1F3D, 0x570C, 0x570C, 0x2BEF, 0x570D, 0x570D, 0x218F, + 0x570E, 0x5711, 0x2BF0, 0x5712, 0x5712, 0x2246, 0x5713, 0x5713, 0x2248, + 0x5714, 0x5715, 0x2BF4, 0x5716, 0x5716, 0x217E, 0x5717, 0x5717, 0x2BF6, + 0x5718, 0x5718, 0x2180, 0x5719, 0x571B, 0x2BF7, 0x571C, 0x571C, 0x159D, + 0x571D, 0x571E, 0x2BFA, 0x571F, 0x571F, 0x0E72, 0x5720, 0x5722, 0x2BFC, + 0x5723, 0x5723, 0x0D3C, 0x5724, 0x5727, 0x2BFF, 0x5728, 0x5728, 0x111D, + 0x5729, 0x5729, 0x13A7, 0x572A, 0x572A, 0x13A9, 0x572B, 0x572B, 0x2C03, + 0x572C, 0x572C, 0x13A8, 0x572D, 0x572D, 0x0740, 0x572E, 0x572F, 0x13AC, + 0x5730, 0x5730, 0x05B9, 0x5731, 0x5732, 0x2C04, 0x5733, 0x5733, 0x13AA, + 0x5734, 0x5738, 0x2C06, 0x5739, 0x5739, 0x13AB, 0x573A, 0x573A, 0x04C6, + 0x573B, 0x573B, 0x13AF, 0x573C, 0x573D, 0x2C0B, 0x573E, 0x573E, 0x080D, + 0x573F, 0x573F, 0x2C0D, 0x5740, 0x5740, 0x11B6, 0x5741, 0x5741, 0x2C0E, + 0x5742, 0x5742, 0x13B0, 0x5743, 0x5746, 0x2C0F, 0x5747, 0x5747, 0x0928, + 0x5748, 0x5749, 0x2C13, 0x574A, 0x574A, 0x0658, 0x574B, 0x574B, 0x2C15, + 0x574C, 0x574C, 0x13A0, 0x574D, 0x574D, 0x0E01, 0x574E, 0x574E, 0x093F, + 0x574F, 0x574F, 0x07CA, 0x5750, 0x5750, 0x1255, 0x5751, 0x5751, 0x0960, + 0x5752, 0x5756, 0x2C16, 0x5757, 0x5757, 0x0976, 0x5758, 0x5759, 0x2C1B, + 0x575A, 0x575A, 0x0854, 0x575B, 0x575B, 0x0E06, 0x575C, 0x575C, 0x13AE, + 0x575D, 0x575D, 0x03DE, 0x575E, 0x575E, 0x0EFA, 0x575F, 0x575F, 0x0675, + 0x5760, 0x5760, 0x1216, 0x5761, 0x5761, 0x0BE1, 0x5762, 0x5763, 0x2C1D, + 0x5764, 0x5764, 0x098F, 0x5765, 0x5765, 0x2C1F, 0x5766, 0x5766, 0x0E0C, + 0x5767, 0x5767, 0x2C20, 0x5768, 0x5768, 0x13B7, 0x5769, 0x5769, 0x13B1, + 0x576A, 0x576A, 0x0BD9, 0x576B, 0x576B, 0x13B3, 0x576C, 0x576C, 0x2C21, + 0x576D, 0x576D, 0x13B8, 0x576E, 0x576E, 0x2C22, 0x576F, 0x576F, 0x0BB8, + 0x5770, 0x5772, 0x2C23, 0x5773, 0x5773, 0x13BA, 0x5774, 0x5775, 0x2C26, + 0x5776, 0x5776, 0x13B9, 0x5777, 0x5777, 0x094D, 0x5778, 0x577A, 0x2C28, + 0x577B, 0x577B, 0x13B6, 0x577C, 0x577C, 0x13B5, 0x577D, 0x5781, 0x2C2B, + 0x5782, 0x5782, 0x053C, 0x5783, 0x5783, 0x0997, 0x5784, 0x5784, 0x0A49, + 0x5785, 0x5785, 0x13B2, 0x5786, 0x5786, 0x13B4, 0x5787, 0x578A, 0x2C30, + 0x578B, 0x578B, 0x0F98, 0x578C, 0x578C, 0x13BD, 0x578D, 0x5791, 0x2C34, + 0x5792, 0x5792, 0x09C8, 0x5793, 0x5793, 0x13C2, 0x5794, 0x579A, 0x2C39, + 0x579B, 0x579B, 0x0621, 0x579C, 0x579F, 0x2C40, 0x57A0, 0x57A0, 0x13C3, + 0x57A1, 0x57A1, 0x13A2, 0x57A2, 0x57A2, 0x0711, 0x57A3, 0x57A3, 0x10EE, + 0x57A4, 0x57A4, 0x13BC, 0x57A5, 0x57A5, 0x2C44, 0x57A6, 0x57A6, 0x095E, + 0x57A7, 0x57A7, 0x13C0, 0x57A8, 0x57A8, 0x2C45, 0x57A9, 0x57A9, 0x13A1, + 0x57AA, 0x57AA, 0x2C46, 0x57AB, 0x57AB, 0x05C7, 0x57AC, 0x57AC, 0x2C47, + 0x57AD, 0x57AD, 0x13BB, 0x57AE, 0x57AE, 0x0972, 0x57AF, 0x57B1, 0x2C48, + 0x57B2, 0x57B2, 0x13BE, 0x57B3, 0x57B3, 0x2C4B, 0x57B4, 0x57B4, 0x13C1, + 0x57B5, 0x57B7, 0x2C4C, 0x57B8, 0x57B8, 0x13C9, 0x57B9, 0x57C1, 0x2C4F, + 0x57C2, 0x57C2, 0x06FA, 0x57C3, 0x57C3, 0x03AE, 0x57C4, 0x57CA, 0x2C58, + 0x57CB, 0x57CB, 0x0A98, 0x57CC, 0x57CD, 0x2C5F, 0x57CE, 0x57CE, 0x04EC, + 0x57CF, 0x57CF, 0x13BF, 0x57D0, 0x57D1, 0x2C61, 0x57D2, 0x57D2, 0x13C8, + 0x57D3, 0x57D3, 0x2C63, 0x57D4, 0x57D4, 0x0BF1, 0x57D5, 0x57D5, 0x13C4, + 0x57D6, 0x57D7, 0x2C64, 0x57D8, 0x57D8, 0x13C5, 0x57D9, 0x57D9, 0x13C7, + 0x57DA, 0x57DA, 0x13C6, 0x57DB, 0x57DC, 0x2C66, 0x57DD, 0x57DD, 0x13CE, + 0x57DE, 0x57DE, 0x2C68, 0x57DF, 0x57DF, 0x10D7, 0x57E0, 0x57E0, 0x0481, + 0x57E1, 0x57E1, 0x232A, 0x57E2, 0x57E3, 0x2C69, 0x57E4, 0x57E4, 0x13CD, + 0x57E5, 0x57EC, 0x2C6B, 0x57ED, 0x57ED, 0x13D2, 0x57EE, 0x57EE, 0x2C73, + 0x57EF, 0x57EF, 0x13CB, 0x57F0, 0x57F3, 0x2C74, 0x57F4, 0x57F4, 0x13CA, + 0x57F5, 0x57F6, 0x2C78, 0x57F7, 0x57F7, 0x228B, 0x57F8, 0x57F8, 0x13CC, + 0x57F9, 0x57F9, 0x0BA1, 0x57FA, 0x57FA, 0x080E, 0x57FB, 0x57FC, 0x2C7A, + 0x57FD, 0x57FD, 0x13D1, 0x57FE, 0x57FF, 0x2C7C, 0x5800, 0x5800, 0x13D3, + 0x5801, 0x5801, 0x2C7E, 0x5802, 0x5802, 0x0E16, 0x5803, 0x5804, 0x2C7F, + 0x5805, 0x5805, 0x1F85, 0x5806, 0x5806, 0x0610, 0x5807, 0x5807, 0x144C, + 0x5808, 0x5809, 0x2C81, 0x580A, 0x580A, 0x2325, 0x580B, 0x580B, 0x13CF, + 0x580C, 0x580C, 0x2C83, 0x580D, 0x580D, 0x13D0, 0x580E, 0x5810, 0x2C84, + 0x5811, 0x5811, 0x0C32, 0x5812, 0x5814, 0x2C87, 0x5815, 0x5815, 0x0628, + 0x5816, 0x5816, 0x232C, 0x5817, 0x5818, 0x2C8A, 0x5819, 0x5819, 0x13D5, + 0x581A, 0x581C, 0x2C8C, 0x581D, 0x581D, 0x232E, 0x581E, 0x581E, 0x13D4, + 0x581F, 0x581F, 0x2C8F, 0x5820, 0x5820, 0x13D7, 0x5821, 0x5821, 0x040D, + 0x5822, 0x5823, 0x2C90, 0x5824, 0x5824, 0x05AD, 0x5825, 0x5829, 0x2C92, + 0x582A, 0x582A, 0x093D, 0x582B, 0x582E, 0x2C97, 0x582F, 0x582F, 0x2205, + 0x5830, 0x5830, 0x1008, 0x5831, 0x5831, 0x1E38, 0x5832, 0x5833, 0x2C9B, + 0x5834, 0x5834, 0x1E73, 0x5835, 0x5835, 0x0601, 0x5836, 0x5843, 0x2C9D, + 0x5844, 0x5844, 0x13D6, 0x5845, 0x5849, 0x2CAB, 0x584A, 0x584A, 0x1FE3, + 0x584B, 0x584B, 0x2339, 0x584C, 0x584C, 0x0DEF, 0x584D, 0x584D, 0x19A3, + 0x584E, 0x584E, 0x2CB0, 0x584F, 0x584F, 0x232B, 0x5850, 0x5850, 0x2CB1, + 0x5851, 0x5851, 0x0DD1, 0x5852, 0x5852, 0x232D, 0x5853, 0x5853, 0x2CB2, + 0x5854, 0x5854, 0x0DF3, 0x5855, 0x5856, 0x2CB3, 0x5857, 0x5857, 0x217F, + 0x5858, 0x5858, 0x0E14, 0x5859, 0x585D, 0x2CB5, 0x585E, 0x585E, 0x0CD6, + 0x585F, 0x5861, 0x2CBA, 0x5862, 0x5862, 0x21A7, 0x5863, 0x5863, 0x2CBD, + 0x5864, 0x5864, 0x232F, 0x5865, 0x5865, 0x13D8, 0x5866, 0x586A, 0x2CBE, + 0x586B, 0x586B, 0x0E41, 0x586C, 0x586C, 0x13D9, 0x586D, 0x5874, 0x2CC3, + 0x5875, 0x5875, 0x1E7D, 0x5876, 0x5878, 0x2CCB, 0x5879, 0x5879, 0x20D6, + 0x587A, 0x587D, 0x2CCE, 0x587E, 0x587E, 0x13A3, 0x587F, 0x587F, 0x2CD2, + 0x5880, 0x5880, 0x13DD, 0x5881, 0x5881, 0x13DA, 0x5882, 0x5882, 0x2CD3, + 0x5883, 0x5883, 0x08E2, 0x5884, 0x5884, 0x2CD4, 0x5885, 0x5885, 0x0D92, + 0x5886, 0x5888, 0x2CD5, 0x5889, 0x5889, 0x13DB, 0x588A, 0x588A, 0x1EC2, + 0x588B, 0x5891, 0x2CD8, 0x5892, 0x5892, 0x0D03, 0x5893, 0x5893, 0x0B1C, + 0x5894, 0x5898, 0x2CDF, 0x5899, 0x5899, 0x0C3A, 0x589A, 0x589A, 0x13DC, + 0x589B, 0x589B, 0x2CE4, 0x589C, 0x589C, 0x22B2, 0x589D, 0x589D, 0x2CE5, + 0x589E, 0x589E, 0x1139, 0x589F, 0x589F, 0x0FB1, 0x58A0, 0x58A7, 0x2CE6, + 0x58A8, 0x58A8, 0x0B0E, 0x58A9, 0x58A9, 0x0614, 0x58AA, 0x58AD, 0x2CEE, + 0x58AE, 0x58AE, 0x1EDF, 0x58AF, 0x58B2, 0x2CF2, 0x58B3, 0x58B3, 0x1EF9, + 0x58B4, 0x58BA, 0x2CF6, 0x58BB, 0x58BB, 0x20D9, 0x58BC, 0x58BC, 0x13A4, + 0x58BD, 0x58BD, 0x2CFD, 0x58BE, 0x58BE, 0x1FDD, 0x58BF, 0x58C0, 0x2CFE, + 0x58C1, 0x58C1, 0x0443, 0x58C2, 0x58C4, 0x2D00, 0x58C5, 0x58C5, 0x13A5, + 0x58C6, 0x58C6, 0x2D03, 0x58C7, 0x58C7, 0x2167, 0x58C8, 0x58D0, 0x2D04, + 0x58D1, 0x58D1, 0x13A6, 0x58D2, 0x58D2, 0x2D0D, 0x58D3, 0x58D3, 0x21ED, + 0x58D4, 0x58D4, 0x2D0E, 0x58D5, 0x58D5, 0x0775, 0x58D6, 0x58D7, 0x2D0F, + 0x58D8, 0x58D8, 0x2007, 0x58D9, 0x58D9, 0x2326, 0x58DA, 0x58DA, 0x2329, + 0x58DB, 0x58DD, 0x2D11, 0x58DE, 0x58DE, 0x1F52, 0x58DF, 0x58DF, 0x203B, + 0x58E0, 0x58E0, 0x2328, 0x58E1, 0x58E1, 0x2D14, 0x58E2, 0x58E2, 0x2327, + 0x58E3, 0x58E3, 0x2D15, 0x58E4, 0x58E4, 0x0C9B, 0x58E5, 0x58E8, 0x2D16, + 0x58E9, 0x58E9, 0x1E2B, 0x58EA, 0x58EA, 0x2D1A, 0x58EB, 0x58EB, 0x0D56, + 0x58EC, 0x58EC, 0x0CA4, 0x58ED, 0x58ED, 0x2D1B, 0x58EE, 0x58EE, 0x1210, + 0x58EF, 0x58EF, 0x22AE, 0x58F0, 0x58F0, 0x0D32, 0x58F1, 0x58F2, 0x2D1C, + 0x58F3, 0x58F3, 0x0954, 0x58F4, 0x58F5, 0x2D1E, 0x58F6, 0x58F6, 0x07AF, + 0x58F7, 0x58F8, 0x2D20, 0x58F9, 0x58F9, 0x1043, 0x58FA, 0x58FA, 0x1F49, + 0x58FB, 0x58FC, 0x2D22, 0x58FD, 0x58FD, 0x2138, 0x58FE, 0x58FF, 0x2D24, + 0x5900, 0x5901, 0x2D26, 0x5902, 0x5902, 0x161C, 0x5903, 0x5903, 0x2D28, + 0x5904, 0x5904, 0x0529, 0x5905, 0x5906, 0x2D29, 0x5907, 0x5907, 0x0421, + 0x5908, 0x590C, 0x2D2B, 0x590D, 0x590D, 0x06AF, 0x590E, 0x590E, 0x2D30, + 0x590F, 0x590F, 0x0F31, 0x5910, 0x5913, 0x2D31, 0x5914, 0x5914, 0x12FB, + 0x5915, 0x5915, 0x0F13, 0x5916, 0x5916, 0x0E93, 0x5917, 0x5918, 0x2D35, + 0x5919, 0x5919, 0x1301, 0x591A, 0x591A, 0x061F, 0x591B, 0x591B, 0x2D37, + 0x591C, 0x591C, 0x1040, 0x591D, 0x591E, 0x2D38, 0x591F, 0x591F, 0x0714, + 0x5920, 0x5921, 0x2D3A, 0x5922, 0x5922, 0x2081, 0x5923, 0x5923, 0x2D3C, + 0x5924, 0x5924, 0x161B, 0x5925, 0x5925, 0x1619, 0x5926, 0x5926, 0x2D3D, + 0x5927, 0x5927, 0x0576, 0x5928, 0x5928, 0x2D3E, 0x5929, 0x5929, 0x0E3F, + 0x592A, 0x592A, 0x0DFE, 0x592B, 0x592B, 0x068F, 0x592C, 0x592C, 0x2D3F, + 0x592D, 0x592D, 0x1268, 0x592E, 0x592E, 0x1014, 0x592F, 0x592F, 0x0772, + 0x5930, 0x5930, 0x2D40, 0x5931, 0x5931, 0x0D3E, 0x5932, 0x5933, 0x2D41, + 0x5934, 0x5934, 0x0E68, 0x5935, 0x5936, 0x2D43, 0x5937, 0x5937, 0x104B, + 0x5938, 0x5938, 0x0971, 0x5939, 0x5939, 0x0843, 0x593A, 0x593A, 0x0620, + 0x593B, 0x593B, 0x2D45, 0x593C, 0x593C, 0x14AF, 0x593D, 0x593D, 0x2D46, + 0x593E, 0x593E, 0x1F7C, 0x593F, 0x5940, 0x2D47, 0x5941, 0x5941, 0x14B0, + 0x5942, 0x5942, 0x138C, 0x5943, 0x5943, 0x2D49, 0x5944, 0x5944, 0x1002, + 0x5945, 0x5946, 0x2D4A, 0x5947, 0x5947, 0x0C05, 0x5948, 0x5948, 0x0B31, + 0x5949, 0x5949, 0x068B, 0x594A, 0x594A, 0x2D4C, 0x594B, 0x594B, 0x0679, + 0x594C, 0x594D, 0x2D4D, 0x594E, 0x594E, 0x0989, 0x594F, 0x594F, 0x123D, + 0x5950, 0x5950, 0x2D4F, 0x5951, 0x5951, 0x0C14, 0x5952, 0x5953, 0x2D50, + 0x5954, 0x5954, 0x0425, 0x5955, 0x5955, 0x14B2, 0x5956, 0x5956, 0x0882, + 0x5957, 0x5957, 0x0E2A, 0x5958, 0x5958, 0x14B4, 0x5959, 0x5959, 0x2D52, + 0x595A, 0x595A, 0x14B3, 0x595B, 0x595F, 0x2D53, 0x5960, 0x5960, 0x05CD, + 0x5961, 0x5961, 0x2D58, 0x5962, 0x5962, 0x0D16, 0x5963, 0x5964, 0x2D59, + 0x5965, 0x5965, 0x03CD, 0x5966, 0x5968, 0x2D5B, 0x5969, 0x5969, 0x235B, + 0x596A, 0x596A, 0x1EDE, 0x596B, 0x596B, 0x2D5E, 0x596C, 0x596C, 0x1FA2, + 0x596D, 0x596D, 0x2D5F, 0x596E, 0x596E, 0x1EFA, 0x596F, 0x5972, 0x2D60, + 0x5973, 0x5973, 0x0B6F, 0x5974, 0x5974, 0x0B6C, 0x5975, 0x5975, 0x2D64, + 0x5976, 0x5976, 0x0B2F, 0x5977, 0x5977, 0x2D65, 0x5978, 0x5978, 0x085C, + 0x5979, 0x5979, 0x0DF2, 0x597A, 0x597C, 0x2D66, 0x597D, 0x597D, 0x077A, + 0x597E, 0x5980, 0x2D69, 0x5981, 0x5981, 0x1775, 0x5982, 0x5982, 0x0CC2, + 0x5983, 0x5983, 0x1776, 0x5984, 0x5984, 0x0EAE, 0x5985, 0x5985, 0x2D6C, + 0x5986, 0x5986, 0x120E, 0x5987, 0x5987, 0x06B9, 0x5988, 0x5988, 0x0A8F, + 0x5989, 0x5989, 0x2D6D, 0x598A, 0x598A, 0x0CAC, 0x598B, 0x598C, 0x2D6E, + 0x598D, 0x598D, 0x1777, 0x598E, 0x5991, 0x2D70, 0x5992, 0x5992, 0x0609, + 0x5993, 0x5993, 0x083E, 0x5994, 0x5995, 0x2D74, 0x5996, 0x5996, 0x1026, + 0x5997, 0x5997, 0x177B, 0x5998, 0x5998, 0x2D76, 0x5999, 0x5999, 0x0AF3, + 0x599A, 0x599C, 0x2D77, 0x599D, 0x599D, 0x22AD, 0x599E, 0x599E, 0x177E, + 0x599F, 0x59A2, 0x2D7A, 0x59A3, 0x59A3, 0x177A, 0x59A4, 0x59A4, 0x177F, + 0x59A5, 0x59A5, 0x0E88, 0x59A6, 0x59A7, 0x2D7E, 0x59A8, 0x59A8, 0x065E, + 0x59A9, 0x59AA, 0x1778, 0x59AB, 0x59AB, 0x177D, 0x59AC, 0x59AD, 0x2D80, + 0x59AE, 0x59AE, 0x0B40, 0x59AF, 0x59AF, 0x1782, 0x59B0, 0x59B1, 0x2D82, + 0x59B2, 0x59B2, 0x1781, 0x59B3, 0x59B8, 0x2D84, 0x59B9, 0x59B9, 0x0AC8, + 0x59BA, 0x59BA, 0x2D8A, 0x59BB, 0x59BB, 0x0BFD, 0x59BC, 0x59BD, 0x2D8B, + 0x59BE, 0x59BE, 0x1784, 0x59BF, 0x59C5, 0x2D8D, 0x59C6, 0x59C6, 0x0B1A, + 0x59C7, 0x59C9, 0x2D94, 0x59CA, 0x59CA, 0x177C, 0x59CB, 0x59CB, 0x0D53, + 0x59CC, 0x59CF, 0x2D97, 0x59D0, 0x59D0, 0x08B4, 0x59D1, 0x59D1, 0x071C, + 0x59D2, 0x59D2, 0x1780, 0x59D3, 0x59D3, 0x0FA0, 0x59D4, 0x59D4, 0x0EBE, + 0x59D5, 0x59D6, 0x2D9B, 0x59D7, 0x59D7, 0x1783, 0x59D8, 0x59D8, 0x178A, + 0x59D9, 0x59D9, 0x2D9D, 0x59DA, 0x59DA, 0x102D, 0x59DB, 0x59DB, 0x2D9E, + 0x59DC, 0x59DC, 0x087B, 0x59DD, 0x59DD, 0x1787, 0x59DE, 0x59E2, 0x2D9F, + 0x59E3, 0x59E3, 0x1789, 0x59E4, 0x59E4, 0x2DA4, 0x59E5, 0x59E5, 0x09BC, + 0x59E6, 0x59E7, 0x2DA5, 0x59E8, 0x59E8, 0x1053, 0x59E9, 0x59EB, 0x2DA7, + 0x59EC, 0x59EC, 0x081A, 0x59ED, 0x59F8, 0x2DAA, 0x59F9, 0x59F9, 0x178B, + 0x59FA, 0x59FA, 0x2DB6, 0x59FB, 0x59FB, 0x107D, 0x59FC, 0x59FE, 0x2DB7, + 0x59FF, 0x59FF, 0x1228, 0x5A00, 0x5A00, 0x2DBA, 0x5A01, 0x5A01, 0x0EAF, + 0x5A02, 0x5A02, 0x2DBB, 0x5A03, 0x5A03, 0x0E8F, 0x5A04, 0x5A04, 0x0A4D, + 0x5A05, 0x5A06, 0x1785, 0x5A07, 0x5A07, 0x0890, 0x5A08, 0x5A08, 0x1788, + 0x5A09, 0x5A09, 0x178D, 0x5A0A, 0x5A0B, 0x2DBC, 0x5A0C, 0x5A0C, 0x178C, + 0x5A0D, 0x5A10, 0x2DBE, 0x5A11, 0x5A11, 0x1790, 0x5A12, 0x5A12, 0x2DC2, + 0x5A13, 0x5A13, 0x1792, 0x5A14, 0x5A17, 0x2DC3, 0x5A18, 0x5A18, 0x0B52, + 0x5A19, 0x5A1B, 0x2DC7, 0x5A1C, 0x5A1C, 0x0B2B, 0x5A1D, 0x5A1E, 0x2DCA, + 0x5A1F, 0x5A1F, 0x0919, 0x5A20, 0x5A20, 0x0D28, 0x5A21, 0x5A22, 0x2DCC, + 0x5A23, 0x5A23, 0x1791, 0x5A24, 0x5A24, 0x2DCE, 0x5A25, 0x5A25, 0x062F, + 0x5A26, 0x5A28, 0x2DCF, 0x5A29, 0x5A29, 0x0AE9, 0x5A2A, 0x5A30, 0x2DD2, + 0x5A31, 0x5A31, 0x10CE, 0x5A32, 0x5A32, 0x178E, 0x5A33, 0x5A33, 0x2DD9, + 0x5A34, 0x5A34, 0x178F, 0x5A35, 0x5A35, 0x2DDA, 0x5A36, 0x5A36, 0x0C7D, + 0x5A37, 0x5A3B, 0x2DDB, 0x5A3C, 0x5A3C, 0x1797, 0x5A3D, 0x5A3F, 0x2DE0, + 0x5A40, 0x5A40, 0x1793, 0x5A41, 0x5A41, 0x203F, 0x5A42, 0x5A45, 0x2DE3, + 0x5A46, 0x5A46, 0x0BE4, 0x5A47, 0x5A48, 0x2DE7, 0x5A49, 0x5A49, 0x0EA2, + 0x5A4A, 0x5A4A, 0x1795, 0x5A4B, 0x5A54, 0x2DE9, 0x5A55, 0x5A55, 0x1796, + 0x5A56, 0x5A59, 0x2DF3, 0x5A5A, 0x5A5A, 0x07FE, 0x5A5B, 0x5A61, 0x2DF7, + 0x5A62, 0x5A62, 0x1798, 0x5A63, 0x5A65, 0x2DFE, 0x5A66, 0x5A66, 0x1F0E, + 0x5A67, 0x5A67, 0x1794, 0x5A68, 0x5A69, 0x2E01, 0x5A6A, 0x5A6A, 0x09A2, + 0x5A6B, 0x5A6C, 0x2E03, 0x5A6D, 0x5A6D, 0x23F9, 0x5A6E, 0x5A73, 0x2E05, + 0x5A74, 0x5A74, 0x1089, 0x5A75, 0x5A75, 0x1799, 0x5A76, 0x5A76, 0x0D2D, + 0x5A77, 0x5A77, 0x179D, 0x5A78, 0x5A79, 0x2E0B, 0x5A7A, 0x5A7A, 0x179E, + 0x5A7B, 0x5A7E, 0x2E0D, 0x5A7F, 0x5A7F, 0x0FC1, 0x5A80, 0x5A91, 0x2E11, + 0x5A92, 0x5A92, 0x0AC2, 0x5A93, 0x5A99, 0x2E23, 0x5A9A, 0x5A9A, 0x0AC9, + 0x5A9B, 0x5A9B, 0x179C, 0x5A9C, 0x5AA6, 0x2E2A, 0x5AA7, 0x5AA7, 0x23FC, + 0x5AA8, 0x5AA9, 0x2E35, 0x5AAA, 0x5AAA, 0x179B, 0x5AAB, 0x5AB1, 0x2E37, + 0x5AB2, 0x5AB2, 0x17A1, 0x5AB3, 0x5AB3, 0x0F1E, 0x5AB4, 0x5AB4, 0x2E3E, + 0x5AB5, 0x5AB5, 0x19A4, 0x5AB6, 0x5AB7, 0x2E3F, 0x5AB8, 0x5AB8, 0x17A4, + 0x5AB9, 0x5ABC, 0x2E41, 0x5ABD, 0x5ABD, 0x2069, 0x5ABE, 0x5ABE, 0x179F, + 0x5ABF, 0x5AC0, 0x2E45, 0x5AC1, 0x5AC1, 0x0851, 0x5AC2, 0x5AC2, 0x0CE2, + 0x5AC3, 0x5AC8, 0x2E47, 0x5AC9, 0x5AC9, 0x0828, 0x5ACA, 0x5ACB, 0x2E4D, + 0x5ACC, 0x5ACC, 0x0F40, 0x5ACD, 0x5AD1, 0x2E4F, 0x5AD2, 0x5AD2, 0x17A2, + 0x5AD3, 0x5AD3, 0x2E54, 0x5AD4, 0x5AD4, 0x17A3, 0x5AD5, 0x5AD5, 0x2E55, + 0x5AD6, 0x5AD6, 0x17A8, 0x5AD7, 0x5AD7, 0x23F7, 0x5AD8, 0x5AD8, 0x17AA, + 0x5AD9, 0x5ADB, 0x2E56, 0x5ADC, 0x5ADC, 0x17AB, 0x5ADD, 0x5ADF, 0x2E59, + 0x5AE0, 0x5AE0, 0x17A5, 0x5AE1, 0x5AE1, 0x05B6, 0x5AE2, 0x5AE2, 0x2E5C, + 0x5AE3, 0x5AE3, 0x17A6, 0x5AE4, 0x5AE5, 0x2E5D, 0x5AE6, 0x5AE6, 0x17A9, + 0x5AE7, 0x5AE8, 0x2E5F, 0x5AE9, 0x5AE9, 0x0B3E, 0x5AEA, 0x5AEA, 0x2E61, + 0x5AEB, 0x5AEB, 0x17A0, 0x5AEC, 0x5AF0, 0x2E62, 0x5AF1, 0x5AF1, 0x17A7, + 0x5AF2, 0x5AF4, 0x2E67, 0x5AF5, 0x5AF5, 0x23F6, 0x5AF6, 0x5AFA, 0x2E6A, + 0x5AFB, 0x5AFB, 0x23FD, 0x5AFC, 0x5AFF, 0x2E6F, 0x5B00, 0x5B00, 0x23F8, + 0x5B01, 0x5B07, 0x2E73, 0x5B08, 0x5B08, 0x23FA, 0x5B09, 0x5B09, 0x17AC, + 0x5B0A, 0x5B0A, 0x2E7A, 0x5B0B, 0x5B0B, 0x23FE, 0x5B0C, 0x5B0C, 0x1FA8, + 0x5B0D, 0x5B15, 0x2E7B, 0x5B16, 0x5B16, 0x17AE, 0x5B17, 0x5B17, 0x17AD, + 0x5B18, 0x5B18, 0x2E84, 0x5B19, 0x5B19, 0x2401, 0x5B1A, 0x5B20, 0x2E85, + 0x5B21, 0x5B21, 0x23FF, 0x5B22, 0x5B29, 0x2E8C, 0x5B2A, 0x5B2A, 0x2400, + 0x5B2B, 0x5B2F, 0x2E94, 0x5B30, 0x5B30, 0x2221, 0x5B31, 0x5B31, 0x2E99, + 0x5B32, 0x5B32, 0x17AF, 0x5B33, 0x5B33, 0x2E9A, 0x5B34, 0x5B34, 0x130C, + 0x5B35, 0x5B36, 0x2E9B, 0x5B37, 0x5B37, 0x17B0, 0x5B38, 0x5B38, 0x2122, + 0x5B39, 0x5B3F, 0x2E9D, 0x5B40, 0x5B40, 0x17B1, 0x5B41, 0x5B4B, 0x2EA4, + 0x5B4C, 0x5B4C, 0x23FB, 0x5B4D, 0x5B4F, 0x2EAF, 0x5B50, 0x5B50, 0x1230, + 0x5B51, 0x5B51, 0x17B7, 0x5B52, 0x5B52, 0x2EB2, 0x5B53, 0x5B53, 0x17B8, + 0x5B54, 0x5B54, 0x0964, 0x5B55, 0x5B55, 0x1113, 0x5B56, 0x5B56, 0x2EB3, + 0x5B57, 0x5B57, 0x1233, 0x5B58, 0x5B58, 0x0569, 0x5B59, 0x5B59, 0x0DE4, + 0x5B5A, 0x5B5A, 0x17B4, 0x5B5B, 0x5B5B, 0x1279, 0x5B5C, 0x5B5C, 0x122B, + 0x5B5D, 0x5B5D, 0x0F6D, 0x5B5E, 0x5B5E, 0x2EB4, 0x5B5F, 0x5B5F, 0x0AD4, + 0x5B60, 0x5B61, 0x2EB5, 0x5B62, 0x5B62, 0x17B9, 0x5B63, 0x5B63, 0x0831, + 0x5B64, 0x5B64, 0x071B, 0x5B65, 0x5B65, 0x17B5, 0x5B66, 0x5B66, 0x0FD0, + 0x5B67, 0x5B68, 0x2EB7, 0x5B69, 0x5B69, 0x0759, 0x5B6A, 0x5B6A, 0x0A76, + 0x5B6B, 0x5B6B, 0x215A, 0x5B6C, 0x5B6C, 0x1261, 0x5B6D, 0x5B6F, 0x2EB9, + 0x5B70, 0x5B70, 0x0D82, 0x5B71, 0x5B71, 0x176A, 0x5B72, 0x5B72, 0x2EBC, + 0x5B73, 0x5B73, 0x17B6, 0x5B74, 0x5B74, 0x2EBD, 0x5B75, 0x5B75, 0x0692, + 0x5B76, 0x5B77, 0x2EBE, 0x5B78, 0x5B78, 0x21E5, 0x5B79, 0x5B79, 0x2EC0, + 0x5B7A, 0x5B7A, 0x0CC1, 0x5B7B, 0x5B7C, 0x2EC1, 0x5B7D, 0x5B7D, 0x0B58, + 0x5B7E, 0x5B7E, 0x2EC3, 0x5B7F, 0x5B7F, 0x2057, 0x5B80, 0x5B80, 0x172E, + 0x5B81, 0x5B81, 0x0B61, 0x5B82, 0x5B82, 0x2EC4, 0x5B83, 0x5B83, 0x0DF1, + 0x5B84, 0x5B84, 0x172F, 0x5B85, 0x5B85, 0x114D, 0x5B86, 0x5B86, 0x2EC5, + 0x5B87, 0x5B87, 0x10D3, 0x5B88, 0x5B88, 0x0D6F, 0x5B89, 0x5B89, 0x03BD, + 0x5B8A, 0x5B8A, 0x2EC6, 0x5B8B, 0x5B8B, 0x0DC3, 0x5B8C, 0x5B8C, 0x0E9B, + 0x5B8D, 0x5B8E, 0x2EC7, 0x5B8F, 0x5B8F, 0x07A1, 0x5B90, 0x5B92, 0x2EC9, + 0x5B93, 0x5B93, 0x1731, 0x5B94, 0x5B94, 0x2ECC, 0x5B95, 0x5B95, 0x1730, + 0x5B96, 0x5B96, 0x2ECD, 0x5B97, 0x5B97, 0x1237, 0x5B98, 0x5B98, 0x0732, + 0x5B99, 0x5B99, 0x11E5, 0x5B9A, 0x5B9A, 0x05E7, 0x5B9B, 0x5B9B, 0x0EA1, + 0x5B9C, 0x5B9C, 0x1052, 0x5B9D, 0x5B9D, 0x040F, 0x5B9E, 0x5B9E, 0x0D4C, + 0x5B9F, 0x5B9F, 0x2ECE, 0x5BA0, 0x5BA0, 0x050D, 0x5BA1, 0x5BA1, 0x0D2C, + 0x5BA2, 0x5BA2, 0x095A, 0x5BA3, 0x5BA3, 0x0FC6, 0x5BA4, 0x5BA4, 0x0D69, + 0x5BA5, 0x5BA5, 0x1732, 0x5BA6, 0x5BA6, 0x07D7, 0x5BA7, 0x5BA9, 0x2ECF, + 0x5BAA, 0x5BAA, 0x0F49, 0x5BAB, 0x5BAB, 0x0705, 0x5BAC, 0x5BAF, 0x2ED2, + 0x5BB0, 0x5BB0, 0x111A, 0x5BB1, 0x5BB2, 0x2ED6, 0x5BB3, 0x5BB3, 0x075D, + 0x5BB4, 0x5BB4, 0x1010, 0x5BB5, 0x5BB5, 0x0F69, 0x5BB6, 0x5BB6, 0x0845, + 0x5BB7, 0x5BB7, 0x2ED8, 0x5BB8, 0x5BB8, 0x1733, 0x5BB9, 0x5BB9, 0x0CB8, + 0x5BBA, 0x5BBC, 0x2ED9, 0x5BBD, 0x5BBD, 0x097A, 0x5BBE, 0x5BBE, 0x045F, + 0x5BBF, 0x5BBF, 0x0DD3, 0x5BC0, 0x5BC1, 0x2EDC, 0x5BC2, 0x5BC2, 0x0838, + 0x5BC3, 0x5BC3, 0x2EDE, 0x5BC4, 0x5BC4, 0x0837, 0x5BC5, 0x5BC5, 0x1081, + 0x5BC6, 0x5BC6, 0x0AE1, 0x5BC7, 0x5BC7, 0x0969, 0x5BC8, 0x5BCB, 0x2EDF, + 0x5BCC, 0x5BCC, 0x06B6, 0x5BCD, 0x5BCF, 0x2EE3, 0x5BD0, 0x5BD0, 0x0AC7, + 0x5BD1, 0x5BD1, 0x2EE6, 0x5BD2, 0x5BD2, 0x0765, 0x5BD3, 0x5BD3, 0x10E5, + 0x5BD4, 0x5BDC, 0x2EE7, 0x5BDD, 0x5BDD, 0x0C5B, 0x5BDE, 0x5BDE, 0x0B12, + 0x5BDF, 0x5BDF, 0x04B3, 0x5BE0, 0x5BE0, 0x2EF0, 0x5BE1, 0x5BE1, 0x072A, + 0x5BE2, 0x5BE2, 0x20E5, 0x5BE3, 0x5BE3, 0x2EF1, 0x5BE4, 0x5BE4, 0x1737, + 0x5BE5, 0x5BE5, 0x0A11, 0x5BE6, 0x5BE6, 0x212F, 0x5BE7, 0x5BE7, 0x20A3, + 0x5BE8, 0x5BE8, 0x1150, 0x5BE9, 0x5BE9, 0x2121, 0x5BEA, 0x5BEA, 0x2EF2, + 0x5BEB, 0x5BEB, 0x21D4, 0x5BEC, 0x5BEC, 0x1FE5, 0x5BED, 0x5BED, 0x2EF3, + 0x5BEE, 0x5BEE, 0x1738, 0x5BEF, 0x5BEF, 0x2EF4, 0x5BF0, 0x5BF0, 0x173A, + 0x5BF1, 0x5BF4, 0x2EF5, 0x5BF5, 0x5BF5, 0x1E8A, 0x5BF6, 0x5BF6, 0x1E37, + 0x5BF7, 0x5BF7, 0x2EF9, 0x5BF8, 0x5BF8, 0x056A, 0x5BF9, 0x5BF9, 0x0613, + 0x5BFA, 0x5BFA, 0x0DB7, 0x5BFB, 0x5BFB, 0x0FD9, 0x5BFC, 0x5BFC, 0x059D, + 0x5BFD, 0x5BFE, 0x2EFA, 0x5BFF, 0x5BFF, 0x0D70, 0x5C00, 0x5C00, 0x2EFC, + 0x5C01, 0x5C01, 0x067F, 0x5C02, 0x5C03, 0x2EFD, 0x5C04, 0x5C04, 0x0D1D, + 0x5C05, 0x5C05, 0x2EFF, 0x5C06, 0x5C06, 0x087C, 0x5C07, 0x5C07, 0x1F9E, + 0x5C08, 0x5C08, 0x22A6, 0x5C09, 0x5C09, 0x0ECD, 0x5C0A, 0x5C0A, 0x124D, + 0x5C0B, 0x5C0B, 0x21E8, 0x5C0C, 0x5C0C, 0x2F00, 0x5C0D, 0x5C0D, 0x1EDA, + 0x5C0E, 0x5C0E, 0x1EB9, 0x5C0F, 0x5C0F, 0x0F6C, 0x5C10, 0x5C10, 0x2F01, + 0x5C11, 0x5C11, 0x0D12, 0x5C12, 0x5C13, 0x2F02, 0x5C14, 0x5C14, 0x063A, + 0x5C15, 0x5C15, 0x17B2, 0x5C16, 0x5C16, 0x0855, 0x5C17, 0x5C17, 0x2F04, + 0x5C18, 0x5C18, 0x04E3, 0x5C19, 0x5C19, 0x2F05, 0x5C1A, 0x5C1A, 0x0D09, + 0x5C1B, 0x5C1B, 0x2F06, 0x5C1C, 0x5C1C, 0x17B3, 0x5C1D, 0x5C1D, 0x04C7, + 0x5C1E, 0x5C21, 0x2F07, 0x5C22, 0x5C22, 0x14B6, 0x5C23, 0x5C23, 0x2F0B, + 0x5C24, 0x5C24, 0x10AD, 0x5C25, 0x5C25, 0x14B7, 0x5C26, 0x5C26, 0x2F0C, + 0x5C27, 0x5C27, 0x1029, 0x5C28, 0x5C2B, 0x2F0D, 0x5C2C, 0x5C2C, 0x14B8, + 0x5C2D, 0x5C30, 0x2F11, 0x5C31, 0x5C31, 0x08FC, 0x5C32, 0x5C33, 0x2F15, + 0x5C34, 0x5C34, 0x14B9, 0x5C35, 0x5C36, 0x2F17, 0x5C37, 0x5C37, 0x235C, + 0x5C38, 0x5C38, 0x0D43, 0x5C39, 0x5C39, 0x1083, 0x5C3A, 0x5C3A, 0x0504, + 0x5C3B, 0x5C3B, 0x1766, 0x5C3C, 0x5C3C, 0x0B44, 0x5C3D, 0x5C3D, 0x08D0, + 0x5C3E, 0x5C3E, 0x0EC1, 0x5C3F, 0x5C3F, 0x0B55, 0x5C40, 0x5C40, 0x0905, + 0x5C41, 0x5C41, 0x0BC7, 0x5C42, 0x5C42, 0x04AA, 0x5C43, 0x5C44, 0x2F19, + 0x5C45, 0x5C45, 0x0902, 0x5C46, 0x5C47, 0x2F1B, 0x5C48, 0x5C48, 0x0C79, + 0x5C49, 0x5C49, 0x0E3E, 0x5C4A, 0x5C4A, 0x08BD, 0x5C4B, 0x5C4B, 0x0EEC, + 0x5C4C, 0x5C4D, 0x2F1D, 0x5C4E, 0x5C4E, 0x0D51, 0x5C4F, 0x5C4F, 0x0BE0, + 0x5C50, 0x5C50, 0x1768, 0x5C51, 0x5C51, 0x0F87, 0x5C52, 0x5C54, 0x2F1F, + 0x5C55, 0x5C55, 0x115A, 0x5C56, 0x5C58, 0x2F22, 0x5C59, 0x5C59, 0x1769, + 0x5C5A, 0x5C5D, 0x2F25, 0x5C5E, 0x5C5E, 0x0D8B, 0x5C5F, 0x5C5F, 0x2F29, + 0x5C60, 0x5C60, 0x0E71, 0x5C61, 0x5C61, 0x0A6C, 0x5C62, 0x5C62, 0x2050, + 0x5C63, 0x5C63, 0x176B, 0x5C64, 0x5C64, 0x1E67, 0x5C65, 0x5C65, 0x0A6B, + 0x5C66, 0x5C66, 0x176C, 0x5C67, 0x5C67, 0x2F2A, 0x5C68, 0x5C68, 0x23F4, + 0x5C69, 0x5C6B, 0x2F2B, 0x5C6C, 0x5C6C, 0x213E, 0x5C6D, 0x5C6D, 0x2F2E, + 0x5C6E, 0x5C6E, 0x1774, 0x5C6F, 0x5C6F, 0x0E7E, 0x5C70, 0x5C70, 0x2F2F, + 0x5C71, 0x5C71, 0x0CF6, 0x5C72, 0x5C78, 0x2F30, 0x5C79, 0x5C79, 0x1060, + 0x5C7A, 0x5C7A, 0x15AC, 0x5C7B, 0x5C7E, 0x2F37, 0x5C7F, 0x5C7F, 0x10D1, + 0x5C80, 0x5C80, 0x2F3B, 0x5C81, 0x5C81, 0x0DDF, 0x5C82, 0x5C82, 0x0C10, + 0x5C83, 0x5C87, 0x2F3C, 0x5C88, 0x5C88, 0x15B0, 0x5C89, 0x5C8B, 0x2F41, + 0x5C8C, 0x5C8C, 0x15AB, 0x5C8D, 0x5C8D, 0x15AD, 0x5C8E, 0x5C8F, 0x2F44, + 0x5C90, 0x5C90, 0x15AE, 0x5C91, 0x5C91, 0x15B3, 0x5C92, 0x5C93, 0x2F46, + 0x5C94, 0x5C94, 0x04B4, 0x5C95, 0x5C95, 0x2F48, 0x5C96, 0x5C96, 0x15AF, + 0x5C97, 0x5C97, 0x06D5, 0x5C98, 0x5C99, 0x15B1, 0x5C9A, 0x5C9A, 0x15B4, + 0x5C9B, 0x5C9B, 0x059B, 0x5C9C, 0x5C9C, 0x15B5, 0x5C9D, 0x5CA0, 0x2F49, + 0x5CA1, 0x5CA1, 0x1F16, 0x5CA2, 0x5CA2, 0x15B7, 0x5CA3, 0x5CA3, 0x15BC, + 0x5CA4, 0x5CA8, 0x2F4D, 0x5CA9, 0x5CA9, 0x0FFB, 0x5CAA, 0x5CAA, 0x2F52, + 0x5CAB, 0x5CAB, 0x15BA, 0x5CAC, 0x5CAC, 0x15B9, 0x5CAD, 0x5CAD, 0x0A34, + 0x5CAE, 0x5CB0, 0x2F53, 0x5CB1, 0x5CB1, 0x15BB, 0x5CB2, 0x5CB2, 0x2F56, + 0x5CB3, 0x5CB3, 0x1103, 0x5CB4, 0x5CB4, 0x2F57, 0x5CB5, 0x5CB5, 0x15B6, + 0x5CB6, 0x5CB6, 0x2F58, 0x5CB7, 0x5CB7, 0x15BE, 0x5CB8, 0x5CB8, 0x03C1, + 0x5CB9, 0x5CBC, 0x2F59, 0x5CBD, 0x5CBD, 0x15B8, 0x5CBE, 0x5CBE, 0x2F5D, + 0x5CBF, 0x5CBF, 0x0986, 0x5CC0, 0x5CC0, 0x2F5E, 0x5CC1, 0x5CC1, 0x15BD, + 0x5CC2, 0x5CC3, 0x2F5F, 0x5CC4, 0x5CC4, 0x15BF, 0x5CC5, 0x5CCA, 0x2F61, + 0x5CCB, 0x5CCB, 0x15C2, 0x5CCC, 0x5CD1, 0x2F67, 0x5CD2, 0x5CD2, 0x15C0, + 0x5CD3, 0x5CD8, 0x2F6D, 0x5CD9, 0x5CD9, 0x11C4, 0x5CDA, 0x5CE0, 0x2F73, + 0x5CE1, 0x5CE1, 0x0F2C, 0x5CE2, 0x5CE3, 0x2F7A, 0x5CE4, 0x5CE4, 0x15C1, + 0x5CE5, 0x5CE5, 0x15C3, 0x5CE6, 0x5CE6, 0x0A74, 0x5CE7, 0x5CE7, 0x2F7C, + 0x5CE8, 0x5CE8, 0x062A, 0x5CE9, 0x5CE9, 0x2F7D, 0x5CEA, 0x5CEA, 0x10DD, + 0x5CEB, 0x5CEC, 0x2F7E, 0x5CED, 0x5CED, 0x0C4A, 0x5CEE, 0x5CEF, 0x2F80, + 0x5CF0, 0x5CF0, 0x0682, 0x5CF1, 0x5CF3, 0x2F82, 0x5CF4, 0x5CF4, 0x2389, + 0x5CF5, 0x5CF5, 0x2F85, 0x5CF6, 0x5CF6, 0x1EB7, 0x5CF7, 0x5CFA, 0x2F86, + 0x5CFB, 0x5CFB, 0x092D, 0x5CFC, 0x5CFC, 0x2F8A, 0x5CFD, 0x5CFD, 0x21B4, + 0x5CFE, 0x5CFF, 0x2F8B, 0x5D00, 0x5D01, 0x2F8D, 0x5D02, 0x5D03, 0x15C4, + 0x5D04, 0x5D05, 0x2F8F, 0x5D06, 0x5D06, 0x15CB, 0x5D07, 0x5D07, 0x050C, + 0x5D08, 0x5D0C, 0x2F91, 0x5D0D, 0x5D0D, 0x238F, 0x5D0E, 0x5D0E, 0x0C08, + 0x5D0F, 0x5D13, 0x2F96, 0x5D14, 0x5D14, 0x0561, 0x5D15, 0x5D15, 0x2F9B, + 0x5D16, 0x5D16, 0x0FEB, 0x5D17, 0x5D17, 0x1F1A, 0x5D18, 0x5D1A, 0x2F9C, + 0x5D1B, 0x5D1B, 0x15CC, 0x5D1C, 0x5D1D, 0x2F9F, 0x5D1E, 0x5D1E, 0x15CA, + 0x5D1F, 0x5D23, 0x2FA1, 0x5D24, 0x5D24, 0x15C9, 0x5D25, 0x5D25, 0x2FA6, + 0x5D26, 0x5D26, 0x15C7, 0x5D27, 0x5D27, 0x15C6, 0x5D28, 0x5D28, 0x2FA7, + 0x5D29, 0x5D29, 0x0429, 0x5D2A, 0x5D2B, 0x2FA8, 0x5D2C, 0x5D2C, 0x238B, + 0x5D2D, 0x5D2D, 0x1159, 0x5D2E, 0x5D2E, 0x15C8, 0x5D2F, 0x5D33, 0x2FAA, + 0x5D34, 0x5D34, 0x15CF, 0x5D35, 0x5D3C, 0x2FAF, 0x5D3D, 0x5D3D, 0x15D0, + 0x5D3E, 0x5D3E, 0x15CE, 0x5D3F, 0x5D46, 0x2FB7, 0x5D47, 0x5D47, 0x1B22, + 0x5D48, 0x5D49, 0x2FBF, 0x5D4A, 0x5D4A, 0x15D7, 0x5D4B, 0x5D4B, 0x15D6, + 0x5D4C, 0x5D4C, 0x0C33, 0x5D4D, 0x5D4F, 0x2FC1, 0x5D50, 0x5D50, 0x238A, + 0x5D51, 0x5D57, 0x2FC4, 0x5D58, 0x5D58, 0x15CD, 0x5D59, 0x5D5A, 0x2FCB, + 0x5D5B, 0x5D5B, 0x15D2, 0x5D5C, 0x5D5C, 0x2FCD, 0x5D5D, 0x5D5D, 0x15D4, + 0x5D5E, 0x5D68, 0x2FCE, 0x5D69, 0x5D69, 0x15D8, 0x5D6A, 0x5D6A, 0x2FD9, + 0x5D6B, 0x5D6B, 0x15D5, 0x5D6C, 0x5D6C, 0x15D1, 0x5D6D, 0x5D6E, 0x2FDA, + 0x5D6F, 0x5D6F, 0x15D3, 0x5D70, 0x5D73, 0x2FDC, 0x5D74, 0x5D74, 0x15D9, + 0x5D75, 0x5D80, 0x2FE0, 0x5D81, 0x5D81, 0x2391, 0x5D82, 0x5D82, 0x15DA, + 0x5D83, 0x5D83, 0x2FEC, 0x5D84, 0x5D84, 0x2271, 0x5D85, 0x5D86, 0x2FED, + 0x5D87, 0x5D87, 0x2388, 0x5D88, 0x5D96, 0x2FEF, 0x5D97, 0x5D97, 0x238E, + 0x5D98, 0x5D98, 0x2FFE, 0x5D99, 0x5D99, 0x15DB, 0x5D9A, 0x5D9C, 0x2FFF, + 0x5D9D, 0x5D9D, 0x15DC, 0x5D9E, 0x5D9F, 0x3002, 0x5DA0, 0x5DA0, 0x238D, + 0x5DA1, 0x5DA6, 0x3004, 0x5DA7, 0x5DA7, 0x238C, 0x5DA8, 0x5DB6, 0x300A, + 0x5DB7, 0x5DB7, 0x15DE, 0x5DB8, 0x5DB8, 0x2390, 0x5DB9, 0x5DB9, 0x3019, + 0x5DBA, 0x5DBA, 0x2033, 0x5DBB, 0x5DBB, 0x301A, 0x5DBC, 0x5DBC, 0x223C, + 0x5DBD, 0x5DC4, 0x301B, 0x5DC5, 0x5DC5, 0x15DF, 0x5DC6, 0x5DCA, 0x3023, + 0x5DCB, 0x5DCB, 0x1FE9, 0x5DCC, 0x5DCC, 0x3028, 0x5DCD, 0x5DCD, 0x0EB0, + 0x5DCE, 0x5DD1, 0x3029, 0x5DD2, 0x5DD2, 0x2055, 0x5DD3, 0x5DD3, 0x302D, + 0x5DD4, 0x5DD4, 0x2392, 0x5DD5, 0x5DDA, 0x302E, 0x5DDB, 0x5DDB, 0x1815, + 0x5DDC, 0x5DDC, 0x3034, 0x5DDD, 0x5DDD, 0x052B, 0x5DDE, 0x5DDE, 0x11DC, + 0x5DDF, 0x5DE0, 0x3035, 0x5DE1, 0x5DE1, 0x0FDB, 0x5DE2, 0x5DE2, 0x04D7, + 0x5DE3, 0x5DE4, 0x3037, 0x5DE5, 0x5DE5, 0x06FD, 0x5DE6, 0x5DE6, 0x1250, + 0x5DE7, 0x5DE7, 0x0C46, 0x5DE8, 0x5DE8, 0x090D, 0x5DE9, 0x5DE9, 0x0707, + 0x5DEA, 0x5DEA, 0x3039, 0x5DEB, 0x5DEB, 0x0EE6, 0x5DEC, 0x5DED, 0x303A, + 0x5DEE, 0x5DEE, 0x04B5, 0x5DEF, 0x5DEF, 0x139F, 0x5DF0, 0x5DF0, 0x2324, + 0x5DF1, 0x5DF1, 0x082D, 0x5DF2, 0x5DF2, 0x1058, 0x5DF3, 0x5DF3, 0x0DBD, + 0x5DF4, 0x5DF4, 0x03D8, 0x5DF5, 0x5DF6, 0x303C, 0x5DF7, 0x5DF7, 0x0F5C, + 0x5DF8, 0x5DFC, 0x303E, 0x5DFD, 0x5DFD, 0x12F7, 0x5DFE, 0x5DFE, 0x08BE, + 0x5DFF, 0x5DFF, 0x3043, 0x5E00, 0x5E00, 0x3044, 0x5E01, 0x5E01, 0x043B, + 0x5E02, 0x5E02, 0x0D67, 0x5E03, 0x5E03, 0x0483, 0x5E04, 0x5E04, 0x3045, + 0x5E05, 0x5E05, 0x0D9C, 0x5E06, 0x5E06, 0x0648, 0x5E07, 0x5E07, 0x3046, + 0x5E08, 0x5E08, 0x0D3D, 0x5E09, 0x5E0B, 0x3047, 0x5E0C, 0x5E0C, 0x0F10, + 0x5E0D, 0x5E0E, 0x304A, 0x5E0F, 0x5E0F, 0x159E, 0x5E10, 0x5E10, 0x116B, + 0x5E11, 0x5E11, 0x15A1, 0x5E12, 0x5E13, 0x304C, 0x5E14, 0x5E14, 0x15A0, + 0x5E15, 0x5E15, 0x0B82, 0x5E16, 0x5E16, 0x0E4E, 0x5E17, 0x5E17, 0x304E, + 0x5E18, 0x5E18, 0x09FA, 0x5E19, 0x5E19, 0x159F, 0x5E1A, 0x5E1A, 0x11E2, + 0x5E1B, 0x5E1B, 0x0476, 0x5E1C, 0x5E1C, 0x11C3, 0x5E1D, 0x5E1D, 0x05BC, + 0x5E1E, 0x5E24, 0x304F, 0x5E25, 0x5E25, 0x2143, 0x5E26, 0x5E26, 0x057B, + 0x5E27, 0x5E27, 0x11A0, 0x5E28, 0x5E2A, 0x3056, 0x5E2B, 0x5E2B, 0x2129, + 0x5E2C, 0x5E2C, 0x3059, 0x5E2D, 0x5E2D, 0x0F1C, 0x5E2E, 0x5E2E, 0x03FA, + 0x5E2F, 0x5E30, 0x305A, 0x5E31, 0x5E31, 0x15A2, 0x5E32, 0x5E32, 0x305C, + 0x5E33, 0x5E33, 0x2277, 0x5E34, 0x5E35, 0x305D, 0x5E36, 0x5E36, 0x1EA7, + 0x5E37, 0x5E37, 0x15A5, 0x5E38, 0x5E38, 0x04C8, 0x5E39, 0x5E3A, 0x305F, + 0x5E3B, 0x5E3C, 0x15A3, 0x5E3D, 0x5E3D, 0x0AB6, 0x5E3E, 0x5E3F, 0x3061, + 0x5E40, 0x5E40, 0x2285, 0x5E41, 0x5E41, 0x3063, 0x5E42, 0x5E42, 0x0AE2, + 0x5E43, 0x5E43, 0x2384, 0x5E44, 0x5E44, 0x15A6, 0x5E45, 0x5E45, 0x0696, + 0x5E46, 0x5E4B, 0x3064, 0x5E4C, 0x5E4C, 0x07E4, 0x5E4D, 0x5E53, 0x306A, + 0x5E54, 0x5E54, 0x15A7, 0x5E55, 0x5E55, 0x0B1E, 0x5E56, 0x5E56, 0x3071, + 0x5E57, 0x5E57, 0x2387, 0x5E58, 0x5E58, 0x2386, 0x5E59, 0x5E5A, 0x3072, + 0x5E5B, 0x5E5B, 0x15A8, 0x5E5C, 0x5E5D, 0x3074, 0x5E5E, 0x5E5E, 0x15A9, + 0x5E5F, 0x5E5F, 0x2290, 0x5E60, 0x5E60, 0x3076, 0x5E61, 0x5E61, 0x15AA, + 0x5E62, 0x5E62, 0x0534, 0x5E63, 0x5E63, 0x1E44, 0x5E64, 0x5E6A, 0x3077, + 0x5E6B, 0x5E6B, 0x1E32, 0x5E6C, 0x5E6C, 0x2385, 0x5E6D, 0x5E71, 0x307E, + 0x5E72, 0x5E72, 0x06C4, 0x5E73, 0x5E73, 0x0BDC, 0x5E74, 0x5E74, 0x0B4D, + 0x5E75, 0x5E75, 0x3083, 0x5E76, 0x5E76, 0x0469, 0x5E77, 0x5E77, 0x3084, + 0x5E78, 0x5E78, 0x0F9D, 0x5E79, 0x5E79, 0x1F13, 0x5E7A, 0x5E7A, 0x1813, + 0x5E7B, 0x5E7B, 0x07D8, 0x5E7C, 0x5E7C, 0x10BC, 0x5E7D, 0x5E7D, 0x10A9, + 0x5E7E, 0x5E7E, 0x1F73, 0x5E7F, 0x5E7F, 0x073C, 0x5E80, 0x5E80, 0x1631, + 0x5E81, 0x5E83, 0x3085, 0x5E84, 0x5E84, 0x120C, 0x5E85, 0x5E85, 0x3088, + 0x5E86, 0x5E86, 0x0C69, 0x5E87, 0x5E87, 0x043C, 0x5E88, 0x5E89, 0x3089, + 0x5E8A, 0x5E8A, 0x0535, 0x5E8B, 0x5E8B, 0x1633, 0x5E8C, 0x5E8E, 0x308B, + 0x5E8F, 0x5E8F, 0x0FBD, 0x5E90, 0x5E90, 0x0A55, 0x5E91, 0x5E91, 0x1632, + 0x5E92, 0x5E92, 0x308E, 0x5E93, 0x5E93, 0x096F, 0x5E94, 0x5E94, 0x108B, + 0x5E95, 0x5E95, 0x05B8, 0x5E96, 0x5E96, 0x1634, 0x5E97, 0x5E97, 0x05CB, + 0x5E98, 0x5E98, 0x308F, 0x5E99, 0x5E99, 0x0AF2, 0x5E9A, 0x5E9A, 0x06F8, + 0x5E9B, 0x5E9B, 0x3090, 0x5E9C, 0x5E9C, 0x06A9, 0x5E9D, 0x5E9D, 0x3091, + 0x5E9E, 0x5E9E, 0x0B94, 0x5E9F, 0x5E9F, 0x066C, 0x5EA0, 0x5EA0, 0x1636, + 0x5EA1, 0x5EA4, 0x3092, 0x5EA5, 0x5EA5, 0x1635, 0x5EA6, 0x5EA6, 0x0607, + 0x5EA7, 0x5EA7, 0x1256, 0x5EA8, 0x5EAA, 0x3096, 0x5EAB, 0x5EAB, 0x1FE0, + 0x5EAC, 0x5EAC, 0x3099, 0x5EAD, 0x5EAD, 0x0E56, 0x5EAE, 0x5EB2, 0x309A, + 0x5EB3, 0x5EB3, 0x163A, 0x5EB4, 0x5EB4, 0x309F, 0x5EB5, 0x5EB5, 0x1638, + 0x5EB6, 0x5EB6, 0x0D93, 0x5EB7, 0x5EB7, 0x0942, 0x5EB8, 0x5EB8, 0x109E, + 0x5EB9, 0x5EB9, 0x1637, 0x5EBA, 0x5EBD, 0x30A0, 0x5EBE, 0x5EBE, 0x1639, + 0x5EBF, 0x5EC8, 0x30A4, 0x5EC9, 0x5EC9, 0x09F7, 0x5ECA, 0x5ECA, 0x09B3, + 0x5ECB, 0x5ED0, 0x30AE, 0x5ED1, 0x5ED1, 0x163D, 0x5ED2, 0x5ED2, 0x163C, + 0x5ED3, 0x5ED3, 0x0995, 0x5ED4, 0x5ED5, 0x30B4, 0x5ED6, 0x5ED6, 0x0A17, + 0x5ED7, 0x5EDA, 0x30B6, 0x5EDB, 0x5EDB, 0x163E, 0x5EDC, 0x5EDE, 0x30BA, + 0x5EDF, 0x5EDF, 0x2087, 0x5EE0, 0x5EE0, 0x1E78, 0x5EE1, 0x5EE1, 0x23AE, + 0x5EE2, 0x5EE2, 0x1EF6, 0x5EE3, 0x5EE3, 0x1F31, 0x5EE4, 0x5EE7, 0x30BD, + 0x5EE8, 0x5EE8, 0x163F, 0x5EE9, 0x5EE9, 0x30C1, 0x5EEA, 0x5EEA, 0x1640, + 0x5EEB, 0x5EEB, 0x30C2, 0x5EEC, 0x5EEC, 0x2045, 0x5EED, 0x5EF2, 0x30C3, + 0x5EF3, 0x5EF3, 0x2178, 0x5EF4, 0x5EF4, 0x1398, 0x5EF5, 0x5EF5, 0x30C9, + 0x5EF6, 0x5EF6, 0x0FFC, 0x5EF7, 0x5EF7, 0x0E53, 0x5EF8, 0x5EF9, 0x30CA, + 0x5EFA, 0x5EFA, 0x0879, 0x5EFB, 0x5EFD, 0x30CC, 0x5EFE, 0x5EFE, 0x14AD, + 0x5EFF, 0x5EFF, 0x125B, 0x5F00, 0x5F00, 0x0937, 0x5F01, 0x5F01, 0x139D, + 0x5F02, 0x5F02, 0x1073, 0x5F03, 0x5F03, 0x0C19, 0x5F04, 0x5F04, 0x0B6B, + 0x5F05, 0x5F07, 0x30CF, 0x5F08, 0x5F08, 0x14AE, 0x5F09, 0x5F09, 0x30D2, + 0x5F0A, 0x5F0A, 0x0440, 0x5F0B, 0x5F0B, 0x14F6, 0x5F0C, 0x5F0E, 0x30D3, + 0x5F0F, 0x5F0F, 0x0D54, 0x5F10, 0x5F10, 0x30D6, 0x5F11, 0x5F11, 0x14F9, + 0x5F12, 0x5F12, 0x30D7, 0x5F13, 0x5F13, 0x0706, 0x5F14, 0x5F14, 0x30D8, + 0x5F15, 0x5F15, 0x1084, 0x5F16, 0x5F16, 0x30D9, 0x5F17, 0x5F17, 0x06A0, + 0x5F18, 0x5F18, 0x07A2, 0x5F19, 0x5F1A, 0x30DA, 0x5F1B, 0x5F1B, 0x04FF, + 0x5F1C, 0x5F1E, 0x30DC, 0x5F1F, 0x5F1F, 0x05BD, 0x5F20, 0x5F20, 0x1166, + 0x5F21, 0x5F24, 0x30DF, 0x5F25, 0x5F25, 0x0ADB, 0x5F26, 0x5F26, 0x0F3F, + 0x5F27, 0x5F27, 0x07B6, 0x5F28, 0x5F28, 0x30E3, 0x5F29, 0x5F29, 0x176F, + 0x5F2A, 0x5F2A, 0x176E, 0x5F2B, 0x5F2C, 0x30E4, 0x5F2D, 0x5F2D, 0x1770, + 0x5F2E, 0x5F2E, 0x30E6, 0x5F2F, 0x5F2F, 0x0E95, 0x5F30, 0x5F30, 0x30E7, + 0x5F31, 0x5F31, 0x0CD0, 0x5F32, 0x5F32, 0x30E8, 0x5F33, 0x5F33, 0x23F5, + 0x5F34, 0x5F34, 0x30E9, 0x5F35, 0x5F35, 0x2275, 0x5F36, 0x5F38, 0x30EA, + 0x5F39, 0x5F39, 0x0590, 0x5F3A, 0x5F3A, 0x0C3C, 0x5F3B, 0x5F3B, 0x30ED, + 0x5F3C, 0x5F3C, 0x1772, 0x5F3D, 0x5F3F, 0x30EE, 0x5F40, 0x5F40, 0x19BE, + 0x5F41, 0x5F45, 0x30F1, 0x5F46, 0x5F46, 0x266E, 0x5F47, 0x5F47, 0x30F6, + 0x5F48, 0x5F48, 0x1EB0, 0x5F49, 0x5F4B, 0x30F7, 0x5F4C, 0x5F4C, 0x2083, + 0x5F4D, 0x5F4D, 0x30FA, 0x5F4E, 0x5F4E, 0x2188, 0x5F4F, 0x5F4F, 0x30FB, + 0x5F50, 0x5F50, 0x1762, 0x5F51, 0x5F51, 0x30FC, 0x5F52, 0x5F52, 0x0742, + 0x5F53, 0x5F53, 0x0592, 0x5F54, 0x5F54, 0x30FD, 0x5F55, 0x5F55, 0x0A63, + 0x5F56, 0x5F56, 0x1764, 0x5F57, 0x5F57, 0x1763, 0x5F58, 0x5F58, 0x1765, + 0x5F59, 0x5F59, 0x267C, 0x5F5A, 0x5F5C, 0x30FE, 0x5F5D, 0x5F5D, 0x1054, + 0x5F5E, 0x5F60, 0x3101, 0x5F61, 0x5F61, 0x15EE, 0x5F62, 0x5F62, 0x0F99, + 0x5F63, 0x5F63, 0x3104, 0x5F64, 0x5F64, 0x0E5F, 0x5F65, 0x5F65, 0x3105, + 0x5F66, 0x5F66, 0x100E, 0x5F67, 0x5F68, 0x3106, 0x5F69, 0x5F69, 0x0491, + 0x5F6A, 0x5F6A, 0x0454, 0x5F6B, 0x5F6B, 0x3108, 0x5F6C, 0x5F6C, 0x045B, + 0x5F6D, 0x5F6D, 0x0BAE, 0x5F6E, 0x5F6F, 0x3109, 0x5F70, 0x5F70, 0x1164, + 0x5F71, 0x5F71, 0x1095, 0x5F72, 0x5F72, 0x310B, 0x5F73, 0x5F73, 0x15E0, + 0x5F74, 0x5F76, 0x310C, 0x5F77, 0x5F77, 0x15E1, 0x5F78, 0x5F78, 0x310F, + 0x5F79, 0x5F79, 0x1062, 0x5F7A, 0x5F7A, 0x3110, 0x5F7B, 0x5F7B, 0x04DE, + 0x5F7C, 0x5F7C, 0x0434, 0x5F7D, 0x5F7F, 0x3111, 0x5F80, 0x5F80, 0x0EAA, + 0x5F81, 0x5F81, 0x1198, 0x5F82, 0x5F82, 0x15E2, 0x5F83, 0x5F83, 0x3114, + 0x5F84, 0x5F84, 0x08E5, 0x5F85, 0x5F85, 0x0580, 0x5F86, 0x5F86, 0x3115, + 0x5F87, 0x5F87, 0x15E3, 0x5F88, 0x5F88, 0x0793, 0x5F89, 0x5F89, 0x15E4, + 0x5F8A, 0x5F8A, 0x07C7, 0x5F8B, 0x5F8B, 0x0A70, 0x5F8C, 0x5F8C, 0x15E5, + 0x5F8D, 0x5F8F, 0x3116, 0x5F90, 0x5F90, 0x0FB7, 0x5F91, 0x5F91, 0x1FC5, + 0x5F92, 0x5F92, 0x0E6E, 0x5F93, 0x5F94, 0x3119, 0x5F95, 0x5F95, 0x15E6, + 0x5F96, 0x5F96, 0x311B, 0x5F97, 0x5F97, 0x05A4, 0x5F98, 0x5F98, 0x0B88, + 0x5F99, 0x5F99, 0x15E7, 0x5F9A, 0x5F9B, 0x311C, 0x5F9C, 0x5F9C, 0x15E8, + 0x5F9D, 0x5F9D, 0x311E, 0x5F9E, 0x5F9E, 0x1EA1, 0x5F9F, 0x5F9F, 0x311F, + 0x5FA0, 0x5FA0, 0x2393, 0x5FA1, 0x5FA1, 0x10DE, 0x5FA2, 0x5FA7, 0x3120, + 0x5FA8, 0x5FA8, 0x15E9, 0x5FA9, 0x5FA9, 0x1F0B, 0x5FAA, 0x5FAA, 0x0FD6, + 0x5FAB, 0x5FAC, 0x3126, 0x5FAD, 0x5FAD, 0x15EA, 0x5FAE, 0x5FAE, 0x0EB1, + 0x5FAF, 0x5FB4, 0x3128, 0x5FB5, 0x5FB5, 0x15EB, 0x5FB6, 0x5FB6, 0x312E, + 0x5FB7, 0x5FB7, 0x05A3, 0x5FB8, 0x5FB8, 0x312F, 0x5FB9, 0x5FB9, 0x1E7C, + 0x5FBA, 0x5FBB, 0x3130, 0x5FBC, 0x5FBC, 0x15EC, 0x5FBD, 0x5FBD, 0x07EA, + 0x5FBE, 0x5FC2, 0x3132, 0x5FC3, 0x5FC3, 0x0F8F, 0x5FC4, 0x5FC4, 0x1642, + 0x5FC5, 0x5FC5, 0x0441, 0x5FC6, 0x5FC6, 0x106B, 0x5FC7, 0x5FC8, 0x3137, + 0x5FC9, 0x5FC9, 0x1643, 0x5FCA, 0x5FCB, 0x3139, 0x5FCC, 0x5FCC, 0x083C, + 0x5FCD, 0x5FCD, 0x0CA7, 0x5FCE, 0x5FCE, 0x313B, 0x5FCF, 0x5FCF, 0x1645, + 0x5FD0, 0x5FD0, 0x1A0C, 0x5FD1, 0x5FD1, 0x1A0B, 0x5FD2, 0x5FD2, 0x14F7, + 0x5FD3, 0x5FD5, 0x313C, 0x5FD6, 0x5FD6, 0x1644, 0x5FD7, 0x5FD7, 0x11BD, + 0x5FD8, 0x5FD8, 0x0EAD, 0x5FD9, 0x5FD9, 0x0AAB, 0x5FDA, 0x5FDC, 0x313F, + 0x5FDD, 0x5FDD, 0x1683, 0x5FDE, 0x5FDF, 0x3142, 0x5FE0, 0x5FE0, 0x11D1, + 0x5FE1, 0x5FE1, 0x1649, 0x5FE2, 0x5FE3, 0x3144, 0x5FE4, 0x5FE4, 0x164A, + 0x5FE5, 0x5FE6, 0x3146, 0x5FE7, 0x5FE7, 0x10AC, 0x5FE8, 0x5FE9, 0x3148, + 0x5FEA, 0x5FEA, 0x164E, 0x5FEB, 0x5FEB, 0x0979, 0x5FEC, 0x5FEC, 0x314A, + 0x5FED, 0x5FED, 0x164F, 0x5FEE, 0x5FEE, 0x1647, 0x5FEF, 0x5FF0, 0x314B, + 0x5FF1, 0x5FF1, 0x04E5, 0x5FF2, 0x5FF4, 0x314D, 0x5FF5, 0x5FF5, 0x0B51, + 0x5FF6, 0x5FF7, 0x3150, 0x5FF8, 0x5FF8, 0x1650, 0x5FF9, 0x5FFA, 0x3152, + 0x5FFB, 0x5FFB, 0x0F8E, 0x5FFC, 0x5FFC, 0x3154, 0x5FFD, 0x5FFD, 0x07AD, + 0x5FFE, 0x5FFE, 0x164B, 0x5FFF, 0x5FFF, 0x067B, 0x6000, 0x6000, 0x07C8, + 0x6001, 0x6001, 0x0DFF, 0x6002, 0x6002, 0x0DC0, 0x6003, 0x6003, 0x1646, + 0x6004, 0x6004, 0x1648, 0x6005, 0x6006, 0x164C, 0x6007, 0x6009, 0x3155, + 0x600A, 0x600A, 0x1659, 0x600B, 0x600C, 0x3158, 0x600D, 0x600D, 0x1656, + 0x600E, 0x600E, 0x1138, 0x600F, 0x600F, 0x1655, 0x6010, 0x6011, 0x315A, + 0x6012, 0x6012, 0x0B6E, 0x6013, 0x6013, 0x315C, 0x6014, 0x6014, 0x119B, + 0x6015, 0x6015, 0x0B83, 0x6016, 0x6016, 0x0487, 0x6017, 0x6018, 0x315D, + 0x6019, 0x6019, 0x1651, 0x601A, 0x601A, 0x315F, 0x601B, 0x601B, 0x1654, + 0x601C, 0x601C, 0x09F8, 0x601D, 0x601D, 0x0DB1, 0x601E, 0x601F, 0x3160, + 0x6020, 0x6020, 0x0582, 0x6021, 0x6021, 0x165B, 0x6022, 0x6024, 0x3162, + 0x6025, 0x6025, 0x0824, 0x6026, 0x6026, 0x1653, 0x6027, 0x6027, 0x0F9F, + 0x6028, 0x6028, 0x10FC, 0x6029, 0x6029, 0x1657, 0x602A, 0x602A, 0x072F, + 0x602B, 0x602B, 0x1658, 0x602C, 0x602E, 0x3165, 0x602F, 0x602F, 0x0C50, + 0x6030, 0x6034, 0x3168, 0x6035, 0x6035, 0x1652, 0x6036, 0x603A, 0x316D, + 0x603B, 0x603B, 0x1239, 0x603C, 0x603C, 0x1A0D, 0x603D, 0x603E, 0x3172, + 0x603F, 0x603F, 0x165A, 0x6040, 0x6040, 0x3174, 0x6041, 0x6041, 0x1A11, + 0x6042, 0x6042, 0x1660, 0x6043, 0x6043, 0x0D68, 0x6044, 0x604A, 0x3175, + 0x604B, 0x604B, 0x09FE, 0x604C, 0x604C, 0x317C, 0x604D, 0x604D, 0x07E5, + 0x604E, 0x604F, 0x317D, 0x6050, 0x6050, 0x0963, 0x6051, 0x6051, 0x317F, + 0x6052, 0x6052, 0x079A, 0x6053, 0x6054, 0x3180, 0x6055, 0x6055, 0x0D96, + 0x6056, 0x6058, 0x3182, 0x6059, 0x6059, 0x1A12, 0x605A, 0x605A, 0x1A0F, + 0x605B, 0x605C, 0x3185, 0x605D, 0x605D, 0x1A0E, 0x605E, 0x6061, 0x3187, + 0x6062, 0x6062, 0x07EB, 0x6063, 0x6063, 0x1A13, 0x6064, 0x6064, 0x0FBF, + 0x6065, 0x6066, 0x318B, 0x6067, 0x6067, 0x1A10, 0x6068, 0x6068, 0x0795, + 0x6069, 0x6069, 0x0636, 0x606A, 0x606A, 0x1661, 0x606B, 0x606B, 0x05F1, + 0x606C, 0x606C, 0x0E44, 0x606D, 0x606D, 0x0700, 0x606E, 0x606E, 0x318D, + 0x606F, 0x606F, 0x0F0F, 0x6070, 0x6070, 0x0C1E, 0x6071, 0x6072, 0x318E, + 0x6073, 0x6073, 0x095F, 0x6074, 0x6075, 0x3190, 0x6076, 0x6076, 0x0630, + 0x6077, 0x6077, 0x3192, 0x6078, 0x6079, 0x165C, 0x607A, 0x607A, 0x165F, + 0x607B, 0x607B, 0x165E, 0x607C, 0x607C, 0x0B38, 0x607D, 0x607D, 0x1662, + 0x607E, 0x607E, 0x3193, 0x607F, 0x607F, 0x10A6, 0x6080, 0x6082, 0x3194, + 0x6083, 0x6083, 0x1667, 0x6084, 0x6084, 0x0C41, 0x6085, 0x6088, 0x3197, + 0x6089, 0x6089, 0x0F11, 0x608A, 0x608B, 0x319B, 0x608C, 0x608C, 0x1669, + 0x608D, 0x608D, 0x076E, 0x608E, 0x6091, 0x319D, 0x6092, 0x6092, 0x1668, + 0x6093, 0x6093, 0x31A1, 0x6094, 0x6094, 0x07EF, 0x6095, 0x6095, 0x31A2, + 0x6096, 0x6096, 0x1663, 0x6097, 0x6099, 0x31A3, 0x609A, 0x609A, 0x1664, + 0x609B, 0x609B, 0x166A, 0x609C, 0x609C, 0x31A6, 0x609D, 0x609D, 0x1666, + 0x609E, 0x609E, 0x31A7, 0x609F, 0x609F, 0x0F01, 0x60A0, 0x60A0, 0x10AB, + 0x60A1, 0x60A2, 0x31A8, 0x60A3, 0x60A3, 0x07D1, 0x60A4, 0x60A5, 0x31AA, + 0x60A6, 0x60A6, 0x1106, 0x60A7, 0x60A7, 0x31AC, 0x60A8, 0x60A8, 0x0B5D, + 0x60A9, 0x60AA, 0x31AD, 0x60AB, 0x60AB, 0x1A14, 0x60AC, 0x60AC, 0x0FC7, + 0x60AD, 0x60AD, 0x1665, 0x60AE, 0x60AE, 0x31AF, 0x60AF, 0x60AF, 0x0AFA, + 0x60B0, 0x60B0, 0x31B0, 0x60B1, 0x60B1, 0x166D, 0x60B2, 0x60B2, 0x0418, + 0x60B3, 0x60B3, 0x31B1, 0x60B4, 0x60B4, 0x1672, 0x60B5, 0x60B5, 0x23B4, + 0x60B6, 0x60B6, 0x207E, 0x60B7, 0x60B7, 0x31B2, 0x60B8, 0x60B8, 0x0835, + 0x60B9, 0x60BA, 0x31B3, 0x60BB, 0x60BB, 0x166C, 0x60BC, 0x60BC, 0x05A0, + 0x60BD, 0x60C4, 0x31B5, 0x60C5, 0x60C5, 0x0C66, 0x60C6, 0x60C6, 0x1670, + 0x60C7, 0x60C9, 0x31BD, 0x60CA, 0x60CA, 0x08D9, 0x60CB, 0x60CB, 0x0EA0, + 0x60CC, 0x60D0, 0x31C0, 0x60D1, 0x60D1, 0x0808, 0x60D2, 0x60D4, 0x31C5, + 0x60D5, 0x60D5, 0x0E3B, 0x60D6, 0x60D7, 0x31C8, 0x60D8, 0x60D8, 0x166F, + 0x60D9, 0x60D9, 0x31CA, 0x60DA, 0x60DA, 0x1671, 0x60DB, 0x60DB, 0x31CB, + 0x60DC, 0x60DC, 0x0F14, 0x60DD, 0x60DD, 0x166E, 0x60DE, 0x60DE, 0x31CC, + 0x60DF, 0x60DF, 0x0EB8, 0x60E0, 0x60E0, 0x07F2, 0x60E1, 0x60E1, 0x1EE3, + 0x60E2, 0x60E5, 0x31CD, 0x60E6, 0x60E6, 0x05CC, 0x60E7, 0x60E7, 0x0914, + 0x60E8, 0x60E8, 0x0499, 0x60E9, 0x60E9, 0x04F2, 0x60EA, 0x60EA, 0x31D1, + 0x60EB, 0x60EB, 0x0422, 0x60EC, 0x60EC, 0x166B, 0x60ED, 0x60ED, 0x0498, + 0x60EE, 0x60EE, 0x058D, 0x60EF, 0x60EF, 0x0738, 0x60F0, 0x60F0, 0x0627, + 0x60F1, 0x60F1, 0x2095, 0x60F2, 0x60F2, 0x23BB, 0x60F3, 0x60F3, 0x0F58, + 0x60F4, 0x60F4, 0x1677, 0x60F5, 0x60F5, 0x31D2, 0x60F6, 0x60F6, 0x07E1, + 0x60F7, 0x60F8, 0x31D3, 0x60F9, 0x60F9, 0x0CA2, 0x60FA, 0x60FA, 0x0F95, + 0x60FB, 0x60FB, 0x23B9, 0x60FC, 0x60FF, 0x31D5, 0x6100, 0x6100, 0x1678, + 0x6101, 0x6101, 0x0513, 0x6102, 0x6105, 0x31D9, 0x6106, 0x6106, 0x1A15, + 0x6107, 0x6107, 0x31DD, 0x6108, 0x6108, 0x10DF, 0x6109, 0x6109, 0x10C9, + 0x610A, 0x610C, 0x31DE, 0x610D, 0x610D, 0x1A16, 0x610E, 0x610E, 0x1679, + 0x610F, 0x610F, 0x1069, 0x6110, 0x6114, 0x31E1, 0x6115, 0x6115, 0x1675, + 0x6116, 0x6119, 0x31E6, 0x611A, 0x611A, 0x10C3, 0x611B, 0x611B, 0x1E28, + 0x611C, 0x611C, 0x23BD, 0x611D, 0x611E, 0x31EA, 0x611F, 0x611F, 0x06CB, + 0x6120, 0x6120, 0x1673, 0x6121, 0x6122, 0x31EC, 0x6123, 0x6123, 0x1676, + 0x6124, 0x6124, 0x067C, 0x6125, 0x6125, 0x31EE, 0x6126, 0x6126, 0x1674, + 0x6127, 0x6127, 0x098D, 0x6128, 0x612A, 0x31EF, 0x612B, 0x612B, 0x167A, + 0x612C, 0x6133, 0x31F2, 0x6134, 0x6134, 0x23B5, 0x6135, 0x6136, 0x31FA, + 0x6137, 0x6137, 0x23BA, 0x6138, 0x613D, 0x31FC, 0x613E, 0x613E, 0x23B3, + 0x613F, 0x613F, 0x10FB, 0x6140, 0x6147, 0x3202, 0x6148, 0x6148, 0x054B, + 0x6149, 0x6149, 0x320A, 0x614A, 0x614A, 0x167B, 0x614B, 0x614B, 0x2162, + 0x614C, 0x614C, 0x07DA, 0x614D, 0x614D, 0x320B, 0x614E, 0x614E, 0x0D30, + 0x614F, 0x6150, 0x320C, 0x6151, 0x6151, 0x0D1E, 0x6152, 0x6154, 0x320E, + 0x6155, 0x6155, 0x0B20, 0x6156, 0x6157, 0x3211, 0x6158, 0x6158, 0x1E5E, + 0x6159, 0x6159, 0x3213, 0x615A, 0x615A, 0x1E5D, 0x615B, 0x615C, 0x3214, + 0x615D, 0x615D, 0x1A17, 0x615E, 0x615E, 0x3216, 0x615F, 0x615F, 0x23B7, + 0x6160, 0x6161, 0x3217, 0x6162, 0x6162, 0x0AA4, 0x6163, 0x6163, 0x1F2F, + 0x6164, 0x6164, 0x24DF, 0x6165, 0x6166, 0x3219, 0x6167, 0x6167, 0x07F0, + 0x6168, 0x6168, 0x093B, 0x6169, 0x6169, 0x321B, 0x616A, 0x616A, 0x23B2, + 0x616B, 0x616B, 0x214E, 0x616C, 0x616D, 0x321C, 0x616E, 0x616E, 0x2052, + 0x616F, 0x616F, 0x321E, 0x6170, 0x6170, 0x0ECE, 0x6171, 0x6172, 0x321F, + 0x6173, 0x6173, 0x23BC, 0x6174, 0x6174, 0x3221, 0x6175, 0x6175, 0x167C, + 0x6176, 0x6176, 0x20EB, 0x6177, 0x6177, 0x0943, 0x6178, 0x6181, 0x3222, + 0x6182, 0x6182, 0x2232, 0x6183, 0x6189, 0x322C, 0x618A, 0x618A, 0x1E3F, + 0x618B, 0x618B, 0x0458, 0x618C, 0x618D, 0x3233, 0x618E, 0x618E, 0x113A, + 0x618F, 0x618F, 0x3235, 0x6190, 0x6190, 0x201B, 0x6191, 0x6191, 0x20BC, + 0x6192, 0x6192, 0x23BE, 0x6193, 0x6193, 0x3236, 0x6194, 0x6194, 0x167E, + 0x6195, 0x6199, 0x3237, 0x619A, 0x619A, 0x1EAE, 0x619B, 0x619C, 0x323C, + 0x619D, 0x619D, 0x1A19, 0x619E, 0x61A3, 0x323E, 0x61A4, 0x61A4, 0x1EFB, + 0x61A5, 0x61A6, 0x3244, 0x61A7, 0x61A7, 0x167F, 0x61A8, 0x61A8, 0x0760, + 0x61A9, 0x61A9, 0x1A18, 0x61AA, 0x61AA, 0x3246, 0x61AB, 0x61AB, 0x2089, + 0x61AC, 0x61AC, 0x167D, 0x61AD, 0x61AD, 0x3247, 0x61AE, 0x61AE, 0x23B1, + 0x61AF, 0x61B1, 0x3248, 0x61B2, 0x61B2, 0x21C4, 0x61B3, 0x61B5, 0x324B, + 0x61B6, 0x61B6, 0x2214, 0x61B7, 0x61B7, 0x1680, 0x61B8, 0x61BD, 0x324E, + 0x61BE, 0x61BE, 0x076D, 0x61BF, 0x61C1, 0x3254, 0x61C2, 0x61C2, 0x05ED, + 0x61C3, 0x61C6, 0x3257, 0x61C7, 0x61C7, 0x1FDE, 0x61C8, 0x61C8, 0x0F83, + 0x61C9, 0x61C9, 0x2223, 0x61CA, 0x61CA, 0x03CE, 0x61CB, 0x61CB, 0x1A1A, + 0x61CC, 0x61CC, 0x23B6, 0x61CD, 0x61D0, 0x325B, 0x61D1, 0x61D1, 0x1A1B, + 0x61D2, 0x61D2, 0x09AC, 0x61D3, 0x61D3, 0x325F, 0x61D4, 0x61D4, 0x1681, + 0x61D5, 0x61DD, 0x3260, 0x61DE, 0x61DE, 0x268C, 0x61DF, 0x61DF, 0x24DE, + 0x61E0, 0x61E2, 0x3269, 0x61E3, 0x61E3, 0x24E0, 0x61E4, 0x61E5, 0x326C, + 0x61E6, 0x61E6, 0x0B74, 0x61E7, 0x61E7, 0x326E, 0x61E8, 0x61E8, 0x23B8, + 0x61E9, 0x61F1, 0x326F, 0x61F2, 0x61F2, 0x1E81, 0x61F3, 0x61F4, 0x3278, + 0x61F5, 0x61F5, 0x1682, 0x61F6, 0x61F6, 0x1FFE, 0x61F7, 0x61F7, 0x1F51, + 0x61F8, 0x61F8, 0x21E1, 0x61F9, 0x61F9, 0x327A, 0x61FA, 0x61FA, 0x23B0, + 0x61FB, 0x61FB, 0x327B, 0x61FC, 0x61FC, 0x1FCE, 0x61FD, 0x61FD, 0x327C, + 0x61FE, 0x61FE, 0x211E, 0x61FF, 0x61FF, 0x13E0, 0x6200, 0x6200, 0x2021, + 0x6201, 0x6205, 0x327D, 0x6206, 0x6206, 0x1A1C, 0x6207, 0x6207, 0x24E1, + 0x6208, 0x6208, 0x06E5, 0x6209, 0x6209, 0x3282, 0x620A, 0x620A, 0x0EFB, + 0x620B, 0x620B, 0x18F9, 0x620C, 0x620C, 0x0FB2, 0x620D, 0x620D, 0x0D90, + 0x620E, 0x620E, 0x0CB1, 0x620F, 0x620F, 0x0F24, 0x6210, 0x6210, 0x04EE, + 0x6211, 0x6211, 0x0EE1, 0x6212, 0x6212, 0x08B5, 0x6213, 0x6213, 0x3283, + 0x6214, 0x6214, 0x24A3, 0x6215, 0x6215, 0x169E, 0x6216, 0x6216, 0x0807, + 0x6217, 0x6217, 0x18FA, 0x6218, 0x6218, 0x115E, 0x6219, 0x6219, 0x3284, + 0x621A, 0x621A, 0x0BFC, 0x621B, 0x621B, 0x18FB, 0x621C, 0x621E, 0x3285, + 0x621F, 0x621F, 0x18FC, 0x6220, 0x6220, 0x3288, 0x6221, 0x6221, 0x18FE, + 0x6222, 0x6222, 0x18FD, 0x6223, 0x6223, 0x3289, 0x6224, 0x6224, 0x1900, + 0x6225, 0x6225, 0x18FF, 0x6226, 0x6226, 0x328A, 0x6227, 0x6227, 0x24A4, + 0x6228, 0x6229, 0x328B, 0x622A, 0x622A, 0x08A9, 0x622B, 0x622B, 0x328D, + 0x622C, 0x622C, 0x1901, 0x622D, 0x622D, 0x328E, 0x622E, 0x622E, 0x0A65, + 0x622F, 0x622F, 0x328F, 0x6230, 0x6230, 0x2273, 0x6231, 0x6231, 0x3290, + 0x6232, 0x6232, 0x21B0, 0x6233, 0x6233, 0x0544, 0x6234, 0x6234, 0x057A, + 0x6235, 0x6236, 0x3291, 0x6237, 0x6237, 0x07BC, 0x6238, 0x623C, 0x3293, + 0x623D, 0x623D, 0x19F4, 0x623E, 0x623E, 0x19F3, 0x623F, 0x623F, 0x065C, + 0x6240, 0x6240, 0x0DEE, 0x6241, 0x6241, 0x044B, 0x6242, 0x6242, 0x3298, + 0x6243, 0x6243, 0x19F5, 0x6244, 0x6246, 0x3299, 0x6247, 0x6247, 0x0D01, + 0x6248, 0x6249, 0x19F6, 0x624A, 0x624A, 0x329C, 0x624B, 0x624B, 0x0D6D, + 0x624C, 0x624C, 0x14BA, 0x624D, 0x624D, 0x048C, 0x624E, 0x624E, 0x113D, + 0x624F, 0x6250, 0x329D, 0x6251, 0x6251, 0x0BEA, 0x6252, 0x6252, 0x03D2, + 0x6253, 0x6253, 0x0575, 0x6254, 0x6254, 0x0CAE, 0x6255, 0x6257, 0x329F, + 0x6258, 0x6258, 0x0E81, 0x6259, 0x625A, 0x32A2, 0x625B, 0x625B, 0x0945, + 0x625C, 0x6262, 0x32A4, 0x6263, 0x6263, 0x0968, 0x6264, 0x6265, 0x32AB, + 0x6266, 0x6266, 0x0C21, 0x6267, 0x6267, 0x11B3, 0x6268, 0x6268, 0x32AD, + 0x6269, 0x6269, 0x0994, 0x626A, 0x626A, 0x14BB, 0x626B, 0x626B, 0x0CE1, + 0x626C, 0x626C, 0x1018, 0x626D, 0x626D, 0x0B65, 0x626E, 0x626E, 0x03F2, + 0x626F, 0x626F, 0x04DB, 0x6270, 0x6270, 0x0CA0, 0x6271, 0x6272, 0x32AE, + 0x6273, 0x6273, 0x03ED, 0x6274, 0x6275, 0x32B0, 0x6276, 0x6276, 0x0693, + 0x6277, 0x6278, 0x32B2, 0x6279, 0x6279, 0x0BBB, 0x627A, 0x627B, 0x32B4, + 0x627C, 0x627C, 0x0632, 0x627D, 0x627D, 0x32B6, 0x627E, 0x627E, 0x1173, + 0x627F, 0x627F, 0x04F5, 0x6280, 0x6280, 0x082F, 0x6281, 0x6283, 0x32B7, + 0x6284, 0x6284, 0x04D2, 0x6285, 0x6288, 0x32BA, 0x6289, 0x6289, 0x0920, + 0x628A, 0x628A, 0x03DC, 0x628B, 0x6290, 0x32BE, 0x6291, 0x6291, 0x105D, + 0x6292, 0x6292, 0x0D7A, 0x6293, 0x6293, 0x1202, 0x6294, 0x6294, 0x32C4, + 0x6295, 0x6295, 0x0E67, 0x6296, 0x6296, 0x05F5, 0x6297, 0x6297, 0x0946, + 0x6298, 0x6298, 0x117C, 0x6299, 0x6299, 0x32C5, 0x629A, 0x629A, 0x06A2, + 0x629B, 0x629B, 0x0B98, 0x629C, 0x629E, 0x32C6, 0x629F, 0x629F, 0x14BC, + 0x62A0, 0x62A0, 0x0966, 0x62A1, 0x62A1, 0x0A7C, 0x62A2, 0x62A2, 0x0C3D, + 0x62A3, 0x62A3, 0x32C9, 0x62A4, 0x62A4, 0x07B9, 0x62A5, 0x62A5, 0x0411, + 0x62A6, 0x62A7, 0x32CA, 0x62A8, 0x62A8, 0x0BAB, 0x62A9, 0x62AA, 0x32CC, + 0x62AB, 0x62AB, 0x0BBC, 0x62AC, 0x62AC, 0x0DFA, 0x62AD, 0x62B0, 0x32CE, + 0x62B1, 0x62B1, 0x0410, 0x62B2, 0x62B4, 0x32D2, 0x62B5, 0x62B5, 0x05B7, + 0x62B6, 0x62B8, 0x32D5, 0x62B9, 0x62B9, 0x0B0B, 0x62BA, 0x62BA, 0x32D8, + 0x62BB, 0x62BB, 0x14BD, 0x62BC, 0x62BC, 0x0FE3, 0x62BD, 0x62BD, 0x050E, + 0x62BE, 0x62BE, 0x32D9, 0x62BF, 0x62BF, 0x0AF7, 0x62C0, 0x62C1, 0x32DA, + 0x62C2, 0x62C2, 0x0694, 0x62C3, 0x62C3, 0x32DC, 0x62C4, 0x62C4, 0x11F3, + 0x62C5, 0x62C5, 0x0584, 0x62C6, 0x62C6, 0x04B7, 0x62C7, 0x62C7, 0x0B17, + 0x62C8, 0x62C8, 0x0B4C, 0x62C9, 0x62C9, 0x0998, 0x62CA, 0x62CA, 0x14BE, + 0x62CB, 0x62CB, 0x32DD, 0x62CC, 0x62CC, 0x03F3, 0x62CD, 0x62CD, 0x0B85, + 0x62CE, 0x62CE, 0x0A29, 0x62CF, 0x62CF, 0x32DE, 0x62D0, 0x62D0, 0x072E, + 0x62D1, 0x62D1, 0x32DF, 0x62D2, 0x62D2, 0x090B, 0x62D3, 0x62D3, 0x0E89, + 0x62D4, 0x62D4, 0x03D9, 0x62D5, 0x62D5, 0x32E0, 0x62D6, 0x62D6, 0x0E80, + 0x62D7, 0x62D7, 0x14C0, 0x62D8, 0x62D8, 0x08FF, 0x62D9, 0x62D9, 0x121B, + 0x62DA, 0x62DA, 0x14BF, 0x62DB, 0x62DB, 0x1171, 0x62DC, 0x62DC, 0x03E8, + 0x62DD, 0x62DE, 0x32E1, 0x62DF, 0x62DF, 0x0B45, 0x62E0, 0x62E1, 0x32E3, + 0x62E2, 0x62E2, 0x0A4A, 0x62E3, 0x62E3, 0x0863, 0x62E4, 0x62E4, 0x32E5, + 0x62E5, 0x62E5, 0x109A, 0x62E6, 0x62E6, 0x09A4, 0x62E7, 0x62E7, 0x0B62, + 0x62E8, 0x62E8, 0x046D, 0x62E9, 0x62E9, 0x1134, 0x62EA, 0x62EB, 0x32E6, + 0x62EC, 0x62EC, 0x0993, 0x62ED, 0x62ED, 0x0D5A, 0x62EE, 0x62EE, 0x14C1, + 0x62EF, 0x62EF, 0x119D, 0x62F0, 0x62F0, 0x32E8, 0x62F1, 0x62F1, 0x0709, + 0x62F2, 0x62F2, 0x32E9, 0x62F3, 0x62F3, 0x0C88, 0x62F4, 0x62F4, 0x0D9E, + 0x62F5, 0x62F5, 0x32EA, 0x62F6, 0x62F6, 0x14C3, 0x62F7, 0x62F7, 0x094A, + 0x62F8, 0x62FB, 0x32EB, 0x62FC, 0x62FC, 0x0BD3, 0x62FD, 0x62FD, 0x1204, + 0x62FE, 0x62FE, 0x0D47, 0x62FF, 0x62FF, 0x0B26, 0x6300, 0x6300, 0x32EF, + 0x6301, 0x6301, 0x04FB, 0x6302, 0x6302, 0x072B, 0x6303, 0x6306, 0x32F0, + 0x6307, 0x6307, 0x11B7, 0x6308, 0x6308, 0x194E, 0x6309, 0x6309, 0x03BF, + 0x630A, 0x630D, 0x32F4, 0x630E, 0x630E, 0x0973, 0x630F, 0x6310, 0x32F8, + 0x6311, 0x6311, 0x0E47, 0x6312, 0x6315, 0x32FA, 0x6316, 0x6316, 0x0E8B, + 0x6317, 0x6319, 0x32FE, 0x631A, 0x631A, 0x11BE, 0x631B, 0x631B, 0x0A75, + 0x631C, 0x631C, 0x3301, 0x631D, 0x631D, 0x0EDD, 0x631E, 0x631E, 0x0DF5, + 0x631F, 0x631F, 0x0F79, 0x6320, 0x6320, 0x0B36, 0x6321, 0x6321, 0x0593, + 0x6322, 0x6322, 0x14C2, 0x6323, 0x6323, 0x1196, 0x6324, 0x6324, 0x082A, + 0x6325, 0x6325, 0x07E8, 0x6326, 0x6327, 0x3302, 0x6328, 0x6328, 0x03AF, + 0x6329, 0x6329, 0x3304, 0x632A, 0x632A, 0x0B73, 0x632B, 0x632B, 0x056F, + 0x632C, 0x632E, 0x3305, 0x632F, 0x632F, 0x1192, 0x6330, 0x6331, 0x3308, + 0x6332, 0x6332, 0x194F, 0x6333, 0x6338, 0x330A, 0x6339, 0x6339, 0x14C4, + 0x633A, 0x633A, 0x0E57, 0x633B, 0x633C, 0x3310, 0x633D, 0x633D, 0x0E9D, + 0x633E, 0x633E, 0x21D1, 0x633F, 0x6341, 0x3312, 0x6342, 0x6342, 0x0EF5, + 0x6343, 0x6343, 0x14C6, 0x6344, 0x6344, 0x3315, 0x6345, 0x6345, 0x0E62, + 0x6346, 0x6346, 0x0991, 0x6347, 0x6348, 0x3316, 0x6349, 0x6349, 0x121A, + 0x634A, 0x634A, 0x3318, 0x634B, 0x634B, 0x14C5, 0x634C, 0x634C, 0x03D1, + 0x634D, 0x634D, 0x076B, 0x634E, 0x634E, 0x0D0C, 0x634F, 0x634F, 0x0B56, + 0x6350, 0x6350, 0x0917, 0x6351, 0x6354, 0x3319, 0x6355, 0x6355, 0x047D, + 0x6356, 0x635D, 0x331D, 0x635E, 0x635E, 0x09B7, 0x635F, 0x635F, 0x0DE5, + 0x6360, 0x6360, 0x3325, 0x6361, 0x6361, 0x0864, 0x6362, 0x6362, 0x07D0, + 0x6363, 0x6363, 0x0598, 0x6364, 0x6366, 0x3326, 0x6367, 0x6367, 0x0BB6, + 0x6368, 0x6368, 0x211C, 0x6369, 0x6369, 0x14D0, 0x636A, 0x636A, 0x3329, + 0x636B, 0x636B, 0x235D, 0x636C, 0x636C, 0x332A, 0x636D, 0x636D, 0x14CD, + 0x636E, 0x636E, 0x090C, 0x636F, 0x6370, 0x332B, 0x6371, 0x6371, 0x14C9, + 0x6372, 0x6372, 0x2682, 0x6373, 0x6375, 0x332D, 0x6376, 0x6376, 0x053A, + 0x6377, 0x6377, 0x08AE, 0x6378, 0x6379, 0x3330, 0x637A, 0x637A, 0x14CA, + 0x637B, 0x637B, 0x0B50, 0x637C, 0x637F, 0x3332, 0x6380, 0x6380, 0x0F33, + 0x6381, 0x6381, 0x3336, 0x6382, 0x6382, 0x05C1, 0x6383, 0x6383, 0x210D, + 0x6384, 0x6384, 0x205A, 0x6385, 0x6386, 0x3337, 0x6387, 0x6387, 0x061D, + 0x6388, 0x6388, 0x0D71, 0x6389, 0x6389, 0x05D5, 0x638A, 0x638A, 0x14CF, + 0x638B, 0x638B, 0x3339, 0x638C, 0x638C, 0x1167, 0x638D, 0x638D, 0x333A, + 0x638E, 0x638E, 0x14CB, 0x638F, 0x638F, 0x0E20, 0x6390, 0x6390, 0x0C1D, + 0x6391, 0x6391, 0x333B, 0x6392, 0x6392, 0x0B86, 0x6393, 0x6395, 0x333C, + 0x6396, 0x6396, 0x103B, 0x6397, 0x6397, 0x333F, 0x6398, 0x6398, 0x0921, + 0x6399, 0x639F, 0x3340, 0x63A0, 0x63A0, 0x0A7A, 0x63A1, 0x63A1, 0x3347, + 0x63A2, 0x63A2, 0x0E10, 0x63A3, 0x63A3, 0x04DD, 0x63A4, 0x63A4, 0x3348, + 0x63A5, 0x63A5, 0x08A4, 0x63A6, 0x63A6, 0x3349, 0x63A7, 0x63A7, 0x0965, + 0x63A8, 0x63A8, 0x0E77, 0x63A9, 0x63A9, 0x1003, 0x63AA, 0x63AA, 0x056E, + 0x63AB, 0x63AB, 0x334A, 0x63AC, 0x63AC, 0x14CE, 0x63AD, 0x63AD, 0x14C7, + 0x63AE, 0x63AE, 0x14D1, 0x63AF, 0x63AF, 0x334B, 0x63B0, 0x63B0, 0x1950, + 0x63B1, 0x63B2, 0x334C, 0x63B3, 0x63B3, 0x0A57, 0x63B4, 0x63B4, 0x14CC, + 0x63B5, 0x63B6, 0x334E, 0x63B7, 0x63B7, 0x11BF, 0x63B8, 0x63B8, 0x0588, + 0x63B9, 0x63B9, 0x3350, 0x63BA, 0x63BA, 0x04BB, 0x63BB, 0x63BB, 0x3351, + 0x63BC, 0x63BC, 0x14D2, 0x63BD, 0x63BD, 0x3352, 0x63BE, 0x63BE, 0x14DC, + 0x63BF, 0x63BF, 0x3353, 0x63C0, 0x63C0, 0x1F8D, 0x63C1, 0x63C3, 0x3354, + 0x63C4, 0x63C4, 0x14D7, 0x63C5, 0x63C5, 0x3357, 0x63C6, 0x63C6, 0x14DB, + 0x63C7, 0x63C8, 0x3358, 0x63C9, 0x63C9, 0x0CBB, 0x63CA, 0x63CC, 0x335A, + 0x63CD, 0x63CD, 0x123E, 0x63CE, 0x63CE, 0x14D9, 0x63CF, 0x63CF, 0x0AED, + 0x63D0, 0x63D0, 0x0E34, 0x63D1, 0x63D1, 0x335D, 0x63D2, 0x63D2, 0x04AC, + 0x63D3, 0x63D5, 0x335E, 0x63D6, 0x63D6, 0x1045, 0x63D7, 0x63D9, 0x3361, + 0x63DA, 0x63DA, 0x21FF, 0x63DB, 0x63DD, 0x3364, 0x63DE, 0x63DE, 0x14D8, + 0x63DF, 0x63DF, 0x3367, 0x63E0, 0x63E0, 0x14D5, 0x63E1, 0x63E1, 0x0EE4, + 0x63E2, 0x63E2, 0x3368, 0x63E3, 0x63E3, 0x052A, 0x63E4, 0x63E8, 0x3369, + 0x63E9, 0x63E9, 0x0938, 0x63EA, 0x63EA, 0x08ED, 0x63EB, 0x63EC, 0x336E, + 0x63ED, 0x63ED, 0x08A3, 0x63EE, 0x63EE, 0x1F58, 0x63EF, 0x63F1, 0x3370, + 0x63F2, 0x63F2, 0x14D3, 0x63F3, 0x63F3, 0x3373, 0x63F4, 0x63F4, 0x10F1, + 0x63F5, 0x63F5, 0x3374, 0x63F6, 0x63F6, 0x14C8, 0x63F7, 0x63F7, 0x3375, + 0x63F8, 0x63F8, 0x14D4, 0x63F9, 0x63FC, 0x3376, 0x63FD, 0x63FD, 0x09AA, + 0x63FE, 0x63FE, 0x337A, 0x63FF, 0x63FF, 0x14D6, 0x6400, 0x6400, 0x04BA, + 0x6401, 0x6401, 0x06E4, 0x6402, 0x6402, 0x0A4E, 0x6403, 0x6404, 0x337B, + 0x6405, 0x6405, 0x0892, 0x6406, 0x640A, 0x337D, 0x640B, 0x640B, 0x14DF, + 0x640C, 0x640C, 0x14E2, 0x640D, 0x640D, 0x215B, 0x640E, 0x640E, 0x3382, + 0x640F, 0x640F, 0x0472, 0x6410, 0x6410, 0x0527, 0x6411, 0x6412, 0x3383, + 0x6413, 0x6413, 0x056D, 0x6414, 0x6414, 0x0CDF, 0x6415, 0x6416, 0x3385, + 0x6417, 0x6417, 0x1EB6, 0x6418, 0x641A, 0x3387, 0x641B, 0x641B, 0x14E0, + 0x641C, 0x641C, 0x0DC6, 0x641D, 0x641D, 0x338A, 0x641E, 0x641E, 0x06DE, + 0x641F, 0x641F, 0x338B, 0x6420, 0x6420, 0x14E1, 0x6421, 0x6421, 0x14E4, + 0x6422, 0x6425, 0x338C, 0x6426, 0x6426, 0x14E3, 0x6427, 0x6429, 0x3390, + 0x642A, 0x642A, 0x0E15, 0x642B, 0x642B, 0x3393, 0x642C, 0x642C, 0x03EC, + 0x642D, 0x642D, 0x0571, 0x642E, 0x6433, 0x3394, 0x6434, 0x6434, 0x1736, + 0x6435, 0x6435, 0x339A, 0x6436, 0x6436, 0x20DB, 0x6437, 0x6439, 0x339B, + 0x643A, 0x643A, 0x0F7A, 0x643B, 0x643C, 0x339E, 0x643D, 0x643D, 0x04B2, + 0x643E, 0x643E, 0x33A0, 0x643F, 0x643F, 0x1951, 0x6440, 0x6440, 0x33A1, + 0x6441, 0x6441, 0x14DE, 0x6442, 0x6443, 0x33A2, 0x6444, 0x6444, 0x0D1C, + 0x6445, 0x6445, 0x14DD, 0x6446, 0x6446, 0x03E5, 0x6447, 0x6447, 0x1028, + 0x6448, 0x6448, 0x0460, 0x6449, 0x6449, 0x33A4, 0x644A, 0x644A, 0x0E02, + 0x644B, 0x6450, 0x33A5, 0x6451, 0x6451, 0x2360, 0x6452, 0x6452, 0x14DA, + 0x6453, 0x6453, 0x33AB, 0x6454, 0x6454, 0x0D99, 0x6455, 0x6457, 0x33AC, + 0x6458, 0x6458, 0x114B, 0x6459, 0x645B, 0x33AF, 0x645C, 0x645C, 0x2361, + 0x645D, 0x645D, 0x33B2, 0x645E, 0x645E, 0x14E5, 0x645F, 0x645F, 0x2040, + 0x6460, 0x6466, 0x33B3, 0x6467, 0x6467, 0x0560, 0x6468, 0x6468, 0x33BA, + 0x6469, 0x6469, 0x0B09, 0x646A, 0x646C, 0x33BB, 0x646D, 0x646D, 0x14E7, + 0x646E, 0x646E, 0x33BE, 0x646F, 0x646F, 0x228E, 0x6470, 0x6472, 0x33BF, + 0x6473, 0x6473, 0x1FDF, 0x6474, 0x6475, 0x33C2, 0x6476, 0x6476, 0x235E, + 0x6477, 0x6477, 0x33C4, 0x6478, 0x6479, 0x0B03, 0x647A, 0x647A, 0x14E9, + 0x647B, 0x647B, 0x1E6A, 0x647C, 0x6481, 0x33C5, 0x6482, 0x6482, 0x0A15, + 0x6483, 0x6483, 0x33CB, 0x6484, 0x6484, 0x14E6, 0x6485, 0x6485, 0x091E, + 0x6486, 0x6486, 0x33CC, 0x6487, 0x6487, 0x0BD1, 0x6488, 0x6488, 0x2002, + 0x6489, 0x6490, 0x33CD, 0x6491, 0x6491, 0x04EA, 0x6492, 0x6492, 0x0CD1, + 0x6493, 0x6493, 0x2093, 0x6494, 0x6494, 0x33D5, 0x6495, 0x6495, 0x0DAF, + 0x6496, 0x6496, 0x14E8, 0x6497, 0x6498, 0x33D6, 0x6499, 0x6499, 0x14EC, + 0x649A, 0x649D, 0x33D8, 0x649E, 0x649E, 0x120F, 0x649F, 0x649F, 0x235F, + 0x64A0, 0x64A2, 0x33DC, 0x64A3, 0x64A3, 0x1EAC, 0x64A4, 0x64A4, 0x04DC, + 0x64A5, 0x64A5, 0x1E54, 0x64A6, 0x64A8, 0x33DF, 0x64A9, 0x64A9, 0x0A0C, + 0x64AA, 0x64AA, 0x33E2, 0x64AB, 0x64AB, 0x1F08, 0x64AC, 0x64AC, 0x0C48, + 0x64AD, 0x64AD, 0x046C, 0x64AE, 0x64AE, 0x056C, 0x64AF, 0x64AF, 0x33E3, + 0x64B0, 0x64B0, 0x1208, 0x64B1, 0x64B1, 0x33E4, 0x64B2, 0x64B2, 0x20C0, + 0x64B3, 0x64B3, 0x2362, 0x64B4, 0x64B4, 0x33E5, 0x64B5, 0x64B5, 0x0B4F, + 0x64B6, 0x64B6, 0x33E6, 0x64B7, 0x64B8, 0x14EA, 0x64B9, 0x64B9, 0x33E7, + 0x64BA, 0x64BA, 0x14ED, 0x64BB, 0x64BB, 0x2160, 0x64BC, 0x64BC, 0x076A, + 0x64BD, 0x64BD, 0x33E8, 0x64BE, 0x64BE, 0x219D, 0x64BF, 0x64BF, 0x1F8E, + 0x64C0, 0x64C0, 0x14EE, 0x64C1, 0x64C1, 0x222D, 0x64C2, 0x64C2, 0x09C9, + 0x64C3, 0x64C3, 0x33E9, 0x64C4, 0x64C4, 0x2047, 0x64C5, 0x64C5, 0x0CFC, + 0x64C6, 0x64C6, 0x33EA, 0x64C7, 0x64C7, 0x2262, 0x64C8, 0x64C9, 0x33EB, + 0x64CA, 0x64CA, 0x1F67, 0x64CB, 0x64CB, 0x1EB2, 0x64CC, 0x64CC, 0x33ED, + 0x64CD, 0x64CD, 0x04A0, 0x64CE, 0x64CE, 0x0C63, 0x64CF, 0x64CF, 0x33EE, + 0x64D0, 0x64D0, 0x14EF, 0x64D1, 0x64D1, 0x33EF, 0x64D2, 0x64D2, 0x0C59, + 0x64D3, 0x64D3, 0x33F0, 0x64D4, 0x64D4, 0x1EA9, 0x64D5, 0x64D6, 0x33F1, + 0x64D7, 0x64D7, 0x14F0, 0x64D8, 0x64D8, 0x1952, 0x64D9, 0x64D9, 0x33F3, + 0x64DA, 0x64DA, 0x1FCC, 0x64DB, 0x64DD, 0x33F4, 0x64DE, 0x64DE, 0x0DC8, + 0x64DF, 0x64DF, 0x33F7, 0x64E0, 0x64E0, 0x1F72, 0x64E1, 0x64E1, 0x33F8, + 0x64E2, 0x64E2, 0x14F2, 0x64E3, 0x64E3, 0x33F9, 0x64E4, 0x64E4, 0x14F1, + 0x64E5, 0x64E5, 0x33FA, 0x64E6, 0x64E6, 0x0488, 0x64E7, 0x64EB, 0x33FB, + 0x64EC, 0x64EC, 0x2098, 0x64ED, 0x64EE, 0x3400, 0x64EF, 0x64EF, 0x1E52, + 0x64F0, 0x64F0, 0x20A4, 0x64F1, 0x64F1, 0x1F1C, 0x64F2, 0x64F2, 0x228F, + 0x64F3, 0x64F3, 0x3402, 0x64F4, 0x64F4, 0x1FED, 0x64F5, 0x64F6, 0x3403, + 0x64F7, 0x64F7, 0x2365, 0x64F8, 0x64F9, 0x3405, 0x64FA, 0x64FA, 0x1E2D, + 0x64FB, 0x64FB, 0x2152, 0x64FC, 0x64FC, 0x2366, 0x64FD, 0x64FD, 0x3407, + 0x64FE, 0x64FE, 0x20FA, 0x64FF, 0x64FF, 0x3408, 0x6500, 0x6500, 0x0B8B, + 0x6501, 0x6503, 0x3409, 0x6504, 0x6504, 0x2363, 0x6505, 0x6505, 0x340C, + 0x6506, 0x6506, 0x209A, 0x6507, 0x6508, 0x340D, 0x6509, 0x6509, 0x14F3, + 0x650A, 0x650E, 0x340F, 0x650F, 0x650F, 0x203C, 0x6510, 0x6511, 0x3414, + 0x6512, 0x6512, 0x111F, 0x6513, 0x6513, 0x3416, 0x6514, 0x6514, 0x1FF6, + 0x6515, 0x6515, 0x3417, 0x6516, 0x6516, 0x2364, 0x6517, 0x6517, 0x3418, + 0x6518, 0x6518, 0x0C9C, 0x6519, 0x6519, 0x1E69, 0x651A, 0x651A, 0x3419, + 0x651B, 0x651B, 0x2367, 0x651C, 0x651C, 0x341A, 0x651D, 0x651D, 0x211D, + 0x651E, 0x6521, 0x341B, 0x6522, 0x6522, 0x2259, 0x6523, 0x6523, 0x2056, + 0x6524, 0x6524, 0x2163, 0x6525, 0x6525, 0x14F4, 0x6526, 0x6529, 0x341F, + 0x652A, 0x652A, 0x1FA9, 0x652B, 0x652B, 0x091F, 0x652C, 0x652C, 0x1FFC, + 0x652D, 0x652D, 0x3423, 0x652E, 0x652E, 0x14F5, 0x652F, 0x652F, 0x11A6, + 0x6530, 0x6533, 0x3424, 0x6534, 0x6534, 0x1909, 0x6535, 0x6535, 0x1966, + 0x6536, 0x6536, 0x0D6C, 0x6537, 0x6537, 0x3428, 0x6538, 0x6538, 0x12B2, + 0x6539, 0x6539, 0x06BF, 0x653A, 0x653A, 0x3429, 0x653B, 0x653B, 0x06FE, + 0x653C, 0x653D, 0x342A, 0x653E, 0x653E, 0x0662, 0x653F, 0x653F, 0x119F, + 0x6540, 0x6544, 0x342C, 0x6545, 0x6545, 0x0723, 0x6546, 0x6547, 0x3431, + 0x6548, 0x6548, 0x0F72, 0x6549, 0x6549, 0x1CCB, 0x654A, 0x654B, 0x3433, + 0x654C, 0x654C, 0x05B1, 0x654D, 0x654E, 0x3435, 0x654F, 0x654F, 0x0AF9, + 0x6550, 0x6550, 0x3437, 0x6551, 0x6551, 0x08F7, 0x6552, 0x6554, 0x3438, + 0x6555, 0x6555, 0x1967, 0x6556, 0x6556, 0x03C8, 0x6557, 0x6557, 0x1E2E, + 0x6558, 0x6558, 0x343B, 0x6559, 0x6559, 0x089D, 0x655A, 0x655A, 0x343C, + 0x655B, 0x655B, 0x09FB, 0x655C, 0x655C, 0x343D, 0x655D, 0x655D, 0x043F, + 0x655E, 0x655E, 0x04CD, 0x655F, 0x6561, 0x343E, 0x6562, 0x6562, 0x06CD, + 0x6563, 0x6563, 0x0CDB, 0x6564, 0x6565, 0x3441, 0x6566, 0x6566, 0x0617, + 0x6567, 0x656A, 0x3443, 0x656B, 0x656B, 0x1968, 0x656C, 0x656C, 0x08E3, + 0x656D, 0x656F, 0x3447, 0x6570, 0x6570, 0x0D94, 0x6571, 0x6571, 0x344A, + 0x6572, 0x6572, 0x0C40, 0x6573, 0x6573, 0x344B, 0x6574, 0x6574, 0x119C, + 0x6575, 0x6575, 0x1EBC, 0x6576, 0x6576, 0x344C, 0x6577, 0x6577, 0x0690, + 0x6578, 0x6578, 0x2142, 0x6579, 0x6581, 0x344D, 0x6582, 0x6582, 0x201E, + 0x6583, 0x6583, 0x1E43, 0x6584, 0x6586, 0x3456, 0x6587, 0x6587, 0x0ED3, + 0x6588, 0x658A, 0x3459, 0x658B, 0x658B, 0x114C, 0x658C, 0x658C, 0x045C, + 0x658D, 0x658F, 0x345C, 0x6590, 0x6590, 0x19C1, 0x6591, 0x6591, 0x03EA, + 0x6592, 0x6592, 0x345F, 0x6593, 0x6593, 0x19C3, 0x6594, 0x6594, 0x3460, + 0x6595, 0x6595, 0x24D4, 0x6596, 0x6596, 0x3461, 0x6597, 0x6597, 0x05F6, + 0x6598, 0x6598, 0x3462, 0x6599, 0x6599, 0x0A18, 0x659A, 0x659A, 0x3463, + 0x659B, 0x659B, 0x1D56, 0x659C, 0x659C, 0x0F7C, 0x659D, 0x659E, 0x3464, + 0x659F, 0x659F, 0x1186, 0x65A0, 0x65A0, 0x3466, 0x65A1, 0x65A1, 0x0EE2, + 0x65A2, 0x65A3, 0x3467, 0x65A4, 0x65A4, 0x08C0, 0x65A5, 0x65A5, 0x0507, + 0x65A6, 0x65A6, 0x3469, 0x65A7, 0x65A7, 0x06A6, 0x65A8, 0x65A8, 0x346A, + 0x65A9, 0x65A9, 0x1157, 0x65AA, 0x65AA, 0x346B, 0x65AB, 0x65AB, 0x1A29, + 0x65AC, 0x65AC, 0x226F, 0x65AD, 0x65AD, 0x060E, 0x65AE, 0x65AE, 0x346C, + 0x65AF, 0x65AF, 0x0DAE, 0x65B0, 0x65B0, 0x0F8D, 0x65B1, 0x65B6, 0x346D, + 0x65B7, 0x65B7, 0x1ED7, 0x65B8, 0x65B8, 0x3473, 0x65B9, 0x65B9, 0x065A, + 0x65BA, 0x65BB, 0x3474, 0x65BC, 0x65BC, 0x19C4, 0x65BD, 0x65BD, 0x0D40, + 0x65BE, 0x65C0, 0x3476, 0x65C1, 0x65C1, 0x0B95, 0x65C2, 0x65C2, 0x3479, + 0x65C3, 0x65C3, 0x19C7, 0x65C4, 0x65C4, 0x19C6, 0x65C5, 0x65C5, 0x0A6A, + 0x65C6, 0x65C6, 0x19C5, 0x65C7, 0x65CA, 0x347A, 0x65CB, 0x65CB, 0x0FC8, + 0x65CC, 0x65CC, 0x19C8, 0x65CD, 0x65CD, 0x347E, 0x65CE, 0x65CE, 0x19C9, + 0x65CF, 0x65CF, 0x1242, 0x65D0, 0x65D1, 0x347F, 0x65D2, 0x65D2, 0x19CA, + 0x65D3, 0x65D5, 0x3481, 0x65D6, 0x65D6, 0x19CB, 0x65D7, 0x65D7, 0x0C0B, + 0x65D8, 0x65DF, 0x3484, 0x65E0, 0x65E0, 0x0EED, 0x65E1, 0x65E1, 0x348C, + 0x65E2, 0x65E2, 0x083B, 0x65E3, 0x65E4, 0x348D, 0x65E5, 0x65E5, 0x0CB0, + 0x65E6, 0x65E6, 0x058A, 0x65E7, 0x65E7, 0x08F8, 0x65E8, 0x65E8, 0x11BB, + 0x65E9, 0x65E9, 0x112A, 0x65EA, 0x65EB, 0x348F, 0x65EC, 0x65EC, 0x0FD7, + 0x65ED, 0x65ED, 0x0FBC, 0x65EE, 0x65F0, 0x190A, 0x65F1, 0x65F1, 0x076C, + 0x65F2, 0x65F5, 0x3491, 0x65F6, 0x65F6, 0x0D48, 0x65F7, 0x65F7, 0x0982, + 0x65F8, 0x65F9, 0x3495, 0x65FA, 0x65FA, 0x0EAB, 0x65FB, 0x65FF, 0x3497, + 0x6600, 0x6600, 0x1912, 0x6601, 0x6601, 0x349C, 0x6602, 0x6602, 0x03C5, + 0x6603, 0x6603, 0x1910, 0x6604, 0x6605, 0x349D, 0x6606, 0x6606, 0x0990, + 0x6607, 0x6609, 0x349F, 0x660A, 0x660A, 0x190D, 0x660B, 0x660B, 0x34A2, + 0x660C, 0x660C, 0x04C4, 0x660D, 0x660D, 0x34A3, 0x660E, 0x660E, 0x0AFC, + 0x660F, 0x660F, 0x07FD, 0x6610, 0x6612, 0x34A4, 0x6613, 0x6613, 0x105E, + 0x6614, 0x6614, 0x0F03, 0x6615, 0x6615, 0x1911, 0x6616, 0x6618, 0x34A7, + 0x6619, 0x6619, 0x190E, 0x661A, 0x661C, 0x34AA, 0x661D, 0x661D, 0x1915, + 0x661E, 0x661E, 0x34AD, 0x661F, 0x661F, 0x0F92, 0x6620, 0x6620, 0x1098, + 0x6621, 0x6624, 0x34AE, 0x6625, 0x6625, 0x053D, 0x6626, 0x6626, 0x34B2, + 0x6627, 0x6627, 0x0AC6, 0x6628, 0x6628, 0x124F, 0x6629, 0x662C, 0x34B3, + 0x662D, 0x662D, 0x1172, 0x662E, 0x662E, 0x34B7, 0x662F, 0x662F, 0x0D5E, + 0x6630, 0x6630, 0x34B8, 0x6631, 0x6631, 0x1917, 0x6632, 0x6633, 0x34B9, + 0x6634, 0x6634, 0x1916, 0x6635, 0x6635, 0x1919, 0x6636, 0x6636, 0x1918, + 0x6637, 0x663B, 0x34BB, 0x663C, 0x663C, 0x11E6, 0x663D, 0x663D, 0x34C0, + 0x663E, 0x663E, 0x0F41, 0x663F, 0x6640, 0x34C1, 0x6641, 0x6641, 0x191D, + 0x6642, 0x6642, 0x212D, 0x6643, 0x6643, 0x07E3, 0x6644, 0x664A, 0x34C3, + 0x664B, 0x664B, 0x08CB, 0x664C, 0x664C, 0x0D07, 0x664D, 0x664E, 0x34CA, + 0x664F, 0x664F, 0x191E, 0x6650, 0x6651, 0x34CC, 0x6652, 0x6652, 0x0CF2, + 0x6653, 0x6653, 0x0F6B, 0x6654, 0x6654, 0x191C, 0x6655, 0x6655, 0x1111, + 0x6656, 0x6656, 0x191F, 0x6657, 0x6657, 0x1921, 0x6658, 0x6659, 0x34CE, + 0x665A, 0x665A, 0x0E9E, 0x665B, 0x665C, 0x34D0, 0x665D, 0x665D, 0x229B, + 0x665E, 0x665E, 0x34D2, 0x665F, 0x665F, 0x191B, 0x6660, 0x6660, 0x34D3, + 0x6661, 0x6661, 0x1920, 0x6662, 0x6663, 0x34D4, 0x6664, 0x6664, 0x0EFD, + 0x6665, 0x6665, 0x34D6, 0x6666, 0x6666, 0x07F3, 0x6667, 0x6667, 0x34D7, + 0x6668, 0x6668, 0x04E4, 0x6669, 0x666D, 0x34D8, 0x666E, 0x666E, 0x0BF4, + 0x666F, 0x666F, 0x08DF, 0x6670, 0x6670, 0x0F09, 0x6671, 0x6673, 0x34DD, + 0x6674, 0x6674, 0x0C64, 0x6675, 0x6675, 0x34E0, 0x6676, 0x6676, 0x08D6, + 0x6677, 0x6677, 0x1922, 0x6678, 0x6679, 0x34E1, 0x667A, 0x667A, 0x11C6, + 0x667B, 0x667D, 0x34E3, 0x667E, 0x667E, 0x0A09, 0x667F, 0x6681, 0x34E6, + 0x6682, 0x6682, 0x1120, 0x6683, 0x6683, 0x34E9, 0x6684, 0x6684, 0x1923, + 0x6685, 0x6686, 0x34EA, 0x6687, 0x6687, 0x0F2B, 0x6688, 0x6688, 0x2256, + 0x6689, 0x6689, 0x24A8, 0x668A, 0x668B, 0x34EC, 0x668C, 0x668C, 0x1924, + 0x668D, 0x6690, 0x34EE, 0x6691, 0x6691, 0x0D85, 0x6692, 0x6695, 0x34F2, + 0x6696, 0x6696, 0x0B70, 0x6697, 0x6697, 0x03C0, 0x6698, 0x669C, 0x34F6, + 0x669D, 0x669D, 0x1926, 0x669E, 0x66A1, 0x34FB, 0x66A2, 0x66A2, 0x1E79, + 0x66A3, 0x66A6, 0x34FF, 0x66A7, 0x66A7, 0x1925, 0x66A8, 0x66A8, 0x1CDD, + 0x66A9, 0x66AA, 0x3503, 0x66AB, 0x66AB, 0x225A, 0x66AC, 0x66AD, 0x3505, + 0x66AE, 0x66AE, 0x0B1D, 0x66AF, 0x66B3, 0x3507, 0x66B4, 0x66B4, 0x0412, + 0x66B5, 0x66B8, 0x350C, 0x66B9, 0x66B9, 0x175B, 0x66BA, 0x66BD, 0x3510, + 0x66BE, 0x66BE, 0x1927, 0x66BF, 0x66C3, 0x3514, 0x66C4, 0x66C4, 0x24A7, + 0x66C5, 0x66C5, 0x3519, 0x66C6, 0x66C6, 0x2686, 0x66C7, 0x66C7, 0x24A6, + 0x66C8, 0x66C8, 0x351A, 0x66C9, 0x66C9, 0x21CE, 0x66CA, 0x66D5, 0x351B, + 0x66D6, 0x66D6, 0x24A9, 0x66D7, 0x66D8, 0x3527, 0x66D9, 0x66D9, 0x0D86, + 0x66DA, 0x66DA, 0x3529, 0x66DB, 0x66DC, 0x1928, 0x66DD, 0x66DD, 0x0BF7, + 0x66DE, 0x66DF, 0x352A, 0x66E0, 0x66E0, 0x1FE7, 0x66E1, 0x66E5, 0x352C, + 0x66E6, 0x66E6, 0x192A, 0x66E7, 0x66E8, 0x3531, 0x66E9, 0x66E9, 0x192B, + 0x66EA, 0x66EB, 0x3533, 0x66EC, 0x66EC, 0x2112, 0x66ED, 0x66EF, 0x3535, + 0x66F0, 0x66F0, 0x10FE, 0x66F1, 0x66F1, 0x3538, 0x66F2, 0x66F2, 0x0C77, + 0x66F3, 0x66F3, 0x103E, 0x66F4, 0x66F4, 0x06F7, 0x66F5, 0x66F6, 0x3539, + 0x66F7, 0x66F7, 0x1914, 0x66F8, 0x66F8, 0x213C, 0x66F9, 0x66F9, 0x04A3, + 0x66FA, 0x66FB, 0x353B, 0x66FC, 0x66FC, 0x0AA3, 0x66FD, 0x66FD, 0x353D, + 0x66FE, 0x66FE, 0x113B, 0x66FF, 0x66FF, 0x0E39, 0x6700, 0x6700, 0x124B, + 0x6701, 0x6702, 0x353E, 0x6703, 0x6703, 0x1F5C, 0x6704, 0x6707, 0x3540, + 0x6708, 0x6708, 0x1105, 0x6709, 0x6709, 0x10B5, 0x670A, 0x670A, 0x1973, + 0x670B, 0x670B, 0x0BB4, 0x670C, 0x670C, 0x3544, 0x670D, 0x670D, 0x069B, + 0x670E, 0x670F, 0x3545, 0x6710, 0x6710, 0x1984, 0x6711, 0x6713, 0x3547, + 0x6714, 0x6714, 0x0DAC, 0x6715, 0x6715, 0x198E, 0x6716, 0x6716, 0x354A, + 0x6717, 0x6717, 0x09B5, 0x6718, 0x671A, 0x354B, 0x671B, 0x671B, 0x0EAC, + 0x671C, 0x671C, 0x354E, 0x671D, 0x671D, 0x04D4, 0x671E, 0x671E, 0x354F, + 0x671F, 0x671F, 0x0BF9, 0x6720, 0x6725, 0x3550, 0x6726, 0x6726, 0x19AC, + 0x6727, 0x6727, 0x24C4, 0x6728, 0x6728, 0x0B21, 0x6729, 0x6729, 0x3556, + 0x672A, 0x672A, 0x0EC3, 0x672B, 0x672B, 0x0B0C, 0x672C, 0x672C, 0x0427, + 0x672D, 0x672D, 0x1140, 0x672E, 0x672E, 0x3557, 0x672F, 0x672F, 0x0D8C, + 0x6730, 0x6730, 0x3558, 0x6731, 0x6731, 0x11EB, 0x6732, 0x6733, 0x3559, + 0x6734, 0x6734, 0x0BF2, 0x6735, 0x6735, 0x0623, 0x6736, 0x6739, 0x355B, + 0x673A, 0x673A, 0x080F, 0x673B, 0x673C, 0x355F, 0x673D, 0x673D, 0x0FAB, + 0x673E, 0x673F, 0x3561, 0x6740, 0x6740, 0x0CEA, 0x6741, 0x6741, 0x3563, + 0x6742, 0x6742, 0x1116, 0x6743, 0x6743, 0x0C83, 0x6744, 0x6745, 0x3564, + 0x6746, 0x6746, 0x06C6, 0x6747, 0x6747, 0x3566, 0x6748, 0x6748, 0x1854, + 0x6749, 0x6749, 0x0CF5, 0x674A, 0x674B, 0x3567, 0x674C, 0x674C, 0x1851, + 0x674D, 0x674D, 0x3569, 0x674E, 0x674E, 0x09D9, 0x674F, 0x674F, 0x0F9E, + 0x6750, 0x6750, 0x048B, 0x6751, 0x6751, 0x0568, 0x6752, 0x6752, 0x356A, + 0x6753, 0x6753, 0x1852, 0x6754, 0x6755, 0x356B, 0x6756, 0x6756, 0x1169, + 0x6757, 0x675B, 0x356D, 0x675C, 0x675C, 0x0604, 0x675D, 0x675D, 0x3572, + 0x675E, 0x675E, 0x1853, 0x675F, 0x675F, 0x0D8F, 0x6760, 0x6760, 0x06D7, + 0x6761, 0x6761, 0x0E48, 0x6762, 0x6764, 0x3573, 0x6765, 0x6765, 0x099F, + 0x6766, 0x6767, 0x3576, 0x6768, 0x6768, 0x1017, 0x6769, 0x6769, 0x1855, + 0x676A, 0x676A, 0x1858, 0x676B, 0x676C, 0x3578, 0x676D, 0x676D, 0x0773, + 0x676E, 0x676E, 0x357A, 0x676F, 0x676F, 0x0416, 0x6770, 0x6770, 0x08AD, + 0x6771, 0x6771, 0x1ECC, 0x6772, 0x6772, 0x190F, 0x6773, 0x6773, 0x1859, + 0x6774, 0x6774, 0x357B, 0x6775, 0x6775, 0x185C, 0x6776, 0x6776, 0x357C, + 0x6777, 0x6777, 0x1861, 0x6778, 0x677B, 0x357D, 0x677C, 0x677C, 0x1862, + 0x677D, 0x677D, 0x3581, 0x677E, 0x677E, 0x0DBE, 0x677F, 0x677F, 0x03F0, + 0x6780, 0x6780, 0x3582, 0x6781, 0x6781, 0x081E, 0x6782, 0x6783, 0x3583, + 0x6784, 0x6784, 0x0712, 0x6785, 0x6786, 0x3585, 0x6787, 0x6787, 0x1857, + 0x6788, 0x6788, 0x3587, 0x6789, 0x6789, 0x0EA8, 0x678A, 0x678A, 0x3588, + 0x678B, 0x678B, 0x1860, 0x678C, 0x678F, 0x3589, 0x6790, 0x6790, 0x0F05, + 0x6791, 0x6794, 0x358D, 0x6795, 0x6795, 0x118E, 0x6796, 0x6796, 0x3591, + 0x6797, 0x6797, 0x0A1F, 0x6798, 0x6798, 0x185A, 0x6799, 0x6799, 0x3592, + 0x679A, 0x679A, 0x0ABB, 0x679B, 0x679B, 0x3593, 0x679C, 0x679C, 0x0754, + 0x679D, 0x679D, 0x11A5, 0x679E, 0x679E, 0x185E, 0x679F, 0x67A1, 0x3594, + 0x67A2, 0x67A2, 0x0D77, 0x67A3, 0x67A3, 0x1129, 0x67A4, 0x67A4, 0x3597, + 0x67A5, 0x67A5, 0x1856, 0x67A6, 0x67A6, 0x3598, 0x67A7, 0x67A7, 0x185B, + 0x67A8, 0x67A8, 0x185D, 0x67A9, 0x67A9, 0x3599, 0x67AA, 0x67AA, 0x0C36, + 0x67AB, 0x67AB, 0x0680, 0x67AC, 0x67AC, 0x359A, 0x67AD, 0x67AD, 0x185F, + 0x67AE, 0x67AE, 0x359B, 0x67AF, 0x67AF, 0x096A, 0x67B0, 0x67B0, 0x1868, + 0x67B1, 0x67B2, 0x359C, 0x67B3, 0x67B3, 0x186D, 0x67B4, 0x67B4, 0x359E, + 0x67B5, 0x67B5, 0x186B, 0x67B6, 0x67B6, 0x084F, 0x67B7, 0x67B7, 0x0842, + 0x67B8, 0x67B8, 0x1871, 0x67B9, 0x67C0, 0x359F, 0x67C1, 0x67C1, 0x1874, + 0x67C2, 0x67C2, 0x35A7, 0x67C3, 0x67C3, 0x1870, 0x67C4, 0x67C4, 0x0463, + 0x67C5, 0x67CE, 0x35A8, 0x67CF, 0x67CF, 0x03E3, 0x67D0, 0x67D0, 0x0B16, + 0x67D1, 0x67D1, 0x06C7, 0x67D2, 0x67D2, 0x0C01, 0x67D3, 0x67D3, 0x0C99, + 0x67D4, 0x67D4, 0x0CBC, 0x67D5, 0x67D7, 0x35B2, 0x67D8, 0x67D8, 0x1865, + 0x67D9, 0x67D9, 0x186A, 0x67DA, 0x67DA, 0x186C, 0x67DB, 0x67DB, 0x35B5, + 0x67DC, 0x67DC, 0x074A, 0x67DD, 0x67DD, 0x186E, 0x67DE, 0x67DE, 0x1252, + 0x67DF, 0x67DF, 0x35B6, 0x67E0, 0x67E0, 0x0B5E, 0x67E1, 0x67E1, 0x35B7, + 0x67E2, 0x67E2, 0x1872, 0x67E3, 0x67E4, 0x35B8, 0x67E5, 0x67E5, 0x04B0, + 0x67E6, 0x67E8, 0x35BA, 0x67E9, 0x67E9, 0x1867, 0x67EA, 0x67EB, 0x35BD, + 0x67EC, 0x67EC, 0x0860, 0x67ED, 0x67EE, 0x35BF, 0x67EF, 0x67EF, 0x094F, + 0x67F0, 0x67F0, 0x1863, 0x67F1, 0x67F1, 0x11F8, 0x67F2, 0x67F2, 0x35C1, + 0x67F3, 0x67F3, 0x0A41, 0x67F4, 0x67F4, 0x04B8, 0x67F5, 0x67FC, 0x35C2, + 0x67FD, 0x67FD, 0x1875, 0x67FE, 0x67FE, 0x35CA, 0x67FF, 0x67FF, 0x0D58, + 0x6800, 0x6800, 0x186F, 0x6801, 0x6804, 0x35CB, 0x6805, 0x6805, 0x1145, + 0x6806, 0x6806, 0x35CF, 0x6807, 0x6807, 0x0453, 0x6808, 0x6808, 0x115C, + 0x6809, 0x6809, 0x1864, 0x680A, 0x680A, 0x1866, 0x680B, 0x680B, 0x05EF, + 0x680C, 0x680C, 0x1869, 0x680D, 0x680D, 0x35D0, 0x680E, 0x680E, 0x1873, + 0x680F, 0x680F, 0x09A3, 0x6810, 0x6810, 0x35D1, 0x6811, 0x6811, 0x0D8E, + 0x6812, 0x6812, 0x35D2, 0x6813, 0x6813, 0x0D9D, 0x6814, 0x6815, 0x35D3, + 0x6816, 0x6816, 0x0BFB, 0x6817, 0x6817, 0x09E0, 0x6818, 0x681C, 0x35D5, + 0x681D, 0x681D, 0x187F, 0x681E, 0x6820, 0x35DA, 0x6821, 0x6821, 0x0F6E, + 0x6822, 0x6828, 0x35DD, 0x6829, 0x6829, 0x1888, 0x682A, 0x682A, 0x11E9, + 0x682B, 0x6831, 0x35E4, 0x6832, 0x6833, 0x1876, 0x6834, 0x6836, 0x35EB, + 0x6837, 0x6837, 0x1022, 0x6838, 0x6838, 0x0782, 0x6839, 0x6839, 0x06F4, + 0x683A, 0x683B, 0x35EE, 0x683C, 0x683C, 0x06EC, 0x683D, 0x683D, 0x1117, + 0x683E, 0x683E, 0x1885, 0x683F, 0x683F, 0x35F0, 0x6840, 0x6840, 0x1884, + 0x6841, 0x6841, 0x1882, 0x6842, 0x6842, 0x0749, 0x6843, 0x6843, 0x0E25, + 0x6844, 0x6844, 0x187C, 0x6845, 0x6845, 0x0EB5, 0x6846, 0x6846, 0x097F, + 0x6847, 0x6847, 0x35F1, 0x6848, 0x6848, 0x03C3, 0x6849, 0x6849, 0x1887, + 0x684A, 0x684A, 0x1886, 0x684B, 0x684B, 0x35F2, 0x684C, 0x684C, 0x121D, + 0x684D, 0x684D, 0x35F3, 0x684E, 0x684E, 0x187A, 0x684F, 0x684F, 0x35F4, + 0x6850, 0x6850, 0x0E5A, 0x6851, 0x6851, 0x0CDC, 0x6852, 0x6852, 0x35F5, + 0x6853, 0x6853, 0x07CD, 0x6854, 0x6854, 0x08AC, 0x6855, 0x6855, 0x1880, + 0x6856, 0x685F, 0x35F6, 0x6860, 0x6861, 0x1878, 0x6862, 0x6862, 0x187B, + 0x6863, 0x6863, 0x0596, 0x6864, 0x6864, 0x187D, 0x6865, 0x6865, 0x0C42, + 0x6866, 0x6866, 0x1881, 0x6867, 0x6867, 0x1883, 0x6868, 0x6868, 0x0881, + 0x6869, 0x6869, 0x120B, 0x686A, 0x686A, 0x3600, 0x686B, 0x686B, 0x188E, + 0x686C, 0x6873, 0x3601, 0x6874, 0x6874, 0x188B, 0x6875, 0x6875, 0x3609, + 0x6876, 0x6876, 0x0E61, 0x6877, 0x6877, 0x188C, 0x6878, 0x6880, 0x360A, + 0x6881, 0x6881, 0x0A03, 0x6882, 0x6882, 0x3613, 0x6883, 0x6883, 0x187E, + 0x6884, 0x6884, 0x3614, 0x6885, 0x6885, 0x0ABC, 0x6886, 0x6886, 0x03FB, + 0x6887, 0x688E, 0x3615, 0x688F, 0x688F, 0x188A, 0x6890, 0x6892, 0x361D, + 0x6893, 0x6893, 0x188D, 0x6894, 0x6896, 0x3620, 0x6897, 0x6897, 0x06FC, + 0x6898, 0x6898, 0x246A, 0x6899, 0x689C, 0x3623, 0x689D, 0x689D, 0x2175, + 0x689E, 0x689E, 0x3627, 0x689F, 0x689F, 0x246D, 0x68A0, 0x68A1, 0x3628, + 0x68A2, 0x68A2, 0x0D0B, 0x68A3, 0x68A5, 0x362A, 0x68A6, 0x68A6, 0x0AD3, + 0x68A7, 0x68A7, 0x0EEF, 0x68A8, 0x68A8, 0x09D1, 0x68A9, 0x68AC, 0x362D, + 0x68AD, 0x68AD, 0x0DE8, 0x68AE, 0x68AE, 0x3631, 0x68AF, 0x68AF, 0x0E30, + 0x68B0, 0x68B0, 0x0F80, 0x68B1, 0x68B2, 0x3632, 0x68B3, 0x68B3, 0x0D78, + 0x68B4, 0x68B4, 0x3634, 0x68B5, 0x68B5, 0x1889, 0x68B6, 0x68BF, 0x3635, + 0x68C0, 0x68C0, 0x085F, 0x68C1, 0x68C1, 0x363F, 0x68C2, 0x68C2, 0x188F, + 0x68C3, 0x68C8, 0x3640, 0x68C9, 0x68C9, 0x0AE3, 0x68CA, 0x68CA, 0x3646, + 0x68CB, 0x68CB, 0x0C04, 0x68CC, 0x68CC, 0x3647, 0x68CD, 0x68CD, 0x0750, + 0x68CE, 0x68D1, 0x3648, 0x68D2, 0x68D2, 0x03FF, 0x68D3, 0x68D4, 0x364C, + 0x68D5, 0x68D5, 0x1235, 0x68D6, 0x68D6, 0x246B, 0x68D7, 0x68D7, 0x225F, + 0x68D8, 0x68D8, 0x081F, 0x68D9, 0x68D9, 0x364E, 0x68DA, 0x68DA, 0x0BB0, + 0x68DB, 0x68DE, 0x364F, 0x68DF, 0x68DF, 0x1ECE, 0x68E0, 0x68E0, 0x0E17, + 0x68E1, 0x68E2, 0x3653, 0x68E3, 0x68E3, 0x189A, 0x68E4, 0x68E6, 0x3655, + 0x68E7, 0x68E7, 0x2272, 0x68E8, 0x68ED, 0x3658, 0x68EE, 0x68EE, 0x0CE6, + 0x68EF, 0x68EF, 0x365E, 0x68F0, 0x68F0, 0x1896, 0x68F1, 0x68F1, 0x09CD, + 0x68F2, 0x68F4, 0x365F, 0x68F5, 0x68F5, 0x0950, 0x68F6, 0x68F8, 0x3662, + 0x68F9, 0x68F9, 0x1894, 0x68FA, 0x68FA, 0x0730, 0x68FB, 0x68FB, 0x3665, + 0x68FC, 0x68FC, 0x1891, 0x68FD, 0x68FF, 0x3666, 0x6900, 0x6900, 0x3669, + 0x6901, 0x6901, 0x1898, 0x6902, 0x6904, 0x366A, 0x6905, 0x6905, 0x1055, + 0x6906, 0x690A, 0x366D, 0x690B, 0x690B, 0x1897, 0x690C, 0x690C, 0x3672, + 0x690D, 0x690D, 0x11B1, 0x690E, 0x690E, 0x1212, 0x690F, 0x690F, 0x2473, + 0x6910, 0x6910, 0x189B, 0x6911, 0x6911, 0x3673, 0x6912, 0x6912, 0x0888, + 0x6913, 0x691E, 0x3674, 0x691F, 0x6920, 0x1892, 0x6921, 0x6923, 0x3680, + 0x6924, 0x6924, 0x1895, 0x6925, 0x692C, 0x3683, 0x692D, 0x692D, 0x0E87, + 0x692E, 0x692F, 0x368B, 0x6930, 0x6930, 0x1033, 0x6931, 0x6933, 0x368D, + 0x6934, 0x6934, 0x18A6, 0x6935, 0x6938, 0x3690, 0x6939, 0x6939, 0x189D, + 0x693A, 0x693C, 0x3694, 0x693D, 0x693D, 0x052D, 0x693E, 0x693E, 0x3697, + 0x693F, 0x693F, 0x053E, 0x6940, 0x6941, 0x3698, 0x6942, 0x6942, 0x189F, + 0x6943, 0x6949, 0x369A, 0x694A, 0x694A, 0x21FE, 0x694B, 0x6952, 0x36A1, + 0x6953, 0x6953, 0x1EFE, 0x6954, 0x6954, 0x0F73, 0x6955, 0x6956, 0x36A9, + 0x6957, 0x6957, 0x1899, 0x6958, 0x6959, 0x36AB, 0x695A, 0x695A, 0x0523, + 0x695B, 0x695C, 0x36AD, 0x695D, 0x695D, 0x18A0, 0x695E, 0x695E, 0x09CE, + 0x695F, 0x695F, 0x36AF, 0x6960, 0x6960, 0x189E, 0x6961, 0x6962, 0x36B0, + 0x6963, 0x6963, 0x18AD, 0x6964, 0x6965, 0x36B2, 0x6966, 0x6966, 0x18AC, + 0x6967, 0x6967, 0x36B4, 0x6968, 0x6968, 0x2475, 0x6969, 0x696A, 0x36B5, + 0x696B, 0x696B, 0x18A2, 0x696C, 0x696C, 0x36B7, 0x696D, 0x696D, 0x220A, + 0x696E, 0x696E, 0x1890, 0x696F, 0x6970, 0x36B8, 0x6971, 0x6971, 0x189C, + 0x6972, 0x6974, 0x36BA, 0x6975, 0x6975, 0x1F6F, 0x6976, 0x6976, 0x36BD, + 0x6977, 0x6977, 0x0939, 0x6978, 0x6978, 0x18A5, 0x6979, 0x6979, 0x18AE, + 0x697A, 0x697B, 0x36BE, 0x697C, 0x697C, 0x0A4C, 0x697D, 0x697F, 0x36C0, + 0x6980, 0x6980, 0x18A3, 0x6981, 0x6981, 0x36C3, 0x6982, 0x6982, 0x06C0, + 0x6983, 0x6983, 0x36C4, 0x6984, 0x6984, 0x18A1, 0x6985, 0x6985, 0x36C5, + 0x6986, 0x6986, 0x10C1, 0x6987, 0x6988, 0x18A8, 0x6989, 0x6989, 0x18AB, + 0x698A, 0x698C, 0x36C6, 0x698D, 0x698D, 0x18BB, 0x698E, 0x6993, 0x36C9, + 0x6994, 0x6994, 0x09B1, 0x6995, 0x6995, 0x18B9, 0x6996, 0x6997, 0x36CF, + 0x6998, 0x6998, 0x18A4, 0x6999, 0x699A, 0x36D1, 0x699B, 0x699B, 0x18AF, + 0x699C, 0x699C, 0x03FC, 0x699D, 0x69A6, 0x36D3, 0x69A7, 0x69A7, 0x18B0, + 0x69A8, 0x69A8, 0x1146, 0x69A9, 0x69A9, 0x36DD, 0x69AA, 0x69AA, 0x2468, + 0x69AB, 0x69AB, 0x18B2, 0x69AC, 0x69AC, 0x36DE, 0x69AD, 0x69AD, 0x18B3, + 0x69AE, 0x69AE, 0x2100, 0x69AF, 0x69B0, 0x36DF, 0x69B1, 0x69B1, 0x18B5, + 0x69B2, 0x69B3, 0x36E1, 0x69B4, 0x69B4, 0x0A3A, 0x69B5, 0x69B6, 0x36E3, + 0x69B7, 0x69B7, 0x0C91, 0x69B8, 0x69BA, 0x36E5, 0x69BB, 0x69BB, 0x18B1, + 0x69BC, 0x69BE, 0x36E8, 0x69BF, 0x69BF, 0x2476, 0x69C0, 0x69C0, 0x36EB, + 0x69C1, 0x69C1, 0x18B6, 0x69C2, 0x69C9, 0x36EC, 0x69CA, 0x69CA, 0x18B7, + 0x69CB, 0x69CB, 0x1F27, 0x69CC, 0x69CC, 0x18A7, 0x69CD, 0x69CD, 0x20D7, + 0x69CE, 0x69CE, 0x18AA, 0x69CF, 0x69CF, 0x36F4, 0x69D0, 0x69D0, 0x07C6, + 0x69D1, 0x69D3, 0x36F5, 0x69D4, 0x69D4, 0x18B4, 0x69D5, 0x69DA, 0x36F8, + 0x69DB, 0x69DB, 0x086A, 0x69DC, 0x69DE, 0x36FE, 0x69DF, 0x69DF, 0x18B8, + 0x69E0, 0x69E0, 0x18BA, 0x69E1, 0x69E6, 0x3701, 0x69E7, 0x69E7, 0x247C, + 0x69E8, 0x69EC, 0x3707, 0x69ED, 0x69ED, 0x18BE, 0x69EE, 0x69F1, 0x370C, + 0x69F2, 0x69F2, 0x18C2, 0x69F3, 0x69F3, 0x1FA1, 0x69F4, 0x69FC, 0x3710, + 0x69FD, 0x69FD, 0x04A2, 0x69FE, 0x69FE, 0x3719, 0x69FF, 0x69FF, 0x18BC, + 0x6A00, 0x6A00, 0x371A, 0x6A01, 0x6A01, 0x22AA, 0x6A02, 0x6A02, 0x2005, + 0x6A03, 0x6A04, 0x371B, 0x6A05, 0x6A05, 0x246C, 0x6A06, 0x6A09, 0x371D, + 0x6A0A, 0x6A0A, 0x064B, 0x6A0B, 0x6A12, 0x3721, 0x6A13, 0x6A13, 0x203E, + 0x6A14, 0x6A16, 0x3729, 0x6A17, 0x6A18, 0x18BF, 0x6A19, 0x6A19, 0x1E4C, + 0x6A1A, 0x6A1D, 0x372C, 0x6A1E, 0x6A1E, 0x213A, 0x6A1F, 0x6A1F, 0x1162, + 0x6A20, 0x6A20, 0x3730, 0x6A21, 0x6A21, 0x0B06, 0x6A22, 0x6A22, 0x3731, + 0x6A23, 0x6A23, 0x2204, 0x6A24, 0x6A27, 0x3732, 0x6A28, 0x6A28, 0x18CC, + 0x6A29, 0x6A29, 0x3736, 0x6A2A, 0x6A2A, 0x0798, 0x6A2B, 0x6A2E, 0x3737, + 0x6A2F, 0x6A2F, 0x18BD, 0x6A30, 0x6A30, 0x373B, 0x6A31, 0x6A31, 0x1088, + 0x6A32, 0x6A34, 0x373C, 0x6A35, 0x6A35, 0x18C8, 0x6A36, 0x6A37, 0x373F, + 0x6A38, 0x6A38, 0x20C3, 0x6A39, 0x6A39, 0x2140, 0x6A3A, 0x6A3A, 0x2477, + 0x6A3B, 0x6A3C, 0x3741, 0x6A3D, 0x6A3D, 0x18CB, 0x6A3E, 0x6A3E, 0x18C4, + 0x6A3F, 0x6A43, 0x3743, 0x6A44, 0x6A44, 0x18C3, 0x6A45, 0x6A46, 0x3748, + 0x6A47, 0x6A47, 0x0C3E, 0x6A48, 0x6A48, 0x2474, 0x6A49, 0x6A4A, 0x374A, + 0x6A4B, 0x6A4B, 0x20DD, 0x6A4C, 0x6A4F, 0x374C, 0x6A50, 0x6A50, 0x18C6, + 0x6A51, 0x6A57, 0x3750, 0x6A58, 0x6A58, 0x18CD, 0x6A59, 0x6A59, 0x04ED, + 0x6A5A, 0x6A5A, 0x3757, 0x6A5B, 0x6A5B, 0x18C7, 0x6A5C, 0x6A5E, 0x3758, + 0x6A5F, 0x6A5F, 0x1F68, 0x6A60, 0x6A60, 0x375B, 0x6A61, 0x6A61, 0x0F5D, + 0x6A62, 0x6A62, 0x2185, 0x6A63, 0x6A64, 0x375C, 0x6A65, 0x6A65, 0x18C1, + 0x6A66, 0x6A70, 0x375E, 0x6A71, 0x6A71, 0x051C, 0x6A72, 0x6A78, 0x3769, + 0x6A79, 0x6A79, 0x18CA, 0x6A7A, 0x6A7B, 0x3770, 0x6A7C, 0x6A7C, 0x18CE, + 0x6A7D, 0x6A7F, 0x3772, 0x6A80, 0x6A80, 0x0E07, 0x6A81, 0x6A83, 0x3775, + 0x6A84, 0x6A84, 0x0F1A, 0x6A85, 0x6A88, 0x3778, 0x6A89, 0x6A89, 0x2472, + 0x6A8A, 0x6A8D, 0x377C, 0x6A8E, 0x6A8E, 0x18C9, 0x6A8F, 0x6A8F, 0x3780, + 0x6A90, 0x6A90, 0x18D0, 0x6A91, 0x6A91, 0x18CF, 0x6A92, 0x6A93, 0x3781, + 0x6A94, 0x6A94, 0x1EB5, 0x6A95, 0x6A96, 0x3783, 0x6A97, 0x6A97, 0x18D2, + 0x6A98, 0x6A9B, 0x3785, 0x6A9C, 0x6A9C, 0x2478, 0x6A9D, 0x6A9F, 0x3789, + 0x6AA0, 0x6AA0, 0x18C5, 0x6AA1, 0x6AA1, 0x378C, 0x6AA2, 0x6AA2, 0x1F8B, + 0x6AA3, 0x6AA3, 0x2484, 0x6AA4, 0x6AA8, 0x378D, 0x6AA9, 0x6AA9, 0x18D1, + 0x6AAA, 0x6AAA, 0x3792, 0x6AAB, 0x6AAB, 0x18D3, 0x6AAC, 0x6AAC, 0x0ACF, + 0x6AAD, 0x6AAE, 0x3793, 0x6AAF, 0x6AAF, 0x2699, 0x6AB0, 0x6AB2, 0x3795, + 0x6AB3, 0x6AB3, 0x2482, 0x6AB4, 0x6AB7, 0x3798, 0x6AB8, 0x6AB8, 0x20A1, + 0x6AB9, 0x6ABA, 0x379C, 0x6ABB, 0x6ABB, 0x1F92, 0x6ABC, 0x6AC2, 0x379E, + 0x6AC3, 0x6AC3, 0x1F38, 0x6AC4, 0x6AD2, 0x37A5, 0x6AD3, 0x6AD3, 0x2485, + 0x6AD4, 0x6AD9, 0x37B4, 0x6ADA, 0x6ADA, 0x2480, 0x6ADB, 0x6ADB, 0x246E, + 0x6ADC, 0x6ADC, 0x37BA, 0x6ADD, 0x6ADD, 0x247B, 0x6ADE, 0x6ADE, 0x2486, + 0x6ADF, 0x6ADF, 0x2471, 0x6AE0, 0x6AE6, 0x37BB, 0x6AE7, 0x6AE7, 0x2483, + 0x6AE8, 0x6AE8, 0x2470, 0x6AE9, 0x6AE9, 0x37C2, 0x6AEA, 0x6AEA, 0x2469, + 0x6AEB, 0x6AEB, 0x37C3, 0x6AEC, 0x6AEC, 0x247F, 0x6AED, 0x6AF2, 0x37C4, + 0x6AF3, 0x6AF3, 0x246F, 0x6AF4, 0x6AF7, 0x37CA, 0x6AF8, 0x6AF8, 0x2481, + 0x6AF9, 0x6AFA, 0x37CE, 0x6AFB, 0x6AFB, 0x2220, 0x6AFC, 0x6AFF, 0x37D0, + 0x6B00, 0x6B03, 0x37D4, 0x6B04, 0x6B04, 0x1FF5, 0x6B05, 0x6B09, 0x37D8, + 0x6B0A, 0x6B0A, 0x20F4, 0x6B0B, 0x6B0E, 0x37DD, 0x6B0F, 0x6B0F, 0x247D, + 0x6B10, 0x6B11, 0x37E1, 0x6B12, 0x6B12, 0x2479, 0x6B13, 0x6B15, 0x37E3, + 0x6B16, 0x6B16, 0x247E, 0x6B17, 0x6B1D, 0x37E6, 0x6B1E, 0x6B1E, 0x247A, + 0x6B1F, 0x6B1F, 0x37ED, 0x6B20, 0x6B20, 0x0C34, 0x6B21, 0x6B21, 0x0551, + 0x6B22, 0x6B22, 0x07CB, 0x6B23, 0x6B23, 0x0F8B, 0x6B24, 0x6B24, 0x19B1, + 0x6B25, 0x6B26, 0x37EE, 0x6B27, 0x6B27, 0x0B78, 0x6B28, 0x6B31, 0x37F0, + 0x6B32, 0x6B32, 0x10E0, 0x6B33, 0x6B36, 0x37FA, 0x6B37, 0x6B37, 0x19B2, + 0x6B38, 0x6B38, 0x37FE, 0x6B39, 0x6B39, 0x19B3, 0x6B3A, 0x6B3A, 0x0BFA, + 0x6B3B, 0x6B3C, 0x37FF, 0x6B3D, 0x6B3D, 0x20E3, 0x6B3E, 0x6B3E, 0x097B, + 0x6B3F, 0x6B42, 0x3801, 0x6B43, 0x6B43, 0x19B4, 0x6B44, 0x6B45, 0x3805, + 0x6B46, 0x6B46, 0x19B5, 0x6B47, 0x6B47, 0x0F75, 0x6B48, 0x6B48, 0x3807, + 0x6B49, 0x6B49, 0x0C35, 0x6B4A, 0x6B4B, 0x3808, 0x6B4C, 0x6B4C, 0x06E3, + 0x6B4D, 0x6B4F, 0x380A, 0x6B50, 0x6B50, 0x20AD, 0x6B51, 0x6B58, 0x380D, + 0x6B59, 0x6B59, 0x19B6, 0x6B5A, 0x6B5E, 0x3815, 0x6B5F, 0x6B5F, 0x24CB, + 0x6B60, 0x6B60, 0x381A, 0x6B61, 0x6B61, 0x1F53, 0x6B62, 0x6B62, 0x11B8, + 0x6B63, 0x6B63, 0x119E, 0x6B64, 0x6B64, 0x054E, 0x6B65, 0x6B65, 0x0484, + 0x6B66, 0x6B66, 0x0EF3, 0x6B67, 0x6B67, 0x0C06, 0x6B68, 0x6B69, 0x381B, + 0x6B6A, 0x6B6A, 0x0E92, 0x6B6B, 0x6B71, 0x381D, 0x6B72, 0x6B72, 0x2159, + 0x6B73, 0x6B76, 0x3824, 0x6B77, 0x6B77, 0x2013, 0x6B78, 0x6B78, 0x1F33, + 0x6B79, 0x6B79, 0x0578, 0x6B7A, 0x6B7A, 0x3828, 0x6B7B, 0x6B7B, 0x0DB5, + 0x6B7C, 0x6B7C, 0x0852, 0x6B7D, 0x6B80, 0x3829, 0x6B81, 0x6B82, 0x18D6, + 0x6B83, 0x6B83, 0x1013, 0x6B84, 0x6B84, 0x18D9, 0x6B85, 0x6B85, 0x382D, + 0x6B86, 0x6B86, 0x057C, 0x6B87, 0x6B87, 0x18D8, 0x6B88, 0x6B88, 0x382E, + 0x6B89, 0x6B89, 0x0FDC, 0x6B8A, 0x6B8A, 0x0D79, 0x6B8B, 0x6B8B, 0x0497, + 0x6B8C, 0x6B8C, 0x382F, 0x6B8D, 0x6B8D, 0x18DC, 0x6B8E, 0x6B91, 0x3830, + 0x6B92, 0x6B93, 0x18DA, 0x6B94, 0x6B95, 0x3834, 0x6B96, 0x6B96, 0x11B2, + 0x6B97, 0x6B97, 0x3836, 0x6B98, 0x6B98, 0x1E5C, 0x6B99, 0x6B99, 0x3837, + 0x6B9A, 0x6B9B, 0x18DD, 0x6B9C, 0x6B9D, 0x3838, 0x6B9E, 0x6B9E, 0x2488, + 0x6B9F, 0x6BA0, 0x383A, 0x6BA1, 0x6BA1, 0x18DF, 0x6BA2, 0x6BA3, 0x383C, + 0x6BA4, 0x6BA4, 0x2487, 0x6BA5, 0x6BA9, 0x383E, 0x6BAA, 0x6BAA, 0x18E0, + 0x6BAB, 0x6BAB, 0x248A, 0x6BAC, 0x6BAD, 0x3843, 0x6BAE, 0x6BAE, 0x2489, + 0x6BAF, 0x6BAF, 0x248B, 0x6BB0, 0x6BB1, 0x3845, 0x6BB2, 0x6BB2, 0x1F83, + 0x6BB3, 0x6BB3, 0x19BD, 0x6BB4, 0x6BB4, 0x0B7A, 0x6BB5, 0x6BB5, 0x060D, + 0x6BB6, 0x6BB6, 0x3847, 0x6BB7, 0x6BB7, 0x107A, 0x6BB8, 0x6BB9, 0x3848, + 0x6BBA, 0x6BBA, 0x210F, 0x6BBB, 0x6BBB, 0x1FDB, 0x6BBC, 0x6BBE, 0x384A, + 0x6BBF, 0x6BBF, 0x05CF, 0x6BC0, 0x6BC0, 0x384D, 0x6BC1, 0x6BC1, 0x07EE, + 0x6BC2, 0x6BC2, 0x19BF, 0x6BC3, 0x6BC4, 0x384E, 0x6BC5, 0x6BC5, 0x106A, + 0x6BC6, 0x6BC6, 0x20AF, 0x6BC7, 0x6BCA, 0x3850, 0x6BCB, 0x6BCB, 0x0EF2, + 0x6BCC, 0x6BCC, 0x3854, 0x6BCD, 0x6BCD, 0x0B1B, 0x6BCE, 0x6BCE, 0x3855, + 0x6BCF, 0x6BCF, 0x0AC4, 0x6BD0, 0x6BD1, 0x3856, 0x6BD2, 0x6BD2, 0x05FD, + 0x6BD3, 0x6BD3, 0x126F, 0x6BD4, 0x6BD4, 0x0431, 0x6BD5, 0x6BD5, 0x0438, + 0x6BD6, 0x6BD6, 0x043A, 0x6BD7, 0x6BD7, 0x0BBF, 0x6BD8, 0x6BD8, 0x3858, + 0x6BD9, 0x6BD9, 0x0439, 0x6BDA, 0x6BDA, 0x3859, 0x6BDB, 0x6BDB, 0x0AB0, + 0x6BDC, 0x6BE0, 0x385A, 0x6BE1, 0x6BE1, 0x1152, 0x6BE2, 0x6BE9, 0x385F, + 0x6BEA, 0x6BEA, 0x1954, 0x6BEB, 0x6BEB, 0x0778, 0x6BEC, 0x6BEE, 0x3867, + 0x6BEF, 0x6BEF, 0x0E0D, 0x6BF0, 0x6BF2, 0x386A, 0x6BF3, 0x6BF3, 0x1955, + 0x6BF4, 0x6BF4, 0x386D, 0x6BF5, 0x6BF5, 0x1957, 0x6BF6, 0x6BF8, 0x386E, + 0x6BF9, 0x6BF9, 0x1958, 0x6BFA, 0x6BFC, 0x3871, 0x6BFD, 0x6BFD, 0x1956, + 0x6BFE, 0x6BFE, 0x3874, 0x6BFF, 0x6BFF, 0x24C0, 0x6C00, 0x6C04, 0x3875, + 0x6C05, 0x6C05, 0x1959, 0x6C06, 0x6C06, 0x195B, 0x6C07, 0x6C07, 0x195A, + 0x6C08, 0x6C08, 0x226D, 0x6C09, 0x6C0B, 0x387A, 0x6C0C, 0x6C0C, 0x24C1, + 0x6C0D, 0x6C0D, 0x195C, 0x6C0E, 0x6C0E, 0x387D, 0x6C0F, 0x6C0F, 0x0D66, + 0x6C10, 0x6C10, 0x126B, 0x6C11, 0x6C11, 0x0AF6, 0x6C12, 0x6C12, 0x387E, + 0x6C13, 0x6C13, 0x0AAA, 0x6C14, 0x6C14, 0x0C17, 0x6C15, 0x6C15, 0x195D, + 0x6C16, 0x6C16, 0x0B2D, 0x6C17, 0x6C17, 0x387F, 0x6C18, 0x6C1A, 0x195E, + 0x6C1B, 0x6C1B, 0x0672, 0x6C1C, 0x6C1E, 0x3880, 0x6C1F, 0x6C1F, 0x0697, + 0x6C20, 0x6C20, 0x3883, 0x6C21, 0x6C21, 0x1961, 0x6C22, 0x6C22, 0x0C5F, + 0x6C23, 0x6C23, 0x20CA, 0x6C24, 0x6C24, 0x1963, 0x6C25, 0x6C25, 0x3884, + 0x6C26, 0x6C26, 0x075B, 0x6C27, 0x6C27, 0x101E, 0x6C28, 0x6C28, 0x03BC, + 0x6C29, 0x6C29, 0x1962, 0x6C2A, 0x6C2A, 0x1964, 0x6C2B, 0x6C2B, 0x20E7, + 0x6C2C, 0x6C2C, 0x24C2, 0x6C2D, 0x6C2D, 0x3885, 0x6C2E, 0x6C2E, 0x058B, + 0x6C2F, 0x6C2F, 0x0A6F, 0x6C30, 0x6C30, 0x0C65, 0x6C31, 0x6C31, 0x3886, + 0x6C32, 0x6C32, 0x1965, 0x6C33, 0x6C33, 0x3887, 0x6C34, 0x6C34, 0x0DA3, + 0x6C35, 0x6C35, 0x169F, 0x6C36, 0x6C37, 0x3888, 0x6C38, 0x6C38, 0x10A5, + 0x6C39, 0x6C3C, 0x388A, 0x6C3D, 0x6C3D, 0x12EF, 0x6C3E, 0x6C3F, 0x388E, + 0x6C40, 0x6C40, 0x0E52, 0x6C41, 0x6C41, 0x11AC, 0x6C42, 0x6C42, 0x0C70, + 0x6C43, 0x6C45, 0x3890, 0x6C46, 0x6C46, 0x12F4, 0x6C47, 0x6C47, 0x07F8, + 0x6C48, 0x6C48, 0x3893, 0x6C49, 0x6C49, 0x0771, 0x6C4A, 0x6C4A, 0x16A2, + 0x6C4B, 0x6C4F, 0x3894, 0x6C50, 0x6C50, 0x0F18, 0x6C51, 0x6C53, 0x3899, + 0x6C54, 0x6C54, 0x16A0, 0x6C55, 0x6C55, 0x0D00, 0x6C56, 0x6C56, 0x389C, + 0x6C57, 0x6C57, 0x0770, 0x6C58, 0x6C5A, 0x389D, 0x6C5B, 0x6C5B, 0x0FDD, + 0x6C5C, 0x6C5C, 0x16A1, 0x6C5D, 0x6C5D, 0x0CC5, 0x6C5E, 0x6C5E, 0x0708, + 0x6C5F, 0x6C5F, 0x087E, 0x6C60, 0x6C60, 0x04FD, 0x6C61, 0x6C61, 0x0EEA, + 0x6C62, 0x6C63, 0x38A0, 0x6C64, 0x6C64, 0x0E13, 0x6C65, 0x6C67, 0x38A2, + 0x6C68, 0x6C69, 0x16A8, 0x6C6A, 0x6C6A, 0x0EA5, 0x6C6B, 0x6C6F, 0x38A5, + 0x6C70, 0x6C70, 0x0E00, 0x6C71, 0x6C71, 0x38AA, 0x6C72, 0x6C72, 0x0826, + 0x6C73, 0x6C73, 0x38AB, 0x6C74, 0x6C74, 0x16AA, 0x6C75, 0x6C75, 0x38AC, + 0x6C76, 0x6C76, 0x16AB, 0x6C77, 0x6C78, 0x38AD, 0x6C79, 0x6C79, 0x0FA5, + 0x6C7A, 0x6C7C, 0x38AF, 0x6C7D, 0x6C7D, 0x0C1A, 0x6C7E, 0x6C7E, 0x0677, + 0x6C7F, 0x6C80, 0x38B2, 0x6C81, 0x6C81, 0x0C5C, 0x6C82, 0x6C82, 0x1051, + 0x6C83, 0x6C83, 0x0EE5, 0x6C84, 0x6C84, 0x38B4, 0x6C85, 0x6C85, 0x16A4, + 0x6C86, 0x6C86, 0x16AC, 0x6C87, 0x6C87, 0x38B5, 0x6C88, 0x6C88, 0x0D2B, + 0x6C89, 0x6C89, 0x04E6, 0x6C8A, 0x6C8B, 0x38B6, 0x6C8C, 0x6C8C, 0x16A7, + 0x6C8D, 0x6C8E, 0x38B8, 0x6C8F, 0x6C8F, 0x0C02, 0x6C90, 0x6C90, 0x16A5, + 0x6C91, 0x6C92, 0x38BA, 0x6C93, 0x6C93, 0x1A1F, 0x6C94, 0x6C94, 0x16A6, + 0x6C95, 0x6C98, 0x38BC, 0x6C99, 0x6C99, 0x0CEC, 0x6C9A, 0x6C9A, 0x38C0, + 0x6C9B, 0x6C9B, 0x0BA7, 0x6C9C, 0x6C9E, 0x38C1, 0x6C9F, 0x6C9F, 0x070E, + 0x6CA0, 0x6CA0, 0x38C4, 0x6CA1, 0x6CA1, 0x0AC0, 0x6CA2, 0x6CA2, 0x38C5, + 0x6CA3, 0x6CA3, 0x16A3, 0x6CA4, 0x6CA4, 0x0B7E, 0x6CA5, 0x6CA5, 0x09ED, + 0x6CA6, 0x6CA6, 0x0A80, 0x6CA7, 0x6CA7, 0x049E, 0x6CA8, 0x6CA8, 0x38C6, + 0x6CA9, 0x6CA9, 0x16AD, 0x6CAA, 0x6CAA, 0x07BB, 0x6CAB, 0x6CAB, 0x0B10, + 0x6CAC, 0x6CAC, 0x38C7, 0x6CAD, 0x6CAD, 0x16B0, 0x6CAE, 0x6CAE, 0x0909, + 0x6CAF, 0x6CB0, 0x38C8, 0x6CB1, 0x6CB1, 0x16BB, 0x6CB2, 0x6CB2, 0x16B5, + 0x6CB3, 0x6CB3, 0x078A, 0x6CB4, 0x6CB7, 0x38CA, 0x6CB8, 0x6CB8, 0x066D, + 0x6CB9, 0x6CB9, 0x10B2, 0x6CBA, 0x6CBA, 0x38CE, 0x6CBB, 0x6CBB, 0x11CD, + 0x6CBC, 0x6CBC, 0x1174, 0x6CBD, 0x6CBD, 0x071A, 0x6CBE, 0x6CBE, 0x1155, + 0x6CBF, 0x6CBF, 0x1001, 0x6CC0, 0x6CC3, 0x38CF, 0x6CC4, 0x6CC4, 0x0F84, + 0x6CC5, 0x6CC5, 0x0C73, 0x6CC6, 0x6CC8, 0x38D3, 0x6CC9, 0x6CC9, 0x0C85, + 0x6CCA, 0x6CCA, 0x047B, 0x6CCB, 0x6CCB, 0x38D6, 0x6CCC, 0x6CCC, 0x0ADF, + 0x6CCD, 0x6CCF, 0x38D7, 0x6CD0, 0x6CD0, 0x16AE, 0x6CD1, 0x6CD2, 0x38DA, + 0x6CD3, 0x6CD3, 0x16BC, 0x6CD4, 0x6CD4, 0x16AF, 0x6CD5, 0x6CD5, 0x0645, + 0x6CD6, 0x6CD6, 0x16B7, 0x6CD7, 0x6CD7, 0x16B4, 0x6CD8, 0x6CDA, 0x38DC, + 0x6CDB, 0x6CDB, 0x0657, 0x6CDC, 0x6CDD, 0x38DF, 0x6CDE, 0x6CDE, 0x0B63, + 0x6CDF, 0x6CDF, 0x38E1, 0x6CE0, 0x6CE0, 0x16B6, 0x6CE1, 0x6CE1, 0x0B9E, + 0x6CE2, 0x6CE2, 0x046F, 0x6CE3, 0x6CE3, 0x0C1B, 0x6CE4, 0x6CE4, 0x38E2, + 0x6CE5, 0x6CE5, 0x0B43, 0x6CE6, 0x6CE7, 0x38E3, 0x6CE8, 0x6CE8, 0x11FF, + 0x6CE9, 0x6CE9, 0x38E5, 0x6CEA, 0x6CEA, 0x09CC, 0x6CEB, 0x6CEB, 0x16B9, + 0x6CEC, 0x6CED, 0x38E6, 0x6CEE, 0x6CEE, 0x16BA, 0x6CEF, 0x6CEF, 0x16BD, + 0x6CF0, 0x6CF0, 0x0DFC, 0x6CF1, 0x6CF1, 0x16B3, 0x6CF2, 0x6CF2, 0x38E8, + 0x6CF3, 0x6CF3, 0x10A3, 0x6CF4, 0x6CF4, 0x38E9, 0x6CF5, 0x6CF5, 0x042C, + 0x6CF6, 0x6CF6, 0x1A20, 0x6CF7, 0x6CF8, 0x16B1, 0x6CF9, 0x6CF9, 0x38EA, + 0x6CFA, 0x6CFA, 0x16B8, 0x6CFB, 0x6CFB, 0x0F85, 0x6CFC, 0x6CFC, 0x0BE2, + 0x6CFD, 0x6CFD, 0x1136, 0x6CFE, 0x6CFE, 0x16BE, 0x6CFF, 0x6CFF, 0x38EB, + 0x6D00, 0x6D00, 0x38EC, 0x6D01, 0x6D01, 0x08B1, 0x6D02, 0x6D03, 0x38ED, + 0x6D04, 0x6D04, 0x16C5, 0x6D05, 0x6D06, 0x38EF, 0x6D07, 0x6D07, 0x16C4, + 0x6D08, 0x6D0A, 0x38F1, 0x6D0B, 0x6D0B, 0x101C, 0x6D0C, 0x6D0C, 0x16C1, + 0x6D0D, 0x6D0D, 0x38F4, 0x6D0E, 0x6D0E, 0x16C7, 0x6D0F, 0x6D11, 0x38F5, + 0x6D12, 0x6D12, 0x0CD2, 0x6D13, 0x6D16, 0x38F8, 0x6D17, 0x6D17, 0x0F21, + 0x6D18, 0x6D18, 0x38FC, 0x6D19, 0x6D19, 0x16C6, 0x6D1A, 0x6D1A, 0x16CC, + 0x6D1B, 0x6D1B, 0x0A8C, 0x6D1C, 0x6D1D, 0x38FD, 0x6D1E, 0x6D1E, 0x05F3, + 0x6D1F, 0x6D24, 0x38FF, 0x6D25, 0x6D25, 0x08C3, 0x6D26, 0x6D26, 0x3905, + 0x6D27, 0x6D27, 0x16C0, 0x6D28, 0x6D29, 0x3906, 0x6D2A, 0x6D2A, 0x07A0, + 0x6D2B, 0x6D2B, 0x16C8, 0x6D2C, 0x6D2D, 0x3908, 0x6D2E, 0x6D2E, 0x16CA, + 0x6D2F, 0x6D30, 0x390A, 0x6D31, 0x6D31, 0x063C, 0x6D32, 0x6D32, 0x11DD, + 0x6D33, 0x6D33, 0x16D0, 0x6D34, 0x6D34, 0x390C, 0x6D35, 0x6D35, 0x16CB, + 0x6D36, 0x6D38, 0x390D, 0x6D39, 0x6D39, 0x16BF, 0x6D3A, 0x6D3A, 0x3910, + 0x6D3B, 0x6D3B, 0x0803, 0x6D3C, 0x6D3C, 0x0E8E, 0x6D3D, 0x6D3D, 0x0C1F, + 0x6D3E, 0x6D3E, 0x0B8A, 0x6D3F, 0x6D40, 0x3911, 0x6D41, 0x6D41, 0x0A40, + 0x6D42, 0x6D42, 0x3913, 0x6D43, 0x6D43, 0x16C2, 0x6D44, 0x6D44, 0x3914, + 0x6D45, 0x6D45, 0x0C30, 0x6D46, 0x6D46, 0x087D, 0x6D47, 0x6D47, 0x088E, + 0x6D48, 0x6D48, 0x16C3, 0x6D49, 0x6D49, 0x3915, 0x6D4A, 0x6D4A, 0x1224, + 0x6D4B, 0x6D4B, 0x04A9, 0x6D4C, 0x6D4C, 0x3916, 0x6D4D, 0x6D4D, 0x16C9, + 0x6D4E, 0x6D4E, 0x0836, 0x6D4F, 0x6D4F, 0x16CD, 0x6D50, 0x6D50, 0x3917, + 0x6D51, 0x6D51, 0x0800, 0x6D52, 0x6D52, 0x16CE, 0x6D53, 0x6D53, 0x0B69, + 0x6D54, 0x6D54, 0x16CF, 0x6D55, 0x6D58, 0x3918, 0x6D59, 0x6D59, 0x1184, + 0x6D5A, 0x6D5A, 0x0930, 0x6D5B, 0x6D5B, 0x391C, 0x6D5C, 0x6D5C, 0x16D8, + 0x6D5D, 0x6D5D, 0x391D, 0x6D5E, 0x6D5E, 0x16D5, 0x6D5F, 0x6D5F, 0x391E, + 0x6D60, 0x6D60, 0x16D9, 0x6D61, 0x6D62, 0x391F, 0x6D63, 0x6D63, 0x16DB, + 0x6D64, 0x6D65, 0x3921, 0x6D66, 0x6D66, 0x0BF5, 0x6D67, 0x6D68, 0x3923, + 0x6D69, 0x6D69, 0x077D, 0x6D6A, 0x6D6A, 0x09B6, 0x6D6B, 0x6D6D, 0x3925, + 0x6D6E, 0x6D6E, 0x069C, 0x6D6F, 0x6D6F, 0x16D2, 0x6D70, 0x6D73, 0x3928, + 0x6D74, 0x6D74, 0x10E4, 0x6D75, 0x6D76, 0x392C, 0x6D77, 0x6D77, 0x075A, + 0x6D78, 0x6D78, 0x08CF, 0x6D79, 0x6D79, 0x23DC, 0x6D7A, 0x6D7B, 0x392E, + 0x6D7C, 0x6D7C, 0x16DA, 0x6D7D, 0x6D81, 0x3930, 0x6D82, 0x6D82, 0x0E70, + 0x6D83, 0x6D84, 0x3935, 0x6D85, 0x6D85, 0x0B5C, 0x6D86, 0x6D86, 0x3937, + 0x6D87, 0x6D87, 0x23DB, 0x6D88, 0x6D88, 0x0F68, 0x6D89, 0x6D89, 0x0D1F, + 0x6D8A, 0x6D8B, 0x3938, 0x6D8C, 0x6D8C, 0x10A4, 0x6D8D, 0x6D8D, 0x393A, + 0x6D8E, 0x6D8E, 0x0F3E, 0x6D8F, 0x6D90, 0x393B, 0x6D91, 0x6D91, 0x16D1, + 0x6D92, 0x6D92, 0x393D, 0x6D93, 0x6D94, 0x16D6, 0x6D95, 0x6D95, 0x0E3C, + 0x6D96, 0x6D9A, 0x393E, 0x6D9B, 0x6D9B, 0x0E21, 0x6D9C, 0x6D9C, 0x3943, + 0x6D9D, 0x6D9D, 0x09BF, 0x6D9E, 0x6D9E, 0x16D3, 0x6D9F, 0x6D9F, 0x09F9, + 0x6DA0, 0x6DA0, 0x16D4, 0x6DA1, 0x6DA1, 0x0EDF, 0x6DA2, 0x6DA2, 0x3944, + 0x6DA3, 0x6DA3, 0x07D6, 0x6DA4, 0x6DA4, 0x05B4, 0x6DA5, 0x6DA5, 0x3945, + 0x6DA6, 0x6DA6, 0x0CCE, 0x6DA7, 0x6DA7, 0x0878, 0x6DA8, 0x6DA8, 0x1168, + 0x6DA9, 0x6DA9, 0x0CE5, 0x6DAA, 0x6DAA, 0x069D, 0x6DAB, 0x6DAB, 0x16E8, + 0x6DAC, 0x6DAD, 0x3946, 0x6DAE, 0x6DAE, 0x16EA, 0x6DAF, 0x6DAF, 0x0FED, + 0x6DB0, 0x6DB1, 0x3948, 0x6DB2, 0x6DB2, 0x1041, 0x6DB3, 0x6DB4, 0x394A, + 0x6DB5, 0x6DB5, 0x0764, 0x6DB6, 0x6DB7, 0x394C, 0x6DB8, 0x6DB8, 0x078B, + 0x6DB9, 0x6DBE, 0x394E, 0x6DBF, 0x6DBF, 0x16E1, 0x6DC0, 0x6DC0, 0x05CE, + 0x6DC1, 0x6DC3, 0x3954, 0x6DC4, 0x6DC4, 0x122A, 0x6DC5, 0x6DC5, 0x16DE, + 0x6DC6, 0x6DC6, 0x0F6A, 0x6DC7, 0x6DC7, 0x16DD, 0x6DC8, 0x6DCA, 0x3957, + 0x6DCB, 0x6DCB, 0x0A25, 0x6DCC, 0x6DCC, 0x0E1D, 0x6DCD, 0x6DD0, 0x395A, + 0x6DD1, 0x6DD1, 0x0D7E, 0x6DD2, 0x6DD5, 0x395E, 0x6DD6, 0x6DD6, 0x0B3A, + 0x6DD7, 0x6DD7, 0x3962, 0x6DD8, 0x6DD8, 0x0E27, 0x6DD9, 0x6DD9, 0x16E6, + 0x6DDA, 0x6DDC, 0x3963, 0x6DDD, 0x6DDD, 0x16E5, 0x6DDE, 0x6DDE, 0x16DF, + 0x6DDF, 0x6DDF, 0x3966, 0x6DE0, 0x6DE0, 0x16E2, 0x6DE1, 0x6DE1, 0x058E, + 0x6DE2, 0x6DE3, 0x3967, 0x6DE4, 0x6DE4, 0x10BE, 0x6DE5, 0x6DE5, 0x3969, + 0x6DE6, 0x6DE6, 0x16E4, 0x6DE7, 0x6DE9, 0x396A, 0x6DEA, 0x6DEA, 0x205E, + 0x6DEB, 0x6DEB, 0x1080, 0x6DEC, 0x6DEC, 0x0566, 0x6DED, 0x6DED, 0x396D, + 0x6DEE, 0x6DEE, 0x07C9, 0x6DEF, 0x6DF0, 0x396E, 0x6DF1, 0x6DF1, 0x0D27, + 0x6DF2, 0x6DF2, 0x3970, 0x6DF3, 0x6DF3, 0x0541, 0x6DF4, 0x6DF4, 0x3971, + 0x6DF5, 0x6DF5, 0x2244, 0x6DF6, 0x6DF6, 0x23E2, 0x6DF7, 0x6DF7, 0x0801, + 0x6DF8, 0x6DF8, 0x3972, 0x6DF9, 0x6DF9, 0x0FF6, 0x6DFA, 0x6DFA, 0x20D4, + 0x6DFB, 0x6DFB, 0x0E40, 0x6DFC, 0x6DFC, 0x1A21, 0x6DFD, 0x6DFF, 0x3973, + 0x6E00, 0x6E04, 0x3976, 0x6E05, 0x6E05, 0x0C62, 0x6E06, 0x6E09, 0x397B, + 0x6E0A, 0x6E0A, 0x10EB, 0x6E0B, 0x6E0B, 0x397F, 0x6E0C, 0x6E0C, 0x16E9, + 0x6E0D, 0x6E0D, 0x1232, 0x6E0E, 0x6E0E, 0x16E0, 0x6E0F, 0x6E0F, 0x3980, + 0x6E10, 0x6E10, 0x0876, 0x6E11, 0x6E11, 0x16E3, 0x6E12, 0x6E13, 0x3981, + 0x6E14, 0x6E14, 0x10CB, 0x6E15, 0x6E15, 0x3983, 0x6E16, 0x6E16, 0x16E7, + 0x6E17, 0x6E17, 0x0D31, 0x6E18, 0x6E19, 0x3984, 0x6E1A, 0x6E1A, 0x16DC, + 0x6E1B, 0x6E1C, 0x3986, 0x6E1D, 0x6E1D, 0x10CA, 0x6E1E, 0x6E1F, 0x3988, + 0x6E20, 0x6E20, 0x0C7B, 0x6E21, 0x6E21, 0x0608, 0x6E22, 0x6E22, 0x398A, + 0x6E23, 0x6E23, 0x113F, 0x6E24, 0x6E24, 0x047A, 0x6E25, 0x6E25, 0x16F5, + 0x6E26, 0x6E26, 0x219F, 0x6E27, 0x6E28, 0x398B, 0x6E29, 0x6E29, 0x0ED1, + 0x6E2A, 0x6E2A, 0x398D, 0x6E2B, 0x6E2B, 0x16EB, 0x6E2C, 0x6E2C, 0x1E66, + 0x6E2D, 0x6E2D, 0x0ECB, 0x6E2E, 0x6E2E, 0x398E, 0x6E2F, 0x6E2F, 0x06D6, + 0x6E30, 0x6E31, 0x398F, 0x6E32, 0x6E32, 0x16F4, 0x6E33, 0x6E33, 0x3991, + 0x6E34, 0x6E34, 0x0957, 0x6E35, 0x6E37, 0x3992, 0x6E38, 0x6E38, 0x10B3, + 0x6E39, 0x6E39, 0x3995, 0x6E3A, 0x6E3A, 0x0AF1, 0x6E3B, 0x6E3D, 0x3996, + 0x6E3E, 0x6E3E, 0x1F63, 0x6E3F, 0x6E42, 0x3999, 0x6E43, 0x6E43, 0x0B89, + 0x6E44, 0x6E44, 0x16F6, 0x6E45, 0x6E4C, 0x399D, 0x6E4D, 0x6E4D, 0x0E75, + 0x6E4E, 0x6E4E, 0x16ED, 0x6E4F, 0x6E52, 0x39A5, 0x6E53, 0x6E54, 0x16F2, + 0x6E55, 0x6E55, 0x39A9, 0x6E56, 0x6E56, 0x07B5, 0x6E57, 0x6E57, 0x39AA, + 0x6E58, 0x6E58, 0x0F53, 0x6E59, 0x6E5A, 0x39AB, 0x6E5B, 0x6E5B, 0x1160, + 0x6E5C, 0x6E5D, 0x39AD, 0x6E5E, 0x6E5E, 0x23DD, 0x6E5F, 0x6E5F, 0x16F0, + 0x6E60, 0x6E6A, 0x39AF, 0x6E6B, 0x6E6B, 0x16EE, 0x6E6C, 0x6E6D, 0x39BA, + 0x6E6E, 0x6E6E, 0x16EC, 0x6E6F, 0x6E6F, 0x216B, 0x6E70, 0x6E7D, 0x39BC, + 0x6E7E, 0x6E7E, 0x0E96, 0x6E7F, 0x6E7F, 0x0D41, 0x6E80, 0x6E82, 0x39CA, + 0x6E83, 0x6E83, 0x098E, 0x6E84, 0x6E84, 0x39CD, 0x6E85, 0x6E85, 0x0877, + 0x6E86, 0x6E86, 0x16F1, 0x6E87, 0x6E88, 0x39CE, 0x6E89, 0x6E89, 0x06C3, + 0x6E8A, 0x6E8E, 0x39D0, 0x6E8F, 0x6E8F, 0x1705, 0x6E90, 0x6E90, 0x10F7, + 0x6E91, 0x6E95, 0x39D5, 0x6E96, 0x6E96, 0x22B5, 0x6E97, 0x6E97, 0x39DA, + 0x6E98, 0x6E98, 0x16F9, 0x6E99, 0x6E9B, 0x39DB, 0x6E9C, 0x6E9C, 0x0A38, + 0x6E9D, 0x6E9D, 0x1F26, 0x6E9E, 0x6E9E, 0x39DE, 0x6E9F, 0x6E9F, 0x1707, + 0x6EA0, 0x6EA1, 0x39DF, 0x6EA2, 0x6EA2, 0x106E, 0x6EA3, 0x6EA4, 0x39E1, + 0x6EA5, 0x6EA5, 0x16FD, 0x6EA6, 0x6EA6, 0x39E3, 0x6EA7, 0x6EA7, 0x16FE, + 0x6EA8, 0x6EA9, 0x39E4, 0x6EAA, 0x6EAA, 0x0F17, 0x6EAB, 0x6EAE, 0x39E6, + 0x6EAF, 0x6EAF, 0x0DD2, 0x6EB0, 0x6EB0, 0x39EA, 0x6EB1, 0x6EB1, 0x16F8, + 0x6EB2, 0x6EB2, 0x16EF, 0x6EB3, 0x6EB3, 0x39EB, 0x6EB4, 0x6EB4, 0x1703, + 0x6EB5, 0x6EB5, 0x39EC, 0x6EB6, 0x6EB6, 0x0CB7, 0x6EB7, 0x6EB7, 0x1701, + 0x6EB8, 0x6EB9, 0x39ED, 0x6EBA, 0x6EBA, 0x0B4A, 0x6EBB, 0x6EBB, 0x1700, + 0x6EBC, 0x6EBC, 0x39EF, 0x6EBD, 0x6EBD, 0x16FF, 0x6EBE, 0x6EC0, 0x39F0, + 0x6EC1, 0x6EC1, 0x0521, 0x6EC2, 0x6EC2, 0x1706, 0x6EC3, 0x6EC3, 0x39F3, + 0x6EC4, 0x6EC4, 0x1E63, 0x6EC5, 0x6EC5, 0x2088, 0x6EC6, 0x6EC6, 0x39F4, + 0x6EC7, 0x6EC7, 0x05C2, 0x6EC8, 0x6ECA, 0x39F5, 0x6ECB, 0x6ECB, 0x1229, + 0x6ECC, 0x6ECC, 0x1EBD, 0x6ECD, 0x6ECD, 0x39F8, 0x6ECE, 0x6ECE, 0x2341, + 0x6ECF, 0x6ECF, 0x1704, 0x6ED0, 0x6ED0, 0x39F9, 0x6ED1, 0x6ED1, 0x07C1, + 0x6ED2, 0x6ED2, 0x39FA, 0x6ED3, 0x6ED3, 0x122F, 0x6ED4, 0x6ED4, 0x0E22, + 0x6ED5, 0x6ED5, 0x19A8, 0x6ED6, 0x6ED6, 0x39FB, 0x6ED7, 0x6ED7, 0x1702, + 0x6ED8, 0x6ED9, 0x39FC, 0x6EDA, 0x6EDA, 0x074F, 0x6EDB, 0x6EDD, 0x39FE, + 0x6EDE, 0x6EDE, 0x11CC, 0x6EDF, 0x6EDF, 0x16F7, 0x6EE0, 0x6EE0, 0x16FA, + 0x6EE1, 0x6EE1, 0x0AA1, 0x6EE2, 0x6EE2, 0x16FC, 0x6EE3, 0x6EE3, 0x3A01, + 0x6EE4, 0x6EE4, 0x0A72, 0x6EE5, 0x6EE5, 0x09AF, 0x6EE6, 0x6EE6, 0x0A77, + 0x6EE7, 0x6EE7, 0x3A02, 0x6EE8, 0x6EE8, 0x045E, 0x6EE9, 0x6EE9, 0x0E05, + 0x6EEA, 0x6EEB, 0x3A03, 0x6EEC, 0x6EEC, 0x1F4B, 0x6EED, 0x6EEE, 0x3A05, + 0x6EEF, 0x6EEF, 0x2292, 0x6EF0, 0x6EF1, 0x3A07, 0x6EF2, 0x6EF2, 0x2124, + 0x6EF3, 0x6EF3, 0x3A09, 0x6EF4, 0x6EF4, 0x05AF, 0x6EF5, 0x6EF6, 0x3A0A, + 0x6EF7, 0x6EF7, 0x2048, 0x6EF8, 0x6EF8, 0x23E0, 0x6EF9, 0x6EF9, 0x170D, + 0x6EFA, 0x6EFE, 0x3A0C, 0x6EFF, 0x6EFF, 0x2077, 0x6F00, 0x6F00, 0x3A11, + 0x6F01, 0x6F01, 0x223A, 0x6F02, 0x6F02, 0x0BCE, 0x6F03, 0x6F05, 0x3A12, + 0x6F06, 0x6F06, 0x0C00, 0x6F07, 0x6F08, 0x3A15, 0x6F09, 0x6F09, 0x1713, + 0x6F0A, 0x6F0E, 0x3A17, 0x6F0F, 0x6F0F, 0x0A50, 0x6F10, 0x6F12, 0x3A1C, + 0x6F13, 0x6F13, 0x09D7, 0x6F14, 0x6F14, 0x1006, 0x6F15, 0x6F15, 0x170C, + 0x6F16, 0x6F19, 0x3A1F, 0x6F1A, 0x6F1A, 0x20B1, 0x6F1B, 0x6F1F, 0x3A23, + 0x6F20, 0x6F20, 0x0B11, 0x6F21, 0x6F21, 0x3A28, 0x6F22, 0x6F22, 0x1F41, + 0x6F23, 0x6F23, 0x201C, 0x6F24, 0x6F24, 0x170B, 0x6F25, 0x6F28, 0x3A29, + 0x6F29, 0x6F29, 0x1714, 0x6F2A, 0x6F2A, 0x1712, 0x6F2B, 0x6F2B, 0x0AA5, + 0x6F2C, 0x6F2C, 0x22B8, 0x6F2D, 0x6F2D, 0x16FB, 0x6F2E, 0x6F2E, 0x3A2D, + 0x6F2F, 0x6F2F, 0x170E, 0x6F30, 0x6F30, 0x3A2E, 0x6F31, 0x6F31, 0x0D95, + 0x6F32, 0x6F32, 0x2276, 0x6F33, 0x6F33, 0x1165, 0x6F34, 0x6F35, 0x3A2F, + 0x6F36, 0x6F36, 0x170F, 0x6F37, 0x6F37, 0x3A31, 0x6F38, 0x6F38, 0x1F9B, + 0x6F39, 0x6F3D, 0x3A32, 0x6F3E, 0x6F3E, 0x1023, 0x6F3F, 0x6F3F, 0x1F9F, + 0x6F40, 0x6F40, 0x3A37, 0x6F41, 0x6F41, 0x25CA, 0x6F42, 0x6F45, 0x3A38, + 0x6F46, 0x6F47, 0x1709, 0x6F48, 0x6F4A, 0x3A3C, 0x6F4B, 0x6F4B, 0x1710, + 0x6F4C, 0x6F4C, 0x3A3F, 0x6F4D, 0x6F4D, 0x0EBA, 0x6F4E, 0x6F50, 0x3A40, + 0x6F51, 0x6F51, 0x20BE, 0x6F52, 0x6F53, 0x3A43, 0x6F54, 0x6F54, 0x1FB4, + 0x6F55, 0x6F57, 0x3A45, 0x6F58, 0x6F58, 0x0B8C, 0x6F59, 0x6F59, 0x23D7, + 0x6F5A, 0x6F5B, 0x3A48, 0x6F5C, 0x6F5C, 0x0C2E, 0x6F5D, 0x6F5D, 0x3A4A, + 0x6F5E, 0x6F5E, 0x0A61, 0x6F5F, 0x6F61, 0x3A4B, 0x6F62, 0x6F62, 0x1708, + 0x6F63, 0x6F63, 0x3A4E, 0x6F64, 0x6F64, 0x2105, 0x6F65, 0x6F65, 0x3A4F, + 0x6F66, 0x6F66, 0x0A13, 0x6F67, 0x6F6C, 0x3A50, 0x6F6D, 0x6F6D, 0x0E09, + 0x6F6E, 0x6F6E, 0x04D6, 0x6F6F, 0x6F6F, 0x23E1, 0x6F70, 0x6F70, 0x1FEC, + 0x6F71, 0x6F71, 0x3A56, 0x6F72, 0x6F72, 0x1719, 0x6F73, 0x6F73, 0x3A57, + 0x6F74, 0x6F74, 0x1711, 0x6F75, 0x6F76, 0x3A58, 0x6F77, 0x6F77, 0x23EA, + 0x6F78, 0x6F78, 0x1718, 0x6F79, 0x6F79, 0x3A5A, 0x6F7A, 0x6F7A, 0x171B, + 0x6F7B, 0x6F7B, 0x3A5B, 0x6F7C, 0x6F7C, 0x171A, 0x6F7D, 0x6F7E, 0x3A5C, + 0x6F7F, 0x6F7F, 0x23E3, 0x6F80, 0x6F80, 0x210E, 0x6F81, 0x6F83, 0x3A5E, + 0x6F84, 0x6F84, 0x04F3, 0x6F85, 0x6F85, 0x3A61, 0x6F86, 0x6F86, 0x1FA6, + 0x6F87, 0x6F87, 0x2004, 0x6F88, 0x6F88, 0x04DF, 0x6F89, 0x6F89, 0x1715, + 0x6F8A, 0x6F8B, 0x3A62, 0x6F8C, 0x6F8C, 0x1717, 0x6F8D, 0x6F8D, 0x1716, + 0x6F8E, 0x6F8E, 0x0BAD, 0x6F8F, 0x6F96, 0x3A64, 0x6F97, 0x6F97, 0x1F9D, + 0x6F98, 0x6F9B, 0x3A6C, 0x6F9C, 0x6F9C, 0x09A8, 0x6F9D, 0x6F9F, 0x3A70, + 0x6FA0, 0x6FA0, 0x23E5, 0x6FA1, 0x6FA1, 0x112B, 0x6FA2, 0x6FA3, 0x3A73, + 0x6FA4, 0x6FA4, 0x2264, 0x6FA5, 0x6FA6, 0x3A75, 0x6FA7, 0x6FA7, 0x171E, + 0x6FA8, 0x6FA8, 0x3A77, 0x6FA9, 0x6FA9, 0x24E2, 0x6FAA, 0x6FAD, 0x3A78, + 0x6FAE, 0x6FAE, 0x23DE, 0x6FAF, 0x6FB0, 0x3A7C, 0x6FB1, 0x6FB1, 0x1EC4, + 0x6FB2, 0x6FB2, 0x3A7E, 0x6FB3, 0x6FB3, 0x03CF, 0x6FB4, 0x6FB5, 0x3A7F, + 0x6FB6, 0x6FB6, 0x1720, 0x6FB7, 0x6FB8, 0x3A81, 0x6FB9, 0x6FB9, 0x171F, + 0x6FBA, 0x6FBF, 0x3A83, 0x6FC0, 0x6FC0, 0x0817, 0x6FC1, 0x6FC1, 0x22B6, + 0x6FC2, 0x6FC2, 0x1721, 0x6FC3, 0x6FC3, 0x20A9, 0x6FC4, 0x6FC8, 0x3A89, + 0x6FC9, 0x6FC9, 0x171D, 0x6FCA, 0x6FD0, 0x3A8E, 0x6FD1, 0x6FD1, 0x171C, + 0x6FD2, 0x6FD2, 0x045D, 0x6FD3, 0x6FD4, 0x3A95, 0x6FD5, 0x6FD5, 0x212B, + 0x6FD6, 0x6FD7, 0x3A97, 0x6FD8, 0x6FD8, 0x20A5, 0x6FD9, 0x6FDA, 0x3A99, + 0x6FDB, 0x6FDB, 0x268B, 0x6FDC, 0x6FDD, 0x3A9B, 0x6FDE, 0x6FDE, 0x1724, + 0x6FDF, 0x6FDF, 0x1F76, 0x6FE0, 0x6FE0, 0x1725, 0x6FE1, 0x6FE1, 0x1722, + 0x6FE2, 0x6FE3, 0x3A9D, 0x6FE4, 0x6FE4, 0x216D, 0x6FE5, 0x6FEA, 0x3A9F, + 0x6FEB, 0x6FEB, 0x2001, 0x6FEC, 0x6FED, 0x3AA5, 0x6FEE, 0x6FEE, 0x1723, + 0x6FEF, 0x6FEF, 0x1726, 0x6FF0, 0x6FF0, 0x2191, 0x6FF1, 0x6FF1, 0x1E50, + 0x6FF2, 0x6FF9, 0x3AA7, 0x6FFA, 0x6FFA, 0x1F9C, 0x6FFB, 0x6FFB, 0x3AAF, + 0x6FFC, 0x6FFC, 0x23DA, 0x6FFD, 0x6FFD, 0x3AB0, 0x6FFE, 0x6FFE, 0x2053, + 0x6FFF, 0x6FFF, 0x3AB1, 0x7000, 0x7004, 0x3AB2, 0x7005, 0x7005, 0x23E9, + 0x7006, 0x7006, 0x23E4, 0x7007, 0x7008, 0x3AB7, 0x7009, 0x7009, 0x21D5, + 0x700A, 0x700A, 0x3AB9, 0x700B, 0x700B, 0x23E6, 0x700C, 0x700E, 0x3ABA, + 0x700F, 0x700F, 0x23DF, 0x7010, 0x7010, 0x3ABD, 0x7011, 0x7011, 0x0BF8, + 0x7012, 0x7014, 0x3ABE, 0x7015, 0x7015, 0x1E4F, 0x7016, 0x7017, 0x3AC1, + 0x7018, 0x7018, 0x23D9, 0x7019, 0x7019, 0x3AC3, 0x701A, 0x701A, 0x1727, + 0x701B, 0x701B, 0x1729, 0x701C, 0x701C, 0x3AC4, 0x701D, 0x701D, 0x2014, + 0x701E, 0x701E, 0x3AC5, 0x701F, 0x701F, 0x23EC, 0x7020, 0x7020, 0x23EB, + 0x7021, 0x7022, 0x3AC6, 0x7023, 0x7023, 0x1728, 0x7024, 0x7026, 0x3AC8, + 0x7027, 0x7027, 0x23D8, 0x7028, 0x7028, 0x23EE, 0x7029, 0x702F, 0x3ACB, + 0x7030, 0x7030, 0x268E, 0x7031, 0x7031, 0x3AD2, 0x7032, 0x7032, 0x23ED, + 0x7033, 0x7034, 0x3AD3, 0x7035, 0x7035, 0x172B, 0x7036, 0x7038, 0x3AD5, + 0x7039, 0x7039, 0x172A, 0x703A, 0x703D, 0x3AD8, 0x703E, 0x703E, 0x1FFA, + 0x703F, 0x7042, 0x3ADC, 0x7043, 0x7043, 0x23D6, 0x7044, 0x7044, 0x23E8, + 0x7045, 0x704B, 0x3AE0, 0x704C, 0x704C, 0x0739, 0x704D, 0x704E, 0x3AE7, + 0x704F, 0x704F, 0x172C, 0x7050, 0x7050, 0x3AE9, 0x7051, 0x7051, 0x2106, + 0x7052, 0x7054, 0x3AEA, 0x7055, 0x7055, 0x200B, 0x7056, 0x7057, 0x3AED, + 0x7058, 0x7058, 0x2166, 0x7059, 0x705C, 0x3AEF, 0x705D, 0x705D, 0x23EF, + 0x705E, 0x705E, 0x172D, 0x705F, 0x7062, 0x3AF3, 0x7063, 0x7063, 0x2189, + 0x7064, 0x7064, 0x2058, 0x7065, 0x7066, 0x3AF7, 0x7067, 0x7067, 0x23E7, + 0x7068, 0x706A, 0x3AF9, 0x706B, 0x706B, 0x0805, 0x706C, 0x706C, 0x19EF, + 0x706D, 0x706D, 0x0AF5, 0x706E, 0x706E, 0x3AFC, 0x706F, 0x706F, 0x05A7, + 0x7070, 0x7070, 0x07E7, 0x7071, 0x7074, 0x3AFD, 0x7075, 0x7075, 0x0A32, + 0x7076, 0x7076, 0x1131, 0x7077, 0x7077, 0x3B01, 0x7078, 0x7078, 0x08F3, + 0x7079, 0x707B, 0x3B02, 0x707C, 0x707C, 0x1223, 0x707D, 0x707D, 0x3B05, + 0x707E, 0x707E, 0x1119, 0x707F, 0x707F, 0x049A, 0x7080, 0x7080, 0x19CC, + 0x7081, 0x7084, 0x3B06, 0x7085, 0x7085, 0x1913, 0x7086, 0x7088, 0x3B0A, + 0x7089, 0x7089, 0x0A56, 0x708A, 0x708A, 0x0539, 0x708B, 0x708D, 0x3B0D, + 0x708E, 0x708E, 0x1000, 0x708F, 0x7091, 0x3B10, 0x7092, 0x7092, 0x04D9, + 0x7093, 0x7093, 0x3B13, 0x7094, 0x7094, 0x0C8D, 0x7095, 0x7095, 0x0948, + 0x7096, 0x7096, 0x19CE, 0x7097, 0x7098, 0x3B14, 0x7099, 0x7099, 0x11CA, + 0x709A, 0x709B, 0x3B16, 0x709C, 0x709C, 0x19CD, 0x709D, 0x709D, 0x19CF, + 0x709E, 0x70AA, 0x3B18, 0x70AB, 0x70AB, 0x19D3, 0x70AC, 0x70AC, 0x0915, + 0x70AD, 0x70AD, 0x0E12, 0x70AE, 0x70AE, 0x0B9B, 0x70AF, 0x70AF, 0x08EB, + 0x70B0, 0x70B0, 0x3B25, 0x70B1, 0x70B1, 0x19D4, 0x70B2, 0x70B2, 0x3B26, + 0x70B3, 0x70B3, 0x0467, 0x70B4, 0x70B6, 0x3B27, 0x70B7, 0x70B7, 0x19D2, + 0x70B8, 0x70B8, 0x1149, 0x70B9, 0x70B9, 0x05C4, 0x70BA, 0x70BA, 0x3B2A, + 0x70BB, 0x70BB, 0x19D0, 0x70BC, 0x70BC, 0x09FF, 0x70BD, 0x70BD, 0x0508, + 0x70BE, 0x70BF, 0x3B2B, 0x70C0, 0x70C0, 0x19D1, 0x70C1, 0x70C1, 0x0DAD, + 0x70C2, 0x70C2, 0x09AE, 0x70C3, 0x70C3, 0x0E51, 0x70C4, 0x70C7, 0x3B2D, + 0x70C8, 0x70C8, 0x0A1B, 0x70C9, 0x70C9, 0x3B31, 0x70CA, 0x70CA, 0x19D6, + 0x70CB, 0x70CE, 0x3B32, 0x70CF, 0x70CF, 0x21A3, 0x70D0, 0x70D7, 0x3B36, + 0x70D8, 0x70D8, 0x079D, 0x70D9, 0x70D9, 0x09BE, 0x70DA, 0x70DA, 0x3B3E, + 0x70DB, 0x70DB, 0x11F1, 0x70DC, 0x70DE, 0x3B3F, 0x70DF, 0x70DF, 0x0FF5, + 0x70E0, 0x70E3, 0x3B42, 0x70E4, 0x70E4, 0x094B, 0x70E5, 0x70E5, 0x3B46, + 0x70E6, 0x70E6, 0x0650, 0x70E7, 0x70E7, 0x0D0E, 0x70E8, 0x70E8, 0x19D5, + 0x70E9, 0x70E9, 0x07F7, 0x70EA, 0x70EA, 0x3B47, 0x70EB, 0x70EB, 0x0E1F, + 0x70EC, 0x70EC, 0x08CE, 0x70ED, 0x70ED, 0x0CA3, 0x70EE, 0x70EE, 0x3B48, + 0x70EF, 0x70EF, 0x0F16, 0x70F0, 0x70F3, 0x3B49, 0x70F4, 0x70F4, 0x217A, + 0x70F5, 0x70F6, 0x3B4D, 0x70F7, 0x70F7, 0x0E9A, 0x70F8, 0x70F8, 0x3B4F, + 0x70F9, 0x70F9, 0x0BAC, 0x70FA, 0x70FC, 0x3B50, 0x70FD, 0x70FD, 0x0686, + 0x70FE, 0x70FF, 0x3B53, 0x7100, 0x7108, 0x3B55, 0x7109, 0x7109, 0x0FF2, + 0x710A, 0x710A, 0x076F, 0x710B, 0x710F, 0x3B5E, 0x7110, 0x7110, 0x19D7, + 0x7111, 0x7112, 0x3B63, 0x7113, 0x7113, 0x19D8, 0x7114, 0x7114, 0x3B65, + 0x7115, 0x7115, 0x07D5, 0x7116, 0x7116, 0x19D9, 0x7117, 0x7117, 0x3B66, + 0x7118, 0x7118, 0x19F0, 0x7119, 0x7119, 0x0423, 0x711A, 0x711A, 0x0676, + 0x711B, 0x7120, 0x3B67, 0x7121, 0x7121, 0x21A5, 0x7122, 0x7125, 0x3B6D, + 0x7126, 0x7126, 0x088A, 0x7127, 0x712E, 0x3B71, 0x712F, 0x712F, 0x19DA, + 0x7130, 0x7130, 0x100F, 0x7131, 0x7131, 0x19DB, 0x7132, 0x7135, 0x3B79, + 0x7136, 0x7136, 0x0C96, 0x7137, 0x7144, 0x3B7D, 0x7145, 0x7145, 0x19DF, + 0x7146, 0x7148, 0x3B8B, 0x7149, 0x7149, 0x2022, 0x714A, 0x714A, 0x19E1, + 0x714B, 0x714B, 0x3B8E, 0x714C, 0x714C, 0x07E2, 0x714D, 0x714D, 0x3B8F, + 0x714E, 0x714E, 0x0858, 0x714F, 0x7151, 0x3B90, 0x7152, 0x7152, 0x24D6, + 0x7153, 0x715B, 0x3B93, 0x715C, 0x715C, 0x19DD, 0x715D, 0x715D, 0x3B9C, + 0x715E, 0x715E, 0x0CF0, 0x715F, 0x7161, 0x3B9D, 0x7162, 0x7162, 0x233A, + 0x7163, 0x7163, 0x3BA0, 0x7164, 0x7164, 0x0ABF, 0x7165, 0x7165, 0x3BA1, + 0x7166, 0x7166, 0x19F1, 0x7167, 0x7167, 0x1176, 0x7168, 0x7168, 0x19DE, + 0x7169, 0x7169, 0x1EEE, 0x716A, 0x716B, 0x3BA2, 0x716C, 0x716C, 0x24D5, + 0x716D, 0x716D, 0x3BA4, 0x716E, 0x716E, 0x11F2, 0x716F, 0x7171, 0x3BA5, + 0x7172, 0x7172, 0x19E0, 0x7173, 0x7173, 0x19DC, 0x7174, 0x7177, 0x3BA8, + 0x7178, 0x7178, 0x19E2, 0x7179, 0x7179, 0x3BAC, 0x717A, 0x717A, 0x19E3, + 0x717B, 0x717C, 0x3BAD, 0x717D, 0x717D, 0x0CF8, 0x717E, 0x7183, 0x3BAF, + 0x7184, 0x7184, 0x0F15, 0x7185, 0x7189, 0x3BB5, 0x718A, 0x718A, 0x0FA7, + 0x718B, 0x718E, 0x3BBA, 0x718F, 0x718F, 0x0FD5, 0x7190, 0x7191, 0x3BBE, + 0x7192, 0x7192, 0x2228, 0x7193, 0x7193, 0x3BC0, 0x7194, 0x7194, 0x0CB6, + 0x7195, 0x7196, 0x3BC1, 0x7197, 0x7197, 0x24D7, 0x7198, 0x7198, 0x19E4, + 0x7199, 0x7199, 0x0F04, 0x719A, 0x719E, 0x3BC3, 0x719F, 0x719F, 0x0D83, + 0x71A0, 0x71A0, 0x19E8, 0x71A1, 0x71A7, 0x3BC8, 0x71A8, 0x71A8, 0x19E7, + 0x71A9, 0x71AB, 0x3BCF, 0x71AC, 0x71AC, 0x03C9, 0x71AD, 0x71B0, 0x3BD2, + 0x71B1, 0x71B1, 0x20FC, 0x71B2, 0x71B2, 0x3BD6, 0x71B3, 0x71B3, 0x19E5, + 0x71B4, 0x71B4, 0x3BD7, 0x71B5, 0x71B5, 0x19E6, 0x71B6, 0x71B8, 0x3BD8, + 0x71B9, 0x71B9, 0x19F2, 0x71BA, 0x71BD, 0x3BDB, 0x71BE, 0x71BE, 0x1E87, + 0x71BF, 0x71C0, 0x3BDF, 0x71C1, 0x71C1, 0x24D8, 0x71C2, 0x71C2, 0x3BE1, + 0x71C3, 0x71C3, 0x0C97, 0x71C4, 0x71C7, 0x3BE2, 0x71C8, 0x71C8, 0x1EBA, + 0x71C9, 0x71CD, 0x3BE6, 0x71CE, 0x71CE, 0x0A10, 0x71CF, 0x71D1, 0x3BEB, + 0x71D2, 0x71D2, 0x2119, 0x71D3, 0x71D3, 0x3BEE, 0x71D4, 0x71D4, 0x19EA, + 0x71D5, 0x71D5, 0x1009, 0x71D6, 0x71D8, 0x3BEF, 0x71D9, 0x71D9, 0x216C, + 0x71DA, 0x71DB, 0x3BF2, 0x71DC, 0x71DC, 0x24D9, 0x71DD, 0x71DE, 0x3BF4, + 0x71DF, 0x71DF, 0x2227, 0x71E0, 0x71E0, 0x19E9, 0x71E1, 0x71E4, 0x3BF6, + 0x71E5, 0x71E5, 0x1132, 0x71E6, 0x71E6, 0x1E5F, 0x71E7, 0x71E7, 0x19EB, + 0x71E8, 0x71EC, 0x3BFA, 0x71ED, 0x71ED, 0x229F, 0x71EE, 0x71EE, 0x1396, + 0x71EF, 0x71F3, 0x3BFF, 0x71F4, 0x71F4, 0x1F5D, 0x71F5, 0x71F8, 0x3C04, + 0x71F9, 0x71F9, 0x19EC, 0x71FA, 0x71FB, 0x3C08, 0x71FC, 0x71FC, 0x1FBC, + 0x71FD, 0x71FD, 0x3C0A, 0x71FE, 0x71FE, 0x24DA, 0x71FF, 0x71FF, 0x3C0B, + 0x7200, 0x7205, 0x3C0C, 0x7206, 0x7206, 0x0415, 0x7207, 0x720C, 0x3C12, + 0x720D, 0x720D, 0x2149, 0x720E, 0x720F, 0x3C18, 0x7210, 0x7210, 0x2046, + 0x7211, 0x721A, 0x3C1A, 0x721B, 0x721B, 0x2000, 0x721C, 0x721C, 0x3C24, + 0x721D, 0x721D, 0x19ED, 0x721E, 0x7227, 0x3C25, 0x7228, 0x7228, 0x19EE, + 0x7229, 0x7229, 0x3C2F, 0x722A, 0x722A, 0x1203, 0x722B, 0x722B, 0x3C30, + 0x722C, 0x722C, 0x0B81, 0x722D, 0x722F, 0x3C31, 0x7230, 0x7230, 0x196C, + 0x7231, 0x7231, 0x03B9, 0x7232, 0x7232, 0x2190, 0x7233, 0x7234, 0x3C34, + 0x7235, 0x7235, 0x0923, 0x7236, 0x7236, 0x06B3, 0x7237, 0x7237, 0x1036, + 0x7238, 0x7238, 0x03E1, 0x7239, 0x7239, 0x05DA, 0x723A, 0x723A, 0x2208, + 0x723B, 0x723B, 0x1269, 0x723C, 0x723C, 0x3C36, 0x723D, 0x723D, 0x0DA1, + 0x723E, 0x723E, 0x1EE6, 0x723F, 0x723F, 0x169D, 0x7240, 0x7246, 0x3C37, + 0x7247, 0x7247, 0x0BCB, 0x7248, 0x7248, 0x03F1, 0x7249, 0x724B, 0x3C3E, + 0x724C, 0x724C, 0x0B87, 0x724D, 0x724D, 0x1969, 0x724E, 0x7251, 0x3C41, + 0x7252, 0x7252, 0x196A, 0x7253, 0x7255, 0x3C45, 0x7256, 0x7256, 0x196B, + 0x7257, 0x7257, 0x3C48, 0x7258, 0x7258, 0x24C3, 0x7259, 0x7259, 0x0FE9, + 0x725A, 0x725A, 0x3C49, 0x725B, 0x725B, 0x0B64, 0x725C, 0x725C, 0x3C4A, + 0x725D, 0x725D, 0x1944, 0x725E, 0x725E, 0x3C4B, 0x725F, 0x725F, 0x0B15, + 0x7260, 0x7260, 0x3C4C, 0x7261, 0x7261, 0x0B18, 0x7262, 0x7262, 0x09B9, + 0x7263, 0x7265, 0x3C4D, 0x7266, 0x7266, 0x1945, 0x7267, 0x7267, 0x0B24, + 0x7268, 0x7268, 0x3C50, 0x7269, 0x7269, 0x0EFE, 0x726A, 0x726D, 0x3C51, + 0x726E, 0x726E, 0x1942, 0x726F, 0x726F, 0x1946, 0x7270, 0x7271, 0x3C55, + 0x7272, 0x7272, 0x0D35, 0x7273, 0x7274, 0x3C57, 0x7275, 0x7275, 0x0C20, + 0x7276, 0x7278, 0x3C59, 0x7279, 0x7279, 0x0E2B, 0x727A, 0x727A, 0x0F0D, + 0x727B, 0x727C, 0x3C5C, 0x727D, 0x727D, 0x20CC, 0x727E, 0x727F, 0x1947, + 0x7280, 0x7280, 0x0F19, 0x7281, 0x7281, 0x09D2, 0x7282, 0x7283, 0x3C5E, + 0x7284, 0x7284, 0x1949, 0x7285, 0x7289, 0x3C60, 0x728A, 0x728A, 0x05FE, + 0x728B, 0x728B, 0x194A, 0x728C, 0x728C, 0x3C65, 0x728D, 0x728D, 0x194B, + 0x728E, 0x728E, 0x3C66, 0x728F, 0x728F, 0x194C, 0x7290, 0x7291, 0x3C67, + 0x7292, 0x7292, 0x194D, 0x7293, 0x7295, 0x3C69, 0x7296, 0x7296, 0x2340, + 0x7297, 0x729E, 0x3C6C, 0x729F, 0x729F, 0x1943, 0x72A0, 0x72A1, 0x3C74, + 0x72A2, 0x72A2, 0x1ED1, 0x72A3, 0x72A6, 0x3C76, 0x72A7, 0x72A7, 0x21AC, + 0x72A8, 0x72AB, 0x3C7A, 0x72AC, 0x72AC, 0x0C89, 0x72AD, 0x72AD, 0x15EF, + 0x72AE, 0x72AE, 0x3C7E, 0x72AF, 0x72AF, 0x0655, 0x72B0, 0x72B0, 0x15F0, + 0x72B1, 0x72B3, 0x3C7F, 0x72B4, 0x72B4, 0x15F1, 0x72B5, 0x72B5, 0x3C82, + 0x72B6, 0x72B6, 0x1211, 0x72B7, 0x72B8, 0x15F2, 0x72B9, 0x72B9, 0x10B1, + 0x72BA, 0x72BF, 0x3C83, 0x72C0, 0x72C0, 0x22AF, 0x72C1, 0x72C1, 0x15F5, + 0x72C2, 0x72C2, 0x097E, 0x72C3, 0x72C3, 0x15F4, 0x72C4, 0x72C4, 0x05B3, + 0x72C5, 0x72C7, 0x3C89, 0x72C8, 0x72C8, 0x0420, 0x72C9, 0x72CC, 0x3C8C, + 0x72CD, 0x72CD, 0x15F7, 0x72CE, 0x72CE, 0x15F6, 0x72CF, 0x72CF, 0x3C90, + 0x72D0, 0x72D0, 0x07B3, 0x72D1, 0x72D1, 0x3C91, 0x72D2, 0x72D2, 0x15F8, + 0x72D3, 0x72D6, 0x3C92, 0x72D7, 0x72D7, 0x0710, 0x72D8, 0x72D8, 0x3C96, + 0x72D9, 0x72D9, 0x0900, 0x72DA, 0x72DD, 0x3C97, 0x72DE, 0x72DE, 0x0B5F, + 0x72DF, 0x72DF, 0x3C9B, 0x72E0, 0x72E0, 0x0794, 0x72E1, 0x72E1, 0x0897, + 0x72E2, 0x72E7, 0x3C9C, 0x72E8, 0x72E8, 0x15F9, 0x72E9, 0x72E9, 0x15FB, + 0x72EA, 0x72EB, 0x3CA2, 0x72EC, 0x72EC, 0x05FF, 0x72ED, 0x72ED, 0x0F2E, + 0x72EE, 0x72EE, 0x0D3F, 0x72EF, 0x72EF, 0x15FA, 0x72F0, 0x72F0, 0x1199, + 0x72F1, 0x72F1, 0x10E1, 0x72F2, 0x72F2, 0x15FC, 0x72F3, 0x72F3, 0x1600, + 0x72F4, 0x72F4, 0x15FD, 0x72F5, 0x72F6, 0x3CA4, 0x72F7, 0x72F7, 0x15FE, + 0x72F8, 0x72F8, 0x09D5, 0x72F9, 0x72F9, 0x21B6, 0x72FA, 0x72FB, 0x1602, + 0x72FC, 0x72FC, 0x09B2, 0x72FD, 0x72FD, 0x1E3D, 0x72FE, 0x72FF, 0x3CA6, + 0x7300, 0x7300, 0x3CA8, 0x7301, 0x7301, 0x15FF, 0x7302, 0x7302, 0x3CA9, + 0x7303, 0x7303, 0x1601, 0x7304, 0x7309, 0x3CAA, 0x730A, 0x730A, 0x1607, + 0x730B, 0x730D, 0x3CB0, 0x730E, 0x730E, 0x0A1D, 0x730F, 0x7312, 0x3CB3, + 0x7313, 0x7313, 0x1605, 0x7314, 0x7314, 0x3CB7, 0x7315, 0x7315, 0x160A, + 0x7316, 0x7316, 0x04C5, 0x7317, 0x7317, 0x1604, 0x7318, 0x731A, 0x3CB8, + 0x731B, 0x731B, 0x0AD2, 0x731C, 0x731C, 0x0489, 0x731D, 0x731D, 0x1609, + 0x731E, 0x731E, 0x1608, 0x731F, 0x7320, 0x3CBB, 0x7321, 0x7321, 0x1606, + 0x7322, 0x7322, 0x160B, 0x7323, 0x7324, 0x3CBD, 0x7325, 0x7325, 0x160D, + 0x7326, 0x7328, 0x3CBF, 0x7329, 0x7329, 0x0F94, 0x732A, 0x732A, 0x11EC, + 0x732B, 0x732B, 0x0AAD, 0x732C, 0x732C, 0x160E, 0x732D, 0x732D, 0x3CC2, + 0x732E, 0x732E, 0x0F44, 0x732F, 0x7330, 0x3CC3, 0x7331, 0x7331, 0x1610, + 0x7332, 0x7333, 0x3CC5, 0x7334, 0x7334, 0x07A6, 0x7335, 0x7335, 0x3CC7, + 0x7336, 0x7336, 0x2235, 0x7337, 0x7337, 0x18D4, 0x7338, 0x7338, 0x160F, + 0x7339, 0x7339, 0x160C, 0x733A, 0x733A, 0x3CC8, 0x733B, 0x733B, 0x2397, + 0x733C, 0x733D, 0x3CC9, 0x733E, 0x733E, 0x07C0, 0x733F, 0x733F, 0x10F6, + 0x7340, 0x7340, 0x3CCB, 0x7341, 0x7341, 0x2395, 0x7342, 0x7343, 0x3CCC, + 0x7344, 0x7344, 0x223F, 0x7345, 0x7345, 0x212A, 0x7346, 0x734C, 0x3CCE, + 0x734D, 0x734D, 0x1612, 0x734E, 0x734F, 0x3CD5, 0x7350, 0x7350, 0x1611, + 0x7351, 0x7351, 0x3CD7, 0x7352, 0x7352, 0x18D5, 0x7353, 0x7356, 0x3CD8, + 0x7357, 0x7357, 0x1613, 0x7358, 0x735F, 0x3CDC, 0x7360, 0x7360, 0x1614, + 0x7361, 0x7367, 0x3CE4, 0x7368, 0x7368, 0x1ED2, 0x7369, 0x7369, 0x3CEB, + 0x736A, 0x736A, 0x2396, 0x736B, 0x736B, 0x2398, 0x736C, 0x736C, 0x1615, + 0x736D, 0x736D, 0x0DF4, 0x736E, 0x736E, 0x3CEC, 0x736F, 0x736F, 0x1616, + 0x7370, 0x7370, 0x20A2, 0x7371, 0x7371, 0x3CED, 0x7372, 0x7372, 0x1F64, + 0x7373, 0x7374, 0x3CEE, 0x7375, 0x7375, 0x202B, 0x7376, 0x7376, 0x3CF0, + 0x7377, 0x7377, 0x2394, 0x7378, 0x7378, 0x2139, 0x7379, 0x7379, 0x3CF1, + 0x737A, 0x737A, 0x215F, 0x737B, 0x737B, 0x21C1, 0x737C, 0x737C, 0x239A, + 0x737D, 0x737D, 0x3CF2, 0x737E, 0x737E, 0x1617, 0x737F, 0x737F, 0x3CF3, + 0x7380, 0x7380, 0x2399, 0x7381, 0x7383, 0x3CF4, 0x7384, 0x7384, 0x0FC9, + 0x7385, 0x7386, 0x3CF7, 0x7387, 0x7387, 0x0A71, 0x7388, 0x7388, 0x3CF9, + 0x7389, 0x7389, 0x10D6, 0x738A, 0x738A, 0x3CFA, 0x738B, 0x738B, 0x0EA6, + 0x738C, 0x738D, 0x3CFB, 0x738E, 0x738E, 0x1818, 0x738F, 0x7390, 0x3CFD, + 0x7391, 0x7391, 0x1819, 0x7392, 0x7395, 0x3CFF, 0x7396, 0x7396, 0x08F0, + 0x7397, 0x739A, 0x3D03, 0x739B, 0x739B, 0x0A91, 0x739C, 0x739E, 0x3D07, + 0x739F, 0x739F, 0x181C, 0x73A0, 0x73A1, 0x3D0A, 0x73A2, 0x73A2, 0x181B, + 0x73A3, 0x73A8, 0x3D0C, 0x73A9, 0x73A9, 0x0E97, 0x73AA, 0x73AA, 0x3D12, + 0x73AB, 0x73AB, 0x0ABA, 0x73AC, 0x73AD, 0x3D13, 0x73AE, 0x73AE, 0x181A, + 0x73AF, 0x73AF, 0x07CC, 0x73B0, 0x73B0, 0x0F43, 0x73B1, 0x73B1, 0x3D15, + 0x73B2, 0x73B2, 0x0A2A, 0x73B3, 0x73B3, 0x1821, 0x73B4, 0x73B6, 0x3D16, + 0x73B7, 0x73B7, 0x1820, 0x73B8, 0x73B9, 0x3D19, 0x73BA, 0x73BA, 0x182C, + 0x73BB, 0x73BB, 0x046A, 0x73BC, 0x73BF, 0x3D1B, 0x73C0, 0x73C0, 0x1822, + 0x73C1, 0x73C1, 0x3D1F, 0x73C2, 0x73C2, 0x181E, 0x73C3, 0x73C7, 0x3D20, + 0x73C8, 0x73C8, 0x1824, 0x73C9, 0x73C9, 0x1823, 0x73CA, 0x73CA, 0x0CF3, + 0x73CB, 0x73CC, 0x3D25, 0x73CD, 0x73CD, 0x1185, 0x73CE, 0x73CE, 0x3D27, + 0x73CF, 0x73CF, 0x181D, 0x73D0, 0x73D0, 0x0646, 0x73D1, 0x73D1, 0x181F, + 0x73D2, 0x73D8, 0x3D28, 0x73D9, 0x73D9, 0x1826, 0x73DA, 0x73DD, 0x3D2F, + 0x73DE, 0x73DE, 0x182B, 0x73DF, 0x73DF, 0x3D33, 0x73E0, 0x73E0, 0x11E8, + 0x73E1, 0x73E4, 0x3D34, 0x73E5, 0x73E5, 0x1825, 0x73E6, 0x73E6, 0x3D38, + 0x73E7, 0x73E7, 0x182A, 0x73E8, 0x73E8, 0x3D39, 0x73E9, 0x73E9, 0x1829, + 0x73EA, 0x73EC, 0x3D3A, 0x73ED, 0x73ED, 0x03EB, 0x73EE, 0x73F1, 0x3D3D, + 0x73F2, 0x73F2, 0x182D, 0x73F3, 0x73FD, 0x3D41, 0x73FE, 0x73FE, 0x21C0, + 0x73FF, 0x73FF, 0x3D4C, 0x7400, 0x7402, 0x3D4D, 0x7403, 0x7403, 0x0C6F, + 0x7404, 0x7404, 0x3D50, 0x7405, 0x7405, 0x09B0, 0x7406, 0x7406, 0x09D8, + 0x7407, 0x7408, 0x3D51, 0x7409, 0x7409, 0x0A39, 0x740A, 0x740A, 0x1828, + 0x740B, 0x740E, 0x3D53, 0x740F, 0x740F, 0x182E, 0x7410, 0x7410, 0x0DEB, + 0x7411, 0x7419, 0x3D57, 0x741A, 0x741A, 0x1838, 0x741B, 0x741B, 0x1837, + 0x741C, 0x7421, 0x3D60, 0x7422, 0x7422, 0x121E, 0x7423, 0x7424, 0x3D66, + 0x7425, 0x7425, 0x1832, 0x7426, 0x7426, 0x1831, 0x7427, 0x7427, 0x3D68, + 0x7428, 0x7428, 0x1833, 0x7429, 0x7429, 0x3D69, 0x742A, 0x742A, 0x182F, + 0x742B, 0x742B, 0x3D6A, 0x742C, 0x742C, 0x1836, 0x742D, 0x742D, 0x3D6B, + 0x742E, 0x742E, 0x1835, 0x742F, 0x742F, 0x3D6C, 0x7430, 0x7430, 0x1834, + 0x7431, 0x7432, 0x3D6D, 0x7433, 0x7433, 0x0A1E, 0x7434, 0x7434, 0x0C56, + 0x7435, 0x7435, 0x0BBE, 0x7436, 0x7436, 0x0B84, 0x7437, 0x743B, 0x3D6F, + 0x743C, 0x743C, 0x0C6A, 0x743D, 0x743E, 0x3D74, 0x743F, 0x743F, 0x2460, + 0x7440, 0x7440, 0x3D76, 0x7441, 0x7441, 0x1839, 0x7442, 0x744A, 0x3D77, + 0x744B, 0x744B, 0x245C, 0x744C, 0x7454, 0x3D80, 0x7455, 0x7455, 0x183C, + 0x7456, 0x7456, 0x3D89, 0x7457, 0x7457, 0x183B, 0x7458, 0x7458, 0x3D8A, + 0x7459, 0x7459, 0x183D, 0x745A, 0x745A, 0x07AE, 0x745B, 0x745B, 0x1830, + 0x745C, 0x745C, 0x183A, 0x745D, 0x745D, 0x3D8B, 0x745E, 0x745E, 0x0CCB, + 0x745F, 0x745F, 0x0CE3, 0x7460, 0x7462, 0x3D8C, 0x7463, 0x7463, 0x215D, + 0x7464, 0x7468, 0x3D8F, 0x7469, 0x7469, 0x2225, 0x746A, 0x746A, 0x206A, + 0x746B, 0x746C, 0x3D94, 0x746D, 0x746D, 0x183F, 0x746E, 0x746F, 0x3D96, + 0x7470, 0x7470, 0x073E, 0x7471, 0x7475, 0x3D98, 0x7476, 0x7476, 0x1027, + 0x7477, 0x7477, 0x183E, 0x7478, 0x747D, 0x3D9D, 0x747E, 0x747E, 0x1840, + 0x747F, 0x747F, 0x3DA3, 0x7480, 0x7481, 0x1843, 0x7482, 0x7482, 0x3DA4, + 0x7483, 0x7483, 0x09F0, 0x7484, 0x7486, 0x3DA5, 0x7487, 0x7487, 0x1845, + 0x7488, 0x7488, 0x3DA8, 0x7489, 0x7489, 0x2461, 0x748A, 0x748A, 0x3DA9, + 0x748B, 0x748B, 0x1846, 0x748C, 0x748D, 0x3DAA, 0x748E, 0x748E, 0x1842, + 0x748F, 0x748F, 0x3DAC, 0x7490, 0x7490, 0x184A, 0x7491, 0x749B, 0x3DAD, + 0x749C, 0x749C, 0x1841, 0x749D, 0x749D, 0x3DB8, 0x749E, 0x749E, 0x1847, + 0x749F, 0x74A2, 0x3DB9, 0x74A3, 0x74A3, 0x245B, 0x74A4, 0x74A5, 0x3DBD, + 0x74A6, 0x74A6, 0x2462, 0x74A7, 0x74A7, 0x184B, 0x74A8, 0x74A9, 0x1848, + 0x74AA, 0x74AF, 0x3DBF, 0x74B0, 0x74B0, 0x1F54, 0x74B1, 0x74B9, 0x3DC5, + 0x74BA, 0x74BA, 0x184D, 0x74BB, 0x74BC, 0x3DCE, 0x74BD, 0x74BD, 0x245F, + 0x74BE, 0x74C9, 0x3DD0, 0x74CA, 0x74CA, 0x20EC, 0x74CB, 0x74CE, 0x3DDC, + 0x74CF, 0x74CF, 0x245D, 0x74D0, 0x74D1, 0x3DE0, 0x74D2, 0x74D2, 0x184C, + 0x74D3, 0x74D3, 0x3DE2, 0x74D4, 0x74D4, 0x2463, 0x74D5, 0x74D9, 0x3DE3, + 0x74DA, 0x74DA, 0x2464, 0x74DB, 0x74DB, 0x3DE8, 0x74DC, 0x74DC, 0x0728, + 0x74DD, 0x74DD, 0x3DE9, 0x74DE, 0x74DE, 0x1B32, 0x74DF, 0x74DF, 0x3DEA, + 0x74E0, 0x74E0, 0x1B33, 0x74E1, 0x74E1, 0x3DEB, 0x74E2, 0x74E2, 0x0BCF, + 0x74E3, 0x74E3, 0x03F5, 0x74E4, 0x74E4, 0x0C9A, 0x74E5, 0x74E5, 0x3DEC, + 0x74E6, 0x74E6, 0x0E90, 0x74E7, 0x74ED, 0x3DED, 0x74EE, 0x74EE, 0x0EDC, + 0x74EF, 0x74EF, 0x1903, 0x74F0, 0x74F3, 0x3DF4, 0x74F4, 0x74F4, 0x1904, + 0x74F5, 0x74F5, 0x3DF8, 0x74F6, 0x74F6, 0x0BDE, 0x74F7, 0x74F7, 0x054C, + 0x74F8, 0x74FE, 0x3DF9, 0x74FF, 0x74FF, 0x1905, 0x7500, 0x7503, 0x3E00, + 0x7504, 0x7504, 0x1188, 0x7505, 0x750B, 0x3E04, 0x750C, 0x750C, 0x24A5, + 0x750D, 0x750D, 0x1485, 0x750E, 0x750E, 0x3E0B, 0x750F, 0x750F, 0x1906, + 0x7510, 0x7510, 0x3E0C, 0x7511, 0x7511, 0x1907, 0x7512, 0x7512, 0x3E0D, + 0x7513, 0x7513, 0x1908, 0x7514, 0x7517, 0x3E0E, 0x7518, 0x7518, 0x06C5, + 0x7519, 0x7519, 0x14F8, 0x751A, 0x751A, 0x0D2E, 0x751B, 0x751B, 0x3E12, + 0x751C, 0x751C, 0x0E43, 0x751D, 0x751E, 0x3E13, 0x751F, 0x751F, 0x0D33, + 0x7520, 0x7522, 0x3E15, 0x7523, 0x7523, 0x1E70, 0x7524, 0x7524, 0x3E18, + 0x7525, 0x7525, 0x0D34, 0x7526, 0x7527, 0x3E19, 0x7528, 0x7528, 0x10A8, + 0x7529, 0x7529, 0x0D9B, 0x752A, 0x752A, 0x3E1B, 0x752B, 0x752B, 0x06A1, + 0x752C, 0x752C, 0x1B34, 0x752D, 0x752D, 0x042B, 0x752E, 0x752E, 0x3E1C, + 0x752F, 0x752F, 0x1734, 0x7530, 0x7530, 0x0E42, 0x7531, 0x7531, 0x10AE, + 0x7532, 0x7532, 0x084A, 0x7533, 0x7533, 0x0D23, 0x7534, 0x7534, 0x3E1D, + 0x7535, 0x7535, 0x05C8, 0x7536, 0x7536, 0x3E1E, 0x7537, 0x7537, 0x0B33, + 0x7538, 0x7538, 0x05CA, 0x7539, 0x7539, 0x3E1F, 0x753A, 0x753A, 0x1A78, + 0x753B, 0x753B, 0x07C2, 0x753C, 0x753D, 0x3E20, 0x753E, 0x753E, 0x1816, + 0x753F, 0x753F, 0x3E22, 0x7540, 0x7540, 0x1A79, 0x7541, 0x7544, 0x3E23, + 0x7545, 0x7545, 0x04CE, 0x7546, 0x7547, 0x3E27, 0x7548, 0x7548, 0x1A7C, + 0x7549, 0x754A, 0x3E29, 0x754B, 0x754B, 0x1A7B, 0x754C, 0x754C, 0x08B8, + 0x754D, 0x754D, 0x3E2B, 0x754E, 0x754E, 0x1A7A, 0x754F, 0x754F, 0x0EC6, + 0x7550, 0x7553, 0x3E2C, 0x7554, 0x7554, 0x0B90, 0x7555, 0x7558, 0x3E30, + 0x7559, 0x7559, 0x0A3D, 0x755A, 0x755A, 0x139E, 0x755B, 0x755B, 0x1A7D, + 0x755C, 0x755C, 0x0FBE, 0x755D, 0x755D, 0x208F, 0x755E, 0x7561, 0x3E34, + 0x7562, 0x7562, 0x1E42, 0x7563, 0x7564, 0x3E38, 0x7565, 0x7565, 0x0A7B, + 0x7566, 0x7566, 0x0C07, 0x7567, 0x7569, 0x3E3A, 0x756A, 0x756A, 0x0649, + 0x756B, 0x756B, 0x1F4E, 0x756C, 0x7571, 0x3E3D, 0x7572, 0x7572, 0x1A7E, + 0x7573, 0x7573, 0x3E43, 0x7574, 0x7574, 0x0510, 0x7575, 0x7575, 0x3E44, + 0x7576, 0x7576, 0x1EB1, 0x7577, 0x7577, 0x3E45, 0x7578, 0x7578, 0x0810, + 0x7579, 0x7579, 0x1A7F, 0x757A, 0x757E, 0x3E46, 0x757F, 0x757F, 0x1814, + 0x7580, 0x7582, 0x3E4B, 0x7583, 0x7583, 0x1A80, 0x7584, 0x7585, 0x3E4E, + 0x7586, 0x7586, 0x087F, 0x7587, 0x7587, 0x1E8B, 0x7588, 0x758A, 0x3E50, + 0x758B, 0x758B, 0x1BC6, 0x758C, 0x758E, 0x3E53, 0x758F, 0x758F, 0x0D7F, + 0x7590, 0x7590, 0x3E56, 0x7591, 0x7591, 0x1050, 0x7592, 0x7592, 0x1B60, + 0x7593, 0x7593, 0x3E57, 0x7594, 0x7594, 0x1B61, 0x7595, 0x7595, 0x3E58, + 0x7596, 0x7596, 0x1B62, 0x7597, 0x7597, 0x0A0F, 0x7598, 0x7598, 0x3E59, + 0x7599, 0x7599, 0x06E8, 0x759A, 0x759A, 0x08FD, 0x759B, 0x759C, 0x3E5A, + 0x759D, 0x759D, 0x1B64, 0x759E, 0x759E, 0x3E5C, 0x759F, 0x759F, 0x0B72, + 0x75A0, 0x75A0, 0x1B63, 0x75A1, 0x75A1, 0x101A, 0x75A2, 0x75A2, 0x3E5D, + 0x75A3, 0x75A3, 0x1B66, 0x75A4, 0x75A4, 0x03D7, 0x75A5, 0x75A5, 0x08BB, + 0x75A6, 0x75AA, 0x3E5E, 0x75AB, 0x75AB, 0x1066, 0x75AC, 0x75AC, 0x1B65, + 0x75AD, 0x75AD, 0x3E63, 0x75AE, 0x75AE, 0x0532, 0x75AF, 0x75AF, 0x0685, + 0x75B0, 0x75B0, 0x1B6C, 0x75B1, 0x75B1, 0x1B6B, 0x75B2, 0x75B2, 0x0BC2, + 0x75B3, 0x75B4, 0x1B67, 0x75B5, 0x75B5, 0x0546, 0x75B6, 0x75B7, 0x3E64, + 0x75B8, 0x75B8, 0x1B69, 0x75B9, 0x75B9, 0x118F, 0x75BA, 0x75BB, 0x3E66, + 0x75BC, 0x75BC, 0x0E2E, 0x75BD, 0x75BD, 0x0901, 0x75BE, 0x75BE, 0x0825, + 0x75BF, 0x75C1, 0x3E68, 0x75C2, 0x75C2, 0x1B6E, 0x75C3, 0x75C3, 0x1B6D, + 0x75C4, 0x75C4, 0x1B6A, 0x75C5, 0x75C5, 0x0468, 0x75C6, 0x75C6, 0x3E6B, + 0x75C7, 0x75C7, 0x11A1, 0x75C8, 0x75C8, 0x109D, 0x75C9, 0x75C9, 0x08E6, + 0x75CA, 0x75CA, 0x0C87, 0x75CB, 0x75CC, 0x3E6C, 0x75CD, 0x75CD, 0x1B70, + 0x75CE, 0x75D1, 0x3E6E, 0x75D2, 0x75D2, 0x1020, 0x75D3, 0x75D3, 0x3E72, + 0x75D4, 0x75D4, 0x11CB, 0x75D5, 0x75D5, 0x0792, 0x75D6, 0x75D6, 0x1B6F, + 0x75D7, 0x75D7, 0x3E73, 0x75D8, 0x75D8, 0x05FA, 0x75D9, 0x75D9, 0x1FC6, + 0x75DA, 0x75DA, 0x3E74, 0x75DB, 0x75DB, 0x0E65, 0x75DC, 0x75DD, 0x3E75, + 0x75DE, 0x75DE, 0x0BC5, 0x75DF, 0x75E1, 0x3E77, 0x75E2, 0x75E2, 0x09EA, + 0x75E3, 0x75E3, 0x1B71, 0x75E4, 0x75E4, 0x1B74, 0x75E5, 0x75E5, 0x3E7A, + 0x75E6, 0x75E6, 0x1B73, 0x75E7, 0x75E7, 0x1B76, 0x75E8, 0x75E8, 0x1B72, + 0x75E9, 0x75E9, 0x3E7B, 0x75EA, 0x75EA, 0x07D3, 0x75EB, 0x75EB, 0x1B75, + 0x75EC, 0x75EF, 0x3E7C, 0x75F0, 0x75F0, 0x0E08, 0x75F1, 0x75F1, 0x1B78, + 0x75F2, 0x75F3, 0x3E80, 0x75F4, 0x75F4, 0x04FA, 0x75F5, 0x75F8, 0x3E82, + 0x75F9, 0x75F9, 0x043D, 0x75FA, 0x75FB, 0x3E86, 0x75FC, 0x75FC, 0x1B79, + 0x75FD, 0x75FE, 0x3E88, 0x75FF, 0x75FF, 0x1B7A, 0x7600, 0x7600, 0x1B7C, + 0x7601, 0x7601, 0x0564, 0x7602, 0x7602, 0x25AE, 0x7603, 0x7603, 0x1B77, + 0x7604, 0x7604, 0x3E8A, 0x7605, 0x7605, 0x1B7D, 0x7606, 0x7609, 0x3E8B, + 0x760A, 0x760A, 0x1B80, 0x760B, 0x760B, 0x1F01, 0x760C, 0x760C, 0x1B7E, + 0x760D, 0x760D, 0x2200, 0x760E, 0x760F, 0x3E8F, 0x7610, 0x7610, 0x1B7B, + 0x7611, 0x7614, 0x3E91, 0x7615, 0x7615, 0x1B83, 0x7616, 0x7616, 0x3E95, + 0x7617, 0x7617, 0x1B7F, 0x7618, 0x7618, 0x1B82, 0x7619, 0x7619, 0x1B84, + 0x761A, 0x761A, 0x3E96, 0x761B, 0x761B, 0x1B85, 0x761C, 0x761D, 0x3E97, + 0x761E, 0x761E, 0x25B2, 0x761F, 0x761F, 0x0ED0, 0x7620, 0x7620, 0x1B88, + 0x7621, 0x7621, 0x1E97, 0x7622, 0x7622, 0x1B87, 0x7623, 0x7623, 0x3E99, + 0x7624, 0x7624, 0x0A3F, 0x7625, 0x7625, 0x1B81, 0x7626, 0x7626, 0x0D74, + 0x7627, 0x7627, 0x20AB, 0x7628, 0x7628, 0x3E9A, 0x7629, 0x7629, 0x0574, + 0x762A, 0x762A, 0x045A, 0x762B, 0x762B, 0x0E04, 0x762C, 0x762C, 0x3E9B, + 0x762D, 0x762D, 0x1B8A, 0x762E, 0x762F, 0x3E9C, 0x7630, 0x7630, 0x1B8B, + 0x7631, 0x7632, 0x3E9E, 0x7633, 0x7633, 0x1B90, 0x7634, 0x7634, 0x116F, + 0x7635, 0x7635, 0x1B8D, 0x7636, 0x7637, 0x3EA0, 0x7638, 0x7638, 0x0C8E, + 0x7639, 0x763A, 0x3EA2, 0x763B, 0x763B, 0x25B3, 0x763C, 0x763C, 0x1B86, + 0x763D, 0x763D, 0x3EA4, 0x763E, 0x763E, 0x1B8F, 0x763F, 0x763F, 0x1B8C, + 0x7640, 0x7640, 0x1B89, 0x7641, 0x7641, 0x3EA5, 0x7642, 0x7642, 0x2028, + 0x7643, 0x7643, 0x1B8E, 0x7644, 0x7645, 0x3EA6, 0x7646, 0x7647, 0x25AF, + 0x7648, 0x7648, 0x3EA8, 0x7649, 0x7649, 0x25B1, 0x764A, 0x764B, 0x3EA9, + 0x764C, 0x764C, 0x03B4, 0x764D, 0x764D, 0x1B91, 0x764E, 0x7653, 0x3EAB, + 0x7654, 0x7654, 0x1B93, 0x7655, 0x7655, 0x3EB1, 0x7656, 0x7656, 0x1B95, + 0x7657, 0x7657, 0x3EB2, 0x7658, 0x7658, 0x25AC, 0x7659, 0x765B, 0x3EB3, + 0x765C, 0x765C, 0x1B94, 0x765D, 0x765D, 0x3EB6, 0x765E, 0x765E, 0x1B92, + 0x765F, 0x765F, 0x1E4E, 0x7660, 0x7661, 0x3EB7, 0x7662, 0x7662, 0x2202, + 0x7663, 0x7663, 0x0FCB, 0x7664, 0x7664, 0x25AB, 0x7665, 0x7665, 0x2286, + 0x7666, 0x7666, 0x3EB9, 0x7667, 0x7667, 0x25AD, 0x7668, 0x7668, 0x3EBA, + 0x7669, 0x7669, 0x25B6, 0x766A, 0x766A, 0x3EBB, 0x766B, 0x766B, 0x1B96, + 0x766C, 0x766C, 0x21E3, 0x766D, 0x766E, 0x25B4, 0x766F, 0x766F, 0x1B97, + 0x7670, 0x7670, 0x222F, 0x7671, 0x7671, 0x2165, 0x7672, 0x7672, 0x25B7, + 0x7673, 0x7677, 0x3EBC, 0x7678, 0x7678, 0x0748, 0x7679, 0x767A, 0x3EC1, + 0x767B, 0x767B, 0x05A8, 0x767C, 0x767C, 0x1EE9, 0x767D, 0x767D, 0x03E2, + 0x767E, 0x767E, 0x03E4, 0x767F, 0x7681, 0x3EC3, 0x7682, 0x7682, 0x1130, + 0x7683, 0x7683, 0x3EC6, 0x7684, 0x7684, 0x05A5, 0x7685, 0x7685, 0x3EC7, + 0x7686, 0x7686, 0x08A5, 0x7687, 0x7687, 0x07DF, 0x7688, 0x7688, 0x1B2D, + 0x7689, 0x768A, 0x3EC8, 0x768B, 0x768B, 0x06D9, 0x768C, 0x768D, 0x3ECA, + 0x768E, 0x768E, 0x1B2E, 0x768F, 0x7690, 0x3ECC, 0x7691, 0x7691, 0x03B3, + 0x7692, 0x7692, 0x3ECE, 0x7693, 0x7693, 0x1B2F, 0x7694, 0x7695, 0x3ECF, + 0x7696, 0x7696, 0x0E9F, 0x7697, 0x7698, 0x3ED1, 0x7699, 0x7699, 0x1B30, + 0x769A, 0x769A, 0x1E25, 0x769B, 0x76A3, 0x3ED3, 0x76A4, 0x76A4, 0x1B31, + 0x76A5, 0x76AD, 0x3EDC, 0x76AE, 0x76AE, 0x0BC3, 0x76AF, 0x76B0, 0x3EE5, + 0x76B1, 0x76B1, 0x11E4, 0x76B2, 0x76B2, 0x1BC8, 0x76B3, 0x76B3, 0x3EE7, + 0x76B4, 0x76B4, 0x1BC9, 0x76B5, 0x76B7, 0x3EE8, 0x76B8, 0x76B8, 0x25C0, + 0x76B9, 0x76B9, 0x3EEB, 0x76BA, 0x76BA, 0x229A, 0x76BB, 0x76BE, 0x3EEC, + 0x76BF, 0x76BF, 0x0AF8, 0x76C0, 0x76C1, 0x3EF0, 0x76C2, 0x76C2, 0x10C0, + 0x76C3, 0x76C4, 0x3EF2, 0x76C5, 0x76C5, 0x11D0, 0x76C6, 0x76C6, 0x0BA9, + 0x76C7, 0x76C7, 0x3EF4, 0x76C8, 0x76C8, 0x1094, 0x76C9, 0x76C9, 0x3EF5, + 0x76CA, 0x76CA, 0x106D, 0x76CB, 0x76CC, 0x3EF6, 0x76CD, 0x76CD, 0x1A8B, + 0x76CE, 0x76CE, 0x03C6, 0x76CF, 0x76CF, 0x1156, 0x76D0, 0x76D0, 0x0FF7, + 0x76D1, 0x76D1, 0x0853, 0x76D2, 0x76D2, 0x0787, 0x76D3, 0x76D3, 0x3EF8, + 0x76D4, 0x76D4, 0x0985, 0x76D5, 0x76D5, 0x3EF9, 0x76D6, 0x76D6, 0x06C2, + 0x76D7, 0x76D7, 0x05A2, 0x76D8, 0x76D8, 0x0B8D, 0x76D9, 0x76DA, 0x3EFA, + 0x76DB, 0x76DB, 0x0D39, 0x76DC, 0x76DD, 0x3EFC, 0x76DE, 0x76DE, 0x226E, + 0x76DF, 0x76DF, 0x0AD0, 0x76E0, 0x76E0, 0x3EFE, 0x76E1, 0x76E1, 0x1FBD, + 0x76E2, 0x76E2, 0x3EFF, 0x76E3, 0x76E3, 0x1F84, 0x76E4, 0x76E4, 0x20B2, + 0x76E5, 0x76E5, 0x1A8C, 0x76E6, 0x76E6, 0x3F00, 0x76E7, 0x76E7, 0x2043, + 0x76E8, 0x76ED, 0x3F01, 0x76EE, 0x76EE, 0x0B22, 0x76EF, 0x76EF, 0x05E1, + 0x76F0, 0x76F0, 0x3F07, 0x76F1, 0x76F1, 0x1A58, 0x76F2, 0x76F2, 0x0AA9, + 0x76F3, 0x76F3, 0x3F08, 0x76F4, 0x76F4, 0x11B0, 0x76F5, 0x76F7, 0x3F09, + 0x76F8, 0x76F8, 0x0F4D, 0x76F9, 0x76F9, 0x1A5B, 0x76FA, 0x76FB, 0x3F0C, + 0x76FC, 0x76FC, 0x0B8F, 0x76FD, 0x76FD, 0x3F0E, 0x76FE, 0x76FE, 0x061B, + 0x76FF, 0x76FF, 0x3F0F, 0x7700, 0x7700, 0x3F10, 0x7701, 0x7701, 0x0D38, + 0x7702, 0x7703, 0x3F11, 0x7704, 0x7704, 0x1A59, 0x7705, 0x7706, 0x3F13, + 0x7707, 0x7708, 0x1A5C, 0x7709, 0x7709, 0x0AC1, 0x770A, 0x770A, 0x3F15, + 0x770B, 0x770B, 0x0941, 0x770C, 0x770C, 0x3F16, 0x770D, 0x770D, 0x1A5A, + 0x770E, 0x7718, 0x3F17, 0x7719, 0x7719, 0x1A60, 0x771A, 0x771A, 0x1A5E, + 0x771B, 0x771E, 0x3F22, 0x771F, 0x771F, 0x1187, 0x7720, 0x7720, 0x0AE4, + 0x7721, 0x7721, 0x3F26, 0x7722, 0x7722, 0x1A5F, 0x7723, 0x7725, 0x3F27, + 0x7726, 0x7726, 0x1A62, 0x7727, 0x7727, 0x3F2A, 0x7728, 0x7728, 0x1144, + 0x7729, 0x7729, 0x0FCC, 0x772A, 0x772C, 0x3F2B, 0x772D, 0x772D, 0x1A61, + 0x772E, 0x772E, 0x3F2E, 0x772F, 0x772F, 0x0AD5, 0x7730, 0x7734, 0x3F2F, + 0x7735, 0x7735, 0x1A63, 0x7736, 0x7736, 0x0981, 0x7737, 0x7737, 0x091B, + 0x7738, 0x7738, 0x1A64, 0x7739, 0x7739, 0x3F34, 0x773A, 0x773A, 0x0E4A, + 0x773B, 0x773B, 0x3F35, 0x773C, 0x773C, 0x1004, 0x773D, 0x773F, 0x3F36, + 0x7740, 0x7740, 0x1222, 0x7741, 0x7741, 0x1197, 0x7742, 0x7742, 0x3F39, + 0x7743, 0x7743, 0x1A68, 0x7744, 0x7746, 0x3F3A, 0x7747, 0x7747, 0x1A67, + 0x7748, 0x774E, 0x3F3D, 0x774F, 0x774F, 0x2684, 0x7750, 0x7751, 0x1A65, + 0x7752, 0x7759, 0x3F44, 0x775A, 0x775A, 0x1A69, 0x775B, 0x775B, 0x08D5, + 0x775C, 0x775D, 0x3F4C, 0x775E, 0x775E, 0x24EF, 0x775F, 0x7760, 0x3F4E, + 0x7761, 0x7761, 0x0DA4, 0x7762, 0x7762, 0x1A6B, 0x7763, 0x7763, 0x05FC, + 0x7764, 0x7764, 0x3F50, 0x7765, 0x7765, 0x1A6C, 0x7766, 0x7766, 0x0B23, + 0x7767, 0x7767, 0x3F51, 0x7768, 0x7768, 0x1A6A, 0x7769, 0x776A, 0x3F52, + 0x776B, 0x776B, 0x08AF, 0x776C, 0x776C, 0x048E, 0x776D, 0x7778, 0x3F54, + 0x7779, 0x7779, 0x0602, 0x777A, 0x777C, 0x3F60, 0x777D, 0x777D, 0x1A6F, + 0x777E, 0x777E, 0x1270, 0x777F, 0x777F, 0x1A6D, 0x7780, 0x7780, 0x1A70, + 0x7781, 0x7783, 0x3F63, 0x7784, 0x7784, 0x0AEE, 0x7785, 0x7785, 0x0517, + 0x7786, 0x778B, 0x3F66, 0x778C, 0x778C, 0x1A71, 0x778D, 0x778D, 0x1A6E, + 0x778E, 0x778E, 0x0F26, 0x778F, 0x7790, 0x3F6C, 0x7791, 0x7791, 0x1A72, + 0x7792, 0x7792, 0x0A9E, 0x7793, 0x7797, 0x3F6E, 0x7798, 0x7798, 0x24EE, + 0x7799, 0x779D, 0x3F73, 0x779E, 0x779E, 0x2074, 0x779F, 0x77A0, 0x1A73, + 0x77A1, 0x77A1, 0x3F78, 0x77A2, 0x77A2, 0x1495, 0x77A3, 0x77A4, 0x3F79, + 0x77A5, 0x77A5, 0x0BD2, 0x77A6, 0x77A6, 0x3F7B, 0x77A7, 0x77A7, 0x0C43, + 0x77A8, 0x77A8, 0x3F7C, 0x77A9, 0x77A9, 0x11F4, 0x77AA, 0x77AA, 0x05AA, + 0x77AB, 0x77AB, 0x3F7D, 0x77AC, 0x77AC, 0x0DA7, 0x77AD, 0x77AD, 0x2687, + 0x77AE, 0x77AF, 0x3F7E, 0x77B0, 0x77B0, 0x1A75, 0x77B1, 0x77B2, 0x3F80, + 0x77B3, 0x77B3, 0x0E5C, 0x77B4, 0x77B4, 0x3F82, 0x77B5, 0x77B5, 0x1A76, + 0x77B6, 0x77BA, 0x3F83, 0x77BB, 0x77BB, 0x1151, 0x77BC, 0x77BC, 0x24F0, + 0x77BD, 0x77BD, 0x1A77, 0x77BE, 0x77BE, 0x3F88, 0x77BF, 0x77BF, 0x1D7E, + 0x77C0, 0x77C6, 0x3F89, 0x77C7, 0x77C7, 0x268D, 0x77C8, 0x77CC, 0x3F90, + 0x77CD, 0x77CD, 0x1397, 0x77CE, 0x77D6, 0x3F95, 0x77D7, 0x77D7, 0x0526, + 0x77D8, 0x77D9, 0x3F9E, 0x77DA, 0x77DA, 0x22A0, 0x77DB, 0x77DB, 0x0AB1, + 0x77DC, 0x77DC, 0x1BCA, 0x77DD, 0x77E1, 0x3FA0, 0x77E2, 0x77E2, 0x0D4F, + 0x77E3, 0x77E3, 0x105A, 0x77E4, 0x77E4, 0x3FA5, 0x77E5, 0x77E5, 0x11A9, + 0x77E6, 0x77E6, 0x3FA6, 0x77E7, 0x77E7, 0x1B1A, 0x77E8, 0x77E8, 0x3FA7, + 0x77E9, 0x77E9, 0x0907, 0x77EA, 0x77EA, 0x3FA8, 0x77EB, 0x77EB, 0x0894, + 0x77EC, 0x77EC, 0x1B1B, 0x77ED, 0x77ED, 0x060B, 0x77EE, 0x77EE, 0x03B6, + 0x77EF, 0x77EF, 0x1FAB, 0x77F0, 0x77F2, 0x3FA9, 0x77F3, 0x77F3, 0x0D46, + 0x77F4, 0x77F5, 0x3FAC, 0x77F6, 0x77F6, 0x1A22, 0x77F7, 0x77F7, 0x3FAE, + 0x77F8, 0x77F8, 0x1A23, 0x77F9, 0x77FC, 0x3FAF, 0x77FD, 0x77FD, 0x0F08, + 0x77FE, 0x77FE, 0x064C, 0x77FF, 0x77FF, 0x0980, 0x7800, 0x7800, 0x1A24, + 0x7801, 0x7801, 0x0A92, 0x7802, 0x7802, 0x0CE9, 0x7803, 0x7808, 0x3FB3, + 0x7809, 0x7809, 0x1A25, 0x780A, 0x780B, 0x3FB9, 0x780C, 0x780C, 0x0C15, + 0x780D, 0x780D, 0x0940, 0x780E, 0x7810, 0x3FBB, 0x7811, 0x7811, 0x1A28, + 0x7812, 0x7812, 0x0BB9, 0x7813, 0x7813, 0x3FBE, 0x7814, 0x7814, 0x0FF9, + 0x7815, 0x7815, 0x3FBF, 0x7816, 0x7816, 0x1206, 0x7817, 0x7818, 0x1A26, + 0x7819, 0x7819, 0x3FC0, 0x781A, 0x781A, 0x100B, 0x781B, 0x781B, 0x3FC1, + 0x781C, 0x781D, 0x1A2B, 0x781E, 0x781E, 0x3FC2, 0x781F, 0x781F, 0x1A30, + 0x7820, 0x7822, 0x3FC3, 0x7823, 0x7823, 0x1A34, 0x7824, 0x7824, 0x3FC6, + 0x7825, 0x7825, 0x1A32, 0x7826, 0x7826, 0x1A3A, 0x7827, 0x7827, 0x1189, + 0x7828, 0x7828, 0x3FC7, 0x7829, 0x7829, 0x1A35, 0x782A, 0x782B, 0x3FC8, + 0x782C, 0x782C, 0x1A33, 0x782D, 0x782D, 0x1A2A, 0x782E, 0x782F, 0x3FCA, + 0x7830, 0x7830, 0x0BAA, 0x7831, 0x7833, 0x3FCC, 0x7834, 0x7834, 0x0BE5, + 0x7835, 0x7836, 0x3FCF, 0x7837, 0x7837, 0x0D22, 0x7838, 0x7838, 0x1115, + 0x7839, 0x783B, 0x1A2D, 0x783C, 0x783C, 0x1A31, 0x783D, 0x783D, 0x3FD1, + 0x783E, 0x783E, 0x09E4, 0x783F, 0x783F, 0x3FD2, 0x7840, 0x7840, 0x0524, + 0x7841, 0x7842, 0x3FD3, 0x7843, 0x7843, 0x26A8, 0x7844, 0x7844, 0x3FD5, + 0x7845, 0x7845, 0x0741, 0x7846, 0x7846, 0x3FD6, 0x7847, 0x7847, 0x1A3C, + 0x7848, 0x784B, 0x3FD7, 0x784C, 0x784C, 0x1A3D, 0x784D, 0x784D, 0x3FDB, + 0x784E, 0x784E, 0x1A36, 0x784F, 0x784F, 0x3FDC, 0x7850, 0x7850, 0x1A3B, + 0x7851, 0x7851, 0x3FDD, 0x7852, 0x7852, 0x0F07, 0x7853, 0x7854, 0x3FDE, + 0x7855, 0x7855, 0x0DAB, 0x7856, 0x7857, 0x1A38, 0x7858, 0x785C, 0x3FE0, + 0x785D, 0x785D, 0x0F62, 0x785E, 0x7863, 0x3FE5, 0x7864, 0x7864, 0x24E9, + 0x7865, 0x7867, 0x3FEB, 0x7868, 0x7868, 0x24E5, 0x7869, 0x7869, 0x3FEE, + 0x786A, 0x786A, 0x1A3E, 0x786B, 0x786B, 0x0A3B, 0x786C, 0x786C, 0x1097, + 0x786D, 0x786D, 0x1A37, 0x786E, 0x786E, 0x0C92, 0x786F, 0x786F, 0x21FA, + 0x7870, 0x7876, 0x3FEF, 0x7877, 0x7877, 0x0862, 0x7878, 0x787B, 0x3FF6, + 0x787C, 0x787C, 0x0BB1, 0x787D, 0x7886, 0x3FFA, 0x7887, 0x7887, 0x1A42, + 0x7888, 0x7888, 0x4004, 0x7889, 0x7889, 0x05D0, 0x788A, 0x788B, 0x4005, + 0x788C, 0x788C, 0x0A5C, 0x788D, 0x788D, 0x03B8, 0x788E, 0x788E, 0x0DDE, + 0x788F, 0x7890, 0x4007, 0x7891, 0x7891, 0x0417, 0x7892, 0x7892, 0x4009, + 0x7893, 0x7893, 0x1A40, 0x7894, 0x7896, 0x400A, 0x7897, 0x7897, 0x0E9C, + 0x7898, 0x7898, 0x05C3, 0x7899, 0x7899, 0x400D, 0x789A, 0x789A, 0x1A41, + 0x789B, 0x789B, 0x1A3F, 0x789C, 0x789C, 0x1A43, 0x789D, 0x789E, 0x400E, + 0x789F, 0x789F, 0x05DB, 0x78A0, 0x78A0, 0x4010, 0x78A1, 0x78A1, 0x1A44, + 0x78A2, 0x78A2, 0x4011, 0x78A3, 0x78A3, 0x1A45, 0x78A4, 0x78A4, 0x4012, + 0x78A5, 0x78A5, 0x1A48, 0x78A6, 0x78A6, 0x4013, 0x78A7, 0x78A7, 0x0435, + 0x78A8, 0x78A8, 0x4014, 0x78A9, 0x78A9, 0x2148, 0x78AA, 0x78AC, 0x4015, + 0x78AD, 0x78AD, 0x24E4, 0x78AE, 0x78AF, 0x4018, 0x78B0, 0x78B0, 0x0BB7, + 0x78B1, 0x78B1, 0x0861, 0x78B2, 0x78B2, 0x1A46, 0x78B3, 0x78B3, 0x0E0F, + 0x78B4, 0x78B4, 0x04B1, 0x78B5, 0x78B7, 0x401A, 0x78B8, 0x78B8, 0x24E6, + 0x78B9, 0x78B9, 0x1A47, 0x78BA, 0x78BA, 0x20F7, 0x78BB, 0x78BB, 0x401D, + 0x78BC, 0x78BC, 0x206B, 0x78BD, 0x78BD, 0x401E, 0x78BE, 0x78BE, 0x0B4E, + 0x78BF, 0x78C0, 0x401F, 0x78C1, 0x78C1, 0x0548, 0x78C2, 0x78C4, 0x4021, + 0x78C5, 0x78C5, 0x0400, 0x78C6, 0x78C8, 0x4024, 0x78C9, 0x78C9, 0x1A4B, + 0x78CA, 0x78CA, 0x09C5, 0x78CB, 0x78CB, 0x056B, 0x78CC, 0x78CF, 0x4027, + 0x78D0, 0x78D0, 0x0B8E, 0x78D1, 0x78D3, 0x402B, 0x78D4, 0x78D4, 0x1A49, + 0x78D5, 0x78D5, 0x0951, 0x78D6, 0x78D8, 0x402E, 0x78D9, 0x78D9, 0x1A4A, + 0x78DA, 0x78DA, 0x22A7, 0x78DB, 0x78E2, 0x4031, 0x78E3, 0x78E3, 0x24EC, + 0x78E4, 0x78E6, 0x4039, 0x78E7, 0x78E7, 0x24EB, 0x78E8, 0x78E8, 0x0B08, + 0x78E9, 0x78EB, 0x403C, 0x78EC, 0x78EC, 0x1A4C, 0x78ED, 0x78EE, 0x403F, + 0x78EF, 0x78EF, 0x24E3, 0x78F0, 0x78F1, 0x4041, 0x78F2, 0x78F2, 0x1A4D, + 0x78F3, 0x78F3, 0x4043, 0x78F4, 0x78F4, 0x1A4F, 0x78F5, 0x78F6, 0x4044, + 0x78F7, 0x78F7, 0x0A20, 0x78F8, 0x78F9, 0x4046, 0x78FA, 0x78FA, 0x07DC, + 0x78FB, 0x78FC, 0x4048, 0x78FD, 0x78FD, 0x24EA, 0x78FE, 0x78FF, 0x404A, + 0x7900, 0x7900, 0x404C, 0x7901, 0x7901, 0x0889, 0x7902, 0x7904, 0x404D, + 0x7905, 0x7905, 0x1A4E, 0x7906, 0x790D, 0x4050, 0x790E, 0x790E, 0x1E92, + 0x790F, 0x7912, 0x4058, 0x7913, 0x7913, 0x1A50, 0x7914, 0x7918, 0x405C, + 0x7919, 0x7919, 0x1E27, 0x791A, 0x791D, 0x4061, 0x791E, 0x791E, 0x1A52, + 0x791F, 0x7923, 0x4065, 0x7924, 0x7924, 0x1A51, 0x7925, 0x7925, 0x406A, + 0x7926, 0x7926, 0x1FE6, 0x7927, 0x7929, 0x406B, 0x792A, 0x792A, 0x24E7, + 0x792B, 0x792B, 0x2012, 0x792C, 0x792C, 0x1EEC, 0x792D, 0x7930, 0x406E, + 0x7931, 0x7931, 0x24E8, 0x7932, 0x7933, 0x4072, 0x7934, 0x7934, 0x1A53, + 0x7935, 0x7939, 0x4074, 0x793A, 0x793A, 0x0D55, 0x793B, 0x793B, 0x19F8, + 0x793C, 0x793C, 0x09DC, 0x793D, 0x793D, 0x4079, 0x793E, 0x793E, 0x0D20, + 0x793F, 0x793F, 0x407A, 0x7940, 0x7940, 0x19F9, 0x7941, 0x7941, 0x0C0D, + 0x7942, 0x7945, 0x407B, 0x7946, 0x7946, 0x19FA, 0x7947, 0x7947, 0x407F, + 0x7948, 0x7948, 0x0C0C, 0x7949, 0x7949, 0x19FB, 0x794A, 0x7952, 0x4080, + 0x7953, 0x7953, 0x19FE, 0x7954, 0x7955, 0x4089, 0x7956, 0x7956, 0x1243, + 0x7957, 0x7957, 0x1A01, 0x7958, 0x7959, 0x408B, 0x795A, 0x795A, 0x19FF, + 0x795B, 0x795C, 0x19FC, 0x795D, 0x795D, 0x1200, 0x795E, 0x795E, 0x0D2A, + 0x795F, 0x795F, 0x0DE3, 0x7960, 0x7960, 0x1A02, 0x7961, 0x7961, 0x408D, + 0x7962, 0x7962, 0x1A00, 0x7963, 0x7964, 0x408E, 0x7965, 0x7965, 0x0F56, + 0x7966, 0x7966, 0x4090, 0x7967, 0x7967, 0x1A04, 0x7968, 0x7968, 0x0BD0, + 0x7969, 0x796C, 0x4091, 0x796D, 0x796D, 0x0833, 0x796E, 0x796E, 0x4095, + 0x796F, 0x796F, 0x1A03, 0x7970, 0x7976, 0x4096, 0x7977, 0x7977, 0x059C, + 0x7978, 0x7978, 0x080B, 0x7979, 0x7979, 0x409D, 0x797A, 0x797A, 0x1A05, + 0x797B, 0x797F, 0x409E, 0x7980, 0x7980, 0x130B, 0x7981, 0x7981, 0x08CC, + 0x7982, 0x7983, 0x40A3, 0x7984, 0x7984, 0x0A62, 0x7985, 0x7985, 0x1A06, + 0x7986, 0x7989, 0x40A5, 0x798A, 0x798A, 0x1A07, 0x798B, 0x798C, 0x40A9, + 0x798D, 0x798D, 0x1F66, 0x798E, 0x798E, 0x24DC, 0x798F, 0x798F, 0x069E, + 0x7990, 0x7999, 0x40AB, 0x799A, 0x799A, 0x1A08, 0x799B, 0x79A5, 0x40B5, + 0x79A6, 0x79A6, 0x26A2, 0x79A7, 0x79A7, 0x1A09, 0x79A8, 0x79A9, 0x40C0, + 0x79AA, 0x79AA, 0x24DD, 0x79AB, 0x79AD, 0x40C2, 0x79AE, 0x79AE, 0x200E, + 0x79AF, 0x79AF, 0x40C5, 0x79B0, 0x79B0, 0x24DB, 0x79B1, 0x79B1, 0x1EB8, + 0x79B2, 0x79B2, 0x40C6, 0x79B3, 0x79B3, 0x1A0A, 0x79B4, 0x79B8, 0x40C7, + 0x79B9, 0x79B9, 0x10D2, 0x79BA, 0x79BA, 0x1264, 0x79BB, 0x79BB, 0x09D6, + 0x79BC, 0x79BC, 0x40CC, 0x79BD, 0x79BD, 0x0C5A, 0x79BE, 0x79BE, 0x0783, + 0x79BF, 0x79BF, 0x40CD, 0x79C0, 0x79C0, 0x0FAE, 0x79C1, 0x79C1, 0x0DB2, + 0x79C2, 0x79C2, 0x40CE, 0x79C3, 0x79C3, 0x0E6B, 0x79C4, 0x79C5, 0x40CF, + 0x79C6, 0x79C6, 0x06CC, 0x79C7, 0x79C8, 0x40D1, 0x79C9, 0x79C9, 0x0465, + 0x79CA, 0x79CA, 0x40D3, 0x79CB, 0x79CB, 0x0C6C, 0x79CC, 0x79CC, 0x40D4, + 0x79CD, 0x79CD, 0x11D5, 0x79CE, 0x79D0, 0x40D5, 0x79D1, 0x79D1, 0x0953, + 0x79D2, 0x79D2, 0x0AF0, 0x79D3, 0x79D4, 0x40D8, 0x79D5, 0x79D5, 0x1B1D, + 0x79D6, 0x79D7, 0x40DA, 0x79D8, 0x79D8, 0x0ADD, 0x79D9, 0x79DE, 0x40DC, + 0x79DF, 0x79DF, 0x123F, 0x79E0, 0x79E2, 0x40E2, 0x79E3, 0x79E3, 0x1B1F, + 0x79E4, 0x79E4, 0x04F8, 0x79E5, 0x79E5, 0x40E5, 0x79E6, 0x79E6, 0x0C55, + 0x79E7, 0x79E7, 0x1016, 0x79E8, 0x79E8, 0x40E6, 0x79E9, 0x79E9, 0x11C7, + 0x79EA, 0x79EA, 0x40E7, 0x79EB, 0x79EB, 0x1B20, 0x79EC, 0x79EC, 0x40E8, + 0x79ED, 0x79ED, 0x1B1E, 0x79EE, 0x79EE, 0x40E9, 0x79EF, 0x79EF, 0x0812, + 0x79F0, 0x79F0, 0x04EB, 0x79F1, 0x79F7, 0x40EA, 0x79F8, 0x79F8, 0x08A6, + 0x79F9, 0x79FA, 0x40F1, 0x79FB, 0x79FB, 0x104D, 0x79FC, 0x79FC, 0x40F3, + 0x79FD, 0x79FD, 0x07F5, 0x79FE, 0x79FF, 0x40F4, 0x7A00, 0x7A00, 0x0F0E, + 0x7A01, 0x7A01, 0x40F6, 0x7A02, 0x7A02, 0x1B24, 0x7A03, 0x7A03, 0x1B23, + 0x7A04, 0x7A05, 0x40F7, 0x7A06, 0x7A06, 0x1B21, 0x7A07, 0x7A0A, 0x40F9, + 0x7A0B, 0x7A0B, 0x04F1, 0x7A0C, 0x7A0C, 0x40FD, 0x7A0D, 0x7A0D, 0x0D0D, + 0x7A0E, 0x7A0E, 0x0DA5, 0x7A0F, 0x7A13, 0x40FE, 0x7A14, 0x7A14, 0x1B26, + 0x7A15, 0x7A16, 0x4103, 0x7A17, 0x7A17, 0x03E9, 0x7A18, 0x7A19, 0x4105, + 0x7A1A, 0x7A1A, 0x11C8, 0x7A1B, 0x7A1D, 0x4107, 0x7A1E, 0x7A1E, 0x1B25, + 0x7A1F, 0x7A1F, 0x410A, 0x7A20, 0x7A20, 0x0512, 0x7A21, 0x7A22, 0x410B, + 0x7A23, 0x7A23, 0x1D8F, 0x7A24, 0x7A2D, 0x410D, 0x7A2E, 0x7A2E, 0x2295, + 0x7A2F, 0x7A30, 0x4117, 0x7A31, 0x7A31, 0x1E80, 0x7A32, 0x7A32, 0x4119, + 0x7A33, 0x7A33, 0x0ED7, 0x7A34, 0x7A36, 0x411A, 0x7A37, 0x7A37, 0x1B28, + 0x7A38, 0x7A38, 0x411D, 0x7A39, 0x7A39, 0x1B27, 0x7A3A, 0x7A3A, 0x411E, + 0x7A3B, 0x7A3B, 0x059F, 0x7A3C, 0x7A3C, 0x084D, 0x7A3D, 0x7A3D, 0x0811, + 0x7A3E, 0x7A3E, 0x411F, 0x7A3F, 0x7A3F, 0x06E0, 0x7A40, 0x7A40, 0x2677, + 0x7A41, 0x7A45, 0x4120, 0x7A46, 0x7A46, 0x0B25, 0x7A47, 0x7A4B, 0x4125, + 0x7A4C, 0x7A4C, 0x2624, 0x7A4D, 0x7A4D, 0x1F69, 0x7A4E, 0x7A4E, 0x222B, + 0x7A4F, 0x7A50, 0x412A, 0x7A51, 0x7A51, 0x1B29, 0x7A52, 0x7A56, 0x412C, + 0x7A57, 0x7A57, 0x0DE0, 0x7A58, 0x7A60, 0x4131, 0x7A61, 0x7A61, 0x257F, + 0x7A62, 0x7A62, 0x1F5B, 0x7A63, 0x7A68, 0x413A, 0x7A69, 0x7A69, 0x219B, + 0x7A6A, 0x7A6A, 0x4140, 0x7A6B, 0x7A6B, 0x267D, 0x7A6C, 0x7A6F, 0x4141, + 0x7A70, 0x7A70, 0x1B2C, 0x7A71, 0x7A73, 0x4145, 0x7A74, 0x7A74, 0x0FD1, + 0x7A75, 0x7A75, 0x4148, 0x7A76, 0x7A76, 0x08EE, 0x7A77, 0x7A77, 0x0C6B, + 0x7A78, 0x7A79, 0x1B9A, 0x7A7A, 0x7A7A, 0x0962, 0x7A7B, 0x7A7E, 0x4149, + 0x7A7F, 0x7A7F, 0x052C, 0x7A80, 0x7A80, 0x1B9C, 0x7A81, 0x7A81, 0x0E6C, + 0x7A82, 0x7A82, 0x414D, 0x7A83, 0x7A83, 0x0C51, 0x7A84, 0x7A84, 0x114E, + 0x7A85, 0x7A85, 0x414E, 0x7A86, 0x7A86, 0x1B9D, 0x7A87, 0x7A87, 0x414F, + 0x7A88, 0x7A88, 0x1B9E, 0x7A89, 0x7A8C, 0x4150, 0x7A8D, 0x7A8D, 0x0C4C, + 0x7A8E, 0x7A90, 0x4154, 0x7A91, 0x7A91, 0x102B, 0x7A92, 0x7A92, 0x11CE, + 0x7A93, 0x7A94, 0x4157, 0x7A95, 0x7A95, 0x1B9F, 0x7A96, 0x7A96, 0x08A2, + 0x7A97, 0x7A97, 0x0533, 0x7A98, 0x7A98, 0x08EC, 0x7A99, 0x7A9B, 0x4159, + 0x7A9C, 0x7A9C, 0x055F, 0x7A9D, 0x7A9D, 0x0EE0, 0x7A9E, 0x7A9E, 0x415C, + 0x7A9F, 0x7A9F, 0x096C, 0x7AA0, 0x7AA0, 0x1BA1, 0x7AA1, 0x7AA4, 0x415D, + 0x7AA5, 0x7AA5, 0x0987, 0x7AA6, 0x7AA6, 0x1BA0, 0x7AA7, 0x7AA7, 0x4161, + 0x7AA8, 0x7AA8, 0x1BA3, 0x7AA9, 0x7AA9, 0x21A0, 0x7AAA, 0x7AAA, 0x2186, + 0x7AAB, 0x7AAB, 0x4162, 0x7AAC, 0x7AAC, 0x1BA2, 0x7AAD, 0x7AAD, 0x1BA4, + 0x7AAE, 0x7AAE, 0x20ED, 0x7AAF, 0x7AB2, 0x4163, 0x7AB3, 0x7AB3, 0x1BA5, + 0x7AB4, 0x7AB5, 0x4167, 0x7AB6, 0x7AB6, 0x25B9, 0x7AB7, 0x7AB9, 0x4169, + 0x7ABA, 0x7ABA, 0x1FEA, 0x7ABB, 0x7ABE, 0x416C, 0x7ABF, 0x7ABF, 0x0A47, + 0x7AC0, 0x7AC3, 0x4170, 0x7AC4, 0x7AC4, 0x1EA4, 0x7AC5, 0x7AC5, 0x20E1, + 0x7AC6, 0x7AC6, 0x4174, 0x7AC7, 0x7AC7, 0x25B8, 0x7AC8, 0x7AC8, 0x2260, + 0x7AC9, 0x7AC9, 0x4175, 0x7ACA, 0x7ACA, 0x20E2, 0x7ACB, 0x7ACB, 0x09EB, + 0x7ACC, 0x7AD5, 0x4176, 0x7AD6, 0x7AD6, 0x0D91, 0x7AD7, 0x7AD8, 0x4180, + 0x7AD9, 0x7AD9, 0x115F, 0x7ADA, 0x7ADD, 0x4182, 0x7ADE, 0x7ADE, 0x08E9, + 0x7ADF, 0x7ADF, 0x08E8, 0x7AE0, 0x7AE0, 0x1163, 0x7AE1, 0x7AE2, 0x4186, + 0x7AE3, 0x7AE3, 0x092F, 0x7AE4, 0x7AE4, 0x4188, 0x7AE5, 0x7AE5, 0x0E60, + 0x7AE6, 0x7AE6, 0x1B99, 0x7AE7, 0x7AE9, 0x4189, 0x7AEA, 0x7AEA, 0x2141, + 0x7AEB, 0x7AEC, 0x418C, 0x7AED, 0x7AED, 0x08B0, 0x7AEE, 0x7AEE, 0x418E, + 0x7AEF, 0x7AEF, 0x060A, 0x7AF0, 0x7AF5, 0x418F, 0x7AF6, 0x7AF6, 0x1FC7, + 0x7AF7, 0x7AF8, 0x4195, 0x7AF9, 0x7AF9, 0x11F0, 0x7AFA, 0x7AFA, 0x1C63, + 0x7AFB, 0x7AFC, 0x4197, 0x7AFD, 0x7AFD, 0x1C64, 0x7AFE, 0x7AFE, 0x4199, + 0x7AFF, 0x7AFF, 0x06C8, 0x7B00, 0x7B02, 0x419A, 0x7B03, 0x7B04, 0x1C66, + 0x7B05, 0x7B05, 0x419D, 0x7B06, 0x7B06, 0x03D5, 0x7B07, 0x7B07, 0x419E, + 0x7B08, 0x7B08, 0x1C65, 0x7B09, 0x7B09, 0x419F, 0x7B0A, 0x7B0A, 0x1C69, + 0x7B0B, 0x7B0B, 0x0DE6, 0x7B0C, 0x7B0E, 0x41A0, 0x7B0F, 0x7B0F, 0x1C6B, + 0x7B10, 0x7B10, 0x41A3, 0x7B11, 0x7B11, 0x0F71, 0x7B12, 0x7B13, 0x41A4, + 0x7B14, 0x7B14, 0x0433, 0x7B15, 0x7B15, 0x1C68, 0x7B16, 0x7B18, 0x41A6, + 0x7B19, 0x7B19, 0x1C6F, 0x7B1A, 0x7B1A, 0x41A9, 0x7B1B, 0x7B1B, 0x05B2, + 0x7B1C, 0x7B1D, 0x41AA, 0x7B1E, 0x7B1E, 0x1C77, 0x7B1F, 0x7B1F, 0x41AC, + 0x7B20, 0x7B20, 0x1C72, 0x7B21, 0x7B23, 0x41AD, 0x7B24, 0x7B24, 0x1C74, + 0x7B25, 0x7B25, 0x1C73, 0x7B26, 0x7B26, 0x0698, 0x7B27, 0x7B27, 0x41B0, + 0x7B28, 0x7B28, 0x0428, 0x7B29, 0x7B29, 0x41B1, 0x7B2A, 0x7B2A, 0x1C6E, + 0x7B2B, 0x7B2B, 0x1C6A, 0x7B2C, 0x7B2C, 0x05BB, 0x7B2D, 0x7B2D, 0x41B2, + 0x7B2E, 0x7B2E, 0x1C70, 0x7B2F, 0x7B30, 0x41B3, 0x7B31, 0x7B31, 0x1C71, + 0x7B32, 0x7B32, 0x41B5, 0x7B33, 0x7B33, 0x1C75, 0x7B34, 0x7B37, 0x41B6, + 0x7B38, 0x7B38, 0x1C6D, 0x7B39, 0x7B39, 0x41BA, 0x7B3A, 0x7B3A, 0x0856, + 0x7B3B, 0x7B3B, 0x41BB, 0x7B3C, 0x7B3C, 0x0A46, 0x7B3D, 0x7B3D, 0x41BC, + 0x7B3E, 0x7B3E, 0x1C76, 0x7B3F, 0x7B44, 0x41BD, 0x7B45, 0x7B45, 0x1C7A, + 0x7B46, 0x7B46, 0x1E41, 0x7B47, 0x7B47, 0x1C6C, 0x7B48, 0x7B48, 0x41C3, + 0x7B49, 0x7B49, 0x05A9, 0x7B4A, 0x7B4A, 0x41C4, 0x7B4B, 0x7B4B, 0x08BF, + 0x7B4C, 0x7B4C, 0x1C7C, 0x7B4D, 0x7B4E, 0x41C5, 0x7B4F, 0x7B4F, 0x0641, + 0x7B50, 0x7B50, 0x097D, 0x7B51, 0x7B51, 0x11FD, 0x7B52, 0x7B52, 0x0E63, + 0x7B53, 0x7B53, 0x41C7, 0x7B54, 0x7B54, 0x0573, 0x7B55, 0x7B55, 0x41C8, + 0x7B56, 0x7B56, 0x04A6, 0x7B57, 0x7B57, 0x41C9, 0x7B58, 0x7B58, 0x1C78, + 0x7B59, 0x7B59, 0x41CA, 0x7B5A, 0x7B5A, 0x1C79, 0x7B5B, 0x7B5B, 0x0CF1, + 0x7B5C, 0x7B5C, 0x41CB, 0x7B5D, 0x7B5D, 0x1C7D, 0x7B5E, 0x7B5F, 0x41CC, + 0x7B60, 0x7B60, 0x1C7E, 0x7B61, 0x7B61, 0x41CE, 0x7B62, 0x7B62, 0x1C81, + 0x7B63, 0x7B66, 0x41CF, 0x7B67, 0x7B67, 0x25E4, 0x7B68, 0x7B6D, 0x41D3, + 0x7B6E, 0x7B6E, 0x1C7F, 0x7B6F, 0x7B70, 0x41D9, 0x7B71, 0x7B71, 0x1C83, + 0x7B72, 0x7B72, 0x1C82, 0x7B73, 0x7B74, 0x41DB, 0x7B75, 0x7B75, 0x1C7B, + 0x7B76, 0x7B76, 0x41DD, 0x7B77, 0x7B77, 0x0977, 0x7B78, 0x7B78, 0x41DE, + 0x7B79, 0x7B79, 0x0514, 0x7B7A, 0x7B7A, 0x41DF, 0x7B7B, 0x7B7B, 0x1C80, + 0x7B7C, 0x7B7D, 0x41E0, 0x7B7E, 0x7B7E, 0x0C26, 0x7B7F, 0x7B7F, 0x41E2, + 0x7B80, 0x7B80, 0x0865, 0x7B81, 0x7B84, 0x41E3, 0x7B85, 0x7B85, 0x1C8B, + 0x7B86, 0x7B8A, 0x41E7, 0x7B8B, 0x7B8B, 0x1F86, 0x7B8C, 0x7B8C, 0x41EC, + 0x7B8D, 0x7B8D, 0x0718, 0x7B8E, 0x7B8F, 0x41ED, 0x7B90, 0x7B90, 0x1C84, + 0x7B91, 0x7B93, 0x41EF, 0x7B94, 0x7B94, 0x0474, 0x7B95, 0x7B95, 0x0813, + 0x7B96, 0x7B96, 0x41F2, 0x7B97, 0x7B97, 0x0DD8, 0x7B98, 0x7B9B, 0x41F3, + 0x7B9C, 0x7B9C, 0x1C8D, 0x7B9D, 0x7B9D, 0x1C89, 0x7B9E, 0x7BA0, 0x41F7, + 0x7BA1, 0x7BA1, 0x0735, 0x7BA2, 0x7BA2, 0x1C8E, 0x7BA3, 0x7BA5, 0x41FA, + 0x7BA6, 0x7BA7, 0x1C85, 0x7BA8, 0x7BA8, 0x1C8A, 0x7BA9, 0x7BA9, 0x0A88, + 0x7BAA, 0x7BAA, 0x1C8C, 0x7BAB, 0x7BAB, 0x1C8F, 0x7BAC, 0x7BAC, 0x1C88, + 0x7BAD, 0x7BAD, 0x0870, 0x7BAE, 0x7BB0, 0x41FD, 0x7BB1, 0x7BB1, 0x0F51, + 0x7BB2, 0x7BB3, 0x4200, 0x7BB4, 0x7BB4, 0x1C90, 0x7BB5, 0x7BB7, 0x4202, + 0x7BB8, 0x7BB8, 0x1C87, 0x7BB9, 0x7BBF, 0x4205, 0x7BC0, 0x7BC0, 0x1FB3, + 0x7BC1, 0x7BC1, 0x1C92, 0x7BC2, 0x7BC3, 0x420C, 0x7BC4, 0x7BC4, 0x1EEF, + 0x7BC5, 0x7BC5, 0x420E, 0x7BC6, 0x7BC6, 0x120A, 0x7BC7, 0x7BC7, 0x0BC9, + 0x7BC8, 0x7BC8, 0x420F, 0x7BC9, 0x7BC9, 0x22A4, 0x7BCA, 0x7BCA, 0x4210, + 0x7BCB, 0x7BCB, 0x25E8, 0x7BCC, 0x7BCC, 0x1C93, 0x7BCD, 0x7BD0, 0x4211, + 0x7BD1, 0x7BD1, 0x1C91, 0x7BD2, 0x7BD2, 0x4215, 0x7BD3, 0x7BD3, 0x0A4F, + 0x7BD4, 0x7BD8, 0x4216, 0x7BD9, 0x7BD9, 0x06D8, 0x7BDA, 0x7BDA, 0x1C95, + 0x7BDB, 0x7BDC, 0x421B, 0x7BDD, 0x7BDD, 0x1C94, 0x7BDE, 0x7BE0, 0x421D, + 0x7BE1, 0x7BE1, 0x055E, 0x7BE2, 0x7BE3, 0x4220, 0x7BE4, 0x7BE4, 0x25E3, + 0x7BE5, 0x7BE6, 0x1C96, 0x7BE7, 0x7BE8, 0x4222, 0x7BE9, 0x7BE9, 0x2111, + 0x7BEA, 0x7BEA, 0x1C98, 0x7BEB, 0x7BED, 0x4224, 0x7BEE, 0x7BEE, 0x09A5, + 0x7BEF, 0x7BF0, 0x4227, 0x7BF1, 0x7BF1, 0x09D4, 0x7BF2, 0x7BF2, 0x4229, + 0x7BF3, 0x7BF3, 0x25E6, 0x7BF4, 0x7BF6, 0x422A, 0x7BF7, 0x7BF7, 0x0BB2, + 0x7BF8, 0x7BFB, 0x422D, 0x7BFC, 0x7BFC, 0x1C9B, 0x7BFD, 0x7BFD, 0x4231, + 0x7BFE, 0x7BFE, 0x1C9A, 0x7BFF, 0x7BFF, 0x4232, 0x7C00, 0x7C00, 0x25E7, + 0x7C01, 0x7C06, 0x4233, 0x7C07, 0x7C07, 0x055B, 0x7C08, 0x7C0A, 0x4239, + 0x7C0B, 0x7C0B, 0x1C9E, 0x7C0C, 0x7C0C, 0x1C99, 0x7C0D, 0x7C0D, 0x2041, + 0x7C0E, 0x7C0E, 0x423C, 0x7C0F, 0x7C0F, 0x1C9C, 0x7C10, 0x7C15, 0x423D, + 0x7C16, 0x7C16, 0x1C9D, 0x7C17, 0x7C1D, 0x4243, 0x7C1E, 0x7C1E, 0x25EA, + 0x7C1F, 0x7C1F, 0x1C9F, 0x7C20, 0x7C20, 0x424A, 0x7C21, 0x7C21, 0x1F8F, + 0x7C22, 0x7C22, 0x424B, 0x7C23, 0x7C23, 0x25EC, 0x7C24, 0x7C25, 0x424C, + 0x7C26, 0x7C26, 0x1CA1, 0x7C27, 0x7C27, 0x07DE, 0x7C28, 0x7C29, 0x424E, + 0x7C2A, 0x7C2A, 0x1CA0, 0x7C2B, 0x7C2B, 0x25EB, 0x7C2C, 0x7C37, 0x4250, + 0x7C38, 0x7C38, 0x1CA2, 0x7C39, 0x7C3C, 0x425C, 0x7C3D, 0x7C3D, 0x20D0, + 0x7C3E, 0x7C3E, 0x201D, 0x7C3F, 0x7C3F, 0x0485, 0x7C40, 0x7C40, 0x1CA4, + 0x7C41, 0x7C41, 0x1CA3, 0x7C42, 0x7C42, 0x4260, 0x7C43, 0x7C43, 0x1FF7, + 0x7C44, 0x7C4B, 0x4261, 0x7C4C, 0x7C4C, 0x1E8D, 0x7C4D, 0x7C4D, 0x0821, + 0x7C4E, 0x7C5B, 0x4269, 0x7C5C, 0x7C5C, 0x25E9, 0x7C5D, 0x7C5E, 0x4277, + 0x7C5F, 0x7C5F, 0x25EE, 0x7C60, 0x7C60, 0x203A, 0x7C61, 0x7C63, 0x4279, + 0x7C64, 0x7C64, 0x2693, 0x7C65, 0x7C68, 0x427C, 0x7C69, 0x7C69, 0x25E5, + 0x7C6A, 0x7C6A, 0x25ED, 0x7C6B, 0x7C6B, 0x4280, 0x7C6C, 0x7C6C, 0x2009, + 0x7C6D, 0x7C6D, 0x4281, 0x7C6E, 0x7C6E, 0x2065, 0x7C6F, 0x7C71, 0x4282, + 0x7C72, 0x7C72, 0x26A3, 0x7C73, 0x7C73, 0x0ADC, 0x7C74, 0x7C74, 0x12F5, + 0x7C75, 0x7C7A, 0x4285, 0x7C7B, 0x7C7B, 0x09CB, 0x7C7C, 0x7C7C, 0x1CCA, + 0x7C7D, 0x7C7D, 0x122E, 0x7C7E, 0x7C88, 0x428B, 0x7C89, 0x7C89, 0x0678, + 0x7C8A, 0x7C90, 0x4296, 0x7C91, 0x7C91, 0x1CCC, 0x7C92, 0x7C92, 0x09EC, + 0x7C93, 0x7C94, 0x429D, 0x7C95, 0x7C95, 0x0BE8, 0x7C96, 0x7C96, 0x429F, + 0x7C97, 0x7C97, 0x0559, 0x7C98, 0x7C98, 0x1154, 0x7C99, 0x7C9B, 0x42A0, + 0x7C9C, 0x7C9C, 0x1CCE, 0x7C9D, 0x7C9D, 0x1CCD, 0x7C9E, 0x7C9E, 0x1CCF, + 0x7C9F, 0x7C9F, 0x0DCF, 0x7CA0, 0x7CA1, 0x42A3, 0x7CA2, 0x7CA2, 0x1CD0, + 0x7CA3, 0x7CA3, 0x42A5, 0x7CA4, 0x7CA4, 0x1104, 0x7CA5, 0x7CA5, 0x11DF, + 0x7CA6, 0x7CA9, 0x42A6, 0x7CAA, 0x7CAA, 0x067D, 0x7CAB, 0x7CAD, 0x42AA, + 0x7CAE, 0x7CAE, 0x0A01, 0x7CAF, 0x7CB0, 0x42AD, 0x7CB1, 0x7CB1, 0x0A04, + 0x7CB2, 0x7CB2, 0x1CD1, 0x7CB3, 0x7CB3, 0x08DB, 0x7CB4, 0x7CB8, 0x42AF, + 0x7CB9, 0x7CB9, 0x0565, 0x7CBA, 0x7CBB, 0x42B4, 0x7CBC, 0x7CBD, 0x1CD2, + 0x7CBE, 0x7CBE, 0x08DA, 0x7CBF, 0x7CC0, 0x42B6, 0x7CC1, 0x7CC1, 0x1CD4, + 0x7CC2, 0x7CC4, 0x42B8, 0x7CC5, 0x7CC5, 0x1CD9, 0x7CC6, 0x7CC6, 0x42BB, + 0x7CC7, 0x7CC7, 0x1CD5, 0x7CC8, 0x7CC8, 0x1CD8, 0x7CC9, 0x7CC9, 0x42BC, + 0x7CCA, 0x7CCA, 0x07B4, 0x7CCB, 0x7CCB, 0x42BD, 0x7CCC, 0x7CCD, 0x1CD6, + 0x7CCE, 0x7CD4, 0x42BE, 0x7CD5, 0x7CD5, 0x06DD, 0x7CD6, 0x7CD6, 0x0E1A, + 0x7CD7, 0x7CD7, 0x1CDA, 0x7CD8, 0x7CD8, 0x42C5, 0x7CD9, 0x7CD9, 0x04A1, + 0x7CDA, 0x7CDB, 0x42C6, 0x7CDC, 0x7CDC, 0x0AD8, 0x7CDD, 0x7CDD, 0x25F5, + 0x7CDE, 0x7CDE, 0x1EFC, 0x7CDF, 0x7CDF, 0x1126, 0x7CE0, 0x7CE0, 0x0944, + 0x7CE1, 0x7CE6, 0x42C8, 0x7CE7, 0x7CE7, 0x2024, 0x7CE8, 0x7CE8, 0x1CDB, + 0x7CE9, 0x7CEE, 0x42CE, 0x7CEF, 0x7CEF, 0x0B75, 0x7CF0, 0x7CF0, 0x269B, + 0x7CF1, 0x7CF1, 0x42D4, 0x7CF2, 0x7CF2, 0x25F3, 0x7CF3, 0x7CF3, 0x42D5, + 0x7CF4, 0x7CF4, 0x22D9, 0x7CF5, 0x7CF5, 0x42D6, 0x7CF6, 0x7CF6, 0x25F4, + 0x7CF7, 0x7CF7, 0x42D7, 0x7CF8, 0x7CF8, 0x1CE7, 0x7CF9, 0x7CF9, 0x241B, + 0x7CFA, 0x7CFA, 0x42D8, 0x7CFB, 0x7CFB, 0x0F22, 0x7CFC, 0x7CFD, 0x42D9, + 0x7CFE, 0x7CFE, 0x1FC8, 0x7CFF, 0x7CFF, 0x42DB, 0x7D00, 0x7D00, 0x1F7B, + 0x7D01, 0x7D01, 0x42DC, 0x7D02, 0x7D02, 0x241D, 0x7D03, 0x7D03, 0x42DD, + 0x7D04, 0x7D04, 0x224C, 0x7D05, 0x7D05, 0x1F48, 0x7D06, 0x7D06, 0x241C, + 0x7D07, 0x7D08, 0x241E, 0x7D09, 0x7D09, 0x20FF, 0x7D0A, 0x7D0A, 0x0ED8, + 0x7D0B, 0x7D0B, 0x219A, 0x7D0C, 0x7D0C, 0x42DE, 0x7D0D, 0x7D0D, 0x2091, + 0x7D0E, 0x7D0F, 0x42DF, 0x7D10, 0x7D10, 0x20A7, 0x7D11, 0x7D12, 0x42E1, + 0x7D13, 0x7D13, 0x2423, 0x7D14, 0x7D14, 0x1E9B, 0x7D15, 0x7D15, 0x2422, + 0x7D16, 0x7D16, 0x42E3, 0x7D17, 0x7D17, 0x2110, 0x7D18, 0x7D18, 0x42E4, + 0x7D19, 0x7D19, 0x228D, 0x7D1A, 0x7D1A, 0x1F71, 0x7D1B, 0x7D1B, 0x1EF8, + 0x7D1C, 0x7D1C, 0x2421, 0x7D1D, 0x7D1F, 0x42E5, 0x7D20, 0x7D20, 0x0DCD, + 0x7D21, 0x7D21, 0x1EF3, 0x7D22, 0x7D22, 0x0DEC, 0x7D23, 0x7D26, 0x42E8, + 0x7D27, 0x7D27, 0x08C5, 0x7D28, 0x7D2A, 0x42EC, 0x7D2B, 0x7D2B, 0x122C, + 0x7D2C, 0x7D2E, 0x42EF, 0x7D2F, 0x7D2F, 0x09C6, 0x7D30, 0x7D30, 0x21B1, + 0x7D31, 0x7D31, 0x2426, 0x7D32, 0x7D32, 0x2425, 0x7D33, 0x7D33, 0x2120, + 0x7D34, 0x7D38, 0x42F2, 0x7D39, 0x7D39, 0x211A, 0x7D3A, 0x7D3A, 0x2424, + 0x7D3B, 0x7D3B, 0x42F7, 0x7D3C, 0x7D3C, 0x2428, 0x7D3D, 0x7D3E, 0x42F8, + 0x7D3F, 0x7D3F, 0x242A, 0x7D40, 0x7D40, 0x2429, 0x7D41, 0x7D41, 0x42FA, + 0x7D42, 0x7D42, 0x2294, 0x7D43, 0x7D43, 0x42FB, 0x7D44, 0x7D44, 0x22BE, + 0x7D45, 0x7D45, 0x42FC, 0x7D46, 0x7D46, 0x1E31, 0x7D47, 0x7D4D, 0x42FD, + 0x7D4E, 0x7D4E, 0x242C, 0x7D4F, 0x7D4F, 0x4304, 0x7D50, 0x7D50, 0x1FB5, + 0x7D51, 0x7D5C, 0x4305, 0x7D5D, 0x7D5D, 0x242B, 0x7D5E, 0x7D5E, 0x1FAF, + 0x7D5F, 0x7D60, 0x4311, 0x7D61, 0x7D61, 0x2068, 0x7D62, 0x7D62, 0x21E4, + 0x7D63, 0x7D65, 0x4313, 0x7D66, 0x7D66, 0x1F21, 0x7D67, 0x7D67, 0x4316, + 0x7D68, 0x7D68, 0x2101, 0x7D69, 0x7D6D, 0x4317, 0x7D6E, 0x7D6E, 0x0FC0, + 0x7D6F, 0x7D70, 0x431C, 0x7D71, 0x7D71, 0x217C, 0x7D72, 0x7D72, 0x214A, + 0x7D73, 0x7D73, 0x242D, 0x7D74, 0x7D75, 0x431E, 0x7D76, 0x7D76, 0x1FD4, + 0x7D77, 0x7D77, 0x1CE8, 0x7D78, 0x7D78, 0x4320, 0x7D79, 0x7D79, 0x1FD1, + 0x7D7A, 0x7D80, 0x4321, 0x7D81, 0x7D81, 0x1E33, 0x7D82, 0x7D82, 0x4328, + 0x7D83, 0x7D83, 0x242F, 0x7D84, 0x7D85, 0x4329, 0x7D86, 0x7D86, 0x242E, + 0x7D87, 0x7D87, 0x432B, 0x7D88, 0x7D88, 0x2430, 0x7D89, 0x7D89, 0x21DB, + 0x7D8A, 0x7D8E, 0x432C, 0x7D8F, 0x7D8F, 0x2158, 0x7D90, 0x7D92, 0x4331, + 0x7D93, 0x7D93, 0x1FC2, 0x7D94, 0x7D9B, 0x4334, 0x7D9C, 0x7D9C, 0x22B9, + 0x7D9D, 0x7D9D, 0x433C, 0x7D9E, 0x7D9E, 0x2436, 0x7D9F, 0x7DA1, 0x433D, + 0x7DA2, 0x7DA2, 0x1E8E, 0x7DA3, 0x7DA3, 0x2439, 0x7DA4, 0x7DA5, 0x4340, + 0x7DA6, 0x7DA6, 0x1CE9, 0x7DA7, 0x7DAA, 0x4342, 0x7DAB, 0x7DAB, 0x21C5, + 0x7DAC, 0x7DAC, 0x2437, 0x7DAD, 0x7DAD, 0x2192, 0x7DAE, 0x7DAE, 0x1CEA, + 0x7DAF, 0x7DAF, 0x4346, 0x7DB0, 0x7DB0, 0x243A, 0x7DB1, 0x7DB1, 0x1F19, + 0x7DB2, 0x7DB2, 0x218C, 0x7DB3, 0x7DB3, 0x1E40, 0x7DB4, 0x7DB4, 0x22B3, + 0x7DB5, 0x7DB7, 0x4347, 0x7DB8, 0x7DB8, 0x205F, 0x7DB9, 0x7DB9, 0x2438, + 0x7DBA, 0x7DBA, 0x2432, 0x7DBB, 0x7DBB, 0x2274, 0x7DBC, 0x7DBC, 0x434A, + 0x7DBD, 0x7DBD, 0x1E9C, 0x7DBE, 0x7DBE, 0x2431, 0x7DBF, 0x7DBF, 0x2085, + 0x7DC0, 0x7DC3, 0x434B, 0x7DC4, 0x7DC4, 0x2435, 0x7DC5, 0x7DC6, 0x434F, + 0x7DC7, 0x7DC7, 0x243B, 0x7DC8, 0x7DC9, 0x4351, 0x7DCA, 0x7DCA, 0x1FB7, + 0x7DCB, 0x7DCB, 0x2433, 0x7DCC, 0x7DD0, 0x4353, 0x7DD1, 0x7DD1, 0x2054, + 0x7DD2, 0x7DD2, 0x21DE, 0x7DD3, 0x7DD3, 0x4358, 0x7DD4, 0x7DD4, 0x2434, + 0x7DD5, 0x7DD6, 0x4359, 0x7DD7, 0x7DD7, 0x243D, 0x7DD8, 0x7DD8, 0x1F89, + 0x7DD9, 0x7DD9, 0x243C, 0x7DDA, 0x7DDC, 0x435B, 0x7DDD, 0x7DDD, 0x1F6E, + 0x7DDE, 0x7DDE, 0x1ED8, 0x7DDF, 0x7DDF, 0x435E, 0x7DE0, 0x7DE0, 0x1EBF, + 0x7DE1, 0x7DE1, 0x2445, 0x7DE2, 0x7DE2, 0x435F, 0x7DE3, 0x7DE3, 0x2249, + 0x7DE4, 0x7DE5, 0x4360, 0x7DE6, 0x7DE6, 0x2441, 0x7DE7, 0x7DE7, 0x4362, + 0x7DE8, 0x7DE8, 0x1E47, 0x7DE9, 0x7DE9, 0x1F56, 0x7DEA, 0x7DEB, 0x4363, + 0x7DEC, 0x7DEC, 0x2086, 0x7DED, 0x7DEE, 0x4365, 0x7DEF, 0x7DEF, 0x2196, + 0x7DF0, 0x7DF0, 0x4367, 0x7DF1, 0x7DF1, 0x2443, 0x7DF2, 0x7DF2, 0x243F, + 0x7DF3, 0x7DF3, 0x4368, 0x7DF4, 0x7DF4, 0x2023, 0x7DF5, 0x7DF5, 0x4369, + 0x7DF6, 0x7DF6, 0x2442, 0x7DF7, 0x7DF8, 0x436A, 0x7DF9, 0x7DF9, 0x243E, + 0x7DFA, 0x7DFA, 0x436C, 0x7DFB, 0x7DFB, 0x26A6, 0x7DFC, 0x7DFF, 0x436D, + 0x7E00, 0x7E07, 0x4371, 0x7E08, 0x7E08, 0x234E, 0x7E09, 0x7E09, 0x2446, + 0x7E0A, 0x7E0A, 0x244B, 0x7E0B, 0x7E0B, 0x2444, 0x7E0C, 0x7E0F, 0x4379, + 0x7E10, 0x7E10, 0x2427, 0x7E11, 0x7E11, 0x244C, 0x7E12, 0x7E1A, 0x437D, + 0x7E1B, 0x7E1B, 0x1F0F, 0x7E1C, 0x7E1C, 0x4386, 0x7E1D, 0x7E1D, 0x2447, + 0x7E1E, 0x7E1E, 0x2449, 0x7E1F, 0x7E1F, 0x2448, 0x7E20, 0x7E22, 0x4387, + 0x7E23, 0x7E23, 0x21C2, 0x7E24, 0x7E26, 0x438A, 0x7E27, 0x7E27, 0x216E, + 0x7E28, 0x7E2A, 0x438D, 0x7E2B, 0x7E2B, 0x1F03, 0x7E2C, 0x7E2C, 0x4390, + 0x7E2D, 0x7E2D, 0x244A, 0x7E2E, 0x7E2E, 0x215C, 0x7E2F, 0x7E30, 0x4391, + 0x7E31, 0x7E31, 0x22BB, 0x7E32, 0x7E32, 0x2450, 0x7E33, 0x7E33, 0x4393, + 0x7E34, 0x7E34, 0x2694, 0x7E35, 0x7E35, 0x244F, 0x7E36, 0x7E36, 0x25F6, + 0x7E37, 0x7E37, 0x2051, 0x7E38, 0x7E38, 0x4394, 0x7E39, 0x7E39, 0x244E, + 0x7E3A, 0x7E3A, 0x4395, 0x7E3B, 0x7E3B, 0x1DFB, 0x7E3C, 0x7E3C, 0x4396, + 0x7E3D, 0x7E3D, 0x22BA, 0x7E3E, 0x7E3E, 0x1F6D, 0x7E3F, 0x7E40, 0x4397, + 0x7E41, 0x7E41, 0x064E, 0x7E42, 0x7E44, 0x4399, 0x7E45, 0x7E45, 0x2452, + 0x7E46, 0x7E46, 0x2451, 0x7E47, 0x7E47, 0x1CEB, 0x7E48, 0x7E51, 0x439C, + 0x7E52, 0x7E52, 0x2455, 0x7E53, 0x7E53, 0x43A6, 0x7E54, 0x7E54, 0x2289, + 0x7E55, 0x7E55, 0x2116, 0x7E56, 0x7E59, 0x43A7, 0x7E5A, 0x7E5A, 0x2454, + 0x7E5B, 0x7E5D, 0x43AB, 0x7E5E, 0x7E5E, 0x20FB, 0x7E5F, 0x7E61, 0x43AE, + 0x7E62, 0x7E62, 0x2440, 0x7E63, 0x7E68, 0x43B1, 0x7E69, 0x7E69, 0x2126, + 0x7E6A, 0x7E6A, 0x1F61, 0x7E6B, 0x7E6B, 0x269D, 0x7E6C, 0x7E6C, 0x43B7, + 0x7E6D, 0x7E6D, 0x1F8A, 0x7E6E, 0x7E6E, 0x2456, 0x7E6F, 0x7E6F, 0x2459, + 0x7E70, 0x7E70, 0x2458, 0x7E71, 0x7E72, 0x43B8, 0x7E73, 0x7E73, 0x1FAE, + 0x7E74, 0x7E78, 0x43BA, 0x7E79, 0x7E79, 0x221A, 0x7E7A, 0x7E7B, 0x43BF, + 0x7E7C, 0x7E7C, 0x1F7A, 0x7E7D, 0x7E7D, 0x244D, 0x7E7E, 0x7E7E, 0x2457, + 0x7E7F, 0x7E81, 0x43C1, 0x7E82, 0x7E82, 0x1248, 0x7E83, 0x7E87, 0x43C4, + 0x7E88, 0x7E88, 0x2453, 0x7E89, 0x7E89, 0x43C9, 0x7E8A, 0x7E8A, 0x2420, + 0x7E8B, 0x7E8B, 0x43CA, 0x7E8C, 0x7E8C, 0x21DF, 0x7E8D, 0x7E8D, 0x2685, + 0x7E8E, 0x7E8E, 0x43CB, 0x7E8F, 0x7E8F, 0x1E6E, 0x7E90, 0x7E92, 0x43CC, + 0x7E93, 0x7E93, 0x2224, 0x7E94, 0x7E94, 0x2670, 0x7E95, 0x7E95, 0x43CF, + 0x7E96, 0x7E96, 0x21BA, 0x7E97, 0x7E97, 0x43D0, 0x7E98, 0x7E98, 0x245A, + 0x7E99, 0x7E9A, 0x43D1, 0x7E9B, 0x7E9B, 0x1CEC, 0x7E9C, 0x7E9C, 0x1FFF, + 0x7E9D, 0x7E9E, 0x43D3, 0x7E9F, 0x7E9F, 0x17D3, 0x7EA0, 0x7EA0, 0x08EF, + 0x7EA1, 0x7EA1, 0x17D4, 0x7EA2, 0x7EA2, 0x07A3, 0x7EA3, 0x7EA3, 0x17D5, + 0x7EA4, 0x7EA4, 0x0F38, 0x7EA5, 0x7EA5, 0x17D6, 0x7EA6, 0x7EA6, 0x10FF, + 0x7EA7, 0x7EA7, 0x0829, 0x7EA8, 0x7EA9, 0x17D7, 0x7EAA, 0x7EAA, 0x0840, + 0x7EAB, 0x7EAB, 0x0CAD, 0x7EAC, 0x7EAC, 0x0EC2, 0x7EAD, 0x7EAD, 0x17D9, + 0x7EAE, 0x7EAE, 0x43D5, 0x7EAF, 0x7EAF, 0x0542, 0x7EB0, 0x7EB0, 0x17DA, + 0x7EB1, 0x7EB1, 0x0CED, 0x7EB2, 0x7EB2, 0x06D4, 0x7EB3, 0x7EB3, 0x0B2C, + 0x7EB4, 0x7EB4, 0x43D6, 0x7EB5, 0x7EB5, 0x123A, 0x7EB6, 0x7EB6, 0x0A81, + 0x7EB7, 0x7EB7, 0x0674, 0x7EB8, 0x7EB8, 0x11BC, 0x7EB9, 0x7EB9, 0x0ED5, + 0x7EBA, 0x7EBA, 0x0661, 0x7EBB, 0x7EBC, 0x43D7, 0x7EBD, 0x7EBD, 0x0B67, + 0x7EBE, 0x7EBE, 0x17DB, 0x7EBF, 0x7EBF, 0x0F4C, 0x7EC0, 0x7EC2, 0x17DC, + 0x7EC3, 0x7EC3, 0x0A00, 0x7EC4, 0x7EC4, 0x1246, 0x7EC5, 0x7EC5, 0x0D29, + 0x7EC6, 0x7EC6, 0x0F25, 0x7EC7, 0x7EC7, 0x11AE, 0x7EC8, 0x7EC8, 0x11D4, + 0x7EC9, 0x7EC9, 0x17DF, 0x7ECA, 0x7ECA, 0x03F8, 0x7ECB, 0x7ECC, 0x17E0, + 0x7ECD, 0x7ECD, 0x0D15, 0x7ECE, 0x7ECE, 0x1076, 0x7ECF, 0x7ECF, 0x08DC, + 0x7ED0, 0x7ED0, 0x17E2, 0x7ED1, 0x7ED1, 0x03FE, 0x7ED2, 0x7ED2, 0x0CB9, + 0x7ED3, 0x7ED3, 0x08B2, 0x7ED4, 0x7ED4, 0x17E3, 0x7ED5, 0x7ED5, 0x0CA1, + 0x7ED6, 0x7ED6, 0x43D9, 0x7ED7, 0x7ED7, 0x17E4, 0x7ED8, 0x7ED8, 0x07FB, + 0x7ED9, 0x7ED9, 0x06F3, 0x7EDA, 0x7EDA, 0x0FCD, 0x7EDB, 0x7EDB, 0x17E5, + 0x7EDC, 0x7EDC, 0x0A8E, 0x7EDD, 0x7EDD, 0x0927, 0x7EDE, 0x7EDE, 0x089B, + 0x7EDF, 0x7EDF, 0x0E64, 0x7EE0, 0x7EE1, 0x17E6, 0x7EE2, 0x7EE2, 0x091D, + 0x7EE3, 0x7EE3, 0x0FB0, 0x7EE4, 0x7EE4, 0x43DA, 0x7EE5, 0x7EE5, 0x0DDC, + 0x7EE6, 0x7EE6, 0x0E23, 0x7EE7, 0x7EE7, 0x083F, 0x7EE8, 0x7EE8, 0x17E8, + 0x7EE9, 0x7EE9, 0x081B, 0x7EEA, 0x7EEA, 0x0FC2, 0x7EEB, 0x7EEB, 0x17E9, + 0x7EEC, 0x7EEC, 0x43DB, 0x7EED, 0x7EED, 0x0FC3, 0x7EEE, 0x7EEF, 0x17EA, + 0x7EF0, 0x7EF0, 0x0545, 0x7EF1, 0x7EF2, 0x17EC, 0x7EF3, 0x7EF3, 0x0D37, + 0x7EF4, 0x7EF4, 0x0EBB, 0x7EF5, 0x7EF5, 0x0AE5, 0x7EF6, 0x7EF6, 0x17EF, + 0x7EF7, 0x7EF7, 0x042A, 0x7EF8, 0x7EF8, 0x0516, 0x7EF9, 0x7EF9, 0x43DC, + 0x7EFA, 0x7EFB, 0x17F0, 0x7EFC, 0x7EFC, 0x1238, 0x7EFD, 0x7EFD, 0x1161, + 0x7EFE, 0x7EFE, 0x17F2, 0x7EFF, 0x7EFF, 0x0A73, 0x7F00, 0x7F00, 0x1217, + 0x7F01, 0x7F03, 0x17F3, 0x7F04, 0x7F04, 0x085D, 0x7F05, 0x7F05, 0x0AEA, + 0x7F06, 0x7F06, 0x09AD, 0x7F07, 0x7F08, 0x17F6, 0x7F09, 0x7F09, 0x081C, + 0x7F0A, 0x7F0A, 0x43DD, 0x7F0B, 0x7F0C, 0x17F8, 0x7F0D, 0x7F0D, 0x17EE, + 0x7F0E, 0x7F0E, 0x060F, 0x7F0F, 0x7F0F, 0x17FA, 0x7F10, 0x7F10, 0x43DE, + 0x7F11, 0x7F12, 0x17FB, 0x7F13, 0x7F13, 0x07CF, 0x7F14, 0x7F14, 0x05BF, + 0x7F15, 0x7F15, 0x0A6D, 0x7F16, 0x7F16, 0x0449, 0x7F17, 0x7F17, 0x17FD, + 0x7F18, 0x7F18, 0x10F8, 0x7F19, 0x7F19, 0x17FE, 0x7F1A, 0x7F1A, 0x06BA, + 0x7F1B, 0x7F1B, 0x1800, 0x7F1C, 0x7F1C, 0x17FF, 0x7F1D, 0x7F1D, 0x0689, + 0x7F1E, 0x7F1E, 0x43DF, 0x7F1F, 0x7F1F, 0x1801, 0x7F20, 0x7F20, 0x04BF, + 0x7F21, 0x7F27, 0x1802, 0x7F28, 0x7F28, 0x108C, 0x7F29, 0x7F29, 0x0DEA, + 0x7F2A, 0x7F2D, 0x1809, 0x7F2E, 0x7F2E, 0x0D02, 0x7F2F, 0x7F33, 0x180D, + 0x7F34, 0x7F34, 0x089A, 0x7F35, 0x7F35, 0x1812, 0x7F36, 0x7F36, 0x1C5E, + 0x7F37, 0x7F37, 0x43E0, 0x7F38, 0x7F38, 0x06D2, 0x7F39, 0x7F39, 0x43E1, + 0x7F3A, 0x7F3A, 0x0C8C, 0x7F3B, 0x7F41, 0x43E2, 0x7F42, 0x7F42, 0x1C5F, + 0x7F43, 0x7F43, 0x43E9, 0x7F44, 0x7F45, 0x1C60, 0x7F46, 0x7F4B, 0x43EA, + 0x7F4C, 0x7F4C, 0x25E2, 0x7F4D, 0x7F4D, 0x43F0, 0x7F4E, 0x7F4E, 0x269A, + 0x7F4F, 0x7F4F, 0x43F1, 0x7F50, 0x7F50, 0x0737, 0x7F51, 0x7F51, 0x0EA9, + 0x7F52, 0x7F53, 0x43F2, 0x7F54, 0x7F54, 0x129E, 0x7F55, 0x7F55, 0x0768, + 0x7F56, 0x7F56, 0x43F4, 0x7F57, 0x7F57, 0x0A85, 0x7F58, 0x7F58, 0x1A81, + 0x7F59, 0x7F59, 0x43F5, 0x7F5A, 0x7F5A, 0x0640, 0x7F5B, 0x7F5E, 0x43F6, + 0x7F5F, 0x7F5F, 0x1A83, 0x7F60, 0x7F60, 0x43FA, 0x7F61, 0x7F61, 0x1A82, + 0x7F62, 0x7F62, 0x03E0, 0x7F63, 0x7F67, 0x43FB, 0x7F68, 0x7F68, 0x1A85, + 0x7F69, 0x7F69, 0x1177, 0x7F6A, 0x7F6A, 0x124C, 0x7F6B, 0x7F6D, 0x4400, + 0x7F6E, 0x7F6E, 0x11C2, 0x7F6F, 0x7F6F, 0x4403, 0x7F70, 0x7F70, 0x1EEA, + 0x7F71, 0x7F71, 0x1A87, 0x7F72, 0x7F72, 0x0D87, 0x7F73, 0x7F73, 0x4404, + 0x7F74, 0x7F74, 0x1A86, 0x7F75, 0x7F76, 0x4405, 0x7F77, 0x7F77, 0x1E2C, + 0x7F78, 0x7F78, 0x4407, 0x7F79, 0x7F79, 0x1A88, 0x7F7A, 0x7F7D, 0x4408, + 0x7F7E, 0x7F7E, 0x1A8A, 0x7F7F, 0x7F80, 0x440C, 0x7F81, 0x7F81, 0x1A89, + 0x7F82, 0x7F84, 0x440E, 0x7F85, 0x7F85, 0x2062, 0x7F86, 0x7F86, 0x24F1, + 0x7F87, 0x7F87, 0x4411, 0x7F88, 0x7F88, 0x24F2, 0x7F89, 0x7F89, 0x4412, + 0x7F8A, 0x7F8A, 0x101B, 0x7F8B, 0x7F8B, 0x4413, 0x7F8C, 0x7F8C, 0x0C39, + 0x7F8D, 0x7F8D, 0x4414, 0x7F8E, 0x7F8E, 0x0AC5, 0x7F8F, 0x7F93, 0x4415, + 0x7F94, 0x7F94, 0x06DC, 0x7F95, 0x7F99, 0x441A, 0x7F9A, 0x7F9A, 0x0A30, + 0x7F9B, 0x7F9C, 0x441F, 0x7F9D, 0x7F9D, 0x1CC4, 0x7F9E, 0x7F9E, 0x0FAA, + 0x7F9F, 0x7F9F, 0x1CC5, 0x7FA0, 0x7FA0, 0x4421, 0x7FA1, 0x7FA1, 0x0F48, + 0x7FA2, 0x7FA3, 0x4422, 0x7FA4, 0x7FA4, 0x0C95, 0x7FA5, 0x7FA5, 0x25F2, + 0x7FA6, 0x7FA6, 0x4424, 0x7FA7, 0x7FA7, 0x1CC6, 0x7FA8, 0x7FA8, 0x4425, + 0x7FA9, 0x7FA9, 0x2215, 0x7FAA, 0x7FAE, 0x4426, 0x7FAF, 0x7FB0, 0x1CC7, + 0x7FB1, 0x7FB1, 0x442B, 0x7FB2, 0x7FB2, 0x1CC9, 0x7FB3, 0x7FB7, 0x442C, + 0x7FB8, 0x7FB8, 0x130E, 0x7FB9, 0x7FB9, 0x06F9, 0x7FBA, 0x7FBB, 0x4431, + 0x7FBC, 0x7FBC, 0x176D, 0x7FBD, 0x7FBD, 0x10D5, 0x7FBE, 0x7FBE, 0x4433, + 0x7FBF, 0x7FBF, 0x1CDE, 0x7FC0, 0x7FC0, 0x4434, 0x7FC1, 0x7FC1, 0x0EDB, + 0x7FC2, 0x7FC4, 0x4435, 0x7FC5, 0x7FC5, 0x0506, 0x7FC6, 0x7FC9, 0x4438, + 0x7FCA, 0x7FCA, 0x1B98, 0x7FCB, 0x7FCB, 0x443C, 0x7FCC, 0x7FCC, 0x1075, + 0x7FCD, 0x7FCD, 0x443D, 0x7FCE, 0x7FCE, 0x1CDF, 0x7FCF, 0x7FD1, 0x443E, + 0x7FD2, 0x7FD2, 0x21AE, 0x7FD3, 0x7FD3, 0x4441, 0x7FD4, 0x7FD4, 0x0F55, + 0x7FD5, 0x7FD5, 0x1CE0, 0x7FD6, 0x7FD7, 0x4442, 0x7FD8, 0x7FD8, 0x0C49, + 0x7FD9, 0x7FDE, 0x4444, 0x7FDF, 0x7FDF, 0x05B5, 0x7FE0, 0x7FE0, 0x0567, + 0x7FE1, 0x7FE1, 0x1CE2, 0x7FE2, 0x7FE4, 0x444A, 0x7FE5, 0x7FE5, 0x1CE1, + 0x7FE6, 0x7FE6, 0x1CE3, 0x7FE7, 0x7FE8, 0x444D, 0x7FE9, 0x7FE9, 0x1CE4, + 0x7FEA, 0x7FED, 0x444F, 0x7FEE, 0x7FEE, 0x1CE5, 0x7FEF, 0x7FEF, 0x4453, + 0x7FF0, 0x7FF0, 0x0769, 0x7FF1, 0x7FF1, 0x03CA, 0x7FF2, 0x7FF2, 0x4454, + 0x7FF3, 0x7FF3, 0x1CE6, 0x7FF4, 0x7FF8, 0x4455, 0x7FF9, 0x7FF9, 0x20E0, + 0x7FFA, 0x7FFA, 0x445A, 0x7FFB, 0x7FFB, 0x064A, 0x7FFC, 0x7FFC, 0x1074, + 0x7FFD, 0x7FFF, 0x445B, 0x8000, 0x8000, 0x1032, 0x8001, 0x8001, 0x09BA, + 0x8002, 0x8002, 0x445E, 0x8003, 0x8003, 0x0949, 0x8004, 0x8004, 0x1953, + 0x8005, 0x8005, 0x1180, 0x8006, 0x8006, 0x191A, 0x8007, 0x800A, 0x445F, + 0x800B, 0x800B, 0x1BD7, 0x800C, 0x800C, 0x0637, 0x800D, 0x800D, 0x0D98, + 0x800E, 0x800F, 0x4463, 0x8010, 0x8010, 0x0B30, 0x8011, 0x8011, 0x4465, + 0x8012, 0x8012, 0x1BCB, 0x8013, 0x8013, 0x4466, 0x8014, 0x8014, 0x1BCC, + 0x8015, 0x8015, 0x06F6, 0x8016, 0x8016, 0x1BCD, 0x8017, 0x8017, 0x077B, + 0x8018, 0x8018, 0x1108, 0x8019, 0x8019, 0x03DD, 0x801A, 0x801B, 0x4467, + 0x801C, 0x801C, 0x1BCE, 0x801D, 0x801F, 0x4469, 0x8020, 0x8020, 0x1BCF, + 0x8021, 0x8021, 0x446C, 0x8022, 0x8022, 0x1BD0, 0x8023, 0x8024, 0x446D, + 0x8025, 0x8027, 0x1BD1, 0x8028, 0x8028, 0x1BD5, 0x8029, 0x8029, 0x1BD4, + 0x802A, 0x802A, 0x0B96, 0x802B, 0x802B, 0x446F, 0x802C, 0x802C, 0x25C2, + 0x802D, 0x802D, 0x4470, 0x802E, 0x802E, 0x25C1, 0x802F, 0x8030, 0x4471, + 0x8031, 0x8031, 0x1BD6, 0x8032, 0x8032, 0x4473, 0x8033, 0x8033, 0x0639, + 0x8034, 0x8034, 0x4474, 0x8035, 0x8035, 0x1BD8, 0x8036, 0x8036, 0x1035, + 0x8037, 0x8037, 0x14B1, 0x8038, 0x8038, 0x0DBF, 0x8039, 0x803A, 0x4475, + 0x803B, 0x803B, 0x0501, 0x803C, 0x803C, 0x4477, 0x803D, 0x803D, 0x0583, + 0x803E, 0x803E, 0x4478, 0x803F, 0x803F, 0x06FB, 0x8040, 0x8041, 0x4479, + 0x8042, 0x8042, 0x0B57, 0x8043, 0x8043, 0x1BD9, 0x8044, 0x8045, 0x447B, + 0x8046, 0x8046, 0x1BDA, 0x8047, 0x8049, 0x447D, 0x804A, 0x804A, 0x0A0D, + 0x804B, 0x804B, 0x0A44, 0x804C, 0x804C, 0x11AF, 0x804D, 0x804D, 0x1BDB, + 0x804E, 0x8051, 0x4480, 0x8052, 0x8052, 0x1BDC, 0x8053, 0x8053, 0x4484, + 0x8054, 0x8054, 0x09F3, 0x8055, 0x8055, 0x4485, 0x8056, 0x8056, 0x2128, + 0x8057, 0x8057, 0x4486, 0x8058, 0x8058, 0x0BD7, 0x8059, 0x8059, 0x4487, + 0x805A, 0x805A, 0x090A, 0x805B, 0x805D, 0x4488, 0x805E, 0x805E, 0x2199, + 0x805F, 0x8068, 0x448B, 0x8069, 0x8069, 0x1BDD, 0x806A, 0x806A, 0x0552, + 0x806B, 0x806E, 0x4495, 0x806F, 0x806F, 0x2017, 0x8070, 0x8070, 0x1EA0, + 0x8071, 0x8071, 0x1BDE, 0x8072, 0x8072, 0x2125, 0x8073, 0x8073, 0x214D, + 0x8074, 0x8074, 0x4499, 0x8075, 0x8075, 0x25C4, 0x8076, 0x8076, 0x209D, + 0x8077, 0x8077, 0x228A, 0x8078, 0x8078, 0x449A, 0x8079, 0x8079, 0x25C3, + 0x807A, 0x807C, 0x449B, 0x807D, 0x807D, 0x2179, 0x807E, 0x807E, 0x2038, + 0x807F, 0x807F, 0x1A1E, 0x8080, 0x8080, 0x1A1D, 0x8081, 0x8082, 0x449E, + 0x8083, 0x8083, 0x0DD5, 0x8084, 0x8084, 0x1065, 0x8085, 0x8085, 0x2155, + 0x8086, 0x8086, 0x0DB6, 0x8087, 0x8087, 0x1179, 0x8088, 0x8088, 0x44A0, + 0x8089, 0x8089, 0x0CBD, 0x808A, 0x808A, 0x44A1, 0x808B, 0x808B, 0x09CA, + 0x808C, 0x808C, 0x0814, 0x808D, 0x8092, 0x44A2, 0x8093, 0x8093, 0x1971, + 0x8094, 0x8095, 0x44A8, 0x8096, 0x8096, 0x0F6F, 0x8097, 0x8097, 0x44AA, + 0x8098, 0x8098, 0x11E1, 0x8099, 0x8099, 0x44AB, 0x809A, 0x809A, 0x0606, + 0x809B, 0x809B, 0x06D3, 0x809C, 0x809C, 0x1970, 0x809D, 0x809D, 0x06C9, + 0x809E, 0x809E, 0x44AC, 0x809F, 0x809F, 0x196F, 0x80A0, 0x80A0, 0x04CB, + 0x80A1, 0x80A1, 0x0722, 0x80A2, 0x80A2, 0x11AA, 0x80A3, 0x80A3, 0x44AD, + 0x80A4, 0x80A4, 0x0691, 0x80A5, 0x80A5, 0x0667, 0x80A6, 0x80A8, 0x44AE, + 0x80A9, 0x80A9, 0x085A, 0x80AA, 0x80AA, 0x065B, 0x80AB, 0x80AB, 0x1976, + 0x80AC, 0x80AC, 0x44B1, 0x80AD, 0x80AD, 0x1977, 0x80AE, 0x80AE, 0x03C4, + 0x80AF, 0x80AF, 0x095C, 0x80B0, 0x80B0, 0x44B2, 0x80B1, 0x80B1, 0x1975, + 0x80B2, 0x80B2, 0x10E2, 0x80B3, 0x80B3, 0x44B3, 0x80B4, 0x80B4, 0x1978, + 0x80B5, 0x80B6, 0x44B4, 0x80B7, 0x80B7, 0x1979, 0x80B8, 0x80B9, 0x44B6, + 0x80BA, 0x80BA, 0x066B, 0x80BB, 0x80BB, 0x44B8, 0x80BC, 0x80BC, 0x1972, + 0x80BD, 0x80BD, 0x1974, 0x80BE, 0x80BE, 0x0D2F, 0x80BF, 0x80BF, 0x11D6, + 0x80C0, 0x80C0, 0x116E, 0x80C1, 0x80C1, 0x0F7D, 0x80C2, 0x80C2, 0x197F, + 0x80C3, 0x80C3, 0x0EC7, 0x80C4, 0x80C4, 0x1980, 0x80C5, 0x80C5, 0x44B9, + 0x80C6, 0x80C6, 0x0589, 0x80C7, 0x80CB, 0x44BA, 0x80CC, 0x80CC, 0x041C, + 0x80CD, 0x80CD, 0x1982, 0x80CE, 0x80CE, 0x0DF8, 0x80CF, 0x80D5, 0x44BF, + 0x80D6, 0x80D6, 0x0B97, 0x80D7, 0x80D7, 0x1983, 0x80D8, 0x80D8, 0x44C6, + 0x80D9, 0x80D9, 0x1981, 0x80DA, 0x80DA, 0x0BA0, 0x80DB, 0x80DB, 0x197E, + 0x80DC, 0x80DC, 0x0D3B, 0x80DD, 0x80DD, 0x1985, 0x80DE, 0x80DE, 0x0406, + 0x80DF, 0x80E0, 0x44C7, 0x80E1, 0x80E1, 0x07B1, 0x80E2, 0x80E3, 0x44C9, + 0x80E4, 0x80E4, 0x126D, 0x80E5, 0x80E5, 0x1BC7, 0x80E6, 0x80E6, 0x44CB, + 0x80E7, 0x80EA, 0x197A, 0x80EB, 0x80EB, 0x1986, 0x80EC, 0x80EC, 0x179A, + 0x80ED, 0x80ED, 0x1989, 0x80EE, 0x80EE, 0x44CC, 0x80EF, 0x80EF, 0x0975, + 0x80F0, 0x80F0, 0x104F, 0x80F1, 0x80F1, 0x1987, 0x80F2, 0x80F2, 0x198C, + 0x80F3, 0x80F3, 0x06E7, 0x80F4, 0x80F4, 0x1988, 0x80F5, 0x80F5, 0x44CD, + 0x80F6, 0x80F6, 0x088B, 0x80F7, 0x80F7, 0x44CE, 0x80F8, 0x80F8, 0x0FA3, + 0x80F9, 0x80F9, 0x44CF, 0x80FA, 0x80FA, 0x03C2, 0x80FB, 0x80FB, 0x44D0, + 0x80FC, 0x80FC, 0x198D, 0x80FD, 0x80FD, 0x0B3F, 0x80FE, 0x80FF, 0x44D1, + 0x8100, 0x8101, 0x44D3, 0x8102, 0x8102, 0x11AB, 0x8103, 0x8104, 0x44D5, + 0x8105, 0x8105, 0x21D2, 0x8106, 0x8106, 0x0563, 0x8107, 0x8108, 0x44D7, + 0x8109, 0x8109, 0x0A9D, 0x810A, 0x810A, 0x082C, 0x810B, 0x810C, 0x44D9, + 0x810D, 0x810E, 0x198A, 0x810F, 0x810F, 0x1123, 0x8110, 0x8110, 0x0C09, + 0x8111, 0x8111, 0x0B37, 0x8112, 0x8112, 0x198F, 0x8113, 0x8113, 0x0B68, + 0x8114, 0x8114, 0x1309, 0x8115, 0x8115, 0x44DB, 0x8116, 0x8116, 0x0478, + 0x8117, 0x8117, 0x44DC, 0x8118, 0x8118, 0x1994, 0x8119, 0x8119, 0x44DD, + 0x811A, 0x811A, 0x0896, 0x811B, 0x811B, 0x24C7, 0x811C, 0x811D, 0x44DE, + 0x811E, 0x811E, 0x1992, 0x811F, 0x812B, 0x44E0, 0x812C, 0x812C, 0x1993, + 0x812D, 0x812E, 0x44ED, 0x812F, 0x812F, 0x06A7, 0x8130, 0x8130, 0x44EF, + 0x8131, 0x8131, 0x0E82, 0x8132, 0x8132, 0x1995, 0x8133, 0x8135, 0x44F0, + 0x8136, 0x8136, 0x1991, 0x8137, 0x8137, 0x44F3, 0x8138, 0x8138, 0x09FC, + 0x8139, 0x8139, 0x2279, 0x813A, 0x813D, 0x44F4, 0x813E, 0x813E, 0x0BC1, + 0x813F, 0x8145, 0x44F8, 0x8146, 0x8146, 0x0E46, 0x8147, 0x8147, 0x44FF, + 0x8148, 0x8148, 0x1996, 0x8149, 0x8149, 0x4500, 0x814A, 0x814A, 0x099B, + 0x814B, 0x814B, 0x103F, 0x814C, 0x814C, 0x1997, 0x814D, 0x814D, 0x4501, + 0x814E, 0x814E, 0x2123, 0x814F, 0x814F, 0x4502, 0x8150, 0x8150, 0x06AA, + 0x8151, 0x8151, 0x06A8, 0x8152, 0x8152, 0x4503, 0x8153, 0x8153, 0x1998, + 0x8154, 0x8154, 0x0C38, 0x8155, 0x8155, 0x0EA4, 0x8156, 0x8156, 0x24C5, + 0x8157, 0x8158, 0x4504, 0x8159, 0x815A, 0x199A, 0x815B, 0x815F, 0x4506, + 0x8160, 0x8160, 0x199D, 0x8161, 0x8161, 0x24C9, 0x8162, 0x8164, 0x450B, + 0x8165, 0x8165, 0x0F93, 0x8166, 0x8166, 0x2094, 0x8167, 0x8167, 0x19A2, + 0x8168, 0x8168, 0x450E, 0x8169, 0x8169, 0x199E, 0x816A, 0x816A, 0x450F, + 0x816B, 0x816B, 0x2296, 0x816C, 0x816C, 0x4510, 0x816D, 0x816D, 0x19A1, + 0x816E, 0x816E, 0x0CD4, 0x816F, 0x816F, 0x4511, 0x8170, 0x8170, 0x1025, + 0x8171, 0x8171, 0x199C, 0x8172, 0x8173, 0x4512, 0x8174, 0x8174, 0x1999, + 0x8175, 0x8177, 0x4514, 0x8178, 0x8178, 0x1E77, 0x8179, 0x8179, 0x06B4, + 0x817A, 0x817A, 0x0F46, 0x817B, 0x817B, 0x0B48, 0x817C, 0x817D, 0x199F, + 0x817E, 0x817E, 0x0E2D, 0x817F, 0x817F, 0x0E79, 0x8180, 0x8180, 0x03FD, + 0x8181, 0x8181, 0x4517, 0x8182, 0x8182, 0x19A6, 0x8183, 0x8187, 0x4518, + 0x8188, 0x8188, 0x19A5, 0x8189, 0x8189, 0x451D, 0x818A, 0x818A, 0x0479, + 0x818B, 0x818E, 0x451E, 0x818F, 0x818F, 0x06DB, 0x8190, 0x8190, 0x4522, + 0x8191, 0x8191, 0x19A7, 0x8192, 0x8197, 0x4523, 0x8198, 0x8198, 0x0455, + 0x8199, 0x8199, 0x4529, 0x819A, 0x819A, 0x1F06, 0x819B, 0x819B, 0x0E18, + 0x819C, 0x819C, 0x0B07, 0x819D, 0x819D, 0x0F12, 0x819E, 0x819F, 0x452A, + 0x81A0, 0x81A0, 0x1FA5, 0x81A1, 0x81A2, 0x452C, 0x81A3, 0x81A3, 0x19A9, + 0x81A4, 0x81A5, 0x452E, 0x81A6, 0x81A6, 0x19B0, 0x81A7, 0x81A7, 0x4530, + 0x81A8, 0x81A8, 0x0BB3, 0x81A9, 0x81A9, 0x2099, 0x81AA, 0x81AA, 0x19AA, + 0x81AB, 0x81B2, 0x4531, 0x81B3, 0x81B3, 0x0CFE, 0x81B4, 0x81B9, 0x4539, + 0x81BA, 0x81BA, 0x1641, 0x81BB, 0x81BB, 0x19AE, 0x81BC, 0x81BC, 0x453F, + 0x81BD, 0x81BD, 0x1EAD, 0x81BE, 0x81BE, 0x24C8, 0x81BF, 0x81BF, 0x20A8, + 0x81C0, 0x81C0, 0x0E7F, 0x81C1, 0x81C1, 0x19AF, 0x81C2, 0x81C2, 0x0444, + 0x81C3, 0x81C3, 0x109C, 0x81C4, 0x81C5, 0x4540, 0x81C6, 0x81C6, 0x1063, + 0x81C7, 0x81C8, 0x4542, 0x81C9, 0x81C9, 0x201F, 0x81CA, 0x81CA, 0x19AD, + 0x81CB, 0x81CB, 0x4544, 0x81CC, 0x81CC, 0x19AB, 0x81CD, 0x81CD, 0x20C5, + 0x81CE, 0x81CE, 0x4545, 0x81CF, 0x81CF, 0x24CA, 0x81D0, 0x81D7, 0x4546, + 0x81D8, 0x81D8, 0x1FF0, 0x81D9, 0x81D9, 0x454E, 0x81DA, 0x81DA, 0x24C6, + 0x81DB, 0x81DE, 0x454F, 0x81DF, 0x81DF, 0x225D, 0x81E0, 0x81E0, 0x22DE, + 0x81E1, 0x81E2, 0x4553, 0x81E3, 0x81E3, 0x04E1, 0x81E4, 0x81E6, 0x4555, + 0x81E7, 0x81E7, 0x1902, 0x81E8, 0x81E8, 0x202C, 0x81E9, 0x81E9, 0x4558, + 0x81EA, 0x81EA, 0x1231, 0x81EB, 0x81EB, 0x4559, 0x81EC, 0x81EC, 0x1CA9, + 0x81ED, 0x81ED, 0x0519, 0x81EE, 0x81F2, 0x455A, 0x81F3, 0x81F4, 0x11C0, + 0x81F5, 0x81F9, 0x455F, 0x81FA, 0x81FA, 0x2161, 0x81FB, 0x81FB, 0x118A, + 0x81FC, 0x81FC, 0x08F9, 0x81FD, 0x81FD, 0x4564, 0x81FE, 0x81FE, 0x1CA5, + 0x81FF, 0x81FF, 0x4565, 0x8200, 0x8200, 0x102F, 0x8201, 0x8202, 0x1CA6, + 0x8203, 0x8203, 0x4566, 0x8204, 0x8204, 0x1CA8, 0x8205, 0x8205, 0x08FA, + 0x8206, 0x8206, 0x10C4, 0x8207, 0x8207, 0x223B, 0x8208, 0x8208, 0x21D9, + 0x8209, 0x8209, 0x1FCB, 0x820A, 0x820A, 0x1FC9, 0x820B, 0x820B, 0x4567, + 0x820C, 0x820D, 0x0D19, 0x820E, 0x820F, 0x4568, 0x8210, 0x8210, 0x1C62, + 0x8211, 0x8211, 0x456A, 0x8212, 0x8212, 0x0D7D, 0x8213, 0x8213, 0x456B, + 0x8214, 0x8214, 0x0E45, 0x8215, 0x821A, 0x456C, 0x821B, 0x821B, 0x1618, + 0x821C, 0x821C, 0x0DA9, 0x821D, 0x821D, 0x4572, 0x821E, 0x821E, 0x0EF7, + 0x821F, 0x821F, 0x11DA, 0x8220, 0x8220, 0x4573, 0x8221, 0x8223, 0x1CAB, + 0x8224, 0x8227, 0x4574, 0x8228, 0x8228, 0x1CB0, 0x8229, 0x8229, 0x4578, + 0x822A, 0x822A, 0x0774, 0x822B, 0x822B, 0x1CB1, 0x822C, 0x822C, 0x03EE, + 0x822D, 0x822D, 0x1CAE, 0x822E, 0x822E, 0x4579, 0x822F, 0x822F, 0x1CAF, + 0x8230, 0x8230, 0x0873, 0x8231, 0x8231, 0x049C, 0x8232, 0x8232, 0x457A, + 0x8233, 0x8234, 0x1CB4, 0x8235, 0x8235, 0x0625, 0x8236, 0x8236, 0x0477, + 0x8237, 0x8237, 0x0F3C, 0x8238, 0x8238, 0x1CB2, 0x8239, 0x8239, 0x052F, + 0x823A, 0x823A, 0x457B, 0x823B, 0x823B, 0x1CB3, 0x823C, 0x823D, 0x457C, + 0x823E, 0x823E, 0x1CB6, 0x823F, 0x8243, 0x457E, 0x8244, 0x8244, 0x1CB7, + 0x8245, 0x8246, 0x4583, 0x8247, 0x8247, 0x0E58, 0x8248, 0x8248, 0x4585, + 0x8249, 0x8249, 0x1CB8, 0x824A, 0x824A, 0x4586, 0x824B, 0x824B, 0x1CB9, + 0x824C, 0x824E, 0x4587, 0x824F, 0x824F, 0x1CBA, 0x8250, 0x8257, 0x458A, + 0x8258, 0x8258, 0x0DC7, 0x8259, 0x8259, 0x1E61, 0x825A, 0x825A, 0x1CBB, + 0x825B, 0x825E, 0x4592, 0x825F, 0x825F, 0x1CBC, 0x8260, 0x8263, 0x4596, + 0x8264, 0x8264, 0x25EF, 0x8265, 0x8265, 0x459A, 0x8266, 0x8266, 0x1F98, + 0x8267, 0x8267, 0x459B, 0x8268, 0x8268, 0x1CBD, 0x8269, 0x826A, 0x459C, + 0x826B, 0x826B, 0x25F0, 0x826C, 0x826D, 0x459E, 0x826E, 0x826E, 0x1CDC, + 0x826F, 0x826F, 0x0A05, 0x8270, 0x8270, 0x085B, 0x8271, 0x8271, 0x1F88, + 0x8272, 0x8272, 0x0CE4, 0x8273, 0x8273, 0x1007, 0x8274, 0x8274, 0x1771, + 0x8275, 0x8276, 0x45A0, 0x8277, 0x8277, 0x21F8, 0x8278, 0x8278, 0x45A2, + 0x8279, 0x8279, 0x13E1, 0x827A, 0x827A, 0x105C, 0x827B, 0x827C, 0x45A3, + 0x827D, 0x827D, 0x13E2, 0x827E, 0x827E, 0x03B7, 0x827F, 0x827F, 0x13E3, + 0x8280, 0x8281, 0x45A5, 0x8282, 0x8282, 0x08AB, 0x8283, 0x8283, 0x45A7, + 0x8284, 0x8284, 0x13E7, 0x8285, 0x8287, 0x45A8, 0x8288, 0x8288, 0x1278, + 0x8289, 0x8289, 0x45AB, 0x828A, 0x828A, 0x13E5, 0x828B, 0x828B, 0x10D8, + 0x828C, 0x828C, 0x45AC, 0x828D, 0x828D, 0x0D0F, 0x828E, 0x828E, 0x13E8, + 0x828F, 0x828F, 0x13E4, 0x8290, 0x8290, 0x45AD, 0x8291, 0x8291, 0x13E9, + 0x8292, 0x8292, 0x0AA7, 0x8293, 0x8296, 0x45AE, 0x8297, 0x8297, 0x13EA, + 0x8298, 0x8298, 0x13F3, 0x8299, 0x8299, 0x13EB, 0x829A, 0x829B, 0x45B2, + 0x829C, 0x829C, 0x0EEE, 0x829D, 0x829D, 0x11A4, 0x829E, 0x829E, 0x45B4, + 0x829F, 0x829F, 0x13FD, 0x82A0, 0x82A0, 0x45B5, 0x82A1, 0x82A1, 0x13FB, + 0x82A2, 0x82A3, 0x45B6, 0x82A4, 0x82A4, 0x1400, 0x82A5, 0x82A5, 0x08B7, + 0x82A6, 0x82A6, 0x0A52, 0x82A7, 0x82A7, 0x45B8, 0x82A8, 0x82A8, 0x13E6, + 0x82A9, 0x82A9, 0x13F9, 0x82AA, 0x82AA, 0x13FC, 0x82AB, 0x82AB, 0x13EC, + 0x82AC, 0x82AC, 0x066F, 0x82AD, 0x82AD, 0x03D0, 0x82AE, 0x82AE, 0x13F5, + 0x82AF, 0x82AF, 0x0F89, 0x82B0, 0x82B0, 0x13EF, 0x82B1, 0x82B1, 0x07BD, + 0x82B2, 0x82B2, 0x45B9, 0x82B3, 0x82B3, 0x0659, 0x82B4, 0x82B4, 0x13FA, + 0x82B5, 0x82B6, 0x45BA, 0x82B7, 0x82B7, 0x13F4, 0x82B8, 0x82B8, 0x13ED, + 0x82B9, 0x82B9, 0x0C58, 0x82BA, 0x82BA, 0x45BC, 0x82BB, 0x82BB, 0x2322, + 0x82BC, 0x82BC, 0x45BD, 0x82BD, 0x82BD, 0x0FE8, 0x82BE, 0x82BE, 0x13EE, + 0x82BF, 0x82C0, 0x45BE, 0x82C1, 0x82C1, 0x13F8, 0x82C2, 0x82C3, 0x45C0, + 0x82C4, 0x82C4, 0x13FE, 0x82C5, 0x82C6, 0x45C2, 0x82C7, 0x82C7, 0x0EBC, + 0x82C8, 0x82C8, 0x13F0, 0x82C9, 0x82C9, 0x45C4, 0x82CA, 0x82CA, 0x13F1, + 0x82CB, 0x82CC, 0x13F6, 0x82CD, 0x82CD, 0x049B, 0x82CE, 0x82CE, 0x13FF, + 0x82CF, 0x82CF, 0x0DCA, 0x82D0, 0x82D0, 0x45C5, 0x82D1, 0x82D1, 0x10FA, + 0x82D2, 0x82D2, 0x1409, 0x82D3, 0x82D3, 0x140D, 0x82D4, 0x82D4, 0x0DF9, + 0x82D5, 0x82D5, 0x1414, 0x82D6, 0x82D6, 0x45C6, 0x82D7, 0x82D7, 0x0AEC, + 0x82D8, 0x82D8, 0x140A, 0x82D9, 0x82DA, 0x45C7, 0x82DB, 0x82DB, 0x094E, + 0x82DC, 0x82DC, 0x1407, 0x82DD, 0x82DD, 0x45C9, 0x82DE, 0x82DE, 0x0405, + 0x82DF, 0x82DF, 0x070F, 0x82E0, 0x82E0, 0x1413, 0x82E1, 0x82E1, 0x1401, + 0x82E2, 0x82E2, 0x45CA, 0x82E3, 0x82E3, 0x13F2, 0x82E4, 0x82E4, 0x1404, + 0x82E5, 0x82E5, 0x0CCF, 0x82E6, 0x82E6, 0x096D, 0x82E7, 0x82E7, 0x2336, + 0x82E8, 0x82EA, 0x45CB, 0x82EB, 0x82EB, 0x0CF4, 0x82EC, 0x82EE, 0x45CE, + 0x82EF, 0x82EF, 0x0426, 0x82F0, 0x82F0, 0x45D1, 0x82F1, 0x82F1, 0x1087, + 0x82F2, 0x82F3, 0x45D2, 0x82F4, 0x82F4, 0x1408, 0x82F5, 0x82F6, 0x45D4, + 0x82F7, 0x82F7, 0x1403, 0x82F8, 0x82F8, 0x45D6, 0x82F9, 0x82F9, 0x0BDA, + 0x82FA, 0x82FA, 0x45D7, 0x82FB, 0x82FB, 0x140C, 0x82FC, 0x82FF, 0x45D8, + 0x8300, 0x8300, 0x45DC, 0x8301, 0x8301, 0x121F, 0x8302, 0x8302, 0x0AB4, + 0x8303, 0x8303, 0x0653, 0x8304, 0x8304, 0x0C4E, 0x8305, 0x8305, 0x0AAE, + 0x8306, 0x8306, 0x1410, 0x8307, 0x8307, 0x1406, 0x8308, 0x8308, 0x1419, + 0x8309, 0x8309, 0x1402, 0x830A, 0x830B, 0x45DD, 0x830C, 0x830C, 0x140B, + 0x830D, 0x830D, 0x45DF, 0x830E, 0x830E, 0x08D4, 0x830F, 0x830F, 0x1405, + 0x8310, 0x8310, 0x45E0, 0x8311, 0x8311, 0x140E, 0x8312, 0x8313, 0x45E1, + 0x8314, 0x8315, 0x1411, 0x8316, 0x8316, 0x45E3, 0x8317, 0x8317, 0x1426, + 0x8318, 0x8319, 0x45E4, 0x831A, 0x831A, 0x140F, 0x831B, 0x831B, 0x142E, + 0x831C, 0x831C, 0x1415, 0x831D, 0x8326, 0x45E6, 0x8327, 0x8327, 0x085E, + 0x8328, 0x8328, 0x0547, 0x8329, 0x832A, 0x45F0, 0x832B, 0x832B, 0x0AA8, + 0x832C, 0x832C, 0x04AE, 0x832D, 0x832D, 0x1428, 0x832E, 0x832E, 0x45F2, + 0x832F, 0x832F, 0x1420, 0x8330, 0x8330, 0x45F3, 0x8331, 0x8331, 0x141D, + 0x8332, 0x8332, 0x45F4, 0x8333, 0x8333, 0x142A, 0x8334, 0x8334, 0x141C, + 0x8335, 0x8335, 0x1077, 0x8336, 0x8336, 0x04AF, 0x8337, 0x8337, 0x45F5, + 0x8338, 0x8338, 0x0CB2, 0x8339, 0x8339, 0x0CBE, 0x833A, 0x833A, 0x1429, + 0x833B, 0x833B, 0x45F6, 0x833C, 0x833C, 0x141B, 0x833D, 0x833F, 0x45F7, + 0x8340, 0x8340, 0x1425, 0x8341, 0x8342, 0x45FA, 0x8343, 0x8343, 0x1423, + 0x8344, 0x8345, 0x45FC, 0x8346, 0x8346, 0x08D2, 0x8347, 0x8347, 0x1422, + 0x8348, 0x8348, 0x45FE, 0x8349, 0x8349, 0x04A4, 0x834A, 0x834E, 0x45FF, + 0x834F, 0x834F, 0x1421, 0x8350, 0x8350, 0x0869, 0x8351, 0x8351, 0x1416, + 0x8352, 0x8352, 0x07D9, 0x8353, 0x8353, 0x4604, 0x8354, 0x8354, 0x09DE, + 0x8355, 0x8359, 0x4605, 0x835A, 0x835A, 0x0847, 0x835B, 0x835C, 0x1417, + 0x835D, 0x835D, 0x460A, 0x835E, 0x835E, 0x141F, 0x835F, 0x835F, 0x1424, + 0x8360, 0x8360, 0x1427, 0x8361, 0x8361, 0x0595, 0x8362, 0x8362, 0x460B, + 0x8363, 0x8363, 0x0CB4, 0x8364, 0x8364, 0x07FC, 0x8365, 0x8365, 0x142C, + 0x8366, 0x8366, 0x142B, 0x8367, 0x8367, 0x1090, 0x8368, 0x8368, 0x142D, + 0x8369, 0x8369, 0x142F, 0x836A, 0x836A, 0x1431, 0x836B, 0x836B, 0x1078, + 0x836C, 0x836C, 0x1430, 0x836D, 0x836E, 0x1432, 0x836F, 0x836F, 0x1030, + 0x8370, 0x8376, 0x460C, 0x8377, 0x8377, 0x0780, 0x8378, 0x8378, 0x1435, + 0x8379, 0x837A, 0x4613, 0x837B, 0x837B, 0x1442, 0x837C, 0x837C, 0x143D, + 0x837D, 0x837D, 0x1440, 0x837E, 0x8384, 0x4615, 0x8385, 0x8385, 0x143C, + 0x8386, 0x8386, 0x0BED, 0x8387, 0x8388, 0x461C, 0x8389, 0x8389, 0x09DD, + 0x838A, 0x838A, 0x22AB, 0x838B, 0x838D, 0x461E, 0x838E, 0x838E, 0x0CE8, + 0x838F, 0x8391, 0x4621, 0x8392, 0x8392, 0x141A, 0x8393, 0x8393, 0x143A, + 0x8394, 0x8395, 0x4624, 0x8396, 0x8396, 0x1FBF, 0x8397, 0x8397, 0x4626, + 0x8398, 0x8398, 0x1443, 0x8399, 0x839A, 0x4627, 0x839B, 0x839B, 0x141E, + 0x839C, 0x839C, 0x143B, 0x839D, 0x839D, 0x4629, 0x839E, 0x839E, 0x1444, + 0x839F, 0x839F, 0x462A, 0x83A0, 0x83A0, 0x1438, 0x83A1, 0x83A1, 0x462B, + 0x83A2, 0x83A2, 0x1F7D, 0x83A3, 0x83A6, 0x462C, 0x83A7, 0x83A7, 0x2333, + 0x83A8, 0x83A8, 0x1445, 0x83A9, 0x83A9, 0x143F, 0x83AA, 0x83AA, 0x1439, + 0x83AB, 0x83AB, 0x0B0D, 0x83AC, 0x83AF, 0x4630, 0x83B0, 0x83B0, 0x1434, + 0x83B1, 0x83B1, 0x099E, 0x83B2, 0x83B2, 0x09F4, 0x83B3, 0x83B4, 0x1436, + 0x83B5, 0x83B5, 0x4634, 0x83B6, 0x83B6, 0x143E, 0x83B7, 0x83B7, 0x0806, + 0x83B8, 0x83B8, 0x1441, 0x83B9, 0x83B9, 0x108D, 0x83BA, 0x83BA, 0x1446, + 0x83BB, 0x83BB, 0x4635, 0x83BC, 0x83BC, 0x1447, 0x83BD, 0x83BD, 0x0AAC, + 0x83BE, 0x83BF, 0x4636, 0x83C0, 0x83C0, 0x145E, 0x83C1, 0x83C1, 0x1448, + 0x83C2, 0x83C4, 0x4638, 0x83C5, 0x83C5, 0x145D, 0x83C6, 0x83C6, 0x463B, + 0x83C7, 0x83C7, 0x0716, 0x83C8, 0x83C9, 0x463C, 0x83CA, 0x83CA, 0x0904, + 0x83CB, 0x83CB, 0x463E, 0x83CC, 0x83CC, 0x0929, 0x83CD, 0x83CE, 0x463F, + 0x83CF, 0x83CF, 0x0781, 0x83D0, 0x83D3, 0x4641, 0x83D4, 0x83D4, 0x1456, + 0x83D5, 0x83D5, 0x4645, 0x83D6, 0x83D6, 0x1451, 0x83D7, 0x83D7, 0x4646, + 0x83D8, 0x83D8, 0x144B, 0x83D9, 0x83DB, 0x4647, 0x83DC, 0x83DC, 0x0492, + 0x83DD, 0x83DD, 0x144F, 0x83DE, 0x83DE, 0x464A, 0x83DF, 0x83DF, 0x1457, + 0x83E0, 0x83E0, 0x046B, 0x83E1, 0x83E1, 0x1461, 0x83E2, 0x83E4, 0x464B, + 0x83E5, 0x83E5, 0x144A, 0x83E6, 0x83E8, 0x464E, 0x83E9, 0x83E9, 0x0BEF, + 0x83EA, 0x83EA, 0x145C, 0x83EB, 0x83EE, 0x4651, 0x83EF, 0x83EF, 0x1F4D, + 0x83F0, 0x83F0, 0x1460, 0x83F1, 0x83F1, 0x0A2B, 0x83F2, 0x83F2, 0x0663, + 0x83F3, 0x83F7, 0x4655, 0x83F8, 0x83F9, 0x145A, 0x83FA, 0x83FC, 0x465A, + 0x83FD, 0x83FD, 0x1450, 0x83FE, 0x83FF, 0x465D, 0x8400, 0x8400, 0x465F, + 0x8401, 0x8401, 0x1449, 0x8402, 0x8402, 0x4660, 0x8403, 0x8403, 0x1459, + 0x8404, 0x8404, 0x0E24, 0x8405, 0x8405, 0x4661, 0x8406, 0x8406, 0x1455, + 0x8407, 0x8407, 0x2334, 0x8408, 0x8409, 0x4662, 0x840A, 0x840A, 0x1FF1, + 0x840B, 0x840B, 0x144E, 0x840C, 0x840C, 0x0ACD, 0x840D, 0x840D, 0x0BDB, + 0x840E, 0x840E, 0x0EBD, 0x840F, 0x840F, 0x1458, 0x8410, 0x8410, 0x4664, + 0x8411, 0x8411, 0x1454, 0x8412, 0x8417, 0x4665, 0x8418, 0x8418, 0x144D, + 0x8419, 0x841B, 0x466B, 0x841C, 0x841C, 0x1452, 0x841D, 0x841D, 0x0A83, + 0x841E, 0x8423, 0x466E, 0x8424, 0x8425, 0x108E, 0x8426, 0x8426, 0x145F, + 0x8427, 0x8427, 0x0F61, 0x8428, 0x8428, 0x0CD3, 0x8429, 0x842B, 0x4674, + 0x842C, 0x842C, 0x218B, 0x842D, 0x8430, 0x4677, 0x8431, 0x8431, 0x1472, + 0x8432, 0x8434, 0x467B, 0x8435, 0x8435, 0x2349, 0x8436, 0x8437, 0x467E, + 0x8438, 0x8438, 0x1453, 0x8439, 0x843B, 0x4680, 0x843C, 0x843C, 0x146C, + 0x843D, 0x843D, 0x0A8B, 0x843E, 0x8445, 0x4683, 0x8446, 0x8446, 0x146D, + 0x8447, 0x8448, 0x468B, 0x8449, 0x8449, 0x220B, 0x844A, 0x8450, 0x468D, + 0x8451, 0x8451, 0x1463, 0x8452, 0x8452, 0x2346, 0x8453, 0x8456, 0x4694, + 0x8457, 0x8457, 0x11F7, 0x8458, 0x8458, 0x4698, 0x8459, 0x8459, 0x1465, + 0x845A, 0x845A, 0x1464, 0x845B, 0x845B, 0x06EB, 0x845C, 0x845C, 0x1462, + 0x845D, 0x8460, 0x4699, 0x8461, 0x8461, 0x0BEE, 0x8462, 0x8462, 0x469D, + 0x8463, 0x8463, 0x05EC, 0x8464, 0x8464, 0x2347, 0x8465, 0x8465, 0x469E, + 0x8466, 0x8466, 0x2193, 0x8467, 0x8468, 0x469F, 0x8469, 0x8469, 0x146E, + 0x846A, 0x846A, 0x46A1, 0x846B, 0x846B, 0x07B0, 0x846C, 0x846C, 0x1124, + 0x846D, 0x846D, 0x1473, 0x846E, 0x846E, 0x46A2, 0x846F, 0x846F, 0x26A1, + 0x8470, 0x8470, 0x46A3, 0x8471, 0x8471, 0x0553, 0x8472, 0x8472, 0x46A4, + 0x8473, 0x8473, 0x1466, 0x8474, 0x8474, 0x46A5, 0x8475, 0x8475, 0x0988, + 0x8476, 0x8476, 0x146F, 0x8477, 0x8477, 0x1F62, 0x8478, 0x8478, 0x146B, + 0x8479, 0x8479, 0x46A6, 0x847A, 0x847A, 0x1469, 0x847B, 0x8481, 0x46A7, + 0x8482, 0x8482, 0x05BA, 0x8483, 0x8486, 0x46AE, 0x8487, 0x8488, 0x1467, + 0x8489, 0x8489, 0x146A, 0x848A, 0x848A, 0x46B2, 0x848B, 0x848B, 0x0880, + 0x848C, 0x848C, 0x1470, 0x848D, 0x848D, 0x46B3, 0x848E, 0x848E, 0x1471, + 0x848F, 0x8492, 0x46B4, 0x8493, 0x8493, 0x234D, 0x8494, 0x8494, 0x2348, + 0x8495, 0x8496, 0x46B8, 0x8497, 0x8497, 0x1481, 0x8498, 0x8498, 0x46BA, + 0x8499, 0x8499, 0x0ACE, 0x849A, 0x849B, 0x46BB, 0x849C, 0x849C, 0x0DD7, + 0x849D, 0x84A0, 0x46BD, 0x84A1, 0x84A1, 0x147E, 0x84A2, 0x84AE, 0x46C1, + 0x84AF, 0x84AF, 0x1297, 0x84B0, 0x84B1, 0x46CE, 0x84B2, 0x84B2, 0x0BF0, + 0x84B3, 0x84B3, 0x46D0, 0x84B4, 0x84B4, 0x1480, 0x84B5, 0x84B7, 0x46D1, + 0x84B8, 0x84B8, 0x1195, 0x84B9, 0x84B9, 0x147F, 0x84BA, 0x84BA, 0x147C, + 0x84BB, 0x84BB, 0x46D4, 0x84BC, 0x84BC, 0x1E60, 0x84BD, 0x84BD, 0x1478, + 0x84BE, 0x84BE, 0x46D5, 0x84BF, 0x84BF, 0x147B, 0x84C0, 0x84C0, 0x2345, + 0x84C1, 0x84C1, 0x1474, 0x84C2, 0x84C3, 0x46D6, 0x84C4, 0x84C4, 0x0FB9, + 0x84C5, 0x84C8, 0x46D8, 0x84C9, 0x84C9, 0x0CB3, 0x84CA, 0x84CA, 0x147A, + 0x84CB, 0x84CB, 0x1F12, 0x84CC, 0x84CC, 0x46DC, 0x84CD, 0x84CD, 0x1475, + 0x84CE, 0x84CF, 0x46DD, 0x84D0, 0x84D0, 0x1476, 0x84D1, 0x84D1, 0x0DE7, + 0x84D2, 0x84D2, 0x46DF, 0x84D3, 0x84D3, 0x1479, 0x84D4, 0x84D5, 0x46E0, + 0x84D6, 0x84D6, 0x0436, 0x84D7, 0x84DC, 0x46E2, 0x84DD, 0x84DD, 0x09A1, + 0x84DE, 0x84DE, 0x46E8, 0x84DF, 0x84DF, 0x082E, 0x84E0, 0x84E0, 0x147D, + 0x84E1, 0x84E2, 0x46E9, 0x84E3, 0x84E3, 0x1483, 0x84E4, 0x84E4, 0x46EB, + 0x84E5, 0x84E5, 0x1482, 0x84E6, 0x84E6, 0x1477, 0x84E7, 0x84EB, 0x46EC, + 0x84EC, 0x84EC, 0x0BAF, 0x84ED, 0x84ED, 0x46F1, 0x84EE, 0x84EE, 0x2018, + 0x84EF, 0x84EF, 0x2335, 0x84F0, 0x84F0, 0x1487, 0x84F1, 0x84FB, 0x46F2, + 0x84FC, 0x84FC, 0x148E, 0x84FD, 0x84FD, 0x233C, 0x84FE, 0x84FE, 0x46FD, + 0x84FF, 0x84FF, 0x148D, 0x8500, 0x850B, 0x46FE, 0x850C, 0x850C, 0x1484, + 0x850D, 0x8510, 0x470A, 0x8511, 0x8511, 0x0AF4, 0x8512, 0x8512, 0x470E, + 0x8513, 0x8513, 0x0AA2, 0x8514, 0x8514, 0x266F, 0x8515, 0x8516, 0x470F, + 0x8517, 0x8517, 0x1182, 0x8518, 0x8519, 0x4711, 0x851A, 0x851A, 0x0EC4, + 0x851B, 0x851D, 0x4713, 0x851E, 0x851E, 0x2351, 0x851F, 0x851F, 0x1489, + 0x8520, 0x8520, 0x4716, 0x8521, 0x8521, 0x0493, 0x8522, 0x8522, 0x4717, + 0x8523, 0x8523, 0x1FA0, 0x8524, 0x8525, 0x4718, 0x8526, 0x8526, 0x2338, + 0x8527, 0x852A, 0x471A, 0x852B, 0x852B, 0x0B4B, 0x852C, 0x852C, 0x0D76, + 0x852D, 0x852D, 0x221B, 0x852E, 0x8536, 0x471E, 0x8537, 0x8537, 0x0C3B, + 0x8538, 0x8538, 0x1486, 0x8539, 0x8539, 0x1488, 0x853A, 0x853A, 0x148A, + 0x853B, 0x853B, 0x148C, 0x853C, 0x853C, 0x03B5, 0x853D, 0x853D, 0x0437, + 0x853E, 0x8540, 0x4727, 0x8541, 0x8541, 0x2342, 0x8542, 0x8542, 0x472A, + 0x8543, 0x8543, 0x1496, 0x8544, 0x8545, 0x472B, 0x8546, 0x8546, 0x234F, + 0x8547, 0x8547, 0x472D, 0x8548, 0x8548, 0x1490, 0x8549, 0x8549, 0x0887, + 0x854A, 0x854A, 0x0CCA, 0x854B, 0x854D, 0x472E, 0x854E, 0x854E, 0x233D, + 0x854F, 0x8551, 0x4731, 0x8552, 0x8552, 0x2344, 0x8553, 0x8553, 0x2331, + 0x8554, 0x8554, 0x4734, 0x8555, 0x8555, 0x234B, 0x8556, 0x8556, 0x148B, + 0x8557, 0x8557, 0x4735, 0x8558, 0x8558, 0x233B, 0x8559, 0x8559, 0x148F, + 0x855A, 0x855D, 0x4736, 0x855E, 0x855E, 0x1493, 0x855F, 0x8561, 0x473A, + 0x8562, 0x8562, 0x2350, 0x8563, 0x8563, 0x473D, 0x8564, 0x8564, 0x1492, + 0x8565, 0x8567, 0x473E, 0x8568, 0x8568, 0x1491, 0x8569, 0x8569, 0x1EB4, + 0x856A, 0x856A, 0x21A6, 0x856B, 0x856C, 0x4741, 0x856D, 0x856D, 0x21CB, + 0x856E, 0x8571, 0x4743, 0x8572, 0x8572, 0x1497, 0x8573, 0x8573, 0x4747, + 0x8574, 0x8574, 0x110F, 0x8575, 0x8576, 0x4748, 0x8577, 0x8577, 0x2355, + 0x8578, 0x8578, 0x474A, 0x8579, 0x8579, 0x149D, 0x857A, 0x857A, 0x1494, + 0x857B, 0x857B, 0x1498, 0x857C, 0x857D, 0x474B, 0x857E, 0x857E, 0x09C4, + 0x857F, 0x8583, 0x474D, 0x8584, 0x8584, 0x040A, 0x8585, 0x8585, 0x14A0, + 0x8586, 0x8586, 0x4752, 0x8587, 0x8587, 0x149B, 0x8588, 0x8588, 0x233E, + 0x8589, 0x8589, 0x4753, 0x858A, 0x858A, 0x1F74, 0x858B, 0x858B, 0x4754, + 0x858C, 0x858C, 0x2330, 0x858D, 0x858E, 0x4755, 0x858F, 0x858F, 0x149C, + 0x8590, 0x8590, 0x4757, 0x8591, 0x8591, 0x2680, 0x8592, 0x8593, 0x4758, + 0x8594, 0x8594, 0x20DA, 0x8595, 0x859A, 0x475A, 0x859B, 0x859B, 0x0FCF, + 0x859C, 0x859C, 0x149F, 0x859D, 0x859E, 0x4760, 0x859F, 0x859F, 0x234A, + 0x85A0, 0x85A3, 0x4762, 0x85A4, 0x85A4, 0x1499, 0x85A5, 0x85A5, 0x4766, + 0x85A6, 0x85A6, 0x1F91, 0x85A7, 0x85A7, 0x4767, 0x85A8, 0x85A8, 0x149A, + 0x85A9, 0x85A9, 0x2107, 0x85AA, 0x85AA, 0x0F88, 0x85AB, 0x85AD, 0x4768, + 0x85AE, 0x85AE, 0x149E, 0x85AF, 0x85AF, 0x0D84, 0x85B0, 0x85B0, 0x14A3, + 0x85B1, 0x85B6, 0x476B, 0x85B7, 0x85B7, 0x14A2, 0x85B8, 0x85B8, 0x4771, + 0x85B9, 0x85B9, 0x14A1, 0x85BA, 0x85BA, 0x233F, 0x85BB, 0x85C0, 0x4772, + 0x85C1, 0x85C1, 0x14A5, 0x85C2, 0x85C8, 0x4778, 0x85C9, 0x85C9, 0x08B6, + 0x85CA, 0x85CC, 0x477F, 0x85CD, 0x85CD, 0x1FF4, 0x85CE, 0x85CE, 0x2343, + 0x85CF, 0x85CF, 0x049F, 0x85D0, 0x85D0, 0x0AEF, 0x85D1, 0x85D2, 0x4782, + 0x85D3, 0x85D3, 0x14A4, 0x85D4, 0x85D4, 0x4784, 0x85D5, 0x85D5, 0x0B7B, + 0x85D6, 0x85DB, 0x4785, 0x85DC, 0x85DC, 0x14A6, 0x85DD, 0x85DD, 0x2212, + 0x85DE, 0x85E3, 0x478B, 0x85E4, 0x85E4, 0x0E2C, 0x85E5, 0x85E5, 0x2207, + 0x85E6, 0x85E8, 0x4791, 0x85E9, 0x85E9, 0x0647, 0x85EA, 0x85EA, 0x2359, + 0x85EB, 0x85F3, 0x4794, 0x85F4, 0x85F4, 0x2254, 0x85F5, 0x85F5, 0x479D, + 0x85F6, 0x85F6, 0x2332, 0x85F7, 0x85F8, 0x479E, 0x85F9, 0x85F9, 0x1E26, + 0x85FA, 0x85FA, 0x2357, 0x85FB, 0x85FB, 0x1128, 0x85FC, 0x85FE, 0x47A0, + 0x85FF, 0x85FF, 0x14A7, 0x8600, 0x8603, 0x47A3, 0x8604, 0x8604, 0x2358, + 0x8605, 0x8605, 0x14A9, 0x8606, 0x8606, 0x2042, 0x8607, 0x8607, 0x2153, + 0x8608, 0x860A, 0x47A7, 0x860B, 0x860B, 0x20BB, 0x860C, 0x8610, 0x47AA, + 0x8611, 0x8611, 0x0B05, 0x8612, 0x8615, 0x47AF, 0x8616, 0x8616, 0x14AB, + 0x8617, 0x8619, 0x47B3, 0x861A, 0x861A, 0x235A, 0x861B, 0x861D, 0x47B6, + 0x861E, 0x861E, 0x2356, 0x861F, 0x8621, 0x47B9, 0x8622, 0x8622, 0x2337, + 0x8623, 0x8626, 0x47BC, 0x8627, 0x8627, 0x14A8, 0x8628, 0x8628, 0x47C0, + 0x8629, 0x8629, 0x14AA, 0x862A, 0x862C, 0x47C1, 0x862D, 0x862D, 0x1FF9, + 0x862E, 0x8637, 0x47C4, 0x8638, 0x8638, 0x115B, 0x8639, 0x8639, 0x47CE, + 0x863A, 0x863A, 0x2353, 0x863B, 0x863B, 0x47CF, 0x863C, 0x863C, 0x14AC, + 0x863D, 0x863E, 0x47D0, 0x863F, 0x863F, 0x2061, 0x8640, 0x864C, 0x47D2, + 0x864D, 0x864D, 0x1BF0, 0x864E, 0x864E, 0x07B7, 0x864F, 0x864F, 0x0A59, + 0x8650, 0x8650, 0x0B71, 0x8651, 0x8651, 0x0A6E, 0x8652, 0x8653, 0x47DF, + 0x8654, 0x8654, 0x1BF1, 0x8655, 0x8655, 0x1E95, 0x8656, 0x8659, 0x47E1, + 0x865A, 0x865A, 0x0FB4, 0x865B, 0x865B, 0x47E5, 0x865C, 0x865C, 0x2049, + 0x865D, 0x865D, 0x47E6, 0x865E, 0x865E, 0x10C2, 0x865F, 0x865F, 0x1F42, + 0x8660, 0x8661, 0x47E7, 0x8662, 0x8662, 0x196D, 0x8663, 0x8666, 0x47E9, + 0x8667, 0x8667, 0x1FE8, 0x8668, 0x866A, 0x47ED, 0x866B, 0x866B, 0x050B, + 0x866C, 0x866C, 0x1BF2, 0x866D, 0x866D, 0x47F0, 0x866E, 0x866E, 0x1BF3, + 0x866F, 0x8670, 0x47F1, 0x8671, 0x8671, 0x0D44, 0x8672, 0x8678, 0x47F3, + 0x8679, 0x8679, 0x079E, 0x867A, 0x867A, 0x1BF5, 0x867B, 0x867B, 0x1BF7, + 0x867C, 0x867C, 0x1BF6, 0x867D, 0x867D, 0x0DD9, 0x867E, 0x867E, 0x0F27, + 0x867F, 0x867F, 0x1BF4, 0x8680, 0x8680, 0x0D4B, 0x8681, 0x8681, 0x1056, + 0x8682, 0x8682, 0x0A93, 0x8683, 0x8689, 0x47FA, 0x868A, 0x868A, 0x0ED2, + 0x868B, 0x868B, 0x1BFA, 0x868C, 0x868C, 0x0401, 0x868D, 0x868D, 0x1BF9, + 0x868E, 0x8692, 0x4801, 0x8693, 0x8693, 0x1C00, 0x8694, 0x8694, 0x4806, + 0x8695, 0x8695, 0x0496, 0x8696, 0x869B, 0x4807, 0x869C, 0x869C, 0x0FEA, + 0x869D, 0x869D, 0x1BFC, 0x869E, 0x86A2, 0x480D, 0x86A3, 0x86A3, 0x1BFE, + 0x86A4, 0x86A4, 0x112C, 0x86A5, 0x86A6, 0x4812, 0x86A7, 0x86A7, 0x1BFD, + 0x86A8, 0x86A8, 0x1BF8, 0x86A9, 0x86A9, 0x1C01, 0x86AA, 0x86AA, 0x1BFF, + 0x86AB, 0x86AB, 0x4814, 0x86AC, 0x86AC, 0x1BFB, 0x86AD, 0x86AE, 0x4815, + 0x86AF, 0x86AF, 0x1C09, 0x86B0, 0x86B0, 0x1C06, 0x86B1, 0x86B1, 0x1C08, + 0x86B2, 0x86B3, 0x4817, 0x86B4, 0x86B4, 0x1C0C, 0x86B5, 0x86B5, 0x1C04, + 0x86B6, 0x86B6, 0x1C02, 0x86B7, 0x86B9, 0x4819, 0x86BA, 0x86BA, 0x1C07, + 0x86BB, 0x86BF, 0x481C, 0x86C0, 0x86C0, 0x11FA, 0x86C1, 0x86C3, 0x4821, + 0x86C4, 0x86C4, 0x1C03, 0x86C5, 0x86C5, 0x4824, 0x86C6, 0x86C6, 0x0C76, + 0x86C7, 0x86C7, 0x0D18, 0x86C8, 0x86C8, 0x4825, 0x86C9, 0x86C9, 0x1C0A, + 0x86CA, 0x86CA, 0x071F, 0x86CB, 0x86CB, 0x0591, 0x86CC, 0x86CD, 0x4826, + 0x86CE, 0x86CE, 0x1C05, 0x86CF, 0x86CF, 0x1C0B, 0x86D0, 0x86D0, 0x1C12, + 0x86D1, 0x86D1, 0x1C18, 0x86D2, 0x86D3, 0x4828, 0x86D4, 0x86D4, 0x07EC, + 0x86D5, 0x86D7, 0x482A, 0x86D8, 0x86D8, 0x1C17, 0x86D9, 0x86D9, 0x0E8D, + 0x86DA, 0x86DA, 0x482D, 0x86DB, 0x86DB, 0x11EA, 0x86DC, 0x86DD, 0x482E, + 0x86DE, 0x86DE, 0x1C14, 0x86DF, 0x86DF, 0x1C16, 0x86E0, 0x86E3, 0x4830, + 0x86E4, 0x86E4, 0x06ED, 0x86E5, 0x86E8, 0x4834, 0x86E9, 0x86E9, 0x1C0D, + 0x86EA, 0x86EC, 0x4838, 0x86ED, 0x86ED, 0x1C10, 0x86EE, 0x86EE, 0x0AA0, + 0x86EF, 0x86EF, 0x483B, 0x86F0, 0x86F0, 0x117E, 0x86F1, 0x86F2, 0x1C0E, + 0x86F3, 0x86F3, 0x1C11, 0x86F4, 0x86F4, 0x1C15, 0x86F5, 0x86F7, 0x483C, + 0x86F8, 0x86F8, 0x1C1B, 0x86F9, 0x86F9, 0x10A1, 0x86FA, 0x86FA, 0x25DA, + 0x86FB, 0x86FD, 0x483F, 0x86FE, 0x86FE, 0x0629, 0x86FF, 0x86FF, 0x4842, + 0x8700, 0x8700, 0x0D88, 0x8701, 0x8701, 0x4843, 0x8702, 0x8702, 0x0681, + 0x8703, 0x8703, 0x1C19, 0x8704, 0x8705, 0x4844, 0x8706, 0x8706, 0x25D7, + 0x8707, 0x8707, 0x1C1A, 0x8708, 0x8708, 0x1C1C, 0x8709, 0x8709, 0x1C1F, + 0x870A, 0x870A, 0x1C1D, 0x870B, 0x870C, 0x4846, 0x870D, 0x870D, 0x1C1E, + 0x870E, 0x8711, 0x4848, 0x8712, 0x8712, 0x0FFA, 0x8713, 0x8713, 0x1C13, + 0x8714, 0x8714, 0x484C, 0x8715, 0x8715, 0x0E7A, 0x8716, 0x8716, 0x484D, + 0x8717, 0x8717, 0x0EDE, 0x8718, 0x8718, 0x11A8, 0x8719, 0x8719, 0x484E, + 0x871A, 0x871A, 0x1C25, 0x871B, 0x871B, 0x484F, 0x871C, 0x871C, 0x0AE0, + 0x871D, 0x871D, 0x4850, 0x871E, 0x871E, 0x1C22, 0x871F, 0x8720, 0x4851, + 0x8721, 0x8721, 0x099A, 0x8722, 0x8722, 0x1C2E, 0x8723, 0x8723, 0x1C20, + 0x8724, 0x8724, 0x4853, 0x8725, 0x8725, 0x1C23, 0x8726, 0x8728, 0x4854, + 0x8729, 0x8729, 0x1C2A, 0x872A, 0x872D, 0x4857, 0x872E, 0x872E, 0x1C24, + 0x872F, 0x8730, 0x485B, 0x8731, 0x8731, 0x1C29, 0x8732, 0x8733, 0x485D, + 0x8734, 0x8734, 0x1C28, 0x8735, 0x8736, 0x485F, 0x8737, 0x8737, 0x1C2B, + 0x8738, 0x873A, 0x4861, 0x873B, 0x873B, 0x1C21, 0x873C, 0x873D, 0x4864, + 0x873E, 0x873E, 0x1C26, 0x873F, 0x873F, 0x1C2C, 0x8740, 0x8746, 0x4866, + 0x8747, 0x8747, 0x1091, 0x8748, 0x8748, 0x1C27, 0x8749, 0x8749, 0x04BC, + 0x874A, 0x874B, 0x486D, 0x874C, 0x874C, 0x1C34, 0x874D, 0x874D, 0x486F, + 0x874E, 0x874E, 0x0F76, 0x874F, 0x8752, 0x4870, 0x8753, 0x8753, 0x1C37, + 0x8754, 0x8754, 0x4874, 0x8755, 0x8755, 0x212E, 0x8756, 0x8756, 0x4875, + 0x8757, 0x8757, 0x07DD, 0x8758, 0x8758, 0x4876, 0x8759, 0x8759, 0x1C3B, + 0x875A, 0x875F, 0x4877, 0x8760, 0x8760, 0x1C32, 0x8761, 0x8762, 0x487D, + 0x8763, 0x8763, 0x1C38, 0x8764, 0x8764, 0x1C3A, 0x8765, 0x8765, 0x1C3C, + 0x8766, 0x8766, 0x21B2, 0x8767, 0x876D, 0x487F, 0x876E, 0x876E, 0x1C35, + 0x876F, 0x876F, 0x4886, 0x8770, 0x8770, 0x1C33, 0x8771, 0x8773, 0x4887, + 0x8774, 0x8774, 0x07B2, 0x8775, 0x8775, 0x488A, 0x8776, 0x8776, 0x05DC, + 0x8777, 0x8777, 0x488B, 0x8778, 0x8778, 0x219E, 0x8779, 0x877A, 0x488C, + 0x877B, 0x877B, 0x1C31, 0x877C, 0x877C, 0x1C39, 0x877D, 0x877E, 0x1C2F, + 0x877F, 0x8781, 0x488E, 0x8782, 0x8782, 0x1C2D, 0x8783, 0x8783, 0x1C46, + 0x8784, 0x8784, 0x25DC, 0x8785, 0x8785, 0x1C43, 0x8786, 0x8787, 0x4891, + 0x8788, 0x8788, 0x1C42, 0x8789, 0x878A, 0x4893, 0x878B, 0x878B, 0x1C36, + 0x878C, 0x878C, 0x4895, 0x878D, 0x878D, 0x0CB5, 0x878E, 0x8792, 0x4896, + 0x8793, 0x8793, 0x1C3D, 0x8794, 0x8796, 0x489B, 0x8797, 0x8797, 0x1C45, + 0x8798, 0x879D, 0x489E, 0x879E, 0x879E, 0x206C, 0x879F, 0x879F, 0x0AFD, + 0x87A0, 0x87A1, 0x48A4, 0x87A2, 0x87A2, 0x2226, 0x87A3, 0x87A7, 0x48A6, + 0x87A8, 0x87A8, 0x1C3F, 0x87A9, 0x87AA, 0x48AB, 0x87AB, 0x87AB, 0x1C47, + 0x87AC, 0x87AC, 0x1C49, 0x87AD, 0x87AD, 0x1C44, 0x87AE, 0x87AE, 0x48AD, + 0x87AF, 0x87AF, 0x1C3E, 0x87B0, 0x87B2, 0x48AE, 0x87B3, 0x87B3, 0x1C4B, + 0x87B4, 0x87B4, 0x48B1, 0x87B5, 0x87B5, 0x1C4A, 0x87B6, 0x87B9, 0x48B2, + 0x87BA, 0x87BA, 0x0A84, 0x87BB, 0x87BB, 0x25E0, 0x87BC, 0x87BC, 0x48B6, + 0x87BD, 0x87BD, 0x1C4E, 0x87BE, 0x87BF, 0x48B7, 0x87C0, 0x87C0, 0x1C50, + 0x87C1, 0x87C3, 0x48B9, 0x87C4, 0x87C4, 0x227B, 0x87C5, 0x87C5, 0x48BC, + 0x87C6, 0x87C6, 0x1C41, 0x87C7, 0x87C7, 0x48BD, 0x87C8, 0x87C8, 0x25DE, + 0x87C9, 0x87C9, 0x48BE, 0x87CA, 0x87CA, 0x1C51, 0x87CB, 0x87CB, 0x1C4C, + 0x87CC, 0x87CD, 0x48BF, 0x87CE, 0x87CE, 0x25E1, 0x87CF, 0x87D0, 0x48C1, + 0x87D1, 0x87D1, 0x1C4F, 0x87D2, 0x87D2, 0x1C40, 0x87D3, 0x87D3, 0x1C4D, + 0x87D4, 0x87DA, 0x48C3, 0x87DB, 0x87DB, 0x1C52, 0x87DC, 0x87DF, 0x48CA, + 0x87E0, 0x87E0, 0x1C54, 0x87E1, 0x87E2, 0x48CE, 0x87E3, 0x87E3, 0x25D5, + 0x87E4, 0x87E4, 0x48D0, 0x87E5, 0x87E5, 0x1C48, 0x87E6, 0x87E9, 0x48D1, + 0x87EA, 0x87EA, 0x1C53, 0x87EB, 0x87EB, 0x48D5, 0x87EC, 0x87EC, 0x1E6B, + 0x87ED, 0x87ED, 0x48D6, 0x87EE, 0x87EE, 0x1C55, 0x87EF, 0x87EF, 0x25DB, + 0x87F0, 0x87F1, 0x48D7, 0x87F2, 0x87F2, 0x1E89, 0x87F3, 0x87F5, 0x48D9, + 0x87F6, 0x87F6, 0x25D9, 0x87F7, 0x87F8, 0x48DC, 0x87F9, 0x87F9, 0x0F82, + 0x87FA, 0x87FA, 0x48DE, 0x87FB, 0x87FB, 0x2211, 0x87FC, 0x87FD, 0x48DF, + 0x87FE, 0x87FE, 0x1C58, 0x87FF, 0x87FF, 0x48E1, 0x8800, 0x8802, 0x48E2, + 0x8803, 0x8803, 0x130D, 0x8804, 0x8804, 0x48E5, 0x8805, 0x8805, 0x2229, + 0x8806, 0x8806, 0x25D6, 0x8807, 0x8809, 0x48E6, 0x880A, 0x880A, 0x1C59, + 0x880B, 0x880F, 0x48E9, 0x8810, 0x8810, 0x25DD, 0x8811, 0x8811, 0x25DF, + 0x8812, 0x8812, 0x48EE, 0x8813, 0x8813, 0x1C57, 0x8814, 0x8814, 0x48EF, + 0x8815, 0x8815, 0x0CBF, 0x8816, 0x8816, 0x1C56, 0x8817, 0x881A, 0x48F0, + 0x881B, 0x881B, 0x1C5A, 0x881C, 0x881E, 0x48F4, 0x881F, 0x881F, 0x1FEF, + 0x8820, 0x8820, 0x48F7, 0x8821, 0x8821, 0x1C5B, 0x8822, 0x8822, 0x0543, + 0x8823, 0x8823, 0x25D8, 0x8824, 0x8830, 0x48F8, 0x8831, 0x8831, 0x1F29, + 0x8832, 0x8832, 0x1A8D, 0x8833, 0x8835, 0x4905, 0x8836, 0x8836, 0x1E5B, + 0x8837, 0x8838, 0x4908, 0x8839, 0x8839, 0x1C5C, 0x883A, 0x883A, 0x490A, + 0x883B, 0x883B, 0x2076, 0x883C, 0x883C, 0x1C5D, 0x883D, 0x883F, 0x490B, + 0x8840, 0x8840, 0x0FD3, 0x8841, 0x8843, 0x490E, 0x8844, 0x8844, 0x1CAA, + 0x8845, 0x8845, 0x0F91, 0x8846, 0x8846, 0x2297, 0x8847, 0x8849, 0x4911, + 0x884A, 0x884A, 0x2690, 0x884B, 0x884B, 0x4914, 0x884C, 0x884C, 0x0F9B, + 0x884D, 0x884D, 0x1005, 0x884E, 0x8852, 0x4915, 0x8853, 0x8853, 0x213F, + 0x8854, 0x8854, 0x0F3B, 0x8855, 0x8856, 0x491A, 0x8857, 0x8857, 0x08A7, + 0x8858, 0x8858, 0x491C, 0x8859, 0x8859, 0x0FEC, 0x885A, 0x885A, 0x491D, + 0x885B, 0x885B, 0x2198, 0x885C, 0x885C, 0x491E, 0x885D, 0x885D, 0x1E88, + 0x885E, 0x8860, 0x491F, 0x8861, 0x8861, 0x0799, 0x8862, 0x8862, 0x15ED, + 0x8863, 0x8863, 0x1049, 0x8864, 0x8864, 0x1BA6, 0x8865, 0x8865, 0x0480, + 0x8866, 0x8867, 0x4922, 0x8868, 0x8868, 0x0456, 0x8869, 0x8869, 0x1BA7, + 0x886A, 0x886A, 0x4924, 0x886B, 0x886B, 0x0CF9, 0x886C, 0x886C, 0x04E9, + 0x886D, 0x886D, 0x4925, 0x886E, 0x886E, 0x1306, 0x886F, 0x886F, 0x4926, + 0x8870, 0x8870, 0x0D9A, 0x8871, 0x8871, 0x4927, 0x8872, 0x8872, 0x1BA8, + 0x8873, 0x8876, 0x4928, 0x8877, 0x8877, 0x11D3, 0x8878, 0x8878, 0x492C, + 0x8879, 0x8879, 0x228C, 0x887A, 0x887C, 0x492D, 0x887D, 0x887D, 0x1BA9, + 0x887E, 0x887E, 0x1CBE, 0x887F, 0x887F, 0x1BAA, 0x8880, 0x8880, 0x4930, + 0x8881, 0x8881, 0x10EF, 0x8882, 0x8882, 0x1BAB, 0x8883, 0x8883, 0x4931, + 0x8884, 0x8884, 0x03CB, 0x8885, 0x8885, 0x1CBF, 0x8886, 0x8887, 0x4932, + 0x8888, 0x8888, 0x1CC0, 0x8889, 0x888A, 0x4934, 0x888B, 0x888B, 0x057F, + 0x888C, 0x888C, 0x4936, 0x888D, 0x888D, 0x0B9C, 0x888E, 0x8891, 0x4937, + 0x8892, 0x8892, 0x0E0E, 0x8893, 0x8895, 0x493B, 0x8896, 0x8896, 0x0FAF, + 0x8897, 0x889B, 0x493E, 0x889C, 0x889C, 0x0E91, 0x889D, 0x88A1, 0x4943, + 0x88A2, 0x88A2, 0x1BAC, 0x88A3, 0x88A3, 0x4948, 0x88A4, 0x88A4, 0x1307, + 0x88A5, 0x88AA, 0x4949, 0x88AB, 0x88AB, 0x0424, 0x88AC, 0x88AC, 0x494F, + 0x88AD, 0x88AD, 0x0F1B, 0x88AE, 0x88B0, 0x4950, 0x88B1, 0x88B1, 0x069F, + 0x88B2, 0x88B6, 0x4953, 0x88B7, 0x88B7, 0x1BAE, 0x88B8, 0x88BB, 0x4958, + 0x88BC, 0x88BC, 0x1BAF, 0x88BD, 0x88C0, 0x495C, 0x88C1, 0x88C1, 0x048A, + 0x88C2, 0x88C2, 0x0A1A, 0x88C3, 0x88C4, 0x4960, 0x88C5, 0x88C5, 0x120D, + 0x88C6, 0x88C6, 0x1BAD, 0x88C7, 0x88C8, 0x4962, 0x88C9, 0x88C9, 0x1BB0, + 0x88CA, 0x88CA, 0x25F1, 0x88CB, 0x88CD, 0x4964, 0x88CE, 0x88CE, 0x1BB2, + 0x88CF, 0x88CF, 0x200C, 0x88D0, 0x88D1, 0x4967, 0x88D2, 0x88D2, 0x130A, + 0x88D3, 0x88D3, 0x4969, 0x88D4, 0x88D4, 0x1068, 0x88D5, 0x88D5, 0x10E6, + 0x88D6, 0x88D7, 0x496A, 0x88D8, 0x88D8, 0x1CC1, 0x88D9, 0x88D9, 0x0C94, + 0x88DA, 0x88DB, 0x496C, 0x88DC, 0x88DC, 0x1E58, 0x88DD, 0x88DD, 0x22AC, + 0x88DE, 0x88DE, 0x496E, 0x88DF, 0x88DF, 0x1CC2, 0x88E0, 0x88E1, 0x496F, + 0x88E2, 0x88E2, 0x1BB1, 0x88E3, 0x88E3, 0x1BB3, 0x88E4, 0x88E4, 0x0970, + 0x88E5, 0x88E5, 0x1BB4, 0x88E6, 0x88E7, 0x4971, 0x88E8, 0x88E8, 0x1BB8, + 0x88E9, 0x88EF, 0x4973, 0x88F0, 0x88F0, 0x1BBA, 0x88F1, 0x88F1, 0x1BB5, + 0x88F2, 0x88F2, 0x497A, 0x88F3, 0x88F3, 0x0D0A, 0x88F4, 0x88F4, 0x0BA2, + 0x88F5, 0x88F7, 0x497B, 0x88F8, 0x88F8, 0x0A8A, 0x88F9, 0x88F9, 0x0755, + 0x88FA, 0x88FB, 0x497E, 0x88FC, 0x88FC, 0x1BB7, 0x88FD, 0x88FD, 0x26A7, + 0x88FE, 0x88FE, 0x1BB9, 0x88FF, 0x88FF, 0x4980, 0x8900, 0x8901, 0x4981, + 0x8902, 0x8902, 0x072C, 0x8903, 0x8906, 0x4983, 0x8907, 0x8907, 0x2676, + 0x8908, 0x8909, 0x4987, 0x890A, 0x890A, 0x1BBF, 0x890B, 0x890F, 0x4989, + 0x8910, 0x8910, 0x078D, 0x8911, 0x8911, 0x498E, 0x8912, 0x8912, 0x0408, + 0x8913, 0x8913, 0x1BBD, 0x8914, 0x8918, 0x498F, 0x8919, 0x8919, 0x1BBC, + 0x891A, 0x891A, 0x1BB6, 0x891B, 0x891B, 0x1BBE, 0x891C, 0x8920, 0x4994, + 0x8921, 0x8921, 0x1BBB, 0x8922, 0x8924, 0x4999, 0x8925, 0x8925, 0x0CC7, + 0x8926, 0x8929, 0x499C, 0x892A, 0x892A, 0x0E7B, 0x892B, 0x892B, 0x1BC1, + 0x892C, 0x892F, 0x49A0, 0x8930, 0x8930, 0x1739, 0x8931, 0x8931, 0x49A4, + 0x8932, 0x8932, 0x1FE1, 0x8933, 0x8933, 0x25BB, 0x8934, 0x8934, 0x1BC0, + 0x8935, 0x8935, 0x49A5, 0x8936, 0x8936, 0x1BC2, 0x8937, 0x8937, 0x49A6, + 0x8938, 0x8938, 0x25BE, 0x8939, 0x893A, 0x49A7, 0x893B, 0x893B, 0x22DD, + 0x893C, 0x8940, 0x49A9, 0x8941, 0x8941, 0x1BC3, 0x8942, 0x8943, 0x49AE, + 0x8944, 0x8944, 0x0F52, 0x8945, 0x8946, 0x49B0, 0x8947, 0x8947, 0x25BD, + 0x8948, 0x8955, 0x49B2, 0x8956, 0x8956, 0x1E2A, 0x8957, 0x895C, 0x49C0, + 0x895D, 0x895D, 0x25BC, 0x895E, 0x895E, 0x1CC3, 0x895F, 0x895F, 0x08C4, + 0x8960, 0x8960, 0x25BA, 0x8961, 0x8963, 0x49C6, 0x8964, 0x8964, 0x25BF, + 0x8965, 0x8965, 0x49C9, 0x8966, 0x8966, 0x1BC4, 0x8967, 0x8969, 0x49CA, + 0x896A, 0x896A, 0x2187, 0x896B, 0x896B, 0x49CD, 0x896C, 0x896C, 0x266B, + 0x896D, 0x896E, 0x49CE, 0x896F, 0x896F, 0x1E7F, 0x8970, 0x8971, 0x49D0, + 0x8972, 0x8972, 0x21AD, 0x8973, 0x897A, 0x49D2, 0x897B, 0x897B, 0x1BC5, + 0x897C, 0x897E, 0x49DA, 0x897F, 0x897F, 0x0F06, 0x8980, 0x8980, 0x49DD, + 0x8981, 0x8981, 0x1031, 0x8982, 0x8982, 0x49DE, 0x8983, 0x8983, 0x1BDF, + 0x8984, 0x8985, 0x49DF, 0x8986, 0x8986, 0x06AD, 0x8987, 0x898A, 0x49E1, + 0x898B, 0x898B, 0x1F96, 0x898C, 0x898E, 0x49E5, 0x898F, 0x898F, 0x1F32, + 0x8990, 0x8992, 0x49E8, 0x8993, 0x8993, 0x2084, 0x8994, 0x8995, 0x49EB, + 0x8996, 0x8996, 0x2136, 0x8997, 0x8997, 0x49ED, 0x8998, 0x8998, 0x24B8, + 0x8999, 0x89A0, 0x49EE, 0x89A1, 0x89A1, 0x24BA, 0x89A2, 0x89A5, 0x49F6, + 0x89A6, 0x89A6, 0x24BC, 0x89A7, 0x89A9, 0x49FA, 0x89AA, 0x89AA, 0x20E4, + 0x89AB, 0x89AB, 0x49FD, 0x89AC, 0x89AC, 0x24B9, 0x89AD, 0x89AE, 0x49FE, + 0x89AF, 0x89AF, 0x24BD, 0x89B0, 0x89B1, 0x4A00, 0x89B2, 0x89B2, 0x24BE, + 0x89B3, 0x89B6, 0x4A02, 0x89B7, 0x89B7, 0x24BF, 0x89B8, 0x89B9, 0x4A06, + 0x89BA, 0x89BA, 0x1FD2, 0x89BB, 0x89BC, 0x4A08, 0x89BD, 0x89BD, 0x1FFD, + 0x89BE, 0x89BE, 0x4A0A, 0x89BF, 0x89BF, 0x24BB, 0x89C0, 0x89C0, 0x1F2D, + 0x89C1, 0x89C1, 0x086E, 0x89C2, 0x89C2, 0x0734, 0x89C3, 0x89C3, 0x4A0B, + 0x89C4, 0x89C4, 0x073F, 0x89C5, 0x89C5, 0x0ADE, 0x89C6, 0x89C6, 0x0D6A, + 0x89C7, 0x89C7, 0x193A, 0x89C8, 0x89C8, 0x09AB, 0x89C9, 0x89C9, 0x0924, + 0x89CA, 0x89CC, 0x193B, 0x89CD, 0x89CD, 0x4A0C, 0x89CE, 0x89D1, 0x193E, + 0x89D2, 0x89D2, 0x0898, 0x89D3, 0x89D5, 0x4A0D, 0x89D6, 0x89D6, 0x1D57, + 0x89D7, 0x89D9, 0x4A10, 0x89DA, 0x89DA, 0x1D59, 0x89DB, 0x89DB, 0x4A13, + 0x89DC, 0x89DC, 0x1D5A, 0x89DD, 0x89DD, 0x4A14, 0x89DE, 0x89DE, 0x1D58, + 0x89DF, 0x89E2, 0x4A15, 0x89E3, 0x89E3, 0x08B3, 0x89E4, 0x89E4, 0x4A19, + 0x89E5, 0x89E5, 0x1D5B, 0x89E6, 0x89E6, 0x0528, 0x89E7, 0x89EA, 0x4A1A, + 0x89EB, 0x89EB, 0x1D5C, 0x89EC, 0x89EE, 0x4A1E, 0x89EF, 0x89EF, 0x1D5D, + 0x89F0, 0x89F2, 0x4A21, 0x89F3, 0x89F3, 0x19C0, 0x89F4, 0x89F4, 0x2609, + 0x89F5, 0x89F5, 0x4A24, 0x89F6, 0x89F6, 0x260A, 0x89F7, 0x89F7, 0x4A25, + 0x89F8, 0x89F8, 0x1E94, 0x89F9, 0x89FF, 0x4A26, 0x8A00, 0x8A00, 0x0FFD, + 0x8A01, 0x8A01, 0x22DF, 0x8A02, 0x8A02, 0x1ECB, 0x8A03, 0x8A03, 0x1F0D, + 0x8A04, 0x8A06, 0x4A2D, 0x8A07, 0x8A07, 0x12FE, 0x8A08, 0x8A08, 0x1F77, + 0x8A09, 0x8A09, 0x4A30, 0x8A0A, 0x8A0A, 0x21EB, 0x8A0B, 0x8A0B, 0x4A31, + 0x8A0C, 0x8A0C, 0x22E1, 0x8A0D, 0x8A0D, 0x4A32, 0x8A0E, 0x8A0E, 0x216F, + 0x8A0F, 0x8A0F, 0x4A33, 0x8A10, 0x8A10, 0x22E0, 0x8A11, 0x8A12, 0x4A34, + 0x8A13, 0x8A13, 0x21EA, 0x8A14, 0x8A14, 0x4A36, 0x8A15, 0x8A15, 0x22E2, + 0x8A16, 0x8A16, 0x20CB, 0x8A17, 0x8A17, 0x4A37, 0x8A18, 0x8A18, 0x1F78, + 0x8A19, 0x8A1A, 0x4A38, 0x8A1B, 0x8A1B, 0x1EE2, 0x8A1C, 0x8A1C, 0x4A3A, + 0x8A1D, 0x8A1D, 0x21F2, 0x8A1E, 0x8A1E, 0x4A3B, 0x8A1F, 0x8A1F, 0x2150, + 0x8A20, 0x8A22, 0x4A3C, 0x8A23, 0x8A23, 0x1FD3, 0x8A24, 0x8A24, 0x4A3F, + 0x8A25, 0x8A25, 0x22E5, 0x8A26, 0x8A29, 0x4A40, 0x8A2A, 0x8A2A, 0x1EF2, + 0x8A2B, 0x8A2C, 0x4A44, 0x8A2D, 0x8A2D, 0x211F, 0x8A2E, 0x8A30, 0x4A46, + 0x8A31, 0x8A31, 0x21DD, 0x8A32, 0x8A33, 0x4A49, 0x8A34, 0x8A34, 0x2154, + 0x8A35, 0x8A35, 0x4A4B, 0x8A36, 0x8A36, 0x22E7, 0x8A37, 0x8A39, 0x4A4C, + 0x8A3A, 0x8A3A, 0x2282, 0x8A3B, 0x8A3D, 0x4A4F, 0x8A3E, 0x8A3E, 0x1D5E, + 0x8A3F, 0x8A40, 0x4A52, 0x8A41, 0x8A41, 0x22E6, 0x8A42, 0x8A45, 0x4A54, + 0x8A46, 0x8A46, 0x22E8, 0x8A47, 0x8A47, 0x4A58, 0x8A48, 0x8A48, 0x1A84, + 0x8A49, 0x8A4D, 0x4A59, 0x8A4E, 0x8A4E, 0x22E4, 0x8A4F, 0x8A4F, 0x4A5E, + 0x8A50, 0x8A50, 0x226A, 0x8A51, 0x8A51, 0x4A5F, 0x8A52, 0x8A52, 0x22EB, + 0x8A53, 0x8A53, 0x4A60, 0x8A54, 0x8A54, 0x22E9, 0x8A55, 0x8A55, 0x20BD, + 0x8A56, 0x8A57, 0x4A61, 0x8A58, 0x8A58, 0x22EA, 0x8A59, 0x8A5A, 0x4A63, + 0x8A5B, 0x8A5B, 0x22BD, 0x8A5C, 0x8A5D, 0x4A65, 0x8A5E, 0x8A5E, 0x1E9E, + 0x8A5F, 0x8A60, 0x4A67, 0x8A61, 0x8A61, 0x22F6, 0x8A62, 0x8A62, 0x21E7, + 0x8A63, 0x8A63, 0x2216, 0x8A64, 0x8A65, 0x4A69, 0x8A66, 0x8A66, 0x2137, + 0x8A67, 0x8A68, 0x4A6B, 0x8A69, 0x8A69, 0x212C, 0x8A6A, 0x8A6A, 0x4A6D, + 0x8A6B, 0x8A6B, 0x1E68, 0x8A6C, 0x8A6C, 0x22F2, 0x8A6D, 0x8A6D, 0x1F37, + 0x8A6E, 0x8A6E, 0x22F3, 0x8A6F, 0x8A6F, 0x4A6E, 0x8A70, 0x8A70, 0x22EF, + 0x8A71, 0x8A71, 0x1F50, 0x8A72, 0x8A72, 0x1F10, 0x8A73, 0x8A73, 0x21C8, + 0x8A74, 0x8A74, 0x4A6F, 0x8A75, 0x8A75, 0x22F1, 0x8A76, 0x8A78, 0x4A70, + 0x8A79, 0x8A79, 0x1153, 0x8A7A, 0x8A7B, 0x4A73, 0x8A7C, 0x8A7C, 0x22F0, + 0x8A7D, 0x8A7E, 0x4A75, 0x8A7F, 0x8A7F, 0x22EE, 0x8A80, 0x8A83, 0x4A77, + 0x8A84, 0x8A84, 0x22ED, 0x8A85, 0x8A85, 0x229E, 0x8A86, 0x8A86, 0x22EC, + 0x8A87, 0x8A87, 0x1FE2, 0x8A88, 0x8A88, 0x4A7B, 0x8A89, 0x8A89, 0x10E3, + 0x8A8A, 0x8A8A, 0x0E2F, 0x8A8B, 0x8A8C, 0x4A7C, 0x8A8D, 0x8A8D, 0x20FE, + 0x8A8E, 0x8A90, 0x4A7E, 0x8A91, 0x8A92, 0x22F9, 0x8A93, 0x8A93, 0x0D5B, + 0x8A94, 0x8A94, 0x4A81, 0x8A95, 0x8A95, 0x1EAF, 0x8A96, 0x8A97, 0x4A82, + 0x8A98, 0x8A98, 0x2236, 0x8A99, 0x8A99, 0x4A84, 0x8A9A, 0x8A9A, 0x22F7, + 0x8A9B, 0x8A9D, 0x4A85, 0x8A9E, 0x8A9E, 0x223D, 0x8A9F, 0x8A9F, 0x4A88, + 0x8AA0, 0x8AA0, 0x1E82, 0x8AA1, 0x8AA1, 0x1FB6, 0x8AA2, 0x8AA2, 0x4A89, + 0x8AA3, 0x8AA3, 0x21A4, 0x8AA4, 0x8AA4, 0x21AA, 0x8AA5, 0x8AA5, 0x22F8, + 0x8AA6, 0x8AA6, 0x2151, 0x8AA7, 0x8AA7, 0x4A8A, 0x8AA8, 0x8AA8, 0x1F60, + 0x8AA9, 0x8AAB, 0x4A8B, 0x8AAC, 0x8AAC, 0x2147, 0x8AAD, 0x8AAF, 0x4A8E, + 0x8AB0, 0x8AB0, 0x2145, 0x8AB1, 0x8AB1, 0x4A91, 0x8AB2, 0x8AB2, 0x1FDC, + 0x8AB3, 0x8AB5, 0x4A92, 0x8AB6, 0x8AB6, 0x2301, 0x8AB7, 0x8AB8, 0x4A95, + 0x8AB9, 0x8AB9, 0x1EF5, 0x8ABA, 0x8ABB, 0x4A97, 0x8ABC, 0x8ABC, 0x2218, + 0x8ABD, 0x8ABE, 0x4A99, 0x8ABF, 0x8ABF, 0x1EC6, 0x8AC0, 0x8AC1, 0x4A9B, + 0x8AC2, 0x8AC2, 0x2300, 0x8AC3, 0x8AC3, 0x4A9D, 0x8AC4, 0x8AC4, 0x22B4, + 0x8AC5, 0x8AC6, 0x4A9E, 0x8AC7, 0x8AC7, 0x2169, 0x8AC8, 0x8AC8, 0x4AA0, + 0x8AC9, 0x8AC9, 0x22FD, 0x8ACA, 0x8ACA, 0x4AA1, 0x8ACB, 0x8ACB, 0x20EA, + 0x8ACC, 0x8ACC, 0x4AA2, 0x8ACD, 0x8ACD, 0x22F4, 0x8ACE, 0x8ACE, 0x4AA3, + 0x8ACF, 0x8ACF, 0x22FB, 0x8AD0, 0x8AD0, 0x4AA4, 0x8AD1, 0x8AD1, 0x22FC, + 0x8AD2, 0x8AD2, 0x2027, 0x8AD3, 0x8AD5, 0x4AA5, 0x8AD6, 0x8AD6, 0x2060, + 0x8AD7, 0x8AD7, 0x22FF, 0x8AD8, 0x8ADA, 0x4AA8, 0x8ADB, 0x8ADB, 0x22FE, + 0x8ADC, 0x8ADC, 0x1EC7, 0x8ADD, 0x8ADD, 0x4AAB, 0x8ADE, 0x8ADE, 0x230C, + 0x8ADF, 0x8AE1, 0x4AAC, 0x8AE2, 0x8AE2, 0x22F5, 0x8AE3, 0x8AE3, 0x4AAF, + 0x8AE4, 0x8AE4, 0x2306, 0x8AE5, 0x8AE5, 0x4AB0, 0x8AE6, 0x8AE6, 0x230A, + 0x8AE7, 0x8AE7, 0x21D3, 0x8AE8, 0x8AEA, 0x4AB1, 0x8AEB, 0x8AEB, 0x2303, + 0x8AEC, 0x8AEC, 0x4AB4, 0x8AED, 0x8AED, 0x2307, 0x8AEE, 0x8AEE, 0x230B, + 0x8AEF, 0x8AF0, 0x4AB5, 0x8AF1, 0x8AF1, 0x1F5F, 0x8AF2, 0x8AF2, 0x4AB7, + 0x8AF3, 0x8AF3, 0x2309, 0x8AF4, 0x8AF5, 0x4AB8, 0x8AF6, 0x8AF6, 0x2302, + 0x8AF7, 0x8AF7, 0x1F04, 0x8AF8, 0x8AF8, 0x229D, 0x8AF9, 0x8AF9, 0x4ABA, + 0x8AFA, 0x8AFA, 0x21FB, 0x8AFB, 0x8AFB, 0x4ABB, 0x8AFC, 0x8AFC, 0x2308, + 0x8AFD, 0x8AFD, 0x4ABC, 0x8AFE, 0x8AFE, 0x20AC, 0x8AFF, 0x8AFF, 0x4ABD, + 0x8B00, 0x8B00, 0x208E, 0x8B01, 0x8B01, 0x2305, 0x8B02, 0x8B02, 0x2197, + 0x8B03, 0x8B03, 0x4ABE, 0x8B04, 0x8B04, 0x2171, 0x8B05, 0x8B05, 0x2298, + 0x8B06, 0x8B06, 0x4ABF, 0x8B07, 0x8B07, 0x173C, 0x8B08, 0x8B09, 0x4AC0, + 0x8B0A, 0x8B0A, 0x1F57, 0x8B0B, 0x8B0D, 0x4AC2, 0x8B0E, 0x8B0E, 0x2082, + 0x8B0F, 0x8B0F, 0x4AC5, 0x8B10, 0x8B10, 0x2311, 0x8B11, 0x8B13, 0x4AC6, + 0x8B14, 0x8B14, 0x2304, 0x8B15, 0x8B15, 0x4AC9, 0x8B16, 0x8B16, 0x230F, + 0x8B17, 0x8B17, 0x1E35, 0x8B18, 0x8B18, 0x4ACA, 0x8B19, 0x8B19, 0x20D1, + 0x8B1A, 0x8B1A, 0x2310, 0x8B1B, 0x8B1B, 0x1FA3, 0x8B1C, 0x8B1C, 0x4ACB, + 0x8B1D, 0x8B1D, 0x21D6, 0x8B1E, 0x8B20, 0x4ACC, 0x8B21, 0x8B21, 0x2206, + 0x8B22, 0x8B25, 0x4ACF, 0x8B26, 0x8B26, 0x1D5F, 0x8B27, 0x8B27, 0x4AD3, + 0x8B28, 0x8B28, 0x230D, 0x8B29, 0x8B2A, 0x4AD4, 0x8B2B, 0x8B2B, 0x2312, + 0x8B2C, 0x8B2C, 0x208D, 0x8B2D, 0x8B2D, 0x2313, 0x8B2E, 0x8B32, 0x4AD6, + 0x8B33, 0x8B33, 0x22E3, 0x8B34, 0x8B38, 0x4ADB, 0x8B39, 0x8B39, 0x1FBA, + 0x8B3A, 0x8B3D, 0x4AE0, 0x8B3E, 0x8B3E, 0x2078, 0x8B3F, 0x8B48, 0x4AE4, + 0x8B49, 0x8B49, 0x2288, 0x8B4A, 0x8B4D, 0x4AEE, 0x8B4E, 0x8B4E, 0x2316, + 0x8B4F, 0x8B4F, 0x1F6B, 0x8B50, 0x8B55, 0x4AF2, 0x8B56, 0x8B56, 0x2314, + 0x8B57, 0x8B57, 0x4AF8, 0x8B58, 0x8B58, 0x2130, 0x8B59, 0x8B59, 0x2315, + 0x8B5A, 0x8B5A, 0x2168, 0x8B5B, 0x8B5B, 0x4AF9, 0x8B5C, 0x8B5C, 0x20C4, + 0x8B5D, 0x8B65, 0x4AFA, 0x8B66, 0x8B66, 0x08DE, 0x8B67, 0x8B6A, 0x4B03, + 0x8B6B, 0x8B6B, 0x2318, 0x8B6C, 0x8B6C, 0x0BC8, 0x8B6D, 0x8B6E, 0x4B07, + 0x8B6F, 0x8B6F, 0x2219, 0x8B70, 0x8B70, 0x2217, 0x8B71, 0x8B73, 0x4B09, + 0x8B74, 0x8B74, 0x20D5, 0x8B75, 0x8B76, 0x4B0C, 0x8B77, 0x8B77, 0x1F4A, + 0x8B78, 0x8B7C, 0x4B0E, 0x8B7D, 0x8B7D, 0x2240, 0x8B7E, 0x8B7F, 0x4B13, + 0x8B80, 0x8B80, 0x1ED3, 0x8B81, 0x8B89, 0x4B15, 0x8B8A, 0x8B8A, 0x1E49, + 0x8B8B, 0x8B8D, 0x4B1E, 0x8B8E, 0x8B8E, 0x261B, 0x8B8F, 0x8B91, 0x4B21, + 0x8B92, 0x8B92, 0x1E6D, 0x8B93, 0x8B93, 0x20F8, 0x8B94, 0x8B94, 0x4B24, + 0x8B95, 0x8B95, 0x1FFB, 0x8B96, 0x8B96, 0x2319, 0x8B97, 0x8B9B, 0x4B25, + 0x8B9C, 0x8B9C, 0x230E, 0x8B9D, 0x8B9D, 0x4B2A, 0x8B9E, 0x8B9E, 0x2317, + 0x8B9F, 0x8B9F, 0x4B2B, 0x8BA0, 0x8BA0, 0x1317, 0x8BA1, 0x8BA1, 0x0839, + 0x8BA2, 0x8BA2, 0x05E8, 0x8BA3, 0x8BA3, 0x06B7, 0x8BA4, 0x8BA4, 0x0CAA, + 0x8BA5, 0x8BA5, 0x0818, 0x8BA6, 0x8BA7, 0x1318, 0x8BA8, 0x8BA8, 0x0E29, + 0x8BA9, 0x8BA9, 0x0C9E, 0x8BAA, 0x8BAA, 0x131A, 0x8BAB, 0x8BAB, 0x0C1C, + 0x8BAC, 0x8BAC, 0x4B2C, 0x8BAD, 0x8BAD, 0x0FDE, 0x8BAE, 0x8BAE, 0x1070, + 0x8BAF, 0x8BAF, 0x0FDF, 0x8BB0, 0x8BB0, 0x083A, 0x8BB1, 0x8BB1, 0x4B2D, + 0x8BB2, 0x8BB2, 0x0883, 0x8BB3, 0x8BB3, 0x07F9, 0x8BB4, 0x8BB5, 0x131B, + 0x8BB6, 0x8BB6, 0x0FF1, 0x8BB7, 0x8BB7, 0x131D, 0x8BB8, 0x8BB8, 0x0FB8, + 0x8BB9, 0x8BB9, 0x062E, 0x8BBA, 0x8BBA, 0x0A82, 0x8BBB, 0x8BBB, 0x4B2E, + 0x8BBC, 0x8BBC, 0x0DC4, 0x8BBD, 0x8BBD, 0x068A, 0x8BBE, 0x8BBE, 0x0D21, + 0x8BBF, 0x8BBF, 0x0660, 0x8BC0, 0x8BC0, 0x0926, 0x8BC1, 0x8BC1, 0x11A3, + 0x8BC2, 0x8BC3, 0x131E, 0x8BC4, 0x8BC4, 0x0BDF, 0x8BC5, 0x8BC5, 0x1244, + 0x8BC6, 0x8BC6, 0x0D4D, 0x8BC7, 0x8BC7, 0x4B2F, 0x8BC8, 0x8BC8, 0x114A, + 0x8BC9, 0x8BC9, 0x0DD4, 0x8BCA, 0x8BCA, 0x1190, 0x8BCB, 0x8BCB, 0x1320, + 0x8BCC, 0x8BCC, 0x11DE, 0x8BCD, 0x8BCD, 0x054D, 0x8BCE, 0x8BCE, 0x1322, + 0x8BCF, 0x8BCF, 0x1321, 0x8BD0, 0x8BD0, 0x4B30, 0x8BD1, 0x8BD1, 0x1072, + 0x8BD2, 0x8BD4, 0x1323, 0x8BD5, 0x8BD5, 0x0D6B, 0x8BD6, 0x8BD6, 0x1326, + 0x8BD7, 0x8BD7, 0x0D42, 0x8BD8, 0x8BD9, 0x1327, 0x8BDA, 0x8BDA, 0x04F4, + 0x8BDB, 0x8BDB, 0x11EE, 0x8BDC, 0x8BDC, 0x1329, 0x8BDD, 0x8BDD, 0x07C5, + 0x8BDE, 0x8BDE, 0x058F, 0x8BDF, 0x8BE0, 0x132A, 0x8BE1, 0x8BE1, 0x0747, + 0x8BE2, 0x8BE2, 0x0FD8, 0x8BE3, 0x8BE3, 0x106F, 0x8BE4, 0x8BE4, 0x132C, + 0x8BE5, 0x8BE5, 0x06BE, 0x8BE6, 0x8BE6, 0x0F57, 0x8BE7, 0x8BE7, 0x04B6, + 0x8BE8, 0x8BE9, 0x132D, 0x8BEA, 0x8BEA, 0x4B31, 0x8BEB, 0x8BEB, 0x08BC, + 0x8BEC, 0x8BEC, 0x0EEB, 0x8BED, 0x8BED, 0x10D4, 0x8BEE, 0x8BEE, 0x132F, + 0x8BEF, 0x8BEF, 0x0F02, 0x8BF0, 0x8BF0, 0x1330, 0x8BF1, 0x8BF1, 0x10BA, + 0x8BF2, 0x8BF2, 0x07FA, 0x8BF3, 0x8BF3, 0x1331, 0x8BF4, 0x8BF4, 0x0DAA, + 0x8BF5, 0x8BF5, 0x0DC5, 0x8BF6, 0x8BF6, 0x1332, 0x8BF7, 0x8BF7, 0x0C68, + 0x8BF8, 0x8BF8, 0x11ED, 0x8BF9, 0x8BF9, 0x1333, 0x8BFA, 0x8BFA, 0x0B76, + 0x8BFB, 0x8BFB, 0x0600, 0x8BFC, 0x8BFC, 0x1334, 0x8BFD, 0x8BFD, 0x0669, + 0x8BFE, 0x8BFE, 0x095B, 0x8BFF, 0x8BFF, 0x1335, 0x8C00, 0x8C00, 0x1336, + 0x8C01, 0x8C01, 0x0DA2, 0x8C02, 0x8C02, 0x1337, 0x8C03, 0x8C03, 0x05D8, + 0x8C04, 0x8C04, 0x1338, 0x8C05, 0x8C05, 0x0A0B, 0x8C06, 0x8C06, 0x1218, + 0x8C07, 0x8C07, 0x1339, 0x8C08, 0x8C08, 0x0E0B, 0x8C09, 0x8C09, 0x4B32, + 0x8C0A, 0x8C0A, 0x1071, 0x8C0B, 0x8C0B, 0x0B14, 0x8C0C, 0x8C0C, 0x133A, + 0x8C0D, 0x8C0D, 0x05DE, 0x8C0E, 0x8C0E, 0x07E6, 0x8C0F, 0x8C0F, 0x133B, + 0x8C10, 0x8C10, 0x0F7E, 0x8C11, 0x8C12, 0x133C, 0x8C13, 0x8C13, 0x0ECC, + 0x8C14, 0x8C16, 0x133E, 0x8C17, 0x8C17, 0x04BE, 0x8C18, 0x8C18, 0x1343, + 0x8C19, 0x8C19, 0x1341, 0x8C1A, 0x8C1A, 0x1011, 0x8C1B, 0x8C1B, 0x1342, + 0x8C1C, 0x8C1C, 0x0ADA, 0x8C1D, 0x8C1D, 0x1344, 0x8C1E, 0x8C1E, 0x4B33, + 0x8C1F, 0x8C21, 0x1345, 0x8C22, 0x8C22, 0x0F86, 0x8C23, 0x8C23, 0x102C, + 0x8C24, 0x8C24, 0x0404, 0x8C25, 0x8C25, 0x1348, 0x8C26, 0x8C26, 0x0C28, + 0x8C27, 0x8C27, 0x1349, 0x8C28, 0x8C28, 0x08C8, 0x8C29, 0x8C29, 0x0AA6, + 0x8C2A, 0x8C2B, 0x134A, 0x8C2C, 0x8C2C, 0x0B02, 0x8C2D, 0x8C2D, 0x0E0A, + 0x8C2E, 0x8C2F, 0x134C, 0x8C30, 0x8C30, 0x09A9, 0x8C31, 0x8C31, 0x0BF6, + 0x8C32, 0x8C33, 0x134E, 0x8C34, 0x8C34, 0x0C31, 0x8C35, 0x8C36, 0x1350, + 0x8C37, 0x8C37, 0x0721, 0x8C38, 0x8C40, 0x4B34, 0x8C41, 0x8C41, 0x0802, + 0x8C42, 0x8C45, 0x4B3D, 0x8C46, 0x8C46, 0x05F8, 0x8C47, 0x8C47, 0x1CF6, + 0x8C48, 0x8C48, 0x20C8, 0x8C49, 0x8C49, 0x1CF7, 0x8C4A, 0x8C4B, 0x4B41, + 0x8C4C, 0x8C4C, 0x0E94, 0x8C4D, 0x8C4F, 0x4B43, 0x8C50, 0x8C50, 0x1EFD, + 0x8C51, 0x8C54, 0x4B46, 0x8C55, 0x8C55, 0x1D15, 0x8C56, 0x8C59, 0x4B4A, + 0x8C5A, 0x8C5A, 0x1990, 0x8C5B, 0x8C60, 0x4B4E, 0x8C61, 0x8C61, 0x0F60, + 0x8C62, 0x8C62, 0x07D4, 0x8C63, 0x8C69, 0x4B54, 0x8C6A, 0x8C6A, 0x0777, + 0x8C6B, 0x8C6B, 0x10E8, 0x8C6C, 0x8C72, 0x4B5B, 0x8C73, 0x8C73, 0x15DD, + 0x8C74, 0x8C77, 0x4B62, 0x8C78, 0x8C78, 0x1D50, 0x8C79, 0x8C79, 0x0413, + 0x8C7A, 0x8C7A, 0x04B9, 0x8C7B, 0x8C81, 0x4B66, 0x8C82, 0x8C82, 0x1D51, + 0x8C83, 0x8C84, 0x4B6D, 0x8C85, 0x8C85, 0x1D53, 0x8C86, 0x8C88, 0x4B6F, + 0x8C89, 0x8C89, 0x0788, 0x8C8A, 0x8C8A, 0x1D52, 0x8C8B, 0x8C8B, 0x4B72, + 0x8C8C, 0x8C8C, 0x0AB7, 0x8C8D, 0x8C93, 0x4B73, 0x8C94, 0x8C94, 0x1D55, + 0x8C95, 0x8C97, 0x4B7A, 0x8C98, 0x8C98, 0x1D54, 0x8C99, 0x8C9C, 0x4B7D, + 0x8C9D, 0x8C9D, 0x1E3B, 0x8C9E, 0x8C9E, 0x227F, 0x8C9F, 0x8C9F, 0x4B81, + 0x8CA0, 0x8CA0, 0x1F0C, 0x8CA1, 0x8CA1, 0x1E59, 0x8CA2, 0x8CA2, 0x1F24, + 0x8CA3, 0x8CA6, 0x4B82, 0x8CA7, 0x8CA7, 0x20BA, 0x8CA8, 0x8CA8, 0x1F65, + 0x8CA9, 0x8CA9, 0x1EF0, 0x8CAA, 0x8CAA, 0x2164, 0x8CAB, 0x8CAB, 0x1F30, + 0x8CAC, 0x8CAC, 0x2261, 0x8CAD, 0x8CAE, 0x4B86, 0x8CAF, 0x8CAF, 0x22A2, + 0x8CB0, 0x8CB0, 0x24AB, 0x8CB1, 0x8CB1, 0x4B88, 0x8CB2, 0x8CB2, 0x24AF, + 0x8CB3, 0x8CB3, 0x1EE8, 0x8CB4, 0x8CB4, 0x1F39, 0x8CB5, 0x8CB5, 0x4B89, + 0x8CB6, 0x8CB6, 0x1E48, 0x8CB7, 0x8CB7, 0x2070, 0x8CB8, 0x8CB8, 0x1EA8, + 0x8CB9, 0x8CB9, 0x4B8A, 0x8CBA, 0x8CBA, 0x24AC, 0x8CBB, 0x8CBB, 0x1EF7, + 0x8CBC, 0x8CBC, 0x2176, 0x8CBD, 0x8CBD, 0x24AD, 0x8CBE, 0x8CBE, 0x4B8B, + 0x8CBF, 0x8CBF, 0x207B, 0x8CC0, 0x8CC0, 0x1F45, 0x8CC1, 0x8CC1, 0x24AA, + 0x8CC2, 0x8CC2, 0x204B, 0x8CC3, 0x8CC3, 0x202F, 0x8CC4, 0x8CC4, 0x1F5A, + 0x8CC5, 0x8CC5, 0x24B0, 0x8CC6, 0x8CC6, 0x4B8C, 0x8CC7, 0x8CC7, 0x22B7, + 0x8CC8, 0x8CC8, 0x1F7F, 0x8CC9, 0x8CC9, 0x4B8D, 0x8CCA, 0x8CCA, 0x2265, + 0x8CCB, 0x8CD0, 0x4B8E, 0x8CD1, 0x8CD1, 0x24B2, 0x8CD2, 0x8CD2, 0x211B, + 0x8CD3, 0x8CD3, 0x1E51, 0x8CD4, 0x8CD4, 0x4B94, 0x8CD5, 0x8CD5, 0x24B4, + 0x8CD6, 0x8CD9, 0x4B95, 0x8CDA, 0x8CDA, 0x24B3, 0x8CDB, 0x8CDB, 0x4B99, + 0x8CDC, 0x8CDC, 0x1E9F, 0x8CDD, 0x8CDD, 0x4B9A, 0x8CDE, 0x8CDE, 0x2118, + 0x8CDF, 0x8CDF, 0x4B9B, 0x8CE0, 0x8CE0, 0x20B4, 0x8CE1, 0x8CE1, 0x23AF, + 0x8CE2, 0x8CE2, 0x21BB, 0x8CE3, 0x8CE3, 0x2072, 0x8CE4, 0x8CE4, 0x1F95, + 0x8CE5, 0x8CE5, 0x4B9C, 0x8CE6, 0x8CE6, 0x1F0A, 0x8CE7, 0x8CE7, 0x24B6, + 0x8CE8, 0x8CE9, 0x4B9D, 0x8CEA, 0x8CEA, 0x2291, 0x8CEB, 0x8CEB, 0x24B5, + 0x8CEC, 0x8CEC, 0x2278, 0x8CED, 0x8CED, 0x1ED4, 0x8CEE, 0x8CF3, 0x4B9F, + 0x8CF4, 0x8CF4, 0x1FF3, 0x8CF5, 0x8CF9, 0x4BA5, 0x8CFA, 0x8CFA, 0x22A9, + 0x8CFB, 0x8CFB, 0x24B7, 0x8CFC, 0x8CFC, 0x1F28, 0x8CFD, 0x8CFD, 0x2109, + 0x8CFE, 0x8CFE, 0x22C7, 0x8CFF, 0x8CFF, 0x4BAA, 0x8D00, 0x8D03, 0x4BAB, + 0x8D04, 0x8D04, 0x24AE, 0x8D05, 0x8D05, 0x22B1, 0x8D06, 0x8D07, 0x4BAF, + 0x8D08, 0x8D08, 0x2266, 0x8D09, 0x8D09, 0x4BB1, 0x8D0A, 0x8D0A, 0x225B, + 0x8D0B, 0x8D0B, 0x22C4, 0x8D0C, 0x8D0C, 0x4BB2, 0x8D0D, 0x8D0D, 0x2115, + 0x8D0E, 0x8D0E, 0x4BB3, 0x8D0F, 0x8D0F, 0x222A, 0x8D10, 0x8D10, 0x24B1, + 0x8D11, 0x8D15, 0x4BB4, 0x8D16, 0x8D16, 0x213D, 0x8D17, 0x8D1A, 0x4BB9, + 0x8D1B, 0x8D1B, 0x1F15, 0x8D1C, 0x8D1C, 0x225C, 0x8D1D, 0x8D1D, 0x041D, + 0x8D1E, 0x8D1E, 0x118B, 0x8D1F, 0x8D1F, 0x06B5, 0x8D20, 0x8D20, 0x4BBD, + 0x8D21, 0x8D21, 0x070A, 0x8D22, 0x8D22, 0x048D, 0x8D23, 0x8D23, 0x1133, + 0x8D24, 0x8D24, 0x0F3A, 0x8D25, 0x8D25, 0x03E7, 0x8D26, 0x8D26, 0x116C, + 0x8D27, 0x8D27, 0x080A, 0x8D28, 0x8D28, 0x11C9, 0x8D29, 0x8D29, 0x0654, + 0x8D2A, 0x8D2A, 0x0E03, 0x8D2B, 0x8D2B, 0x0BD5, 0x8D2C, 0x8D2C, 0x044A, + 0x8D2D, 0x8D2D, 0x0713, 0x8D2E, 0x8D2E, 0x11FB, 0x8D2F, 0x8D2F, 0x073A, + 0x8D30, 0x8D30, 0x063E, 0x8D31, 0x8D31, 0x086D, 0x8D32, 0x8D33, 0x192C, + 0x8D34, 0x8D34, 0x0E4C, 0x8D35, 0x8D35, 0x074C, 0x8D36, 0x8D36, 0x192E, + 0x8D37, 0x8D37, 0x057E, 0x8D38, 0x8D38, 0x0AB8, 0x8D39, 0x8D39, 0x066E, + 0x8D3A, 0x8D3A, 0x078F, 0x8D3B, 0x8D3B, 0x192F, 0x8D3C, 0x8D3C, 0x1137, + 0x8D3D, 0x8D3D, 0x1930, 0x8D3E, 0x8D3E, 0x0849, 0x8D3F, 0x8D3F, 0x07F4, + 0x8D40, 0x8D40, 0x1931, 0x8D41, 0x8D41, 0x0A27, 0x8D42, 0x8D42, 0x0A5F, + 0x8D43, 0x8D43, 0x1122, 0x8D44, 0x8D44, 0x1227, 0x8D45, 0x8D46, 0x1932, + 0x8D47, 0x8D47, 0x1936, 0x8D48, 0x8D49, 0x1934, 0x8D4A, 0x8D4A, 0x0D17, + 0x8D4B, 0x8D4B, 0x06AE, 0x8D4C, 0x8D4C, 0x0603, 0x8D4D, 0x8D4D, 0x1937, + 0x8D4E, 0x8D4E, 0x0D81, 0x8D4F, 0x8D4F, 0x0D06, 0x8D50, 0x8D50, 0x0550, + 0x8D51, 0x8D52, 0x4BBE, 0x8D53, 0x8D53, 0x163B, 0x8D54, 0x8D54, 0x0BA3, + 0x8D55, 0x8D55, 0x1938, 0x8D56, 0x8D56, 0x09A0, 0x8D57, 0x8D57, 0x4BC0, + 0x8D58, 0x8D58, 0x1215, 0x8D59, 0x8D59, 0x1939, 0x8D5A, 0x8D5A, 0x1209, + 0x8D5B, 0x8D5B, 0x0CD7, 0x8D5C, 0x8D5C, 0x1289, 0x8D5D, 0x8D5D, 0x1283, + 0x8D5E, 0x8D5E, 0x1121, 0x8D5F, 0x8D5F, 0x4BC1, 0x8D60, 0x8D60, 0x113C, + 0x8D61, 0x8D61, 0x0CFD, 0x8D62, 0x8D62, 0x1093, 0x8D63, 0x8D63, 0x06CE, + 0x8D64, 0x8D64, 0x0505, 0x8D65, 0x8D65, 0x4BC2, 0x8D66, 0x8D66, 0x0D1B, + 0x8D67, 0x8D67, 0x1CF4, 0x8D68, 0x8D6A, 0x4BC3, 0x8D6B, 0x8D6B, 0x078C, + 0x8D6C, 0x8D6C, 0x4BC6, 0x8D6D, 0x8D6D, 0x1CF5, 0x8D6E, 0x8D6F, 0x4BC7, + 0x8D70, 0x8D70, 0x123C, 0x8D71, 0x8D72, 0x4BC9, 0x8D73, 0x8D73, 0x1CEF, + 0x8D74, 0x8D74, 0x06AB, 0x8D75, 0x8D75, 0x1175, 0x8D76, 0x8D76, 0x06CA, + 0x8D77, 0x8D77, 0x0C0F, 0x8D78, 0x8D80, 0x4BCB, 0x8D81, 0x8D81, 0x04E8, + 0x8D82, 0x8D83, 0x4BD4, 0x8D84, 0x8D84, 0x1CF0, 0x8D85, 0x8D85, 0x04D1, + 0x8D86, 0x8D89, 0x4BD6, 0x8D8A, 0x8D8A, 0x1100, 0x8D8B, 0x8D8B, 0x0C74, + 0x8D8C, 0x8D90, 0x4BDA, 0x8D91, 0x8D91, 0x1CF2, 0x8D92, 0x8D93, 0x4BDF, + 0x8D94, 0x8D94, 0x1CF1, 0x8D95, 0x8D95, 0x1F14, 0x8D96, 0x8D98, 0x4BE1, + 0x8D99, 0x8D99, 0x227A, 0x8D9A, 0x8D9E, 0x4BE4, 0x8D9F, 0x8D9F, 0x0E1E, + 0x8DA0, 0x8DA2, 0x4BE9, 0x8DA3, 0x8DA3, 0x0C7F, 0x8DA4, 0x8DA7, 0x4BEC, + 0x8DA8, 0x8DA8, 0x20EE, 0x8DA9, 0x8DB0, 0x4BF0, 0x8DB1, 0x8DB1, 0x1CF3, + 0x8DB2, 0x8DB2, 0x25F8, 0x8DB3, 0x8DB3, 0x1240, 0x8DB4, 0x8DB4, 0x0B80, + 0x8DB5, 0x8DB5, 0x1D1C, 0x8DB6, 0x8DB7, 0x4BF8, 0x8DB8, 0x8DB8, 0x1D17, + 0x8DB9, 0x8DB9, 0x4BFA, 0x8DBA, 0x8DBA, 0x1D1F, 0x8DBB, 0x8DBB, 0x4BFB, + 0x8DBC, 0x8DBC, 0x1D1E, 0x8DBD, 0x8DBD, 0x4BFC, 0x8DBE, 0x8DBE, 0x11B9, + 0x8DBF, 0x8DBF, 0x1D1D, 0x8DC0, 0x8DC2, 0x4BFD, 0x8DC3, 0x8DC3, 0x1101, + 0x8DC4, 0x8DC4, 0x1D20, 0x8DC5, 0x8DC5, 0x4C00, 0x8DC6, 0x8DC6, 0x1D28, + 0x8DC7, 0x8DCA, 0x4C01, 0x8DCB, 0x8DCB, 0x03DA, 0x8DCC, 0x8DCC, 0x05D9, + 0x8DCD, 0x8DCD, 0x4C05, 0x8DCE, 0x8DCF, 0x1D25, 0x8DD0, 0x8DD0, 0x4C06, + 0x8DD1, 0x8DD1, 0x0B9D, 0x8DD2, 0x8DD5, 0x4C07, 0x8DD6, 0x8DD7, 0x1D21, + 0x8DD8, 0x8DD9, 0x4C0B, 0x8DDA, 0x8DDA, 0x1D23, 0x8DDB, 0x8DDB, 0x1D27, + 0x8DDC, 0x8DDC, 0x4C0D, 0x8DDD, 0x8DDD, 0x090F, 0x8DDE, 0x8DDE, 0x1D24, + 0x8DDF, 0x8DDF, 0x06F5, 0x8DE0, 0x8DE2, 0x4C0E, 0x8DE3, 0x8DE3, 0x1D2C, + 0x8DE4, 0x8DE4, 0x1D2F, 0x8DE5, 0x8DE7, 0x4C11, 0x8DE8, 0x8DE8, 0x0974, + 0x8DE9, 0x8DE9, 0x4C14, 0x8DEA, 0x8DEA, 0x074B, 0x8DEB, 0x8DEB, 0x1D18, + 0x8DEC, 0x8DEC, 0x1D29, 0x8DED, 0x8DEE, 0x4C15, 0x8DEF, 0x8DEF, 0x0A5E, + 0x8DF0, 0x8DF2, 0x4C17, 0x8DF3, 0x8DF3, 0x0E4B, 0x8DF4, 0x8DF4, 0x4C1A, + 0x8DF5, 0x8DF5, 0x086C, 0x8DF6, 0x8DF6, 0x4C1B, 0x8DF7, 0x8DF8, 0x1D2A, + 0x8DF9, 0x8DF9, 0x1D2D, 0x8DFA, 0x8DFA, 0x0624, 0x8DFB, 0x8DFB, 0x1D2E, + 0x8DFC, 0x8DFC, 0x4C1C, 0x8DFD, 0x8DFD, 0x1D31, 0x8DFE, 0x8DFF, 0x4C1D, + 0x8E00, 0x8E04, 0x4C1F, 0x8E05, 0x8E05, 0x1D19, 0x8E06, 0x8E08, 0x4C24, + 0x8E09, 0x8E09, 0x1D30, 0x8E0A, 0x8E0A, 0x10A0, 0x8E0B, 0x8E0B, 0x4C27, + 0x8E0C, 0x8E0C, 0x0511, 0x8E0D, 0x8E0E, 0x4C28, 0x8E0F, 0x8E0F, 0x0DF7, + 0x8E10, 0x8E10, 0x1F94, 0x8E11, 0x8E13, 0x4C2A, 0x8E14, 0x8E14, 0x1D32, + 0x8E15, 0x8E1C, 0x4C2D, 0x8E1D, 0x8E1D, 0x1D33, 0x8E1E, 0x8E1E, 0x0910, + 0x8E1F, 0x8E1F, 0x1D34, 0x8E20, 0x8E21, 0x4C35, 0x8E22, 0x8E22, 0x0E32, + 0x8E23, 0x8E23, 0x1D37, 0x8E24, 0x8E28, 0x4C37, 0x8E29, 0x8E29, 0x048F, + 0x8E2A, 0x8E2A, 0x1236, 0x8E2B, 0x8E2B, 0x4C3C, 0x8E2C, 0x8E2C, 0x1D35, + 0x8E2D, 0x8E2D, 0x4C3D, 0x8E2E, 0x8E2E, 0x1D36, 0x8E2F, 0x8E2F, 0x1D38, + 0x8E30, 0x8E30, 0x4C3E, 0x8E31, 0x8E31, 0x1D3E, 0x8E32, 0x8E33, 0x4C3F, + 0x8E34, 0x8E34, 0x2230, 0x8E35, 0x8E35, 0x1D3C, 0x8E36, 0x8E38, 0x4C41, + 0x8E39, 0x8E39, 0x1D3B, 0x8E3A, 0x8E3A, 0x1D39, 0x8E3B, 0x8E3C, 0x4C44, + 0x8E3D, 0x8E3D, 0x1D3D, 0x8E3E, 0x8E3F, 0x4C46, 0x8E40, 0x8E40, 0x1D3A, + 0x8E41, 0x8E42, 0x1D40, 0x8E43, 0x8E43, 0x4C48, 0x8E44, 0x8E44, 0x0E36, + 0x8E45, 0x8E46, 0x4C49, 0x8E47, 0x8E47, 0x173B, 0x8E48, 0x8E48, 0x0599, + 0x8E49, 0x8E49, 0x1D3F, 0x8E4A, 0x8E4A, 0x1D44, 0x8E4B, 0x8E4B, 0x0DF6, + 0x8E4C, 0x8E4C, 0x25FD, 0x8E4D, 0x8E50, 0x4C4B, 0x8E51, 0x8E52, 0x1D42, + 0x8E53, 0x8E54, 0x4C4F, 0x8E55, 0x8E55, 0x2600, 0x8E56, 0x8E58, 0x4C51, + 0x8E59, 0x8E59, 0x1D1A, 0x8E5A, 0x8E62, 0x4C54, 0x8E63, 0x8E63, 0x2606, + 0x8E64, 0x8E65, 0x4C5D, 0x8E66, 0x8E66, 0x042D, 0x8E67, 0x8E68, 0x4C5F, + 0x8E69, 0x8E69, 0x1D1B, 0x8E6A, 0x8E6B, 0x4C61, 0x8E6C, 0x8E6C, 0x05A6, + 0x8E6D, 0x8E6D, 0x04AB, 0x8E6E, 0x8E6E, 0x4C63, 0x8E6F, 0x8E6F, 0x1D48, + 0x8E70, 0x8E70, 0x1D45, 0x8E71, 0x8E71, 0x4C64, 0x8E72, 0x8E72, 0x0616, + 0x8E73, 0x8E73, 0x4C65, 0x8E74, 0x8E74, 0x1D49, 0x8E75, 0x8E75, 0x4C66, + 0x8E76, 0x8E76, 0x1D46, 0x8E77, 0x8E79, 0x4C67, 0x8E7A, 0x8E7A, 0x25FF, + 0x8E7B, 0x8E7B, 0x4C6A, 0x8E7C, 0x8E7C, 0x1D47, 0x8E7D, 0x8E7E, 0x4C6B, + 0x8E7F, 0x8E7F, 0x055D, 0x8E80, 0x8E80, 0x4C6D, 0x8E81, 0x8E81, 0x112D, + 0x8E82, 0x8E84, 0x4C6E, 0x8E85, 0x8E85, 0x1D4A, 0x8E86, 0x8E86, 0x4C71, + 0x8E87, 0x8E87, 0x051E, 0x8E88, 0x8E88, 0x4C72, 0x8E89, 0x8E89, 0x25FC, + 0x8E8A, 0x8E8A, 0x1E8C, 0x8E8B, 0x8E8B, 0x2602, 0x8E8C, 0x8E8C, 0x4C73, + 0x8E8D, 0x8E8D, 0x224D, 0x8E8E, 0x8E8E, 0x4C74, 0x8E8F, 0x8E8F, 0x1D4B, + 0x8E90, 0x8E90, 0x1D4D, 0x8E91, 0x8E91, 0x2604, 0x8E92, 0x8E92, 0x25FE, + 0x8E93, 0x8E93, 0x2603, 0x8E94, 0x8E94, 0x1D4C, 0x8E95, 0x8E99, 0x4C75, + 0x8E9A, 0x8E9A, 0x2601, 0x8E9B, 0x8E9B, 0x4C7A, 0x8E9C, 0x8E9C, 0x1D4E, + 0x8E9D, 0x8E9D, 0x4C7B, 0x8E9E, 0x8E9E, 0x1D4F, 0x8E9F, 0x8EA0, 0x4C7C, + 0x8EA1, 0x8EA1, 0x2605, 0x8EA2, 0x8EA4, 0x4C7E, 0x8EA5, 0x8EA5, 0x1EA3, + 0x8EA6, 0x8EA6, 0x2608, 0x8EA7, 0x8EA9, 0x4C81, 0x8EAA, 0x8EAA, 0x2607, + 0x8EAB, 0x8EAB, 0x0D26, 0x8EAC, 0x8EAC, 0x0703, 0x8EAD, 0x8EAE, 0x4C84, + 0x8EAF, 0x8EAF, 0x0C78, 0x8EB0, 0x8EB1, 0x4C86, 0x8EB2, 0x8EB2, 0x0622, + 0x8EB3, 0x8EB9, 0x4C88, 0x8EBA, 0x8EBA, 0x0E1C, 0x8EBB, 0x8EBF, 0x4C8F, + 0x8EC0, 0x8EC0, 0x20F0, 0x8EC1, 0x8EC9, 0x4C94, 0x8ECA, 0x8ECA, 0x1E7B, + 0x8ECB, 0x8ECB, 0x2267, 0x8ECC, 0x8ECC, 0x1F36, 0x8ECD, 0x8ECD, 0x1FD6, + 0x8ECE, 0x8ECE, 0x18F8, 0x8ECF, 0x8ED1, 0x4C9D, 0x8ED2, 0x8ED2, 0x21E0, + 0x8ED3, 0x8ED3, 0x4CA0, 0x8ED4, 0x8ED4, 0x248C, 0x8ED5, 0x8EDA, 0x4CA1, + 0x8EDB, 0x8EDB, 0x248D, 0x8EDC, 0x8EDE, 0x4CA7, 0x8EDF, 0x8EDF, 0x2102, + 0x8EE0, 0x8EE3, 0x4CAA, 0x8EE4, 0x8EE4, 0x2494, 0x8EE5, 0x8EEA, 0x4CAE, + 0x8EEB, 0x8EEB, 0x2493, 0x8EEC, 0x8EF1, 0x4CB4, 0x8EF2, 0x8EF2, 0x248E, + 0x8EF3, 0x8EF7, 0x4CBA, 0x8EF8, 0x8EF8, 0x2299, 0x8EF9, 0x8EF9, 0x2491, + 0x8EFA, 0x8EFA, 0x2496, 0x8EFB, 0x8EFB, 0x248F, 0x8EFC, 0x8EFC, 0x2492, + 0x8EFD, 0x8EFD, 0x4CBF, 0x8EFE, 0x8EFE, 0x2497, 0x8EFF, 0x8EFF, 0x4CC0, + 0x8F00, 0x8F02, 0x4CC1, 0x8F03, 0x8F03, 0x1FB1, 0x8F04, 0x8F04, 0x4CC4, + 0x8F05, 0x8F05, 0x249A, 0x8F06, 0x8F06, 0x4CC5, 0x8F07, 0x8F07, 0x2499, + 0x8F08, 0x8F08, 0x4CC6, 0x8F09, 0x8F09, 0x2258, 0x8F0A, 0x8F0A, 0x2498, + 0x8F0B, 0x8F11, 0x4CC7, 0x8F12, 0x8F12, 0x249B, 0x8F13, 0x8F13, 0x4CCE, + 0x8F14, 0x8F14, 0x1F09, 0x8F15, 0x8F15, 0x20E6, 0x8F16, 0x8F1A, 0x4CCF, + 0x8F1B, 0x8F1B, 0x2026, 0x8F1C, 0x8F1C, 0x249F, 0x8F1D, 0x8F1D, 0x1F59, + 0x8F1E, 0x8F1F, 0x249D, 0x8F20, 0x8F24, 0x4CD4, 0x8F25, 0x8F25, 0x1F3B, + 0x8F26, 0x8F26, 0x249C, 0x8F27, 0x8F28, 0x4CD9, 0x8F29, 0x8F29, 0x1E3A, + 0x8F2A, 0x8F2A, 0x205B, 0x8F2B, 0x8F2E, 0x4CDB, 0x8F2F, 0x8F2F, 0x1F70, + 0x8F30, 0x8F32, 0x4CDF, 0x8F33, 0x8F33, 0x24A0, 0x8F34, 0x8F37, 0x4CE2, + 0x8F38, 0x8F38, 0x213B, 0x8F39, 0x8F3A, 0x4CE6, 0x8F3B, 0x8F3B, 0x1F07, + 0x8F3C, 0x8F3D, 0x4CE8, 0x8F3E, 0x8F3E, 0x2270, 0x8F3F, 0x8F3F, 0x2237, + 0x8F40, 0x8F41, 0x4CEA, 0x8F42, 0x8F42, 0x24D2, 0x8F43, 0x8F43, 0x4CEC, + 0x8F44, 0x8F44, 0x21B3, 0x8F45, 0x8F45, 0x2245, 0x8F46, 0x8F46, 0x24A1, + 0x8F47, 0x8F48, 0x4CED, 0x8F49, 0x8F49, 0x22A8, 0x8F4A, 0x8F4C, 0x4CEF, + 0x8F4D, 0x8F4D, 0x227C, 0x8F4E, 0x8F4E, 0x1FB0, 0x8F4F, 0x8F53, 0x4CF2, + 0x8F54, 0x8F54, 0x24A2, 0x8F55, 0x8F5E, 0x4CF7, 0x8F5F, 0x8F5F, 0x1F46, + 0x8F60, 0x8F60, 0x4D01, 0x8F61, 0x8F61, 0x2380, 0x8F62, 0x8F62, 0x2495, + 0x8F63, 0x8F63, 0x4D02, 0x8F64, 0x8F64, 0x2490, 0x8F65, 0x8F65, 0x4D03, + 0x8F66, 0x8F66, 0x04DA, 0x8F67, 0x8F67, 0x1141, 0x8F68, 0x8F68, 0x0745, + 0x8F69, 0x8F69, 0x0FC4, 0x8F6A, 0x8F6A, 0x4D04, 0x8F6B, 0x8F6B, 0x18E1, + 0x8F6C, 0x8F6C, 0x1207, 0x8F6D, 0x8F6D, 0x18E2, 0x8F6E, 0x8F6E, 0x0A7D, + 0x8F6F, 0x8F6F, 0x0CC8, 0x8F70, 0x8F70, 0x079B, 0x8F71, 0x8F73, 0x18E3, + 0x8F74, 0x8F74, 0x11E0, 0x8F75, 0x8F76, 0x18E6, 0x8F77, 0x8F77, 0x18E9, + 0x8F78, 0x8F78, 0x18E8, 0x8F79, 0x8F7A, 0x18EA, 0x8F7B, 0x8F7B, 0x0C5E, + 0x8F7C, 0x8F7C, 0x18EC, 0x8F7D, 0x8F7D, 0x111B, 0x8F7E, 0x8F7E, 0x18ED, + 0x8F7F, 0x8F7F, 0x089F, 0x8F80, 0x8F80, 0x4D05, 0x8F81, 0x8F82, 0x18EE, + 0x8F83, 0x8F83, 0x08A0, 0x8F84, 0x8F84, 0x18F0, 0x8F85, 0x8F85, 0x06A3, + 0x8F86, 0x8F86, 0x0A07, 0x8F87, 0x8F87, 0x18F1, 0x8F88, 0x8F88, 0x041B, + 0x8F89, 0x8F89, 0x07E9, 0x8F8A, 0x8F8A, 0x074E, 0x8F8B, 0x8F8B, 0x18F2, + 0x8F8C, 0x8F8C, 0x4D06, 0x8F8D, 0x8F8F, 0x18F3, 0x8F90, 0x8F90, 0x0695, + 0x8F91, 0x8F91, 0x0820, 0x8F92, 0x8F92, 0x4D07, 0x8F93, 0x8F93, 0x0D7B, + 0x8F94, 0x8F94, 0x1574, 0x8F95, 0x8F95, 0x10F2, 0x8F96, 0x8F96, 0x0F2A, + 0x8F97, 0x8F97, 0x1158, 0x8F98, 0x8F98, 0x18F6, 0x8F99, 0x8F99, 0x117F, + 0x8F9A, 0x8F9A, 0x18F7, 0x8F9B, 0x8F9B, 0x0F8C, 0x8F9C, 0x8F9C, 0x0715, + 0x8F9D, 0x8F9D, 0x4D08, 0x8F9E, 0x8F9E, 0x054A, 0x8F9F, 0x8F9F, 0x0442, + 0x8FA0, 0x8FA2, 0x4D09, 0x8FA3, 0x8FA3, 0x099C, 0x8FA4, 0x8FA5, 0x4D0C, + 0x8FA6, 0x8FA6, 0x1E30, 0x8FA7, 0x8FA7, 0x4D0E, 0x8FA8, 0x8FA9, 0x044F, + 0x8FAA, 0x8FAA, 0x4D0F, 0x8FAB, 0x8FAB, 0x0451, 0x8FAC, 0x8FAC, 0x4D10, + 0x8FAD, 0x8FAD, 0x1E9D, 0x8FAE, 0x8FAE, 0x1E4B, 0x8FAF, 0x8FAF, 0x1E4A, + 0x8FB0, 0x8FB0, 0x04E2, 0x8FB1, 0x8FB1, 0x0CC3, 0x8FB2, 0x8FB2, 0x20AA, + 0x8FB3, 0x8FB5, 0x4D11, 0x8FB6, 0x8FB6, 0x173D, 0x8FB7, 0x8FB8, 0x4D14, + 0x8FB9, 0x8FB9, 0x0448, 0x8FBA, 0x8FBC, 0x4D16, 0x8FBD, 0x8FBD, 0x0A12, + 0x8FBE, 0x8FBE, 0x0572, 0x8FBF, 0x8FC0, 0x4D19, 0x8FC1, 0x8FC1, 0x0C25, + 0x8FC2, 0x8FC2, 0x10BD, 0x8FC3, 0x8FC3, 0x4D1B, 0x8FC4, 0x8FC4, 0x0C18, + 0x8FC5, 0x8FC5, 0x0FE1, 0x8FC6, 0x8FC6, 0x4D1C, 0x8FC7, 0x8FC7, 0x0756, + 0x8FC8, 0x8FC8, 0x0A9C, 0x8FC9, 0x8FCD, 0x4D1D, 0x8FCE, 0x8FCE, 0x1092, + 0x8FCF, 0x8FCF, 0x4D22, 0x8FD0, 0x8FD0, 0x110E, 0x8FD1, 0x8FD1, 0x08CD, + 0x8FD2, 0x8FD2, 0x4D23, 0x8FD3, 0x8FD3, 0x173E, 0x8FD4, 0x8FD4, 0x0652, + 0x8FD5, 0x8FD5, 0x173F, 0x8FD6, 0x8FD7, 0x4D24, 0x8FD8, 0x8FD8, 0x07CE, + 0x8FD9, 0x8FD9, 0x1183, 0x8FDA, 0x8FDA, 0x4D26, 0x8FDB, 0x8FDB, 0x08C9, + 0x8FDC, 0x8FDC, 0x10F9, 0x8FDD, 0x8FDD, 0x0EB4, 0x8FDE, 0x8FDE, 0x09F5, + 0x8FDF, 0x8FDF, 0x04FE, 0x8FE0, 0x8FE1, 0x4D27, 0x8FE2, 0x8FE2, 0x0E49, + 0x8FE3, 0x8FE3, 0x4D29, 0x8FE4, 0x8FE4, 0x1742, 0x8FE5, 0x8FE5, 0x1740, + 0x8FE6, 0x8FE6, 0x1744, 0x8FE7, 0x8FE7, 0x4D2A, 0x8FE8, 0x8FE8, 0x1746, + 0x8FE9, 0x8FE9, 0x1743, 0x8FEA, 0x8FEA, 0x05B0, 0x8FEB, 0x8FEB, 0x0BE7, + 0x8FEC, 0x8FEC, 0x4D2B, 0x8FED, 0x8FED, 0x05DD, 0x8FEE, 0x8FEE, 0x1741, + 0x8FEF, 0x8FEF, 0x4D2C, 0x8FF0, 0x8FF0, 0x0D8D, 0x8FF1, 0x8FF2, 0x4D2D, + 0x8FF3, 0x8FF3, 0x1745, 0x8FF4, 0x8FF4, 0x267B, 0x8FF5, 0x8FF6, 0x4D2F, + 0x8FF7, 0x8FF7, 0x0AD9, 0x8FF8, 0x8FF8, 0x042E, 0x8FF9, 0x8FF9, 0x0816, + 0x8FFA, 0x8FFC, 0x4D31, 0x8FFD, 0x8FFD, 0x1214, 0x8FFE, 0x8FFF, 0x4D34, + 0x9000, 0x9000, 0x0E7C, 0x9001, 0x9001, 0x0DC2, 0x9002, 0x9002, 0x0D61, + 0x9003, 0x9003, 0x0E26, 0x9004, 0x9004, 0x1748, 0x9005, 0x9005, 0x1747, + 0x9006, 0x9006, 0x0B49, 0x9007, 0x9008, 0x4D36, 0x9009, 0x9009, 0x0FCA, + 0x900A, 0x900A, 0x0FE0, 0x900B, 0x900B, 0x1749, 0x900C, 0x900C, 0x4D38, + 0x900D, 0x900D, 0x174C, 0x900E, 0x900E, 0x4D39, 0x900F, 0x900F, 0x0E69, + 0x9010, 0x9010, 0x11EF, 0x9011, 0x9011, 0x174B, 0x9012, 0x9012, 0x05BE, + 0x9013, 0x9013, 0x4D3A, 0x9014, 0x9014, 0x0E6F, 0x9015, 0x9015, 0x23F2, + 0x9016, 0x9016, 0x174D, 0x9017, 0x9017, 0x05F9, 0x9018, 0x9018, 0x4D3B, + 0x9019, 0x9019, 0x227E, 0x901A, 0x901A, 0x0E59, 0x901B, 0x901B, 0x073D, + 0x901C, 0x901C, 0x4D3C, 0x901D, 0x901D, 0x0D5C, 0x901E, 0x901E, 0x04F6, + 0x901F, 0x901F, 0x0DCE, 0x9020, 0x9020, 0x112F, 0x9021, 0x9021, 0x174E, + 0x9022, 0x9022, 0x0687, 0x9023, 0x9023, 0x2019, 0x9024, 0x9025, 0x4D3D, + 0x9026, 0x9026, 0x174A, 0x9027, 0x902C, 0x4D3F, 0x902D, 0x902D, 0x1751, + 0x902E, 0x902E, 0x0581, 0x902F, 0x902F, 0x1752, 0x9030, 0x9031, 0x4D45, + 0x9032, 0x9032, 0x1FBB, 0x9033, 0x9034, 0x4D47, 0x9035, 0x9036, 0x174F, + 0x9037, 0x9037, 0x4D49, 0x9038, 0x9038, 0x1064, 0x9039, 0x903A, 0x4D4A, + 0x903B, 0x903B, 0x0A86, 0x903C, 0x903C, 0x042F, 0x903D, 0x903D, 0x4D4C, + 0x903E, 0x903E, 0x10C7, 0x903F, 0x9040, 0x4D4D, 0x9041, 0x9041, 0x061C, + 0x9042, 0x9042, 0x0DE1, 0x9043, 0x9043, 0x4D4F, 0x9044, 0x9044, 0x1753, + 0x9045, 0x9046, 0x4D50, 0x9047, 0x9047, 0x10DB, 0x9048, 0x904A, 0x4D52, + 0x904B, 0x904B, 0x2253, 0x904C, 0x904C, 0x4D55, 0x904D, 0x904D, 0x0452, + 0x904E, 0x904E, 0x1F3E, 0x904F, 0x904F, 0x0633, 0x9050, 0x9050, 0x1756, + 0x9051, 0x9052, 0x1754, 0x9053, 0x9053, 0x05A1, 0x9054, 0x9054, 0x1EA6, + 0x9055, 0x9055, 0x218E, 0x9056, 0x9056, 0x4D56, 0x9057, 0x9057, 0x104C, + 0x9058, 0x9058, 0x1758, 0x9059, 0x905A, 0x4D57, 0x905B, 0x905B, 0x175A, + 0x905C, 0x905C, 0x21EC, 0x905D, 0x905D, 0x4D59, 0x905E, 0x905E, 0x1EBE, + 0x905F, 0x905F, 0x4D5A, 0x9060, 0x9060, 0x224A, 0x9061, 0x9061, 0x4D5B, + 0x9062, 0x9062, 0x1759, 0x9063, 0x9063, 0x0C2F, 0x9064, 0x9064, 0x4D5C, + 0x9065, 0x9065, 0x102A, 0x9066, 0x9067, 0x4D5D, 0x9068, 0x9068, 0x1757, + 0x9069, 0x9069, 0x2133, 0x906A, 0x906C, 0x4D5F, 0x906D, 0x906D, 0x1125, + 0x906E, 0x906E, 0x117B, 0x906F, 0x9071, 0x4D62, 0x9072, 0x9072, 0x1E84, + 0x9073, 0x9073, 0x4D65, 0x9074, 0x9074, 0x175C, 0x9075, 0x9075, 0x124E, + 0x9076, 0x9076, 0x4D66, 0x9077, 0x9077, 0x20CF, 0x9078, 0x9078, 0x21E2, + 0x9079, 0x9079, 0x4D67, 0x907A, 0x907A, 0x220F, 0x907B, 0x907B, 0x4D68, + 0x907C, 0x907C, 0x2029, 0x907D, 0x907D, 0x175D, 0x907E, 0x907E, 0x4D69, + 0x907F, 0x907F, 0x0445, 0x9080, 0x9080, 0x1024, 0x9081, 0x9081, 0x2073, + 0x9082, 0x9082, 0x175E, 0x9083, 0x9083, 0x1760, 0x9084, 0x9084, 0x1F55, + 0x9085, 0x9086, 0x4D6A, 0x9087, 0x9087, 0x23F1, 0x9088, 0x9088, 0x175F, + 0x9089, 0x9089, 0x4D6C, 0x908A, 0x908A, 0x1E46, 0x908B, 0x908B, 0x1761, + 0x908C, 0x908E, 0x4D6D, 0x908F, 0x908F, 0x2063, 0x9090, 0x9090, 0x23F3, + 0x9091, 0x9091, 0x105F, 0x9092, 0x9092, 0x4D70, 0x9093, 0x9093, 0x05AC, + 0x9094, 0x9094, 0x4D71, 0x9095, 0x9095, 0x1817, 0x9096, 0x9096, 0x4D72, + 0x9097, 0x9097, 0x1367, 0x9098, 0x9098, 0x4D73, 0x9099, 0x9099, 0x136A, + 0x909A, 0x909A, 0x4D74, 0x909B, 0x909B, 0x1368, 0x909C, 0x909C, 0x4D75, + 0x909D, 0x909D, 0x1369, 0x909E, 0x90A0, 0x4D76, 0x90A1, 0x90A1, 0x136C, + 0x90A2, 0x90A2, 0x0F9A, 0x90A3, 0x90A3, 0x0B2A, 0x90A4, 0x90A5, 0x4D79, + 0x90A6, 0x90A6, 0x03F9, 0x90A7, 0x90A9, 0x4D7B, 0x90AA, 0x90AA, 0x0F7B, + 0x90AB, 0x90AB, 0x4D7E, 0x90AC, 0x90AC, 0x136B, 0x90AD, 0x90AD, 0x4D7F, + 0x90AE, 0x90AE, 0x10AF, 0x90AF, 0x90AF, 0x0761, 0x90B0, 0x90B0, 0x1372, + 0x90B1, 0x90B1, 0x0C6E, 0x90B2, 0x90B2, 0x4D80, 0x90B3, 0x90B3, 0x136E, + 0x90B4, 0x90B4, 0x136D, 0x90B5, 0x90B5, 0x0D14, 0x90B6, 0x90B6, 0x136F, + 0x90B7, 0x90B7, 0x4D81, 0x90B8, 0x90B8, 0x1371, 0x90B9, 0x90B9, 0x123B, + 0x90BA, 0x90BA, 0x1370, 0x90BB, 0x90BB, 0x0A23, 0x90BC, 0x90BD, 0x4D82, + 0x90BE, 0x90BE, 0x1375, 0x90BF, 0x90C0, 0x4D84, 0x90C1, 0x90C1, 0x10D9, + 0x90C2, 0x90C3, 0x4D86, 0x90C4, 0x90C4, 0x1377, 0x90C5, 0x90C5, 0x1374, + 0x90C6, 0x90C6, 0x4D88, 0x90C7, 0x90C7, 0x1378, 0x90C8, 0x90C9, 0x4D89, + 0x90CA, 0x90CA, 0x088D, 0x90CB, 0x90CD, 0x4D8B, 0x90CE, 0x90CE, 0x09B4, + 0x90CF, 0x90CF, 0x1373, 0x90D0, 0x90D0, 0x1376, 0x90D1, 0x90D1, 0x11A2, + 0x90D2, 0x90D2, 0x4D8E, 0x90D3, 0x90D3, 0x1379, 0x90D4, 0x90D6, 0x4D8F, + 0x90D7, 0x90D7, 0x137D, 0x90D8, 0x90DA, 0x4D92, 0x90DB, 0x90DB, 0x137E, + 0x90DC, 0x90DC, 0x137C, 0x90DD, 0x90DD, 0x0779, 0x90DE, 0x90DE, 0x4D95, + 0x90DF, 0x90DF, 0x231E, 0x90E0, 0x90E0, 0x4D96, 0x90E1, 0x90E1, 0x0931, + 0x90E2, 0x90E2, 0x137B, 0x90E3, 0x90E5, 0x4D97, 0x90E6, 0x90E6, 0x137A, + 0x90E7, 0x90E7, 0x110A, 0x90E8, 0x90E8, 0x0486, 0x90E9, 0x90EA, 0x4D9A, + 0x90EB, 0x90EB, 0x137F, 0x90EC, 0x90EC, 0x4D9C, 0x90ED, 0x90ED, 0x0752, + 0x90EE, 0x90EE, 0x4D9D, 0x90EF, 0x90EF, 0x1380, 0x90F0, 0x90F3, 0x4D9E, + 0x90F4, 0x90F4, 0x04E0, 0x90F5, 0x90F5, 0x2233, 0x90F6, 0x90F7, 0x4DA2, + 0x90F8, 0x90F8, 0x0587, 0x90F9, 0x90FC, 0x4DA4, 0x90FD, 0x90FD, 0x05FB, + 0x90FE, 0x90FE, 0x1381, 0x90FF, 0x90FF, 0x4DA8, 0x9100, 0x9101, 0x4DA9, + 0x9102, 0x9102, 0x0634, 0x9103, 0x9103, 0x4DAB, 0x9104, 0x9104, 0x1382, + 0x9105, 0x9105, 0x4DAC, 0x9106, 0x9106, 0x2320, 0x9107, 0x9108, 0x4DAD, + 0x9109, 0x9109, 0x21C7, 0x910A, 0x9111, 0x4DAF, 0x9112, 0x9112, 0x22BC, + 0x9113, 0x9113, 0x4DB7, 0x9114, 0x9114, 0x231C, 0x9115, 0x9115, 0x4DB8, + 0x9116, 0x9116, 0x2251, 0x9117, 0x9118, 0x4DB9, 0x9119, 0x9119, 0x0432, + 0x911A, 0x911D, 0x4DBB, 0x911E, 0x911E, 0x1384, 0x911F, 0x9121, 0x4DBF, + 0x9122, 0x9122, 0x1383, 0x9123, 0x9123, 0x1385, 0x9124, 0x9126, 0x4DC2, + 0x9127, 0x9127, 0x1EBB, 0x9128, 0x912C, 0x4DC5, 0x912D, 0x912D, 0x2287, + 0x912E, 0x912E, 0x4DCA, 0x912F, 0x912F, 0x1387, 0x9130, 0x9130, 0x202D, + 0x9131, 0x9131, 0x1386, 0x9132, 0x9132, 0x1EAB, 0x9133, 0x9133, 0x4DCB, + 0x9134, 0x9134, 0x231D, 0x9135, 0x9135, 0x4DCC, 0x9136, 0x9136, 0x231F, + 0x9137, 0x9138, 0x4DCD, 0x9139, 0x9139, 0x1388, 0x913A, 0x913A, 0x231B, + 0x913B, 0x9142, 0x4DCF, 0x9143, 0x9143, 0x1389, 0x9144, 0x9145, 0x4DD7, + 0x9146, 0x9146, 0x138A, 0x9147, 0x9147, 0x4DD9, 0x9148, 0x9148, 0x2321, + 0x9149, 0x9149, 0x10B4, 0x914A, 0x914A, 0x1CF8, 0x914B, 0x914B, 0x0C72, + 0x914C, 0x914C, 0x1220, 0x914D, 0x914D, 0x0BA5, 0x914E, 0x914F, 0x1CFA, + 0x9150, 0x9150, 0x1CF9, 0x9151, 0x9151, 0x4DDA, 0x9152, 0x9152, 0x08F5, + 0x9153, 0x9156, 0x4DDB, 0x9157, 0x9157, 0x0FBA, 0x9158, 0x9159, 0x4DDF, + 0x915A, 0x915A, 0x0670, 0x915B, 0x915C, 0x4DE1, 0x915D, 0x915D, 0x1110, + 0x915E, 0x915E, 0x0DFD, 0x915F, 0x9160, 0x4DE3, 0x9161, 0x9161, 0x1CFE, + 0x9162, 0x9162, 0x1CFD, 0x9163, 0x9163, 0x075F, 0x9164, 0x9164, 0x1CFC, + 0x9165, 0x9165, 0x0DCB, 0x9166, 0x9168, 0x4DE5, 0x9169, 0x9169, 0x1D00, + 0x916A, 0x916A, 0x09BD, 0x916B, 0x916B, 0x4DE8, 0x916C, 0x916C, 0x050F, + 0x916D, 0x916D, 0x4DE9, 0x916E, 0x916E, 0x0E5B, 0x916F, 0x916F, 0x1D01, + 0x9170, 0x9170, 0x1CFF, 0x9171, 0x9171, 0x0885, 0x9172, 0x9172, 0x1D04, + 0x9173, 0x9173, 0x4DEA, 0x9174, 0x9174, 0x1D05, 0x9175, 0x9175, 0x089E, + 0x9176, 0x9176, 0x0ABD, 0x9177, 0x9177, 0x096E, 0x9178, 0x9178, 0x0DD6, + 0x9179, 0x9179, 0x1D06, 0x917A, 0x917C, 0x4DEB, 0x917D, 0x917E, 0x1D02, + 0x917F, 0x917F, 0x0B53, 0x9180, 0x9184, 0x4DEE, 0x9185, 0x9185, 0x1D08, + 0x9186, 0x9186, 0x4DF3, 0x9187, 0x9187, 0x053F, 0x9188, 0x9188, 0x4DF4, + 0x9189, 0x9189, 0x124A, 0x918A, 0x918A, 0x4DF5, 0x918B, 0x918B, 0x055A, + 0x918C, 0x918C, 0x1D07, 0x918D, 0x918D, 0x1D0A, 0x918E, 0x918F, 0x4DF6, + 0x9190, 0x9190, 0x1D09, 0x9191, 0x9191, 0x1D0B, 0x9192, 0x9192, 0x0F9C, + 0x9193, 0x9195, 0x4DF8, 0x9196, 0x9196, 0x2255, 0x9197, 0x9199, 0x4DFB, + 0x919A, 0x919A, 0x0AD6, 0x919B, 0x919B, 0x0C84, 0x919C, 0x919C, 0x1E8F, + 0x919D, 0x91A1, 0x4DFE, 0x91A2, 0x91A3, 0x1D0C, 0x91A4, 0x91A9, 0x4E03, + 0x91AA, 0x91AA, 0x1D0E, 0x91AB, 0x91AB, 0x220C, 0x91AC, 0x91AC, 0x1FA4, + 0x91AD, 0x91AF, 0x1D0F, 0x91B0, 0x91B3, 0x4E09, 0x91B4, 0x91B4, 0x1D13, + 0x91B5, 0x91B5, 0x1D12, 0x91B6, 0x91B9, 0x4E0D, 0x91BA, 0x91BA, 0x1D14, + 0x91BB, 0x91BF, 0x4E11, 0x91C0, 0x91C0, 0x209B, 0x91C1, 0x91C1, 0x21D8, + 0x91C2, 0x91C2, 0x4E16, 0x91C3, 0x91C3, 0x25FA, 0x91C4, 0x91C4, 0x4E17, + 0x91C5, 0x91C5, 0x25F9, 0x91C6, 0x91C6, 0x4E18, 0x91C7, 0x91C7, 0x0490, + 0x91C8, 0x91C8, 0x4E19, 0x91C9, 0x91C9, 0x10B9, 0x91CA, 0x91CA, 0x0D64, + 0x91CB, 0x91CB, 0x2134, 0x91CC, 0x91CC, 0x09DA, 0x91CD, 0x91CD, 0x11D7, + 0x91CE, 0x91CE, 0x1037, 0x91CF, 0x91CF, 0x0A08, 0x91D0, 0x91D0, 0x4E1A, + 0x91D1, 0x91D1, 0x08C1, 0x91D2, 0x91D4, 0x24F3, 0x91D5, 0x91D5, 0x24F8, + 0x91D6, 0x91D6, 0x4E1B, 0x91D7, 0x91D7, 0x24F7, 0x91D8, 0x91D8, 0x1EC8, + 0x91D9, 0x91D9, 0x24F6, 0x91DA, 0x91DB, 0x4E1C, 0x91DC, 0x91DC, 0x06A5, + 0x91DD, 0x91DD, 0x2280, 0x91DE, 0x91E2, 0x4E1E, 0x91E3, 0x91E3, 0x1EC5, + 0x91E4, 0x91E4, 0x24FB, 0x91E5, 0x91E6, 0x4E23, 0x91E7, 0x91E7, 0x24FA, + 0x91E8, 0x91E8, 0x4E25, 0x91E9, 0x91E9, 0x1EED, 0x91EA, 0x91F4, 0x4E26, + 0x91F5, 0x91F5, 0x24FD, 0x91F6, 0x91F6, 0x4E31, 0x91F7, 0x91F7, 0x24F9, + 0x91F8, 0x91F8, 0x4E32, 0x91F9, 0x91F9, 0x24FE, 0x91FA, 0x91FA, 0x20CD, + 0x91FB, 0x91FF, 0x4E33, 0x9200, 0x9200, 0x2508, 0x9201, 0x9201, 0x2504, + 0x9202, 0x9203, 0x4E38, 0x9204, 0x9204, 0x2506, 0x9205, 0x9207, 0x4E3A, + 0x9208, 0x9208, 0x24FF, 0x9209, 0x9209, 0x2090, 0x920A, 0x920C, 0x4E3D, + 0x920D, 0x920D, 0x1EDD, 0x920E, 0x920E, 0x1F25, 0x920F, 0x920F, 0x4E40, + 0x9210, 0x9210, 0x2503, 0x9211, 0x9211, 0x2502, 0x9212, 0x9213, 0x4E41, + 0x9214, 0x9214, 0x1E7A, 0x9215, 0x9215, 0x20A6, 0x9216, 0x921D, 0x4E43, + 0x921E, 0x921E, 0x1FD5, 0x921F, 0x9222, 0x4E4B, 0x9223, 0x9223, 0x1F11, + 0x9224, 0x9224, 0x4E4F, 0x9225, 0x9225, 0x2507, 0x9226, 0x9226, 0x2500, + 0x9227, 0x9227, 0x2505, 0x9228, 0x922D, 0x4E50, 0x922E, 0x922E, 0x2519, + 0x922F, 0x922F, 0x4E56, 0x9230, 0x9230, 0x2515, 0x9231, 0x9232, 0x4E57, + 0x9233, 0x9233, 0x250C, 0x9234, 0x9234, 0x2031, 0x9235, 0x9236, 0x4E59, + 0x9237, 0x9237, 0x250B, 0x9238, 0x9238, 0x250F, 0x9239, 0x9239, 0x251A, + 0x923A, 0x923A, 0x2509, 0x923B, 0x923C, 0x4E5B, 0x923D, 0x923D, 0x250E, + 0x923E, 0x923E, 0x2234, 0x923F, 0x923F, 0x2513, 0x9240, 0x9240, 0x1F80, + 0x9241, 0x9244, 0x4E5D, 0x9245, 0x9245, 0x2501, 0x9246, 0x9247, 0x4E61, + 0x9248, 0x9248, 0x2517, 0x9249, 0x9249, 0x2516, 0x924A, 0x924C, 0x4E63, + 0x924D, 0x924D, 0x2518, 0x924E, 0x9250, 0x4E66, 0x9251, 0x9251, 0x1E56, + 0x9252, 0x9254, 0x4E69, 0x9255, 0x9255, 0x250D, 0x9256, 0x9256, 0x4E6C, + 0x9257, 0x9257, 0x20D3, 0x9258, 0x9259, 0x4E6D, 0x925A, 0x925A, 0x207A, + 0x925B, 0x925B, 0x20CE, 0x925C, 0x925D, 0x4E6F, 0x925E, 0x925E, 0x2510, + 0x925F, 0x9261, 0x4E71, 0x9262, 0x9262, 0x1E55, 0x9263, 0x9265, 0x4E74, + 0x9266, 0x9266, 0x250A, 0x9267, 0x926B, 0x4E77, 0x926C, 0x926D, 0x2511, + 0x926E, 0x9273, 0x4E7C, 0x9274, 0x9274, 0x086B, 0x9275, 0x9277, 0x4E82, + 0x9278, 0x9278, 0x1FAA, 0x9279, 0x9279, 0x4E85, 0x927A, 0x927A, 0x251E, + 0x927B, 0x927B, 0x1F1F, 0x927C, 0x927E, 0x4E86, 0x927F, 0x927F, 0x252D, + 0x9280, 0x9280, 0x221D, 0x9281, 0x9282, 0x4E89, 0x9283, 0x9283, 0x2532, + 0x9284, 0x9284, 0x4E8B, 0x9285, 0x9285, 0x217B, 0x9286, 0x928D, 0x4E8C, + 0x928E, 0x928E, 0x1D80, 0x928F, 0x9290, 0x4E94, 0x9291, 0x9291, 0x21AF, + 0x9292, 0x9292, 0x4E96, 0x9293, 0x9293, 0x252C, 0x9294, 0x9295, 0x4E97, + 0x9296, 0x9296, 0x2528, 0x9297, 0x9297, 0x4E99, 0x9298, 0x9298, 0x208C, + 0x9299, 0x9299, 0x4E9A, 0x929A, 0x929A, 0x252F, 0x929B, 0x929B, 0x4E9B, + 0x929C, 0x929C, 0x21BC, 0x929D, 0x929F, 0x4E9C, 0x92A0, 0x92A0, 0x251D, + 0x92A1, 0x92A2, 0x4E9F, 0x92A3, 0x92A3, 0x2535, 0x92A4, 0x92A4, 0x4EA1, + 0x92A5, 0x92A5, 0x220D, 0x92A6, 0x92A6, 0x2526, 0x92A7, 0x92A7, 0x4EA2, + 0x92A8, 0x92A8, 0x2534, 0x92A9, 0x92A9, 0x252A, 0x92AA, 0x92AA, 0x251F, + 0x92AB, 0x92AB, 0x2531, 0x92AC, 0x92AC, 0x251C, 0x92AD, 0x92AD, 0x4EA3, + 0x92AE, 0x92AE, 0x1D81, 0x92AF, 0x92B0, 0x4EA4, 0x92B1, 0x92B1, 0x2525, + 0x92B2, 0x92B6, 0x4EA6, 0x92B7, 0x92B7, 0x21CD, 0x92B8, 0x92B8, 0x4EAB, + 0x92B9, 0x92B9, 0x21DA, 0x92BA, 0x92BA, 0x4EAC, 0x92BB, 0x92BB, 0x2172, + 0x92BC, 0x92BC, 0x253E, 0x92BD, 0x92C0, 0x4EAD, 0x92C1, 0x92C1, 0x204F, + 0x92C2, 0x92C2, 0x4EB1, 0x92C3, 0x92C3, 0x2543, 0x92C4, 0x92C4, 0x4EB2, + 0x92C5, 0x92C5, 0x21D7, 0x92C6, 0x92C6, 0x4EB3, 0x92C7, 0x92C7, 0x1E3C, + 0x92C8, 0x92C8, 0x1D82, 0x92C9, 0x92CB, 0x4EB4, 0x92CC, 0x92CC, 0x2529, + 0x92CD, 0x92CE, 0x4EB7, 0x92CF, 0x92CF, 0x2521, 0x92D0, 0x92D1, 0x4EB9, + 0x92D2, 0x92D2, 0x1EFF, 0x92D3, 0x92DC, 0x4EBB, 0x92DD, 0x92DD, 0x253F, + 0x92DE, 0x92DE, 0x4EC5, 0x92DF, 0x92DF, 0x2544, 0x92E0, 0x92E2, 0x4EC6, + 0x92E3, 0x92E3, 0x2523, 0x92E4, 0x92E4, 0x1E90, 0x92E5, 0x92E5, 0x253A, + 0x92E6, 0x92E6, 0x2545, 0x92E7, 0x92E7, 0x4EC9, 0x92E8, 0x92E8, 0x253D, + 0x92E9, 0x92E9, 0x4ECA, 0x92EA, 0x92EA, 0x20C1, 0x92EB, 0x92EC, 0x4ECB, + 0x92ED, 0x92ED, 0x2103, 0x92EE, 0x92EE, 0x2520, 0x92EF, 0x92EF, 0x253C, + 0x92F0, 0x92F0, 0x253B, 0x92F1, 0x92F1, 0x2538, 0x92F2, 0x92F5, 0x4ECD, + 0x92F6, 0x92F6, 0x2540, 0x92F7, 0x92F7, 0x4ED1, 0x92F8, 0x92F8, 0x1FCD, + 0x92F9, 0x92FB, 0x4ED2, 0x92FC, 0x92FC, 0x1F18, 0x92FD, 0x92FF, 0x4ED5, + 0x9300, 0x9300, 0x4ED8, 0x9301, 0x9301, 0x254B, 0x9302, 0x9305, 0x4ED9, + 0x9306, 0x9306, 0x2547, 0x9307, 0x9308, 0x254F, 0x9309, 0x930F, 0x4EDD, + 0x9310, 0x9310, 0x22B0, 0x9311, 0x9311, 0x4EE4, 0x9312, 0x9312, 0x2546, + 0x9313, 0x9314, 0x4EE5, 0x9315, 0x9315, 0x254C, 0x9316, 0x9317, 0x4EE7, + 0x9318, 0x9318, 0x1E9A, 0x9319, 0x9319, 0x2552, 0x931A, 0x931A, 0x2530, + 0x931B, 0x931B, 0x2549, 0x931C, 0x931E, 0x4EE9, 0x931F, 0x931F, 0x2551, + 0x9320, 0x9320, 0x1ECA, 0x9321, 0x9321, 0x4EEC, 0x9322, 0x9322, 0x20D2, + 0x9323, 0x9325, 0x4EED, 0x9326, 0x9326, 0x1FB8, 0x9327, 0x9327, 0x4EF0, + 0x9328, 0x9328, 0x2079, 0x9329, 0x932A, 0x4EF1, 0x932B, 0x932B, 0x21AB, + 0x932C, 0x932D, 0x4EF3, 0x932E, 0x932E, 0x254D, 0x932F, 0x932F, 0x1EA5, + 0x9330, 0x9331, 0x4EF5, 0x9332, 0x9332, 0x204C, 0x9333, 0x9333, 0x2080, + 0x9334, 0x9335, 0x4EF7, 0x9336, 0x9336, 0x266D, 0x9337, 0x9337, 0x4EF9, + 0x9338, 0x9338, 0x2537, 0x9339, 0x933D, 0x4EFA, 0x933E, 0x933E, 0x1D83, + 0x933F, 0x933F, 0x4EFF, 0x9340, 0x9340, 0x254A, 0x9341, 0x9341, 0x21B8, + 0x9342, 0x9342, 0x4F00, 0x9343, 0x9343, 0x254E, 0x9344, 0x9345, 0x4F01, + 0x9346, 0x9346, 0x24FC, 0x9347, 0x9347, 0x2554, 0x9348, 0x934A, 0x4F03, + 0x934B, 0x934B, 0x1F3C, 0x934C, 0x934C, 0x4F06, 0x934D, 0x934D, 0x1ED5, + 0x934E, 0x9353, 0x4F07, 0x9354, 0x9354, 0x2556, 0x9355, 0x9357, 0x4F0D, + 0x9358, 0x9358, 0x2268, 0x9359, 0x935A, 0x4F10, 0x935B, 0x935B, 0x1ED6, + 0x935C, 0x9363, 0x4F12, 0x9364, 0x9364, 0x2557, 0x9365, 0x9365, 0x2553, + 0x9366, 0x9368, 0x4F1A, 0x9369, 0x9369, 0x2548, 0x936A, 0x936A, 0x1D84, + 0x936B, 0x936B, 0x4F1D, 0x936C, 0x936C, 0x20DC, 0x936D, 0x936F, 0x4F1E, + 0x9370, 0x9370, 0x2559, 0x9371, 0x9374, 0x4F21, 0x9375, 0x9375, 0x1F97, + 0x9376, 0x9376, 0x2555, 0x9377, 0x9379, 0x4F25, 0x937A, 0x937A, 0x227D, + 0x937B, 0x937D, 0x4F28, 0x937E, 0x937E, 0x257E, 0x937F, 0x9381, 0x4F2B, + 0x9382, 0x9382, 0x207C, 0x9383, 0x9383, 0x4F2E, 0x9384, 0x9384, 0x255A, + 0x9385, 0x9386, 0x4F2F, 0x9387, 0x9387, 0x255E, 0x9388, 0x9389, 0x4F31, + 0x938A, 0x938A, 0x1E34, 0x938B, 0x938E, 0x4F33, 0x938F, 0x938F, 0x1D86, + 0x9390, 0x9395, 0x4F37, 0x9396, 0x9396, 0x215E, 0x9397, 0x9397, 0x4F3D, + 0x9398, 0x9398, 0x2560, 0x9399, 0x93A1, 0x4F3E, 0x93A2, 0x93A2, 0x21A2, + 0x93A3, 0x93A3, 0x2354, 0x93A4, 0x93A5, 0x4F47, 0x93A6, 0x93A6, 0x2563, + 0x93A7, 0x93A7, 0x2527, 0x93A8, 0x93A8, 0x4F49, 0x93A9, 0x93A9, 0x252E, + 0x93AA, 0x93AA, 0x2558, 0x93AB, 0x93AB, 0x4F4A, 0x93AC, 0x93AC, 0x1F1B, + 0x93AD, 0x93AD, 0x4F4B, 0x93AE, 0x93AE, 0x2283, 0x93AF, 0x93AF, 0x4F4C, + 0x93B0, 0x93B0, 0x2564, 0x93B1, 0x93B2, 0x4F4D, 0x93B3, 0x93B3, 0x20A0, + 0x93B4, 0x93B4, 0x4F4F, 0x93B5, 0x93B5, 0x2565, 0x93B6, 0x93B7, 0x4F50, + 0x93B8, 0x93B8, 0x2561, 0x93B9, 0x93BE, 0x4F52, 0x93BF, 0x93BF, 0x2562, + 0x93C0, 0x93C2, 0x4F58, 0x93C3, 0x93C3, 0x256C, 0x93C4, 0x93C6, 0x4F5B, + 0x93C7, 0x93C7, 0x256D, 0x93C8, 0x93C8, 0x2020, 0x93C9, 0x93C9, 0x4F5E, + 0x93CA, 0x93CA, 0x1D85, 0x93CB, 0x93CB, 0x4F5F, 0x93CC, 0x93CC, 0x255F, + 0x93CD, 0x93CD, 0x256A, 0x93CE, 0x93D0, 0x4F60, 0x93D1, 0x93D1, 0x256E, + 0x93D2, 0x93D5, 0x4F63, 0x93D6, 0x93D6, 0x1E01, 0x93D7, 0x93D7, 0x2539, + 0x93D8, 0x93D8, 0x255C, 0x93D9, 0x93DB, 0x4F67, 0x93DC, 0x93DD, 0x2568, + 0x93DE, 0x93DE, 0x256B, 0x93DF, 0x93DF, 0x1E6F, 0x93E0, 0x93E0, 0x4F6A, + 0x93E1, 0x93E1, 0x1FC4, 0x93E2, 0x93E2, 0x2567, 0x93E3, 0x93E3, 0x4F6B, + 0x93E4, 0x93E4, 0x255B, 0x93E5, 0x93E7, 0x4F6C, 0x93E8, 0x93E8, 0x261D, + 0x93E9, 0x93F4, 0x4F6F, 0x93F5, 0x93F5, 0x252B, 0x93F6, 0x93F6, 0x4F7B, + 0x93F7, 0x93F7, 0x2571, 0x93F8, 0x93F8, 0x4F7C, 0x93F9, 0x93F9, 0x2577, + 0x93FA, 0x93FF, 0x4F7D, 0x9400, 0x9402, 0x4F83, 0x9403, 0x9403, 0x2522, + 0x9404, 0x940A, 0x4F86, 0x940B, 0x940B, 0x2533, 0x940C, 0x940F, 0x4F8D, + 0x9410, 0x9410, 0x202A, 0x9411, 0x9411, 0x4F91, 0x9412, 0x9412, 0x2536, + 0x9413, 0x9413, 0x2573, 0x9414, 0x9414, 0x256F, 0x9415, 0x9417, 0x4F92, + 0x9418, 0x9418, 0x2293, 0x9419, 0x9419, 0x2578, 0x941A, 0x941C, 0x4F95, + 0x941D, 0x941D, 0x2570, 0x941E, 0x941F, 0x4F98, 0x9420, 0x9420, 0x2575, + 0x9421, 0x9425, 0x4F9A, 0x9426, 0x9427, 0x2541, 0x9428, 0x9428, 0x255D, + 0x9429, 0x942D, 0x4F9F, 0x942E, 0x942E, 0x201A, 0x942F, 0x9431, 0x4FA4, + 0x9432, 0x9432, 0x257A, 0x9433, 0x9433, 0x2006, 0x9434, 0x9434, 0x4FA7, + 0x9435, 0x9435, 0x2177, 0x9436, 0x9437, 0x4FA8, 0x9438, 0x9438, 0x251B, + 0x9439, 0x9439, 0x4FAA, 0x943A, 0x943A, 0x2524, 0x943B, 0x943D, 0x4FAB, + 0x943E, 0x943E, 0x1D87, 0x943F, 0x943F, 0x257B, 0x9440, 0x9443, 0x4FAE, + 0x9444, 0x9444, 0x22A3, 0x9445, 0x9449, 0x4FB2, 0x944A, 0x944A, 0x2579, + 0x944B, 0x944B, 0x4FB7, 0x944C, 0x944C, 0x2566, 0x944D, 0x9451, 0x4FB8, + 0x9452, 0x9452, 0x1F93, 0x9453, 0x9453, 0x4FBD, 0x9454, 0x9454, 0x257C, + 0x9455, 0x945F, 0x4FBE, 0x9460, 0x9460, 0x2514, 0x9461, 0x9462, 0x4FC9, + 0x9463, 0x9463, 0x257D, 0x9464, 0x9464, 0x4FCB, 0x9465, 0x9465, 0x2572, + 0x9466, 0x946A, 0x4FCC, 0x946B, 0x946B, 0x1D88, 0x946C, 0x946C, 0x4FD1, + 0x946D, 0x946D, 0x2574, 0x946E, 0x946F, 0x4FD2, 0x9470, 0x9470, 0x224E, + 0x9471, 0x9471, 0x4FD4, 0x9472, 0x9472, 0x21C6, 0x9473, 0x9476, 0x4FD5, + 0x9477, 0x9477, 0x209F, 0x9478, 0x9478, 0x4FD9, 0x9479, 0x9479, 0x2576, + 0x947A, 0x947B, 0x4FDA, 0x947C, 0x947C, 0x2064, 0x947D, 0x947D, 0x22BF, + 0x947E, 0x947E, 0x261C, 0x947F, 0x947F, 0x225E, 0x9480, 0x9484, 0x4FDC, + 0x9485, 0x9487, 0x1A8E, 0x9488, 0x9488, 0x118C, 0x9489, 0x9489, 0x05E3, + 0x948A, 0x948A, 0x1A92, 0x948B, 0x948B, 0x1A91, 0x948C, 0x948D, 0x1A93, + 0x948E, 0x948E, 0x0C22, 0x948F, 0x9490, 0x1A95, 0x9491, 0x9491, 0x4FE1, + 0x9492, 0x9492, 0x064D, 0x9493, 0x9493, 0x05D7, 0x9494, 0x9494, 0x1A97, + 0x9495, 0x9495, 0x1A99, 0x9496, 0x9496, 0x4FE2, 0x9497, 0x9497, 0x1A98, + 0x9498, 0x9498, 0x4FE3, 0x9499, 0x9499, 0x06C1, 0x949A, 0x949C, 0x1A9A, + 0x949D, 0x949D, 0x061A, 0x949E, 0x949E, 0x04D3, 0x949F, 0x949F, 0x11D2, + 0x94A0, 0x94A0, 0x0B29, 0x94A1, 0x94A1, 0x041E, 0x94A2, 0x94A2, 0x06D1, + 0x94A3, 0x94A4, 0x1A9D, 0x94A5, 0x94A5, 0x1102, 0x94A6, 0x94A6, 0x0C52, + 0x94A7, 0x94A7, 0x092A, 0x94A8, 0x94A8, 0x0EE8, 0x94A9, 0x94A9, 0x070C, + 0x94AA, 0x94AA, 0x1AA0, 0x94AB, 0x94AB, 0x1A9F, 0x94AC, 0x94AC, 0x1AA2, + 0x94AD, 0x94AD, 0x1AA1, 0x94AE, 0x94AE, 0x0B66, 0x94AF, 0x94B0, 0x1AA3, + 0x94B1, 0x94B1, 0x0C2B, 0x94B2, 0x94B2, 0x1AA5, 0x94B3, 0x94B3, 0x0C2C, + 0x94B4, 0x94B4, 0x1AA6, 0x94B5, 0x94B5, 0x046E, 0x94B6, 0x94BA, 0x1AA7, + 0x94BB, 0x94BB, 0x1247, 0x94BC, 0x94BD, 0x1AAC, 0x94BE, 0x94BE, 0x084B, + 0x94BF, 0x94BF, 0x1AAE, 0x94C0, 0x94C0, 0x10B0, 0x94C1, 0x94C1, 0x0E4D, + 0x94C2, 0x94C2, 0x0473, 0x94C3, 0x94C3, 0x0A2E, 0x94C4, 0x94C4, 0x1AAF, + 0x94C5, 0x94C5, 0x0C23, 0x94C6, 0x94C6, 0x0AB2, 0x94C7, 0x94C7, 0x4FE4, + 0x94C8, 0x94CE, 0x1AB0, 0x94CF, 0x94CF, 0x4FE5, 0x94D0, 0x94D2, 0x1AB7, + 0x94D3, 0x94D4, 0x4FE6, 0x94D5, 0x94D7, 0x1ABA, 0x94D8, 0x94D8, 0x1ABE, + 0x94D9, 0x94D9, 0x1ABD, 0x94DA, 0x94DA, 0x4FE8, 0x94DB, 0x94DB, 0x1ABF, + 0x94DC, 0x94DC, 0x0E5E, 0x94DD, 0x94DD, 0x0A68, 0x94DE, 0x94E0, 0x1AC0, + 0x94E1, 0x94E1, 0x1142, 0x94E2, 0x94E2, 0x1AC3, 0x94E3, 0x94E3, 0x0F20, + 0x94E4, 0x94E5, 0x1AC4, 0x94E6, 0x94E6, 0x4FE9, 0x94E7, 0x94E8, 0x1AC6, + 0x94E9, 0x94E9, 0x1AC9, 0x94EA, 0x94EA, 0x1AC8, 0x94EB, 0x94EB, 0x1ACA, + 0x94EC, 0x94EC, 0x06F0, 0x94ED, 0x94ED, 0x0AFF, 0x94EE, 0x94EF, 0x1ACB, + 0x94F0, 0x94F0, 0x0893, 0x94F1, 0x94F1, 0x1046, 0x94F2, 0x94F2, 0x04C0, + 0x94F3, 0x94F5, 0x1ACD, 0x94F6, 0x94F6, 0x107F, 0x94F7, 0x94F7, 0x1AD0, + 0x94F8, 0x94F8, 0x11FC, 0x94F9, 0x94F9, 0x1AD1, 0x94FA, 0x94FA, 0x0BEB, + 0x94FB, 0x94FB, 0x4FEA, 0x94FC, 0x94FD, 0x1AD2, 0x94FE, 0x94FE, 0x09FD, + 0x94FF, 0x94FF, 0x1AD4, 0x9500, 0x9500, 0x0F67, 0x9501, 0x9501, 0x0DED, + 0x9502, 0x9502, 0x1AD6, 0x9503, 0x9503, 0x1AD5, 0x9504, 0x9504, 0x051F, + 0x9505, 0x9505, 0x0751, 0x9506, 0x9507, 0x1AD7, 0x9508, 0x9508, 0x0FAD, + 0x9509, 0x950A, 0x1AD9, 0x950B, 0x950B, 0x0683, 0x950C, 0x950C, 0x0F8A, + 0x950D, 0x950F, 0x1ADB, 0x9510, 0x9510, 0x0CCC, 0x9511, 0x9511, 0x0E33, + 0x9512, 0x9516, 0x1ADE, 0x9517, 0x9517, 0x1181, 0x9518, 0x9518, 0x1AE3, + 0x9519, 0x9519, 0x0570, 0x951A, 0x951A, 0x0AAF, 0x951B, 0x951B, 0x1AE4, + 0x951C, 0x951C, 0x4FEB, 0x951D, 0x951F, 0x1AE5, 0x9520, 0x9520, 0x4FEC, + 0x9521, 0x9521, 0x0F0C, 0x9522, 0x9522, 0x1AE8, 0x9523, 0x9523, 0x0A87, + 0x9524, 0x9524, 0x053B, 0x9525, 0x9525, 0x1213, 0x9526, 0x9526, 0x08C6, + 0x9527, 0x9527, 0x4FED, 0x9528, 0x9528, 0x0F34, 0x9529, 0x9529, 0x1AEB, + 0x952A, 0x952B, 0x1AE9, 0x952C, 0x952C, 0x1AEC, 0x952D, 0x952D, 0x05E6, + 0x952E, 0x952E, 0x086F, 0x952F, 0x952F, 0x0911, 0x9530, 0x9530, 0x0AD1, + 0x9531, 0x9532, 0x1AED, 0x9533, 0x9533, 0x4FEE, 0x9534, 0x9534, 0x1AEF, + 0x9535, 0x9535, 0x1AF7, 0x9536, 0x9538, 0x1AF0, 0x9539, 0x9539, 0x0C3F, + 0x953A, 0x953A, 0x1B19, 0x953B, 0x953B, 0x060C, 0x953C, 0x953C, 0x1AF3, + 0x953D, 0x953D, 0x4FEF, 0x953E, 0x953F, 0x1AF4, 0x9540, 0x9540, 0x0605, + 0x9541, 0x9541, 0x0AC3, 0x9542, 0x9542, 0x1AF6, 0x9543, 0x9543, 0x4FF0, + 0x9544, 0x9546, 0x1AF8, 0x9547, 0x9547, 0x1193, 0x9548, 0x9548, 0x4FF1, + 0x9549, 0x9549, 0x1AFB, 0x954A, 0x954A, 0x0B5A, 0x954B, 0x954B, 0x4FF2, + 0x954C, 0x954C, 0x1AFC, 0x954D, 0x954D, 0x0B5B, 0x954E, 0x954F, 0x1AFD, + 0x9550, 0x9550, 0x06DF, 0x9551, 0x9551, 0x0402, 0x9552, 0x9554, 0x1AFF, + 0x9555, 0x9555, 0x4FF3, 0x9556, 0x9559, 0x1B02, 0x955A, 0x955A, 0x4FF4, + 0x955B, 0x955B, 0x1B06, 0x955C, 0x955C, 0x08E4, 0x955D, 0x955D, 0x1B09, + 0x955E, 0x955F, 0x1B07, 0x9560, 0x9560, 0x4FF5, 0x9561, 0x9562, 0x1B0A, + 0x9563, 0x9563, 0x0A16, 0x9564, 0x956C, 0x1B0C, 0x956D, 0x956D, 0x09C3, + 0x956E, 0x956E, 0x4FF6, 0x956F, 0x956F, 0x1B15, 0x9570, 0x9570, 0x09F6, + 0x9571, 0x9573, 0x1B16, 0x9574, 0x9575, 0x4FF7, 0x9576, 0x9576, 0x0F4F, + 0x9577, 0x9577, 0x1E75, 0x9578, 0x957E, 0x4FF9, 0x957F, 0x957F, 0x04C9, + 0x9580, 0x9580, 0x207D, 0x9581, 0x9581, 0x5000, 0x9582, 0x9582, 0x23BF, + 0x9583, 0x9583, 0x2113, 0x9584, 0x9585, 0x5001, 0x9586, 0x9586, 0x23C0, + 0x9587, 0x9588, 0x5003, 0x9589, 0x9589, 0x1E45, 0x958A, 0x958A, 0x5005, + 0x958B, 0x958B, 0x1FD8, 0x958C, 0x958C, 0x23C4, 0x958D, 0x958D, 0x5006, + 0x958E, 0x958E, 0x23C2, 0x958F, 0x958F, 0x2104, 0x9590, 0x9590, 0x5007, + 0x9591, 0x9591, 0x21BD, 0x9592, 0x9592, 0x5008, 0x9593, 0x9593, 0x1F87, + 0x9594, 0x9594, 0x23C3, 0x9595, 0x9597, 0x5009, 0x9598, 0x9598, 0x2269, + 0x9599, 0x95A0, 0x500C, 0x95A1, 0x95A1, 0x1F43, 0x95A2, 0x95A2, 0x5014, + 0x95A3, 0x95A3, 0x1F1E, 0x95A4, 0x95A4, 0x2679, 0x95A5, 0x95A5, 0x1EEB, + 0x95A6, 0x95A7, 0x5015, 0x95A8, 0x95A8, 0x1F35, 0x95A9, 0x95A9, 0x208A, + 0x95AA, 0x95AA, 0x5017, 0x95AB, 0x95AB, 0x23C7, 0x95AC, 0x95AC, 0x23C9, + 0x95AD, 0x95AD, 0x23C6, 0x95AE, 0x95B1, 0x5018, 0x95B2, 0x95B2, 0x224F, + 0x95B3, 0x95B5, 0x501C, 0x95B6, 0x95B6, 0x23CB, 0x95B7, 0x95B8, 0x501F, + 0x95B9, 0x95B9, 0x21F3, 0x95BA, 0x95BA, 0x5021, 0x95BB, 0x95BB, 0x21F7, + 0x95BC, 0x95BC, 0x23CF, 0x95BD, 0x95BD, 0x23CE, 0x95BE, 0x95BE, 0x23CA, + 0x95BF, 0x95BF, 0x23CD, 0x95C0, 0x95C2, 0x5022, 0x95C3, 0x95C3, 0x23D0, + 0x95C4, 0x95C5, 0x5025, 0x95C6, 0x95C6, 0x266C, 0x95C7, 0x95C7, 0x5027, + 0x95C8, 0x95C8, 0x23C1, 0x95C9, 0x95C9, 0x5028, 0x95CA, 0x95CA, 0x1FEE, + 0x95CB, 0x95CB, 0x23D1, 0x95CC, 0x95CC, 0x1FF8, 0x95CD, 0x95CF, 0x5029, + 0x95D0, 0x95D0, 0x23D3, 0x95D1, 0x95D3, 0x502C, 0x95D4, 0x95D4, 0x23D2, + 0x95D5, 0x95D5, 0x23D4, 0x95D6, 0x95D6, 0x1E98, 0x95D7, 0x95DB, 0x502F, + 0x95DC, 0x95DC, 0x1F2C, 0x95DD, 0x95DD, 0x5034, 0x95DE, 0x95DE, 0x23D5, + 0x95DF, 0x95E0, 0x5035, 0x95E1, 0x95E1, 0x1E71, 0x95E2, 0x95E2, 0x2691, + 0x95E3, 0x95E4, 0x5037, 0x95E5, 0x95E5, 0x23C5, 0x95E6, 0x95E7, 0x5039, + 0x95E8, 0x95E8, 0x0ACA, 0x95E9, 0x95E9, 0x1685, 0x95EA, 0x95EA, 0x0CFA, + 0x95EB, 0x95EB, 0x1686, 0x95EC, 0x95EC, 0x503B, 0x95ED, 0x95ED, 0x043E, + 0x95EE, 0x95EE, 0x0ED9, 0x95EF, 0x95EF, 0x0536, 0x95F0, 0x95F0, 0x0CCD, + 0x95F1, 0x95F1, 0x1687, 0x95F2, 0x95F2, 0x0F3D, 0x95F3, 0x95F3, 0x1688, + 0x95F4, 0x95F4, 0x0857, 0x95F5, 0x95F6, 0x1689, 0x95F7, 0x95F7, 0x0ACB, + 0x95F8, 0x95F8, 0x1143, 0x95F9, 0x95F9, 0x0B39, 0x95FA, 0x95FA, 0x0744, + 0x95FB, 0x95FB, 0x0ED4, 0x95FC, 0x95FC, 0x168B, 0x95FD, 0x95FD, 0x0AFB, + 0x95FE, 0x95FE, 0x168C, 0x95FF, 0x95FF, 0x503C, 0x9600, 0x9600, 0x0644, + 0x9601, 0x9601, 0x06EE, 0x9602, 0x9602, 0x0789, 0x9603, 0x9604, 0x168D, + 0x9605, 0x9605, 0x1107, 0x9606, 0x9606, 0x168F, 0x9607, 0x9607, 0x503D, + 0x9608, 0x9608, 0x1690, 0x9609, 0x9609, 0x0FF4, 0x960A, 0x960D, 0x1691, + 0x960E, 0x960E, 0x0FFF, 0x960F, 0x960F, 0x1695, 0x9610, 0x9610, 0x04C2, + 0x9611, 0x9611, 0x09A6, 0x9612, 0x9612, 0x1696, 0x9613, 0x9613, 0x503E, + 0x9614, 0x9614, 0x0996, 0x9615, 0x9617, 0x1697, 0x9618, 0x9618, 0x503F, + 0x9619, 0x961A, 0x169A, 0x961B, 0x961B, 0x5040, 0x961C, 0x961C, 0x06B2, + 0x961D, 0x961D, 0x1354, 0x961E, 0x961E, 0x5041, 0x961F, 0x961F, 0x0612, + 0x9620, 0x9620, 0x5042, 0x9621, 0x9621, 0x1356, 0x9622, 0x9622, 0x1355, + 0x9623, 0x9629, 0x5043, 0x962A, 0x962A, 0x1358, 0x962B, 0x962D, 0x504A, + 0x962E, 0x962E, 0x0CC9, 0x962F, 0x9630, 0x504D, 0x9631, 0x9631, 0x1357, + 0x9632, 0x9632, 0x065D, 0x9633, 0x9633, 0x101D, 0x9634, 0x9634, 0x107C, + 0x9635, 0x9635, 0x1194, 0x9636, 0x9636, 0x08A8, 0x9637, 0x963A, 0x504F, + 0x963B, 0x963B, 0x1245, 0x963C, 0x963C, 0x135A, 0x963D, 0x963D, 0x1359, + 0x963E, 0x963E, 0x5053, 0x963F, 0x963F, 0x03AD, 0x9640, 0x9640, 0x0E84, + 0x9641, 0x9641, 0x5054, 0x9642, 0x9642, 0x135B, 0x9643, 0x9643, 0x5055, + 0x9644, 0x9644, 0x06B8, 0x9645, 0x9645, 0x083D, 0x9646, 0x9646, 0x0A64, + 0x9647, 0x9647, 0x0A4B, 0x9648, 0x9648, 0x04E7, 0x9649, 0x9649, 0x135C, + 0x964A, 0x964A, 0x5056, 0x964B, 0x964B, 0x0A51, 0x964C, 0x964C, 0x0B13, + 0x964D, 0x964D, 0x0886, 0x964E, 0x964F, 0x5057, 0x9650, 0x9650, 0x0F4B, + 0x9651, 0x9653, 0x5059, 0x9654, 0x9654, 0x135D, 0x9655, 0x9655, 0x0CFB, + 0x9656, 0x9657, 0x505C, 0x9658, 0x9658, 0x231A, 0x9659, 0x965A, 0x505E, + 0x965B, 0x965B, 0x0446, 0x965C, 0x965C, 0x5060, 0x965D, 0x965D, 0x2114, + 0x965E, 0x965E, 0x5061, 0x965F, 0x965F, 0x135E, 0x9660, 0x9660, 0x5062, + 0x9661, 0x9661, 0x05F7, 0x9662, 0x9662, 0x10FD, 0x9663, 0x9663, 0x2284, + 0x9664, 0x9664, 0x0522, 0x9665, 0x9666, 0x5063, 0x9667, 0x9667, 0x135F, + 0x9668, 0x9668, 0x110C, 0x9669, 0x9669, 0x0F42, 0x966A, 0x966A, 0x0BA4, + 0x966B, 0x966B, 0x5065, 0x966C, 0x966C, 0x1360, 0x966D, 0x966F, 0x5066, + 0x9670, 0x9670, 0x221C, 0x9671, 0x9671, 0x5069, 0x9672, 0x9672, 0x1361, + 0x9673, 0x9673, 0x1E7E, 0x9674, 0x9674, 0x1362, 0x9675, 0x9675, 0x0A33, + 0x9676, 0x9676, 0x0E28, 0x9677, 0x9677, 0x0F4A, 0x9678, 0x9678, 0x204D, + 0x9679, 0x967C, 0x506A, 0x967D, 0x967D, 0x2201, 0x967E, 0x9684, 0x506E, + 0x9685, 0x9685, 0x10CC, 0x9686, 0x9686, 0x0A48, 0x9687, 0x9687, 0x5075, + 0x9688, 0x9688, 0x1363, 0x9689, 0x9689, 0x5076, 0x968A, 0x968A, 0x1ED9, + 0x968B, 0x968B, 0x0DDA, 0x968C, 0x968C, 0x5077, 0x968D, 0x968D, 0x1364, + 0x968E, 0x968E, 0x1FB2, 0x968F, 0x968F, 0x0DDB, 0x9690, 0x9690, 0x1085, + 0x9691, 0x9693, 0x5078, 0x9694, 0x9694, 0x06EF, 0x9695, 0x9695, 0x2252, + 0x9696, 0x9696, 0x507B, 0x9697, 0x9697, 0x1365, 0x9698, 0x9698, 0x03BA, + 0x9699, 0x9699, 0x0F23, 0x969A, 0x969A, 0x507C, 0x969B, 0x969B, 0x1F79, + 0x969C, 0x969C, 0x1170, 0x969D, 0x96A6, 0x507D, 0x96A7, 0x96A7, 0x0DE2, + 0x96A8, 0x96A8, 0x2157, 0x96A9, 0x96A9, 0x5087, 0x96AA, 0x96AA, 0x21BF, + 0x96AB, 0x96AF, 0x5088, 0x96B0, 0x96B0, 0x1366, 0x96B1, 0x96B1, 0x221F, + 0x96B2, 0x96B2, 0x508D, 0x96B3, 0x96B3, 0x1684, 0x96B4, 0x96B4, 0x203D, + 0x96B5, 0x96B5, 0x508E, 0x96B6, 0x96B6, 0x09EE, 0x96B7, 0x96B7, 0x508F, + 0x96B8, 0x96B8, 0x2015, 0x96B9, 0x96B9, 0x1D79, 0x96BA, 0x96BA, 0x5090, + 0x96BB, 0x96BB, 0x26A5, 0x96BC, 0x96BD, 0x1D7A, 0x96BE, 0x96BE, 0x0B34, + 0x96BF, 0x96BF, 0x5091, 0x96C0, 0x96C0, 0x0C93, 0x96C1, 0x96C1, 0x100C, + 0x96C2, 0x96C3, 0x5092, 0x96C4, 0x96C4, 0x0FA6, 0x96C5, 0x96C5, 0x0FEE, + 0x96C6, 0x96C6, 0x0822, 0x96C7, 0x96C7, 0x0726, 0x96C8, 0x96C8, 0x5094, + 0x96C9, 0x96C9, 0x1B1C, 0x96CA, 0x96CB, 0x5095, 0x96CC, 0x96CC, 0x0549, + 0x96CD, 0x96CD, 0x109F, 0x96CE, 0x96CE, 0x1D7C, 0x96CF, 0x96CF, 0x0520, + 0x96D0, 0x96D1, 0x5097, 0x96D2, 0x96D2, 0x1D7D, 0x96D3, 0x96D4, 0x5099, + 0x96D5, 0x96D5, 0x05D2, 0x96D6, 0x96D6, 0x2156, 0x96D7, 0x96D8, 0x509B, + 0x96D9, 0x96D9, 0x2144, 0x96DA, 0x96DA, 0x509D, 0x96DB, 0x96DB, 0x1E91, + 0x96DC, 0x96DC, 0x2257, 0x96DD, 0x96DF, 0x509E, 0x96E0, 0x96E0, 0x1D7F, + 0x96E1, 0x96E1, 0x50A1, 0x96E2, 0x96E2, 0x200A, 0x96E3, 0x96E3, 0x2092, + 0x96E4, 0x96E7, 0x50A2, 0x96E8, 0x96E8, 0x10CF, 0x96E9, 0x96E9, 0x1D61, + 0x96EA, 0x96EA, 0x0FD2, 0x96EB, 0x96EE, 0x50A6, 0x96EF, 0x96EF, 0x1D63, + 0x96F0, 0x96F1, 0x50AA, 0x96F2, 0x96F2, 0x2250, 0x96F3, 0x96F3, 0x1D62, + 0x96F4, 0x96F5, 0x50AC, 0x96F6, 0x96F6, 0x0A2C, 0x96F7, 0x96F7, 0x09C2, + 0x96F8, 0x96F8, 0x50AE, 0x96F9, 0x96F9, 0x040B, 0x96FA, 0x96FA, 0x50AF, + 0x96FB, 0x96FB, 0x1EC3, 0x96FC, 0x96FD, 0x50B0, 0x96FE, 0x96FE, 0x0EFC, + 0x96FF, 0x96FF, 0x50B2, 0x9700, 0x9700, 0x0FB3, 0x9701, 0x9701, 0x1D65, + 0x9702, 0x9703, 0x50B3, 0x9704, 0x9704, 0x0F63, 0x9705, 0x9705, 0x50B5, + 0x9706, 0x9706, 0x1D64, 0x9707, 0x9707, 0x1191, 0x9708, 0x9708, 0x1D66, + 0x9709, 0x9709, 0x0ABE, 0x970A, 0x970C, 0x50B6, 0x970D, 0x970D, 0x0809, + 0x970E, 0x970E, 0x1D68, 0x970F, 0x970F, 0x1D67, 0x9710, 0x9712, 0x50B9, + 0x9713, 0x9713, 0x0B41, 0x9714, 0x9715, 0x50BC, 0x9716, 0x9716, 0x0A21, + 0x9717, 0x971B, 0x50BE, 0x971C, 0x971C, 0x0D9F, 0x971D, 0x971D, 0x50C3, + 0x971E, 0x971E, 0x0F29, 0x971F, 0x9726, 0x50C4, 0x9727, 0x9727, 0x21A8, + 0x9728, 0x9729, 0x50CC, 0x972A, 0x972A, 0x1D69, 0x972B, 0x972C, 0x50CE, + 0x972D, 0x972D, 0x1D6A, 0x972E, 0x972F, 0x50D0, 0x9730, 0x9730, 0x1D6B, + 0x9731, 0x9731, 0x50D2, 0x9732, 0x9732, 0x0A5D, 0x9733, 0x9737, 0x50D3, + 0x9738, 0x9738, 0x03DF, 0x9739, 0x9739, 0x0BBA, 0x973A, 0x973C, 0x50D8, + 0x973D, 0x973D, 0x260D, 0x973E, 0x973E, 0x1D6C, 0x973F, 0x9741, 0x50DB, + 0x9742, 0x9742, 0x260C, 0x9743, 0x9743, 0x50DE, 0x9744, 0x9744, 0x260E, + 0x9745, 0x9747, 0x50DF, 0x9748, 0x9748, 0x2032, 0x9749, 0x9751, 0x50E2, + 0x9752, 0x9752, 0x0C5D, 0x9753, 0x9753, 0x1D60, 0x9754, 0x9755, 0x50EB, + 0x9756, 0x9756, 0x08E7, 0x9757, 0x9758, 0x50ED, 0x9759, 0x9759, 0x08E1, + 0x975A, 0x975A, 0x260B, 0x975B, 0x975B, 0x05C6, 0x975C, 0x975D, 0x50EF, + 0x975E, 0x975E, 0x0664, 0x975F, 0x975F, 0x50F1, 0x9760, 0x9760, 0x094C, + 0x9761, 0x9761, 0x0AD7, 0x9762, 0x9762, 0x0AEB, 0x9763, 0x9764, 0x50F2, + 0x9765, 0x9765, 0x1282, 0x9766, 0x9767, 0x50F4, 0x9768, 0x9768, 0x22C3, + 0x9769, 0x9769, 0x06EA, 0x976A, 0x9772, 0x50F6, 0x9773, 0x9773, 0x08CA, + 0x9774, 0x9774, 0x0FCE, 0x9775, 0x9775, 0x50FF, 0x9776, 0x9776, 0x03DB, + 0x9777, 0x977B, 0x5100, 0x977C, 0x977C, 0x1DC8, 0x977D, 0x9784, 0x5105, + 0x9785, 0x9785, 0x1DC9, 0x9786, 0x978A, 0x510D, 0x978B, 0x978B, 0x0F77, + 0x978C, 0x978C, 0x5112, 0x978D, 0x978D, 0x03BB, 0x978E, 0x978E, 0x5113, + 0x978F, 0x978F, 0x1F23, 0x9790, 0x9790, 0x5114, 0x9791, 0x9792, 0x1DCA, + 0x9793, 0x9793, 0x5115, 0x9794, 0x9794, 0x1DCC, 0x9795, 0x9797, 0x5116, + 0x9798, 0x9798, 0x0C47, 0x9799, 0x979F, 0x5119, 0x97A0, 0x97A0, 0x08FE, + 0x97A1, 0x97A2, 0x5120, 0x97A3, 0x97A3, 0x1DCF, 0x97A4, 0x97A5, 0x5122, + 0x97A6, 0x97A6, 0x2695, 0x97A7, 0x97AA, 0x5124, 0x97AB, 0x97AB, 0x1DCE, + 0x97AC, 0x97AC, 0x5128, 0x97AD, 0x97AD, 0x0447, 0x97AE, 0x97AE, 0x5129, + 0x97AF, 0x97AF, 0x1DCD, 0x97B0, 0x97B1, 0x512A, 0x97B2, 0x97B2, 0x1DD0, + 0x97B3, 0x97B3, 0x512C, 0x97B4, 0x97B4, 0x1DD1, 0x97B5, 0x97BC, 0x512D, + 0x97BD, 0x97BD, 0x265E, 0x97BE, 0x97C2, 0x5135, 0x97C3, 0x97C3, 0x265D, + 0x97C4, 0x97C5, 0x513A, 0x97C6, 0x97C6, 0x2692, 0x97C7, 0x97C8, 0x513C, + 0x97C9, 0x97C9, 0x265F, 0x97CA, 0x97CA, 0x513E, 0x97CB, 0x97CB, 0x218D, + 0x97CC, 0x97CC, 0x20FD, 0x97CD, 0x97D2, 0x513F, 0x97D3, 0x97D3, 0x1F40, + 0x97D4, 0x97D8, 0x5145, 0x97D9, 0x97D9, 0x2465, 0x97DA, 0x97DB, 0x514A, + 0x97DC, 0x97DC, 0x2467, 0x97DD, 0x97DD, 0x514C, 0x97DE, 0x97DE, 0x2466, + 0x97DF, 0x97E5, 0x514D, 0x97E6, 0x97E6, 0x0EB3, 0x97E7, 0x97E7, 0x0CA8, + 0x97E8, 0x97E8, 0x5154, 0x97E9, 0x97E9, 0x0762, 0x97EA, 0x97EC, 0x184E, + 0x97ED, 0x97ED, 0x08F1, 0x97EE, 0x97F2, 0x5155, 0x97F3, 0x97F3, 0x107B, + 0x97F4, 0x97F4, 0x515A, 0x97F5, 0x97F5, 0x1112, 0x97F6, 0x97F6, 0x0D11, + 0x97F7, 0x97FE, 0x515B, 0x97FF, 0x97FF, 0x21C9, 0x9800, 0x9800, 0x5163, + 0x9801, 0x9801, 0x2209, 0x9802, 0x9802, 0x1EC9, 0x9803, 0x9803, 0x20E9, + 0x9804, 0x9804, 0x5164, 0x9805, 0x9805, 0x21CA, 0x9806, 0x9806, 0x2146, + 0x9807, 0x9807, 0x25C5, 0x9808, 0x9808, 0x21DC, 0x9809, 0x9809, 0x5165, + 0x980A, 0x980A, 0x245E, 0x980B, 0x980B, 0x5166, 0x980C, 0x980C, 0x214F, + 0x980D, 0x980D, 0x5167, 0x980E, 0x980F, 0x25C6, 0x9810, 0x9810, 0x2241, + 0x9811, 0x9811, 0x218A, 0x9812, 0x9812, 0x1E2F, 0x9813, 0x9813, 0x1EDC, + 0x9814, 0x9816, 0x5168, 0x9817, 0x9817, 0x20BF, 0x9818, 0x9818, 0x2034, + 0x9819, 0x981B, 0x516B, 0x981C, 0x981C, 0x25C9, 0x981D, 0x9820, 0x516E, + 0x9821, 0x9821, 0x25C8, 0x9822, 0x9823, 0x5172, 0x9824, 0x9824, 0x220E, + 0x9825, 0x9825, 0x5174, 0x9826, 0x9826, 0x25CB, 0x9827, 0x982C, 0x5175, + 0x982D, 0x982D, 0x217D, 0x982E, 0x982F, 0x517B, 0x9830, 0x9830, 0x1F7E, + 0x9831, 0x9836, 0x517D, 0x9837, 0x9837, 0x25CC, 0x9838, 0x9838, 0x1FC3, + 0x9839, 0x983A, 0x5183, 0x983B, 0x983B, 0x20B9, 0x983C, 0x983C, 0x5185, + 0x983D, 0x983D, 0x2181, 0x983E, 0x9845, 0x5186, 0x9846, 0x9846, 0x1FDA, + 0x9847, 0x984B, 0x518E, 0x984C, 0x984C, 0x2173, 0x984D, 0x984D, 0x1EE1, + 0x984E, 0x984E, 0x25CD, 0x984F, 0x9852, 0x5193, 0x9853, 0x9853, 0x25CE, + 0x9854, 0x9854, 0x21F6, 0x9855, 0x9857, 0x5197, 0x9858, 0x9858, 0x224B, + 0x9859, 0x9859, 0x25D1, 0x985A, 0x985A, 0x519A, 0x985B, 0x985B, 0x1EC0, + 0x985C, 0x985D, 0x519B, 0x985E, 0x985E, 0x2008, 0x985F, 0x9861, 0x519D, + 0x9862, 0x9862, 0x25D0, 0x9863, 0x9864, 0x51A0, 0x9865, 0x9865, 0x25D2, + 0x9866, 0x9866, 0x51A2, 0x9867, 0x9867, 0x1F2A, 0x9868, 0x986A, 0x51A3, + 0x986B, 0x986B, 0x1E72, 0x986C, 0x986C, 0x25D3, 0x986D, 0x986E, 0x51A6, + 0x986F, 0x986F, 0x21BE, 0x9870, 0x9870, 0x25D4, 0x9871, 0x9871, 0x2044, + 0x9872, 0x9872, 0x51A8, 0x9873, 0x9873, 0x25CF, 0x9874, 0x9874, 0x20F3, + 0x9875, 0x9875, 0x103A, 0x9876, 0x9876, 0x05E4, 0x9877, 0x9877, 0x0C67, + 0x9878, 0x9878, 0x1BE0, 0x9879, 0x9879, 0x0F5B, 0x987A, 0x987A, 0x0DA8, + 0x987B, 0x987B, 0x0FB6, 0x987C, 0x987C, 0x1827, 0x987D, 0x987D, 0x0E98, + 0x987E, 0x987E, 0x0724, 0x987F, 0x987F, 0x0618, 0x9880, 0x9880, 0x1BE1, + 0x9881, 0x9881, 0x03EF, 0x9882, 0x9882, 0x0DC1, 0x9883, 0x9883, 0x1BE2, + 0x9884, 0x9884, 0x10E7, 0x9885, 0x9885, 0x0A54, 0x9886, 0x9886, 0x0A35, + 0x9887, 0x9887, 0x0BE3, 0x9888, 0x9888, 0x08E0, 0x9889, 0x9889, 0x1BE3, + 0x988A, 0x988A, 0x0848, 0x988B, 0x988B, 0x51A9, 0x988C, 0x988D, 0x1BE4, + 0x988E, 0x988E, 0x51AA, 0x988F, 0x988F, 0x1BE6, 0x9890, 0x9890, 0x104A, + 0x9891, 0x9891, 0x0BD4, 0x9892, 0x9892, 0x51AB, 0x9893, 0x9893, 0x0E78, + 0x9894, 0x9894, 0x1BE7, 0x9895, 0x9895, 0x51AC, 0x9896, 0x9896, 0x1096, + 0x9897, 0x9897, 0x0952, 0x9898, 0x9898, 0x0E35, 0x9899, 0x9899, 0x51AD, + 0x989A, 0x989B, 0x1BE8, 0x989C, 0x989C, 0x0FFE, 0x989D, 0x989D, 0x062D, + 0x989E, 0x989F, 0x1BEA, 0x98A0, 0x98A0, 0x05C0, 0x98A1, 0x98A2, 0x1BEC, + 0x98A3, 0x98A3, 0x51AE, 0x98A4, 0x98A4, 0x04C3, 0x98A5, 0x98A6, 0x1BEE, + 0x98A7, 0x98A7, 0x0C82, 0x98A8, 0x98A8, 0x1F00, 0x98A9, 0x98AD, 0x51AF, + 0x98AE, 0x98AF, 0x24CC, 0x98B0, 0x98B0, 0x51B4, 0x98B1, 0x98B1, 0x2698, + 0x98B2, 0x98B2, 0x51B5, 0x98B3, 0x98B3, 0x2678, 0x98B4, 0x98B5, 0x51B6, + 0x98B6, 0x98B6, 0x24CE, 0x98B7, 0x98BB, 0x51B8, 0x98BC, 0x98BC, 0x24CF, + 0x98BD, 0x98C3, 0x51BD, 0x98C4, 0x98C4, 0x20B8, 0x98C5, 0x98C5, 0x51C4, + 0x98C6, 0x98C6, 0x24D0, 0x98C7, 0x98C7, 0x51C5, 0x98C8, 0x98C8, 0x24D1, + 0x98C9, 0x98CD, 0x51C6, 0x98CE, 0x98CE, 0x0684, 0x98CF, 0x98D0, 0x51CB, + 0x98D1, 0x98D3, 0x19B7, 0x98D4, 0x98D4, 0x51CD, 0x98D5, 0x98D5, 0x19BA, + 0x98D6, 0x98D7, 0x51CE, 0x98D8, 0x98D8, 0x0BCD, 0x98D9, 0x98DA, 0x19BB, + 0x98DB, 0x98DB, 0x1EF4, 0x98DC, 0x98DD, 0x51D0, 0x98DE, 0x98DE, 0x0666, + 0x98DF, 0x98DF, 0x0D4A, 0x98E0, 0x98E0, 0x239B, 0x98E1, 0x98E1, 0x51D2, + 0x98E2, 0x98E2, 0x267E, 0x98E3, 0x98E6, 0x51D3, 0x98E7, 0x98E7, 0x161A, + 0x98E8, 0x98E8, 0x1DE7, 0x98E9, 0x98E9, 0x239D, 0x98EA, 0x98EB, 0x239F, + 0x98EC, 0x98EC, 0x51D7, 0x98ED, 0x98ED, 0x23A1, 0x98EE, 0x98EE, 0x51D8, + 0x98EF, 0x98EF, 0x1EF1, 0x98F0, 0x98F1, 0x51D9, 0x98F2, 0x98F2, 0x221E, + 0x98F3, 0x98F3, 0x51DB, 0x98F4, 0x98F4, 0x23A2, 0x98F5, 0x98FB, 0x51DC, + 0x98FC, 0x98FC, 0x214B, 0x98FD, 0x98FD, 0x1E36, 0x98FE, 0x98FE, 0x2135, + 0x98FF, 0x98FF, 0x51E3, 0x9900, 0x9902, 0x51E4, 0x9903, 0x9903, 0x1FAD, + 0x9904, 0x9904, 0x51E7, 0x9905, 0x9905, 0x1E53, 0x9906, 0x9908, 0x51E8, + 0x9909, 0x9909, 0x23A3, 0x990A, 0x990A, 0x2203, 0x990B, 0x990B, 0x51EB, + 0x990C, 0x990C, 0x1EE7, 0x990D, 0x990D, 0x1DE8, 0x990E, 0x990F, 0x51EC, + 0x9910, 0x9910, 0x0494, 0x9911, 0x9911, 0x23A4, 0x9912, 0x9912, 0x2097, + 0x9913, 0x9913, 0x1EE4, 0x9914, 0x9917, 0x51EE, 0x9918, 0x9918, 0x2238, + 0x9919, 0x991A, 0x51F2, 0x991B, 0x991B, 0x23A5, 0x991C, 0x991D, 0x51F4, + 0x991E, 0x991E, 0x1F9A, 0x991F, 0x9920, 0x51F6, 0x9921, 0x9921, 0x21C3, + 0x9922, 0x9927, 0x51F8, 0x9928, 0x9928, 0x1F2E, 0x9929, 0x992D, 0x51FE, + 0x992E, 0x992E, 0x1DE9, 0x992F, 0x9932, 0x5203, 0x9933, 0x9933, 0x239C, + 0x9934, 0x9936, 0x5207, 0x9937, 0x9937, 0x23A6, 0x9938, 0x993B, 0x520A, + 0x993C, 0x993C, 0x239E, 0x993D, 0x993D, 0x520E, 0x993E, 0x993E, 0x2035, + 0x993F, 0x993F, 0x23A7, 0x9940, 0x9942, 0x520F, 0x9943, 0x9943, 0x23A8, + 0x9944, 0x9944, 0x5212, 0x9945, 0x9945, 0x2075, 0x9946, 0x9947, 0x5213, + 0x9948, 0x994A, 0x23A9, 0x994B, 0x994B, 0x1FEB, 0x994C, 0x994C, 0x23AC, + 0x994D, 0x9950, 0x5215, 0x9951, 0x9951, 0x1F6A, 0x9952, 0x9952, 0x20F9, + 0x9953, 0x9953, 0x5219, 0x9954, 0x9954, 0x1DEB, 0x9955, 0x9955, 0x1DEA, + 0x9956, 0x9956, 0x521A, 0x9957, 0x9957, 0x2666, 0x9958, 0x995B, 0x521B, + 0x995C, 0x995C, 0x2667, 0x995D, 0x995D, 0x521F, 0x995E, 0x995E, 0x1E6C, + 0x995F, 0x9961, 0x5220, 0x9962, 0x9962, 0x23AD, 0x9963, 0x9963, 0x161D, + 0x9964, 0x9964, 0x5223, 0x9965, 0x9965, 0x0815, 0x9966, 0x9966, 0x5224, + 0x9967, 0x996C, 0x161E, 0x996D, 0x996D, 0x0656, 0x996E, 0x996E, 0x1082, + 0x996F, 0x996F, 0x0875, 0x9970, 0x9970, 0x0D65, 0x9971, 0x9971, 0x040E, + 0x9972, 0x9972, 0x0DBC, 0x9973, 0x9973, 0x5225, 0x9974, 0x9974, 0x1624, + 0x9975, 0x9975, 0x063B, 0x9976, 0x9976, 0x0C9F, 0x9977, 0x9977, 0x1625, + 0x9978, 0x9979, 0x5226, 0x997A, 0x997A, 0x0899, 0x997B, 0x997B, 0x5228, + 0x997C, 0x997C, 0x0466, 0x997D, 0x997D, 0x1626, 0x997E, 0x997E, 0x5229, + 0x997F, 0x997F, 0x0635, 0x9980, 0x9980, 0x1627, 0x9981, 0x9981, 0x0B3C, + 0x9982, 0x9983, 0x522A, 0x9984, 0x9984, 0x1628, 0x9985, 0x9985, 0x0F47, + 0x9986, 0x9986, 0x0736, 0x9987, 0x9987, 0x1629, 0x9988, 0x9988, 0x098C, + 0x9989, 0x9989, 0x522C, 0x998A, 0x998A, 0x162A, 0x998B, 0x998B, 0x04BD, + 0x998C, 0x998C, 0x522D, 0x998D, 0x998D, 0x162B, 0x998E, 0x998E, 0x522E, + 0x998F, 0x998F, 0x0A3C, 0x9990, 0x9991, 0x162C, 0x9992, 0x9992, 0x0A9F, + 0x9993, 0x9995, 0x162E, 0x9996, 0x9996, 0x0D6E, 0x9997, 0x9997, 0x126E, + 0x9998, 0x9998, 0x12F9, 0x9999, 0x9999, 0x0F50, 0x999A, 0x99A4, 0x522F, + 0x99A5, 0x99A5, 0x1B2B, 0x99A6, 0x99A7, 0x523A, 0x99A8, 0x99A8, 0x13DE, + 0x99A9, 0x99AB, 0x523C, 0x99AC, 0x99AC, 0x206D, 0x99AD, 0x99AD, 0x2242, + 0x99AE, 0x99AE, 0x1F02, 0x99AF, 0x99B0, 0x523F, 0x99B1, 0x99B1, 0x2183, + 0x99B2, 0x99B2, 0x5241, 0x99B3, 0x99B3, 0x1E85, 0x99B4, 0x99B4, 0x21E9, + 0x99B5, 0x99C0, 0x5242, 0x99C1, 0x99C1, 0x1E57, 0x99C2, 0x99CF, 0x524E, + 0x99D0, 0x99D0, 0x22A5, 0x99D1, 0x99D1, 0x2407, 0x99D2, 0x99D2, 0x1FCA, + 0x99D3, 0x99D3, 0x525C, 0x99D4, 0x99D4, 0x2402, 0x99D5, 0x99D5, 0x1F82, + 0x99D6, 0x99D7, 0x525D, 0x99D8, 0x99D8, 0x2408, 0x99D9, 0x99D9, 0x2404, + 0x99DA, 0x99DA, 0x525F, 0x99DB, 0x99DB, 0x2131, 0x99DC, 0x99DC, 0x5260, + 0x99DD, 0x99DD, 0x2184, 0x99DE, 0x99DE, 0x5261, 0x99DF, 0x99DF, 0x2403, + 0x99E0, 0x99E0, 0x5262, 0x99E1, 0x99E1, 0x206E, 0x99E2, 0x99E2, 0x240B, + 0x99E3, 0x99EC, 0x5263, 0x99ED, 0x99ED, 0x1F3F, 0x99EE, 0x99F0, 0x526D, + 0x99F1, 0x99F1, 0x2067, 0x99F2, 0x99FE, 0x5270, 0x99FF, 0x99FF, 0x1FD7, + 0x9A00, 0x9A00, 0x527D, 0x9A01, 0x9A01, 0x1E83, 0x9A02, 0x9A04, 0x527E, + 0x9A05, 0x9A05, 0x240F, 0x9A06, 0x9A0C, 0x5281, 0x9A0D, 0x9A0D, 0x240E, + 0x9A0E, 0x9A0E, 0x20C7, 0x9A0F, 0x9A0F, 0x240D, 0x9A10, 0x9A15, 0x5288, + 0x9A16, 0x9A16, 0x2412, 0x9A17, 0x9A18, 0x528E, 0x9A19, 0x9A19, 0x20B7, + 0x9A1A, 0x9A2A, 0x5290, 0x9A2B, 0x9A2B, 0x23F0, 0x9A2C, 0x9A2C, 0x52A1, + 0x9A2D, 0x9A2D, 0x2411, 0x9A2E, 0x9A2E, 0x2414, 0x9A2F, 0x9A2F, 0x52A2, + 0x9A30, 0x9A30, 0x2170, 0x9A31, 0x9A35, 0x52A3, 0x9A36, 0x9A36, 0x2405, + 0x9A37, 0x9A37, 0x210C, 0x9A38, 0x9A38, 0x2415, 0x9A39, 0x9A3D, 0x52A8, + 0x9A3E, 0x9A3E, 0x2066, 0x9A3F, 0x9A3F, 0x52AD, 0x9A40, 0x9A40, 0x2352, + 0x9A41, 0x9A41, 0x2413, 0x9A42, 0x9A42, 0x2410, 0x9A43, 0x9A44, 0x2416, + 0x9A45, 0x9A45, 0x20F1, 0x9A46, 0x9A49, 0x52AE, 0x9A4A, 0x9A4A, 0x240A, + 0x9A4B, 0x9A4C, 0x52B2, 0x9A4D, 0x9A4D, 0x2409, 0x9A4E, 0x9A4E, 0x52B4, + 0x9A4F, 0x9A4F, 0x2418, 0x9A50, 0x9A54, 0x52B5, 0x9A55, 0x9A55, 0x1FA7, + 0x9A56, 0x9A56, 0x52BA, 0x9A57, 0x9A57, 0x21FC, 0x9A58, 0x9A59, 0x52BB, + 0x9A5A, 0x9A5A, 0x1FC1, 0x9A5B, 0x9A5B, 0x2406, 0x9A5C, 0x9A5E, 0x52BD, + 0x9A5F, 0x9A5F, 0x229C, 0x9A60, 0x9A61, 0x52C0, 0x9A62, 0x9A62, 0x204E, + 0x9A63, 0x9A63, 0x52C2, 0x9A64, 0x9A64, 0x241A, 0x9A65, 0x9A65, 0x2419, + 0x9A66, 0x9A69, 0x52C3, 0x9A6A, 0x9A6A, 0x240C, 0x9A6B, 0x9A6B, 0x52C7, + 0x9A6C, 0x9A6C, 0x0A94, 0x9A6D, 0x9A6D, 0x10E9, 0x9A6E, 0x9A6E, 0x0E85, + 0x9A6F, 0x9A6F, 0x0FDA, 0x9A70, 0x9A70, 0x0500, 0x9A71, 0x9A71, 0x0C7A, + 0x9A72, 0x9A72, 0x52C8, 0x9A73, 0x9A73, 0x047C, 0x9A74, 0x9A74, 0x0A66, + 0x9A75, 0x9A75, 0x17BA, 0x9A76, 0x9A76, 0x0D52, 0x9A77, 0x9A78, 0x17BB, + 0x9A79, 0x9A79, 0x0903, 0x9A7A, 0x9A7A, 0x17BD, 0x9A7B, 0x9A7B, 0x1201, + 0x9A7C, 0x9A7C, 0x0E86, 0x9A7D, 0x9A7D, 0x17BF, 0x9A7E, 0x9A7E, 0x0850, + 0x9A7F, 0x9A7F, 0x17BE, 0x9A80, 0x9A81, 0x17C0, 0x9A82, 0x9A82, 0x0A95, + 0x9A83, 0x9A83, 0x52C9, 0x9A84, 0x9A84, 0x088F, 0x9A85, 0x9A85, 0x17C2, + 0x9A86, 0x9A86, 0x0A8D, 0x9A87, 0x9A87, 0x075E, 0x9A88, 0x9A88, 0x17C3, + 0x9A89, 0x9A89, 0x52CA, 0x9A8A, 0x9A8A, 0x17C4, 0x9A8B, 0x9A8B, 0x04F7, + 0x9A8C, 0x9A8C, 0x1012, 0x9A8D, 0x9A8E, 0x52CB, 0x9A8F, 0x9A8F, 0x0932, + 0x9A90, 0x9A90, 0x17C5, 0x9A91, 0x9A91, 0x0C0E, 0x9A92, 0x9A93, 0x17C6, + 0x9A94, 0x9A95, 0x52CD, 0x9A96, 0x9A96, 0x17C8, 0x9A97, 0x9A97, 0x0BCC, + 0x9A98, 0x9A98, 0x17C9, 0x9A99, 0x9A99, 0x52CF, 0x9A9A, 0x9A9A, 0x0CE0, + 0x9A9B, 0x9A9D, 0x17CA, 0x9A9E, 0x9A9E, 0x1735, 0x9A9F, 0x9AA0, 0x17CD, + 0x9AA1, 0x9AA1, 0x0A89, 0x9AA2, 0x9AA3, 0x17CF, 0x9AA4, 0x9AA4, 0x11E7, + 0x9AA5, 0x9AA5, 0x17D1, 0x9AA6, 0x9AA6, 0x52D0, 0x9AA7, 0x9AA7, 0x17D2, + 0x9AA8, 0x9AA8, 0x0720, 0x9AA9, 0x9AAE, 0x52D1, 0x9AAF, 0x9AAF, 0x1E29, + 0x9AB0, 0x9AB0, 0x1DD3, 0x9AB1, 0x9AB1, 0x1DD2, 0x9AB2, 0x9AB5, 0x52D7, + 0x9AB6, 0x9AB6, 0x1DD6, 0x9AB7, 0x9AB7, 0x1DD4, 0x9AB8, 0x9AB8, 0x0758, + 0x9AB9, 0x9AB9, 0x52DB, 0x9ABA, 0x9ABA, 0x1DD7, 0x9ABB, 0x9ABB, 0x52DC, + 0x9ABC, 0x9ABC, 0x1DD8, 0x9ABD, 0x9ABF, 0x52DD, 0x9AC0, 0x9AC0, 0x1DDA, + 0x9AC1, 0x9AC1, 0x1DD9, 0x9AC2, 0x9AC2, 0x1DDC, 0x9AC3, 0x9AC4, 0x52E0, + 0x9AC5, 0x9AC5, 0x1DDB, 0x9AC6, 0x9ACA, 0x52E2, 0x9ACB, 0x9ACC, 0x1DDD, + 0x9ACD, 0x9ACE, 0x52E7, 0x9ACF, 0x9ACF, 0x2661, 0x9AD0, 0x9AD0, 0x52E9, + 0x9AD1, 0x9AD1, 0x1DDF, 0x9AD2, 0x9AD2, 0x26A4, 0x9AD3, 0x9AD3, 0x0DDD, + 0x9AD4, 0x9AD4, 0x2174, 0x9AD5, 0x9AD5, 0x2663, 0x9AD6, 0x9AD6, 0x2662, + 0x9AD7, 0x9AD7, 0x52EA, 0x9AD8, 0x9AD8, 0x06DA, 0x9AD9, 0x9ADE, 0x52EB, + 0x9ADF, 0x9ADF, 0x1DEC, 0x9AE0, 0x9AE0, 0x52F1, 0x9AE1, 0x9AE1, 0x1DED, + 0x9AE2, 0x9AE5, 0x52F2, 0x9AE6, 0x9AE6, 0x1DEE, 0x9AE7, 0x9AEA, 0x52F6, + 0x9AEB, 0x9AEB, 0x1DF0, 0x9AEC, 0x9AEC, 0x52FA, 0x9AED, 0x9AED, 0x1DF2, + 0x9AEE, 0x9AEE, 0x2675, 0x9AEF, 0x9AEF, 0x1DEF, 0x9AF0, 0x9AF8, 0x52FB, + 0x9AF9, 0x9AF9, 0x1DF3, 0x9AFA, 0x9AFA, 0x5304, 0x9AFB, 0x9AFB, 0x1DF1, + 0x9AFC, 0x9AFF, 0x5305, 0x9B00, 0x9B02, 0x5309, 0x9B03, 0x9B03, 0x1234, + 0x9B04, 0x9B05, 0x530C, 0x9B06, 0x9B06, 0x214C, 0x9B07, 0x9B07, 0x530E, + 0x9B08, 0x9B08, 0x1DF4, 0x9B09, 0x9B0C, 0x530F, 0x9B0D, 0x9B0D, 0x267A, + 0x9B0E, 0x9B0E, 0x5313, 0x9B0F, 0x9B0F, 0x1DF5, 0x9B10, 0x9B12, 0x5314, + 0x9B13, 0x9B13, 0x1DF6, 0x9B14, 0x9B19, 0x5317, 0x9B1A, 0x9B1A, 0x26A0, + 0x9B1B, 0x9B1E, 0x531D, 0x9B1F, 0x9B1F, 0x1DF7, 0x9B20, 0x9B21, 0x5321, + 0x9B22, 0x9B22, 0x2668, 0x9B23, 0x9B23, 0x1DF8, 0x9B24, 0x9B24, 0x5323, + 0x9B25, 0x9B25, 0x1ED0, 0x9B26, 0x9B26, 0x5324, 0x9B27, 0x9B27, 0x2096, + 0x9B28, 0x9B28, 0x5325, 0x9B29, 0x9B29, 0x23CC, 0x9B2A, 0x9B2D, 0x5326, + 0x9B2E, 0x9B2E, 0x23C8, 0x9B2F, 0x9B2F, 0x139B, 0x9B30, 0x9B30, 0x532A, + 0x9B31, 0x9B31, 0x223E, 0x9B32, 0x9B32, 0x1260, 0x9B33, 0x9B3A, 0x532B, + 0x9B3B, 0x9B3B, 0x1773, 0x9B3C, 0x9B3C, 0x0746, 0x9B3D, 0x9B40, 0x5333, + 0x9B41, 0x9B41, 0x098A, 0x9B42, 0x9B42, 0x07FF, 0x9B43, 0x9B43, 0x1DE1, + 0x9B44, 0x9B44, 0x0BE6, 0x9B45, 0x9B45, 0x1DE0, 0x9B46, 0x9B46, 0x5337, + 0x9B47, 0x9B47, 0x1DE2, 0x9B48, 0x9B48, 0x1DE4, 0x9B49, 0x9B49, 0x1DE3, + 0x9B4A, 0x9B4C, 0x5338, 0x9B4D, 0x9B4D, 0x1DE5, 0x9B4E, 0x9B4E, 0x2665, + 0x9B4F, 0x9B4F, 0x0EC9, 0x9B50, 0x9B50, 0x533B, 0x9B51, 0x9B51, 0x1DE6, + 0x9B52, 0x9B53, 0x533C, 0x9B54, 0x9B54, 0x0B0A, 0x9B55, 0x9B57, 0x533E, + 0x9B58, 0x9B58, 0x2664, 0x9B59, 0x9B59, 0x5341, 0x9B5A, 0x9B5A, 0x2239, + 0x9B5B, 0x9B6E, 0x5342, 0x9B6F, 0x9B6F, 0x204A, 0x9B70, 0x9B73, 0x5356, + 0x9B74, 0x9B74, 0x261F, 0x9B75, 0x9B76, 0x535A, 0x9B77, 0x9B77, 0x261E, + 0x9B78, 0x9B80, 0x535C, 0x9B81, 0x9B81, 0x2620, 0x9B82, 0x9B82, 0x5365, + 0x9B83, 0x9B83, 0x2621, 0x9B84, 0x9B8D, 0x5366, 0x9B8E, 0x9B8E, 0x2622, + 0x9B8F, 0x9B8F, 0x5370, 0x9B90, 0x9B90, 0x2627, 0x9B91, 0x9B91, 0x1E39, + 0x9B92, 0x9B92, 0x2625, 0x9B93, 0x9B99, 0x5371, 0x9B9A, 0x9B9A, 0x2629, + 0x9B9B, 0x9B9C, 0x5378, 0x9B9D, 0x9B9D, 0x262E, 0x9B9E, 0x9B9E, 0x262B, + 0x9B9F, 0x9BA9, 0x537A, 0x9BAA, 0x9BAA, 0x262A, 0x9BAB, 0x9BAB, 0x262D, + 0x9BAC, 0x9BAC, 0x5385, 0x9BAD, 0x9BAD, 0x2628, 0x9BAE, 0x9BAE, 0x21B9, + 0x9BAF, 0x9BBF, 0x5386, 0x9BC0, 0x9BC0, 0x2636, 0x9BC1, 0x9BC1, 0x2630, + 0x9BC2, 0x9BC6, 0x5397, 0x9BC7, 0x9BC7, 0x2638, 0x9BC8, 0x9BC8, 0x539C, + 0x9BC9, 0x9BC9, 0x200D, 0x9BCA, 0x9BCA, 0x2637, 0x9BCB, 0x9BD3, 0x539D, + 0x9BD4, 0x9BD4, 0x2645, 0x9BD5, 0x9BD5, 0x53A6, 0x9BD6, 0x9BD6, 0x263A, + 0x9BD7, 0x9BDA, 0x53A7, 0x9BDB, 0x9BDB, 0x2643, 0x9BDC, 0x9BDC, 0x53AB, + 0x9BDD, 0x9BDD, 0x2640, 0x9BDE, 0x9BE0, 0x53AC, 0x9BE1, 0x9BE1, 0x263D, + 0x9BE2, 0x9BE2, 0x2641, 0x9BE3, 0x9BE3, 0x53AF, 0x9BE4, 0x9BE4, 0x263E, + 0x9BE5, 0x9BE6, 0x53B0, 0x9BE7, 0x9BE7, 0x263F, 0x9BE8, 0x9BE8, 0x1FC0, + 0x9BE9, 0x9BE9, 0x53B2, 0x9BEA, 0x9BEB, 0x263B, 0x9BEC, 0x9BEF, 0x53B3, + 0x9BF0, 0x9BF0, 0x2642, 0x9BF1, 0x9BF3, 0x53B7, 0x9BF4, 0x9BF4, 0x2644, + 0x9BF5, 0x9BFC, 0x53BA, 0x9BFD, 0x9BFD, 0x2639, 0x9BFE, 0x9BFE, 0x53C2, + 0x9BFF, 0x9BFF, 0x264C, 0x9C00, 0x9C07, 0x53C3, 0x9C08, 0x9C08, 0x2647, + 0x9C09, 0x9C09, 0x264B, 0x9C0A, 0x9C0C, 0x53CB, 0x9C0D, 0x9C0D, 0x2649, + 0x9C0E, 0x9C0F, 0x53CE, 0x9C10, 0x9C10, 0x2648, 0x9C11, 0x9C11, 0x53D0, + 0x9C12, 0x9C12, 0x264A, 0x9C13, 0x9C13, 0x2108, 0x9C14, 0x9C1F, 0x53D1, + 0x9C20, 0x9C20, 0x264D, 0x9C21, 0x9C22, 0x53DD, 0x9C23, 0x9C23, 0x2634, + 0x9C24, 0x9C24, 0x53DF, 0x9C25, 0x9C25, 0x2651, 0x9C26, 0x9C27, 0x53E0, + 0x9C28, 0x9C28, 0x2650, 0x9C29, 0x9C29, 0x2652, 0x9C2A, 0x9C2C, 0x53E2, + 0x9C2D, 0x9C2D, 0x264F, 0x9C2E, 0x9C30, 0x53E5, 0x9C31, 0x9C31, 0x2632, + 0x9C32, 0x9C32, 0x264E, 0x9C33, 0x9C33, 0x2653, 0x9C34, 0x9C34, 0x53E8, + 0x9C35, 0x9C35, 0x2657, 0x9C36, 0x9C36, 0x53E9, 0x9C37, 0x9C37, 0x2635, + 0x9C38, 0x9C38, 0x53EA, 0x9C39, 0x9C39, 0x2633, 0x9C3A, 0x9C3A, 0x53EB, + 0x9C3B, 0x9C3B, 0x2656, 0x9C3C, 0x9C3D, 0x53EC, 0x9C3E, 0x9C3E, 0x2654, + 0x9C3F, 0x9C44, 0x53EE, 0x9C45, 0x9C45, 0x2658, 0x9C46, 0x9C47, 0x53F4, + 0x9C48, 0x9C48, 0x2655, 0x9C49, 0x9C49, 0x1E4D, 0x9C4A, 0x9C51, 0x53F6, + 0x9C52, 0x9C52, 0x265B, 0x9C53, 0x9C53, 0x53FE, 0x9C54, 0x9C54, 0x265A, + 0x9C55, 0x9C55, 0x53FF, 0x9C56, 0x9C56, 0x2659, 0x9C57, 0x9C57, 0x202E, + 0x9C58, 0x9C58, 0x262F, 0x9C59, 0x9C5C, 0x5400, 0x9C5D, 0x9C5D, 0x2646, + 0x9C5E, 0x9C5E, 0x5404, 0x9C5F, 0x9C5F, 0x2626, 0x9C60, 0x9C66, 0x5405, + 0x9C67, 0x9C67, 0x265C, 0x9C68, 0x9C6C, 0x540C, 0x9C6D, 0x9C6D, 0x262C, + 0x9C6E, 0x9C77, 0x5411, 0x9C78, 0x9C78, 0x2623, 0x9C79, 0x9C79, 0x541B, + 0x9C7A, 0x9C7A, 0x2631, 0x9C7B, 0x9C7B, 0x541C, 0x9C7C, 0x9C7C, 0x10C8, + 0x9C7D, 0x9C7E, 0x541D, 0x9C7F, 0x9C7F, 0x1D89, 0x9C80, 0x9C80, 0x541F, + 0x9C81, 0x9C81, 0x0A5A, 0x9C82, 0x9C82, 0x1D8A, 0x9C83, 0x9C84, 0x5420, + 0x9C85, 0x9C88, 0x1D8B, 0x9C89, 0x9C8A, 0x5422, 0x9C8B, 0x9C8B, 0x1D90, + 0x9C8C, 0x9C8C, 0x5424, 0x9C8D, 0x9C8D, 0x0414, 0x9C8E, 0x9C8E, 0x1D91, + 0x9C8F, 0x9C8F, 0x5425, 0x9C90, 0x9C92, 0x1D92, 0x9C93, 0x9C93, 0x5426, + 0x9C94, 0x9C95, 0x1D95, 0x9C96, 0x9C99, 0x5427, 0x9C9A, 0x9C9B, 0x1D97, + 0x9C9C, 0x9C9C, 0x0F37, 0x9C9D, 0x9C9D, 0x542B, 0x9C9E, 0x9CA3, 0x1D99, + 0x9CA4, 0x9CA4, 0x09DB, 0x9CA5, 0x9CA9, 0x1D9F, 0x9CAA, 0x9CAA, 0x542C, + 0x9CAB, 0x9CAB, 0x1DA4, 0x9CAC, 0x9CAC, 0x542D, 0x9CAD, 0x9CAE, 0x1DA5, + 0x9CAF, 0x9CAF, 0x542E, 0x9CB0, 0x9CB7, 0x1DA7, 0x9CB8, 0x9CB8, 0x08D7, + 0x9CB9, 0x9CB9, 0x542F, 0x9CBA, 0x9CBD, 0x1DAF, 0x9CBE, 0x9CC2, 0x5430, + 0x9CC3, 0x9CC3, 0x0CD5, 0x9CC4, 0x9CC7, 0x1DB3, 0x9CC8, 0x9CC9, 0x5435, + 0x9CCA, 0x9CD0, 0x1DB7, 0x9CD1, 0x9CD2, 0x5437, 0x9CD3, 0x9CD5, 0x1DBE, + 0x9CD6, 0x9CD6, 0x0457, 0x9CD7, 0x9CD9, 0x1DC1, 0x9CDA, 0x9CDB, 0x5439, + 0x9CDC, 0x9CDD, 0x1DC4, 0x9CDE, 0x9CDE, 0x0A24, 0x9CDF, 0x9CDF, 0x1DC6, + 0x9CE0, 0x9CE1, 0x543B, 0x9CE2, 0x9CE2, 0x1DC7, 0x9CE3, 0x9CE4, 0x543D, + 0x9CE5, 0x9CE5, 0x209C, 0x9CE6, 0x9CE8, 0x543F, 0x9CE9, 0x9CE9, 0x2580, + 0x9CEA, 0x9CEB, 0x5442, 0x9CEC, 0x9CEC, 0x22DC, 0x9CED, 0x9CF2, 0x5444, + 0x9CF3, 0x9CF3, 0x1F05, 0x9CF4, 0x9CF4, 0x208B, 0x9CF5, 0x9CF5, 0x544A, + 0x9CF6, 0x9CF6, 0x2581, 0x9CF7, 0x9CFF, 0x544B, 0x9D00, 0x9D05, 0x5454, + 0x9D06, 0x9D06, 0x2583, 0x9D07, 0x9D07, 0x2582, 0x9D08, 0x9D08, 0x545A, + 0x9D09, 0x9D09, 0x21EE, 0x9D0A, 0x9D14, 0x545B, 0x9D15, 0x9D15, 0x2182, + 0x9D16, 0x9D1A, 0x5466, 0x9D1B, 0x9D1B, 0x2243, 0x9D1C, 0x9D1C, 0x546B, + 0x9D1D, 0x9D1D, 0x2587, 0x9D1E, 0x9D1E, 0x546C, 0x9D1F, 0x9D1F, 0x2588, + 0x9D20, 0x9D22, 0x546D, 0x9D23, 0x9D23, 0x2584, 0x9D24, 0x9D25, 0x5470, + 0x9D26, 0x9D26, 0x21FD, 0x9D27, 0x9D27, 0x5472, 0x9D28, 0x9D28, 0x21EF, + 0x9D29, 0x9D2E, 0x5473, 0x9D2F, 0x9D2F, 0x258A, 0x9D30, 0x9D30, 0x258C, + 0x9D31, 0x9D3A, 0x5479, 0x9D3B, 0x9D3B, 0x1F47, 0x9D3C, 0x9D3E, 0x5483, + 0x9D3F, 0x9D3F, 0x1F1D, 0x9D40, 0x9D41, 0x5486, 0x9D42, 0x9D42, 0x258D, + 0x9D43, 0x9D50, 0x5488, 0x9D51, 0x9D51, 0x1FD0, 0x9D52, 0x9D52, 0x2592, + 0x9D53, 0x9D53, 0x258F, 0x9D54, 0x9D5B, 0x5496, 0x9D5C, 0x9D5C, 0x2594, + 0x9D5D, 0x9D5D, 0x1EE0, 0x9D5E, 0x9D5F, 0x549E, 0x9D60, 0x9D60, 0x2591, + 0x9D61, 0x9D61, 0x2595, 0x9D62, 0x9D69, 0x54A0, 0x9D6A, 0x9D6A, 0x2597, + 0x9D6B, 0x9D6B, 0x54A8, 0x9D6C, 0x9D6C, 0x20B6, 0x9D6D, 0x9D6E, 0x54A9, + 0x9D6F, 0x9D6F, 0x2598, 0x9D70, 0x9D71, 0x54AB, 0x9D72, 0x9D72, 0x20F6, + 0x9D73, 0x9D86, 0x54AD, 0x9D87, 0x9D87, 0x2585, 0x9D88, 0x9D88, 0x54C1, + 0x9D89, 0x9D89, 0x2599, 0x9D8A, 0x9D92, 0x54C2, 0x9D93, 0x9D93, 0x2596, + 0x9D94, 0x9D97, 0x54CB, 0x9D98, 0x9D98, 0x259A, 0x9D99, 0x9D99, 0x54CF, + 0x9D9A, 0x9D9A, 0x259B, 0x9D9B, 0x9DA4, 0x54D0, 0x9DA5, 0x9DA5, 0x259D, + 0x9DA6, 0x9DA8, 0x54DA, 0x9DA9, 0x9DA9, 0x259E, 0x9DAA, 0x9DAE, 0x54DD, + 0x9DAF, 0x9DAF, 0x234C, 0x9DB0, 0x9DB3, 0x54E2, 0x9DB4, 0x9DB4, 0x1F44, + 0x9DB5, 0x9DBA, 0x54E6, 0x9DBB, 0x9DBB, 0x2660, 0x9DBC, 0x9DBC, 0x25A0, + 0x9DBD, 0x9DBF, 0x54EC, 0x9DC0, 0x9DC0, 0x259C, 0x9DC1, 0x9DC1, 0x54EF, + 0x9DC2, 0x9DC2, 0x259F, 0x9DC3, 0x9DC3, 0x54F0, 0x9DC4, 0x9DC4, 0x1F6C, + 0x9DC5, 0x9DD2, 0x54F1, 0x9DD3, 0x9DD3, 0x25A2, 0x9DD4, 0x9DD6, 0x54FF, + 0x9DD7, 0x9DD7, 0x20AE, 0x9DD8, 0x9DD8, 0x5502, 0x9DD9, 0x9DD9, 0x258B, + 0x9DDA, 0x9DDA, 0x25A3, 0x9DDB, 0x9DE4, 0x5503, 0x9DE5, 0x9DE5, 0x2589, + 0x9DE6, 0x9DE6, 0x25A5, 0x9DE7, 0x9DEE, 0x550D, 0x9DEF, 0x9DEF, 0x25A4, + 0x9DF0, 0x9DF1, 0x5515, 0x9DF2, 0x9DF2, 0x25A6, 0x9DF3, 0x9DF3, 0x2593, + 0x9DF4, 0x9DF7, 0x5517, 0x9DF8, 0x9DF8, 0x25A7, 0x9DF9, 0x9DF9, 0x2222, + 0x9DFA, 0x9DFA, 0x25A9, 0x9DFB, 0x9DFF, 0x551B, 0x9E00, 0x9E0B, 0x5520, + 0x9E0C, 0x9E0C, 0x25A8, 0x9E0D, 0x9E14, 0x552C, 0x9E15, 0x9E15, 0x2586, + 0x9E16, 0x9E19, 0x5534, 0x9E1A, 0x9E1A, 0x25A1, 0x9E1B, 0x9E1B, 0x25AA, + 0x9E1C, 0x9E1C, 0x5538, 0x9E1D, 0x9E1D, 0x2590, 0x9E1E, 0x9E1E, 0x258E, + 0x9E1F, 0x9E1F, 0x0B54, 0x9E20, 0x9E20, 0x1B35, 0x9E21, 0x9E21, 0x0819, + 0x9E22, 0x9E22, 0x1B36, 0x9E23, 0x9E23, 0x0AFE, 0x9E24, 0x9E24, 0x5539, + 0x9E25, 0x9E25, 0x0B79, 0x9E26, 0x9E26, 0x0FE4, 0x9E27, 0x9E27, 0x553A, + 0x9E28, 0x9E2C, 0x1B37, 0x9E2D, 0x9E2D, 0x0FE5, 0x9E2E, 0x9E2E, 0x553B, + 0x9E2F, 0x9E2F, 0x1015, 0x9E30, 0x9E30, 0x553C, 0x9E31, 0x9E31, 0x1B3D, + 0x9E32, 0x9E32, 0x1B3C, 0x9E33, 0x9E33, 0x10EA, 0x9E34, 0x9E34, 0x553D, + 0x9E35, 0x9E35, 0x0E83, 0x9E36, 0x9E36, 0x1B3E, 0x9E37, 0x9E37, 0x1B40, + 0x9E38, 0x9E38, 0x1B3F, 0x9E39, 0x9E3A, 0x1B41, 0x9E3B, 0x9E3C, 0x553E, + 0x9E3D, 0x9E3D, 0x06E6, 0x9E3E, 0x9E3E, 0x1B43, 0x9E3F, 0x9E3F, 0x079F, + 0x9E40, 0x9E40, 0x5540, 0x9E41, 0x9E42, 0x1B44, 0x9E43, 0x9E43, 0x0918, + 0x9E44, 0x9E44, 0x1B46, 0x9E45, 0x9E45, 0x062B, 0x9E46, 0x9E49, 0x1B47, + 0x9E4A, 0x9E4A, 0x0C90, 0x9E4B, 0x9E4C, 0x1B4B, 0x9E4D, 0x9E4D, 0x5541, + 0x9E4E, 0x9E4E, 0x1B4D, 0x9E4F, 0x9E4F, 0x0BB5, 0x9E50, 0x9E50, 0x5542, + 0x9E51, 0x9E51, 0x1B4E, 0x9E52, 0x9E54, 0x5543, 0x9E55, 0x9E55, 0x1B4F, + 0x9E56, 0x9E56, 0x5546, 0x9E57, 0x9E57, 0x1B50, 0x9E58, 0x9E58, 0x1DD5, + 0x9E59, 0x9E59, 0x5547, 0x9E5A, 0x9E5C, 0x1B51, 0x9E5D, 0x9E5D, 0x5548, + 0x9E5E, 0x9E5E, 0x1B54, 0x9E5F, 0x9E62, 0x5549, 0x9E63, 0x9E63, 0x1B55, + 0x9E64, 0x9E64, 0x078E, 0x9E65, 0x9E65, 0x554D, 0x9E66, 0x9E6C, 0x1B56, + 0x9E6D, 0x9E6D, 0x1B5E, 0x9E6E, 0x9E6F, 0x554E, 0x9E70, 0x9E70, 0x108A, + 0x9E71, 0x9E71, 0x1B5D, 0x9E72, 0x9E72, 0x5550, 0x9E73, 0x9E73, 0x1B5F, + 0x9E74, 0x9E74, 0x5551, 0x9E75, 0x9E75, 0x2688, 0x9E76, 0x9E78, 0x5552, + 0x9E79, 0x9E79, 0x269E, 0x9E7A, 0x9E7A, 0x25FB, 0x9E7B, 0x9E7B, 0x5555, + 0x9E7C, 0x9E7C, 0x1F8C, 0x9E7D, 0x9E7D, 0x21F4, 0x9E7E, 0x9E7E, 0x1D16, + 0x9E7F, 0x9E7F, 0x0A60, 0x9E80, 0x9E81, 0x5556, 0x9E82, 0x9E82, 0x1DFC, + 0x9E83, 0x9E86, 0x5558, 0x9E87, 0x9E88, 0x1DFD, 0x9E89, 0x9E8A, 0x555C, + 0x9E8B, 0x9E8B, 0x1DFF, 0x9E8C, 0x9E91, 0x555E, 0x9E92, 0x9E92, 0x1E00, + 0x9E93, 0x9E93, 0x0A5B, 0x9E94, 0x9E96, 0x5564, 0x9E97, 0x9E97, 0x200F, + 0x9E98, 0x9E9C, 0x5567, 0x9E9D, 0x9E9D, 0x1E02, 0x9E9E, 0x9E9E, 0x556C, + 0x9E9F, 0x9E9F, 0x1E03, 0x9EA0, 0x9EA4, 0x556D, 0x9EA5, 0x9EA5, 0x2071, + 0x9EA6, 0x9EA6, 0x0A9A, 0x9EA7, 0x9EA8, 0x5572, 0x9EA9, 0x9EA9, 0x25F7, + 0x9EAA, 0x9EAE, 0x5574, 0x9EAF, 0x9EAF, 0x2696, 0x9EB0, 0x9EB3, 0x5579, + 0x9EB4, 0x9EB4, 0x1CEE, 0x9EB5, 0x9EB5, 0x268F, 0x9EB6, 0x9EB7, 0x557D, + 0x9EB8, 0x9EB8, 0x1CED, 0x9EB9, 0x9EBA, 0x557F, 0x9EBB, 0x9EBB, 0x0A90, + 0x9EBC, 0x9EBC, 0x5581, 0x9EBD, 0x9EBE, 0x1DF9, 0x9EBF, 0x9EC3, 0x5582, + 0x9EC4, 0x9EC4, 0x07DB, 0x9EC5, 0x9EC8, 0x5587, 0x9EC9, 0x9EC9, 0x12F8, + 0x9ECA, 0x9ECB, 0x558B, 0x9ECC, 0x9ECC, 0x22DA, 0x9ECD, 0x9ECD, 0x0D89, + 0x9ECE, 0x9ECE, 0x09D3, 0x9ECF, 0x9ECF, 0x1B2A, 0x9ED0, 0x9ED0, 0x558D, + 0x9ED1, 0x9ED1, 0x0791, 0x9ED2, 0x9ED3, 0x558E, 0x9ED4, 0x9ED4, 0x0C2A, + 0x9ED5, 0x9ED7, 0x5590, 0x9ED8, 0x9ED8, 0x0B0F, 0x9ED9, 0x9EDA, 0x5593, + 0x9EDB, 0x9EDD, 0x1E04, 0x9EDE, 0x9EDE, 0x1EC1, 0x9EDF, 0x9EDF, 0x1E08, + 0x9EE0, 0x9EE0, 0x1E07, 0x9EE1, 0x9EE1, 0x5595, 0x9EE2, 0x9EE2, 0x1E09, + 0x9EE3, 0x9EE4, 0x5596, 0x9EE5, 0x9EE5, 0x1E0C, 0x9EE6, 0x9EE6, 0x5598, + 0x9EE7, 0x9EE7, 0x1E0B, 0x9EE8, 0x9EE8, 0x1EB3, 0x9EE9, 0x9EE9, 0x1E0A, + 0x9EEA, 0x9EEA, 0x1E0D, 0x9EEB, 0x9EEE, 0x5599, 0x9EEF, 0x9EEF, 0x1E0E, + 0x9EF0, 0x9EF1, 0x559D, 0x9EF2, 0x9EF2, 0x266A, 0x9EF3, 0x9EF3, 0x559F, + 0x9EF4, 0x9EF4, 0x268A, 0x9EF5, 0x9EF6, 0x55A0, 0x9EF7, 0x9EF7, 0x2669, + 0x9EF8, 0x9EF8, 0x55A2, 0x9EF9, 0x9EF9, 0x1A55, 0x9EFA, 0x9EFA, 0x55A3, + 0x9EFB, 0x9EFC, 0x1A56, 0x9EFD, 0x9EFD, 0x2618, 0x9EFE, 0x9EFE, 0x1D76, + 0x9EFF, 0x9EFF, 0x2619, 0x9F00, 0x9F08, 0x55A4, 0x9F09, 0x9F09, 0x261A, + 0x9F0A, 0x9F0A, 0x55AD, 0x9F0B, 0x9F0B, 0x1D77, 0x9F0C, 0x9F0C, 0x55AE, + 0x9F0D, 0x9F0D, 0x1D78, 0x9F0E, 0x9F0E, 0x05E5, 0x9F0F, 0x9F0F, 0x55AF, + 0x9F10, 0x9F10, 0x1274, 0x9F11, 0x9F12, 0x55B0, 0x9F13, 0x9F13, 0x071D, + 0x9F14, 0x9F14, 0x55B2, 0x9F15, 0x9F15, 0x2673, 0x9F16, 0x9F16, 0x55B3, + 0x9F17, 0x9F17, 0x1271, 0x9F18, 0x9F18, 0x55B4, 0x9F19, 0x9F19, 0x13DF, + 0x9F1A, 0x9F1F, 0x55B5, 0x9F20, 0x9F20, 0x0D8A, 0x9F21, 0x9F21, 0x55BB, + 0x9F22, 0x9F22, 0x1E0F, 0x9F23, 0x9F2B, 0x55BC, 0x9F2C, 0x9F2C, 0x1E10, + 0x9F2D, 0x9F2E, 0x55C5, 0x9F2F, 0x9F2F, 0x1E11, 0x9F30, 0x9F36, 0x55C7, + 0x9F37, 0x9F37, 0x1E13, 0x9F38, 0x9F38, 0x55CE, 0x9F39, 0x9F39, 0x1E12, + 0x9F3A, 0x9F3A, 0x55CF, 0x9F3B, 0x9F3B, 0x0430, 0x9F3C, 0x9F3C, 0x55D0, + 0x9F3D, 0x9F3E, 0x1E14, 0x9F3F, 0x9F43, 0x55D1, 0x9F44, 0x9F44, 0x1E16, + 0x9F45, 0x9F49, 0x55D6, 0x9F4A, 0x9F4A, 0x20C6, 0x9F4B, 0x9F4B, 0x226B, + 0x9F4C, 0x9F4E, 0x55DB, 0x9F4F, 0x9F4F, 0x24D3, 0x9F50, 0x9F50, 0x0C0A, + 0x9F51, 0x9F51, 0x19C2, 0x9F52, 0x9F52, 0x1E86, 0x9F53, 0x9F53, 0x55DE, + 0x9F54, 0x9F54, 0x260F, 0x9F55, 0x9F58, 0x55DF, 0x9F59, 0x9F59, 0x2611, + 0x9F5A, 0x9F5B, 0x55E3, 0x9F5C, 0x9F5C, 0x2613, 0x9F5D, 0x9F5E, 0x55E5, + 0x9F5F, 0x9F5F, 0x2610, 0x9F60, 0x9F60, 0x2612, 0x9F61, 0x9F61, 0x2030, + 0x9F62, 0x9F62, 0x55E7, 0x9F63, 0x9F63, 0x2671, 0x9F64, 0x9F65, 0x55E8, + 0x9F66, 0x9F66, 0x2614, 0x9F67, 0x9F69, 0x55EA, 0x9F6A, 0x9F6A, 0x2616, + 0x9F6B, 0x9F6B, 0x55ED, 0x9F6C, 0x9F6C, 0x2615, 0x9F6D, 0x9F71, 0x55EE, + 0x9F72, 0x9F72, 0x20F2, 0x9F73, 0x9F76, 0x55F3, 0x9F77, 0x9F77, 0x2617, + 0x9F78, 0x9F7E, 0x55F7, 0x9F7F, 0x9F7F, 0x0502, 0x9F80, 0x9F80, 0x1D6D, + 0x9F81, 0x9F82, 0x55FE, 0x9F83, 0x9F83, 0x1D6E, 0x9F84, 0x9F84, 0x0A2D, + 0x9F85, 0x9F8A, 0x1D6F, 0x9F8B, 0x9F8B, 0x0C7E, 0x9F8C, 0x9F8C, 0x1D75, + 0x9F8D, 0x9F8D, 0x2037, 0x9F8E, 0x9F8F, 0x5600, 0x9F90, 0x9F90, 0x20B3, + 0x9F91, 0x9F93, 0x5602, 0x9F94, 0x9F94, 0x1F22, 0x9F95, 0x9F95, 0x24ED, + 0x9F96, 0x9F98, 0x5605, 0x9F99, 0x9F99, 0x0A43, 0x9F9A, 0x9F9A, 0x0701, + 0x9F9B, 0x9F9B, 0x1A54, 0x9F9C, 0x9F9C, 0x1F34, 0x9F9D, 0x9F9E, 0x5608, + 0x9F9F, 0x9F9F, 0x0743, 0x9FA0, 0x9FA0, 0x12F3, 0x9FA1, 0x9FA5, 0x560A, + 0xE816, 0xE818, 0x5620, 0xE81E, 0xE81E, 0x5628, 0xE826, 0xE826, 0x5630, + 0xE82B, 0xE82C, 0x5635, 0xE831, 0xE832, 0x563B, 0xE83B, 0xE83B, 0x5645, + 0xE843, 0xE843, 0x564D, 0xE854, 0xE855, 0x565E, 0xE864, 0xE864, 0x566E, + 0xF92C, 0xF92C, 0x560F, 0xFA0D, 0xFA0F, 0x5610, 0xFA11, 0xFA11, 0x5613, + 0xFA13, 0xFA14, 0x5614, 0xFA18, 0xFA18, 0x5616, 0xFA1F, 0xFA21, 0x5617, + 0xFA23, 0xFA24, 0x561A, 0xFA27, 0xFA29, 0x561C, 0xFE30, 0xFE30, 0x271D, + 0xFE49, 0xFE52, 0x272B, 0xFE54, 0xFE57, 0x2735, 0xFE59, 0xFE66, 0x2739, + 0xFE68, 0xFE6B, 0x2747, 0xFF01, 0xFF03, 0x0106, 0xFF04, 0xFF04, 0x00A6, + 0xFF05, 0xFF5D, 0x010A, 0xFF5E, 0xFF5E, 0x006A, 0xFFE0, 0xFFE1, 0x00A8, + 0xFFE2, 0xFFE2, 0x271E, 0xFFE3, 0xFFE3, 0x0163, 0xFFE4, 0xFFE4, 0x271F, + 0xFFE5, 0xFFE5, 0x0109, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/UniGB-UCS2-V_4.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/UniGB-UCS2-V_4.cpp new file mode 100644 index 000000000000..4ec5405a36bd --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/UniGB-UCS2-V_4.cpp @@ -0,0 +1,18 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +const uint16_t g_FXCMAP_UniGB_UCS2_V_4[24 * 3] = { + 0x2014, 0x2014, 0x0256, 0x2026, 0x2026, 0x0257, 0x2225, 0x2225, 0x1E1C, + 0x3001, 0x3001, 0x023F, 0x3002, 0x3002, 0x023E, 0x3008, 0x300F, 0x0248, + 0x3010, 0x3011, 0x0252, 0x3013, 0x3013, 0x1E1A, 0x3014, 0x3015, 0x0246, + 0x3016, 0x3017, 0x0250, 0xFF01, 0xFF01, 0x0242, 0xFF08, 0xFF09, 0x0244, + 0xFF0C, 0xFF0C, 0x023D, 0xFF0E, 0xFF0E, 0x1E1B, 0xFF1A, 0xFF1B, 0x0240, + 0xFF1D, 0xFF1D, 0x1E1C, 0xFF1F, 0xFF1F, 0x0243, 0xFF3B, 0xFF3B, 0x1E1D, + 0xFF3D, 0xFF3D, 0x1E1E, 0xFF3F, 0xFF3F, 0x0258, 0xFF5B, 0xFF5B, 0x0254, + 0xFF5D, 0xFF5D, 0x0255, 0xFF5E, 0xFF5E, 0x1E18, 0xFFE3, 0xFFE3, 0x1E1F, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/cmaps_gb1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/cmaps_gb1.cpp new file mode 100644 index 000000000000..9d15271e7e1f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/cmaps_gb1.cpp @@ -0,0 +1,55 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/GB1/cmaps_gb1.h" + +#include "core/fpdfapi/cmaps/cmap_int.h" +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/font/font_int.h" +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fxcrt/fx_basic.h" + +static const FXCMAP_CMap g_FXCMAP_GB1_cmaps[] = { + {"GB-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_GB_EUC_H_0, 90, FXCMAP_CMap::None, + nullptr, 0, 0}, + {"GB-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_GB_EUC_V_0, 20, FXCMAP_CMap::None, + nullptr, 0, -1}, + {"GBpc-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_GBpc_EUC_H_0, 91, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"GBpc-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_GBpc_EUC_V_0, 20, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"GBK-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_GBK_EUC_H_2, 4071, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"GBK-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_GBK_EUC_V_2, 20, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"GBKp-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_GBKp_EUC_H_2, 4070, + FXCMAP_CMap::None, nullptr, 0, -2}, + {"GBKp-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_GBKp_EUC_V_2, 20, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"GBK2K-H", FXCMAP_CMap::Range, g_FXCMAP_GBK2K_H_5, 4071, + FXCMAP_CMap::Single, g_FXCMAP_GBK2K_H_5_DWord, 1017, -4}, + {"GBK2K-V", FXCMAP_CMap::Range, g_FXCMAP_GBK2K_V_5, 41, FXCMAP_CMap::None, + nullptr, 0, -1}, + {"UniGB-UCS2-H", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_H_4, 13825, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"UniGB-UCS2-V", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_V_4, 24, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"UniGB-UTF16-H", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_H_4, 13825, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"UniGB-UTF16-V", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_V_4, 24, + FXCMAP_CMap::None, nullptr, 0, -1}, +}; + +void CPDF_ModuleMgr::LoadEmbeddedGB1CMaps() { + CPDF_FontGlobals* pFontGlobals = + CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); + pFontGlobals->m_EmbeddedCharsets[CIDSET_GB1].m_pMapList = g_FXCMAP_GB1_cmaps; + pFontGlobals->m_EmbeddedCharsets[CIDSET_GB1].m_Count = + FX_ArraySize(g_FXCMAP_GB1_cmaps); + pFontGlobals->m_EmbeddedToUnicodes[CIDSET_GB1].m_pMap = + g_FXCMAP_GB1CID2Unicode_5; + pFontGlobals->m_EmbeddedToUnicodes[CIDSET_GB1].m_Count = 30284; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/cmaps_gb1.h b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/cmaps_gb1.h new file mode 100644 index 000000000000..0b8a3505f387 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/GB1/cmaps_gb1.h @@ -0,0 +1,27 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_CMAPS_GB1_CMAPS_GB1_H_ +#define CORE_FPDFAPI_CMAPS_GB1_CMAPS_GB1_H_ + +#include + +extern const uint16_t g_FXCMAP_GB_EUC_H_0[]; +extern const uint16_t g_FXCMAP_GB_EUC_V_0[]; +extern const uint16_t g_FXCMAP_GBpc_EUC_H_0[]; +extern const uint16_t g_FXCMAP_GBpc_EUC_V_0[]; +extern const uint16_t g_FXCMAP_GBK_EUC_H_2[]; +extern const uint16_t g_FXCMAP_GBK_EUC_V_2[]; +extern const uint16_t g_FXCMAP_GBKp_EUC_H_2[]; +extern const uint16_t g_FXCMAP_GBKp_EUC_V_2[]; +extern const uint16_t g_FXCMAP_GBK2K_H_5[]; +extern const uint16_t g_FXCMAP_GBK2K_H_5_DWord[]; +extern const uint16_t g_FXCMAP_GBK2K_V_5[]; +extern const uint16_t g_FXCMAP_UniGB_UCS2_H_4[]; +extern const uint16_t g_FXCMAP_UniGB_UCS2_V_4[]; +extern const uint16_t g_FXCMAP_GB1CID2Unicode_5[]; + +#endif // CORE_FPDFAPI_CMAPS_GB1_CMAPS_GB1_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/83pv-RKSJ-H_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/83pv-RKSJ-H_1.cpp new file mode 100644 index 000000000000..b3447af96ff8 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/83pv-RKSJ-H_1.cpp @@ -0,0 +1,84 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_83pv_RKSJ_H_1[222 * 3] = { + 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x0061, 0x00A0, 0x00DF, 0x0146, + 0x00FD, 0x00FD, 0x0098, 0x00FE, 0x00FE, 0x00E4, 0x00FF, 0x00FF, 0x007C, + 0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, + 0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, + 0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, + 0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D, + 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, + 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, + 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43, + 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B, + 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B, + 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38, + 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A, + 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A, + 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72, + 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66, + 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76, + 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C, + 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8540, 0x857E, 0x00E8, + 0x8580, 0x8580, 0x0186, 0x8581, 0x859E, 0x0128, 0x859F, 0x85DD, 0x0147, + 0x85DE, 0x85FC, 0x0187, 0x8640, 0x867E, 0x01A6, 0x8680, 0x8691, 0x01E5, + 0x8692, 0x8692, 0x0127, 0x8693, 0x869E, 0x01F7, 0x86A2, 0x86ED, 0x1D37, + 0x8740, 0x875D, 0x1D83, 0x875F, 0x8775, 0x1DA1, 0x8780, 0x878F, 0x1DB8, + 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9, 0x8792, 0x8792, 0x0301, + 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300, 0x879B, 0x879C, 0x1DCF, + 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3, 0x8980, 0x89FC, 0x0502, + 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE, 0x8B40, 0x8B7E, 0x063B, + 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7, 0x8C80, 0x8CFC, 0x0736, + 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2, 0x8E40, 0x8E7E, 0x086F, + 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B, 0x8F80, 0x8FFC, 0x096A, + 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26, 0x9140, 0x917E, 0x0AA3, + 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F, 0x9280, 0x92FC, 0x0B9E, + 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A, 0x9440, 0x947E, 0x0CD7, + 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93, 0x9580, 0x95FC, 0x0DD2, + 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E, 0x9740, 0x977E, 0x0F0B, + 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7, 0x989F, 0x98FC, 0x0FFA, + 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A7E, 0x1114, + 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0, 0x9B80, 0x9BFC, 0x120F, + 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB, 0x9D40, 0x9D7E, 0x1348, + 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404, 0x9E80, 0x9EFC, 0x1443, + 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF, 0xE040, 0xE07E, 0x157C, + 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638, 0xE180, 0xE1FC, 0x1677, + 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733, 0xE340, 0xE37E, 0x17B0, + 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C, 0xE480, 0xE4FC, 0x18AB, + 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967, 0xE640, 0xE67E, 0x19E4, + 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0, 0xE780, 0xE7FC, 0x1ADF, + 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B, 0xE940, 0xE97E, 0x1C18, + 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4, 0xEA80, 0xEAA2, 0x1D13, + 0xEAA3, 0xEAA4, 0x205C, 0xEB40, 0xEB40, 0x0279, 0xEB41, 0xEB42, 0x1ECF, + 0xEB43, 0xEB4F, 0x027C, 0xEB50, 0xEB51, 0x1ED1, 0xEB52, 0xEB5A, 0x028B, + 0xEB5B, 0xEB5D, 0x1ED3, 0xEB5E, 0xEB5F, 0x0297, 0xEB60, 0xEB64, 0x1ED6, + 0xEB65, 0xEB68, 0x029E, 0xEB69, 0xEB7A, 0x1EDB, 0xEB7B, 0xEB7E, 0x02B4, + 0xEB80, 0xEB80, 0x02B8, 0xEB81, 0xEB81, 0x1EED, 0xEB82, 0xEBAC, 0x02BA, + 0xEBB8, 0xEBBF, 0x02E5, 0xEBC8, 0xEBCE, 0x02ED, 0xEBDA, 0xEBE8, 0x02F4, + 0xEBF0, 0xEBF7, 0x0303, 0xEBFC, 0xEBFC, 0x030B, 0xEC4F, 0xEC58, 0x030C, + 0xEC60, 0xEC79, 0x0316, 0xEC81, 0xEC9A, 0x0330, 0xEC9F, 0xEC9F, 0x1EEE, + 0xECA0, 0xECA0, 0x034B, 0xECA1, 0xECA1, 0x1EEF, 0xECA2, 0xECA2, 0x034D, + 0xECA3, 0xECA3, 0x1EF0, 0xECA4, 0xECA4, 0x034F, 0xECA5, 0xECA5, 0x1EF1, + 0xECA6, 0xECA6, 0x0351, 0xECA7, 0xECA7, 0x1EF2, 0xECA8, 0xECC0, 0x0353, + 0xECC1, 0xECC1, 0x1EF3, 0xECC2, 0xECE0, 0x036D, 0xECE1, 0xECE1, 0x1EF4, + 0xECE2, 0xECE2, 0x038D, 0xECE3, 0xECE3, 0x1EF5, 0xECE4, 0xECE4, 0x038F, + 0xECE5, 0xECE5, 0x1EF6, 0xECE6, 0xECEB, 0x0391, 0xECEC, 0xECEC, 0x1EF7, + 0xECED, 0xECF1, 0x0398, 0xED40, 0xED40, 0x1EF8, 0xED41, 0xED41, 0x039E, + 0xED42, 0xED42, 0x1EF9, 0xED43, 0xED43, 0x03A0, 0xED44, 0xED44, 0x1EFA, + 0xED45, 0xED45, 0x03A2, 0xED46, 0xED46, 0x1EFB, 0xED47, 0xED47, 0x03A4, + 0xED48, 0xED48, 0x1EFC, 0xED49, 0xED61, 0x03A6, 0xED62, 0xED62, 0x1EFD, + 0xED63, 0xED7E, 0x03C0, 0xED80, 0xED82, 0x03DC, 0xED83, 0xED83, 0x1EFE, + 0xED84, 0xED84, 0x03E0, 0xED85, 0xED85, 0x1EFF, 0xED86, 0xED86, 0x03E2, + 0xED87, 0xED87, 0x1F00, 0xED88, 0xED8D, 0x03E4, 0xED8E, 0xED8E, 0x1F01, + 0xED8F, 0xED94, 0x03EB, 0xED95, 0xED96, 0x1F02, 0xED9F, 0xEDB6, 0x03F3, + 0xEDBF, 0xEDD6, 0x040B, 0xEE40, 0xEE5D, 0x1D83, 0xEE5F, 0xEE6E, 0x1F04, + 0xEE6F, 0xEE75, 0x1DB1, 0xEE80, 0xEE81, 0x1F14, 0xEE82, 0xEE8F, 0x1DBA, + 0xEE90, 0xEE90, 0x02FA, 0xEE91, 0xEE91, 0x02F9, 0xEE92, 0xEE92, 0x0301, + 0xEE93, 0xEE99, 0x1DC8, 0xEE9A, 0xEE9A, 0x0300, 0xEE9B, 0xEE9C, 0x1DCF, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90ms-RKSJ-H_2.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90ms-RKSJ-H_2.cpp new file mode 100644 index 000000000000..d5d29d6ed8e9 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90ms-RKSJ-H_2.cpp @@ -0,0 +1,67 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_90ms_RKSJ_H_2[171 * 3] = { + 0x0020, 0x007D, 0x00E7, 0x007E, 0x007E, 0x0277, 0x00A0, 0x00DF, 0x0146, + 0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, + 0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, + 0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, + 0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D, + 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, + 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, + 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43, + 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B, + 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B, + 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38, + 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A, + 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A, + 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72, + 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66, + 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76, + 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C, + 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8740, 0x875D, 0x1D83, + 0x875F, 0x8760, 0x1DA1, 0x8761, 0x8761, 0x1F66, 0x8762, 0x8762, 0x1DA4, + 0x8763, 0x8763, 0x1F68, 0x8764, 0x8764, 0x1DA6, 0x8765, 0x8765, 0x1F6A, + 0x8766, 0x8767, 0x1DA8, 0x8768, 0x8768, 0x1F6C, 0x8769, 0x876A, 0x1DAB, + 0x876B, 0x876B, 0x1F6B, 0x876C, 0x876D, 0x1DAE, 0x876E, 0x876E, 0x1F6F, + 0x876F, 0x8775, 0x1DB1, 0x877E, 0x877E, 0x2083, 0x8780, 0x8783, 0x1DB8, + 0x8784, 0x8784, 0x1F77, 0x8785, 0x878F, 0x1DBD, 0x8790, 0x8790, 0x02FA, + 0x8791, 0x8791, 0x02F9, 0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8, + 0x879A, 0x879A, 0x0300, 0x879B, 0x879C, 0x1DCF, 0x889F, 0x88FC, 0x0465, + 0x8940, 0x897E, 0x04C3, 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F, + 0x8A80, 0x8AFC, 0x05BE, 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A, + 0x8C40, 0x8C7E, 0x06F7, 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3, + 0x8D80, 0x8DFC, 0x07F2, 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE, + 0x8F40, 0x8F7E, 0x092B, 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7, + 0x9080, 0x90FC, 0x0A26, 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2, + 0x9240, 0x927E, 0x0B5F, 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B, + 0x9380, 0x93FC, 0x0C5A, 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16, + 0x9540, 0x957E, 0x0D93, 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F, + 0x9680, 0x96FC, 0x0E8E, 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A, + 0x9840, 0x9872, 0x0FC7, 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058, + 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153, + 0x9B40, 0x9B7E, 0x11D0, 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C, + 0x9C80, 0x9CFC, 0x12CB, 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387, + 0x9E40, 0x9E7E, 0x1404, 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0, + 0x9F80, 0x9FFC, 0x14FF, 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB, + 0xE140, 0xE17E, 0x1638, 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4, + 0xE280, 0xE2FC, 0x1733, 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF, + 0xE440, 0xE47E, 0x186C, 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928, + 0xE580, 0xE5FC, 0x1967, 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23, + 0xE740, 0xE77E, 0x1AA0, 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C, + 0xE880, 0xE8FC, 0x1B9B, 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57, + 0xEA40, 0xEA7E, 0x1CD4, 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C, + 0xED40, 0xED7E, 0x20A7, 0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9, + 0xEDB5, 0xEDFC, 0x211A, 0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1, + 0xEEEF, 0xEEF8, 0x1F9C, 0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45, + 0xFA40, 0xFA49, 0x1F9C, 0xFA4A, 0xFA53, 0x1D97, 0xFA54, 0xFA54, 0x02EF, + 0xFA55, 0xFA57, 0x1F45, 0xFA58, 0xFA58, 0x1DC2, 0xFA59, 0xFA59, 0x1DBA, + 0xFA5A, 0xFA5A, 0x1F77, 0xFA5B, 0xFA5B, 0x0300, 0xFA5C, 0xFA7E, 0x20A7, + 0xFA80, 0xFACF, 0x20CA, 0xFAD0, 0xFAD0, 0x07C9, 0xFAD1, 0xFAFC, 0x211A, + 0xFB40, 0xFB7E, 0x2146, 0xFB80, 0xFBFC, 0x2185, 0xFC40, 0xFC4B, 0x2202, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90ms-RKSJ-V_2.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90ms-RKSJ-V_2.cpp new file mode 100644 index 000000000000..1fb0c33024ec --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90ms-RKSJ-V_2.cpp @@ -0,0 +1,36 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_90ms_RKSJ_V_2[78 * 3] = { + 0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052, + 0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6, + 0x8169, 0x817A, 0x1EDB, 0x8181, 0x8181, 0x1EED, 0x81A8, 0x81A8, 0x02E3, + 0x81A9, 0x81A9, 0x02E2, 0x81AA, 0x81AB, 0x02E0, 0x81AC, 0x81AC, 0x204E, + 0x829F, 0x829F, 0x1EEE, 0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0, + 0x82A5, 0x82A5, 0x1EF1, 0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3, + 0x82E1, 0x82E1, 0x1EF4, 0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6, + 0x82EC, 0x82EC, 0x1EF7, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9, + 0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC, + 0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF, + 0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02, + 0x849F, 0x849F, 0x1D39, 0x84A0, 0x84A0, 0x1D37, 0x84A1, 0x84A1, 0x1D47, + 0x84A2, 0x84A2, 0x1D4F, 0x84A3, 0x84A3, 0x1D4B, 0x84A4, 0x84A4, 0x1D43, + 0x84A5, 0x84A5, 0x1D63, 0x84A6, 0x84A6, 0x1D5B, 0x84A7, 0x84A7, 0x1D6B, + 0x84A8, 0x84A8, 0x1D53, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D3A, + 0x84AB, 0x84AB, 0x1D38, 0x84AC, 0x84AC, 0x1D4A, 0x84AD, 0x84AD, 0x1D52, + 0x84AE, 0x84AE, 0x1D4E, 0x84AF, 0x84AF, 0x1D46, 0x84B0, 0x84B0, 0x1D6A, + 0x84B1, 0x84B1, 0x1D62, 0x84B2, 0x84B2, 0x1D72, 0x84B3, 0x84B3, 0x1D5A, + 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D66, 0x84B6, 0x84B6, 0x1D5F, + 0x84B7, 0x84B7, 0x1D6E, 0x84B8, 0x84B8, 0x1D57, 0x84B9, 0x84B9, 0x1D79, + 0x84BA, 0x84BA, 0x1D67, 0x84BB, 0x84BB, 0x1D5C, 0x84BC, 0x84BC, 0x1D6F, + 0x84BD, 0x84BD, 0x1D54, 0x84BE, 0x84BE, 0x1D76, 0x875F, 0x8760, 0x1F04, + 0x8761, 0x8761, 0x2089, 0x8762, 0x8762, 0x1F07, 0x8763, 0x8763, 0x2093, + 0x8764, 0x8764, 0x1F09, 0x8765, 0x8765, 0x2092, 0x8766, 0x8767, 0x1F0B, + 0x8768, 0x8768, 0x2098, 0x8769, 0x876A, 0x1F0E, 0x876B, 0x876B, 0x209C, + 0x876C, 0x876D, 0x1F11, 0x876E, 0x876E, 0x209D, 0x8780, 0x8781, 0x1F14, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90msp-RKSJ-H_2.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90msp-RKSJ-H_2.cpp new file mode 100644 index 000000000000..65081c8253d7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90msp-RKSJ-H_2.cpp @@ -0,0 +1,67 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_90msp_RKSJ_H_2[170 * 3] = { + 0x0020, 0x007E, 0x0001, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279, + 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, 0x81C8, 0x81CE, 0x02ED, + 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, 0x81FC, 0x81FC, 0x030B, + 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330, + 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D, 0x8380, 0x8396, 0x03DC, + 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, 0x8440, 0x8460, 0x0423, + 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, 0x849F, 0x849F, 0x1D37, + 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43, 0x84A2, 0x84A2, 0x1D47, + 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B, 0x84A5, 0x84A5, 0x1D53, + 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B, 0x84A8, 0x84A8, 0x1D6B, + 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38, 0x84AB, 0x84AB, 0x1D3A, + 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A, 0x84AE, 0x84AE, 0x1D52, + 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A, 0x84B1, 0x84B1, 0x1D6A, + 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72, 0x84B4, 0x84B4, 0x1D82, + 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66, 0x84B7, 0x84B7, 0x1D5F, + 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76, 0x84BA, 0x84BA, 0x1D54, + 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C, 0x84BD, 0x84BD, 0x1D6F, + 0x84BE, 0x84BE, 0x1D79, 0x8740, 0x875D, 0x1D83, 0x875F, 0x8760, 0x1DA1, + 0x8761, 0x8761, 0x1F66, 0x8762, 0x8762, 0x1DA4, 0x8763, 0x8763, 0x1F68, + 0x8764, 0x8764, 0x1DA6, 0x8765, 0x8765, 0x1F6A, 0x8766, 0x8767, 0x1DA8, + 0x8768, 0x8768, 0x1F6C, 0x8769, 0x876A, 0x1DAB, 0x876B, 0x876B, 0x1F6B, + 0x876C, 0x876D, 0x1DAE, 0x876E, 0x876E, 0x1F6F, 0x876F, 0x8775, 0x1DB1, + 0x877E, 0x877E, 0x2083, 0x8780, 0x8783, 0x1DB8, 0x8784, 0x8784, 0x1F77, + 0x8785, 0x878F, 0x1DBD, 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9, + 0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300, + 0x879B, 0x879C, 0x1DCF, 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3, + 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE, + 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7, + 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2, + 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B, + 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26, + 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F, + 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A, + 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93, + 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E, + 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7, + 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097, + 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0, + 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB, + 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404, + 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF, + 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638, + 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733, + 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C, + 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967, + 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0, + 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B, + 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4, + 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C, 0xED40, 0xED7E, 0x20A7, + 0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9, 0xEDB5, 0xEDFC, 0x211A, + 0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1, 0xEEEF, 0xEEF8, 0x1F9C, + 0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45, 0xFA40, 0xFA49, 0x1F9C, + 0xFA4A, 0xFA53, 0x1D97, 0xFA54, 0xFA54, 0x02EF, 0xFA55, 0xFA57, 0x1F45, + 0xFA58, 0xFA58, 0x1DC2, 0xFA59, 0xFA59, 0x1DBA, 0xFA5A, 0xFA5A, 0x1F77, + 0xFA5B, 0xFA5B, 0x0300, 0xFA5C, 0xFA7E, 0x20A7, 0xFA80, 0xFACF, 0x20CA, + 0xFAD0, 0xFAD0, 0x07C9, 0xFAD1, 0xFAFC, 0x211A, 0xFB40, 0xFB7E, 0x2146, + 0xFB80, 0xFBFC, 0x2185, 0xFC40, 0xFC4B, 0x2202, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90msp-RKSJ-V_2.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90msp-RKSJ-V_2.cpp new file mode 100644 index 000000000000..5a5e457d6571 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90msp-RKSJ-V_2.cpp @@ -0,0 +1,36 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_90msp_RKSJ_V_2[78 * 3] = { + 0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052, + 0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6, + 0x8169, 0x817A, 0x1EDB, 0x8181, 0x8181, 0x1EED, 0x81A8, 0x81A8, 0x02E3, + 0x81A9, 0x81A9, 0x02E2, 0x81AA, 0x81AB, 0x02E0, 0x81AC, 0x81AC, 0x204E, + 0x829F, 0x829F, 0x1EEE, 0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0, + 0x82A5, 0x82A5, 0x1EF1, 0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3, + 0x82E1, 0x82E1, 0x1EF4, 0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6, + 0x82EC, 0x82EC, 0x1EF7, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9, + 0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC, + 0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF, + 0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02, + 0x849F, 0x849F, 0x1D39, 0x84A0, 0x84A0, 0x1D37, 0x84A1, 0x84A1, 0x1D47, + 0x84A2, 0x84A2, 0x1D4F, 0x84A3, 0x84A3, 0x1D4B, 0x84A4, 0x84A4, 0x1D43, + 0x84A5, 0x84A5, 0x1D63, 0x84A6, 0x84A6, 0x1D5B, 0x84A7, 0x84A7, 0x1D6B, + 0x84A8, 0x84A8, 0x1D53, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D3A, + 0x84AB, 0x84AB, 0x1D38, 0x84AC, 0x84AC, 0x1D4A, 0x84AD, 0x84AD, 0x1D52, + 0x84AE, 0x84AE, 0x1D4E, 0x84AF, 0x84AF, 0x1D46, 0x84B0, 0x84B0, 0x1D6A, + 0x84B1, 0x84B1, 0x1D62, 0x84B2, 0x84B2, 0x1D72, 0x84B3, 0x84B3, 0x1D5A, + 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D66, 0x84B6, 0x84B6, 0x1D5F, + 0x84B7, 0x84B7, 0x1D6E, 0x84B8, 0x84B8, 0x1D57, 0x84B9, 0x84B9, 0x1D79, + 0x84BA, 0x84BA, 0x1D67, 0x84BB, 0x84BB, 0x1D5C, 0x84BC, 0x84BC, 0x1D6F, + 0x84BD, 0x84BD, 0x1D54, 0x84BE, 0x84BE, 0x1D76, 0x875F, 0x8760, 0x1F04, + 0x8761, 0x8761, 0x2089, 0x8762, 0x8762, 0x1F07, 0x8763, 0x8763, 0x2093, + 0x8764, 0x8764, 0x1F09, 0x8765, 0x8765, 0x2092, 0x8766, 0x8767, 0x1F0B, + 0x8768, 0x8768, 0x2098, 0x8769, 0x876A, 0x1F0E, 0x876B, 0x876B, 0x209C, + 0x876C, 0x876D, 0x1F11, 0x876E, 0x876E, 0x209D, 0x8780, 0x8781, 0x1F14, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90pv-RKSJ-H_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90pv-RKSJ-H_1.cpp new file mode 100644 index 000000000000..e41b839188a3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/90pv-RKSJ-H_1.cpp @@ -0,0 +1,98 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_90pv_RKSJ_H_1[263 * 3] = { + 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x0061, 0x00A0, 0x00DF, 0x0146, + 0x00FD, 0x00FD, 0x0098, 0x00FE, 0x00FE, 0x00E4, 0x00FF, 0x00FF, 0x007C, + 0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, + 0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, + 0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, + 0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D, + 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, + 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, + 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43, + 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B, + 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B, + 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38, + 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A, + 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A, + 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72, + 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66, + 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76, + 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C, + 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8540, 0x8553, 0x1D83, + 0x855E, 0x8571, 0x1F87, 0x857C, 0x857E, 0x205E, 0x8580, 0x8585, 0x2061, + 0x8591, 0x859A, 0x1F7D, 0x859F, 0x85A8, 0x1D97, 0x85A9, 0x85AA, 0x2021, + 0x85AB, 0x85AD, 0x2067, 0x85B3, 0x85BC, 0x1F9C, 0x85BD, 0x85C1, 0x206A, + 0x85DB, 0x85F4, 0x1FB0, 0x8640, 0x8640, 0x1DB1, 0x8641, 0x8641, 0x1FFA, + 0x8642, 0x8642, 0x1DB2, 0x8643, 0x8643, 0x1F54, 0x8644, 0x8644, 0x1F56, + 0x8645, 0x8645, 0x206F, 0x8646, 0x8646, 0x1DB7, 0x8647, 0x8647, 0x1F57, + 0x8648, 0x8648, 0x1DB3, 0x8649, 0x8649, 0x1F55, 0x864A, 0x864A, 0x1DB4, + 0x864B, 0x864B, 0x2070, 0x864C, 0x864D, 0x1DB5, 0x864E, 0x864E, 0x1F65, + 0x864F, 0x8655, 0x1F58, 0x8656, 0x8656, 0x2071, 0x8657, 0x8657, 0x1F64, + 0x8658, 0x8659, 0x1F62, 0x865A, 0x865C, 0x1F5F, 0x865D, 0x865D, 0x2072, + 0x869B, 0x869D, 0x1DBA, 0x869E, 0x869E, 0x2073, 0x869F, 0x869F, 0x1F52, + 0x86A0, 0x86A1, 0x1F50, 0x86A2, 0x86A2, 0x1F53, 0x86A3, 0x86A3, 0x2013, + 0x86A4, 0x86A4, 0x2015, 0x86A5, 0x86A5, 0x2014, 0x86A6, 0x86A6, 0x2016, + 0x86B3, 0x86B3, 0x1F7A, 0x86B4, 0x86B4, 0x1F78, 0x86B5, 0x86B5, 0x2074, + 0x86C7, 0x86CA, 0x201B, 0x86CB, 0x86CE, 0x2075, 0x86CF, 0x86CF, 0x1F4E, + 0x86D0, 0x86D0, 0x1F4D, 0x86D1, 0x86D1, 0x1F4C, 0x86D2, 0x86D2, 0x1F4B, + 0x86D3, 0x86D6, 0x200E, 0x8740, 0x8746, 0x2005, 0x8747, 0x8747, 0x1FD6, + 0x8748, 0x8748, 0x200C, 0x8749, 0x8749, 0x1FD1, 0x874A, 0x874A, 0x1FCA, + 0x874B, 0x874B, 0x1DC4, 0x874C, 0x874C, 0x1FD7, 0x874D, 0x874D, 0x1DC2, + 0x874E, 0x874E, 0x1FD2, 0x874F, 0x874F, 0x1FCD, 0x8750, 0x8750, 0x1DC3, + 0x8751, 0x8751, 0x1FD5, 0x8752, 0x8752, 0x1FD3, 0x8753, 0x8753, 0x1FCF, + 0x8754, 0x8754, 0x1FD4, 0x8755, 0x8755, 0x1FD0, 0x8756, 0x8757, 0x1FCB, + 0x8758, 0x8758, 0x1FCE, 0x8791, 0x8792, 0x207D, 0x8793, 0x8797, 0x1DBD, + 0x8798, 0x8798, 0x1FDA, 0x8799, 0x8799, 0x1FE5, 0x879A, 0x879A, 0x207F, + 0x879B, 0x879B, 0x1FDE, 0x879C, 0x879C, 0x1FFF, 0x879D, 0x879D, 0x2080, + 0x879E, 0x879E, 0x201F, 0x879F, 0x879F, 0x1DA1, 0x87A0, 0x87A0, 0x1F66, + 0x87A1, 0x87A1, 0x1DA4, 0x87A2, 0x87A2, 0x1DA2, 0x87A3, 0x87A3, 0x1F67, + 0x87A4, 0x87A4, 0x1FF7, 0x87A5, 0x87A6, 0x2087, 0x87A7, 0x87A7, 0x1F6A, + 0x87A8, 0x87A8, 0x1DA8, 0x87A9, 0x87AA, 0x1F68, 0x87AB, 0x87AB, 0x1DA6, + 0x87AC, 0x87AC, 0x1DA9, 0x87AD, 0x87AD, 0x1DAF, 0x87AE, 0x87AE, 0x1F6E, + 0x87AF, 0x87AF, 0x1F6C, 0x87B0, 0x87B0, 0x1DAB, 0x87B1, 0x87B1, 0x1F6D, + 0x87B2, 0x87B2, 0x1F6B, 0x87B3, 0x87B3, 0x1DAC, 0x87B4, 0x87B4, 0x1F6F, + 0x87B5, 0x87B5, 0x1DAE, 0x87BD, 0x87BD, 0x1F70, 0x87BE, 0x87BF, 0x1F73, + 0x87C0, 0x87C1, 0x1F71, 0x87E5, 0x87E7, 0x1DC5, 0x87E8, 0x87E8, 0x2083, + 0x87FA, 0x87FA, 0x1F76, 0x87FB, 0x87FC, 0x2081, 0x8840, 0x8840, 0x1DC8, + 0x8841, 0x8842, 0x1DCD, 0x8854, 0x8855, 0x1DB8, 0x8868, 0x8868, 0x1F16, + 0x886A, 0x886D, 0x2079, 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3, + 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE, + 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7, + 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2, + 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B, + 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26, + 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F, + 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A, + 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93, + 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E, + 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7, + 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097, + 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0, + 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB, + 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404, + 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF, + 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638, + 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733, + 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C, + 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967, + 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0, + 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B, + 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4, + 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C, 0xEB41, 0xEB42, 0x1ECF, + 0xEB50, 0xEB51, 0x1ED1, 0xEB5B, 0xEB5D, 0x1ED3, 0xEB60, 0xEB64, 0x1ED6, + 0xEB69, 0xEB7A, 0x1EDB, 0xEB81, 0xEB81, 0x1EED, 0xEC9F, 0xEC9F, 0x1EEE, + 0xECA1, 0xECA1, 0x1EEF, 0xECA3, 0xECA3, 0x1EF0, 0xECA5, 0xECA5, 0x1EF1, + 0xECA7, 0xECA7, 0x1EF2, 0xECC1, 0xECC1, 0x1EF3, 0xECE1, 0xECE1, 0x1EF4, + 0xECE3, 0xECE3, 0x1EF5, 0xECE5, 0xECE5, 0x1EF6, 0xECEC, 0xECEC, 0x1EF7, + 0xED40, 0xED40, 0x1EF8, 0xED42, 0xED42, 0x1EF9, 0xED44, 0xED44, 0x1EFA, + 0xED46, 0xED46, 0x1EFB, 0xED48, 0xED48, 0x1EFC, 0xED62, 0xED62, 0x1EFD, + 0xED83, 0xED83, 0x1EFE, 0xED85, 0xED85, 0x1EFF, 0xED87, 0xED87, 0x1F00, + 0xED8E, 0xED8E, 0x1F01, 0xED95, 0xED96, 0x1F02, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Add-RKSJ-H_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Add-RKSJ-H_1.cpp new file mode 100644 index 000000000000..53dc7548afb9 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Add-RKSJ-H_1.cpp @@ -0,0 +1,222 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_Add_RKSJ_H_1[635 * 3] = { + 0x0020, 0x007E, 0x00E7, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279, + 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, 0x81C8, 0x81CE, 0x02ED, + 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, 0x81FC, 0x81FC, 0x030B, + 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330, + 0x829F, 0x82F1, 0x034A, 0x82F2, 0x82F4, 0x1F16, 0x8340, 0x837E, 0x039D, + 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, + 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, + 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43, + 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B, + 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B, + 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38, + 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A, + 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A, + 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72, + 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66, + 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76, + 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C, + 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x889F, 0x889F, 0x0465, + 0x88A0, 0x88A0, 0x1DD1, 0x88A1, 0x88AF, 0x0467, 0x88B0, 0x88B0, 0x1F19, + 0x88B1, 0x88B8, 0x0477, 0x88B9, 0x88B9, 0x1DD2, 0x88BA, 0x88EB, 0x0480, + 0x88EC, 0x88EC, 0x1DD3, 0x88ED, 0x88EE, 0x04B3, 0x88EF, 0x88EF, 0x1F1A, + 0x88F0, 0x88F0, 0x04B6, 0x88F1, 0x88F1, 0x1DD4, 0x88F2, 0x88F9, 0x04B8, + 0x88FA, 0x88FA, 0x1DD5, 0x88FB, 0x88FC, 0x04C1, 0x8940, 0x8948, 0x04C3, + 0x8949, 0x8949, 0x1DD6, 0x894A, 0x8951, 0x04CD, 0x8952, 0x8952, 0x1F1B, + 0x8953, 0x8953, 0x04D6, 0x8954, 0x8954, 0x1DD7, 0x8955, 0x8957, 0x04D8, + 0x8958, 0x8958, 0x1F1C, 0x8959, 0x895B, 0x04DC, 0x895C, 0x895C, 0x1DDA, + 0x895D, 0x8960, 0x04E0, 0x8961, 0x8961, 0x1DDB, 0x8962, 0x897E, 0x04E5, + 0x8980, 0x898A, 0x0502, 0x898B, 0x898B, 0x1DDC, 0x898C, 0x89A5, 0x050E, + 0x89A6, 0x89A6, 0x1DDD, 0x89A7, 0x89A7, 0x0529, 0x89A8, 0x89A8, 0x1DDE, + 0x89A9, 0x89DD, 0x052B, 0x89DE, 0x89DE, 0x1DDF, 0x89DF, 0x89E4, 0x0561, + 0x89E5, 0x89E5, 0x1F1D, 0x89E6, 0x89F7, 0x0568, 0x89F8, 0x89F8, 0x1DE0, + 0x89F9, 0x89FC, 0x057B, 0x8A40, 0x8A40, 0x057F, 0x8A41, 0x8A41, 0x1DE2, + 0x8A42, 0x8A7E, 0x0581, 0x8A80, 0x8A8A, 0x05BE, 0x8A8B, 0x8A8B, 0x1DE4, + 0x8A8C, 0x8A92, 0x05CA, 0x8A93, 0x8A93, 0x1DE5, 0x8A94, 0x8A99, 0x05D2, + 0x8A9A, 0x8A9A, 0x1DE6, 0x8A9B, 0x8ABF, 0x05D9, 0x8AC0, 0x8AC0, 0x1DE7, + 0x8AC1, 0x8ACA, 0x05FF, 0x8ACB, 0x8ACB, 0x1DE8, 0x8ACC, 0x8AE2, 0x060A, + 0x8AE3, 0x8AE3, 0x1DE9, 0x8AE4, 0x8AFC, 0x0622, 0x8B40, 0x8B49, 0x063B, + 0x8B4A, 0x8B4A, 0x1DEA, 0x8B4B, 0x8B5E, 0x0646, 0x8B5F, 0x8B5F, 0x1DEB, + 0x8B60, 0x8B7E, 0x065B, 0x8B80, 0x8B81, 0x067A, 0x8B82, 0x8B82, 0x1F1E, + 0x8B83, 0x8B87, 0x067D, 0x8B88, 0x8B88, 0x1F1F, 0x8B89, 0x8B9F, 0x0683, + 0x8BA0, 0x8BA0, 0x1DEC, 0x8BA1, 0x8BA7, 0x069B, 0x8BA8, 0x8BA8, 0x1DED, + 0x8BA9, 0x8BBF, 0x06A3, 0x8BC0, 0x8BC0, 0x1F20, 0x8BC1, 0x8BCC, 0x06BB, + 0x8BCD, 0x8BCD, 0x1DEE, 0x8BCE, 0x8BEA, 0x06C8, 0x8BEB, 0x8BEB, 0x1DEF, + 0x8BEC, 0x8BF1, 0x06E6, 0x8BF2, 0x8BF2, 0x1DF0, 0x8BF3, 0x8BF8, 0x06ED, + 0x8BF9, 0x8BF9, 0x1DF1, 0x8BFA, 0x8BFA, 0x06F4, 0x8BFB, 0x8BFB, 0x1DF2, + 0x8BFC, 0x8BFC, 0x06F6, 0x8C40, 0x8C55, 0x06F7, 0x8C56, 0x8C56, 0x1DF4, + 0x8C57, 0x8C70, 0x070E, 0x8C71, 0x8C71, 0x1DF7, 0x8C72, 0x8C7E, 0x0729, + 0x8C80, 0x8C90, 0x0736, 0x8C91, 0x8C91, 0x1DFA, 0x8C92, 0x8C9C, 0x0748, + 0x8C9D, 0x8C9D, 0x1F21, 0x8C9E, 0x8C9E, 0x1DFC, 0x8C9F, 0x8CB1, 0x0755, + 0x8CB2, 0x8CB2, 0x1DFD, 0x8CB3, 0x8CBE, 0x0769, 0x8CBF, 0x8CBF, 0x1DFE, + 0x8CC0, 0x8CFC, 0x0776, 0x8D40, 0x8D49, 0x07B3, 0x8D4A, 0x8D4A, 0x1DFF, + 0x8D4B, 0x8D7E, 0x07BE, 0x8D80, 0x8D8C, 0x07F2, 0x8D8D, 0x8D8D, 0x1E02, + 0x8D8E, 0x8D93, 0x0800, 0x8D94, 0x8D94, 0x1E03, 0x8D95, 0x8D98, 0x0807, + 0x8D99, 0x8D99, 0x1E04, 0x8D9A, 0x8DD0, 0x080C, 0x8DD1, 0x8DD1, 0x1E05, + 0x8DD2, 0x8DE4, 0x0844, 0x8DE5, 0x8DE5, 0x1E06, 0x8DE6, 0x8DF1, 0x0858, + 0x8DF2, 0x8DF2, 0x1E07, 0x8DF3, 0x8DFC, 0x0865, 0x8E40, 0x8E45, 0x086F, + 0x8E46, 0x8E46, 0x1E08, 0x8E47, 0x8E48, 0x0876, 0x8E49, 0x8E49, 0x1E09, + 0x8E4A, 0x8E4A, 0x0879, 0x8E4B, 0x8E4B, 0x1E0A, 0x8E4C, 0x8E57, 0x087B, + 0x8E58, 0x8E58, 0x1E0B, 0x8E59, 0x8E5F, 0x0888, 0x8E60, 0x8E60, 0x1F22, + 0x8E61, 0x8E7E, 0x0890, 0x8E80, 0x8EC5, 0x08AE, 0x8EC6, 0x8EC6, 0x1E0D, + 0x8EC7, 0x8EDA, 0x08F5, 0x8EDB, 0x8EDC, 0x1E0F, 0x8EDD, 0x8EFC, 0x090B, + 0x8F40, 0x8F49, 0x092B, 0x8F4A, 0x8F4A, 0x1E11, 0x8F4B, 0x8F54, 0x0936, + 0x8F55, 0x8F55, 0x1E12, 0x8F56, 0x8F7E, 0x0941, 0x8F80, 0x8F8B, 0x096A, + 0x8F8C, 0x8F8C, 0x1E13, 0x8F8D, 0x8F91, 0x0977, 0x8F92, 0x8F93, 0x1E15, + 0x8F94, 0x8FA2, 0x097E, 0x8FA3, 0x8FA3, 0x1E17, 0x8FA4, 0x8FB0, 0x098E, + 0x8FB1, 0x8FB1, 0x1E18, 0x8FB2, 0x8FD2, 0x099C, 0x8FD3, 0x8FD3, 0x1E1A, + 0x8FD4, 0x8FDC, 0x09BE, 0x8FDD, 0x8FDD, 0x1E1B, 0x8FDE, 0x8FE1, 0x09C8, + 0x8FE2, 0x8FE2, 0x1E1C, 0x8FE3, 0x8FFC, 0x09CD, 0x9040, 0x9048, 0x09E7, + 0x9049, 0x9049, 0x1E1D, 0x904A, 0x9077, 0x09F1, 0x9078, 0x9078, 0x1F23, + 0x9079, 0x907E, 0x0A20, 0x9080, 0x9080, 0x1E1F, 0x9081, 0x909F, 0x0A27, + 0x90A0, 0x90A0, 0x1E21, 0x90A1, 0x90E3, 0x0A47, 0x90E4, 0x90E4, 0x1E23, + 0x90E5, 0x90EE, 0x0A8B, 0x90EF, 0x90EF, 0x1E24, 0x90F0, 0x90F6, 0x0A96, + 0x90F7, 0x90F7, 0x1E26, 0x90F8, 0x90F8, 0x1F24, 0x90F9, 0x90F9, 0x0A9F, + 0x90FA, 0x90FB, 0x1F25, 0x90FC, 0x90FC, 0x0AA2, 0x9140, 0x9145, 0x0AA3, + 0x9146, 0x9146, 0x1E28, 0x9147, 0x9157, 0x0AAA, 0x9158, 0x9158, 0x1E29, + 0x9159, 0x916A, 0x0ABC, 0x916B, 0x916B, 0x1E2A, 0x916C, 0x916D, 0x0ACF, + 0x916E, 0x916E, 0x1E2B, 0x916F, 0x917D, 0x0AD2, 0x917E, 0x917E, 0x1E2C, + 0x9180, 0x9188, 0x0AE2, 0x9189, 0x9189, 0x1E2D, 0x918A, 0x91B4, 0x0AEC, + 0x91B5, 0x91B5, 0x1F27, 0x91B6, 0x91BA, 0x0B18, 0x91BB, 0x91BB, 0x1E2E, + 0x91BC, 0x91CA, 0x0B1E, 0x91CB, 0x91CB, 0x1E2F, 0x91CC, 0x91D9, 0x0B2E, + 0x91DA, 0x91DA, 0x1E30, 0x91DB, 0x91E0, 0x0B3D, 0x91E1, 0x91E1, 0x1E31, + 0x91E2, 0x91EC, 0x0B44, 0x91ED, 0x91ED, 0x1E32, 0x91EE, 0x91FA, 0x0B50, + 0x91FB, 0x91FB, 0x1E35, 0x91FC, 0x91FC, 0x0B5E, 0x9240, 0x9245, 0x0B5F, + 0x9246, 0x9246, 0x1E36, 0x9247, 0x9247, 0x0B66, 0x9248, 0x9248, 0x1E37, + 0x9249, 0x924B, 0x0B68, 0x924C, 0x924D, 0x1E39, 0x924E, 0x925B, 0x0B6D, + 0x925C, 0x925C, 0x1E3B, 0x925D, 0x927E, 0x0B7C, 0x9280, 0x928F, 0x0B9E, + 0x9290, 0x9290, 0x1E3C, 0x9291, 0x9294, 0x0BAF, 0x9295, 0x9295, 0x1E3D, + 0x9296, 0x929B, 0x0BB4, 0x929C, 0x929C, 0x1E3E, 0x929D, 0x92BA, 0x0BBB, + 0x92BB, 0x92BB, 0x1E3F, 0x92BC, 0x92C5, 0x0BDA, 0x92C6, 0x92C6, 0x1E40, + 0x92C7, 0x92C7, 0x0BE5, 0x92C8, 0x92C8, 0x1E41, 0x92C9, 0x92CC, 0x0BE7, + 0x92CD, 0x92CD, 0x1E43, 0x92CE, 0x92FC, 0x0BEC, 0x9340, 0x9340, 0x0C1B, + 0x9341, 0x9341, 0x1E44, 0x9342, 0x9345, 0x0C1D, 0x9346, 0x9346, 0x1E45, + 0x9347, 0x934C, 0x0C22, 0x934D, 0x934D, 0x1E46, 0x934E, 0x9354, 0x0C29, + 0x9355, 0x9355, 0x1E47, 0x9356, 0x935D, 0x0C31, 0x935E, 0x935E, 0x1E48, + 0x935F, 0x9366, 0x0C3A, 0x9367, 0x9367, 0x1E49, 0x9368, 0x9369, 0x0C43, + 0x936A, 0x936A, 0x1E4A, 0x936B, 0x936F, 0x0C46, 0x9370, 0x9370, 0x1F28, + 0x9371, 0x9371, 0x1E4C, 0x9372, 0x937E, 0x0C4D, 0x9380, 0x9383, 0x0C5A, + 0x9384, 0x9384, 0x1E4D, 0x9385, 0x9397, 0x0C5F, 0x9398, 0x9398, 0x1E4E, + 0x9399, 0x93BF, 0x0C73, 0x93C0, 0x93C0, 0x1E50, 0x93C1, 0x93D1, 0x0C9B, + 0x93D2, 0x93D2, 0x1E51, 0x93D3, 0x93D8, 0x0CAD, 0x93D9, 0x93D9, 0x1E53, + 0x93DA, 0x93E3, 0x0CB4, 0x93E4, 0x93E5, 0x1E56, 0x93E6, 0x93E7, 0x0CC0, + 0x93E8, 0x93E8, 0x1E58, 0x93E9, 0x93F3, 0x0CC3, 0x93F4, 0x93F4, 0x1EC0, + 0x93F5, 0x93FC, 0x0CCF, 0x9440, 0x9447, 0x0CD7, 0x9448, 0x9448, 0x1E59, + 0x9449, 0x9449, 0x1F29, 0x944A, 0x9457, 0x0CE1, 0x9458, 0x9458, 0x1E5A, + 0x9459, 0x9475, 0x0CF0, 0x9476, 0x9476, 0x1E5B, 0x9477, 0x947E, 0x0D0E, + 0x9480, 0x9486, 0x0D16, 0x9487, 0x9487, 0x1E5C, 0x9488, 0x9488, 0x0D1E, + 0x9489, 0x9489, 0x1E5D, 0x948A, 0x948C, 0x0D20, 0x948D, 0x948D, 0x1E5E, + 0x948E, 0x94A1, 0x0D24, 0x94A2, 0x94A2, 0x1E5F, 0x94A3, 0x94AB, 0x0D39, + 0x94AC, 0x94AC, 0x1E60, 0x94AD, 0x94AD, 0x0D43, 0x94AE, 0x94AE, 0x1E61, + 0x94AF, 0x94BD, 0x0D45, 0x94BE, 0x94BE, 0x1F2A, 0x94BF, 0x94D1, 0x0D55, + 0x94D2, 0x94D2, 0x1E62, 0x94D3, 0x94F2, 0x0D69, 0x94F3, 0x94F3, 0x1E64, + 0x94F4, 0x94FC, 0x0D8A, 0x9540, 0x9540, 0x0D93, 0x9541, 0x9542, 0x1E65, + 0x9543, 0x954D, 0x0D96, 0x954E, 0x954E, 0x1E67, 0x954F, 0x9550, 0x0DA2, + 0x9551, 0x9551, 0x1E68, 0x9552, 0x9553, 0x0DA5, 0x9554, 0x9554, 0x1E69, + 0x9555, 0x955E, 0x0DA8, 0x955F, 0x955F, 0x1E6A, 0x9560, 0x956C, 0x0DB3, + 0x956D, 0x956D, 0x1E6B, 0x956E, 0x957E, 0x0DC1, 0x9580, 0x95C0, 0x0DD2, + 0x95C1, 0x95C1, 0x1E6D, 0x95C2, 0x95CA, 0x0E14, 0x95CB, 0x95CB, 0x1E6E, + 0x95CC, 0x95D0, 0x0E1E, 0x95D1, 0x95D1, 0x1F2B, 0x95D2, 0x95D7, 0x0E24, + 0x95D8, 0x95D8, 0x1E6F, 0x95D9, 0x95F6, 0x0E2B, 0x95F7, 0x95F7, 0x1E70, + 0x95F8, 0x95FC, 0x0E4A, 0x9640, 0x9647, 0x0E4F, 0x9648, 0x9648, 0x1E72, + 0x9649, 0x9669, 0x0E58, 0x966A, 0x966A, 0x1E73, 0x966B, 0x967E, 0x0E7A, + 0x9680, 0x968F, 0x0E8E, 0x9690, 0x9690, 0x1E74, 0x9691, 0x9697, 0x0E9F, + 0x9698, 0x9698, 0x1F2C, 0x9699, 0x96CA, 0x0EA7, 0x96CB, 0x96CB, 0x1E75, + 0x96CC, 0x96D6, 0x0EDA, 0x96D7, 0x96D7, 0x1E76, 0x96D8, 0x96DC, 0x0EE6, + 0x96DD, 0x96DD, 0x1E77, 0x96DE, 0x96DF, 0x0EEC, 0x96E0, 0x96E0, 0x1E78, + 0x96E1, 0x96F7, 0x0EEF, 0x96F8, 0x96F8, 0x1E79, 0x96F9, 0x96F9, 0x0F07, + 0x96FA, 0x96FA, 0x1E7A, 0x96FB, 0x96FC, 0x0F09, 0x9740, 0x9750, 0x0F0B, + 0x9751, 0x9751, 0x1E7C, 0x9752, 0x976E, 0x0F1D, 0x976F, 0x976F, 0x1E7D, + 0x9770, 0x9772, 0x0F3B, 0x9773, 0x9773, 0x1E7E, 0x9774, 0x977E, 0x0F3F, + 0x9780, 0x9788, 0x0F4A, 0x9789, 0x9789, 0x1E7F, 0x978A, 0x97F7, 0x0F54, + 0x97F8, 0x97F9, 0x1E81, 0x97FA, 0x97FA, 0x1F2D, 0x97FB, 0x97FC, 0x0FC5, + 0x9840, 0x9840, 0x1E83, 0x9841, 0x984F, 0x0FC8, 0x9850, 0x9850, 0x1E84, + 0x9851, 0x9857, 0x0FD8, 0x9858, 0x9858, 0x1E85, 0x9859, 0x9872, 0x0FE0, + 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x9940, 0x1058, 0x9941, 0x9941, 0x1F2E, + 0x9942, 0x995B, 0x105A, 0x995C, 0x995C, 0x1E86, 0x995D, 0x996B, 0x1075, + 0x996C, 0x996C, 0x1E89, 0x996D, 0x997E, 0x1085, 0x9980, 0x99B5, 0x1097, + 0x99B6, 0x99B6, 0x1F2F, 0x99B7, 0x99FC, 0x10CE, 0x9A40, 0x9A4E, 0x1114, + 0x9A4F, 0x9A4F, 0x1E8A, 0x9A50, 0x9A58, 0x1124, 0x9A59, 0x9A59, 0x1E8B, + 0x9A5A, 0x9A66, 0x112E, 0x9A67, 0x9A67, 0x1F30, 0x9A68, 0x9A7C, 0x113C, + 0x9A7D, 0x9A7D, 0x1E8D, 0x9A7E, 0x9A7E, 0x1152, 0x9A80, 0x9A8A, 0x1153, + 0x9A8B, 0x9A8B, 0x1E8E, 0x9A8C, 0x9A8C, 0x1F31, 0x9A8D, 0x9AC1, 0x1160, + 0x9AC2, 0x9AC2, 0x1E8F, 0x9AC3, 0x9AC3, 0x1F32, 0x9AC4, 0x9AE9, 0x1197, + 0x9AEA, 0x9AEA, 0x1F33, 0x9AEB, 0x9AFC, 0x11BE, 0x9B40, 0x9B5B, 0x11D0, + 0x9B5C, 0x9B5C, 0x1E90, 0x9B5D, 0x9B7E, 0x11ED, 0x9B80, 0x9B82, 0x120F, + 0x9B83, 0x9B83, 0x1E91, 0x9B84, 0x9B97, 0x1213, 0x9B98, 0x9B98, 0x1F34, + 0x9B99, 0x9B9F, 0x1228, 0x9BA0, 0x9BA0, 0x1E92, 0x9BA1, 0x9BFA, 0x1230, + 0x9BFB, 0x9BFC, 0x1F35, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CA1, 0x12CB, + 0x9CA2, 0x9CA2, 0x1E94, 0x9CA3, 0x9CFC, 0x12EE, 0x9D40, 0x9D46, 0x1348, + 0x9D47, 0x9D47, 0x1F37, 0x9D48, 0x9D7E, 0x1350, 0x9D80, 0x9D80, 0x1E95, + 0x9D81, 0x9D8B, 0x1388, 0x9D8C, 0x9D8C, 0x1E96, 0x9D8D, 0x9DB6, 0x1394, + 0x9DB7, 0x9DB7, 0x1E97, 0x9DB8, 0x9DF7, 0x13BF, 0x9DF8, 0x9DF8, 0x1F38, + 0x9DF9, 0x9DFC, 0x1400, 0x9E40, 0x9E63, 0x1404, 0x9E64, 0x9E64, 0x1E99, + 0x9E65, 0x9E7E, 0x1429, 0x9E80, 0x9E8A, 0x1443, 0x9E8B, 0x9E8B, 0x1E9B, + 0x9E8C, 0x9EFC, 0x144F, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9F80, 0x14FF, + 0x9F81, 0x9F81, 0x1F39, 0x9F82, 0x9FCD, 0x1501, 0x9FCE, 0x9FCE, 0x1E9D, + 0x9FCF, 0x9FD3, 0x154E, 0x9FD4, 0x9FD4, 0x1F3A, 0x9FD5, 0x9FF3, 0x1554, + 0x9FF4, 0x9FF4, 0x1F3B, 0x9FF5, 0x9FFC, 0x1574, 0xE040, 0xE07E, 0x157C, + 0xE080, 0xE092, 0x15BB, 0xE093, 0xE093, 0x1E9E, 0xE094, 0xE0A3, 0x15CF, + 0xE0A4, 0xE0A4, 0x1E9F, 0xE0A5, 0xE0DC, 0x15E0, 0xE0DD, 0xE0DD, 0x1EA0, + 0xE0DE, 0xE0FC, 0x1619, 0xE140, 0xE149, 0x1638, 0xE14A, 0xE14A, 0x1EA1, + 0xE14B, 0xE17E, 0x1643, 0xE180, 0xE1EC, 0x1677, 0xE1ED, 0xE1ED, 0x1EA5, + 0xE1EE, 0xE1FC, 0x16E5, 0xE240, 0xE268, 0x16F4, 0xE269, 0xE269, 0x1EA6, + 0xE26A, 0xE272, 0x171E, 0xE273, 0xE273, 0x1EA7, 0xE274, 0xE277, 0x1728, + 0xE278, 0xE278, 0x1F3C, 0xE279, 0xE27E, 0x172D, 0xE280, 0xE2B6, 0x1733, + 0xE2B7, 0xE2B7, 0x1EA8, 0xE2B8, 0xE2BD, 0x176B, 0xE2BE, 0xE2BE, 0x1F3D, + 0xE2BF, 0xE2E1, 0x1772, 0xE2E2, 0xE2E2, 0x1EA9, 0xE2E3, 0xE2EB, 0x1796, + 0xE2EC, 0xE2EC, 0x1EAA, 0xE2ED, 0xE2FC, 0x17A0, 0xE340, 0xE357, 0x17B0, + 0xE358, 0xE358, 0x1EAB, 0xE359, 0xE359, 0x17C9, 0xE35A, 0xE35A, 0x1EAC, + 0xE35B, 0xE364, 0x17CB, 0xE365, 0xE365, 0x1EAD, 0xE366, 0xE37E, 0x17D6, + 0xE380, 0xE3C6, 0x17EF, 0xE3C7, 0xE3C7, 0x1F3E, 0xE3C8, 0xE3FC, 0x1837, + 0xE440, 0xE47E, 0x186C, 0xE480, 0xE483, 0x18AB, 0xE484, 0xE484, 0x1EAF, + 0xE485, 0xE488, 0x18B0, 0xE489, 0xE489, 0x1EB0, 0xE48A, 0xE491, 0x18B5, + 0xE492, 0xE492, 0x1EB1, 0xE493, 0xE4B8, 0x18BE, 0xE4B9, 0xE4B9, 0x1EB3, + 0xE4BA, 0xE4CA, 0x18E5, 0xE4CB, 0xE4CB, 0x1F3F, 0xE4CC, 0xE4FC, 0x18F7, + 0xE540, 0xE57E, 0x1928, 0xE580, 0xE59D, 0x1967, 0xE59E, 0xE59E, 0x1F40, + 0xE59F, 0xE5B9, 0x1986, 0xE5BA, 0xE5BB, 0x1F41, 0xE5BC, 0xE5EC, 0x19A3, + 0xE5ED, 0xE5ED, 0x1EB8, 0xE5EE, 0xE5FC, 0x19D5, 0xE640, 0xE650, 0x19E4, + 0xE651, 0xE651, 0x1EB9, 0xE652, 0xE67E, 0x19F6, 0xE680, 0xE685, 0x1A23, + 0xE686, 0xE686, 0x1EBA, 0xE687, 0xE6E6, 0x1A2A, 0xE6E7, 0xE6E7, 0x1EBC, + 0xE6E8, 0xE6FC, 0x1A8B, 0xE740, 0xE76C, 0x1AA0, 0xE76D, 0xE76D, 0x1EBE, + 0xE76E, 0xE77E, 0x1ACE, 0xE780, 0xE7A6, 0x1ADF, 0xE7A7, 0xE7A7, 0x1EC1, + 0xE7A8, 0xE7BA, 0x1B07, 0xE7BB, 0xE7BB, 0x1EC2, 0xE7BC, 0xE7FC, 0x1B1B, + 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8CE, 0x1B9B, 0xE8CF, 0xE8CF, 0x1EC7, + 0xE8D0, 0xE8FC, 0x1BEB, 0xE940, 0xE977, 0x1C18, 0xE978, 0xE978, 0x1F43, + 0xE979, 0xE97E, 0x1C51, 0xE980, 0xE9AA, 0x1C57, 0xE9AB, 0xE9AB, 0x1ECA, + 0xE9AC, 0xE9B9, 0x1C83, 0xE9BA, 0xE9BA, 0x1ECB, 0xE9BB, 0xE9CB, 0x1C92, + 0xE9CC, 0xE9CC, 0x1ECC, 0xE9CD, 0xE9FC, 0x1CA4, 0xEA40, 0xEA6F, 0x1CD4, + 0xEA70, 0xEA70, 0x1ECD, 0xEA71, 0xEA71, 0x1F44, 0xEA72, 0xEA7E, 0x1D06, + 0xEA80, 0xEA9C, 0x1D13, 0xEA9D, 0xEA9D, 0x1ECE, 0xEA9E, 0xEAA2, 0x1D31, + 0xEAA3, 0xEAA4, 0x205C, 0xEC40, 0xEC42, 0x1F45, 0xEC46, 0xEC46, 0x1F48, + 0xEC47, 0xEC47, 0x0300, 0xEC48, 0xEC48, 0x02FA, 0xEC49, 0xEC49, 0x02F9, + 0xEC4D, 0xEC57, 0x1F49, 0xEC5B, 0xEC5D, 0x1DB1, 0xEC5E, 0xEC5E, 0x1F54, + 0xEC5F, 0xEC5F, 0x1DB7, 0xEC60, 0xEC62, 0x1F55, 0xEC63, 0xEC65, 0x1DB4, + 0xEC66, 0xEC6F, 0x1F58, 0xEC70, 0xEC70, 0x0303, 0xEC71, 0xEC71, 0x1F62, + 0xEC72, 0xEC72, 0x0304, 0xEC73, 0xEC74, 0x1F63, 0xEC76, 0xEC76, 0x1F65, + 0xEC78, 0xEC78, 0x1DA4, 0xEC79, 0xEC79, 0x1DA1, 0xEC7A, 0xEC7A, 0x1F66, + 0xEC7B, 0xEC7B, 0x1DA2, 0xEC7C, 0xEC7E, 0x1F67, 0xEC80, 0xEC80, 0x1DA6, + 0xEC81, 0xEC81, 0x1F6A, 0xEC82, 0xEC82, 0x1DA8, 0xEC83, 0xEC83, 0x1DAC, + 0xEC84, 0xEC84, 0x1F6B, 0xEC85, 0xEC85, 0x1DAE, 0xEC86, 0xEC86, 0x1DAB, + 0xEC87, 0xEC88, 0x1F6C, 0xEC89, 0xEC89, 0x1DAF, 0xEC8A, 0xEC90, 0x1F6E, + 0xEC94, 0xEC99, 0x1F75, 0xEC9A, 0xEC9A, 0x1DBA, 0xEC9B, 0xEC9B, 0x1F7B, + 0xEC9E, 0xEC9E, 0x1F7C, 0xECA7, 0xECB0, 0x1F7D, 0xECB2, 0xECC5, 0x1F87, + 0xECC7, 0xECDA, 0x1D83, 0xECDB, 0xECDB, 0x1F9B, 0xECDC, 0xECE5, 0x1D97, + 0xECE9, 0xECFC, 0x1F9C, 0xED40, 0xED59, 0x1FB0, 0xED64, 0xED64, 0x1F16, + 0xED68, 0xED69, 0x1FCA, 0xED6A, 0xED6A, 0x1DC4, 0xED6B, 0xED6D, 0x1FCC, + 0xED6E, 0xED6E, 0x1DC3, 0xED6F, 0xED73, 0x1FCF, 0xED74, 0xED74, 0x1DC2, + 0xED75, 0xED78, 0x1FD4, 0xED7C, 0xED7E, 0x1FD8, 0xED80, 0xED8A, 0x1FDB, + 0xED8F, 0xED9E, 0x1FE6, 0xEF40, 0xEF41, 0x1ECF, 0xEF42, 0xEF42, 0x204C, + 0xEF43, 0xEF43, 0x2052, 0xEF44, 0xEF4D, 0x1ED1, 0xEF4E, 0xEF4E, 0x205A, + 0xEF4F, 0xEF4F, 0x2053, 0xEF50, 0xEF50, 0x2058, 0xEF51, 0xEF51, 0x2055, + 0xEF52, 0xEF63, 0x1EDB, 0xEF64, 0xEF79, 0x1EEE, 0xEF7A, 0xEF7B, 0x2048, + 0xEF8D, 0xEF90, 0x02E0, 0xEF91, 0xEF94, 0x1FF6, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Add-RKSJ-V_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Add-RKSJ-V_1.cpp new file mode 100644 index 000000000000..47be9311e7e4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Add-RKSJ-V_1.cpp @@ -0,0 +1,29 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_Add_RKSJ_V_1[57 * 3] = { + 0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052, + 0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6, + 0x8165, 0x8165, 0x205A, 0x8166, 0x8166, 0x2053, 0x8167, 0x8167, 0x2058, + 0x8168, 0x8168, 0x2055, 0x8169, 0x817A, 0x1EDB, 0x829F, 0x829F, 0x1EEE, + 0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0, 0x82A5, 0x82A5, 0x1EF1, + 0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3, 0x82E1, 0x82E1, 0x1EF4, + 0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6, 0x82EC, 0x82EC, 0x1EF7, + 0x82F3, 0x82F4, 0x2048, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9, + 0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC, + 0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF, + 0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02, + 0xEC78, 0xEC78, 0x1F07, 0xEC79, 0xEC79, 0x1F04, 0xEC7A, 0xEC7A, 0x2089, + 0xEC7B, 0xEC7B, 0x1F05, 0xEC7C, 0xEC7C, 0x208A, 0xEC7D, 0xEC7E, 0x2093, + 0xEC80, 0xEC80, 0x1F09, 0xEC81, 0xEC81, 0x2092, 0xEC82, 0xEC82, 0x1F0B, + 0xEC83, 0xEC83, 0x1F0F, 0xEC84, 0xEC84, 0x209C, 0xEC85, 0xEC85, 0x1F11, + 0xEC86, 0xEC86, 0x1F0E, 0xEC87, 0xEC87, 0x2098, 0xEC88, 0xEC88, 0x209B, + 0xEC89, 0xEC89, 0x1F12, 0xEC8A, 0xEC8A, 0x2097, 0xEC8B, 0xEC8C, 0x209D, + 0xEC8D, 0xEC8D, 0x20A6, 0xEC8E, 0xEC8E, 0x20A5, 0xEC8F, 0xEC8F, 0x20A1, + 0xEC90, 0xEC90, 0x20A4, 0xEC95, 0xEC95, 0x2084, 0xEF92, 0xEF92, 0x208D, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp new file mode 100644 index 000000000000..fbef3f140532 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp @@ -0,0 +1,1726 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_Japan1CID2Unicode_4[15444] = { + 0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, + 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, + 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, + 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, + 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, + 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, + 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, + 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC, 0x005C, 0x02BB, + 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3, 0x2044, 0x0192, 0x00A7, 0x00A4, + 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01, 0xFB02, 0x2012, 0x2020, 0x2021, + 0x00B7, 0x00B6, 0x2022, 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, + 0x00BF, 0x0301, 0x0302, 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, + 0x030B, 0x0328, 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152, + 0x00BA, 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D, 0x00A9, + 0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9, 0x00BC, + 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, + 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D9, 0x00DA, + 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, + 0x00E5, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, + 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160, 0x0178, + 0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x0020, 0x0021, 0x0022, + 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, + 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, + 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, + 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, + 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, + 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, + 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, + 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, + 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, + 0x007D, 0x203E, 0xFF60, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, + 0xFF67, 0xFF68, 0xFF69, 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, + 0xFF70, 0xFF71, 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, + 0xFF79, 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81, + 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0xFF8A, + 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91, 0xFF92, 0xFF93, + 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, + 0xFF9D, 0xFF9E, 0xFF9F, 0xFF40, 0x30F0, 0x30F1, 0x30EE, 0x30AB, 0x30B1, + 0x30F4, 0x30AC, 0x30AE, 0x30B0, 0x30B2, 0x30B4, 0x30B6, 0x30B8, 0x30BA, + 0x30BC, 0x30BE, 0x30C0, 0x30C2, 0x30C5, 0x30C7, 0x30C9, 0x30D0, 0x30D1, + 0x30D3, 0x30D4, 0x30D6, 0x30D7, 0x30D9, 0x30DA, 0x30DC, 0x30DD, 0xFF60, + 0x301D, 0x301E, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, + 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, + 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, + 0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, + 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, + 0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, + 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, + 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, + 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0x2032, 0x00A8, 0x2036, + 0x005B, 0x005D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300E, 0x300F, 0x3010, + 0x3011, 0x2012, 0xFF60, 0x3092, 0x3041, 0x3043, 0x3045, 0x3047, 0x3049, + 0x3083, 0x3085, 0x3087, 0x3063, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, + 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, + 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, + 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, + 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, + 0x308C, 0x308D, 0x308F, 0x3093, 0x3090, 0x3091, 0x308E, 0x304C, 0x304E, + 0x3050, 0x3052, 0x3054, 0x3056, 0x3068, 0x305A, 0x305C, 0x305E, 0x3060, + 0x3062, 0x3065, 0x3067, 0x3069, 0x3070, 0x3071, 0x3073, 0x3074, 0x3076, + 0x3077, 0x3079, 0x307A, 0x307C, 0x307D, 0x00C4, 0x00F9, 0x00E9, 0x00ED, + 0x00DF, 0x00E7, 0x00C7, 0x00D1, 0x00F1, 0x00A2, 0x00A3, 0x00F3, 0x00FA, + 0x00A1, 0x00BF, 0x00BD, 0x00D6, 0x00DC, 0x00E4, 0x00EB, 0x00EF, 0x00F6, + 0x00DC, 0x00E2, 0x00EA, 0x00EE, 0x00F4, 0x00FC, 0x00E0, 0x00E9, 0x25B2, + 0x00E1, 0x007E, 0x0030, 0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, + 0xFF1A, 0xFF1B, 0xFF1F, 0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8, + 0xFF3E, 0x203E, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003, 0x4EDD, + 0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F, 0xFF3C, 0xFF5E, + 0x2016, 0xFF5C, 0x2026, 0x2025, 0x2018, 0x2019, 0x201C, 0x201D, 0xFF08, + 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D, 0xFF5B, 0xFF5D, 0x3008, 0x3009, + 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0xFF0B, + 0xFF0D, 0x00B1, 0x00D7, 0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, + 0x2267, 0x221E, 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, + 0xFFE5, 0xFF04, 0x00A2, 0x00A3, 0xFF05, 0xFF03, 0xFF06, 0xFF0A, 0xFF20, + 0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, + 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x203B, 0x3012, 0x2192, 0x2190, + 0x2191, 0x2193, 0x3013, 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, + 0x222A, 0x2229, 0x2227, 0x2228, 0x00AC, 0x21D2, 0x21D4, 0x2200, 0x2203, + 0x2220, 0x22A5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x226A, 0x226B, + 0x221A, 0x223D, 0x221D, 0x2235, 0x222B, 0x222C, 0x212B, 0x2030, 0x266F, + 0x266D, 0x266A, 0x2020, 0x2021, 0x00B6, 0x25EF, 0xFF10, 0xFF11, 0xFF12, + 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF21, 0xFF22, + 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, + 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, + 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF41, 0xFF42, 0xFF43, + 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, + 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, + 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0x3041, 0x3042, 0x3043, 0x3044, + 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, + 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, + 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, + 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, + 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, + 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, + 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, + 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, + 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2, + 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, + 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, + 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, + 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, + 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, + 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, + 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, + 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, + 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, + 0x30F4, 0x30F5, 0x30F6, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, + 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, + 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, + 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, + 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x0410, 0x0411, 0x0412, + 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, + 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, + 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, + 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, + 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, + 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, + 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x4E9C, 0x5516, 0x5A03, 0x963F, 0x54C0, 0x611B, 0x6328, 0x59F6, 0x9022, + 0x8475, 0x831C, 0x7A50, 0x60AA, 0x63E1, 0x6E25, 0x65ED, 0x8466, 0x82A6, + 0x9BF5, 0x6893, 0x5727, 0x65A1, 0x6271, 0x5B9B, 0x59D0, 0x867B, 0x98F4, + 0x7D62, 0x7DBE, 0x9B8E, 0x6216, 0x7C9F, 0x88B7, 0x5B89, 0x5EB5, 0x6309, + 0x6697, 0x6848, 0x95C7, 0x978D, 0x674F, 0x4EE5, 0x4F0A, 0x4F4D, 0x4F9D, + 0x5049, 0x56F2, 0x5937, 0x59D4, 0x5A01, 0x5C09, 0x60DF, 0x610F, 0x6170, + 0x6613, 0x6905, 0x70BA, 0x754F, 0x7570, 0x79FB, 0x7DAD, 0x7DEF, 0x80C3, + 0x840E, 0x8863, 0x8B02, 0x9055, 0x907A, 0x533B, 0x4E95, 0x4EA5, 0x57DF, + 0x80B2, 0x90C1, 0x78EF, 0x4E00, 0x58F1, 0x6EA2, 0x9038, 0x7A32, 0x8328, + 0x828B, 0x9C2F, 0x5141, 0x5370, 0x54BD, 0x54E1, 0x56E0, 0x59FB, 0x5F15, + 0x98F2, 0x6DEB, 0x80E4, 0x852D, 0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B, + 0x53F3, 0x5B87, 0x70CF, 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 0x9D5C, 0x7ABA, + 0x4E11, 0x7893, 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D, 0x851A, 0x9C3B, + 0x59E5, 0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642, 0x4E91, 0x904B, 0x96F2, + 0x834F, 0x990C, 0x53E1, 0x55B6, 0x5B30, 0x5F71, 0x6620, 0x66F3, 0x6804, + 0x6C38, 0x6CF3, 0x6D29, 0x745B, 0x76C8, 0x7A4E, 0x9834, 0x82F1, 0x885B, + 0x8A60, 0x92ED, 0x6DB2, 0x75AB, 0x76CA, 0x99C5, 0x60A6, 0x8B01, 0x8D8A, + 0x95B2, 0x698E, 0x53AD, 0x5186, 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, + 0x6028, 0x63A9, 0x63F4, 0x6CBF, 0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5, + 0x733F, 0x7E01, 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 0x9D1B, 0x5869, + 0x65BC, 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80, 0x5FDC, 0x62BC, + 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1, 0x8956, 0x9D2C, 0x9D0E, + 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x61B6, 0x81C6, 0x6876, + 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x6069, 0x6E29, 0x7A4F, 0x97F3, 0x4E0B, + 0x5316, 0x4EEE, 0x4F55, 0x4F3D, 0x4FA1, 0x4F73, 0x52A0, 0x53EF, 0x5609, + 0x590F, 0x5AC1, 0x5BB6, 0x5BE1, 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, + 0x6CB3, 0x706B, 0x73C2, 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB, + 0x8304, 0x8377, 0x83EF, 0x83D3, 0x8766, 0x8AB2, 0x5629, 0x8CA8, 0x8FE6, + 0x904E, 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259, 0x753B, 0x81E5, + 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5, 0x4ECB, 0x4F1A, 0x89E3, + 0x56DE, 0x584A, 0x58CA, 0x5EFB, 0x5FEB, 0x602A, 0x6094, 0x6062, 0x61D0, + 0x6212, 0x62D0, 0x6539, 0x9B41, 0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, + 0x7686, 0x7D75, 0x82A5, 0x87F9, 0x958B, 0x968E, 0x8C9D, 0x51F1, 0x52BE, + 0x5916, 0x54B3, 0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D, 0x84CB, + 0x8857, 0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9, 0x57A3, 0x67FF, + 0x86CE, 0x920E, 0x5283, 0x5687, 0x5404, 0x5ED3, 0x62E1, 0x64B9, 0x683C, + 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B, 0x899A, 0x89D2, 0x8D6B, 0x8F03, + 0x90ED, 0x95A3, 0x9694, 0x9769, 0x5B66, 0x5CB3, 0x697D, 0x984D, 0x984E, + 0x639B, 0x7B20, 0x6A2B, 0x6A7F, 0x68B6, 0x9C0D, 0x6F5F, 0x5272, 0x559D, + 0x6070, 0x62EC, 0x6D3B, 0x6E07, 0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, + 0x9C39, 0x53F6, 0x691B, 0x6A3A, 0x9784, 0x682A, 0x515C, 0x7AC3, 0x84B2, + 0x91DC, 0x938C, 0x565B, 0x9D28, 0x6822, 0x8305, 0x8431, 0x7CA5, 0x5208, + 0x82C5, 0x74E6, 0x4E7E, 0x4F83, 0x51A0, 0x5BD2, 0x520A, 0x52D8, 0x52E7, + 0x5DFB, 0x559A, 0x582A, 0x59E6, 0x5B8C, 0x5B98, 0x5BDB, 0x5E72, 0x5E79, + 0x60A3, 0x611F, 0x6163, 0x61BE, 0x63DB, 0x6562, 0x67D1, 0x6853, 0x68FA, + 0x6B3E, 0x6B53, 0x6C57, 0x6F22, 0x6F97, 0x6F45, 0x74B0, 0x7518, 0x76E3, + 0x770B, 0x7AFF, 0x7BA1, 0x7C21, 0x7DE9, 0x7F36, 0x7FF0, 0x809D, 0x8266, + 0x839E, 0x89B3, 0x8ACC, 0x8CAB, 0x9084, 0x9451, 0x9593, 0x9591, 0x95A2, + 0x9665, 0x97D3, 0x9928, 0x8218, 0x4E38, 0x542B, 0x5CB8, 0x5DCC, 0x73A9, + 0x764C, 0x773C, 0x5CA9, 0x7FEB, 0x8D0B, 0x96C1, 0x9811, 0x9854, 0x9858, + 0x4F01, 0x4F0E, 0x5371, 0x559C, 0x5668, 0x57FA, 0x5947, 0x5B09, 0x5BC4, + 0x5C90, 0x5E0C, 0x5E7E, 0x5FCC, 0x63EE, 0x673A, 0x65D7, 0x65E2, 0x671F, + 0x68CB, 0x68C4, 0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D, 0x757F, 0x7948, + 0x5B63, 0x7A00, 0x7D00, 0x5FBD, 0x898F, 0x8A18, 0x8CB4, 0x8D77, 0x8ECC, + 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80, 0x507D, 0x5100, 0x5993, 0x5B9C, + 0x622F, 0x6280, 0x64EC, 0x6B3A, 0x72A0, 0x7591, 0x7947, 0x7FA9, 0x87FB, + 0x8ABC, 0x8B70, 0x63AC, 0x83CA, 0x97A0, 0x5409, 0x5403, 0x55AB, 0x6854, + 0x6A58, 0x8A70, 0x7827, 0x6775, 0x9ECD, 0x5374, 0x5BA2, 0x811A, 0x8650, + 0x9006, 0x4E18, 0x4E45, 0x4EC7, 0x4F11, 0x53CA, 0x5438, 0x5BAE, 0x5F13, + 0x6025, 0x6551, 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403, 0x7A76, + 0x7AAE, 0x7B08, 0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B, 0x53BB, 0x5C45, + 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 0x865A, 0x8A31, 0x8DDD, 0x92F8, + 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB, 0x4EAC, 0x4F9B, 0x4FA0, 0x50D1, + 0x5147, 0x7AF6, 0x5171, 0x51F6, 0x5354, 0x5321, 0x537F, 0x53EB, 0x55AC, + 0x5883, 0x5CE1, 0x5F37, 0x5F4A, 0x602F, 0x6050, 0x606D, 0x631F, 0x6559, + 0x6A4B, 0x6CC1, 0x72C2, 0x72ED, 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, + 0x90F7, 0x93E1, 0x97FF, 0x9957, 0x9A5A, 0x4EF0, 0x51DD, 0x5C2D, 0x6681, + 0x696D, 0x5C40, 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5, 0x52E4, + 0x5747, 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434, 0x7981, 0x79BD, + 0x7B4B, 0x7DCA, 0x82B9, 0x83CC, 0x887F, 0x895F, 0x8B39, 0x8FD1, 0x91D1, + 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5, 0x533A, 0x72D7, 0x7396, 0x77E9, + 0x82E6, 0x8EAF, 0x99C6, 0x99C8, 0x99D2, 0x5177, 0x611A, 0x865E, 0x55B0, + 0x7A7A, 0x5076, 0x5BD3, 0x9047, 0x9685, 0x4E32, 0x6ADB, 0x91E7, 0x5C51, + 0x5C48, 0x6398, 0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A, 0x9688, + 0x7C82, 0x6817, 0x7E70, 0x6851, 0x936C, 0x52F2, 0x541B, 0x85AB, 0x8A13, + 0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941, 0x4FC2, 0x50BE, 0x5211, + 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B, 0x5951, 0x5F62, 0x5F84, 0x6075, + 0x6176, 0x6167, 0x61A9, 0x63B2, 0x643A, 0x656C, 0x666F, 0x6842, 0x6E13, + 0x7566, 0x7A3D, 0x7CFB, 0x7D4C, 0x7D99, 0x7E4B, 0x7F6B, 0x830E, 0x834A, + 0x86CD, 0x8A08, 0x8A63, 0x8B66, 0x8EFD, 0x981A, 0x9D8F, 0x82B8, 0x8FCE, + 0x9BE8, 0x5287, 0x621F, 0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20, + 0x6C7A, 0x6F54, 0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6, 0x5039, + 0x5026, 0x5065, 0x517C, 0x5238, 0x5263, 0x55A7, 0x570F, 0x5805, 0x5ACC, + 0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372, 0x691C, 0x6A29, 0x727D, 0x72AC, + 0x732E, 0x7814, 0x786F, 0x7D79, 0x770C, 0x80A9, 0x898B, 0x8B19, 0x8CE2, + 0x8ED2, 0x9063, 0x9375, 0x967A, 0x9855, 0x9A13, 0x9E78, 0x5143, 0x539F, + 0x53B3, 0x5E7B, 0x5F26, 0x6E1B, 0x6E90, 0x7384, 0x73FE, 0x7D43, 0x8237, + 0x8A00, 0x8AFA, 0x9650, 0x4E4E, 0x500B, 0x53E4, 0x547C, 0x56FA, 0x59D1, + 0x5B64, 0x5DF1, 0x5EAB, 0x5F27, 0x6238, 0x6545, 0x67AF, 0x6E56, 0x72D0, + 0x7CCA, 0x88B4, 0x80A1, 0x80E1, 0x83F0, 0x864E, 0x8A87, 0x8DE8, 0x9237, + 0x96C7, 0x9867, 0x9F13, 0x4E94, 0x4E92, 0x4F0D, 0x5348, 0x5449, 0x543E, + 0x5A2F, 0x5F8C, 0x5FA1, 0x609F, 0x68A7, 0x6A8E, 0x745A, 0x7881, 0x8A9E, + 0x8AA4, 0x8B77, 0x9190, 0x4E5E, 0x9BC9, 0x4EA4, 0x4F7C, 0x4FAF, 0x5019, + 0x5016, 0x5149, 0x516C, 0x529F, 0x52B9, 0x52FE, 0x539A, 0x53E3, 0x5411, + 0x540E, 0x5589, 0x5751, 0x57A2, 0x597D, 0x5B54, 0x5B5D, 0x5B8F, 0x5DE5, + 0x5DE7, 0x5DF7, 0x5E78, 0x5E83, 0x5E9A, 0x5EB7, 0x5F18, 0x6052, 0x614C, + 0x6297, 0x62D8, 0x63A7, 0x653B, 0x6602, 0x6643, 0x66F4, 0x676D, 0x6821, + 0x6897, 0x69CB, 0x6C5F, 0x6D2A, 0x6D69, 0x6E2F, 0x6E9D, 0x7532, 0x7687, + 0x786C, 0x7A3F, 0x7CE0, 0x7D05, 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003, + 0x80AF, 0x80B1, 0x8154, 0x818F, 0x822A, 0x8352, 0x884C, 0x8861, 0x8B1B, + 0x8CA2, 0x8CFC, 0x90CA, 0x9175, 0x9271, 0x783F, 0x92FC, 0x95A4, 0x964D, + 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB, 0x53F7, 0x5408, 0x58D5, + 0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9, 0x514B, 0x523B, 0x544A, 0x56FD, + 0x7A40, 0x9177, 0x9D60, 0x9ED2, 0x7344, 0x6F09, 0x8170, 0x7511, 0x5FFD, + 0x60DA, 0x9AA8, 0x72DB, 0x8FBC, 0x6B64, 0x9803, 0x4ECA, 0x56F0, 0x5764, + 0x58BE, 0x5A5A, 0x6068, 0x61C7, 0x660F, 0x6606, 0x6839, 0x68B1, 0x6DF7, + 0x75D5, 0x7D3A, 0x826E, 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F, + 0x5DE6, 0x5DEE, 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396, 0x88DF, + 0x5750, 0x5EA7, 0x632B, 0x50B5, 0x50AC, 0x518D, 0x6700, 0x54C9, 0x585E, + 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D, 0x6B73, 0x6E08, 0x707D, + 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D, 0x658E, 0x7D30, 0x83DC, 0x88C1, + 0x8F09, 0x969B, 0x5264, 0x5728, 0x6750, 0x7F6A, 0x8CA1, 0x51B4, 0x5742, + 0x962A, 0x583A, 0x698A, 0x80B4, 0x54B2, 0x5D0E, 0x57FC, 0x7895, 0x9DFA, + 0x4F5C, 0x524A, 0x548B, 0x643E, 0x6628, 0x6714, 0x67F5, 0x7A84, 0x7B56, + 0x7D22, 0x932F, 0x685C, 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237, 0x5BDF, + 0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9, 0x96D1, 0x7690, 0x9BD6, + 0x634C, 0x9306, 0x9BAB, 0x76BF, 0x6652, 0x4E09, 0x5098, 0x53C2, 0x5C71, + 0x60E8, 0x6492, 0x6563, 0x685F, 0x71E6, 0x73CA, 0x7523, 0x7B97, 0x7E82, + 0x8695, 0x8B83, 0x8CDB, 0x9178, 0x9910, 0x65AC, 0x66AB, 0x6B8B, 0x4ED5, + 0x4ED4, 0x4F3A, 0x4F7F, 0x523A, 0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, + 0x59CB, 0x59C9, 0x59FF, 0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D, + 0x6307, 0x652F, 0x5B5C, 0x65AF, 0x65BD, 0x65E8, 0x679D, 0x6B62, 0x6B7B, + 0x6C0F, 0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B, 0x80A2, 0x8102, + 0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C, 0x8AEE, 0x8CC7, 0x8CDC, + 0x96CC, 0x98FC, 0x6B6F, 0x4E8B, 0x4F3C, 0x4F8D, 0x5150, 0x5B57, 0x5BFA, + 0x6148, 0x6301, 0x6642, 0x6B21, 0x6ECB, 0x6CBB, 0x723E, 0x74BD, 0x75D4, + 0x78C1, 0x793A, 0x800C, 0x8033, 0x81EA, 0x8494, 0x8F9E, 0x6C50, 0x9E7F, + 0x5F0F, 0x8B58, 0x9D2B, 0x7AFA, 0x8EF8, 0x5B8D, 0x96EB, 0x4E03, 0x53F1, + 0x57F7, 0x5931, 0x5AC9, 0x5BA4, 0x6089, 0x6E7F, 0x6F06, 0x75BE, 0x8CEA, + 0x5B9F, 0x8500, 0x7BE0, 0x5072, 0x67F4, 0x829D, 0x5C61, 0x854A, 0x7E1E, + 0x820E, 0x5199, 0x5C04, 0x6368, 0x8D66, 0x659C, 0x716E, 0x793E, 0x7D17, + 0x8005, 0x8B1D, 0x8ECA, 0x906E, 0x86C7, 0x90AA, 0x501F, 0x52FA, 0x5C3A, + 0x6753, 0x707C, 0x7235, 0x914C, 0x91C8, 0x932B, 0x82E5, 0x5BC2, 0x5F31, + 0x60F9, 0x4E3B, 0x53D6, 0x5B88, 0x624B, 0x6731, 0x6B8A, 0x72E9, 0x73E0, + 0x7A2E, 0x816B, 0x8DA3, 0x9152, 0x9996, 0x5112, 0x53D7, 0x546A, 0x5BFF, + 0x6388, 0x6A39, 0x7DAC, 0x9700, 0x56DA, 0x53CE, 0x5468, 0x5B97, 0x5C31, + 0x5DDE, 0x4FEE, 0x6101, 0x62FE, 0x6D32, 0x79C0, 0x79CB, 0x7D42, 0x7E4D, + 0x7FD2, 0x81ED, 0x821F, 0x8490, 0x8846, 0x8972, 0x8B90, 0x8E74, 0x8F2F, + 0x9031, 0x914B, 0x916C, 0x96C6, 0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341, + 0x5F93, 0x620E, 0x67D4, 0x6C41, 0x6E0B, 0x7363, 0x7E26, 0x91CD, 0x9283, + 0x53D4, 0x5919, 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B, 0x587E, 0x719F, + 0x51FA, 0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625, 0x77AC, 0x7AE3, 0x821C, + 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 0x696F, 0x6B89, 0x6DF3, 0x6E96, 0x6F64, + 0x76FE, 0x7D14, 0x5DE1, 0x9075, 0x9187, 0x9806, 0x51E6, 0x521D, 0x6240, + 0x6691, 0x66D9, 0x6E1A, 0x5EB6, 0x7DD2, 0x7F72, 0x66F8, 0x85AF, 0x85F7, + 0x8AF8, 0x52A9, 0x53D9, 0x5973, 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, + 0x50B7, 0x511F, 0x52DD, 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531, + 0x5617, 0x5968, 0x59BE, 0x5A3C, 0x5BB5, 0x5C06, 0x5C0F, 0x5C11, 0x5C1A, + 0x5E84, 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB, 0x638C, 0x6377, + 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2, 0x6A1F, 0x6A35, 0x6CBC, + 0x6D88, 0x6E09, 0x6E58, 0x713C, 0x7126, 0x7167, 0x75C7, 0x7701, 0x785D, + 0x7901, 0x7965, 0x79F0, 0x7AE0, 0x7B11, 0x7CA7, 0x7D39, 0x8096, 0x83D6, + 0x848B, 0x8549, 0x885D, 0x88F3, 0x8A1F, 0x8A3C, 0x8A54, 0x8A73, 0x8C61, + 0x8CDE, 0x91A4, 0x9266, 0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, + 0x4E1E, 0x4E57, 0x5197, 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38, + 0x60C5, 0x64FE, 0x6761, 0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63, 0x84B8, + 0x8B72, 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE, 0x62ED, 0x690D, 0x6B96, + 0x71ED, 0x7E54, 0x8077, 0x8272, 0x89E6, 0x98DF, 0x8755, 0x8FB1, 0x5C3B, + 0x4F38, 0x4FE1, 0x4FB5, 0x5507, 0x5A20, 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, + 0x632F, 0x65B0, 0x664B, 0x68EE, 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, + 0x771F, 0x795E, 0x79E6, 0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A, + 0x8EAB, 0x8F9B, 0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, + 0x58EC, 0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, 0x976D, + 0x7B25, 0x8ACF, 0x9808, 0x9162, 0x56F3, 0x53A8, 0x9017, 0x5439, 0x5782, + 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761, 0x7C8B, 0x7FE0, 0x8870, 0x9042, + 0x9154, 0x9310, 0x9318, 0x968F, 0x745E, 0x9AC4, 0x5D07, 0x5D69, 0x6570, + 0x67A2, 0x8DA8, 0x96DB, 0x636E, 0x6749, 0x6919, 0x83C5, 0x9817, 0x96C0, + 0x88FE, 0x6F84, 0x647A, 0x5BF8, 0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, + 0x5236, 0x52E2, 0x59D3, 0x5F81, 0x6027, 0x6210, 0x653F, 0x6574, 0x661F, + 0x6674, 0x68F2, 0x6816, 0x6B63, 0x6E05, 0x7272, 0x751F, 0x76DB, 0x7CBE, + 0x8056, 0x58F0, 0x88FD, 0x897F, 0x8AA0, 0x8A93, 0x8ACB, 0x901D, 0x9192, + 0x9752, 0x9759, 0x6589, 0x7A0E, 0x8106, 0x96BB, 0x5E2D, 0x60DC, 0x621A, + 0x65A5, 0x6614, 0x6790, 0x77F3, 0x7A4D, 0x7C4D, 0x7E3E, 0x810A, 0x8CAC, + 0x8D64, 0x8DE1, 0x8E5F, 0x78A9, 0x5207, 0x62D9, 0x63A5, 0x6442, 0x6298, + 0x8A2D, 0x7A83, 0x7BC0, 0x8AAC, 0x96EA, 0x7D76, 0x820C, 0x8749, 0x4ED9, + 0x5148, 0x5343, 0x5360, 0x5BA3, 0x5C02, 0x5C16, 0x5DDD, 0x6226, 0x6247, + 0x64B0, 0x6813, 0x6834, 0x6CC9, 0x6D45, 0x6D17, 0x67D3, 0x6F5C, 0x714E, + 0x717D, 0x65CB, 0x7A7F, 0x7BAD, 0x7DDA, 0x7E4A, 0x7FA8, 0x817A, 0x821B, + 0x8239, 0x85A6, 0x8A6E, 0x8CCE, 0x8DF5, 0x9078, 0x9077, 0x92AD, 0x9291, + 0x9583, 0x9BAE, 0x524D, 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985, 0x7E55, + 0x81B3, 0x7CCE, 0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE, 0x66FD, 0x695A, + 0x72D9, 0x758F, 0x758E, 0x790E, 0x7956, 0x79DF, 0x7C97, 0x7D20, 0x7D44, + 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20, 0x50E7, 0x5275, 0x53CC, 0x53E2, + 0x5009, 0x55AA, 0x58EE, 0x594F, 0x723D, 0x5B8B, 0x5C64, 0x531D, 0x60E3, + 0x60F3, 0x635C, 0x6383, 0x633F, 0x63BB, 0x64CD, 0x65E9, 0x66F9, 0x5DE3, + 0x69CD, 0x69FD, 0x6F15, 0x71E5, 0x4E89, 0x75E9, 0x76F8, 0x7A93, 0x7CDF, + 0x7DCF, 0x7D9C, 0x8061, 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 0x88C5, + 0x8D70, 0x9001, 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897, 0x618E, + 0x81D3, 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247, 0x5373, 0x606F, + 0x6349, 0x675F, 0x6E2C, 0x8DB3, 0x901F, 0x4FD7, 0x5C5E, 0x8CCA, 0x65CF, + 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3, 0x5B58, 0x5B6B, 0x5C0A, 0x640D, + 0x6751, 0x905C, 0x4ED6, 0x591A, 0x592A, 0x6C70, 0x8A51, 0x553E, 0x5815, + 0x59A5, 0x60F0, 0x6253, 0x67C1, 0x8235, 0x6955, 0x9640, 0x99C4, 0x9A28, + 0x4F53, 0x5806, 0x5BFE, 0x8010, 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, + 0x6234, 0x66FF, 0x6CF0, 0x6EDE, 0x80CE, 0x817F, 0x82D4, 0x888B, 0x8CB8, + 0x9000, 0x902E, 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927, 0x7B2C, + 0x918D, 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544, 0x5B85, 0x6258, + 0x629E, 0x62D3, 0x6CA2, 0x6FEF, 0x7422, 0x8A17, 0x9438, 0x6FC1, 0x8AFE, + 0x8338, 0x51E7, 0x86F8, 0x53EA, 0x53E9, 0x4F46, 0x9054, 0x8FB0, 0x596A, + 0x8131, 0x5DFD, 0x7AEA, 0x8FBF, 0x68DA, 0x8C37, 0x72F8, 0x9C48, 0x6A3D, + 0x8AB0, 0x4E39, 0x5358, 0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E, + 0x6DE1, 0x6E5B, 0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D, 0x80C6, + 0x86CB, 0x8A95, 0x935B, 0x56E3, 0x58C7, 0x5F3E, 0x65AD, 0x6696, 0x6A80, + 0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730, 0x5F1B, 0x6065, 0x667A, + 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4, 0x8718, 0x9045, 0x99B3, 0x7BC9, + 0x755C, 0x7AF9, 0x7B51, 0x84C4, 0x9010, 0x79E9, 0x7A92, 0x8336, 0x5AE1, + 0x7740, 0x4E2D, 0x4EF2, 0x5B99, 0x5FE0, 0x62BD, 0x663C, 0x67F1, 0x6CE8, + 0x866B, 0x8877, 0x8A3B, 0x914E, 0x92F3, 0x99D0, 0x6A17, 0x7026, 0x732A, + 0x82E7, 0x8457, 0x8CAF, 0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5, 0x5E16, + 0x5E33, 0x5E81, 0x5F14, 0x5F35, 0x5F6B, 0x5FB4, 0x61F2, 0x6311, 0x66A2, + 0x671D, 0x6F6E, 0x7252, 0x753A, 0x773A, 0x8074, 0x8139, 0x8178, 0x8776, + 0x8ABF, 0x8ADC, 0x8D85, 0x8DF3, 0x929A, 0x9577, 0x9802, 0x9CE5, 0x52C5, + 0x6357, 0x76F4, 0x6715, 0x6C88, 0x73CD, 0x8CC3, 0x93AE, 0x9673, 0x6D25, + 0x589C, 0x690E, 0x69CC, 0x8FFD, 0x939A, 0x75DB, 0x901A, 0x585A, 0x6802, + 0x63B4, 0x69FB, 0x4F43, 0x6F2C, 0x67D8, 0x8FBB, 0x8526, 0x7DB4, 0x9354, + 0x693F, 0x6F70, 0x576A, 0x58F7, 0x5B2C, 0x7D2C, 0x722A, 0x540A, 0x91E3, + 0x9DB4, 0x4EAD, 0x4F4E, 0x505C, 0x5075, 0x5243, 0x8C9E, 0x5448, 0x5824, + 0x5B9A, 0x5E1D, 0x5E95, 0x5EAD, 0x5EF7, 0x5F1F, 0x608C, 0x62B5, 0x633A, + 0x63D0, 0x68AF, 0x6C40, 0x7887, 0x798E, 0x7A0B, 0x7DE0, 0x8247, 0x8A02, + 0x8AE6, 0x8E44, 0x9013, 0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5, 0x6458, + 0x64E2, 0x6575, 0x6EF4, 0x7684, 0x7B1B, 0x9069, 0x93D1, 0x6EBA, 0x54F2, + 0x5FB9, 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178, 0x586B, 0x5929, 0x5C55, + 0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC, 0x8EE2, 0x985B, 0x70B9, 0x4F1D, + 0x6BBF, 0x6FB1, 0x7530, 0x96FB, 0x514E, 0x5410, 0x5835, 0x5857, 0x59AC, + 0x5C60, 0x5F92, 0x6597, 0x675C, 0x6E21, 0x767B, 0x83DF, 0x8CED, 0x9014, + 0x90FD, 0x934D, 0x7825, 0x783A, 0x52AA, 0x5EA6, 0x571F, 0x5974, 0x6012, + 0x5012, 0x515A, 0x51AC, 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, + 0x5B95, 0x5CF6, 0x5D8B, 0x60BC, 0x6295, 0x642D, 0x6771, 0x6843, 0x68BC, + 0x68DF, 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 0x71C8, 0x5F53, 0x75D8, + 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71, 0x5230, 0x8463, 0x8569, + 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F, 0x9003, 0x900F, 0x9419, 0x9676, + 0x982D, 0x9A30, 0x95D8, 0x50CD, 0x52D5, 0x540C, 0x5802, 0x5C0E, 0x61A7, + 0x649E, 0x6D1E, 0x77B3, 0x7AE5, 0x80F4, 0x8404, 0x9053, 0x9285, 0x5CE0, + 0x9D07, 0x533F, 0x5F97, 0x5FB3, 0x6D9C, 0x7279, 0x7763, 0x79BF, 0x7BE4, + 0x6BD2, 0x72EC, 0x8AAD, 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A, + 0x9CF6, 0x82EB, 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7, 0x6566, + 0x6C8C, 0x8C5A, 0x9041, 0x9813, 0x5451, 0x66C7, 0x920D, 0x5948, 0x90A3, + 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058, 0x637A, 0x934B, 0x6962, + 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960, 0x8EDF, 0x96E3, 0x6C5D, 0x4E8C, + 0x5C3C, 0x5F10, 0x8FE9, 0x5302, 0x8CD1, 0x8089, 0x8679, 0x5EFF, 0x65E5, + 0x4E73, 0x5165, 0x5982, 0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D, + 0x6FE1, 0x79B0, 0x7962, 0x5BE7, 0x8471, 0x732B, 0x71B1, 0x5E74, 0x5FF5, + 0x637B, 0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B, 0x57DC, 0x56A2, + 0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF, 0x8FB2, 0x8997, 0x86A4, + 0x5DF4, 0x628A, 0x64AD, 0x8987, 0x6777, 0x6CE2, 0x6D3E, 0x7436, 0x7834, + 0x5A46, 0x7F75, 0x82AD, 0x99AC, 0x4FF3, 0x5EC3, 0x62DD, 0x6392, 0x6557, + 0x676F, 0x76C3, 0x724C, 0x80CC, 0x80BA, 0x8F29, 0x914D, 0x500D, 0x57F9, + 0x5A92, 0x6885, 0x6973, 0x7164, 0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, + 0x9019, 0x877F, 0x79E4, 0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD, + 0x67CF, 0x6CCA, 0x767D, 0x7B94, 0x7C95, 0x8236, 0x8584, 0x8FEB, 0x66DD, + 0x6F20, 0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6, 0x51FD, 0x7BB1, 0x7872, + 0x7BB8, 0x8087, 0x7B48, 0x6AE8, 0x5E61, 0x808C, 0x7551, 0x7560, 0x516B, + 0x9262, 0x6E8C, 0x767A, 0x9197, 0x9AEA, 0x4F10, 0x7F70, 0x629C, 0x7B4F, + 0x95A5, 0x9CE9, 0x567A, 0x5859, 0x86E4, 0x96BC, 0x4F34, 0x5224, 0x534A, + 0x53CD, 0x53DB, 0x5E06, 0x642C, 0x6591, 0x677F, 0x6C3E, 0x6C4E, 0x7248, + 0x72AF, 0x73ED, 0x7554, 0x7E41, 0x822C, 0x85E9, 0x8CA9, 0x7BC4, 0x91C6, + 0x7169, 0x9812, 0x98EF, 0x633D, 0x6669, 0x756A, 0x76E4, 0x78D0, 0x8543, + 0x86EE, 0x532A, 0x5351, 0x5426, 0x5983, 0x5E87, 0x5F7C, 0x60B2, 0x6249, + 0x6279, 0x62AB, 0x6590, 0x6BD4, 0x6CCC, 0x75B2, 0x76AE, 0x7891, 0x79D8, + 0x7DCB, 0x7F77, 0x80A5, 0x88AB, 0x8AB9, 0x8CBB, 0x907F, 0x975E, 0x98DB, + 0x6A0B, 0x7C38, 0x5099, 0x5C3E, 0x5FAE, 0x6787, 0x6BD8, 0x7435, 0x7709, + 0x7F8E, 0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B, 0x9AED, 0x5F66, 0x819D, + 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 0x7562, 0x7B46, 0x903C, 0x6867, 0x59EB, + 0x5A9B, 0x7D10, 0x767E, 0x8B2C, 0x4FF5, 0x5F6A, 0x6A19, 0x6C37, 0x6F02, + 0x74E2, 0x7968, 0x8868, 0x8A55, 0x8C79, 0x5EDF, 0x63CF, 0x75C5, 0x79D2, + 0x82D7, 0x9328, 0x92F2, 0x849C, 0x86ED, 0x9C2D, 0x54C1, 0x5F6C, 0x658C, + 0x6D5C, 0x7015, 0x8CA7, 0x8CD3, 0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8, + 0x57E0, 0x592B, 0x5A66, 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 0x6016, 0x6276, + 0x6577, 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150, 0x819A, 0x8299, + 0x8B5C, 0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644, 0x4FAE, 0x64AB, 0x6B66, + 0x821E, 0x8461, 0x856A, 0x90E8, 0x5C01, 0x6953, 0x98A8, 0x847A, 0x8557, + 0x4F0F, 0x526F, 0x5FA9, 0x5E45, 0x670D, 0x798F, 0x8179, 0x8907, 0x8986, + 0x6DF5, 0x5F17, 0x6255, 0x6CB8, 0x4ECF, 0x7269, 0x9B92, 0x5206, 0x543B, + 0x5674, 0x58B3, 0x61A4, 0x626E, 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, + 0x96F0, 0x6587, 0x805E, 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73, + 0x5F0A, 0x67C4, 0x4E26, 0x853D, 0x9589, 0x965B, 0x7C73, 0x9801, 0x50FB, + 0x58C1, 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86, 0x504F, 0x5909, + 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D, 0x4FBF, 0x52C9, 0x5A29, + 0x5F01, 0x97AD, 0x4FDD, 0x8217, 0x92EA, 0x5703, 0x6355, 0x6B69, 0x752B, + 0x88DC, 0x8F14, 0x7A42, 0x52DF, 0x5893, 0x6155, 0x620A, 0x66AE, 0x6BCD, + 0x7C3F, 0x83E9, 0x5023, 0x4FF8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5B9D, + 0x5CF0, 0x5CEF, 0x5D29, 0x5E96, 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B, + 0x6CD5, 0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3, 0x840C, 0x84EC, + 0x8702, 0x8912, 0x8A2A, 0x8C4A, 0x90A6, 0x92D2, 0x98FD, 0x9CF3, 0x9D6C, + 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A, 0x59A8, 0x5E3D, 0x5FD8, 0x5FD9, + 0x623F, 0x66B4, 0x671B, 0x67D0, 0x68D2, 0x5192, 0x7D21, 0x80AA, 0x81A8, + 0x8B00, 0x8C8C, 0x8CBF, 0x927E, 0x9632, 0x5420, 0x982C, 0x5317, 0x50D5, + 0x535C, 0x58A8, 0x64B2, 0x6734, 0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, + 0x6CA1, 0x6B86, 0x5800, 0x5E4C, 0x5954, 0x672C, 0x7FFB, 0x51E1, 0x76C6, + 0x6469, 0x78E8, 0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A, 0x6BCE, + 0x54E9, 0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE, 0x9C52, 0x685D, + 0x4EA6, 0x4FE3, 0x53C8, 0x62B9, 0x672B, 0x6CAB, 0x8FC4, 0x4FAD, 0x7E6D, + 0x9EBF, 0x4E07, 0x6162, 0x6E80, 0x6F2B, 0x8513, 0x5473, 0x672A, 0x9B45, + 0x5DF3, 0x7B95, 0x5CAC, 0x5BC6, 0x871C, 0x6E4A, 0x84D1, 0x7A14, 0x8108, + 0x5999, 0x7C8D, 0x6C11, 0x7720, 0x52D9, 0x5922, 0x7121, 0x725F, 0x77DB, + 0x9727, 0x9D61, 0x690B, 0x5A7F, 0x5A18, 0x51A5, 0x540D, 0x547D, 0x660E, + 0x76DF, 0x8FF7, 0x9298, 0x9CF4, 0x59EA, 0x725D, 0x6EC5, 0x514D, 0x68C9, + 0x7DBF, 0x7DEC, 0x9762, 0x9EBA, 0x6478, 0x6A21, 0x8302, 0x5984, 0x5B5F, + 0x6BDB, 0x731B, 0x76F2, 0x7DB2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ED9, + 0x76EE, 0x6762, 0x52FF, 0x9905, 0x5C24, 0x623B, 0x7C7E, 0x8CB0, 0x554F, + 0x60B6, 0x7D0B, 0x9580, 0x5301, 0x4E5F, 0x51B6, 0x591C, 0x723A, 0x8036, + 0x91CE, 0x5F25, 0x77E2, 0x5384, 0x5F79, 0x7D04, 0x85AC, 0x8A33, 0x8E8D, + 0x9756, 0x67F3, 0x85AE, 0x9453, 0x6109, 0x6108, 0x6CB9, 0x7652, 0x8AED, + 0x8F38, 0x552F, 0x4F51, 0x512A, 0x52C7, 0x53CB, 0x5BA5, 0x5E7D, 0x60A0, + 0x6182, 0x63D6, 0x6709, 0x67DA, 0x6E67, 0x6D8C, 0x7336, 0x7337, 0x7531, + 0x7950, 0x88D5, 0x8A98, 0x904A, 0x9091, 0x90F5, 0x96C4, 0x878D, 0x5915, + 0x4E88, 0x4F59, 0x4E0E, 0x8A89, 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 0x5996, + 0x5BB9, 0x5EB8, 0x63DA, 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8, 0x6D0B, + 0x6EB6, 0x7194, 0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449, 0x84C9, 0x8981, + 0x8B21, 0x8E0A, 0x9065, 0x967D, 0x990A, 0x617E, 0x6291, 0x6B32, 0x6C83, + 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85, 0x87BA, 0x88F8, 0x6765, 0x83B1, + 0x983C, 0x96F7, 0x6D1B, 0x7D61, 0x843D, 0x916A, 0x4E71, 0x5375, 0x5D50, + 0x6B04, 0x6FEB, 0x85CD, 0x862D, 0x89A7, 0x5229, 0x540F, 0x5C65, 0x674E, + 0x68A8, 0x7406, 0x7483, 0x75E2, 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, + 0x5F8B, 0x7387, 0x7ACB, 0x844E, 0x63A0, 0x7565, 0x5289, 0x6D41, 0x6E9C, + 0x7409, 0x7559, 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6, 0x616E, + 0x65C5, 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC, 0x5BEE, 0x6599, + 0x6881, 0x6DBC, 0x731F, 0x7642, 0x77AD, 0x7A1C, 0x7CE7, 0x826F, 0x8AD2, + 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B, 0x7DD1, 0x502B, 0x5398, 0x6797, + 0x6DCB, 0x71D0, 0x7433, 0x81E8, 0x8F2A, 0x96A3, 0x9C57, 0x9E9F, 0x7460, + 0x5841, 0x6D99, 0x7D2F, 0x985E, 0x4EE4, 0x4F36, 0x4F8B, 0x51B7, 0x52B1, + 0x5DBA, 0x601C, 0x73B2, 0x793C, 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, + 0x9E97, 0x9F62, 0x66A6, 0x6B74, 0x5217, 0x52A3, 0x70C8, 0x88C2, 0x5EC9, + 0x604B, 0x6190, 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F, 0x84EE, 0x9023, + 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089, 0x8CC2, 0x8DEF, 0x9732, 0x52B4, + 0x5A41, 0x5ECA, 0x5F04, 0x6717, 0x697C, 0x6994, 0x6D6A, 0x6F0F, 0x7262, + 0x72FC, 0x7BED, 0x8001, 0x807E, 0x874B, 0x90CE, 0x516D, 0x9E93, 0x7984, + 0x808B, 0x9332, 0x8AD6, 0x502D, 0x548C, 0x8A71, 0x6B6A, 0x8CC4, 0x8107, + 0x60D1, 0x67A0, 0x9DF2, 0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568, + 0x6900, 0x6E7E, 0x7897, 0x8155, 0x5F0C, 0x4E10, 0x4E15, 0x4E2A, 0x4E31, + 0x4E36, 0x4E3C, 0x4E3F, 0x4E42, 0x4E56, 0x4E58, 0x4E82, 0x4E85, 0x8C6B, + 0x4E8A, 0x8212, 0x5F0D, 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2, 0x4EB0, + 0x4EB3, 0x4EB6, 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2, 0x4ED7, 0x4EDE, + 0x4EED, 0x4EDF, 0x4EF7, 0x4F09, 0x4F5A, 0x4F30, 0x4F5B, 0x4F5D, 0x4F57, + 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98, 0x4F7B, 0x4F69, 0x4F70, 0x4F91, + 0x4F6F, 0x4F86, 0x4F96, 0x5118, 0x4FD4, 0x4FDF, 0x4FCE, 0x4FD8, 0x4FDB, + 0x4FD1, 0x4FDA, 0x4FD0, 0x4FE4, 0x4FE5, 0x501A, 0x5028, 0x5014, 0x502A, + 0x5025, 0x5005, 0x4F1C, 0x4FF6, 0x5021, 0x5029, 0x502C, 0x4FFE, 0x4FEF, + 0x5011, 0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505A, + 0x5056, 0x506C, 0x5078, 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2, 0x50C9, + 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5, 0x50ED, 0x50E3, 0x50EE, + 0x50F9, 0x50F5, 0x5109, 0x5101, 0x5102, 0x5116, 0x5115, 0x5114, 0x511A, + 0x5121, 0x513A, 0x5137, 0x513C, 0x513B, 0x513F, 0x5140, 0x5152, 0x514C, + 0x5154, 0x5162, 0x7AF8, 0x5169, 0x516A, 0x516E, 0x5180, 0x5182, 0x56D8, + 0x518C, 0x5189, 0x518F, 0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, + 0x51A2, 0x51A9, 0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5, + 0x51BD, 0x51C5, 0x51C9, 0x51DB, 0x51E0, 0x8655, 0x51E9, 0x51ED, 0x51F0, + 0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227, 0x522A, 0x522E, + 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C, 0x525E, 0x5254, 0x526A, + 0x5274, 0x5269, 0x5273, 0x527F, 0x527D, 0x528D, 0x5294, 0x5292, 0x5271, + 0x5288, 0x5291, 0x8FA8, 0x8FA7, 0x52AC, 0x52AD, 0x52BC, 0x52B5, 0x52C1, + 0x52CD, 0x52D7, 0x52DE, 0x52E3, 0x52E6, 0x98ED, 0x52E0, 0x52F3, 0x52F5, + 0x52F8, 0x52F9, 0x5306, 0x5308, 0x7538, 0x530D, 0x5310, 0x530F, 0x5315, + 0x531A, 0x5323, 0x532F, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, + 0x4E17, 0x5349, 0x534D, 0x51D6, 0x535E, 0x5369, 0x536E, 0x5918, 0x537B, + 0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6, 0x53A5, 0x53AE, 0x53B0, 0x53B6, + 0x53C3, 0x7C12, 0x96D9, 0x53DF, 0x66FC, 0x71EE, 0x53EE, 0x53E8, 0x53ED, + 0x53FA, 0x5401, 0x543D, 0x5440, 0x542C, 0x542D, 0x543C, 0x542E, 0x5436, + 0x5429, 0x541D, 0x544E, 0x548F, 0x5475, 0x548E, 0x545F, 0x5471, 0x5477, + 0x5470, 0x5492, 0x547B, 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54C7, + 0x54A2, 0x54B8, 0x54A5, 0x54AC, 0x54C4, 0x54C8, 0x54A8, 0x54AB, 0x54C2, + 0x54A4, 0x54BE, 0x54BC, 0x54D8, 0x54E5, 0x54E6, 0x550F, 0x5514, 0x54FD, + 0x54EE, 0x54ED, 0x54FA, 0x54E2, 0x5539, 0x5540, 0x5563, 0x554C, 0x552E, + 0x555C, 0x5545, 0x5556, 0x5557, 0x5538, 0x5533, 0x555D, 0x5599, 0x5580, + 0x54AF, 0x558A, 0x559F, 0x557B, 0x557E, 0x5598, 0x559E, 0x55AE, 0x557C, + 0x5583, 0x55A9, 0x5587, 0x55A8, 0x55DA, 0x55C5, 0x55DF, 0x55C4, 0x55DC, + 0x55E4, 0x55D4, 0x5614, 0x55F7, 0x5616, 0x55FE, 0x55FD, 0x561B, 0x55F9, + 0x564E, 0x5650, 0x71DF, 0x5634, 0x5636, 0x5632, 0x5638, 0x566B, 0x5664, + 0x562F, 0x566C, 0x566A, 0x5686, 0x5680, 0x568A, 0x56A0, 0x5694, 0x568F, + 0x56A5, 0x56AE, 0x56B6, 0x56B4, 0x56C2, 0x56BC, 0x56C1, 0x56C3, 0x56C0, + 0x56C8, 0x56CE, 0x56D1, 0x56D3, 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF, + 0x5704, 0x5709, 0x5708, 0x570B, 0x570D, 0x5713, 0x5718, 0x5716, 0x55C7, + 0x571C, 0x5726, 0x5737, 0x5738, 0x574E, 0x573B, 0x5740, 0x574F, 0x5769, + 0x57C0, 0x5788, 0x5761, 0x577F, 0x5789, 0x5793, 0x57A0, 0x57B3, 0x57A4, + 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4, 0x57D2, 0x57D3, 0x580A, 0x57D6, + 0x57E3, 0x580B, 0x5819, 0x581D, 0x5872, 0x5821, 0x5862, 0x584B, 0x5870, + 0x6BC0, 0x5852, 0x583D, 0x5879, 0x5885, 0x58B9, 0x589F, 0x58AB, 0x58BA, + 0x58DE, 0x58BB, 0x58B8, 0x58AE, 0x58C5, 0x58D3, 0x58D1, 0x58D7, 0x58D9, + 0x58D8, 0x58E5, 0x58DC, 0x58E4, 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB, + 0x58FC, 0x58FD, 0x5902, 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925, 0x592C, + 0x592D, 0x5932, 0x5938, 0x593E, 0x7AD2, 0x5955, 0x5950, 0x594E, 0x595A, + 0x5958, 0x5962, 0x5960, 0x5967, 0x596C, 0x5969, 0x5978, 0x5981, 0x599D, + 0x4F5E, 0x4FAB, 0x59A3, 0x59B2, 0x59C6, 0x59E8, 0x59DC, 0x598D, 0x59D9, + 0x59DA, 0x5A25, 0x5A1F, 0x5A11, 0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, + 0x5A49, 0x5A35, 0x5A36, 0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, + 0x5AC2, 0x5ABD, 0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 0x5AD6, 0x5AFA, 0x5AFB, + 0x5B0C, 0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E, 0x5B43, + 0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65, 0x5B69, 0x5B70, + 0x5B73, 0x5B75, 0x5B78, 0x6588, 0x5B7A, 0x5B80, 0x5B83, 0x5BA6, 0x5BB8, + 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0, 0x5BE4, 0x5BE6, 0x5BE2, 0x5BDE, + 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6, 0x5BF3, 0x5C05, 0x5C07, 0x5C08, 0x5C0D, + 0x5C13, 0x5C20, 0x5C22, 0x5C28, 0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, + 0x5C53, 0x5C50, 0x5C4F, 0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76, 0x5C79, + 0x5C8C, 0x5C91, 0x5C94, 0x599B, 0x5CAB, 0x5CBB, 0x5CB6, 0x5CBC, 0x5CB7, + 0x5CC5, 0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD, 0x5CFA, 0x5CED, 0x5D8C, + 0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C, 0x5D1F, 0x5D1B, 0x5D11, 0x5D14, + 0x5D22, 0x5D1A, 0x5D19, 0x5D18, 0x5D4C, 0x5D52, 0x5D4E, 0x5D4B, 0x5D6C, + 0x5D73, 0x5D76, 0x5D87, 0x5D84, 0x5D82, 0x5DA2, 0x5D9D, 0x5DAC, 0x5DAE, + 0x5DBD, 0x5D90, 0x5DB7, 0x5DBC, 0x5DC9, 0x5DCD, 0x5DD3, 0x5DD2, 0x5DD6, + 0x5DDB, 0x5DEB, 0x5DF2, 0x5DF5, 0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B, + 0x5E36, 0x5E37, 0x5E44, 0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54, 0x5E5F, + 0x5E62, 0x5E64, 0x5E47, 0x5E75, 0x5E76, 0x5E7A, 0x9EBC, 0x5E7F, 0x5EA0, + 0x5EC1, 0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF, 0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA, + 0x5EDB, 0x5EE2, 0x5EE1, 0x5EE8, 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3, 0x5EF0, + 0x5EF4, 0x5EF8, 0x5EFE, 0x5F03, 0x5F09, 0x5F5D, 0x5F5C, 0x5F0B, 0x5F11, + 0x5F16, 0x5F29, 0x5F2D, 0x5F38, 0x5F41, 0x5F48, 0x5F4C, 0x5F4E, 0x5F2F, + 0x5F51, 0x5F56, 0x5F57, 0x5F59, 0x5F61, 0x5F6D, 0x5F73, 0x5F77, 0x5F83, + 0x5F82, 0x5F7F, 0x5F8A, 0x5F88, 0x5F91, 0x5F87, 0x5F9E, 0x5F99, 0x5F98, + 0x5FA0, 0x5FA8, 0x5FAD, 0x5FBC, 0x5FD6, 0x5FFB, 0x5FE4, 0x5FF8, 0x5FF1, + 0x5FDD, 0x60B3, 0x5FFF, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600E, + 0x6031, 0x601B, 0x6015, 0x602B, 0x6026, 0x600F, 0x603A, 0x605A, 0x6041, + 0x606A, 0x6077, 0x605F, 0x604A, 0x6046, 0x604D, 0x6063, 0x6043, 0x6064, + 0x6042, 0x606C, 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7, 0x6083, 0x609A, + 0x6084, 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7, 0x608B, 0x60E1, 0x60B8, + 0x60E0, 0x60D3, 0x60B4, 0x5FF0, 0x60BD, 0x60C6, 0x60B5, 0x60D8, 0x614D, + 0x6115, 0x6106, 0x60F6, 0x60F7, 0x6100, 0x60F4, 0x60FA, 0x6103, 0x6121, + 0x60FB, 0x60F1, 0x610D, 0x610E, 0x6147, 0x613E, 0x6128, 0x6127, 0x614A, + 0x613F, 0x613C, 0x612C, 0x6134, 0x613D, 0x6142, 0x6144, 0x6173, 0x6177, + 0x6158, 0x6159, 0x615A, 0x616B, 0x6174, 0x616F, 0x6165, 0x6171, 0x615F, + 0x615D, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61AC, 0x6194, 0x619A, + 0x618A, 0x6191, 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9, 0x61F7, 0x61C8, + 0x61C3, 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD, 0x61E6, 0x61E3, 0x61F6, + 0x61FA, 0x61F4, 0x61FF, 0x61FD, 0x61FC, 0x61FE, 0x6200, 0x6208, 0x6209, + 0x620D, 0x620C, 0x6214, 0x621B, 0x621E, 0x6221, 0x622A, 0x622E, 0x6230, + 0x6232, 0x6233, 0x6241, 0x624E, 0x625E, 0x6263, 0x625B, 0x6260, 0x6268, + 0x627C, 0x6282, 0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283, + 0x6294, 0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4, 0x62C8, + 0x62DC, 0x62CC, 0x62CA, 0x62C2, 0x62C7, 0x629B, 0x62C9, 0x630C, 0x62EE, + 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5, 0x6350, 0x633E, 0x634D, + 0x641C, 0x634F, 0x6396, 0x638E, 0x6380, 0x63AB, 0x6376, 0x63A3, 0x638F, + 0x6389, 0x639F, 0x63B5, 0x636B, 0x6369, 0x63BE, 0x63E9, 0x63C0, 0x63C6, + 0x63E3, 0x63C9, 0x63D2, 0x63F6, 0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, + 0x6426, 0x6436, 0x651D, 0x6417, 0x6428, 0x640F, 0x6467, 0x646F, 0x6476, + 0x644E, 0x652A, 0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC, 0x64DA, + 0x64D2, 0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2, 0x64F1, 0x64E7, 0x8209, + 0x64E0, 0x64E1, 0x62AC, 0x64E3, 0x64EF, 0x652C, 0x64F6, 0x64F4, 0x64F2, + 0x64FA, 0x6500, 0x64FD, 0x6518, 0x651C, 0x6505, 0x6524, 0x6523, 0x652B, + 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754B, 0x6548, 0x6556, 0x6555, + 0x654D, 0x6558, 0x655E, 0x655D, 0x6572, 0x6578, 0x6582, 0x6583, 0x8B8A, + 0x659B, 0x659F, 0x65AB, 0x65B7, 0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC, + 0x65D2, 0x65DB, 0x65D9, 0x65E0, 0x65E1, 0x65F1, 0x6772, 0x660A, 0x6603, + 0x65FB, 0x6773, 0x6635, 0x6636, 0x6634, 0x661C, 0x664F, 0x6644, 0x6649, + 0x6641, 0x665E, 0x665D, 0x6664, 0x6667, 0x6668, 0x665F, 0x6662, 0x6670, + 0x6683, 0x6688, 0x668E, 0x6689, 0x6684, 0x6698, 0x669D, 0x66C1, 0x66B9, + 0x66C9, 0x66BE, 0x66BC, 0x66C4, 0x66B8, 0x66D6, 0x66DA, 0x66E0, 0x663F, + 0x66E6, 0x66E9, 0x66F0, 0x66F5, 0x66F7, 0x670F, 0x6716, 0x671E, 0x6726, + 0x6727, 0x9738, 0x672E, 0x673F, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746, + 0x675E, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67A9, 0x677C, + 0x676A, 0x678C, 0x678B, 0x67A6, 0x67A1, 0x6785, 0x67B7, 0x67EF, 0x67B4, + 0x67EC, 0x67B3, 0x67E9, 0x67B8, 0x67E4, 0x67DE, 0x67DD, 0x67E2, 0x67EE, + 0x67B9, 0x67CE, 0x67C6, 0x67E7, 0x6A9C, 0x681E, 0x6846, 0x6829, 0x6840, + 0x684D, 0x6832, 0x684E, 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877, 0x687F, + 0x689F, 0x688F, 0x68AD, 0x6894, 0x689D, 0x689B, 0x6883, 0x6AAE, 0x68B9, + 0x6874, 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D, 0x687E, 0x6901, 0x68CA, + 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1, 0x690C, 0x68CD, 0x68D4, 0x68E7, + 0x68D5, 0x6936, 0x6912, 0x6904, 0x68D7, 0x68E3, 0x6925, 0x68F9, 0x68E0, + 0x68EF, 0x6928, 0x692A, 0x691A, 0x6923, 0x6921, 0x68C6, 0x6979, 0x6977, + 0x695C, 0x6978, 0x696B, 0x6954, 0x697E, 0x696E, 0x6939, 0x6974, 0x693D, + 0x6959, 0x6930, 0x6961, 0x695E, 0x695D, 0x6981, 0x696A, 0x69B2, 0x69AE, + 0x69D0, 0x69BF, 0x69C1, 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA, 0x69DD, + 0x69BB, 0x69C3, 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C, 0x6995, 0x69B4, + 0x69DE, 0x69E8, 0x6A02, 0x6A1B, 0x69FF, 0x6B0A, 0x69F9, 0x69F2, 0x69E7, + 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14, 0x69EB, 0x6A0A, 0x6A12, 0x6AC1, + 0x6A23, 0x6A13, 0x6A44, 0x6A0C, 0x6A72, 0x6A36, 0x6A78, 0x6A47, 0x6A62, + 0x6A59, 0x6A66, 0x6A48, 0x6A38, 0x6A22, 0x6A90, 0x6A8D, 0x6AA0, 0x6A84, + 0x6AA2, 0x6AA3, 0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3, + 0x6AAC, 0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 0x6ADA, 0x6AEA, 0x6AFB, 0x6B05, + 0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38, 0x6B37, 0x76DC, + 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50, 0x6B59, 0x6B54, 0x6B5B, + 0x6B5F, 0x6B61, 0x6B78, 0x6B79, 0x6B7F, 0x6B80, 0x6B84, 0x6B83, 0x6B8D, + 0x6B98, 0x6B95, 0x6B9E, 0x6BA4, 0x6BAA, 0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, + 0x6BB3, 0x6BB7, 0x6BBC, 0x6BC6, 0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 0x6BEB, + 0x6BF3, 0x6BEF, 0x9EBE, 0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, + 0x6C5E, 0x6C55, 0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B, + 0x6C7E, 0x6C68, 0x6C73, 0x6C92, 0x6C90, 0x6CC4, 0x6CF1, 0x6CD3, 0x6CBD, + 0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE, 0x6CBA, 0x6CDB, 0x6CEF, + 0x6CD9, 0x6CEA, 0x6D1F, 0x884D, 0x6D36, 0x6D2B, 0x6D3D, 0x6D38, 0x6D19, + 0x6D35, 0x6D33, 0x6D12, 0x6D0C, 0x6D63, 0x6D93, 0x6D64, 0x6D5A, 0x6D79, + 0x6D59, 0x6D8E, 0x6D95, 0x6FE4, 0x6D85, 0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, + 0x6DC7, 0x6DE6, 0x6DB8, 0x6DC6, 0x6DEC, 0x6DDE, 0x6DCC, 0x6DE8, 0x6DD2, + 0x6DC5, 0x6DFA, 0x6DD9, 0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D, 0x6E6E, + 0x6E2E, 0x6E19, 0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B, 0x6E2B, 0x6E76, + 0x6E4D, 0x6E1F, 0x6E43, 0x6E3A, 0x6E4E, 0x6E24, 0x6EFF, 0x6E1D, 0x6E38, + 0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7, 0x6ED3, 0x6EBD, 0x6EAF, 0x6EC4, + 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F, 0x6EA5, 0x6EC2, 0x6E9F, 0x6F41, 0x6F11, + 0x704C, 0x6EEC, 0x6EF8, 0x6EFE, 0x6F3F, 0x6EF2, 0x6F31, 0x6EEF, 0x6F32, + 0x6ECC, 0x6F3E, 0x6F13, 0x6EF7, 0x6F86, 0x6F7A, 0x6F78, 0x6F81, 0x6F80, + 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D, 0x6F82, 0x6F7C, 0x6F58, 0x6F8E, 0x6F91, + 0x6FC2, 0x6F66, 0x6FB3, 0x6FA3, 0x6FA1, 0x6FA4, 0x6FB9, 0x6FC6, 0x6FAA, + 0x6FDF, 0x6FD5, 0x6FEC, 0x6FD4, 0x6FD8, 0x6FF1, 0x6FEE, 0x6FDB, 0x7009, + 0x700B, 0x6FFA, 0x7011, 0x7001, 0x700F, 0x6FFE, 0x701B, 0x701A, 0x6F74, + 0x701D, 0x7018, 0x701F, 0x7030, 0x703E, 0x7032, 0x7051, 0x7063, 0x7099, + 0x7092, 0x70AF, 0x70F1, 0x70AC, 0x70B8, 0x70B3, 0x70AE, 0x70DF, 0x70CB, + 0x70DD, 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119, 0x7165, 0x7155, 0x7188, + 0x7166, 0x7162, 0x714C, 0x7156, 0x716C, 0x718F, 0x71FB, 0x7184, 0x7195, + 0x71A8, 0x71AC, 0x71D7, 0x71B9, 0x71BE, 0x71D2, 0x71C9, 0x71D4, 0x71CE, + 0x71E0, 0x71EC, 0x71E7, 0x71F5, 0x71FC, 0x71F9, 0x71FF, 0x720D, 0x7210, + 0x721B, 0x7228, 0x722D, 0x722C, 0x7230, 0x7232, 0x723B, 0x723C, 0x723F, + 0x7240, 0x7246, 0x724B, 0x7258, 0x7274, 0x727E, 0x7282, 0x7281, 0x7287, + 0x7292, 0x7296, 0x72A2, 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6, 0x72C4, + 0x72CE, 0x72D2, 0x72E2, 0x72E0, 0x72E1, 0x72F9, 0x72F7, 0x500F, 0x7317, + 0x730A, 0x731C, 0x7316, 0x731D, 0x7334, 0x732F, 0x7329, 0x7325, 0x733E, + 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A, 0x7368, 0x7370, 0x7378, 0x7375, + 0x737B, 0x737A, 0x73C8, 0x73B3, 0x73CE, 0x73BB, 0x73C0, 0x73E5, 0x73EE, + 0x73DE, 0x74A2, 0x7405, 0x746F, 0x7425, 0x73F8, 0x7432, 0x743A, 0x7455, + 0x743F, 0x745F, 0x7459, 0x7441, 0x745C, 0x7469, 0x7470, 0x7463, 0x746A, + 0x7476, 0x747E, 0x748B, 0x749E, 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1, + 0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0, 0x74F1, 0x74F8, + 0x74F7, 0x7504, 0x7503, 0x7505, 0x750C, 0x750E, 0x750D, 0x7515, 0x7513, + 0x751E, 0x7526, 0x752C, 0x753C, 0x7544, 0x754D, 0x754A, 0x7549, 0x755B, + 0x7546, 0x755A, 0x7569, 0x7564, 0x7567, 0x756B, 0x756D, 0x7578, 0x7576, + 0x7586, 0x7587, 0x7574, 0x758A, 0x7589, 0x7582, 0x7594, 0x759A, 0x759D, + 0x75A5, 0x75A3, 0x75C2, 0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, + 0x75B1, 0x75CD, 0x75CA, 0x75D2, 0x75D9, 0x75E3, 0x75DE, 0x75FE, 0x75FF, + 0x75FC, 0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D, 0x7609, + 0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630, 0x763B, + 0x7647, 0x7648, 0x7646, 0x765C, 0x7658, 0x7661, 0x7662, 0x7668, 0x7669, + 0x766A, 0x7667, 0x766C, 0x7670, 0x7672, 0x7676, 0x7678, 0x767C, 0x7680, + 0x7683, 0x7688, 0x768B, 0x768E, 0x7696, 0x7693, 0x7699, 0x769A, 0x76B0, + 0x76B4, 0x76B8, 0x76B9, 0x76BA, 0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE, + 0x76E1, 0x76E5, 0x76E7, 0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707, 0x7704, + 0x7729, 0x7724, 0x771E, 0x7725, 0x7726, 0x771B, 0x7737, 0x7738, 0x7747, + 0x775A, 0x7768, 0x776B, 0x775B, 0x7765, 0x777F, 0x777E, 0x7779, 0x778E, + 0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0, 0x77B6, 0x77B9, 0x77BF, 0x77BC, + 0x77BD, 0x77BB, 0x77C7, 0x77CD, 0x77D7, 0x77DA, 0x77DC, 0x77E3, 0x77EE, + 0x77FC, 0x780C, 0x7812, 0x7926, 0x7820, 0x792A, 0x7845, 0x788E, 0x7874, + 0x7886, 0x787C, 0x789A, 0x788C, 0x78A3, 0x78B5, 0x78AA, 0x78AF, 0x78D1, + 0x78C6, 0x78CB, 0x78D4, 0x78BE, 0x78BC, 0x78C5, 0x78CA, 0x78EC, 0x78E7, + 0x78DA, 0x78FD, 0x78F4, 0x7907, 0x7912, 0x7911, 0x7919, 0x792C, 0x792B, + 0x7940, 0x7960, 0x7957, 0x795F, 0x795A, 0x7955, 0x7953, 0x797A, 0x797F, + 0x798A, 0x799D, 0x79A7, 0x9F4B, 0x79AA, 0x79AE, 0x79B3, 0x79B9, 0x79BA, + 0x79C9, 0x79D5, 0x79E7, 0x79EC, 0x79E1, 0x79E3, 0x7A08, 0x7A0D, 0x7A18, + 0x7A19, 0x7A20, 0x7A1F, 0x7980, 0x7A31, 0x7A3B, 0x7A3E, 0x7A37, 0x7A43, + 0x7A57, 0x7A49, 0x7A61, 0x7A62, 0x7A69, 0x9F9D, 0x7A70, 0x7A79, 0x7A7D, + 0x7A88, 0x7A97, 0x7A95, 0x7A98, 0x7A96, 0x7AA9, 0x7AC8, 0x7AB0, 0x7AB6, + 0x7AC5, 0x7AC4, 0x7ABF, 0x9083, 0x7AC7, 0x7ACA, 0x7ACD, 0x7ACF, 0x7AD5, + 0x7AD3, 0x7AD9, 0x7ADA, 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE6, 0x7AED, 0x7AF0, + 0x7B02, 0x7B0F, 0x7B0A, 0x7B06, 0x7B33, 0x7B18, 0x7B19, 0x7B1E, 0x7B35, + 0x7B28, 0x7B36, 0x7B50, 0x7B7A, 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45, + 0x7B75, 0x7B65, 0x7B74, 0x7B67, 0x7B70, 0x7B71, 0x7B6C, 0x7B6E, 0x7B9D, + 0x7B98, 0x7B9F, 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92, 0x7B8F, 0x7B5D, + 0x7B99, 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4, 0x7BC6, 0x7BDD, 0x7BE9, + 0x7C11, 0x7C14, 0x7BE6, 0x7BE5, 0x7C60, 0x7C00, 0x7C07, 0x7C13, 0x7BF3, + 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6, 0x7C23, 0x7C27, 0x7C2A, 0x7C1F, 0x7C37, + 0x7C2B, 0x7C3D, 0x7C4C, 0x7C43, 0x7C54, 0x7C4F, 0x7C40, 0x7C50, 0x7C58, + 0x7C5F, 0x7C64, 0x7C56, 0x7C65, 0x7C6C, 0x7C75, 0x7C83, 0x7C90, 0x7CA4, + 0x7CAD, 0x7CA2, 0x7CAB, 0x7CA1, 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE, + 0x7CB9, 0x7CBD, 0x7CC0, 0x7CC5, 0x7CC2, 0x7CD8, 0x7CD2, 0x7CDC, 0x7CE2, + 0x9B3B, 0x7CEF, 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06, 0x7D02, 0x7D1C, + 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E, 0x7D32, 0x7D3F, 0x7D35, 0x7D46, + 0x7D73, 0x7D56, 0x7D4E, 0x7D72, 0x7D68, 0x7D6E, 0x7D4F, 0x7D63, 0x7D93, + 0x7D89, 0x7D5B, 0x7D8F, 0x7D7D, 0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, + 0x7DC7, 0x7DBD, 0x7DAB, 0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 0x7DB8, 0x7D9F, + 0x7DB0, 0x7DD8, 0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05, + 0x7E0A, 0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B, 0x7E22, + 0x7E46, 0x7E66, 0x7E3B, 0x7E35, 0x7E39, 0x7E43, 0x7E37, 0x7E32, 0x7E3A, + 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A, 0x7E79, 0x7E6A, 0x7E69, + 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D, 0x8FAE, 0x7E7F, 0x7E88, 0x7E89, + 0x7E8C, 0x7E92, 0x7E90, 0x7E93, 0x7E94, 0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, + 0x7F38, 0x7F3A, 0x7F45, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55, + 0x7F54, 0x7F58, 0x7F5F, 0x7F60, 0x7F68, 0x7F69, 0x7F67, 0x7F78, 0x7F82, + 0x7F86, 0x7F83, 0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E, 0x7F9D, 0x7F9A, + 0x7FA3, 0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6, 0x7FB8, 0x8B71, 0x7FC5, + 0x7FC6, 0x7FCA, 0x7FD5, 0x7FD4, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FF3, 0x7FF9, + 0x98DC, 0x8006, 0x8004, 0x800B, 0x8012, 0x8018, 0x8019, 0x801C, 0x8021, + 0x8028, 0x803F, 0x803B, 0x804A, 0x8046, 0x8052, 0x8058, 0x805A, 0x805F, + 0x8062, 0x8068, 0x8073, 0x8072, 0x8070, 0x8076, 0x8079, 0x807D, 0x807F, + 0x8084, 0x8086, 0x8085, 0x809B, 0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC, + 0x80DB, 0x80E5, 0x80D9, 0x80DD, 0x80C4, 0x80DA, 0x80D6, 0x8109, 0x80EF, + 0x80F1, 0x811B, 0x8129, 0x8123, 0x812F, 0x814B, 0x968B, 0x8146, 0x813E, + 0x8153, 0x8151, 0x80FC, 0x8171, 0x816E, 0x8165, 0x8166, 0x8174, 0x8183, + 0x8188, 0x818A, 0x8180, 0x8182, 0x81A0, 0x8195, 0x81A4, 0x81A3, 0x815F, + 0x8193, 0x81A9, 0x81B0, 0x81B5, 0x81BE, 0x81B8, 0x81BD, 0x81C0, 0x81C2, + 0x81BA, 0x81C9, 0x81CD, 0x81D1, 0x81D9, 0x81D8, 0x81C8, 0x81DA, 0x81DF, + 0x81E0, 0x81E7, 0x81FA, 0x81FB, 0x81FE, 0x8201, 0x8202, 0x8205, 0x8207, + 0x820A, 0x820D, 0x8210, 0x8216, 0x8229, 0x822B, 0x8238, 0x8233, 0x8240, + 0x8259, 0x8258, 0x825D, 0x825A, 0x825F, 0x8264, 0x8262, 0x8268, 0x826A, + 0x826B, 0x822E, 0x8271, 0x8277, 0x8278, 0x827E, 0x828D, 0x8292, 0x82AB, + 0x829F, 0x82BB, 0x82AC, 0x82E1, 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3, + 0x82FA, 0x8393, 0x8303, 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC, 0x8309, + 0x82D9, 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350, + 0x8345, 0x832F, 0x832B, 0x8317, 0x8318, 0x8385, 0x839A, 0x83AA, 0x839F, + 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387, 0x838A, 0x837C, 0x83B5, 0x8373, + 0x8375, 0x83A0, 0x8389, 0x83A8, 0x83F4, 0x8413, 0x83EB, 0x83CE, 0x83FD, + 0x8403, 0x83D8, 0x840B, 0x83C1, 0x83F7, 0x8407, 0x83E0, 0x83F2, 0x840D, + 0x8422, 0x8420, 0x83BD, 0x8438, 0x8506, 0x83FB, 0x846D, 0x842A, 0x843C, + 0x855A, 0x8484, 0x8477, 0x846B, 0x84AD, 0x846E, 0x8482, 0x8469, 0x8446, + 0x842C, 0x846F, 0x8479, 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF, 0x849F, + 0x84D9, 0x84CD, 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6, 0x84D6, 0x84A1, + 0x8521, 0x84FF, 0x84F4, 0x8517, 0x8518, 0x852C, 0x851F, 0x8515, 0x8514, + 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548, 0x8541, 0x8602, 0x854B, 0x8555, + 0x8580, 0x85A4, 0x8588, 0x8591, 0x858A, 0x85A8, 0x856D, 0x8594, 0x859B, + 0x85EA, 0x8587, 0x859C, 0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, + 0x85B9, 0x85D0, 0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613, + 0x860B, 0x85FE, 0x85FA, 0x8606, 0x8622, 0x861A, 0x8630, 0x863F, 0x864D, + 0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3, 0x86A9, 0x86AA, + 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6, 0x86B0, 0x86C9, 0x8823, + 0x86AB, 0x86D4, 0x86DE, 0x86E9, 0x86EC, 0x86DF, 0x86DB, 0x86EF, 0x8712, + 0x8706, 0x8708, 0x8700, 0x8703, 0x86FB, 0x8711, 0x8709, 0x870D, 0x86F9, + 0x870A, 0x8734, 0x873F, 0x8737, 0x873B, 0x8725, 0x8729, 0x871A, 0x8760, + 0x875F, 0x8778, 0x874C, 0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759, + 0x8753, 0x8763, 0x876A, 0x8805, 0x87A2, 0x879F, 0x8782, 0x87AF, 0x87CB, + 0x87BD, 0x87C0, 0x87D0, 0x96D6, 0x87AB, 0x87C4, 0x87B3, 0x87C7, 0x87C6, + 0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F, 0x880D, 0x87FE, 0x87F6, 0x87F7, + 0x880E, 0x87D2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821, 0x8831, 0x8836, + 0x8839, 0x8827, 0x883B, 0x8844, 0x8842, 0x8852, 0x8859, 0x885E, 0x8862, + 0x886B, 0x8881, 0x887E, 0x889E, 0x8875, 0x887D, 0x88B5, 0x8872, 0x8882, + 0x8897, 0x8892, 0x88AE, 0x8899, 0x88A2, 0x888D, 0x88A4, 0x88B0, 0x88BF, + 0x88B1, 0x88C3, 0x88C4, 0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9, 0x8902, + 0x88FC, 0x88F4, 0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A, 0x8913, 0x8943, + 0x891E, 0x8925, 0x892A, 0x892B, 0x8941, 0x8944, 0x893B, 0x8936, 0x8938, + 0x894C, 0x891D, 0x8960, 0x895E, 0x8966, 0x8964, 0x896D, 0x896A, 0x896F, + 0x8974, 0x8977, 0x897E, 0x8983, 0x8988, 0x898A, 0x8993, 0x8998, 0x89A1, + 0x89A9, 0x89A6, 0x89AC, 0x89AF, 0x89B2, 0x89BA, 0x89BD, 0x89BF, 0x89C0, + 0x89DA, 0x89DC, 0x89DD, 0x89E7, 0x89F4, 0x89F8, 0x8A03, 0x8A16, 0x8A10, + 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25, 0x8A36, 0x8A41, 0x8A5B, 0x8A52, 0x8A46, + 0x8A48, 0x8A7C, 0x8A6D, 0x8A6C, 0x8A62, 0x8A85, 0x8A82, 0x8A84, 0x8AA8, + 0x8AA1, 0x8A91, 0x8AA5, 0x8AA6, 0x8A9A, 0x8AA3, 0x8AC4, 0x8ACD, 0x8AC2, + 0x8ADA, 0x8AEB, 0x8AF3, 0x8AE7, 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2, + 0x8AF7, 0x8ADE, 0x8ADB, 0x8B0C, 0x8B07, 0x8B1A, 0x8AE1, 0x8B16, 0x8B10, + 0x8B17, 0x8B20, 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E, 0x8B28, 0x8B41, + 0x8B4C, 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B, 0x8B5A, 0x8B6B, 0x8B5F, + 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80, 0x8B8C, 0x8B8E, 0x8B92, 0x8B93, + 0x8B96, 0x8B99, 0x8B9A, 0x8C3A, 0x8C41, 0x8C3F, 0x8C48, 0x8C4C, 0x8C4E, + 0x8C50, 0x8C55, 0x8C62, 0x8C6C, 0x8C78, 0x8C7A, 0x8C82, 0x8C89, 0x8C85, + 0x8C8A, 0x8C8D, 0x8C8E, 0x8C94, 0x8C7C, 0x8C98, 0x621D, 0x8CAD, 0x8CAA, + 0x8CBD, 0x8CB2, 0x8CB3, 0x8CAE, 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3, + 0x8CDA, 0x8CFD, 0x8CFA, 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07, 0x8D0F, + 0x8D0D, 0x8D10, 0x9F4E, 0x8D13, 0x8CCD, 0x8D14, 0x8D16, 0x8D67, 0x8D6D, + 0x8D71, 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE, 0x8DBA, 0x8DCF, 0x8DDA, + 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA, 0x8DEB, 0x8DDF, 0x8DE3, 0x8DFC, + 0x8E08, 0x8E09, 0x8DFF, 0x8E1D, 0x8E1E, 0x8E10, 0x8E1F, 0x8E42, 0x8E35, + 0x8E30, 0x8E34, 0x8E4A, 0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, + 0x8E64, 0x8E60, 0x8E2A, 0x8E63, 0x8E55, 0x8E76, 0x8E72, 0x8E7C, 0x8E81, + 0x8E87, 0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94, 0x8E99, + 0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE, 0x8EC5, 0x8EC8, + 0x8ECB, 0x8EDB, 0x8EE3, 0x8EFC, 0x8EFB, 0x8EEB, 0x8EFE, 0x8F0A, 0x8F05, + 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C, 0x8F1F, 0x8F1B, 0x8F0C, 0x8F26, + 0x8F33, 0x8F3B, 0x8F39, 0x8F45, 0x8F42, 0x8F3E, 0x8F4C, 0x8F49, 0x8F46, + 0x8F4E, 0x8F57, 0x8F5C, 0x8F62, 0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, + 0x8FAD, 0x8FAF, 0x8FB7, 0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, + 0x8FF4, 0x9005, 0x8FF9, 0x8FFA, 0x9011, 0x9015, 0x9021, 0x900D, 0x901E, + 0x9016, 0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8, 0x904F, 0x9050, + 0x9051, 0x9052, 0x900E, 0x9049, 0x903E, 0x9056, 0x9058, 0x905E, 0x9068, + 0x906F, 0x9076, 0x96A8, 0x9072, 0x9082, 0x907D, 0x9081, 0x9080, 0x908A, + 0x9089, 0x908F, 0x90A8, 0x90AF, 0x90B1, 0x90B5, 0x90E2, 0x90E4, 0x6248, + 0x90DB, 0x9102, 0x9112, 0x9119, 0x9132, 0x9130, 0x914A, 0x9156, 0x9158, + 0x9163, 0x9165, 0x9169, 0x9173, 0x9172, 0x918B, 0x9189, 0x9182, 0x91A2, + 0x91AB, 0x91AF, 0x91AA, 0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1, 0x91C9, + 0x91CB, 0x91D0, 0x91D6, 0x91DF, 0x91E1, 0x91DB, 0x91FC, 0x91F5, 0x91F6, + 0x921E, 0x91FF, 0x9214, 0x922C, 0x9215, 0x9211, 0x925E, 0x9257, 0x9245, + 0x9249, 0x9264, 0x9248, 0x9295, 0x923F, 0x924B, 0x9250, 0x929C, 0x9296, + 0x9293, 0x929B, 0x925A, 0x92CF, 0x92B9, 0x92B7, 0x92E9, 0x930F, 0x92FA, + 0x9344, 0x932E, 0x9319, 0x9322, 0x931A, 0x9323, 0x933A, 0x9335, 0x933B, + 0x935C, 0x9360, 0x937C, 0x936E, 0x9356, 0x93B0, 0x93AC, 0x93AD, 0x9394, + 0x93B9, 0x93D6, 0x93D7, 0x93E8, 0x93E5, 0x93D8, 0x93C3, 0x93DD, 0x93D0, + 0x93C8, 0x93E4, 0x941A, 0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, + 0x942B, 0x9435, 0x9421, 0x943A, 0x9441, 0x9452, 0x9444, 0x945B, 0x9460, + 0x9462, 0x945E, 0x946A, 0x9229, 0x9470, 0x9475, 0x9477, 0x947D, 0x945A, + 0x947C, 0x947E, 0x9481, 0x947F, 0x9582, 0x9587, 0x958A, 0x9594, 0x9596, + 0x9598, 0x9599, 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC, 0x95BB, 0x95B9, + 0x95BE, 0x95CA, 0x6FF6, 0x95C3, 0x95CD, 0x95CC, 0x95D5, 0x95D4, 0x95D6, + 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621, 0x9628, 0x962E, 0x962F, 0x9642, + 0x964C, 0x964F, 0x964B, 0x9677, 0x965C, 0x965E, 0x965D, 0x965F, 0x9666, + 0x9672, 0x966C, 0x968D, 0x9698, 0x9695, 0x9697, 0x96AA, 0x96A7, 0x96B1, + 0x96B2, 0x96B0, 0x96B4, 0x96B6, 0x96B8, 0x96B9, 0x96CE, 0x96CB, 0x96C9, + 0x96CD, 0x894D, 0x96DC, 0x970D, 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708, + 0x9713, 0x970E, 0x9711, 0x970F, 0x9716, 0x9719, 0x9724, 0x972A, 0x9730, + 0x9739, 0x973D, 0x973E, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975C, + 0x9760, 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B, 0x9771, 0x9779, 0x9785, + 0x977C, 0x9781, 0x977A, 0x9786, 0x978B, 0x978F, 0x9790, 0x979C, 0x97A8, + 0x97A6, 0x97A3, 0x97B3, 0x97B4, 0x97C3, 0x97C6, 0x97C8, 0x97CB, 0x97DC, + 0x97ED, 0x9F4F, 0x97F2, 0x7ADF, 0x97F6, 0x97F5, 0x980F, 0x980C, 0x9838, + 0x9824, 0x9821, 0x9837, 0x983D, 0x9846, 0x984F, 0x984B, 0x986B, 0x986F, + 0x9870, 0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6, 0x98C4, + 0x98C3, 0x98C6, 0x98E9, 0x98EB, 0x9903, 0x9909, 0x9912, 0x9914, 0x9918, + 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C, 0x992E, 0x993D, 0x993E, + 0x9942, 0x9949, 0x9945, 0x9950, 0x994B, 0x9951, 0x9952, 0x994C, 0x9955, + 0x9997, 0x9998, 0x99A5, 0x99AD, 0x99AE, 0x99BC, 0x99DF, 0x99DB, 0x99DD, + 0x99D8, 0x99D1, 0x99ED, 0x99EE, 0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, + 0x9A0F, 0x9A05, 0x99E2, 0x9A19, 0x9A2B, 0x9A37, 0x9A45, 0x9A42, 0x9A40, + 0x9A43, 0x9A3E, 0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65, + 0x9A64, 0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0, 0x9ACF, + 0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 0x9ADF, 0x9AE2, 0x9AE3, 0x9AE6, 0x9AEF, + 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7, 0x9AFB, 0x9B06, 0x9B18, 0x9B1A, + 0x9B1F, 0x9B22, 0x9B23, 0x9B25, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 0x9B2E, + 0x9B2F, 0x9B32, 0x9B44, 0x9B43, 0x9B4F, 0x9B4D, 0x9B4E, 0x9B51, 0x9B58, + 0x9B74, 0x9B93, 0x9B83, 0x9B91, 0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8, + 0x9BB4, 0x9BC0, 0x9BCA, 0x9BB9, 0x9BC6, 0x9BCF, 0x9BD1, 0x9BD2, 0x9BE3, + 0x9BE2, 0x9BE4, 0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1, 0x9BF0, 0x9C15, + 0x9C14, 0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08, 0x9C12, 0x9C0A, 0x9C04, + 0x9C2E, 0x9C1B, 0x9C25, 0x9C24, 0x9C21, 0x9C30, 0x9C47, 0x9C32, 0x9C46, + 0x9C3E, 0x9C5A, 0x9C60, 0x9C67, 0x9C76, 0x9C78, 0x9CE7, 0x9CEC, 0x9CF0, + 0x9D09, 0x9D08, 0x9CEB, 0x9D03, 0x9D06, 0x9D2A, 0x9D26, 0x9DAF, 0x9D23, + 0x9D1F, 0x9D44, 0x9D15, 0x9D12, 0x9D41, 0x9D3F, 0x9D3E, 0x9D46, 0x9D48, + 0x9D5D, 0x9D5E, 0x9D64, 0x9D51, 0x9D50, 0x9D59, 0x9D72, 0x9D89, 0x9D87, + 0x9DAB, 0x9D6F, 0x9D7A, 0x9D9A, 0x9DA4, 0x9DA9, 0x9DB2, 0x9DC4, 0x9DC1, + 0x9DBB, 0x9DB8, 0x9DBA, 0x9DC6, 0x9DCF, 0x9DC2, 0x9DD9, 0x9DD3, 0x9DF8, + 0x9DE6, 0x9DED, 0x9DEF, 0x9DFD, 0x9E1A, 0x9E1B, 0x9E1E, 0x9E75, 0x9E79, + 0x9E7D, 0x9E81, 0x9E88, 0x9E8B, 0x9E8C, 0x9E92, 0x9E95, 0x9E91, 0x9E9D, + 0x9EA5, 0x9EA9, 0x9EB8, 0x9EAA, 0x9EAD, 0x9761, 0x9ECC, 0x9ECE, 0x9ECF, + 0x9ED0, 0x9ED4, 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0, 0x9EE5, 0x9EE8, 0x9EEF, + 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB, 0x9EFC, 0x9EFD, 0x9F07, 0x9F08, + 0x76B7, 0x9F15, 0x9F21, 0x9F2C, 0x9F3E, 0x9F4A, 0x9F52, 0x9F54, 0x9F63, + 0x9F5F, 0x9F60, 0x9F61, 0x9F66, 0x9F67, 0x9F6C, 0x9F6A, 0x9F77, 0x9F72, + 0x9F76, 0x9F95, 0x9F9C, 0x9FA0, 0x582F, 0x69C7, 0x9059, 0x7464, 0x2642, + 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, + 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, + 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, + 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, + 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, + 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, + 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E, + 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, + 0x2548, 0x2549, 0x254A, 0x254B, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, + 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246A, 0x246B, 0x246C, 0x246D, + 0x246E, 0x246F, 0x2470, 0x2471, 0x2472, 0x2473, 0x2160, 0x2161, 0x2162, + 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x3349, 0x3314, + 0x3322, 0x334D, 0x3318, 0x3327, 0x3303, 0x3336, 0x3351, 0x3357, 0x330D, + 0x3326, 0x3323, 0x332B, 0x334A, 0x333B, 0x339C, 0x339D, 0x339E, 0x338E, + 0x338F, 0x33C4, 0x33A1, 0x301D, 0x301F, 0x2116, 0x33CD, 0x2121, 0x32A4, + 0x32A5, 0x32A6, 0x32A7, 0x32A8, 0x3231, 0x3232, 0x3239, 0x337E, 0x337D, + 0x337C, 0x222E, 0x2211, 0x221A, 0x22A5, 0x2220, 0x221F, 0x22BF, 0x2229, + 0x222A, 0x555E, 0x98F4, 0x6EA2, 0x9C2F, 0x6DEB, 0x8FC2, 0x6B1D, 0x53A9, + 0x958F, 0x5642, 0x990C, 0x7130, 0x8956, 0x9DD7, 0x8FE6, 0x6062, 0x62D0, + 0x6666, 0x559D, 0x845B, 0x9784, 0x5699, 0x6F97, 0x7FF0, 0x7FEB, 0x5FBD, + 0x7947, 0x4FE0, 0x537F, 0x50C5, 0x8EC0, 0x55B0, 0x6ADB, 0x5C51, 0x9774, + 0x7941, 0x6167, 0x7A3D, 0x7E6B, 0x834A, 0x9699, 0x5026, 0x5ACC, 0x6372, + 0x9E7C, 0x8AFA, 0x5DF7, 0x663B, 0x6E9D, 0x9EB4, 0x9D60, 0x7511, 0x91C7, + 0x698A, 0x6805, 0x85A9, 0x9BD6, 0x9306, 0x73CA, 0x53F1, 0x5C62, 0x906E, + 0x6753, 0x707C, 0x7E61, 0x914B, 0x66D9, 0x6E1A, 0x85AF, 0x85F7, 0x54E8, + 0x5EE0, 0x68A2, 0x8523, 0x91AC, 0x9798, 0x8755, 0x9771, 0x9017, 0x7FE0, + 0x647A, 0x901D, 0x87EC, 0x64B0, 0x6813, 0x714E, 0x717D, 0x8A6E, 0x564C, + 0x9061, 0x5275, 0x6414, 0x7626, 0x905C, 0x9A52, 0x817F, 0x9EDB, 0x5544, + 0x6FEF, 0x7422, 0x86F8, 0x5DFD, 0x8FBF, 0x68DA, 0x9C48, 0x6A3D, 0x7C1E, + 0x8A3B, 0x7026, 0x51CB, 0x6357, 0x69CC, 0x939A, 0x585A, 0x6451, 0x912D, + 0x64E2, 0x6EBA, 0x5861, 0x985A, 0x5835, 0x5C60, 0x83DF, 0x8CED, 0x5858, + 0x79B1, 0x9D07, 0x7006, 0x701E, 0x5678, 0x9041, 0x9813, 0x90A3, 0x8B0E, + 0x7058, 0x6962, 0x79B0, 0x56CA, 0x724C, 0x9019, 0x79E4, 0x525D, 0x7BB8, + 0x6F51, 0x91B1, 0x633D, 0x6249, 0x6A0B, 0x67CA, 0x7A17, 0x903C, 0x5A9B, + 0x8B2C, 0x5EDF, 0x7015, 0x983B, 0x853D, 0x77A5, 0x5A29, 0x5E96, 0x6CE1, + 0x84EC, 0x9830, 0x9C52, 0x9EB5, 0x5132, 0x9905, 0x7C7E, 0x9453, 0x6108, + 0x7652, 0x7337, 0x7194, 0x8000, 0x840A, 0x907C, 0x6F23, 0x7149, 0x84EE, + 0x6994, 0x881F, 0x5154, 0x5189, 0x5195, 0x51A4, 0x5539, 0x5533, 0x55E4, + 0x5632, 0x56A5, 0x580B, 0x5ABE, 0x5BC3, 0x5C5B, 0x5E64, 0x6097, 0x6369, + 0x6406, 0x6522, 0x6583, 0x67A6, 0x67B4, 0x689B, 0x688E, 0x6E6E, 0x71D7, + 0x7228, 0x73CE, 0x7504, 0x750D, 0x7515, 0x7693, 0x787C, 0x7A31, 0x9F9D, + 0x7B99, 0x7C90, 0x7CAE, 0x7D9B, 0x7DAE, 0x7D9F, 0x7FD4, 0x822E, 0x828D, + 0x82D2, 0x8323, 0x8375, 0x8517, 0x853E, 0x8782, 0x87D2, 0x890A, 0x89AF, + 0x8ADE, 0x8B41, 0x8DDA, 0x8E09, 0x8F13, 0x8FEA, 0x8FE9, 0x9058, 0x6248, + 0x91C1, 0x95BB, 0x7762, 0x9724, 0x9760, 0x976D, 0x9824, 0x9B2E, 0x9B97, + 0x9BF2, 0x9EAA, 0x9F9C, 0x3001, 0x3002, 0x203E, 0xFF3F, 0x30FC, 0x2015, + 0x2010, 0x301C, 0x2016, 0xFF5C, 0x2026, 0x2025, 0xFF08, 0xFF09, 0x3014, + 0x3015, 0xFF3B, 0xFF3D, 0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, + 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0xFF1D, 0x3041, 0x3043, + 0x3045, 0x3047, 0x3049, 0x3063, 0x3083, 0x3085, 0x3087, 0x308E, 0x30A1, + 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30C3, 0x30E3, 0x30E5, 0x30E7, 0x30EE, + 0x30F5, 0x30F6, 0x3349, 0x3314, 0x3322, 0x334D, 0x3318, 0x3327, 0x3303, + 0x3336, 0x3351, 0x3357, 0x330D, 0x3326, 0x3323, 0x332B, 0x334A, 0x333B, + 0x301D, 0x301E, 0x3094, 0x304B, 0x3051, 0x82A6, 0x8328, 0x5653, 0x53A9, + 0x7259, 0x6C72, 0x7B08, 0x9957, 0x62F3, 0x9910, 0x976D, 0x717D, 0x7A7F, + 0x7BAD, 0x63C3, 0x83DF, 0x7962, 0x53DB, 0x7BC7, 0x8FC4, 0x7C3E, 0x50CA, + 0x5315, 0x55A9, 0x56AE, 0x5819, 0x591B, 0x5C28, 0x5ED0, 0x5ECF, 0x6241, + 0x66C1, 0x6C08, 0x6E23, 0x6EEC, 0x7A97, 0x7BDD, 0x7FE9, 0x8422, 0x8759, + 0x880E, 0x87D2, 0x9A19, 0x9EAD, 0xFFE4, 0xFF07, 0xFF02, 0x11A8, 0x25C1, + 0x25B7, 0x21E9, 0x21E7, 0x21E6, 0x21E8, 0x25A2, 0x2667, 0x2661, 0x2664, + 0x2662, 0x33A0, 0x33A2, 0x33A4, 0x33A5, 0x3397, 0x2113, 0x3398, 0x33B3, + 0x33B2, 0x33B1, 0x33B0, 0x3385, 0x3386, 0x3387, 0x33CB, 0x3390, 0x33D4, + 0x3396, 0x3322, 0x3316, 0x3318, 0x3315, 0x3303, 0x3323, 0x3357, 0x3342, + 0x3339, 0x333B, 0x3300, 0x3331, 0x3347, 0x331E, 0x332A, 0x33CD, 0x337F, + 0x2121, 0x260E, 0x3036, 0x3020, 0x00A9, 0x00AE, 0x0000, 0x2488, 0x2489, + 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2474, 0x2475, + 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, + 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, + 0x3251, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, + 0x2178, 0x2179, 0x3252, 0x3253, 0x3254, 0x3255, 0x3256, 0x3257, 0x3258, + 0x3259, 0x325A, 0x325B, 0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, 0x24A1, + 0x24A2, 0x24A3, 0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24AA, + 0x24AB, 0x24AC, 0x24AD, 0x24AE, 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3, + 0x24B4, 0x24B5, 0x3243, 0x323D, 0x323F, 0x3234, 0x3238, 0x3233, 0x323C, + 0x3242, 0x323E, 0x3236, 0x3235, 0x323B, 0x3240, 0x323A, 0x32B0, 0x32AD, + 0x32A9, 0x32AF, 0x3294, 0x32AA, 0x3298, 0x32AB, 0x3292, 0x3291, 0x3293, + 0x32AC, 0x32AE, 0x3296, 0x23A9, 0x23A8, 0x23A7, 0xFE38, 0x23AD, 0x23AC, + 0x23AB, 0xFE38, 0x23AB, 0x23AC, 0x23AD, 0xFE38, 0x23A7, 0x23A8, 0x23A9, + 0xFE38, 0x33CC, 0x3305, 0x00BD, 0x00BC, 0x339F, 0x33A3, 0x33A6, 0xFFFD, + 0xFFFD, 0x329E, 0x3388, 0x3389, 0x33C8, 0x222D, 0x5370, 0x3230, 0x322A, + 0x322B, 0x322C, 0x322D, 0x322E, 0x322F, 0x3237, 0x3241, 0x27A1, 0x21E6, + 0x21E7, 0x21E9, 0x25C9, 0x2660, 0x2665, 0x2663, 0x2666, 0x2600, 0x2601, + 0x2602, 0x2603, 0x261E, 0x261C, 0x261D, 0x261F, 0x3299, 0x24EA, 0x216A, + 0x216B, 0xFF10, 0xFF10, 0x3000, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, + 0x2586, 0x2587, 0x2588, 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A, + 0x2589, 0x2594, 0x2595, 0x256D, 0x256E, 0x2570, 0x256F, 0x2550, 0x255E, + 0x256A, 0x2561, 0x25E2, 0x25E3, 0x25E5, 0x25E4, 0x25CF, 0x0ED0, 0x2571, + 0x2572, 0x2573, 0x304B, 0x3051, 0x9022, 0x8FBB, 0xFF0C, 0x00B0, 0x3013, + 0x309C, 0x309B, 0x02CF, 0xFF0E, 0x2018, 0x2019, 0x201C, 0x201D, 0x201C, + 0x201E, 0x2018, 0x201A, 0x02BA, 0x51DC, 0x7199, 0x2776, 0x2777, 0x2778, + 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x0000, 0x0000, 0x0000, + 0x217A, 0x217B, 0x0000, 0x0000, 0x0000, 0x217F, 0x210A, 0x2109, 0x0000, + 0x0000, 0x3004, 0x21C6, 0x21C4, 0x21C5, 0x0000, 0x30F7, 0x30F8, 0x30F9, + 0x30FA, 0x5927, 0x5C0F, 0x329D, 0x63A7, 0x0000, 0x0000, 0x337B, 0x337F, + 0x0000, 0x0000, 0x3333, 0x334E, 0x3322, 0x3316, 0x3305, 0x3305, 0x3305, + 0x3333, 0x334E, 0x334E, 0x334E, 0x3303, 0x3318, 0x3315, 0x3339, 0x3339, + 0x3339, 0x3357, 0x3342, 0x3342, 0x3342, 0x3323, 0x333B, 0x3300, 0x331E, + 0x331E, 0x331E, 0x332A, 0x332A, 0x332A, 0x3347, 0x3331, 0x7E8A, 0x891C, + 0x9348, 0x9288, 0x84DC, 0x4FC9, 0x70BB, 0x6631, 0x68C8, 0x92F9, 0x66FB, + 0x5F45, 0x4E28, 0x4EE1, 0x4EFC, 0x4F00, 0x4F03, 0x4F39, 0x4F56, 0x4F92, + 0x4F8A, 0x4F9A, 0x4F94, 0x4FCD, 0x5040, 0x5022, 0x4FFF, 0x501E, 0x5046, + 0x5070, 0x5042, 0x5094, 0x50F4, 0x50D8, 0x514A, 0x5164, 0x519D, 0x51BE, + 0x51EC, 0x5215, 0x529C, 0x52A6, 0x52C0, 0x52DB, 0x5300, 0x5307, 0x5324, + 0x5372, 0x5393, 0x53B2, 0x53DD, 0xFA0E, 0x549C, 0x548A, 0x54A9, 0x54FF, + 0x5586, 0x5759, 0x5765, 0x57AC, 0x57C8, 0x57C7, 0xFA0F, 0xFA10, 0x589E, + 0x58B2, 0x590B, 0x5953, 0x595B, 0x595D, 0x5963, 0x59A4, 0x59BA, 0x5B56, + 0x5BC0, 0x752F, 0x5BD8, 0x5BEC, 0x5C1E, 0x5CA6, 0x5CBA, 0x5CF5, 0x5D27, + 0x5D53, 0xFA11, 0x5D42, 0x5D6D, 0x5DB8, 0x5DB9, 0x5DD0, 0x5F21, 0x5F34, + 0x5F67, 0x5FB7, 0x5FDE, 0x605D, 0x6085, 0x608A, 0x60DE, 0x60D5, 0x6120, + 0x60F2, 0x6111, 0x6137, 0x6130, 0x6198, 0x6213, 0x62A6, 0x63F5, 0x6460, + 0x649D, 0x64CE, 0x654E, 0x6600, 0x6615, 0x6609, 0x662E, 0x661E, 0x6624, + 0x6665, 0x6657, 0x6659, 0xFA12, 0x6673, 0x6699, 0x66A0, 0x66B2, 0x66BF, + 0x66FA, 0x670E, 0xF929, 0x6766, 0x67BB, 0x6852, 0x67C0, 0x6801, 0x6844, + 0x68CF, 0xFA13, 0x6968, 0xFA14, 0x6998, 0x69E2, 0x6A30, 0x6A6B, 0x6A46, + 0x6A73, 0x6A7E, 0x6AE2, 0x6AE4, 0x6BD6, 0x6C3F, 0x6C5C, 0x6C86, 0x6C6F, + 0x6CDA, 0x6D04, 0x6D87, 0x6D6F, 0x6D96, 0x6DAC, 0x6DCF, 0x6DF8, 0x6DF2, + 0x6DFC, 0x6E39, 0x6E5C, 0x6E27, 0x6E3C, 0x6EBF, 0x6F88, 0x6FB5, 0x6FF5, + 0x7005, 0x7007, 0x7028, 0x7085, 0x70AB, 0x710F, 0x7104, 0x715C, 0x7146, + 0x7147, 0xFA15, 0x71C1, 0x71FE, 0x72B1, 0x72BE, 0x7324, 0xFA16, 0x7377, + 0x73BD, 0x73C9, 0x73D6, 0x73E3, 0x73D2, 0x7407, 0x73F5, 0x7426, 0x742A, + 0x7429, 0x742E, 0x7462, 0x7489, 0x749F, 0x7501, 0x756F, 0x7682, 0x769C, + 0x769E, 0x769B, 0x76A6, 0xFA17, 0x7746, 0x52AF, 0x7821, 0x784E, 0x7864, + 0x787A, 0x7930, 0xFA18, 0xFA19, 0xFA1A, 0x7994, 0xFA1B, 0x799B, 0x7AD1, + 0x7AE7, 0xFA1C, 0x7AEB, 0x7B9E, 0xFA1D, 0x7D48, 0x7D5C, 0x7DB7, 0x7DA0, + 0x7DD6, 0x7E52, 0x7F47, 0x7FA1, 0xFA1E, 0x8301, 0x8362, 0x837F, 0x83C7, + 0x83F6, 0x8448, 0x84B4, 0x8553, 0x8559, 0x856B, 0xFA1F, 0x85B0, 0xFA20, + 0xFA21, 0x8807, 0x88F5, 0x8A12, 0x8A37, 0x8A79, 0x8AA7, 0x8ABE, 0x8ADF, + 0xFA22, 0x8AF6, 0x8B53, 0x8B7F, 0x8CF0, 0x8CF4, 0x8D12, 0x8D76, 0xFA23, + 0x8ECF, 0xFA24, 0xFA25, 0x9067, 0x90DE, 0xFA26, 0x9115, 0x9127, 0x91DA, + 0x91D7, 0x91DE, 0x91ED, 0x91EE, 0x91E4, 0x91E5, 0x9206, 0x9210, 0x920A, + 0x923A, 0x9240, 0x923C, 0x924E, 0x9259, 0x9251, 0x9239, 0x9267, 0x92A7, + 0x9277, 0x9278, 0x92E7, 0x92D7, 0x92D9, 0x92D0, 0xFA27, 0x92D5, 0x92E0, + 0x92D3, 0x9325, 0x9321, 0x92FB, 0xFA28, 0x931E, 0x92FF, 0x931D, 0x9302, + 0x9370, 0x9357, 0x93A4, 0x93C6, 0x93DE, 0x93F8, 0x9431, 0x9445, 0x9448, + 0x9592, 0xF9DC, 0xFA29, 0x969D, 0x96AF, 0x9733, 0x973B, 0x9743, 0x974D, + 0x974F, 0x9751, 0x9755, 0x9857, 0x9865, 0xFA2A, 0xFA2B, 0x9927, 0xFA2C, + 0x999E, 0x9A4E, 0x9AD9, 0x9ADC, 0x9B75, 0x9B72, 0x9B8F, 0x9BB1, 0x9BBB, + 0x9C00, 0x9D70, 0x9D6B, 0xFA2D, 0x9E19, 0x9ED1, 0x00AC, 0x005C, 0x0020, + 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, + 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, + 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, + 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, + 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, + 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, + 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, + 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, + 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, + 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC, 0x005C, 0x02BB, 0x007C, 0x007E, + 0x00A1, 0x00A2, 0x00A3, 0x2044, 0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, + 0x2039, 0x203A, 0xFB01, 0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, + 0x2022, 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301, + 0x0302, 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B, 0x0328, + 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00E6, + 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D, 0x00A9, 0x00AC, 0x00AE, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9, 0x00BC, 0x00BD, 0x00BE, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C7, 0x00C8, 0x00C9, + 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, + 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, + 0x00DD, 0x00DE, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, + 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F9, 0x00FA, + 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160, 0x0178, 0x017D, 0x0305, + 0x0161, 0x2122, 0x017E, 0x0030, 0x2002, 0x0021, 0x0022, 0x0023, 0x0024, + 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, + 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, + 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, + 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, + 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, + 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, + 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, + 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, + 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, + 0xFF40, 0x2032, 0x00A8, 0x2036, 0x00C4, 0x00F9, 0x00E9, 0x00ED, 0x00DF, + 0x00E7, 0x00C7, 0x00D1, 0x00F1, 0x00A2, 0x00A3, 0x00F3, 0x00FA, 0x00A1, + 0x00BF, 0x00BD, 0x00D6, 0x00DC, 0x00E4, 0x00EB, 0x00EF, 0x00F6, 0x00DC, + 0x00E2, 0x00EA, 0x00EE, 0x00F4, 0x00FC, 0x00E0, 0x00E9, 0x00E1, 0x007E, + 0x0030, 0x00AC, 0x005C, 0xFF60, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, + 0xFF66, 0xFF67, 0xFF68, 0xFF69, 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, + 0xFF6F, 0xFF70, 0xFF71, 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, + 0xFF78, 0xFF79, 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, + 0xFF81, 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, + 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91, 0xFF92, + 0xFF93, 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, + 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, 0x30F0, 0x30F1, 0x30EE, 0x30AB, 0x30B1, + 0x30F4, 0x30AC, 0x30AE, 0x30B0, 0x30B2, 0x30B4, 0x30B6, 0x30B8, 0x30BA, + 0x30BC, 0x30BE, 0x30C0, 0x30C2, 0x30C5, 0x30C7, 0x30C9, 0x30D0, 0x30D1, + 0x30D3, 0x30D4, 0x30D6, 0x30D7, 0x30D9, 0x30DA, 0x30DC, 0x30DD, 0xFF60, + 0x3092, 0x3041, 0x3043, 0x3045, 0x3047, 0x3049, 0x3083, 0x3085, 0x3087, + 0x3063, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, + 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, + 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, + 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, + 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, + 0x3093, 0x3090, 0x3091, 0x308E, 0x304C, 0x304E, 0x3050, 0x3052, 0x3054, + 0x3056, 0x3068, 0x305A, 0x305C, 0x305E, 0x3060, 0x3062, 0x3065, 0x3067, + 0x3069, 0x3070, 0x3071, 0x3073, 0x3074, 0x3076, 0x3077, 0x3079, 0x307A, + 0x307C, 0x307D, 0x301D, 0x301E, 0x005B, 0x005D, 0x3008, 0x3009, 0x300A, + 0x300B, 0x300E, 0x300F, 0x3010, 0x3011, 0x2012, 0xFF60, 0x2500, 0x2501, + 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, + 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, + 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, + 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, + 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E, + 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, + 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, + 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, + 0x254A, 0x254B, 0x25B2, 0x20AC, 0x2126, 0x2032, 0x2033, 0xFB00, 0xFB03, + 0xFB04, 0x0101, 0x012B, 0x016B, 0x0113, 0x014D, 0x0100, 0x012A, 0x016A, + 0x0112, 0x014C, 0x215B, 0x215C, 0x215D, 0x215E, 0x2153, 0x2154, 0x2070, + 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, + 0x2083, 0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x01CD, 0x011A, + 0x0000, 0x1EBC, 0x01CF, 0x0000, 0x0128, 0x01D1, 0x0000, 0x01D3, 0x016E, + 0x0168, 0x01CE, 0x011B, 0x0000, 0x1EBD, 0x01D0, 0x0000, 0x0129, 0x01D2, + 0x0000, 0x01D4, 0x016F, 0x0169, 0x0251, 0x0251, 0x0251, 0x01FD, 0x00E6, + 0x0254, 0x0254, 0x0254, 0x0259, 0x0259, 0x0259, 0x025A, 0x025A, 0x025A, + 0x025B, 0x025B, 0x025B, 0x006A, 0x014B, 0x0275, 0x028C, 0x028C, 0x028C, + 0x0292, 0x0283, 0x02D0, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, + 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, + 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, + 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, + 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, + 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, + 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, + 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, + 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, + 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC, + 0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3, 0x2044, 0x0192, + 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01, 0xFB02, 0x2012, + 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022, 0x201A, 0x201E, 0x201D, 0x00BB, + 0x2026, 0x2030, 0x00BF, 0x0301, 0x0302, 0x00AF, 0x0306, 0x0307, 0x0308, + 0x030A, 0x00B8, 0x030B, 0x0328, 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, + 0x00D8, 0x0152, 0x00BA, 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, + 0x002D, 0x00A9, 0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, + 0x00B9, 0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, + 0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, + 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00E0, 0x00E1, 0x00E2, + 0x00E3, 0x00E4, 0x00E5, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, + 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, + 0x00F6, 0x00F7, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, + 0x0160, 0x0178, 0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x20AC, + 0x2126, 0x2032, 0x2033, 0xFB00, 0xFB03, 0xFB04, 0x0101, 0x012B, 0x016B, + 0x0113, 0x014D, 0x0100, 0x012A, 0x016A, 0x0112, 0x014C, 0x215B, 0x215C, + 0x215D, 0x215E, 0x2153, 0x2154, 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, + 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, + 0x2087, 0x2088, 0x2089, 0x01CD, 0x011A, 0x0000, 0x1EBC, 0x01CF, 0x0000, + 0x0128, 0x01D1, 0x0000, 0x01D3, 0x016E, 0x0168, 0x01CE, 0x011B, 0x0000, + 0x1EBD, 0x01D0, 0x0000, 0x0129, 0x01D2, 0x0000, 0x01D4, 0x016F, 0x0169, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, + 0x0039, 0x0336, 0x002D, 0x003D, 0x002C, 0x0028, 0x0029, 0x002E, 0x002F, + 0x003A, 0x003B, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, + 0x0037, 0x0038, 0x0039, 0x0336, 0x002D, 0x003D, 0x002C, 0x0028, 0x0029, + 0x002E, 0x002F, 0x003A, 0x003B, 0x00B7, 0x20AC, 0x0000, 0x2153, 0x2154, + 0x00BE, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215A, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x215B, 0x215C, 0x215D, 0x215E, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0030, + 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, + 0x0030, 0x2163, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, + 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x0000, 0x0000, 0x0000, 0x2160, + 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, + 0x216A, 0x216B, 0x0000, 0x0000, 0x0000, 0x0041, 0x0042, 0x0043, 0x0044, + 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, + 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, + 0x0057, 0x0058, 0x0059, 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, + 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, + 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, + 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, + 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, + 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4, + 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, + 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, + 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, + 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, + 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, + 0x30F3, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, + 0x3228, 0x3229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x55B6, 0x5408, 0x6CEB, 0x554F, 0x7B54, 0x4F8B, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, + 0x0039, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x3063, 0x624D, 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, + 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x3007, 0x4E00, 0x4E8C, + 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x3007, + 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, + 0x3064, 0x624D, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, + 0x516B, 0x4E5D, 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, + 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x30B3, 0x3063, 0x30C3, 0x30A9, + 0x0000, 0x0000, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, + 0x2467, 0x2468, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x24D0, + 0x24D1, 0x24D2, 0x24D3, 0x24D4, 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, + 0x24DA, 0x24DB, 0x24DC, 0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2, + 0x24E3, 0x24E4, 0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x24B6, 0x24B7, + 0x24B8, 0x24B9, 0x24BA, 0x24BB, 0x24BC, 0x24BD, 0x24BE, 0x24BF, 0x24C0, + 0x24C1, 0x24C2, 0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7, 0x24C8, 0x24C9, + 0x24CA, 0x24CB, 0x24CC, 0x24CD, 0x24CE, 0x24CF, 0x3042, 0x3044, 0x3046, + 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, + 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, + 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, + 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, + 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, + 0x32D0, 0x32D1, 0x32D2, 0x32D3, 0x32D4, 0x32D5, 0x32D6, 0x32D7, 0x32D8, + 0x32D9, 0x32DA, 0x32DB, 0x32DC, 0x32DD, 0x32DE, 0x32DF, 0x32E0, 0x32E1, + 0x32E2, 0x32E3, 0x32E4, 0x32E5, 0x32E6, 0x32E7, 0x32E8, 0x32E9, 0x32EA, + 0x32EB, 0x32EC, 0x32ED, 0x32EE, 0x32EF, 0x32F0, 0x32F1, 0x32F2, 0x32F3, + 0x32F4, 0x32F5, 0x32F6, 0x32F7, 0x32F8, 0x32F9, 0x32FA, 0x32FB, 0x32FC, + 0x32FD, 0x32FE, 0x30F3, 0x3280, 0x3281, 0x3282, 0x3283, 0x3284, 0x3285, + 0x3286, 0x3287, 0x3288, 0x3289, 0x3290, 0x328A, 0x328B, 0x328C, 0x328D, + 0x328E, 0x328F, 0x8ABF, 0x329F, 0x526F, 0x6E1B, 0x6A19, 0x6B20, 0x57FA, + 0x7981, 0x32A0, 0x32A1, 0x329B, 0x329A, 0x32A3, 0x32A2, 0x3297, 0x51FA, + 0x329C, 0x3295, 0x6E08, 0x5897, 0x554F, 0x7B54, 0x4F8B, 0x96FB, 0x25CC, + 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, + 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007A, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, + 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, + 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, + 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, + 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, + 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, + 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, + 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, + 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, + 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, + 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, + 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, + 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x65E5, 0x6708, + 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F, 0x7B54, 0x4F8B, 0x25CF, + 0x0030, 0x0000, 0x0031, 0x0000, 0x0032, 0x0000, 0x0033, 0x0000, 0x0034, + 0x0000, 0x0035, 0x0000, 0x0036, 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, + 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, + 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007A, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, + 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, + 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, + 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, + 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, + 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, + 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, + 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, + 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, + 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, + 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, + 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, + 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x65E5, 0x6708, + 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x8CA0, 0x52DD, 0x554F, 0x7B54, + 0x4F8B, 0x25A1, 0x25A1, 0x0030, 0x0000, 0x0031, 0x0000, 0x0032, 0x0000, + 0x0033, 0x0000, 0x0034, 0x0000, 0x0035, 0x0000, 0x0036, 0x0000, 0x0037, + 0x0000, 0x0038, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, + 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, + 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, + 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042, 0x0043, 0x0044, + 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, + 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, + 0x0057, 0x0058, 0x0059, 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, + 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, + 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, + 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, + 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, + 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4, + 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, + 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, + 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, + 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, + 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, + 0x30F3, 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F, + 0x7B54, 0x4F8B, 0x25A0, 0x0030, 0x0000, 0x0031, 0x0000, 0x0032, 0x0000, + 0x0033, 0x0000, 0x0034, 0x0000, 0x0035, 0x0000, 0x0036, 0x0000, 0x0037, + 0x0000, 0x0038, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, + 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, + 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, + 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042, 0x0043, 0x0044, + 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, + 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, + 0x0057, 0x0058, 0x0059, 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, + 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, + 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, + 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, + 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, + 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4, + 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, + 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, + 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, + 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, + 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, + 0x30F3, 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F, + 0x7B54, 0x4F8B, 0x0030, 0x0000, 0x0031, 0x0000, 0x0032, 0x0000, 0x0033, + 0x0000, 0x0034, 0x0000, 0x0035, 0x0000, 0x0036, 0x0000, 0x0037, 0x0000, + 0x0038, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, + 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, + 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, + 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, + 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, + 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, + 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, + 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, + 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, + 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, + 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4, 0x30A6, + 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, + 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, + 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, + 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, + 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, + 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F, 0x7B54, + 0x4F8B, 0x25A0, 0x33C2, 0x33CD, 0x2116, 0x0000, 0x33D8, 0x33DA, 0x2121, + 0x2122, 0x0000, 0x2100, 0x33C2, 0x0000, 0x33C4, 0x2105, 0x3397, 0x3371, + 0x3398, 0x2113, 0x338D, 0x339B, 0x3396, 0x0000, 0x0000, 0x33D7, 0x33D8, + 0x0000, 0x0000, 0x0000, 0x3301, 0x3302, 0x3304, 0x3306, 0x0000, 0x3308, + 0x0000, 0x3307, 0x330A, 0x0000, 0x3309, 0x0000, 0x330B, 0x0000, 0x330C, + 0x330E, 0x330F, 0x3310, 0x3311, 0x3312, 0x3313, 0x0000, 0x3317, 0x0000, + 0x3319, 0x0000, 0x331A, 0x331B, 0x331C, 0x331D, 0x331F, 0x3320, 0x3321, + 0x3324, 0x0000, 0x3325, 0x0000, 0x0000, 0x3328, 0x3329, 0x0000, 0x332D, + 0x0000, 0x0000, 0x332E, 0x332F, 0x3330, 0x3332, 0x0000, 0x0000, 0x3334, + 0x3335, 0x333C, 0x0000, 0x0000, 0x0000, 0x3337, 0x0000, 0x3338, 0x333A, + 0x333D, 0x3341, 0x333E, 0x333F, 0x3340, 0x3343, 0x3344, 0x3345, 0x3346, + 0x3348, 0x334B, 0x334C, 0x334F, 0x3350, 0x0000, 0x0000, 0x3352, 0x3354, + 0x0000, 0x0000, 0x3353, 0x3355, 0x3356, 0x0000, 0x3301, 0x3302, 0x3304, + 0x3306, 0x0000, 0x3308, 0x0000, 0x3307, 0x330A, 0x0000, 0x3309, 0x0000, + 0x330B, 0x0000, 0x330C, 0x330E, 0x330F, 0x3310, 0x3311, 0x3312, 0x3313, + 0x0000, 0x3317, 0x0000, 0x3319, 0x0000, 0x331A, 0x331B, 0x331C, 0x331D, + 0x331F, 0x3320, 0x3321, 0x3324, 0x0000, 0x3325, 0x0000, 0x0000, 0x3328, + 0x3329, 0x0000, 0x332D, 0x0000, 0x0000, 0x332E, 0x332F, 0x3330, 0x3332, + 0x0000, 0x0000, 0x3334, 0x3335, 0x333C, 0x0000, 0x0000, 0x0000, 0x3337, + 0x0000, 0x3338, 0x333A, 0x333D, 0x3341, 0x333E, 0x333F, 0x3340, 0x3343, + 0x3344, 0x3345, 0x3346, 0x3348, 0x334B, 0x334C, 0x334F, 0x3350, 0x0000, + 0x0000, 0x3352, 0x3354, 0x0000, 0x0000, 0x3353, 0x3355, 0x3356, 0x337E, + 0x337D, 0x337C, 0x337B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x002D, 0x003D, 0x2103, 0x2640, 0x2642, 0x3013, + 0x3012, 0x300C, 0x300D, 0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, + 0xFF08, 0xFF09, 0x301D, 0x301E, 0x2018, 0x2019, 0x201C, 0x201D, 0x0027, + 0x0022, 0x0000, 0x2135, 0x03D0, 0x220A, 0x210F, 0x00B5, 0x03C6, 0x03DB, + 0x03D1, 0xFFFD, 0x2668, 0x2669, 0x266C, 0xFF1A, 0x00A9, 0x00A9, 0x00AE, + 0x00AE, 0x303B, 0x303B, 0x3033, 0x3034, 0x3035, 0x203C, 0x2049, 0x0021, + 0x203C, 0x2049, 0x244A, 0x0000, 0x2213, 0x2260, 0x2243, 0x2272, 0x2273, + 0x300C, 0x300D, 0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF5F, + 0xFF60, 0x300C, 0x300D, 0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, + 0xFF5F, 0xFF60, 0x239B, 0x239D, 0x239E, 0x23A0, 0x239D, 0x239B, 0x23A0, + 0x239E, 0x23A1, 0x23A3, 0x23A4, 0x23A6, 0x23A3, 0x23A1, 0x23A6, 0x23A4, + 0x23A1, 0x23A3, 0x23A4, 0x23A6, 0x23A3, 0x23A1, 0x23A6, 0x23A4, 0xFF5C, + 0x2015, 0x301D, 0x301E, 0x2018, 0x2019, 0x2018, 0x2019, 0x2702, 0x2702, + 0x2702, 0x2702, 0x303D, 0x3012, 0x309F, 0x534D, 0x2207, 0x2205, 0x22A0, + 0x2296, 0x2298, 0x2295, 0x2297, 0x229E, 0x2295, 0x0021, 0x25B3, 0x25C0, + 0x25B6, 0x21E6, 0x21E8, 0x21E7, 0x21E9, 0x21D0, 0x2194, 0x2198, 0x2199, + 0x2196, 0x2197, 0x21CC, 0x21C6, 0x21C4, 0x21C5, 0x2190, 0x2192, 0x2191, + 0x2193, 0x2194, 0x2195, 0x2504, 0x2506, 0x3030, 0x2307, 0x3030, 0x2307, + 0x3030, 0x2307, 0x3030, 0x2307, 0x3030, 0x2307, 0x2740, 0x273F, 0x25A1, + 0x25A0, 0x25A1, 0x25A1, 0x25A1, 0x25A1, 0x25A1, 0x25AB, 0x25A0, 0x25AA, + 0x271A, 0x271A, 0x25C7, 0x25C6, 0x25C7, 0x25C7, 0x25C7, 0x25C7, 0x25C7, + 0x25C6, 0x25C6, 0x25CE, 0x25C9, 0x25CB, 0x25E6, 0x25CF, 0x2022, 0x2756, + 0x2756, 0x2756, 0x2756, 0x3008, 0x3009, 0x3008, 0x3009, 0x300A, 0x300B, + 0x300A, 0x300B, 0x3053, 0x3053, 0x30B3, 0x30B3, 0x309D, 0x309E, 0x3041, + 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, + 0x304B, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3051, + 0x3052, 0x3053, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, + 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, + 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, + 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, + 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, + 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, + 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, + 0x3090, 0x3091, 0x3092, 0x3093, 0x3094, 0x30FD, 0x30FE, 0x30FC, 0x30A1, + 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, + 0x30F5, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30F6, 0x30B1, + 0x30B2, 0x30B3, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, + 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, + 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, + 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, + 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, + 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, + 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, + 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F7, 0x30F8, 0x30F9, 0x30FA, + 0x309D, 0x309E, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, + 0x3048, 0x3049, 0x304A, 0x304B, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, + 0x3050, 0x3051, 0x3051, 0x3052, 0x3053, 0x3053, 0x3054, 0x3055, 0x3056, + 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, + 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, + 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, + 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, + 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, + 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, + 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x3094, 0x30FD, + 0x30FE, 0x30FC, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, + 0x30A8, 0x30A9, 0x30AA, 0x30F5, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, + 0x30B0, 0x30F6, 0x30B1, 0x30B2, 0x30B3, 0x30B3, 0x30B4, 0x30B5, 0x30B6, + 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, + 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, + 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, + 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, + 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, + 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, + 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F7, + 0x30F8, 0x30F9, 0x30FA, 0x3001, 0x3002, 0x30FB, 0xFF0A, 0x203B, 0x25CB, + 0x25CE, 0x25C9, 0x25B3, 0x25B2, 0x30FD, 0x30FE, 0x309D, 0x309E, 0xFF08, + 0xFF09, 0x3014, 0x3015, 0xFF08, 0xFF09, 0x3014, 0x3015, 0x0030, 0x0031, + 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x3041, + 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, + 0x304B, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3051, + 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, + 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, + 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, + 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, + 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, + 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, + 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, + 0x3091, 0x3092, 0x3093, 0x3094, 0x3041, 0x3043, 0x3045, 0x3047, 0x3049, + 0x304B, 0x3051, 0x3063, 0x3083, 0x3085, 0x3087, 0x308E, 0x30A1, 0x30A2, + 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, + 0x30F5, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30F6, 0x30B2, + 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, + 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, + 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, + 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, + 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, + 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, + 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, + 0x30F2, 0x30F3, 0x30F4, 0x30A1, 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30F5, + 0x30F6, 0x30C3, 0x30E3, 0x30E5, 0x30E7, 0x30EE, 0x30FC, 0x30FC, 0x6CE8, + 0x20AC, 0x2126, 0x2032, 0x2033, 0xFB00, 0xFB03, 0xFB04, 0x0101, 0x012B, + 0x016B, 0x0113, 0x014D, 0x0100, 0x012A, 0x016A, 0x0112, 0x014C, 0x215B, + 0x215C, 0x215D, 0x215E, 0x2153, 0x2154, 0x2070, 0x2074, 0x2075, 0x2076, + 0x2077, 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, + 0x2086, 0x2087, 0x2088, 0x2089, 0x01CD, 0x011A, 0x0000, 0x1EBC, 0x01CF, + 0x0000, 0x0128, 0x01D1, 0x0000, 0x01D3, 0x016E, 0x0168, 0x01CE, 0x011B, + 0x0000, 0x1EBD, 0x01D0, 0x0000, 0x0129, 0x01D2, 0x0000, 0x01D4, 0x016F, + 0x0169, 0x0251, 0x0251, 0x0251, 0x01FD, 0x00E6, 0x0254, 0x0254, 0x0254, + 0x0259, 0x0259, 0x0259, 0x025A, 0x025A, 0x025A, 0x025B, 0x025B, 0x025B, + 0x006A, 0x014B, 0x0275, 0x028C, 0x028C, 0x028C, 0x0292, 0x0283, 0x02D0, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, + 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, + 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, + 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, + 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, + 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, + 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, + 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, + 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, + 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC, 0x005C, 0x02BB, 0x007C, + 0x007E, 0x00A1, 0x00A2, 0x00A3, 0x2044, 0x0192, 0x00A7, 0x00A4, 0x201C, + 0x00AB, 0x2039, 0x203A, 0xFB01, 0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, + 0x00B6, 0x2022, 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, + 0x0301, 0x0302, 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B, + 0x0328, 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152, 0x00BA, + 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D, 0x00A9, 0x00AC, + 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9, 0x00BC, 0x00BD, + 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C7, 0x00C8, + 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, + 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, + 0x00DC, 0x00DD, 0x00DE, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, + 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F9, + 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160, 0x0178, 0x017D, + 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x20AC, 0x2126, 0x2032, 0x2033, + 0xFB00, 0xFB03, 0xFB04, 0x0101, 0x012B, 0x016B, 0x0113, 0x014D, 0x0100, + 0x012A, 0x016A, 0x0112, 0x014C, 0x215B, 0x215C, 0x215D, 0x215E, 0x2153, + 0x2154, 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079, 0x2080, + 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, + 0x01CD, 0x011A, 0x0000, 0x1EBC, 0x01CF, 0x0000, 0x0128, 0x01D1, 0x0000, + 0x01D3, 0x016E, 0x0168, 0x01CE, 0x011B, 0x0000, 0x1EBD, 0x01D0, 0x0000, + 0x0129, 0x01D2, 0x0000, 0x01D4, 0x016F, 0x0169, 0x0030, 0x0031, 0x0032, + 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0336, 0x002D, + 0x003D, 0x002C, 0x0028, 0x0029, 0x002E, 0x002F, 0x003A, 0x003B, 0x0030, + 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, + 0x0336, 0x002D, 0x003D, 0x002C, 0x0028, 0x0029, 0x002E, 0x002F, 0x003A, + 0x003B, 0x00B7, 0x002D, 0x003D, 0x2103, 0x2640, 0x2642, 0x3013, 0x3012, + 0x300C, 0x300D, 0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF08, + 0xFF09, 0x301D, 0x301E, 0x2018, 0x2019, 0x201C, 0x201D, 0x0027, 0x0022, + 0x9038, 0x8B01, 0x7DE3, 0x9EC3, 0x6EAB, 0x798D, 0x6094, 0x6D77, 0x6168, + 0x6982, 0x6E34, 0x8910, 0x6F22, 0x5668, 0x65E2, 0x7948, 0x865B, 0x97FF, + 0x52E4, 0x8B39, 0x63ED, 0x64CA, 0x784F, 0x7A40, 0x6BBA, 0x7949, 0x8996, + 0x716E, 0x793E, 0x8005, 0x81ED, 0x795D, 0x6691, 0x7F72, 0x6D89, 0x72C0, + 0x613C, 0x771E, 0x7BC0, 0x7956, 0x50E7, 0x5C64, 0x5DE2, 0x618E, 0x8D08, + 0x537D, 0x5606, 0x8457, 0x5FB5, 0x61F2, 0x93AD, 0x798E, 0x9B2D, 0x7A81, + 0x96E3, 0x6885, 0x7E41, 0x6669, 0x5351, 0x7891, 0x8CD3, 0x654F, 0x4FAE, + 0x5002, 0x5840, 0x52C9, 0x6B65, 0x58A8, 0x6BCF, 0x514D, 0x623E, 0x7950, + 0x6B04, 0x9686, 0x865C, 0x6DDA, 0x985E, 0x66C6, 0x6B77, 0x7DF4, 0x934A, + 0x5ECA, 0x9304, 0x6982, 0x51B4, 0x634C, 0x86DB, 0x9089, 0x9022, 0x5049, + 0x7DEF, 0x9055, 0x53A9, 0x990C, 0x885B, 0x5EF6, 0x6CBF, 0x925B, 0x7FC1, + 0x82BD, 0x96C5, 0x5BB3, 0x6168, 0x6982, 0x6BBB, 0x6562, 0x8CAB, 0x5DCC, + 0x9811, 0x5E30, 0x8ECC, 0x7AAE, 0x5747, 0x5091, 0x7A74, 0x5065, 0x5EFA, + 0x9237, 0x6A8E, 0x4EA4, 0x516C, 0x66F4, 0x6821, 0x786C, 0x7D5E, 0x8003, + 0x8CFC, 0x964D, 0x62F7, 0x7F6A, 0x4F7F, 0x53F2, 0x59C9, 0x8B1D, 0x90AA, + 0x53CE, 0x8F2F, 0x67D4, 0x77AC, 0x821C, 0x696F, 0x677E, 0x8A1F, 0x4E08, + 0x57F4, 0x690D, 0x8077, 0x89AA, 0x9042, 0x636E, 0x6442, 0x8239, 0x7DCF, + 0x8061, 0x50CF, 0x8A95, 0x6065, 0x5146, 0x773A, 0x8074, 0x8DF3, 0x5EAD, + 0x5EF7, 0x8247, 0x6843, 0x9003, 0x6D3E, 0x6392, 0x8F29, 0x73ED, 0x9812, + 0x60B2, 0x6249, 0x6590, 0x7DCB, 0x8AB9, 0x8CA7, 0x7236, 0x847A, 0x5206, + 0x5674, 0x61A4, 0x7C89, 0x7D1B, 0x96F0, 0x853D, 0x4FBF, 0x6367, 0x76C6, + 0x685D, 0x8108, 0x8036, 0x7FFC, 0x540F, 0x96A3, 0x9E9F, 0x9E97, 0x806F, + 0x807E, 0x6E7E, 0x5085, 0x5193, 0x51DB, 0x5315, 0x5340, 0x96D9, 0x55A9, + 0x56C1, 0x570D, 0x58AB, 0x59DA, 0x5A36, 0x5ABE, 0x5D4E, 0x5D87, 0x5DC9, + 0x5DD3, 0x5F2D, 0x5F98, 0x60D8, 0x613D, 0x61FE, 0x6268, 0x62CF, 0x651D, + 0x640F, 0x64F2, 0x655D, 0x665F, 0x67A9, 0x67E7, 0x696B, 0x6930, 0x69A7, + 0x6A44, 0x6A90, 0x6C08, 0x6C13, 0x6E23, 0x6F11, 0x6EFE, 0x6F3E, 0x71FF, + 0x73E5, 0x7432, 0x745F, 0x74E0, 0x750C, 0x7672, 0x792A, 0x78D4, 0x79BA, + 0x7A19, 0x7A95, 0x7CF2, 0x7D73, 0x7DDD, 0x7E35, 0x7FAE, 0x7FE1, 0x805A, + 0x805F, 0x8073, 0x8070, 0x8076, 0x8153, 0x818A, 0x81B5, 0x81CD, 0x83F2, + 0x8555, 0x85D5, 0x871A, 0x8836, 0x889E, 0x88D8, 0x88F4, 0x892B, 0x893B, + 0x896A, 0x896F, 0x8A1D, 0x8D05, 0x8D0F, 0x9F4E, 0x8E91, 0x8EA1, 0x9052, + 0x900E, 0x9130, 0x9156, 0x9158, 0x9165, 0x9173, 0x9172, 0x91A2, 0x91AF, + 0x91AA, 0x91B4, 0x91BA, 0x9477, 0x9698, 0x973D, 0x9760, 0x9771, 0x980C, + 0x9873, 0x98C3, 0x9A45, 0x9B4D, 0x9B58, 0x9BC6, 0x9BE1, 0x9BF1, 0x9D48, + 0x9DCF, 0x9F08, 0x6271, 0x6697, 0x610F, 0x8863, 0x9055, 0x907A, 0x78EF, + 0x54E1, 0x2ED7, 0x2EBD, 0x53A9, 0x74DC, 0x904B, 0x990C, 0x885E, 0x92B3, + 0x95B1, 0x5EF6, 0x63F4, 0x6CBF, 0x7159, 0x9060, 0x925B, 0x65BC, 0x5F80, + 0x7FC1, 0x5378, 0x97F3, 0x5316, 0x82B1, 0x83D3, 0x8CA8, 0x904E, 0x82BD, + 0x96C5, 0x9913, 0x5EFB, 0x7070, 0x5BB3, 0x6168, 0x6168, 0x6168, 0x69EA, + 0x6982, 0x676E, 0x89D2, 0x9694, 0x5272, 0x8F44, 0x938C, 0x82C5, 0x5BD2, + 0x74B0, 0x7DE9, 0x7F36, 0x9084, 0x9592, 0x97D3, 0x8218, 0x5371, 0x559C, + 0x3402, 0x3402, 0x5E7E, 0x65E3, 0x671F, 0x6A5F, 0x8D77, 0x98E2, 0x5409, + 0x55AB, 0x8650, 0x9006, 0x53CA, 0x5438, 0x6025, 0x7D1A, 0x5DE8, 0x62D2, + 0x8DDD, 0x9B5A, 0x9B5A, 0x537F, 0x5F3A, 0x6050, 0x69C1, 0x6A4B, 0x6A4B, + 0x9115, 0x97FF, 0x9957, 0x6681, 0x2EA9, 0x8FD1, 0x5036, 0x77E9, 0x5177, + 0x865E, 0x7A7A, 0x9047, 0x6ADB, 0x5553, 0x5951, 0x6075, 0x6167, 0x8FCE, + 0x5091, 0x6F54, 0x7A74, 0x2EBC, 0x2EBC, 0x517C, 0x5238, 0x61B2, 0x6743, + 0x80A9, 0x8B19, 0x9063, 0x539F, 0x8A01, 0x6236, 0x96C7, 0x9867, 0x5433, + 0x5A1B, 0x8AA4, 0x5DE5, 0x614C, 0x6285, 0x63A7, 0x69CB, 0x6D69, 0x6E2F, + 0x8015, 0x8154, 0x8352, 0x8B1B, 0x8CFC, 0x543F, 0x9177, 0x8170, 0x7511, + 0x8FBC, 0x4ECA, 0x9396, 0x5EA7, 0x5F69, 0x63A1, 0x6B72, 0x83DC, 0x51B4, + 0x54B2, 0x524A, 0x7522, 0x9910, 0x59FF, 0x59FF, 0x5DFF, 0x8AEE, 0x8AEE, + 0x8CC7, 0x8CC7, 0x6B21, 0x6B21, 0x6ECB, 0x73BA, 0x53F1, 0x6368, 0x659C, + 0x90AA, 0x52FA, 0x7235, 0x7235, 0x914C, 0x5F31, 0x4E3B, 0x53D7, 0x6388, + 0x5468, 0x7D42, 0x7FD2, 0x8846, 0x9031, 0x4F4F, 0x8853, 0x8FF0, 0x5DE1, + 0x9075, 0x9075, 0x6240, 0x66F8, 0x5973, 0x52DD, 0x5546, 0x5BB5, 0x5C06, + 0x2E8C, 0x2E8D, 0x5C19, 0x6D88, 0x785D, 0x8096, 0x4E08, 0x5B82, 0x57CE, + 0x60C5, 0x57F4, 0x98FE, 0x690D, 0x6B96, 0x98DF, 0x98E0, 0x2EDE, 0x378D, + 0x4FB5, 0x2E97, 0x6D78, 0x771F, 0x9032, 0x4EBB, 0x4EBA, 0x5203, 0x5C0B, + 0x8A0A, 0x8A0A, 0x8FC5, 0x8870, 0x9042, 0x351F, 0x52E2, 0x6210, 0x76DB, + 0x8056, 0x8980, 0x8AA0, 0x8ACB, 0x975C, 0x975C, 0x7A05, 0x8106, 0x96BB, + 0x7C4D, 0x7BC0, 0x8AAA, 0x96EA, 0x7D76, 0x6247, 0x6F98, 0x7FA1, 0x8239, + 0x9078, 0x9077, 0x524D, 0x5168, 0x6383, 0x63F7, 0x7626, 0x8D70, 0x9001, + 0x906D, 0x9020, 0x2ECA, 0x901F, 0x8CCA, 0x5C0A, 0x5C0A, 0x59A5, 0x6CF0, + 0x9000, 0x902E, 0x968A, 0x9BDB, 0x5927, 0x3427, 0x7027, 0x9054, 0x812B, + 0x4E39, 0x6B4E, 0x70AD, 0x8A95, 0x6696, 0x5024, 0x7F6E, 0x7BC9, 0x2EAE, + 0x7B51, 0x9010, 0x67F1, 0x6CE8, 0x99D0, 0x5F6B, 0x5FB5, 0x61F2, 0x671D, + 0x6F6E, 0x8ABF, 0x76F4, 0x6715, 0x6715, 0x589C, 0x8FFD, 0x901A, 0x576A, + 0x91E3, 0x5448, 0x5E1D, 0x7A0B, 0x7684, 0x9069, 0x8FED, 0x6DFB, 0x514E, + 0x9014, 0x783A, 0x5721, 0x571F, 0x51AC, 0x5510, 0x7CD6, 0x85E4, 0x8B04, + 0x9003, 0x900F, 0x9A30, 0x5C0E, 0x9053, 0x5451, 0x3B88, 0x5167, 0x8089, + 0x4E73, 0x5FCD, 0x8A8D, 0x5BE7, 0x7D0D, 0x8987, 0x6D3E, 0x80BA, 0x535A, + 0x8584, 0x8FEB, 0x7E1B, 0x8087, 0x4E37, 0x6F51, 0x91B1, 0x4F34, 0x5224, + 0x534A, 0x5E06, 0x7554, 0x6669, 0x8543, 0x907F, 0x5FAE, 0x9F3B, 0x5339, + 0x2EAA, 0x5F65, 0x59EC, 0x59EB, 0x8A55, 0x5E99, 0x75C5, 0x5A66, 0x6577, + 0x6D6E, 0x8CA0, 0x8CA0, 0x670D, 0x8986, 0x4E19, 0x5E63, 0x5E73, 0x5F0A, + 0x8511, 0x504F, 0x7DE8, 0x8FD4, 0x904D, 0x7C3F, 0x5305, 0x5D29, 0x62B1, + 0x670B, 0x7832, 0x7E2B, 0x80DE, 0x840C, 0x90A6, 0x90A6, 0x98FD, 0x9D6C, + 0x4EA1, 0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x671B, 0x671B, 0x5192, 0x6469, + 0x7FFB, 0x51E1, 0x78E8, 0x9B54, 0x2FC7, 0x69D9, 0x685D, 0x4FE3, 0x53C8, + 0x7E6D, 0x9EBF, 0x8108, 0x660E, 0x76DF, 0x8FF7, 0x5984, 0x52D0, 0x76F2, + 0x8017, 0x623E, 0x7D0B, 0x9580, 0x7D04, 0x8E8D, 0x687A, 0x687A, 0x6801, + 0x6109, 0x8AED, 0x8F38, 0x52C7, 0x6709, 0x7336, 0x7336, 0x7337, 0x88D5, + 0x904A, 0x66DC, 0x2EB7, 0x8981, 0x990A, 0x7FCC, 0x7FFC, 0x8EB6, 0x862D, + 0x7387, 0x9F8D, 0x9F8D, 0x65C5, 0x6881, 0x71D0, 0x96A3, 0x9C57, 0x9E9F, + 0x7C7B, 0x5EC9, 0x6190, 0x9023, 0x6717, 0x8002, 0x8107, 0x50CA, 0x511A, + 0x5154, 0x5195, 0x2E87, 0x528D, 0x52D7, 0x52F9, 0x5349, 0x353E, 0x53DF, + 0x66FC, 0x5533, 0x55E4, 0x5455, 0x56C0, 0x5939, 0x5A1C, 0x5AC2, 0x5B73, + 0x5BC3, 0x5C14, 0x37E2, 0x5CE6, 0x5E54, 0x4E48, 0x5EE3, 0x6097, 0x62D4, + 0x62CC, 0x641C, 0x63C6, 0x6428, 0x8209, 0x631B, 0x665F, 0x665F, 0x6663, + 0x66F5, 0x675E, 0x689D, 0x688D, 0x69F6, 0x6961, 0x5BE8, 0x5BE8, 0x69BB, + 0x6BCC, 0x6F11, 0x6E17, 0x6F98, 0x6CAA, 0x6CAA, 0x701B, 0x7162, 0x723B, + 0x4E2C, 0x731C, 0x74CA, 0x74EF, 0x7575, 0x75EC, 0x764E, 0x3FB1, 0x776A, + 0x77A9, 0x7940, 0x7953, 0x7953, 0x9F4B, 0x79AE, 0x9083, 0x7B53, 0x7C11, + 0x7C14, 0x4264, 0x7C50, 0x7C58, 0x7D46, 0x7D63, 0x7E22, 0x7E22, 0x7E48, + 0x7E35, 0x7E43, 0x7E8C, 0x7F50, 0x7F51, 0x7F51, 0x7F51, 0x7FC5, 0x7FC6, + 0x7FE9, 0x8141, 0x4453, 0x8258, 0x8279, 0x2EBF, 0x2EC0, 0x82E3, 0x5179, + 0x83A2, 0x8420, 0x83BD, 0x84F4, 0x856D, 0x8587, 0x85F4, 0x4E55, 0x8737, + 0x873B, 0x8805, 0x87BD, 0x867D, 0x8836, 0x8944, 0x88C6, 0x89BD, 0x8ADB, + 0x8B3E, 0x8B5A, 0x8D73, 0x8D99, 0x8DCB, 0x8E34, 0x8E4A, 0x8FEF, 0x9087, + 0x8FFA, 0x901E, 0x9035, 0x9050, 0x8FC8, 0x9081, 0x908A, 0x908A, 0x908A, + 0x908A, 0x908A, 0x908A, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, + 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x92CF, 0x93DD, 0x95BC, + 0x9621, 0x96B2, 0x975C, 0x9839, 0x98EB, 0x9903, 0x9909, 0x9945, 0x9945, + 0x994B, 0x9A08, 0x9A5F, 0x9A65, 0x9AEF, 0x9B18, 0x9BDF, 0x9D09, 0x9D08, + 0x9EA5, 0x9ECC, 0x9F08, 0x9F4A, 0x9F63, 0x9F67, 0x9F6C, 0x7199, 0x7199, + 0x891C, 0x68C8, 0x66FB, 0x5F45, 0x5300, 0x5389, 0x5953, 0xFA11, 0x6852, + 0x6A73, 0x6D87, 0xFA15, 0x8A12, 0x4E04, 0x4E05, 0x4E1F, 0x4E2B, 0x4E2F, + 0x4E30, 0x4E40, 0x4E41, 0x4E44, 0x4E5A, 0x4E7F, 0x4E8D, 0x4E96, 0x4EB9, + 0x4ED0, 0x4EE0, 0x4EFD, 0x4EFF, 0x4F0B, 0x4F15, 0x4F60, 0x4F3B, 0x4F49, + 0x4F54, 0x4F7A, 0x4F7D, 0x4F7E, 0x4F97, 0x4FBE, 0x4FCF, 0x4FFD, 0x5000, + 0x5001, 0x5010, 0x501B, 0x5027, 0x502E, 0x5057, 0x5066, 0x506A, 0x503B, + 0x508F, 0x5096, 0x509C, 0x50CC, 0x50E6, 0x50E9, 0x50EF, 0x5108, 0x510B, + 0x5110, 0x511B, 0x511E, 0x515F, 0x51A1, 0x51BC, 0x51DE, 0x51EE, 0x51F4, + 0x5201, 0x5202, 0x5213, 0x5249, 0x5261, 0x5266, 0x5293, 0x52C8, 0x52F0, + 0x530A, 0x530B, 0x533E, 0x534C, 0x534B, 0x5361, 0x536C, 0x53AB, 0x53DA, + 0x53E6, 0x53F5, 0x5427, 0x544D, 0x5466, 0x546B, 0x5474, 0x548D, 0x5496, + 0x54A1, 0x54AD, 0x54B9, 0x54BF, 0x54C6, 0x54CD, 0x550E, 0x552B, 0x5535, + 0x554A, 0x5560, 0x5561, 0x5588, 0x558E, 0x5608, 0x560E, 0x560F, 0x5637, + 0x563F, 0x5649, 0x564B, 0x564F, 0x5666, 0x5669, 0x566F, 0x5671, 0x5672, + 0x5695, 0x569A, 0x56AC, 0x56AD, 0x56B1, 0x56C9, 0x56DD, 0x56E4, 0x570A, + 0x5715, 0x5723, 0x572F, 0x5733, 0x5734, 0x574C, 0x5770, 0x578C, 0x579C, + 0x57B8, 0x57E6, 0x57ED, 0x57F5, 0x57F6, 0x57FF, 0x5809, 0x5820, 0x5832, + 0x587C, 0x5880, 0x58A9, 0x58CE, 0x58D0, 0x58D4, 0x58DA, 0x58E9, 0x590C, + 0x5924, 0x592F, 0x5961, 0x596D, 0x59CA, 0x59D2, 0x59DD, 0x59E3, 0x59E4, + 0x5A04, 0x5A0C, 0x5A23, 0x5A47, 0x5A55, 0x5A63, 0x5A6D, 0x5A7E, 0x5A9E, + 0x5AA7, 0x5AAC, 0x5AB3, 0x5AE0, 0x5B00, 0x5B19, 0x5B25, 0x5B2D, 0x5B41, + 0x5B7C, 0x5B7E, 0x5B7F, 0x5B8A, 0x5C23, 0x5C2B, 0x5C30, 0x5C63, 0x5C69, + 0x5C7C, 0x5CCB, 0x5CD2, 0x5CF4, 0x5D24, 0x5D26, 0x5D43, 0x5D46, 0x5D4A, + 0x5D92, 0x5D94, 0x5D99, 0x5DA0, 0x5DD8, 0x5DE0, 0x5DF8, 0x5E00, 0x5E12, + 0x5E14, 0x5E15, 0x5E18, 0x5E2E, 0x5E58, 0x5E6B, 0x5E6C, 0x5EA8, 0x5EAA, + 0x5EBE, 0x5EBF, 0x5ECB, 0x5ED2, 0x5F07, 0x5F0E, 0x5F1C, 0x5F1D, 0x5F22, + 0x5F28, 0x5F36, 0x5F3B, 0x5F40, 0x5F50, 0x5F58, 0x5F64, 0x5F89, 0x5F9C, + 0x5FA7, 0x5FA4, 0x5FAF, 0x5FB8, 0x5FC4, 0x5FC9, 0x5FE1, 0x5FE9, 0x5FED, + 0x5FFC, 0x6017, 0x601A, 0x6033, 0x6061, 0x607F, 0x609E, 0x60A4, 0x60B0, + 0x60CB, 0x60DB, 0x60F8, 0x6112, 0x6113, 0x6114, 0x611C, 0x617C, 0x618D, + 0x619F, 0x61A8, 0x61C2, 0x61DF, 0x6215, 0x6229, 0x6243, 0x6246, 0x624C, + 0x6251, 0x6256, 0x62C4, 0x62FC, 0x630A, 0x630D, 0x6318, 0x6339, 0x6342, + 0x6343, 0x6365, 0x6374, 0x637D, 0x6384, 0x6387, 0x6390, 0x639E, 0x63D1, + 0x63DC, 0x6409, 0x6410, 0x6422, 0x6454, 0x645B, 0x646D, 0x647B, 0x64BE, + 0x64BF, 0x64E5, 0x64F7, 0x64FB, 0x6504, 0x6516, 0x6519, 0x6547, 0x6567, + 0x6581, 0x6585, 0x65C2, 0x65F0, 0x65F2, 0x662C, 0x664C, 0x665B, 0x665C, + 0x6661, 0x666B, 0x6677, 0x66A4, 0x66C8, 0x66EC, 0x6705, 0x6713, 0x6733, + 0x6748, 0x674C, 0x6776, 0x677B, 0x67B0, 0x67B2, 0x67F9, 0x67D7, 0x67D9, + 0x67F0, 0x682C, 0x6830, 0x6831, 0x685B, 0x6872, 0x6875, 0x687A, 0x6884, + 0x68A5, 0x68B2, 0x68D0, 0x68D6, 0x68E8, 0x68ED, 0x68F0, 0x68F1, 0x68FC, + 0x6911, 0x6913, 0x6935, 0x693B, 0x6957, 0x6963, 0x6972, 0x697F, 0x6980, + 0x69A6, 0x69AD, 0x69B7, 0x69D6, 0x69D7, 0x6A01, 0x6A0F, 0x6A15, 0x6A28, + 0x6A34, 0x6A3E, 0x6A45, 0x6A50, 0x6A51, 0x6A56, 0x6A5B, 0x6A83, 0x6A89, + 0x6A91, 0x6A9D, 0x6A9E, 0x6A9F, 0x6ADC, 0x6AE7, 0x6AEC, 0x6B1E, 0x6B24, + 0x6B35, 0x6B46, 0x6B56, 0x6B60, 0x6B82, 0x6BBE, 0x6BE1, 0x6BF1, 0x6C10, + 0x6C33, 0x6C35, 0x6C3A, 0x6C59, 0x6C76, 0x6C7B, 0x6C85, 0x6C95, 0x6C9C, + 0x6CD0, 0x6CD4, 0x6CD6, 0x6CE0, 0x6CEB, 0x6CEC, 0x6CEE, 0x6D0A, 0x6D0E, + 0x6D11, 0x6D2E, 0x6D57, 0x6D5E, 0x6D65, 0x6D82, 0x6DBF, 0x6DC4, 0x6DCA, + 0x6DD6, 0x6DE9, 0x6E22, 0x6E51, 0x6EC7, 0x6ECA, 0x6ECE, 0x6EFD, 0x6F1A, + 0x6F2A, 0x6F2F, 0x6F33, 0x6F5A, 0x6F5E, 0x6F62, 0x6F7D, 0x6F8B, 0x6F8D, + 0x6F92, 0x6F94, 0x6F9A, 0x6FA7, 0x6FA8, 0x6FB6, 0x6FDA, 0x6FDE, 0x6FF9, + 0x7039, 0x703C, 0x704A, 0x7054, 0x705D, 0x705E, 0x7064, 0x706C, 0x707E, + 0x7081, 0x7095, 0x70B7, 0x70D3, 0x70D4, 0x70D8, 0x70DC, 0x7107, 0x7120, + 0x7131, 0x714A, 0x7152, 0x7160, 0x7179, 0x7192, 0x71B3, 0x71CB, 0x71D3, + 0x71D6, 0x7200, 0x721D, 0x722B, 0x7238, 0x7241, 0x7253, 0x7255, 0x7256, + 0x725C, 0x728D, 0x72AD, 0x72B4, 0x72C7, 0x72FB, 0x7304, 0x7305, 0x7328, + 0x7331, 0x7343, 0x736C, 0x737C, 0x7383, 0x7385, 0x7386, 0x7395, 0x739E, + 0x739F, 0x73A0, 0x73A6, 0x73AB, 0x73B5, 0x73B7, 0x73BC, 0x73CF, 0x73D9, + 0x73E9, 0x73F4, 0x73FD, 0x7404, 0x740A, 0x741A, 0x741B, 0x7424, 0x7428, + 0x742C, 0x742F, 0x7430, 0x7431, 0x7439, 0x7444, 0x7447, 0x744B, 0x744D, + 0x7451, 0x7457, 0x7466, 0x746B, 0x7471, 0x7480, 0x7485, 0x7486, 0x7487, + 0x7490, 0x7498, 0x749C, 0x74A0, 0x74A3, 0x74A8, 0x74AB, 0x74B5, 0x74BF, + 0x74C8, 0x74DA, 0x74DE, 0x754E, 0x7579, 0x7581, 0x7590, 0x7592, 0x7593, + 0x75B4, 0x75E4, 0x75F9, 0x7600, 0x760A, 0x7615, 0x7616, 0x7619, 0x761E, + 0x762D, 0x7635, 0x7643, 0x764B, 0x7665, 0x766D, 0x766F, 0x7671, 0x7674, + 0x76A4, 0x76A5, 0x76C5, 0x76CC, 0x76EC, 0x76FC, 0x7734, 0x7736, 0x775C, + 0x775F, 0x7760, 0x7772, 0x777D, 0x7795, 0x77AA, 0x77E6, 0x77F0, 0x77F4, + 0x7806, 0x7822, 0x782D, 0x782E, 0x7830, 0x7835, 0x7868, 0x789E, 0x78C8, + 0x78CC, 0x78CE, 0x78E4, 0x78E0, 0x78E1, 0x78F2, 0x78F7, 0x78FB, 0x7931, + 0x7934, 0x793B, 0x793D, 0x7945, 0x795B, 0x795C, 0x798B, 0x7996, 0x7998, + 0x79B8, 0x79BB, 0x79CA, 0x79DA, 0x7A03, 0x7A09, 0x7A11, 0x7A1E, 0x7A2D, + 0x7A39, 0x7A45, 0x7A4C, 0x7A5D, 0x7A60, 0x7A6D, 0x7A78, 0x7AA0, 0x7AA3, + 0x7AB3, 0x7ABB, 0x7ABC, 0x7AC6, 0x7B07, 0x7B14, 0x7B27, 0x7B31, 0x7B47, + 0x7B4E, 0x7B60, 0x7B69, 0x7B6D, 0x7B72, 0x7B91, 0x7BAF, 0x7BD7, 0x7BD9, + 0x7C0B, 0x7C0F, 0x7C20, 0x7C26, 0x7C31, 0x7C36, 0x7C51, 0x7C59, 0x7C67, + 0x7C6E, 0x7C70, 0x7CBC, 0x7CBF, 0x7CC8, 0x7CC9, 0x7CD7, 0x7CD9, 0x7CDD, + 0x7CEB, 0x7D07, 0x7D08, 0x7D09, 0x7D13, 0x7D1D, 0x7D23, 0x7D41, 0x7D53, + 0x7D59, 0x7D5D, 0x7D7A, 0x7D86, 0x7D8B, 0x7D8C, 0x7DCC, 0x7DEB, 0x7DF1, + 0x7DF9, 0x7E08, 0x7E11, 0x7E15, 0x7E20, 0x7E47, 0x7E62, 0x7E6E, 0x7E73, + 0x7E8D, 0x7E91, 0x7E98, 0x7F44, 0x7F4F, 0x7F52, 0x7F53, 0x7F61, 0x7F91, + 0x7FBF, 0x7FCE, 0x7FDF, 0x7FE5, 0x7FEC, 0x7FEE, 0x7FEF, 0x7FFA, 0x800E, + 0x8011, 0x8014, 0x8024, 0x8026, 0x803A, 0x803C, 0x8060, 0x8071, 0x8075, + 0x809E, 0x80A6, 0x80AB, 0x80D7, 0x80D8, 0x8116, 0x8118, 0x813A, 0x814A, + 0x814C, 0x8181, 0x8184, 0x81B4, 0x81CF, 0x81F9, 0x8203, 0x8221, 0x8232, + 0x8234, 0x8246, 0x824B, 0x824F, 0x828E, 0x82AE, 0x82B7, 0x82BE, 0x82C6, + 0x82FE, 0x8343, 0x8351, 0x8355, 0x8386, 0x838D, 0x8392, 0x8398, 0x83A9, + 0x83BF, 0x83C0, 0x83EA, 0x840F, 0x8411, 0x844A, 0x8476, 0x84A8, 0x84AF, + 0x84C0, 0x84C2, 0x84F0, 0x84FD, 0x850C, 0x8534, 0x855E, 0x858F, 0x85B7, + 0x85CE, 0x85AD, 0x8612, 0x8629, 0x8652, 0x8663, 0x866C, 0x866F, 0x867A, + 0x868D, 0x8691, 0x8698, 0x86A7, 0x86A8, 0x86FA, 0x86FD, 0x870B, 0x8713, + 0x8719, 0x871E, 0x8728, 0x873E, 0x8771, 0x8788, 0x8799, 0x87AC, 0x87AD, + 0x87B5, 0x87D6, 0x87EB, 0x87ED, 0x8801, 0x8803, 0x8806, 0x880B, 0x8814, + 0x881C, 0x8856, 0x885F, 0x8864, 0x8898, 0x88AA, 0x88BD, 0x88BE, 0x88CA, + 0x88D2, 0x88DB, 0x88F0, 0x88F1, 0x8906, 0x8918, 0x8919, 0x891A, 0x8927, + 0x8930, 0x893E, 0x897B, 0x89D4, 0x89D6, 0x89E5, 0x89F1, 0x8A07, 0x8A0F, + 0x8A15, 0x8A22, 0x8A4E, 0x8A7F, 0x8AF4, 0x8B1F, 0x8B37, 0x8B43, 0x8B44, + 0x8B54, 0x8B9C, 0x8B9E, 0x8C47, 0x8C54, 0x8C73, 0x8CA4, 0x8CD9, 0x8CE1, + 0x8CF8, 0x8CFE, 0x8D1B, 0x8D69, 0x8D6C, 0x8D84, 0x8D8D, 0x8D95, 0x8DA6, + 0x8DC6, 0x8DCE, 0x8DE4, 0x8DEC, 0x8E20, 0x8E4B, 0x8E6C, 0x8E70, 0x8E7A, + 0x8E92, 0x8EAE, 0x8EB3, 0x8ED1, 0x8ED4, 0x8EF9, 0x8F17, 0x8F36, 0x8FA6, + 0x8FB5, 0x8FB6, 0x8FC6, 0x8FE0, 0x8FE4, 0x8FF6, 0x9002, 0x902C, 0x9044, + 0x9088, 0x9095, 0x9099, 0x909B, 0x90A2, 0x90B4, 0x90D7, 0x90DD, 0x90F4, + 0x9117, 0x911C, 0x9131, 0x913A, 0x913D, 0x9148, 0x915B, 0x9161, 0x9164, + 0x918E, 0x919E, 0x91A8, 0x91AD, 0x91AE, 0x91B2, 0x91BC, 0x91F0, 0x91F7, + 0x91FB, 0x9207, 0x9228, 0x9233, 0x9238, 0x9243, 0x9247, 0x924F, 0x9260, + 0x92C2, 0x92CB, 0x92CC, 0x92DF, 0x930D, 0x9315, 0x931F, 0x9327, 0x9347, + 0x9352, 0x9365, 0x936A, 0x936D, 0x939B, 0x93BA, 0x93A9, 0x93C1, 0x93CA, + 0x93E2, 0x93FA, 0x93FD, 0x940F, 0x9434, 0x943F, 0x9455, 0x946B, 0x9472, + 0x9578, 0x95A6, 0x95A9, 0x95AB, 0x95B4, 0x95BD, 0x95DA, 0x961D, 0x9641, + 0x9658, 0x9684, 0x96A4, 0x96A9, 0x96D2, 0x5DB2, 0x96DE, 0x96E9, 0x96F1, + 0x9702, 0x9709, 0x975A, 0x9763, 0x976E, 0x9773, 0x979A, 0x97A2, 0x97B5, + 0x97B6, 0x97D9, 0x97DE, 0x97F4, 0x980A, 0x980E, 0x981E, 0x9823, 0x982B, + 0x983E, 0x9852, 0x9853, 0x9859, 0x986C, 0x98B8, 0x98BA, 0x98BF, 0x98C8, + 0x98E5, 0x9932, 0x9933, 0x9940, 0x994D, 0x995C, 0x995F, 0x99B1, 0x99B9, + 0x99BA, 0x99C9, 0x9A02, 0x9A16, 0x9A24, 0x9A27, 0x9A2D, 0x9A2E, 0x9A36, + 0x9A38, 0x9A4A, 0x9A56, 0x9AB5, 0x9AB6, 0x9AF9, 0x9B03, 0x9B20, 0x9B33, + 0x9B34, 0x9B73, 0x9B79, 0x9BA7, 0x9BC1, 0x9BC7, 0x9BD7, 0x9BE7, 0x9BEB, + 0x9BF7, 0x9BFA, 0x9BFD, 0x9C0B, 0x9C27, 0x9C2A, 0x9C36, 0x9C41, 0x9C53, + 0x9C63, 0x9C6A, 0x9C77, 0x9D02, 0x9D42, 0x9D47, 0x9D63, 0x9D69, 0x9D7C, + 0x9D7E, 0x9D8D, 0x9DB1, 0x9DC3, 0x9DC7, 0x9DD6, 0x9DDF, 0x9DEB, 0x9DF4, + 0x9E15, 0x9E1D, 0x9EA4, 0x9EA8, 0x9EAC, 0x9EE7, 0x9EEE, 0x9F10, 0x9F12, + 0x9F17, 0x9F19, 0x9F2F, 0x9F37, 0x9F39, 0x9F41, 0x9F45, 0x9F57, 0x9F68, + 0x9F71, 0x9F75, 0x9F90, 0x9F94, 0x9FA2, 0x4E30, 0x3405, 0x4F60, 0x5620, + 0x5ECB, 0x2E95, 0x60A4, 0x69D7, 0x6B24, 0x6FF9, 0x6EE6, 0x71B3, 0x2EA4, + 0x7AC6, 0x7F61, 0x8071, 0x809E, 0x2ECC, 0x91F0, 0x5DB2, 0x97DE, 0x4FD3, + 0x50D9, 0x50F0, 0x51C3, 0x5676, 0x6A54, 0x6D01, 0x6DD0, 0x6E42, 0x6ED9, + 0x73E4, 0x7421, 0x756C, 0x7851, 0x87F5, 0xFFFD, 0x73A8, 0x3AF3, 0x34DB, + 0x440C, 0x3E8A, 0xFFFD, 0xFFFD, 0x4BE8, 0xFFFD, 0x3EDA, 0x3B22, 0xFFFD, + 0x457A, 0x4093, 0xFFFD, 0x4665, 0x4103, 0x4293, 0x46AE, 0x3488, 0xFFFD, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/EUC-H_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/EUC-H_1.cpp new file mode 100644 index 000000000000..ddb1bcf4c6b7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/EUC-H_1.cpp @@ -0,0 +1,50 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_EUC_H_1[120 * 3] = { + 0x0020, 0x007E, 0x00E7, 0x8EA0, 0x8EDF, 0x0146, 0xA1A1, 0xA1FE, 0x0279, + 0xA2A1, 0xA2AE, 0x02D7, 0xA2BA, 0xA2C1, 0x02E5, 0xA2CA, 0xA2D0, 0x02ED, + 0xA2DC, 0xA2EA, 0x02F4, 0xA2F2, 0xA2F9, 0x0303, 0xA2FE, 0xA2FE, 0x030B, + 0xA3B0, 0xA3B9, 0x030C, 0xA3C1, 0xA3DA, 0x0316, 0xA3E1, 0xA3FA, 0x0330, + 0xA4A1, 0xA4F3, 0x034A, 0xA5A1, 0xA5F6, 0x039D, 0xA6A1, 0xA6B8, 0x03F3, + 0xA6C1, 0xA6D8, 0x040B, 0xA7A1, 0xA7C1, 0x0423, 0xA7D1, 0xA7F1, 0x0444, + 0xA8A1, 0xA8A1, 0x1D37, 0xA8A2, 0xA8A2, 0x1D39, 0xA8A3, 0xA8A3, 0x1D43, + 0xA8A4, 0xA8A4, 0x1D47, 0xA8A5, 0xA8A5, 0x1D4F, 0xA8A6, 0xA8A6, 0x1D4B, + 0xA8A7, 0xA8A7, 0x1D53, 0xA8A8, 0xA8A8, 0x1D63, 0xA8A9, 0xA8A9, 0x1D5B, + 0xA8AA, 0xA8AA, 0x1D6B, 0xA8AB, 0xA8AB, 0x1D73, 0xA8AC, 0xA8AC, 0x1D38, + 0xA8AD, 0xA8AD, 0x1D3A, 0xA8AE, 0xA8AE, 0x1D46, 0xA8AF, 0xA8AF, 0x1D4A, + 0xA8B0, 0xA8B0, 0x1D52, 0xA8B1, 0xA8B1, 0x1D4E, 0xA8B2, 0xA8B2, 0x1D5A, + 0xA8B3, 0xA8B3, 0x1D6A, 0xA8B4, 0xA8B4, 0x1D62, 0xA8B5, 0xA8B5, 0x1D72, + 0xA8B6, 0xA8B6, 0x1D82, 0xA8B7, 0xA8B7, 0x1D57, 0xA8B8, 0xA8B8, 0x1D66, + 0xA8B9, 0xA8B9, 0x1D5F, 0xA8BA, 0xA8BA, 0x1D6E, 0xA8BB, 0xA8BB, 0x1D76, + 0xA8BC, 0xA8BC, 0x1D54, 0xA8BD, 0xA8BD, 0x1D67, 0xA8BE, 0xA8BE, 0x1D5C, + 0xA8BF, 0xA8BF, 0x1D6F, 0xA8C0, 0xA8C0, 0x1D79, 0xB0A1, 0xB0FE, 0x0465, + 0xB1A1, 0xB1FE, 0x04C3, 0xB2A1, 0xB2FE, 0x0521, 0xB3A1, 0xB3FE, 0x057F, + 0xB4A1, 0xB4FE, 0x05DD, 0xB5A1, 0xB5FE, 0x063B, 0xB6A1, 0xB6FE, 0x0699, + 0xB7A1, 0xB7FE, 0x06F7, 0xB8A1, 0xB8FE, 0x0755, 0xB9A1, 0xB9FE, 0x07B3, + 0xBAA1, 0xBAFE, 0x0811, 0xBBA1, 0xBBFE, 0x086F, 0xBCA1, 0xBCFE, 0x08CD, + 0xBDA1, 0xBDFE, 0x092B, 0xBEA1, 0xBEFE, 0x0989, 0xBFA1, 0xBFFE, 0x09E7, + 0xC0A1, 0xC0FE, 0x0A45, 0xC1A1, 0xC1FE, 0x0AA3, 0xC2A1, 0xC2FE, 0x0B01, + 0xC3A1, 0xC3FE, 0x0B5F, 0xC4A1, 0xC4FE, 0x0BBD, 0xC5A1, 0xC5FE, 0x0C1B, + 0xC6A1, 0xC6FE, 0x0C79, 0xC7A1, 0xC7FE, 0x0CD7, 0xC8A1, 0xC8FE, 0x0D35, + 0xC9A1, 0xC9FE, 0x0D93, 0xCAA1, 0xCAFE, 0x0DF1, 0xCBA1, 0xCBFE, 0x0E4F, + 0xCCA1, 0xCCFE, 0x0EAD, 0xCDA1, 0xCDFE, 0x0F0B, 0xCEA1, 0xCEFE, 0x0F69, + 0xCFA1, 0xCFD3, 0x0FC7, 0xD0A1, 0xD0FE, 0x0FFA, 0xD1A1, 0xD1FE, 0x1058, + 0xD2A1, 0xD2FE, 0x10B6, 0xD3A1, 0xD3FE, 0x1114, 0xD4A1, 0xD4FE, 0x1172, + 0xD5A1, 0xD5FE, 0x11D0, 0xD6A1, 0xD6FE, 0x122E, 0xD7A1, 0xD7FE, 0x128C, + 0xD8A1, 0xD8FE, 0x12EA, 0xD9A1, 0xD9FE, 0x1348, 0xDAA1, 0xDAFE, 0x13A6, + 0xDBA1, 0xDBFE, 0x1404, 0xDCA1, 0xDCFE, 0x1462, 0xDDA1, 0xDDFE, 0x14C0, + 0xDEA1, 0xDEFE, 0x151E, 0xDFA1, 0xDFFE, 0x157C, 0xE0A1, 0xE0FE, 0x15DA, + 0xE1A1, 0xE1FE, 0x1638, 0xE2A1, 0xE2FE, 0x1696, 0xE3A1, 0xE3FE, 0x16F4, + 0xE4A1, 0xE4FE, 0x1752, 0xE5A1, 0xE5FE, 0x17B0, 0xE6A1, 0xE6FE, 0x180E, + 0xE7A1, 0xE7FE, 0x186C, 0xE8A1, 0xE8FE, 0x18CA, 0xE9A1, 0xE9FE, 0x1928, + 0xEAA1, 0xEAFE, 0x1986, 0xEBA1, 0xEBFE, 0x19E4, 0xECA1, 0xECFE, 0x1A42, + 0xEDA1, 0xEDFE, 0x1AA0, 0xEEA1, 0xEEFE, 0x1AFE, 0xEFA1, 0xEFFE, 0x1B5C, + 0xF0A1, 0xF0FE, 0x1BBA, 0xF1A1, 0xF1FE, 0x1C18, 0xF2A1, 0xF2FE, 0x1C76, + 0xF3A1, 0xF3FE, 0x1CD4, 0xF4A1, 0xF4A4, 0x1D32, 0xF4A5, 0xF4A6, 0x205C, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/EUC-V_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/EUC-V_1.cpp new file mode 100644 index 000000000000..d5a70c6ac68a --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/EUC-V_1.cpp @@ -0,0 +1,19 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_EUC_V_1[27 * 3] = { + 0xA1A2, 0xA1A3, 0x1ECF, 0xA1B1, 0xA1B2, 0x1ED1, 0xA1BC, 0xA1BE, 0x1ED3, + 0xA1C1, 0xA1C5, 0x1ED6, 0xA1CA, 0xA1DB, 0x1EDB, 0xA1E1, 0xA1E1, 0x1EED, + 0xA4A1, 0xA4A1, 0x1EEE, 0xA4A3, 0xA4A3, 0x1EEF, 0xA4A5, 0xA4A5, 0x1EF0, + 0xA4A7, 0xA4A7, 0x1EF1, 0xA4A9, 0xA4A9, 0x1EF2, 0xA4C3, 0xA4C3, 0x1EF3, + 0xA4E3, 0xA4E3, 0x1EF4, 0xA4E5, 0xA4E5, 0x1EF5, 0xA4E7, 0xA4E7, 0x1EF6, + 0xA4EE, 0xA4EE, 0x1EF7, 0xA5A1, 0xA5A1, 0x1EF8, 0xA5A3, 0xA5A3, 0x1EF9, + 0xA5A5, 0xA5A5, 0x1EFA, 0xA5A7, 0xA5A7, 0x1EFB, 0xA5A9, 0xA5A9, 0x1EFC, + 0xA5C3, 0xA5C3, 0x1EFD, 0xA5E3, 0xA5E3, 0x1EFE, 0xA5E5, 0xA5E5, 0x1EFF, + 0xA5E7, 0xA5E7, 0x1F00, 0xA5EE, 0xA5EE, 0x1F01, 0xA5F5, 0xA5F6, 0x1F02, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Ext-RKSJ-H_2.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Ext-RKSJ-H_2.cpp new file mode 100644 index 000000000000..b251c5dc82b6 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Ext-RKSJ-H_2.cpp @@ -0,0 +1,232 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_Ext_RKSJ_H_2[665 * 3] = { + 0x0020, 0x007E, 0x00E7, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279, + 0x8180, 0x8188, 0x02B8, 0x8189, 0x8189, 0x1D36, 0x818A, 0x81AC, 0x02C2, + 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330, + 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D, 0x8380, 0x8396, 0x03DC, + 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, 0x8440, 0x8460, 0x0423, + 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, 0x8540, 0x857E, 0x00E8, + 0x8580, 0x8580, 0x0186, 0x8581, 0x859E, 0x0128, 0x859F, 0x85DD, 0x0147, + 0x85DE, 0x85FC, 0x0187, 0x8640, 0x867E, 0x01A6, 0x8680, 0x8691, 0x01E5, + 0x8692, 0x8692, 0x0127, 0x8693, 0x869E, 0x01F7, 0x86A2, 0x86ED, 0x1D37, + 0x8740, 0x875D, 0x1D83, 0x875F, 0x8775, 0x1DA1, 0x877E, 0x877E, 0x2083, + 0x8780, 0x878F, 0x1DB8, 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9, + 0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300, + 0x879B, 0x879C, 0x1DCF, 0x889F, 0x889F, 0x0465, 0x88A0, 0x88A0, 0x1DD1, + 0x88A1, 0x88B0, 0x0467, 0x88B1, 0x88B1, 0x1CA2, 0x88B2, 0x88B8, 0x0478, + 0x88B9, 0x88B9, 0x1DD2, 0x88BA, 0x88EB, 0x0480, 0x88EC, 0x88EC, 0x1DD3, + 0x88ED, 0x88F0, 0x04B3, 0x88F1, 0x88F1, 0x1DD4, 0x88F2, 0x88F9, 0x04B8, + 0x88FA, 0x88FA, 0x1DD5, 0x88FB, 0x88FC, 0x04C1, 0x8940, 0x8948, 0x04C3, + 0x8949, 0x8949, 0x1DD6, 0x894A, 0x8953, 0x04CD, 0x8954, 0x8954, 0x1DD7, + 0x8955, 0x8957, 0x04D8, 0x8958, 0x8958, 0x1DD8, 0x8959, 0x895A, 0x04DC, + 0x895B, 0x895C, 0x1DD9, 0x895D, 0x8960, 0x04E0, 0x8961, 0x8961, 0x1DDB, + 0x8962, 0x897E, 0x04E5, 0x8980, 0x898A, 0x0502, 0x898B, 0x898B, 0x1DDC, + 0x898C, 0x89A5, 0x050E, 0x89A6, 0x89A6, 0x1DDD, 0x89A7, 0x89A7, 0x1CC9, + 0x89A8, 0x89A8, 0x1DDE, 0x89A9, 0x89DD, 0x052B, 0x89DE, 0x89DE, 0x1DDF, + 0x89DF, 0x89F7, 0x0561, 0x89F8, 0x89F8, 0x1DE0, 0x89F9, 0x89FA, 0x057B, + 0x89FB, 0x89FB, 0x1DE1, 0x89FC, 0x89FC, 0x057E, 0x8A40, 0x8A40, 0x057F, + 0x8A41, 0x8A41, 0x1DE2, 0x8A42, 0x8A60, 0x0581, 0x8A61, 0x8A61, 0x1961, + 0x8A62, 0x8A67, 0x05A1, 0x8A68, 0x8A68, 0x139F, 0x8A69, 0x8A7E, 0x05A8, + 0x8A80, 0x8A84, 0x05BE, 0x8A85, 0x8A85, 0x1DE3, 0x8A86, 0x8A8A, 0x05C4, + 0x8A8B, 0x8A8B, 0x1DE4, 0x8A8C, 0x8A92, 0x05CA, 0x8A93, 0x8A93, 0x1DE5, + 0x8A94, 0x8A95, 0x05D2, 0x8A96, 0x8A96, 0x1731, 0x8A97, 0x8A99, 0x05D5, + 0x8A9A, 0x8A9A, 0x1DE6, 0x8A9B, 0x8ABF, 0x05D9, 0x8AC0, 0x8AC0, 0x1DE7, + 0x8AC1, 0x8AC1, 0x1572, 0x8AC2, 0x8ACA, 0x0600, 0x8ACB, 0x8ACB, 0x1DE8, + 0x8ACC, 0x8ACF, 0x060A, 0x8AD0, 0x8AD0, 0x1A20, 0x8AD1, 0x8AE2, 0x060F, + 0x8AE3, 0x8AE3, 0x1DE9, 0x8AE4, 0x8AFC, 0x0622, 0x8B40, 0x8B49, 0x063B, + 0x8B4A, 0x8B4A, 0x1DEA, 0x8B4B, 0x8B5E, 0x0646, 0x8B5F, 0x8B5F, 0x1DEB, + 0x8B60, 0x8B7E, 0x065B, 0x8B80, 0x8B9F, 0x067A, 0x8BA0, 0x8BA0, 0x1DEC, + 0x8BA1, 0x8BA7, 0x069B, 0x8BA8, 0x8BA8, 0x1DED, 0x8BA9, 0x8BC3, 0x06A3, + 0x8BC4, 0x8BC4, 0x1D32, 0x8BC5, 0x8BCC, 0x06BF, 0x8BCD, 0x8BCD, 0x1DEE, + 0x8BCE, 0x8BEA, 0x06C8, 0x8BEB, 0x8BEB, 0x1DEF, 0x8BEC, 0x8BF1, 0x06E6, + 0x8BF2, 0x8BF2, 0x1DF0, 0x8BF3, 0x8BF8, 0x06ED, 0x8BF9, 0x8BF9, 0x1DF1, + 0x8BFA, 0x8BFA, 0x06F4, 0x8BFB, 0x8BFB, 0x1DF2, 0x8BFC, 0x8BFC, 0x06F6, + 0x8C40, 0x8C42, 0x06F7, 0x8C43, 0x8C43, 0x1DF3, 0x8C44, 0x8C55, 0x06FB, + 0x8C56, 0x8C56, 0x1DF4, 0x8C57, 0x8C63, 0x070E, 0x8C64, 0x8C64, 0x1DF5, + 0x8C65, 0x8C6C, 0x071C, 0x8C6D, 0x8C6D, 0x1DF6, 0x8C6E, 0x8C70, 0x0725, + 0x8C71, 0x8C71, 0x1DF7, 0x8C72, 0x8C73, 0x0729, 0x8C74, 0x8C74, 0x1DF8, + 0x8C75, 0x8C79, 0x072C, 0x8C7A, 0x8C7A, 0x1C0D, 0x8C7B, 0x8C7E, 0x0732, + 0x8C80, 0x8C83, 0x0736, 0x8C84, 0x8C84, 0x1DF9, 0x8C85, 0x8C90, 0x073B, + 0x8C91, 0x8C91, 0x1DFA, 0x8C92, 0x8C98, 0x0748, 0x8C99, 0x8C99, 0x1DFB, + 0x8C9A, 0x8C9D, 0x0750, 0x8C9E, 0x8C9E, 0x1DFC, 0x8C9F, 0x8CB1, 0x0755, + 0x8CB2, 0x8CB2, 0x1DFD, 0x8CB3, 0x8CBE, 0x0769, 0x8CBF, 0x8CBF, 0x1DFE, + 0x8CC0, 0x8CFC, 0x0776, 0x8D40, 0x8D49, 0x07B3, 0x8D4A, 0x8D4A, 0x1DFF, + 0x8D4B, 0x8D55, 0x07BE, 0x8D56, 0x8D56, 0x1E00, 0x8D57, 0x8D60, 0x07CA, + 0x8D61, 0x8D61, 0x1E01, 0x8D62, 0x8D7A, 0x07D5, 0x8D7B, 0x8D7B, 0x16DD, + 0x8D7C, 0x8D7E, 0x07EF, 0x8D80, 0x8D8C, 0x07F2, 0x8D8D, 0x8D8D, 0x1E02, + 0x8D8E, 0x8D93, 0x0800, 0x8D94, 0x8D94, 0x1E03, 0x8D95, 0x8D98, 0x0807, + 0x8D99, 0x8D99, 0x1E04, 0x8D9A, 0x8DD0, 0x080C, 0x8DD1, 0x8DD1, 0x1E05, + 0x8DD2, 0x8DE4, 0x0844, 0x8DE5, 0x8DE5, 0x1E06, 0x8DE6, 0x8DF1, 0x0858, + 0x8DF2, 0x8DF2, 0x1E07, 0x8DF3, 0x8DFC, 0x0865, 0x8E40, 0x8E45, 0x086F, + 0x8E46, 0x8E46, 0x1E08, 0x8E47, 0x8E48, 0x0876, 0x8E49, 0x8E49, 0x1E09, + 0x8E4A, 0x8E4A, 0x0879, 0x8E4B, 0x8E4B, 0x1E0A, 0x8E4C, 0x8E57, 0x087B, + 0x8E58, 0x8E58, 0x1E0B, 0x8E59, 0x8E7E, 0x0888, 0x8E80, 0x8EB5, 0x08AE, + 0x8EB6, 0x8EB6, 0x1E0C, 0x8EB7, 0x8EC5, 0x08E5, 0x8EC6, 0x8EC6, 0x1E0D, + 0x8EC7, 0x8EC7, 0x1929, 0x8EC8, 0x8ED4, 0x08F6, 0x8ED5, 0x8ED5, 0x1E0E, + 0x8ED6, 0x8EDA, 0x0904, 0x8EDB, 0x8EDC, 0x1E0F, 0x8EDD, 0x8EFC, 0x090B, + 0x8F40, 0x8F49, 0x092B, 0x8F4A, 0x8F4A, 0x1E11, 0x8F4B, 0x8F54, 0x0936, + 0x8F55, 0x8F55, 0x1E12, 0x8F56, 0x8F7E, 0x0941, 0x8F80, 0x8F8B, 0x096A, + 0x8F8C, 0x8F8D, 0x1E13, 0x8F8E, 0x8F91, 0x0978, 0x8F92, 0x8F93, 0x1E15, + 0x8F94, 0x8FA2, 0x097E, 0x8FA3, 0x8FA3, 0x1E17, 0x8FA4, 0x8FB0, 0x098E, + 0x8FB1, 0x8FB1, 0x1E18, 0x8FB2, 0x8FBC, 0x099C, 0x8FBD, 0x8FBD, 0x1E19, + 0x8FBE, 0x8FD2, 0x09A8, 0x8FD3, 0x8FD3, 0x1E1A, 0x8FD4, 0x8FDC, 0x09BE, + 0x8FDD, 0x8FDD, 0x1E1B, 0x8FDE, 0x8FE1, 0x09C8, 0x8FE2, 0x8FE2, 0x1E1C, + 0x8FE3, 0x8FFC, 0x09CD, 0x9040, 0x9048, 0x09E7, 0x9049, 0x9049, 0x1E1D, + 0x904A, 0x9077, 0x09F1, 0x9078, 0x9078, 0x1E1E, 0x9079, 0x907E, 0x0A20, + 0x9080, 0x9080, 0x1E1F, 0x9081, 0x9088, 0x0A27, 0x9089, 0x9089, 0x1E20, + 0x908A, 0x909F, 0x0A30, 0x90A0, 0x90A0, 0x1E21, 0x90A1, 0x90BF, 0x0A47, + 0x90C0, 0x90C0, 0x1E22, 0x90C1, 0x90E3, 0x0A67, 0x90E4, 0x90E4, 0x1E23, + 0x90E5, 0x90EE, 0x0A8B, 0x90EF, 0x90F0, 0x1E24, 0x90F1, 0x90F6, 0x0A97, + 0x90F7, 0x90F8, 0x1E26, 0x90F9, 0x90FC, 0x0A9F, 0x9140, 0x9145, 0x0AA3, + 0x9146, 0x9146, 0x1E28, 0x9147, 0x9147, 0x1A6E, 0x9148, 0x9157, 0x0AAB, + 0x9158, 0x9158, 0x1E29, 0x9159, 0x916A, 0x0ABC, 0x916B, 0x916B, 0x1E2A, + 0x916C, 0x916D, 0x0ACF, 0x916E, 0x916E, 0x1E2B, 0x916F, 0x917D, 0x0AD2, + 0x917E, 0x917E, 0x1E2C, 0x9180, 0x9188, 0x0AE2, 0x9189, 0x9189, 0x1E2D, + 0x918A, 0x91BA, 0x0AEC, 0x91BB, 0x91BB, 0x1E2E, 0x91BC, 0x91CA, 0x0B1E, + 0x91CB, 0x91CB, 0x1E2F, 0x91CC, 0x91D9, 0x0B2E, 0x91DA, 0x91DA, 0x1E30, + 0x91DB, 0x91E0, 0x0B3D, 0x91E1, 0x91E1, 0x1E31, 0x91E2, 0x91EC, 0x0B44, + 0x91ED, 0x91ED, 0x1E32, 0x91EE, 0x91F2, 0x0B50, 0x91F3, 0x91F4, 0x1E33, + 0x91F5, 0x91FA, 0x0B57, 0x91FB, 0x91FB, 0x1E35, 0x91FC, 0x91FC, 0x0B5E, + 0x9240, 0x9245, 0x0B5F, 0x9246, 0x9246, 0x1E36, 0x9247, 0x9247, 0x0B66, + 0x9248, 0x9249, 0x1E37, 0x924A, 0x924B, 0x0B69, 0x924C, 0x924D, 0x1E39, + 0x924E, 0x925B, 0x0B6D, 0x925C, 0x925C, 0x1E3B, 0x925D, 0x927E, 0x0B7C, + 0x9280, 0x928F, 0x0B9E, 0x9290, 0x9290, 0x1E3C, 0x9291, 0x9294, 0x0BAF, + 0x9295, 0x9295, 0x1E3D, 0x9296, 0x929B, 0x0BB4, 0x929C, 0x929C, 0x1E3E, + 0x929D, 0x92BA, 0x0BBB, 0x92BB, 0x92BB, 0x1E3F, 0x92BC, 0x92C5, 0x0BDA, + 0x92C6, 0x92C6, 0x1E40, 0x92C7, 0x92C7, 0x0BE5, 0x92C8, 0x92C8, 0x1E41, + 0x92C9, 0x92CA, 0x0BE7, 0x92CB, 0x92CB, 0x1E42, 0x92CC, 0x92CC, 0x0BEA, + 0x92CD, 0x92CD, 0x1E43, 0x92CE, 0x92D8, 0x0BEC, 0x92D9, 0x92D9, 0x11B5, + 0x92DA, 0x92FC, 0x0BF8, 0x9340, 0x9340, 0x0C1B, 0x9341, 0x9341, 0x1E44, + 0x9342, 0x9345, 0x0C1D, 0x9346, 0x9346, 0x1E45, 0x9347, 0x934C, 0x0C22, + 0x934D, 0x934D, 0x1E46, 0x934E, 0x9354, 0x0C29, 0x9355, 0x9355, 0x1E47, + 0x9356, 0x935D, 0x0C31, 0x935E, 0x935E, 0x1E48, 0x935F, 0x9366, 0x0C3A, + 0x9367, 0x9367, 0x1E49, 0x9368, 0x9369, 0x0C43, 0x936A, 0x936A, 0x1E4A, + 0x936B, 0x936F, 0x0C46, 0x9370, 0x9371, 0x1E4B, 0x9372, 0x9375, 0x0C4D, + 0x9376, 0x9376, 0x16DF, 0x9377, 0x937E, 0x0C52, 0x9380, 0x9383, 0x0C5A, + 0x9384, 0x9384, 0x1E4D, 0x9385, 0x938D, 0x0C5F, 0x938E, 0x938E, 0x1450, + 0x938F, 0x9392, 0x0C69, 0x9393, 0x9393, 0x1536, 0x9394, 0x9397, 0x0C6E, + 0x9398, 0x9398, 0x1E4E, 0x9399, 0x93BB, 0x0C73, 0x93BC, 0x93BC, 0x1E4F, + 0x93BD, 0x93BF, 0x0C97, 0x93C0, 0x93C0, 0x1E50, 0x93C1, 0x93D1, 0x0C9B, + 0x93D2, 0x93D3, 0x1E51, 0x93D4, 0x93D8, 0x0CAE, 0x93D9, 0x93DA, 0x1E53, + 0x93DB, 0x93DE, 0x0CB5, 0x93DF, 0x93DF, 0x1E55, 0x93E0, 0x93E3, 0x0CBA, + 0x93E4, 0x93E5, 0x1E56, 0x93E6, 0x93E7, 0x0CC0, 0x93E8, 0x93E8, 0x1E58, + 0x93E9, 0x93F3, 0x0CC3, 0x93F4, 0x93F4, 0x1AED, 0x93F5, 0x93FC, 0x0CCF, + 0x9440, 0x9447, 0x0CD7, 0x9448, 0x9448, 0x1E59, 0x9449, 0x9457, 0x0CE0, + 0x9458, 0x9458, 0x1E5A, 0x9459, 0x9475, 0x0CF0, 0x9476, 0x9476, 0x1E5B, + 0x9477, 0x947E, 0x0D0E, 0x9480, 0x9486, 0x0D16, 0x9487, 0x9487, 0x1E5C, + 0x9488, 0x9488, 0x1989, 0x9489, 0x9489, 0x1E5D, 0x948A, 0x948C, 0x0D20, + 0x948D, 0x948D, 0x1E5E, 0x948E, 0x94A1, 0x0D24, 0x94A2, 0x94A2, 0x1E5F, + 0x94A3, 0x94AB, 0x0D39, 0x94AC, 0x94AC, 0x1E60, 0x94AD, 0x94AD, 0x0D43, + 0x94AE, 0x94AE, 0x1E61, 0x94AF, 0x94D1, 0x0D45, 0x94D2, 0x94D2, 0x1E62, + 0x94D3, 0x94DF, 0x0D69, 0x94E0, 0x94E0, 0x1E63, 0x94E1, 0x94F2, 0x0D77, + 0x94F3, 0x94F3, 0x1E64, 0x94F4, 0x94FC, 0x0D8A, 0x9540, 0x9540, 0x0D93, + 0x9541, 0x9542, 0x1E65, 0x9543, 0x954D, 0x0D96, 0x954E, 0x954E, 0x1E67, + 0x954F, 0x954F, 0x143B, 0x9550, 0x9550, 0x0DA3, 0x9551, 0x9551, 0x1E68, + 0x9552, 0x9553, 0x0DA5, 0x9554, 0x9554, 0x1E69, 0x9555, 0x955E, 0x0DA8, + 0x955F, 0x955F, 0x1E6A, 0x9560, 0x956C, 0x0DB3, 0x956D, 0x956D, 0x1E6B, + 0x956E, 0x956F, 0x0DC1, 0x9570, 0x9570, 0x1E6C, 0x9571, 0x957E, 0x0DC4, + 0x9580, 0x95C0, 0x0DD2, 0x95C1, 0x95C1, 0x1E6D, 0x95C2, 0x95CA, 0x0E14, + 0x95CB, 0x95CB, 0x1E6E, 0x95CC, 0x95D7, 0x0E1E, 0x95D8, 0x95D8, 0x1E6F, + 0x95D9, 0x95F6, 0x0E2B, 0x95F7, 0x95F7, 0x1E70, 0x95F8, 0x95FC, 0x0E4A, + 0x9640, 0x9640, 0x0E4F, 0x9641, 0x9641, 0x1E71, 0x9642, 0x9647, 0x0E51, + 0x9648, 0x9648, 0x1E72, 0x9649, 0x9669, 0x0E58, 0x966A, 0x966A, 0x1E73, + 0x966B, 0x967E, 0x0E7A, 0x9680, 0x9689, 0x0E8E, 0x968A, 0x968A, 0x1D33, + 0x968B, 0x968F, 0x0E99, 0x9690, 0x9690, 0x1E74, 0x9691, 0x9698, 0x0E9F, + 0x9699, 0x9699, 0x102F, 0x969A, 0x96CA, 0x0EA8, 0x96CB, 0x96CB, 0x1E75, + 0x96CC, 0x96D6, 0x0EDA, 0x96D7, 0x96D7, 0x1E76, 0x96D8, 0x96DC, 0x0EE6, + 0x96DD, 0x96DD, 0x1E77, 0x96DE, 0x96DF, 0x0EEC, 0x96E0, 0x96E0, 0x1E78, + 0x96E1, 0x96F6, 0x0EEF, 0x96F7, 0x96F7, 0x1935, 0x96F8, 0x96F8, 0x1E79, + 0x96F9, 0x96F9, 0x0F07, 0x96FA, 0x96FA, 0x1E7A, 0x96FB, 0x96FB, 0x0F09, + 0x96FC, 0x96FC, 0x1E7B, 0x9740, 0x9750, 0x0F0B, 0x9751, 0x9751, 0x1E7C, + 0x9752, 0x976E, 0x0F1D, 0x976F, 0x976F, 0x1E7D, 0x9770, 0x9772, 0x0F3B, + 0x9773, 0x9773, 0x1E7E, 0x9774, 0x9778, 0x0F3F, 0x9779, 0x9779, 0x1D34, + 0x977A, 0x977E, 0x0F45, 0x9780, 0x9788, 0x0F4A, 0x9789, 0x9789, 0x1E7F, + 0x978A, 0x97C8, 0x0F54, 0x97C9, 0x97C9, 0x1E80, 0x97CA, 0x97F7, 0x0F94, + 0x97F8, 0x97F9, 0x1E81, 0x97FA, 0x97FC, 0x0FC4, 0x9840, 0x9840, 0x1E83, + 0x9841, 0x984F, 0x0FC8, 0x9850, 0x9850, 0x1E84, 0x9851, 0x9854, 0x0FD8, + 0x9855, 0x9855, 0x1777, 0x9856, 0x9857, 0x0FDD, 0x9858, 0x9858, 0x1E85, + 0x9859, 0x9872, 0x0FE0, 0x989F, 0x98D3, 0x0FFA, 0x98D4, 0x98D4, 0x0EA7, + 0x98D5, 0x98FC, 0x1030, 0x9940, 0x995B, 0x1058, 0x995C, 0x995C, 0x1E86, + 0x995D, 0x9965, 0x1075, 0x9966, 0x9966, 0x1E87, 0x9967, 0x9969, 0x107F, + 0x996A, 0x996A, 0x1E88, 0x996B, 0x996B, 0x1083, 0x996C, 0x996C, 0x1E89, + 0x996D, 0x997E, 0x1085, 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A4E, 0x1114, + 0x9A4F, 0x9A4F, 0x1E8A, 0x9A50, 0x9A58, 0x1124, 0x9A59, 0x9A59, 0x1E8B, + 0x9A5A, 0x9A6E, 0x112E, 0x9A6F, 0x9A6F, 0x1E8C, 0x9A70, 0x9A7C, 0x1144, + 0x9A7D, 0x9A7D, 0x1E8D, 0x9A7E, 0x9A7E, 0x1152, 0x9A80, 0x9A8A, 0x1153, + 0x9A8B, 0x9A8B, 0x1E8E, 0x9A8C, 0x9AC1, 0x115F, 0x9AC2, 0x9AC2, 0x1E8F, + 0x9AC3, 0x9AE1, 0x1196, 0x9AE2, 0x9AE2, 0x0BF7, 0x9AE3, 0x9AFC, 0x11B6, + 0x9B40, 0x9B5B, 0x11D0, 0x9B5C, 0x9B5C, 0x1E90, 0x9B5D, 0x9B7E, 0x11ED, + 0x9B80, 0x9B82, 0x120F, 0x9B83, 0x9B83, 0x1E91, 0x9B84, 0x9B9F, 0x1213, + 0x9BA0, 0x9BA0, 0x1E92, 0x9BA1, 0x9BEF, 0x1230, 0x9BF0, 0x9BF0, 0x1E93, + 0x9BF1, 0x9BFC, 0x1280, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CA1, 0x12CB, + 0x9CA2, 0x9CA2, 0x1E94, 0x9CA3, 0x9CFC, 0x12EE, 0x9D40, 0x9D7E, 0x1348, + 0x9D80, 0x9D80, 0x1E95, 0x9D81, 0x9D8B, 0x1388, 0x9D8C, 0x9D8C, 0x1E96, + 0x9D8D, 0x9D97, 0x1394, 0x9D98, 0x9D98, 0x05A7, 0x9D99, 0x9DB6, 0x13A0, + 0x9DB7, 0x9DB7, 0x1E97, 0x9DB8, 0x9DCA, 0x13BF, 0x9DCB, 0x9DCB, 0x1E98, + 0x9DCC, 0x9DFC, 0x13D3, 0x9E40, 0x9E63, 0x1404, 0x9E64, 0x9E64, 0x1E99, + 0x9E65, 0x9E68, 0x1429, 0x9E69, 0x9E69, 0x1E9A, 0x9E6A, 0x9E76, 0x142E, + 0x9E77, 0x9E77, 0x0DA2, 0x9E78, 0x9E7E, 0x143C, 0x9E80, 0x9E8A, 0x1443, + 0x9E8B, 0x9E8B, 0x1E9B, 0x9E8C, 0x9E8C, 0x144F, 0x9E8D, 0x9E8D, 0x0C68, + 0x9E8E, 0x9E93, 0x1451, 0x9E94, 0x9E94, 0x1E9C, 0x9E95, 0x9EFC, 0x1458, + 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FB6, 0x14FF, 0x9FB7, 0x9FB7, 0x0C6D, + 0x9FB8, 0x9FCD, 0x1537, 0x9FCE, 0x9FCE, 0x1E9D, 0x9FCF, 0x9FF2, 0x154E, + 0x9FF3, 0x9FF3, 0x05FF, 0x9FF4, 0x9FFC, 0x1573, 0xE040, 0xE07E, 0x157C, + 0xE080, 0xE092, 0x15BB, 0xE093, 0xE093, 0x1E9E, 0xE094, 0xE0A3, 0x15CF, + 0xE0A4, 0xE0A4, 0x1E9F, 0xE0A5, 0xE0DC, 0x15E0, 0xE0DD, 0xE0DD, 0x1EA0, + 0xE0DE, 0xE0F3, 0x1619, 0xE0F4, 0xE0F4, 0x1D35, 0xE0F5, 0xE0FC, 0x1630, + 0xE140, 0xE149, 0x1638, 0xE14A, 0xE14A, 0x1EA1, 0xE14B, 0xE14E, 0x1643, + 0xE14F, 0xE150, 0x1EA2, 0xE151, 0xE17E, 0x1649, 0xE180, 0xE1A8, 0x1677, + 0xE1A9, 0xE1A9, 0x1EA4, 0xE1AA, 0xE1E5, 0x16A1, 0xE1E6, 0xE1E6, 0x07EE, + 0xE1E7, 0xE1E7, 0x16DE, 0xE1E8, 0xE1E8, 0x0C51, 0xE1E9, 0xE1EC, 0x16E0, + 0xE1ED, 0xE1ED, 0x1EA5, 0xE1EE, 0xE1FC, 0x16E5, 0xE240, 0xE268, 0x16F4, + 0xE269, 0xE269, 0x1EA6, 0xE26A, 0xE272, 0x171E, 0xE273, 0xE273, 0x1EA7, + 0xE274, 0xE27C, 0x1728, 0xE27D, 0xE27D, 0x05D4, 0xE27E, 0xE27E, 0x1732, + 0xE280, 0xE2B6, 0x1733, 0xE2B7, 0xE2B7, 0x1EA8, 0xE2B8, 0xE2C3, 0x176B, + 0xE2C4, 0xE2C4, 0x0FDC, 0xE2C5, 0xE2E1, 0x1778, 0xE2E2, 0xE2E2, 0x1EA9, + 0xE2E3, 0xE2EB, 0x1796, 0xE2EC, 0xE2EC, 0x1EAA, 0xE2ED, 0xE2FC, 0x17A0, + 0xE340, 0xE357, 0x17B0, 0xE358, 0xE358, 0x1EAB, 0xE359, 0xE359, 0x17C9, + 0xE35A, 0xE35A, 0x1EAC, 0xE35B, 0xE364, 0x17CB, 0xE365, 0xE365, 0x1EAD, + 0xE366, 0xE37E, 0x17D6, 0xE380, 0xE3C3, 0x17EF, 0xE3C4, 0xE3C4, 0x1EAE, + 0xE3C5, 0xE3FC, 0x1834, 0xE440, 0xE47E, 0x186C, 0xE480, 0xE483, 0x18AB, + 0xE484, 0xE484, 0x1EAF, 0xE485, 0xE488, 0x18B0, 0xE489, 0xE489, 0x1EB0, + 0xE48A, 0xE491, 0x18B5, 0xE492, 0xE492, 0x1EB1, 0xE493, 0xE4B1, 0x18BE, + 0xE4B2, 0xE4B2, 0x1EB2, 0xE4B3, 0xE4B8, 0x18DE, 0xE4B9, 0xE4B9, 0x1EB3, + 0xE4BA, 0xE4F1, 0x18E5, 0xE4F2, 0xE4F2, 0x1EB4, 0xE4F3, 0xE4FC, 0x191E, + 0xE540, 0xE540, 0x1928, 0xE541, 0xE541, 0x08F5, 0xE542, 0xE54C, 0x192A, + 0xE54D, 0xE54D, 0x0F05, 0xE54E, 0xE55A, 0x1936, 0xE55B, 0xE55B, 0x1EB5, + 0xE55C, 0xE578, 0x1944, 0xE579, 0xE579, 0x05A0, 0xE57A, 0xE57E, 0x1962, + 0xE580, 0xE5A1, 0x1967, 0xE5A2, 0xE5A2, 0x0D1E, 0xE5A3, 0xE5A4, 0x198A, + 0xE5A5, 0xE5A5, 0x1EB6, 0xE5A6, 0xE5BA, 0x198D, 0xE5BB, 0xE5BB, 0x1EB7, + 0xE5BC, 0xE5EC, 0x19A3, 0xE5ED, 0xE5ED, 0x1EB8, 0xE5EE, 0xE5FC, 0x19D5, + 0xE640, 0xE650, 0x19E4, 0xE651, 0xE651, 0x1EB9, 0xE652, 0xE67B, 0x19F6, + 0xE67C, 0xE67C, 0x060E, 0xE67D, 0xE67E, 0x1A21, 0xE680, 0xE685, 0x1A23, + 0xE686, 0xE686, 0x1EBA, 0xE687, 0xE695, 0x1A2A, 0xE696, 0xE696, 0x1EBB, + 0xE697, 0xE6CA, 0x1A3A, 0xE6CB, 0xE6CB, 0x0AAA, 0xE6CC, 0xE6E6, 0x1A6F, + 0xE6E7, 0xE6E7, 0x1EBC, 0xE6E8, 0xE6F1, 0x1A8B, 0xE6F2, 0xE6F2, 0x1EBD, + 0xE6F3, 0xE6FC, 0x1A96, 0xE740, 0xE76C, 0x1AA0, 0xE76D, 0xE76D, 0x1EBE, + 0xE76E, 0xE77E, 0x1ACE, 0xE780, 0xE78B, 0x1ADF, 0xE78C, 0xE78C, 0x1EBF, + 0xE78D, 0xE78D, 0x1AEC, 0xE78E, 0xE78E, 0x1EC0, 0xE78F, 0xE7A6, 0x1AEE, + 0xE7A7, 0xE7A7, 0x1EC1, 0xE7A8, 0xE7BA, 0x1B07, 0xE7BB, 0xE7BB, 0x1EC2, + 0xE7BC, 0xE7D4, 0x1B1B, 0xE7D5, 0xE7D5, 0x1EC3, 0xE7D6, 0xE7FC, 0x1B35, + 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE884, 0x1B9B, 0xE885, 0xE885, 0x1EC4, + 0xE886, 0xE8B0, 0x1BA1, 0xE8B1, 0xE8B1, 0x1EC5, 0xE8B2, 0xE8C2, 0x1BCD, + 0xE8C3, 0xE8C3, 0x1EC6, 0xE8C4, 0xE8CE, 0x1BDF, 0xE8CF, 0xE8CF, 0x1EC7, + 0xE8D0, 0xE8D4, 0x1BEB, 0xE8D5, 0xE8D5, 0x1EC8, 0xE8D6, 0xE8F1, 0x1BF1, + 0xE8F2, 0xE8F2, 0x0731, 0xE8F3, 0xE8F3, 0x1EC9, 0xE8F4, 0xE8FC, 0x1C0F, + 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9AA, 0x1C57, 0xE9AB, 0xE9AB, 0x1ECA, + 0xE9AC, 0xE9B9, 0x1C83, 0xE9BA, 0xE9BA, 0x1ECB, 0xE9BB, 0xE9CA, 0x1C92, + 0xE9CB, 0xE9CB, 0x0477, 0xE9CC, 0xE9CC, 0x1ECC, 0xE9CD, 0xE9F1, 0x1CA4, + 0xE9F2, 0xE9F2, 0x0529, 0xE9F3, 0xE9FC, 0x1CCA, 0xEA40, 0xEA6F, 0x1CD4, + 0xEA70, 0xEA70, 0x1ECD, 0xEA71, 0xEA7E, 0x1D05, 0xEA80, 0xEA9C, 0x1D13, + 0xEA9D, 0xEA9D, 0x1ECE, 0xEA9E, 0xEA9E, 0x1D31, 0xED40, 0xED7E, 0x20A7, + 0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9, 0xEDB5, 0xEDFC, 0x211A, + 0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1, 0xEEEF, 0xEEF8, 0x1F9C, + 0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Ext-RKSJ-V_2.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Ext-RKSJ-V_2.cpp new file mode 100644 index 000000000000..b62e5a5deac7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/Ext-RKSJ-V_2.cpp @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_Ext_RKSJ_V_2[39 * 3] = { + 0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052, + 0x814A, 0x814A, 0x2050, 0x814B, 0x814B, 0x204F, 0x815B, 0x815D, 0x1ED3, + 0x8160, 0x8164, 0x1ED6, 0x8165, 0x8165, 0x2059, 0x8166, 0x8166, 0x2054, + 0x8167, 0x8167, 0x2057, 0x8168, 0x8168, 0x2056, 0x8169, 0x817A, 0x1EDB, + 0x818B, 0x818B, 0x204D, 0x818C, 0x818C, 0x2051, 0x818D, 0x818D, 0x205B, + 0x81AC, 0x81AC, 0x204E, 0x829F, 0x829F, 0x1EEE, 0x82A1, 0x82A1, 0x1EEF, + 0x82A3, 0x82A3, 0x1EF0, 0x82A5, 0x82A5, 0x1EF1, 0x82A7, 0x82A7, 0x1EF2, + 0x82C1, 0x82C1, 0x1EF3, 0x82E1, 0x82E1, 0x1EF4, 0x82E3, 0x82E3, 0x1EF5, + 0x82E5, 0x82E5, 0x1EF6, 0x82EC, 0x82EC, 0x1EF7, 0x8340, 0x8340, 0x1EF8, + 0x8342, 0x8342, 0x1EF9, 0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, + 0x8348, 0x8348, 0x1EFC, 0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, + 0x8385, 0x8385, 0x1EFF, 0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, + 0x8395, 0x8396, 0x1F02, 0x875F, 0x876E, 0x1F04, 0x8780, 0x8781, 0x1F14, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/H_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/H_1.cpp new file mode 100644 index 000000000000..be32b5cb725d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/H_1.cpp @@ -0,0 +1,50 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_H_1[118 * 3] = { + 0x2121, 0x217E, 0x0279, 0x2221, 0x222E, 0x02D7, 0x223A, 0x2241, 0x02E5, + 0x224A, 0x2250, 0x02ED, 0x225C, 0x226A, 0x02F4, 0x2272, 0x2279, 0x0303, + 0x227E, 0x227E, 0x030B, 0x2330, 0x2339, 0x030C, 0x2341, 0x235A, 0x0316, + 0x2361, 0x237A, 0x0330, 0x2421, 0x2473, 0x034A, 0x2521, 0x2576, 0x039D, + 0x2621, 0x2638, 0x03F3, 0x2641, 0x2658, 0x040B, 0x2721, 0x2741, 0x0423, + 0x2751, 0x2771, 0x0444, 0x2821, 0x2821, 0x1D37, 0x2822, 0x2822, 0x1D39, + 0x2823, 0x2823, 0x1D43, 0x2824, 0x2824, 0x1D47, 0x2825, 0x2825, 0x1D4F, + 0x2826, 0x2826, 0x1D4B, 0x2827, 0x2827, 0x1D53, 0x2828, 0x2828, 0x1D63, + 0x2829, 0x2829, 0x1D5B, 0x282A, 0x282A, 0x1D6B, 0x282B, 0x282B, 0x1D73, + 0x282C, 0x282C, 0x1D38, 0x282D, 0x282D, 0x1D3A, 0x282E, 0x282E, 0x1D46, + 0x282F, 0x282F, 0x1D4A, 0x2830, 0x2830, 0x1D52, 0x2831, 0x2831, 0x1D4E, + 0x2832, 0x2832, 0x1D5A, 0x2833, 0x2833, 0x1D6A, 0x2834, 0x2834, 0x1D62, + 0x2835, 0x2835, 0x1D72, 0x2836, 0x2836, 0x1D82, 0x2837, 0x2837, 0x1D57, + 0x2838, 0x2838, 0x1D66, 0x2839, 0x2839, 0x1D5F, 0x283A, 0x283A, 0x1D6E, + 0x283B, 0x283B, 0x1D76, 0x283C, 0x283C, 0x1D54, 0x283D, 0x283D, 0x1D67, + 0x283E, 0x283E, 0x1D5C, 0x283F, 0x283F, 0x1D6F, 0x2840, 0x2840, 0x1D79, + 0x3021, 0x307E, 0x0465, 0x3121, 0x317E, 0x04C3, 0x3221, 0x327E, 0x0521, + 0x3321, 0x337E, 0x057F, 0x3421, 0x347E, 0x05DD, 0x3521, 0x357E, 0x063B, + 0x3621, 0x367E, 0x0699, 0x3721, 0x377E, 0x06F7, 0x3821, 0x387E, 0x0755, + 0x3921, 0x397E, 0x07B3, 0x3A21, 0x3A7E, 0x0811, 0x3B21, 0x3B7E, 0x086F, + 0x3C21, 0x3C7E, 0x08CD, 0x3D21, 0x3D7E, 0x092B, 0x3E21, 0x3E7E, 0x0989, + 0x3F21, 0x3F7E, 0x09E7, 0x4021, 0x407E, 0x0A45, 0x4121, 0x417E, 0x0AA3, + 0x4221, 0x427E, 0x0B01, 0x4321, 0x437E, 0x0B5F, 0x4421, 0x447E, 0x0BBD, + 0x4521, 0x457E, 0x0C1B, 0x4621, 0x467E, 0x0C79, 0x4721, 0x477E, 0x0CD7, + 0x4821, 0x487E, 0x0D35, 0x4921, 0x497E, 0x0D93, 0x4A21, 0x4A7E, 0x0DF1, + 0x4B21, 0x4B7E, 0x0E4F, 0x4C21, 0x4C7E, 0x0EAD, 0x4D21, 0x4D7E, 0x0F0B, + 0x4E21, 0x4E7E, 0x0F69, 0x4F21, 0x4F53, 0x0FC7, 0x5021, 0x507E, 0x0FFA, + 0x5121, 0x517E, 0x1058, 0x5221, 0x527E, 0x10B6, 0x5321, 0x537E, 0x1114, + 0x5421, 0x547E, 0x1172, 0x5521, 0x557E, 0x11D0, 0x5621, 0x567E, 0x122E, + 0x5721, 0x577E, 0x128C, 0x5821, 0x587E, 0x12EA, 0x5921, 0x597E, 0x1348, + 0x5A21, 0x5A7E, 0x13A6, 0x5B21, 0x5B7E, 0x1404, 0x5C21, 0x5C7E, 0x1462, + 0x5D21, 0x5D7E, 0x14C0, 0x5E21, 0x5E7E, 0x151E, 0x5F21, 0x5F7E, 0x157C, + 0x6021, 0x607E, 0x15DA, 0x6121, 0x617E, 0x1638, 0x6221, 0x627E, 0x1696, + 0x6321, 0x637E, 0x16F4, 0x6421, 0x647E, 0x1752, 0x6521, 0x657E, 0x17B0, + 0x6621, 0x667E, 0x180E, 0x6721, 0x677E, 0x186C, 0x6821, 0x687E, 0x18CA, + 0x6921, 0x697E, 0x1928, 0x6A21, 0x6A7E, 0x1986, 0x6B21, 0x6B7E, 0x19E4, + 0x6C21, 0x6C7E, 0x1A42, 0x6D21, 0x6D7E, 0x1AA0, 0x6E21, 0x6E7E, 0x1AFE, + 0x6F21, 0x6F7E, 0x1B5C, 0x7021, 0x707E, 0x1BBA, 0x7121, 0x717E, 0x1C18, + 0x7221, 0x727E, 0x1C76, 0x7321, 0x737E, 0x1CD4, 0x7421, 0x7424, 0x1D32, + 0x7425, 0x7426, 0x205C, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp new file mode 100644 index 000000000000..e03c13963afe --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp @@ -0,0 +1,12 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_UniJIS_UCS2_HW_H_4[4 * 3] = { + 0x0020, 0x005B, 0x00E7, 0x005C, 0x005C, 0x220F, + 0x005D, 0x007E, 0x0124, 0x00A5, 0x00A5, 0x0123, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp new file mode 100644 index 000000000000..3f3a2a4b43b3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp @@ -0,0 +1,77 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_UniJIS_UCS2_HW_V_4[199 * 3] = { + 0x0020, 0x005B, 0x00E7, 0x005C, 0x005C, 0x220F, 0x005D, 0x007E, 0x0124, + 0x00A5, 0x00A5, 0x0123, 0x00B0, 0x00B0, 0x204D, 0x2010, 0x2010, 0x1ED5, + 0x2015, 0x2015, 0x1ED4, 0x2016, 0x2016, 0x1ED7, 0x2018, 0x2019, 0x2059, + 0x201C, 0x201D, 0x2057, 0x2025, 0x2025, 0x1EDA, 0x2026, 0x2026, 0x1ED9, + 0x2032, 0x2032, 0x2051, 0x2033, 0x2033, 0x205B, 0x2190, 0x2190, 0x02E2, + 0x2191, 0x2191, 0x02E0, 0x2192, 0x2192, 0x02E3, 0x2193, 0x2193, 0x02E1, + 0x2195, 0x2195, 0x2FB6, 0x21C4, 0x21C4, 0x2077, 0x21C5, 0x21C5, 0x2076, + 0x21C6, 0x21C6, 0x2078, 0x21E6, 0x21E6, 0x1F4C, 0x21E7, 0x21E7, 0x1F4E, + 0x21E8, 0x21E8, 0x1F4B, 0x21E9, 0x21E9, 0x1F4D, 0x2225, 0x2225, 0x1ED7, + 0x223C, 0x223C, 0x1ED6, 0x22EF, 0x22EF, 0x1ED9, 0x2500, 0x2501, 0x1D39, + 0x2502, 0x2503, 0x1D37, 0x2504, 0x2505, 0x1D3D, 0x2506, 0x2507, 0x1D3B, + 0x2508, 0x2509, 0x1D41, 0x250A, 0x250B, 0x1D3F, 0x250C, 0x250C, 0x1D47, + 0x250D, 0x250D, 0x1D49, 0x250E, 0x250E, 0x1D48, 0x250F, 0x250F, 0x1D4A, + 0x2510, 0x2510, 0x1D4F, 0x2511, 0x2511, 0x1D51, 0x2512, 0x2512, 0x1D50, + 0x2513, 0x2513, 0x1D52, 0x2514, 0x2514, 0x1D43, 0x2515, 0x2515, 0x1D45, + 0x2516, 0x2516, 0x1D44, 0x2517, 0x2517, 0x1D46, 0x2518, 0x2518, 0x1D4B, + 0x2519, 0x2519, 0x1D4D, 0x251A, 0x251A, 0x1D4C, 0x251B, 0x251B, 0x1D4E, + 0x251C, 0x251C, 0x1D63, 0x251D, 0x251D, 0x1D67, 0x251E, 0x251E, 0x1D65, + 0x251F, 0x251F, 0x1D64, 0x2520, 0x2520, 0x1D66, 0x2521, 0x2521, 0x1D69, + 0x2522, 0x2522, 0x1D68, 0x2523, 0x2524, 0x1D6A, 0x2525, 0x2525, 0x1D6F, + 0x2526, 0x2526, 0x1D6D, 0x2527, 0x2527, 0x1D6C, 0x2528, 0x2528, 0x1D6E, + 0x2529, 0x2529, 0x1D71, 0x252A, 0x252A, 0x1D70, 0x252B, 0x252B, 0x1D72, + 0x252C, 0x252C, 0x1D5B, 0x252D, 0x252F, 0x1D5D, 0x2530, 0x2530, 0x1D5C, + 0x2531, 0x2533, 0x1D60, 0x2534, 0x2534, 0x1D53, 0x2535, 0x2537, 0x1D55, + 0x2538, 0x2538, 0x1D54, 0x2539, 0x253B, 0x1D58, 0x253D, 0x253F, 0x1D77, + 0x2540, 0x2540, 0x1D75, 0x2541, 0x2541, 0x1D74, 0x2542, 0x2542, 0x1D76, + 0x2543, 0x2543, 0x1D7B, 0x2544, 0x2544, 0x1D7D, 0x2545, 0x2545, 0x1D7A, + 0x2546, 0x2546, 0x1D7C, 0x2547, 0x2547, 0x1D81, 0x2548, 0x2548, 0x1D80, + 0x2549, 0x254A, 0x1D7E, 0x261C, 0x261C, 0x201D, 0x261D, 0x261D, 0x201B, + 0x261E, 0x261E, 0x201E, 0x261F, 0x261F, 0x201C, 0x2702, 0x2702, 0x2F92, + 0x27A1, 0x27A1, 0x2011, 0x3001, 0x3002, 0x1ECF, 0x3008, 0x3011, 0x1EE3, + 0x3013, 0x3013, 0x204E, 0x3014, 0x3015, 0x1EDD, 0x301C, 0x301C, 0x1ED6, + 0x301D, 0x301D, 0x1F14, 0x301F, 0x301F, 0x1F15, 0x3041, 0x3041, 0x1EEE, + 0x3043, 0x3043, 0x1EEF, 0x3045, 0x3045, 0x1EF0, 0x3047, 0x3047, 0x1EF1, + 0x3049, 0x3049, 0x1EF2, 0x3063, 0x3063, 0x1EF3, 0x3083, 0x3083, 0x1EF4, + 0x3085, 0x3085, 0x1EF5, 0x3087, 0x3087, 0x1EF6, 0x308E, 0x308E, 0x1EF7, + 0x309B, 0x309B, 0x2050, 0x309C, 0x309C, 0x204F, 0x30A1, 0x30A1, 0x1EF8, + 0x30A3, 0x30A3, 0x1EF9, 0x30A5, 0x30A5, 0x1EFA, 0x30A7, 0x30A7, 0x1EFB, + 0x30A9, 0x30A9, 0x1EFC, 0x30C3, 0x30C3, 0x1EFD, 0x30E3, 0x30E3, 0x1EFE, + 0x30E5, 0x30E5, 0x1EFF, 0x30E7, 0x30E7, 0x1F00, 0x30EE, 0x30EE, 0x1F01, + 0x30F5, 0x30F6, 0x1F02, 0x30FC, 0x30FC, 0x1ED3, 0x3300, 0x3300, 0x209E, + 0x3301, 0x3302, 0x2EB6, 0x3303, 0x3303, 0x2092, 0x3304, 0x3304, 0x2EB8, + 0x3305, 0x3305, 0x208D, 0x3306, 0x3306, 0x2EB9, 0x3307, 0x3307, 0x2EBD, + 0x3308, 0x3308, 0x2EBB, 0x3309, 0x3309, 0x2EC0, 0x330A, 0x330A, 0x2EBE, + 0x330B, 0x330B, 0x2EC2, 0x330C, 0x330C, 0x2EC4, 0x330D, 0x330D, 0x1F0E, + 0x330E, 0x3313, 0x2EC5, 0x3314, 0x3314, 0x1F05, 0x3315, 0x3315, 0x2094, + 0x3316, 0x3316, 0x208A, 0x3317, 0x3317, 0x2ECC, 0x3318, 0x3318, 0x2093, + 0x3319, 0x3319, 0x2ECE, 0x331A, 0x331D, 0x2ED0, 0x331E, 0x331E, 0x20A1, + 0x331F, 0x3321, 0x2ED4, 0x3322, 0x3322, 0x2089, 0x3323, 0x3323, 0x209C, + 0x3324, 0x3324, 0x2ED7, 0x3325, 0x3325, 0x2ED9, 0x3326, 0x3326, 0x1F0F, + 0x3327, 0x3327, 0x1F09, 0x3328, 0x3329, 0x2EDC, 0x332A, 0x332A, 0x20A4, + 0x332B, 0x332B, 0x1F11, 0x332D, 0x332D, 0x2EDF, 0x332E, 0x3330, 0x2EE2, + 0x3331, 0x3331, 0x20A6, 0x3332, 0x3332, 0x2EE5, 0x3333, 0x3333, 0x208E, + 0x3334, 0x3335, 0x2EE8, 0x3336, 0x3336, 0x1F0B, 0x3337, 0x3337, 0x2EEE, + 0x3338, 0x3338, 0x2EF0, 0x3339, 0x3339, 0x2097, 0x333A, 0x333A, 0x2EF1, + 0x333B, 0x333B, 0x209D, 0x333C, 0x333C, 0x2EEA, 0x333D, 0x333D, 0x2EF2, + 0x333E, 0x3340, 0x2EF4, 0x3341, 0x3341, 0x2EF3, 0x3342, 0x3342, 0x209B, + 0x3343, 0x3346, 0x2EF7, 0x3347, 0x3347, 0x20A5, 0x3348, 0x3348, 0x2EFB, + 0x3349, 0x3349, 0x1F04, 0x334A, 0x334A, 0x1F12, 0x334B, 0x334C, 0x2EFC, + 0x334D, 0x334D, 0x1F07, 0x334E, 0x334E, 0x2091, 0x334F, 0x3350, 0x2EFE, + 0x3351, 0x3351, 0x1F0C, 0x3352, 0x3352, 0x2F02, 0x3353, 0x3353, 0x2F06, + 0x3354, 0x3354, 0x2F03, 0x3355, 0x3356, 0x2F07, 0x3357, 0x3357, 0x2098, + 0x337F, 0x337F, 0x2084, 0xFF08, 0xFF09, 0x1EDB, 0xFF0C, 0xFF0C, 0x204C, + 0xFF0E, 0xFF0E, 0x2052, 0xFF1D, 0xFF1D, 0x1EED, 0xFF3B, 0xFF3B, 0x1EDF, + 0xFF3D, 0xFF3D, 0x1EE0, 0xFF3F, 0xFF3F, 0x1ED2, 0xFF5B, 0xFF5B, 0x1EE1, + 0xFF5C, 0xFF5C, 0x1ED8, 0xFF5D, 0xFF5D, 0x1EE2, 0xFF5E, 0xFF5E, 0x1ED6, + 0xFFE3, 0xFFE3, 0x1ED1, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-H_4.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-H_4.cpp new file mode 100644 index 000000000000..a8c846111f32 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-H_4.cpp @@ -0,0 +1,2182 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_UniJIS_UCS2_H_4[9772 * 2] = { + 0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004, 0x0024, + 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008, 0x0028, 0x0009, + 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C, 0x002C, 0x000D, 0x002D, + 0x000E, 0x002E, 0x000F, 0x002F, 0x0010, 0x0030, 0x0011, 0x0031, 0x0012, + 0x0032, 0x0013, 0x0033, 0x0014, 0x0034, 0x0015, 0x0035, 0x0016, 0x0036, + 0x0017, 0x0037, 0x0018, 0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, + 0x003B, 0x001C, 0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, + 0x0020, 0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024, + 0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028, 0x0048, + 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C, 0x004C, 0x002D, + 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030, 0x0050, 0x0031, 0x0051, + 0x0032, 0x0052, 0x0033, 0x0053, 0x0034, 0x0054, 0x0035, 0x0055, 0x0036, + 0x0056, 0x0037, 0x0057, 0x0038, 0x0058, 0x0039, 0x0059, 0x003A, 0x005A, + 0x003B, 0x005B, 0x003C, 0x005C, 0x0061, 0x005D, 0x003E, 0x005E, 0x003F, + 0x005F, 0x0040, 0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, + 0x0044, 0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048, + 0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C, 0x006C, + 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050, 0x0070, 0x0051, + 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054, 0x0074, 0x0055, 0x0075, + 0x0056, 0x0076, 0x0057, 0x0077, 0x0058, 0x0078, 0x0059, 0x0079, 0x005A, + 0x007A, 0x005B, 0x007B, 0x005C, 0x007C, 0x005D, 0x007D, 0x005E, 0x007E, + 0x005F, 0x00A1, 0x0065, 0x00A2, 0x0066, 0x00A3, 0x0067, 0x00A4, 0x006B, + 0x00A5, 0x003D, 0x00A6, 0x0063, 0x00A7, 0x02D0, 0x00A8, 0x0287, 0x00A9, + 0x0098, 0x00AA, 0x008C, 0x00AB, 0x006D, 0x00AC, 0x0099, 0x00AD, 0x0097, + 0x00AE, 0x009A, 0x00AF, 0x0081, 0x00B0, 0x02C3, 0x00B1, 0x02B6, 0x00B2, + 0x009D, 0x00B3, 0x009E, 0x00B4, 0x0285, 0x00B5, 0x009F, 0x00B6, 0x030A, + 0x00B7, 0x0075, 0x00B8, 0x0086, 0x00B9, 0x00A0, 0x00BA, 0x0090, 0x00BB, + 0x007B, 0x00BC, 0x00A1, 0x00BD, 0x00A2, 0x00BE, 0x00A3, 0x00BF, 0x007E, + 0x00C0, 0x00A4, 0x00C1, 0x00A5, 0x00C2, 0x00A6, 0x00C3, 0x00A7, 0x00C4, + 0x00A8, 0x00C5, 0x00A9, 0x00C6, 0x008B, 0x00C7, 0x00AA, 0x00C8, 0x00AB, + 0x00C9, 0x00AC, 0x00CA, 0x00AD, 0x00CB, 0x00AE, 0x00CC, 0x00AF, 0x00CD, + 0x00B0, 0x00CE, 0x00B1, 0x00CF, 0x00B2, 0x00D0, 0x00B3, 0x00D1, 0x00B4, + 0x00D2, 0x00B5, 0x00D3, 0x00B6, 0x00D4, 0x00B7, 0x00D5, 0x00B8, 0x00D6, + 0x00B9, 0x00D7, 0x02B7, 0x00D8, 0x008E, 0x00D9, 0x00BB, 0x00DA, 0x00BC, + 0x00DB, 0x00BD, 0x00DC, 0x00BE, 0x00DD, 0x00BF, 0x00DE, 0x00C0, 0x00DF, + 0x0096, 0x00E0, 0x00C1, 0x00E1, 0x00C2, 0x00E2, 0x00C3, 0x00E3, 0x00C4, + 0x00E4, 0x00C5, 0x00E5, 0x00C6, 0x00E6, 0x0091, 0x00E7, 0x00C7, 0x00E8, + 0x00C8, 0x00E9, 0x00C9, 0x00EA, 0x00CA, 0x00EB, 0x00CB, 0x00EC, 0x00CC, + 0x00ED, 0x00CD, 0x00EE, 0x00CE, 0x00EF, 0x00CF, 0x00F0, 0x00D0, 0x00F1, + 0x00D1, 0x00F2, 0x00D2, 0x00F3, 0x00D3, 0x00F4, 0x00D4, 0x00F5, 0x00D5, + 0x00F6, 0x00D6, 0x00F7, 0x02B8, 0x00F8, 0x0094, 0x00F9, 0x00D8, 0x00FA, + 0x00D9, 0x00FB, 0x00DA, 0x00FC, 0x00DB, 0x00FD, 0x00DC, 0x00FE, 0x00DD, + 0x00FF, 0x00DE, 0x0100, 0x2496, 0x0101, 0x2491, 0x0112, 0x2499, 0x0113, + 0x2494, 0x011A, 0x24B3, 0x011B, 0x24BF, 0x0127, 0x2F3C, 0x0128, 0x24B8, + 0x0129, 0x24C4, 0x012A, 0x2497, 0x012B, 0x2492, 0x0131, 0x0092, 0x0141, + 0x008D, 0x0142, 0x0093, 0x014B, 0x24DC, 0x014C, 0x249A, 0x014D, 0x2495, + 0x0152, 0x008F, 0x0153, 0x0095, 0x0160, 0x00DF, 0x0161, 0x00E3, 0x0168, + 0x24BD, 0x0169, 0x24C9, 0x016A, 0x2498, 0x016B, 0x2493, 0x016E, 0x24BC, + 0x016F, 0x24C8, 0x0178, 0x00E0, 0x017D, 0x00E1, 0x017E, 0x00E5, 0x01C0, + 0x0063, 0x01CD, 0x24B2, 0x01CE, 0x24BE, 0x01CF, 0x24B6, 0x01D0, 0x24C2, + 0x01D1, 0x24B9, 0x01D2, 0x24C5, 0x01D3, 0x24BB, 0x01D4, 0x24C7, 0x01FD, + 0x24CD, 0x0251, 0x24CA, 0x0254, 0x24CF, 0x0259, 0x24D2, 0x025A, 0x24D5, + 0x025B, 0x24D8, 0x0275, 0x24DD, 0x0283, 0x24E2, 0x028C, 0x24DE, 0x0292, + 0x24E1, 0x02D0, 0x24E3, 0x0300, 0x0041, 0x0301, 0x007F, 0x0302, 0x0080, + 0x0303, 0x005F, 0x0304, 0x0081, 0x0305, 0x00E2, 0x0306, 0x0082, 0x0307, + 0x0083, 0x0308, 0x0084, 0x030A, 0x0085, 0x030B, 0x0087, 0x030C, 0x0089, + 0x0327, 0x0086, 0x0328, 0x0088, 0x0332, 0x0040, 0x0336, 0x008A, 0x0361, + 0x02F6, 0x0391, 0x03F3, 0x0392, 0x03F4, 0x0393, 0x03F5, 0x0394, 0x03F6, + 0x0395, 0x03F7, 0x0396, 0x03F8, 0x0397, 0x03F9, 0x0398, 0x03FA, 0x0399, + 0x03FB, 0x039A, 0x03FC, 0x039B, 0x03FD, 0x039C, 0x03FE, 0x039D, 0x03FF, + 0x039E, 0x0400, 0x039F, 0x0401, 0x03A0, 0x0402, 0x03A1, 0x0403, 0x03A3, + 0x0404, 0x03A4, 0x0405, 0x03A5, 0x0406, 0x03A6, 0x0407, 0x03A7, 0x0408, + 0x03A8, 0x0409, 0x03A9, 0x040A, 0x03B1, 0x040B, 0x03B2, 0x040C, 0x03B3, + 0x040D, 0x03B4, 0x040E, 0x03B5, 0x040F, 0x03B6, 0x0410, 0x03B7, 0x0411, + 0x03B8, 0x0412, 0x03B9, 0x0413, 0x03BA, 0x0414, 0x03BB, 0x0415, 0x03BC, + 0x0416, 0x03BD, 0x0417, 0x03BE, 0x0418, 0x03BF, 0x0419, 0x03C0, 0x041A, + 0x03C1, 0x041B, 0x03C3, 0x041C, 0x03C4, 0x041D, 0x03C5, 0x041E, 0x03C6, + 0x041F, 0x03C7, 0x0420, 0x03C8, 0x0421, 0x03C9, 0x0422, 0x03D0, 0x2F3A, + 0x03D1, 0x2F40, 0x03DB, 0x2F3F, 0x0401, 0x0429, 0x0410, 0x0423, 0x0411, + 0x0424, 0x0412, 0x0425, 0x0413, 0x0426, 0x0414, 0x0427, 0x0415, 0x0428, + 0x0416, 0x042A, 0x0417, 0x042B, 0x0418, 0x042C, 0x0419, 0x042D, 0x041A, + 0x042E, 0x041B, 0x042F, 0x041C, 0x0430, 0x041D, 0x0431, 0x041E, 0x0432, + 0x041F, 0x0433, 0x0420, 0x0434, 0x0421, 0x0435, 0x0422, 0x0436, 0x0423, + 0x0437, 0x0424, 0x0438, 0x0425, 0x0439, 0x0426, 0x043A, 0x0427, 0x043B, + 0x0428, 0x043C, 0x0429, 0x043D, 0x042A, 0x043E, 0x042B, 0x043F, 0x042C, + 0x0440, 0x042D, 0x0441, 0x042E, 0x0442, 0x042F, 0x0443, 0x0430, 0x0444, + 0x0431, 0x0445, 0x0432, 0x0446, 0x0433, 0x0447, 0x0434, 0x0448, 0x0435, + 0x0449, 0x0436, 0x044B, 0x0437, 0x044C, 0x0438, 0x044D, 0x0439, 0x044E, + 0x043A, 0x044F, 0x043B, 0x0450, 0x043C, 0x0451, 0x043D, 0x0452, 0x043E, + 0x0453, 0x043F, 0x0454, 0x0440, 0x0455, 0x0441, 0x0456, 0x0442, 0x0457, + 0x0443, 0x0458, 0x0444, 0x0459, 0x0445, 0x045A, 0x0446, 0x045B, 0x0447, + 0x045C, 0x0448, 0x045D, 0x0449, 0x045E, 0x044A, 0x045F, 0x044B, 0x0460, + 0x044C, 0x0461, 0x044D, 0x0462, 0x044E, 0x0463, 0x044F, 0x0464, 0x0451, + 0x044A, 0x045B, 0x2F3C, 0x1EBC, 0x24B5, 0x1EBD, 0x24C1, 0x2002, 0x00E7, + 0x2003, 0x0279, 0x2010, 0x0296, 0x2011, 0x000E, 0x2012, 0x0072, 0x2013, + 0x0072, 0x2014, 0x008A, 0x2015, 0x0295, 0x2016, 0x029A, 0x2018, 0x029E, + 0x2019, 0x029F, 0x201A, 0x0078, 0x201C, 0x02A0, 0x201D, 0x02A1, 0x201E, + 0x0079, 0x2020, 0x0308, 0x2021, 0x0309, 0x2022, 0x0077, 0x2025, 0x029D, + 0x2026, 0x029C, 0x2030, 0x0304, 0x2032, 0x02C4, 0x2033, 0x02C5, 0x2039, + 0x006E, 0x203A, 0x006F, 0x203B, 0x02DE, 0x203C, 0x2F4F, 0x203E, 0x0145, + 0x2044, 0x0068, 0x2049, 0x2F50, 0x2070, 0x24A1, 0x2074, 0x24A2, 0x2075, + 0x24A3, 0x2076, 0x24A4, 0x2077, 0x24A5, 0x2078, 0x24A6, 0x2079, 0x24A7, + 0x2080, 0x24A8, 0x2081, 0x24A9, 0x2082, 0x24AA, 0x2083, 0x24AB, 0x2084, + 0x24AC, 0x2085, 0x24AD, 0x2086, 0x24AE, 0x2087, 0x24AF, 0x2088, 0x24B0, + 0x2089, 0x24B1, 0x20AC, 0x248A, 0x20DD, 0x030B, 0x2100, 0x2E4F, 0x2103, + 0x02C6, 0x2105, 0x2E53, 0x2109, 0x2071, 0x210A, 0x2070, 0x210F, 0x2F3C, + 0x2113, 0x1F59, 0x2116, 0x1DBA, 0x2121, 0x1F77, 0x2122, 0x00E4, 0x2126, + 0x248B, 0x212B, 0x0303, 0x2135, 0x2F39, 0x2153, 0x249F, 0x2154, 0x24A0, + 0x215B, 0x249B, 0x215C, 0x249C, 0x215D, 0x249D, 0x215E, 0x249E, 0x2160, + 0x1D97, 0x2161, 0x1D98, 0x2162, 0x1D99, 0x2163, 0x1D9A, 0x2164, 0x1D9B, + 0x2165, 0x1D9C, 0x2166, 0x1D9D, 0x2167, 0x1D9E, 0x2168, 0x1D9F, 0x2169, + 0x1DA0, 0x216A, 0x2021, 0x216B, 0x2022, 0x2170, 0x1F9C, 0x2171, 0x1F9D, + 0x2172, 0x1F9E, 0x2173, 0x1F9F, 0x2174, 0x1FA0, 0x2175, 0x1FA1, 0x2176, + 0x1FA2, 0x2177, 0x1FA3, 0x2178, 0x1FA4, 0x2179, 0x1FA5, 0x217A, 0x206A, + 0x217B, 0x206B, 0x217F, 0x206F, 0x2190, 0x02E1, 0x2191, 0x02E2, 0x2192, + 0x02E0, 0x2193, 0x02E3, 0x2194, 0x2FA9, 0x2195, 0x2FB7, 0x2196, 0x2FAC, + 0x2197, 0x2FAD, 0x2198, 0x2FAA, 0x2199, 0x2FAB, 0x21C4, 0x2076, 0x21C5, + 0x2077, 0x21C6, 0x2075, 0x21CC, 0x2FAE, 0x21D0, 0x2FA8, 0x21D2, 0x02F0, + 0x21D4, 0x02F1, 0x21E6, 0x1F4D, 0x21E7, 0x1F4C, 0x21E8, 0x1F4E, 0x21E9, + 0x1F4B, 0x2200, 0x02F2, 0x2202, 0x02F7, 0x2203, 0x02F3, 0x2205, 0x2F98, + 0x2207, 0x02F8, 0x2208, 0x02E5, 0x220A, 0x2F3B, 0x220B, 0x02E6, 0x2211, + 0x1DC9, 0x2212, 0x02B5, 0x2213, 0x2F56, 0x221A, 0x02FD, 0x221D, 0x02FF, + 0x221E, 0x02BF, 0x221F, 0x1DCD, 0x2220, 0x02F4, 0x2225, 0x029A, 0x2227, + 0x02ED, 0x2228, 0x02EE, 0x2229, 0x02EC, 0x222A, 0x02EB, 0x222B, 0x0301, + 0x222C, 0x0302, 0x222D, 0x2003, 0x222E, 0x1DC8, 0x2234, 0x02C0, 0x2235, + 0x0300, 0x223C, 0x0299, 0x223D, 0x02FE, 0x2243, 0x2F58, 0x2252, 0x02FA, + 0x2260, 0x02BA, 0x2261, 0x02F9, 0x2266, 0x02BD, 0x2267, 0x02BE, 0x226A, + 0x02FB, 0x226B, 0x02FC, 0x2272, 0x2F59, 0x2273, 0x2F5A, 0x2282, 0x02E9, + 0x2283, 0x02EA, 0x2286, 0x02E7, 0x2287, 0x02E8, 0x2295, 0x2F9C, 0x2296, + 0x2F9A, 0x2297, 0x2F9D, 0x2298, 0x2F9B, 0x229D, 0x2F9A, 0x229E, 0x2F9E, + 0x22A0, 0x2F99, 0x22A5, 0x02F5, 0x22BF, 0x1DCE, 0x22EE, 0x1ED9, 0x22EF, + 0x029C, 0x2300, 0x2F98, 0x2307, 0x2FBB, 0x2312, 0x02F6, 0x244A, 0x2F54, + 0x2460, 0x1D83, 0x2461, 0x1D84, 0x2462, 0x1D85, 0x2463, 0x1D86, 0x2464, + 0x1D87, 0x2465, 0x1D88, 0x2466, 0x1D89, 0x2467, 0x1D8A, 0x2468, 0x1D8B, + 0x2469, 0x1D8C, 0x246A, 0x1D8D, 0x246B, 0x1D8E, 0x246C, 0x1D8F, 0x246D, + 0x1D90, 0x246E, 0x1D91, 0x246F, 0x1D92, 0x2470, 0x1D93, 0x2471, 0x1D94, + 0x2472, 0x1D95, 0x2473, 0x1D96, 0x2474, 0x1F87, 0x2475, 0x1F88, 0x2476, + 0x1F89, 0x2477, 0x1F8A, 0x2478, 0x1F8B, 0x2479, 0x1F8C, 0x247A, 0x1F8D, + 0x247B, 0x1F8E, 0x247C, 0x1F8F, 0x247D, 0x1F90, 0x247E, 0x1F91, 0x247F, + 0x1F92, 0x2480, 0x1F93, 0x2481, 0x1F94, 0x2482, 0x1F95, 0x2483, 0x1F96, + 0x2484, 0x1F97, 0x2485, 0x1F98, 0x2486, 0x1F99, 0x2487, 0x1F9A, 0x2488, + 0x1F7E, 0x2489, 0x1F7F, 0x248A, 0x1F80, 0x248B, 0x1F81, 0x248C, 0x1F82, + 0x248D, 0x1F83, 0x248E, 0x1F84, 0x248F, 0x1F85, 0x2490, 0x1F86, 0x249C, + 0x1FB0, 0x249D, 0x1FB1, 0x249E, 0x1FB2, 0x249F, 0x1FB3, 0x24A0, 0x1FB4, + 0x24A1, 0x1FB5, 0x24A2, 0x1FB6, 0x24A3, 0x1FB7, 0x24A4, 0x1FB8, 0x24A5, + 0x1FB9, 0x24A6, 0x1FBA, 0x24A7, 0x1FBB, 0x24A8, 0x1FBC, 0x24A9, 0x1FBD, + 0x24AA, 0x1FBE, 0x24AB, 0x1FBF, 0x24AC, 0x1FC0, 0x24AD, 0x1FC1, 0x24AE, + 0x1FC2, 0x24AF, 0x1FC3, 0x24B0, 0x1FC4, 0x24B1, 0x1FC5, 0x24B2, 0x1FC6, + 0x24B3, 0x1FC7, 0x24B4, 0x1FC8, 0x24B5, 0x1FC9, 0x24B6, 0x2863, 0x24B7, + 0x2864, 0x24B8, 0x2865, 0x24B9, 0x2866, 0x24BA, 0x2867, 0x24BB, 0x2868, + 0x24BC, 0x2869, 0x24BD, 0x286A, 0x24BE, 0x286B, 0x24BF, 0x286C, 0x24C0, + 0x286D, 0x24C1, 0x286E, 0x24C2, 0x286F, 0x24C3, 0x2870, 0x24C4, 0x2871, + 0x24C5, 0x2872, 0x24C6, 0x2873, 0x24C7, 0x2874, 0x24C8, 0x2875, 0x24C9, + 0x2876, 0x24CA, 0x2877, 0x24CB, 0x2878, 0x24CC, 0x2879, 0x24CD, 0x287A, + 0x24CE, 0x287B, 0x24CF, 0x287C, 0x24D0, 0x2849, 0x24D1, 0x284A, 0x24D2, + 0x284B, 0x24D3, 0x284C, 0x24D4, 0x284D, 0x24D5, 0x284E, 0x24D6, 0x284F, + 0x24D7, 0x2850, 0x24D8, 0x2851, 0x24D9, 0x2852, 0x24DA, 0x2853, 0x24DB, + 0x2854, 0x24DC, 0x2855, 0x24DD, 0x2856, 0x24DE, 0x2857, 0x24DF, 0x2858, + 0x24E0, 0x2859, 0x24E1, 0x285A, 0x24E2, 0x285B, 0x24E3, 0x285C, 0x24E4, + 0x285D, 0x24E5, 0x285E, 0x24E6, 0x285F, 0x24E7, 0x2860, 0x24E8, 0x2861, + 0x24E9, 0x2862, 0x24EA, 0x2020, 0x2500, 0x1D37, 0x2501, 0x1D38, 0x2502, + 0x1D39, 0x2503, 0x1D3A, 0x2504, 0x1D3B, 0x2505, 0x1D3C, 0x2506, 0x1D3D, + 0x2507, 0x1D3E, 0x2508, 0x1D3F, 0x2509, 0x1D40, 0x250A, 0x1D41, 0x250B, + 0x1D42, 0x250C, 0x1D43, 0x250D, 0x1D44, 0x250E, 0x1D45, 0x250F, 0x1D46, + 0x2510, 0x1D47, 0x2511, 0x1D48, 0x2512, 0x1D49, 0x2513, 0x1D4A, 0x2514, + 0x1D4B, 0x2515, 0x1D4C, 0x2516, 0x1D4D, 0x2517, 0x1D4E, 0x2518, 0x1D4F, + 0x2519, 0x1D50, 0x251A, 0x1D51, 0x251B, 0x1D52, 0x251C, 0x1D53, 0x251D, + 0x1D54, 0x251E, 0x1D55, 0x251F, 0x1D56, 0x2520, 0x1D57, 0x2521, 0x1D58, + 0x2522, 0x1D59, 0x2523, 0x1D5A, 0x2524, 0x1D5B, 0x2525, 0x1D5C, 0x2526, + 0x1D5D, 0x2527, 0x1D5E, 0x2528, 0x1D5F, 0x2529, 0x1D60, 0x252A, 0x1D61, + 0x252B, 0x1D62, 0x252C, 0x1D63, 0x252D, 0x1D64, 0x252E, 0x1D65, 0x252F, + 0x1D66, 0x2530, 0x1D67, 0x2531, 0x1D68, 0x2532, 0x1D69, 0x2533, 0x1D6A, + 0x2534, 0x1D6B, 0x2535, 0x1D6C, 0x2536, 0x1D6D, 0x2537, 0x1D6E, 0x2538, + 0x1D6F, 0x2539, 0x1D70, 0x253A, 0x1D71, 0x253B, 0x1D72, 0x253C, 0x1D73, + 0x253D, 0x1D74, 0x253E, 0x1D75, 0x253F, 0x1D76, 0x2540, 0x1D77, 0x2541, + 0x1D78, 0x2542, 0x1D79, 0x2543, 0x1D7A, 0x2544, 0x1D7B, 0x2545, 0x1D7C, + 0x2546, 0x1D7D, 0x2547, 0x1D7E, 0x2548, 0x1D7F, 0x2549, 0x1D80, 0x254A, + 0x1D81, 0x254B, 0x1D82, 0x2550, 0x203B, 0x255E, 0x203C, 0x2561, 0x203E, + 0x256A, 0x203D, 0x256D, 0x2037, 0x256E, 0x2038, 0x256F, 0x203A, 0x2570, + 0x2039, 0x2571, 0x2045, 0x2572, 0x2046, 0x2573, 0x2047, 0x2581, 0x2026, + 0x2582, 0x2027, 0x2583, 0x2028, 0x2584, 0x2029, 0x2585, 0x202A, 0x2586, + 0x202B, 0x2587, 0x202C, 0x2588, 0x202D, 0x2589, 0x2034, 0x258A, 0x2033, + 0x258B, 0x2032, 0x258C, 0x2031, 0x258D, 0x2030, 0x258E, 0x202F, 0x258F, + 0x202E, 0x2594, 0x2035, 0x2595, 0x2036, 0x25A0, 0x02D9, 0x25A1, 0x02D8, + 0x25A2, 0x1F4F, 0x25AA, 0x2FCF, 0x25AB, 0x2FCD, 0x25B2, 0x02DB, 0x25B3, + 0x02DA, 0x25B6, 0x2FA3, 0x25B7, 0x1F4A, 0x25BC, 0x02DD, 0x25BD, 0x02DC, + 0x25C0, 0x2FA2, 0x25C1, 0x1F49, 0x25C6, 0x02D7, 0x25C7, 0x02D6, 0x25C9, + 0x2012, 0x25CB, 0x02D3, 0x25CC, 0x2906, 0x25CE, 0x02D5, 0x25CF, 0x02D4, + 0x25E2, 0x203F, 0x25E3, 0x2040, 0x25E4, 0x2042, 0x25E5, 0x2041, 0x25E6, + 0x2FDE, 0x25EF, 0x030B, 0x2600, 0x2017, 0x2601, 0x2018, 0x2602, 0x2019, + 0x2603, 0x201A, 0x2605, 0x02D2, 0x2606, 0x02D1, 0x260E, 0x1F78, 0x2612, + 0x2F99, 0x261C, 0x201C, 0x261D, 0x201D, 0x261E, 0x201B, 0x261F, 0x201E, + 0x2640, 0x02C2, 0x2642, 0x02C1, 0x2660, 0x2013, 0x2661, 0x1F51, 0x2662, + 0x1F53, 0x2663, 0x2015, 0x2664, 0x1F52, 0x2665, 0x2014, 0x2666, 0x2016, + 0x2667, 0x1F50, 0x2668, 0x2F42, 0x2669, 0x2F43, 0x266A, 0x0307, 0x266C, + 0x2F44, 0x266D, 0x0306, 0x266F, 0x0305, 0x2702, 0x2F90, 0x271A, 0x2FD1, + 0x2756, 0x2FE3, 0x2776, 0x205E, 0x2777, 0x205F, 0x2778, 0x2060, 0x2779, + 0x2061, 0x277A, 0x2062, 0x277B, 0x2063, 0x277C, 0x2064, 0x277D, 0x2065, + 0x277E, 0x2066, 0x27A1, 0x200E, 0x2E83, 0x37E1, 0x2E85, 0x3620, 0x2E87, + 0x3719, 0x2E89, 0x3814, 0x2E8B, 0x371E, 0x2E8C, 0x3609, 0x2E8D, 0x360A, + 0x2E8E, 0x1071, 0x2E8F, 0x388C, 0x2E90, 0x1226, 0x2E92, 0x0EB2, 0x2E93, + 0x1283, 0x2E94, 0x12AB, 0x2E95, 0x3C1F, 0x2E96, 0x38C2, 0x2E97, 0x361C, + 0x2E98, 0x38E1, 0x2E99, 0x13C3, 0x2E9B, 0x13E1, 0x2E9F, 0x0E3C, 0x2EA0, + 0x0EBD, 0x2EA1, 0x3961, 0x2EA2, 0x3962, 0x2EA3, 0x399D, 0x2EA4, 0x3C26, + 0x2EA6, 0x374D, 0x2EA8, 0x39BC, 0x2EA9, 0x35A1, 0x2EAA, 0x36AB, 0x2EAB, + 0x3A97, 0x2EAC, 0x08D4, 0x2EAD, 0x3A39, 0x2EAE, 0x3662, 0x2EB1, 0x3A98, + 0x2EB2, 0x3A97, 0x2EB3, 0x376D, 0x2EB7, 0x36FE, 0x2EB9, 0x3713, 0x2EBC, + 0x35B3, 0x2EBD, 0x354E, 0x2EBE, 0x3775, 0x2EBF, 0x3776, 0x2EC0, 0x3777, + 0x2EC1, 0x078B, 0x2EC2, 0x3B0A, 0x2EC3, 0x362E, 0x2EC4, 0x0A62, 0x2EC6, + 0x3572, 0x2ECA, 0x364A, 0x2ECC, 0x3C2B, 0x2ECD, 0x3B50, 0x2ECF, 0x3B9E, + 0x2ED1, 0x0BD5, 0x2ED2, 0x3B97, 0x2ED6, 0x3B9E, 0x2ED7, 0x354D, 0x2ED8, + 0x0A68, 0x2EDD, 0x3617, 0x2EDE, 0x3619, 0x2EDF, 0x3618, 0x2EE4, 0x064E, + 0x2EE8, 0x0D34, 0x2EE9, 0x052B, 0x2EEB, 0x0A6A, 0x2EED, 0x08C3, 0x2EEF, + 0x0F7D, 0x2EF2, 0x064F, 0x2F00, 0x04B0, 0x2F01, 0x20B3, 0x2F02, 0x0FFF, + 0x2F03, 0x1001, 0x2F04, 0x0535, 0x2F05, 0x1006, 0x2F06, 0x0CCB, 0x2F07, + 0x100E, 0x2F08, 0x0A13, 0x2F09, 0x1070, 0x2F0A, 0x0CD6, 0x2F0B, 0x0D40, + 0x2F0C, 0x107B, 0x2F0D, 0x1083, 0x2F0E, 0x1089, 0x2F0F, 0x1093, 0x2F10, + 0x1098, 0x2F11, 0x0C5B, 0x2F12, 0x0F97, 0x2F13, 0x10C6, 0x2F14, 0x10CD, + 0x2F15, 0x10CE, 0x2F16, 0x10D3, 0x2F17, 0x0947, 0x2F18, 0x0E7C, 0x2F19, + 0x10DC, 0x2F1A, 0x10E1, 0x2F1B, 0x10E8, 0x2F1C, 0x0EA2, 0x2F1D, 0x07B1, + 0x2F1E, 0x116B, 0x2F1F, 0x0C54, 0x2F20, 0x089C, 0x2F21, 0x11BA, 0x2F22, + 0x11BB, 0x2F23, 0x0F26, 0x2F24, 0x0B47, 0x2F25, 0x0981, 0x2F26, 0x08A0, + 0x2F27, 0x120E, 0x2F28, 0x0A47, 0x2F29, 0x0996, 0x2F2A, 0x1226, 0x2F2B, + 0x1228, 0x2F2C, 0x1232, 0x2F2D, 0x0881, 0x2F2E, 0x126C, 0x2F2F, 0x07BB, + 0x2F30, 0x077E, 0x2F31, 0x06CA, 0x2F32, 0x05EF, 0x2F33, 0x1283, 0x2F34, + 0x1285, 0x2F35, 0x1299, 0x2F36, 0x129B, 0x2F37, 0x12A0, 0x2F38, 0x0677, + 0x2F39, 0x38B9, 0x2F3A, 0x12AF, 0x2F3B, 0x12B1, 0x2F3C, 0x09FA, 0x2F3D, + 0x1342, 0x2F3E, 0x0781, 0x2F3F, 0x0916, 0x2F40, 0x08A7, 0x2F41, 0x13C2, + 0x2F42, 0x0E08, 0x2F43, 0x0C47, 0x2F44, 0x06CC, 0x2F45, 0x0E4D, 0x2F46, + 0x13E0, 0x2F47, 0x0CD4, 0x2F48, 0x140C, 0x2F49, 0x0744, 0x2F4A, 0x0EE6, + 0x2F4B, 0x073D, 0x2F4C, 0x08AD, 0x2F4D, 0x14E5, 0x2F4E, 0x14F4, 0x2F4F, + 0x14F8, 0x2F50, 0x0D7A, 0x2F51, 0x0EDF, 0x2F52, 0x08AF, 0x2F53, 0x1502, + 0x2F54, 0x0A2B, 0x2F55, 0x0550, 0x2F56, 0x0BFA, 0x2F57, 0x0DD5, 0x2F58, + 0x15E4, 0x2F59, 0x15E6, 0x2F5A, 0x0E22, 0x2F5B, 0x0567, 0x2F5C, 0x0687, + 0x2F5D, 0x0758, 0x2F5E, 0x0770, 0x2F5F, 0x06C4, 0x2F60, 0x04DD, 0x2F61, + 0x05E0, 0x2F62, 0x0601, 0x2F63, 0x0A5C, 0x2F64, 0x0F3B, 0x2F65, 0x0C3E, + 0x2F66, 0x0D97, 0x2F67, 0x3A00, 0x2F68, 0x1697, 0x2F69, 0x0D28, 0x2F6A, + 0x0D7D, 0x2F6B, 0x087C, 0x2F6C, 0x0EE8, 0x2F6D, 0x0EC3, 0x2F6E, 0x0EFC, + 0x2F6F, 0x0A74, 0x2F70, 0x08D4, 0x2F71, 0x3A41, 0x2F72, 0x0553, 0x2F73, + 0x0740, 0x2F74, 0x0F71, 0x2F75, 0x0B9B, 0x2F76, 0x0E16, 0x2F77, 0x08B3, + 0x2F78, 0x0608, 0x2F79, 0x1813, 0x2F7A, 0x0F3D, 0x2F7B, 0x04CB, 0x2F7C, + 0x0FDD, 0x2F7D, 0x08D5, 0x2F7E, 0x183D, 0x2F7F, 0x08D6, 0x2F80, 0x1853, + 0x2F81, 0x0CD1, 0x2F82, 0x0A09, 0x2F83, 0x08D7, 0x2F84, 0x08B8, 0x2F85, + 0x04D3, 0x2F86, 0x0A89, 0x2F87, 0x0AA6, 0x2F88, 0x0938, 0x2F89, 0x0821, + 0x2F8A, 0x09ED, 0x2F8B, 0x18B2, 0x2F8C, 0x194F, 0x2F8D, 0x0BAC, 0x2F8E, + 0x0742, 0x2F8F, 0x07E6, 0x2F90, 0x04A5, 0x2F91, 0x19EB, 0x2F92, 0x075F, + 0x2F93, 0x05AF, 0x2F94, 0x0774, 0x2F95, 0x0B69, 0x2F96, 0x0C7E, 0x2F97, + 0x1A56, 0x2F98, 0x1A59, 0x2F99, 0x058B, 0x2F9A, 0x0A7A, 0x2F9B, 0x0AF8, + 0x2F9C, 0x0B0D, 0x2F9D, 0x0A0E, 0x2F9E, 0x0902, 0x2F9F, 0x0A0F, 0x2FA0, + 0x0B62, 0x2FA1, 0x3B4F, 0x2FA2, 0x0F22, 0x2FA3, 0x0CAB, 0x2FA4, 0x0D64, + 0x2FA5, 0x0F6C, 0x2FA6, 0x06DA, 0x2FA7, 0x0BD5, 0x2FA8, 0x0EF3, 0x2FA9, + 0x0DDE, 0x2FAA, 0x1BC9, 0x2FAB, 0x1BCB, 0x2FAC, 0x04CD, 0x2FAD, 0x21F7, + 0x2FAE, 0x0D87, 0x2FAF, 0x0ED8, 0x2FB0, 0x05B5, 0x2FB1, 0x1C03, 0x2FB2, + 0x1C05, 0x2FB3, 0x053B, 0x2FB4, 0x0E17, 0x2FB5, 0x0DE9, 0x2FB6, 0x0D88, + 0x2FB7, 0x09EF, 0x2FB8, 0x091F, 0x2FB9, 0x07F3, 0x2FBA, 0x0D05, 0x2FBB, + 0x080E, 0x2FBC, 0x07F4, 0x2FBD, 0x1C6C, 0x2FBE, 0x1C7D, 0x2FBF, 0x1C83, + 0x2FC0, 0x1C84, 0x2FC1, 0x064E, 0x2FC2, 0x0695, 0x2FC3, 0x0BD7, 0x2FC4, + 0x1CF6, 0x2FC5, 0x08DB, 0x2FC6, 0x1D01, 0x2FC7, 0x0E91, 0x2FC8, 0x340B, + 0x2FC9, 0x066A, 0x2FCA, 0x0807, 0x2FCB, 0x1D16, 0x2FCC, 0x1D19, 0x2FCD, + 0x0C1E, 0x2FCE, 0x0791, 0x2FCF, 0x0ACF, 0x2FD0, 0x0D93, 0x2FD1, 0x1D21, + 0x2FD2, 0x1D22, 0x2FD3, 0x0F7E, 0x2FD4, 0x1D30, 0x2FD5, 0x1D31, 0x3000, + 0x0279, 0x3001, 0x027A, 0x3002, 0x027B, 0x3003, 0x028F, 0x3004, 0x2074, + 0x3005, 0x0291, 0x3006, 0x0292, 0x3007, 0x0293, 0x3008, 0x02AA, 0x3009, + 0x02AB, 0x300A, 0x02AC, 0x300B, 0x02AD, 0x300C, 0x02AE, 0x300D, 0x02AF, + 0x300E, 0x02B0, 0x300F, 0x02B1, 0x3010, 0x02B2, 0x3011, 0x02B3, 0x3012, + 0x02DF, 0x3013, 0x02E4, 0x3014, 0x02A4, 0x3015, 0x02A5, 0x301C, 0x0299, + 0x301D, 0x1DB8, 0x301F, 0x1DB9, 0x3020, 0x1F7A, 0x3030, 0x2FBA, 0x3033, + 0x2F4C, 0x3034, 0x2F4D, 0x3035, 0x2F4E, 0x3036, 0x1F79, 0x3041, 0x034A, + 0x3042, 0x034B, 0x3043, 0x034C, 0x3044, 0x034D, 0x3045, 0x034E, 0x3046, + 0x034F, 0x3047, 0x0350, 0x3048, 0x0351, 0x3049, 0x0352, 0x304A, 0x0353, + 0x304B, 0x0354, 0x304C, 0x0355, 0x304D, 0x0356, 0x304E, 0x0357, 0x304F, + 0x0358, 0x3050, 0x0359, 0x3051, 0x035A, 0x3052, 0x035B, 0x3053, 0x035C, + 0x3054, 0x035D, 0x3055, 0x035E, 0x3056, 0x035F, 0x3057, 0x0360, 0x3058, + 0x0361, 0x3059, 0x0362, 0x305A, 0x0363, 0x305B, 0x0364, 0x305C, 0x0365, + 0x305D, 0x0366, 0x305E, 0x0367, 0x305F, 0x0368, 0x3060, 0x0369, 0x3061, + 0x036A, 0x3062, 0x036B, 0x3063, 0x036C, 0x3064, 0x036D, 0x3065, 0x036E, + 0x3066, 0x036F, 0x3067, 0x0370, 0x3068, 0x0371, 0x3069, 0x0372, 0x306A, + 0x0373, 0x306B, 0x0374, 0x306C, 0x0375, 0x306D, 0x0376, 0x306E, 0x0377, + 0x306F, 0x0378, 0x3070, 0x0379, 0x3071, 0x037A, 0x3072, 0x037B, 0x3073, + 0x037C, 0x3074, 0x037D, 0x3075, 0x037E, 0x3076, 0x037F, 0x3077, 0x0380, + 0x3078, 0x0381, 0x3079, 0x0382, 0x307A, 0x0383, 0x307B, 0x0384, 0x307C, + 0x0385, 0x307D, 0x0386, 0x307E, 0x0387, 0x307F, 0x0388, 0x3080, 0x0389, + 0x3081, 0x038A, 0x3082, 0x038B, 0x3083, 0x038C, 0x3084, 0x038D, 0x3085, + 0x038E, 0x3086, 0x038F, 0x3087, 0x0390, 0x3088, 0x0391, 0x3089, 0x0392, + 0x308A, 0x0393, 0x308B, 0x0394, 0x308C, 0x0395, 0x308D, 0x0396, 0x308E, + 0x0397, 0x308F, 0x0398, 0x3090, 0x0399, 0x3091, 0x039A, 0x3092, 0x039B, + 0x3093, 0x039C, 0x3094, 0x1F16, 0x309B, 0x0283, 0x309C, 0x0284, 0x309D, + 0x028D, 0x309E, 0x028E, 0x30A1, 0x039D, 0x30A2, 0x039E, 0x30A3, 0x039F, + 0x30A4, 0x03A0, 0x30A5, 0x03A1, 0x30A6, 0x03A2, 0x30A7, 0x03A3, 0x30A8, + 0x03A4, 0x30A9, 0x03A5, 0x30AA, 0x03A6, 0x30AB, 0x03A7, 0x30AC, 0x03A8, + 0x30AD, 0x03A9, 0x30AE, 0x03AA, 0x30AF, 0x03AB, 0x30B0, 0x03AC, 0x30B1, + 0x03AD, 0x30B2, 0x03AE, 0x30B3, 0x03AF, 0x30B4, 0x03B0, 0x30B5, 0x03B1, + 0x30B6, 0x03B2, 0x30B7, 0x03B3, 0x30B8, 0x03B4, 0x30B9, 0x03B5, 0x30BA, + 0x03B6, 0x30BB, 0x03B7, 0x30BC, 0x03B8, 0x30BD, 0x03B9, 0x30BE, 0x03BA, + 0x30BF, 0x03BB, 0x30C0, 0x03BC, 0x30C1, 0x03BD, 0x30C2, 0x03BE, 0x30C3, + 0x03BF, 0x30C4, 0x03C0, 0x30C5, 0x03C1, 0x30C6, 0x03C2, 0x30C7, 0x03C3, + 0x30C8, 0x03C4, 0x30C9, 0x03C5, 0x30CA, 0x03C6, 0x30CB, 0x03C7, 0x30CC, + 0x03C8, 0x30CD, 0x03C9, 0x30CE, 0x03CA, 0x30CF, 0x03CB, 0x30D0, 0x03CC, + 0x30D1, 0x03CD, 0x30D2, 0x03CE, 0x30D3, 0x03CF, 0x30D4, 0x03D0, 0x30D5, + 0x03D1, 0x30D6, 0x03D2, 0x30D7, 0x03D3, 0x30D8, 0x03D4, 0x30D9, 0x03D5, + 0x30DA, 0x03D6, 0x30DB, 0x03D7, 0x30DC, 0x03D8, 0x30DD, 0x03D9, 0x30DE, + 0x03DA, 0x30DF, 0x03DB, 0x30E0, 0x03DC, 0x30E1, 0x03DD, 0x30E2, 0x03DE, + 0x30E3, 0x03DF, 0x30E4, 0x03E0, 0x30E5, 0x03E1, 0x30E6, 0x03E2, 0x30E7, + 0x03E3, 0x30E8, 0x03E4, 0x30E9, 0x03E5, 0x30EA, 0x03E6, 0x30EB, 0x03E7, + 0x30EC, 0x03E8, 0x30ED, 0x03E9, 0x30EE, 0x03EA, 0x30EF, 0x03EB, 0x30F0, + 0x03EC, 0x30F1, 0x03ED, 0x30F2, 0x03EE, 0x30F3, 0x03EF, 0x30F4, 0x03F0, + 0x30F5, 0x03F1, 0x30F6, 0x03F2, 0x30F7, 0x2079, 0x30F8, 0x207A, 0x30F9, + 0x207B, 0x30FA, 0x207C, 0x30FB, 0x027E, 0x30FC, 0x0294, 0x30FD, 0x028B, + 0x30FE, 0x028C, 0x3220, 0x278E, 0x3221, 0x278F, 0x3222, 0x2790, 0x3223, + 0x2791, 0x3224, 0x2792, 0x3225, 0x2793, 0x3226, 0x2794, 0x3227, 0x2795, + 0x3228, 0x2796, 0x3229, 0x2797, 0x322A, 0x2006, 0x322B, 0x2007, 0x322C, + 0x2008, 0x322D, 0x2009, 0x322E, 0x200A, 0x322F, 0x200B, 0x3230, 0x2005, + 0x3231, 0x1DC2, 0x3232, 0x1DC3, 0x3233, 0x1FCF, 0x3234, 0x1FCD, 0x3235, + 0x1FD4, 0x3236, 0x1FD3, 0x3237, 0x200C, 0x3238, 0x1FCE, 0x3239, 0x1DC4, + 0x323A, 0x1FD7, 0x323B, 0x1FD5, 0x323C, 0x1FD0, 0x323D, 0x1FCB, 0x323E, + 0x1FD2, 0x323F, 0x1FCC, 0x3240, 0x1FD6, 0x3241, 0x200D, 0x3242, 0x1FD1, + 0x3243, 0x1FCA, 0x3280, 0x28DD, 0x3281, 0x28DE, 0x3282, 0x28DF, 0x3283, + 0x28E0, 0x3284, 0x28E1, 0x3285, 0x28E2, 0x3286, 0x28E3, 0x3287, 0x28E4, + 0x3288, 0x28E5, 0x3289, 0x28E6, 0x328A, 0x28E8, 0x328B, 0x28E9, 0x328C, + 0x28EA, 0x328D, 0x28EB, 0x328E, 0x28EC, 0x328F, 0x28ED, 0x3290, 0x28E7, + 0x3291, 0x1FE1, 0x3292, 0x1FE0, 0x3293, 0x1FE2, 0x3294, 0x1FDC, 0x3295, + 0x28FF, 0x3296, 0x1FE5, 0x3297, 0x28FC, 0x3298, 0x1FDE, 0x3299, 0x201F, + 0x329A, 0x28F9, 0x329B, 0x28F8, 0x329C, 0x28FE, 0x329D, 0x207F, 0x329E, + 0x1FFF, 0x329F, 0x28EF, 0x32A0, 0x28F6, 0x32A1, 0x28F7, 0x32A2, 0x28FB, + 0x32A3, 0x28FA, 0x32A4, 0x1DBD, 0x32A5, 0x1DBE, 0x32A6, 0x1DBF, 0x32A7, + 0x1DC0, 0x32A8, 0x1DC1, 0x32A9, 0x1FDA, 0x32AA, 0x1FDD, 0x32AB, 0x1FDF, + 0x32AC, 0x1FE3, 0x32AD, 0x1FD9, 0x32AE, 0x1FE4, 0x32AF, 0x1FDB, 0x32B0, + 0x1FD8, 0x32D0, 0x28AD, 0x32D1, 0x28AE, 0x32D2, 0x28AF, 0x32D3, 0x28B0, + 0x32D4, 0x28B1, 0x32D5, 0x28B2, 0x32D6, 0x28B3, 0x32D7, 0x28B4, 0x32D8, + 0x28B5, 0x32D9, 0x28B6, 0x32DA, 0x28B7, 0x32DB, 0x28B8, 0x32DC, 0x28B9, + 0x32DD, 0x28BA, 0x32DE, 0x28BB, 0x32DF, 0x28BC, 0x32E0, 0x28BD, 0x32E1, + 0x28BE, 0x32E2, 0x28BF, 0x32E3, 0x28C0, 0x32E4, 0x28C1, 0x32E5, 0x28C2, + 0x32E6, 0x28C3, 0x32E7, 0x28C4, 0x32E8, 0x28C5, 0x32E9, 0x28C6, 0x32EA, + 0x28C7, 0x32EB, 0x28C8, 0x32EC, 0x28C9, 0x32ED, 0x28CA, 0x32EE, 0x28CB, + 0x32EF, 0x28CC, 0x32F0, 0x28CD, 0x32F1, 0x28CE, 0x32F2, 0x28CF, 0x32F3, + 0x28D0, 0x32F4, 0x28D1, 0x32F5, 0x28D2, 0x32F6, 0x28D3, 0x32F7, 0x28D4, + 0x32F8, 0x28D5, 0x32F9, 0x28D6, 0x32FA, 0x28D7, 0x32FB, 0x28D8, 0x32FC, + 0x28D9, 0x32FD, 0x28DA, 0x32FE, 0x28DB, 0x3300, 0x1F70, 0x3301, 0x2E62, + 0x3302, 0x2E63, 0x3303, 0x1F6A, 0x3304, 0x2E64, 0x3305, 0x1FF7, 0x3306, + 0x2E65, 0x3307, 0x2E69, 0x3308, 0x2E67, 0x3309, 0x2E6C, 0x330A, 0x2E6A, + 0x330B, 0x2E6E, 0x330C, 0x2E70, 0x330D, 0x1DAB, 0x330E, 0x2E71, 0x330F, + 0x2E72, 0x3310, 0x2E73, 0x3311, 0x2E74, 0x3312, 0x2E75, 0x3313, 0x2E76, + 0x3314, 0x1DA2, 0x3315, 0x1F69, 0x3316, 0x1F67, 0x3317, 0x2E78, 0x3318, + 0x1F68, 0x3319, 0x2E7A, 0x331A, 0x2E7C, 0x331B, 0x2E7D, 0x331C, 0x2E7E, + 0x331D, 0x2E7F, 0x331E, 0x1F73, 0x331F, 0x2E80, 0x3320, 0x2E81, 0x3321, + 0x2E82, 0x3322, 0x1F66, 0x3323, 0x1F6B, 0x3324, 0x2E83, 0x3325, 0x2E85, + 0x3326, 0x1DAC, 0x3327, 0x1DA6, 0x3328, 0x2E88, 0x3329, 0x2E89, 0x332A, + 0x1F74, 0x332B, 0x1DAE, 0x332D, 0x2E8B, 0x332E, 0x2E8E, 0x332F, 0x2E8F, + 0x3330, 0x2E90, 0x3331, 0x1F71, 0x3332, 0x2E91, 0x3333, 0x2087, 0x3334, + 0x2E94, 0x3335, 0x2E95, 0x3336, 0x1DA8, 0x3337, 0x2E9A, 0x3338, 0x2E9C, + 0x3339, 0x1F6E, 0x333A, 0x2E9D, 0x333B, 0x1F6F, 0x333C, 0x2E96, 0x333D, + 0x2E9E, 0x333E, 0x2EA0, 0x333F, 0x2EA1, 0x3340, 0x2EA2, 0x3341, 0x2E9F, + 0x3342, 0x1F6D, 0x3343, 0x2EA3, 0x3344, 0x2EA4, 0x3345, 0x2EA5, 0x3346, + 0x2EA6, 0x3347, 0x1F72, 0x3348, 0x2EA7, 0x3349, 0x1DA1, 0x334A, 0x1DAF, + 0x334B, 0x2EA8, 0x334C, 0x2EA9, 0x334D, 0x1DA4, 0x334E, 0x2088, 0x334F, + 0x2EAA, 0x3350, 0x2EAB, 0x3351, 0x1DA9, 0x3352, 0x2EAE, 0x3353, 0x2EB2, + 0x3354, 0x2EAF, 0x3355, 0x2EB3, 0x3356, 0x2EB4, 0x3357, 0x1F6C, 0x3371, + 0x2E55, 0x337B, 0x2083, 0x337C, 0x1DC7, 0x337D, 0x1DC6, 0x337E, 0x1DC5, + 0x337F, 0x1F76, 0x3385, 0x1F5F, 0x3386, 0x1F60, 0x3387, 0x1F61, 0x3388, + 0x2000, 0x3389, 0x2001, 0x338D, 0x2E58, 0x338E, 0x1DB4, 0x338F, 0x1DB5, + 0x3390, 0x1F63, 0x3396, 0x1F65, 0x3397, 0x1F58, 0x3398, 0x1F5A, 0x339B, + 0x2E59, 0x339C, 0x1DB1, 0x339D, 0x1DB2, 0x339E, 0x1DB3, 0x339F, 0x1FFA, + 0x33A0, 0x1F54, 0x33A1, 0x1DB7, 0x33A2, 0x1F55, 0x33A3, 0x1FFB, 0x33A4, + 0x1F56, 0x33A5, 0x1F57, 0x33A6, 0x1FFC, 0x33B0, 0x1F5E, 0x33B1, 0x1F5D, + 0x33B2, 0x1F5C, 0x33B3, 0x1F5B, 0x33C2, 0x2E50, 0x33C4, 0x1DB6, 0x33C8, + 0x2002, 0x33CB, 0x1F62, 0x33CC, 0x1FF6, 0x33CD, 0x1DBB, 0x33D4, 0x1F64, + 0x33D7, 0x2E5D, 0x33D8, 0x2E5E, 0x33DA, 0x2E4B, 0x3402, 0x3582, 0x3405, + 0x3C1B, 0x3427, 0x3656, 0x3488, 0x3C52, 0x34DB, 0x3C41, 0x351F, 0x3629, + 0x353E, 0x371E, 0x378D, 0x361A, 0x37E2, 0x372B, 0x3AF3, 0x3C40, 0x3B22, + 0x3C49, 0x3B88, 0x368D, 0x3E8A, 0x3C43, 0x3EDA, 0x3C48, 0x3FB1, 0x3754, + 0x4093, 0x3C4C, 0x4103, 0x3C4F, 0x4264, 0x3760, 0x4293, 0x3C50, 0x440C, + 0x3C42, 0x4453, 0x3773, 0x457A, 0x3C4B, 0x4665, 0x3C4E, 0x46AE, 0x3C51, + 0x4BE8, 0x3C46, 0x4E00, 0x04B0, 0x4E01, 0x0BB8, 0x4E03, 0x08E3, 0x4E04, + 0x37D8, 0x4E05, 0x37D9, 0x4E07, 0x0EAA, 0x4E08, 0x09CE, 0x4E09, 0x087E, + 0x4E0A, 0x09CD, 0x4E0B, 0x053C, 0x4E0D, 0x0DC6, 0x4E0E, 0x0F29, 0x4E10, + 0x0FFB, 0x4E11, 0x04D1, 0x4E14, 0x05CC, 0x4E15, 0x0FFC, 0x4E16, 0x0A48, + 0x4E17, 0x10D7, 0x4E18, 0x0670, 0x4E19, 0x0E0A, 0x4E1E, 0x09CF, 0x4E1F, + 0x37DA, 0x4E21, 0x0F86, 0x4E26, 0x0E12, 0x4E28, 0x20B3, 0x4E2A, 0x0FFD, + 0x4E2B, 0x37DB, 0x4E2C, 0x374D, 0x4E2D, 0x0BA4, 0x4E2F, 0x37DC, 0x4E30, + 0x37DD, 0x4E31, 0x0FFE, 0x4E32, 0x06F2, 0x4E36, 0x0FFF, 0x4E37, 0x369D, + 0x4E38, 0x0619, 0x4E39, 0x0B6E, 0x4E3B, 0x0913, 0x4E3C, 0x1000, 0x4E3F, + 0x1001, 0x4E40, 0x37DE, 0x4E41, 0x37DF, 0x4E42, 0x1002, 0x4E43, 0x0CEB, + 0x4E44, 0x37E0, 0x4E45, 0x0671, 0x4E48, 0x372E, 0x4E4B, 0x0CED, 0x4E4D, + 0x0CBB, 0x4E4E, 0x0777, 0x4E4F, 0x0E61, 0x4E55, 0x1950, 0x4E56, 0x1003, + 0x4E57, 0x09D0, 0x4E58, 0x1004, 0x4E59, 0x0535, 0x4E5A, 0x37E1, 0x4E5D, + 0x06DD, 0x4E5E, 0x07A4, 0x4E5F, 0x0EF5, 0x4E62, 0x1233, 0x4E71, 0x0F5A, + 0x4E73, 0x0CD5, 0x4E7E, 0x05E1, 0x4E7F, 0x37E2, 0x4E80, 0x064F, 0x4E82, + 0x1005, 0x4E85, 0x1006, 0x4E86, 0x0F83, 0x4E88, 0x0F27, 0x4E89, 0x0AEA, + 0x4E8A, 0x1008, 0x4E8B, 0x08C4, 0x4E8C, 0x0CCB, 0x4E8D, 0x37E3, 0x4E8E, + 0x100B, 0x4E91, 0x04E0, 0x4E92, 0x0793, 0x4E94, 0x0792, 0x4E95, 0x04AA, + 0x4E96, 0x37E4, 0x4E98, 0x0FF1, 0x4E99, 0x0FF0, 0x4E9B, 0x0823, 0x4E9C, + 0x0465, 0x4E9E, 0x100C, 0x4E9F, 0x100D, 0x4EA0, 0x100E, 0x4EA1, 0x0E62, + 0x4EA2, 0x100F, 0x4EA4, 0x07A6, 0x4EA5, 0x04AB, 0x4EA6, 0x0EA0, 0x4EA8, + 0x0696, 0x4EAB, 0x0697, 0x4EAC, 0x0698, 0x4EAD, 0x0BFE, 0x4EAE, 0x0F84, + 0x4EB0, 0x1010, 0x4EB3, 0x1011, 0x4EB6, 0x1012, 0x4EB9, 0x37E5, 0x4EBA, + 0x0A13, 0x4EBB, 0x3620, 0x4EC0, 0x0944, 0x4EC1, 0x0A14, 0x4EC2, 0x1017, + 0x4EC4, 0x1015, 0x4EC6, 0x1016, 0x4EC7, 0x0672, 0x4ECA, 0x0813, 0x4ECB, + 0x0570, 0x4ECD, 0x1014, 0x4ECE, 0x1013, 0x4ECF, 0x0DF9, 0x4ED0, 0x37E6, + 0x4ED4, 0x0894, 0x4ED5, 0x0893, 0x4ED6, 0x0B1E, 0x4ED7, 0x1018, 0x4ED8, + 0x0DC7, 0x4ED9, 0x0A8B, 0x4EDD, 0x0290, 0x4EDE, 0x1019, 0x4EDF, 0x101B, + 0x4EE0, 0x37E7, 0x4EE1, 0x20B4, 0x4EE3, 0x0B45, 0x4EE4, 0x0FA9, 0x4EE5, + 0x048E, 0x4EED, 0x101A, 0x4EEE, 0x053E, 0x4EF0, 0x06BC, 0x4EF2, 0x0BA5, + 0x4EF6, 0x0745, 0x4EF7, 0x101C, 0x4EFB, 0x0CDA, 0x4EFC, 0x20B5, 0x4EFD, + 0x37E8, 0x4EFF, 0x37E9, 0x4F00, 0x20B6, 0x4F01, 0x0627, 0x4F03, 0x20B7, + 0x4F09, 0x101D, 0x4F0A, 0x048F, 0x4F0B, 0x37EA, 0x4F0D, 0x0794, 0x4F0E, + 0x0628, 0x4F0F, 0x0DEC, 0x4F10, 0x0D46, 0x4F11, 0x0673, 0x4F15, 0x37EB, + 0x4F1A, 0x0571, 0x4F1C, 0x1040, 0x4F1D, 0x0C3B, 0x4F2F, 0x0D22, 0x4F30, + 0x101F, 0x4F34, 0x0D50, 0x4F36, 0x0FAA, 0x4F38, 0x09F3, 0x4F39, 0x20B8, + 0x4F3A, 0x0895, 0x4F3B, 0x37ED, 0x4F3C, 0x08C5, 0x4F3D, 0x0540, 0x4F43, + 0x0BED, 0x4F46, 0x0B60, 0x4F47, 0x1023, 0x4F49, 0x37EE, 0x4F4D, 0x0490, + 0x4F4E, 0x0BFF, 0x4F4F, 0x0945, 0x4F50, 0x0824, 0x4F51, 0x0F0E, 0x4F53, + 0x0B2E, 0x4F54, 0x37EF, 0x4F55, 0x053F, 0x4F56, 0x20B9, 0x4F57, 0x1022, + 0x4F59, 0x0F28, 0x4F5A, 0x101E, 0x4F5B, 0x1020, 0x4F5C, 0x085E, 0x4F5D, + 0x1021, 0x4F5E, 0x11D3, 0x4F60, 0x37EC, 0x4F69, 0x1029, 0x4F6F, 0x102C, + 0x4F70, 0x102A, 0x4F73, 0x0542, 0x4F75, 0x0E0B, 0x4F76, 0x1024, 0x4F7A, + 0x37F0, 0x4F7B, 0x1028, 0x4F7C, 0x07A7, 0x4F7D, 0x37F1, 0x4F7E, 0x37F2, + 0x4F7F, 0x0896, 0x4F83, 0x05E2, 0x4F86, 0x102D, 0x4F88, 0x1025, 0x4F8A, + 0x20BB, 0x4F8B, 0x0FAB, 0x4F8D, 0x08C6, 0x4F8F, 0x1026, 0x4F91, 0x102B, + 0x4F92, 0x20BA, 0x4F94, 0x20BD, 0x4F96, 0x102E, 0x4F97, 0x37F3, 0x4F98, + 0x1027, 0x4F9A, 0x20BC, 0x4F9B, 0x0699, 0x4F9D, 0x0491, 0x4FA0, 0x069A, + 0x4FA1, 0x0541, 0x4FAB, 0x11D4, 0x4FAD, 0x0EA7, 0x4FAE, 0x0DE0, 0x4FAF, + 0x07A8, 0x4FB5, 0x09F5, 0x4FB6, 0x0F7F, 0x4FBE, 0x37F4, 0x4FBF, 0x0E28, + 0x4FC2, 0x070E, 0x4FC3, 0x0B05, 0x4FC4, 0x0564, 0x4FC9, 0x20AC, 0x4FCA, + 0x095D, 0x4FCD, 0x20BE, 0x4FCE, 0x1032, 0x4FCF, 0x37F5, 0x4FD0, 0x1037, + 0x4FD1, 0x1035, 0x4FD3, 0x3C2F, 0x4FD4, 0x1030, 0x4FD7, 0x0B0F, 0x4FD8, + 0x1033, 0x4FDA, 0x1036, 0x4FDB, 0x1034, 0x4FDD, 0x0E2D, 0x4FDF, 0x1031, + 0x4FE0, 0x1DEC, 0x4FE1, 0x09F4, 0x4FE3, 0x0EA1, 0x4FE4, 0x1038, 0x4FE5, + 0x1039, 0x4FEE, 0x092E, 0x4FEF, 0x1046, 0x4FF3, 0x0D06, 0x4FF5, 0x0DA8, + 0x4FF6, 0x1041, 0x4FF8, 0x0E40, 0x4FFA, 0x0536, 0x4FFD, 0x37F6, 0x4FFE, + 0x1045, 0x4FFF, 0x20C1, 0x5000, 0x37F7, 0x5001, 0x37F8, 0x5002, 0x3447, + 0x5005, 0x103F, 0x5006, 0x1048, 0x5009, 0x0AD4, 0x500B, 0x0778, 0x500D, + 0x0D12, 0x500F, 0x1600, 0x5010, 0x37F9, 0x5011, 0x1047, 0x5012, 0x0C57, + 0x5014, 0x103C, 0x5016, 0x07AA, 0x5019, 0x07A9, 0x501A, 0x103A, 0x501B, + 0x37FA, 0x501E, 0x20C2, 0x501F, 0x0906, 0x5021, 0x1042, 0x5022, 0x20C0, + 0x5023, 0x0E3F, 0x5024, 0x0B8B, 0x5025, 0x103E, 0x5026, 0x0747, 0x5027, + 0x37FB, 0x5028, 0x103B, 0x5029, 0x1043, 0x502A, 0x103D, 0x502B, 0x0F99, + 0x502C, 0x1044, 0x502D, 0x0FE7, 0x502E, 0x37FC, 0x5036, 0x06DE, 0x5039, + 0x0746, 0x503B, 0x3800, 0x5040, 0x20BF, 0x5042, 0x20C5, 0x5043, 0x1049, + 0x5046, 0x20C3, 0x5047, 0x104A, 0x5048, 0x104E, 0x5049, 0x0492, 0x504F, + 0x0E20, 0x5050, 0x104D, 0x5055, 0x104C, 0x5056, 0x1050, 0x5057, 0x37FD, + 0x505A, 0x104F, 0x505C, 0x0C00, 0x5065, 0x0748, 0x5066, 0x37FE, 0x506A, + 0x37FF, 0x506C, 0x1051, 0x5070, 0x20C4, 0x5072, 0x08F1, 0x5074, 0x0B06, + 0x5075, 0x0C01, 0x5076, 0x06EE, 0x5078, 0x1052, 0x507D, 0x0650, 0x5080, + 0x1053, 0x5085, 0x1055, 0x508D, 0x0E63, 0x508F, 0x3801, 0x5091, 0x073C, + 0x5094, 0x20C6, 0x5096, 0x3802, 0x5098, 0x087F, 0x5099, 0x0D8B, 0x509A, + 0x1054, 0x509C, 0x3803, 0x50AC, 0x0835, 0x50AD, 0x0F2D, 0x50B2, 0x1057, + 0x50B3, 0x105A, 0x50B4, 0x1056, 0x50B5, 0x0834, 0x50B7, 0x0987, 0x50BE, + 0x070F, 0x50C2, 0x105B, 0x50C5, 0x06C7, 0x50C9, 0x1058, 0x50CA, 0x1059, + 0x50CC, 0x3804, 0x50CD, 0x0C87, 0x50CF, 0x0AFE, 0x50D1, 0x069B, 0x50D5, + 0x0E7B, 0x50D6, 0x105C, 0x50D8, 0x20C8, 0x50D9, 0x3C30, 0x50DA, 0x0F85, + 0x50DE, 0x105D, 0x50E3, 0x1060, 0x50E5, 0x105E, 0x50E6, 0x3805, 0x50E7, + 0x0AD0, 0x50E9, 0x3806, 0x50ED, 0x105F, 0x50EE, 0x1061, 0x50EF, 0x3807, + 0x50F0, 0x3C31, 0x50F4, 0x20C7, 0x50F5, 0x1063, 0x50F9, 0x1062, 0x50FB, + 0x0E18, 0x5100, 0x0651, 0x5101, 0x1065, 0x5102, 0x1066, 0x5104, 0x052F, + 0x5108, 0x3808, 0x5109, 0x1064, 0x510B, 0x3809, 0x5110, 0x380A, 0x5112, + 0x0920, 0x5114, 0x1069, 0x5115, 0x1068, 0x5116, 0x1067, 0x5118, 0x102F, + 0x511A, 0x106A, 0x511B, 0x380B, 0x511E, 0x380C, 0x511F, 0x0988, 0x5121, + 0x106B, 0x512A, 0x0F0F, 0x5132, 0x0EE5, 0x5137, 0x106D, 0x513A, 0x106C, + 0x513B, 0x106F, 0x513C, 0x106E, 0x513F, 0x1070, 0x5140, 0x1071, 0x5141, + 0x04B8, 0x5143, 0x0769, 0x5144, 0x0711, 0x5145, 0x0946, 0x5146, 0x0BB9, + 0x5147, 0x069C, 0x5148, 0x0A8C, 0x5149, 0x07AB, 0x514A, 0x20C9, 0x514B, + 0x0800, 0x514C, 0x1073, 0x514D, 0x0ED4, 0x514E, 0x0C40, 0x5150, 0x08C7, + 0x5152, 0x1072, 0x5154, 0x1074, 0x515A, 0x0C58, 0x515C, 0x05D3, 0x515F, + 0x380D, 0x5162, 0x1075, 0x5164, 0x20CA, 0x5165, 0x0CD6, 0x5167, 0x368E, + 0x5168, 0x0AB6, 0x5169, 0x1077, 0x516A, 0x1078, 0x516B, 0x0D40, 0x516C, + 0x07AC, 0x516D, 0x0FE1, 0x516E, 0x1079, 0x5171, 0x069E, 0x5175, 0x0E0C, + 0x5176, 0x0B16, 0x5177, 0x06E9, 0x5178, 0x0C2F, 0x5179, 0x3779, 0x517C, + 0x0749, 0x5180, 0x107A, 0x5182, 0x107B, 0x5185, 0x0CBA, 0x5186, 0x0501, + 0x5189, 0x107E, 0x518A, 0x086D, 0x518C, 0x107D, 0x518D, 0x0836, 0x518F, + 0x107F, 0x5190, 0x185B, 0x5191, 0x1080, 0x5192, 0x0E6F, 0x5193, 0x1081, + 0x5195, 0x1082, 0x5196, 0x1083, 0x5197, 0x09D1, 0x5199, 0x08F8, 0x519D, + 0x20CB, 0x51A0, 0x05E3, 0x51A1, 0x380E, 0x51A2, 0x1086, 0x51A4, 0x1084, + 0x51A5, 0x0EC9, 0x51A6, 0x1085, 0x51A8, 0x0DCC, 0x51A9, 0x1087, 0x51AA, + 0x1088, 0x51AB, 0x1089, 0x51AC, 0x0C59, 0x51B0, 0x108D, 0x51B1, 0x108B, + 0x51B2, 0x108C, 0x51B3, 0x108A, 0x51B4, 0x0853, 0x51B5, 0x108E, 0x51B6, + 0x0EF6, 0x51B7, 0x0FAC, 0x51BC, 0x380F, 0x51BD, 0x108F, 0x51BE, 0x20CC, + 0x51C3, 0x3C32, 0x51C4, 0x0A4C, 0x51C5, 0x1090, 0x51C6, 0x0964, 0x51C9, + 0x1091, 0x51CB, 0x0BBA, 0x51CC, 0x0F87, 0x51CD, 0x0C5A, 0x51D6, 0x10DA, + 0x51DB, 0x1092, 0x51DC, 0x205C, 0x51DD, 0x06BD, 0x51DE, 0x3810, 0x51E0, + 0x1093, 0x51E1, 0x0E8C, 0x51E6, 0x0972, 0x51E7, 0x0B5C, 0x51E9, 0x1095, + 0x51EA, 0x0CBC, 0x51EC, 0x20CD, 0x51ED, 0x1096, 0x51EE, 0x3811, 0x51F0, + 0x1097, 0x51F1, 0x058C, 0x51F4, 0x3812, 0x51F5, 0x1098, 0x51F6, 0x069F, + 0x51F8, 0x0CA4, 0x51F9, 0x051C, 0x51FA, 0x095A, 0x51FD, 0x0D35, 0x51FE, + 0x1099, 0x5200, 0x0C5B, 0x5201, 0x3813, 0x5202, 0x3814, 0x5203, 0x0A15, + 0x5204, 0x109A, 0x5206, 0x0DFC, 0x5207, 0x0A7E, 0x5208, 0x05DE, 0x520A, + 0x05E5, 0x520B, 0x109B, 0x520E, 0x109D, 0x5211, 0x0710, 0x5213, 0x3815, + 0x5214, 0x109C, 0x5215, 0x20CE, 0x5217, 0x0FBB, 0x521D, 0x0973, 0x5224, + 0x0D51, 0x5225, 0x0E1C, 0x5227, 0x109E, 0x5229, 0x0F62, 0x522A, 0x109F, + 0x522E, 0x10A0, 0x5230, 0x0C78, 0x5233, 0x10A1, 0x5236, 0x0A4D, 0x5237, + 0x086E, 0x5238, 0x074A, 0x5239, 0x10A2, 0x523A, 0x0897, 0x523B, 0x0801, + 0x5243, 0x0C02, 0x5244, 0x10A4, 0x5247, 0x0B07, 0x5249, 0x3816, 0x524A, + 0x085F, 0x524B, 0x10A5, 0x524C, 0x10A6, 0x524D, 0x0AB2, 0x524F, 0x10A3, + 0x5254, 0x10A8, 0x5256, 0x0E64, 0x525B, 0x07F6, 0x525D, 0x1E5E, 0x525E, + 0x10A7, 0x5261, 0x3817, 0x5263, 0x074B, 0x5264, 0x084E, 0x5265, 0x0D23, + 0x5266, 0x3818, 0x5269, 0x10AB, 0x526A, 0x10A9, 0x526F, 0x0DED, 0x5270, + 0x09D2, 0x5271, 0x10B2, 0x5272, 0x05C2, 0x5273, 0x10AC, 0x5274, 0x10AA, + 0x5275, 0x0AD1, 0x527D, 0x10AE, 0x527F, 0x10AD, 0x5283, 0x05A2, 0x5287, + 0x0736, 0x5288, 0x10B3, 0x5289, 0x0F75, 0x528D, 0x10AF, 0x5291, 0x10B4, + 0x5292, 0x10B1, 0x5293, 0x3819, 0x5294, 0x10B0, 0x529B, 0x0F97, 0x529C, + 0x20CF, 0x529F, 0x07AD, 0x52A0, 0x0543, 0x52A3, 0x0FBC, 0x52A6, 0x20D0, + 0x52A9, 0x097F, 0x52AA, 0x0C52, 0x52AB, 0x07F7, 0x52AC, 0x10B7, 0x52AD, + 0x10B8, 0x52AF, 0x217D, 0x52B1, 0x0FAD, 0x52B4, 0x0FD1, 0x52B5, 0x10BA, + 0x52B9, 0x07AE, 0x52BC, 0x10B9, 0x52BE, 0x058D, 0x52C0, 0x20D1, 0x52C1, + 0x10BB, 0x52C3, 0x0E84, 0x52C5, 0x0BD8, 0x52C7, 0x0F10, 0x52C8, 0x381A, + 0x52C9, 0x0E29, 0x52CD, 0x10BC, 0x52D0, 0x36E8, 0x52D2, 0x1BEE, 0x52D5, + 0x0C88, 0x52D7, 0x10BD, 0x52D8, 0x05E6, 0x52D9, 0x0EBF, 0x52DB, 0x20D2, + 0x52DD, 0x0989, 0x52DE, 0x10BE, 0x52DF, 0x0E37, 0x52E0, 0x10C2, 0x52E2, + 0x0A4E, 0x52E3, 0x10BF, 0x52E4, 0x06C8, 0x52E6, 0x10C0, 0x52E7, 0x05E7, + 0x52F0, 0x381B, 0x52F2, 0x0704, 0x52F3, 0x10C3, 0x52F5, 0x10C4, 0x52F8, + 0x10C5, 0x52F9, 0x10C6, 0x52FA, 0x0907, 0x52FE, 0x07AF, 0x52FF, 0x0EEA, + 0x5300, 0x20D3, 0x5301, 0x0EF4, 0x5302, 0x0CCF, 0x5305, 0x0E41, 0x5306, + 0x10C7, 0x5307, 0x20D4, 0x5308, 0x10C8, 0x530A, 0x381C, 0x530B, 0x381D, + 0x530D, 0x10CA, 0x530F, 0x10CC, 0x5310, 0x10CB, 0x5315, 0x10CD, 0x5316, + 0x053D, 0x5317, 0x0E7A, 0x5319, 0x086C, 0x531A, 0x10CE, 0x531D, 0x0ADB, + 0x5320, 0x098A, 0x5321, 0x06A1, 0x5323, 0x10CF, 0x5324, 0x20D5, 0x532A, + 0x0D6F, 0x532F, 0x10D0, 0x5331, 0x10D1, 0x5333, 0x10D2, 0x5338, 0x10D3, + 0x5339, 0x0D96, 0x533A, 0x06E0, 0x533B, 0x04A9, 0x533E, 0x381E, 0x533F, + 0x0C97, 0x5340, 0x10D4, 0x5341, 0x0947, 0x5343, 0x0A8D, 0x5345, 0x10D6, + 0x5346, 0x10D5, 0x5347, 0x098B, 0x5348, 0x0795, 0x5349, 0x10D8, 0x534A, + 0x0D52, 0x534B, 0x3820, 0x534C, 0x381F, 0x534D, 0x10D9, 0x5351, 0x0D70, + 0x5352, 0x0B14, 0x5353, 0x0B4E, 0x5354, 0x06A0, 0x5357, 0x0CC6, 0x5358, + 0x0B6F, 0x535A, 0x0D24, 0x535C, 0x0E7C, 0x535E, 0x10DB, 0x5360, 0x0A8E, + 0x5361, 0x3821, 0x5366, 0x070B, 0x5369, 0x10DC, 0x536C, 0x3822, 0x536E, + 0x10DD, 0x536F, 0x04CE, 0x5370, 0x04B9, 0x5371, 0x0629, 0x5372, 0x20D6, + 0x5373, 0x0B08, 0x5374, 0x066B, 0x5375, 0x0F5B, 0x5377, 0x10E0, 0x5378, + 0x0537, 0x537B, 0x10DF, 0x537D, 0x3435, 0x537F, 0x06A2, 0x5382, 0x10E1, + 0x5384, 0x0EFD, 0x5389, 0x37D0, 0x5393, 0x20D7, 0x5396, 0x10E2, 0x5398, + 0x0F9A, 0x539A, 0x07B0, 0x539F, 0x076A, 0x53A0, 0x10E3, 0x53A5, 0x10E5, + 0x53A6, 0x10E4, 0x53A8, 0x0A25, 0x53A9, 0x04DB, 0x53AB, 0x3823, 0x53AD, + 0x0500, 0x53AE, 0x10E6, 0x53B0, 0x10E7, 0x53B2, 0x20D8, 0x53B3, 0x076B, + 0x53B6, 0x10E8, 0x53BB, 0x0688, 0x53C2, 0x0880, 0x53C3, 0x10E9, 0x53C8, + 0x0EA2, 0x53C9, 0x0825, 0x53CA, 0x0674, 0x53CB, 0x0F11, 0x53CC, 0x0AD2, + 0x53CD, 0x0D53, 0x53CE, 0x0929, 0x53D4, 0x0951, 0x53D6, 0x0914, 0x53D7, + 0x0921, 0x53D9, 0x0980, 0x53DA, 0x3824, 0x53DB, 0x0D54, 0x53DD, 0x20D9, + 0x53DF, 0x10EC, 0x53E1, 0x04E5, 0x53E2, 0x0AD3, 0x53E3, 0x07B1, 0x53E4, + 0x0779, 0x53E5, 0x06DF, 0x53E6, 0x3825, 0x53E8, 0x10F0, 0x53E9, 0x0B5F, + 0x53EA, 0x0B5E, 0x53EB, 0x06A3, 0x53EC, 0x098C, 0x53ED, 0x10F1, 0x53EE, + 0x10EF, 0x53EF, 0x0544, 0x53F0, 0x0B46, 0x53F1, 0x08E4, 0x53F2, 0x0899, + 0x53F3, 0x04C8, 0x53F5, 0x3826, 0x53F6, 0x05CE, 0x53F7, 0x07F8, 0x53F8, + 0x0898, 0x53FA, 0x10F2, 0x5401, 0x10F3, 0x5403, 0x0663, 0x5404, 0x05A4, + 0x5408, 0x07F9, 0x5409, 0x0662, 0x540A, 0x0BFB, 0x540B, 0x04C7, 0x540C, + 0x0C89, 0x540D, 0x0ECA, 0x540E, 0x07B3, 0x540F, 0x0F63, 0x5410, 0x0C41, + 0x5411, 0x07B2, 0x541B, 0x0705, 0x541D, 0x10FC, 0x541F, 0x06DB, 0x5420, + 0x0E78, 0x5426, 0x0D71, 0x5427, 0x3827, 0x5429, 0x10FB, 0x542B, 0x061A, + 0x542C, 0x10F6, 0x542D, 0x10F7, 0x542E, 0x10F9, 0x5433, 0x35C0, 0x5436, + 0x10FA, 0x5438, 0x0675, 0x5439, 0x0A27, 0x543B, 0x0DFD, 0x543C, 0x10F8, + 0x543D, 0x10F4, 0x543E, 0x0797, 0x543F, 0x35CF, 0x5440, 0x10F5, 0x5442, + 0x0FCA, 0x5446, 0x0E42, 0x5448, 0x0C04, 0x5449, 0x0796, 0x544A, 0x0802, + 0x544D, 0x3828, 0x544E, 0x10FD, 0x5451, 0x0CB5, 0x5455, 0x3723, 0x545F, + 0x1101, 0x5466, 0x3829, 0x5468, 0x092A, 0x546A, 0x0922, 0x546B, 0x382A, + 0x5470, 0x1104, 0x5471, 0x1102, 0x5473, 0x0EAF, 0x5474, 0x382B, 0x5475, + 0x10FF, 0x5476, 0x1108, 0x5477, 0x1103, 0x547B, 0x1106, 0x547C, 0x077A, + 0x547D, 0x0ECB, 0x5480, 0x1107, 0x5484, 0x1109, 0x5486, 0x110B, 0x548A, + 0x20DC, 0x548B, 0x0860, 0x548C, 0x0FE8, 0x548D, 0x382C, 0x548E, 0x1100, + 0x548F, 0x10FE, 0x5490, 0x110A, 0x5492, 0x1105, 0x5496, 0x382D, 0x549C, + 0x20DB, 0x54A1, 0x382E, 0x54A2, 0x110D, 0x54A4, 0x1116, 0x54A5, 0x110F, + 0x54A8, 0x1113, 0x54A9, 0x20DD, 0x54AB, 0x1114, 0x54AC, 0x1110, 0x54AD, + 0x382F, 0x54AF, 0x1131, 0x54B2, 0x0859, 0x54B3, 0x058F, 0x54B8, 0x110E, + 0x54B9, 0x3830, 0x54BC, 0x1118, 0x54BD, 0x04BA, 0x54BE, 0x1117, 0x54BF, + 0x3831, 0x54C0, 0x0469, 0x54C1, 0x0DBC, 0x54C2, 0x1115, 0x54C4, 0x1111, + 0x54C6, 0x3832, 0x54C7, 0x110C, 0x54C8, 0x1112, 0x54C9, 0x0838, 0x54CD, + 0x3833, 0x54D8, 0x1119, 0x54E1, 0x04BB, 0x54E2, 0x1122, 0x54E5, 0x111A, + 0x54E6, 0x111B, 0x54E8, 0x098D, 0x54E9, 0x0E97, 0x54ED, 0x1120, 0x54EE, + 0x111F, 0x54F2, 0x0C29, 0x54FA, 0x1121, 0x54FD, 0x111E, 0x54FF, 0x20DE, + 0x5504, 0x04D6, 0x5506, 0x0826, 0x5507, 0x09F6, 0x550E, 0x3834, 0x550F, + 0x111C, 0x5510, 0x0C5C, 0x5514, 0x111D, 0x5516, 0x0466, 0x552B, 0x3835, + 0x552E, 0x1127, 0x552F, 0x0F0D, 0x5531, 0x098F, 0x5533, 0x112D, 0x5535, + 0x3836, 0x5538, 0x112C, 0x5539, 0x1123, 0x553E, 0x0B23, 0x5540, 0x1124, + 0x5544, 0x0B4F, 0x5545, 0x1129, 0x5546, 0x098E, 0x554A, 0x3837, 0x554C, + 0x1126, 0x554F, 0x0EF0, 0x5553, 0x0712, 0x5556, 0x112A, 0x5557, 0x112B, + 0x555C, 0x1128, 0x555D, 0x112E, 0x555E, 0x1DD1, 0x5560, 0x3838, 0x5561, + 0x3839, 0x5563, 0x1125, 0x557B, 0x1134, 0x557C, 0x1139, 0x557E, 0x1135, + 0x5580, 0x1130, 0x5583, 0x113A, 0x5584, 0x0AB3, 0x5586, 0x20DF, 0x5587, + 0x113C, 0x5588, 0x383A, 0x5589, 0x07B4, 0x558A, 0x1132, 0x558B, 0x0BBB, + 0x558E, 0x383B, 0x5598, 0x1136, 0x5599, 0x112F, 0x559A, 0x05E9, 0x559C, + 0x062A, 0x559D, 0x05C3, 0x559E, 0x1137, 0x559F, 0x1133, 0x55A7, 0x074C, + 0x55A8, 0x113D, 0x55A9, 0x113B, 0x55AA, 0x0AD5, 0x55AB, 0x0664, 0x55AC, + 0x06A4, 0x55AE, 0x1138, 0x55B0, 0x06EC, 0x55B6, 0x04E6, 0x55C4, 0x1141, + 0x55C5, 0x113F, 0x55C7, 0x1178, 0x55D4, 0x1144, 0x55DA, 0x113E, 0x55DC, + 0x1142, 0x55DF, 0x1140, 0x55E3, 0x089A, 0x55E4, 0x1143, 0x55F7, 0x1146, + 0x55F9, 0x114B, 0x55FD, 0x1149, 0x55FE, 0x1148, 0x5606, 0x0B70, 0x5608, + 0x383C, 0x5609, 0x0545, 0x560E, 0x383D, 0x560F, 0x383E, 0x5614, 0x1145, + 0x5616, 0x1147, 0x5617, 0x0990, 0x5618, 0x04D5, 0x561B, 0x114A, 0x5620, + 0x3C1D, 0x5629, 0x055E, 0x562F, 0x1155, 0x5631, 0x09E4, 0x5632, 0x1151, + 0x5634, 0x114F, 0x5636, 0x1150, 0x5637, 0x383F, 0x5638, 0x1152, 0x563F, + 0x3840, 0x5642, 0x04DF, 0x5649, 0x3841, 0x564B, 0x3842, 0x564C, 0x0ABB, + 0x564E, 0x114C, 0x564F, 0x3843, 0x5650, 0x114D, 0x5653, 0x1F1B, 0x565B, + 0x05D8, 0x5664, 0x1154, 0x5666, 0x3844, 0x5668, 0x062B, 0x5669, 0x3845, + 0x566A, 0x1157, 0x566B, 0x1153, 0x566C, 0x1156, 0x566F, 0x3846, 0x5671, + 0x3847, 0x5672, 0x3848, 0x5674, 0x0DFE, 0x5676, 0x3C33, 0x5678, 0x0CAD, + 0x567A, 0x0D4C, 0x5680, 0x1159, 0x5686, 0x1158, 0x5687, 0x05A3, 0x568A, + 0x115A, 0x568F, 0x115D, 0x5694, 0x115C, 0x5695, 0x3849, 0x5699, 0x1DE6, + 0x569A, 0x384A, 0x56A0, 0x115B, 0x56A2, 0x0CEF, 0x56A5, 0x115E, 0x56AC, + 0x384B, 0x56AD, 0x384C, 0x56AE, 0x115F, 0x56B1, 0x384D, 0x56B4, 0x1161, + 0x56B6, 0x1160, 0x56BC, 0x1163, 0x56C0, 0x1166, 0x56C1, 0x1164, 0x56C2, + 0x1162, 0x56C3, 0x1165, 0x56C8, 0x1167, 0x56C9, 0x384E, 0x56CA, 0x1E5A, + 0x56CE, 0x1168, 0x56D1, 0x1169, 0x56D3, 0x116A, 0x56D7, 0x116B, 0x56D8, + 0x107C, 0x56DA, 0x0928, 0x56DB, 0x089B, 0x56DD, 0x384F, 0x56DE, 0x0573, + 0x56E0, 0x04BC, 0x56E3, 0x0B82, 0x56E4, 0x3850, 0x56EE, 0x116C, 0x56F0, + 0x0814, 0x56F2, 0x0493, 0x56F3, 0x0A24, 0x56F9, 0x116D, 0x56FA, 0x077B, + 0x56FD, 0x0803, 0x56FF, 0x116F, 0x5700, 0x116E, 0x5703, 0x0E30, 0x5704, + 0x1170, 0x5708, 0x1172, 0x5709, 0x1171, 0x570A, 0x3851, 0x570B, 0x1173, + 0x570D, 0x1174, 0x570F, 0x074D, 0x5712, 0x0502, 0x5713, 0x1175, 0x5715, + 0x3852, 0x5716, 0x1177, 0x5718, 0x1176, 0x571C, 0x1179, 0x571F, 0x0C54, + 0x5721, 0x3680, 0x5723, 0x3853, 0x5726, 0x117A, 0x5727, 0x0479, 0x5728, + 0x084F, 0x572D, 0x0713, 0x572F, 0x3854, 0x5730, 0x0B8D, 0x5733, 0x3855, + 0x5734, 0x3856, 0x5737, 0x117B, 0x5738, 0x117C, 0x573B, 0x117E, 0x5740, + 0x117F, 0x5742, 0x0854, 0x5747, 0x06C9, 0x574A, 0x0E65, 0x574C, 0x3857, + 0x574E, 0x117D, 0x574F, 0x1180, 0x5750, 0x0831, 0x5751, 0x07B5, 0x5759, + 0x20E0, 0x5761, 0x1184, 0x5764, 0x0815, 0x5765, 0x20E1, 0x5766, 0x0B71, + 0x5769, 0x1181, 0x576A, 0x0BF6, 0x5770, 0x3858, 0x577F, 0x1185, 0x5782, + 0x0A28, 0x5788, 0x1183, 0x5789, 0x1186, 0x578B, 0x0715, 0x578C, 0x3859, + 0x5793, 0x1187, 0x579C, 0x385A, 0x57A0, 0x1188, 0x57A2, 0x07B6, 0x57A3, + 0x059E, 0x57A4, 0x118A, 0x57AA, 0x118B, 0x57AC, 0x20E2, 0x57B0, 0x118C, + 0x57B3, 0x1189, 0x57B8, 0x385B, 0x57C0, 0x1182, 0x57C3, 0x118D, 0x57C6, + 0x118E, 0x57C7, 0x20E4, 0x57C8, 0x20E3, 0x57CB, 0x0E92, 0x57CE, 0x09D3, + 0x57D2, 0x1190, 0x57D3, 0x1191, 0x57D4, 0x118F, 0x57D6, 0x1193, 0x57DC, + 0x0CEE, 0x57DF, 0x04AC, 0x57E0, 0x0DC8, 0x57E3, 0x1194, 0x57E6, 0x385C, + 0x57ED, 0x385D, 0x57F4, 0x09E5, 0x57F5, 0x385E, 0x57F6, 0x385F, 0x57F7, + 0x08E5, 0x57F9, 0x0D13, 0x57FA, 0x062C, 0x57FC, 0x085B, 0x57FF, 0x3860, + 0x5800, 0x0E87, 0x5802, 0x0C8A, 0x5805, 0x074E, 0x5806, 0x0B2F, 0x5809, + 0x3861, 0x580A, 0x1192, 0x580B, 0x1195, 0x5815, 0x0B24, 0x5819, 0x1196, + 0x581D, 0x1197, 0x5820, 0x3862, 0x5821, 0x1199, 0x5824, 0x0C05, 0x582A, + 0x05EA, 0x582F, 0x1D32, 0x5830, 0x0503, 0x5831, 0x0E43, 0x5832, 0x3863, + 0x5834, 0x09D4, 0x5835, 0x0C42, 0x583A, 0x0856, 0x583D, 0x119F, 0x5840, + 0x0E0D, 0x5841, 0x0FA5, 0x584A, 0x0574, 0x584B, 0x119B, 0x5851, 0x0ABC, + 0x5852, 0x119E, 0x5854, 0x0C5D, 0x5857, 0x0C43, 0x5858, 0x0C5E, 0x5859, + 0x0D4D, 0x585A, 0x0BE9, 0x585E, 0x0839, 0x5861, 0x1E47, 0x5862, 0x119A, + 0x5869, 0x0518, 0x586B, 0x0C30, 0x5870, 0x119C, 0x5872, 0x1198, 0x5875, + 0x0A16, 0x5879, 0x11A0, 0x587C, 0x3864, 0x587E, 0x0958, 0x5880, 0x3865, + 0x5883, 0x06A5, 0x5885, 0x11A1, 0x5893, 0x0E38, 0x5897, 0x0AFF, 0x589C, + 0x0BE2, 0x589E, 0x20E7, 0x589F, 0x11A3, 0x58A8, 0x0E7D, 0x58A9, 0x3866, + 0x58AB, 0x11A4, 0x58AE, 0x11A9, 0x58B2, 0x20E8, 0x58B3, 0x0DFF, 0x58B8, + 0x11A8, 0x58B9, 0x11A2, 0x58BA, 0x11A5, 0x58BB, 0x11A7, 0x58BE, 0x0816, + 0x58C1, 0x0E19, 0x58C5, 0x11AA, 0x58C7, 0x0B83, 0x58CA, 0x0575, 0x58CC, + 0x09D5, 0x58CE, 0x3867, 0x58D0, 0x3868, 0x58D1, 0x11AC, 0x58D3, 0x11AB, + 0x58D4, 0x3869, 0x58D5, 0x07FA, 0x58D7, 0x11AD, 0x58D8, 0x11AF, 0x58D9, + 0x11AE, 0x58DA, 0x386A, 0x58DC, 0x11B1, 0x58DE, 0x11A6, 0x58DF, 0x11B3, + 0x58E4, 0x11B2, 0x58E5, 0x11B0, 0x58E9, 0x386B, 0x58EB, 0x089C, 0x58EC, + 0x0A17, 0x58EE, 0x0AD6, 0x58EF, 0x11B4, 0x58F0, 0x0A60, 0x58F1, 0x04B1, + 0x58F2, 0x0D1A, 0x58F7, 0x0BF7, 0x58F9, 0x11B6, 0x58FA, 0x11B5, 0x58FB, + 0x11B7, 0x58FC, 0x11B8, 0x58FD, 0x11B9, 0x5902, 0x11BA, 0x5909, 0x0E21, + 0x590A, 0x11BB, 0x590B, 0x20E9, 0x590C, 0x386C, 0x590F, 0x0546, 0x5910, + 0x11BC, 0x5915, 0x0F26, 0x5916, 0x058E, 0x5918, 0x10DE, 0x5919, 0x0952, + 0x591A, 0x0B1F, 0x591B, 0x11BD, 0x591C, 0x0EF7, 0x5922, 0x0EC0, 0x5924, + 0x386D, 0x5925, 0x11BF, 0x5927, 0x0B47, 0x5929, 0x0C31, 0x592A, 0x0B20, + 0x592B, 0x0DC9, 0x592C, 0x11C0, 0x592D, 0x11C1, 0x592E, 0x051D, 0x592F, + 0x386E, 0x5931, 0x08E6, 0x5932, 0x11C2, 0x5937, 0x0494, 0x5938, 0x11C3, + 0x5939, 0x3725, 0x593E, 0x11C4, 0x5944, 0x0504, 0x5947, 0x062D, 0x5948, + 0x0CB8, 0x5949, 0x0E44, 0x594E, 0x11C8, 0x594F, 0x0AD7, 0x5950, 0x11C7, + 0x5951, 0x0716, 0x5953, 0x20EA, 0x5954, 0x0E89, 0x5955, 0x11C6, 0x5957, + 0x0C5F, 0x5958, 0x11CA, 0x595A, 0x11C9, 0x595B, 0x20EB, 0x595D, 0x20EC, + 0x5960, 0x11CC, 0x5961, 0x386F, 0x5962, 0x11CB, 0x5963, 0x20ED, 0x5965, + 0x051E, 0x5967, 0x11CD, 0x5968, 0x0991, 0x5969, 0x11CF, 0x596A, 0x0B63, + 0x596C, 0x11CE, 0x596D, 0x3870, 0x596E, 0x0E03, 0x5973, 0x0981, 0x5974, + 0x0C55, 0x5978, 0x11D0, 0x597D, 0x07B7, 0x5981, 0x11D1, 0x5982, 0x0CD7, + 0x5983, 0x0D72, 0x5984, 0x0EDD, 0x598A, 0x0CDB, 0x598D, 0x11DA, 0x5993, + 0x0652, 0x5996, 0x0F2F, 0x5999, 0x0EBB, 0x599B, 0x1239, 0x599D, 0x11D2, + 0x59A3, 0x11D5, 0x59A4, 0x20EE, 0x59A5, 0x0B25, 0x59A8, 0x0E66, 0x59AC, + 0x0C44, 0x59B2, 0x11D6, 0x59B9, 0x0E93, 0x59BA, 0x20EF, 0x59BB, 0x083A, + 0x59BE, 0x0992, 0x59C6, 0x11D7, 0x59C9, 0x089E, 0x59CA, 0x3871, 0x59CB, + 0x089D, 0x59D0, 0x047D, 0x59D1, 0x077C, 0x59D2, 0x3872, 0x59D3, 0x0A4F, + 0x59D4, 0x0495, 0x59D9, 0x11DB, 0x59DA, 0x11DC, 0x59DC, 0x11D9, 0x59DD, + 0x3873, 0x59E3, 0x3874, 0x59E4, 0x3875, 0x59E5, 0x04DA, 0x59E6, 0x05EB, + 0x59E8, 0x11D8, 0x59EA, 0x0ED1, 0x59EB, 0x0DA3, 0x59EC, 0x36AD, 0x59F6, + 0x046C, 0x59FB, 0x04BD, 0x59FF, 0x089F, 0x5A01, 0x0496, 0x5A03, 0x0467, + 0x5A04, 0x3876, 0x5A09, 0x11E1, 0x5A0C, 0x3877, 0x5A11, 0x11DF, 0x5A18, + 0x0EC8, 0x5A1A, 0x11E2, 0x5A1B, 0x35C1, 0x5A1C, 0x11E0, 0x5A1F, 0x11DE, + 0x5A20, 0x09F7, 0x5A23, 0x3878, 0x5A25, 0x11DD, 0x5A29, 0x0E2A, 0x5A2F, + 0x0798, 0x5A35, 0x11E6, 0x5A36, 0x11E7, 0x5A3C, 0x0993, 0x5A40, 0x11E3, + 0x5A41, 0x0FD2, 0x5A46, 0x0D02, 0x5A47, 0x3879, 0x5A49, 0x11E5, 0x5A55, + 0x387A, 0x5A5A, 0x0817, 0x5A62, 0x11E8, 0x5A63, 0x387B, 0x5A66, 0x0DCA, + 0x5A6A, 0x11E9, 0x5A6C, 0x11E4, 0x5A6D, 0x387C, 0x5A7E, 0x387D, 0x5A7F, + 0x0EC7, 0x5A92, 0x0D14, 0x5A9A, 0x11EA, 0x5A9B, 0x0DA4, 0x5A9E, 0x387E, + 0x5AA7, 0x387F, 0x5AAC, 0x3880, 0x5AB3, 0x3881, 0x5ABC, 0x11EB, 0x5ABD, + 0x11EF, 0x5ABE, 0x11EC, 0x5AC1, 0x0547, 0x5AC2, 0x11EE, 0x5AC9, 0x08E7, + 0x5ACB, 0x11ED, 0x5ACC, 0x074F, 0x5AD0, 0x11FB, 0x5AD6, 0x11F4, 0x5AD7, + 0x11F1, 0x5AE0, 0x3882, 0x5AE1, 0x0BA2, 0x5AE3, 0x11F0, 0x5AE6, 0x11F2, + 0x5AE9, 0x11F3, 0x5AFA, 0x11F5, 0x5AFB, 0x11F6, 0x5B00, 0x3883, 0x5B09, + 0x062E, 0x5B0B, 0x11F8, 0x5B0C, 0x11F7, 0x5B16, 0x11F9, 0x5B19, 0x3884, + 0x5B22, 0x09D6, 0x5B25, 0x3885, 0x5B2A, 0x11FC, 0x5B2C, 0x0BF8, 0x5B2D, + 0x3886, 0x5B30, 0x04E7, 0x5B32, 0x11FA, 0x5B36, 0x11FD, 0x5B3E, 0x11FE, + 0x5B40, 0x1201, 0x5B41, 0x3887, 0x5B43, 0x11FF, 0x5B45, 0x1200, 0x5B50, + 0x08A0, 0x5B51, 0x1202, 0x5B54, 0x07B8, 0x5B55, 0x1203, 0x5B56, 0x20F0, + 0x5B57, 0x08C8, 0x5B58, 0x0B18, 0x5B5A, 0x1204, 0x5B5B, 0x1205, 0x5B5C, + 0x08A8, 0x5B5D, 0x07B9, 0x5B5F, 0x0EDE, 0x5B63, 0x0642, 0x5B64, 0x077D, + 0x5B65, 0x1206, 0x5B66, 0x05B6, 0x5B69, 0x1207, 0x5B6B, 0x0B19, 0x5B70, + 0x1208, 0x5B71, 0x1230, 0x5B73, 0x1209, 0x5B75, 0x120A, 0x5B78, 0x120B, + 0x5B7A, 0x120D, 0x5B7C, 0x3888, 0x5B7E, 0x3889, 0x5B7F, 0x388A, 0x5B80, + 0x120E, 0x5B82, 0x3610, 0x5B83, 0x120F, 0x5B85, 0x0B50, 0x5B87, 0x04C9, + 0x5B88, 0x0915, 0x5B89, 0x0486, 0x5B8A, 0x388B, 0x5B8B, 0x0AD9, 0x5B8C, + 0x05EC, 0x5B8D, 0x08E1, 0x5B8F, 0x07BA, 0x5B95, 0x0C60, 0x5B97, 0x092B, + 0x5B98, 0x05ED, 0x5B99, 0x0BA6, 0x5B9A, 0x0C06, 0x5B9B, 0x047C, 0x5B9C, + 0x0653, 0x5B9D, 0x0E45, 0x5B9F, 0x08EE, 0x5BA2, 0x066C, 0x5BA3, 0x0A8F, + 0x5BA4, 0x08E8, 0x5BA5, 0x0F12, 0x5BA6, 0x1210, 0x5BAE, 0x0676, 0x5BB0, + 0x083B, 0x5BB3, 0x0590, 0x5BB4, 0x0505, 0x5BB5, 0x0994, 0x5BB6, 0x0548, + 0x5BB8, 0x1211, 0x5BB9, 0x0F30, 0x5BBF, 0x0953, 0x5BC0, 0x20F1, 0x5BC2, + 0x0910, 0x5BC3, 0x1212, 0x5BC4, 0x062F, 0x5BC5, 0x0CAA, 0x5BC6, 0x0EB5, + 0x5BC7, 0x1213, 0x5BC9, 0x1214, 0x5BCC, 0x0DCB, 0x5BD0, 0x1216, 0x5BD2, + 0x05E4, 0x5BD3, 0x06EF, 0x5BD4, 0x1215, 0x5BD8, 0x20F3, 0x5BDB, 0x05EE, + 0x5BDD, 0x09F8, 0x5BDE, 0x121A, 0x5BDF, 0x086F, 0x5BE1, 0x0549, 0x5BE2, + 0x1219, 0x5BE4, 0x1217, 0x5BE5, 0x121B, 0x5BE6, 0x1218, 0x5BE7, 0x0CE1, + 0x5BE8, 0x148E, 0x5BE9, 0x09F9, 0x5BEB, 0x121C, 0x5BEC, 0x20F4, 0x5BEE, + 0x0F88, 0x5BF0, 0x121D, 0x5BF3, 0x121F, 0x5BF5, 0x0BBC, 0x5BF6, 0x121E, + 0x5BF8, 0x0A47, 0x5BFA, 0x08C9, 0x5BFE, 0x0B30, 0x5BFF, 0x0923, 0x5C01, + 0x0DE7, 0x5C02, 0x0A90, 0x5C04, 0x08F9, 0x5C05, 0x1220, 0x5C06, 0x0995, + 0x5C07, 0x1221, 0x5C08, 0x1222, 0x5C09, 0x0497, 0x5C0A, 0x0B1A, 0x5C0B, + 0x0A18, 0x5C0D, 0x1223, 0x5C0E, 0x0C8B, 0x5C0F, 0x0996, 0x5C11, 0x0997, + 0x5C13, 0x1224, 0x5C14, 0x372A, 0x5C16, 0x0A91, 0x5C19, 0x360B, 0x5C1A, + 0x0998, 0x5C1E, 0x20F5, 0x5C20, 0x1225, 0x5C22, 0x1226, 0x5C23, 0x388C, + 0x5C24, 0x0EEC, 0x5C28, 0x1227, 0x5C2B, 0x388D, 0x5C2D, 0x06BE, 0x5C30, + 0x388E, 0x5C31, 0x092C, 0x5C38, 0x1228, 0x5C39, 0x1229, 0x5C3A, 0x0908, + 0x5C3B, 0x09F2, 0x5C3C, 0x0CCC, 0x5C3D, 0x0A1A, 0x5C3E, 0x0D8C, 0x5C3F, + 0x0CD8, 0x5C40, 0x06C1, 0x5C41, 0x122A, 0x5C45, 0x0689, 0x5C46, 0x122B, + 0x5C48, 0x06F6, 0x5C4A, 0x0CA7, 0x5C4B, 0x0530, 0x5C4D, 0x08A1, 0x5C4E, + 0x122C, 0x5C4F, 0x122F, 0x5C50, 0x122E, 0x5C51, 0x06F5, 0x5C53, 0x122D, + 0x5C55, 0x0C32, 0x5C5B, 0x1E92, 0x5C5E, 0x0B10, 0x5C60, 0x0C45, 0x5C61, + 0x08F4, 0x5C62, 0x1E0D, 0x5C63, 0x388F, 0x5C64, 0x0ADA, 0x5C65, 0x0F64, + 0x5C69, 0x3890, 0x5C6C, 0x1231, 0x5C6E, 0x1232, 0x5C6F, 0x0CAE, 0x5C71, + 0x0881, 0x5C76, 0x1234, 0x5C79, 0x1235, 0x5C7C, 0x3891, 0x5C8C, 0x1236, + 0x5C90, 0x0630, 0x5C91, 0x1237, 0x5C94, 0x1238, 0x5CA1, 0x052C, 0x5CA6, + 0x20F6, 0x5CA8, 0x0ABD, 0x5CA9, 0x0620, 0x5CAB, 0x123A, 0x5CAC, 0x0EB4, + 0x5CB1, 0x0B32, 0x5CB3, 0x05B7, 0x5CB6, 0x123C, 0x5CB7, 0x123E, 0x5CB8, + 0x061B, 0x5CBA, 0x20F7, 0x5CBB, 0x123B, 0x5CBC, 0x123D, 0x5CBE, 0x1240, + 0x5CC5, 0x123F, 0x5CC7, 0x1241, 0x5CCB, 0x3892, 0x5CD2, 0x3893, 0x5CD9, + 0x1242, 0x5CE0, 0x0C95, 0x5CE1, 0x06A6, 0x5CE6, 0x372C, 0x5CE8, 0x0565, + 0x5CE9, 0x1243, 0x5CEA, 0x1248, 0x5CED, 0x1246, 0x5CEF, 0x0E47, 0x5CF0, + 0x0E46, 0x5CF4, 0x3894, 0x5CF5, 0x20F8, 0x5CF6, 0x0C61, 0x5CFA, 0x1245, + 0x5CFB, 0x095E, 0x5CFD, 0x1244, 0x5D07, 0x0A38, 0x5D0B, 0x1249, 0x5D0E, + 0x085A, 0x5D11, 0x124F, 0x5D14, 0x1250, 0x5D15, 0x124A, 0x5D16, 0x0591, + 0x5D17, 0x124B, 0x5D18, 0x1254, 0x5D19, 0x1253, 0x5D1A, 0x1252, 0x5D1B, + 0x124E, 0x5D1F, 0x124D, 0x5D22, 0x1251, 0x5D24, 0x3895, 0x5D26, 0x3896, + 0x5D27, 0x20F9, 0x5D29, 0x0E48, 0x5D42, 0x20FC, 0x5D43, 0x3897, 0x5D46, + 0x3898, 0x5D4A, 0x3899, 0x5D4B, 0x1258, 0x5D4C, 0x1255, 0x5D4E, 0x1257, + 0x5D50, 0x0F5C, 0x5D52, 0x1256, 0x5D53, 0x20FA, 0x5D5C, 0x124C, 0x5D69, + 0x0A39, 0x5D6C, 0x1259, 0x5D6D, 0x20FD, 0x5D6F, 0x0827, 0x5D73, 0x125A, + 0x5D76, 0x125B, 0x5D82, 0x125E, 0x5D84, 0x125D, 0x5D87, 0x125C, 0x5D8B, + 0x0C62, 0x5D8C, 0x1247, 0x5D90, 0x1264, 0x5D92, 0x389A, 0x5D94, 0x389B, + 0x5D99, 0x389C, 0x5D9D, 0x1260, 0x5DA0, 0x389D, 0x5DA2, 0x125F, 0x5DAC, + 0x1261, 0x5DAE, 0x1262, 0x5DB2, 0x3BA5, 0x5DB7, 0x1265, 0x5DB8, 0x20FE, + 0x5DB9, 0x20FF, 0x5DBA, 0x0FAE, 0x5DBC, 0x1266, 0x5DBD, 0x1263, 0x5DC9, + 0x1267, 0x5DCC, 0x061C, 0x5DCD, 0x1268, 0x5DD0, 0x2100, 0x5DD2, 0x126A, + 0x5DD3, 0x1269, 0x5DD6, 0x126B, 0x5DD8, 0x389E, 0x5DDB, 0x126C, 0x5DDD, + 0x0A92, 0x5DDE, 0x092D, 0x5DE0, 0x389F, 0x5DE1, 0x096E, 0x5DE2, 0x3432, + 0x5DE3, 0x0AE5, 0x5DE5, 0x07BB, 0x5DE6, 0x0828, 0x5DE7, 0x07BC, 0x5DE8, + 0x068A, 0x5DEB, 0x126D, 0x5DEE, 0x0829, 0x5DF1, 0x077E, 0x5DF2, 0x126E, + 0x5DF3, 0x0EB2, 0x5DF4, 0x0CF9, 0x5DF5, 0x126F, 0x5DF7, 0x07BD, 0x5DF8, + 0x38A0, 0x5DFB, 0x05E8, 0x5DFD, 0x0B65, 0x5DFE, 0x06CA, 0x5DFF, 0x35E2, + 0x5E00, 0x38A1, 0x5E02, 0x08A2, 0x5E03, 0x0DCD, 0x5E06, 0x0D55, 0x5E0B, + 0x1270, 0x5E0C, 0x0631, 0x5E11, 0x1273, 0x5E12, 0x38A2, 0x5E14, 0x38A3, + 0x5E15, 0x38A4, 0x5E16, 0x0BBD, 0x5E18, 0x38A5, 0x5E19, 0x1272, 0x5E1A, + 0x1271, 0x5E1B, 0x1274, 0x5E1D, 0x0C07, 0x5E25, 0x0A29, 0x5E2B, 0x08A3, + 0x5E2D, 0x0A6E, 0x5E2E, 0x38A6, 0x5E2F, 0x0B33, 0x5E30, 0x063C, 0x5E33, + 0x0BBE, 0x5E36, 0x1275, 0x5E37, 0x1276, 0x5E38, 0x09D7, 0x5E3D, 0x0E67, + 0x5E40, 0x1279, 0x5E43, 0x1278, 0x5E44, 0x1277, 0x5E45, 0x0DEF, 0x5E47, + 0x1280, 0x5E4C, 0x0E88, 0x5E4E, 0x127A, 0x5E54, 0x127C, 0x5E55, 0x0E99, + 0x5E57, 0x127B, 0x5E58, 0x38A7, 0x5E5F, 0x127D, 0x5E61, 0x0D3C, 0x5E62, + 0x127E, 0x5E63, 0x0E0E, 0x5E64, 0x127F, 0x5E6B, 0x38A8, 0x5E6C, 0x38A9, + 0x5E72, 0x05EF, 0x5E73, 0x0E0F, 0x5E74, 0x0CE5, 0x5E75, 0x1281, 0x5E76, + 0x1282, 0x5E78, 0x07BE, 0x5E79, 0x05F0, 0x5E7A, 0x1283, 0x5E7B, 0x076C, + 0x5E7C, 0x0F2E, 0x5E7D, 0x0F13, 0x5E7E, 0x0632, 0x5E7F, 0x1285, 0x5E81, + 0x0BBF, 0x5E83, 0x07BF, 0x5E84, 0x0999, 0x5E87, 0x0D73, 0x5E8A, 0x099A, + 0x5E8F, 0x0982, 0x5E95, 0x0C08, 0x5E96, 0x0E49, 0x5E97, 0x0C33, 0x5E99, + 0x36B0, 0x5E9A, 0x07C0, 0x5E9C, 0x0DCE, 0x5EA0, 0x1286, 0x5EA6, 0x0C53, + 0x5EA7, 0x0832, 0x5EA8, 0x38AA, 0x5EAA, 0x38AB, 0x5EAB, 0x077F, 0x5EAD, + 0x0C09, 0x5EB5, 0x0487, 0x5EB6, 0x0978, 0x5EB7, 0x07C1, 0x5EB8, 0x0F31, + 0x5EBE, 0x38AC, 0x5EBF, 0x38AD, 0x5EC1, 0x1287, 0x5EC2, 0x1288, 0x5EC3, + 0x0D07, 0x5EC8, 0x1289, 0x5EC9, 0x0FBF, 0x5ECA, 0x0FD3, 0x5ECB, 0x38AE, + 0x5ECF, 0x128B, 0x5ED0, 0x128A, 0x5ED2, 0x38AF, 0x5ED3, 0x05A5, 0x5ED6, + 0x128C, 0x5EDA, 0x128F, 0x5EDB, 0x1290, 0x5EDD, 0x128E, 0x5EDF, 0x0DB2, + 0x5EE0, 0x099B, 0x5EE1, 0x1292, 0x5EE2, 0x1291, 0x5EE3, 0x128D, 0x5EE8, + 0x1293, 0x5EE9, 0x1294, 0x5EEC, 0x1295, 0x5EF0, 0x1298, 0x5EF1, 0x1296, + 0x5EF3, 0x1297, 0x5EF4, 0x1299, 0x5EF6, 0x0506, 0x5EF7, 0x0C0A, 0x5EF8, + 0x129A, 0x5EFA, 0x0750, 0x5EFB, 0x0576, 0x5EFC, 0x0CEC, 0x5EFE, 0x129B, + 0x5EFF, 0x0CD3, 0x5F01, 0x0E2B, 0x5F03, 0x129C, 0x5F04, 0x0FD4, 0x5F07, + 0x38B0, 0x5F09, 0x129D, 0x5F0A, 0x0E10, 0x5F0B, 0x12A0, 0x5F0C, 0x0FFA, + 0x5F0D, 0x100A, 0x5F0E, 0x38B1, 0x5F0F, 0x08DC, 0x5F10, 0x0CCD, 0x5F11, + 0x12A1, 0x5F13, 0x0677, 0x5F14, 0x0BC0, 0x5F15, 0x04BE, 0x5F16, 0x12A2, + 0x5F17, 0x0DF6, 0x5F18, 0x07C2, 0x5F1B, 0x0B8E, 0x5F1C, 0x38B2, 0x5F1D, + 0x38B3, 0x5F1F, 0x0C0B, 0x5F21, 0x2101, 0x5F22, 0x38B4, 0x5F25, 0x0EFB, + 0x5F26, 0x076D, 0x5F27, 0x0780, 0x5F28, 0x38B5, 0x5F29, 0x12A3, 0x5F2D, + 0x12A4, 0x5F2F, 0x12AA, 0x5F31, 0x0911, 0x5F34, 0x2102, 0x5F35, 0x0BC1, + 0x5F36, 0x38B6, 0x5F37, 0x06A7, 0x5F38, 0x12A5, 0x5F3A, 0x3598, 0x5F3B, + 0x38B7, 0x5F3C, 0x0D9D, 0x5F3E, 0x0B84, 0x5F40, 0x38B8, 0x5F41, 0x12A6, + 0x5F45, 0x20B2, 0x5F48, 0x12A7, 0x5F4A, 0x06A8, 0x5F4C, 0x12A8, 0x5F4E, + 0x12A9, 0x5F50, 0x38B9, 0x5F51, 0x12AB, 0x5F53, 0x0C70, 0x5F56, 0x12AC, + 0x5F57, 0x12AD, 0x5F58, 0x38BA, 0x5F59, 0x12AE, 0x5F5C, 0x129F, 0x5F5D, + 0x129E, 0x5F61, 0x12AF, 0x5F62, 0x0717, 0x5F64, 0x38BB, 0x5F65, 0x36AC, + 0x5F66, 0x0D99, 0x5F67, 0x2103, 0x5F69, 0x083C, 0x5F6A, 0x0DA9, 0x5F6B, + 0x0BC2, 0x5F6C, 0x0DBD, 0x5F6D, 0x12B0, 0x5F70, 0x099C, 0x5F71, 0x04E8, + 0x5F73, 0x12B1, 0x5F77, 0x12B2, 0x5F79, 0x0EFE, 0x5F7C, 0x0D74, 0x5F7F, + 0x12B5, 0x5F80, 0x051F, 0x5F81, 0x0A50, 0x5F82, 0x12B4, 0x5F83, 0x12B3, + 0x5F84, 0x0718, 0x5F85, 0x0B34, 0x5F87, 0x12B9, 0x5F88, 0x12B7, 0x5F89, + 0x38BC, 0x5F8A, 0x12B6, 0x5F8B, 0x0F6F, 0x5F8C, 0x0799, 0x5F90, 0x0983, + 0x5F91, 0x12B8, 0x5F92, 0x0C46, 0x5F93, 0x0948, 0x5F97, 0x0C98, 0x5F98, + 0x12BC, 0x5F99, 0x12BB, 0x5F9C, 0x38BD, 0x5F9E, 0x12BA, 0x5FA0, 0x12BD, + 0x5FA1, 0x079A, 0x5FA4, 0x38BF, 0x5FA7, 0x38BE, 0x5FA8, 0x12BE, 0x5FA9, + 0x0DEE, 0x5FAA, 0x0965, 0x5FAD, 0x12BF, 0x5FAE, 0x0D8D, 0x5FAF, 0x38C0, + 0x5FB3, 0x0C99, 0x5FB4, 0x0BC3, 0x5FB5, 0x3438, 0x5FB7, 0x2104, 0x5FB8, + 0x38C1, 0x5FB9, 0x0C2A, 0x5FBC, 0x12C0, 0x5FBD, 0x0645, 0x5FC3, 0x09FA, + 0x5FC4, 0x38C2, 0x5FC5, 0x0D9E, 0x5FC9, 0x38C3, 0x5FCC, 0x0633, 0x5FCD, + 0x0CDC, 0x5FD6, 0x12C1, 0x5FD7, 0x08A4, 0x5FD8, 0x0E68, 0x5FD9, 0x0E69, + 0x5FDC, 0x0520, 0x5FDD, 0x12C6, 0x5FDE, 0x2105, 0x5FE0, 0x0BA7, 0x5FE1, + 0x38C4, 0x5FE4, 0x12C3, 0x5FE9, 0x38C5, 0x5FEB, 0x0577, 0x5FED, 0x38C6, + 0x5FF0, 0x12F6, 0x5FF1, 0x12C5, 0x5FF5, 0x0CE6, 0x5FF8, 0x12C4, 0x5FFB, + 0x12C2, 0x5FFC, 0x38C7, 0x5FFD, 0x080C, 0x5FFF, 0x12C8, 0x600E, 0x12CE, + 0x600F, 0x12D4, 0x6010, 0x12CC, 0x6012, 0x0C56, 0x6015, 0x12D1, 0x6016, + 0x0DCF, 0x6017, 0x38C8, 0x6019, 0x12CB, 0x601A, 0x38C9, 0x601B, 0x12D0, + 0x601C, 0x0FAF, 0x601D, 0x08A5, 0x6020, 0x0B35, 0x6021, 0x12C9, 0x6025, + 0x0678, 0x6026, 0x12D3, 0x6027, 0x0A51, 0x6028, 0x0507, 0x6029, 0x12CD, + 0x602A, 0x0578, 0x602B, 0x12D2, 0x602F, 0x06A9, 0x6031, 0x12CF, 0x6033, + 0x38CA, 0x603A, 0x12D5, 0x6041, 0x12D7, 0x6042, 0x12E1, 0x6043, 0x12DF, + 0x6046, 0x12DC, 0x604A, 0x12DB, 0x604B, 0x0FC0, 0x604D, 0x12DD, 0x6050, + 0x06AA, 0x6052, 0x07C3, 0x6055, 0x0984, 0x6059, 0x12E4, 0x605A, 0x12D6, + 0x605D, 0x2106, 0x605F, 0x12DA, 0x6060, 0x12CA, 0x6061, 0x38CB, 0x6062, + 0x057A, 0x6063, 0x12DE, 0x6064, 0x12E0, 0x6065, 0x0B8F, 0x6068, 0x0818, + 0x6069, 0x0538, 0x606A, 0x12D8, 0x606B, 0x12E3, 0x606C, 0x12E2, 0x606D, + 0x06AB, 0x606F, 0x0B09, 0x6070, 0x05C4, 0x6075, 0x0719, 0x6077, 0x12D9, + 0x607F, 0x38CC, 0x6081, 0x12E5, 0x6083, 0x12E8, 0x6084, 0x12EA, 0x6085, + 0x2107, 0x6089, 0x08E9, 0x608A, 0x2108, 0x608B, 0x12F0, 0x608C, 0x0C0C, + 0x608D, 0x12E6, 0x6092, 0x12EE, 0x6094, 0x0579, 0x6096, 0x12EC, 0x6097, + 0x12ED, 0x609A, 0x12E9, 0x609B, 0x12EB, 0x609E, 0x38CD, 0x609F, 0x079B, + 0x60A0, 0x0F14, 0x60A3, 0x05F1, 0x60A4, 0x38CE, 0x60A6, 0x04FB, 0x60A7, + 0x12EF, 0x60A9, 0x0CF0, 0x60AA, 0x0471, 0x60B0, 0x38CF, 0x60B2, 0x0D75, + 0x60B3, 0x12C7, 0x60B4, 0x12F5, 0x60B5, 0x12F9, 0x60B6, 0x0EF1, 0x60B8, + 0x12F2, 0x60BC, 0x0C63, 0x60BD, 0x12F7, 0x60C5, 0x09D8, 0x60C6, 0x12F8, + 0x60C7, 0x0CAF, 0x60CB, 0x38D0, 0x60D1, 0x0FED, 0x60D3, 0x12F4, 0x60D5, + 0x210A, 0x60D8, 0x12FA, 0x60DA, 0x080D, 0x60DB, 0x38D1, 0x60DC, 0x0A6F, + 0x60DE, 0x2109, 0x60DF, 0x0498, 0x60E0, 0x12F3, 0x60E1, 0x12F1, 0x60E3, + 0x0ADC, 0x60E7, 0x12E7, 0x60E8, 0x0882, 0x60F0, 0x0B26, 0x60F1, 0x1306, + 0x60F2, 0x210C, 0x60F3, 0x0ADD, 0x60F4, 0x1301, 0x60F6, 0x12FE, 0x60F7, + 0x12FF, 0x60F8, 0x38D2, 0x60F9, 0x0912, 0x60FA, 0x1302, 0x60FB, 0x1305, + 0x6100, 0x1300, 0x6101, 0x092F, 0x6103, 0x1303, 0x6106, 0x12FD, 0x6108, + 0x0F08, 0x6109, 0x0F07, 0x610D, 0x1307, 0x610E, 0x1308, 0x610F, 0x0499, + 0x6111, 0x210D, 0x6112, 0x38D3, 0x6113, 0x38D4, 0x6114, 0x38D5, 0x6115, + 0x12FC, 0x611A, 0x06EA, 0x611B, 0x046A, 0x611C, 0x38D6, 0x611F, 0x05F2, + 0x6120, 0x210B, 0x6121, 0x1304, 0x6127, 0x130C, 0x6128, 0x130B, 0x612C, + 0x1310, 0x6130, 0x210F, 0x6134, 0x1311, 0x6137, 0x210E, 0x613C, 0x130F, + 0x613D, 0x1312, 0x613E, 0x130A, 0x613F, 0x130E, 0x6142, 0x1313, 0x6144, + 0x1314, 0x6147, 0x1309, 0x6148, 0x08CA, 0x614A, 0x130D, 0x614B, 0x0B36, + 0x614C, 0x07C4, 0x614D, 0x12FB, 0x614E, 0x09FB, 0x6153, 0x1321, 0x6155, + 0x0E39, 0x6158, 0x1317, 0x6159, 0x1318, 0x615A, 0x1319, 0x615D, 0x1320, + 0x615F, 0x131F, 0x6162, 0x0EAB, 0x6163, 0x05F3, 0x6165, 0x131D, 0x6167, + 0x071B, 0x6168, 0x0592, 0x616B, 0x131A, 0x616E, 0x0F80, 0x616F, 0x131C, + 0x6170, 0x049A, 0x6171, 0x131E, 0x6173, 0x1315, 0x6174, 0x131B, 0x6175, + 0x1322, 0x6176, 0x071A, 0x6177, 0x1316, 0x617C, 0x38D7, 0x617E, 0x0F47, + 0x6182, 0x0F15, 0x6187, 0x1325, 0x618A, 0x1329, 0x618D, 0x38D8, 0x618E, + 0x0B00, 0x6190, 0x0FC1, 0x6191, 0x132A, 0x6194, 0x1327, 0x6196, 0x1324, + 0x6198, 0x2110, 0x6199, 0x1323, 0x619A, 0x1328, 0x619F, 0x38D9, 0x61A4, + 0x0E00, 0x61A7, 0x0C8C, 0x61A8, 0x38DA, 0x61A9, 0x071C, 0x61AB, 0x132B, + 0x61AC, 0x1326, 0x61AE, 0x132C, 0x61B2, 0x0751, 0x61B6, 0x0531, 0x61BA, + 0x1334, 0x61BE, 0x05F4, 0x61C2, 0x38DB, 0x61C3, 0x1332, 0x61C6, 0x1333, + 0x61C7, 0x0819, 0x61C8, 0x1331, 0x61C9, 0x132F, 0x61CA, 0x132E, 0x61CB, + 0x1335, 0x61CC, 0x132D, 0x61CD, 0x1337, 0x61D0, 0x057B, 0x61DF, 0x38DC, + 0x61E3, 0x1339, 0x61E6, 0x1338, 0x61F2, 0x0BC4, 0x61F4, 0x133C, 0x61F6, + 0x133A, 0x61F7, 0x1330, 0x61F8, 0x0752, 0x61FA, 0x133B, 0x61FC, 0x133F, + 0x61FD, 0x133E, 0x61FE, 0x1340, 0x61FF, 0x133D, 0x6200, 0x1341, 0x6208, + 0x1342, 0x6209, 0x1343, 0x620A, 0x0E3A, 0x620C, 0x1345, 0x620D, 0x1344, + 0x620E, 0x0949, 0x6210, 0x0A52, 0x6211, 0x0566, 0x6212, 0x057C, 0x6213, + 0x2111, 0x6214, 0x1346, 0x6215, 0x38DD, 0x6216, 0x0483, 0x621A, 0x0A70, + 0x621B, 0x1347, 0x621D, 0x1A64, 0x621E, 0x1348, 0x621F, 0x0737, 0x6221, + 0x1349, 0x6226, 0x0A93, 0x6229, 0x38DE, 0x622A, 0x134A, 0x622E, 0x134B, + 0x622F, 0x0654, 0x6230, 0x134C, 0x6232, 0x134D, 0x6233, 0x134E, 0x6234, + 0x0B37, 0x6236, 0x35BD, 0x6238, 0x0781, 0x623B, 0x0EED, 0x623E, 0x344E, + 0x623F, 0x0E6A, 0x6240, 0x0974, 0x6241, 0x134F, 0x6243, 0x38DF, 0x6246, + 0x38E0, 0x6247, 0x0A94, 0x6248, 0x1B1A, 0x6249, 0x0D76, 0x624B, 0x0916, + 0x624C, 0x38E1, 0x624D, 0x083D, 0x624E, 0x1350, 0x6251, 0x38E2, 0x6253, + 0x0B27, 0x6255, 0x0DF7, 0x6256, 0x38E3, 0x6258, 0x0B51, 0x625B, 0x1353, + 0x625E, 0x1351, 0x6260, 0x1354, 0x6263, 0x1352, 0x6268, 0x1355, 0x626E, + 0x0E01, 0x6271, 0x047B, 0x6276, 0x0DD0, 0x6279, 0x0D77, 0x627C, 0x1356, + 0x627E, 0x1359, 0x627F, 0x099D, 0x6280, 0x0655, 0x6282, 0x1357, 0x6283, + 0x135E, 0x6284, 0x099E, 0x6285, 0x35C5, 0x6289, 0x1358, 0x628A, 0x0CFA, + 0x6291, 0x0F48, 0x6292, 0x135A, 0x6293, 0x135B, 0x6294, 0x135F, 0x6295, + 0x0C64, 0x6296, 0x135C, 0x6297, 0x07C5, 0x6298, 0x0A82, 0x629B, 0x136D, + 0x629C, 0x0D48, 0x629E, 0x0B52, 0x62A6, 0x2112, 0x62AB, 0x0D78, 0x62AC, + 0x13B2, 0x62B1, 0x0E4A, 0x62B5, 0x0C0D, 0x62B9, 0x0EA3, 0x62BB, 0x1362, + 0x62BC, 0x0521, 0x62BD, 0x0BA8, 0x62C2, 0x136B, 0x62C4, 0x38E4, 0x62C5, + 0x0B72, 0x62C6, 0x1365, 0x62C7, 0x136C, 0x62C8, 0x1367, 0x62C9, 0x136E, + 0x62CA, 0x136A, 0x62CC, 0x1369, 0x62CD, 0x0D25, 0x62CF, 0x1363, 0x62D0, + 0x057D, 0x62D1, 0x1361, 0x62D2, 0x068B, 0x62D3, 0x0B53, 0x62D4, 0x135D, + 0x62D7, 0x1360, 0x62D8, 0x07C6, 0x62D9, 0x0A7F, 0x62DB, 0x099F, 0x62DC, + 0x1368, 0x62DD, 0x0D08, 0x62E0, 0x068C, 0x62E1, 0x05A6, 0x62EC, 0x05C5, + 0x62ED, 0x09E7, 0x62EE, 0x1370, 0x62EF, 0x1375, 0x62F1, 0x1371, 0x62F3, + 0x0753, 0x62F5, 0x1376, 0x62F6, 0x0870, 0x62F7, 0x07FB, 0x62FC, 0x38E5, + 0x62FE, 0x0930, 0x62FF, 0x1364, 0x6301, 0x08CB, 0x6302, 0x1373, 0x6307, + 0x08A6, 0x6308, 0x1374, 0x6309, 0x0488, 0x630A, 0x38E6, 0x630C, 0x136F, + 0x630D, 0x38E7, 0x6311, 0x0BC5, 0x6318, 0x38E8, 0x6319, 0x068D, 0x631B, + 0x3737, 0x631F, 0x06AC, 0x6327, 0x1372, 0x6328, 0x046B, 0x632B, 0x0833, + 0x632F, 0x09FC, 0x6339, 0x38E9, 0x633A, 0x0C0E, 0x633D, 0x0D68, 0x633E, + 0x1378, 0x633F, 0x0AE0, 0x6342, 0x38EA, 0x6343, 0x38EB, 0x6349, 0x0B0A, + 0x634C, 0x0879, 0x634D, 0x1379, 0x634F, 0x137B, 0x6350, 0x1377, 0x6355, + 0x0E31, 0x6357, 0x0BD9, 0x635C, 0x0ADE, 0x6365, 0x38EC, 0x6367, 0x0E4B, + 0x6368, 0x08FA, 0x6369, 0x1387, 0x636B, 0x1386, 0x636E, 0x0A3E, 0x6372, + 0x0754, 0x6374, 0x38ED, 0x6376, 0x1380, 0x6377, 0x09A1, 0x637A, 0x0CC0, + 0x637B, 0x0CE7, 0x637D, 0x38EE, 0x6380, 0x137E, 0x6383, 0x0ADF, 0x6384, + 0x38EF, 0x6387, 0x38F0, 0x6388, 0x0924, 0x6389, 0x1383, 0x638C, 0x09A0, + 0x638E, 0x137D, 0x638F, 0x1382, 0x6390, 0x38F1, 0x6392, 0x0D09, 0x6396, + 0x137C, 0x6398, 0x06F7, 0x639B, 0x05BB, 0x639E, 0x38F2, 0x639F, 0x1384, + 0x63A0, 0x0F73, 0x63A1, 0x083E, 0x63A2, 0x0B73, 0x63A3, 0x1381, 0x63A5, + 0x0A80, 0x63A7, 0x07C7, 0x63A8, 0x0A2A, 0x63A9, 0x0508, 0x63AA, 0x0ABE, + 0x63AB, 0x137F, 0x63AC, 0x065F, 0x63B2, 0x071D, 0x63B4, 0x0BEB, 0x63B5, + 0x1385, 0x63BB, 0x0AE1, 0x63BE, 0x1388, 0x63C0, 0x138A, 0x63C3, 0x0B17, + 0x63C4, 0x1390, 0x63C6, 0x138B, 0x63C9, 0x138D, 0x63CF, 0x0DB3, 0x63D0, + 0x0C0F, 0x63D1, 0x38F3, 0x63D2, 0x138E, 0x63D6, 0x0F16, 0x63DA, 0x0F32, + 0x63DB, 0x05F5, 0x63DC, 0x38F4, 0x63E1, 0x0472, 0x63E3, 0x138C, 0x63E9, + 0x1389, 0x63ED, 0x341C, 0x63EE, 0x0634, 0x63F4, 0x0509, 0x63F5, 0x2113, + 0x63F6, 0x138F, 0x63F7, 0x3644, 0x63FA, 0x0F33, 0x6406, 0x1393, 0x6409, + 0x38F5, 0x640D, 0x0B1B, 0x640F, 0x139A, 0x6410, 0x38F6, 0x6413, 0x1394, + 0x6414, 0x1E2C, 0x6416, 0x1391, 0x6417, 0x1398, 0x641C, 0x137A, 0x6422, + 0x38F7, 0x6426, 0x1395, 0x6428, 0x1399, 0x642C, 0x0D56, 0x642D, 0x0C65, + 0x6434, 0x1392, 0x6436, 0x1396, 0x643A, 0x071E, 0x643E, 0x0861, 0x6442, + 0x0A81, 0x644E, 0x139E, 0x6451, 0x1E43, 0x6454, 0x38F8, 0x6458, 0x0C20, + 0x645B, 0x38F9, 0x6460, 0x2114, 0x6467, 0x139B, 0x6469, 0x0E8E, 0x646D, + 0x38FA, 0x646F, 0x139C, 0x6476, 0x139D, 0x6478, 0x0EDA, 0x647A, 0x0A46, + 0x647B, 0x38FB, 0x6483, 0x0738, 0x6488, 0x13A4, 0x6492, 0x0883, 0x6493, + 0x13A1, 0x6495, 0x13A0, 0x649A, 0x0CE8, 0x649D, 0x2115, 0x649E, 0x0C8D, + 0x64A4, 0x0C2B, 0x64A5, 0x13A2, 0x64A9, 0x13A3, 0x64AB, 0x0DE1, 0x64AD, + 0x0CFB, 0x64AE, 0x0871, 0x64B0, 0x0A95, 0x64B2, 0x0E7E, 0x64B9, 0x05A7, + 0x64BB, 0x13AA, 0x64BC, 0x13A5, 0x64BE, 0x38FC, 0x64BF, 0x38FD, 0x64C1, + 0x0F34, 0x64C2, 0x13AC, 0x64C5, 0x13A8, 0x64C7, 0x13A9, 0x64CA, 0x341D, + 0x64CD, 0x0AE2, 0x64CE, 0x2116, 0x64D2, 0x13A7, 0x64D4, 0x1366, 0x64D8, + 0x13AB, 0x64DA, 0x13A6, 0x64E0, 0x13B0, 0x64E1, 0x13B1, 0x64E2, 0x0C21, + 0x64E3, 0x13B3, 0x64E5, 0x38FE, 0x64E6, 0x0872, 0x64E7, 0x13AE, 0x64EC, + 0x0656, 0x64EF, 0x13B4, 0x64F1, 0x13AD, 0x64F2, 0x13B8, 0x64F4, 0x13B7, + 0x64F6, 0x13B6, 0x64F7, 0x38FF, 0x64FA, 0x13B9, 0x64FB, 0x3900, 0x64FD, + 0x13BB, 0x64FE, 0x09D9, 0x6500, 0x13BA, 0x6504, 0x3901, 0x6505, 0x13BE, + 0x6516, 0x3902, 0x6518, 0x13BC, 0x6519, 0x3903, 0x651C, 0x13BD, 0x651D, + 0x1397, 0x6522, 0x1E97, 0x6523, 0x13C0, 0x6524, 0x13BF, 0x652A, 0x139F, + 0x652B, 0x13C1, 0x652C, 0x13B5, 0x652F, 0x08A7, 0x6534, 0x13C2, 0x6535, + 0x13C3, 0x6536, 0x13C5, 0x6537, 0x13C4, 0x6538, 0x13C6, 0x6539, 0x057E, + 0x653B, 0x07C8, 0x653E, 0x0E4C, 0x653F, 0x0A53, 0x6545, 0x0782, 0x6547, + 0x3904, 0x6548, 0x13C8, 0x654D, 0x13CB, 0x654E, 0x2117, 0x654F, 0x0DC4, + 0x6551, 0x0679, 0x6555, 0x13CA, 0x6556, 0x13C9, 0x6557, 0x0D0A, 0x6558, + 0x13CC, 0x6559, 0x06AD, 0x655D, 0x13CE, 0x655E, 0x13CD, 0x6562, 0x05F6, + 0x6563, 0x0884, 0x6566, 0x0CB0, 0x6567, 0x3905, 0x656C, 0x071F, 0x6570, + 0x0A3A, 0x6572, 0x13CF, 0x6574, 0x0A54, 0x6575, 0x0C22, 0x6577, 0x0DD1, + 0x6578, 0x13D0, 0x6581, 0x3906, 0x6582, 0x13D1, 0x6583, 0x13D2, 0x6585, + 0x3907, 0x6587, 0x0E08, 0x6588, 0x120C, 0x6589, 0x0A6A, 0x658C, 0x0DBE, + 0x658E, 0x0848, 0x6590, 0x0D79, 0x6591, 0x0D57, 0x6597, 0x0C47, 0x6599, + 0x0F89, 0x659B, 0x13D4, 0x659C, 0x08FC, 0x659F, 0x13D5, 0x65A1, 0x047A, + 0x65A4, 0x06CC, 0x65A5, 0x0A71, 0x65A7, 0x0DD2, 0x65AB, 0x13D6, 0x65AC, + 0x0890, 0x65AD, 0x0B85, 0x65AF, 0x08A9, 0x65B0, 0x09FD, 0x65B7, 0x13D7, + 0x65B9, 0x0E4D, 0x65BC, 0x0519, 0x65BD, 0x08AA, 0x65C1, 0x13DA, 0x65C2, + 0x3908, 0x65C3, 0x13D8, 0x65C4, 0x13DB, 0x65C5, 0x0F81, 0x65C6, 0x13D9, + 0x65CB, 0x0A9F, 0x65CC, 0x13DC, 0x65CF, 0x0B12, 0x65D2, 0x13DD, 0x65D7, + 0x0636, 0x65D9, 0x13DF, 0x65DB, 0x13DE, 0x65E0, 0x13E0, 0x65E1, 0x13E1, + 0x65E2, 0x0637, 0x65E3, 0x3585, 0x65E5, 0x0CD4, 0x65E6, 0x0B74, 0x65E7, + 0x0686, 0x65E8, 0x08AB, 0x65E9, 0x0AE3, 0x65EC, 0x0966, 0x65ED, 0x0474, + 0x65F0, 0x3909, 0x65F1, 0x13E2, 0x65F2, 0x390A, 0x65FA, 0x0522, 0x65FB, + 0x13E6, 0x6600, 0x2118, 0x6602, 0x07C9, 0x6603, 0x13E5, 0x6606, 0x081B, + 0x6607, 0x09A2, 0x6609, 0x211A, 0x660A, 0x13E4, 0x660C, 0x09A3, 0x660E, + 0x0ECC, 0x660F, 0x081A, 0x6613, 0x049B, 0x6614, 0x0A72, 0x6615, 0x2119, + 0x661C, 0x13EB, 0x661E, 0x211C, 0x661F, 0x0A55, 0x6620, 0x04E9, 0x6624, + 0x211D, 0x6625, 0x095F, 0x6627, 0x0E94, 0x6628, 0x0862, 0x662C, 0x390B, + 0x662D, 0x09A4, 0x662E, 0x211B, 0x662F, 0x0A4B, 0x6631, 0x20AE, 0x6634, + 0x13EA, 0x6635, 0x13E8, 0x6636, 0x13E9, 0x663B, 0x1E00, 0x663C, 0x0BA9, + 0x663F, 0x1409, 0x6641, 0x13EF, 0x6642, 0x08CC, 0x6643, 0x07CA, 0x6644, + 0x13ED, 0x6649, 0x13EE, 0x664B, 0x09FE, 0x664C, 0x390C, 0x664F, 0x13EC, + 0x6652, 0x087D, 0x6657, 0x211F, 0x6659, 0x2120, 0x665B, 0x390D, 0x665C, + 0x390E, 0x665D, 0x13F1, 0x665E, 0x13F0, 0x665F, 0x13F5, 0x6661, 0x390F, + 0x6662, 0x13F6, 0x6663, 0x373A, 0x6664, 0x13F2, 0x6665, 0x211E, 0x6666, + 0x0580, 0x6667, 0x13F3, 0x6668, 0x13F4, 0x6669, 0x0D69, 0x666B, 0x3910, + 0x666E, 0x0DD3, 0x666F, 0x0720, 0x6670, 0x13F7, 0x6673, 0x2122, 0x6674, + 0x0A56, 0x6676, 0x09A5, 0x6677, 0x3911, 0x667A, 0x0B90, 0x6681, 0x06BF, + 0x6683, 0x13F8, 0x6684, 0x13FC, 0x6687, 0x054B, 0x6688, 0x13F9, 0x6689, + 0x13FB, 0x668E, 0x13FA, 0x6691, 0x0975, 0x6696, 0x0B86, 0x6697, 0x0489, + 0x6698, 0x13FD, 0x6699, 0x2123, 0x669D, 0x13FE, 0x66A0, 0x2124, 0x66A2, + 0x0BC6, 0x66A4, 0x3912, 0x66A6, 0x0FB9, 0x66AB, 0x0891, 0x66AE, 0x0E3B, + 0x66B2, 0x2125, 0x66B4, 0x0E6B, 0x66B8, 0x1405, 0x66B9, 0x1400, 0x66BC, + 0x1403, 0x66BE, 0x1402, 0x66BF, 0x2126, 0x66C1, 0x13FF, 0x66C4, 0x1404, + 0x66C6, 0x3455, 0x66C7, 0x0CB6, 0x66C8, 0x3913, 0x66C9, 0x1401, 0x66D6, + 0x1406, 0x66D9, 0x0976, 0x66DA, 0x1407, 0x66DC, 0x0F35, 0x66DD, 0x0D2E, + 0x66E0, 0x1408, 0x66E6, 0x140A, 0x66E9, 0x140B, 0x66EC, 0x3914, 0x66F0, + 0x140C, 0x66F2, 0x06C2, 0x66F3, 0x04EA, 0x66F4, 0x07CB, 0x66F5, 0x140D, + 0x66F7, 0x140E, 0x66F8, 0x097B, 0x66F9, 0x0AE4, 0x66FA, 0x2127, 0x66FB, + 0x20B1, 0x66FC, 0x10ED, 0x66FD, 0x0AC0, 0x66FE, 0x0ABF, 0x66FF, 0x0B38, + 0x6700, 0x0837, 0x6703, 0x104B, 0x6705, 0x3915, 0x6708, 0x0744, 0x6709, + 0x0F17, 0x670B, 0x0E4E, 0x670D, 0x0DF0, 0x670E, 0x2128, 0x670F, 0x140F, + 0x6713, 0x3916, 0x6714, 0x0863, 0x6715, 0x0BDB, 0x6716, 0x1410, 0x6717, + 0x0FD5, 0x671B, 0x0E6C, 0x671D, 0x0BC7, 0x671E, 0x1411, 0x671F, 0x0638, + 0x6726, 0x1412, 0x6727, 0x1413, 0x6728, 0x0EE6, 0x672A, 0x0EB0, 0x672B, + 0x0EA4, 0x672C, 0x0E8A, 0x672D, 0x0873, 0x672E, 0x1415, 0x6731, 0x0917, + 0x6733, 0x3917, 0x6734, 0x0E7F, 0x6736, 0x1417, 0x6737, 0x141A, 0x6738, + 0x1419, 0x673A, 0x0635, 0x673D, 0x067A, 0x673F, 0x1416, 0x6741, 0x1418, + 0x6743, 0x35B7, 0x6746, 0x141B, 0x6748, 0x3918, 0x6749, 0x0A3F, 0x674C, + 0x3919, 0x674E, 0x0F65, 0x674F, 0x048D, 0x6750, 0x0850, 0x6751, 0x0B1C, + 0x6753, 0x0909, 0x6756, 0x09DB, 0x6759, 0x141E, 0x675C, 0x0C48, 0x675E, + 0x141C, 0x675F, 0x0B0B, 0x6760, 0x141D, 0x6761, 0x09DA, 0x6762, 0x0EE9, + 0x6763, 0x141F, 0x6764, 0x1420, 0x6765, 0x0F52, 0x6766, 0x212A, 0x676A, + 0x1425, 0x676D, 0x07CC, 0x676E, 0x3571, 0x676F, 0x0D0B, 0x6770, 0x1422, + 0x6771, 0x0C66, 0x6772, 0x13E3, 0x6773, 0x13E7, 0x6775, 0x0669, 0x6776, + 0x391A, 0x6777, 0x0CFD, 0x677B, 0x391B, 0x677C, 0x1424, 0x677E, 0x09A6, + 0x677F, 0x0D58, 0x6785, 0x142A, 0x6787, 0x0D8E, 0x6789, 0x1421, 0x678B, + 0x1427, 0x678C, 0x1426, 0x6790, 0x0A73, 0x6795, 0x0E9B, 0x6797, 0x0F9B, + 0x679A, 0x0E95, 0x679C, 0x054C, 0x679D, 0x08AC, 0x67A0, 0x0FEE, 0x67A1, + 0x1429, 0x67A2, 0x0A3B, 0x67A6, 0x1428, 0x67A9, 0x1423, 0x67AF, 0x0783, + 0x67B0, 0x391C, 0x67B2, 0x391D, 0x67B3, 0x142F, 0x67B4, 0x142D, 0x67B6, + 0x054D, 0x67B7, 0x142B, 0x67B8, 0x1431, 0x67B9, 0x1437, 0x67BB, 0x212B, + 0x67C0, 0x212D, 0x67C1, 0x0B28, 0x67C4, 0x0E11, 0x67C6, 0x1439, 0x67CA, + 0x0D94, 0x67CE, 0x1438, 0x67CF, 0x0D26, 0x67D0, 0x0E6D, 0x67D1, 0x05F7, + 0x67D3, 0x0A9B, 0x67D4, 0x094A, 0x67D7, 0x391F, 0x67D8, 0x0BEF, 0x67D9, + 0x3920, 0x67DA, 0x0F18, 0x67DD, 0x1434, 0x67DE, 0x1433, 0x67E2, 0x1435, + 0x67E4, 0x1432, 0x67E7, 0x143A, 0x67E9, 0x1430, 0x67EC, 0x142E, 0x67EE, + 0x1436, 0x67EF, 0x142C, 0x67F0, 0x3921, 0x67F1, 0x0BAA, 0x67F3, 0x0F04, + 0x67F4, 0x08F2, 0x67F5, 0x0864, 0x67F9, 0x391E, 0x67FB, 0x082A, 0x67FE, + 0x0E9D, 0x67FF, 0x059F, 0x6801, 0x212E, 0x6802, 0x0BEA, 0x6803, 0x0CA2, + 0x6804, 0x04EB, 0x6805, 0x1E07, 0x6813, 0x0A96, 0x6816, 0x0A58, 0x6817, + 0x0700, 0x681E, 0x143C, 0x6821, 0x07CD, 0x6822, 0x05DA, 0x6829, 0x143E, + 0x682A, 0x05D2, 0x682B, 0x1444, 0x682C, 0x3922, 0x6830, 0x3923, 0x6831, + 0x3924, 0x6832, 0x1441, 0x6834, 0x0A97, 0x6838, 0x05A9, 0x6839, 0x081C, + 0x683C, 0x05A8, 0x683D, 0x083F, 0x6840, 0x143F, 0x6841, 0x073B, 0x6842, + 0x0721, 0x6843, 0x0C67, 0x6844, 0x212F, 0x6846, 0x143D, 0x6848, 0x048A, + 0x684D, 0x1440, 0x684E, 0x1442, 0x6850, 0x06C5, 0x6851, 0x0702, 0x6852, + 0x212C, 0x6853, 0x05F8, 0x6854, 0x0665, 0x6859, 0x1445, 0x685B, 0x3925, + 0x685C, 0x0869, 0x685D, 0x0E9F, 0x685F, 0x0885, 0x6863, 0x1446, 0x6867, + 0x0DA2, 0x6872, 0x3926, 0x6874, 0x1452, 0x6875, 0x3927, 0x6876, 0x0533, + 0x6877, 0x1447, 0x687A, 0x3928, 0x687E, 0x1458, 0x687F, 0x1448, 0x6881, + 0x0F8A, 0x6883, 0x144F, 0x6884, 0x3929, 0x6885, 0x0D15, 0x688D, 0x1457, + 0x688E, 0x1E9C, 0x688F, 0x144A, 0x6893, 0x0478, 0x6894, 0x144C, 0x6897, + 0x07CE, 0x689B, 0x144E, 0x689D, 0x144D, 0x689F, 0x1449, 0x68A0, 0x1454, + 0x68A2, 0x09A7, 0x68A5, 0x392A, 0x68A6, 0x11BE, 0x68A7, 0x079C, 0x68A8, + 0x0F66, 0x68AD, 0x144B, 0x68AF, 0x0C10, 0x68B0, 0x0581, 0x68B1, 0x081D, + 0x68B2, 0x392B, 0x68B3, 0x1443, 0x68B5, 0x1453, 0x68B6, 0x05BF, 0x68B9, + 0x1451, 0x68BA, 0x1455, 0x68BC, 0x0C68, 0x68C4, 0x063A, 0x68C6, 0x1473, + 0x68C8, 0x20AF, 0x68C9, 0x0ED5, 0x68CA, 0x145A, 0x68CB, 0x0639, 0x68CD, + 0x1461, 0x68CF, 0x2130, 0x68D0, 0x392C, 0x68D2, 0x0E6E, 0x68D4, 0x1462, + 0x68D5, 0x1464, 0x68D6, 0x392D, 0x68D7, 0x1468, 0x68D8, 0x145C, 0x68DA, + 0x0B68, 0x68DF, 0x0C69, 0x68E0, 0x146C, 0x68E1, 0x145F, 0x68E3, 0x1469, + 0x68E7, 0x1463, 0x68E8, 0x392E, 0x68ED, 0x392F, 0x68EE, 0x09FF, 0x68EF, + 0x146D, 0x68F0, 0x3930, 0x68F1, 0x3931, 0x68F2, 0x0A57, 0x68F9, 0x146B, + 0x68FA, 0x05F9, 0x68FC, 0x3932, 0x6900, 0x0FF6, 0x6901, 0x1459, 0x6904, + 0x1467, 0x6905, 0x049C, 0x6908, 0x145B, 0x690B, 0x0EC6, 0x690C, 0x1460, + 0x690D, 0x09E8, 0x690E, 0x0BE3, 0x690F, 0x1456, 0x6911, 0x3933, 0x6912, + 0x1466, 0x6913, 0x3934, 0x6919, 0x0A40, 0x691A, 0x1470, 0x691B, 0x05CF, + 0x691C, 0x0755, 0x6921, 0x1472, 0x6922, 0x145D, 0x6923, 0x1471, 0x6925, + 0x146A, 0x6926, 0x145E, 0x6928, 0x146E, 0x692A, 0x146F, 0x6930, 0x1480, + 0x6934, 0x0CA6, 0x6935, 0x3935, 0x6936, 0x1465, 0x6939, 0x147C, 0x693B, + 0x3936, 0x693D, 0x147E, 0x693F, 0x0BF4, 0x694A, 0x0F36, 0x6953, 0x0DE8, + 0x6954, 0x1479, 0x6955, 0x0B2A, 0x6957, 0x3937, 0x6959, 0x147F, 0x695A, + 0x0AC1, 0x695C, 0x1476, 0x695D, 0x1483, 0x695E, 0x1482, 0x6960, 0x0CC7, + 0x6961, 0x1481, 0x6962, 0x0CC2, 0x6963, 0x3938, 0x6968, 0x2132, 0x696A, + 0x1485, 0x696B, 0x1478, 0x696D, 0x06C0, 0x696E, 0x147B, 0x696F, 0x0967, + 0x6972, 0x3939, 0x6973, 0x0D16, 0x6974, 0x147D, 0x6975, 0x06C3, 0x6977, + 0x1475, 0x6978, 0x1477, 0x6979, 0x1474, 0x697C, 0x0FD6, 0x697D, 0x05B8, + 0x697E, 0x147A, 0x697F, 0x393A, 0x6980, 0x393B, 0x6981, 0x1484, 0x6982, + 0x0593, 0x698A, 0x0857, 0x698E, 0x04FF, 0x6991, 0x1495, 0x6994, 0x0FD7, + 0x6995, 0x1498, 0x6998, 0x2134, 0x699B, 0x0A00, 0x699C, 0x1497, 0x69A0, + 0x1496, 0x69A6, 0x393C, 0x69A7, 0x1493, 0x69AD, 0x393D, 0x69AE, 0x1487, + 0x69B1, 0x14A4, 0x69B2, 0x1486, 0x69B4, 0x1499, 0x69B7, 0x393E, 0x69BB, + 0x1491, 0x69BE, 0x148C, 0x69BF, 0x1489, 0x69C1, 0x148A, 0x69C3, 0x1492, + 0x69C7, 0x1D33, 0x69CA, 0x148F, 0x69CB, 0x07CF, 0x69CC, 0x0BE4, 0x69CD, + 0x0AE6, 0x69CE, 0x148D, 0x69D0, 0x1488, 0x69D3, 0x148B, 0x69D6, 0x393F, + 0x69D7, 0x3940, 0x69D8, 0x0F37, 0x69D9, 0x0E98, 0x69DD, 0x1490, 0x69DE, + 0x149A, 0x69E2, 0x2135, 0x69E7, 0x14A2, 0x69E8, 0x149B, 0x69EA, 0x356F, + 0x69EB, 0x14A8, 0x69ED, 0x14A6, 0x69F2, 0x14A1, 0x69F6, 0x373F, 0x69F9, + 0x14A0, 0x69FB, 0x0BEC, 0x69FD, 0x0AE7, 0x69FF, 0x149E, 0x6A01, 0x3941, + 0x6A02, 0x149C, 0x6A05, 0x14A3, 0x6A0A, 0x14A9, 0x6A0B, 0x0D89, 0x6A0C, + 0x14AF, 0x6A0F, 0x3942, 0x6A12, 0x14AA, 0x6A13, 0x14AD, 0x6A14, 0x14A7, + 0x6A15, 0x3943, 0x6A17, 0x0BB2, 0x6A19, 0x0DAA, 0x6A1B, 0x149D, 0x6A1E, + 0x14A5, 0x6A1F, 0x09A8, 0x6A21, 0x0EDB, 0x6A22, 0x14B9, 0x6A23, 0x14AC, + 0x6A28, 0x3944, 0x6A29, 0x0756, 0x6A2A, 0x0523, 0x6A2B, 0x05BD, 0x6A2E, + 0x1494, 0x6A30, 0x2136, 0x6A34, 0x3945, 0x6A35, 0x09A9, 0x6A36, 0x14B1, + 0x6A38, 0x14B8, 0x6A39, 0x0925, 0x6A3A, 0x05D0, 0x6A3D, 0x0B6C, 0x6A3E, + 0x3946, 0x6A44, 0x14AE, 0x6A45, 0x3947, 0x6A46, 0x2138, 0x6A47, 0x14B3, + 0x6A48, 0x14B7, 0x6A4B, 0x06AE, 0x6A50, 0x3948, 0x6A51, 0x3949, 0x6A54, + 0x3C34, 0x6A56, 0x394A, 0x6A58, 0x0666, 0x6A59, 0x14B5, 0x6A5B, 0x394B, + 0x6A5F, 0x063B, 0x6A61, 0x0CA3, 0x6A62, 0x14B4, 0x6A66, 0x14B6, 0x6A6B, + 0x2137, 0x6A72, 0x14B0, 0x6A73, 0x2139, 0x6A78, 0x14B2, 0x6A7E, 0x213A, + 0x6A7F, 0x05BE, 0x6A80, 0x0B87, 0x6A83, 0x394C, 0x6A84, 0x14BD, 0x6A89, + 0x394D, 0x6A8D, 0x14BB, 0x6A8E, 0x079D, 0x6A90, 0x14BA, 0x6A91, 0x394E, + 0x6A97, 0x14C0, 0x6A9C, 0x143B, 0x6A9D, 0x394F, 0x6A9E, 0x3950, 0x6A9F, + 0x3951, 0x6AA0, 0x14BC, 0x6AA2, 0x14BE, 0x6AA3, 0x14BF, 0x6AAA, 0x14CB, + 0x6AAC, 0x14C7, 0x6AAE, 0x1450, 0x6AB3, 0x14C6, 0x6AB8, 0x14C5, 0x6ABB, + 0x14C2, 0x6AC1, 0x14AB, 0x6AC2, 0x14C4, 0x6AC3, 0x14C3, 0x6AD1, 0x14C9, + 0x6AD3, 0x0FCC, 0x6ADA, 0x14CC, 0x6ADB, 0x06F3, 0x6ADC, 0x3952, 0x6ADE, + 0x14C8, 0x6ADF, 0x14CA, 0x6AE2, 0x213B, 0x6AE4, 0x213C, 0x6AE7, 0x3953, + 0x6AE8, 0x0D3B, 0x6AEA, 0x14CD, 0x6AEC, 0x3954, 0x6AFA, 0x14D1, 0x6AFB, + 0x14CE, 0x6B04, 0x0F5D, 0x6B05, 0x14CF, 0x6B0A, 0x149F, 0x6B12, 0x14D2, + 0x6B16, 0x14D3, 0x6B1D, 0x04D7, 0x6B1E, 0x3955, 0x6B1F, 0x14D5, 0x6B20, + 0x073D, 0x6B21, 0x08CD, 0x6B23, 0x06CD, 0x6B24, 0x3956, 0x6B27, 0x0524, + 0x6B32, 0x0F49, 0x6B35, 0x3957, 0x6B37, 0x14D7, 0x6B38, 0x14D6, 0x6B39, + 0x14D9, 0x6B3A, 0x0657, 0x6B3D, 0x06CE, 0x6B3E, 0x05FA, 0x6B43, 0x14DC, + 0x6B46, 0x3958, 0x6B47, 0x14DB, 0x6B49, 0x14DD, 0x6B4C, 0x054E, 0x6B4E, + 0x0B75, 0x6B50, 0x14DE, 0x6B53, 0x05FB, 0x6B54, 0x14E0, 0x6B56, 0x3959, + 0x6B59, 0x14DF, 0x6B5B, 0x14E1, 0x6B5F, 0x14E2, 0x6B60, 0x395A, 0x6B61, + 0x14E3, 0x6B62, 0x08AD, 0x6B63, 0x0A59, 0x6B64, 0x0811, 0x6B65, 0x344A, + 0x6B66, 0x0DE2, 0x6B69, 0x0E32, 0x6B6A, 0x0FEA, 0x6B6F, 0x08C3, 0x6B72, + 0x35D9, 0x6B73, 0x0840, 0x6B74, 0x0FBA, 0x6B77, 0x3456, 0x6B78, 0x14E4, + 0x6B79, 0x14E5, 0x6B7B, 0x08AE, 0x6B7F, 0x14E6, 0x6B80, 0x14E7, 0x6B82, + 0x395B, 0x6B83, 0x14E9, 0x6B84, 0x14E8, 0x6B86, 0x0E86, 0x6B89, 0x0968, + 0x6B8A, 0x0918, 0x6B8B, 0x0892, 0x6B8D, 0x14EA, 0x6B95, 0x14EC, 0x6B96, + 0x09E9, 0x6B98, 0x14EB, 0x6B9E, 0x14ED, 0x6BA4, 0x14EE, 0x6BAA, 0x14EF, + 0x6BAB, 0x14F0, 0x6BAF, 0x14F1, 0x6BB1, 0x14F3, 0x6BB2, 0x14F2, 0x6BB3, + 0x14F4, 0x6BB4, 0x0525, 0x6BB5, 0x0B88, 0x6BB7, 0x14F5, 0x6BBA, 0x0874, + 0x6BBB, 0x05AA, 0x6BBC, 0x14F6, 0x6BBE, 0x395C, 0x6BBF, 0x0C3C, 0x6BC0, + 0x119D, 0x6BC5, 0x063D, 0x6BC6, 0x14F7, 0x6BCB, 0x14F8, 0x6BCC, 0x3744, + 0x6BCD, 0x0E3C, 0x6BCE, 0x0E96, 0x6BCF, 0x344C, 0x6BD2, 0x0C9F, 0x6BD3, + 0x14F9, 0x6BD4, 0x0D7A, 0x6BD6, 0x213D, 0x6BD8, 0x0D8F, 0x6BDB, 0x0EDF, + 0x6BDF, 0x14FA, 0x6BE1, 0x395D, 0x6BEB, 0x14FC, 0x6BEC, 0x14FB, 0x6BEF, + 0x14FE, 0x6BF1, 0x395E, 0x6BF3, 0x14FD, 0x6C08, 0x1500, 0x6C0F, 0x08AF, + 0x6C10, 0x395F, 0x6C11, 0x0EBD, 0x6C13, 0x1501, 0x6C14, 0x1502, 0x6C17, + 0x063E, 0x6C1B, 0x1503, 0x6C23, 0x1505, 0x6C24, 0x1504, 0x6C33, 0x3960, + 0x6C34, 0x0A2B, 0x6C35, 0x3961, 0x6C37, 0x0DAB, 0x6C38, 0x04EC, 0x6C3A, + 0x3962, 0x6C3E, 0x0D59, 0x6C3F, 0x213E, 0x6C40, 0x0C11, 0x6C41, 0x094B, + 0x6C42, 0x067B, 0x6C4E, 0x0D5A, 0x6C50, 0x08DA, 0x6C55, 0x1507, 0x6C57, + 0x05FC, 0x6C59, 0x3963, 0x6C5A, 0x051A, 0x6C5C, 0x213F, 0x6C5D, 0x0CCA, + 0x6C5E, 0x1506, 0x6C5F, 0x07D0, 0x6C60, 0x0B91, 0x6C62, 0x1508, 0x6C68, + 0x1510, 0x6C6A, 0x1509, 0x6C6F, 0x2141, 0x6C70, 0x0B21, 0x6C72, 0x067C, + 0x6C73, 0x1511, 0x6C76, 0x3964, 0x6C7A, 0x073E, 0x6C7B, 0x3965, 0x6C7D, + 0x063F, 0x6C7E, 0x150F, 0x6C81, 0x150D, 0x6C82, 0x150A, 0x6C83, 0x0F4A, + 0x6C85, 0x3966, 0x6C86, 0x2140, 0x6C88, 0x0BDC, 0x6C8C, 0x0CB1, 0x6C8D, + 0x150B, 0x6C90, 0x1513, 0x6C92, 0x1512, 0x6C93, 0x06F9, 0x6C95, 0x3967, + 0x6C96, 0x052D, 0x6C99, 0x082B, 0x6C9A, 0x150C, 0x6C9B, 0x150E, 0x6C9C, + 0x3968, 0x6CA1, 0x0E85, 0x6CA2, 0x0B54, 0x6CAA, 0x3749, 0x6CAB, 0x0EA5, + 0x6CAE, 0x151B, 0x6CB1, 0x151C, 0x6CB3, 0x054F, 0x6CB8, 0x0DF8, 0x6CB9, + 0x0F09, 0x6CBA, 0x151E, 0x6CBB, 0x08CF, 0x6CBC, 0x09AA, 0x6CBD, 0x1517, + 0x6CBE, 0x151D, 0x6CBF, 0x050A, 0x6CC1, 0x06AF, 0x6CC4, 0x1514, 0x6CC5, + 0x1519, 0x6CC9, 0x0A98, 0x6CCA, 0x0D27, 0x6CCC, 0x0D7B, 0x6CD0, 0x3969, + 0x6CD3, 0x1516, 0x6CD4, 0x396A, 0x6CD5, 0x0E4F, 0x6CD6, 0x396B, 0x6CD7, + 0x1518, 0x6CD9, 0x1521, 0x6CDA, 0x2142, 0x6CDB, 0x151F, 0x6CDD, 0x151A, + 0x6CE0, 0x396C, 0x6CE1, 0x0E50, 0x6CE2, 0x0CFE, 0x6CE3, 0x067D, 0x6CE5, + 0x0C1F, 0x6CE8, 0x0BAB, 0x6CEA, 0x1522, 0x6CEB, 0x396D, 0x6CEC, 0x396E, + 0x6CEE, 0x396F, 0x6CEF, 0x1520, 0x6CF0, 0x0B39, 0x6CF1, 0x1515, 0x6CF3, + 0x04ED, 0x6D01, 0x3C35, 0x6D04, 0x2143, 0x6D0A, 0x3970, 0x6D0B, 0x0F38, + 0x6D0C, 0x152D, 0x6D0E, 0x3971, 0x6D11, 0x3972, 0x6D12, 0x152C, 0x6D17, + 0x0A9A, 0x6D19, 0x1529, 0x6D1B, 0x0F56, 0x6D1E, 0x0C8E, 0x6D1F, 0x1523, + 0x6D25, 0x0BE1, 0x6D29, 0x04EE, 0x6D2A, 0x07D1, 0x6D2B, 0x1526, 0x6D2E, + 0x3973, 0x6D32, 0x0931, 0x6D33, 0x152B, 0x6D35, 0x152A, 0x6D36, 0x1525, + 0x6D38, 0x1528, 0x6D3B, 0x05C6, 0x6D3D, 0x1527, 0x6D3E, 0x0CFF, 0x6D41, + 0x0F76, 0x6D44, 0x09DC, 0x6D45, 0x0A99, 0x6D57, 0x3974, 0x6D59, 0x1533, + 0x6D5A, 0x1531, 0x6D5C, 0x0DBF, 0x6D5E, 0x3975, 0x6D63, 0x152E, 0x6D64, + 0x1530, 0x6D65, 0x3976, 0x6D66, 0x04DC, 0x6D69, 0x07D2, 0x6D6A, 0x0FD8, + 0x6D6C, 0x059B, 0x6D6E, 0x0DD4, 0x6D6F, 0x2145, 0x6D74, 0x0F4B, 0x6D77, + 0x0582, 0x6D78, 0x0A01, 0x6D79, 0x1532, 0x6D82, 0x3977, 0x6D85, 0x1537, + 0x6D87, 0x2144, 0x6D88, 0x09AB, 0x6D89, 0x342A, 0x6D8C, 0x0F1A, 0x6D8E, + 0x1534, 0x6D93, 0x152F, 0x6D95, 0x1535, 0x6D96, 0x2146, 0x6D99, 0x0FA6, + 0x6D9B, 0x0C6D, 0x6D9C, 0x0C9A, 0x6DAC, 0x2147, 0x6DAF, 0x0594, 0x6DB2, + 0x04F7, 0x6DB5, 0x153B, 0x6DB8, 0x153E, 0x6DBC, 0x0F8B, 0x6DBF, 0x3978, + 0x6DC0, 0x0F4E, 0x6DC4, 0x3979, 0x6DC5, 0x1545, 0x6DC6, 0x153F, 0x6DC7, + 0x153C, 0x6DCA, 0x397A, 0x6DCB, 0x0F9C, 0x6DCC, 0x1542, 0x6DCF, 0x2148, + 0x6DD0, 0x3C36, 0x6DD1, 0x0954, 0x6DD2, 0x1544, 0x6DD5, 0x1549, 0x6DD6, + 0x397B, 0x6DD8, 0x0C6B, 0x6DD9, 0x1547, 0x6DDA, 0x3453, 0x6DDE, 0x1541, + 0x6DE1, 0x0B76, 0x6DE4, 0x1548, 0x6DE6, 0x153D, 0x6DE8, 0x1543, 0x6DE9, + 0x397C, 0x6DEA, 0x154A, 0x6DEB, 0x04C0, 0x6DEC, 0x1540, 0x6DEE, 0x154B, + 0x6DF1, 0x0A02, 0x6DF2, 0x214A, 0x6DF3, 0x0969, 0x6DF5, 0x0DF5, 0x6DF7, + 0x081E, 0x6DF8, 0x2149, 0x6DF9, 0x1538, 0x6DFA, 0x1546, 0x6DFB, 0x0C34, + 0x6DFC, 0x214B, 0x6E05, 0x0A5A, 0x6E07, 0x05C7, 0x6E08, 0x0841, 0x6E09, + 0x09AC, 0x6E0A, 0x153A, 0x6E0B, 0x094C, 0x6E13, 0x0722, 0x6E15, 0x1539, + 0x6E17, 0x3746, 0x6E19, 0x154F, 0x6E1A, 0x0977, 0x6E1B, 0x076E, 0x6E1D, + 0x155E, 0x6E1F, 0x1558, 0x6E20, 0x068E, 0x6E21, 0x0C49, 0x6E22, 0x397D, + 0x6E23, 0x1553, 0x6E24, 0x155C, 0x6E25, 0x0473, 0x6E26, 0x04D4, 0x6E27, + 0x214E, 0x6E29, 0x0539, 0x6E2B, 0x1555, 0x6E2C, 0x0B0C, 0x6E2D, 0x154C, + 0x6E2E, 0x154E, 0x6E2F, 0x07D3, 0x6E34, 0x3412, 0x6E38, 0x155F, 0x6E39, + 0x214C, 0x6E3A, 0x155A, 0x6E3C, 0x214F, 0x6E3E, 0x1552, 0x6E42, 0x3C37, + 0x6E43, 0x1559, 0x6E4A, 0x0EB7, 0x6E4D, 0x1557, 0x6E4E, 0x155B, 0x6E51, + 0x397E, 0x6E56, 0x0784, 0x6E58, 0x09AD, 0x6E5B, 0x0B77, 0x6E5C, 0x214D, + 0x6E5F, 0x1551, 0x6E67, 0x0F19, 0x6E6B, 0x1554, 0x6E6E, 0x154D, 0x6E6F, + 0x0C6C, 0x6E72, 0x1550, 0x6E76, 0x1556, 0x6E7E, 0x0FF7, 0x6E7F, 0x08EA, + 0x6E80, 0x0EAC, 0x6E82, 0x1560, 0x6E8C, 0x0D42, 0x6E8F, 0x156C, 0x6E90, + 0x076F, 0x6E96, 0x096A, 0x6E98, 0x1562, 0x6E9C, 0x0F77, 0x6E9D, 0x07D4, + 0x6E9F, 0x156F, 0x6EA2, 0x04B2, 0x6EA5, 0x156D, 0x6EAA, 0x1561, 0x6EAB, + 0x340C, 0x6EAF, 0x1567, 0x6EB2, 0x1569, 0x6EB6, 0x0F39, 0x6EB7, 0x1564, + 0x6EBA, 0x0C28, 0x6EBD, 0x1566, 0x6EBF, 0x2150, 0x6EC2, 0x156E, 0x6EC4, + 0x1568, 0x6EC5, 0x0ED3, 0x6EC7, 0x397F, 0x6EC9, 0x1563, 0x6ECA, 0x3980, + 0x6ECB, 0x08CE, 0x6ECC, 0x157B, 0x6ECE, 0x3981, 0x6ED1, 0x05C8, 0x6ED3, + 0x1565, 0x6ED4, 0x156A, 0x6ED5, 0x156B, 0x6ED9, 0x3C38, 0x6EDD, 0x0B4C, + 0x6EDE, 0x0B3A, 0x6EE6, 0x3C24, 0x6EEC, 0x1573, 0x6EEF, 0x1579, 0x6EF2, + 0x1577, 0x6EF4, 0x0C23, 0x6EF7, 0x157E, 0x6EF8, 0x1574, 0x6EFD, 0x3982, + 0x6EFE, 0x1575, 0x6EFF, 0x155D, 0x6F01, 0x0693, 0x6F02, 0x0DAC, 0x6F06, + 0x08EB, 0x6F09, 0x0809, 0x6F0F, 0x0FD9, 0x6F11, 0x1571, 0x6F13, 0x157D, + 0x6F14, 0x050B, 0x6F15, 0x0AE8, 0x6F1A, 0x3983, 0x6F20, 0x0D2F, 0x6F22, + 0x05FD, 0x6F23, 0x0FC2, 0x6F2A, 0x3984, 0x6F2B, 0x0EAD, 0x6F2C, 0x0BEE, + 0x6F2F, 0x3985, 0x6F31, 0x1578, 0x6F32, 0x157A, 0x6F33, 0x3986, 0x6F38, + 0x0AB4, 0x6F3E, 0x157C, 0x6F3F, 0x1576, 0x6F41, 0x1570, 0x6F45, 0x05FF, + 0x6F51, 0x1E60, 0x6F54, 0x073F, 0x6F58, 0x158A, 0x6F5A, 0x3987, 0x6F5B, + 0x1585, 0x6F5C, 0x0A9C, 0x6F5E, 0x3988, 0x6F5F, 0x05C1, 0x6F62, 0x3989, + 0x6F64, 0x096B, 0x6F66, 0x158E, 0x6F6D, 0x1587, 0x6F6E, 0x0BC8, 0x6F6F, + 0x1584, 0x6F70, 0x0BF5, 0x6F74, 0x15A7, 0x6F78, 0x1581, 0x6F7A, 0x1580, + 0x6F7C, 0x1589, 0x6F7D, 0x398A, 0x6F80, 0x1583, 0x6F81, 0x1582, 0x6F82, + 0x1588, 0x6F84, 0x0A45, 0x6F86, 0x157F, 0x6F88, 0x2151, 0x6F8B, 0x398B, + 0x6F8D, 0x398C, 0x6F8E, 0x158B, 0x6F91, 0x158C, 0x6F92, 0x398D, 0x6F94, + 0x398E, 0x6F97, 0x05FE, 0x6F98, 0x363C, 0x6F9A, 0x398F, 0x6FA1, 0x1591, + 0x6FA3, 0x1590, 0x6FA4, 0x1592, 0x6FA7, 0x3990, 0x6FA8, 0x3991, 0x6FAA, + 0x1595, 0x6FB1, 0x0C3D, 0x6FB3, 0x158F, 0x6FB5, 0x2152, 0x6FB6, 0x3992, + 0x6FB9, 0x1593, 0x6FC0, 0x0739, 0x6FC1, 0x0B59, 0x6FC2, 0x158D, 0x6FC3, + 0x0CF1, 0x6FC6, 0x1594, 0x6FD4, 0x1599, 0x6FD5, 0x1597, 0x6FD8, 0x159A, + 0x6FDA, 0x3993, 0x6FDB, 0x159D, 0x6FDE, 0x3994, 0x6FDF, 0x1596, 0x6FE0, + 0x07FC, 0x6FE1, 0x0CDE, 0x6FE4, 0x1536, 0x6FEB, 0x0F5E, 0x6FEC, 0x1598, + 0x6FEE, 0x159C, 0x6FEF, 0x0B55, 0x6FF1, 0x159B, 0x6FF3, 0x1586, 0x6FF5, + 0x2153, 0x6FF6, 0x1BA4, 0x6FF9, 0x3995, 0x6FFA, 0x15A0, 0x6FFE, 0x15A4, + 0x7001, 0x15A2, 0x7005, 0x2154, 0x7006, 0x1E50, 0x7007, 0x2155, 0x7009, + 0x159E, 0x700B, 0x159F, 0x700F, 0x15A3, 0x7011, 0x15A1, 0x7015, 0x0DC0, + 0x7018, 0x15A9, 0x701A, 0x15A6, 0x701B, 0x15A5, 0x701D, 0x15A8, 0x701E, + 0x0CAC, 0x701F, 0x15AA, 0x7026, 0x0BB3, 0x7027, 0x0B4D, 0x7028, 0x2156, + 0x702C, 0x0A49, 0x7030, 0x15AB, 0x7032, 0x15AD, 0x7039, 0x3996, 0x703C, + 0x3997, 0x703E, 0x15AC, 0x704A, 0x3998, 0x704C, 0x1572, 0x7051, 0x15AE, + 0x7054, 0x3999, 0x7058, 0x0CBF, 0x705D, 0x399A, 0x705E, 0x399B, 0x7063, + 0x15AF, 0x7064, 0x399C, 0x706B, 0x0550, 0x706C, 0x399D, 0x706F, 0x0C6E, + 0x7070, 0x0583, 0x7078, 0x067E, 0x707C, 0x090A, 0x707D, 0x0842, 0x707E, + 0x399E, 0x7081, 0x399F, 0x7085, 0x2157, 0x7089, 0x0FCD, 0x708A, 0x0A2C, + 0x708E, 0x050C, 0x7092, 0x15B1, 0x7095, 0x39A0, 0x7099, 0x15B0, 0x70AB, + 0x2158, 0x70AC, 0x15B4, 0x70AD, 0x0B78, 0x70AE, 0x15B7, 0x70AF, 0x15B2, + 0x70B3, 0x15B6, 0x70B7, 0x39A1, 0x70B8, 0x15B5, 0x70B9, 0x0C3A, 0x70BA, + 0x049D, 0x70BB, 0x20AD, 0x70C8, 0x0FBD, 0x70CB, 0x15B9, 0x70CF, 0x04CA, + 0x70D3, 0x39A2, 0x70D4, 0x39A3, 0x70D8, 0x39A4, 0x70D9, 0x15BB, 0x70DC, + 0x39A5, 0x70DD, 0x15BA, 0x70DF, 0x15B8, 0x70F1, 0x15B3, 0x70F9, 0x0E51, + 0x70FD, 0x15BD, 0x7104, 0x215A, 0x7107, 0x39A6, 0x7109, 0x15BC, 0x710F, + 0x2159, 0x7114, 0x050D, 0x7119, 0x15BF, 0x711A, 0x0E02, 0x711C, 0x15BE, + 0x7120, 0x39A7, 0x7121, 0x0EC1, 0x7126, 0x09AF, 0x7130, 0x1DDC, 0x7131, + 0x39A8, 0x7136, 0x0AB5, 0x713C, 0x09AE, 0x7146, 0x215C, 0x7147, 0x215D, + 0x7149, 0x0FC3, 0x714A, 0x39A9, 0x714C, 0x15C5, 0x714E, 0x0A9D, 0x7152, + 0x39AA, 0x7155, 0x15C1, 0x7156, 0x15C6, 0x7159, 0x050E, 0x715C, 0x215B, + 0x7160, 0x39AB, 0x7162, 0x15C4, 0x7164, 0x0D17, 0x7165, 0x15C0, 0x7166, + 0x15C3, 0x7167, 0x09B0, 0x7169, 0x0D65, 0x716C, 0x15C7, 0x716E, 0x08FD, + 0x7179, 0x39AC, 0x717D, 0x0A9E, 0x7184, 0x15CA, 0x7188, 0x15C2, 0x718A, + 0x06FD, 0x718F, 0x15C8, 0x7192, 0x39AD, 0x7194, 0x0F3A, 0x7195, 0x15CB, + 0x7199, 0x205D, 0x719F, 0x0959, 0x71A8, 0x15CC, 0x71AC, 0x15CD, 0x71B1, + 0x0CE4, 0x71B3, 0x39AE, 0x71B9, 0x15CF, 0x71BE, 0x15D0, 0x71C1, 0x215F, + 0x71C3, 0x0CE9, 0x71C8, 0x0C6F, 0x71C9, 0x15D2, 0x71CB, 0x39AF, 0x71CE, + 0x15D4, 0x71D0, 0x0F9D, 0x71D2, 0x15D1, 0x71D3, 0x39B0, 0x71D4, 0x15D3, + 0x71D5, 0x050F, 0x71D6, 0x39B1, 0x71D7, 0x15CE, 0x71DF, 0x114E, 0x71E0, + 0x15D5, 0x71E5, 0x0AE9, 0x71E6, 0x0886, 0x71E7, 0x15D7, 0x71EC, 0x15D6, + 0x71ED, 0x09EA, 0x71EE, 0x10EE, 0x71F5, 0x15D8, 0x71F9, 0x15DA, 0x71FB, + 0x15C9, 0x71FC, 0x15D9, 0x71FE, 0x2160, 0x71FF, 0x15DB, 0x7200, 0x39B2, + 0x7206, 0x0D30, 0x720D, 0x15DC, 0x7210, 0x15DD, 0x721B, 0x15DE, 0x721D, + 0x39B3, 0x7228, 0x15DF, 0x722A, 0x0BFA, 0x722B, 0x39B4, 0x722C, 0x15E1, + 0x722D, 0x15E0, 0x7230, 0x15E2, 0x7232, 0x15E3, 0x7235, 0x090B, 0x7236, + 0x0DD5, 0x7238, 0x39B5, 0x723A, 0x0EF8, 0x723B, 0x15E4, 0x723C, 0x15E5, + 0x723D, 0x0AD8, 0x723E, 0x08D0, 0x723F, 0x15E6, 0x7240, 0x15E7, 0x7241, + 0x39B6, 0x7246, 0x15E8, 0x7247, 0x0E22, 0x7248, 0x0D5B, 0x724B, 0x15E9, + 0x724C, 0x0D0D, 0x7252, 0x0BC9, 0x7253, 0x39B7, 0x7255, 0x39B8, 0x7256, + 0x39B9, 0x7258, 0x15EA, 0x7259, 0x0567, 0x725B, 0x0687, 0x725C, 0x39BA, + 0x725D, 0x0ED2, 0x725F, 0x0EC2, 0x7261, 0x0534, 0x7262, 0x0FDA, 0x7267, + 0x0E80, 0x7269, 0x0DFA, 0x7272, 0x0A5B, 0x7274, 0x15EB, 0x7279, 0x0C9B, + 0x727D, 0x0757, 0x727E, 0x15EC, 0x7280, 0x0844, 0x7281, 0x15EE, 0x7282, + 0x15ED, 0x7287, 0x15EF, 0x728D, 0x39BB, 0x7292, 0x15F0, 0x7296, 0x15F1, + 0x72A0, 0x0658, 0x72A2, 0x15F2, 0x72A7, 0x15F3, 0x72AC, 0x0758, 0x72AD, + 0x39BC, 0x72AF, 0x0D5C, 0x72B1, 0x2161, 0x72B2, 0x15F5, 0x72B4, 0x39BD, + 0x72B6, 0x09DD, 0x72B9, 0x15F4, 0x72BE, 0x2162, 0x72C0, 0x342B, 0x72C2, + 0x06B0, 0x72C3, 0x15F6, 0x72C4, 0x15F8, 0x72C6, 0x15F7, 0x72C7, 0x39BE, + 0x72CE, 0x15F9, 0x72D0, 0x0785, 0x72D2, 0x15FA, 0x72D7, 0x06E1, 0x72D9, + 0x0AC2, 0x72DB, 0x080F, 0x72E0, 0x15FC, 0x72E1, 0x15FD, 0x72E2, 0x15FB, + 0x72E9, 0x0919, 0x72EC, 0x0CA0, 0x72ED, 0x06B1, 0x72F7, 0x15FF, 0x72F8, + 0x0B6A, 0x72F9, 0x15FE, 0x72FB, 0x39BF, 0x72FC, 0x0FDB, 0x72FD, 0x0D18, + 0x7304, 0x39C0, 0x7305, 0x39C1, 0x730A, 0x1602, 0x7316, 0x1604, 0x7317, + 0x1601, 0x731B, 0x0EE0, 0x731C, 0x1603, 0x731D, 0x1605, 0x731F, 0x0F8C, + 0x7324, 0x2163, 0x7325, 0x1609, 0x7328, 0x39C2, 0x7329, 0x1608, 0x732A, + 0x0BB4, 0x732B, 0x0CE3, 0x732E, 0x0759, 0x732F, 0x1607, 0x7331, 0x39C3, + 0x7334, 0x1606, 0x7336, 0x0F1B, 0x7337, 0x0F1C, 0x733E, 0x160A, 0x733F, + 0x0510, 0x7343, 0x39C4, 0x7344, 0x0808, 0x7345, 0x08B0, 0x734E, 0x160B, + 0x734F, 0x160C, 0x7357, 0x160E, 0x7363, 0x094D, 0x7368, 0x1610, 0x736A, + 0x160F, 0x736C, 0x39C5, 0x7370, 0x1611, 0x7372, 0x05AB, 0x7375, 0x1613, + 0x7377, 0x2165, 0x7378, 0x1612, 0x737A, 0x1615, 0x737B, 0x1614, 0x737C, + 0x39C6, 0x7383, 0x39C7, 0x7384, 0x0770, 0x7385, 0x39C8, 0x7386, 0x39C9, + 0x7387, 0x0F70, 0x7389, 0x06C4, 0x738B, 0x0526, 0x7395, 0x39CA, 0x7396, + 0x06E2, 0x739E, 0x39CB, 0x739F, 0x39CC, 0x73A0, 0x39CD, 0x73A6, 0x39CE, + 0x73A8, 0x3C3F, 0x73A9, 0x061D, 0x73AB, 0x39CF, 0x73B2, 0x0FB0, 0x73B3, + 0x1617, 0x73B5, 0x39D0, 0x73B7, 0x39D1, 0x73BA, 0x35EA, 0x73BB, 0x1619, + 0x73BC, 0x39D2, 0x73BD, 0x2166, 0x73C0, 0x161A, 0x73C2, 0x0551, 0x73C8, + 0x1616, 0x73C9, 0x2167, 0x73CA, 0x0887, 0x73CD, 0x0BDD, 0x73CE, 0x1618, + 0x73CF, 0x39D3, 0x73D2, 0x216A, 0x73D6, 0x2168, 0x73D9, 0x39D4, 0x73DE, + 0x161D, 0x73E0, 0x091A, 0x73E3, 0x2169, 0x73E4, 0x3C39, 0x73E5, 0x161B, + 0x73E9, 0x39D5, 0x73EA, 0x0714, 0x73ED, 0x0D5D, 0x73EE, 0x161C, 0x73F1, + 0x1637, 0x73F4, 0x39D6, 0x73F5, 0x216C, 0x73F8, 0x1622, 0x73FD, 0x39D7, + 0x73FE, 0x0771, 0x7403, 0x067F, 0x7404, 0x39D8, 0x7405, 0x161F, 0x7406, + 0x0F67, 0x7407, 0x216B, 0x7409, 0x0F78, 0x740A, 0x39D9, 0x741A, 0x39DA, + 0x741B, 0x39DB, 0x7421, 0x3C3A, 0x7422, 0x0B56, 0x7424, 0x39DC, 0x7425, + 0x1621, 0x7426, 0x216D, 0x7428, 0x39DD, 0x7429, 0x216F, 0x742A, 0x216E, + 0x742C, 0x39DE, 0x742E, 0x2170, 0x742F, 0x39DF, 0x7430, 0x39E0, 0x7431, + 0x39E1, 0x7432, 0x1623, 0x7433, 0x0F9E, 0x7434, 0x06CF, 0x7435, 0x0D90, + 0x7436, 0x0D00, 0x7439, 0x39E2, 0x743A, 0x1624, 0x743F, 0x1626, 0x7441, + 0x1629, 0x7444, 0x39E3, 0x7447, 0x39E4, 0x744B, 0x39E5, 0x744D, 0x39E6, + 0x7451, 0x39E7, 0x7455, 0x1625, 0x7457, 0x39E8, 0x7459, 0x1628, 0x745A, + 0x079E, 0x745B, 0x04EF, 0x745C, 0x162A, 0x745E, 0x0A36, 0x745F, 0x1627, + 0x7460, 0x0FA4, 0x7462, 0x2171, 0x7463, 0x162D, 0x7464, 0x1D35, 0x7466, + 0x39E9, 0x7469, 0x162B, 0x746A, 0x162E, 0x746B, 0x39EA, 0x746F, 0x1620, + 0x7470, 0x162C, 0x7471, 0x39EB, 0x7473, 0x082C, 0x7476, 0x162F, 0x747E, + 0x1630, 0x7480, 0x39EC, 0x7483, 0x0F68, 0x7485, 0x39ED, 0x7486, 0x39EE, + 0x7487, 0x39EF, 0x7489, 0x2172, 0x748B, 0x1631, 0x7490, 0x39F0, 0x7498, + 0x39F1, 0x749C, 0x39F2, 0x749E, 0x1632, 0x749F, 0x2173, 0x74A0, 0x39F3, + 0x74A2, 0x161E, 0x74A3, 0x39F4, 0x74A7, 0x1633, 0x74A8, 0x39F5, 0x74AB, + 0x39F6, 0x74B0, 0x0600, 0x74B5, 0x39F7, 0x74BD, 0x08D1, 0x74BF, 0x39F8, + 0x74C8, 0x39F9, 0x74CA, 0x1634, 0x74CF, 0x1635, 0x74D4, 0x1636, 0x74DA, + 0x39FA, 0x74DC, 0x04DD, 0x74DE, 0x39FB, 0x74E0, 0x1638, 0x74E2, 0x0DAD, + 0x74E3, 0x1639, 0x74E6, 0x05E0, 0x74E7, 0x163A, 0x74E9, 0x163B, 0x74EE, + 0x163C, 0x74EF, 0x3750, 0x74F0, 0x163E, 0x74F1, 0x163F, 0x74F2, 0x163D, + 0x74F6, 0x0DC5, 0x74F7, 0x1641, 0x74F8, 0x1640, 0x7501, 0x2174, 0x7503, + 0x1643, 0x7504, 0x1642, 0x7505, 0x1644, 0x750C, 0x1645, 0x750D, 0x1647, + 0x750E, 0x1646, 0x7511, 0x080B, 0x7513, 0x1649, 0x7515, 0x1648, 0x7518, + 0x0601, 0x751A, 0x0A19, 0x751C, 0x0C36, 0x751E, 0x164A, 0x751F, 0x0A5C, + 0x7522, 0x35DE, 0x7523, 0x0888, 0x7525, 0x051B, 0x7526, 0x164B, 0x7528, + 0x0F3B, 0x752B, 0x0E33, 0x752C, 0x164C, 0x752F, 0x20F2, 0x7530, 0x0C3E, + 0x7531, 0x0F1D, 0x7532, 0x07D5, 0x7533, 0x0A03, 0x7537, 0x0B89, 0x7538, + 0x10C9, 0x753A, 0x0BCA, 0x753B, 0x0568, 0x753C, 0x164D, 0x7544, 0x164E, + 0x7546, 0x1653, 0x7549, 0x1651, 0x754A, 0x1650, 0x754B, 0x13C7, 0x754C, + 0x0584, 0x754D, 0x164F, 0x754E, 0x39FC, 0x754F, 0x049E, 0x7551, 0x0D3E, + 0x7554, 0x0D5E, 0x7559, 0x0F79, 0x755A, 0x1654, 0x755B, 0x1652, 0x755C, + 0x0B9A, 0x755D, 0x0A4A, 0x7560, 0x0D3F, 0x7562, 0x0D9F, 0x7564, 0x1656, + 0x7565, 0x0F74, 0x7566, 0x0723, 0x7567, 0x1657, 0x7569, 0x1655, 0x756A, + 0x0D6A, 0x756B, 0x1658, 0x756C, 0x3C3B, 0x756D, 0x1659, 0x756F, 0x2175, + 0x7570, 0x049F, 0x7573, 0x09DE, 0x7574, 0x165E, 0x7575, 0x3751, 0x7576, + 0x165B, 0x7577, 0x0CC5, 0x7578, 0x165A, 0x7579, 0x39FD, 0x757F, 0x0640, + 0x7581, 0x39FE, 0x7582, 0x1661, 0x7586, 0x165C, 0x7587, 0x165D, 0x7589, + 0x1660, 0x758A, 0x165F, 0x758B, 0x0D97, 0x758E, 0x0AC4, 0x758F, 0x0AC3, + 0x7590, 0x39FF, 0x7591, 0x0659, 0x7592, 0x3A00, 0x7593, 0x3A01, 0x7594, + 0x1662, 0x759A, 0x1663, 0x759D, 0x1664, 0x75A3, 0x1666, 0x75A5, 0x1665, + 0x75AB, 0x04F8, 0x75B1, 0x166E, 0x75B2, 0x0D7C, 0x75B3, 0x1668, 0x75B4, + 0x3A02, 0x75B5, 0x166A, 0x75B8, 0x166C, 0x75B9, 0x0A04, 0x75BC, 0x166D, + 0x75BD, 0x166B, 0x75BE, 0x08EC, 0x75C2, 0x1667, 0x75C3, 0x1669, 0x75C5, + 0x0DB4, 0x75C7, 0x09B1, 0x75CA, 0x1670, 0x75CD, 0x166F, 0x75D2, 0x1671, + 0x75D4, 0x08D2, 0x75D5, 0x081F, 0x75D8, 0x0C71, 0x75D9, 0x1672, 0x75DB, + 0x0BE7, 0x75DE, 0x1674, 0x75E2, 0x0F69, 0x75E3, 0x1673, 0x75E4, 0x3A03, + 0x75E9, 0x0AEB, 0x75EC, 0x3752, 0x75F0, 0x1679, 0x75F2, 0x167B, 0x75F3, + 0x167C, 0x75F4, 0x0B92, 0x75F9, 0x3A04, 0x75FA, 0x167A, 0x75FC, 0x1677, + 0x75FE, 0x1675, 0x75FF, 0x1676, 0x7600, 0x3A05, 0x7601, 0x1678, 0x7609, + 0x167F, 0x760A, 0x3A06, 0x760B, 0x167D, 0x760D, 0x167E, 0x7615, 0x3A07, + 0x7616, 0x3A08, 0x7619, 0x3A09, 0x761E, 0x3A0A, 0x761F, 0x1680, 0x7620, + 0x1682, 0x7621, 0x1683, 0x7622, 0x1684, 0x7624, 0x1685, 0x7626, 0x1E2D, + 0x7627, 0x1681, 0x762D, 0x3A0B, 0x7630, 0x1687, 0x7634, 0x1686, 0x7635, + 0x3A0C, 0x763B, 0x1688, 0x7642, 0x0F8D, 0x7643, 0x3A0D, 0x7646, 0x168B, + 0x7647, 0x1689, 0x7648, 0x168A, 0x764B, 0x3A0E, 0x764C, 0x061E, 0x764E, + 0x3753, 0x7652, 0x0F0A, 0x7656, 0x0E1A, 0x7658, 0x168D, 0x765C, 0x168C, + 0x7661, 0x168E, 0x7662, 0x168F, 0x7665, 0x3A0F, 0x7667, 0x1693, 0x7668, + 0x1690, 0x7669, 0x1691, 0x766A, 0x1692, 0x766C, 0x1694, 0x766D, 0x3A10, + 0x766F, 0x3A11, 0x7670, 0x1695, 0x7671, 0x3A12, 0x7672, 0x1696, 0x7674, + 0x3A13, 0x7676, 0x1697, 0x7678, 0x1698, 0x767A, 0x0D43, 0x767B, 0x0C4A, + 0x767C, 0x1699, 0x767D, 0x0D28, 0x767E, 0x0DA6, 0x7680, 0x169A, 0x7682, + 0x2176, 0x7683, 0x169B, 0x7684, 0x0C24, 0x7686, 0x0585, 0x7687, 0x07D6, + 0x7688, 0x169C, 0x768B, 0x169D, 0x768E, 0x169E, 0x7690, 0x0877, 0x7693, + 0x16A0, 0x7696, 0x169F, 0x7699, 0x16A1, 0x769A, 0x16A2, 0x769B, 0x2179, + 0x769C, 0x2177, 0x769E, 0x2178, 0x76A4, 0x3A14, 0x76A5, 0x3A15, 0x76A6, + 0x217A, 0x76AE, 0x0D7D, 0x76B0, 0x16A3, 0x76B4, 0x16A4, 0x76B7, 0x1D1C, + 0x76B8, 0x16A5, 0x76B9, 0x16A6, 0x76BA, 0x16A7, 0x76BF, 0x087C, 0x76C2, + 0x16A8, 0x76C3, 0x0D0C, 0x76C5, 0x3A16, 0x76C6, 0x0E8D, 0x76C8, 0x04F0, + 0x76CA, 0x04F9, 0x76CC, 0x3A17, 0x76CD, 0x16A9, 0x76D2, 0x16AB, 0x76D6, + 0x16AA, 0x76D7, 0x0C6A, 0x76DB, 0x0A5D, 0x76DC, 0x14D8, 0x76DE, 0x16AC, + 0x76DF, 0x0ECD, 0x76E1, 0x16AD, 0x76E3, 0x0602, 0x76E4, 0x0D6B, 0x76E5, + 0x16AE, 0x76E7, 0x16AF, 0x76EA, 0x16B0, 0x76EC, 0x3A18, 0x76EE, 0x0EE8, + 0x76F2, 0x0EE1, 0x76F4, 0x0BDA, 0x76F8, 0x0AEC, 0x76FB, 0x16B2, 0x76FC, + 0x3A19, 0x76FE, 0x096C, 0x7701, 0x09B2, 0x7704, 0x16B5, 0x7707, 0x16B4, + 0x7708, 0x16B3, 0x7709, 0x0D91, 0x770B, 0x0603, 0x770C, 0x075D, 0x771B, + 0x16BB, 0x771E, 0x16B8, 0x771F, 0x0A05, 0x7720, 0x0EBE, 0x7724, 0x16B7, + 0x7725, 0x16B9, 0x7726, 0x16BA, 0x7729, 0x16B6, 0x7734, 0x3A1A, 0x7736, + 0x3A1B, 0x7737, 0x16BC, 0x7738, 0x16BD, 0x773A, 0x0BCB, 0x773C, 0x061F, + 0x7740, 0x0BA3, 0x7746, 0x217C, 0x7747, 0x16BE, 0x775A, 0x16BF, 0x775B, + 0x16C2, 0x775C, 0x3A1C, 0x775F, 0x3A1D, 0x7760, 0x3A1E, 0x7761, 0x0A2D, + 0x7762, 0x1EC5, 0x7763, 0x0C9C, 0x7765, 0x16C3, 0x7766, 0x0E81, 0x7768, + 0x16C0, 0x776A, 0x3755, 0x776B, 0x16C1, 0x7772, 0x3A1F, 0x7779, 0x16C6, + 0x777D, 0x3A20, 0x777E, 0x16C5, 0x777F, 0x16C4, 0x778B, 0x16C8, 0x778E, + 0x16C7, 0x7791, 0x16C9, 0x7795, 0x3A21, 0x779E, 0x16CB, 0x77A0, 0x16CA, + 0x77A5, 0x0E1D, 0x77A9, 0x3756, 0x77AA, 0x3A22, 0x77AC, 0x0960, 0x77AD, + 0x0F8E, 0x77B0, 0x16CC, 0x77B3, 0x0C8F, 0x77B6, 0x16CD, 0x77B9, 0x16CE, + 0x77BB, 0x16D2, 0x77BC, 0x16D0, 0x77BD, 0x16D1, 0x77BF, 0x16CF, 0x77C7, + 0x16D3, 0x77CD, 0x16D4, 0x77D7, 0x16D5, 0x77DA, 0x16D6, 0x77DB, 0x0EC3, + 0x77DC, 0x16D7, 0x77E2, 0x0EFC, 0x77E3, 0x16D8, 0x77E5, 0x0B8C, 0x77E6, + 0x3A23, 0x77E7, 0x0D20, 0x77E9, 0x06E3, 0x77ED, 0x0B79, 0x77EE, 0x16D9, + 0x77EF, 0x06B2, 0x77F0, 0x3A24, 0x77F3, 0x0A74, 0x77F4, 0x3A25, 0x77FC, + 0x16DA, 0x7802, 0x082D, 0x7806, 0x3A26, 0x780C, 0x16DB, 0x7812, 0x16DC, + 0x7814, 0x075A, 0x7815, 0x0845, 0x7820, 0x16DE, 0x7821, 0x217E, 0x7822, + 0x3A27, 0x7825, 0x0C50, 0x7826, 0x0846, 0x7827, 0x0668, 0x782D, 0x3A28, + 0x782E, 0x3A29, 0x7830, 0x3A2A, 0x7832, 0x0E52, 0x7834, 0x0D01, 0x7835, + 0x3A2B, 0x783A, 0x0C51, 0x783F, 0x07EE, 0x7845, 0x16E0, 0x784E, 0x217F, + 0x784F, 0x341E, 0x7851, 0x3C3C, 0x785D, 0x09B3, 0x7864, 0x2180, 0x7868, + 0x3A2C, 0x786B, 0x0F7A, 0x786C, 0x07D7, 0x786F, 0x075B, 0x7872, 0x0D37, + 0x7874, 0x16E2, 0x787A, 0x2181, 0x787C, 0x16E4, 0x7881, 0x079F, 0x7886, + 0x16E3, 0x7887, 0x0C12, 0x788C, 0x16E6, 0x788D, 0x0595, 0x788E, 0x16E1, + 0x7891, 0x0D7E, 0x7893, 0x04D2, 0x7895, 0x085C, 0x7897, 0x0FF8, 0x789A, + 0x16E5, 0x789E, 0x3A2D, 0x78A3, 0x16E7, 0x78A7, 0x0E1B, 0x78A9, 0x0A7D, + 0x78AA, 0x16E9, 0x78AF, 0x16EA, 0x78B5, 0x16E8, 0x78BA, 0x05AC, 0x78BC, + 0x16F0, 0x78BE, 0x16EF, 0x78C1, 0x08D3, 0x78C5, 0x16F1, 0x78C6, 0x16EC, + 0x78C8, 0x3A2E, 0x78CA, 0x16F2, 0x78CB, 0x16ED, 0x78CC, 0x3A2F, 0x78CE, + 0x3A30, 0x78D0, 0x0D6C, 0x78D1, 0x16EB, 0x78D4, 0x16EE, 0x78DA, 0x16F5, + 0x78E0, 0x3A32, 0x78E1, 0x3A33, 0x78E4, 0x3A31, 0x78E7, 0x16F4, 0x78E8, + 0x0E8F, 0x78EC, 0x16F3, 0x78EF, 0x04AF, 0x78F2, 0x3A34, 0x78F4, 0x16F7, + 0x78F7, 0x3A35, 0x78FB, 0x3A36, 0x78FD, 0x16F6, 0x7901, 0x09B4, 0x7907, + 0x16F8, 0x790E, 0x0AC5, 0x7911, 0x16FA, 0x7912, 0x16F9, 0x7919, 0x16FB, + 0x7926, 0x16DD, 0x792A, 0x16DF, 0x792B, 0x16FD, 0x792C, 0x16FC, 0x7930, + 0x2182, 0x7931, 0x3A37, 0x7934, 0x3A38, 0x793A, 0x08D4, 0x793B, 0x3A39, + 0x793C, 0x0FB1, 0x793D, 0x3A3A, 0x793E, 0x08FE, 0x7940, 0x16FE, 0x7941, + 0x070D, 0x7945, 0x3A3B, 0x7947, 0x065A, 0x7948, 0x0641, 0x7949, 0x08B1, + 0x7950, 0x0F1E, 0x7953, 0x1704, 0x7955, 0x1703, 0x7956, 0x0AC6, 0x7957, + 0x1700, 0x795A, 0x1702, 0x795B, 0x3A3C, 0x795C, 0x3A3D, 0x795D, 0x0955, + 0x795E, 0x0A06, 0x795F, 0x1701, 0x7960, 0x16FF, 0x7962, 0x0CE0, 0x7965, + 0x09B5, 0x7968, 0x0DAE, 0x796D, 0x0847, 0x7977, 0x0C72, 0x797A, 0x1705, + 0x797F, 0x1706, 0x7980, 0x171C, 0x7981, 0x06D0, 0x7984, 0x0FE3, 0x7985, + 0x0AB7, 0x798A, 0x1707, 0x798B, 0x3A3E, 0x798D, 0x0552, 0x798E, 0x0C13, + 0x798F, 0x0DF1, 0x7994, 0x2186, 0x7996, 0x3A3F, 0x7998, 0x3A40, 0x799B, + 0x2188, 0x799D, 0x1708, 0x79A6, 0x0694, 0x79A7, 0x1709, 0x79AA, 0x170B, + 0x79AE, 0x170C, 0x79B0, 0x0CDF, 0x79B1, 0x1E4E, 0x79B3, 0x170D, 0x79B8, + 0x3A41, 0x79B9, 0x170E, 0x79BA, 0x170F, 0x79BB, 0x3A42, 0x79BD, 0x06D1, + 0x79BE, 0x0553, 0x79BF, 0x0C9D, 0x79C0, 0x0932, 0x79C1, 0x08B2, 0x79C9, + 0x1710, 0x79CA, 0x3A43, 0x79CB, 0x0933, 0x79D1, 0x054A, 0x79D2, 0x0DB5, + 0x79D5, 0x1711, 0x79D8, 0x0D7F, 0x79DA, 0x3A44, 0x79DF, 0x0AC7, 0x79E1, + 0x1714, 0x79E3, 0x1715, 0x79E4, 0x0D1F, 0x79E6, 0x0A07, 0x79E7, 0x1712, + 0x79E9, 0x0B9F, 0x79EC, 0x1713, 0x79F0, 0x09B6, 0x79FB, 0x04A0, 0x7A00, + 0x0643, 0x7A03, 0x3A45, 0x7A05, 0x3633, 0x7A08, 0x1716, 0x7A09, 0x3A46, + 0x7A0B, 0x0C14, 0x7A0D, 0x1717, 0x7A0E, 0x0A6B, 0x7A11, 0x3A47, 0x7A14, + 0x0EB9, 0x7A17, 0x0D95, 0x7A18, 0x1718, 0x7A19, 0x1719, 0x7A1A, 0x0B93, + 0x7A1C, 0x0F8F, 0x7A1E, 0x3A48, 0x7A1F, 0x171B, 0x7A20, 0x171A, 0x7A2D, + 0x3A49, 0x7A2E, 0x091B, 0x7A31, 0x171D, 0x7A32, 0x04B4, 0x7A37, 0x1720, + 0x7A39, 0x3A4A, 0x7A3B, 0x171E, 0x7A3C, 0x0554, 0x7A3D, 0x0724, 0x7A3E, + 0x171F, 0x7A3F, 0x07D8, 0x7A40, 0x0804, 0x7A42, 0x0E36, 0x7A43, 0x1721, + 0x7A45, 0x3A4B, 0x7A46, 0x0E82, 0x7A49, 0x1723, 0x7A4C, 0x3A4C, 0x7A4D, + 0x0A75, 0x7A4E, 0x04F1, 0x7A4F, 0x053A, 0x7A50, 0x0470, 0x7A57, 0x1722, + 0x7A5D, 0x3A4D, 0x7A60, 0x3A4E, 0x7A61, 0x1724, 0x7A62, 0x1725, 0x7A63, + 0x09DF, 0x7A69, 0x1726, 0x7A6B, 0x05AD, 0x7A6D, 0x3A4F, 0x7A70, 0x1728, + 0x7A74, 0x0740, 0x7A76, 0x0680, 0x7A78, 0x3A50, 0x7A79, 0x1729, 0x7A7A, + 0x06ED, 0x7A7D, 0x172A, 0x7A7F, 0x0AA0, 0x7A81, 0x0CA5, 0x7A83, 0x0A84, + 0x7A84, 0x0865, 0x7A88, 0x172B, 0x7A92, 0x0BA0, 0x7A93, 0x0AED, 0x7A95, + 0x172D, 0x7A96, 0x172F, 0x7A97, 0x172C, 0x7A98, 0x172E, 0x7A9F, 0x06F8, + 0x7AA0, 0x3A51, 0x7AA3, 0x3A52, 0x7AA9, 0x1730, 0x7AAA, 0x06FC, 0x7AAE, + 0x0681, 0x7AAF, 0x0F3C, 0x7AB0, 0x1732, 0x7AB3, 0x3A53, 0x7AB6, 0x1733, + 0x7ABA, 0x04D0, 0x7ABB, 0x3A54, 0x7ABC, 0x3A55, 0x7ABF, 0x1736, 0x7AC3, + 0x05D4, 0x7AC4, 0x1735, 0x7AC5, 0x1734, 0x7AC6, 0x3A56, 0x7AC7, 0x1738, + 0x7AC8, 0x1731, 0x7ACA, 0x1739, 0x7ACB, 0x0F71, 0x7ACD, 0x173A, 0x7ACF, + 0x173B, 0x7AD1, 0x2189, 0x7AD2, 0x11C5, 0x7AD3, 0x173D, 0x7AD5, 0x173C, + 0x7AD9, 0x173E, 0x7ADA, 0x173F, 0x7ADC, 0x0F7D, 0x7ADD, 0x1740, 0x7ADF, + 0x1C08, 0x7AE0, 0x09B7, 0x7AE1, 0x1741, 0x7AE2, 0x1742, 0x7AE3, 0x0961, + 0x7AE5, 0x0C90, 0x7AE6, 0x1743, 0x7AE7, 0x218A, 0x7AEA, 0x0B66, 0x7AEB, + 0x218C, 0x7AED, 0x1744, 0x7AEF, 0x0B7A, 0x7AF0, 0x1745, 0x7AF6, 0x069D, + 0x7AF8, 0x1076, 0x7AF9, 0x0B9B, 0x7AFA, 0x08DF, 0x7AFF, 0x0604, 0x7B02, + 0x1746, 0x7B04, 0x1753, 0x7B06, 0x1749, 0x7B07, 0x3A57, 0x7B08, 0x0682, + 0x7B0A, 0x1748, 0x7B0B, 0x1755, 0x7B0F, 0x1747, 0x7B11, 0x09B8, 0x7B14, + 0x3A58, 0x7B18, 0x174B, 0x7B19, 0x174C, 0x7B1B, 0x0C25, 0x7B1E, 0x174D, + 0x7B20, 0x05BC, 0x7B25, 0x0A20, 0x7B26, 0x0DD6, 0x7B27, 0x3A59, 0x7B28, + 0x174F, 0x7B2C, 0x0B48, 0x7B31, 0x3A5A, 0x7B33, 0x174A, 0x7B35, 0x174E, + 0x7B36, 0x1750, 0x7B39, 0x086B, 0x7B45, 0x1757, 0x7B46, 0x0DA0, 0x7B47, + 0x3A5B, 0x7B48, 0x0D3A, 0x7B49, 0x0C73, 0x7B4B, 0x06D2, 0x7B4C, 0x1756, + 0x7B4D, 0x1754, 0x7B4E, 0x3A5C, 0x7B4F, 0x0D49, 0x7B50, 0x1751, 0x7B51, + 0x0B9C, 0x7B52, 0x0C75, 0x7B53, 0x375D, 0x7B54, 0x0C74, 0x7B56, 0x0866, + 0x7B5D, 0x1769, 0x7B60, 0x3A5D, 0x7B65, 0x1759, 0x7B67, 0x175B, 0x7B69, + 0x3A5E, 0x7B6C, 0x175E, 0x7B6D, 0x3A5F, 0x7B6E, 0x175F, 0x7B70, 0x175C, + 0x7B71, 0x175D, 0x7B72, 0x3A60, 0x7B74, 0x175A, 0x7B75, 0x1758, 0x7B7A, + 0x1752, 0x7B86, 0x0E1F, 0x7B87, 0x0555, 0x7B8B, 0x1766, 0x7B8D, 0x1763, + 0x7B8F, 0x1768, 0x7B91, 0x3A61, 0x7B92, 0x1767, 0x7B94, 0x0D29, 0x7B95, + 0x0EB3, 0x7B97, 0x0889, 0x7B98, 0x1761, 0x7B99, 0x176A, 0x7B9A, 0x1765, + 0x7B9C, 0x1764, 0x7B9D, 0x1760, 0x7B9E, 0x218D, 0x7B9F, 0x1762, 0x7BA1, + 0x0605, 0x7BAA, 0x0B7B, 0x7BAD, 0x0AA1, 0x7BAF, 0x3A62, 0x7BB1, 0x0D36, + 0x7BB4, 0x176F, 0x7BB8, 0x0D38, 0x7BC0, 0x0A85, 0x7BC1, 0x176C, 0x7BC4, + 0x0D63, 0x7BC6, 0x1770, 0x7BC7, 0x0E23, 0x7BC9, 0x0B99, 0x7BCB, 0x176B, + 0x7BCC, 0x176D, 0x7BCF, 0x176E, 0x7BD7, 0x3A63, 0x7BD9, 0x3A64, 0x7BDD, + 0x1771, 0x7BE0, 0x08F0, 0x7BE4, 0x0C9E, 0x7BE5, 0x1776, 0x7BE6, 0x1775, + 0x7BE9, 0x1772, 0x7BED, 0x0FDC, 0x7BF3, 0x177B, 0x7BF6, 0x177F, 0x7BF7, + 0x177C, 0x7C00, 0x1778, 0x7C07, 0x1779, 0x7C0B, 0x3A65, 0x7C0D, 0x177E, + 0x7C0F, 0x3A66, 0x7C11, 0x1773, 0x7C12, 0x10EA, 0x7C13, 0x177A, 0x7C14, + 0x1774, 0x7C17, 0x177D, 0x7C1E, 0x1E3B, 0x7C1F, 0x1783, 0x7C20, 0x3A67, + 0x7C21, 0x0606, 0x7C23, 0x1780, 0x7C26, 0x3A68, 0x7C27, 0x1781, 0x7C2A, + 0x1782, 0x7C2B, 0x1785, 0x7C31, 0x3A69, 0x7C36, 0x3A6A, 0x7C37, 0x1784, + 0x7C38, 0x0D8A, 0x7C3D, 0x1786, 0x7C3E, 0x0FC4, 0x7C3F, 0x0E3D, 0x7C40, + 0x178B, 0x7C43, 0x1788, 0x7C4C, 0x1787, 0x7C4D, 0x0A76, 0x7C4F, 0x178A, + 0x7C50, 0x178C, 0x7C51, 0x3A6B, 0x7C54, 0x1789, 0x7C56, 0x1790, 0x7C58, + 0x178D, 0x7C59, 0x3A6C, 0x7C5F, 0x178E, 0x7C60, 0x1777, 0x7C64, 0x178F, + 0x7C65, 0x1791, 0x7C67, 0x3A6D, 0x7C6C, 0x1792, 0x7C6E, 0x3A6E, 0x7C70, + 0x3A6F, 0x7C73, 0x0E16, 0x7C75, 0x1793, 0x7C7B, 0x370E, 0x7C7E, 0x0EEE, + 0x7C81, 0x06C6, 0x7C82, 0x06FF, 0x7C83, 0x1794, 0x7C89, 0x0E04, 0x7C8B, + 0x0A2E, 0x7C8D, 0x0EBC, 0x7C90, 0x1795, 0x7C92, 0x0F7B, 0x7C95, 0x0D2A, + 0x7C97, 0x0AC8, 0x7C98, 0x0CEA, 0x7C9B, 0x0957, 0x7C9F, 0x0484, 0x7CA1, + 0x179A, 0x7CA2, 0x1798, 0x7CA4, 0x1796, 0x7CA5, 0x05DD, 0x7CA7, 0x09B9, + 0x7CA8, 0x179B, 0x7CAB, 0x1799, 0x7CAD, 0x1797, 0x7CAE, 0x179F, 0x7CB1, + 0x179E, 0x7CB2, 0x179D, 0x7CB3, 0x179C, 0x7CB9, 0x17A0, 0x7CBC, 0x3A70, + 0x7CBD, 0x17A1, 0x7CBE, 0x0A5E, 0x7CBF, 0x3A71, 0x7CC0, 0x17A2, 0x7CC2, + 0x17A4, 0x7CC5, 0x17A3, 0x7CC8, 0x3A72, 0x7CC9, 0x3A73, 0x7CCA, 0x0786, + 0x7CCE, 0x0ABA, 0x7CD2, 0x17A6, 0x7CD6, 0x0C76, 0x7CD7, 0x3A74, 0x7CD8, + 0x17A5, 0x7CD9, 0x3A75, 0x7CDC, 0x17A7, 0x7CDD, 0x3A76, 0x7CDE, 0x0E05, + 0x7CDF, 0x0AEE, 0x7CE0, 0x07D9, 0x7CE2, 0x17A8, 0x7CE7, 0x0F90, 0x7CEB, + 0x3A77, 0x7CEF, 0x17AA, 0x7CF2, 0x17AB, 0x7CF4, 0x17AC, 0x7CF6, 0x17AD, + 0x7CF8, 0x08B3, 0x7CFA, 0x17AE, 0x7CFB, 0x0725, 0x7CFE, 0x0684, 0x7D00, + 0x0644, 0x7D02, 0x17B0, 0x7D04, 0x0EFF, 0x7D05, 0x07DA, 0x7D06, 0x17AF, + 0x7D07, 0x3A78, 0x7D08, 0x3A79, 0x7D09, 0x3A7A, 0x7D0A, 0x17B3, 0x7D0B, + 0x0EF2, 0x7D0D, 0x0CF2, 0x7D10, 0x0DA5, 0x7D13, 0x3A7B, 0x7D14, 0x096D, + 0x7D15, 0x17B2, 0x7D17, 0x08FF, 0x7D18, 0x07DB, 0x7D19, 0x08B4, 0x7D1A, + 0x0683, 0x7D1B, 0x0E06, 0x7D1C, 0x17B1, 0x7D1D, 0x3A7C, 0x7D20, 0x0AC9, + 0x7D21, 0x0E70, 0x7D22, 0x0867, 0x7D23, 0x3A7D, 0x7D2B, 0x08B5, 0x7D2C, + 0x0BF9, 0x7D2E, 0x17B6, 0x7D2F, 0x0FA7, 0x7D30, 0x0849, 0x7D32, 0x17B7, + 0x7D33, 0x0A08, 0x7D35, 0x17B9, 0x7D39, 0x09BA, 0x7D3A, 0x0820, 0x7D3F, + 0x17B8, 0x7D41, 0x3A7E, 0x7D42, 0x0934, 0x7D43, 0x0772, 0x7D44, 0x0ACA, + 0x7D45, 0x17B4, 0x7D46, 0x17BA, 0x7D48, 0x218F, 0x7D4B, 0x17B5, 0x7D4C, + 0x0726, 0x7D4E, 0x17BD, 0x7D4F, 0x17C1, 0x7D50, 0x0741, 0x7D53, 0x3A7F, + 0x7D56, 0x17BC, 0x7D59, 0x3A80, 0x7D5B, 0x17C5, 0x7D5C, 0x2190, 0x7D5D, + 0x3A81, 0x7D5E, 0x07DC, 0x7D61, 0x0F57, 0x7D62, 0x0480, 0x7D63, 0x17C2, + 0x7D66, 0x0685, 0x7D68, 0x17BF, 0x7D6E, 0x17C0, 0x7D71, 0x0C77, 0x7D72, + 0x17BE, 0x7D73, 0x17BB, 0x7D75, 0x0586, 0x7D76, 0x0A88, 0x7D79, 0x075C, + 0x7D7A, 0x3A82, 0x7D7D, 0x17C7, 0x7D86, 0x3A83, 0x7D89, 0x17C4, 0x7D8B, + 0x3A84, 0x7D8C, 0x3A85, 0x7D8F, 0x17C6, 0x7D93, 0x17C3, 0x7D99, 0x0727, + 0x7D9A, 0x0B13, 0x7D9B, 0x17C8, 0x7D9C, 0x0AF0, 0x7D9F, 0x17D5, 0x7DA0, + 0x2192, 0x7DA2, 0x17D1, 0x7DA3, 0x17CB, 0x7DAB, 0x17CF, 0x7DAC, 0x0926, + 0x7DAD, 0x04A1, 0x7DAE, 0x17CA, 0x7DAF, 0x17D2, 0x7DB0, 0x17D6, 0x7DB1, + 0x07DD, 0x7DB2, 0x0EE2, 0x7DB4, 0x0BF2, 0x7DB5, 0x17CC, 0x7DB7, 0x2191, + 0x7DB8, 0x17D4, 0x7DBA, 0x17C9, 0x7DBB, 0x0B7C, 0x7DBD, 0x17CE, 0x7DBE, + 0x0481, 0x7DBF, 0x0ED6, 0x7DC7, 0x17CD, 0x7DCA, 0x06D3, 0x7DCB, 0x0D80, + 0x7DCC, 0x3A86, 0x7DCF, 0x0AEF, 0x7DD1, 0x0F98, 0x7DD2, 0x0979, 0x7DD5, + 0x17FD, 0x7DD6, 0x2193, 0x7DD8, 0x17D7, 0x7DDA, 0x0AA2, 0x7DDC, 0x17D3, + 0x7DDD, 0x17D8, 0x7DDE, 0x17DA, 0x7DE0, 0x0C15, 0x7DE1, 0x17DD, 0x7DE3, + 0x340A, 0x7DE4, 0x17D9, 0x7DE8, 0x0E24, 0x7DE9, 0x0607, 0x7DEB, 0x3A87, + 0x7DEC, 0x0ED7, 0x7DEF, 0x04A2, 0x7DF1, 0x3A88, 0x7DF2, 0x17DC, 0x7DF4, + 0x0FC5, 0x7DF9, 0x3A89, 0x7DFB, 0x17DB, 0x7E01, 0x0511, 0x7E04, 0x0CC4, + 0x7E05, 0x17DE, 0x7E08, 0x3A8A, 0x7E09, 0x17E5, 0x7E0A, 0x17DF, 0x7E0B, + 0x17E6, 0x7E11, 0x3A8B, 0x7E12, 0x17E2, 0x7E15, 0x3A8C, 0x7E1B, 0x0D31, + 0x7E1E, 0x08F6, 0x7E1F, 0x17E4, 0x7E20, 0x3A8D, 0x7E21, 0x17E1, 0x7E22, + 0x17E7, 0x7E23, 0x17E0, 0x7E26, 0x094E, 0x7E2B, 0x0E53, 0x7E2E, 0x0956, + 0x7E31, 0x17E3, 0x7E32, 0x17EF, 0x7E35, 0x17EB, 0x7E37, 0x17EE, 0x7E39, + 0x17EC, 0x7E3A, 0x17F0, 0x7E3B, 0x17EA, 0x7E3D, 0x17D0, 0x7E3E, 0x0A77, + 0x7E41, 0x0D5F, 0x7E43, 0x17ED, 0x7E46, 0x17E8, 0x7E47, 0x3A8E, 0x7E48, + 0x3767, 0x7E4A, 0x0AA3, 0x7E4B, 0x0728, 0x7E4D, 0x0935, 0x7E52, 0x2194, + 0x7E54, 0x09EB, 0x7E55, 0x0AB8, 0x7E56, 0x17F3, 0x7E59, 0x17F5, 0x7E5A, + 0x17F6, 0x7E5D, 0x17F2, 0x7E5E, 0x17F4, 0x7E61, 0x1E11, 0x7E62, 0x3A8F, + 0x7E66, 0x17E9, 0x7E67, 0x17F1, 0x7E69, 0x17F9, 0x7E6A, 0x17F8, 0x7E6B, + 0x1DF7, 0x7E6D, 0x0EA8, 0x7E6E, 0x3A90, 0x7E70, 0x0701, 0x7E73, 0x3A91, + 0x7E79, 0x17F7, 0x7E7B, 0x17FB, 0x7E7C, 0x17FA, 0x7E7D, 0x17FE, 0x7E7F, + 0x1800, 0x7E82, 0x088A, 0x7E83, 0x17FC, 0x7E88, 0x1801, 0x7E89, 0x1802, + 0x7E8A, 0x20A7, 0x7E8C, 0x1803, 0x7E8D, 0x3A92, 0x7E8E, 0x1809, 0x7E8F, + 0x0C35, 0x7E90, 0x1805, 0x7E91, 0x3A93, 0x7E92, 0x1804, 0x7E93, 0x1806, + 0x7E94, 0x1807, 0x7E96, 0x1808, 0x7E98, 0x3A94, 0x7E9B, 0x180A, 0x7E9C, + 0x180B, 0x7F36, 0x0608, 0x7F38, 0x180C, 0x7F3A, 0x180D, 0x7F44, 0x3A95, + 0x7F45, 0x180E, 0x7F47, 0x2195, 0x7F4C, 0x180F, 0x7F4D, 0x1810, 0x7F4E, + 0x1811, 0x7F4F, 0x3A96, 0x7F50, 0x1812, 0x7F51, 0x1813, 0x7F52, 0x3A97, + 0x7F53, 0x3A98, 0x7F54, 0x1815, 0x7F55, 0x1814, 0x7F58, 0x1816, 0x7F5F, + 0x1817, 0x7F60, 0x1818, 0x7F61, 0x3A99, 0x7F67, 0x181B, 0x7F68, 0x1819, + 0x7F69, 0x181A, 0x7F6A, 0x0851, 0x7F6B, 0x0729, 0x7F6E, 0x0B94, 0x7F70, + 0x0D47, 0x7F72, 0x097A, 0x7F75, 0x0D03, 0x7F77, 0x0D81, 0x7F78, 0x181C, + 0x7F79, 0x1336, 0x7F82, 0x181D, 0x7F83, 0x181F, 0x7F85, 0x0F4F, 0x7F86, + 0x181E, 0x7F87, 0x1821, 0x7F88, 0x1820, 0x7F8A, 0x0F3D, 0x7F8C, 0x1822, + 0x7F8E, 0x0D92, 0x7F91, 0x3A9A, 0x7F94, 0x1823, 0x7F9A, 0x1826, 0x7F9D, + 0x1825, 0x7F9E, 0x1824, 0x7FA1, 0x2196, 0x7FA3, 0x1827, 0x7FA4, 0x0708, + 0x7FA8, 0x0AA4, 0x7FA9, 0x065B, 0x7FAE, 0x182B, 0x7FAF, 0x1828, 0x7FB2, + 0x1829, 0x7FB6, 0x182C, 0x7FB8, 0x182D, 0x7FB9, 0x182A, 0x7FBD, 0x04CB, + 0x7FBF, 0x3A9B, 0x7FC1, 0x0527, 0x7FC5, 0x182F, 0x7FC6, 0x1830, 0x7FCA, + 0x1831, 0x7FCC, 0x0F4C, 0x7FCE, 0x3A9C, 0x7FD2, 0x0936, 0x7FD4, 0x1833, + 0x7FD5, 0x1832, 0x7FDF, 0x3A9D, 0x7FE0, 0x0A2F, 0x7FE1, 0x1834, 0x7FE5, + 0x3A9E, 0x7FE6, 0x1835, 0x7FE9, 0x1836, 0x7FEB, 0x0621, 0x7FEC, 0x3A9F, + 0x7FEE, 0x3AA0, 0x7FEF, 0x3AA1, 0x7FF0, 0x0609, 0x7FF3, 0x1837, 0x7FF9, + 0x1838, 0x7FFA, 0x3AA2, 0x7FFB, 0x0E8B, 0x7FFC, 0x0F4D, 0x8000, 0x0F3E, + 0x8001, 0x0FDD, 0x8002, 0x3713, 0x8003, 0x07DF, 0x8004, 0x183B, 0x8005, + 0x0900, 0x8006, 0x183A, 0x800B, 0x183C, 0x800C, 0x08D5, 0x800E, 0x3AA3, + 0x8010, 0x0B31, 0x8011, 0x3AA4, 0x8012, 0x183D, 0x8014, 0x3AA5, 0x8015, + 0x07DE, 0x8017, 0x0EE3, 0x8018, 0x183E, 0x8019, 0x183F, 0x801C, 0x1840, + 0x8021, 0x1841, 0x8024, 0x3AA6, 0x8026, 0x3AA7, 0x8028, 0x1842, 0x8033, + 0x08D6, 0x8036, 0x0EF9, 0x803A, 0x3AA8, 0x803B, 0x1844, 0x803C, 0x3AA9, + 0x803D, 0x0B7D, 0x803F, 0x1843, 0x8046, 0x1846, 0x804A, 0x1845, 0x8052, + 0x1847, 0x8056, 0x0A5F, 0x8058, 0x1848, 0x805A, 0x1849, 0x805E, 0x0E09, + 0x805F, 0x184A, 0x8060, 0x3AAA, 0x8061, 0x0AF1, 0x8062, 0x184B, 0x8068, + 0x184C, 0x806F, 0x0FC6, 0x8070, 0x184F, 0x8071, 0x3AAB, 0x8072, 0x184E, + 0x8073, 0x184D, 0x8074, 0x0BCC, 0x8075, 0x3AAC, 0x8076, 0x1850, 0x8077, + 0x09EC, 0x8079, 0x1851, 0x807D, 0x1852, 0x807E, 0x0FDE, 0x807F, 0x1853, + 0x8084, 0x1854, 0x8085, 0x1856, 0x8086, 0x1855, 0x8087, 0x0D39, 0x8089, + 0x0CD1, 0x808B, 0x0FE4, 0x808C, 0x0D3D, 0x8093, 0x1858, 0x8096, 0x09BB, + 0x8098, 0x0D9C, 0x809A, 0x1859, 0x809B, 0x1857, 0x809D, 0x060A, 0x809E, + 0x3AAD, 0x80A1, 0x0788, 0x80A2, 0x08B6, 0x80A5, 0x0D82, 0x80A6, 0x3AAE, + 0x80A9, 0x075E, 0x80AA, 0x0E71, 0x80AB, 0x3AAF, 0x80AC, 0x185C, 0x80AD, + 0x185A, 0x80AF, 0x07E0, 0x80B1, 0x07E1, 0x80B2, 0x04AD, 0x80B4, 0x0858, + 0x80BA, 0x0D0F, 0x80C3, 0x04A3, 0x80C4, 0x1861, 0x80C6, 0x0B7E, 0x80CC, + 0x0D0E, 0x80CE, 0x0B3B, 0x80D6, 0x1863, 0x80D7, 0x3AB0, 0x80D8, 0x3AB1, + 0x80D9, 0x185F, 0x80DA, 0x1862, 0x80DB, 0x185D, 0x80DD, 0x1860, 0x80DE, + 0x0E54, 0x80E1, 0x0789, 0x80E4, 0x04C1, 0x80E5, 0x185E, 0x80EF, 0x1865, + 0x80F1, 0x1866, 0x80F4, 0x0C91, 0x80F8, 0x06B3, 0x80FC, 0x1871, 0x80FD, + 0x0CF3, 0x8102, 0x08B7, 0x8105, 0x06B4, 0x8106, 0x0A6C, 0x8107, 0x0FEC, + 0x8108, 0x0EBA, 0x8109, 0x1864, 0x810A, 0x0A78, 0x8116, 0x3AB2, 0x8118, + 0x3AB3, 0x811A, 0x066D, 0x811B, 0x1867, 0x8123, 0x1869, 0x8129, 0x1868, + 0x812B, 0x3659, 0x812F, 0x186A, 0x8131, 0x0B64, 0x8133, 0x0CF4, 0x8139, + 0x0BCD, 0x813A, 0x3AB4, 0x813E, 0x186E, 0x8141, 0x3772, 0x8146, 0x186D, + 0x814A, 0x3AB5, 0x814B, 0x186B, 0x814C, 0x3AB6, 0x814E, 0x0A1B, 0x8150, + 0x0DD7, 0x8151, 0x1870, 0x8153, 0x186F, 0x8154, 0x07E2, 0x8155, 0x0FF9, + 0x815F, 0x1880, 0x8165, 0x1874, 0x8166, 0x1875, 0x816B, 0x091C, 0x816E, + 0x1873, 0x8170, 0x080A, 0x8171, 0x1872, 0x8174, 0x1876, 0x8178, 0x0BCE, + 0x8179, 0x0DF2, 0x817A, 0x0AA5, 0x817F, 0x0B3C, 0x8180, 0x187A, 0x8181, + 0x3AB7, 0x8182, 0x187B, 0x8183, 0x1877, 0x8184, 0x3AB8, 0x8188, 0x1878, + 0x818A, 0x1879, 0x818F, 0x07E3, 0x8193, 0x1881, 0x8195, 0x187D, 0x819A, + 0x0DD8, 0x819C, 0x0E9A, 0x819D, 0x0D9A, 0x81A0, 0x187C, 0x81A3, 0x187F, + 0x81A4, 0x187E, 0x81A8, 0x0E72, 0x81A9, 0x1882, 0x81B0, 0x1883, 0x81B3, + 0x0AB9, 0x81B4, 0x3AB9, 0x81B5, 0x1884, 0x81B8, 0x1886, 0x81BA, 0x188A, + 0x81BD, 0x1887, 0x81BE, 0x1885, 0x81BF, 0x0CF5, 0x81C0, 0x1888, 0x81C2, + 0x1889, 0x81C6, 0x0532, 0x81C8, 0x1890, 0x81C9, 0x188B, 0x81CD, 0x188C, + 0x81CF, 0x3ABA, 0x81D1, 0x188D, 0x81D3, 0x0B01, 0x81D8, 0x188F, 0x81D9, + 0x188E, 0x81DA, 0x1891, 0x81DF, 0x1892, 0x81E0, 0x1893, 0x81E3, 0x0A09, + 0x81E5, 0x0569, 0x81E7, 0x1894, 0x81E8, 0x0F9F, 0x81EA, 0x08D7, 0x81ED, + 0x0937, 0x81F3, 0x08B8, 0x81F4, 0x0B95, 0x81F9, 0x3ABB, 0x81FA, 0x1895, + 0x81FB, 0x1896, 0x81FC, 0x04D3, 0x81FE, 0x1897, 0x8201, 0x1898, 0x8202, + 0x1899, 0x8203, 0x3ABC, 0x8205, 0x189A, 0x8207, 0x189B, 0x8208, 0x06B5, + 0x8209, 0x13AF, 0x820A, 0x189C, 0x820C, 0x0A89, 0x820D, 0x189D, 0x820E, + 0x08F7, 0x8210, 0x189E, 0x8212, 0x1009, 0x8216, 0x189F, 0x8217, 0x0E2E, + 0x8218, 0x0618, 0x821B, 0x0AA6, 0x821C, 0x0962, 0x821E, 0x0DE3, 0x821F, + 0x0938, 0x8221, 0x3ABD, 0x8229, 0x18A0, 0x822A, 0x07E4, 0x822B, 0x18A1, + 0x822C, 0x0D60, 0x822E, 0x18AF, 0x8232, 0x3ABE, 0x8233, 0x18A3, 0x8234, + 0x3ABF, 0x8235, 0x0B29, 0x8236, 0x0D2B, 0x8237, 0x0773, 0x8238, 0x18A2, + 0x8239, 0x0AA7, 0x8240, 0x18A4, 0x8246, 0x3AC0, 0x8247, 0x0C16, 0x824B, + 0x3AC1, 0x824F, 0x3AC2, 0x8258, 0x18A6, 0x8259, 0x18A5, 0x825A, 0x18A8, + 0x825D, 0x18A7, 0x825F, 0x18A9, 0x8262, 0x18AB, 0x8264, 0x18AA, 0x8266, + 0x060B, 0x8268, 0x18AC, 0x826A, 0x18AD, 0x826B, 0x18AE, 0x826E, 0x0821, + 0x826F, 0x0F91, 0x8271, 0x18B0, 0x8272, 0x09ED, 0x8276, 0x0512, 0x8277, + 0x18B1, 0x8278, 0x18B2, 0x8279, 0x3775, 0x827E, 0x18B3, 0x828B, 0x04B6, + 0x828D, 0x18B4, 0x828E, 0x3AC3, 0x8292, 0x18B5, 0x8299, 0x0DD9, 0x829D, + 0x08F3, 0x829F, 0x18B7, 0x82A5, 0x0587, 0x82A6, 0x0476, 0x82AB, 0x18B6, + 0x82AC, 0x18B9, 0x82AD, 0x0D04, 0x82AE, 0x3AC4, 0x82AF, 0x0A0A, 0x82B1, + 0x0556, 0x82B3, 0x0E55, 0x82B7, 0x3AC5, 0x82B8, 0x0733, 0x82B9, 0x06D4, + 0x82BB, 0x18B8, 0x82BD, 0x056A, 0x82BE, 0x3AC6, 0x82C5, 0x05DF, 0x82C6, + 0x3AC7, 0x82D1, 0x0513, 0x82D2, 0x18BD, 0x82D3, 0x0FB2, 0x82D4, 0x0B3D, + 0x82D7, 0x0DB6, 0x82D9, 0x18C9, 0x82DB, 0x0557, 0x82DC, 0x18C7, 0x82DE, + 0x18C5, 0x82DF, 0x18BC, 0x82E1, 0x18BA, 0x82E3, 0x18BB, 0x82E5, 0x090F, + 0x82E6, 0x06E4, 0x82E7, 0x0BB5, 0x82EB, 0x0CA9, 0x82F1, 0x04F3, 0x82F3, + 0x18BF, 0x82F4, 0x18BE, 0x82F9, 0x18C4, 0x82FA, 0x18C0, 0x82FB, 0x18C3, + 0x82FE, 0x3AC8, 0x8301, 0x2198, 0x8302, 0x0EDC, 0x8303, 0x18C2, 0x8304, + 0x0558, 0x8305, 0x05DB, 0x8306, 0x18C6, 0x8309, 0x18C8, 0x830E, 0x072A, + 0x8316, 0x18CC, 0x8317, 0x18D5, 0x8318, 0x18D6, 0x831C, 0x046F, 0x8323, + 0x18DD, 0x8328, 0x04B5, 0x832B, 0x18D4, 0x832F, 0x18D3, 0x8331, 0x18CE, + 0x8332, 0x18CD, 0x8334, 0x18CB, 0x8335, 0x18CA, 0x8336, 0x0BA1, 0x8338, + 0x0B5B, 0x8339, 0x18D0, 0x8340, 0x18CF, 0x8343, 0x3AC9, 0x8345, 0x18D2, + 0x8349, 0x0AF2, 0x834A, 0x072B, 0x834F, 0x04E3, 0x8350, 0x18D1, 0x8351, + 0x3ACA, 0x8352, 0x07E5, 0x8355, 0x3ACB, 0x8358, 0x0AF3, 0x8362, 0x2199, + 0x8373, 0x18E3, 0x8375, 0x18E4, 0x8377, 0x0559, 0x837B, 0x052E, 0x837C, + 0x18E1, 0x837F, 0x219A, 0x8385, 0x18D7, 0x8386, 0x3ACC, 0x8387, 0x18DF, + 0x8389, 0x18E6, 0x838A, 0x18E0, 0x838D, 0x3ACD, 0x838E, 0x18DE, 0x8392, + 0x3ACE, 0x8393, 0x18C1, 0x8396, 0x18DC, 0x8398, 0x3ACF, 0x839A, 0x18D8, + 0x839E, 0x060C, 0x839F, 0x18DA, 0x83A0, 0x18E5, 0x83A2, 0x18DB, 0x83A8, + 0x18E7, 0x83A9, 0x3AD0, 0x83AA, 0x18D9, 0x83AB, 0x0D32, 0x83B1, 0x0F53, + 0x83B5, 0x18E2, 0x83BD, 0x18F8, 0x83BF, 0x3AD1, 0x83C0, 0x3AD2, 0x83C1, + 0x18F0, 0x83C5, 0x0A41, 0x83C7, 0x219B, 0x83CA, 0x0660, 0x83CC, 0x06D5, + 0x83CE, 0x18EB, 0x83D3, 0x055B, 0x83D6, 0x09BC, 0x83D8, 0x18EE, 0x83DC, + 0x084A, 0x83DF, 0x0C4B, 0x83E0, 0x18F3, 0x83E9, 0x0E3E, 0x83EA, 0x3AD3, + 0x83EB, 0x18EA, 0x83EF, 0x055A, 0x83F0, 0x078A, 0x83F1, 0x0D9B, 0x83F2, + 0x18F4, 0x83F4, 0x18E8, 0x83F6, 0x219C, 0x83F7, 0x18F1, 0x83FB, 0x18FB, + 0x83FD, 0x18EC, 0x8403, 0x18ED, 0x8404, 0x0C92, 0x8407, 0x18F2, 0x840A, + 0x1E7F, 0x840B, 0x18EF, 0x840C, 0x0E56, 0x840D, 0x18F5, 0x840E, 0x04A4, + 0x840F, 0x3AD4, 0x8411, 0x3AD5, 0x8413, 0x18E9, 0x8420, 0x18F7, 0x8422, + 0x18F6, 0x8429, 0x0D21, 0x842A, 0x18FD, 0x842C, 0x1908, 0x8431, 0x05DC, + 0x8435, 0x190B, 0x8438, 0x18F9, 0x843C, 0x18FE, 0x843D, 0x0F58, 0x8446, + 0x1907, 0x8448, 0x219D, 0x8449, 0x0F3F, 0x844A, 0x3AD6, 0x844E, 0x0F72, + 0x8457, 0x0BB6, 0x845B, 0x05C9, 0x8461, 0x0DE4, 0x8462, 0x190D, 0x8463, + 0x0C79, 0x8466, 0x0475, 0x8469, 0x1906, 0x846B, 0x1902, 0x846C, 0x0AF4, + 0x846D, 0x18FC, 0x846E, 0x1904, 0x846F, 0x1909, 0x8471, 0x0CE2, 0x8475, + 0x046E, 0x8476, 0x3AD7, 0x8477, 0x1901, 0x8479, 0x190A, 0x847A, 0x0DEA, + 0x8482, 0x1905, 0x8484, 0x1900, 0x848B, 0x09BD, 0x8490, 0x0939, 0x8494, + 0x08D8, 0x8499, 0x0EE4, 0x849C, 0x0DB9, 0x849F, 0x1910, 0x84A1, 0x1919, + 0x84A8, 0x3AD8, 0x84AD, 0x1903, 0x84AF, 0x3AD9, 0x84B2, 0x05D5, 0x84B4, + 0x219E, 0x84B8, 0x09E0, 0x84B9, 0x190E, 0x84BB, 0x1913, 0x84BC, 0x0AF5, + 0x84BF, 0x190F, 0x84C0, 0x3ADA, 0x84C1, 0x1916, 0x84C2, 0x3ADB, 0x84C4, + 0x0B9D, 0x84C6, 0x1917, 0x84C9, 0x0F40, 0x84CA, 0x190C, 0x84CB, 0x0596, + 0x84CD, 0x1912, 0x84D0, 0x1915, 0x84D1, 0x0EB8, 0x84D6, 0x1918, 0x84D9, + 0x1911, 0x84DA, 0x1914, 0x84DC, 0x20AB, 0x84EC, 0x0E57, 0x84EE, 0x0FC7, + 0x84F0, 0x3ADC, 0x84F4, 0x191C, 0x84FC, 0x1923, 0x84FD, 0x3ADD, 0x84FF, + 0x191B, 0x8500, 0x08EF, 0x8506, 0x18FA, 0x850C, 0x3ADE, 0x8511, 0x0E1E, + 0x8513, 0x0EAE, 0x8514, 0x1922, 0x8515, 0x1921, 0x8517, 0x191D, 0x8518, + 0x191E, 0x851A, 0x04D8, 0x851F, 0x1920, 0x8521, 0x191A, 0x8523, 0x1E1A, + 0x8526, 0x0BF1, 0x852C, 0x191F, 0x852D, 0x04C2, 0x8534, 0x3ADF, 0x8535, + 0x0B02, 0x853D, 0x0E13, 0x853E, 0x1EB5, 0x8540, 0x1924, 0x8541, 0x1928, + 0x8543, 0x0D6D, 0x8548, 0x1927, 0x8549, 0x09BE, 0x854A, 0x08F5, 0x854B, + 0x192A, 0x854E, 0x06B6, 0x8553, 0x219F, 0x8555, 0x192B, 0x8557, 0x0DEB, + 0x8558, 0x1926, 0x8559, 0x21A0, 0x855A, 0x18FF, 0x855E, 0x3AE0, 0x8563, + 0x1925, 0x8568, 0x0FF5, 0x8569, 0x0C7A, 0x856A, 0x0DE5, 0x856B, 0x21A1, + 0x856D, 0x1932, 0x8577, 0x1938, 0x857E, 0x1939, 0x8580, 0x192C, 0x8584, + 0x0D2C, 0x8587, 0x1936, 0x8588, 0x192E, 0x858A, 0x1930, 0x858F, 0x3AE1, + 0x8590, 0x193A, 0x8591, 0x192F, 0x8594, 0x1933, 0x8597, 0x0514, 0x8599, + 0x0CBD, 0x859B, 0x1934, 0x859C, 0x1937, 0x85A4, 0x192D, 0x85A6, 0x0AA8, + 0x85A8, 0x1931, 0x85A9, 0x0875, 0x85AA, 0x0A0B, 0x85AB, 0x0706, 0x85AC, + 0x0F00, 0x85AD, 0x3AE4, 0x85AE, 0x0F05, 0x85AF, 0x097C, 0x85B0, 0x21A3, + 0x85B7, 0x3AE2, 0x85B9, 0x193E, 0x85BA, 0x193C, 0x85C1, 0x0FF4, 0x85C9, + 0x193B, 0x85CD, 0x0F5F, 0x85CE, 0x3AE3, 0x85CF, 0x193D, 0x85D0, 0x193F, + 0x85D5, 0x1940, 0x85DC, 0x1943, 0x85DD, 0x1941, 0x85E4, 0x0C7B, 0x85E5, + 0x1942, 0x85E9, 0x0D61, 0x85EA, 0x1935, 0x85F4, 0x3780, 0x85F7, 0x097D, + 0x85F9, 0x1944, 0x85FA, 0x1949, 0x85FB, 0x0AF6, 0x85FE, 0x1948, 0x8602, + 0x1929, 0x8606, 0x194A, 0x8607, 0x0ACB, 0x860A, 0x1945, 0x860B, 0x1947, + 0x8612, 0x3AE5, 0x8613, 0x1946, 0x8616, 0x14D0, 0x8617, 0x14C1, 0x861A, + 0x194C, 0x8622, 0x194B, 0x8629, 0x3AE6, 0x862D, 0x0F60, 0x862F, 0x16B1, + 0x8630, 0x194D, 0x863F, 0x194E, 0x864D, 0x194F, 0x864E, 0x078B, 0x8650, + 0x066E, 0x8652, 0x3AE7, 0x8654, 0x1951, 0x8655, 0x1094, 0x865A, 0x068F, + 0x865B, 0x3418, 0x865C, 0x0F82, 0x865E, 0x06EB, 0x865F, 0x1952, 0x8663, + 0x3AE8, 0x8667, 0x1953, 0x866B, 0x0BAC, 0x866C, 0x3AE9, 0x866F, 0x3AEA, + 0x8671, 0x1954, 0x8679, 0x0CD2, 0x867A, 0x3AEB, 0x867B, 0x047E, 0x867D, + 0x3786, 0x868A, 0x0563, 0x868B, 0x1959, 0x868C, 0x195A, 0x868D, 0x3AEC, + 0x8691, 0x3AED, 0x8693, 0x1955, 0x8695, 0x088B, 0x8698, 0x3AEE, 0x86A3, + 0x1956, 0x86A4, 0x0CF8, 0x86A7, 0x3AEF, 0x86A8, 0x3AF0, 0x86A9, 0x1957, + 0x86AA, 0x1958, 0x86AB, 0x1962, 0x86AF, 0x195C, 0x86B0, 0x195F, 0x86B6, + 0x195B, 0x86C4, 0x195D, 0x86C6, 0x195E, 0x86C7, 0x0904, 0x86C9, 0x1960, + 0x86CB, 0x0B7F, 0x86CD, 0x072C, 0x86CE, 0x05A0, 0x86D4, 0x1963, 0x86D9, + 0x059D, 0x86DB, 0x1968, 0x86DE, 0x1964, 0x86DF, 0x1967, 0x86E4, 0x0D4E, + 0x86E9, 0x1965, 0x86EC, 0x1966, 0x86ED, 0x0DBA, 0x86EE, 0x0D6E, 0x86EF, + 0x1969, 0x86F8, 0x0B5D, 0x86F9, 0x1973, 0x86FA, 0x3AF1, 0x86FB, 0x196F, + 0x86FD, 0x3AF2, 0x86FE, 0x056B, 0x8700, 0x196D, 0x8702, 0x0E58, 0x8703, + 0x196E, 0x8706, 0x196B, 0x8708, 0x196C, 0x8709, 0x1971, 0x870A, 0x1974, + 0x870B, 0x3AF3, 0x870D, 0x1972, 0x8711, 0x1970, 0x8712, 0x196A, 0x8713, + 0x3AF4, 0x8718, 0x0B96, 0x8719, 0x3AF5, 0x871A, 0x197B, 0x871C, 0x0EB6, + 0x871E, 0x3AF6, 0x8725, 0x1979, 0x8728, 0x3AF7, 0x8729, 0x197A, 0x8734, + 0x1975, 0x8737, 0x1977, 0x873B, 0x1978, 0x873E, 0x3AF8, 0x873F, 0x1976, + 0x8749, 0x0A8A, 0x874B, 0x0FDF, 0x874C, 0x197F, 0x874E, 0x1980, 0x8753, + 0x1986, 0x8755, 0x09F0, 0x8757, 0x1982, 0x8759, 0x1985, 0x875F, 0x197D, + 0x8760, 0x197C, 0x8763, 0x1987, 0x8766, 0x055C, 0x8768, 0x1983, 0x876A, + 0x1988, 0x876E, 0x1984, 0x8771, 0x3AF9, 0x8774, 0x1981, 0x8776, 0x0BCF, + 0x8778, 0x197E, 0x877F, 0x0D1E, 0x8782, 0x198C, 0x8788, 0x3AFA, 0x878D, + 0x0F25, 0x8799, 0x3AFB, 0x879F, 0x198B, 0x87A2, 0x198A, 0x87AB, 0x1993, + 0x87AC, 0x3AFC, 0x87AD, 0x3AFD, 0x87AF, 0x198D, 0x87B3, 0x1995, 0x87B5, + 0x3AFE, 0x87BA, 0x0F50, 0x87BB, 0x1998, 0x87BD, 0x198F, 0x87C0, 0x1990, + 0x87C4, 0x1994, 0x87C6, 0x1997, 0x87C7, 0x1996, 0x87CB, 0x198E, 0x87D0, + 0x1991, 0x87D2, 0x19A2, 0x87D6, 0x3AFF, 0x87E0, 0x199B, 0x87EB, 0x3B00, + 0x87EC, 0x1E23, 0x87ED, 0x3B01, 0x87EF, 0x1999, 0x87F2, 0x199A, 0x87F5, + 0x3C3D, 0x87F6, 0x199F, 0x87F7, 0x19A0, 0x87F9, 0x0588, 0x87FB, 0x065C, + 0x87FE, 0x199E, 0x8801, 0x3B02, 0x8803, 0x3B03, 0x8805, 0x1989, 0x8806, + 0x3B04, 0x8807, 0x21A6, 0x880B, 0x3B05, 0x880D, 0x199D, 0x880E, 0x19A1, + 0x880F, 0x199C, 0x8811, 0x19A3, 0x8814, 0x3B06, 0x8815, 0x19A5, 0x8816, + 0x19A4, 0x881C, 0x3B07, 0x881F, 0x1E85, 0x8821, 0x19A7, 0x8822, 0x19A6, + 0x8823, 0x1961, 0x8827, 0x19AB, 0x8831, 0x19A8, 0x8836, 0x19A9, 0x8839, + 0x19AA, 0x883B, 0x19AC, 0x8840, 0x0742, 0x8842, 0x19AE, 0x8844, 0x19AD, + 0x8846, 0x093A, 0x884C, 0x07E6, 0x884D, 0x1524, 0x8852, 0x19AF, 0x8853, + 0x095B, 0x8856, 0x3B08, 0x8857, 0x0597, 0x8859, 0x19B0, 0x885B, 0x04F4, + 0x885D, 0x09BF, 0x885E, 0x19B1, 0x885F, 0x3B09, 0x8861, 0x07E7, 0x8862, + 0x19B2, 0x8863, 0x04A5, 0x8864, 0x3B0A, 0x8868, 0x0DAF, 0x886B, 0x19B3, + 0x8870, 0x0A30, 0x8872, 0x19BA, 0x8875, 0x19B7, 0x8877, 0x0BAD, 0x887D, + 0x19B8, 0x887E, 0x19B5, 0x887F, 0x06D6, 0x8881, 0x19B4, 0x8882, 0x19BB, + 0x8888, 0x070C, 0x888B, 0x0B3E, 0x888D, 0x19C1, 0x8892, 0x19BD, 0x8896, + 0x0B15, 0x8897, 0x19BC, 0x8898, 0x3B0B, 0x8899, 0x19BF, 0x889E, 0x19B6, + 0x88A2, 0x19C0, 0x88A4, 0x19C2, 0x88AA, 0x3B0C, 0x88AB, 0x0D83, 0x88AE, + 0x19BE, 0x88B0, 0x19C3, 0x88B1, 0x19C5, 0x88B4, 0x0787, 0x88B5, 0x19B9, + 0x88B7, 0x0485, 0x88BD, 0x3B0D, 0x88BE, 0x3B0E, 0x88BF, 0x19C4, 0x88C1, + 0x084B, 0x88C2, 0x0FBE, 0x88C3, 0x19C6, 0x88C4, 0x19C7, 0x88C5, 0x0AF7, + 0x88C6, 0x3789, 0x88CA, 0x3B0F, 0x88CF, 0x0F6A, 0x88D2, 0x3B10, 0x88D4, + 0x19C8, 0x88D5, 0x0F1F, 0x88D8, 0x19C9, 0x88D9, 0x19CA, 0x88DB, 0x3B11, + 0x88DC, 0x0E34, 0x88DD, 0x19CB, 0x88DF, 0x0830, 0x88E1, 0x0F6B, 0x88E8, + 0x19D0, 0x88F0, 0x3B12, 0x88F1, 0x3B13, 0x88F2, 0x19D1, 0x88F3, 0x09C0, + 0x88F4, 0x19CF, 0x88F5, 0x21A7, 0x88F8, 0x0F51, 0x88F9, 0x19CC, 0x88FC, + 0x19CE, 0x88FD, 0x0A61, 0x88FE, 0x0A44, 0x8902, 0x19CD, 0x8904, 0x19D2, + 0x8906, 0x3B14, 0x8907, 0x0DF3, 0x890A, 0x19D4, 0x890C, 0x19D3, 0x8910, + 0x05CA, 0x8912, 0x0E59, 0x8913, 0x19D5, 0x8918, 0x3B15, 0x8919, 0x3B16, + 0x891A, 0x3B17, 0x891C, 0x20A8, 0x891D, 0x19E1, 0x891E, 0x19D7, 0x8925, + 0x19D8, 0x8927, 0x3B18, 0x892A, 0x19D9, 0x892B, 0x19DA, 0x8930, 0x3B19, + 0x8936, 0x19DE, 0x8938, 0x19DF, 0x893B, 0x19DD, 0x893E, 0x3B1A, 0x8941, + 0x19DB, 0x8943, 0x19D6, 0x8944, 0x19DC, 0x894C, 0x19E0, 0x894D, 0x1BD0, + 0x8956, 0x0528, 0x895E, 0x19E3, 0x895F, 0x06D7, 0x8960, 0x19E2, 0x8964, + 0x19E5, 0x8966, 0x19E4, 0x896A, 0x19E7, 0x896D, 0x19E6, 0x896F, 0x19E8, + 0x8972, 0x093B, 0x8974, 0x19E9, 0x8977, 0x19EA, 0x897B, 0x3B1B, 0x897E, + 0x19EB, 0x897F, 0x0A62, 0x8980, 0x362E, 0x8981, 0x0F41, 0x8983, 0x19EC, + 0x8986, 0x0DF4, 0x8987, 0x0CFC, 0x8988, 0x19ED, 0x898A, 0x19EE, 0x898B, + 0x075F, 0x898F, 0x0646, 0x8993, 0x19EF, 0x8996, 0x08B9, 0x8997, 0x0CF7, + 0x8998, 0x19F0, 0x899A, 0x05AE, 0x89A1, 0x19F1, 0x89A6, 0x19F3, 0x89A7, + 0x0F61, 0x89A9, 0x19F2, 0x89AA, 0x0A0C, 0x89AC, 0x19F4, 0x89AF, 0x19F5, + 0x89B2, 0x19F6, 0x89B3, 0x060D, 0x89BA, 0x19F7, 0x89BD, 0x19F8, 0x89BF, + 0x19F9, 0x89C0, 0x19FA, 0x89D2, 0x05AF, 0x89D4, 0x3B1C, 0x89D6, 0x3B1D, + 0x89DA, 0x19FB, 0x89DC, 0x19FC, 0x89DD, 0x19FD, 0x89E3, 0x0572, 0x89E5, + 0x3B1E, 0x89E6, 0x09EE, 0x89E7, 0x19FE, 0x89F1, 0x3B1F, 0x89F4, 0x19FF, + 0x89F8, 0x1A00, 0x8A00, 0x0774, 0x8A01, 0x35BC, 0x8A02, 0x0C17, 0x8A03, + 0x1A01, 0x8A07, 0x3B20, 0x8A08, 0x072D, 0x8A0A, 0x0A1C, 0x8A0C, 0x1A04, + 0x8A0E, 0x0C7C, 0x8A0F, 0x3B21, 0x8A10, 0x1A03, 0x8A12, 0x21A8, 0x8A13, + 0x0707, 0x8A15, 0x3B22, 0x8A16, 0x1A02, 0x8A17, 0x0B57, 0x8A18, 0x0647, + 0x8A1B, 0x1A05, 0x8A1D, 0x1A06, 0x8A1F, 0x09C1, 0x8A22, 0x3B23, 0x8A23, + 0x0743, 0x8A25, 0x1A07, 0x8A2A, 0x0E5A, 0x8A2D, 0x0A83, 0x8A31, 0x0690, + 0x8A33, 0x0F01, 0x8A34, 0x0ACC, 0x8A36, 0x1A08, 0x8A37, 0x21A9, 0x8A3A, + 0x0A0D, 0x8A3B, 0x0BAE, 0x8A3C, 0x09C2, 0x8A41, 0x1A09, 0x8A46, 0x1A0C, + 0x8A48, 0x1A0D, 0x8A4E, 0x3B24, 0x8A50, 0x082E, 0x8A51, 0x0B22, 0x8A52, + 0x1A0B, 0x8A54, 0x09C3, 0x8A55, 0x0DB0, 0x8A5B, 0x1A0A, 0x8A5E, 0x08BA, + 0x8A60, 0x04F5, 0x8A62, 0x1A11, 0x8A63, 0x072E, 0x8A66, 0x08BC, 0x8A69, + 0x08BB, 0x8A6B, 0x0FF3, 0x8A6C, 0x1A10, 0x8A6D, 0x1A0F, 0x8A6E, 0x0AA9, + 0x8A70, 0x0667, 0x8A71, 0x0FE9, 0x8A72, 0x0598, 0x8A73, 0x09C4, 0x8A79, + 0x21AA, 0x8A7C, 0x1A0E, 0x8A7F, 0x3B25, 0x8A82, 0x1A13, 0x8A84, 0x1A14, + 0x8A85, 0x1A12, 0x8A87, 0x078C, 0x8A89, 0x0F2A, 0x8A8C, 0x08BD, 0x8A8D, + 0x0CDD, 0x8A91, 0x1A17, 0x8A93, 0x0A64, 0x8A95, 0x0B80, 0x8A98, 0x0F20, + 0x8A9A, 0x1A1A, 0x8A9E, 0x07A0, 0x8AA0, 0x0A63, 0x8AA1, 0x1A16, 0x8AA3, + 0x1A1B, 0x8AA4, 0x07A1, 0x8AA5, 0x1A18, 0x8AA6, 0x1A19, 0x8AA7, 0x21AB, + 0x8AA8, 0x1A15, 0x8AAA, 0x3638, 0x8AAC, 0x0A86, 0x8AAD, 0x0CA1, 0x8AB0, + 0x0B6D, 0x8AB2, 0x055D, 0x8AB9, 0x0D84, 0x8ABC, 0x065D, 0x8ABE, 0x21AC, + 0x8ABF, 0x0BD0, 0x8AC2, 0x1A1E, 0x8AC4, 0x1A1C, 0x8AC7, 0x0B8A, 0x8ACB, + 0x0A65, 0x8ACC, 0x060E, 0x8ACD, 0x1A1D, 0x8ACF, 0x0A21, 0x8AD2, 0x0F92, + 0x8AD6, 0x0FE6, 0x8ADA, 0x1A1F, 0x8ADB, 0x1A2A, 0x8ADC, 0x0BD1, 0x8ADE, + 0x1A29, 0x8ADF, 0x21AD, 0x8AE0, 0x1A26, 0x8AE1, 0x1A2E, 0x8AE2, 0x1A27, + 0x8AE4, 0x1A23, 0x8AE6, 0x0C18, 0x8AE7, 0x1A22, 0x8AEB, 0x1A20, 0x8AED, + 0x0F0B, 0x8AEE, 0x08BE, 0x8AF1, 0x1A24, 0x8AF3, 0x1A21, 0x8AF4, 0x3B26, + 0x8AF6, 0x21AF, 0x8AF7, 0x1A28, 0x8AF8, 0x097E, 0x8AFA, 0x0775, 0x8AFE, + 0x0B5A, 0x8B00, 0x0E73, 0x8B01, 0x04FC, 0x8B02, 0x04A6, 0x8B04, 0x0C7D, + 0x8B07, 0x1A2C, 0x8B0C, 0x1A2B, 0x8B0E, 0x0CBE, 0x8B10, 0x1A30, 0x8B14, + 0x1A25, 0x8B16, 0x1A2F, 0x8B17, 0x1A31, 0x8B19, 0x0760, 0x8B1A, 0x1A2D, + 0x8B1B, 0x07E8, 0x8B1D, 0x0901, 0x8B1F, 0x3B27, 0x8B20, 0x1A32, 0x8B21, + 0x0F42, 0x8B26, 0x1A35, 0x8B28, 0x1A38, 0x8B2B, 0x1A36, 0x8B2C, 0x0DA7, + 0x8B33, 0x1A33, 0x8B37, 0x3B28, 0x8B39, 0x06D8, 0x8B3E, 0x1A37, 0x8B41, + 0x1A39, 0x8B43, 0x3B29, 0x8B44, 0x3B2A, 0x8B49, 0x1A3D, 0x8B4C, 0x1A3A, + 0x8B4E, 0x1A3C, 0x8B4F, 0x1A3B, 0x8B53, 0x21B0, 0x8B54, 0x3B2B, 0x8B56, + 0x1A3E, 0x8B58, 0x08DD, 0x8B5A, 0x1A40, 0x8B5B, 0x1A3F, 0x8B5C, 0x0DDA, + 0x8B5F, 0x1A42, 0x8B66, 0x072F, 0x8B6B, 0x1A41, 0x8B6C, 0x1A43, 0x8B6F, + 0x1A44, 0x8B70, 0x065E, 0x8B71, 0x182E, 0x8B72, 0x09E1, 0x8B74, 0x1A45, + 0x8B77, 0x07A2, 0x8B7D, 0x1A46, 0x8B7F, 0x21B1, 0x8B80, 0x1A47, 0x8B83, + 0x088C, 0x8B8A, 0x13D3, 0x8B8C, 0x1A48, 0x8B8E, 0x1A49, 0x8B90, 0x093C, + 0x8B92, 0x1A4A, 0x8B93, 0x1A4B, 0x8B96, 0x1A4C, 0x8B99, 0x1A4D, 0x8B9A, + 0x1A4E, 0x8B9C, 0x3B2C, 0x8B9E, 0x3B2D, 0x8C37, 0x0B69, 0x8C3A, 0x1A4F, + 0x8C3F, 0x1A51, 0x8C41, 0x1A50, 0x8C46, 0x0C7E, 0x8C47, 0x3B2E, 0x8C48, + 0x1A52, 0x8C4A, 0x0E5B, 0x8C4C, 0x1A53, 0x8C4E, 0x1A54, 0x8C50, 0x1A55, + 0x8C54, 0x3B2F, 0x8C55, 0x1A56, 0x8C5A, 0x0CB2, 0x8C61, 0x09C5, 0x8C62, + 0x1A57, 0x8C6A, 0x07FD, 0x8C6B, 0x1007, 0x8C6C, 0x1A58, 0x8C73, 0x3B30, + 0x8C78, 0x1A59, 0x8C79, 0x0DB1, 0x8C7A, 0x1A5A, 0x8C7C, 0x1A62, 0x8C82, + 0x1A5B, 0x8C85, 0x1A5D, 0x8C89, 0x1A5C, 0x8C8A, 0x1A5E, 0x8C8C, 0x0E74, + 0x8C8D, 0x1A5F, 0x8C8E, 0x1A60, 0x8C94, 0x1A61, 0x8C98, 0x1A63, 0x8C9D, + 0x058B, 0x8C9E, 0x0C03, 0x8CA0, 0x0DDB, 0x8CA1, 0x0852, 0x8CA2, 0x07E9, + 0x8CA4, 0x3B31, 0x8CA7, 0x0DC1, 0x8CA8, 0x055F, 0x8CA9, 0x0D62, 0x8CAA, + 0x1A66, 0x8CAB, 0x060F, 0x8CAC, 0x0A79, 0x8CAD, 0x1A65, 0x8CAE, 0x1A6A, + 0x8CAF, 0x0BB7, 0x8CB0, 0x0EEF, 0x8CB2, 0x1A68, 0x8CB3, 0x1A69, 0x8CB4, + 0x0648, 0x8CB6, 0x1A6B, 0x8CB7, 0x0D19, 0x8CB8, 0x0B3F, 0x8CBB, 0x0D85, + 0x8CBC, 0x0C37, 0x8CBD, 0x1A67, 0x8CBF, 0x0E75, 0x8CC0, 0x056C, 0x8CC1, + 0x1A6D, 0x8CC2, 0x0FCE, 0x8CC3, 0x0BDE, 0x8CC4, 0x0FEB, 0x8CC7, 0x08BF, + 0x8CC8, 0x1A6C, 0x8CCA, 0x0B11, 0x8CCD, 0x1A7D, 0x8CCE, 0x0AAA, 0x8CD1, + 0x0CD0, 0x8CD3, 0x0DC2, 0x8CD9, 0x3B32, 0x8CDA, 0x1A70, 0x8CDB, 0x088D, + 0x8CDC, 0x08C0, 0x8CDE, 0x09C6, 0x8CE0, 0x0D1B, 0x8CE1, 0x3B33, 0x8CE2, + 0x0761, 0x8CE3, 0x1A6F, 0x8CE4, 0x1A6E, 0x8CE6, 0x0DDC, 0x8CEA, 0x08ED, + 0x8CED, 0x0C4C, 0x8CF0, 0x21B2, 0x8CF4, 0x21B3, 0x8CF8, 0x3B34, 0x8CFA, + 0x1A72, 0x8CFB, 0x1A73, 0x8CFC, 0x07EA, 0x8CFD, 0x1A71, 0x8CFE, 0x3B35, + 0x8D04, 0x1A74, 0x8D05, 0x1A75, 0x8D07, 0x1A77, 0x8D08, 0x0B03, 0x8D0A, + 0x1A76, 0x8D0B, 0x0622, 0x8D0D, 0x1A79, 0x8D0F, 0x1A78, 0x8D10, 0x1A7A, + 0x8D12, 0x21B4, 0x8D13, 0x1A7C, 0x8D14, 0x1A7E, 0x8D16, 0x1A7F, 0x8D1B, + 0x3B36, 0x8D64, 0x0A7A, 0x8D66, 0x08FB, 0x8D67, 0x1A80, 0x8D69, 0x3B37, + 0x8D6B, 0x05B0, 0x8D6C, 0x3B38, 0x8D6D, 0x1A81, 0x8D70, 0x0AF8, 0x8D71, + 0x1A82, 0x8D73, 0x1A83, 0x8D74, 0x0DDD, 0x8D76, 0x21B5, 0x8D77, 0x0649, + 0x8D81, 0x1A84, 0x8D84, 0x3B39, 0x8D85, 0x0BD2, 0x8D8A, 0x04FD, 0x8D8D, + 0x3B3A, 0x8D95, 0x3B3B, 0x8D99, 0x1A85, 0x8DA3, 0x091D, 0x8DA6, 0x3B3C, + 0x8DA8, 0x0A3C, 0x8DB3, 0x0B0D, 0x8DBA, 0x1A88, 0x8DBE, 0x1A87, 0x8DC2, + 0x1A86, 0x8DC6, 0x3B3D, 0x8DCB, 0x1A8E, 0x8DCC, 0x1A8C, 0x8DCE, 0x3B3E, + 0x8DCF, 0x1A89, 0x8DD6, 0x1A8B, 0x8DDA, 0x1A8A, 0x8DDB, 0x1A8D, 0x8DDD, + 0x0691, 0x8DDF, 0x1A91, 0x8DE1, 0x0A7B, 0x8DE3, 0x1A92, 0x8DE4, 0x3B3F, + 0x8DE8, 0x078D, 0x8DEA, 0x1A8F, 0x8DEB, 0x1A90, 0x8DEC, 0x3B40, 0x8DEF, + 0x0FCF, 0x8DF3, 0x0BD3, 0x8DF5, 0x0AAB, 0x8DFC, 0x1A93, 0x8DFF, 0x1A96, + 0x8E08, 0x1A94, 0x8E09, 0x1A95, 0x8E0A, 0x0F43, 0x8E0F, 0x0C7F, 0x8E10, + 0x1A99, 0x8E1D, 0x1A97, 0x8E1E, 0x1A98, 0x8E1F, 0x1A9A, 0x8E20, 0x3B41, + 0x8E2A, 0x1AA8, 0x8E30, 0x1A9D, 0x8E34, 0x1A9E, 0x8E35, 0x1A9C, 0x8E42, + 0x1A9B, 0x8E44, 0x0C19, 0x8E47, 0x1AA0, 0x8E48, 0x1AA4, 0x8E49, 0x1AA1, + 0x8E4A, 0x1A9F, 0x8E4B, 0x3B42, 0x8E4C, 0x1AA2, 0x8E50, 0x1AA3, 0x8E55, + 0x1AAA, 0x8E59, 0x1AA5, 0x8E5F, 0x0A7C, 0x8E60, 0x1AA7, 0x8E63, 0x1AA9, + 0x8E64, 0x1AA6, 0x8E6C, 0x3B43, 0x8E70, 0x3B44, 0x8E72, 0x1AAC, 0x8E74, + 0x093D, 0x8E76, 0x1AAB, 0x8E7A, 0x3B45, 0x8E7C, 0x1AAD, 0x8E81, 0x1AAE, + 0x8E84, 0x1AB1, 0x8E85, 0x1AB0, 0x8E87, 0x1AAF, 0x8E8A, 0x1AB3, 0x8E8B, + 0x1AB2, 0x8E8D, 0x0F02, 0x8E91, 0x1AB5, 0x8E92, 0x3B46, 0x8E93, 0x1AB4, + 0x8E94, 0x1AB6, 0x8E99, 0x1AB7, 0x8EA1, 0x1AB9, 0x8EAA, 0x1AB8, 0x8EAB, + 0x0A0E, 0x8EAC, 0x1ABA, 0x8EAE, 0x3B47, 0x8EAF, 0x06E5, 0x8EB0, 0x1ABB, + 0x8EB1, 0x1ABD, 0x8EB3, 0x3B48, 0x8EB6, 0x3703, 0x8EBE, 0x1ABE, 0x8EC0, + 0x1DEF, 0x8EC5, 0x1ABF, 0x8EC6, 0x1ABC, 0x8EC8, 0x1AC0, 0x8ECA, 0x0902, + 0x8ECB, 0x1AC1, 0x8ECC, 0x064A, 0x8ECD, 0x0709, 0x8ECF, 0x21B7, 0x8ED1, + 0x3B49, 0x8ED2, 0x0762, 0x8ED4, 0x3B4A, 0x8EDB, 0x1AC2, 0x8EDF, 0x0CC8, + 0x8EE2, 0x0C38, 0x8EE3, 0x1AC3, 0x8EEB, 0x1AC6, 0x8EF8, 0x08E0, 0x8EF9, + 0x3B4B, 0x8EFB, 0x1AC5, 0x8EFC, 0x1AC4, 0x8EFD, 0x0730, 0x8EFE, 0x1AC7, + 0x8F03, 0x05B1, 0x8F05, 0x1AC9, 0x8F09, 0x084C, 0x8F0A, 0x1AC8, 0x8F0C, + 0x1AD1, 0x8F12, 0x1ACB, 0x8F13, 0x1ACD, 0x8F14, 0x0E35, 0x8F15, 0x1ACA, + 0x8F17, 0x3B4C, 0x8F19, 0x1ACC, 0x8F1B, 0x1AD0, 0x8F1C, 0x1ACE, 0x8F1D, + 0x064B, 0x8F1F, 0x1ACF, 0x8F26, 0x1AD2, 0x8F29, 0x0D10, 0x8F2A, 0x0FA0, + 0x8F2F, 0x093E, 0x8F33, 0x1AD3, 0x8F36, 0x3B4D, 0x8F38, 0x0F0C, 0x8F39, + 0x1AD5, 0x8F3B, 0x1AD4, 0x8F3E, 0x1AD8, 0x8F3F, 0x0F2B, 0x8F42, 0x1AD7, + 0x8F44, 0x05CB, 0x8F45, 0x1AD6, 0x8F46, 0x1ADB, 0x8F49, 0x1ADA, 0x8F4C, + 0x1AD9, 0x8F4D, 0x0C2C, 0x8F4E, 0x1ADC, 0x8F57, 0x1ADD, 0x8F5C, 0x1ADE, + 0x8F5F, 0x07FE, 0x8F61, 0x06FB, 0x8F62, 0x1ADF, 0x8F63, 0x1AE0, 0x8F64, + 0x1AE1, 0x8F9B, 0x0A0F, 0x8F9C, 0x1AE2, 0x8F9E, 0x08D9, 0x8F9F, 0x1AE3, + 0x8FA3, 0x1AE4, 0x8FA6, 0x3B4E, 0x8FA7, 0x10B6, 0x8FA8, 0x10B5, 0x8FAD, + 0x1AE5, 0x8FAE, 0x17FF, 0x8FAF, 0x1AE6, 0x8FB0, 0x0B62, 0x8FB1, 0x09F1, + 0x8FB2, 0x0CF6, 0x8FB5, 0x3B4F, 0x8FB6, 0x3B50, 0x8FB7, 0x1AE7, 0x8FBA, + 0x0E25, 0x8FBB, 0x0BF0, 0x8FBC, 0x0810, 0x8FBF, 0x0B67, 0x8FC2, 0x04CC, + 0x8FC4, 0x0EA6, 0x8FC5, 0x0A1D, 0x8FC6, 0x3B51, 0x8FC8, 0x3799, 0x8FCE, + 0x0734, 0x8FD1, 0x06D9, 0x8FD4, 0x0E26, 0x8FDA, 0x1AE8, 0x8FE0, 0x3B52, + 0x8FE2, 0x1AEA, 0x8FE4, 0x3B53, 0x8FE5, 0x1AE9, 0x8FE6, 0x0560, 0x8FE9, + 0x0CCE, 0x8FEA, 0x1AEB, 0x8FEB, 0x0D2D, 0x8FED, 0x0C2D, 0x8FEF, 0x1AEC, + 0x8FF0, 0x095C, 0x8FF4, 0x1AEE, 0x8FF6, 0x3B54, 0x8FF7, 0x0ECE, 0x8FF8, + 0x1AFD, 0x8FF9, 0x1AF0, 0x8FFA, 0x1AF1, 0x8FFD, 0x0BE5, 0x9000, 0x0B40, + 0x9001, 0x0AF9, 0x9002, 0x3B55, 0x9003, 0x0C80, 0x9005, 0x1AEF, 0x9006, + 0x066F, 0x900B, 0x1AF8, 0x900D, 0x1AF5, 0x900E, 0x1B02, 0x900F, 0x0C81, + 0x9010, 0x0B9E, 0x9011, 0x1AF2, 0x9013, 0x0C1A, 0x9014, 0x0C4D, 0x9015, + 0x1AF3, 0x9016, 0x1AF7, 0x9017, 0x0A26, 0x9019, 0x0D1D, 0x901A, 0x0BE8, + 0x901D, 0x0A66, 0x901E, 0x1AF6, 0x901F, 0x0B0E, 0x9020, 0x0B04, 0x9021, + 0x1AF4, 0x9022, 0x046D, 0x9023, 0x0FC8, 0x9027, 0x1AF9, 0x902C, 0x3B56, + 0x902E, 0x0B41, 0x9031, 0x093F, 0x9032, 0x0A10, 0x9035, 0x1AFB, 0x9036, + 0x1AFA, 0x9038, 0x04B3, 0x9039, 0x1AFC, 0x903C, 0x0DA1, 0x903E, 0x1B04, + 0x9041, 0x0CB3, 0x9042, 0x0A31, 0x9044, 0x3B57, 0x9045, 0x0B97, 0x9047, + 0x06F0, 0x9049, 0x1B03, 0x904A, 0x0F21, 0x904B, 0x04E1, 0x904D, 0x0E27, + 0x904E, 0x0561, 0x904F, 0x1AFE, 0x9050, 0x1AFF, 0x9051, 0x1B00, 0x9052, + 0x1B01, 0x9053, 0x0C93, 0x9054, 0x0B61, 0x9055, 0x04A7, 0x9056, 0x1B05, + 0x9058, 0x1B06, 0x9059, 0x1D34, 0x905C, 0x0B1D, 0x905E, 0x1B07, 0x9060, + 0x0515, 0x9061, 0x0ACE, 0x9063, 0x0763, 0x9065, 0x0F44, 0x9067, 0x21BA, + 0x9068, 0x1B08, 0x9069, 0x0C26, 0x906D, 0x0AFA, 0x906E, 0x0903, 0x906F, + 0x1B09, 0x9072, 0x1B0C, 0x9075, 0x096F, 0x9076, 0x1B0A, 0x9077, 0x0AAD, + 0x9078, 0x0AAC, 0x907A, 0x04A8, 0x907C, 0x0F93, 0x907D, 0x1B0E, 0x907F, + 0x0D86, 0x9080, 0x1B10, 0x9081, 0x1B0F, 0x9082, 0x1B0D, 0x9083, 0x1737, + 0x9084, 0x0610, 0x9087, 0x1AED, 0x9088, 0x3B58, 0x9089, 0x1B12, 0x908A, + 0x1B11, 0x908F, 0x1B13, 0x9091, 0x0F22, 0x9095, 0x3B59, 0x9099, 0x3B5A, + 0x909B, 0x3B5B, 0x90A2, 0x3B5C, 0x90A3, 0x0CB9, 0x90A6, 0x0E5C, 0x90A8, + 0x1B14, 0x90AA, 0x0905, 0x90AF, 0x1B15, 0x90B1, 0x1B16, 0x90B4, 0x3B5D, + 0x90B5, 0x1B17, 0x90B8, 0x0C1B, 0x90C1, 0x04AE, 0x90CA, 0x07EB, 0x90CE, + 0x0FE0, 0x90D7, 0x3B5E, 0x90DB, 0x1B1B, 0x90DD, 0x3B5F, 0x90DE, 0x21BB, + 0x90E1, 0x070A, 0x90E2, 0x1B18, 0x90E4, 0x1B19, 0x90E8, 0x0DE6, 0x90ED, + 0x05B2, 0x90F4, 0x3B60, 0x90F5, 0x0F23, 0x90F7, 0x06B7, 0x90FD, 0x0C4E, + 0x9102, 0x1B1C, 0x9112, 0x1B1D, 0x9115, 0x21BD, 0x9117, 0x3B61, 0x9119, + 0x1B1E, 0x911C, 0x3B62, 0x9127, 0x21BE, 0x912D, 0x0C1C, 0x9130, 0x1B20, + 0x9131, 0x3B63, 0x9132, 0x1B1F, 0x913A, 0x3B64, 0x913D, 0x3B65, 0x9148, + 0x3B66, 0x9149, 0x0CAB, 0x914A, 0x1B21, 0x914B, 0x0940, 0x914C, 0x090C, + 0x914D, 0x0D11, 0x914E, 0x0BAF, 0x9152, 0x091E, 0x9154, 0x0A32, 0x9156, + 0x1B22, 0x9158, 0x1B23, 0x915B, 0x3B67, 0x9161, 0x3B68, 0x9162, 0x0A23, + 0x9163, 0x1B24, 0x9164, 0x3B69, 0x9165, 0x1B25, 0x9169, 0x1B26, 0x916A, + 0x0F59, 0x916C, 0x0941, 0x9172, 0x1B28, 0x9173, 0x1B27, 0x9175, 0x07EC, + 0x9177, 0x0805, 0x9178, 0x088E, 0x9182, 0x1B2B, 0x9187, 0x0970, 0x9189, + 0x1B2A, 0x918B, 0x1B29, 0x918D, 0x0B49, 0x918E, 0x3B6A, 0x9190, 0x07A3, + 0x9192, 0x0A67, 0x9197, 0x0D44, 0x919C, 0x0943, 0x919E, 0x3B6B, 0x91A2, + 0x1B2C, 0x91A4, 0x09C7, 0x91A8, 0x3B6C, 0x91AA, 0x1B2F, 0x91AB, 0x1B2D, + 0x91AC, 0x1E1B, 0x91AD, 0x3B6D, 0x91AE, 0x3B6E, 0x91AF, 0x1B2E, 0x91B1, + 0x1E61, 0x91B2, 0x3B6F, 0x91B4, 0x1B31, 0x91B5, 0x1B30, 0x91B8, 0x09E2, + 0x91BA, 0x1B32, 0x91BC, 0x3B70, 0x91C0, 0x1B33, 0x91C1, 0x1B34, 0x91C6, + 0x0D64, 0x91C7, 0x0843, 0x91C8, 0x090D, 0x91C9, 0x1B35, 0x91CB, 0x1B36, + 0x91CC, 0x0F6C, 0x91CD, 0x094F, 0x91CE, 0x0EFA, 0x91CF, 0x0F94, 0x91D0, + 0x1B37, 0x91D1, 0x06DA, 0x91D6, 0x1B38, 0x91D7, 0x21C0, 0x91D8, 0x0C1D, + 0x91DA, 0x21BF, 0x91DB, 0x1B3B, 0x91DC, 0x05D6, 0x91DD, 0x0A11, 0x91DE, + 0x21C1, 0x91DF, 0x1B39, 0x91E1, 0x1B3A, 0x91E3, 0x0BFC, 0x91E4, 0x21C4, + 0x91E5, 0x21C5, 0x91E6, 0x0E83, 0x91E7, 0x06F4, 0x91ED, 0x21C2, 0x91EE, + 0x21C3, 0x91F0, 0x3B71, 0x91F5, 0x1B3D, 0x91F6, 0x1B3E, 0x91F7, 0x3B72, + 0x91FB, 0x3B73, 0x91FC, 0x1B3C, 0x91FF, 0x1B40, 0x9206, 0x21C6, 0x9207, + 0x3B74, 0x920A, 0x21C8, 0x920D, 0x0CB7, 0x920E, 0x05A1, 0x9210, 0x21C7, + 0x9211, 0x1B44, 0x9214, 0x1B41, 0x9215, 0x1B43, 0x921E, 0x1B3F, 0x9228, + 0x3B75, 0x9229, 0x1B8A, 0x922C, 0x1B42, 0x9233, 0x3B76, 0x9234, 0x0FB3, + 0x9237, 0x078E, 0x9238, 0x3B77, 0x9239, 0x21CF, 0x923A, 0x21C9, 0x923C, + 0x21CB, 0x923F, 0x1B4C, 0x9240, 0x21CA, 0x9243, 0x3B78, 0x9244, 0x0C2E, + 0x9245, 0x1B47, 0x9247, 0x3B79, 0x9248, 0x1B4A, 0x9249, 0x1B48, 0x924B, + 0x1B4D, 0x924E, 0x21CC, 0x924F, 0x3B7A, 0x9250, 0x1B4E, 0x9251, 0x21CE, + 0x9257, 0x1B46, 0x9259, 0x21CD, 0x925A, 0x1B53, 0x925B, 0x0516, 0x925E, + 0x1B45, 0x9260, 0x3B7B, 0x9262, 0x0D41, 0x9264, 0x1B49, 0x9266, 0x09C8, + 0x9267, 0x21D0, 0x9271, 0x07ED, 0x9277, 0x21D2, 0x9278, 0x21D3, 0x927E, + 0x0E76, 0x9280, 0x06DC, 0x9283, 0x0950, 0x9285, 0x0C94, 0x9288, 0x20AA, + 0x9291, 0x0AAF, 0x9293, 0x1B51, 0x9295, 0x1B4B, 0x9296, 0x1B50, 0x9298, + 0x0ECF, 0x929A, 0x0BD4, 0x929B, 0x1B52, 0x929C, 0x1B4F, 0x92A7, 0x21D1, + 0x92AD, 0x0AAE, 0x92B3, 0x3554, 0x92B7, 0x1B56, 0x92B9, 0x1B55, 0x92C2, + 0x3B7C, 0x92CB, 0x3B7D, 0x92CC, 0x3B7E, 0x92CF, 0x1B54, 0x92D0, 0x21D7, + 0x92D2, 0x0E5D, 0x92D3, 0x21DB, 0x92D5, 0x21D9, 0x92D7, 0x21D5, 0x92D9, + 0x21D6, 0x92DF, 0x3B7F, 0x92E0, 0x21DA, 0x92E4, 0x0985, 0x92E7, 0x21D4, + 0x92E9, 0x1B57, 0x92EA, 0x0E2F, 0x92ED, 0x04F6, 0x92F2, 0x0DB8, 0x92F3, + 0x0BB0, 0x92F8, 0x0692, 0x92F9, 0x20B0, 0x92FA, 0x1B59, 0x92FB, 0x21DE, + 0x92FC, 0x07EF, 0x92FF, 0x21E1, 0x9302, 0x21E3, 0x9304, 0x345A, 0x9306, + 0x087A, 0x930D, 0x3B80, 0x930F, 0x1B58, 0x9310, 0x0A33, 0x9315, 0x3B81, + 0x9318, 0x0A34, 0x9319, 0x1B5C, 0x931A, 0x1B5E, 0x931D, 0x21E2, 0x931E, + 0x21E0, 0x931F, 0x3B82, 0x9320, 0x09E3, 0x9321, 0x21DD, 0x9322, 0x1B5D, + 0x9323, 0x1B5F, 0x9325, 0x21DC, 0x9326, 0x06CB, 0x9327, 0x3B83, 0x9328, + 0x0DB7, 0x932B, 0x090E, 0x932C, 0x0FC9, 0x932E, 0x1B5B, 0x932F, 0x0868, + 0x9332, 0x0FE5, 0x9335, 0x1B61, 0x933A, 0x1B60, 0x933B, 0x1B62, 0x9344, + 0x1B5A, 0x9347, 0x3B84, 0x9348, 0x20A9, 0x934A, 0x3458, 0x934B, 0x0CC1, + 0x934D, 0x0C4F, 0x9352, 0x3B85, 0x9354, 0x0BF3, 0x9356, 0x1B67, 0x9357, + 0x21E5, 0x935B, 0x0B81, 0x935C, 0x1B63, 0x9360, 0x1B64, 0x9365, 0x3B86, + 0x936A, 0x3B87, 0x936C, 0x0703, 0x936D, 0x3B88, 0x936E, 0x1B66, 0x9370, + 0x21E4, 0x9375, 0x0764, 0x937C, 0x1B65, 0x937E, 0x09C9, 0x938C, 0x05D7, + 0x9394, 0x1B6B, 0x9396, 0x082F, 0x9397, 0x0AFB, 0x939A, 0x0BE6, 0x939B, + 0x3B89, 0x93A4, 0x21E6, 0x93A7, 0x0599, 0x93A9, 0x3B8B, 0x93AC, 0x1B69, + 0x93AD, 0x1B6A, 0x93AE, 0x0BDF, 0x93B0, 0x1B68, 0x93B9, 0x1B6C, 0x93BA, + 0x3B8A, 0x93C1, 0x3B8C, 0x93C3, 0x1B72, 0x93C6, 0x21E7, 0x93C8, 0x1B75, + 0x93CA, 0x3B8D, 0x93D0, 0x1B74, 0x93D1, 0x0C27, 0x93D6, 0x1B6D, 0x93D7, + 0x1B6E, 0x93D8, 0x1B71, 0x93DD, 0x1B73, 0x93DE, 0x21E8, 0x93E1, 0x06B8, + 0x93E2, 0x3B8E, 0x93E4, 0x1B76, 0x93E5, 0x1B70, 0x93E8, 0x1B6F, 0x93F8, + 0x21E9, 0x93FA, 0x3B8F, 0x93FD, 0x3B90, 0x9403, 0x1B7A, 0x9407, 0x1B7B, + 0x940F, 0x3B91, 0x9410, 0x1B7C, 0x9413, 0x1B79, 0x9414, 0x1B78, 0x9418, + 0x09CA, 0x9419, 0x0C82, 0x941A, 0x1B77, 0x9421, 0x1B80, 0x942B, 0x1B7E, + 0x9431, 0x21EA, 0x9434, 0x3B92, 0x9435, 0x1B7F, 0x9436, 0x1B7D, 0x9438, + 0x0B58, 0x943A, 0x1B81, 0x943F, 0x3B93, 0x9441, 0x1B82, 0x9444, 0x1B84, + 0x9445, 0x21EB, 0x9448, 0x21EC, 0x9451, 0x0611, 0x9452, 0x1B83, 0x9453, + 0x0F06, 0x9455, 0x3B94, 0x945A, 0x1B8F, 0x945B, 0x1B85, 0x945E, 0x1B88, + 0x9460, 0x1B86, 0x9462, 0x1B87, 0x946A, 0x1B89, 0x946B, 0x3B95, 0x9470, + 0x1B8B, 0x9472, 0x3B96, 0x9475, 0x1B8C, 0x9477, 0x1B8D, 0x947C, 0x1B90, + 0x947D, 0x1B8E, 0x947E, 0x1B91, 0x947F, 0x1B93, 0x9481, 0x1B92, 0x9577, + 0x0BD5, 0x9578, 0x3B97, 0x9580, 0x0EF3, 0x9582, 0x1B94, 0x9583, 0x0AB0, + 0x9587, 0x1B95, 0x9589, 0x0E14, 0x958A, 0x1B96, 0x958B, 0x0589, 0x958F, + 0x04DE, 0x9591, 0x0613, 0x9592, 0x21ED, 0x9593, 0x0612, 0x9594, 0x1B97, + 0x9596, 0x1B98, 0x9598, 0x1B99, 0x9599, 0x1B9A, 0x95A0, 0x1B9B, 0x95A2, + 0x0614, 0x95A3, 0x05B3, 0x95A4, 0x07F0, 0x95A5, 0x0D4A, 0x95A6, 0x3B98, + 0x95A7, 0x1B9D, 0x95A8, 0x1B9C, 0x95A9, 0x3B99, 0x95AB, 0x3B9A, 0x95AD, + 0x1B9E, 0x95B1, 0x3555, 0x95B2, 0x04FE, 0x95B4, 0x3B9B, 0x95B9, 0x1BA1, + 0x95BB, 0x1BA0, 0x95BC, 0x1B9F, 0x95BD, 0x3B9C, 0x95BE, 0x1BA2, 0x95C3, + 0x1BA5, 0x95C7, 0x048B, 0x95CA, 0x1BA3, 0x95CC, 0x1BA7, 0x95CD, 0x1BA6, + 0x95D4, 0x1BA9, 0x95D5, 0x1BA8, 0x95D6, 0x1BAA, 0x95D8, 0x0C86, 0x95DA, + 0x3B9D, 0x95DC, 0x1BAB, 0x95E1, 0x1BAC, 0x95E2, 0x1BAE, 0x95E5, 0x1BAD, + 0x961C, 0x0DDE, 0x961D, 0x3B9E, 0x9621, 0x1BAF, 0x9628, 0x1BB0, 0x962A, + 0x0855, 0x962E, 0x1BB1, 0x962F, 0x1BB2, 0x9632, 0x0E77, 0x963B, 0x0ACD, + 0x963F, 0x0468, 0x9640, 0x0B2B, 0x9641, 0x3B9F, 0x9642, 0x1BB3, 0x9644, + 0x0DDF, 0x964B, 0x1BB6, 0x964C, 0x1BB4, 0x964D, 0x07F1, 0x964F, 0x1BB5, + 0x9650, 0x0776, 0x9658, 0x3BA0, 0x965B, 0x0E15, 0x965C, 0x1BB8, 0x965D, + 0x1BBA, 0x965E, 0x1BB9, 0x965F, 0x1BBB, 0x9662, 0x04C3, 0x9663, 0x0A1E, + 0x9664, 0x0986, 0x9665, 0x0615, 0x9666, 0x1BBC, 0x966A, 0x0D1C, 0x966C, + 0x1BBE, 0x9670, 0x04C4, 0x9672, 0x1BBD, 0x9673, 0x0BE0, 0x9675, 0x0F95, + 0x9676, 0x0C83, 0x9677, 0x1BB7, 0x9678, 0x0F6E, 0x967A, 0x0765, 0x967D, + 0x0F45, 0x9684, 0x3BA1, 0x9685, 0x06F1, 0x9686, 0x0F7C, 0x9688, 0x06FE, + 0x968A, 0x0B42, 0x968B, 0x186C, 0x968D, 0x1BBF, 0x968E, 0x058A, 0x968F, + 0x0A35, 0x9694, 0x05B4, 0x9695, 0x1BC1, 0x9697, 0x1BC2, 0x9698, 0x1BC0, + 0x9699, 0x073A, 0x969B, 0x084D, 0x969C, 0x09CB, 0x969D, 0x21F0, 0x96A0, + 0x04C5, 0x96A3, 0x0FA1, 0x96A4, 0x3BA2, 0x96A7, 0x1BC4, 0x96A8, 0x1B0B, + 0x96A9, 0x3BA3, 0x96AA, 0x1BC3, 0x96AF, 0x21F1, 0x96B0, 0x1BC7, 0x96B1, + 0x1BC5, 0x96B2, 0x1BC6, 0x96B4, 0x1BC8, 0x96B6, 0x1BC9, 0x96B7, 0x0FB4, + 0x96B8, 0x1BCA, 0x96B9, 0x1BCB, 0x96BB, 0x0A6D, 0x96BC, 0x0D4F, 0x96C0, + 0x0A43, 0x96C1, 0x0623, 0x96C4, 0x0F24, 0x96C5, 0x056D, 0x96C6, 0x0942, + 0x96C7, 0x078F, 0x96C9, 0x1BCE, 0x96CB, 0x1BCD, 0x96CC, 0x08C1, 0x96CD, + 0x1BCF, 0x96CE, 0x1BCC, 0x96D1, 0x0876, 0x96D2, 0x3BA4, 0x96D5, 0x1BD3, + 0x96D6, 0x1992, 0x96D9, 0x10EB, 0x96DB, 0x0A3D, 0x96DC, 0x1BD1, 0x96DE, + 0x3BA6, 0x96E2, 0x0F6D, 0x96E3, 0x0CC9, 0x96E8, 0x04CD, 0x96E9, 0x3BA7, + 0x96EA, 0x0A87, 0x96EB, 0x08E2, 0x96F0, 0x0E07, 0x96F1, 0x3BA8, 0x96F2, + 0x04E2, 0x96F6, 0x0FB5, 0x96F7, 0x0F55, 0x96F9, 0x1BD4, 0x96FB, 0x0C3F, + 0x9700, 0x0927, 0x9702, 0x3BA9, 0x9704, 0x1BD5, 0x9706, 0x1BD6, 0x9707, + 0x0A12, 0x9708, 0x1BD7, 0x9709, 0x3BAA, 0x970A, 0x0FB6, 0x970D, 0x1BD2, + 0x970E, 0x1BD9, 0x970F, 0x1BDB, 0x9711, 0x1BDA, 0x9713, 0x1BD8, 0x9716, + 0x1BDC, 0x9719, 0x1BDD, 0x971C, 0x0AFC, 0x971E, 0x0562, 0x9724, 0x1BDE, + 0x9727, 0x0EC4, 0x972A, 0x1BDF, 0x9730, 0x1BE0, 0x9732, 0x0FD0, 0x9733, + 0x21F2, 0x9738, 0x1414, 0x9739, 0x1BE1, 0x973B, 0x21F3, 0x973D, 0x1BE2, + 0x973E, 0x1BE3, 0x9742, 0x1BE7, 0x9743, 0x21F4, 0x9744, 0x1BE4, 0x9746, + 0x1BE5, 0x9748, 0x1BE6, 0x9749, 0x1BE8, 0x974D, 0x21F5, 0x974F, 0x21F6, + 0x9751, 0x21F7, 0x9752, 0x0A68, 0x9755, 0x21F8, 0x9756, 0x0F03, 0x9759, + 0x0A69, 0x975A, 0x3BAB, 0x975C, 0x1BE9, 0x975E, 0x0D87, 0x9760, 0x1BEA, + 0x9761, 0x1D06, 0x9762, 0x0ED8, 0x9763, 0x3BAC, 0x9764, 0x1BEB, 0x9766, + 0x1BEC, 0x9768, 0x1BED, 0x9769, 0x05B5, 0x976B, 0x1BEF, 0x976D, 0x0A1F, + 0x976E, 0x3BAD, 0x9771, 0x1BF0, 0x9773, 0x3BAE, 0x9774, 0x06FA, 0x9779, + 0x1BF1, 0x977A, 0x1BF5, 0x977C, 0x1BF3, 0x9781, 0x1BF4, 0x9784, 0x05D1, + 0x9785, 0x1BF2, 0x9786, 0x1BF6, 0x978B, 0x1BF7, 0x978D, 0x048C, 0x978F, + 0x1BF8, 0x9790, 0x1BF9, 0x9798, 0x09CC, 0x979A, 0x3BAF, 0x979C, 0x1BFA, + 0x97A0, 0x0661, 0x97A2, 0x3BB0, 0x97A3, 0x1BFD, 0x97A6, 0x1BFC, 0x97A8, + 0x1BFB, 0x97AB, 0x1A34, 0x97AD, 0x0E2C, 0x97B3, 0x1BFE, 0x97B4, 0x1BFF, + 0x97B5, 0x3BB1, 0x97B6, 0x3BB2, 0x97C3, 0x1C00, 0x97C6, 0x1C01, 0x97C8, + 0x1C02, 0x97CB, 0x1C03, 0x97D3, 0x0616, 0x97D9, 0x3BB3, 0x97DC, 0x1C04, + 0x97DE, 0x3BB4, 0x97ED, 0x1C05, 0x97EE, 0x0CD9, 0x97F2, 0x1C07, 0x97F3, + 0x053B, 0x97F4, 0x3BB5, 0x97F5, 0x1C0A, 0x97F6, 0x1C09, 0x97FB, 0x04C6, + 0x97FF, 0x06B9, 0x9801, 0x0E17, 0x9802, 0x0BD6, 0x9803, 0x0812, 0x9805, + 0x07F2, 0x9806, 0x0971, 0x9808, 0x0A22, 0x980A, 0x3BB6, 0x980C, 0x1C0C, + 0x980E, 0x3BB7, 0x980F, 0x1C0B, 0x9810, 0x0F2C, 0x9811, 0x0624, 0x9812, + 0x0D66, 0x9813, 0x0CB4, 0x9817, 0x0A42, 0x9818, 0x0F96, 0x981A, 0x0731, + 0x981E, 0x3BB8, 0x9821, 0x1C0F, 0x9823, 0x3BB9, 0x9824, 0x1C0E, 0x982B, + 0x3BBA, 0x982C, 0x0E79, 0x982D, 0x0C84, 0x9830, 0x1E73, 0x9834, 0x04F2, + 0x9837, 0x1C10, 0x9838, 0x1C0D, 0x9839, 0x37B3, 0x983B, 0x0DC3, 0x983C, + 0x0F54, 0x983D, 0x1C11, 0x983E, 0x3BBB, 0x9846, 0x1C12, 0x984B, 0x1C14, + 0x984C, 0x0B4A, 0x984D, 0x05B9, 0x984E, 0x05BA, 0x984F, 0x1C13, 0x9852, + 0x3BBC, 0x9853, 0x3BBD, 0x9854, 0x0625, 0x9855, 0x0766, 0x9857, 0x21F9, + 0x9858, 0x0626, 0x9859, 0x3BBE, 0x985A, 0x1E48, 0x985B, 0x0C39, 0x985E, + 0x0FA8, 0x9865, 0x21FA, 0x9867, 0x0790, 0x986B, 0x1C15, 0x986C, 0x3BBF, + 0x986F, 0x1C16, 0x9870, 0x1C17, 0x9871, 0x1C18, 0x9873, 0x1C1A, 0x9874, + 0x1C19, 0x98A8, 0x0DE9, 0x98AA, 0x1C1B, 0x98AF, 0x1C1C, 0x98B1, 0x1C1D, + 0x98B6, 0x1C1E, 0x98B8, 0x3BC0, 0x98BA, 0x3BC1, 0x98BF, 0x3BC2, 0x98C3, + 0x1C20, 0x98C4, 0x1C1F, 0x98C6, 0x1C21, 0x98C8, 0x3BC3, 0x98DB, 0x0D88, + 0x98DC, 0x1839, 0x98DF, 0x09EF, 0x98E0, 0x3618, 0x98E2, 0x064C, 0x98E5, + 0x3BC4, 0x98E9, 0x1C22, 0x98EB, 0x1C23, 0x98ED, 0x10C1, 0x98EE, 0x14DA, + 0x98EF, 0x0D67, 0x98F2, 0x04BF, 0x98F4, 0x047F, 0x98FC, 0x08C2, 0x98FD, + 0x0E5E, 0x98FE, 0x09E6, 0x9903, 0x1C24, 0x9905, 0x0EEB, 0x9909, 0x1C25, + 0x990A, 0x0F46, 0x990C, 0x04E4, 0x9910, 0x088F, 0x9912, 0x1C26, 0x9913, + 0x056E, 0x9914, 0x1C27, 0x9918, 0x1C28, 0x991D, 0x1C2A, 0x991E, 0x1C2B, + 0x9920, 0x1C2D, 0x9921, 0x1C29, 0x9924, 0x1C2C, 0x9927, 0x21FD, 0x9928, + 0x0617, 0x992C, 0x1C2E, 0x992E, 0x1C2F, 0x9932, 0x3BC5, 0x9933, 0x3BC6, + 0x993D, 0x1C30, 0x993E, 0x1C31, 0x9940, 0x3BC7, 0x9942, 0x1C32, 0x9945, + 0x1C34, 0x9949, 0x1C33, 0x994B, 0x1C36, 0x994C, 0x1C39, 0x994D, 0x3BC8, + 0x9950, 0x1C35, 0x9951, 0x1C37, 0x9952, 0x1C38, 0x9955, 0x1C3A, 0x9957, + 0x06BA, 0x995C, 0x3BC9, 0x995F, 0x3BCA, 0x9996, 0x091F, 0x9997, 0x1C3B, + 0x9998, 0x1C3C, 0x9999, 0x07F3, 0x999E, 0x21FF, 0x99A5, 0x1C3D, 0x99A8, + 0x059C, 0x99AC, 0x0D05, 0x99AD, 0x1C3E, 0x99AE, 0x1C3F, 0x99B1, 0x3BCB, + 0x99B3, 0x0B98, 0x99B4, 0x0CC3, 0x99B9, 0x3BCC, 0x99BA, 0x3BCD, 0x99BC, + 0x1C40, 0x99C1, 0x0D33, 0x99C4, 0x0B2C, 0x99C5, 0x04FA, 0x99C6, 0x06E6, + 0x99C8, 0x06E7, 0x99C9, 0x3BCE, 0x99D0, 0x0BB1, 0x99D1, 0x1C45, 0x99D2, + 0x06E8, 0x99D5, 0x056F, 0x99D8, 0x1C44, 0x99DB, 0x1C42, 0x99DD, 0x1C43, + 0x99DF, 0x1C41, 0x99E2, 0x1C4F, 0x99ED, 0x1C46, 0x99EE, 0x1C47, 0x99F1, + 0x1C48, 0x99F2, 0x1C49, 0x99F8, 0x1C4B, 0x99FB, 0x1C4A, 0x99FF, 0x0963, + 0x9A01, 0x1C4C, 0x9A02, 0x3BCF, 0x9A05, 0x1C4E, 0x9A08, 0x37BA, 0x9A0E, + 0x064D, 0x9A0F, 0x1C4D, 0x9A12, 0x0AFD, 0x9A13, 0x0767, 0x9A16, 0x3BD0, + 0x9A19, 0x1C50, 0x9A24, 0x3BD1, 0x9A27, 0x3BD2, 0x9A28, 0x0B2D, 0x9A2B, + 0x1C51, 0x9A2D, 0x3BD3, 0x9A2E, 0x3BD4, 0x9A30, 0x0C85, 0x9A36, 0x3BD5, + 0x9A37, 0x1C52, 0x9A38, 0x3BD6, 0x9A3E, 0x1C57, 0x9A40, 0x1C55, 0x9A42, + 0x1C54, 0x9A43, 0x1C56, 0x9A45, 0x1C53, 0x9A4A, 0x3BD7, 0x9A4D, 0x1C59, + 0x9A4E, 0x2200, 0x9A52, 0x1E2F, 0x9A55, 0x1C58, 0x9A56, 0x3BD8, 0x9A57, + 0x1C5B, 0x9A5A, 0x06BB, 0x9A5B, 0x1C5A, 0x9A5F, 0x1C5C, 0x9A62, 0x1C5D, + 0x9A64, 0x1C5F, 0x9A65, 0x1C5E, 0x9A69, 0x1C60, 0x9A6A, 0x1C62, 0x9A6B, + 0x1C61, 0x9AA8, 0x080E, 0x9AAD, 0x1C63, 0x9AB0, 0x1C64, 0x9AB5, 0x3BD9, + 0x9AB6, 0x3BDA, 0x9AB8, 0x059A, 0x9ABC, 0x1C65, 0x9AC0, 0x1C66, 0x9AC4, + 0x0A37, 0x9ACF, 0x1C67, 0x9AD1, 0x1C68, 0x9AD3, 0x1C69, 0x9AD4, 0x1C6A, + 0x9AD8, 0x07F4, 0x9AD9, 0x2201, 0x9ADC, 0x2202, 0x9ADE, 0x1C6B, 0x9ADF, + 0x1C6C, 0x9AE2, 0x1C6D, 0x9AE3, 0x1C6E, 0x9AE6, 0x1C6F, 0x9AEA, 0x0D45, + 0x9AEB, 0x1C71, 0x9AED, 0x0D98, 0x9AEE, 0x1C72, 0x9AEF, 0x1C70, 0x9AF1, + 0x1C74, 0x9AF4, 0x1C73, 0x9AF7, 0x1C75, 0x9AF9, 0x3BDB, 0x9AFB, 0x1C76, + 0x9B03, 0x3BDC, 0x9B06, 0x1C77, 0x9B18, 0x1C78, 0x9B1A, 0x1C79, 0x9B1F, + 0x1C7A, 0x9B20, 0x3BDD, 0x9B22, 0x1C7B, 0x9B23, 0x1C7C, 0x9B25, 0x1C7D, + 0x9B27, 0x1C7E, 0x9B28, 0x1C7F, 0x9B29, 0x1C80, 0x9B2A, 0x1C81, 0x9B2D, + 0x343C, 0x9B2E, 0x1C82, 0x9B2F, 0x1C83, 0x9B31, 0x14D4, 0x9B32, 0x1C84, + 0x9B33, 0x3BDE, 0x9B34, 0x3BDF, 0x9B3B, 0x17A9, 0x9B3C, 0x064E, 0x9B41, + 0x057F, 0x9B42, 0x0822, 0x9B43, 0x1C86, 0x9B44, 0x1C85, 0x9B45, 0x0EB1, + 0x9B4D, 0x1C88, 0x9B4E, 0x1C89, 0x9B4F, 0x1C87, 0x9B51, 0x1C8A, 0x9B54, + 0x0E90, 0x9B58, 0x1C8B, 0x9B5A, 0x0695, 0x9B6F, 0x0FCB, 0x9B72, 0x2204, + 0x9B73, 0x3BE0, 0x9B74, 0x1C8C, 0x9B75, 0x2203, 0x9B79, 0x3BE1, 0x9B83, + 0x1C8E, 0x9B8E, 0x0482, 0x9B8F, 0x2205, 0x9B91, 0x1C8F, 0x9B92, 0x0DFB, + 0x9B93, 0x1C8D, 0x9B96, 0x1C90, 0x9B97, 0x1C91, 0x9B9F, 0x1C92, 0x9BA0, + 0x1C93, 0x9BA7, 0x3BE2, 0x9BA8, 0x1C94, 0x9BAA, 0x0E9C, 0x9BAB, 0x087B, + 0x9BAD, 0x086A, 0x9BAE, 0x0AB1, 0x9BB1, 0x2206, 0x9BB4, 0x1C95, 0x9BB9, + 0x1C98, 0x9BBB, 0x2207, 0x9BC0, 0x1C96, 0x9BC1, 0x3BE3, 0x9BC6, 0x1C99, + 0x9BC7, 0x3BE4, 0x9BC9, 0x07A5, 0x9BCA, 0x1C97, 0x9BCF, 0x1C9A, 0x9BD1, + 0x1C9B, 0x9BD2, 0x1C9C, 0x9BD4, 0x1CA0, 0x9BD6, 0x0878, 0x9BD7, 0x3BE5, + 0x9BDB, 0x0B44, 0x9BDF, 0x37BF, 0x9BE1, 0x1CA1, 0x9BE2, 0x1C9E, 0x9BE3, + 0x1C9D, 0x9BE4, 0x1C9F, 0x9BE7, 0x3BE6, 0x9BE8, 0x0735, 0x9BEB, 0x3BE7, + 0x9BF0, 0x1CA5, 0x9BF1, 0x1CA4, 0x9BF2, 0x1CA3, 0x9BF5, 0x0477, 0x9BF7, + 0x3BE8, 0x9BFA, 0x3BE9, 0x9BFD, 0x3BEA, 0x9C00, 0x2208, 0x9C04, 0x1CAF, + 0x9C06, 0x1CAB, 0x9C08, 0x1CAC, 0x9C09, 0x1CA8, 0x9C0A, 0x1CAE, 0x9C0B, + 0x3BEB, 0x9C0C, 0x1CAA, 0x9C0D, 0x05C0, 0x9C10, 0x0FF2, 0x9C12, 0x1CAD, + 0x9C13, 0x1CA9, 0x9C14, 0x1CA7, 0x9C15, 0x1CA6, 0x9C1B, 0x1CB1, 0x9C21, + 0x1CB4, 0x9C24, 0x1CB3, 0x9C25, 0x1CB2, 0x9C27, 0x3BEC, 0x9C2A, 0x3BED, + 0x9C2D, 0x0DBB, 0x9C2E, 0x1CB0, 0x9C2F, 0x04B7, 0x9C30, 0x1CB5, 0x9C32, + 0x1CB7, 0x9C36, 0x3BEE, 0x9C39, 0x05CD, 0x9C3A, 0x1CA2, 0x9C3B, 0x04D9, + 0x9C3E, 0x1CB9, 0x9C41, 0x3BEF, 0x9C46, 0x1CB8, 0x9C47, 0x1CB6, 0x9C48, + 0x0B6B, 0x9C52, 0x0E9E, 0x9C53, 0x3BF0, 0x9C57, 0x0FA2, 0x9C5A, 0x1CBA, + 0x9C60, 0x1CBB, 0x9C63, 0x3BF1, 0x9C67, 0x1CBC, 0x9C6A, 0x3BF2, 0x9C76, + 0x1CBD, 0x9C77, 0x3BF3, 0x9C78, 0x1CBE, 0x9CE5, 0x0BD7, 0x9CE7, 0x1CBF, + 0x9CE9, 0x0D4B, 0x9CEB, 0x1CC4, 0x9CEC, 0x1CC0, 0x9CF0, 0x1CC1, 0x9CF3, + 0x0E5F, 0x9CF4, 0x0ED0, 0x9CF6, 0x0CA8, 0x9D02, 0x3BF4, 0x9D03, 0x1CC5, + 0x9D06, 0x1CC6, 0x9D07, 0x0C96, 0x9D08, 0x1CC3, 0x9D09, 0x1CC2, 0x9D0E, + 0x052A, 0x9D12, 0x1CCE, 0x9D15, 0x1CCD, 0x9D1B, 0x0517, 0x9D1F, 0x1CCB, + 0x9D23, 0x1CCA, 0x9D26, 0x1CC8, 0x9D28, 0x05D9, 0x9D2A, 0x1CC7, 0x9D2B, + 0x08DE, 0x9D2C, 0x0529, 0x9D3B, 0x07F5, 0x9D3E, 0x1CD1, 0x9D3F, 0x1CD0, + 0x9D41, 0x1CCF, 0x9D42, 0x3BF5, 0x9D44, 0x1CCC, 0x9D46, 0x1CD2, 0x9D47, + 0x3BF6, 0x9D48, 0x1CD3, 0x9D50, 0x1CD8, 0x9D51, 0x1CD7, 0x9D59, 0x1CD9, + 0x9D5C, 0x04CF, 0x9D5D, 0x1CD4, 0x9D5E, 0x1CD5, 0x9D60, 0x0806, 0x9D61, + 0x0EC5, 0x9D63, 0x3BF7, 0x9D64, 0x1CD6, 0x9D69, 0x3BF8, 0x9D6B, 0x220A, + 0x9D6C, 0x0E60, 0x9D6F, 0x1CDE, 0x9D70, 0x2209, 0x9D72, 0x1CDA, 0x9D7A, + 0x1CDF, 0x9D7C, 0x3BF9, 0x9D7E, 0x3BFA, 0x9D87, 0x1CDC, 0x9D89, 0x1CDB, + 0x9D8D, 0x3BFB, 0x9D8F, 0x0732, 0x9D9A, 0x1CE0, 0x9DA4, 0x1CE1, 0x9DA9, + 0x1CE2, 0x9DAB, 0x1CDD, 0x9DAF, 0x1CC9, 0x9DB1, 0x3BFC, 0x9DB2, 0x1CE3, + 0x9DB4, 0x0BFD, 0x9DB8, 0x1CE7, 0x9DBA, 0x1CE8, 0x9DBB, 0x1CE6, 0x9DC1, + 0x1CE5, 0x9DC2, 0x1CEB, 0x9DC3, 0x3BFD, 0x9DC4, 0x1CE4, 0x9DC6, 0x1CE9, + 0x9DC7, 0x3BFE, 0x9DCF, 0x1CEA, 0x9DD3, 0x1CED, 0x9DD6, 0x3BFF, 0x9DD7, + 0x1DDE, 0x9DD9, 0x1CEC, 0x9DDF, 0x3C00, 0x9DE6, 0x1CEF, 0x9DEB, 0x3C01, + 0x9DED, 0x1CF0, 0x9DEF, 0x1CF1, 0x9DF2, 0x0FEF, 0x9DF4, 0x3C02, 0x9DF8, + 0x1CEE, 0x9DF9, 0x0B4B, 0x9DFA, 0x085D, 0x9DFD, 0x1CF2, 0x9E15, 0x3C03, + 0x9E19, 0x220C, 0x9E1A, 0x1CF3, 0x9E1B, 0x1CF4, 0x9E1D, 0x3C04, 0x9E1E, + 0x1CF5, 0x9E75, 0x1CF6, 0x9E78, 0x0768, 0x9E79, 0x1CF7, 0x9E7C, 0x1DFD, + 0x9E7D, 0x1CF8, 0x9E7F, 0x08DB, 0x9E81, 0x1CF9, 0x9E88, 0x1CFA, 0x9E8B, + 0x1CFB, 0x9E8C, 0x1CFC, 0x9E91, 0x1CFF, 0x9E92, 0x1CFD, 0x9E93, 0x0FE2, + 0x9E95, 0x1CFE, 0x9E97, 0x0FB7, 0x9E9D, 0x1D00, 0x9E9F, 0x0FA3, 0x9EA4, + 0x3C05, 0x9EA5, 0x1D01, 0x9EA6, 0x0D34, 0x9EA8, 0x3C06, 0x9EA9, 0x1D02, + 0x9EAA, 0x1D04, 0x9EAC, 0x3C07, 0x9EAD, 0x1D05, 0x9EB4, 0x1E02, 0x9EB5, + 0x1E75, 0x9EB8, 0x1D03, 0x9EB9, 0x07FF, 0x9EBA, 0x0ED9, 0x9EBB, 0x0E91, + 0x9EBC, 0x1284, 0x9EBE, 0x14FF, 0x9EBF, 0x0EA9, 0x9EC3, 0x340B, 0x9EC4, + 0x052B, 0x9ECC, 0x1D07, 0x9ECD, 0x066A, 0x9ECE, 0x1D08, 0x9ECF, 0x1D09, + 0x9ED0, 0x1D0A, 0x9ED1, 0x220D, 0x9ED2, 0x0807, 0x9ED4, 0x1D0B, 0x9ED8, + 0x160D, 0x9ED9, 0x0EE7, 0x9EDB, 0x0B43, 0x9EDC, 0x1D0C, 0x9EDD, 0x1D0E, + 0x9EDE, 0x1D0D, 0x9EE0, 0x1D0F, 0x9EE5, 0x1D10, 0x9EE7, 0x3C08, 0x9EE8, + 0x1D11, 0x9EEE, 0x3C09, 0x9EEF, 0x1D12, 0x9EF4, 0x1D13, 0x9EF6, 0x1D14, + 0x9EF7, 0x1D15, 0x9EF9, 0x1D16, 0x9EFB, 0x1D17, 0x9EFC, 0x1D18, 0x9EFD, + 0x1D19, 0x9F07, 0x1D1A, 0x9F08, 0x1D1B, 0x9F0E, 0x0C1E, 0x9F10, 0x3C0A, + 0x9F12, 0x3C0B, 0x9F13, 0x0791, 0x9F15, 0x1D1D, 0x9F17, 0x3C0C, 0x9F19, + 0x3C0D, 0x9F20, 0x0ACF, 0x9F21, 0x1D1E, 0x9F2C, 0x1D1F, 0x9F2F, 0x3C0E, + 0x9F37, 0x3C0F, 0x9F39, 0x3C10, 0x9F3B, 0x0D93, 0x9F3E, 0x1D20, 0x9F41, + 0x3C11, 0x9F45, 0x3C12, 0x9F4A, 0x1D21, 0x9F4B, 0x170A, 0x9F4E, 0x1A7B, + 0x9F4F, 0x1C06, 0x9F52, 0x1D22, 0x9F54, 0x1D23, 0x9F57, 0x3C13, 0x9F5F, + 0x1D25, 0x9F60, 0x1D26, 0x9F61, 0x1D27, 0x9F62, 0x0FB8, 0x9F63, 0x1D24, + 0x9F66, 0x1D28, 0x9F67, 0x1D29, 0x9F68, 0x3C14, 0x9F6A, 0x1D2B, 0x9F6C, + 0x1D2A, 0x9F71, 0x3C15, 0x9F72, 0x1D2D, 0x9F75, 0x3C16, 0x9F76, 0x1D2E, + 0x9F77, 0x1D2C, 0x9F8D, 0x0F7E, 0x9F90, 0x3C17, 0x9F94, 0x3C18, 0x9F95, + 0x1D2F, 0x9F9C, 0x1D30, 0x9F9D, 0x1727, 0x9FA0, 0x1D31, 0x9FA2, 0x3C19, + 0xF929, 0x2129, 0xF9DC, 0x21EE, 0xFA0E, 0x20DA, 0xFA0F, 0x20E5, 0xFA10, + 0x20E6, 0xFA11, 0x20FB, 0xFA12, 0x2121, 0xFA13, 0x2131, 0xFA14, 0x2133, + 0xFA15, 0x215E, 0xFA16, 0x2164, 0xFA17, 0x217B, 0xFA18, 0x2183, 0xFA19, + 0x2184, 0xFA1A, 0x2185, 0xFA1B, 0x2187, 0xFA1C, 0x218B, 0xFA1D, 0x218E, + 0xFA1E, 0x2197, 0xFA1F, 0x21A2, 0xFA20, 0x21A4, 0xFA21, 0x21A5, 0xFA22, + 0x21AE, 0xFA23, 0x21B6, 0xFA24, 0x21B8, 0xFA25, 0x21B9, 0xFA26, 0x21BC, + 0xFA27, 0x21D8, 0xFA28, 0x21DF, 0xFA29, 0x21EF, 0xFA2A, 0x21FB, 0xFA2B, + 0x21FC, 0xFA2C, 0x21FE, 0xFA2D, 0x220B, 0xFB00, 0x248E, 0xFB01, 0x0070, + 0xFB02, 0x0071, 0xFB03, 0x248F, 0xFB04, 0x2490, 0xFE30, 0x1EDA, 0xFE31, + 0x1ED4, 0xFE32, 0x1ED5, 0xFE33, 0x1ED2, 0xFE35, 0x1EDB, 0xFE36, 0x1EDC, + 0xFE37, 0x1EE1, 0xFE38, 0x1EE2, 0xFE39, 0x1EDD, 0xFE3A, 0x1EDE, 0xFE3B, + 0x1EEB, 0xFE3C, 0x1EEC, 0xFE3D, 0x1EE5, 0xFE3E, 0x1EE6, 0xFE3F, 0x1EE3, + 0xFE40, 0x1EE4, 0xFE41, 0x1EE7, 0xFE42, 0x1EE8, 0xFE43, 0x1EE9, 0xFE44, + 0x1EEA, 0xFF01, 0x0282, 0xFF02, 0x1F47, 0xFF03, 0x02CC, 0xFF04, 0x02C8, + 0xFF05, 0x02CB, 0xFF06, 0x02CD, 0xFF07, 0x1F46, 0xFF08, 0x02A2, 0xFF09, + 0x02A3, 0xFF0A, 0x02CE, 0xFF0B, 0x02B4, 0xFF0C, 0x027C, 0xFF0D, 0x02B5, + 0xFF0E, 0x027D, 0xFF0F, 0x0297, 0xFF10, 0x030C, 0xFF11, 0x030D, 0xFF12, + 0x030E, 0xFF13, 0x030F, 0xFF14, 0x0310, 0xFF15, 0x0311, 0xFF16, 0x0312, + 0xFF17, 0x0313, 0xFF18, 0x0314, 0xFF19, 0x0315, 0xFF1A, 0x027F, 0xFF1B, + 0x0280, 0xFF1C, 0x02BB, 0xFF1D, 0x02B9, 0xFF1E, 0x02BC, 0xFF1F, 0x0281, + 0xFF20, 0x02CF, 0xFF21, 0x0316, 0xFF22, 0x0317, 0xFF23, 0x0318, 0xFF24, + 0x0319, 0xFF25, 0x031A, 0xFF26, 0x031B, 0xFF27, 0x031C, 0xFF28, 0x031D, + 0xFF29, 0x031E, 0xFF2A, 0x031F, 0xFF2B, 0x0320, 0xFF2C, 0x0321, 0xFF2D, + 0x0322, 0xFF2E, 0x0323, 0xFF2F, 0x0324, 0xFF30, 0x0325, 0xFF31, 0x0326, + 0xFF32, 0x0327, 0xFF33, 0x0328, 0xFF34, 0x0329, 0xFF35, 0x032A, 0xFF36, + 0x032B, 0xFF37, 0x032C, 0xFF38, 0x032D, 0xFF39, 0x032E, 0xFF3A, 0x032F, + 0xFF3B, 0x02A6, 0xFF3C, 0x0298, 0xFF3D, 0x02A7, 0xFF3E, 0x0288, 0xFF3F, + 0x028A, 0xFF40, 0x0286, 0xFF41, 0x0330, 0xFF42, 0x0331, 0xFF43, 0x0332, + 0xFF44, 0x0333, 0xFF45, 0x0334, 0xFF46, 0x0335, 0xFF47, 0x0336, 0xFF48, + 0x0337, 0xFF49, 0x0338, 0xFF4A, 0x0339, 0xFF4B, 0x033A, 0xFF4C, 0x033B, + 0xFF4D, 0x033C, 0xFF4E, 0x033D, 0xFF4F, 0x033E, 0xFF50, 0x033F, 0xFF51, + 0x0340, 0xFF52, 0x0341, 0xFF53, 0x0342, 0xFF54, 0x0343, 0xFF55, 0x0344, + 0xFF56, 0x0345, 0xFF57, 0x0346, 0xFF58, 0x0347, 0xFF59, 0x0348, 0xFF5A, + 0x0349, 0xFF5B, 0x02A8, 0xFF5C, 0x029B, 0xFF5D, 0x02A9, 0xFF5E, 0x0299, + 0xFF61, 0x0147, 0xFF62, 0x0148, 0xFF63, 0x0149, 0xFF64, 0x014A, 0xFF65, + 0x014B, 0xFF66, 0x014C, 0xFF67, 0x014D, 0xFF68, 0x014E, 0xFF69, 0x014F, + 0xFF6A, 0x0150, 0xFF6B, 0x0151, 0xFF6C, 0x0152, 0xFF6D, 0x0153, 0xFF6E, + 0x0154, 0xFF6F, 0x0155, 0xFF70, 0x0156, 0xFF71, 0x0157, 0xFF72, 0x0158, + 0xFF73, 0x0159, 0xFF74, 0x015A, 0xFF75, 0x015B, 0xFF76, 0x015C, 0xFF77, + 0x015D, 0xFF78, 0x015E, 0xFF79, 0x015F, 0xFF7A, 0x0160, 0xFF7B, 0x0161, + 0xFF7C, 0x0162, 0xFF7D, 0x0163, 0xFF7E, 0x0164, 0xFF7F, 0x0165, 0xFF80, + 0x0166, 0xFF81, 0x0167, 0xFF82, 0x0168, 0xFF83, 0x0169, 0xFF84, 0x016A, + 0xFF85, 0x016B, 0xFF86, 0x016C, 0xFF87, 0x016D, 0xFF88, 0x016E, 0xFF89, + 0x016F, 0xFF8A, 0x0170, 0xFF8B, 0x0171, 0xFF8C, 0x0172, 0xFF8D, 0x0173, + 0xFF8E, 0x0174, 0xFF8F, 0x0175, 0xFF90, 0x0176, 0xFF91, 0x0177, 0xFF92, + 0x0178, 0xFF93, 0x0179, 0xFF94, 0x017A, 0xFF95, 0x017B, 0xFF96, 0x017C, + 0xFF97, 0x017D, 0xFF98, 0x017E, 0xFF99, 0x017F, 0xFF9A, 0x0180, 0xFF9B, + 0x0181, 0xFF9C, 0x0182, 0xFF9D, 0x0183, 0xFF9E, 0x0184, 0xFF9F, 0x0185, + 0xFFE0, 0x02C9, 0xFFE1, 0x02CA, 0xFFE2, 0x02EF, 0xFFE3, 0x0289, 0xFFE4, + 0x1F45, 0xFFE5, 0x02C7, 0xFFE8, 0x0143, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-V_4.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-V_4.cpp new file mode 100644 index 000000000000..0e6b215648da --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/UniJIS-UCS2-V_4.cpp @@ -0,0 +1,66 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_UniJIS_UCS2_V_4[251 * 2] = { + 0x00B0, 0x204D, 0x2010, 0x1ED5, 0x2015, 0x1ED4, 0x2016, 0x1ED7, 0x2018, + 0x2059, 0x2019, 0x205A, 0x201C, 0x2057, 0x201D, 0x2058, 0x2025, 0x1EDA, + 0x2026, 0x1ED9, 0x2032, 0x2051, 0x2033, 0x205B, 0x2190, 0x02E2, 0x2191, + 0x02E0, 0x2192, 0x02E3, 0x2193, 0x02E1, 0x2195, 0x2FB6, 0x21C4, 0x2077, + 0x21C5, 0x2076, 0x21C6, 0x2078, 0x21E6, 0x1F4C, 0x21E7, 0x1F4E, 0x21E8, + 0x1F4B, 0x21E9, 0x1F4D, 0x2225, 0x1ED7, 0x223C, 0x1ED6, 0x22EF, 0x1ED9, + 0x2500, 0x1D39, 0x2501, 0x1D3A, 0x2502, 0x1D37, 0x2503, 0x1D38, 0x2504, + 0x1D3D, 0x2505, 0x1D3E, 0x2506, 0x1D3B, 0x2507, 0x1D3C, 0x2508, 0x1D41, + 0x2509, 0x1D42, 0x250A, 0x1D3F, 0x250B, 0x1D40, 0x250C, 0x1D47, 0x250D, + 0x1D49, 0x250E, 0x1D48, 0x250F, 0x1D4A, 0x2510, 0x1D4F, 0x2511, 0x1D51, + 0x2512, 0x1D50, 0x2513, 0x1D52, 0x2514, 0x1D43, 0x2515, 0x1D45, 0x2516, + 0x1D44, 0x2517, 0x1D46, 0x2518, 0x1D4B, 0x2519, 0x1D4D, 0x251A, 0x1D4C, + 0x251B, 0x1D4E, 0x251C, 0x1D63, 0x251D, 0x1D67, 0x251E, 0x1D65, 0x251F, + 0x1D64, 0x2520, 0x1D66, 0x2521, 0x1D69, 0x2522, 0x1D68, 0x2523, 0x1D6A, + 0x2524, 0x1D6B, 0x2525, 0x1D6F, 0x2526, 0x1D6D, 0x2527, 0x1D6C, 0x2528, + 0x1D6E, 0x2529, 0x1D71, 0x252A, 0x1D70, 0x252B, 0x1D72, 0x252C, 0x1D5B, + 0x252D, 0x1D5D, 0x252E, 0x1D5E, 0x252F, 0x1D5F, 0x2530, 0x1D5C, 0x2531, + 0x1D60, 0x2532, 0x1D61, 0x2533, 0x1D62, 0x2534, 0x1D53, 0x2535, 0x1D55, + 0x2536, 0x1D56, 0x2537, 0x1D57, 0x2538, 0x1D54, 0x2539, 0x1D58, 0x253A, + 0x1D59, 0x253B, 0x1D5A, 0x253D, 0x1D77, 0x253E, 0x1D78, 0x253F, 0x1D79, + 0x2540, 0x1D75, 0x2541, 0x1D74, 0x2542, 0x1D76, 0x2543, 0x1D7B, 0x2544, + 0x1D7D, 0x2545, 0x1D7A, 0x2546, 0x1D7C, 0x2547, 0x1D81, 0x2548, 0x1D80, + 0x2549, 0x1D7E, 0x254A, 0x1D7F, 0x261C, 0x201D, 0x261D, 0x201B, 0x261E, + 0x201E, 0x261F, 0x201C, 0x2702, 0x2F92, 0x27A1, 0x2011, 0x3001, 0x1ECF, + 0x3002, 0x1ED0, 0x3008, 0x1EE3, 0x3009, 0x1EE4, 0x300A, 0x1EE5, 0x300B, + 0x1EE6, 0x300C, 0x1EE7, 0x300D, 0x1EE8, 0x300E, 0x1EE9, 0x300F, 0x1EEA, + 0x3010, 0x1EEB, 0x3011, 0x1EEC, 0x3013, 0x204E, 0x3014, 0x1EDD, 0x3015, + 0x1EDE, 0x301C, 0x1ED6, 0x301D, 0x1F14, 0x301F, 0x1F15, 0x3041, 0x1EEE, + 0x3043, 0x1EEF, 0x3045, 0x1EF0, 0x3047, 0x1EF1, 0x3049, 0x1EF2, 0x3063, + 0x1EF3, 0x3083, 0x1EF4, 0x3085, 0x1EF5, 0x3087, 0x1EF6, 0x308E, 0x1EF7, + 0x309B, 0x2050, 0x309C, 0x204F, 0x30A1, 0x1EF8, 0x30A3, 0x1EF9, 0x30A5, + 0x1EFA, 0x30A7, 0x1EFB, 0x30A9, 0x1EFC, 0x30C3, 0x1EFD, 0x30E3, 0x1EFE, + 0x30E5, 0x1EFF, 0x30E7, 0x1F00, 0x30EE, 0x1F01, 0x30F5, 0x1F02, 0x30F6, + 0x1F03, 0x30FC, 0x1ED3, 0x3300, 0x209E, 0x3301, 0x2EB6, 0x3302, 0x2EB7, + 0x3303, 0x2092, 0x3304, 0x2EB8, 0x3305, 0x208D, 0x3306, 0x2EB9, 0x3307, + 0x2EBD, 0x3308, 0x2EBB, 0x3309, 0x2EC0, 0x330A, 0x2EBE, 0x330B, 0x2EC2, + 0x330C, 0x2EC4, 0x330D, 0x1F0E, 0x330E, 0x2EC5, 0x330F, 0x2EC6, 0x3310, + 0x2EC7, 0x3311, 0x2EC8, 0x3312, 0x2EC9, 0x3313, 0x2ECA, 0x3314, 0x1F05, + 0x3315, 0x2094, 0x3316, 0x208A, 0x3317, 0x2ECC, 0x3318, 0x2093, 0x3319, + 0x2ECE, 0x331A, 0x2ED0, 0x331B, 0x2ED1, 0x331C, 0x2ED2, 0x331D, 0x2ED3, + 0x331E, 0x20A1, 0x331F, 0x2ED4, 0x3320, 0x2ED5, 0x3321, 0x2ED6, 0x3322, + 0x2089, 0x3323, 0x209C, 0x3324, 0x2ED7, 0x3325, 0x2ED9, 0x3326, 0x1F0F, + 0x3327, 0x1F09, 0x3328, 0x2EDC, 0x3329, 0x2EDD, 0x332A, 0x20A4, 0x332B, + 0x1F11, 0x332D, 0x2EDF, 0x332E, 0x2EE2, 0x332F, 0x2EE3, 0x3330, 0x2EE4, + 0x3331, 0x20A6, 0x3332, 0x2EE5, 0x3333, 0x208E, 0x3334, 0x2EE8, 0x3335, + 0x2EE9, 0x3336, 0x1F0B, 0x3337, 0x2EEE, 0x3338, 0x2EF0, 0x3339, 0x2097, + 0x333A, 0x2EF1, 0x333B, 0x209D, 0x333C, 0x2EEA, 0x333D, 0x2EF2, 0x333E, + 0x2EF4, 0x333F, 0x2EF5, 0x3340, 0x2EF6, 0x3341, 0x2EF3, 0x3342, 0x209B, + 0x3343, 0x2EF7, 0x3344, 0x2EF8, 0x3345, 0x2EF9, 0x3346, 0x2EFA, 0x3347, + 0x20A5, 0x3348, 0x2EFB, 0x3349, 0x1F04, 0x334A, 0x1F12, 0x334B, 0x2EFC, + 0x334C, 0x2EFD, 0x334D, 0x1F07, 0x334E, 0x2091, 0x334F, 0x2EFE, 0x3350, + 0x2EFF, 0x3351, 0x1F0C, 0x3352, 0x2F02, 0x3353, 0x2F06, 0x3354, 0x2F03, + 0x3355, 0x2F07, 0x3356, 0x2F08, 0x3357, 0x2098, 0x337F, 0x2084, 0xFF08, + 0x1EDB, 0xFF09, 0x1EDC, 0xFF0C, 0x204C, 0xFF0E, 0x2052, 0xFF1D, 0x1EED, + 0xFF3B, 0x1EDF, 0xFF3D, 0x1EE0, 0xFF3F, 0x1ED2, 0xFF5B, 0x1EE1, 0xFF5C, + 0x1ED8, 0xFF5D, 0x1EE2, 0xFF5E, 0x1ED6, 0xFFE3, 0x1ED1, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/V_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/V_1.cpp new file mode 100644 index 000000000000..645e1effca12 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/V_1.cpp @@ -0,0 +1,19 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +const uint16_t g_FXCMAP_V_1[27 * 3] = { + 0x2122, 0x2123, 0x1ECF, 0x2131, 0x2132, 0x1ED1, 0x213C, 0x213E, 0x1ED3, + 0x2141, 0x2145, 0x1ED6, 0x214A, 0x215B, 0x1EDB, 0x2161, 0x2161, 0x1EED, + 0x2421, 0x2421, 0x1EEE, 0x2423, 0x2423, 0x1EEF, 0x2425, 0x2425, 0x1EF0, + 0x2427, 0x2427, 0x1EF1, 0x2429, 0x2429, 0x1EF2, 0x2443, 0x2443, 0x1EF3, + 0x2463, 0x2463, 0x1EF4, 0x2465, 0x2465, 0x1EF5, 0x2467, 0x2467, 0x1EF6, + 0x246E, 0x246E, 0x1EF7, 0x2521, 0x2521, 0x1EF8, 0x2523, 0x2523, 0x1EF9, + 0x2525, 0x2525, 0x1EFA, 0x2527, 0x2527, 0x1EFB, 0x2529, 0x2529, 0x1EFC, + 0x2543, 0x2543, 0x1EFD, 0x2563, 0x2563, 0x1EFE, 0x2565, 0x2565, 0x1EFF, + 0x2567, 0x2567, 0x1F00, 0x256E, 0x256E, 0x1F01, 0x2575, 0x2576, 0x1F02, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/cmaps_japan1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/cmaps_japan1.cpp new file mode 100644 index 000000000000..bdf65595ad49 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/cmaps_japan1.cpp @@ -0,0 +1,68 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Japan1/cmaps_japan1.h" + +#include "core/fpdfapi/cmaps/cmap_int.h" +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/font/font_int.h" +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fxcrt/fx_basic.h" + +static const FXCMAP_CMap g_FXCMAP_Japan1_cmaps[] = { + {"83pv-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_83pv_RKSJ_H_1, 222, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"90ms-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_90ms_RKSJ_H_2, 171, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"90ms-RKSJ-V", FXCMAP_CMap::Range, g_FXCMAP_90ms_RKSJ_V_2, 78, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"90msp-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_90msp_RKSJ_H_2, 170, + FXCMAP_CMap::None, nullptr, 0, -2}, + {"90msp-RKSJ-V", FXCMAP_CMap::Range, g_FXCMAP_90msp_RKSJ_V_2, 78, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"90pv-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_90pv_RKSJ_H_1, 263, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"Add-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_Add_RKSJ_H_1, 635, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"Add-RKSJ-V", FXCMAP_CMap::Range, g_FXCMAP_Add_RKSJ_V_1, 57, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"EUC-H", FXCMAP_CMap::Range, g_FXCMAP_EUC_H_1, 120, FXCMAP_CMap::None, + nullptr, 0, 0}, + {"EUC-V", FXCMAP_CMap::Range, g_FXCMAP_EUC_V_1, 27, FXCMAP_CMap::None, + nullptr, 0, -1}, + {"Ext-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_Ext_RKSJ_H_2, 665, + FXCMAP_CMap::None, nullptr, 0, -4}, + {"Ext-RKSJ-V", FXCMAP_CMap::Range, g_FXCMAP_Ext_RKSJ_V_2, 39, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"H", FXCMAP_CMap::Range, g_FXCMAP_H_1, 118, FXCMAP_CMap::None, nullptr, 0, + 0}, + {"V", FXCMAP_CMap::Range, g_FXCMAP_V_1, 27, FXCMAP_CMap::None, nullptr, 0, + -1}, + {"UniJIS-UCS2-H", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_H_4, 9772, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"UniJIS-UCS2-V", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_V_4, 251, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"UniJIS-UCS2-HW-H", FXCMAP_CMap::Range, g_FXCMAP_UniJIS_UCS2_HW_H_4, 4, + FXCMAP_CMap::None, nullptr, 0, -2}, + {"UniJIS-UCS2-HW-V", FXCMAP_CMap::Range, g_FXCMAP_UniJIS_UCS2_HW_V_4, 199, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"UniJIS-UTF16-H", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_H_4, 9772, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"UniJIS-UTF16-V", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_V_4, 251, + FXCMAP_CMap::None, nullptr, 0, -1}, +}; + +void CPDF_ModuleMgr::LoadEmbeddedJapan1CMaps() { + CPDF_FontGlobals* pFontGlobals = + CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); + pFontGlobals->m_EmbeddedCharsets[CIDSET_JAPAN1].m_pMapList = + g_FXCMAP_Japan1_cmaps; + pFontGlobals->m_EmbeddedCharsets[CIDSET_JAPAN1].m_Count = + FX_ArraySize(g_FXCMAP_Japan1_cmaps); + pFontGlobals->m_EmbeddedToUnicodes[CIDSET_JAPAN1].m_pMap = + g_FXCMAP_Japan1CID2Unicode_4; + pFontGlobals->m_EmbeddedToUnicodes[CIDSET_JAPAN1].m_Count = 15444; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/cmaps_japan1.h b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/cmaps_japan1.h new file mode 100644 index 000000000000..27777f2decef --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Japan1/cmaps_japan1.h @@ -0,0 +1,35 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_CMAPS_JAPAN1_CMAPS_JAPAN1_H_ +#define CORE_FPDFAPI_CMAPS_JAPAN1_CMAPS_JAPAN1_H_ + +#include + +extern const uint16_t g_FXCMAP_83pv_RKSJ_H_1[]; +extern const uint16_t g_FXCMAP_90ms_RKSJ_H_2[]; +extern const uint16_t g_FXCMAP_90ms_RKSJ_V_2[]; +extern const uint16_t g_FXCMAP_90msp_RKSJ_H_2[]; +extern const uint16_t g_FXCMAP_90msp_RKSJ_V_2[]; +extern const uint16_t g_FXCMAP_90pv_RKSJ_H_1[]; +extern const uint16_t g_FXCMAP_Add_RKSJ_H_1[]; +extern const uint16_t g_FXCMAP_Add_RKSJ_V_1[]; +extern const uint16_t g_FXCMAP_EUC_H_1[]; +extern const uint16_t g_FXCMAP_EUC_V_1[]; +extern const uint16_t g_FXCMAP_Ext_RKSJ_H_2[]; +extern const uint16_t g_FXCMAP_Ext_RKSJ_V_2[]; +extern const uint16_t g_FXCMAP_H_1[]; +extern const uint16_t g_FXCMAP_V_1[]; +extern const uint16_t g_FXCMAP_UniJIS_UCS2_H_4[]; +extern const uint16_t g_FXCMAP_UniJIS_UCS2_V_4[]; +extern const uint16_t g_FXCMAP_UniJIS_UCS2_HW_H_4[]; +extern const uint16_t g_FXCMAP_UniJIS_UCS2_HW_V_4[]; +extern const uint16_t g_FXCMAP_UniJIS_UTF16_H_0[]; +extern const uint16_t g_FXCMAP_UniJIS_UTF16_H_0_DWord[]; +extern const uint16_t g_FXCMAP_UniJIS_UTF16_V_0[]; +extern const uint16_t g_FXCMAP_Japan1CID2Unicode_4[]; + +#endif // CORE_FPDFAPI_CMAPS_JAPAN1_CMAPS_JAPAN1_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp new file mode 100644 index 000000000000..3f81ff9447fa --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp @@ -0,0 +1,2050 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Korea1/cmaps_korea1.h" + +const uint16_t g_FXCMAP_Korea1CID2Unicode_2[18352] = { + 0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, + 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, + 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, + 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, + 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, + 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, + 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, + 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x20A9, 0x2010, 0x00A9, + 0x2122, 0x22EF, 0x3000, 0x3001, 0x3002, 0x00B7, 0x2025, 0x2026, 0x00A8, + 0x3003, 0x2013, 0x2014, 0x2016, 0xFF3C, 0x223C, 0x2018, 0x2019, 0x201C, + 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, + 0x300E, 0x300F, 0x3010, 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2260, 0x2264, + 0x2265, 0x221E, 0x2234, 0x00B0, 0x2032, 0x2033, 0x2103, 0x212B, 0xFFE0, + 0xFFE1, 0xFFE5, 0x2642, 0x2640, 0x2220, 0x22A5, 0x2312, 0x2202, 0x2207, + 0x2261, 0x2252, 0x00A7, 0x203B, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, + 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x2192, + 0x2190, 0x2191, 0x2193, 0x2194, 0x3013, 0x226A, 0x226B, 0x221A, 0x223D, + 0x221D, 0x2235, 0x222B, 0x222C, 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, + 0x2283, 0x222A, 0x2229, 0x2227, 0x2228, 0xFFE2, 0x21D2, 0x21D4, 0x2200, + 0x2203, 0x00B4, 0x02DC, 0x02C7, 0x02D8, 0x02DD, 0x02DA, 0x02D9, 0x00B8, + 0x02DB, 0x00A1, 0x00BF, 0x2236, 0x222E, 0x2211, 0x220F, 0x00A4, 0x2109, + 0x2030, 0x25C1, 0x25C0, 0x25B7, 0x25B6, 0x2664, 0x2660, 0x2661, 0x2665, + 0x2667, 0x2663, 0x2299, 0x25C8, 0x25A3, 0x25D0, 0x25D1, 0x2592, 0x25A4, + 0x25A5, 0x25A8, 0x25A7, 0x25A6, 0x25A9, 0x2668, 0x260F, 0x260E, 0x261C, + 0x261E, 0x00B6, 0x2020, 0x2021, 0x2195, 0x2197, 0x2199, 0x2196, 0x2198, + 0x266D, 0x2669, 0x266A, 0x266C, 0x327F, 0x321C, 0x2116, 0x33C7, 0x2122, + 0x33C2, 0x33D8, 0x2121, 0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, + 0xFF07, 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, + 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, + 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, 0xFF21, + 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, + 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, + 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFFE6, + 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, + 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, + 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, + 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0x3131, 0x3132, + 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313A, 0x313B, + 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, + 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A, 0x314B, 0x314C, 0x314D, + 0x314E, 0x314F, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, + 0x3157, 0x3158, 0x3159, 0x315A, 0x315B, 0x315C, 0x315D, 0x315E, 0x315F, + 0x3160, 0x3161, 0x3162, 0x3163, 0x3165, 0x3166, 0x3167, 0x3168, 0x3169, + 0x316A, 0x316B, 0x316C, 0x316D, 0x316E, 0x316F, 0x3170, 0x3171, 0x3172, + 0x3173, 0x3174, 0x3175, 0x3176, 0x3177, 0x3178, 0x3179, 0x317A, 0x317B, + 0x317C, 0x317D, 0x317E, 0x317F, 0x3180, 0x3181, 0x3182, 0x3183, 0x3184, + 0x3185, 0x3186, 0x3187, 0x3188, 0x3189, 0x318A, 0x318B, 0x318C, 0x318D, + 0x318E, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, + 0x2178, 0x2179, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, + 0x2167, 0x2168, 0x2169, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, + 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, + 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, + 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, + 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x2500, 0x2502, 0x250C, + 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, + 0x2503, 0x250F, 0x2513, 0x251B, 0x2517, 0x2523, 0x2533, 0x252B, 0x253B, + 0x254B, 0x2520, 0x252F, 0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, + 0x2538, 0x2542, 0x2512, 0x2511, 0x251A, 0x2519, 0x2516, 0x2515, 0x250E, + 0x250D, 0x251E, 0x251F, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252A, + 0x252D, 0x252E, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253A, 0x253D, + 0x253E, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, + 0x2549, 0x254A, 0x3395, 0x3396, 0x3397, 0x2113, 0x3398, 0x33C4, 0x33A3, + 0x33A4, 0x33A5, 0x33A6, 0x3399, 0x339A, 0x339B, 0x339C, 0x339D, 0x339E, + 0x339F, 0x33A0, 0x33A1, 0x33A2, 0x33CA, 0x338D, 0x338E, 0x338F, 0x33CF, + 0x3388, 0x3389, 0x33C8, 0x33A7, 0x33A8, 0x33B0, 0x33B1, 0x33B2, 0x33B3, + 0x33B4, 0x33B5, 0x33B6, 0x33B7, 0x33B8, 0x33B9, 0x3380, 0x3381, 0x3382, + 0x3383, 0x3384, 0x33BA, 0x33BB, 0x33BC, 0x33BD, 0x33BE, 0x33BF, 0x3390, + 0x3391, 0x3392, 0x3393, 0x3394, 0x2126, 0x33C0, 0x33C1, 0x338A, 0x338B, + 0x338C, 0x33D6, 0x33C5, 0x33AD, 0x33AE, 0x33AF, 0x33DB, 0x33A9, 0x33AA, + 0x33AB, 0x33AC, 0x33DD, 0x33D0, 0x33D3, 0x33C3, 0x33C9, 0x33DC, 0x33C6, + 0x00C6, 0x00D0, 0x00AA, 0x0126, 0x0132, 0x013F, 0x0141, 0x00D8, 0x0152, + 0x00BA, 0x00DE, 0x0166, 0x014A, 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, + 0x3265, 0x3266, 0x3267, 0x3268, 0x3269, 0x326A, 0x326B, 0x326C, 0x326D, + 0x326E, 0x326F, 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, + 0x3277, 0x3278, 0x3279, 0x327A, 0x327B, 0x24D0, 0x24D1, 0x24D2, 0x24D3, + 0x24D4, 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, 0x24DC, + 0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3, 0x24E4, 0x24E5, + 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, + 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246A, 0x246B, 0x246C, 0x246D, + 0x246E, 0x00BD, 0x2153, 0x2154, 0x00BC, 0x00BE, 0x215B, 0x215C, 0x215D, + 0x215E, 0x00E6, 0x0111, 0x00F0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0140, + 0x0142, 0x00F8, 0x0153, 0x00DF, 0x00FE, 0x0167, 0x014B, 0x0149, 0x3200, + 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206, 0x3207, 0x3208, 0x3209, + 0x320A, 0x320B, 0x320C, 0x320D, 0x320E, 0x320F, 0x3210, 0x3211, 0x3212, + 0x3213, 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, 0x3219, 0x321A, 0x321B, + 0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, 0x24A1, 0x24A2, 0x24A3, 0x24A4, + 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24AA, 0x24AB, 0x24AC, 0x24AD, + 0x24AE, 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3, 0x24B4, 0x24B5, 0x2474, + 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, + 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x00B9, 0x00B2, 0x00B3, 0x2074, + 0x207F, 0x2081, 0x2082, 0x2083, 0x2084, 0x3041, 0x3042, 0x3043, 0x3044, + 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, + 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, + 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, + 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, + 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, + 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, + 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, + 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, + 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2, + 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, + 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, + 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, + 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, + 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, + 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, + 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, + 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, + 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, + 0x30F4, 0x30F5, 0x30F6, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, + 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, + 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, + 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, + 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, + 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0xAC00, 0xAC01, 0xAC04, + 0xAC07, 0xAC08, 0xAC09, 0xAC0A, 0xAC10, 0xAC11, 0xAC12, 0xAC13, 0xAC14, + 0xAC15, 0xAC16, 0xAC17, 0xAC19, 0xAC1A, 0xAC1B, 0xAC1C, 0xAC1D, 0xAC20, + 0xAC24, 0xAC2C, 0xAC2D, 0xAC2F, 0xAC30, 0xAC31, 0xAC38, 0xAC39, 0xAC3C, + 0xAC40, 0xAC4B, 0xAC4D, 0xAC54, 0xAC58, 0xAC5C, 0xAC70, 0xAC71, 0xAC74, + 0xAC77, 0xAC78, 0xAC7A, 0xAC80, 0xAC81, 0xAC83, 0xAC84, 0xAC85, 0xAC86, + 0xAC89, 0xAC8A, 0xAC8B, 0xAC8C, 0xAC90, 0xAC94, 0xAC9C, 0xAC9D, 0xAC9F, + 0xACA0, 0xACA1, 0xACA8, 0xACA9, 0xACAA, 0xACAC, 0xACAF, 0xACB0, 0xACB8, + 0xACB9, 0xACBB, 0xACBC, 0xACBD, 0xACC1, 0xACC4, 0xACC8, 0xACCC, 0xACD5, + 0xACD7, 0xACE0, 0xACE1, 0xACE4, 0xACE7, 0xACE8, 0xACEA, 0xACEC, 0xACEF, + 0xACF0, 0xACF1, 0xACF3, 0xACF5, 0xACF6, 0xACFC, 0xACFD, 0xAD00, 0xAD04, + 0xAD06, 0xAD0C, 0xAD0D, 0xAD0F, 0xAD11, 0xAD18, 0xAD1C, 0xAD20, 0xAD29, + 0xAD2C, 0xAD2D, 0xAD34, 0xAD35, 0xAD38, 0xAD3C, 0xAD44, 0xAD45, 0xAD47, + 0xAD49, 0xAD50, 0xAD54, 0xAD58, 0xAD61, 0xAD63, 0xAD6C, 0xAD6D, 0xAD70, + 0xAD73, 0xAD74, 0xAD75, 0xAD76, 0xAD7B, 0xAD7C, 0xAD7D, 0xAD7F, 0xAD81, + 0xAD82, 0xAD88, 0xAD89, 0xAD8C, 0xAD90, 0xAD9C, 0xAD9D, 0xADA4, 0xADB7, + 0xADC0, 0xADC1, 0xADC4, 0xADC8, 0xADD0, 0xADD1, 0xADD3, 0xADDC, 0xADE0, + 0xADE4, 0xADF8, 0xADF9, 0xADFC, 0xADFF, 0xAE00, 0xAE01, 0xAE08, 0xAE09, + 0xAE0B, 0xAE0D, 0xAE14, 0xAE30, 0xAE31, 0xAE34, 0xAE37, 0xAE38, 0xAE3A, + 0xAE40, 0xAE41, 0xAE43, 0xAE45, 0xAE46, 0xAE4A, 0xAE4C, 0xAE4D, 0xAE4E, + 0xAE50, 0xAE54, 0xAE56, 0xAE5C, 0xAE5D, 0xAE5F, 0xAE60, 0xAE61, 0xAE65, + 0xAE68, 0xAE69, 0xAE6C, 0xAE70, 0xAE78, 0xAE79, 0xAE7B, 0xAE7C, 0xAE7D, + 0xAE84, 0xAE85, 0xAE8C, 0xAEBC, 0xAEBD, 0xAEBE, 0xAEC0, 0xAEC4, 0xAECC, + 0xAECD, 0xAECF, 0xAED0, 0xAED1, 0xAED8, 0xAED9, 0xAEDC, 0xAEE8, 0xAEEB, + 0xAEED, 0xAEF4, 0xAEF8, 0xAEFC, 0xAF07, 0xAF08, 0xAF0D, 0xAF10, 0xAF2C, + 0xAF2D, 0xAF30, 0xAF32, 0xAF34, 0xAF3C, 0xAF3D, 0xAF3F, 0xAF41, 0xAF42, + 0xAF43, 0xAF48, 0xAF49, 0xAF50, 0xAF5C, 0xAF5D, 0xAF64, 0xAF65, 0xAF79, + 0xAF80, 0xAF84, 0xAF88, 0xAF90, 0xAF91, 0xAF95, 0xAF9C, 0xAFB8, 0xAFB9, + 0xAFBC, 0xAFC0, 0xAFC7, 0xAFC8, 0xAFC9, 0xAFCB, 0xAFCD, 0xAFCE, 0xAFD4, + 0xAFDC, 0xAFE8, 0xAFE9, 0xAFF0, 0xAFF1, 0xAFF4, 0xAFF8, 0xB000, 0xB001, + 0xB004, 0xB00C, 0xB010, 0xB014, 0xB01C, 0xB01D, 0xB028, 0xB044, 0xB045, + 0xB048, 0xB04A, 0xB04C, 0xB04E, 0xB053, 0xB054, 0xB055, 0xB057, 0xB059, + 0xB05D, 0xB07C, 0xB07D, 0xB080, 0xB084, 0xB08C, 0xB08D, 0xB08F, 0xB091, + 0xB098, 0xB099, 0xB09A, 0xB09C, 0xB09F, 0xB0A0, 0xB0A1, 0xB0A2, 0xB0A8, + 0xB0A9, 0xB0AB, 0xB0AC, 0xB0AD, 0xB0AE, 0xB0AF, 0xB0B1, 0xB0B3, 0xB0B4, + 0xB0B5, 0xB0B8, 0xB0BC, 0xB0C4, 0xB0C5, 0xB0C7, 0xB0C8, 0xB0C9, 0xB0D0, + 0xB0D1, 0xB0D4, 0xB0D8, 0xB0E0, 0xB0E5, 0xB108, 0xB109, 0xB10B, 0xB10C, + 0xB110, 0xB112, 0xB113, 0xB118, 0xB119, 0xB11B, 0xB11C, 0xB11D, 0xB123, + 0xB124, 0xB125, 0xB128, 0xB12C, 0xB134, 0xB135, 0xB137, 0xB138, 0xB139, + 0xB140, 0xB141, 0xB144, 0xB148, 0xB150, 0xB151, 0xB154, 0xB155, 0xB158, + 0xB15C, 0xB160, 0xB178, 0xB179, 0xB17C, 0xB180, 0xB182, 0xB188, 0xB189, + 0xB18B, 0xB18D, 0xB192, 0xB193, 0xB194, 0xB198, 0xB19C, 0xB1A8, 0xB1CC, + 0xB1D0, 0xB1D4, 0xB1DC, 0xB1DD, 0xB1DF, 0xB1E8, 0xB1E9, 0xB1EC, 0xB1F0, + 0xB1F9, 0xB1FB, 0xB1FD, 0xB204, 0xB205, 0xB208, 0xB20B, 0xB20C, 0xB214, + 0xB215, 0xB217, 0xB219, 0xB220, 0xB234, 0xB23C, 0xB258, 0xB25C, 0xB260, + 0xB268, 0xB269, 0xB274, 0xB275, 0xB27C, 0xB284, 0xB285, 0xB289, 0xB290, + 0xB291, 0xB294, 0xB298, 0xB299, 0xB29A, 0xB2A0, 0xB2A1, 0xB2A3, 0xB2A5, + 0xB2A6, 0xB2AA, 0xB2AC, 0xB2B0, 0xB2B4, 0xB2C8, 0xB2C9, 0xB2CC, 0xB2D0, + 0xB2D2, 0xB2D8, 0xB2D9, 0xB2DB, 0xB2DD, 0xB2E2, 0xB2E4, 0xB2E5, 0xB2E6, + 0xB2E8, 0xB2EB, 0xB2EC, 0xB2ED, 0xB2EE, 0xB2EF, 0xB2F3, 0xB2F4, 0xB2F5, + 0xB2F7, 0xB2F8, 0xB2F9, 0xB2FA, 0xB2FB, 0xB2FF, 0xB300, 0xB301, 0xB304, + 0xB308, 0xB310, 0xB311, 0xB313, 0xB314, 0xB315, 0xB31C, 0xB354, 0xB355, + 0xB356, 0xB358, 0xB35B, 0xB35C, 0xB35E, 0xB35F, 0xB364, 0xB365, 0xB367, + 0xB369, 0xB36B, 0xB36E, 0xB370, 0xB371, 0xB374, 0xB378, 0xB380, 0xB381, + 0xB383, 0xB384, 0xB385, 0xB38C, 0xB390, 0xB394, 0xB3A0, 0xB3A1, 0xB3A8, + 0xB3AC, 0xB3C4, 0xB3C5, 0xB3C8, 0xB3CB, 0xB3CC, 0xB3CE, 0xB3D0, 0xB3D4, + 0xB3D5, 0xB3D7, 0xB3D9, 0xB3DB, 0xB3DD, 0xB3E0, 0xB3E4, 0xB3E8, 0xB3FC, + 0xB410, 0xB418, 0xB41C, 0xB420, 0xB428, 0xB429, 0xB42B, 0xB434, 0xB450, + 0xB451, 0xB454, 0xB458, 0xB460, 0xB461, 0xB463, 0xB465, 0xB46C, 0xB480, + 0xB488, 0xB49D, 0xB4A4, 0xB4A8, 0xB4AC, 0xB4B5, 0xB4B7, 0xB4B9, 0xB4C0, + 0xB4C4, 0xB4C8, 0xB4D0, 0xB4D5, 0xB4DC, 0xB4DD, 0xB4E0, 0xB4E3, 0xB4E4, + 0xB4E6, 0xB4EC, 0xB4ED, 0xB4EF, 0xB4F1, 0xB4F8, 0xB514, 0xB515, 0xB518, + 0xB51B, 0xB51C, 0xB524, 0xB525, 0xB527, 0xB528, 0xB529, 0xB52A, 0xB530, + 0xB531, 0xB534, 0xB538, 0xB540, 0xB541, 0xB543, 0xB544, 0xB545, 0xB54B, + 0xB54C, 0xB54D, 0xB550, 0xB554, 0xB55C, 0xB55D, 0xB55F, 0xB560, 0xB561, + 0xB5A0, 0xB5A1, 0xB5A4, 0xB5A8, 0xB5AA, 0xB5AB, 0xB5B0, 0xB5B1, 0xB5B3, + 0xB5B4, 0xB5B5, 0xB5BB, 0xB5BC, 0xB5BD, 0xB5C0, 0xB5C4, 0xB5CC, 0xB5CD, + 0xB5CF, 0xB5D0, 0xB5D1, 0xB5D8, 0xB5EC, 0xB610, 0xB611, 0xB614, 0xB618, + 0xB625, 0xB62C, 0xB634, 0xB648, 0xB664, 0xB668, 0xB69C, 0xB69D, 0xB6A0, + 0xB6A4, 0xB6AB, 0xB6AC, 0xB6B1, 0xB6D4, 0xB6F0, 0xB6F4, 0xB6F8, 0xB700, + 0xB701, 0xB705, 0xB728, 0xB729, 0xB72C, 0xB72F, 0xB730, 0xB738, 0xB739, + 0xB73B, 0xB744, 0xB748, 0xB74C, 0xB754, 0xB755, 0xB760, 0xB764, 0xB768, + 0xB770, 0xB771, 0xB773, 0xB775, 0xB77C, 0xB77D, 0xB780, 0xB784, 0xB78C, + 0xB78D, 0xB78F, 0xB790, 0xB791, 0xB792, 0xB796, 0xB797, 0xB798, 0xB799, + 0xB79C, 0xB7A0, 0xB7A8, 0xB7A9, 0xB7AB, 0xB7AC, 0xB7AD, 0xB7B4, 0xB7B5, + 0xB7B8, 0xB7C7, 0xB7C9, 0xB7EC, 0xB7ED, 0xB7F0, 0xB7F4, 0xB7FC, 0xB7FD, + 0xB7FF, 0xB800, 0xB801, 0xB807, 0xB808, 0xB809, 0xB80C, 0xB810, 0xB818, + 0xB819, 0xB81B, 0xB81D, 0xB824, 0xB825, 0xB828, 0xB82C, 0xB834, 0xB835, + 0xB837, 0xB838, 0xB839, 0xB840, 0xB844, 0xB851, 0xB853, 0xB85C, 0xB85D, + 0xB860, 0xB864, 0xB86C, 0xB86D, 0xB86F, 0xB871, 0xB878, 0xB87C, 0xB88D, + 0xB8A8, 0xB8B0, 0xB8B4, 0xB8B8, 0xB8C0, 0xB8C1, 0xB8C3, 0xB8C5, 0xB8CC, + 0xB8D0, 0xB8D4, 0xB8DD, 0xB8DF, 0xB8E1, 0xB8E8, 0xB8E9, 0xB8EC, 0xB8F0, + 0xB8F8, 0xB8F9, 0xB8FB, 0xB8FD, 0xB904, 0xB918, 0xB920, 0xB93C, 0xB93D, + 0xB940, 0xB944, 0xB94C, 0xB94F, 0xB951, 0xB958, 0xB959, 0xB95C, 0xB960, + 0xB968, 0xB969, 0xB96B, 0xB96D, 0xB974, 0xB975, 0xB978, 0xB97C, 0xB984, + 0xB985, 0xB987, 0xB989, 0xB98A, 0xB98D, 0xB98E, 0xB9AC, 0xB9AD, 0xB9B0, + 0xB9B4, 0xB9BC, 0xB9BD, 0xB9BF, 0xB9C1, 0xB9C8, 0xB9C9, 0xB9CC, 0xB9CE, + 0xB9CF, 0xB9D0, 0xB9D1, 0xB9D2, 0xB9D8, 0xB9D9, 0xB9DB, 0xB9DD, 0xB9DE, + 0xB9E1, 0xB9E3, 0xB9E4, 0xB9E5, 0xB9E8, 0xB9EC, 0xB9F4, 0xB9F5, 0xB9F7, + 0xB9F8, 0xB9F9, 0xB9FA, 0xBA00, 0xBA01, 0xBA08, 0xBA15, 0xBA38, 0xBA39, + 0xBA3C, 0xBA40, 0xBA42, 0xBA48, 0xBA49, 0xBA4B, 0xBA4D, 0xBA4E, 0xBA53, + 0xBA54, 0xBA55, 0xBA58, 0xBA5C, 0xBA64, 0xBA65, 0xBA67, 0xBA68, 0xBA69, + 0xBA70, 0xBA71, 0xBA74, 0xBA78, 0xBA83, 0xBA84, 0xBA85, 0xBA87, 0xBA8C, + 0xBAA8, 0xBAA9, 0xBAAB, 0xBAAC, 0xBAB0, 0xBAB2, 0xBAB8, 0xBAB9, 0xBABB, + 0xBABD, 0xBAC4, 0xBAC8, 0xBAD8, 0xBAD9, 0xBAFC, 0xBB00, 0xBB04, 0xBB0D, + 0xBB0F, 0xBB11, 0xBB18, 0xBB1C, 0xBB20, 0xBB29, 0xBB2B, 0xBB34, 0xBB35, + 0xBB36, 0xBB38, 0xBB3B, 0xBB3C, 0xBB3D, 0xBB3E, 0xBB44, 0xBB45, 0xBB47, + 0xBB49, 0xBB4D, 0xBB4F, 0xBB50, 0xBB54, 0xBB58, 0xBB61, 0xBB63, 0xBB6C, + 0xBB88, 0xBB8C, 0xBB90, 0xBBA4, 0xBBA8, 0xBBAC, 0xBBB4, 0xBBB7, 0xBBC0, + 0xBBC4, 0xBBC8, 0xBBD0, 0xBBD3, 0xBBF8, 0xBBF9, 0xBBFC, 0xBBFF, 0xBC00, + 0xBC02, 0xBC08, 0xBC09, 0xBC0B, 0xBC0C, 0xBC0D, 0xBC0F, 0xBC11, 0xBC14, + 0xBC15, 0xBC16, 0xBC17, 0xBC18, 0xBC1B, 0xBC1C, 0xBC1D, 0xBC1E, 0xBC1F, + 0xBC24, 0xBC25, 0xBC27, 0xBC29, 0xBC2D, 0xBC30, 0xBC31, 0xBC34, 0xBC38, + 0xBC40, 0xBC41, 0xBC43, 0xBC44, 0xBC45, 0xBC49, 0xBC4C, 0xBC4D, 0xBC50, + 0xBC5D, 0xBC84, 0xBC85, 0xBC88, 0xBC8B, 0xBC8C, 0xBC8E, 0xBC94, 0xBC95, + 0xBC97, 0xBC99, 0xBC9A, 0xBCA0, 0xBCA1, 0xBCA4, 0xBCA7, 0xBCA8, 0xBCB0, + 0xBCB1, 0xBCB3, 0xBCB4, 0xBCB5, 0xBCBC, 0xBCBD, 0xBCC0, 0xBCC4, 0xBCCD, + 0xBCCF, 0xBCD0, 0xBCD1, 0xBCD5, 0xBCD8, 0xBCDC, 0xBCF4, 0xBCF5, 0xBCF6, + 0xBCF8, 0xBCFC, 0xBD04, 0xBD05, 0xBD07, 0xBD09, 0xBD10, 0xBD14, 0xBD24, + 0xBD2C, 0xBD40, 0xBD48, 0xBD49, 0xBD4C, 0xBD50, 0xBD58, 0xBD59, 0xBD64, + 0xBD68, 0xBD80, 0xBD81, 0xBD84, 0xBD87, 0xBD88, 0xBD89, 0xBD8A, 0xBD90, + 0xBD91, 0xBD93, 0xBD95, 0xBD99, 0xBD9A, 0xBD9C, 0xBDA4, 0xBDB0, 0xBDB8, + 0xBDD4, 0xBDD5, 0xBDD8, 0xBDDC, 0xBDE9, 0xBDF0, 0xBDF4, 0xBDF8, 0xBE00, + 0xBE03, 0xBE05, 0xBE0C, 0xBE0D, 0xBE10, 0xBE14, 0xBE1C, 0xBE1D, 0xBE1F, + 0xBE44, 0xBE45, 0xBE48, 0xBE4C, 0xBE4E, 0xBE54, 0xBE55, 0xBE57, 0xBE59, + 0xBE5A, 0xBE5B, 0xBE60, 0xBE61, 0xBE64, 0xBE68, 0xBE6A, 0xBE70, 0xBE71, + 0xBE73, 0xBE74, 0xBE75, 0xBE7B, 0xBE7C, 0xBE7D, 0xBE80, 0xBE84, 0xBE8C, + 0xBE8D, 0xBE8F, 0xBE90, 0xBE91, 0xBE98, 0xBE99, 0xBEA8, 0xBED0, 0xBED1, + 0xBED4, 0xBED7, 0xBED8, 0xBEE0, 0xBEE3, 0xBEE4, 0xBEE5, 0xBEEC, 0xBF01, + 0xBF08, 0xBF09, 0xBF18, 0xBF19, 0xBF1B, 0xBF1C, 0xBF1D, 0xBF40, 0xBF41, + 0xBF44, 0xBF48, 0xBF50, 0xBF51, 0xBF55, 0xBF94, 0xBFB0, 0xBFC5, 0xBFCC, + 0xBFCD, 0xBFD0, 0xBFD4, 0xBFDC, 0xBFDF, 0xBFE1, 0xC03C, 0xC051, 0xC058, + 0xC05C, 0xC060, 0xC068, 0xC069, 0xC090, 0xC091, 0xC094, 0xC098, 0xC0A0, + 0xC0A1, 0xC0A3, 0xC0A5, 0xC0AC, 0xC0AD, 0xC0AF, 0xC0B0, 0xC0B3, 0xC0B4, + 0xC0B5, 0xC0B6, 0xC0BC, 0xC0BD, 0xC0BF, 0xC0C0, 0xC0C1, 0xC0C5, 0xC0C8, + 0xC0C9, 0xC0CC, 0xC0D0, 0xC0D8, 0xC0D9, 0xC0DB, 0xC0DC, 0xC0DD, 0xC0E4, + 0xC0E5, 0xC0E8, 0xC0EC, 0xC0F4, 0xC0F5, 0xC0F7, 0xC0F9, 0xC100, 0xC104, + 0xC108, 0xC110, 0xC115, 0xC11C, 0xC11D, 0xC11E, 0xC11F, 0xC120, 0xC123, + 0xC124, 0xC126, 0xC127, 0xC12C, 0xC12D, 0xC12F, 0xC130, 0xC131, 0xC136, + 0xC138, 0xC139, 0xC13C, 0xC140, 0xC148, 0xC149, 0xC14B, 0xC14C, 0xC14D, + 0xC154, 0xC155, 0xC158, 0xC15C, 0xC164, 0xC165, 0xC167, 0xC168, 0xC169, + 0xC170, 0xC174, 0xC178, 0xC185, 0xC18C, 0xC18D, 0xC18E, 0xC190, 0xC194, + 0xC196, 0xC19C, 0xC19D, 0xC19F, 0xC1A1, 0xC1A5, 0xC1A8, 0xC1A9, 0xC1AC, + 0xC1B0, 0xC1BD, 0xC1C4, 0xC1C8, 0xC1CC, 0xC1D4, 0xC1D7, 0xC1D8, 0xC1E0, + 0xC1E4, 0xC1E8, 0xC1F0, 0xC1F1, 0xC1F3, 0xC1FC, 0xC1FD, 0xC200, 0xC204, + 0xC20C, 0xC20D, 0xC20F, 0xC211, 0xC218, 0xC219, 0xC21C, 0xC21F, 0xC220, + 0xC228, 0xC229, 0xC22B, 0xC22D, 0xC22F, 0xC231, 0xC232, 0xC234, 0xC248, + 0xC250, 0xC251, 0xC254, 0xC258, 0xC260, 0xC265, 0xC26C, 0xC26D, 0xC270, + 0xC274, 0xC27C, 0xC27D, 0xC27F, 0xC281, 0xC288, 0xC289, 0xC290, 0xC298, + 0xC29B, 0xC29D, 0xC2A4, 0xC2A5, 0xC2A8, 0xC2AC, 0xC2AD, 0xC2B4, 0xC2B5, + 0xC2B7, 0xC2B9, 0xC2DC, 0xC2DD, 0xC2E0, 0xC2E3, 0xC2E4, 0xC2EB, 0xC2EC, + 0xC2ED, 0xC2EF, 0xC2F1, 0xC2F6, 0xC2F8, 0xC2F9, 0xC2FB, 0xC2FC, 0xC300, + 0xC308, 0xC309, 0xC30C, 0xC30D, 0xC313, 0xC314, 0xC315, 0xC318, 0xC31C, + 0xC324, 0xC325, 0xC328, 0xC329, 0xC345, 0xC368, 0xC369, 0xC36C, 0xC370, + 0xC372, 0xC378, 0xC379, 0xC37C, 0xC37D, 0xC384, 0xC388, 0xC38C, 0xC3C0, + 0xC3D8, 0xC3D9, 0xC3DC, 0xC3DF, 0xC3E0, 0xC3E2, 0xC3E8, 0xC3E9, 0xC3ED, + 0xC3F4, 0xC3F5, 0xC3F8, 0xC408, 0xC410, 0xC424, 0xC42C, 0xC430, 0xC434, + 0xC43C, 0xC43D, 0xC448, 0xC464, 0xC465, 0xC468, 0xC46C, 0xC474, 0xC475, + 0xC479, 0xC480, 0xC494, 0xC49C, 0xC4B8, 0xC4BC, 0xC4E9, 0xC4F0, 0xC4F1, + 0xC4F4, 0xC4F8, 0xC4FA, 0xC4FF, 0xC500, 0xC501, 0xC50C, 0xC510, 0xC514, + 0xC51C, 0xC528, 0xC529, 0xC52C, 0xC530, 0xC538, 0xC539, 0xC53B, 0xC53D, + 0xC544, 0xC545, 0xC548, 0xC549, 0xC54A, 0xC54C, 0xC54D, 0xC54E, 0xC553, + 0xC554, 0xC555, 0xC557, 0xC558, 0xC559, 0xC55D, 0xC55E, 0xC560, 0xC561, + 0xC564, 0xC568, 0xC570, 0xC571, 0xC573, 0xC574, 0xC575, 0xC57C, 0xC57D, + 0xC580, 0xC584, 0xC587, 0xC58C, 0xC58D, 0xC58F, 0xC591, 0xC595, 0xC597, + 0xC598, 0xC59C, 0xC5A0, 0xC5A9, 0xC5B4, 0xC5B5, 0xC5B8, 0xC5B9, 0xC5BB, + 0xC5BC, 0xC5BD, 0xC5BE, 0xC5C4, 0xC5C5, 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9, + 0xC5CA, 0xC5CC, 0xC5CE, 0xC5D0, 0xC5D1, 0xC5D4, 0xC5D8, 0xC5E0, 0xC5E1, + 0xC5E3, 0xC5E5, 0xC5EC, 0xC5ED, 0xC5EE, 0xC5F0, 0xC5F4, 0xC5F6, 0xC5F7, + 0xC5FC, 0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601, 0xC605, 0xC606, 0xC607, + 0xC608, 0xC60C, 0xC610, 0xC618, 0xC619, 0xC61B, 0xC61C, 0xC624, 0xC625, + 0xC628, 0xC62C, 0xC62D, 0xC62E, 0xC630, 0xC633, 0xC634, 0xC635, 0xC637, + 0xC639, 0xC63B, 0xC640, 0xC641, 0xC644, 0xC648, 0xC650, 0xC651, 0xC653, + 0xC654, 0xC655, 0xC65C, 0xC65D, 0xC660, 0xC66C, 0xC66F, 0xC671, 0xC678, + 0xC679, 0xC67C, 0xC680, 0xC688, 0xC689, 0xC68B, 0xC68D, 0xC694, 0xC695, + 0xC698, 0xC69C, 0xC6A4, 0xC6A5, 0xC6A7, 0xC6A9, 0xC6B0, 0xC6B1, 0xC6B4, + 0xC6B8, 0xC6B9, 0xC6BA, 0xC6C0, 0xC6C1, 0xC6C3, 0xC6C5, 0xC6CC, 0xC6CD, + 0xC6D0, 0xC6D4, 0xC6DC, 0xC6DD, 0xC6E0, 0xC6E1, 0xC6E8, 0xC6E9, 0xC6EC, + 0xC6F0, 0xC6F8, 0xC6F9, 0xC6FD, 0xC704, 0xC705, 0xC708, 0xC70C, 0xC714, + 0xC715, 0xC717, 0xC719, 0xC720, 0xC721, 0xC724, 0xC728, 0xC730, 0xC731, + 0xC733, 0xC735, 0xC737, 0xC73C, 0xC73D, 0xC740, 0xC744, 0xC74A, 0xC74C, + 0xC74D, 0xC74F, 0xC751, 0xC752, 0xC753, 0xC754, 0xC755, 0xC756, 0xC757, + 0xC758, 0xC75C, 0xC760, 0xC768, 0xC76B, 0xC774, 0xC775, 0xC778, 0xC77C, + 0xC77D, 0xC77E, 0xC783, 0xC784, 0xC785, 0xC787, 0xC788, 0xC789, 0xC78A, + 0xC78E, 0xC790, 0xC791, 0xC794, 0xC796, 0xC797, 0xC798, 0xC79A, 0xC7A0, + 0xC7A1, 0xC7A3, 0xC7A4, 0xC7A5, 0xC7A6, 0xC7AC, 0xC7AD, 0xC7B0, 0xC7B4, + 0xC7BC, 0xC7BD, 0xC7BF, 0xC7C0, 0xC7C1, 0xC7C8, 0xC7C9, 0xC7CC, 0xC7CE, + 0xC7D0, 0xC7D8, 0xC7DD, 0xC7E4, 0xC7E8, 0xC7EC, 0xC800, 0xC801, 0xC804, + 0xC808, 0xC80A, 0xC810, 0xC811, 0xC813, 0xC815, 0xC816, 0xC81C, 0xC81D, + 0xC820, 0xC824, 0xC82C, 0xC82D, 0xC82F, 0xC831, 0xC838, 0xC83C, 0xC840, + 0xC848, 0xC849, 0xC84C, 0xC84D, 0xC854, 0xC870, 0xC871, 0xC874, 0xC878, + 0xC87A, 0xC880, 0xC881, 0xC883, 0xC885, 0xC886, 0xC887, 0xC88B, 0xC88C, + 0xC88D, 0xC894, 0xC89D, 0xC89F, 0xC8A1, 0xC8A8, 0xC8BC, 0xC8BD, 0xC8C4, + 0xC8C8, 0xC8CC, 0xC8D4, 0xC8D5, 0xC8D7, 0xC8D9, 0xC8E0, 0xC8E1, 0xC8E4, + 0xC8F5, 0xC8FC, 0xC8FD, 0xC900, 0xC904, 0xC905, 0xC906, 0xC90C, 0xC90D, + 0xC90F, 0xC911, 0xC918, 0xC92C, 0xC934, 0xC950, 0xC951, 0xC954, 0xC958, + 0xC960, 0xC961, 0xC963, 0xC96C, 0xC970, 0xC974, 0xC97C, 0xC988, 0xC989, + 0xC98C, 0xC990, 0xC998, 0xC999, 0xC99B, 0xC99D, 0xC9C0, 0xC9C1, 0xC9C4, + 0xC9C7, 0xC9C8, 0xC9CA, 0xC9D0, 0xC9D1, 0xC9D3, 0xC9D5, 0xC9D6, 0xC9D9, + 0xC9DA, 0xC9DC, 0xC9DD, 0xC9E0, 0xC9E2, 0xC9E4, 0xC9E7, 0xC9EC, 0xC9ED, + 0xC9EF, 0xC9F0, 0xC9F1, 0xC9F8, 0xC9F9, 0xC9FC, 0xCA00, 0xCA08, 0xCA09, + 0xCA0B, 0xCA0C, 0xCA0D, 0xCA14, 0xCA18, 0xCA29, 0xCA4C, 0xCA4D, 0xCA50, + 0xCA54, 0xCA5C, 0xCA5D, 0xCA5F, 0xCA60, 0xCA61, 0xCA68, 0xCA7D, 0xCA84, + 0xCA98, 0xCABC, 0xCABD, 0xCAC0, 0xCAC4, 0xCACC, 0xCACD, 0xCACF, 0xCAD1, + 0xCAD3, 0xCAD8, 0xCAD9, 0xCAE0, 0xCAEC, 0xCAF4, 0xCB08, 0xCB10, 0xCB14, + 0xCB18, 0xCB20, 0xCB21, 0xCB41, 0xCB48, 0xCB49, 0xCB4C, 0xCB50, 0xCB58, + 0xCB59, 0xCB5D, 0xCB64, 0xCB78, 0xCB79, 0xCB9C, 0xCBB8, 0xCBD4, 0xCBE4, + 0xCBE7, 0xCBE9, 0xCC0C, 0xCC0D, 0xCC10, 0xCC14, 0xCC1C, 0xCC1D, 0xCC21, + 0xCC22, 0xCC27, 0xCC28, 0xCC29, 0xCC2C, 0xCC2E, 0xCC30, 0xCC38, 0xCC39, + 0xCC3B, 0xCC3C, 0xCC3D, 0xCC3E, 0xCC44, 0xCC45, 0xCC48, 0xCC4C, 0xCC54, + 0xCC55, 0xCC57, 0xCC58, 0xCC59, 0xCC60, 0xCC64, 0xCC66, 0xCC68, 0xCC70, + 0xCC75, 0xCC98, 0xCC99, 0xCC9C, 0xCCA0, 0xCCA8, 0xCCA9, 0xCCAB, 0xCCAC, + 0xCCAD, 0xCCB4, 0xCCB5, 0xCCB8, 0xCCBC, 0xCCC4, 0xCCC5, 0xCCC7, 0xCCC9, + 0xCCD0, 0xCCD4, 0xCCE4, 0xCCEC, 0xCCF0, 0xCD01, 0xCD08, 0xCD09, 0xCD0C, + 0xCD10, 0xCD18, 0xCD19, 0xCD1B, 0xCD1D, 0xCD24, 0xCD28, 0xCD2C, 0xCD39, + 0xCD5C, 0xCD60, 0xCD64, 0xCD6C, 0xCD6D, 0xCD6F, 0xCD71, 0xCD78, 0xCD88, + 0xCD94, 0xCD95, 0xCD98, 0xCD9C, 0xCDA4, 0xCDA5, 0xCDA7, 0xCDA9, 0xCDB0, + 0xCDC4, 0xCDCC, 0xCDD0, 0xCDE8, 0xCDEC, 0xCDF0, 0xCDF8, 0xCDF9, 0xCDFB, + 0xCDFD, 0xCE04, 0xCE08, 0xCE0C, 0xCE14, 0xCE19, 0xCE20, 0xCE21, 0xCE24, + 0xCE28, 0xCE30, 0xCE31, 0xCE33, 0xCE35, 0xCE58, 0xCE59, 0xCE5C, 0xCE5F, + 0xCE60, 0xCE61, 0xCE68, 0xCE69, 0xCE6B, 0xCE6D, 0xCE74, 0xCE75, 0xCE78, + 0xCE7C, 0xCE84, 0xCE85, 0xCE87, 0xCE89, 0xCE90, 0xCE91, 0xCE94, 0xCE98, + 0xCEA0, 0xCEA1, 0xCEA3, 0xCEA4, 0xCEA5, 0xCEAC, 0xCEAD, 0xCEC1, 0xCEE4, + 0xCEE5, 0xCEE8, 0xCEEB, 0xCEEC, 0xCEF4, 0xCEF5, 0xCEF7, 0xCEF8, 0xCEF9, + 0xCF00, 0xCF01, 0xCF04, 0xCF08, 0xCF10, 0xCF11, 0xCF13, 0xCF15, 0xCF1C, + 0xCF20, 0xCF24, 0xCF2C, 0xCF2D, 0xCF2F, 0xCF30, 0xCF31, 0xCF38, 0xCF54, + 0xCF55, 0xCF58, 0xCF5C, 0xCF64, 0xCF65, 0xCF67, 0xCF69, 0xCF70, 0xCF71, + 0xCF74, 0xCF78, 0xCF80, 0xCF85, 0xCF8C, 0xCFA1, 0xCFA8, 0xCFB0, 0xCFC4, + 0xCFE0, 0xCFE1, 0xCFE4, 0xCFE8, 0xCFF0, 0xCFF1, 0xCFF3, 0xCFF5, 0xCFFC, + 0xD000, 0xD004, 0xD011, 0xD018, 0xD02D, 0xD034, 0xD035, 0xD038, 0xD03C, + 0xD044, 0xD045, 0xD047, 0xD049, 0xD050, 0xD054, 0xD058, 0xD060, 0xD06C, + 0xD06D, 0xD070, 0xD074, 0xD07C, 0xD07D, 0xD081, 0xD0A4, 0xD0A5, 0xD0A8, + 0xD0AC, 0xD0B4, 0xD0B5, 0xD0B7, 0xD0B9, 0xD0C0, 0xD0C1, 0xD0C4, 0xD0C8, + 0xD0C9, 0xD0D0, 0xD0D1, 0xD0D3, 0xD0D4, 0xD0D5, 0xD0DC, 0xD0DD, 0xD0E0, + 0xD0E4, 0xD0EC, 0xD0ED, 0xD0EF, 0xD0F0, 0xD0F1, 0xD0F8, 0xD10D, 0xD130, + 0xD131, 0xD134, 0xD138, 0xD13A, 0xD140, 0xD141, 0xD143, 0xD144, 0xD145, + 0xD14C, 0xD14D, 0xD150, 0xD154, 0xD15C, 0xD15D, 0xD15F, 0xD161, 0xD168, + 0xD16C, 0xD17C, 0xD184, 0xD188, 0xD1A0, 0xD1A1, 0xD1A4, 0xD1A8, 0xD1B0, + 0xD1B1, 0xD1B3, 0xD1B5, 0xD1BA, 0xD1BC, 0xD1C0, 0xD1D8, 0xD1F4, 0xD1F8, + 0xD207, 0xD209, 0xD210, 0xD22C, 0xD22D, 0xD230, 0xD234, 0xD23C, 0xD23D, + 0xD23F, 0xD241, 0xD248, 0xD25C, 0xD264, 0xD280, 0xD281, 0xD284, 0xD288, + 0xD290, 0xD291, 0xD295, 0xD29C, 0xD2A0, 0xD2A4, 0xD2AC, 0xD2B1, 0xD2B8, + 0xD2B9, 0xD2BC, 0xD2BF, 0xD2C0, 0xD2C2, 0xD2C8, 0xD2C9, 0xD2CB, 0xD2D4, + 0xD2D8, 0xD2DC, 0xD2E4, 0xD2E5, 0xD2F0, 0xD2F1, 0xD2F4, 0xD2F8, 0xD300, + 0xD301, 0xD303, 0xD305, 0xD30C, 0xD30D, 0xD30E, 0xD310, 0xD314, 0xD316, + 0xD31C, 0xD31D, 0xD31F, 0xD320, 0xD321, 0xD325, 0xD328, 0xD329, 0xD32C, + 0xD330, 0xD338, 0xD339, 0xD33B, 0xD33C, 0xD33D, 0xD344, 0xD345, 0xD37C, + 0xD37D, 0xD380, 0xD384, 0xD38C, 0xD38D, 0xD38F, 0xD390, 0xD391, 0xD398, + 0xD399, 0xD39C, 0xD3A0, 0xD3A8, 0xD3A9, 0xD3AB, 0xD3AD, 0xD3B4, 0xD3B8, + 0xD3BC, 0xD3C4, 0xD3C5, 0xD3C8, 0xD3C9, 0xD3D0, 0xD3D8, 0xD3E1, 0xD3E3, + 0xD3EC, 0xD3ED, 0xD3F0, 0xD3F4, 0xD3FC, 0xD3FD, 0xD3FF, 0xD401, 0xD408, + 0xD41D, 0xD440, 0xD444, 0xD45C, 0xD460, 0xD464, 0xD46D, 0xD46F, 0xD478, + 0xD479, 0xD47C, 0xD47F, 0xD480, 0xD482, 0xD488, 0xD489, 0xD48B, 0xD48D, + 0xD494, 0xD4A9, 0xD4CC, 0xD4D0, 0xD4D4, 0xD4DC, 0xD4DF, 0xD4E8, 0xD4EC, + 0xD4F0, 0xD4F8, 0xD4FB, 0xD4FD, 0xD504, 0xD508, 0xD50C, 0xD514, 0xD515, + 0xD517, 0xD53C, 0xD53D, 0xD540, 0xD544, 0xD54C, 0xD54D, 0xD54F, 0xD551, + 0xD558, 0xD559, 0xD55C, 0xD560, 0xD565, 0xD568, 0xD569, 0xD56B, 0xD56D, + 0xD574, 0xD575, 0xD578, 0xD57C, 0xD584, 0xD585, 0xD587, 0xD588, 0xD589, + 0xD590, 0xD5A5, 0xD5C8, 0xD5C9, 0xD5CC, 0xD5D0, 0xD5D2, 0xD5D8, 0xD5D9, + 0xD5DB, 0xD5DD, 0xD5E4, 0xD5E5, 0xD5E8, 0xD5EC, 0xD5F4, 0xD5F5, 0xD5F7, + 0xD5F9, 0xD600, 0xD601, 0xD604, 0xD608, 0xD610, 0xD611, 0xD613, 0xD614, + 0xD615, 0xD61C, 0xD620, 0xD624, 0xD62D, 0xD638, 0xD639, 0xD63C, 0xD640, + 0xD645, 0xD648, 0xD649, 0xD64B, 0xD64D, 0xD651, 0xD654, 0xD655, 0xD658, + 0xD65C, 0xD667, 0xD669, 0xD670, 0xD671, 0xD674, 0xD683, 0xD685, 0xD68C, + 0xD68D, 0xD690, 0xD694, 0xD69D, 0xD69F, 0xD6A1, 0xD6A8, 0xD6AC, 0xD6B0, + 0xD6B9, 0xD6BB, 0xD6C4, 0xD6C5, 0xD6C8, 0xD6CC, 0xD6D1, 0xD6D4, 0xD6D7, + 0xD6D9, 0xD6E0, 0xD6E4, 0xD6E8, 0xD6F0, 0xD6F5, 0xD6FC, 0xD6FD, 0xD700, + 0xD704, 0xD711, 0xD718, 0xD719, 0xD71C, 0xD720, 0xD728, 0xD729, 0xD72B, + 0xD72D, 0xD734, 0xD735, 0xD738, 0xD73C, 0xD744, 0xD747, 0xD749, 0xD750, + 0xD751, 0xD754, 0xD756, 0xD757, 0xD758, 0xD759, 0xD760, 0xD761, 0xD763, + 0xD765, 0xD769, 0xD76C, 0xD770, 0xD774, 0xD77C, 0xD77D, 0xD781, 0xD788, + 0xD789, 0xD78C, 0xD790, 0xD798, 0xD799, 0xD79B, 0xD79D, 0x4F3D, 0x4F73, + 0x5047, 0x50F9, 0x52A0, 0x53EF, 0x5475, 0x54E5, 0x5609, 0x5AC1, 0x5BB6, + 0x6687, 0x67B6, 0x67B7, 0x67EF, 0x6B4C, 0x73C2, 0x75C2, 0x7A3C, 0x82DB, + 0x8304, 0x8857, 0x8888, 0x8A36, 0x8CC8, 0x8DCF, 0x8EFB, 0x8FE6, 0x99D5, + 0x523B, 0x5374, 0x5404, 0x606A, 0x6164, 0x6BBC, 0x73CF, 0x811A, 0x89BA, + 0x89D2, 0x95A3, 0x4F83, 0x520A, 0x58BE, 0x5978, 0x59E6, 0x5E72, 0x5E79, + 0x61C7, 0x63C0, 0x6746, 0x67EC, 0x687F, 0x6F97, 0x764E, 0x770B, 0x78F5, + 0x7A08, 0x7AFF, 0x7C21, 0x809D, 0x826E, 0x8271, 0x8AEB, 0x9593, 0x4E6B, + 0x559D, 0x66F7, 0x6E34, 0x78A3, 0x7AED, 0x845B, 0x8910, 0x874E, 0x97A8, + 0x52D8, 0x574E, 0x582A, 0x5D4C, 0x611F, 0x61BE, 0x6221, 0x6562, 0x67D1, + 0x6A44, 0x6E1B, 0x7518, 0x75B3, 0x76E3, 0x77B0, 0x7D3A, 0x90AF, 0x9451, + 0x9452, 0x9F95, 0x5323, 0x5CAC, 0x7532, 0x80DB, 0x9240, 0x9598, 0x525B, + 0x5808, 0x59DC, 0x5CA1, 0x5D17, 0x5EB7, 0x5F3A, 0x5F4A, 0x6177, 0x6C5F, + 0x757A, 0x7586, 0x7CE0, 0x7D73, 0x7DB1, 0x7F8C, 0x8154, 0x8221, 0x8591, + 0x8941, 0x8B1B, 0x92FC, 0x964D, 0x9C47, 0x4ECB, 0x4EF7, 0x500B, 0x51F1, + 0x584F, 0x6137, 0x613E, 0x6168, 0x6539, 0x69EA, 0x6F11, 0x75A5, 0x7686, + 0x76D6, 0x7B87, 0x82A5, 0x84CB, 0x93A7, 0x958B, 0x5580, 0x5BA2, 0x5751, + 0x7CB3, 0x7FB9, 0x91B5, 0x5028, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x636E, + 0x64DA, 0x64E7, 0x6E20, 0x70AC, 0x795B, 0x8DDD, 0x8E1E, 0x907D, 0x9245, + 0x92F8, 0x4E7E, 0x4EF6, 0x5065, 0x5DFE, 0x5EFA, 0x6106, 0x6957, 0x8171, + 0x8654, 0x8E47, 0x9375, 0x9A2B, 0x4E5E, 0x5091, 0x6770, 0x6840, 0x5109, + 0x528D, 0x5292, 0x6AA2, 0x77BC, 0x9210, 0x9ED4, 0x52AB, 0x602F, 0x8FF2, + 0x5048, 0x61A9, 0x63ED, 0x64CA, 0x683C, 0x6A84, 0x6FC0, 0x8188, 0x89A1, + 0x9694, 0x5805, 0x727D, 0x72AC, 0x7504, 0x7D79, 0x7E6D, 0x80A9, 0x898B, + 0x8B74, 0x9063, 0x9D51, 0x6289, 0x6C7A, 0x6F54, 0x7D50, 0x7F3A, 0x8A23, + 0x517C, 0x614A, 0x7B9D, 0x8B19, 0x9257, 0x938C, 0x4EAC, 0x4FD3, 0x501E, + 0x50BE, 0x5106, 0x52C1, 0x52CD, 0x537F, 0x5770, 0x5883, 0x5E9A, 0x5F91, + 0x6176, 0x61AC, 0x64CE, 0x656C, 0x666F, 0x66BB, 0x66F4, 0x6897, 0x6D87, + 0x7085, 0x70F1, 0x749F, 0x74A5, 0x74CA, 0x75D9, 0x786C, 0x78EC, 0x7ADF, + 0x7AF6, 0x7D45, 0x7D93, 0x8015, 0x803F, 0x811B, 0x8396, 0x8B66, 0x8F15, + 0x9015, 0x93E1, 0x9803, 0x9838, 0x9A5A, 0x9BE8, 0x4FC2, 0x5553, 0x583A, + 0x5951, 0x5B63, 0x5C46, 0x60B8, 0x6212, 0x6842, 0x68B0, 0x68E8, 0x6EAA, + 0x754C, 0x7678, 0x78CE, 0x7A3D, 0x7CFB, 0x7E6B, 0x7E7C, 0x8A08, 0x8AA1, + 0x8C3F, 0x968E, 0x9DC4, 0x53E4, 0x53E9, 0x544A, 0x5471, 0x56FA, 0x59D1, + 0x5B64, 0x5C3B, 0x5EAB, 0x62F7, 0x6537, 0x6545, 0x6572, 0x66A0, 0x67AF, + 0x69C1, 0x6CBD, 0x75FC, 0x7690, 0x777E, 0x7A3F, 0x7F94, 0x8003, 0x80A1, + 0x818F, 0x82E6, 0x82FD, 0x83F0, 0x85C1, 0x8831, 0x88B4, 0x8AA5, 0x8F9C, + 0x932E, 0x96C7, 0x9867, 0x9AD8, 0x9F13, 0x54ED, 0x659B, 0x66F2, 0x688F, + 0x7A40, 0x8C37, 0x9D60, 0x56F0, 0x5764, 0x5D11, 0x6606, 0x68B1, 0x68CD, + 0x6EFE, 0x7428, 0x889E, 0x9BE4, 0x6C68, 0x9AA8, 0x4F9B, 0x516C, 0x5171, + 0x529F, 0x5B54, 0x5DE5, 0x6050, 0x606D, 0x62F1, 0x63A7, 0x653B, 0x73D9, + 0x7A7A, 0x86A3, 0x8CA2, 0x978F, 0x4E32, 0x5BE1, 0x6208, 0x679C, 0x74DC, + 0x79D1, 0x83D3, 0x8A87, 0x8AB2, 0x8DE8, 0x904E, 0x934B, 0x9846, 0x5ED3, + 0x69E8, 0x85FF, 0x90ED, 0x51A0, 0x5B98, 0x5BEC, 0x6163, 0x68FA, 0x6B3E, + 0x704C, 0x742F, 0x74D8, 0x7BA1, 0x7F50, 0x83C5, 0x89C0, 0x8CAB, 0x95DC, + 0x9928, 0x522E, 0x605D, 0x62EC, 0x9002, 0x4F8A, 0x5149, 0x5321, 0x58D9, + 0x5EE3, 0x66E0, 0x6D38, 0x709A, 0x72C2, 0x73D6, 0x7B50, 0x80F1, 0x945B, + 0x5366, 0x639B, 0x7F6B, 0x4E56, 0x5080, 0x584A, 0x58DE, 0x602A, 0x6127, + 0x62D0, 0x69D0, 0x9B41, 0x5B8F, 0x7D18, 0x80B1, 0x8F5F, 0x4EA4, 0x50D1, + 0x54AC, 0x55AC, 0x5B0C, 0x5DA0, 0x5DE7, 0x652A, 0x654E, 0x6821, 0x6A4B, + 0x72E1, 0x768E, 0x77EF, 0x7D5E, 0x7FF9, 0x81A0, 0x854E, 0x86DF, 0x8F03, + 0x8F4E, 0x90CA, 0x9903, 0x9A55, 0x9BAB, 0x4E18, 0x4E45, 0x4E5D, 0x4EC7, + 0x4FF1, 0x5177, 0x52FE, 0x5340, 0x53E3, 0x53E5, 0x548E, 0x5614, 0x5775, + 0x57A2, 0x5BC7, 0x5D87, 0x5ED0, 0x61FC, 0x62D8, 0x6551, 0x67B8, 0x67E9, + 0x69CB, 0x6B50, 0x6BC6, 0x6BEC, 0x6C42, 0x6E9D, 0x7078, 0x72D7, 0x7396, + 0x7403, 0x77BF, 0x77E9, 0x7A76, 0x7D7F, 0x8009, 0x81FC, 0x8205, 0x820A, + 0x82DF, 0x8862, 0x8B33, 0x8CFC, 0x8EC0, 0x9011, 0x90B1, 0x9264, 0x92B6, + 0x99D2, 0x9A45, 0x9CE9, 0x9DD7, 0x9F9C, 0x570B, 0x5C40, 0x83CA, 0x97A0, + 0x97AB, 0x9EB4, 0x541B, 0x7A98, 0x7FA4, 0x88D9, 0x8ECD, 0x90E1, 0x5800, + 0x5C48, 0x6398, 0x7A9F, 0x5BAE, 0x5F13, 0x7A79, 0x7AAE, 0x828E, 0x8EAC, + 0x5026, 0x5238, 0x52F8, 0x5377, 0x5708, 0x62F3, 0x6372, 0x6B0A, 0x6DC3, + 0x7737, 0x53A5, 0x7357, 0x8568, 0x8E76, 0x95D5, 0x673A, 0x6AC3, 0x6F70, + 0x8A6D, 0x8ECC, 0x994B, 0x6677, 0x6B78, 0x8CB4, 0x9B3C, 0x53EB, 0x572D, + 0x594E, 0x63C6, 0x69FB, 0x73EA, 0x7845, 0x7ABA, 0x7AC5, 0x7CFE, 0x8475, + 0x898F, 0x8D73, 0x9035, 0x95A8, 0x52FB, 0x5747, 0x7547, 0x7B60, 0x83CC, + 0x921E, 0x6A58, 0x514B, 0x524B, 0x5287, 0x621F, 0x68D8, 0x6975, 0x9699, + 0x50C5, 0x52A4, 0x52E4, 0x61C3, 0x65A4, 0x6839, 0x69FF, 0x747E, 0x7B4B, + 0x82B9, 0x83EB, 0x89B2, 0x8B39, 0x8FD1, 0x9949, 0x4ECA, 0x5997, 0x64D2, + 0x6611, 0x6A8E, 0x7434, 0x7981, 0x79BD, 0x82A9, 0x887E, 0x887F, 0x895F, + 0x9326, 0x4F0B, 0x53CA, 0x6025, 0x6271, 0x6C72, 0x7D1A, 0x7D66, 0x4E98, + 0x5162, 0x77DC, 0x80AF, 0x4F01, 0x4F0E, 0x5176, 0x5180, 0x55DC, 0x5668, + 0x573B, 0x57FA, 0x57FC, 0x5914, 0x5947, 0x5993, 0x5BC4, 0x5C90, 0x5D0E, + 0x5DF1, 0x5E7E, 0x5FCC, 0x6280, 0x65D7, 0x65E3, 0x671E, 0x671F, 0x675E, + 0x68CB, 0x68C4, 0x6A5F, 0x6B3A, 0x6C23, 0x6C7D, 0x6C82, 0x6DC7, 0x7398, + 0x7426, 0x742A, 0x7482, 0x74A3, 0x7578, 0x757F, 0x7881, 0x78EF, 0x7941, + 0x7947, 0x7948, 0x797A, 0x7B95, 0x7D00, 0x7DBA, 0x7F88, 0x8006, 0x802D, + 0x808C, 0x8A18, 0x8B4F, 0x8C48, 0x8D77, 0x9321, 0x9324, 0x98E2, 0x9951, + 0x9A0E, 0x9A0F, 0x9A65, 0x9E92, 0x7DCA, 0x4F76, 0x5409, 0x62EE, 0x6854, + 0x91D1, 0x55AB, 0x513A, 0x5A1C, 0x61E6, 0x62CF, 0x62FF, 0x90A3, 0x8AFE, + 0x6696, 0x7156, 0x96E3, 0x634F, 0x637A, 0x5357, 0x678F, 0x6960, 0x6E73, + 0x7537, 0x7D0D, 0x8872, 0x56CA, 0x5A18, 0x4E43, 0x5167, 0x5948, 0x67F0, + 0x8010, 0x5973, 0x5E74, 0x649A, 0x79CA, 0x5FF5, 0x606C, 0x62C8, 0x637B, + 0x5BE7, 0x5BD7, 0x52AA, 0x5974, 0x5F29, 0x6012, 0x7459, 0x99D1, 0x6FC3, + 0x81BF, 0x8FB2, 0x60F1, 0x8166, 0x5C3F, 0x5AE9, 0x8A25, 0x677B, 0x7D10, + 0x80FD, 0x5C3C, 0x6CE5, 0x533F, 0x6EBA, 0x591A, 0x8336, 0x4E39, 0x4EB6, + 0x4F46, 0x55AE, 0x5718, 0x58C7, 0x5F56, 0x65B7, 0x65E6, 0x6A80, 0x6BB5, + 0x6E4D, 0x77ED, 0x7AEF, 0x7C1E, 0x7DDE, 0x86CB, 0x8892, 0x9132, 0x935B, + 0x64BB, 0x6FBE, 0x737A, 0x75B8, 0x9054, 0x5556, 0x574D, 0x61BA, 0x64D4, + 0x66C7, 0x6DE1, 0x6E5B, 0x6F6D, 0x6FB9, 0x75F0, 0x8043, 0x81BD, 0x8541, + 0x8983, 0x8AC7, 0x8B5A, 0x931F, 0x6C93, 0x7553, 0x7B54, 0x8E0F, 0x905D, + 0x5510, 0x5802, 0x5858, 0x5E62, 0x6207, 0x649E, 0x68E0, 0x7576, 0x7CD6, + 0x87B3, 0x9EE8, 0x4EE3, 0x5788, 0x576E, 0x5927, 0x5C0D, 0x5CB1, 0x5E36, + 0x5F85, 0x6234, 0x64E1, 0x73B3, 0x81FA, 0x888B, 0x8CB8, 0x968A, 0x9EDB, + 0x5B85, 0x5FB7, 0x60B3, 0x5012, 0x5200, 0x5230, 0x5716, 0x5835, 0x5857, + 0x5C0E, 0x5C60, 0x5CF6, 0x5D8B, 0x5EA6, 0x5F92, 0x60BC, 0x6311, 0x6389, + 0x6417, 0x6843, 0x68F9, 0x6AC2, 0x6DD8, 0x6E21, 0x6ED4, 0x6FE4, 0x71FE, + 0x76DC, 0x7779, 0x79B1, 0x7A3B, 0x8404, 0x89A9, 0x8CED, 0x8DF3, 0x8E48, + 0x9003, 0x9014, 0x9053, 0x90FD, 0x934D, 0x9676, 0x97DC, 0x6BD2, 0x7006, + 0x7258, 0x72A2, 0x7368, 0x7763, 0x79BF, 0x7BE4, 0x7E9B, 0x8B80, 0x58A9, + 0x60C7, 0x6566, 0x65FD, 0x66BE, 0x6C8C, 0x711E, 0x71C9, 0x8C5A, 0x9813, + 0x4E6D, 0x7A81, 0x4EDD, 0x51AC, 0x51CD, 0x52D5, 0x540C, 0x61A7, 0x6771, + 0x6850, 0x68DF, 0x6D1E, 0x6F7C, 0x75BC, 0x77B3, 0x7AE5, 0x80F4, 0x8463, + 0x9285, 0x515C, 0x6597, 0x675C, 0x6793, 0x75D8, 0x7AC7, 0x8373, 0x8C46, + 0x9017, 0x982D, 0x5C6F, 0x81C0, 0x829A, 0x9041, 0x906F, 0x920D, 0x5F97, + 0x5D9D, 0x6A59, 0x71C8, 0x767B, 0x7B49, 0x85E4, 0x8B04, 0x9127, 0x9A30, + 0x5587, 0x61F6, 0x7669, 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0x6D1B, + 0x70D9, 0x73DE, 0x7D61, 0x843D, 0x916A, 0x99F1, 0x4E82, 0x5375, 0x6B04, + 0x6B12, 0x703E, 0x721B, 0x862D, 0x9E1E, 0x524C, 0x8FA3, 0x5D50, 0x64E5, + 0x652C, 0x6B16, 0x6FEB, 0x7C43, 0x7E9C, 0x85CD, 0x8964, 0x89BD, 0x62C9, + 0x81D8, 0x881F, 0x5ECA, 0x6717, 0x6D6A, 0x72FC, 0x7405, 0x746F, 0x8782, + 0x90DE, 0x4F86, 0x5D0D, 0x5FA0, 0x840A, 0x51B7, 0x63A0, 0x7565, 0x4EAE, + 0x5006, 0x5169, 0x51C9, 0x6881, 0x6A11, 0x7CAE, 0x7CB1, 0x7CE7, 0x826F, + 0x8AD2, 0x8F1B, 0x91CF, 0x4FB6, 0x5137, 0x52F5, 0x5442, 0x5EEC, 0x616E, + 0x623E, 0x65C5, 0x6ADA, 0x6FFE, 0x792A, 0x85DC, 0x8823, 0x95AD, 0x9A62, + 0x9A6A, 0x9E97, 0x9ECE, 0x529B, 0x66C6, 0x6B77, 0x701D, 0x792B, 0x8F62, + 0x9742, 0x6190, 0x6200, 0x6523, 0x6F23, 0x7149, 0x7489, 0x7DF4, 0x806F, + 0x84EE, 0x8F26, 0x9023, 0x934A, 0x51BD, 0x5217, 0x52A3, 0x6D0C, 0x70C8, + 0x88C2, 0x5EC9, 0x6582, 0x6BAE, 0x6FC2, 0x7C3E, 0x7375, 0x4EE4, 0x4F36, + 0x56F9, 0x5CBA, 0x5DBA, 0x601C, 0x73B2, 0x7B2D, 0x7F9A, 0x7FCE, 0x8046, + 0x901E, 0x9234, 0x96F6, 0x9748, 0x9818, 0x9F61, 0x4F8B, 0x6FA7, 0x79AE, + 0x91B4, 0x96B7, 0x52DE, 0x6488, 0x64C4, 0x6AD3, 0x6F5E, 0x7018, 0x7210, + 0x76E7, 0x8001, 0x8606, 0x865C, 0x8DEF, 0x8F05, 0x9732, 0x9B6F, 0x9DFA, + 0x9E75, 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x9E93, 0x8AD6, + 0x58DF, 0x5F04, 0x6727, 0x7027, 0x74CF, 0x7C60, 0x807E, 0x5121, 0x7028, + 0x7262, 0x78CA, 0x8CC2, 0x8CDA, 0x8CF4, 0x96F7, 0x4E86, 0x50DA, 0x5BEE, + 0x5ED6, 0x6599, 0x71CE, 0x7642, 0x77AD, 0x804A, 0x84FC, 0x907C, 0x9B27, + 0x9F8D, 0x58D8, 0x5A41, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F, 0x763B, 0x7D2F, + 0x7E37, 0x851E, 0x8938, 0x93E4, 0x964B, 0x5289, 0x65D2, 0x67F3, 0x69B4, + 0x6D41, 0x6E9C, 0x700F, 0x7409, 0x7460, 0x7559, 0x7624, 0x786B, 0x8B2C, + 0x985E, 0x516D, 0x622E, 0x9678, 0x4F96, 0x502B, 0x5D19, 0x6DEA, 0x7DB8, + 0x8F2A, 0x5F8B, 0x6144, 0x6817, 0x9686, 0x52D2, 0x808B, 0x51DC, 0x51CC, + 0x695E, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, 0x4FDA, 0x5229, 0x5398, 0x540F, + 0x550E, 0x5C65, 0x60A7, 0x674E, 0x68A8, 0x6D6C, 0x7281, 0x72F8, 0x7406, + 0x7483, 0x75E2, 0x7C6C, 0x7F79, 0x7FB8, 0x8389, 0x88CF, 0x88E1, 0x91CC, + 0x91D0, 0x96E2, 0x9BC9, 0x541D, 0x6F7E, 0x71D0, 0x7498, 0x85FA, 0x8EAA, + 0x96A3, 0x9C57, 0x9E9F, 0x6797, 0x6DCB, 0x7433, 0x81E8, 0x9716, 0x782C, + 0x7ACB, 0x7B20, 0x7C92, 0x6469, 0x746A, 0x75F2, 0x78BC, 0x78E8, 0x99AC, + 0x9B54, 0x9EBB, 0x5BDE, 0x5E55, 0x6F20, 0x819C, 0x83AB, 0x9088, 0x4E07, + 0x534D, 0x5A29, 0x5DD2, 0x5F4E, 0x6162, 0x633D, 0x6669, 0x66FC, 0x6EFF, + 0x6F2B, 0x7063, 0x779E, 0x842C, 0x8513, 0x883B, 0x8F13, 0x9945, 0x9C3B, + 0x551C, 0x62B9, 0x672B, 0x6CAB, 0x8309, 0x896A, 0x977A, 0x4EA1, 0x5984, + 0x5FD8, 0x5FD9, 0x671B, 0x7DB2, 0x7F54, 0x8292, 0x832B, 0x83BD, 0x8F1E, + 0x9099, 0x57CB, 0x59B9, 0x5A92, 0x5BD0, 0x6627, 0x679A, 0x6885, 0x6BCF, + 0x7164, 0x7F75, 0x8CB7, 0x8CE3, 0x9081, 0x9B45, 0x8108, 0x8C8A, 0x964C, + 0x9A40, 0x9EA5, 0x5B5F, 0x6C13, 0x731B, 0x76F2, 0x76DF, 0x840C, 0x51AA, + 0x8993, 0x514D, 0x5195, 0x52C9, 0x68C9, 0x6C94, 0x7704, 0x7720, 0x7DBF, + 0x7DEC, 0x9762, 0x9EB5, 0x6EC5, 0x8511, 0x51A5, 0x540D, 0x547D, 0x660E, + 0x669D, 0x6927, 0x6E9F, 0x76BF, 0x7791, 0x8317, 0x84C2, 0x879F, 0x9169, + 0x9298, 0x9CF4, 0x8882, 0x4FAE, 0x5192, 0x52DF, 0x59C6, 0x5E3D, 0x6155, + 0x6478, 0x6479, 0x66AE, 0x67D0, 0x6A21, 0x6BCD, 0x6BDB, 0x725F, 0x7261, + 0x7441, 0x7738, 0x77DB, 0x8017, 0x82BC, 0x8305, 0x8B00, 0x8B28, 0x8C8C, + 0x6728, 0x6C90, 0x7267, 0x76EE, 0x7766, 0x7A46, 0x9DA9, 0x6B7F, 0x6C92, + 0x5922, 0x6726, 0x8499, 0x536F, 0x5893, 0x5999, 0x5EDF, 0x63CF, 0x6634, + 0x6773, 0x6E3A, 0x732B, 0x7AD7, 0x82D7, 0x9328, 0x52D9, 0x5DEB, 0x61AE, + 0x61CB, 0x620A, 0x62C7, 0x64AB, 0x65E0, 0x6959, 0x6B66, 0x6BCB, 0x7121, + 0x73F7, 0x755D, 0x7E46, 0x821E, 0x8302, 0x856A, 0x8AA3, 0x8CBF, 0x9727, + 0x9D61, 0x58A8, 0x9ED8, 0x5011, 0x520E, 0x543B, 0x554F, 0x6587, 0x6C76, + 0x7D0A, 0x7D0B, 0x805E, 0x868A, 0x9580, 0x96EF, 0x52FF, 0x6C95, 0x7269, + 0x5473, 0x5A9A, 0x5C3E, 0x5D4B, 0x5F4C, 0x5FAE, 0x672A, 0x68B6, 0x6963, + 0x6E3C, 0x6E44, 0x7709, 0x7C73, 0x7F8E, 0x8587, 0x8B0E, 0x8FF7, 0x9761, + 0x9EF4, 0x5CB7, 0x60B6, 0x610D, 0x61AB, 0x654F, 0x65FB, 0x65FC, 0x6C11, + 0x6CEF, 0x739F, 0x73C9, 0x7DE1, 0x9594, 0x5BC6, 0x871C, 0x8B10, 0x525D, + 0x535A, 0x62CD, 0x640F, 0x64B2, 0x6734, 0x6A38, 0x6CCA, 0x73C0, 0x749E, + 0x7B94, 0x7C95, 0x7E1B, 0x818A, 0x8236, 0x8584, 0x8FEB, 0x96F9, 0x99C1, + 0x4F34, 0x534A, 0x53CD, 0x53DB, 0x62CC, 0x642C, 0x6500, 0x6591, 0x69C3, + 0x6CEE, 0x6F58, 0x73ED, 0x7554, 0x7622, 0x76E4, 0x76FC, 0x78D0, 0x78FB, + 0x792C, 0x7D46, 0x822C, 0x87E0, 0x8FD4, 0x9812, 0x98EF, 0x52C3, 0x62D4, + 0x64A5, 0x6E24, 0x6F51, 0x767C, 0x8DCB, 0x91B1, 0x9262, 0x9AEE, 0x9B43, + 0x5023, 0x508D, 0x574A, 0x59A8, 0x5C28, 0x5E47, 0x5F77, 0x623F, 0x653E, + 0x65B9, 0x65C1, 0x6609, 0x678B, 0x699C, 0x6EC2, 0x78C5, 0x7D21, 0x80AA, + 0x8180, 0x822B, 0x82B3, 0x84A1, 0x868C, 0x8A2A, 0x8B17, 0x90A6, 0x9632, + 0x9F90, 0x500D, 0x4FF3, 0x57F9, 0x5F98, 0x62DC, 0x6392, 0x676F, 0x6E43, + 0x7119, 0x76C3, 0x80CC, 0x80DA, 0x88F4, 0x88F5, 0x8919, 0x8CE0, 0x8F29, + 0x914D, 0x966A, 0x4F2F, 0x4F70, 0x5E1B, 0x67CF, 0x6822, 0x767D, 0x767E, + 0x9B44, 0x5E61, 0x6A0A, 0x7169, 0x71D4, 0x756A, 0x7E41, 0x8543, 0x85E9, + 0x98DC, 0x4F10, 0x7B4F, 0x7F70, 0x95A5, 0x51E1, 0x5E06, 0x68B5, 0x6C3E, + 0x6C4E, 0x6CDB, 0x72AF, 0x7BC4, 0x8303, 0x6CD5, 0x743A, 0x50FB, 0x5288, + 0x58C1, 0x64D8, 0x6A97, 0x74A7, 0x7656, 0x78A7, 0x8617, 0x95E2, 0x9739, + 0x535E, 0x5F01, 0x8B8A, 0x8FA8, 0x8FAF, 0x908A, 0x5225, 0x77A5, 0x9C49, + 0x9F08, 0x4E19, 0x5002, 0x5175, 0x5C5B, 0x5E77, 0x661E, 0x663A, 0x67C4, + 0x68C5, 0x70B3, 0x7501, 0x75C5, 0x79C9, 0x7ADD, 0x8F27, 0x9920, 0x9A08, + 0x4FDD, 0x5821, 0x5831, 0x5BF6, 0x666E, 0x6B65, 0x6D11, 0x6E7A, 0x6F7D, + 0x73E4, 0x752B, 0x83E9, 0x88DC, 0x8913, 0x8B5C, 0x8F14, 0x4F0F, 0x50D5, + 0x5310, 0x535C, 0x5B93, 0x5FA9, 0x670D, 0x798F, 0x8179, 0x832F, 0x8514, + 0x8907, 0x8986, 0x8F39, 0x8F3B, 0x99A5, 0x9C12, 0x672C, 0x4E76, 0x4FF8, + 0x5949, 0x5C01, 0x5CEF, 0x5CF0, 0x6367, 0x68D2, 0x70FD, 0x71A2, 0x742B, + 0x7E2B, 0x84EC, 0x8702, 0x9022, 0x92D2, 0x9CF3, 0x4E0D, 0x4ED8, 0x4FEF, + 0x5085, 0x5256, 0x526F, 0x5426, 0x5490, 0x57E0, 0x592B, 0x5A66, 0x5B5A, + 0x5B75, 0x5BCC, 0x5E9C, 0x6276, 0x6577, 0x65A7, 0x6D6E, 0x6EA5, 0x7236, + 0x7B26, 0x7C3F, 0x7F36, 0x8150, 0x8151, 0x819A, 0x8240, 0x8299, 0x83A9, + 0x8A03, 0x8CA0, 0x8CE6, 0x8CFB, 0x8D74, 0x8DBA, 0x90E8, 0x91DC, 0x961C, + 0x9644, 0x99D9, 0x9CE7, 0x5317, 0x5206, 0x5429, 0x5674, 0x58B3, 0x5954, + 0x596E, 0x5FFF, 0x61A4, 0x626E, 0x6610, 0x6C7E, 0x711A, 0x76C6, 0x7C89, + 0x7CDE, 0x7D1B, 0x82AC, 0x8CC1, 0x96F0, 0x4F5B, 0x5F17, 0x5F7F, 0x62C2, + 0x5D29, 0x670B, 0x68DA, 0x787C, 0x7E43, 0x9D6C, 0x4E15, 0x5099, 0x5315, + 0x532A, 0x5351, 0x5983, 0x5A62, 0x5E87, 0x60B2, 0x618A, 0x6249, 0x6279, + 0x6590, 0x6787, 0x69A7, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6CB8, 0x7435, + 0x75FA, 0x7812, 0x7891, 0x79D5, 0x79D8, 0x7C83, 0x7DCB, 0x7FE1, 0x80A5, + 0x813E, 0x81C2, 0x83F2, 0x871A, 0x88E8, 0x8AB9, 0x8B6C, 0x8CBB, 0x9119, + 0x975E, 0x98DB, 0x9F3B, 0x56AC, 0x5B2A, 0x5F6C, 0x658C, 0x6AB3, 0x6BAF, + 0x6D5C, 0x6FF1, 0x7015, 0x725D, 0x73AD, 0x8CA7, 0x8CD3, 0x983B, 0x6191, + 0x6C37, 0x8058, 0x9A01, 0x4E4D, 0x4E8B, 0x4E9B, 0x4ED5, 0x4F3A, 0x4F3C, + 0x4F7F, 0x4FDF, 0x50FF, 0x53F2, 0x53F8, 0x5506, 0x55E3, 0x56DB, 0x58EB, + 0x5962, 0x5A11, 0x5BEB, 0x5BFA, 0x5C04, 0x5DF3, 0x5E2B, 0x5F99, 0x601D, + 0x6368, 0x659C, 0x65AF, 0x67F6, 0x67FB, 0x68AD, 0x6B7B, 0x6C99, 0x6CD7, + 0x6E23, 0x7009, 0x7345, 0x7802, 0x793E, 0x7940, 0x7960, 0x79C1, 0x7BE9, + 0x7D17, 0x7D72, 0x8086, 0x820D, 0x838E, 0x84D1, 0x86C7, 0x88DF, 0x8A50, + 0x8A5E, 0x8B1D, 0x8CDC, 0x8D66, 0x8FAD, 0x90AA, 0x98FC, 0x99DF, 0x9E9D, + 0x524A, 0x6714, 0x5098, 0x522A, 0x5C71, 0x6563, 0x6C55, 0x73CA, 0x7523, + 0x759D, 0x7B97, 0x849C, 0x9178, 0x9730, 0x4E77, 0x6492, 0x6BBA, 0x715E, + 0x85A9, 0x4E09, 0x6749, 0x68EE, 0x6E17, 0x829F, 0x8518, 0x886B, 0x63F7, + 0x6F81, 0x9212, 0x98AF, 0x4E0A, 0x50B7, 0x50CF, 0x511F, 0x5546, 0x55AA, + 0x5617, 0x5B40, 0x5C19, 0x5CE0, 0x5E38, 0x5E8A, 0x5EA0, 0x5EC2, 0x60F3, + 0x6851, 0x6A61, 0x6E58, 0x723D, 0x7240, 0x72C0, 0x76F8, 0x7965, 0x7BB1, + 0x7FD4, 0x88F3, 0x89F4, 0x8A73, 0x8C61, 0x8CDE, 0x971C, 0x585E, 0x74BD, + 0x8CFD, 0x55C7, 0x7A61, 0x7D22, 0x8272, 0x7272, 0x751F, 0x7525, 0x7B19, + 0x5885, 0x58FB, 0x5DBC, 0x5E8F, 0x5EB6, 0x5F90, 0x6055, 0x6292, 0x637F, + 0x654D, 0x6691, 0x66D9, 0x66F8, 0x6816, 0x68F2, 0x7280, 0x745E, 0x7B6E, + 0x7D6E, 0x7DD6, 0x7F72, 0x80E5, 0x8212, 0x85AF, 0x897F, 0x8A93, 0x901D, + 0x92E4, 0x9ECD, 0x9F20, 0x5915, 0x596D, 0x5E2D, 0x60DC, 0x6614, 0x6673, + 0x6790, 0x6C50, 0x6DC5, 0x6F5F, 0x77F3, 0x78A9, 0x84C6, 0x91CB, 0x932B, + 0x4ED9, 0x50CA, 0x5148, 0x5584, 0x5B0B, 0x5BA3, 0x6247, 0x657E, 0x65CB, + 0x6E32, 0x717D, 0x7401, 0x7444, 0x7487, 0x74BF, 0x766C, 0x79AA, 0x7DDA, + 0x7E55, 0x7FA8, 0x817A, 0x81B3, 0x8239, 0x861A, 0x87EC, 0x8A75, 0x8DE3, + 0x9078, 0x9291, 0x9425, 0x994D, 0x9BAE, 0x5368, 0x5C51, 0x6954, 0x6CC4, + 0x6D29, 0x6E2B, 0x820C, 0x859B, 0x893B, 0x8A2D, 0x8AAA, 0x96EA, 0x9F67, + 0x5261, 0x66B9, 0x6BB2, 0x7E96, 0x87FE, 0x8D0D, 0x9583, 0x965D, 0x651D, + 0x6D89, 0x71EE, 0x57CE, 0x59D3, 0x5BAC, 0x6027, 0x60FA, 0x6210, 0x661F, + 0x665F, 0x7329, 0x73F9, 0x76DB, 0x7701, 0x7B6C, 0x8056, 0x8072, 0x8165, + 0x8AA0, 0x9192, 0x4E16, 0x52E2, 0x6B72, 0x6D17, 0x7A05, 0x7B39, 0x7D30, + 0x8CB0, 0x53EC, 0x562F, 0x5851, 0x5BB5, 0x5C0F, 0x5C11, 0x5DE2, 0x6240, + 0x6383, 0x6414, 0x662D, 0x68B3, 0x6CBC, 0x6D88, 0x6EAF, 0x701F, 0x70A4, + 0x71D2, 0x7526, 0x758F, 0x758E, 0x7619, 0x7B11, 0x7BE0, 0x7C2B, 0x7D20, + 0x7D39, 0x852C, 0x856D, 0x8607, 0x8A34, 0x900D, 0x9061, 0x90B5, 0x92B7, + 0x97F6, 0x9A37, 0x4FD7, 0x5C6C, 0x675F, 0x6D91, 0x7C9F, 0x7E8C, 0x8B16, + 0x8D16, 0x901F, 0x5B6B, 0x5DFD, 0x640D, 0x84C0, 0x905C, 0x98E1, 0x7387, + 0x5B8B, 0x609A, 0x677E, 0x6DDE, 0x8A1F, 0x8AA6, 0x9001, 0x980C, 0x5237, + 0x7051, 0x788E, 0x9396, 0x8870, 0x91D7, 0x4FEE, 0x53D7, 0x55FD, 0x56DA, + 0x5782, 0x58FD, 0x5AC2, 0x5B88, 0x5CAB, 0x5CC0, 0x5E25, 0x6101, 0x620D, + 0x624B, 0x6388, 0x641C, 0x6536, 0x6578, 0x6A39, 0x6B8A, 0x6C34, 0x6D19, + 0x6F31, 0x71E7, 0x72E9, 0x7378, 0x7407, 0x74B2, 0x7626, 0x7761, 0x79C0, + 0x7A57, 0x7AEA, 0x7CB9, 0x7D8F, 0x7DAC, 0x7E61, 0x7F9E, 0x8129, 0x8331, + 0x8490, 0x84DA, 0x85EA, 0x8896, 0x8AB0, 0x8B90, 0x8F38, 0x9042, 0x9083, + 0x916C, 0x9296, 0x92B9, 0x968B, 0x96A7, 0x96A8, 0x96D6, 0x9700, 0x9808, + 0x9996, 0x9AD3, 0x9B1A, 0x53D4, 0x587E, 0x5919, 0x5B70, 0x5BBF, 0x6DD1, + 0x6F5A, 0x719F, 0x7421, 0x74B9, 0x8085, 0x83FD, 0x5DE1, 0x5F87, 0x5FAA, + 0x6042, 0x65EC, 0x6812, 0x696F, 0x6A53, 0x6B89, 0x6D35, 0x6DF3, 0x73E3, + 0x76FE, 0x77AC, 0x7B4D, 0x7D14, 0x8123, 0x821C, 0x8340, 0x84F4, 0x8563, + 0x8A62, 0x8AC4, 0x9187, 0x931E, 0x9806, 0x99B4, 0x620C, 0x8853, 0x8FF0, + 0x9265, 0x5D07, 0x5D27, 0x5D69, 0x745F, 0x819D, 0x8768, 0x6FD5, 0x62FE, + 0x7FD2, 0x8936, 0x8972, 0x4E1E, 0x4E58, 0x50E7, 0x52DD, 0x5347, 0x627F, + 0x6607, 0x7E69, 0x8805, 0x965E, 0x4F8D, 0x5319, 0x5636, 0x59CB, 0x5AA4, + 0x5C38, 0x5C4E, 0x5C4D, 0x5E02, 0x5F11, 0x6043, 0x65BD, 0x662F, 0x6642, + 0x67BE, 0x67F4, 0x731C, 0x77E2, 0x793A, 0x7FC5, 0x8494, 0x84CD, 0x8996, + 0x8A66, 0x8A69, 0x8AE1, 0x8C55, 0x8C7A, 0x57F4, 0x5BD4, 0x5F0F, 0x606F, + 0x62ED, 0x690D, 0x6B96, 0x6E5C, 0x7184, 0x7BD2, 0x8755, 0x8B58, 0x8EFE, + 0x98DF, 0x98FE, 0x4F38, 0x4F81, 0x4FE1, 0x547B, 0x5A20, 0x5BB8, 0x613C, + 0x65B0, 0x6668, 0x71FC, 0x7533, 0x795E, 0x7D33, 0x814E, 0x81E3, 0x8398, + 0x85AA, 0x85CE, 0x8703, 0x8A0A, 0x8EAB, 0x8F9B, 0x8FC5, 0x5931, 0x5BA4, + 0x5BE6, 0x6089, 0x5BE9, 0x5C0B, 0x5FC3, 0x6C81, 0x6DF1, 0x700B, 0x751A, + 0x82AF, 0x8AF6, 0x4EC0, 0x5341, 0x96D9, 0x6C0F, 0x4E9E, 0x4FC4, 0x5152, + 0x555E, 0x5A25, 0x5CE8, 0x6211, 0x7259, 0x82BD, 0x83AA, 0x86FE, 0x8859, + 0x8A1D, 0x963F, 0x96C5, 0x9913, 0x9D09, 0x9D5D, 0x580A, 0x5CB3, 0x5DBD, + 0x5E44, 0x60E1, 0x6115, 0x63E1, 0x6A02, 0x6E25, 0x9102, 0x9354, 0x984E, + 0x9C10, 0x9F77, 0x5B89, 0x5CB8, 0x6309, 0x664F, 0x6848, 0x773C, 0x96C1, + 0x978D, 0x9854, 0x9B9F, 0x65A1, 0x8B01, 0x8ECB, 0x95BC, 0x5535, 0x5CA9, + 0x5DD6, 0x5EB5, 0x6697, 0x764C, 0x83F4, 0x95C7, 0x58D3, 0x62BC, 0x72CE, + 0x9D28, 0x4EF0, 0x592E, 0x600F, 0x663B, 0x6B83, 0x79E7, 0x9D26, 0x5393, + 0x54C0, 0x57C3, 0x5D16, 0x611B, 0x66D6, 0x6DAF, 0x788D, 0x827E, 0x9698, + 0x9744, 0x5384, 0x627C, 0x6396, 0x6DB2, 0x7E0A, 0x814B, 0x984D, 0x6AFB, + 0x7F4C, 0x9DAF, 0x9E1A, 0x4E5F, 0x503B, 0x51B6, 0x591C, 0x60F9, 0x63F6, + 0x6930, 0x723A, 0x8036, 0x91CE, 0x5F31, 0x7D04, 0x82E5, 0x846F, 0x84BB, + 0x85E5, 0x8E8D, 0x4F6F, 0x58E4, 0x5B43, 0x6059, 0x63DA, 0x6518, 0x656D, + 0x6698, 0x694A, 0x6A23, 0x6D0B, 0x7001, 0x716C, 0x75D2, 0x760D, 0x79B3, + 0x7A70, 0x7F8A, 0x8944, 0x8B93, 0x91C0, 0x967D, 0x990A, 0x5704, 0x5FA1, + 0x65BC, 0x6F01, 0x7600, 0x79A6, 0x8A9E, 0x99AD, 0x9B5A, 0x9F6C, 0x5104, + 0x61B6, 0x6291, 0x6A8D, 0x81C6, 0x5043, 0x5830, 0x5F66, 0x7109, 0x8A00, + 0x8AFA, 0x5B7C, 0x8616, 0x4FFA, 0x513C, 0x56B4, 0x5944, 0x63A9, 0x6DF9, + 0x5DAA, 0x696D, 0x5186, 0x4E88, 0x4F59, 0x5982, 0x6B5F, 0x6C5D, 0x74B5, + 0x7916, 0x8207, 0x8245, 0x8339, 0x8F3F, 0x8F5D, 0x9918, 0x4EA6, 0x57DF, + 0x5F79, 0x6613, 0x75AB, 0x7E79, 0x8B6F, 0x9006, 0x9A5B, 0x56A5, 0x5827, + 0x59F8, 0x5A1F, 0x5BB4, 0x5EF6, 0x6350, 0x633B, 0x693D, 0x6C87, 0x6CBF, + 0x6D8E, 0x6D93, 0x6DF5, 0x6F14, 0x70DF, 0x7136, 0x7159, 0x71C3, 0x71D5, + 0x784F, 0x786F, 0x7B75, 0x7DE3, 0x7E2F, 0x884D, 0x8EDF, 0x925B, 0x9CF6, + 0x6085, 0x6D85, 0x71B1, 0x95B1, 0x53AD, 0x67D3, 0x708E, 0x7130, 0x7430, + 0x8276, 0x82D2, 0x95BB, 0x9AE5, 0x9E7D, 0x66C4, 0x71C1, 0x8449, 0x584B, + 0x5DB8, 0x5F71, 0x6620, 0x668E, 0x6979, 0x69AE, 0x6C38, 0x6CF3, 0x6E36, + 0x6F41, 0x6FDA, 0x701B, 0x702F, 0x7150, 0x71DF, 0x7370, 0x745B, 0x74D4, + 0x76C8, 0x7A4E, 0x7E93, 0x82F1, 0x8A60, 0x8FCE, 0x9348, 0x9719, 0x4E42, + 0x502A, 0x5208, 0x53E1, 0x66F3, 0x6C6D, 0x6FCA, 0x730A, 0x777F, 0x7A62, + 0x82AE, 0x85DD, 0x8602, 0x88D4, 0x8A63, 0x8B7D, 0x8C6B, 0x92B3, 0x9713, + 0x9810, 0x4E94, 0x4F0D, 0x4FC9, 0x50B2, 0x5348, 0x543E, 0x5433, 0x55DA, + 0x5862, 0x58BA, 0x5967, 0x5A1B, 0x5BE4, 0x609F, 0x61CA, 0x6556, 0x65FF, + 0x6664, 0x68A7, 0x6C5A, 0x6FB3, 0x70CF, 0x71AC, 0x7352, 0x7B7D, 0x8708, + 0x8AA4, 0x9C32, 0x9F07, 0x5C4B, 0x6C83, 0x7344, 0x7389, 0x923A, 0x6EAB, + 0x7465, 0x761F, 0x7A69, 0x7E15, 0x860A, 0x5140, 0x58C5, 0x64C1, 0x74EE, + 0x7515, 0x7670, 0x7FC1, 0x9095, 0x96CD, 0x9954, 0x6E26, 0x74E6, 0x7AA9, + 0x7AAA, 0x81E5, 0x86D9, 0x8778, 0x8A1B, 0x5A49, 0x5B8C, 0x5B9B, 0x68A1, + 0x6900, 0x6D63, 0x73A9, 0x7413, 0x742C, 0x7897, 0x7DE9, 0x7FEB, 0x8118, + 0x8155, 0x839E, 0x8C4C, 0x962E, 0x9811, 0x66F0, 0x5F80, 0x65FA, 0x6789, + 0x6C6A, 0x738B, 0x502D, 0x5A03, 0x6B6A, 0x77EE, 0x5916, 0x5D6C, 0x5DCD, + 0x7325, 0x754F, 0x50E5, 0x51F9, 0x582F, 0x592D, 0x5996, 0x59DA, 0x5BE5, + 0x5DA2, 0x62D7, 0x6416, 0x6493, 0x64FE, 0x66DC, 0x6A48, 0x71FF, 0x7464, + 0x7A88, 0x7AAF, 0x7E47, 0x7E5E, 0x8000, 0x8170, 0x87EF, 0x8981, 0x8B20, + 0x9059, 0x9080, 0x9952, 0x617E, 0x6B32, 0x6D74, 0x7E1F, 0x8925, 0x8FB1, + 0x4FD1, 0x50AD, 0x5197, 0x52C7, 0x57C7, 0x5889, 0x5BB9, 0x5EB8, 0x6142, + 0x6995, 0x6D8C, 0x6E67, 0x6EB6, 0x7194, 0x7462, 0x7528, 0x752C, 0x8073, + 0x8338, 0x84C9, 0x8E0A, 0x9394, 0x93DE, 0x4E8E, 0x4F51, 0x5076, 0x512A, + 0x53C8, 0x53CB, 0x53F3, 0x5B87, 0x5BD3, 0x5C24, 0x611A, 0x6182, 0x65F4, + 0x725B, 0x7397, 0x7440, 0x76C2, 0x7950, 0x7991, 0x79B9, 0x7D06, 0x7FBD, + 0x828B, 0x85D5, 0x865E, 0x8FC2, 0x9047, 0x90F5, 0x91EA, 0x9685, 0x96E8, + 0x96E9, 0x52D6, 0x5F67, 0x65ED, 0x6631, 0x682F, 0x715C, 0x7A36, 0x90C1, + 0x980A, 0x4E91, 0x6A52, 0x6B9E, 0x6F90, 0x7189, 0x8018, 0x82B8, 0x8553, + 0x904B, 0x9695, 0x96F2, 0x97FB, 0x851A, 0x9B31, 0x4E90, 0x718A, 0x96C4, + 0x5143, 0x539F, 0x54E1, 0x5713, 0x5712, 0x57A3, 0x5A9B, 0x5AC4, 0x5BC3, + 0x6028, 0x613F, 0x63F4, 0x6C85, 0x6D39, 0x6E72, 0x6E90, 0x7230, 0x733F, + 0x7457, 0x82D1, 0x8881, 0x8F45, 0x9060, 0x9662, 0x9858, 0x9D1B, 0x6708, + 0x8D8A, 0x925E, 0x4F4D, 0x5049, 0x50DE, 0x5371, 0x570D, 0x59D4, 0x5A01, + 0x5C09, 0x6170, 0x6690, 0x6E2D, 0x7232, 0x744B, 0x7DEF, 0x80C3, 0x840E, + 0x8466, 0x853F, 0x875F, 0x885B, 0x8918, 0x8B02, 0x9055, 0x97CB, 0x9B4F, + 0x4E73, 0x4F91, 0x5112, 0x516A, 0x552F, 0x55A9, 0x5B7A, 0x5BA5, 0x5E7C, + 0x5E7D, 0x5EBE, 0x60A0, 0x60DF, 0x6108, 0x6109, 0x63C4, 0x6538, 0x6709, + 0x67D4, 0x67DA, 0x6961, 0x6962, 0x6CB9, 0x6D27, 0x6E38, 0x6FE1, 0x7336, + 0x7337, 0x745C, 0x7531, 0x7652, 0x7DAD, 0x81FE, 0x8438, 0x88D5, 0x8A98, + 0x8ADB, 0x8AED, 0x8E30, 0x8E42, 0x904A, 0x903E, 0x907A, 0x9149, 0x91C9, + 0x936E, 0x5809, 0x6BD3, 0x8089, 0x80B2, 0x5141, 0x596B, 0x5C39, 0x6F64, + 0x73A7, 0x80E4, 0x8D07, 0x9217, 0x958F, 0x807F, 0x620E, 0x701C, 0x7D68, + 0x878D, 0x57A0, 0x6069, 0x6147, 0x6BB7, 0x8ABE, 0x9280, 0x96B1, 0x4E59, + 0x541F, 0x6DEB, 0x852D, 0x9670, 0x97F3, 0x98EE, 0x63D6, 0x6CE3, 0x9091, + 0x51DD, 0x61C9, 0x81BA, 0x9DF9, 0x4F9D, 0x501A, 0x5100, 0x5B9C, 0x610F, + 0x61FF, 0x64EC, 0x6905, 0x6BC5, 0x7591, 0x77E3, 0x7FA9, 0x8264, 0x858F, + 0x87FB, 0x8863, 0x8ABC, 0x8B70, 0x91AB, 0x4E8C, 0x4EE5, 0x4F0A, 0x5937, + 0x59E8, 0x5DF2, 0x5F1B, 0x5F5B, 0x6021, 0x723E, 0x73E5, 0x7570, 0x75CD, + 0x79FB, 0x800C, 0x8033, 0x8084, 0x82E1, 0x8351, 0x8CBD, 0x8CB3, 0x9087, + 0x98F4, 0x990C, 0x7037, 0x76CA, 0x7FCA, 0x7FCC, 0x7FFC, 0x8B1A, 0x4EBA, + 0x4EC1, 0x5203, 0x5370, 0x54BD, 0x56E0, 0x59FB, 0x5BC5, 0x5F15, 0x5FCD, + 0x6E6E, 0x7D6A, 0x8335, 0x8693, 0x8A8D, 0x976D, 0x9777, 0x4E00, 0x4F5A, + 0x4F7E, 0x58F9, 0x65E5, 0x6EA2, 0x9038, 0x93B0, 0x99B9, 0x4EFB, 0x58EC, + 0x598A, 0x59D9, 0x6041, 0x7A14, 0x834F, 0x8CC3, 0x5165, 0x5344, 0x4ECD, + 0x5269, 0x5B55, 0x82BF, 0x4ED4, 0x523A, 0x54A8, 0x59C9, 0x59FF, 0x5B50, + 0x5B57, 0x5B5C, 0x6063, 0x6148, 0x6ECB, 0x7099, 0x716E, 0x7386, 0x74F7, + 0x75B5, 0x78C1, 0x7D2B, 0x8005, 0x81EA, 0x8328, 0x8517, 0x85C9, 0x8AEE, + 0x8CC7, 0x96CC, 0x4F5C, 0x52FA, 0x56BC, 0x65AB, 0x6628, 0x707C, 0x70B8, + 0x7235, 0x7DBD, 0x828D, 0x914C, 0x96C0, 0x9D72, 0x5B71, 0x68E7, 0x6B98, + 0x6F7A, 0x76DE, 0x5C91, 0x66AB, 0x6F5B, 0x7BB4, 0x7C2A, 0x8836, 0x96DC, + 0x4E08, 0x4ED7, 0x5320, 0x5834, 0x58BB, 0x58EF, 0x596C, 0x5C07, 0x5E33, + 0x5E84, 0x5F35, 0x638C, 0x66B2, 0x6756, 0x6A1F, 0x6AA3, 0x6B0C, 0x6F3F, + 0x7246, 0x7350, 0x748B, 0x7AE0, 0x7CA7, 0x8178, 0x81DF, 0x81E7, 0x838A, + 0x846C, 0x8523, 0x8594, 0x85CF, 0x88DD, 0x8D13, 0x91AC, 0x9577, 0x969C, + 0x518D, 0x54C9, 0x5728, 0x5BB0, 0x624D, 0x6750, 0x683D, 0x6893, 0x6E3D, + 0x6ED3, 0x707D, 0x7E21, 0x88C1, 0x8CA1, 0x8F09, 0x9F4B, 0x9F4E, 0x722D, + 0x7B8F, 0x8ACD, 0x931A, 0x4F47, 0x4F4E, 0x5132, 0x5480, 0x59D0, 0x5E95, + 0x62B5, 0x6775, 0x696E, 0x6A17, 0x6CAE, 0x6E1A, 0x72D9, 0x732A, 0x75BD, + 0x7BB8, 0x7D35, 0x82E7, 0x83F9, 0x8457, 0x85F7, 0x8A5B, 0x8CAF, 0x8E87, + 0x9019, 0x90B8, 0x96CE, 0x9F5F, 0x52E3, 0x540A, 0x5AE1, 0x5BC2, 0x6458, + 0x6575, 0x6EF4, 0x72C4, 0x7684, 0x7A4D, 0x7B1B, 0x7C4D, 0x7E3E, 0x7FDF, + 0x837B, 0x8B2B, 0x8CCA, 0x8D64, 0x8DE1, 0x8E5F, 0x8FEA, 0x8FF9, 0x9069, + 0x93D1, 0x4F43, 0x4F7A, 0x50B3, 0x5168, 0x5178, 0x524D, 0x526A, 0x5861, + 0x587C, 0x5960, 0x5C08, 0x5C55, 0x5EDB, 0x609B, 0x6230, 0x6813, 0x6BBF, + 0x6C08, 0x6FB1, 0x714E, 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7B4C, + 0x7B8B, 0x7BAD, 0x7BC6, 0x7E8F, 0x8A6E, 0x8F3E, 0x8F49, 0x923F, 0x9293, + 0x9322, 0x942B, 0x96FB, 0x985A, 0x986B, 0x991E, 0x5207, 0x622A, 0x6298, + 0x6D59, 0x7664, 0x7ACA, 0x7BC0, 0x7D76, 0x5360, 0x5CBE, 0x5E97, 0x6F38, + 0x70B9, 0x7C98, 0x9711, 0x9B8E, 0x9EDE, 0x63A5, 0x647A, 0x8776, 0x4E01, + 0x4E95, 0x4EAD, 0x505C, 0x5075, 0x5448, 0x59C3, 0x5B9A, 0x5E40, 0x5EAD, + 0x5EF7, 0x5F81, 0x60C5, 0x633A, 0x653F, 0x6574, 0x65CC, 0x6676, 0x6678, + 0x67FE, 0x6968, 0x6A89, 0x6B63, 0x6C40, 0x6DC0, 0x6DE8, 0x6E1F, 0x6E5E, + 0x701E, 0x70A1, 0x738E, 0x73FD, 0x753A, 0x775B, 0x7887, 0x798E, 0x7A0B, + 0x7A7D, 0x7CBE, 0x7D8E, 0x8247, 0x8A02, 0x8AEA, 0x8C9E, 0x912D, 0x914A, + 0x91D8, 0x9266, 0x92CC, 0x9320, 0x9706, 0x9756, 0x975C, 0x9802, 0x9F0E, + 0x5236, 0x5291, 0x557C, 0x5824, 0x5E1D, 0x5F1F, 0x608C, 0x63D0, 0x68AF, + 0x6FDF, 0x796D, 0x7B2C, 0x81CD, 0x85BA, 0x88FD, 0x8AF8, 0x8E44, 0x918D, + 0x9664, 0x969B, 0x973D, 0x984C, 0x9F4A, 0x4FCE, 0x5146, 0x51CB, 0x52A9, + 0x5632, 0x5F14, 0x5F6B, 0x63AA, 0x64CD, 0x65E9, 0x6641, 0x66FA, 0x66F9, + 0x671D, 0x689D, 0x68D7, 0x69FD, 0x6F15, 0x6F6E, 0x7167, 0x71E5, 0x722A, + 0x74AA, 0x773A, 0x7956, 0x795A, 0x79DF, 0x7A20, 0x7A95, 0x7C97, 0x7CDF, + 0x7D44, 0x7E70, 0x8087, 0x85FB, 0x86A4, 0x8A54, 0x8ABF, 0x8D99, 0x8E81, + 0x9020, 0x906D, 0x91E3, 0x963B, 0x96D5, 0x9CE5, 0x65CF, 0x7C07, 0x8DB3, + 0x93C3, 0x5B58, 0x5C0A, 0x5352, 0x62D9, 0x731D, 0x5027, 0x5B97, 0x5F9E, + 0x60B0, 0x616B, 0x68D5, 0x6DD9, 0x742E, 0x7A2E, 0x7D42, 0x7D9C, 0x7E31, + 0x816B, 0x8E2A, 0x8E35, 0x937E, 0x9418, 0x4F50, 0x5750, 0x5DE6, 0x5EA7, + 0x632B, 0x7F6A, 0x4E3B, 0x4F4F, 0x4F8F, 0x505A, 0x59DD, 0x80C4, 0x546A, + 0x5468, 0x55FE, 0x594F, 0x5B99, 0x5DDE, 0x5EDA, 0x665D, 0x6731, 0x67F1, + 0x682A, 0x6CE8, 0x6D32, 0x6E4A, 0x6F8D, 0x70B7, 0x73E0, 0x7587, 0x7C4C, + 0x7D02, 0x7D2C, 0x7DA2, 0x821F, 0x86DB, 0x8A3B, 0x8A85, 0x8D70, 0x8E8A, + 0x8F33, 0x9031, 0x914E, 0x9152, 0x9444, 0x99D0, 0x7AF9, 0x7CA5, 0x4FCA, + 0x5101, 0x51C6, 0x57C8, 0x5BEF, 0x5CFB, 0x6659, 0x6A3D, 0x6D5A, 0x6E96, + 0x6FEC, 0x710C, 0x756F, 0x7AE3, 0x8822, 0x9021, 0x9075, 0x96CB, 0x99FF, + 0x8301, 0x4E2D, 0x4EF2, 0x8846, 0x91CD, 0x537D, 0x6ADB, 0x696B, 0x6C41, + 0x847A, 0x589E, 0x618E, 0x66FE, 0x62EF, 0x70DD, 0x7511, 0x75C7, 0x7E52, + 0x84B8, 0x8B49, 0x8D08, 0x4E4B, 0x53EA, 0x54AB, 0x5730, 0x5740, 0x5FD7, + 0x6301, 0x6307, 0x646F, 0x652F, 0x65E8, 0x667A, 0x679D, 0x67B3, 0x6B62, + 0x6C60, 0x6C9A, 0x6F2C, 0x77E5, 0x7825, 0x7949, 0x7957, 0x7D19, 0x80A2, + 0x8102, 0x81F3, 0x829D, 0x82B7, 0x8718, 0x8A8C, 0x8D04, 0x8DBE, 0x9072, + 0x76F4, 0x7A19, 0x7A37, 0x7E54, 0x8077, 0x5507, 0x55D4, 0x5875, 0x632F, + 0x6422, 0x6649, 0x664B, 0x686D, 0x699B, 0x6B84, 0x6D25, 0x6EB1, 0x73CD, + 0x7468, 0x74A1, 0x755B, 0x75B9, 0x76E1, 0x771E, 0x778B, 0x79E6, 0x7E09, + 0x7E1D, 0x81FB, 0x852F, 0x8897, 0x8A3A, 0x8CD1, 0x8EEB, 0x8FB0, 0x9032, + 0x93AD, 0x9663, 0x9673, 0x9707, 0x4F84, 0x53F1, 0x59EA, 0x5AC9, 0x5E19, + 0x684E, 0x74C6, 0x75BE, 0x79E9, 0x7A92, 0x81A3, 0x86ED, 0x8CEA, 0x8DCC, + 0x8FED, 0x659F, 0x6715, 0x57F7, 0x6F57, 0x7DDD, 0x8F2F, 0x93F6, 0x96C6, + 0x5FB5, 0x61F2, 0x6F84, 0x4E14, 0x4F98, 0x501F, 0x53C9, 0x55DF, 0x5D6F, + 0x5DEE, 0x6B21, 0x6B64, 0x78CB, 0x7B9A, 0x8E49, 0x8ECA, 0x906E, 0x6349, + 0x643E, 0x7740, 0x7A84, 0x932F, 0x947F, 0x9F6A, 0x64B0, 0x6FAF, 0x71E6, + 0x74A8, 0x74DA, 0x7AC4, 0x7C12, 0x7E82, 0x7CB2, 0x7E98, 0x8B9A, 0x8D0A, + 0x947D, 0x9910, 0x994C, 0x5239, 0x5BDF, 0x64E6, 0x672D, 0x7D2E, 0x50ED, + 0x53C3, 0x5879, 0x6158, 0x6159, 0x61FA, 0x65AC, 0x7AD9, 0x8B92, 0x8B96, + 0x5009, 0x5021, 0x5275, 0x5531, 0x5A3C, 0x5EE0, 0x5F70, 0x6134, 0x655E, + 0x660C, 0x6636, 0x66A2, 0x69CD, 0x6EC4, 0x6F32, 0x7316, 0x7621, 0x7A93, + 0x8139, 0x8259, 0x83D6, 0x84BC, 0x50B5, 0x57F0, 0x5BC0, 0x5BE8, 0x5F69, + 0x63A1, 0x7826, 0x7DB5, 0x83DC, 0x8521, 0x91C7, 0x91F5, 0x518A, 0x67F5, + 0x7B56, 0x8CAC, 0x51C4, 0x59BB, 0x60BD, 0x8655, 0x501C, 0x5254, 0x5C3A, + 0x617D, 0x621A, 0x62D3, 0x64F2, 0x65A5, 0x6ECC, 0x7620, 0x810A, 0x8E60, + 0x965F, 0x96BB, 0x4EDF, 0x5343, 0x5598, 0x5929, 0x5DDD, 0x64C5, 0x6CC9, + 0x6DFA, 0x7394, 0x7A7F, 0x821B, 0x85A6, 0x8CE4, 0x8E10, 0x9077, 0x91E7, + 0x95E1, 0x9621, 0x97C6, 0x51F8, 0x54F2, 0x5586, 0x5FB9, 0x64A4, 0x6F88, + 0x7DB4, 0x8F1F, 0x8F4D, 0x9435, 0x50C9, 0x5C16, 0x6CBE, 0x6DFB, 0x751B, + 0x77BB, 0x7C3D, 0x7C64, 0x8A79, 0x8AC2, 0x581E, 0x59BE, 0x5E16, 0x6377, + 0x7252, 0x758A, 0x776B, 0x8ADC, 0x8CBC, 0x8F12, 0x5EF3, 0x6674, 0x6DF8, + 0x807D, 0x83C1, 0x8ACB, 0x9751, 0x9BD6, 0x5243, 0x66FF, 0x6D95, 0x6EEF, + 0x7DE0, 0x8AE6, 0x902E, 0x905E, 0x9AD4, 0x521D, 0x527F, 0x54E8, 0x6194, + 0x6284, 0x62DB, 0x68A2, 0x6912, 0x695A, 0x6A35, 0x7092, 0x7126, 0x785D, + 0x7901, 0x790E, 0x79D2, 0x7A0D, 0x8096, 0x8278, 0x82D5, 0x8349, 0x8549, + 0x8C82, 0x8D85, 0x9162, 0x918B, 0x91AE, 0x4FC3, 0x56D1, 0x71ED, 0x77D7, + 0x8700, 0x89F8, 0x5BF8, 0x5FD6, 0x6751, 0x90A8, 0x53E2, 0x585A, 0x5BF5, + 0x60A4, 0x6181, 0x6460, 0x7E3D, 0x8070, 0x8525, 0x9283, 0x64AE, 0x50AC, + 0x5D14, 0x6700, 0x589C, 0x62BD, 0x63A8, 0x690E, 0x6978, 0x6A1E, 0x6E6B, + 0x76BA, 0x79CB, 0x82BB, 0x8429, 0x8ACF, 0x8DA8, 0x8FFD, 0x9112, 0x914B, + 0x919C, 0x9310, 0x9318, 0x939A, 0x96DB, 0x9A36, 0x9C0D, 0x4E11, 0x755C, + 0x795D, 0x7AFA, 0x7B51, 0x7BC9, 0x7E2E, 0x84C4, 0x8E59, 0x8E74, 0x8EF8, + 0x9010, 0x6625, 0x693F, 0x7443, 0x51FA, 0x672E, 0x9EDC, 0x5145, 0x5FE0, + 0x6C96, 0x87F2, 0x885D, 0x8877, 0x60B4, 0x81B5, 0x8403, 0x8D05, 0x53D6, + 0x5439, 0x5634, 0x5A36, 0x5C31, 0x708A, 0x7FE0, 0x805A, 0x8106, 0x81ED, + 0x8DA3, 0x9189, 0x9A5F, 0x9DF2, 0x5074, 0x4EC4, 0x53A0, 0x60FB, 0x6E2C, + 0x5C64, 0x4F88, 0x5024, 0x55E4, 0x5CD9, 0x5E5F, 0x6065, 0x6894, 0x6CBB, + 0x6DC4, 0x71BE, 0x75D4, 0x75F4, 0x7661, 0x7A1A, 0x7A49, 0x7DC7, 0x7DFB, + 0x7F6E, 0x81F4, 0x86A9, 0x8F1C, 0x96C9, 0x99B3, 0x9F52, 0x5247, 0x52C5, + 0x98ED, 0x89AA, 0x4E03, 0x67D2, 0x6F06, 0x4FB5, 0x5BE2, 0x6795, 0x6C88, + 0x6D78, 0x741B, 0x7827, 0x91DD, 0x937C, 0x87C4, 0x79E4, 0x7A31, 0x5FEB, + 0x4ED6, 0x54A4, 0x553E, 0x58AE, 0x59A5, 0x60F0, 0x6253, 0x62D6, 0x6736, + 0x6955, 0x8235, 0x9640, 0x99B1, 0x99DD, 0x502C, 0x5353, 0x5544, 0x577C, + 0x6258, 0x64E2, 0x666B, 0x67DD, 0x6FC1, 0x6FEF, 0x7422, 0x7438, 0x8A17, + 0x9438, 0x5451, 0x5606, 0x5766, 0x5F48, 0x619A, 0x6B4E, 0x7058, 0x70AD, + 0x7DBB, 0x8A95, 0x596A, 0x812B, 0x63A2, 0x7708, 0x803D, 0x8CAA, 0x5854, + 0x642D, 0x69BB, 0x5B95, 0x5E11, 0x6E6F, 0x8569, 0x514C, 0x53F0, 0x592A, + 0x6020, 0x614B, 0x6B86, 0x6C70, 0x6CF0, 0x7B1E, 0x80CE, 0x82D4, 0x8DC6, + 0x90B0, 0x98B1, 0x64C7, 0x6FA4, 0x6491, 0x6504, 0x514E, 0x5410, 0x571F, + 0x8A0E, 0x615F, 0x6876, 0x75DB, 0x7B52, 0x7D71, 0x901A, 0x5806, 0x69CC, + 0x817F, 0x892A, 0x9000, 0x9839, 0x5078, 0x5957, 0x59AC, 0x6295, 0x900F, + 0x9B2A, 0x615D, 0x7279, 0x95D6, 0x5761, 0x5A46, 0x5DF4, 0x628A, 0x64AD, + 0x64FA, 0x6777, 0x6CE2, 0x6D3E, 0x722C, 0x7436, 0x7834, 0x7F77, 0x82AD, + 0x8DDB, 0x9817, 0x5224, 0x5742, 0x677F, 0x7248, 0x74E3, 0x8CA9, 0x8FA6, + 0x9211, 0x962A, 0x516B, 0x53ED, 0x634C, 0x4F69, 0x5504, 0x6096, 0x6557, + 0x6C9B, 0x6D7F, 0x724C, 0x72FD, 0x7A17, 0x8987, 0x8C9D, 0x5F6D, 0x6F8E, + 0x70F9, 0x81A8, 0x610E, 0x4FBF, 0x504F, 0x6241, 0x7247, 0x7BC7, 0x7DE8, + 0x7FE9, 0x904D, 0x97AD, 0x9A19, 0x8CB6, 0x576A, 0x5E73, 0x67B0, 0x840D, + 0x8A55, 0x5420, 0x5B16, 0x5E63, 0x5EE2, 0x5F0A, 0x6583, 0x80BA, 0x853D, + 0x9589, 0x965B, 0x4F48, 0x5305, 0x530D, 0x530F, 0x5486, 0x54FA, 0x5703, + 0x5E03, 0x6016, 0x629B, 0x62B1, 0x6355, 0x6CE1, 0x6D66, 0x75B1, 0x7832, + 0x80DE, 0x812F, 0x82DE, 0x8461, 0x84B2, 0x888D, 0x8912, 0x900B, 0x92EA, + 0x98FD, 0x9B91, 0x5E45, 0x66B4, 0x66DD, 0x7011, 0x7206, 0x4FF5, 0x527D, + 0x5F6A, 0x6153, 0x6753, 0x6A19, 0x6F02, 0x74E2, 0x7968, 0x8868, 0x8C79, + 0x98C7, 0x98C4, 0x9A43, 0x54C1, 0x7A1F, 0x6953, 0x8AF7, 0x8C4A, 0x98A8, + 0x99AE, 0x5F7C, 0x62AB, 0x75B2, 0x76AE, 0x88AB, 0x907F, 0x9642, 0x5339, + 0x5F3C, 0x5FC5, 0x6CCC, 0x73CC, 0x7562, 0x758B, 0x7B46, 0x82FE, 0x999D, + 0x4E4F, 0x903C, 0x4E0B, 0x4F55, 0x53A6, 0x590F, 0x5EC8, 0x6630, 0x6CB3, + 0x7455, 0x8377, 0x8766, 0x8CC0, 0x9050, 0x971E, 0x9C15, 0x58D1, 0x5B78, + 0x8650, 0x8B14, 0x9DB4, 0x5BD2, 0x6068, 0x608D, 0x65F1, 0x6C57, 0x6F22, + 0x6FA3, 0x701A, 0x7F55, 0x7FF0, 0x9591, 0x9592, 0x9650, 0x97D3, 0x5272, + 0x8F44, 0x51FD, 0x542B, 0x54B8, 0x5563, 0x558A, 0x6ABB, 0x6DB5, 0x7DD8, + 0x8266, 0x929C, 0x9677, 0x9E79, 0x5408, 0x54C8, 0x76D2, 0x86E4, 0x95A4, + 0x95D4, 0x965C, 0x4EA2, 0x4F09, 0x59EE, 0x5AE6, 0x5DF7, 0x6052, 0x6297, + 0x676D, 0x6841, 0x6C86, 0x6E2F, 0x7F38, 0x809B, 0x822A, 0x9805, 0x4EA5, + 0x5055, 0x54B3, 0x5793, 0x595A, 0x5B69, 0x5BB3, 0x61C8, 0x6977, 0x6D77, + 0x7023, 0x87F9, 0x89E3, 0x8A72, 0x8AE7, 0x9082, 0x99ED, 0x9AB8, 0x52BE, + 0x6838, 0x5016, 0x5E78, 0x674F, 0x8347, 0x884C, 0x4EAB, 0x5411, 0x56AE, + 0x73E6, 0x9115, 0x97FF, 0x9909, 0x9957, 0x9999, 0x5653, 0x589F, 0x865B, + 0x8A31, 0x61B2, 0x6AF6, 0x737B, 0x8ED2, 0x6B47, 0x96AA, 0x9A57, 0x5955, + 0x7200, 0x8D6B, 0x9769, 0x4FD4, 0x5CF4, 0x5F26, 0x61F8, 0x665B, 0x6CEB, + 0x70AB, 0x7384, 0x73B9, 0x73FE, 0x7729, 0x774D, 0x7D43, 0x7D62, 0x7E23, + 0x8237, 0x8852, 0x8CE2, 0x9249, 0x986F, 0x5B51, 0x7A74, 0x8840, 0x9801, + 0x5ACC, 0x4FE0, 0x5354, 0x593E, 0x5CFD, 0x633E, 0x6D79, 0x72F9, 0x8105, + 0x8107, 0x83A2, 0x92CF, 0x9830, 0x4EA8, 0x5144, 0x5211, 0x578B, 0x5F62, + 0x6CC2, 0x6ECE, 0x7005, 0x7050, 0x70AF, 0x7192, 0x73E9, 0x7469, 0x834A, + 0x87A2, 0x8861, 0x9008, 0x90A2, 0x93A3, 0x99A8, 0x516E, 0x5F57, 0x60E0, + 0x6167, 0x66B3, 0x8559, 0x8E4A, 0x91AF, 0x978B, 0x4E4E, 0x4E92, 0x547C, + 0x58D5, 0x58FA, 0x597D, 0x5CB5, 0x5F27, 0x6236, 0x6248, 0x660A, 0x6667, + 0x6BEB, 0x6D69, 0x6DCF, 0x6E56, 0x6EF8, 0x6F94, 0x6FE0, 0x6FE9, 0x705D, + 0x72D0, 0x7425, 0x745A, 0x74E0, 0x7693, 0x795C, 0x7CCA, 0x7E1E, 0x80E1, + 0x82A6, 0x846B, 0x84BF, 0x864E, 0x865F, 0x8774, 0x8B77, 0x8C6A, 0x93AC, + 0x9800, 0x9865, 0x60D1, 0x6216, 0x9177, 0x5A5A, 0x660F, 0x6DF7, 0x6E3E, + 0x743F, 0x9B42, 0x5FFD, 0x60DA, 0x7B0F, 0x54C4, 0x5F18, 0x6C5E, 0x6CD3, + 0x6D2A, 0x70D8, 0x7D05, 0x8679, 0x8A0C, 0x9D3B, 0x5316, 0x548C, 0x5B05, + 0x6A3A, 0x706B, 0x7575, 0x798D, 0x79BE, 0x82B1, 0x83EF, 0x8A71, 0x8B41, + 0x8CA8, 0x9774, 0x64F4, 0x652B, 0x78BA, 0x78BB, 0x7A6B, 0x4E38, 0x559A, + 0x5950, 0x5BA6, 0x5E7B, 0x60A3, 0x63DB, 0x6B61, 0x6665, 0x6853, 0x6E19, + 0x7165, 0x74B0, 0x7D08, 0x9084, 0x9A69, 0x9C25, 0x6D3B, 0x6ED1, 0x733E, + 0x8C41, 0x95CA, 0x51F0, 0x5E4C, 0x5FA8, 0x604D, 0x60F6, 0x6130, 0x614C, + 0x6643, 0x6644, 0x69A5, 0x6CC1, 0x6E5F, 0x6EC9, 0x6F62, 0x714C, 0x749C, + 0x7687, 0x7BC1, 0x7C27, 0x8352, 0x8757, 0x9051, 0x968D, 0x9EC3, 0x532F, + 0x56DE, 0x5EFB, 0x5F8A, 0x6062, 0x6094, 0x61F7, 0x6666, 0x6703, 0x6A9C, + 0x6DEE, 0x6FAE, 0x7070, 0x736A, 0x7E6A, 0x81BE, 0x8334, 0x86D4, 0x8AA8, + 0x8CC4, 0x5283, 0x7372, 0x5B96, 0x6A6B, 0x9404, 0x54EE, 0x5686, 0x5B5D, + 0x6548, 0x6585, 0x66C9, 0x689F, 0x6D8D, 0x6DC6, 0x723B, 0x80B4, 0x9175, + 0x9A4D, 0x4FAF, 0x5019, 0x539A, 0x540E, 0x543C, 0x5589, 0x55C5, 0x5E3F, + 0x5F8C, 0x673D, 0x7166, 0x73DD, 0x9005, 0x52DB, 0x52F3, 0x5864, 0x58CE, + 0x7104, 0x718F, 0x71FB, 0x85B0, 0x8A13, 0x6688, 0x85A8, 0x55A7, 0x6684, + 0x714A, 0x8431, 0x5349, 0x5599, 0x6BC1, 0x5F59, 0x5FBD, 0x63EE, 0x6689, + 0x7147, 0x8AF1, 0x8F1D, 0x9EBE, 0x4F11, 0x643A, 0x70CB, 0x7566, 0x8667, + 0x6064, 0x8B4E, 0x9DF8, 0x5147, 0x51F6, 0x5308, 0x6D36, 0x80F8, 0x9ED1, + 0x6615, 0x6B23, 0x7098, 0x75D5, 0x5403, 0x5C79, 0x7D07, 0x8A16, 0x6B20, + 0x6B3D, 0x6B46, 0x5438, 0x6070, 0x6D3D, 0x7FD5, 0x8208, 0x50D6, 0x51DE, + 0x559C, 0x566B, 0x56CD, 0x59EC, 0x5B09, 0x5E0C, 0x6199, 0x6198, 0x6231, + 0x665E, 0x66E6, 0x7199, 0x71B9, 0x71BA, 0x72A7, 0x79A7, 0x7A00, 0x7FB2, + 0x8A70, 0x3001, 0x3002, 0x2025, 0x00AD, 0x2015, 0x2225, 0xFF5E, 0x3014, + 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, + 0x3010, 0x3011, 0x3013, 0xFF01, 0xFF08, 0xFF09, 0xFF0C, 0xFF0E, 0xFF1A, + 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF3B, 0xFF3D, 0xFF3F, 0xFF5B, + 0xFF5C, 0xFF5D, 0xFF5E, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, + 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, + 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, + 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, + 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, + 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, + 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, + 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, + 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, + 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0x007E, + 0x005C, 0x231C, 0x231F, 0x0000, 0x0000, 0x0000, 0x0000, 0x300E, 0x300F, + 0x300A, 0x300B, 0x3008, 0x3009, 0x0028, 0x0029, 0x0000, 0x0000, 0x0028, + 0x0029, 0x0028, 0x0029, 0x0000, 0x0000, 0x0028, 0x0029, 0x0000, 0x0000, + 0x3016, 0x3017, 0x3016, 0x3017, 0x3018, 0x3019, 0x005B, 0x005D, 0x0000, + 0x0000, 0x263E, 0x263D, 0x2021, 0x2021, 0x2020, 0x2021, 0x0000, 0x2217, + 0x0000, 0x0000, 0x201F, 0x201B, 0x02D6, 0x02D7, 0x00D7, 0x221E, 0x0000, + 0x00B1, 0x2213, 0x003E, 0x003C, 0x003D, 0x2260, 0x207D, 0x207E, 0x007B, + 0x007D, 0x0000, 0x0000, 0x2229, 0x222A, 0x2282, 0x2208, 0x03A3, 0x0021, + 0x0000, 0x3021, 0x3022, 0x3023, 0x0000, 0x0000, 0x0000, 0x4E03, 0x0000, + 0x0000, 0x5341, 0x0000, 0x0000, 0x0027, 0x3014, 0x3015, 0x002A, 0x0000, + 0x2217, 0x002A, 0xCDCD, 0x3001, 0x3002, 0x0028, 0x0029, 0x0028, 0x0029, + 0x0028, 0x0029, 0x3016, 0x3017, 0x3010, 0x3011, 0x0000, 0x0000, 0x20DE, + 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D, + 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, + 0x005D, 0x00B6, 0x0000, 0x0000, 0x22EF, 0x2237, 0x20DE, 0x20DE, 0x20DE, + 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, + 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x278A, + 0x278B, 0x278C, 0x278D, 0x278E, 0x278F, 0x2790, 0x2791, 0x2792, 0x2793, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x24B6, 0x24B7, 0x24B8, 0x24B9, 0x24BA, 0x24BB, 0x24BC, 0x24BD, 0x24BE, + 0x24BF, 0x24C0, 0x24C1, 0x24C2, 0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7, + 0x24C8, 0x24C9, 0x24CA, 0x24CB, 0x24CC, 0x24CD, 0x24CE, 0x24CF, 0x20DE, + 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D, + 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, + 0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, + 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, + 0x005D, 0x005D, 0x005D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x22CF, 0x22CE, 0x22CF, + 0x22CE, 0x2280, 0x2281, 0x2270, 0x2271, 0x2272, 0x2273, 0x0000, 0x228A, + 0x0000, 0x228B, 0x2276, 0x2277, 0x2279, 0x22DA, 0x22DB, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2221, 0x2245, 0x2243, 0x2248, 0x0000, 0x22A4, 0x22AB, + 0x0000, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, + 0x20DE, 0x20DE, 0x0000, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, + 0x2466, 0x2467, 0x2468, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0021, 0x00B0, 0x0027, 0x0022, 0x2034, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0000, 0x0000, 0x2020, 0x2020, 0x2021, 0x2020, 0x00A7, 0x0023, + 0x002A, 0x002A, 0x0000, 0x0000, 0x2042, 0x002A, 0x0000, 0x0000, 0x2042, + 0x002A, 0x0000, 0x0000, 0x2022, 0x20DF, 0x20DF, 0x0000, 0x20DF, 0x3008, + 0x3009, 0x300A, 0x300B, 0x261C, 0x261E, 0x0000, 0x0000, 0x20DE, 0x0000, + 0x20DE, 0x20DE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DD, 0x20DD, 0x271A, + 0x2716, 0x0000, 0x25EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x25CC, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x20A9, 0x0000, 0x0000, 0x262F, 0x0000, 0x262F, + 0x262F, 0x0000, 0x0000, 0x0000, 0x3020, 0x0000, 0x2776, 0x2777, 0x2778, + 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x277F, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x2642, 0x22A9, 0x3036, 0x25CB, + 0x25D3, 0x25A1, 0x2302, 0x0000, 0x25AD, 0x25AD, 0x0000, 0x0000, 0x0000, + 0x25C7, 0x0000, 0x0000, 0x2206, 0x22BF, 0x231E, 0x0000, 0x2225, 0x2226, + 0x0000, 0x2253, 0x2251, 0x2266, 0x2267, 0x2213, 0x2295, 0x2296, 0x2297, + 0x20DD, 0x2314, 0x0000, 0x0000, 0x2262, 0x0000, 0x25B1, 0x0000, 0x2222, + 0x2250, 0x00D8, 0x234A, 0x22A3, 0x0338, 0x0000, 0x226E, 0x226F, 0x2285, + 0x2284, 0x2209, 0x220C, 0x22BB, 0x0016, 0x225A, 0x2306, 0x0024, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x329E, 0x0000, 0x203C, 0x003F, 0x0000, + 0x003F, 0x22C4, 0x25C7, 0x22C4, 0x25C6, 0x25AB, 0x25A1, 0x25AB, 0x25A0, + 0x25E6, 0x25CB, 0x25E6, 0x25CF, 0x25BD, 0x25B3, 0x25B7, 0x25C1, 0x2726, + 0x25CF, 0x25A0, 0x0000, 0x25CA, 0x3231, 0x3239, 0x33CB, 0x2483, 0x2494, + 0x2495, 0x2496, 0x2497, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0029, 0x2192, 0x2190, 0x2191, 0x2193, 0x2196, + 0x2197, 0x2198, 0x2199, 0x21D0, 0x21CF, 0x21CD, 0x21D4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2794, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x279C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x27BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x21D1, 0x21D3, + 0x0000, 0x279E, 0x0000, 0x0000, 0x0000, 0x279E, 0x0000, 0x0000, 0x21B5, + 0x21B1, 0x0000, 0x21B4, 0x21B0, 0x21B3, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E6, 0x21E8, 0x21E7, + 0x21E9, 0x21BC, 0x21C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x21C0, 0x21BC, + 0x0000, 0x0000, 0x0000, 0x0000, 0x21C4, 0x21C5, 0x002E, 0x002E, 0x002E, + 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, + 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, + 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, + 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, + 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, + 0x002E, 0x002E, 0x002E, 0x002E, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, + 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, + 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, + 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, + 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, + 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, + 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, + 0x20DE, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, + 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, + 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, + 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x2483, 0x2484, 0x2485, + 0x2486, 0x2487, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x20DD, + 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, + 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, + 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x3294, + 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, + 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x32A5, 0x20DD, 0x20DD, + 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, + 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, + 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, + 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, + 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, + 0x20DD, 0x0029, 0x0029, 0x0029, 0x0029, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2794, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x21E0, 0x21E1, 0x21E2, 0x21E3, 0x0000, 0x27A1, 0x0000, 0x0000, + 0x21E6, 0x21E8, 0x21E7, 0x21E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x261D, 0x261F, 0x0000, + 0x0000, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DE, + 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D, + 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, + 0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, + 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, + 0x005D, 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, + 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, + 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, + 0x20DE, 0x20DE, 0x20DE, 0x3290, 0x328A, 0x328B, 0x328C, 0x328D, 0x328E, + 0x328F, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x300C, + 0x300D, 0x300E, 0x300F, 0x21E8, 0x21E6, 0x21E7, 0x21E9, 0x0022, 0x301F, + 0x301D, 0x2036, 0x0060, 0x3001, 0x0000, 0x0021, 0x3021, 0x002C, 0x3002, + 0xAC02, 0xAC03, 0xAC05, 0xAC06, 0xAC0B, 0xAC0C, 0xAC0D, 0xAC0E, 0xAC0F, + 0xAC18, 0xAC1E, 0xAC1F, 0xAC21, 0xAC22, 0xAC23, 0xAC25, 0xAC26, 0xAC27, + 0xAC28, 0xAC29, 0xAC2A, 0xAC2B, 0xAC2E, 0xAC32, 0xAC33, 0xAC34, 0xAC35, + 0xAC36, 0xAC37, 0xAC3A, 0xAC3B, 0xAC3D, 0xAC3E, 0xAC3F, 0xAC41, 0xAC42, + 0xAC43, 0xAC44, 0xAC45, 0xAC46, 0xAC47, 0xAC48, 0xAC49, 0xAC4A, 0xAC4C, + 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xAC52, 0xAC53, 0xAC55, 0xAC56, 0xAC57, + 0xAC59, 0xAC5A, 0xAC5B, 0xAC5D, 0xAC5E, 0xAC5F, 0xAC60, 0xAC61, 0xAC62, + 0xAC63, 0xAC64, 0xAC65, 0xAC66, 0xAC67, 0xAC68, 0xAC69, 0xAC6A, 0xAC6B, + 0xAC6C, 0xAC6D, 0xAC6E, 0xAC6F, 0xAC72, 0xAC73, 0xAC75, 0xAC76, 0xAC79, + 0xAC7B, 0xAC7C, 0xAC7D, 0xAC7E, 0xAC7F, 0xAC82, 0xAC87, 0xAC88, 0xAC8D, + 0xAC8E, 0xAC8F, 0xAC91, 0xAC92, 0xAC93, 0xAC95, 0xAC96, 0xAC97, 0xAC98, + 0xAC99, 0xAC9A, 0xAC9B, 0xAC9E, 0xACA2, 0xACA3, 0xACA4, 0xACA5, 0xACA6, + 0xACA7, 0xACAB, 0xACAD, 0xACAE, 0xACB1, 0xACB2, 0xACB3, 0xACB4, 0xACB5, + 0xACB6, 0xACB7, 0xACBA, 0xACBE, 0xACBF, 0xACC0, 0xACC2, 0xACC3, 0xACC5, + 0xACC6, 0xACC7, 0xACC9, 0xACCA, 0xACCB, 0xACCD, 0xACCE, 0xACCF, 0xACD0, + 0xACD1, 0xACD2, 0xACD3, 0xACD4, 0xACD6, 0xACD8, 0xACD9, 0xACDA, 0xACDB, + 0xACDC, 0xACDD, 0xACDE, 0xACDF, 0xACE2, 0xACE3, 0xACE5, 0xACE6, 0xACE9, + 0xACEB, 0xACED, 0xACEE, 0xACF2, 0xACF4, 0xACF7, 0xACF8, 0xACF9, 0xACFA, + 0xACFB, 0xACFE, 0xACFF, 0xAD01, 0xAD02, 0xAD03, 0xAD05, 0xAD07, 0xAD08, + 0xAD09, 0xAD0A, 0xAD0B, 0xAD0E, 0xAD10, 0xAD12, 0xAD13, 0xAD14, 0xAD15, + 0xAD16, 0xAD17, 0xAD19, 0xAD1A, 0xAD1B, 0xAD1D, 0xAD1E, 0xAD1F, 0xAD21, + 0xAD22, 0xAD23, 0xAD24, 0xAD25, 0xAD26, 0xAD27, 0xAD28, 0xAD2A, 0xAD2B, + 0xAD2E, 0xAD2F, 0xAD30, 0xAD31, 0xAD32, 0xAD33, 0xAD36, 0xAD37, 0xAD39, + 0xAD3A, 0xAD3B, 0xAD3D, 0xAD3E, 0xAD3F, 0xAD40, 0xAD41, 0xAD42, 0xAD43, + 0xAD46, 0xAD48, 0xAD4A, 0xAD4B, 0xAD4C, 0xAD4D, 0xAD4E, 0xAD4F, 0xAD51, + 0xAD52, 0xAD53, 0xAD55, 0xAD56, 0xAD57, 0xAD59, 0xAD5A, 0xAD5B, 0xAD5C, + 0xAD5D, 0xAD5E, 0xAD5F, 0xAD60, 0xAD62, 0xAD64, 0xAD65, 0xAD66, 0xAD67, + 0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0xAD6E, 0xAD6F, 0xAD71, 0xAD72, 0xAD77, + 0xAD78, 0xAD79, 0xAD7A, 0xAD7E, 0xAD80, 0xAD83, 0xAD84, 0xAD85, 0xAD86, + 0xAD87, 0xAD8A, 0xAD8B, 0xAD8D, 0xAD8E, 0xAD8F, 0xAD91, 0xAD92, 0xAD93, + 0xAD94, 0xAD95, 0xAD96, 0xAD97, 0xAD98, 0xAD99, 0xAD9A, 0xAD9B, 0xAD9E, + 0xAD9F, 0xADA0, 0xADA1, 0xADA2, 0xADA3, 0xADA5, 0xADA6, 0xADA7, 0xADA8, + 0xADA9, 0xADAA, 0xADAB, 0xADAC, 0xADAD, 0xADAE, 0xADAF, 0xADB0, 0xADB1, + 0xADB2, 0xADB3, 0xADB4, 0xADB5, 0xADB6, 0xADB8, 0xADB9, 0xADBA, 0xADBB, + 0xADBC, 0xADBD, 0xADBE, 0xADBF, 0xADC2, 0xADC3, 0xADC5, 0xADC6, 0xADC7, + 0xADC9, 0xADCA, 0xADCB, 0xADCC, 0xADCD, 0xADCE, 0xADCF, 0xADD2, 0xADD4, + 0xADD5, 0xADD6, 0xADD7, 0xADD8, 0xADD9, 0xADDA, 0xADDB, 0xADDD, 0xADDE, + 0xADDF, 0xADE1, 0xADE2, 0xADE3, 0xADE5, 0xADE6, 0xADE7, 0xADE8, 0xADE9, + 0xADEA, 0xADEB, 0xADEC, 0xADED, 0xADEE, 0xADEF, 0xADF0, 0xADF1, 0xADF2, + 0xADF3, 0xADF4, 0xADF5, 0xADF6, 0xADF7, 0xADFA, 0xADFB, 0xADFD, 0xADFE, + 0xAE02, 0xAE03, 0xAE04, 0xAE05, 0xAE06, 0xAE07, 0xAE0A, 0xAE0C, 0xAE0E, + 0xAE0F, 0xAE10, 0xAE11, 0xAE12, 0xAE13, 0xAE15, 0xAE16, 0xAE17, 0xAE18, + 0xAE19, 0xAE1A, 0xAE1B, 0xAE1C, 0xAE1D, 0xAE1E, 0xAE1F, 0xAE20, 0xAE21, + 0xAE22, 0xAE23, 0xAE24, 0xAE25, 0xAE26, 0xAE27, 0xAE28, 0xAE29, 0xAE2A, + 0xAE2B, 0xAE2C, 0xAE2D, 0xAE2E, 0xAE2F, 0xAE32, 0xAE33, 0xAE35, 0xAE36, + 0xAE39, 0xAE3B, 0xAE3C, 0xAE3D, 0xAE3E, 0xAE3F, 0xAE42, 0xAE44, 0xAE47, + 0xAE48, 0xAE49, 0xAE4B, 0xAE4F, 0xAE51, 0xAE52, 0xAE53, 0xAE55, 0xAE57, + 0xAE58, 0xAE59, 0xAE5A, 0xAE5B, 0xAE5E, 0xAE62, 0xAE63, 0xAE64, 0xAE66, + 0xAE67, 0xAE6A, 0xAE6B, 0xAE6D, 0xAE6E, 0xAE6F, 0xAE71, 0xAE72, 0xAE73, + 0xAE74, 0xAE75, 0xAE76, 0xAE77, 0xAE7A, 0xAE7E, 0xAE7F, 0xAE80, 0xAE81, + 0xAE82, 0xAE83, 0xAE86, 0xAE87, 0xAE88, 0xAE89, 0xAE8A, 0xAE8B, 0xAE8D, + 0xAE8E, 0xAE8F, 0xAE90, 0xAE91, 0xAE92, 0xAE93, 0xAE94, 0xAE95, 0xAE96, + 0xAE97, 0xAE98, 0xAE99, 0xAE9A, 0xAE9B, 0xAE9C, 0xAE9D, 0xAE9E, 0xAE9F, + 0xAEA0, 0xAEA1, 0xAEA2, 0xAEA3, 0xAEA4, 0xAEA5, 0xAEA6, 0xAEA7, 0xAEA8, + 0xAEA9, 0xAEAA, 0xAEAB, 0xAEAC, 0xAEAD, 0xAEAE, 0xAEAF, 0xAEB0, 0xAEB1, + 0xAEB2, 0xAEB3, 0xAEB4, 0xAEB5, 0xAEB6, 0xAEB7, 0xAEB8, 0xAEB9, 0xAEBA, + 0xAEBB, 0xAEBF, 0xAEC1, 0xAEC2, 0xAEC3, 0xAEC5, 0xAEC6, 0xAEC7, 0xAEC8, + 0xAEC9, 0xAECA, 0xAECB, 0xAECE, 0xAED2, 0xAED3, 0xAED4, 0xAED5, 0xAED6, + 0xAED7, 0xAEDA, 0xAEDB, 0xAEDD, 0xAEDE, 0xAEDF, 0xAEE0, 0xAEE1, 0xAEE2, + 0xAEE3, 0xAEE4, 0xAEE5, 0xAEE6, 0xAEE7, 0xAEE9, 0xAEEA, 0xAEEC, 0xAEEE, + 0xAEEF, 0xAEF0, 0xAEF1, 0xAEF2, 0xAEF3, 0xAEF5, 0xAEF6, 0xAEF7, 0xAEF9, + 0xAEFA, 0xAEFB, 0xAEFD, 0xAEFE, 0xAEFF, 0xAF00, 0xAF01, 0xAF02, 0xAF03, + 0xAF04, 0xAF05, 0xAF06, 0xAF09, 0xAF0A, 0xAF0B, 0xAF0C, 0xAF0E, 0xAF0F, + 0xAF11, 0xAF12, 0xAF13, 0xAF14, 0xAF15, 0xAF16, 0xAF17, 0xAF18, 0xAF19, + 0xAF1A, 0xAF1B, 0xAF1C, 0xAF1D, 0xAF1E, 0xAF1F, 0xAF20, 0xAF21, 0xAF22, + 0xAF23, 0xAF24, 0xAF25, 0xAF26, 0xAF27, 0xAF28, 0xAF29, 0xAF2A, 0xAF2B, + 0xAF2E, 0xAF2F, 0xAF31, 0xAF33, 0xAF35, 0xAF36, 0xAF37, 0xAF38, 0xAF39, + 0xAF3A, 0xAF3B, 0xAF3E, 0xAF40, 0xAF44, 0xAF45, 0xAF46, 0xAF47, 0xAF4A, + 0xAF4B, 0xAF4C, 0xAF4D, 0xAF4E, 0xAF4F, 0xAF51, 0xAF52, 0xAF53, 0xAF54, + 0xAF55, 0xAF56, 0xAF57, 0xAF58, 0xAF59, 0xAF5A, 0xAF5B, 0xAF5E, 0xAF5F, + 0xAF60, 0xAF61, 0xAF62, 0xAF63, 0xAF66, 0xAF67, 0xAF68, 0xAF69, 0xAF6A, + 0xAF6B, 0xAF6C, 0xAF6D, 0xAF6E, 0xAF6F, 0xAF70, 0xAF71, 0xAF72, 0xAF73, + 0xAF74, 0xAF75, 0xAF76, 0xAF77, 0xAF78, 0xAF7A, 0xAF7B, 0xAF7C, 0xAF7D, + 0xAF7E, 0xAF7F, 0xAF81, 0xAF82, 0xAF83, 0xAF85, 0xAF86, 0xAF87, 0xAF89, + 0xAF8A, 0xAF8B, 0xAF8C, 0xAF8D, 0xAF8E, 0xAF8F, 0xAF92, 0xAF93, 0xAF94, + 0xAF96, 0xAF97, 0xAF98, 0xAF99, 0xAF9A, 0xAF9B, 0xAF9D, 0xAF9E, 0xAF9F, + 0xAFA0, 0xAFA1, 0xAFA2, 0xAFA3, 0xAFA4, 0xAFA5, 0xAFA6, 0xAFA7, 0xAFA8, + 0xAFA9, 0xAFAA, 0xAFAB, 0xAFAC, 0xAFAD, 0xAFAE, 0xAFAF, 0xAFB0, 0xAFB1, + 0xAFB2, 0xAFB3, 0xAFB4, 0xAFB5, 0xAFB6, 0xAFB7, 0xAFBA, 0xAFBB, 0xAFBD, + 0xAFBE, 0xAFBF, 0xAFC1, 0xAFC2, 0xAFC3, 0xAFC4, 0xAFC5, 0xAFC6, 0xAFCA, + 0xAFCC, 0xAFCF, 0xAFD0, 0xAFD1, 0xAFD2, 0xAFD3, 0xAFD5, 0xAFD6, 0xAFD7, + 0xAFD8, 0xAFD9, 0xAFDA, 0xAFDB, 0xAFDD, 0xAFDE, 0xAFDF, 0xAFE0, 0xAFE1, + 0xAFE2, 0xAFE3, 0xAFE4, 0xAFE5, 0xAFE6, 0xAFE7, 0xAFEA, 0xAFEB, 0xAFEC, + 0xAFED, 0xAFEE, 0xAFEF, 0xAFF2, 0xAFF3, 0xAFF5, 0xAFF6, 0xAFF7, 0xAFF9, + 0xAFFA, 0xAFFB, 0xAFFC, 0xAFFD, 0xAFFE, 0xAFFF, 0xB002, 0xB003, 0xB005, + 0xB006, 0xB007, 0xB008, 0xB009, 0xB00A, 0xB00B, 0xB00D, 0xB00E, 0xB00F, + 0xB011, 0xB012, 0xB013, 0xB015, 0xB016, 0xB017, 0xB018, 0xB019, 0xB01A, + 0xB01B, 0xB01E, 0xB01F, 0xB020, 0xB021, 0xB022, 0xB023, 0xB024, 0xB025, + 0xB026, 0xB027, 0xB029, 0xB02A, 0xB02B, 0xB02C, 0xB02D, 0xB02E, 0xB02F, + 0xB030, 0xB031, 0xB032, 0xB033, 0xB034, 0xB035, 0xB036, 0xB037, 0xB038, + 0xB039, 0xB03A, 0xB03B, 0xB03C, 0xB03D, 0xB03E, 0xB03F, 0xB040, 0xB041, + 0xB042, 0xB043, 0xB046, 0xB047, 0xB049, 0xB04B, 0xB04D, 0xB04F, 0xB050, + 0xB051, 0xB052, 0xB056, 0xB058, 0xB05A, 0xB05B, 0xB05C, 0xB05E, 0xB05F, + 0xB060, 0xB061, 0xB062, 0xB063, 0xB064, 0xB065, 0xB066, 0xB067, 0xB068, + 0xB069, 0xB06A, 0xB06B, 0xB06C, 0xB06D, 0xB06E, 0xB06F, 0xB070, 0xB071, + 0xB072, 0xB073, 0xB074, 0xB075, 0xB076, 0xB077, 0xB078, 0xB079, 0xB07A, + 0xB07B, 0xB07E, 0xB07F, 0xB081, 0xB082, 0xB083, 0xB085, 0xB086, 0xB087, + 0xB088, 0xB089, 0xB08A, 0xB08B, 0xB08E, 0xB090, 0xB092, 0xB093, 0xB094, + 0xB095, 0xB096, 0xB097, 0xB09B, 0xB09D, 0xB09E, 0xB0A3, 0xB0A4, 0xB0A5, + 0xB0A6, 0xB0A7, 0xB0AA, 0xB0B0, 0xB0B2, 0xB0B6, 0xB0B7, 0xB0B9, 0xB0BA, + 0xB0BB, 0xB0BD, 0xB0BE, 0xB0BF, 0xB0C0, 0xB0C1, 0xB0C2, 0xB0C3, 0xB0C6, + 0xB0CA, 0xB0CB, 0xB0CC, 0xB0CD, 0xB0CE, 0xB0CF, 0xB0D2, 0xB0D3, 0xB0D5, + 0xB0D6, 0xB0D7, 0xB0D9, 0xB0DA, 0xB0DB, 0xB0DC, 0xB0DD, 0xB0DE, 0xB0DF, + 0xB0E1, 0xB0E2, 0xB0E3, 0xB0E4, 0xB0E6, 0xB0E7, 0xB0E8, 0xB0E9, 0xB0EA, + 0xB0EB, 0xB0EC, 0xB0ED, 0xB0EE, 0xB0EF, 0xB0F0, 0xB0F1, 0xB0F2, 0xB0F3, + 0xB0F4, 0xB0F5, 0xB0F6, 0xB0F7, 0xB0F8, 0xB0F9, 0xB0FA, 0xB0FB, 0xB0FC, + 0xB0FD, 0xB0FE, 0xB0FF, 0xB100, 0xB101, 0xB102, 0xB103, 0xB104, 0xB105, + 0xB106, 0xB107, 0xB10A, 0xB10D, 0xB10E, 0xB10F, 0xB111, 0xB114, 0xB115, + 0xB116, 0xB117, 0xB11A, 0xB11E, 0xB11F, 0xB120, 0xB121, 0xB122, 0xB126, + 0xB127, 0xB129, 0xB12A, 0xB12B, 0xB12D, 0xB12E, 0xB12F, 0xB130, 0xB131, + 0xB132, 0xB133, 0xB136, 0xB13A, 0xB13B, 0xB13C, 0xB13D, 0xB13E, 0xB13F, + 0xB142, 0xB143, 0xB145, 0xB146, 0xB147, 0xB149, 0xB14A, 0xB14B, 0xB14C, + 0xB14D, 0xB14E, 0xB14F, 0xB152, 0xB153, 0xB156, 0xB157, 0xB159, 0xB15A, + 0xB15B, 0xB15D, 0xB15E, 0xB15F, 0xB161, 0xB162, 0xB163, 0xB164, 0xB165, + 0xB166, 0xB167, 0xB168, 0xB169, 0xB16A, 0xB16B, 0xB16C, 0xB16D, 0xB16E, + 0xB16F, 0xB170, 0xB171, 0xB172, 0xB173, 0xB174, 0xB175, 0xB176, 0xB177, + 0xB17A, 0xB17B, 0xB17D, 0xB17E, 0xB17F, 0xB181, 0xB183, 0xB184, 0xB185, + 0xB186, 0xB187, 0xB18A, 0xB18C, 0xB18E, 0xB18F, 0xB190, 0xB191, 0xB195, + 0xB196, 0xB197, 0xB199, 0xB19A, 0xB19B, 0xB19D, 0xB19E, 0xB19F, 0xB1A0, + 0xB1A1, 0xB1A2, 0xB1A3, 0xB1A4, 0xB1A5, 0xB1A6, 0xB1A7, 0xB1A9, 0xB1AA, + 0xB1AB, 0xB1AC, 0xB1AD, 0xB1AE, 0xB1AF, 0xB1B0, 0xB1B1, 0xB1B2, 0xB1B3, + 0xB1B4, 0xB1B5, 0xB1B6, 0xB1B7, 0xB1B8, 0xB1B9, 0xB1BA, 0xB1BB, 0xB1BC, + 0xB1BD, 0xB1BE, 0xB1BF, 0xB1C0, 0xB1C1, 0xB1C2, 0xB1C3, 0xB1C4, 0xB1C5, + 0xB1C6, 0xB1C7, 0xB1C8, 0xB1C9, 0xB1CA, 0xB1CB, 0xB1CD, 0xB1CE, 0xB1CF, + 0xB1D1, 0xB1D2, 0xB1D3, 0xB1D5, 0xB1D6, 0xB1D7, 0xB1D8, 0xB1D9, 0xB1DA, + 0xB1DB, 0xB1DE, 0xB1E0, 0xB1E1, 0xB1E2, 0xB1E3, 0xB1E4, 0xB1E5, 0xB1E6, + 0xB1E7, 0xB1EA, 0xB1EB, 0xB1ED, 0xB1EE, 0xB1EF, 0xB1F1, 0xB1F2, 0xB1F3, + 0xB1F4, 0xB1F5, 0xB1F6, 0xB1F7, 0xB1F8, 0xB1FA, 0xB1FC, 0xB1FE, 0xB1FF, + 0xB200, 0xB201, 0xB202, 0xB203, 0xB206, 0xB207, 0xB209, 0xB20A, 0xB20D, + 0xB20E, 0xB20F, 0xB210, 0xB211, 0xB212, 0xB213, 0xB216, 0xB218, 0xB21A, + 0xB21B, 0xB21C, 0xB21D, 0xB21E, 0xB21F, 0xB221, 0xB222, 0xB223, 0xB224, + 0xB225, 0xB226, 0xB227, 0xB228, 0xB229, 0xB22A, 0xB22B, 0xB22C, 0xB22D, + 0xB22E, 0xB22F, 0xB230, 0xB231, 0xB232, 0xB233, 0xB235, 0xB236, 0xB237, + 0xB238, 0xB239, 0xB23A, 0xB23B, 0xB23D, 0xB23E, 0xB23F, 0xB240, 0xB241, + 0xB242, 0xB243, 0xB244, 0xB245, 0xB246, 0xB247, 0xB248, 0xB249, 0xB24A, + 0xB24B, 0xB24C, 0xB24D, 0xB24E, 0xB24F, 0xB250, 0xB251, 0xB252, 0xB253, + 0xB254, 0xB255, 0xB256, 0xB257, 0xB259, 0xB25A, 0xB25B, 0xB25D, 0xB25E, + 0xB25F, 0xB261, 0xB262, 0xB263, 0xB264, 0xB265, 0xB266, 0xB267, 0xB26A, + 0xB26B, 0xB26C, 0xB26D, 0xB26E, 0xB26F, 0xB270, 0xB271, 0xB272, 0xB273, + 0xB276, 0xB277, 0xB278, 0xB279, 0xB27A, 0xB27B, 0xB27D, 0xB27E, 0xB27F, + 0xB280, 0xB281, 0xB282, 0xB283, 0xB286, 0xB287, 0xB288, 0xB28A, 0xB28B, + 0xB28C, 0xB28D, 0xB28E, 0xB28F, 0xB292, 0xB293, 0xB295, 0xB296, 0xB297, + 0xB29B, 0xB29C, 0xB29D, 0xB29E, 0xB29F, 0xB2A2, 0xB2A4, 0xB2A7, 0xB2A8, + 0xB2A9, 0xB2AB, 0xB2AD, 0xB2AE, 0xB2AF, 0xB2B1, 0xB2B2, 0xB2B3, 0xB2B5, + 0xB2B6, 0xB2B7, 0xB2B8, 0xB2B9, 0xB2BA, 0xB2BB, 0xB2BC, 0xB2BD, 0xB2BE, + 0xB2BF, 0xB2C0, 0xB2C1, 0xB2C2, 0xB2C3, 0xB2C4, 0xB2C5, 0xB2C6, 0xB2C7, + 0xB2CA, 0xB2CB, 0xB2CD, 0xB2CE, 0xB2CF, 0xB2D1, 0xB2D3, 0xB2D4, 0xB2D5, + 0xB2D6, 0xB2D7, 0xB2DA, 0xB2DC, 0xB2DE, 0xB2DF, 0xB2E0, 0xB2E1, 0xB2E3, + 0xB2E7, 0xB2E9, 0xB2EA, 0xB2F0, 0xB2F1, 0xB2F2, 0xB2F6, 0xB2FC, 0xB2FD, + 0xB2FE, 0xB302, 0xB303, 0xB305, 0xB306, 0xB307, 0xB309, 0xB30A, 0xB30B, + 0xB30C, 0xB30D, 0xB30E, 0xB30F, 0xB312, 0xB316, 0xB317, 0xB318, 0xB319, + 0xB31A, 0xB31B, 0xB31D, 0xB31E, 0xB31F, 0xB320, 0xB321, 0xB322, 0xB323, + 0xB324, 0xB325, 0xB326, 0xB327, 0xB328, 0xB329, 0xB32A, 0xB32B, 0xB32C, + 0xB32D, 0xB32E, 0xB32F, 0xB330, 0xB331, 0xB332, 0xB333, 0xB334, 0xB335, + 0xB336, 0xB337, 0xB338, 0xB339, 0xB33A, 0xB33B, 0xB33C, 0xB33D, 0xB33E, + 0xB33F, 0xB340, 0xB341, 0xB342, 0xB343, 0xB344, 0xB345, 0xB346, 0xB347, + 0xB348, 0xB349, 0xB34A, 0xB34B, 0xB34C, 0xB34D, 0xB34E, 0xB34F, 0xB350, + 0xB351, 0xB352, 0xB353, 0xB357, 0xB359, 0xB35A, 0xB35D, 0xB360, 0xB361, + 0xB362, 0xB363, 0xB366, 0xB368, 0xB36A, 0xB36C, 0xB36D, 0xB36F, 0xB372, + 0xB373, 0xB375, 0xB376, 0xB377, 0xB379, 0xB37A, 0xB37B, 0xB37C, 0xB37D, + 0xB37E, 0xB37F, 0xB382, 0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, + 0xB38D, 0xB38E, 0xB38F, 0xB391, 0xB392, 0xB393, 0xB395, 0xB396, 0xB397, + 0xB398, 0xB399, 0xB39A, 0xB39B, 0xB39C, 0xB39D, 0xB39E, 0xB39F, 0xB3A2, + 0xB3A3, 0xB3A4, 0xB3A5, 0xB3A6, 0xB3A7, 0xB3A9, 0xB3AA, 0xB3AB, 0xB3AD, + 0xB3AE, 0xB3AF, 0xB3B0, 0xB3B1, 0xB3B2, 0xB3B3, 0xB3B4, 0xB3B5, 0xB3B6, + 0xB3B7, 0xB3B8, 0xB3B9, 0xB3BA, 0xB3BB, 0xB3BC, 0xB3BD, 0xB3BE, 0xB3BF, + 0xB3C0, 0xB3C1, 0xB3C2, 0xB3C3, 0xB3C6, 0xB3C7, 0xB3C9, 0xB3CA, 0xB3CD, + 0xB3CF, 0xB3D1, 0xB3D2, 0xB3D3, 0xB3D6, 0xB3D8, 0xB3DA, 0xB3DC, 0xB3DE, + 0xB3DF, 0xB3E1, 0xB3E2, 0xB3E3, 0xB3E5, 0xB3E6, 0xB3E7, 0xB3E9, 0xB3EA, + 0xB3EB, 0xB3EC, 0xB3ED, 0xB3EE, 0xB3EF, 0xB3F0, 0xB3F1, 0xB3F2, 0xB3F3, + 0xB3F4, 0xB3F5, 0xB3F6, 0xB3F7, 0xB3F8, 0xB3F9, 0xB3FA, 0xB3FB, 0xB3FD, + 0xB3FE, 0xB3FF, 0xB400, 0xB401, 0xB402, 0xB403, 0xB404, 0xB405, 0xB406, + 0xB407, 0xB408, 0xB409, 0xB40A, 0xB40B, 0xB40C, 0xB40D, 0xB40E, 0xB40F, + 0xB411, 0xB412, 0xB413, 0xB414, 0xB415, 0xB416, 0xB417, 0xB419, 0xB41A, + 0xB41B, 0xB41D, 0xB41E, 0xB41F, 0xB421, 0xB422, 0xB423, 0xB424, 0xB425, + 0xB426, 0xB427, 0xB42A, 0xB42C, 0xB42D, 0xB42E, 0xB42F, 0xB430, 0xB431, + 0xB432, 0xB433, 0xB435, 0xB436, 0xB437, 0xB438, 0xB439, 0xB43A, 0xB43B, + 0xB43C, 0xB43D, 0xB43E, 0xB43F, 0xB440, 0xB441, 0xB442, 0xB443, 0xB444, + 0xB445, 0xB446, 0xB447, 0xB448, 0xB449, 0xB44A, 0xB44B, 0xB44C, 0xB44D, + 0xB44E, 0xB44F, 0xB452, 0xB453, 0xB455, 0xB456, 0xB457, 0xB459, 0xB45A, + 0xB45B, 0xB45C, 0xB45D, 0xB45E, 0xB45F, 0xB462, 0xB464, 0xB466, 0xB467, + 0xB468, 0xB469, 0xB46A, 0xB46B, 0xB46D, 0xB46E, 0xB46F, 0xB470, 0xB471, + 0xB472, 0xB473, 0xB474, 0xB475, 0xB476, 0xB477, 0xB478, 0xB479, 0xB47A, + 0xB47B, 0xB47C, 0xB47D, 0xB47E, 0xB47F, 0xB481, 0xB482, 0xB483, 0xB484, + 0xB485, 0xB486, 0xB487, 0xB489, 0xB48A, 0xB48B, 0xB48C, 0xB48D, 0xB48E, + 0xB48F, 0xB490, 0xB491, 0xB492, 0xB493, 0xB494, 0xB495, 0xB496, 0xB497, + 0xB498, 0xB499, 0xB49A, 0xB49B, 0xB49C, 0xB49E, 0xB49F, 0xB4A0, 0xB4A1, + 0xB4A2, 0xB4A3, 0xB4A5, 0xB4A6, 0xB4A7, 0xB4A9, 0xB4AA, 0xB4AB, 0xB4AD, + 0xB4AE, 0xB4AF, 0xB4B0, 0xB4B1, 0xB4B2, 0xB4B3, 0xB4B4, 0xB4B6, 0xB4B8, + 0xB4BA, 0xB4BB, 0xB4BC, 0xB4BD, 0xB4BE, 0xB4BF, 0xB4C1, 0xB4C2, 0xB4C3, + 0xB4C5, 0xB4C6, 0xB4C7, 0xB4C9, 0xB4CA, 0xB4CB, 0xB4CC, 0xB4CD, 0xB4CE, + 0xB4CF, 0xB4D1, 0xB4D2, 0xB4D3, 0xB4D4, 0xB4D6, 0xB4D7, 0xB4D8, 0xB4D9, + 0xB4DA, 0xB4DB, 0xB4DE, 0xB4DF, 0xB4E1, 0xB4E2, 0xB4E5, 0xB4E7, 0xB4E8, + 0xB4E9, 0xB4EA, 0xB4EB, 0xB4EE, 0xB4F0, 0xB4F2, 0xB4F3, 0xB4F4, 0xB4F5, + 0xB4F6, 0xB4F7, 0xB4F9, 0xB4FA, 0xB4FB, 0xB4FC, 0xB4FD, 0xB4FE, 0xB4FF, + 0xB500, 0xB501, 0xB502, 0xB503, 0xB504, 0xB505, 0xB506, 0xB507, 0xB508, + 0xB509, 0xB50A, 0xB50B, 0xB50C, 0xB50D, 0xB50E, 0xB50F, 0xB510, 0xB511, + 0xB512, 0xB513, 0xB516, 0xB517, 0xB519, 0xB51A, 0xB51D, 0xB51E, 0xB51F, + 0xB520, 0xB521, 0xB522, 0xB523, 0xB526, 0xB52B, 0xB52C, 0xB52D, 0xB52E, + 0xB52F, 0xB532, 0xB533, 0xB535, 0xB536, 0xB537, 0xB539, 0xB53A, 0xB53B, + 0xB53C, 0xB53D, 0xB53E, 0xB53F, 0xB542, 0xB546, 0xB547, 0xB548, 0xB549, + 0xB54A, 0xB54E, 0xB54F, 0xB551, 0xB552, 0xB553, 0xB555, 0xB556, 0xB557, + 0xB558, 0xB559, 0xB55A, 0xB55B, 0xB55E, 0xB562, 0xB563, 0xB564, 0xB565, + 0xB566, 0xB567, 0xB568, 0xB569, 0xB56A, 0xB56B, 0xB56C, 0xB56D, 0xB56E, + 0xB56F, 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, 0xB575, 0xB576, 0xB577, + 0xB578, 0xB579, 0xB57A, 0xB57B, 0xB57C, 0xB57D, 0xB57E, 0xB57F, 0xB580, + 0xB581, 0xB582, 0xB583, 0xB584, 0xB585, 0xB586, 0xB587, 0xB588, 0xB589, + 0xB58A, 0xB58B, 0xB58C, 0xB58D, 0xB58E, 0xB58F, 0xB590, 0xB591, 0xB592, + 0xB593, 0xB594, 0xB595, 0xB596, 0xB597, 0xB598, 0xB599, 0xB59A, 0xB59B, + 0xB59C, 0xB59D, 0xB59E, 0xB59F, 0xB5A2, 0xB5A3, 0xB5A5, 0xB5A6, 0xB5A7, + 0xB5A9, 0xB5AC, 0xB5AD, 0xB5AE, 0xB5AF, 0xB5B2, 0xB5B6, 0xB5B7, 0xB5B8, + 0xB5B9, 0xB5BA, 0xB5BE, 0xB5BF, 0xB5C1, 0xB5C2, 0xB5C3, 0xB5C5, 0xB5C6, + 0xB5C7, 0xB5C8, 0xB5C9, 0xB5CA, 0xB5CB, 0xB5CE, 0xB5D2, 0xB5D3, 0xB5D4, + 0xB5D5, 0xB5D6, 0xB5D7, 0xB5D9, 0xB5DA, 0xB5DB, 0xB5DC, 0xB5DD, 0xB5DE, + 0xB5DF, 0xB5E0, 0xB5E1, 0xB5E2, 0xB5E3, 0xB5E4, 0xB5E5, 0xB5E6, 0xB5E7, + 0xB5E8, 0xB5E9, 0xB5EA, 0xB5EB, 0xB5ED, 0xB5EE, 0xB5EF, 0xB5F0, 0xB5F1, + 0xB5F2, 0xB5F3, 0xB5F4, 0xB5F5, 0xB5F6, 0xB5F7, 0xB5F8, 0xB5F9, 0xB5FA, + 0xB5FB, 0xB5FC, 0xB5FD, 0xB5FE, 0xB5FF, 0xB600, 0xB601, 0xB602, 0xB603, + 0xB604, 0xB605, 0xB606, 0xB607, 0xB608, 0xB609, 0xB60A, 0xB60B, 0xB60C, + 0xB60D, 0xB60E, 0xB60F, 0xB612, 0xB613, 0xB615, 0xB616, 0xB617, 0xB619, + 0xB61A, 0xB61B, 0xB61C, 0xB61D, 0xB61E, 0xB61F, 0xB620, 0xB621, 0xB622, + 0xB623, 0xB624, 0xB626, 0xB627, 0xB628, 0xB629, 0xB62A, 0xB62B, 0xB62D, + 0xB62E, 0xB62F, 0xB630, 0xB631, 0xB632, 0xB633, 0xB635, 0xB636, 0xB637, + 0xB638, 0xB639, 0xB63A, 0xB63B, 0xB63C, 0xB63D, 0xB63E, 0xB63F, 0xB640, + 0xB641, 0xB642, 0xB643, 0xB644, 0xB645, 0xB646, 0xB647, 0xB649, 0xB64A, + 0xB64B, 0xB64C, 0xB64D, 0xB64E, 0xB64F, 0xB650, 0xB651, 0xB652, 0xB653, + 0xB654, 0xB655, 0xB656, 0xB657, 0xB658, 0xB659, 0xB65A, 0xB65B, 0xB65C, + 0xB65D, 0xB65E, 0xB65F, 0xB660, 0xB661, 0xB662, 0xB663, 0xB665, 0xB666, + 0xB667, 0xB669, 0xB66A, 0xB66B, 0xB66C, 0xB66D, 0xB66E, 0xB66F, 0xB670, + 0xB671, 0xB672, 0xB673, 0xB674, 0xB675, 0xB676, 0xB677, 0xB678, 0xB679, + 0xB67A, 0xB67B, 0xB67C, 0xB67D, 0xB67E, 0xB67F, 0xB680, 0xB681, 0xB682, + 0xB683, 0xB684, 0xB685, 0xB686, 0xB687, 0xB688, 0xB689, 0xB68A, 0xB68B, + 0xB68C, 0xB68D, 0xB68E, 0xB68F, 0xB690, 0xB691, 0xB692, 0xB693, 0xB694, + 0xB695, 0xB696, 0xB697, 0xB698, 0xB699, 0xB69A, 0xB69B, 0xB69E, 0xB69F, + 0xB6A1, 0xB6A2, 0xB6A3, 0xB6A5, 0xB6A6, 0xB6A7, 0xB6A8, 0xB6A9, 0xB6AA, + 0xB6AD, 0xB6AE, 0xB6AF, 0xB6B0, 0xB6B2, 0xB6B3, 0xB6B4, 0xB6B5, 0xB6B6, + 0xB6B7, 0xB6B8, 0xB6B9, 0xB6BA, 0xB6BB, 0xB6BC, 0xB6BD, 0xB6BE, 0xB6BF, + 0xB6C0, 0xB6C1, 0xB6C2, 0xB6C3, 0xB6C4, 0xB6C5, 0xB6C6, 0xB6C7, 0xB6C8, + 0xB6C9, 0xB6CA, 0xB6CB, 0xB6CC, 0xB6CD, 0xB6CE, 0xB6CF, 0xB6D0, 0xB6D1, + 0xB6D2, 0xB6D3, 0xB6D5, 0xB6D6, 0xB6D7, 0xB6D8, 0xB6D9, 0xB6DA, 0xB6DB, + 0xB6DC, 0xB6DD, 0xB6DE, 0xB6DF, 0xB6E0, 0xB6E1, 0xB6E2, 0xB6E3, 0xB6E4, + 0xB6E5, 0xB6E6, 0xB6E7, 0xB6E8, 0xB6E9, 0xB6EA, 0xB6EB, 0xB6EC, 0xB6ED, + 0xB6EE, 0xB6EF, 0xB6F1, 0xB6F2, 0xB6F3, 0xB6F5, 0xB6F6, 0xB6F7, 0xB6F9, + 0xB6FA, 0xB6FB, 0xB6FC, 0xB6FD, 0xB6FE, 0xB6FF, 0xB702, 0xB703, 0xB704, + 0xB706, 0xB707, 0xB708, 0xB709, 0xB70A, 0xB70B, 0xB70C, 0xB70D, 0xB70E, + 0xB70F, 0xB710, 0xB711, 0xB712, 0xB713, 0xB714, 0xB715, 0xB716, 0xB717, + 0xB718, 0xB719, 0xB71A, 0xB71B, 0xB71C, 0xB71D, 0xB71E, 0xB71F, 0xB720, + 0xB721, 0xB722, 0xB723, 0xB724, 0xB725, 0xB726, 0xB727, 0xB72A, 0xB72B, + 0xB72D, 0xB72E, 0xB731, 0xB732, 0xB733, 0xB734, 0xB735, 0xB736, 0xB737, + 0xB73A, 0xB73C, 0xB73D, 0xB73E, 0xB73F, 0xB740, 0xB741, 0xB742, 0xB743, + 0xB745, 0xB746, 0xB747, 0xB749, 0xB74A, 0xB74B, 0xB74D, 0xB74E, 0xB74F, + 0xB750, 0xB751, 0xB752, 0xB753, 0xB756, 0xB757, 0xB758, 0xB759, 0xB75A, + 0xB75B, 0xB75C, 0xB75D, 0xB75E, 0xB75F, 0xB761, 0xB762, 0xB763, 0xB765, + 0xB766, 0xB767, 0xB769, 0xB76A, 0xB76B, 0xB76C, 0xB76D, 0xB76E, 0xB76F, + 0xB772, 0xB774, 0xB776, 0xB777, 0xB778, 0xB779, 0xB77A, 0xB77B, 0xB77E, + 0xB77F, 0xB781, 0xB782, 0xB783, 0xB785, 0xB786, 0xB787, 0xB788, 0xB789, + 0xB78A, 0xB78B, 0xB78E, 0xB793, 0xB794, 0xB795, 0xB79A, 0xB79B, 0xB79D, + 0xB79E, 0xB79F, 0xB7A1, 0xB7A2, 0xB7A3, 0xB7A4, 0xB7A5, 0xB7A6, 0xB7A7, + 0xB7AA, 0xB7AE, 0xB7AF, 0xB7B0, 0xB7B1, 0xB7B2, 0xB7B3, 0xB7B6, 0xB7B7, + 0xB7B9, 0xB7BA, 0xB7BB, 0xB7BC, 0xB7BD, 0xB7BE, 0xB7BF, 0xB7C0, 0xB7C1, + 0xB7C2, 0xB7C3, 0xB7C4, 0xB7C5, 0xB7C6, 0xB7C8, 0xB7CA, 0xB7CB, 0xB7CC, + 0xB7CD, 0xB7CE, 0xB7CF, 0xB7D0, 0xB7D1, 0xB7D2, 0xB7D3, 0xB7D4, 0xB7D5, + 0xB7D6, 0xB7D7, 0xB7D8, 0xB7D9, 0xB7DA, 0xB7DB, 0xB7DC, 0xB7DD, 0xB7DE, + 0xB7DF, 0xB7E0, 0xB7E1, 0xB7E2, 0xB7E3, 0xB7E4, 0xB7E5, 0xB7E6, 0xB7E7, + 0xB7E8, 0xB7E9, 0xB7EA, 0xB7EB, 0xB7EE, 0xB7EF, 0xB7F1, 0xB7F2, 0xB7F3, + 0xB7F5, 0xB7F6, 0xB7F7, 0xB7F8, 0xB7F9, 0xB7FA, 0xB7FB, 0xB7FE, 0xB802, + 0xB803, 0xB804, 0xB805, 0xB806, 0xB80A, 0xB80B, 0xB80D, 0xB80E, 0xB80F, + 0xB811, 0xB812, 0xB813, 0xB814, 0xB815, 0xB816, 0xB817, 0xB81A, 0xB81C, + 0xB81E, 0xB81F, 0xB820, 0xB821, 0xB822, 0xB823, 0xB826, 0xB827, 0xB829, + 0xB82A, 0xB82B, 0xB82D, 0xB82E, 0xB82F, 0xB830, 0xB831, 0xB832, 0xB833, + 0xB836, 0xB83A, 0xB83B, 0xB83C, 0xB83D, 0xB83E, 0xB83F, 0xB841, 0xB842, + 0xB843, 0xB845, 0xB846, 0xB847, 0xB848, 0xB849, 0xB84A, 0xB84B, 0xB84C, + 0xB84D, 0xB84E, 0xB84F, 0xB850, 0xB852, 0xB854, 0xB855, 0xB856, 0xB857, + 0xB858, 0xB859, 0xB85A, 0xB85B, 0xB85E, 0xB85F, 0xB861, 0xB862, 0xB863, + 0xB865, 0xB866, 0xB867, 0xB868, 0xB869, 0xB86A, 0xB86B, 0xB86E, 0xB870, + 0xB872, 0xB873, 0xB874, 0xB875, 0xB876, 0xB877, 0xB879, 0xB87A, 0xB87B, + 0xB87D, 0xB87E, 0xB87F, 0xB880, 0xB881, 0xB882, 0xB883, 0xB884, 0xB885, + 0xB886, 0xB887, 0xB888, 0xB889, 0xB88A, 0xB88B, 0xB88C, 0xB88E, 0xB88F, + 0xB890, 0xB891, 0xB892, 0xB893, 0xB894, 0xB895, 0xB896, 0xB897, 0xB898, + 0xB899, 0xB89A, 0xB89B, 0xB89C, 0xB89D, 0xB89E, 0xB89F, 0xB8A0, 0xB8A1, + 0xB8A2, 0xB8A3, 0xB8A4, 0xB8A5, 0xB8A6, 0xB8A7, 0xB8A9, 0xB8AA, 0xB8AB, + 0xB8AC, 0xB8AD, 0xB8AE, 0xB8AF, 0xB8B1, 0xB8B2, 0xB8B3, 0xB8B5, 0xB8B6, + 0xB8B7, 0xB8B9, 0xB8BA, 0xB8BB, 0xB8BC, 0xB8BD, 0xB8BE, 0xB8BF, 0xB8C2, + 0xB8C4, 0xB8C6, 0xB8C7, 0xB8C8, 0xB8C9, 0xB8CA, 0xB8CB, 0xB8CD, 0xB8CE, + 0xB8CF, 0xB8D1, 0xB8D2, 0xB8D3, 0xB8D5, 0xB8D6, 0xB8D7, 0xB8D8, 0xB8D9, + 0xB8DA, 0xB8DB, 0xB8DC, 0xB8DE, 0xB8E0, 0xB8E2, 0xB8E3, 0xB8E4, 0xB8E5, + 0xB8E6, 0xB8E7, 0xB8EA, 0xB8EB, 0xB8ED, 0xB8EE, 0xB8EF, 0xB8F1, 0xB8F2, + 0xB8F3, 0xB8F4, 0xB8F5, 0xB8F6, 0xB8F7, 0xB8FA, 0xB8FC, 0xB8FE, 0xB8FF, + 0xB900, 0xB901, 0xB902, 0xB903, 0xB905, 0xB906, 0xB907, 0xB908, 0xB909, + 0xB90A, 0xB90B, 0xB90C, 0xB90D, 0xB90E, 0xB90F, 0xB910, 0xB911, 0xB912, + 0xB913, 0xB914, 0xB915, 0xB916, 0xB917, 0xB919, 0xB91A, 0xB91B, 0xB91C, + 0xB91D, 0xB91E, 0xB91F, 0xB921, 0xB922, 0xB923, 0xB924, 0xB925, 0xB926, + 0xB927, 0xB928, 0xB929, 0xB92A, 0xB92B, 0xB92C, 0xB92D, 0xB92E, 0xB92F, + 0xB930, 0xB931, 0xB932, 0xB933, 0xB934, 0xB935, 0xB936, 0xB937, 0xB938, + 0xB939, 0xB93A, 0xB93B, 0xB93E, 0xB93F, 0xB941, 0xB942, 0xB943, 0xB945, + 0xB946, 0xB947, 0xB948, 0xB949, 0xB94A, 0xB94B, 0xB94D, 0xB94E, 0xB950, + 0xB952, 0xB953, 0xB954, 0xB955, 0xB956, 0xB957, 0xB95A, 0xB95B, 0xB95D, + 0xB95E, 0xB95F, 0xB961, 0xB962, 0xB963, 0xB964, 0xB965, 0xB966, 0xB967, + 0xB96A, 0xB96C, 0xB96E, 0xB96F, 0xB970, 0xB971, 0xB972, 0xB973, 0xB976, + 0xB977, 0xB979, 0xB97A, 0xB97B, 0xB97D, 0xB97E, 0xB97F, 0xB980, 0xB981, + 0xB982, 0xB983, 0xB986, 0xB988, 0xB98B, 0xB98C, 0xB98F, 0xB990, 0xB991, + 0xB992, 0xB993, 0xB994, 0xB995, 0xB996, 0xB997, 0xB998, 0xB999, 0xB99A, + 0xB99B, 0xB99C, 0xB99D, 0xB99E, 0xB99F, 0xB9A0, 0xB9A1, 0xB9A2, 0xB9A3, + 0xB9A4, 0xB9A5, 0xB9A6, 0xB9A7, 0xB9A8, 0xB9A9, 0xB9AA, 0xB9AB, 0xB9AE, + 0xB9AF, 0xB9B1, 0xB9B2, 0xB9B3, 0xB9B5, 0xB9B6, 0xB9B7, 0xB9B8, 0xB9B9, + 0xB9BA, 0xB9BB, 0xB9BE, 0xB9C0, 0xB9C2, 0xB9C3, 0xB9C4, 0xB9C5, 0xB9C6, + 0xB9C7, 0xB9CA, 0xB9CB, 0xB9CD, 0xB9D3, 0xB9D4, 0xB9D5, 0xB9D6, 0xB9D7, + 0xB9DA, 0xB9DC, 0xB9DF, 0xB9E0, 0xB9E2, 0xB9E6, 0xB9E7, 0xB9E9, 0xB9EA, + 0xB9EB, 0xB9ED, 0xB9EE, 0xB9EF, 0xB9F0, 0xB9F1, 0xB9F2, 0xB9F3, 0xB9F6, + 0xB9FB, 0xB9FC, 0xB9FD, 0xB9FE, 0xB9FF, 0xBA02, 0xBA03, 0xBA04, 0xBA05, + 0xBA06, 0xBA07, 0xBA09, 0xBA0A, 0xBA0B, 0xBA0C, 0xBA0D, 0xBA0E, 0xBA0F, + 0xBA10, 0xBA11, 0xBA12, 0xBA13, 0xBA14, 0xBA16, 0xBA17, 0xBA18, 0xBA19, + 0xBA1A, 0xBA1B, 0xBA1C, 0xBA1D, 0xBA1E, 0xBA1F, 0xBA20, 0xBA21, 0xBA22, + 0xBA23, 0xBA24, 0xBA25, 0xBA26, 0xBA27, 0xBA28, 0xBA29, 0xBA2A, 0xBA2B, + 0xBA2C, 0xBA2D, 0xBA2E, 0xBA2F, 0xBA30, 0xBA31, 0xBA32, 0xBA33, 0xBA34, + 0xBA35, 0xBA36, 0xBA37, 0xBA3A, 0xBA3B, 0xBA3D, 0xBA3E, 0xBA3F, 0xBA41, + 0xBA43, 0xBA44, 0xBA45, 0xBA46, 0xBA47, 0xBA4A, 0xBA4C, 0xBA4F, 0xBA50, + 0xBA51, 0xBA52, 0xBA56, 0xBA57, 0xBA59, 0xBA5A, 0xBA5B, 0xBA5D, 0xBA5E, + 0xBA5F, 0xBA60, 0xBA61, 0xBA62, 0xBA63, 0xBA66, 0xBA6A, 0xBA6B, 0xBA6C, + 0xBA6D, 0xBA6E, 0xBA6F, 0xBA72, 0xBA73, 0xBA75, 0xBA76, 0xBA77, 0xBA79, + 0xBA7A, 0xBA7B, 0xBA7C, 0xBA7D, 0xBA7E, 0xBA7F, 0xBA80, 0xBA81, 0xBA82, + 0xBA86, 0xBA88, 0xBA89, 0xBA8A, 0xBA8B, 0xBA8D, 0xBA8E, 0xBA8F, 0xBA90, + 0xBA91, 0xBA92, 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99, + 0xBA9A, 0xBA9B, 0xBA9C, 0xBA9D, 0xBA9E, 0xBA9F, 0xBAA0, 0xBAA1, 0xBAA2, + 0xBAA3, 0xBAA4, 0xBAA5, 0xBAA6, 0xBAA7, 0xBAAA, 0xBAAD, 0xBAAE, 0xBAAF, + 0xBAB1, 0xBAB3, 0xBAB4, 0xBAB5, 0xBAB6, 0xBAB7, 0xBABA, 0xBABC, 0xBABE, + 0xBABF, 0xBAC0, 0xBAC1, 0xBAC2, 0xBAC3, 0xBAC5, 0xBAC6, 0xBAC7, 0xBAC9, + 0xBACA, 0xBACB, 0xBACC, 0xBACD, 0xBACE, 0xBACF, 0xBAD0, 0xBAD1, 0xBAD2, + 0xBAD3, 0xBAD4, 0xBAD5, 0xBAD6, 0xBAD7, 0xBADA, 0xBADB, 0xBADC, 0xBADD, + 0xBADE, 0xBADF, 0xBAE0, 0xBAE1, 0xBAE2, 0xBAE3, 0xBAE4, 0xBAE5, 0xBAE6, + 0xBAE7, 0xBAE8, 0xBAE9, 0xBAEA, 0xBAEB, 0xBAEC, 0xBAED, 0xBAEE, 0xBAEF, + 0xBAF0, 0xBAF1, 0xBAF2, 0xBAF3, 0xBAF4, 0xBAF5, 0xBAF6, 0xBAF7, 0xBAF8, + 0xBAF9, 0xBAFA, 0xBAFB, 0xBAFD, 0xBAFE, 0xBAFF, 0xBB01, 0xBB02, 0xBB03, + 0xBB05, 0xBB06, 0xBB07, 0xBB08, 0xBB09, 0xBB0A, 0xBB0B, 0xBB0C, 0xBB0E, + 0xBB10, 0xBB12, 0xBB13, 0xBB14, 0xBB15, 0xBB16, 0xBB17, 0xBB19, 0xBB1A, + 0xBB1B, 0xBB1D, 0xBB1E, 0xBB1F, 0xBB21, 0xBB22, 0xBB23, 0xBB24, 0xBB25, + 0xBB26, 0xBB27, 0xBB28, 0xBB2A, 0xBB2C, 0xBB2D, 0xBB2E, 0xBB2F, 0xBB30, + 0xBB31, 0xBB32, 0xBB33, 0xBB37, 0xBB39, 0xBB3A, 0xBB3F, 0xBB40, 0xBB41, + 0xBB42, 0xBB43, 0xBB46, 0xBB48, 0xBB4A, 0xBB4B, 0xBB4C, 0xBB4E, 0xBB51, + 0xBB52, 0xBB53, 0xBB55, 0xBB56, 0xBB57, 0xBB59, 0xBB5A, 0xBB5B, 0xBB5C, + 0xBB5D, 0xBB5E, 0xBB5F, 0xBB60, 0xBB62, 0xBB64, 0xBB65, 0xBB66, 0xBB67, + 0xBB68, 0xBB69, 0xBB6A, 0xBB6B, 0xBB6D, 0xBB6E, 0xBB6F, 0xBB70, 0xBB71, + 0xBB72, 0xBB73, 0xBB74, 0xBB75, 0xBB76, 0xBB77, 0xBB78, 0xBB79, 0xBB7A, + 0xBB7B, 0xBB7C, 0xBB7D, 0xBB7E, 0xBB7F, 0xBB80, 0xBB81, 0xBB82, 0xBB83, + 0xBB84, 0xBB85, 0xBB86, 0xBB87, 0xBB89, 0xBB8A, 0xBB8B, 0xBB8D, 0xBB8E, + 0xBB8F, 0xBB91, 0xBB92, 0xBB93, 0xBB94, 0xBB95, 0xBB96, 0xBB97, 0xBB98, + 0xBB99, 0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D, 0xBB9E, 0xBB9F, 0xBBA0, 0xBBA1, + 0xBBA2, 0xBBA3, 0xBBA5, 0xBBA6, 0xBBA7, 0xBBA9, 0xBBAA, 0xBBAB, 0xBBAD, + 0xBBAE, 0xBBAF, 0xBBB0, 0xBBB1, 0xBBB2, 0xBBB3, 0xBBB5, 0xBBB6, 0xBBB8, + 0xBBB9, 0xBBBA, 0xBBBB, 0xBBBC, 0xBBBD, 0xBBBE, 0xBBBF, 0xBBC1, 0xBBC2, + 0xBBC3, 0xBBC5, 0xBBC6, 0xBBC7, 0xBBC9, 0xBBCA, 0xBBCB, 0xBBCC, 0xBBCD, + 0xBBCE, 0xBBCF, 0xBBD1, 0xBBD2, 0xBBD4, 0xBBD5, 0xBBD6, 0xBBD7, 0xBBD8, + 0xBBD9, 0xBBDA, 0xBBDB, 0xBBDC, 0xBBDD, 0xBBDE, 0xBBDF, 0xBBE0, 0xBBE1, + 0xBBE2, 0xBBE3, 0xBBE4, 0xBBE5, 0xBBE6, 0xBBE7, 0xBBE8, 0xBBE9, 0xBBEA, + 0xBBEB, 0xBBEC, 0xBBED, 0xBBEE, 0xBBEF, 0xBBF0, 0xBBF1, 0xBBF2, 0xBBF3, + 0xBBF4, 0xBBF5, 0xBBF6, 0xBBF7, 0xBBFA, 0xBBFB, 0xBBFD, 0xBBFE, 0xBC01, + 0xBC03, 0xBC04, 0xBC05, 0xBC06, 0xBC07, 0xBC0A, 0xBC0E, 0xBC10, 0xBC12, + 0xBC13, 0xBC19, 0xBC1A, 0xBC20, 0xBC21, 0xBC22, 0xBC23, 0xBC26, 0xBC28, + 0xBC2A, 0xBC2B, 0xBC2C, 0xBC2E, 0xBC2F, 0xBC32, 0xBC33, 0xBC35, 0xBC36, + 0xBC37, 0xBC39, 0xBC3A, 0xBC3B, 0xBC3C, 0xBC3D, 0xBC3E, 0xBC3F, 0xBC42, + 0xBC46, 0xBC47, 0xBC48, 0xBC4A, 0xBC4B, 0xBC4E, 0xBC4F, 0xBC51, 0xBC52, + 0xBC53, 0xBC54, 0xBC55, 0xBC56, 0xBC57, 0xBC58, 0xBC59, 0xBC5A, 0xBC5B, + 0xBC5C, 0xBC5E, 0xBC5F, 0xBC60, 0xBC61, 0xBC62, 0xBC63, 0xBC64, 0xBC65, + 0xBC66, 0xBC67, 0xBC68, 0xBC69, 0xBC6A, 0xBC6B, 0xBC6C, 0xBC6D, 0xBC6E, + 0xBC6F, 0xBC70, 0xBC71, 0xBC72, 0xBC73, 0xBC74, 0xBC75, 0xBC76, 0xBC77, + 0xBC78, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D, 0xBC7E, 0xBC7F, 0xBC80, + 0xBC81, 0xBC82, 0xBC83, 0xBC86, 0xBC87, 0xBC89, 0xBC8A, 0xBC8D, 0xBC8F, + 0xBC90, 0xBC91, 0xBC92, 0xBC93, 0xBC96, 0xBC98, 0xBC9B, 0xBC9C, 0xBC9D, + 0xBC9E, 0xBC9F, 0xBCA2, 0xBCA3, 0xBCA5, 0xBCA6, 0xBCA9, 0xBCAA, 0xBCAB, + 0xBCAC, 0xBCAD, 0xBCAE, 0xBCAF, 0xBCB2, 0xBCB6, 0xBCB7, 0xBCB8, 0xBCB9, + 0xBCBA, 0xBCBB, 0xBCBE, 0xBCBF, 0xBCC1, 0xBCC2, 0xBCC3, 0xBCC5, 0xBCC6, + 0xBCC7, 0xBCC8, 0xBCC9, 0xBCCA, 0xBCCB, 0xBCCC, 0xBCCE, 0xBCD2, 0xBCD3, + 0xBCD4, 0xBCD6, 0xBCD7, 0xBCD9, 0xBCDA, 0xBCDB, 0xBCDD, 0xBCDE, 0xBCDF, + 0xBCE0, 0xBCE1, 0xBCE2, 0xBCE3, 0xBCE4, 0xBCE5, 0xBCE6, 0xBCE7, 0xBCE8, + 0xBCE9, 0xBCEA, 0xBCEB, 0xBCEC, 0xBCED, 0xBCEE, 0xBCEF, 0xBCF0, 0xBCF1, + 0xBCF2, 0xBCF3, 0xBCF7, 0xBCF9, 0xBCFA, 0xBCFB, 0xBCFD, 0xBCFE, 0xBCFF, + 0xBD00, 0xBD01, 0xBD02, 0xBD03, 0xBD06, 0xBD08, 0xBD0A, 0xBD0B, 0xBD0C, + 0xBD0D, 0xBD0E, 0xBD0F, 0xBD11, 0xBD12, 0xBD13, 0xBD15, 0xBD16, 0xBD17, + 0xBD18, 0xBD19, 0xBD1A, 0xBD1B, 0xBD1C, 0xBD1D, 0xBD1E, 0xBD1F, 0xBD20, + 0xBD21, 0xBD22, 0xBD23, 0xBD25, 0xBD26, 0xBD27, 0xBD28, 0xBD29, 0xBD2A, + 0xBD2B, 0xBD2D, 0xBD2E, 0xBD2F, 0xBD30, 0xBD31, 0xBD32, 0xBD33, 0xBD34, + 0xBD35, 0xBD36, 0xBD37, 0xBD38, 0xBD39, 0xBD3A, 0xBD3B, 0xBD3C, 0xBD3D, + 0xBD3E, 0xBD3F, 0xBD41, 0xBD42, 0xBD43, 0xBD44, 0xBD45, 0xBD46, 0xBD47, + 0xBD4A, 0xBD4B, 0xBD4D, 0xBD4E, 0xBD4F, 0xBD51, 0xBD52, 0xBD53, 0xBD54, + 0xBD55, 0xBD56, 0xBD57, 0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D, 0xBD5E, 0xBD5F, + 0xBD60, 0xBD61, 0xBD62, 0xBD63, 0xBD65, 0xBD66, 0xBD67, 0xBD69, 0xBD6A, + 0xBD6B, 0xBD6C, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, 0xBD71, 0xBD72, 0xBD73, + 0xBD74, 0xBD75, 0xBD76, 0xBD77, 0xBD78, 0xBD79, 0xBD7A, 0xBD7B, 0xBD7C, + 0xBD7D, 0xBD7E, 0xBD7F, 0xBD82, 0xBD83, 0xBD85, 0xBD86, 0xBD8B, 0xBD8C, + 0xBD8D, 0xBD8E, 0xBD8F, 0xBD92, 0xBD94, 0xBD96, 0xBD97, 0xBD98, 0xBD9B, + 0xBD9D, 0xBD9E, 0xBD9F, 0xBDA0, 0xBDA1, 0xBDA2, 0xBDA3, 0xBDA5, 0xBDA6, + 0xBDA7, 0xBDA8, 0xBDA9, 0xBDAA, 0xBDAB, 0xBDAC, 0xBDAD, 0xBDAE, 0xBDAF, + 0xBDB1, 0xBDB2, 0xBDB3, 0xBDB4, 0xBDB5, 0xBDB6, 0xBDB7, 0xBDB9, 0xBDBA, + 0xBDBB, 0xBDBC, 0xBDBD, 0xBDBE, 0xBDBF, 0xBDC0, 0xBDC1, 0xBDC2, 0xBDC3, + 0xBDC4, 0xBDC5, 0xBDC6, 0xBDC7, 0xBDC8, 0xBDC9, 0xBDCA, 0xBDCB, 0xBDCC, + 0xBDCD, 0xBDCE, 0xBDCF, 0xBDD0, 0xBDD1, 0xBDD2, 0xBDD3, 0xBDD6, 0xBDD7, + 0xBDD9, 0xBDDA, 0xBDDB, 0xBDDD, 0xBDDE, 0xBDDF, 0xBDE0, 0xBDE1, 0xBDE2, + 0xBDE3, 0xBDE4, 0xBDE5, 0xBDE6, 0xBDE7, 0xBDE8, 0xBDEA, 0xBDEB, 0xBDEC, + 0xBDED, 0xBDEE, 0xBDEF, 0xBDF1, 0xBDF2, 0xBDF3, 0xBDF5, 0xBDF6, 0xBDF7, + 0xBDF9, 0xBDFA, 0xBDFB, 0xBDFC, 0xBDFD, 0xBDFE, 0xBDFF, 0xBE01, 0xBE02, + 0xBE04, 0xBE06, 0xBE07, 0xBE08, 0xBE09, 0xBE0A, 0xBE0B, 0xBE0E, 0xBE0F, + 0xBE11, 0xBE12, 0xBE13, 0xBE15, 0xBE16, 0xBE17, 0xBE18, 0xBE19, 0xBE1A, + 0xBE1B, 0xBE1E, 0xBE20, 0xBE21, 0xBE22, 0xBE23, 0xBE24, 0xBE25, 0xBE26, + 0xBE27, 0xBE28, 0xBE29, 0xBE2A, 0xBE2B, 0xBE2C, 0xBE2D, 0xBE2E, 0xBE2F, + 0xBE30, 0xBE31, 0xBE32, 0xBE33, 0xBE34, 0xBE35, 0xBE36, 0xBE37, 0xBE38, + 0xBE39, 0xBE3A, 0xBE3B, 0xBE3C, 0xBE3D, 0xBE3E, 0xBE3F, 0xBE40, 0xBE41, + 0xBE42, 0xBE43, 0xBE46, 0xBE47, 0xBE49, 0xBE4A, 0xBE4B, 0xBE4D, 0xBE4F, + 0xBE50, 0xBE51, 0xBE52, 0xBE53, 0xBE56, 0xBE58, 0xBE5C, 0xBE5D, 0xBE5E, + 0xBE5F, 0xBE62, 0xBE63, 0xBE65, 0xBE66, 0xBE67, 0xBE69, 0xBE6B, 0xBE6C, + 0xBE6D, 0xBE6E, 0xBE6F, 0xBE72, 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, + 0xBE7E, 0xBE7F, 0xBE81, 0xBE82, 0xBE83, 0xBE85, 0xBE86, 0xBE87, 0xBE88, + 0xBE89, 0xBE8A, 0xBE8B, 0xBE8E, 0xBE92, 0xBE93, 0xBE94, 0xBE95, 0xBE96, + 0xBE97, 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, 0xBE9E, 0xBE9F, 0xBEA0, 0xBEA1, + 0xBEA2, 0xBEA3, 0xBEA4, 0xBEA5, 0xBEA6, 0xBEA7, 0xBEA9, 0xBEAA, 0xBEAB, + 0xBEAC, 0xBEAD, 0xBEAE, 0xBEAF, 0xBEB0, 0xBEB1, 0xBEB2, 0xBEB3, 0xBEB4, + 0xBEB5, 0xBEB6, 0xBEB7, 0xBEB8, 0xBEB9, 0xBEBA, 0xBEBB, 0xBEBC, 0xBEBD, + 0xBEBE, 0xBEBF, 0xBEC0, 0xBEC1, 0xBEC2, 0xBEC3, 0xBEC4, 0xBEC5, 0xBEC6, + 0xBEC7, 0xBEC8, 0xBEC9, 0xBECA, 0xBECB, 0xBECC, 0xBECD, 0xBECE, 0xBECF, + 0xBED2, 0xBED3, 0xBED5, 0xBED6, 0xBED9, 0xBEDA, 0xBEDB, 0xBEDC, 0xBEDD, + 0xBEDE, 0xBEDF, 0xBEE1, 0xBEE2, 0xBEE6, 0xBEE7, 0xBEE8, 0xBEE9, 0xBEEA, + 0xBEEB, 0xBEED, 0xBEEE, 0xBEEF, 0xBEF0, 0xBEF1, 0xBEF2, 0xBEF3, 0xBEF4, + 0xBEF5, 0xBEF6, 0xBEF7, 0xBEF8, 0xBEF9, 0xBEFA, 0xBEFB, 0xBEFC, 0xBEFD, + 0xBEFE, 0xBEFF, 0xBF00, 0xBF02, 0xBF03, 0xBF04, 0xBF05, 0xBF06, 0xBF07, + 0xBF0A, 0xBF0B, 0xBF0C, 0xBF0D, 0xBF0E, 0xBF0F, 0xBF10, 0xBF11, 0xBF12, + 0xBF13, 0xBF14, 0xBF15, 0xBF16, 0xBF17, 0xBF1A, 0xBF1E, 0xBF1F, 0xBF20, + 0xBF21, 0xBF22, 0xBF23, 0xBF24, 0xBF25, 0xBF26, 0xBF27, 0xBF28, 0xBF29, + 0xBF2A, 0xBF2B, 0xBF2C, 0xBF2D, 0xBF2E, 0xBF2F, 0xBF30, 0xBF31, 0xBF32, + 0xBF33, 0xBF34, 0xBF35, 0xBF36, 0xBF37, 0xBF38, 0xBF39, 0xBF3A, 0xBF3B, + 0xBF3C, 0xBF3D, 0xBF3E, 0xBF3F, 0xBF42, 0xBF43, 0xBF45, 0xBF46, 0xBF47, + 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, 0xBF4D, 0xBF4E, 0xBF4F, 0xBF52, 0xBF53, + 0xBF54, 0xBF56, 0xBF57, 0xBF58, 0xBF59, 0xBF5A, 0xBF5B, 0xBF5C, 0xBF5D, + 0xBF5E, 0xBF5F, 0xBF60, 0xBF61, 0xBF62, 0xBF63, 0xBF64, 0xBF65, 0xBF66, + 0xBF67, 0xBF68, 0xBF69, 0xBF6A, 0xBF6B, 0xBF6C, 0xBF6D, 0xBF6E, 0xBF6F, + 0xBF70, 0xBF71, 0xBF72, 0xBF73, 0xBF74, 0xBF75, 0xBF76, 0xBF77, 0xBF78, + 0xBF79, 0xBF7A, 0xBF7B, 0xBF7C, 0xBF7D, 0xBF7E, 0xBF7F, 0xBF80, 0xBF81, + 0xBF82, 0xBF83, 0xBF84, 0xBF85, 0xBF86, 0xBF87, 0xBF88, 0xBF89, 0xBF8A, + 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90, 0xBF91, 0xBF92, 0xBF93, + 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, 0xBF9A, 0xBF9B, 0xBF9C, 0xBF9D, + 0xBF9E, 0xBF9F, 0xBFA0, 0xBFA1, 0xBFA2, 0xBFA3, 0xBFA4, 0xBFA5, 0xBFA6, + 0xBFA7, 0xBFA8, 0xBFA9, 0xBFAA, 0xBFAB, 0xBFAC, 0xBFAD, 0xBFAE, 0xBFAF, + 0xBFB1, 0xBFB2, 0xBFB3, 0xBFB4, 0xBFB5, 0xBFB6, 0xBFB7, 0xBFB8, 0xBFB9, + 0xBFBA, 0xBFBB, 0xBFBC, 0xBFBD, 0xBFBE, 0xBFBF, 0xBFC0, 0xBFC1, 0xBFC2, + 0xBFC3, 0xBFC4, 0xBFC6, 0xBFC7, 0xBFC8, 0xBFC9, 0xBFCA, 0xBFCB, 0xBFCE, + 0xBFCF, 0xBFD1, 0xBFD2, 0xBFD3, 0xBFD5, 0xBFD6, 0xBFD7, 0xBFD8, 0xBFD9, + 0xBFDA, 0xBFDB, 0xBFDD, 0xBFDE, 0xBFE0, 0xBFE2, 0xBFE3, 0xBFE4, 0xBFE5, + 0xBFE6, 0xBFE7, 0xBFE8, 0xBFE9, 0xBFEA, 0xBFEB, 0xBFEC, 0xBFED, 0xBFEE, + 0xBFEF, 0xBFF0, 0xBFF1, 0xBFF2, 0xBFF3, 0xBFF4, 0xBFF5, 0xBFF6, 0xBFF7, + 0xBFF8, 0xBFF9, 0xBFFA, 0xBFFB, 0xBFFC, 0xBFFD, 0xBFFE, 0xBFFF, 0xC000, + 0xC001, 0xC002, 0xC003, 0xC004, 0xC005, 0xC006, 0xC007, 0xC008, 0xC009, + 0xC00A, 0xC00B, 0xC00C, 0xC00D, 0xC00E, 0xC00F, 0xC010, 0xC011, 0xC012, + 0xC013, 0xC014, 0xC015, 0xC016, 0xC017, 0xC018, 0xC019, 0xC01A, 0xC01B, + 0xC01C, 0xC01D, 0xC01E, 0xC01F, 0xC020, 0xC021, 0xC022, 0xC023, 0xC024, + 0xC025, 0xC026, 0xC027, 0xC028, 0xC029, 0xC02A, 0xC02B, 0xC02C, 0xC02D, + 0xC02E, 0xC02F, 0xC030, 0xC031, 0xC032, 0xC033, 0xC034, 0xC035, 0xC036, + 0xC037, 0xC038, 0xC039, 0xC03A, 0xC03B, 0xC03D, 0xC03E, 0xC03F, 0xC040, + 0xC041, 0xC042, 0xC043, 0xC044, 0xC045, 0xC046, 0xC047, 0xC048, 0xC049, + 0xC04A, 0xC04B, 0xC04C, 0xC04D, 0xC04E, 0xC04F, 0xC050, 0xC052, 0xC053, + 0xC054, 0xC055, 0xC056, 0xC057, 0xC059, 0xC05A, 0xC05B, 0xC05D, 0xC05E, + 0xC05F, 0xC061, 0xC062, 0xC063, 0xC064, 0xC065, 0xC066, 0xC067, 0xC06A, + 0xC06B, 0xC06C, 0xC06D, 0xC06E, 0xC06F, 0xC070, 0xC071, 0xC072, 0xC073, + 0xC074, 0xC075, 0xC076, 0xC077, 0xC078, 0xC079, 0xC07A, 0xC07B, 0xC07C, + 0xC07D, 0xC07E, 0xC07F, 0xC080, 0xC081, 0xC082, 0xC083, 0xC084, 0xC085, + 0xC086, 0xC087, 0xC088, 0xC089, 0xC08A, 0xC08B, 0xC08C, 0xC08D, 0xC08E, + 0xC08F, 0xC092, 0xC093, 0xC095, 0xC096, 0xC097, 0xC099, 0xC09A, 0xC09B, + 0xC09C, 0xC09D, 0xC09E, 0xC09F, 0xC0A2, 0xC0A4, 0xC0A6, 0xC0A7, 0xC0A8, + 0xC0A9, 0xC0AA, 0xC0AB, 0xC0AE, 0xC0B1, 0xC0B2, 0xC0B7, 0xC0B8, 0xC0B9, + 0xC0BA, 0xC0BB, 0xC0BE, 0xC0C2, 0xC0C3, 0xC0C4, 0xC0C6, 0xC0C7, 0xC0CA, + 0xC0CB, 0xC0CD, 0xC0CE, 0xC0CF, 0xC0D1, 0xC0D2, 0xC0D3, 0xC0D4, 0xC0D5, + 0xC0D6, 0xC0D7, 0xC0DA, 0xC0DE, 0xC0DF, 0xC0E0, 0xC0E1, 0xC0E2, 0xC0E3, + 0xC0E6, 0xC0E7, 0xC0E9, 0xC0EA, 0xC0EB, 0xC0ED, 0xC0EE, 0xC0EF, 0xC0F0, + 0xC0F1, 0xC0F2, 0xC0F3, 0xC0F6, 0xC0F8, 0xC0FA, 0xC0FB, 0xC0FC, 0xC0FD, + 0xC0FE, 0xC0FF, 0xC101, 0xC102, 0xC103, 0xC105, 0xC106, 0xC107, 0xC109, + 0xC10A, 0xC10B, 0xC10C, 0xC10D, 0xC10E, 0xC10F, 0xC111, 0xC112, 0xC113, + 0xC114, 0xC116, 0xC117, 0xC118, 0xC119, 0xC11A, 0xC11B, 0xC121, 0xC122, + 0xC125, 0xC128, 0xC129, 0xC12A, 0xC12B, 0xC12E, 0xC132, 0xC133, 0xC134, + 0xC135, 0xC137, 0xC13A, 0xC13B, 0xC13D, 0xC13E, 0xC13F, 0xC141, 0xC142, + 0xC143, 0xC144, 0xC145, 0xC146, 0xC147, 0xC14A, 0xC14E, 0xC14F, 0xC150, + 0xC151, 0xC152, 0xC153, 0xC156, 0xC157, 0xC159, 0xC15A, 0xC15B, 0xC15D, + 0xC15E, 0xC15F, 0xC160, 0xC161, 0xC162, 0xC163, 0xC166, 0xC16A, 0xC16B, + 0xC16C, 0xC16D, 0xC16E, 0xC16F, 0xC171, 0xC172, 0xC173, 0xC175, 0xC176, + 0xC177, 0xC179, 0xC17A, 0xC17B, 0xC17C, 0xC17D, 0xC17E, 0xC17F, 0xC180, + 0xC181, 0xC182, 0xC183, 0xC184, 0xC186, 0xC187, 0xC188, 0xC189, 0xC18A, + 0xC18B, 0xC18F, 0xC191, 0xC192, 0xC193, 0xC195, 0xC197, 0xC198, 0xC199, + 0xC19A, 0xC19B, 0xC19E, 0xC1A0, 0xC1A2, 0xC1A3, 0xC1A4, 0xC1A6, 0xC1A7, + 0xC1AA, 0xC1AB, 0xC1AD, 0xC1AE, 0xC1AF, 0xC1B1, 0xC1B2, 0xC1B3, 0xC1B4, + 0xC1B5, 0xC1B6, 0xC1B7, 0xC1B8, 0xC1B9, 0xC1BA, 0xC1BB, 0xC1BC, 0xC1BE, + 0xC1BF, 0xC1C0, 0xC1C1, 0xC1C2, 0xC1C3, 0xC1C5, 0xC1C6, 0xC1C7, 0xC1C9, + 0xC1CA, 0xC1CB, 0xC1CD, 0xC1CE, 0xC1CF, 0xC1D0, 0xC1D1, 0xC1D2, 0xC1D3, + 0xC1D5, 0xC1D6, 0xC1D9, 0xC1DA, 0xC1DB, 0xC1DC, 0xC1DD, 0xC1DE, 0xC1DF, + 0xC1E1, 0xC1E2, 0xC1E3, 0xC1E5, 0xC1E6, 0xC1E7, 0xC1E9, 0xC1EA, 0xC1EB, + 0xC1EC, 0xC1ED, 0xC1EE, 0xC1EF, 0xC1F2, 0xC1F4, 0xC1F5, 0xC1F6, 0xC1F7, + 0xC1F8, 0xC1F9, 0xC1FA, 0xC1FB, 0xC1FE, 0xC1FF, 0xC201, 0xC202, 0xC203, + 0xC205, 0xC206, 0xC207, 0xC208, 0xC209, 0xC20A, 0xC20B, 0xC20E, 0xC210, + 0xC212, 0xC213, 0xC214, 0xC215, 0xC216, 0xC217, 0xC21A, 0xC21B, 0xC21D, + 0xC21E, 0xC221, 0xC222, 0xC223, 0xC224, 0xC225, 0xC226, 0xC227, 0xC22A, + 0xC22C, 0xC22E, 0xC230, 0xC233, 0xC235, 0xC236, 0xC237, 0xC238, 0xC239, + 0xC23A, 0xC23B, 0xC23C, 0xC23D, 0xC23E, 0xC23F, 0xC240, 0xC241, 0xC242, + 0xC243, 0xC244, 0xC245, 0xC246, 0xC247, 0xC249, 0xC24A, 0xC24B, 0xC24C, + 0xC24D, 0xC24E, 0xC24F, 0xC252, 0xC253, 0xC255, 0xC256, 0xC257, 0xC259, + 0xC25A, 0xC25B, 0xC25C, 0xC25D, 0xC25E, 0xC25F, 0xC261, 0xC262, 0xC263, + 0xC264, 0xC266, 0xC267, 0xC268, 0xC269, 0xC26A, 0xC26B, 0xC26E, 0xC26F, + 0xC271, 0xC272, 0xC273, 0xC275, 0xC276, 0xC277, 0xC278, 0xC279, 0xC27A, + 0xC27B, 0xC27E, 0xC280, 0xC282, 0xC283, 0xC284, 0xC285, 0xC286, 0xC287, + 0xC28A, 0xC28B, 0xC28C, 0xC28D, 0xC28E, 0xC28F, 0xC291, 0xC292, 0xC293, + 0xC294, 0xC295, 0xC296, 0xC297, 0xC299, 0xC29A, 0xC29C, 0xC29E, 0xC29F, + 0xC2A0, 0xC2A1, 0xC2A2, 0xC2A3, 0xC2A6, 0xC2A7, 0xC2A9, 0xC2AA, 0xC2AB, + 0xC2AE, 0xC2AF, 0xC2B0, 0xC2B1, 0xC2B2, 0xC2B3, 0xC2B6, 0xC2B8, 0xC2BA, + 0xC2BB, 0xC2BC, 0xC2BD, 0xC2BE, 0xC2BF, 0xC2C0, 0xC2C1, 0xC2C2, 0xC2C3, + 0xC2C4, 0xC2C5, 0xC2C6, 0xC2C7, 0xC2C8, 0xC2C9, 0xC2CA, 0xC2CB, 0xC2CC, + 0xC2CD, 0xC2CE, 0xC2CF, 0xC2D0, 0xC2D1, 0xC2D2, 0xC2D3, 0xC2D4, 0xC2D5, + 0xC2D6, 0xC2D7, 0xC2D8, 0xC2D9, 0xC2DA, 0xC2DB, 0xC2DE, 0xC2DF, 0xC2E1, + 0xC2E2, 0xC2E5, 0xC2E6, 0xC2E7, 0xC2E8, 0xC2E9, 0xC2EA, 0xC2EE, 0xC2F0, + 0xC2F2, 0xC2F3, 0xC2F4, 0xC2F5, 0xC2F7, 0xC2FA, 0xC2FD, 0xC2FE, 0xC2FF, + 0xC301, 0xC302, 0xC303, 0xC304, 0xC305, 0xC306, 0xC307, 0xC30A, 0xC30B, + 0xC30E, 0xC30F, 0xC310, 0xC311, 0xC312, 0xC316, 0xC317, 0xC319, 0xC31A, + 0xC31B, 0xC31D, 0xC31E, 0xC31F, 0xC320, 0xC321, 0xC322, 0xC323, 0xC326, + 0xC327, 0xC32A, 0xC32B, 0xC32C, 0xC32D, 0xC32E, 0xC32F, 0xC330, 0xC331, + 0xC332, 0xC333, 0xC334, 0xC335, 0xC336, 0xC337, 0xC338, 0xC339, 0xC33A, + 0xC33B, 0xC33C, 0xC33D, 0xC33E, 0xC33F, 0xC340, 0xC341, 0xC342, 0xC343, + 0xC344, 0xC346, 0xC347, 0xC348, 0xC349, 0xC34A, 0xC34B, 0xC34C, 0xC34D, + 0xC34E, 0xC34F, 0xC350, 0xC351, 0xC352, 0xC353, 0xC354, 0xC355, 0xC356, + 0xC357, 0xC358, 0xC359, 0xC35A, 0xC35B, 0xC35C, 0xC35D, 0xC35E, 0xC35F, + 0xC360, 0xC361, 0xC362, 0xC363, 0xC364, 0xC365, 0xC366, 0xC367, 0xC36A, + 0xC36B, 0xC36D, 0xC36E, 0xC36F, 0xC371, 0xC373, 0xC374, 0xC375, 0xC376, + 0xC377, 0xC37A, 0xC37B, 0xC37E, 0xC37F, 0xC380, 0xC381, 0xC382, 0xC383, + 0xC385, 0xC386, 0xC387, 0xC389, 0xC38A, 0xC38B, 0xC38D, 0xC38E, 0xC38F, + 0xC390, 0xC391, 0xC392, 0xC393, 0xC394, 0xC395, 0xC396, 0xC397, 0xC398, + 0xC399, 0xC39A, 0xC39B, 0xC39C, 0xC39D, 0xC39E, 0xC39F, 0xC3A0, 0xC3A1, + 0xC3A2, 0xC3A3, 0xC3A4, 0xC3A5, 0xC3A6, 0xC3A7, 0xC3A8, 0xC3A9, 0xC3AA, + 0xC3AB, 0xC3AC, 0xC3AD, 0xC3AE, 0xC3AF, 0xC3B0, 0xC3B1, 0xC3B2, 0xC3B3, + 0xC3B4, 0xC3B5, 0xC3B6, 0xC3B7, 0xC3B8, 0xC3B9, 0xC3BA, 0xC3BB, 0xC3BC, + 0xC3BD, 0xC3BE, 0xC3BF, 0xC3C1, 0xC3C2, 0xC3C3, 0xC3C4, 0xC3C5, 0xC3C6, + 0xC3C7, 0xC3C8, 0xC3C9, 0xC3CA, 0xC3CB, 0xC3CC, 0xC3CD, 0xC3CE, 0xC3CF, + 0xC3D0, 0xC3D1, 0xC3D2, 0xC3D3, 0xC3D4, 0xC3D5, 0xC3D6, 0xC3D7, 0xC3DA, + 0xC3DB, 0xC3DD, 0xC3DE, 0xC3E1, 0xC3E3, 0xC3E4, 0xC3E5, 0xC3E6, 0xC3E7, + 0xC3EA, 0xC3EB, 0xC3EC, 0xC3EE, 0xC3EF, 0xC3F0, 0xC3F1, 0xC3F2, 0xC3F3, + 0xC3F6, 0xC3F7, 0xC3F9, 0xC3FA, 0xC3FB, 0xC3FC, 0xC3FD, 0xC3FE, 0xC3FF, + 0xC400, 0xC401, 0xC402, 0xC403, 0xC404, 0xC405, 0xC406, 0xC407, 0xC409, + 0xC40A, 0xC40B, 0xC40C, 0xC40D, 0xC40E, 0xC40F, 0xC411, 0xC412, 0xC413, + 0xC414, 0xC415, 0xC416, 0xC417, 0xC418, 0xC419, 0xC41A, 0xC41B, 0xC41C, + 0xC41D, 0xC41E, 0xC41F, 0xC420, 0xC421, 0xC422, 0xC423, 0xC425, 0xC426, + 0xC427, 0xC428, 0xC429, 0xC42A, 0xC42B, 0xC42D, 0xC42E, 0xC42F, 0xC431, + 0xC432, 0xC433, 0xC435, 0xC436, 0xC437, 0xC438, 0xC439, 0xC43A, 0xC43B, + 0xC43E, 0xC43F, 0xC440, 0xC441, 0xC442, 0xC443, 0xC444, 0xC445, 0xC446, + 0xC447, 0xC449, 0xC44A, 0xC44B, 0xC44C, 0xC44D, 0xC44E, 0xC44F, 0xC450, + 0xC451, 0xC452, 0xC453, 0xC454, 0xC455, 0xC456, 0xC457, 0xC458, 0xC459, + 0xC45A, 0xC45B, 0xC45C, 0xC45D, 0xC45E, 0xC45F, 0xC460, 0xC461, 0xC462, + 0xC463, 0xC466, 0xC467, 0xC469, 0xC46A, 0xC46B, 0xC46D, 0xC46E, 0xC46F, + 0xC470, 0xC471, 0xC472, 0xC473, 0xC476, 0xC477, 0xC478, 0xC47A, 0xC47B, + 0xC47C, 0xC47D, 0xC47E, 0xC47F, 0xC481, 0xC482, 0xC483, 0xC484, 0xC485, + 0xC486, 0xC487, 0xC488, 0xC489, 0xC48A, 0xC48B, 0xC48C, 0xC48D, 0xC48E, + 0xC48F, 0xC490, 0xC491, 0xC492, 0xC493, 0xC495, 0xC496, 0xC497, 0xC498, + 0xC499, 0xC49A, 0xC49B, 0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC4A1, 0xC4A2, + 0xC4A3, 0xC4A4, 0xC4A5, 0xC4A6, 0xC4A7, 0xC4A8, 0xC4A9, 0xC4AA, 0xC4AB, + 0xC4AC, 0xC4AD, 0xC4AE, 0xC4AF, 0xC4B0, 0xC4B1, 0xC4B2, 0xC4B3, 0xC4B4, + 0xC4B5, 0xC4B6, 0xC4B7, 0xC4B9, 0xC4BA, 0xC4BB, 0xC4BD, 0xC4BE, 0xC4BF, + 0xC4C0, 0xC4C1, 0xC4C2, 0xC4C3, 0xC4C4, 0xC4C5, 0xC4C6, 0xC4C7, 0xC4C8, + 0xC4C9, 0xC4CA, 0xC4CB, 0xC4CC, 0xC4CD, 0xC4CE, 0xC4CF, 0xC4D0, 0xC4D1, + 0xC4D2, 0xC4D3, 0xC4D4, 0xC4D5, 0xC4D6, 0xC4D7, 0xC4D8, 0xC4D9, 0xC4DA, + 0xC4DB, 0xC4DC, 0xC4DD, 0xC4DE, 0xC4DF, 0xC4E0, 0xC4E1, 0xC4E2, 0xC4E3, + 0xC4E4, 0xC4E5, 0xC4E6, 0xC4E7, 0xC4E8, 0xC4EA, 0xC4EB, 0xC4EC, 0xC4ED, + 0xC4EE, 0xC4EF, 0xC4F2, 0xC4F3, 0xC4F5, 0xC4F6, 0xC4F7, 0xC4F9, 0xC4FB, + 0xC4FC, 0xC4FD, 0xC4FE, 0xC502, 0xC503, 0xC504, 0xC505, 0xC506, 0xC507, + 0xC508, 0xC509, 0xC50A, 0xC50B, 0xC50D, 0xC50E, 0xC50F, 0xC511, 0xC512, + 0xC513, 0xC515, 0xC516, 0xC517, 0xC518, 0xC519, 0xC51A, 0xC51B, 0xC51D, + 0xC51E, 0xC51F, 0xC520, 0xC521, 0xC522, 0xC523, 0xC524, 0xC525, 0xC526, + 0xC527, 0xC52A, 0xC52B, 0xC52D, 0xC52E, 0xC52F, 0xC531, 0xC532, 0xC533, + 0xC534, 0xC535, 0xC536, 0xC537, 0xC53A, 0xC53C, 0xC53E, 0xC53F, 0xC540, + 0xC541, 0xC542, 0xC543, 0xC546, 0xC547, 0xC54B, 0xC54F, 0xC550, 0xC551, + 0xC552, 0xC556, 0xC55A, 0xC55B, 0xC55C, 0xC55F, 0xC562, 0xC563, 0xC565, + 0xC566, 0xC567, 0xC569, 0xC56A, 0xC56B, 0xC56C, 0xC56D, 0xC56E, 0xC56F, + 0xC572, 0xC576, 0xC577, 0xC578, 0xC579, 0xC57A, 0xC57B, 0xC57E, 0xC57F, + 0xC581, 0xC582, 0xC583, 0xC585, 0xC586, 0xC588, 0xC589, 0xC58A, 0xC58B, + 0xC58E, 0xC590, 0xC592, 0xC593, 0xC594, 0xC596, 0xC599, 0xC59A, 0xC59B, + 0xC59D, 0xC59E, 0xC59F, 0xC5A1, 0xC5A2, 0xC5A3, 0xC5A4, 0xC5A5, 0xC5A6, + 0xC5A7, 0xC5A8, 0xC5AA, 0xC5AB, 0xC5AC, 0xC5AD, 0xC5AE, 0xC5AF, 0xC5B0, + 0xC5B1, 0xC5B2, 0xC5B3, 0xC5B6, 0xC5B7, 0xC5BA, 0xC5BF, 0xC5C0, 0xC5C1, + 0xC5C2, 0xC5C3, 0xC5CB, 0xC5CD, 0xC5CF, 0xC5D2, 0xC5D3, 0xC5D5, 0xC5D6, + 0xC5D7, 0xC5D9, 0xC5DA, 0xC5DB, 0xC5DC, 0xC5DD, 0xC5DE, 0xC5DF, 0xC5E2, + 0xC5E4, 0xC5E6, 0xC5E7, 0xC5E8, 0xC5E9, 0xC5EA, 0xC5EB, 0xC5EF, 0xC5F1, + 0xC5F2, 0xC5F3, 0xC5F5, 0xC5F8, 0xC5F9, 0xC5FA, 0xC5FB, 0xC602, 0xC603, + 0xC604, 0xC609, 0xC60A, 0xC60B, 0xC60D, 0xC60E, 0xC60F, 0xC611, 0xC612, + 0xC613, 0xC614, 0xC615, 0xC616, 0xC617, 0xC61A, 0xC61D, 0xC61E, 0xC61F, + 0xC620, 0xC621, 0xC622, 0xC623, 0xC626, 0xC627, 0xC629, 0xC62A, 0xC62B, + 0xC62F, 0xC631, 0xC632, 0xC636, 0xC638, 0xC63A, 0xC63C, 0xC63D, 0xC63E, + 0xC63F, 0xC642, 0xC643, 0xC645, 0xC646, 0xC647, 0xC649, 0xC64A, 0xC64B, + 0xC64C, 0xC64D, 0xC64E, 0xC64F, 0xC652, 0xC656, 0xC657, 0xC658, 0xC659, + 0xC65A, 0xC65B, 0xC65E, 0xC65F, 0xC661, 0xC662, 0xC663, 0xC664, 0xC665, + 0xC666, 0xC667, 0xC668, 0xC669, 0xC66A, 0xC66B, 0xC66D, 0xC66E, 0xC670, + 0xC672, 0xC673, 0xC674, 0xC675, 0xC676, 0xC677, 0xC67A, 0xC67B, 0xC67D, + 0xC67E, 0xC67F, 0xC681, 0xC682, 0xC683, 0xC684, 0xC685, 0xC686, 0xC687, + 0xC68A, 0xC68C, 0xC68E, 0xC68F, 0xC690, 0xC691, 0xC692, 0xC693, 0xC696, + 0xC697, 0xC699, 0xC69A, 0xC69B, 0xC69D, 0xC69E, 0xC69F, 0xC6A0, 0xC6A1, + 0xC6A2, 0xC6A3, 0xC6A6, 0xC6A8, 0xC6AA, 0xC6AB, 0xC6AC, 0xC6AD, 0xC6AE, + 0xC6AF, 0xC6B2, 0xC6B3, 0xC6B5, 0xC6B6, 0xC6B7, 0xC6BB, 0xC6BC, 0xC6BD, + 0xC6BE, 0xC6BF, 0xC6C2, 0xC6C4, 0xC6C6, 0xC6C7, 0xC6C8, 0xC6C9, 0xC6CA, + 0xC6CB, 0xC6CE, 0xC6CF, 0xC6D1, 0xC6D2, 0xC6D3, 0xC6D5, 0xC6D6, 0xC6D7, + 0xC6D8, 0xC6D9, 0xC6DA, 0xC6DB, 0xC6DE, 0xC6DF, 0xC6E2, 0xC6E3, 0xC6E4, + 0xC6E5, 0xC6E6, 0xC6E7, 0xC6EA, 0xC6EB, 0xC6ED, 0xC6EE, 0xC6EF, 0xC6F1, + 0xC6F2, 0xC6F3, 0xC6F4, 0xC6F5, 0xC6F6, 0xC6F7, 0xC6FA, 0xC6FB, 0xC6FC, + 0xC6FE, 0xC6FF, 0xC700, 0xC701, 0xC702, 0xC703, 0xC706, 0xC707, 0xC709, + 0xC70A, 0xC70B, 0xC70D, 0xC70E, 0xC70F, 0xC710, 0xC711, 0xC712, 0xC713, + 0xC716, 0xC718, 0xC71A, 0xC71B, 0xC71C, 0xC71D, 0xC71E, 0xC71F, 0xC722, + 0xC723, 0xC725, 0xC726, 0xC727, 0xC729, 0xC72A, 0xC72B, 0xC72C, 0xC72D, + 0xC72E, 0xC72F, 0xC732, 0xC734, 0xC736, 0xC738, 0xC739, 0xC73A, 0xC73B, + 0xC73E, 0xC73F, 0xC741, 0xC742, 0xC743, 0xC745, 0xC746, 0xC747, 0xC748, + 0xC749, 0xC74B, 0xC74E, 0xC750, 0xC759, 0xC75A, 0xC75B, 0xC75D, 0xC75E, + 0xC75F, 0xC761, 0xC762, 0xC763, 0xC764, 0xC765, 0xC766, 0xC767, 0xC769, + 0xC76A, 0xC76C, 0xC76D, 0xC76E, 0xC76F, 0xC770, 0xC771, 0xC772, 0xC773, + 0xC776, 0xC777, 0xC779, 0xC77A, 0xC77B, 0xC77F, 0xC780, 0xC781, 0xC782, + 0xC786, 0xC78B, 0xC78C, 0xC78D, 0xC78F, 0xC792, 0xC793, 0xC795, 0xC799, + 0xC79B, 0xC79C, 0xC79D, 0xC79E, 0xC79F, 0xC7A2, 0xC7A7, 0xC7A8, 0xC7A9, + 0xC7AA, 0xC7AB, 0xC7AE, 0xC7AF, 0xC7B1, 0xC7B2, 0xC7B3, 0xC7B5, 0xC7B6, + 0xC7B7, 0xC7B8, 0xC7B9, 0xC7BA, 0xC7BB, 0xC7BE, 0xC7C2, 0xC7C3, 0xC7C4, + 0xC7C5, 0xC7C6, 0xC7C7, 0xC7CA, 0xC7CB, 0xC7CD, 0xC7CF, 0xC7D1, 0xC7D2, + 0xC7D3, 0xC7D4, 0xC7D5, 0xC7D6, 0xC7D7, 0xC7D9, 0xC7DA, 0xC7DB, 0xC7DC, + 0xC7DE, 0xC7DF, 0xC7E0, 0xC7E1, 0xC7E2, 0xC7E3, 0xC7E5, 0xC7E6, 0xC7E7, + 0xC7E9, 0xC7EA, 0xC7EB, 0xC7ED, 0xC7EE, 0xC7EF, 0xC7F0, 0xC7F1, 0xC7F2, + 0xC7F3, 0xC7F4, 0xC7F5, 0xC7F6, 0xC7F7, 0xC7F8, 0xC7F9, 0xC7FA, 0xC7FB, + 0xC7FC, 0xC7FD, 0xC7FE, 0xC7FF, 0xC802, 0xC803, 0xC805, 0xC806, 0xC807, + 0xC809, 0xC80B, 0xC80C, 0xC80D, 0xC80E, 0xC80F, 0xC812, 0xC814, 0xC817, + 0xC818, 0xC819, 0xC81A, 0xC81B, 0xC81E, 0xC81F, 0xC821, 0xC822, 0xC823, + 0xC825, 0xC826, 0xC827, 0xC828, 0xC829, 0xC82A, 0xC82B, 0xC82E, 0xC830, + 0xC832, 0xC833, 0xC834, 0xC835, 0xC836, 0xC837, 0xC839, 0xC83A, 0xC83B, + 0xC83D, 0xC83E, 0xC83F, 0xC841, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846, + 0xC847, 0xC84A, 0xC84B, 0xC84E, 0xC84F, 0xC850, 0xC851, 0xC852, 0xC853, + 0xC855, 0xC856, 0xC857, 0xC858, 0xC859, 0xC85A, 0xC85B, 0xC85C, 0xC85D, + 0xC85E, 0xC85F, 0xC860, 0xC861, 0xC862, 0xC863, 0xC864, 0xC865, 0xC866, + 0xC867, 0xC868, 0xC869, 0xC86A, 0xC86B, 0xC86C, 0xC86D, 0xC86E, 0xC86F, + 0xC872, 0xC873, 0xC875, 0xC876, 0xC877, 0xC879, 0xC87B, 0xC87C, 0xC87D, + 0xC87E, 0xC87F, 0xC882, 0xC884, 0xC888, 0xC889, 0xC88A, 0xC88E, 0xC88F, + 0xC890, 0xC891, 0xC892, 0xC893, 0xC895, 0xC896, 0xC897, 0xC898, 0xC899, + 0xC89A, 0xC89B, 0xC89C, 0xC89E, 0xC8A0, 0xC8A2, 0xC8A3, 0xC8A4, 0xC8A5, + 0xC8A6, 0xC8A7, 0xC8A9, 0xC8AA, 0xC8AB, 0xC8AC, 0xC8AD, 0xC8AE, 0xC8AF, + 0xC8B0, 0xC8B1, 0xC8B2, 0xC8B3, 0xC8B4, 0xC8B5, 0xC8B6, 0xC8B7, 0xC8B8, + 0xC8B9, 0xC8BA, 0xC8BB, 0xC8BE, 0xC8BF, 0xC8C0, 0xC8C1, 0xC8C2, 0xC8C3, + 0xC8C5, 0xC8C6, 0xC8C7, 0xC8C9, 0xC8CA, 0xC8CB, 0xC8CD, 0xC8CE, 0xC8CF, + 0xC8D0, 0xC8D1, 0xC8D2, 0xC8D3, 0xC8D6, 0xC8D8, 0xC8DA, 0xC8DB, 0xC8DC, + 0xC8DD, 0xC8DE, 0xC8DF, 0xC8E2, 0xC8E3, 0xC8E5, 0xC8E6, 0xC8E7, 0xC8E8, + 0xC8E9, 0xC8EA, 0xC8EB, 0xC8EC, 0xC8ED, 0xC8EE, 0xC8EF, 0xC8F0, 0xC8F1, + 0xC8F2, 0xC8F3, 0xC8F4, 0xC8F6, 0xC8F7, 0xC8F8, 0xC8F9, 0xC8FA, 0xC8FB, + 0xC8FE, 0xC8FF, 0xC901, 0xC902, 0xC903, 0xC907, 0xC908, 0xC909, 0xC90A, + 0xC90B, 0xC90E, 0xC910, 0xC912, 0xC913, 0xC914, 0xC915, 0xC916, 0xC917, + 0xC919, 0xC91A, 0xC91B, 0xC91C, 0xC91D, 0xC91E, 0xC91F, 0xC920, 0xC921, + 0xC922, 0xC923, 0xC924, 0xC925, 0xC926, 0xC927, 0xC928, 0xC929, 0xC92A, + 0xC92B, 0xC92D, 0xC92E, 0xC92F, 0xC930, 0xC931, 0xC932, 0xC933, 0xC935, + 0xC936, 0xC937, 0xC938, 0xC939, 0xC93A, 0xC93B, 0xC93C, 0xC93D, 0xC93E, + 0xC93F, 0xC940, 0xC941, 0xC942, 0xC943, 0xC944, 0xC945, 0xC946, 0xC947, + 0xC948, 0xC949, 0xC94A, 0xC94B, 0xC94C, 0xC94D, 0xC94E, 0xC94F, 0xC952, + 0xC953, 0xC955, 0xC956, 0xC957, 0xC959, 0xC95A, 0xC95B, 0xC95C, 0xC95D, + 0xC95E, 0xC95F, 0xC962, 0xC964, 0xC965, 0xC966, 0xC967, 0xC968, 0xC969, + 0xC96A, 0xC96B, 0xC96D, 0xC96E, 0xC96F, 0xC971, 0xC972, 0xC973, 0xC975, + 0xC976, 0xC977, 0xC978, 0xC979, 0xC97A, 0xC97B, 0xC97D, 0xC97E, 0xC97F, + 0xC980, 0xC981, 0xC982, 0xC983, 0xC984, 0xC985, 0xC986, 0xC987, 0xC98A, + 0xC98B, 0xC98D, 0xC98E, 0xC98F, 0xC991, 0xC992, 0xC993, 0xC994, 0xC995, + 0xC996, 0xC997, 0xC99A, 0xC99C, 0xC99E, 0xC99F, 0xC9A0, 0xC9A1, 0xC9A2, + 0xC9A3, 0xC9A4, 0xC9A5, 0xC9A6, 0xC9A7, 0xC9A8, 0xC9A9, 0xC9AA, 0xC9AB, + 0xC9AC, 0xC9AD, 0xC9AE, 0xC9AF, 0xC9B0, 0xC9B1, 0xC9B2, 0xC9B3, 0xC9B4, + 0xC9B5, 0xC9B6, 0xC9B7, 0xC9B8, 0xC9B9, 0xC9BA, 0xC9BB, 0xC9BC, 0xC9BD, + 0xC9BE, 0xC9BF, 0xC9C2, 0xC9C3, 0xC9C5, 0xC9C6, 0xC9C9, 0xC9CB, 0xC9CC, + 0xC9CD, 0xC9CE, 0xC9CF, 0xC9D2, 0xC9D4, 0xC9D7, 0xC9D8, 0xC9DB, 0xC9DE, + 0xC9DF, 0xC9E1, 0xC9E3, 0xC9E5, 0xC9E6, 0xC9E8, 0xC9E9, 0xC9EA, 0xC9EB, + 0xC9EE, 0xC9F2, 0xC9F3, 0xC9F4, 0xC9F5, 0xC9F6, 0xC9F7, 0xC9FA, 0xC9FB, + 0xC9FD, 0xC9FE, 0xC9FF, 0xCA01, 0xCA02, 0xCA03, 0xCA04, 0xCA05, 0xCA06, + 0xCA07, 0xCA0A, 0xCA0E, 0xCA0F, 0xCA10, 0xCA11, 0xCA12, 0xCA13, 0xCA15, + 0xCA16, 0xCA17, 0xCA19, 0xCA1A, 0xCA1B, 0xCA1C, 0xCA1D, 0xCA1E, 0xCA1F, + 0xCA20, 0xCA21, 0xCA22, 0xCA23, 0xCA24, 0xCA25, 0xCA26, 0xCA27, 0xCA28, + 0xCA2A, 0xCA2B, 0xCA2C, 0xCA2D, 0xCA2E, 0xCA2F, 0xCA30, 0xCA31, 0xCA32, + 0xCA33, 0xCA34, 0xCA35, 0xCA36, 0xCA37, 0xCA38, 0xCA39, 0xCA3A, 0xCA3B, + 0xCA3C, 0xCA3D, 0xCA3E, 0xCA3F, 0xCA40, 0xCA41, 0xCA42, 0xCA43, 0xCA44, + 0xCA45, 0xCA46, 0xCA47, 0xCA48, 0xCA49, 0xCA4A, 0xCA4B, 0xCA4E, 0xCA4F, + 0xCA51, 0xCA52, 0xCA53, 0xCA55, 0xCA56, 0xCA57, 0xCA58, 0xCA59, 0xCA5A, + 0xCA5B, 0xCA5E, 0xCA62, 0xCA63, 0xCA64, 0xCA65, 0xCA66, 0xCA67, 0xCA69, + 0xCA6A, 0xCA6B, 0xCA6C, 0xCA6D, 0xCA6E, 0xCA6F, 0xCA70, 0xCA71, 0xCA72, + 0xCA73, 0xCA74, 0xCA75, 0xCA76, 0xCA77, 0xCA78, 0xCA79, 0xCA7A, 0xCA7B, + 0xCA7C, 0xCA7E, 0xCA7F, 0xCA80, 0xCA81, 0xCA82, 0xCA83, 0xCA85, 0xCA86, + 0xCA87, 0xCA88, 0xCA89, 0xCA8A, 0xCA8B, 0xCA8C, 0xCA8D, 0xCA8E, 0xCA8F, + 0xCA90, 0xCA91, 0xCA92, 0xCA93, 0xCA94, 0xCA95, 0xCA96, 0xCA97, 0xCA99, + 0xCA9A, 0xCA9B, 0xCA9C, 0xCA9D, 0xCA9E, 0xCA9F, 0xCAA0, 0xCAA1, 0xCAA2, + 0xCAA3, 0xCAA4, 0xCAA5, 0xCAA6, 0xCAA7, 0xCAA8, 0xCAA9, 0xCAAA, 0xCAAB, + 0xCAAC, 0xCAAD, 0xCAAE, 0xCAAF, 0xCAB0, 0xCAB1, 0xCAB2, 0xCAB3, 0xCAB4, + 0xCAB5, 0xCAB6, 0xCAB7, 0xCAB8, 0xCAB9, 0xCABA, 0xCABB, 0xCABE, 0xCABF, + 0xCAC1, 0xCAC2, 0xCAC3, 0xCAC5, 0xCAC6, 0xCAC7, 0xCAC8, 0xCAC9, 0xCACA, + 0xCACB, 0xCACE, 0xCAD0, 0xCAD2, 0xCAD4, 0xCAD5, 0xCAD6, 0xCAD7, 0xCADA, + 0xCADB, 0xCADC, 0xCADD, 0xCADE, 0xCADF, 0xCAE1, 0xCAE2, 0xCAE3, 0xCAE4, + 0xCAE5, 0xCAE6, 0xCAE7, 0xCAE8, 0xCAE9, 0xCAEA, 0xCAEB, 0xCAED, 0xCAEE, + 0xCAEF, 0xCAF0, 0xCAF1, 0xCAF2, 0xCAF3, 0xCAF5, 0xCAF6, 0xCAF7, 0xCAF8, + 0xCAF9, 0xCAFA, 0xCAFB, 0xCAFC, 0xCAFD, 0xCAFE, 0xCAFF, 0xCB00, 0xCB01, + 0xCB02, 0xCB03, 0xCB04, 0xCB05, 0xCB06, 0xCB07, 0xCB09, 0xCB0A, 0xCB0B, + 0xCB0C, 0xCB0D, 0xCB0E, 0xCB0F, 0xCB11, 0xCB12, 0xCB13, 0xCB15, 0xCB16, + 0xCB17, 0xCB19, 0xCB1A, 0xCB1B, 0xCB1C, 0xCB1D, 0xCB1E, 0xCB1F, 0xCB22, + 0xCB23, 0xCB24, 0xCB25, 0xCB26, 0xCB27, 0xCB28, 0xCB29, 0xCB2A, 0xCB2B, + 0xCB2C, 0xCB2D, 0xCB2E, 0xCB2F, 0xCB30, 0xCB31, 0xCB32, 0xCB33, 0xCB34, + 0xCB35, 0xCB36, 0xCB37, 0xCB38, 0xCB39, 0xCB3A, 0xCB3B, 0xCB3C, 0xCB3D, + 0xCB3E, 0xCB3F, 0xCB40, 0xCB42, 0xCB43, 0xCB44, 0xCB45, 0xCB46, 0xCB47, + 0xCB4A, 0xCB4B, 0xCB4D, 0xCB4E, 0xCB4F, 0xCB51, 0xCB52, 0xCB53, 0xCB54, + 0xCB55, 0xCB56, 0xCB57, 0xCB5A, 0xCB5B, 0xCB5C, 0xCB5E, 0xCB5F, 0xCB60, + 0xCB61, 0xCB62, 0xCB63, 0xCB65, 0xCB66, 0xCB67, 0xCB68, 0xCB69, 0xCB6A, + 0xCB6B, 0xCB6C, 0xCB6D, 0xCB6E, 0xCB6F, 0xCB70, 0xCB71, 0xCB72, 0xCB73, + 0xCB74, 0xCB75, 0xCB76, 0xCB77, 0xCB7A, 0xCB7B, 0xCB7C, 0xCB7D, 0xCB7E, + 0xCB7F, 0xCB80, 0xCB81, 0xCB82, 0xCB83, 0xCB84, 0xCB85, 0xCB86, 0xCB87, + 0xCB88, 0xCB89, 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D, 0xCB8E, 0xCB8F, 0xCB90, + 0xCB91, 0xCB92, 0xCB93, 0xCB94, 0xCB95, 0xCB96, 0xCB97, 0xCB98, 0xCB99, + 0xCB9A, 0xCB9B, 0xCB9D, 0xCB9E, 0xCB9F, 0xCBA0, 0xCBA1, 0xCBA2, 0xCBA3, + 0xCBA4, 0xCBA5, 0xCBA6, 0xCBA7, 0xCBA8, 0xCBA9, 0xCBAA, 0xCBAB, 0xCBAC, + 0xCBAD, 0xCBAE, 0xCBAF, 0xCBB0, 0xCBB1, 0xCBB2, 0xCBB3, 0xCBB4, 0xCBB5, + 0xCBB6, 0xCBB7, 0xCBB9, 0xCBBA, 0xCBBB, 0xCBBC, 0xCBBD, 0xCBBE, 0xCBBF, + 0xCBC0, 0xCBC1, 0xCBC2, 0xCBC3, 0xCBC4, 0xCBC5, 0xCBC6, 0xCBC7, 0xCBC8, + 0xCBC9, 0xCBCA, 0xCBCB, 0xCBCC, 0xCBCD, 0xCBCE, 0xCBCF, 0xCBD0, 0xCBD1, + 0xCBD2, 0xCBD3, 0xCBD5, 0xCBD6, 0xCBD7, 0xCBD8, 0xCBD9, 0xCBDA, 0xCBDB, + 0xCBDC, 0xCBDD, 0xCBDE, 0xCBDF, 0xCBE0, 0xCBE1, 0xCBE2, 0xCBE3, 0xCBE5, + 0xCBE6, 0xCBE8, 0xCBEA, 0xCBEB, 0xCBEC, 0xCBED, 0xCBEE, 0xCBEF, 0xCBF0, + 0xCBF1, 0xCBF2, 0xCBF3, 0xCBF4, 0xCBF5, 0xCBF6, 0xCBF7, 0xCBF8, 0xCBF9, + 0xCBFA, 0xCBFB, 0xCBFC, 0xCBFD, 0xCBFE, 0xCBFF, 0xCC00, 0xCC01, 0xCC02, + 0xCC03, 0xCC04, 0xCC05, 0xCC06, 0xCC07, 0xCC08, 0xCC09, 0xCC0A, 0xCC0B, + 0xCC0E, 0xCC0F, 0xCC11, 0xCC12, 0xCC13, 0xCC15, 0xCC16, 0xCC17, 0xCC18, + 0xCC19, 0xCC1A, 0xCC1B, 0xCC1E, 0xCC1F, 0xCC20, 0xCC23, 0xCC24, 0xCC25, + 0xCC26, 0xCC2A, 0xCC2B, 0xCC2D, 0xCC2F, 0xCC31, 0xCC32, 0xCC33, 0xCC34, + 0xCC35, 0xCC36, 0xCC37, 0xCC3A, 0xCC3F, 0xCC40, 0xCC41, 0xCC42, 0xCC43, + 0xCC46, 0xCC47, 0xCC49, 0xCC4A, 0xCC4B, 0xCC4D, 0xCC4E, 0xCC4F, 0xCC50, + 0xCC51, 0xCC52, 0xCC53, 0xCC56, 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, + 0xCC5F, 0xCC61, 0xCC62, 0xCC63, 0xCC65, 0xCC67, 0xCC69, 0xCC6A, 0xCC6B, + 0xCC6C, 0xCC6D, 0xCC6E, 0xCC6F, 0xCC71, 0xCC72, 0xCC73, 0xCC74, 0xCC76, + 0xCC77, 0xCC78, 0xCC79, 0xCC7A, 0xCC7B, 0xCC7C, 0xCC7D, 0xCC7E, 0xCC7F, + 0xCC80, 0xCC81, 0xCC82, 0xCC83, 0xCC84, 0xCC85, 0xCC86, 0xCC87, 0xCC88, + 0xCC89, 0xCC8A, 0xCC8B, 0xCC8C, 0xCC8D, 0xCC8E, 0xCC8F, 0xCC90, 0xCC91, + 0xCC92, 0xCC93, 0xCC94, 0xCC95, 0xCC96, 0xCC97, 0xCC9A, 0xCC9B, 0xCC9D, + 0xCC9E, 0xCC9F, 0xCCA1, 0xCCA2, 0xCCA3, 0xCCA4, 0xCCA5, 0xCCA6, 0xCCA7, + 0xCCAA, 0xCCAE, 0xCCAF, 0xCCB0, 0xCCB1, 0xCCB2, 0xCCB3, 0xCCB6, 0xCCB7, + 0xCCB9, 0xCCBA, 0xCCBB, 0xCCBD, 0xCCBE, 0xCCBF, 0xCCC0, 0xCCC1, 0xCCC2, + 0xCCC3, 0xCCC6, 0xCCC8, 0xCCCA, 0xCCCB, 0xCCCC, 0xCCCD, 0xCCCE, 0xCCCF, + 0xCCD1, 0xCCD2, 0xCCD3, 0xCCD5, 0xCCD6, 0xCCD7, 0xCCD8, 0xCCD9, 0xCCDA, + 0xCCDB, 0xCCDC, 0xCCDD, 0xCCDE, 0xCCDF, 0xCCE0, 0xCCE1, 0xCCE2, 0xCCE3, + 0xCCE5, 0xCCE6, 0xCCE7, 0xCCE8, 0xCCE9, 0xCCEA, 0xCCEB, 0xCCED, 0xCCEE, + 0xCCEF, 0xCCF1, 0xCCF2, 0xCCF3, 0xCCF4, 0xCCF5, 0xCCF6, 0xCCF7, 0xCCF8, + 0xCCF9, 0xCCFA, 0xCCFB, 0xCCFC, 0xCCFD, 0xCCFE, 0xCCFF, 0xCD00, 0xCD02, + 0xCD03, 0xCD04, 0xCD05, 0xCD06, 0xCD07, 0xCD0A, 0xCD0B, 0xCD0D, 0xCD0E, + 0xCD0F, 0xCD11, 0xCD12, 0xCD13, 0xCD14, 0xCD15, 0xCD16, 0xCD17, 0xCD1A, + 0xCD1C, 0xCD1E, 0xCD1F, 0xCD20, 0xCD21, 0xCD22, 0xCD23, 0xCD25, 0xCD26, + 0xCD27, 0xCD29, 0xCD2A, 0xCD2B, 0xCD2D, 0xCD2E, 0xCD2F, 0xCD30, 0xCD31, + 0xCD32, 0xCD33, 0xCD34, 0xCD35, 0xCD36, 0xCD37, 0xCD38, 0xCD3A, 0xCD3B, + 0xCD3C, 0xCD3D, 0xCD3E, 0xCD3F, 0xCD40, 0xCD41, 0xCD42, 0xCD43, 0xCD44, + 0xCD45, 0xCD46, 0xCD47, 0xCD48, 0xCD49, 0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, + 0xCD4E, 0xCD4F, 0xCD50, 0xCD51, 0xCD52, 0xCD53, 0xCD54, 0xCD55, 0xCD56, + 0xCD57, 0xCD58, 0xCD59, 0xCD5A, 0xCD5B, 0xCD5D, 0xCD5E, 0xCD5F, 0xCD61, + 0xCD62, 0xCD63, 0xCD65, 0xCD66, 0xCD67, 0xCD68, 0xCD69, 0xCD6A, 0xCD6B, + 0xCD6E, 0xCD70, 0xCD72, 0xCD73, 0xCD74, 0xCD75, 0xCD76, 0xCD77, 0xCD79, + 0xCD7A, 0xCD7B, 0xCD7C, 0xCD7D, 0xCD7E, 0xCD7F, 0xCD80, 0xCD81, 0xCD82, + 0xCD83, 0xCD84, 0xCD85, 0xCD86, 0xCD87, 0xCD89, 0xCD8A, 0xCD8B, 0xCD8C, + 0xCD8D, 0xCD8E, 0xCD8F, 0xCD90, 0xCD91, 0xCD92, 0xCD93, 0xCD96, 0xCD97, + 0xCD99, 0xCD9A, 0xCD9B, 0xCD9D, 0xCD9E, 0xCD9F, 0xCDA0, 0xCDA1, 0xCDA2, + 0xCDA3, 0xCDA6, 0xCDA8, 0xCDAA, 0xCDAB, 0xCDAC, 0xCDAD, 0xCDAE, 0xCDAF, + 0xCDB1, 0xCDB2, 0xCDB3, 0xCDB4, 0xCDB5, 0xCDB6, 0xCDB7, 0xCDB8, 0xCDB9, + 0xCDBA, 0xCDBB, 0xCDBC, 0xCDBD, 0xCDBE, 0xCDBF, 0xCDC0, 0xCDC1, 0xCDC2, + 0xCDC3, 0xCDC5, 0xCDC6, 0xCDC7, 0xCDC8, 0xCDC9, 0xCDCA, 0xCDCB, 0xCDCD, + 0xCDCE, 0xCDCF, 0xCDD1, 0xCDD2, 0xCDD3, 0xCDD4, 0xCDD5, 0xCDD6, 0xCDD7, + 0xCDD8, 0xCDD9, 0xCDDA, 0xCDDB, 0xCDDC, 0xCDDD, 0xCDDE, 0xCDDF, 0xCDE0, + 0xCDE1, 0xCDE2, 0xCDE3, 0xCDE4, 0xCDE5, 0xCDE6, 0xCDE7, 0xCDE9, 0xCDEA, + 0xCDEB, 0xCDED, 0xCDEE, 0xCDEF, 0xCDF1, 0xCDF2, 0xCDF3, 0xCDF4, 0xCDF5, + 0xCDF6, 0xCDF7, 0xCDFA, 0xCDFC, 0xCDFE, 0xCDFF, 0xCE00, 0xCE01, 0xCE02, + 0xCE03, 0xCE05, 0xCE06, 0xCE07, 0xCE09, 0xCE0A, 0xCE0B, 0xCE0D, 0xCE0E, + 0xCE0F, 0xCE10, 0xCE11, 0xCE12, 0xCE13, 0xCE15, 0xCE16, 0xCE17, 0xCE18, + 0xCE1A, 0xCE1B, 0xCE1C, 0xCE1D, 0xCE1E, 0xCE1F, 0xCE22, 0xCE23, 0xCE25, + 0xCE26, 0xCE27, 0xCE29, 0xCE2A, 0xCE2B, 0xCE2C, 0xCE2D, 0xCE2E, 0xCE2F, + 0xCE32, 0xCE34, 0xCE36, 0xCE37, 0xCE38, 0xCE39, 0xCE3A, 0xCE3B, 0xCE3C, + 0xCE3D, 0xCE3E, 0xCE3F, 0xCE40, 0xCE41, 0xCE42, 0xCE43, 0xCE44, 0xCE45, + 0xCE46, 0xCE47, 0xCE48, 0xCE49, 0xCE4A, 0xCE4B, 0xCE4C, 0xCE4D, 0xCE4E, + 0xCE4F, 0xCE50, 0xCE51, 0xCE52, 0xCE53, 0xCE54, 0xCE55, 0xCE56, 0xCE57, + 0xCE5A, 0xCE5B, 0xCE5D, 0xCE5E, 0xCE62, 0xCE63, 0xCE64, 0xCE65, 0xCE66, + 0xCE67, 0xCE6A, 0xCE6C, 0xCE6E, 0xCE6F, 0xCE70, 0xCE71, 0xCE72, 0xCE73, + 0xCE76, 0xCE77, 0xCE79, 0xCE7A, 0xCE7B, 0xCE7D, 0xCE7E, 0xCE7F, 0xCE80, + 0xCE81, 0xCE82, 0xCE83, 0xCE86, 0xCE88, 0xCE8A, 0xCE8B, 0xCE8C, 0xCE8D, + 0xCE8E, 0xCE8F, 0xCE92, 0xCE93, 0xCE95, 0xCE96, 0xCE97, 0xCE99, 0xCE9A, + 0xCE9B, 0xCE9C, 0xCE9D, 0xCE9E, 0xCE9F, 0xCEA2, 0xCEA6, 0xCEA7, 0xCEA8, + 0xCEA9, 0xCEAA, 0xCEAB, 0xCEAE, 0xCEAF, 0xCEB0, 0xCEB1, 0xCEB2, 0xCEB3, + 0xCEB4, 0xCEB5, 0xCEB6, 0xCEB7, 0xCEB8, 0xCEB9, 0xCEBA, 0xCEBB, 0xCEBC, + 0xCEBD, 0xCEBE, 0xCEBF, 0xCEC0, 0xCEC2, 0xCEC3, 0xCEC4, 0xCEC5, 0xCEC6, + 0xCEC7, 0xCEC8, 0xCEC9, 0xCECA, 0xCECB, 0xCECC, 0xCECD, 0xCECE, 0xCECF, + 0xCED0, 0xCED1, 0xCED2, 0xCED3, 0xCED4, 0xCED5, 0xCED6, 0xCED7, 0xCED8, + 0xCED9, 0xCEDA, 0xCEDB, 0xCEDC, 0xCEDD, 0xCEDE, 0xCEDF, 0xCEE0, 0xCEE1, + 0xCEE2, 0xCEE3, 0xCEE6, 0xCEE7, 0xCEE9, 0xCEEA, 0xCEED, 0xCEEE, 0xCEEF, + 0xCEF0, 0xCEF1, 0xCEF2, 0xCEF3, 0xCEF6, 0xCEFA, 0xCEFB, 0xCEFC, 0xCEFD, + 0xCEFE, 0xCEFF, 0xCF02, 0xCF03, 0xCF05, 0xCF06, 0xCF07, 0xCF09, 0xCF0A, + 0xCF0B, 0xCF0C, 0xCF0D, 0xCF0E, 0xCF0F, 0xCF12, 0xCF14, 0xCF16, 0xCF17, + 0xCF18, 0xCF19, 0xCF1A, 0xCF1B, 0xCF1D, 0xCF1E, 0xCF1F, 0xCF21, 0xCF22, + 0xCF23, 0xCF25, 0xCF26, 0xCF27, 0xCF28, 0xCF29, 0xCF2A, 0xCF2B, 0xCF2E, + 0xCF32, 0xCF33, 0xCF34, 0xCF35, 0xCF36, 0xCF37, 0xCF39, 0xCF3A, 0xCF3B, + 0xCF3C, 0xCF3D, 0xCF3E, 0xCF3F, 0xCF40, 0xCF41, 0xCF42, 0xCF43, 0xCF44, + 0xCF45, 0xCF46, 0xCF47, 0xCF48, 0xCF49, 0xCF4A, 0xCF4B, 0xCF4C, 0xCF4D, + 0xCF4E, 0xCF4F, 0xCF50, 0xCF51, 0xCF52, 0xCF53, 0xCF56, 0xCF57, 0xCF59, + 0xCF5A, 0xCF5B, 0xCF5D, 0xCF5E, 0xCF5F, 0xCF60, 0xCF61, 0xCF62, 0xCF63, + 0xCF66, 0xCF68, 0xCF6A, 0xCF6B, 0xCF6C, 0xCF6D, 0xCF6E, 0xCF6F, 0xCF72, + 0xCF73, 0xCF75, 0xCF76, 0xCF77, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, + 0xCF7E, 0xCF7F, 0xCF81, 0xCF82, 0xCF83, 0xCF84, 0xCF86, 0xCF87, 0xCF88, + 0xCF89, 0xCF8A, 0xCF8B, 0xCF8D, 0xCF8E, 0xCF8F, 0xCF90, 0xCF91, 0xCF92, + 0xCF93, 0xCF94, 0xCF95, 0xCF96, 0xCF97, 0xCF98, 0xCF99, 0xCF9A, 0xCF9B, + 0xCF9C, 0xCF9D, 0xCF9E, 0xCF9F, 0xCFA0, 0xCFA2, 0xCFA3, 0xCFA4, 0xCFA5, + 0xCFA6, 0xCFA7, 0xCFA9, 0xCFAA, 0xCFAB, 0xCFAC, 0xCFAD, 0xCFAE, 0xCFAF, + 0xCFB1, 0xCFB2, 0xCFB3, 0xCFB4, 0xCFB5, 0xCFB6, 0xCFB7, 0xCFB8, 0xCFB9, + 0xCFBA, 0xCFBB, 0xCFBC, 0xCFBD, 0xCFBE, 0xCFBF, 0xCFC0, 0xCFC1, 0xCFC2, + 0xCFC3, 0xCFC5, 0xCFC6, 0xCFC7, 0xCFC8, 0xCFC9, 0xCFCA, 0xCFCB, 0xCFCC, + 0xCFCD, 0xCFCE, 0xCFCF, 0xCFD0, 0xCFD1, 0xCFD2, 0xCFD3, 0xCFD4, 0xCFD5, + 0xCFD6, 0xCFD7, 0xCFD8, 0xCFD9, 0xCFDA, 0xCFDB, 0xCFDC, 0xCFDD, 0xCFDE, + 0xCFDF, 0xCFE2, 0xCFE3, 0xCFE5, 0xCFE6, 0xCFE7, 0xCFE9, 0xCFEA, 0xCFEB, + 0xCFEC, 0xCFED, 0xCFEE, 0xCFEF, 0xCFF2, 0xCFF4, 0xCFF6, 0xCFF7, 0xCFF8, + 0xCFF9, 0xCFFA, 0xCFFB, 0xCFFD, 0xCFFE, 0xCFFF, 0xD001, 0xD002, 0xD003, + 0xD005, 0xD006, 0xD007, 0xD008, 0xD009, 0xD00A, 0xD00B, 0xD00C, 0xD00D, + 0xD00E, 0xD00F, 0xD010, 0xD012, 0xD013, 0xD014, 0xD015, 0xD016, 0xD017, + 0xD019, 0xD01A, 0xD01B, 0xD01C, 0xD01D, 0xD01E, 0xD01F, 0xD020, 0xD021, + 0xD022, 0xD023, 0xD024, 0xD025, 0xD026, 0xD027, 0xD028, 0xD029, 0xD02A, + 0xD02B, 0xD02C, 0xD02E, 0xD02F, 0xD030, 0xD031, 0xD032, 0xD033, 0xD036, + 0xD037, 0xD039, 0xD03A, 0xD03B, 0xD03D, 0xD03E, 0xD03F, 0xD040, 0xD041, + 0xD042, 0xD043, 0xD046, 0xD048, 0xD04A, 0xD04B, 0xD04C, 0xD04D, 0xD04E, + 0xD04F, 0xD051, 0xD052, 0xD053, 0xD055, 0xD056, 0xD057, 0xD059, 0xD05A, + 0xD05B, 0xD05C, 0xD05D, 0xD05E, 0xD05F, 0xD061, 0xD062, 0xD063, 0xD064, + 0xD065, 0xD066, 0xD067, 0xD068, 0xD069, 0xD06A, 0xD06B, 0xD06E, 0xD06F, + 0xD071, 0xD072, 0xD073, 0xD075, 0xD076, 0xD077, 0xD078, 0xD079, 0xD07A, + 0xD07B, 0xD07E, 0xD07F, 0xD080, 0xD082, 0xD083, 0xD084, 0xD085, 0xD086, + 0xD087, 0xD088, 0xD089, 0xD08A, 0xD08B, 0xD08C, 0xD08D, 0xD08E, 0xD08F, + 0xD090, 0xD091, 0xD092, 0xD093, 0xD094, 0xD095, 0xD096, 0xD097, 0xD098, + 0xD099, 0xD09A, 0xD09B, 0xD09C, 0xD09D, 0xD09E, 0xD09F, 0xD0A0, 0xD0A1, + 0xD0A2, 0xD0A3, 0xD0A6, 0xD0A7, 0xD0A9, 0xD0AA, 0xD0AB, 0xD0AD, 0xD0AE, + 0xD0AF, 0xD0B0, 0xD0B1, 0xD0B2, 0xD0B3, 0xD0B6, 0xD0B8, 0xD0BA, 0xD0BB, + 0xD0BC, 0xD0BD, 0xD0BE, 0xD0BF, 0xD0C2, 0xD0C3, 0xD0C5, 0xD0C6, 0xD0C7, + 0xD0CA, 0xD0CB, 0xD0CC, 0xD0CD, 0xD0CE, 0xD0CF, 0xD0D2, 0xD0D6, 0xD0D7, + 0xD0D8, 0xD0D9, 0xD0DA, 0xD0DB, 0xD0DE, 0xD0DF, 0xD0E1, 0xD0E2, 0xD0E3, + 0xD0E5, 0xD0E6, 0xD0E7, 0xD0E8, 0xD0E9, 0xD0EA, 0xD0EB, 0xD0EE, 0xD0F2, + 0xD0F3, 0xD0F4, 0xD0F5, 0xD0F6, 0xD0F7, 0xD0F9, 0xD0FA, 0xD0FB, 0xD0FC, + 0xD0FD, 0xD0FE, 0xD0FF, 0xD100, 0xD101, 0xD102, 0xD103, 0xD104, 0xD105, + 0xD106, 0xD107, 0xD108, 0xD109, 0xD10A, 0xD10B, 0xD10C, 0xD10E, 0xD10F, + 0xD110, 0xD111, 0xD112, 0xD113, 0xD114, 0xD115, 0xD116, 0xD117, 0xD118, + 0xD119, 0xD11A, 0xD11B, 0xD11C, 0xD11D, 0xD11E, 0xD11F, 0xD120, 0xD121, + 0xD122, 0xD123, 0xD124, 0xD125, 0xD126, 0xD127, 0xD128, 0xD129, 0xD12A, + 0xD12B, 0xD12C, 0xD12D, 0xD12E, 0xD12F, 0xD132, 0xD133, 0xD135, 0xD136, + 0xD137, 0xD139, 0xD13B, 0xD13C, 0xD13D, 0xD13E, 0xD13F, 0xD142, 0xD146, + 0xD147, 0xD148, 0xD149, 0xD14A, 0xD14B, 0xD14E, 0xD14F, 0xD151, 0xD152, + 0xD153, 0xD155, 0xD156, 0xD157, 0xD158, 0xD159, 0xD15A, 0xD15B, 0xD15E, + 0xD160, 0xD162, 0xD163, 0xD164, 0xD165, 0xD166, 0xD167, 0xD169, 0xD16A, + 0xD16B, 0xD16D, 0xD16E, 0xD16F, 0xD170, 0xD171, 0xD172, 0xD173, 0xD174, + 0xD175, 0xD176, 0xD177, 0xD178, 0xD179, 0xD17A, 0xD17B, 0xD17D, 0xD17E, + 0xD17F, 0xD180, 0xD181, 0xD182, 0xD183, 0xD185, 0xD186, 0xD187, 0xD189, + 0xD18A, 0xD18B, 0xD18C, 0xD18D, 0xD18E, 0xD18F, 0xD190, 0xD191, 0xD192, + 0xD193, 0xD194, 0xD195, 0xD196, 0xD197, 0xD198, 0xD199, 0xD19A, 0xD19B, + 0xD19C, 0xD19D, 0xD19E, 0xD19F, 0xD1A2, 0xD1A3, 0xD1A5, 0xD1A6, 0xD1A7, + 0xD1A9, 0xD1AA, 0xD1AB, 0xD1AC, 0xD1AD, 0xD1AE, 0xD1AF, 0xD1B2, 0xD1B4, + 0xD1B6, 0xD1B7, 0xD1B8, 0xD1B9, 0xD1BB, 0xD1BD, 0xD1BE, 0xD1BF, 0xD1C1, + 0xD1C2, 0xD1C3, 0xD1C4, 0xD1C5, 0xD1C6, 0xD1C7, 0xD1C8, 0xD1C9, 0xD1CA, + 0xD1CB, 0xD1CC, 0xD1CD, 0xD1CE, 0xD1CF, 0xD1D0, 0xD1D1, 0xD1D2, 0xD1D3, + 0xD1D4, 0xD1D5, 0xD1D6, 0xD1D7, 0xD1D9, 0xD1DA, 0xD1DB, 0xD1DC, 0xD1DD, + 0xD1DE, 0xD1DF, 0xD1E0, 0xD1E1, 0xD1E2, 0xD1E3, 0xD1E4, 0xD1E5, 0xD1E6, + 0xD1E7, 0xD1E8, 0xD1E9, 0xD1EA, 0xD1EB, 0xD1EC, 0xD1ED, 0xD1EE, 0xD1EF, + 0xD1F0, 0xD1F1, 0xD1F2, 0xD1F3, 0xD1F5, 0xD1F6, 0xD1F7, 0xD1F9, 0xD1FA, + 0xD1FB, 0xD1FC, 0xD1FD, 0xD1FE, 0xD1FF, 0xD200, 0xD201, 0xD202, 0xD203, + 0xD204, 0xD205, 0xD206, 0xD208, 0xD20A, 0xD20B, 0xD20C, 0xD20D, 0xD20E, + 0xD20F, 0xD211, 0xD212, 0xD213, 0xD214, 0xD215, 0xD216, 0xD217, 0xD218, + 0xD219, 0xD21A, 0xD21B, 0xD21C, 0xD21D, 0xD21E, 0xD21F, 0xD220, 0xD221, + 0xD222, 0xD223, 0xD224, 0xD225, 0xD226, 0xD227, 0xD228, 0xD229, 0xD22A, + 0xD22B, 0xD22E, 0xD22F, 0xD231, 0xD232, 0xD233, 0xD235, 0xD236, 0xD237, + 0xD238, 0xD239, 0xD23A, 0xD23B, 0xD23E, 0xD240, 0xD242, 0xD243, 0xD244, + 0xD245, 0xD246, 0xD247, 0xD249, 0xD24A, 0xD24B, 0xD24C, 0xD24D, 0xD24E, + 0xD24F, 0xD250, 0xD251, 0xD252, 0xD253, 0xD254, 0xD255, 0xD256, 0xD257, + 0xD258, 0xD259, 0xD25A, 0xD25B, 0xD25D, 0xD25E, 0xD25F, 0xD260, 0xD261, + 0xD262, 0xD263, 0xD265, 0xD266, 0xD267, 0xD268, 0xD269, 0xD26A, 0xD26B, + 0xD26C, 0xD26D, 0xD26E, 0xD26F, 0xD270, 0xD271, 0xD272, 0xD273, 0xD274, + 0xD275, 0xD276, 0xD277, 0xD278, 0xD279, 0xD27A, 0xD27B, 0xD27C, 0xD27D, + 0xD27E, 0xD27F, 0xD282, 0xD283, 0xD285, 0xD286, 0xD287, 0xD289, 0xD28A, + 0xD28B, 0xD28C, 0xD28D, 0xD28E, 0xD28F, 0xD292, 0xD293, 0xD294, 0xD296, + 0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, 0xD29D, 0xD29E, 0xD29F, 0xD2A1, + 0xD2A2, 0xD2A3, 0xD2A5, 0xD2A6, 0xD2A7, 0xD2A8, 0xD2A9, 0xD2AA, 0xD2AB, + 0xD2AD, 0xD2AE, 0xD2AF, 0xD2B0, 0xD2B2, 0xD2B3, 0xD2B4, 0xD2B5, 0xD2B6, + 0xD2B7, 0xD2BA, 0xD2BB, 0xD2BD, 0xD2BE, 0xD2C1, 0xD2C3, 0xD2C4, 0xD2C5, + 0xD2C6, 0xD2C7, 0xD2CA, 0xD2CC, 0xD2CD, 0xD2CE, 0xD2CF, 0xD2D0, 0xD2D1, + 0xD2D2, 0xD2D3, 0xD2D5, 0xD2D6, 0xD2D7, 0xD2D9, 0xD2DA, 0xD2DB, 0xD2DD, + 0xD2DE, 0xD2DF, 0xD2E0, 0xD2E1, 0xD2E2, 0xD2E3, 0xD2E6, 0xD2E7, 0xD2E8, + 0xD2E9, 0xD2EA, 0xD2EB, 0xD2EC, 0xD2ED, 0xD2EE, 0xD2EF, 0xD2F2, 0xD2F3, + 0xD2F5, 0xD2F6, 0xD2F7, 0xD2F9, 0xD2FA, 0xD2FB, 0xD2FC, 0xD2FD, 0xD2FE, + 0xD2FF, 0xD302, 0xD304, 0xD306, 0xD307, 0xD308, 0xD309, 0xD30A, 0xD30B, + 0xD30F, 0xD311, 0xD312, 0xD313, 0xD315, 0xD317, 0xD318, 0xD319, 0xD31A, + 0xD31B, 0xD31E, 0xD322, 0xD323, 0xD324, 0xD326, 0xD327, 0xD32A, 0xD32B, + 0xD32D, 0xD32E, 0xD32F, 0xD331, 0xD332, 0xD333, 0xD334, 0xD335, 0xD336, + 0xD337, 0xD33A, 0xD33E, 0xD33F, 0xD340, 0xD341, 0xD342, 0xD343, 0xD346, + 0xD347, 0xD348, 0xD349, 0xD34A, 0xD34B, 0xD34C, 0xD34D, 0xD34E, 0xD34F, + 0xD350, 0xD351, 0xD352, 0xD353, 0xD354, 0xD355, 0xD356, 0xD357, 0xD358, + 0xD359, 0xD35A, 0xD35B, 0xD35C, 0xD35D, 0xD35E, 0xD35F, 0xD360, 0xD361, + 0xD362, 0xD363, 0xD364, 0xD365, 0xD366, 0xD367, 0xD368, 0xD369, 0xD36A, + 0xD36B, 0xD36C, 0xD36D, 0xD36E, 0xD36F, 0xD370, 0xD371, 0xD372, 0xD373, + 0xD374, 0xD375, 0xD376, 0xD377, 0xD378, 0xD379, 0xD37A, 0xD37B, 0xD37E, + 0xD37F, 0xD381, 0xD382, 0xD383, 0xD385, 0xD386, 0xD387, 0xD388, 0xD389, + 0xD38A, 0xD38B, 0xD38E, 0xD392, 0xD393, 0xD394, 0xD395, 0xD396, 0xD397, + 0xD39A, 0xD39B, 0xD39D, 0xD39E, 0xD39F, 0xD3A1, 0xD3A2, 0xD3A3, 0xD3A4, + 0xD3A5, 0xD3A6, 0xD3A7, 0xD3AA, 0xD3AC, 0xD3AE, 0xD3AF, 0xD3B0, 0xD3B1, + 0xD3B2, 0xD3B3, 0xD3B5, 0xD3B6, 0xD3B7, 0xD3B9, 0xD3BA, 0xD3BB, 0xD3BD, + 0xD3BE, 0xD3BF, 0xD3C0, 0xD3C1, 0xD3C2, 0xD3C3, 0xD3C6, 0xD3C7, 0xD3CA, + 0xD3CB, 0xD3CC, 0xD3CD, 0xD3CE, 0xD3CF, 0xD3D1, 0xD3D2, 0xD3D3, 0xD3D4, + 0xD3D5, 0xD3D6, 0xD3D7, 0xD3D9, 0xD3DA, 0xD3DB, 0xD3DC, 0xD3DD, 0xD3DE, + 0xD3DF, 0xD3E0, 0xD3E2, 0xD3E4, 0xD3E5, 0xD3E6, 0xD3E7, 0xD3E8, 0xD3E9, + 0xD3EA, 0xD3EB, 0xD3EE, 0xD3EF, 0xD3F1, 0xD3F2, 0xD3F3, 0xD3F5, 0xD3F6, + 0xD3F7, 0xD3F8, 0xD3F9, 0xD3FA, 0xD3FB, 0xD3FE, 0xD400, 0xD402, 0xD403, + 0xD404, 0xD405, 0xD406, 0xD407, 0xD409, 0xD40A, 0xD40B, 0xD40C, 0xD40D, + 0xD40E, 0xD40F, 0xD410, 0xD411, 0xD412, 0xD413, 0xD414, 0xD415, 0xD416, + 0xD417, 0xD418, 0xD419, 0xD41A, 0xD41B, 0xD41C, 0xD41E, 0xD41F, 0xD420, + 0xD421, 0xD422, 0xD423, 0xD424, 0xD425, 0xD426, 0xD427, 0xD428, 0xD429, + 0xD42A, 0xD42B, 0xD42C, 0xD42D, 0xD42E, 0xD42F, 0xD430, 0xD431, 0xD432, + 0xD433, 0xD434, 0xD435, 0xD436, 0xD437, 0xD438, 0xD439, 0xD43A, 0xD43B, + 0xD43C, 0xD43D, 0xD43E, 0xD43F, 0xD441, 0xD442, 0xD443, 0xD445, 0xD446, + 0xD447, 0xD448, 0xD449, 0xD44A, 0xD44B, 0xD44C, 0xD44D, 0xD44E, 0xD44F, + 0xD450, 0xD451, 0xD452, 0xD453, 0xD454, 0xD455, 0xD456, 0xD457, 0xD458, + 0xD459, 0xD45A, 0xD45B, 0xD45D, 0xD45E, 0xD45F, 0xD461, 0xD462, 0xD463, + 0xD465, 0xD466, 0xD467, 0xD468, 0xD469, 0xD46A, 0xD46B, 0xD46C, 0xD46E, + 0xD470, 0xD471, 0xD472, 0xD473, 0xD474, 0xD475, 0xD476, 0xD477, 0xD47A, + 0xD47B, 0xD47D, 0xD47E, 0xD481, 0xD483, 0xD484, 0xD485, 0xD486, 0xD487, + 0xD48A, 0xD48C, 0xD48E, 0xD48F, 0xD490, 0xD491, 0xD492, 0xD493, 0xD495, + 0xD496, 0xD497, 0xD498, 0xD499, 0xD49A, 0xD49B, 0xD49C, 0xD49D, 0xD49E, + 0xD49F, 0xD4A0, 0xD4A1, 0xD4A2, 0xD4A3, 0xD4A4, 0xD4A5, 0xD4A6, 0xD4A7, + 0xD4A8, 0xD4AA, 0xD4AB, 0xD4AC, 0xD4AD, 0xD4AE, 0xD4AF, 0xD4B0, 0xD4B1, + 0xD4B2, 0xD4B3, 0xD4B4, 0xD4B5, 0xD4B6, 0xD4B7, 0xD4B8, 0xD4B9, 0xD4BA, + 0xD4BB, 0xD4BC, 0xD4BD, 0xD4BE, 0xD4BF, 0xD4C0, 0xD4C1, 0xD4C2, 0xD4C3, + 0xD4C4, 0xD4C5, 0xD4C6, 0xD4C7, 0xD4C8, 0xD4C9, 0xD4CA, 0xD4CB, 0xD4CD, + 0xD4CE, 0xD4CF, 0xD4D1, 0xD4D2, 0xD4D3, 0xD4D5, 0xD4D6, 0xD4D7, 0xD4D8, + 0xD4D9, 0xD4DA, 0xD4DB, 0xD4DD, 0xD4DE, 0xD4E0, 0xD4E1, 0xD4E2, 0xD4E3, + 0xD4E4, 0xD4E5, 0xD4E6, 0xD4E7, 0xD4E9, 0xD4EA, 0xD4EB, 0xD4ED, 0xD4EE, + 0xD4EF, 0xD4F1, 0xD4F2, 0xD4F3, 0xD4F4, 0xD4F5, 0xD4F6, 0xD4F7, 0xD4F9, + 0xD4FA, 0xD4FC, 0xD4FE, 0xD4FF, 0xD500, 0xD501, 0xD502, 0xD503, 0xD505, + 0xD506, 0xD507, 0xD509, 0xD50A, 0xD50B, 0xD50D, 0xD50E, 0xD50F, 0xD510, + 0xD511, 0xD512, 0xD513, 0xD516, 0xD518, 0xD519, 0xD51A, 0xD51B, 0xD51C, + 0xD51D, 0xD51E, 0xD51F, 0xD520, 0xD521, 0xD522, 0xD523, 0xD524, 0xD525, + 0xD526, 0xD527, 0xD528, 0xD529, 0xD52A, 0xD52B, 0xD52C, 0xD52D, 0xD52E, + 0xD52F, 0xD530, 0xD531, 0xD532, 0xD533, 0xD534, 0xD535, 0xD536, 0xD537, + 0xD538, 0xD539, 0xD53A, 0xD53B, 0xD53E, 0xD53F, 0xD541, 0xD542, 0xD543, + 0xD545, 0xD546, 0xD547, 0xD548, 0xD549, 0xD54A, 0xD54B, 0xD54E, 0xD550, + 0xD552, 0xD553, 0xD554, 0xD555, 0xD556, 0xD557, 0xD55A, 0xD55B, 0xD55D, + 0xD55E, 0xD55F, 0xD561, 0xD562, 0xD563, 0xD564, 0xD566, 0xD567, 0xD56A, + 0xD56C, 0xD56E, 0xD56F, 0xD570, 0xD571, 0xD572, 0xD573, 0xD576, 0xD577, + 0xD579, 0xD57A, 0xD57B, 0xD57D, 0xD57E, 0xD57F, 0xD580, 0xD581, 0xD582, + 0xD583, 0xD586, 0xD58A, 0xD58B, 0xD58C, 0xD58D, 0xD58E, 0xD58F, 0xD591, + 0xD592, 0xD593, 0xD594, 0xD595, 0xD596, 0xD597, 0xD598, 0xD599, 0xD59A, + 0xD59B, 0xD59C, 0xD59D, 0xD59E, 0xD59F, 0xD5A0, 0xD5A1, 0xD5A2, 0xD5A3, + 0xD5A4, 0xD5A6, 0xD5A7, 0xD5A8, 0xD5A9, 0xD5AA, 0xD5AB, 0xD5AC, 0xD5AD, + 0xD5AE, 0xD5AF, 0xD5B0, 0xD5B1, 0xD5B2, 0xD5B3, 0xD5B4, 0xD5B5, 0xD5B6, + 0xD5B7, 0xD5B8, 0xD5B9, 0xD5BA, 0xD5BB, 0xD5BC, 0xD5BD, 0xD5BE, 0xD5BF, + 0xD5C0, 0xD5C1, 0xD5C2, 0xD5C3, 0xD5C4, 0xD5C5, 0xD5C6, 0xD5C7, 0xD5CA, + 0xD5CB, 0xD5CD, 0xD5CE, 0xD5CF, 0xD5D1, 0xD5D3, 0xD5D4, 0xD5D5, 0xD5D6, + 0xD5D7, 0xD5DA, 0xD5DC, 0xD5DE, 0xD5DF, 0xD5E0, 0xD5E1, 0xD5E2, 0xD5E3, + 0xD5E6, 0xD5E7, 0xD5E9, 0xD5EA, 0xD5EB, 0xD5ED, 0xD5EE, 0xD5EF, 0xD5F0, + 0xD5F1, 0xD5F2, 0xD5F3, 0xD5F6, 0xD5F8, 0xD5FA, 0xD5FB, 0xD5FC, 0xD5FD, + 0xD5FE, 0xD5FF, 0xD602, 0xD603, 0xD605, 0xD606, 0xD607, 0xD609, 0xD60A, + 0xD60B, 0xD60C, 0xD60D, 0xD60E, 0xD60F, 0xD612, 0xD616, 0xD617, 0xD618, + 0xD619, 0xD61A, 0xD61B, 0xD61D, 0xD61E, 0xD61F, 0xD621, 0xD622, 0xD623, + 0xD625, 0xD626, 0xD627, 0xD628, 0xD629, 0xD62A, 0xD62B, 0xD62C, 0xD62E, + 0xD62F, 0xD630, 0xD631, 0xD632, 0xD633, 0xD634, 0xD635, 0xD636, 0xD637, + 0xD63A, 0xD63B, 0xD63D, 0xD63E, 0xD63F, 0xD641, 0xD642, 0xD643, 0xD644, + 0xD646, 0xD647, 0xD64A, 0xD64C, 0xD64E, 0xD64F, 0xD650, 0xD652, 0xD653, + 0xD656, 0xD657, 0xD659, 0xD65A, 0xD65B, 0xD65D, 0xD65E, 0xD65F, 0xD660, + 0xD661, 0xD662, 0xD663, 0xD664, 0xD665, 0xD666, 0xD668, 0xD66A, 0xD66B, + 0xD66C, 0xD66D, 0xD66E, 0xD66F, 0xD672, 0xD673, 0xD675, 0xD676, 0xD677, + 0xD678, 0xD679, 0xD67A, 0xD67B, 0xD67C, 0xD67D, 0xD67E, 0xD67F, 0xD680, + 0xD681, 0xD682, 0xD684, 0xD686, 0xD687, 0xD688, 0xD689, 0xD68A, 0xD68B, + 0xD68E, 0xD68F, 0xD691, 0xD692, 0xD693, 0xD695, 0xD696, 0xD697, 0xD698, + 0xD699, 0xD69A, 0xD69B, 0xD69C, 0xD69E, 0xD6A0, 0xD6A2, 0xD6A3, 0xD6A4, + 0xD6A5, 0xD6A6, 0xD6A7, 0xD6A9, 0xD6AA, 0xD6AB, 0xD6AD, 0xD6AE, 0xD6AF, + 0xD6B1, 0xD6B2, 0xD6B3, 0xD6B4, 0xD6B5, 0xD6B6, 0xD6B7, 0xD6B8, 0xD6BA, + 0xD6BC, 0xD6BD, 0xD6BE, 0xD6BF, 0xD6C0, 0xD6C1, 0xD6C2, 0xD6C3, 0xD6C6, + 0xD6C7, 0xD6C9, 0xD6CA, 0xD6CB, 0xD6CD, 0xD6CE, 0xD6CF, 0xD6D0, 0xD6D2, + 0xD6D3, 0xD6D5, 0xD6D6, 0xD6D8, 0xD6DA, 0xD6DB, 0xD6DC, 0xD6DD, 0xD6DE, + 0xD6DF, 0xD6E1, 0xD6E2, 0xD6E3, 0xD6E5, 0xD6E6, 0xD6E7, 0xD6E9, 0xD6EA, + 0xD6EB, 0xD6EC, 0xD6ED, 0xD6EE, 0xD6EF, 0xD6F1, 0xD6F2, 0xD6F3, 0xD6F4, + 0xD6F6, 0xD6F7, 0xD6F8, 0xD6F9, 0xD6FA, 0xD6FB, 0xD6FE, 0xD6FF, 0xD701, + 0xD702, 0xD703, 0xD705, 0xD706, 0xD707, 0xD708, 0xD709, 0xD70A, 0xD70B, + 0xD70C, 0xD70D, 0xD70E, 0xD70F, 0xD710, 0xD712, 0xD713, 0xD714, 0xD715, + 0xD716, 0xD717, 0xD71A, 0xD71B, 0xD71D, 0xD71E, 0xD71F, 0xD721, 0xD722, + 0xD723, 0xD724, 0xD725, 0xD726, 0xD727, 0xD72A, 0xD72C, 0xD72E, 0xD72F, + 0xD730, 0xD731, 0xD732, 0xD733, 0xD736, 0xD737, 0xD739, 0xD73A, 0xD73B, + 0xD73D, 0xD73E, 0xD73F, 0xD740, 0xD741, 0xD742, 0xD743, 0xD745, 0xD746, + 0xD748, 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E, 0xD74F, 0xD752, 0xD753, + 0xD755, 0xD75A, 0xD75B, 0xD75C, 0xD75D, 0xD75E, 0xD75F, 0xD762, 0xD764, + 0xD766, 0xD767, 0xD768, 0xD76A, 0xD76B, 0xD76D, 0xD76E, 0xD76F, 0xD771, + 0xD772, 0xD773, 0xD775, 0xD776, 0xD777, 0xD778, 0xD779, 0xD77A, 0xD77B, + 0xD77E, 0xD77F, 0xD780, 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, + 0xD78A, 0xD78B, 0xD78D, 0xD78E, 0xD78F, 0xD791, 0xD792, 0xD793, 0xD794, + 0xD795, 0xD796, 0xD797, 0xD79A, 0xD79C, 0xD79E, 0xD79F, 0xD7A0, 0xD7A1, + 0xD7A2, 0xD7A3, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, + 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, + 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, + 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, + 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, + 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, + 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, + 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, + 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x20A9, 0x2010, + 0x00A9, 0x2122, 0x22EF, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, + 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, + 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, + 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, + 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, + 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, + 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, + 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, + 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, + 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0x007E, + 0x005C, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSC-EUC-H_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSC-EUC-H_0.cpp new file mode 100644 index 000000000000..cce7899a8405 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSC-EUC-H_0.cpp @@ -0,0 +1,166 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Korea1/cmaps_korea1.h" + +const uint16_t g_FXCMAP_KSC_EUC_H_0[467 * 3] = { + 0x0020, 0x007E, 0x1F9E, 0xA1A1, 0xA1FE, 0x0065, 0xA2A1, 0xA2E5, 0x00C3, + 0xA3A1, 0xA3FE, 0x0108, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199, + 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7, + 0xA5E1, 0xA5F8, 0x01EF, 0xA6A1, 0xA6E4, 0x0207, 0xA7A1, 0xA7EF, 0x024B, + 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F, + 0xA8B1, 0xA8FE, 0x02A7, 0xA9A1, 0xA9FE, 0x02F5, 0xAAA1, 0xAAF3, 0x0353, + 0xABA1, 0xABF6, 0x03A6, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D, + 0xB0A1, 0xB0FE, 0x043E, 0xB1A1, 0xB1FE, 0x049C, 0xB2A1, 0xB2FE, 0x04FA, + 0xB3A1, 0xB3FE, 0x0558, 0xB4A1, 0xB4FE, 0x05B6, 0xB5A1, 0xB5FE, 0x0614, + 0xB6A1, 0xB6FE, 0x0672, 0xB7A1, 0xB7FE, 0x06D0, 0xB8A1, 0xB8FE, 0x072E, + 0xB9A1, 0xB9FE, 0x078C, 0xBAA1, 0xBAFE, 0x07EA, 0xBBA1, 0xBBFE, 0x0848, + 0xBCA1, 0xBCFE, 0x08A6, 0xBDA1, 0xBDFE, 0x0904, 0xBEA1, 0xBEFE, 0x0962, + 0xBFA1, 0xBFFE, 0x09C0, 0xC0A1, 0xC0FE, 0x0A1E, 0xC1A1, 0xC1FE, 0x0A7C, + 0xC2A1, 0xC2FE, 0x0ADA, 0xC3A1, 0xC3FE, 0x0B38, 0xC4A1, 0xC4FE, 0x0B96, + 0xC5A1, 0xC5FE, 0x0BF4, 0xC6A1, 0xC6FE, 0x0C52, 0xC7A1, 0xC7FE, 0x0CB0, + 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, 0xCBA1, 0xCBCF, 0x0DCA, + 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, 0xCBD6, 0xCBD6, 0x0E5E, + 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, 0xCBE8, 0xCBFE, 0x0E0E, + 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, 0xCDCF, 0xCDCF, 0x0D84, + 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, 0xCDE9, 0xCDFE, 0x0EC9, + 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, 0xCEAE, 0xCEFE, 0x0EEB, + 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, 0xCFFC, 0xCFFE, 0x0F96, + 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, 0xD0A3, 0xD0B7, 0x0F9A, + 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, 0xD0D0, 0xD0D0, 0x0E7C, + 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, 0xD0DE, 0xD0FE, 0x0FD2, + 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, 0xD1D5, 0xD1D5, 0x103C, + 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, 0xD1D9, 0xD1DA, 0x1028, + 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, 0xD1E2, 0xD1E2, 0x16A8, + 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, 0xD1E7, 0xD1E7, 0x102B, + 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, 0xD1ED, 0xD1ED, 0x1127, + 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, 0xD1F1, 0xD1F1, 0x102E, + 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, 0xD1F6, 0xD1F6, 0x112F, + 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, 0xD1FB, 0xD1FB, 0x1035, + 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, 0xD2A1, 0xD2A1, 0x1036, + 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, 0xD2A7, 0xD2AA, 0x113C, + 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, 0xD2AD, 0xD2AD, 0x1144, + 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, 0xD2B3, 0xD2BD, 0x103F, + 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, 0xD2C2, 0xD2C3, 0x11A1, + 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, 0xD2C6, 0xD2CA, 0x11A6, + 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, 0xD2CD, 0xD2CE, 0x11AD, + 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, 0xD2D8, 0xD2D8, 0x104F, + 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, 0xD2DE, 0xD2DF, 0x11C1, + 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, 0xD2E2, 0xD2E2, 0x11C6, + 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, 0xD2E5, 0xD2E8, 0x11D6, + 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, 0xD2EC, 0xD2EF, 0x1055, + 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, 0xD2F6, 0xD2F6, 0x1059, + 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, 0xD3A1, 0xD3FE, 0x1060, + 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, 0xD4E7, 0xD4FB, 0x1103, + 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, 0xD5A1, 0xD5A4, 0x111A, + 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, 0xD5AB, 0xD5AB, 0x102B, + 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, 0xD5AF, 0xD5FE, 0x1125, + 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, 0xD6B9, 0xD6CC, 0x118C, + 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, 0xD7A1, 0xD7CA, 0x11D1, + 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, 0xD7E4, 0xD7E4, 0x1918, + 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, 0xD9A1, 0xD9FE, 0x128B, + 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, 0xDBC5, 0xDBC5, 0x141F, + 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, 0xDBE5, 0xDBFE, 0x1389, + 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, 0xDCA6, 0xDCFE, 0x13A7, + 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, 0xDDA6, 0xDDD4, 0x1404, + 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, 0xDDF4, 0xDDF4, 0x1DB7, + 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, 0xDEFC, 0xDEFC, 0x15D0, + 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, 0xDFA1, 0xDFB2, 0x14B7, + 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, 0xDFE1, 0xDFE1, 0x14F2, + 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, 0xDFE9, 0xDFFE, 0x14FC, + 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, 0xE0F2, 0xE0FE, 0x1562, + 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, 0xE1AE, 0xE1EC, 0x157B, + 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, 0xE2A1, 0xE2FE, 0x15CB, + 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, 0xE3F6, 0xE3FE, 0x167D, + 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, 0xE4A9, 0xE4A9, 0x162E, + 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, 0xE5AE, 0xE5AE, 0x16F2, + 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, 0xE5B3, 0xE5B8, 0x16F1, + 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, 0xE5BB, 0xE5BC, 0x114D, + 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, 0xE5C5, 0xE5CD, 0x16FF, + 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, 0xE5D0, 0xE5D0, 0x1154, + 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, 0xE5D3, 0xE5D5, 0x170A, + 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, 0xE5FA, 0xE5FB, 0x115A, + 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, 0xE5FE, 0xE5FE, 0x115C, + 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, 0xE6A4, 0xE6A4, 0x1161, + 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, 0xE6A8, 0xE6AC, 0x1735, + 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, 0xE6AF, 0xE6B1, 0x1167, + 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, 0xE6B4, 0xE6B6, 0x173C, + 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, 0xE6BC, 0xE6BC, 0x116F, + 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, 0xE6C5, 0xE6C5, 0x1749, + 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, 0xE6CA, 0xE6CA, 0x1041, + 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, 0xE6D3, 0xE6D5, 0x1753, + 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, 0xE6D9, 0xE6D9, 0x1176, + 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, 0xE6DD, 0xE6DE, 0x175A, + 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, 0xE6E1, 0xE6E1, 0x1178, + 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, 0xE6E5, 0xE6E5, 0x1179, + 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, 0xE6E8, 0xE6E8, 0x117C, + 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, 0xE6EC, 0xE6EC, 0x192F, + 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, 0xE6F0, 0xE6F0, 0x1763, + 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, 0xE6F3, 0xE6F4, 0x1764, + 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, 0xE6F7, 0xE6F7, 0x1046, + 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, 0xE6FA, 0xE6FE, 0x1767, + 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, 0xE7A6, 0xE7A6, 0x1188, + 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, 0xE7AA, 0xE7AA, 0x118B, + 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, 0xE7AD, 0xE7AD, 0x118D, + 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, 0xE7B1, 0xE7BE, 0x1775, + 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, 0xE7C1, 0xE7C1, 0x1E67, + 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, 0xE7C7, 0xE7C7, 0x1193, + 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, 0xE7CC, 0xE7CC, 0x178B, + 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, 0xE7CF, 0xE7D0, 0x1197, + 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, 0xE7D4, 0xE7DE, 0x178F, + 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, 0xE7E4, 0xE7E4, 0x119D, + 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, 0xE7E7, 0xE7F6, 0x179F, + 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, 0xE8A1, 0xE8E6, 0x17B6, + 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, 0xE8F0, 0xE8F0, 0x11C9, + 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, 0xE8F7, 0xE8F7, 0x11CB, + 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, 0xE8FA, 0xE8FA, 0x1809, + 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, 0xE8FE, 0xE8FE, 0x11CD, + 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, 0xE9A8, 0xE9AB, 0x1812, + 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, 0xE9CC, 0xE9CC, 0x11D3, + 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, 0xE9F8, 0xE9FE, 0x185F, + 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, 0xEAC2, 0xEAE4, 0x1886, + 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, 0xEAF4, 0xEAF4, 0x1057, + 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, 0xEAF8, 0xEAFB, 0x18B9, + 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, 0xEAFE, 0xEAFE, 0x11E6, + 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, 0xEBA5, 0xEBA6, 0x18C1, + 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, 0xEBA9, 0xEBA9, 0x11EC, + 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, 0xEBBA, 0xEBBB, 0x11EE, + 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, 0xEBBE, 0xEBC0, 0x18D4, + 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, 0xEBC3, 0xEBC5, 0x18D7, + 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, 0xEBCC, 0xEBCC, 0x11F7, + 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, 0xEBD2, 0xEBD2, 0x15B0, + 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, 0xEBD9, 0xEBFE, 0x18E5, + 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, 0xECA7, 0xECA7, 0x1208, + 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, 0xECAB, 0xECAE, 0x1912, + 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, 0xECB2, 0xECB2, 0x105B, + 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, 0xECB6, 0xECB7, 0x1918, + 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, 0xECBA, 0xECBA, 0x1215, + 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, 0xECC2, 0xECC4, 0x1920, + 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, 0xECC7, 0xECC8, 0x1923, + 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, 0xECD5, 0xECD5, 0x121E, + 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, 0xECDF, 0xECE0, 0x1936, + 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, 0xECE4, 0xECE4, 0x1224, + 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, 0xECE9, 0xECF6, 0x193C, + 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, 0xECFA, 0xECFA, 0x122A, + 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, 0xEDA4, 0xEDED, 0x194F, + 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, 0xEEA1, 0xEEDA, 0x19A9, + 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, 0xEFA1, 0xEFFE, 0x1A06, + 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, 0xF2A1, 0xF2BC, 0x1B20, + 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, 0xF2FA, 0xF2FA, 0x168B, + 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, 0xF3B1, 0xF3B1, 0x105F, + 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, 0xF4A7, 0xF4A7, 0x1954, + 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, 0xF4EF, 0xF4FE, 0x1C25, + 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, 0xF6F4, 0xF6F4, 0x10B7, + 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, 0xF6F7, 0xF6FE, 0x1CE7, + 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, 0xF7B9, 0xF7C7, 0x1D06, + 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, 0xF7D3, 0xF7D3, 0x10F4, + 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, 0xF8DB, 0xF8DB, 0x1D94, + 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, 0xF8F1, 0xF8FE, 0x1D98, + 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, 0xFAA2, 0xFAA2, 0x0DE6, + 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, 0xFAE7, 0xFAFE, 0x1E47, + 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, 0xFCA9, 0xFCA9, 0x0EE7, + 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSC-EUC-V_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSC-EUC-V_0.cpp new file mode 100644 index 000000000000..7408f9e59d77 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSC-EUC-V_0.cpp @@ -0,0 +1,16 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Korea1/cmaps_korea1.h" + +const uint16_t g_FXCMAP_KSC_EUC_V_0[16 * 3] = { + 0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, + 0x2080, 0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, + 0xA1BD, 0x1F7F, 0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, + 0xA3A8, 0xA3A9, 0x1F8D, 0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, + 0x1F90, 0xA3BA, 0xA3BF, 0x1F91, 0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, + 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99, 0xA3FB, 0xA3FE, 0x1F9A, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-HW-H_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-HW-H_1.cpp new file mode 100644 index 000000000000..fbbdee806c3f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-HW-H_1.cpp @@ -0,0 +1,235 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Korea1/cmaps_korea1.h" + +const uint16_t g_FXCMAP_KSCms_UHC_HW_H_1[675 * 3] = { + 0x0020, 0x007E, 0x1F9E, 0x8141, 0x815A, 0x2475, 0x8161, 0x817A, 0x248F, + 0x8181, 0x81FE, 0x24A9, 0x8241, 0x825A, 0x2527, 0x8261, 0x827A, 0x2541, + 0x8281, 0x82FE, 0x255B, 0x8341, 0x835A, 0x25D9, 0x8361, 0x837A, 0x25F3, + 0x8381, 0x83FE, 0x260D, 0x8441, 0x845A, 0x268B, 0x8461, 0x847A, 0x26A5, + 0x8481, 0x84FE, 0x26BF, 0x8541, 0x855A, 0x273D, 0x8561, 0x857A, 0x2757, + 0x8581, 0x85FE, 0x2771, 0x8641, 0x865A, 0x27EF, 0x8661, 0x867A, 0x2809, + 0x8681, 0x86FE, 0x2823, 0x8741, 0x875A, 0x28A1, 0x8761, 0x877A, 0x28BB, + 0x8781, 0x87FE, 0x28D5, 0x8841, 0x885A, 0x2953, 0x8861, 0x887A, 0x296D, + 0x8881, 0x88FE, 0x2987, 0x8941, 0x895A, 0x2A05, 0x8961, 0x897A, 0x2A1F, + 0x8981, 0x89FE, 0x2A39, 0x8A41, 0x8A5A, 0x2AB7, 0x8A61, 0x8A7A, 0x2AD1, + 0x8A81, 0x8AFE, 0x2AEB, 0x8B41, 0x8B5A, 0x2B69, 0x8B61, 0x8B7A, 0x2B83, + 0x8B81, 0x8BFE, 0x2B9D, 0x8C41, 0x8C5A, 0x2C1B, 0x8C61, 0x8C7A, 0x2C35, + 0x8C81, 0x8CFE, 0x2C4F, 0x8D41, 0x8D5A, 0x2CCD, 0x8D61, 0x8D7A, 0x2CE7, + 0x8D81, 0x8DFE, 0x2D01, 0x8E41, 0x8E5A, 0x2D7F, 0x8E61, 0x8E7A, 0x2D99, + 0x8E81, 0x8EFE, 0x2DB3, 0x8F41, 0x8F5A, 0x2E31, 0x8F61, 0x8F7A, 0x2E4B, + 0x8F81, 0x8FFE, 0x2E65, 0x9041, 0x905A, 0x2EE3, 0x9061, 0x907A, 0x2EFD, + 0x9081, 0x90FE, 0x2F17, 0x9141, 0x915A, 0x2F95, 0x9161, 0x917A, 0x2FAF, + 0x9181, 0x91FE, 0x2FC9, 0x9241, 0x925A, 0x3047, 0x9261, 0x927A, 0x3061, + 0x9281, 0x92FE, 0x307B, 0x9341, 0x935A, 0x30F9, 0x9361, 0x937A, 0x3113, + 0x9381, 0x93FE, 0x312D, 0x9441, 0x945A, 0x31AB, 0x9461, 0x947A, 0x31C5, + 0x9481, 0x94FE, 0x31DF, 0x9541, 0x955A, 0x325D, 0x9561, 0x957A, 0x3277, + 0x9581, 0x95FE, 0x3291, 0x9641, 0x965A, 0x330F, 0x9661, 0x967A, 0x3329, + 0x9681, 0x96FE, 0x3343, 0x9741, 0x975A, 0x33C1, 0x9761, 0x977A, 0x33DB, + 0x9781, 0x97FE, 0x33F5, 0x9841, 0x985A, 0x3473, 0x9861, 0x987A, 0x348D, + 0x9881, 0x98FE, 0x34A7, 0x9941, 0x995A, 0x3525, 0x9961, 0x997A, 0x353F, + 0x9981, 0x99FE, 0x3559, 0x9A41, 0x9A5A, 0x35D7, 0x9A61, 0x9A7A, 0x35F1, + 0x9A81, 0x9AFE, 0x360B, 0x9B41, 0x9B5A, 0x3689, 0x9B61, 0x9B7A, 0x36A3, + 0x9B81, 0x9BFE, 0x36BD, 0x9C41, 0x9C5A, 0x373B, 0x9C61, 0x9C7A, 0x3755, + 0x9C81, 0x9CFE, 0x376F, 0x9D41, 0x9D5A, 0x37ED, 0x9D61, 0x9D7A, 0x3807, + 0x9D81, 0x9DFE, 0x3821, 0x9E41, 0x9E5A, 0x389F, 0x9E61, 0x9E7A, 0x38B9, + 0x9E81, 0x9EFE, 0x38D3, 0x9F41, 0x9F5A, 0x3951, 0x9F61, 0x9F7A, 0x396B, + 0x9F81, 0x9FFE, 0x3985, 0xA041, 0xA05A, 0x3A03, 0xA061, 0xA07A, 0x3A1D, + 0xA081, 0xA0FE, 0x3A37, 0xA141, 0xA15A, 0x3AB5, 0xA161, 0xA17A, 0x3ACF, + 0xA181, 0xA1A0, 0x3AE9, 0xA1A1, 0xA1FE, 0x0065, 0xA241, 0xA25A, 0x3B09, + 0xA261, 0xA27A, 0x3B23, 0xA281, 0xA2A0, 0x3B3D, 0xA2A1, 0xA2E5, 0x00C3, + 0xA341, 0xA35A, 0x3B5D, 0xA361, 0xA37A, 0x3B77, 0xA381, 0xA3A0, 0x3B91, + 0xA3A1, 0xA3FE, 0x0108, 0xA441, 0xA45A, 0x3BB1, 0xA461, 0xA47A, 0x3BCB, + 0xA481, 0xA4A0, 0x3BE5, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199, + 0xA541, 0xA55A, 0x3C05, 0xA561, 0xA57A, 0x3C1F, 0xA581, 0xA5A0, 0x3C39, + 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7, + 0xA5E1, 0xA5F8, 0x01EF, 0xA641, 0xA65A, 0x3C59, 0xA661, 0xA67A, 0x3C73, + 0xA681, 0xA6A0, 0x3C8D, 0xA6A1, 0xA6E4, 0x0207, 0xA741, 0xA75A, 0x3CAD, + 0xA761, 0xA77A, 0x3CC7, 0xA781, 0xA7A0, 0x3CE1, 0xA7A1, 0xA7EF, 0x024B, + 0xA841, 0xA85A, 0x3D01, 0xA861, 0xA87A, 0x3D1B, 0xA881, 0xA8A0, 0x3D35, + 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F, + 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA95A, 0x3D55, 0xA961, 0xA97A, 0x3D6F, + 0xA981, 0xA9A0, 0x3D89, 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA5A, 0x3DA9, + 0xAA61, 0xAA7A, 0x3DC3, 0xAA81, 0xAAA0, 0x3DDD, 0xAAA1, 0xAAF3, 0x0353, + 0xAB41, 0xAB5A, 0x3DFD, 0xAB61, 0xAB7A, 0x3E17, 0xAB81, 0xABA0, 0x3E31, + 0xABA1, 0xABF6, 0x03A6, 0xAC41, 0xAC5A, 0x3E51, 0xAC61, 0xAC7A, 0x3E6B, + 0xAC81, 0xACA0, 0x3E85, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D, + 0xAD41, 0xAD5A, 0x3EA5, 0xAD61, 0xAD7A, 0x3EBF, 0xAD81, 0xADA0, 0x3ED9, + 0xAE41, 0xAE5A, 0x3EF9, 0xAE61, 0xAE7A, 0x3F13, 0xAE81, 0xAEA0, 0x3F2D, + 0xAF41, 0xAF5A, 0x3F4D, 0xAF61, 0xAF7A, 0x3F67, 0xAF81, 0xAFA0, 0x3F81, + 0xB041, 0xB05A, 0x3FA1, 0xB061, 0xB07A, 0x3FBB, 0xB081, 0xB0A0, 0x3FD5, + 0xB0A1, 0xB0FE, 0x043E, 0xB141, 0xB15A, 0x3FF5, 0xB161, 0xB17A, 0x400F, + 0xB181, 0xB1A0, 0x4029, 0xB1A1, 0xB1FE, 0x049C, 0xB241, 0xB25A, 0x4049, + 0xB261, 0xB27A, 0x4063, 0xB281, 0xB2A0, 0x407D, 0xB2A1, 0xB2FE, 0x04FA, + 0xB341, 0xB35A, 0x409D, 0xB361, 0xB37A, 0x40B7, 0xB381, 0xB3A0, 0x40D1, + 0xB3A1, 0xB3FE, 0x0558, 0xB441, 0xB45A, 0x40F1, 0xB461, 0xB47A, 0x410B, + 0xB481, 0xB4A0, 0x4125, 0xB4A1, 0xB4FE, 0x05B6, 0xB541, 0xB55A, 0x4145, + 0xB561, 0xB57A, 0x415F, 0xB581, 0xB5A0, 0x4179, 0xB5A1, 0xB5FE, 0x0614, + 0xB641, 0xB65A, 0x4199, 0xB661, 0xB67A, 0x41B3, 0xB681, 0xB6A0, 0x41CD, + 0xB6A1, 0xB6FE, 0x0672, 0xB741, 0xB75A, 0x41ED, 0xB761, 0xB77A, 0x4207, + 0xB781, 0xB7A0, 0x4221, 0xB7A1, 0xB7FE, 0x06D0, 0xB841, 0xB85A, 0x4241, + 0xB861, 0xB87A, 0x425B, 0xB881, 0xB8A0, 0x4275, 0xB8A1, 0xB8FE, 0x072E, + 0xB941, 0xB95A, 0x4295, 0xB961, 0xB97A, 0x42AF, 0xB981, 0xB9A0, 0x42C9, + 0xB9A1, 0xB9FE, 0x078C, 0xBA41, 0xBA5A, 0x42E9, 0xBA61, 0xBA7A, 0x4303, + 0xBA81, 0xBAA0, 0x431D, 0xBAA1, 0xBAFE, 0x07EA, 0xBB41, 0xBB5A, 0x433D, + 0xBB61, 0xBB7A, 0x4357, 0xBB81, 0xBBA0, 0x4371, 0xBBA1, 0xBBFE, 0x0848, + 0xBC41, 0xBC5A, 0x4391, 0xBC61, 0xBC7A, 0x43AB, 0xBC81, 0xBCA0, 0x43C5, + 0xBCA1, 0xBCFE, 0x08A6, 0xBD41, 0xBD5A, 0x43E5, 0xBD61, 0xBD7A, 0x43FF, + 0xBD81, 0xBDA0, 0x4419, 0xBDA1, 0xBDFE, 0x0904, 0xBE41, 0xBE5A, 0x4439, + 0xBE61, 0xBE7A, 0x4453, 0xBE81, 0xBEA0, 0x446D, 0xBEA1, 0xBEFE, 0x0962, + 0xBF41, 0xBF5A, 0x448D, 0xBF61, 0xBF7A, 0x44A7, 0xBF81, 0xBFA0, 0x44C1, + 0xBFA1, 0xBFFE, 0x09C0, 0xC041, 0xC05A, 0x44E1, 0xC061, 0xC07A, 0x44FB, + 0xC081, 0xC0A0, 0x4515, 0xC0A1, 0xC0FE, 0x0A1E, 0xC141, 0xC15A, 0x4535, + 0xC161, 0xC17A, 0x454F, 0xC181, 0xC1A0, 0x4569, 0xC1A1, 0xC1FE, 0x0A7C, + 0xC241, 0xC25A, 0x4589, 0xC261, 0xC27A, 0x45A3, 0xC281, 0xC2A0, 0x45BD, + 0xC2A1, 0xC2FE, 0x0ADA, 0xC341, 0xC35A, 0x45DD, 0xC361, 0xC37A, 0x45F7, + 0xC381, 0xC3A0, 0x4611, 0xC3A1, 0xC3FE, 0x0B38, 0xC441, 0xC45A, 0x4631, + 0xC461, 0xC47A, 0x464B, 0xC481, 0xC4A0, 0x4665, 0xC4A1, 0xC4FE, 0x0B96, + 0xC541, 0xC55A, 0x4685, 0xC561, 0xC57A, 0x469F, 0xC581, 0xC5A0, 0x46B9, + 0xC5A1, 0xC5FE, 0x0BF4, 0xC641, 0xC652, 0x46D9, 0xC6A1, 0xC6FE, 0x0C52, + 0xC7A1, 0xC7FE, 0x0CB0, 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, + 0xCBA1, 0xCBCF, 0x0DCA, 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, + 0xCBD6, 0xCBD6, 0x0E5E, 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, + 0xCBE8, 0xCBFE, 0x0E0E, 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, + 0xCDCF, 0xCDCF, 0x0D84, 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, + 0xCDE9, 0xCDFE, 0x0EC9, 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, + 0xCEAE, 0xCEFE, 0x0EEB, 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, + 0xCFFC, 0xCFFE, 0x0F96, 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, + 0xD0A3, 0xD0B7, 0x0F9A, 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, + 0xD0D0, 0xD0D0, 0x0E7C, 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, + 0xD0DE, 0xD0FE, 0x0FD2, 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, + 0xD1D5, 0xD1D5, 0x103C, 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, + 0xD1D9, 0xD1DA, 0x1028, 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, + 0xD1E2, 0xD1E2, 0x16A8, 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, + 0xD1E7, 0xD1E7, 0x102B, 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, + 0xD1ED, 0xD1ED, 0x1127, 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, + 0xD1F1, 0xD1F1, 0x102E, 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, + 0xD1F6, 0xD1F6, 0x112F, 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, + 0xD1FB, 0xD1FB, 0x1035, 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, + 0xD2A1, 0xD2A1, 0x1036, 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, + 0xD2A7, 0xD2AA, 0x113C, 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, + 0xD2AD, 0xD2AD, 0x1144, 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, + 0xD2B3, 0xD2BD, 0x103F, 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, + 0xD2C2, 0xD2C3, 0x11A1, 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, + 0xD2C6, 0xD2CA, 0x11A6, 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, + 0xD2CD, 0xD2CE, 0x11AD, 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, + 0xD2D8, 0xD2D8, 0x104F, 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, + 0xD2DE, 0xD2DF, 0x11C1, 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, + 0xD2E2, 0xD2E2, 0x11C6, 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, + 0xD2E5, 0xD2E8, 0x11D6, 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, + 0xD2EC, 0xD2EF, 0x1055, 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, + 0xD2F6, 0xD2F6, 0x1059, 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, + 0xD3A1, 0xD3FE, 0x1060, 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, + 0xD4E7, 0xD4FB, 0x1103, 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, + 0xD5A1, 0xD5A4, 0x111A, 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, + 0xD5AB, 0xD5AB, 0x102B, 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, + 0xD5AF, 0xD5FE, 0x1125, 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, + 0xD6B9, 0xD6CC, 0x118C, 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, + 0xD7A1, 0xD7CA, 0x11D1, 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, + 0xD7E4, 0xD7E4, 0x1918, 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, + 0xD9A1, 0xD9FE, 0x128B, 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, + 0xDBC5, 0xDBC5, 0x141F, 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, + 0xDBE5, 0xDBFE, 0x1389, 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, + 0xDCA6, 0xDCFE, 0x13A7, 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, + 0xDDA6, 0xDDD4, 0x1404, 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, + 0xDDF4, 0xDDF4, 0x1DB7, 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, + 0xDEFC, 0xDEFC, 0x15D0, 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, + 0xDFA1, 0xDFB2, 0x14B7, 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, + 0xDFE1, 0xDFE1, 0x14F2, 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, + 0xDFE9, 0xDFFE, 0x14FC, 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, + 0xE0F2, 0xE0FE, 0x1562, 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, + 0xE1AE, 0xE1EC, 0x157B, 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, + 0xE2A1, 0xE2FE, 0x15CB, 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, + 0xE3F6, 0xE3FE, 0x167D, 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, + 0xE4A9, 0xE4A9, 0x162E, 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, + 0xE5AE, 0xE5AE, 0x16F2, 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, + 0xE5B3, 0xE5B8, 0x16F1, 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, + 0xE5BB, 0xE5BC, 0x114D, 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, + 0xE5C5, 0xE5CD, 0x16FF, 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, + 0xE5D0, 0xE5D0, 0x1154, 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, + 0xE5D3, 0xE5D5, 0x170A, 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, + 0xE5FA, 0xE5FB, 0x115A, 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, + 0xE5FE, 0xE5FE, 0x115C, 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, + 0xE6A4, 0xE6A4, 0x1161, 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, + 0xE6A8, 0xE6AC, 0x1735, 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, + 0xE6AF, 0xE6B1, 0x1167, 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, + 0xE6B4, 0xE6B6, 0x173C, 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, + 0xE6BC, 0xE6BC, 0x116F, 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, + 0xE6C5, 0xE6C5, 0x1749, 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, + 0xE6CA, 0xE6CA, 0x1041, 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, + 0xE6D3, 0xE6D5, 0x1753, 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, + 0xE6D9, 0xE6D9, 0x1176, 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, + 0xE6DD, 0xE6DE, 0x175A, 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, + 0xE6E1, 0xE6E1, 0x1178, 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, + 0xE6E5, 0xE6E5, 0x1179, 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, + 0xE6E8, 0xE6E8, 0x117C, 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, + 0xE6EC, 0xE6EC, 0x192F, 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, + 0xE6F0, 0xE6F0, 0x1763, 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, + 0xE6F3, 0xE6F4, 0x1764, 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, + 0xE6F7, 0xE6F7, 0x1046, 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, + 0xE6FA, 0xE6FE, 0x1767, 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, + 0xE7A6, 0xE7A6, 0x1188, 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, + 0xE7AA, 0xE7AA, 0x118B, 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, + 0xE7AD, 0xE7AD, 0x118D, 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, + 0xE7B1, 0xE7BE, 0x1775, 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, + 0xE7C1, 0xE7C1, 0x1E67, 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, + 0xE7C7, 0xE7C7, 0x1193, 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, + 0xE7CC, 0xE7CC, 0x178B, 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, + 0xE7CF, 0xE7D0, 0x1197, 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, + 0xE7D4, 0xE7DE, 0x178F, 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, + 0xE7E4, 0xE7E4, 0x119D, 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, + 0xE7E7, 0xE7F6, 0x179F, 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, + 0xE8A1, 0xE8E6, 0x17B6, 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, + 0xE8F0, 0xE8F0, 0x11C9, 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, + 0xE8F7, 0xE8F7, 0x11CB, 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, + 0xE8FA, 0xE8FA, 0x1809, 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, + 0xE8FE, 0xE8FE, 0x11CD, 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, + 0xE9A8, 0xE9AB, 0x1812, 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, + 0xE9CC, 0xE9CC, 0x11D3, 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, + 0xE9F8, 0xE9FE, 0x185F, 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, + 0xEAC2, 0xEAE4, 0x1886, 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, + 0xEAF4, 0xEAF4, 0x1057, 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, + 0xEAF8, 0xEAFB, 0x18B9, 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, + 0xEAFE, 0xEAFE, 0x11E6, 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, + 0xEBA5, 0xEBA6, 0x18C1, 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, + 0xEBA9, 0xEBA9, 0x11EC, 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, + 0xEBBA, 0xEBBB, 0x11EE, 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, + 0xEBBE, 0xEBC0, 0x18D4, 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, + 0xEBC3, 0xEBC5, 0x18D7, 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, + 0xEBCC, 0xEBCC, 0x11F7, 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, + 0xEBD2, 0xEBD2, 0x15B0, 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, + 0xEBD9, 0xEBFE, 0x18E5, 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, + 0xECA7, 0xECA7, 0x1208, 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, + 0xECAB, 0xECAE, 0x1912, 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, + 0xECB2, 0xECB2, 0x105B, 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, + 0xECB6, 0xECB7, 0x1918, 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, + 0xECBA, 0xECBA, 0x1215, 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, + 0xECC2, 0xECC4, 0x1920, 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, + 0xECC7, 0xECC8, 0x1923, 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, + 0xECD5, 0xECD5, 0x121E, 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, + 0xECDF, 0xECE0, 0x1936, 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, + 0xECE4, 0xECE4, 0x1224, 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, + 0xECE9, 0xECF6, 0x193C, 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, + 0xECFA, 0xECFA, 0x122A, 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, + 0xEDA4, 0xEDED, 0x194F, 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, + 0xEEA1, 0xEEDA, 0x19A9, 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, + 0xEFA1, 0xEFFE, 0x1A06, 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, + 0xF2A1, 0xF2BC, 0x1B20, 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, + 0xF2FA, 0xF2FA, 0x168B, 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, + 0xF3B1, 0xF3B1, 0x105F, 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, + 0xF4A7, 0xF4A7, 0x1954, 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, + 0xF4EF, 0xF4FE, 0x1C25, 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, + 0xF6F4, 0xF6F4, 0x10B7, 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, + 0xF6F7, 0xF6FE, 0x1CE7, 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, + 0xF7B9, 0xF7C7, 0x1D06, 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, + 0xF7D3, 0xF7D3, 0x10F4, 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, + 0xF8DB, 0xF8DB, 0x1D94, 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, + 0xF8F1, 0xF8FE, 0x1D98, 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, + 0xFAA2, 0xFAA2, 0x0DE6, 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, + 0xFAE7, 0xFAFE, 0x1E47, 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, + 0xFCA9, 0xFCA9, 0x0EE7, 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-HW-V_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-HW-V_1.cpp new file mode 100644 index 000000000000..16ddafa2bb93 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-HW-V_1.cpp @@ -0,0 +1,16 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Korea1/cmaps_korea1.h" + +const uint16_t g_FXCMAP_KSCms_UHC_HW_V_1[16 * 3] = { + 0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, + 0x2080, 0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, + 0xA1BD, 0x1F7F, 0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, + 0xA3A8, 0xA3A9, 0x1F8D, 0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, + 0x1F90, 0xA3BA, 0xA3BF, 0x1F91, 0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, + 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99, 0xA3FB, 0xA3FE, 0x1F9A, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-H_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-H_1.cpp new file mode 100644 index 000000000000..986c8792225f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-H_1.cpp @@ -0,0 +1,235 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Korea1/cmaps_korea1.h" + +const uint16_t g_FXCMAP_KSCms_UHC_H_1[675 * 3] = { + 0x0020, 0x007E, 0x0001, 0x8141, 0x815A, 0x2475, 0x8161, 0x817A, 0x248F, + 0x8181, 0x81FE, 0x24A9, 0x8241, 0x825A, 0x2527, 0x8261, 0x827A, 0x2541, + 0x8281, 0x82FE, 0x255B, 0x8341, 0x835A, 0x25D9, 0x8361, 0x837A, 0x25F3, + 0x8381, 0x83FE, 0x260D, 0x8441, 0x845A, 0x268B, 0x8461, 0x847A, 0x26A5, + 0x8481, 0x84FE, 0x26BF, 0x8541, 0x855A, 0x273D, 0x8561, 0x857A, 0x2757, + 0x8581, 0x85FE, 0x2771, 0x8641, 0x865A, 0x27EF, 0x8661, 0x867A, 0x2809, + 0x8681, 0x86FE, 0x2823, 0x8741, 0x875A, 0x28A1, 0x8761, 0x877A, 0x28BB, + 0x8781, 0x87FE, 0x28D5, 0x8841, 0x885A, 0x2953, 0x8861, 0x887A, 0x296D, + 0x8881, 0x88FE, 0x2987, 0x8941, 0x895A, 0x2A05, 0x8961, 0x897A, 0x2A1F, + 0x8981, 0x89FE, 0x2A39, 0x8A41, 0x8A5A, 0x2AB7, 0x8A61, 0x8A7A, 0x2AD1, + 0x8A81, 0x8AFE, 0x2AEB, 0x8B41, 0x8B5A, 0x2B69, 0x8B61, 0x8B7A, 0x2B83, + 0x8B81, 0x8BFE, 0x2B9D, 0x8C41, 0x8C5A, 0x2C1B, 0x8C61, 0x8C7A, 0x2C35, + 0x8C81, 0x8CFE, 0x2C4F, 0x8D41, 0x8D5A, 0x2CCD, 0x8D61, 0x8D7A, 0x2CE7, + 0x8D81, 0x8DFE, 0x2D01, 0x8E41, 0x8E5A, 0x2D7F, 0x8E61, 0x8E7A, 0x2D99, + 0x8E81, 0x8EFE, 0x2DB3, 0x8F41, 0x8F5A, 0x2E31, 0x8F61, 0x8F7A, 0x2E4B, + 0x8F81, 0x8FFE, 0x2E65, 0x9041, 0x905A, 0x2EE3, 0x9061, 0x907A, 0x2EFD, + 0x9081, 0x90FE, 0x2F17, 0x9141, 0x915A, 0x2F95, 0x9161, 0x917A, 0x2FAF, + 0x9181, 0x91FE, 0x2FC9, 0x9241, 0x925A, 0x3047, 0x9261, 0x927A, 0x3061, + 0x9281, 0x92FE, 0x307B, 0x9341, 0x935A, 0x30F9, 0x9361, 0x937A, 0x3113, + 0x9381, 0x93FE, 0x312D, 0x9441, 0x945A, 0x31AB, 0x9461, 0x947A, 0x31C5, + 0x9481, 0x94FE, 0x31DF, 0x9541, 0x955A, 0x325D, 0x9561, 0x957A, 0x3277, + 0x9581, 0x95FE, 0x3291, 0x9641, 0x965A, 0x330F, 0x9661, 0x967A, 0x3329, + 0x9681, 0x96FE, 0x3343, 0x9741, 0x975A, 0x33C1, 0x9761, 0x977A, 0x33DB, + 0x9781, 0x97FE, 0x33F5, 0x9841, 0x985A, 0x3473, 0x9861, 0x987A, 0x348D, + 0x9881, 0x98FE, 0x34A7, 0x9941, 0x995A, 0x3525, 0x9961, 0x997A, 0x353F, + 0x9981, 0x99FE, 0x3559, 0x9A41, 0x9A5A, 0x35D7, 0x9A61, 0x9A7A, 0x35F1, + 0x9A81, 0x9AFE, 0x360B, 0x9B41, 0x9B5A, 0x3689, 0x9B61, 0x9B7A, 0x36A3, + 0x9B81, 0x9BFE, 0x36BD, 0x9C41, 0x9C5A, 0x373B, 0x9C61, 0x9C7A, 0x3755, + 0x9C81, 0x9CFE, 0x376F, 0x9D41, 0x9D5A, 0x37ED, 0x9D61, 0x9D7A, 0x3807, + 0x9D81, 0x9DFE, 0x3821, 0x9E41, 0x9E5A, 0x389F, 0x9E61, 0x9E7A, 0x38B9, + 0x9E81, 0x9EFE, 0x38D3, 0x9F41, 0x9F5A, 0x3951, 0x9F61, 0x9F7A, 0x396B, + 0x9F81, 0x9FFE, 0x3985, 0xA041, 0xA05A, 0x3A03, 0xA061, 0xA07A, 0x3A1D, + 0xA081, 0xA0FE, 0x3A37, 0xA141, 0xA15A, 0x3AB5, 0xA161, 0xA17A, 0x3ACF, + 0xA181, 0xA1A0, 0x3AE9, 0xA1A1, 0xA1FE, 0x0065, 0xA241, 0xA25A, 0x3B09, + 0xA261, 0xA27A, 0x3B23, 0xA281, 0xA2A0, 0x3B3D, 0xA2A1, 0xA2E5, 0x00C3, + 0xA341, 0xA35A, 0x3B5D, 0xA361, 0xA37A, 0x3B77, 0xA381, 0xA3A0, 0x3B91, + 0xA3A1, 0xA3FE, 0x0108, 0xA441, 0xA45A, 0x3BB1, 0xA461, 0xA47A, 0x3BCB, + 0xA481, 0xA4A0, 0x3BE5, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199, + 0xA541, 0xA55A, 0x3C05, 0xA561, 0xA57A, 0x3C1F, 0xA581, 0xA5A0, 0x3C39, + 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7, + 0xA5E1, 0xA5F8, 0x01EF, 0xA641, 0xA65A, 0x3C59, 0xA661, 0xA67A, 0x3C73, + 0xA681, 0xA6A0, 0x3C8D, 0xA6A1, 0xA6E4, 0x0207, 0xA741, 0xA75A, 0x3CAD, + 0xA761, 0xA77A, 0x3CC7, 0xA781, 0xA7A0, 0x3CE1, 0xA7A1, 0xA7EF, 0x024B, + 0xA841, 0xA85A, 0x3D01, 0xA861, 0xA87A, 0x3D1B, 0xA881, 0xA8A0, 0x3D35, + 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F, + 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA95A, 0x3D55, 0xA961, 0xA97A, 0x3D6F, + 0xA981, 0xA9A0, 0x3D89, 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA5A, 0x3DA9, + 0xAA61, 0xAA7A, 0x3DC3, 0xAA81, 0xAAA0, 0x3DDD, 0xAAA1, 0xAAF3, 0x0353, + 0xAB41, 0xAB5A, 0x3DFD, 0xAB61, 0xAB7A, 0x3E17, 0xAB81, 0xABA0, 0x3E31, + 0xABA1, 0xABF6, 0x03A6, 0xAC41, 0xAC5A, 0x3E51, 0xAC61, 0xAC7A, 0x3E6B, + 0xAC81, 0xACA0, 0x3E85, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D, + 0xAD41, 0xAD5A, 0x3EA5, 0xAD61, 0xAD7A, 0x3EBF, 0xAD81, 0xADA0, 0x3ED9, + 0xAE41, 0xAE5A, 0x3EF9, 0xAE61, 0xAE7A, 0x3F13, 0xAE81, 0xAEA0, 0x3F2D, + 0xAF41, 0xAF5A, 0x3F4D, 0xAF61, 0xAF7A, 0x3F67, 0xAF81, 0xAFA0, 0x3F81, + 0xB041, 0xB05A, 0x3FA1, 0xB061, 0xB07A, 0x3FBB, 0xB081, 0xB0A0, 0x3FD5, + 0xB0A1, 0xB0FE, 0x043E, 0xB141, 0xB15A, 0x3FF5, 0xB161, 0xB17A, 0x400F, + 0xB181, 0xB1A0, 0x4029, 0xB1A1, 0xB1FE, 0x049C, 0xB241, 0xB25A, 0x4049, + 0xB261, 0xB27A, 0x4063, 0xB281, 0xB2A0, 0x407D, 0xB2A1, 0xB2FE, 0x04FA, + 0xB341, 0xB35A, 0x409D, 0xB361, 0xB37A, 0x40B7, 0xB381, 0xB3A0, 0x40D1, + 0xB3A1, 0xB3FE, 0x0558, 0xB441, 0xB45A, 0x40F1, 0xB461, 0xB47A, 0x410B, + 0xB481, 0xB4A0, 0x4125, 0xB4A1, 0xB4FE, 0x05B6, 0xB541, 0xB55A, 0x4145, + 0xB561, 0xB57A, 0x415F, 0xB581, 0xB5A0, 0x4179, 0xB5A1, 0xB5FE, 0x0614, + 0xB641, 0xB65A, 0x4199, 0xB661, 0xB67A, 0x41B3, 0xB681, 0xB6A0, 0x41CD, + 0xB6A1, 0xB6FE, 0x0672, 0xB741, 0xB75A, 0x41ED, 0xB761, 0xB77A, 0x4207, + 0xB781, 0xB7A0, 0x4221, 0xB7A1, 0xB7FE, 0x06D0, 0xB841, 0xB85A, 0x4241, + 0xB861, 0xB87A, 0x425B, 0xB881, 0xB8A0, 0x4275, 0xB8A1, 0xB8FE, 0x072E, + 0xB941, 0xB95A, 0x4295, 0xB961, 0xB97A, 0x42AF, 0xB981, 0xB9A0, 0x42C9, + 0xB9A1, 0xB9FE, 0x078C, 0xBA41, 0xBA5A, 0x42E9, 0xBA61, 0xBA7A, 0x4303, + 0xBA81, 0xBAA0, 0x431D, 0xBAA1, 0xBAFE, 0x07EA, 0xBB41, 0xBB5A, 0x433D, + 0xBB61, 0xBB7A, 0x4357, 0xBB81, 0xBBA0, 0x4371, 0xBBA1, 0xBBFE, 0x0848, + 0xBC41, 0xBC5A, 0x4391, 0xBC61, 0xBC7A, 0x43AB, 0xBC81, 0xBCA0, 0x43C5, + 0xBCA1, 0xBCFE, 0x08A6, 0xBD41, 0xBD5A, 0x43E5, 0xBD61, 0xBD7A, 0x43FF, + 0xBD81, 0xBDA0, 0x4419, 0xBDA1, 0xBDFE, 0x0904, 0xBE41, 0xBE5A, 0x4439, + 0xBE61, 0xBE7A, 0x4453, 0xBE81, 0xBEA0, 0x446D, 0xBEA1, 0xBEFE, 0x0962, + 0xBF41, 0xBF5A, 0x448D, 0xBF61, 0xBF7A, 0x44A7, 0xBF81, 0xBFA0, 0x44C1, + 0xBFA1, 0xBFFE, 0x09C0, 0xC041, 0xC05A, 0x44E1, 0xC061, 0xC07A, 0x44FB, + 0xC081, 0xC0A0, 0x4515, 0xC0A1, 0xC0FE, 0x0A1E, 0xC141, 0xC15A, 0x4535, + 0xC161, 0xC17A, 0x454F, 0xC181, 0xC1A0, 0x4569, 0xC1A1, 0xC1FE, 0x0A7C, + 0xC241, 0xC25A, 0x4589, 0xC261, 0xC27A, 0x45A3, 0xC281, 0xC2A0, 0x45BD, + 0xC2A1, 0xC2FE, 0x0ADA, 0xC341, 0xC35A, 0x45DD, 0xC361, 0xC37A, 0x45F7, + 0xC381, 0xC3A0, 0x4611, 0xC3A1, 0xC3FE, 0x0B38, 0xC441, 0xC45A, 0x4631, + 0xC461, 0xC47A, 0x464B, 0xC481, 0xC4A0, 0x4665, 0xC4A1, 0xC4FE, 0x0B96, + 0xC541, 0xC55A, 0x4685, 0xC561, 0xC57A, 0x469F, 0xC581, 0xC5A0, 0x46B9, + 0xC5A1, 0xC5FE, 0x0BF4, 0xC641, 0xC652, 0x46D9, 0xC6A1, 0xC6FE, 0x0C52, + 0xC7A1, 0xC7FE, 0x0CB0, 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, + 0xCBA1, 0xCBCF, 0x0DCA, 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, + 0xCBD6, 0xCBD6, 0x0E5E, 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, + 0xCBE8, 0xCBFE, 0x0E0E, 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, + 0xCDCF, 0xCDCF, 0x0D84, 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, + 0xCDE9, 0xCDFE, 0x0EC9, 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, + 0xCEAE, 0xCEFE, 0x0EEB, 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, + 0xCFFC, 0xCFFE, 0x0F96, 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, + 0xD0A3, 0xD0B7, 0x0F9A, 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, + 0xD0D0, 0xD0D0, 0x0E7C, 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, + 0xD0DE, 0xD0FE, 0x0FD2, 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, + 0xD1D5, 0xD1D5, 0x103C, 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, + 0xD1D9, 0xD1DA, 0x1028, 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, + 0xD1E2, 0xD1E2, 0x16A8, 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, + 0xD1E7, 0xD1E7, 0x102B, 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, + 0xD1ED, 0xD1ED, 0x1127, 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, + 0xD1F1, 0xD1F1, 0x102E, 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, + 0xD1F6, 0xD1F6, 0x112F, 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, + 0xD1FB, 0xD1FB, 0x1035, 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, + 0xD2A1, 0xD2A1, 0x1036, 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, + 0xD2A7, 0xD2AA, 0x113C, 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, + 0xD2AD, 0xD2AD, 0x1144, 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, + 0xD2B3, 0xD2BD, 0x103F, 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, + 0xD2C2, 0xD2C3, 0x11A1, 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, + 0xD2C6, 0xD2CA, 0x11A6, 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, + 0xD2CD, 0xD2CE, 0x11AD, 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, + 0xD2D8, 0xD2D8, 0x104F, 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, + 0xD2DE, 0xD2DF, 0x11C1, 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, + 0xD2E2, 0xD2E2, 0x11C6, 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, + 0xD2E5, 0xD2E8, 0x11D6, 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, + 0xD2EC, 0xD2EF, 0x1055, 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, + 0xD2F6, 0xD2F6, 0x1059, 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, + 0xD3A1, 0xD3FE, 0x1060, 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, + 0xD4E7, 0xD4FB, 0x1103, 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, + 0xD5A1, 0xD5A4, 0x111A, 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, + 0xD5AB, 0xD5AB, 0x102B, 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, + 0xD5AF, 0xD5FE, 0x1125, 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, + 0xD6B9, 0xD6CC, 0x118C, 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, + 0xD7A1, 0xD7CA, 0x11D1, 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, + 0xD7E4, 0xD7E4, 0x1918, 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, + 0xD9A1, 0xD9FE, 0x128B, 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, + 0xDBC5, 0xDBC5, 0x141F, 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, + 0xDBE5, 0xDBFE, 0x1389, 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, + 0xDCA6, 0xDCFE, 0x13A7, 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, + 0xDDA6, 0xDDD4, 0x1404, 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, + 0xDDF4, 0xDDF4, 0x1DB7, 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, + 0xDEFC, 0xDEFC, 0x15D0, 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, + 0xDFA1, 0xDFB2, 0x14B7, 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, + 0xDFE1, 0xDFE1, 0x14F2, 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, + 0xDFE9, 0xDFFE, 0x14FC, 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, + 0xE0F2, 0xE0FE, 0x1562, 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, + 0xE1AE, 0xE1EC, 0x157B, 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, + 0xE2A1, 0xE2FE, 0x15CB, 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, + 0xE3F6, 0xE3FE, 0x167D, 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, + 0xE4A9, 0xE4A9, 0x162E, 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, + 0xE5AE, 0xE5AE, 0x16F2, 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, + 0xE5B3, 0xE5B8, 0x16F1, 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, + 0xE5BB, 0xE5BC, 0x114D, 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, + 0xE5C5, 0xE5CD, 0x16FF, 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, + 0xE5D0, 0xE5D0, 0x1154, 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, + 0xE5D3, 0xE5D5, 0x170A, 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, + 0xE5FA, 0xE5FB, 0x115A, 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, + 0xE5FE, 0xE5FE, 0x115C, 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, + 0xE6A4, 0xE6A4, 0x1161, 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, + 0xE6A8, 0xE6AC, 0x1735, 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, + 0xE6AF, 0xE6B1, 0x1167, 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, + 0xE6B4, 0xE6B6, 0x173C, 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, + 0xE6BC, 0xE6BC, 0x116F, 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, + 0xE6C5, 0xE6C5, 0x1749, 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, + 0xE6CA, 0xE6CA, 0x1041, 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, + 0xE6D3, 0xE6D5, 0x1753, 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, + 0xE6D9, 0xE6D9, 0x1176, 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, + 0xE6DD, 0xE6DE, 0x175A, 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, + 0xE6E1, 0xE6E1, 0x1178, 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, + 0xE6E5, 0xE6E5, 0x1179, 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, + 0xE6E8, 0xE6E8, 0x117C, 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, + 0xE6EC, 0xE6EC, 0x192F, 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, + 0xE6F0, 0xE6F0, 0x1763, 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, + 0xE6F3, 0xE6F4, 0x1764, 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, + 0xE6F7, 0xE6F7, 0x1046, 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, + 0xE6FA, 0xE6FE, 0x1767, 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, + 0xE7A6, 0xE7A6, 0x1188, 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, + 0xE7AA, 0xE7AA, 0x118B, 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, + 0xE7AD, 0xE7AD, 0x118D, 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, + 0xE7B1, 0xE7BE, 0x1775, 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, + 0xE7C1, 0xE7C1, 0x1E67, 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, + 0xE7C7, 0xE7C7, 0x1193, 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, + 0xE7CC, 0xE7CC, 0x178B, 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, + 0xE7CF, 0xE7D0, 0x1197, 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, + 0xE7D4, 0xE7DE, 0x178F, 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, + 0xE7E4, 0xE7E4, 0x119D, 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, + 0xE7E7, 0xE7F6, 0x179F, 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, + 0xE8A1, 0xE8E6, 0x17B6, 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, + 0xE8F0, 0xE8F0, 0x11C9, 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, + 0xE8F7, 0xE8F7, 0x11CB, 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, + 0xE8FA, 0xE8FA, 0x1809, 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, + 0xE8FE, 0xE8FE, 0x11CD, 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, + 0xE9A8, 0xE9AB, 0x1812, 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, + 0xE9CC, 0xE9CC, 0x11D3, 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, + 0xE9F8, 0xE9FE, 0x185F, 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, + 0xEAC2, 0xEAE4, 0x1886, 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, + 0xEAF4, 0xEAF4, 0x1057, 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, + 0xEAF8, 0xEAFB, 0x18B9, 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, + 0xEAFE, 0xEAFE, 0x11E6, 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, + 0xEBA5, 0xEBA6, 0x18C1, 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, + 0xEBA9, 0xEBA9, 0x11EC, 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, + 0xEBBA, 0xEBBB, 0x11EE, 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, + 0xEBBE, 0xEBC0, 0x18D4, 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, + 0xEBC3, 0xEBC5, 0x18D7, 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, + 0xEBCC, 0xEBCC, 0x11F7, 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, + 0xEBD2, 0xEBD2, 0x15B0, 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, + 0xEBD9, 0xEBFE, 0x18E5, 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, + 0xECA7, 0xECA7, 0x1208, 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, + 0xECAB, 0xECAE, 0x1912, 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, + 0xECB2, 0xECB2, 0x105B, 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, + 0xECB6, 0xECB7, 0x1918, 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, + 0xECBA, 0xECBA, 0x1215, 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, + 0xECC2, 0xECC4, 0x1920, 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, + 0xECC7, 0xECC8, 0x1923, 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, + 0xECD5, 0xECD5, 0x121E, 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, + 0xECDF, 0xECE0, 0x1936, 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, + 0xECE4, 0xECE4, 0x1224, 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, + 0xECE9, 0xECF6, 0x193C, 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, + 0xECFA, 0xECFA, 0x122A, 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, + 0xEDA4, 0xEDED, 0x194F, 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, + 0xEEA1, 0xEEDA, 0x19A9, 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, + 0xEFA1, 0xEFFE, 0x1A06, 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, + 0xF2A1, 0xF2BC, 0x1B20, 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, + 0xF2FA, 0xF2FA, 0x168B, 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, + 0xF3B1, 0xF3B1, 0x105F, 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, + 0xF4A7, 0xF4A7, 0x1954, 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, + 0xF4EF, 0xF4FE, 0x1C25, 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, + 0xF6F4, 0xF6F4, 0x10B7, 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, + 0xF6F7, 0xF6FE, 0x1CE7, 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, + 0xF7B9, 0xF7C7, 0x1D06, 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, + 0xF7D3, 0xF7D3, 0x10F4, 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, + 0xF8DB, 0xF8DB, 0x1D94, 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, + 0xF8F1, 0xF8FE, 0x1D98, 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, + 0xFAA2, 0xFAA2, 0x0DE6, 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, + 0xFAE7, 0xFAFE, 0x1E47, 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, + 0xFCA9, 0xFCA9, 0x0EE7, 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-V_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-V_1.cpp new file mode 100644 index 000000000000..e040444564e8 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCms-UHC-V_1.cpp @@ -0,0 +1,16 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Korea1/cmaps_korea1.h" + +const uint16_t g_FXCMAP_KSCms_UHC_V_1[16 * 3] = { + 0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, + 0x2080, 0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, + 0xA1BD, 0x1F7F, 0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, + 0xA3A8, 0xA3A9, 0x1F8D, 0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, + 0x1F90, 0xA3BA, 0xA3BF, 0x1F91, 0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, + 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99, 0xA3FB, 0xA3FE, 0x1F9A, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCpc-EUC-H_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCpc-EUC-H_0.cpp new file mode 100644 index 000000000000..12fa16ddd8e5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/KSCpc-EUC-H_0.cpp @@ -0,0 +1,180 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Korea1/cmaps_korea1.h" + +const uint16_t g_FXCMAP_KSCpc_EUC_H_0[509 * 3] = { + 0x0020, 0x007E, 0x0001, 0x0081, 0x0083, 0x0060, 0x00FE, 0x00FF, 0x0063, + 0xA141, 0xA17D, 0x1FFF, 0xA181, 0xA19A, 0x203C, 0xA19C, 0xA1A0, 0x2056, + 0xA1A1, 0xA1A1, 0x0065, 0xA1A2, 0xA1A3, 0x205B, 0xA1A4, 0xA1FE, 0x0068, + 0xA241, 0xA24C, 0x205D, 0xA2A1, 0xA2E5, 0x00C3, 0xA2E6, 0xA2FE, 0x2069, + 0xA341, 0xA37D, 0x2082, 0xA381, 0xA39F, 0x20BF, 0xA3A1, 0xA3FE, 0x0108, + 0xA441, 0xA47D, 0x20DE, 0xA481, 0xA49F, 0x211B, 0xA4A1, 0xA4D3, 0x0166, + 0xA4D5, 0xA4FE, 0x0199, 0xA541, 0xA57D, 0x213A, 0xA581, 0xA58B, 0x2177, + 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7, + 0xA5DA, 0xA5DE, 0x2182, 0xA5E1, 0xA5F8, 0x01EF, 0xA5F9, 0xA5FC, 0x2187, + 0xA641, 0xA67D, 0x218B, 0xA681, 0xA68A, 0x21C8, 0xA68D, 0xA693, 0x21D2, + 0xA696, 0xA69B, 0x21D9, 0xA69E, 0xA69F, 0x21DF, 0xA6A1, 0xA6E4, 0x0207, + 0xA6E5, 0xA6FE, 0x21E1, 0xA741, 0xA77D, 0x21FB, 0xA781, 0xA79F, 0x2238, + 0xA7A1, 0xA7EF, 0x024B, 0xA7F0, 0xA7FE, 0x2257, 0xA841, 0xA87D, 0x2266, + 0xA881, 0xA89F, 0x22A3, 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, + 0xA8A8, 0xA8AF, 0x029F, 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA974, 0x22C2, + 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA7D, 0x22F6, 0xAA81, 0xAA9F, 0x2333, + 0xAAA1, 0xAAF3, 0x0353, 0xAAF4, 0xAAFE, 0x2352, 0xAB41, 0xAB7D, 0x235D, + 0xAB81, 0xAB9F, 0x239A, 0xABA1, 0xABF6, 0x03A6, 0xABF7, 0xABFA, 0x23B9, + 0xABFB, 0xABFD, 0x2472, 0xAC41, 0xAC7D, 0x23BD, 0xAC81, 0xAC97, 0x23FA, + 0xACA1, 0xACC1, 0x03FC, 0xACC2, 0xACD0, 0x2411, 0xACD1, 0xACF1, 0x041D, + 0xACF2, 0xACF6, 0x2420, 0xAD41, 0xAD7D, 0x2425, 0xADA1, 0xADB0, 0x2462, + 0xB0A1, 0xB0FE, 0x043E, 0xB1A1, 0xB1FE, 0x049C, 0xB2A1, 0xB2FE, 0x04FA, + 0xB3A1, 0xB3FE, 0x0558, 0xB4A1, 0xB4FE, 0x05B6, 0xB5A1, 0xB5FE, 0x0614, + 0xB6A1, 0xB6FE, 0x0672, 0xB7A1, 0xB7FE, 0x06D0, 0xB8A1, 0xB8FE, 0x072E, + 0xB9A1, 0xB9FE, 0x078C, 0xBAA1, 0xBAFE, 0x07EA, 0xBBA1, 0xBBFE, 0x0848, + 0xBCA1, 0xBCFE, 0x08A6, 0xBDA1, 0xBDFE, 0x0904, 0xBEA1, 0xBEFE, 0x0962, + 0xBFA1, 0xBFFE, 0x09C0, 0xC0A1, 0xC0FE, 0x0A1E, 0xC1A1, 0xC1FE, 0x0A7C, + 0xC2A1, 0xC2FE, 0x0ADA, 0xC3A1, 0xC3FE, 0x0B38, 0xC4A1, 0xC4FE, 0x0B96, + 0xC5A1, 0xC5FE, 0x0BF4, 0xC6A1, 0xC6FE, 0x0C52, 0xC7A1, 0xC7FE, 0x0CB0, + 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, 0xCBA1, 0xCBCF, 0x0DCA, + 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, 0xCBD6, 0xCBD6, 0x0E5E, + 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, 0xCBE8, 0xCBFE, 0x0E0E, + 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, 0xCDCF, 0xCDCF, 0x0D84, + 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, 0xCDE9, 0xCDFE, 0x0EC9, + 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, 0xCEAE, 0xCEFE, 0x0EEB, + 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, 0xCFFC, 0xCFFE, 0x0F96, + 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, 0xD0A3, 0xD0B7, 0x0F9A, + 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, 0xD0D0, 0xD0D0, 0x0E7C, + 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, 0xD0DE, 0xD0FE, 0x0FD2, + 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, 0xD1D5, 0xD1D5, 0x103C, + 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, 0xD1D9, 0xD1DA, 0x1028, + 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, 0xD1E2, 0xD1E2, 0x16A8, + 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, 0xD1E7, 0xD1E7, 0x102B, + 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, 0xD1ED, 0xD1ED, 0x1127, + 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, 0xD1F1, 0xD1F1, 0x102E, + 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, 0xD1F6, 0xD1F6, 0x112F, + 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, 0xD1FB, 0xD1FB, 0x1035, + 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, 0xD2A1, 0xD2A1, 0x1036, + 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, 0xD2A7, 0xD2AA, 0x113C, + 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, 0xD2AD, 0xD2AD, 0x1144, + 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, 0xD2B3, 0xD2BD, 0x103F, + 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, 0xD2C2, 0xD2C3, 0x11A1, + 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, 0xD2C6, 0xD2CA, 0x11A6, + 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, 0xD2CD, 0xD2CE, 0x11AD, + 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, 0xD2D8, 0xD2D8, 0x104F, + 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, 0xD2DE, 0xD2DF, 0x11C1, + 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, 0xD2E2, 0xD2E2, 0x11C6, + 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, 0xD2E5, 0xD2E8, 0x11D6, + 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, 0xD2EC, 0xD2EF, 0x1055, + 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, 0xD2F6, 0xD2F6, 0x1059, + 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, 0xD3A1, 0xD3FE, 0x1060, + 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, 0xD4E7, 0xD4FB, 0x1103, + 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, 0xD5A1, 0xD5A4, 0x111A, + 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, 0xD5AB, 0xD5AB, 0x102B, + 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, 0xD5AF, 0xD5FE, 0x1125, + 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, 0xD6B9, 0xD6CC, 0x118C, + 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, 0xD7A1, 0xD7CA, 0x11D1, + 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, 0xD7E4, 0xD7E4, 0x1918, + 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, 0xD9A1, 0xD9FE, 0x128B, + 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, 0xDBC5, 0xDBC5, 0x141F, + 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, 0xDBE5, 0xDBFE, 0x1389, + 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, 0xDCA6, 0xDCFE, 0x13A7, + 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, 0xDDA6, 0xDDD4, 0x1404, + 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, 0xDDF4, 0xDDF4, 0x1DB7, + 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, 0xDEFC, 0xDEFC, 0x15D0, + 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, 0xDFA1, 0xDFB2, 0x14B7, + 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, 0xDFE1, 0xDFE1, 0x14F2, + 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, 0xDFE9, 0xDFFE, 0x14FC, + 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, 0xE0F2, 0xE0FE, 0x1562, + 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, 0xE1AE, 0xE1EC, 0x157B, + 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, 0xE2A1, 0xE2FE, 0x15CB, + 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, 0xE3F6, 0xE3FE, 0x167D, + 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, 0xE4A9, 0xE4A9, 0x162E, + 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, 0xE5AE, 0xE5AE, 0x16F2, + 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, 0xE5B3, 0xE5B8, 0x16F1, + 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, 0xE5BB, 0xE5BC, 0x114D, + 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, 0xE5C5, 0xE5CD, 0x16FF, + 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, 0xE5D0, 0xE5D0, 0x1154, + 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, 0xE5D3, 0xE5D5, 0x170A, + 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, 0xE5FA, 0xE5FB, 0x115A, + 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, 0xE5FE, 0xE5FE, 0x115C, + 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, 0xE6A4, 0xE6A4, 0x1161, + 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, 0xE6A8, 0xE6AC, 0x1735, + 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, 0xE6AF, 0xE6B1, 0x1167, + 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, 0xE6B4, 0xE6B6, 0x173C, + 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, 0xE6BC, 0xE6BC, 0x116F, + 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, 0xE6C5, 0xE6C5, 0x1749, + 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, 0xE6CA, 0xE6CA, 0x1041, + 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, 0xE6D3, 0xE6D5, 0x1753, + 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, 0xE6D9, 0xE6D9, 0x1176, + 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, 0xE6DD, 0xE6DE, 0x175A, + 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, 0xE6E1, 0xE6E1, 0x1178, + 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, 0xE6E5, 0xE6E5, 0x1179, + 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, 0xE6E8, 0xE6E8, 0x117C, + 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, 0xE6EC, 0xE6EC, 0x192F, + 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, 0xE6F0, 0xE6F0, 0x1763, + 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, 0xE6F3, 0xE6F4, 0x1764, + 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, 0xE6F7, 0xE6F7, 0x1046, + 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, 0xE6FA, 0xE6FE, 0x1767, + 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, 0xE7A6, 0xE7A6, 0x1188, + 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, 0xE7AA, 0xE7AA, 0x118B, + 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, 0xE7AD, 0xE7AD, 0x118D, + 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, 0xE7B1, 0xE7BE, 0x1775, + 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, 0xE7C1, 0xE7C1, 0x1E67, + 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, 0xE7C7, 0xE7C7, 0x1193, + 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, 0xE7CC, 0xE7CC, 0x178B, + 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, 0xE7CF, 0xE7D0, 0x1197, + 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, 0xE7D4, 0xE7DE, 0x178F, + 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, 0xE7E4, 0xE7E4, 0x119D, + 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, 0xE7E7, 0xE7F6, 0x179F, + 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, 0xE8A1, 0xE8E6, 0x17B6, + 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, 0xE8F0, 0xE8F0, 0x11C9, + 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, 0xE8F7, 0xE8F7, 0x11CB, + 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, 0xE8FA, 0xE8FA, 0x1809, + 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, 0xE8FE, 0xE8FE, 0x11CD, + 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, 0xE9A8, 0xE9AB, 0x1812, + 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, 0xE9CC, 0xE9CC, 0x11D3, + 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, 0xE9F8, 0xE9FE, 0x185F, + 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, 0xEAC2, 0xEAE4, 0x1886, + 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, 0xEAF4, 0xEAF4, 0x1057, + 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, 0xEAF8, 0xEAFB, 0x18B9, + 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, 0xEAFE, 0xEAFE, 0x11E6, + 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, 0xEBA5, 0xEBA6, 0x18C1, + 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, 0xEBA9, 0xEBA9, 0x11EC, + 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, 0xEBBA, 0xEBBB, 0x11EE, + 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, 0xEBBE, 0xEBC0, 0x18D4, + 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, 0xEBC3, 0xEBC5, 0x18D7, + 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, 0xEBCC, 0xEBCC, 0x11F7, + 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, 0xEBD2, 0xEBD2, 0x15B0, + 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, 0xEBD9, 0xEBFE, 0x18E5, + 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, 0xECA7, 0xECA7, 0x1208, + 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, 0xECAB, 0xECAE, 0x1912, + 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, 0xECB2, 0xECB2, 0x105B, + 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, 0xECB6, 0xECB7, 0x1918, + 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, 0xECBA, 0xECBA, 0x1215, + 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, 0xECC2, 0xECC4, 0x1920, + 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, 0xECC7, 0xECC8, 0x1923, + 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, 0xECD5, 0xECD5, 0x121E, + 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, 0xECDF, 0xECE0, 0x1936, + 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, 0xECE4, 0xECE4, 0x1224, + 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, 0xECE9, 0xECF6, 0x193C, + 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, 0xECFA, 0xECFA, 0x122A, + 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, 0xEDA4, 0xEDED, 0x194F, + 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, 0xEEA1, 0xEEDA, 0x19A9, + 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, 0xEFA1, 0xEFFE, 0x1A06, + 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, 0xF2A1, 0xF2BC, 0x1B20, + 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, 0xF2FA, 0xF2FA, 0x168B, + 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, 0xF3B1, 0xF3B1, 0x105F, + 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, 0xF4A7, 0xF4A7, 0x1954, + 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, 0xF4EF, 0xF4FE, 0x1C25, + 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, 0xF6F4, 0xF6F4, 0x10B7, + 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, 0xF6F7, 0xF6FE, 0x1CE7, + 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, 0xF7B9, 0xF7C7, 0x1D06, + 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, 0xF7D3, 0xF7D3, 0x10F4, + 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, 0xF8DB, 0xF8DB, 0x1D94, + 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, 0xF8F1, 0xF8FE, 0x1D98, + 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, 0xFAA2, 0xFAA2, 0x0DE6, + 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, 0xFAE7, 0xFAFE, 0x1E47, + 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, 0xFCA9, 0xFCA9, 0x0EE7, + 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/UniKS-UCS2-H_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/UniKS-UCS2-H_1.cpp new file mode 100644 index 000000000000..8ed9fbe3f215 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/UniKS-UCS2-H_1.cpp @@ -0,0 +1,2808 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Korea1/cmaps_korea1.h" + +const uint16_t g_FXCMAP_UniKS_UCS2_H_1[8394 * 3] = { + 0x0020, 0x007E, 0x0001, 0x00A1, 0x00A1, 0x00D0, 0x00A4, 0x00A4, 0x00D6, + 0x00A7, 0x00A7, 0x009B, 0x00A8, 0x00A8, 0x006B, 0x00AA, 0x00AA, 0x029C, + 0x00AB, 0x00AB, 0x00B0, 0x00B0, 0x00B0, 0x008A, 0x00B1, 0x00B1, 0x0082, + 0x00B2, 0x00B3, 0x034B, 0x00B4, 0x00B4, 0x00C7, 0x00B6, 0x00B6, 0x00F4, + 0x00B8, 0x00B8, 0x00CE, 0x00B9, 0x00B9, 0x034A, 0x00BA, 0x00BA, 0x02A3, + 0x00BB, 0x00BB, 0x00B1, 0x00BC, 0x00BC, 0x02EF, 0x00BD, 0x00BD, 0x02EC, + 0x00BE, 0x00BE, 0x02F0, 0x00BF, 0x00BF, 0x00D1, 0x00C6, 0x00C6, 0x029A, + 0x00D0, 0x00D0, 0x029B, 0x00D7, 0x00D7, 0x0083, 0x00D8, 0x00D8, 0x02A1, + 0x00DE, 0x00DE, 0x02A4, 0x00DF, 0x00DF, 0x0300, 0x00E6, 0x00E6, 0x02F5, + 0x00F0, 0x00F0, 0x02F7, 0x00F7, 0x00F7, 0x0084, 0x00F8, 0x00F8, 0x02FE, + 0x00FE, 0x00FE, 0x0301, 0x0111, 0x0111, 0x02F6, 0x0126, 0x0126, 0x029D, + 0x0127, 0x0127, 0x02F8, 0x0131, 0x0131, 0x02F9, 0x0132, 0x0132, 0x029E, + 0x0133, 0x0133, 0x02FA, 0x0138, 0x0138, 0x02FB, 0x013F, 0x013F, 0x029F, + 0x0140, 0x0140, 0x02FC, 0x0141, 0x0141, 0x02A0, 0x0142, 0x0142, 0x02FD, + 0x0149, 0x0149, 0x0304, 0x014A, 0x014A, 0x02A6, 0x014B, 0x014B, 0x0303, + 0x0152, 0x0152, 0x02A2, 0x0153, 0x0153, 0x02FF, 0x0166, 0x0166, 0x02A5, + 0x0167, 0x0167, 0x0302, 0x02BC, 0x02BC, 0x2053, 0x02C7, 0x02C7, 0x00C9, + 0x02D8, 0x02D8, 0x00CA, 0x02D9, 0x02D9, 0x00CD, 0x02DA, 0x02DA, 0x00CC, + 0x02DB, 0x02DB, 0x00CF, 0x02DC, 0x02DC, 0x00C8, 0x02DD, 0x02DD, 0x00CB, + 0x0391, 0x03A1, 0x01D7, 0x03A3, 0x03A9, 0x01E8, 0x03B1, 0x03C1, 0x01EF, + 0x03C3, 0x03C9, 0x0200, 0x0401, 0x0401, 0x0402, 0x0410, 0x0415, 0x03FC, + 0x0416, 0x0435, 0x0403, 0x0436, 0x044F, 0x0424, 0x0451, 0x0451, 0x0423, + 0x2013, 0x2014, 0x006D, 0x2016, 0x2016, 0x006F, 0x2018, 0x2019, 0x0072, + 0x201B, 0x201B, 0x202E, 0x201C, 0x201D, 0x0074, 0x201F, 0x201F, 0x202D, + 0x2020, 0x2021, 0x00F5, 0x2022, 0x2022, 0x219F, 0x2025, 0x2026, 0x0069, + 0x2030, 0x2030, 0x00D8, 0x2032, 0x2033, 0x008B, 0x2034, 0x2034, 0x2186, + 0x2035, 0x2035, 0x246E, 0x2036, 0x2036, 0x246C, 0x2039, 0x203A, 0x21A4, + 0x203B, 0x203B, 0x009C, 0x203C, 0x203C, 0x223B, 0x2042, 0x2042, 0x2197, + 0x2074, 0x2074, 0x034D, 0x207A, 0x207B, 0x202F, 0x207C, 0x207C, 0x2038, + 0x207D, 0x207E, 0x203A, 0x207F, 0x207F, 0x034E, 0x2081, 0x2084, 0x034F, + 0x2103, 0x2103, 0x008D, 0x2109, 0x2109, 0x00D7, 0x2113, 0x2113, 0x024E, + 0x2116, 0x2116, 0x0102, 0x2121, 0x2121, 0x0107, 0x2122, 0x2122, 0x0104, + 0x2126, 0x2126, 0x0283, 0x212B, 0x212B, 0x008E, 0x2153, 0x2154, 0x02ED, + 0x215B, 0x215E, 0x02F1, 0x2160, 0x2169, 0x01CD, 0x2170, 0x2179, 0x01C3, + 0x2190, 0x2191, 0x00AB, 0x2192, 0x2192, 0x00AA, 0x2193, 0x2194, 0x00AD, + 0x2195, 0x2195, 0x00F7, 0x2196, 0x2196, 0x00FA, 0x2197, 0x2197, 0x00F8, + 0x2198, 0x2198, 0x00FB, 0x2199, 0x2199, 0x00F9, 0x21B0, 0x21B0, 0x22A4, + 0x21B1, 0x21B1, 0x22A1, 0x21B2, 0x21B2, 0x22A0, 0x21B3, 0x21B3, 0x22A5, + 0x21B4, 0x21B4, 0x22A3, 0x21BC, 0x21BC, 0x22B4, 0x21C0, 0x21C0, 0x22B5, + 0x21C4, 0x21C5, 0x22C0, 0x21CD, 0x21CD, 0x2270, 0x21CF, 0x21CF, 0x226F, + 0x21D0, 0x21D0, 0x226E, 0x21D1, 0x21D1, 0x2296, 0x21D2, 0x21D2, 0x00C3, + 0x21D3, 0x21D3, 0x2297, 0x21D4, 0x21D4, 0x00C4, 0x21E0, 0x21E0, 0x23E6, + 0x21E1, 0x21E1, 0x23E8, 0x21E2, 0x21E2, 0x23E7, 0x21E3, 0x21E3, 0x23E9, + 0x21E6, 0x21E6, 0x23EE, 0x21E7, 0x21E7, 0x23F0, 0x21E8, 0x21E8, 0x23EF, + 0x21E9, 0x21E9, 0x23F1, 0x2200, 0x2200, 0x00C5, 0x2202, 0x2202, 0x0097, + 0x2203, 0x2203, 0x00C6, 0x2206, 0x2206, 0x220B, 0x2207, 0x2207, 0x0098, + 0x2208, 0x2208, 0x00B8, 0x2209, 0x2209, 0x222D, 0x220B, 0x220B, 0x00B9, + 0x220C, 0x220C, 0x222E, 0x220F, 0x220F, 0x00D5, 0x2211, 0x2211, 0x00D4, + 0x2213, 0x2213, 0x2216, 0x221A, 0x221A, 0x00B2, 0x221D, 0x221D, 0x00B4, + 0x221E, 0x221E, 0x0088, 0x221F, 0x221F, 0x220D, 0x2220, 0x2220, 0x0094, + 0x2222, 0x2222, 0x2222, 0x2225, 0x2226, 0x220F, 0x2227, 0x2228, 0x00C0, + 0x2229, 0x2229, 0x00BF, 0x222A, 0x222A, 0x00BE, 0x222B, 0x222C, 0x00B6, + 0x222E, 0x222E, 0x00D3, 0x2234, 0x2234, 0x0089, 0x2235, 0x2235, 0x00B5, + 0x2236, 0x2236, 0x00D2, 0x2237, 0x2237, 0x2081, 0x223D, 0x223D, 0x00B3, + 0x2243, 0x2243, 0x2134, 0x2245, 0x2245, 0x2133, 0x2248, 0x2248, 0x2135, + 0x2250, 0x2250, 0x2223, 0x2251, 0x2251, 0x2213, 0x2252, 0x2252, 0x009A, + 0x2253, 0x2253, 0x2212, 0x225A, 0x225A, 0x2231, 0x2260, 0x2260, 0x0085, + 0x2261, 0x2261, 0x0099, 0x2262, 0x2262, 0x221E, 0x2264, 0x2265, 0x0086, + 0x2266, 0x2267, 0x2214, 0x226E, 0x226F, 0x2229, 0x2270, 0x2273, 0x2121, + 0x2276, 0x2277, 0x2129, 0x2279, 0x2279, 0x212B, 0x227A, 0x227B, 0x211B, + 0x2280, 0x2281, 0x211F, 0x2282, 0x2283, 0x00BC, 0x2284, 0x2284, 0x222C, + 0x2285, 0x2285, 0x222B, 0x2286, 0x2287, 0x00BA, 0x228A, 0x228A, 0x2126, + 0x228B, 0x228B, 0x2128, 0x2295, 0x2297, 0x2217, 0x22A3, 0x22A3, 0x2226, + 0x22A4, 0x22A4, 0x2137, 0x22A5, 0x22A5, 0x0095, 0x22BB, 0x22BC, 0x222F, + 0x22CE, 0x22CF, 0x211D, 0x22DA, 0x22DB, 0x212C, 0x22EE, 0x22EE, 0x2080, + 0x22EF, 0x22EF, 0x006A, 0x2306, 0x2306, 0x2232, 0x2312, 0x2312, 0x0096, + 0x2314, 0x2314, 0x221B, 0x2460, 0x246E, 0x02DD, 0x246F, 0x2473, 0x2257, + 0x2474, 0x2482, 0x033B, 0x2483, 0x2487, 0x2352, 0x249C, 0x24B5, 0x0321, + 0x24B6, 0x24CF, 0x20C4, 0x24D0, 0x24E9, 0x02C3, 0x2500, 0x2500, 0x0207, + 0x2501, 0x2501, 0x0212, 0x2502, 0x2502, 0x0208, 0x2503, 0x2503, 0x0213, + 0x250C, 0x250C, 0x0209, 0x250D, 0x250D, 0x022E, 0x250E, 0x250E, 0x022D, + 0x250F, 0x250F, 0x0214, 0x2510, 0x2510, 0x020A, 0x2511, 0x2511, 0x0228, + 0x2512, 0x2512, 0x0227, 0x2513, 0x2513, 0x0215, 0x2514, 0x2514, 0x020C, + 0x2515, 0x2515, 0x022C, 0x2516, 0x2516, 0x022B, 0x2517, 0x2517, 0x0217, + 0x2518, 0x2518, 0x020B, 0x2519, 0x2519, 0x022A, 0x251A, 0x251A, 0x0229, + 0x251B, 0x251B, 0x0216, 0x251C, 0x251C, 0x020D, 0x251D, 0x251D, 0x0222, + 0x251E, 0x251F, 0x022F, 0x2520, 0x2520, 0x021D, 0x2521, 0x2522, 0x0231, + 0x2523, 0x2523, 0x0218, 0x2524, 0x2524, 0x020F, 0x2525, 0x2525, 0x0224, + 0x2526, 0x2527, 0x0233, 0x2528, 0x2528, 0x021F, 0x2529, 0x252A, 0x0235, + 0x252B, 0x252B, 0x021A, 0x252C, 0x252C, 0x020E, 0x252D, 0x252E, 0x0237, + 0x252F, 0x252F, 0x021E, 0x2530, 0x2530, 0x0223, 0x2531, 0x2532, 0x0239, + 0x2533, 0x2533, 0x0219, 0x2534, 0x2534, 0x0210, 0x2535, 0x2536, 0x023B, + 0x2537, 0x2537, 0x0220, 0x2538, 0x2538, 0x0225, 0x2539, 0x253A, 0x023D, + 0x253B, 0x253B, 0x021B, 0x253C, 0x253C, 0x0211, 0x253D, 0x253E, 0x023F, + 0x253F, 0x253F, 0x0221, 0x2540, 0x2541, 0x0241, 0x2542, 0x2542, 0x0226, + 0x2543, 0x254A, 0x0243, 0x254B, 0x254B, 0x021C, 0x2592, 0x2592, 0x00E8, + 0x25A0, 0x25A0, 0x00A5, 0x25A1, 0x25A1, 0x00A4, 0x25A3, 0x25A3, 0x00E5, + 0x25A4, 0x25A5, 0x00E9, 0x25A6, 0x25A6, 0x00ED, 0x25A7, 0x25A7, 0x00EC, + 0x25A8, 0x25A8, 0x00EB, 0x25A9, 0x25A9, 0x00EE, 0x25B1, 0x25B1, 0x2220, + 0x25B2, 0x25B2, 0x00A7, 0x25B3, 0x25B3, 0x00A6, 0x25B5, 0x25B5, 0x224C, + 0x25B6, 0x25B6, 0x00DC, 0x25B7, 0x25B7, 0x00DB, 0x25B9, 0x25B9, 0x224D, + 0x25BC, 0x25BC, 0x00A9, 0x25BD, 0x25BD, 0x00A8, 0x25BF, 0x25BF, 0x224B, + 0x25C0, 0x25C0, 0x00DA, 0x25C1, 0x25C1, 0x00D9, 0x25C3, 0x25C3, 0x224E, + 0x25C6, 0x25C6, 0x00A3, 0x25C7, 0x25C7, 0x00A2, 0x25C8, 0x25C8, 0x00E4, + 0x25C9, 0x25C9, 0x00E3, 0x25CA, 0x25CA, 0x2253, 0x25CB, 0x25CB, 0x009F, + 0x25CC, 0x25CC, 0x21BF, 0x25CE, 0x25CE, 0x00A1, 0x25CF, 0x25CF, 0x00A0, + 0x25D0, 0x25D1, 0x00E6, 0x25E6, 0x25E6, 0x2247, 0x25EF, 0x25EF, 0x21B9, + 0x2605, 0x2605, 0x009E, 0x2606, 0x2606, 0x009D, 0x260E, 0x260E, 0x00F1, + 0x260F, 0x260F, 0x00F0, 0x261C, 0x261C, 0x00F2, 0x261D, 0x261D, 0x2406, + 0x261E, 0x261E, 0x00F3, 0x261F, 0x261F, 0x2407, 0x262F, 0x262F, 0x21D8, + 0x2640, 0x2640, 0x0093, 0x2642, 0x2642, 0x0092, 0x2660, 0x2661, 0x00DE, + 0x2663, 0x2663, 0x00E2, 0x2664, 0x2664, 0x00DD, 0x2665, 0x2665, 0x00E0, + 0x2667, 0x2667, 0x00E1, 0x2668, 0x2668, 0x00EF, 0x2669, 0x266A, 0x00FD, + 0x266C, 0x266C, 0x00FF, 0x266D, 0x266D, 0x00FC, 0x266F, 0x266F, 0x2192, + 0x2716, 0x2716, 0x21B7, 0x271A, 0x271A, 0x21B6, 0x273D, 0x273D, 0x219C, + 0x2756, 0x2756, 0x21BD, 0x2776, 0x277F, 0x21E1, 0x278A, 0x2793, 0x2096, + 0x3000, 0x3002, 0x0065, 0x3003, 0x3003, 0x006C, 0x3008, 0x3011, 0x0078, + 0x3012, 0x3012, 0x21FC, 0x3013, 0x3013, 0x00AF, 0x3014, 0x3015, 0x0076, + 0x3016, 0x3019, 0x201B, 0x301E, 0x301F, 0x246A, 0x3020, 0x3020, 0x21DF, + 0x3036, 0x3036, 0x21FD, 0x3041, 0x3093, 0x0353, 0x30A1, 0x30F6, 0x03A6, + 0x30FB, 0x30FB, 0x0068, 0x30FC, 0x30FC, 0x2472, 0x3131, 0x3163, 0x0166, + 0x3164, 0x3164, 0x0065, 0x3165, 0x318E, 0x0199, 0x3200, 0x321B, 0x0305, + 0x321C, 0x321C, 0x0101, 0x3231, 0x3231, 0x2254, 0x3239, 0x3239, 0x2255, + 0x3260, 0x327B, 0x02A7, 0x327F, 0x327F, 0x0100, 0x328A, 0x328F, 0x2455, + 0x3290, 0x3290, 0x2454, 0x3294, 0x3294, 0x2378, 0x329E, 0x329E, 0x2239, + 0x32A5, 0x32A5, 0x2388, 0x3380, 0x3384, 0x0273, 0x3388, 0x3389, 0x0264, + 0x338A, 0x338C, 0x0286, 0x338D, 0x338F, 0x0260, 0x3390, 0x3394, 0x027E, + 0x3395, 0x3397, 0x024B, 0x3398, 0x3398, 0x024F, 0x3399, 0x33A2, 0x0255, + 0x33A3, 0x33A6, 0x0251, 0x33A7, 0x33A8, 0x0267, 0x33A9, 0x33AC, 0x028F, + 0x33AD, 0x33AF, 0x028B, 0x33B0, 0x33B9, 0x0269, 0x33BA, 0x33BF, 0x0278, + 0x33C0, 0x33C1, 0x0284, 0x33C2, 0x33C2, 0x0105, 0x33C3, 0x33C3, 0x0296, + 0x33C4, 0x33C4, 0x0250, 0x33C5, 0x33C5, 0x028A, 0x33C6, 0x33C6, 0x0299, + 0x33C7, 0x33C7, 0x0103, 0x33C8, 0x33C8, 0x0266, 0x33C9, 0x33C9, 0x0297, + 0x33CA, 0x33CA, 0x025F, 0x33CB, 0x33CB, 0x2256, 0x33CF, 0x33CF, 0x0263, + 0x33D0, 0x33D0, 0x0294, 0x33D3, 0x33D3, 0x0295, 0x33D6, 0x33D6, 0x0289, + 0x33D8, 0x33D8, 0x0106, 0x33DB, 0x33DB, 0x028E, 0x33DC, 0x33DC, 0x0298, + 0x33DD, 0x33DD, 0x0293, 0x4E00, 0x4E00, 0x193C, 0x4E01, 0x4E01, 0x1A30, + 0x4E03, 0x4E03, 0x1CC4, 0x4E07, 0x4E07, 0x123E, 0x4E08, 0x4E08, 0x1986, + 0x4E09, 0x4E09, 0x14C8, 0x4E0A, 0x4E0A, 0x14D3, 0x4E0B, 0x4E0B, 0x1DC0, + 0x4E0D, 0x4E0D, 0x13F5, 0x4E11, 0x4E11, 0x1C78, 0x4E14, 0x4E14, 0x1B81, + 0x4E15, 0x4E15, 0x143D, 0x4E16, 0x4E16, 0x1574, 0x4E18, 0x4E18, 0x0F35, + 0x4E19, 0x4E19, 0x13B1, 0x4E1E, 0x4E1E, 0x1632, 0x4E2D, 0x4E2D, 0x1B0A, + 0x4E32, 0x4E32, 0x0EDA, 0x4E38, 0x4E38, 0x1ECA, 0x4E39, 0x4E39, 0x1060, + 0x4E3B, 0x4E3B, 0x1ACC, 0x4E42, 0x4E42, 0x178D, 0x4E43, 0x4E43, 0x103A, + 0x4E45, 0x4E45, 0x0F36, 0x4E4B, 0x4E4B, 0x1B1E, 0x4E4D, 0x4E4D, 0x1479, + 0x4E4E, 0x4E4E, 0x1E78, 0x4E4F, 0x4E4F, 0x1DBE, 0x4E56, 0x4E56, 0x0F0F, + 0x4E58, 0x4E58, 0x1633, 0x4E59, 0x4E59, 0x18EC, 0x4E5D, 0x4E5D, 0x0F37, + 0x4E5E, 0x4E5E, 0x0E1D, 0x4E5F, 0x4E5F, 0x16E6, 0x4E6B, 0x4E6B, 0x0DAC, + 0x4E6D, 0x4E6D, 0x10E9, 0x4E73, 0x4E73, 0x18A5, 0x4E76, 0x4E76, 0x13E4, + 0x4E77, 0x4E77, 0x14C3, 0x4E7E, 0x4E7E, 0x0E11, 0x4E82, 0x4E82, 0x1125, + 0x4E86, 0x4E86, 0x11C7, 0x4E88, 0x4E88, 0x172E, 0x4E8B, 0x4E8B, 0x147A, + 0x4E8C, 0x4E8C, 0x190D, 0x4E8E, 0x4E8E, 0x1835, 0x4E90, 0x4E90, 0x186C, + 0x4E91, 0x4E91, 0x185E, 0x4E92, 0x4E92, 0x1E79, 0x4E94, 0x4E94, 0x17A1, + 0x4E95, 0x4E95, 0x1A31, 0x4E98, 0x4E98, 0x0FDA, 0x4E9B, 0x4E9B, 0x147B, + 0x4E9E, 0x4E9E, 0x168F, 0x4EA1, 0x4EA1, 0x1258, 0x4EA2, 0x4EA2, 0x1DF6, + 0x4EA4, 0x4EA4, 0x0F1C, 0x4EA5, 0x4EA5, 0x1E05, 0x4EA6, 0x4EA6, 0x173B, + 0x4EA8, 0x4EA8, 0x1E5B, 0x4EAB, 0x4EAB, 0x1E1E, 0x4EAC, 0x4EAC, 0x0E4C, + 0x4EAD, 0x4EAD, 0x1A32, 0x4EAE, 0x4EAE, 0x114B, 0x4EB6, 0x4EB6, 0x1061, + 0x4EBA, 0x4EBA, 0x192B, 0x4EC0, 0x4EC0, 0x168B, 0x4EC1, 0x4EC1, 0x192C, + 0x4EC4, 0x4EC4, 0x1CA3, 0x4EC7, 0x4EC7, 0x0F38, 0x4ECA, 0x4ECA, 0x0FC6, + 0x4ECB, 0x4ECB, 0x0DE8, 0x4ECD, 0x4ECD, 0x194F, 0x4ED4, 0x4ED4, 0x1953, + 0x4ED5, 0x4ED5, 0x147C, 0x4ED6, 0x4ED6, 0x1CD4, 0x4ED7, 0x4ED7, 0x1987, + 0x4ED8, 0x4ED8, 0x13F6, 0x4ED9, 0x4ED9, 0x152A, 0x4EDD, 0x4EDD, 0x10EB, + 0x4EDF, 0x4EDF, 0x1BEC, 0x4EE3, 0x4EE3, 0x109A, 0x4EE4, 0x4EE4, 0x1189, + 0x4EE5, 0x4EE5, 0x190E, 0x4EF0, 0x4EF0, 0x16C9, 0x4EF2, 0x4EF2, 0x1B0B, + 0x4EF6, 0x4EF6, 0x0E12, 0x4EF7, 0x4EF7, 0x0DE9, 0x4EFB, 0x4EFB, 0x1945, + 0x4F01, 0x4F01, 0x0FDE, 0x4F09, 0x4F09, 0x1DF7, 0x4F0A, 0x4F0A, 0x190F, + 0x4F0B, 0x4F0B, 0x0FD3, 0x4F0D, 0x4F0D, 0x17A2, 0x4F0E, 0x4F0E, 0x0FDF, + 0x4F0F, 0x4F0F, 0x13D2, 0x4F10, 0x4F10, 0x138D, 0x4F11, 0x4F11, 0x1F45, + 0x4F2F, 0x4F2F, 0x137C, 0x4F34, 0x4F34, 0x1329, 0x4F36, 0x4F36, 0x118A, + 0x4F38, 0x4F38, 0x1667, 0x4F3A, 0x4F3A, 0x147D, 0x4F3C, 0x4F3C, 0x147E, + 0x4F3D, 0x4F3D, 0x0D6C, 0x4F43, 0x4F43, 0x19F3, 0x4F46, 0x4F46, 0x1062, + 0x4F47, 0x4F47, 0x19BF, 0x4F48, 0x4F48, 0x1D78, 0x4F4D, 0x4F4D, 0x188C, + 0x4F4E, 0x4F4E, 0x19C0, 0x4F4F, 0x4F4F, 0x1ACD, 0x4F50, 0x4F50, 0x1AC6, + 0x4F51, 0x4F51, 0x1836, 0x4F55, 0x4F55, 0x1DC1, 0x4F59, 0x4F59, 0x172F, + 0x4F5A, 0x4F5A, 0x193D, 0x4F5B, 0x4F5B, 0x1433, 0x4F5C, 0x4F5C, 0x196D, + 0x4F69, 0x4F69, 0x1D4E, 0x4F6F, 0x4F6F, 0x16F7, 0x4F70, 0x4F70, 0x137D, + 0x4F73, 0x4F73, 0x0D6D, 0x4F76, 0x4F76, 0x101F, 0x4F7A, 0x4F7A, 0x19F4, + 0x4F7E, 0x4F7E, 0x193E, 0x4F7F, 0x4F7F, 0x147F, 0x4F81, 0x4F81, 0x1668, + 0x4F83, 0x4F83, 0x0D94, 0x4F84, 0x4F84, 0x1B67, 0x4F86, 0x4F86, 0x1144, + 0x4F88, 0x4F88, 0x1CA8, 0x4F8A, 0x4F8A, 0x0EFF, 0x4F8B, 0x4F8B, 0x119A, + 0x4F8D, 0x4F8D, 0x163C, 0x4F8F, 0x4F8F, 0x1ACE, 0x4F91, 0x4F91, 0x18A6, + 0x4F96, 0x4F96, 0x11F2, 0x4F98, 0x4F98, 0x1B82, 0x4F9B, 0x4F9B, 0x0ECA, + 0x4F9D, 0x4F9D, 0x18FA, 0x4FAE, 0x4FAE, 0x129C, 0x4FAF, 0x4FAF, 0x1F1E, + 0x4FB5, 0x4FB5, 0x1CC7, 0x4FB6, 0x4FB6, 0x1158, 0x4FBF, 0x4FBF, 0x1D5E, + 0x4FC2, 0x4FC2, 0x0E79, 0x4FC3, 0x4FC3, 0x1C49, 0x4FC4, 0x4FC4, 0x1690, + 0x4FC9, 0x4FC9, 0x17A3, 0x4FCA, 0x4FCA, 0x1AF6, 0x4FCE, 0x4FCE, 0x1A7E, + 0x4FD1, 0x4FD1, 0x181E, 0x4FD3, 0x4FD3, 0x0E4D, 0x4FD4, 0x4FD4, 0x1E36, + 0x4FD7, 0x4FD7, 0x15A1, 0x4FDA, 0x4FDA, 0x1205, 0x4FDD, 0x4FDD, 0x13C2, + 0x4FDF, 0x4FDF, 0x1480, 0x4FE0, 0x4FE0, 0x1E4F, 0x4FE1, 0x4FE1, 0x1669, + 0x4FEE, 0x4FEE, 0x15BF, 0x4FEF, 0x4FEF, 0x13F7, 0x4FF1, 0x4FF1, 0x0F39, + 0x4FF3, 0x4FF3, 0x136A, 0x4FF5, 0x4FF5, 0x1D98, 0x4FF8, 0x4FF8, 0x13E5, + 0x4FFA, 0x4FFA, 0x1725, 0x5002, 0x5002, 0x13B2, 0x5006, 0x5006, 0x114C, + 0x5009, 0x5009, 0x1BB4, 0x500B, 0x500B, 0x0DEA, 0x500D, 0x500D, 0x1369, + 0x5011, 0x5011, 0x12E4, 0x5012, 0x5012, 0x10AD, 0x5016, 0x5016, 0x1E19, + 0x5019, 0x5019, 0x1F1F, 0x501A, 0x501A, 0x18FB, 0x501C, 0x501C, 0x1BDE, + 0x501E, 0x501E, 0x0E4E, 0x501F, 0x501F, 0x1B83, 0x5021, 0x5021, 0x1BB5, + 0x5023, 0x5023, 0x134D, 0x5024, 0x5024, 0x1CA9, 0x5026, 0x5026, 0x0F81, + 0x5027, 0x5027, 0x1AB5, 0x5028, 0x5028, 0x0E01, 0x502A, 0x502A, 0x178E, + 0x502B, 0x502B, 0x11F3, 0x502C, 0x502C, 0x1CE2, 0x502D, 0x502D, 0x17F3, + 0x503B, 0x503B, 0x16E7, 0x5043, 0x5043, 0x171D, 0x5047, 0x5047, 0x0D6E, + 0x5048, 0x5048, 0x0E2B, 0x5049, 0x5049, 0x188D, 0x504F, 0x504F, 0x1D5F, + 0x5055, 0x5055, 0x1E06, 0x505A, 0x505A, 0x1ACF, 0x505C, 0x505C, 0x1A33, + 0x5065, 0x5065, 0x0E13, 0x5074, 0x5074, 0x1CA2, 0x5075, 0x5075, 0x1A34, + 0x5076, 0x5076, 0x1837, 0x5078, 0x5078, 0x1D29, 0x5080, 0x5080, 0x0F10, + 0x5085, 0x5085, 0x13F8, 0x508D, 0x508D, 0x134E, 0x5091, 0x5091, 0x0E1E, + 0x5098, 0x5098, 0x14B7, 0x5099, 0x5099, 0x143E, 0x50AC, 0x50AC, 0x1C5E, + 0x50AD, 0x50AD, 0x181F, 0x50B2, 0x50B2, 0x17A4, 0x50B3, 0x50B3, 0x19F5, + 0x50B5, 0x50B5, 0x1BCA, 0x50B7, 0x50B7, 0x14D4, 0x50BE, 0x50BE, 0x0E4F, + 0x50C5, 0x50C5, 0x0FB7, 0x50C9, 0x50C9, 0x1C09, 0x50CA, 0x50CA, 0x152B, + 0x50CF, 0x50CF, 0x14D5, 0x50D1, 0x50D1, 0x0F1D, 0x50D5, 0x50D5, 0x13D3, + 0x50D6, 0x50D6, 0x1F63, 0x50DA, 0x50DA, 0x11C8, 0x50DE, 0x50DE, 0x188E, + 0x50E5, 0x50E5, 0x17FC, 0x50E7, 0x50E7, 0x1634, 0x50ED, 0x50ED, 0x1BAA, + 0x50F9, 0x50F9, 0x0D6F, 0x50FB, 0x50FB, 0x139C, 0x50FF, 0x50FF, 0x1481, + 0x5100, 0x5100, 0x18FC, 0x5101, 0x5101, 0x1AF7, 0x5104, 0x5104, 0x1718, + 0x5106, 0x5106, 0x0E50, 0x5109, 0x5109, 0x0E21, 0x5112, 0x5112, 0x18A7, + 0x511F, 0x511F, 0x14D6, 0x5121, 0x5121, 0x11BF, 0x512A, 0x512A, 0x1838, + 0x5132, 0x5132, 0x19C1, 0x5137, 0x5137, 0x1159, 0x513A, 0x513A, 0x1025, + 0x513C, 0x513C, 0x1726, 0x5140, 0x5140, 0x17C9, 0x5141, 0x5141, 0x18D7, + 0x5143, 0x5143, 0x186F, 0x5144, 0x5144, 0x1E5C, 0x5145, 0x5145, 0x1C8A, + 0x5146, 0x5146, 0x1A7F, 0x5147, 0x5147, 0x1F4D, 0x5148, 0x5148, 0x152C, + 0x5149, 0x5149, 0x0F00, 0x514B, 0x514B, 0x0FB0, 0x514C, 0x514C, 0x1D07, + 0x514D, 0x514D, 0x127F, 0x514E, 0x514E, 0x1D19, 0x5152, 0x5152, 0x1691, + 0x515C, 0x515C, 0x10FC, 0x5162, 0x5162, 0x0FDB, 0x5165, 0x5165, 0x194D, + 0x5167, 0x5167, 0x103B, 0x5168, 0x5168, 0x19F6, 0x5169, 0x5169, 0x114D, + 0x516A, 0x516A, 0x18A8, 0x516B, 0x516B, 0x1D4B, 0x516C, 0x516C, 0x0ECB, + 0x516D, 0x516D, 0x11EF, 0x516E, 0x516E, 0x1E6F, 0x5171, 0x5171, 0x0ECC, + 0x5175, 0x5175, 0x13B3, 0x5176, 0x5176, 0x0FE0, 0x5177, 0x5177, 0x0F3A, + 0x5178, 0x5178, 0x19F7, 0x517C, 0x517C, 0x0E46, 0x5180, 0x5180, 0x0FE1, + 0x5186, 0x5186, 0x172D, 0x518A, 0x518A, 0x1BD6, 0x518D, 0x518D, 0x19AA, + 0x5192, 0x5192, 0x129D, 0x5195, 0x5195, 0x1280, 0x5197, 0x5197, 0x1820, + 0x51A0, 0x51A0, 0x0EEB, 0x51A5, 0x51A5, 0x128C, 0x51AA, 0x51AA, 0x127D, + 0x51AC, 0x51AC, 0x10EC, 0x51B6, 0x51B6, 0x16E8, 0x51B7, 0x51B7, 0x1148, + 0x51BD, 0x51BD, 0x117D, 0x51C4, 0x51C4, 0x1BDA, 0x51C6, 0x51C6, 0x1AF8, + 0x51C9, 0x51C9, 0x114E, 0x51CB, 0x51CB, 0x1A80, 0x51CC, 0x51CC, 0x11FF, + 0x51CD, 0x51CD, 0x10ED, 0x51DC, 0x51DC, 0x11FE, 0x51DD, 0x51DD, 0x18F6, + 0x51DE, 0x51DE, 0x1F64, 0x51E1, 0x51E1, 0x1391, 0x51F0, 0x51F0, 0x1EE0, + 0x51F1, 0x51F1, 0x0DEB, 0x51F6, 0x51F6, 0x1F4E, 0x51F8, 0x51F8, 0x1BFF, + 0x51F9, 0x51F9, 0x17FD, 0x51FA, 0x51FA, 0x1C87, 0x51FD, 0x51FD, 0x1DE3, + 0x5200, 0x5200, 0x10AE, 0x5203, 0x5203, 0x192D, 0x5206, 0x5206, 0x1420, + 0x5207, 0x5207, 0x1A1C, 0x5208, 0x5208, 0x178F, 0x520A, 0x520A, 0x0D95, + 0x520E, 0x520E, 0x12E5, 0x5211, 0x5211, 0x1E5D, 0x5217, 0x5217, 0x117E, + 0x521D, 0x521D, 0x1C2E, 0x5224, 0x5224, 0x1D42, 0x5225, 0x5225, 0x13AD, + 0x5229, 0x5229, 0x1206, 0x522A, 0x522A, 0x14B8, 0x522E, 0x522E, 0x0EFB, + 0x5230, 0x5230, 0x10AF, 0x5236, 0x5236, 0x1A67, 0x5237, 0x5237, 0x15B9, + 0x5238, 0x5238, 0x0F82, 0x5239, 0x5239, 0x1BA5, 0x523A, 0x523A, 0x1954, + 0x523B, 0x523B, 0x0D89, 0x5243, 0x5243, 0x1C25, 0x5247, 0x5247, 0x1CC0, + 0x524A, 0x524A, 0x14B5, 0x524B, 0x524B, 0x0FB1, 0x524C, 0x524C, 0x112D, + 0x524D, 0x524D, 0x19F8, 0x5254, 0x5254, 0x1BDF, 0x5256, 0x5256, 0x13F9, + 0x525B, 0x525B, 0x0DD0, 0x525D, 0x525D, 0x1316, 0x5261, 0x5261, 0x1557, + 0x5269, 0x5269, 0x1950, 0x526A, 0x526A, 0x19F9, 0x526F, 0x526F, 0x13FA, + 0x5272, 0x5272, 0x1DE1, 0x5275, 0x5275, 0x1BB6, 0x527D, 0x527D, 0x1D99, + 0x527F, 0x527F, 0x1C2F, 0x5283, 0x5283, 0x1F0C, 0x5287, 0x5287, 0x0FB2, + 0x5288, 0x5288, 0x139D, 0x5289, 0x5289, 0x11E1, 0x528D, 0x528D, 0x0E22, + 0x5291, 0x5291, 0x1A68, 0x5292, 0x5292, 0x0E23, 0x529B, 0x529B, 0x116A, + 0x529F, 0x529F, 0x0ECD, 0x52A0, 0x52A0, 0x0D70, 0x52A3, 0x52A3, 0x117F, + 0x52A4, 0x52A4, 0x0FB8, 0x52A9, 0x52A9, 0x1A81, 0x52AA, 0x52AA, 0x1049, + 0x52AB, 0x52AB, 0x0E28, 0x52BE, 0x52BE, 0x1E17, 0x52C1, 0x52C1, 0x0E51, + 0x52C3, 0x52C3, 0x1342, 0x52C5, 0x52C5, 0x1CC1, 0x52C7, 0x52C7, 0x1821, + 0x52C9, 0x52C9, 0x1281, 0x52CD, 0x52CD, 0x0E52, 0x52D2, 0x52D2, 0x11FC, + 0x52D5, 0x52D5, 0x10EE, 0x52D6, 0x52D6, 0x1855, 0x52D8, 0x52D8, 0x0DB6, + 0x52D9, 0x52D9, 0x12CC, 0x52DB, 0x52DB, 0x1F2B, 0x52DD, 0x52DD, 0x1635, + 0x52DE, 0x52DE, 0x119F, 0x52DF, 0x52DF, 0x129E, 0x52E2, 0x52E2, 0x1575, + 0x52E3, 0x52E3, 0x19DB, 0x52E4, 0x52E4, 0x0FB9, 0x52F3, 0x52F3, 0x1F2C, + 0x52F5, 0x52F5, 0x115A, 0x52F8, 0x52F8, 0x0F83, 0x52FA, 0x52FA, 0x196E, + 0x52FB, 0x52FB, 0x0FA9, 0x52FE, 0x52FE, 0x0F3B, 0x52FF, 0x52FF, 0x12F0, + 0x5305, 0x5305, 0x1D79, 0x5308, 0x5308, 0x1F4F, 0x530D, 0x530D, 0x1D7A, + 0x530F, 0x530F, 0x1D7B, 0x5310, 0x5310, 0x13D4, 0x5315, 0x5315, 0x143F, + 0x5316, 0x5316, 0x1EB7, 0x5317, 0x5317, 0x141F, 0x5319, 0x5319, 0x163D, + 0x5320, 0x5320, 0x1988, 0x5321, 0x5321, 0x0F01, 0x5323, 0x5323, 0x0DCA, + 0x532A, 0x532A, 0x1440, 0x532F, 0x532F, 0x1EF8, 0x5339, 0x5339, 0x1DB4, + 0x533F, 0x533F, 0x105C, 0x5340, 0x5340, 0x0F3C, 0x5341, 0x5341, 0x168C, + 0x5343, 0x5343, 0x1BED, 0x5344, 0x5344, 0x194E, 0x5347, 0x5347, 0x1636, + 0x5348, 0x5348, 0x17A5, 0x5349, 0x5349, 0x1F3A, 0x534A, 0x534A, 0x132A, + 0x534D, 0x534D, 0x123F, 0x5351, 0x5351, 0x1441, 0x5352, 0x5352, 0x1AB2, + 0x5353, 0x5353, 0x1CE3, 0x5354, 0x5354, 0x1E50, 0x5357, 0x5357, 0x1031, + 0x535A, 0x535A, 0x1317, 0x535C, 0x535C, 0x13D5, 0x535E, 0x535E, 0x13A7, + 0x5360, 0x5360, 0x1A24, 0x5366, 0x5366, 0x0F0C, 0x5368, 0x5368, 0x154A, + 0x536F, 0x536F, 0x12C0, 0x5370, 0x5370, 0x192E, 0x5371, 0x5371, 0x188F, + 0x5374, 0x5374, 0x0D8A, 0x5375, 0x5375, 0x1126, 0x5377, 0x5377, 0x0F84, + 0x537D, 0x537D, 0x1B0E, 0x537F, 0x537F, 0x0E53, 0x5384, 0x5384, 0x16DB, + 0x5393, 0x5393, 0x16D0, 0x5398, 0x5398, 0x1207, 0x539A, 0x539A, 0x1F20, + 0x539F, 0x539F, 0x1870, 0x53A0, 0x53A0, 0x1CA4, 0x53A5, 0x53A5, 0x0F8B, + 0x53A6, 0x53A6, 0x1DC2, 0x53AD, 0x53AD, 0x1765, 0x53BB, 0x53BB, 0x0E02, + 0x53C3, 0x53C3, 0x1BAB, 0x53C8, 0x53C8, 0x1839, 0x53C9, 0x53C9, 0x1B84, + 0x53CA, 0x53CA, 0x0FD4, 0x53CB, 0x53CB, 0x183A, 0x53CD, 0x53CD, 0x132B, + 0x53D4, 0x53D4, 0x15FC, 0x53D6, 0x53D6, 0x1C94, 0x53D7, 0x53D7, 0x15C0, + 0x53DB, 0x53DB, 0x132C, 0x53E1, 0x53E1, 0x1790, 0x53E2, 0x53E2, 0x1C53, + 0x53E3, 0x53E3, 0x0F3D, 0x53E4, 0x53E4, 0x0E91, 0x53E5, 0x53E5, 0x0F3E, + 0x53E9, 0x53E9, 0x0E92, 0x53EA, 0x53EA, 0x1B1F, 0x53EB, 0x53EB, 0x0F9A, + 0x53EC, 0x53EC, 0x157C, 0x53ED, 0x53ED, 0x1D4C, 0x53EF, 0x53EF, 0x0D71, + 0x53F0, 0x53F0, 0x1D08, 0x53F1, 0x53F1, 0x1B68, 0x53F2, 0x53F2, 0x1482, + 0x53F3, 0x53F3, 0x183B, 0x53F8, 0x53F8, 0x1483, 0x5403, 0x5403, 0x1F57, + 0x5404, 0x5404, 0x0D8B, 0x5408, 0x5408, 0x1DEF, 0x5409, 0x5409, 0x1020, + 0x540A, 0x540A, 0x19DC, 0x540C, 0x540C, 0x10EF, 0x540D, 0x540D, 0x128D, + 0x540E, 0x540E, 0x1F21, 0x540F, 0x540F, 0x1208, 0x5410, 0x5410, 0x1D1A, + 0x5411, 0x5411, 0x1E1F, 0x541B, 0x541B, 0x0F71, 0x541D, 0x541D, 0x121E, + 0x541F, 0x541F, 0x18ED, 0x5420, 0x5420, 0x1D6E, 0x5426, 0x5426, 0x13FB, + 0x5429, 0x5429, 0x1421, 0x542B, 0x542B, 0x1DE4, 0x5433, 0x5433, 0x17A7, + 0x5438, 0x5438, 0x1F5E, 0x5439, 0x5439, 0x1C95, 0x543B, 0x543B, 0x12E6, + 0x543C, 0x543C, 0x1F22, 0x543E, 0x543E, 0x17A6, 0x5442, 0x5442, 0x115B, + 0x5448, 0x5448, 0x1A35, 0x544A, 0x544A, 0x0E93, 0x5451, 0x5451, 0x1CF0, + 0x5468, 0x5468, 0x1AD3, 0x546A, 0x546A, 0x1AD2, 0x5471, 0x5471, 0x0E94, + 0x5473, 0x5473, 0x12F3, 0x5475, 0x5475, 0x0D72, 0x547B, 0x547B, 0x166A, + 0x547C, 0x547C, 0x1E7A, 0x547D, 0x547D, 0x128E, 0x5480, 0x5480, 0x19C2, + 0x5486, 0x5486, 0x1D7C, 0x548C, 0x548C, 0x1EB8, 0x548E, 0x548E, 0x0F3F, + 0x5490, 0x5490, 0x13FC, 0x54A4, 0x54A4, 0x1CD5, 0x54A8, 0x54A8, 0x1955, + 0x54AB, 0x54AB, 0x1B20, 0x54AC, 0x54AC, 0x0F1E, 0x54B3, 0x54B3, 0x1E07, + 0x54B8, 0x54B8, 0x1DE5, 0x54BD, 0x54BD, 0x192F, 0x54C0, 0x54C0, 0x16D1, + 0x54C1, 0x54C1, 0x1DA6, 0x54C4, 0x54C4, 0x1EAD, 0x54C8, 0x54C8, 0x1DF0, + 0x54C9, 0x54C9, 0x19AB, 0x54E1, 0x54E1, 0x1871, 0x54E5, 0x54E5, 0x0D73, + 0x54E8, 0x54E8, 0x1C30, 0x54ED, 0x54ED, 0x0EB7, 0x54EE, 0x54EE, 0x1F11, + 0x54F2, 0x54F2, 0x1C00, 0x54FA, 0x54FA, 0x1D7D, 0x5504, 0x5504, 0x1D4F, + 0x5506, 0x5506, 0x1484, 0x5507, 0x5507, 0x1B44, 0x550E, 0x550E, 0x1209, + 0x5510, 0x5510, 0x108F, 0x551C, 0x551C, 0x1251, 0x552F, 0x552F, 0x18A9, + 0x5531, 0x5531, 0x1BB7, 0x5535, 0x5535, 0x16BD, 0x553E, 0x553E, 0x1CD6, + 0x5544, 0x5544, 0x1CE4, 0x5546, 0x5546, 0x14D7, 0x554F, 0x554F, 0x12E7, + 0x5553, 0x5553, 0x0E7A, 0x5556, 0x5556, 0x1079, 0x555E, 0x555E, 0x1692, + 0x5563, 0x5563, 0x1DE6, 0x557C, 0x557C, 0x1A69, 0x5580, 0x5580, 0x0DFB, + 0x5584, 0x5584, 0x152D, 0x5586, 0x5586, 0x1C01, 0x5587, 0x5587, 0x1116, + 0x5589, 0x5589, 0x1F23, 0x558A, 0x558A, 0x1DE7, 0x5598, 0x5598, 0x1BEE, + 0x5599, 0x5599, 0x1F3B, 0x559A, 0x559A, 0x1ECB, 0x559C, 0x559C, 0x1F65, + 0x559D, 0x559D, 0x0DAD, 0x55A7, 0x55A7, 0x1F36, 0x55A9, 0x55A9, 0x18AA, + 0x55AA, 0x55AA, 0x14D8, 0x55AB, 0x55AB, 0x1024, 0x55AC, 0x55AC, 0x0F1F, + 0x55AE, 0x55AE, 0x1063, 0x55C5, 0x55C5, 0x1F24, 0x55C7, 0x55C7, 0x14F5, + 0x55D4, 0x55D4, 0x1B45, 0x55DA, 0x55DA, 0x17A8, 0x55DC, 0x55DC, 0x0FE2, + 0x55DF, 0x55DF, 0x1B85, 0x55E3, 0x55E3, 0x1485, 0x55E4, 0x55E4, 0x1CAA, + 0x55FD, 0x55FD, 0x15C1, 0x55FE, 0x55FE, 0x1AD4, 0x5606, 0x5606, 0x1CF1, + 0x5609, 0x5609, 0x0D74, 0x5614, 0x5614, 0x0F40, 0x5617, 0x5617, 0x14D9, + 0x562F, 0x562F, 0x157D, 0x5632, 0x5632, 0x1A82, 0x5634, 0x5634, 0x1C96, + 0x5636, 0x5636, 0x163E, 0x5653, 0x5653, 0x1E27, 0x5668, 0x5668, 0x0FE3, + 0x566B, 0x566B, 0x1F66, 0x5674, 0x5674, 0x1422, 0x5686, 0x5686, 0x1F12, + 0x56A5, 0x56A5, 0x1744, 0x56AC, 0x56AC, 0x1467, 0x56AE, 0x56AE, 0x1E20, + 0x56B4, 0x56B4, 0x1727, 0x56BC, 0x56BC, 0x196F, 0x56CA, 0x56CA, 0x1038, + 0x56CD, 0x56CD, 0x1F67, 0x56D1, 0x56D1, 0x1C4A, 0x56DA, 0x56DA, 0x15C2, + 0x56DB, 0x56DB, 0x1486, 0x56DE, 0x56DE, 0x1EF9, 0x56E0, 0x56E0, 0x1930, + 0x56F0, 0x56F0, 0x0EBE, 0x56F9, 0x56F9, 0x118B, 0x56FA, 0x56FA, 0x0E95, + 0x5703, 0x5703, 0x1D7E, 0x5704, 0x5704, 0x170E, 0x5708, 0x5708, 0x0F85, + 0x570B, 0x570B, 0x0F6B, 0x570D, 0x570D, 0x1890, 0x5712, 0x5712, 0x1873, + 0x5713, 0x5713, 0x1872, 0x5716, 0x5716, 0x10B0, 0x5718, 0x5718, 0x1064, + 0x571F, 0x571F, 0x1D1B, 0x5728, 0x5728, 0x19AC, 0x572D, 0x572D, 0x0F9B, + 0x5730, 0x5730, 0x1B21, 0x573B, 0x573B, 0x0FE4, 0x5740, 0x5740, 0x1B22, + 0x5742, 0x5742, 0x1D43, 0x5747, 0x5747, 0x0FAA, 0x574A, 0x574A, 0x134F, + 0x574D, 0x574D, 0x107A, 0x574E, 0x574E, 0x0DB7, 0x5750, 0x5750, 0x1AC7, + 0x5751, 0x5751, 0x0DFD, 0x5761, 0x5761, 0x1D32, 0x5764, 0x5764, 0x0EBF, + 0x5766, 0x5766, 0x1CF2, 0x576A, 0x576A, 0x1D69, 0x576E, 0x576E, 0x109C, + 0x5770, 0x5770, 0x0E54, 0x5775, 0x5775, 0x0F41, 0x577C, 0x577C, 0x1CE5, + 0x5782, 0x5782, 0x15C3, 0x5788, 0x5788, 0x109B, 0x578B, 0x578B, 0x1E5E, + 0x5793, 0x5793, 0x1E08, 0x57A0, 0x57A0, 0x18E5, 0x57A2, 0x57A2, 0x0F42, + 0x57A3, 0x57A3, 0x1874, 0x57C3, 0x57C3, 0x16D2, 0x57C7, 0x57C7, 0x1822, + 0x57C8, 0x57C8, 0x1AF9, 0x57CB, 0x57CB, 0x1264, 0x57CE, 0x57CE, 0x1562, + 0x57DF, 0x57DF, 0x173C, 0x57E0, 0x57E0, 0x13FD, 0x57F0, 0x57F0, 0x1BCB, + 0x57F4, 0x57F4, 0x1658, 0x57F7, 0x57F7, 0x1B78, 0x57F9, 0x57F9, 0x136B, + 0x57FA, 0x57FA, 0x0FE5, 0x57FC, 0x57FC, 0x0FE6, 0x5800, 0x5800, 0x0F77, + 0x5802, 0x5802, 0x1090, 0x5805, 0x5805, 0x0E35, 0x5806, 0x5806, 0x1D23, + 0x5808, 0x5808, 0x0DD1, 0x5809, 0x5809, 0x18D3, 0x580A, 0x580A, 0x16A1, + 0x581E, 0x581E, 0x1C13, 0x5821, 0x5821, 0x13C3, 0x5824, 0x5824, 0x1A6A, + 0x5827, 0x5827, 0x1745, 0x582A, 0x582A, 0x0DB8, 0x582F, 0x582F, 0x17FE, + 0x5830, 0x5830, 0x171E, 0x5831, 0x5831, 0x13C4, 0x5834, 0x5834, 0x1989, + 0x5835, 0x5835, 0x10B1, 0x583A, 0x583A, 0x0E7B, 0x584A, 0x584A, 0x0F11, + 0x584B, 0x584B, 0x1772, 0x584F, 0x584F, 0x0DEC, 0x5851, 0x5851, 0x157E, + 0x5854, 0x5854, 0x1D00, 0x5857, 0x5857, 0x10B2, 0x5858, 0x5858, 0x1091, + 0x585A, 0x585A, 0x1C54, 0x585E, 0x585E, 0x14F2, 0x5861, 0x5861, 0x19FA, + 0x5862, 0x5862, 0x17A9, 0x5864, 0x5864, 0x1F2D, 0x5875, 0x5875, 0x1B46, + 0x5879, 0x5879, 0x1BAC, 0x587C, 0x587C, 0x19FB, 0x587E, 0x587E, 0x15FD, + 0x5883, 0x5883, 0x0E55, 0x5885, 0x5885, 0x14FD, 0x5889, 0x5889, 0x1823, + 0x5893, 0x5893, 0x12C1, 0x589C, 0x589C, 0x1C61, 0x589E, 0x589E, 0x1B13, + 0x589F, 0x589F, 0x1E28, 0x58A8, 0x58A8, 0x12E2, 0x58A9, 0x58A9, 0x10DF, + 0x58AE, 0x58AE, 0x1CD7, 0x58B3, 0x58B3, 0x1423, 0x58BA, 0x58BA, 0x17AA, + 0x58BB, 0x58BB, 0x198A, 0x58BE, 0x58BE, 0x0D96, 0x58C1, 0x58C1, 0x139E, + 0x58C5, 0x58C5, 0x17CA, 0x58C7, 0x58C7, 0x1065, 0x58CE, 0x58CE, 0x1F2E, + 0x58D1, 0x58D1, 0x1DCE, 0x58D3, 0x58D3, 0x16C5, 0x58D5, 0x58D5, 0x1E7B, + 0x58D8, 0x58D8, 0x11D4, 0x58D9, 0x58D9, 0x0F02, 0x58DE, 0x58DE, 0x0F12, + 0x58DF, 0x58DF, 0x11B8, 0x58E4, 0x58E4, 0x16F8, 0x58EB, 0x58EB, 0x1487, + 0x58EC, 0x58EC, 0x1946, 0x58EF, 0x58EF, 0x198B, 0x58F9, 0x58F9, 0x193F, + 0x58FA, 0x58FA, 0x1E7C, 0x58FB, 0x58FB, 0x14FE, 0x58FD, 0x58FD, 0x15C4, + 0x590F, 0x590F, 0x1DC3, 0x5914, 0x5914, 0x0FE7, 0x5915, 0x5915, 0x151B, + 0x5916, 0x5916, 0x17F7, 0x5919, 0x5919, 0x15FE, 0x591A, 0x591A, 0x105E, + 0x591C, 0x591C, 0x16E9, 0x5922, 0x5922, 0x12BD, 0x5927, 0x5927, 0x109D, + 0x5929, 0x5929, 0x1BEF, 0x592A, 0x592A, 0x1D09, 0x592B, 0x592B, 0x13FE, + 0x592D, 0x592D, 0x17FF, 0x592E, 0x592E, 0x16CA, 0x5931, 0x5931, 0x167E, + 0x5937, 0x5937, 0x1910, 0x593E, 0x593E, 0x1E51, 0x5944, 0x5944, 0x1728, + 0x5947, 0x5947, 0x0FE8, 0x5948, 0x5948, 0x103C, 0x5949, 0x5949, 0x13E6, + 0x594E, 0x594E, 0x0F9C, 0x594F, 0x594F, 0x1AD5, 0x5950, 0x5950, 0x1ECC, + 0x5951, 0x5951, 0x0E7C, 0x5954, 0x5954, 0x1424, 0x5955, 0x5955, 0x1E32, + 0x5957, 0x5957, 0x1D2A, 0x595A, 0x595A, 0x1E09, 0x5960, 0x5960, 0x19FC, + 0x5962, 0x5962, 0x1488, 0x5967, 0x5967, 0x17AB, 0x596A, 0x596A, 0x1CFA, + 0x596B, 0x596B, 0x18D8, 0x596C, 0x596C, 0x198C, 0x596D, 0x596D, 0x151C, + 0x596E, 0x596E, 0x1425, 0x5973, 0x5973, 0x103F, 0x5974, 0x5974, 0x104A, + 0x5978, 0x5978, 0x0D97, 0x597D, 0x597D, 0x1E7D, 0x5982, 0x5982, 0x1730, + 0x5983, 0x5983, 0x1442, 0x5984, 0x5984, 0x1259, 0x598A, 0x598A, 0x1947, + 0x5993, 0x5993, 0x0FE9, 0x5996, 0x5996, 0x1800, 0x5997, 0x5997, 0x0FC7, + 0x5999, 0x5999, 0x12C2, 0x59A5, 0x59A5, 0x1CD8, 0x59A8, 0x59A8, 0x1350, + 0x59AC, 0x59AC, 0x1D2B, 0x59B9, 0x59B9, 0x1265, 0x59BB, 0x59BB, 0x1BDB, + 0x59BE, 0x59BE, 0x1C14, 0x59C3, 0x59C3, 0x1A36, 0x59C6, 0x59C6, 0x129F, + 0x59C9, 0x59C9, 0x1956, 0x59CB, 0x59CB, 0x163F, 0x59D0, 0x59D0, 0x19C3, + 0x59D1, 0x59D1, 0x0E96, 0x59D3, 0x59D3, 0x1563, 0x59D4, 0x59D4, 0x1891, + 0x59D9, 0x59D9, 0x1948, 0x59DA, 0x59DA, 0x1801, 0x59DC, 0x59DC, 0x0DD2, + 0x59DD, 0x59DD, 0x1AD0, 0x59E6, 0x59E6, 0x0D98, 0x59E8, 0x59E8, 0x1911, + 0x59EA, 0x59EA, 0x1B69, 0x59EC, 0x59EC, 0x1F68, 0x59EE, 0x59EE, 0x1DF8, + 0x59F8, 0x59F8, 0x1746, 0x59FB, 0x59FB, 0x1931, 0x59FF, 0x59FF, 0x1957, + 0x5A01, 0x5A01, 0x1892, 0x5A03, 0x5A03, 0x17F4, 0x5A11, 0x5A11, 0x1489, + 0x5A18, 0x5A18, 0x1039, 0x5A1B, 0x5A1B, 0x17AC, 0x5A1C, 0x5A1C, 0x1026, + 0x5A1F, 0x5A1F, 0x1747, 0x5A20, 0x5A20, 0x166B, 0x5A25, 0x5A25, 0x1693, + 0x5A29, 0x5A29, 0x1240, 0x5A36, 0x5A36, 0x1C97, 0x5A3C, 0x5A3C, 0x1BB8, + 0x5A41, 0x5A41, 0x11D5, 0x5A46, 0x5A46, 0x1D33, 0x5A49, 0x5A49, 0x17DB, + 0x5A5A, 0x5A5A, 0x1EA4, 0x5A62, 0x5A62, 0x1443, 0x5A66, 0x5A66, 0x13FF, + 0x5A92, 0x5A92, 0x1266, 0x5A9A, 0x5A9A, 0x12F4, 0x5A9B, 0x5A9B, 0x1875, + 0x5AA4, 0x5AA4, 0x1640, 0x5AC1, 0x5AC1, 0x0D75, 0x5AC2, 0x5AC2, 0x15C5, + 0x5AC4, 0x5AC4, 0x1876, 0x5AC9, 0x5AC9, 0x1B6A, 0x5ACC, 0x5ACC, 0x1E4E, + 0x5AE1, 0x5AE1, 0x19DD, 0x5AE6, 0x5AE6, 0x1DF9, 0x5AE9, 0x5AE9, 0x1055, + 0x5B05, 0x5B05, 0x1EB9, 0x5B09, 0x5B09, 0x1F69, 0x5B0B, 0x5B0B, 0x152E, + 0x5B0C, 0x5B0C, 0x0F20, 0x5B16, 0x5B16, 0x1D6F, 0x5B2A, 0x5B2A, 0x1468, + 0x5B40, 0x5B40, 0x14DA, 0x5B43, 0x5B43, 0x16F9, 0x5B50, 0x5B50, 0x1958, + 0x5B51, 0x5B51, 0x1E4A, 0x5B54, 0x5B54, 0x0ECE, 0x5B55, 0x5B55, 0x1951, + 0x5B57, 0x5B57, 0x1959, 0x5B58, 0x5B58, 0x1AB0, 0x5B5A, 0x5B5A, 0x1400, + 0x5B5C, 0x5B5C, 0x195A, 0x5B5D, 0x5B5D, 0x1F13, 0x5B5F, 0x5B5F, 0x1277, + 0x5B63, 0x5B63, 0x0E7D, 0x5B64, 0x5B64, 0x0E97, 0x5B69, 0x5B69, 0x1E0A, + 0x5B6B, 0x5B6B, 0x15AA, 0x5B70, 0x5B70, 0x15FF, 0x5B71, 0x5B71, 0x197A, + 0x5B75, 0x5B75, 0x1401, 0x5B78, 0x5B78, 0x1DCF, 0x5B7A, 0x5B7A, 0x18AB, + 0x5B7C, 0x5B7C, 0x1723, 0x5B85, 0x5B85, 0x10AA, 0x5B87, 0x5B87, 0x183C, + 0x5B88, 0x5B88, 0x15C6, 0x5B89, 0x5B89, 0x16AF, 0x5B8B, 0x5B8B, 0x15B1, + 0x5B8C, 0x5B8C, 0x17DC, 0x5B8F, 0x5B8F, 0x0F18, 0x5B93, 0x5B93, 0x13D6, + 0x5B95, 0x5B95, 0x1D03, 0x5B96, 0x5B96, 0x1F0E, 0x5B97, 0x5B97, 0x1AB6, + 0x5B98, 0x5B98, 0x0EEC, 0x5B99, 0x5B99, 0x1AD6, 0x5B9A, 0x5B9A, 0x1A37, + 0x5B9B, 0x5B9B, 0x17DD, 0x5B9C, 0x5B9C, 0x18FD, 0x5BA2, 0x5BA2, 0x0DFC, + 0x5BA3, 0x5BA3, 0x152F, 0x5BA4, 0x5BA4, 0x167F, 0x5BA5, 0x5BA5, 0x18AC, + 0x5BA6, 0x5BA6, 0x1ECD, 0x5BAC, 0x5BAC, 0x1564, 0x5BAE, 0x5BAE, 0x0F7B, + 0x5BB0, 0x5BB0, 0x19AD, 0x5BB3, 0x5BB3, 0x1E0B, 0x5BB4, 0x5BB4, 0x1748, + 0x5BB5, 0x5BB5, 0x157F, 0x5BB6, 0x5BB6, 0x0D76, 0x5BB8, 0x5BB8, 0x166C, + 0x5BB9, 0x5BB9, 0x1824, 0x5BBF, 0x5BBF, 0x1600, 0x5BC0, 0x5BC0, 0x1BCC, + 0x5BC2, 0x5BC2, 0x19DE, 0x5BC3, 0x5BC3, 0x1877, 0x5BC4, 0x5BC4, 0x0FEA, + 0x5BC5, 0x5BC5, 0x1932, 0x5BC6, 0x5BC6, 0x1313, 0x5BC7, 0x5BC7, 0x0F43, + 0x5BCC, 0x5BCC, 0x1402, 0x5BD0, 0x5BD0, 0x1267, 0x5BD2, 0x5BD2, 0x1DD3, + 0x5BD3, 0x5BD3, 0x183D, 0x5BD4, 0x5BD4, 0x1659, 0x5BD7, 0x5BD7, 0x1048, + 0x5BDE, 0x5BDE, 0x1238, 0x5BDF, 0x5BDF, 0x1BA6, 0x5BE1, 0x5BE1, 0x0EDB, + 0x5BE2, 0x5BE2, 0x1CC8, 0x5BE4, 0x5BE4, 0x17AD, 0x5BE5, 0x5BE5, 0x1802, + 0x5BE6, 0x5BE6, 0x1680, 0x5BE7, 0x5BE7, 0x1047, 0x5BE8, 0x5BE8, 0x1BCD, + 0x5BE9, 0x5BE9, 0x1682, 0x5BEB, 0x5BEB, 0x148A, 0x5BEC, 0x5BEC, 0x0EED, + 0x5BEE, 0x5BEE, 0x11C9, 0x5BEF, 0x5BEF, 0x1AFA, 0x5BF5, 0x5BF5, 0x1C55, + 0x5BF6, 0x5BF6, 0x13C5, 0x5BF8, 0x5BF8, 0x1C4F, 0x5BFA, 0x5BFA, 0x148B, + 0x5C01, 0x5C01, 0x13E7, 0x5C04, 0x5C04, 0x148C, 0x5C07, 0x5C07, 0x198D, + 0x5C08, 0x5C08, 0x19FD, 0x5C09, 0x5C09, 0x1893, 0x5C0A, 0x5C0A, 0x1AB1, + 0x5C0B, 0x5C0B, 0x1683, 0x5C0D, 0x5C0D, 0x109E, 0x5C0E, 0x5C0E, 0x10B3, + 0x5C0F, 0x5C0F, 0x1580, 0x5C11, 0x5C11, 0x1581, 0x5C16, 0x5C16, 0x1C0A, + 0x5C19, 0x5C19, 0x14DB, 0x5C24, 0x5C24, 0x183E, 0x5C28, 0x5C28, 0x1351, + 0x5C31, 0x5C31, 0x1C98, 0x5C38, 0x5C38, 0x1641, 0x5C39, 0x5C39, 0x18D9, + 0x5C3A, 0x5C3A, 0x1BE0, 0x5C3B, 0x5C3B, 0x0E98, 0x5C3C, 0x5C3C, 0x105A, + 0x5C3E, 0x5C3E, 0x12F5, 0x5C3F, 0x5C3F, 0x1054, 0x5C40, 0x5C40, 0x0F6C, + 0x5C45, 0x5C45, 0x0E03, 0x5C46, 0x5C46, 0x0E7E, 0x5C48, 0x5C48, 0x0F78, + 0x5C4B, 0x5C4B, 0x17BE, 0x5C4D, 0x5C4D, 0x1643, 0x5C4E, 0x5C4E, 0x1642, + 0x5C51, 0x5C51, 0x154B, 0x5C55, 0x5C55, 0x19FE, 0x5C5B, 0x5C5B, 0x13B4, + 0x5C60, 0x5C60, 0x10B4, 0x5C62, 0x5C62, 0x11D6, 0x5C64, 0x5C64, 0x1CA7, + 0x5C65, 0x5C65, 0x120A, 0x5C6C, 0x5C6C, 0x15A2, 0x5C6F, 0x5C6F, 0x1106, + 0x5C71, 0x5C71, 0x14B9, 0x5C79, 0x5C79, 0x1F58, 0x5C90, 0x5C90, 0x0FEB, + 0x5C91, 0x5C91, 0x197F, 0x5CA1, 0x5CA1, 0x0DD3, 0x5CA9, 0x5CA9, 0x16BE, + 0x5CAB, 0x5CAB, 0x15C7, 0x5CAC, 0x5CAC, 0x0DCB, 0x5CB1, 0x5CB1, 0x109F, + 0x5CB3, 0x5CB3, 0x16A2, 0x5CB5, 0x5CB5, 0x1E7E, 0x5CB7, 0x5CB7, 0x1306, + 0x5CB8, 0x5CB8, 0x16B0, 0x5CBA, 0x5CBA, 0x118C, 0x5CBE, 0x5CBE, 0x1A25, + 0x5CC0, 0x5CC0, 0x15C8, 0x5CD9, 0x5CD9, 0x1CAB, 0x5CE0, 0x5CE0, 0x14DC, + 0x5CE8, 0x5CE8, 0x1694, 0x5CEF, 0x5CF0, 0x13E8, 0x5CF4, 0x5CF4, 0x1E37, + 0x5CF6, 0x5CF6, 0x10B5, 0x5CFB, 0x5CFB, 0x1AFB, 0x5CFD, 0x5CFD, 0x1E52, + 0x5D07, 0x5D07, 0x1627, 0x5D0D, 0x5D0D, 0x1145, 0x5D0E, 0x5D0E, 0x0FEC, + 0x5D11, 0x5D11, 0x0EC0, 0x5D14, 0x5D14, 0x1C5F, 0x5D16, 0x5D16, 0x16D3, + 0x5D17, 0x5D17, 0x0DD4, 0x5D19, 0x5D19, 0x11F4, 0x5D27, 0x5D27, 0x1628, + 0x5D29, 0x5D29, 0x1437, 0x5D4B, 0x5D4B, 0x12F6, 0x5D4C, 0x5D4C, 0x0DB9, + 0x5D50, 0x5D50, 0x112F, 0x5D69, 0x5D69, 0x1629, 0x5D6C, 0x5D6C, 0x17F8, + 0x5D6F, 0x5D6F, 0x1B86, 0x5D87, 0x5D87, 0x0F44, 0x5D8B, 0x5D8B, 0x10B6, + 0x5D9D, 0x5D9D, 0x110D, 0x5DA0, 0x5DA0, 0x0F21, 0x5DA2, 0x5DA2, 0x1803, + 0x5DAA, 0x5DAA, 0x172B, 0x5DB8, 0x5DB8, 0x1773, 0x5DBA, 0x5DBA, 0x118D, + 0x5DBC, 0x5DBC, 0x14FF, 0x5DBD, 0x5DBD, 0x16A3, 0x5DCD, 0x5DCD, 0x17F9, + 0x5DD2, 0x5DD2, 0x1241, 0x5DD6, 0x5DD6, 0x16BF, 0x5DDD, 0x5DDD, 0x1BF0, + 0x5DDE, 0x5DDE, 0x1AD7, 0x5DE1, 0x5DE1, 0x1608, 0x5DE2, 0x5DE2, 0x1582, + 0x5DE5, 0x5DE5, 0x0ECF, 0x5DE6, 0x5DE6, 0x1AC8, 0x5DE7, 0x5DE7, 0x0F22, + 0x5DE8, 0x5DE8, 0x0E04, 0x5DEB, 0x5DEB, 0x12CD, 0x5DEE, 0x5DEE, 0x1B87, + 0x5DF1, 0x5DF1, 0x0FED, 0x5DF2, 0x5DF2, 0x1912, 0x5DF3, 0x5DF3, 0x148D, + 0x5DF4, 0x5DF4, 0x1D34, 0x5DF7, 0x5DF7, 0x1DFA, 0x5DFD, 0x5DFD, 0x15AB, + 0x5DFE, 0x5DFE, 0x0E14, 0x5E02, 0x5E02, 0x1644, 0x5E03, 0x5E03, 0x1D7F, + 0x5E06, 0x5E06, 0x1392, 0x5E0C, 0x5E0C, 0x1F6A, 0x5E11, 0x5E11, 0x1D04, + 0x5E16, 0x5E16, 0x1C15, 0x5E19, 0x5E19, 0x1B6B, 0x5E1B, 0x5E1B, 0x137E, + 0x5E1D, 0x5E1D, 0x1A6B, 0x5E25, 0x5E25, 0x15C9, 0x5E2B, 0x5E2B, 0x148E, + 0x5E2D, 0x5E2D, 0x151D, 0x5E33, 0x5E33, 0x198E, 0x5E36, 0x5E36, 0x10A0, + 0x5E38, 0x5E38, 0x14DD, 0x5E3D, 0x5E3D, 0x12A0, 0x5E3F, 0x5E3F, 0x1F25, + 0x5E40, 0x5E40, 0x1A38, 0x5E44, 0x5E44, 0x16A4, 0x5E45, 0x5E45, 0x1D93, + 0x5E47, 0x5E47, 0x1352, 0x5E4C, 0x5E4C, 0x1EE1, 0x5E55, 0x5E55, 0x1239, + 0x5E5F, 0x5E5F, 0x1CAC, 0x5E61, 0x5E61, 0x1384, 0x5E62, 0x5E62, 0x1092, + 0x5E63, 0x5E63, 0x1D70, 0x5E72, 0x5E72, 0x0D99, 0x5E73, 0x5E73, 0x1D6A, + 0x5E74, 0x5E74, 0x1040, 0x5E77, 0x5E77, 0x13B5, 0x5E78, 0x5E78, 0x1E1A, + 0x5E79, 0x5E79, 0x0D9A, 0x5E7B, 0x5E7B, 0x1ECE, 0x5E7C, 0x5E7D, 0x18AD, + 0x5E7E, 0x5E7E, 0x0FEE, 0x5E84, 0x5E84, 0x198F, 0x5E87, 0x5E87, 0x1444, + 0x5E8A, 0x5E8A, 0x14DE, 0x5E8F, 0x5E8F, 0x1500, 0x5E95, 0x5E95, 0x19C4, + 0x5E97, 0x5E97, 0x1A26, 0x5E9A, 0x5E9A, 0x0E56, 0x5E9C, 0x5E9C, 0x1403, + 0x5EA0, 0x5EA0, 0x14DF, 0x5EA6, 0x5EA6, 0x10B7, 0x5EA7, 0x5EA7, 0x1AC9, + 0x5EAB, 0x5EAB, 0x0E99, 0x5EAD, 0x5EAD, 0x1A39, 0x5EB5, 0x5EB5, 0x16C0, + 0x5EB6, 0x5EB6, 0x1501, 0x5EB7, 0x5EB7, 0x0DD5, 0x5EB8, 0x5EB8, 0x1825, + 0x5EBE, 0x5EBE, 0x18AF, 0x5EC2, 0x5EC2, 0x14E0, 0x5EC8, 0x5EC8, 0x1DC4, + 0x5EC9, 0x5EC9, 0x1183, 0x5ECA, 0x5ECA, 0x113C, 0x5ED0, 0x5ED0, 0x0F45, + 0x5ED3, 0x5ED3, 0x0EE7, 0x5ED6, 0x5ED6, 0x11CA, 0x5EDA, 0x5EDA, 0x1AD8, + 0x5EDB, 0x5EDB, 0x19FF, 0x5EDF, 0x5EDF, 0x12C3, 0x5EE0, 0x5EE0, 0x1BB9, + 0x5EE2, 0x5EE2, 0x1D71, 0x5EE3, 0x5EE3, 0x0F03, 0x5EEC, 0x5EEC, 0x115C, + 0x5EF3, 0x5EF3, 0x1C1D, 0x5EF6, 0x5EF6, 0x1749, 0x5EF7, 0x5EF7, 0x1A3A, + 0x5EFA, 0x5EFA, 0x0E15, 0x5EFB, 0x5EFB, 0x1EFA, 0x5F01, 0x5F01, 0x13A8, + 0x5F04, 0x5F04, 0x11B9, 0x5F0A, 0x5F0A, 0x1D72, 0x5F0F, 0x5F0F, 0x165A, + 0x5F11, 0x5F11, 0x1645, 0x5F13, 0x5F13, 0x0F7C, 0x5F14, 0x5F14, 0x1A83, + 0x5F15, 0x5F15, 0x1933, 0x5F17, 0x5F17, 0x1434, 0x5F18, 0x5F18, 0x1EAE, + 0x5F1B, 0x5F1B, 0x1913, 0x5F1F, 0x5F1F, 0x1A6C, 0x5F26, 0x5F26, 0x1E38, + 0x5F27, 0x5F27, 0x1E7F, 0x5F29, 0x5F29, 0x104B, 0x5F31, 0x5F31, 0x16F0, + 0x5F35, 0x5F35, 0x1990, 0x5F3A, 0x5F3A, 0x0DD6, 0x5F3C, 0x5F3C, 0x1DB5, + 0x5F48, 0x5F48, 0x1CF3, 0x5F4A, 0x5F4A, 0x0DD7, 0x5F4C, 0x5F4C, 0x12F7, + 0x5F4E, 0x5F4E, 0x1242, 0x5F56, 0x5F56, 0x1066, 0x5F57, 0x5F57, 0x1E70, + 0x5F59, 0x5F59, 0x1F3D, 0x5F5B, 0x5F5B, 0x1914, 0x5F62, 0x5F62, 0x1E5F, + 0x5F66, 0x5F66, 0x171F, 0x5F67, 0x5F67, 0x1856, 0x5F69, 0x5F69, 0x1BCE, + 0x5F6A, 0x5F6A, 0x1D9A, 0x5F6B, 0x5F6B, 0x1A84, 0x5F6C, 0x5F6C, 0x1469, + 0x5F6D, 0x5F6D, 0x1D59, 0x5F70, 0x5F70, 0x1BBA, 0x5F71, 0x5F71, 0x1774, + 0x5F77, 0x5F77, 0x1353, 0x5F79, 0x5F79, 0x173D, 0x5F7C, 0x5F7C, 0x1DAD, + 0x5F7F, 0x5F7F, 0x1435, 0x5F80, 0x5F80, 0x17EE, 0x5F81, 0x5F81, 0x1A3B, + 0x5F85, 0x5F85, 0x10A1, 0x5F87, 0x5F87, 0x1609, 0x5F8A, 0x5F8A, 0x1EFB, + 0x5F8B, 0x5F8B, 0x11F8, 0x5F8C, 0x5F8C, 0x1F26, 0x5F90, 0x5F90, 0x1502, + 0x5F91, 0x5F91, 0x0E57, 0x5F92, 0x5F92, 0x10B8, 0x5F97, 0x5F97, 0x110C, + 0x5F98, 0x5F98, 0x136C, 0x5F99, 0x5F99, 0x148F, 0x5F9E, 0x5F9E, 0x1AB7, + 0x5FA0, 0x5FA0, 0x1146, 0x5FA1, 0x5FA1, 0x170F, 0x5FA8, 0x5FA8, 0x1EE2, + 0x5FA9, 0x5FA9, 0x13D7, 0x5FAA, 0x5FAA, 0x160A, 0x5FAE, 0x5FAE, 0x12F8, + 0x5FB5, 0x5FB5, 0x1B7E, 0x5FB7, 0x5FB7, 0x10AB, 0x5FB9, 0x5FB9, 0x1C02, + 0x5FBD, 0x5FBD, 0x1F3E, 0x5FC3, 0x5FC3, 0x1684, 0x5FC5, 0x5FC5, 0x1DB6, + 0x5FCC, 0x5FCC, 0x0FEF, 0x5FCD, 0x5FCD, 0x1934, 0x5FD6, 0x5FD6, 0x1C50, + 0x5FD7, 0x5FD7, 0x1B23, 0x5FD8, 0x5FD9, 0x125A, 0x5FE0, 0x5FE0, 0x1C8B, + 0x5FEB, 0x5FEB, 0x1CD3, 0x5FF5, 0x5FF5, 0x1043, 0x5FFD, 0x5FFD, 0x1EAA, + 0x5FFF, 0x5FFF, 0x1426, 0x600F, 0x600F, 0x16CB, 0x6012, 0x6012, 0x104C, + 0x6016, 0x6016, 0x1D80, 0x601C, 0x601C, 0x118E, 0x601D, 0x601D, 0x1490, + 0x6020, 0x6020, 0x1D0A, 0x6021, 0x6021, 0x1915, 0x6025, 0x6025, 0x0FD5, + 0x6027, 0x6027, 0x1565, 0x6028, 0x6028, 0x1878, 0x602A, 0x602A, 0x0F13, + 0x602F, 0x602F, 0x0E29, 0x6041, 0x6041, 0x1949, 0x6042, 0x6042, 0x160B, + 0x6043, 0x6043, 0x1646, 0x604D, 0x604D, 0x1EE3, 0x6050, 0x6050, 0x0ED0, + 0x6052, 0x6052, 0x1DFB, 0x6055, 0x6055, 0x1503, 0x6059, 0x6059, 0x16FA, + 0x605D, 0x605D, 0x0EFC, 0x6062, 0x6062, 0x1EFC, 0x6063, 0x6063, 0x195B, + 0x6064, 0x6064, 0x1F4A, 0x6065, 0x6065, 0x1CAD, 0x6068, 0x6068, 0x1DD4, + 0x6069, 0x6069, 0x18E6, 0x606A, 0x606A, 0x0D8C, 0x606C, 0x606C, 0x1044, + 0x606D, 0x606D, 0x0ED1, 0x606F, 0x606F, 0x165B, 0x6070, 0x6070, 0x1F5F, + 0x6085, 0x6085, 0x1761, 0x6089, 0x6089, 0x1681, 0x608C, 0x608C, 0x1A6D, + 0x608D, 0x608D, 0x1DD5, 0x6094, 0x6094, 0x1EFD, 0x6096, 0x6096, 0x1D50, + 0x609A, 0x609A, 0x15B2, 0x609B, 0x609B, 0x1A00, 0x609F, 0x609F, 0x17AE, + 0x60A0, 0x60A0, 0x18B0, 0x60A3, 0x60A3, 0x1ECF, 0x60A4, 0x60A4, 0x1C56, + 0x60A7, 0x60A7, 0x120B, 0x60B0, 0x60B0, 0x1AB8, 0x60B2, 0x60B2, 0x1445, + 0x60B3, 0x60B3, 0x10AC, 0x60B4, 0x60B4, 0x1C90, 0x60B6, 0x60B6, 0x1307, + 0x60B8, 0x60B8, 0x0E7F, 0x60BC, 0x60BC, 0x10B9, 0x60BD, 0x60BD, 0x1BDC, + 0x60C5, 0x60C5, 0x1A3C, 0x60C7, 0x60C7, 0x10E0, 0x60D1, 0x60D1, 0x1EA1, + 0x60DA, 0x60DA, 0x1EAB, 0x60DC, 0x60DC, 0x151E, 0x60DF, 0x60DF, 0x18B1, + 0x60E0, 0x60E0, 0x1E71, 0x60E1, 0x60E1, 0x16A5, 0x60F0, 0x60F0, 0x1CD9, + 0x60F1, 0x60F1, 0x1052, 0x60F3, 0x60F3, 0x14E1, 0x60F6, 0x60F6, 0x1EE4, + 0x60F9, 0x60F9, 0x16EA, 0x60FA, 0x60FA, 0x1566, 0x60FB, 0x60FB, 0x1CA5, + 0x6101, 0x6101, 0x15CA, 0x6106, 0x6106, 0x0E16, 0x6108, 0x6109, 0x18B2, + 0x610D, 0x610D, 0x1308, 0x610E, 0x610E, 0x1D5D, 0x610F, 0x610F, 0x18FE, + 0x6115, 0x6115, 0x16A6, 0x611A, 0x611A, 0x183F, 0x611B, 0x611B, 0x16D4, + 0x611F, 0x611F, 0x0DBA, 0x6127, 0x6127, 0x0F14, 0x6130, 0x6130, 0x1EE5, + 0x6134, 0x6134, 0x1BBB, 0x6137, 0x6137, 0x0DED, 0x613C, 0x613C, 0x166D, + 0x613E, 0x613E, 0x0DEE, 0x613F, 0x613F, 0x1879, 0x6142, 0x6142, 0x1826, + 0x6144, 0x6144, 0x11F9, 0x6147, 0x6147, 0x18E7, 0x6148, 0x6148, 0x195C, + 0x614A, 0x614A, 0x0E47, 0x614B, 0x614B, 0x1D0B, 0x614C, 0x614C, 0x1EE6, + 0x6153, 0x6153, 0x1D9B, 0x6155, 0x6155, 0x12A1, 0x6158, 0x6159, 0x1BAD, + 0x615D, 0x615D, 0x1D2F, 0x615F, 0x615F, 0x1D1D, 0x6162, 0x6162, 0x1243, + 0x6163, 0x6163, 0x0EEE, 0x6164, 0x6164, 0x0D8D, 0x6167, 0x6167, 0x1E72, + 0x6168, 0x6168, 0x0DEF, 0x616B, 0x616B, 0x1AB9, 0x616E, 0x616E, 0x115D, + 0x6170, 0x6170, 0x1894, 0x6176, 0x6176, 0x0E58, 0x6177, 0x6177, 0x0DD8, + 0x617D, 0x617D, 0x1BE1, 0x617E, 0x617E, 0x1818, 0x6181, 0x6181, 0x1C57, + 0x6182, 0x6182, 0x1840, 0x618A, 0x618A, 0x1446, 0x618E, 0x618E, 0x1B14, + 0x6190, 0x6190, 0x1171, 0x6191, 0x6191, 0x1475, 0x6194, 0x6194, 0x1C31, + 0x6198, 0x6198, 0x1F6C, 0x6199, 0x6199, 0x1F6B, 0x619A, 0x619A, 0x1CF4, + 0x61A4, 0x61A4, 0x1427, 0x61A7, 0x61A7, 0x10F0, 0x61A9, 0x61A9, 0x0E2C, + 0x61AB, 0x61AB, 0x1309, 0x61AC, 0x61AC, 0x0E59, 0x61AE, 0x61AE, 0x12CE, + 0x61B2, 0x61B2, 0x1E2B, 0x61B6, 0x61B6, 0x1719, 0x61BA, 0x61BA, 0x107B, + 0x61BE, 0x61BE, 0x0DBB, 0x61C3, 0x61C3, 0x0FBA, 0x61C7, 0x61C7, 0x0D9B, + 0x61C8, 0x61C8, 0x1E0C, 0x61C9, 0x61C9, 0x18F7, 0x61CA, 0x61CA, 0x17AF, + 0x61CB, 0x61CB, 0x12CF, 0x61E6, 0x61E6, 0x1027, 0x61F2, 0x61F2, 0x1B7F, + 0x61F6, 0x61F6, 0x1117, 0x61F7, 0x61F7, 0x1EFE, 0x61F8, 0x61F8, 0x1E39, + 0x61FA, 0x61FA, 0x1BAF, 0x61FC, 0x61FC, 0x0F46, 0x61FF, 0x61FF, 0x18FF, + 0x6200, 0x6200, 0x1172, 0x6207, 0x6207, 0x1093, 0x6208, 0x6208, 0x0EDC, + 0x620A, 0x620A, 0x12D0, 0x620C, 0x620C, 0x1623, 0x620D, 0x620D, 0x15CB, + 0x620E, 0x620E, 0x18E1, 0x6210, 0x6210, 0x1567, 0x6211, 0x6211, 0x1695, + 0x6212, 0x6212, 0x0E80, 0x6216, 0x6216, 0x1EA2, 0x621A, 0x621A, 0x1BE2, + 0x621F, 0x621F, 0x0FB3, 0x6221, 0x6221, 0x0DBC, 0x622A, 0x622A, 0x1A1D, + 0x622E, 0x622E, 0x11F0, 0x6230, 0x6230, 0x1A01, 0x6231, 0x6231, 0x1F6D, + 0x6234, 0x6234, 0x10A2, 0x6236, 0x6236, 0x1E80, 0x623E, 0x623E, 0x115E, + 0x623F, 0x623F, 0x1354, 0x6240, 0x6240, 0x1583, 0x6241, 0x6241, 0x1D60, + 0x6247, 0x6247, 0x1530, 0x6248, 0x6248, 0x1E81, 0x6249, 0x6249, 0x1447, + 0x624B, 0x624B, 0x15CC, 0x624D, 0x624D, 0x19AE, 0x6253, 0x6253, 0x1CDA, + 0x6258, 0x6258, 0x1CE6, 0x626E, 0x626E, 0x1428, 0x6271, 0x6271, 0x0FD6, + 0x6276, 0x6276, 0x1404, 0x6279, 0x6279, 0x1448, 0x627C, 0x627C, 0x16DC, + 0x627F, 0x627F, 0x1637, 0x6280, 0x6280, 0x0FF0, 0x6284, 0x6284, 0x1C32, + 0x6289, 0x6289, 0x0E40, 0x628A, 0x628A, 0x1D35, 0x6291, 0x6291, 0x171A, + 0x6292, 0x6292, 0x1504, 0x6295, 0x6295, 0x1D2C, 0x6297, 0x6297, 0x1DFC, + 0x6298, 0x6298, 0x1A1E, 0x629B, 0x629B, 0x1D81, 0x62AB, 0x62AB, 0x1DAE, + 0x62B1, 0x62B1, 0x1D82, 0x62B5, 0x62B5, 0x19C5, 0x62B9, 0x62B9, 0x1252, + 0x62BC, 0x62BC, 0x16C6, 0x62BD, 0x62BD, 0x1C62, 0x62C2, 0x62C2, 0x1436, + 0x62C7, 0x62C7, 0x12D1, 0x62C8, 0x62C8, 0x1045, 0x62C9, 0x62C9, 0x1139, + 0x62CC, 0x62CC, 0x132D, 0x62CD, 0x62CD, 0x1318, 0x62CF, 0x62CF, 0x1028, + 0x62D0, 0x62D0, 0x0F15, 0x62D2, 0x62D2, 0x0E05, 0x62D3, 0x62D3, 0x1BE3, + 0x62D4, 0x62D4, 0x1343, 0x62D6, 0x62D6, 0x1CDB, 0x62D7, 0x62D7, 0x1804, + 0x62D8, 0x62D8, 0x0F47, 0x62D9, 0x62D9, 0x1AB3, 0x62DB, 0x62DB, 0x1C33, + 0x62DC, 0x62DC, 0x136D, 0x62EC, 0x62EC, 0x0EFD, 0x62ED, 0x62ED, 0x165C, + 0x62EE, 0x62EE, 0x1021, 0x62EF, 0x62EF, 0x1B16, 0x62F1, 0x62F1, 0x0ED2, + 0x62F3, 0x62F3, 0x0F86, 0x62F7, 0x62F7, 0x0E9A, 0x62FE, 0x62FE, 0x162E, + 0x62FF, 0x62FF, 0x1029, 0x6301, 0x6301, 0x1B24, 0x6307, 0x6307, 0x1B25, + 0x6309, 0x6309, 0x16B1, 0x6311, 0x6311, 0x10BA, 0x632B, 0x632B, 0x1ACA, + 0x632F, 0x632F, 0x1B47, 0x633A, 0x633A, 0x1A3D, 0x633B, 0x633B, 0x174B, + 0x633D, 0x633D, 0x1244, 0x633E, 0x633E, 0x1E53, 0x6349, 0x6349, 0x1B8F, + 0x634C, 0x634C, 0x1D4D, 0x634F, 0x634F, 0x102F, 0x6350, 0x6350, 0x174A, + 0x6355, 0x6355, 0x1D83, 0x6367, 0x6367, 0x13EA, 0x6368, 0x6368, 0x1491, + 0x636E, 0x636E, 0x0E06, 0x6372, 0x6372, 0x0F87, 0x6377, 0x6377, 0x1C16, + 0x637A, 0x637A, 0x1030, 0x637B, 0x637B, 0x1046, 0x637F, 0x637F, 0x1505, + 0x6383, 0x6383, 0x1584, 0x6388, 0x6388, 0x15CD, 0x6389, 0x6389, 0x10BB, + 0x638C, 0x638C, 0x1991, 0x6392, 0x6392, 0x136E, 0x6396, 0x6396, 0x16DD, + 0x6398, 0x6398, 0x0F79, 0x639B, 0x639B, 0x0F0D, 0x63A0, 0x63A0, 0x1149, + 0x63A1, 0x63A1, 0x1BCF, 0x63A2, 0x63A2, 0x1CFC, 0x63A5, 0x63A5, 0x1A2D, + 0x63A7, 0x63A7, 0x0ED3, 0x63A8, 0x63A8, 0x1C63, 0x63A9, 0x63A9, 0x1729, + 0x63AA, 0x63AA, 0x1A85, 0x63C0, 0x63C0, 0x0D9C, 0x63C4, 0x63C4, 0x18B4, + 0x63C6, 0x63C6, 0x0F9D, 0x63CF, 0x63CF, 0x12C4, 0x63D0, 0x63D0, 0x1A6E, + 0x63D6, 0x63D6, 0x18F3, 0x63DA, 0x63DA, 0x16FB, 0x63DB, 0x63DB, 0x1ED0, + 0x63E1, 0x63E1, 0x16A7, 0x63ED, 0x63ED, 0x0E2D, 0x63EE, 0x63EE, 0x1F3F, + 0x63F4, 0x63F4, 0x187A, 0x63F6, 0x63F6, 0x16EB, 0x63F7, 0x63F7, 0x14CF, + 0x640D, 0x640D, 0x15AC, 0x640F, 0x640F, 0x1319, 0x6414, 0x6414, 0x1585, + 0x6416, 0x6416, 0x1805, 0x6417, 0x6417, 0x10BC, 0x641C, 0x641C, 0x15CE, + 0x6422, 0x6422, 0x1B48, 0x642C, 0x642C, 0x132E, 0x642D, 0x642D, 0x1D01, + 0x643A, 0x643A, 0x1F46, 0x643E, 0x643E, 0x1B90, 0x6458, 0x6458, 0x19DF, + 0x6460, 0x6460, 0x1C58, 0x6469, 0x6469, 0x1230, 0x646F, 0x646F, 0x1B26, + 0x6478, 0x6479, 0x12A2, 0x647A, 0x647A, 0x1A2E, 0x6488, 0x6488, 0x11A0, + 0x6491, 0x6491, 0x1D17, 0x6492, 0x6492, 0x14C4, 0x6493, 0x6493, 0x1806, + 0x649A, 0x649A, 0x1041, 0x649E, 0x649E, 0x1094, 0x64A4, 0x64A4, 0x1C03, + 0x64A5, 0x64A5, 0x1344, 0x64AB, 0x64AB, 0x12D2, 0x64AD, 0x64AD, 0x1D36, + 0x64AE, 0x64AE, 0x1C5D, 0x64B0, 0x64B0, 0x1B96, 0x64B2, 0x64B2, 0x131A, + 0x64BB, 0x64BB, 0x1074, 0x64C1, 0x64C1, 0x17CB, 0x64C4, 0x64C4, 0x11A1, + 0x64C5, 0x64C5, 0x1BF1, 0x64C7, 0x64C7, 0x1D15, 0x64CA, 0x64CA, 0x0E2E, + 0x64CD, 0x64CD, 0x1A86, 0x64CE, 0x64CE, 0x0E5A, 0x64D2, 0x64D2, 0x0FC8, + 0x64D4, 0x64D4, 0x107C, 0x64D8, 0x64D8, 0x139F, 0x64DA, 0x64DA, 0x0E07, + 0x64E1, 0x64E1, 0x10A3, 0x64E2, 0x64E2, 0x1CE7, 0x64E5, 0x64E5, 0x1130, + 0x64E6, 0x64E6, 0x1BA7, 0x64E7, 0x64E7, 0x0E08, 0x64EC, 0x64EC, 0x1900, + 0x64F2, 0x64F2, 0x1BE4, 0x64F4, 0x64F4, 0x1EC5, 0x64FA, 0x64FA, 0x1D37, + 0x64FE, 0x64FE, 0x1807, 0x6500, 0x6500, 0x132F, 0x6504, 0x6504, 0x1D18, + 0x6518, 0x6518, 0x16FC, 0x651D, 0x651D, 0x155F, 0x6523, 0x6523, 0x1173, + 0x652A, 0x652A, 0x0F23, 0x652B, 0x652B, 0x1EC6, 0x652C, 0x652C, 0x1131, + 0x652F, 0x652F, 0x1B27, 0x6536, 0x6536, 0x15CF, 0x6537, 0x6537, 0x0E9B, + 0x6538, 0x6538, 0x18B5, 0x6539, 0x6539, 0x0DF0, 0x653B, 0x653B, 0x0ED4, + 0x653E, 0x653E, 0x1355, 0x653F, 0x653F, 0x1A3E, 0x6545, 0x6545, 0x0E9C, + 0x6548, 0x6548, 0x1F14, 0x654D, 0x654D, 0x1506, 0x654E, 0x654E, 0x0F24, + 0x654F, 0x654F, 0x130A, 0x6551, 0x6551, 0x0F48, 0x6556, 0x6556, 0x17B0, + 0x6557, 0x6557, 0x1D51, 0x655E, 0x655E, 0x1BBC, 0x6562, 0x6562, 0x0DBD, + 0x6563, 0x6563, 0x14BA, 0x6566, 0x6566, 0x10E1, 0x656C, 0x656C, 0x0E5B, + 0x656D, 0x656D, 0x16FD, 0x6572, 0x6572, 0x0E9D, 0x6574, 0x6574, 0x1A3F, + 0x6575, 0x6575, 0x19E0, 0x6577, 0x6577, 0x1405, 0x6578, 0x6578, 0x15D0, + 0x657E, 0x657E, 0x1531, 0x6582, 0x6582, 0x1184, 0x6583, 0x6583, 0x1D73, + 0x6585, 0x6585, 0x1F15, 0x6587, 0x6587, 0x12E8, 0x658C, 0x658C, 0x146A, + 0x6590, 0x6590, 0x1449, 0x6591, 0x6591, 0x1330, 0x6597, 0x6597, 0x10FD, + 0x6599, 0x6599, 0x11CB, 0x659B, 0x659B, 0x0EB8, 0x659C, 0x659C, 0x1492, + 0x659F, 0x659F, 0x1B76, 0x65A1, 0x65A1, 0x16B9, 0x65A4, 0x65A4, 0x0FBB, + 0x65A5, 0x65A5, 0x1BE5, 0x65A7, 0x65A7, 0x1406, 0x65AB, 0x65AB, 0x1970, + 0x65AC, 0x65AC, 0x1BB0, 0x65AF, 0x65AF, 0x1493, 0x65B0, 0x65B0, 0x166E, + 0x65B7, 0x65B7, 0x1067, 0x65B9, 0x65B9, 0x1356, 0x65BC, 0x65BC, 0x1710, + 0x65BD, 0x65BD, 0x1647, 0x65C1, 0x65C1, 0x1357, 0x65C5, 0x65C5, 0x115F, + 0x65CB, 0x65CB, 0x1532, 0x65CC, 0x65CC, 0x1A40, 0x65CF, 0x65CF, 0x1AAC, + 0x65D2, 0x65D2, 0x11E2, 0x65D7, 0x65D7, 0x0FF1, 0x65E0, 0x65E0, 0x12D3, + 0x65E3, 0x65E3, 0x0FF2, 0x65E5, 0x65E5, 0x1940, 0x65E6, 0x65E6, 0x1068, + 0x65E8, 0x65E8, 0x1B28, 0x65E9, 0x65E9, 0x1A87, 0x65EC, 0x65EC, 0x160C, + 0x65ED, 0x65ED, 0x1857, 0x65F1, 0x65F1, 0x1DD6, 0x65F4, 0x65F4, 0x1841, + 0x65FA, 0x65FA, 0x17EF, 0x65FB, 0x65FC, 0x130B, 0x65FD, 0x65FD, 0x10E2, + 0x65FF, 0x65FF, 0x17B1, 0x6606, 0x6606, 0x0EC1, 0x6607, 0x6607, 0x1638, + 0x6609, 0x6609, 0x1358, 0x660A, 0x660A, 0x1E82, 0x660C, 0x660C, 0x1BBD, + 0x660E, 0x660E, 0x128F, 0x660F, 0x660F, 0x1EA5, 0x6610, 0x6610, 0x1429, + 0x6611, 0x6611, 0x0FC9, 0x6613, 0x6613, 0x173E, 0x6614, 0x6614, 0x151F, + 0x6615, 0x6615, 0x1F53, 0x661E, 0x661E, 0x13B6, 0x661F, 0x661F, 0x1568, + 0x6620, 0x6620, 0x1775, 0x6625, 0x6625, 0x1C84, 0x6627, 0x6627, 0x1268, + 0x6628, 0x6628, 0x1971, 0x662D, 0x662D, 0x1586, 0x662F, 0x662F, 0x1648, + 0x6630, 0x6630, 0x1DC5, 0x6631, 0x6631, 0x1858, 0x6634, 0x6634, 0x12C5, + 0x6636, 0x6636, 0x1BBE, 0x663A, 0x663A, 0x13B7, 0x663B, 0x663B, 0x16CC, + 0x6641, 0x6641, 0x1A88, 0x6642, 0x6642, 0x1649, 0x6643, 0x6644, 0x1EE7, + 0x6649, 0x6649, 0x1B49, 0x664B, 0x664B, 0x1B4A, 0x664F, 0x664F, 0x16B2, + 0x6659, 0x6659, 0x1AFC, 0x665B, 0x665B, 0x1E3A, 0x665D, 0x665D, 0x1AD9, + 0x665E, 0x665E, 0x1F6E, 0x665F, 0x665F, 0x1569, 0x6664, 0x6664, 0x17B2, + 0x6665, 0x6665, 0x1ED2, 0x6666, 0x6666, 0x1EFF, 0x6667, 0x6667, 0x1E83, + 0x6668, 0x6668, 0x166F, 0x6669, 0x6669, 0x1245, 0x666B, 0x666B, 0x1CE8, + 0x666E, 0x666E, 0x13C6, 0x666F, 0x666F, 0x0E5C, 0x6673, 0x6673, 0x1520, + 0x6674, 0x6674, 0x1C1E, 0x6676, 0x6676, 0x1A41, 0x6677, 0x6677, 0x0F96, + 0x6678, 0x6678, 0x1A42, 0x667A, 0x667A, 0x1B29, 0x6684, 0x6684, 0x1F37, + 0x6687, 0x6687, 0x0D77, 0x6688, 0x6688, 0x1F34, 0x6689, 0x6689, 0x1F40, + 0x668E, 0x668E, 0x1776, 0x6690, 0x6690, 0x1895, 0x6691, 0x6691, 0x1507, + 0x6696, 0x6696, 0x102C, 0x6697, 0x6697, 0x16C1, 0x6698, 0x6698, 0x16FE, + 0x669D, 0x669D, 0x1290, 0x66A0, 0x66A0, 0x0E9E, 0x66A2, 0x66A2, 0x1BBF, + 0x66AB, 0x66AB, 0x1980, 0x66AE, 0x66AE, 0x12A4, 0x66B2, 0x66B2, 0x1992, + 0x66B3, 0x66B3, 0x1E73, 0x66B4, 0x66B4, 0x1D94, 0x66B9, 0x66B9, 0x1558, + 0x66BB, 0x66BB, 0x0E5D, 0x66BE, 0x66BE, 0x10E3, 0x66C4, 0x66C4, 0x176F, + 0x66C6, 0x66C6, 0x116B, 0x66C7, 0x66C7, 0x107D, 0x66C9, 0x66C9, 0x1F16, + 0x66D6, 0x66D6, 0x16D5, 0x66D9, 0x66D9, 0x1508, 0x66DC, 0x66DC, 0x1808, + 0x66DD, 0x66DD, 0x1D95, 0x66E0, 0x66E0, 0x0F04, 0x66E6, 0x66E6, 0x1F6F, + 0x66F0, 0x66F0, 0x17ED, 0x66F2, 0x66F2, 0x0EB9, 0x66F3, 0x66F3, 0x1791, + 0x66F4, 0x66F4, 0x0E5E, 0x66F7, 0x66F7, 0x0DAE, 0x66F8, 0x66F8, 0x1509, + 0x66F9, 0x66F9, 0x1A8A, 0x66FA, 0x66FA, 0x1A89, 0x66FC, 0x66FC, 0x1246, + 0x66FE, 0x66FE, 0x1B15, 0x66FF, 0x66FF, 0x1C26, 0x6700, 0x6700, 0x1C60, + 0x6703, 0x6703, 0x1F00, 0x6708, 0x6708, 0x1889, 0x6709, 0x6709, 0x18B6, + 0x670B, 0x670B, 0x1438, 0x670D, 0x670D, 0x13D8, 0x6714, 0x6714, 0x14B6, + 0x6715, 0x6715, 0x1B77, 0x6717, 0x6717, 0x113D, 0x671B, 0x671B, 0x125C, + 0x671D, 0x671D, 0x1A8B, 0x671E, 0x671F, 0x0FF3, 0x6726, 0x6726, 0x12BE, + 0x6727, 0x6727, 0x11BA, 0x6728, 0x6728, 0x12B4, 0x672A, 0x672A, 0x12F9, + 0x672B, 0x672B, 0x1253, 0x672C, 0x672C, 0x13E3, 0x672D, 0x672D, 0x1BA8, + 0x672E, 0x672E, 0x1C88, 0x6731, 0x6731, 0x1ADA, 0x6734, 0x6734, 0x131B, + 0x6736, 0x6736, 0x1CDC, 0x673A, 0x673A, 0x0F90, 0x673D, 0x673D, 0x1F27, + 0x6746, 0x6746, 0x0D9D, 0x6749, 0x6749, 0x14C9, 0x674E, 0x674E, 0x120C, + 0x674F, 0x674F, 0x1E1B, 0x6750, 0x6750, 0x19AF, 0x6751, 0x6751, 0x1C51, + 0x6753, 0x6753, 0x1D9C, 0x6756, 0x6756, 0x1993, 0x675C, 0x675C, 0x10FE, + 0x675E, 0x675E, 0x0FF5, 0x675F, 0x675F, 0x15A3, 0x676D, 0x676D, 0x1DFD, + 0x676F, 0x676F, 0x136F, 0x6770, 0x6770, 0x0E1F, 0x6771, 0x6771, 0x10F1, + 0x6773, 0x6773, 0x12C6, 0x6775, 0x6775, 0x19C6, 0x6777, 0x6777, 0x1D38, + 0x677B, 0x677B, 0x1057, 0x677E, 0x677E, 0x15B3, 0x677F, 0x677F, 0x1D44, + 0x6787, 0x6787, 0x144A, 0x6789, 0x6789, 0x17F0, 0x678B, 0x678B, 0x1359, + 0x678F, 0x678F, 0x1032, 0x6790, 0x6790, 0x1521, 0x6793, 0x6793, 0x10FF, + 0x6795, 0x6795, 0x1CC9, 0x6797, 0x6797, 0x1227, 0x679A, 0x679A, 0x1269, + 0x679C, 0x679C, 0x0EDD, 0x679D, 0x679D, 0x1B2A, 0x67AF, 0x67AF, 0x0E9F, + 0x67B0, 0x67B0, 0x1D6B, 0x67B3, 0x67B3, 0x1B2B, 0x67B6, 0x67B7, 0x0D78, + 0x67B8, 0x67B8, 0x0F49, 0x67BE, 0x67BE, 0x164A, 0x67C4, 0x67C4, 0x13B8, + 0x67CF, 0x67CF, 0x137F, 0x67D0, 0x67D0, 0x12A5, 0x67D1, 0x67D1, 0x0DBE, + 0x67D2, 0x67D2, 0x1CC5, 0x67D3, 0x67D3, 0x1766, 0x67D4, 0x67D4, 0x18B7, + 0x67DA, 0x67DA, 0x18B8, 0x67DD, 0x67DD, 0x1CE9, 0x67E9, 0x67E9, 0x0F4A, + 0x67EC, 0x67EC, 0x0D9E, 0x67EF, 0x67EF, 0x0D7A, 0x67F0, 0x67F0, 0x103D, + 0x67F1, 0x67F1, 0x1ADB, 0x67F3, 0x67F3, 0x11E3, 0x67F4, 0x67F4, 0x164B, + 0x67F5, 0x67F5, 0x1BD7, 0x67F6, 0x67F6, 0x1494, 0x67FB, 0x67FB, 0x1495, + 0x67FE, 0x67FE, 0x1A43, 0x6812, 0x6812, 0x160D, 0x6813, 0x6813, 0x1A02, + 0x6816, 0x6816, 0x150A, 0x6817, 0x6817, 0x11FA, 0x6821, 0x6821, 0x0F25, + 0x6822, 0x6822, 0x1380, 0x682A, 0x682A, 0x1ADC, 0x682F, 0x682F, 0x1859, + 0x6838, 0x6838, 0x1E18, 0x6839, 0x6839, 0x0FBC, 0x683C, 0x683C, 0x0E2F, + 0x683D, 0x683D, 0x19B0, 0x6840, 0x6840, 0x0E20, 0x6841, 0x6841, 0x1DFE, + 0x6842, 0x6842, 0x0E81, 0x6843, 0x6843, 0x10BD, 0x6848, 0x6848, 0x16B3, + 0x684E, 0x684E, 0x1B6C, 0x6850, 0x6850, 0x10F2, 0x6851, 0x6851, 0x14E2, + 0x6853, 0x6853, 0x1ED3, 0x6854, 0x6854, 0x1022, 0x686D, 0x686D, 0x1B4B, + 0x6876, 0x6876, 0x1D1E, 0x687F, 0x687F, 0x0D9F, 0x6881, 0x6881, 0x114F, + 0x6885, 0x6885, 0x126A, 0x688F, 0x688F, 0x0EBA, 0x6893, 0x6893, 0x19B1, + 0x6894, 0x6894, 0x1CAE, 0x6897, 0x6897, 0x0E5F, 0x689D, 0x689D, 0x1A8C, + 0x689F, 0x689F, 0x1F17, 0x68A1, 0x68A1, 0x17DE, 0x68A2, 0x68A2, 0x1C34, + 0x68A7, 0x68A7, 0x17B3, 0x68A8, 0x68A8, 0x120D, 0x68AD, 0x68AD, 0x1496, + 0x68AF, 0x68AF, 0x1A6F, 0x68B0, 0x68B0, 0x0E82, 0x68B1, 0x68B1, 0x0EC2, + 0x68B3, 0x68B3, 0x1587, 0x68B5, 0x68B5, 0x1393, 0x68B6, 0x68B6, 0x12FA, + 0x68C4, 0x68C4, 0x0FF7, 0x68C5, 0x68C5, 0x13B9, 0x68C9, 0x68C9, 0x1282, + 0x68CB, 0x68CB, 0x0FF6, 0x68CD, 0x68CD, 0x0EC3, 0x68D2, 0x68D2, 0x13EB, + 0x68D5, 0x68D5, 0x1ABA, 0x68D7, 0x68D7, 0x1A8D, 0x68D8, 0x68D8, 0x0FB4, + 0x68DA, 0x68DA, 0x1439, 0x68DF, 0x68DF, 0x10F3, 0x68E0, 0x68E0, 0x1095, + 0x68E7, 0x68E7, 0x197B, 0x68E8, 0x68E8, 0x0E83, 0x68EE, 0x68EE, 0x14CA, + 0x68F2, 0x68F2, 0x150B, 0x68F9, 0x68F9, 0x10BE, 0x68FA, 0x68FA, 0x0EEF, + 0x6900, 0x6900, 0x17DF, 0x6905, 0x6905, 0x1901, 0x690D, 0x690D, 0x165D, + 0x690E, 0x690E, 0x1C64, 0x6912, 0x6912, 0x1C35, 0x6927, 0x6927, 0x1291, + 0x6930, 0x6930, 0x16EC, 0x693D, 0x693D, 0x174C, 0x693F, 0x693F, 0x1C85, + 0x694A, 0x694A, 0x16FF, 0x6953, 0x6953, 0x1DA8, 0x6954, 0x6954, 0x154C, + 0x6955, 0x6955, 0x1CDD, 0x6957, 0x6957, 0x0E17, 0x6959, 0x6959, 0x12D4, + 0x695A, 0x695A, 0x1C36, 0x695E, 0x695E, 0x1200, 0x6960, 0x6960, 0x1033, + 0x6961, 0x6962, 0x18B9, 0x6963, 0x6963, 0x12FB, 0x6968, 0x6968, 0x1A44, + 0x696B, 0x696B, 0x1B10, 0x696D, 0x696D, 0x172C, 0x696E, 0x696E, 0x19C7, + 0x696F, 0x696F, 0x160E, 0x6975, 0x6975, 0x0FB5, 0x6977, 0x6977, 0x1E0D, + 0x6978, 0x6978, 0x1C65, 0x6979, 0x6979, 0x1777, 0x6995, 0x6995, 0x1827, + 0x699B, 0x699B, 0x1B4C, 0x699C, 0x699C, 0x135A, 0x69A5, 0x69A5, 0x1EE9, + 0x69A7, 0x69A7, 0x144B, 0x69AE, 0x69AE, 0x1778, 0x69B4, 0x69B4, 0x11E4, + 0x69BB, 0x69BB, 0x1D02, 0x69C1, 0x69C1, 0x0EA0, 0x69C3, 0x69C3, 0x1331, + 0x69CB, 0x69CB, 0x0F4B, 0x69CC, 0x69CC, 0x1D24, 0x69CD, 0x69CD, 0x1BC0, + 0x69D0, 0x69D0, 0x0F16, 0x69E8, 0x69E8, 0x0EE8, 0x69EA, 0x69EA, 0x0DF1, + 0x69FB, 0x69FB, 0x0F9E, 0x69FD, 0x69FD, 0x1A8E, 0x69FF, 0x69FF, 0x0FBD, + 0x6A02, 0x6A02, 0x16A8, 0x6A0A, 0x6A0A, 0x1385, 0x6A11, 0x6A11, 0x1150, + 0x6A13, 0x6A13, 0x11D7, 0x6A17, 0x6A17, 0x19C8, 0x6A19, 0x6A19, 0x1D9D, + 0x6A1E, 0x6A1E, 0x1C66, 0x6A1F, 0x6A1F, 0x1994, 0x6A21, 0x6A21, 0x12A6, + 0x6A23, 0x6A23, 0x1700, 0x6A35, 0x6A35, 0x1C37, 0x6A38, 0x6A38, 0x131C, + 0x6A39, 0x6A39, 0x15D1, 0x6A3A, 0x6A3A, 0x1EBA, 0x6A3D, 0x6A3D, 0x1AFD, + 0x6A44, 0x6A44, 0x0DBF, 0x6A48, 0x6A48, 0x1809, 0x6A4B, 0x6A4B, 0x0F26, + 0x6A52, 0x6A52, 0x185F, 0x6A53, 0x6A53, 0x160F, 0x6A58, 0x6A58, 0x0FAF, + 0x6A59, 0x6A59, 0x110E, 0x6A5F, 0x6A5F, 0x0FF8, 0x6A61, 0x6A61, 0x14E3, + 0x6A6B, 0x6A6B, 0x1F0F, 0x6A80, 0x6A80, 0x1069, 0x6A84, 0x6A84, 0x0E30, + 0x6A89, 0x6A89, 0x1A45, 0x6A8D, 0x6A8D, 0x171B, 0x6A8E, 0x6A8E, 0x0FCA, + 0x6A97, 0x6A97, 0x13A0, 0x6A9C, 0x6A9C, 0x1F01, 0x6AA2, 0x6AA2, 0x0E24, + 0x6AA3, 0x6AA3, 0x1995, 0x6AB3, 0x6AB3, 0x146B, 0x6ABB, 0x6ABB, 0x1DE8, + 0x6AC2, 0x6AC2, 0x10BF, 0x6AC3, 0x6AC3, 0x0F91, 0x6AD3, 0x6AD3, 0x11A2, + 0x6ADA, 0x6ADA, 0x1160, 0x6ADB, 0x6ADB, 0x1B0F, 0x6AF6, 0x6AF6, 0x1E2C, + 0x6AFB, 0x6AFB, 0x16E2, 0x6B04, 0x6B04, 0x1127, 0x6B0A, 0x6B0A, 0x0F88, + 0x6B0C, 0x6B0C, 0x1996, 0x6B12, 0x6B12, 0x1128, 0x6B16, 0x6B16, 0x1132, + 0x6B20, 0x6B20, 0x1F5B, 0x6B21, 0x6B21, 0x1B88, 0x6B23, 0x6B23, 0x1F54, + 0x6B32, 0x6B32, 0x1819, 0x6B3A, 0x6B3A, 0x0FF9, 0x6B3D, 0x6B3D, 0x1F5C, + 0x6B3E, 0x6B3E, 0x0EF0, 0x6B46, 0x6B46, 0x1F5D, 0x6B47, 0x6B47, 0x1E2F, + 0x6B4C, 0x6B4C, 0x0D7B, 0x6B4E, 0x6B4E, 0x1CF5, 0x6B50, 0x6B50, 0x0F4C, + 0x6B5F, 0x6B5F, 0x1731, 0x6B61, 0x6B61, 0x1ED1, 0x6B62, 0x6B62, 0x1B2C, + 0x6B63, 0x6B63, 0x1A46, 0x6B64, 0x6B64, 0x1B89, 0x6B65, 0x6B65, 0x13C7, + 0x6B66, 0x6B66, 0x12D5, 0x6B6A, 0x6B6A, 0x17F5, 0x6B72, 0x6B72, 0x1576, + 0x6B77, 0x6B77, 0x116C, 0x6B78, 0x6B78, 0x0F97, 0x6B7B, 0x6B7B, 0x1497, + 0x6B7F, 0x6B7F, 0x12BB, 0x6B83, 0x6B83, 0x16CD, 0x6B84, 0x6B84, 0x1B4D, + 0x6B86, 0x6B86, 0x1D0C, 0x6B89, 0x6B89, 0x1610, 0x6B8A, 0x6B8A, 0x15D2, + 0x6B96, 0x6B96, 0x165E, 0x6B98, 0x6B98, 0x197C, 0x6B9E, 0x6B9E, 0x1860, + 0x6BAE, 0x6BAE, 0x1185, 0x6BAF, 0x6BAF, 0x146C, 0x6BB2, 0x6BB2, 0x1559, + 0x6BB5, 0x6BB5, 0x106A, 0x6BB7, 0x6BB7, 0x18E8, 0x6BBA, 0x6BBA, 0x14C5, + 0x6BBC, 0x6BBC, 0x0D8E, 0x6BBF, 0x6BBF, 0x1A03, 0x6BC1, 0x6BC1, 0x1F3C, + 0x6BC5, 0x6BC5, 0x1902, 0x6BC6, 0x6BC6, 0x0F4D, 0x6BCB, 0x6BCB, 0x12D6, + 0x6BCD, 0x6BCD, 0x12A7, 0x6BCF, 0x6BCF, 0x126B, 0x6BD2, 0x6BD2, 0x10D5, + 0x6BD3, 0x6BD3, 0x18D4, 0x6BD4, 0x6BD4, 0x144C, 0x6BD6, 0x6BD8, 0x144D, + 0x6BDB, 0x6BDB, 0x12A8, 0x6BEB, 0x6BEB, 0x1E84, 0x6BEC, 0x6BEC, 0x0F4E, + 0x6C08, 0x6C08, 0x1A04, 0x6C0F, 0x6C0F, 0x168E, 0x6C11, 0x6C11, 0x130D, + 0x6C13, 0x6C13, 0x1278, 0x6C23, 0x6C23, 0x0FFA, 0x6C34, 0x6C34, 0x15D3, + 0x6C37, 0x6C37, 0x1476, 0x6C38, 0x6C38, 0x1779, 0x6C3E, 0x6C3E, 0x1394, + 0x6C40, 0x6C40, 0x1A47, 0x6C41, 0x6C41, 0x1B11, 0x6C42, 0x6C42, 0x0F4F, + 0x6C4E, 0x6C4E, 0x1395, 0x6C50, 0x6C50, 0x1522, 0x6C55, 0x6C55, 0x14BB, + 0x6C57, 0x6C57, 0x1DD7, 0x6C5A, 0x6C5A, 0x17B4, 0x6C5D, 0x6C5D, 0x1732, + 0x6C5E, 0x6C5E, 0x1EAF, 0x6C5F, 0x6C5F, 0x0DD9, 0x6C60, 0x6C60, 0x1B2D, + 0x6C68, 0x6C68, 0x0EC8, 0x6C6A, 0x6C6A, 0x17F1, 0x6C6D, 0x6C6D, 0x1792, + 0x6C70, 0x6C70, 0x1D0D, 0x6C72, 0x6C72, 0x0FD7, 0x6C76, 0x6C76, 0x12E9, + 0x6C7A, 0x6C7A, 0x0E41, 0x6C7D, 0x6C7D, 0x0FFB, 0x6C7E, 0x6C7E, 0x142A, + 0x6C81, 0x6C81, 0x1685, 0x6C82, 0x6C82, 0x0FFC, 0x6C83, 0x6C83, 0x17BF, + 0x6C85, 0x6C85, 0x187B, 0x6C86, 0x6C86, 0x1DFF, 0x6C87, 0x6C87, 0x174D, + 0x6C88, 0x6C88, 0x1CCA, 0x6C8C, 0x6C8C, 0x10E4, 0x6C90, 0x6C90, 0x12B5, + 0x6C92, 0x6C92, 0x12BC, 0x6C93, 0x6C93, 0x108A, 0x6C94, 0x6C94, 0x1283, + 0x6C95, 0x6C95, 0x12F1, 0x6C96, 0x6C96, 0x1C8C, 0x6C99, 0x6C99, 0x1498, + 0x6C9A, 0x6C9A, 0x1B2E, 0x6C9B, 0x6C9B, 0x1D52, 0x6CAB, 0x6CAB, 0x1254, + 0x6CAE, 0x6CAE, 0x19C9, 0x6CB3, 0x6CB3, 0x1DC6, 0x6CB8, 0x6CB8, 0x1450, + 0x6CB9, 0x6CB9, 0x18BB, 0x6CBB, 0x6CBB, 0x1CAF, 0x6CBC, 0x6CBC, 0x1588, + 0x6CBD, 0x6CBD, 0x0EA1, 0x6CBE, 0x6CBE, 0x1C0B, 0x6CBF, 0x6CBF, 0x174E, + 0x6CC1, 0x6CC1, 0x1EEA, 0x6CC2, 0x6CC2, 0x1E60, 0x6CC4, 0x6CC4, 0x154D, + 0x6CC9, 0x6CC9, 0x1BF2, 0x6CCA, 0x6CCA, 0x131D, 0x6CCC, 0x6CCC, 0x1DB7, + 0x6CD3, 0x6CD3, 0x1EB0, 0x6CD5, 0x6CD5, 0x139A, 0x6CD7, 0x6CD7, 0x1499, + 0x6CDB, 0x6CDB, 0x1396, 0x6CE1, 0x6CE1, 0x1D84, 0x6CE2, 0x6CE2, 0x1D39, + 0x6CE3, 0x6CE3, 0x18F4, 0x6CE5, 0x6CE5, 0x105B, 0x6CE8, 0x6CE8, 0x1ADD, + 0x6CEB, 0x6CEB, 0x1E3B, 0x6CEE, 0x6CEE, 0x1332, 0x6CEF, 0x6CEF, 0x130E, + 0x6CF0, 0x6CF0, 0x1D0E, 0x6CF3, 0x6CF3, 0x177A, 0x6D0B, 0x6D0B, 0x1701, + 0x6D0C, 0x6D0C, 0x1180, 0x6D11, 0x6D11, 0x13C8, 0x6D17, 0x6D17, 0x1577, + 0x6D19, 0x6D19, 0x15D4, 0x6D1B, 0x6D1B, 0x111E, 0x6D1E, 0x6D1E, 0x10F4, + 0x6D25, 0x6D25, 0x1B4E, 0x6D27, 0x6D27, 0x18BC, 0x6D29, 0x6D29, 0x154E, + 0x6D2A, 0x6D2A, 0x1EB1, 0x6D32, 0x6D32, 0x1ADE, 0x6D35, 0x6D35, 0x1611, + 0x6D36, 0x6D36, 0x1F50, 0x6D38, 0x6D38, 0x0F05, 0x6D39, 0x6D39, 0x187C, + 0x6D3B, 0x6D3B, 0x1EDB, 0x6D3D, 0x6D3D, 0x1F60, 0x6D3E, 0x6D3E, 0x1D3A, + 0x6D41, 0x6D41, 0x11E5, 0x6D59, 0x6D59, 0x1A1F, 0x6D5A, 0x6D5A, 0x1AFE, + 0x6D5C, 0x6D5C, 0x146D, 0x6D63, 0x6D63, 0x17E0, 0x6D66, 0x6D66, 0x1D85, + 0x6D69, 0x6D69, 0x1E85, 0x6D6A, 0x6D6A, 0x113E, 0x6D6C, 0x6D6C, 0x120E, + 0x6D6E, 0x6D6E, 0x1407, 0x6D74, 0x6D74, 0x181A, 0x6D77, 0x6D77, 0x1E0E, + 0x6D78, 0x6D78, 0x1CCB, 0x6D79, 0x6D79, 0x1E54, 0x6D7F, 0x6D7F, 0x1D53, + 0x6D85, 0x6D85, 0x1762, 0x6D87, 0x6D87, 0x0E60, 0x6D88, 0x6D88, 0x1589, + 0x6D89, 0x6D89, 0x1560, 0x6D8C, 0x6D8C, 0x1828, 0x6D8D, 0x6D8D, 0x1F18, + 0x6D8E, 0x6D8E, 0x174F, 0x6D91, 0x6D91, 0x15A4, 0x6D93, 0x6D93, 0x1750, + 0x6D95, 0x6D95, 0x1C27, 0x6DAF, 0x6DAF, 0x16D6, 0x6DB2, 0x6DB2, 0x16DE, + 0x6DB5, 0x6DB5, 0x1DE9, 0x6DC0, 0x6DC0, 0x1A48, 0x6DC3, 0x6DC3, 0x0F89, + 0x6DC4, 0x6DC4, 0x1CB0, 0x6DC5, 0x6DC5, 0x1523, 0x6DC6, 0x6DC6, 0x1F19, + 0x6DC7, 0x6DC7, 0x0FFD, 0x6DCB, 0x6DCB, 0x1228, 0x6DCF, 0x6DCF, 0x1E86, + 0x6DD1, 0x6DD1, 0x1601, 0x6DD8, 0x6DD8, 0x10C0, 0x6DD9, 0x6DD9, 0x1ABB, + 0x6DDA, 0x6DDA, 0x11D8, 0x6DDE, 0x6DDE, 0x15B4, 0x6DE1, 0x6DE1, 0x107E, + 0x6DE8, 0x6DE8, 0x1A49, 0x6DEA, 0x6DEA, 0x11F5, 0x6DEB, 0x6DEB, 0x18EE, + 0x6DEE, 0x6DEE, 0x1F02, 0x6DF1, 0x6DF1, 0x1686, 0x6DF3, 0x6DF3, 0x1612, + 0x6DF5, 0x6DF5, 0x1751, 0x6DF7, 0x6DF7, 0x1EA6, 0x6DF8, 0x6DF8, 0x1C1F, + 0x6DF9, 0x6DF9, 0x172A, 0x6DFA, 0x6DFA, 0x1BF3, 0x6DFB, 0x6DFB, 0x1C0C, + 0x6E17, 0x6E17, 0x14CB, 0x6E19, 0x6E19, 0x1ED4, 0x6E1A, 0x6E1A, 0x19CA, + 0x6E1B, 0x6E1B, 0x0DC0, 0x6E1F, 0x6E1F, 0x1A4A, 0x6E20, 0x6E20, 0x0E09, + 0x6E21, 0x6E21, 0x10C1, 0x6E23, 0x6E23, 0x149A, 0x6E24, 0x6E24, 0x1345, + 0x6E25, 0x6E25, 0x16A9, 0x6E26, 0x6E26, 0x17D3, 0x6E2B, 0x6E2B, 0x154F, + 0x6E2C, 0x6E2C, 0x1CA6, 0x6E2D, 0x6E2D, 0x1896, 0x6E2F, 0x6E2F, 0x1E00, + 0x6E32, 0x6E32, 0x1533, 0x6E34, 0x6E34, 0x0DAF, 0x6E36, 0x6E36, 0x177B, + 0x6E38, 0x6E38, 0x18BD, 0x6E3A, 0x6E3A, 0x12C7, 0x6E3C, 0x6E3C, 0x12FC, + 0x6E3D, 0x6E3D, 0x19B2, 0x6E3E, 0x6E3E, 0x1EA7, 0x6E43, 0x6E43, 0x1370, + 0x6E44, 0x6E44, 0x12FD, 0x6E4A, 0x6E4A, 0x1ADF, 0x6E4D, 0x6E4D, 0x106B, + 0x6E56, 0x6E56, 0x1E87, 0x6E58, 0x6E58, 0x14E4, 0x6E5B, 0x6E5B, 0x107F, + 0x6E5C, 0x6E5C, 0x165F, 0x6E5E, 0x6E5E, 0x1A4B, 0x6E5F, 0x6E5F, 0x1EEB, + 0x6E67, 0x6E67, 0x1829, 0x6E6B, 0x6E6B, 0x1C67, 0x6E6E, 0x6E6E, 0x1935, + 0x6E6F, 0x6E6F, 0x1D05, 0x6E72, 0x6E72, 0x187D, 0x6E73, 0x6E73, 0x1034, + 0x6E7A, 0x6E7A, 0x13C9, 0x6E90, 0x6E90, 0x187E, 0x6E96, 0x6E96, 0x1AFF, + 0x6E9C, 0x6E9C, 0x11E6, 0x6E9D, 0x6E9D, 0x0F50, 0x6E9F, 0x6E9F, 0x1292, + 0x6EA2, 0x6EA2, 0x1941, 0x6EA5, 0x6EA5, 0x1408, 0x6EAA, 0x6EAA, 0x0E84, + 0x6EAB, 0x6EAB, 0x17C3, 0x6EAF, 0x6EAF, 0x158A, 0x6EB1, 0x6EB1, 0x1B4F, + 0x6EB6, 0x6EB6, 0x182A, 0x6EBA, 0x6EBA, 0x105D, 0x6EC2, 0x6EC2, 0x135B, + 0x6EC4, 0x6EC4, 0x1BC1, 0x6EC5, 0x6EC5, 0x128A, 0x6EC9, 0x6EC9, 0x1EEC, + 0x6ECB, 0x6ECB, 0x195D, 0x6ECC, 0x6ECC, 0x1BE6, 0x6ECE, 0x6ECE, 0x1E61, + 0x6ED1, 0x6ED1, 0x1EDC, 0x6ED3, 0x6ED3, 0x19B3, 0x6ED4, 0x6ED4, 0x10C2, + 0x6EEF, 0x6EEF, 0x1C28, 0x6EF4, 0x6EF4, 0x19E1, 0x6EF8, 0x6EF8, 0x1E88, + 0x6EFE, 0x6EFE, 0x0EC4, 0x6EFF, 0x6EFF, 0x1247, 0x6F01, 0x6F01, 0x1711, + 0x6F02, 0x6F02, 0x1D9E, 0x6F06, 0x6F06, 0x1CC6, 0x6F0F, 0x6F0F, 0x11D9, + 0x6F11, 0x6F11, 0x0DF2, 0x6F14, 0x6F14, 0x1752, 0x6F15, 0x6F15, 0x1A8F, + 0x6F20, 0x6F20, 0x123A, 0x6F22, 0x6F22, 0x1DD8, 0x6F23, 0x6F23, 0x1174, + 0x6F2B, 0x6F2B, 0x1248, 0x6F2C, 0x6F2C, 0x1B2F, 0x6F31, 0x6F31, 0x15D5, + 0x6F32, 0x6F32, 0x1BC2, 0x6F38, 0x6F38, 0x1A27, 0x6F3F, 0x6F3F, 0x1997, + 0x6F41, 0x6F41, 0x177C, 0x6F51, 0x6F51, 0x1346, 0x6F54, 0x6F54, 0x0E42, + 0x6F57, 0x6F57, 0x1B79, 0x6F58, 0x6F58, 0x1333, 0x6F5A, 0x6F5A, 0x1602, + 0x6F5B, 0x6F5B, 0x1981, 0x6F5E, 0x6F5E, 0x11A3, 0x6F5F, 0x6F5F, 0x1524, + 0x6F62, 0x6F62, 0x1EED, 0x6F64, 0x6F64, 0x18DA, 0x6F6D, 0x6F6D, 0x1080, + 0x6F6E, 0x6F6E, 0x1A90, 0x6F70, 0x6F70, 0x0F92, 0x6F7A, 0x6F7A, 0x197D, + 0x6F7C, 0x6F7C, 0x10F5, 0x6F7D, 0x6F7D, 0x13CA, 0x6F7E, 0x6F7E, 0x121F, + 0x6F81, 0x6F81, 0x14D0, 0x6F84, 0x6F84, 0x1B80, 0x6F88, 0x6F88, 0x1C04, + 0x6F8D, 0x6F8D, 0x1AE0, 0x6F8E, 0x6F8E, 0x1D5A, 0x6F90, 0x6F90, 0x1861, + 0x6F94, 0x6F94, 0x1E89, 0x6F97, 0x6F97, 0x0DA0, 0x6FA3, 0x6FA3, 0x1DD9, + 0x6FA4, 0x6FA4, 0x1D16, 0x6FA7, 0x6FA7, 0x119B, 0x6FAE, 0x6FAE, 0x1F03, + 0x6FAF, 0x6FAF, 0x1B97, 0x6FB1, 0x6FB1, 0x1A05, 0x6FB3, 0x6FB3, 0x17B5, + 0x6FB9, 0x6FB9, 0x1081, 0x6FBE, 0x6FBE, 0x1075, 0x6FC0, 0x6FC0, 0x0E31, + 0x6FC1, 0x6FC1, 0x1CEA, 0x6FC2, 0x6FC2, 0x1186, 0x6FC3, 0x6FC3, 0x104F, + 0x6FCA, 0x6FCA, 0x1793, 0x6FD5, 0x6FD5, 0x162D, 0x6FDA, 0x6FDA, 0x177D, + 0x6FDF, 0x6FDF, 0x1A70, 0x6FE0, 0x6FE0, 0x1E8A, 0x6FE1, 0x6FE1, 0x18BE, + 0x6FE4, 0x6FE4, 0x10C3, 0x6FE9, 0x6FE9, 0x1E8B, 0x6FEB, 0x6FEB, 0x1133, + 0x6FEC, 0x6FEC, 0x1B00, 0x6FEF, 0x6FEF, 0x1CEB, 0x6FF1, 0x6FF1, 0x146E, + 0x6FFE, 0x6FFE, 0x1161, 0x7001, 0x7001, 0x1702, 0x7005, 0x7005, 0x1E62, + 0x7006, 0x7006, 0x10D6, 0x7009, 0x7009, 0x149B, 0x700B, 0x700B, 0x1687, + 0x700F, 0x700F, 0x11E7, 0x7011, 0x7011, 0x1D96, 0x7015, 0x7015, 0x146F, + 0x7018, 0x7018, 0x11A4, 0x701A, 0x701A, 0x1DDA, 0x701B, 0x701B, 0x177E, + 0x701C, 0x701C, 0x18E2, 0x701D, 0x701D, 0x116D, 0x701E, 0x701E, 0x1A4C, + 0x701F, 0x701F, 0x158B, 0x7023, 0x7023, 0x1E0F, 0x7027, 0x7027, 0x11BB, + 0x7028, 0x7028, 0x11C0, 0x702F, 0x702F, 0x177F, 0x7037, 0x7037, 0x1925, + 0x703E, 0x703E, 0x1129, 0x704C, 0x704C, 0x0EF1, 0x7050, 0x7050, 0x1E63, + 0x7051, 0x7051, 0x15BA, 0x7058, 0x7058, 0x1CF6, 0x705D, 0x705D, 0x1E8C, + 0x7063, 0x7063, 0x1249, 0x706B, 0x706B, 0x1EBB, 0x7070, 0x7070, 0x1F04, + 0x7078, 0x7078, 0x0F51, 0x707C, 0x707C, 0x1972, 0x707D, 0x707D, 0x19B4, + 0x7085, 0x7085, 0x0E61, 0x708A, 0x708A, 0x1C99, 0x708E, 0x708E, 0x1767, + 0x7092, 0x7092, 0x1C38, 0x7098, 0x7098, 0x1F55, 0x7099, 0x7099, 0x195E, + 0x709A, 0x709A, 0x0F06, 0x70A1, 0x70A1, 0x1A4D, 0x70A4, 0x70A4, 0x158C, + 0x70AB, 0x70AB, 0x1E3C, 0x70AC, 0x70AC, 0x0E0A, 0x70AD, 0x70AD, 0x1CF7, + 0x70AF, 0x70AF, 0x1E64, 0x70B3, 0x70B3, 0x13BA, 0x70B7, 0x70B7, 0x1AE1, + 0x70B8, 0x70B8, 0x1973, 0x70B9, 0x70B9, 0x1A28, 0x70C8, 0x70C8, 0x1181, + 0x70CB, 0x70CB, 0x1F47, 0x70CF, 0x70CF, 0x17B6, 0x70D8, 0x70D8, 0x1EB2, + 0x70D9, 0x70D9, 0x111F, 0x70DD, 0x70DD, 0x1B17, 0x70DF, 0x70DF, 0x1753, + 0x70F1, 0x70F1, 0x0E62, 0x70F9, 0x70F9, 0x1D5B, 0x70FD, 0x70FD, 0x13EC, + 0x7104, 0x7104, 0x1F2F, 0x7109, 0x7109, 0x1720, 0x710C, 0x710C, 0x1B01, + 0x7119, 0x7119, 0x1371, 0x711A, 0x711A, 0x142B, 0x711E, 0x711E, 0x10E5, + 0x7121, 0x7121, 0x12D7, 0x7126, 0x7126, 0x1C39, 0x7130, 0x7130, 0x1768, + 0x7136, 0x7136, 0x1754, 0x7147, 0x7147, 0x1F41, 0x7149, 0x7149, 0x1175, + 0x714A, 0x714A, 0x1F38, 0x714C, 0x714C, 0x1EEE, 0x714E, 0x714E, 0x1A06, + 0x7150, 0x7150, 0x1780, 0x7156, 0x7156, 0x102D, 0x7159, 0x7159, 0x1755, + 0x715C, 0x715C, 0x185A, 0x715E, 0x715E, 0x14C6, 0x7164, 0x7164, 0x126C, + 0x7165, 0x7165, 0x1ED5, 0x7166, 0x7166, 0x1F28, 0x7167, 0x7167, 0x1A91, + 0x7169, 0x7169, 0x1386, 0x716C, 0x716C, 0x1703, 0x716E, 0x716E, 0x195F, + 0x717D, 0x717D, 0x1534, 0x7184, 0x7184, 0x1660, 0x7189, 0x7189, 0x1862, + 0x718A, 0x718A, 0x186D, 0x718F, 0x718F, 0x1F30, 0x7192, 0x7192, 0x1E65, + 0x7194, 0x7194, 0x182B, 0x7199, 0x7199, 0x1F70, 0x719F, 0x719F, 0x1603, + 0x71A2, 0x71A2, 0x13ED, 0x71AC, 0x71AC, 0x17B7, 0x71B1, 0x71B1, 0x1763, + 0x71B9, 0x71BA, 0x1F71, 0x71BE, 0x71BE, 0x1CB1, 0x71C1, 0x71C1, 0x1770, + 0x71C3, 0x71C3, 0x1756, 0x71C8, 0x71C8, 0x110F, 0x71C9, 0x71C9, 0x10E6, + 0x71CE, 0x71CE, 0x11CC, 0x71D0, 0x71D0, 0x1220, 0x71D2, 0x71D2, 0x158D, + 0x71D4, 0x71D4, 0x1387, 0x71D5, 0x71D5, 0x1757, 0x71DF, 0x71DF, 0x1781, + 0x71E5, 0x71E5, 0x1A92, 0x71E6, 0x71E6, 0x1B98, 0x71E7, 0x71E7, 0x15D6, + 0x71ED, 0x71ED, 0x1C4B, 0x71EE, 0x71EE, 0x1561, 0x71FB, 0x71FB, 0x1F31, + 0x71FC, 0x71FC, 0x1670, 0x71FE, 0x71FE, 0x10C4, 0x71FF, 0x71FF, 0x180A, + 0x7200, 0x7200, 0x1E33, 0x7206, 0x7206, 0x1D97, 0x7210, 0x7210, 0x11A5, + 0x721B, 0x721B, 0x112A, 0x722A, 0x722A, 0x1A93, 0x722C, 0x722C, 0x1D3B, + 0x722D, 0x722D, 0x19BB, 0x7230, 0x7230, 0x187F, 0x7232, 0x7232, 0x1897, + 0x7235, 0x7235, 0x1974, 0x7236, 0x7236, 0x1409, 0x723A, 0x723A, 0x16ED, + 0x723B, 0x723B, 0x1F1A, 0x723D, 0x723D, 0x14E5, 0x723E, 0x723E, 0x1916, + 0x7240, 0x7240, 0x14E6, 0x7246, 0x7246, 0x1998, 0x7247, 0x7247, 0x1D61, + 0x7248, 0x7248, 0x1D45, 0x724C, 0x724C, 0x1D54, 0x7252, 0x7252, 0x1C17, + 0x7258, 0x7258, 0x10D7, 0x7259, 0x7259, 0x1696, 0x725B, 0x725B, 0x1842, + 0x725D, 0x725D, 0x1470, 0x725F, 0x725F, 0x12A9, 0x7261, 0x7261, 0x12AA, + 0x7262, 0x7262, 0x11C1, 0x7267, 0x7267, 0x12B6, 0x7269, 0x7269, 0x12F2, + 0x7272, 0x7272, 0x14F9, 0x7279, 0x7279, 0x1D30, 0x727D, 0x727D, 0x0E36, + 0x7280, 0x7280, 0x150C, 0x7281, 0x7281, 0x120F, 0x72A2, 0x72A2, 0x10D8, + 0x72A7, 0x72A7, 0x1F73, 0x72AC, 0x72AC, 0x0E37, 0x72AF, 0x72AF, 0x1397, + 0x72C0, 0x72C0, 0x14E7, 0x72C2, 0x72C2, 0x0F07, 0x72C4, 0x72C4, 0x19E2, + 0x72CE, 0x72CE, 0x16C7, 0x72D0, 0x72D0, 0x1E8D, 0x72D7, 0x72D7, 0x0F52, + 0x72D9, 0x72D9, 0x19CB, 0x72E1, 0x72E1, 0x0F27, 0x72E9, 0x72E9, 0x15D7, + 0x72F8, 0x72F8, 0x1210, 0x72F9, 0x72F9, 0x1E55, 0x72FC, 0x72FC, 0x113F, + 0x72FD, 0x72FD, 0x1D55, 0x730A, 0x730A, 0x1794, 0x7316, 0x7316, 0x1BC3, + 0x731B, 0x731B, 0x1279, 0x731C, 0x731C, 0x164C, 0x731D, 0x731D, 0x1AB4, + 0x7325, 0x7325, 0x17FA, 0x7329, 0x7329, 0x156A, 0x732A, 0x732A, 0x19CC, + 0x732B, 0x732B, 0x12C8, 0x7336, 0x7337, 0x18BF, 0x733E, 0x733E, 0x1EDD, + 0x733F, 0x733F, 0x1880, 0x7344, 0x7344, 0x17C0, 0x7345, 0x7345, 0x149C, + 0x7350, 0x7350, 0x1999, 0x7352, 0x7352, 0x17B8, 0x7357, 0x7357, 0x0F8C, + 0x7368, 0x7368, 0x10D9, 0x736A, 0x736A, 0x1F05, 0x7370, 0x7370, 0x1782, + 0x7372, 0x7372, 0x1F0D, 0x7375, 0x7375, 0x1188, 0x7378, 0x7378, 0x15D8, + 0x737A, 0x737A, 0x1076, 0x737B, 0x737B, 0x1E2D, 0x7384, 0x7384, 0x1E3D, + 0x7386, 0x7386, 0x1960, 0x7387, 0x7387, 0x15B0, 0x7389, 0x7389, 0x17C1, + 0x738B, 0x738B, 0x17F2, 0x738E, 0x738E, 0x1A4E, 0x7394, 0x7394, 0x1BF4, + 0x7396, 0x7396, 0x0F53, 0x7397, 0x7397, 0x1843, 0x7398, 0x7398, 0x0FFE, + 0x739F, 0x739F, 0x130F, 0x73A7, 0x73A7, 0x18DB, 0x73A9, 0x73A9, 0x17E1, + 0x73AD, 0x73AD, 0x1471, 0x73B2, 0x73B2, 0x118F, 0x73B3, 0x73B3, 0x10A4, + 0x73B9, 0x73B9, 0x1E3E, 0x73C0, 0x73C0, 0x131E, 0x73C2, 0x73C2, 0x0D7C, + 0x73C9, 0x73C9, 0x1310, 0x73CA, 0x73CA, 0x14BC, 0x73CC, 0x73CC, 0x1DB8, + 0x73CD, 0x73CD, 0x1B50, 0x73CF, 0x73CF, 0x0D8F, 0x73D6, 0x73D6, 0x0F08, + 0x73D9, 0x73D9, 0x0ED5, 0x73DD, 0x73DD, 0x1F29, 0x73DE, 0x73DE, 0x1120, + 0x73E0, 0x73E0, 0x1AE2, 0x73E3, 0x73E3, 0x1613, 0x73E4, 0x73E4, 0x13CB, + 0x73E5, 0x73E5, 0x1917, 0x73E6, 0x73E6, 0x1E21, 0x73E9, 0x73E9, 0x1E66, + 0x73EA, 0x73EA, 0x0F9F, 0x73ED, 0x73ED, 0x1334, 0x73F7, 0x73F7, 0x12D8, + 0x73F9, 0x73F9, 0x156B, 0x73FD, 0x73FD, 0x1A4F, 0x73FE, 0x73FE, 0x1E3F, + 0x7401, 0x7401, 0x1535, 0x7403, 0x7403, 0x0F54, 0x7405, 0x7405, 0x1140, + 0x7406, 0x7406, 0x1211, 0x7407, 0x7407, 0x15D9, 0x7409, 0x7409, 0x11E8, + 0x7413, 0x7413, 0x17E2, 0x741B, 0x741B, 0x1CCC, 0x7420, 0x7420, 0x1A07, + 0x7421, 0x7421, 0x1604, 0x7422, 0x7422, 0x1CEC, 0x7425, 0x7425, 0x1E8E, + 0x7426, 0x7426, 0x0FFF, 0x7428, 0x7428, 0x0EC5, 0x742A, 0x742A, 0x1000, + 0x742B, 0x742B, 0x13EE, 0x742C, 0x742C, 0x17E3, 0x742E, 0x742E, 0x1ABC, + 0x742F, 0x742F, 0x0EF2, 0x7430, 0x7430, 0x1769, 0x7433, 0x7433, 0x1229, + 0x7434, 0x7434, 0x0FCB, 0x7435, 0x7435, 0x1451, 0x7436, 0x7436, 0x1D3C, + 0x7438, 0x7438, 0x1CED, 0x743A, 0x743A, 0x139B, 0x743F, 0x743F, 0x1EA8, + 0x7440, 0x7440, 0x1844, 0x7441, 0x7441, 0x12AB, 0x7443, 0x7443, 0x1C86, + 0x7444, 0x7444, 0x1536, 0x744B, 0x744B, 0x1898, 0x7455, 0x7455, 0x1DC7, + 0x7457, 0x7457, 0x1881, 0x7459, 0x7459, 0x104D, 0x745A, 0x745A, 0x1E8F, + 0x745B, 0x745B, 0x1783, 0x745C, 0x745C, 0x18C1, 0x745E, 0x745E, 0x150D, + 0x745F, 0x745F, 0x162A, 0x7460, 0x7460, 0x11E9, 0x7462, 0x7462, 0x182C, + 0x7464, 0x7464, 0x180B, 0x7465, 0x7465, 0x17C4, 0x7468, 0x7468, 0x1B51, + 0x7469, 0x7469, 0x1E67, 0x746A, 0x746A, 0x1231, 0x746F, 0x746F, 0x1141, + 0x747E, 0x747E, 0x0FBE, 0x7482, 0x7482, 0x1001, 0x7483, 0x7483, 0x1212, + 0x7487, 0x7487, 0x1537, 0x7489, 0x7489, 0x1176, 0x748B, 0x748B, 0x199A, + 0x7498, 0x7498, 0x1221, 0x749C, 0x749C, 0x1EEF, 0x749E, 0x749E, 0x131F, + 0x749F, 0x749F, 0x0E63, 0x74A1, 0x74A1, 0x1B52, 0x74A3, 0x74A3, 0x1002, + 0x74A5, 0x74A5, 0x0E64, 0x74A7, 0x74A7, 0x13A1, 0x74A8, 0x74A8, 0x1B99, + 0x74AA, 0x74AA, 0x1A94, 0x74B0, 0x74B0, 0x1ED6, 0x74B2, 0x74B2, 0x15DA, + 0x74B5, 0x74B5, 0x1733, 0x74B9, 0x74B9, 0x1605, 0x74BD, 0x74BD, 0x14F3, + 0x74BF, 0x74BF, 0x1538, 0x74C6, 0x74C6, 0x1B6D, 0x74CA, 0x74CA, 0x0E65, + 0x74CF, 0x74CF, 0x11BC, 0x74D4, 0x74D4, 0x1784, 0x74D8, 0x74D8, 0x0EF3, + 0x74DA, 0x74DA, 0x1B9A, 0x74DC, 0x74DC, 0x0EDE, 0x74E0, 0x74E0, 0x1E90, + 0x74E2, 0x74E2, 0x1D9F, 0x74E3, 0x74E3, 0x1D46, 0x74E6, 0x74E6, 0x17D4, + 0x74EE, 0x74EE, 0x17CC, 0x74F7, 0x74F7, 0x1961, 0x7501, 0x7501, 0x13BB, + 0x7504, 0x7504, 0x0E38, 0x7511, 0x7511, 0x1B18, 0x7515, 0x7515, 0x17CD, + 0x7518, 0x7518, 0x0DC1, 0x751A, 0x751A, 0x1688, 0x751B, 0x751B, 0x1C0D, + 0x751F, 0x751F, 0x14FA, 0x7523, 0x7523, 0x14BD, 0x7525, 0x7525, 0x14FB, + 0x7526, 0x7526, 0x158E, 0x7528, 0x7528, 0x182D, 0x752B, 0x752B, 0x13CC, + 0x752C, 0x752C, 0x182E, 0x7530, 0x7530, 0x1A08, 0x7531, 0x7531, 0x18C2, + 0x7532, 0x7532, 0x0DCC, 0x7533, 0x7533, 0x1671, 0x7537, 0x7537, 0x1035, + 0x7538, 0x7538, 0x1A09, 0x753A, 0x753A, 0x1A50, 0x7547, 0x7547, 0x0FAB, + 0x754C, 0x754C, 0x0E85, 0x754F, 0x754F, 0x17FB, 0x7551, 0x7551, 0x1A0A, + 0x7553, 0x7553, 0x108B, 0x7554, 0x7554, 0x1335, 0x7559, 0x7559, 0x11EA, + 0x755B, 0x755B, 0x1B53, 0x755C, 0x755C, 0x1C79, 0x755D, 0x755D, 0x12D9, + 0x7562, 0x7562, 0x1DB9, 0x7565, 0x7565, 0x114A, 0x7566, 0x7566, 0x1F48, + 0x756A, 0x756A, 0x1388, 0x756F, 0x756F, 0x1B02, 0x7570, 0x7570, 0x1918, + 0x7575, 0x7575, 0x1EBC, 0x7576, 0x7576, 0x1096, 0x7578, 0x7578, 0x1003, + 0x757A, 0x757A, 0x0DDA, 0x757F, 0x757F, 0x1004, 0x7586, 0x7586, 0x0DDB, + 0x7587, 0x7587, 0x1AE3, 0x758A, 0x758A, 0x1C18, 0x758B, 0x758B, 0x1DBA, + 0x758E, 0x758E, 0x1590, 0x758F, 0x758F, 0x158F, 0x7591, 0x7591, 0x1903, + 0x759D, 0x759D, 0x14BE, 0x75A5, 0x75A5, 0x0DF3, 0x75AB, 0x75AB, 0x173F, + 0x75B1, 0x75B1, 0x1D86, 0x75B2, 0x75B2, 0x1DAF, 0x75B3, 0x75B3, 0x0DC2, + 0x75B5, 0x75B5, 0x1962, 0x75B8, 0x75B8, 0x1077, 0x75B9, 0x75B9, 0x1B54, + 0x75BC, 0x75BC, 0x10F6, 0x75BD, 0x75BD, 0x19CD, 0x75BE, 0x75BE, 0x1B6E, + 0x75C2, 0x75C2, 0x0D7D, 0x75C5, 0x75C5, 0x13BC, 0x75C7, 0x75C7, 0x1B19, + 0x75CD, 0x75CD, 0x1919, 0x75D2, 0x75D2, 0x1704, 0x75D4, 0x75D4, 0x1CB2, + 0x75D5, 0x75D5, 0x1F56, 0x75D8, 0x75D8, 0x1100, 0x75D9, 0x75D9, 0x0E66, + 0x75DB, 0x75DB, 0x1D1F, 0x75E2, 0x75E2, 0x1213, 0x75F0, 0x75F0, 0x1082, + 0x75F2, 0x75F2, 0x1232, 0x75F4, 0x75F4, 0x1CB3, 0x75FA, 0x75FA, 0x1452, + 0x75FC, 0x75FC, 0x0EA2, 0x7600, 0x7600, 0x1712, 0x760D, 0x760D, 0x1705, + 0x7619, 0x7619, 0x1591, 0x761F, 0x761F, 0x17C5, 0x7620, 0x7620, 0x1BE7, + 0x7621, 0x7621, 0x1BC4, 0x7622, 0x7622, 0x1336, 0x7624, 0x7624, 0x11EB, + 0x7626, 0x7626, 0x15DB, 0x763B, 0x763B, 0x11DA, 0x7642, 0x7642, 0x11CD, + 0x764C, 0x764C, 0x16C2, 0x764E, 0x764E, 0x0DA1, 0x7652, 0x7652, 0x18C3, + 0x7656, 0x7656, 0x13A2, 0x7661, 0x7661, 0x1CB4, 0x7664, 0x7664, 0x1A20, + 0x7669, 0x7669, 0x1118, 0x766C, 0x766C, 0x1539, 0x7670, 0x7670, 0x17CE, + 0x7672, 0x7672, 0x1A0B, 0x7678, 0x7678, 0x0E86, 0x767B, 0x767B, 0x1110, + 0x767C, 0x767C, 0x1347, 0x767D, 0x767E, 0x1381, 0x7684, 0x7684, 0x19E3, + 0x7686, 0x7686, 0x0DF4, 0x7687, 0x7687, 0x1EF0, 0x768E, 0x768E, 0x0F28, + 0x7690, 0x7690, 0x0EA3, 0x7693, 0x7693, 0x1E91, 0x76AE, 0x76AE, 0x1DB0, + 0x76BA, 0x76BA, 0x1C68, 0x76BF, 0x76BF, 0x1293, 0x76C2, 0x76C2, 0x1845, + 0x76C3, 0x76C3, 0x1372, 0x76C6, 0x76C6, 0x142C, 0x76C8, 0x76C8, 0x1785, + 0x76CA, 0x76CA, 0x1926, 0x76D2, 0x76D2, 0x1DF1, 0x76D6, 0x76D6, 0x0DF5, + 0x76DB, 0x76DB, 0x156C, 0x76DC, 0x76DC, 0x10C5, 0x76DE, 0x76DE, 0x197E, + 0x76DF, 0x76DF, 0x127B, 0x76E1, 0x76E1, 0x1B55, 0x76E3, 0x76E3, 0x0DC3, + 0x76E4, 0x76E4, 0x1337, 0x76E7, 0x76E7, 0x11A6, 0x76EE, 0x76EE, 0x12B7, + 0x76F2, 0x76F2, 0x127A, 0x76F4, 0x76F4, 0x1B3F, 0x76F8, 0x76F8, 0x14E8, + 0x76FC, 0x76FC, 0x1338, 0x76FE, 0x76FE, 0x1614, 0x7701, 0x7701, 0x156D, + 0x7704, 0x7704, 0x1284, 0x7708, 0x7708, 0x1CFD, 0x7709, 0x7709, 0x12FE, + 0x770B, 0x770B, 0x0DA2, 0x771E, 0x771E, 0x1B56, 0x7720, 0x7720, 0x1285, + 0x7729, 0x7729, 0x1E40, 0x7737, 0x7737, 0x0F8A, 0x7738, 0x7738, 0x12AC, + 0x773A, 0x773A, 0x1A95, 0x773C, 0x773C, 0x16B4, 0x7740, 0x7740, 0x1B91, + 0x774D, 0x774D, 0x1E41, 0x775B, 0x775B, 0x1A51, 0x7761, 0x7761, 0x15DC, + 0x7763, 0x7763, 0x10DA, 0x7766, 0x7766, 0x12B8, 0x776B, 0x776B, 0x1C19, + 0x7779, 0x7779, 0x10C6, 0x777E, 0x777E, 0x0EA4, 0x777F, 0x777F, 0x1795, + 0x778B, 0x778B, 0x1B57, 0x7791, 0x7791, 0x1294, 0x779E, 0x779E, 0x124A, + 0x77A5, 0x77A5, 0x13AE, 0x77AC, 0x77AC, 0x1615, 0x77AD, 0x77AD, 0x11CE, + 0x77B0, 0x77B0, 0x0DC4, 0x77B3, 0x77B3, 0x10F7, 0x77BB, 0x77BB, 0x1C0E, + 0x77BC, 0x77BC, 0x0E25, 0x77BF, 0x77BF, 0x0F55, 0x77D7, 0x77D7, 0x1C4C, + 0x77DB, 0x77DB, 0x12AD, 0x77DC, 0x77DC, 0x0FDC, 0x77E2, 0x77E2, 0x164D, + 0x77E3, 0x77E3, 0x1904, 0x77E5, 0x77E5, 0x1B30, 0x77E9, 0x77E9, 0x0F56, + 0x77ED, 0x77ED, 0x106C, 0x77EE, 0x77EE, 0x17F6, 0x77EF, 0x77EF, 0x0F29, + 0x77F3, 0x77F3, 0x1525, 0x7802, 0x7802, 0x149D, 0x7812, 0x7812, 0x1453, + 0x7825, 0x7825, 0x1B31, 0x7826, 0x7826, 0x1BD0, 0x7827, 0x7827, 0x1CCD, + 0x782C, 0x782C, 0x122C, 0x7832, 0x7832, 0x1D87, 0x7834, 0x7834, 0x1D3D, + 0x7845, 0x7845, 0x0FA0, 0x784F, 0x784F, 0x1758, 0x785D, 0x785D, 0x1C3A, + 0x786B, 0x786B, 0x11EC, 0x786C, 0x786C, 0x0E67, 0x786F, 0x786F, 0x1759, + 0x787C, 0x787C, 0x143A, 0x7881, 0x7881, 0x1005, 0x7887, 0x7887, 0x1A52, + 0x788C, 0x788C, 0x11B0, 0x788D, 0x788D, 0x16D7, 0x788E, 0x788E, 0x15BB, + 0x7891, 0x7891, 0x1454, 0x7897, 0x7897, 0x17E4, 0x78A3, 0x78A3, 0x0DB0, + 0x78A7, 0x78A7, 0x13A3, 0x78A9, 0x78A9, 0x1526, 0x78BA, 0x78BB, 0x1EC7, + 0x78BC, 0x78BC, 0x1233, 0x78C1, 0x78C1, 0x1963, 0x78C5, 0x78C5, 0x135C, + 0x78CA, 0x78CA, 0x11C2, 0x78CB, 0x78CB, 0x1B8A, 0x78CE, 0x78CE, 0x0E87, + 0x78D0, 0x78D0, 0x1339, 0x78E8, 0x78E8, 0x1234, 0x78EC, 0x78EC, 0x0E68, + 0x78EF, 0x78EF, 0x1006, 0x78F5, 0x78F5, 0x0DA3, 0x78FB, 0x78FB, 0x133A, + 0x7901, 0x7901, 0x1C3B, 0x790E, 0x790E, 0x1C3C, 0x7916, 0x7916, 0x1734, + 0x792A, 0x792A, 0x1162, 0x792B, 0x792B, 0x116E, 0x792C, 0x792C, 0x133B, + 0x793A, 0x793A, 0x164E, 0x793E, 0x793E, 0x149E, 0x7940, 0x7940, 0x149F, + 0x7941, 0x7941, 0x1007, 0x7947, 0x7948, 0x1008, 0x7949, 0x7949, 0x1B32, + 0x7950, 0x7950, 0x1846, 0x7956, 0x7956, 0x1A96, 0x7957, 0x7957, 0x1B33, + 0x795A, 0x795A, 0x1A97, 0x795B, 0x795B, 0x0E0B, 0x795C, 0x795C, 0x1E92, + 0x795D, 0x795D, 0x1C7A, 0x795E, 0x795E, 0x1672, 0x7960, 0x7960, 0x14A0, + 0x7965, 0x7965, 0x14E9, 0x7968, 0x7968, 0x1DA0, 0x796D, 0x796D, 0x1A71, + 0x797A, 0x797A, 0x100A, 0x797F, 0x797F, 0x11B1, 0x7981, 0x7981, 0x0FCC, + 0x798D, 0x798D, 0x1EBD, 0x798E, 0x798E, 0x1A53, 0x798F, 0x798F, 0x13D9, + 0x7991, 0x7991, 0x1847, 0x79A6, 0x79A6, 0x1713, 0x79A7, 0x79A7, 0x1F74, + 0x79AA, 0x79AA, 0x153A, 0x79AE, 0x79AE, 0x119C, 0x79B1, 0x79B1, 0x10C7, + 0x79B3, 0x79B3, 0x1706, 0x79B9, 0x79B9, 0x1848, 0x79BD, 0x79BD, 0x0FCD, + 0x79BE, 0x79BE, 0x1EBE, 0x79BF, 0x79BF, 0x10DB, 0x79C0, 0x79C0, 0x15DD, + 0x79C1, 0x79C1, 0x14A1, 0x79C9, 0x79C9, 0x13BD, 0x79CA, 0x79CA, 0x1042, + 0x79CB, 0x79CB, 0x1C69, 0x79D1, 0x79D1, 0x0EDF, 0x79D2, 0x79D2, 0x1C3D, + 0x79D5, 0x79D5, 0x1455, 0x79D8, 0x79D8, 0x1456, 0x79DF, 0x79DF, 0x1A98, + 0x79E4, 0x79E4, 0x1CD1, 0x79E6, 0x79E6, 0x1B58, 0x79E7, 0x79E7, 0x16CE, + 0x79E9, 0x79E9, 0x1B6F, 0x79FB, 0x79FB, 0x191A, 0x7A00, 0x7A00, 0x1F75, + 0x7A05, 0x7A05, 0x1578, 0x7A08, 0x7A08, 0x0DA4, 0x7A0B, 0x7A0B, 0x1A54, + 0x7A0D, 0x7A0D, 0x1C3E, 0x7A14, 0x7A14, 0x194A, 0x7A17, 0x7A17, 0x1D56, + 0x7A19, 0x7A19, 0x1B40, 0x7A1A, 0x7A1A, 0x1CB5, 0x7A1C, 0x7A1C, 0x1201, + 0x7A1F, 0x7A1F, 0x1DA7, 0x7A20, 0x7A20, 0x1A99, 0x7A2E, 0x7A2E, 0x1ABD, + 0x7A31, 0x7A31, 0x1CD2, 0x7A36, 0x7A36, 0x185B, 0x7A37, 0x7A37, 0x1B41, + 0x7A3B, 0x7A3B, 0x10C8, 0x7A3C, 0x7A3C, 0x0D7E, 0x7A3D, 0x7A3D, 0x0E88, + 0x7A3F, 0x7A3F, 0x0EA5, 0x7A40, 0x7A40, 0x0EBB, 0x7A46, 0x7A46, 0x12B9, + 0x7A49, 0x7A49, 0x1CB6, 0x7A4D, 0x7A4D, 0x19E4, 0x7A4E, 0x7A4E, 0x1786, + 0x7A57, 0x7A57, 0x15DE, 0x7A61, 0x7A61, 0x14F6, 0x7A62, 0x7A62, 0x1796, + 0x7A69, 0x7A69, 0x17C6, 0x7A6B, 0x7A6B, 0x1EC9, 0x7A70, 0x7A70, 0x1707, + 0x7A74, 0x7A74, 0x1E4B, 0x7A76, 0x7A76, 0x0F57, 0x7A79, 0x7A79, 0x0F7D, + 0x7A7A, 0x7A7A, 0x0ED6, 0x7A7D, 0x7A7D, 0x1A55, 0x7A7F, 0x7A7F, 0x1BF5, + 0x7A81, 0x7A81, 0x10EA, 0x7A84, 0x7A84, 0x1B92, 0x7A88, 0x7A88, 0x180C, + 0x7A92, 0x7A92, 0x1B70, 0x7A93, 0x7A93, 0x1BC5, 0x7A95, 0x7A95, 0x1A9A, + 0x7A98, 0x7A98, 0x0F72, 0x7A9F, 0x7A9F, 0x0F7A, 0x7AA9, 0x7AAA, 0x17D5, + 0x7AAE, 0x7AAE, 0x0F7E, 0x7AAF, 0x7AAF, 0x180D, 0x7ABA, 0x7ABA, 0x0FA1, + 0x7AC4, 0x7AC4, 0x1B9B, 0x7AC5, 0x7AC5, 0x0FA2, 0x7AC7, 0x7AC7, 0x1101, + 0x7ACA, 0x7ACA, 0x1A21, 0x7ACB, 0x7ACB, 0x122D, 0x7AD7, 0x7AD7, 0x12C9, + 0x7AD9, 0x7AD9, 0x1BB1, 0x7ADD, 0x7ADD, 0x13BE, 0x7ADF, 0x7ADF, 0x0E69, + 0x7AE0, 0x7AE0, 0x199B, 0x7AE3, 0x7AE3, 0x1B03, 0x7AE5, 0x7AE5, 0x10F8, + 0x7AEA, 0x7AEA, 0x15DF, 0x7AED, 0x7AED, 0x0DB1, 0x7AEF, 0x7AEF, 0x106D, + 0x7AF6, 0x7AF6, 0x0E6A, 0x7AF9, 0x7AF9, 0x1AF4, 0x7AFA, 0x7AFA, 0x1C7B, + 0x7AFF, 0x7AFF, 0x0DA5, 0x7B0F, 0x7B0F, 0x1EAC, 0x7B11, 0x7B11, 0x1592, + 0x7B19, 0x7B19, 0x14FC, 0x7B1B, 0x7B1B, 0x19E5, 0x7B1E, 0x7B1E, 0x1D0F, + 0x7B20, 0x7B20, 0x122E, 0x7B26, 0x7B26, 0x140A, 0x7B2C, 0x7B2C, 0x1A72, + 0x7B2D, 0x7B2D, 0x1190, 0x7B39, 0x7B39, 0x1579, 0x7B46, 0x7B46, 0x1DBB, + 0x7B49, 0x7B49, 0x1111, 0x7B4B, 0x7B4B, 0x0FBF, 0x7B4C, 0x7B4C, 0x1A0C, + 0x7B4D, 0x7B4D, 0x1616, 0x7B4F, 0x7B4F, 0x138E, 0x7B50, 0x7B50, 0x0F09, + 0x7B51, 0x7B51, 0x1C7C, 0x7B52, 0x7B52, 0x1D20, 0x7B54, 0x7B54, 0x108C, + 0x7B56, 0x7B56, 0x1BD8, 0x7B60, 0x7B60, 0x0FAC, 0x7B6C, 0x7B6C, 0x156E, + 0x7B6E, 0x7B6E, 0x150E, 0x7B75, 0x7B75, 0x175A, 0x7B7D, 0x7B7D, 0x17B9, + 0x7B87, 0x7B87, 0x0DF6, 0x7B8B, 0x7B8B, 0x1A0D, 0x7B8F, 0x7B8F, 0x19BC, + 0x7B94, 0x7B94, 0x1320, 0x7B95, 0x7B95, 0x100B, 0x7B97, 0x7B97, 0x14BF, + 0x7B9A, 0x7B9A, 0x1B8B, 0x7B9D, 0x7B9D, 0x0E48, 0x7BA1, 0x7BA1, 0x0EF4, + 0x7BAD, 0x7BAD, 0x1A0E, 0x7BB1, 0x7BB1, 0x14EA, 0x7BB4, 0x7BB4, 0x1982, + 0x7BB8, 0x7BB8, 0x19CE, 0x7BC0, 0x7BC0, 0x1A22, 0x7BC1, 0x7BC1, 0x1EF1, + 0x7BC4, 0x7BC4, 0x1398, 0x7BC6, 0x7BC6, 0x1A0F, 0x7BC7, 0x7BC7, 0x1D62, + 0x7BC9, 0x7BC9, 0x1C7D, 0x7BD2, 0x7BD2, 0x1661, 0x7BE0, 0x7BE0, 0x1593, + 0x7BE4, 0x7BE4, 0x10DC, 0x7BE9, 0x7BE9, 0x14A2, 0x7C07, 0x7C07, 0x1AAD, + 0x7C12, 0x7C12, 0x1B9C, 0x7C1E, 0x7C1E, 0x106E, 0x7C21, 0x7C21, 0x0DA6, + 0x7C27, 0x7C27, 0x1EF2, 0x7C2A, 0x7C2A, 0x1983, 0x7C2B, 0x7C2B, 0x1594, + 0x7C3D, 0x7C3D, 0x1C0F, 0x7C3E, 0x7C3E, 0x1187, 0x7C3F, 0x7C3F, 0x140B, + 0x7C43, 0x7C43, 0x1134, 0x7C4C, 0x7C4C, 0x1AE4, 0x7C4D, 0x7C4D, 0x19E6, + 0x7C60, 0x7C60, 0x11BD, 0x7C64, 0x7C64, 0x1C10, 0x7C6C, 0x7C6C, 0x1214, + 0x7C73, 0x7C73, 0x12FF, 0x7C83, 0x7C83, 0x1457, 0x7C89, 0x7C89, 0x142D, + 0x7C92, 0x7C92, 0x122F, 0x7C95, 0x7C95, 0x1321, 0x7C97, 0x7C97, 0x1A9B, + 0x7C98, 0x7C98, 0x1A29, 0x7C9F, 0x7C9F, 0x15A5, 0x7CA5, 0x7CA5, 0x1AF5, + 0x7CA7, 0x7CA7, 0x199C, 0x7CAE, 0x7CAE, 0x1151, 0x7CB1, 0x7CB1, 0x1152, + 0x7CB2, 0x7CB2, 0x1B9E, 0x7CB3, 0x7CB3, 0x0DFE, 0x7CB9, 0x7CB9, 0x15E0, + 0x7CBE, 0x7CBE, 0x1A56, 0x7CCA, 0x7CCA, 0x1E93, 0x7CD6, 0x7CD6, 0x1097, + 0x7CDE, 0x7CDE, 0x142E, 0x7CDF, 0x7CDF, 0x1A9C, 0x7CE0, 0x7CE0, 0x0DDC, + 0x7CE7, 0x7CE7, 0x1153, 0x7CFB, 0x7CFB, 0x0E89, 0x7CFE, 0x7CFE, 0x0FA3, + 0x7D00, 0x7D00, 0x100C, 0x7D02, 0x7D02, 0x1AE5, 0x7D04, 0x7D04, 0x16F1, + 0x7D05, 0x7D05, 0x1EB3, 0x7D06, 0x7D06, 0x1849, 0x7D07, 0x7D07, 0x1F59, + 0x7D08, 0x7D08, 0x1ED7, 0x7D0A, 0x7D0B, 0x12EA, 0x7D0D, 0x7D0D, 0x1036, + 0x7D10, 0x7D10, 0x1058, 0x7D14, 0x7D14, 0x1617, 0x7D17, 0x7D17, 0x14A3, + 0x7D18, 0x7D18, 0x0F19, 0x7D19, 0x7D19, 0x1B34, 0x7D1A, 0x7D1A, 0x0FD8, + 0x7D1B, 0x7D1B, 0x142F, 0x7D20, 0x7D20, 0x1595, 0x7D21, 0x7D21, 0x135D, + 0x7D22, 0x7D22, 0x14F7, 0x7D2B, 0x7D2B, 0x1964, 0x7D2C, 0x7D2C, 0x1AE6, + 0x7D2E, 0x7D2E, 0x1BA9, 0x7D2F, 0x7D2F, 0x11DB, 0x7D30, 0x7D30, 0x157A, + 0x7D33, 0x7D33, 0x1673, 0x7D35, 0x7D35, 0x19CF, 0x7D39, 0x7D39, 0x1596, + 0x7D3A, 0x7D3A, 0x0DC5, 0x7D42, 0x7D42, 0x1ABE, 0x7D43, 0x7D43, 0x1E42, + 0x7D44, 0x7D44, 0x1A9D, 0x7D45, 0x7D45, 0x0E6B, 0x7D46, 0x7D46, 0x133C, + 0x7D50, 0x7D50, 0x0E43, 0x7D5E, 0x7D5E, 0x0F2A, 0x7D61, 0x7D61, 0x1121, + 0x7D62, 0x7D62, 0x1E43, 0x7D66, 0x7D66, 0x0FD9, 0x7D68, 0x7D68, 0x18E3, + 0x7D6A, 0x7D6A, 0x1936, 0x7D6E, 0x7D6E, 0x150F, 0x7D71, 0x7D71, 0x1D21, + 0x7D72, 0x7D72, 0x14A4, 0x7D73, 0x7D73, 0x0DDD, 0x7D76, 0x7D76, 0x1A23, + 0x7D79, 0x7D79, 0x0E39, 0x7D7F, 0x7D7F, 0x0F58, 0x7D8E, 0x7D8E, 0x1A57, + 0x7D8F, 0x7D8F, 0x15E1, 0x7D93, 0x7D93, 0x0E6C, 0x7D9C, 0x7D9C, 0x1ABF, + 0x7DA0, 0x7DA0, 0x11B2, 0x7DA2, 0x7DA2, 0x1AE7, 0x7DAC, 0x7DAC, 0x15E2, + 0x7DAD, 0x7DAD, 0x18C4, 0x7DB1, 0x7DB1, 0x0DDE, 0x7DB2, 0x7DB2, 0x125D, + 0x7DB4, 0x7DB4, 0x1C05, 0x7DB5, 0x7DB5, 0x1BD1, 0x7DB8, 0x7DB8, 0x11F6, + 0x7DBA, 0x7DBA, 0x100D, 0x7DBB, 0x7DBB, 0x1CF8, 0x7DBD, 0x7DBD, 0x1975, + 0x7DBE, 0x7DBE, 0x1202, 0x7DBF, 0x7DBF, 0x1286, 0x7DC7, 0x7DC7, 0x1CB7, + 0x7DCA, 0x7DCA, 0x101E, 0x7DCB, 0x7DCB, 0x1458, 0x7DD6, 0x7DD6, 0x1510, + 0x7DD8, 0x7DD8, 0x1DEA, 0x7DDA, 0x7DDA, 0x153B, 0x7DDD, 0x7DDD, 0x1B7A, + 0x7DDE, 0x7DDE, 0x106F, 0x7DE0, 0x7DE0, 0x1C29, 0x7DE1, 0x7DE1, 0x1311, + 0x7DE3, 0x7DE3, 0x175B, 0x7DE8, 0x7DE8, 0x1D63, 0x7DE9, 0x7DE9, 0x17E5, + 0x7DEC, 0x7DEC, 0x1287, 0x7DEF, 0x7DEF, 0x1899, 0x7DF4, 0x7DF4, 0x1177, + 0x7DFB, 0x7DFB, 0x1CB8, 0x7E09, 0x7E09, 0x1B59, 0x7E0A, 0x7E0A, 0x16DF, + 0x7E15, 0x7E15, 0x17C7, 0x7E1B, 0x7E1B, 0x1322, 0x7E1D, 0x7E1D, 0x1B5A, + 0x7E1E, 0x7E1E, 0x1E94, 0x7E1F, 0x7E1F, 0x181B, 0x7E21, 0x7E21, 0x19B5, + 0x7E23, 0x7E23, 0x1E44, 0x7E2B, 0x7E2B, 0x13EF, 0x7E2E, 0x7E2E, 0x1C7E, + 0x7E2F, 0x7E2F, 0x175C, 0x7E31, 0x7E31, 0x1AC0, 0x7E37, 0x7E37, 0x11DC, + 0x7E3D, 0x7E3D, 0x1C59, 0x7E3E, 0x7E3E, 0x19E7, 0x7E41, 0x7E41, 0x1389, + 0x7E43, 0x7E43, 0x143B, 0x7E46, 0x7E46, 0x12DA, 0x7E47, 0x7E47, 0x180E, + 0x7E52, 0x7E52, 0x1B1A, 0x7E54, 0x7E54, 0x1B42, 0x7E55, 0x7E55, 0x153C, + 0x7E5E, 0x7E5E, 0x180F, 0x7E61, 0x7E61, 0x15E3, 0x7E69, 0x7E69, 0x1639, + 0x7E6A, 0x7E6A, 0x1F06, 0x7E6B, 0x7E6B, 0x0E8A, 0x7E6D, 0x7E6D, 0x0E3A, + 0x7E70, 0x7E70, 0x1A9E, 0x7E79, 0x7E79, 0x1740, 0x7E7C, 0x7E7C, 0x0E8B, + 0x7E82, 0x7E82, 0x1B9D, 0x7E8C, 0x7E8C, 0x15A6, 0x7E8F, 0x7E8F, 0x1A10, + 0x7E93, 0x7E93, 0x1787, 0x7E96, 0x7E96, 0x155A, 0x7E98, 0x7E98, 0x1B9F, + 0x7E9B, 0x7E9B, 0x10DD, 0x7E9C, 0x7E9C, 0x1135, 0x7F36, 0x7F36, 0x140C, + 0x7F38, 0x7F38, 0x1E01, 0x7F3A, 0x7F3A, 0x0E44, 0x7F4C, 0x7F4C, 0x16E3, + 0x7F50, 0x7F50, 0x0EF5, 0x7F54, 0x7F54, 0x125E, 0x7F55, 0x7F55, 0x1DDB, + 0x7F6A, 0x7F6A, 0x1ACB, 0x7F6B, 0x7F6B, 0x0F0E, 0x7F6E, 0x7F6E, 0x1CB9, + 0x7F70, 0x7F70, 0x138F, 0x7F72, 0x7F72, 0x1511, 0x7F75, 0x7F75, 0x126D, + 0x7F77, 0x7F77, 0x1D3E, 0x7F79, 0x7F79, 0x1215, 0x7F85, 0x7F85, 0x1119, + 0x7F88, 0x7F88, 0x100E, 0x7F8A, 0x7F8A, 0x1708, 0x7F8C, 0x7F8C, 0x0DDF, + 0x7F8E, 0x7F8E, 0x1300, 0x7F94, 0x7F94, 0x0EA6, 0x7F9A, 0x7F9A, 0x1191, + 0x7F9E, 0x7F9E, 0x15E4, 0x7FA4, 0x7FA4, 0x0F73, 0x7FA8, 0x7FA8, 0x153D, + 0x7FA9, 0x7FA9, 0x1905, 0x7FB2, 0x7FB2, 0x1F76, 0x7FB8, 0x7FB8, 0x1216, + 0x7FB9, 0x7FB9, 0x0DFF, 0x7FBD, 0x7FBD, 0x184A, 0x7FC1, 0x7FC1, 0x17CF, + 0x7FC5, 0x7FC5, 0x164F, 0x7FCA, 0x7FCA, 0x1927, 0x7FCC, 0x7FCC, 0x1928, + 0x7FCE, 0x7FCE, 0x1192, 0x7FD2, 0x7FD2, 0x162F, 0x7FD4, 0x7FD4, 0x14EB, + 0x7FD5, 0x7FD5, 0x1F61, 0x7FDF, 0x7FDF, 0x19E8, 0x7FE0, 0x7FE0, 0x1C9A, + 0x7FE1, 0x7FE1, 0x1459, 0x7FE9, 0x7FE9, 0x1D64, 0x7FEB, 0x7FEB, 0x17E6, + 0x7FF0, 0x7FF0, 0x1DDC, 0x7FF9, 0x7FF9, 0x0F2B, 0x7FFC, 0x7FFC, 0x1929, + 0x8000, 0x8000, 0x1810, 0x8001, 0x8001, 0x11A7, 0x8003, 0x8003, 0x0EA7, + 0x8005, 0x8005, 0x1965, 0x8006, 0x8006, 0x100F, 0x8009, 0x8009, 0x0F59, + 0x800C, 0x800C, 0x191B, 0x8010, 0x8010, 0x103E, 0x8015, 0x8015, 0x0E6D, + 0x8017, 0x8017, 0x12AE, 0x8018, 0x8018, 0x1863, 0x802D, 0x802D, 0x1010, + 0x8033, 0x8033, 0x191C, 0x8036, 0x8036, 0x16EE, 0x803D, 0x803D, 0x1CFE, + 0x803F, 0x803F, 0x0E6E, 0x8043, 0x8043, 0x1083, 0x8046, 0x8046, 0x1193, + 0x804A, 0x804A, 0x11CF, 0x8056, 0x8056, 0x156F, 0x8058, 0x8058, 0x1477, + 0x805A, 0x805A, 0x1C9B, 0x805E, 0x805E, 0x12EC, 0x806F, 0x806F, 0x1178, + 0x8070, 0x8070, 0x1C5A, 0x8072, 0x8072, 0x1570, 0x8073, 0x8073, 0x182F, + 0x8077, 0x8077, 0x1B43, 0x807D, 0x807D, 0x1C20, 0x807E, 0x807E, 0x11BE, + 0x807F, 0x807F, 0x18E0, 0x8084, 0x8084, 0x191D, 0x8085, 0x8085, 0x1606, + 0x8086, 0x8086, 0x14A5, 0x8087, 0x8087, 0x1A9F, 0x8089, 0x8089, 0x18D5, + 0x808B, 0x808B, 0x11FD, 0x808C, 0x808C, 0x1011, 0x8096, 0x8096, 0x1C3F, + 0x809B, 0x809B, 0x1E02, 0x809D, 0x809D, 0x0DA7, 0x80A1, 0x80A1, 0x0EA8, + 0x80A2, 0x80A2, 0x1B35, 0x80A5, 0x80A5, 0x145A, 0x80A9, 0x80A9, 0x0E3B, + 0x80AA, 0x80AA, 0x135E, 0x80AF, 0x80AF, 0x0FDD, 0x80B1, 0x80B1, 0x0F1A, + 0x80B2, 0x80B2, 0x18D6, 0x80B4, 0x80B4, 0x1F1B, 0x80BA, 0x80BA, 0x1D74, + 0x80C3, 0x80C3, 0x189A, 0x80C4, 0x80C4, 0x1AD1, 0x80CC, 0x80CC, 0x1373, + 0x80CE, 0x80CE, 0x1D10, 0x80DA, 0x80DA, 0x1374, 0x80DB, 0x80DB, 0x0DCD, + 0x80DE, 0x80DE, 0x1D88, 0x80E1, 0x80E1, 0x1E95, 0x80E4, 0x80E4, 0x18DC, + 0x80E5, 0x80E5, 0x1512, 0x80F1, 0x80F1, 0x0F0A, 0x80F4, 0x80F4, 0x10F9, + 0x80F8, 0x80F8, 0x1F51, 0x80FD, 0x80FD, 0x1059, 0x8102, 0x8102, 0x1B36, + 0x8105, 0x8105, 0x1E56, 0x8106, 0x8106, 0x1C9C, 0x8107, 0x8107, 0x1E57, + 0x8108, 0x8108, 0x1272, 0x810A, 0x810A, 0x1BE8, 0x8118, 0x8118, 0x17E7, + 0x811A, 0x811A, 0x0D90, 0x811B, 0x811B, 0x0E6F, 0x8123, 0x8123, 0x1618, + 0x8129, 0x8129, 0x15E5, 0x812B, 0x812B, 0x1CFB, 0x812F, 0x812F, 0x1D89, + 0x8139, 0x8139, 0x1BC6, 0x813E, 0x813E, 0x145B, 0x814B, 0x814B, 0x16E0, + 0x814E, 0x814E, 0x1674, 0x8150, 0x8151, 0x140D, 0x8154, 0x8154, 0x0DE0, + 0x8155, 0x8155, 0x17E8, 0x8165, 0x8165, 0x1571, 0x8166, 0x8166, 0x1053, + 0x816B, 0x816B, 0x1AC1, 0x8170, 0x8170, 0x1811, 0x8171, 0x8171, 0x0E18, + 0x8178, 0x8178, 0x199D, 0x8179, 0x8179, 0x13DA, 0x817A, 0x817A, 0x153E, + 0x817F, 0x817F, 0x1D25, 0x8180, 0x8180, 0x135F, 0x8188, 0x8188, 0x0E32, + 0x818A, 0x818A, 0x1323, 0x818F, 0x818F, 0x0EA9, 0x819A, 0x819A, 0x140F, + 0x819C, 0x819C, 0x123B, 0x819D, 0x819D, 0x162B, 0x81A0, 0x81A0, 0x0F2C, + 0x81A3, 0x81A3, 0x1B71, 0x81A8, 0x81A8, 0x1D5C, 0x81B3, 0x81B3, 0x153F, + 0x81B5, 0x81B5, 0x1C91, 0x81BA, 0x81BA, 0x18F8, 0x81BD, 0x81BD, 0x1084, + 0x81BE, 0x81BE, 0x1F07, 0x81BF, 0x81BF, 0x1050, 0x81C0, 0x81C0, 0x1107, + 0x81C2, 0x81C2, 0x145C, 0x81C6, 0x81C6, 0x171C, 0x81CD, 0x81CD, 0x1A73, + 0x81D8, 0x81D8, 0x113A, 0x81DF, 0x81DF, 0x199E, 0x81E3, 0x81E3, 0x1675, + 0x81E5, 0x81E5, 0x17D7, 0x81E7, 0x81E7, 0x199F, 0x81E8, 0x81E8, 0x122A, + 0x81EA, 0x81EA, 0x1966, 0x81ED, 0x81ED, 0x1C9D, 0x81F3, 0x81F3, 0x1B37, + 0x81F4, 0x81F4, 0x1CBA, 0x81FA, 0x81FA, 0x10A5, 0x81FB, 0x81FB, 0x1B5B, + 0x81FC, 0x81FC, 0x0F5A, 0x81FE, 0x81FE, 0x18C5, 0x8205, 0x8205, 0x0F5B, + 0x8207, 0x8207, 0x1735, 0x8208, 0x8208, 0x1F62, 0x820A, 0x820A, 0x0F5C, + 0x820C, 0x820C, 0x1550, 0x820D, 0x820D, 0x14A6, 0x8212, 0x8212, 0x1513, + 0x821B, 0x821B, 0x1BF6, 0x821C, 0x821C, 0x1619, 0x821E, 0x821E, 0x12DB, + 0x821F, 0x821F, 0x1AE8, 0x8221, 0x8221, 0x0DE1, 0x822A, 0x822A, 0x1E03, + 0x822B, 0x822B, 0x1360, 0x822C, 0x822C, 0x133D, 0x8235, 0x8235, 0x1CDE, + 0x8236, 0x8236, 0x1324, 0x8237, 0x8237, 0x1E45, 0x8239, 0x8239, 0x1540, + 0x8240, 0x8240, 0x1410, 0x8245, 0x8245, 0x1736, 0x8247, 0x8247, 0x1A58, + 0x8259, 0x8259, 0x1BC7, 0x8264, 0x8264, 0x1906, 0x8266, 0x8266, 0x1DEB, + 0x826E, 0x826E, 0x0DA8, 0x826F, 0x826F, 0x1154, 0x8271, 0x8271, 0x0DA9, + 0x8272, 0x8272, 0x14F8, 0x8276, 0x8276, 0x176A, 0x8278, 0x8278, 0x1C40, + 0x827E, 0x827E, 0x16D8, 0x828B, 0x828B, 0x184B, 0x828D, 0x828D, 0x1976, + 0x828E, 0x828E, 0x0F7F, 0x8292, 0x8292, 0x125F, 0x8299, 0x8299, 0x1411, + 0x829A, 0x829A, 0x1108, 0x829D, 0x829D, 0x1B38, 0x829F, 0x829F, 0x14CC, + 0x82A5, 0x82A5, 0x0DF7, 0x82A6, 0x82A6, 0x1E96, 0x82A9, 0x82A9, 0x0FCE, + 0x82AC, 0x82AC, 0x1430, 0x82AD, 0x82AD, 0x1D3F, 0x82AE, 0x82AE, 0x1797, + 0x82AF, 0x82AF, 0x1689, 0x82B1, 0x82B1, 0x1EBF, 0x82B3, 0x82B3, 0x1361, + 0x82B7, 0x82B7, 0x1B39, 0x82B8, 0x82B8, 0x1864, 0x82B9, 0x82B9, 0x0FC0, + 0x82BB, 0x82BB, 0x1C6A, 0x82BC, 0x82BC, 0x12AF, 0x82BD, 0x82BD, 0x1697, + 0x82BF, 0x82BF, 0x1952, 0x82D1, 0x82D1, 0x1882, 0x82D2, 0x82D2, 0x176B, + 0x82D4, 0x82D4, 0x1D11, 0x82D5, 0x82D5, 0x1C41, 0x82D7, 0x82D7, 0x12CA, + 0x82DB, 0x82DB, 0x0D7F, 0x82DE, 0x82DE, 0x1D8A, 0x82DF, 0x82DF, 0x0F5D, + 0x82E1, 0x82E1, 0x191E, 0x82E5, 0x82E5, 0x16F2, 0x82E6, 0x82E6, 0x0EAA, + 0x82E7, 0x82E7, 0x19D0, 0x82F1, 0x82F1, 0x1788, 0x82FD, 0x82FD, 0x0EAB, + 0x82FE, 0x82FE, 0x1DBC, 0x8301, 0x8301, 0x1B09, 0x8302, 0x8302, 0x12DC, + 0x8303, 0x8303, 0x1399, 0x8304, 0x8304, 0x0D80, 0x8305, 0x8305, 0x12B0, + 0x8309, 0x8309, 0x1255, 0x8317, 0x8317, 0x1295, 0x8328, 0x8328, 0x1967, + 0x832B, 0x832B, 0x1260, 0x832F, 0x832F, 0x13DB, 0x8331, 0x8331, 0x15E6, + 0x8334, 0x8334, 0x1F08, 0x8335, 0x8335, 0x1937, 0x8336, 0x8336, 0x105F, + 0x8338, 0x8338, 0x1830, 0x8339, 0x8339, 0x1737, 0x8340, 0x8340, 0x161A, + 0x8347, 0x8347, 0x1E1C, 0x8349, 0x8349, 0x1C42, 0x834A, 0x834A, 0x1E68, + 0x834F, 0x834F, 0x194B, 0x8351, 0x8351, 0x191F, 0x8352, 0x8352, 0x1EF3, + 0x8373, 0x8373, 0x1102, 0x8377, 0x8377, 0x1DC8, 0x837B, 0x837B, 0x19E9, + 0x8389, 0x8389, 0x1217, 0x838A, 0x838A, 0x19A0, 0x838E, 0x838E, 0x14A7, + 0x8396, 0x8396, 0x0E70, 0x8398, 0x8398, 0x1676, 0x839E, 0x839E, 0x17E9, + 0x83A2, 0x83A2, 0x1E58, 0x83A9, 0x83A9, 0x1412, 0x83AA, 0x83AA, 0x1698, + 0x83AB, 0x83AB, 0x123C, 0x83BD, 0x83BD, 0x1261, 0x83C1, 0x83C1, 0x1C21, + 0x83C5, 0x83C5, 0x0EF6, 0x83C9, 0x83C9, 0x11B3, 0x83CA, 0x83CA, 0x0F6D, + 0x83CC, 0x83CC, 0x0FAD, 0x83D3, 0x83D3, 0x0EE0, 0x83D6, 0x83D6, 0x1BC8, + 0x83DC, 0x83DC, 0x1BD2, 0x83E9, 0x83E9, 0x13CD, 0x83EB, 0x83EB, 0x0FC1, + 0x83EF, 0x83EF, 0x1EC0, 0x83F0, 0x83F0, 0x0EAC, 0x83F1, 0x83F1, 0x1203, + 0x83F2, 0x83F2, 0x145D, 0x83F4, 0x83F4, 0x16C3, 0x83F9, 0x83F9, 0x19D1, + 0x83FD, 0x83FD, 0x1607, 0x8403, 0x8403, 0x1C92, 0x8404, 0x8404, 0x10C9, + 0x840A, 0x840A, 0x1147, 0x840C, 0x840C, 0x127C, 0x840D, 0x840D, 0x1D6C, + 0x840E, 0x840E, 0x189B, 0x8429, 0x8429, 0x1C6B, 0x842C, 0x842C, 0x124B, + 0x8431, 0x8431, 0x1F39, 0x8438, 0x8438, 0x18C6, 0x843D, 0x843D, 0x1122, + 0x8449, 0x8449, 0x1771, 0x8457, 0x8457, 0x19D2, 0x845B, 0x845B, 0x0DB2, + 0x8461, 0x8461, 0x1D8B, 0x8463, 0x8463, 0x10FA, 0x8466, 0x8466, 0x189C, + 0x846B, 0x846B, 0x1E97, 0x846C, 0x846C, 0x19A1, 0x846F, 0x846F, 0x16F3, + 0x8475, 0x8475, 0x0FA4, 0x847A, 0x847A, 0x1B12, 0x8490, 0x8490, 0x15E7, + 0x8494, 0x8494, 0x1650, 0x8499, 0x8499, 0x12BF, 0x849C, 0x849C, 0x14C0, + 0x84A1, 0x84A1, 0x1362, 0x84B2, 0x84B2, 0x1D8C, 0x84B8, 0x84B8, 0x1B1B, + 0x84BB, 0x84BB, 0x16F4, 0x84BC, 0x84BC, 0x1BC9, 0x84BF, 0x84BF, 0x1E98, + 0x84C0, 0x84C0, 0x15AD, 0x84C2, 0x84C2, 0x1296, 0x84C4, 0x84C4, 0x1C7F, + 0x84C6, 0x84C6, 0x1527, 0x84C9, 0x84C9, 0x1831, 0x84CB, 0x84CB, 0x0DF8, + 0x84CD, 0x84CD, 0x1651, 0x84D1, 0x84D1, 0x14A8, 0x84DA, 0x84DA, 0x15E8, + 0x84EC, 0x84EC, 0x13F0, 0x84EE, 0x84EE, 0x1179, 0x84F4, 0x84F4, 0x161B, + 0x84FC, 0x84FC, 0x11D0, 0x8511, 0x8511, 0x128B, 0x8513, 0x8513, 0x124C, + 0x8514, 0x8514, 0x13DC, 0x8517, 0x8517, 0x1968, 0x8518, 0x8518, 0x14CD, + 0x851A, 0x851A, 0x186A, 0x851E, 0x851E, 0x11DD, 0x8521, 0x8521, 0x1BD3, + 0x8523, 0x8523, 0x19A2, 0x8525, 0x8525, 0x1C5B, 0x852C, 0x852C, 0x1597, + 0x852D, 0x852D, 0x18EF, 0x852F, 0x852F, 0x1B5C, 0x853D, 0x853D, 0x1D75, + 0x853F, 0x853F, 0x189D, 0x8541, 0x8541, 0x1085, 0x8543, 0x8543, 0x138A, + 0x8549, 0x8549, 0x1C43, 0x854E, 0x854E, 0x0F2D, 0x8553, 0x8553, 0x1865, + 0x8559, 0x8559, 0x1E74, 0x8563, 0x8563, 0x161C, 0x8568, 0x8568, 0x0F8D, + 0x8569, 0x8569, 0x1D06, 0x856A, 0x856A, 0x12DD, 0x856D, 0x856D, 0x1598, + 0x8584, 0x8584, 0x1325, 0x8587, 0x8587, 0x1301, 0x858F, 0x858F, 0x1907, + 0x8591, 0x8591, 0x0DE2, 0x8594, 0x8594, 0x19A3, 0x859B, 0x859B, 0x1551, + 0x85A6, 0x85A6, 0x1BF7, 0x85A8, 0x85A8, 0x1F35, 0x85A9, 0x85A9, 0x14C7, + 0x85AA, 0x85AA, 0x1677, 0x85AF, 0x85AF, 0x1514, 0x85B0, 0x85B0, 0x1F32, + 0x85BA, 0x85BA, 0x1A74, 0x85C1, 0x85C1, 0x0EAD, 0x85C9, 0x85C9, 0x1969, + 0x85CD, 0x85CD, 0x1136, 0x85CE, 0x85CE, 0x1678, 0x85CF, 0x85CF, 0x19A4, + 0x85D5, 0x85D5, 0x184C, 0x85DC, 0x85DC, 0x1163, 0x85DD, 0x85DD, 0x1798, + 0x85E4, 0x85E4, 0x1112, 0x85E5, 0x85E5, 0x16F5, 0x85E9, 0x85E9, 0x138B, + 0x85EA, 0x85EA, 0x15E9, 0x85F7, 0x85F7, 0x19D3, 0x85FA, 0x85FA, 0x1222, + 0x85FB, 0x85FB, 0x1AA0, 0x85FF, 0x85FF, 0x0EE9, 0x8602, 0x8602, 0x1799, + 0x8606, 0x8606, 0x11A8, 0x8607, 0x8607, 0x1599, 0x860A, 0x860A, 0x17C8, + 0x8616, 0x8616, 0x1724, 0x8617, 0x8617, 0x13A4, 0x861A, 0x861A, 0x1541, + 0x862D, 0x862D, 0x112B, 0x863F, 0x863F, 0x111A, 0x864E, 0x864E, 0x1E99, + 0x8650, 0x8650, 0x1DD0, 0x8654, 0x8654, 0x0E19, 0x8655, 0x8655, 0x1BDD, + 0x865B, 0x865B, 0x1E29, 0x865C, 0x865C, 0x11A9, 0x865E, 0x865E, 0x184D, + 0x865F, 0x865F, 0x1E9A, 0x8667, 0x8667, 0x1F49, 0x8679, 0x8679, 0x1EB4, + 0x868A, 0x868A, 0x12ED, 0x868C, 0x868C, 0x1363, 0x8693, 0x8693, 0x1938, + 0x86A3, 0x86A3, 0x0ED7, 0x86A4, 0x86A4, 0x1AA1, 0x86A9, 0x86A9, 0x1CBB, + 0x86C7, 0x86C7, 0x14A9, 0x86CB, 0x86CB, 0x1070, 0x86D4, 0x86D4, 0x1F09, + 0x86D9, 0x86D9, 0x17D8, 0x86DB, 0x86DB, 0x1AE9, 0x86DF, 0x86DF, 0x0F2E, + 0x86E4, 0x86E4, 0x1DF2, 0x86ED, 0x86ED, 0x1B72, 0x86FE, 0x86FE, 0x1699, + 0x8700, 0x8700, 0x1C4D, 0x8702, 0x8702, 0x13F1, 0x8703, 0x8703, 0x1679, + 0x8708, 0x8708, 0x17BA, 0x8718, 0x8718, 0x1B3A, 0x871A, 0x871A, 0x145E, + 0x871C, 0x871C, 0x1314, 0x874E, 0x874E, 0x0DB4, 0x8755, 0x8755, 0x1662, + 0x8757, 0x8757, 0x1EF4, 0x875F, 0x875F, 0x189E, 0x8766, 0x8766, 0x1DC9, + 0x8768, 0x8768, 0x162C, 0x8774, 0x8774, 0x1E9B, 0x8776, 0x8776, 0x1A2F, + 0x8778, 0x8778, 0x17D9, 0x8782, 0x8782, 0x1142, 0x878D, 0x878D, 0x18E4, + 0x879F, 0x879F, 0x1297, 0x87A2, 0x87A2, 0x1E69, 0x87B3, 0x87B3, 0x1098, + 0x87BA, 0x87BA, 0x111B, 0x87C4, 0x87C4, 0x1CD0, 0x87E0, 0x87E0, 0x133E, + 0x87EC, 0x87EC, 0x1542, 0x87EF, 0x87EF, 0x1812, 0x87F2, 0x87F2, 0x1C8D, + 0x87F9, 0x87F9, 0x1E10, 0x87FB, 0x87FB, 0x1908, 0x87FE, 0x87FE, 0x155B, + 0x8805, 0x8805, 0x163A, 0x881F, 0x881F, 0x113B, 0x8822, 0x8822, 0x1B04, + 0x8823, 0x8823, 0x1164, 0x8831, 0x8831, 0x0EAE, 0x8836, 0x8836, 0x1984, + 0x883B, 0x883B, 0x124D, 0x8840, 0x8840, 0x1E4C, 0x8846, 0x8846, 0x1B0C, + 0x884C, 0x884C, 0x1E1D, 0x884D, 0x884D, 0x175D, 0x8852, 0x8852, 0x1E46, + 0x8853, 0x8853, 0x1624, 0x8857, 0x8857, 0x0D81, 0x8859, 0x8859, 0x169A, + 0x885B, 0x885B, 0x189F, 0x885D, 0x885D, 0x1C8E, 0x8861, 0x8861, 0x1E6A, + 0x8862, 0x8862, 0x0F5E, 0x8863, 0x8863, 0x1909, 0x8868, 0x8868, 0x1DA1, + 0x886B, 0x886B, 0x14CE, 0x8870, 0x8870, 0x15BD, 0x8872, 0x8872, 0x1037, + 0x8877, 0x8877, 0x1C8F, 0x887E, 0x887F, 0x0FCF, 0x8881, 0x8881, 0x1883, + 0x8882, 0x8882, 0x129B, 0x8888, 0x8888, 0x0D82, 0x888B, 0x888B, 0x10A6, + 0x888D, 0x888D, 0x1D8D, 0x8892, 0x8892, 0x1071, 0x8896, 0x8896, 0x15EA, + 0x8897, 0x8897, 0x1B5D, 0x889E, 0x889E, 0x0EC6, 0x88AB, 0x88AB, 0x1DB1, + 0x88B4, 0x88B4, 0x0EAF, 0x88C1, 0x88C1, 0x19B6, 0x88C2, 0x88C2, 0x1182, + 0x88CF, 0x88CF, 0x1218, 0x88D4, 0x88D4, 0x179A, 0x88D5, 0x88D5, 0x18C7, + 0x88D9, 0x88D9, 0x0F74, 0x88DC, 0x88DC, 0x13CE, 0x88DD, 0x88DD, 0x19A5, + 0x88DF, 0x88DF, 0x14AA, 0x88E1, 0x88E1, 0x1219, 0x88E8, 0x88E8, 0x145F, + 0x88F3, 0x88F3, 0x14EC, 0x88F4, 0x88F5, 0x1375, 0x88F8, 0x88F8, 0x111C, + 0x88FD, 0x88FD, 0x1A75, 0x8907, 0x8907, 0x13DD, 0x8910, 0x8910, 0x0DB3, + 0x8912, 0x8912, 0x1D8E, 0x8913, 0x8913, 0x13CF, 0x8918, 0x8918, 0x18A0, + 0x8919, 0x8919, 0x1377, 0x8925, 0x8925, 0x181C, 0x892A, 0x892A, 0x1D26, + 0x8936, 0x8936, 0x1630, 0x8938, 0x8938, 0x11DE, 0x893B, 0x893B, 0x1552, + 0x8941, 0x8941, 0x0DE3, 0x8944, 0x8944, 0x1709, 0x895F, 0x895F, 0x0FD1, + 0x8964, 0x8964, 0x1137, 0x896A, 0x896A, 0x1256, 0x8972, 0x8972, 0x1631, + 0x897F, 0x897F, 0x1515, 0x8981, 0x8981, 0x1813, 0x8983, 0x8983, 0x1086, + 0x8986, 0x8986, 0x13DE, 0x8987, 0x8987, 0x1D57, 0x898B, 0x898B, 0x0E3C, + 0x898F, 0x898F, 0x0FA5, 0x8993, 0x8993, 0x127E, 0x8996, 0x8996, 0x1652, + 0x89A1, 0x89A1, 0x0E33, 0x89A9, 0x89A9, 0x10CA, 0x89AA, 0x89AA, 0x1CC3, + 0x89B2, 0x89B2, 0x0FC2, 0x89BA, 0x89BA, 0x0D91, 0x89BD, 0x89BD, 0x1138, + 0x89C0, 0x89C0, 0x0EF7, 0x89D2, 0x89D2, 0x0D92, 0x89E3, 0x89E3, 0x1E11, + 0x89F4, 0x89F4, 0x14ED, 0x89F8, 0x89F8, 0x1C4E, 0x8A00, 0x8A00, 0x1721, + 0x8A02, 0x8A02, 0x1A59, 0x8A03, 0x8A03, 0x1413, 0x8A08, 0x8A08, 0x0E8C, + 0x8A0A, 0x8A0A, 0x167A, 0x8A0C, 0x8A0C, 0x1EB5, 0x8A0E, 0x8A0E, 0x1D1C, + 0x8A13, 0x8A13, 0x1F33, 0x8A16, 0x8A16, 0x1F5A, 0x8A17, 0x8A17, 0x1CEE, + 0x8A18, 0x8A18, 0x1012, 0x8A1B, 0x8A1B, 0x17DA, 0x8A1D, 0x8A1D, 0x169B, + 0x8A1F, 0x8A1F, 0x15B5, 0x8A23, 0x8A23, 0x0E45, 0x8A25, 0x8A25, 0x1056, + 0x8A2A, 0x8A2A, 0x1364, 0x8A2D, 0x8A2D, 0x1553, 0x8A31, 0x8A31, 0x1E2A, + 0x8A34, 0x8A34, 0x159A, 0x8A36, 0x8A36, 0x0D83, 0x8A3A, 0x8A3A, 0x1B5E, + 0x8A3B, 0x8A3B, 0x1AEA, 0x8A50, 0x8A50, 0x14AB, 0x8A54, 0x8A54, 0x1AA2, + 0x8A55, 0x8A55, 0x1D6D, 0x8A5B, 0x8A5B, 0x19D4, 0x8A5E, 0x8A5E, 0x14AC, + 0x8A60, 0x8A60, 0x1789, 0x8A62, 0x8A62, 0x161D, 0x8A63, 0x8A63, 0x179B, + 0x8A66, 0x8A66, 0x1653, 0x8A69, 0x8A69, 0x1654, 0x8A6D, 0x8A6D, 0x0F93, + 0x8A6E, 0x8A6E, 0x1A11, 0x8A70, 0x8A70, 0x1F77, 0x8A71, 0x8A71, 0x1EC1, + 0x8A72, 0x8A72, 0x1E12, 0x8A73, 0x8A73, 0x14EE, 0x8A75, 0x8A75, 0x1543, + 0x8A79, 0x8A79, 0x1C11, 0x8A85, 0x8A85, 0x1AEB, 0x8A87, 0x8A87, 0x0EE1, + 0x8A8C, 0x8A8C, 0x1B3B, 0x8A8D, 0x8A8D, 0x1939, 0x8A93, 0x8A93, 0x1516, + 0x8A95, 0x8A95, 0x1CF9, 0x8A98, 0x8A98, 0x18C8, 0x8A9E, 0x8A9E, 0x1714, + 0x8AA0, 0x8AA0, 0x1572, 0x8AA1, 0x8AA1, 0x0E8D, 0x8AA3, 0x8AA3, 0x12DE, + 0x8AA4, 0x8AA4, 0x17BB, 0x8AA5, 0x8AA5, 0x0EB0, 0x8AA6, 0x8AA6, 0x15B6, + 0x8AA8, 0x8AA8, 0x1F0A, 0x8AAA, 0x8AAA, 0x1554, 0x8AB0, 0x8AB0, 0x15EB, + 0x8AB2, 0x8AB2, 0x0EE2, 0x8AB9, 0x8AB9, 0x1460, 0x8ABC, 0x8ABC, 0x190A, + 0x8ABE, 0x8ABE, 0x18E9, 0x8ABF, 0x8ABF, 0x1AA3, 0x8AC2, 0x8AC2, 0x1C12, + 0x8AC4, 0x8AC4, 0x161E, 0x8AC7, 0x8AC7, 0x1087, 0x8ACB, 0x8ACB, 0x1C22, + 0x8ACD, 0x8ACD, 0x19BD, 0x8ACF, 0x8ACF, 0x1C6C, 0x8AD2, 0x8AD2, 0x1155, + 0x8AD6, 0x8AD6, 0x11B7, 0x8ADB, 0x8ADB, 0x18C9, 0x8ADC, 0x8ADC, 0x1C1A, + 0x8AE1, 0x8AE1, 0x1655, 0x8AE6, 0x8AE6, 0x1C2A, 0x8AE7, 0x8AE7, 0x1E13, + 0x8AEA, 0x8AEA, 0x1A5A, 0x8AEB, 0x8AEB, 0x0DAA, 0x8AED, 0x8AED, 0x18CA, + 0x8AEE, 0x8AEE, 0x196A, 0x8AF1, 0x8AF1, 0x1F42, 0x8AF6, 0x8AF6, 0x168A, + 0x8AF7, 0x8AF7, 0x1DA9, 0x8AF8, 0x8AF8, 0x1A76, 0x8AFA, 0x8AFA, 0x1722, + 0x8AFE, 0x8AFE, 0x102B, 0x8B00, 0x8B00, 0x12B1, 0x8B01, 0x8B01, 0x16BA, + 0x8B02, 0x8B02, 0x18A1, 0x8B04, 0x8B04, 0x1113, 0x8B0E, 0x8B0E, 0x1302, + 0x8B10, 0x8B10, 0x1315, 0x8B14, 0x8B14, 0x1DD1, 0x8B16, 0x8B16, 0x15A7, + 0x8B17, 0x8B17, 0x1365, 0x8B19, 0x8B19, 0x0E49, 0x8B1A, 0x8B1A, 0x192A, + 0x8B1B, 0x8B1B, 0x0DE4, 0x8B1D, 0x8B1D, 0x14AD, 0x8B20, 0x8B20, 0x1814, + 0x8B28, 0x8B28, 0x12B2, 0x8B2B, 0x8B2B, 0x19EA, 0x8B2C, 0x8B2C, 0x11ED, + 0x8B33, 0x8B33, 0x0F5F, 0x8B39, 0x8B39, 0x0FC3, 0x8B41, 0x8B41, 0x1EC2, + 0x8B49, 0x8B49, 0x1B1C, 0x8B4E, 0x8B4E, 0x1F4B, 0x8B4F, 0x8B4F, 0x1013, + 0x8B58, 0x8B58, 0x1663, 0x8B5A, 0x8B5A, 0x1088, 0x8B5C, 0x8B5C, 0x13D0, + 0x8B66, 0x8B66, 0x0E71, 0x8B6C, 0x8B6C, 0x1461, 0x8B6F, 0x8B6F, 0x1741, + 0x8B70, 0x8B70, 0x190B, 0x8B74, 0x8B74, 0x0E3D, 0x8B77, 0x8B77, 0x1E9C, + 0x8B7D, 0x8B7D, 0x179C, 0x8B80, 0x8B80, 0x10DE, 0x8B8A, 0x8B8A, 0x13A9, + 0x8B90, 0x8B90, 0x15EC, 0x8B92, 0x8B92, 0x1BB2, 0x8B93, 0x8B93, 0x170A, + 0x8B96, 0x8B96, 0x1BB3, 0x8B9A, 0x8B9A, 0x1BA0, 0x8C37, 0x8C37, 0x0EBC, + 0x8C3F, 0x8C3F, 0x0E8E, 0x8C41, 0x8C41, 0x1EDE, 0x8C46, 0x8C46, 0x1103, + 0x8C48, 0x8C48, 0x1014, 0x8C4A, 0x8C4A, 0x1DAA, 0x8C4C, 0x8C4C, 0x17EA, + 0x8C55, 0x8C55, 0x1656, 0x8C5A, 0x8C5A, 0x10E7, 0x8C61, 0x8C61, 0x14EF, + 0x8C6A, 0x8C6A, 0x1E9D, 0x8C6B, 0x8C6B, 0x179D, 0x8C79, 0x8C79, 0x1DA2, + 0x8C7A, 0x8C7A, 0x1657, 0x8C82, 0x8C82, 0x1C44, 0x8C8A, 0x8C8A, 0x1273, + 0x8C8C, 0x8C8C, 0x12B3, 0x8C9D, 0x8C9D, 0x1D58, 0x8C9E, 0x8C9E, 0x1A5B, + 0x8CA0, 0x8CA0, 0x1414, 0x8CA1, 0x8CA1, 0x19B7, 0x8CA2, 0x8CA2, 0x0ED8, + 0x8CA7, 0x8CA7, 0x1472, 0x8CA8, 0x8CA8, 0x1EC3, 0x8CA9, 0x8CA9, 0x1D47, + 0x8CAA, 0x8CAA, 0x1CFF, 0x8CAB, 0x8CAB, 0x0EF8, 0x8CAC, 0x8CAC, 0x1BD9, + 0x8CAF, 0x8CAF, 0x19D5, 0x8CB0, 0x8CB0, 0x157B, 0x8CB3, 0x8CB3, 0x1921, + 0x8CB4, 0x8CB4, 0x0F98, 0x8CB6, 0x8CB6, 0x1D68, 0x8CB7, 0x8CB7, 0x126E, + 0x8CB8, 0x8CB8, 0x10A7, 0x8CBB, 0x8CBB, 0x1462, 0x8CBC, 0x8CBC, 0x1C1B, + 0x8CBD, 0x8CBD, 0x1920, 0x8CBF, 0x8CBF, 0x12DF, 0x8CC0, 0x8CC0, 0x1DCA, + 0x8CC1, 0x8CC1, 0x1431, 0x8CC2, 0x8CC2, 0x11C3, 0x8CC3, 0x8CC3, 0x194C, + 0x8CC4, 0x8CC4, 0x1F0B, 0x8CC7, 0x8CC7, 0x196B, 0x8CC8, 0x8CC8, 0x0D84, + 0x8CCA, 0x8CCA, 0x19EB, 0x8CD1, 0x8CD1, 0x1B5F, 0x8CD3, 0x8CD3, 0x1473, + 0x8CDA, 0x8CDA, 0x11C4, 0x8CDC, 0x8CDC, 0x14AE, 0x8CDE, 0x8CDE, 0x14F0, + 0x8CE0, 0x8CE0, 0x1378, 0x8CE2, 0x8CE2, 0x1E47, 0x8CE3, 0x8CE3, 0x126F, + 0x8CE4, 0x8CE4, 0x1BF8, 0x8CE6, 0x8CE6, 0x1415, 0x8CEA, 0x8CEA, 0x1B73, + 0x8CED, 0x8CED, 0x10CB, 0x8CF4, 0x8CF4, 0x11C5, 0x8CFB, 0x8CFB, 0x1416, + 0x8CFC, 0x8CFC, 0x0F60, 0x8CFD, 0x8CFD, 0x14F4, 0x8D04, 0x8D04, 0x1B3C, + 0x8D05, 0x8D05, 0x1C93, 0x8D07, 0x8D07, 0x18DD, 0x8D08, 0x8D08, 0x1B1D, + 0x8D0A, 0x8D0A, 0x1BA1, 0x8D0D, 0x8D0D, 0x155C, 0x8D13, 0x8D13, 0x19A6, + 0x8D16, 0x8D16, 0x15A8, 0x8D64, 0x8D64, 0x19EC, 0x8D66, 0x8D66, 0x14AF, + 0x8D6B, 0x8D6B, 0x1E34, 0x8D70, 0x8D70, 0x1AEC, 0x8D73, 0x8D73, 0x0FA6, + 0x8D74, 0x8D74, 0x1417, 0x8D77, 0x8D77, 0x1015, 0x8D85, 0x8D85, 0x1C45, + 0x8D8A, 0x8D8A, 0x188A, 0x8D99, 0x8D99, 0x1AA4, 0x8DA3, 0x8DA3, 0x1C9E, + 0x8DA8, 0x8DA8, 0x1C6D, 0x8DB3, 0x8DB3, 0x1AAE, 0x8DBA, 0x8DBA, 0x1418, + 0x8DBE, 0x8DBE, 0x1B3D, 0x8DC6, 0x8DC6, 0x1D12, 0x8DCB, 0x8DCB, 0x1348, + 0x8DCC, 0x8DCC, 0x1B74, 0x8DCF, 0x8DCF, 0x0D85, 0x8DDB, 0x8DDB, 0x1D40, + 0x8DDD, 0x8DDD, 0x0E0C, 0x8DE1, 0x8DE1, 0x19ED, 0x8DE3, 0x8DE3, 0x1544, + 0x8DE8, 0x8DE8, 0x0EE3, 0x8DEF, 0x8DEF, 0x11AA, 0x8DF3, 0x8DF3, 0x10CC, + 0x8E0A, 0x8E0A, 0x1832, 0x8E0F, 0x8E0F, 0x108D, 0x8E10, 0x8E10, 0x1BF9, + 0x8E1E, 0x8E1E, 0x0E0D, 0x8E2A, 0x8E2A, 0x1AC2, 0x8E30, 0x8E30, 0x18CB, + 0x8E35, 0x8E35, 0x1AC3, 0x8E42, 0x8E42, 0x18CC, 0x8E44, 0x8E44, 0x1A77, + 0x8E47, 0x8E47, 0x0E1A, 0x8E48, 0x8E48, 0x10CD, 0x8E49, 0x8E49, 0x1B8C, + 0x8E4A, 0x8E4A, 0x1E75, 0x8E59, 0x8E59, 0x1C80, 0x8E5F, 0x8E5F, 0x19EE, + 0x8E60, 0x8E60, 0x1BE9, 0x8E74, 0x8E74, 0x1C81, 0x8E76, 0x8E76, 0x0F8E, + 0x8E81, 0x8E81, 0x1AA5, 0x8E87, 0x8E87, 0x19D6, 0x8E8A, 0x8E8A, 0x1AED, + 0x8E8D, 0x8E8D, 0x16F6, 0x8EAA, 0x8EAA, 0x1223, 0x8EAB, 0x8EAB, 0x167B, + 0x8EAC, 0x8EAC, 0x0F80, 0x8EC0, 0x8EC0, 0x0F61, 0x8ECA, 0x8ECA, 0x1B8D, + 0x8ECB, 0x8ECB, 0x16BB, 0x8ECC, 0x8ECC, 0x0F94, 0x8ECD, 0x8ECD, 0x0F75, + 0x8ED2, 0x8ED2, 0x1E2E, 0x8EDF, 0x8EDF, 0x175E, 0x8EEB, 0x8EEB, 0x1B60, + 0x8EF8, 0x8EF8, 0x1C82, 0x8EFB, 0x8EFB, 0x0D86, 0x8EFE, 0x8EFE, 0x1664, + 0x8F03, 0x8F03, 0x0F2F, 0x8F05, 0x8F05, 0x11AB, 0x8F09, 0x8F09, 0x19B8, + 0x8F12, 0x8F12, 0x1C1C, 0x8F13, 0x8F13, 0x124E, 0x8F14, 0x8F14, 0x13D1, + 0x8F15, 0x8F15, 0x0E72, 0x8F1B, 0x8F1B, 0x1156, 0x8F1C, 0x8F1C, 0x1CBC, + 0x8F1D, 0x8F1D, 0x1F43, 0x8F1E, 0x8F1E, 0x1262, 0x8F1F, 0x8F1F, 0x1C06, + 0x8F26, 0x8F26, 0x117A, 0x8F27, 0x8F27, 0x13BF, 0x8F29, 0x8F29, 0x1379, + 0x8F2A, 0x8F2A, 0x11F7, 0x8F2F, 0x8F2F, 0x1B7B, 0x8F33, 0x8F33, 0x1AEE, + 0x8F38, 0x8F38, 0x15ED, 0x8F39, 0x8F39, 0x13DF, 0x8F3B, 0x8F3B, 0x13E0, + 0x8F3E, 0x8F3E, 0x1A12, 0x8F3F, 0x8F3F, 0x1738, 0x8F44, 0x8F44, 0x1DE2, + 0x8F45, 0x8F45, 0x1884, 0x8F49, 0x8F49, 0x1A13, 0x8F4D, 0x8F4D, 0x1C07, + 0x8F4E, 0x8F4E, 0x0F30, 0x8F5D, 0x8F5D, 0x1739, 0x8F5F, 0x8F5F, 0x0F1B, + 0x8F62, 0x8F62, 0x116F, 0x8F9B, 0x8F9B, 0x167C, 0x8F9C, 0x8F9C, 0x0EB1, + 0x8FA3, 0x8FA3, 0x112E, 0x8FA6, 0x8FA6, 0x1D48, 0x8FA8, 0x8FA8, 0x13AA, + 0x8FAD, 0x8FAD, 0x14B0, 0x8FAF, 0x8FAF, 0x13AB, 0x8FB0, 0x8FB0, 0x1B61, + 0x8FB1, 0x8FB1, 0x181D, 0x8FB2, 0x8FB2, 0x1051, 0x8FC2, 0x8FC2, 0x184E, + 0x8FC5, 0x8FC5, 0x167D, 0x8FCE, 0x8FCE, 0x178A, 0x8FD1, 0x8FD1, 0x0FC4, + 0x8FD4, 0x8FD4, 0x133F, 0x8FE6, 0x8FE6, 0x0D87, 0x8FEA, 0x8FEA, 0x19EF, + 0x8FEB, 0x8FEB, 0x1326, 0x8FED, 0x8FED, 0x1B75, 0x8FF0, 0x8FF0, 0x1625, + 0x8FF2, 0x8FF2, 0x0E2A, 0x8FF7, 0x8FF7, 0x1303, 0x8FF9, 0x8FF9, 0x19F0, + 0x8FFD, 0x8FFD, 0x1C6E, 0x9000, 0x9000, 0x1D27, 0x9001, 0x9001, 0x15B7, + 0x9002, 0x9002, 0x0EFE, 0x9003, 0x9003, 0x10CE, 0x9005, 0x9005, 0x1F2A, + 0x9006, 0x9006, 0x1742, 0x9008, 0x9008, 0x1E6B, 0x900B, 0x900B, 0x1D8F, + 0x900D, 0x900D, 0x159B, 0x900F, 0x900F, 0x1D2D, 0x9010, 0x9010, 0x1C83, + 0x9011, 0x9011, 0x0F62, 0x9014, 0x9014, 0x10CF, 0x9015, 0x9015, 0x0E73, + 0x9017, 0x9017, 0x1104, 0x9019, 0x9019, 0x19D7, 0x901A, 0x901A, 0x1D22, + 0x901D, 0x901D, 0x1517, 0x901E, 0x901E, 0x1194, 0x901F, 0x901F, 0x15A9, + 0x9020, 0x9020, 0x1AA6, 0x9021, 0x9021, 0x1B05, 0x9022, 0x9022, 0x13F2, + 0x9023, 0x9023, 0x117B, 0x902E, 0x902E, 0x1C2B, 0x9031, 0x9031, 0x1AEF, + 0x9032, 0x9032, 0x1B62, 0x9035, 0x9035, 0x0FA7, 0x9038, 0x9038, 0x1942, + 0x903C, 0x903C, 0x1DBF, 0x903E, 0x903E, 0x18CE, 0x9041, 0x9041, 0x1109, + 0x9042, 0x9042, 0x15EE, 0x9047, 0x9047, 0x184F, 0x904A, 0x904A, 0x18CD, + 0x904B, 0x904B, 0x1866, 0x904D, 0x904D, 0x1D65, 0x904E, 0x904E, 0x0EE4, + 0x9050, 0x9050, 0x1DCB, 0x9051, 0x9051, 0x1EF5, 0x9053, 0x9053, 0x10D0, + 0x9054, 0x9054, 0x1078, 0x9055, 0x9055, 0x18A2, 0x9059, 0x9059, 0x1815, + 0x905C, 0x905C, 0x15AE, 0x905D, 0x905D, 0x108E, 0x905E, 0x905E, 0x1C2C, + 0x9060, 0x9060, 0x1885, 0x9061, 0x9061, 0x159C, 0x9063, 0x9063, 0x0E3E, + 0x9069, 0x9069, 0x19F1, 0x906D, 0x906D, 0x1AA7, 0x906E, 0x906E, 0x1B8E, + 0x906F, 0x906F, 0x110A, 0x9072, 0x9072, 0x1B3E, 0x9075, 0x9075, 0x1B06, + 0x9077, 0x9077, 0x1BFA, 0x9078, 0x9078, 0x1545, 0x907A, 0x907A, 0x18CF, + 0x907C, 0x907C, 0x11D1, 0x907D, 0x907D, 0x0E0E, 0x907F, 0x907F, 0x1DB2, + 0x9080, 0x9080, 0x1816, 0x9081, 0x9081, 0x1270, 0x9082, 0x9082, 0x1E14, + 0x9083, 0x9083, 0x15EF, 0x9084, 0x9084, 0x1ED8, 0x9087, 0x9087, 0x1922, + 0x9088, 0x9088, 0x123D, 0x908A, 0x908A, 0x13AC, 0x908F, 0x908F, 0x111D, + 0x9091, 0x9091, 0x18F5, 0x9095, 0x9095, 0x17D0, 0x9099, 0x9099, 0x1263, + 0x90A2, 0x90A2, 0x1E6C, 0x90A3, 0x90A3, 0x102A, 0x90A6, 0x90A6, 0x1366, + 0x90A8, 0x90A8, 0x1C52, 0x90AA, 0x90AA, 0x14B1, 0x90AF, 0x90AF, 0x0DC6, + 0x90B0, 0x90B0, 0x1D13, 0x90B1, 0x90B1, 0x0F63, 0x90B5, 0x90B5, 0x159D, + 0x90B8, 0x90B8, 0x19D8, 0x90C1, 0x90C1, 0x185C, 0x90CA, 0x90CA, 0x0F31, + 0x90DE, 0x90DE, 0x1143, 0x90E1, 0x90E1, 0x0F76, 0x90E8, 0x90E8, 0x1419, + 0x90ED, 0x90ED, 0x0EEA, 0x90F5, 0x90F5, 0x1850, 0x90FD, 0x90FD, 0x10D1, + 0x9102, 0x9102, 0x16AA, 0x9112, 0x9112, 0x1C6F, 0x9115, 0x9115, 0x1E22, + 0x9119, 0x9119, 0x1463, 0x9127, 0x9127, 0x1114, 0x912D, 0x912D, 0x1A5C, + 0x9132, 0x9132, 0x1072, 0x9149, 0x9149, 0x18D0, 0x914A, 0x914A, 0x1A5D, + 0x914B, 0x914B, 0x1C70, 0x914C, 0x914C, 0x1977, 0x914D, 0x914D, 0x137A, + 0x914E, 0x914E, 0x1AF0, 0x9152, 0x9152, 0x1AF1, 0x9162, 0x9162, 0x1C46, + 0x9169, 0x9169, 0x1298, 0x916A, 0x916A, 0x1123, 0x916C, 0x916C, 0x15F0, + 0x9175, 0x9175, 0x1F1C, 0x9177, 0x9177, 0x1EA3, 0x9178, 0x9178, 0x14C1, + 0x9187, 0x9187, 0x161F, 0x9189, 0x9189, 0x1C9F, 0x918B, 0x918B, 0x1C47, + 0x918D, 0x918D, 0x1A78, 0x9192, 0x9192, 0x1573, 0x919C, 0x919C, 0x1C71, + 0x91AB, 0x91AB, 0x190C, 0x91AC, 0x91AC, 0x19A7, 0x91AE, 0x91AE, 0x1C48, + 0x91AF, 0x91AF, 0x1E76, 0x91B1, 0x91B1, 0x1349, 0x91B4, 0x91B4, 0x119D, + 0x91B5, 0x91B5, 0x0E00, 0x91C0, 0x91C0, 0x170B, 0x91C7, 0x91C7, 0x1BD4, + 0x91C9, 0x91C9, 0x18D1, 0x91CB, 0x91CB, 0x1528, 0x91CC, 0x91CC, 0x121A, + 0x91CD, 0x91CD, 0x1B0D, 0x91CE, 0x91CE, 0x16EF, 0x91CF, 0x91CF, 0x1157, + 0x91D0, 0x91D0, 0x121B, 0x91D1, 0x91D1, 0x1023, 0x91D7, 0x91D7, 0x15BE, + 0x91D8, 0x91D8, 0x1A5E, 0x91DC, 0x91DC, 0x141A, 0x91DD, 0x91DD, 0x1CCE, + 0x91E3, 0x91E3, 0x1AA8, 0x91E7, 0x91E7, 0x1BFB, 0x91EA, 0x91EA, 0x1851, + 0x91F5, 0x91F5, 0x1BD5, 0x920D, 0x920D, 0x110B, 0x9210, 0x9210, 0x0E26, + 0x9211, 0x9211, 0x1D49, 0x9212, 0x9212, 0x14D1, 0x9217, 0x9217, 0x18DE, + 0x921E, 0x921E, 0x0FAE, 0x9234, 0x9234, 0x1195, 0x923A, 0x923A, 0x17C2, + 0x923F, 0x923F, 0x1A14, 0x9240, 0x9240, 0x0DCE, 0x9245, 0x9245, 0x0E0F, + 0x9249, 0x9249, 0x1E48, 0x9257, 0x9257, 0x0E4A, 0x925B, 0x925B, 0x175F, + 0x925E, 0x925E, 0x188B, 0x9262, 0x9262, 0x134A, 0x9264, 0x9264, 0x0F64, + 0x9265, 0x9265, 0x1626, 0x9266, 0x9266, 0x1A5F, 0x9280, 0x9280, 0x18EA, + 0x9283, 0x9283, 0x1C5C, 0x9285, 0x9285, 0x10FB, 0x9291, 0x9291, 0x1546, + 0x9293, 0x9293, 0x1A15, 0x9296, 0x9296, 0x15F1, 0x9298, 0x9298, 0x1299, + 0x929C, 0x929C, 0x1DEC, 0x92B3, 0x92B3, 0x179E, 0x92B6, 0x92B6, 0x0F65, + 0x92B7, 0x92B7, 0x159E, 0x92B9, 0x92B9, 0x15F2, 0x92CC, 0x92CC, 0x1A60, + 0x92CF, 0x92CF, 0x1E59, 0x92D2, 0x92D2, 0x13F3, 0x92E4, 0x92E4, 0x1518, + 0x92EA, 0x92EA, 0x1D90, 0x92F8, 0x92F8, 0x0E10, 0x92FC, 0x92FC, 0x0DE5, + 0x9304, 0x9304, 0x11B4, 0x9310, 0x9310, 0x1C72, 0x9318, 0x9318, 0x1C73, + 0x931A, 0x931A, 0x19BE, 0x931E, 0x931E, 0x1620, 0x931F, 0x931F, 0x1089, + 0x9320, 0x9320, 0x1A61, 0x9321, 0x9321, 0x1016, 0x9322, 0x9322, 0x1A16, + 0x9324, 0x9324, 0x1017, 0x9326, 0x9326, 0x0FD2, 0x9328, 0x9328, 0x12CB, + 0x932B, 0x932B, 0x1529, 0x932E, 0x932E, 0x0EB2, 0x932F, 0x932F, 0x1B93, + 0x9348, 0x9348, 0x178B, 0x934A, 0x934A, 0x117C, 0x934B, 0x934B, 0x0EE5, + 0x934D, 0x934D, 0x10D2, 0x9354, 0x9354, 0x16AB, 0x935B, 0x935B, 0x1073, + 0x936E, 0x936E, 0x18D2, 0x9375, 0x9375, 0x0E1B, 0x937C, 0x937C, 0x1CCF, + 0x937E, 0x937E, 0x1AC4, 0x938C, 0x938C, 0x0E4B, 0x9394, 0x9394, 0x1833, + 0x9396, 0x9396, 0x15BC, 0x939A, 0x939A, 0x1C74, 0x93A3, 0x93A3, 0x1E6D, + 0x93A7, 0x93A7, 0x0DF9, 0x93AC, 0x93AC, 0x1E9E, 0x93AD, 0x93AD, 0x1B63, + 0x93B0, 0x93B0, 0x1943, 0x93C3, 0x93C3, 0x1AAF, 0x93D1, 0x93D1, 0x19F2, + 0x93DE, 0x93DE, 0x1834, 0x93E1, 0x93E1, 0x0E74, 0x93E4, 0x93E4, 0x11DF, + 0x93F6, 0x93F6, 0x1B7C, 0x9404, 0x9404, 0x1F10, 0x9418, 0x9418, 0x1AC5, + 0x9425, 0x9425, 0x1547, 0x942B, 0x942B, 0x1A17, 0x9435, 0x9435, 0x1C08, + 0x9438, 0x9438, 0x1CEF, 0x9444, 0x9444, 0x1AF2, 0x9451, 0x9452, 0x0DC7, + 0x945B, 0x945B, 0x0F0B, 0x947D, 0x947D, 0x1BA2, 0x947F, 0x947F, 0x1B94, + 0x9577, 0x9577, 0x19A8, 0x9580, 0x9580, 0x12EE, 0x9583, 0x9583, 0x155D, + 0x9589, 0x9589, 0x1D76, 0x958B, 0x958B, 0x0DFA, 0x958F, 0x958F, 0x18DF, + 0x9591, 0x9592, 0x1DDD, 0x9593, 0x9593, 0x0DAB, 0x9594, 0x9594, 0x1312, + 0x9598, 0x9598, 0x0DCF, 0x95A3, 0x95A3, 0x0D93, 0x95A4, 0x95A4, 0x1DF3, + 0x95A5, 0x95A5, 0x1390, 0x95A8, 0x95A8, 0x0FA8, 0x95AD, 0x95AD, 0x1165, + 0x95B1, 0x95B1, 0x1764, 0x95BB, 0x95BB, 0x176C, 0x95BC, 0x95BC, 0x16BC, + 0x95C7, 0x95C7, 0x16C4, 0x95CA, 0x95CA, 0x1EDF, 0x95D4, 0x95D4, 0x1DF4, + 0x95D5, 0x95D5, 0x0F8F, 0x95D6, 0x95D6, 0x1D31, 0x95DC, 0x95DC, 0x0EF9, + 0x95E1, 0x95E1, 0x1BFC, 0x95E2, 0x95E2, 0x13A5, 0x961C, 0x961C, 0x141B, + 0x9621, 0x9621, 0x1BFD, 0x962A, 0x962A, 0x1D4A, 0x962E, 0x962E, 0x17EB, + 0x9632, 0x9632, 0x1367, 0x963B, 0x963B, 0x1AA9, 0x963F, 0x963F, 0x169C, + 0x9640, 0x9640, 0x1CDF, 0x9642, 0x9642, 0x1DB3, 0x9644, 0x9644, 0x141C, + 0x964B, 0x964B, 0x11E0, 0x964C, 0x964C, 0x1274, 0x964D, 0x964D, 0x0DE6, + 0x9650, 0x9650, 0x1DDF, 0x965B, 0x965B, 0x1D77, 0x965C, 0x965C, 0x1DF5, + 0x965D, 0x965D, 0x155E, 0x965E, 0x965E, 0x163B, 0x965F, 0x965F, 0x1BEA, + 0x9662, 0x9662, 0x1886, 0x9663, 0x9663, 0x1B64, 0x9664, 0x9664, 0x1A79, + 0x966A, 0x966A, 0x137B, 0x9670, 0x9670, 0x18F0, 0x9673, 0x9673, 0x1B65, + 0x9675, 0x9675, 0x1204, 0x9676, 0x9676, 0x10D3, 0x9677, 0x9677, 0x1DED, + 0x9678, 0x9678, 0x11F1, 0x967D, 0x967D, 0x170C, 0x9685, 0x9685, 0x1852, + 0x9686, 0x9686, 0x11FB, 0x968A, 0x968A, 0x10A8, 0x968B, 0x968B, 0x15F3, + 0x968D, 0x968D, 0x1EF6, 0x968E, 0x968E, 0x0E8F, 0x9694, 0x9694, 0x0E34, + 0x9695, 0x9695, 0x1867, 0x9698, 0x9698, 0x16D9, 0x9699, 0x9699, 0x0FB6, + 0x969B, 0x969B, 0x1A7A, 0x969C, 0x969C, 0x19A9, 0x96A3, 0x96A3, 0x1224, + 0x96A7, 0x96A8, 0x15F4, 0x96AA, 0x96AA, 0x1E30, 0x96B1, 0x96B1, 0x18EB, + 0x96B7, 0x96B7, 0x119E, 0x96BB, 0x96BB, 0x1BEB, 0x96C0, 0x96C0, 0x1978, + 0x96C1, 0x96C1, 0x16B5, 0x96C4, 0x96C4, 0x186E, 0x96C5, 0x96C5, 0x169D, + 0x96C6, 0x96C6, 0x1B7D, 0x96C7, 0x96C7, 0x0EB3, 0x96C9, 0x96C9, 0x1CBD, + 0x96CB, 0x96CB, 0x1B07, 0x96CC, 0x96CC, 0x196C, 0x96CD, 0x96CD, 0x17D1, + 0x96CE, 0x96CE, 0x19D9, 0x96D5, 0x96D5, 0x1AAA, 0x96D6, 0x96D6, 0x15F6, + 0x96D9, 0x96D9, 0x168D, 0x96DB, 0x96DB, 0x1C75, 0x96DC, 0x96DC, 0x1985, + 0x96E2, 0x96E2, 0x121C, 0x96E3, 0x96E3, 0x102E, 0x96E8, 0x96E9, 0x1853, + 0x96EA, 0x96EA, 0x1555, 0x96EF, 0x96EF, 0x12EF, 0x96F0, 0x96F0, 0x1432, + 0x96F2, 0x96F2, 0x1868, 0x96F6, 0x96F6, 0x1196, 0x96F7, 0x96F7, 0x11C6, + 0x96F9, 0x96F9, 0x1327, 0x96FB, 0x96FB, 0x1A18, 0x9700, 0x9700, 0x15F7, + 0x9706, 0x9706, 0x1A62, 0x9707, 0x9707, 0x1B66, 0x9711, 0x9711, 0x1A2A, + 0x9713, 0x9713, 0x179F, 0x9716, 0x9716, 0x122B, 0x9719, 0x9719, 0x178C, + 0x971C, 0x971C, 0x14F1, 0x971E, 0x971E, 0x1DCC, 0x9727, 0x9727, 0x12E0, + 0x9730, 0x9730, 0x14C2, 0x9732, 0x9732, 0x11AC, 0x9739, 0x9739, 0x13A6, + 0x973D, 0x973D, 0x1A7B, 0x9742, 0x9742, 0x1170, 0x9744, 0x9744, 0x16DA, + 0x9748, 0x9748, 0x1197, 0x9751, 0x9751, 0x1C23, 0x9756, 0x9756, 0x1A63, + 0x975C, 0x975C, 0x1A64, 0x975E, 0x975E, 0x1464, 0x9761, 0x9761, 0x1304, + 0x9762, 0x9762, 0x1288, 0x9769, 0x9769, 0x1E35, 0x976D, 0x976D, 0x193A, + 0x9774, 0x9774, 0x1EC4, 0x9777, 0x9777, 0x193B, 0x977A, 0x977A, 0x1257, + 0x978B, 0x978B, 0x1E77, 0x978D, 0x978D, 0x16B6, 0x978F, 0x978F, 0x0ED9, + 0x97A0, 0x97A0, 0x0F6E, 0x97A8, 0x97A8, 0x0DB5, 0x97AB, 0x97AB, 0x0F6F, + 0x97AD, 0x97AD, 0x1D66, 0x97C6, 0x97C6, 0x1BFE, 0x97CB, 0x97CB, 0x18A3, + 0x97D3, 0x97D3, 0x1DE0, 0x97DC, 0x97DC, 0x10D4, 0x97F3, 0x97F3, 0x18F1, + 0x97F6, 0x97F6, 0x159F, 0x97FB, 0x97FB, 0x1869, 0x97FF, 0x97FF, 0x1E23, + 0x9800, 0x9800, 0x1E9F, 0x9801, 0x9801, 0x1E4D, 0x9802, 0x9802, 0x1A65, + 0x9803, 0x9803, 0x0E75, 0x9805, 0x9805, 0x1E04, 0x9806, 0x9806, 0x1621, + 0x9808, 0x9808, 0x15F8, 0x980A, 0x980A, 0x185D, 0x980C, 0x980C, 0x15B8, + 0x9810, 0x9810, 0x17A0, 0x9811, 0x9811, 0x17EC, 0x9812, 0x9812, 0x1340, + 0x9813, 0x9813, 0x10E8, 0x9817, 0x9817, 0x1D41, 0x9818, 0x9818, 0x1198, + 0x982D, 0x982D, 0x1105, 0x9830, 0x9830, 0x1E5A, 0x9838, 0x9838, 0x0E76, + 0x9839, 0x9839, 0x1D28, 0x983B, 0x983B, 0x1474, 0x9846, 0x9846, 0x0EE6, + 0x984C, 0x984C, 0x1A7C, 0x984D, 0x984D, 0x16E1, 0x984E, 0x984E, 0x16AC, + 0x9854, 0x9854, 0x16B7, 0x9858, 0x9858, 0x1887, 0x985A, 0x985A, 0x1A19, + 0x985E, 0x985E, 0x11EE, 0x9865, 0x9865, 0x1EA0, 0x9867, 0x9867, 0x0EB4, + 0x986B, 0x986B, 0x1A1A, 0x986F, 0x986F, 0x1E49, 0x98A8, 0x98A8, 0x1DAB, + 0x98AF, 0x98AF, 0x14D2, 0x98B1, 0x98B1, 0x1D14, 0x98C4, 0x98C4, 0x1DA4, + 0x98C7, 0x98C7, 0x1DA3, 0x98DB, 0x98DB, 0x1465, 0x98DC, 0x98DC, 0x138C, + 0x98DF, 0x98DF, 0x1665, 0x98E1, 0x98E1, 0x15AF, 0x98E2, 0x98E2, 0x1018, + 0x98ED, 0x98ED, 0x1CC2, 0x98EE, 0x98EE, 0x18F2, 0x98EF, 0x98EF, 0x1341, + 0x98F4, 0x98F4, 0x1923, 0x98FC, 0x98FC, 0x14B2, 0x98FD, 0x98FD, 0x1D91, + 0x98FE, 0x98FE, 0x1666, 0x9903, 0x9903, 0x0F32, 0x9909, 0x9909, 0x1E24, + 0x990A, 0x990A, 0x170D, 0x990C, 0x990C, 0x1924, 0x9910, 0x9910, 0x1BA3, + 0x9913, 0x9913, 0x169E, 0x9918, 0x9918, 0x173A, 0x991E, 0x991E, 0x1A1B, + 0x9920, 0x9920, 0x13C0, 0x9928, 0x9928, 0x0EFA, 0x9945, 0x9945, 0x124F, + 0x9949, 0x9949, 0x0FC5, 0x994B, 0x994B, 0x0F95, 0x994C, 0x994C, 0x1BA4, + 0x994D, 0x994D, 0x1548, 0x9951, 0x9951, 0x1019, 0x9952, 0x9952, 0x1817, + 0x9954, 0x9954, 0x17D2, 0x9957, 0x9957, 0x1E25, 0x9996, 0x9996, 0x15F9, + 0x9999, 0x9999, 0x1E26, 0x999D, 0x999D, 0x1DBD, 0x99A5, 0x99A5, 0x13E1, + 0x99A8, 0x99A8, 0x1E6E, 0x99AC, 0x99AC, 0x1235, 0x99AD, 0x99AD, 0x1715, + 0x99AE, 0x99AE, 0x1DAC, 0x99B1, 0x99B1, 0x1CE0, 0x99B3, 0x99B3, 0x1CBE, + 0x99B4, 0x99B4, 0x1622, 0x99B9, 0x99B9, 0x1944, 0x99C1, 0x99C1, 0x1328, + 0x99D0, 0x99D0, 0x1AF3, 0x99D1, 0x99D1, 0x104E, 0x99D2, 0x99D2, 0x0F66, + 0x99D5, 0x99D5, 0x0D88, 0x99D9, 0x99D9, 0x141D, 0x99DD, 0x99DD, 0x1CE1, + 0x99DF, 0x99DF, 0x14B3, 0x99ED, 0x99ED, 0x1E15, 0x99F1, 0x99F1, 0x1124, + 0x99FF, 0x99FF, 0x1B08, 0x9A01, 0x9A01, 0x1478, 0x9A08, 0x9A08, 0x13C1, + 0x9A0E, 0x9A0F, 0x101A, 0x9A19, 0x9A19, 0x1D67, 0x9A2B, 0x9A2B, 0x0E1C, + 0x9A30, 0x9A30, 0x1115, 0x9A36, 0x9A36, 0x1C76, 0x9A37, 0x9A37, 0x15A0, + 0x9A40, 0x9A40, 0x1275, 0x9A43, 0x9A43, 0x1DA5, 0x9A45, 0x9A45, 0x0F67, + 0x9A4D, 0x9A4D, 0x1F1D, 0x9A55, 0x9A55, 0x0F33, 0x9A57, 0x9A57, 0x1E31, + 0x9A5A, 0x9A5A, 0x0E77, 0x9A5B, 0x9A5B, 0x1743, 0x9A5F, 0x9A5F, 0x1CA0, + 0x9A62, 0x9A62, 0x1166, 0x9A65, 0x9A65, 0x101C, 0x9A69, 0x9A69, 0x1ED9, + 0x9A6A, 0x9A6A, 0x1167, 0x9AA8, 0x9AA8, 0x0EC9, 0x9AB8, 0x9AB8, 0x1E16, + 0x9AD3, 0x9AD3, 0x15FA, 0x9AD4, 0x9AD4, 0x1C2D, 0x9AD8, 0x9AD8, 0x0EB5, + 0x9AE5, 0x9AE5, 0x176D, 0x9AEE, 0x9AEE, 0x134B, 0x9B1A, 0x9B1A, 0x15FB, + 0x9B27, 0x9B27, 0x11D2, 0x9B2A, 0x9B2A, 0x1D2E, 0x9B31, 0x9B31, 0x186B, + 0x9B3C, 0x9B3C, 0x0F99, 0x9B41, 0x9B41, 0x0F17, 0x9B42, 0x9B42, 0x1EA9, + 0x9B43, 0x9B43, 0x134C, 0x9B44, 0x9B44, 0x1383, 0x9B45, 0x9B45, 0x1271, + 0x9B4F, 0x9B4F, 0x18A4, 0x9B54, 0x9B54, 0x1236, 0x9B5A, 0x9B5A, 0x1716, + 0x9B6F, 0x9B6F, 0x11AD, 0x9B8E, 0x9B8E, 0x1A2B, 0x9B91, 0x9B91, 0x1D92, + 0x9B9F, 0x9B9F, 0x16B8, 0x9BAB, 0x9BAB, 0x0F34, 0x9BAE, 0x9BAE, 0x1549, + 0x9BC9, 0x9BC9, 0x121D, 0x9BD6, 0x9BD6, 0x1C24, 0x9BE4, 0x9BE4, 0x0EC7, + 0x9BE8, 0x9BE8, 0x0E78, 0x9C0D, 0x9C0D, 0x1C77, 0x9C10, 0x9C10, 0x16AD, + 0x9C12, 0x9C12, 0x13E2, 0x9C15, 0x9C15, 0x1DCD, 0x9C25, 0x9C25, 0x1EDA, + 0x9C32, 0x9C32, 0x17BC, 0x9C3B, 0x9C3B, 0x1250, 0x9C47, 0x9C47, 0x0DE7, + 0x9C49, 0x9C49, 0x13AF, 0x9C57, 0x9C57, 0x1225, 0x9CE5, 0x9CE5, 0x1AAB, + 0x9CE7, 0x9CE7, 0x141E, 0x9CE9, 0x9CE9, 0x0F68, 0x9CF3, 0x9CF3, 0x13F4, + 0x9CF4, 0x9CF4, 0x129A, 0x9CF6, 0x9CF6, 0x1760, 0x9D09, 0x9D09, 0x169F, + 0x9D1B, 0x9D1B, 0x1888, 0x9D26, 0x9D26, 0x16CF, 0x9D28, 0x9D28, 0x16C8, + 0x9D3B, 0x9D3B, 0x1EB6, 0x9D51, 0x9D51, 0x0E3F, 0x9D5D, 0x9D5D, 0x16A0, + 0x9D60, 0x9D60, 0x0EBD, 0x9D61, 0x9D61, 0x12E1, 0x9D6C, 0x9D6C, 0x143C, + 0x9D72, 0x9D72, 0x1979, 0x9DA9, 0x9DA9, 0x12BA, 0x9DAF, 0x9DAF, 0x16E4, + 0x9DB4, 0x9DB4, 0x1DD2, 0x9DC4, 0x9DC4, 0x0E90, 0x9DD7, 0x9DD7, 0x0F69, + 0x9DF2, 0x9DF2, 0x1CA1, 0x9DF8, 0x9DF8, 0x1F4C, 0x9DF9, 0x9DF9, 0x18F9, + 0x9DFA, 0x9DFA, 0x11AE, 0x9E1A, 0x9E1A, 0x16E5, 0x9E1E, 0x9E1E, 0x112C, + 0x9E75, 0x9E75, 0x11AF, 0x9E79, 0x9E79, 0x1DEE, 0x9E7D, 0x9E7D, 0x176E, + 0x9E7F, 0x9E7F, 0x11B5, 0x9E92, 0x9E92, 0x101D, 0x9E93, 0x9E93, 0x11B6, + 0x9E97, 0x9E97, 0x1168, 0x9E9D, 0x9E9D, 0x14B4, 0x9E9F, 0x9E9F, 0x1226, + 0x9EA5, 0x9EA5, 0x1276, 0x9EB4, 0x9EB4, 0x0F70, 0x9EB5, 0x9EB5, 0x1289, + 0x9EBB, 0x9EBB, 0x1237, 0x9EBE, 0x9EBE, 0x1F44, 0x9EC3, 0x9EC3, 0x1EF7, + 0x9ECD, 0x9ECD, 0x1519, 0x9ECE, 0x9ECE, 0x1169, 0x9ED1, 0x9ED1, 0x1F52, + 0x9ED4, 0x9ED4, 0x0E27, 0x9ED8, 0x9ED8, 0x12E3, 0x9EDB, 0x9EDB, 0x10A9, + 0x9EDC, 0x9EDC, 0x1C89, 0x9EDE, 0x9EDE, 0x1A2C, 0x9EE8, 0x9EE8, 0x1099, + 0x9EF4, 0x9EF4, 0x1305, 0x9F07, 0x9F07, 0x17BD, 0x9F08, 0x9F08, 0x13B0, + 0x9F0E, 0x9F0E, 0x1A66, 0x9F13, 0x9F13, 0x0EB6, 0x9F20, 0x9F20, 0x151A, + 0x9F3B, 0x9F3B, 0x1466, 0x9F4A, 0x9F4A, 0x1A7D, 0x9F4B, 0x9F4B, 0x19B9, + 0x9F4E, 0x9F4E, 0x19BA, 0x9F52, 0x9F52, 0x1CBF, 0x9F5F, 0x9F5F, 0x19DA, + 0x9F61, 0x9F61, 0x1199, 0x9F67, 0x9F67, 0x1556, 0x9F6A, 0x9F6A, 0x1B95, + 0x9F6C, 0x9F6C, 0x1717, 0x9F77, 0x9F77, 0x16AE, 0x9F8D, 0x9F8D, 0x11D3, + 0x9F90, 0x9F90, 0x1368, 0x9F95, 0x9F95, 0x0DC9, 0x9F9C, 0x9F9C, 0x0F6A, + 0xAC00, 0xAC01, 0x043E, 0xAC02, 0xAC03, 0x2475, 0xAC04, 0xAC04, 0x0440, + 0xAC05, 0xAC06, 0x2477, 0xAC07, 0xAC0A, 0x0441, 0xAC0B, 0xAC0F, 0x2479, + 0xAC10, 0xAC17, 0x0445, 0xAC18, 0xAC18, 0x247E, 0xAC19, 0xAC1D, 0x044D, + 0xAC1E, 0xAC1F, 0x247F, 0xAC20, 0xAC20, 0x0452, 0xAC21, 0xAC23, 0x2481, + 0xAC24, 0xAC24, 0x0453, 0xAC25, 0xAC2B, 0x2484, 0xAC2C, 0xAC2D, 0x0454, + 0xAC2E, 0xAC2E, 0x248B, 0xAC2F, 0xAC31, 0x0456, 0xAC32, 0xAC37, 0x248C, + 0xAC38, 0xAC39, 0x0459, 0xAC3A, 0xAC3B, 0x2492, 0xAC3C, 0xAC3C, 0x045B, + 0xAC3D, 0xAC3F, 0x2494, 0xAC40, 0xAC40, 0x045C, 0xAC41, 0xAC4A, 0x2497, + 0xAC4B, 0xAC4B, 0x045D, 0xAC4C, 0xAC4C, 0x24A1, 0xAC4D, 0xAC4D, 0x045E, + 0xAC4E, 0xAC53, 0x24A2, 0xAC54, 0xAC54, 0x045F, 0xAC55, 0xAC57, 0x24A8, + 0xAC58, 0xAC58, 0x0460, 0xAC59, 0xAC5B, 0x24AB, 0xAC5C, 0xAC5C, 0x0461, + 0xAC5D, 0xAC6F, 0x24AE, 0xAC70, 0xAC71, 0x0462, 0xAC72, 0xAC73, 0x24C1, + 0xAC74, 0xAC74, 0x0464, 0xAC75, 0xAC76, 0x24C3, 0xAC77, 0xAC78, 0x0465, + 0xAC79, 0xAC79, 0x24C5, 0xAC7A, 0xAC7A, 0x0467, 0xAC7B, 0xAC7F, 0x24C6, + 0xAC80, 0xAC81, 0x0468, 0xAC82, 0xAC82, 0x24CB, 0xAC83, 0xAC86, 0x046A, + 0xAC87, 0xAC88, 0x24CC, 0xAC89, 0xAC8C, 0x046E, 0xAC8D, 0xAC8F, 0x24CE, + 0xAC90, 0xAC90, 0x0472, 0xAC91, 0xAC93, 0x24D1, 0xAC94, 0xAC94, 0x0473, + 0xAC95, 0xAC9B, 0x24D4, 0xAC9C, 0xAC9D, 0x0474, 0xAC9E, 0xAC9E, 0x24DB, + 0xAC9F, 0xACA1, 0x0476, 0xACA2, 0xACA7, 0x24DC, 0xACA8, 0xACAA, 0x0479, + 0xACAB, 0xACAB, 0x24E2, 0xACAC, 0xACAC, 0x047C, 0xACAD, 0xACAE, 0x24E3, + 0xACAF, 0xACB0, 0x047D, 0xACB1, 0xACB7, 0x24E5, 0xACB8, 0xACB9, 0x047F, + 0xACBA, 0xACBA, 0x24EC, 0xACBB, 0xACBD, 0x0481, 0xACBE, 0xACC0, 0x24ED, + 0xACC1, 0xACC1, 0x0484, 0xACC2, 0xACC3, 0x24F0, 0xACC4, 0xACC4, 0x0485, + 0xACC5, 0xACC7, 0x24F2, 0xACC8, 0xACC8, 0x0486, 0xACC9, 0xACCB, 0x24F5, + 0xACCC, 0xACCC, 0x0487, 0xACCD, 0xACD4, 0x24F8, 0xACD5, 0xACD5, 0x0488, + 0xACD6, 0xACD6, 0x2500, 0xACD7, 0xACD7, 0x0489, 0xACD8, 0xACDF, 0x2501, + 0xACE0, 0xACE1, 0x048A, 0xACE2, 0xACE3, 0x2509, 0xACE4, 0xACE4, 0x048C, + 0xACE5, 0xACE6, 0x250B, 0xACE7, 0xACE8, 0x048D, 0xACE9, 0xACE9, 0x250D, + 0xACEA, 0xACEA, 0x048F, 0xACEB, 0xACEB, 0x250E, 0xACEC, 0xACEC, 0x0490, + 0xACED, 0xACEE, 0x250F, 0xACEF, 0xACF1, 0x0491, 0xACF2, 0xACF2, 0x2511, + 0xACF3, 0xACF3, 0x0494, 0xACF4, 0xACF4, 0x2512, 0xACF5, 0xACF6, 0x0495, + 0xACF7, 0xACFB, 0x2513, 0xACFC, 0xACFD, 0x0497, 0xACFE, 0xACFF, 0x2518, + 0xAD00, 0xAD00, 0x0499, 0xAD01, 0xAD03, 0x251A, 0xAD04, 0xAD04, 0x049A, + 0xAD05, 0xAD05, 0x251D, 0xAD06, 0xAD06, 0x049B, 0xAD07, 0xAD0B, 0x251E, + 0xAD0C, 0xAD0D, 0x049C, 0xAD0E, 0xAD0E, 0x2523, 0xAD0F, 0xAD0F, 0x049E, + 0xAD10, 0xAD10, 0x2524, 0xAD11, 0xAD11, 0x049F, 0xAD12, 0xAD17, 0x2525, + 0xAD18, 0xAD18, 0x04A0, 0xAD19, 0xAD1B, 0x252B, 0xAD1C, 0xAD1C, 0x04A1, + 0xAD1D, 0xAD1F, 0x252E, 0xAD20, 0xAD20, 0x04A2, 0xAD21, 0xAD28, 0x2531, + 0xAD29, 0xAD29, 0x04A3, 0xAD2A, 0xAD2B, 0x2539, 0xAD2C, 0xAD2D, 0x04A4, + 0xAD2E, 0xAD33, 0x253B, 0xAD34, 0xAD35, 0x04A6, 0xAD36, 0xAD37, 0x2541, + 0xAD38, 0xAD38, 0x04A8, 0xAD39, 0xAD3B, 0x2543, 0xAD3C, 0xAD3C, 0x04A9, + 0xAD3D, 0xAD43, 0x2546, 0xAD44, 0xAD45, 0x04AA, 0xAD46, 0xAD46, 0x254D, + 0xAD47, 0xAD47, 0x04AC, 0xAD48, 0xAD48, 0x254E, 0xAD49, 0xAD49, 0x04AD, + 0xAD4A, 0xAD4F, 0x254F, 0xAD50, 0xAD50, 0x04AE, 0xAD51, 0xAD53, 0x2555, + 0xAD54, 0xAD54, 0x04AF, 0xAD55, 0xAD57, 0x2558, 0xAD58, 0xAD58, 0x04B0, + 0xAD59, 0xAD60, 0x255B, 0xAD61, 0xAD61, 0x04B1, 0xAD62, 0xAD62, 0x2563, + 0xAD63, 0xAD63, 0x04B2, 0xAD64, 0xAD6B, 0x2564, 0xAD6C, 0xAD6D, 0x04B3, + 0xAD6E, 0xAD6F, 0x256C, 0xAD70, 0xAD70, 0x04B5, 0xAD71, 0xAD72, 0x256E, + 0xAD73, 0xAD76, 0x04B6, 0xAD77, 0xAD7A, 0x2570, 0xAD7B, 0xAD7D, 0x04BA, + 0xAD7E, 0xAD7E, 0x2574, 0xAD7F, 0xAD7F, 0x04BD, 0xAD80, 0xAD80, 0x2575, + 0xAD81, 0xAD82, 0x04BE, 0xAD83, 0xAD87, 0x2576, 0xAD88, 0xAD89, 0x04C0, + 0xAD8A, 0xAD8B, 0x257B, 0xAD8C, 0xAD8C, 0x04C2, 0xAD8D, 0xAD8F, 0x257D, + 0xAD90, 0xAD90, 0x04C3, 0xAD91, 0xAD9B, 0x2580, 0xAD9C, 0xAD9D, 0x04C4, + 0xAD9E, 0xADA3, 0x258B, 0xADA4, 0xADA4, 0x04C6, 0xADA5, 0xADB6, 0x2591, + 0xADB7, 0xADB7, 0x04C7, 0xADB8, 0xADBF, 0x25A3, 0xADC0, 0xADC1, 0x04C8, + 0xADC2, 0xADC3, 0x25AB, 0xADC4, 0xADC4, 0x04CA, 0xADC5, 0xADC7, 0x25AD, + 0xADC8, 0xADC8, 0x04CB, 0xADC9, 0xADCF, 0x25B0, 0xADD0, 0xADD1, 0x04CC, + 0xADD2, 0xADD2, 0x25B7, 0xADD3, 0xADD3, 0x04CE, 0xADD4, 0xADDB, 0x25B8, + 0xADDC, 0xADDC, 0x04CF, 0xADDD, 0xADDF, 0x25C0, 0xADE0, 0xADE0, 0x04D0, + 0xADE1, 0xADE3, 0x25C3, 0xADE4, 0xADE4, 0x04D1, 0xADE5, 0xADF7, 0x25C6, + 0xADF8, 0xADF9, 0x04D2, 0xADFA, 0xADFB, 0x25D9, 0xADFC, 0xADFC, 0x04D4, + 0xADFD, 0xADFE, 0x25DB, 0xADFF, 0xADFF, 0x04D5, 0xAE00, 0xAE01, 0x04D6, + 0xAE02, 0xAE07, 0x25DD, 0xAE08, 0xAE09, 0x04D8, 0xAE0A, 0xAE0A, 0x25E3, + 0xAE0B, 0xAE0B, 0x04DA, 0xAE0C, 0xAE0C, 0x25E4, 0xAE0D, 0xAE0D, 0x04DB, + 0xAE0E, 0xAE13, 0x25E5, 0xAE14, 0xAE14, 0x04DC, 0xAE15, 0xAE2F, 0x25EB, + 0xAE30, 0xAE31, 0x04DD, 0xAE32, 0xAE33, 0x2606, 0xAE34, 0xAE34, 0x04DF, + 0xAE35, 0xAE36, 0x2608, 0xAE37, 0xAE38, 0x04E0, 0xAE39, 0xAE39, 0x260A, + 0xAE3A, 0xAE3A, 0x04E2, 0xAE3B, 0xAE3F, 0x260B, 0xAE40, 0xAE41, 0x04E3, + 0xAE42, 0xAE42, 0x2610, 0xAE43, 0xAE43, 0x04E5, 0xAE44, 0xAE44, 0x2611, + 0xAE45, 0xAE46, 0x04E6, 0xAE47, 0xAE49, 0x2612, 0xAE4A, 0xAE4A, 0x04E8, + 0xAE4B, 0xAE4B, 0x2615, 0xAE4C, 0xAE4E, 0x04E9, 0xAE4F, 0xAE4F, 0x2616, + 0xAE50, 0xAE50, 0x04EC, 0xAE51, 0xAE53, 0x2617, 0xAE54, 0xAE54, 0x04ED, + 0xAE55, 0xAE55, 0x261A, 0xAE56, 0xAE56, 0x04EE, 0xAE57, 0xAE5B, 0x261B, + 0xAE5C, 0xAE5D, 0x04EF, 0xAE5E, 0xAE5E, 0x2620, 0xAE5F, 0xAE61, 0x04F1, + 0xAE62, 0xAE64, 0x2621, 0xAE65, 0xAE65, 0x04F4, 0xAE66, 0xAE67, 0x2624, + 0xAE68, 0xAE69, 0x04F5, 0xAE6A, 0xAE6B, 0x2626, 0xAE6C, 0xAE6C, 0x04F7, + 0xAE6D, 0xAE6F, 0x2628, 0xAE70, 0xAE70, 0x04F8, 0xAE71, 0xAE77, 0x262B, + 0xAE78, 0xAE79, 0x04F9, 0xAE7A, 0xAE7A, 0x2632, 0xAE7B, 0xAE7D, 0x04FB, + 0xAE7E, 0xAE83, 0x2633, 0xAE84, 0xAE85, 0x04FE, 0xAE86, 0xAE8B, 0x2639, + 0xAE8C, 0xAE8C, 0x0500, 0xAE8D, 0xAEBB, 0x263F, 0xAEBC, 0xAEBE, 0x0501, + 0xAEBF, 0xAEBF, 0x266E, 0xAEC0, 0xAEC0, 0x0504, 0xAEC1, 0xAEC3, 0x266F, + 0xAEC4, 0xAEC4, 0x0505, 0xAEC5, 0xAECB, 0x2672, 0xAECC, 0xAECD, 0x0506, + 0xAECE, 0xAECE, 0x2679, 0xAECF, 0xAED1, 0x0508, 0xAED2, 0xAED7, 0x267A, + 0xAED8, 0xAED9, 0x050B, 0xAEDA, 0xAEDB, 0x2680, 0xAEDC, 0xAEDC, 0x050D, + 0xAEDD, 0xAEE7, 0x2682, 0xAEE8, 0xAEE8, 0x050E, 0xAEE9, 0xAEEA, 0x268D, + 0xAEEB, 0xAEEB, 0x050F, 0xAEEC, 0xAEEC, 0x268F, 0xAEED, 0xAEED, 0x0510, + 0xAEEE, 0xAEF3, 0x2690, 0xAEF4, 0xAEF4, 0x0511, 0xAEF5, 0xAEF7, 0x2696, + 0xAEF8, 0xAEF8, 0x0512, 0xAEF9, 0xAEFB, 0x2699, 0xAEFC, 0xAEFC, 0x0513, + 0xAEFD, 0xAEFF, 0x269C, 0xAF00, 0xAF06, 0x269F, 0xAF07, 0xAF08, 0x0514, + 0xAF09, 0xAF0C, 0x26A6, 0xAF0D, 0xAF0D, 0x0516, 0xAF0E, 0xAF0F, 0x26AA, + 0xAF10, 0xAF10, 0x0517, 0xAF11, 0xAF2B, 0x26AC, 0xAF2C, 0xAF2D, 0x0518, + 0xAF2E, 0xAF2F, 0x26C7, 0xAF30, 0xAF30, 0x051A, 0xAF31, 0xAF31, 0x26C9, + 0xAF32, 0xAF32, 0x051B, 0xAF33, 0xAF33, 0x26CA, 0xAF34, 0xAF34, 0x051C, + 0xAF35, 0xAF3B, 0x26CB, 0xAF3C, 0xAF3D, 0x051D, 0xAF3E, 0xAF3E, 0x26D2, + 0xAF3F, 0xAF3F, 0x051F, 0xAF40, 0xAF40, 0x26D3, 0xAF41, 0xAF43, 0x0520, + 0xAF44, 0xAF47, 0x26D4, 0xAF48, 0xAF49, 0x0523, 0xAF4A, 0xAF4F, 0x26D8, + 0xAF50, 0xAF50, 0x0525, 0xAF51, 0xAF5B, 0x26DE, 0xAF5C, 0xAF5D, 0x0526, + 0xAF5E, 0xAF63, 0x26E9, 0xAF64, 0xAF65, 0x0528, 0xAF66, 0xAF78, 0x26EF, + 0xAF79, 0xAF79, 0x052A, 0xAF7A, 0xAF7F, 0x2702, 0xAF80, 0xAF80, 0x052B, + 0xAF81, 0xAF83, 0x2708, 0xAF84, 0xAF84, 0x052C, 0xAF85, 0xAF87, 0x270B, + 0xAF88, 0xAF88, 0x052D, 0xAF89, 0xAF8F, 0x270E, 0xAF90, 0xAF91, 0x052E, + 0xAF92, 0xAF94, 0x2715, 0xAF95, 0xAF95, 0x0530, 0xAF96, 0xAF9B, 0x2718, + 0xAF9C, 0xAF9C, 0x0531, 0xAF9D, 0xAFB7, 0x271E, 0xAFB8, 0xAFB9, 0x0532, + 0xAFBA, 0xAFBB, 0x2739, 0xAFBC, 0xAFBC, 0x0534, 0xAFBD, 0xAFBF, 0x273B, + 0xAFC0, 0xAFC0, 0x0535, 0xAFC1, 0xAFC6, 0x273E, 0xAFC7, 0xAFC9, 0x0536, + 0xAFCA, 0xAFCA, 0x2744, 0xAFCB, 0xAFCB, 0x0539, 0xAFCC, 0xAFCC, 0x2745, + 0xAFCD, 0xAFCE, 0x053A, 0xAFCF, 0xAFD3, 0x2746, 0xAFD4, 0xAFD4, 0x053C, + 0xAFD5, 0xAFDB, 0x274B, 0xAFDC, 0xAFDC, 0x053D, 0xAFDD, 0xAFE7, 0x2752, + 0xAFE8, 0xAFE9, 0x053E, 0xAFEA, 0xAFEF, 0x275D, 0xAFF0, 0xAFF1, 0x0540, + 0xAFF2, 0xAFF3, 0x2763, 0xAFF4, 0xAFF4, 0x0542, 0xAFF5, 0xAFF7, 0x2765, + 0xAFF8, 0xAFF8, 0x0543, 0xAFF9, 0xAFFF, 0x2768, 0xB000, 0xB001, 0x0544, + 0xB002, 0xB003, 0x276F, 0xB004, 0xB004, 0x0546, 0xB005, 0xB00B, 0x2771, + 0xB00C, 0xB00C, 0x0547, 0xB00D, 0xB00F, 0x2778, 0xB010, 0xB010, 0x0548, + 0xB011, 0xB013, 0x277B, 0xB014, 0xB014, 0x0549, 0xB015, 0xB01B, 0x277E, + 0xB01C, 0xB01D, 0x054A, 0xB01E, 0xB027, 0x2785, 0xB028, 0xB028, 0x054C, + 0xB029, 0xB043, 0x278F, 0xB044, 0xB045, 0x054D, 0xB046, 0xB047, 0x27AA, + 0xB048, 0xB048, 0x054F, 0xB049, 0xB049, 0x27AC, 0xB04A, 0xB04A, 0x0550, + 0xB04B, 0xB04B, 0x27AD, 0xB04C, 0xB04C, 0x0551, 0xB04D, 0xB04D, 0x27AE, + 0xB04E, 0xB04E, 0x0552, 0xB04F, 0xB052, 0x27AF, 0xB053, 0xB055, 0x0553, + 0xB056, 0xB056, 0x27B3, 0xB057, 0xB057, 0x0556, 0xB058, 0xB058, 0x27B4, + 0xB059, 0xB059, 0x0557, 0xB05A, 0xB05C, 0x27B5, 0xB05D, 0xB05D, 0x0558, + 0xB05E, 0xB07B, 0x27B8, 0xB07C, 0xB07D, 0x0559, 0xB07E, 0xB07F, 0x27D6, + 0xB080, 0xB080, 0x055B, 0xB081, 0xB083, 0x27D8, 0xB084, 0xB084, 0x055C, + 0xB085, 0xB08B, 0x27DB, 0xB08C, 0xB08D, 0x055D, 0xB08E, 0xB08E, 0x27E2, + 0xB08F, 0xB08F, 0x055F, 0xB090, 0xB090, 0x27E3, 0xB091, 0xB091, 0x0560, + 0xB092, 0xB097, 0x27E4, 0xB098, 0xB09A, 0x0561, 0xB09B, 0xB09B, 0x27EA, + 0xB09C, 0xB09C, 0x0564, 0xB09D, 0xB09E, 0x27EB, 0xB09F, 0xB0A2, 0x0565, + 0xB0A3, 0xB0A7, 0x27ED, 0xB0A8, 0xB0A9, 0x0569, 0xB0AA, 0xB0AA, 0x27F2, + 0xB0AB, 0xB0AF, 0x056B, 0xB0B0, 0xB0B0, 0x27F3, 0xB0B1, 0xB0B1, 0x0570, + 0xB0B2, 0xB0B2, 0x27F4, 0xB0B3, 0xB0B5, 0x0571, 0xB0B6, 0xB0B7, 0x27F5, + 0xB0B8, 0xB0B8, 0x0574, 0xB0B9, 0xB0BB, 0x27F7, 0xB0BC, 0xB0BC, 0x0575, + 0xB0BD, 0xB0C3, 0x27FA, 0xB0C4, 0xB0C5, 0x0576, 0xB0C6, 0xB0C6, 0x2801, + 0xB0C7, 0xB0C9, 0x0578, 0xB0CA, 0xB0CF, 0x2802, 0xB0D0, 0xB0D1, 0x057B, + 0xB0D2, 0xB0D3, 0x2808, 0xB0D4, 0xB0D4, 0x057D, 0xB0D5, 0xB0D7, 0x280A, + 0xB0D8, 0xB0D8, 0x057E, 0xB0D9, 0xB0DF, 0x280D, 0xB0E0, 0xB0E0, 0x057F, + 0xB0E1, 0xB0E4, 0x2814, 0xB0E5, 0xB0E5, 0x0580, 0xB0E6, 0xB0FF, 0x2818, + 0xB100, 0xB107, 0x2832, 0xB108, 0xB109, 0x0581, 0xB10A, 0xB10A, 0x283A, + 0xB10B, 0xB10C, 0x0583, 0xB10D, 0xB10F, 0x283B, 0xB110, 0xB110, 0x0585, + 0xB111, 0xB111, 0x283E, 0xB112, 0xB113, 0x0586, 0xB114, 0xB117, 0x283F, + 0xB118, 0xB119, 0x0588, 0xB11A, 0xB11A, 0x2843, 0xB11B, 0xB11D, 0x058A, + 0xB11E, 0xB122, 0x2844, 0xB123, 0xB125, 0x058D, 0xB126, 0xB127, 0x2849, + 0xB128, 0xB128, 0x0590, 0xB129, 0xB12B, 0x284B, 0xB12C, 0xB12C, 0x0591, + 0xB12D, 0xB133, 0x284E, 0xB134, 0xB135, 0x0592, 0xB136, 0xB136, 0x2855, + 0xB137, 0xB139, 0x0594, 0xB13A, 0xB13F, 0x2856, 0xB140, 0xB141, 0x0597, + 0xB142, 0xB143, 0x285C, 0xB144, 0xB144, 0x0599, 0xB145, 0xB147, 0x285E, + 0xB148, 0xB148, 0x059A, 0xB149, 0xB14F, 0x2861, 0xB150, 0xB151, 0x059B, + 0xB152, 0xB153, 0x2868, 0xB154, 0xB155, 0x059D, 0xB156, 0xB157, 0x286A, + 0xB158, 0xB158, 0x059F, 0xB159, 0xB15B, 0x286C, 0xB15C, 0xB15C, 0x05A0, + 0xB15D, 0xB15F, 0x286F, 0xB160, 0xB160, 0x05A1, 0xB161, 0xB177, 0x2872, + 0xB178, 0xB179, 0x05A2, 0xB17A, 0xB17B, 0x2889, 0xB17C, 0xB17C, 0x05A4, + 0xB17D, 0xB17F, 0x288B, 0xB180, 0xB180, 0x05A5, 0xB181, 0xB181, 0x288E, + 0xB182, 0xB182, 0x05A6, 0xB183, 0xB187, 0x288F, 0xB188, 0xB189, 0x05A7, + 0xB18A, 0xB18A, 0x2894, 0xB18B, 0xB18B, 0x05A9, 0xB18C, 0xB18C, 0x2895, + 0xB18D, 0xB18D, 0x05AA, 0xB18E, 0xB191, 0x2896, 0xB192, 0xB194, 0x05AB, + 0xB195, 0xB197, 0x289A, 0xB198, 0xB198, 0x05AE, 0xB199, 0xB19B, 0x289D, + 0xB19C, 0xB19C, 0x05AF, 0xB19D, 0xB1A7, 0x28A0, 0xB1A8, 0xB1A8, 0x05B0, + 0xB1A9, 0xB1CB, 0x28AB, 0xB1CC, 0xB1CC, 0x05B1, 0xB1CD, 0xB1CF, 0x28CE, + 0xB1D0, 0xB1D0, 0x05B2, 0xB1D1, 0xB1D3, 0x28D1, 0xB1D4, 0xB1D4, 0x05B3, + 0xB1D5, 0xB1DB, 0x28D4, 0xB1DC, 0xB1DD, 0x05B4, 0xB1DE, 0xB1DE, 0x28DB, + 0xB1DF, 0xB1DF, 0x05B6, 0xB1E0, 0xB1E7, 0x28DC, 0xB1E8, 0xB1E9, 0x05B7, + 0xB1EA, 0xB1EB, 0x28E4, 0xB1EC, 0xB1EC, 0x05B9, 0xB1ED, 0xB1EF, 0x28E6, + 0xB1F0, 0xB1F0, 0x05BA, 0xB1F1, 0xB1F8, 0x28E9, 0xB1F9, 0xB1F9, 0x05BB, + 0xB1FA, 0xB1FA, 0x28F1, 0xB1FB, 0xB1FB, 0x05BC, 0xB1FC, 0xB1FC, 0x28F2, + 0xB1FD, 0xB1FD, 0x05BD, 0xB1FE, 0xB1FF, 0x28F3, 0xB200, 0xB203, 0x28F5, + 0xB204, 0xB205, 0x05BE, 0xB206, 0xB207, 0x28F9, 0xB208, 0xB208, 0x05C0, + 0xB209, 0xB20A, 0x28FB, 0xB20B, 0xB20C, 0x05C1, 0xB20D, 0xB213, 0x28FD, + 0xB214, 0xB215, 0x05C3, 0xB216, 0xB216, 0x2904, 0xB217, 0xB217, 0x05C5, + 0xB218, 0xB218, 0x2905, 0xB219, 0xB219, 0x05C6, 0xB21A, 0xB21F, 0x2906, + 0xB220, 0xB220, 0x05C7, 0xB221, 0xB233, 0x290C, 0xB234, 0xB234, 0x05C8, + 0xB235, 0xB23B, 0x291F, 0xB23C, 0xB23C, 0x05C9, 0xB23D, 0xB257, 0x2926, + 0xB258, 0xB258, 0x05CA, 0xB259, 0xB25B, 0x2941, 0xB25C, 0xB25C, 0x05CB, + 0xB25D, 0xB25F, 0x2944, 0xB260, 0xB260, 0x05CC, 0xB261, 0xB267, 0x2947, + 0xB268, 0xB269, 0x05CD, 0xB26A, 0xB273, 0x294E, 0xB274, 0xB275, 0x05CF, + 0xB276, 0xB27B, 0x2958, 0xB27C, 0xB27C, 0x05D1, 0xB27D, 0xB283, 0x295E, + 0xB284, 0xB285, 0x05D2, 0xB286, 0xB288, 0x2965, 0xB289, 0xB289, 0x05D4, + 0xB28A, 0xB28F, 0x2968, 0xB290, 0xB291, 0x05D5, 0xB292, 0xB293, 0x296E, + 0xB294, 0xB294, 0x05D7, 0xB295, 0xB297, 0x2970, 0xB298, 0xB29A, 0x05D8, + 0xB29B, 0xB29F, 0x2973, 0xB2A0, 0xB2A1, 0x05DB, 0xB2A2, 0xB2A2, 0x2978, + 0xB2A3, 0xB2A3, 0x05DD, 0xB2A4, 0xB2A4, 0x2979, 0xB2A5, 0xB2A6, 0x05DE, + 0xB2A7, 0xB2A9, 0x297A, 0xB2AA, 0xB2AA, 0x05E0, 0xB2AB, 0xB2AB, 0x297D, + 0xB2AC, 0xB2AC, 0x05E1, 0xB2AD, 0xB2AF, 0x297E, 0xB2B0, 0xB2B0, 0x05E2, + 0xB2B1, 0xB2B3, 0x2981, 0xB2B4, 0xB2B4, 0x05E3, 0xB2B5, 0xB2C7, 0x2984, + 0xB2C8, 0xB2C9, 0x05E4, 0xB2CA, 0xB2CB, 0x2997, 0xB2CC, 0xB2CC, 0x05E6, + 0xB2CD, 0xB2CF, 0x2999, 0xB2D0, 0xB2D0, 0x05E7, 0xB2D1, 0xB2D1, 0x299C, + 0xB2D2, 0xB2D2, 0x05E8, 0xB2D3, 0xB2D7, 0x299D, 0xB2D8, 0xB2D9, 0x05E9, + 0xB2DA, 0xB2DA, 0x29A2, 0xB2DB, 0xB2DB, 0x05EB, 0xB2DC, 0xB2DC, 0x29A3, + 0xB2DD, 0xB2DD, 0x05EC, 0xB2DE, 0xB2E1, 0x29A4, 0xB2E2, 0xB2E2, 0x05ED, + 0xB2E3, 0xB2E3, 0x29A8, 0xB2E4, 0xB2E6, 0x05EE, 0xB2E7, 0xB2E7, 0x29A9, + 0xB2E8, 0xB2E8, 0x05F1, 0xB2E9, 0xB2EA, 0x29AA, 0xB2EB, 0xB2EF, 0x05F2, + 0xB2F0, 0xB2F2, 0x29AC, 0xB2F3, 0xB2F5, 0x05F7, 0xB2F6, 0xB2F6, 0x29AF, + 0xB2F7, 0xB2FB, 0x05FA, 0xB2FC, 0xB2FE, 0x29B0, 0xB2FF, 0xB2FF, 0x05FF, + 0xB300, 0xB301, 0x0600, 0xB302, 0xB303, 0x29B3, 0xB304, 0xB304, 0x0602, + 0xB305, 0xB307, 0x29B5, 0xB308, 0xB308, 0x0603, 0xB309, 0xB30F, 0x29B8, + 0xB310, 0xB311, 0x0604, 0xB312, 0xB312, 0x29BF, 0xB313, 0xB315, 0x0606, + 0xB316, 0xB31B, 0x29C0, 0xB31C, 0xB31C, 0x0609, 0xB31D, 0xB353, 0x29C6, + 0xB354, 0xB356, 0x060A, 0xB357, 0xB357, 0x29FD, 0xB358, 0xB358, 0x060D, + 0xB359, 0xB35A, 0x29FE, 0xB35B, 0xB35C, 0x060E, 0xB35D, 0xB35D, 0x2A00, + 0xB35E, 0xB35F, 0x0610, 0xB360, 0xB363, 0x2A01, 0xB364, 0xB365, 0x0612, + 0xB366, 0xB366, 0x2A05, 0xB367, 0xB367, 0x0614, 0xB368, 0xB368, 0x2A06, + 0xB369, 0xB369, 0x0615, 0xB36A, 0xB36A, 0x2A07, 0xB36B, 0xB36B, 0x0616, + 0xB36C, 0xB36D, 0x2A08, 0xB36E, 0xB36E, 0x0617, 0xB36F, 0xB36F, 0x2A0A, + 0xB370, 0xB371, 0x0618, 0xB372, 0xB373, 0x2A0B, 0xB374, 0xB374, 0x061A, + 0xB375, 0xB377, 0x2A0D, 0xB378, 0xB378, 0x061B, 0xB379, 0xB37F, 0x2A10, + 0xB380, 0xB381, 0x061C, 0xB382, 0xB382, 0x2A17, 0xB383, 0xB385, 0x061E, + 0xB386, 0xB38B, 0x2A18, 0xB38C, 0xB38C, 0x0621, 0xB38D, 0xB38F, 0x2A1E, + 0xB390, 0xB390, 0x0622, 0xB391, 0xB393, 0x2A21, 0xB394, 0xB394, 0x0623, + 0xB395, 0xB39F, 0x2A24, 0xB3A0, 0xB3A1, 0x0624, 0xB3A2, 0xB3A7, 0x2A2F, + 0xB3A8, 0xB3A8, 0x0626, 0xB3A9, 0xB3AB, 0x2A35, 0xB3AC, 0xB3AC, 0x0627, + 0xB3AD, 0xB3C3, 0x2A38, 0xB3C4, 0xB3C5, 0x0628, 0xB3C6, 0xB3C7, 0x2A4F, + 0xB3C8, 0xB3C8, 0x062A, 0xB3C9, 0xB3CA, 0x2A51, 0xB3CB, 0xB3CC, 0x062B, + 0xB3CD, 0xB3CD, 0x2A53, 0xB3CE, 0xB3CE, 0x062D, 0xB3CF, 0xB3CF, 0x2A54, + 0xB3D0, 0xB3D0, 0x062E, 0xB3D1, 0xB3D3, 0x2A55, 0xB3D4, 0xB3D5, 0x062F, + 0xB3D6, 0xB3D6, 0x2A58, 0xB3D7, 0xB3D7, 0x0631, 0xB3D8, 0xB3D8, 0x2A59, + 0xB3D9, 0xB3D9, 0x0632, 0xB3DA, 0xB3DA, 0x2A5A, 0xB3DB, 0xB3DB, 0x0633, + 0xB3DC, 0xB3DC, 0x2A5B, 0xB3DD, 0xB3DD, 0x0634, 0xB3DE, 0xB3DF, 0x2A5C, + 0xB3E0, 0xB3E0, 0x0635, 0xB3E1, 0xB3E3, 0x2A5E, 0xB3E4, 0xB3E4, 0x0636, + 0xB3E5, 0xB3E7, 0x2A61, 0xB3E8, 0xB3E8, 0x0637, 0xB3E9, 0xB3FB, 0x2A64, + 0xB3FC, 0xB3FC, 0x0638, 0xB3FD, 0xB3FF, 0x2A77, 0xB400, 0xB40F, 0x2A7A, + 0xB410, 0xB410, 0x0639, 0xB411, 0xB417, 0x2A8A, 0xB418, 0xB418, 0x063A, + 0xB419, 0xB41B, 0x2A91, 0xB41C, 0xB41C, 0x063B, 0xB41D, 0xB41F, 0x2A94, + 0xB420, 0xB420, 0x063C, 0xB421, 0xB427, 0x2A97, 0xB428, 0xB429, 0x063D, + 0xB42A, 0xB42A, 0x2A9E, 0xB42B, 0xB42B, 0x063F, 0xB42C, 0xB433, 0x2A9F, + 0xB434, 0xB434, 0x0640, 0xB435, 0xB44F, 0x2AA7, 0xB450, 0xB451, 0x0641, + 0xB452, 0xB453, 0x2AC2, 0xB454, 0xB454, 0x0643, 0xB455, 0xB457, 0x2AC4, + 0xB458, 0xB458, 0x0644, 0xB459, 0xB45F, 0x2AC7, 0xB460, 0xB461, 0x0645, + 0xB462, 0xB462, 0x2ACE, 0xB463, 0xB463, 0x0647, 0xB464, 0xB464, 0x2ACF, + 0xB465, 0xB465, 0x0648, 0xB466, 0xB46B, 0x2AD0, 0xB46C, 0xB46C, 0x0649, + 0xB46D, 0xB47F, 0x2AD6, 0xB480, 0xB480, 0x064A, 0xB481, 0xB487, 0x2AE9, + 0xB488, 0xB488, 0x064B, 0xB489, 0xB49C, 0x2AF0, 0xB49D, 0xB49D, 0x064C, + 0xB49E, 0xB4A3, 0x2B04, 0xB4A4, 0xB4A4, 0x064D, 0xB4A5, 0xB4A7, 0x2B0A, + 0xB4A8, 0xB4A8, 0x064E, 0xB4A9, 0xB4AB, 0x2B0D, 0xB4AC, 0xB4AC, 0x064F, + 0xB4AD, 0xB4B4, 0x2B10, 0xB4B5, 0xB4B5, 0x0650, 0xB4B6, 0xB4B6, 0x2B18, + 0xB4B7, 0xB4B7, 0x0651, 0xB4B8, 0xB4B8, 0x2B19, 0xB4B9, 0xB4B9, 0x0652, + 0xB4BA, 0xB4BF, 0x2B1A, 0xB4C0, 0xB4C0, 0x0653, 0xB4C1, 0xB4C3, 0x2B20, + 0xB4C4, 0xB4C4, 0x0654, 0xB4C5, 0xB4C7, 0x2B23, 0xB4C8, 0xB4C8, 0x0655, + 0xB4C9, 0xB4CF, 0x2B26, 0xB4D0, 0xB4D0, 0x0656, 0xB4D1, 0xB4D4, 0x2B2D, + 0xB4D5, 0xB4D5, 0x0657, 0xB4D6, 0xB4DB, 0x2B31, 0xB4DC, 0xB4DD, 0x0658, + 0xB4DE, 0xB4DF, 0x2B37, 0xB4E0, 0xB4E0, 0x065A, 0xB4E1, 0xB4E2, 0x2B39, + 0xB4E3, 0xB4E4, 0x065B, 0xB4E5, 0xB4E5, 0x2B3B, 0xB4E6, 0xB4E6, 0x065D, + 0xB4E7, 0xB4EB, 0x2B3C, 0xB4EC, 0xB4ED, 0x065E, 0xB4EE, 0xB4EE, 0x2B41, + 0xB4EF, 0xB4EF, 0x0660, 0xB4F0, 0xB4F0, 0x2B42, 0xB4F1, 0xB4F1, 0x0661, + 0xB4F2, 0xB4F7, 0x2B43, 0xB4F8, 0xB4F8, 0x0662, 0xB4F9, 0xB4FF, 0x2B49, + 0xB500, 0xB513, 0x2B50, 0xB514, 0xB515, 0x0663, 0xB516, 0xB517, 0x2B64, + 0xB518, 0xB518, 0x0665, 0xB519, 0xB51A, 0x2B66, 0xB51B, 0xB51C, 0x0666, + 0xB51D, 0xB523, 0x2B68, 0xB524, 0xB525, 0x0668, 0xB526, 0xB526, 0x2B6F, + 0xB527, 0xB52A, 0x066A, 0xB52B, 0xB52F, 0x2B70, 0xB530, 0xB531, 0x066E, + 0xB532, 0xB533, 0x2B75, 0xB534, 0xB534, 0x0670, 0xB535, 0xB537, 0x2B77, + 0xB538, 0xB538, 0x0671, 0xB539, 0xB53F, 0x2B7A, 0xB540, 0xB541, 0x0672, + 0xB542, 0xB542, 0x2B81, 0xB543, 0xB545, 0x0674, 0xB546, 0xB54A, 0x2B82, + 0xB54B, 0xB54D, 0x0677, 0xB54E, 0xB54F, 0x2B87, 0xB550, 0xB550, 0x067A, + 0xB551, 0xB553, 0x2B89, 0xB554, 0xB554, 0x067B, 0xB555, 0xB55B, 0x2B8C, + 0xB55C, 0xB55D, 0x067C, 0xB55E, 0xB55E, 0x2B93, 0xB55F, 0xB561, 0x067E, + 0xB562, 0xB59F, 0x2B94, 0xB5A0, 0xB5A1, 0x0681, 0xB5A2, 0xB5A3, 0x2BD2, + 0xB5A4, 0xB5A4, 0x0683, 0xB5A5, 0xB5A7, 0x2BD4, 0xB5A8, 0xB5A8, 0x0684, + 0xB5A9, 0xB5A9, 0x2BD7, 0xB5AA, 0xB5AB, 0x0685, 0xB5AC, 0xB5AF, 0x2BD8, + 0xB5B0, 0xB5B1, 0x0687, 0xB5B2, 0xB5B2, 0x2BDC, 0xB5B3, 0xB5B5, 0x0689, + 0xB5B6, 0xB5BA, 0x2BDD, 0xB5BB, 0xB5BD, 0x068C, 0xB5BE, 0xB5BF, 0x2BE2, + 0xB5C0, 0xB5C0, 0x068F, 0xB5C1, 0xB5C3, 0x2BE4, 0xB5C4, 0xB5C4, 0x0690, + 0xB5C5, 0xB5CB, 0x2BE7, 0xB5CC, 0xB5CD, 0x0691, 0xB5CE, 0xB5CE, 0x2BEE, + 0xB5CF, 0xB5D1, 0x0693, 0xB5D2, 0xB5D7, 0x2BEF, 0xB5D8, 0xB5D8, 0x0696, + 0xB5D9, 0xB5EB, 0x2BF5, 0xB5EC, 0xB5EC, 0x0697, 0xB5ED, 0xB5FF, 0x2C08, + 0xB600, 0xB60F, 0x2C1B, 0xB610, 0xB611, 0x0698, 0xB612, 0xB613, 0x2C2B, + 0xB614, 0xB614, 0x069A, 0xB615, 0xB617, 0x2C2D, 0xB618, 0xB618, 0x069B, + 0xB619, 0xB624, 0x2C30, 0xB625, 0xB625, 0x069C, 0xB626, 0xB62B, 0x2C3C, + 0xB62C, 0xB62C, 0x069D, 0xB62D, 0xB633, 0x2C42, 0xB634, 0xB634, 0x069E, + 0xB635, 0xB647, 0x2C49, 0xB648, 0xB648, 0x069F, 0xB649, 0xB663, 0x2C5C, + 0xB664, 0xB664, 0x06A0, 0xB665, 0xB667, 0x2C77, 0xB668, 0xB668, 0x06A1, + 0xB669, 0xB69B, 0x2C7A, 0xB69C, 0xB69D, 0x06A2, 0xB69E, 0xB69F, 0x2CAD, + 0xB6A0, 0xB6A0, 0x06A4, 0xB6A1, 0xB6A3, 0x2CAF, 0xB6A4, 0xB6A4, 0x06A5, + 0xB6A5, 0xB6AA, 0x2CB2, 0xB6AB, 0xB6AC, 0x06A6, 0xB6AD, 0xB6B0, 0x2CB8, + 0xB6B1, 0xB6B1, 0x06A8, 0xB6B2, 0xB6D3, 0x2CBC, 0xB6D4, 0xB6D4, 0x06A9, + 0xB6D5, 0xB6EF, 0x2CDE, 0xB6F0, 0xB6F0, 0x06AA, 0xB6F1, 0xB6F3, 0x2CF9, + 0xB6F4, 0xB6F4, 0x06AB, 0xB6F5, 0xB6F7, 0x2CFC, 0xB6F8, 0xB6F8, 0x06AC, + 0xB6F9, 0xB6FF, 0x2CFF, 0xB700, 0xB701, 0x06AD, 0xB702, 0xB704, 0x2D06, + 0xB705, 0xB705, 0x06AF, 0xB706, 0xB727, 0x2D09, 0xB728, 0xB729, 0x06B0, + 0xB72A, 0xB72B, 0x2D2B, 0xB72C, 0xB72C, 0x06B2, 0xB72D, 0xB72E, 0x2D2D, + 0xB72F, 0xB730, 0x06B3, 0xB731, 0xB737, 0x2D2F, 0xB738, 0xB739, 0x06B5, + 0xB73A, 0xB73A, 0x2D36, 0xB73B, 0xB73B, 0x06B7, 0xB73C, 0xB743, 0x2D37, + 0xB744, 0xB744, 0x06B8, 0xB745, 0xB747, 0x2D3F, 0xB748, 0xB748, 0x06B9, + 0xB749, 0xB74B, 0x2D42, 0xB74C, 0xB74C, 0x06BA, 0xB74D, 0xB753, 0x2D45, + 0xB754, 0xB755, 0x06BB, 0xB756, 0xB75F, 0x2D4C, 0xB760, 0xB760, 0x06BD, + 0xB761, 0xB763, 0x2D56, 0xB764, 0xB764, 0x06BE, 0xB765, 0xB767, 0x2D59, + 0xB768, 0xB768, 0x06BF, 0xB769, 0xB76F, 0x2D5C, 0xB770, 0xB771, 0x06C0, + 0xB772, 0xB772, 0x2D63, 0xB773, 0xB773, 0x06C2, 0xB774, 0xB774, 0x2D64, + 0xB775, 0xB775, 0x06C3, 0xB776, 0xB77B, 0x2D65, 0xB77C, 0xB77D, 0x06C4, + 0xB77E, 0xB77F, 0x2D6B, 0xB780, 0xB780, 0x06C6, 0xB781, 0xB783, 0x2D6D, + 0xB784, 0xB784, 0x06C7, 0xB785, 0xB78B, 0x2D70, 0xB78C, 0xB78D, 0x06C8, + 0xB78E, 0xB78E, 0x2D77, 0xB78F, 0xB792, 0x06CA, 0xB793, 0xB795, 0x2D78, + 0xB796, 0xB799, 0x06CE, 0xB79A, 0xB79B, 0x2D7B, 0xB79C, 0xB79C, 0x06D2, + 0xB79D, 0xB79F, 0x2D7D, 0xB7A0, 0xB7A0, 0x06D3, 0xB7A1, 0xB7A7, 0x2D80, + 0xB7A8, 0xB7A9, 0x06D4, 0xB7AA, 0xB7AA, 0x2D87, 0xB7AB, 0xB7AD, 0x06D6, + 0xB7AE, 0xB7B3, 0x2D88, 0xB7B4, 0xB7B5, 0x06D9, 0xB7B6, 0xB7B7, 0x2D8E, + 0xB7B8, 0xB7B8, 0x06DB, 0xB7B9, 0xB7C6, 0x2D90, 0xB7C7, 0xB7C7, 0x06DC, + 0xB7C8, 0xB7C8, 0x2D9E, 0xB7C9, 0xB7C9, 0x06DD, 0xB7CA, 0xB7EB, 0x2D9F, + 0xB7EC, 0xB7ED, 0x06DE, 0xB7EE, 0xB7EF, 0x2DC1, 0xB7F0, 0xB7F0, 0x06E0, + 0xB7F1, 0xB7F3, 0x2DC3, 0xB7F4, 0xB7F4, 0x06E1, 0xB7F5, 0xB7FB, 0x2DC6, + 0xB7FC, 0xB7FD, 0x06E2, 0xB7FE, 0xB7FE, 0x2DCD, 0xB7FF, 0xB7FF, 0x06E4, + 0xB800, 0xB801, 0x06E5, 0xB802, 0xB806, 0x2DCE, 0xB807, 0xB809, 0x06E7, + 0xB80A, 0xB80B, 0x2DD3, 0xB80C, 0xB80C, 0x06EA, 0xB80D, 0xB80F, 0x2DD5, + 0xB810, 0xB810, 0x06EB, 0xB811, 0xB817, 0x2DD8, 0xB818, 0xB819, 0x06EC, + 0xB81A, 0xB81A, 0x2DDF, 0xB81B, 0xB81B, 0x06EE, 0xB81C, 0xB81C, 0x2DE0, + 0xB81D, 0xB81D, 0x06EF, 0xB81E, 0xB823, 0x2DE1, 0xB824, 0xB825, 0x06F0, + 0xB826, 0xB827, 0x2DE7, 0xB828, 0xB828, 0x06F2, 0xB829, 0xB82B, 0x2DE9, + 0xB82C, 0xB82C, 0x06F3, 0xB82D, 0xB833, 0x2DEC, 0xB834, 0xB835, 0x06F4, + 0xB836, 0xB836, 0x2DF3, 0xB837, 0xB839, 0x06F6, 0xB83A, 0xB83F, 0x2DF4, + 0xB840, 0xB840, 0x06F9, 0xB841, 0xB843, 0x2DFA, 0xB844, 0xB844, 0x06FA, + 0xB845, 0xB850, 0x2DFD, 0xB851, 0xB851, 0x06FB, 0xB852, 0xB852, 0x2E09, + 0xB853, 0xB853, 0x06FC, 0xB854, 0xB85B, 0x2E0A, 0xB85C, 0xB85D, 0x06FD, + 0xB85E, 0xB85F, 0x2E12, 0xB860, 0xB860, 0x06FF, 0xB861, 0xB863, 0x2E14, + 0xB864, 0xB864, 0x0700, 0xB865, 0xB86B, 0x2E17, 0xB86C, 0xB86D, 0x0701, + 0xB86E, 0xB86E, 0x2E1E, 0xB86F, 0xB86F, 0x0703, 0xB870, 0xB870, 0x2E1F, + 0xB871, 0xB871, 0x0704, 0xB872, 0xB877, 0x2E20, 0xB878, 0xB878, 0x0705, + 0xB879, 0xB87B, 0x2E26, 0xB87C, 0xB87C, 0x0706, 0xB87D, 0xB88C, 0x2E29, + 0xB88D, 0xB88D, 0x0707, 0xB88E, 0xB8A7, 0x2E39, 0xB8A8, 0xB8A8, 0x0708, + 0xB8A9, 0xB8AF, 0x2E53, 0xB8B0, 0xB8B0, 0x0709, 0xB8B1, 0xB8B3, 0x2E5A, + 0xB8B4, 0xB8B4, 0x070A, 0xB8B5, 0xB8B7, 0x2E5D, 0xB8B8, 0xB8B8, 0x070B, + 0xB8B9, 0xB8BF, 0x2E60, 0xB8C0, 0xB8C1, 0x070C, 0xB8C2, 0xB8C2, 0x2E67, + 0xB8C3, 0xB8C3, 0x070E, 0xB8C4, 0xB8C4, 0x2E68, 0xB8C5, 0xB8C5, 0x070F, + 0xB8C6, 0xB8CB, 0x2E69, 0xB8CC, 0xB8CC, 0x0710, 0xB8CD, 0xB8CF, 0x2E6F, + 0xB8D0, 0xB8D0, 0x0711, 0xB8D1, 0xB8D3, 0x2E72, 0xB8D4, 0xB8D4, 0x0712, + 0xB8D5, 0xB8DC, 0x2E75, 0xB8DD, 0xB8DD, 0x0713, 0xB8DE, 0xB8DE, 0x2E7D, + 0xB8DF, 0xB8DF, 0x0714, 0xB8E0, 0xB8E0, 0x2E7E, 0xB8E1, 0xB8E1, 0x0715, + 0xB8E2, 0xB8E7, 0x2E7F, 0xB8E8, 0xB8E9, 0x0716, 0xB8EA, 0xB8EB, 0x2E85, + 0xB8EC, 0xB8EC, 0x0718, 0xB8ED, 0xB8EF, 0x2E87, 0xB8F0, 0xB8F0, 0x0719, + 0xB8F1, 0xB8F7, 0x2E8A, 0xB8F8, 0xB8F9, 0x071A, 0xB8FA, 0xB8FA, 0x2E91, + 0xB8FB, 0xB8FB, 0x071C, 0xB8FC, 0xB8FC, 0x2E92, 0xB8FD, 0xB8FD, 0x071D, + 0xB8FE, 0xB8FF, 0x2E93, 0xB900, 0xB903, 0x2E95, 0xB904, 0xB904, 0x071E, + 0xB905, 0xB917, 0x2E99, 0xB918, 0xB918, 0x071F, 0xB919, 0xB91F, 0x2EAC, + 0xB920, 0xB920, 0x0720, 0xB921, 0xB93B, 0x2EB3, 0xB93C, 0xB93D, 0x0721, + 0xB93E, 0xB93F, 0x2ECE, 0xB940, 0xB940, 0x0723, 0xB941, 0xB943, 0x2ED0, + 0xB944, 0xB944, 0x0724, 0xB945, 0xB94B, 0x2ED3, 0xB94C, 0xB94C, 0x0725, + 0xB94D, 0xB94E, 0x2EDA, 0xB94F, 0xB94F, 0x0726, 0xB950, 0xB950, 0x2EDC, + 0xB951, 0xB951, 0x0727, 0xB952, 0xB957, 0x2EDD, 0xB958, 0xB959, 0x0728, + 0xB95A, 0xB95B, 0x2EE3, 0xB95C, 0xB95C, 0x072A, 0xB95D, 0xB95F, 0x2EE5, + 0xB960, 0xB960, 0x072B, 0xB961, 0xB967, 0x2EE8, 0xB968, 0xB969, 0x072C, + 0xB96A, 0xB96A, 0x2EEF, 0xB96B, 0xB96B, 0x072E, 0xB96C, 0xB96C, 0x2EF0, + 0xB96D, 0xB96D, 0x072F, 0xB96E, 0xB973, 0x2EF1, 0xB974, 0xB975, 0x0730, + 0xB976, 0xB977, 0x2EF7, 0xB978, 0xB978, 0x0732, 0xB979, 0xB97B, 0x2EF9, + 0xB97C, 0xB97C, 0x0733, 0xB97D, 0xB983, 0x2EFC, 0xB984, 0xB985, 0x0734, + 0xB986, 0xB986, 0x2F03, 0xB987, 0xB987, 0x0736, 0xB988, 0xB988, 0x2F04, + 0xB989, 0xB98A, 0x0737, 0xB98B, 0xB98C, 0x2F05, 0xB98D, 0xB98E, 0x0739, + 0xB98F, 0xB9AB, 0x2F07, 0xB9AC, 0xB9AD, 0x073B, 0xB9AE, 0xB9AF, 0x2F24, + 0xB9B0, 0xB9B0, 0x073D, 0xB9B1, 0xB9B3, 0x2F26, 0xB9B4, 0xB9B4, 0x073E, + 0xB9B5, 0xB9BB, 0x2F29, 0xB9BC, 0xB9BD, 0x073F, 0xB9BE, 0xB9BE, 0x2F30, + 0xB9BF, 0xB9BF, 0x0741, 0xB9C0, 0xB9C0, 0x2F31, 0xB9C1, 0xB9C1, 0x0742, + 0xB9C2, 0xB9C7, 0x2F32, 0xB9C8, 0xB9C9, 0x0743, 0xB9CA, 0xB9CB, 0x2F38, + 0xB9CC, 0xB9CC, 0x0745, 0xB9CD, 0xB9CD, 0x2F3A, 0xB9CE, 0xB9D2, 0x0746, + 0xB9D3, 0xB9D7, 0x2F3B, 0xB9D8, 0xB9D9, 0x074B, 0xB9DA, 0xB9DA, 0x2F40, + 0xB9DB, 0xB9DB, 0x074D, 0xB9DC, 0xB9DC, 0x2F41, 0xB9DD, 0xB9DE, 0x074E, + 0xB9DF, 0xB9E0, 0x2F42, 0xB9E1, 0xB9E1, 0x0750, 0xB9E2, 0xB9E2, 0x2F44, + 0xB9E3, 0xB9E5, 0x0751, 0xB9E6, 0xB9E7, 0x2F45, 0xB9E8, 0xB9E8, 0x0754, + 0xB9E9, 0xB9EB, 0x2F47, 0xB9EC, 0xB9EC, 0x0755, 0xB9ED, 0xB9F3, 0x2F4A, + 0xB9F4, 0xB9F5, 0x0756, 0xB9F6, 0xB9F6, 0x2F51, 0xB9F7, 0xB9FA, 0x0758, + 0xB9FB, 0xB9FF, 0x2F52, 0xBA00, 0xBA01, 0x075C, 0xBA02, 0xBA07, 0x2F57, + 0xBA08, 0xBA08, 0x075E, 0xBA09, 0xBA14, 0x2F5D, 0xBA15, 0xBA15, 0x075F, + 0xBA16, 0xBA37, 0x2F69, 0xBA38, 0xBA39, 0x0760, 0xBA3A, 0xBA3B, 0x2F8B, + 0xBA3C, 0xBA3C, 0x0762, 0xBA3D, 0xBA3F, 0x2F8D, 0xBA40, 0xBA40, 0x0763, + 0xBA41, 0xBA41, 0x2F90, 0xBA42, 0xBA42, 0x0764, 0xBA43, 0xBA47, 0x2F91, + 0xBA48, 0xBA49, 0x0765, 0xBA4A, 0xBA4A, 0x2F96, 0xBA4B, 0xBA4B, 0x0767, + 0xBA4C, 0xBA4C, 0x2F97, 0xBA4D, 0xBA4E, 0x0768, 0xBA4F, 0xBA52, 0x2F98, + 0xBA53, 0xBA55, 0x076A, 0xBA56, 0xBA57, 0x2F9C, 0xBA58, 0xBA58, 0x076D, + 0xBA59, 0xBA5B, 0x2F9E, 0xBA5C, 0xBA5C, 0x076E, 0xBA5D, 0xBA63, 0x2FA1, + 0xBA64, 0xBA65, 0x076F, 0xBA66, 0xBA66, 0x2FA8, 0xBA67, 0xBA69, 0x0771, + 0xBA6A, 0xBA6F, 0x2FA9, 0xBA70, 0xBA71, 0x0774, 0xBA72, 0xBA73, 0x2FAF, + 0xBA74, 0xBA74, 0x0776, 0xBA75, 0xBA77, 0x2FB1, 0xBA78, 0xBA78, 0x0777, + 0xBA79, 0xBA82, 0x2FB4, 0xBA83, 0xBA85, 0x0778, 0xBA86, 0xBA86, 0x2FBE, + 0xBA87, 0xBA87, 0x077B, 0xBA88, 0xBA8B, 0x2FBF, 0xBA8C, 0xBA8C, 0x077C, + 0xBA8D, 0xBAA7, 0x2FC3, 0xBAA8, 0xBAA9, 0x077D, 0xBAAA, 0xBAAA, 0x2FDE, + 0xBAAB, 0xBAAC, 0x077F, 0xBAAD, 0xBAAF, 0x2FDF, 0xBAB0, 0xBAB0, 0x0781, + 0xBAB1, 0xBAB1, 0x2FE2, 0xBAB2, 0xBAB2, 0x0782, 0xBAB3, 0xBAB7, 0x2FE3, + 0xBAB8, 0xBAB9, 0x0783, 0xBABA, 0xBABA, 0x2FE8, 0xBABB, 0xBABB, 0x0785, + 0xBABC, 0xBABC, 0x2FE9, 0xBABD, 0xBABD, 0x0786, 0xBABE, 0xBAC3, 0x2FEA, + 0xBAC4, 0xBAC4, 0x0787, 0xBAC5, 0xBAC7, 0x2FF0, 0xBAC8, 0xBAC8, 0x0788, + 0xBAC9, 0xBAD7, 0x2FF3, 0xBAD8, 0xBAD9, 0x0789, 0xBADA, 0xBAFB, 0x3002, + 0xBAFC, 0xBAFC, 0x078B, 0xBAFD, 0xBAFF, 0x3024, 0xBB00, 0xBB00, 0x078C, + 0xBB01, 0xBB03, 0x3027, 0xBB04, 0xBB04, 0x078D, 0xBB05, 0xBB0C, 0x302A, + 0xBB0D, 0xBB0D, 0x078E, 0xBB0E, 0xBB0E, 0x3032, 0xBB0F, 0xBB0F, 0x078F, + 0xBB10, 0xBB10, 0x3033, 0xBB11, 0xBB11, 0x0790, 0xBB12, 0xBB17, 0x3034, + 0xBB18, 0xBB18, 0x0791, 0xBB19, 0xBB1B, 0x303A, 0xBB1C, 0xBB1C, 0x0792, + 0xBB1D, 0xBB1F, 0x303D, 0xBB20, 0xBB20, 0x0793, 0xBB21, 0xBB28, 0x3040, + 0xBB29, 0xBB29, 0x0794, 0xBB2A, 0xBB2A, 0x3048, 0xBB2B, 0xBB2B, 0x0795, + 0xBB2C, 0xBB33, 0x3049, 0xBB34, 0xBB36, 0x0796, 0xBB37, 0xBB37, 0x3051, + 0xBB38, 0xBB38, 0x0799, 0xBB39, 0xBB3A, 0x3052, 0xBB3B, 0xBB3E, 0x079A, + 0xBB3F, 0xBB43, 0x3054, 0xBB44, 0xBB45, 0x079E, 0xBB46, 0xBB46, 0x3059, + 0xBB47, 0xBB47, 0x07A0, 0xBB48, 0xBB48, 0x305A, 0xBB49, 0xBB49, 0x07A1, + 0xBB4A, 0xBB4C, 0x305B, 0xBB4D, 0xBB4D, 0x07A2, 0xBB4E, 0xBB4E, 0x305E, + 0xBB4F, 0xBB50, 0x07A3, 0xBB51, 0xBB53, 0x305F, 0xBB54, 0xBB54, 0x07A5, + 0xBB55, 0xBB57, 0x3062, 0xBB58, 0xBB58, 0x07A6, 0xBB59, 0xBB60, 0x3065, + 0xBB61, 0xBB61, 0x07A7, 0xBB62, 0xBB62, 0x306D, 0xBB63, 0xBB63, 0x07A8, + 0xBB64, 0xBB6B, 0x306E, 0xBB6C, 0xBB6C, 0x07A9, 0xBB6D, 0xBB87, 0x3076, + 0xBB88, 0xBB88, 0x07AA, 0xBB89, 0xBB8B, 0x3091, 0xBB8C, 0xBB8C, 0x07AB, + 0xBB8D, 0xBB8F, 0x3094, 0xBB90, 0xBB90, 0x07AC, 0xBB91, 0xBBA3, 0x3097, + 0xBBA4, 0xBBA4, 0x07AD, 0xBBA5, 0xBBA7, 0x30AA, 0xBBA8, 0xBBA8, 0x07AE, + 0xBBA9, 0xBBAB, 0x30AD, 0xBBAC, 0xBBAC, 0x07AF, 0xBBAD, 0xBBB3, 0x30B0, + 0xBBB4, 0xBBB4, 0x07B0, 0xBBB5, 0xBBB6, 0x30B7, 0xBBB7, 0xBBB7, 0x07B1, + 0xBBB8, 0xBBBF, 0x30B9, 0xBBC0, 0xBBC0, 0x07B2, 0xBBC1, 0xBBC3, 0x30C1, + 0xBBC4, 0xBBC4, 0x07B3, 0xBBC5, 0xBBC7, 0x30C4, 0xBBC8, 0xBBC8, 0x07B4, + 0xBBC9, 0xBBCF, 0x30C7, 0xBBD0, 0xBBD0, 0x07B5, 0xBBD1, 0xBBD2, 0x30CE, + 0xBBD3, 0xBBD3, 0x07B6, 0xBBD4, 0xBBF7, 0x30D0, 0xBBF8, 0xBBF9, 0x07B7, + 0xBBFA, 0xBBFB, 0x30F4, 0xBBFC, 0xBBFC, 0x07B9, 0xBBFD, 0xBBFE, 0x30F6, + 0xBBFF, 0xBBFF, 0x07BA, 0xBC00, 0xBC00, 0x07BB, 0xBC01, 0xBC01, 0x30F8, + 0xBC02, 0xBC02, 0x07BC, 0xBC03, 0xBC07, 0x30F9, 0xBC08, 0xBC09, 0x07BD, + 0xBC0A, 0xBC0A, 0x30FE, 0xBC0B, 0xBC0D, 0x07BF, 0xBC0E, 0xBC0E, 0x30FF, + 0xBC0F, 0xBC0F, 0x07C2, 0xBC10, 0xBC10, 0x3100, 0xBC11, 0xBC11, 0x07C3, + 0xBC12, 0xBC13, 0x3101, 0xBC14, 0xBC18, 0x07C4, 0xBC19, 0xBC1A, 0x3103, + 0xBC1B, 0xBC1F, 0x07C9, 0xBC20, 0xBC23, 0x3105, 0xBC24, 0xBC25, 0x07CE, + 0xBC26, 0xBC26, 0x3109, 0xBC27, 0xBC27, 0x07D0, 0xBC28, 0xBC28, 0x310A, + 0xBC29, 0xBC29, 0x07D1, 0xBC2A, 0xBC2C, 0x310B, 0xBC2D, 0xBC2D, 0x07D2, + 0xBC2E, 0xBC2F, 0x310E, 0xBC30, 0xBC31, 0x07D3, 0xBC32, 0xBC33, 0x3110, + 0xBC34, 0xBC34, 0x07D5, 0xBC35, 0xBC37, 0x3112, 0xBC38, 0xBC38, 0x07D6, + 0xBC39, 0xBC3F, 0x3115, 0xBC40, 0xBC41, 0x07D7, 0xBC42, 0xBC42, 0x311C, + 0xBC43, 0xBC45, 0x07D9, 0xBC46, 0xBC48, 0x311D, 0xBC49, 0xBC49, 0x07DC, + 0xBC4A, 0xBC4B, 0x3120, 0xBC4C, 0xBC4D, 0x07DD, 0xBC4E, 0xBC4F, 0x3122, + 0xBC50, 0xBC50, 0x07DF, 0xBC51, 0xBC5C, 0x3124, 0xBC5D, 0xBC5D, 0x07E0, + 0xBC5E, 0xBC83, 0x3130, 0xBC84, 0xBC85, 0x07E1, 0xBC86, 0xBC87, 0x3156, + 0xBC88, 0xBC88, 0x07E3, 0xBC89, 0xBC8A, 0x3158, 0xBC8B, 0xBC8C, 0x07E4, + 0xBC8D, 0xBC8D, 0x315A, 0xBC8E, 0xBC8E, 0x07E6, 0xBC8F, 0xBC93, 0x315B, + 0xBC94, 0xBC95, 0x07E7, 0xBC96, 0xBC96, 0x3160, 0xBC97, 0xBC97, 0x07E9, + 0xBC98, 0xBC98, 0x3161, 0xBC99, 0xBC9A, 0x07EA, 0xBC9B, 0xBC9F, 0x3162, + 0xBCA0, 0xBCA1, 0x07EC, 0xBCA2, 0xBCA3, 0x3167, 0xBCA4, 0xBCA4, 0x07EE, + 0xBCA5, 0xBCA6, 0x3169, 0xBCA7, 0xBCA8, 0x07EF, 0xBCA9, 0xBCAF, 0x316B, + 0xBCB0, 0xBCB1, 0x07F1, 0xBCB2, 0xBCB2, 0x3172, 0xBCB3, 0xBCB5, 0x07F3, + 0xBCB6, 0xBCBB, 0x3173, 0xBCBC, 0xBCBD, 0x07F6, 0xBCBE, 0xBCBF, 0x3179, + 0xBCC0, 0xBCC0, 0x07F8, 0xBCC1, 0xBCC3, 0x317B, 0xBCC4, 0xBCC4, 0x07F9, + 0xBCC5, 0xBCCC, 0x317E, 0xBCCD, 0xBCCD, 0x07FA, 0xBCCE, 0xBCCE, 0x3186, + 0xBCCF, 0xBCD1, 0x07FB, 0xBCD2, 0xBCD4, 0x3187, 0xBCD5, 0xBCD5, 0x07FE, + 0xBCD6, 0xBCD7, 0x318A, 0xBCD8, 0xBCD8, 0x07FF, 0xBCD9, 0xBCDB, 0x318C, + 0xBCDC, 0xBCDC, 0x0800, 0xBCDD, 0xBCF3, 0x318F, 0xBCF4, 0xBCF6, 0x0801, + 0xBCF7, 0xBCF7, 0x31A6, 0xBCF8, 0xBCF8, 0x0804, 0xBCF9, 0xBCFB, 0x31A7, + 0xBCFC, 0xBCFC, 0x0805, 0xBCFD, 0xBCFF, 0x31AA, 0xBD00, 0xBD03, 0x31AD, + 0xBD04, 0xBD05, 0x0806, 0xBD06, 0xBD06, 0x31B1, 0xBD07, 0xBD07, 0x0808, + 0xBD08, 0xBD08, 0x31B2, 0xBD09, 0xBD09, 0x0809, 0xBD0A, 0xBD0F, 0x31B3, + 0xBD10, 0xBD10, 0x080A, 0xBD11, 0xBD13, 0x31B9, 0xBD14, 0xBD14, 0x080B, + 0xBD15, 0xBD23, 0x31BC, 0xBD24, 0xBD24, 0x080C, 0xBD25, 0xBD2B, 0x31CB, + 0xBD2C, 0xBD2C, 0x080D, 0xBD2D, 0xBD3F, 0x31D2, 0xBD40, 0xBD40, 0x080E, + 0xBD41, 0xBD47, 0x31E5, 0xBD48, 0xBD49, 0x080F, 0xBD4A, 0xBD4B, 0x31EC, + 0xBD4C, 0xBD4C, 0x0811, 0xBD4D, 0xBD4F, 0x31EE, 0xBD50, 0xBD50, 0x0812, + 0xBD51, 0xBD57, 0x31F1, 0xBD58, 0xBD59, 0x0813, 0xBD5A, 0xBD63, 0x31F8, + 0xBD64, 0xBD64, 0x0815, 0xBD65, 0xBD67, 0x3202, 0xBD68, 0xBD68, 0x0816, + 0xBD69, 0xBD7F, 0x3205, 0xBD80, 0xBD81, 0x0817, 0xBD82, 0xBD83, 0x321C, + 0xBD84, 0xBD84, 0x0819, 0xBD85, 0xBD86, 0x321E, 0xBD87, 0xBD8A, 0x081A, + 0xBD8B, 0xBD8F, 0x3220, 0xBD90, 0xBD91, 0x081E, 0xBD92, 0xBD92, 0x3225, + 0xBD93, 0xBD93, 0x0820, 0xBD94, 0xBD94, 0x3226, 0xBD95, 0xBD95, 0x0821, + 0xBD96, 0xBD98, 0x3227, 0xBD99, 0xBD9A, 0x0822, 0xBD9B, 0xBD9B, 0x322A, + 0xBD9C, 0xBD9C, 0x0824, 0xBD9D, 0xBDA3, 0x322B, 0xBDA4, 0xBDA4, 0x0825, + 0xBDA5, 0xBDAF, 0x3232, 0xBDB0, 0xBDB0, 0x0826, 0xBDB1, 0xBDB7, 0x323D, + 0xBDB8, 0xBDB8, 0x0827, 0xBDB9, 0xBDD3, 0x3244, 0xBDD4, 0xBDD5, 0x0828, + 0xBDD6, 0xBDD7, 0x325F, 0xBDD8, 0xBDD8, 0x082A, 0xBDD9, 0xBDDB, 0x3261, + 0xBDDC, 0xBDDC, 0x082B, 0xBDDD, 0xBDE8, 0x3264, 0xBDE9, 0xBDE9, 0x082C, + 0xBDEA, 0xBDEF, 0x3270, 0xBDF0, 0xBDF0, 0x082D, 0xBDF1, 0xBDF3, 0x3276, + 0xBDF4, 0xBDF4, 0x082E, 0xBDF5, 0xBDF7, 0x3279, 0xBDF8, 0xBDF8, 0x082F, + 0xBDF9, 0xBDFF, 0x327C, 0xBE00, 0xBE00, 0x0830, 0xBE01, 0xBE02, 0x3283, + 0xBE03, 0xBE03, 0x0831, 0xBE04, 0xBE04, 0x3285, 0xBE05, 0xBE05, 0x0832, + 0xBE06, 0xBE0B, 0x3286, 0xBE0C, 0xBE0D, 0x0833, 0xBE0E, 0xBE0F, 0x328C, + 0xBE10, 0xBE10, 0x0835, 0xBE11, 0xBE13, 0x328E, 0xBE14, 0xBE14, 0x0836, + 0xBE15, 0xBE1B, 0x3291, 0xBE1C, 0xBE1D, 0x0837, 0xBE1E, 0xBE1E, 0x3298, + 0xBE1F, 0xBE1F, 0x0839, 0xBE20, 0xBE43, 0x3299, 0xBE44, 0xBE45, 0x083A, + 0xBE46, 0xBE47, 0x32BD, 0xBE48, 0xBE48, 0x083C, 0xBE49, 0xBE4B, 0x32BF, + 0xBE4C, 0xBE4C, 0x083D, 0xBE4D, 0xBE4D, 0x32C2, 0xBE4E, 0xBE4E, 0x083E, + 0xBE4F, 0xBE53, 0x32C3, 0xBE54, 0xBE55, 0x083F, 0xBE56, 0xBE56, 0x32C8, + 0xBE57, 0xBE57, 0x0841, 0xBE58, 0xBE58, 0x32C9, 0xBE59, 0xBE5B, 0x0842, + 0xBE5C, 0xBE5F, 0x32CA, 0xBE60, 0xBE61, 0x0845, 0xBE62, 0xBE63, 0x32CE, + 0xBE64, 0xBE64, 0x0847, 0xBE65, 0xBE67, 0x32D0, 0xBE68, 0xBE68, 0x0848, + 0xBE69, 0xBE69, 0x32D3, 0xBE6A, 0xBE6A, 0x0849, 0xBE6B, 0xBE6F, 0x32D4, + 0xBE70, 0xBE71, 0x084A, 0xBE72, 0xBE72, 0x32D9, 0xBE73, 0xBE75, 0x084C, + 0xBE76, 0xBE7A, 0x32DA, 0xBE7B, 0xBE7D, 0x084F, 0xBE7E, 0xBE7F, 0x32DF, + 0xBE80, 0xBE80, 0x0852, 0xBE81, 0xBE83, 0x32E1, 0xBE84, 0xBE84, 0x0853, + 0xBE85, 0xBE8B, 0x32E4, 0xBE8C, 0xBE8D, 0x0854, 0xBE8E, 0xBE8E, 0x32EB, + 0xBE8F, 0xBE91, 0x0856, 0xBE92, 0xBE97, 0x32EC, 0xBE98, 0xBE99, 0x0859, + 0xBE9A, 0xBEA7, 0x32F2, 0xBEA8, 0xBEA8, 0x085B, 0xBEA9, 0xBECF, 0x3300, + 0xBED0, 0xBED1, 0x085C, 0xBED2, 0xBED3, 0x3327, 0xBED4, 0xBED4, 0x085E, + 0xBED5, 0xBED6, 0x3329, 0xBED7, 0xBED8, 0x085F, 0xBED9, 0xBEDF, 0x332B, + 0xBEE0, 0xBEE0, 0x0861, 0xBEE1, 0xBEE2, 0x3332, 0xBEE3, 0xBEE5, 0x0862, + 0xBEE6, 0xBEEB, 0x3334, 0xBEEC, 0xBEEC, 0x0865, 0xBEED, 0xBEFF, 0x333A, + 0xBF00, 0xBF00, 0x334D, 0xBF01, 0xBF01, 0x0866, 0xBF02, 0xBF07, 0x334E, + 0xBF08, 0xBF09, 0x0867, 0xBF0A, 0xBF17, 0x3354, 0xBF18, 0xBF19, 0x0869, + 0xBF1A, 0xBF1A, 0x3362, 0xBF1B, 0xBF1D, 0x086B, 0xBF1E, 0xBF3F, 0x3363, + 0xBF40, 0xBF41, 0x086E, 0xBF42, 0xBF43, 0x3385, 0xBF44, 0xBF44, 0x0870, + 0xBF45, 0xBF47, 0x3387, 0xBF48, 0xBF48, 0x0871, 0xBF49, 0xBF4F, 0x338A, + 0xBF50, 0xBF51, 0x0872, 0xBF52, 0xBF54, 0x3391, 0xBF55, 0xBF55, 0x0874, + 0xBF56, 0xBF93, 0x3394, 0xBF94, 0xBF94, 0x0875, 0xBF95, 0xBFAF, 0x33D2, + 0xBFB0, 0xBFB0, 0x0876, 0xBFB1, 0xBFC4, 0x33ED, 0xBFC5, 0xBFC5, 0x0877, + 0xBFC6, 0xBFCB, 0x3401, 0xBFCC, 0xBFCD, 0x0878, 0xBFCE, 0xBFCF, 0x3407, + 0xBFD0, 0xBFD0, 0x087A, 0xBFD1, 0xBFD3, 0x3409, 0xBFD4, 0xBFD4, 0x087B, + 0xBFD5, 0xBFDB, 0x340C, 0xBFDC, 0xBFDC, 0x087C, 0xBFDD, 0xBFDE, 0x3413, + 0xBFDF, 0xBFDF, 0x087D, 0xBFE0, 0xBFE0, 0x3415, 0xBFE1, 0xBFE1, 0x087E, + 0xBFE2, 0xBFFF, 0x3416, 0xC000, 0xC03B, 0x3434, 0xC03C, 0xC03C, 0x087F, + 0xC03D, 0xC050, 0x3470, 0xC051, 0xC051, 0x0880, 0xC052, 0xC057, 0x3484, + 0xC058, 0xC058, 0x0881, 0xC059, 0xC05B, 0x348A, 0xC05C, 0xC05C, 0x0882, + 0xC05D, 0xC05F, 0x348D, 0xC060, 0xC060, 0x0883, 0xC061, 0xC067, 0x3490, + 0xC068, 0xC069, 0x0884, 0xC06A, 0xC08F, 0x3497, 0xC090, 0xC091, 0x0886, + 0xC092, 0xC093, 0x34BD, 0xC094, 0xC094, 0x0888, 0xC095, 0xC097, 0x34BF, + 0xC098, 0xC098, 0x0889, 0xC099, 0xC09F, 0x34C2, 0xC0A0, 0xC0A1, 0x088A, + 0xC0A2, 0xC0A2, 0x34C9, 0xC0A3, 0xC0A3, 0x088C, 0xC0A4, 0xC0A4, 0x34CA, + 0xC0A5, 0xC0A5, 0x088D, 0xC0A6, 0xC0AB, 0x34CB, 0xC0AC, 0xC0AD, 0x088E, + 0xC0AE, 0xC0AE, 0x34D1, 0xC0AF, 0xC0B0, 0x0890, 0xC0B1, 0xC0B2, 0x34D2, + 0xC0B3, 0xC0B6, 0x0892, 0xC0B7, 0xC0BB, 0x34D4, 0xC0BC, 0xC0BD, 0x0896, + 0xC0BE, 0xC0BE, 0x34D9, 0xC0BF, 0xC0C1, 0x0898, 0xC0C2, 0xC0C4, 0x34DA, + 0xC0C5, 0xC0C5, 0x089B, 0xC0C6, 0xC0C7, 0x34DD, 0xC0C8, 0xC0C9, 0x089C, + 0xC0CA, 0xC0CB, 0x34DF, 0xC0CC, 0xC0CC, 0x089E, 0xC0CD, 0xC0CF, 0x34E1, + 0xC0D0, 0xC0D0, 0x089F, 0xC0D1, 0xC0D7, 0x34E4, 0xC0D8, 0xC0D9, 0x08A0, + 0xC0DA, 0xC0DA, 0x34EB, 0xC0DB, 0xC0DD, 0x08A2, 0xC0DE, 0xC0E3, 0x34EC, + 0xC0E4, 0xC0E5, 0x08A5, 0xC0E6, 0xC0E7, 0x34F2, 0xC0E8, 0xC0E8, 0x08A7, + 0xC0E9, 0xC0EB, 0x34F4, 0xC0EC, 0xC0EC, 0x08A8, 0xC0ED, 0xC0F3, 0x34F7, + 0xC0F4, 0xC0F5, 0x08A9, 0xC0F6, 0xC0F6, 0x34FE, 0xC0F7, 0xC0F7, 0x08AB, + 0xC0F8, 0xC0F8, 0x34FF, 0xC0F9, 0xC0F9, 0x08AC, 0xC0FA, 0xC0FF, 0x3500, + 0xC100, 0xC100, 0x08AD, 0xC101, 0xC103, 0x3506, 0xC104, 0xC104, 0x08AE, + 0xC105, 0xC107, 0x3509, 0xC108, 0xC108, 0x08AF, 0xC109, 0xC10F, 0x350C, + 0xC110, 0xC110, 0x08B0, 0xC111, 0xC114, 0x3513, 0xC115, 0xC115, 0x08B1, + 0xC116, 0xC11B, 0x3517, 0xC11C, 0xC120, 0x08B2, 0xC121, 0xC122, 0x351D, + 0xC123, 0xC124, 0x08B7, 0xC125, 0xC125, 0x351F, 0xC126, 0xC127, 0x08B9, + 0xC128, 0xC12B, 0x3520, 0xC12C, 0xC12D, 0x08BB, 0xC12E, 0xC12E, 0x3524, + 0xC12F, 0xC131, 0x08BD, 0xC132, 0xC135, 0x3525, 0xC136, 0xC136, 0x08C0, + 0xC137, 0xC137, 0x3529, 0xC138, 0xC139, 0x08C1, 0xC13A, 0xC13B, 0x352A, + 0xC13C, 0xC13C, 0x08C3, 0xC13D, 0xC13F, 0x352C, 0xC140, 0xC140, 0x08C4, + 0xC141, 0xC147, 0x352F, 0xC148, 0xC149, 0x08C5, 0xC14A, 0xC14A, 0x3536, + 0xC14B, 0xC14D, 0x08C7, 0xC14E, 0xC153, 0x3537, 0xC154, 0xC155, 0x08CA, + 0xC156, 0xC157, 0x353D, 0xC158, 0xC158, 0x08CC, 0xC159, 0xC15B, 0x353F, + 0xC15C, 0xC15C, 0x08CD, 0xC15D, 0xC163, 0x3542, 0xC164, 0xC165, 0x08CE, + 0xC166, 0xC166, 0x3549, 0xC167, 0xC169, 0x08D0, 0xC16A, 0xC16F, 0x354A, + 0xC170, 0xC170, 0x08D3, 0xC171, 0xC173, 0x3550, 0xC174, 0xC174, 0x08D4, + 0xC175, 0xC177, 0x3553, 0xC178, 0xC178, 0x08D5, 0xC179, 0xC184, 0x3556, + 0xC185, 0xC185, 0x08D6, 0xC186, 0xC18B, 0x3562, 0xC18C, 0xC18E, 0x08D7, + 0xC18F, 0xC18F, 0x3568, 0xC190, 0xC190, 0x08DA, 0xC191, 0xC193, 0x3569, + 0xC194, 0xC194, 0x08DB, 0xC195, 0xC195, 0x356C, 0xC196, 0xC196, 0x08DC, + 0xC197, 0xC19B, 0x356D, 0xC19C, 0xC19D, 0x08DD, 0xC19E, 0xC19E, 0x3572, + 0xC19F, 0xC19F, 0x08DF, 0xC1A0, 0xC1A0, 0x3573, 0xC1A1, 0xC1A1, 0x08E0, + 0xC1A2, 0xC1A4, 0x3574, 0xC1A5, 0xC1A5, 0x08E1, 0xC1A6, 0xC1A7, 0x3577, + 0xC1A8, 0xC1A9, 0x08E2, 0xC1AA, 0xC1AB, 0x3579, 0xC1AC, 0xC1AC, 0x08E4, + 0xC1AD, 0xC1AF, 0x357B, 0xC1B0, 0xC1B0, 0x08E5, 0xC1B1, 0xC1BC, 0x357E, + 0xC1BD, 0xC1BD, 0x08E6, 0xC1BE, 0xC1C3, 0x358A, 0xC1C4, 0xC1C4, 0x08E7, + 0xC1C5, 0xC1C7, 0x3590, 0xC1C8, 0xC1C8, 0x08E8, 0xC1C9, 0xC1CB, 0x3593, + 0xC1CC, 0xC1CC, 0x08E9, 0xC1CD, 0xC1D3, 0x3596, 0xC1D4, 0xC1D4, 0x08EA, + 0xC1D5, 0xC1D6, 0x359D, 0xC1D7, 0xC1D8, 0x08EB, 0xC1D9, 0xC1DF, 0x359F, + 0xC1E0, 0xC1E0, 0x08ED, 0xC1E1, 0xC1E3, 0x35A6, 0xC1E4, 0xC1E4, 0x08EE, + 0xC1E5, 0xC1E7, 0x35A9, 0xC1E8, 0xC1E8, 0x08EF, 0xC1E9, 0xC1EF, 0x35AC, + 0xC1F0, 0xC1F1, 0x08F0, 0xC1F2, 0xC1F2, 0x35B3, 0xC1F3, 0xC1F3, 0x08F2, + 0xC1F4, 0xC1FB, 0x35B4, 0xC1FC, 0xC1FD, 0x08F3, 0xC1FE, 0xC1FF, 0x35BC, + 0xC200, 0xC200, 0x08F5, 0xC201, 0xC203, 0x35BE, 0xC204, 0xC204, 0x08F6, + 0xC205, 0xC20B, 0x35C1, 0xC20C, 0xC20D, 0x08F7, 0xC20E, 0xC20E, 0x35C8, + 0xC20F, 0xC20F, 0x08F9, 0xC210, 0xC210, 0x35C9, 0xC211, 0xC211, 0x08FA, + 0xC212, 0xC217, 0x35CA, 0xC218, 0xC219, 0x08FB, 0xC21A, 0xC21B, 0x35D0, + 0xC21C, 0xC21C, 0x08FD, 0xC21D, 0xC21E, 0x35D2, 0xC21F, 0xC220, 0x08FE, + 0xC221, 0xC227, 0x35D4, 0xC228, 0xC229, 0x0900, 0xC22A, 0xC22A, 0x35DB, + 0xC22B, 0xC22B, 0x0902, 0xC22C, 0xC22C, 0x35DC, 0xC22D, 0xC22D, 0x0903, + 0xC22E, 0xC22E, 0x35DD, 0xC22F, 0xC22F, 0x0904, 0xC230, 0xC230, 0x35DE, + 0xC231, 0xC232, 0x0905, 0xC233, 0xC233, 0x35DF, 0xC234, 0xC234, 0x0907, + 0xC235, 0xC247, 0x35E0, 0xC248, 0xC248, 0x0908, 0xC249, 0xC24F, 0x35F3, + 0xC250, 0xC251, 0x0909, 0xC252, 0xC253, 0x35FA, 0xC254, 0xC254, 0x090B, + 0xC255, 0xC257, 0x35FC, 0xC258, 0xC258, 0x090C, 0xC259, 0xC25F, 0x35FF, + 0xC260, 0xC260, 0x090D, 0xC261, 0xC264, 0x3606, 0xC265, 0xC265, 0x090E, + 0xC266, 0xC26B, 0x360A, 0xC26C, 0xC26D, 0x090F, 0xC26E, 0xC26F, 0x3610, + 0xC270, 0xC270, 0x0911, 0xC271, 0xC273, 0x3612, 0xC274, 0xC274, 0x0912, + 0xC275, 0xC27B, 0x3615, 0xC27C, 0xC27D, 0x0913, 0xC27E, 0xC27E, 0x361C, + 0xC27F, 0xC27F, 0x0915, 0xC280, 0xC280, 0x361D, 0xC281, 0xC281, 0x0916, + 0xC282, 0xC287, 0x361E, 0xC288, 0xC289, 0x0917, 0xC28A, 0xC28F, 0x3624, + 0xC290, 0xC290, 0x0919, 0xC291, 0xC297, 0x362A, 0xC298, 0xC298, 0x091A, + 0xC299, 0xC29A, 0x3631, 0xC29B, 0xC29B, 0x091B, 0xC29C, 0xC29C, 0x3633, + 0xC29D, 0xC29D, 0x091C, 0xC29E, 0xC2A3, 0x3634, 0xC2A4, 0xC2A5, 0x091D, + 0xC2A6, 0xC2A7, 0x363A, 0xC2A8, 0xC2A8, 0x091F, 0xC2A9, 0xC2AB, 0x363C, + 0xC2AC, 0xC2AD, 0x0920, 0xC2AE, 0xC2B3, 0x363F, 0xC2B4, 0xC2B5, 0x0922, + 0xC2B6, 0xC2B6, 0x3645, 0xC2B7, 0xC2B7, 0x0924, 0xC2B8, 0xC2B8, 0x3646, + 0xC2B9, 0xC2B9, 0x0925, 0xC2BA, 0xC2DB, 0x3647, 0xC2DC, 0xC2DD, 0x0926, + 0xC2DE, 0xC2DF, 0x3669, 0xC2E0, 0xC2E0, 0x0928, 0xC2E1, 0xC2E2, 0x366B, + 0xC2E3, 0xC2E4, 0x0929, 0xC2E5, 0xC2EA, 0x366D, 0xC2EB, 0xC2ED, 0x092B, + 0xC2EE, 0xC2EE, 0x3673, 0xC2EF, 0xC2EF, 0x092E, 0xC2F0, 0xC2F0, 0x3674, + 0xC2F1, 0xC2F1, 0x092F, 0xC2F2, 0xC2F5, 0x3675, 0xC2F6, 0xC2F6, 0x0930, + 0xC2F7, 0xC2F7, 0x3679, 0xC2F8, 0xC2F9, 0x0931, 0xC2FA, 0xC2FA, 0x367A, + 0xC2FB, 0xC2FC, 0x0933, 0xC2FD, 0xC2FF, 0x367B, 0xC300, 0xC300, 0x0935, + 0xC301, 0xC307, 0x367E, 0xC308, 0xC309, 0x0936, 0xC30A, 0xC30B, 0x3685, + 0xC30C, 0xC30D, 0x0938, 0xC30E, 0xC312, 0x3687, 0xC313, 0xC315, 0x093A, + 0xC316, 0xC317, 0x368C, 0xC318, 0xC318, 0x093D, 0xC319, 0xC31B, 0x368E, + 0xC31C, 0xC31C, 0x093E, 0xC31D, 0xC323, 0x3691, 0xC324, 0xC325, 0x093F, + 0xC326, 0xC327, 0x3698, 0xC328, 0xC329, 0x0941, 0xC32A, 0xC344, 0x369A, + 0xC345, 0xC345, 0x0943, 0xC346, 0xC367, 0x36B5, 0xC368, 0xC369, 0x0944, + 0xC36A, 0xC36B, 0x36D7, 0xC36C, 0xC36C, 0x0946, 0xC36D, 0xC36F, 0x36D9, + 0xC370, 0xC370, 0x0947, 0xC371, 0xC371, 0x36DC, 0xC372, 0xC372, 0x0948, + 0xC373, 0xC377, 0x36DD, 0xC378, 0xC379, 0x0949, 0xC37A, 0xC37B, 0x36E2, + 0xC37C, 0xC37D, 0x094B, 0xC37E, 0xC383, 0x36E4, 0xC384, 0xC384, 0x094D, + 0xC385, 0xC387, 0x36EA, 0xC388, 0xC388, 0x094E, 0xC389, 0xC38B, 0x36ED, + 0xC38C, 0xC38C, 0x094F, 0xC38D, 0xC3BF, 0x36F0, 0xC3C0, 0xC3C0, 0x0950, + 0xC3C1, 0xC3D7, 0x3723, 0xC3D8, 0xC3D9, 0x0951, 0xC3DA, 0xC3DB, 0x373A, + 0xC3DC, 0xC3DC, 0x0953, 0xC3DD, 0xC3DE, 0x373C, 0xC3DF, 0xC3E0, 0x0954, + 0xC3E1, 0xC3E1, 0x373E, 0xC3E2, 0xC3E2, 0x0956, 0xC3E3, 0xC3E7, 0x373F, + 0xC3E8, 0xC3E9, 0x0957, 0xC3EA, 0xC3EC, 0x3744, 0xC3ED, 0xC3ED, 0x0959, + 0xC3EE, 0xC3F3, 0x3747, 0xC3F4, 0xC3F5, 0x095A, 0xC3F6, 0xC3F7, 0x374D, + 0xC3F8, 0xC3F8, 0x095C, 0xC3F9, 0xC3FF, 0x374F, 0xC400, 0xC407, 0x3756, + 0xC408, 0xC408, 0x095D, 0xC409, 0xC40F, 0x375E, 0xC410, 0xC410, 0x095E, + 0xC411, 0xC423, 0x3765, 0xC424, 0xC424, 0x095F, 0xC425, 0xC42B, 0x3778, + 0xC42C, 0xC42C, 0x0960, 0xC42D, 0xC42F, 0x377F, 0xC430, 0xC430, 0x0961, + 0xC431, 0xC433, 0x3782, 0xC434, 0xC434, 0x0962, 0xC435, 0xC43B, 0x3785, + 0xC43C, 0xC43D, 0x0963, 0xC43E, 0xC447, 0x378C, 0xC448, 0xC448, 0x0965, + 0xC449, 0xC463, 0x3796, 0xC464, 0xC465, 0x0966, 0xC466, 0xC467, 0x37B1, + 0xC468, 0xC468, 0x0968, 0xC469, 0xC46B, 0x37B3, 0xC46C, 0xC46C, 0x0969, + 0xC46D, 0xC473, 0x37B6, 0xC474, 0xC475, 0x096A, 0xC476, 0xC478, 0x37BD, + 0xC479, 0xC479, 0x096C, 0xC47A, 0xC47F, 0x37C0, 0xC480, 0xC480, 0x096D, + 0xC481, 0xC493, 0x37C6, 0xC494, 0xC494, 0x096E, 0xC495, 0xC49B, 0x37D9, + 0xC49C, 0xC49C, 0x096F, 0xC49D, 0xC4B7, 0x37E0, 0xC4B8, 0xC4B8, 0x0970, + 0xC4B9, 0xC4BB, 0x37FB, 0xC4BC, 0xC4BC, 0x0971, 0xC4BD, 0xC4E8, 0x37FE, + 0xC4E9, 0xC4E9, 0x0972, 0xC4EA, 0xC4EF, 0x382A, 0xC4F0, 0xC4F1, 0x0973, + 0xC4F2, 0xC4F3, 0x3830, 0xC4F4, 0xC4F4, 0x0975, 0xC4F5, 0xC4F7, 0x3832, + 0xC4F8, 0xC4F8, 0x0976, 0xC4F9, 0xC4F9, 0x3835, 0xC4FA, 0xC4FA, 0x0977, + 0xC4FB, 0xC4FE, 0x3836, 0xC4FF, 0xC4FF, 0x0978, 0xC500, 0xC501, 0x0979, + 0xC502, 0xC50B, 0x383A, 0xC50C, 0xC50C, 0x097B, 0xC50D, 0xC50F, 0x3844, + 0xC510, 0xC510, 0x097C, 0xC511, 0xC513, 0x3847, 0xC514, 0xC514, 0x097D, + 0xC515, 0xC51B, 0x384A, 0xC51C, 0xC51C, 0x097E, 0xC51D, 0xC527, 0x3851, + 0xC528, 0xC529, 0x097F, 0xC52A, 0xC52B, 0x385C, 0xC52C, 0xC52C, 0x0981, + 0xC52D, 0xC52F, 0x385E, 0xC530, 0xC530, 0x0982, 0xC531, 0xC537, 0x3861, + 0xC538, 0xC539, 0x0983, 0xC53A, 0xC53A, 0x3868, 0xC53B, 0xC53B, 0x0985, + 0xC53C, 0xC53C, 0x3869, 0xC53D, 0xC53D, 0x0986, 0xC53E, 0xC543, 0x386A, + 0xC544, 0xC545, 0x0987, 0xC546, 0xC547, 0x3870, 0xC548, 0xC54A, 0x0989, + 0xC54B, 0xC54B, 0x3872, 0xC54C, 0xC54E, 0x098C, 0xC54F, 0xC552, 0x3873, + 0xC553, 0xC555, 0x098F, 0xC556, 0xC556, 0x3877, 0xC557, 0xC559, 0x0992, + 0xC55A, 0xC55C, 0x3878, 0xC55D, 0xC55E, 0x0995, 0xC55F, 0xC55F, 0x387B, + 0xC560, 0xC561, 0x0997, 0xC562, 0xC563, 0x387C, 0xC564, 0xC564, 0x0999, + 0xC565, 0xC567, 0x387E, 0xC568, 0xC568, 0x099A, 0xC569, 0xC56F, 0x3881, + 0xC570, 0xC571, 0x099B, 0xC572, 0xC572, 0x3888, 0xC573, 0xC575, 0x099D, + 0xC576, 0xC57B, 0x3889, 0xC57C, 0xC57D, 0x09A0, 0xC57E, 0xC57F, 0x388F, + 0xC580, 0xC580, 0x09A2, 0xC581, 0xC583, 0x3891, 0xC584, 0xC584, 0x09A3, + 0xC585, 0xC586, 0x3894, 0xC587, 0xC587, 0x09A4, 0xC588, 0xC58B, 0x3896, + 0xC58C, 0xC58D, 0x09A5, 0xC58E, 0xC58E, 0x389A, 0xC58F, 0xC58F, 0x09A7, + 0xC590, 0xC590, 0x389B, 0xC591, 0xC591, 0x09A8, 0xC592, 0xC594, 0x389C, + 0xC595, 0xC595, 0x09A9, 0xC596, 0xC596, 0x389F, 0xC597, 0xC598, 0x09AA, + 0xC599, 0xC59B, 0x38A0, 0xC59C, 0xC59C, 0x09AC, 0xC59D, 0xC59F, 0x38A3, + 0xC5A0, 0xC5A0, 0x09AD, 0xC5A1, 0xC5A8, 0x38A6, 0xC5A9, 0xC5A9, 0x09AE, + 0xC5AA, 0xC5B3, 0x38AE, 0xC5B4, 0xC5B5, 0x09AF, 0xC5B6, 0xC5B7, 0x38B8, + 0xC5B8, 0xC5B9, 0x09B1, 0xC5BA, 0xC5BA, 0x38BA, 0xC5BB, 0xC5BE, 0x09B3, + 0xC5BF, 0xC5C3, 0x38BB, 0xC5C4, 0xC5CA, 0x09B7, 0xC5CB, 0xC5CB, 0x38C0, + 0xC5CC, 0xC5CC, 0x09BE, 0xC5CD, 0xC5CD, 0x38C1, 0xC5CE, 0xC5CE, 0x09BF, + 0xC5CF, 0xC5CF, 0x38C2, 0xC5D0, 0xC5D1, 0x09C0, 0xC5D2, 0xC5D3, 0x38C3, + 0xC5D4, 0xC5D4, 0x09C2, 0xC5D5, 0xC5D7, 0x38C5, 0xC5D8, 0xC5D8, 0x09C3, + 0xC5D9, 0xC5DF, 0x38C8, 0xC5E0, 0xC5E1, 0x09C4, 0xC5E2, 0xC5E2, 0x38CF, + 0xC5E3, 0xC5E3, 0x09C6, 0xC5E4, 0xC5E4, 0x38D0, 0xC5E5, 0xC5E5, 0x09C7, + 0xC5E6, 0xC5EB, 0x38D1, 0xC5EC, 0xC5EE, 0x09C8, 0xC5EF, 0xC5EF, 0x38D7, + 0xC5F0, 0xC5F0, 0x09CB, 0xC5F1, 0xC5F3, 0x38D8, 0xC5F4, 0xC5F4, 0x09CC, + 0xC5F5, 0xC5F5, 0x38DB, 0xC5F6, 0xC5F7, 0x09CD, 0xC5F8, 0xC5FB, 0x38DC, + 0xC5FC, 0xC5FF, 0x09CF, 0xC600, 0xC601, 0x09D3, 0xC602, 0xC604, 0x38E0, + 0xC605, 0xC608, 0x09D5, 0xC609, 0xC60B, 0x38E3, 0xC60C, 0xC60C, 0x09D9, + 0xC60D, 0xC60F, 0x38E6, 0xC610, 0xC610, 0x09DA, 0xC611, 0xC617, 0x38E9, + 0xC618, 0xC619, 0x09DB, 0xC61A, 0xC61A, 0x38F0, 0xC61B, 0xC61C, 0x09DD, + 0xC61D, 0xC623, 0x38F1, 0xC624, 0xC625, 0x09DF, 0xC626, 0xC627, 0x38F8, + 0xC628, 0xC628, 0x09E1, 0xC629, 0xC62B, 0x38FA, 0xC62C, 0xC62E, 0x09E2, + 0xC62F, 0xC62F, 0x38FD, 0xC630, 0xC630, 0x09E5, 0xC631, 0xC632, 0x38FE, + 0xC633, 0xC635, 0x09E6, 0xC636, 0xC636, 0x3900, 0xC637, 0xC637, 0x09E9, + 0xC638, 0xC638, 0x3901, 0xC639, 0xC639, 0x09EA, 0xC63A, 0xC63A, 0x3902, + 0xC63B, 0xC63B, 0x09EB, 0xC63C, 0xC63F, 0x3903, 0xC640, 0xC641, 0x09EC, + 0xC642, 0xC643, 0x3907, 0xC644, 0xC644, 0x09EE, 0xC645, 0xC647, 0x3909, + 0xC648, 0xC648, 0x09EF, 0xC649, 0xC64F, 0x390C, 0xC650, 0xC651, 0x09F0, + 0xC652, 0xC652, 0x3913, 0xC653, 0xC655, 0x09F2, 0xC656, 0xC65B, 0x3914, + 0xC65C, 0xC65D, 0x09F5, 0xC65E, 0xC65F, 0x391A, 0xC660, 0xC660, 0x09F7, + 0xC661, 0xC66B, 0x391C, 0xC66C, 0xC66C, 0x09F8, 0xC66D, 0xC66E, 0x3927, + 0xC66F, 0xC66F, 0x09F9, 0xC670, 0xC670, 0x3929, 0xC671, 0xC671, 0x09FA, + 0xC672, 0xC677, 0x392A, 0xC678, 0xC679, 0x09FB, 0xC67A, 0xC67B, 0x3930, + 0xC67C, 0xC67C, 0x09FD, 0xC67D, 0xC67F, 0x3932, 0xC680, 0xC680, 0x09FE, + 0xC681, 0xC687, 0x3935, 0xC688, 0xC689, 0x09FF, 0xC68A, 0xC68A, 0x393C, + 0xC68B, 0xC68B, 0x0A01, 0xC68C, 0xC68C, 0x393D, 0xC68D, 0xC68D, 0x0A02, + 0xC68E, 0xC693, 0x393E, 0xC694, 0xC695, 0x0A03, 0xC696, 0xC697, 0x3944, + 0xC698, 0xC698, 0x0A05, 0xC699, 0xC69B, 0x3946, 0xC69C, 0xC69C, 0x0A06, + 0xC69D, 0xC6A3, 0x3949, 0xC6A4, 0xC6A5, 0x0A07, 0xC6A6, 0xC6A6, 0x3950, + 0xC6A7, 0xC6A7, 0x0A09, 0xC6A8, 0xC6A8, 0x3951, 0xC6A9, 0xC6A9, 0x0A0A, + 0xC6AA, 0xC6AF, 0x3952, 0xC6B0, 0xC6B1, 0x0A0B, 0xC6B2, 0xC6B3, 0x3958, + 0xC6B4, 0xC6B4, 0x0A0D, 0xC6B5, 0xC6B7, 0x395A, 0xC6B8, 0xC6BA, 0x0A0E, + 0xC6BB, 0xC6BF, 0x395D, 0xC6C0, 0xC6C1, 0x0A11, 0xC6C2, 0xC6C2, 0x3962, + 0xC6C3, 0xC6C3, 0x0A13, 0xC6C4, 0xC6C4, 0x3963, 0xC6C5, 0xC6C5, 0x0A14, + 0xC6C6, 0xC6CB, 0x3964, 0xC6CC, 0xC6CD, 0x0A15, 0xC6CE, 0xC6CF, 0x396A, + 0xC6D0, 0xC6D0, 0x0A17, 0xC6D1, 0xC6D3, 0x396C, 0xC6D4, 0xC6D4, 0x0A18, + 0xC6D5, 0xC6DB, 0x396F, 0xC6DC, 0xC6DD, 0x0A19, 0xC6DE, 0xC6DF, 0x3976, + 0xC6E0, 0xC6E1, 0x0A1B, 0xC6E2, 0xC6E7, 0x3978, 0xC6E8, 0xC6E9, 0x0A1D, + 0xC6EA, 0xC6EB, 0x397E, 0xC6EC, 0xC6EC, 0x0A1F, 0xC6ED, 0xC6EF, 0x3980, + 0xC6F0, 0xC6F0, 0x0A20, 0xC6F1, 0xC6F7, 0x3983, 0xC6F8, 0xC6F9, 0x0A21, + 0xC6FA, 0xC6FC, 0x398A, 0xC6FD, 0xC6FD, 0x0A23, 0xC6FE, 0xC6FF, 0x398D, + 0xC700, 0xC703, 0x398F, 0xC704, 0xC705, 0x0A24, 0xC706, 0xC707, 0x3993, + 0xC708, 0xC708, 0x0A26, 0xC709, 0xC70B, 0x3995, 0xC70C, 0xC70C, 0x0A27, + 0xC70D, 0xC713, 0x3998, 0xC714, 0xC715, 0x0A28, 0xC716, 0xC716, 0x399F, + 0xC717, 0xC717, 0x0A2A, 0xC718, 0xC718, 0x39A0, 0xC719, 0xC719, 0x0A2B, + 0xC71A, 0xC71F, 0x39A1, 0xC720, 0xC721, 0x0A2C, 0xC722, 0xC723, 0x39A7, + 0xC724, 0xC724, 0x0A2E, 0xC725, 0xC727, 0x39A9, 0xC728, 0xC728, 0x0A2F, + 0xC729, 0xC72F, 0x39AC, 0xC730, 0xC731, 0x0A30, 0xC732, 0xC732, 0x39B3, + 0xC733, 0xC733, 0x0A32, 0xC734, 0xC734, 0x39B4, 0xC735, 0xC735, 0x0A33, + 0xC736, 0xC736, 0x39B5, 0xC737, 0xC737, 0x0A34, 0xC738, 0xC73B, 0x39B6, + 0xC73C, 0xC73D, 0x0A35, 0xC73E, 0xC73F, 0x39BA, 0xC740, 0xC740, 0x0A37, + 0xC741, 0xC743, 0x39BC, 0xC744, 0xC744, 0x0A38, 0xC745, 0xC749, 0x39BF, + 0xC74A, 0xC74A, 0x0A39, 0xC74B, 0xC74B, 0x39C4, 0xC74C, 0xC74D, 0x0A3A, + 0xC74E, 0xC74E, 0x39C5, 0xC74F, 0xC74F, 0x0A3C, 0xC750, 0xC750, 0x39C6, + 0xC751, 0xC758, 0x0A3D, 0xC759, 0xC75B, 0x39C7, 0xC75C, 0xC75C, 0x0A45, + 0xC75D, 0xC75F, 0x39CA, 0xC760, 0xC760, 0x0A46, 0xC761, 0xC767, 0x39CD, + 0xC768, 0xC768, 0x0A47, 0xC769, 0xC76A, 0x39D4, 0xC76B, 0xC76B, 0x0A48, + 0xC76C, 0xC773, 0x39D6, 0xC774, 0xC775, 0x0A49, 0xC776, 0xC777, 0x39DE, + 0xC778, 0xC778, 0x0A4B, 0xC779, 0xC77B, 0x39E0, 0xC77C, 0xC77E, 0x0A4C, + 0xC77F, 0xC782, 0x39E3, 0xC783, 0xC785, 0x0A4F, 0xC786, 0xC786, 0x39E7, + 0xC787, 0xC78A, 0x0A52, 0xC78B, 0xC78D, 0x39E8, 0xC78E, 0xC78E, 0x0A56, + 0xC78F, 0xC78F, 0x39EB, 0xC790, 0xC791, 0x0A57, 0xC792, 0xC793, 0x39EC, + 0xC794, 0xC794, 0x0A59, 0xC795, 0xC795, 0x39EE, 0xC796, 0xC798, 0x0A5A, + 0xC799, 0xC799, 0x39EF, 0xC79A, 0xC79A, 0x0A5D, 0xC79B, 0xC79F, 0x39F0, + 0xC7A0, 0xC7A1, 0x0A5E, 0xC7A2, 0xC7A2, 0x39F5, 0xC7A3, 0xC7A6, 0x0A60, + 0xC7A7, 0xC7AB, 0x39F6, 0xC7AC, 0xC7AD, 0x0A64, 0xC7AE, 0xC7AF, 0x39FB, + 0xC7B0, 0xC7B0, 0x0A66, 0xC7B1, 0xC7B3, 0x39FD, 0xC7B4, 0xC7B4, 0x0A67, + 0xC7B5, 0xC7BB, 0x3A00, 0xC7BC, 0xC7BD, 0x0A68, 0xC7BE, 0xC7BE, 0x3A07, + 0xC7BF, 0xC7C1, 0x0A6A, 0xC7C2, 0xC7C7, 0x3A08, 0xC7C8, 0xC7C9, 0x0A6D, + 0xC7CA, 0xC7CB, 0x3A0E, 0xC7CC, 0xC7CC, 0x0A6F, 0xC7CD, 0xC7CD, 0x3A10, + 0xC7CE, 0xC7CE, 0x0A70, 0xC7CF, 0xC7CF, 0x3A11, 0xC7D0, 0xC7D0, 0x0A71, + 0xC7D1, 0xC7D7, 0x3A12, 0xC7D8, 0xC7D8, 0x0A72, 0xC7D9, 0xC7DC, 0x3A19, + 0xC7DD, 0xC7DD, 0x0A73, 0xC7DE, 0xC7E3, 0x3A1D, 0xC7E4, 0xC7E4, 0x0A74, + 0xC7E5, 0xC7E7, 0x3A23, 0xC7E8, 0xC7E8, 0x0A75, 0xC7E9, 0xC7EB, 0x3A26, + 0xC7EC, 0xC7EC, 0x0A76, 0xC7ED, 0xC7FF, 0x3A29, 0xC800, 0xC801, 0x0A77, + 0xC802, 0xC803, 0x3A3C, 0xC804, 0xC804, 0x0A79, 0xC805, 0xC807, 0x3A3E, + 0xC808, 0xC808, 0x0A7A, 0xC809, 0xC809, 0x3A41, 0xC80A, 0xC80A, 0x0A7B, + 0xC80B, 0xC80F, 0x3A42, 0xC810, 0xC811, 0x0A7C, 0xC812, 0xC812, 0x3A47, + 0xC813, 0xC813, 0x0A7E, 0xC814, 0xC814, 0x3A48, 0xC815, 0xC816, 0x0A7F, + 0xC817, 0xC81B, 0x3A49, 0xC81C, 0xC81D, 0x0A81, 0xC81E, 0xC81F, 0x3A4E, + 0xC820, 0xC820, 0x0A83, 0xC821, 0xC823, 0x3A50, 0xC824, 0xC824, 0x0A84, + 0xC825, 0xC82B, 0x3A53, 0xC82C, 0xC82D, 0x0A85, 0xC82E, 0xC82E, 0x3A5A, + 0xC82F, 0xC82F, 0x0A87, 0xC830, 0xC830, 0x3A5B, 0xC831, 0xC831, 0x0A88, + 0xC832, 0xC837, 0x3A5C, 0xC838, 0xC838, 0x0A89, 0xC839, 0xC83B, 0x3A62, + 0xC83C, 0xC83C, 0x0A8A, 0xC83D, 0xC83F, 0x3A65, 0xC840, 0xC840, 0x0A8B, + 0xC841, 0xC847, 0x3A68, 0xC848, 0xC849, 0x0A8C, 0xC84A, 0xC84B, 0x3A6F, + 0xC84C, 0xC84D, 0x0A8E, 0xC84E, 0xC853, 0x3A71, 0xC854, 0xC854, 0x0A90, + 0xC855, 0xC86F, 0x3A77, 0xC870, 0xC871, 0x0A91, 0xC872, 0xC873, 0x3A92, + 0xC874, 0xC874, 0x0A93, 0xC875, 0xC877, 0x3A94, 0xC878, 0xC878, 0x0A94, + 0xC879, 0xC879, 0x3A97, 0xC87A, 0xC87A, 0x0A95, 0xC87B, 0xC87F, 0x3A98, + 0xC880, 0xC881, 0x0A96, 0xC882, 0xC882, 0x3A9D, 0xC883, 0xC883, 0x0A98, + 0xC884, 0xC884, 0x3A9E, 0xC885, 0xC887, 0x0A99, 0xC888, 0xC88A, 0x3A9F, + 0xC88B, 0xC88D, 0x0A9C, 0xC88E, 0xC893, 0x3AA2, 0xC894, 0xC894, 0x0A9F, + 0xC895, 0xC89C, 0x3AA8, 0xC89D, 0xC89D, 0x0AA0, 0xC89E, 0xC89E, 0x3AB0, + 0xC89F, 0xC89F, 0x0AA1, 0xC8A0, 0xC8A0, 0x3AB1, 0xC8A1, 0xC8A1, 0x0AA2, + 0xC8A2, 0xC8A7, 0x3AB2, 0xC8A8, 0xC8A8, 0x0AA3, 0xC8A9, 0xC8BB, 0x3AB8, + 0xC8BC, 0xC8BD, 0x0AA4, 0xC8BE, 0xC8C3, 0x3ACB, 0xC8C4, 0xC8C4, 0x0AA6, + 0xC8C5, 0xC8C7, 0x3AD1, 0xC8C8, 0xC8C8, 0x0AA7, 0xC8C9, 0xC8CB, 0x3AD4, + 0xC8CC, 0xC8CC, 0x0AA8, 0xC8CD, 0xC8D3, 0x3AD7, 0xC8D4, 0xC8D5, 0x0AA9, + 0xC8D6, 0xC8D6, 0x3ADE, 0xC8D7, 0xC8D7, 0x0AAB, 0xC8D8, 0xC8D8, 0x3ADF, + 0xC8D9, 0xC8D9, 0x0AAC, 0xC8DA, 0xC8DF, 0x3AE0, 0xC8E0, 0xC8E1, 0x0AAD, + 0xC8E2, 0xC8E3, 0x3AE6, 0xC8E4, 0xC8E4, 0x0AAF, 0xC8E5, 0xC8F4, 0x3AE8, + 0xC8F5, 0xC8F5, 0x0AB0, 0xC8F6, 0xC8FB, 0x3AF8, 0xC8FC, 0xC8FD, 0x0AB1, + 0xC8FE, 0xC8FF, 0x3AFE, 0xC900, 0xC900, 0x0AB3, 0xC901, 0xC903, 0x3B00, + 0xC904, 0xC906, 0x0AB4, 0xC907, 0xC90B, 0x3B03, 0xC90C, 0xC90D, 0x0AB7, + 0xC90E, 0xC90E, 0x3B08, 0xC90F, 0xC90F, 0x0AB9, 0xC910, 0xC910, 0x3B09, + 0xC911, 0xC911, 0x0ABA, 0xC912, 0xC917, 0x3B0A, 0xC918, 0xC918, 0x0ABB, + 0xC919, 0xC92B, 0x3B10, 0xC92C, 0xC92C, 0x0ABC, 0xC92D, 0xC933, 0x3B23, + 0xC934, 0xC934, 0x0ABD, 0xC935, 0xC94F, 0x3B2A, 0xC950, 0xC951, 0x0ABE, + 0xC952, 0xC953, 0x3B45, 0xC954, 0xC954, 0x0AC0, 0xC955, 0xC957, 0x3B47, + 0xC958, 0xC958, 0x0AC1, 0xC959, 0xC95F, 0x3B4A, 0xC960, 0xC961, 0x0AC2, + 0xC962, 0xC962, 0x3B51, 0xC963, 0xC963, 0x0AC4, 0xC964, 0xC96B, 0x3B52, + 0xC96C, 0xC96C, 0x0AC5, 0xC96D, 0xC96F, 0x3B5A, 0xC970, 0xC970, 0x0AC6, + 0xC971, 0xC973, 0x3B5D, 0xC974, 0xC974, 0x0AC7, 0xC975, 0xC97B, 0x3B60, + 0xC97C, 0xC97C, 0x0AC8, 0xC97D, 0xC987, 0x3B67, 0xC988, 0xC989, 0x0AC9, + 0xC98A, 0xC98B, 0x3B72, 0xC98C, 0xC98C, 0x0ACB, 0xC98D, 0xC98F, 0x3B74, + 0xC990, 0xC990, 0x0ACC, 0xC991, 0xC997, 0x3B77, 0xC998, 0xC999, 0x0ACD, + 0xC99A, 0xC99A, 0x3B7E, 0xC99B, 0xC99B, 0x0ACF, 0xC99C, 0xC99C, 0x3B7F, + 0xC99D, 0xC99D, 0x0AD0, 0xC99E, 0xC9BF, 0x3B80, 0xC9C0, 0xC9C1, 0x0AD1, + 0xC9C2, 0xC9C3, 0x3BA2, 0xC9C4, 0xC9C4, 0x0AD3, 0xC9C5, 0xC9C6, 0x3BA4, + 0xC9C7, 0xC9C8, 0x0AD4, 0xC9C9, 0xC9C9, 0x3BA6, 0xC9CA, 0xC9CA, 0x0AD6, + 0xC9CB, 0xC9CF, 0x3BA7, 0xC9D0, 0xC9D1, 0x0AD7, 0xC9D2, 0xC9D2, 0x3BAC, + 0xC9D3, 0xC9D3, 0x0AD9, 0xC9D4, 0xC9D4, 0x3BAD, 0xC9D5, 0xC9D6, 0x0ADA, + 0xC9D7, 0xC9D8, 0x3BAE, 0xC9D9, 0xC9DA, 0x0ADC, 0xC9DB, 0xC9DB, 0x3BB0, + 0xC9DC, 0xC9DD, 0x0ADE, 0xC9DE, 0xC9DF, 0x3BB1, 0xC9E0, 0xC9E0, 0x0AE0, + 0xC9E1, 0xC9E1, 0x3BB3, 0xC9E2, 0xC9E2, 0x0AE1, 0xC9E3, 0xC9E3, 0x3BB4, + 0xC9E4, 0xC9E4, 0x0AE2, 0xC9E5, 0xC9E6, 0x3BB5, 0xC9E7, 0xC9E7, 0x0AE3, + 0xC9E8, 0xC9EB, 0x3BB7, 0xC9EC, 0xC9ED, 0x0AE4, 0xC9EE, 0xC9EE, 0x3BBB, + 0xC9EF, 0xC9F1, 0x0AE6, 0xC9F2, 0xC9F7, 0x3BBC, 0xC9F8, 0xC9F9, 0x0AE9, + 0xC9FA, 0xC9FB, 0x3BC2, 0xC9FC, 0xC9FC, 0x0AEB, 0xC9FD, 0xC9FF, 0x3BC4, + 0xCA00, 0xCA00, 0x0AEC, 0xCA01, 0xCA07, 0x3BC7, 0xCA08, 0xCA09, 0x0AED, + 0xCA0A, 0xCA0A, 0x3BCE, 0xCA0B, 0xCA0D, 0x0AEF, 0xCA0E, 0xCA13, 0x3BCF, + 0xCA14, 0xCA14, 0x0AF2, 0xCA15, 0xCA17, 0x3BD5, 0xCA18, 0xCA18, 0x0AF3, + 0xCA19, 0xCA28, 0x3BD8, 0xCA29, 0xCA29, 0x0AF4, 0xCA2A, 0xCA4B, 0x3BE8, + 0xCA4C, 0xCA4D, 0x0AF5, 0xCA4E, 0xCA4F, 0x3C0A, 0xCA50, 0xCA50, 0x0AF7, + 0xCA51, 0xCA53, 0x3C0C, 0xCA54, 0xCA54, 0x0AF8, 0xCA55, 0xCA5B, 0x3C0F, + 0xCA5C, 0xCA5D, 0x0AF9, 0xCA5E, 0xCA5E, 0x3C16, 0xCA5F, 0xCA61, 0x0AFB, + 0xCA62, 0xCA67, 0x3C17, 0xCA68, 0xCA68, 0x0AFE, 0xCA69, 0xCA7C, 0x3C1D, + 0xCA7D, 0xCA7D, 0x0AFF, 0xCA7E, 0xCA83, 0x3C31, 0xCA84, 0xCA84, 0x0B00, + 0xCA85, 0xCA97, 0x3C37, 0xCA98, 0xCA98, 0x0B01, 0xCA99, 0xCABB, 0x3C4A, + 0xCABC, 0xCABD, 0x0B02, 0xCABE, 0xCABF, 0x3C6D, 0xCAC0, 0xCAC0, 0x0B04, + 0xCAC1, 0xCAC3, 0x3C6F, 0xCAC4, 0xCAC4, 0x0B05, 0xCAC5, 0xCACB, 0x3C72, + 0xCACC, 0xCACD, 0x0B06, 0xCACE, 0xCACE, 0x3C79, 0xCACF, 0xCACF, 0x0B08, + 0xCAD0, 0xCAD0, 0x3C7A, 0xCAD1, 0xCAD1, 0x0B09, 0xCAD2, 0xCAD2, 0x3C7B, + 0xCAD3, 0xCAD3, 0x0B0A, 0xCAD4, 0xCAD7, 0x3C7C, 0xCAD8, 0xCAD9, 0x0B0B, + 0xCADA, 0xCADF, 0x3C80, 0xCAE0, 0xCAE0, 0x0B0D, 0xCAE1, 0xCAEB, 0x3C86, + 0xCAEC, 0xCAEC, 0x0B0E, 0xCAED, 0xCAF3, 0x3C91, 0xCAF4, 0xCAF4, 0x0B0F, + 0xCAF5, 0xCAFF, 0x3C98, 0xCB00, 0xCB07, 0x3CA3, 0xCB08, 0xCB08, 0x0B10, + 0xCB09, 0xCB0F, 0x3CAB, 0xCB10, 0xCB10, 0x0B11, 0xCB11, 0xCB13, 0x3CB2, + 0xCB14, 0xCB14, 0x0B12, 0xCB15, 0xCB17, 0x3CB5, 0xCB18, 0xCB18, 0x0B13, + 0xCB19, 0xCB1F, 0x3CB8, 0xCB20, 0xCB21, 0x0B14, 0xCB22, 0xCB40, 0x3CBF, + 0xCB41, 0xCB41, 0x0B16, 0xCB42, 0xCB47, 0x3CDE, 0xCB48, 0xCB49, 0x0B17, + 0xCB4A, 0xCB4B, 0x3CE4, 0xCB4C, 0xCB4C, 0x0B19, 0xCB4D, 0xCB4F, 0x3CE6, + 0xCB50, 0xCB50, 0x0B1A, 0xCB51, 0xCB57, 0x3CE9, 0xCB58, 0xCB59, 0x0B1B, + 0xCB5A, 0xCB5C, 0x3CF0, 0xCB5D, 0xCB5D, 0x0B1D, 0xCB5E, 0xCB63, 0x3CF3, + 0xCB64, 0xCB64, 0x0B1E, 0xCB65, 0xCB77, 0x3CF9, 0xCB78, 0xCB79, 0x0B1F, + 0xCB7A, 0xCB9B, 0x3D0C, 0xCB9C, 0xCB9C, 0x0B21, 0xCB9D, 0xCBB7, 0x3D2E, + 0xCBB8, 0xCBB8, 0x0B22, 0xCBB9, 0xCBD3, 0x3D49, 0xCBD4, 0xCBD4, 0x0B23, + 0xCBD5, 0xCBE3, 0x3D64, 0xCBE4, 0xCBE4, 0x0B24, 0xCBE5, 0xCBE6, 0x3D73, + 0xCBE7, 0xCBE7, 0x0B25, 0xCBE8, 0xCBE8, 0x3D75, 0xCBE9, 0xCBE9, 0x0B26, + 0xCBEA, 0xCBFF, 0x3D76, 0xCC00, 0xCC0B, 0x3D8C, 0xCC0C, 0xCC0D, 0x0B27, + 0xCC0E, 0xCC0F, 0x3D98, 0xCC10, 0xCC10, 0x0B29, 0xCC11, 0xCC13, 0x3D9A, + 0xCC14, 0xCC14, 0x0B2A, 0xCC15, 0xCC1B, 0x3D9D, 0xCC1C, 0xCC1D, 0x0B2B, + 0xCC1E, 0xCC20, 0x3DA4, 0xCC21, 0xCC22, 0x0B2D, 0xCC23, 0xCC26, 0x3DA7, + 0xCC27, 0xCC29, 0x0B2F, 0xCC2A, 0xCC2B, 0x3DAB, 0xCC2C, 0xCC2C, 0x0B32, + 0xCC2D, 0xCC2D, 0x3DAD, 0xCC2E, 0xCC2E, 0x0B33, 0xCC2F, 0xCC2F, 0x3DAE, + 0xCC30, 0xCC30, 0x0B34, 0xCC31, 0xCC37, 0x3DAF, 0xCC38, 0xCC39, 0x0B35, + 0xCC3A, 0xCC3A, 0x3DB6, 0xCC3B, 0xCC3E, 0x0B37, 0xCC3F, 0xCC43, 0x3DB7, + 0xCC44, 0xCC45, 0x0B3B, 0xCC46, 0xCC47, 0x3DBC, 0xCC48, 0xCC48, 0x0B3D, + 0xCC49, 0xCC4B, 0x3DBE, 0xCC4C, 0xCC4C, 0x0B3E, 0xCC4D, 0xCC53, 0x3DC1, + 0xCC54, 0xCC55, 0x0B3F, 0xCC56, 0xCC56, 0x3DC8, 0xCC57, 0xCC59, 0x0B41, + 0xCC5A, 0xCC5F, 0x3DC9, 0xCC60, 0xCC60, 0x0B44, 0xCC61, 0xCC63, 0x3DCF, + 0xCC64, 0xCC64, 0x0B45, 0xCC65, 0xCC65, 0x3DD2, 0xCC66, 0xCC66, 0x0B46, + 0xCC67, 0xCC67, 0x3DD3, 0xCC68, 0xCC68, 0x0B47, 0xCC69, 0xCC6F, 0x3DD4, + 0xCC70, 0xCC70, 0x0B48, 0xCC71, 0xCC74, 0x3DDB, 0xCC75, 0xCC75, 0x0B49, + 0xCC76, 0xCC97, 0x3DDF, 0xCC98, 0xCC99, 0x0B4A, 0xCC9A, 0xCC9B, 0x3E01, + 0xCC9C, 0xCC9C, 0x0B4C, 0xCC9D, 0xCC9F, 0x3E03, 0xCCA0, 0xCCA0, 0x0B4D, + 0xCCA1, 0xCCA7, 0x3E06, 0xCCA8, 0xCCA9, 0x0B4E, 0xCCAA, 0xCCAA, 0x3E0D, + 0xCCAB, 0xCCAD, 0x0B50, 0xCCAE, 0xCCB3, 0x3E0E, 0xCCB4, 0xCCB5, 0x0B53, + 0xCCB6, 0xCCB7, 0x3E14, 0xCCB8, 0xCCB8, 0x0B55, 0xCCB9, 0xCCBB, 0x3E16, + 0xCCBC, 0xCCBC, 0x0B56, 0xCCBD, 0xCCC3, 0x3E19, 0xCCC4, 0xCCC5, 0x0B57, + 0xCCC6, 0xCCC6, 0x3E20, 0xCCC7, 0xCCC7, 0x0B59, 0xCCC8, 0xCCC8, 0x3E21, + 0xCCC9, 0xCCC9, 0x0B5A, 0xCCCA, 0xCCCF, 0x3E22, 0xCCD0, 0xCCD0, 0x0B5B, + 0xCCD1, 0xCCD3, 0x3E28, 0xCCD4, 0xCCD4, 0x0B5C, 0xCCD5, 0xCCE3, 0x3E2B, + 0xCCE4, 0xCCE4, 0x0B5D, 0xCCE5, 0xCCEB, 0x3E3A, 0xCCEC, 0xCCEC, 0x0B5E, + 0xCCED, 0xCCEF, 0x3E41, 0xCCF0, 0xCCF0, 0x0B5F, 0xCCF1, 0xCCFF, 0x3E44, + 0xCD00, 0xCD00, 0x3E53, 0xCD01, 0xCD01, 0x0B60, 0xCD02, 0xCD07, 0x3E54, + 0xCD08, 0xCD09, 0x0B61, 0xCD0A, 0xCD0B, 0x3E5A, 0xCD0C, 0xCD0C, 0x0B63, + 0xCD0D, 0xCD0F, 0x3E5C, 0xCD10, 0xCD10, 0x0B64, 0xCD11, 0xCD17, 0x3E5F, + 0xCD18, 0xCD19, 0x0B65, 0xCD1A, 0xCD1A, 0x3E66, 0xCD1B, 0xCD1B, 0x0B67, + 0xCD1C, 0xCD1C, 0x3E67, 0xCD1D, 0xCD1D, 0x0B68, 0xCD1E, 0xCD23, 0x3E68, + 0xCD24, 0xCD24, 0x0B69, 0xCD25, 0xCD27, 0x3E6E, 0xCD28, 0xCD28, 0x0B6A, + 0xCD29, 0xCD2B, 0x3E71, 0xCD2C, 0xCD2C, 0x0B6B, 0xCD2D, 0xCD38, 0x3E74, + 0xCD39, 0xCD39, 0x0B6C, 0xCD3A, 0xCD5B, 0x3E80, 0xCD5C, 0xCD5C, 0x0B6D, + 0xCD5D, 0xCD5F, 0x3EA2, 0xCD60, 0xCD60, 0x0B6E, 0xCD61, 0xCD63, 0x3EA5, + 0xCD64, 0xCD64, 0x0B6F, 0xCD65, 0xCD6B, 0x3EA8, 0xCD6C, 0xCD6D, 0x0B70, + 0xCD6E, 0xCD6E, 0x3EAF, 0xCD6F, 0xCD6F, 0x0B72, 0xCD70, 0xCD70, 0x3EB0, + 0xCD71, 0xCD71, 0x0B73, 0xCD72, 0xCD77, 0x3EB1, 0xCD78, 0xCD78, 0x0B74, + 0xCD79, 0xCD87, 0x3EB7, 0xCD88, 0xCD88, 0x0B75, 0xCD89, 0xCD93, 0x3EC6, + 0xCD94, 0xCD95, 0x0B76, 0xCD96, 0xCD97, 0x3ED1, 0xCD98, 0xCD98, 0x0B78, + 0xCD99, 0xCD9B, 0x3ED3, 0xCD9C, 0xCD9C, 0x0B79, 0xCD9D, 0xCDA3, 0x3ED6, + 0xCDA4, 0xCDA5, 0x0B7A, 0xCDA6, 0xCDA6, 0x3EDD, 0xCDA7, 0xCDA7, 0x0B7C, + 0xCDA8, 0xCDA8, 0x3EDE, 0xCDA9, 0xCDA9, 0x0B7D, 0xCDAA, 0xCDAF, 0x3EDF, + 0xCDB0, 0xCDB0, 0x0B7E, 0xCDB1, 0xCDC3, 0x3EE5, 0xCDC4, 0xCDC4, 0x0B7F, + 0xCDC5, 0xCDCB, 0x3EF8, 0xCDCC, 0xCDCC, 0x0B80, 0xCDCD, 0xCDCF, 0x3EFF, + 0xCDD0, 0xCDD0, 0x0B81, 0xCDD1, 0xCDE7, 0x3F02, 0xCDE8, 0xCDE8, 0x0B82, + 0xCDE9, 0xCDEB, 0x3F19, 0xCDEC, 0xCDEC, 0x0B83, 0xCDED, 0xCDEF, 0x3F1C, + 0xCDF0, 0xCDF0, 0x0B84, 0xCDF1, 0xCDF7, 0x3F1F, 0xCDF8, 0xCDF9, 0x0B85, + 0xCDFA, 0xCDFA, 0x3F26, 0xCDFB, 0xCDFB, 0x0B87, 0xCDFC, 0xCDFC, 0x3F27, + 0xCDFD, 0xCDFD, 0x0B88, 0xCDFE, 0xCDFF, 0x3F28, 0xCE00, 0xCE03, 0x3F2A, + 0xCE04, 0xCE04, 0x0B89, 0xCE05, 0xCE07, 0x3F2E, 0xCE08, 0xCE08, 0x0B8A, + 0xCE09, 0xCE0B, 0x3F31, 0xCE0C, 0xCE0C, 0x0B8B, 0xCE0D, 0xCE13, 0x3F34, + 0xCE14, 0xCE14, 0x0B8C, 0xCE15, 0xCE18, 0x3F3B, 0xCE19, 0xCE19, 0x0B8D, + 0xCE1A, 0xCE1F, 0x3F3F, 0xCE20, 0xCE21, 0x0B8E, 0xCE22, 0xCE23, 0x3F45, + 0xCE24, 0xCE24, 0x0B90, 0xCE25, 0xCE27, 0x3F47, 0xCE28, 0xCE28, 0x0B91, + 0xCE29, 0xCE2F, 0x3F4A, 0xCE30, 0xCE31, 0x0B92, 0xCE32, 0xCE32, 0x3F51, + 0xCE33, 0xCE33, 0x0B94, 0xCE34, 0xCE34, 0x3F52, 0xCE35, 0xCE35, 0x0B95, + 0xCE36, 0xCE57, 0x3F53, 0xCE58, 0xCE59, 0x0B96, 0xCE5A, 0xCE5B, 0x3F75, + 0xCE5C, 0xCE5C, 0x0B98, 0xCE5D, 0xCE5E, 0x3F77, 0xCE5F, 0xCE61, 0x0B99, + 0xCE62, 0xCE67, 0x3F79, 0xCE68, 0xCE69, 0x0B9C, 0xCE6A, 0xCE6A, 0x3F7F, + 0xCE6B, 0xCE6B, 0x0B9E, 0xCE6C, 0xCE6C, 0x3F80, 0xCE6D, 0xCE6D, 0x0B9F, + 0xCE6E, 0xCE73, 0x3F81, 0xCE74, 0xCE75, 0x0BA0, 0xCE76, 0xCE77, 0x3F87, + 0xCE78, 0xCE78, 0x0BA2, 0xCE79, 0xCE7B, 0x3F89, 0xCE7C, 0xCE7C, 0x0BA3, + 0xCE7D, 0xCE83, 0x3F8C, 0xCE84, 0xCE85, 0x0BA4, 0xCE86, 0xCE86, 0x3F93, + 0xCE87, 0xCE87, 0x0BA6, 0xCE88, 0xCE88, 0x3F94, 0xCE89, 0xCE89, 0x0BA7, + 0xCE8A, 0xCE8F, 0x3F95, 0xCE90, 0xCE91, 0x0BA8, 0xCE92, 0xCE93, 0x3F9B, + 0xCE94, 0xCE94, 0x0BAA, 0xCE95, 0xCE97, 0x3F9D, 0xCE98, 0xCE98, 0x0BAB, + 0xCE99, 0xCE9F, 0x3FA0, 0xCEA0, 0xCEA1, 0x0BAC, 0xCEA2, 0xCEA2, 0x3FA7, + 0xCEA3, 0xCEA5, 0x0BAE, 0xCEA6, 0xCEAB, 0x3FA8, 0xCEAC, 0xCEAD, 0x0BB1, + 0xCEAE, 0xCEC0, 0x3FAE, 0xCEC1, 0xCEC1, 0x0BB3, 0xCEC2, 0xCEE3, 0x3FC1, + 0xCEE4, 0xCEE5, 0x0BB4, 0xCEE6, 0xCEE7, 0x3FE3, 0xCEE8, 0xCEE8, 0x0BB6, + 0xCEE9, 0xCEEA, 0x3FE5, 0xCEEB, 0xCEEC, 0x0BB7, 0xCEED, 0xCEF3, 0x3FE7, + 0xCEF4, 0xCEF5, 0x0BB9, 0xCEF6, 0xCEF6, 0x3FEE, 0xCEF7, 0xCEF9, 0x0BBB, + 0xCEFA, 0xCEFF, 0x3FEF, 0xCF00, 0xCF01, 0x0BBE, 0xCF02, 0xCF03, 0x3FF5, + 0xCF04, 0xCF04, 0x0BC0, 0xCF05, 0xCF07, 0x3FF7, 0xCF08, 0xCF08, 0x0BC1, + 0xCF09, 0xCF0F, 0x3FFA, 0xCF10, 0xCF11, 0x0BC2, 0xCF12, 0xCF12, 0x4001, + 0xCF13, 0xCF13, 0x0BC4, 0xCF14, 0xCF14, 0x4002, 0xCF15, 0xCF15, 0x0BC5, + 0xCF16, 0xCF1B, 0x4003, 0xCF1C, 0xCF1C, 0x0BC6, 0xCF1D, 0xCF1F, 0x4009, + 0xCF20, 0xCF20, 0x0BC7, 0xCF21, 0xCF23, 0x400C, 0xCF24, 0xCF24, 0x0BC8, + 0xCF25, 0xCF2B, 0x400F, 0xCF2C, 0xCF2D, 0x0BC9, 0xCF2E, 0xCF2E, 0x4016, + 0xCF2F, 0xCF31, 0x0BCB, 0xCF32, 0xCF37, 0x4017, 0xCF38, 0xCF38, 0x0BCE, + 0xCF39, 0xCF53, 0x401D, 0xCF54, 0xCF55, 0x0BCF, 0xCF56, 0xCF57, 0x4038, + 0xCF58, 0xCF58, 0x0BD1, 0xCF59, 0xCF5B, 0x403A, 0xCF5C, 0xCF5C, 0x0BD2, + 0xCF5D, 0xCF63, 0x403D, 0xCF64, 0xCF65, 0x0BD3, 0xCF66, 0xCF66, 0x4044, + 0xCF67, 0xCF67, 0x0BD5, 0xCF68, 0xCF68, 0x4045, 0xCF69, 0xCF69, 0x0BD6, + 0xCF6A, 0xCF6F, 0x4046, 0xCF70, 0xCF71, 0x0BD7, 0xCF72, 0xCF73, 0x404C, + 0xCF74, 0xCF74, 0x0BD9, 0xCF75, 0xCF77, 0x404E, 0xCF78, 0xCF78, 0x0BDA, + 0xCF79, 0xCF7F, 0x4051, 0xCF80, 0xCF80, 0x0BDB, 0xCF81, 0xCF84, 0x4058, + 0xCF85, 0xCF85, 0x0BDC, 0xCF86, 0xCF8B, 0x405C, 0xCF8C, 0xCF8C, 0x0BDD, + 0xCF8D, 0xCFA0, 0x4062, 0xCFA1, 0xCFA1, 0x0BDE, 0xCFA2, 0xCFA7, 0x4076, + 0xCFA8, 0xCFA8, 0x0BDF, 0xCFA9, 0xCFAF, 0x407C, 0xCFB0, 0xCFB0, 0x0BE0, + 0xCFB1, 0xCFC3, 0x4083, 0xCFC4, 0xCFC4, 0x0BE1, 0xCFC5, 0xCFDF, 0x4096, + 0xCFE0, 0xCFE1, 0x0BE2, 0xCFE2, 0xCFE3, 0x40B1, 0xCFE4, 0xCFE4, 0x0BE4, + 0xCFE5, 0xCFE7, 0x40B3, 0xCFE8, 0xCFE8, 0x0BE5, 0xCFE9, 0xCFEF, 0x40B6, + 0xCFF0, 0xCFF1, 0x0BE6, 0xCFF2, 0xCFF2, 0x40BD, 0xCFF3, 0xCFF3, 0x0BE8, + 0xCFF4, 0xCFF4, 0x40BE, 0xCFF5, 0xCFF5, 0x0BE9, 0xCFF6, 0xCFFB, 0x40BF, + 0xCFFC, 0xCFFC, 0x0BEA, 0xCFFD, 0xCFFF, 0x40C5, 0xD000, 0xD000, 0x0BEB, + 0xD001, 0xD003, 0x40C8, 0xD004, 0xD004, 0x0BEC, 0xD005, 0xD010, 0x40CB, + 0xD011, 0xD011, 0x0BED, 0xD012, 0xD017, 0x40D7, 0xD018, 0xD018, 0x0BEE, + 0xD019, 0xD02C, 0x40DD, 0xD02D, 0xD02D, 0x0BEF, 0xD02E, 0xD033, 0x40F1, + 0xD034, 0xD035, 0x0BF0, 0xD036, 0xD037, 0x40F7, 0xD038, 0xD038, 0x0BF2, + 0xD039, 0xD03B, 0x40F9, 0xD03C, 0xD03C, 0x0BF3, 0xD03D, 0xD043, 0x40FC, + 0xD044, 0xD045, 0x0BF4, 0xD046, 0xD046, 0x4103, 0xD047, 0xD047, 0x0BF6, + 0xD048, 0xD048, 0x4104, 0xD049, 0xD049, 0x0BF7, 0xD04A, 0xD04F, 0x4105, + 0xD050, 0xD050, 0x0BF8, 0xD051, 0xD053, 0x410B, 0xD054, 0xD054, 0x0BF9, + 0xD055, 0xD057, 0x410E, 0xD058, 0xD058, 0x0BFA, 0xD059, 0xD05F, 0x4111, + 0xD060, 0xD060, 0x0BFB, 0xD061, 0xD06B, 0x4118, 0xD06C, 0xD06D, 0x0BFC, + 0xD06E, 0xD06F, 0x4123, 0xD070, 0xD070, 0x0BFE, 0xD071, 0xD073, 0x4125, + 0xD074, 0xD074, 0x0BFF, 0xD075, 0xD07B, 0x4128, 0xD07C, 0xD07D, 0x0C00, + 0xD07E, 0xD080, 0x412F, 0xD081, 0xD081, 0x0C02, 0xD082, 0xD0A3, 0x4132, + 0xD0A4, 0xD0A5, 0x0C03, 0xD0A6, 0xD0A7, 0x4154, 0xD0A8, 0xD0A8, 0x0C05, + 0xD0A9, 0xD0AB, 0x4156, 0xD0AC, 0xD0AC, 0x0C06, 0xD0AD, 0xD0B3, 0x4159, + 0xD0B4, 0xD0B5, 0x0C07, 0xD0B6, 0xD0B6, 0x4160, 0xD0B7, 0xD0B7, 0x0C09, + 0xD0B8, 0xD0B8, 0x4161, 0xD0B9, 0xD0B9, 0x0C0A, 0xD0BA, 0xD0BF, 0x4162, + 0xD0C0, 0xD0C1, 0x0C0B, 0xD0C2, 0xD0C3, 0x4168, 0xD0C4, 0xD0C4, 0x0C0D, + 0xD0C5, 0xD0C7, 0x416A, 0xD0C8, 0xD0C9, 0x0C0E, 0xD0CA, 0xD0CF, 0x416D, + 0xD0D0, 0xD0D1, 0x0C10, 0xD0D2, 0xD0D2, 0x4173, 0xD0D3, 0xD0D5, 0x0C12, + 0xD0D6, 0xD0DB, 0x4174, 0xD0DC, 0xD0DD, 0x0C15, 0xD0DE, 0xD0DF, 0x417A, + 0xD0E0, 0xD0E0, 0x0C17, 0xD0E1, 0xD0E3, 0x417C, 0xD0E4, 0xD0E4, 0x0C18, + 0xD0E5, 0xD0EB, 0x417F, 0xD0EC, 0xD0ED, 0x0C19, 0xD0EE, 0xD0EE, 0x4186, + 0xD0EF, 0xD0F1, 0x0C1B, 0xD0F2, 0xD0F7, 0x4187, 0xD0F8, 0xD0F8, 0x0C1E, + 0xD0F9, 0xD0FF, 0x418D, 0xD100, 0xD10C, 0x4194, 0xD10D, 0xD10D, 0x0C1F, + 0xD10E, 0xD12F, 0x41A1, 0xD130, 0xD131, 0x0C20, 0xD132, 0xD133, 0x41C3, + 0xD134, 0xD134, 0x0C22, 0xD135, 0xD137, 0x41C5, 0xD138, 0xD138, 0x0C23, + 0xD139, 0xD139, 0x41C8, 0xD13A, 0xD13A, 0x0C24, 0xD13B, 0xD13F, 0x41C9, + 0xD140, 0xD141, 0x0C25, 0xD142, 0xD142, 0x41CE, 0xD143, 0xD145, 0x0C27, + 0xD146, 0xD14B, 0x41CF, 0xD14C, 0xD14D, 0x0C2A, 0xD14E, 0xD14F, 0x41D5, + 0xD150, 0xD150, 0x0C2C, 0xD151, 0xD153, 0x41D7, 0xD154, 0xD154, 0x0C2D, + 0xD155, 0xD15B, 0x41DA, 0xD15C, 0xD15D, 0x0C2E, 0xD15E, 0xD15E, 0x41E1, + 0xD15F, 0xD15F, 0x0C30, 0xD160, 0xD160, 0x41E2, 0xD161, 0xD161, 0x0C31, + 0xD162, 0xD167, 0x41E3, 0xD168, 0xD168, 0x0C32, 0xD169, 0xD16B, 0x41E9, + 0xD16C, 0xD16C, 0x0C33, 0xD16D, 0xD17B, 0x41EC, 0xD17C, 0xD17C, 0x0C34, + 0xD17D, 0xD183, 0x41FB, 0xD184, 0xD184, 0x0C35, 0xD185, 0xD187, 0x4202, + 0xD188, 0xD188, 0x0C36, 0xD189, 0xD19F, 0x4205, 0xD1A0, 0xD1A1, 0x0C37, + 0xD1A2, 0xD1A3, 0x421C, 0xD1A4, 0xD1A4, 0x0C39, 0xD1A5, 0xD1A7, 0x421E, + 0xD1A8, 0xD1A8, 0x0C3A, 0xD1A9, 0xD1AF, 0x4221, 0xD1B0, 0xD1B1, 0x0C3B, + 0xD1B2, 0xD1B2, 0x4228, 0xD1B3, 0xD1B3, 0x0C3D, 0xD1B4, 0xD1B4, 0x4229, + 0xD1B5, 0xD1B5, 0x0C3E, 0xD1B6, 0xD1B9, 0x422A, 0xD1BA, 0xD1BA, 0x0C3F, + 0xD1BB, 0xD1BB, 0x422E, 0xD1BC, 0xD1BC, 0x0C40, 0xD1BD, 0xD1BF, 0x422F, + 0xD1C0, 0xD1C0, 0x0C41, 0xD1C1, 0xD1D7, 0x4232, 0xD1D8, 0xD1D8, 0x0C42, + 0xD1D9, 0xD1F3, 0x4249, 0xD1F4, 0xD1F4, 0x0C43, 0xD1F5, 0xD1F7, 0x4264, + 0xD1F8, 0xD1F8, 0x0C44, 0xD1F9, 0xD1FF, 0x4267, 0xD200, 0xD206, 0x426E, + 0xD207, 0xD207, 0x0C45, 0xD208, 0xD208, 0x4275, 0xD209, 0xD209, 0x0C46, + 0xD20A, 0xD20F, 0x4276, 0xD210, 0xD210, 0x0C47, 0xD211, 0xD22B, 0x427C, + 0xD22C, 0xD22D, 0x0C48, 0xD22E, 0xD22F, 0x4297, 0xD230, 0xD230, 0x0C4A, + 0xD231, 0xD233, 0x4299, 0xD234, 0xD234, 0x0C4B, 0xD235, 0xD23B, 0x429C, + 0xD23C, 0xD23D, 0x0C4C, 0xD23E, 0xD23E, 0x42A3, 0xD23F, 0xD23F, 0x0C4E, + 0xD240, 0xD240, 0x42A4, 0xD241, 0xD241, 0x0C4F, 0xD242, 0xD247, 0x42A5, + 0xD248, 0xD248, 0x0C50, 0xD249, 0xD25B, 0x42AB, 0xD25C, 0xD25C, 0x0C51, + 0xD25D, 0xD263, 0x42BE, 0xD264, 0xD264, 0x0C52, 0xD265, 0xD27F, 0x42C5, + 0xD280, 0xD281, 0x0C53, 0xD282, 0xD283, 0x42E0, 0xD284, 0xD284, 0x0C55, + 0xD285, 0xD287, 0x42E2, 0xD288, 0xD288, 0x0C56, 0xD289, 0xD28F, 0x42E5, + 0xD290, 0xD291, 0x0C57, 0xD292, 0xD294, 0x42EC, 0xD295, 0xD295, 0x0C59, + 0xD296, 0xD29B, 0x42EF, 0xD29C, 0xD29C, 0x0C5A, 0xD29D, 0xD29F, 0x42F5, + 0xD2A0, 0xD2A0, 0x0C5B, 0xD2A1, 0xD2A3, 0x42F8, 0xD2A4, 0xD2A4, 0x0C5C, + 0xD2A5, 0xD2AB, 0x42FB, 0xD2AC, 0xD2AC, 0x0C5D, 0xD2AD, 0xD2B0, 0x4302, + 0xD2B1, 0xD2B1, 0x0C5E, 0xD2B2, 0xD2B7, 0x4306, 0xD2B8, 0xD2B9, 0x0C5F, + 0xD2BA, 0xD2BB, 0x430C, 0xD2BC, 0xD2BC, 0x0C61, 0xD2BD, 0xD2BE, 0x430E, + 0xD2BF, 0xD2C0, 0x0C62, 0xD2C1, 0xD2C1, 0x4310, 0xD2C2, 0xD2C2, 0x0C64, + 0xD2C3, 0xD2C7, 0x4311, 0xD2C8, 0xD2C9, 0x0C65, 0xD2CA, 0xD2CA, 0x4316, + 0xD2CB, 0xD2CB, 0x0C67, 0xD2CC, 0xD2D3, 0x4317, 0xD2D4, 0xD2D4, 0x0C68, + 0xD2D5, 0xD2D7, 0x431F, 0xD2D8, 0xD2D8, 0x0C69, 0xD2D9, 0xD2DB, 0x4322, + 0xD2DC, 0xD2DC, 0x0C6A, 0xD2DD, 0xD2E3, 0x4325, 0xD2E4, 0xD2E5, 0x0C6B, + 0xD2E6, 0xD2EF, 0x432C, 0xD2F0, 0xD2F1, 0x0C6D, 0xD2F2, 0xD2F3, 0x4336, + 0xD2F4, 0xD2F4, 0x0C6F, 0xD2F5, 0xD2F7, 0x4338, 0xD2F8, 0xD2F8, 0x0C70, + 0xD2F9, 0xD2FF, 0x433B, 0xD300, 0xD301, 0x0C71, 0xD302, 0xD302, 0x4342, + 0xD303, 0xD303, 0x0C73, 0xD304, 0xD304, 0x4343, 0xD305, 0xD305, 0x0C74, + 0xD306, 0xD30B, 0x4344, 0xD30C, 0xD30E, 0x0C75, 0xD30F, 0xD30F, 0x434A, + 0xD310, 0xD310, 0x0C78, 0xD311, 0xD313, 0x434B, 0xD314, 0xD314, 0x0C79, + 0xD315, 0xD315, 0x434E, 0xD316, 0xD316, 0x0C7A, 0xD317, 0xD31B, 0x434F, + 0xD31C, 0xD31D, 0x0C7B, 0xD31E, 0xD31E, 0x4354, 0xD31F, 0xD321, 0x0C7D, + 0xD322, 0xD324, 0x4355, 0xD325, 0xD325, 0x0C80, 0xD326, 0xD327, 0x4358, + 0xD328, 0xD329, 0x0C81, 0xD32A, 0xD32B, 0x435A, 0xD32C, 0xD32C, 0x0C83, + 0xD32D, 0xD32F, 0x435C, 0xD330, 0xD330, 0x0C84, 0xD331, 0xD337, 0x435F, + 0xD338, 0xD339, 0x0C85, 0xD33A, 0xD33A, 0x4366, 0xD33B, 0xD33D, 0x0C87, + 0xD33E, 0xD343, 0x4367, 0xD344, 0xD345, 0x0C8A, 0xD346, 0xD37B, 0x436D, + 0xD37C, 0xD37D, 0x0C8C, 0xD37E, 0xD37F, 0x43A3, 0xD380, 0xD380, 0x0C8E, + 0xD381, 0xD383, 0x43A5, 0xD384, 0xD384, 0x0C8F, 0xD385, 0xD38B, 0x43A8, + 0xD38C, 0xD38D, 0x0C90, 0xD38E, 0xD38E, 0x43AF, 0xD38F, 0xD391, 0x0C92, + 0xD392, 0xD397, 0x43B0, 0xD398, 0xD399, 0x0C95, 0xD39A, 0xD39B, 0x43B6, + 0xD39C, 0xD39C, 0x0C97, 0xD39D, 0xD39F, 0x43B8, 0xD3A0, 0xD3A0, 0x0C98, + 0xD3A1, 0xD3A7, 0x43BB, 0xD3A8, 0xD3A9, 0x0C99, 0xD3AA, 0xD3AA, 0x43C2, + 0xD3AB, 0xD3AB, 0x0C9B, 0xD3AC, 0xD3AC, 0x43C3, 0xD3AD, 0xD3AD, 0x0C9C, + 0xD3AE, 0xD3B3, 0x43C4, 0xD3B4, 0xD3B4, 0x0C9D, 0xD3B5, 0xD3B7, 0x43CA, + 0xD3B8, 0xD3B8, 0x0C9E, 0xD3B9, 0xD3BB, 0x43CD, 0xD3BC, 0xD3BC, 0x0C9F, + 0xD3BD, 0xD3C3, 0x43D0, 0xD3C4, 0xD3C5, 0x0CA0, 0xD3C6, 0xD3C7, 0x43D7, + 0xD3C8, 0xD3C9, 0x0CA2, 0xD3CA, 0xD3CF, 0x43D9, 0xD3D0, 0xD3D0, 0x0CA4, + 0xD3D1, 0xD3D7, 0x43DF, 0xD3D8, 0xD3D8, 0x0CA5, 0xD3D9, 0xD3E0, 0x43E6, + 0xD3E1, 0xD3E1, 0x0CA6, 0xD3E2, 0xD3E2, 0x43EE, 0xD3E3, 0xD3E3, 0x0CA7, + 0xD3E4, 0xD3EB, 0x43EF, 0xD3EC, 0xD3ED, 0x0CA8, 0xD3EE, 0xD3EF, 0x43F7, + 0xD3F0, 0xD3F0, 0x0CAA, 0xD3F1, 0xD3F3, 0x43F9, 0xD3F4, 0xD3F4, 0x0CAB, + 0xD3F5, 0xD3FB, 0x43FC, 0xD3FC, 0xD3FD, 0x0CAC, 0xD3FE, 0xD3FE, 0x4403, + 0xD3FF, 0xD3FF, 0x0CAE, 0xD400, 0xD400, 0x4404, 0xD401, 0xD401, 0x0CAF, + 0xD402, 0xD407, 0x4405, 0xD408, 0xD408, 0x0CB0, 0xD409, 0xD41C, 0x440B, + 0xD41D, 0xD41D, 0x0CB1, 0xD41E, 0xD43F, 0x441F, 0xD440, 0xD440, 0x0CB2, + 0xD441, 0xD443, 0x4441, 0xD444, 0xD444, 0x0CB3, 0xD445, 0xD45B, 0x4444, + 0xD45C, 0xD45C, 0x0CB4, 0xD45D, 0xD45F, 0x445B, 0xD460, 0xD460, 0x0CB5, + 0xD461, 0xD463, 0x445E, 0xD464, 0xD464, 0x0CB6, 0xD465, 0xD46C, 0x4461, + 0xD46D, 0xD46D, 0x0CB7, 0xD46E, 0xD46E, 0x4469, 0xD46F, 0xD46F, 0x0CB8, + 0xD470, 0xD477, 0x446A, 0xD478, 0xD479, 0x0CB9, 0xD47A, 0xD47B, 0x4472, + 0xD47C, 0xD47C, 0x0CBB, 0xD47D, 0xD47E, 0x4474, 0xD47F, 0xD480, 0x0CBC, + 0xD481, 0xD481, 0x4476, 0xD482, 0xD482, 0x0CBE, 0xD483, 0xD487, 0x4477, + 0xD488, 0xD489, 0x0CBF, 0xD48A, 0xD48A, 0x447C, 0xD48B, 0xD48B, 0x0CC1, + 0xD48C, 0xD48C, 0x447D, 0xD48D, 0xD48D, 0x0CC2, 0xD48E, 0xD493, 0x447E, + 0xD494, 0xD494, 0x0CC3, 0xD495, 0xD4A8, 0x4484, 0xD4A9, 0xD4A9, 0x0CC4, + 0xD4AA, 0xD4CB, 0x4498, 0xD4CC, 0xD4CC, 0x0CC5, 0xD4CD, 0xD4CF, 0x44BA, + 0xD4D0, 0xD4D0, 0x0CC6, 0xD4D1, 0xD4D3, 0x44BD, 0xD4D4, 0xD4D4, 0x0CC7, + 0xD4D5, 0xD4DB, 0x44C0, 0xD4DC, 0xD4DC, 0x0CC8, 0xD4DD, 0xD4DE, 0x44C7, + 0xD4DF, 0xD4DF, 0x0CC9, 0xD4E0, 0xD4E7, 0x44C9, 0xD4E8, 0xD4E8, 0x0CCA, + 0xD4E9, 0xD4EB, 0x44D1, 0xD4EC, 0xD4EC, 0x0CCB, 0xD4ED, 0xD4EF, 0x44D4, + 0xD4F0, 0xD4F0, 0x0CCC, 0xD4F1, 0xD4F7, 0x44D7, 0xD4F8, 0xD4F8, 0x0CCD, + 0xD4F9, 0xD4FA, 0x44DE, 0xD4FB, 0xD4FB, 0x0CCE, 0xD4FC, 0xD4FC, 0x44E0, + 0xD4FD, 0xD4FD, 0x0CCF, 0xD4FE, 0xD4FF, 0x44E1, 0xD500, 0xD503, 0x44E3, + 0xD504, 0xD504, 0x0CD0, 0xD505, 0xD507, 0x44E7, 0xD508, 0xD508, 0x0CD1, + 0xD509, 0xD50B, 0x44EA, 0xD50C, 0xD50C, 0x0CD2, 0xD50D, 0xD513, 0x44ED, + 0xD514, 0xD515, 0x0CD3, 0xD516, 0xD516, 0x44F4, 0xD517, 0xD517, 0x0CD5, + 0xD518, 0xD53B, 0x44F5, 0xD53C, 0xD53D, 0x0CD6, 0xD53E, 0xD53F, 0x4519, + 0xD540, 0xD540, 0x0CD8, 0xD541, 0xD543, 0x451B, 0xD544, 0xD544, 0x0CD9, + 0xD545, 0xD54B, 0x451E, 0xD54C, 0xD54D, 0x0CDA, 0xD54E, 0xD54E, 0x4525, + 0xD54F, 0xD54F, 0x0CDC, 0xD550, 0xD550, 0x4526, 0xD551, 0xD551, 0x0CDD, + 0xD552, 0xD557, 0x4527, 0xD558, 0xD559, 0x0CDE, 0xD55A, 0xD55B, 0x452D, + 0xD55C, 0xD55C, 0x0CE0, 0xD55D, 0xD55F, 0x452F, 0xD560, 0xD560, 0x0CE1, + 0xD561, 0xD564, 0x4532, 0xD565, 0xD565, 0x0CE2, 0xD566, 0xD567, 0x4536, + 0xD568, 0xD569, 0x0CE3, 0xD56A, 0xD56A, 0x4538, 0xD56B, 0xD56B, 0x0CE5, + 0xD56C, 0xD56C, 0x4539, 0xD56D, 0xD56D, 0x0CE6, 0xD56E, 0xD573, 0x453A, + 0xD574, 0xD575, 0x0CE7, 0xD576, 0xD577, 0x4540, 0xD578, 0xD578, 0x0CE9, + 0xD579, 0xD57B, 0x4542, 0xD57C, 0xD57C, 0x0CEA, 0xD57D, 0xD583, 0x4545, + 0xD584, 0xD585, 0x0CEB, 0xD586, 0xD586, 0x454C, 0xD587, 0xD589, 0x0CED, + 0xD58A, 0xD58F, 0x454D, 0xD590, 0xD590, 0x0CF0, 0xD591, 0xD5A4, 0x4553, + 0xD5A5, 0xD5A5, 0x0CF1, 0xD5A6, 0xD5C7, 0x4567, 0xD5C8, 0xD5C9, 0x0CF2, + 0xD5CA, 0xD5CB, 0x4589, 0xD5CC, 0xD5CC, 0x0CF4, 0xD5CD, 0xD5CF, 0x458B, + 0xD5D0, 0xD5D0, 0x0CF5, 0xD5D1, 0xD5D1, 0x458E, 0xD5D2, 0xD5D2, 0x0CF6, + 0xD5D3, 0xD5D7, 0x458F, 0xD5D8, 0xD5D9, 0x0CF7, 0xD5DA, 0xD5DA, 0x4594, + 0xD5DB, 0xD5DB, 0x0CF9, 0xD5DC, 0xD5DC, 0x4595, 0xD5DD, 0xD5DD, 0x0CFA, + 0xD5DE, 0xD5E3, 0x4596, 0xD5E4, 0xD5E5, 0x0CFB, 0xD5E6, 0xD5E7, 0x459C, + 0xD5E8, 0xD5E8, 0x0CFD, 0xD5E9, 0xD5EB, 0x459E, 0xD5EC, 0xD5EC, 0x0CFE, + 0xD5ED, 0xD5F3, 0x45A1, 0xD5F4, 0xD5F5, 0x0CFF, 0xD5F6, 0xD5F6, 0x45A8, + 0xD5F7, 0xD5F7, 0x0D01, 0xD5F8, 0xD5F8, 0x45A9, 0xD5F9, 0xD5F9, 0x0D02, + 0xD5FA, 0xD5FF, 0x45AA, 0xD600, 0xD601, 0x0D03, 0xD602, 0xD603, 0x45B0, + 0xD604, 0xD604, 0x0D05, 0xD605, 0xD607, 0x45B2, 0xD608, 0xD608, 0x0D06, + 0xD609, 0xD60F, 0x45B5, 0xD610, 0xD611, 0x0D07, 0xD612, 0xD612, 0x45BC, + 0xD613, 0xD615, 0x0D09, 0xD616, 0xD61B, 0x45BD, 0xD61C, 0xD61C, 0x0D0C, + 0xD61D, 0xD61F, 0x45C3, 0xD620, 0xD620, 0x0D0D, 0xD621, 0xD623, 0x45C6, + 0xD624, 0xD624, 0x0D0E, 0xD625, 0xD62C, 0x45C9, 0xD62D, 0xD62D, 0x0D0F, + 0xD62E, 0xD637, 0x45D1, 0xD638, 0xD639, 0x0D10, 0xD63A, 0xD63B, 0x45DB, + 0xD63C, 0xD63C, 0x0D12, 0xD63D, 0xD63F, 0x45DD, 0xD640, 0xD640, 0x0D13, + 0xD641, 0xD644, 0x45E0, 0xD645, 0xD645, 0x0D14, 0xD646, 0xD647, 0x45E4, + 0xD648, 0xD649, 0x0D15, 0xD64A, 0xD64A, 0x45E6, 0xD64B, 0xD64B, 0x0D17, + 0xD64C, 0xD64C, 0x45E7, 0xD64D, 0xD64D, 0x0D18, 0xD64E, 0xD650, 0x45E8, + 0xD651, 0xD651, 0x0D19, 0xD652, 0xD653, 0x45EB, 0xD654, 0xD655, 0x0D1A, + 0xD656, 0xD657, 0x45ED, 0xD658, 0xD658, 0x0D1C, 0xD659, 0xD65B, 0x45EF, + 0xD65C, 0xD65C, 0x0D1D, 0xD65D, 0xD666, 0x45F2, 0xD667, 0xD667, 0x0D1E, + 0xD668, 0xD668, 0x45FC, 0xD669, 0xD669, 0x0D1F, 0xD66A, 0xD66F, 0x45FD, + 0xD670, 0xD671, 0x0D20, 0xD672, 0xD673, 0x4603, 0xD674, 0xD674, 0x0D22, + 0xD675, 0xD682, 0x4605, 0xD683, 0xD683, 0x0D23, 0xD684, 0xD684, 0x4613, + 0xD685, 0xD685, 0x0D24, 0xD686, 0xD68B, 0x4614, 0xD68C, 0xD68D, 0x0D25, + 0xD68E, 0xD68F, 0x461A, 0xD690, 0xD690, 0x0D27, 0xD691, 0xD693, 0x461C, + 0xD694, 0xD694, 0x0D28, 0xD695, 0xD69C, 0x461F, 0xD69D, 0xD69D, 0x0D29, + 0xD69E, 0xD69E, 0x4627, 0xD69F, 0xD69F, 0x0D2A, 0xD6A0, 0xD6A0, 0x4628, + 0xD6A1, 0xD6A1, 0x0D2B, 0xD6A2, 0xD6A7, 0x4629, 0xD6A8, 0xD6A8, 0x0D2C, + 0xD6A9, 0xD6AB, 0x462F, 0xD6AC, 0xD6AC, 0x0D2D, 0xD6AD, 0xD6AF, 0x4632, + 0xD6B0, 0xD6B0, 0x0D2E, 0xD6B1, 0xD6B8, 0x4635, 0xD6B9, 0xD6B9, 0x0D2F, + 0xD6BA, 0xD6BA, 0x463D, 0xD6BB, 0xD6BB, 0x0D30, 0xD6BC, 0xD6C3, 0x463E, + 0xD6C4, 0xD6C5, 0x0D31, 0xD6C6, 0xD6C7, 0x4646, 0xD6C8, 0xD6C8, 0x0D33, + 0xD6C9, 0xD6CB, 0x4648, 0xD6CC, 0xD6CC, 0x0D34, 0xD6CD, 0xD6D0, 0x464B, + 0xD6D1, 0xD6D1, 0x0D35, 0xD6D2, 0xD6D3, 0x464F, 0xD6D4, 0xD6D4, 0x0D36, + 0xD6D5, 0xD6D6, 0x4651, 0xD6D7, 0xD6D7, 0x0D37, 0xD6D8, 0xD6D8, 0x4653, + 0xD6D9, 0xD6D9, 0x0D38, 0xD6DA, 0xD6DF, 0x4654, 0xD6E0, 0xD6E0, 0x0D39, + 0xD6E1, 0xD6E3, 0x465A, 0xD6E4, 0xD6E4, 0x0D3A, 0xD6E5, 0xD6E7, 0x465D, + 0xD6E8, 0xD6E8, 0x0D3B, 0xD6E9, 0xD6EF, 0x4660, 0xD6F0, 0xD6F0, 0x0D3C, + 0xD6F1, 0xD6F4, 0x4667, 0xD6F5, 0xD6F5, 0x0D3D, 0xD6F6, 0xD6FB, 0x466B, + 0xD6FC, 0xD6FD, 0x0D3E, 0xD6FE, 0xD6FF, 0x4671, 0xD700, 0xD700, 0x0D40, + 0xD701, 0xD703, 0x4673, 0xD704, 0xD704, 0x0D41, 0xD705, 0xD710, 0x4676, + 0xD711, 0xD711, 0x0D42, 0xD712, 0xD717, 0x4682, 0xD718, 0xD719, 0x0D43, + 0xD71A, 0xD71B, 0x4688, 0xD71C, 0xD71C, 0x0D45, 0xD71D, 0xD71F, 0x468A, + 0xD720, 0xD720, 0x0D46, 0xD721, 0xD727, 0x468D, 0xD728, 0xD729, 0x0D47, + 0xD72A, 0xD72A, 0x4694, 0xD72B, 0xD72B, 0x0D49, 0xD72C, 0xD72C, 0x4695, + 0xD72D, 0xD72D, 0x0D4A, 0xD72E, 0xD733, 0x4696, 0xD734, 0xD735, 0x0D4B, + 0xD736, 0xD737, 0x469C, 0xD738, 0xD738, 0x0D4D, 0xD739, 0xD73B, 0x469E, + 0xD73C, 0xD73C, 0x0D4E, 0xD73D, 0xD743, 0x46A1, 0xD744, 0xD744, 0x0D4F, + 0xD745, 0xD746, 0x46A8, 0xD747, 0xD747, 0x0D50, 0xD748, 0xD748, 0x46AA, + 0xD749, 0xD749, 0x0D51, 0xD74A, 0xD74F, 0x46AB, 0xD750, 0xD751, 0x0D52, + 0xD752, 0xD753, 0x46B1, 0xD754, 0xD754, 0x0D54, 0xD755, 0xD755, 0x46B3, + 0xD756, 0xD759, 0x0D55, 0xD75A, 0xD75F, 0x46B4, 0xD760, 0xD761, 0x0D59, + 0xD762, 0xD762, 0x46BA, 0xD763, 0xD763, 0x0D5B, 0xD764, 0xD764, 0x46BB, + 0xD765, 0xD765, 0x0D5C, 0xD766, 0xD768, 0x46BC, 0xD769, 0xD769, 0x0D5D, + 0xD76A, 0xD76B, 0x46BF, 0xD76C, 0xD76C, 0x0D5E, 0xD76D, 0xD76F, 0x46C1, + 0xD770, 0xD770, 0x0D5F, 0xD771, 0xD773, 0x46C4, 0xD774, 0xD774, 0x0D60, + 0xD775, 0xD77B, 0x46C7, 0xD77C, 0xD77D, 0x0D61, 0xD77E, 0xD780, 0x46CE, + 0xD781, 0xD781, 0x0D63, 0xD782, 0xD787, 0x46D1, 0xD788, 0xD789, 0x0D64, + 0xD78A, 0xD78B, 0x46D7, 0xD78C, 0xD78C, 0x0D66, 0xD78D, 0xD78F, 0x46D9, + 0xD790, 0xD790, 0x0D67, 0xD791, 0xD797, 0x46DC, 0xD798, 0xD799, 0x0D68, + 0xD79A, 0xD79A, 0x46E3, 0xD79B, 0xD79B, 0x0D6A, 0xD79C, 0xD79C, 0x46E4, + 0xD79D, 0xD79D, 0x0D6B, 0xD79E, 0xD7A3, 0x46E5, 0xF900, 0xF900, 0x1014, + 0xF901, 0xF901, 0x0E5E, 0xF902, 0xF902, 0x1B8D, 0xF903, 0xF903, 0x0D84, + 0xF904, 0xF904, 0x1EDC, 0xF905, 0xF905, 0x0EDA, 0xF906, 0xF906, 0x0F3E, + 0xF907, 0xF907, 0x0F6A, 0xF908, 0xF908, 0x0F6A, 0xF909, 0xF909, 0x0E7C, + 0xF90A, 0xF90A, 0x1023, 0xF90B, 0xF90B, 0x1116, 0xF90C, 0xF90C, 0x103C, + 0xF90D, 0xF913, 0x1117, 0xF914, 0xF914, 0x16A8, 0xF915, 0xF917, 0x111E, + 0xF918, 0xF91D, 0x1122, 0xF91E, 0xF920, 0x112A, 0xF921, 0xF921, 0x112F, + 0xF922, 0xF922, 0x1133, 0xF923, 0xF924, 0x1136, 0xF925, 0xF92B, 0x1139, + 0xF92C, 0xF92D, 0x1143, 0xF92E, 0xF92E, 0x1148, 0xF92F, 0xF92F, 0x119F, + 0xF930, 0xF931, 0x11A1, 0xF932, 0xF937, 0x11A5, 0xF938, 0xF93A, 0x11AC, + 0xF93B, 0xF940, 0x11B0, 0xF941, 0xF943, 0x11B7, 0xF944, 0xF945, 0x11BD, + 0xF946, 0xF948, 0x11C1, 0xF949, 0xF949, 0x11C6, 0xF94A, 0xF94A, 0x11D4, + 0xF94B, 0xF94E, 0x11D6, 0xF94F, 0xF950, 0x11DB, 0xF951, 0xF951, 0x11E0, + 0xF952, 0xF955, 0x11FC, 0xF956, 0xF959, 0x1201, 0xF95A, 0xF95A, 0x10DE, + 0xF95B, 0xF95B, 0x1028, 0xF95C, 0xF95C, 0x16A8, 0xF95D, 0xF95D, 0x102B, + 0xF95E, 0xF95E, 0x1060, 0xF95F, 0xF95F, 0x1047, 0xF960, 0xF960, 0x104C, + 0xF961, 0xF961, 0x15B0, 0xF962, 0xF962, 0x1918, 0xF963, 0xF963, 0x141F, + 0xF964, 0xF964, 0x133A, 0xF965, 0xF965, 0x1D5E, 0xF966, 0xF966, 0x13D7, + 0xF967, 0xF967, 0x13F5, 0xF968, 0xF968, 0x1DB7, 0xF969, 0xF969, 0x15D0, + 0xF96A, 0xF96A, 0x14F7, 0xF96B, 0xF96B, 0x1BAB, 0xF96C, 0xF96C, 0x14F2, + 0xF96D, 0xF96D, 0x156D, 0xF96E, 0xF96E, 0x1771, 0xF96F, 0xF96F, 0x1554, + 0xF970, 0xF970, 0x14C5, 0xF971, 0xF971, 0x1B61, 0xF972, 0xF972, 0x1CCA, + 0xF973, 0xF973, 0x162E, 0xF974, 0xF974, 0x16F2, 0xF975, 0xF977, 0x1149, + 0xF978, 0xF97A, 0x114D, 0xF97B, 0xF97D, 0x1153, 0xF97E, 0xF97E, 0x1157, + 0xF97F, 0xF980, 0x115A, 0xF981, 0xF981, 0x103F, 0xF982, 0xF982, 0x115C, + 0xF983, 0xF983, 0x115F, 0xF984, 0xF985, 0x1161, 0xF986, 0xF986, 0x1165, + 0xF987, 0xF98C, 0x1167, 0xF98D, 0xF98D, 0x116F, 0xF98E, 0xF98E, 0x1040, + 0xF98F, 0xF990, 0x1171, 0xF991, 0xF991, 0x1041, 0xF992, 0xF994, 0x1174, + 0xF995, 0xF995, 0x1042, 0xF996, 0xF997, 0x1177, 0xF998, 0xF998, 0x117A, + 0xF999, 0xF999, 0x1179, 0xF99A, 0xF99B, 0x117B, 0xF99C, 0xF99D, 0x117E, + 0xF99E, 0xF99E, 0x192F, 0xF99F, 0xF9A0, 0x1181, 0xF9A1, 0xF9A1, 0x1554, + 0xF9A2, 0xF9A2, 0x1183, 0xF9A3, 0xF9A3, 0x1043, 0xF9A4, 0xF9A4, 0x1046, + 0xF9A5, 0xF9A5, 0x1185, 0xF9A6, 0xF9A8, 0x1187, 0xF9A9, 0xF9A9, 0x118B, + 0xF9AA, 0xF9AA, 0x1047, 0xF9AB, 0xF9AD, 0x118D, 0xF9AE, 0xF9AE, 0x1E67, + 0xF9AF, 0xF9AF, 0x1191, 0xF9B0, 0xF9B0, 0x1193, 0xF9B1, 0xF9B4, 0x1195, + 0xF9B5, 0xF9B5, 0x119A, 0xF9B6, 0xF9B8, 0x119C, 0xF9B9, 0xF9B9, 0x16A5, + 0xF9BA, 0xF9BC, 0x11C7, 0xF9BD, 0xF9BD, 0x1054, 0xF9BE, 0xF9BE, 0x11CB, + 0xF9BF, 0xF9BF, 0x16A8, 0xF9C0, 0xF9C1, 0x11CC, 0xF9C2, 0xF9C3, 0x11D0, + 0xF9C4, 0xF9C4, 0x11D3, 0xF9C5, 0xF9C5, 0x1F34, 0xF9C6, 0xF9C6, 0x17EB, + 0xF9C7, 0xF9C7, 0x11E1, 0xF9C8, 0xF9C8, 0x1057, 0xF9C9, 0xF9C9, 0x11E3, + 0xF9CA, 0xF9CB, 0x11E5, 0xF9CC, 0xF9CC, 0x11E8, 0xF9CD, 0xF9CD, 0x11EA, + 0xF9CE, 0xF9CE, 0x11EC, 0xF9CF, 0xF9CF, 0x1058, 0xF9D0, 0xF9D3, 0x11EE, + 0xF9D4, 0xF9D6, 0x11F3, 0xF9D7, 0xF9DA, 0x11F7, 0xF9DB, 0xF9DB, 0x15B0, + 0xF9DC, 0xF9DC, 0x11FB, 0xF9DD, 0xF9DD, 0x1206, 0xF9DE, 0xF9DE, 0x1208, + 0xF9DF, 0xF9DF, 0x120A, 0xF9E0, 0xF9E0, 0x173E, 0xF9E1, 0xF9E2, 0x120C, + 0xF9E3, 0xF9E3, 0x105B, 0xF9E4, 0xF9E4, 0x1211, 0xF9E5, 0xF9E5, 0x1213, + 0xF9E6, 0xF9E6, 0x1215, 0xF9E7, 0xF9E9, 0x1218, 0xF9EA, 0xF9EA, 0x121C, + 0xF9EB, 0xF9EC, 0x105C, 0xF9ED, 0xF9ED, 0x121E, 0xF9EE, 0xF9F0, 0x1220, + 0xF9F1, 0xF9F5, 0x1224, 0xF9F6, 0xF9F6, 0x122A, 0xF9F7, 0xF9F9, 0x122D, + 0xF9FA, 0xF9FA, 0x14E7, 0xF9FB, 0xF9FB, 0x195E, 0xF9FC, 0xF9FC, 0x1663, + 0xF9FD, 0xF9FD, 0x168B, 0xF9FE, 0xF9FE, 0x105F, 0xF9FF, 0xF9FF, 0x1954, + 0xFA00, 0xFA00, 0x1A1C, 0xFA01, 0xFA01, 0x10B7, 0xFA02, 0xFA02, 0x1BE3, + 0xFA03, 0xFA03, 0x1097, 0xFA04, 0xFA04, 0x10AA, 0xFA05, 0xFA05, 0x10F4, + 0xFA06, 0xFA06, 0x1D94, 0xFA07, 0xFA07, 0x13E0, 0xFA08, 0xFA08, 0x1E1D, + 0xFA09, 0xFA09, 0x0DE6, 0xFA0A, 0xFA0A, 0x0E3C, 0xFA0B, 0xFA0B, 0x0EE7, + 0xFF01, 0xFF3B, 0x0108, 0xFF3C, 0xFF3C, 0x0070, 0xFF3D, 0xFF5D, 0x0144, + 0xFF5E, 0xFF5E, 0x0071, 0xFFE0, 0xFFE1, 0x008F, 0xFFE2, 0xFFE2, 0x00C2, + 0xFFE3, 0xFFE3, 0x0165, 0xFFE5, 0xFFE5, 0x0091, 0xFFE6, 0xFFE6, 0x0143, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/UniKS-UCS2-V_1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/UniKS-UCS2-V_1.cpp new file mode 100644 index 000000000000..46759c51a42b --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/UniKS-UCS2-V_1.cpp @@ -0,0 +1,16 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Korea1/cmaps_korea1.h" + +const uint16_t g_FXCMAP_UniKS_UCS2_V_1[18 * 3] = { + 0x2013, 0x2014, 0x1F7B, 0x2016, 0x2016, 0x1F7D, 0x2025, 0x2025, 0x1F7A, + 0x3001, 0x3002, 0x1F78, 0x3008, 0x3011, 0x1F81, 0x3013, 0x3013, 0x1F8B, + 0x3014, 0x3015, 0x1F7F, 0xFF01, 0xFF01, 0x1F8C, 0xFF08, 0xFF09, 0x1F8D, + 0xFF0C, 0xFF0C, 0x1F8F, 0xFF0E, 0xFF0E, 0x1F90, 0xFF1A, 0xFF1F, 0x1F91, + 0xFF3B, 0xFF3B, 0x1F97, 0xFF3D, 0xFF3D, 0x1F98, 0xFF3F, 0xFF3F, 0x1F99, + 0xFF5B, 0xFF5D, 0x1F9A, 0xFF5E, 0xFF5E, 0x1F7E, 0xFFE3, 0xFFE3, 0x1F9D, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/UniKS-UTF16-H_0.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/UniKS-UTF16-H_0.cpp new file mode 100644 index 000000000000..21018059f73f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/UniKS-UTF16-H_0.cpp @@ -0,0 +1,46 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Korea1/cmaps_korea1.h" + +const uint16_t g_FXCMAP_UniKS_UTF16_H_0[158 * 2] = { + 0x00A9, 0x0062, 0x2010, 0x0061, 0x20A9, 0x0060, 0x2F00, 0x193C, 0x2F04, + 0x18EC, 0x2F06, 0x190D, 0x2F08, 0x192B, 0x2F0A, 0x194D, 0x2F0B, 0x1D4B, + 0x2F11, 0x10AE, 0x2F12, 0x116A, 0x2F14, 0x143F, 0x2F17, 0x168C, 0x2F18, + 0x13D5, 0x2F1C, 0x1839, 0x2F1D, 0x0F3D, 0x2F1F, 0x1D1B, 0x2F20, 0x1487, + 0x2F23, 0x151B, 0x2F24, 0x109D, 0x2F25, 0x103F, 0x2F26, 0x1958, 0x2F28, + 0x1C4F, 0x2F29, 0x1580, 0x2F2B, 0x1641, 0x2F2D, 0x14B9, 0x2F2F, 0x0ECF, + 0x2F30, 0x0FED, 0x2F31, 0x0E14, 0x2F32, 0x0D99, 0x2F38, 0x0F7C, 0x2F3C, + 0x1684, 0x2F3D, 0x0EDC, 0x2F3E, 0x1E80, 0x2F3F, 0x15CC, 0x2F40, 0x1B27, + 0x2F42, 0x12E8, 0x2F43, 0x10FD, 0x2F44, 0x0FBB, 0x2F45, 0x1356, 0x2F46, + 0x12D3, 0x2F47, 0x1940, 0x2F48, 0x17ED, 0x2F49, 0x1889, 0x2F4A, 0x12B4, + 0x2F4B, 0x1F5B, 0x2F4C, 0x1B2C, 0x2F4F, 0x12D6, 0x2F50, 0x144C, 0x2F51, + 0x12A8, 0x2F52, 0x168E, 0x2F54, 0x15D3, 0x2F55, 0x1EBB, 0x2F56, 0x1A93, + 0x2F57, 0x1409, 0x2F58, 0x1F1A, 0x2F5A, 0x1D61, 0x2F5B, 0x1696, 0x2F5C, + 0x1842, 0x2F5D, 0x0E37, 0x2F5E, 0x1E3D, 0x2F5F, 0x17C1, 0x2F60, 0x0EDE, + 0x2F61, 0x17D4, 0x2F62, 0x0DC1, 0x2F63, 0x14FA, 0x2F64, 0x182D, 0x2F65, + 0x1A08, 0x2F66, 0x1DBA, 0x2F69, 0x1381, 0x2F6A, 0x1DB0, 0x2F6B, 0x1293, + 0x2F6C, 0x12B7, 0x2F6D, 0x12AD, 0x2F6E, 0x164D, 0x2F6F, 0x1525, 0x2F70, + 0x164E, 0x2F72, 0x1EBE, 0x2F73, 0x1E4B, 0x2F74, 0x122D, 0x2F75, 0x1AF4, + 0x2F76, 0x12FF, 0x2F78, 0x140C, 0x2F7A, 0x1708, 0x2F7B, 0x184A, 0x2F7C, + 0x11A7, 0x2F7D, 0x191B, 0x2F7F, 0x191C, 0x2F80, 0x18E0, 0x2F81, 0x18D5, + 0x2F82, 0x1675, 0x2F83, 0x1966, 0x2F84, 0x1B37, 0x2F85, 0x0F5A, 0x2F86, + 0x1550, 0x2F87, 0x1BF6, 0x2F88, 0x1AE8, 0x2F89, 0x0DA8, 0x2F8A, 0x14F8, + 0x2F8B, 0x1C40, 0x2F8E, 0x1E4C, 0x2F8F, 0x1E1D, 0x2F90, 0x1909, 0x2F92, + 0x0E3C, 0x2F93, 0x0D92, 0x2F94, 0x1721, 0x2F95, 0x0EBC, 0x2F96, 0x1103, + 0x2F97, 0x1656, 0x2F99, 0x1D58, 0x2F9A, 0x19EC, 0x2F9B, 0x1AEC, 0x2F9C, + 0x1AAE, 0x2F9D, 0x167B, 0x2F9E, 0x1B8D, 0x2F9F, 0x167C, 0x2FA0, 0x1B61, + 0x2FA2, 0x18F5, 0x2FA3, 0x18D0, 0x2FA5, 0x121A, 0x2FA6, 0x1023, 0x2FA7, + 0x19A8, 0x2FA8, 0x12EE, 0x2FA9, 0x141B, 0x2FAC, 0x1853, 0x2FAD, 0x1C23, + 0x2FAE, 0x1464, 0x2FAF, 0x1288, 0x2FB0, 0x1E35, 0x2FB1, 0x18A3, 0x2FB3, + 0x18F1, 0x2FB4, 0x1E4D, 0x2FB5, 0x1DAB, 0x2FB6, 0x1465, 0x2FB7, 0x1665, + 0x2FB8, 0x15F9, 0x2FB9, 0x1E26, 0x2FBA, 0x1235, 0x2FBB, 0x0EC9, 0x2FBC, + 0x0EB5, 0x2FC1, 0x0F99, 0x2FC2, 0x1716, 0x2FC3, 0x1AAB, 0x2FC4, 0x11AF, + 0x2FC5, 0x11B5, 0x2FC6, 0x1276, 0x2FC7, 0x1237, 0x2FC8, 0x1EF7, 0x2FC9, + 0x1519, 0x2FCA, 0x1F52, 0x2FCD, 0x1A66, 0x2FCE, 0x0EB6, 0x2FCF, 0x151A, + 0x2FD0, 0x1466, 0x2FD1, 0x1A7D, 0x2FD2, 0x1CBF, 0x2FD3, 0x11D3, 0x2FD4, + 0x0F6A, +}; diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/cmaps_korea1.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/cmaps_korea1.cpp new file mode 100644 index 000000000000..5e88b3ba17fb --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/cmaps_korea1.cpp @@ -0,0 +1,50 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/Korea1/cmaps_korea1.h" + +#include "core/fpdfapi/cmaps/cmap_int.h" +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/font/font_int.h" +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fxcrt/fx_basic.h" + +static const FXCMAP_CMap g_FXCMAP_Korea1_cmaps[] = { + {"KSC-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_KSC_EUC_H_0, 467, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"KSC-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_KSC_EUC_V_0, 16, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"KSCms-UHC-H", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_H_1, 675, + FXCMAP_CMap::None, nullptr, 0, -2}, + {"KSCms-UHC-V", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_V_1, 16, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"KSCms-UHC-HW-H", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_HW_H_1, 675, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"KSCms-UHC-HW-V", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_HW_V_1, 16, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"KSCpc-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_KSCpc_EUC_H_0, 509, + FXCMAP_CMap::None, nullptr, 0, -6}, + {"UniKS-UCS2-H", FXCMAP_CMap::Range, g_FXCMAP_UniKS_UCS2_H_1, 8394, + FXCMAP_CMap::None, nullptr, 0, 0}, + {"UniKS-UCS2-V", FXCMAP_CMap::Range, g_FXCMAP_UniKS_UCS2_V_1, 18, + FXCMAP_CMap::None, nullptr, 0, -1}, + {"UniKS-UTF16-H", FXCMAP_CMap::Single, g_FXCMAP_UniKS_UTF16_H_0, 158, + FXCMAP_CMap::None, nullptr, 0, -2}, + {"UniKS-UTF16-V", FXCMAP_CMap::Range, g_FXCMAP_UniKS_UCS2_V_1, 18, + FXCMAP_CMap::None, nullptr, 0, -1}, +}; + +void CPDF_ModuleMgr::LoadEmbeddedKorea1CMaps() { + CPDF_FontGlobals* pFontGlobals = + CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); + pFontGlobals->m_EmbeddedCharsets[CIDSET_KOREA1].m_pMapList = + g_FXCMAP_Korea1_cmaps; + pFontGlobals->m_EmbeddedCharsets[CIDSET_KOREA1].m_Count = + FX_ArraySize(g_FXCMAP_Korea1_cmaps); + pFontGlobals->m_EmbeddedToUnicodes[CIDSET_KOREA1].m_pMap = + g_FXCMAP_Korea1CID2Unicode_2; + pFontGlobals->m_EmbeddedToUnicodes[CIDSET_KOREA1].m_Count = 18352; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/cmaps_korea1.h b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/cmaps_korea1.h new file mode 100644 index 000000000000..5005ff2deade --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/Korea1/cmaps_korea1.h @@ -0,0 +1,24 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_CMAPS_KOREA1_CMAPS_KOREA1_H_ +#define CORE_FPDFAPI_CMAPS_KOREA1_CMAPS_KOREA1_H_ + +#include + +extern const uint16_t g_FXCMAP_KSC_EUC_H_0[]; +extern const uint16_t g_FXCMAP_KSC_EUC_V_0[]; +extern const uint16_t g_FXCMAP_KSCms_UHC_H_1[]; +extern const uint16_t g_FXCMAP_KSCms_UHC_V_1[]; +extern const uint16_t g_FXCMAP_KSCms_UHC_HW_H_1[]; +extern const uint16_t g_FXCMAP_KSCms_UHC_HW_V_1[]; +extern const uint16_t g_FXCMAP_KSCpc_EUC_H_0[]; +extern const uint16_t g_FXCMAP_UniKS_UCS2_H_1[]; +extern const uint16_t g_FXCMAP_UniKS_UCS2_V_1[]; +extern const uint16_t g_FXCMAP_UniKS_UTF16_H_0[]; +extern const uint16_t g_FXCMAP_Korea1CID2Unicode_2[]; + +#endif // CORE_FPDFAPI_CMAPS_KOREA1_CMAPS_KOREA1_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/cmap_int.h b/modules/pdfium/pdfium/core/fpdfapi/cmaps/cmap_int.h new file mode 100644 index 000000000000..e84dc11e5ab5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/cmap_int.h @@ -0,0 +1,33 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_CMAPS_CMAP_INT_H_ +#define CORE_FPDFAPI_CMAPS_CMAP_INT_H_ + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +struct FXCMAP_CMap { + enum MapType { None, Single, Range, Reverse }; + + const char* m_Name; + MapType m_WordMapType; + const uint16_t* m_pWordMap; + int m_WordCount; + MapType m_DWordMapType; + const uint16_t* m_pDWordMap; + int m_DWordCount; + int m_UseOffset; +}; + +void FPDFAPI_FindEmbeddedCMap(const CFX_ByteString& name, + int charset, + int coding, + const FXCMAP_CMap*& pMap); +uint16_t FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, uint32_t charcode); +uint32_t FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, uint16_t cid); + +#endif // CORE_FPDFAPI_CMAPS_CMAP_INT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/cmaps/fpdf_cmaps.cpp b/modules/pdfium/pdfium/core/fpdfapi/cmaps/fpdf_cmaps.cpp new file mode 100644 index 000000000000..ca01d431f4da --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cmaps/fpdf_cmaps.cpp @@ -0,0 +1,154 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cmaps/cmap_int.h" + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/font/font_int.h" +#include "core/fpdfapi/page/cpdf_pagemodule.h" + +extern "C" { + +static int compareWord(const void* p1, const void* p2) { + return (*(uint16_t*)p1) - (*(uint16_t*)p2); +} + +static int compareWordRange(const void* key, const void* element) { + if (*(uint16_t*)key < *(uint16_t*)element) + return -1; + if (*(uint16_t*)key > ((uint16_t*)element)[1]) + return 1; + return 0; +} + +static int compareDWordRange(const void* p1, const void* p2) { + uint32_t key = *(uint32_t*)p1; + uint16_t hiword = (uint16_t)(key >> 16); + uint16_t* element = (uint16_t*)p2; + if (hiword < element[0]) + return -1; + if (hiword > element[0]) + return 1; + + uint16_t loword = (uint16_t)key; + if (loword < element[1]) + return -1; + if (loword > element[2]) + return 1; + return 0; +} + +static int compareDWordSingle(const void* p1, const void* p2) { + uint32_t key = *(uint32_t*)p1; + uint32_t value = ((*(uint16_t*)p2) << 16) | ((uint16_t*)p2)[1]; + if (key < value) + return -1; + if (key > value) + return 1; + return 0; +} + +}; // extern "C" + +void FPDFAPI_FindEmbeddedCMap(const CFX_ByteString& bsName, + int charset, + int coding, + const FXCMAP_CMap*& pMap) { + pMap = nullptr; + CPDF_FontGlobals* pFontGlobals = + CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); + const FXCMAP_CMap* pCMaps = + pFontGlobals->m_EmbeddedCharsets[charset].m_pMapList; + for (uint32_t i = 0; i < pFontGlobals->m_EmbeddedCharsets[charset].m_Count; + i++) { + if (bsName == pCMaps[i].m_Name) { + pMap = &pCMaps[i]; + break; + } + } +} + +uint16_t FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, uint32_t charcode) { + if (charcode >> 16) { + while (1) { + if (pMap->m_DWordMapType == FXCMAP_CMap::Range) { + uint16_t* found = static_cast( + FXSYS_bsearch(&charcode, pMap->m_pDWordMap, pMap->m_DWordCount, 8, + compareDWordRange)); + if (found) + return found[3] + (uint16_t)charcode - found[1]; + + } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) { + uint16_t* found = static_cast( + FXSYS_bsearch(&charcode, pMap->m_pDWordMap, pMap->m_DWordCount, 6, + compareDWordSingle)); + if (found) + return found[2]; + } + if (pMap->m_UseOffset == 0) + return 0; + + pMap = pMap + pMap->m_UseOffset; + } + return 0; + } + + uint16_t code = (uint16_t)charcode; + while (1) { + if (!pMap->m_pWordMap) + return 0; + if (pMap->m_WordMapType == FXCMAP_CMap::Single) { + uint16_t* found = static_cast(FXSYS_bsearch( + &code, pMap->m_pWordMap, pMap->m_WordCount, 4, compareWord)); + if (found) + return found[1]; + + } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) { + uint16_t* found = static_cast(FXSYS_bsearch( + &code, pMap->m_pWordMap, pMap->m_WordCount, 6, compareWordRange)); + if (found) + return found[2] + code - found[0]; + } + if (pMap->m_UseOffset == 0) + return 0; + + pMap = pMap + pMap->m_UseOffset; + } + return 0; +} + +uint32_t FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, uint16_t cid) { + // TODO(dsinclair): This should be checking both pMap->m_WordMap and + // pMap->m_DWordMap. There was a second while() but it was never reached as + // the first always returns. Investigate and determine how this should + // really be working. (https://codereview.chromium.org/2235743003 removed the + // second while loop.) + while (1) { + if (pMap->m_WordMapType == FXCMAP_CMap::Single) { + const uint16_t* pCur = pMap->m_pWordMap; + const uint16_t* pEnd = pMap->m_pWordMap + pMap->m_WordCount * 2; + while (pCur < pEnd) { + if (pCur[1] == cid) + return pCur[0]; + + pCur += 2; + } + } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) { + const uint16_t* pCur = pMap->m_pWordMap; + const uint16_t* pEnd = pMap->m_pWordMap + pMap->m_WordCount * 3; + while (pCur < pEnd) { + if (cid >= pCur[2] && cid <= pCur[2] + pCur[1] - pCur[0]) + return pCur[0] + cid - pCur[2]; + + pCur += 3; + } + } + if (pMap->m_UseOffset == 0) + return 0; + + pMap = pMap + pMap->m_UseOffset; + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/cpdf_modulemgr.cpp b/modules/pdfium/pdfium/core/fpdfapi/cpdf_modulemgr.cpp new file mode 100644 index 000000000000..ac28b3666398 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cpdf_modulemgr.cpp @@ -0,0 +1,62 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cpdf_modulemgr.h" + +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fxcodec/fx_codec.h" +#include "third_party/base/ptr_util.h" + +namespace { + +CPDF_ModuleMgr* g_pDefaultMgr = nullptr; + +} // namespace + +// static +CPDF_ModuleMgr* CPDF_ModuleMgr::Get() { + if (!g_pDefaultMgr) + g_pDefaultMgr = new CPDF_ModuleMgr; + return g_pDefaultMgr; +} + +// static +void CPDF_ModuleMgr::Destroy() { + delete g_pDefaultMgr; + g_pDefaultMgr = nullptr; +} + +CPDF_ModuleMgr::CPDF_ModuleMgr() : m_pCodecModule(nullptr) {} + +CPDF_ModuleMgr::~CPDF_ModuleMgr() {} + +void CPDF_ModuleMgr::InitPageModule() { + m_pPageModule = pdfium::MakeUnique(); +} + +CCodec_FaxModule* CPDF_ModuleMgr::GetFaxModule() { + return m_pCodecModule ? m_pCodecModule->GetFaxModule() : nullptr; +} + +CCodec_JpegModule* CPDF_ModuleMgr::GetJpegModule() { + return m_pCodecModule ? m_pCodecModule->GetJpegModule() : nullptr; +} + +CCodec_JpxModule* CPDF_ModuleMgr::GetJpxModule() { + return m_pCodecModule ? m_pCodecModule->GetJpxModule() : nullptr; +} + +CCodec_Jbig2Module* CPDF_ModuleMgr::GetJbig2Module() { + return m_pCodecModule ? m_pCodecModule->GetJbig2Module() : nullptr; +} + +CCodec_IccModule* CPDF_ModuleMgr::GetIccModule() { + return m_pCodecModule ? m_pCodecModule->GetIccModule() : nullptr; +} + +CCodec_FlateModule* CPDF_ModuleMgr::GetFlateModule() { + return m_pCodecModule ? m_pCodecModule->GetFlateModule() : nullptr; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/cpdf_modulemgr.h b/modules/pdfium/pdfium/core/fpdfapi/cpdf_modulemgr.h new file mode 100644 index 000000000000..d31ffd525615 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cpdf_modulemgr.h @@ -0,0 +1,76 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_CPDF_MODULEMGR_H_ +#define CORE_FPDFAPI_CPDF_MODULEMGR_H_ + +#include +#include + +#include "core/fxcrt/fx_basic.h" + +class CCodec_FaxModule; +class CCodec_FlateModule; +class CCodec_IccModule; +class CCodec_Jbig2Module; +class CCodec_JpegModule; +class CCodec_JpxModule; +class CCodec_ModuleMgr; +class CPDF_PageModule; + +class CFSDK_UnsupportInfo_Adapter { + public: + explicit CFSDK_UnsupportInfo_Adapter(void* unsp_info) + : m_unsp_info(unsp_info) {} + + void* GetUnspInfo() const { return m_unsp_info; } + + private: + void* const m_unsp_info; +}; + +class CPDF_ModuleMgr { + public: + static CPDF_ModuleMgr* Get(); + static void Destroy(); + static const int kFileBufSize = 512; + + void SetCodecModule(CCodec_ModuleMgr* pModule) { m_pCodecModule = pModule; } + CCodec_ModuleMgr* GetCodecModule() { return m_pCodecModule; } + + void InitPageModule(); + CPDF_PageModule* GetPageModule() const { return m_pPageModule.get(); } + + void SetUnsupportInfoAdapter( + std::unique_ptr pAdapter) { + m_pUnsupportInfoAdapter = std::move(pAdapter); + } + CFSDK_UnsupportInfo_Adapter* GetUnsupportInfoAdapter() const { + return m_pUnsupportInfoAdapter.get(); + } + + void LoadEmbeddedGB1CMaps(); + void LoadEmbeddedCNS1CMaps(); + void LoadEmbeddedJapan1CMaps(); + void LoadEmbeddedKorea1CMaps(); + + CCodec_FaxModule* GetFaxModule(); + CCodec_JpegModule* GetJpegModule(); + CCodec_JpxModule* GetJpxModule(); + CCodec_Jbig2Module* GetJbig2Module(); + CCodec_IccModule* GetIccModule(); + CCodec_FlateModule* GetFlateModule(); + + private: + CPDF_ModuleMgr(); + ~CPDF_ModuleMgr(); + + CCodec_ModuleMgr* m_pCodecModule; + std::unique_ptr m_pPageModule; + std::unique_ptr m_pUnsupportInfoAdapter; +}; + +#endif // CORE_FPDFAPI_CPDF_MODULEMGR_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/cpdf_pagerendercontext.cpp b/modules/pdfium/pdfium/core/fpdfapi/cpdf_pagerendercontext.cpp new file mode 100644 index 000000000000..39a881c3b4ab --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cpdf_pagerendercontext.cpp @@ -0,0 +1,18 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/cpdf_pagerendercontext.h" + +#include "core/fpdfapi/render/cpdf_progressiverenderer.h" +#include "core/fpdfapi/render/cpdf_rendercontext.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fpdfdoc/cpdf_annotlist.h" +#include "core/fpdfdoc/cpdf_occontext.h" +#include "core/fxge/cfx_renderdevice.h" + +CPDF_PageRenderContext::CPDF_PageRenderContext() {} + +CPDF_PageRenderContext::~CPDF_PageRenderContext() {} diff --git a/modules/pdfium/pdfium/core/fpdfapi/cpdf_pagerendercontext.h b/modules/pdfium/pdfium/core/fpdfapi/cpdf_pagerendercontext.h new file mode 100644 index 000000000000..27244e7fc3a3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/cpdf_pagerendercontext.h @@ -0,0 +1,31 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_CPDF_PAGERENDERCONTEXT_H_ +#define CORE_FPDFAPI_CPDF_PAGERENDERCONTEXT_H_ + +#include + +class CFX_RenderDevice; +class CPDF_AnnotList; +class CPDF_ProgressiveRenderer; +class CPDF_RenderContext; +class CPDF_RenderOptions; + +// Everything about rendering is put here: for OOM recovery +class CPDF_PageRenderContext { + public: + CPDF_PageRenderContext(); + ~CPDF_PageRenderContext(); + + std::unique_ptr m_pAnnots; + std::unique_ptr m_pDevice; + std::unique_ptr m_pContext; + std::unique_ptr m_pRenderer; + std::unique_ptr m_pOptions; +}; + +#endif // CORE_FPDFAPI_CPDF_PAGERENDERCONTEXT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_creator.h b/modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_creator.h new file mode 100644 index 000000000000..0840e4b7a654 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_creator.h @@ -0,0 +1,103 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_EDIT_CPDF_CREATOR_H_ +#define CORE_FPDFAPI_EDIT_CPDF_CREATOR_H_ + +#include +#include + +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_basic.h" + +class CPDF_Array; +class CPDF_CryptoHandler; +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_Object; +class CPDF_Parser; +class CPDF_XRefStream; + +#define FPDFCREATE_INCREMENTAL 1 +#define FPDFCREATE_NO_ORIGINAL 2 +#define FPDFCREATE_PROGRESSIVE 4 +#define FPDFCREATE_OBJECTSTREAM 8 + +CFX_ByteTextBuf& operator<<(CFX_ByteTextBuf& buf, const CPDF_Object* pObj); + +class CPDF_Creator { + public: + explicit CPDF_Creator(CPDF_Document* pDoc); + ~CPDF_Creator(); + + void RemoveSecurity(); + bool Create(const CFX_RetainPtr& pFile, uint32_t flags = 0); + int32_t Continue(IFX_Pause* pPause = nullptr); + bool SetFileVersion(int32_t fileVersion = 17); + + private: + friend class CPDF_ObjectStream; + friend class CPDF_XRefStream; + + bool Create(uint32_t flags); + void ResetStandardSecurity(); + void Clear(); + + void InitOldObjNumOffsets(); + void InitNewObjNumOffsets(); + void InitID(bool bDefault = true); + + void AppendNewObjNum(uint32_t objbum); + int32_t AppendObjectNumberToXRef(uint32_t objnum); + + int32_t WriteDoc_Stage1(IFX_Pause* pPause); + int32_t WriteDoc_Stage2(IFX_Pause* pPause); + int32_t WriteDoc_Stage3(IFX_Pause* pPause); + int32_t WriteDoc_Stage4(IFX_Pause* pPause); + + int32_t WriteOldIndirectObject(uint32_t objnum); + int32_t WriteOldObjs(IFX_Pause* pPause); + int32_t WriteNewObjs(bool bIncremental, IFX_Pause* pPause); + int32_t WriteIndirectObj(const CPDF_Object* pObj); + int32_t WriteDirectObj(uint32_t objnum, + const CPDF_Object* pObj, + bool bEncrypt = true); + int32_t WriteIndirectObjectToStream(const CPDF_Object* pObj); + int32_t WriteIndirectObj(uint32_t objnum, const CPDF_Object* pObj); + int32_t WriteIndirectObjectToStream(uint32_t objnum, + const uint8_t* pBuffer, + uint32_t dwSize); + + int32_t WriteStream(const CPDF_Object* pStream, + uint32_t objnum, + CPDF_CryptoHandler* pCrypto); + + CPDF_Document* const m_pDocument; + CPDF_Parser* const m_pParser; + bool m_bSecurityChanged; + CPDF_Dictionary* m_pEncryptDict; + uint32_t m_dwEncryptObjNum; + bool m_bEncryptCloned; + CPDF_CryptoHandler* m_pCryptoHandler; + // Whether this owns the crypto handler |m_pCryptoHandler|. + bool m_bLocalCryptoHandler; + CPDF_Object* m_pMetadata; + std::unique_ptr m_pXRefStream; + int32_t m_ObjectStreamSize; + uint32_t m_dwLastObjNum; + CFX_FileBufferArchive m_File; + FX_FILESIZE m_Offset; + int32_t m_iStage; + uint32_t m_dwFlags; + FX_POSITION m_Pos; + FX_FILESIZE m_XrefStart; + CFX_FileSizeListArray m_ObjectOffset; + std::vector m_NewObjNumArray; // Sorted, ascending. + std::unique_ptr m_pIDArray; + int32_t m_FileVersion; +}; + +#endif // CORE_FPDFAPI_EDIT_CPDF_CREATOR_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp b/modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp new file mode 100644 index 000000000000..35595b3e1f64 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp @@ -0,0 +1,276 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/edit/cpdf_pagecontentgenerator.h" + +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/page/cpdf_image.h" +#include "core/fpdfapi/page/cpdf_imageobject.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/page/cpdf_path.h" +#include "core/fpdfapi/page/cpdf_pathobject.h" +#include "core/fpdfapi/page/cpdf_textobject.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" + +namespace { + +CFX_ByteTextBuf& operator<<(CFX_ByteTextBuf& ar, const CFX_Matrix& matrix) { + ar << matrix.a << " " << matrix.b << " " << matrix.c << " " << matrix.d << " " + << matrix.e << " " << matrix.f; + return ar; +} + +bool GetColor(const CPDF_Color* pColor, FX_FLOAT* rgb) { + int intRGB[3]; + if (!pColor || + pColor->GetColorSpace() != CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB) || + !pColor->GetRGB(intRGB[0], intRGB[1], intRGB[2])) { + return false; + } + rgb[0] = intRGB[0] / 255.0f; + rgb[1] = intRGB[1] / 255.0f; + rgb[2] = intRGB[2] / 255.0f; + return true; +} + +} // namespace + +CPDF_PageContentGenerator::CPDF_PageContentGenerator(CPDF_Page* pPage) + : m_pPage(pPage), m_pDocument(m_pPage->m_pDocument) { + for (const auto& pObj : *pPage->GetPageObjectList()) { + if (pObj) + m_pageObjects.push_back(pObj.get()); + } +} + +CPDF_PageContentGenerator::~CPDF_PageContentGenerator() {} + +void CPDF_PageContentGenerator::GenerateContent() { + CFX_ByteTextBuf buf; + for (CPDF_PageObject* pPageObj : m_pageObjects) { + if (CPDF_ImageObject* pImageObject = pPageObj->AsImage()) + ProcessImage(&buf, pImageObject); + else if (CPDF_PathObject* pPathObj = pPageObj->AsPath()) + ProcessPath(&buf, pPathObj); + else if (CPDF_TextObject* pTextObj = pPageObj->AsText()) + ProcessText(&buf, pTextObj); + } + CPDF_Dictionary* pPageDict = m_pPage->m_pFormDict; + CPDF_Object* pContent = + pPageDict ? pPageDict->GetDirectObjectFor("Contents") : nullptr; + if (pContent) + pPageDict->RemoveFor("Contents"); + + CPDF_Stream* pStream = m_pDocument->NewIndirect(); + pStream->SetData(buf.GetBuffer(), buf.GetLength()); + pPageDict->SetNewFor("Contents", m_pDocument, + pStream->GetObjNum()); +} + +CFX_ByteString CPDF_PageContentGenerator::RealizeResource( + uint32_t dwResourceObjNum, + const CFX_ByteString& bsType) { + ASSERT(dwResourceObjNum); + if (!m_pPage->m_pResources) { + m_pPage->m_pResources = m_pDocument->NewIndirect(); + m_pPage->m_pFormDict->SetNewFor( + "Resources", m_pDocument, m_pPage->m_pResources->GetObjNum()); + } + CPDF_Dictionary* pResList = m_pPage->m_pResources->GetDictFor(bsType); + if (!pResList) + pResList = m_pPage->m_pResources->SetNewFor(bsType); + + CFX_ByteString name; + int idnum = 1; + while (1) { + name.Format("FX%c%d", bsType[0], idnum); + if (!pResList->KeyExist(name)) { + break; + } + idnum++; + } + pResList->SetNewFor(name, m_pDocument, dwResourceObjNum); + return name; +} + +void CPDF_PageContentGenerator::ProcessImage(CFX_ByteTextBuf* buf, + CPDF_ImageObject* pImageObj) { + if ((pImageObj->matrix().a == 0 && pImageObj->matrix().b == 0) || + (pImageObj->matrix().c == 0 && pImageObj->matrix().d == 0)) { + return; + } + *buf << "q " << pImageObj->matrix() << " cm "; + + CPDF_Image* pImage = pImageObj->GetImage(); + if (pImage->IsInline()) + return; + + CPDF_Stream* pStream = pImage->GetStream(); + if (!pStream) + return; + + bool bWasInline = pStream->IsInline(); + if (bWasInline) + pImage->ConvertStreamToIndirectObject(); + + uint32_t dwObjNum = pStream->GetObjNum(); + CFX_ByteString name = RealizeResource(dwObjNum, "XObject"); + if (bWasInline) + pImageObj->SetUnownedImage(m_pDocument->GetPageData()->GetImage(dwObjNum)); + + *buf << "/" << PDF_NameEncode(name) << " Do Q\n"; +} + +// Processing path with operators from Tables 4.9 and 4.10 of PDF spec 1.7: +// "re" appends a rectangle (here, used only if the whole path is a rectangle) +// "m" moves current point to the given coordinates +// "l" creates a line from current point to the new point +// "c" adds a Bezier curve from current to last point, using the two other +// points as the Bezier control points +// Note: "l", "c" change the current point +// "h" closes the subpath (appends a line from current to starting point) +// Path painting operators: "S", "n", "B", "f", "B*", "f*", depending on +// the filling mode and whether we want stroking the path or not. +// "Q" restores the graphics state imposed by the ProcessGraphics method. +void CPDF_PageContentGenerator::ProcessPath(CFX_ByteTextBuf* buf, + CPDF_PathObject* pPathObj) { + ProcessGraphics(buf, pPathObj); + auto& pPoints = pPathObj->m_Path.GetPoints(); + if (pPathObj->m_Path.IsRect()) { + CFX_PointF diff = pPoints[2].m_Point - pPoints[0].m_Point; + *buf << pPoints[0].m_Point.x << " " << pPoints[0].m_Point.y << " " << diff.x + << " " << diff.y << " re"; + } else { + for (size_t i = 0; i < pPoints.size(); i++) { + if (i > 0) + *buf << " "; + *buf << pPoints[i].m_Point.x << " " << pPoints[i].m_Point.y; + FXPT_TYPE pointType = pPoints[i].m_Type; + if (pointType == FXPT_TYPE::MoveTo) { + *buf << " m"; + } else if (pointType == FXPT_TYPE::LineTo) { + *buf << " l"; + } else if (pointType == FXPT_TYPE::BezierTo) { + if (i + 2 >= pPoints.size() || + !pPoints[i].IsTypeAndOpen(FXPT_TYPE::BezierTo) || + !pPoints[i + 1].IsTypeAndOpen(FXPT_TYPE::BezierTo) || + pPoints[i + 2].m_Type != FXPT_TYPE::BezierTo) { + // If format is not supported, close the path and paint + *buf << " h"; + break; + } + *buf << " " << pPoints[i + 1].m_Point.x << " " + << pPoints[i + 1].m_Point.y << " " << pPoints[i + 2].m_Point.x + << " " << pPoints[i + 2].m_Point.y << " c"; + i += 2; + } + if (pPoints[i].m_CloseFigure) + *buf << " h"; + } + } + if (pPathObj->m_FillType == 0) + *buf << (pPathObj->m_bStroke ? " S" : " n"); + else if (pPathObj->m_FillType == FXFILL_WINDING) + *buf << (pPathObj->m_bStroke ? " B" : " f"); + else if (pPathObj->m_FillType == FXFILL_ALTERNATE) + *buf << (pPathObj->m_bStroke ? " B*" : " f*"); + *buf << " Q\n"; +} + +// This method supports color operators rg and RGB from Table 4.24 of PDF spec +// 1.7. A color will not be set if the colorspace is not DefaultRGB or the RGB +// values cannot be obtained. The method also adds an external graphics +// dictionary, as described in Section 4.3.4. +// "rg" sets the fill color, "RG" sets the stroke color (using DefaultRGB) +// "w" sets the stroke line width. +// "ca" sets the fill alpha, "CA" sets the stroke alpha. +// "q" saves the graphics state, so that the settings can later be reversed +void CPDF_PageContentGenerator::ProcessGraphics(CFX_ByteTextBuf* buf, + CPDF_PageObject* pPageObj) { + *buf << "q "; + FX_FLOAT fillColor[3]; + if (GetColor(pPageObj->m_ColorState.GetFillColor(), fillColor)) { + *buf << fillColor[0] << " " << fillColor[1] << " " << fillColor[2] + << " rg "; + } + FX_FLOAT strokeColor[3]; + if (GetColor(pPageObj->m_ColorState.GetStrokeColor(), strokeColor)) { + *buf << strokeColor[0] << " " << strokeColor[1] << " " << strokeColor[2] + << " RG "; + } + FX_FLOAT lineWidth = pPageObj->m_GraphState.GetLineWidth(); + if (lineWidth != 1.0f) + *buf << lineWidth << " w "; + + GraphicsData graphD; + graphD.fillAlpha = pPageObj->m_GeneralState.GetFillAlpha(); + graphD.strokeAlpha = pPageObj->m_GeneralState.GetStrokeAlpha(); + if (graphD.fillAlpha == 1.0f && graphD.strokeAlpha == 1.0f) + return; + + CFX_ByteString name; + auto it = m_pPage->m_GraphicsMap.find(graphD); + if (it != m_pPage->m_GraphicsMap.end()) { + name = it->second; + } else { + auto gsDict = pdfium::MakeUnique(); + gsDict->SetNewFor("ca", graphD.fillAlpha); + gsDict->SetNewFor("CA", graphD.strokeAlpha); + CPDF_Object* pDict = m_pDocument->AddIndirectObject(std::move(gsDict)); + uint32_t dwObjNum = pDict->GetObjNum(); + name = RealizeResource(dwObjNum, "ExtGState"); + m_pPage->m_GraphicsMap[graphD] = name; + } + *buf << "/" << PDF_NameEncode(name) << " gs "; +} + +// This method adds text to the buffer, BT begins the text object, ET ends it. +// Tm sets the text matrix (allows positioning and transforming text). +// Tf sets the font name (from Font in Resources) and font size. +// Tj sets the actual text, <####...> is used when specifying charcodes. +void CPDF_PageContentGenerator::ProcessText(CFX_ByteTextBuf* buf, + CPDF_TextObject* pTextObj) { + // TODO(npm): Add support for something other than standard type1 fonts. + *buf << "BT " << pTextObj->GetTextMatrix() << " Tm "; + CPDF_Font* pFont = pTextObj->GetFont(); + if (!pFont) + pFont = CPDF_Font::GetStockFont(m_pDocument, "Helvetica"); + FontData fontD; + fontD.baseFont = pFont->GetBaseFont(); + auto it = m_pPage->m_FontsMap.find(fontD); + CFX_ByteString dictName; + if (it != m_pPage->m_FontsMap.end()) { + dictName = it->second; + } else { + auto fontDict = pdfium::MakeUnique(); + fontDict->SetNewFor("Type", "Font"); + fontDict->SetNewFor("Subtype", "Type1"); + fontDict->SetNewFor("BaseFont", fontD.baseFont); + CPDF_Object* pDict = m_pDocument->AddIndirectObject(std::move(fontDict)); + uint32_t dwObjNum = pDict->GetObjNum(); + dictName = RealizeResource(dwObjNum, "Font"); + m_pPage->m_FontsMap[fontD] = dictName; + } + *buf << "/" << PDF_NameEncode(dictName) << " " << pTextObj->GetFontSize() + << " Tf "; + CFX_ByteString text; + for (uint32_t charcode : pTextObj->m_CharCodes) { + if (charcode == CPDF_Font::kInvalidCharCode) + continue; + pFont->AppendChar(text, charcode); + } + *buf << PDF_EncodeString(text, true) << " Tj ET\n"; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_pagecontentgenerator.h b/modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_pagecontentgenerator.h new file mode 100644 index 000000000000..73e75187e452 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_pagecontentgenerator.h @@ -0,0 +1,44 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_EDIT_CPDF_PAGECONTENTGENERATOR_H_ +#define CORE_FPDFAPI_EDIT_CPDF_PAGECONTENTGENERATOR_H_ + +#include + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Document; +class CPDF_ImageObject; +class CPDF_Page; +class CPDF_PageObject; +class CPDF_PathObject; +class CPDF_TextObject; + +class CPDF_PageContentGenerator { + public: + explicit CPDF_PageContentGenerator(CPDF_Page* pPage); + ~CPDF_PageContentGenerator(); + + void GenerateContent(); + + private: + friend class CPDF_PageContentGeneratorTest; + + void ProcessPath(CFX_ByteTextBuf* buf, CPDF_PathObject* pPathObj); + void ProcessImage(CFX_ByteTextBuf* buf, CPDF_ImageObject* pImageObj); + void ProcessGraphics(CFX_ByteTextBuf* buf, CPDF_PageObject* pPageObj); + void ProcessText(CFX_ByteTextBuf* buf, CPDF_TextObject* pTextObj); + CFX_ByteString RealizeResource(uint32_t dwResourceObjNum, + const CFX_ByteString& bsType); + + CPDF_Page* const m_pPage; + CPDF_Document* const m_pDocument; + std::vector m_pageObjects; +}; + +#endif // CORE_FPDFAPI_EDIT_CPDF_PAGECONTENTGENERATOR_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp b/modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp new file mode 100644 index 000000000000..d8813ba30fa3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp @@ -0,0 +1,178 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/edit/cpdf_pagecontentgenerator.h" + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/page/cpdf_pathobject.h" +#include "core/fpdfapi/page/cpdf_textobject.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/base/ptr_util.h" + +class CPDF_PageContentGeneratorTest : public testing::Test { + protected: + void SetUp() override { CPDF_ModuleMgr::Get()->InitPageModule(); } + + void TearDown() override { CPDF_ModuleMgr::Destroy(); } + + void TestProcessPath(CPDF_PageContentGenerator* pGen, + CFX_ByteTextBuf* buf, + CPDF_PathObject* pPathObj) { + pGen->ProcessPath(buf, pPathObj); + } + + CPDF_Dictionary* TestGetResource(CPDF_PageContentGenerator* pGen, + const CFX_ByteString& type, + const CFX_ByteString& name) { + return pGen->m_pPage->m_pResources->GetDictFor(type)->GetDictFor(name); + } + + void TestProcessText(CPDF_PageContentGenerator* pGen, + CFX_ByteTextBuf* buf, + CPDF_TextObject* pTextObj) { + pGen->ProcessText(buf, pTextObj); + } +}; + +TEST_F(CPDF_PageContentGeneratorTest, ProcessRect) { + auto pPathObj = pdfium::MakeUnique(); + pPathObj->m_Path.AppendRect(10, 5, 13, 30); + pPathObj->m_FillType = FXFILL_ALTERNATE; + pPathObj->m_bStroke = true; + + auto pTestPage = pdfium::MakeUnique(nullptr, nullptr, false); + CPDF_PageContentGenerator generator(pTestPage.get()); + CFX_ByteTextBuf buf; + TestProcessPath(&generator, &buf, pPathObj.get()); + EXPECT_EQ("q 10 5 3 25 re B* Q\n", buf.MakeString()); + + pPathObj = pdfium::MakeUnique(); + pPathObj->m_Path.AppendPoint(CFX_PointF(0, 0), FXPT_TYPE::MoveTo, false); + pPathObj->m_Path.AppendPoint(CFX_PointF(5.2f, 0), FXPT_TYPE::LineTo, false); + pPathObj->m_Path.AppendPoint(CFX_PointF(5.2f, 3.78f), FXPT_TYPE::LineTo, + false); + pPathObj->m_Path.AppendPoint(CFX_PointF(0, 3.78f), FXPT_TYPE::LineTo, true); + pPathObj->m_FillType = 0; + pPathObj->m_bStroke = false; + buf.Clear(); + + TestProcessPath(&generator, &buf, pPathObj.get()); + EXPECT_EQ("q 0 0 5.2 3.78 re n Q\n", buf.MakeString()); +} + +TEST_F(CPDF_PageContentGeneratorTest, ProcessPath) { + auto pPathObj = pdfium::MakeUnique(); + pPathObj->m_Path.AppendPoint(CFX_PointF(3.102f, 4.67f), FXPT_TYPE::MoveTo, + false); + pPathObj->m_Path.AppendPoint(CFX_PointF(5.45f, 0.29f), FXPT_TYPE::LineTo, + false); + pPathObj->m_Path.AppendPoint(CFX_PointF(4.24f, 3.15f), FXPT_TYPE::BezierTo, + false); + pPathObj->m_Path.AppendPoint(CFX_PointF(4.65f, 2.98f), FXPT_TYPE::BezierTo, + false); + pPathObj->m_Path.AppendPoint(CFX_PointF(3.456f, 0.24f), FXPT_TYPE::BezierTo, + false); + pPathObj->m_Path.AppendPoint(CFX_PointF(10.6f, 11.15f), FXPT_TYPE::LineTo, + false); + pPathObj->m_Path.AppendPoint(CFX_PointF(11, 12.5f), FXPT_TYPE::LineTo, false); + pPathObj->m_Path.AppendPoint(CFX_PointF(11.46f, 12.67f), FXPT_TYPE::BezierTo, + false); + pPathObj->m_Path.AppendPoint(CFX_PointF(11.84f, 12.96f), FXPT_TYPE::BezierTo, + false); + pPathObj->m_Path.AppendPoint(CFX_PointF(12, 13.64f), FXPT_TYPE::BezierTo, + true); + pPathObj->m_FillType = FXFILL_WINDING; + pPathObj->m_bStroke = false; + + auto pTestPage = pdfium::MakeUnique(nullptr, nullptr, false); + CPDF_PageContentGenerator generator(pTestPage.get()); + CFX_ByteTextBuf buf; + TestProcessPath(&generator, &buf, pPathObj.get()); + EXPECT_EQ( + "q 3.102 4.67 m 5.45 0.29 l 4.24 3.15 4.65 2.98 3.456 0.24 c 10.6 11.15 " + "l 11 12.5 l 11.46 12.67 11.84 12.96 12 13.64 c h f Q\n", + buf.MakeString()); +} + +TEST_F(CPDF_PageContentGeneratorTest, ProcessGraphics) { + auto pPathObj = pdfium::MakeUnique(); + pPathObj->m_Path.AppendPoint(CFX_PointF(1, 2), FXPT_TYPE::MoveTo, false); + pPathObj->m_Path.AppendPoint(CFX_PointF(3, 4), FXPT_TYPE::LineTo, false); + pPathObj->m_Path.AppendPoint(CFX_PointF(5, 6), FXPT_TYPE::LineTo, true); + pPathObj->m_FillType = FXFILL_WINDING; + pPathObj->m_bStroke = true; + + FX_FLOAT rgb[3] = {0.5f, 0.7f, 0.35f}; + CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB); + pPathObj->m_ColorState.SetFillColor(pCS, rgb, 3); + + FX_FLOAT rgb2[3] = {1, 0.9f, 0}; + pPathObj->m_ColorState.SetStrokeColor(pCS, rgb2, 3); + pPathObj->m_GeneralState.SetFillAlpha(0.5f); + pPathObj->m_GeneralState.SetStrokeAlpha(0.8f); + + auto pDoc = pdfium::MakeUnique(nullptr); + pDoc->CreateNewDoc(); + CPDF_Dictionary* pPageDict = pDoc->CreateNewPage(0); + auto pTestPage = pdfium::MakeUnique(pDoc.get(), pPageDict, false); + CPDF_PageContentGenerator generator(pTestPage.get()); + CFX_ByteTextBuf buf; + TestProcessPath(&generator, &buf, pPathObj.get()); + CFX_ByteString pathString = buf.MakeString(); + + // Color RGB values used are integers divided by 255. + EXPECT_EQ("q 0.501961 0.701961 0.34902 rg 1 0.901961 0 RG /", + pathString.Left(48)); + EXPECT_EQ(" gs 1 2 m 3 4 l 5 6 l h B Q\n", pathString.Right(28)); + ASSERT_TRUE(pathString.GetLength() > 76); + CPDF_Dictionary* externalGS = TestGetResource( + &generator, "ExtGState", pathString.Mid(48, pathString.GetLength() - 76)); + ASSERT_TRUE(externalGS); + EXPECT_EQ(0.5f, externalGS->GetNumberFor("ca")); + EXPECT_EQ(0.8f, externalGS->GetNumberFor("CA")); + + // Same path, now with a stroke. + pPathObj->m_GraphState.SetLineWidth(10.5f); + buf.Clear(); + TestProcessPath(&generator, &buf, pPathObj.get()); + CFX_ByteString pathString2 = buf.MakeString(); + EXPECT_EQ("q 0.501961 0.701961 0.34902 rg 1 0.901961 0 RG 10.5 w /", + pathString2.Left(55)); + EXPECT_EQ(" gs 1 2 m 3 4 l 5 6 l h B Q\n", pathString2.Right(28)); + + // Compare with the previous (should use same dictionary for gs) + EXPECT_EQ(pathString.GetLength() + 7, pathString2.GetLength()); + EXPECT_EQ(pathString.Mid(48, pathString.GetLength() - 76), + pathString2.Mid(55, pathString2.GetLength() - 83)); +} + +TEST_F(CPDF_PageContentGeneratorTest, ProcessText) { + auto pDoc = pdfium::MakeUnique(nullptr); + pDoc->CreateNewDoc(); + CPDF_Dictionary* pPageDict = pDoc->CreateNewPage(0); + auto pTestPage = pdfium::MakeUnique(pDoc.get(), pPageDict, false); + CPDF_PageContentGenerator generator(pTestPage.get()); + auto pTextObj = pdfium::MakeUnique(); + CPDF_Font* pFont = CPDF_Font::GetStockFont(pDoc.get(), "Times-Roman"); + pTextObj->m_TextState.SetFont(pFont); + pTextObj->m_TextState.SetFontSize(10.0f); + pTextObj->Transform(CFX_Matrix(1, 0, 0, 1, 100, 100)); + pTextObj->SetText("Hello World"); + CFX_ByteTextBuf buf; + TestProcessText(&generator, &buf, pTextObj.get()); + CFX_ByteString textString = buf.MakeString(); + EXPECT_LT(61, textString.GetLength()); + EXPECT_EQ("BT 1 0 0 1 100 100 Tm /", textString.Left(23)); + EXPECT_EQ(" 10 Tf <48656C6C6F20576F726C64> Tj ET\n", textString.Right(38)); + CPDF_Dictionary* fontDict = TestGetResource( + &generator, "Font", textString.Mid(23, textString.GetLength() - 61)); + ASSERT_TRUE(fontDict); + EXPECT_EQ("Font", fontDict->GetStringFor("Type")); + EXPECT_EQ("Type1", fontDict->GetStringFor("Subtype")); + EXPECT_EQ("Times-Roman", fontDict->GetStringFor("BaseFont")); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/edit/editint.h b/modules/pdfium/pdfium/core/fpdfapi/edit/editint.h new file mode 100644 index 000000000000..881c2cca36ff --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/edit/editint.h @@ -0,0 +1,77 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_EDIT_EDITINT_H_ +#define CORE_FPDFAPI_EDIT_EDITINT_H_ + +#include + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_stream.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Creator; +class CPDF_Object; + +class CPDF_ObjectStream { + public: + struct Item { + uint32_t objnum; + FX_STRSIZE offset; + }; + + CPDF_ObjectStream(); + ~CPDF_ObjectStream(); + + void Start(); + FX_FILESIZE End(CPDF_Creator* pCreator); + void CompressIndirectObject(uint32_t dwObjNum, const CPDF_Object* pObj); + void CompressIndirectObject(uint32_t dwObjNum, + const uint8_t* pBuffer, + uint32_t dwSize); + + std::vector m_Items; + CFX_ByteTextBuf m_Buffer; + uint32_t m_dwObjNum; + int32_t m_index; +}; + +class CPDF_XRefStream { + public: + struct Index { + uint32_t objnum; + uint32_t count; + }; + + CPDF_XRefStream(); + ~CPDF_XRefStream(); + + bool Start(); + int32_t CompressIndirectObject(uint32_t dwObjNum, + const CPDF_Object* pObj, + CPDF_Creator* pCreator); + int32_t CompressIndirectObject(uint32_t dwObjNum, + const uint8_t* pBuffer, + uint32_t dwSize, + CPDF_Creator* pCreator); + bool End(CPDF_Creator* pCreator, bool bEOF = false); + void AddObjectNumberToIndexArray(uint32_t objnum); + bool EndXRefStream(CPDF_Creator* pCreator); + + std::vector m_IndexArray; + FX_FILESIZE m_PrevOffset; + uint32_t m_dwTempObjNum; + + protected: + int32_t EndObjectStream(CPDF_Creator* pCreator, bool bEOF = true); + bool GenerateXRefStream(CPDF_Creator* pCreator, bool bEOF); + + size_t m_iSeg; + CPDF_ObjectStream m_ObjStream; + CFX_ByteTextBuf m_Buffer; +}; + +#endif // CORE_FPDFAPI_EDIT_EDITINT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/edit/fpdf_edit_create.cpp b/modules/pdfium/pdfium/core/fpdfapi/edit/fpdf_edit_create.cpp new file mode 100644 index 000000000000..fec0de95123f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/edit/fpdf_edit_create.cpp @@ -0,0 +1,1995 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/edit/editint.h" + +#include +#include + +#include "core/fpdfapi/edit/cpdf_creator.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_crypto_handler.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_security_handler.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxcrt/fx_ext.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +#define PDF_OBJECTSTREAM_MAXLENGTH (256 * 1024) +#define PDF_XREFSTREAM_MAXSIZE 10000 + +#define FX_GETBYTEOFFSET32(a) 0 +#define FX_GETBYTEOFFSET40(a) 0 +#define FX_GETBYTEOFFSET48(a) 0 +#define FX_GETBYTEOFFSET56(a) 0 +#define FX_GETBYTEOFFSET24(a) ((uint8_t)(a >> 24)) +#define FX_GETBYTEOFFSET16(a) ((uint8_t)(a >> 16)) +#define FX_GETBYTEOFFSET8(a) ((uint8_t)(a >> 8)) +#define FX_GETBYTEOFFSET0(a) ((uint8_t)(a)) + +// TODO(ochang): Make helper for appending "objnum 0 R ". + +namespace { + +int32_t PDF_CreatorAppendObject(const CPDF_Object* pObj, + CFX_FileBufferArchive* pFile, + FX_FILESIZE& offset) { + int32_t len = 0; + if (!pObj) { + if (pFile->AppendString(" null") < 0) { + return -1; + } + offset += 5; + return 1; + } + switch (pObj->GetType()) { + case CPDF_Object::NULLOBJ: + if (pFile->AppendString(" null") < 0) { + return -1; + } + offset += 5; + break; + case CPDF_Object::BOOLEAN: + case CPDF_Object::NUMBER: + if (pFile->AppendString(" ") < 0) { + return -1; + } + if ((len = pFile->AppendString(pObj->GetString().AsStringC())) < 0) { + return -1; + } + offset += len + 1; + break; + case CPDF_Object::STRING: { + CFX_ByteString str = pObj->GetString(); + bool bHex = pObj->AsString()->IsHex(); + if ((len = pFile->AppendString(PDF_EncodeString(str, bHex).AsStringC())) < + 0) { + return -1; + } + offset += len; + break; + } + case CPDF_Object::NAME: { + if (pFile->AppendString("/") < 0) { + return -1; + } + CFX_ByteString str = pObj->GetString(); + if ((len = pFile->AppendString(PDF_NameEncode(str).AsStringC())) < 0) { + return -1; + } + offset += len + 1; + break; + } + case CPDF_Object::REFERENCE: { + if (pFile->AppendString(" ") < 0) + return -1; + if ((len = pFile->AppendDWord(pObj->AsReference()->GetRefObjNum())) < 0) + return -1; + if (pFile->AppendString(" 0 R ") < 0) + return -1; + offset += len + 6; + break; + } + case CPDF_Object::ARRAY: { + if (pFile->AppendString("[") < 0) { + return -1; + } + offset += 1; + const CPDF_Array* p = pObj->AsArray(); + for (size_t i = 0; i < p->GetCount(); i++) { + CPDF_Object* pElement = p->GetObjectAt(i); + if (!pElement->IsInline()) { + if (pFile->AppendString(" ") < 0) { + return -1; + } + if ((len = pFile->AppendDWord(pElement->GetObjNum())) < 0) { + return -1; + } + if (pFile->AppendString(" 0 R") < 0) { + return -1; + } + offset += len + 5; + } else { + if (PDF_CreatorAppendObject(pElement, pFile, offset) < 0) { + return -1; + } + } + } + if (pFile->AppendString("]") < 0) { + return -1; + } + offset += 1; + break; + } + case CPDF_Object::DICTIONARY: { + if (pFile->AppendString("<<") < 0) { + return -1; + } + offset += 2; + const CPDF_Dictionary* p = pObj->AsDictionary(); + for (const auto& it : *p) { + const CFX_ByteString& key = it.first; + CPDF_Object* pValue = it.second.get(); + if (pFile->AppendString("/") < 0) { + return -1; + } + if ((len = pFile->AppendString(PDF_NameEncode(key).AsStringC())) < 0) { + return -1; + } + offset += len + 1; + if (!pValue->IsInline()) { + if (pFile->AppendString(" ") < 0) { + return -1; + } + if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) { + return -1; + } + if (pFile->AppendString(" 0 R") < 0) { + return -1; + } + offset += len + 5; + } else { + if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) { + return -1; + } + } + } + if (pFile->AppendString(">>") < 0) { + return -1; + } + offset += 2; + break; + } + case CPDF_Object::STREAM: { + const CPDF_Stream* p = pObj->AsStream(); + if (PDF_CreatorAppendObject(p->GetDict(), pFile, offset) < 0) { + return -1; + } + if (pFile->AppendString("stream\r\n") < 0) { + return -1; + } + offset += 8; + CPDF_StreamAcc acc; + acc.LoadAllData(p, true); + if (pFile->AppendBlock(acc.GetData(), acc.GetSize()) < 0) { + return -1; + } + offset += acc.GetSize(); + if ((len = pFile->AppendString("\r\nendstream")) < 0) { + return -1; + } + offset += len; + break; + } + default: + ASSERT(false); + break; + } + return 1; +} + +int32_t PDF_CreatorWriteTrailer(CPDF_Document* pDocument, + CFX_FileBufferArchive* pFile, + CPDF_Array* pIDArray) { + FX_FILESIZE offset = 0; + int32_t len = 0; + CPDF_Parser* pParser = pDocument->GetParser(); + if (pParser) { + CPDF_Dictionary* p = pParser->GetTrailer(); + for (const auto& it : *p) { + const CFX_ByteString& key = it.first; + CPDF_Object* pValue = it.second.get(); + if (key == "Encrypt" || key == "Size" || key == "Filter" || + key == "Index" || key == "Length" || key == "Prev" || key == "W" || + key == "XRefStm" || key == "Type" || key == "ID") { + continue; + } + if (key == "DecodeParms") + continue; + + if (pFile->AppendString(("/")) < 0) { + return -1; + } + if ((len = pFile->AppendString(PDF_NameEncode(key).AsStringC())) < 0) { + return -1; + } + offset += len + 1; + if (!pValue->IsInline()) { + if (pFile->AppendString(" ") < 0) { + return -1; + } + if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) { + return -1; + } + if (pFile->AppendString(" 0 R ") < 0) { + return -1; + } + offset += len + 6; + } else { + if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) { + return -1; + } + } + } + if (pIDArray) { + if (pFile->AppendString(("/ID")) < 0) { + return -1; + } + offset += 3; + if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) { + return -1; + } + } + return offset; + } + if (pFile->AppendString("\r\n/Root ") < 0) { + return -1; + } + if ((len = pFile->AppendDWord(pDocument->GetRoot()->GetObjNum())) < 0) { + return -1; + } + if (pFile->AppendString(" 0 R\r\n") < 0) { + return -1; + } + offset += len + 14; + if (pDocument->GetInfo()) { + if (pFile->AppendString("/Info ") < 0) { + return -1; + } + if ((len = pFile->AppendDWord(pDocument->GetInfo()->GetObjNum())) < 0) { + return -1; + } + if (pFile->AppendString(" 0 R\r\n") < 0) { + return -1; + } + offset += len + 12; + } + if (pIDArray) { + if (pFile->AppendString(("/ID")) < 0) { + return -1; + } + offset += 3; + if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) { + return -1; + } + } + return offset; +} + +int32_t PDF_CreatorWriteEncrypt(const CPDF_Dictionary* pEncryptDict, + uint32_t dwObjNum, + CFX_FileBufferArchive* pFile) { + if (!pEncryptDict) { + return 0; + } + ASSERT(pFile); + FX_FILESIZE offset = 0; + int32_t len = 0; + if (pFile->AppendString("/Encrypt") < 0) { + return -1; + } + offset += 8; + if (pFile->AppendString(" ") < 0) { + return -1; + } + if ((len = pFile->AppendDWord(dwObjNum)) < 0) { + return -1; + } + if (pFile->AppendString(" 0 R ") < 0) { + return -1; + } + offset += len + 6; + return offset; +} + +std::vector PDF_GenerateFileID(uint32_t dwSeed1, uint32_t dwSeed2) { + std::vector buffer(sizeof(uint32_t) * 4); + uint32_t* pBuffer = reinterpret_cast(buffer.data()); + void* pContext = FX_Random_MT_Start(dwSeed1); + for (int i = 0; i < 2; ++i) + *pBuffer++ = FX_Random_MT_Generate(pContext); + FX_Random_MT_Close(pContext); + pContext = FX_Random_MT_Start(dwSeed2); + for (int i = 0; i < 2; ++i) + *pBuffer++ = FX_Random_MT_Generate(pContext); + FX_Random_MT_Close(pContext); + return buffer; +} + +void AppendIndex0(CFX_ByteTextBuf& buffer, bool bFirstObject) { + buffer.AppendByte(0); + buffer.AppendByte(0); + buffer.AppendByte(0); + buffer.AppendByte(0); + buffer.AppendByte(0); + const uint8_t byte = bFirstObject ? 0xFF : 0; + buffer.AppendByte(byte); + buffer.AppendByte(byte); +} + +void AppendIndex1(CFX_ByteTextBuf& buffer, FX_FILESIZE offset) { + buffer.AppendByte(1); + buffer.AppendByte(FX_GETBYTEOFFSET24(offset)); + buffer.AppendByte(FX_GETBYTEOFFSET16(offset)); + buffer.AppendByte(FX_GETBYTEOFFSET8(offset)); + buffer.AppendByte(FX_GETBYTEOFFSET0(offset)); + buffer.AppendByte(0); + buffer.AppendByte(0); +} + +void AppendIndex2(CFX_ByteTextBuf& buffer, uint32_t objnum, int32_t index) { + buffer.AppendByte(2); + buffer.AppendByte(FX_GETBYTEOFFSET24(objnum)); + buffer.AppendByte(FX_GETBYTEOFFSET16(objnum)); + buffer.AppendByte(FX_GETBYTEOFFSET8(objnum)); + buffer.AppendByte(FX_GETBYTEOFFSET0(objnum)); + buffer.AppendByte(FX_GETBYTEOFFSET8(index)); + buffer.AppendByte(FX_GETBYTEOFFSET0(index)); +} + +bool IsXRefNeedEnd(CPDF_XRefStream* pXRef, uint32_t flag) { + if (!(flag & FPDFCREATE_INCREMENTAL)) + return false; + + uint32_t iCount = 0; + for (const auto& pair : pXRef->m_IndexArray) + iCount += pair.count; + + return iCount >= PDF_XREFSTREAM_MAXSIZE; +} + +int32_t OutputIndex(CFX_FileBufferArchive* pFile, FX_FILESIZE offset) { + if (sizeof(offset) > 4) { + if (FX_GETBYTEOFFSET32(offset)) { + if (pFile->AppendByte(FX_GETBYTEOFFSET56(offset)) < 0) + return -1; + if (pFile->AppendByte(FX_GETBYTEOFFSET48(offset)) < 0) + return -1; + if (pFile->AppendByte(FX_GETBYTEOFFSET40(offset)) < 0) + return -1; + if (pFile->AppendByte(FX_GETBYTEOFFSET32(offset)) < 0) + return -1; + } + } + if (pFile->AppendByte(FX_GETBYTEOFFSET24(offset)) < 0) + return -1; + if (pFile->AppendByte(FX_GETBYTEOFFSET16(offset)) < 0) + return -1; + if (pFile->AppendByte(FX_GETBYTEOFFSET8(offset)) < 0) + return -1; + if (pFile->AppendByte(FX_GETBYTEOFFSET0(offset)) < 0) + return -1; + if (pFile->AppendByte(0) < 0) + return -1; + return 0; +} + +class CPDF_FlateEncoder { + public: + CPDF_FlateEncoder(CPDF_Stream* pStream, bool bFlateEncode); + CPDF_FlateEncoder(const uint8_t* pBuffer, + uint32_t size, + bool bFlateEncode, + bool bXRefStream); + ~CPDF_FlateEncoder(); + + void CloneDict(); + + uint32_t m_dwSize; + CFX_MaybeOwned m_pData; + CFX_MaybeOwned m_pDict; + CPDF_StreamAcc m_Acc; +}; + +void CPDF_FlateEncoder::CloneDict() { + if (m_pDict.IsOwned()) + return; + m_pDict = ToDictionary(m_pDict->Clone()); + ASSERT(m_pDict.IsOwned()); +} + +CPDF_FlateEncoder::CPDF_FlateEncoder(CPDF_Stream* pStream, bool bFlateEncode) + : m_dwSize(0) { + m_Acc.LoadAllData(pStream, true); + bool bHasFilter = pStream && pStream->HasFilter(); + if (bHasFilter && !bFlateEncode) { + CPDF_StreamAcc destAcc; + destAcc.LoadAllData(pStream); + m_dwSize = destAcc.GetSize(); + m_pData = destAcc.DetachData(); + m_pDict = ToDictionary(pStream->GetDict()->Clone()); + m_pDict->RemoveFor("Filter"); + return; + } + if (bHasFilter || !bFlateEncode) { + m_pData = const_cast(m_Acc.GetData()); + m_dwSize = m_Acc.GetSize(); + m_pDict = pStream->GetDict(); + return; + } + // TODO(thestig): Move to Init() and check return value. + uint8_t* buffer = nullptr; + ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), &buffer, &m_dwSize); + m_pData = std::unique_ptr(buffer); + m_pDict = ToDictionary(pStream->GetDict()->Clone()); + m_pDict->SetNewFor("Length", static_cast(m_dwSize)); + m_pDict->SetNewFor("Filter", "FlateDecode"); + m_pDict->RemoveFor("DecodeParms"); +} + +CPDF_FlateEncoder::CPDF_FlateEncoder(const uint8_t* pBuffer, + uint32_t size, + bool bFlateEncode, + bool bXRefStream) + : m_dwSize(0) { + if (!bFlateEncode) { + m_pData = const_cast(pBuffer); + m_dwSize = size; + return; + } + uint8_t* buffer = nullptr; + // TODO(thestig): Move to Init() and check return value. + if (bXRefStream) + ::PngEncode(pBuffer, size, &buffer, &m_dwSize); + else + ::FlateEncode(pBuffer, size, &buffer, &m_dwSize); + m_pData = std::unique_ptr(buffer); +} + +CPDF_FlateEncoder::~CPDF_FlateEncoder() {} + +class CPDF_Encryptor { + public: + CPDF_Encryptor(CPDF_CryptoHandler* pHandler, + int objnum, + uint8_t* src_data, + uint32_t src_size); + ~CPDF_Encryptor(); + + uint8_t* m_pData; + uint32_t m_dwSize; + bool m_bNewBuf; +}; + +CPDF_Encryptor::CPDF_Encryptor(CPDF_CryptoHandler* pHandler, + int objnum, + uint8_t* src_data, + uint32_t src_size) + : m_pData(nullptr), m_dwSize(0), m_bNewBuf(false) { + if (src_size == 0) + return; + + if (!pHandler) { + m_pData = (uint8_t*)src_data; + m_dwSize = src_size; + return; + } + m_dwSize = pHandler->EncryptGetSize(objnum, 0, src_data, src_size); + m_pData = FX_Alloc(uint8_t, m_dwSize); + pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize); + m_bNewBuf = true; +} + +CPDF_Encryptor::~CPDF_Encryptor() { + if (m_bNewBuf) + FX_Free(m_pData); +} + +} // namespace + +CPDF_ObjectStream::CPDF_ObjectStream() : m_dwObjNum(0), m_index(0) {} + +CPDF_ObjectStream::~CPDF_ObjectStream() {} + +void CPDF_ObjectStream::Start() { + m_Items.clear(); + m_Buffer.Clear(); + m_dwObjNum = 0; + m_index = 0; +} + +void CPDF_ObjectStream::CompressIndirectObject(uint32_t dwObjNum, + const CPDF_Object* pObj) { + m_Items.push_back({dwObjNum, m_Buffer.GetLength()}); + m_Buffer << pObj; +} + +void CPDF_ObjectStream::CompressIndirectObject(uint32_t dwObjNum, + const uint8_t* pBuffer, + uint32_t dwSize) { + m_Items.push_back({dwObjNum, m_Buffer.GetLength()}); + m_Buffer.AppendBlock(pBuffer, dwSize); +} + +FX_FILESIZE CPDF_ObjectStream::End(CPDF_Creator* pCreator) { + ASSERT(pCreator); + if (m_Items.empty()) + return 0; + + CFX_FileBufferArchive* pFile = &pCreator->m_File; + FX_FILESIZE ObjOffset = pCreator->m_Offset; + if (!m_dwObjNum) { + m_dwObjNum = ++pCreator->m_dwLastObjNum; + } + CFX_ByteTextBuf tempBuffer; + for (const auto& pair : m_Items) + tempBuffer << pair.objnum << " " << pair.offset << " "; + + FX_FILESIZE& offset = pCreator->m_Offset; + int32_t len = pFile->AppendDWord(m_dwObjNum); + if (len < 0) { + return -1; + } + offset += len; + if ((len = pFile->AppendString(" 0 obj\r\n<(m_Items); + if ((len = pFile->AppendDWord(iCount)) < 0) { + return -1; + } + offset += len; + if (pFile->AppendString("/First ") < 0) { + return -1; + } + if ((len = pFile->AppendDWord((uint32_t)tempBuffer.GetLength())) < 0) { + return -1; + } + if (pFile->AppendString("/Length ") < 0) { + return -1; + } + offset += len + 15; + + tempBuffer << m_Buffer; + CPDF_FlateEncoder encoder(tempBuffer.GetBuffer(), tempBuffer.GetLength(), + true, false); + CPDF_Encryptor encryptor(pCreator->m_pCryptoHandler, m_dwObjNum, + encoder.m_pData.Get(), encoder.m_dwSize); + if ((len = pFile->AppendDWord(encryptor.m_dwSize)) < 0) { + return -1; + } + offset += len; + if (pFile->AppendString("/Filter /FlateDecode") < 0) { + return -1; + } + offset += 20; + if ((len = pFile->AppendString(">>stream\r\n")) < 0) { + return -1; + } + if (pFile->AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) { + return -1; + } + offset += len + encryptor.m_dwSize; + if ((len = pFile->AppendString("\r\nendstream\r\nendobj\r\n")) < 0) { + return -1; + } + offset += len; + return ObjOffset; +} + +CPDF_XRefStream::CPDF_XRefStream() + : m_PrevOffset(0), m_dwTempObjNum(0), m_iSeg(0) {} + +CPDF_XRefStream::~CPDF_XRefStream() {} + +bool CPDF_XRefStream::Start() { + m_IndexArray.clear(); + m_Buffer.Clear(); + m_iSeg = 0; + return true; +} +int32_t CPDF_XRefStream::CompressIndirectObject(uint32_t dwObjNum, + const CPDF_Object* pObj, + CPDF_Creator* pCreator) { + if (!pCreator) + return 0; + + m_ObjStream.CompressIndirectObject(dwObjNum, pObj); + if (pdfium::CollectionSize(m_ObjStream.m_Items) < + pCreator->m_ObjectStreamSize && + m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) { + return 1; + } + return EndObjectStream(pCreator); +} +int32_t CPDF_XRefStream::CompressIndirectObject(uint32_t dwObjNum, + const uint8_t* pBuffer, + uint32_t dwSize, + CPDF_Creator* pCreator) { + if (!pCreator) + return 0; + + m_ObjStream.CompressIndirectObject(dwObjNum, pBuffer, dwSize); + if (pdfium::CollectionSize(m_ObjStream.m_Items) < + pCreator->m_ObjectStreamSize && + m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) { + return 1; + } + return EndObjectStream(pCreator); +} + +int32_t CPDF_XRefStream::EndObjectStream(CPDF_Creator* pCreator, bool bEOF) { + FX_FILESIZE objOffset = 0; + if (bEOF) { + objOffset = m_ObjStream.End(pCreator); + if (objOffset < 0) { + return -1; + } + } + uint32_t& dwObjStmNum = m_ObjStream.m_dwObjNum; + if (!dwObjStmNum) { + dwObjStmNum = ++pCreator->m_dwLastObjNum; + } + int32_t iSize = pdfium::CollectionSize(m_ObjStream.m_Items); + size_t iSeg = m_IndexArray.size(); + if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) { + if (m_dwTempObjNum == 0) { + AppendIndex0(m_Buffer, true); + m_dwTempObjNum++; + } + uint32_t end_num = m_IndexArray.back().objnum + m_IndexArray.back().count; + int index = 0; + for (; m_dwTempObjNum < end_num; m_dwTempObjNum++) { + FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum); + if (offset) { + if (index >= iSize || + m_dwTempObjNum != m_ObjStream.m_Items[index].objnum) { + AppendIndex1(m_Buffer, *offset); + } else { + AppendIndex2(m_Buffer, dwObjStmNum, index++); + } + } else { + AppendIndex0(m_Buffer, false); + } + } + if (iSize > 0 && bEOF) { + pCreator->m_ObjectOffset.Add(dwObjStmNum, 1); + pCreator->m_ObjectOffset[dwObjStmNum] = objOffset; + } + m_iSeg = iSeg; + if (bEOF) { + m_ObjStream.Start(); + } + return 1; + } + for (auto it = m_IndexArray.begin() + m_iSeg; it != m_IndexArray.end(); + ++it) { + for (uint32_t m = it->objnum; m < it->objnum + it->count; ++m) { + if (m_ObjStream.m_index >= iSize || + m != m_ObjStream.m_Items[it - m_IndexArray.begin()].objnum) { + AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[m]); + } else { + AppendIndex2(m_Buffer, dwObjStmNum, m_ObjStream.m_index++); + } + } + } + if (iSize > 0 && bEOF) { + AppendIndex1(m_Buffer, objOffset); + m_IndexArray.push_back({dwObjStmNum, 1}); + iSeg += 1; + } + m_iSeg = iSeg; + if (bEOF) { + m_ObjStream.Start(); + } + return 1; +} +bool CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, bool bEOF) { + FX_FILESIZE offset_tmp = pCreator->m_Offset; + uint32_t objnum = ++pCreator->m_dwLastObjNum; + CFX_FileBufferArchive* pFile = &pCreator->m_File; + bool bIncremental = (pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; + if (bIncremental) { + AddObjectNumberToIndexArray(objnum); + } else { + for (; m_dwTempObjNum < pCreator->m_dwLastObjNum; m_dwTempObjNum++) { + FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum); + if (offset) { + AppendIndex1(m_Buffer, *offset); + } else { + AppendIndex0(m_Buffer, false); + } + } + } + AppendIndex1(m_Buffer, offset_tmp); + FX_FILESIZE& offset = pCreator->m_Offset; + int32_t len = pFile->AppendDWord(objnum); + if (len < 0) { + return false; + } + offset += len; + if ((len = pFile->AppendString(" 0 obj\r\n<AppendDWord(0)) < 0) { + return false; + } + if ((len = pFile->AppendString(" ")) < 0) { + return false; + } + offset += len + 1; + if ((len = pFile->AppendDWord(objnum + 1)) < 0) { + return false; + } + offset += len; + } else { + for (const auto& pair : m_IndexArray) { + if ((len = pFile->AppendDWord(pair.objnum)) < 0) { + return false; + } + if (pFile->AppendString(" ") < 0) { + return false; + } + offset += len + 1; + if ((len = pFile->AppendDWord(pair.count)) < 0) { + return false; + } + if (pFile->AppendString(" ") < 0) { + return false; + } + offset += len + 1; + } + } + if (pFile->AppendString("]/Size ") < 0) { + return false; + } + if ((len = pFile->AppendDWord(objnum + 1)) < 0) { + return false; + } + offset += len + 7; + if (m_PrevOffset > 0) { + if (pFile->AppendString("/Prev ") < 0) { + return false; + } + FX_CHAR offset_buf[20]; + FXSYS_memset(offset_buf, 0, sizeof(offset_buf)); + FXSYS_i64toa(m_PrevOffset, offset_buf, 10); + int32_t offset_len = (int32_t)FXSYS_strlen(offset_buf); + if (pFile->AppendBlock(offset_buf, offset_len) < 0) { + return false; + } + offset += offset_len + 6; + } + CPDF_FlateEncoder encoder(m_Buffer.GetBuffer(), m_Buffer.GetLength(), true, + true); + if (pFile->AppendString("/Filter /FlateDecode") < 0) + return false; + + offset += 20; + if ((len = pFile->AppendString("/DecodeParms<>")) < + 0) { + return false; + } + + offset += len; + if (pFile->AppendString("/Length ") < 0) + return false; + + if ((len = pFile->AppendDWord(encoder.m_dwSize)) < 0) + return false; + + offset += len + 8; + if (bEOF) { + if ((len = PDF_CreatorWriteTrailer(pCreator->m_pDocument, pFile, + pCreator->m_pIDArray.get())) < 0) { + return false; + } + offset += len; + if (pCreator->m_pEncryptDict) { + uint32_t dwEncryptObjNum = pCreator->m_pEncryptDict->GetObjNum(); + if (dwEncryptObjNum == 0) { + dwEncryptObjNum = pCreator->m_dwEncryptObjNum; + } + if ((len = PDF_CreatorWriteEncrypt(pCreator->m_pEncryptDict, + dwEncryptObjNum, pFile)) < 0) { + return false; + } + offset += len; + } + } + if ((len = pFile->AppendString(">>stream\r\n")) < 0) + return false; + + offset += len; + if (pFile->AppendBlock(encoder.m_pData.Get(), encoder.m_dwSize) < 0) + return false; + + if ((len = pFile->AppendString("\r\nendstream\r\nendobj\r\n")) < 0) + return false; + + offset += encoder.m_dwSize + len; + m_PrevOffset = offset_tmp; + return true; +} + +bool CPDF_XRefStream::End(CPDF_Creator* pCreator, bool bEOF) { + if (EndObjectStream(pCreator, bEOF) < 0) { + return false; + } + return GenerateXRefStream(pCreator, bEOF); +} +bool CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator) { + if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) { + AppendIndex0(m_Buffer, true); + for (uint32_t i = 1; i < pCreator->m_dwLastObjNum + 1; i++) { + FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(i); + if (offset) { + AppendIndex1(m_Buffer, *offset); + } else { + AppendIndex0(m_Buffer, false); + } + } + } else { + for (const auto& pair : m_IndexArray) { + for (uint32_t j = pair.objnum; j < pair.objnum + pair.count; ++j) + AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[j]); + } + } + return GenerateXRefStream(pCreator, false); +} +void CPDF_XRefStream::AddObjectNumberToIndexArray(uint32_t objnum) { + if (m_IndexArray.empty()) { + m_IndexArray.push_back({objnum, 1}); + return; + } + uint32_t next_objnum = m_IndexArray.back().objnum + m_IndexArray.back().count; + if (objnum == next_objnum) + m_IndexArray.back().count += 1; + else + m_IndexArray.push_back({objnum, 1}); +} + +CPDF_Creator::CPDF_Creator(CPDF_Document* pDoc) + : m_pDocument(pDoc), + m_pParser(pDoc->GetParser()), + m_bSecurityChanged(false), + m_pEncryptDict(m_pParser ? m_pParser->GetEncryptDict() : nullptr), + m_dwEncryptObjNum(0), + m_bEncryptCloned(false), + m_pCryptoHandler(m_pParser ? m_pParser->GetCryptoHandler() : nullptr), + m_bLocalCryptoHandler(false), + m_pMetadata(nullptr), + m_ObjectStreamSize(200), + m_dwLastObjNum(m_pDocument->GetLastObjNum()), + m_Offset(0), + m_iStage(-1), + m_dwFlags(0), + m_Pos(nullptr), + m_XrefStart(0), + m_pIDArray(nullptr), + m_FileVersion(0) {} + +CPDF_Creator::~CPDF_Creator() { + ResetStandardSecurity(); + if (m_bEncryptCloned) { + delete m_pEncryptDict; + m_pEncryptDict = nullptr; + } + Clear(); +} + +int32_t CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj) { + if (!m_pXRefStream) + return 1; + + uint32_t objnum = pObj->GetObjNum(); + if (m_pParser && m_pParser->GetObjectGenNum(objnum) > 0) + return 1; + + if (pObj->IsNumber()) + return 1; + + CPDF_Dictionary* pDict = pObj->GetDict(); + if (pObj->IsStream()) { + if (pDict && pDict->GetStringFor("Type") == "XRef") + return 0; + return 1; + } + + if (pDict) { + if (pDict == m_pDocument->GetRoot() || pDict == m_pEncryptDict) + return 1; + if (pDict->IsSignatureDict()) + return 1; + if (pDict->GetStringFor("Type") == "Page") + return 1; + } + + m_pXRefStream->AddObjectNumberToIndexArray(objnum); + if (m_pXRefStream->CompressIndirectObject(objnum, pObj, this) < 0) + return -1; + if (!IsXRefNeedEnd(m_pXRefStream.get(), m_dwFlags)) + return 0; + if (!m_pXRefStream->End(this)) + return -1; + if (!m_pXRefStream->Start()) + return -1; + return 0; +} +int32_t CPDF_Creator::WriteIndirectObjectToStream(uint32_t objnum, + const uint8_t* pBuffer, + uint32_t dwSize) { + if (!m_pXRefStream) { + return 1; + } + m_pXRefStream->AddObjectNumberToIndexArray(objnum); + int32_t iRet = + m_pXRefStream->CompressIndirectObject(objnum, pBuffer, dwSize, this); + if (iRet < 1) { + return iRet; + } + if (!IsXRefNeedEnd(m_pXRefStream.get(), m_dwFlags)) { + return 0; + } + if (!m_pXRefStream->End(this)) { + return -1; + } + if (!m_pXRefStream->Start()) { + return -1; + } + return 0; +} +int32_t CPDF_Creator::AppendObjectNumberToXRef(uint32_t objnum) { + if (!m_pXRefStream) { + return 1; + } + m_pXRefStream->AddObjectNumberToIndexArray(objnum); + if (!IsXRefNeedEnd(m_pXRefStream.get(), m_dwFlags)) { + return 0; + } + if (!m_pXRefStream->End(this)) { + return -1; + } + if (!m_pXRefStream->Start()) { + return -1; + } + return 0; +} +int32_t CPDF_Creator::WriteStream(const CPDF_Object* pStream, + uint32_t objnum, + CPDF_CryptoHandler* pCrypto) { + CPDF_FlateEncoder encoder(const_cast(pStream->AsStream()), + pStream != m_pMetadata); + CPDF_Encryptor encryptor(pCrypto, objnum, encoder.m_pData.Get(), + encoder.m_dwSize); + if (static_cast(encoder.m_pDict->GetIntegerFor("Length")) != + encryptor.m_dwSize) { + encoder.CloneDict(); + encoder.m_pDict->SetNewFor( + "Length", static_cast(encryptor.m_dwSize)); + } + if (WriteDirectObj(objnum, encoder.m_pDict.Get()) < 0) + return -1; + + int len = m_File.AppendString("stream\r\n"); + if (len < 0) + return -1; + + m_Offset += len; + if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) + return -1; + + m_Offset += encryptor.m_dwSize; + if ((len = m_File.AppendString("\r\nendstream")) < 0) + return -1; + + m_Offset += len; + return 1; +} +int32_t CPDF_Creator::WriteIndirectObj(uint32_t objnum, + const CPDF_Object* pObj) { + int32_t len = m_File.AppendDWord(objnum); + if (len < 0) + return -1; + + m_Offset += len; + if ((len = m_File.AppendString(" 0 obj\r\n")) < 0) + return -1; + + m_Offset += len; + if (pObj->IsStream()) { + CPDF_CryptoHandler* pHandler = + pObj != m_pMetadata ? m_pCryptoHandler : nullptr; + if (WriteStream(pObj, objnum, pHandler) < 0) + return -1; + } else { + if (WriteDirectObj(objnum, pObj) < 0) + return -1; + } + if ((len = m_File.AppendString("\r\nendobj\r\n")) < 0) + return -1; + + m_Offset += len; + if (AppendObjectNumberToXRef(objnum) < 0) + return -1; + return 0; +} +int32_t CPDF_Creator::WriteIndirectObj(const CPDF_Object* pObj) { + int32_t iRet = WriteIndirectObjectToStream(pObj); + if (iRet < 1) { + return iRet; + } + return WriteIndirectObj(pObj->GetObjNum(), pObj); +} +int32_t CPDF_Creator::WriteDirectObj(uint32_t objnum, + const CPDF_Object* pObj, + bool bEncrypt) { + int32_t len = 0; + if (!pObj) { + if (m_File.AppendString(" null") < 0) { + return -1; + } + m_Offset += 5; + return 1; + } + switch (pObj->GetType()) { + case CPDF_Object::NULLOBJ: + if (m_File.AppendString(" null") < 0) { + return -1; + } + m_Offset += 5; + break; + case CPDF_Object::BOOLEAN: + case CPDF_Object::NUMBER: + if (m_File.AppendString(" ") < 0) { + return -1; + } + if ((len = m_File.AppendString(pObj->GetString().AsStringC())) < 0) { + return -1; + } + m_Offset += len + 1; + break; + case CPDF_Object::STRING: { + CFX_ByteString str = pObj->GetString(); + bool bHex = pObj->AsString()->IsHex(); + if (!m_pCryptoHandler || !bEncrypt) { + CFX_ByteString content = PDF_EncodeString(str, bHex); + if ((len = m_File.AppendString(content.AsStringC())) < 0) { + return -1; + } + m_Offset += len; + break; + } + CPDF_Encryptor encryptor(m_pCryptoHandler, objnum, (uint8_t*)str.c_str(), + str.GetLength()); + CFX_ByteString content = PDF_EncodeString( + CFX_ByteString((const FX_CHAR*)encryptor.m_pData, encryptor.m_dwSize), + bHex); + if ((len = m_File.AppendString(content.AsStringC())) < 0) { + return -1; + } + m_Offset += len; + break; + } + case CPDF_Object::STREAM: { + CPDF_FlateEncoder encoder(const_cast(pObj->AsStream()), + true); + CPDF_Encryptor encryptor(m_pCryptoHandler, objnum, encoder.m_pData.Get(), + encoder.m_dwSize); + if (static_cast(encoder.m_pDict->GetIntegerFor("Length")) != + encryptor.m_dwSize) { + encoder.CloneDict(); + encoder.m_pDict->SetNewFor( + "Length", static_cast(encryptor.m_dwSize)); + } + if (WriteDirectObj(objnum, encoder.m_pDict.Get()) < 0) + return -1; + + if ((len = m_File.AppendString("stream\r\n")) < 0) + return -1; + + m_Offset += len; + if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) + return -1; + + m_Offset += encryptor.m_dwSize; + if ((len = m_File.AppendString("\r\nendstream")) < 0) + return -1; + + m_Offset += len; + break; + } + case CPDF_Object::NAME: { + if (m_File.AppendString("/") < 0) { + return -1; + } + CFX_ByteString str = pObj->GetString(); + if ((len = m_File.AppendString(PDF_NameEncode(str).AsStringC())) < 0) { + return -1; + } + m_Offset += len + 1; + break; + } + case CPDF_Object::REFERENCE: { + if (m_File.AppendString(" ") < 0) + return -1; + if ((len = m_File.AppendDWord(pObj->AsReference()->GetRefObjNum())) < 0) + return -1; + if (m_File.AppendString(" 0 R") < 0) + return -1; + m_Offset += len + 5; + break; + } + case CPDF_Object::ARRAY: { + if (m_File.AppendString("[") < 0) { + return -1; + } + m_Offset += 1; + const CPDF_Array* p = pObj->AsArray(); + for (size_t i = 0; i < p->GetCount(); i++) { + CPDF_Object* pElement = p->GetObjectAt(i); + if (!pElement->IsInline()) { + if (m_File.AppendString(" ") < 0) { + return -1; + } + if ((len = m_File.AppendDWord(pElement->GetObjNum())) < 0) { + return -1; + } + if (m_File.AppendString(" 0 R") < 0) { + return -1; + } + m_Offset += len + 5; + } else { + if (WriteDirectObj(objnum, pElement) < 0) { + return -1; + } + } + } + if (m_File.AppendString("]") < 0) { + return -1; + } + m_Offset += 1; + break; + } + case CPDF_Object::DICTIONARY: { + if (!m_pCryptoHandler || pObj == m_pEncryptDict) + return PDF_CreatorAppendObject(pObj, &m_File, m_Offset); + if (m_File.AppendString("<<") < 0) + return -1; + + m_Offset += 2; + const CPDF_Dictionary* p = pObj->AsDictionary(); + bool bSignDict = p->IsSignatureDict(); + for (const auto& it : *p) { + bool bSignValue = false; + const CFX_ByteString& key = it.first; + CPDF_Object* pValue = it.second.get(); + if (m_File.AppendString("/") < 0) { + return -1; + } + if ((len = m_File.AppendString(PDF_NameEncode(key).AsStringC())) < 0) { + return -1; + } + m_Offset += len + 1; + if (bSignDict && key == "Contents") { + bSignValue = true; + } + if (!pValue->IsInline()) { + if (m_File.AppendString(" ") < 0) { + return -1; + } + if ((len = m_File.AppendDWord(pValue->GetObjNum())) < 0) { + return -1; + } + if (m_File.AppendString(" 0 R ") < 0) { + return -1; + } + m_Offset += len + 6; + } else { + if (WriteDirectObj(objnum, pValue, !bSignValue) < 0) { + return -1; + } + } + } + if (m_File.AppendString(">>") < 0) { + return -1; + } + m_Offset += 2; + break; + } + } + return 1; +} +int32_t CPDF_Creator::WriteOldIndirectObject(uint32_t objnum) { + if (m_pParser->IsObjectFreeOrNull(objnum)) + return 0; + + m_ObjectOffset[objnum] = m_Offset; + bool bExistInMap = !!m_pDocument->GetIndirectObject(objnum); + const uint8_t object_type = m_pParser->GetObjectType(objnum); + bool bObjStm = (object_type == 2) && m_pEncryptDict && !m_pXRefStream; + if (m_pParser->IsVersionUpdated() || m_bSecurityChanged || bExistInMap || + bObjStm) { + CPDF_Object* pObj = m_pDocument->GetOrParseIndirectObject(objnum); + if (!pObj) { + m_ObjectOffset[objnum] = 0; + return 0; + } + if (WriteIndirectObj(pObj)) { + return -1; + } + if (!bExistInMap) { + m_pDocument->DeleteIndirectObject(objnum); + } + } else { + uint8_t* pBuffer; + uint32_t size; + m_pParser->GetIndirectBinary(objnum, pBuffer, size); + if (!pBuffer) { + return 0; + } + if (object_type == 2) { + if (m_pXRefStream) { + if (WriteIndirectObjectToStream(objnum, pBuffer, size) < 0) { + FX_Free(pBuffer); + return -1; + } + } else { + int32_t len = m_File.AppendDWord(objnum); + if (len < 0) { + return -1; + } + if (m_File.AppendString(" 0 obj ") < 0) { + return -1; + } + m_Offset += len + 7; + if (m_File.AppendBlock(pBuffer, size) < 0) { + return -1; + } + m_Offset += size; + if (m_File.AppendString("\r\nendobj\r\n") < 0) { + return -1; + } + m_Offset += 10; + } + } else { + if (m_File.AppendBlock(pBuffer, size) < 0) { + return -1; + } + m_Offset += size; + if (AppendObjectNumberToXRef(objnum) < 0) { + return -1; + } + } + FX_Free(pBuffer); + } + return 1; +} +int32_t CPDF_Creator::WriteOldObjs(IFX_Pause* pPause) { + uint32_t nLastObjNum = m_pParser->GetLastObjNum(); + if (!m_pParser->IsValidObjectNumber(nLastObjNum)) + return 0; + + uint32_t objnum = (uint32_t)(uintptr_t)m_Pos; + for (; objnum <= nLastObjNum; ++objnum) { + int32_t iRet = WriteOldIndirectObject(objnum); + if (iRet < 0) + return iRet; + + if (!iRet) + continue; + + if (pPause && pPause->NeedToPauseNow()) { + m_Pos = (void*)(uintptr_t)(objnum + 1); + return 1; + } + } + return 0; +} + +int32_t CPDF_Creator::WriteNewObjs(bool bIncremental, IFX_Pause* pPause) { + size_t iCount = m_NewObjNumArray.size(); + size_t index = (size_t)(uintptr_t)m_Pos; + while (index < iCount) { + uint32_t objnum = m_NewObjNumArray[index]; + CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum); + if (!pObj) { + ++index; + continue; + } + m_ObjectOffset[objnum] = m_Offset; + if (WriteIndirectObj(pObj)) + return -1; + + index++; + if (pPause && pPause->NeedToPauseNow()) { + m_Pos = (FX_POSITION)(uintptr_t)index; + return 1; + } + } + return 0; +} + +void CPDF_Creator::InitOldObjNumOffsets() { + if (!m_pParser) { + return; + } + uint32_t j = 0; + uint32_t dwStart = 0; + uint32_t dwEnd = m_pParser->GetLastObjNum(); + while (dwStart <= dwEnd) { + while (dwStart <= dwEnd && m_pParser->IsObjectFreeOrNull(dwStart)) + dwStart++; + + if (dwStart > dwEnd) + break; + + j = dwStart; + while (j <= dwEnd && !m_pParser->IsObjectFreeOrNull(j)) + j++; + + m_ObjectOffset.Add(dwStart, j - dwStart); + dwStart = j; + } +} + +void CPDF_Creator::InitNewObjNumOffsets() { + bool bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0; + bool bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0; + for (const auto& pair : *m_pDocument) { + const uint32_t objnum = pair.first; + const CPDF_Object* pObj = pair.second.get(); + if (bIncremental || pObj->GetObjNum() == CPDF_Object::kInvalidObjNum) + continue; + if (m_pParser && m_pParser->IsValidObjectNumber(objnum) && + m_pParser->GetObjectType(objnum)) { + continue; + } + AppendNewObjNum(objnum); + } + + size_t iCount = m_NewObjNumArray.size(); + if (iCount == 0) + return; + + size_t i = 0; + uint32_t dwStartObjNum = 0; + bool bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0; + while (i < iCount) { + dwStartObjNum = m_NewObjNumArray[i]; + if ((bIncremental && (bNoOriginal || bCrossRefValid)) || + !m_ObjectOffset.GetPtrAt(dwStartObjNum)) { + break; + } + i++; + } + if (i >= iCount) + return; + + uint32_t dwLastObjNum = dwStartObjNum; + i++; + bool bNewStart = false; + for (; i < iCount; i++) { + uint32_t dwCurObjNum = m_NewObjNumArray[i]; + bool bExist = m_pParser && m_pParser->IsValidObjectNumber(dwCurObjNum) && + m_ObjectOffset.GetPtrAt(dwCurObjNum); + if (bExist || dwCurObjNum - dwLastObjNum > 1) { + if (!bNewStart) + m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); + dwStartObjNum = dwCurObjNum; + } + if (bNewStart) + dwStartObjNum = dwCurObjNum; + + bNewStart = bExist; + dwLastObjNum = dwCurObjNum; + } + m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); +} + +void CPDF_Creator::AppendNewObjNum(uint32_t objnum) { + m_NewObjNumArray.insert(std::lower_bound(m_NewObjNumArray.begin(), + m_NewObjNumArray.end(), objnum), + objnum); +} + +int32_t CPDF_Creator::WriteDoc_Stage1(IFX_Pause* pPause) { + ASSERT(m_iStage > -1 || m_iStage < 20); + if (m_iStage == 0) { + if (!m_pParser) { + m_dwFlags &= ~FPDFCREATE_INCREMENTAL; + } + if (m_bSecurityChanged && (m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0) { + m_dwFlags &= ~FPDFCREATE_INCREMENTAL; + } + CPDF_Dictionary* pDict = m_pDocument->GetRoot(); + m_pMetadata = pDict ? pDict->GetDirectObjectFor("Metadata") : nullptr; + if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) { + m_pXRefStream = pdfium::MakeUnique(); + m_pXRefStream->Start(); + if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser) { + FX_FILESIZE prev = m_pParser->GetLastXRefOffset(); + m_pXRefStream->m_PrevOffset = prev; + } + } + m_iStage = 10; + } + if (m_iStage == 10) { + if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0) { + if (m_File.AppendString("%PDF-1.") < 0) { + return -1; + } + m_Offset += 7; + int32_t version = 7; + if (m_FileVersion) { + version = m_FileVersion; + } else if (m_pParser) { + version = m_pParser->GetFileVersion(); + } + int32_t len = m_File.AppendDWord(version % 10); + if (len < 0) { + return -1; + } + m_Offset += len; + if ((len = m_File.AppendString("\r\n%\xA1\xB3\xC5\xD7\r\n")) < 0) { + return -1; + } + m_Offset += len; + InitOldObjNumOffsets(); + m_iStage = 20; + } else { + CFX_RetainPtr pSrcFile = + m_pParser->GetFileAccess(); + m_Offset = pSrcFile->GetSize(); + m_Pos = (void*)(uintptr_t)m_Offset; + m_iStage = 15; + } + } + if (m_iStage == 15) { + if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && m_Pos) { + CFX_RetainPtr pSrcFile = + m_pParser->GetFileAccess(); + uint8_t buffer[4096]; // TODO(tsepez): don't stack allocate. + uint32_t src_size = (uint32_t)(uintptr_t)m_Pos; + while (src_size) { + uint32_t block_size = src_size > 4096 ? 4096 : src_size; + if (!pSrcFile->ReadBlock(buffer, m_Offset - src_size, block_size)) { + return -1; + } + if (m_File.AppendBlock(buffer, block_size) < 0) { + return -1; + } + src_size -= block_size; + if (pPause && pPause->NeedToPauseNow()) { + m_Pos = (void*)(uintptr_t)src_size; + return 1; + } + } + } + if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && + m_pParser->GetLastXRefOffset() == 0) { + InitOldObjNumOffsets(); + uint32_t dwEnd = m_pParser->GetLastObjNum(); + bool bObjStm = (m_dwFlags & FPDFCREATE_OBJECTSTREAM) != 0; + for (uint32_t objnum = 0; objnum <= dwEnd; objnum++) { + if (m_pParser->IsObjectFreeOrNull(objnum)) + continue; + + m_ObjectOffset[objnum] = m_pParser->GetObjectPositionOrZero(objnum); + if (bObjStm) { + m_pXRefStream->AddObjectNumberToIndexArray(objnum); + } + } + if (bObjStm) { + m_pXRefStream->EndXRefStream(this); + m_pXRefStream->Start(); + } + } + m_iStage = 20; + } + InitNewObjNumOffsets(); + return m_iStage; +} +int32_t CPDF_Creator::WriteDoc_Stage2(IFX_Pause* pPause) { + ASSERT(m_iStage >= 20 || m_iStage < 30); + if (m_iStage == 20) { + if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 && m_pParser) { + m_Pos = (void*)(uintptr_t)0; + m_iStage = 21; + } else { + m_iStage = 25; + } + } + if (m_iStage == 21) { + int32_t iRet = WriteOldObjs(pPause); + if (iRet) { + return iRet; + } + m_iStage = 25; + } + if (m_iStage == 25) { + m_Pos = (void*)(uintptr_t)0; + m_iStage = 26; + } + if (m_iStage == 26) { + int32_t iRet = + WriteNewObjs((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0, pPause); + if (iRet) { + return iRet; + } + m_iStage = 27; + } + if (m_iStage == 27) { + if (m_pEncryptDict && m_pEncryptDict->IsInline()) { + m_dwLastObjNum += 1; + FX_FILESIZE saveOffset = m_Offset; + if (WriteIndirectObj(m_dwLastObjNum, m_pEncryptDict) < 0) + return -1; + + m_ObjectOffset.Add(m_dwLastObjNum, 1); + m_ObjectOffset[m_dwLastObjNum] = saveOffset; + m_dwEncryptObjNum = m_dwLastObjNum; + if (m_dwFlags & FPDFCREATE_INCREMENTAL) + m_NewObjNumArray.push_back(m_dwLastObjNum); + } + m_iStage = 80; + } + return m_iStage; +} +int32_t CPDF_Creator::WriteDoc_Stage3(IFX_Pause* pPause) { + ASSERT(m_iStage >= 80 || m_iStage < 90); + uint32_t dwLastObjNum = m_dwLastObjNum; + if (m_iStage == 80) { + m_XrefStart = m_Offset; + if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) { + m_pXRefStream->End(this, true); + m_XrefStart = m_pXRefStream->m_PrevOffset; + m_iStage = 90; + } else if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || + !m_pParser->IsXRefStream()) { + if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || + m_pParser->GetLastXRefOffset() == 0) { + CFX_ByteString str; + str = m_ObjectOffset.GetPtrAt(1) + ? "xref\r\n" + : "xref\r\n0 1\r\n0000000000 65535 f\r\n"; + if (m_File.AppendString(str.AsStringC()) < 0) { + return -1; + } + m_Pos = (void*)(uintptr_t)1; + m_iStage = 81; + } else { + if (m_File.AppendString("xref\r\n") < 0) { + return -1; + } + m_Pos = (void*)(uintptr_t)0; + m_iStage = 82; + } + } else { + m_iStage = 90; + } + } + if (m_iStage == 81) { + CFX_ByteString str; + uint32_t i = (uint32_t)(uintptr_t)m_Pos, j; + while (i <= dwLastObjNum) { + while (i <= dwLastObjNum && !m_ObjectOffset.GetPtrAt(i)) { + i++; + } + if (i > dwLastObjNum) { + break; + } + j = i; + while (j <= dwLastObjNum && m_ObjectOffset.GetPtrAt(j)) { + j++; + } + if (i == 1) { + str.Format("0 %d\r\n0000000000 65535 f\r\n", j); + } else { + str.Format("%d %d\r\n", i, j - i); + } + if (m_File.AppendBlock(str.c_str(), str.GetLength()) < 0) { + return -1; + } + while (i < j) { + str.Format("%010d 00000 n\r\n", m_ObjectOffset[i++]); + if (m_File.AppendBlock(str.c_str(), str.GetLength()) < 0) { + return -1; + } + } + if (i > dwLastObjNum) { + break; + } + if (pPause && pPause->NeedToPauseNow()) { + m_Pos = (void*)(uintptr_t)i; + return 1; + } + } + m_iStage = 90; + } + if (m_iStage == 82) { + CFX_ByteString str; + size_t iCount = m_NewObjNumArray.size(); + size_t i = (size_t)(uintptr_t)m_Pos; + while (i < iCount) { + size_t j = i; + uint32_t objnum = m_NewObjNumArray[i]; + while (j < iCount) { + if (++j == iCount) + break; + uint32_t dwCurrent = m_NewObjNumArray[j]; + if (dwCurrent - objnum > 1) + break; + objnum = dwCurrent; + } + objnum = m_NewObjNumArray[i]; + if (objnum == 1) { + str.Format("0 %d\r\n0000000000 65535 f\r\n", j - i + 1); + } else { + str.Format("%d %d\r\n", objnum, j - i); + } + if (m_File.AppendBlock(str.c_str(), str.GetLength()) < 0) { + return -1; + } + while (i < j) { + objnum = m_NewObjNumArray[i++]; + str.Format("%010d 00000 n\r\n", m_ObjectOffset[objnum]); + if (m_File.AppendBlock(str.c_str(), str.GetLength()) < 0) + return -1; + } + if (pPause && (i % 100) == 0 && pPause->NeedToPauseNow()) { + m_Pos = (void*)(uintptr_t)i; + return 1; + } + } + m_iStage = 90; + } + return m_iStage; +} + +int32_t CPDF_Creator::WriteDoc_Stage4(IFX_Pause* pPause) { + ASSERT(m_iStage >= 90); + if ((m_dwFlags & FPDFCREATE_OBJECTSTREAM) == 0) { + bool bXRefStream = + (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser->IsXRefStream(); + if (!bXRefStream) { + if (m_File.AppendString("trailer\r\n<<") < 0) { + return -1; + } + } else { + if (m_File.AppendDWord(m_pDocument->GetLastObjNum() + 1) < 0) { + return -1; + } + if (m_File.AppendString(" 0 obj <<") < 0) { + return -1; + } + } + if (m_pParser) { + CPDF_Dictionary* p = m_pParser->GetTrailer(); + for (const auto& it : *p) { + const CFX_ByteString& key = it.first; + CPDF_Object* pValue = it.second.get(); + // TODO(ochang): Consolidate with similar check in + // PDF_CreatorWriteTrailer. + if (key == "Encrypt" || key == "Size" || key == "Filter" || + key == "Index" || key == "Length" || key == "Prev" || key == "W" || + key == "XRefStm" || key == "ID") { + continue; + } + if (m_File.AppendString(("/")) < 0) { + return -1; + } + if (m_File.AppendString(PDF_NameEncode(key).AsStringC()) < 0) { + return -1; + } + if (!pValue->IsInline()) { + if (m_File.AppendString(" ") < 0) { + return -1; + } + if (m_File.AppendDWord(pValue->GetObjNum()) < 0) { + return -1; + } + if (m_File.AppendString(" 0 R ") < 0) { + return -1; + } + } else { + FX_FILESIZE offset = 0; + if (PDF_CreatorAppendObject(pValue, &m_File, offset) < 0) { + return -1; + } + } + } + } else { + if (m_File.AppendString("\r\n/Root ") < 0) { + return -1; + } + if (m_File.AppendDWord(m_pDocument->GetRoot()->GetObjNum()) < 0) { + return -1; + } + if (m_File.AppendString(" 0 R\r\n") < 0) { + return -1; + } + if (m_pDocument->GetInfo()) { + if (m_File.AppendString("/Info ") < 0) { + return -1; + } + if (m_File.AppendDWord(m_pDocument->GetInfo()->GetObjNum()) < 0) { + return -1; + } + if (m_File.AppendString(" 0 R\r\n") < 0) { + return -1; + } + } + } + if (m_pEncryptDict) { + if (m_File.AppendString("/Encrypt") < 0) { + return -1; + } + uint32_t dwObjNum = m_pEncryptDict->GetObjNum(); + if (dwObjNum == 0) { + dwObjNum = m_pDocument->GetLastObjNum() + 1; + } + if (m_File.AppendString(" ") < 0) { + return -1; + } + if (m_File.AppendDWord(dwObjNum) < 0) { + return -1; + } + if (m_File.AppendString(" 0 R ") < 0) { + return -1; + } + } + if (m_File.AppendString("/Size ") < 0) { + return -1; + } + if (m_File.AppendDWord(m_dwLastObjNum + (bXRefStream ? 2 : 1)) < 0) { + return -1; + } + if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0) { + FX_FILESIZE prev = m_pParser->GetLastXRefOffset(); + if (prev) { + if (m_File.AppendString("/Prev ") < 0) { + return -1; + } + FX_CHAR offset_buf[20]; + FXSYS_memset(offset_buf, 0, sizeof(offset_buf)); + FXSYS_i64toa(prev, offset_buf, 10); + if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) { + return -1; + } + } + } + if (m_pIDArray) { + if (m_File.AppendString(("/ID")) < 0) { + return -1; + } + FX_FILESIZE offset = 0; + if (PDF_CreatorAppendObject(m_pIDArray.get(), &m_File, offset) < 0) { + return -1; + } + } + if (!bXRefStream) { + if (m_File.AppendString(">>") < 0) { + return -1; + } + } else { + if (m_File.AppendString("/W[0 4 1]/Index[") < 0) { + return -1; + } + if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser && + m_pParser->GetLastXRefOffset() == 0) { + uint32_t i = 0; + for (i = 0; i < m_dwLastObjNum; i++) { + if (!m_ObjectOffset.GetPtrAt(i)) { + continue; + } + if (m_File.AppendDWord(i) < 0) { + return -1; + } + if (m_File.AppendString(" 1 ") < 0) { + return -1; + } + } + if (m_File.AppendString("]/Length ") < 0) { + return -1; + } + if (m_File.AppendDWord(m_dwLastObjNum * 5) < 0) { + return -1; + } + if (m_File.AppendString(">>stream\r\n") < 0) { + return -1; + } + for (i = 0; i < m_dwLastObjNum; i++) { + FX_FILESIZE* offset = m_ObjectOffset.GetPtrAt(i); + if (!offset) + continue; + OutputIndex(&m_File, *offset); + } + } else { + size_t count = m_NewObjNumArray.size(); + size_t i = 0; + for (i = 0; i < count; i++) { + if (m_File.AppendDWord(m_NewObjNumArray[i]) < 0) + return -1; + if (m_File.AppendString(" 1 ") < 0) + return -1; + } + if (m_File.AppendString("]/Length ") < 0) + return -1; + if (m_File.AppendDWord(count * 5) < 0) + return -1; + if (m_File.AppendString(">>stream\r\n") < 0) + return -1; + for (i = 0; i < count; i++) { + uint32_t objnum = m_NewObjNumArray[i]; + FX_FILESIZE offset = m_ObjectOffset[objnum]; + OutputIndex(&m_File, offset); + } + } + if (m_File.AppendString("\r\nendstream") < 0) + return -1; + } + } + if (m_File.AppendString("\r\nstartxref\r\n") < 0) { + return -1; + } + FX_CHAR offset_buf[20]; + FXSYS_memset(offset_buf, 0, sizeof(offset_buf)); + FXSYS_i64toa(m_XrefStart, offset_buf, 10); + if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) { + return -1; + } + if (m_File.AppendString("\r\n%%EOF\r\n") < 0) { + return -1; + } + m_File.Flush(); + return m_iStage = 100; +} + +void CPDF_Creator::Clear() { + m_pXRefStream.reset(); + m_File.Clear(); + m_NewObjNumArray.clear(); + m_pIDArray.reset(); +} + +bool CPDF_Creator::Create(const CFX_RetainPtr& pFile, + uint32_t flags) { + m_File.AttachFile(pFile); + return Create(flags); +} + +bool CPDF_Creator::Create(uint32_t flags) { + m_dwFlags = flags; + m_iStage = 0; + m_Offset = 0; + m_dwLastObjNum = m_pDocument->GetLastObjNum(); + m_ObjectOffset.Clear(); + m_NewObjNumArray.clear(); + InitID(); + if (flags & FPDFCREATE_PROGRESSIVE) + return true; + return Continue(nullptr) > -1; +} + +void CPDF_Creator::InitID(bool bDefault) { + CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : nullptr; + bool bNewId = !m_pIDArray; + if (bNewId) { + m_pIDArray = pdfium::MakeUnique(); + CPDF_Object* pID1 = pOldIDArray ? pOldIDArray->GetObjectAt(0) : nullptr; + if (pID1) { + m_pIDArray->Add(pID1->Clone()); + } else { + std::vector buffer = + PDF_GenerateFileID((uint32_t)(uintptr_t) this, m_dwLastObjNum); + CFX_ByteString bsBuffer(buffer.data(), buffer.size()); + m_pIDArray->AddNew(bsBuffer, true); + } + } + if (!bDefault) { + return; + } + if (pOldIDArray) { + CPDF_Object* pID2 = pOldIDArray->GetObjectAt(1); + if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) { + m_pIDArray->Add(pID2->Clone()); + return; + } + std::vector buffer = + PDF_GenerateFileID((uint32_t)(uintptr_t) this, m_dwLastObjNum); + CFX_ByteString bsBuffer(buffer.data(), buffer.size()); + m_pIDArray->AddNew(bsBuffer, true); + return; + } + m_pIDArray->Add(m_pIDArray->GetObjectAt(0)->Clone()); + if (m_pEncryptDict && !pOldIDArray && m_pParser && bNewId) { + if (m_pEncryptDict->GetStringFor("Filter") == "Standard") { + CFX_ByteString user_pass = m_pParser->GetPassword(); + uint32_t flag = PDF_ENCRYPT_CONTENT; + CPDF_SecurityHandler handler; + handler.OnCreate(m_pEncryptDict, m_pIDArray.get(), user_pass.raw_str(), + user_pass.GetLength(), flag); + if (m_bLocalCryptoHandler) + delete m_pCryptoHandler; + m_pCryptoHandler = new CPDF_CryptoHandler; + m_pCryptoHandler->Init(m_pEncryptDict, &handler); + m_bLocalCryptoHandler = true; + m_bSecurityChanged = true; + } + } +} +int32_t CPDF_Creator::Continue(IFX_Pause* pPause) { + if (m_iStage < 0) { + return m_iStage; + } + int32_t iRet = 0; + while (m_iStage < 100) { + if (m_iStage < 20) { + iRet = WriteDoc_Stage1(pPause); + } else if (m_iStage < 30) { + iRet = WriteDoc_Stage2(pPause); + } else if (m_iStage < 90) { + iRet = WriteDoc_Stage3(pPause); + } else { + iRet = WriteDoc_Stage4(pPause); + } + if (iRet < m_iStage) { + break; + } + } + if (iRet < 1 || m_iStage == 100) { + m_iStage = -1; + Clear(); + return iRet > 99 ? 0 : (iRet < 1 ? -1 : iRet); + } + return m_iStage; +} +bool CPDF_Creator::SetFileVersion(int32_t fileVersion) { + if (fileVersion < 10 || fileVersion > 17) { + return false; + } + m_FileVersion = fileVersion; + return true; +} +void CPDF_Creator::RemoveSecurity() { + ResetStandardSecurity(); + m_bSecurityChanged = true; + m_pEncryptDict = nullptr; + m_pCryptoHandler = nullptr; +} +void CPDF_Creator::ResetStandardSecurity() { + if (!m_bLocalCryptoHandler) + return; + + delete m_pCryptoHandler; + m_pCryptoHandler = nullptr; + m_bLocalCryptoHandler = false; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_cidfont.cpp b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_cidfont.cpp new file mode 100644 index 000000000000..6d01538f5448 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_cidfont.cpp @@ -0,0 +1,851 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/font/cpdf_cidfont.h" + +#include +#include + +#include "core/fpdfapi/cmaps/cmap_int.h" +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/font/cpdf_fontencoding.h" +#include "core/fpdfapi/font/font_int.h" +#include "core/fpdfapi/font/ttgsubtable.h" +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "third_party/base/numerics/safe_math.h" +#include "third_party/base/ptr_util.h" + +namespace { + +const uint16_t g_CharsetCPs[CIDSET_NUM_SETS] = {0, 936, 950, 932, 949, 1200}; + +const struct CIDTransform { + uint16_t cid; + uint8_t a; + uint8_t b; + uint8_t c; + uint8_t d; + uint8_t e; + uint8_t f; +} g_Japan1_VertCIDs[] = { + {97, 129, 0, 0, 127, 55, 0}, {7887, 127, 0, 0, 127, 76, 89}, + {7888, 127, 0, 0, 127, 79, 94}, {7889, 0, 129, 127, 0, 17, 127}, + {7890, 0, 129, 127, 0, 17, 127}, {7891, 0, 129, 127, 0, 17, 127}, + {7892, 0, 129, 127, 0, 17, 127}, {7893, 0, 129, 127, 0, 17, 127}, + {7894, 0, 129, 127, 0, 17, 127}, {7895, 0, 129, 127, 0, 17, 127}, + {7896, 0, 129, 127, 0, 17, 127}, {7897, 0, 129, 127, 0, 17, 127}, + {7898, 0, 129, 127, 0, 17, 127}, {7899, 0, 129, 127, 0, 17, 104}, + {7900, 0, 129, 127, 0, 17, 127}, {7901, 0, 129, 127, 0, 17, 104}, + {7902, 0, 129, 127, 0, 17, 127}, {7903, 0, 129, 127, 0, 17, 127}, + {7904, 0, 129, 127, 0, 17, 127}, {7905, 0, 129, 127, 0, 17, 114}, + {7906, 0, 129, 127, 0, 17, 127}, {7907, 0, 129, 127, 0, 17, 127}, + {7908, 0, 129, 127, 0, 17, 127}, {7909, 0, 129, 127, 0, 17, 127}, + {7910, 0, 129, 127, 0, 17, 127}, {7911, 0, 129, 127, 0, 17, 127}, + {7912, 0, 129, 127, 0, 17, 127}, {7913, 0, 129, 127, 0, 17, 127}, + {7914, 0, 129, 127, 0, 17, 127}, {7915, 0, 129, 127, 0, 17, 114}, + {7916, 0, 129, 127, 0, 17, 127}, {7917, 0, 129, 127, 0, 17, 127}, + {7918, 127, 0, 0, 127, 18, 25}, {7919, 127, 0, 0, 127, 18, 25}, + {7920, 127, 0, 0, 127, 18, 25}, {7921, 127, 0, 0, 127, 18, 25}, + {7922, 127, 0, 0, 127, 18, 25}, {7923, 127, 0, 0, 127, 18, 25}, + {7924, 127, 0, 0, 127, 18, 25}, {7925, 127, 0, 0, 127, 18, 25}, + {7926, 127, 0, 0, 127, 18, 25}, {7927, 127, 0, 0, 127, 18, 25}, + {7928, 127, 0, 0, 127, 18, 25}, {7929, 127, 0, 0, 127, 18, 25}, + {7930, 127, 0, 0, 127, 18, 25}, {7931, 127, 0, 0, 127, 18, 25}, + {7932, 127, 0, 0, 127, 18, 25}, {7933, 127, 0, 0, 127, 18, 25}, + {7934, 127, 0, 0, 127, 18, 25}, {7935, 127, 0, 0, 127, 18, 25}, + {7936, 127, 0, 0, 127, 18, 25}, {7937, 127, 0, 0, 127, 18, 25}, + {7938, 127, 0, 0, 127, 18, 25}, {7939, 127, 0, 0, 127, 18, 25}, + {8720, 0, 129, 127, 0, 19, 102}, {8721, 0, 129, 127, 0, 13, 127}, + {8722, 0, 129, 127, 0, 19, 108}, {8723, 0, 129, 127, 0, 19, 102}, + {8724, 0, 129, 127, 0, 19, 102}, {8725, 0, 129, 127, 0, 19, 102}, + {8726, 0, 129, 127, 0, 19, 102}, {8727, 0, 129, 127, 0, 19, 102}, + {8728, 0, 129, 127, 0, 19, 114}, {8729, 0, 129, 127, 0, 19, 114}, + {8730, 0, 129, 127, 0, 38, 108}, {8731, 0, 129, 127, 0, 13, 108}, + {8732, 0, 129, 127, 0, 19, 108}, {8733, 0, 129, 127, 0, 19, 108}, + {8734, 0, 129, 127, 0, 19, 108}, {8735, 0, 129, 127, 0, 19, 108}, + {8736, 0, 129, 127, 0, 19, 102}, {8737, 0, 129, 127, 0, 19, 102}, + {8738, 0, 129, 127, 0, 19, 102}, {8739, 0, 129, 127, 0, 19, 102}, + {8740, 0, 129, 127, 0, 19, 102}, {8741, 0, 129, 127, 0, 19, 102}, + {8742, 0, 129, 127, 0, 19, 102}, {8743, 0, 129, 127, 0, 19, 102}, + {8744, 0, 129, 127, 0, 19, 102}, {8745, 0, 129, 127, 0, 19, 102}, + {8746, 0, 129, 127, 0, 19, 114}, {8747, 0, 129, 127, 0, 19, 114}, + {8748, 0, 129, 127, 0, 19, 102}, {8749, 0, 129, 127, 0, 19, 102}, + {8750, 0, 129, 127, 0, 19, 102}, {8751, 0, 129, 127, 0, 19, 102}, + {8752, 0, 129, 127, 0, 19, 102}, {8753, 0, 129, 127, 0, 19, 102}, + {8754, 0, 129, 127, 0, 19, 102}, {8755, 0, 129, 127, 0, 19, 102}, + {8756, 0, 129, 127, 0, 19, 102}, {8757, 0, 129, 127, 0, 19, 102}, + {8758, 0, 129, 127, 0, 19, 102}, {8759, 0, 129, 127, 0, 19, 102}, + {8760, 0, 129, 127, 0, 19, 102}, {8761, 0, 129, 127, 0, 19, 102}, + {8762, 0, 129, 127, 0, 19, 102}, {8763, 0, 129, 127, 0, 19, 102}, + {8764, 0, 129, 127, 0, 19, 102}, {8765, 0, 129, 127, 0, 19, 102}, + {8766, 0, 129, 127, 0, 19, 102}, {8767, 0, 129, 127, 0, 19, 102}, + {8768, 0, 129, 127, 0, 19, 102}, {8769, 0, 129, 127, 0, 19, 102}, + {8770, 0, 129, 127, 0, 19, 102}, {8771, 0, 129, 127, 0, 19, 102}, + {8772, 0, 129, 127, 0, 19, 102}, {8773, 0, 129, 127, 0, 19, 102}, + {8774, 0, 129, 127, 0, 19, 102}, {8775, 0, 129, 127, 0, 19, 102}, + {8776, 0, 129, 127, 0, 19, 102}, {8777, 0, 129, 127, 0, 19, 102}, + {8778, 0, 129, 127, 0, 19, 102}, {8779, 0, 129, 127, 0, 19, 114}, + {8780, 0, 129, 127, 0, 19, 108}, {8781, 0, 129, 127, 0, 19, 114}, + {8782, 0, 129, 127, 0, 13, 114}, {8783, 0, 129, 127, 0, 19, 108}, + {8784, 0, 129, 127, 0, 13, 114}, {8785, 0, 129, 127, 0, 19, 108}, + {8786, 0, 129, 127, 0, 19, 108}, {8787, 0, 129, 127, 0, 19, 108}, + {8788, 0, 129, 127, 0, 19, 108}, {8789, 0, 129, 127, 0, 19, 108}, + {8790, 0, 129, 127, 0, 19, 108}, {8791, 0, 129, 127, 0, 19, 108}, + {8792, 0, 129, 127, 0, 19, 108}, {8793, 0, 129, 127, 0, 19, 108}, + {8794, 0, 129, 127, 0, 19, 108}, {8795, 0, 129, 127, 0, 19, 108}, + {8796, 0, 129, 127, 0, 19, 108}, {8797, 0, 129, 127, 0, 19, 108}, + {8798, 0, 129, 127, 0, 19, 108}, {8799, 0, 129, 127, 0, 19, 108}, + {8800, 0, 129, 127, 0, 19, 108}, {8801, 0, 129, 127, 0, 19, 108}, + {8802, 0, 129, 127, 0, 19, 108}, {8803, 0, 129, 127, 0, 19, 108}, + {8804, 0, 129, 127, 0, 19, 108}, {8805, 0, 129, 127, 0, 19, 108}, + {8806, 0, 129, 127, 0, 19, 108}, {8807, 0, 129, 127, 0, 19, 108}, + {8808, 0, 129, 127, 0, 19, 108}, {8809, 0, 129, 127, 0, 19, 108}, + {8810, 0, 129, 127, 0, 19, 108}, {8811, 0, 129, 127, 0, 19, 114}, + {8812, 0, 129, 127, 0, 19, 102}, {8813, 0, 129, 127, 0, 19, 114}, + {8814, 0, 129, 127, 0, 76, 102}, {8815, 0, 129, 127, 0, 13, 121}, + {8816, 0, 129, 127, 0, 19, 114}, {8817, 0, 129, 127, 0, 19, 127}, + {8818, 0, 129, 127, 0, 19, 114}, {8819, 0, 129, 127, 0, 218, 108}, +}; + +CPDF_FontGlobals* GetFontGlobals() { + return CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); +} + +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + +bool IsValidEmbeddedCharcodeFromUnicodeCharset(CIDSet charset) { + switch (charset) { + case CIDSET_GB1: + case CIDSET_CNS1: + case CIDSET_JAPAN1: + case CIDSET_KOREA1: + return true; + + default: + return false; + } +} + +FX_WCHAR EmbeddedUnicodeFromCharcode(const FXCMAP_CMap* pEmbedMap, + CIDSet charset, + uint32_t charcode) { + if (!IsValidEmbeddedCharcodeFromUnicodeCharset(charset)) + return 0; + + uint16_t cid = FPDFAPI_CIDFromCharCode(pEmbedMap, charcode); + const auto& codes = GetFontGlobals()->m_EmbeddedToUnicodes[charset]; + if (codes.m_pMap && cid && cid < codes.m_Count) + return codes.m_pMap[cid]; + return 0; +} + +uint32_t EmbeddedCharcodeFromUnicode(const FXCMAP_CMap* pEmbedMap, + CIDSet charset, + FX_WCHAR unicode) { + if (!IsValidEmbeddedCharcodeFromUnicodeCharset(charset)) + return 0; + + const auto& codes = GetFontGlobals()->m_EmbeddedToUnicodes[charset]; + const uint16_t* pCodes = codes.m_pMap; + if (!pCodes) + return 0; + + for (uint32_t i = 0; i < codes.m_Count; ++i) { + if (pCodes[i] == unicode) { + uint32_t CharCode = FPDFAPI_CharCodeFromCID(pEmbedMap, i); + if (CharCode) + return CharCode; + } + } + return 0; +} + +#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + +void FT_UseCIDCharmap(FXFT_Face face, int coding) { + int encoding; + switch (coding) { + case CIDCODING_GB: + encoding = FXFT_ENCODING_GB2312; + break; + case CIDCODING_BIG5: + encoding = FXFT_ENCODING_BIG5; + break; + case CIDCODING_JIS: + encoding = FXFT_ENCODING_SJIS; + break; + case CIDCODING_KOREA: + encoding = FXFT_ENCODING_JOHAB; + break; + default: + encoding = FXFT_ENCODING_UNICODE; + } + int err = FXFT_Select_Charmap(face, encoding); + if (err) + err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE); + if (err && FXFT_Get_Face_Charmaps(face)) + FXFT_Set_Charmap(face, *FXFT_Get_Face_Charmaps(face)); +} + +bool IsMetricForCID(const uint32_t* pEntry, uint16_t CID) { + return pEntry[0] <= CID && pEntry[1] >= CID; +} + +} // namespace + +CPDF_CIDFont::CPDF_CIDFont() + : m_pCID2UnicodeMap(nullptr), + m_bCIDIsGID(false), + m_bAnsiWidthsFixed(false), + m_bAdobeCourierStd(false) { + for (size_t i = 0; i < FX_ArraySize(m_CharBBox); ++i) + m_CharBBox[i] = FX_RECT(-1, -1, -1, -1); +} + +CPDF_CIDFont::~CPDF_CIDFont() {} + +bool CPDF_CIDFont::IsCIDFont() const { + return true; +} + +const CPDF_CIDFont* CPDF_CIDFont::AsCIDFont() const { + return this; +} + +CPDF_CIDFont* CPDF_CIDFont::AsCIDFont() { + return this; +} + +uint16_t CPDF_CIDFont::CIDFromCharCode(uint32_t charcode) const { + return m_pCMap ? m_pCMap->CIDFromCharCode(charcode) + : static_cast(charcode); +} + +bool CPDF_CIDFont::IsVertWriting() const { + return m_pCMap && m_pCMap->IsVertWriting(); +} + +CFX_WideString CPDF_CIDFont::UnicodeFromCharCode(uint32_t charcode) const { + CFX_WideString str = CPDF_Font::UnicodeFromCharCode(charcode); + if (!str.IsEmpty()) + return str; + FX_WCHAR ret = GetUnicodeFromCharCode(charcode); + return ret ? ret : CFX_WideString(); +} + +FX_WCHAR CPDF_CIDFont::GetUnicodeFromCharCode(uint32_t charcode) const { + switch (m_pCMap->m_Coding) { + case CIDCODING_UCS2: + case CIDCODING_UTF16: + return static_cast(charcode); + case CIDCODING_CID: + if (!m_pCID2UnicodeMap || !m_pCID2UnicodeMap->IsLoaded()) + return 0; + return m_pCID2UnicodeMap->UnicodeFromCID(static_cast(charcode)); + } + if (m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded() && m_pCMap->IsLoaded()) + return m_pCID2UnicodeMap->UnicodeFromCID(CIDFromCharCode(charcode)); + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + FX_WCHAR unicode; + int charsize = 1; + if (charcode > 255) { + charcode = (charcode % 256) * 256 + (charcode / 256); + charsize = 2; + } + int ret = FXSYS_MultiByteToWideChar( + g_CharsetCPs[m_pCMap->m_Coding], 0, + reinterpret_cast(&charcode), charsize, &unicode, 1); + return ret == 1 ? unicode : 0; +#else + if (!m_pCMap->m_pEmbedMap) + return 0; + return EmbeddedUnicodeFromCharcode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, + charcode); +#endif +} + +uint32_t CPDF_CIDFont::CharCodeFromUnicode(FX_WCHAR unicode) const { + uint32_t charcode = CPDF_Font::CharCodeFromUnicode(unicode); + if (charcode) + return charcode; + switch (m_pCMap->m_Coding) { + case CIDCODING_UNKNOWN: + return 0; + case CIDCODING_UCS2: + case CIDCODING_UTF16: + return unicode; + case CIDCODING_CID: { + if (!m_pCID2UnicodeMap || !m_pCID2UnicodeMap->IsLoaded()) + return 0; + uint32_t CID = 0; + while (CID < 65536) { + FX_WCHAR this_unicode = + m_pCID2UnicodeMap->UnicodeFromCID(static_cast(CID)); + if (this_unicode == unicode) + return CID; + CID++; + } + break; + } + } + + if (unicode < 0x80) + return static_cast(unicode); + if (m_pCMap->m_Coding == CIDCODING_CID) + return 0; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + uint8_t buffer[32]; + int ret = FXSYS_WideCharToMultiByte( + g_CharsetCPs[m_pCMap->m_Coding], 0, &unicode, 1, + reinterpret_cast(buffer), 4, nullptr, nullptr); + if (ret == 1) + return buffer[0]; + if (ret == 2) + return buffer[0] * 256 + buffer[1]; +#else + if (m_pCMap->m_pEmbedMap) { + return EmbeddedCharcodeFromUnicode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, + unicode); + } +#endif + return 0; +} + +bool CPDF_CIDFont::Load() { + if (m_pFontDict->GetStringFor("Subtype") == "TrueType") { + LoadGB2312(); + return true; + } + + CPDF_Array* pFonts = m_pFontDict->GetArrayFor("DescendantFonts"); + if (!pFonts || pFonts->GetCount() != 1) + return false; + + CPDF_Dictionary* pCIDFontDict = pFonts->GetDictAt(0); + if (!pCIDFontDict) + return false; + + m_BaseFont = pCIDFontDict->GetStringFor("BaseFont"); + if ((m_BaseFont.Compare("CourierStd") == 0 || + m_BaseFont.Compare("CourierStd-Bold") == 0 || + m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || + m_BaseFont.Compare("CourierStd-Oblique") == 0) && + !IsEmbedded()) { + m_bAdobeCourierStd = true; + } + CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDictFor("FontDescriptor"); + if (pFontDesc) + LoadFontDescriptor(pFontDesc); + + CPDF_Object* pEncoding = m_pFontDict->GetDirectObjectFor("Encoding"); + if (!pEncoding) + return false; + + CFX_ByteString subtype = pCIDFontDict->GetStringFor("Subtype"); + m_bType1 = (subtype == "CIDFontType0"); + + CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; + if (pEncoding->IsName()) { + CFX_ByteString cmap = pEncoding->GetString(); + bool bPromptCJK = m_pFontFile && m_bType1; + m_pCMap = manager.GetPredefinedCMap(cmap, bPromptCJK); + if (!m_pCMap) + return false; + } else if (CPDF_Stream* pStream = pEncoding->AsStream()) { + m_pCMap = pdfium::MakeUnique(); + CPDF_StreamAcc acc; + acc.LoadAllData(pStream, false); + m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize()); + } else { + return false; + } + + m_Charset = m_pCMap->m_Charset; + if (m_Charset == CIDSET_UNKNOWN) { + CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDictFor("CIDSystemInfo"); + if (pCIDInfo) { + m_Charset = + CharsetFromOrdering(pCIDInfo->GetStringFor("Ordering").AsStringC()); + } + } + if (m_Charset != CIDSET_UNKNOWN) { + bool bPromptCJK = !m_pFontFile && (m_pCMap->m_Coding == CIDCODING_CID || + pCIDFontDict->KeyExist("W")); + m_pCID2UnicodeMap = manager.GetCID2UnicodeMap(m_Charset, bPromptCJK); + } + if (m_Font.GetFace()) { + if (m_bType1) + FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE); + else + FT_UseCIDCharmap(m_Font.GetFace(), m_pCMap->m_Coding); + } + m_DefaultWidth = pCIDFontDict->GetIntegerFor("DW", 1000); + CPDF_Array* pWidthArray = pCIDFontDict->GetArrayFor("W"); + if (pWidthArray) + LoadMetricsArray(pWidthArray, &m_WidthList, 1); + if (!IsEmbedded()) + LoadSubstFont(); + + if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) { + CPDF_Object* pmap = pCIDFontDict->GetDirectObjectFor("CIDToGIDMap"); + if (pmap) { + if (CPDF_Stream* pStream = pmap->AsStream()) { + m_pStreamAcc = pdfium::MakeUnique(); + m_pStreamAcc->LoadAllData(pStream, false); + } else if (pmap->GetString() == "Identity") { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + if (m_pFontFile) + m_bCIDIsGID = true; +#else + m_bCIDIsGID = true; +#endif + } + } + } + + CheckFontMetrics(); + if (IsVertWriting()) { + pWidthArray = pCIDFontDict->GetArrayFor("W2"); + if (pWidthArray) + LoadMetricsArray(pWidthArray, &m_VertMetrics, 3); + CPDF_Array* pDefaultArray = pCIDFontDict->GetArrayFor("DW2"); + if (pDefaultArray) { + m_DefaultVY = pDefaultArray->GetIntegerAt(0); + m_DefaultW1 = pDefaultArray->GetIntegerAt(1); + } else { + m_DefaultVY = 880; + m_DefaultW1 = -1000; + } + } + return true; +} + +FX_RECT CPDF_CIDFont::GetCharBBox(uint32_t charcode) { + if (charcode < 256 && m_CharBBox[charcode].right != -1) + return m_CharBBox[charcode]; + + FX_RECT rect; + bool bVert = false; + int glyph_index = GlyphFromCharCode(charcode, &bVert); + FXFT_Face face = m_Font.GetFace(); + if (face) { + if (FXFT_Is_Face_Tricky(face)) { + int err = FXFT_Load_Glyph(face, glyph_index, + FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); + if (!err) { + FXFT_BBox cbox; + FXFT_Glyph glyph; + err = FXFT_Get_Glyph(((FXFT_Face)face)->glyph, &glyph); + if (!err) { + FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox); + int pixel_size_x = ((FXFT_Face)face)->size->metrics.x_ppem; + int pixel_size_y = ((FXFT_Face)face)->size->metrics.y_ppem; + if (pixel_size_x == 0 || pixel_size_y == 0) { + rect = FX_RECT(cbox.xMin, cbox.yMax, cbox.xMax, cbox.yMin); + } else { + rect = FX_RECT(cbox.xMin * 1000 / pixel_size_x, + cbox.yMax * 1000 / pixel_size_y, + cbox.xMax * 1000 / pixel_size_x, + cbox.yMin * 1000 / pixel_size_y); + } + rect.top = std::min(rect.top, + static_cast(FXFT_Get_Face_Ascender(face))); + rect.bottom = std::max( + rect.bottom, static_cast(FXFT_Get_Face_Descender(face))); + FXFT_Done_Glyph(glyph); + } + } + } else { + int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_SCALE); + if (err == 0) { + rect = FX_RECT(TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face), + TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face), + TT2PDF(FXFT_Get_Glyph_HoriBearingX(face) + + FXFT_Get_Glyph_Width(face), + face), + TT2PDF(FXFT_Get_Glyph_HoriBearingY(face) - + FXFT_Get_Glyph_Height(face), + face)); + rect.top += rect.top / 64; + } + } + } + if (!m_pFontFile && m_Charset == CIDSET_JAPAN1) { + uint16_t CID = CIDFromCharCode(charcode); + const uint8_t* pTransform = GetCIDTransform(CID); + if (pTransform && !bVert) { + CFX_Matrix matrix(CIDTransformToFloat(pTransform[0]), + CIDTransformToFloat(pTransform[1]), + CIDTransformToFloat(pTransform[2]), + CIDTransformToFloat(pTransform[3]), + CIDTransformToFloat(pTransform[4]) * 1000, + CIDTransformToFloat(pTransform[5]) * 1000); + CFX_FloatRect rect_f(rect); + matrix.TransformRect(rect_f); + rect = rect_f.GetOuterRect(); + } + } + if (charcode < 256) + m_CharBBox[charcode] = rect; + + return rect; +} + +int CPDF_CIDFont::GetCharWidthF(uint32_t charcode) { + if (charcode < 0x80 && m_bAnsiWidthsFixed) + return (charcode >= 32 && charcode < 127) ? 500 : 0; + + uint16_t cid = CIDFromCharCode(charcode); + size_t size = m_WidthList.size(); + const uint32_t* pList = m_WidthList.data(); + for (size_t i = 0; i < size; i += 3) { + const uint32_t* pEntry = pList + i; + if (IsMetricForCID(pEntry, cid)) + return static_cast(pEntry[2]); + } + return m_DefaultWidth; +} + +short CPDF_CIDFont::GetVertWidth(uint16_t CID) const { + size_t vertsize = m_VertMetrics.size() / 5; + if (vertsize) { + const uint32_t* pTable = m_VertMetrics.data(); + for (size_t i = 0; i < vertsize; i++) { + const uint32_t* pEntry = pTable + (i * 5); + if (IsMetricForCID(pEntry, CID)) + return static_cast(pEntry[2]); + } + } + return m_DefaultW1; +} + +void CPDF_CIDFont::GetVertOrigin(uint16_t CID, short& vx, short& vy) const { + size_t vertsize = m_VertMetrics.size() / 5; + if (vertsize) { + const uint32_t* pTable = m_VertMetrics.data(); + for (size_t i = 0; i < vertsize; i++) { + const uint32_t* pEntry = pTable + (i * 5); + if (IsMetricForCID(pEntry, CID)) { + vx = static_cast(pEntry[3]); + vy = static_cast(pEntry[4]); + return; + } + } + } + uint32_t dwWidth = m_DefaultWidth; + size_t size = m_WidthList.size(); + const uint32_t* pList = m_WidthList.data(); + for (size_t i = 0; i < size; i += 3) { + const uint32_t* pEntry = pList + i; + if (IsMetricForCID(pEntry, CID)) { + dwWidth = pEntry[2]; + break; + } + } + vx = static_cast(dwWidth) / 2; + vy = m_DefaultVY; +} + +int CPDF_CIDFont::GetGlyphIndex(uint32_t unicode, bool* pVertGlyph) { + if (pVertGlyph) + *pVertGlyph = false; + + FXFT_Face face = m_Font.GetFace(); + int index = FXFT_Get_Char_Index(face, unicode); + if (unicode == 0x2502) + return index; + + if (!index || !IsVertWriting()) + return index; + + if (m_pTTGSUBTable) + return GetVerticalGlyph(index, pVertGlyph); + + if (!m_Font.GetSubData()) { + unsigned long length = 0; + int error = FXFT_Load_Sfnt_Table(face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, + nullptr, &length); + if (!error) + m_Font.SetSubData(FX_Alloc(uint8_t, length)); + } + int error = FXFT_Load_Sfnt_Table(face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, + m_Font.GetSubData(), nullptr); + if (error || !m_Font.GetSubData()) + return index; + + m_pTTGSUBTable = pdfium::MakeUnique(); + m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.GetSubData()); + return GetVerticalGlyph(index, pVertGlyph); +} + +int CPDF_CIDFont::GetVerticalGlyph(int index, bool* pVertGlyph) { + uint32_t vindex = 0; + m_pTTGSUBTable->GetVerticalGlyph(index, &vindex); + if (!vindex) + return index; + + index = vindex; + if (pVertGlyph) + *pVertGlyph = true; + return index; +} + +int CPDF_CIDFont::GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) { + if (pVertGlyph) + *pVertGlyph = false; + + if (!m_pFontFile && !m_pStreamAcc) { + uint16_t cid = CIDFromCharCode(charcode); + FX_WCHAR unicode = 0; + if (m_bCIDIsGID) { +#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ + return cid; +#else + if (m_Flags & FXFONT_SYMBOLIC) + return cid; + + CFX_WideString uni_str = UnicodeFromCharCode(charcode); + if (uni_str.IsEmpty()) + return cid; + + unicode = uni_str.GetAt(0); +#endif + } else { + if (cid && m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded()) + unicode = m_pCID2UnicodeMap->UnicodeFromCID(cid); + if (unicode == 0) + unicode = GetUnicodeFromCharCode(charcode); + if (unicode == 0) { + CFX_WideString unicode_str = UnicodeFromCharCode(charcode); + if (!unicode_str.IsEmpty()) + unicode = unicode_str.GetAt(0); + } + } + FXFT_Face face = m_Font.GetFace(); + if (unicode == 0) { + if (!m_bAdobeCourierStd) + return charcode ? static_cast(charcode) : -1; + + charcode += 31; + bool bMSUnicode = FT_UseTTCharmap(face, 3, 1); + bool bMacRoman = !bMSUnicode && FT_UseTTCharmap(face, 1, 0); + int iBaseEncoding = PDFFONT_ENCODING_STANDARD; + if (bMSUnicode) + iBaseEncoding = PDFFONT_ENCODING_WINANSI; + else if (bMacRoman) + iBaseEncoding = PDFFONT_ENCODING_MACROMAN; + const FX_CHAR* name = GetAdobeCharName( + iBaseEncoding, std::vector(), charcode); + if (!name) + return charcode ? static_cast(charcode) : -1; + + int index = 0; + uint16_t name_unicode = PDF_UnicodeFromAdobeName(name); + if (!name_unicode) + return charcode ? static_cast(charcode) : -1; + + if (iBaseEncoding == PDFFONT_ENCODING_STANDARD) + return FXFT_Get_Char_Index(face, name_unicode); + + if (iBaseEncoding == PDFFONT_ENCODING_WINANSI) { + index = FXFT_Get_Char_Index(face, name_unicode); + } else { + ASSERT(iBaseEncoding == PDFFONT_ENCODING_MACROMAN); + uint32_t maccode = + FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, name_unicode); + index = maccode ? FXFT_Get_Char_Index(face, maccode) + : FXFT_Get_Name_Index(face, const_cast(name)); + } + if (index == 0 || index == 0xffff) + return charcode ? static_cast(charcode) : -1; + return index; + } + if (m_Charset == CIDSET_JAPAN1) { + if (unicode == '\\') { + unicode = '/'; +#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ + } else if (unicode == 0xa5) { + unicode = 0x5c; +#endif + } + } + if (!face) + return unicode; + + int err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE); + if (err) { + int i; + for (i = 0; i < FXFT_Get_Face_CharmapCount(face); i++) { + uint32_t ret = FT_CharCodeFromUnicode( + FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i]), + static_cast(charcode)); + if (ret == 0) + continue; + FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[i]); + unicode = static_cast(ret); + break; + } + if (i == FXFT_Get_Face_CharmapCount(face) && i) { + FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]); + unicode = static_cast(charcode); + } + } + if (FXFT_Get_Face_Charmap(face)) { + int index = GetGlyphIndex(unicode, pVertGlyph); + return index != 0 ? index : -1; + } + return unicode; + } + + if (!m_Font.GetFace()) + return -1; + + uint16_t cid = CIDFromCharCode(charcode); + if (!m_pStreamAcc) { + if (m_bType1) + return cid; + + if (m_pFontFile && !m_pCMap->m_pMapping) + return cid; + if (m_pCMap->m_Coding == CIDCODING_UNKNOWN || + !FXFT_Get_Face_Charmap(m_Font.GetFace())) { + return cid; + } + if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmap(m_Font.GetFace())) == + FXFT_ENCODING_UNICODE) { + CFX_WideString unicode_str = UnicodeFromCharCode(charcode); + if (unicode_str.IsEmpty()) + return -1; + + charcode = unicode_str.GetAt(0); + } + return GetGlyphIndex(charcode, pVertGlyph); + } + uint32_t byte_pos = cid * 2; + if (byte_pos + 2 > m_pStreamAcc->GetSize()) + return -1; + + const uint8_t* pdata = m_pStreamAcc->GetData() + byte_pos; + return pdata[0] * 256 + pdata[1]; +} + +uint32_t CPDF_CIDFont::GetNextChar(const FX_CHAR* pString, + int nStrLen, + int& offset) const { + return m_pCMap->GetNextChar(pString, nStrLen, offset); +} + +int CPDF_CIDFont::GetCharSize(uint32_t charcode) const { + return m_pCMap->GetCharSize(charcode); +} + +int CPDF_CIDFont::CountChar(const FX_CHAR* pString, int size) const { + return m_pCMap->CountChar(pString, size); +} + +int CPDF_CIDFont::AppendChar(FX_CHAR* str, uint32_t charcode) const { + return m_pCMap->AppendChar(str, charcode); +} + +bool CPDF_CIDFont::IsUnicodeCompatible() const { + if (m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded() && m_pCMap->IsLoaded()) + return true; + return m_pCMap->m_Coding != CIDCODING_UNKNOWN; +} + +void CPDF_CIDFont::LoadSubstFont() { + pdfium::base::CheckedNumeric safeStemV(m_StemV); + safeStemV *= 5; + m_Font.LoadSubst(m_BaseFont, !m_bType1, m_Flags, + safeStemV.ValueOrDefault(FXFONT_FW_NORMAL), m_ItalicAngle, + g_CharsetCPs[m_Charset], IsVertWriting()); +} + +void CPDF_CIDFont::LoadMetricsArray(CPDF_Array* pArray, + std::vector* result, + int nElements) { + int width_status = 0; + int iCurElement = 0; + int first_code = 0; + int last_code = 0; + for (size_t i = 0; i < pArray->GetCount(); i++) { + CPDF_Object* pObj = pArray->GetDirectObjectAt(i); + if (!pObj) + continue; + + if (CPDF_Array* pObjArray = pObj->AsArray()) { + if (width_status != 1) + return; + + for (size_t j = 0; j < pObjArray->GetCount(); j += nElements) { + result->push_back(first_code); + result->push_back(first_code); + for (int k = 0; k < nElements; k++) + result->push_back(pObjArray->GetIntegerAt(j + k)); + first_code++; + } + width_status = 0; + } else { + if (width_status == 0) { + first_code = pObj->GetInteger(); + width_status = 1; + } else if (width_status == 1) { + last_code = pObj->GetInteger(); + width_status = 2; + iCurElement = 0; + } else { + if (!iCurElement) { + result->push_back(first_code); + result->push_back(last_code); + } + result->push_back(pObj->GetInteger()); + iCurElement++; + if (iCurElement == nElements) + width_status = 0; + } + } + } +} + +// static +FX_FLOAT CPDF_CIDFont::CIDTransformToFloat(uint8_t ch) { + return (ch < 128 ? ch : ch - 255) * (1.0f / 127); +} + +void CPDF_CIDFont::LoadGB2312() { + m_BaseFont = m_pFontDict->GetStringFor("BaseFont"); + CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictFor("FontDescriptor"); + if (pFontDesc) + LoadFontDescriptor(pFontDesc); + + m_Charset = CIDSET_GB1; + m_bType1 = false; + CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; + m_pCMap = manager.GetPredefinedCMap("GBK-EUC-H", false); + m_pCID2UnicodeMap = manager.GetCID2UnicodeMap(m_Charset, false); + if (!IsEmbedded()) + LoadSubstFont(); + + CheckFontMetrics(); + m_DefaultWidth = 1000; + m_bAnsiWidthsFixed = true; +} + +const uint8_t* CPDF_CIDFont::GetCIDTransform(uint16_t CID) const { + if (m_Charset != CIDSET_JAPAN1 || m_pFontFile) + return nullptr; + + const auto* pEnd = g_Japan1_VertCIDs + FX_ArraySize(g_Japan1_VertCIDs); + const auto* pTransform = std::lower_bound( + g_Japan1_VertCIDs, pEnd, CID, + [](const CIDTransform& entry, uint16_t cid) { return entry.cid < cid; }); + return (pTransform < pEnd && CID == pTransform->cid) ? &pTransform->a + : nullptr; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_cidfont.h b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_cidfont.h new file mode 100644 index 000000000000..79ec7cbb350c --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_cidfont.h @@ -0,0 +1,92 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_FONT_CPDF_CIDFONT_H_ +#define CORE_FPDFAPI_FONT_CPDF_CIDFONT_H_ + +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +enum CIDSet { + CIDSET_UNKNOWN, + CIDSET_GB1, + CIDSET_CNS1, + CIDSET_JAPAN1, + CIDSET_KOREA1, + CIDSET_UNICODE, + CIDSET_NUM_SETS +}; + +class CFX_CTTGSUBTable; +class CPDF_Array; +class CPDF_CID2UnicodeMap; +class CPDF_CMap; +class CPDF_StreamAcc; + +class CPDF_CIDFont : public CPDF_Font { + public: + CPDF_CIDFont(); + ~CPDF_CIDFont() override; + + static FX_FLOAT CIDTransformToFloat(uint8_t ch); + + // CPDF_Font: + bool IsCIDFont() const override; + const CPDF_CIDFont* AsCIDFont() const override; + CPDF_CIDFont* AsCIDFont() override; + int GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) override; + int GetCharWidthF(uint32_t charcode) override; + FX_RECT GetCharBBox(uint32_t charcode) override; + uint32_t GetNextChar(const FX_CHAR* pString, + int nStrLen, + int& offset) const override; + int CountChar(const FX_CHAR* pString, int size) const override; + int AppendChar(FX_CHAR* str, uint32_t charcode) const override; + bool IsVertWriting() const override; + bool IsUnicodeCompatible() const override; + bool Load() override; + CFX_WideString UnicodeFromCharCode(uint32_t charcode) const override; + uint32_t CharCodeFromUnicode(FX_WCHAR Unicode) const override; + + uint16_t CIDFromCharCode(uint32_t charcode) const; + const uint8_t* GetCIDTransform(uint16_t CID) const; + short GetVertWidth(uint16_t CID) const; + void GetVertOrigin(uint16_t CID, short& vx, short& vy) const; + int GetCharSize(uint32_t charcode) const; + + protected: + void LoadGB2312(); + int GetGlyphIndex(uint32_t unicodeb, bool* pVertGlyph); + int GetVerticalGlyph(int index, bool* pVertGlyph); + void LoadMetricsArray(CPDF_Array* pArray, + std::vector* result, + int nElements); + void LoadSubstFont(); + FX_WCHAR GetUnicodeFromCharCode(uint32_t charcode) const; + + CFX_MaybeOwned m_pCMap; + CPDF_CID2UnicodeMap* m_pCID2UnicodeMap; + CIDSet m_Charset; + bool m_bType1; + bool m_bCIDIsGID; + uint16_t m_DefaultWidth; + std::unique_ptr m_pStreamAcc; + bool m_bAnsiWidthsFixed; + FX_RECT m_CharBBox[256]; + std::vector m_WidthList; + short m_DefaultVY; + short m_DefaultW1; + std::vector m_VertMetrics; + bool m_bAdobeCourierStd; + std::unique_ptr m_pTTGSUBTable; +}; + +#endif // CORE_FPDFAPI_FONT_CPDF_CIDFONT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_font.cpp b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_font.cpp new file mode 100644 index 000000000000..36d7d6aeeb4a --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_font.cpp @@ -0,0 +1,470 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/font/cpdf_font.h" + +#include +#include +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/font/cpdf_fontencoding.h" +#include "core/fpdfapi/font/cpdf_truetypefont.h" +#include "core/fpdfapi/font/cpdf_type1font.h" +#include "core/fpdfapi/font/cpdf_type3font.h" +#include "core/fpdfapi/font/font_int.h" +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fxcrt/fx_memory.h" +#include "core/fxge/fx_freetype.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +namespace { + +const uint8_t kChineseFontNames[][5] = {{0xCB, 0xCE, 0xCC, 0xE5, 0x00}, + {0xBF, 0xAC, 0xCC, 0xE5, 0x00}, + {0xBA, 0xDA, 0xCC, 0xE5, 0x00}, + {0xB7, 0xC2, 0xCB, 0xCE, 0x00}, + {0xD0, 0xC2, 0xCB, 0xCE, 0x00}}; + +void GetPredefinedEncoding(const CFX_ByteString& value, int* basemap) { + if (value == "WinAnsiEncoding") + *basemap = PDFFONT_ENCODING_WINANSI; + else if (value == "MacRomanEncoding") + *basemap = PDFFONT_ENCODING_MACROMAN; + else if (value == "MacExpertEncoding") + *basemap = PDFFONT_ENCODING_MACEXPERT; + else if (value == "PDFDocEncoding") + *basemap = PDFFONT_ENCODING_PDFDOC; +} + +} // namespace + +CPDF_Font::CPDF_Font() + : m_pFontFile(nullptr), + m_pFontDict(nullptr), + m_bToUnicodeLoaded(false), + m_Flags(0), + m_StemV(0), + m_Ascent(0), + m_Descent(0), + m_ItalicAngle(0) {} + +CPDF_Font::~CPDF_Font() { + if (m_pFontFile) { + m_pDocument->GetPageData()->ReleaseFontFileStreamAcc( + m_pFontFile->GetStream()->AsStream()); + } +} + +bool CPDF_Font::IsType1Font() const { + return false; +} + +bool CPDF_Font::IsTrueTypeFont() const { + return false; +} + +bool CPDF_Font::IsType3Font() const { + return false; +} + +bool CPDF_Font::IsCIDFont() const { + return false; +} + +const CPDF_Type1Font* CPDF_Font::AsType1Font() const { + return nullptr; +} + +CPDF_Type1Font* CPDF_Font::AsType1Font() { + return nullptr; +} + +const CPDF_TrueTypeFont* CPDF_Font::AsTrueTypeFont() const { + return nullptr; +} + +CPDF_TrueTypeFont* CPDF_Font::AsTrueTypeFont() { + return nullptr; +} + +const CPDF_Type3Font* CPDF_Font::AsType3Font() const { + return nullptr; +} + +CPDF_Type3Font* CPDF_Font::AsType3Font() { + return nullptr; +} + +const CPDF_CIDFont* CPDF_Font::AsCIDFont() const { + return nullptr; +} + +CPDF_CIDFont* CPDF_Font::AsCIDFont() { + return nullptr; +} + +bool CPDF_Font::IsUnicodeCompatible() const { + return false; +} + +int CPDF_Font::CountChar(const FX_CHAR* pString, int size) const { + return size; +} + +int CPDF_Font::GlyphFromCharCodeExt(uint32_t charcode) { + return GlyphFromCharCode(charcode, nullptr); +} + +bool CPDF_Font::IsVertWriting() const { + const CPDF_CIDFont* pCIDFont = AsCIDFont(); + return pCIDFont ? pCIDFont->IsVertWriting() : m_Font.IsVertical(); +} + +int CPDF_Font::AppendChar(FX_CHAR* buf, uint32_t charcode) const { + *buf = static_cast(charcode); + return 1; +} + +void CPDF_Font::AppendChar(CFX_ByteString& str, uint32_t charcode) const { + char buf[4]; + int len = AppendChar(buf, charcode); + if (len == 1) { + str += buf[0]; + } else { + str += CFX_ByteString(buf, len); + } +} + +CFX_WideString CPDF_Font::UnicodeFromCharCode(uint32_t charcode) const { + if (!m_bToUnicodeLoaded) + LoadUnicodeMap(); + + return m_pToUnicodeMap ? m_pToUnicodeMap->Lookup(charcode) : CFX_WideString(); +} + +uint32_t CPDF_Font::CharCodeFromUnicode(FX_WCHAR unicode) const { + if (!m_bToUnicodeLoaded) + LoadUnicodeMap(); + + return m_pToUnicodeMap ? m_pToUnicodeMap->ReverseLookup(unicode) : 0; +} + +void CPDF_Font::LoadFontDescriptor(CPDF_Dictionary* pFontDesc) { + m_Flags = pFontDesc->GetIntegerFor("Flags", FXFONT_NONSYMBOLIC); + int ItalicAngle = 0; + bool bExistItalicAngle = false; + if (pFontDesc->KeyExist("ItalicAngle")) { + ItalicAngle = pFontDesc->GetIntegerFor("ItalicAngle"); + bExistItalicAngle = true; + } + if (ItalicAngle < 0) { + m_Flags |= FXFONT_ITALIC; + m_ItalicAngle = ItalicAngle; + } + bool bExistStemV = false; + if (pFontDesc->KeyExist("StemV")) { + m_StemV = pFontDesc->GetIntegerFor("StemV"); + bExistStemV = true; + } + bool bExistAscent = false; + if (pFontDesc->KeyExist("Ascent")) { + m_Ascent = pFontDesc->GetIntegerFor("Ascent"); + bExistAscent = true; + } + bool bExistDescent = false; + if (pFontDesc->KeyExist("Descent")) { + m_Descent = pFontDesc->GetIntegerFor("Descent"); + bExistDescent = true; + } + bool bExistCapHeight = false; + if (pFontDesc->KeyExist("CapHeight")) + bExistCapHeight = true; + if (bExistItalicAngle && bExistAscent && bExistCapHeight && bExistDescent && + bExistStemV) { + m_Flags |= FXFONT_USEEXTERNATTR; + } + if (m_Descent > 10) + m_Descent = -m_Descent; + CPDF_Array* pBBox = pFontDesc->GetArrayFor("FontBBox"); + if (pBBox) { + m_FontBBox.left = pBBox->GetIntegerAt(0); + m_FontBBox.bottom = pBBox->GetIntegerAt(1); + m_FontBBox.right = pBBox->GetIntegerAt(2); + m_FontBBox.top = pBBox->GetIntegerAt(3); + } + + CPDF_Stream* pFontFile = pFontDesc->GetStreamFor("FontFile"); + if (!pFontFile) + pFontFile = pFontDesc->GetStreamFor("FontFile2"); + if (!pFontFile) + pFontFile = pFontDesc->GetStreamFor("FontFile3"); + if (!pFontFile) + return; + + m_pFontFile = m_pDocument->LoadFontFile(pFontFile); + if (!m_pFontFile) + return; + + const uint8_t* pFontData = m_pFontFile->GetData(); + uint32_t dwFontSize = m_pFontFile->GetSize(); + if (!m_Font.LoadEmbedded(pFontData, dwFontSize)) { + m_pDocument->GetPageData()->ReleaseFontFileStreamAcc( + m_pFontFile->GetStream()->AsStream()); + m_pFontFile = nullptr; + } +} + +void CPDF_Font::CheckFontMetrics() { + if (m_FontBBox.top == 0 && m_FontBBox.bottom == 0 && m_FontBBox.left == 0 && + m_FontBBox.right == 0) { + FXFT_Face face = m_Font.GetFace(); + if (face) { + m_FontBBox.left = TT2PDF(FXFT_Get_Face_xMin(face), face); + m_FontBBox.bottom = TT2PDF(FXFT_Get_Face_yMin(face), face); + m_FontBBox.right = TT2PDF(FXFT_Get_Face_xMax(face), face); + m_FontBBox.top = TT2PDF(FXFT_Get_Face_yMax(face), face); + m_Ascent = TT2PDF(FXFT_Get_Face_Ascender(face), face); + m_Descent = TT2PDF(FXFT_Get_Face_Descender(face), face); + } else { + bool bFirst = true; + for (int i = 0; i < 256; i++) { + FX_RECT rect = GetCharBBox(i); + if (rect.left == rect.right) { + continue; + } + if (bFirst) { + m_FontBBox = rect; + bFirst = false; + } else { + if (m_FontBBox.top < rect.top) { + m_FontBBox.top = rect.top; + } + if (m_FontBBox.right < rect.right) { + m_FontBBox.right = rect.right; + } + if (m_FontBBox.left > rect.left) { + m_FontBBox.left = rect.left; + } + if (m_FontBBox.bottom > rect.bottom) { + m_FontBBox.bottom = rect.bottom; + } + } + } + } + } + if (m_Ascent == 0 && m_Descent == 0) { + FX_RECT rect = GetCharBBox('A'); + m_Ascent = rect.bottom == rect.top ? m_FontBBox.top : rect.top; + rect = GetCharBBox('g'); + m_Descent = rect.bottom == rect.top ? m_FontBBox.bottom : rect.bottom; + } +} + +void CPDF_Font::LoadUnicodeMap() const { + m_bToUnicodeLoaded = true; + CPDF_Stream* pStream = m_pFontDict->GetStreamFor("ToUnicode"); + if (!pStream) { + return; + } + m_pToUnicodeMap = pdfium::MakeUnique(); + m_pToUnicodeMap->Load(pStream); +} + +int CPDF_Font::GetStringWidth(const FX_CHAR* pString, int size) { + int offset = 0; + int width = 0; + while (offset < size) { + uint32_t charcode = GetNextChar(pString, size, offset); + width += GetCharWidthF(charcode); + } + return width; +} + +CPDF_Font* CPDF_Font::GetStockFont(CPDF_Document* pDoc, + const CFX_ByteStringC& name) { + CFX_ByteString fontname(name); + int font_id = PDF_GetStandardFontName(&fontname); + if (font_id < 0) + return nullptr; + + CPDF_FontGlobals* pFontGlobals = + CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); + CPDF_Font* pFont = pFontGlobals->Find(pDoc, font_id); + if (pFont) + return pFont; + + CPDF_Dictionary* pDict = new CPDF_Dictionary(pDoc->GetByteStringPool()); + pDict->SetNewFor("Type", "Font"); + pDict->SetNewFor("Subtype", "Type1"); + pDict->SetNewFor("BaseFont", fontname); + pDict->SetNewFor("Encoding", "WinAnsiEncoding"); + return pFontGlobals->Set(pDoc, font_id, CPDF_Font::Create(nullptr, pDict)); +} + +std::unique_ptr CPDF_Font::Create(CPDF_Document* pDoc, + CPDF_Dictionary* pFontDict) { + CFX_ByteString type = pFontDict->GetStringFor("Subtype"); + std::unique_ptr pFont; + if (type == "TrueType") { + CFX_ByteString tag = pFontDict->GetStringFor("BaseFont").Left(4); + for (size_t i = 0; i < FX_ArraySize(kChineseFontNames); ++i) { + if (tag == CFX_ByteString(kChineseFontNames[i], 4)) { + CPDF_Dictionary* pFontDesc = pFontDict->GetDictFor("FontDescriptor"); + if (!pFontDesc || !pFontDesc->KeyExist("FontFile2")) + pFont = pdfium::MakeUnique(); + break; + } + } + if (!pFont) + pFont = pdfium::MakeUnique(); + } else if (type == "Type3") { + pFont = pdfium::MakeUnique(); + } else if (type == "Type0") { + pFont = pdfium::MakeUnique(); + } else { + pFont = pdfium::MakeUnique(); + } + pFont->m_pFontDict = pFontDict; + pFont->m_pDocument = pDoc; + pFont->m_BaseFont = pFontDict->GetStringFor("BaseFont"); + return pFont->Load() ? std::move(pFont) : nullptr; +} + +uint32_t CPDF_Font::GetNextChar(const FX_CHAR* pString, + int nStrLen, + int& offset) const { + if (offset < 0 || nStrLen < 1) { + return 0; + } + uint8_t ch = offset < nStrLen ? pString[offset++] : pString[nStrLen - 1]; + return static_cast(ch); +} + +void CPDF_Font::LoadPDFEncoding(CPDF_Object* pEncoding, + int& iBaseEncoding, + std::vector* pCharNames, + bool bEmbedded, + bool bTrueType) { + if (!pEncoding) { + if (m_BaseFont == "Symbol") { + iBaseEncoding = bTrueType ? PDFFONT_ENCODING_MS_SYMBOL + : PDFFONT_ENCODING_ADOBE_SYMBOL; + } else if (!bEmbedded && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) { + iBaseEncoding = PDFFONT_ENCODING_WINANSI; + } + return; + } + if (pEncoding->IsName()) { + if (iBaseEncoding == PDFFONT_ENCODING_ADOBE_SYMBOL || + iBaseEncoding == PDFFONT_ENCODING_ZAPFDINGBATS) { + return; + } + if ((m_Flags & FXFONT_SYMBOLIC) && m_BaseFont == "Symbol") { + if (!bTrueType) + iBaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL; + return; + } + CFX_ByteString bsEncoding = pEncoding->GetString(); + if (bsEncoding.Compare("MacExpertEncoding") == 0) { + bsEncoding = "WinAnsiEncoding"; + } + GetPredefinedEncoding(bsEncoding, &iBaseEncoding); + return; + } + + CPDF_Dictionary* pDict = pEncoding->AsDictionary(); + if (!pDict) + return; + + if (iBaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL && + iBaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS) { + CFX_ByteString bsEncoding = pDict->GetStringFor("BaseEncoding"); + if (bsEncoding.Compare("MacExpertEncoding") == 0 && bTrueType) { + bsEncoding = "WinAnsiEncoding"; + } + GetPredefinedEncoding(bsEncoding, &iBaseEncoding); + } + if ((!bEmbedded || bTrueType) && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) + iBaseEncoding = PDFFONT_ENCODING_STANDARD; + + CPDF_Array* pDiffs = pDict->GetArrayFor("Differences"); + if (!pDiffs) + return; + + pCharNames->resize(256); + uint32_t cur_code = 0; + for (uint32_t i = 0; i < pDiffs->GetCount(); i++) { + CPDF_Object* pElement = pDiffs->GetDirectObjectAt(i); + if (!pElement) + continue; + + if (CPDF_Name* pName = pElement->AsName()) { + if (cur_code < 256) + (*pCharNames)[cur_code] = pName->GetString(); + cur_code++; + } else { + cur_code = pElement->GetInteger(); + } + } +} + +bool CPDF_Font::IsStandardFont() const { + if (!IsType1Font()) + return false; + if (m_pFontFile) + return false; + if (AsType1Font()->GetBase14Font() < 0) + return false; + return true; +} + +const FX_CHAR* CPDF_Font::GetAdobeCharName( + int iBaseEncoding, + const std::vector& charnames, + int charcode) { + if (charcode < 0 || charcode >= 256) { + ASSERT(false); + return nullptr; + } + + if (!charnames.empty() && !charnames[charcode].IsEmpty()) + return charnames[charcode].c_str(); + + const FX_CHAR* name = nullptr; + if (iBaseEncoding) + name = PDF_CharNameFromPredefinedCharSet(iBaseEncoding, charcode); + return name && name[0] ? name : nullptr; +} + +uint32_t CPDF_Font::FallbackFontFromCharcode(uint32_t charcode) { + if (m_FontFallbacks.empty()) { + m_FontFallbacks.push_back(pdfium::MakeUnique()); + m_FontFallbacks[0]->LoadSubst("Arial", IsTrueTypeFont(), m_Flags, + m_StemV * 5, m_ItalicAngle, 0, + IsVertWriting()); + } + return 0; +} + +int CPDF_Font::FallbackGlyphFromCharcode(int fallbackFont, uint32_t charcode) { + if (fallbackFont < 0 || + fallbackFont >= pdfium::CollectionSize(m_FontFallbacks)) { + return -1; + } + int glyph = + FXFT_Get_Char_Index(m_FontFallbacks[fallbackFont]->GetFace(), charcode); + if (glyph == 0 || glyph == 0xffff) + return -1; + return glyph; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_font.h b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_font.h new file mode 100644 index 000000000000..6025a82d7a81 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_font.h @@ -0,0 +1,116 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_FONT_CPDF_FONT_H_ +#define CORE_FPDFAPI_FONT_CPDF_FONT_H_ + +#include +#include + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxge/fx_font.h" + +class CFX_SubstFont; +class CPDF_CIDFont; +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_Object; +class CPDF_StreamAcc; +class CPDF_TrueTypeFont; +class CPDF_Type1Font; +class CPDF_Type3Font; +class CPDF_ToUnicodeMap; + +class CPDF_Font { + public: + static std::unique_ptr Create(CPDF_Document* pDoc, + CPDF_Dictionary* pFontDict); + static CPDF_Font* GetStockFont(CPDF_Document* pDoc, + const CFX_ByteStringC& fontname); + static const uint32_t kInvalidCharCode = static_cast(-1); + + virtual ~CPDF_Font(); + + virtual bool IsType1Font() const; + virtual bool IsTrueTypeFont() const; + virtual bool IsType3Font() const; + virtual bool IsCIDFont() const; + virtual const CPDF_Type1Font* AsType1Font() const; + virtual CPDF_Type1Font* AsType1Font(); + virtual const CPDF_TrueTypeFont* AsTrueTypeFont() const; + virtual CPDF_TrueTypeFont* AsTrueTypeFont(); + virtual const CPDF_Type3Font* AsType3Font() const; + virtual CPDF_Type3Font* AsType3Font(); + virtual const CPDF_CIDFont* AsCIDFont() const; + virtual CPDF_CIDFont* AsCIDFont(); + + virtual bool IsVertWriting() const; + virtual bool IsUnicodeCompatible() const; + virtual uint32_t GetNextChar(const FX_CHAR* pString, + int nStrLen, + int& offset) const; + virtual int CountChar(const FX_CHAR* pString, int size) const; + virtual int AppendChar(FX_CHAR* buf, uint32_t charcode) const; + virtual int GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) = 0; + virtual int GlyphFromCharCodeExt(uint32_t charcode); + virtual CFX_WideString UnicodeFromCharCode(uint32_t charcode) const; + virtual uint32_t CharCodeFromUnicode(FX_WCHAR Unicode) const; + + const CFX_ByteString& GetBaseFont() const { return m_BaseFont; } + CFX_SubstFont* GetSubstFont() const { return m_Font.GetSubstFont(); } + bool IsEmbedded() const { return IsType3Font() || m_pFontFile != nullptr; } + CPDF_Dictionary* GetFontDict() const { return m_pFontDict; } + bool IsStandardFont() const; + FXFT_Face GetFace() const { return m_Font.GetFace(); } + void AppendChar(CFX_ByteString& str, uint32_t charcode) const; + + void GetFontBBox(FX_RECT& rect) const { rect = m_FontBBox; } + int GetTypeAscent() const { return m_Ascent; } + int GetTypeDescent() const { return m_Descent; } + int GetStringWidth(const FX_CHAR* pString, int size); + uint32_t FallbackFontFromCharcode(uint32_t charcode); + int FallbackGlyphFromCharcode(int fallbackFont, uint32_t charcode); + + virtual int GetCharWidthF(uint32_t charcode) = 0; + virtual FX_RECT GetCharBBox(uint32_t charcode) = 0; + + CPDF_Document* m_pDocument; + CFX_Font m_Font; + std::vector> m_FontFallbacks; + + protected: + CPDF_Font(); + + virtual bool Load() = 0; + + void LoadUnicodeMap() const; // logically const only. + void LoadPDFEncoding(CPDF_Object* pEncoding, + int& iBaseEncoding, + std::vector* pCharNames, + bool bEmbedded, + bool bTrueType); + void LoadFontDescriptor(CPDF_Dictionary* pDict); + void CheckFontMetrics(); + + const FX_CHAR* GetAdobeCharName(int iBaseEncoding, + const std::vector& charnames, + int charcode); + + CFX_ByteString m_BaseFont; + CPDF_StreamAcc* m_pFontFile; + CPDF_Dictionary* m_pFontDict; + mutable std::unique_ptr m_pToUnicodeMap; + mutable bool m_bToUnicodeLoaded; + int m_Flags; + FX_RECT m_FontBBox; + int m_StemV; + int m_Ascent; + int m_Descent; + int m_ItalicAngle; +}; + +#endif // CORE_FPDFAPI_FONT_CPDF_FONT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_fontencoding.cpp b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_fontencoding.cpp new file mode 100644 index 000000000000..88b2c8d6a53d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_fontencoding.cpp @@ -0,0 +1,1819 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/font/cpdf_fontencoding.h" + +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fxge/fx_freetype.h" + +namespace { + +const uint16_t MSSymbolEncoding[256] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32, 33, 8704, 35, + 8707, 37, 38, 8715, 40, 41, 8727, 43, 44, + 8722, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 8773, 913, 914, 935, 916, 917, 934, 915, + 919, 921, 977, 922, 923, 924, 925, 927, 928, + 920, 929, 931, 932, 933, 962, 937, 926, 936, + 918, 91, 8756, 93, 8869, 95, 8254, 945, 946, + 967, 948, 949, 966, 947, 951, 953, 981, 954, + 955, 956, 957, 959, 960, 952, 961, 963, 964, + 965, 982, 969, 958, 968, 950, 123, 124, 125, + 8764, 0, 0, 0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 978, + 8242, 8804, 8725, 8734, 402, 9827, 9830, 9828, 9824, + 8596, 8592, 8593, 8594, 8595, 176, 177, 8243, 8805, + 215, 8733, 8706, 8729, 247, 8800, 8801, 8776, 8943, + 0, 0, 8629, 0, 8465, 8476, 8472, 8855, 8853, + 8709, 8745, 8746, 8835, 8839, 8836, 8834, 8838, 8712, + 8713, 8736, 8711, 174, 169, 8482, 8719, 8730, 8901, + 172, 8743, 8744, 8660, 8656, 8657, 8658, 8659, 9674, + 9001, 0, 0, 0, 8721, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x0000, 9002, 8747, + 8992, 0, 8993, 0, 0, 0, 0, 0, 0, + 0x0000, 0x0000, 0x0000, 0x0000}; + +const uint16_t StandardEncoding[256] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x2019, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, + 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, + 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, + 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, + 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, + 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x2018, 0x0061, 0x0062, + 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, + 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, + 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, + 0x007e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a1, + 0x00a2, 0x00a3, 0x2044, 0x00a5, 0x0192, 0x00a7, 0x00a4, 0x0027, 0x201c, + 0x00ab, 0x2039, 0x203a, 0xfb01, 0xfb02, 0x0000, 0x2013, 0x2020, 0x2021, + 0x00b7, 0x0000, 0x00b6, 0x2022, 0x201a, 0x201e, 0x201d, 0x00bb, 0x2026, + 0x2030, 0x0000, 0x00bf, 0x0000, 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x00af, + 0x02d8, 0x02d9, 0x00a8, 0x0000, 0x02da, 0x00b8, 0x0000, 0x02dd, 0x02db, + 0x02c7, 0x2014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00c6, 0x0000, 0x00aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0141, 0x00d8, + 0x0152, 0x00ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x0000, + 0x0000, 0x0000, 0x0131, 0x0000, 0x0000, 0x0142, 0x00f8, 0x0153, 0x00df, + 0x0000, 0x0000, 0x0000, 0x0000}; + +const uint16_t MacRomanEncoding[256] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, + 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, + 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, + 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, + 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, + 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, + 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, + 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, + 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, + 0x007e, 0x0000, 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, + 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, 0x00f2, + 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, 0x2020, 0x00b0, + 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x00a9, 0x2122, + 0x00b4, 0x00a8, 0x0000, 0x00c6, 0x00d8, 0x0000, 0x00b1, 0x0000, 0x0000, + 0x00a5, 0x00b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00aa, 0x00ba, + 0x0000, 0x00e6, 0x00f8, 0x00bf, 0x00a3, 0x00ac, 0x0000, 0x0192, 0x0000, + 0x0000, 0x00ab, 0x00bb, 0x2026, 0x0020, 0x00c0, 0x00c3, 0x00d5, 0x0152, + 0x0153, 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x0000, + 0x00ff, 0x0178, 0x2044, 0x00a4, 0x2039, 0x203a, 0xfb01, 0xfb02, 0x2021, + 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, 0x00cb, 0x00c8, + 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, 0x0000, 0x00d2, 0x00da, + 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9, 0x02da, + 0x00b8, 0x02dd, 0x02db, 0x02c7}; + +const uint16_t AdobeWinAnsiEncoding[256] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, + 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, + 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, + 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, + 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, + 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, + 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, + 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, + 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, + 0x007e, 0x2022, 0x20ac, 0x2022, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, + 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x2022, 0x017d, 0x2022, + 0x2022, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, + 0x2122, 0x0161, 0x203a, 0x0153, 0x2022, 0x017e, 0x0178, 0x0020, 0x00a1, + 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, + 0x00ab, 0x00ac, 0x002d, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, + 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, + 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, + 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, + 0x00cf, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, + 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, + 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, + 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, + 0x00fc, 0x00fd, 0x00fe, 0x00ff}; + +const uint16_t MacExpertEncoding[256] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0xf721, 0xf6f8, 0xf7a2, + 0xf724, 0xf6e4, 0xf726, 0xf7b4, 0x207d, 0x207e, 0x2025, 0x2024, 0x002c, + 0x002d, 0x002e, 0x2044, 0xf730, 0xf731, 0xf732, 0xf733, 0xf734, 0xf735, + 0xf736, 0xf737, 0xf738, 0xf739, 0x003a, 0x003b, 0x0000, 0xf6de, 0x0000, + 0xf73f, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f0, 0x0000, 0x0000, 0x00bc, + 0x00bd, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e, 0x2153, 0x2154, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb00, 0xfb01, 0xfb02, 0xfb03, + 0xfb04, 0x208d, 0x0000, 0x208e, 0xf6f6, 0xf6e5, 0xf760, 0xf761, 0xf762, + 0xf763, 0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b, + 0xf76c, 0xf76d, 0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773, 0xf774, + 0xf775, 0xf776, 0xf777, 0xf778, 0xf779, 0xf77a, 0x20a1, 0xf6dc, 0xf6dd, + 0xf6fe, 0x0000, 0x0000, 0xf6e9, 0xf6e0, 0x0000, 0x0000, 0x0000, 0x0000, + 0xf7e1, 0xf7e0, 0xf7e2, 0xf7e4, 0xf7e3, 0xf7e5, 0xf7e7, 0xf7e9, 0xf7e8, + 0xf7ea, 0xf7eb, 0xf7ed, 0xf7ec, 0xf7ee, 0xf7ef, 0xf7f1, 0xf7f3, 0xf7f2, + 0xf7f4, 0xf7f6, 0xf7f5, 0xf7fa, 0xf7f9, 0xf7fb, 0xf7fc, 0x0000, 0x2078, + 0x2084, 0x2083, 0x2086, 0x2088, 0x2087, 0xf6fd, 0x0000, 0xf6df, 0x2082, + 0x0000, 0xf7a8, 0x0000, 0xf6f5, 0xf6fd, 0x2085, 0x0000, 0xf6e1, 0xf6e7, + 0xf7fd, 0x0000, 0xf6e3, 0x0000, 0x0000, 0xf7fe, 0x0000, 0x2089, 0x2080, + 0xf6ff, 0xf7e6, 0xf7f8, 0xf7bf, 0x2081, 0xf6e9, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xf7b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xf6fa, 0x2012, 0xf6e6, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7a1, 0x0000, + 0xf7ff, 0x0000, 0x00b9, 0x00b2, 0x00b3, 0x2074, 0x2075, 0x2076, 0x2077, + 0x2079, 0x2070, 0x0000, 0xf6ec, 0xf6f1, 0x0000, 0x0000, 0x0000, 0xf6ed, + 0xf6f2, 0xf6eb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6ee, 0xf6fb, + 0xf6f4, 0xf7af, 0xf6ea, 0x207f, 0xf6ef, 0xf6e2, 0xf6e8, 0xf6f7, 0xf6fc, + 0x0000, 0x0000, 0x0000, 0x0000}; + +const uint16_t AdobeSymbolEncoding[256] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0021, 0x2200, 0x0023, + 0x2203, 0x0025, 0x0026, 0x220B, 0x0028, 0x0029, 0x2217, 0x002B, 0x002C, + 0x2212, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, + 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, + 0x003F, 0x2245, 0x0391, 0x0392, 0x03A7, 0x0394, 0x0395, 0x03A6, 0x0393, + 0x0397, 0x0399, 0x03D1, 0x039A, 0x039B, 0x039C, 0x039D, 0x039F, 0x03A0, + 0x0398, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03C2, 0x03A9, 0x039E, 0x03A8, + 0x0396, 0x005B, 0x2234, 0x005D, 0x22A5, 0x005F, 0xF8E5, 0x03B1, 0x03B2, + 0x03C7, 0x03B4, 0x03B5, 0x03C6, 0x03B3, 0x03B7, 0x03B9, 0x03D5, 0x03BA, + 0x03BB, 0x03BC, 0x03BD, 0x03BF, 0x03C0, 0x03B8, 0x03C1, 0x03C3, 0x03C4, + 0x03C5, 0x03D6, 0x03C9, 0x03BE, 0x03C8, 0x03B6, 0x007B, 0x007C, 0x007D, + 0x223C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20AC, 0x03D2, + 0x2032, 0x2264, 0x2044, 0x221E, 0x0192, 0x2663, 0x2666, 0x2665, 0x2660, + 0x2194, 0x2190, 0x2191, 0x2192, 0x2193, 0x00B0, 0x00B1, 0x2033, 0x2265, + 0x00D7, 0x221D, 0x2202, 0x2022, 0x00F7, 0x2260, 0x2261, 0x2248, 0x2026, + 0xF8E6, 0xF8E7, 0x21B5, 0x2135, 0x2111, 0x211C, 0x2118, 0x2297, 0x2295, + 0x2205, 0x2229, 0x222A, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, + 0x2209, 0x2220, 0x2207, 0xF6DA, 0xF6D9, 0xF6DB, 0x220F, 0x221A, 0x22C5, + 0x00AC, 0x2227, 0x2228, 0x21D4, 0x21D0, 0x21D1, 0x21D2, 0x21D3, 0x25CA, + 0x2329, 0xF8E8, 0xF8E9, 0xF8EA, 0x2211, 0xF8EB, 0xF8EC, 0xF8ED, 0xF8EE, + 0xF8EF, 0xF8F0, 0xF8F1, 0xF8F2, 0xF8F3, 0xF8F4, 0x0000, 0x232A, 0x222B, + 0x2320, 0xF8F5, 0x2321, 0xF8F6, 0xF8F7, 0xF8F8, 0xF8F9, 0xF8FA, 0xF8FB, + 0xF8FC, 0xF8FD, 0xF8FE, 0x0000, +}; + +const uint16_t ZapfEncoding[256] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x2701, 0x2702, 0x2703, + 0x2704, 0x260E, 0x2706, 0x2707, 0x2708, 0x2709, 0x261B, 0x261E, 0x270C, + 0x270D, 0x270E, 0x270F, 0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, + 0x2716, 0x2717, 0x2718, 0x2719, 0x271A, 0x271B, 0x271C, 0x271D, 0x271E, + 0x271F, 0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2727, + 0x2605, 0x2729, 0x272A, 0x272B, 0x272C, 0x272D, 0x272E, 0x272F, 0x2730, + 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, 0x2739, + 0x273A, 0x273B, 0x273C, 0x273D, 0x273E, 0x273F, 0x2740, 0x2741, 0x2742, + 0x2743, 0x2744, 0x2745, 0x2746, 0x2747, 0x2748, 0x2749, 0x274A, 0x274B, + 0x25CF, 0x274D, 0x25A0, 0x274F, 0x2750, 0x2751, 0x2752, 0x25B2, 0x25BC, + 0x25C6, 0x2756, 0x25D7, 0x2758, 0x2759, 0x275A, 0x275B, 0x275C, 0x275D, + 0x275E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2761, + 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2663, 0x2666, 0x2665, + 0x2660, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, + 0x2468, 0x2469, 0x2776, 0x2777, 0x2778, 0x2779, 0x277A, 0x277B, 0x277C, + 0x277D, 0x277E, 0x277F, 0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, + 0x2786, 0x2787, 0x2788, 0x2789, 0x278A, 0x278B, 0x278C, 0x278D, 0x278E, + 0x278F, 0x2790, 0x2791, 0x2792, 0x2793, 0x2794, 0x2192, 0x2194, 0x2195, + 0x2798, 0x2799, 0x279A, 0x279B, 0x279C, 0x279D, 0x279E, 0x279F, 0x27A0, + 0x27A1, 0x27A2, 0x27A3, 0x27A4, 0x27A5, 0x27A6, 0x27A7, 0x27A8, 0x27A9, + 0x27AA, 0x27AB, 0x27AC, 0x27AD, 0x27AE, 0x27AF, 0x0000, 0x27B1, 0x27B2, + 0x27B3, 0x27B4, 0x27B5, 0x27B6, 0x27B7, 0x27B8, 0x27B9, 0x27BA, 0x27BB, + 0x27BC, 0x27BD, 0x27BE, 0x0000, +}; + +const FX_CHAR* const StandardEncodingNames[224] = { + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quoteright", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "quoteleft", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "exclamdown", + "cent", + "sterling", + "fraction", + "yen", + "florin", + "section", + "currency", + "quotesingle", + "quotedblleft", + "guillemotleft", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + nullptr, + "endash", + "dagger", + "daggerdbl", + "periodcentered", + nullptr, + "paragraph", + "bullet", + "quotesinglbase", + "quotedblbase", + "quotedblright", + "guillemotright", + "ellipsis", + "perthousand", + nullptr, + "questiondown", + nullptr, + "grave", + "acute", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "dieresis", + nullptr, + "ring", + "cedilla", + nullptr, + "hungarumlaut", + "ogonek", + "caron", + "emdash", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "AE", + nullptr, + "ordfeminine", + nullptr, + nullptr, + nullptr, + nullptr, + "Lslash", + "Oslash", + "OE", + "ordmasculine", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "ae", + nullptr, + nullptr, + nullptr, + "dotlessi", + nullptr, + nullptr, + "lslash", + "oslash", + "oe", + "germandbls", + nullptr, + nullptr, + nullptr, + nullptr, +}; + +const FX_CHAR* const AdobeWinAnsiEncodingNames[224] = { + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quotesingle", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "grave", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + "bullet", + "Euro", + "bullet", + "quotesinglbase", + "florin", + "quotedblbase", + "ellipsis", + "dagger", + "daggerdbl", + "circumflex", + "perthousand", + "Scaron", + "guilsinglleft", + "OE", + "bullet", + "Zcaron", + "bullet", + "bullet", + "quoteleft", + "quoteright", + "quotedblleft", + "quotedblright", + "bullet", + "endash", + "emdash", + "tilde", + "trademark", + "scaron", + "guilsinglright", + "oe", + "bullet", + "zcaron", + "Ydieresis", + "space", + "exclamdown", + "cent", + "sterling", + "currency", + "yen", + "brokenbar", + "section", + "dieresis", + "copyright", + "ordfeminine", + "guillemotleft", + "logicalnot", + "hyphen", + "registered", + "macron", + "degree", + "plusminus", + "twosuperior", + "threesuperior", + "acute", + "mu", + "paragraph", + "periodcentered", + "cedilla", + "onesuperior", + "ordmasculine", + "guillemotright", + "onequarter", + "onehalf", + "threequarters", + "questiondown", + "Agrave", + "Aacute", + "Acircumflex", + "Atilde", + "Adieresis", + "Aring", + "AE", + "Ccedilla", + "Egrave", + "Eacute", + "Ecircumflex", + "Edieresis", + "Igrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Eth", + "Ntilde", + "Ograve", + "Oacute", + "Ocircumflex", + "Otilde", + "Odieresis", + "multiply", + "Oslash", + "Ugrave", + "Uacute", + "Ucircumflex", + "Udieresis", + "Yacute", + "Thorn", + "germandbls", + "agrave", + "aacute", + "acircumflex", + "atilde", + "adieresis", + "aring", + "ae", + "ccedilla", + "egrave", + "eacute", + "ecircumflex", + "edieresis", + "igrave", + "iacute", + "icircumflex", + "idieresis", + "eth", + "ntilde", + "ograve", + "oacute", + "ocircumflex", + "otilde", + "odieresis", + "divide", + "oslash", + "ugrave", + "uacute", + "ucircumflex", + "udieresis", + "yacute", + "thorn", + "ydieresis", +}; + +const FX_CHAR* const MacRomanEncodingNames[224] = { + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quotesingle", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "grave", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + nullptr, + "Adieresis", + "Aring", + "Ccedilla", + "Eacute", + "Ntilde", + "Odieresis", + "Udieresis", + "aacute", + "agrave", + "acircumflex", + "adieresis", + "atilde", + "aring", + "ccedilla", + "eacute", + "egrave", + "ecircumflex", + "edieresis", + "iacute", + "igrave", + "icircumflex", + "idieresis", + "ntilde", + "oacute", + "ograve", + "ocircumflex", + "odieresis", + "otilde", + "uacute", + "ugrave", + "ucircumflex", + "udieresis", + "dagger", + "degree", + "cent", + "sterling", + "section", + "bullet", + "paragraph", + "germandbls", + "registered", + "copyright", + "trademark", + "acute", + "dieresis", + "notequal", + "AE", + "Oslash", + "infinity", + "plusminus", + "lessequal", + "greaterequal", + "yen", + "mu", + "partialdiff", + "summation", + "product", + "pi", + "integral", + "ordfeminine", + "ordmasculine", + "Omega", + "ae", + "oslash", + "questiondown", + "exclamdown", + "logicalnot", + "radical", + "florin", + "approxequal", + "Delta", + "guillemotleft", + "guillemotright", + "ellipsis", + "space", + "Agrave", + "Atilde", + "Otilde", + "OE", + "oe", + "endash", + "emdash", + "quotedblleft", + "quotedblright", + "quoteleft", + "quoteright", + "divide", + "lozenge", + "ydieresis", + "Ydieresis", + "fraction", + "currency", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "daggerdbl", + "periodcentered", + "quotesinglbase", + "quotedblbase", + "perthousand", + "Acircumflex", + "Ecircumflex", + "Aacute", + "Edieresis", + "Egrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Oacute", + "Ocircumflex", + "apple", + "Ograve", + "Uacute", + "Ucircumflex", + "Ugrave", + "dotlessi", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "ring", + "cedilla", + "hungarumlaut", + "ogonek", + "caron", +}; + +const FX_CHAR* const MacExpertEncodingNames[224] = { + "space", + "exclamsmall", + "Hungarumlautsmall", + "centoldstyle", + "dollaroldstyle", + "dollarsuperior", + "ampersandsmall", + "Acutesmall", + "parenleftsuperior", + "parenrightsuperior", + "twodotenleader", + "onedotenleader", + "comma", + "hyphen", + "period", + "fraction", + "zerooldstyle", + "oneoldstyle", + "twooldstyle", + "threeoldstyle", + "fouroldstyle", + "fiveoldstyle", + "sixoldstyle", + "sevenoldstyle", + "eightoldstyle", + "nineoldstyle", + "colon", + "semicolon", + nullptr, + "threequartersemdash", + nullptr, + "questionsmall", + nullptr, + nullptr, + nullptr, + nullptr, + "Ethsmall", + nullptr, + nullptr, + "onequarter", + "onehalf", + "threequarters", + "oneeighth", + "threeeighths", + "fiveeighths", + "seveneighths", + "onethird", + "twothirds", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "ff", + "fi", + "fl", + "ffi", + "ffl", + "parenleftinferior", + nullptr, + "parenrightinferior", + "Circumflexsmall", + "hypheninferior", + "Gravesmall", + "Asmall", + "Bsmall", + "Csmall", + "Dsmall", + "Esmall", + "Fsmall", + "Gsmall", + "Hsmall", + "Ismall", + "Jsmall", + "Ksmall", + "Lsmall", + "Msmall", + "Nsmall", + "Osmall", + "Psmall", + "Qsmall", + "Rsmall", + "Ssmall", + "Tsmall", + "Usmall", + "Vsmall", + "Wsmall", + "Xsmall", + "Ysmall", + "Zsmall", + "colonmonetary", + "onefitted", + "rupiah", + "Tildesmall", + nullptr, + nullptr, + "asuperior", + "centsuperior", + nullptr, + nullptr, + nullptr, + nullptr, + "Aacutesmall", + "Agravesmall", + "Acircumflexsmall", + "Adieresissmall", + "Atildesmall", + "Aringsmall", + "Ccedillasmall", + "Eacutesmall", + "Egravesmall", + "Ecircumflexsmall", + "Edieresissmall", + "Iacutesmall", + "Igravesmall", + "Icircumflexsmall", + "Idieresissmall", + "Ntildesmall", + "Oacutesmall", + "Ogravesmall", + "Ocircumflexsmall", + "Odieresissmall", + "Otildesmall", + "Uacutesmall", + "Ugravesmall", + "Ucircumflexsmall", + "Udieresissmall", + nullptr, + "eightsuperior", + "fourinferior", + "threeinferior", + "sixinferior", + "eightinferior", + "seveninferior", + "Scaronsmall", + nullptr, + "centinferior", + "twoinferior", + nullptr, + "Dieresissmall", + nullptr, + "Caronsmall", + "Scaronsmall", + "fiveinferior", + nullptr, + "commainferior", + "periodinferior", + "Yacutesmall", + nullptr, + "dollarinferior", + nullptr, + nullptr, + "Thornsmall", + nullptr, + "nineinferior", + "zeroinferior", + "Zcaronsmall", + "AEsmall", + "Oslashsmall", + "questiondownsmall", + "oneinferior", + "asuperior", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "Cedillasmall", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "OEsmall", + "figuredash", + "hyphensuperior", + nullptr, + nullptr, + nullptr, + nullptr, + "exclamdownsmall", + nullptr, + "Ydieresissmall", + nullptr, + "onesuperior", + "twosuperior", + "threesuperior", + "foursuperior", + "fivesuperior", + "sixsuperior", + "sevensuperior", + "ninesuperior", + "zerosuperior", + nullptr, + "esuperior", + "rsuperior", + nullptr, + nullptr, + nullptr, + "isuperior", + "ssuperior", + "dsuperior", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "lsuperior", + "Ogoneksmall", + "Brevesmall", + "Macronsmall", + "bsuperior", + "nsuperior", + "msuperior", + "commasuperior", + "periodsuperior", + "Dotaccentsmall", + "Ringsmall", + nullptr, + nullptr, + nullptr, + nullptr, +}; + +const FX_CHAR* const PDFDocEncodingNames[232] = { + "breve", + "caron", + "circumflex", + "dotaccent", + "hungarumlaut", + "ogonek", + "ring", + "tilde", + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quotesingle", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "grave", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + nullptr, + "bullet3", + "dagger", + "daggerdbl", + "ellipsis", + "emdash", + "endash", + "florin", + "fraction", + "guilsinglleft", + "guilsinglright", + "minus", + "perthousand", + "quotedblbase", + "quotedblleft", + "quotedblright", + "quoteleft", + "quoteright", + "quotesinglbase", + "trademark", + "fi", + "fl", + "Lslash", + "OE", + "Scaron", + "Ydieresis", + "Zcaron2", + "dotlessi", + "lslash", + "oe", + "scaron", + "zcaron2", + nullptr, + "Euro", + "exclamdown", + "cent", + "sterling", + "currency", + "yen", + "brokenbar", + "section", + "dieresis", + "copyright", + "ordfeminine", + "guillemotleft4", + "logicalnot", + nullptr, + "registered", + "macron", + "degree", + "plusminus", + "twosuperior", + "threesuperior", + "acute", + "mu", + "paragraph", + "periodcentered", + "cedilla", + "onesuperior", + "ordmasculine", + "guillemotright4", + "onequarter", + "onehalf", + "threequarters", + "questiondown", + "Agrave", + "Aacute", + "Acircumflex", + "Atilde", + "Adieresis", + "Aring", + "AE", + "Ccedilla", + "Egrave", + "Eacute", + "Ecircumflex", + "Edieresis", + "Igrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Eth", + "Ntilde", + "Ograve", + "Oacute", + "Ocircumflex", + "Otilde", + "Odieresis", + "multiply", + "Oslash", + "Ugrave", + "Uacute", + "Ucircumflex", + "Udieresis", + "Yacute", + "Thorn", + "germandbls", + "agrave", + "aacute", + "acircumflex", + "atilde", + "adieresis", + "aring", + "ae", + "ccedilla", + "egrave", + "eacute", + "ecircumflex", + "edieresis", + "igrave", + "iacute", + "icircumflex", + "idieresis", + "eth", + "ntilde", + "ograve", + "oacute", + "ocircumflex", + "otilde", + "odieresis", + "divide", + "oslash", + "ugrave", + "uacute", + "ucircumflex", + "udieresis", + "yacute", + "thorn", + "ydieresis", +}; + +const FX_CHAR* const AdobeSymbolEncodingNames[224] = { + "space", + "exclam", + "universal", + "numbersign", + "existential", + "percent", + "ampersand", + "suchthat", + "parenleft", + "parenright", + "asteriskmath", + "plus", + "comma", + "minus", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "congruent", + "Alpha", + "Beta", + "Chi", + "Delta", + "Epsilon", + "Phi", + "Gamma", + "Eta", + "Iota", + "theta1", + "Kappa", + "Lambda", + "Mu", + "Nu", + "Omicron", + "Pi", + "Theta", + "Rho", + "Sigma", + "Tau", + "Upsilon", + "sigma1", + "Omega", + "Xi", + "Psi", + "Zeta", + "bracketleft", + "therefore", + "bracketright", + "perpendicular", + "underscore", + "radicalex", + "alpha", + "beta", + "chi", + "delta", + "epsilon", + "phi", + "gamma", + "eta", + "iota", + "phi1", + "kappa", + "lambda", + "mu", + "nu", + "omicron", + "pi", + "theta", + "rho", + "sigma", + "tau", + "upsilon", + "omega1", + "omega", + "xi", + "psi", + "zeta", + "braceleft", + "bar", + "braceright", + "similar", + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + "Euro", + "Upsilon1", + "minute", + "lessequal", + "fraction", + "infinity", + "florin", + "club", + "diamond", + "heart", + "spade", + "arrowboth", + "arrowleft", + "arrowup", + "arrowright", + "arrowdown", + "degree", + "plusminus", + "second", + "greaterequal", + "multiply", + "proportional", + "partialdiff", + "bullet", + "divide", + "notequal", + "equivalence", + "approxequal", + "ellipsis", + "arrowvertex", + "arrowhorizex", + "carriagereturn", + "aleph", + "Ifraktur", + "Rfraktur", + "weierstrass", + "circlemultiply", + "circleplus", + "emptyset", + "intersection", + "union", + "propersuperset", + "reflexsuperset", + "notsubset", + "propersubset", + "reflexsubset", + "element", + "notelement", + "angle", + "gradient", + "registerserif", + "copyrightserif", + "trademarkserif", + "product", + "radical", + "dotmath", + "logicalnot", + "logicaland", + "logicalor", + "arrowdblboth", + "arrowdblleft", + "arrowdblup", + "arrowdblright", + "arrowdbldown", + "lozenge", + "angleleft", + "registersans", + "copyrightsans", + "trademarksans", + "summation", + "parenlefttp", + "parenleftex", + "parenleftbt", + "bracketlefttp", + "bracketleftex", + "bracketleftbt", + "bracelefttp", + "braceleftmid", + "braceleftbt", + "braceex", + nullptr, + "angleright", + "integral", + "integraltp", + "integralex", + "integralbt", + "parenrighttp", + "parenrightex", + "parenrightbt", + "bracketrighttp", + "bracketrightex", + "bracketrightbt", + "bracerighttp", + "bracerightmid", + "bracerightbt", + nullptr, +}; + +const FX_CHAR* const ZapfEncodingNames[224] = { + "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119", + "a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16", + "a105", "a17", "a18", "a19", "a20", "a21", "a22", "a23", + "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8", + "a9", "a10", "a29", "a30", "a31", "a32", "a33", "a34", + "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42", + "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50", + "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", + "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66", + "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74", + "a203", "a75", "a204", "a76", "a77", "a78", "a79", "a81", + "a82", "a83", "a84", "a97", "a98", "a99", "a100", nullptr, + "a89", "a90", "a93", "a94", "a91", "a92", "a205", "a85", + "a206", "a86", "a87", "a88", "a95", "a96", nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, "a101", "a102", "a103", "a104", "a106", "a107", "a108", + "a112", "a111", "a110", "a109", "a120", "a121", "a122", "a123", + "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131", + "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139", + "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147", + "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155", + "a156", "a157", "a158", "a159", "a160", "a161", "a163", "a164", + "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170", + "a171", "a172", "a173", "a162", "a174", "a175", "a176", "a177", + "a178", "a179", "a193", "a180", "a199", "a181", "a200", "a182", + nullptr, "a201", "a183", "a184", "a197", "a185", "a194", "a198", + "a186", "a195", "a187", "a188", "a189", "a190", "a191", nullptr}; + +uint32_t PDF_FindCode(const uint16_t* pCodes, uint16_t unicode) { + for (uint32_t i = 0; i < 256; i++) + if (pCodes[i] == unicode) + return i; + return 0; +} + +} // namespace + +CPDF_FontEncoding::CPDF_FontEncoding() { + FXSYS_memset(m_Unicodes, 0, sizeof(m_Unicodes)); +} + +int CPDF_FontEncoding::CharCodeFromUnicode(FX_WCHAR unicode) const { + for (int i = 0; i < 256; i++) + if (m_Unicodes[i] == unicode) { + return i; + } + return -1; +} + +CPDF_FontEncoding::CPDF_FontEncoding(int PredefinedEncoding) { + const uint16_t* pSrc = PDF_UnicodesForPredefinedCharSet(PredefinedEncoding); + if (!pSrc) { + FXSYS_memset(m_Unicodes, 0, sizeof(m_Unicodes)); + } else { + for (int i = 0; i < 256; i++) + m_Unicodes[i] = pSrc[i]; + } +} + +bool CPDF_FontEncoding::IsIdentical(CPDF_FontEncoding* pAnother) const { + return FXSYS_memcmp(m_Unicodes, pAnother->m_Unicodes, sizeof(m_Unicodes)) == + 0; +} + +std::unique_ptr CPDF_FontEncoding::Realize( + CFX_WeakPtr pPool) { + int predefined = 0; + for (int cs = PDFFONT_ENCODING_WINANSI; cs < PDFFONT_ENCODING_ZAPFDINGBATS; + cs++) { + const uint16_t* pSrc = PDF_UnicodesForPredefinedCharSet(cs); + bool match = true; + for (int i = 0; i < 256; ++i) { + if (m_Unicodes[i] != pSrc[i]) { + match = false; + break; + } + } + if (match) { + predefined = cs; + break; + } + } + if (predefined) { + if (predefined == PDFFONT_ENCODING_WINANSI) + return pdfium::MakeUnique(pPool, "WinAnsiEncoding"); + if (predefined == PDFFONT_ENCODING_MACROMAN) + return pdfium::MakeUnique(pPool, "MacRomanEncoding"); + if (predefined == PDFFONT_ENCODING_MACEXPERT) + return pdfium::MakeUnique(pPool, "MacExpertEncoding"); + + return nullptr; + } + const uint16_t* pStandard = + PDF_UnicodesForPredefinedCharSet(PDFFONT_ENCODING_WINANSI); + auto pDiff = pdfium::MakeUnique(); + for (int i = 0; i < 256; i++) { + if (pStandard[i] == m_Unicodes[i]) + continue; + + pDiff->AddNew(i); + pDiff->AddNew(PDF_AdobeNameFromUnicode(m_Unicodes[i])); + } + + auto pDict = pdfium::MakeUnique(pPool); + pDict->SetNewFor("BaseEncoding", "WinAnsiEncoding"); + pDict->SetFor("Differences", std::move(pDiff)); + return std::move(pDict); +} + +uint32_t FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode) { + switch (encoding) { + case FXFT_ENCODING_UNICODE: + return unicode; + case FXFT_ENCODING_ADOBE_STANDARD: + return PDF_FindCode(StandardEncoding, unicode); + case FXFT_ENCODING_ADOBE_EXPERT: + return PDF_FindCode(MacExpertEncoding, unicode); + case FXFT_ENCODING_ADOBE_LATIN_1: + return PDF_FindCode(AdobeWinAnsiEncoding, unicode); + case FXFT_ENCODING_APPLE_ROMAN: + return PDF_FindCode(MacRomanEncoding, unicode); + case FXFT_ENCODING_ADOBE_CUSTOM: + return PDF_FindCode(PDFDocEncoding, unicode); + case FXFT_ENCODING_MS_SYMBOL: + return PDF_FindCode(MSSymbolEncoding, unicode); + } + return 0; +} +const uint16_t* PDF_UnicodesForPredefinedCharSet(int encoding) { + switch (encoding) { + case PDFFONT_ENCODING_WINANSI: + return AdobeWinAnsiEncoding; + case PDFFONT_ENCODING_MACROMAN: + return MacRomanEncoding; + case PDFFONT_ENCODING_MACEXPERT: + return MacExpertEncoding; + case PDFFONT_ENCODING_STANDARD: + return StandardEncoding; + case PDFFONT_ENCODING_ADOBE_SYMBOL: + return AdobeSymbolEncoding; + case PDFFONT_ENCODING_ZAPFDINGBATS: + return ZapfEncoding; + case PDFFONT_ENCODING_PDFDOC: + return PDFDocEncoding; + case PDFFONT_ENCODING_MS_SYMBOL: + return MSSymbolEncoding; + } + return nullptr; +} + +FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name) { + return (FX_WCHAR)(FXFT_unicode_from_adobe_name(name) & 0x7FFFFFFF); +} + +CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode) { + char glyph_name[64]; + FXFT_adobe_name_from_unicode(glyph_name, unicode); + return CFX_ByteString(glyph_name); +} + +const FX_CHAR* PDF_CharNameFromPredefinedCharSet(int encoding, + uint8_t charcode) { + if (encoding == PDFFONT_ENCODING_PDFDOC) { + if (charcode < 24) + return nullptr; + + charcode -= 24; + } else { + if (charcode < 32) + return nullptr; + + charcode -= 32; + } + switch (encoding) { + case PDFFONT_ENCODING_WINANSI: + return AdobeWinAnsiEncodingNames[charcode]; + case PDFFONT_ENCODING_MACROMAN: + return MacRomanEncodingNames[charcode]; + case PDFFONT_ENCODING_MACEXPERT: + return MacExpertEncodingNames[charcode]; + case PDFFONT_ENCODING_STANDARD: + return StandardEncodingNames[charcode]; + case PDFFONT_ENCODING_ADOBE_SYMBOL: + return AdobeSymbolEncodingNames[charcode]; + case PDFFONT_ENCODING_ZAPFDINGBATS: + return ZapfEncodingNames[charcode]; + case PDFFONT_ENCODING_PDFDOC: + return PDFDocEncodingNames[charcode]; + } + return nullptr; +} + +FX_WCHAR FT_UnicodeFromCharCode(int encoding, uint32_t charcode) { + switch (encoding) { + case FXFT_ENCODING_UNICODE: + return (uint16_t)charcode; + case FXFT_ENCODING_ADOBE_STANDARD: + return StandardEncoding[(uint8_t)charcode]; + case FXFT_ENCODING_ADOBE_EXPERT: + return MacExpertEncoding[(uint8_t)charcode]; + case FXFT_ENCODING_ADOBE_LATIN_1: + return AdobeWinAnsiEncoding[(uint8_t)charcode]; + case FXFT_ENCODING_APPLE_ROMAN: + return MacRomanEncoding[(uint8_t)charcode]; + case PDFFONT_ENCODING_PDFDOC: + return PDFDocEncoding[(uint8_t)charcode]; + } + return 0; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_fontencoding.h b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_fontencoding.h new file mode 100644 index 000000000000..6c0de909e120 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_fontencoding.h @@ -0,0 +1,63 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_FONT_CPDF_FONTENCODING_H_ +#define CORE_FPDFAPI_FONT_CPDF_FONTENCODING_H_ + +#include + +#include "core/fxcrt/cfx_string_pool_template.h" +#include "core/fxcrt/cfx_weak_ptr.h" +#include "core/fxcrt/fx_string.h" + +#define PDFFONT_ENCODING_BUILTIN 0 +#define PDFFONT_ENCODING_WINANSI 1 +#define PDFFONT_ENCODING_MACROMAN 2 +#define PDFFONT_ENCODING_MACEXPERT 3 +#define PDFFONT_ENCODING_STANDARD 4 +#define PDFFONT_ENCODING_ADOBE_SYMBOL 5 +#define PDFFONT_ENCODING_ZAPFDINGBATS 6 +#define PDFFONT_ENCODING_PDFDOC 7 +#define PDFFONT_ENCODING_MS_SYMBOL 8 +#define PDFFONT_ENCODING_UNICODE 9 + +uint32_t FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode); +FX_WCHAR FT_UnicodeFromCharCode(int encoding, uint32_t charcode); + +FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name); +CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode); + +const uint16_t* PDF_UnicodesForPredefinedCharSet(int encoding); +const FX_CHAR* PDF_CharNameFromPredefinedCharSet(int encoding, + uint8_t charcode); + +class CPDF_Object; + +class CPDF_FontEncoding { + public: + CPDF_FontEncoding(); + explicit CPDF_FontEncoding(int PredefinedEncoding); + + void LoadEncoding(CPDF_Object* pEncoding); + + bool IsIdentical(CPDF_FontEncoding* pAnother) const; + + FX_WCHAR UnicodeFromCharCode(uint8_t charcode) const { + return m_Unicodes[charcode]; + } + int CharCodeFromUnicode(FX_WCHAR unicode) const; + + void SetUnicode(uint8_t charcode, FX_WCHAR unicode) { + m_Unicodes[charcode] = unicode; + } + + std::unique_ptr Realize(CFX_WeakPtr pPool); + + public: + FX_WCHAR m_Unicodes[256]; +}; + +#endif // CORE_FPDFAPI_FONT_CPDF_FONTENCODING_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_simplefont.cpp b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_simplefont.cpp new file mode 100644 index 000000000000..c41427006867 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_simplefont.cpp @@ -0,0 +1,212 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/font/cpdf_simplefont.h" + +#include "core/fpdfapi/font/font_int.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fxge/fx_freetype.h" +#include "third_party/base/numerics/safe_math.h" + +CPDF_SimpleFont::CPDF_SimpleFont() : m_BaseEncoding(PDFFONT_ENCODING_BUILTIN) { + FXSYS_memset(m_CharWidth, 0xff, sizeof(m_CharWidth)); + FXSYS_memset(m_GlyphIndex, 0xff, sizeof(m_GlyphIndex)); + FXSYS_memset(m_ExtGID, 0xff, sizeof(m_ExtGID)); + for (size_t i = 0; i < FX_ArraySize(m_CharBBox); ++i) + m_CharBBox[i] = FX_RECT(-1, -1, -1, -1); +} + +CPDF_SimpleFont::~CPDF_SimpleFont() {} + +int CPDF_SimpleFont::GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) { + if (pVertGlyph) + *pVertGlyph = false; + + if (charcode > 0xff) + return -1; + + int index = m_GlyphIndex[(uint8_t)charcode]; + return index != 0xffff ? index : -1; +} + +void CPDF_SimpleFont::LoadCharMetrics(int charcode) { + if (!m_Font.GetFace()) + return; + + if (charcode < 0 || charcode > 0xff) { + return; + } + int glyph_index = m_GlyphIndex[charcode]; + if (glyph_index == 0xffff) { + if (!m_pFontFile && charcode != 32) { + LoadCharMetrics(32); + m_CharBBox[charcode] = m_CharBBox[32]; + if (m_bUseFontWidth) { + m_CharWidth[charcode] = m_CharWidth[32]; + } + } + return; + } + FXFT_Face face = m_Font.GetFace(); + int err = FXFT_Load_Glyph( + face, glyph_index, + FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); + if (err) + return; + + int iHoriBearingX = FXFT_Get_Glyph_HoriBearingX(face); + int iHoriBearingY = FXFT_Get_Glyph_HoriBearingY(face); + m_CharBBox[charcode] = + FX_RECT(TT2PDF(iHoriBearingX, face), TT2PDF(iHoriBearingY, face), + TT2PDF(iHoriBearingX + FXFT_Get_Glyph_Width(face), face), + TT2PDF(iHoriBearingY - FXFT_Get_Glyph_Height(face), face)); + + if (m_bUseFontWidth) { + int TT_Width = TT2PDF(FXFT_Get_Glyph_HoriAdvance(face), face); + if (m_CharWidth[charcode] == 0xffff) { + m_CharWidth[charcode] = TT_Width; + } else if (TT_Width && !IsEmbedded()) { + m_CharBBox[charcode].right = + m_CharBBox[charcode].right * m_CharWidth[charcode] / TT_Width; + m_CharBBox[charcode].left = + m_CharBBox[charcode].left * m_CharWidth[charcode] / TT_Width; + } + } +} + +int CPDF_SimpleFont::GetCharWidthF(uint32_t charcode) { + if (charcode > 0xff) + charcode = 0; + + if (m_CharWidth[charcode] == 0xffff) { + LoadCharMetrics(charcode); + if (m_CharWidth[charcode] == 0xffff) { + m_CharWidth[charcode] = 0; + } + } + return m_CharWidth[charcode]; +} + +FX_RECT CPDF_SimpleFont::GetCharBBox(uint32_t charcode) { + if (charcode > 0xff) + charcode = 0; + + if (m_CharBBox[charcode].left == -1) + LoadCharMetrics(charcode); + + return m_CharBBox[charcode]; +} + +bool CPDF_SimpleFont::LoadCommon() { + CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictFor("FontDescriptor"); + if (pFontDesc) { + LoadFontDescriptor(pFontDesc); + } + CPDF_Array* pWidthArray = m_pFontDict->GetArrayFor("Widths"); + m_bUseFontWidth = !pWidthArray; + if (pWidthArray) { + if (pFontDesc && pFontDesc->KeyExist("MissingWidth")) { + int MissingWidth = pFontDesc->GetIntegerFor("MissingWidth"); + for (int i = 0; i < 256; i++) { + m_CharWidth[i] = MissingWidth; + } + } + size_t width_start = m_pFontDict->GetIntegerFor("FirstChar", 0); + size_t width_end = m_pFontDict->GetIntegerFor("LastChar", 0); + if (width_start <= 255) { + if (width_end == 0 || width_end >= width_start + pWidthArray->GetCount()) + width_end = width_start + pWidthArray->GetCount() - 1; + if (width_end > 255) + width_end = 255; + for (size_t i = width_start; i <= width_end; i++) + m_CharWidth[i] = pWidthArray->GetIntegerAt(i - width_start); + } + } + if (m_pFontFile) { + if (m_BaseFont.GetLength() > 8 && m_BaseFont[7] == '+') + m_BaseFont = m_BaseFont.Mid(8); + } else { + LoadSubstFont(); + } + if (!(m_Flags & FXFONT_SYMBOLIC)) + m_BaseEncoding = PDFFONT_ENCODING_STANDARD; + CPDF_Object* pEncoding = m_pFontDict->GetDirectObjectFor("Encoding"); + LoadPDFEncoding(pEncoding, m_BaseEncoding, &m_CharNames, !!m_pFontFile, + m_Font.IsTTFont()); + LoadGlyphMap(); + m_CharNames.clear(); + if (!m_Font.GetFace()) + return true; + + if (m_Flags & FXFONT_ALLCAP) { + unsigned char kLowercases[][2] = {{'a', 'z'}, {0xe0, 0xf6}, {0xf8, 0xfd}}; + for (size_t range = 0; range < FX_ArraySize(kLowercases); ++range) { + const auto& lower = kLowercases[range]; + for (int i = lower[0]; i <= lower[1]; ++i) { + if (m_GlyphIndex[i] != 0xffff && m_pFontFile) + continue; + + int j = i - 32; + m_GlyphIndex[i] = m_GlyphIndex[j]; + if (m_CharWidth[j]) { + m_CharWidth[i] = m_CharWidth[j]; + m_CharBBox[i] = m_CharBBox[j]; + } + } + } + } + CheckFontMetrics(); + return true; +} + +void CPDF_SimpleFont::LoadSubstFont() { + if (!m_bUseFontWidth && !(m_Flags & FXFONT_FIXED_PITCH)) { + int width = 0, i; + for (i = 0; i < 256; i++) { + if (m_CharWidth[i] == 0 || m_CharWidth[i] == 0xffff) + continue; + + if (width == 0) + width = m_CharWidth[i]; + else if (width != m_CharWidth[i]) + break; + } + if (i == 256 && width) + m_Flags |= FXFONT_FIXED_PITCH; + } + pdfium::base::CheckedNumeric safeStemV(m_StemV); + if (m_StemV < 140) + safeStemV *= 5; + else + safeStemV = safeStemV * 4 + 140; + m_Font.LoadSubst(m_BaseFont, IsTrueTypeFont(), m_Flags, + safeStemV.ValueOrDefault(FXFONT_FW_NORMAL), m_ItalicAngle, 0, + false); +} + +bool CPDF_SimpleFont::IsUnicodeCompatible() const { + return m_BaseEncoding != PDFFONT_ENCODING_BUILTIN && + m_BaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL && + m_BaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS; +} + +CFX_WideString CPDF_SimpleFont::UnicodeFromCharCode(uint32_t charcode) const { + CFX_WideString unicode = CPDF_Font::UnicodeFromCharCode(charcode); + if (!unicode.IsEmpty()) + return unicode; + FX_WCHAR ret = m_Encoding.UnicodeFromCharCode((uint8_t)charcode); + if (ret == 0) + return CFX_WideString(); + return ret; +} + +uint32_t CPDF_SimpleFont::CharCodeFromUnicode(FX_WCHAR unicode) const { + uint32_t ret = CPDF_Font::CharCodeFromUnicode(unicode); + if (ret) + return ret; + return m_Encoding.CharCodeFromUnicode(unicode); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_simplefont.h b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_simplefont.h new file mode 100644 index 000000000000..592290b99b45 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_simplefont.h @@ -0,0 +1,49 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_FONT_CPDF_SIMPLEFONT_H_ +#define CORE_FPDFAPI_FONT_CPDF_SIMPLEFONT_H_ + +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/font/cpdf_fontencoding.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_SimpleFont : public CPDF_Font { + public: + CPDF_SimpleFont(); + ~CPDF_SimpleFont() override; + + // CPDF_Font + int GetCharWidthF(uint32_t charcode) override; + FX_RECT GetCharBBox(uint32_t charcode) override; + int GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) override; + bool IsUnicodeCompatible() const override; + CFX_WideString UnicodeFromCharCode(uint32_t charcode) const override; + uint32_t CharCodeFromUnicode(FX_WCHAR Unicode) const override; + + CPDF_FontEncoding* GetEncoding() { return &m_Encoding; } + + protected: + virtual void LoadGlyphMap() = 0; + + bool LoadCommon(); + void LoadSubstFont(); + void LoadCharMetrics(int charcode); + + CPDF_FontEncoding m_Encoding; + uint16_t m_GlyphIndex[256]; + uint16_t m_ExtGID[256]; + std::vector m_CharNames; + int m_BaseEncoding; + uint16_t m_CharWidth[256]; + FX_RECT m_CharBBox[256]; + bool m_bUseFontWidth; +}; + +#endif // CORE_FPDFAPI_FONT_CPDF_SIMPLEFONT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_truetypefont.cpp b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_truetypefont.cpp new file mode 100644 index 000000000000..b8bee2968e15 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_truetypefont.cpp @@ -0,0 +1,223 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/font/cpdf_truetypefont.h" + +#include "core/fpdfapi/font/font_int.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fxge/fx_font.h" + +namespace { + +const uint8_t kPrefix[4] = {0x00, 0xf0, 0xf1, 0xf2}; + +} // namespace + +CPDF_TrueTypeFont::CPDF_TrueTypeFont() {} + +bool CPDF_TrueTypeFont::IsTrueTypeFont() const { + return true; +} + +const CPDF_TrueTypeFont* CPDF_TrueTypeFont::AsTrueTypeFont() const { + return this; +} + +CPDF_TrueTypeFont* CPDF_TrueTypeFont::AsTrueTypeFont() { + return this; +} + +bool CPDF_TrueTypeFont::Load() { + return LoadCommon(); +} + +void CPDF_TrueTypeFont::LoadGlyphMap() { + if (!m_Font.GetFace()) + return; + + int baseEncoding = m_BaseEncoding; + if (m_pFontFile && m_Font.GetFace()->num_charmaps > 0 && + (baseEncoding == PDFFONT_ENCODING_MACROMAN || + baseEncoding == PDFFONT_ENCODING_WINANSI) && + (m_Flags & FXFONT_SYMBOLIC)) { + bool bSupportWin = false; + bool bSupportMac = false; + for (int i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.GetFace()); i++) { + int platform_id = FXFT_Get_Charmap_PlatformID( + FXFT_Get_Face_Charmaps(m_Font.GetFace())[i]); + if (platform_id == 0 || platform_id == 3) { + bSupportWin = true; + } else if (platform_id == 0 || platform_id == 1) { + bSupportMac = true; + } + } + if (baseEncoding == PDFFONT_ENCODING_WINANSI && !bSupportWin) { + baseEncoding = + bSupportMac ? PDFFONT_ENCODING_MACROMAN : PDFFONT_ENCODING_BUILTIN; + } else if (baseEncoding == PDFFONT_ENCODING_MACROMAN && !bSupportMac) { + baseEncoding = + bSupportWin ? PDFFONT_ENCODING_WINANSI : PDFFONT_ENCODING_BUILTIN; + } + } + if (((baseEncoding == PDFFONT_ENCODING_MACROMAN || + baseEncoding == PDFFONT_ENCODING_WINANSI) && + m_CharNames.empty()) || + (m_Flags & FXFONT_NONSYMBOLIC)) { + if (!FXFT_Has_Glyph_Names(m_Font.GetFace()) && + (!m_Font.GetFace()->num_charmaps || !m_Font.GetFace()->charmaps)) { + int nStartChar = m_pFontDict->GetIntegerFor("FirstChar"); + if (nStartChar < 0 || nStartChar > 255) + return; + + int charcode = 0; + for (; charcode < nStartChar; charcode++) { + m_GlyphIndex[charcode] = 0; + } + uint16_t nGlyph = charcode - nStartChar + 3; + for (; charcode < 256; charcode++, nGlyph++) { + m_GlyphIndex[charcode] = nGlyph; + } + return; + } + bool bMSUnicode = FT_UseTTCharmap(m_Font.GetFace(), 3, 1); + bool bMacRoman = false; + bool bMSSymbol = false; + if (!bMSUnicode) { + if (m_Flags & FXFONT_NONSYMBOLIC) { + bMacRoman = FT_UseTTCharmap(m_Font.GetFace(), 1, 0); + bMSSymbol = !bMacRoman && FT_UseTTCharmap(m_Font.GetFace(), 3, 0); + } else { + bMSSymbol = FT_UseTTCharmap(m_Font.GetFace(), 3, 0); + bMacRoman = !bMSSymbol && FT_UseTTCharmap(m_Font.GetFace(), 1, 0); + } + } + bool bToUnicode = m_pFontDict->KeyExist("ToUnicode"); + for (int charcode = 0; charcode < 256; charcode++) { + const FX_CHAR* name = + GetAdobeCharName(baseEncoding, m_CharNames, charcode); + if (!name) { + m_GlyphIndex[charcode] = + m_pFontFile ? FXFT_Get_Char_Index(m_Font.GetFace(), charcode) : -1; + continue; + } + m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); + if (bMSSymbol) { + for (size_t j = 0; j < FX_ArraySize(kPrefix); j++) { + uint16_t unicode = kPrefix[j] * 256 + charcode; + m_GlyphIndex[charcode] = + FXFT_Get_Char_Index(m_Font.GetFace(), unicode); + if (m_GlyphIndex[charcode]) { + break; + } + } + } else if (m_Encoding.m_Unicodes[charcode]) { + if (bMSUnicode) { + m_GlyphIndex[charcode] = FXFT_Get_Char_Index( + m_Font.GetFace(), m_Encoding.m_Unicodes[charcode]); + } else if (bMacRoman) { + uint32_t maccode = FT_CharCodeFromUnicode( + FXFT_ENCODING_APPLE_ROMAN, m_Encoding.m_Unicodes[charcode]); + if (!maccode) { + m_GlyphIndex[charcode] = + FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); + } else { + m_GlyphIndex[charcode] = + FXFT_Get_Char_Index(m_Font.GetFace(), maccode); + } + } + } + if ((m_GlyphIndex[charcode] == 0 || m_GlyphIndex[charcode] == 0xffff) && + name) { + if (name[0] == '.' && FXSYS_strcmp(name, ".notdef") == 0) { + m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), 32); + } else { + m_GlyphIndex[charcode] = + FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); + if (m_GlyphIndex[charcode] == 0) { + if (bToUnicode) { + CFX_WideString wsUnicode = UnicodeFromCharCode(charcode); + if (!wsUnicode.IsEmpty()) { + m_GlyphIndex[charcode] = + FXFT_Get_Char_Index(m_Font.GetFace(), wsUnicode[0]); + m_Encoding.m_Unicodes[charcode] = wsUnicode[0]; + } + } + if (m_GlyphIndex[charcode] == 0) { + m_GlyphIndex[charcode] = + FXFT_Get_Char_Index(m_Font.GetFace(), charcode); + } + } + } + } + } + return; + } + if (FT_UseTTCharmap(m_Font.GetFace(), 3, 0)) { + bool bFound = false; + for (int charcode = 0; charcode < 256; charcode++) { + for (size_t j = 0; j < FX_ArraySize(kPrefix); j++) { + uint16_t unicode = kPrefix[j] * 256 + charcode; + m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), unicode); + if (m_GlyphIndex[charcode]) { + bFound = true; + break; + } + } + } + if (bFound) { + if (baseEncoding != PDFFONT_ENCODING_BUILTIN) { + for (int charcode = 0; charcode < 256; charcode++) { + const FX_CHAR* name = + GetAdobeCharName(baseEncoding, m_CharNames, charcode); + if (name) + m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); + } + } else if (FT_UseTTCharmap(m_Font.GetFace(), 1, 0)) { + for (int charcode = 0; charcode < 256; charcode++) { + m_Encoding.m_Unicodes[charcode] = + FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode); + } + } + return; + } + } + if (FT_UseTTCharmap(m_Font.GetFace(), 1, 0)) { + bool bFound = false; + for (int charcode = 0; charcode < 256; charcode++) { + m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), charcode); + m_Encoding.m_Unicodes[charcode] = + FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode); + if (m_GlyphIndex[charcode]) { + bFound = true; + } + } + if (m_pFontFile || bFound) + return; + } + if (FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE) == 0) { + bool bFound = false; + const uint16_t* pUnicodes = PDF_UnicodesForPredefinedCharSet(baseEncoding); + for (int charcode = 0; charcode < 256; charcode++) { + if (m_pFontFile) { + m_Encoding.m_Unicodes[charcode] = charcode; + } else { + const FX_CHAR* name = GetAdobeCharName(0, m_CharNames, charcode); + if (name) + m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); + else if (pUnicodes) + m_Encoding.m_Unicodes[charcode] = pUnicodes[charcode]; + } + m_GlyphIndex[charcode] = FXFT_Get_Char_Index( + m_Font.GetFace(), m_Encoding.m_Unicodes[charcode]); + if (m_GlyphIndex[charcode]) + bFound = true; + } + if (bFound) + return; + } + for (int charcode = 0; charcode < 256; charcode++) + m_GlyphIndex[charcode] = charcode; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_truetypefont.h b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_truetypefont.h new file mode 100644 index 000000000000..6a5e0fc83efd --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_truetypefont.h @@ -0,0 +1,30 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_FONT_CPDF_TRUETYPEFONT_H_ +#define CORE_FPDFAPI_FONT_CPDF_TRUETYPEFONT_H_ + +#include "core/fpdfapi/font/cpdf_simplefont.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_TrueTypeFont : public CPDF_SimpleFont { + public: + CPDF_TrueTypeFont(); + + // CPDF_Font: + bool IsTrueTypeFont() const override; + const CPDF_TrueTypeFont* AsTrueTypeFont() const override; + CPDF_TrueTypeFont* AsTrueTypeFont() override; + + protected: + // CPDF_Font: + bool Load() override; + + // CPDF_SimpleFont: + void LoadGlyphMap() override; +}; + +#endif // CORE_FPDFAPI_FONT_CPDF_TRUETYPEFONT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type1font.cpp b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type1font.cpp new file mode 100644 index 000000000000..1a37555a5097 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type1font.cpp @@ -0,0 +1,342 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/font/cpdf_type1font.h" + +#include "core/fpdfapi/font/font_int.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/fx_freetype.h" + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ +#include "core/fxge/apple/apple_int.h" +#endif + +namespace { + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ +struct GlyphNameMap { + const FX_CHAR* m_pStrAdobe; + const FX_CHAR* m_pStrUnicode; +}; + +const GlyphNameMap g_GlyphNameSubsts[] = {{"ff", "uniFB00"}, + {"ffi", "uniFB03"}, + {"ffl", "uniFB04"}, + {"fi", "uniFB01"}, + {"fl", "uniFB02"}}; + +int compareString(const void* key, const void* element) { + return FXSYS_stricmp(static_cast(key), + static_cast(element)->m_pStrAdobe); +} + +const FX_CHAR* GlyphNameRemap(const FX_CHAR* pStrAdobe) { + const GlyphNameMap* found = static_cast(FXSYS_bsearch( + pStrAdobe, g_GlyphNameSubsts, FX_ArraySize(g_GlyphNameSubsts), + sizeof(GlyphNameMap), compareString)); + return found ? found->m_pStrUnicode : nullptr; +} + +#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + +bool FT_UseType1Charmap(FXFT_Face face) { + if (FXFT_Get_Face_CharmapCount(face) == 0) { + return false; + } + if (FXFT_Get_Face_CharmapCount(face) == 1 && + FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) == + FXFT_ENCODING_UNICODE) { + return false; + } + if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) == + FXFT_ENCODING_UNICODE) { + FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[1]); + } else { + FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]); + } + return true; +} + +} // namespace + +CPDF_Type1Font::CPDF_Type1Font() : m_Base14Font(-1) {} + +bool CPDF_Type1Font::IsType1Font() const { + return true; +} + +const CPDF_Type1Font* CPDF_Type1Font::AsType1Font() const { + return this; +} + +CPDF_Type1Font* CPDF_Type1Font::AsType1Font() { + return this; +} + +bool CPDF_Type1Font::Load() { + m_Base14Font = PDF_GetStandardFontName(&m_BaseFont); + if (m_Base14Font >= 0) { + CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictFor("FontDescriptor"); + if (pFontDesc && pFontDesc->KeyExist("Flags")) + m_Flags = pFontDesc->GetIntegerFor("Flags"); + else + m_Flags = m_Base14Font >= 12 ? FXFONT_SYMBOLIC : FXFONT_NONSYMBOLIC; + + if (m_Base14Font < 4) { + for (int i = 0; i < 256; i++) + m_CharWidth[i] = 600; + } + if (m_Base14Font == 12) + m_BaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL; + else if (m_Base14Font == 13) + m_BaseEncoding = PDFFONT_ENCODING_ZAPFDINGBATS; + else if (m_Flags & FXFONT_NONSYMBOLIC) + m_BaseEncoding = PDFFONT_ENCODING_STANDARD; + } + return LoadCommon(); +} + +int CPDF_Type1Font::GlyphFromCharCodeExt(uint32_t charcode) { + if (charcode > 0xff) { + return -1; + } + int index = m_ExtGID[(uint8_t)charcode]; + if (index == 0xffff) { + return -1; + } + return index; +} + +void CPDF_Type1Font::LoadGlyphMap() { + if (!m_Font.GetFace()) + return; + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + bool bCoreText = true; + CQuartz2D& quartz2d = + static_cast(CFX_GEModule::Get()->GetPlatformData()) + ->m_quartz2d; + if (!m_Font.GetPlatformFont()) { + if (m_Font.GetPsName() == "DFHeiStd-W5") + bCoreText = false; + + m_Font.SetPlatformFont( + quartz2d.CreateFont(m_Font.GetFontData(), m_Font.GetSize())); + if (!m_Font.GetPlatformFont()) + bCoreText = false; + } +#endif + if (!IsEmbedded() && (m_Base14Font < 12) && m_Font.IsTTFont()) { + if (FT_UseTTCharmap(m_Font.GetFace(), 3, 0)) { + bool bGotOne = false; + for (int charcode = 0; charcode < 256; charcode++) { + const uint8_t prefix[4] = {0x00, 0xf0, 0xf1, 0xf2}; + for (int j = 0; j < 4; j++) { + uint16_t unicode = prefix[j] * 256 + charcode; + m_GlyphIndex[charcode] = + FXFT_Get_Char_Index(m_Font.GetFace(), unicode); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + CalcExtGID(charcode); +#endif + if (m_GlyphIndex[charcode]) { + bGotOne = true; + break; + } + } + } + if (bGotOne) { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + if (!bCoreText) + FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256); +#endif + return; + } + } + FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE); + if (m_BaseEncoding == 0) { + m_BaseEncoding = PDFFONT_ENCODING_STANDARD; + } + for (int charcode = 0; charcode < 256; charcode++) { + const FX_CHAR* name = + GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode); + if (!name) + continue; + + m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); + m_GlyphIndex[charcode] = FXFT_Get_Char_Index( + m_Font.GetFace(), m_Encoding.m_Unicodes[charcode]); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + CalcExtGID(charcode); +#endif + if (m_GlyphIndex[charcode] == 0 && FXSYS_strcmp(name, ".notdef") == 0) { + m_Encoding.m_Unicodes[charcode] = 0x20; + m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), 0x20); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + CalcExtGID(charcode); +#endif + } + } +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + if (!bCoreText) + FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256); +#endif + return; + } + FT_UseType1Charmap(m_Font.GetFace()); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + if (bCoreText) { + if (m_Flags & FXFONT_SYMBOLIC) { + for (int charcode = 0; charcode < 256; charcode++) { + const FX_CHAR* name = + GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode); + if (name) { + m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); + m_GlyphIndex[charcode] = + FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); + SetExtGID(name, charcode); + } else { + m_GlyphIndex[charcode] = + FXFT_Get_Char_Index(m_Font.GetFace(), charcode); + FX_WCHAR unicode = 0; + if (m_GlyphIndex[charcode]) { + unicode = + FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode); + } + FX_CHAR name_glyph[256]; + FXSYS_memset(name_glyph, 0, sizeof(name_glyph)); + FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], + name_glyph, 256); + name_glyph[255] = 0; + if (unicode == 0 && name_glyph[0] != 0) { + unicode = PDF_UnicodeFromAdobeName(name_glyph); + } + m_Encoding.m_Unicodes[charcode] = unicode; + SetExtGID(name_glyph, charcode); + } + } + return; + } + bool bUnicode = false; + if (0 == FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE)) { + bUnicode = true; + } + for (int charcode = 0; charcode < 256; charcode++) { + const FX_CHAR* name = + GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode); + if (!name) { + continue; + } + m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); + const FX_CHAR* pStrUnicode = GlyphNameRemap(name); + if (pStrUnicode && + 0 == FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name)) { + name = pStrUnicode; + } + m_GlyphIndex[charcode] = + FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); + SetExtGID(name, charcode); + if (m_GlyphIndex[charcode] == 0) { + if (FXSYS_strcmp(name, ".notdef") != 0 && + FXSYS_strcmp(name, "space") != 0) { + m_GlyphIndex[charcode] = FXFT_Get_Char_Index( + m_Font.GetFace(), + bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode); + CalcExtGID(charcode); + } else { + m_Encoding.m_Unicodes[charcode] = 0x20; + m_GlyphIndex[charcode] = + bUnicode ? FXFT_Get_Char_Index(m_Font.GetFace(), 0x20) : 0xffff; + CalcExtGID(charcode); + } + } + } + return; + } +#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + if (m_Flags & FXFONT_SYMBOLIC) { + for (int charcode = 0; charcode < 256; charcode++) { + const FX_CHAR* name = + GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode); + if (name) { + m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); + m_GlyphIndex[charcode] = + FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); + } else { + m_GlyphIndex[charcode] = + FXFT_Get_Char_Index(m_Font.GetFace(), charcode); + if (m_GlyphIndex[charcode]) { + FX_WCHAR unicode = + FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode); + if (unicode == 0) { + FX_CHAR name_glyph[256]; + FXSYS_memset(name_glyph, 0, sizeof(name_glyph)); + FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], + name_glyph, 256); + name_glyph[255] = 0; + if (name_glyph[0] != 0) { + unicode = PDF_UnicodeFromAdobeName(name_glyph); + } + } + m_Encoding.m_Unicodes[charcode] = unicode; + } + } + } +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + if (!bCoreText) + FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256); + +#endif + return; + } + bool bUnicode = false; + if (0 == FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE)) { + bUnicode = true; + } + for (int charcode = 0; charcode < 256; charcode++) { + const FX_CHAR* name = + GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode); + if (!name) { + continue; + } + m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); + m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); + if (m_GlyphIndex[charcode] == 0) { + if (FXSYS_strcmp(name, ".notdef") != 0 && + FXSYS_strcmp(name, "space") != 0) { + m_GlyphIndex[charcode] = FXFT_Get_Char_Index( + m_Font.GetFace(), + bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode); + } else { + m_Encoding.m_Unicodes[charcode] = 0x20; + m_GlyphIndex[charcode] = 0xffff; + } + } + } +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + if (!bCoreText) + FXSYS_memcpy(m_ExtGID, m_GlyphIndex, 256); +#endif +} + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ +void CPDF_Type1Font::SetExtGID(const FX_CHAR* name, int charcode) { + CFStringRef name_ct = CFStringCreateWithCStringNoCopy( + kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull); + m_ExtGID[charcode] = + CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.GetPlatformFont(), name_ct); + if (name_ct) + CFRelease(name_ct); +} + +void CPDF_Type1Font::CalcExtGID(int charcode) { + FX_CHAR name_glyph[256]; + FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], name_glyph, + 256); + name_glyph[255] = 0; + SetExtGID(name_glyph, charcode); +} +#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type1font.h b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type1font.h new file mode 100644 index 000000000000..f5f378561d10 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type1font.h @@ -0,0 +1,40 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_FONT_CPDF_TYPE1FONT_H_ +#define CORE_FPDFAPI_FONT_CPDF_TYPE1FONT_H_ + +#include "core/fpdfapi/font/cpdf_simplefont.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Type1Font : public CPDF_SimpleFont { + public: + CPDF_Type1Font(); + + // CPDF_Font: + bool IsType1Font() const override; + const CPDF_Type1Font* AsType1Font() const override; + CPDF_Type1Font* AsType1Font() override; + int GlyphFromCharCodeExt(uint32_t charcode) override; + + int GetBase14Font() const { return m_Base14Font; } + + private: + // CPDF_Font: + bool Load() override; + + // CPDF_SimpleFont: + void LoadGlyphMap() override; + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + void SetExtGID(const FX_CHAR* name, int charcode); + void CalcExtGID(int charcode); +#endif + + int m_Base14Font; +}; + +#endif // CORE_FPDFAPI_FONT_CPDF_TYPE1FONT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3char.cpp b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3char.cpp new file mode 100644 index 000000000000..5eb12c175260 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3char.cpp @@ -0,0 +1,38 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/font/cpdf_type3char.h" + +#include "core/fpdfapi/page/cpdf_form.h" +#include "core/fpdfapi/page/cpdf_image.h" +#include "core/fpdfapi/page/cpdf_imageobject.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fxge/fx_dib.h" + +CPDF_Type3Char::CPDF_Type3Char(CPDF_Form* pForm) + : m_pForm(pForm), m_bColored(false) {} + +CPDF_Type3Char::~CPDF_Type3Char() {} + +bool CPDF_Type3Char::LoadBitmap(CPDF_RenderContext* pContext) { + if (m_pBitmap || !m_pForm) + return true; + + if (m_pForm->GetPageObjectList()->size() != 1 || m_bColored) + return false; + + auto& pPageObj = m_pForm->GetPageObjectList()->front(); + if (!pPageObj->IsImage()) + return false; + + m_ImageMatrix = pPageObj->AsImage()->matrix(); + std::unique_ptr pSource = + pPageObj->AsImage()->GetImage()->LoadDIBSource(); + if (pSource) + m_pBitmap = pSource->Clone(); + m_pForm.reset(); + return true; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3char.h b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3char.h new file mode 100644 index 000000000000..549f49e3da3d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3char.h @@ -0,0 +1,35 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_FONT_CPDF_TYPE3CHAR_H_ +#define CORE_FPDFAPI_FONT_CPDF_TYPE3CHAR_H_ + +#include + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CFX_DIBitmap; +class CPDF_Form; +class CPDF_RenderContext; + +class CPDF_Type3Char { + public: + // Takes ownership of |pForm|. + explicit CPDF_Type3Char(CPDF_Form* pForm); + ~CPDF_Type3Char(); + + bool LoadBitmap(CPDF_RenderContext* pContext); + + std::unique_ptr m_pForm; + std::unique_ptr m_pBitmap; + bool m_bColored; + int m_Width; + CFX_Matrix m_ImageMatrix; + FX_RECT m_BBox; +}; + +#endif // CORE_FPDFAPI_FONT_CPDF_TYPE3CHAR_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3font.cpp b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3font.cpp new file mode 100644 index 000000000000..f6cd6ecf2632 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3font.cpp @@ -0,0 +1,152 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/font/cpdf_type3font.h" + +#include + +#include "core/fpdfapi/font/cpdf_type3char.h" +#include "core/fpdfapi/page/cpdf_form.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fxcrt/fx_system.h" +#include "third_party/base/stl_util.h" + +#define FPDF_MAX_TYPE3_FORM_LEVEL 4 + +CPDF_Type3Font::CPDF_Type3Font() + : m_pCharProcs(nullptr), + m_pPageResources(nullptr), + m_pFontResources(nullptr), + m_CharLoadingDepth(0) { + FXSYS_memset(m_CharWidthL, 0, sizeof(m_CharWidthL)); +} + +CPDF_Type3Font::~CPDF_Type3Font() {} + +bool CPDF_Type3Font::IsType3Font() const { + return true; +} + +const CPDF_Type3Font* CPDF_Type3Font::AsType3Font() const { + return this; +} + +CPDF_Type3Font* CPDF_Type3Font::AsType3Font() { + return this; +} + +bool CPDF_Type3Font::Load() { + m_pFontResources = m_pFontDict->GetDictFor("Resources"); + CPDF_Array* pMatrix = m_pFontDict->GetArrayFor("FontMatrix"); + FX_FLOAT xscale = 1.0f, yscale = 1.0f; + if (pMatrix) { + m_FontMatrix = pMatrix->GetMatrix(); + xscale = m_FontMatrix.a; + yscale = m_FontMatrix.d; + } + CPDF_Array* pBBox = m_pFontDict->GetArrayFor("FontBBox"); + if (pBBox) { + m_FontBBox.left = (int32_t)(pBBox->GetNumberAt(0) * xscale * 1000); + m_FontBBox.bottom = (int32_t)(pBBox->GetNumberAt(1) * yscale * 1000); + m_FontBBox.right = (int32_t)(pBBox->GetNumberAt(2) * xscale * 1000); + m_FontBBox.top = (int32_t)(pBBox->GetNumberAt(3) * yscale * 1000); + } + int StartChar = m_pFontDict->GetIntegerFor("FirstChar"); + CPDF_Array* pWidthArray = m_pFontDict->GetArrayFor("Widths"); + if (pWidthArray && (StartChar >= 0 && StartChar < 256)) { + size_t count = pWidthArray->GetCount(); + if (count > 256) + count = 256; + if (StartChar + count > 256) + count = 256 - StartChar; + for (size_t i = 0; i < count; i++) { + m_CharWidthL[StartChar + i] = + FXSYS_round(pWidthArray->GetNumberAt(i) * xscale * 1000); + } + } + m_pCharProcs = m_pFontDict->GetDictFor("CharProcs"); + CPDF_Object* pEncoding = m_pFontDict->GetDirectObjectFor("Encoding"); + if (pEncoding) + LoadPDFEncoding(pEncoding, m_BaseEncoding, &m_CharNames, false, false); + return true; +} + +void CPDF_Type3Font::CheckType3FontMetrics() { + CheckFontMetrics(); +} + +CPDF_Type3Char* CPDF_Type3Font::LoadChar(uint32_t charcode) { + if (m_CharLoadingDepth >= FPDF_MAX_TYPE3_FORM_LEVEL) + return nullptr; + + auto it = m_CacheMap.find(charcode); + if (it != m_CacheMap.end()) + return it->second.get(); + + const FX_CHAR* name = GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode); + if (!name) + return nullptr; + + CPDF_Stream* pStream = + ToStream(m_pCharProcs ? m_pCharProcs->GetDirectObjectFor(name) : nullptr); + if (!pStream) + return nullptr; + + std::unique_ptr pNewChar(new CPDF_Type3Char(new CPDF_Form( + m_pDocument, m_pFontResources ? m_pFontResources : m_pPageResources, + pStream, nullptr))); + + // This can trigger recursion into this method. The content of |m_CacheMap| + // can change as a result. Thus after it returns, check the cache again for + // a cache hit. + m_CharLoadingDepth++; + pNewChar->m_pForm->ParseContent(nullptr, nullptr, pNewChar.get()); + m_CharLoadingDepth--; + it = m_CacheMap.find(charcode); + if (it != m_CacheMap.end()) + return it->second.get(); + + FX_FLOAT scale = m_FontMatrix.GetXUnit(); + pNewChar->m_Width = (int32_t)(pNewChar->m_Width * scale + 0.5f); + FX_RECT& rcBBox = pNewChar->m_BBox; + CFX_FloatRect char_rect( + (FX_FLOAT)rcBBox.left / 1000.0f, (FX_FLOAT)rcBBox.bottom / 1000.0f, + (FX_FLOAT)rcBBox.right / 1000.0f, (FX_FLOAT)rcBBox.top / 1000.0f); + if (rcBBox.right <= rcBBox.left || rcBBox.bottom >= rcBBox.top) + char_rect = pNewChar->m_pForm->CalcBoundingBox(); + + m_FontMatrix.TransformRect(char_rect); + rcBBox.left = FXSYS_round(char_rect.left * 1000); + rcBBox.right = FXSYS_round(char_rect.right * 1000); + rcBBox.top = FXSYS_round(char_rect.top * 1000); + rcBBox.bottom = FXSYS_round(char_rect.bottom * 1000); + + ASSERT(!pdfium::ContainsKey(m_CacheMap, charcode)); + m_CacheMap[charcode] = std::move(pNewChar); + CPDF_Type3Char* pCachedChar = m_CacheMap[charcode].get(); + if (pCachedChar->m_pForm->GetPageObjectList()->empty()) + pCachedChar->m_pForm.reset(); + return pCachedChar; +} + +int CPDF_Type3Font::GetCharWidthF(uint32_t charcode) { + if (charcode >= FX_ArraySize(m_CharWidthL)) + charcode = 0; + + if (m_CharWidthL[charcode]) + return m_CharWidthL[charcode]; + + const CPDF_Type3Char* pChar = LoadChar(charcode); + return pChar ? pChar->m_Width : 0; +} + +FX_RECT CPDF_Type3Font::GetCharBBox(uint32_t charcode) { + const CPDF_Type3Char* pChar = LoadChar(charcode); + return pChar ? pChar->m_BBox : FX_RECT(); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3font.h b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3font.h new file mode 100644 index 000000000000..0bae192d611b --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/cpdf_type3font.h @@ -0,0 +1,59 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_FONT_CPDF_TYPE3FONT_H_ +#define CORE_FPDFAPI_FONT_CPDF_TYPE3FONT_H_ + +#include +#include + +#include "core/fpdfapi/font/cpdf_simplefont.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Dictionary; +class CPDF_Type3Char; + +class CPDF_Type3Font : public CPDF_SimpleFont { + public: + CPDF_Type3Font(); + ~CPDF_Type3Font() override; + + // CPDF_Font: + bool IsType3Font() const override; + const CPDF_Type3Font* AsType3Font() const override; + CPDF_Type3Font* AsType3Font() override; + int GetCharWidthF(uint32_t charcode) override; + FX_RECT GetCharBBox(uint32_t charcode) override; + + void SetPageResources(CPDF_Dictionary* pResources) { + m_pPageResources = pResources; + } + CPDF_Type3Char* LoadChar(uint32_t charcode); + void CheckType3FontMetrics(); + + CFX_Matrix& GetFontMatrix() { return m_FontMatrix; } + + protected: + CFX_Matrix m_FontMatrix; + + private: + // CPDF_Font: + bool Load() override; + + // CPDF_SimpleFont: + void LoadGlyphMap() override {} + + int m_CharWidthL[256]; + CPDF_Dictionary* m_pCharProcs; + CPDF_Dictionary* m_pPageResources; + CPDF_Dictionary* m_pFontResources; + std::map> m_CacheMap; + // The depth char loading is in, to avoid recurive calling LoadChar(). + int m_CharLoadingDepth; +}; + +#endif // CORE_FPDFAPI_FONT_CPDF_TYPE3FONT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/font_int.h b/modules/pdfium/pdfium/core/fpdfapi/font/font_int.h new file mode 100644 index 000000000000..41d821ec81fa --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/font_int.h @@ -0,0 +1,211 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_FONT_FONT_INT_H_ +#define CORE_FPDFAPI_FONT_FONT_INT_H_ + +#include +#include +#include + +#include "core/fpdfapi/font/cpdf_cidfont.h" +#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxcrt/fx_basic.h" + +class CPDF_CID2UnicodeMap; +class CPDF_CMap; +class CPDF_Font; +class CPDF_Stream; + +using FXFT_Library = void*; + +int TT2PDF(int m, FXFT_Face face); +bool FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id); +CIDSet CharsetFromOrdering(const CFX_ByteStringC& ordering); + +class CPDF_CMapManager { + public: + CPDF_CMapManager(); + ~CPDF_CMapManager(); + + CFX_MaybeOwned GetPredefinedCMap(const CFX_ByteString& name, + bool bPromptCJK); + CPDF_CID2UnicodeMap* GetCID2UnicodeMap(CIDSet charset, bool bPromptCJK); + + private: + std::unique_ptr LoadPredefinedCMap(const CFX_ByteString& name, + bool bPromptCJK); + std::unique_ptr LoadCID2UnicodeMap(CIDSet charset, + bool bPromptCJK); + + std::map> m_CMaps; + std::unique_ptr m_CID2UnicodeMaps[6]; +}; + +class CFX_StockFontArray { + public: + CFX_StockFontArray(); + ~CFX_StockFontArray(); + + // Takes ownership of |pFont|, returns unowned pointer to it. + CPDF_Font* SetFont(uint32_t index, std::unique_ptr pFont); + CPDF_Font* GetFont(uint32_t index) const; + + private: + std::unique_ptr m_StockFonts[14]; +}; + +class CPDF_FontGlobals { + public: + CPDF_FontGlobals(); + ~CPDF_FontGlobals(); + + void Clear(CPDF_Document* pDoc); + CPDF_Font* Find(CPDF_Document* pDoc, uint32_t index); + + // Takes ownership of |pFont|, returns unowned pointer to it. + CPDF_Font* Set(CPDF_Document* key, + uint32_t index, + std::unique_ptr pFont); + + CPDF_CMapManager m_CMapManager; + struct { + const struct FXCMAP_CMap* m_pMapList; + uint32_t m_Count; + } m_EmbeddedCharsets[CIDSET_NUM_SETS]; + struct { + const uint16_t* m_pMap; + uint32_t m_Count; + } m_EmbeddedToUnicodes[CIDSET_NUM_SETS]; + + private: + std::map> m_StockMap; +}; + +struct CMap_CodeRange { + int m_CharSize; + uint8_t m_Lower[4]; + uint8_t m_Upper[4]; +}; + +class CPDF_CMapParser { + public: + CPDF_CMapParser(); + ~CPDF_CMapParser(); + void Initialize(CPDF_CMap* pMap); + void ParseWord(const CFX_ByteStringC& str); + CFX_BinaryBuf m_AddMaps; + + private: + friend class fpdf_font_cid_CMap_GetCode_Test; + friend class fpdf_font_cid_CMap_GetCodeRange_Test; + + static uint32_t CMap_GetCode(const CFX_ByteStringC& word); + static bool CMap_GetCodeRange(CMap_CodeRange& range, + const CFX_ByteStringC& first, + const CFX_ByteStringC& second); + + CPDF_CMap* m_pCMap; + int m_Status; + int m_CodeSeq; + uint32_t m_CodePoints[4]; + std::vector m_CodeRanges; + CFX_ByteString m_LastWord; +}; + +enum CIDCoding : uint8_t { + CIDCODING_UNKNOWN = 0, + CIDCODING_GB, + CIDCODING_BIG5, + CIDCODING_JIS, + CIDCODING_KOREA, + CIDCODING_UCS2, + CIDCODING_CID, + CIDCODING_UTF16, +}; + +class CPDF_CMap { + public: + enum CodingScheme : uint8_t { + OneByte, + TwoBytes, + MixedTwoBytes, + MixedFourBytes + }; + + CPDF_CMap(); + ~CPDF_CMap(); + + void LoadPredefined(CPDF_CMapManager* pMgr, + const CFX_ByteString& name, + bool bPromptCJK); + void LoadEmbedded(const uint8_t* pData, uint32_t dwSize); + + bool IsLoaded() const; + bool IsVertWriting() const; + uint16_t CIDFromCharCode(uint32_t charcode) const; + int GetCharSize(uint32_t charcode) const; + uint32_t GetNextChar(const FX_CHAR* pString, int nStrLen, int& offset) const; + int CountChar(const FX_CHAR* pString, int size) const; + int AppendChar(FX_CHAR* str, uint32_t charcode) const; + + private: + friend class CPDF_CMapParser; + friend class CPDF_CIDFont; + + CFX_ByteString m_PredefinedCMap; + bool m_bVertical; + CIDSet m_Charset; + int m_Coding; + CodingScheme m_CodingScheme; + int m_nCodeRanges; + uint8_t* m_pLeadingBytes; + uint16_t* m_pMapping; + uint8_t* m_pAddMapping; + bool m_bLoaded; + const FXCMAP_CMap* m_pEmbedMap; +}; + +class CPDF_CID2UnicodeMap { + public: + CPDF_CID2UnicodeMap(); + ~CPDF_CID2UnicodeMap(); + + bool IsLoaded(); + void Load(CPDF_CMapManager* pMgr, CIDSet charset, bool bPromptCJK); + FX_WCHAR UnicodeFromCID(uint16_t CID); + + private: + CIDSet m_Charset; + const uint16_t* m_pEmbeddedMap; + uint32_t m_EmbeddedCount; +}; + +class CPDF_ToUnicodeMap { + public: + CPDF_ToUnicodeMap(); + ~CPDF_ToUnicodeMap(); + + void Load(CPDF_Stream* pStream); + + CFX_WideString Lookup(uint32_t charcode) const; + uint32_t ReverseLookup(FX_WCHAR unicode) const; + + private: + friend class fpdf_font_StringToCode_Test; + friend class fpdf_font_StringToWideString_Test; + + static uint32_t StringToCode(const CFX_ByteStringC& str); + static CFX_WideString StringToWideString(const CFX_ByteStringC& str); + + uint32_t GetUnicode(); + + std::map m_Map; + CPDF_CID2UnicodeMap* m_pBaseMap; + CFX_WideTextBuf m_MultiCharBuf; +}; + +#endif // CORE_FPDFAPI_FONT_FONT_INT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font.cpp b/modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font.cpp new file mode 100644 index 000000000000..7bbd63717789 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font.cpp @@ -0,0 +1,315 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/font/font_int.h" + +#include +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/page/cpdf_form.h" +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_simple_parser.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fxcrt/fx_ext.h" +#include "core/fxcrt/fx_safe_types.h" +#include "core/fxge/fx_freetype.h" +#include "third_party/base/numerics/safe_conversions.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +int TT2PDF(int m, FXFT_Face face) { + int upm = FXFT_Get_Face_UnitsPerEM(face); + if (upm == 0) + return m; + return pdfium::base::checked_cast( + (static_cast(m) * 1000 + upm / 2) / upm); +} + +bool FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id) { + auto* pCharMap = FXFT_Get_Face_Charmaps(face); + for (int i = 0; i < FXFT_Get_Face_CharmapCount(face); i++) { + if (FXFT_Get_Charmap_PlatformID(pCharMap[i]) == platform_id && + FXFT_Get_Charmap_EncodingID(pCharMap[i]) == encoding_id) { + FXFT_Set_Charmap(face, pCharMap[i]); + return true; + } + } + return false; +} + +CFX_StockFontArray::CFX_StockFontArray() {} + +CFX_StockFontArray::~CFX_StockFontArray() { + for (size_t i = 0; i < FX_ArraySize(m_StockFonts); ++i) { + if (m_StockFonts[i]) + delete m_StockFonts[i]->GetFontDict(); + } +} + +CPDF_Font* CFX_StockFontArray::GetFont(uint32_t index) const { + if (index >= FX_ArraySize(m_StockFonts)) + return nullptr; + return m_StockFonts[index].get(); +} + +CPDF_Font* CFX_StockFontArray::SetFont(uint32_t index, + std::unique_ptr pFont) { + CPDF_Font* result = pFont.get(); + if (index < FX_ArraySize(m_StockFonts)) + m_StockFonts[index] = std::move(pFont); + return result; +} + +CPDF_FontGlobals::CPDF_FontGlobals() { + FXSYS_memset(m_EmbeddedCharsets, 0, sizeof(m_EmbeddedCharsets)); + FXSYS_memset(m_EmbeddedToUnicodes, 0, sizeof(m_EmbeddedToUnicodes)); +} + +CPDF_FontGlobals::~CPDF_FontGlobals() {} + +CPDF_Font* CPDF_FontGlobals::Find(CPDF_Document* pDoc, uint32_t index) { + auto it = m_StockMap.find(pDoc); + if (it == m_StockMap.end()) + return nullptr; + return it->second ? it->second->GetFont(index) : nullptr; +} + +CPDF_Font* CPDF_FontGlobals::Set(CPDF_Document* pDoc, + uint32_t index, + std::unique_ptr pFont) { + if (!pdfium::ContainsKey(m_StockMap, pDoc)) + m_StockMap[pDoc] = pdfium::MakeUnique(); + return m_StockMap[pDoc]->SetFont(index, std::move(pFont)); +} + +void CPDF_FontGlobals::Clear(CPDF_Document* pDoc) { + m_StockMap.erase(pDoc); +} + +CFX_WideString CPDF_ToUnicodeMap::Lookup(uint32_t charcode) const { + auto it = m_Map.find(charcode); + if (it != m_Map.end()) { + uint32_t value = it->second; + FX_WCHAR unicode = (FX_WCHAR)(value & 0xffff); + if (unicode != 0xffff) { + return unicode; + } + const FX_WCHAR* buf = m_MultiCharBuf.GetBuffer(); + uint32_t buf_len = m_MultiCharBuf.GetLength(); + if (!buf || buf_len == 0) { + return CFX_WideString(); + } + uint32_t index = value >> 16; + if (index >= buf_len) { + return CFX_WideString(); + } + uint32_t len = buf[index]; + if (index + len < index || index + len >= buf_len) { + return CFX_WideString(); + } + return CFX_WideString(buf + index + 1, len); + } + if (m_pBaseMap) { + return m_pBaseMap->UnicodeFromCID((uint16_t)charcode); + } + return CFX_WideString(); +} + +uint32_t CPDF_ToUnicodeMap::ReverseLookup(FX_WCHAR unicode) const { + for (const auto& pair : m_Map) { + if (pair.second == static_cast(unicode)) + return pair.first; + } + return 0; +} + +// Static. +uint32_t CPDF_ToUnicodeMap::StringToCode(const CFX_ByteStringC& str) { + int len = str.GetLength(); + if (len == 0) + return 0; + + uint32_t result = 0; + if (str[0] == '<') { + for (int i = 1; i < len && std::isxdigit(str[i]); ++i) + result = result * 16 + FXSYS_toHexDigit(str.CharAt(i)); + return result; + } + + for (int i = 0; i < len && std::isdigit(str[i]); ++i) + result = result * 10 + FXSYS_toDecimalDigit(str.CharAt(i)); + + return result; +} + +static CFX_WideString StringDataAdd(CFX_WideString str) { + CFX_WideString ret; + int len = str.GetLength(); + FX_WCHAR value = 1; + for (int i = len - 1; i >= 0; --i) { + FX_WCHAR ch = str[i] + value; + if (ch < str[i]) { + ret.Insert(0, 0); + } else { + ret.Insert(0, ch); + value = 0; + } + } + if (value) { + ret.Insert(0, value); + } + return ret; +} + +// Static. +CFX_WideString CPDF_ToUnicodeMap::StringToWideString( + const CFX_ByteStringC& str) { + int len = str.GetLength(); + if (len == 0) + return CFX_WideString(); + + CFX_WideString result; + if (str[0] == '<') { + int byte_pos = 0; + FX_WCHAR ch = 0; + for (int i = 1; i < len && std::isxdigit(str[i]); ++i) { + ch = ch * 16 + FXSYS_toHexDigit(str[i]); + byte_pos++; + if (byte_pos == 4) { + result += ch; + byte_pos = 0; + ch = 0; + } + } + return result; + } + return result; +} + +CPDF_ToUnicodeMap::CPDF_ToUnicodeMap() : m_pBaseMap(nullptr) {} + +CPDF_ToUnicodeMap::~CPDF_ToUnicodeMap() {} + +uint32_t CPDF_ToUnicodeMap::GetUnicode() { + FX_SAFE_UINT32 uni = m_MultiCharBuf.GetLength(); + uni = uni * 0x10000 + 0xffff; + return uni.ValueOrDefault(0); +} + +void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) { + CIDSet cid_set = CIDSET_UNKNOWN; + CPDF_StreamAcc stream; + stream.LoadAllData(pStream, false); + CPDF_SimpleParser parser(stream.GetData(), stream.GetSize()); + while (1) { + CFX_ByteStringC word = parser.GetWord(); + if (word.IsEmpty()) { + break; + } + if (word == "beginbfchar") { + while (1) { + word = parser.GetWord(); + if (word.IsEmpty() || word == "endbfchar") { + break; + } + uint32_t srccode = StringToCode(word); + word = parser.GetWord(); + CFX_WideString destcode = StringToWideString(word); + int len = destcode.GetLength(); + if (len == 0) { + continue; + } + if (len == 1) { + m_Map[srccode] = destcode.GetAt(0); + } else { + m_Map[srccode] = GetUnicode(); + m_MultiCharBuf.AppendChar(destcode.GetLength()); + m_MultiCharBuf << destcode; + } + } + } else if (word == "beginbfrange") { + while (1) { + CFX_ByteString low, high; + low = parser.GetWord(); + if (low.IsEmpty() || low == "endbfrange") { + break; + } + high = parser.GetWord(); + uint32_t lowcode = StringToCode(low.AsStringC()); + uint32_t highcode = + (lowcode & 0xffffff00) | (StringToCode(high.AsStringC()) & 0xff); + if (highcode == (uint32_t)-1) { + break; + } + CFX_ByteString start(parser.GetWord()); + if (start == "[") { + for (uint32_t code = lowcode; code <= highcode; code++) { + CFX_ByteString dest(parser.GetWord()); + CFX_WideString destcode = StringToWideString(dest.AsStringC()); + int len = destcode.GetLength(); + if (len == 0) { + continue; + } + if (len == 1) { + m_Map[code] = destcode.GetAt(0); + } else { + m_Map[code] = GetUnicode(); + m_MultiCharBuf.AppendChar(destcode.GetLength()); + m_MultiCharBuf << destcode; + } + } + parser.GetWord(); + } else { + CFX_WideString destcode = StringToWideString(start.AsStringC()); + int len = destcode.GetLength(); + uint32_t value = 0; + if (len == 1) { + value = StringToCode(start.AsStringC()); + for (uint32_t code = lowcode; code <= highcode; code++) { + m_Map[code] = value++; + } + } else { + for (uint32_t code = lowcode; code <= highcode; code++) { + CFX_WideString retcode; + if (code == lowcode) { + retcode = destcode; + } else { + retcode = StringDataAdd(destcode); + } + m_Map[code] = GetUnicode(); + m_MultiCharBuf.AppendChar(retcode.GetLength()); + m_MultiCharBuf << retcode; + destcode = retcode; + } + } + } + } + } else if (word == "/Adobe-Korea1-UCS2") { + cid_set = CIDSET_KOREA1; + } else if (word == "/Adobe-Japan1-UCS2") { + cid_set = CIDSET_JAPAN1; + } else if (word == "/Adobe-CNS1-UCS2") { + cid_set = CIDSET_CNS1; + } else if (word == "/Adobe-GB1-UCS2") { + cid_set = CIDSET_GB1; + } + } + if (cid_set) { + m_pBaseMap = CPDF_ModuleMgr::Get() + ->GetPageModule() + ->GetFontGlobals() + ->m_CMapManager.GetCID2UnicodeMap(cid_set, false); + } else { + m_pBaseMap = nullptr; + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font_cid.cpp b/modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font_cid.cpp new file mode 100644 index 000000000000..afb186d0706b --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font_cid.cpp @@ -0,0 +1,787 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/font/font_int.h" + +#include +#include + +#include "core/fpdfapi/cmaps/cmap_int.h" +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/font/ttgsubtable.h" +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_simple_parser.h" +#include "core/fxcrt/fx_ext.h" +#include "core/fxge/fx_freetype.h" +#include "third_party/base/logging.h" +#include "third_party/base/stl_util.h" + +namespace { + +const FX_CHAR* const g_CharsetNames[CIDSET_NUM_SETS] = { + nullptr, "GB1", "CNS1", "Japan1", "Korea1", "UCS"}; + +class CPDF_PredefinedCMap { + public: + const FX_CHAR* m_pName; + CIDSet m_Charset; + CIDCoding m_Coding; + CPDF_CMap::CodingScheme m_CodingScheme; + uint8_t m_LeadingSegCount; + uint8_t m_LeadingSegs[4]; +}; + +const CPDF_PredefinedCMap g_PredefinedCMaps[] = { + {"GB-EUC", + CIDSET_GB1, + CIDCODING_GB, + CPDF_CMap::MixedTwoBytes, + 1, + {0xa1, 0xfe}}, + {"GBpc-EUC", + CIDSET_GB1, + CIDCODING_GB, + CPDF_CMap::MixedTwoBytes, + 1, + {0xa1, 0xfc}}, + {"GBK-EUC", + CIDSET_GB1, + CIDCODING_GB, + CPDF_CMap::MixedTwoBytes, + 1, + {0x81, 0xfe}}, + {"GBKp-EUC", + CIDSET_GB1, + CIDCODING_GB, + CPDF_CMap::MixedTwoBytes, + 1, + {0x81, 0xfe}}, + {"GBK2K-EUC", + CIDSET_GB1, + CIDCODING_GB, + CPDF_CMap::MixedTwoBytes, + 1, + {0x81, 0xfe}}, + {"GBK2K", + CIDSET_GB1, + CIDCODING_GB, + CPDF_CMap::MixedTwoBytes, + 1, + {0x81, 0xfe}}, + {"UniGB-UCS2", CIDSET_GB1, CIDCODING_UCS2, CPDF_CMap::TwoBytes, 0, {}}, + {"UniGB-UTF16", CIDSET_GB1, CIDCODING_UTF16, CPDF_CMap::TwoBytes, 0, {}}, + {"B5pc", + CIDSET_CNS1, + CIDCODING_BIG5, + CPDF_CMap::MixedTwoBytes, + 1, + {0xa1, 0xfc}}, + {"HKscs-B5", + CIDSET_CNS1, + CIDCODING_BIG5, + CPDF_CMap::MixedTwoBytes, + 1, + {0x88, 0xfe}}, + {"ETen-B5", + CIDSET_CNS1, + CIDCODING_BIG5, + CPDF_CMap::MixedTwoBytes, + 1, + {0xa1, 0xfe}}, + {"ETenms-B5", + CIDSET_CNS1, + CIDCODING_BIG5, + CPDF_CMap::MixedTwoBytes, + 1, + {0xa1, 0xfe}}, + {"UniCNS-UCS2", CIDSET_CNS1, CIDCODING_UCS2, CPDF_CMap::TwoBytes, 0, {}}, + {"UniCNS-UTF16", CIDSET_CNS1, CIDCODING_UTF16, CPDF_CMap::TwoBytes, 0, {}}, + {"83pv-RKSJ", + CIDSET_JAPAN1, + CIDCODING_JIS, + CPDF_CMap::MixedTwoBytes, + 2, + {0x81, 0x9f, 0xe0, 0xfc}}, + {"90ms-RKSJ", + CIDSET_JAPAN1, + CIDCODING_JIS, + CPDF_CMap::MixedTwoBytes, + 2, + {0x81, 0x9f, 0xe0, 0xfc}}, + {"90msp-RKSJ", + CIDSET_JAPAN1, + CIDCODING_JIS, + CPDF_CMap::MixedTwoBytes, + 2, + {0x81, 0x9f, 0xe0, 0xfc}}, + {"90pv-RKSJ", + CIDSET_JAPAN1, + CIDCODING_JIS, + CPDF_CMap::MixedTwoBytes, + 2, + {0x81, 0x9f, 0xe0, 0xfc}}, + {"Add-RKSJ", + CIDSET_JAPAN1, + CIDCODING_JIS, + CPDF_CMap::MixedTwoBytes, + 2, + {0x81, 0x9f, 0xe0, 0xfc}}, + {"EUC", + CIDSET_JAPAN1, + CIDCODING_JIS, + CPDF_CMap::MixedTwoBytes, + 2, + {0x8e, 0x8e, 0xa1, 0xfe}}, + {"H", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e}}, + {"V", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e}}, + {"Ext-RKSJ", + CIDSET_JAPAN1, + CIDCODING_JIS, + CPDF_CMap::MixedTwoBytes, + 2, + {0x81, 0x9f, 0xe0, 0xfc}}, + {"UniJIS-UCS2", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes, 0, {}}, + {"UniJIS-UCS2-HW", + CIDSET_JAPAN1, + CIDCODING_UCS2, + CPDF_CMap::TwoBytes, + 0, + {}}, + {"UniJIS-UTF16", + CIDSET_JAPAN1, + CIDCODING_UTF16, + CPDF_CMap::TwoBytes, + 0, + {}}, + {"KSC-EUC", + CIDSET_KOREA1, + CIDCODING_KOREA, + CPDF_CMap::MixedTwoBytes, + 1, + {0xa1, 0xfe}}, + {"KSCms-UHC", + CIDSET_KOREA1, + CIDCODING_KOREA, + CPDF_CMap::MixedTwoBytes, + 1, + {0x81, 0xfe}}, + {"KSCms-UHC-HW", + CIDSET_KOREA1, + CIDCODING_KOREA, + CPDF_CMap::MixedTwoBytes, + 1, + {0x81, 0xfe}}, + {"KSCpc-EUC", + CIDSET_KOREA1, + CIDCODING_KOREA, + CPDF_CMap::MixedTwoBytes, + 1, + {0xa1, 0xfd}}, + {"UniKS-UCS2", CIDSET_KOREA1, CIDCODING_UCS2, CPDF_CMap::TwoBytes, 0, {}}, + {"UniKS-UTF16", CIDSET_KOREA1, CIDCODING_UTF16, CPDF_CMap::TwoBytes, 0, {}}, +}; + +CIDSet CIDSetFromSizeT(size_t index) { + if (index >= CIDSET_NUM_SETS) { + NOTREACHED(); + return CIDSET_UNKNOWN; + } + return static_cast(index); +} + +CFX_ByteStringC CMap_GetString(const CFX_ByteStringC& word) { + if (word.GetLength() <= 2) + return CFX_ByteStringC(); + return CFX_ByteStringC(&word[1], word.GetLength() - 2); +} + +int CompareDWORD(const void* data1, const void* data2) { + return (*(uint32_t*)data1) - (*(uint32_t*)data2); +} + +int CompareCID(const void* key, const void* element) { + if ((*(uint32_t*)key) < (*(uint32_t*)element)) { + return -1; + } + if ((*(uint32_t*)key) > + (*(uint32_t*)element) + ((uint32_t*)element)[1] / 65536) { + return 1; + } + return 0; +} + +int CheckCodeRange(uint8_t* codes, + int size, + CMap_CodeRange* pRanges, + int nRanges) { + int iSeg = nRanges - 1; + while (iSeg >= 0) { + if (pRanges[iSeg].m_CharSize < size) { + --iSeg; + continue; + } + int iChar = 0; + while (iChar < size) { + if (codes[iChar] < pRanges[iSeg].m_Lower[iChar] || + codes[iChar] > pRanges[iSeg].m_Upper[iChar]) { + break; + } + ++iChar; + } + if (iChar == pRanges[iSeg].m_CharSize) + return 2; + + if (iChar) + return (size == pRanges[iSeg].m_CharSize) ? 2 : 1; + iSeg--; + } + return 0; +} + +int GetCharSizeImpl(uint32_t charcode, + CMap_CodeRange* pRanges, + int iRangesSize) { + if (!iRangesSize) + return 1; + + uint8_t codes[4]; + codes[0] = codes[1] = 0x00; + codes[2] = (uint8_t)(charcode >> 8 & 0xFF); + codes[3] = (uint8_t)charcode; + int offset = 0; + int size = 4; + for (int i = 0; i < 4; ++i) { + int iSeg = iRangesSize - 1; + while (iSeg >= 0) { + if (pRanges[iSeg].m_CharSize < size) { + --iSeg; + continue; + } + int iChar = 0; + while (iChar < size) { + if (codes[offset + iChar] < pRanges[iSeg].m_Lower[iChar] || + codes[offset + iChar] > pRanges[iSeg].m_Upper[iChar]) { + break; + } + ++iChar; + } + if (iChar == pRanges[iSeg].m_CharSize) + return size; + --iSeg; + } + --size; + ++offset; + } + return 1; +} + +} // namespace + +CPDF_CMapManager::CPDF_CMapManager() {} + +CPDF_CMapManager::~CPDF_CMapManager() {} + +CFX_MaybeOwned CPDF_CMapManager::GetPredefinedCMap( + const CFX_ByteString& name, + bool bPromptCJK) { + auto it = m_CMaps.find(name); + if (it != m_CMaps.end()) + return CFX_MaybeOwned(it->second.get()); // Unowned. + + std::unique_ptr pCMap = LoadPredefinedCMap(name, bPromptCJK); + if (name.IsEmpty()) + return CFX_MaybeOwned(std::move(pCMap)); // Owned. + + CPDF_CMap* pUnowned = pCMap.get(); + m_CMaps[name] = std::move(pCMap); + return CFX_MaybeOwned(pUnowned); // Unowned. +} + +std::unique_ptr CPDF_CMapManager::LoadPredefinedCMap( + const CFX_ByteString& name, + bool bPromptCJK) { + auto pCMap = pdfium::MakeUnique(); + const FX_CHAR* pname = name.c_str(); + if (*pname == '/') + pname++; + + pCMap->LoadPredefined(this, pname, bPromptCJK); + return pCMap; +} + +CPDF_CID2UnicodeMap* CPDF_CMapManager::GetCID2UnicodeMap(CIDSet charset, + bool bPromptCJK) { + if (!m_CID2UnicodeMaps[charset]) + m_CID2UnicodeMaps[charset] = LoadCID2UnicodeMap(charset, bPromptCJK); + + return m_CID2UnicodeMaps[charset].get(); +} + +std::unique_ptr CPDF_CMapManager::LoadCID2UnicodeMap( + CIDSet charset, + bool bPromptCJK) { + auto pMap = pdfium::MakeUnique(); + pMap->Load(this, charset, bPromptCJK); + return pMap; +} + +CPDF_CMapParser::CPDF_CMapParser() + : m_pCMap(nullptr), m_Status(0), m_CodeSeq(0) {} + +CPDF_CMapParser::~CPDF_CMapParser() {} + +void CPDF_CMapParser::Initialize(CPDF_CMap* pCMap) { + m_pCMap = pCMap; + m_Status = 0; + m_CodeSeq = 0; + m_AddMaps.EstimateSize(0, 10240); +} + +void CPDF_CMapParser::ParseWord(const CFX_ByteStringC& word) { + if (word.IsEmpty()) { + return; + } + if (word == "begincidchar") { + m_Status = 1; + m_CodeSeq = 0; + } else if (word == "begincidrange") { + m_Status = 2; + m_CodeSeq = 0; + } else if (word == "endcidrange" || word == "endcidchar") { + m_Status = 0; + } else if (word == "/WMode") { + m_Status = 6; + } else if (word == "/Registry") { + m_Status = 3; + } else if (word == "/Ordering") { + m_Status = 4; + } else if (word == "/Supplement") { + m_Status = 5; + } else if (word == "begincodespacerange") { + m_Status = 7; + m_CodeSeq = 0; + } else if (word == "usecmap") { + } else if (m_Status == 1 || m_Status == 2) { + m_CodePoints[m_CodeSeq] = CMap_GetCode(word); + m_CodeSeq++; + uint32_t StartCode, EndCode; + uint16_t StartCID; + if (m_Status == 1) { + if (m_CodeSeq < 2) { + return; + } + EndCode = StartCode = m_CodePoints[0]; + StartCID = (uint16_t)m_CodePoints[1]; + } else { + if (m_CodeSeq < 3) { + return; + } + StartCode = m_CodePoints[0]; + EndCode = m_CodePoints[1]; + StartCID = (uint16_t)m_CodePoints[2]; + } + if (EndCode < 0x10000) { + for (uint32_t code = StartCode; code <= EndCode; code++) { + m_pCMap->m_pMapping[code] = (uint16_t)(StartCID + code - StartCode); + } + } else { + uint32_t buf[2]; + buf[0] = StartCode; + buf[1] = ((EndCode - StartCode) << 16) + StartCID; + m_AddMaps.AppendBlock(buf, sizeof buf); + } + m_CodeSeq = 0; + } else if (m_Status == 3) { + m_Status = 0; + } else if (m_Status == 4) { + m_pCMap->m_Charset = CharsetFromOrdering(CMap_GetString(word)); + m_Status = 0; + } else if (m_Status == 5) { + m_Status = 0; + } else if (m_Status == 6) { + m_pCMap->m_bVertical = CMap_GetCode(word) != 0; + m_Status = 0; + } else if (m_Status == 7) { + if (word == "endcodespacerange") { + uint32_t nSegs = pdfium::CollectionSize(m_CodeRanges); + if (nSegs > 1) { + m_pCMap->m_CodingScheme = CPDF_CMap::MixedFourBytes; + m_pCMap->m_nCodeRanges = nSegs; + FX_Free(m_pCMap->m_pLeadingBytes); + m_pCMap->m_pLeadingBytes = + FX_Alloc2D(uint8_t, nSegs, sizeof(CMap_CodeRange)); + FXSYS_memcpy(m_pCMap->m_pLeadingBytes, m_CodeRanges.data(), + nSegs * sizeof(CMap_CodeRange)); + } else if (nSegs == 1) { + m_pCMap->m_CodingScheme = (m_CodeRanges[0].m_CharSize == 2) + ? CPDF_CMap::TwoBytes + : CPDF_CMap::OneByte; + } + m_Status = 0; + } else { + if (word.GetLength() == 0 || word.GetAt(0) != '<') { + return; + } + if (m_CodeSeq % 2) { + CMap_CodeRange range; + if (CMap_GetCodeRange(range, m_LastWord.AsStringC(), word)) + m_CodeRanges.push_back(range); + } + m_CodeSeq++; + } + } + m_LastWord = word; +} + +// Static. +uint32_t CPDF_CMapParser::CMap_GetCode(const CFX_ByteStringC& word) { + pdfium::base::CheckedNumeric num = 0; + if (word.GetAt(0) == '<') { + for (int i = 1; i < word.GetLength() && std::isxdigit(word.GetAt(i)); ++i) { + num = num * 16 + FXSYS_toHexDigit(word.GetAt(i)); + if (!num.IsValid()) + return 0; + } + return num.ValueOrDie(); + } + + for (int i = 0; i < word.GetLength() && std::isdigit(word.GetAt(i)); ++i) { + num = num * 10 + FXSYS_toDecimalDigit(static_cast(word.GetAt(i))); + if (!num.IsValid()) + return 0; + } + return num.ValueOrDie(); +} + +// Static. +bool CPDF_CMapParser::CMap_GetCodeRange(CMap_CodeRange& range, + const CFX_ByteStringC& first, + const CFX_ByteStringC& second) { + if (first.GetLength() == 0 || first.GetAt(0) != '<') + return false; + + int i; + for (i = 1; i < first.GetLength(); ++i) { + if (first.GetAt(i) == '>') { + break; + } + } + range.m_CharSize = (i - 1) / 2; + if (range.m_CharSize > 4) + return false; + + for (i = 0; i < range.m_CharSize; ++i) { + uint8_t digit1 = first.GetAt(i * 2 + 1); + uint8_t digit2 = first.GetAt(i * 2 + 2); + range.m_Lower[i] = FXSYS_toHexDigit(digit1) * 16 + FXSYS_toHexDigit(digit2); + } + + uint32_t size = second.GetLength(); + for (i = 0; i < range.m_CharSize; ++i) { + uint8_t digit1 = ((uint32_t)i * 2 + 1 < size) + ? second.GetAt((FX_STRSIZE)i * 2 + 1) + : '0'; + uint8_t digit2 = ((uint32_t)i * 2 + 2 < size) + ? second.GetAt((FX_STRSIZE)i * 2 + 2) + : '0'; + range.m_Upper[i] = FXSYS_toHexDigit(digit1) * 16 + FXSYS_toHexDigit(digit2); + } + return true; +} + +CPDF_CMap::CPDF_CMap() { + m_Charset = CIDSET_UNKNOWN; + m_Coding = CIDCODING_UNKNOWN; + m_CodingScheme = TwoBytes; + m_bVertical = false; + m_bLoaded = false; + m_pMapping = nullptr; + m_pLeadingBytes = nullptr; + m_pAddMapping = nullptr; + m_pEmbedMap = nullptr; + m_nCodeRanges = 0; +} +CPDF_CMap::~CPDF_CMap() { + FX_Free(m_pMapping); + FX_Free(m_pAddMapping); + FX_Free(m_pLeadingBytes); +} + +bool CPDF_CMap::IsLoaded() const { + return m_bLoaded; +} + +bool CPDF_CMap::IsVertWriting() const { + return m_bVertical; +} + +void CPDF_CMap::LoadPredefined(CPDF_CMapManager* pMgr, + const CFX_ByteString& bsName, + bool bPromptCJK) { + m_PredefinedCMap = bsName; + if (m_PredefinedCMap == "Identity-H" || m_PredefinedCMap == "Identity-V") { + m_Coding = CIDCODING_CID; + m_bVertical = bsName[9] == 'V'; + m_bLoaded = true; + return; + } + CFX_ByteString cmapid = m_PredefinedCMap; + m_bVertical = cmapid.Right(1) == "V"; + if (cmapid.GetLength() > 2) { + cmapid = cmapid.Left(cmapid.GetLength() - 2); + } + const CPDF_PredefinedCMap* map = nullptr; + for (size_t i = 0; i < FX_ArraySize(g_PredefinedCMaps); ++i) { + if (cmapid == CFX_ByteStringC(g_PredefinedCMaps[i].m_pName)) { + map = &g_PredefinedCMaps[i]; + break; + } + } + if (!map) + return; + + m_Charset = map->m_Charset; + m_Coding = map->m_Coding; + m_CodingScheme = map->m_CodingScheme; + if (m_CodingScheme == MixedTwoBytes) { + m_pLeadingBytes = FX_Alloc(uint8_t, 256); + for (uint32_t i = 0; i < map->m_LeadingSegCount; ++i) { + const uint8_t* segs = map->m_LeadingSegs; + for (int b = segs[i * 2]; b <= segs[i * 2 + 1]; ++b) { + m_pLeadingBytes[b] = 1; + } + } + } + FPDFAPI_FindEmbeddedCMap(bsName, m_Charset, m_Coding, m_pEmbedMap); + if (!m_pEmbedMap) + return; + + m_bLoaded = true; +} + +void CPDF_CMap::LoadEmbedded(const uint8_t* pData, uint32_t size) { + m_pMapping = FX_Alloc(uint16_t, 65536); + CPDF_CMapParser parser; + parser.Initialize(this); + CPDF_SimpleParser syntax(pData, size); + while (1) { + CFX_ByteStringC word = syntax.GetWord(); + if (word.IsEmpty()) { + break; + } + parser.ParseWord(word); + } + if (m_CodingScheme == MixedFourBytes && parser.m_AddMaps.GetSize()) { + m_pAddMapping = FX_Alloc(uint8_t, parser.m_AddMaps.GetSize() + 4); + *(uint32_t*)m_pAddMapping = parser.m_AddMaps.GetSize() / 8; + FXSYS_memcpy(m_pAddMapping + 4, parser.m_AddMaps.GetBuffer(), + parser.m_AddMaps.GetSize()); + FXSYS_qsort(m_pAddMapping + 4, parser.m_AddMaps.GetSize() / 8, 8, + CompareDWORD); + } +} + +uint16_t CPDF_CMap::CIDFromCharCode(uint32_t charcode) const { + if (m_Coding == CIDCODING_CID) { + return (uint16_t)charcode; + } + if (m_pEmbedMap) { + return FPDFAPI_CIDFromCharCode(m_pEmbedMap, charcode); + } + if (!m_pMapping) { + return (uint16_t)charcode; + } + if (charcode >> 16) { + if (m_pAddMapping) { + void* found = FXSYS_bsearch(&charcode, m_pAddMapping + 4, + *(uint32_t*)m_pAddMapping, 8, CompareCID); + if (!found) + return 0; + return (uint16_t)(((uint32_t*)found)[1] % 65536 + charcode - + *(uint32_t*)found); + } + return 0; + } + return m_pMapping[charcode]; +} + +uint32_t CPDF_CMap::GetNextChar(const FX_CHAR* pString, + int nStrLen, + int& offset) const { + switch (m_CodingScheme) { + case OneByte: + return ((uint8_t*)pString)[offset++]; + case TwoBytes: + offset += 2; + return ((uint8_t*)pString)[offset - 2] * 256 + + ((uint8_t*)pString)[offset - 1]; + case MixedTwoBytes: { + uint8_t byte1 = ((uint8_t*)pString)[offset++]; + if (!m_pLeadingBytes[byte1]) { + return byte1; + } + uint8_t byte2 = ((uint8_t*)pString)[offset++]; + return byte1 * 256 + byte2; + } + case MixedFourBytes: { + uint8_t codes[4]; + int char_size = 1; + codes[0] = ((uint8_t*)pString)[offset++]; + CMap_CodeRange* pRanges = (CMap_CodeRange*)m_pLeadingBytes; + while (1) { + int ret = CheckCodeRange(codes, char_size, pRanges, m_nCodeRanges); + if (ret == 0) { + return 0; + } + if (ret == 2) { + uint32_t charcode = 0; + for (int i = 0; i < char_size; i++) { + charcode = (charcode << 8) + codes[i]; + } + return charcode; + } + if (char_size == 4 || offset == nStrLen) { + return 0; + } + codes[char_size++] = ((uint8_t*)pString)[offset++]; + } + break; + } + } + return 0; +} +int CPDF_CMap::GetCharSize(uint32_t charcode) const { + switch (m_CodingScheme) { + case OneByte: + return 1; + case TwoBytes: + return 2; + case MixedTwoBytes: + case MixedFourBytes: + if (charcode < 0x100) { + return 1; + } + if (charcode < 0x10000) { + return 2; + } + if (charcode < 0x1000000) { + return 3; + } + return 4; + } + return 1; +} +int CPDF_CMap::CountChar(const FX_CHAR* pString, int size) const { + switch (m_CodingScheme) { + case OneByte: + return size; + case TwoBytes: + return (size + 1) / 2; + case MixedTwoBytes: { + int count = 0; + for (int i = 0; i < size; i++) { + count++; + if (m_pLeadingBytes[((uint8_t*)pString)[i]]) { + i++; + } + } + return count; + } + case MixedFourBytes: { + int count = 0, offset = 0; + while (offset < size) { + GetNextChar(pString, size, offset); + count++; + } + return count; + } + } + return size; +} + +int CPDF_CMap::AppendChar(FX_CHAR* str, uint32_t charcode) const { + switch (m_CodingScheme) { + case OneByte: + str[0] = (uint8_t)charcode; + return 1; + case TwoBytes: + str[0] = (uint8_t)(charcode / 256); + str[1] = (uint8_t)(charcode % 256); + return 2; + case MixedTwoBytes: + case MixedFourBytes: + if (charcode < 0x100) { + CMap_CodeRange* pRanges = (CMap_CodeRange*)m_pLeadingBytes; + int iSize = GetCharSizeImpl(charcode, pRanges, m_nCodeRanges); + if (iSize == 0) { + iSize = 1; + } + if (iSize > 1) { + FXSYS_memset(str, 0, sizeof(uint8_t) * iSize); + } + str[iSize - 1] = (uint8_t)charcode; + return iSize; + } + if (charcode < 0x10000) { + str[0] = (uint8_t)(charcode >> 8); + str[1] = (uint8_t)charcode; + return 2; + } + if (charcode < 0x1000000) { + str[0] = (uint8_t)(charcode >> 16); + str[1] = (uint8_t)(charcode >> 8); + str[2] = (uint8_t)charcode; + return 3; + } + str[0] = (uint8_t)(charcode >> 24); + str[1] = (uint8_t)(charcode >> 16); + str[2] = (uint8_t)(charcode >> 8); + str[3] = (uint8_t)charcode; + return 4; + } + return 0; +} + +CPDF_CID2UnicodeMap::CPDF_CID2UnicodeMap() { + m_EmbeddedCount = 0; +} + +CPDF_CID2UnicodeMap::~CPDF_CID2UnicodeMap() {} + +bool CPDF_CID2UnicodeMap::IsLoaded() { + return m_EmbeddedCount != 0; +} + +FX_WCHAR CPDF_CID2UnicodeMap::UnicodeFromCID(uint16_t CID) { + if (m_Charset == CIDSET_UNICODE) { + return CID; + } + if (CID < m_EmbeddedCount) { + return m_pEmbeddedMap[CID]; + } + return 0; +} + +void CPDF_CID2UnicodeMap::Load(CPDF_CMapManager* pMgr, + CIDSet charset, + bool bPromptCJK) { + m_Charset = charset; + + CPDF_FontGlobals* pFontGlobals = + CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); + m_pEmbeddedMap = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap; + m_EmbeddedCount = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count; +} + +CIDSet CharsetFromOrdering(const CFX_ByteStringC& ordering) { + for (size_t charset = 1; charset < FX_ArraySize(g_CharsetNames); ++charset) { + if (ordering == g_CharsetNames[charset]) + return CIDSetFromSizeT(charset); + } + return CIDSET_UNKNOWN; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font_cid_unittest.cpp b/modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font_cid_unittest.cpp new file mode 100644 index 000000000000..53f5e47f925d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font_cid_unittest.cpp @@ -0,0 +1,70 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/font/font_int.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +bool uint_ranges_equal(uint8_t* a, uint8_t* b, size_t count) { + for (size_t i = 0; i < count; ++i) { + if (a[i] != b[i]) + return false; + } + return true; +} + +} // namespace + +TEST(fpdf_font_cid, CMap_GetCode) { + EXPECT_EQ(0u, CPDF_CMapParser::CMap_GetCode("")); + EXPECT_EQ(0u, CPDF_CMapParser::CMap_GetCode("<")); + EXPECT_EQ(194u, CPDF_CMapParser::CMap_GetCode("", "")); + EXPECT_EQ(5, range.m_CharSize); + + EXPECT_TRUE( + CPDF_CMapParser::CMap_GetCodeRange(range, "<12345678>", "<87654321>")); + EXPECT_EQ(4, range.m_CharSize); + { + uint8_t lower[4] = {18, 52, 86, 120}; + uint8_t upper[4] = {135, 101, 67, 33}; + EXPECT_TRUE(uint_ranges_equal(lower, range.m_Lower, range.m_CharSize)); + EXPECT_TRUE(uint_ranges_equal(upper, range.m_Upper, range.m_CharSize)); + } + + // Hex characters + EXPECT_TRUE(CPDF_CMapParser::CMap_GetCodeRange(range, "", "")); + EXPECT_EQ(1, range.m_CharSize); + EXPECT_EQ(161, range.m_Lower[0]); + EXPECT_EQ(243, range.m_Upper[0]); + + // The second string should return 0's if it is shorter + EXPECT_TRUE(CPDF_CMapParser::CMap_GetCodeRange(range, "", "")); + EXPECT_EQ(1, range.m_CharSize); + EXPECT_EQ(161, range.m_Lower[0]); + EXPECT_EQ(0, range.m_Upper[0]); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font_unittest.cpp b/modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font_unittest.cpp new file mode 100644 index 000000000000..977ae8a3bb03 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/fpdf_font_unittest.cpp @@ -0,0 +1,30 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/font/font_int.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(fpdf_font, StringToCode) { + EXPECT_EQ(0u, CPDF_ToUnicodeMap::StringToCode("")); + EXPECT_EQ(194u, CPDF_ToUnicodeMap::StringToCode(" buf[count - 1].key) { + m_Buffer.AppendBlock(&pair, sizeof(_IntPair)); + return; + } + int low = 0, high = count - 1; + while (low <= high) { + int mid = (low + high) / 2; + if (buf[mid].key < key) { + low = mid + 1; + } else if (buf[mid].key > key) { + high = mid - 1; + } else { + buf[mid].value = value; + return; + } + } + m_Buffer.InsertBlock(low * sizeof(_IntPair), &pair, sizeof(_IntPair)); +} + +bool CFX_GlyphMap::Lookup(int key, int& value) { + void* pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(), + m_Buffer.GetSize() / sizeof(_IntPair), + sizeof(_IntPair), _CompareInt); + if (!pResult) { + return false; + } + value = ((uint32_t*)pResult)[1]; + return true; +} + +CFX_CTTGSUBTable::CFX_CTTGSUBTable() + : m_bFeautureMapLoad(false), loaded(false) {} + +CFX_CTTGSUBTable::CFX_CTTGSUBTable(FT_Bytes gsub) + : m_bFeautureMapLoad(false), loaded(false) { + LoadGSUBTable(gsub); +} + +CFX_CTTGSUBTable::~CFX_CTTGSUBTable() {} + +bool CFX_CTTGSUBTable::IsOk() const { + return loaded; +} + +bool CFX_CTTGSUBTable::LoadGSUBTable(FT_Bytes gsub) { + header.Version = gsub[0] << 24 | gsub[1] << 16 | gsub[2] << 8 | gsub[3]; + if (header.Version != 0x00010000) { + return false; + } + header.ScriptList = gsub[4] << 8 | gsub[5]; + header.FeatureList = gsub[6] << 8 | gsub[7]; + header.LookupList = gsub[8] << 8 | gsub[9]; + return Parse(&gsub[header.ScriptList], &gsub[header.FeatureList], + &gsub[header.LookupList]); +} + +bool CFX_CTTGSUBTable::GetVerticalGlyph(uint32_t glyphnum, + uint32_t* vglyphnum) { + uint32_t tag[] = { + (uint8_t)'v' << 24 | (uint8_t)'r' << 16 | (uint8_t)'t' << 8 | + (uint8_t)'2', + (uint8_t)'v' << 24 | (uint8_t)'e' << 16 | (uint8_t)'r' << 8 | + (uint8_t)'t', + }; + if (!m_bFeautureMapLoad) { + for (const auto& script : ScriptList.ScriptRecords) { + for (const auto& record : script.Script.LangSysRecords) { + for (const auto& index : record.LangSys.FeatureIndices) { + if (FeatureList.FeatureRecords[index].FeatureTag == tag[0] || + FeatureList.FeatureRecords[index].FeatureTag == tag[1]) { + m_featureSet.insert(index); + } + } + } + } + if (m_featureSet.empty()) { + int i = 0; + for (const auto& feature : FeatureList.FeatureRecords) { + if (feature.FeatureTag == tag[0] || feature.FeatureTag == tag[1]) + m_featureSet.insert(i); + ++i; + } + } + m_bFeautureMapLoad = true; + } + for (const auto& item : m_featureSet) { + if (GetVerticalGlyphSub(glyphnum, vglyphnum, + &FeatureList.FeatureRecords[item].Feature)) { + return true; + } + } + return false; +} + +bool CFX_CTTGSUBTable::GetVerticalGlyphSub(uint32_t glyphnum, + uint32_t* vglyphnum, + TFeature* Feature) { + for (int index : Feature->LookupListIndices) { + if (index < 0 || index >= pdfium::CollectionSize(LookupList.Lookups)) + continue; + + if (LookupList.Lookups[index].LookupType == 1 && + GetVerticalGlyphSub2(glyphnum, vglyphnum, &LookupList.Lookups[index])) { + return true; + } + } + return false; +} + +bool CFX_CTTGSUBTable::GetVerticalGlyphSub2(uint32_t glyphnum, + uint32_t* vglyphnum, + TLookup* Lookup) { + for (const auto& subTable : Lookup->SubTables) { + switch (subTable->SubstFormat) { + case 1: { + auto tbl1 = static_cast(subTable.get()); + if (GetCoverageIndex(tbl1->Coverage.get(), glyphnum) >= 0) { + *vglyphnum = glyphnum + tbl1->DeltaGlyphID; + return true; + } + break; + } + case 2: { + auto tbl2 = static_cast(subTable.get()); + int index = GetCoverageIndex(tbl2->Coverage.get(), glyphnum); + if (index >= 0 && + index < pdfium::CollectionSize(tbl2->Substitutes)) { + *vglyphnum = tbl2->Substitutes[index]; + return true; + } + break; + } + } + } + return false; +} + +int CFX_CTTGSUBTable::GetCoverageIndex(TCoverageFormatBase* Coverage, + uint32_t g) const { + if (!Coverage) + return -1; + + switch (Coverage->CoverageFormat) { + case 1: { + int i = 0; + TCoverageFormat1* c1 = (TCoverageFormat1*)Coverage; + for (const auto& glyph : c1->GlyphArray) { + if (static_cast(glyph) == g) + return i; + ++i; + } + return -1; + } + case 2: { + TCoverageFormat2* c2 = (TCoverageFormat2*)Coverage; + for (const auto& rangeRec : c2->RangeRecords) { + uint32_t s = rangeRec.Start; + uint32_t e = rangeRec.End; + uint32_t si = rangeRec.StartCoverageIndex; + if (s <= g && g <= e) + return si + g - s; + } + return -1; + } + } + return -1; +} + +uint8_t CFX_CTTGSUBTable::GetUInt8(FT_Bytes& p) const { + uint8_t ret = p[0]; + p += 1; + return ret; +} + +int16_t CFX_CTTGSUBTable::GetInt16(FT_Bytes& p) const { + uint16_t ret = p[0] << 8 | p[1]; + p += 2; + return *(int16_t*)&ret; +} + +uint16_t CFX_CTTGSUBTable::GetUInt16(FT_Bytes& p) const { + uint16_t ret = p[0] << 8 | p[1]; + p += 2; + return ret; +} + +int32_t CFX_CTTGSUBTable::GetInt32(FT_Bytes& p) const { + uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; + p += 4; + return *(int32_t*)&ret; +} + +uint32_t CFX_CTTGSUBTable::GetUInt32(FT_Bytes& p) const { + uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; + p += 4; + return ret; +} + +bool CFX_CTTGSUBTable::Parse(FT_Bytes scriptlist, + FT_Bytes featurelist, + FT_Bytes lookuplist) { + ParseScriptList(scriptlist, &ScriptList); + ParseFeatureList(featurelist, &FeatureList); + ParseLookupList(lookuplist, &LookupList); + return true; +} + +void CFX_CTTGSUBTable::ParseScriptList(FT_Bytes raw, TScriptList* rec) { + FT_Bytes sp = raw; + rec->ScriptRecords = std::vector(GetUInt16(sp)); + for (auto& scriptRec : rec->ScriptRecords) { + scriptRec.ScriptTag = GetUInt32(sp); + ParseScript(&raw[GetUInt16(sp)], &scriptRec.Script); + } +} + +void CFX_CTTGSUBTable::ParseScript(FT_Bytes raw, TScript* rec) { + FT_Bytes sp = raw; + rec->DefaultLangSys = GetUInt16(sp); + rec->LangSysRecords = std::vector(GetUInt16(sp)); + for (auto& sysRecord : rec->LangSysRecords) { + sysRecord.LangSysTag = GetUInt32(sp); + ParseLangSys(&raw[GetUInt16(sp)], &sysRecord.LangSys); + } +} + +void CFX_CTTGSUBTable::ParseLangSys(FT_Bytes raw, TLangSys* rec) { + FT_Bytes sp = raw; + rec->LookupOrder = GetUInt16(sp); + rec->ReqFeatureIndex = GetUInt16(sp); + rec->FeatureIndices = std::vector(GetUInt16(sp)); + for (auto& element : rec->FeatureIndices) + element = GetUInt16(sp); +} + +void CFX_CTTGSUBTable::ParseFeatureList(FT_Bytes raw, TFeatureList* rec) { + FT_Bytes sp = raw; + rec->FeatureRecords = std::vector(GetUInt16(sp)); + for (auto& featureRec : rec->FeatureRecords) { + featureRec.FeatureTag = GetUInt32(sp); + ParseFeature(&raw[GetUInt16(sp)], &featureRec.Feature); + } +} + +void CFX_CTTGSUBTable::ParseFeature(FT_Bytes raw, TFeature* rec) { + FT_Bytes sp = raw; + rec->FeatureParams = GetUInt16(sp); + rec->LookupListIndices = std::vector(GetUInt16(sp)); + for (auto& listIndex : rec->LookupListIndices) + listIndex = GetUInt16(sp); +} + +void CFX_CTTGSUBTable::ParseLookupList(FT_Bytes raw, TLookupList* rec) { + FT_Bytes sp = raw; + rec->Lookups = std::vector(GetUInt16(sp)); + for (auto& lookup : rec->Lookups) + ParseLookup(&raw[GetUInt16(sp)], &lookup); +} + +void CFX_CTTGSUBTable::ParseLookup(FT_Bytes raw, TLookup* rec) { + FT_Bytes sp = raw; + rec->LookupType = GetUInt16(sp); + rec->LookupFlag = GetUInt16(sp); + rec->SubTables = std::vector>(GetUInt16(sp)); + if (rec->LookupType != 1) + return; + + for (auto& subTable : rec->SubTables) + ParseSingleSubst(&raw[GetUInt16(sp)], &subTable); +} + +CFX_CTTGSUBTable::TCoverageFormatBase* CFX_CTTGSUBTable::ParseCoverage( + FT_Bytes raw) { + FT_Bytes sp = raw; + uint16_t format = GetUInt16(sp); + TCoverageFormatBase* rec = nullptr; + if (format == 1) { + rec = new TCoverageFormat1(); + ParseCoverageFormat1(raw, static_cast(rec)); + } else if (format == 2) { + rec = new TCoverageFormat2(); + ParseCoverageFormat2(raw, static_cast(rec)); + } + return rec; +} + +void CFX_CTTGSUBTable::ParseCoverageFormat1(FT_Bytes raw, + TCoverageFormat1* rec) { + FT_Bytes sp = raw; + (void)GetUInt16(sp); + rec->GlyphArray = std::vector(GetUInt16(sp)); + for (auto& glyph : rec->GlyphArray) + glyph = GetUInt16(sp); +} + +void CFX_CTTGSUBTable::ParseCoverageFormat2(FT_Bytes raw, + TCoverageFormat2* rec) { + FT_Bytes sp = raw; + (void)GetUInt16(sp); + rec->RangeRecords = std::vector(GetUInt16(sp)); + for (auto& rangeRec : rec->RangeRecords) { + rangeRec.Start = GetUInt16(sp); + rangeRec.End = GetUInt16(sp); + rangeRec.StartCoverageIndex = GetUInt16(sp); + } +} + +void CFX_CTTGSUBTable::ParseSingleSubst(FT_Bytes raw, + std::unique_ptr* rec) { + FT_Bytes sp = raw; + uint16_t Format = GetUInt16(sp); + switch (Format) { + case 1: + *rec = pdfium::MakeUnique(); + ParseSingleSubstFormat1(raw, + static_cast(rec->get())); + break; + case 2: + *rec = pdfium::MakeUnique(); + ParseSingleSubstFormat2(raw, + static_cast(rec->get())); + break; + } +} + +void CFX_CTTGSUBTable::ParseSingleSubstFormat1(FT_Bytes raw, + TSingleSubstFormat1* rec) { + FT_Bytes sp = raw; + GetUInt16(sp); + uint16_t offset = GetUInt16(sp); + rec->Coverage.reset(ParseCoverage(&raw[offset])); + rec->DeltaGlyphID = GetInt16(sp); +} + +void CFX_CTTGSUBTable::ParseSingleSubstFormat2(FT_Bytes raw, + TSingleSubstFormat2* rec) { + FT_Bytes sp = raw; + (void)GetUInt16(sp); + uint16_t offset = GetUInt16(sp); + rec->Coverage.reset(ParseCoverage(&raw[offset])); + rec->Substitutes = std::vector(GetUInt16(sp)); + for (auto& substitute : rec->Substitutes) + substitute = GetUInt16(sp); +} + +CFX_CTTGSUBTable::TCoverageFormat1::TCoverageFormat1() + : TCoverageFormatBase(1) {} + +CFX_CTTGSUBTable::TCoverageFormat1::~TCoverageFormat1() {} + +CFX_CTTGSUBTable::TRangeRecord::TRangeRecord() + : Start(0), End(0), StartCoverageIndex(0) {} + +CFX_CTTGSUBTable::TCoverageFormat2::TCoverageFormat2() + : TCoverageFormatBase(2) {} + +CFX_CTTGSUBTable::TCoverageFormat2::~TCoverageFormat2() {} + +CFX_CTTGSUBTable::TSingleSubstFormat1::TSingleSubstFormat1() + : TSubTableBase(1), DeltaGlyphID(0) {} + +CFX_CTTGSUBTable::TSingleSubstFormat1::~TSingleSubstFormat1() {} + +CFX_CTTGSUBTable::TSingleSubstFormat2::TSingleSubstFormat2() + : TSubTableBase(2) {} + +CFX_CTTGSUBTable::TSingleSubstFormat2::~TSingleSubstFormat2() {} + +CFX_CTTGSUBTable::TLookup::TLookup() : LookupType(0), LookupFlag(0) {} + +CFX_CTTGSUBTable::TLookup::~TLookup() {} + +CFX_CTTGSUBTable::TScript::TScript() : DefaultLangSys(0) {} + +CFX_CTTGSUBTable::TScript::~TScript() {} + +CFX_CTTGSUBTable::TScriptList::TScriptList() {} + +CFX_CTTGSUBTable::TScriptList::~TScriptList() {} + +CFX_CTTGSUBTable::TFeature::TFeature() : FeatureParams(0) {} + +CFX_CTTGSUBTable::TFeature::~TFeature() {} + +CFX_CTTGSUBTable::TFeatureList::TFeatureList() {} + +CFX_CTTGSUBTable::TFeatureList::~TFeatureList() {} + +CFX_CTTGSUBTable::TLookupList::TLookupList() {} + +CFX_CTTGSUBTable::TLookupList::~TLookupList() {} + +CFX_CTTGSUBTable::TLangSys::TLangSys() : LookupOrder(0), ReqFeatureIndex(0) {} + +CFX_CTTGSUBTable::TLangSys::~TLangSys() {} diff --git a/modules/pdfium/pdfium/core/fpdfapi/font/ttgsubtable.h b/modules/pdfium/pdfium/core/fpdfapi/font/ttgsubtable.h new file mode 100644 index 000000000000..f92726954078 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/font/ttgsubtable.h @@ -0,0 +1,311 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_FONT_TTGSUBTABLE_H_ +#define CORE_FPDFAPI_FONT_TTGSUBTABLE_H_ + +#include + +#include +#include +#include + +#include "core/fxcrt/fx_basic.h" +#include "core/fxge/fx_font.h" +#include "core/fxge/fx_freetype.h" + +class CFX_GlyphMap { + public: + CFX_GlyphMap(); + ~CFX_GlyphMap(); + + void SetAt(int key, int value); + bool Lookup(int key, int& value); + + protected: + CFX_BinaryBuf m_Buffer; +}; + +class CFX_CTTGSUBTable { + public: + CFX_CTTGSUBTable(); + explicit CFX_CTTGSUBTable(FT_Bytes gsub); + virtual ~CFX_CTTGSUBTable(); + + bool IsOk() const; + bool LoadGSUBTable(FT_Bytes gsub); + bool GetVerticalGlyph(uint32_t glyphnum, uint32_t* vglyphnum); + + private: + struct tt_gsub_header { + uint32_t Version; + uint16_t ScriptList; + uint16_t FeatureList; + uint16_t LookupList; + }; + + struct TLangSys { + TLangSys(); + ~TLangSys(); + + uint16_t LookupOrder; + uint16_t ReqFeatureIndex; + std::vector FeatureIndices; + + private: + TLangSys(const TLangSys&) = delete; + TLangSys& operator=(const TLangSys&) = delete; + }; + + struct TLangSysRecord { + TLangSysRecord() : LangSysTag(0) {} + + uint32_t LangSysTag; + TLangSys LangSys; + + private: + TLangSysRecord(const TLangSysRecord&) = delete; + TLangSysRecord& operator=(const TLangSysRecord&) = delete; + }; + + struct TScript { + TScript(); + ~TScript(); + + uint16_t DefaultLangSys; + std::vector LangSysRecords; + + private: + TScript(const TScript&) = delete; + TScript& operator=(const TScript&) = delete; + }; + + struct TScriptRecord { + TScriptRecord() : ScriptTag(0) {} + + uint32_t ScriptTag; + TScript Script; + + private: + TScriptRecord(const TScriptRecord&) = delete; + TScriptRecord& operator=(const TScriptRecord&) = delete; + }; + + struct TScriptList { + TScriptList(); + ~TScriptList(); + + std::vector ScriptRecords; + + private: + TScriptList(const TScriptList&) = delete; + TScriptList& operator=(const TScriptList&) = delete; + }; + + struct TFeature { + TFeature(); + ~TFeature(); + + uint16_t FeatureParams; + std::vector LookupListIndices; + + private: + TFeature(const TFeature&) = delete; + TFeature& operator=(const TFeature&) = delete; + }; + + struct TFeatureRecord { + TFeatureRecord() : FeatureTag(0) {} + + uint32_t FeatureTag; + TFeature Feature; + + private: + TFeatureRecord(const TFeatureRecord&) = delete; + TFeatureRecord& operator=(const TFeatureRecord&) = delete; + }; + + struct TFeatureList { + TFeatureList(); + ~TFeatureList(); + + std::vector FeatureRecords; + + private: + TFeatureList(const TFeatureList&) = delete; + TFeatureList& operator=(const TFeatureList&) = delete; + }; + + enum TLookupFlag { + LOOKUPFLAG_RightToLeft = 0x0001, + LOOKUPFLAG_IgnoreBaseGlyphs = 0x0002, + LOOKUPFLAG_IgnoreLigatures = 0x0004, + LOOKUPFLAG_IgnoreMarks = 0x0008, + LOOKUPFLAG_Reserved = 0x00F0, + LOOKUPFLAG_MarkAttachmentType = 0xFF00, + }; + + struct TCoverageFormatBase { + TCoverageFormatBase() : CoverageFormat(0) {} + explicit TCoverageFormatBase(uint16_t format) : CoverageFormat(format) {} + virtual ~TCoverageFormatBase() {} + + uint16_t CoverageFormat; + CFX_GlyphMap m_glyphMap; + + private: + TCoverageFormatBase(const TCoverageFormatBase&); + TCoverageFormatBase& operator=(const TCoverageFormatBase&); + }; + + struct TCoverageFormat1 : public TCoverageFormatBase { + TCoverageFormat1(); + ~TCoverageFormat1() override; + + std::vector GlyphArray; + + private: + TCoverageFormat1(const TCoverageFormat1&) = delete; + TCoverageFormat1& operator=(const TCoverageFormat1&) = delete; + }; + + struct TRangeRecord { + TRangeRecord(); + + friend bool operator>(const TRangeRecord& r1, const TRangeRecord& r2) { + return r1.Start > r2.Start; + } + + uint16_t Start; + uint16_t End; + uint16_t StartCoverageIndex; + + private: + TRangeRecord(const TRangeRecord&) = delete; + }; + + struct TCoverageFormat2 : public TCoverageFormatBase { + TCoverageFormat2(); + ~TCoverageFormat2() override; + + std::vector RangeRecords; + + private: + TCoverageFormat2(const TCoverageFormat2&) = delete; + TCoverageFormat2& operator=(const TCoverageFormat2&) = delete; + }; + + struct TDevice { + TDevice() : StartSize(0), EndSize(0), DeltaFormat(0) {} + + uint16_t StartSize; + uint16_t EndSize; + uint16_t DeltaFormat; + + private: + TDevice(const TDevice&) = delete; + TDevice& operator=(const TDevice&) = delete; + }; + + struct TSubTableBase { + TSubTableBase() : SubstFormat(0) {} + explicit TSubTableBase(uint16_t format) : SubstFormat(format) {} + virtual ~TSubTableBase() {} + + uint16_t SubstFormat; + + private: + TSubTableBase(const TSubTableBase&) = delete; + TSubTableBase& operator=(const TSubTableBase&) = delete; + }; + + struct TSingleSubstFormat1 : public TSubTableBase { + TSingleSubstFormat1(); + ~TSingleSubstFormat1() override; + + std::unique_ptr Coverage; + int16_t DeltaGlyphID; + + private: + TSingleSubstFormat1(const TSingleSubstFormat1&) = delete; + TSingleSubstFormat1& operator=(const TSingleSubstFormat1&) = delete; + }; + + struct TSingleSubstFormat2 : public TSubTableBase { + TSingleSubstFormat2(); + ~TSingleSubstFormat2() override; + + std::unique_ptr Coverage; + std::vector Substitutes; + + private: + TSingleSubstFormat2(const TSingleSubstFormat2&) = delete; + TSingleSubstFormat2& operator=(const TSingleSubstFormat2&) = delete; + }; + + struct TLookup { + TLookup(); + ~TLookup(); + + uint16_t LookupType; + uint16_t LookupFlag; + std::vector> SubTables; + + private: + TLookup(const TLookup&) = delete; + TLookup& operator=(const TLookup&) = delete; + }; + + struct TLookupList { + TLookupList(); + ~TLookupList(); + + std::vector Lookups; + + private: + TLookupList(const TLookupList&) = delete; + TLookupList& operator=(const TLookupList&) = delete; + }; + + bool Parse(FT_Bytes scriptlist, FT_Bytes featurelist, FT_Bytes lookuplist); + void ParseScriptList(FT_Bytes raw, TScriptList* rec); + void ParseScript(FT_Bytes raw, TScript* rec); + void ParseLangSys(FT_Bytes raw, TLangSys* rec); + void ParseFeatureList(FT_Bytes raw, TFeatureList* rec); + void ParseFeature(FT_Bytes raw, TFeature* rec); + void ParseLookupList(FT_Bytes raw, TLookupList* rec); + void ParseLookup(FT_Bytes raw, TLookup* rec); + TCoverageFormatBase* ParseCoverage(FT_Bytes raw); + void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1* rec); + void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2* rec); + void ParseSingleSubst(FT_Bytes raw, std::unique_ptr* rec); + void ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1* rec); + void ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2* rec); + + bool GetVerticalGlyphSub(uint32_t glyphnum, + uint32_t* vglyphnum, + TFeature* Feature); + bool GetVerticalGlyphSub2(uint32_t glyphnum, + uint32_t* vglyphnum, + TLookup* Lookup); + int GetCoverageIndex(TCoverageFormatBase* Coverage, uint32_t g) const; + + uint8_t GetUInt8(FT_Bytes& p) const; + int16_t GetInt16(FT_Bytes& p) const; + uint16_t GetUInt16(FT_Bytes& p) const; + int32_t GetInt32(FT_Bytes& p) const; + uint32_t GetUInt32(FT_Bytes& p) const; + + std::set m_featureSet; + bool m_bFeautureMapLoad; + bool loaded; + tt_gsub_header header; + TScriptList ScriptList; + TFeatureList FeatureList; + TLookupList LookupList; +}; + +#endif // CORE_FPDFAPI_FONT_TTGSUBTABLE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_allstates.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_allstates.cpp new file mode 100644 index 000000000000..282a47fe29ed --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_allstates.cpp @@ -0,0 +1,173 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_allstates.h" + +#include + +#include "core/fpdfapi/page/cpdf_pageobjectholder.h" +#include "core/fpdfapi/page/cpdf_streamcontentparser.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fxge/cfx_graphstatedata.h" + +namespace { + +FX_FLOAT ClipFloat(FX_FLOAT f) { + return std::max(0.0f, std::min(1.0f, f)); +} + +} // namespace + +CPDF_AllStates::CPDF_AllStates() + : m_TextLeading(0), m_TextRise(0), m_TextHorzScale(1.0f) {} + +CPDF_AllStates::~CPDF_AllStates() {} + +void CPDF_AllStates::Copy(const CPDF_AllStates& src) { + CopyStates(src); + m_TextMatrix = src.m_TextMatrix; + m_ParentMatrix = src.m_ParentMatrix; + m_CTM = src.m_CTM; + m_TextPos = src.m_TextPos; + m_TextLinePos = src.m_TextLinePos; + m_TextLeading = src.m_TextLeading; + m_TextRise = src.m_TextRise; + m_TextHorzScale = src.m_TextHorzScale; +} + +void CPDF_AllStates::SetLineDash(CPDF_Array* pArray, + FX_FLOAT phase, + FX_FLOAT scale) { + m_GraphState.SetLineDash(pArray, phase, scale); +} + +void CPDF_AllStates::ProcessExtGS(CPDF_Dictionary* pGS, + CPDF_StreamContentParser* pParser) { + for (const auto& it : *pGS) { + const CFX_ByteString& key_str = it.first; + CPDF_Object* pElement = it.second.get(); + CPDF_Object* pObject = pElement ? pElement->GetDirect() : nullptr; + if (!pObject) + continue; + + uint32_t key = key_str.GetID(); + switch (key) { + case FXBSTR_ID('L', 'W', 0, 0): + m_GraphState.SetLineWidth(pObject->GetNumber()); + break; + case FXBSTR_ID('L', 'C', 0, 0): + m_GraphState.SetLineCap( + static_cast(pObject->GetInteger())); + break; + case FXBSTR_ID('L', 'J', 0, 0): + m_GraphState.SetLineJoin( + static_cast(pObject->GetInteger())); + break; + case FXBSTR_ID('M', 'L', 0, 0): + m_GraphState.SetMiterLimit(pObject->GetNumber()); + break; + case FXBSTR_ID('D', 0, 0, 0): { + CPDF_Array* pDash = pObject->AsArray(); + if (!pDash) + break; + + CPDF_Array* pArray = pDash->GetArrayAt(0); + if (!pArray) + break; + + SetLineDash(pArray, pDash->GetNumberAt(1), 1.0f); + break; + } + case FXBSTR_ID('R', 'I', 0, 0): + m_GeneralState.SetRenderIntent(pObject->GetString()); + break; + case FXBSTR_ID('F', 'o', 'n', 't'): { + CPDF_Array* pFont = pObject->AsArray(); + if (!pFont) + break; + + m_TextState.SetFontSize(pFont->GetNumberAt(1)); + m_TextState.SetFont(pParser->FindFont(pFont->GetStringAt(0))); + break; + } + case FXBSTR_ID('T', 'R', 0, 0): + if (pGS->KeyExist("TR2")) { + continue; + } + case FXBSTR_ID('T', 'R', '2', 0): + m_GeneralState.SetTR(pObject && !pObject->IsName() ? pObject : nullptr); + break; + case FXBSTR_ID('B', 'M', 0, 0): { + CPDF_Array* pArray = pObject->AsArray(); + m_GeneralState.SetBlendMode(pArray ? pArray->GetStringAt(0) + : pObject->GetString()); + if (m_GeneralState.GetBlendType() > FXDIB_BLEND_MULTIPLY) + pParser->GetPageObjectHolder()->SetBackgroundAlphaNeeded(true); + break; + } + case FXBSTR_ID('S', 'M', 'a', 's'): + if (ToDictionary(pObject)) { + m_GeneralState.SetSoftMask(pObject); + m_GeneralState.SetSMaskMatrix(pParser->GetCurStates()->m_CTM); + } else { + m_GeneralState.SetSoftMask(nullptr); + } + break; + case FXBSTR_ID('C', 'A', 0, 0): + m_GeneralState.SetStrokeAlpha(ClipFloat(pObject->GetNumber())); + break; + case FXBSTR_ID('c', 'a', 0, 0): + m_GeneralState.SetFillAlpha(ClipFloat(pObject->GetNumber())); + break; + case FXBSTR_ID('O', 'P', 0, 0): + m_GeneralState.SetStrokeOP(!!pObject->GetInteger()); + if (!pGS->KeyExist("op")) + m_GeneralState.SetFillOP(!!pObject->GetInteger()); + break; + case FXBSTR_ID('o', 'p', 0, 0): + m_GeneralState.SetFillOP(!!pObject->GetInteger()); + break; + case FXBSTR_ID('O', 'P', 'M', 0): + m_GeneralState.SetOPMode(pObject->GetInteger()); + break; + case FXBSTR_ID('B', 'G', 0, 0): + if (pGS->KeyExist("BG2")) { + continue; + } + case FXBSTR_ID('B', 'G', '2', 0): + m_GeneralState.SetBG(pObject); + break; + case FXBSTR_ID('U', 'C', 'R', 0): + if (pGS->KeyExist("UCR2")) { + continue; + } + case FXBSTR_ID('U', 'C', 'R', '2'): + m_GeneralState.SetUCR(pObject); + break; + case FXBSTR_ID('H', 'T', 0, 0): + m_GeneralState.SetHT(pObject); + break; + case FXBSTR_ID('F', 'L', 0, 0): + m_GeneralState.SetFlatness(pObject->GetNumber()); + break; + case FXBSTR_ID('S', 'M', 0, 0): + m_GeneralState.SetSmoothness(pObject->GetNumber()); + break; + case FXBSTR_ID('S', 'A', 0, 0): + m_GeneralState.SetStrokeAdjust(!!pObject->GetInteger()); + break; + case FXBSTR_ID('A', 'I', 'S', 0): + m_GeneralState.SetAlphaSource(!!pObject->GetInteger()); + break; + case FXBSTR_ID('T', 'K', 0, 0): + m_GeneralState.SetTextKnockout(!!pObject->GetInteger()); + break; + } + } + m_GeneralState.SetMatrix(m_CTM); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_allstates.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_allstates.h new file mode 100644 index 000000000000..dad1b8502bae --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_allstates.h @@ -0,0 +1,37 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_ALLSTATES_H_ +#define CORE_FPDFAPI_PAGE_CPDF_ALLSTATES_H_ + +#include "core/fpdfapi/page/cpdf_graphicstates.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Array; +class CPDF_Dictionary; +class CPDF_StreamContentParser; + +class CPDF_AllStates : public CPDF_GraphicStates { + public: + CPDF_AllStates(); + ~CPDF_AllStates() override; + + void Copy(const CPDF_AllStates& src); + void ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser); + void SetLineDash(CPDF_Array*, FX_FLOAT, FX_FLOAT scale); + + CFX_Matrix m_TextMatrix; + CFX_Matrix m_CTM; + CFX_Matrix m_ParentMatrix; + CFX_PointF m_TextPos; + CFX_PointF m_TextLinePos; + FX_FLOAT m_TextLeading; + FX_FLOAT m_TextRise; + FX_FLOAT m_TextHorzScale; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_ALLSTATES_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_clippath.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_clippath.cpp new file mode 100644 index 000000000000..714b56bff3bd --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_clippath.cpp @@ -0,0 +1,131 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_clippath.h" + +#include + +#include "core/fpdfapi/page/cpdf_path.h" +#include "core/fpdfapi/page/cpdf_textobject.h" +#include "third_party/base/stl_util.h" + +#define FPDF_CLIPPATH_MAX_TEXTS 1024 + +CPDF_ClipPath::CPDF_ClipPath() {} + +CPDF_ClipPath::CPDF_ClipPath(const CPDF_ClipPath& that) : m_Ref(that.m_Ref) {} + +CPDF_ClipPath::~CPDF_ClipPath() {} + +uint32_t CPDF_ClipPath::GetPathCount() const { + return pdfium::CollectionSize(m_Ref.GetObject()->m_PathAndTypeList); +} + +CPDF_Path CPDF_ClipPath::GetPath(size_t i) const { + return m_Ref.GetObject()->m_PathAndTypeList[i].first; +} + +uint8_t CPDF_ClipPath::GetClipType(size_t i) const { + return m_Ref.GetObject()->m_PathAndTypeList[i].second; +} + +uint32_t CPDF_ClipPath::GetTextCount() const { + return pdfium::CollectionSize(m_Ref.GetObject()->m_TextList); +} + +CPDF_TextObject* CPDF_ClipPath::GetText(size_t i) const { + return m_Ref.GetObject()->m_TextList[i].get(); +} + +CFX_FloatRect CPDF_ClipPath::GetClipBox() const { + CFX_FloatRect rect; + bool bStarted = false; + int count = GetPathCount(); + if (count) { + rect = GetPath(0).GetBoundingBox(); + for (int i = 1; i < count; i++) { + CFX_FloatRect path_rect = GetPath(i).GetBoundingBox(); + rect.Intersect(path_rect); + } + bStarted = true; + } + count = GetTextCount(); + if (count) { + CFX_FloatRect layer_rect; + bool bLayerStarted = false; + for (int i = 0; i < count; i++) { + CPDF_TextObject* pTextObj = GetText(i); + if (!pTextObj) { + if (!bStarted) { + rect = layer_rect; + bStarted = true; + } else { + rect.Intersect(layer_rect); + } + bLayerStarted = false; + } else { + if (!bLayerStarted) { + layer_rect = CFX_FloatRect(pTextObj->GetBBox(nullptr)); + bLayerStarted = true; + } else { + layer_rect.Union(CFX_FloatRect(pTextObj->GetBBox(nullptr))); + } + } + } + } + return rect; +} + +void CPDF_ClipPath::AppendPath(CPDF_Path path, uint8_t type, bool bAutoMerge) { + PathData* pData = m_Ref.GetPrivateCopy(); + if (!pData->m_PathAndTypeList.empty() && bAutoMerge) { + const CPDF_Path& old_path = pData->m_PathAndTypeList.back().first; + if (old_path.IsRect()) { + CFX_PointF point0 = old_path.GetPoint(0); + CFX_PointF point2 = old_path.GetPoint(2); + CFX_FloatRect old_rect(point0.x, point0.y, point2.x, point2.y); + CFX_FloatRect new_rect = path.GetBoundingBox(); + if (old_rect.Contains(new_rect)) + pData->m_PathAndTypeList.pop_back(); + } + } + pData->m_PathAndTypeList.push_back(std::make_pair(path, type)); +} + +void CPDF_ClipPath::AppendTexts( + std::vector>* pTexts) { + PathData* pData = m_Ref.GetPrivateCopy(); + if (pData->m_TextList.size() + pTexts->size() <= FPDF_CLIPPATH_MAX_TEXTS) { + for (size_t i = 0; i < pTexts->size(); i++) + pData->m_TextList.push_back(std::move((*pTexts)[i])); + pData->m_TextList.push_back(nullptr); + } + pTexts->clear(); +} + +void CPDF_ClipPath::Transform(const CFX_Matrix& matrix) { + PathData* pData = m_Ref.GetPrivateCopy(); + for (auto& obj : pData->m_PathAndTypeList) + obj.first.Transform(&matrix); + for (auto& text : pData->m_TextList) { + if (text) + text->Transform(matrix); + } +} + +CPDF_ClipPath::PathData::PathData() {} + +CPDF_ClipPath::PathData::PathData(const PathData& that) { + m_PathAndTypeList = that.m_PathAndTypeList; + + m_TextList.resize(that.m_TextList.size()); + for (size_t i = 0; i < that.m_TextList.size(); ++i) { + if (that.m_TextList[i]) + m_TextList[i] = that.m_TextList[i]->Clone(); + } +} + +CPDF_ClipPath::PathData::~PathData() {} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_clippath.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_clippath.h new file mode 100644 index 000000000000..dd44cb250e96 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_clippath.h @@ -0,0 +1,63 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_CLIPPATH_H_ +#define CORE_FPDFAPI_PAGE_CPDF_CLIPPATH_H_ + +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_path.h" +#include "core/fxcrt/cfx_shared_copy_on_write.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" + +class CPDF_Path; +class CPDF_TextObject; + +class CPDF_ClipPath { + public: + CPDF_ClipPath(); + CPDF_ClipPath(const CPDF_ClipPath& that); + ~CPDF_ClipPath(); + + void Emplace() { m_Ref.Emplace(); } + void SetNull() { m_Ref.SetNull(); } + + explicit operator bool() const { return !!m_Ref; } + bool operator==(const CPDF_ClipPath& that) const { + return m_Ref == that.m_Ref; + } + bool operator!=(const CPDF_ClipPath& that) const { return !(*this == that); } + + uint32_t GetPathCount() const; + CPDF_Path GetPath(size_t i) const; + uint8_t GetClipType(size_t i) const; + uint32_t GetTextCount() const; + CPDF_TextObject* GetText(size_t i) const; + CFX_FloatRect GetClipBox() const; + void AppendPath(CPDF_Path path, uint8_t type, bool bAutoMerge); + void AppendTexts(std::vector>* pTexts); + void Transform(const CFX_Matrix& matrix); + + private: + class PathData { + public: + using PathAndTypeData = std::pair; + + PathData(); + PathData(const PathData& that); + ~PathData(); + + std::vector m_PathAndTypeList; + std::vector> m_TextList; + }; + + CFX_SharedCopyOnWrite m_Ref; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_CLIPPATH_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_color.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_color.cpp new file mode 100644 index 000000000000..4ba28ce3140f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_color.cpp @@ -0,0 +1,155 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_color.h" + +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fxcrt/fx_system.h" + +CPDF_Color::CPDF_Color() : m_pCS(nullptr), m_pBuffer(nullptr) {} + +CPDF_Color::~CPDF_Color() { + ReleaseBuffer(); + ReleaseColorSpace(); +} + +bool CPDF_Color::IsPattern() const { + return m_pCS && m_pCS->GetFamily() == PDFCS_PATTERN; +} + +void CPDF_Color::ReleaseBuffer() { + if (!m_pBuffer) + return; + + if (m_pCS->GetFamily() == PDFCS_PATTERN) { + PatternValue* pvalue = (PatternValue*)m_pBuffer; + CPDF_Pattern* pPattern = + pvalue->m_pCountedPattern ? pvalue->m_pCountedPattern->get() : nullptr; + if (pPattern && pPattern->document()) { + CPDF_DocPageData* pPageData = pPattern->document()->GetPageData(); + if (pPageData) + pPageData->ReleasePattern(pPattern->pattern_obj()); + } + } + FX_Free(m_pBuffer); + m_pBuffer = nullptr; +} + +void CPDF_Color::ReleaseColorSpace() { + if (m_pCS && m_pCS->m_pDocument) { + m_pCS->m_pDocument->GetPageData()->ReleaseColorSpace(m_pCS->GetArray()); + m_pCS = nullptr; + } +} + +void CPDF_Color::SetColorSpace(CPDF_ColorSpace* pCS) { + if (m_pCS == pCS) { + if (!m_pBuffer) + m_pBuffer = pCS->CreateBuf(); + + ReleaseColorSpace(); + m_pCS = pCS; + return; + } + ReleaseBuffer(); + ReleaseColorSpace(); + + m_pCS = pCS; + if (m_pCS) { + m_pBuffer = pCS->CreateBuf(); + pCS->GetDefaultColor(m_pBuffer); + } +} + +void CPDF_Color::SetValue(FX_FLOAT* comps) { + if (!m_pBuffer) + return; + if (m_pCS->GetFamily() != PDFCS_PATTERN) + FXSYS_memcpy(m_pBuffer, comps, m_pCS->CountComponents() * sizeof(FX_FLOAT)); +} + +void CPDF_Color::SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comps, int ncomps) { + if (ncomps > MAX_PATTERN_COLORCOMPS) + return; + + if (!IsPattern()) { + FX_Free(m_pBuffer); + m_pCS = CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN); + m_pBuffer = m_pCS->CreateBuf(); + } + + CPDF_DocPageData* pDocPageData = nullptr; + PatternValue* pvalue = (PatternValue*)m_pBuffer; + if (pvalue->m_pPattern && pvalue->m_pPattern->document()) { + pDocPageData = pvalue->m_pPattern->document()->GetPageData(); + if (pDocPageData) + pDocPageData->ReleasePattern(pvalue->m_pPattern->pattern_obj()); + } + pvalue->m_nComps = ncomps; + pvalue->m_pPattern = pPattern; + if (ncomps) + FXSYS_memcpy(pvalue->m_Comps, comps, ncomps * sizeof(FX_FLOAT)); + + pvalue->m_pCountedPattern = nullptr; + if (pPattern && pPattern->document()) { + if (!pDocPageData) + pDocPageData = pPattern->document()->GetPageData(); + + pvalue->m_pCountedPattern = + pDocPageData->FindPatternPtr(pPattern->pattern_obj()); + } +} + +void CPDF_Color::Copy(const CPDF_Color* pSrc) { + ReleaseBuffer(); + ReleaseColorSpace(); + + m_pCS = pSrc->m_pCS; + if (m_pCS && m_pCS->m_pDocument) { + CPDF_Array* pArray = m_pCS->GetArray(); + if (pArray) + m_pCS = m_pCS->m_pDocument->GetPageData()->GetCopiedColorSpace(pArray); + } + if (!m_pCS) + return; + + m_pBuffer = m_pCS->CreateBuf(); + FXSYS_memcpy(m_pBuffer, pSrc->m_pBuffer, m_pCS->GetBufSize()); + if (m_pCS->GetFamily() != PDFCS_PATTERN) + return; + + PatternValue* pValue = reinterpret_cast(m_pBuffer); + CPDF_Pattern* pPattern = pValue->m_pPattern; + if (pPattern && pPattern->document()) { + pValue->m_pPattern = pPattern->document()->GetPageData()->GetPattern( + pPattern->pattern_obj(), false, pPattern->parent_matrix()); + } +} + +bool CPDF_Color::GetRGB(int& R, int& G, int& B) const { + if (!m_pCS || !m_pBuffer) + return false; + + FX_FLOAT r = 0.0f, g = 0.0f, b = 0.0f; + if (!m_pCS->GetRGB(m_pBuffer, r, g, b)) + return false; + + R = (int32_t)(r * 255 + 0.5f); + G = (int32_t)(g * 255 + 0.5f); + B = (int32_t)(b * 255 + 0.5f); + return true; +} + +CPDF_Pattern* CPDF_Color::GetPattern() const { + if (!m_pBuffer || m_pCS->GetFamily() != PDFCS_PATTERN) + return nullptr; + + PatternValue* pvalue = (PatternValue*)m_pBuffer; + return pvalue->m_pPattern; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_color.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_color.h new file mode 100644 index 000000000000..e81b53105504 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_color.h @@ -0,0 +1,41 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_COLOR_H_ +#define CORE_FPDFAPI_PAGE_CPDF_COLOR_H_ + +#include "core/fpdfapi/page/cpdf_colorspace.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Pattern; + +class CPDF_Color { + public: + CPDF_Color(); + ~CPDF_Color(); + + bool IsNull() const { return !m_pBuffer; } + bool IsPattern() const; + + void Copy(const CPDF_Color* pSrc); + + void SetColorSpace(CPDF_ColorSpace* pCS); + void SetValue(FX_FLOAT* comp); + void SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comp, int ncomps); + + bool GetRGB(int& R, int& G, int& B) const; + CPDF_Pattern* GetPattern() const; + const CPDF_ColorSpace* GetColorSpace() const { return m_pCS; } + + protected: + void ReleaseBuffer(); + void ReleaseColorSpace(); + + CPDF_ColorSpace* m_pCS; + FX_FLOAT* m_pBuffer; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_COLOR_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorspace.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorspace.cpp new file mode 100644 index 000000000000..6cd0075e8e7f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorspace.cpp @@ -0,0 +1,1272 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_colorspace.h" + +#include +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxcrt/fx_memory.h" + +namespace { + +const uint8_t g_sRGBSamples1[] = { + 0, 3, 6, 10, 13, 15, 18, 20, 22, 23, 25, 27, 28, 30, 31, + 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 49, 50, 51, 52, 53, 53, 54, 55, 56, 56, 57, 58, 58, + 59, 60, 61, 61, 62, 62, 63, 64, 64, 65, 66, 66, 67, 67, 68, + 68, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 76, 76, + 77, 77, 78, 78, 79, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, + 84, 84, 85, 85, 85, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, + 90, 91, 91, 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 95, 96, + 96, 97, 97, 97, 98, 98, 98, 99, 99, 99, 100, 100, 101, 101, 101, + 102, 102, 102, 103, 103, 103, 104, 104, 104, 105, 105, 106, 106, 106, 107, + 107, 107, 108, 108, 108, 109, 109, 109, 110, 110, 110, 110, 111, 111, 111, + 112, 112, 112, 113, 113, 113, 114, 114, 114, 115, 115, 115, 115, 116, 116, + 116, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 120, +}; + +const uint8_t g_sRGBSamples2[] = { + 120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, + 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, + 163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, + 174, 175, 175, 176, 177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, + 185, 185, 186, 187, 187, 188, 189, 189, 190, 190, 191, 192, 192, 193, 194, + 194, 195, 196, 196, 197, 197, 198, 199, 199, 200, 200, 201, 202, 202, 203, + 203, 204, 205, 205, 206, 206, 207, 208, 208, 209, 209, 210, 210, 211, 212, + 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 218, 218, 219, 219, 220, + 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 226, 226, 227, 227, 228, + 228, 229, 229, 230, 230, 231, 231, 232, 232, 233, 233, 234, 234, 235, 235, + 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240, 241, 241, 242, 242, + 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248, 248, 249, 249, + 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255, +}; + +class CPDF_CalGray : public CPDF_ColorSpace { + public: + explicit CPDF_CalGray(CPDF_Document* pDoc); + + bool v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override; + + bool GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const override; + bool SetRGB(FX_FLOAT* pBuf, + FX_FLOAT R, + FX_FLOAT G, + FX_FLOAT B) const override; + + void TranslateImageLine(uint8_t* pDestBuf, + const uint8_t* pSrcBuf, + int pixels, + int image_width, + int image_height, + bool bTransMask = false) const override; + + private: + FX_FLOAT m_WhitePoint[3]; + FX_FLOAT m_BlackPoint[3]; + FX_FLOAT m_Gamma; +}; + +class CPDF_CalRGB : public CPDF_ColorSpace { + public: + explicit CPDF_CalRGB(CPDF_Document* pDoc); + + bool v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override; + + bool GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const override; + bool SetRGB(FX_FLOAT* pBuf, + FX_FLOAT R, + FX_FLOAT G, + FX_FLOAT B) const override; + + void TranslateImageLine(uint8_t* pDestBuf, + const uint8_t* pSrcBuf, + int pixels, + int image_width, + int image_height, + bool bTransMask = false) const override; + + FX_FLOAT m_WhitePoint[3]; + FX_FLOAT m_BlackPoint[3]; + FX_FLOAT m_Gamma[3]; + FX_FLOAT m_Matrix[9]; + bool m_bGamma; + bool m_bMatrix; +}; + +class CPDF_LabCS : public CPDF_ColorSpace { + public: + explicit CPDF_LabCS(CPDF_Document* pDoc); + + bool v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override; + + void GetDefaultValue(int iComponent, + FX_FLOAT& value, + FX_FLOAT& min, + FX_FLOAT& max) const override; + bool GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const override; + bool SetRGB(FX_FLOAT* pBuf, + FX_FLOAT R, + FX_FLOAT G, + FX_FLOAT B) const override; + + void TranslateImageLine(uint8_t* pDestBuf, + const uint8_t* pSrcBuf, + int pixels, + int image_width, + int image_height, + bool bTransMask = false) const override; + + FX_FLOAT m_WhitePoint[3]; + FX_FLOAT m_BlackPoint[3]; + FX_FLOAT m_Ranges[4]; +}; + +class CPDF_ICCBasedCS : public CPDF_ColorSpace { + public: + explicit CPDF_ICCBasedCS(CPDF_Document* pDoc); + ~CPDF_ICCBasedCS() override; + + bool v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override; + + bool GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const override; + bool SetRGB(FX_FLOAT* pBuf, + FX_FLOAT R, + FX_FLOAT G, + FX_FLOAT B) const override; + + bool v_GetCMYK(FX_FLOAT* pBuf, + FX_FLOAT& c, + FX_FLOAT& m, + FX_FLOAT& y, + FX_FLOAT& k) const override; + + void EnableStdConversion(bool bEnabled) override; + void TranslateImageLine(uint8_t* pDestBuf, + const uint8_t* pSrcBuf, + int pixels, + int image_width, + int image_height, + bool bTransMask = false) const override; + + CFX_MaybeOwned m_pAlterCS; + CPDF_IccProfile* m_pProfile; + uint8_t* m_pCache; + FX_FLOAT* m_pRanges; +}; + +class CPDF_IndexedCS : public CPDF_ColorSpace { + public: + explicit CPDF_IndexedCS(CPDF_Document* pDoc); + ~CPDF_IndexedCS() override; + + bool v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override; + + bool GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const override; + CPDF_ColorSpace* GetBaseCS() const override; + + void EnableStdConversion(bool bEnabled) override; + + CPDF_ColorSpace* m_pBaseCS; + CPDF_CountedColorSpace* m_pCountedBaseCS; + int m_nBaseComponents; + int m_MaxIndex; + CFX_ByteString m_Table; + FX_FLOAT* m_pCompMinMax; +}; + +class CPDF_SeparationCS : public CPDF_ColorSpace { + public: + explicit CPDF_SeparationCS(CPDF_Document* pDoc); + ~CPDF_SeparationCS() override; + + // CPDF_ColorSpace: + void GetDefaultValue(int iComponent, + FX_FLOAT& value, + FX_FLOAT& min, + FX_FLOAT& max) const override; + bool v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override; + bool GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const override; + void EnableStdConversion(bool bEnabled) override; + + std::unique_ptr m_pAltCS; + std::unique_ptr m_pFunc; + enum { None, All, Colorant } m_Type; +}; + +class CPDF_DeviceNCS : public CPDF_ColorSpace { + public: + explicit CPDF_DeviceNCS(CPDF_Document* pDoc); + ~CPDF_DeviceNCS() override; + + // CPDF_ColorSpace: + void GetDefaultValue(int iComponent, + FX_FLOAT& value, + FX_FLOAT& min, + FX_FLOAT& max) const override; + bool v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override; + bool GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const override; + void EnableStdConversion(bool bEnabled) override; + + std::unique_ptr m_pAltCS; + std::unique_ptr m_pFunc; +}; + +FX_FLOAT RGB_Conversion(FX_FLOAT colorComponent) { + if (colorComponent > 1) + colorComponent = 1; + if (colorComponent < 0) + colorComponent = 0; + + int scale = (int)(colorComponent * 1023); + if (scale < 0) + scale = 0; + if (scale < 192) + colorComponent = (g_sRGBSamples1[scale] / 255.0f); + else + colorComponent = (g_sRGBSamples2[scale / 4 - 48] / 255.0f); + return colorComponent; +} + +void XYZ_to_sRGB(FX_FLOAT X, + FX_FLOAT Y, + FX_FLOAT Z, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) { + FX_FLOAT R1 = 3.2410f * X - 1.5374f * Y - 0.4986f * Z; + FX_FLOAT G1 = -0.9692f * X + 1.8760f * Y + 0.0416f * Z; + FX_FLOAT B1 = 0.0556f * X - 0.2040f * Y + 1.0570f * Z; + + R = RGB_Conversion(R1); + G = RGB_Conversion(G1); + B = RGB_Conversion(B1); +} + +void XYZ_to_sRGB_WhitePoint(FX_FLOAT X, + FX_FLOAT Y, + FX_FLOAT Z, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B, + FX_FLOAT Xw, + FX_FLOAT Yw, + FX_FLOAT Zw) { + // The following RGB_xyz is based on + // sRGB value {Rx,Ry}={0.64, 0.33}, {Gx,Gy}={0.30, 0.60}, {Bx,By}={0.15, 0.06} + + FX_FLOAT Rx = 0.64f, Ry = 0.33f; + FX_FLOAT Gx = 0.30f, Gy = 0.60f; + FX_FLOAT Bx = 0.15f, By = 0.06f; + CFX_Matrix_3by3 RGB_xyz(Rx, Gx, Bx, Ry, Gy, By, 1 - Rx - Ry, 1 - Gx - Gy, + 1 - Bx - By); + CFX_Vector_3by1 whitePoint(Xw, Yw, Zw); + CFX_Vector_3by1 XYZ(X, Y, Z); + + CFX_Vector_3by1 RGB_Sum_XYZ = RGB_xyz.Inverse().TransformVector(whitePoint); + CFX_Matrix_3by3 RGB_SUM_XYZ_DIAG(RGB_Sum_XYZ.a, 0, 0, 0, RGB_Sum_XYZ.b, 0, 0, + 0, RGB_Sum_XYZ.c); + CFX_Matrix_3by3 M = RGB_xyz.Multiply(RGB_SUM_XYZ_DIAG); + CFX_Vector_3by1 RGB = M.Inverse().TransformVector(XYZ); + + R = RGB_Conversion(RGB.a); + G = RGB_Conversion(RGB.b); + B = RGB_Conversion(RGB.c); +} + +} // namespace + +CPDF_ColorSpace* CPDF_ColorSpace::ColorspaceFromName( + const CFX_ByteString& name) { + if (name == "DeviceRGB" || name == "RGB") + return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB); + if (name == "DeviceGray" || name == "G") + return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY); + if (name == "DeviceCMYK" || name == "CMYK") + return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK); + if (name == "Pattern") + return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN); + return nullptr; +} + +CPDF_ColorSpace* CPDF_ColorSpace::GetStockCS(int family) { + return CPDF_ModuleMgr::Get()->GetPageModule()->GetStockCS(family); +} + +std::unique_ptr CPDF_ColorSpace::Load(CPDF_Document* pDoc, + CPDF_Object* pObj) { + if (!pObj) + return nullptr; + + if (pObj->IsName()) { + return std::unique_ptr( + ColorspaceFromName(pObj->GetString())); + } + if (CPDF_Stream* pStream = pObj->AsStream()) { + CPDF_Dictionary* pDict = pStream->GetDict(); + if (!pDict) + return nullptr; + + for (const auto& it : *pDict) { + std::unique_ptr pRet; + CPDF_Object* pValue = it.second.get(); + if (ToName(pValue)) + pRet.reset(ColorspaceFromName(pValue->GetString())); + if (pRet) + return pRet; + } + return nullptr; + } + + CPDF_Array* pArray = pObj->AsArray(); + if (!pArray || pArray->IsEmpty()) + return nullptr; + + CPDF_Object* pFamilyObj = pArray->GetDirectObjectAt(0); + if (!pFamilyObj) + return nullptr; + + CFX_ByteString familyname = pFamilyObj->GetString(); + if (pArray->GetCount() == 1) + return std::unique_ptr(ColorspaceFromName(familyname)); + + std::unique_ptr pCS; + uint32_t id = familyname.GetID(); + if (id == FXBSTR_ID('C', 'a', 'l', 'G')) { + pCS.reset(new CPDF_CalGray(pDoc)); + } else if (id == FXBSTR_ID('C', 'a', 'l', 'R')) { + pCS.reset(new CPDF_CalRGB(pDoc)); + } else if (id == FXBSTR_ID('L', 'a', 'b', 0)) { + pCS.reset(new CPDF_LabCS(pDoc)); + } else if (id == FXBSTR_ID('I', 'C', 'C', 'B')) { + pCS.reset(new CPDF_ICCBasedCS(pDoc)); + } else if (id == FXBSTR_ID('I', 'n', 'd', 'e') || + id == FXBSTR_ID('I', 0, 0, 0)) { + pCS.reset(new CPDF_IndexedCS(pDoc)); + } else if (id == FXBSTR_ID('S', 'e', 'p', 'a')) { + pCS.reset(new CPDF_SeparationCS(pDoc)); + } else if (id == FXBSTR_ID('D', 'e', 'v', 'i')) { + pCS.reset(new CPDF_DeviceNCS(pDoc)); + } else if (id == FXBSTR_ID('P', 'a', 't', 't')) { + pCS.reset(new CPDF_PatternCS(pDoc)); + } else { + return nullptr; + } + pCS->m_pArray = pArray; + if (!pCS->v_Load(pDoc, pArray)) + return nullptr; + + return pCS; +} + +void CPDF_ColorSpace::Release() { + if (this == GetStockCS(PDFCS_DEVICERGB) || + this == GetStockCS(PDFCS_DEVICEGRAY) || + this == GetStockCS(PDFCS_DEVICECMYK) || + this == GetStockCS(PDFCS_PATTERN)) { + return; + } + delete this; +} + +int CPDF_ColorSpace::GetBufSize() const { + if (m_Family == PDFCS_PATTERN) { + return sizeof(PatternValue); + } + return m_nComponents * sizeof(FX_FLOAT); +} + +FX_FLOAT* CPDF_ColorSpace::CreateBuf() { + int size = GetBufSize(); + uint8_t* pBuf = FX_Alloc(uint8_t, size); + return (FX_FLOAT*)pBuf; +} + +bool CPDF_ColorSpace::sRGB() const { + if (m_Family == PDFCS_DEVICERGB) { + return true; + } + if (m_Family != PDFCS_ICCBASED) { + return false; + } + CPDF_ICCBasedCS* pCS = (CPDF_ICCBasedCS*)this; + return pCS->m_pProfile->m_bsRGB; +} + +bool CPDF_ColorSpace::SetRGB(FX_FLOAT* pBuf, + FX_FLOAT R, + FX_FLOAT G, + FX_FLOAT B) const { + return false; +} + +bool CPDF_ColorSpace::GetCMYK(FX_FLOAT* pBuf, + FX_FLOAT& c, + FX_FLOAT& m, + FX_FLOAT& y, + FX_FLOAT& k) const { + if (v_GetCMYK(pBuf, c, m, y, k)) { + return true; + } + FX_FLOAT R, G, B; + if (!GetRGB(pBuf, R, G, B)) { + return false; + } + sRGB_to_AdobeCMYK(R, G, B, c, m, y, k); + return true; +} + +bool CPDF_ColorSpace::SetCMYK(FX_FLOAT* pBuf, + FX_FLOAT c, + FX_FLOAT m, + FX_FLOAT y, + FX_FLOAT k) const { + if (v_SetCMYK(pBuf, c, m, y, k)) { + return true; + } + FX_FLOAT R, G, B; + AdobeCMYK_to_sRGB(c, m, y, k, R, G, B); + return SetRGB(pBuf, R, G, B); +} + +void CPDF_ColorSpace::GetDefaultColor(FX_FLOAT* buf) const { + if (!buf || m_Family == PDFCS_PATTERN) { + return; + } + FX_FLOAT min, max; + for (uint32_t i = 0; i < m_nComponents; i++) { + GetDefaultValue(i, buf[i], min, max); + } +} + +uint32_t CPDF_ColorSpace::CountComponents() const { + return m_nComponents; +} + +void CPDF_ColorSpace::GetDefaultValue(int iComponent, + FX_FLOAT& value, + FX_FLOAT& min, + FX_FLOAT& max) const { + value = 0; + min = 0; + max = 1.0f; +} + +void CPDF_ColorSpace::TranslateImageLine(uint8_t* dest_buf, + const uint8_t* src_buf, + int pixels, + int image_width, + int image_height, + bool bTransMask) const { + CFX_FixedBufGrow srcbuf(m_nComponents); + FX_FLOAT* src = srcbuf; + FX_FLOAT R, G, B; + for (int i = 0; i < pixels; i++) { + for (uint32_t j = 0; j < m_nComponents; j++) + if (m_Family == PDFCS_INDEXED) { + src[j] = (FX_FLOAT)(*src_buf++); + } else { + src[j] = (FX_FLOAT)(*src_buf++) / 255; + } + GetRGB(src, R, G, B); + *dest_buf++ = (int32_t)(B * 255); + *dest_buf++ = (int32_t)(G * 255); + *dest_buf++ = (int32_t)(R * 255); + } +} + +CPDF_ColorSpace* CPDF_ColorSpace::GetBaseCS() const { + return nullptr; +} + +void CPDF_ColorSpace::EnableStdConversion(bool bEnabled) { + if (bEnabled) + m_dwStdConversion++; + else if (m_dwStdConversion) + m_dwStdConversion--; +} + +CPDF_ColorSpace::CPDF_ColorSpace(CPDF_Document* pDoc, + int family, + uint32_t nComponents) + : m_pDocument(pDoc), + m_Family(family), + m_nComponents(nComponents), + m_pArray(nullptr), + m_dwStdConversion(0) {} + +CPDF_ColorSpace::~CPDF_ColorSpace() {} + +bool CPDF_ColorSpace::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { + return true; +} + +bool CPDF_ColorSpace::v_GetCMYK(FX_FLOAT* pBuf, + FX_FLOAT& c, + FX_FLOAT& m, + FX_FLOAT& y, + FX_FLOAT& k) const { + return false; +} + +bool CPDF_ColorSpace::v_SetCMYK(FX_FLOAT* pBuf, + FX_FLOAT c, + FX_FLOAT m, + FX_FLOAT y, + FX_FLOAT k) const { + return false; +} + +CPDF_CalGray::CPDF_CalGray(CPDF_Document* pDoc) + : CPDF_ColorSpace(pDoc, PDFCS_CALGRAY, 1) {} + +bool CPDF_CalGray::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { + CPDF_Dictionary* pDict = pArray->GetDictAt(1); + if (!pDict) + return false; + + CPDF_Array* pParam = pDict->GetArrayFor("WhitePoint"); + int i; + for (i = 0; i < 3; i++) + m_WhitePoint[i] = pParam ? pParam->GetNumberAt(i) : 0; + + pParam = pDict->GetArrayFor("BlackPoint"); + for (i = 0; i < 3; i++) + m_BlackPoint[i] = pParam ? pParam->GetNumberAt(i) : 0; + + m_Gamma = pDict->GetNumberFor("Gamma"); + if (m_Gamma == 0) + m_Gamma = 1.0f; + return true; +} + +bool CPDF_CalGray::GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const { + R = G = B = *pBuf; + return true; +} + +bool CPDF_CalGray::SetRGB(FX_FLOAT* pBuf, + FX_FLOAT R, + FX_FLOAT G, + FX_FLOAT B) const { + if (R == G && R == B) { + *pBuf = R; + return true; + } + return false; +} + +void CPDF_CalGray::TranslateImageLine(uint8_t* pDestBuf, + const uint8_t* pSrcBuf, + int pixels, + int image_width, + int image_height, + bool bTransMask) const { + for (int i = 0; i < pixels; i++) { + *pDestBuf++ = pSrcBuf[i]; + *pDestBuf++ = pSrcBuf[i]; + *pDestBuf++ = pSrcBuf[i]; + } +} + +CPDF_CalRGB::CPDF_CalRGB(CPDF_Document* pDoc) + : CPDF_ColorSpace(pDoc, PDFCS_CALRGB, 3) {} + +bool CPDF_CalRGB::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { + CPDF_Dictionary* pDict = pArray->GetDictAt(1); + if (!pDict) + return false; + + CPDF_Array* pParam = pDict->GetArrayFor("WhitePoint"); + int i; + for (i = 0; i < 3; i++) + m_WhitePoint[i] = pParam ? pParam->GetNumberAt(i) : 0; + + pParam = pDict->GetArrayFor("BlackPoint"); + for (i = 0; i < 3; i++) + m_BlackPoint[i] = pParam ? pParam->GetNumberAt(i) : 0; + + pParam = pDict->GetArrayFor("Gamma"); + if (pParam) { + m_bGamma = true; + for (i = 0; i < 3; i++) + m_Gamma[i] = pParam->GetNumberAt(i); + } else { + m_bGamma = false; + } + + pParam = pDict->GetArrayFor("Matrix"); + if (pParam) { + m_bMatrix = true; + for (i = 0; i < 9; i++) + m_Matrix[i] = pParam->GetNumberAt(i); + } else { + m_bMatrix = false; + } + return true; +} + +bool CPDF_CalRGB::GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const { + FX_FLOAT A_ = pBuf[0]; + FX_FLOAT B_ = pBuf[1]; + FX_FLOAT C_ = pBuf[2]; + if (m_bGamma) { + A_ = (FX_FLOAT)FXSYS_pow(A_, m_Gamma[0]); + B_ = (FX_FLOAT)FXSYS_pow(B_, m_Gamma[1]); + C_ = (FX_FLOAT)FXSYS_pow(C_, m_Gamma[2]); + } + + FX_FLOAT X; + FX_FLOAT Y; + FX_FLOAT Z; + if (m_bMatrix) { + X = m_Matrix[0] * A_ + m_Matrix[3] * B_ + m_Matrix[6] * C_; + Y = m_Matrix[1] * A_ + m_Matrix[4] * B_ + m_Matrix[7] * C_; + Z = m_Matrix[2] * A_ + m_Matrix[5] * B_ + m_Matrix[8] * C_; + } else { + X = A_; + Y = B_; + Z = C_; + } + XYZ_to_sRGB_WhitePoint(X, Y, Z, R, G, B, m_WhitePoint[0], m_WhitePoint[1], + m_WhitePoint[2]); + return true; +} + +bool CPDF_CalRGB::SetRGB(FX_FLOAT* pBuf, + FX_FLOAT R, + FX_FLOAT G, + FX_FLOAT B) const { + pBuf[0] = R; + pBuf[1] = G; + pBuf[2] = B; + return true; +} + +void CPDF_CalRGB::TranslateImageLine(uint8_t* pDestBuf, + const uint8_t* pSrcBuf, + int pixels, + int image_width, + int image_height, + bool bTransMask) const { + if (bTransMask) { + FX_FLOAT Cal[3]; + FX_FLOAT R; + FX_FLOAT G; + FX_FLOAT B; + for (int i = 0; i < pixels; i++) { + Cal[0] = ((FX_FLOAT)pSrcBuf[2]) / 255; + Cal[1] = ((FX_FLOAT)pSrcBuf[1]) / 255; + Cal[2] = ((FX_FLOAT)pSrcBuf[0]) / 255; + GetRGB(Cal, R, G, B); + pDestBuf[0] = FXSYS_round(B * 255); + pDestBuf[1] = FXSYS_round(G * 255); + pDestBuf[2] = FXSYS_round(R * 255); + pSrcBuf += 3; + pDestBuf += 3; + } + } + ReverseRGB(pDestBuf, pSrcBuf, pixels); +} + +CPDF_LabCS::CPDF_LabCS(CPDF_Document* pDoc) + : CPDF_ColorSpace(pDoc, PDFCS_LAB, 3) {} + +void CPDF_LabCS::GetDefaultValue(int iComponent, + FX_FLOAT& value, + FX_FLOAT& min, + FX_FLOAT& max) const { + ASSERT(iComponent < 3); + value = 0; + if (iComponent == 0) { + min = 0; + max = 100 * 1.0f; + } else { + min = m_Ranges[iComponent * 2 - 2]; + max = m_Ranges[iComponent * 2 - 1]; + if (value < min) + value = min; + else if (value > max) + value = max; + } +} + +bool CPDF_LabCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { + CPDF_Dictionary* pDict = pArray->GetDictAt(1); + if (!pDict) + return false; + + CPDF_Array* pParam = pDict->GetArrayFor("WhitePoint"); + int i; + for (i = 0; i < 3; i++) + m_WhitePoint[i] = pParam ? pParam->GetNumberAt(i) : 0; + + pParam = pDict->GetArrayFor("BlackPoint"); + for (i = 0; i < 3; i++) + m_BlackPoint[i] = pParam ? pParam->GetNumberAt(i) : 0; + + pParam = pDict->GetArrayFor("Range"); + const FX_FLOAT def_ranges[4] = {-100 * 1.0f, 100 * 1.0f, -100 * 1.0f, + 100 * 1.0f}; + for (i = 0; i < 4; i++) + m_Ranges[i] = pParam ? pParam->GetNumberAt(i) : def_ranges[i]; + return true; +} + +bool CPDF_LabCS::GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const { + FX_FLOAT Lstar = pBuf[0]; + FX_FLOAT astar = pBuf[1]; + FX_FLOAT bstar = pBuf[2]; + FX_FLOAT M = (Lstar + 16.0f) / 116.0f; + FX_FLOAT L = M + astar / 500.0f; + FX_FLOAT N = M - bstar / 200.0f; + FX_FLOAT X, Y, Z; + if (L < 0.2069f) + X = 0.957f * 0.12842f * (L - 0.1379f); + else + X = 0.957f * L * L * L; + + if (M < 0.2069f) + Y = 0.12842f * (M - 0.1379f); + else + Y = M * M * M; + + if (N < 0.2069f) + Z = 1.0889f * 0.12842f * (N - 0.1379f); + else + Z = 1.0889f * N * N * N; + + XYZ_to_sRGB(X, Y, Z, R, G, B); + return true; +} + +bool CPDF_LabCS::SetRGB(FX_FLOAT* pBuf, + FX_FLOAT R, + FX_FLOAT G, + FX_FLOAT B) const { + return false; +} + +void CPDF_LabCS::TranslateImageLine(uint8_t* pDestBuf, + const uint8_t* pSrcBuf, + int pixels, + int image_width, + int image_height, + bool bTransMask) const { + for (int i = 0; i < pixels; i++) { + FX_FLOAT lab[3]; + FX_FLOAT R, G, B; + lab[0] = (pSrcBuf[0] * 100 / 255.0f); + lab[1] = (FX_FLOAT)(pSrcBuf[1] - 128); + lab[2] = (FX_FLOAT)(pSrcBuf[2] - 128); + GetRGB(lab, R, G, B); + pDestBuf[0] = (int32_t)(B * 255); + pDestBuf[1] = (int32_t)(G * 255); + pDestBuf[2] = (int32_t)(R * 255); + pDestBuf += 3; + pSrcBuf += 3; + } +} + +CPDF_ICCBasedCS::CPDF_ICCBasedCS(CPDF_Document* pDoc) + : CPDF_ColorSpace(pDoc, PDFCS_ICCBASED, 0), + m_pProfile(nullptr), + m_pCache(nullptr), + m_pRanges(nullptr) {} + +CPDF_ICCBasedCS::~CPDF_ICCBasedCS() { + FX_Free(m_pCache); + FX_Free(m_pRanges); + if (m_pProfile && m_pDocument) + m_pDocument->GetPageData()->ReleaseIccProfile(m_pProfile); +} + +bool CPDF_ICCBasedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { + CPDF_Stream* pStream = pArray->GetStreamAt(1); + if (!pStream) + return false; + + m_pProfile = pDoc->LoadIccProfile(pStream); + if (!m_pProfile) + return false; + + // Try using the |nComponents| from ICC profile + m_nComponents = m_pProfile->GetComponents(); + CPDF_Dictionary* pDict = pStream->GetDict(); + if (!m_pProfile->m_pTransform) { // No valid ICC profile or using sRGB + CPDF_Object* pAlterCSObj = + pDict ? pDict->GetDirectObjectFor("Alternate") : nullptr; + if (pAlterCSObj) { + std::unique_ptr pAlterCS = + CPDF_ColorSpace::Load(pDoc, pAlterCSObj); + if (pAlterCS) { + if (m_nComponents == 0) { // NO valid ICC profile + if (pAlterCS->CountComponents() > 0) { // Use Alternative colorspace + m_nComponents = pAlterCS->CountComponents(); + m_pAlterCS = std::move(pAlterCS); + } else { // No valid alternative colorspace + int32_t nDictComponents = pDict ? pDict->GetIntegerFor("N") : 0; + if (nDictComponents != 1 && nDictComponents != 3 && + nDictComponents != 4) { + return false; + } + m_nComponents = nDictComponents; + } + } else { // Using sRGB + if (pAlterCS->CountComponents() == m_nComponents) + m_pAlterCS = std::move(pAlterCS); + } + } + } + if (!m_pAlterCS) { + if (m_nComponents == 1) + m_pAlterCS = GetStockCS(PDFCS_DEVICEGRAY); + else if (m_nComponents == 3) + m_pAlterCS = GetStockCS(PDFCS_DEVICERGB); + else if (m_nComponents == 4) + m_pAlterCS = GetStockCS(PDFCS_DEVICECMYK); + } + } + CPDF_Array* pRanges = pDict->GetArrayFor("Range"); + m_pRanges = FX_Alloc2D(FX_FLOAT, m_nComponents, 2); + for (uint32_t i = 0; i < m_nComponents * 2; i++) { + if (pRanges) + m_pRanges[i] = pRanges->GetNumberAt(i); + else if (i % 2) + m_pRanges[i] = 1.0f; + else + m_pRanges[i] = 0; + } + return true; +} + +bool CPDF_ICCBasedCS::GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const { + if (m_pProfile && m_pProfile->m_bsRGB) { + R = pBuf[0]; + G = pBuf[1]; + B = pBuf[2]; + return true; + } + CCodec_IccModule* pIccModule = CPDF_ModuleMgr::Get()->GetIccModule(); + if (!m_pProfile->m_pTransform || !pIccModule) { + if (m_pAlterCS) + return m_pAlterCS->GetRGB(pBuf, R, G, B); + + R = 0.0f; + G = 0.0f; + B = 0.0f; + return true; + } + FX_FLOAT rgb[3]; + pIccModule->SetComponents(m_nComponents); + pIccModule->Translate(m_pProfile->m_pTransform, pBuf, rgb); + R = rgb[0]; + G = rgb[1]; + B = rgb[2]; + return true; +} + +bool CPDF_ICCBasedCS::SetRGB(FX_FLOAT* pBuf, + FX_FLOAT R, + FX_FLOAT G, + FX_FLOAT B) const { + return false; +} + +bool CPDF_ICCBasedCS::v_GetCMYK(FX_FLOAT* pBuf, + FX_FLOAT& c, + FX_FLOAT& m, + FX_FLOAT& y, + FX_FLOAT& k) const { + if (m_nComponents != 4) + return false; + + c = pBuf[0]; + m = pBuf[1]; + y = pBuf[2]; + k = pBuf[3]; + return true; +} + +void CPDF_ICCBasedCS::EnableStdConversion(bool bEnabled) { + CPDF_ColorSpace::EnableStdConversion(bEnabled); + if (m_pAlterCS) + m_pAlterCS->EnableStdConversion(bEnabled); +} + +void CPDF_ICCBasedCS::TranslateImageLine(uint8_t* pDestBuf, + const uint8_t* pSrcBuf, + int pixels, + int image_width, + int image_height, + bool bTransMask) const { + if (m_pProfile->m_bsRGB) { + ReverseRGB(pDestBuf, pSrcBuf, pixels); + } else if (m_pProfile->m_pTransform) { + int nMaxColors = 1; + for (uint32_t i = 0; i < m_nComponents; i++) { + nMaxColors *= 52; + } + if (m_nComponents > 3 || image_width * image_height < nMaxColors * 3 / 2) { + CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline( + m_pProfile->m_pTransform, pDestBuf, pSrcBuf, pixels); + } else { + if (!m_pCache) { + ((CPDF_ICCBasedCS*)this)->m_pCache = FX_Alloc2D(uint8_t, nMaxColors, 3); + uint8_t* temp_src = FX_Alloc2D(uint8_t, nMaxColors, m_nComponents); + uint8_t* pSrc = temp_src; + for (int i = 0; i < nMaxColors; i++) { + uint32_t color = i; + uint32_t order = nMaxColors / 52; + for (uint32_t c = 0; c < m_nComponents; c++) { + *pSrc++ = (uint8_t)(color / order * 5); + color %= order; + order /= 52; + } + } + CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline( + m_pProfile->m_pTransform, m_pCache, temp_src, nMaxColors); + FX_Free(temp_src); + } + for (int i = 0; i < pixels; i++) { + int index = 0; + for (uint32_t c = 0; c < m_nComponents; c++) { + index = index * 52 + (*pSrcBuf) / 5; + pSrcBuf++; + } + index *= 3; + *pDestBuf++ = m_pCache[index]; + *pDestBuf++ = m_pCache[index + 1]; + *pDestBuf++ = m_pCache[index + 2]; + } + } + } else if (m_pAlterCS) { + m_pAlterCS->TranslateImageLine(pDestBuf, pSrcBuf, pixels, image_width, + image_height); + } +} + +CPDF_IndexedCS::CPDF_IndexedCS(CPDF_Document* pDoc) + : CPDF_ColorSpace(pDoc, PDFCS_INDEXED, 1), + m_pBaseCS(nullptr), + m_pCountedBaseCS(nullptr), + m_pCompMinMax(nullptr) {} + +CPDF_IndexedCS::~CPDF_IndexedCS() { + FX_Free(m_pCompMinMax); + CPDF_ColorSpace* pCS = m_pCountedBaseCS ? m_pCountedBaseCS->get() : nullptr; + if (pCS && m_pDocument) { + m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray()); + } +} + +bool CPDF_IndexedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { + if (pArray->GetCount() < 4) { + return false; + } + CPDF_Object* pBaseObj = pArray->GetDirectObjectAt(1); + if (pBaseObj == m_pArray) { + return false; + } + CPDF_DocPageData* pDocPageData = pDoc->GetPageData(); + m_pBaseCS = pDocPageData->GetColorSpace(pBaseObj, nullptr); + if (!m_pBaseCS) { + return false; + } + m_pCountedBaseCS = pDocPageData->FindColorSpacePtr(m_pBaseCS->GetArray()); + m_nBaseComponents = m_pBaseCS->CountComponents(); + m_pCompMinMax = FX_Alloc2D(FX_FLOAT, m_nBaseComponents, 2); + FX_FLOAT defvalue; + for (int i = 0; i < m_nBaseComponents; i++) { + m_pBaseCS->GetDefaultValue(i, defvalue, m_pCompMinMax[i * 2], + m_pCompMinMax[i * 2 + 1]); + m_pCompMinMax[i * 2 + 1] -= m_pCompMinMax[i * 2]; + } + m_MaxIndex = pArray->GetIntegerAt(2); + + CPDF_Object* pTableObj = pArray->GetDirectObjectAt(3); + if (!pTableObj) + return false; + + if (CPDF_String* pString = pTableObj->AsString()) { + m_Table = pString->GetString(); + } else if (CPDF_Stream* pStream = pTableObj->AsStream()) { + CPDF_StreamAcc acc; + acc.LoadAllData(pStream, false); + m_Table = CFX_ByteStringC(acc.GetData(), acc.GetSize()); + } + return true; +} + +bool CPDF_IndexedCS::GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const { + int index = (int32_t)(*pBuf); + if (index < 0 || index > m_MaxIndex) { + return false; + } + if (m_nBaseComponents) { + if (index == INT_MAX || (index + 1) > INT_MAX / m_nBaseComponents || + (index + 1) * m_nBaseComponents > (int)m_Table.GetLength()) { + R = G = B = 0; + return false; + } + } + CFX_FixedBufGrow Comps(m_nBaseComponents); + FX_FLOAT* comps = Comps; + const uint8_t* pTable = m_Table.raw_str(); + for (int i = 0; i < m_nBaseComponents; i++) { + comps[i] = + m_pCompMinMax[i * 2] + + m_pCompMinMax[i * 2 + 1] * pTable[index * m_nBaseComponents + i] / 255; + } + return m_pBaseCS->GetRGB(comps, R, G, B); +} + +CPDF_ColorSpace* CPDF_IndexedCS::GetBaseCS() const { + return m_pBaseCS; +} + +void CPDF_IndexedCS::EnableStdConversion(bool bEnabled) { + CPDF_ColorSpace::EnableStdConversion(bEnabled); + if (m_pBaseCS) { + m_pBaseCS->EnableStdConversion(bEnabled); + } +} + +CPDF_PatternCS::CPDF_PatternCS(CPDF_Document* pDoc) + : CPDF_ColorSpace(pDoc, PDFCS_PATTERN, 1), + m_pBaseCS(nullptr), + m_pCountedBaseCS(nullptr) {} + +CPDF_PatternCS::~CPDF_PatternCS() { + CPDF_ColorSpace* pCS = m_pCountedBaseCS ? m_pCountedBaseCS->get() : nullptr; + if (pCS && m_pDocument) { + m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray()); + } +} + +bool CPDF_PatternCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { + CPDF_Object* pBaseCS = pArray->GetDirectObjectAt(1); + if (pBaseCS == m_pArray) { + return false; + } + CPDF_DocPageData* pDocPageData = pDoc->GetPageData(); + m_pBaseCS = pDocPageData->GetColorSpace(pBaseCS, nullptr); + if (m_pBaseCS) { + if (m_pBaseCS->GetFamily() == PDFCS_PATTERN) { + return false; + } + m_pCountedBaseCS = pDocPageData->FindColorSpacePtr(m_pBaseCS->GetArray()); + m_nComponents = m_pBaseCS->CountComponents() + 1; + if (m_pBaseCS->CountComponents() > MAX_PATTERN_COLORCOMPS) { + return false; + } + } else { + m_nComponents = 1; + } + return true; +} + +bool CPDF_PatternCS::GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const { + if (m_pBaseCS) { + ASSERT(m_pBaseCS->GetFamily() != PDFCS_PATTERN); + PatternValue* pvalue = (PatternValue*)pBuf; + if (m_pBaseCS->GetRGB(pvalue->m_Comps, R, G, B)) { + return true; + } + } + R = G = B = 0.75f; + return false; +} + +CPDF_ColorSpace* CPDF_PatternCS::GetBaseCS() const { + return m_pBaseCS; +} + +CPDF_SeparationCS::CPDF_SeparationCS(CPDF_Document* pDoc) + : CPDF_ColorSpace(pDoc, PDFCS_SEPARATION, 1) {} + +CPDF_SeparationCS::~CPDF_SeparationCS() {} + +void CPDF_SeparationCS::GetDefaultValue(int iComponent, + FX_FLOAT& value, + FX_FLOAT& min, + FX_FLOAT& max) const { + value = 1.0f; + min = 0; + max = 1.0f; +} + +bool CPDF_SeparationCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { + CFX_ByteString name = pArray->GetStringAt(1); + if (name == "None") { + m_Type = None; + return true; + } + + m_Type = Colorant; + CPDF_Object* pAltCS = pArray->GetDirectObjectAt(2); + if (pAltCS == m_pArray) + return false; + + m_pAltCS = Load(pDoc, pAltCS); + if (!m_pAltCS) + return false; + + CPDF_Object* pFuncObj = pArray->GetDirectObjectAt(3); + if (pFuncObj && !pFuncObj->IsName()) + m_pFunc = CPDF_Function::Load(pFuncObj); + + if (m_pFunc && m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) + m_pFunc.reset(); + return true; +} + +bool CPDF_SeparationCS::GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const { + if (m_Type == None) + return false; + + if (!m_pFunc) { + if (!m_pAltCS) + return false; + + int nComps = m_pAltCS->CountComponents(); + CFX_FixedBufGrow results(nComps); + for (int i = 0; i < nComps; i++) + results[i] = *pBuf; + return m_pAltCS->GetRGB(results, R, G, B); + } + + CFX_FixedBufGrow results(m_pFunc->CountOutputs()); + int nresults = 0; + m_pFunc->Call(pBuf, 1, results, nresults); + if (nresults == 0) + return false; + + if (m_pAltCS) + return m_pAltCS->GetRGB(results, R, G, B); + + R = 0; + G = 0; + B = 0; + return false; +} + +void CPDF_SeparationCS::EnableStdConversion(bool bEnabled) { + CPDF_ColorSpace::EnableStdConversion(bEnabled); + if (m_pAltCS) + m_pAltCS->EnableStdConversion(bEnabled); +} + +CPDF_DeviceNCS::CPDF_DeviceNCS(CPDF_Document* pDoc) + : CPDF_ColorSpace(pDoc, PDFCS_DEVICEN, 0) {} + +CPDF_DeviceNCS::~CPDF_DeviceNCS() {} + +void CPDF_DeviceNCS::GetDefaultValue(int iComponent, + FX_FLOAT& value, + FX_FLOAT& min, + FX_FLOAT& max) const { + value = 1.0f; + min = 0; + max = 1.0f; +} + +bool CPDF_DeviceNCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { + CPDF_Array* pObj = ToArray(pArray->GetDirectObjectAt(1)); + if (!pObj) + return false; + + m_nComponents = pObj->GetCount(); + CPDF_Object* pAltCS = pArray->GetDirectObjectAt(2); + if (!pAltCS || pAltCS == m_pArray) + return false; + + m_pAltCS = Load(pDoc, pAltCS); + m_pFunc = CPDF_Function::Load(pArray->GetDirectObjectAt(3)); + if (!m_pAltCS || !m_pFunc) + return false; + + return m_pFunc->CountOutputs() >= m_pAltCS->CountComponents(); +} + +bool CPDF_DeviceNCS::GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const { + if (!m_pFunc) + return false; + + CFX_FixedBufGrow results(m_pFunc->CountOutputs()); + int nresults = 0; + m_pFunc->Call(pBuf, m_nComponents, results, nresults); + if (nresults == 0) + return false; + + return m_pAltCS->GetRGB(results, R, G, B); +} + +void CPDF_DeviceNCS::EnableStdConversion(bool bEnabled) { + CPDF_ColorSpace::EnableStdConversion(bEnabled); + if (m_pAltCS) { + m_pAltCS->EnableStdConversion(bEnabled); + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorspace.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorspace.h new file mode 100644 index 000000000000..c4d62ed84933 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorspace.h @@ -0,0 +1,118 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_COLORSPACE_H_ +#define CORE_FPDFAPI_PAGE_CPDF_COLORSPACE_H_ + +#include + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +#define PDFCS_DEVICEGRAY 1 +#define PDFCS_DEVICERGB 2 +#define PDFCS_DEVICECMYK 3 +#define PDFCS_CALGRAY 4 +#define PDFCS_CALRGB 5 +#define PDFCS_LAB 6 +#define PDFCS_ICCBASED 7 +#define PDFCS_SEPARATION 8 +#define PDFCS_DEVICEN 9 +#define PDFCS_INDEXED 10 +#define PDFCS_PATTERN 11 + +class CPDF_Array; +class CPDF_Document; +class CPDF_Object; + +class CPDF_ColorSpace { + public: + static CPDF_ColorSpace* GetStockCS(int Family); + static CPDF_ColorSpace* ColorspaceFromName(const CFX_ByteString& name); + static std::unique_ptr Load(CPDF_Document* pDoc, + CPDF_Object* pCSObj); + + void Release(); + + int GetBufSize() const; + FX_FLOAT* CreateBuf(); + void GetDefaultColor(FX_FLOAT* buf) const; + uint32_t CountComponents() const; + int GetFamily() const { return m_Family; } + virtual void GetDefaultValue(int iComponent, + FX_FLOAT& value, + FX_FLOAT& min, + FX_FLOAT& max) const; + + bool sRGB() const; + virtual bool GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const = 0; + virtual bool SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const; + + bool GetCMYK(FX_FLOAT* pBuf, + FX_FLOAT& c, + FX_FLOAT& m, + FX_FLOAT& y, + FX_FLOAT& k) const; + bool SetCMYK(FX_FLOAT* pBuf, + FX_FLOAT c, + FX_FLOAT m, + FX_FLOAT y, + FX_FLOAT k) const; + + virtual void TranslateImageLine(uint8_t* dest_buf, + const uint8_t* src_buf, + int pixels, + int image_width, + int image_height, + bool bTransMask = false) const; + + CPDF_Array*& GetArray() { return m_pArray; } + virtual CPDF_ColorSpace* GetBaseCS() const; + + virtual void EnableStdConversion(bool bEnabled); + + CPDF_Document* const m_pDocument; + + protected: + CPDF_ColorSpace(CPDF_Document* pDoc, int family, uint32_t nComponents); + virtual ~CPDF_ColorSpace(); + + virtual bool v_Load(CPDF_Document* pDoc, CPDF_Array* pArray); + virtual bool v_GetCMYK(FX_FLOAT* pBuf, + FX_FLOAT& c, + FX_FLOAT& m, + FX_FLOAT& y, + FX_FLOAT& k) const; + virtual bool v_SetCMYK(FX_FLOAT* pBuf, + FX_FLOAT c, + FX_FLOAT m, + FX_FLOAT y, + FX_FLOAT k) const; + + int m_Family; + uint32_t m_nComponents; + CPDF_Array* m_pArray; + uint32_t m_dwStdConversion; +}; + +namespace std { + +// Make std::unique_ptr call Release() rather than +// simply deleting the object. +template <> +struct default_delete { + void operator()(CPDF_ColorSpace* pColorSpace) const { + if (pColorSpace) + pColorSpace->Release(); + } +}; + +} // namespace std + +#endif // CORE_FPDFAPI_PAGE_CPDF_COLORSPACE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorstate.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorstate.cpp new file mode 100644 index 000000000000..c43a331c64f1 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorstate.cpp @@ -0,0 +1,154 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_colorstate.h" + +#include "core/fpdfapi/page/cpdf_pattern.h" +#include "core/fpdfapi/page/cpdf_tilingpattern.h" +#include "core/fxge/fx_dib.h" + +CPDF_ColorState::CPDF_ColorState() {} + +CPDF_ColorState::CPDF_ColorState(const CPDF_ColorState& that) + : m_Ref(that.m_Ref) {} + +CPDF_ColorState::~CPDF_ColorState() {} + +void CPDF_ColorState::Emplace() { + m_Ref.Emplace(); +} + +void CPDF_ColorState::SetDefault() { + m_Ref.GetPrivateCopy()->SetDefault(); +} + +uint32_t CPDF_ColorState::GetFillRGB() const { + return m_Ref.GetObject()->m_FillRGB; +} + +void CPDF_ColorState::SetFillRGB(uint32_t rgb) { + m_Ref.GetPrivateCopy()->m_FillRGB = rgb; +} + +uint32_t CPDF_ColorState::GetStrokeRGB() const { + return m_Ref.GetObject()->m_StrokeRGB; +} + +void CPDF_ColorState::SetStrokeRGB(uint32_t rgb) { + m_Ref.GetPrivateCopy()->m_StrokeRGB = rgb; +} + +const CPDF_Color* CPDF_ColorState::GetFillColor() const { + const ColorData* pData = m_Ref.GetObject(); + return pData ? &pData->m_FillColor : nullptr; +} + +CPDF_Color* CPDF_ColorState::GetMutableFillColor() { + return &m_Ref.GetPrivateCopy()->m_FillColor; +} + +bool CPDF_ColorState::HasFillColor() const { + const CPDF_Color* pColor = GetFillColor(); + return pColor && !pColor->IsNull(); +} + +const CPDF_Color* CPDF_ColorState::GetStrokeColor() const { + const ColorData* pData = m_Ref.GetObject(); + return pData ? &pData->m_StrokeColor : nullptr; +} + +CPDF_Color* CPDF_ColorState::GetMutableStrokeColor() { + return &m_Ref.GetPrivateCopy()->m_StrokeColor; +} + +bool CPDF_ColorState::HasStrokeColor() const { + const CPDF_Color* pColor = GetStrokeColor(); + return pColor && !pColor->IsNull(); +} + +void CPDF_ColorState::SetFillColor(CPDF_ColorSpace* pCS, + FX_FLOAT* pValue, + uint32_t nValues) { + ColorData* pData = m_Ref.GetPrivateCopy(); + SetColor(pData->m_FillColor, pData->m_FillRGB, pCS, pValue, nValues); +} + +void CPDF_ColorState::SetStrokeColor(CPDF_ColorSpace* pCS, + FX_FLOAT* pValue, + uint32_t nValues) { + ColorData* pData = m_Ref.GetPrivateCopy(); + SetColor(pData->m_StrokeColor, pData->m_StrokeRGB, pCS, pValue, nValues); +} + +void CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern, + FX_FLOAT* pValue, + uint32_t nValues) { + ColorData* pData = m_Ref.GetPrivateCopy(); + pData->m_FillColor.SetValue(pPattern, pValue, nValues); + int R, G, B; + bool ret = pData->m_FillColor.GetRGB(R, G, B); + if (CPDF_TilingPattern* pTilingPattern = pPattern->AsTilingPattern()) { + if (!ret && pTilingPattern->colored()) { + pData->m_FillRGB = 0x00BFBFBF; + return; + } + } + pData->m_FillRGB = ret ? FXSYS_RGB(R, G, B) : (uint32_t)-1; +} + +void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern, + FX_FLOAT* pValue, + uint32_t nValues) { + ColorData* pData = m_Ref.GetPrivateCopy(); + pData->m_StrokeColor.SetValue(pPattern, pValue, nValues); + int R, G, B; + bool ret = pData->m_StrokeColor.GetRGB(R, G, B); + if (CPDF_TilingPattern* pTilingPattern = pPattern->AsTilingPattern()) { + if (!ret && pTilingPattern->colored()) { + pData->m_StrokeRGB = 0x00BFBFBF; + return; + } + } + pData->m_StrokeRGB = + pData->m_StrokeColor.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (uint32_t)-1; +} + +void CPDF_ColorState::SetColor(CPDF_Color& color, + uint32_t& rgb, + CPDF_ColorSpace* pCS, + FX_FLOAT* pValue, + uint32_t nValues) { + if (pCS) + color.SetColorSpace(pCS); + else if (color.IsNull()) + color.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY)); + + if (color.GetColorSpace()->CountComponents() > nValues) + return; + + color.SetValue(pValue); + int R; + int G; + int B; + rgb = color.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (uint32_t)-1; +} + +CPDF_ColorState::ColorData::ColorData() : m_FillRGB(0), m_StrokeRGB(0) {} + +CPDF_ColorState::ColorData::ColorData(const ColorData& src) + : m_FillRGB(src.m_FillRGB), m_StrokeRGB(src.m_StrokeRGB) { + m_FillColor.Copy(&src.m_FillColor); + m_StrokeColor.Copy(&src.m_StrokeColor); +} + +CPDF_ColorState::ColorData::~ColorData() {} + +void CPDF_ColorState::ColorData::SetDefault() { + m_FillRGB = 0; + m_StrokeRGB = 0; + m_FillColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY)); + m_StrokeColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY)); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorstate.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorstate.h new file mode 100644 index 000000000000..49c71b66f902 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_colorstate.h @@ -0,0 +1,77 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_COLORSTATE_H_ +#define CORE_FPDFAPI_PAGE_CPDF_COLORSTATE_H_ + +#include "core/fpdfapi/page/cpdf_color.h" +#include "core/fxcrt/cfx_shared_copy_on_write.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Color; +class CPDF_ColorSpace; +class CPDF_Pattern; + +class CPDF_ColorState { + public: + CPDF_ColorState(); + CPDF_ColorState(const CPDF_ColorState& that); + ~CPDF_ColorState(); + + void Emplace(); + void SetDefault(); + + uint32_t GetFillRGB() const; + void SetFillRGB(uint32_t rgb); + + uint32_t GetStrokeRGB() const; + void SetStrokeRGB(uint32_t rgb); + + const CPDF_Color* GetFillColor() const; + CPDF_Color* GetMutableFillColor(); + bool HasFillColor() const; + + const CPDF_Color* GetStrokeColor() const; + CPDF_Color* GetMutableStrokeColor(); + bool HasStrokeColor() const; + + void SetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, uint32_t nValues); + void SetStrokeColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, uint32_t nValues); + void SetFillPattern(CPDF_Pattern* pattern, + FX_FLOAT* pValue, + uint32_t nValues); + void SetStrokePattern(CPDF_Pattern* pattern, + FX_FLOAT* pValue, + uint32_t nValues); + + explicit operator bool() const { return !!m_Ref; } + + private: + class ColorData { + public: + ColorData(); + ColorData(const ColorData& src); + ~ColorData(); + + void SetDefault(); + + uint32_t m_FillRGB; + uint32_t m_StrokeRGB; + CPDF_Color m_FillColor; + CPDF_Color m_StrokeColor; + }; + + void SetColor(CPDF_Color& color, + uint32_t& rgb, + CPDF_ColorSpace* pCS, + FX_FLOAT* pValue, + uint32_t nValues); + + CFX_SharedCopyOnWrite m_Ref; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_COLORSTATE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmark.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmark.cpp new file mode 100644 index 000000000000..07f0bd931d73 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmark.cpp @@ -0,0 +1,127 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_contentmark.h" + +#include +#include + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "third_party/base/stl_util.h" + +CPDF_ContentMark::CPDF_ContentMark() {} + +CPDF_ContentMark::CPDF_ContentMark(const CPDF_ContentMark& that) + : m_Ref(that.m_Ref) {} + +CPDF_ContentMark::~CPDF_ContentMark() {} + +void CPDF_ContentMark::SetNull() { + m_Ref.SetNull(); +} + +int CPDF_ContentMark::CountItems() const { + return m_Ref.GetObject()->CountItems(); +} + +const CPDF_ContentMarkItem& CPDF_ContentMark::GetItem(int i) const { + return m_Ref.GetObject()->GetItem(i); +} + +int CPDF_ContentMark::GetMCID() const { + const MarkData* pData = m_Ref.GetObject(); + return pData ? pData->GetMCID() : -1; +} + +void CPDF_ContentMark::AddMark(const CFX_ByteString& name, + CPDF_Dictionary* pDict, + bool bDirect) { + m_Ref.GetPrivateCopy()->AddMark(name, pDict, bDirect); +} + +void CPDF_ContentMark::DeleteLastMark() { + m_Ref.GetPrivateCopy()->DeleteLastMark(); + if (CountItems() == 0) + m_Ref.SetNull(); +} + +bool CPDF_ContentMark::HasMark(const CFX_ByteStringC& mark) const { + const MarkData* pData = m_Ref.GetObject(); + if (!pData) + return false; + + for (int i = 0; i < pData->CountItems(); i++) { + if (pData->GetItem(i).GetName() == mark) + return true; + } + return false; +} + +bool CPDF_ContentMark::LookupMark(const CFX_ByteStringC& mark, + CPDF_Dictionary*& pDict) const { + const MarkData* pData = m_Ref.GetObject(); + if (!pData) + return false; + + for (int i = 0; i < pData->CountItems(); i++) { + const CPDF_ContentMarkItem& item = pData->GetItem(i); + if (item.GetName() == mark) { + pDict = item.GetParam(); + return true; + } + } + return false; +} + +CPDF_ContentMark::MarkData::MarkData() {} + +CPDF_ContentMark::MarkData::MarkData(const MarkData& src) + : m_Marks(src.m_Marks) {} + +CPDF_ContentMark::MarkData::~MarkData() {} + +int CPDF_ContentMark::MarkData::CountItems() const { + return pdfium::CollectionSize(m_Marks); +} + +CPDF_ContentMarkItem& CPDF_ContentMark::MarkData::GetItem(int index) { + return m_Marks[index]; +} + +const CPDF_ContentMarkItem& CPDF_ContentMark::MarkData::GetItem( + int index) const { + return m_Marks[index]; +} + +int CPDF_ContentMark::MarkData::GetMCID() const { + for (const auto& mark : m_Marks) { + CPDF_Dictionary* pDict = mark.GetParam(); + if (pDict && pDict->KeyExist("MCID")) + return pDict->GetIntegerFor("MCID"); + } + return -1; +} + +void CPDF_ContentMark::MarkData::AddMark(const CFX_ByteString& name, + CPDF_Dictionary* pDict, + bool bDirect) { + CPDF_ContentMarkItem item; + item.SetName(name); + if (pDict) { + if (bDirect) { + item.SetDirectDict( + std::unique_ptr(ToDictionary(pDict->Clone()))); + } else { + item.SetPropertiesDict(pDict); + } + } + m_Marks.push_back(std::move(item)); +} + +void CPDF_ContentMark::MarkData::DeleteLastMark() { + if (!m_Marks.empty()) + m_Marks.pop_back(); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmark.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmark.h new file mode 100644 index 000000000000..154f19d52969 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmark.h @@ -0,0 +1,64 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_CONTENTMARK_H_ +#define CORE_FPDFAPI_PAGE_CPDF_CONTENTMARK_H_ + +#include + +#include "core/fpdfapi/page/cpdf_contentmarkitem.h" +#include "core/fxcrt/cfx_shared_copy_on_write.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Dictionary; + +class CPDF_ContentMark { + public: + CPDF_ContentMark(); + CPDF_ContentMark(const CPDF_ContentMark& that); + ~CPDF_ContentMark(); + + void SetNull(); + + int GetMCID() const; + int CountItems() const; + const CPDF_ContentMarkItem& GetItem(int i) const; + + bool HasMark(const CFX_ByteStringC& mark) const; + bool LookupMark(const CFX_ByteStringC& mark, CPDF_Dictionary*& pDict) const; + void AddMark(const CFX_ByteString& name, + CPDF_Dictionary* pDict, + bool bDirect); + void DeleteLastMark(); + + explicit operator bool() const { return !!m_Ref; } + + private: + class MarkData { + public: + MarkData(); + MarkData(const MarkData& src); + ~MarkData(); + + int CountItems() const; + CPDF_ContentMarkItem& GetItem(int index); + const CPDF_ContentMarkItem& GetItem(int index) const; + + int GetMCID() const; + void AddMark(const CFX_ByteString& name, + CPDF_Dictionary* pDict, + bool bDictNeedClone); + void DeleteLastMark(); + + private: + std::vector m_Marks; + }; + + CFX_SharedCopyOnWrite m_Ref; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_CONTENTMARK_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmarkitem.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmarkitem.cpp new file mode 100644 index 000000000000..2c370141e2ae --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmarkitem.cpp @@ -0,0 +1,52 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_contentmarkitem.h" + +#include + +#include "core/fpdfapi/parser/cpdf_dictionary.h" + +CPDF_ContentMarkItem::CPDF_ContentMarkItem() + : m_ParamType(None), m_pPropertiesDict(nullptr) {} + +CPDF_ContentMarkItem::CPDF_ContentMarkItem(const CPDF_ContentMarkItem& that) + : m_MarkName(that.m_MarkName), + m_ParamType(that.m_ParamType), + m_pPropertiesDict(that.m_pPropertiesDict) { + if (that.m_pDirectDict) + m_pDirectDict = ToDictionary(that.m_pDirectDict->Clone()); +} + +CPDF_ContentMarkItem::~CPDF_ContentMarkItem() {} + +CPDF_Dictionary* CPDF_ContentMarkItem::GetParam() const { + switch (m_ParamType) { + case PropertiesDict: + return m_pPropertiesDict; + case DirectDict: + return m_pDirectDict.get(); + case None: + default: + return nullptr; + } +} + +bool CPDF_ContentMarkItem::HasMCID() const { + CPDF_Dictionary* pDict = GetParam(); + return pDict && pDict->KeyExist("MCID"); +} + +void CPDF_ContentMarkItem::SetDirectDict( + std::unique_ptr pDict) { + m_ParamType = DirectDict; + m_pDirectDict = std::move(pDict); +} + +void CPDF_ContentMarkItem::SetPropertiesDict(CPDF_Dictionary* pDict) { + m_ParamType = PropertiesDict; + m_pPropertiesDict = pDict; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmarkitem.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmarkitem.h new file mode 100644 index 000000000000..ed2737111be7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentmarkitem.h @@ -0,0 +1,44 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_CONTENTMARKITEM_H_ +#define CORE_FPDFAPI_PAGE_CPDF_CONTENTMARKITEM_H_ + +#include + +#include "core/fxcrt/fx_memory.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Dictionary; + +class CPDF_ContentMarkItem { + public: + enum ParamType { None, PropertiesDict, DirectDict }; + + CPDF_ContentMarkItem(); + CPDF_ContentMarkItem(const CPDF_ContentMarkItem& that); + ~CPDF_ContentMarkItem(); + + CPDF_ContentMarkItem& operator=(CPDF_ContentMarkItem&& other) = default; + + CFX_ByteString GetName() const { return m_MarkName; } + ParamType GetParamType() const { return m_ParamType; } + CPDF_Dictionary* GetParam() const; + bool HasMCID() const; + + void SetName(const CFX_ByteString& name) { m_MarkName = name; } + void SetDirectDict(std::unique_ptr pDict); + void SetPropertiesDict(CPDF_Dictionary* pDict); + + private: + CFX_ByteString m_MarkName; + ParamType m_ParamType; + CPDF_Dictionary* m_pPropertiesDict; // not owned. + std::unique_ptr m_pDirectDict; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_CONTENTMARKITEM_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentparser.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentparser.cpp new file mode 100644 index 000000000000..7ceb509348a0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentparser.cpp @@ -0,0 +1,222 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_contentparser.h" + +#include "core/fpdfapi/font/cpdf_type3char.h" +#include "core/fpdfapi/page/cpdf_allstates.h" +#include "core/fpdfapi/page/cpdf_form.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/cpdf_path.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fxcrt/fx_safe_types.h" +#include "third_party/base/ptr_util.h" + +#define PARSE_STEP_LIMIT 100 + +CPDF_ContentParser::CPDF_ContentParser() + : m_Status(Ready), + m_InternalStage(STAGE_GETCONTENT), + m_pObjectHolder(nullptr), + m_bForm(false), + m_pType3Char(nullptr), + m_pData(nullptr), + m_Size(0), + m_CurrentOffset(0) {} + +CPDF_ContentParser::~CPDF_ContentParser() { + if (!m_pSingleStream) + FX_Free(m_pData); +} + +void CPDF_ContentParser::Start(CPDF_Page* pPage) { + if (m_Status != Ready || !pPage || !pPage->m_pDocument || + !pPage->m_pFormDict) { + m_Status = Done; + return; + } + m_pObjectHolder = pPage; + m_bForm = false; + m_Status = ToBeContinued; + m_InternalStage = STAGE_GETCONTENT; + m_CurrentOffset = 0; + + CPDF_Object* pContent = pPage->m_pFormDict->GetDirectObjectFor("Contents"); + if (!pContent) { + m_Status = Done; + return; + } + if (CPDF_Stream* pStream = pContent->AsStream()) { + m_nStreams = 0; + m_pSingleStream = pdfium::MakeUnique(); + m_pSingleStream->LoadAllData(pStream, false); + } else if (CPDF_Array* pArray = pContent->AsArray()) { + m_nStreams = pArray->GetCount(); + if (m_nStreams) + m_StreamArray.resize(m_nStreams); + else + m_Status = Done; + } else { + m_Status = Done; + } +} + +void CPDF_ContentParser::Start(CPDF_Form* pForm, + CPDF_AllStates* pGraphicStates, + const CFX_Matrix* pParentMatrix, + CPDF_Type3Char* pType3Char, + int level) { + m_pType3Char = pType3Char; + m_pObjectHolder = pForm; + m_bForm = true; + CFX_Matrix form_matrix = pForm->m_pFormDict->GetMatrixFor("Matrix"); + if (pGraphicStates) + form_matrix.Concat(pGraphicStates->m_CTM); + CPDF_Array* pBBox = pForm->m_pFormDict->GetArrayFor("BBox"); + CFX_FloatRect form_bbox; + CPDF_Path ClipPath; + if (pBBox) { + form_bbox = pBBox->GetRect(); + ClipPath.Emplace(); + ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, + form_bbox.top); + ClipPath.Transform(&form_matrix); + if (pParentMatrix) + ClipPath.Transform(pParentMatrix); + + form_matrix.TransformRect(form_bbox); + if (pParentMatrix) + pParentMatrix->TransformRect(form_bbox); + } + + CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDictFor("Resources"); + m_pParser = pdfium::MakeUnique( + pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, + pParentMatrix, pForm, pResources, &form_bbox, pGraphicStates, level); + m_pParser->GetCurStates()->m_CTM = form_matrix; + m_pParser->GetCurStates()->m_ParentMatrix = form_matrix; + if (ClipPath) { + m_pParser->GetCurStates()->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, + true); + } + if (pForm->m_Transparency & PDFTRANS_GROUP) { + CPDF_GeneralState* pState = &m_pParser->GetCurStates()->m_GeneralState; + pState->SetBlendType(FXDIB_BLEND_NORMAL); + pState->SetStrokeAlpha(1.0f); + pState->SetFillAlpha(1.0f); + pState->SetSoftMask(nullptr); + } + m_nStreams = 0; + m_pSingleStream = pdfium::MakeUnique(); + m_pSingleStream->LoadAllData(pForm->m_pFormStream, false); + m_pData = (uint8_t*)m_pSingleStream->GetData(); + m_Size = m_pSingleStream->GetSize(); + m_Status = ToBeContinued; + m_InternalStage = STAGE_PARSE; + m_CurrentOffset = 0; +} + +void CPDF_ContentParser::Continue(IFX_Pause* pPause) { + int steps = 0; + while (m_Status == ToBeContinued) { + if (m_InternalStage == STAGE_GETCONTENT) { + if (m_CurrentOffset == m_nStreams) { + if (!m_StreamArray.empty()) { + FX_SAFE_UINT32 safeSize = 0; + for (const auto& stream : m_StreamArray) { + safeSize += stream->GetSize(); + safeSize += 1; + } + if (!safeSize.IsValid()) { + m_Status = Done; + return; + } + m_Size = safeSize.ValueOrDie(); + m_pData = FX_Alloc(uint8_t, m_Size); + uint32_t pos = 0; + for (const auto& stream : m_StreamArray) { + FXSYS_memcpy(m_pData + pos, stream->GetData(), stream->GetSize()); + pos += stream->GetSize(); + m_pData[pos++] = ' '; + } + m_StreamArray.clear(); + } else { + m_pData = (uint8_t*)m_pSingleStream->GetData(); + m_Size = m_pSingleStream->GetSize(); + } + m_InternalStage = STAGE_PARSE; + m_CurrentOffset = 0; + } else { + CPDF_Array* pContent = + m_pObjectHolder->m_pFormDict->GetArrayFor("Contents"); + m_StreamArray[m_CurrentOffset] = pdfium::MakeUnique(); + CPDF_Stream* pStreamObj = ToStream( + pContent ? pContent->GetDirectObjectAt(m_CurrentOffset) : nullptr); + m_StreamArray[m_CurrentOffset]->LoadAllData(pStreamObj, false); + m_CurrentOffset++; + } + } + if (m_InternalStage == STAGE_PARSE) { + if (!m_pParser) { + m_pParser = pdfium::MakeUnique( + m_pObjectHolder->m_pDocument, m_pObjectHolder->m_pPageResources, + nullptr, nullptr, m_pObjectHolder, m_pObjectHolder->m_pResources, + &m_pObjectHolder->m_BBox, nullptr, 0); + m_pParser->GetCurStates()->m_ColorState.SetDefault(); + } + if (m_CurrentOffset >= m_Size) { + m_InternalStage = STAGE_CHECKCLIP; + } else { + m_CurrentOffset += + m_pParser->Parse(m_pData + m_CurrentOffset, + m_Size - m_CurrentOffset, PARSE_STEP_LIMIT); + } + } + if (m_InternalStage == STAGE_CHECKCLIP) { + if (m_pType3Char) { + m_pType3Char->m_bColored = m_pParser->IsColored(); + m_pType3Char->m_Width = + FXSYS_round(m_pParser->GetType3Data()[0] * 1000); + m_pType3Char->m_BBox.left = + FXSYS_round(m_pParser->GetType3Data()[2] * 1000); + m_pType3Char->m_BBox.bottom = + FXSYS_round(m_pParser->GetType3Data()[3] * 1000); + m_pType3Char->m_BBox.right = + FXSYS_round(m_pParser->GetType3Data()[4] * 1000); + m_pType3Char->m_BBox.top = + FXSYS_round(m_pParser->GetType3Data()[5] * 1000); + } + for (auto& pObj : *m_pObjectHolder->GetPageObjectList()) { + if (!pObj->m_ClipPath) + continue; + if (pObj->m_ClipPath.GetPathCount() != 1) + continue; + if (pObj->m_ClipPath.GetTextCount()) + continue; + CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0); + if (!ClipPath.IsRect() || pObj->IsShading()) + continue; + + CFX_PointF point0 = ClipPath.GetPoint(0); + CFX_PointF point2 = ClipPath.GetPoint(2); + CFX_FloatRect old_rect(point0.x, point0.y, point2.x, point2.y); + CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, + pObj->m_Top); + if (old_rect.Contains(obj_rect)) + pObj->m_ClipPath.SetNull(); + } + m_Status = Done; + return; + } + steps++; + if (pPause && pPause->NeedToPauseNow()) + break; + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentparser.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentparser.h new file mode 100644 index 000000000000..5fd11f6c0b41 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_contentparser.h @@ -0,0 +1,59 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_CONTENTPARSER_H_ +#define CORE_FPDFAPI_PAGE_CPDF_CONTENTPARSER_H_ + +#include +#include + +#include "core/fpdfapi/page/cpdf_pageobjectholder.h" +#include "core/fpdfapi/page/cpdf_streamcontentparser.h" + +class CPDF_AllStates; +class CPDF_Form; +class CPDF_Page; +class CPDF_StreamAcc; +class CPDF_Type3Char; + +class CPDF_ContentParser { + public: + enum ParseStatus { Ready, ToBeContinued, Done }; + + CPDF_ContentParser(); + ~CPDF_ContentParser(); + + ParseStatus GetStatus() const { return m_Status; } + void Start(CPDF_Page* pPage); + void Start(CPDF_Form* pForm, + CPDF_AllStates* pGraphicStates, + const CFX_Matrix* pParentMatrix, + CPDF_Type3Char* pType3Char, + int level); + void Continue(IFX_Pause* pPause); + + private: + enum InternalStage { + STAGE_GETCONTENT = 1, + STAGE_PARSE, + STAGE_CHECKCLIP, + }; + + ParseStatus m_Status; + InternalStage m_InternalStage; + CPDF_PageObjectHolder* m_pObjectHolder; + bool m_bForm; + CPDF_Type3Char* m_pType3Char; + uint32_t m_nStreams; + std::unique_ptr m_pSingleStream; + std::vector> m_StreamArray; + uint8_t* m_pData; + uint32_t m_Size; + uint32_t m_CurrentOffset; + std::unique_ptr m_pParser; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_CONTENTPARSER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_countedobject.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_countedobject.h new file mode 100644 index 000000000000..64f936c52c4b --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_countedobject.h @@ -0,0 +1,50 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_COUNTEDOBJECT_H_ +#define CORE_FPDFAPI_PAGE_CPDF_COUNTEDOBJECT_H_ + +#include + +#include "core/fpdfapi/page/cpdf_colorspace.h" +#include "core/fpdfapi/page/cpdf_pattern.h" +#include "core/fxcrt/fx_system.h" + +template +class CPDF_CountedObject { + public: + explicit CPDF_CountedObject(std::unique_ptr ptr) + : m_nCount(1), m_pObj(ptr.release()) {} + void reset(std::unique_ptr ptr) { // CAUTION: tosses prior ref counts. + m_nCount = 1; + m_pObj = ptr.release(); + } + void clear() { // Now you're all weak ptrs ... + // Guard against accidental re-entry. + T* pObj = m_pObj; + m_pObj = nullptr; + delete pObj; + } + T* get() const { return m_pObj; } + T* AddRef() { + ASSERT(m_pObj); + ++m_nCount; + return m_pObj; + } + void RemoveRef() { + if (m_nCount) + --m_nCount; + } + size_t use_count() const { return m_nCount; } + + protected: + size_t m_nCount; + T* m_pObj; +}; +using CPDF_CountedColorSpace = CPDF_CountedObject; +using CPDF_CountedPattern = CPDF_CountedObject; + +#endif // CORE_FPDFAPI_PAGE_CPDF_COUNTEDOBJECT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_docpagedata.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_docpagedata.cpp new file mode 100644 index 000000000000..af2618286e5b --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_docpagedata.cpp @@ -0,0 +1,541 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_docpagedata.h" + +#include +#include +#include +#include + +#include "core/fdrm/crypto/fx_crypt.h" +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/font/cpdf_type1font.h" +#include "core/fpdfapi/font/font_int.h" +#include "core/fpdfapi/page/cpdf_image.h" +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fpdfapi/page/cpdf_pattern.h" +#include "core/fpdfapi/page/cpdf_shadingpattern.h" +#include "core/fpdfapi/page/cpdf_tilingpattern.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "third_party/base/stl_util.h" + +CPDF_DocPageData::CPDF_DocPageData(CPDF_Document* pPDFDoc) + : m_pPDFDoc(pPDFDoc), m_bForceClear(false) {} + +CPDF_DocPageData::~CPDF_DocPageData() { + Clear(false); + Clear(true); + + for (auto& it : m_PatternMap) + delete it.second; + m_PatternMap.clear(); + + for (auto& it : m_FontMap) + delete it.second; + m_FontMap.clear(); + + for (auto& it : m_ColorSpaceMap) + delete it.second; + m_ColorSpaceMap.clear(); +} + +void CPDF_DocPageData::Clear(bool bForceRelease) { + m_bForceClear = bForceRelease; + + for (auto& it : m_PatternMap) { + CPDF_CountedPattern* ptData = it.second; + if (!ptData->get()) + continue; + + if (bForceRelease || ptData->use_count() < 2) + ptData->clear(); + } + + for (auto& it : m_FontMap) { + CPDF_CountedFont* fontData = it.second; + if (!fontData->get()) + continue; + + if (bForceRelease || fontData->use_count() < 2) { + fontData->clear(); + } + } + + for (auto& it : m_ColorSpaceMap) { + CPDF_CountedColorSpace* csData = it.second; + if (!csData->get()) + continue; + + if (bForceRelease || csData->use_count() < 2) { + csData->get()->Release(); + csData->reset(nullptr); + } + } + + for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end();) { + auto curr_it = it++; + CPDF_CountedIccProfile* ipData = curr_it->second; + if (!ipData->get()) + continue; + + if (bForceRelease || ipData->use_count() < 2) { + for (auto hash_it = m_HashProfileMap.begin(); + hash_it != m_HashProfileMap.end(); ++hash_it) { + if (curr_it->first == hash_it->second) { + m_HashProfileMap.erase(hash_it); + break; + } + } + delete ipData->get(); + delete ipData; + m_IccProfileMap.erase(curr_it); + } + } + + for (auto it = m_FontFileMap.begin(); it != m_FontFileMap.end();) { + auto curr_it = it++; + CPDF_CountedStreamAcc* pCountedFont = curr_it->second; + if (!pCountedFont->get()) + continue; + + if (bForceRelease || pCountedFont->use_count() < 2) { + delete pCountedFont->get(); + delete pCountedFont; + m_FontFileMap.erase(curr_it); + } + } + + for (auto it = m_ImageMap.begin(); it != m_ImageMap.end();) { + auto curr_it = it++; + CPDF_CountedImage* pCountedImage = curr_it->second; + if (!pCountedImage->get()) + continue; + + if (bForceRelease || pCountedImage->use_count() < 2) { + delete pCountedImage->get(); + delete pCountedImage; + m_ImageMap.erase(curr_it); + } + } +} + +CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict) { + if (!pFontDict) + return nullptr; + + CPDF_CountedFont* pFontData = nullptr; + auto it = m_FontMap.find(pFontDict); + if (it != m_FontMap.end()) { + pFontData = it->second; + if (pFontData->get()) { + return pFontData->AddRef(); + } + } + std::unique_ptr pFont = CPDF_Font::Create(m_pPDFDoc, pFontDict); + if (!pFont) + return nullptr; + + if (pFontData) { + pFontData->reset(std::move(pFont)); + } else { + pFontData = new CPDF_CountedFont(std::move(pFont)); + m_FontMap[pFontDict] = pFontData; + } + return pFontData->AddRef(); +} + +CPDF_Font* CPDF_DocPageData::GetStandardFont(const CFX_ByteString& fontName, + CPDF_FontEncoding* pEncoding) { + if (fontName.IsEmpty()) + return nullptr; + + for (auto& it : m_FontMap) { + CPDF_CountedFont* fontData = it.second; + CPDF_Font* pFont = fontData->get(); + if (!pFont) + continue; + if (pFont->GetBaseFont() != fontName) + continue; + if (pFont->IsEmbedded()) + continue; + if (!pFont->IsType1Font()) + continue; + if (pFont->GetFontDict()->KeyExist("Widths")) + continue; + + CPDF_Type1Font* pT1Font = pFont->AsType1Font(); + if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding)) + continue; + + return fontData->AddRef(); + } + + CPDF_Dictionary* pDict = m_pPDFDoc->NewIndirect(); + pDict->SetNewFor("Type", "Font"); + pDict->SetNewFor("Subtype", "Type1"); + pDict->SetNewFor("BaseFont", fontName); + if (pEncoding) { + pDict->SetFor("Encoding", + pEncoding->Realize(m_pPDFDoc->GetByteStringPool())); + } + + std::unique_ptr pFont = CPDF_Font::Create(m_pPDFDoc, pDict); + if (!pFont) + return nullptr; + + CPDF_CountedFont* fontData = new CPDF_CountedFont(std::move(pFont)); + m_FontMap[pDict] = fontData; + return fontData->AddRef(); +} + +void CPDF_DocPageData::ReleaseFont(const CPDF_Dictionary* pFontDict) { + if (!pFontDict) + return; + + auto it = m_FontMap.find(pFontDict); + if (it == m_FontMap.end()) + return; + + CPDF_CountedFont* pFontData = it->second; + if (!pFontData->get()) + return; + + pFontData->RemoveRef(); + if (pFontData->use_count() > 1) + return; + + // We have font data only in m_FontMap cache. Clean it. + pFontData->clear(); +} + +CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace( + CPDF_Object* pCSObj, + const CPDF_Dictionary* pResources) { + std::set visited; + return GetColorSpaceImpl(pCSObj, pResources, &visited); +} + +CPDF_ColorSpace* CPDF_DocPageData::GetColorSpaceImpl( + CPDF_Object* pCSObj, + const CPDF_Dictionary* pResources, + std::set* pVisited) { + if (!pCSObj) + return nullptr; + + if (pdfium::ContainsKey(*pVisited, pCSObj)) + return nullptr; + + if (pCSObj->IsName()) { + CFX_ByteString name = pCSObj->GetString(); + CPDF_ColorSpace* pCS = CPDF_ColorSpace::ColorspaceFromName(name); + if (!pCS && pResources) { + CPDF_Dictionary* pList = pResources->GetDictFor("ColorSpace"); + if (pList) { + pdfium::ScopedSetInsertion insertion(pVisited, pCSObj); + return GetColorSpaceImpl(pList->GetDirectObjectFor(name), nullptr, + pVisited); + } + } + if (!pCS || !pResources) + return pCS; + + CPDF_Dictionary* pColorSpaces = pResources->GetDictFor("ColorSpace"); + if (!pColorSpaces) + return pCS; + + CPDF_Object* pDefaultCS = nullptr; + switch (pCS->GetFamily()) { + case PDFCS_DEVICERGB: + pDefaultCS = pColorSpaces->GetDirectObjectFor("DefaultRGB"); + break; + case PDFCS_DEVICEGRAY: + pDefaultCS = pColorSpaces->GetDirectObjectFor("DefaultGray"); + break; + case PDFCS_DEVICECMYK: + pDefaultCS = pColorSpaces->GetDirectObjectFor("DefaultCMYK"); + break; + } + if (!pDefaultCS) + return pCS; + + pdfium::ScopedSetInsertion insertion(pVisited, pCSObj); + return GetColorSpaceImpl(pDefaultCS, nullptr, pVisited); + } + + CPDF_Array* pArray = pCSObj->AsArray(); + if (!pArray || pArray->IsEmpty()) + return nullptr; + + if (pArray->GetCount() == 1) { + pdfium::ScopedSetInsertion insertion(pVisited, pCSObj); + return GetColorSpaceImpl(pArray->GetDirectObjectAt(0), pResources, + pVisited); + } + + CPDF_CountedColorSpace* csData = nullptr; + auto it = m_ColorSpaceMap.find(pCSObj); + if (it != m_ColorSpaceMap.end()) { + csData = it->second; + if (csData->get()) { + return csData->AddRef(); + } + } + + std::unique_ptr pCS = + CPDF_ColorSpace::Load(m_pPDFDoc, pArray); + if (!pCS) + return nullptr; + + if (csData) { + csData->reset(std::move(pCS)); + } else { + csData = new CPDF_CountedColorSpace(std::move(pCS)); + m_ColorSpaceMap[pCSObj] = csData; + } + return csData->AddRef(); +} + +CPDF_ColorSpace* CPDF_DocPageData::GetCopiedColorSpace(CPDF_Object* pCSObj) { + if (!pCSObj) + return nullptr; + + auto it = m_ColorSpaceMap.find(pCSObj); + if (it != m_ColorSpaceMap.end()) + return it->second->AddRef(); + + return nullptr; +} + +void CPDF_DocPageData::ReleaseColorSpace(const CPDF_Object* pColorSpace) { + if (!pColorSpace) + return; + + auto it = m_ColorSpaceMap.find(pColorSpace); + if (it == m_ColorSpaceMap.end()) + return; + + CPDF_CountedColorSpace* pCountedColorSpace = it->second; + if (!pCountedColorSpace->get()) + return; + + pCountedColorSpace->RemoveRef(); + if (pCountedColorSpace->use_count() > 1) + return; + + // We have item only in m_ColorSpaceMap cache. Clean it. + pCountedColorSpace->get()->Release(); + pCountedColorSpace->reset(nullptr); +} + +CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, + bool bShading, + const CFX_Matrix& matrix) { + if (!pPatternObj) + return nullptr; + + CPDF_CountedPattern* ptData = nullptr; + auto it = m_PatternMap.find(pPatternObj); + if (it != m_PatternMap.end()) { + ptData = it->second; + if (ptData->get()) { + return ptData->AddRef(); + } + } + std::unique_ptr pPattern; + if (bShading) { + pPattern = pdfium::MakeUnique(m_pPDFDoc, pPatternObj, + true, matrix); + } else { + CPDF_Dictionary* pDict = pPatternObj ? pPatternObj->GetDict() : nullptr; + if (pDict) { + int type = pDict->GetIntegerFor("PatternType"); + if (type == CPDF_Pattern::TILING) { + pPattern = pdfium::MakeUnique(m_pPDFDoc, + pPatternObj, matrix); + } else if (type == CPDF_Pattern::SHADING) { + pPattern = pdfium::MakeUnique( + m_pPDFDoc, pPatternObj, false, matrix); + } + } + } + if (!pPattern) + return nullptr; + + if (ptData) { + ptData->reset(std::move(pPattern)); + } else { + ptData = new CPDF_CountedPattern(std::move(pPattern)); + m_PatternMap[pPatternObj] = ptData; + } + return ptData->AddRef(); +} + +void CPDF_DocPageData::ReleasePattern(const CPDF_Object* pPatternObj) { + if (!pPatternObj) + return; + + auto it = m_PatternMap.find(pPatternObj); + if (it == m_PatternMap.end()) + return; + + CPDF_CountedPattern* pPattern = it->second; + if (!pPattern->get()) + return; + + pPattern->RemoveRef(); + if (pPattern->use_count() > 1) + return; + + // We have item only in m_PatternMap cache. Clean it. + pPattern->clear(); +} + +CPDF_Image* CPDF_DocPageData::GetImage(uint32_t dwStreamObjNum) { + ASSERT(dwStreamObjNum); + auto it = m_ImageMap.find(dwStreamObjNum); + if (it != m_ImageMap.end()) + return it->second->AddRef(); + + CPDF_CountedImage* pCountedImage = new CPDF_CountedImage( + pdfium::MakeUnique(m_pPDFDoc, dwStreamObjNum)); + m_ImageMap[dwStreamObjNum] = pCountedImage; + return pCountedImage->AddRef(); +} + +void CPDF_DocPageData::ReleaseImage(uint32_t dwStreamObjNum) { + ASSERT(dwStreamObjNum); + auto it = m_ImageMap.find(dwStreamObjNum); + if (it == m_ImageMap.end()) + return; + + CPDF_CountedImage* pCountedImage = it->second; + if (!pCountedImage) + return; + + pCountedImage->RemoveRef(); + if (pCountedImage->use_count() > 1) + return; + + // We have item only in m_ImageMap cache. Clean it. + delete pCountedImage->get(); + delete pCountedImage; + m_ImageMap.erase(it); +} + +CPDF_IccProfile* CPDF_DocPageData::GetIccProfile( + CPDF_Stream* pIccProfileStream) { + if (!pIccProfileStream) + return nullptr; + + auto it = m_IccProfileMap.find(pIccProfileStream); + if (it != m_IccProfileMap.end()) + return it->second->AddRef(); + + CPDF_StreamAcc stream; + stream.LoadAllData(pIccProfileStream, false); + uint8_t digest[20]; + CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest); + CFX_ByteString bsDigest(digest, 20); + auto hash_it = m_HashProfileMap.find(bsDigest); + if (hash_it != m_HashProfileMap.end()) { + auto it_copied_stream = m_IccProfileMap.find(hash_it->second); + if (it_copied_stream != m_IccProfileMap.end()) + return it_copied_stream->second->AddRef(); + } + CPDF_CountedIccProfile* ipData = new CPDF_CountedIccProfile( + pdfium::MakeUnique(stream.GetData(), stream.GetSize())); + m_IccProfileMap[pIccProfileStream] = ipData; + m_HashProfileMap[bsDigest] = pIccProfileStream; + return ipData->AddRef(); +} + +void CPDF_DocPageData::ReleaseIccProfile(const CPDF_IccProfile* pIccProfile) { + ASSERT(pIccProfile); + + for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end(); ++it) { + CPDF_CountedIccProfile* profile = it->second; + if (profile->get() != pIccProfile) + continue; + + profile->RemoveRef(); + if (profile->use_count() > 1) + continue; + // We have item only in m_IccProfileMap cache. Clean it. + delete profile->get(); + delete profile; + m_IccProfileMap.erase(it); + return; + } +} + +CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc( + CPDF_Stream* pFontStream) { + ASSERT(pFontStream); + + auto it = m_FontFileMap.find(pFontStream); + if (it != m_FontFileMap.end()) + return it->second->AddRef(); + + CPDF_Dictionary* pFontDict = pFontStream->GetDict(); + int32_t org_size = pFontDict->GetIntegerFor("Length1") + + pFontDict->GetIntegerFor("Length2") + + pFontDict->GetIntegerFor("Length3"); + org_size = std::max(org_size, 0); + + auto pFontAcc = pdfium::MakeUnique(); + pFontAcc->LoadAllData(pFontStream, false, org_size); + + CPDF_CountedStreamAcc* pCountedFont = + new CPDF_CountedStreamAcc(std::move(pFontAcc)); + m_FontFileMap[pFontStream] = pCountedFont; + return pCountedFont->AddRef(); +} + +void CPDF_DocPageData::ReleaseFontFileStreamAcc( + const CPDF_Stream* pFontStream) { + if (!pFontStream) + return; + + auto it = m_FontFileMap.find(pFontStream); + if (it == m_FontFileMap.end()) + return; + + CPDF_CountedStreamAcc* pCountedStream = it->second; + if (!pCountedStream) + return; + + pCountedStream->RemoveRef(); + if (pCountedStream->use_count() > 1) + return; + + // We have item only in m_FontFileMap cache. Clean it. + delete pCountedStream->get(); + delete pCountedStream; + m_FontFileMap.erase(it); +} + +CPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr( + CPDF_Object* pCSObj) const { + if (!pCSObj) + return nullptr; + + auto it = m_ColorSpaceMap.find(pCSObj); + return it != m_ColorSpaceMap.end() ? it->second : nullptr; +} + +CPDF_CountedPattern* CPDF_DocPageData::FindPatternPtr( + CPDF_Object* pPatternObj) const { + if (!pPatternObj) + return nullptr; + + auto it = m_PatternMap.find(pPatternObj); + return it != m_PatternMap.end() ? it->second : nullptr; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_docpagedata.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_docpagedata.h new file mode 100644 index 000000000000..37538eb3298d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_docpagedata.h @@ -0,0 +1,85 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_DOCPAGEDATA_H_ +#define CORE_FPDFAPI_PAGE_CPDF_DOCPAGEDATA_H_ + +#include +#include + +#include "core/fpdfapi/page/cpdf_countedobject.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" + +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_Font; +class CPDF_FontEncoding; +class CPDF_IccProfile; +class CPDF_Image; +class CPDF_Object; +class CPDF_Stream; +class CPDF_StreamAcc; + +class CPDF_DocPageData { + public: + explicit CPDF_DocPageData(CPDF_Document* pPDFDoc); + ~CPDF_DocPageData(); + + void Clear(bool bRelease = false); + CPDF_Font* GetFont(CPDF_Dictionary* pFontDict); + CPDF_Font* GetStandardFont(const CFX_ByteString& fontName, + CPDF_FontEncoding* pEncoding); + void ReleaseFont(const CPDF_Dictionary* pFontDict); + CPDF_ColorSpace* GetColorSpace(CPDF_Object* pCSObj, + const CPDF_Dictionary* pResources); + CPDF_ColorSpace* GetCopiedColorSpace(CPDF_Object* pCSObj); + void ReleaseColorSpace(const CPDF_Object* pColorSpace); + CPDF_Pattern* GetPattern(CPDF_Object* pPatternObj, + bool bShading, + const CFX_Matrix& matrix); + void ReleasePattern(const CPDF_Object* pPatternObj); + CPDF_Image* GetImage(uint32_t dwStreamObjNum); + void ReleaseImage(uint32_t dwStreamObjNum); + CPDF_IccProfile* GetIccProfile(CPDF_Stream* pIccProfileStream); + void ReleaseIccProfile(const CPDF_IccProfile* pIccProfile); + CPDF_StreamAcc* GetFontFileStreamAcc(CPDF_Stream* pFontStream); + void ReleaseFontFileStreamAcc(const CPDF_Stream* pFontStream); + bool IsForceClear() const { return m_bForceClear; } + CPDF_CountedColorSpace* FindColorSpacePtr(CPDF_Object* pCSObj) const; + CPDF_CountedPattern* FindPatternPtr(CPDF_Object* pPatternObj) const; + + private: + using CPDF_CountedFont = CPDF_CountedObject; + using CPDF_CountedIccProfile = CPDF_CountedObject; + using CPDF_CountedImage = CPDF_CountedObject; + using CPDF_CountedStreamAcc = CPDF_CountedObject; + + using CPDF_ColorSpaceMap = + std::map; + using CPDF_FontFileMap = std::map; + using CPDF_FontMap = std::map; + using CPDF_IccProfileMap = + std::map; + using CPDF_ImageMap = std::map; + using CPDF_PatternMap = std::map; + + CPDF_ColorSpace* GetColorSpaceImpl(CPDF_Object* pCSObj, + const CPDF_Dictionary* pResources, + std::set* pVisited); + + CPDF_Document* const m_pPDFDoc; + bool m_bForceClear; + std::map m_HashProfileMap; + CPDF_ColorSpaceMap m_ColorSpaceMap; + CPDF_FontFileMap m_FontFileMap; + CPDF_FontMap m_FontMap; + CPDF_IccProfileMap m_IccProfileMap; + CPDF_ImageMap m_ImageMap; + CPDF_PatternMap m_PatternMap; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_DOCPAGEDATA_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_form.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_form.cpp new file mode 100644 index 000000000000..b3f2b372e331 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_form.cpp @@ -0,0 +1,54 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_form.h" + +#include "core/fpdfapi/page/cpdf_contentparser.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/cpdf_pageobjectholder.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "third_party/base/ptr_util.h" + +CPDF_Form::CPDF_Form(CPDF_Document* pDoc, + CPDF_Dictionary* pPageResources, + CPDF_Stream* pFormStream, + CPDF_Dictionary* pParentResources) { + m_pDocument = pDoc; + m_pFormStream = pFormStream; + m_pFormDict = pFormStream ? pFormStream->GetDict() : nullptr; + m_pResources = m_pFormDict->GetDictFor("Resources"); + m_pPageResources = pPageResources; + if (!m_pResources) + m_pResources = pParentResources; + if (!m_pResources) + m_pResources = pPageResources; + m_Transparency = 0; + LoadTransInfo(); +} + +CPDF_Form::~CPDF_Form() {} + +void CPDF_Form::StartParse(CPDF_AllStates* pGraphicStates, + const CFX_Matrix* pParentMatrix, + CPDF_Type3Char* pType3Char, + int level) { + if (m_ParseState == CONTENT_PARSED || m_ParseState == CONTENT_PARSING) + return; + + m_pParser = pdfium::MakeUnique(); + m_pParser->Start(this, pGraphicStates, pParentMatrix, pType3Char, level); + m_ParseState = CONTENT_PARSING; +} + +void CPDF_Form::ParseContent(CPDF_AllStates* pGraphicStates, + const CFX_Matrix* pParentMatrix, + CPDF_Type3Char* pType3Char, + int level) { + StartParse(pGraphicStates, pParentMatrix, pType3Char, level); + ContinueParse(nullptr); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_form.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_form.h new file mode 100644 index 000000000000..910f38fd0818 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_form.h @@ -0,0 +1,39 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_FORM_H_ +#define CORE_FPDFAPI_PAGE_CPDF_FORM_H_ + +#include "core/fpdfapi/page/cpdf_pageobjectholder.h" + +class CPDF_Document; +class CPDF_Dictionary; +class CPDF_Stream; +class CPDF_AllStates; +class CFX_Matrix; +class CPDF_Type3Char; + +class CPDF_Form : public CPDF_PageObjectHolder { + public: + CPDF_Form(CPDF_Document* pDocument, + CPDF_Dictionary* pPageResources, + CPDF_Stream* pFormStream, + CPDF_Dictionary* pParentResources = nullptr); + ~CPDF_Form() override; + + void ParseContent(CPDF_AllStates* pGraphicStates, + const CFX_Matrix* pParentMatrix, + CPDF_Type3Char* pType3Char, + int level = 0); + + private: + void StartParse(CPDF_AllStates* pGraphicStates, + const CFX_Matrix* pParentMatrix, + CPDF_Type3Char* pType3Char, + int level = 0); +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_FORM_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_formobject.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_formobject.cpp new file mode 100644 index 000000000000..5642a5dd01c5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_formobject.cpp @@ -0,0 +1,43 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_formobject.h" + +#include "core/fpdfapi/page/cpdf_form.h" + +CPDF_FormObject::CPDF_FormObject() {} + +CPDF_FormObject::~CPDF_FormObject() {} + +void CPDF_FormObject::Transform(const CFX_Matrix& matrix) { + m_FormMatrix.Concat(matrix); + CalcBoundingBox(); +} + +bool CPDF_FormObject::IsForm() const { + return true; +} + +CPDF_FormObject* CPDF_FormObject::AsForm() { + return this; +} + +const CPDF_FormObject* CPDF_FormObject::AsForm() const { + return this; +} + +CPDF_PageObject::Type CPDF_FormObject::GetType() const { + return FORM; +} + +void CPDF_FormObject::CalcBoundingBox() { + CFX_FloatRect form_rect = m_pForm->CalcBoundingBox(); + m_FormMatrix.TransformRect(form_rect); + m_Left = form_rect.left; + m_Bottom = form_rect.bottom; + m_Right = form_rect.right; + m_Top = form_rect.top; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_formobject.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_formobject.h new file mode 100644 index 000000000000..b13cb5fbe4c5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_formobject.h @@ -0,0 +1,36 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_FORMOBJECT_H_ +#define CORE_FPDFAPI_PAGE_CPDF_FORMOBJECT_H_ + +#include + +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fxcrt/fx_coordinates.h" + +class CPDF_Form; + +class CPDF_FormObject : public CPDF_PageObject { + public: + CPDF_FormObject(); + ~CPDF_FormObject() override; + + // CPDF_PageObject: + Type GetType() const override; + void Transform(const CFX_Matrix& matrix) override; + bool IsForm() const override; + CPDF_FormObject* AsForm() override; + const CPDF_FormObject* AsForm() const override; + + void CalcBoundingBox(); + const CPDF_Form* form() const { return m_pForm.get(); } + + std::unique_ptr m_pForm; + CFX_Matrix m_FormMatrix; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_FORMOBJECT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_generalstate.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_generalstate.cpp new file mode 100644 index 000000000000..4edd9b2a3c6f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_generalstate.cpp @@ -0,0 +1,283 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_generalstate.h" + +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/render/cpdf_dibsource.h" +#include "core/fpdfapi/render/cpdf_docrenderdata.h" +#include "core/fpdfapi/render/cpdf_transferfunc.h" + +namespace { + +int RI_StringToId(const CFX_ByteString& ri) { + uint32_t id = ri.GetID(); + if (id == FXBSTR_ID('A', 'b', 's', 'o')) + return 1; + + if (id == FXBSTR_ID('S', 'a', 't', 'u')) + return 2; + + if (id == FXBSTR_ID('P', 'e', 'r', 'c')) + return 3; + + return 0; +} + +int GetBlendTypeInternal(const CFX_ByteString& mode) { + switch (mode.GetID()) { + case FXBSTR_ID('N', 'o', 'r', 'm'): + case FXBSTR_ID('C', 'o', 'm', 'p'): + return FXDIB_BLEND_NORMAL; + case FXBSTR_ID('M', 'u', 'l', 't'): + return FXDIB_BLEND_MULTIPLY; + case FXBSTR_ID('S', 'c', 'r', 'e'): + return FXDIB_BLEND_SCREEN; + case FXBSTR_ID('O', 'v', 'e', 'r'): + return FXDIB_BLEND_OVERLAY; + case FXBSTR_ID('D', 'a', 'r', 'k'): + return FXDIB_BLEND_DARKEN; + case FXBSTR_ID('L', 'i', 'g', 'h'): + return FXDIB_BLEND_LIGHTEN; + case FXBSTR_ID('C', 'o', 'l', 'o'): + if (mode.GetLength() == 10) + return FXDIB_BLEND_COLORDODGE; + if (mode.GetLength() == 9) + return FXDIB_BLEND_COLORBURN; + return FXDIB_BLEND_COLOR; + case FXBSTR_ID('H', 'a', 'r', 'd'): + return FXDIB_BLEND_HARDLIGHT; + case FXBSTR_ID('S', 'o', 'f', 't'): + return FXDIB_BLEND_SOFTLIGHT; + case FXBSTR_ID('D', 'i', 'f', 'f'): + return FXDIB_BLEND_DIFFERENCE; + case FXBSTR_ID('E', 'x', 'c', 'l'): + return FXDIB_BLEND_EXCLUSION; + case FXBSTR_ID('H', 'u', 'e', 0): + return FXDIB_BLEND_HUE; + case FXBSTR_ID('S', 'a', 't', 'u'): + return FXDIB_BLEND_SATURATION; + case FXBSTR_ID('L', 'u', 'm', 'i'): + return FXDIB_BLEND_LUMINOSITY; + } + return FXDIB_BLEND_NORMAL; +} + +} // namespace + +CPDF_GeneralState::CPDF_GeneralState() {} + +CPDF_GeneralState::CPDF_GeneralState(const CPDF_GeneralState& that) + : m_Ref(that.m_Ref) {} + +CPDF_GeneralState::~CPDF_GeneralState() {} + +void CPDF_GeneralState::SetRenderIntent(const CFX_ByteString& ri) { + m_Ref.GetPrivateCopy()->m_RenderIntent = RI_StringToId(ri); +} + +int CPDF_GeneralState::GetBlendType() const { + const StateData* pData = m_Ref.GetObject(); + return pData ? pData->m_BlendType : FXDIB_BLEND_NORMAL; +} + +void CPDF_GeneralState::SetBlendType(int type) { + m_Ref.GetPrivateCopy()->m_BlendType = type; +} + +FX_FLOAT CPDF_GeneralState::GetFillAlpha() const { + const StateData* pData = m_Ref.GetObject(); + return pData ? pData->m_FillAlpha : 1.0f; +} + +void CPDF_GeneralState::SetFillAlpha(FX_FLOAT alpha) { + m_Ref.GetPrivateCopy()->m_FillAlpha = alpha; +} + +FX_FLOAT CPDF_GeneralState::GetStrokeAlpha() const { + const StateData* pData = m_Ref.GetObject(); + return pData ? pData->m_StrokeAlpha : 1.0f; +} + +void CPDF_GeneralState::SetStrokeAlpha(FX_FLOAT alpha) { + m_Ref.GetPrivateCopy()->m_StrokeAlpha = alpha; +} + +CPDF_Object* CPDF_GeneralState::GetSoftMask() const { + const StateData* pData = m_Ref.GetObject(); + return pData ? pData->m_pSoftMask : nullptr; +} + +void CPDF_GeneralState::SetSoftMask(CPDF_Object* pObject) { + m_Ref.GetPrivateCopy()->m_pSoftMask = pObject; +} + +CPDF_Object* CPDF_GeneralState::GetTR() const { + const StateData* pData = m_Ref.GetObject(); + return pData ? pData->m_pTR : nullptr; +} + +void CPDF_GeneralState::SetTR(CPDF_Object* pObject) { + m_Ref.GetPrivateCopy()->m_pTR = pObject; +} + +CPDF_TransferFunc* CPDF_GeneralState::GetTransferFunc() const { + const StateData* pData = m_Ref.GetObject(); + return pData ? pData->m_pTransferFunc : nullptr; +} + +void CPDF_GeneralState::SetTransferFunc(CPDF_TransferFunc* pFunc) { + m_Ref.GetPrivateCopy()->m_pTransferFunc = pFunc; +} + +void CPDF_GeneralState::SetBlendMode(const CFX_ByteString& mode) { + StateData* pData = m_Ref.GetPrivateCopy(); + pData->m_BlendMode = mode; + pData->m_BlendType = GetBlendTypeInternal(mode); +} + +const CFX_Matrix* CPDF_GeneralState::GetSMaskMatrix() const { + const StateData* pData = m_Ref.GetObject(); + return pData ? &pData->m_SMaskMatrix : nullptr; +} + +void CPDF_GeneralState::SetSMaskMatrix(const CFX_Matrix& matrix) { + m_Ref.GetPrivateCopy()->m_SMaskMatrix = matrix; +} + +bool CPDF_GeneralState::GetFillOP() const { + const StateData* pData = m_Ref.GetObject(); + return pData && pData->m_FillOP; +} + +void CPDF_GeneralState::SetFillOP(bool op) { + m_Ref.GetPrivateCopy()->m_FillOP = op; +} + +void CPDF_GeneralState::SetStrokeOP(bool op) { + m_Ref.GetPrivateCopy()->m_StrokeOP = op; +} + +bool CPDF_GeneralState::GetStrokeOP() const { + const StateData* pData = m_Ref.GetObject(); + return pData && pData->m_StrokeOP; +} + +int CPDF_GeneralState::GetOPMode() const { + return m_Ref.GetObject()->m_OPMode; +} + +void CPDF_GeneralState::SetOPMode(int mode) { + m_Ref.GetPrivateCopy()->m_OPMode = mode; +} + +void CPDF_GeneralState::SetBG(CPDF_Object* pObject) { + m_Ref.GetPrivateCopy()->m_pBG = pObject; +} + +void CPDF_GeneralState::SetUCR(CPDF_Object* pObject) { + m_Ref.GetPrivateCopy()->m_pUCR = pObject; +} + +void CPDF_GeneralState::SetHT(CPDF_Object* pObject) { + m_Ref.GetPrivateCopy()->m_pHT = pObject; +} + +void CPDF_GeneralState::SetFlatness(FX_FLOAT flatness) { + m_Ref.GetPrivateCopy()->m_Flatness = flatness; +} + +void CPDF_GeneralState::SetSmoothness(FX_FLOAT smoothness) { + m_Ref.GetPrivateCopy()->m_Smoothness = smoothness; +} + +bool CPDF_GeneralState::GetStrokeAdjust() const { + const StateData* pData = m_Ref.GetObject(); + return pData && pData->m_StrokeAdjust; +} + +void CPDF_GeneralState::SetStrokeAdjust(bool adjust) { + m_Ref.GetPrivateCopy()->m_StrokeAdjust = adjust; +} + +void CPDF_GeneralState::SetAlphaSource(bool source) { + m_Ref.GetPrivateCopy()->m_AlphaSource = source; +} + +void CPDF_GeneralState::SetTextKnockout(bool knockout) { + m_Ref.GetPrivateCopy()->m_TextKnockout = knockout; +} + +void CPDF_GeneralState::SetMatrix(const CFX_Matrix& matrix) { + m_Ref.GetPrivateCopy()->m_Matrix = matrix; +} + +CFX_Matrix* CPDF_GeneralState::GetMutableMatrix() { + return &m_Ref.GetPrivateCopy()->m_Matrix; +} + +CPDF_GeneralState::StateData::StateData() + : m_BlendMode("Normal"), + m_BlendType(0), + m_pSoftMask(nullptr), + m_StrokeAlpha(1.0), + m_FillAlpha(1.0f), + m_pTR(nullptr), + m_pTransferFunc(nullptr), + m_RenderIntent(0), + m_StrokeAdjust(false), + m_AlphaSource(false), + m_TextKnockout(false), + m_StrokeOP(false), + m_FillOP(false), + m_OPMode(0), + m_pBG(nullptr), + m_pUCR(nullptr), + m_pHT(nullptr), + m_Flatness(1.0f), + m_Smoothness(0.0f) { + m_SMaskMatrix.SetIdentity(); + m_Matrix.SetIdentity(); +} + +CPDF_GeneralState::StateData::StateData(const StateData& that) + : m_BlendMode(that.m_BlendMode), + m_BlendType(that.m_BlendType), + m_pSoftMask(that.m_pSoftMask), + m_StrokeAlpha(that.m_StrokeAlpha), + m_FillAlpha(that.m_FillAlpha), + m_pTR(that.m_pTR), + m_pTransferFunc(that.m_pTransferFunc), + m_RenderIntent(that.m_RenderIntent), + m_StrokeAdjust(that.m_StrokeAdjust), + m_AlphaSource(that.m_AlphaSource), + m_TextKnockout(that.m_TextKnockout), + m_StrokeOP(that.m_StrokeOP), + m_FillOP(that.m_FillOP), + m_OPMode(that.m_OPMode), + m_pBG(that.m_pBG), + m_pUCR(that.m_pUCR), + m_pHT(that.m_pHT), + m_Flatness(that.m_Flatness), + m_Smoothness(that.m_Smoothness) { + m_Matrix = that.m_Matrix; + m_SMaskMatrix = that.m_SMaskMatrix; + + if (that.m_pTransferFunc && that.m_pTransferFunc->m_pPDFDoc) { + CPDF_DocRenderData* pDocCache = + that.m_pTransferFunc->m_pPDFDoc->GetRenderData(); + if (pDocCache) + m_pTransferFunc = pDocCache->GetTransferFunc(m_pTR); + } +} + +CPDF_GeneralState::StateData::~StateData() { + if (m_pTransferFunc && m_pTransferFunc->m_pPDFDoc) { + CPDF_DocRenderData* pDocCache = m_pTransferFunc->m_pPDFDoc->GetRenderData(); + if (pDocCache) + pDocCache->ReleaseTransferFunc(m_pTR); + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_generalstate.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_generalstate.h new file mode 100644 index 000000000000..5211c52e5bd2 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_generalstate.h @@ -0,0 +1,109 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_GENERALSTATE_H_ +#define CORE_FPDFAPI_PAGE_CPDF_GENERALSTATE_H_ + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxge/fx_dib.h" + +class CPDF_Object; +class CPDF_TransferFunc; + +class CPDF_GeneralState { + public: + CPDF_GeneralState(); + CPDF_GeneralState(const CPDF_GeneralState& that); + ~CPDF_GeneralState(); + + void Emplace() { m_Ref.Emplace(); } + explicit operator bool() const { return !!m_Ref; } + + void SetRenderIntent(const CFX_ByteString& ri); + + int GetBlendType() const; + void SetBlendType(int type); + + FX_FLOAT GetFillAlpha() const; + void SetFillAlpha(FX_FLOAT alpha); + + FX_FLOAT GetStrokeAlpha() const; + void SetStrokeAlpha(FX_FLOAT alpha); + + CPDF_Object* GetSoftMask() const; + void SetSoftMask(CPDF_Object* pObject); + + CPDF_Object* GetTR() const; + void SetTR(CPDF_Object* pObject); + + CPDF_TransferFunc* GetTransferFunc() const; + void SetTransferFunc(CPDF_TransferFunc* pFunc); + + void SetBlendMode(const CFX_ByteString& mode); + + const CFX_Matrix* GetSMaskMatrix() const; + void SetSMaskMatrix(const CFX_Matrix& matrix); + + bool GetFillOP() const; + void SetFillOP(bool op); + + bool GetStrokeOP() const; + void SetStrokeOP(bool op); + + int GetOPMode() const; + void SetOPMode(int mode); + + void SetBG(CPDF_Object* pObject); + void SetUCR(CPDF_Object* pObject); + void SetHT(CPDF_Object* pObject); + + void SetFlatness(FX_FLOAT flatness); + void SetSmoothness(FX_FLOAT smoothness); + + bool GetStrokeAdjust() const; + void SetStrokeAdjust(bool adjust); + + void SetAlphaSource(bool source); + void SetTextKnockout(bool knockout); + + void SetMatrix(const CFX_Matrix& matrix); + CFX_Matrix* GetMutableMatrix(); + + private: + class StateData { + public: + StateData(); + StateData(const StateData& that); + ~StateData(); + + CFX_ByteString m_BlendMode; + int m_BlendType; + CPDF_Object* m_pSoftMask; + CFX_Matrix m_SMaskMatrix; + FX_FLOAT m_StrokeAlpha; + FX_FLOAT m_FillAlpha; + CPDF_Object* m_pTR; + CPDF_TransferFunc* m_pTransferFunc; + CFX_Matrix m_Matrix; + int m_RenderIntent; + bool m_StrokeAdjust; + bool m_AlphaSource; + bool m_TextKnockout; + bool m_StrokeOP; + bool m_FillOP; + int m_OPMode; + CPDF_Object* m_pBG; + CPDF_Object* m_pUCR; + CPDF_Object* m_pHT; + FX_FLOAT m_Flatness; + FX_FLOAT m_Smoothness; + }; + + CFX_SharedCopyOnWrite m_Ref; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_GENERALSTATE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_graphicstates.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_graphicstates.cpp new file mode 100644 index 000000000000..962bc0a89e2b --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_graphicstates.cpp @@ -0,0 +1,24 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_graphicstates.h" + +CPDF_GraphicStates::CPDF_GraphicStates() {} + +CPDF_GraphicStates::~CPDF_GraphicStates() {} + +void CPDF_GraphicStates::DefaultStates() { + m_ColorState.Emplace(); + m_ColorState.SetDefault(); +} + +void CPDF_GraphicStates::CopyStates(const CPDF_GraphicStates& src) { + m_ClipPath = src.m_ClipPath; + m_GraphState = src.m_GraphState; + m_ColorState = src.m_ColorState; + m_TextState = src.m_TextState; + m_GeneralState = src.m_GeneralState; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_graphicstates.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_graphicstates.h new file mode 100644 index 000000000000..b7e7fa2056c2 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_graphicstates.h @@ -0,0 +1,31 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_GRAPHICSTATES_H_ +#define CORE_FPDFAPI_PAGE_CPDF_GRAPHICSTATES_H_ + +#include "core/fpdfapi/page/cpdf_clippath.h" +#include "core/fpdfapi/page/cpdf_colorstate.h" +#include "core/fpdfapi/page/cpdf_generalstate.h" +#include "core/fpdfapi/page/cpdf_textstate.h" +#include "core/fxge/cfx_graphstate.h" + +class CPDF_GraphicStates { + public: + CPDF_GraphicStates(); + virtual ~CPDF_GraphicStates(); + + void CopyStates(const CPDF_GraphicStates& src); + void DefaultStates(); + + CPDF_ClipPath m_ClipPath; + CFX_GraphState m_GraphState; + CPDF_ColorState m_ColorState; + CPDF_TextState m_TextState; + CPDF_GeneralState m_GeneralState; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_GRAPHICSTATES_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_image.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_image.cpp new file mode 100644 index 000000000000..6b0bfd7d6d12 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_image.cpp @@ -0,0 +1,384 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_image.h" + +#include +#include +#include +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_boolean.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/render/cpdf_dibsource.h" +#include "core/fpdfapi/render/cpdf_pagerendercache.h" +#include "core/fxcodec/fx_codec.h" +#include "core/fxge/fx_dib.h" +#include "third_party/base/numerics/safe_conversions.h" +#include "third_party/base/ptr_util.h" + +CPDF_Image::CPDF_Image(CPDF_Document* pDoc) : m_pDocument(pDoc) {} + +CPDF_Image::CPDF_Image(CPDF_Document* pDoc, + std::unique_ptr pStream) + : m_bIsInline(true), + m_pDocument(pDoc), + m_pStream(std::move(pStream)), + m_pDict(ToDictionary(m_pStream->GetDict()->Clone())) { + ASSERT(m_pStream.IsOwned()); + ASSERT(m_pDict.IsOwned()); + FinishInitialization(); +} + +CPDF_Image::CPDF_Image(CPDF_Document* pDoc, uint32_t dwStreamObjNum) + : m_pDocument(pDoc), + m_pStream(ToStream(pDoc->GetIndirectObject(dwStreamObjNum))), + m_pDict(m_pStream->GetDict()) { + ASSERT(!m_pStream.IsOwned()); + ASSERT(!m_pDict.IsOwned()); + FinishInitialization(); +} + +CPDF_Image::~CPDF_Image() {} + +void CPDF_Image::FinishInitialization() { + m_pOC = m_pDict->GetDictFor("OC"); + m_bIsMask = + !m_pDict->KeyExist("ColorSpace") || m_pDict->GetIntegerFor("ImageMask"); + m_bInterpolate = !!m_pDict->GetIntegerFor("Interpolate"); + m_Height = m_pDict->GetIntegerFor("Height"); + m_Width = m_pDict->GetIntegerFor("Width"); +} + +void CPDF_Image::ConvertStreamToIndirectObject() { + if (!m_pStream->IsInline()) + return; + + ASSERT(m_pStream.IsOwned()); + m_pDocument->AddIndirectObject(m_pStream.Release()); +} + +std::unique_ptr CPDF_Image::InitJPEG(uint8_t* pData, + uint32_t size) { + int32_t width; + int32_t height; + int32_t num_comps; + int32_t bits; + bool color_trans; + if (!CPDF_ModuleMgr::Get()->GetJpegModule()->LoadInfo( + pData, size, &width, &height, &num_comps, &bits, &color_trans)) { + return nullptr; + } + + auto pDict = + pdfium::MakeUnique(m_pDocument->GetByteStringPool()); + pDict->SetNewFor("Type", "XObject"); + pDict->SetNewFor("Subtype", "Image"); + pDict->SetNewFor("Width", width); + pDict->SetNewFor("Height", height); + const FX_CHAR* csname = nullptr; + if (num_comps == 1) { + csname = "DeviceGray"; + } else if (num_comps == 3) { + csname = "DeviceRGB"; + } else if (num_comps == 4) { + csname = "DeviceCMYK"; + CPDF_Array* pDecode = pDict->SetNewFor("Decode"); + for (int n = 0; n < 4; n++) { + pDecode->AddNew(1); + pDecode->AddNew(0); + } + } + pDict->SetNewFor("ColorSpace", csname); + pDict->SetNewFor("BitsPerComponent", bits); + pDict->SetNewFor("Filter", "DCTDecode"); + if (!color_trans) { + CPDF_Dictionary* pParms = pDict->SetNewFor("DecodeParms"); + pParms->SetNewFor("ColorTransform", 0); + } + m_bIsMask = false; + m_Width = width; + m_Height = height; + if (!m_pStream) + m_pStream = pdfium::MakeUnique(); + return pDict; +} + +void CPDF_Image::SetJpegImage( + const CFX_RetainPtr& pFile) { + uint32_t size = pdfium::base::checked_cast(pFile->GetSize()); + if (!size) + return; + + uint32_t dwEstimateSize = std::min(size, 8192U); + std::vector data(dwEstimateSize); + if (!pFile->ReadBlock(data.data(), 0, dwEstimateSize)) + return; + + std::unique_ptr pDict = + InitJPEG(data.data(), dwEstimateSize); + if (!pDict && size > dwEstimateSize) { + data.resize(size); + pFile->ReadBlock(data.data(), 0, size); + pDict = InitJPEG(data.data(), size); + } + if (!pDict) + return; + + m_pStream->InitStreamFromFile(pFile, std::move(pDict)); +} + +void CPDF_Image::SetJpegImageInline( + const CFX_RetainPtr& pFile) { + uint32_t size = pdfium::base::checked_cast(pFile->GetSize()); + if (!size) + return; + + std::vector data(size); + if (!pFile->ReadBlock(data.data(), 0, size)) + return; + + std::unique_ptr pDict = InitJPEG(data.data(), size); + if (!pDict) + return; + + m_pStream->InitStream(&(data[0]), size, std::move(pDict)); +} + +void CPDF_Image::SetImage(const CFX_DIBitmap* pBitmap) { + int32_t BitmapWidth = pBitmap->GetWidth(); + int32_t BitmapHeight = pBitmap->GetHeight(); + if (BitmapWidth < 1 || BitmapHeight < 1) + return; + + auto pDict = + pdfium::MakeUnique(m_pDocument->GetByteStringPool()); + pDict->SetNewFor("Type", "XObject"); + pDict->SetNewFor("Subtype", "Image"); + pDict->SetNewFor("Width", BitmapWidth); + pDict->SetNewFor("Height", BitmapHeight); + + const int32_t bpp = pBitmap->GetBPP(); + FX_STRSIZE dest_pitch = 0; + bool bCopyWithoutAlpha = true; + if (bpp == 1) { + int32_t reset_a = 0; + int32_t reset_r = 0; + int32_t reset_g = 0; + int32_t reset_b = 0; + int32_t set_a = 0; + int32_t set_r = 0; + int32_t set_g = 0; + int32_t set_b = 0; + if (!pBitmap->IsAlphaMask()) { + ArgbDecode(pBitmap->GetPaletteArgb(0), reset_a, reset_r, reset_g, + reset_b); + ArgbDecode(pBitmap->GetPaletteArgb(1), set_a, set_r, set_g, set_b); + } + if (set_a == 0 || reset_a == 0) { + pDict->SetNewFor("ImageMask", true); + if (reset_a == 0) { + CPDF_Array* pArray = pDict->SetNewFor("Decode"); + pArray->AddNew(1); + pArray->AddNew(0); + } + } else { + CPDF_Array* pCS = pDict->SetNewFor("ColorSpace"); + pCS->AddNew("Indexed"); + pCS->AddNew("DeviceRGB"); + pCS->AddNew(1); + CFX_ByteString ct; + FX_CHAR* pBuf = ct.GetBuffer(6); + pBuf[0] = (FX_CHAR)reset_r; + pBuf[1] = (FX_CHAR)reset_g; + pBuf[2] = (FX_CHAR)reset_b; + pBuf[3] = (FX_CHAR)set_r; + pBuf[4] = (FX_CHAR)set_g; + pBuf[5] = (FX_CHAR)set_b; + ct.ReleaseBuffer(6); + pCS->AddNew(ct, true); + } + pDict->SetNewFor("BitsPerComponent", 1); + dest_pitch = (BitmapWidth + 7) / 8; + } else if (bpp == 8) { + int32_t iPalette = pBitmap->GetPaletteSize(); + if (iPalette > 0) { + CPDF_Array* pCS = m_pDocument->NewIndirect(); + pCS->AddNew("Indexed"); + pCS->AddNew("DeviceRGB"); + pCS->AddNew(iPalette - 1); + std::unique_ptr pColorTable( + FX_Alloc2D(uint8_t, iPalette, 3)); + uint8_t* ptr = pColorTable.get(); + for (int32_t i = 0; i < iPalette; i++) { + uint32_t argb = pBitmap->GetPaletteArgb(i); + ptr[0] = (uint8_t)(argb >> 16); + ptr[1] = (uint8_t)(argb >> 8); + ptr[2] = (uint8_t)argb; + ptr += 3; + } + auto pNewDict = + pdfium::MakeUnique(m_pDocument->GetByteStringPool()); + CPDF_Stream* pCTS = m_pDocument->NewIndirect( + std::move(pColorTable), iPalette * 3, std::move(pNewDict)); + pCS->AddNew(m_pDocument, pCTS->GetObjNum()); + pDict->SetNewFor("ColorSpace", m_pDocument, + pCS->GetObjNum()); + } else { + pDict->SetNewFor("ColorSpace", "DeviceGray"); + } + pDict->SetNewFor("BitsPerComponent", 8); + dest_pitch = BitmapWidth; + } else { + pDict->SetNewFor("ColorSpace", "DeviceRGB"); + pDict->SetNewFor("BitsPerComponent", 8); + dest_pitch = BitmapWidth * 3; + bCopyWithoutAlpha = false; + } + + std::unique_ptr pMaskBitmap; + if (pBitmap->HasAlpha()) + pMaskBitmap = pBitmap->CloneAlphaMask(); + + if (pMaskBitmap) { + int32_t maskWidth = pMaskBitmap->GetWidth(); + int32_t maskHeight = pMaskBitmap->GetHeight(); + std::unique_ptr mask_buf; + FX_STRSIZE mask_size = 0; + auto pMaskDict = + pdfium::MakeUnique(m_pDocument->GetByteStringPool()); + pMaskDict->SetNewFor("Type", "XObject"); + pMaskDict->SetNewFor("Subtype", "Image"); + pMaskDict->SetNewFor("Width", maskWidth); + pMaskDict->SetNewFor("Height", maskHeight); + pMaskDict->SetNewFor("ColorSpace", "DeviceGray"); + pMaskDict->SetNewFor("BitsPerComponent", 8); + if (pMaskBitmap->GetFormat() != FXDIB_1bppMask) { + mask_buf.reset(FX_Alloc2D(uint8_t, maskHeight, maskWidth)); + mask_size = maskHeight * maskWidth; // Safe since checked alloc returned. + for (int32_t a = 0; a < maskHeight; a++) { + FXSYS_memcpy(mask_buf.get() + a * maskWidth, + pMaskBitmap->GetScanline(a), maskWidth); + } + } + pMaskDict->SetNewFor("Length", mask_size); + CPDF_Stream* pNewStream = m_pDocument->NewIndirect( + std::move(mask_buf), mask_size, std::move(pMaskDict)); + pDict->SetNewFor("SMask", m_pDocument, + pNewStream->GetObjNum()); + } + + uint8_t* src_buf = pBitmap->GetBuffer(); + int32_t src_pitch = pBitmap->GetPitch(); + uint8_t* dest_buf = FX_Alloc2D(uint8_t, dest_pitch, BitmapHeight); + // Safe as checked alloc returned. + FX_STRSIZE dest_size = dest_pitch * BitmapHeight; + uint8_t* pDest = dest_buf; + if (bCopyWithoutAlpha) { + for (int32_t i = 0; i < BitmapHeight; i++) { + FXSYS_memcpy(pDest, src_buf, dest_pitch); + pDest += dest_pitch; + src_buf += src_pitch; + } + } else { + int32_t src_offset = 0; + int32_t dest_offset = 0; + for (int32_t row = 0; row < BitmapHeight; row++) { + src_offset = row * src_pitch; + for (int32_t column = 0; column < BitmapWidth; column++) { + FX_FLOAT alpha = 1; + pDest[dest_offset] = (uint8_t)(src_buf[src_offset + 2] * alpha); + pDest[dest_offset + 1] = (uint8_t)(src_buf[src_offset + 1] * alpha); + pDest[dest_offset + 2] = (uint8_t)(src_buf[src_offset] * alpha); + dest_offset += 3; + src_offset += bpp == 24 ? 3 : 4; + } + + pDest += dest_pitch; + dest_offset = 0; + } + } + if (!m_pStream) + m_pStream = pdfium::MakeUnique(); + + m_pStream->InitStream(dest_buf, dest_size, std::move(pDict)); + m_bIsMask = pBitmap->IsAlphaMask(); + m_Width = BitmapWidth; + m_Height = BitmapHeight; + FX_Free(dest_buf); +} + +void CPDF_Image::ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pBitmap) { + pPage->GetRenderCache()->ResetBitmap(m_pStream.Get(), pBitmap); +} + +std::unique_ptr CPDF_Image::LoadDIBSource() const { + auto source = pdfium::MakeUnique(); + if (!source->Load(m_pDocument, m_pStream.Get())) + return nullptr; + + return std::move(source); +} + +CFX_DIBSource* CPDF_Image::DetachBitmap() { + CFX_DIBSource* pBitmap = m_pDIBSource; + m_pDIBSource = nullptr; + return pBitmap; +} + +CFX_DIBSource* CPDF_Image::DetachMask() { + CFX_DIBSource* pBitmap = m_pMask; + m_pMask = nullptr; + return pBitmap; +} + +bool CPDF_Image::StartLoadDIBSource(CPDF_Dictionary* pFormResource, + CPDF_Dictionary* pPageResource, + bool bStdCS, + uint32_t GroupFamily, + bool bLoadMask) { + auto source = pdfium::MakeUnique(); + int ret = source->StartLoadDIBSource(m_pDocument, m_pStream.Get(), true, + pFormResource, pPageResource, bStdCS, + GroupFamily, bLoadMask); + if (ret == 2) { + m_pDIBSource = source.release(); + return true; + } + if (!ret) { + m_pDIBSource = nullptr; + return false; + } + m_pMask = source->DetachMask(); + m_MatteColor = source->GetMatteColor(); + m_pDIBSource = source.release(); + return false; +} + +bool CPDF_Image::Continue(IFX_Pause* pPause) { + CPDF_DIBSource* pSource = static_cast(m_pDIBSource); + int ret = pSource->ContinueLoadDIBSource(pPause); + if (ret == 2) { + return true; + } + if (!ret) { + delete m_pDIBSource; + m_pDIBSource = nullptr; + return false; + } + m_pMask = pSource->DetachMask(); + m_MatteColor = pSource->GetMatteColor(); + return false; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_image.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_image.h new file mode 100644 index 000000000000..190949810269 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_image.h @@ -0,0 +1,83 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_IMAGE_H_ +#define CORE_FPDFAPI_PAGE_CPDF_IMAGE_H_ + +#include + +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxcrt/fx_system.h" + +class CFX_DIBSource; +class CFX_DIBitmap; +class CPDF_Document; +class CPDF_Page; +class IFX_Pause; +class IFX_SeekableReadStream; + +class CPDF_Image { + public: + explicit CPDF_Image(CPDF_Document* pDoc); + CPDF_Image(CPDF_Document* pDoc, std::unique_ptr pStream); + CPDF_Image(CPDF_Document* pDoc, uint32_t dwStreamObjNum); + ~CPDF_Image(); + + void ConvertStreamToIndirectObject(); + + CPDF_Dictionary* GetInlineDict() const { return m_pDict.Get(); } + CPDF_Stream* GetStream() const { return m_pStream.Get(); } + CPDF_Dictionary* GetDict() const { + return m_pStream ? m_pStream->GetDict() : nullptr; + } + CPDF_Dictionary* GetOC() const { return m_pOC; } + CPDF_Document* GetDocument() const { return m_pDocument; } + + int32_t GetPixelHeight() const { return m_Height; } + int32_t GetPixelWidth() const { return m_Width; } + + bool IsInline() const { return m_bIsInline; } + bool IsMask() const { return m_bIsMask; } + bool IsInterpol() const { return m_bInterpolate; } + + std::unique_ptr LoadDIBSource() const; + + void SetImage(const CFX_DIBitmap* pDIBitmap); + void SetJpegImage(const CFX_RetainPtr& pFile); + void SetJpegImageInline(const CFX_RetainPtr& pFile); + + void ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pDIBitmap); + + bool StartLoadDIBSource(CPDF_Dictionary* pFormResource, + CPDF_Dictionary* pPageResource, + bool bStdCS = false, + uint32_t GroupFamily = 0, + bool bLoadMask = false); + bool Continue(IFX_Pause* pPause); + CFX_DIBSource* DetachBitmap(); + CFX_DIBSource* DetachMask(); + + CFX_DIBSource* m_pDIBSource = nullptr; + CFX_DIBSource* m_pMask = nullptr; + uint32_t m_MatteColor = 0; + + private: + void FinishInitialization(); + std::unique_ptr InitJPEG(uint8_t* pData, uint32_t size); + + int32_t m_Height = 0; + int32_t m_Width = 0; + bool m_bIsInline = false; + bool m_bIsMask = false; + bool m_bInterpolate = false; + CPDF_Document* const m_pDocument; + CFX_MaybeOwned m_pStream; + CFX_MaybeOwned m_pDict; + CPDF_Dictionary* m_pOC = nullptr; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_IMAGE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_imageobject.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_imageobject.cpp new file mode 100644 index 000000000000..01d2df742173 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_imageobject.cpp @@ -0,0 +1,77 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_imageobject.h" + +#include + +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/page/cpdf_image.h" +#include "core/fpdfapi/parser/cpdf_document.h" + +CPDF_ImageObject::CPDF_ImageObject() + : m_pImage(nullptr), m_pImageOwned(false) {} + +CPDF_ImageObject::~CPDF_ImageObject() { + Release(); +} + +CPDF_PageObject::Type CPDF_ImageObject::GetType() const { + return IMAGE; +} + +void CPDF_ImageObject::Transform(const CFX_Matrix& matrix) { + m_Matrix.Concat(matrix); + CalcBoundingBox(); +} + +bool CPDF_ImageObject::IsImage() const { + return true; +} + +CPDF_ImageObject* CPDF_ImageObject::AsImage() { + return this; +} + +const CPDF_ImageObject* CPDF_ImageObject::AsImage() const { + return this; +} + +void CPDF_ImageObject::CalcBoundingBox() { + m_Left = 0; + m_Bottom = 0; + m_Right = 1.0f; + m_Top = 1.0f; + m_Matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom); +} + +void CPDF_ImageObject::SetOwnedImage(std::unique_ptr pImage) { + Release(); + m_pImage = pImage.release(); + m_pImageOwned = true; +} + +void CPDF_ImageObject::SetUnownedImage(CPDF_Image* pImage) { + Release(); + m_pImage = pImage; + m_pImageOwned = false; +} + +void CPDF_ImageObject::Release() { + if (m_pImageOwned) { + delete m_pImage; + m_pImage = nullptr; + m_pImageOwned = false; + return; + } + + if (!m_pImage) + return; + + CPDF_DocPageData* pPageData = m_pImage->GetDocument()->GetPageData(); + pPageData->ReleaseImage(m_pImage->GetStream()->GetObjNum()); + m_pImage = nullptr; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_imageobject.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_imageobject.h new file mode 100644 index 000000000000..1bbfc0509cd2 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_imageobject.h @@ -0,0 +1,45 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_IMAGEOBJECT_H_ +#define CORE_FPDFAPI_PAGE_CPDF_IMAGEOBJECT_H_ + +#include + +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fxcrt/fx_coordinates.h" + +class CPDF_Image; + +class CPDF_ImageObject : public CPDF_PageObject { + public: + CPDF_ImageObject(); + ~CPDF_ImageObject() override; + + // CPDF_PageObject + Type GetType() const override; + void Transform(const CFX_Matrix& matrix) override; + bool IsImage() const override; + CPDF_ImageObject* AsImage() override; + const CPDF_ImageObject* AsImage() const override; + + void CalcBoundingBox(); + CPDF_Image* GetImage() const { return m_pImage; } + void SetOwnedImage(std::unique_ptr pImage); + void SetUnownedImage(CPDF_Image* pImage); + + void set_matrix(const CFX_Matrix& matrix) { m_Matrix = matrix; } + const CFX_Matrix& matrix() const { return m_Matrix; } + + private: + void Release(); + + CFX_Matrix m_Matrix; + CPDF_Image* m_pImage; + bool m_pImageOwned; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_IMAGEOBJECT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_meshstream.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_meshstream.cpp new file mode 100644 index 000000000000..24ef9b271e22 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_meshstream.cpp @@ -0,0 +1,257 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_meshstream.h" + +#include "core/fpdfapi/page/cpdf_colorspace.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_array.h" + +namespace { + +// See PDF Reference 1.7, page 315, table 4.32. (Also table 4.33 and 4.34) +bool ShouldCheckBPC(ShadingType type) { + switch (type) { + case kFreeFormGouraudTriangleMeshShading: + case kLatticeFormGouraudTriangleMeshShading: + case kCoonsPatchMeshShading: + case kTensorProductPatchMeshShading: + return true; + default: + return false; + } +} + +// Same references as ShouldCheckBPC() above. +bool IsValidBitsPerComponent(uint32_t x) { + switch (x) { + case 1: + case 2: + case 4: + case 8: + case 12: + case 16: + return true; + default: + return false; + } +} + +// Same references as ShouldCheckBPC() above. +bool IsValidBitsPerCoordinate(uint32_t x) { + switch (x) { + case 1: + case 2: + case 4: + case 8: + case 12: + case 16: + case 24: + case 32: + return true; + default: + return false; + } +} + +// See PDF Reference 1.7, page 315, table 4.32. (Also table 4.34) +bool ShouldCheckBitsPerFlag(ShadingType type) { + switch (type) { + case kFreeFormGouraudTriangleMeshShading: + case kCoonsPatchMeshShading: + case kTensorProductPatchMeshShading: + return true; + default: + return false; + } +} + +// Same references as ShouldCheckBitsPerFlag() above. +bool IsValidBitsPerFlag(uint32_t x) { + switch (x) { + case 2: + case 4: + case 8: + return true; + default: + return false; + } +} + +} // namespace + +CPDF_MeshVertex::CPDF_MeshVertex() = default; + +CPDF_MeshVertex::CPDF_MeshVertex(const CPDF_MeshVertex&) = default; + +CPDF_MeshVertex::~CPDF_MeshVertex() = default; + +CPDF_MeshStream::CPDF_MeshStream( + ShadingType type, + const std::vector>& funcs, + CPDF_Stream* pShadingStream, + CPDF_ColorSpace* pCS) + : m_type(type), + m_funcs(funcs), + m_pShadingStream(pShadingStream), + m_pCS(pCS), + m_nCoordBits(0), + m_nComponentBits(0), + m_nFlagBits(0), + m_nComponents(0), + m_CoordMax(0), + m_ComponentMax(0), + m_xmin(0), + m_xmax(0), + m_ymin(0), + m_ymax(0) { + memset(&m_ColorMin, 0, sizeof(m_ColorMin)); + memset(&m_ColorMax, 0, sizeof(m_ColorMax)); +} + +bool CPDF_MeshStream::Load() { + m_Stream.LoadAllData(m_pShadingStream); + m_BitStream.Init(m_Stream.GetData(), m_Stream.GetSize()); + CPDF_Dictionary* pDict = m_pShadingStream->GetDict(); + m_nCoordBits = pDict->GetIntegerFor("BitsPerCoordinate"); + m_nComponentBits = pDict->GetIntegerFor("BitsPerComponent"); + if (ShouldCheckBPC(m_type)) { + if (!IsValidBitsPerCoordinate(m_nCoordBits)) + return false; + if (!IsValidBitsPerComponent(m_nComponentBits)) + return false; + } + + m_nFlagBits = pDict->GetIntegerFor("BitsPerFlag"); + if (ShouldCheckBitsPerFlag(m_type) && !IsValidBitsPerFlag(m_nFlagBits)) + return false; + + uint32_t nComponents = m_pCS->CountComponents(); + if (nComponents > kMaxComponents) + return false; + + m_nComponents = m_funcs.empty() ? nComponents : 1; + CPDF_Array* pDecode = pDict->GetArrayFor("Decode"); + if (!pDecode || pDecode->GetCount() != 4 + m_nComponents * 2) + return false; + + m_xmin = pDecode->GetNumberAt(0); + m_xmax = pDecode->GetNumberAt(1); + m_ymin = pDecode->GetNumberAt(2); + m_ymax = pDecode->GetNumberAt(3); + for (uint32_t i = 0; i < m_nComponents; ++i) { + m_ColorMin[i] = pDecode->GetNumberAt(i * 2 + 4); + m_ColorMax[i] = pDecode->GetNumberAt(i * 2 + 5); + } + + if (ShouldCheckBPC(m_type)) { + m_CoordMax = m_nCoordBits == 32 ? -1 : (1 << m_nCoordBits) - 1; + m_ComponentMax = (1 << m_nComponentBits) - 1; + } + return true; +} + +bool CPDF_MeshStream::CanReadFlag() const { + return m_BitStream.BitsRemaining() >= m_nFlagBits; +} + +bool CPDF_MeshStream::CanReadCoords() const { + return m_BitStream.BitsRemaining() / 2 >= m_nCoordBits; +} + +bool CPDF_MeshStream::CanReadColor() const { + return m_BitStream.BitsRemaining() / m_nComponentBits >= m_nComponents; +} + +uint32_t CPDF_MeshStream::ReadFlag() { + ASSERT(ShouldCheckBitsPerFlag(m_type)); + return m_BitStream.GetBits(m_nFlagBits) & 0x03; +} + +CFX_PointF CPDF_MeshStream::ReadCoords() { + ASSERT(ShouldCheckBPC(m_type)); + + CFX_PointF pos; + if (m_nCoordBits == 32) { + pos.x = m_xmin + + m_BitStream.GetBits(m_nCoordBits) * (m_xmax - m_xmin) / + static_cast(m_CoordMax); + pos.y = m_ymin + + m_BitStream.GetBits(m_nCoordBits) * (m_ymax - m_ymin) / + static_cast(m_CoordMax); + } else { + pos.x = m_xmin + + m_BitStream.GetBits(m_nCoordBits) * (m_xmax - m_xmin) / m_CoordMax; + pos.y = m_ymin + + m_BitStream.GetBits(m_nCoordBits) * (m_ymax - m_ymin) / m_CoordMax; + } + return pos; +} + +std::tuple CPDF_MeshStream::ReadColor() { + ASSERT(ShouldCheckBPC(m_type)); + + FX_FLOAT color_value[kMaxComponents]; + for (uint32_t i = 0; i < m_nComponents; ++i) { + color_value[i] = m_ColorMin[i] + + m_BitStream.GetBits(m_nComponentBits) * + (m_ColorMax[i] - m_ColorMin[i]) / m_ComponentMax; + } + + FX_FLOAT r; + FX_FLOAT g; + FX_FLOAT b; + if (m_funcs.empty()) { + m_pCS->GetRGB(color_value, r, g, b); + return std::tuple(r, g, b); + } + + FX_FLOAT result[kMaxComponents]; + FXSYS_memset(result, 0, sizeof(result)); + int nResults; + for (const auto& func : m_funcs) { + if (func && func->CountOutputs() <= kMaxComponents) + func->Call(color_value, 1, result, nResults); + } + + m_pCS->GetRGB(result, r, g, b); + return std::tuple(r, g, b); +} + +bool CPDF_MeshStream::ReadVertex(const CFX_Matrix& pObject2Bitmap, + CPDF_MeshVertex* vertex, + uint32_t* flag) { + if (!CanReadFlag()) + return false; + *flag = ReadFlag(); + + if (!CanReadCoords()) + return false; + vertex->position = pObject2Bitmap.Transform(ReadCoords()); + + if (!CanReadColor()) + return false; + std::tie(vertex->r, vertex->g, vertex->b) = ReadColor(); + m_BitStream.ByteAlign(); + return true; +} + +bool CPDF_MeshStream::ReadVertexRow(const CFX_Matrix& pObject2Bitmap, + int count, + CPDF_MeshVertex* vertex) { + for (int i = 0; i < count; i++) { + if (m_BitStream.IsEOF() || !CanReadCoords()) + return false; + + vertex[i].position = pObject2Bitmap.Transform(ReadCoords()); + if (!CanReadColor()) + return false; + + std::tie(vertex[i].r, vertex[i].g, vertex[i].b) = ReadColor(); + m_BitStream.ByteAlign(); + } + return true; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_meshstream.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_meshstream.h new file mode 100644 index 000000000000..d40de4a013d2 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_meshstream.h @@ -0,0 +1,87 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_MESHSTREAM_H_ +#define CORE_FPDFAPI_PAGE_CPDF_MESHSTREAM_H_ + +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_shadingpattern.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_MeshVertex { + public: + CPDF_MeshVertex(); + CPDF_MeshVertex(const CPDF_MeshVertex&); + ~CPDF_MeshVertex(); + + CFX_PointF position; + FX_FLOAT r; + FX_FLOAT g; + FX_FLOAT b; +}; + +class CFX_Matrix; +class CPDF_ColorSpace; +class CPDF_Function; +class CPDF_Stream; + +class CPDF_MeshStream { + public: + CPDF_MeshStream(ShadingType type, + const std::vector>& funcs, + CPDF_Stream* pShadingStream, + CPDF_ColorSpace* pCS); + + bool Load(); + + bool CanReadFlag() const; + bool CanReadCoords() const; + bool CanReadColor() const; + + uint32_t ReadFlag(); + CFX_PointF ReadCoords(); + std::tuple ReadColor(); + + bool ReadVertex(const CFX_Matrix& pObject2Bitmap, + CPDF_MeshVertex* vertex, + uint32_t* flag); + bool ReadVertexRow(const CFX_Matrix& pObject2Bitmap, + int count, + CPDF_MeshVertex* vertex); + + CFX_BitStream* BitStream() { return &m_BitStream; } + uint32_t ComponentBits() const { return m_nComponentBits; } + uint32_t Components() const { return m_nComponents; } + + private: + static const uint32_t kMaxComponents = 8; + + const ShadingType m_type; + const std::vector>& m_funcs; + CPDF_Stream* const m_pShadingStream; + CPDF_ColorSpace* const m_pCS; + uint32_t m_nCoordBits; + uint32_t m_nComponentBits; + uint32_t m_nFlagBits; + uint32_t m_nComponents; + uint32_t m_CoordMax; + uint32_t m_ComponentMax; + FX_FLOAT m_xmin; + FX_FLOAT m_xmax; + FX_FLOAT m_ymin; + FX_FLOAT m_ymax; + FX_FLOAT m_ColorMin[kMaxComponents]; + FX_FLOAT m_ColorMax[kMaxComponents]; + CPDF_StreamAcc m_Stream; + CFX_BitStream m_BitStream; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_MESHSTREAM_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_page.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_page.cpp new file mode 100644 index 000000000000..46123ab42ebf --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_page.cpp @@ -0,0 +1,187 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_page.h" + +#include +#include + +#include "core/fpdfapi/cpdf_pagerendercontext.h" +#include "core/fpdfapi/page/cpdf_contentparser.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/render/cpdf_pagerendercache.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +CPDF_Page::CPDF_Page(CPDF_Document* pDocument, + CPDF_Dictionary* pPageDict, + bool bPageCache) + : m_PageWidth(100), + m_PageHeight(100), + m_pView(nullptr), + m_pPageRender(bPageCache ? new CPDF_PageRenderCache(this) : nullptr) { + m_pFormDict = pPageDict; + m_pDocument = pDocument; + if (!pPageDict) + return; + + CPDF_Object* pageAttr = GetPageAttr("Resources"); + m_pResources = pageAttr ? pageAttr->GetDict() : nullptr; + m_pPageResources = m_pResources; + CPDF_Object* pRotate = GetPageAttr("Rotate"); + int rotate = pRotate ? pRotate->GetInteger() / 90 % 4 : 0; + if (rotate < 0) + rotate += 4; + + CPDF_Array* pMediaBox = ToArray(GetPageAttr("MediaBox")); + CFX_FloatRect mediabox; + if (pMediaBox) { + mediabox = pMediaBox->GetRect(); + mediabox.Normalize(); + } + if (mediabox.IsEmpty()) + mediabox = CFX_FloatRect(0, 0, 612, 792); + + CPDF_Array* pCropBox = ToArray(GetPageAttr("CropBox")); + if (pCropBox) { + m_BBox = pCropBox->GetRect(); + m_BBox.Normalize(); + } + if (m_BBox.IsEmpty()) + m_BBox = mediabox; + else + m_BBox.Intersect(mediabox); + + m_PageWidth = m_BBox.right - m_BBox.left; + m_PageHeight = m_BBox.top - m_BBox.bottom; + if (rotate % 2) + std::swap(m_PageWidth, m_PageHeight); + + switch (rotate) { + case 0: + m_PageMatrix = CFX_Matrix(1.0f, 0, 0, 1.0f, -m_BBox.left, -m_BBox.bottom); + break; + case 1: + m_PageMatrix = + CFX_Matrix(0, -1.0f, 1.0f, 0, -m_BBox.bottom, m_BBox.right); + break; + case 2: + m_PageMatrix = CFX_Matrix(-1.0f, 0, 0, -1.0f, m_BBox.right, m_BBox.top); + break; + case 3: + m_PageMatrix = CFX_Matrix(0, 1.0f, -1.0f, 0, m_BBox.top, -m_BBox.left); + break; + } + + m_Transparency = PDFTRANS_ISOLATED; + LoadTransInfo(); +} + +CPDF_Page::~CPDF_Page() {} + +void CPDF_Page::StartParse() { + if (m_ParseState == CONTENT_PARSED || m_ParseState == CONTENT_PARSING) + return; + + m_pParser = pdfium::MakeUnique(); + m_pParser->Start(this); + m_ParseState = CONTENT_PARSING; +} + +void CPDF_Page::ParseContent() { + StartParse(); + ContinueParse(nullptr); +} + +void CPDF_Page::SetRenderContext( + std::unique_ptr pContext) { + m_pRenderContext = std::move(pContext); +} + +CPDF_Object* CPDF_Page::GetPageAttr(const CFX_ByteString& name) const { + CPDF_Dictionary* pPageDict = m_pFormDict; + std::set visited; + while (1) { + visited.insert(pPageDict); + if (CPDF_Object* pObj = pPageDict->GetDirectObjectFor(name)) + return pObj; + + pPageDict = pPageDict->GetDictFor("Parent"); + if (!pPageDict || pdfium::ContainsKey(visited, pPageDict)) + break; + } + return nullptr; +} + +CFX_Matrix CPDF_Page::GetDisplayMatrix(int xPos, + int yPos, + int xSize, + int ySize, + int iRotate) const { + if (m_PageWidth == 0 || m_PageHeight == 0) + return CFX_Matrix(); + + float x0 = 0; + float y0 = 0; + float x1 = 0; + float y1 = 0; + float x2 = 0; + float y2 = 0; + iRotate %= 4; + switch (iRotate) { + case 0: + x0 = xPos; + y0 = yPos + ySize; + x1 = xPos; + y1 = yPos; + x2 = xPos + xSize; + y2 = yPos + ySize; + break; + case 1: + x0 = xPos; + y0 = yPos; + x1 = xPos + xSize; + y1 = yPos; + x2 = xPos; + y2 = yPos + ySize; + break; + case 2: + x0 = xPos + xSize; + y0 = yPos; + x1 = xPos + xSize; + y1 = yPos + ySize; + x2 = xPos; + y2 = yPos; + break; + case 3: + x0 = xPos + xSize; + y0 = yPos + ySize; + x1 = xPos; + y1 = yPos + ySize; + x2 = xPos + xSize; + y2 = yPos; + break; + } + CFX_Matrix matrix = m_PageMatrix; + matrix.Concat(CFX_Matrix((x2 - x0) / m_PageWidth, (y2 - y0) / m_PageWidth, + (x1 - x0) / m_PageHeight, (y1 - y0) / m_PageHeight, + x0, y0)); + return matrix; +} + +bool GraphicsData::operator<(const GraphicsData& other) const { + if (fillAlpha != other.fillAlpha) + return fillAlpha < other.fillAlpha; + return strokeAlpha < other.strokeAlpha; +} + +bool FontData::operator<(const FontData& other) const { + return baseFont < other.baseFont; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_page.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_page.h new file mode 100644 index 000000000000..9e303562c6db --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_page.h @@ -0,0 +1,83 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_PAGE_H_ +#define CORE_FPDFAPI_PAGE_CPDF_PAGE_H_ + +#include +#include + +#include "core/fpdfapi/page/cpdf_pageobjectholder.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_Object; +class CPDF_PageRenderCache; +class CPDF_PageRenderContext; + +// These structs are used to keep track of resources that have already been +// generated in the page. +struct GraphicsData { + FX_FLOAT fillAlpha; + FX_FLOAT strokeAlpha; + bool operator<(const GraphicsData& other) const; +}; + +struct FontData { + CFX_ByteString baseFont; + bool operator<(const FontData& other) const; +}; + +class CPDF_Page : public CPDF_PageObjectHolder { + public: + class View {}; // Caller implements as desired, empty here due to layering. + + CPDF_Page(CPDF_Document* pDocument, + CPDF_Dictionary* pPageDict, + bool bPageCache); + ~CPDF_Page() override; + + void ParseContent(); + + CFX_Matrix GetDisplayMatrix(int xPos, + int yPos, + int xSize, + int ySize, + int iRotate) const; + + FX_FLOAT GetPageWidth() const { return m_PageWidth; } + FX_FLOAT GetPageHeight() const { return m_PageHeight; } + CFX_FloatRect GetPageBBox() const { return m_BBox; } + const CFX_Matrix& GetPageMatrix() const { return m_PageMatrix; } + CPDF_Object* GetPageAttr(const CFX_ByteString& name) const; + CPDF_PageRenderCache* GetRenderCache() const { return m_pPageRender.get(); } + + CPDF_PageRenderContext* GetRenderContext() const { + return m_pRenderContext.get(); + } + void SetRenderContext(std::unique_ptr pContext); + + View* GetView() const { return m_pView; } + void SetView(View* pView) { m_pView = pView; } + + std::map m_GraphicsMap; + std::map m_FontsMap; + + protected: + void StartParse(); + + FX_FLOAT m_PageWidth; + FX_FLOAT m_PageHeight; + CFX_Matrix m_PageMatrix; + View* m_pView; + std::unique_ptr m_pPageRender; + std::unique_ptr m_pRenderContext; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_PAGE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pagemodule.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pagemodule.cpp new file mode 100644 index 000000000000..80edf2cdd0bc --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pagemodule.cpp @@ -0,0 +1,35 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_pagemodule.h" + +CPDF_PageModule::CPDF_PageModule() + : m_StockGrayCS(nullptr, PDFCS_DEVICEGRAY), + m_StockRGBCS(nullptr, PDFCS_DEVICERGB), + m_StockCMYKCS(nullptr, PDFCS_DEVICECMYK), + m_StockPatternCS(nullptr) {} + +CPDF_PageModule::~CPDF_PageModule() {} + +CPDF_FontGlobals* CPDF_PageModule::GetFontGlobals() { + return &m_FontGlobals; +} + +CPDF_ColorSpace* CPDF_PageModule::GetStockCS(int family) { + if (family == PDFCS_DEVICEGRAY) + return &m_StockGrayCS; + if (family == PDFCS_DEVICERGB) + return &m_StockRGBCS; + if (family == PDFCS_DEVICECMYK) + return &m_StockCMYKCS; + if (family == PDFCS_PATTERN) + return &m_StockPatternCS; + return nullptr; +} + +void CPDF_PageModule::ClearStockFont(CPDF_Document* pDoc) { + m_FontGlobals.Clear(pDoc); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pagemodule.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pagemodule.h new file mode 100644 index 000000000000..4aa19da2bb6d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pagemodule.h @@ -0,0 +1,33 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_PAGEMODULE_H_ +#define CORE_FPDFAPI_PAGE_CPDF_PAGEMODULE_H_ + +#include "core/fpdfapi/font/font_int.h" +#include "core/fpdfapi/page/cpdf_colorspace.h" +#include "core/fpdfapi/page/pageint.h" + +class CPDF_Document; + +class CPDF_PageModule { + public: + CPDF_PageModule(); + ~CPDF_PageModule(); + + CPDF_FontGlobals* GetFontGlobals(); + CPDF_ColorSpace* GetStockCS(int family); + void ClearStockFont(CPDF_Document* pDoc); + + private: + CPDF_FontGlobals m_FontGlobals; + CPDF_DeviceCS m_StockGrayCS; + CPDF_DeviceCS m_StockRGBCS; + CPDF_DeviceCS m_StockCMYKCS; + CPDF_PatternCS m_StockPatternCS; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_PAGEMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobject.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobject.cpp new file mode 100644 index 000000000000..c0e031e7ed80 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobject.cpp @@ -0,0 +1,99 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_pageobject.h" + +CPDF_PageObject::CPDF_PageObject() {} + +CPDF_PageObject::~CPDF_PageObject() {} + +bool CPDF_PageObject::IsText() const { + return false; +} + +bool CPDF_PageObject::IsPath() const { + return false; +} + +bool CPDF_PageObject::IsImage() const { + return false; +} + +bool CPDF_PageObject::IsShading() const { + return false; +} + +bool CPDF_PageObject::IsForm() const { + return false; +} + +CPDF_TextObject* CPDF_PageObject::AsText() { + return nullptr; +} + +const CPDF_TextObject* CPDF_PageObject::AsText() const { + return nullptr; +} + +CPDF_PathObject* CPDF_PageObject::AsPath() { + return nullptr; +} + +const CPDF_PathObject* CPDF_PageObject::AsPath() const { + return nullptr; +} + +CPDF_ImageObject* CPDF_PageObject::AsImage() { + return nullptr; +} + +const CPDF_ImageObject* CPDF_PageObject::AsImage() const { + return nullptr; +} + +CPDF_ShadingObject* CPDF_PageObject::AsShading() { + return nullptr; +} + +const CPDF_ShadingObject* CPDF_PageObject::AsShading() const { + return nullptr; +} + +CPDF_FormObject* CPDF_PageObject::AsForm() { + return nullptr; +} + +const CPDF_FormObject* CPDF_PageObject::AsForm() const { + return nullptr; +} + +void CPDF_PageObject::CopyData(const CPDF_PageObject* pSrc) { + CopyStates(*pSrc); + m_Left = pSrc->m_Left; + m_Right = pSrc->m_Right; + m_Top = pSrc->m_Top; + m_Bottom = pSrc->m_Bottom; +} + +void CPDF_PageObject::TransformClipPath(CFX_Matrix& matrix) { + if (!m_ClipPath) + return; + m_ClipPath.Transform(matrix); +} + +void CPDF_PageObject::TransformGeneralState(CFX_Matrix& matrix) { + if (!m_GeneralState) + return; + m_GeneralState.GetMutableMatrix()->Concat(matrix); +} + +FX_RECT CPDF_PageObject::GetBBox(const CFX_Matrix* pMatrix) const { + CFX_FloatRect rect(m_Left, m_Bottom, m_Right, m_Top); + if (pMatrix) { + pMatrix->TransformRect(rect); + } + return rect.GetOuterRect(); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobject.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobject.h new file mode 100644 index 000000000000..d2b84a5d40bf --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobject.h @@ -0,0 +1,74 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECT_H_ +#define CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECT_H_ + +#include "core/fpdfapi/page/cpdf_contentmark.h" +#include "core/fpdfapi/page/cpdf_graphicstates.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_TextObject; +class CPDF_PathObject; +class CPDF_ImageObject; +class CPDF_ShadingObject; +class CPDF_FormObject; + +class CPDF_PageObject : public CPDF_GraphicStates { + public: + enum Type { + TEXT = 1, + PATH, + IMAGE, + SHADING, + FORM, + }; + + CPDF_PageObject(); + ~CPDF_PageObject() override; + + virtual Type GetType() const = 0; + virtual void Transform(const CFX_Matrix& matrix) = 0; + virtual bool IsText() const; + virtual bool IsPath() const; + virtual bool IsImage() const; + virtual bool IsShading() const; + virtual bool IsForm() const; + virtual CPDF_TextObject* AsText(); + virtual const CPDF_TextObject* AsText() const; + virtual CPDF_PathObject* AsPath(); + virtual const CPDF_PathObject* AsPath() const; + virtual CPDF_ImageObject* AsImage(); + virtual const CPDF_ImageObject* AsImage() const; + virtual CPDF_ShadingObject* AsShading(); + virtual const CPDF_ShadingObject* AsShading() const; + virtual CPDF_FormObject* AsForm(); + virtual const CPDF_FormObject* AsForm() const; + + void TransformClipPath(CFX_Matrix& matrix); + void TransformGeneralState(CFX_Matrix& matrix); + + CFX_FloatRect GetRect() const { + return CFX_FloatRect(m_Left, m_Bottom, m_Right, m_Top); + } + FX_RECT GetBBox(const CFX_Matrix* pMatrix) const; + + FX_FLOAT m_Left; + FX_FLOAT m_Right; + FX_FLOAT m_Top; + FX_FLOAT m_Bottom; + CPDF_ContentMark m_ContentMark; + + protected: + void CopyData(const CPDF_PageObject* pSrcObject); + + private: + CPDF_PageObject(const CPDF_PageObject& src) = delete; + void operator=(const CPDF_PageObject& src) = delete; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectholder.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectholder.cpp new file mode 100644 index 000000000000..3304d4eec4cb --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectholder.cpp @@ -0,0 +1,80 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_pageobjectholder.h" + +#include + +#include "core/fpdfapi/page/cpdf_contentparser.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" + +CPDF_PageObjectHolder::CPDF_PageObjectHolder() + : m_pFormDict(nullptr), + m_pFormStream(nullptr), + m_pDocument(nullptr), + m_pPageResources(nullptr), + m_pResources(nullptr), + m_Transparency(0), + m_bBackgroundAlphaNeeded(false), + m_bHasImageMask(false), + m_ParseState(CONTENT_NOT_PARSED) {} + +CPDF_PageObjectHolder::~CPDF_PageObjectHolder() {} + +void CPDF_PageObjectHolder::ContinueParse(IFX_Pause* pPause) { + if (!m_pParser) { + return; + } + m_pParser->Continue(pPause); + if (m_pParser->GetStatus() == CPDF_ContentParser::Done) { + m_ParseState = CONTENT_PARSED; + m_pParser.reset(); + } +} + +void CPDF_PageObjectHolder::Transform(const CFX_Matrix& matrix) { + for (auto& pObj : m_PageObjectList) + pObj->Transform(matrix); +} + +CFX_FloatRect CPDF_PageObjectHolder::CalcBoundingBox() const { + if (m_PageObjectList.empty()) + return CFX_FloatRect(0, 0, 0, 0); + + FX_FLOAT left = 1000000.0f; + FX_FLOAT right = -1000000.0f; + FX_FLOAT bottom = 1000000.0f; + FX_FLOAT top = -1000000.0f; + for (const auto& pObj : m_PageObjectList) { + left = std::min(left, pObj->m_Left); + right = std::max(right, pObj->m_Right); + bottom = std::min(bottom, pObj->m_Bottom); + top = std::max(top, pObj->m_Top); + } + return CFX_FloatRect(left, bottom, right, top); +} + +void CPDF_PageObjectHolder::LoadTransInfo() { + if (!m_pFormDict) { + return; + } + CPDF_Dictionary* pGroup = m_pFormDict->GetDictFor("Group"); + if (!pGroup) { + return; + } + if (pGroup->GetStringFor("S") != "Transparency") { + return; + } + m_Transparency |= PDFTRANS_GROUP; + if (pGroup->GetIntegerFor("I")) { + m_Transparency |= PDFTRANS_ISOLATED; + } + if (pGroup->GetIntegerFor("K")) { + m_Transparency |= PDFTRANS_KNOCKOUT; + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectholder.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectholder.h new file mode 100644 index 000000000000..aee7617c1f93 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectholder.h @@ -0,0 +1,70 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECTHOLDER_H_ +#define CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECTHOLDER_H_ + +#include + +#include "core/fpdfapi/page/cpdf_pageobjectlist.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class IFX_Pause; +class CPDF_Dictionary; +class CPDF_Stream; +class CPDF_Document; +class CPDF_ContentParser; + +#define PDFTRANS_GROUP 0x0100 +#define PDFTRANS_ISOLATED 0x0200 +#define PDFTRANS_KNOCKOUT 0x0400 + +class CPDF_PageObjectHolder { + public: + CPDF_PageObjectHolder(); + virtual ~CPDF_PageObjectHolder(); + + void ContinueParse(IFX_Pause* pPause); + bool IsParsed() const { return m_ParseState == CONTENT_PARSED; } + + CPDF_PageObjectList* GetPageObjectList() { return &m_PageObjectList; } + const CPDF_PageObjectList* GetPageObjectList() const { + return &m_PageObjectList; + } + + bool BackgroundAlphaNeeded() const { return m_bBackgroundAlphaNeeded; } + void SetBackgroundAlphaNeeded(bool needed) { + m_bBackgroundAlphaNeeded = needed; + } + + bool HasImageMask() const { return m_bHasImageMask; } + void SetHasImageMask(bool value) { m_bHasImageMask = value; } + + void Transform(const CFX_Matrix& matrix); + CFX_FloatRect CalcBoundingBox() const; + + CPDF_Dictionary* m_pFormDict; + CPDF_Stream* m_pFormStream; + CPDF_Document* m_pDocument; + CPDF_Dictionary* m_pPageResources; + CPDF_Dictionary* m_pResources; + CFX_FloatRect m_BBox; + int m_Transparency; + + protected: + enum ParseState { CONTENT_NOT_PARSED, CONTENT_PARSING, CONTENT_PARSED }; + + void LoadTransInfo(); + + bool m_bBackgroundAlphaNeeded; + bool m_bHasImageMask; + ParseState m_ParseState; + std::unique_ptr m_pParser; + CPDF_PageObjectList m_PageObjectList; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECTHOLDER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectlist.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectlist.cpp new file mode 100644 index 000000000000..02b590e41393 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectlist.cpp @@ -0,0 +1,16 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_pageobjectlist.h" + +#include "core/fpdfapi/page/pageint.h" +#include "third_party/base/stl_util.h" + +CPDF_PageObject* CPDF_PageObjectList::GetPageObjectByIndex(int index) { + if (index < 0 || index >= pdfium::CollectionSize(*this)) + return nullptr; + return (*this)[index].get(); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectlist.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectlist.h new file mode 100644 index 000000000000..b4505371f8ec --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pageobjectlist.h @@ -0,0 +1,21 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECTLIST_H_ +#define CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECTLIST_H_ + +#include +#include + +class CPDF_PageObject; + +class CPDF_PageObjectList + : public std::deque> { + public: + CPDF_PageObject* GetPageObjectByIndex(int index); +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECTLIST_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_path.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_path.cpp new file mode 100644 index 000000000000..ddc6bbd1d6fe --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_path.cpp @@ -0,0 +1,65 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_path.h" + +CPDF_Path::CPDF_Path() {} + +CPDF_Path::CPDF_Path(const CPDF_Path& that) : m_Ref(that.m_Ref) {} + +CPDF_Path::~CPDF_Path() {} + +const std::vector& CPDF_Path::GetPoints() const { + return m_Ref.GetObject()->GetPoints(); +} + +void CPDF_Path::ClosePath() { + m_Ref.GetPrivateCopy()->ClosePath(); +} + +CFX_PointF CPDF_Path::GetPoint(int index) const { + return m_Ref.GetObject()->GetPoint(index); +} + +CFX_FloatRect CPDF_Path::GetBoundingBox() const { + return m_Ref.GetObject()->GetBoundingBox(); +} + +CFX_FloatRect CPDF_Path::GetBoundingBox(FX_FLOAT line_width, + FX_FLOAT miter_limit) const { + return m_Ref.GetObject()->GetBoundingBox(line_width, miter_limit); +} + +bool CPDF_Path::IsRect() const { + return m_Ref.GetObject()->IsRect(); +} + +void CPDF_Path::Transform(const CFX_Matrix* pMatrix) { + m_Ref.GetPrivateCopy()->Transform(pMatrix); +} + +void CPDF_Path::Append(const CPDF_Path& other, const CFX_Matrix* pMatrix) { + m_Ref.GetPrivateCopy()->Append(other.GetObject(), pMatrix); +} + +void CPDF_Path::Append(const CFX_PathData* pData, const CFX_Matrix* pMatrix) { + m_Ref.GetPrivateCopy()->Append(pData, pMatrix); +} + +void CPDF_Path::AppendRect(FX_FLOAT left, + FX_FLOAT bottom, + FX_FLOAT right, + FX_FLOAT top) { + m_Ref.GetPrivateCopy()->AppendRect(left, bottom, right, top); +} + +void CPDF_Path::AppendPoint(const CFX_PointF& point, + FXPT_TYPE type, + bool close) { + CFX_PathData data; + data.AppendPoint(point, type, close); + Append(&data, nullptr); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_path.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_path.h new file mode 100644 index 000000000000..b0c5a68a444e --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_path.h @@ -0,0 +1,49 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_PATH_H_ +#define CORE_FPDFAPI_PAGE_CPDF_PATH_H_ + +#include + +#include "core/fxcrt/cfx_shared_copy_on_write.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxge/cfx_fxgedevice.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" + +class CPDF_Path { + public: + CPDF_Path(); + CPDF_Path(const CPDF_Path& that); + ~CPDF_Path(); + + void Emplace() { m_Ref.Emplace(); } + explicit operator bool() const { return !!m_Ref; } + + const std::vector& GetPoints() const; + void ClosePath(); + + CFX_PointF GetPoint(int index) const; + CFX_FloatRect GetBoundingBox() const; + CFX_FloatRect GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const; + + bool IsRect() const; + void Transform(const CFX_Matrix* pMatrix); + + void Append(const CPDF_Path& other, const CFX_Matrix* pMatrix); + void Append(const CFX_PathData* pData, const CFX_Matrix* pMatrix); + void AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top); + void AppendPoint(const CFX_PointF& point, FXPT_TYPE type, bool close); + + // TODO(tsepez): Remove when all access thru this class. + const CFX_PathData* GetObject() const { return m_Ref.GetObject(); } + + private: + CFX_SharedCopyOnWrite m_Ref; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_PATH_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pathobject.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pathobject.cpp new file mode 100644 index 000000000000..b5bb89390ce9 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pathobject.cpp @@ -0,0 +1,56 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_pathobject.h" + +CPDF_PathObject::CPDF_PathObject() {} + +CPDF_PathObject::~CPDF_PathObject() {} + +CPDF_PageObject::Type CPDF_PathObject::GetType() const { + return PATH; +} + +void CPDF_PathObject::Transform(const CFX_Matrix& matrix) { + m_Matrix.Concat(matrix); + CalcBoundingBox(); +} + +bool CPDF_PathObject::IsPath() const { + return true; +} + +CPDF_PathObject* CPDF_PathObject::AsPath() { + return this; +} + +const CPDF_PathObject* CPDF_PathObject::AsPath() const { + return this; +} + +void CPDF_PathObject::CalcBoundingBox() { + if (!m_Path) + return; + CFX_FloatRect rect; + FX_FLOAT width = m_GraphState.GetLineWidth(); + if (m_bStroke && width != 0) { + rect = m_Path.GetBoundingBox(width, m_GraphState.GetMiterLimit()); + } else { + rect = m_Path.GetBoundingBox(); + } + m_Matrix.TransformRect(rect); + + if (width == 0 && m_bStroke) { + rect.left += -0.5f; + rect.right += 0.5f; + rect.bottom += -0.5f; + rect.top += 0.5f; + } + m_Left = rect.left; + m_Right = rect.right; + m_Top = rect.top; + m_Bottom = rect.bottom; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pathobject.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pathobject.h new file mode 100644 index 000000000000..58499b5a53a4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pathobject.h @@ -0,0 +1,35 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_PATHOBJECT_H_ +#define CORE_FPDFAPI_PAGE_CPDF_PATHOBJECT_H_ + +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/cpdf_path.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_PathObject : public CPDF_PageObject { + public: + CPDF_PathObject(); + ~CPDF_PathObject() override; + + // CPDF_PageObject + Type GetType() const override; + void Transform(const CFX_Matrix& maxtrix) override; + bool IsPath() const override; + CPDF_PathObject* AsPath() override; + const CPDF_PathObject* AsPath() const override; + + void CalcBoundingBox(); + + CPDF_Path m_Path; + int m_FillType; + bool m_bStroke; + CFX_Matrix m_Matrix; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_PATHOBJECT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pattern.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pattern.cpp new file mode 100644 index 000000000000..b0a2d81bca25 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pattern.cpp @@ -0,0 +1,18 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_pattern.h" + +CPDF_Pattern::CPDF_Pattern(PatternType type, + CPDF_Document* pDoc, + CPDF_Object* pObj, + const CFX_Matrix& parentMatrix) + : m_PatternType(type), + m_pDocument(pDoc), + m_pPatternObj(pObj), + m_ParentMatrix(parentMatrix) {} + +CPDF_Pattern::~CPDF_Pattern() {} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pattern.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pattern.h new file mode 100644 index 000000000000..d44965ff1611 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_pattern.h @@ -0,0 +1,45 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_PATTERN_H_ +#define CORE_FPDFAPI_PAGE_CPDF_PATTERN_H_ + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Document; +class CPDF_Object; +class CPDF_ShadingPattern; +class CPDF_TilingPattern; + +class CPDF_Pattern { + public: + enum PatternType { TILING = 1, SHADING }; + + virtual ~CPDF_Pattern(); + + virtual CPDF_TilingPattern* AsTilingPattern() = 0; + virtual CPDF_ShadingPattern* AsShadingPattern() = 0; + + CPDF_Document* document() { return m_pDocument; } + CPDF_Object* pattern_obj() { return m_pPatternObj; } + CFX_Matrix* pattern_to_form() { return &m_Pattern2Form; } + const CFX_Matrix& parent_matrix() const { return m_ParentMatrix; } + + protected: + CPDF_Pattern(PatternType type, + CPDF_Document* pDoc, + CPDF_Object* pObj, + const CFX_Matrix& parentMatrix); + + const PatternType m_PatternType; + CPDF_Document* const m_pDocument; + CPDF_Object* const m_pPatternObj; + CFX_Matrix m_Pattern2Form; + const CFX_Matrix m_ParentMatrix; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_PATTERN_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_psengine.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_psengine.h new file mode 100644 index 000000000000..659ca82f6b8c --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_psengine.h @@ -0,0 +1,100 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_PSENGINE_H_ +#define CORE_FPDFAPI_PAGE_CPDF_PSENGINE_H_ + +#include +#include + +#include "core/fxcrt/fx_system.h" + +class CPDF_PSEngine; +class CPDF_PSOP; +class CPDF_SimpleParser; + +enum PDF_PSOP { + PSOP_ADD, + PSOP_SUB, + PSOP_MUL, + PSOP_DIV, + PSOP_IDIV, + PSOP_MOD, + PSOP_NEG, + PSOP_ABS, + PSOP_CEILING, + PSOP_FLOOR, + PSOP_ROUND, + PSOP_TRUNCATE, + PSOP_SQRT, + PSOP_SIN, + PSOP_COS, + PSOP_ATAN, + PSOP_EXP, + PSOP_LN, + PSOP_LOG, + PSOP_CVI, + PSOP_CVR, + PSOP_EQ, + PSOP_NE, + PSOP_GT, + PSOP_GE, + PSOP_LT, + PSOP_LE, + PSOP_AND, + PSOP_OR, + PSOP_XOR, + PSOP_NOT, + PSOP_BITSHIFT, + PSOP_TRUE, + PSOP_FALSE, + PSOP_IF, + PSOP_IFELSE, + PSOP_POP, + PSOP_EXCH, + PSOP_DUP, + PSOP_COPY, + PSOP_INDEX, + PSOP_ROLL, + PSOP_PROC, + PSOP_CONST +}; + +constexpr uint32_t PSENGINE_STACKSIZE = 100; + +class CPDF_PSProc { + public: + CPDF_PSProc(); + ~CPDF_PSProc(); + + bool Parse(CPDF_SimpleParser* parser, int depth); + bool Execute(CPDF_PSEngine* pEngine); + + private: + static const int kMaxDepth = 128; + std::vector> m_Operators; +}; + +class CPDF_PSEngine { + public: + CPDF_PSEngine(); + ~CPDF_PSEngine(); + + bool Parse(const FX_CHAR* str, int size); + bool Execute(); + bool DoOperator(PDF_PSOP op); + void Reset() { m_StackCount = 0; } + void Push(FX_FLOAT value); + FX_FLOAT Pop(); + uint32_t GetStackSize() const { return m_StackCount; } + + private: + FX_FLOAT m_Stack[PSENGINE_STACKSIZE]; + uint32_t m_StackCount; + CPDF_PSProc m_MainProc; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_PSENGINE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingobject.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingobject.cpp new file mode 100644 index 000000000000..928b0af47ecc --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingobject.cpp @@ -0,0 +1,53 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_shadingobject.h" + +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/page/cpdf_shadingpattern.h" +#include "core/fpdfapi/parser/cpdf_document.h" + +CPDF_ShadingObject::CPDF_ShadingObject() : m_pShading(nullptr) {} + +CPDF_ShadingObject::~CPDF_ShadingObject() {} + +CPDF_PageObject::Type CPDF_ShadingObject::GetType() const { + return SHADING; +} + +void CPDF_ShadingObject::Transform(const CFX_Matrix& matrix) { + if (m_ClipPath) + m_ClipPath.Transform(matrix); + + m_Matrix.Concat(matrix); + if (m_ClipPath) { + CalcBoundingBox(); + } else { + matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom); + } +} + +bool CPDF_ShadingObject::IsShading() const { + return true; +} + +CPDF_ShadingObject* CPDF_ShadingObject::AsShading() { + return this; +} + +const CPDF_ShadingObject* CPDF_ShadingObject::AsShading() const { + return this; +} + +void CPDF_ShadingObject::CalcBoundingBox() { + if (!m_ClipPath) + return; + CFX_FloatRect rect = m_ClipPath.GetClipBox(); + m_Left = rect.left; + m_Bottom = rect.bottom; + m_Right = rect.right; + m_Top = rect.top; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingobject.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingobject.h new file mode 100644 index 000000000000..ffd622379eba --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingobject.h @@ -0,0 +1,33 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_SHADINGOBJECT_H_ +#define CORE_FPDFAPI_PAGE_CPDF_SHADINGOBJECT_H_ + +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fxcrt/fx_coordinates.h" + +class CPDF_ShadingPattern; + +class CPDF_ShadingObject : public CPDF_PageObject { + public: + CPDF_ShadingObject(); + ~CPDF_ShadingObject() override; + + // CPDF_PageObject + Type GetType() const override; + void Transform(const CFX_Matrix& matrix) override; + bool IsShading() const override; + CPDF_ShadingObject* AsShading() override; + const CPDF_ShadingObject* AsShading() const override; + + void CalcBoundingBox(); + + CPDF_ShadingPattern* m_pShading; + CFX_Matrix m_Matrix; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_SHADINGOBJECT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingpattern.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingpattern.cpp new file mode 100644 index 000000000000..e19ffaf0c47c --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingpattern.cpp @@ -0,0 +1,101 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_shadingpattern.h" + +#include + +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_stream.h" + +namespace { + +ShadingType ToShadingType(int type) { + return (type > static_cast(kInvalidShading) && + type < static_cast(kMaxShading)) + ? static_cast(type) + : kInvalidShading; +} + +} // namespace + +CPDF_ShadingPattern::CPDF_ShadingPattern(CPDF_Document* pDoc, + CPDF_Object* pPatternObj, + bool bShading, + const CFX_Matrix& parentMatrix) + : CPDF_Pattern(SHADING, + pDoc, + bShading ? nullptr : pPatternObj, + parentMatrix), + m_ShadingType(kInvalidShading), + m_bShadingObj(bShading), + m_pShadingObj(pPatternObj), + m_pCS(nullptr), + m_pCountedCS(nullptr) { + if (!bShading) { + CPDF_Dictionary* pDict = m_pPatternObj->GetDict(); + m_Pattern2Form = pDict->GetMatrixFor("Matrix"); + m_pShadingObj = pDict->GetDirectObjectFor("Shading"); + m_Pattern2Form.Concat(parentMatrix); + } +} + +CPDF_ShadingPattern::~CPDF_ShadingPattern() { + CPDF_ColorSpace* pCS = m_pCountedCS ? m_pCountedCS->get() : nullptr; + if (pCS && m_pDocument) + m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray()); +} + +CPDF_TilingPattern* CPDF_ShadingPattern::AsTilingPattern() { + return nullptr; +} + +CPDF_ShadingPattern* CPDF_ShadingPattern::AsShadingPattern() { + return this; +} + +bool CPDF_ShadingPattern::Load() { + if (m_ShadingType != kInvalidShading) + return true; + + CPDF_Dictionary* pShadingDict = + m_pShadingObj ? m_pShadingObj->GetDict() : nullptr; + if (!pShadingDict) + return false; + + m_pFunctions.clear(); + CPDF_Object* pFunc = pShadingDict->GetDirectObjectFor("Function"); + if (pFunc) { + if (CPDF_Array* pArray = pFunc->AsArray()) { + m_pFunctions.resize(std::min(pArray->GetCount(), 4)); + for (size_t i = 0; i < m_pFunctions.size(); ++i) + m_pFunctions[i] = CPDF_Function::Load(pArray->GetDirectObjectAt(i)); + } else { + m_pFunctions.push_back(CPDF_Function::Load(pFunc)); + } + } + CPDF_Object* pCSObj = pShadingDict->GetDirectObjectFor("ColorSpace"); + if (!pCSObj) + return false; + + CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData(); + m_pCS = pDocPageData->GetColorSpace(pCSObj, nullptr); + if (m_pCS) + m_pCountedCS = pDocPageData->FindColorSpacePtr(m_pCS->GetArray()); + + m_ShadingType = ToShadingType(pShadingDict->GetIntegerFor("ShadingType")); + + // We expect to have a stream if our shading type is a mesh. + if (IsMeshShading() && !ToStream(m_pShadingObj)) + return false; + + return true; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingpattern.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingpattern.h new file mode 100644 index 000000000000..136153d4a033 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_shadingpattern.h @@ -0,0 +1,75 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_SHADINGPATTERN_H_ +#define CORE_FPDFAPI_PAGE_CPDF_SHADINGPATTERN_H_ + +#include +#include + +#include "core/fpdfapi/page/cpdf_countedobject.h" +#include "core/fpdfapi/page/cpdf_pattern.h" +#include "core/fxcrt/fx_system.h" + +enum ShadingType { + kInvalidShading = 0, + kFunctionBasedShading = 1, + kAxialShading = 2, + kRadialShading = 3, + kFreeFormGouraudTriangleMeshShading = 4, + kLatticeFormGouraudTriangleMeshShading = 5, + kCoonsPatchMeshShading = 6, + kTensorProductPatchMeshShading = 7, + kMaxShading = 8 +}; + +class CFX_Matrix; +class CPDF_ColorSpace; +class CPDF_Document; +class CPDF_Function; +class CPDF_Object; + +class CPDF_ShadingPattern : public CPDF_Pattern { + public: + CPDF_ShadingPattern(CPDF_Document* pDoc, + CPDF_Object* pPatternObj, + bool bShading, + const CFX_Matrix& parentMatrix); + ~CPDF_ShadingPattern() override; + + CPDF_TilingPattern* AsTilingPattern() override; + CPDF_ShadingPattern* AsShadingPattern() override; + + bool IsMeshShading() const { + return m_ShadingType == kFreeFormGouraudTriangleMeshShading || + m_ShadingType == kLatticeFormGouraudTriangleMeshShading || + m_ShadingType == kCoonsPatchMeshShading || + m_ShadingType == kTensorProductPatchMeshShading; + } + bool Load(); + + ShadingType GetShadingType() const { return m_ShadingType; } + bool IsShadingObject() const { return m_bShadingObj; } + CPDF_Object* GetShadingObject() const { return m_pShadingObj; } + CPDF_ColorSpace* GetCS() const { return m_pCS; } + const std::vector>& GetFuncs() const { + return m_pFunctions; + } + + private: + ShadingType m_ShadingType; + bool m_bShadingObj; + CPDF_Object* m_pShadingObj; + + // Still keep |m_pCS| as some CPDF_ColorSpace (name object) are not managed + // as counted objects. Refer to CPDF_DocPageData::GetColorSpace. + CPDF_ColorSpace* m_pCS; + + CPDF_CountedColorSpace* m_pCountedCS; + std::vector> m_pFunctions; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_SHADINGPATTERN_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamcontentparser.cpp new file mode 100644 index 000000000000..6211b6a4dd3f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamcontentparser.cpp @@ -0,0 +1,1642 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_streamcontentparser.h" + +#include +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/font/cpdf_type3font.h" +#include "core/fpdfapi/page/cpdf_allstates.h" +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/page/cpdf_form.h" +#include "core/fpdfapi/page/cpdf_formobject.h" +#include "core/fpdfapi/page/cpdf_image.h" +#include "core/fpdfapi/page/cpdf_imageobject.h" +#include "core/fpdfapi/page/cpdf_meshstream.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/cpdf_pathobject.h" +#include "core/fpdfapi/page/cpdf_shadingobject.h" +#include "core/fpdfapi/page/cpdf_shadingpattern.h" +#include "core/fpdfapi/page/cpdf_streamparser.h" +#include "core/fpdfapi/page/cpdf_textobject.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fxcrt/fx_safe_types.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "third_party/base/ptr_util.h" + +namespace { + +const int kMaxFormLevel = 30; + +const int kSingleCoordinatePair = 1; +const int kTensorCoordinatePairs = 16; +const int kCoonsCoordinatePairs = 12; +const int kSingleColorPerPatch = 1; +const int kQuadColorsPerPatch = 4; + +const char kPathOperatorSubpath = 'm'; +const char kPathOperatorLine = 'l'; +const char kPathOperatorCubicBezier1 = 'c'; +const char kPathOperatorCubicBezier2 = 'v'; +const char kPathOperatorCubicBezier3 = 'y'; +const char kPathOperatorClosePath = 'h'; +const char kPathOperatorRectangle[] = "re"; + +class CPDF_StreamParserAutoClearer { + public: + CPDF_StreamParserAutoClearer(CPDF_StreamParser** scoped_variable, + CPDF_StreamParser* new_parser) + : scoped_variable_(scoped_variable) { + *scoped_variable_ = new_parser; + } + ~CPDF_StreamParserAutoClearer() { *scoped_variable_ = nullptr; } + + private: + CPDF_StreamParser** scoped_variable_; +}; + +CFX_FloatRect GetShadingBBox(CPDF_ShadingPattern* pShading, + const CFX_Matrix& matrix) { + ShadingType type = pShading->GetShadingType(); + CPDF_Stream* pStream = ToStream(pShading->GetShadingObject()); + CPDF_ColorSpace* pCS = pShading->GetCS(); + if (!pStream || !pCS) + return CFX_FloatRect(0, 0, 0, 0); + + CPDF_MeshStream stream(type, pShading->GetFuncs(), pStream, pCS); + if (!stream.Load()) + return CFX_FloatRect(0, 0, 0, 0); + + CFX_FloatRect rect; + bool bStarted = false; + bool bGouraud = type == kFreeFormGouraudTriangleMeshShading || + type == kLatticeFormGouraudTriangleMeshShading; + + int point_count = kSingleCoordinatePair; + if (type == kTensorProductPatchMeshShading) + point_count = kTensorCoordinatePairs; + else if (type == kCoonsPatchMeshShading) + point_count = kCoonsCoordinatePairs; + + int color_count = kSingleColorPerPatch; + if (type == kCoonsPatchMeshShading || type == kTensorProductPatchMeshShading) + color_count = kQuadColorsPerPatch; + + while (!stream.BitStream()->IsEOF()) { + uint32_t flag = 0; + if (type != kLatticeFormGouraudTriangleMeshShading) { + if (!stream.CanReadFlag()) + break; + flag = stream.ReadFlag(); + } + + if (!bGouraud && flag) { + point_count -= 4; + color_count -= 2; + } + + for (int i = 0; i < point_count; i++) { + if (!stream.CanReadCoords()) + break; + CFX_PointF origin = stream.ReadCoords(); + if (bStarted) { + rect.UpdateRect(origin.x, origin.y); + } else { + rect.InitRect(origin.x, origin.y); + bStarted = true; + } + } + FX_SAFE_UINT32 nBits = stream.Components(); + nBits *= stream.ComponentBits(); + nBits *= color_count; + if (!nBits.IsValid()) + break; + + stream.BitStream()->SkipBits(nBits.ValueOrDie()); + if (bGouraud) + stream.BitStream()->ByteAlign(); + } + matrix.TransformRect(rect); + return rect; +} + +struct AbbrPair { + const FX_CHAR* abbr; + const FX_CHAR* full_name; +}; + +const AbbrPair InlineKeyAbbr[] = { + {"BPC", "BitsPerComponent"}, {"CS", "ColorSpace"}, {"D", "Decode"}, + {"DP", "DecodeParms"}, {"F", "Filter"}, {"H", "Height"}, + {"IM", "ImageMask"}, {"I", "Interpolate"}, {"W", "Width"}, +}; + +const AbbrPair InlineValueAbbr[] = { + {"G", "DeviceGray"}, {"RGB", "DeviceRGB"}, + {"CMYK", "DeviceCMYK"}, {"I", "Indexed"}, + {"AHx", "ASCIIHexDecode"}, {"A85", "ASCII85Decode"}, + {"LZW", "LZWDecode"}, {"Fl", "FlateDecode"}, + {"RL", "RunLengthDecode"}, {"CCF", "CCITTFaxDecode"}, + {"DCT", "DCTDecode"}, +}; + +struct AbbrReplacementOp { + bool is_replace_key; + CFX_ByteString key; + CFX_ByteStringC replacement; +}; + +CFX_ByteStringC FindFullName(const AbbrPair* table, + size_t count, + const CFX_ByteStringC& abbr) { + auto it = std::find_if(table, table + count, [abbr](const AbbrPair& pair) { + return pair.abbr == abbr; + }); + return it != table + count ? CFX_ByteStringC(it->full_name) + : CFX_ByteStringC(); +} + +void ReplaceAbbr(CPDF_Object* pObj) { + switch (pObj->GetType()) { + case CPDF_Object::DICTIONARY: { + CPDF_Dictionary* pDict = pObj->AsDictionary(); + std::vector replacements; + for (const auto& it : *pDict) { + CFX_ByteString key = it.first; + CPDF_Object* value = it.second.get(); + CFX_ByteStringC fullname = FindFullName( + InlineKeyAbbr, FX_ArraySize(InlineKeyAbbr), key.AsStringC()); + if (!fullname.IsEmpty()) { + AbbrReplacementOp op; + op.is_replace_key = true; + op.key = key; + op.replacement = fullname; + replacements.push_back(op); + key = fullname; + } + + if (value->IsName()) { + CFX_ByteString name = value->GetString(); + fullname = FindFullName( + InlineValueAbbr, FX_ArraySize(InlineValueAbbr), name.AsStringC()); + if (!fullname.IsEmpty()) { + AbbrReplacementOp op; + op.is_replace_key = false; + op.key = key; + op.replacement = fullname; + replacements.push_back(op); + } + } else { + ReplaceAbbr(value); + } + } + for (const auto& op : replacements) { + if (op.is_replace_key) + pDict->ReplaceKey(op.key, CFX_ByteString(op.replacement)); + else + pDict->SetNewFor(op.key, CFX_ByteString(op.replacement)); + } + break; + } + case CPDF_Object::ARRAY: { + CPDF_Array* pArray = pObj->AsArray(); + for (size_t i = 0; i < pArray->GetCount(); i++) { + CPDF_Object* pElement = pArray->GetObjectAt(i); + if (pElement->IsName()) { + CFX_ByteString name = pElement->GetString(); + CFX_ByteStringC fullname = FindFullName( + InlineValueAbbr, FX_ArraySize(InlineValueAbbr), name.AsStringC()); + if (!fullname.IsEmpty()) + pArray->SetNewAt(i, CFX_ByteString(fullname)); + } else { + ReplaceAbbr(pElement); + } + } + break; + } + default: + break; + } +} + +} // namespace + +CFX_ByteStringC PDF_FindKeyAbbreviationForTesting(const CFX_ByteStringC& abbr) { + return FindFullName(InlineKeyAbbr, FX_ArraySize(InlineKeyAbbr), abbr); +} + +CFX_ByteStringC PDF_FindValueAbbreviationForTesting( + const CFX_ByteStringC& abbr) { + return FindFullName(InlineValueAbbr, FX_ArraySize(InlineValueAbbr), abbr); +} + +CPDF_StreamContentParser::CPDF_StreamContentParser( + CPDF_Document* pDocument, + CPDF_Dictionary* pPageResources, + CPDF_Dictionary* pParentResources, + const CFX_Matrix* pmtContentToUser, + CPDF_PageObjectHolder* pObjHolder, + CPDF_Dictionary* pResources, + CFX_FloatRect* pBBox, + CPDF_AllStates* pStates, + int level) + : m_pDocument(pDocument), + m_pPageResources(pPageResources), + m_pParentResources(pParentResources), + m_pResources(pResources), + m_pObjectHolder(pObjHolder), + m_Level(level), + m_ParamStartPos(0), + m_ParamCount(0), + m_pCurStates(new CPDF_AllStates), + m_pLastTextObject(nullptr), + m_DefFontSize(0), + m_pPathPoints(nullptr), + m_PathPointCount(0), + m_PathAllocSize(0), + m_PathStartX(0.0f), + m_PathStartY(0.0f), + m_PathCurrentX(0.0f), + m_PathCurrentY(0.0f), + m_PathClipType(0), + m_pLastImage(nullptr), + m_bColored(false), + m_bResourceMissing(false) { + if (pmtContentToUser) + m_mtContentToUser = *pmtContentToUser; + if (!m_pResources) + m_pResources = m_pParentResources; + if (!m_pResources) + m_pResources = m_pPageResources; + if (pBBox) + m_BBox = *pBBox; + if (pStates) { + m_pCurStates->Copy(*pStates); + } else { + m_pCurStates->m_GeneralState.Emplace(); + m_pCurStates->m_GraphState.Emplace(); + m_pCurStates->m_TextState.Emplace(); + m_pCurStates->m_ColorState.Emplace(); + } + for (size_t i = 0; i < FX_ArraySize(m_Type3Data); ++i) { + m_Type3Data[i] = 0.0; + } +} + +CPDF_StreamContentParser::~CPDF_StreamContentParser() { + ClearAllParams(); + FX_Free(m_pPathPoints); +} + +int CPDF_StreamContentParser::GetNextParamPos() { + if (m_ParamCount == kParamBufSize) { + m_ParamStartPos++; + if (m_ParamStartPos == kParamBufSize) { + m_ParamStartPos = 0; + } + if (m_ParamBuf[m_ParamStartPos].m_Type == ContentParam::OBJECT) + m_ParamBuf[m_ParamStartPos].m_pObject.reset(); + + return m_ParamStartPos; + } + int index = m_ParamStartPos + m_ParamCount; + if (index >= kParamBufSize) { + index -= kParamBufSize; + } + m_ParamCount++; + return index; +} + +void CPDF_StreamContentParser::AddNameParam(const CFX_ByteStringC& bsName) { + ContentParam& param = m_ParamBuf[GetNextParamPos()]; + if (bsName.GetLength() > 32) { + param.m_Type = ContentParam::OBJECT; + param.m_pObject = pdfium::MakeUnique( + m_pDocument->GetByteStringPool(), PDF_NameDecode(bsName)); + } else { + param.m_Type = ContentParam::NAME; + if (bsName.Find('#') == -1) { + FXSYS_memcpy(param.m_Name.m_Buffer, bsName.raw_str(), bsName.GetLength()); + param.m_Name.m_Len = bsName.GetLength(); + } else { + CFX_ByteString str = PDF_NameDecode(bsName); + FXSYS_memcpy(param.m_Name.m_Buffer, str.c_str(), str.GetLength()); + param.m_Name.m_Len = str.GetLength(); + } + } +} + +void CPDF_StreamContentParser::AddNumberParam(const CFX_ByteStringC& str) { + ContentParam& param = m_ParamBuf[GetNextParamPos()]; + param.m_Type = ContentParam::NUMBER; + param.m_Number.m_bInteger = FX_atonum(str, ¶m.m_Number.m_Integer); +} + +void CPDF_StreamContentParser::AddObjectParam( + std::unique_ptr pObj) { + ContentParam& param = m_ParamBuf[GetNextParamPos()]; + param.m_Type = ContentParam::OBJECT; + param.m_pObject = std::move(pObj); +} + +void CPDF_StreamContentParser::ClearAllParams() { + uint32_t index = m_ParamStartPos; + for (uint32_t i = 0; i < m_ParamCount; i++) { + if (m_ParamBuf[index].m_Type == ContentParam::OBJECT) + m_ParamBuf[index].m_pObject.reset(); + index++; + if (index == kParamBufSize) + index = 0; + } + m_ParamStartPos = 0; + m_ParamCount = 0; +} + +CPDF_Object* CPDF_StreamContentParser::GetObject(uint32_t index) { + if (index >= m_ParamCount) { + return nullptr; + } + int real_index = m_ParamStartPos + m_ParamCount - index - 1; + if (real_index >= kParamBufSize) { + real_index -= kParamBufSize; + } + ContentParam& param = m_ParamBuf[real_index]; + if (param.m_Type == ContentParam::NUMBER) { + param.m_Type = ContentParam::OBJECT; + param.m_pObject = + param.m_Number.m_bInteger + ? pdfium::MakeUnique(param.m_Number.m_Integer) + : pdfium::MakeUnique(param.m_Number.m_Float); + return param.m_pObject.get(); + } + if (param.m_Type == ContentParam::NAME) { + param.m_Type = ContentParam::OBJECT; + param.m_pObject = pdfium::MakeUnique( + m_pDocument->GetByteStringPool(), + CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len)); + return param.m_pObject.get(); + } + if (param.m_Type == ContentParam::OBJECT) + return param.m_pObject.get(); + + ASSERT(false); + return nullptr; +} + +CFX_ByteString CPDF_StreamContentParser::GetString(uint32_t index) { + if (index >= m_ParamCount) { + return CFX_ByteString(); + } + int real_index = m_ParamStartPos + m_ParamCount - index - 1; + if (real_index >= kParamBufSize) { + real_index -= kParamBufSize; + } + ContentParam& param = m_ParamBuf[real_index]; + if (param.m_Type == ContentParam::NAME) { + return CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len); + } + if (param.m_Type == 0 && param.m_pObject) { + return param.m_pObject->GetString(); + } + return CFX_ByteString(); +} + +FX_FLOAT CPDF_StreamContentParser::GetNumber(uint32_t index) { + if (index >= m_ParamCount) { + return 0; + } + int real_index = m_ParamStartPos + m_ParamCount - index - 1; + if (real_index >= kParamBufSize) { + real_index -= kParamBufSize; + } + ContentParam& param = m_ParamBuf[real_index]; + if (param.m_Type == ContentParam::NUMBER) { + return param.m_Number.m_bInteger ? (FX_FLOAT)param.m_Number.m_Integer + : param.m_Number.m_Float; + } + if (param.m_Type == 0 && param.m_pObject) { + return param.m_pObject->GetNumber(); + } + return 0; +} + +void CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj, + bool bColor, + bool bText, + bool bGraph) { + pObj->m_GeneralState = m_pCurStates->m_GeneralState; + pObj->m_ClipPath = m_pCurStates->m_ClipPath; + pObj->m_ContentMark = m_CurContentMark; + if (bColor) { + pObj->m_ColorState = m_pCurStates->m_ColorState; + } + if (bGraph) { + pObj->m_GraphState = m_pCurStates->m_GraphState; + } + if (bText) { + pObj->m_TextState = m_pCurStates->m_TextState; + } +} + +// static +CPDF_StreamContentParser::OpCodes +CPDF_StreamContentParser::InitializeOpCodes() { + return OpCodes({ + {FXBSTR_ID('"', 0, 0, 0), + &CPDF_StreamContentParser::Handle_NextLineShowText_Space}, + {FXBSTR_ID('\'', 0, 0, 0), + &CPDF_StreamContentParser::Handle_NextLineShowText}, + {FXBSTR_ID('B', 0, 0, 0), + &CPDF_StreamContentParser::Handle_FillStrokePath}, + {FXBSTR_ID('B', '*', 0, 0), + &CPDF_StreamContentParser::Handle_EOFillStrokePath}, + {FXBSTR_ID('B', 'D', 'C', 0), + &CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary}, + {FXBSTR_ID('B', 'I', 0, 0), &CPDF_StreamContentParser::Handle_BeginImage}, + {FXBSTR_ID('B', 'M', 'C', 0), + &CPDF_StreamContentParser::Handle_BeginMarkedContent}, + {FXBSTR_ID('B', 'T', 0, 0), &CPDF_StreamContentParser::Handle_BeginText}, + {FXBSTR_ID('C', 'S', 0, 0), + &CPDF_StreamContentParser::Handle_SetColorSpace_Stroke}, + {FXBSTR_ID('D', 'P', 0, 0), + &CPDF_StreamContentParser::Handle_MarkPlace_Dictionary}, + {FXBSTR_ID('D', 'o', 0, 0), + &CPDF_StreamContentParser::Handle_ExecuteXObject}, + {FXBSTR_ID('E', 'I', 0, 0), &CPDF_StreamContentParser::Handle_EndImage}, + {FXBSTR_ID('E', 'M', 'C', 0), + &CPDF_StreamContentParser::Handle_EndMarkedContent}, + {FXBSTR_ID('E', 'T', 0, 0), &CPDF_StreamContentParser::Handle_EndText}, + {FXBSTR_ID('F', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPathOld}, + {FXBSTR_ID('G', 0, 0, 0), + &CPDF_StreamContentParser::Handle_SetGray_Stroke}, + {FXBSTR_ID('I', 'D', 0, 0), + &CPDF_StreamContentParser::Handle_BeginImageData}, + {FXBSTR_ID('J', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineCap}, + {FXBSTR_ID('K', 0, 0, 0), + &CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke}, + {FXBSTR_ID('M', 0, 0, 0), + &CPDF_StreamContentParser::Handle_SetMiterLimit}, + {FXBSTR_ID('M', 'P', 0, 0), &CPDF_StreamContentParser::Handle_MarkPlace}, + {FXBSTR_ID('Q', 0, 0, 0), + &CPDF_StreamContentParser::Handle_RestoreGraphState}, + {FXBSTR_ID('R', 'G', 0, 0), + &CPDF_StreamContentParser::Handle_SetRGBColor_Stroke}, + {FXBSTR_ID('S', 0, 0, 0), &CPDF_StreamContentParser::Handle_StrokePath}, + {FXBSTR_ID('S', 'C', 0, 0), + &CPDF_StreamContentParser::Handle_SetColor_Stroke}, + {FXBSTR_ID('S', 'C', 'N', 0), + &CPDF_StreamContentParser::Handle_SetColorPS_Stroke}, + {FXBSTR_ID('T', '*', 0, 0), + &CPDF_StreamContentParser::Handle_MoveToNextLine}, + {FXBSTR_ID('T', 'D', 0, 0), + &CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading}, + {FXBSTR_ID('T', 'J', 0, 0), + &CPDF_StreamContentParser::Handle_ShowText_Positioning}, + {FXBSTR_ID('T', 'L', 0, 0), + &CPDF_StreamContentParser::Handle_SetTextLeading}, + {FXBSTR_ID('T', 'c', 0, 0), + &CPDF_StreamContentParser::Handle_SetCharSpace}, + {FXBSTR_ID('T', 'd', 0, 0), + &CPDF_StreamContentParser::Handle_MoveTextPoint}, + {FXBSTR_ID('T', 'f', 0, 0), &CPDF_StreamContentParser::Handle_SetFont}, + {FXBSTR_ID('T', 'j', 0, 0), &CPDF_StreamContentParser::Handle_ShowText}, + {FXBSTR_ID('T', 'm', 0, 0), + &CPDF_StreamContentParser::Handle_SetTextMatrix}, + {FXBSTR_ID('T', 'r', 0, 0), + &CPDF_StreamContentParser::Handle_SetTextRenderMode}, + {FXBSTR_ID('T', 's', 0, 0), + &CPDF_StreamContentParser::Handle_SetTextRise}, + {FXBSTR_ID('T', 'w', 0, 0), + &CPDF_StreamContentParser::Handle_SetWordSpace}, + {FXBSTR_ID('T', 'z', 0, 0), + &CPDF_StreamContentParser::Handle_SetHorzScale}, + {FXBSTR_ID('W', 0, 0, 0), &CPDF_StreamContentParser::Handle_Clip}, + {FXBSTR_ID('W', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOClip}, + {FXBSTR_ID('b', 0, 0, 0), + &CPDF_StreamContentParser::Handle_CloseFillStrokePath}, + {FXBSTR_ID('b', '*', 0, 0), + &CPDF_StreamContentParser::Handle_CloseEOFillStrokePath}, + {FXBSTR_ID('c', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_123}, + {FXBSTR_ID('c', 'm', 0, 0), + &CPDF_StreamContentParser::Handle_ConcatMatrix}, + {FXBSTR_ID('c', 's', 0, 0), + &CPDF_StreamContentParser::Handle_SetColorSpace_Fill}, + {FXBSTR_ID('d', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetDash}, + {FXBSTR_ID('d', '0', 0, 0), + &CPDF_StreamContentParser::Handle_SetCharWidth}, + {FXBSTR_ID('d', '1', 0, 0), + &CPDF_StreamContentParser::Handle_SetCachedDevice}, + {FXBSTR_ID('f', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPath}, + {FXBSTR_ID('f', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillPath}, + {FXBSTR_ID('g', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetGray_Fill}, + {FXBSTR_ID('g', 's', 0, 0), + &CPDF_StreamContentParser::Handle_SetExtendGraphState}, + {FXBSTR_ID('h', 0, 0, 0), &CPDF_StreamContentParser::Handle_ClosePath}, + {FXBSTR_ID('i', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetFlat}, + {FXBSTR_ID('j', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineJoin}, + {FXBSTR_ID('k', 0, 0, 0), + &CPDF_StreamContentParser::Handle_SetCMYKColor_Fill}, + {FXBSTR_ID('l', 0, 0, 0), &CPDF_StreamContentParser::Handle_LineTo}, + {FXBSTR_ID('m', 0, 0, 0), &CPDF_StreamContentParser::Handle_MoveTo}, + {FXBSTR_ID('n', 0, 0, 0), &CPDF_StreamContentParser::Handle_EndPath}, + {FXBSTR_ID('q', 0, 0, 0), + &CPDF_StreamContentParser::Handle_SaveGraphState}, + {FXBSTR_ID('r', 'e', 0, 0), &CPDF_StreamContentParser::Handle_Rectangle}, + {FXBSTR_ID('r', 'g', 0, 0), + &CPDF_StreamContentParser::Handle_SetRGBColor_Fill}, + {FXBSTR_ID('r', 'i', 0, 0), + &CPDF_StreamContentParser::Handle_SetRenderIntent}, + {FXBSTR_ID('s', 0, 0, 0), + &CPDF_StreamContentParser::Handle_CloseStrokePath}, + {FXBSTR_ID('s', 'c', 0, 0), + &CPDF_StreamContentParser::Handle_SetColor_Fill}, + {FXBSTR_ID('s', 'c', 'n', 0), + &CPDF_StreamContentParser::Handle_SetColorPS_Fill}, + {FXBSTR_ID('s', 'h', 0, 0), &CPDF_StreamContentParser::Handle_ShadeFill}, + {FXBSTR_ID('v', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_23}, + {FXBSTR_ID('w', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineWidth}, + {FXBSTR_ID('y', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_13}, + }); +} + +void CPDF_StreamContentParser::OnOperator(const CFX_ByteStringC& op) { + static const OpCodes s_OpCodes = InitializeOpCodes(); + + auto it = s_OpCodes.find(op.GetID()); + if (it != s_OpCodes.end()) + (this->*it->second)(); +} + +void CPDF_StreamContentParser::Handle_CloseFillStrokePath() { + Handle_ClosePath(); + AddPathObject(FXFILL_WINDING, true); +} + +void CPDF_StreamContentParser::Handle_FillStrokePath() { + AddPathObject(FXFILL_WINDING, true); +} + +void CPDF_StreamContentParser::Handle_CloseEOFillStrokePath() { + AddPathPoint(m_PathStartX, m_PathStartY, FXPT_TYPE::LineTo, true); + AddPathObject(FXFILL_ALTERNATE, true); +} + +void CPDF_StreamContentParser::Handle_EOFillStrokePath() { + AddPathObject(FXFILL_ALTERNATE, true); +} + +void CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary() { + CFX_ByteString tag = GetString(1); + CPDF_Object* pProperty = GetObject(0); + if (!pProperty) { + return; + } + bool bDirect = true; + if (pProperty->IsName()) { + pProperty = FindResourceObj("Properties", pProperty->GetString()); + if (!pProperty) + return; + bDirect = false; + } + if (CPDF_Dictionary* pDict = pProperty->AsDictionary()) { + m_CurContentMark.AddMark(tag, pDict, bDirect); + } +} + +void CPDF_StreamContentParser::Handle_BeginImage() { + FX_FILESIZE savePos = m_pSyntax->GetPos(); + auto pDict = + pdfium::MakeUnique(m_pDocument->GetByteStringPool()); + while (1) { + CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement(); + if (type == CPDF_StreamParser::Keyword) { + if (m_pSyntax->GetWord() != "ID") { + m_pSyntax->SetPos(savePos); + return; + } + } + if (type != CPDF_StreamParser::Name) { + break; + } + CFX_ByteString key(m_pSyntax->GetWord().Mid(1)); + auto pObj = m_pSyntax->ReadNextObject(false, false, 0); + if (!key.IsEmpty()) { + uint32_t dwObjNum = pObj ? pObj->GetObjNum() : 0; + if (dwObjNum) + pDict->SetNewFor(key, m_pDocument, dwObjNum); + else + pDict->SetFor(key, std::move(pObj)); + } + } + ReplaceAbbr(pDict.get()); + CPDF_Object* pCSObj = nullptr; + if (pDict->KeyExist("ColorSpace")) { + pCSObj = pDict->GetDirectObjectFor("ColorSpace"); + if (pCSObj->IsName()) { + CFX_ByteString name = pCSObj->GetString(); + if (name != "DeviceRGB" && name != "DeviceGray" && name != "DeviceCMYK") { + pCSObj = FindResourceObj("ColorSpace", name); + if (pCSObj && pCSObj->IsInline()) + pDict->SetFor("ColorSpace", pCSObj->Clone()); + } + } + } + pDict->SetNewFor("Subtype", "Image"); + std::unique_ptr pStream = + m_pSyntax->ReadInlineStream(m_pDocument, std::move(pDict), pCSObj); + while (1) { + CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement(); + if (type == CPDF_StreamParser::EndOfData) { + break; + } + if (type != CPDF_StreamParser::Keyword) { + continue; + } + if (m_pSyntax->GetWord() == "EI") { + break; + } + } + AddImage(std::move(pStream)); +} + +void CPDF_StreamContentParser::Handle_BeginMarkedContent() { + m_CurContentMark.AddMark(GetString(0), nullptr, false); +} + +void CPDF_StreamContentParser::Handle_BeginText() { + m_pCurStates->m_TextMatrix = CFX_Matrix(); + OnChangeTextMatrix(); + m_pCurStates->m_TextPos = CFX_PointF(); + m_pCurStates->m_TextLinePos = CFX_PointF(); +} + +void CPDF_StreamContentParser::Handle_CurveTo_123() { + AddPathPoint(GetNumber(5), GetNumber(4), FXPT_TYPE::BezierTo, false); + AddPathPoint(GetNumber(3), GetNumber(2), FXPT_TYPE::BezierTo, false); + AddPathPoint(GetNumber(1), GetNumber(0), FXPT_TYPE::BezierTo, false); +} + +void CPDF_StreamContentParser::Handle_ConcatMatrix() { + CFX_Matrix new_matrix(GetNumber(5), GetNumber(4), GetNumber(3), GetNumber(2), + GetNumber(1), GetNumber(0)); + new_matrix.Concat(m_pCurStates->m_CTM); + m_pCurStates->m_CTM = new_matrix; + OnChangeTextMatrix(); +} + +void CPDF_StreamContentParser::Handle_SetColorSpace_Fill() { + CPDF_ColorSpace* pCS = FindColorSpace(GetString(0)); + if (!pCS) + return; + + m_pCurStates->m_ColorState.GetMutableFillColor()->SetColorSpace(pCS); +} + +void CPDF_StreamContentParser::Handle_SetColorSpace_Stroke() { + CPDF_ColorSpace* pCS = FindColorSpace(GetString(0)); + if (!pCS) + return; + + m_pCurStates->m_ColorState.GetMutableStrokeColor()->SetColorSpace(pCS); +} + +void CPDF_StreamContentParser::Handle_SetDash() { + CPDF_Array* pArray = ToArray(GetObject(1)); + if (!pArray) + return; + + m_pCurStates->SetLineDash(pArray, GetNumber(0), 1.0f); +} + +void CPDF_StreamContentParser::Handle_SetCharWidth() { + m_Type3Data[0] = GetNumber(1); + m_Type3Data[1] = GetNumber(0); + m_bColored = true; +} + +void CPDF_StreamContentParser::Handle_SetCachedDevice() { + for (int i = 0; i < 6; i++) { + m_Type3Data[i] = GetNumber(5 - i); + } + m_bColored = false; +} + +void CPDF_StreamContentParser::Handle_ExecuteXObject() { + CFX_ByteString name = GetString(0); + if (name == m_LastImageName && m_pLastImage && m_pLastImage->GetStream() && + m_pLastImage->GetStream()->GetObjNum()) { + AddImage(m_pLastImage); + return; + } + + CPDF_Stream* pXObject = ToStream(FindResourceObj("XObject", name)); + if (!pXObject) { + m_bResourceMissing = true; + return; + } + + CFX_ByteString type; + if (pXObject->GetDict()) + type = pXObject->GetDict()->GetStringFor("Subtype"); + + if (type == "Image") { + CPDF_ImageObject* pObj = pXObject->IsInline() + ? AddImage(std::unique_ptr( + ToStream(pXObject->Clone()))) + : AddImage(pXObject->GetObjNum()); + + m_LastImageName = name; + m_pLastImage = pObj->GetImage(); + if (!m_pObjectHolder->HasImageMask()) + m_pObjectHolder->SetHasImageMask(m_pLastImage->IsMask()); + } else if (type == "Form") { + AddForm(pXObject); + } +} + +void CPDF_StreamContentParser::AddForm(CPDF_Stream* pStream) { + std::unique_ptr pFormObj(new CPDF_FormObject); + pFormObj->m_pForm.reset( + new CPDF_Form(m_pDocument, m_pPageResources, pStream, m_pResources)); + pFormObj->m_FormMatrix = m_pCurStates->m_CTM; + pFormObj->m_FormMatrix.Concat(m_mtContentToUser); + CPDF_AllStates status; + status.m_GeneralState = m_pCurStates->m_GeneralState; + status.m_GraphState = m_pCurStates->m_GraphState; + status.m_ColorState = m_pCurStates->m_ColorState; + status.m_TextState = m_pCurStates->m_TextState; + pFormObj->m_pForm->ParseContent(&status, nullptr, nullptr, m_Level + 1); + if (!m_pObjectHolder->BackgroundAlphaNeeded() && + pFormObj->m_pForm->BackgroundAlphaNeeded()) { + m_pObjectHolder->SetBackgroundAlphaNeeded(true); + } + pFormObj->CalcBoundingBox(); + SetGraphicStates(pFormObj.get(), true, true, true); + m_pObjectHolder->GetPageObjectList()->push_back(std::move(pFormObj)); +} + +CPDF_ImageObject* CPDF_StreamContentParser::AddImage( + std::unique_ptr pStream) { + if (!pStream) + return nullptr; + + auto pImageObj = pdfium::MakeUnique(); + pImageObj->SetOwnedImage( + pdfium::MakeUnique(m_pDocument, std::move(pStream))); + return AddImageObject(std::move(pImageObj)); +} + +CPDF_ImageObject* CPDF_StreamContentParser::AddImage(uint32_t streamObjNum) { + auto pImageObj = pdfium::MakeUnique(); + pImageObj->SetUnownedImage(m_pDocument->LoadImageFromPageData(streamObjNum)); + return AddImageObject(std::move(pImageObj)); +} + +CPDF_ImageObject* CPDF_StreamContentParser::AddImage(CPDF_Image* pImage) { + if (!pImage) + return nullptr; + + auto pImageObj = pdfium::MakeUnique(); + pImageObj->SetUnownedImage( + m_pDocument->GetPageData()->GetImage(pImage->GetStream()->GetObjNum())); + + return AddImageObject(std::move(pImageObj)); +} + +CPDF_ImageObject* CPDF_StreamContentParser::AddImageObject( + std::unique_ptr pImageObj) { + SetGraphicStates(pImageObj.get(), pImageObj->GetImage()->IsMask(), false, + false); + + CFX_Matrix ImageMatrix = m_pCurStates->m_CTM; + ImageMatrix.Concat(m_mtContentToUser); + pImageObj->set_matrix(ImageMatrix); + pImageObj->CalcBoundingBox(); + + CPDF_ImageObject* pRet = pImageObj.get(); + m_pObjectHolder->GetPageObjectList()->push_back(std::move(pImageObj)); + return pRet; +} + +void CPDF_StreamContentParser::Handle_MarkPlace_Dictionary() {} + +void CPDF_StreamContentParser::Handle_EndImage() {} + +void CPDF_StreamContentParser::Handle_EndMarkedContent() { + if (m_CurContentMark) + m_CurContentMark.DeleteLastMark(); +} + +void CPDF_StreamContentParser::Handle_EndText() { + if (m_ClipTextList.empty()) + return; + + if (TextRenderingModeIsClipMode(m_pCurStates->m_TextState.GetTextMode())) + m_pCurStates->m_ClipPath.AppendTexts(&m_ClipTextList); + + m_ClipTextList.clear(); +} + +void CPDF_StreamContentParser::Handle_FillPath() { + AddPathObject(FXFILL_WINDING, false); +} + +void CPDF_StreamContentParser::Handle_FillPathOld() { + AddPathObject(FXFILL_WINDING, false); +} + +void CPDF_StreamContentParser::Handle_EOFillPath() { + AddPathObject(FXFILL_ALTERNATE, false); +} + +void CPDF_StreamContentParser::Handle_SetGray_Fill() { + FX_FLOAT value = GetNumber(0); + CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY); + m_pCurStates->m_ColorState.SetFillColor(pCS, &value, 1); +} + +void CPDF_StreamContentParser::Handle_SetGray_Stroke() { + FX_FLOAT value = GetNumber(0); + CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY); + m_pCurStates->m_ColorState.SetStrokeColor(pCS, &value, 1); +} + +void CPDF_StreamContentParser::Handle_SetExtendGraphState() { + CFX_ByteString name = GetString(0); + CPDF_Dictionary* pGS = ToDictionary(FindResourceObj("ExtGState", name)); + if (!pGS) { + m_bResourceMissing = true; + return; + } + m_pCurStates->ProcessExtGS(pGS, this); +} + +void CPDF_StreamContentParser::Handle_ClosePath() { + if (m_PathPointCount == 0) { + return; + } + if (m_PathStartX != m_PathCurrentX || m_PathStartY != m_PathCurrentY) { + AddPathPoint(m_PathStartX, m_PathStartY, FXPT_TYPE::LineTo, true); + } else if (m_pPathPoints[m_PathPointCount - 1].m_Type != FXPT_TYPE::MoveTo) { + m_pPathPoints[m_PathPointCount - 1].m_CloseFigure = true; + } +} + +void CPDF_StreamContentParser::Handle_SetFlat() { + m_pCurStates->m_GeneralState.SetFlatness(GetNumber(0)); +} + +void CPDF_StreamContentParser::Handle_BeginImageData() {} + +void CPDF_StreamContentParser::Handle_SetLineJoin() { + m_pCurStates->m_GraphState.SetLineJoin( + static_cast(GetInteger(0))); +} + +void CPDF_StreamContentParser::Handle_SetLineCap() { + m_pCurStates->m_GraphState.SetLineCap( + static_cast(GetInteger(0))); +} + +void CPDF_StreamContentParser::Handle_SetCMYKColor_Fill() { + if (m_ParamCount != 4) + return; + + FX_FLOAT values[4]; + for (int i = 0; i < 4; i++) { + values[i] = GetNumber(3 - i); + } + CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK); + m_pCurStates->m_ColorState.SetFillColor(pCS, values, 4); +} + +void CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke() { + if (m_ParamCount != 4) + return; + + FX_FLOAT values[4]; + for (int i = 0; i < 4; i++) { + values[i] = GetNumber(3 - i); + } + CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK); + m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 4); +} + +void CPDF_StreamContentParser::Handle_LineTo() { + if (m_ParamCount != 2) + return; + + AddPathPoint(GetNumber(1), GetNumber(0), FXPT_TYPE::LineTo, false); +} + +void CPDF_StreamContentParser::Handle_MoveTo() { + if (m_ParamCount != 2) + return; + + AddPathPoint(GetNumber(1), GetNumber(0), FXPT_TYPE::MoveTo, false); + ParsePathObject(); +} + +void CPDF_StreamContentParser::Handle_SetMiterLimit() { + m_pCurStates->m_GraphState.SetMiterLimit(GetNumber(0)); +} + +void CPDF_StreamContentParser::Handle_MarkPlace() {} + +void CPDF_StreamContentParser::Handle_EndPath() { + AddPathObject(0, false); +} + +void CPDF_StreamContentParser::Handle_SaveGraphState() { + std::unique_ptr pStates(new CPDF_AllStates); + pStates->Copy(*m_pCurStates); + m_StateStack.push_back(std::move(pStates)); +} + +void CPDF_StreamContentParser::Handle_RestoreGraphState() { + if (m_StateStack.empty()) + return; + std::unique_ptr pStates = std::move(m_StateStack.back()); + m_StateStack.pop_back(); + m_pCurStates->Copy(*pStates); +} + +void CPDF_StreamContentParser::Handle_Rectangle() { + FX_FLOAT x = GetNumber(3), y = GetNumber(2); + FX_FLOAT w = GetNumber(1), h = GetNumber(0); + AddPathRect(x, y, w, h); +} + +void CPDF_StreamContentParser::AddPathRect(FX_FLOAT x, + FX_FLOAT y, + FX_FLOAT w, + FX_FLOAT h) { + AddPathPoint(x, y, FXPT_TYPE::MoveTo, false); + AddPathPoint(x + w, y, FXPT_TYPE::LineTo, false); + AddPathPoint(x + w, y + h, FXPT_TYPE::LineTo, false); + AddPathPoint(x, y + h, FXPT_TYPE::LineTo, false); + AddPathPoint(x, y, FXPT_TYPE::LineTo, true); +} + +void CPDF_StreamContentParser::Handle_SetRGBColor_Fill() { + if (m_ParamCount != 3) + return; + + FX_FLOAT values[3]; + for (int i = 0; i < 3; i++) { + values[i] = GetNumber(2 - i); + } + CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB); + m_pCurStates->m_ColorState.SetFillColor(pCS, values, 3); +} + +void CPDF_StreamContentParser::Handle_SetRGBColor_Stroke() { + if (m_ParamCount != 3) + return; + + FX_FLOAT values[3]; + for (int i = 0; i < 3; i++) { + values[i] = GetNumber(2 - i); + } + CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB); + m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 3); +} + +void CPDF_StreamContentParser::Handle_SetRenderIntent() {} + +void CPDF_StreamContentParser::Handle_CloseStrokePath() { + Handle_ClosePath(); + AddPathObject(0, true); +} + +void CPDF_StreamContentParser::Handle_StrokePath() { + AddPathObject(0, true); +} + +void CPDF_StreamContentParser::Handle_SetColor_Fill() { + FX_FLOAT values[4]; + int nargs = m_ParamCount; + if (nargs > 4) { + nargs = 4; + } + for (int i = 0; i < nargs; i++) { + values[i] = GetNumber(nargs - i - 1); + } + m_pCurStates->m_ColorState.SetFillColor(nullptr, values, nargs); +} + +void CPDF_StreamContentParser::Handle_SetColor_Stroke() { + FX_FLOAT values[4]; + int nargs = m_ParamCount; + if (nargs > 4) { + nargs = 4; + } + for (int i = 0; i < nargs; i++) { + values[i] = GetNumber(nargs - i - 1); + } + m_pCurStates->m_ColorState.SetStrokeColor(nullptr, values, nargs); +} + +void CPDF_StreamContentParser::Handle_SetColorPS_Fill() { + CPDF_Object* pLastParam = GetObject(0); + if (!pLastParam) { + return; + } + uint32_t nargs = m_ParamCount; + uint32_t nvalues = nargs; + if (pLastParam->IsName()) + nvalues--; + FX_FLOAT* values = nullptr; + if (nvalues) { + values = FX_Alloc(FX_FLOAT, nvalues); + for (uint32_t i = 0; i < nvalues; i++) { + values[i] = GetNumber(nargs - i - 1); + } + } + if (nvalues != nargs) { + CPDF_Pattern* pPattern = FindPattern(GetString(0), false); + if (pPattern) { + m_pCurStates->m_ColorState.SetFillPattern(pPattern, values, nvalues); + } + } else { + m_pCurStates->m_ColorState.SetFillColor(nullptr, values, nvalues); + } + FX_Free(values); +} + +void CPDF_StreamContentParser::Handle_SetColorPS_Stroke() { + CPDF_Object* pLastParam = GetObject(0); + if (!pLastParam) { + return; + } + int nargs = m_ParamCount; + int nvalues = nargs; + if (pLastParam->IsName()) + nvalues--; + + FX_FLOAT* values = nullptr; + if (nvalues) { + values = FX_Alloc(FX_FLOAT, nvalues); + for (int i = 0; i < nvalues; i++) { + values[i] = GetNumber(nargs - i - 1); + } + } + if (nvalues != nargs) { + CPDF_Pattern* pPattern = FindPattern(GetString(0), false); + if (pPattern) { + m_pCurStates->m_ColorState.SetStrokePattern(pPattern, values, nvalues); + } + } else { + m_pCurStates->m_ColorState.SetStrokeColor(nullptr, values, nvalues); + } + FX_Free(values); +} + +void CPDF_StreamContentParser::Handle_ShadeFill() { + CPDF_Pattern* pPattern = FindPattern(GetString(0), true); + if (!pPattern) + return; + + CPDF_ShadingPattern* pShading = pPattern->AsShadingPattern(); + if (!pShading) + return; + + if (!pShading->IsShadingObject() || !pShading->Load()) + return; + + std::unique_ptr pObj(new CPDF_ShadingObject); + pObj->m_pShading = pShading; + SetGraphicStates(pObj.get(), false, false, false); + pObj->m_Matrix = m_pCurStates->m_CTM; + pObj->m_Matrix.Concat(m_mtContentToUser); + CFX_FloatRect bbox = + pObj->m_ClipPath ? pObj->m_ClipPath.GetClipBox() : m_BBox; + if (pShading->IsMeshShading()) + bbox.Intersect(GetShadingBBox(pShading, pObj->m_Matrix)); + pObj->m_Left = bbox.left; + pObj->m_Right = bbox.right; + pObj->m_Top = bbox.top; + pObj->m_Bottom = bbox.bottom; + m_pObjectHolder->GetPageObjectList()->push_back(std::move(pObj)); +} + +void CPDF_StreamContentParser::Handle_SetCharSpace() { + m_pCurStates->m_TextState.SetCharSpace(GetNumber(0)); +} + +void CPDF_StreamContentParser::Handle_MoveTextPoint() { + m_pCurStates->m_TextLinePos += CFX_PointF(GetNumber(1), GetNumber(0)); + m_pCurStates->m_TextPos = m_pCurStates->m_TextLinePos; +} + +void CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading() { + Handle_MoveTextPoint(); + m_pCurStates->m_TextLeading = -GetNumber(0); +} + +void CPDF_StreamContentParser::Handle_SetFont() { + FX_FLOAT fs = GetNumber(0); + if (fs == 0) { + fs = m_DefFontSize; + } + m_pCurStates->m_TextState.SetFontSize(fs); + CPDF_Font* pFont = FindFont(GetString(1)); + if (pFont) { + m_pCurStates->m_TextState.SetFont(pFont); + } +} + +CPDF_Object* CPDF_StreamContentParser::FindResourceObj( + const CFX_ByteString& type, + const CFX_ByteString& name) { + if (!m_pResources) + return nullptr; + CPDF_Dictionary* pDict = m_pResources->GetDictFor(type); + if (pDict) + return pDict->GetDirectObjectFor(name); + if (m_pResources == m_pPageResources || !m_pPageResources) + return nullptr; + + CPDF_Dictionary* pPageDict = m_pPageResources->GetDictFor(type); + return pPageDict ? pPageDict->GetDirectObjectFor(name) : nullptr; +} + +CPDF_Font* CPDF_StreamContentParser::FindFont(const CFX_ByteString& name) { + CPDF_Dictionary* pFontDict = ToDictionary(FindResourceObj("Font", name)); + if (!pFontDict) { + m_bResourceMissing = true; + return CPDF_Font::GetStockFont(m_pDocument, "Helvetica"); + } + + CPDF_Font* pFont = m_pDocument->LoadFont(pFontDict); + if (pFont && pFont->IsType3Font()) { + pFont->AsType3Font()->SetPageResources(m_pResources); + pFont->AsType3Font()->CheckType3FontMetrics(); + } + return pFont; +} + +CPDF_ColorSpace* CPDF_StreamContentParser::FindColorSpace( + const CFX_ByteString& name) { + if (name == "Pattern") { + return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN); + } + if (name == "DeviceGray" || name == "DeviceCMYK" || name == "DeviceRGB") { + CFX_ByteString defname = "Default"; + defname += name.Mid(7); + CPDF_Object* pDefObj = FindResourceObj("ColorSpace", defname); + if (!pDefObj) { + if (name == "DeviceGray") { + return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY); + } + if (name == "DeviceRGB") { + return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB); + } + return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK); + } + return m_pDocument->LoadColorSpace(pDefObj); + } + CPDF_Object* pCSObj = FindResourceObj("ColorSpace", name); + if (!pCSObj) { + m_bResourceMissing = true; + return nullptr; + } + return m_pDocument->LoadColorSpace(pCSObj); +} + +CPDF_Pattern* CPDF_StreamContentParser::FindPattern(const CFX_ByteString& name, + bool bShading) { + CPDF_Object* pPattern = + FindResourceObj(bShading ? "Shading" : "Pattern", name); + if (!pPattern || (!pPattern->IsDictionary() && !pPattern->IsStream())) { + m_bResourceMissing = true; + return nullptr; + } + return m_pDocument->LoadPattern(pPattern, bShading, + m_pCurStates->m_ParentMatrix); +} + +void CPDF_StreamContentParser::AddTextObject(CFX_ByteString* pStrs, + FX_FLOAT fInitKerning, + FX_FLOAT* pKerning, + int nsegs) { + CPDF_Font* pFont = m_pCurStates->m_TextState.GetFont(); + if (!pFont) { + return; + } + if (fInitKerning != 0) { + if (!pFont->IsVertWriting()) { + m_pCurStates->m_TextPos.x -= + (fInitKerning * m_pCurStates->m_TextState.GetFontSize() * + m_pCurStates->m_TextHorzScale) / + 1000; + } else { + m_pCurStates->m_TextPos.y -= + (fInitKerning * m_pCurStates->m_TextState.GetFontSize()) / 1000; + } + } + if (nsegs == 0) { + return; + } + const TextRenderingMode text_mode = + pFont->IsType3Font() ? TextRenderingMode::MODE_FILL + : m_pCurStates->m_TextState.GetTextMode(); + { + std::unique_ptr pText(new CPDF_TextObject); + m_pLastTextObject = pText.get(); + SetGraphicStates(m_pLastTextObject, true, true, true); + if (TextRenderingModeIsStrokeMode(text_mode)) { + FX_FLOAT* pCTM = pText->m_TextState.GetMutableCTM(); + pCTM[0] = m_pCurStates->m_CTM.a; + pCTM[1] = m_pCurStates->m_CTM.c; + pCTM[2] = m_pCurStates->m_CTM.b; + pCTM[3] = m_pCurStates->m_CTM.d; + } + pText->SetSegments(pStrs, pKerning, nsegs); + pText->m_Pos = m_mtContentToUser.Transform( + m_pCurStates->m_CTM.Transform(m_pCurStates->m_TextMatrix.Transform( + CFX_PointF(m_pCurStates->m_TextPos.x, + m_pCurStates->m_TextPos.y + m_pCurStates->m_TextRise)))); + + m_pCurStates->m_TextPos += + pText->CalcPositionData(m_pCurStates->m_TextHorzScale); + if (TextRenderingModeIsClipMode(text_mode)) { + m_ClipTextList.push_back( + std::unique_ptr(pText->Clone())); + } + m_pObjectHolder->GetPageObjectList()->push_back(std::move(pText)); + } + if (pKerning && pKerning[nsegs - 1] != 0) { + if (!pFont->IsVertWriting()) { + m_pCurStates->m_TextPos.x -= + (pKerning[nsegs - 1] * m_pCurStates->m_TextState.GetFontSize() * + m_pCurStates->m_TextHorzScale) / + 1000; + } else { + m_pCurStates->m_TextPos.y -= + (pKerning[nsegs - 1] * m_pCurStates->m_TextState.GetFontSize()) / + 1000; + } + } +} + +void CPDF_StreamContentParser::Handle_ShowText() { + CFX_ByteString str = GetString(0); + if (str.IsEmpty()) { + return; + } + AddTextObject(&str, 0, nullptr, 1); +} + +void CPDF_StreamContentParser::Handle_ShowText_Positioning() { + CPDF_Array* pArray = ToArray(GetObject(0)); + if (!pArray) + return; + + size_t n = pArray->GetCount(); + size_t nsegs = 0; + for (size_t i = 0; i < n; i++) { + if (pArray->GetDirectObjectAt(i)->IsString()) + nsegs++; + } + if (nsegs == 0) { + for (size_t i = 0; i < n; i++) { + m_pCurStates->m_TextPos.x -= + (pArray->GetNumberAt(i) * m_pCurStates->m_TextState.GetFontSize() * + m_pCurStates->m_TextHorzScale) / + 1000; + } + return; + } + CFX_ByteString* pStrs = new CFX_ByteString[nsegs]; + FX_FLOAT* pKerning = FX_Alloc(FX_FLOAT, nsegs); + size_t iSegment = 0; + FX_FLOAT fInitKerning = 0; + for (size_t i = 0; i < n; i++) { + CPDF_Object* pObj = pArray->GetDirectObjectAt(i); + if (pObj->IsString()) { + CFX_ByteString str = pObj->GetString(); + if (str.IsEmpty()) { + continue; + } + pStrs[iSegment] = str; + pKerning[iSegment++] = 0; + } else { + FX_FLOAT num = pObj ? pObj->GetNumber() : 0; + if (iSegment == 0) { + fInitKerning += num; + } else { + pKerning[iSegment - 1] += num; + } + } + } + AddTextObject(pStrs, fInitKerning, pKerning, iSegment); + delete[] pStrs; + FX_Free(pKerning); +} + +void CPDF_StreamContentParser::Handle_SetTextLeading() { + m_pCurStates->m_TextLeading = GetNumber(0); +} + +void CPDF_StreamContentParser::Handle_SetTextMatrix() { + m_pCurStates->m_TextMatrix = + CFX_Matrix(GetNumber(5), GetNumber(4), GetNumber(3), GetNumber(2), + GetNumber(1), GetNumber(0)); + OnChangeTextMatrix(); + m_pCurStates->m_TextPos = CFX_PointF(); + m_pCurStates->m_TextLinePos = CFX_PointF(); +} + +void CPDF_StreamContentParser::OnChangeTextMatrix() { + CFX_Matrix text_matrix(m_pCurStates->m_TextHorzScale, 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f); + text_matrix.Concat(m_pCurStates->m_TextMatrix); + text_matrix.Concat(m_pCurStates->m_CTM); + text_matrix.Concat(m_mtContentToUser); + FX_FLOAT* pTextMatrix = m_pCurStates->m_TextState.GetMutableMatrix(); + pTextMatrix[0] = text_matrix.a; + pTextMatrix[1] = text_matrix.c; + pTextMatrix[2] = text_matrix.b; + pTextMatrix[3] = text_matrix.d; +} + +void CPDF_StreamContentParser::Handle_SetTextRenderMode() { + TextRenderingMode mode; + if (SetTextRenderingModeFromInt(GetInteger(0), &mode)) + m_pCurStates->m_TextState.SetTextMode(mode); +} + +void CPDF_StreamContentParser::Handle_SetTextRise() { + m_pCurStates->m_TextRise = GetNumber(0); +} + +void CPDF_StreamContentParser::Handle_SetWordSpace() { + m_pCurStates->m_TextState.SetWordSpace(GetNumber(0)); +} + +void CPDF_StreamContentParser::Handle_SetHorzScale() { + if (m_ParamCount != 1) { + return; + } + m_pCurStates->m_TextHorzScale = GetNumber(0) / 100; + OnChangeTextMatrix(); +} + +void CPDF_StreamContentParser::Handle_MoveToNextLine() { + m_pCurStates->m_TextLinePos.y -= m_pCurStates->m_TextLeading; + m_pCurStates->m_TextPos = m_pCurStates->m_TextLinePos; +} + +void CPDF_StreamContentParser::Handle_CurveTo_23() { + AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_TYPE::BezierTo, false); + AddPathPoint(GetNumber(3), GetNumber(2), FXPT_TYPE::BezierTo, false); + AddPathPoint(GetNumber(1), GetNumber(0), FXPT_TYPE::BezierTo, false); +} + +void CPDF_StreamContentParser::Handle_SetLineWidth() { + m_pCurStates->m_GraphState.SetLineWidth(GetNumber(0)); +} + +void CPDF_StreamContentParser::Handle_Clip() { + m_PathClipType = FXFILL_WINDING; +} + +void CPDF_StreamContentParser::Handle_EOClip() { + m_PathClipType = FXFILL_ALTERNATE; +} + +void CPDF_StreamContentParser::Handle_CurveTo_13() { + AddPathPoint(GetNumber(3), GetNumber(2), FXPT_TYPE::BezierTo, false); + AddPathPoint(GetNumber(1), GetNumber(0), FXPT_TYPE::BezierTo, false); + AddPathPoint(GetNumber(1), GetNumber(0), FXPT_TYPE::BezierTo, false); +} + +void CPDF_StreamContentParser::Handle_NextLineShowText() { + Handle_MoveToNextLine(); + Handle_ShowText(); +} + +void CPDF_StreamContentParser::Handle_NextLineShowText_Space() { + m_pCurStates->m_TextState.SetWordSpace(GetNumber(2)); + m_pCurStates->m_TextState.SetCharSpace(GetNumber(1)); + Handle_NextLineShowText(); +} + +void CPDF_StreamContentParser::Handle_Invalid() {} + +void CPDF_StreamContentParser::AddPathPoint(FX_FLOAT x, + FX_FLOAT y, + FXPT_TYPE type, + bool close) { + m_PathCurrentX = x; + m_PathCurrentY = y; + if (type == FXPT_TYPE::MoveTo && !close) { + m_PathStartX = x; + m_PathStartY = y; + if (m_PathPointCount && + m_pPathPoints[m_PathPointCount - 1].IsTypeAndOpen(FXPT_TYPE::MoveTo)) { + m_pPathPoints[m_PathPointCount - 1].m_Point = CFX_PointF(x, y); + return; + } + } else if (m_PathPointCount == 0) { + return; + } + m_PathPointCount++; + if (m_PathPointCount > m_PathAllocSize) { + int newsize = m_PathPointCount + 256; + FX_PATHPOINT* pNewPoints = FX_Alloc(FX_PATHPOINT, newsize); + if (m_PathAllocSize) { + FXSYS_memcpy(pNewPoints, m_pPathPoints, + m_PathAllocSize * sizeof(FX_PATHPOINT)); + FX_Free(m_pPathPoints); + } + m_pPathPoints = pNewPoints; + m_PathAllocSize = newsize; + } + m_pPathPoints[m_PathPointCount - 1].m_Type = type; + m_pPathPoints[m_PathPointCount - 1].m_CloseFigure = close; + m_pPathPoints[m_PathPointCount - 1].m_Point = CFX_PointF(x, y); +} + +void CPDF_StreamContentParser::AddPathObject(int FillType, bool bStroke) { + int PathPointCount = m_PathPointCount; + uint8_t PathClipType = m_PathClipType; + m_PathPointCount = 0; + m_PathClipType = 0; + if (PathPointCount <= 1) { + if (PathPointCount && PathClipType) { + CPDF_Path path; + path.AppendRect(0, 0, 0, 0); + m_pCurStates->m_ClipPath.AppendPath(path, FXFILL_WINDING, true); + } + return; + } + if (PathPointCount && + m_pPathPoints[PathPointCount - 1].IsTypeAndOpen(FXPT_TYPE::MoveTo)) { + PathPointCount--; + } + + CPDF_Path Path; + for (int i = 0; i < PathPointCount; i++) { + FX_PATHPOINT& point = m_pPathPoints[i]; + Path.AppendPoint(point.m_Point, point.m_Type, point.m_CloseFigure); + } + + CFX_Matrix matrix = m_pCurStates->m_CTM; + matrix.Concat(m_mtContentToUser); + if (bStroke || FillType) { + std::unique_ptr pPathObj(new CPDF_PathObject); + pPathObj->m_bStroke = bStroke; + pPathObj->m_FillType = FillType; + pPathObj->m_Path = Path; + pPathObj->m_Matrix = matrix; + SetGraphicStates(pPathObj.get(), true, false, true); + pPathObj->CalcBoundingBox(); + m_pObjectHolder->GetPageObjectList()->push_back(std::move(pPathObj)); + } + if (PathClipType) { + if (!matrix.IsIdentity()) { + Path.Transform(&matrix); + matrix.SetIdentity(); + } + m_pCurStates->m_ClipPath.AppendPath(Path, PathClipType, true); + } +} + +uint32_t CPDF_StreamContentParser::Parse(const uint8_t* pData, + uint32_t dwSize, + uint32_t max_cost) { + if (m_Level > kMaxFormLevel) + return dwSize; + + uint32_t InitObjCount = m_pObjectHolder->GetPageObjectList()->size(); + CPDF_StreamParser syntax(pData, dwSize, m_pDocument->GetByteStringPool()); + CPDF_StreamParserAutoClearer auto_clearer(&m_pSyntax, &syntax); + while (1) { + uint32_t cost = m_pObjectHolder->GetPageObjectList()->size() - InitObjCount; + if (max_cost && cost >= max_cost) { + break; + } + switch (syntax.ParseNextElement()) { + case CPDF_StreamParser::EndOfData: + return m_pSyntax->GetPos(); + case CPDF_StreamParser::Keyword: + OnOperator(syntax.GetWord()); + ClearAllParams(); + break; + case CPDF_StreamParser::Number: + AddNumberParam(syntax.GetWord()); + break; + case CPDF_StreamParser::Name: + AddNameParam(syntax.GetWord().Mid(1)); + break; + default: + AddObjectParam(syntax.GetObject()); + } + } + return m_pSyntax->GetPos(); +} + +void CPDF_StreamContentParser::ParsePathObject() { + FX_FLOAT params[6] = {}; + int nParams = 0; + int last_pos = m_pSyntax->GetPos(); + while (1) { + CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement(); + bool bProcessed = true; + switch (type) { + case CPDF_StreamParser::EndOfData: + return; + case CPDF_StreamParser::Keyword: { + CFX_ByteStringC strc = m_pSyntax->GetWord(); + int len = strc.GetLength(); + if (len == 1) { + switch (strc[0]) { + case kPathOperatorSubpath: + AddPathPoint(params[0], params[1], FXPT_TYPE::MoveTo, false); + nParams = 0; + break; + case kPathOperatorLine: + AddPathPoint(params[0], params[1], FXPT_TYPE::LineTo, false); + nParams = 0; + break; + case kPathOperatorCubicBezier1: + AddPathPoint(params[0], params[1], FXPT_TYPE::BezierTo, false); + AddPathPoint(params[2], params[3], FXPT_TYPE::BezierTo, false); + AddPathPoint(params[4], params[5], FXPT_TYPE::BezierTo, false); + nParams = 0; + break; + case kPathOperatorCubicBezier2: + AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_TYPE::BezierTo, + false); + AddPathPoint(params[0], params[1], FXPT_TYPE::BezierTo, false); + AddPathPoint(params[2], params[3], FXPT_TYPE::BezierTo, false); + nParams = 0; + break; + case kPathOperatorCubicBezier3: + AddPathPoint(params[0], params[1], FXPT_TYPE::BezierTo, false); + AddPathPoint(params[2], params[3], FXPT_TYPE::BezierTo, false); + AddPathPoint(params[2], params[3], FXPT_TYPE::BezierTo, false); + nParams = 0; + break; + case kPathOperatorClosePath: + Handle_ClosePath(); + nParams = 0; + break; + default: + bProcessed = false; + break; + } + } else if (len == 2) { + if (strc[0] == kPathOperatorRectangle[0] && + strc[1] == kPathOperatorRectangle[1]) { + AddPathRect(params[0], params[1], params[2], params[3]); + nParams = 0; + } else { + bProcessed = false; + } + } else { + bProcessed = false; + } + if (bProcessed) { + last_pos = m_pSyntax->GetPos(); + } + break; + } + case CPDF_StreamParser::Number: { + if (nParams == 6) + break; + + int value; + bool bInteger = FX_atonum(m_pSyntax->GetWord(), &value); + params[nParams++] = bInteger ? (FX_FLOAT)value : *(FX_FLOAT*)&value; + break; + } + default: + bProcessed = false; + } + if (!bProcessed) { + m_pSyntax->SetPos(last_pos); + return; + } + } +} + +CPDF_StreamContentParser::ContentParam::ContentParam() {} + +CPDF_StreamContentParser::ContentParam::~ContentParam() {} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamcontentparser.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamcontentparser.h new file mode 100644 index 000000000000..cd41990b0a72 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamcontentparser.h @@ -0,0 +1,223 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_STREAMCONTENTPARSER_H_ +#define CORE_FPDFAPI_PAGE_CPDF_STREAMCONTENTPARSER_H_ + +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_contentmark.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxge/cfx_pathdata.h" + +class CPDF_AllStates; +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_Font; +class CPDF_Image; +class CPDF_ImageObject; +class CPDF_PageObject; +class CPDF_PageObjectHolder; +class CPDF_StreamParser; +class CPDF_TextObject; +class CPDF_ColorSpace; +class CPDF_Pattern; + +class CPDF_StreamContentParser { + public: + CPDF_StreamContentParser(CPDF_Document* pDoc, + CPDF_Dictionary* pPageResources, + CPDF_Dictionary* pParentResources, + const CFX_Matrix* pmtContentToUser, + CPDF_PageObjectHolder* pObjectHolder, + CPDF_Dictionary* pResources, + CFX_FloatRect* pBBox, + CPDF_AllStates* pAllStates, + int level); + ~CPDF_StreamContentParser(); + + uint32_t Parse(const uint8_t* pData, uint32_t dwSize, uint32_t max_cost); + CPDF_PageObjectHolder* GetPageObjectHolder() const { return m_pObjectHolder; } + CPDF_AllStates* GetCurStates() const { return m_pCurStates.get(); } + bool IsColored() const { return m_bColored; } + const FX_FLOAT* GetType3Data() const { return m_Type3Data; } + CPDF_Font* FindFont(const CFX_ByteString& name); + + private: + struct ContentParam { + enum Type { OBJECT = 0, NUMBER, NAME }; + + ContentParam(); + ~ContentParam(); + + Type m_Type; + std::unique_ptr m_pObject; + struct { + bool m_bInteger; + union { + int m_Integer; + FX_FLOAT m_Float; + }; + } m_Number; + struct { + int m_Len; + char m_Buffer[32]; + } m_Name; + }; + + static const int kParamBufSize = 16; + + using OpCodes = + std::unordered_map; + static OpCodes InitializeOpCodes(); + + void AddNameParam(const CFX_ByteStringC& str); + void AddNumberParam(const CFX_ByteStringC& str); + void AddObjectParam(std::unique_ptr pObj); + int GetNextParamPos(); + void ClearAllParams(); + CPDF_Object* GetObject(uint32_t index); + CFX_ByteString GetString(uint32_t index); + FX_FLOAT GetNumber(uint32_t index); + int GetInteger(uint32_t index) { return (int32_t)(GetNumber(index)); } + void OnOperator(const CFX_ByteStringC& op); + void AddTextObject(CFX_ByteString* pText, + FX_FLOAT fInitKerning, + FX_FLOAT* pKerning, + int count); + + void OnChangeTextMatrix(); + void ParsePathObject(); + void AddPathPoint(FX_FLOAT x, FX_FLOAT y, FXPT_TYPE type, bool close); + void AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h); + void AddPathObject(int FillType, bool bStroke); + CPDF_ImageObject* AddImage(std::unique_ptr pStream); + CPDF_ImageObject* AddImage(uint32_t streamObjNum); + CPDF_ImageObject* AddImage(CPDF_Image* pImage); + + void AddForm(CPDF_Stream* pStream); + void SetGraphicStates(CPDF_PageObject* pObj, + bool bColor, + bool bText, + bool bGraph); + CPDF_ColorSpace* FindColorSpace(const CFX_ByteString& name); + CPDF_Pattern* FindPattern(const CFX_ByteString& name, bool bShading); + CPDF_Object* FindResourceObj(const CFX_ByteString& type, + const CFX_ByteString& name); + + // Takes ownership of |pImageObj|, returns unowned pointer to it. + CPDF_ImageObject* AddImageObject(std::unique_ptr pImageObj); + + void Handle_CloseFillStrokePath(); + void Handle_FillStrokePath(); + void Handle_CloseEOFillStrokePath(); + void Handle_EOFillStrokePath(); + void Handle_BeginMarkedContent_Dictionary(); + void Handle_BeginImage(); + void Handle_BeginMarkedContent(); + void Handle_BeginText(); + void Handle_CurveTo_123(); + void Handle_ConcatMatrix(); + void Handle_SetColorSpace_Fill(); + void Handle_SetColorSpace_Stroke(); + void Handle_SetDash(); + void Handle_SetCharWidth(); + void Handle_SetCachedDevice(); + void Handle_ExecuteXObject(); + void Handle_MarkPlace_Dictionary(); + void Handle_EndImage(); + void Handle_EndMarkedContent(); + void Handle_EndText(); + void Handle_FillPath(); + void Handle_FillPathOld(); + void Handle_EOFillPath(); + void Handle_SetGray_Fill(); + void Handle_SetGray_Stroke(); + void Handle_SetExtendGraphState(); + void Handle_ClosePath(); + void Handle_SetFlat(); + void Handle_BeginImageData(); + void Handle_SetLineJoin(); + void Handle_SetLineCap(); + void Handle_SetCMYKColor_Fill(); + void Handle_SetCMYKColor_Stroke(); + void Handle_LineTo(); + void Handle_MoveTo(); + void Handle_SetMiterLimit(); + void Handle_MarkPlace(); + void Handle_EndPath(); + void Handle_SaveGraphState(); + void Handle_RestoreGraphState(); + void Handle_Rectangle(); + void Handle_SetRGBColor_Fill(); + void Handle_SetRGBColor_Stroke(); + void Handle_SetRenderIntent(); + void Handle_CloseStrokePath(); + void Handle_StrokePath(); + void Handle_SetColor_Fill(); + void Handle_SetColor_Stroke(); + void Handle_SetColorPS_Fill(); + void Handle_SetColorPS_Stroke(); + void Handle_ShadeFill(); + void Handle_SetCharSpace(); + void Handle_MoveTextPoint(); + void Handle_MoveTextPoint_SetLeading(); + void Handle_SetFont(); + void Handle_ShowText(); + void Handle_ShowText_Positioning(); + void Handle_SetTextLeading(); + void Handle_SetTextMatrix(); + void Handle_SetTextRenderMode(); + void Handle_SetTextRise(); + void Handle_SetWordSpace(); + void Handle_SetHorzScale(); + void Handle_MoveToNextLine(); + void Handle_CurveTo_23(); + void Handle_SetLineWidth(); + void Handle_Clip(); + void Handle_EOClip(); + void Handle_CurveTo_13(); + void Handle_NextLineShowText(); + void Handle_NextLineShowText_Space(); + void Handle_Invalid(); + + CPDF_Document* const m_pDocument; + CPDF_Dictionary* m_pPageResources; + CPDF_Dictionary* m_pParentResources; + CPDF_Dictionary* m_pResources; + CPDF_PageObjectHolder* m_pObjectHolder; + int m_Level; + CFX_Matrix m_mtContentToUser; + CFX_FloatRect m_BBox; + ContentParam m_ParamBuf[kParamBufSize]; + uint32_t m_ParamStartPos; + uint32_t m_ParamCount; + CPDF_StreamParser* m_pSyntax; + std::unique_ptr m_pCurStates; + CPDF_ContentMark m_CurContentMark; + std::vector> m_ClipTextList; + CPDF_TextObject* m_pLastTextObject; + FX_FLOAT m_DefFontSize; + FX_PATHPOINT* m_pPathPoints; + int m_PathPointCount; + int m_PathAllocSize; + FX_FLOAT m_PathStartX; + FX_FLOAT m_PathStartY; + FX_FLOAT m_PathCurrentX; + FX_FLOAT m_PathCurrentY; + uint8_t m_PathClipType; + CFX_ByteString m_LastImageName; + CPDF_Image* m_pLastImage; + bool m_bColored; + FX_FLOAT m_Type3Data[6]; + bool m_bResourceMissing; + std::vector> m_StateStack; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_STREAMCONTENTPARSER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamcontentparser_unittest.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamcontentparser_unittest.cpp new file mode 100644 index 000000000000..be2fcb09e430 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamcontentparser_unittest.cpp @@ -0,0 +1,34 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/page/pageint.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(cpdf_streamcontentparser, PDF_FindKeyAbbreviation) { + EXPECT_EQ(CFX_ByteStringC("BitsPerComponent"), + PDF_FindKeyAbbreviationForTesting(CFX_ByteStringC("BPC"))); + EXPECT_EQ(CFX_ByteStringC("Width"), + PDF_FindKeyAbbreviationForTesting(CFX_ByteStringC("W"))); + EXPECT_EQ(CFX_ByteStringC(""), + PDF_FindKeyAbbreviationForTesting(CFX_ByteStringC(""))); + EXPECT_EQ(CFX_ByteStringC(""), + PDF_FindKeyAbbreviationForTesting(CFX_ByteStringC("NoInList"))); + // Prefix should not match. + EXPECT_EQ(CFX_ByteStringC(""), + PDF_FindKeyAbbreviationForTesting(CFX_ByteStringC("WW"))); +} + +TEST(cpdf_streamcontentparser, PDF_FindValueAbbreviation) { + EXPECT_EQ(CFX_ByteStringC("DeviceGray"), + PDF_FindValueAbbreviationForTesting(CFX_ByteStringC("G"))); + EXPECT_EQ(CFX_ByteStringC("DCTDecode"), + PDF_FindValueAbbreviationForTesting(CFX_ByteStringC("DCT"))); + EXPECT_EQ(CFX_ByteStringC(""), + PDF_FindValueAbbreviationForTesting(CFX_ByteStringC(""))); + EXPECT_EQ(CFX_ByteStringC(""), + PDF_FindValueAbbreviationForTesting(CFX_ByteStringC("NoInList"))); + // Prefix should not match. + EXPECT_EQ(CFX_ByteStringC(""), + PDF_FindValueAbbreviationForTesting(CFX_ByteStringC("II"))); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamparser.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamparser.cpp new file mode 100644 index 000000000000..294d72c9506f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamparser.cpp @@ -0,0 +1,606 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_streamparser.h" + +#include + +#include +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_boolean.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_null.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfapi/parser/fpdf_parser_utility.h" +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/fx_ext.h" + +namespace { + +const uint32_t kMaxNestedParsingLevel = 512; +const uint32_t kMaxWordBuffer = 256; +const FX_STRSIZE kMaxStringLength = 32767; + +uint32_t DecodeAllScanlines(std::unique_ptr pDecoder, + uint8_t*& dest_buf, + uint32_t& dest_size) { + if (!pDecoder) + return FX_INVALID_OFFSET; + int ncomps = pDecoder->CountComps(); + int bpc = pDecoder->GetBPC(); + int width = pDecoder->GetWidth(); + int height = pDecoder->GetHeight(); + int pitch = (width * ncomps * bpc + 7) / 8; + if (height == 0 || pitch > (1 << 30) / height) + return FX_INVALID_OFFSET; + + dest_buf = FX_Alloc2D(uint8_t, pitch, height); + dest_size = pitch * height; // Safe since checked alloc returned. + for (int row = 0; row < height; row++) { + const uint8_t* pLine = pDecoder->GetScanline(row); + if (!pLine) + break; + + FXSYS_memcpy(dest_buf + row * pitch, pLine, pitch); + } + return pDecoder->GetSrcOffset(); +} + +uint32_t PDF_DecodeInlineStream(const uint8_t* src_buf, + uint32_t limit, + int width, + int height, + CFX_ByteString& decoder, + CPDF_Dictionary* pParam, + uint8_t*& dest_buf, + uint32_t& dest_size) { + if (decoder == "CCITTFaxDecode" || decoder == "CCF") { + std::unique_ptr pDecoder = + FPDFAPI_CreateFaxDecoder(src_buf, limit, width, height, pParam); + return DecodeAllScanlines(std::move(pDecoder), dest_buf, dest_size); + } + if (decoder == "ASCII85Decode" || decoder == "A85") + return A85Decode(src_buf, limit, dest_buf, dest_size); + if (decoder == "ASCIIHexDecode" || decoder == "AHx") + return HexDecode(src_buf, limit, dest_buf, dest_size); + if (decoder == "FlateDecode" || decoder == "Fl") { + return FPDFAPI_FlateOrLZWDecode(false, src_buf, limit, pParam, dest_size, + dest_buf, dest_size); + } + if (decoder == "LZWDecode" || decoder == "LZW") { + return FPDFAPI_FlateOrLZWDecode(true, src_buf, limit, pParam, 0, dest_buf, + dest_size); + } + if (decoder == "DCTDecode" || decoder == "DCT") { + std::unique_ptr pDecoder = + CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( + src_buf, limit, width, height, 0, + !pParam || pParam->GetIntegerFor("ColorTransform", 1)); + return DecodeAllScanlines(std::move(pDecoder), dest_buf, dest_size); + } + if (decoder == "RunLengthDecode" || decoder == "RL") + return RunLengthDecode(src_buf, limit, dest_buf, dest_size); + dest_size = 0; + dest_buf = 0; + return (uint32_t)-1; +} + +} // namespace + +CPDF_StreamParser::CPDF_StreamParser(const uint8_t* pData, uint32_t dwSize) + : m_pBuf(pData), + m_Size(dwSize), + m_Pos(0), + m_pPool(nullptr) {} + +CPDF_StreamParser::CPDF_StreamParser( + const uint8_t* pData, + uint32_t dwSize, + const CFX_WeakPtr& pPool) + : m_pBuf(pData), + m_Size(dwSize), + m_Pos(0), + m_pPool(pPool) {} + +CPDF_StreamParser::~CPDF_StreamParser() {} + +std::unique_ptr CPDF_StreamParser::ReadInlineStream( + CPDF_Document* pDoc, + std::unique_ptr pDict, + CPDF_Object* pCSObj) { + if (m_Pos == m_Size) + return nullptr; + + if (PDFCharIsWhitespace(m_pBuf[m_Pos])) + m_Pos++; + + CFX_ByteString Decoder; + CPDF_Dictionary* pParam = nullptr; + CPDF_Object* pFilter = pDict->GetDirectObjectFor("Filter"); + if (pFilter) { + if (CPDF_Array* pArray = pFilter->AsArray()) { + Decoder = pArray->GetStringAt(0); + CPDF_Array* pParams = pDict->GetArrayFor("DecodeParms"); + if (pParams) + pParam = pParams->GetDictAt(0); + } else { + Decoder = pFilter->GetString(); + pParam = pDict->GetDictFor("DecodeParms"); + } + } + uint32_t width = pDict->GetIntegerFor("Width"); + uint32_t height = pDict->GetIntegerFor("Height"); + uint32_t OrigSize = 0; + if (pCSObj) { + uint32_t bpc = pDict->GetIntegerFor("BitsPerComponent"); + uint32_t nComponents = 1; + CPDF_ColorSpace* pCS = pDoc->LoadColorSpace(pCSObj); + if (pCS) { + nComponents = pCS->CountComponents(); + pDoc->GetPageData()->ReleaseColorSpace(pCSObj); + } else { + nComponents = 3; + } + uint32_t pitch = width; + if (bpc && pitch > INT_MAX / bpc) + return nullptr; + + pitch *= bpc; + if (nComponents && pitch > INT_MAX / nComponents) + return nullptr; + + pitch *= nComponents; + if (pitch > INT_MAX - 7) + return nullptr; + + pitch += 7; + pitch /= 8; + OrigSize = pitch; + } else { + if (width > INT_MAX - 7) + return nullptr; + + OrigSize = ((width + 7) / 8); + } + if (height && OrigSize > INT_MAX / height) + return nullptr; + + OrigSize *= height; + std::unique_ptr pData; + uint32_t dwStreamSize; + if (Decoder.IsEmpty()) { + if (OrigSize > m_Size - m_Pos) + OrigSize = m_Size - m_Pos; + pData.reset(FX_Alloc(uint8_t, OrigSize)); + FXSYS_memcpy(pData.get(), m_pBuf + m_Pos, OrigSize); + dwStreamSize = OrigSize; + m_Pos += OrigSize; + } else { + uint8_t* pIgnore = nullptr; + uint32_t dwDestSize = OrigSize; + dwStreamSize = + PDF_DecodeInlineStream(m_pBuf + m_Pos, m_Size - m_Pos, width, height, + Decoder, pParam, pIgnore, dwDestSize); + FX_Free(pIgnore); + if (static_cast(dwStreamSize) < 0) + return nullptr; + + uint32_t dwSavePos = m_Pos; + m_Pos += dwStreamSize; + while (1) { + uint32_t dwPrevPos = m_Pos; + CPDF_StreamParser::SyntaxType type = ParseNextElement(); + if (type == CPDF_StreamParser::EndOfData) + break; + + if (type != CPDF_StreamParser::Keyword) { + dwStreamSize += m_Pos - dwPrevPos; + continue; + } + if (GetWord() == "EI") { + m_Pos = dwPrevPos; + break; + } + dwStreamSize += m_Pos - dwPrevPos; + } + m_Pos = dwSavePos; + pData.reset(FX_Alloc(uint8_t, dwStreamSize)); + FXSYS_memcpy(pData.get(), m_pBuf + m_Pos, dwStreamSize); + m_Pos += dwStreamSize; + } + pDict->SetNewFor("Length", (int)dwStreamSize); + return pdfium::MakeUnique(std::move(pData), dwStreamSize, + std::move(pDict)); +} + +CPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement() { + m_pLastObj.reset(); + m_WordSize = 0; + if (!PositionIsInBounds()) + return EndOfData; + + int ch = m_pBuf[m_Pos++]; + while (1) { + while (PDFCharIsWhitespace(ch)) { + if (!PositionIsInBounds()) + return EndOfData; + + ch = m_pBuf[m_Pos++]; + } + + if (ch != '%') + break; + + while (1) { + if (!PositionIsInBounds()) + return EndOfData; + + ch = m_pBuf[m_Pos++]; + if (PDFCharIsLineEnding(ch)) + break; + } + } + + if (PDFCharIsDelimiter(ch) && ch != '/') { + m_Pos--; + m_pLastObj = ReadNextObject(false, false, 0); + return Others; + } + + bool bIsNumber = true; + while (1) { + if (m_WordSize < kMaxWordBuffer) + m_WordBuffer[m_WordSize++] = ch; + + if (!PDFCharIsNumeric(ch)) + bIsNumber = false; + + if (!PositionIsInBounds()) + break; + + ch = m_pBuf[m_Pos++]; + + if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) { + m_Pos--; + break; + } + } + + m_WordBuffer[m_WordSize] = 0; + if (bIsNumber) + return Number; + + if (m_WordBuffer[0] == '/') + return Name; + + if (m_WordSize == 4) { + if (memcmp(m_WordBuffer, "true", 4) == 0) { + m_pLastObj = pdfium::MakeUnique(true); + return Others; + } + if (memcmp(m_WordBuffer, "null", 4) == 0) { + m_pLastObj = pdfium::MakeUnique(); + return Others; + } + } else if (m_WordSize == 5) { + if (memcmp(m_WordBuffer, "false", 5) == 0) { + m_pLastObj = pdfium::MakeUnique(false); + return Others; + } + } + return Keyword; +} + +std::unique_ptr CPDF_StreamParser::ReadNextObject( + bool bAllowNestedArray, + bool bInArray, + uint32_t dwRecursionLevel) { + bool bIsNumber; + // Must get the next word before returning to avoid infinite loops. + GetNextWord(bIsNumber); + if (!m_WordSize || dwRecursionLevel > kMaxNestedParsingLevel) + return nullptr; + + if (bIsNumber) { + m_WordBuffer[m_WordSize] = 0; + return pdfium::MakeUnique( + CFX_ByteStringC(m_WordBuffer, m_WordSize)); + } + + int first_char = m_WordBuffer[0]; + if (first_char == '/') { + CFX_ByteString name = + PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)); + return pdfium::MakeUnique(m_pPool, name); + } + + if (first_char == '(') { + CFX_ByteString str = ReadString(); + return pdfium::MakeUnique(m_pPool, str, false); + } + + if (first_char == '<') { + if (m_WordSize == 1) + return pdfium::MakeUnique(m_pPool, ReadHexString(), true); + + auto pDict = pdfium::MakeUnique(m_pPool); + while (1) { + GetNextWord(bIsNumber); + if (m_WordSize == 2 && m_WordBuffer[0] == '>') + break; + + if (!m_WordSize || m_WordBuffer[0] != '/') + return nullptr; + + CFX_ByteString key = + PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)); + std::unique_ptr pObj = + ReadNextObject(true, bInArray, dwRecursionLevel + 1); + if (!pObj) + return nullptr; + + if (!key.IsEmpty()) + pDict->SetFor(key, std::move(pObj)); + } + return std::move(pDict); + } + + if (first_char == '[') { + if ((!bAllowNestedArray && bInArray)) + return nullptr; + + auto pArray = pdfium::MakeUnique(); + while (1) { + std::unique_ptr pObj = + ReadNextObject(bAllowNestedArray, true, dwRecursionLevel + 1); + if (pObj) { + pArray->Add(std::move(pObj)); + continue; + } + if (!m_WordSize || m_WordBuffer[0] == ']') + break; + } + return std::move(pArray); + } + + if (m_WordSize == 5 && !memcmp(m_WordBuffer, "false", 5)) + return pdfium::MakeUnique(false); + + if (m_WordSize == 4) { + if (memcmp(m_WordBuffer, "true", 4) == 0) + return pdfium::MakeUnique(true); + if (memcmp(m_WordBuffer, "null", 4) == 0) + return pdfium::MakeUnique(); + } + + return nullptr; +} + +// TODO(npm): the following methods are almost identical in cpdf_syntaxparser +void CPDF_StreamParser::GetNextWord(bool& bIsNumber) { + m_WordSize = 0; + bIsNumber = true; + if (!PositionIsInBounds()) + return; + + int ch = m_pBuf[m_Pos++]; + while (1) { + while (PDFCharIsWhitespace(ch)) { + if (!PositionIsInBounds()) { + return; + } + ch = m_pBuf[m_Pos++]; + } + + if (ch != '%') + break; + + while (1) { + if (!PositionIsInBounds()) + return; + ch = m_pBuf[m_Pos++]; + if (PDFCharIsLineEnding(ch)) + break; + } + } + + if (PDFCharIsDelimiter(ch)) { + bIsNumber = false; + m_WordBuffer[m_WordSize++] = ch; + if (ch == '/') { + while (1) { + if (!PositionIsInBounds()) + return; + ch = m_pBuf[m_Pos++]; + if (!PDFCharIsOther(ch) && !PDFCharIsNumeric(ch)) { + m_Pos--; + return; + } + + if (m_WordSize < kMaxWordBuffer) + m_WordBuffer[m_WordSize++] = ch; + } + } else if (ch == '<') { + if (!PositionIsInBounds()) + return; + ch = m_pBuf[m_Pos++]; + if (ch == '<') + m_WordBuffer[m_WordSize++] = ch; + else + m_Pos--; + } else if (ch == '>') { + if (!PositionIsInBounds()) + return; + ch = m_pBuf[m_Pos++]; + if (ch == '>') + m_WordBuffer[m_WordSize++] = ch; + else + m_Pos--; + } + return; + } + + while (1) { + if (m_WordSize < kMaxWordBuffer) + m_WordBuffer[m_WordSize++] = ch; + if (!PDFCharIsNumeric(ch)) + bIsNumber = false; + + if (!PositionIsInBounds()) + return; + ch = m_pBuf[m_Pos++]; + if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) { + m_Pos--; + break; + } + } +} + +CFX_ByteString CPDF_StreamParser::ReadString() { + if (!PositionIsInBounds()) + return CFX_ByteString(); + + uint8_t ch = m_pBuf[m_Pos++]; + CFX_ByteTextBuf buf; + int parlevel = 0; + int status = 0; + int iEscCode = 0; + while (1) { + switch (status) { + case 0: + if (ch == ')') { + if (parlevel == 0) { + if (buf.GetLength() > kMaxStringLength) { + return CFX_ByteString(buf.GetBuffer(), kMaxStringLength); + } + return buf.MakeString(); + } + parlevel--; + buf.AppendChar(')'); + } else if (ch == '(') { + parlevel++; + buf.AppendChar('('); + } else if (ch == '\\') { + status = 1; + } else { + buf.AppendChar((char)ch); + } + break; + case 1: + if (ch >= '0' && ch <= '7') { + iEscCode = FXSYS_toDecimalDigit(static_cast(ch)); + status = 2; + break; + } + if (ch == 'n') { + buf.AppendChar('\n'); + } else if (ch == 'r') { + buf.AppendChar('\r'); + } else if (ch == 't') { + buf.AppendChar('\t'); + } else if (ch == 'b') { + buf.AppendChar('\b'); + } else if (ch == 'f') { + buf.AppendChar('\f'); + } else if (ch == '\r') { + status = 4; + break; + } else if (ch == '\n') { + } else { + buf.AppendChar(ch); + } + status = 0; + break; + case 2: + if (ch >= '0' && ch <= '7') { + iEscCode = + iEscCode * 8 + FXSYS_toDecimalDigit(static_cast(ch)); + status = 3; + } else { + buf.AppendChar(iEscCode); + status = 0; + continue; + } + break; + case 3: + if (ch >= '0' && ch <= '7') { + iEscCode = + iEscCode * 8 + FXSYS_toDecimalDigit(static_cast(ch)); + buf.AppendChar(iEscCode); + status = 0; + } else { + buf.AppendChar(iEscCode); + status = 0; + continue; + } + break; + case 4: + status = 0; + if (ch != '\n') { + continue; + } + break; + } + if (!PositionIsInBounds()) + break; + + ch = m_pBuf[m_Pos++]; + } + if (PositionIsInBounds()) + ++m_Pos; + + if (buf.GetLength() > kMaxStringLength) { + return CFX_ByteString(buf.GetBuffer(), kMaxStringLength); + } + return buf.MakeString(); +} + +CFX_ByteString CPDF_StreamParser::ReadHexString() { + if (!PositionIsInBounds()) + return CFX_ByteString(); + + CFX_ByteTextBuf buf; + bool bFirst = true; + int code = 0; + while (PositionIsInBounds()) { + int ch = m_pBuf[m_Pos++]; + + if (ch == '>') + break; + + if (!std::isxdigit(ch)) + continue; + + int val = FXSYS_toHexDigit(ch); + if (bFirst) { + code = val * 16; + } else { + code += val; + buf.AppendByte((uint8_t)code); + } + bFirst = !bFirst; + } + if (!bFirst) + buf.AppendChar((char)code); + + if (buf.GetLength() > kMaxStringLength) + return CFX_ByteString(buf.GetBuffer(), kMaxStringLength); + + return buf.MakeString(); +} + +bool CPDF_StreamParser::PositionIsInBounds() const { + return m_Pos < m_Size; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamparser.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamparser.h new file mode 100644 index 000000000000..fdc418c634bd --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamparser.h @@ -0,0 +1,62 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_STREAMPARSER_H_ +#define CORE_FPDFAPI_PAGE_CPDF_STREAMPARSER_H_ + +#include +#include + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fxcrt/cfx_string_pool_template.h" +#include "core/fxcrt/cfx_weak_ptr.h" + +class CPDF_StreamParser { + public: + enum SyntaxType { EndOfData, Number, Keyword, Name, Others }; + + CPDF_StreamParser(const uint8_t* pData, uint32_t dwSize); + CPDF_StreamParser(const uint8_t* pData, + uint32_t dwSize, + const CFX_WeakPtr& pPool); + ~CPDF_StreamParser(); + + SyntaxType ParseNextElement(); + CFX_ByteStringC GetWord() const { + return CFX_ByteStringC(m_WordBuffer, m_WordSize); + } + uint32_t GetPos() const { return m_Pos; } + void SetPos(uint32_t pos) { m_Pos = pos; } + std::unique_ptr GetObject() { return std::move(m_pLastObj); } + std::unique_ptr ReadNextObject(bool bAllowNestedArray, + bool bInArray, + uint32_t dwRecursionLevel); + std::unique_ptr ReadInlineStream( + CPDF_Document* pDoc, + std::unique_ptr pDict, + CPDF_Object* pCSObj); + + private: + friend class cpdf_streamparser_ReadHexString_Test; + + void GetNextWord(bool& bIsNumber); + CFX_ByteString ReadString(); + CFX_ByteString ReadHexString(); + bool PositionIsInBounds() const; + + const uint8_t* m_pBuf; + uint32_t m_Size; // Length in bytes of m_pBuf. + uint32_t m_Pos; // Current byte position within m_pBuf. + uint8_t m_WordBuffer[256]; + uint32_t m_WordSize; + std::unique_ptr m_pLastObj; + CFX_WeakPtr m_pPool; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_STREAMPARSER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamparser_unittest.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamparser_unittest.cpp new file mode 100644 index 000000000000..40a41befe1e5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_streamparser_unittest.cpp @@ -0,0 +1,47 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/page/cpdf_streamparser.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(cpdf_streamparser, ReadHexString) { + { + // Position out of bounds. + uint8_t data[] = "12ab>"; + CPDF_StreamParser parser(data, 5); + parser.SetPos(6); + EXPECT_EQ("", parser.ReadHexString()); + } + + { + // Regular conversion. + uint8_t data[] = "1A2b>abcd"; + CPDF_StreamParser parser(data, 5); + EXPECT_EQ("\x1a\x2b", parser.ReadHexString()); + EXPECT_EQ(5u, parser.GetPos()); + } + + { + // Missing ending > + uint8_t data[] = "1A2b"; + CPDF_StreamParser parser(data, 5); + EXPECT_EQ("\x1a\x2b", parser.ReadHexString()); + EXPECT_EQ(5u, parser.GetPos()); + } + + { + // Uneven number of bytes. + uint8_t data[] = "1A2>asdf"; + CPDF_StreamParser parser(data, 5); + EXPECT_EQ("\x1a\x20", parser.ReadHexString()); + EXPECT_EQ(4u, parser.GetPos()); + } + + { + uint8_t data[] = ">"; + CPDF_StreamParser parser(data, 5); + EXPECT_EQ("", parser.ReadHexString()); + EXPECT_EQ(1u, parser.GetPos()); + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textobject.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textobject.cpp new file mode 100644 index 000000000000..da69de8ce1a5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textobject.cpp @@ -0,0 +1,294 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_textobject.h" + +#include + +#include "core/fpdfapi/font/cpdf_cidfont.h" +#include "core/fpdfapi/font/cpdf_font.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +CPDF_TextObjectItem::CPDF_TextObjectItem() : m_CharCode(0) {} + +CPDF_TextObjectItem::~CPDF_TextObjectItem() = default; + +CPDF_TextObject::CPDF_TextObject() {} + +CPDF_TextObject::~CPDF_TextObject() {} + +int CPDF_TextObject::CountItems() const { + return pdfium::CollectionSize(m_CharCodes); +} + +void CPDF_TextObject::GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const { + pInfo->m_CharCode = m_CharCodes[index]; + pInfo->m_Origin = CFX_PointF(index ? m_CharPos[index - 1] : 0, 0); + if (pInfo->m_CharCode == CPDF_Font::kInvalidCharCode) + return; + + CPDF_Font* pFont = m_TextState.GetFont(); + if (!pFont->IsCIDFont()) + return; + if (!pFont->AsCIDFont()->IsVertWriting()) + return; + + uint16_t CID = pFont->AsCIDFont()->CIDFromCharCode(pInfo->m_CharCode); + pInfo->m_Origin = CFX_PointF(0, pInfo->m_Origin.x); + + short vx; + short vy; + pFont->AsCIDFont()->GetVertOrigin(CID, vx, vy); + + FX_FLOAT fontsize = m_TextState.GetFontSize(); + pInfo->m_Origin.x -= fontsize * vx / 1000; + pInfo->m_Origin.y -= fontsize * vy / 1000; +} + +int CPDF_TextObject::CountChars() const { + int count = 0; + for (uint32_t charcode : m_CharCodes) { + if (charcode != CPDF_Font::kInvalidCharCode) + count++; + } + return count; +} + +void CPDF_TextObject::GetCharInfo(int index, + uint32_t* charcode, + FX_FLOAT* kerning) const { + int count = 0; + for (size_t i = 0; i < m_CharCodes.size(); ++i) { + if (m_CharCodes[i] == CPDF_Font::kInvalidCharCode) + continue; + if (count++ != index) + continue; + *charcode = m_CharCodes[i]; + if (i == m_CharCodes.size() - 1 || + m_CharCodes[i + 1] != CPDF_Font::kInvalidCharCode) { + *kerning = 0; + } else { + *kerning = m_CharPos[i]; + } + return; + } +} + +void CPDF_TextObject::GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const { + int count = 0; + for (int i = 0; i < pdfium::CollectionSize(m_CharCodes); ++i) { + uint32_t charcode = m_CharCodes[i]; + if (charcode == CPDF_Font::kInvalidCharCode) + continue; + if (count++ != index) + continue; + GetItemInfo(i, pInfo); + break; + } +} + +std::unique_ptr CPDF_TextObject::Clone() const { + auto obj = pdfium::MakeUnique(); + obj->CopyData(this); + obj->m_CharCodes = m_CharCodes; + obj->m_CharPos = m_CharPos; + obj->m_Pos = m_Pos; + return obj; +} + +CPDF_PageObject::Type CPDF_TextObject::GetType() const { + return TEXT; +} + +void CPDF_TextObject::Transform(const CFX_Matrix& matrix) { + CFX_Matrix text_matrix = GetTextMatrix(); + text_matrix.Concat(matrix); + + FX_FLOAT* pTextMatrix = m_TextState.GetMutableMatrix(); + pTextMatrix[0] = text_matrix.a; + pTextMatrix[1] = text_matrix.c; + pTextMatrix[2] = text_matrix.b; + pTextMatrix[3] = text_matrix.d; + m_Pos = CFX_PointF(text_matrix.e, text_matrix.f); + CalcPositionData(0); +} + +bool CPDF_TextObject::IsText() const { + return true; +} + +CPDF_TextObject* CPDF_TextObject::AsText() { + return this; +} + +const CPDF_TextObject* CPDF_TextObject::AsText() const { + return this; +} + +CFX_Matrix CPDF_TextObject::GetTextMatrix() const { + const FX_FLOAT* pTextMatrix = m_TextState.GetMatrix(); + return CFX_Matrix(pTextMatrix[0], pTextMatrix[2], pTextMatrix[1], + pTextMatrix[3], m_Pos.x, m_Pos.y); +} + +void CPDF_TextObject::SetSegments(const CFX_ByteString* pStrs, + const FX_FLOAT* pKerning, + int nsegs) { + m_CharCodes.clear(); + m_CharPos.clear(); + CPDF_Font* pFont = m_TextState.GetFont(); + int nChars = 0; + for (int i = 0; i < nsegs; ++i) + nChars += pFont->CountChar(pStrs[i].c_str(), pStrs[i].GetLength()); + nChars += nsegs - 1; + m_CharCodes.resize(nChars); + m_CharPos.resize(nChars - 1); + int index = 0; + for (int i = 0; i < nsegs; ++i) { + const FX_CHAR* segment = pStrs[i].c_str(); + int len = pStrs[i].GetLength(); + int offset = 0; + while (offset < len) + m_CharCodes[index++] = pFont->GetNextChar(segment, len, offset); + if (i != nsegs - 1) { + m_CharPos[index - 1] = pKerning[i]; + m_CharCodes[index++] = CPDF_Font::kInvalidCharCode; + } + } +} + +void CPDF_TextObject::SetText(const CFX_ByteString& str) { + SetSegments(&str, nullptr, 1); + RecalcPositionData(); +} + +FX_FLOAT CPDF_TextObject::GetCharWidth(uint32_t charcode) const { + FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000; + CPDF_Font* pFont = m_TextState.GetFont(); + bool bVertWriting = false; + CPDF_CIDFont* pCIDFont = pFont->AsCIDFont(); + if (pCIDFont) + bVertWriting = pCIDFont->IsVertWriting(); + if (!bVertWriting) + return pFont->GetCharWidthF(charcode) * fontsize; + + uint16_t CID = pCIDFont->CIDFromCharCode(charcode); + return pCIDFont->GetVertWidth(CID) * fontsize; +} + +CPDF_Font* CPDF_TextObject::GetFont() const { + return m_TextState.GetFont(); +} + +FX_FLOAT CPDF_TextObject::GetFontSize() const { + return m_TextState.GetFontSize(); +} + +CFX_PointF CPDF_TextObject::CalcPositionData(FX_FLOAT horz_scale) { + FX_FLOAT curpos = 0; + FX_FLOAT min_x = 10000 * 1.0f; + FX_FLOAT max_x = -10000 * 1.0f; + FX_FLOAT min_y = 10000 * 1.0f; + FX_FLOAT max_y = -10000 * 1.0f; + CPDF_Font* pFont = m_TextState.GetFont(); + bool bVertWriting = false; + CPDF_CIDFont* pCIDFont = pFont->AsCIDFont(); + if (pCIDFont) + bVertWriting = pCIDFont->IsVertWriting(); + + FX_FLOAT fontsize = m_TextState.GetFontSize(); + for (int i = 0; i < pdfium::CollectionSize(m_CharCodes); ++i) { + uint32_t charcode = m_CharCodes[i]; + if (i > 0) { + if (charcode == CPDF_Font::kInvalidCharCode) { + curpos -= (m_CharPos[i - 1] * fontsize) / 1000; + continue; + } + m_CharPos[i - 1] = curpos; + } + + FX_RECT char_rect = pFont->GetCharBBox(charcode); + FX_FLOAT charwidth; + if (!bVertWriting) { + min_y = std::min(min_y, static_cast( + std::min(char_rect.top, char_rect.bottom))); + max_y = std::max(max_y, static_cast( + std::max(char_rect.top, char_rect.bottom))); + FX_FLOAT char_left = curpos + char_rect.left * fontsize / 1000; + FX_FLOAT char_right = curpos + char_rect.right * fontsize / 1000; + min_x = std::min(min_x, std::min(char_left, char_right)); + max_x = std::max(max_x, std::max(char_left, char_right)); + charwidth = pFont->GetCharWidthF(charcode) * fontsize / 1000; + } else { + uint16_t CID = pCIDFont->CIDFromCharCode(charcode); + short vx; + short vy; + pCIDFont->GetVertOrigin(CID, vx, vy); + char_rect.left -= vx; + char_rect.right -= vx; + char_rect.top -= vy; + char_rect.bottom -= vy; + min_x = std::min(min_x, static_cast( + std::min(char_rect.left, char_rect.right))); + max_x = std::max(max_x, static_cast( + std::max(char_rect.left, char_rect.right))); + FX_FLOAT char_top = curpos + char_rect.top * fontsize / 1000; + FX_FLOAT char_bottom = curpos + char_rect.bottom * fontsize / 1000; + min_y = std::min(min_y, std::min(char_top, char_bottom)); + max_y = std::max(max_y, std::max(char_top, char_bottom)); + charwidth = pCIDFont->GetVertWidth(CID) * fontsize / 1000; + } + curpos += charwidth; + if (charcode == ' ' && (!pCIDFont || pCIDFont->GetCharSize(' ') == 1)) + curpos += m_TextState.GetWordSpace(); + + curpos += m_TextState.GetCharSpace(); + } + + CFX_PointF ret; + if (bVertWriting) { + ret.y = curpos; + min_x = min_x * fontsize / 1000; + max_x = max_x * fontsize / 1000; + } else { + ret.x = curpos * horz_scale; + min_y = min_y * fontsize / 1000; + max_y = max_y * fontsize / 1000; + } + + m_Left = min_x; + m_Right = max_x; + m_Bottom = min_y; + m_Top = max_y; + GetTextMatrix().TransformRect(m_Left, m_Right, m_Top, m_Bottom); + + if (!TextRenderingModeIsStrokeMode(m_TextState.GetTextMode())) + return ret; + + FX_FLOAT half_width = m_GraphState.GetLineWidth() / 2; + m_Left -= half_width; + m_Right += half_width; + m_Top += half_width; + m_Bottom -= half_width; + + return ret; +} + +void CPDF_TextObject::SetPosition(FX_FLOAT x, FX_FLOAT y) { + FX_FLOAT dx = x - m_Pos.x; + FX_FLOAT dy = y - m_Pos.y; + m_Pos.x = x; + m_Pos.y = y; + m_Left += dx; + m_Right += dx; + m_Top += dy; + m_Bottom += dy; +} + +void CPDF_TextObject::RecalcPositionData() { + CalcPositionData(1); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textobject.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textobject.h new file mode 100644 index 000000000000..59da718f629e --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textobject.h @@ -0,0 +1,72 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_TEXTOBJECT_H_ +#define CORE_FPDFAPI_PAGE_CPDF_TEXTOBJECT_H_ + +#include +#include + +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_TextObjectItem { + public: + CPDF_TextObjectItem(); + ~CPDF_TextObjectItem(); + + uint32_t m_CharCode; + CFX_PointF m_Origin; +}; + +class CPDF_TextObject : public CPDF_PageObject { + public: + CPDF_TextObject(); + ~CPDF_TextObject() override; + + // CPDF_PageObject + Type GetType() const override; + void Transform(const CFX_Matrix& matrix) override; + bool IsText() const override; + CPDF_TextObject* AsText() override; + const CPDF_TextObject* AsText() const override; + + std::unique_ptr Clone() const; + int CountItems() const; + void GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const; + int CountChars() const; + void GetCharInfo(int index, uint32_t* charcode, FX_FLOAT* kerning) const; + void GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const; + FX_FLOAT GetCharWidth(uint32_t charcode) const; + CFX_PointF GetPos() const { return m_Pos; } + CFX_Matrix GetTextMatrix() const; + CPDF_Font* GetFont() const; + FX_FLOAT GetFontSize() const; + + void SetText(const CFX_ByteString& text); + void SetPosition(FX_FLOAT x, FX_FLOAT y); + + void RecalcPositionData(); + + private: + friend class CPDF_RenderStatus; + friend class CPDF_StreamContentParser; + friend class CPDF_TextRenderer; + friend class CPDF_PageContentGenerator; + + void SetSegments(const CFX_ByteString* pStrs, + const FX_FLOAT* pKerning, + int nSegs); + + CFX_PointF CalcPositionData(FX_FLOAT horz_scale); + + CFX_PointF m_Pos; + std::vector m_CharCodes; + std::vector m_CharPos; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_TEXTOBJECT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textstate.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textstate.cpp new file mode 100644 index 000000000000..990c9cc31128 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textstate.cpp @@ -0,0 +1,186 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_textstate.h" + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/parser/cpdf_document.h" + +CPDF_TextState::CPDF_TextState() {} +CPDF_TextState::~CPDF_TextState() {} + +void CPDF_TextState::Emplace() { + m_Ref.Emplace(); +} + +CPDF_Font* CPDF_TextState::GetFont() const { + return m_Ref.GetObject()->m_pFont; +} + +void CPDF_TextState::SetFont(CPDF_Font* pFont) { + m_Ref.GetPrivateCopy()->SetFont(pFont); +} + +FX_FLOAT CPDF_TextState::GetFontSize() const { + return m_Ref.GetObject()->m_FontSize; +} + +void CPDF_TextState::SetFontSize(FX_FLOAT size) { + m_Ref.GetPrivateCopy()->m_FontSize = size; +} + +const FX_FLOAT* CPDF_TextState::GetMatrix() const { + return m_Ref.GetObject()->m_Matrix; +} + +FX_FLOAT* CPDF_TextState::GetMutableMatrix() { + return m_Ref.GetPrivateCopy()->m_Matrix; +} + +FX_FLOAT CPDF_TextState::GetCharSpace() const { + return m_Ref.GetObject()->m_CharSpace; +} + +void CPDF_TextState::SetCharSpace(FX_FLOAT sp) { + m_Ref.GetPrivateCopy()->m_CharSpace = sp; +} + +FX_FLOAT CPDF_TextState::GetWordSpace() const { + return m_Ref.GetObject()->m_WordSpace; +} + +void CPDF_TextState::SetWordSpace(FX_FLOAT sp) { + m_Ref.GetPrivateCopy()->m_WordSpace = sp; +} + +FX_FLOAT CPDF_TextState::GetFontSizeV() const { + return m_Ref.GetObject()->GetFontSizeV(); +} + +FX_FLOAT CPDF_TextState::GetFontSizeH() const { + return m_Ref.GetObject()->GetFontSizeH(); +} + +FX_FLOAT CPDF_TextState::GetBaselineAngle() const { + return m_Ref.GetObject()->GetBaselineAngle(); +} + +FX_FLOAT CPDF_TextState::GetShearAngle() const { + return m_Ref.GetObject()->GetShearAngle(); +} + +TextRenderingMode CPDF_TextState::GetTextMode() const { + return m_Ref.GetObject()->m_TextMode; +} + +void CPDF_TextState::SetTextMode(TextRenderingMode mode) { + m_Ref.GetPrivateCopy()->m_TextMode = mode; +} + +const FX_FLOAT* CPDF_TextState::GetCTM() const { + return m_Ref.GetObject()->m_CTM; +} + +FX_FLOAT* CPDF_TextState::GetMutableCTM() { + return m_Ref.GetPrivateCopy()->m_CTM; +} + +CPDF_TextState::TextData::TextData() + : m_pFont(nullptr), + m_pDocument(nullptr), + m_FontSize(1.0f), + m_CharSpace(0), + m_WordSpace(0), + m_TextMode(TextRenderingMode::MODE_FILL) { + m_Matrix[0] = m_Matrix[3] = 1.0f; + m_Matrix[1] = m_Matrix[2] = 0; + m_CTM[0] = m_CTM[3] = 1.0f; + m_CTM[1] = m_CTM[2] = 0; +} + +CPDF_TextState::TextData::TextData(const TextData& that) + : m_pFont(that.m_pFont), + m_pDocument(that.m_pDocument), + m_FontSize(that.m_FontSize), + m_CharSpace(that.m_CharSpace), + m_WordSpace(that.m_WordSpace), + m_TextMode(that.m_TextMode) { + for (int i = 0; i < 4; ++i) + m_Matrix[i] = that.m_Matrix[i]; + + for (int i = 0; i < 4; ++i) + m_CTM[i] = that.m_CTM[i]; + + if (m_pDocument && m_pFont) { + m_pFont = m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict()); + } +} + +CPDF_TextState::TextData::~TextData() { + if (m_pDocument && m_pFont) { + CPDF_DocPageData* pPageData = m_pDocument->GetPageData(); + if (pPageData && !pPageData->IsForceClear()) + pPageData->ReleaseFont(m_pFont->GetFontDict()); + } +} + +void CPDF_TextState::TextData::SetFont(CPDF_Font* pFont) { + CPDF_Document* pDoc = m_pDocument; + CPDF_DocPageData* pPageData = pDoc ? pDoc->GetPageData() : nullptr; + if (pPageData && m_pFont && !pPageData->IsForceClear()) + pPageData->ReleaseFont(m_pFont->GetFontDict()); + + m_pDocument = pFont ? pFont->m_pDocument : nullptr; + m_pFont = pFont; +} + +FX_FLOAT CPDF_TextState::TextData::GetFontSizeV() const { + return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[1], m_Matrix[3]) * m_FontSize); +} + +FX_FLOAT CPDF_TextState::TextData::GetFontSizeH() const { + return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[0], m_Matrix[2]) * m_FontSize); +} + +FX_FLOAT CPDF_TextState::TextData::GetBaselineAngle() const { + return FXSYS_atan2(m_Matrix[2], m_Matrix[0]); +} + +FX_FLOAT CPDF_TextState::TextData::GetShearAngle() const { + return GetBaselineAngle() + FXSYS_atan2(m_Matrix[1], m_Matrix[3]); +} + +bool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode) { + if (iMode < 0 || iMode > 7) + return false; + *mode = static_cast(iMode); + return true; +} + +bool TextRenderingModeIsClipMode(const TextRenderingMode& mode) { + switch (mode) { + case TextRenderingMode::MODE_FILL_CLIP: + case TextRenderingMode::MODE_STROKE_CLIP: + case TextRenderingMode::MODE_FILL_STROKE_CLIP: + case TextRenderingMode::MODE_CLIP: + return true; + default: + return false; + } +} + +bool TextRenderingModeIsStrokeMode(const TextRenderingMode& mode) { + switch (mode) { + case TextRenderingMode::MODE_STROKE: + case TextRenderingMode::MODE_FILL_STROKE: + case TextRenderingMode::MODE_STROKE_CLIP: + case TextRenderingMode::MODE_FILL_STROKE_CLIP: + return true; + default: + return false; + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textstate.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textstate.h new file mode 100644 index 000000000000..4723469fd966 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_textstate.h @@ -0,0 +1,91 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_TEXTSTATE_H_ +#define CORE_FPDFAPI_PAGE_CPDF_TEXTSTATE_H_ + +#include "core/fxcrt/cfx_shared_copy_on_write.h" +#include "core/fxcrt/fx_basic.h" + +class CPDF_Document; +class CPDF_Font; + +// See PDF Reference 1.7, page 402, table 5.3. +enum class TextRenderingMode { + MODE_FILL = 0, + MODE_STROKE = 1, + MODE_FILL_STROKE = 2, + MODE_INVISIBLE = 3, + MODE_FILL_CLIP = 4, + MODE_STROKE_CLIP = 5, + MODE_FILL_STROKE_CLIP = 6, + MODE_CLIP = 7, +}; + +class CPDF_TextState { + public: + CPDF_TextState(); + ~CPDF_TextState(); + + void Emplace(); + + CPDF_Font* GetFont() const; + void SetFont(CPDF_Font* pFont); + + FX_FLOAT GetFontSize() const; + void SetFontSize(FX_FLOAT size); + + const FX_FLOAT* GetMatrix() const; + FX_FLOAT* GetMutableMatrix(); + + FX_FLOAT GetCharSpace() const; + void SetCharSpace(FX_FLOAT sp); + + FX_FLOAT GetWordSpace() const; + void SetWordSpace(FX_FLOAT sp); + + FX_FLOAT GetFontSizeV() const; + FX_FLOAT GetFontSizeH() const; + FX_FLOAT GetBaselineAngle() const; + FX_FLOAT GetShearAngle() const; + + TextRenderingMode GetTextMode() const; + void SetTextMode(TextRenderingMode mode); + + const FX_FLOAT* GetCTM() const; + FX_FLOAT* GetMutableCTM(); + + private: + class TextData { + public: + TextData(); + TextData(const TextData& src); + ~TextData(); + + void SetFont(CPDF_Font* pFont); + FX_FLOAT GetFontSizeV() const; + FX_FLOAT GetFontSizeH() const; + FX_FLOAT GetBaselineAngle() const; + FX_FLOAT GetShearAngle() const; + + CPDF_Font* m_pFont; + CPDF_Document* m_pDocument; + FX_FLOAT m_FontSize; + FX_FLOAT m_CharSpace; + FX_FLOAT m_WordSpace; + TextRenderingMode m_TextMode; + FX_FLOAT m_Matrix[4]; + FX_FLOAT m_CTM[4]; + }; + + CFX_SharedCopyOnWrite m_Ref; +}; + +bool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode); +bool TextRenderingModeIsClipMode(const TextRenderingMode& mode); +bool TextRenderingModeIsStrokeMode(const TextRenderingMode& mode); + +#endif // CORE_FPDFAPI_PAGE_CPDF_TEXTSTATE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_tilingpattern.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_tilingpattern.cpp new file mode 100644 index 000000000000..a041f3807495 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_tilingpattern.cpp @@ -0,0 +1,55 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/cpdf_tilingpattern.h" + +#include "core/fpdfapi/page/cpdf_form.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "third_party/base/ptr_util.h" + +CPDF_TilingPattern::CPDF_TilingPattern(CPDF_Document* pDoc, + CPDF_Object* pPatternObj, + const CFX_Matrix& parentMatrix) + : CPDF_Pattern(TILING, pDoc, pPatternObj, parentMatrix) { + CPDF_Dictionary* pDict = m_pPatternObj->GetDict(); + m_Pattern2Form = pDict->GetMatrixFor("Matrix"); + m_bColored = pDict->GetIntegerFor("PaintType") == 1; + m_Pattern2Form.Concat(parentMatrix); +} + +CPDF_TilingPattern::~CPDF_TilingPattern() {} + +CPDF_TilingPattern* CPDF_TilingPattern::AsTilingPattern() { + return this; +} + +CPDF_ShadingPattern* CPDF_TilingPattern::AsShadingPattern() { + return nullptr; +} + +bool CPDF_TilingPattern::Load() { + if (m_pForm) + return true; + + CPDF_Dictionary* pDict = m_pPatternObj->GetDict(); + if (!pDict) + return false; + + m_bColored = pDict->GetIntegerFor("PaintType") == 1; + m_XStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumberFor("XStep")); + m_YStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumberFor("YStep")); + + CPDF_Stream* pStream = m_pPatternObj->AsStream(); + if (!pStream) + return false; + + m_pForm = pdfium::MakeUnique(m_pDocument, nullptr, pStream); + m_pForm->ParseContent(nullptr, &m_ParentMatrix, nullptr); + m_BBox = pDict->GetRectFor("BBox"); + return true; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_tilingpattern.h b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_tilingpattern.h new file mode 100644 index 000000000000..3f0851aa7ead --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/cpdf_tilingpattern.h @@ -0,0 +1,46 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_CPDF_TILINGPATTERN_H_ +#define CORE_FPDFAPI_PAGE_CPDF_TILINGPATTERN_H_ + +#include + +#include "core/fpdfapi/page/cpdf_pattern.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Document; +class CPDF_Form; +class CPDF_Object; + +class CPDF_TilingPattern : public CPDF_Pattern { + public: + CPDF_TilingPattern(CPDF_Document* pDoc, + CPDF_Object* pPatternObj, + const CFX_Matrix& parentMatrix); + ~CPDF_TilingPattern() override; + + CPDF_TilingPattern* AsTilingPattern() override; + CPDF_ShadingPattern* AsShadingPattern() override; + + bool Load(); + + bool colored() const { return m_bColored; } + const CFX_FloatRect& bbox() const { return m_BBox; } + FX_FLOAT x_step() const { return m_XStep; } + FX_FLOAT y_step() const { return m_YStep; } + CPDF_Form* form() const { return m_pForm.get(); } + + private: + bool m_bColored; + CFX_FloatRect m_BBox; + FX_FLOAT m_XStep; + FX_FLOAT m_YStep; + std::unique_ptr m_pForm; +}; + +#endif // CORE_FPDFAPI_PAGE_CPDF_TILINGPATTERN_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/fpdf_page_colors.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/fpdf_page_colors.cpp new file mode 100644 index 000000000000..69129e4f2b12 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/fpdf_page_colors.cpp @@ -0,0 +1,240 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/pageint.h" + +#include + +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fxcodec/fx_codec.h" + +namespace { + +FX_FLOAT NormalizeChannel(FX_FLOAT fVal) { + return std::min(std::max(fVal, 0.0f), 1.0f); +} + +} // namespace + +uint32_t ComponentsForFamily(int family) { + if (family == PDFCS_DEVICERGB) + return 3; + if (family == PDFCS_DEVICEGRAY) + return 1; + ASSERT(family == PDFCS_DEVICECMYK); + return 4; +} + +void sRGB_to_AdobeCMYK(FX_FLOAT R, + FX_FLOAT G, + FX_FLOAT B, + FX_FLOAT& c, + FX_FLOAT& m, + FX_FLOAT& y, + FX_FLOAT& k) { + c = 1.0f - R; + m = 1.0f - G; + y = 1.0f - B; + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } +} + +void ReverseRGB(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels) { + if (pDestBuf == pSrcBuf) { + for (int i = 0; i < pixels; i++) { + uint8_t temp = pDestBuf[2]; + pDestBuf[2] = pDestBuf[0]; + pDestBuf[0] = temp; + pDestBuf += 3; + } + } else { + for (int i = 0; i < pixels; i++) { + *pDestBuf++ = pSrcBuf[2]; + *pDestBuf++ = pSrcBuf[1]; + *pDestBuf++ = pSrcBuf[0]; + pSrcBuf += 3; + } + } +} + +CPDF_DeviceCS::CPDF_DeviceCS(CPDF_Document* pDoc, int family) + : CPDF_ColorSpace(pDoc, family, ComponentsForFamily(family)) { + ASSERT(family == PDFCS_DEVICEGRAY || family == PDFCS_DEVICERGB || + family == PDFCS_DEVICECMYK); +} + +bool CPDF_DeviceCS::GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const { + switch (m_Family) { + case PDFCS_DEVICEGRAY: + R = NormalizeChannel(*pBuf); + G = R; + B = R; + break; + case PDFCS_DEVICERGB: + R = NormalizeChannel(pBuf[0]); + G = NormalizeChannel(pBuf[1]); + B = NormalizeChannel(pBuf[2]); + break; + case PDFCS_DEVICECMYK: + if (m_dwStdConversion) { + FX_FLOAT k = pBuf[3]; + R = 1.0f - std::min(1.0f, pBuf[0] + k); + G = 1.0f - std::min(1.0f, pBuf[1] + k); + B = 1.0f - std::min(1.0f, pBuf[2] + k); + } else { + AdobeCMYK_to_sRGB(pBuf[0], pBuf[1], pBuf[2], pBuf[3], R, G, B); + } + break; + default: + ASSERT(false); + return false; + } + return true; +} + +bool CPDF_DeviceCS::v_GetCMYK(FX_FLOAT* pBuf, + FX_FLOAT& c, + FX_FLOAT& m, + FX_FLOAT& y, + FX_FLOAT& k) const { + if (m_Family != PDFCS_DEVICECMYK) + return false; + + c = pBuf[0]; + m = pBuf[1]; + y = pBuf[2]; + k = pBuf[3]; + return true; +} + +bool CPDF_DeviceCS::SetRGB(FX_FLOAT* pBuf, + FX_FLOAT R, + FX_FLOAT G, + FX_FLOAT B) const { + switch (m_Family) { + case PDFCS_DEVICEGRAY: + if (R != G || R != B) + return false; + *pBuf = R; + return true; + case PDFCS_DEVICERGB: + pBuf[0] = R; + pBuf[1] = G; + pBuf[2] = B; + return true; + case PDFCS_DEVICECMYK: + sRGB_to_AdobeCMYK(R, G, B, pBuf[0], pBuf[1], pBuf[2], pBuf[3]); + return true; + default: + ASSERT(false); + return false; + } +} + +bool CPDF_DeviceCS::v_SetCMYK(FX_FLOAT* pBuf, + FX_FLOAT c, + FX_FLOAT m, + FX_FLOAT y, + FX_FLOAT k) const { + switch (m_Family) { + case PDFCS_DEVICEGRAY: + return false; + case PDFCS_DEVICERGB: + AdobeCMYK_to_sRGB(c, m, y, k, pBuf[0], pBuf[1], pBuf[2]); + return true; + case PDFCS_DEVICECMYK: + pBuf[0] = c; + pBuf[1] = m; + pBuf[2] = y; + pBuf[3] = k; + return true; + default: + ASSERT(false); + return false; + } +} + +void CPDF_DeviceCS::TranslateImageLine(uint8_t* pDestBuf, + const uint8_t* pSrcBuf, + int pixels, + int image_width, + int image_height, + bool bTransMask) const { + switch (m_Family) { + case PDFCS_DEVICEGRAY: + for (int i = 0; i < pixels; i++) { + *pDestBuf++ = pSrcBuf[i]; + *pDestBuf++ = pSrcBuf[i]; + *pDestBuf++ = pSrcBuf[i]; + } + break; + case PDFCS_DEVICERGB: + ReverseRGB(pDestBuf, pSrcBuf, pixels); + break; + case PDFCS_DEVICECMYK: + if (bTransMask) { + for (int i = 0; i < pixels; i++) { + int k = 255 - pSrcBuf[3]; + pDestBuf[0] = ((255 - pSrcBuf[0]) * k) / 255; + pDestBuf[1] = ((255 - pSrcBuf[1]) * k) / 255; + pDestBuf[2] = ((255 - pSrcBuf[2]) * k) / 255; + pDestBuf += 3; + pSrcBuf += 4; + } + } else { + for (int i = 0; i < pixels; i++) { + if (m_dwStdConversion) { + uint8_t k = pSrcBuf[3]; + pDestBuf[2] = 255 - std::min(255, pSrcBuf[0] + k); + pDestBuf[1] = 255 - std::min(255, pSrcBuf[1] + k); + pDestBuf[0] = 255 - std::min(255, pSrcBuf[2] + k); + } else { + AdobeCMYK_to_sRGB1(pSrcBuf[0], pSrcBuf[1], pSrcBuf[2], pSrcBuf[3], + pDestBuf[2], pDestBuf[1], pDestBuf[0]); + } + pSrcBuf += 4; + pDestBuf += 3; + } + } + break; + default: + ASSERT(false); + break; + } +} + +CPDF_IccProfile::CPDF_IccProfile(const uint8_t* pData, uint32_t dwSize) + : m_bsRGB(false), m_pTransform(nullptr), m_nSrcComponents(0) { + if (dwSize == 3144 && + FXSYS_memcmp(pData + 0x190, "sRGB IEC61966-2.1", 17) == 0) { + m_bsRGB = true; + m_nSrcComponents = 3; + } else if (CPDF_ModuleMgr::Get()->GetIccModule()) { + m_pTransform = CPDF_ModuleMgr::Get()->GetIccModule()->CreateTransform_sRGB( + pData, dwSize, m_nSrcComponents); + } +} +CPDF_IccProfile::~CPDF_IccProfile() { + if (m_pTransform) { + CPDF_ModuleMgr::Get()->GetIccModule()->DestroyTransform(m_pTransform); + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/fpdf_page_func.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/fpdf_page_func.cpp new file mode 100644 index 000000000000..916641f05dfa --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/fpdf_page_func.cpp @@ -0,0 +1,862 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/page/pageint.h" + +#include + +#include +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_psengine.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_simple_parser.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fxcrt/fx_safe_types.h" +#include "third_party/base/ptr_util.h" + +namespace { + +struct PDF_PSOpName { + const FX_CHAR* name; + PDF_PSOP op; +}; + +const PDF_PSOpName kPsOpNames[] = { + {"add", PSOP_ADD}, {"sub", PSOP_SUB}, + {"mul", PSOP_MUL}, {"div", PSOP_DIV}, + {"idiv", PSOP_IDIV}, {"mod", PSOP_MOD}, + {"neg", PSOP_NEG}, {"abs", PSOP_ABS}, + {"ceiling", PSOP_CEILING}, {"floor", PSOP_FLOOR}, + {"round", PSOP_ROUND}, {"truncate", PSOP_TRUNCATE}, + {"sqrt", PSOP_SQRT}, {"sin", PSOP_SIN}, + {"cos", PSOP_COS}, {"atan", PSOP_ATAN}, + {"exp", PSOP_EXP}, {"ln", PSOP_LN}, + {"log", PSOP_LOG}, {"cvi", PSOP_CVI}, + {"cvr", PSOP_CVR}, {"eq", PSOP_EQ}, + {"ne", PSOP_NE}, {"gt", PSOP_GT}, + {"ge", PSOP_GE}, {"lt", PSOP_LT}, + {"le", PSOP_LE}, {"and", PSOP_AND}, + {"or", PSOP_OR}, {"xor", PSOP_XOR}, + {"not", PSOP_NOT}, {"bitshift", PSOP_BITSHIFT}, + {"true", PSOP_TRUE}, {"false", PSOP_FALSE}, + {"if", PSOP_IF}, {"ifelse", PSOP_IFELSE}, + {"pop", PSOP_POP}, {"exch", PSOP_EXCH}, + {"dup", PSOP_DUP}, {"copy", PSOP_COPY}, + {"index", PSOP_INDEX}, {"roll", PSOP_ROLL}}; + +// See PDF Reference 1.7, page 170, table 3.36. +bool IsValidBitsPerSample(uint32_t x) { + switch (x) { + case 1: + case 2: + case 4: + case 8: + case 12: + case 16: + case 24: + case 32: + return true; + default: + return false; + } +} + +// See PDF Reference 1.7, page 170. +FX_FLOAT PDF_Interpolate(FX_FLOAT x, + FX_FLOAT xmin, + FX_FLOAT xmax, + FX_FLOAT ymin, + FX_FLOAT ymax) { + FX_FLOAT divisor = xmax - xmin; + return ymin + (divisor ? (x - xmin) * (ymax - ymin) / divisor : 0); +} + +class CPDF_PSFunc : public CPDF_Function { + public: + CPDF_PSFunc() : CPDF_Function(Type::kType4PostScript) {} + ~CPDF_PSFunc() override {} + + // CPDF_Function + bool v_Init(CPDF_Object* pObj) override; + bool v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const override; + + private: + CPDF_PSEngine m_PS; +}; + +bool CPDF_PSFunc::v_Init(CPDF_Object* pObj) { + CPDF_StreamAcc acc; + acc.LoadAllData(pObj->AsStream(), false); + return m_PS.Parse(reinterpret_cast(acc.GetData()), + acc.GetSize()); +} + +bool CPDF_PSFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const { + CPDF_PSEngine& PS = const_cast(m_PS); + PS.Reset(); + for (uint32_t i = 0; i < m_nInputs; i++) + PS.Push(inputs[i]); + PS.Execute(); + if (PS.GetStackSize() < m_nOutputs) + return false; + for (uint32_t i = 0; i < m_nOutputs; i++) + results[m_nOutputs - i - 1] = PS.Pop(); + return true; +} + +} // namespace + +class CPDF_PSOP { + public: + explicit CPDF_PSOP(PDF_PSOP op) : m_op(op), m_value(0) { + ASSERT(m_op != PSOP_CONST); + ASSERT(m_op != PSOP_PROC); + } + explicit CPDF_PSOP(FX_FLOAT value) : m_op(PSOP_CONST), m_value(value) {} + explicit CPDF_PSOP(std::unique_ptr proc) + : m_op(PSOP_PROC), m_value(0), m_proc(std::move(proc)) {} + + FX_FLOAT GetFloatValue() const { + if (m_op == PSOP_CONST) + return m_value; + + ASSERT(false); + return 0; + } + CPDF_PSProc* GetProc() const { + if (m_op == PSOP_PROC) + return m_proc.get(); + ASSERT(false); + return nullptr; + } + + PDF_PSOP GetOp() const { return m_op; } + + private: + const PDF_PSOP m_op; + const FX_FLOAT m_value; + std::unique_ptr m_proc; +}; + +bool CPDF_PSEngine::Execute() { + return m_MainProc.Execute(this); +} + +CPDF_PSProc::CPDF_PSProc() {} +CPDF_PSProc::~CPDF_PSProc() {} + +bool CPDF_PSProc::Execute(CPDF_PSEngine* pEngine) { + for (size_t i = 0; i < m_Operators.size(); ++i) { + const PDF_PSOP op = m_Operators[i]->GetOp(); + if (op == PSOP_PROC) + continue; + + if (op == PSOP_CONST) { + pEngine->Push(m_Operators[i]->GetFloatValue()); + continue; + } + + if (op == PSOP_IF) { + if (i == 0 || m_Operators[i - 1]->GetOp() != PSOP_PROC) + return false; + + if (static_cast(pEngine->Pop())) + m_Operators[i - 1]->GetProc()->Execute(pEngine); + } else if (op == PSOP_IFELSE) { + if (i < 2 || m_Operators[i - 1]->GetOp() != PSOP_PROC || + m_Operators[i - 2]->GetOp() != PSOP_PROC) { + return false; + } + size_t offset = static_cast(pEngine->Pop()) ? 2 : 1; + m_Operators[i - offset]->GetProc()->Execute(pEngine); + } else { + pEngine->DoOperator(op); + } + } + return true; +} + +CPDF_PSEngine::CPDF_PSEngine() { + m_StackCount = 0; +} +CPDF_PSEngine::~CPDF_PSEngine() {} +void CPDF_PSEngine::Push(FX_FLOAT v) { + if (m_StackCount == PSENGINE_STACKSIZE) { + return; + } + m_Stack[m_StackCount++] = v; +} +FX_FLOAT CPDF_PSEngine::Pop() { + if (m_StackCount == 0) { + return 0; + } + return m_Stack[--m_StackCount]; +} +bool CPDF_PSEngine::Parse(const FX_CHAR* str, int size) { + CPDF_SimpleParser parser((uint8_t*)str, size); + CFX_ByteStringC word = parser.GetWord(); + if (word != "{") { + return false; + } + return m_MainProc.Parse(&parser, 0); +} + +bool CPDF_PSProc::Parse(CPDF_SimpleParser* parser, int depth) { + if (depth > kMaxDepth) + return false; + + while (1) { + CFX_ByteStringC word = parser->GetWord(); + if (word.IsEmpty()) { + return false; + } + if (word == "}") { + return true; + } + if (word == "{") { + std::unique_ptr proc(new CPDF_PSProc); + std::unique_ptr op(new CPDF_PSOP(std::move(proc))); + m_Operators.push_back(std::move(op)); + if (!m_Operators.back()->GetProc()->Parse(parser, depth + 1)) { + return false; + } + } else { + bool found = false; + for (const PDF_PSOpName& op_name : kPsOpNames) { + if (word == CFX_ByteStringC(op_name.name)) { + std::unique_ptr op(new CPDF_PSOP(op_name.op)); + m_Operators.push_back(std::move(op)); + found = true; + break; + } + } + if (!found) { + std::unique_ptr op(new CPDF_PSOP(FX_atof(word))); + m_Operators.push_back(std::move(op)); + } + } + } +} + +bool CPDF_PSEngine::DoOperator(PDF_PSOP op) { + int i1; + int i2; + FX_FLOAT d1; + FX_FLOAT d2; + FX_SAFE_INT32 result; + switch (op) { + case PSOP_ADD: + d1 = Pop(); + d2 = Pop(); + Push(d1 + d2); + break; + case PSOP_SUB: + d2 = Pop(); + d1 = Pop(); + Push(d1 - d2); + break; + case PSOP_MUL: + d1 = Pop(); + d2 = Pop(); + Push(d1 * d2); + break; + case PSOP_DIV: + d2 = Pop(); + d1 = Pop(); + Push(d1 / d2); + break; + case PSOP_IDIV: + i2 = static_cast(Pop()); + i1 = static_cast(Pop()); + if (i2) { + result = i1; + result /= i2; + Push(result.ValueOrDefault(0)); + } else { + Push(0); + } + break; + case PSOP_MOD: + i2 = static_cast(Pop()); + i1 = static_cast(Pop()); + if (i2) { + result = i1; + result %= i2; + Push(result.ValueOrDefault(0)); + } else { + Push(0); + } + break; + case PSOP_NEG: + d1 = Pop(); + Push(-d1); + break; + case PSOP_ABS: + d1 = Pop(); + Push((FX_FLOAT)FXSYS_fabs(d1)); + break; + case PSOP_CEILING: + d1 = Pop(); + Push((FX_FLOAT)FXSYS_ceil(d1)); + break; + case PSOP_FLOOR: + d1 = Pop(); + Push((FX_FLOAT)FXSYS_floor(d1)); + break; + case PSOP_ROUND: + d1 = Pop(); + Push(FXSYS_round(d1)); + break; + case PSOP_TRUNCATE: + i1 = (int)Pop(); + Push(i1); + break; + case PSOP_SQRT: + d1 = Pop(); + Push((FX_FLOAT)FXSYS_sqrt(d1)); + break; + case PSOP_SIN: + d1 = Pop(); + Push((FX_FLOAT)FXSYS_sin(d1 * FX_PI / 180.0f)); + break; + case PSOP_COS: + d1 = Pop(); + Push((FX_FLOAT)FXSYS_cos(d1 * FX_PI / 180.0f)); + break; + case PSOP_ATAN: + d2 = Pop(); + d1 = Pop(); + d1 = (FX_FLOAT)(FXSYS_atan2(d1, d2) * 180.0 / FX_PI); + if (d1 < 0) { + d1 += 360; + } + Push(d1); + break; + case PSOP_EXP: + d2 = Pop(); + d1 = Pop(); + Push((FX_FLOAT)FXSYS_pow(d1, d2)); + break; + case PSOP_LN: + d1 = Pop(); + Push((FX_FLOAT)FXSYS_log(d1)); + break; + case PSOP_LOG: + d1 = Pop(); + Push((FX_FLOAT)FXSYS_log10(d1)); + break; + case PSOP_CVI: + i1 = (int)Pop(); + Push(i1); + break; + case PSOP_CVR: + break; + case PSOP_EQ: + d2 = Pop(); + d1 = Pop(); + Push((int)(d1 == d2)); + break; + case PSOP_NE: + d2 = Pop(); + d1 = Pop(); + Push((int)(d1 != d2)); + break; + case PSOP_GT: + d2 = Pop(); + d1 = Pop(); + Push((int)(d1 > d2)); + break; + case PSOP_GE: + d2 = Pop(); + d1 = Pop(); + Push((int)(d1 >= d2)); + break; + case PSOP_LT: + d2 = Pop(); + d1 = Pop(); + Push((int)(d1 < d2)); + break; + case PSOP_LE: + d2 = Pop(); + d1 = Pop(); + Push((int)(d1 <= d2)); + break; + case PSOP_AND: + i1 = (int)Pop(); + i2 = (int)Pop(); + Push(i1 & i2); + break; + case PSOP_OR: + i1 = (int)Pop(); + i2 = (int)Pop(); + Push(i1 | i2); + break; + case PSOP_XOR: + i1 = (int)Pop(); + i2 = (int)Pop(); + Push(i1 ^ i2); + break; + case PSOP_NOT: + i1 = (int)Pop(); + Push((int)!i1); + break; + case PSOP_BITSHIFT: { + int shift = (int)Pop(); + result = (int)Pop(); + if (shift > 0) { + result <<= shift; + } else { + // Avoids unsafe negation of INT_MIN. + FX_SAFE_INT32 safe_shift = shift; + result >>= (-safe_shift).ValueOrDefault(0); + } + Push(result.ValueOrDefault(0)); + break; + } + case PSOP_TRUE: + Push(1); + break; + case PSOP_FALSE: + Push(0); + break; + case PSOP_POP: + Pop(); + break; + case PSOP_EXCH: + d2 = Pop(); + d1 = Pop(); + Push(d2); + Push(d1); + break; + case PSOP_DUP: + d1 = Pop(); + Push(d1); + Push(d1); + break; + case PSOP_COPY: { + int n = static_cast(Pop()); + if (n < 0 || m_StackCount + n > PSENGINE_STACKSIZE || + n > static_cast(m_StackCount)) + break; + for (int i = 0; i < n; i++) + m_Stack[m_StackCount + i] = m_Stack[m_StackCount + i - n]; + m_StackCount += n; + break; + } + case PSOP_INDEX: { + int n = static_cast(Pop()); + if (n < 0 || n >= static_cast(m_StackCount)) + break; + Push(m_Stack[m_StackCount - n - 1]); + break; + } + case PSOP_ROLL: { + int j = static_cast(Pop()); + int n = static_cast(Pop()); + if (j == 0 || n == 0 || m_StackCount == 0) + break; + if (n < 0 || n > static_cast(m_StackCount)) + break; + + j %= n; + if (j > 0) + j -= n; + auto begin_it = std::begin(m_Stack) + m_StackCount - n; + auto middle_it = begin_it - j; + auto end_it = std::begin(m_Stack) + m_StackCount; + std::rotate(begin_it, middle_it, end_it); + break; + } + default: + break; + } + return true; +} + +CPDF_SampledFunc::CPDF_SampledFunc() : CPDF_Function(Type::kType0Sampled) {} + +CPDF_SampledFunc::~CPDF_SampledFunc() {} + +bool CPDF_SampledFunc::v_Init(CPDF_Object* pObj) { + CPDF_Stream* pStream = pObj->AsStream(); + if (!pStream) + return false; + + CPDF_Dictionary* pDict = pStream->GetDict(); + CPDF_Array* pSize = pDict->GetArrayFor("Size"); + CPDF_Array* pEncode = pDict->GetArrayFor("Encode"); + CPDF_Array* pDecode = pDict->GetArrayFor("Decode"); + m_nBitsPerSample = pDict->GetIntegerFor("BitsPerSample"); + if (!IsValidBitsPerSample(m_nBitsPerSample)) + return false; + + m_SampleMax = 0xffffffff >> (32 - m_nBitsPerSample); + m_pSampleStream = pdfium::MakeUnique(); + m_pSampleStream->LoadAllData(pStream, false); + FX_SAFE_UINT32 nTotalSampleBits = 1; + m_EncodeInfo.resize(m_nInputs); + for (uint32_t i = 0; i < m_nInputs; i++) { + m_EncodeInfo[i].sizes = pSize ? pSize->GetIntegerAt(i) : 0; + if (!pSize && i == 0) + m_EncodeInfo[i].sizes = pDict->GetIntegerFor("Size"); + nTotalSampleBits *= m_EncodeInfo[i].sizes; + if (pEncode) { + m_EncodeInfo[i].encode_min = pEncode->GetFloatAt(i * 2); + m_EncodeInfo[i].encode_max = pEncode->GetFloatAt(i * 2 + 1); + } else { + m_EncodeInfo[i].encode_min = 0; + m_EncodeInfo[i].encode_max = + m_EncodeInfo[i].sizes == 1 ? 1 : (FX_FLOAT)m_EncodeInfo[i].sizes - 1; + } + } + nTotalSampleBits *= m_nBitsPerSample; + nTotalSampleBits *= m_nOutputs; + FX_SAFE_UINT32 nTotalSampleBytes = nTotalSampleBits; + nTotalSampleBytes += 7; + nTotalSampleBytes /= 8; + if (!nTotalSampleBytes.IsValid() || nTotalSampleBytes.ValueOrDie() == 0 || + nTotalSampleBytes.ValueOrDie() > m_pSampleStream->GetSize()) { + return false; + } + m_DecodeInfo.resize(m_nOutputs); + for (uint32_t i = 0; i < m_nOutputs; i++) { + if (pDecode) { + m_DecodeInfo[i].decode_min = pDecode->GetFloatAt(2 * i); + m_DecodeInfo[i].decode_max = pDecode->GetFloatAt(2 * i + 1); + } else { + m_DecodeInfo[i].decode_min = m_pRanges[i * 2]; + m_DecodeInfo[i].decode_max = m_pRanges[i * 2 + 1]; + } + } + return true; +} + +bool CPDF_SampledFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const { + int pos = 0; + CFX_FixedBufGrow encoded_input_buf(m_nInputs); + FX_FLOAT* encoded_input = encoded_input_buf; + CFX_FixedBufGrow int_buf(m_nInputs * 2); + uint32_t* index = int_buf; + uint32_t* blocksize = index + m_nInputs; + for (uint32_t i = 0; i < m_nInputs; i++) { + if (i == 0) + blocksize[i] = 1; + else + blocksize[i] = blocksize[i - 1] * m_EncodeInfo[i - 1].sizes; + encoded_input[i] = + PDF_Interpolate(inputs[i], m_pDomains[i * 2], m_pDomains[i * 2 + 1], + m_EncodeInfo[i].encode_min, m_EncodeInfo[i].encode_max); + index[i] = std::min((uint32_t)std::max(0.f, encoded_input[i]), + m_EncodeInfo[i].sizes - 1); + pos += index[i] * blocksize[i]; + } + FX_SAFE_INT32 bits_to_output = m_nOutputs; + bits_to_output *= m_nBitsPerSample; + if (!bits_to_output.IsValid()) + return false; + + FX_SAFE_INT32 bitpos = pos; + bitpos *= bits_to_output.ValueOrDie(); + if (!bitpos.IsValid()) + return false; + + FX_SAFE_INT32 range_check = bitpos; + range_check += bits_to_output.ValueOrDie(); + if (!range_check.IsValid()) + return false; + + const uint8_t* pSampleData = m_pSampleStream->GetData(); + if (!pSampleData) + return false; + + for (uint32_t j = 0; j < m_nOutputs; j++, bitpos += m_nBitsPerSample) { + uint32_t sample = + GetBits32(pSampleData, bitpos.ValueOrDie(), m_nBitsPerSample); + FX_FLOAT encoded = (FX_FLOAT)sample; + for (uint32_t i = 0; i < m_nInputs; i++) { + if (index[i] == m_EncodeInfo[i].sizes - 1) { + if (index[i] == 0) + encoded = encoded_input[i] * (FX_FLOAT)sample; + } else { + FX_SAFE_INT32 bitpos2 = blocksize[i]; + bitpos2 += pos; + bitpos2 *= m_nOutputs; + bitpos2 += j; + bitpos2 *= m_nBitsPerSample; + if (!bitpos2.IsValid()) + return false; + uint32_t sample1 = + GetBits32(pSampleData, bitpos2.ValueOrDie(), m_nBitsPerSample); + encoded += (encoded_input[i] - index[i]) * + ((FX_FLOAT)sample1 - (FX_FLOAT)sample); + } + } + results[j] = + PDF_Interpolate(encoded, 0, (FX_FLOAT)m_SampleMax, + m_DecodeInfo[j].decode_min, m_DecodeInfo[j].decode_max); + } + return true; +} + +CPDF_ExpIntFunc::CPDF_ExpIntFunc() + : CPDF_Function(Type::kType2ExpotentialInterpolation), + m_pBeginValues(nullptr), + m_pEndValues(nullptr) {} + +CPDF_ExpIntFunc::~CPDF_ExpIntFunc() { + FX_Free(m_pBeginValues); + FX_Free(m_pEndValues); +} +bool CPDF_ExpIntFunc::v_Init(CPDF_Object* pObj) { + CPDF_Dictionary* pDict = pObj->GetDict(); + if (!pDict) { + return false; + } + CPDF_Array* pArray0 = pDict->GetArrayFor("C0"); + if (m_nOutputs == 0) { + m_nOutputs = 1; + if (pArray0) { + m_nOutputs = pArray0->GetCount(); + } + } + CPDF_Array* pArray1 = pDict->GetArrayFor("C1"); + m_pBeginValues = FX_Alloc2D(FX_FLOAT, m_nOutputs, 2); + m_pEndValues = FX_Alloc2D(FX_FLOAT, m_nOutputs, 2); + for (uint32_t i = 0; i < m_nOutputs; i++) { + m_pBeginValues[i] = pArray0 ? pArray0->GetFloatAt(i) : 0.0f; + m_pEndValues[i] = pArray1 ? pArray1->GetFloatAt(i) : 1.0f; + } + m_Exponent = pDict->GetFloatFor("N"); + m_nOrigOutputs = m_nOutputs; + if (m_nOutputs && m_nInputs > INT_MAX / m_nOutputs) { + return false; + } + m_nOutputs *= m_nInputs; + return true; +} +bool CPDF_ExpIntFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const { + for (uint32_t i = 0; i < m_nInputs; i++) + for (uint32_t j = 0; j < m_nOrigOutputs; j++) { + results[i * m_nOrigOutputs + j] = + m_pBeginValues[j] + + (FX_FLOAT)FXSYS_pow(inputs[i], m_Exponent) * + (m_pEndValues[j] - m_pBeginValues[j]); + } + return true; +} + +CPDF_StitchFunc::CPDF_StitchFunc() + : CPDF_Function(Type::kType3Stitching), + m_pBounds(nullptr), + m_pEncode(nullptr) {} + +CPDF_StitchFunc::~CPDF_StitchFunc() { + FX_Free(m_pBounds); + FX_Free(m_pEncode); +} + +bool CPDF_StitchFunc::v_Init(CPDF_Object* pObj) { + CPDF_Dictionary* pDict = pObj->GetDict(); + if (!pDict) { + return false; + } + if (m_nInputs != kRequiredNumInputs) { + return false; + } + CPDF_Array* pArray = pDict->GetArrayFor("Functions"); + if (!pArray) { + return false; + } + uint32_t nSubs = pArray->GetCount(); + if (nSubs == 0) + return false; + m_nOutputs = 0; + for (uint32_t i = 0; i < nSubs; i++) { + CPDF_Object* pSub = pArray->GetDirectObjectAt(i); + if (pSub == pObj) + return false; + std::unique_ptr pFunc(CPDF_Function::Load(pSub)); + if (!pFunc) + return false; + // Check that the input dimensionality is 1, and that all output + // dimensionalities are the same. + if (pFunc->CountInputs() != kRequiredNumInputs) + return false; + if (pFunc->CountOutputs() != m_nOutputs) { + if (m_nOutputs) + return false; + + m_nOutputs = pFunc->CountOutputs(); + } + + m_pSubFunctions.push_back(std::move(pFunc)); + } + m_pBounds = FX_Alloc(FX_FLOAT, nSubs + 1); + m_pBounds[0] = m_pDomains[0]; + pArray = pDict->GetArrayFor("Bounds"); + if (!pArray) + return false; + for (uint32_t i = 0; i < nSubs - 1; i++) + m_pBounds[i + 1] = pArray->GetFloatAt(i); + m_pBounds[nSubs] = m_pDomains[1]; + m_pEncode = FX_Alloc2D(FX_FLOAT, nSubs, 2); + pArray = pDict->GetArrayFor("Encode"); + if (!pArray) + return false; + + for (uint32_t i = 0; i < nSubs * 2; i++) + m_pEncode[i] = pArray->GetFloatAt(i); + return true; +} + +bool CPDF_StitchFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* outputs) const { + FX_FLOAT input = inputs[0]; + size_t i; + for (i = 0; i < m_pSubFunctions.size() - 1; i++) { + if (input < m_pBounds[i + 1]) + break; + } + input = PDF_Interpolate(input, m_pBounds[i], m_pBounds[i + 1], + m_pEncode[i * 2], m_pEncode[i * 2 + 1]); + int nresults; + m_pSubFunctions[i]->Call(&input, kRequiredNumInputs, outputs, nresults); + return true; +} + +// static +std::unique_ptr CPDF_Function::Load(CPDF_Object* pFuncObj) { + std::unique_ptr pFunc; + if (!pFuncObj) + return pFunc; + + int iType = -1; + if (CPDF_Stream* pStream = pFuncObj->AsStream()) + iType = pStream->GetDict()->GetIntegerFor("FunctionType"); + else if (CPDF_Dictionary* pDict = pFuncObj->AsDictionary()) + iType = pDict->GetIntegerFor("FunctionType"); + + Type type = IntegerToFunctionType(iType); + if (type == Type::kType0Sampled) + pFunc = pdfium::MakeUnique(); + else if (type == Type::kType2ExpotentialInterpolation) + pFunc = pdfium::MakeUnique(); + else if (type == Type::kType3Stitching) + pFunc = pdfium::MakeUnique(); + else if (type == Type::kType4PostScript) + pFunc = pdfium::MakeUnique(); + + if (!pFunc || !pFunc->Init(pFuncObj)) + return nullptr; + + return pFunc; +} + +// static +CPDF_Function::Type CPDF_Function::IntegerToFunctionType(int iType) { + switch (iType) { + case 0: + case 2: + case 3: + case 4: + return static_cast(iType); + default: + return Type::kTypeInvalid; + } +} + +CPDF_Function::CPDF_Function(Type type) + : m_pDomains(nullptr), m_pRanges(nullptr), m_Type(type) {} + +CPDF_Function::~CPDF_Function() { + FX_Free(m_pDomains); + FX_Free(m_pRanges); +} + +bool CPDF_Function::Init(CPDF_Object* pObj) { + CPDF_Stream* pStream = pObj->AsStream(); + CPDF_Dictionary* pDict = pStream ? pStream->GetDict() : pObj->AsDictionary(); + + CPDF_Array* pDomains = pDict->GetArrayFor("Domain"); + if (!pDomains) + return false; + + m_nInputs = pDomains->GetCount() / 2; + if (m_nInputs == 0) + return false; + + m_pDomains = FX_Alloc2D(FX_FLOAT, m_nInputs, 2); + for (uint32_t i = 0; i < m_nInputs * 2; i++) { + m_pDomains[i] = pDomains->GetFloatAt(i); + } + CPDF_Array* pRanges = pDict->GetArrayFor("Range"); + m_nOutputs = 0; + if (pRanges) { + m_nOutputs = pRanges->GetCount() / 2; + m_pRanges = FX_Alloc2D(FX_FLOAT, m_nOutputs, 2); + for (uint32_t i = 0; i < m_nOutputs * 2; i++) + m_pRanges[i] = pRanges->GetFloatAt(i); + } + uint32_t old_outputs = m_nOutputs; + if (!v_Init(pObj)) + return false; + if (m_pRanges && m_nOutputs > old_outputs) { + m_pRanges = FX_Realloc(FX_FLOAT, m_pRanges, m_nOutputs * 2); + if (m_pRanges) { + FXSYS_memset(m_pRanges + (old_outputs * 2), 0, + sizeof(FX_FLOAT) * (m_nOutputs - old_outputs) * 2); + } + } + return true; +} + +bool CPDF_Function::Call(FX_FLOAT* inputs, + uint32_t ninputs, + FX_FLOAT* results, + int& nresults) const { + if (m_nInputs != ninputs) { + return false; + } + nresults = m_nOutputs; + for (uint32_t i = 0; i < m_nInputs; i++) { + if (inputs[i] < m_pDomains[i * 2]) + inputs[i] = m_pDomains[i * 2]; + else if (inputs[i] > m_pDomains[i * 2 + 1]) + inputs[i] = m_pDomains[i * 2] + 1; + } + v_Call(inputs, results); + if (m_pRanges) { + for (uint32_t i = 0; i < m_nOutputs; i++) { + if (results[i] < m_pRanges[i * 2]) + results[i] = m_pRanges[i * 2]; + else if (results[i] > m_pRanges[i * 2 + 1]) + results[i] = m_pRanges[i * 2 + 1]; + } + } + return true; +} + +const CPDF_SampledFunc* CPDF_Function::ToSampledFunc() const { + return m_Type == Type::kType0Sampled + ? static_cast(this) + : nullptr; +} + +const CPDF_ExpIntFunc* CPDF_Function::ToExpIntFunc() const { + return m_Type == Type::kType2ExpotentialInterpolation + ? static_cast(this) + : nullptr; +} + +const CPDF_StitchFunc* CPDF_Function::ToStitchFunc() const { + return m_Type == Type::kType3Stitching + ? static_cast(this) + : nullptr; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/fpdf_page_func_embeddertest.cpp b/modules/pdfium/pdfium/core/fpdfapi/page/fpdf_page_func_embeddertest.cpp new file mode 100644 index 000000000000..6a1b87b570bc --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/fpdf_page_func_embeddertest.cpp @@ -0,0 +1,21 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +class FPDFPageFuncEmbeddertest : public EmbedderTest {}; + +TEST_F(FPDFPageFuncEmbeddertest, Bug_551460) { + // Should not crash under ASan. + // Tests that the number of inputs is not simply calculated from the domain + // and trusted. The number of inputs has to be 1. + EXPECT_TRUE(OpenDocument("bug_551460.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_NE(nullptr, page); + FPDF_BITMAP bitmap = RenderPage(page); + CompareBitmap(bitmap, 612, 792, "1940568c9ba33bac5d0b1ee9558c76b3"); + FPDFBitmap_Destroy(bitmap); + UnloadPage(page); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/page/pageint.h b/modules/pdfium/pdfium/core/fpdfapi/page/pageint.h new file mode 100644 index 000000000000..6700633604a5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/page/pageint.h @@ -0,0 +1,206 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PAGE_PAGEINT_H_ +#define CORE_FPDFAPI_PAGE_PAGEINT_H_ + +#include +#include + +#include "core/fpdfapi/page/cpdf_colorspace.h" +#include "core/fpdfapi/page/cpdf_countedobject.h" + +class CPDF_ExpIntFunc; +class CPDF_Pattern; +class CPDF_SampledFunc; +class CPDF_StitchFunc; +class CPDF_StreamAcc; + +class CPDF_Function { + public: + enum class Type { + kTypeInvalid = -1, + kType0Sampled = 0, + kType2ExpotentialInterpolation = 2, + kType3Stitching = 3, + kType4PostScript = 4, + }; + + static std::unique_ptr Load(CPDF_Object* pFuncObj); + static Type IntegerToFunctionType(int iType); + + virtual ~CPDF_Function(); + bool Call(FX_FLOAT* inputs, + uint32_t ninputs, + FX_FLOAT* results, + int& nresults) const; + uint32_t CountInputs() const { return m_nInputs; } + uint32_t CountOutputs() const { return m_nOutputs; } + FX_FLOAT GetDomain(int i) const { return m_pDomains[i]; } + FX_FLOAT GetRange(int i) const { return m_pRanges[i]; } + + const CPDF_SampledFunc* ToSampledFunc() const; + const CPDF_ExpIntFunc* ToExpIntFunc() const; + const CPDF_StitchFunc* ToStitchFunc() const; + + protected: + explicit CPDF_Function(Type type); + + bool Init(CPDF_Object* pObj); + virtual bool v_Init(CPDF_Object* pObj) = 0; + virtual bool v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const = 0; + + uint32_t m_nInputs; + uint32_t m_nOutputs; + FX_FLOAT* m_pDomains; + FX_FLOAT* m_pRanges; + const Type m_Type; +}; + +class CPDF_ExpIntFunc : public CPDF_Function { + public: + CPDF_ExpIntFunc(); + ~CPDF_ExpIntFunc() override; + + // CPDF_Function + bool v_Init(CPDF_Object* pObj) override; + bool v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const override; + + uint32_t m_nOrigOutputs; + FX_FLOAT m_Exponent; + FX_FLOAT* m_pBeginValues; + FX_FLOAT* m_pEndValues; +}; + +class CPDF_SampledFunc : public CPDF_Function { + public: + struct SampleEncodeInfo { + FX_FLOAT encode_max; + FX_FLOAT encode_min; + uint32_t sizes; + }; + + struct SampleDecodeInfo { + FX_FLOAT decode_max; + FX_FLOAT decode_min; + }; + + CPDF_SampledFunc(); + ~CPDF_SampledFunc() override; + + // CPDF_Function + bool v_Init(CPDF_Object* pObj) override; + bool v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const override; + + const std::vector& GetEncodeInfo() const { + return m_EncodeInfo; + } + uint32_t GetBitsPerSample() const { return m_nBitsPerSample; } + const CPDF_StreamAcc* GetSampleStream() const { + return m_pSampleStream.get(); + } + + private: + std::vector m_EncodeInfo; + std::vector m_DecodeInfo; + uint32_t m_nBitsPerSample; + uint32_t m_SampleMax; + std::unique_ptr m_pSampleStream; +}; + +class CPDF_StitchFunc : public CPDF_Function { + public: + CPDF_StitchFunc(); + ~CPDF_StitchFunc() override; + + // CPDF_Function + bool v_Init(CPDF_Object* pObj) override; + bool v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const override; + + const std::vector>& GetSubFunctions() const { + return m_pSubFunctions; + } + FX_FLOAT GetBound(size_t i) const { return m_pBounds[i]; } + + private: + std::vector> m_pSubFunctions; + FX_FLOAT* m_pBounds; + FX_FLOAT* m_pEncode; + + static const uint32_t kRequiredNumInputs = 1; +}; + +class CPDF_IccProfile { + public: + CPDF_IccProfile(const uint8_t* pData, uint32_t dwSize); + ~CPDF_IccProfile(); + uint32_t GetComponents() const { return m_nSrcComponents; } + bool m_bsRGB; + void* m_pTransform; + + private: + uint32_t m_nSrcComponents; +}; + +class CPDF_DeviceCS : public CPDF_ColorSpace { + public: + CPDF_DeviceCS(CPDF_Document* pDoc, int family); + + bool GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const override; + bool SetRGB(FX_FLOAT* pBuf, + FX_FLOAT R, + FX_FLOAT G, + FX_FLOAT B) const override; + bool v_GetCMYK(FX_FLOAT* pBuf, + FX_FLOAT& c, + FX_FLOAT& m, + FX_FLOAT& y, + FX_FLOAT& k) const override; + bool v_SetCMYK(FX_FLOAT* pBuf, + FX_FLOAT c, + FX_FLOAT m, + FX_FLOAT y, + FX_FLOAT k) const override; + void TranslateImageLine(uint8_t* pDestBuf, + const uint8_t* pSrcBuf, + int pixels, + int image_width, + int image_height, + bool bTransMask = false) const override; +}; + +class CPDF_PatternCS : public CPDF_ColorSpace { + public: + explicit CPDF_PatternCS(CPDF_Document* pDoc); + ~CPDF_PatternCS() override; + bool v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override; + bool GetRGB(FX_FLOAT* pBuf, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) const override; + CPDF_ColorSpace* GetBaseCS() const override; + + private: + CPDF_ColorSpace* m_pBaseCS; + CPDF_CountedColorSpace* m_pCountedBaseCS; +}; + +#define MAX_PATTERN_COLORCOMPS 16 +struct PatternValue { + CPDF_Pattern* m_pPattern; + CPDF_CountedPattern* m_pCountedPattern; + int m_nComps; + FX_FLOAT m_Comps[MAX_PATTERN_COLORCOMPS]; +}; + +CFX_ByteStringC PDF_FindKeyAbbreviationForTesting(const CFX_ByteStringC& abbr); +CFX_ByteStringC PDF_FindValueAbbreviationForTesting( + const CFX_ByteStringC& abbr); + +#endif // CORE_FPDFAPI_PAGE_PAGEINT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cfdf_document.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cfdf_document.cpp new file mode 100644 index 000000000000..65755520c08d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cfdf_document.cpp @@ -0,0 +1,100 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cfdf_document.h" + +#include +#include + +#include "core/fpdfapi/edit/cpdf_creator.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_syntax_parser.h" +#include "third_party/base/ptr_util.h" + +CFDF_Document::CFDF_Document() + : CPDF_IndirectObjectHolder(), m_pRootDict(nullptr) {} + +CFDF_Document::~CFDF_Document() {} + +std::unique_ptr CFDF_Document::CreateNewDoc() { + auto pDoc = pdfium::MakeUnique(); + pDoc->m_pRootDict = pDoc->NewIndirect(); + pDoc->m_pRootDict->SetNewFor("FDF"); + return pDoc; +} + +std::unique_ptr CFDF_Document::ParseFile( + const CFX_RetainPtr& pFile) { + if (!pFile) + return nullptr; + + auto pDoc = pdfium::MakeUnique(); + pDoc->ParseStream(pFile); + return pDoc->m_pRootDict ? std::move(pDoc) : nullptr; +} + +std::unique_ptr CFDF_Document::ParseMemory(uint8_t* pData, + uint32_t size) { + return CFDF_Document::ParseFile(IFX_MemoryStream::Create(pData, size)); +} + +void CFDF_Document::ParseStream( + const CFX_RetainPtr& pFile) { + m_pFile = pFile; + CPDF_SyntaxParser parser; + parser.InitParser(m_pFile, 0); + while (1) { + bool bNumber; + CFX_ByteString word = parser.GetNextWord(&bNumber); + if (bNumber) { + uint32_t objnum = FXSYS_atoui(word.c_str()); + if (!objnum) + break; + + word = parser.GetNextWord(&bNumber); + if (!bNumber) + break; + + word = parser.GetNextWord(nullptr); + if (word != "obj") + break; + + std::unique_ptr pObj = + parser.GetObject(this, objnum, 0, true); + if (!pObj) + break; + + ReplaceIndirectObjectIfHigherGeneration(objnum, std::move(pObj)); + word = parser.GetNextWord(nullptr); + if (word != "endobj") + break; + } else { + if (word != "trailer") + break; + + std::unique_ptr pMainDict = + ToDictionary(parser.GetObject(this, 0, 0, true)); + if (pMainDict) + m_pRootDict = pMainDict->GetDictFor("Root"); + + break; + } + } +} + +bool CFDF_Document::WriteBuf(CFX_ByteTextBuf& buf) const { + if (!m_pRootDict) + return false; + + buf << "%FDF-1.2\r\n"; + for (const auto& pair : *this) + buf << pair.first << " 0 obj\r\n" + << pair.second.get() << "\r\nendobj\r\n\r\n"; + + buf << "trailer\r\n<GetObjNum() + << " 0 R>>\r\n%%EOF\r\n"; + return true; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cfdf_document.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cfdf_document.h new file mode 100644 index 000000000000..f83adc1a3081 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cfdf_document.h @@ -0,0 +1,39 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CFDF_DOCUMENT_H_ +#define CORE_FPDFAPI_PARSER_CFDF_DOCUMENT_H_ + +#include + +#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fxcrt/fx_basic.h" + +class CPDF_Dictionary; + +class CFDF_Document : public CPDF_IndirectObjectHolder { + public: + static std::unique_ptr CreateNewDoc(); + static std::unique_ptr ParseFile( + const CFX_RetainPtr& pFile); + static std::unique_ptr ParseMemory(uint8_t* pData, + uint32_t size); + + CFDF_Document(); + ~CFDF_Document() override; + + bool WriteBuf(CFX_ByteTextBuf& buf) const; + CPDF_Dictionary* GetRoot() const { return m_pRootDict; } + + protected: + void ParseStream(const CFX_RetainPtr& pFile); + + CPDF_Dictionary* m_pRootDict; + CFX_RetainPtr m_pFile; +}; + +#endif // CORE_FPDFAPI_PARSER_CFDF_DOCUMENT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_array.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_array.cpp new file mode 100644 index 000000000000..05a93702f17f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_array.cpp @@ -0,0 +1,192 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_array.h" + +#include +#include + +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "third_party/base/logging.h" +#include "third_party/base/stl_util.h" + +CPDF_Array::CPDF_Array() {} + +CPDF_Array::CPDF_Array(const CFX_WeakPtr& pPool) + : m_pPool(pPool) {} + +CPDF_Array::~CPDF_Array() { + // Break cycles for cyclic references. + m_ObjNum = kInvalidObjNum; + for (auto& it : m_Objects) { + if (it && it->GetObjNum() == kInvalidObjNum) + it.release(); + } +} + +CPDF_Object::Type CPDF_Array::GetType() const { + return ARRAY; +} + +bool CPDF_Array::IsArray() const { + return true; +} + +CPDF_Array* CPDF_Array::AsArray() { + return this; +} + +const CPDF_Array* CPDF_Array::AsArray() const { + return this; +} + +std::unique_ptr CPDF_Array::Clone() const { + return CloneObjectNonCyclic(false); +} + +std::unique_ptr CPDF_Array::CloneNonCyclic( + bool bDirect, + std::set* pVisited) const { + pVisited->insert(this); + auto pCopy = pdfium::MakeUnique(); + for (const auto& pValue : m_Objects) { + if (!pdfium::ContainsKey(*pVisited, pValue.get())) + pCopy->m_Objects.push_back(pValue->CloneNonCyclic(bDirect, pVisited)); + } + return std::move(pCopy); +} + +CFX_FloatRect CPDF_Array::GetRect() { + CFX_FloatRect rect; + if (!IsArray() || m_Objects.size() != 4) + return rect; + + rect.left = GetNumberAt(0); + rect.bottom = GetNumberAt(1); + rect.right = GetNumberAt(2); + rect.top = GetNumberAt(3); + return rect; +} + +CFX_Matrix CPDF_Array::GetMatrix() { + CFX_Matrix matrix; + if (!IsArray() || m_Objects.size() != 6) + return CFX_Matrix(); + + return CFX_Matrix(GetNumberAt(0), GetNumberAt(1), GetNumberAt(2), + GetNumberAt(3), GetNumberAt(4), GetNumberAt(5)); +} + +CPDF_Object* CPDF_Array::GetObjectAt(size_t i) const { + if (i >= m_Objects.size()) + return nullptr; + return m_Objects[i].get(); +} + +CPDF_Object* CPDF_Array::GetDirectObjectAt(size_t i) const { + if (i >= m_Objects.size()) + return nullptr; + return m_Objects[i]->GetDirect(); +} + +CFX_ByteString CPDF_Array::GetStringAt(size_t i) const { + if (i >= m_Objects.size()) + return CFX_ByteString(); + return m_Objects[i]->GetString(); +} + +int CPDF_Array::GetIntegerAt(size_t i) const { + if (i >= m_Objects.size()) + return 0; + return m_Objects[i]->GetInteger(); +} + +FX_FLOAT CPDF_Array::GetNumberAt(size_t i) const { + if (i >= m_Objects.size()) + return 0; + return m_Objects[i]->GetNumber(); +} + +CPDF_Dictionary* CPDF_Array::GetDictAt(size_t i) const { + CPDF_Object* p = GetDirectObjectAt(i); + if (!p) + return nullptr; + if (CPDF_Dictionary* pDict = p->AsDictionary()) + return pDict; + if (CPDF_Stream* pStream = p->AsStream()) + return pStream->GetDict(); + return nullptr; +} + +CPDF_Stream* CPDF_Array::GetStreamAt(size_t i) const { + return ToStream(GetDirectObjectAt(i)); +} + +CPDF_Array* CPDF_Array::GetArrayAt(size_t i) const { + return ToArray(GetDirectObjectAt(i)); +} + +void CPDF_Array::RemoveAt(size_t i, size_t nCount) { + if (i >= m_Objects.size()) + return; + + if (nCount <= 0 || nCount > m_Objects.size() - i) + return; + + m_Objects.erase(m_Objects.begin() + i, m_Objects.begin() + i + nCount); +} + +void CPDF_Array::ConvertToIndirectObjectAt(size_t i, + CPDF_IndirectObjectHolder* pHolder) { + if (i >= m_Objects.size()) + return; + + if (!m_Objects[i] || m_Objects[i]->IsReference()) + return; + + CPDF_Object* pNew = pHolder->AddIndirectObject(std::move(m_Objects[i])); + m_Objects[i] = pdfium::MakeUnique(pHolder, pNew->GetObjNum()); +} + +CPDF_Object* CPDF_Array::SetAt(size_t i, std::unique_ptr pObj) { + ASSERT(IsArray()); + ASSERT(!pObj || pObj->IsInline()); + if (i >= m_Objects.size()) { + ASSERT(false); + return nullptr; + } + CPDF_Object* pRet = pObj.get(); + m_Objects[i] = std::move(pObj); + return pRet; +} + +CPDF_Object* CPDF_Array::InsertAt(size_t index, + std::unique_ptr pObj) { + ASSERT(IsArray()); + CHECK(!pObj || pObj->IsInline()); + CPDF_Object* pRet = pObj.get(); + if (index >= m_Objects.size()) { + // Allocate space first. + m_Objects.resize(index + 1); + m_Objects[index] = std::move(pObj); + } else { + // Directly insert. + m_Objects.insert(m_Objects.begin() + index, std::move(pObj)); + } + return pRet; +} + +CPDF_Object* CPDF_Array::Add(std::unique_ptr pObj) { + ASSERT(IsArray()); + CHECK(!pObj || pObj->IsInline()); + CPDF_Object* pRet = pObj.get(); + m_Objects.push_back(std::move(pObj)); + return pRet; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_array.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_array.h new file mode 100644 index 000000000000..0b16f7f21b60 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_array.h @@ -0,0 +1,132 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_ARRAY_H_ +#define CORE_FPDFAPI_PARSER_CPDF_ARRAY_H_ + +#include +#include +#include +#include +#include + +#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" +#include "third_party/base/ptr_util.h" + +class CPDF_Array : public CPDF_Object { + public: + using const_iterator = + std::vector>::const_iterator; + + CPDF_Array(); + explicit CPDF_Array(const CFX_WeakPtr& pPool); + ~CPDF_Array() override; + + // CPDF_Object: + Type GetType() const override; + std::unique_ptr Clone() const override; + bool IsArray() const override; + CPDF_Array* AsArray() override; + const CPDF_Array* AsArray() const override; + + bool IsEmpty() const { return m_Objects.empty(); } + size_t GetCount() const { return m_Objects.size(); } + CPDF_Object* GetObjectAt(size_t index) const; + CPDF_Object* GetDirectObjectAt(size_t index) const; + CFX_ByteString GetStringAt(size_t index) const; + int GetIntegerAt(size_t index) const; + FX_FLOAT GetNumberAt(size_t index) const; + CPDF_Dictionary* GetDictAt(size_t index) const; + CPDF_Stream* GetStreamAt(size_t index) const; + CPDF_Array* GetArrayAt(size_t index) const; + FX_FLOAT GetFloatAt(size_t index) const { return GetNumberAt(index); } + CFX_Matrix GetMatrix(); + CFX_FloatRect GetRect(); + + // Takes ownership of |pObj|, returns unowned pointer to it. + CPDF_Object* Add(std::unique_ptr pObj); + CPDF_Object* SetAt(size_t index, std::unique_ptr pObj); + CPDF_Object* InsertAt(size_t index, std::unique_ptr pObj); + + // Creates object owned by the array, returns unowned pointer to it. + // We have special cases for objects that can intern strings from + // a ByteStringPool. + template + typename std::enable_if::value, T*>::type AddNew( + Args&&... args) { + return static_cast( + Add(pdfium::MakeUnique(std::forward(args)...))); + } + template + typename std::enable_if::value, T*>::type AddNew( + Args&&... args) { + return static_cast( + Add(pdfium::MakeUnique(m_pPool, std::forward(args)...))); + } + template + typename std::enable_if::value, T*>::type SetNewAt( + size_t index, + Args&&... args) { + return static_cast( + SetAt(index, pdfium::MakeUnique(std::forward(args)...))); + } + template + typename std::enable_if::value, T*>::type SetNewAt( + size_t index, + Args&&... args) { + return static_cast(SetAt( + index, pdfium::MakeUnique(m_pPool, std::forward(args)...))); + } + template + typename std::enable_if::value, T*>::type InsertNewAt( + size_t index, + Args&&... args) { + return static_cast( + InsertAt(index, pdfium::MakeUnique(std::forward(args)...))); + } + template + typename std::enable_if::value, T*>::type InsertNewAt( + size_t index, + Args&&... args) { + return static_cast(InsertAt( + index, pdfium::MakeUnique(m_pPool, std::forward(args)...))); + } + + void RemoveAt(size_t index, size_t nCount = 1); + void ConvertToIndirectObjectAt(size_t index, CPDF_IndirectObjectHolder* pDoc); + + const_iterator begin() const { return m_Objects.begin(); } + const_iterator end() const { return m_Objects.end(); } + + protected: + std::unique_ptr CloneNonCyclic( + bool bDirect, + std::set* pVisited) const override; + + std::vector> m_Objects; + CFX_WeakPtr m_pPool; +}; + +inline CPDF_Array* ToArray(CPDF_Object* obj) { + return obj ? obj->AsArray() : nullptr; +} + +inline const CPDF_Array* ToArray(const CPDF_Object* obj) { + return obj ? obj->AsArray() : nullptr; +} + +inline std::unique_ptr ToArray(std::unique_ptr obj) { + CPDF_Array* pArray = ToArray(obj.get()); + if (!pArray) + return nullptr; + obj.release(); + return std::unique_ptr(pArray); +} + +#endif // CORE_FPDFAPI_PARSER_CPDF_ARRAY_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_array_unittest.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_array_unittest.cpp new file mode 100644 index 000000000000..46777289b53d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_array_unittest.cpp @@ -0,0 +1,177 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_array.h" + +#include +#include + +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/base/ptr_util.h" + +TEST(cpdf_array, RemoveAt) { + { + int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + std::unique_ptr arr(new CPDF_Array); + for (size_t i = 0; i < FX_ArraySize(elems); ++i) + arr->AddNew(elems[i]); + arr->RemoveAt(3, 3); + int expected[] = {1, 2, 3, 7, 8, 9, 10}; + EXPECT_EQ(FX_ArraySize(expected), arr->GetCount()); + for (size_t i = 0; i < FX_ArraySize(expected); ++i) + EXPECT_EQ(expected[i], arr->GetIntegerAt(i)); + arr->RemoveAt(4, 2); + int expected2[] = {1, 2, 3, 7, 10}; + EXPECT_EQ(FX_ArraySize(expected2), arr->GetCount()); + for (size_t i = 0; i < FX_ArraySize(expected2); ++i) + EXPECT_EQ(expected2[i], arr->GetIntegerAt(i)); + } + { + // When the range is out of bound, RemoveAt has no effect. + int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + std::unique_ptr arr(new CPDF_Array); + for (size_t i = 0; i < FX_ArraySize(elems); ++i) + arr->AddNew(elems[i]); + arr->RemoveAt(8, 5); + EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); + for (size_t i = 0; i < FX_ArraySize(elems); ++i) + EXPECT_EQ(elems[i], arr->GetIntegerAt(i)); + arr->RemoveAt(0, 12); + EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); + arr->RemoveAt(11, 1); + EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); + } +} + +TEST(cpdf_array, InsertAt) { + { + int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + auto arr = pdfium::MakeUnique(); + for (size_t i = 0; i < FX_ArraySize(elems); ++i) + arr->InsertNewAt(i, elems[i]); + EXPECT_EQ(FX_ArraySize(elems), arr->GetCount()); + for (size_t i = 0; i < FX_ArraySize(elems); ++i) + EXPECT_EQ(elems[i], arr->GetIntegerAt(i)); + arr->InsertNewAt(3, 33); + arr->InsertNewAt(6, 55); + arr->InsertNewAt(12, 12); + int expected[] = {1, 2, 3, 33, 4, 5, 55, 6, 7, 8, 9, 10, 12}; + EXPECT_EQ(FX_ArraySize(expected), arr->GetCount()); + for (size_t i = 0; i < FX_ArraySize(expected); ++i) + EXPECT_EQ(expected[i], arr->GetIntegerAt(i)); + } + { + // When the position to insert is beyond the upper bound, + // an element is inserted at that position while other unfilled + // positions have nullptr. + int elems[] = {1, 2}; + auto arr = pdfium::MakeUnique(); + for (size_t i = 0; i < FX_ArraySize(elems); ++i) + arr->InsertNewAt(i, elems[i]); + arr->InsertNewAt(10, 10); + EXPECT_EQ(11u, arr->GetCount()); + for (size_t i = 0; i < FX_ArraySize(elems); ++i) + EXPECT_EQ(elems[i], arr->GetIntegerAt(i)); + for (size_t i = FX_ArraySize(elems); i < 10; ++i) + EXPECT_EQ(nullptr, arr->GetObjectAt(i)); + EXPECT_EQ(10, arr->GetIntegerAt(10)); + } +} + +TEST(cpdf_array, Clone) { + { + // Basic case. + int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + auto arr = pdfium::MakeUnique(); + for (size_t i = 0; i < FX_ArraySize(elems); ++i) + arr->InsertNewAt(i, elems[i]); + std::unique_ptr arr2 = ToArray(arr->Clone()); + EXPECT_EQ(arr->GetCount(), arr2->GetCount()); + for (size_t i = 0; i < FX_ArraySize(elems); ++i) { + // Clone() always create new objects. + EXPECT_NE(arr->GetObjectAt(i), arr2->GetObjectAt(i)); + EXPECT_EQ(arr->GetIntegerAt(i), arr2->GetIntegerAt(i)); + } + } + { + // Clone() with and without dereferencing reference objects. + static const size_t kNumOfRows = 3; + static const size_t kNumOfRowElems = 5; + int elems[kNumOfRows][kNumOfRowElems] = { + {1, 2, 3, 4, 5}, {10, 9, 8, 7, 6}, {11, 12, 13, 14, 15}}; + std::unique_ptr arr(new CPDF_Array); + // Indirect references to indirect objects. + std::unique_ptr obj_holder( + new CPDF_IndirectObjectHolder()); + for (size_t i = 0; i < kNumOfRows; ++i) { + auto arr_elem = pdfium::MakeUnique(); + for (size_t j = 0; j < kNumOfRowElems; ++j) { + std::unique_ptr obj(new CPDF_Number(elems[i][j])); + // Starts object number from 1. + int obj_num = i * kNumOfRowElems + j + 1; + obj_holder->ReplaceIndirectObjectIfHigherGeneration(obj_num, + std::move(obj)); + arr_elem->InsertNewAt(j, obj_holder.get(), obj_num); + } + arr->InsertAt(i, std::move(arr_elem)); + } + ASSERT_EQ(kNumOfRows, arr->GetCount()); + // Not dereferencing reference objects means just creating new references + // instead of new copies of direct objects. + std::unique_ptr arr1 = ToArray(arr->Clone()); + EXPECT_EQ(arr->GetCount(), arr1->GetCount()); + // Dereferencing reference objects creates new copies of direct objects. + std::unique_ptr arr2 = ToArray(arr->CloneDirectObject()); + EXPECT_EQ(arr->GetCount(), arr2->GetCount()); + for (size_t i = 0; i < kNumOfRows; ++i) { + CPDF_Array* arr_elem = arr->GetObjectAt(i)->AsArray(); + CPDF_Array* arr1_elem = arr1->GetObjectAt(i)->AsArray(); + CPDF_Array* arr2_elem = arr2->GetObjectAt(i)->AsArray(); + EXPECT_NE(arr_elem, arr1_elem); + EXPECT_NE(arr_elem, arr2_elem); + for (size_t j = 0; j < kNumOfRowElems; ++j) { + auto elem_obj = arr_elem->GetObjectAt(j); + auto elem_obj1 = arr1_elem->GetObjectAt(j); + auto elem_obj2 = arr2_elem->GetObjectAt(j); + // Results from not deferencing reference objects. + EXPECT_NE(elem_obj, elem_obj1); + EXPECT_TRUE(elem_obj1->IsReference()); + EXPECT_EQ(elem_obj->GetDirect(), elem_obj1->GetDirect()); + EXPECT_EQ(elem_obj->GetInteger(), elem_obj1->GetInteger()); + // Results from deferencing reference objects. + EXPECT_NE(elem_obj, elem_obj2); + EXPECT_TRUE(elem_obj2->IsNumber()); + EXPECT_NE(elem_obj->GetDirect(), elem_obj2); + EXPECT_EQ(elem_obj->GetObjNum(), elem_obj2->GetObjNum()); + EXPECT_EQ(elem_obj->GetInteger(), elem_obj2->GetInteger()); + } + } + arr.reset(); + ASSERT_EQ(kNumOfRows, arr1->GetCount()); + for (size_t i = 0; i < kNumOfRows; ++i) { + for (size_t j = 0; j < kNumOfRowElems; ++j) { + // Results from not deferencing reference objects. + auto elem_obj1 = arr1->GetObjectAt(i)->AsArray()->GetObjectAt(j); + EXPECT_TRUE(elem_obj1->IsReference()); + EXPECT_EQ(elems[i][j], elem_obj1->GetInteger()); + // Results from deferencing reference objects. + EXPECT_EQ(elems[i][j], + arr2->GetObjectAt(i)->AsArray()->GetIntegerAt(j)); + } + } + } +} + +TEST(cpdf_array, Iterator) { + int elems[] = {-23, -11, 3, 455, 2345877, + 0, 7895330, -12564334, 10000, -100000}; + std::unique_ptr arr(new CPDF_Array); + for (size_t i = 0; i < FX_ArraySize(elems); ++i) + arr->InsertNewAt(i, elems[i]); + size_t index = 0; + for (const auto& it : *arr) + EXPECT_EQ(elems[index++], it->AsNumber()->GetInteger()); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_boolean.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_boolean.cpp new file mode 100644 index 000000000000..0204fd9eb0c4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_boolean.cpp @@ -0,0 +1,46 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_boolean.h" +#include "third_party/base/ptr_util.h" + +CPDF_Boolean::CPDF_Boolean() : m_bValue(false) {} + +CPDF_Boolean::CPDF_Boolean(bool value) : m_bValue(value) {} + +CPDF_Boolean::~CPDF_Boolean() {} + +CPDF_Object::Type CPDF_Boolean::GetType() const { + return BOOLEAN; +} + +std::unique_ptr CPDF_Boolean::Clone() const { + return pdfium::MakeUnique(m_bValue); +} + +CFX_ByteString CPDF_Boolean::GetString() const { + return m_bValue ? "true" : "false"; +} + +int CPDF_Boolean::GetInteger() const { + return m_bValue; +} + +void CPDF_Boolean::SetString(const CFX_ByteString& str) { + m_bValue = (str == "true"); +} + +bool CPDF_Boolean::IsBoolean() const { + return true; +} + +CPDF_Boolean* CPDF_Boolean::AsBoolean() { + return this; +} + +const CPDF_Boolean* CPDF_Boolean::AsBoolean() const { + return this; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_boolean.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_boolean.h new file mode 100644 index 000000000000..afebc29448cd --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_boolean.h @@ -0,0 +1,44 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_BOOLEAN_H_ +#define CORE_FPDFAPI_PARSER_CPDF_BOOLEAN_H_ + +#include + +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Boolean : public CPDF_Object { + public: + CPDF_Boolean(); + explicit CPDF_Boolean(bool value); + ~CPDF_Boolean() override; + + // CPDF_Object: + Type GetType() const override; + std::unique_ptr Clone() const override; + CFX_ByteString GetString() const override; + int GetInteger() const override; + void SetString(const CFX_ByteString& str) override; + bool IsBoolean() const override; + CPDF_Boolean* AsBoolean() override; + const CPDF_Boolean* AsBoolean() const override; + + protected: + bool m_bValue; +}; + +inline CPDF_Boolean* ToBoolean(CPDF_Object* obj) { + return obj ? obj->AsBoolean() : nullptr; +} + +inline const CPDF_Boolean* ToBoolean(const CPDF_Object* obj) { + return obj ? obj->AsBoolean() : nullptr; +} + +#endif // CORE_FPDFAPI_PARSER_CPDF_BOOLEAN_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_crypto_handler.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_crypto_handler.cpp new file mode 100644 index 000000000000..61f78c4ee5c9 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_crypto_handler.cpp @@ -0,0 +1,342 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_crypto_handler.h" + +#include + +#include "core/fdrm/crypto/fx_crypt.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_security_handler.h" +#include "core/fpdfapi/parser/cpdf_simple_parser.h" + +void CPDF_CryptoHandler::CryptBlock(bool bEncrypt, + uint32_t objnum, + uint32_t gennum, + const uint8_t* src_buf, + uint32_t src_size, + uint8_t* dest_buf, + uint32_t& dest_size) { + if (m_Cipher == FXCIPHER_NONE) { + FXSYS_memcpy(dest_buf, src_buf, src_size); + return; + } + uint8_t realkey[16]; + int realkeylen = 16; + if (m_Cipher != FXCIPHER_AES || m_KeyLen != 32) { + uint8_t key1[32]; + PopulateKey(objnum, gennum, key1); + + if (m_Cipher == FXCIPHER_AES) { + FXSYS_memcpy(key1 + m_KeyLen + 5, "sAlT", 4); + } + CRYPT_MD5Generate( + key1, m_Cipher == FXCIPHER_AES ? m_KeyLen + 9 : m_KeyLen + 5, realkey); + realkeylen = m_KeyLen + 5; + if (realkeylen > 16) { + realkeylen = 16; + } + } + if (m_Cipher == FXCIPHER_AES) { + CRYPT_AESSetKey(m_pAESContext, 16, m_KeyLen == 32 ? m_EncryptKey : realkey, + m_KeyLen, bEncrypt); + if (bEncrypt) { + uint8_t iv[16]; + for (int i = 0; i < 16; i++) { + iv[i] = (uint8_t)rand(); + } + CRYPT_AESSetIV(m_pAESContext, iv); + FXSYS_memcpy(dest_buf, iv, 16); + int nblocks = src_size / 16; + CRYPT_AESEncrypt(m_pAESContext, dest_buf + 16, src_buf, nblocks * 16); + uint8_t padding[16]; + FXSYS_memcpy(padding, src_buf + nblocks * 16, src_size % 16); + FXSYS_memset(padding + src_size % 16, 16 - src_size % 16, + 16 - src_size % 16); + CRYPT_AESEncrypt(m_pAESContext, dest_buf + nblocks * 16 + 16, padding, + 16); + dest_size = 32 + nblocks * 16; + } else { + CRYPT_AESSetIV(m_pAESContext, src_buf); + CRYPT_AESDecrypt(m_pAESContext, dest_buf, src_buf + 16, src_size - 16); + dest_size = src_size - 16; + dest_size -= dest_buf[dest_size - 1]; + } + } else { + ASSERT(dest_size == src_size); + if (dest_buf != src_buf) { + FXSYS_memcpy(dest_buf, src_buf, src_size); + } + CRYPT_ArcFourCryptBlock(dest_buf, dest_size, realkey, realkeylen); + } +} + +struct AESCryptContext { + uint8_t m_Context[2048]; + bool m_bIV; + uint8_t m_Block[16]; + uint32_t m_BlockOffset; +}; + +void* CPDF_CryptoHandler::CryptStart(uint32_t objnum, + uint32_t gennum, + bool bEncrypt) { + if (m_Cipher == FXCIPHER_NONE) { + return this; + } + if (m_Cipher == FXCIPHER_AES && m_KeyLen == 32) { + AESCryptContext* pContext = FX_Alloc(AESCryptContext, 1); + pContext->m_bIV = true; + pContext->m_BlockOffset = 0; + CRYPT_AESSetKey(pContext->m_Context, 16, m_EncryptKey, 32, bEncrypt); + if (bEncrypt) { + for (int i = 0; i < 16; i++) { + pContext->m_Block[i] = (uint8_t)rand(); + } + CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block); + } + return pContext; + } + uint8_t key1[48]; + PopulateKey(objnum, gennum, key1); + + if (m_Cipher == FXCIPHER_AES) { + FXSYS_memcpy(key1 + m_KeyLen + 5, "sAlT", 4); + } + uint8_t realkey[16]; + CRYPT_MD5Generate( + key1, m_Cipher == FXCIPHER_AES ? m_KeyLen + 9 : m_KeyLen + 5, realkey); + int realkeylen = m_KeyLen + 5; + if (realkeylen > 16) { + realkeylen = 16; + } + if (m_Cipher == FXCIPHER_AES) { + AESCryptContext* pContext = FX_Alloc(AESCryptContext, 1); + pContext->m_bIV = true; + pContext->m_BlockOffset = 0; + CRYPT_AESSetKey(pContext->m_Context, 16, realkey, 16, bEncrypt); + if (bEncrypt) { + for (int i = 0; i < 16; i++) { + pContext->m_Block[i] = (uint8_t)rand(); + } + CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block); + } + return pContext; + } + CRYPT_rc4_context* pContext = FX_Alloc(CRYPT_rc4_context, 1); + CRYPT_ArcFourSetup(pContext, realkey, realkeylen); + return pContext; +} + +bool CPDF_CryptoHandler::CryptStream(void* context, + const uint8_t* src_buf, + uint32_t src_size, + CFX_BinaryBuf& dest_buf, + bool bEncrypt) { + if (!context) { + return false; + } + if (m_Cipher == FXCIPHER_NONE) { + dest_buf.AppendBlock(src_buf, src_size); + return true; + } + if (m_Cipher == FXCIPHER_RC4) { + int old_size = dest_buf.GetSize(); + dest_buf.AppendBlock(src_buf, src_size); + CRYPT_ArcFourCrypt(reinterpret_cast(context), + dest_buf.GetBuffer() + old_size, src_size); + return true; + } + AESCryptContext* pContext = reinterpret_cast(context); + if (pContext->m_bIV && bEncrypt) { + dest_buf.AppendBlock(pContext->m_Block, 16); + pContext->m_bIV = false; + } + uint32_t src_off = 0; + uint32_t src_left = src_size; + while (1) { + uint32_t copy_size = 16 - pContext->m_BlockOffset; + if (copy_size > src_left) { + copy_size = src_left; + } + FXSYS_memcpy(pContext->m_Block + pContext->m_BlockOffset, src_buf + src_off, + copy_size); + src_off += copy_size; + src_left -= copy_size; + pContext->m_BlockOffset += copy_size; + if (pContext->m_BlockOffset == 16) { + if (!bEncrypt && pContext->m_bIV) { + CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block); + pContext->m_bIV = false; + pContext->m_BlockOffset = 0; + } else if (src_off < src_size) { + uint8_t block_buf[16]; + if (bEncrypt) { + CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, + 16); + } else { + CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, + 16); + } + dest_buf.AppendBlock(block_buf, 16); + pContext->m_BlockOffset = 0; + } + } + if (!src_left) { + break; + } + } + return true; +} +bool CPDF_CryptoHandler::CryptFinish(void* context, + CFX_BinaryBuf& dest_buf, + bool bEncrypt) { + if (!context) { + return false; + } + if (m_Cipher == FXCIPHER_NONE) { + return true; + } + if (m_Cipher == FXCIPHER_RC4) { + FX_Free(context); + return true; + } + AESCryptContext* pContext = (AESCryptContext*)context; + if (bEncrypt) { + uint8_t block_buf[16]; + if (pContext->m_BlockOffset == 16) { + CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16); + dest_buf.AppendBlock(block_buf, 16); + pContext->m_BlockOffset = 0; + } + FXSYS_memset(pContext->m_Block + pContext->m_BlockOffset, + (uint8_t)(16 - pContext->m_BlockOffset), + 16 - pContext->m_BlockOffset); + CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16); + dest_buf.AppendBlock(block_buf, 16); + } else if (pContext->m_BlockOffset == 16) { + uint8_t block_buf[16]; + CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, 16); + if (block_buf[15] <= 16) { + dest_buf.AppendBlock(block_buf, 16 - block_buf[15]); + } + } + FX_Free(pContext); + return true; +} + +void CPDF_CryptoHandler::Decrypt(uint32_t objnum, + uint32_t gennum, + CFX_ByteString& str) { + CFX_BinaryBuf dest_buf; + void* context = DecryptStart(objnum, gennum); + DecryptStream(context, str.raw_str(), str.GetLength(), dest_buf); + DecryptFinish(context, dest_buf); + str = CFX_ByteString(dest_buf.GetBuffer(), dest_buf.GetSize()); +} + +void* CPDF_CryptoHandler::DecryptStart(uint32_t objnum, uint32_t gennum) { + return CryptStart(objnum, gennum, false); +} +uint32_t CPDF_CryptoHandler::DecryptGetSize(uint32_t src_size) { + return m_Cipher == FXCIPHER_AES ? src_size - 16 : src_size; +} + +bool CPDF_CryptoHandler::Init(CPDF_Dictionary* pEncryptDict, + CPDF_SecurityHandler* pSecurityHandler) { + const uint8_t* key; + if (!pSecurityHandler->GetCryptInfo(m_Cipher, key, m_KeyLen)) { + return false; + } + if (m_KeyLen > 32 || m_KeyLen < 0) { + return false; + } + if (m_Cipher != FXCIPHER_NONE) { + FXSYS_memcpy(m_EncryptKey, key, m_KeyLen); + } + if (m_Cipher == FXCIPHER_AES) { + m_pAESContext = FX_Alloc(uint8_t, 2048); + } + return true; +} + +bool CPDF_CryptoHandler::Init(int cipher, const uint8_t* key, int keylen) { + if (cipher == FXCIPHER_AES) { + switch (keylen) { + case 16: + case 24: + case 32: + break; + default: + return false; + } + } else if (cipher == FXCIPHER_AES2) { + if (keylen != 32) { + return false; + } + } else if (cipher == FXCIPHER_RC4) { + if (keylen < 5 || keylen > 16) { + return false; + } + } else { + if (keylen > 32) { + keylen = 32; + } + } + m_Cipher = cipher; + m_KeyLen = keylen; + FXSYS_memcpy(m_EncryptKey, key, keylen); + if (m_Cipher == FXCIPHER_AES) { + m_pAESContext = FX_Alloc(uint8_t, 2048); + } + return true; +} +bool CPDF_CryptoHandler::DecryptStream(void* context, + const uint8_t* src_buf, + uint32_t src_size, + CFX_BinaryBuf& dest_buf) { + return CryptStream(context, src_buf, src_size, dest_buf, false); +} +bool CPDF_CryptoHandler::DecryptFinish(void* context, CFX_BinaryBuf& dest_buf) { + return CryptFinish(context, dest_buf, false); +} +uint32_t CPDF_CryptoHandler::EncryptGetSize(uint32_t objnum, + uint32_t version, + const uint8_t* src_buf, + uint32_t src_size) { + if (m_Cipher == FXCIPHER_AES) { + return src_size + 32; + } + return src_size; +} +bool CPDF_CryptoHandler::EncryptContent(uint32_t objnum, + uint32_t gennum, + const uint8_t* src_buf, + uint32_t src_size, + uint8_t* dest_buf, + uint32_t& dest_size) { + CryptBlock(true, objnum, gennum, src_buf, src_size, dest_buf, dest_size); + return true; +} +CPDF_CryptoHandler::CPDF_CryptoHandler() { + m_pAESContext = nullptr; + m_Cipher = FXCIPHER_NONE; + m_KeyLen = 0; +} +CPDF_CryptoHandler::~CPDF_CryptoHandler() { + FX_Free(m_pAESContext); +} + +void CPDF_CryptoHandler::PopulateKey(uint32_t objnum, + uint32_t gennum, + uint8_t* key) { + FXSYS_memcpy(key, m_EncryptKey, m_KeyLen); + key[m_KeyLen + 0] = (uint8_t)objnum; + key[m_KeyLen + 1] = (uint8_t)(objnum >> 8); + key[m_KeyLen + 2] = (uint8_t)(objnum >> 16); + key[m_KeyLen + 3] = (uint8_t)gennum; + key[m_KeyLen + 4] = (uint8_t)(gennum >> 8); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_crypto_handler.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_crypto_handler.h new file mode 100644 index 000000000000..63a259095052 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_crypto_handler.h @@ -0,0 +1,70 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_CRYPTO_HANDLER_H_ +#define CORE_FPDFAPI_PARSER_CPDF_CRYPTO_HANDLER_H_ + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Dictionary; +class CPDF_SecurityHandler; + +class CPDF_CryptoHandler { + public: + CPDF_CryptoHandler(); + ~CPDF_CryptoHandler(); + + bool Init(CPDF_Dictionary* pEncryptDict, + CPDF_SecurityHandler* pSecurityHandler); + uint32_t DecryptGetSize(uint32_t src_size); + void* DecryptStart(uint32_t objnum, uint32_t gennum); + void Decrypt(uint32_t objnum, uint32_t gennum, CFX_ByteString& str); + bool DecryptStream(void* context, + const uint8_t* src_buf, + uint32_t src_size, + CFX_BinaryBuf& dest_buf); + bool DecryptFinish(void* context, CFX_BinaryBuf& dest_buf); + uint32_t EncryptGetSize(uint32_t objnum, + uint32_t version, + const uint8_t* src_buf, + uint32_t src_size); + bool EncryptContent(uint32_t objnum, + uint32_t version, + const uint8_t* src_buf, + uint32_t src_size, + uint8_t* dest_buf, + uint32_t& dest_size); + + bool Init(int cipher, const uint8_t* key, int keylen); + + protected: + void CryptBlock(bool bEncrypt, + uint32_t objnum, + uint32_t gennum, + const uint8_t* src_buf, + uint32_t src_size, + uint8_t* dest_buf, + uint32_t& dest_size); + void* CryptStart(uint32_t objnum, uint32_t gennum, bool bEncrypt); + bool CryptStream(void* context, + const uint8_t* src_buf, + uint32_t src_size, + CFX_BinaryBuf& dest_buf, + bool bEncrypt); + bool CryptFinish(void* context, CFX_BinaryBuf& dest_buf, bool bEncrypt); + + uint8_t m_EncryptKey[32]; + int m_KeyLen; + int m_Cipher; + uint8_t* m_pAESContext; + + private: + void PopulateKey(uint32_t objnum, uint32_t gennum, uint8_t* key); +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_CRYPTO_HANDLER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_data_avail.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_data_avail.cpp new file mode 100644 index 000000000000..64eaf2a43be2 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_data_avail.cpp @@ -0,0 +1,1689 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_data_avail.h" + +#include +#include +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_hint_tables.h" +#include "core/fpdfapi/parser/cpdf_linearized_header.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/fpdf_parser_utility.h" +#include "core/fxcrt/fx_ext.h" +#include "core/fxcrt/fx_safe_types.h" +#include "third_party/base/numerics/safe_conversions.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +CPDF_DataAvail::FileAvail::~FileAvail() {} + +CPDF_DataAvail::DownloadHints::~DownloadHints() {} + +// static +int CPDF_DataAvail::s_CurrentDataAvailRecursionDepth = 0; + +CPDF_DataAvail::CPDF_DataAvail( + FileAvail* pFileAvail, + const CFX_RetainPtr& pFileRead, + bool bSupportHintTable) + : m_pFileAvail(pFileAvail), m_pFileRead(pFileRead) { + m_Pos = 0; + m_dwFileLen = 0; + if (m_pFileRead) { + m_dwFileLen = (uint32_t)m_pFileRead->GetSize(); + } + m_dwCurrentOffset = 0; + m_dwXRefOffset = 0; + m_dwTrailerOffset = 0; + m_bufferOffset = 0; + m_bufferSize = 0; + m_PagesObjNum = 0; + m_dwCurrentXRefSteam = 0; + m_dwAcroFormObjNum = 0; + m_dwInfoObjNum = 0; + m_pDocument = 0; + m_dwEncryptObjNum = 0; + m_dwPrevXRefOffset = 0; + m_dwLastXRefOffset = 0; + m_bDocAvail = false; + m_bMainXRefLoadTried = false; + m_bDocAvail = false; + m_bPagesLoad = false; + m_bPagesTreeLoad = false; + m_bMainXRefLoadedOK = false; + m_bAnnotsLoad = false; + m_bHaveAcroForm = false; + m_bAcroFormLoad = false; + m_bPageLoadedOK = false; + m_bNeedDownLoadResource = false; + m_bLinearizedFormParamLoad = false; + m_pTrailer = nullptr; + m_pCurrentParser = nullptr; + m_pAcroForm = nullptr; + m_pPageDict = nullptr; + m_pPageResource = nullptr; + m_docStatus = PDF_DATAAVAIL_HEADER; + m_bTotalLoadPageTree = false; + m_bCurPageDictLoadOK = false; + m_bLinearedDataOK = false; + m_bSupportHintTable = bSupportHintTable; +} + +CPDF_DataAvail::~CPDF_DataAvail() { + m_pHintTables.reset(); + for (CPDF_Object* pObject : m_arrayAcroforms) + delete pObject; +} + +void CPDF_DataAvail::SetDocument(CPDF_Document* pDoc) { + m_pDocument = pDoc; +} + +uint32_t CPDF_DataAvail::GetObjectSize(uint32_t objnum, FX_FILESIZE& offset) { + CPDF_Parser* pParser = m_pDocument->GetParser(); + if (!pParser || !pParser->IsValidObjectNumber(objnum)) + return 0; + + if (pParser->GetObjectType(objnum) == 2) + objnum = pParser->GetObjectPositionOrZero(objnum); + + if (pParser->GetObjectType(objnum) != 1 && + pParser->GetObjectType(objnum) != 255) { + return 0; + } + + offset = pParser->GetObjectPositionOrZero(objnum); + if (offset == 0) + return 0; + + auto it = pParser->m_SortedOffset.find(offset); + if (it == pParser->m_SortedOffset.end() || + ++it == pParser->m_SortedOffset.end()) { + return 0; + } + return *it - offset; +} + +bool CPDF_DataAvail::AreObjectsAvailable(std::vector& obj_array, + bool bParsePage, + DownloadHints* pHints, + std::vector& ret_array) { + if (obj_array.empty()) + return true; + + uint32_t count = 0; + std::vector new_obj_array; + for (CPDF_Object* pObj : obj_array) { + if (!pObj) + continue; + + int32_t type = pObj->GetType(); + switch (type) { + case CPDF_Object::ARRAY: { + CPDF_Array* pArray = pObj->AsArray(); + for (size_t k = 0; k < pArray->GetCount(); ++k) + new_obj_array.push_back(pArray->GetObjectAt(k)); + } break; + case CPDF_Object::STREAM: + pObj = pObj->GetDict(); + case CPDF_Object::DICTIONARY: { + CPDF_Dictionary* pDict = pObj->GetDict(); + if (pDict && pDict->GetStringFor("Type") == "Page" && !bParsePage) + continue; + + for (const auto& it : *pDict) { + if (it.first != "Parent") + new_obj_array.push_back(it.second.get()); + } + } break; + case CPDF_Object::REFERENCE: { + CPDF_Reference* pRef = pObj->AsReference(); + uint32_t dwNum = pRef->GetRefObjNum(); + + FX_FILESIZE offset; + uint32_t size = GetObjectSize(dwNum, offset); + if (size == 0 || offset < 0 || offset >= m_dwFileLen) + break; + + if (!IsDataAvail(offset, size, pHints)) { + ret_array.push_back(pObj); + count++; + } else if (!pdfium::ContainsKey(m_ObjectSet, dwNum)) { + m_ObjectSet.insert(dwNum); + CPDF_Object* pReferred = + m_pDocument->GetOrParseIndirectObject(pRef->GetRefObjNum()); + if (pReferred) + new_obj_array.push_back(pReferred); + } + } break; + } + } + + if (count > 0) { + for (CPDF_Object* pObj : new_obj_array) { + CPDF_Reference* pRef = pObj->AsReference(); + if (pRef && pdfium::ContainsKey(m_ObjectSet, pRef->GetRefObjNum())) + continue; + ret_array.push_back(pObj); + } + return false; + } + + obj_array = new_obj_array; + return AreObjectsAvailable(obj_array, false, pHints, ret_array); +} + +CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::IsDocAvail( + DownloadHints* pHints) { + if (!m_dwFileLen && m_pFileRead) { + m_dwFileLen = (uint32_t)m_pFileRead->GetSize(); + if (!m_dwFileLen) + return DataError; + } + + while (!m_bDocAvail) { + if (!CheckDocStatus(pHints)) + return DataNotAvailable; + } + + return DataAvailable; +} + +bool CPDF_DataAvail::CheckAcroFormSubObject(DownloadHints* pHints) { + if (m_objs_array.empty()) { + m_ObjectSet.clear(); + std::vector obj_array = m_arrayAcroforms; + if (!AreObjectsAvailable(obj_array, false, pHints, m_objs_array)) + return false; + + m_objs_array.clear(); + return true; + } + + std::vector new_objs_array; + if (!AreObjectsAvailable(m_objs_array, false, pHints, new_objs_array)) { + m_objs_array = new_objs_array; + return false; + } + + for (CPDF_Object* pObject : m_arrayAcroforms) + delete pObject; + + m_arrayAcroforms.clear(); + return true; +} + +bool CPDF_DataAvail::CheckAcroForm(DownloadHints* pHints) { + bool bExist = false; + m_pAcroForm = GetObject(m_dwAcroFormObjNum, pHints, &bExist).release(); + if (!bExist) { + m_docStatus = PDF_DATAAVAIL_PAGETREE; + return true; + } + + if (!m_pAcroForm) { + if (m_docStatus == PDF_DATAAVAIL_ERROR) { + m_docStatus = PDF_DATAAVAIL_LOADALLFILE; + return true; + } + return false; + } + + m_arrayAcroforms.push_back(m_pAcroForm); + m_docStatus = PDF_DATAAVAIL_PAGETREE; + return true; +} + +bool CPDF_DataAvail::CheckDocStatus(DownloadHints* pHints) { + switch (m_docStatus) { + case PDF_DATAAVAIL_HEADER: + return CheckHeader(pHints); + case PDF_DATAAVAIL_FIRSTPAGE: + return CheckFirstPage(pHints); + case PDF_DATAAVAIL_HINTTABLE: + return CheckHintTables(pHints); + case PDF_DATAAVAIL_END: + return CheckEnd(pHints); + case PDF_DATAAVAIL_CROSSREF: + return CheckCrossRef(pHints); + case PDF_DATAAVAIL_CROSSREF_ITEM: + return CheckCrossRefItem(pHints); + case PDF_DATAAVAIL_CROSSREF_STREAM: + return CheckAllCrossRefStream(pHints); + case PDF_DATAAVAIL_TRAILER: + return CheckTrailer(pHints); + case PDF_DATAAVAIL_TRAILER_APPEND: + return CheckTrailerAppend(pHints); + case PDF_DATAAVAIL_LOADALLCROSSREF: + return LoadAllXref(pHints); + case PDF_DATAAVAIL_LOADALLFILE: + return LoadAllFile(pHints); + case PDF_DATAAVAIL_ROOT: + return CheckRoot(pHints); + case PDF_DATAAVAIL_INFO: + return CheckInfo(pHints); + case PDF_DATAAVAIL_ACROFORM: + return CheckAcroForm(pHints); + case PDF_DATAAVAIL_PAGETREE: + if (m_bTotalLoadPageTree) + return CheckPages(pHints); + return LoadDocPages(pHints); + case PDF_DATAAVAIL_PAGE: + if (m_bTotalLoadPageTree) + return CheckPage(pHints); + m_docStatus = PDF_DATAAVAIL_PAGE_LATERLOAD; + return true; + case PDF_DATAAVAIL_ERROR: + return LoadAllFile(pHints); + case PDF_DATAAVAIL_PAGE_LATERLOAD: + m_docStatus = PDF_DATAAVAIL_PAGE; + default: + m_bDocAvail = true; + return true; + } +} + +bool CPDF_DataAvail::CheckPageStatus(DownloadHints* pHints) { + switch (m_docStatus) { + case PDF_DATAAVAIL_PAGETREE: + return CheckPages(pHints); + case PDF_DATAAVAIL_PAGE: + return CheckPage(pHints); + case PDF_DATAAVAIL_ERROR: + return LoadAllFile(pHints); + default: + m_bPagesTreeLoad = true; + m_bPagesLoad = true; + return true; + } +} + +bool CPDF_DataAvail::LoadAllFile(DownloadHints* pHints) { + if (m_pFileAvail->IsDataAvail(0, (uint32_t)m_dwFileLen)) { + m_docStatus = PDF_DATAAVAIL_DONE; + return true; + } + + pHints->AddSegment(0, (uint32_t)m_dwFileLen); + return false; +} + +bool CPDF_DataAvail::LoadAllXref(DownloadHints* pHints) { + m_parser.m_pSyntax->InitParser(m_pFileRead, (uint32_t)m_dwHeaderOffset); + if (!m_parser.LoadAllCrossRefV4(m_dwLastXRefOffset) && + !m_parser.LoadAllCrossRefV5(m_dwLastXRefOffset)) { + m_docStatus = PDF_DATAAVAIL_LOADALLFILE; + return false; + } + + m_dwRootObjNum = m_parser.GetRootObjNum(); + m_dwInfoObjNum = m_parser.GetInfoObjNum(); + m_pCurrentParser = &m_parser; + m_docStatus = PDF_DATAAVAIL_ROOT; + return true; +} + +std::unique_ptr CPDF_DataAvail::GetObject(uint32_t objnum, + DownloadHints* pHints, + bool* pExistInFile) { + uint32_t size = 0; + FX_FILESIZE offset = 0; + CPDF_Parser* pParser = nullptr; + + if (pExistInFile) + *pExistInFile = true; + + if (m_pDocument) { + size = GetObjectSize(objnum, offset); + pParser = m_pDocument->GetParser(); + } else { + size = (uint32_t)m_parser.GetObjectSize(objnum); + offset = m_parser.GetObjectOffset(objnum); + pParser = &m_parser; + } + + if (!IsDataAvail(offset, size, pHints)) + return nullptr; + + std::unique_ptr pRet; + if (pParser) + pRet = pParser->ParseIndirectObject(nullptr, objnum); + + if (!pRet && pExistInFile) + *pExistInFile = false; + + return pRet; +} + +bool CPDF_DataAvail::CheckInfo(DownloadHints* pHints) { + bool bExist = false; + std::unique_ptr pInfo = + GetObject(m_dwInfoObjNum, pHints, &bExist); + if (bExist && !pInfo) { + if (m_docStatus == PDF_DATAAVAIL_ERROR) { + m_docStatus = PDF_DATAAVAIL_LOADALLFILE; + return true; + } + if (m_Pos == m_dwFileLen) + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + m_docStatus = + m_bHaveAcroForm ? PDF_DATAAVAIL_ACROFORM : PDF_DATAAVAIL_PAGETREE; + return true; +} + +bool CPDF_DataAvail::CheckRoot(DownloadHints* pHints) { + bool bExist = false; + m_pRoot = GetObject(m_dwRootObjNum, pHints, &bExist); + if (!bExist) { + m_docStatus = PDF_DATAAVAIL_LOADALLFILE; + return true; + } + + if (!m_pRoot) { + if (m_docStatus == PDF_DATAAVAIL_ERROR) { + m_docStatus = PDF_DATAAVAIL_LOADALLFILE; + return true; + } + return false; + } + + CPDF_Dictionary* pDict = m_pRoot->GetDict(); + if (!pDict) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + CPDF_Reference* pRef = ToReference(pDict->GetObjectFor("Pages")); + if (!pRef) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + m_PagesObjNum = pRef->GetRefObjNum(); + CPDF_Reference* pAcroFormRef = + ToReference(m_pRoot->GetDict()->GetObjectFor("AcroForm")); + if (pAcroFormRef) { + m_bHaveAcroForm = true; + m_dwAcroFormObjNum = pAcroFormRef->GetRefObjNum(); + } + + if (m_dwInfoObjNum) { + m_docStatus = PDF_DATAAVAIL_INFO; + } else { + m_docStatus = + m_bHaveAcroForm ? PDF_DATAAVAIL_ACROFORM : PDF_DATAAVAIL_PAGETREE; + } + return true; +} + +bool CPDF_DataAvail::PreparePageItem() { + CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); + CPDF_Reference* pRef = + ToReference(pRoot ? pRoot->GetObjectFor("Pages") : nullptr); + if (!pRef) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + m_PagesObjNum = pRef->GetRefObjNum(); + m_pCurrentParser = m_pDocument->GetParser(); + m_docStatus = PDF_DATAAVAIL_PAGETREE; + return true; +} + +bool CPDF_DataAvail::IsFirstCheck(uint32_t dwPage) { + return m_pageMapCheckState.insert(dwPage).second; +} + +void CPDF_DataAvail::ResetFirstCheck(uint32_t dwPage) { + m_pageMapCheckState.erase(dwPage); +} + +bool CPDF_DataAvail::CheckPage(DownloadHints* pHints) { + std::vector UnavailObjList; + for (uint32_t dwPageObjNum : m_PageObjList) { + bool bExists = false; + std::unique_ptr pObj = + GetObject(dwPageObjNum, pHints, &bExists); + if (!pObj) { + if (bExists) + UnavailObjList.push_back(dwPageObjNum); + continue; + } + CPDF_Array* pArray = ToArray(pObj.get()); + if (pArray) { + for (const auto& pArrayObj : *pArray) { + if (CPDF_Reference* pRef = ToReference(pArrayObj.get())) + UnavailObjList.push_back(pRef->GetRefObjNum()); + } + } + if (!pObj->IsDictionary()) + continue; + + CFX_ByteString type = pObj->GetDict()->GetStringFor("Type"); + if (type == "Pages") { + m_PagesArray.push_back(std::move(pObj)); + continue; + } + } + m_PageObjList.clear(); + if (!UnavailObjList.empty()) { + m_PageObjList = std::move(UnavailObjList); + return false; + } + size_t iPages = m_PagesArray.size(); + for (size_t i = 0; i < iPages; ++i) { + std::unique_ptr pPages = std::move(m_PagesArray[i]); + if (pPages && !GetPageKids(m_pCurrentParser, pPages.get())) { + m_PagesArray.clear(); + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + } + m_PagesArray.clear(); + if (m_PageObjList.empty()) + m_docStatus = PDF_DATAAVAIL_DONE; + + return true; +} + +bool CPDF_DataAvail::GetPageKids(CPDF_Parser* pParser, CPDF_Object* pPages) { + if (!pParser) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + CPDF_Dictionary* pDict = pPages->GetDict(); + CPDF_Object* pKids = pDict ? pDict->GetObjectFor("Kids") : nullptr; + if (!pKids) + return true; + + switch (pKids->GetType()) { + case CPDF_Object::REFERENCE: + m_PageObjList.push_back(pKids->AsReference()->GetRefObjNum()); + break; + case CPDF_Object::ARRAY: { + CPDF_Array* pKidsArray = pKids->AsArray(); + for (size_t i = 0; i < pKidsArray->GetCount(); ++i) { + if (CPDF_Reference* pRef = ToReference(pKidsArray->GetObjectAt(i))) + m_PageObjList.push_back(pRef->GetRefObjNum()); + } + } break; + default: + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + return true; +} + +bool CPDF_DataAvail::CheckPages(DownloadHints* pHints) { + bool bExists = false; + std::unique_ptr pPages = + GetObject(m_PagesObjNum, pHints, &bExists); + if (!bExists) { + m_docStatus = PDF_DATAAVAIL_LOADALLFILE; + return true; + } + + if (!pPages) { + if (m_docStatus == PDF_DATAAVAIL_ERROR) { + m_docStatus = PDF_DATAAVAIL_LOADALLFILE; + return true; + } + return false; + } + + if (!GetPageKids(m_pCurrentParser, pPages.get())) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + m_docStatus = PDF_DATAAVAIL_PAGE; + return true; +} + +bool CPDF_DataAvail::CheckHeader(DownloadHints* pHints) { + ASSERT(m_dwFileLen >= 0); + const uint32_t kReqSize = std::min(static_cast(m_dwFileLen), 1024U); + + if (m_pFileAvail->IsDataAvail(0, kReqSize)) { + uint8_t buffer[1024]; + m_pFileRead->ReadBlock(buffer, 0, kReqSize); + + if (IsLinearizedFile(buffer, kReqSize)) { + m_docStatus = PDF_DATAAVAIL_FIRSTPAGE; + } else { + if (m_docStatus == PDF_DATAAVAIL_ERROR) + return false; + m_docStatus = PDF_DATAAVAIL_END; + } + return true; + } + + pHints->AddSegment(0, kReqSize); + return false; +} + +bool CPDF_DataAvail::CheckFirstPage(DownloadHints* pHints) { + if (!m_pLinearized->GetFirstPageEndOffset() || + !m_pLinearized->GetFileSize() || !m_pLinearized->GetLastXRefOffset()) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + uint32_t dwEnd = m_pLinearized->GetFirstPageEndOffset(); + dwEnd += 512; + if ((FX_FILESIZE)dwEnd > m_dwFileLen) + dwEnd = (uint32_t)m_dwFileLen; + + int32_t iStartPos = (int32_t)(m_dwFileLen > 1024 ? 1024 : m_dwFileLen); + int32_t iSize = dwEnd > 1024 ? dwEnd - 1024 : 0; + if (!m_pFileAvail->IsDataAvail(iStartPos, iSize)) { + pHints->AddSegment(iStartPos, iSize); + return false; + } + + m_docStatus = + m_bSupportHintTable ? PDF_DATAAVAIL_HINTTABLE : PDF_DATAAVAIL_DONE; + return true; +} + +bool CPDF_DataAvail::IsDataAvail(FX_FILESIZE offset, + uint32_t size, + DownloadHints* pHints) { + if (offset < 0 || offset > m_dwFileLen) + return true; + + FX_SAFE_FILESIZE safeSize = offset; + safeSize += size; + safeSize += 512; + if (!safeSize.IsValid() || safeSize.ValueOrDie() > m_dwFileLen) + size = m_dwFileLen - offset; + else + size += 512; + + if (!m_pFileAvail->IsDataAvail(offset, size)) { + if (pHints) + pHints->AddSegment(offset, size); + return false; + } + return true; +} + +bool CPDF_DataAvail::CheckHintTables(DownloadHints* pHints) { + if (m_pLinearized->GetPageCount() <= 1) { + m_docStatus = PDF_DATAAVAIL_DONE; + return true; + } + if (!m_pLinearized->HasHintTable()) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + FX_FILESIZE szHintStart = m_pLinearized->GetHintStart(); + FX_FILESIZE szHintLength = m_pLinearized->GetHintLength(); + + if (!IsDataAvail(szHintStart, szHintLength, pHints)) + return false; + + m_syntaxParser.InitParser(m_pFileRead, m_dwHeaderOffset); + + std::unique_ptr pHintTables( + new CPDF_HintTables(this, m_pLinearized.get())); + std::unique_ptr pHintStream( + ParseIndirectObjectAt(szHintStart, 0)); + CPDF_Stream* pStream = ToStream(pHintStream.get()); + if (pStream && pHintTables->LoadHintStream(pStream)) + m_pHintTables = std::move(pHintTables); + + m_docStatus = PDF_DATAAVAIL_DONE; + return true; +} + +std::unique_ptr CPDF_DataAvail::ParseIndirectObjectAt( + FX_FILESIZE pos, + uint32_t objnum, + CPDF_IndirectObjectHolder* pObjList) { + FX_FILESIZE SavedPos = m_syntaxParser.SavePos(); + m_syntaxParser.RestorePos(pos); + + bool bIsNumber; + CFX_ByteString word = m_syntaxParser.GetNextWord(&bIsNumber); + if (!bIsNumber) + return nullptr; + + uint32_t parser_objnum = FXSYS_atoui(word.c_str()); + if (objnum && parser_objnum != objnum) + return nullptr; + + word = m_syntaxParser.GetNextWord(&bIsNumber); + if (!bIsNumber) + return nullptr; + + uint32_t gennum = FXSYS_atoui(word.c_str()); + if (m_syntaxParser.GetKeyword() != "obj") { + m_syntaxParser.RestorePos(SavedPos); + return nullptr; + } + + std::unique_ptr pObj = + m_syntaxParser.GetObject(pObjList, parser_objnum, gennum, true); + m_syntaxParser.RestorePos(SavedPos); + return pObj; +} + +CPDF_DataAvail::DocLinearizationStatus CPDF_DataAvail::IsLinearizedPDF() { + const uint32_t kReqSize = 1024; + if (!m_pFileAvail->IsDataAvail(0, kReqSize)) + return LinearizationUnknown; + + if (!m_pFileRead) + return NotLinearized; + + FX_FILESIZE dwSize = m_pFileRead->GetSize(); + if (dwSize < (FX_FILESIZE)kReqSize) + return LinearizationUnknown; + + uint8_t buffer[1024]; + m_pFileRead->ReadBlock(buffer, 0, kReqSize); + if (IsLinearizedFile(buffer, kReqSize)) + return Linearized; + + return NotLinearized; +} + +bool CPDF_DataAvail::IsLinearized() { + return !!m_pLinearized; +} + +bool CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, uint32_t dwLen) { + if (m_pLinearized) + return true; + + CFX_RetainPtr file = + IFX_MemoryStream::Create(pData, (size_t)dwLen, false); + int32_t offset = GetHeaderOffset(file); + if (offset == -1) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + m_dwHeaderOffset = offset; + m_syntaxParser.InitParser(file, offset); + m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9); + + bool bNumber; + CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(&bNumber); + if (!bNumber) + return false; + + uint32_t objnum = FXSYS_atoui(wordObjNum.c_str()); + m_pLinearized = CPDF_LinearizedHeader::CreateForObject( + ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum)); + if (!m_pLinearized || + m_pLinearized->GetFileSize() != m_pFileRead->GetSize()) { + m_pLinearized.reset(); + return false; + } + return true; +} + +bool CPDF_DataAvail::CheckEnd(DownloadHints* pHints) { + uint32_t req_pos = (uint32_t)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0); + uint32_t dwSize = (uint32_t)(m_dwFileLen - req_pos); + + if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) { + uint8_t buffer[1024]; + m_pFileRead->ReadBlock(buffer, req_pos, dwSize); + + CFX_RetainPtr file = + IFX_MemoryStream::Create(buffer, (size_t)dwSize, false); + m_syntaxParser.InitParser(file, 0); + m_syntaxParser.RestorePos(dwSize - 1); + + if (m_syntaxParser.SearchWord("startxref", true, false, dwSize)) { + m_syntaxParser.GetNextWord(nullptr); + + bool bNumber; + CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(&bNumber); + if (!bNumber) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + m_dwXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str.c_str()); + if (!m_dwXRefOffset || m_dwXRefOffset > m_dwFileLen) { + m_docStatus = PDF_DATAAVAIL_LOADALLFILE; + return true; + } + + m_dwLastXRefOffset = m_dwXRefOffset; + SetStartOffset(m_dwXRefOffset); + m_docStatus = PDF_DATAAVAIL_CROSSREF; + return true; + } + + m_docStatus = PDF_DATAAVAIL_LOADALLFILE; + return true; + } + + pHints->AddSegment(req_pos, dwSize); + return false; +} + +int32_t CPDF_DataAvail::CheckCrossRefStream(DownloadHints* pHints, + FX_FILESIZE& xref_offset) { + xref_offset = 0; + uint32_t req_size = + (uint32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); + + if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) { + int32_t iSize = (int32_t)(m_Pos + req_size - m_dwCurrentXRefSteam); + CFX_BinaryBuf buf(iSize); + uint8_t* pBuf = buf.GetBuffer(); + + m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize); + + CFX_RetainPtr file = + IFX_MemoryStream::Create(pBuf, (size_t)iSize, false); + m_parser.m_pSyntax->InitParser(file, 0); + + bool bNumber; + CFX_ByteString objnum = m_parser.m_pSyntax->GetNextWord(&bNumber); + if (!bNumber) + return -1; + + uint32_t objNum = FXSYS_atoui(objnum.c_str()); + std::unique_ptr pObj = + m_parser.ParseIndirectObjectAt(nullptr, 0, objNum); + + if (!pObj) { + m_Pos += m_parser.m_pSyntax->SavePos(); + return 0; + } + + CPDF_Dictionary* pDict = pObj->GetDict(); + CPDF_Name* pName = ToName(pDict ? pDict->GetObjectFor("Type") : nullptr); + if (pName && pName->GetString() == "XRef") { + m_Pos += m_parser.m_pSyntax->SavePos(); + xref_offset = pObj->GetDict()->GetIntegerFor("Prev"); + return 1; + } + return -1; + } + pHints->AddSegment(m_Pos, req_size); + return 0; +} + +void CPDF_DataAvail::SetStartOffset(FX_FILESIZE dwOffset) { + m_Pos = dwOffset; +} + +bool CPDF_DataAvail::GetNextToken(CFX_ByteString& token) { + uint8_t ch; + if (!GetNextChar(ch)) + return false; + + while (1) { + while (PDFCharIsWhitespace(ch)) { + if (!GetNextChar(ch)) + return false; + } + + if (ch != '%') + break; + + while (1) { + if (!GetNextChar(ch)) + return false; + if (PDFCharIsLineEnding(ch)) + break; + } + } + + uint8_t buffer[256]; + uint32_t index = 0; + if (PDFCharIsDelimiter(ch)) { + buffer[index++] = ch; + if (ch == '/') { + while (1) { + if (!GetNextChar(ch)) + return false; + + if (!PDFCharIsOther(ch) && !PDFCharIsNumeric(ch)) { + m_Pos--; + CFX_ByteString ret(buffer, index); + token = ret; + return true; + } + + if (index < sizeof(buffer)) + buffer[index++] = ch; + } + } else if (ch == '<') { + if (!GetNextChar(ch)) + return false; + + if (ch == '<') + buffer[index++] = ch; + else + m_Pos--; + } else if (ch == '>') { + if (!GetNextChar(ch)) + return false; + + if (ch == '>') + buffer[index++] = ch; + else + m_Pos--; + } + + CFX_ByteString ret(buffer, index); + token = ret; + return true; + } + + while (1) { + if (index < sizeof(buffer)) + buffer[index++] = ch; + + if (!GetNextChar(ch)) + return false; + + if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) { + m_Pos--; + break; + } + } + + token = CFX_ByteString(buffer, index); + return true; +} + +bool CPDF_DataAvail::GetNextChar(uint8_t& ch) { + FX_FILESIZE pos = m_Pos; + if (pos >= m_dwFileLen) + return false; + + if (m_bufferOffset >= pos || + (FX_FILESIZE)(m_bufferOffset + m_bufferSize) <= pos) { + FX_FILESIZE read_pos = pos; + uint32_t read_size = 512; + if ((FX_FILESIZE)read_size > m_dwFileLen) + read_size = (uint32_t)m_dwFileLen; + + if ((FX_FILESIZE)(read_pos + read_size) > m_dwFileLen) + read_pos = m_dwFileLen - read_size; + + if (!m_pFileRead->ReadBlock(m_bufferData, read_pos, read_size)) + return false; + + m_bufferOffset = read_pos; + m_bufferSize = read_size; + } + ch = m_bufferData[pos - m_bufferOffset]; + m_Pos++; + return true; +} + +bool CPDF_DataAvail::CheckCrossRefItem(DownloadHints* pHints) { + int32_t iSize = 0; + CFX_ByteString token; + while (1) { + if (!GetNextToken(token)) { + iSize = (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); + pHints->AddSegment(m_Pos, iSize); + return false; + } + + if (token == "trailer") { + m_dwTrailerOffset = m_Pos; + m_docStatus = PDF_DATAAVAIL_TRAILER; + return true; + } + } +} + +bool CPDF_DataAvail::CheckAllCrossRefStream(DownloadHints* pHints) { + FX_FILESIZE xref_offset = 0; + + int32_t nRet = CheckCrossRefStream(pHints, xref_offset); + if (nRet == 1) { + if (!xref_offset) { + m_docStatus = PDF_DATAAVAIL_LOADALLCROSSREF; + } else { + m_dwCurrentXRefSteam = xref_offset; + m_Pos = xref_offset; + } + return true; + } + + if (nRet == -1) + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; +} + +bool CPDF_DataAvail::CheckCrossRef(DownloadHints* pHints) { + int32_t iSize = 0; + CFX_ByteString token; + if (!GetNextToken(token)) { + iSize = (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); + pHints->AddSegment(m_Pos, iSize); + return false; + } + + if (token == "xref") { + while (1) { + if (!GetNextToken(token)) { + iSize = + (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); + pHints->AddSegment(m_Pos, iSize); + m_docStatus = PDF_DATAAVAIL_CROSSREF_ITEM; + return false; + } + + if (token == "trailer") { + m_dwTrailerOffset = m_Pos; + m_docStatus = PDF_DATAAVAIL_TRAILER; + return true; + } + } + } else { + m_docStatus = PDF_DATAAVAIL_LOADALLFILE; + return true; + } + return false; +} + +bool CPDF_DataAvail::CheckTrailerAppend(DownloadHints* pHints) { + if (m_Pos < m_dwFileLen) { + FX_FILESIZE dwAppendPos = m_Pos + m_syntaxParser.SavePos(); + int32_t iSize = (int32_t)( + dwAppendPos + 512 > m_dwFileLen ? m_dwFileLen - dwAppendPos : 512); + + if (!m_pFileAvail->IsDataAvail(dwAppendPos, iSize)) { + pHints->AddSegment(dwAppendPos, iSize); + return false; + } + } + + if (m_dwPrevXRefOffset) { + SetStartOffset(m_dwPrevXRefOffset); + m_docStatus = PDF_DATAAVAIL_CROSSREF; + } else { + m_docStatus = PDF_DATAAVAIL_LOADALLCROSSREF; + } + return true; +} + +bool CPDF_DataAvail::CheckTrailer(DownloadHints* pHints) { + int32_t iTrailerSize = + (int32_t)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); + if (m_pFileAvail->IsDataAvail(m_Pos, iTrailerSize)) { + int32_t iSize = (int32_t)(m_Pos + iTrailerSize - m_dwTrailerOffset); + CFX_BinaryBuf buf(iSize); + uint8_t* pBuf = buf.GetBuffer(); + if (!pBuf) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + if (!m_pFileRead->ReadBlock(pBuf, m_dwTrailerOffset, iSize)) + return false; + + CFX_RetainPtr file = + IFX_MemoryStream::Create(pBuf, (size_t)iSize, false); + m_syntaxParser.InitParser(file, 0); + + std::unique_ptr pTrailer( + m_syntaxParser.GetObject(nullptr, 0, 0, true)); + if (!pTrailer) { + m_Pos += m_syntaxParser.SavePos(); + pHints->AddSegment(m_Pos, iTrailerSize); + return false; + } + + if (!pTrailer->IsDictionary()) + return false; + + CPDF_Dictionary* pTrailerDict = pTrailer->GetDict(); + CPDF_Object* pEncrypt = pTrailerDict->GetObjectFor("Encrypt"); + if (ToReference(pEncrypt)) { + m_docStatus = PDF_DATAAVAIL_LOADALLFILE; + return true; + } + + uint32_t xrefpos = GetDirectInteger(pTrailerDict, "Prev"); + if (xrefpos) { + m_dwPrevXRefOffset = GetDirectInteger(pTrailerDict, "XRefStm"); + if (m_dwPrevXRefOffset) { + m_docStatus = PDF_DATAAVAIL_LOADALLFILE; + } else { + m_dwPrevXRefOffset = xrefpos; + if (m_dwPrevXRefOffset >= m_dwFileLen) { + m_docStatus = PDF_DATAAVAIL_LOADALLFILE; + } else { + SetStartOffset(m_dwPrevXRefOffset); + m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND; + } + } + return true; + } + m_dwPrevXRefOffset = 0; + m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND; + return true; + } + pHints->AddSegment(m_Pos, iTrailerSize); + return false; +} + +bool CPDF_DataAvail::CheckPage(uint32_t dwPage, DownloadHints* pHints) { + while (true) { + switch (m_docStatus) { + case PDF_DATAAVAIL_PAGETREE: + if (!LoadDocPages(pHints)) + return false; + break; + case PDF_DATAAVAIL_PAGE: + if (!LoadDocPage(dwPage, pHints)) + return false; + break; + case PDF_DATAAVAIL_ERROR: + return LoadAllFile(pHints); + default: + m_bPagesTreeLoad = true; + m_bPagesLoad = true; + m_bCurPageDictLoadOK = true; + m_docStatus = PDF_DATAAVAIL_PAGE; + return true; + } + } +} + +bool CPDF_DataAvail::CheckArrayPageNode(uint32_t dwPageNo, + PageNode* pPageNode, + DownloadHints* pHints) { + bool bExists = false; + std::unique_ptr pPages = GetObject(dwPageNo, pHints, &bExists); + if (!bExists) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + if (!pPages) + return false; + + CPDF_Array* pArray = pPages->AsArray(); + if (!pArray) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + pPageNode->m_type = PDF_PAGENODE_PAGES; + for (size_t i = 0; i < pArray->GetCount(); ++i) { + CPDF_Reference* pKid = ToReference(pArray->GetObjectAt(i)); + if (!pKid) + continue; + + auto pNode = pdfium::MakeUnique(); + pNode->m_dwPageNo = pKid->GetRefObjNum(); + pPageNode->m_ChildNodes.push_back(std::move(pNode)); + } + return true; +} + +bool CPDF_DataAvail::CheckUnknownPageNode(uint32_t dwPageNo, + PageNode* pPageNode, + DownloadHints* pHints) { + bool bExists = false; + std::unique_ptr pPage = GetObject(dwPageNo, pHints, &bExists); + if (!bExists) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + if (!pPage) + return false; + + if (pPage->IsArray()) { + pPageNode->m_dwPageNo = dwPageNo; + pPageNode->m_type = PDF_PAGENODE_ARRAY; + return true; + } + + if (!pPage->IsDictionary()) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + + pPageNode->m_dwPageNo = dwPageNo; + CPDF_Dictionary* pDict = pPage->GetDict(); + CFX_ByteString type = pDict->GetStringFor("Type"); + if (type == "Pages") { + pPageNode->m_type = PDF_PAGENODE_PAGES; + CPDF_Object* pKids = pDict->GetObjectFor("Kids"); + if (!pKids) { + m_docStatus = PDF_DATAAVAIL_PAGE; + return true; + } + + switch (pKids->GetType()) { + case CPDF_Object::REFERENCE: { + CPDF_Reference* pKid = pKids->AsReference(); + auto pNode = pdfium::MakeUnique(); + pNode->m_dwPageNo = pKid->GetRefObjNum(); + pPageNode->m_ChildNodes.push_back(std::move(pNode)); + } break; + case CPDF_Object::ARRAY: { + CPDF_Array* pKidsArray = pKids->AsArray(); + for (size_t i = 0; i < pKidsArray->GetCount(); ++i) { + CPDF_Reference* pKid = ToReference(pKidsArray->GetObjectAt(i)); + if (!pKid) + continue; + + auto pNode = pdfium::MakeUnique(); + pNode->m_dwPageNo = pKid->GetRefObjNum(); + pPageNode->m_ChildNodes.push_back(std::move(pNode)); + } + } break; + default: + break; + } + } else if (type == "Page") { + pPageNode->m_type = PDF_PAGENODE_PAGE; + } else { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + return true; +} + +bool CPDF_DataAvail::CheckPageNode(const CPDF_DataAvail::PageNode& pageNode, + int32_t iPage, + int32_t& iCount, + DownloadHints* pHints, + int level) { + if (level >= kMaxPageRecursionDepth) + return false; + + int32_t iSize = pdfium::CollectionSize(pageNode.m_ChildNodes); + if (iSize <= 0 || iPage >= iSize) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + for (int32_t i = 0; i < iSize; ++i) { + PageNode* pNode = pageNode.m_ChildNodes[i].get(); + if (!pNode) + continue; + + if (pNode->m_type == PDF_PAGENODE_UNKNOWN) { + // Updates the type for the unknown page node. + if (!CheckUnknownPageNode(pNode->m_dwPageNo, pNode, pHints)) + return false; + } + if (pNode->m_type == PDF_PAGENODE_ARRAY) { + // Updates a more specific type for the array page node. + if (!CheckArrayPageNode(pNode->m_dwPageNo, pNode, pHints)) + return false; + } + switch (pNode->m_type) { + case PDF_PAGENODE_PAGE: + iCount++; + if (iPage == iCount && m_pDocument) + m_pDocument->SetPageObjNum(iPage, pNode->m_dwPageNo); + break; + case PDF_PAGENODE_PAGES: + if (!CheckPageNode(*pNode, iPage, iCount, pHints, level + 1)) + return false; + break; + case PDF_PAGENODE_UNKNOWN: + case PDF_PAGENODE_ARRAY: + // Already converted above, error if we get here. + return false; + } + if (iPage == iCount) { + m_docStatus = PDF_DATAAVAIL_DONE; + return true; + } + } + return true; +} + +bool CPDF_DataAvail::LoadDocPage(uint32_t dwPage, DownloadHints* pHints) { + FX_SAFE_INT32 safePage = pdfium::base::checked_cast(dwPage); + int32_t iPage = safePage.ValueOrDie(); + if (m_pDocument->GetPageCount() <= iPage || + m_pDocument->IsPageLoaded(iPage)) { + m_docStatus = PDF_DATAAVAIL_DONE; + return true; + } + if (m_PageNode.m_type == PDF_PAGENODE_PAGE) { + m_docStatus = iPage == 0 ? PDF_DATAAVAIL_DONE : PDF_DATAAVAIL_ERROR; + return true; + } + int32_t iCount = -1; + return CheckPageNode(m_PageNode, iPage, iCount, pHints, 0); +} + +bool CPDF_DataAvail::CheckPageCount(DownloadHints* pHints) { + bool bExists = false; + std::unique_ptr pPages = + GetObject(m_PagesObjNum, pHints, &bExists); + if (!bExists) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + if (!pPages) + return false; + + CPDF_Dictionary* pPagesDict = pPages->GetDict(); + if (!pPagesDict) { + m_docStatus = PDF_DATAAVAIL_ERROR; + return false; + } + if (!pPagesDict->KeyExist("Kids")) + return true; + + return pPagesDict->GetIntegerFor("Count") > 0; +} + +bool CPDF_DataAvail::LoadDocPages(DownloadHints* pHints) { + if (!CheckUnknownPageNode(m_PagesObjNum, &m_PageNode, pHints)) + return false; + + if (CheckPageCount(pHints)) { + m_docStatus = PDF_DATAAVAIL_PAGE; + return true; + } + + m_bTotalLoadPageTree = true; + return false; +} + +bool CPDF_DataAvail::LoadPages(DownloadHints* pHints) { + while (!m_bPagesTreeLoad) { + if (!CheckPageStatus(pHints)) + return false; + } + + if (m_bPagesLoad) + return true; + + m_pDocument->LoadPages(); + return false; +} + +CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::CheckLinearizedData( + DownloadHints* pHints) { + if (m_bLinearedDataOK) + return DataAvailable; + ASSERT(m_pLinearized); + if (!m_pLinearized->GetLastXRefOffset()) + return DataError; + + if (!m_bMainXRefLoadTried) { + FX_SAFE_UINT32 data_size = m_dwFileLen; + data_size -= m_pLinearized->GetLastXRefOffset(); + if (!data_size.IsValid()) + return DataError; + + if (!m_pFileAvail->IsDataAvail(m_pLinearized->GetLastXRefOffset(), + data_size.ValueOrDie())) { + pHints->AddSegment(m_pLinearized->GetLastXRefOffset(), + data_size.ValueOrDie()); + return DataNotAvailable; + } + + CPDF_Parser::Error eRet = + m_pDocument->GetParser()->LoadLinearizedMainXRefTable(); + m_bMainXRefLoadTried = true; + if (eRet != CPDF_Parser::SUCCESS) + return DataError; + + if (!PreparePageItem()) + return DataNotAvailable; + + m_bMainXRefLoadedOK = true; + m_bLinearedDataOK = true; + } + + return m_bLinearedDataOK ? DataAvailable : DataNotAvailable; +} + +bool CPDF_DataAvail::CheckPageAnnots(uint32_t dwPage, DownloadHints* pHints) { + if (m_objs_array.empty()) { + m_ObjectSet.clear(); + + FX_SAFE_INT32 safePage = pdfium::base::checked_cast(dwPage); + CPDF_Dictionary* pPageDict = m_pDocument->GetPage(safePage.ValueOrDie()); + if (!pPageDict) + return true; + + CPDF_Object* pAnnots = pPageDict->GetObjectFor("Annots"); + if (!pAnnots) + return true; + + std::vector obj_array; + obj_array.push_back(pAnnots); + if (!AreObjectsAvailable(obj_array, false, pHints, m_objs_array)) + return false; + + m_objs_array.clear(); + return true; + } + + std::vector new_objs_array; + if (!AreObjectsAvailable(m_objs_array, false, pHints, new_objs_array)) { + m_objs_array = new_objs_array; + return false; + } + m_objs_array.clear(); + return true; +} + +CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::CheckLinearizedFirstPage( + uint32_t dwPage, + DownloadHints* pHints) { + if (!m_bAnnotsLoad) { + if (!CheckPageAnnots(dwPage, pHints)) + return DataNotAvailable; + m_bAnnotsLoad = true; + } + const bool is_page_valid = ValidatePage(dwPage); + (void)is_page_valid; + ASSERT(is_page_valid); + return DataAvailable; +} + +bool CPDF_DataAvail::HaveResourceAncestor(CPDF_Dictionary* pDict) { + CFX_AutoRestorer restorer(&s_CurrentDataAvailRecursionDepth); + if (++s_CurrentDataAvailRecursionDepth > kMaxDataAvailRecursionDepth) + return false; + + CPDF_Object* pParent = pDict->GetObjectFor("Parent"); + if (!pParent) + return false; + + CPDF_Dictionary* pParentDict = pParent->GetDict(); + if (!pParentDict) + return false; + + CPDF_Object* pRet = pParentDict->GetObjectFor("Resources"); + if (pRet) { + m_pPageResource = pRet; + return true; + } + + return HaveResourceAncestor(pParentDict); +} + +CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::IsPageAvail( + uint32_t dwPage, + DownloadHints* pHints) { + if (!m_pDocument) + return DataError; + + if (IsFirstCheck(dwPage)) { + m_bCurPageDictLoadOK = false; + m_bPageLoadedOK = false; + m_bAnnotsLoad = false; + m_bNeedDownLoadResource = false; + m_objs_array.clear(); + m_ObjectSet.clear(); + } + + if (pdfium::ContainsKey(m_pagesLoadState, dwPage)) + return DataAvailable; + + if (m_pLinearized) { + if (dwPage == m_pLinearized->GetFirstPageNo()) { + DocAvailStatus nRet = CheckLinearizedFirstPage(dwPage, pHints); + if (nRet == DataAvailable) + m_pagesLoadState.insert(dwPage); + return nRet; + } + + DocAvailStatus nResult = CheckLinearizedData(pHints); + if (nResult != DataAvailable) + return nResult; + + if (m_pHintTables) { + nResult = m_pHintTables->CheckPage(dwPage, pHints); + if (nResult != DataAvailable) + return nResult; + m_pagesLoadState.insert(dwPage); + return GetPage(dwPage) ? DataAvailable : DataError; + } + + if (m_bMainXRefLoadedOK) { + if (m_bTotalLoadPageTree) { + if (!LoadPages(pHints)) + return DataNotAvailable; + } else { + if (!m_bCurPageDictLoadOK && !CheckPage(dwPage, pHints)) + return DataNotAvailable; + } + } else { + if (!LoadAllFile(pHints)) + return DataNotAvailable; + m_pDocument->GetParser()->RebuildCrossRef(); + ResetFirstCheck(dwPage); + return DataAvailable; + } + } else { + if (!m_bTotalLoadPageTree && !m_bCurPageDictLoadOK && + !CheckPage(dwPage, pHints)) { + return DataNotAvailable; + } + } + + if (m_bHaveAcroForm && !m_bAcroFormLoad) { + if (!CheckAcroFormSubObject(pHints)) + return DataNotAvailable; + m_bAcroFormLoad = true; + } + + if (!m_bPageLoadedOK) { + if (m_objs_array.empty()) { + m_ObjectSet.clear(); + + FX_SAFE_INT32 safePage = pdfium::base::checked_cast(dwPage); + m_pPageDict = m_pDocument->GetPage(safePage.ValueOrDie()); + if (!m_pPageDict) { + ResetFirstCheck(dwPage); + // This is XFA page. + return DataAvailable; + } + + std::vector obj_array; + obj_array.push_back(m_pPageDict); + if (!AreObjectsAvailable(obj_array, true, pHints, m_objs_array)) + return DataNotAvailable; + + m_objs_array.clear(); + } else { + std::vector new_objs_array; + if (!AreObjectsAvailable(m_objs_array, false, pHints, new_objs_array)) { + m_objs_array = new_objs_array; + return DataNotAvailable; + } + } + m_objs_array.clear(); + m_bPageLoadedOK = true; + } + + if (!m_bAnnotsLoad) { + if (!CheckPageAnnots(dwPage, pHints)) + return DataNotAvailable; + m_bAnnotsLoad = true; + } + + if (m_pPageDict && !m_bNeedDownLoadResource) { + m_pPageResource = m_pPageDict->GetObjectFor("Resources"); + m_bNeedDownLoadResource = + m_pPageResource || HaveResourceAncestor(m_pPageDict); + } + + if (m_bNeedDownLoadResource) { + if (!CheckResources(pHints)) + return DataNotAvailable; + m_bNeedDownLoadResource = false; + } + + m_bPageLoadedOK = false; + m_bAnnotsLoad = false; + m_bCurPageDictLoadOK = false; + + ResetFirstCheck(dwPage); + m_pagesLoadState.insert(dwPage); + const bool is_page_valid = ValidatePage(dwPage); + (void)is_page_valid; + ASSERT(is_page_valid); + return DataAvailable; +} + +bool CPDF_DataAvail::CheckResources(DownloadHints* pHints) { + if (m_objs_array.empty()) { + std::vector obj_array; + obj_array.push_back(m_pPageResource); + if (!AreObjectsAvailable(obj_array, true, pHints, m_objs_array)) + return false; + + m_objs_array.clear(); + return true; + } + std::vector new_objs_array; + if (!AreObjectsAvailable(m_objs_array, false, pHints, new_objs_array)) { + m_objs_array = new_objs_array; + return false; + } + m_objs_array.clear(); + return true; +} + +void CPDF_DataAvail::GetLinearizedMainXRefInfo(FX_FILESIZE* pPos, + uint32_t* pSize) { + if (pPos) + *pPos = m_dwLastXRefOffset; + if (pSize) + *pSize = (uint32_t)(m_dwFileLen - m_dwLastXRefOffset); +} + +int CPDF_DataAvail::GetPageCount() const { + if (m_pLinearized) + return m_pLinearized->GetPageCount(); + return m_pDocument ? m_pDocument->GetPageCount() : 0; +} + +CPDF_Dictionary* CPDF_DataAvail::GetPage(int index) { + if (!m_pDocument || index < 0 || index >= GetPageCount()) + return nullptr; + CPDF_Dictionary* page = m_pDocument->GetPage(index); + if (page) + return page; + if (!m_pLinearized || !m_pHintTables) + return nullptr; + + if (index == static_cast(m_pLinearized->GetFirstPageNo())) + return nullptr; + FX_FILESIZE szPageStartPos = 0; + FX_FILESIZE szPageLength = 0; + uint32_t dwObjNum = 0; + const bool bPagePosGot = m_pHintTables->GetPagePos(index, &szPageStartPos, + &szPageLength, &dwObjNum); + if (!bPagePosGot || !dwObjNum) + return nullptr; + // We should say to the document, which object is the page. + m_pDocument->SetPageObjNum(index, dwObjNum); + // Page object already can be parsed in document. + if (!m_pDocument->GetIndirectObject(dwObjNum)) { + m_syntaxParser.InitParser( + m_pFileRead, pdfium::base::checked_cast(szPageStartPos)); + m_pDocument->ReplaceIndirectObjectIfHigherGeneration( + dwObjNum, ParseIndirectObjectAt(0, dwObjNum, m_pDocument)); + } + const bool is_page_valid = ValidatePage(index); + (void)is_page_valid; + ASSERT(is_page_valid); + return m_pDocument->GetPage(index); +} + +CPDF_DataAvail::DocFormStatus CPDF_DataAvail::IsFormAvail( + DownloadHints* pHints) { + if (!m_pDocument) + return FormAvailable; + if (m_pLinearized) { + DocAvailStatus nDocStatus = CheckLinearizedData(pHints); + if (nDocStatus == DataError) + return FormError; + if (nDocStatus == DataNotAvailable) + return FormNotAvailable; + } + + if (!m_bLinearizedFormParamLoad) { + CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); + if (!pRoot) + return FormAvailable; + + CPDF_Object* pAcroForm = pRoot->GetObjectFor("AcroForm"); + if (!pAcroForm) + return FormNotExist; + + m_objs_array.push_back(pAcroForm->GetDict()); + m_bLinearizedFormParamLoad = true; + } + + std::vector new_objs_array; + if (!AreObjectsAvailable(m_objs_array, false, pHints, new_objs_array)) { + m_objs_array = new_objs_array; + return FormNotAvailable; + } + + m_objs_array.clear(); + const bool is_form_valid = ValidateForm(); + (void)is_form_valid; + ASSERT(is_form_valid); + return FormAvailable; +} + +bool CPDF_DataAvail::ValidatePage(uint32_t dwPage) { + FX_SAFE_INT32 safePage = pdfium::base::checked_cast(dwPage); + CPDF_Dictionary* pPageDict = m_pDocument->GetPage(safePage.ValueOrDie()); + if (!pPageDict) + return false; + std::vector obj_array; + obj_array.push_back(pPageDict); + std::vector dummy; + return AreObjectsAvailable(obj_array, true, nullptr, dummy); +} + +bool CPDF_DataAvail::ValidateForm() { + CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); + if (!pRoot) + return true; + CPDF_Object* pAcroForm = pRoot->GetObjectFor("AcroForm"); + if (!pAcroForm) + return false; + std::vector obj_array; + obj_array.push_back(pAcroForm); + std::vector dummy; + return AreObjectsAvailable(obj_array, true, nullptr, dummy); +} + +CPDF_DataAvail::PageNode::PageNode() : m_type(PDF_PAGENODE_UNKNOWN) {} + +CPDF_DataAvail::PageNode::~PageNode() {} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_data_avail.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_data_avail.h new file mode 100644 index 000000000000..65638cff0b29 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_data_avail.h @@ -0,0 +1,257 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_DATA_AVAIL_H_ +#define CORE_FPDFAPI_PARSER_CPDF_DATA_AVAIL_H_ + +#include +#include +#include + +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_syntax_parser.h" +#include "core/fxcrt/fx_basic.h" + +class CPDF_Dictionary; +class CPDF_HintTables; +class CPDF_IndirectObjectHolder; +class CPDF_LinearizedHeader; +class CPDF_Parser; + +enum PDF_DATAAVAIL_STATUS { + PDF_DATAAVAIL_HEADER = 0, + PDF_DATAAVAIL_FIRSTPAGE, + PDF_DATAAVAIL_HINTTABLE, + PDF_DATAAVAIL_END, + PDF_DATAAVAIL_CROSSREF, + PDF_DATAAVAIL_CROSSREF_ITEM, + PDF_DATAAVAIL_CROSSREF_STREAM, + PDF_DATAAVAIL_TRAILER, + PDF_DATAAVAIL_LOADALLCROSSREF, + PDF_DATAAVAIL_ROOT, + PDF_DATAAVAIL_INFO, + PDF_DATAAVAIL_ACROFORM, + PDF_DATAAVAIL_ACROFORM_SUBOBJECT, + PDF_DATAAVAIL_PAGETREE, + PDF_DATAAVAIL_PAGE, + PDF_DATAAVAIL_PAGE_LATERLOAD, + PDF_DATAAVAIL_RESOURCES, + PDF_DATAAVAIL_DONE, + PDF_DATAAVAIL_ERROR, + PDF_DATAAVAIL_LOADALLFILE, + PDF_DATAAVAIL_TRAILER_APPEND +}; + +enum PDF_PAGENODE_TYPE { + PDF_PAGENODE_UNKNOWN = 0, + PDF_PAGENODE_PAGE, + PDF_PAGENODE_PAGES, + PDF_PAGENODE_ARRAY, +}; + +class CPDF_DataAvail final { + public: + // Must match PDF_DATA_* definitions in public/fpdf_dataavail.h, but cannot + // #include that header. fpdfsdk/fpdf_dataavail.cpp has static_asserts + // to make sure the two sets of values match. + enum DocAvailStatus { + DataError = -1, // PDF_DATA_ERROR + DataNotAvailable = 0, // PDF_DATA_NOTAVAIL + DataAvailable = 1, // PDF_DATA_AVAIL + }; + + // Must match PDF_*LINEAR* definitions in public/fpdf_dataavail.h, but cannot + // #include that header. fpdfsdk/fpdf_dataavail.cpp has static_asserts + // to make sure the two sets of values match. + enum DocLinearizationStatus { + LinearizationUnknown = -1, // PDF_LINEARIZATION_UNKNOWN + NotLinearized = 0, // PDF_NOT_LINEARIZED + Linearized = 1, // PDF_LINEARIZED + }; + + // Must match PDF_FORM_* definitions in public/fpdf_dataavail.h, but cannot + // #include that header. fpdfsdk/fpdf_dataavail.cpp has static_asserts + // to make sure the two sets of values match. + enum DocFormStatus { + FormError = -1, // PDF_FORM_ERROR + FormNotAvailable = 0, // PDF_FORM_NOTAVAIL + FormAvailable = 1, // PDF_FORM_AVAIL + FormNotExist = 2, // PDF_FORM_NOTEXIST + }; + + class FileAvail { + public: + virtual ~FileAvail(); + virtual bool IsDataAvail(FX_FILESIZE offset, uint32_t size) = 0; + }; + + class DownloadHints { + public: + virtual ~DownloadHints(); + virtual void AddSegment(FX_FILESIZE offset, uint32_t size) = 0; + }; + + CPDF_DataAvail(FileAvail* pFileAvail, + const CFX_RetainPtr& pFileRead, + bool bSupportHintTable); + ~CPDF_DataAvail(); + + bool IsDataAvail(FX_FILESIZE offset, uint32_t size, DownloadHints* pHints); + DocAvailStatus IsDocAvail(DownloadHints* pHints); + void SetDocument(CPDF_Document* pDoc); + DocAvailStatus IsPageAvail(uint32_t dwPage, DownloadHints* pHints); + DocFormStatus IsFormAvail(DownloadHints* pHints); + DocLinearizationStatus IsLinearizedPDF(); + bool IsLinearized(); + void GetLinearizedMainXRefInfo(FX_FILESIZE* pPos, uint32_t* pSize); + CFX_RetainPtr GetFileRead() const { + return m_pFileRead; + } + int GetPageCount() const; + CPDF_Dictionary* GetPage(int index); + + protected: + class PageNode { + public: + PageNode(); + ~PageNode(); + + PDF_PAGENODE_TYPE m_type; + uint32_t m_dwPageNo; + std::vector> m_ChildNodes; + }; + + static const int kMaxDataAvailRecursionDepth = 64; + static int s_CurrentDataAvailRecursionDepth; + static const int kMaxPageRecursionDepth = 1024; + + uint32_t GetObjectSize(uint32_t objnum, FX_FILESIZE& offset); + bool AreObjectsAvailable(std::vector& obj_array, + bool bParsePage, + DownloadHints* pHints, + std::vector& ret_array); + bool CheckDocStatus(DownloadHints* pHints); + bool CheckHeader(DownloadHints* pHints); + bool CheckFirstPage(DownloadHints* pHints); + bool CheckHintTables(DownloadHints* pHints); + bool CheckEnd(DownloadHints* pHints); + bool CheckCrossRef(DownloadHints* pHints); + bool CheckCrossRefItem(DownloadHints* pHints); + bool CheckTrailer(DownloadHints* pHints); + bool CheckRoot(DownloadHints* pHints); + bool CheckInfo(DownloadHints* pHints); + bool CheckPages(DownloadHints* pHints); + bool CheckPage(DownloadHints* pHints); + bool CheckResources(DownloadHints* pHints); + bool CheckAnnots(DownloadHints* pHints); + bool CheckAcroForm(DownloadHints* pHints); + bool CheckAcroFormSubObject(DownloadHints* pHints); + bool CheckTrailerAppend(DownloadHints* pHints); + bool CheckPageStatus(DownloadHints* pHints); + bool CheckAllCrossRefStream(DownloadHints* pHints); + + int32_t CheckCrossRefStream(DownloadHints* pHints, FX_FILESIZE& xref_offset); + bool IsLinearizedFile(uint8_t* pData, uint32_t dwLen); + void SetStartOffset(FX_FILESIZE dwOffset); + bool GetNextToken(CFX_ByteString& token); + bool GetNextChar(uint8_t& ch); + std::unique_ptr ParseIndirectObjectAt( + FX_FILESIZE pos, + uint32_t objnum, + CPDF_IndirectObjectHolder* pObjList = nullptr); + std::unique_ptr GetObject(uint32_t objnum, + DownloadHints* pHints, + bool* pExistInFile); + bool GetPageKids(CPDF_Parser* pParser, CPDF_Object* pPages); + bool PreparePageItem(); + bool LoadPages(DownloadHints* pHints); + bool LoadAllXref(DownloadHints* pHints); + bool LoadAllFile(DownloadHints* pHints); + DocAvailStatus CheckLinearizedData(DownloadHints* pHints); + bool CheckPageAnnots(uint32_t dwPage, DownloadHints* pHints); + + DocAvailStatus CheckLinearizedFirstPage(uint32_t dwPage, + DownloadHints* pHints); + bool HaveResourceAncestor(CPDF_Dictionary* pDict); + bool CheckPage(uint32_t dwPage, DownloadHints* pHints); + bool LoadDocPages(DownloadHints* pHints); + bool LoadDocPage(uint32_t dwPage, DownloadHints* pHints); + bool CheckPageNode(const PageNode& pageNode, + int32_t iPage, + int32_t& iCount, + DownloadHints* pHints, + int level); + bool CheckUnknownPageNode(uint32_t dwPageNo, + PageNode* pPageNode, + DownloadHints* pHints); + bool CheckArrayPageNode(uint32_t dwPageNo, + PageNode* pPageNode, + DownloadHints* pHints); + bool CheckPageCount(DownloadHints* pHints); + bool IsFirstCheck(uint32_t dwPage); + void ResetFirstCheck(uint32_t dwPage); + bool ValidatePage(uint32_t dwPage); + bool ValidateForm(); + + FileAvail* const m_pFileAvail; + CFX_RetainPtr m_pFileRead; + CPDF_Parser m_parser; + CPDF_SyntaxParser m_syntaxParser; + std::unique_ptr m_pRoot; + uint32_t m_dwRootObjNum; + uint32_t m_dwInfoObjNum; + std::unique_ptr m_pLinearized; + CPDF_Object* m_pTrailer; + bool m_bDocAvail; + FX_FILESIZE m_dwHeaderOffset; + FX_FILESIZE m_dwLastXRefOffset; + FX_FILESIZE m_dwXRefOffset; + FX_FILESIZE m_dwTrailerOffset; + FX_FILESIZE m_dwCurrentOffset; + PDF_DATAAVAIL_STATUS m_docStatus; + FX_FILESIZE m_dwFileLen; + CPDF_Document* m_pDocument; + std::set m_ObjectSet; + std::vector m_objs_array; + FX_FILESIZE m_Pos; + FX_FILESIZE m_bufferOffset; + uint32_t m_bufferSize; + CFX_ByteString m_WordBuf; + uint8_t m_bufferData[512]; + std::vector m_XRefStreamList; + std::vector m_PageObjList; + uint32_t m_PagesObjNum; + bool m_bLinearedDataOK; + bool m_bMainXRefLoadTried; + bool m_bMainXRefLoadedOK; + bool m_bPagesTreeLoad; + bool m_bPagesLoad; + CPDF_Parser* m_pCurrentParser; + FX_FILESIZE m_dwCurrentXRefSteam; + bool m_bAnnotsLoad; + bool m_bHaveAcroForm; + uint32_t m_dwAcroFormObjNum; + bool m_bAcroFormLoad; + CPDF_Object* m_pAcroForm; + std::vector m_arrayAcroforms; + CPDF_Dictionary* m_pPageDict; + CPDF_Object* m_pPageResource; + bool m_bNeedDownLoadResource; + bool m_bPageLoadedOK; + bool m_bLinearizedFormParamLoad; + std::vector> m_PagesArray; + uint32_t m_dwEncryptObjNum; + FX_FILESIZE m_dwPrevXRefOffset; + bool m_bTotalLoadPageTree; + bool m_bCurPageDictLoadOK; + PageNode m_PageNode; + std::set m_pageMapCheckState; + std::set m_pagesLoadState; + std::unique_ptr m_pHintTables; + bool m_bSupportHintTable; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_DATA_AVAIL_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_dictionary.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_dictionary.cpp new file mode 100644 index 000000000000..40877539b53e --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_dictionary.cpp @@ -0,0 +1,238 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_dictionary.h" + +#include +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_boolean.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "third_party/base/logging.h" +#include "third_party/base/stl_util.h" + +CPDF_Dictionary::CPDF_Dictionary() + : CPDF_Dictionary(CFX_WeakPtr()) {} + +CPDF_Dictionary::CPDF_Dictionary(const CFX_WeakPtr& pPool) + : m_pPool(pPool) {} + +CPDF_Dictionary::~CPDF_Dictionary() { + // Mark the object as deleted so that it will not be deleted again, + // and break cyclic references. + m_ObjNum = kInvalidObjNum; + for (auto& it : m_Map) { + if (it.second && it.second->GetObjNum() == kInvalidObjNum) + it.second.release(); + } +} + +CPDF_Object::Type CPDF_Dictionary::GetType() const { + return DICTIONARY; +} + +CPDF_Dictionary* CPDF_Dictionary::GetDict() const { + // The method should be made non-const if we want to not be const. + // See bug #234. + return const_cast(this); +} + +bool CPDF_Dictionary::IsDictionary() const { + return true; +} + +CPDF_Dictionary* CPDF_Dictionary::AsDictionary() { + return this; +} + +const CPDF_Dictionary* CPDF_Dictionary::AsDictionary() const { + return this; +} + +std::unique_ptr CPDF_Dictionary::Clone() const { + return CloneObjectNonCyclic(false); +} + +std::unique_ptr CPDF_Dictionary::CloneNonCyclic( + bool bDirect, + std::set* pVisited) const { + pVisited->insert(this); + auto pCopy = pdfium::MakeUnique(m_pPool); + for (const auto& it : *this) { + if (!pdfium::ContainsKey(*pVisited, it.second.get())) { + pCopy->m_Map.insert(std::make_pair( + it.first, it.second->CloneNonCyclic(bDirect, pVisited))); + } + } + return std::move(pCopy); +} + +CPDF_Object* CPDF_Dictionary::GetObjectFor(const CFX_ByteString& key) const { + auto it = m_Map.find(key); + return it != m_Map.end() ? it->second.get() : nullptr; +} + +CPDF_Object* CPDF_Dictionary::GetDirectObjectFor( + const CFX_ByteString& key) const { + CPDF_Object* p = GetObjectFor(key); + return p ? p->GetDirect() : nullptr; +} + +CFX_ByteString CPDF_Dictionary::GetStringFor(const CFX_ByteString& key) const { + CPDF_Object* p = GetObjectFor(key); + return p ? p->GetString() : CFX_ByteString(); +} + +CFX_WideString CPDF_Dictionary::GetUnicodeTextFor( + const CFX_ByteString& key) const { + CPDF_Object* p = GetObjectFor(key); + if (CPDF_Reference* pRef = ToReference(p)) + p = pRef->GetDirect(); + return p ? p->GetUnicodeText() : CFX_WideString(); +} + +CFX_ByteString CPDF_Dictionary::GetStringFor(const CFX_ByteString& key, + const CFX_ByteString& def) const { + CPDF_Object* p = GetObjectFor(key); + return p ? p->GetString() : CFX_ByteString(def); +} + +int CPDF_Dictionary::GetIntegerFor(const CFX_ByteString& key) const { + CPDF_Object* p = GetObjectFor(key); + return p ? p->GetInteger() : 0; +} + +int CPDF_Dictionary::GetIntegerFor(const CFX_ByteString& key, int def) const { + CPDF_Object* p = GetObjectFor(key); + return p ? p->GetInteger() : def; +} + +FX_FLOAT CPDF_Dictionary::GetNumberFor(const CFX_ByteString& key) const { + CPDF_Object* p = GetObjectFor(key); + return p ? p->GetNumber() : 0; +} + +bool CPDF_Dictionary::GetBooleanFor(const CFX_ByteString& key, + bool bDefault) const { + CPDF_Object* p = GetObjectFor(key); + return ToBoolean(p) ? p->GetInteger() != 0 : bDefault; +} + +CPDF_Dictionary* CPDF_Dictionary::GetDictFor(const CFX_ByteString& key) const { + CPDF_Object* p = GetDirectObjectFor(key); + if (!p) + return nullptr; + if (CPDF_Dictionary* pDict = p->AsDictionary()) + return pDict; + if (CPDF_Stream* pStream = p->AsStream()) + return pStream->GetDict(); + return nullptr; +} + +CPDF_Array* CPDF_Dictionary::GetArrayFor(const CFX_ByteString& key) const { + return ToArray(GetDirectObjectFor(key)); +} + +CPDF_Stream* CPDF_Dictionary::GetStreamFor(const CFX_ByteString& key) const { + return ToStream(GetDirectObjectFor(key)); +} + +CFX_FloatRect CPDF_Dictionary::GetRectFor(const CFX_ByteString& key) const { + CFX_FloatRect rect; + CPDF_Array* pArray = GetArrayFor(key); + if (pArray) + rect = pArray->GetRect(); + return rect; +} + +CFX_Matrix CPDF_Dictionary::GetMatrixFor(const CFX_ByteString& key) const { + CFX_Matrix matrix; + CPDF_Array* pArray = GetArrayFor(key); + if (pArray) + matrix = pArray->GetMatrix(); + return matrix; +} + +bool CPDF_Dictionary::KeyExist(const CFX_ByteString& key) const { + return pdfium::ContainsKey(m_Map, key); +} + +bool CPDF_Dictionary::IsSignatureDict() const { + CPDF_Object* pType = GetDirectObjectFor("Type"); + if (!pType) + pType = GetDirectObjectFor("FT"); + return pType && pType->GetString() == "Sig"; +} + +CPDF_Object* CPDF_Dictionary::SetFor(const CFX_ByteString& key, + std::unique_ptr pObj) { + if (!pObj) { + m_Map.erase(key); + return nullptr; + } + ASSERT(pObj->IsInline()); + CPDF_Object* pRet = pObj.get(); + m_Map[MaybeIntern(key)] = std::move(pObj); + return pRet; +} + +void CPDF_Dictionary::ConvertToIndirectObjectFor( + const CFX_ByteString& key, + CPDF_IndirectObjectHolder* pHolder) { + auto it = m_Map.find(key); + if (it == m_Map.end() || it->second->IsReference()) + return; + + CPDF_Object* pObj = pHolder->AddIndirectObject(std::move(it->second)); + it->second = pdfium::MakeUnique(pHolder, pObj->GetObjNum()); +} + +void CPDF_Dictionary::RemoveFor(const CFX_ByteString& key) { + m_Map.erase(key); +} + +void CPDF_Dictionary::ReplaceKey(const CFX_ByteString& oldkey, + const CFX_ByteString& newkey) { + auto old_it = m_Map.find(oldkey); + if (old_it == m_Map.end()) + return; + + auto new_it = m_Map.find(newkey); + if (new_it == old_it) + return; + + m_Map[MaybeIntern(newkey)] = std::move(old_it->second); + m_Map.erase(old_it); +} + +void CPDF_Dictionary::SetRectFor(const CFX_ByteString& key, + const CFX_FloatRect& rect) { + CPDF_Array* pArray = SetNewFor(key); + pArray->AddNew(rect.left); + pArray->AddNew(rect.bottom); + pArray->AddNew(rect.right); + pArray->AddNew(rect.top); +} + +void CPDF_Dictionary::SetMatrixFor(const CFX_ByteString& key, + const CFX_Matrix& matrix) { + CPDF_Array* pArray = SetNewFor(key); + pArray->AddNew(matrix.a); + pArray->AddNew(matrix.b); + pArray->AddNew(matrix.c); + pArray->AddNew(matrix.d); + pArray->AddNew(matrix.e); + pArray->AddNew(matrix.f); +} + +CFX_ByteString CPDF_Dictionary::MaybeIntern(const CFX_ByteString& str) { + return m_pPool ? m_pPool->Intern(str) : str; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_dictionary.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_dictionary.h new file mode 100644 index 000000000000..13cbdcf7ac99 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_dictionary.h @@ -0,0 +1,131 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_DICTIONARY_H_ +#define CORE_FPDFAPI_PARSER_CPDF_DICTIONARY_H_ + +#include +#include +#include +#include + +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fxcrt/cfx_string_pool_template.h" +#include "core/fxcrt/cfx_weak_ptr.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "third_party/base/ptr_util.h" + +class CPDF_IndirectObjectHolder; + +class CPDF_Dictionary : public CPDF_Object { + public: + using const_iterator = + std::map>::const_iterator; + + CPDF_Dictionary(); + explicit CPDF_Dictionary(const CFX_WeakPtr& pPool); + ~CPDF_Dictionary() override; + + // CPDF_Object: + Type GetType() const override; + std::unique_ptr Clone() const override; + CPDF_Dictionary* GetDict() const override; + bool IsDictionary() const override; + CPDF_Dictionary* AsDictionary() override; + const CPDF_Dictionary* AsDictionary() const override; + + size_t GetCount() const { return m_Map.size(); } + CPDF_Object* GetObjectFor(const CFX_ByteString& key) const; + CPDF_Object* GetDirectObjectFor(const CFX_ByteString& key) const; + CFX_ByteString GetStringFor(const CFX_ByteString& key) const; + CFX_ByteString GetStringFor(const CFX_ByteString& key, + const CFX_ByteString& default_str) const; + CFX_WideString GetUnicodeTextFor(const CFX_ByteString& key) const; + int GetIntegerFor(const CFX_ByteString& key) const; + int GetIntegerFor(const CFX_ByteString& key, int default_int) const; + bool GetBooleanFor(const CFX_ByteString& key, bool bDefault = false) const; + FX_FLOAT GetNumberFor(const CFX_ByteString& key) const; + CPDF_Dictionary* GetDictFor(const CFX_ByteString& key) const; + CPDF_Stream* GetStreamFor(const CFX_ByteString& key) const; + CPDF_Array* GetArrayFor(const CFX_ByteString& key) const; + CFX_FloatRect GetRectFor(const CFX_ByteString& key) const; + CFX_Matrix GetMatrixFor(const CFX_ByteString& key) const; + FX_FLOAT GetFloatFor(const CFX_ByteString& key) const { + return GetNumberFor(key); + } + + bool KeyExist(const CFX_ByteString& key) const; + bool IsSignatureDict() const; + + // Set* functions invalidate iterators for the element with the key |key|. + // Takes ownership of |pObj|, returns an unowned pointer to it. + CPDF_Object* SetFor(const CFX_ByteString& key, + std::unique_ptr pObj); + + // Creates a new object owned by the dictionary and returns an unowned + // pointer to it. + template + typename std::enable_if::value, T*>::type SetNewFor( + const CFX_ByteString& key, + Args&&... args) { + return static_cast( + SetFor(key, pdfium::MakeUnique(std::forward(args)...))); + } + template + typename std::enable_if::value, T*>::type SetNewFor( + const CFX_ByteString& key, + Args&&... args) { + return static_cast(SetFor( + key, pdfium::MakeUnique(m_pPool, std::forward(args)...))); + } + + // Convenience functions to convert native objects to array form. + void SetRectFor(const CFX_ByteString& key, const CFX_FloatRect& rect); + void SetMatrixFor(const CFX_ByteString& key, const CFX_Matrix& matrix); + + void ConvertToIndirectObjectFor(const CFX_ByteString& key, + CPDF_IndirectObjectHolder* pHolder); + + // Invalidates iterators for the element with the key |key|. + void RemoveFor(const CFX_ByteString& key); + + // Invalidates iterators for the element with the key |oldkey|. + void ReplaceKey(const CFX_ByteString& oldkey, const CFX_ByteString& newkey); + + const_iterator begin() const { return m_Map.begin(); } + const_iterator end() const { return m_Map.end(); } + + CFX_WeakPtr GetByteStringPool() const { return m_pPool; } + + protected: + CFX_ByteString MaybeIntern(const CFX_ByteString& str); + std::unique_ptr CloneNonCyclic( + bool bDirect, + std::set* visited) const override; + + CFX_WeakPtr m_pPool; + std::map> m_Map; +}; + +inline CPDF_Dictionary* ToDictionary(CPDF_Object* obj) { + return obj ? obj->AsDictionary() : nullptr; +} + +inline const CPDF_Dictionary* ToDictionary(const CPDF_Object* obj) { + return obj ? obj->AsDictionary() : nullptr; +} + +inline std::unique_ptr ToDictionary( + std::unique_ptr obj) { + CPDF_Dictionary* pDict = ToDictionary(obj.get()); + if (!pDict) + return nullptr; + obj.release(); + return std::unique_ptr(pDict); +} + +#endif // CORE_FPDFAPI_PARSER_CPDF_DICTIONARY_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_document.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_document.cpp new file mode 100644 index 000000000000..21eb61a9915e --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_document.cpp @@ -0,0 +1,1054 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_document.h" + +#include +#include +#include +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/font/cpdf_fontencoding.h" +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/page/cpdf_pagemodule.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_linearized_header.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/render/cpdf_dibsource.h" +#include "core/fpdfapi/render/cpdf_docrenderdata.h" +#include "core/fxcodec/JBig2_DocumentContext.h" +#include "core/fxge/cfx_unicodeencoding.h" +#include "core/fxge/fx_font.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +namespace { + +const int FX_MAX_PAGE_LEVEL = 1024; + +const uint16_t g_FX_CP874Unicodes[128] = { + 0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, + 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00A0, 0x0E01, 0x0E02, 0x0E03, + 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, + 0x0E0D, 0x0E0E, 0x0E0F, 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, + 0x0E16, 0x0E17, 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, + 0x0E1F, 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, + 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, 0x0E30, + 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, 0x0E38, 0x0E39, + 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F, 0x0E40, 0x0E41, 0x0E42, + 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, + 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, + 0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, + 0x0000, 0x0000, +}; +const uint16_t g_FX_CP1250Unicodes[128] = { + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, + 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, 0x0000, 0x2018, + 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0161, + 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, 0x00A0, 0x02C7, 0x02D8, 0x0141, + 0x00A4, 0x0104, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, + 0x00AD, 0x00AE, 0x017B, 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, + 0x00B6, 0x00B7, 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, + 0x017C, 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, 0x0110, + 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, + 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, 0x0155, 0x00E1, 0x00E2, + 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, + 0x011B, 0x00ED, 0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, + 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, + 0x0163, 0x02D9, +}; +const uint16_t g_FX_CP1251Unicodes[128] = { + 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC, + 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, 0x0452, 0x2018, + 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0459, + 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, 0x00A0, 0x040E, 0x045E, 0x0408, + 0x00A4, 0x0490, 0x00A6, 0x00A7, 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, + 0x00AD, 0x00AE, 0x0407, 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, + 0x00B6, 0x00B7, 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, + 0x0457, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, + 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, + 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, + 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, + 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, + 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, + 0x044E, 0x044F, +}; +const uint16_t g_FX_CP1253Unicodes[128] = { + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, + 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, + 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, + 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, 0x00A0, 0x0385, 0x0386, 0x00A3, + 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, + 0x00AD, 0x00AE, 0x2015, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, + 0x00B6, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, + 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, + 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03B0, 0x03B1, 0x03B2, + 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, + 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, + 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, + 0x03CE, 0x0000, +}; +const uint16_t g_FX_CP1254Unicodes[128] = { + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, + 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, + 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, + 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, 0x00A0, 0x00A1, 0x00A2, 0x00A3, + 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, + 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, + 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, + 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x011E, + 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, + 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, 0x00E0, 0x00E1, 0x00E2, + 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, + 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, + 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, + 0x015F, 0x00FF, +}; +const uint16_t g_FX_CP1255Unicodes[128] = { + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, + 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2018, + 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000, + 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, 0x00A0, 0x00A1, 0x00A2, 0x00A3, + 0x20AA, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, + 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, + 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, + 0x00BF, 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, + 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, 0x05C0, + 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, 0x05F4, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05D0, 0x05D1, 0x05D2, + 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, + 0x05DC, 0x05DD, 0x05DE, 0x05DF, 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, + 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, + 0x200F, 0x0000, +}; +const uint16_t g_FX_CP1256Unicodes[128] = { + 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, + 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, 0x06AF, 0x2018, + 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x06A9, 0x2122, 0x0691, + 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, 0x00A0, 0x060C, 0x00A2, 0x00A3, + 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, + 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, + 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, + 0x061F, 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, + 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, 0x0637, 0x0638, + 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643, 0x00E0, 0x0644, 0x00E2, + 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, + 0x0649, 0x064A, 0x00EE, 0x00EF, 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, + 0x064F, 0x0650, 0x00F7, 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, + 0x200F, 0x06D2, +}; +const uint16_t g_FX_CP1257Unicodes[128] = { + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, + 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8, 0x0000, 0x2018, + 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, + 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000, 0x00A0, 0x0000, 0x00A2, 0x00A3, + 0x00A4, 0x0000, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, + 0x00AD, 0x00AE, 0x00C6, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, + 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, + 0x00E6, 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, + 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, 0x0160, + 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, + 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, 0x0105, 0x012F, 0x0101, + 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, + 0x0123, 0x0137, 0x012B, 0x013C, 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, + 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, + 0x017E, 0x02D9, +}; + +struct FX_CharsetUnicodes { + uint8_t m_Charset; + const uint16_t* m_pUnicodes; +}; + +const FX_CharsetUnicodes g_FX_CharsetUnicodes[] = { + {FXFONT_THAI_CHARSET, g_FX_CP874Unicodes}, + {FXFONT_EASTEUROPE_CHARSET, g_FX_CP1250Unicodes}, + {FXFONT_RUSSIAN_CHARSET, g_FX_CP1251Unicodes}, + {FXFONT_GREEK_CHARSET, g_FX_CP1253Unicodes}, + {FXFONT_TURKISH_CHARSET, g_FX_CP1254Unicodes}, + {FXFONT_HEBREW_CHARSET, g_FX_CP1255Unicodes}, + {FXFONT_ARABIC_CHARSET, g_FX_CP1256Unicodes}, + {FXFONT_BALTIC_CHARSET, g_FX_CP1257Unicodes}, +}; + +void InsertWidthArrayImpl(int* widths, int size, CPDF_Array* pWidthArray) { + int i; + for (i = 1; i < size; i++) { + if (widths[i] != *widths) + break; + } + if (i == size) { + int first = pWidthArray->GetIntegerAt(pWidthArray->GetCount() - 1); + pWidthArray->AddNew(first + size - 1); + pWidthArray->AddNew(*widths); + } else { + CPDF_Array* pWidthArray1 = pWidthArray->AddNew(); + for (i = 0; i < size; i++) + pWidthArray1->AddNew(widths[i]); + } + FX_Free(widths); +} + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +void InsertWidthArray(HDC hDC, int start, int end, CPDF_Array* pWidthArray) { + int size = end - start + 1; + int* widths = FX_Alloc(int, size); + GetCharWidth(hDC, start, end, widths); + InsertWidthArrayImpl(widths, size, pWidthArray); +} + +CFX_ByteString FPDF_GetPSNameFromTT(HDC hDC) { + CFX_ByteString result; + DWORD size = ::GetFontData(hDC, 'eman', 0, nullptr, 0); + if (size != GDI_ERROR) { + LPBYTE buffer = FX_Alloc(BYTE, size); + ::GetFontData(hDC, 'eman', 0, buffer, size); + result = GetNameFromTT(buffer, size, 6); + FX_Free(buffer); + } + return result; +} +#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + +void InsertWidthArray1(CFX_Font* pFont, + CFX_UnicodeEncoding* pEncoding, + FX_WCHAR start, + FX_WCHAR end, + CPDF_Array* pWidthArray) { + int size = end - start + 1; + int* widths = FX_Alloc(int, size); + int i; + for (i = 0; i < size; i++) { + int glyph_index = pEncoding->GlyphFromCharCode(start + i); + widths[i] = pFont->GetGlyphWidth(glyph_index); + } + InsertWidthArrayImpl(widths, size, pWidthArray); +} + +int CountPages(CPDF_Dictionary* pPages, + std::set* visited_pages) { + int count = pPages->GetIntegerFor("Count"); + if (count > 0 && count < FPDF_PAGE_MAX_NUM) + return count; + CPDF_Array* pKidList = pPages->GetArrayFor("Kids"); + if (!pKidList) + return 0; + count = 0; + for (size_t i = 0; i < pKidList->GetCount(); i++) { + CPDF_Dictionary* pKid = pKidList->GetDictAt(i); + if (!pKid || pdfium::ContainsKey(*visited_pages, pKid)) + continue; + if (pKid->KeyExist("Kids")) { + // Use |visited_pages| to help detect circular references of pages. + pdfium::ScopedSetInsertion local_add(visited_pages, + pKid); + count += CountPages(pKid, visited_pages); + } else { + // This page is a leaf node. + count++; + } + } + pPages->SetNewFor("Count", count); + return count; +} + +int CalculateFlags(bool bold, + bool italic, + bool fixedPitch, + bool serif, + bool script, + bool symbolic) { + int flags = 0; + if (bold) + flags |= FXFONT_BOLD; + if (italic) + flags |= FXFONT_ITALIC; + if (fixedPitch) + flags |= FXFONT_FIXED_PITCH; + if (serif) + flags |= FXFONT_SERIF; + if (script) + flags |= FXFONT_SCRIPT; + if (symbolic) + flags |= FXFONT_SYMBOLIC; + else + flags |= FXFONT_NONSYMBOLIC; + return flags; +} + +void ProcessNonbCJK(CPDF_Dictionary* pBaseDict, + bool bold, + bool italic, + CFX_ByteString basefont, + std::unique_ptr pWidths) { + if (bold && italic) + basefont += ",BoldItalic"; + else if (bold) + basefont += ",Bold"; + else if (italic) + basefont += ",Italic"; + pBaseDict->SetNewFor("Subtype", "TrueType"); + pBaseDict->SetNewFor("BaseFont", basefont); + pBaseDict->SetNewFor("FirstChar", 32); + pBaseDict->SetNewFor("LastChar", 255); + pBaseDict->SetFor("Widths", std::move(pWidths)); +} + +std::unique_ptr CalculateFontDesc( + CPDF_Document* pDoc, + CFX_ByteString basefont, + int flags, + int italicangle, + int ascend, + int descend, + std::unique_ptr bbox, + int32_t stemV) { + auto pFontDesc = + pdfium::MakeUnique(pDoc->GetByteStringPool()); + pFontDesc->SetNewFor("Type", "FontDescriptor"); + pFontDesc->SetNewFor("FontName", basefont); + pFontDesc->SetNewFor("Flags", flags); + pFontDesc->SetFor("FontBBox", std::move(bbox)); + pFontDesc->SetNewFor("ItalicAngle", italicangle); + pFontDesc->SetNewFor("Ascent", ascend); + pFontDesc->SetNewFor("Descent", descend); + pFontDesc->SetNewFor("StemV", stemV); + return pFontDesc; +} + +} // namespace + +CPDF_Document::CPDF_Document(std::unique_ptr pParser) + : CPDF_IndirectObjectHolder(), + m_pParser(std::move(pParser)), + m_pRootDict(nullptr), + m_pInfoDict(nullptr), + m_iNextPageToTraverse(0), + m_bReachedMaxPageLevel(false), + m_bLinearized(false), + m_iFirstPageNo(0), + m_dwFirstPageObjNum(0), + m_pDocPage(new CPDF_DocPageData(this)), + m_pDocRender(new CPDF_DocRenderData(this)) { + if (pParser) + SetLastObjNum(m_pParser->GetLastObjNum()); +} + +CPDF_Document::~CPDF_Document() { + delete m_pDocPage; + CPDF_ModuleMgr::Get()->GetPageModule()->ClearStockFont(this); +} + +std::unique_ptr CPDF_Document::ParseIndirectObject( + uint32_t objnum) { + return m_pParser ? m_pParser->ParseIndirectObject(this, objnum) : nullptr; +} + +void CPDF_Document::LoadDocInternal() { + SetLastObjNum(m_pParser->GetLastObjNum()); + + CPDF_Object* pRootObj = GetOrParseIndirectObject(m_pParser->GetRootObjNum()); + if (!pRootObj) + return; + + m_pRootDict = pRootObj->GetDict(); + if (!m_pRootDict) + return; + + CPDF_Object* pInfoObj = GetOrParseIndirectObject(m_pParser->GetInfoObjNum()); + if (pInfoObj) + m_pInfoDict = pInfoObj->GetDict(); +} + +void CPDF_Document::LoadDoc() { + LoadDocInternal(); + LoadPages(); +} + +void CPDF_Document::LoadLinearizedDoc( + const CPDF_LinearizedHeader* pLinearizationParams) { + m_bLinearized = true; + LoadDocInternal(); + m_PageList.resize(pLinearizationParams->GetPageCount()); + m_iFirstPageNo = pLinearizationParams->GetFirstPageNo(); + m_dwFirstPageObjNum = pLinearizationParams->GetFirstPageObjNum(); +} + +void CPDF_Document::LoadPages() { + m_PageList.resize(RetrievePageCount()); +} + +CPDF_Dictionary* CPDF_Document::TraversePDFPages(int iPage, + int* nPagesToGo, + size_t level) { + if (*nPagesToGo < 0 || m_bReachedMaxPageLevel) + return nullptr; + + CPDF_Dictionary* pPages = m_pTreeTraversal[level].first; + CPDF_Array* pKidList = pPages->GetArrayFor("Kids"); + if (!pKidList) { + if (*nPagesToGo != 1) + return nullptr; + m_PageList[iPage] = pPages->GetObjNum(); + return pPages; + } + if (level >= FX_MAX_PAGE_LEVEL) { + m_pTreeTraversal.pop_back(); + m_bReachedMaxPageLevel = true; + return nullptr; + } + CPDF_Dictionary* page = nullptr; + for (size_t i = m_pTreeTraversal[level].second; i < pKidList->GetCount(); + i++) { + if (*nPagesToGo == 0) + break; + CPDF_Dictionary* pKid = pKidList->GetDictAt(i); + if (!pKid) { + (*nPagesToGo)--; + m_pTreeTraversal[level].second++; + continue; + } + if (pKid == pPages) { + m_pTreeTraversal[level].second++; + continue; + } + if (!pKid->KeyExist("Kids")) { + m_PageList[iPage - (*nPagesToGo) + 1] = pKid->GetObjNum(); + (*nPagesToGo)--; + m_pTreeTraversal[level].second++; + if (*nPagesToGo == 0) { + page = pKid; + break; + } + } else { + // If the vector has size level+1, the child is not in yet + if (m_pTreeTraversal.size() == level + 1) + m_pTreeTraversal.push_back(std::make_pair(pKid, 0)); + // Now m_pTreeTraversal[level+1] should exist and be equal to pKid. + CPDF_Dictionary* pageKid = TraversePDFPages(iPage, nPagesToGo, level + 1); + // Check if child was completely processed, i.e. it popped itself out + if (m_pTreeTraversal.size() == level + 1) + m_pTreeTraversal[level].second++; + // If child did not finish, no pages to go, or max level reached, end + if (m_pTreeTraversal.size() != level + 1 || *nPagesToGo == 0 || + m_bReachedMaxPageLevel) { + page = pageKid; + break; + } + } + } + if (m_pTreeTraversal[level].second == pKidList->GetCount()) + m_pTreeTraversal.pop_back(); + return page; +} + +void CPDF_Document::ResetTraversal() { + m_iNextPageToTraverse = 0; + m_bReachedMaxPageLevel = false; + m_pTreeTraversal.clear(); +} + +CPDF_Dictionary* CPDF_Document::GetPagesDict() const { + CPDF_Dictionary* pRoot = GetRoot(); + return pRoot ? pRoot->GetDictFor("Pages") : nullptr; +} + +bool CPDF_Document::IsPageLoaded(int iPage) const { + return !!m_PageList[iPage]; +} + +CPDF_Dictionary* CPDF_Document::GetPage(int iPage) { + if (iPage < 0 || iPage >= pdfium::CollectionSize(m_PageList)) + return nullptr; + + if (m_bLinearized && (iPage == m_iFirstPageNo)) { + if (CPDF_Dictionary* pDict = + ToDictionary(GetOrParseIndirectObject(m_dwFirstPageObjNum))) { + return pDict; + } + } + uint32_t objnum = m_PageList[iPage]; + if (objnum) + return ToDictionary(GetOrParseIndirectObject(objnum)); + + CPDF_Dictionary* pPages = GetPagesDict(); + if (!pPages) + return nullptr; + + if (iPage - m_iNextPageToTraverse + 1 <= 0) { + // This can happen when the page does not have an object number. On repeated + // calls to this function for the same page index, this condition causes + // TraversePDFPages() to incorrectly return nullptr. + // Example "testing/corpus/fx/other/jetman_std.pdf" + // We should restart traversing in this case. + // TODO(art-snake): optimize this. + ResetTraversal(); + } + int nPagesToGo = iPage - m_iNextPageToTraverse + 1; + if (m_pTreeTraversal.empty()) + m_pTreeTraversal.push_back(std::make_pair(pPages, 0)); + CPDF_Dictionary* pPage = TraversePDFPages(iPage, &nPagesToGo, 0); + m_iNextPageToTraverse = iPage + 1; + return pPage; +} + +void CPDF_Document::SetPageObjNum(int iPage, uint32_t objNum) { + m_PageList[iPage] = objNum; +} + +int CPDF_Document::FindPageIndex(CPDF_Dictionary* pNode, + uint32_t* skip_count, + uint32_t objnum, + int* index, + int level) { + if (!pNode->KeyExist("Kids")) { + if (objnum == pNode->GetObjNum()) + return *index; + + if (*skip_count) + (*skip_count)--; + + (*index)++; + return -1; + } + + CPDF_Array* pKidList = pNode->GetArrayFor("Kids"); + if (!pKidList) + return -1; + + if (level >= FX_MAX_PAGE_LEVEL) + return -1; + + size_t count = pNode->GetIntegerFor("Count"); + if (count <= *skip_count) { + (*skip_count) -= count; + (*index) += count; + return -1; + } + + if (count && count == pKidList->GetCount()) { + for (size_t i = 0; i < count; i++) { + CPDF_Reference* pKid = ToReference(pKidList->GetObjectAt(i)); + if (pKid && pKid->GetRefObjNum() == objnum) + return static_cast(*index + i); + } + } + + for (size_t i = 0; i < pKidList->GetCount(); i++) { + CPDF_Dictionary* pKid = pKidList->GetDictAt(i); + if (!pKid || pKid == pNode) + continue; + + int found_index = FindPageIndex(pKid, skip_count, objnum, index, level + 1); + if (found_index >= 0) + return found_index; + } + return -1; +} + +int CPDF_Document::GetPageIndex(uint32_t objnum) { + uint32_t nPages = m_PageList.size(); + uint32_t skip_count = 0; + bool bSkipped = false; + for (uint32_t i = 0; i < nPages; i++) { + if (m_PageList[i] == objnum) + return i; + + if (!bSkipped && m_PageList[i] == 0) { + skip_count = i; + bSkipped = true; + } + } + CPDF_Dictionary* pPages = GetPagesDict(); + if (!pPages) + return -1; + + int start_index = 0; + int found_index = FindPageIndex(pPages, &skip_count, objnum, &start_index); + + // Corrupt page tree may yield out-of-range results. + if (found_index < 0 || found_index >= pdfium::CollectionSize(m_PageList)) + return -1; + + m_PageList[found_index] = objnum; + return found_index; +} + +int CPDF_Document::GetPageCount() const { + return pdfium::CollectionSize(m_PageList); +} + +int CPDF_Document::RetrievePageCount() const { + CPDF_Dictionary* pPages = GetPagesDict(); + if (!pPages) + return 0; + + if (!pPages->KeyExist("Kids")) + return 1; + + std::set visited_pages; + visited_pages.insert(pPages); + return CountPages(pPages, &visited_pages); +} + +uint32_t CPDF_Document::GetUserPermissions() const { + // https://bugs.chromium.org/p/pdfium/issues/detail?id=499 + if (!m_pParser) { +#ifndef PDF_ENABLE_XFA + return 0; +#else // PDF_ENABLE_XFA + return 0xFFFFFFFF; +#endif + } + return m_pParser->GetPermissions(); +} + +CPDF_Font* CPDF_Document::LoadFont(CPDF_Dictionary* pFontDict) { + ASSERT(pFontDict); + return m_pDocPage->GetFont(pFontDict); +} + +CPDF_StreamAcc* CPDF_Document::LoadFontFile(CPDF_Stream* pStream) { + return m_pDocPage->GetFontFileStreamAcc(pStream); +} + +CPDF_ColorSpace* CPDF_Document::LoadColorSpace(CPDF_Object* pCSObj, + CPDF_Dictionary* pResources) { + return m_pDocPage->GetColorSpace(pCSObj, pResources); +} + +CPDF_Pattern* CPDF_Document::LoadPattern(CPDF_Object* pPatternObj, + bool bShading, + const CFX_Matrix& matrix) { + return m_pDocPage->GetPattern(pPatternObj, bShading, matrix); +} + +CPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream) { + return m_pDocPage->GetIccProfile(pStream); +} + +CPDF_Image* CPDF_Document::LoadImageFromPageData(uint32_t dwStreamObjNum) { + ASSERT(dwStreamObjNum); + return m_pDocPage->GetImage(dwStreamObjNum); +} + +void CPDF_Document::CreateNewDoc() { + ASSERT(!m_pRootDict && !m_pInfoDict); + m_pRootDict = NewIndirect(); + m_pRootDict->SetNewFor("Type", "Catalog"); + + CPDF_Dictionary* pPages = NewIndirect(); + pPages->SetNewFor("Type", "Pages"); + pPages->SetNewFor("Count", 0); + pPages->SetNewFor("Kids"); + m_pRootDict->SetNewFor("Pages", this, pPages->GetObjNum()); + m_pInfoDict = NewIndirect(); +} + +CPDF_Dictionary* CPDF_Document::CreateNewPage(int iPage) { + CPDF_Dictionary* pDict = NewIndirect(); + pDict->SetNewFor("Type", "Page"); + uint32_t dwObjNum = pDict->GetObjNum(); + if (!InsertNewPage(iPage, pDict)) { + DeleteIndirectObject(dwObjNum); + return nullptr; + } + return pDict; +} + +bool CPDF_Document::InsertDeletePDFPage(CPDF_Dictionary* pPages, + int nPagesToGo, + CPDF_Dictionary* pPageDict, + bool bInsert, + std::set* pVisited) { + CPDF_Array* pKidList = pPages->GetArrayFor("Kids"); + if (!pKidList) + return false; + + for (size_t i = 0; i < pKidList->GetCount(); i++) { + CPDF_Dictionary* pKid = pKidList->GetDictAt(i); + if (pKid->GetStringFor("Type") == "Page") { + if (nPagesToGo != 0) { + nPagesToGo--; + continue; + } + if (bInsert) { + pKidList->InsertNewAt(i, this, pPageDict->GetObjNum()); + pPageDict->SetNewFor("Parent", this, + pPages->GetObjNum()); + } else { + pKidList->RemoveAt(i); + } + pPages->SetNewFor( + "Count", pPages->GetIntegerFor("Count") + (bInsert ? 1 : -1)); + ResetTraversal(); + break; + } + int nPages = pKid->GetIntegerFor("Count"); + if (nPagesToGo >= nPages) { + nPagesToGo -= nPages; + continue; + } + if (pdfium::ContainsKey(*pVisited, pKid)) + return false; + + pdfium::ScopedSetInsertion insertion(pVisited, pKid); + if (!InsertDeletePDFPage(pKid, nPagesToGo, pPageDict, bInsert, pVisited)) + return false; + + pPages->SetNewFor( + "Count", pPages->GetIntegerFor("Count") + (bInsert ? 1 : -1)); + break; + } + return true; +} + +bool CPDF_Document::InsertNewPage(int iPage, CPDF_Dictionary* pPageDict) { + CPDF_Dictionary* pRoot = GetRoot(); + CPDF_Dictionary* pPages = pRoot ? pRoot->GetDictFor("Pages") : nullptr; + if (!pPages) + return false; + + int nPages = GetPageCount(); + if (iPage < 0 || iPage > nPages) + return false; + + if (iPage == nPages) { + CPDF_Array* pPagesList = pPages->GetArrayFor("Kids"); + if (!pPagesList) + pPagesList = pPages->SetNewFor("Kids"); + pPagesList->AddNew(this, pPageDict->GetObjNum()); + pPages->SetNewFor("Count", nPages + 1); + pPageDict->SetNewFor("Parent", this, pPages->GetObjNum()); + ResetTraversal(); + } else { + std::set stack = {pPages}; + if (!InsertDeletePDFPage(pPages, iPage, pPageDict, true, &stack)) + return false; + } + m_PageList.insert(m_PageList.begin() + iPage, pPageDict->GetObjNum()); + return true; +} + +void CPDF_Document::DeletePage(int iPage) { + CPDF_Dictionary* pPages = GetPagesDict(); + if (!pPages) + return; + + int nPages = pPages->GetIntegerFor("Count"); + if (iPage < 0 || iPage >= nPages) + return; + + std::set stack = {pPages}; + if (!InsertDeletePDFPage(pPages, iPage, nullptr, false, &stack)) + return; + + m_PageList.erase(m_PageList.begin() + iPage); +} + +CPDF_Font* CPDF_Document::AddStandardFont(const FX_CHAR* font, + CPDF_FontEncoding* pEncoding) { + CFX_ByteString name(font); + if (PDF_GetStandardFontName(&name) < 0) + return nullptr; + return GetPageData()->GetStandardFont(name, pEncoding); +} + +size_t CPDF_Document::CalculateEncodingDict(int charset, + CPDF_Dictionary* pBaseDict) { + size_t i; + for (i = 0; i < FX_ArraySize(g_FX_CharsetUnicodes); ++i) { + if (g_FX_CharsetUnicodes[i].m_Charset == charset) + break; + } + if (i == FX_ArraySize(g_FX_CharsetUnicodes)) + return i; + + CPDF_Dictionary* pEncodingDict = NewIndirect(); + pEncodingDict->SetNewFor("BaseEncoding", "WinAnsiEncoding"); + + CPDF_Array* pArray = pEncodingDict->SetNewFor("Differences"); + pArray->AddNew(128); + + const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; + for (int j = 0; j < 128; j++) { + CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]); + pArray->AddNew(name.IsEmpty() ? ".notdef" : name); + } + pBaseDict->SetNewFor("Encoding", this, + pEncodingDict->GetObjNum()); + return i; +} + +CPDF_Dictionary* CPDF_Document::ProcessbCJK( + CPDF_Dictionary* pBaseDict, + int charset, + bool bVert, + CFX_ByteString basefont, + std::function Insert) { + CPDF_Dictionary* pFontDict = NewIndirect(); + CFX_ByteString cmap; + CFX_ByteString ordering; + int supplement = 0; + CPDF_Array* pWidthArray = pFontDict->SetNewFor("W"); + switch (charset) { + case FXFONT_CHINESEBIG5_CHARSET: + cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H"; + ordering = "CNS1"; + supplement = 4; + pWidthArray->AddNew(1); + Insert(0x20, 0x7e, pWidthArray); + break; + case FXFONT_GB2312_CHARSET: + cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H"; + ordering = "GB1"; + supplement = 2; + pWidthArray->AddNew(7716); + Insert(0x20, 0x20, pWidthArray); + pWidthArray->AddNew(814); + Insert(0x21, 0x7e, pWidthArray); + break; + case FXFONT_HANGUL_CHARSET: + cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H"; + ordering = "Korea1"; + supplement = 2; + pWidthArray->AddNew(1); + Insert(0x20, 0x7e, pWidthArray); + break; + case FXFONT_SHIFTJIS_CHARSET: + cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H"; + ordering = "Japan1"; + supplement = 5; + pWidthArray->AddNew(231); + Insert(0x20, 0x7d, pWidthArray); + pWidthArray->AddNew(326); + Insert(0xa0, 0xa0, pWidthArray); + pWidthArray->AddNew(327); + Insert(0xa1, 0xdf, pWidthArray); + pWidthArray->AddNew(631); + Insert(0x7e, 0x7e, pWidthArray); + break; + } + pBaseDict->SetNewFor("Subtype", "Type0"); + pBaseDict->SetNewFor("BaseFont", basefont); + pBaseDict->SetNewFor("Encoding", cmap); + pFontDict->SetNewFor("Type", "Font"); + pFontDict->SetNewFor("Subtype", "CIDFontType2"); + pFontDict->SetNewFor("BaseFont", basefont); + + CPDF_Dictionary* pCIDSysInfo = + pFontDict->SetNewFor("CIDSystemInfo"); + pCIDSysInfo->SetNewFor("Registry", "Adobe", false); + pCIDSysInfo->SetNewFor("Ordering", ordering, false); + pCIDSysInfo->SetNewFor("Supplement", supplement); + + CPDF_Array* pArray = pBaseDict->SetNewFor("DescendantFonts"); + pArray->AddNew(this, pFontDict->GetObjNum()); + return pFontDict; +} + +CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, bool bVert) { + if (!pFont) + return nullptr; + + bool bCJK = charset == FXFONT_CHINESEBIG5_CHARSET || + charset == FXFONT_GB2312_CHARSET || + charset == FXFONT_HANGUL_CHARSET || + charset == FXFONT_SHIFTJIS_CHARSET; + CFX_ByteString basefont = pFont->GetFamilyName(); + basefont.Replace(" ", ""); + int flags = + CalculateFlags(pFont->IsBold(), pFont->IsItalic(), pFont->IsFixedWidth(), + false, false, charset == FXFONT_SYMBOL_CHARSET); + + CPDF_Dictionary* pBaseDict = NewIndirect(); + pBaseDict->SetNewFor("Type", "Font"); + std::unique_ptr pEncoding( + new CFX_UnicodeEncoding(pFont)); + CPDF_Dictionary* pFontDict = pBaseDict; + if (!bCJK) { + auto pWidths = pdfium::MakeUnique(); + for (int charcode = 32; charcode < 128; charcode++) { + int glyph_index = pEncoding->GlyphFromCharCode(charcode); + int char_width = pFont->GetGlyphWidth(glyph_index); + pWidths->AddNew(char_width); + } + if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_DEFAULT_CHARSET || + charset == FXFONT_SYMBOL_CHARSET) { + pBaseDict->SetNewFor("Encoding", "WinAnsiEncoding"); + for (int charcode = 128; charcode <= 255; charcode++) { + int glyph_index = pEncoding->GlyphFromCharCode(charcode); + int char_width = pFont->GetGlyphWidth(glyph_index); + pWidths->AddNew(char_width); + } + } else { + size_t i = CalculateEncodingDict(charset, pBaseDict); + if (i < FX_ArraySize(g_FX_CharsetUnicodes)) { + const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; + for (int j = 0; j < 128; j++) { + int glyph_index = pEncoding->GlyphFromCharCode(pUnicodes[j]); + int char_width = pFont->GetGlyphWidth(glyph_index); + pWidths->AddNew(char_width); + } + } + } + ProcessNonbCJK(pBaseDict, pFont->IsBold(), pFont->IsItalic(), basefont, + std::move(pWidths)); + } else { + pFontDict = ProcessbCJK(pBaseDict, charset, bVert, basefont, + [pFont, &pEncoding](FX_WCHAR start, FX_WCHAR end, + CPDF_Array* widthArr) { + InsertWidthArray1(pFont, pEncoding.get(), start, + end, widthArr); + }); + } + int italicangle = + pFont->GetSubstFont() ? pFont->GetSubstFont()->m_ItalicAngle : 0; + FX_RECT bbox; + pFont->GetBBox(bbox); + auto pBBox = pdfium::MakeUnique(); + pBBox->AddNew(bbox.left); + pBBox->AddNew(bbox.bottom); + pBBox->AddNew(bbox.right); + pBBox->AddNew(bbox.top); + int32_t nStemV = 0; + if (pFont->GetSubstFont()) { + nStemV = pFont->GetSubstFont()->m_Weight / 5; + } else { + static const FX_CHAR stem_chars[] = {'i', 'I', '!', '1'}; + const size_t count = FX_ArraySize(stem_chars); + uint32_t glyph = pEncoding->GlyphFromCharCode(stem_chars[0]); + nStemV = pFont->GetGlyphWidth(glyph); + for (size_t i = 1; i < count; i++) { + glyph = pEncoding->GlyphFromCharCode(stem_chars[i]); + int width = pFont->GetGlyphWidth(glyph); + if (width > 0 && width < nStemV) + nStemV = width; + } + } + CPDF_Dictionary* pFontDesc = ToDictionary(AddIndirectObject( + CalculateFontDesc(this, basefont, flags, italicangle, pFont->GetAscent(), + pFont->GetDescent(), std::move(pBBox), nStemV))); + pFontDict->SetNewFor("FontDescriptor", this, + pFontDesc->GetObjNum()); + return LoadFont(pBaseDict); +} + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTW* pLogFont, + bool bVert, + bool bTranslateName) { + LOGFONTA lfa; + FXSYS_memcpy(&lfa, pLogFont, (char*)lfa.lfFaceName - (char*)&lfa); + CFX_ByteString face = CFX_ByteString::FromUnicode(pLogFont->lfFaceName); + if (face.GetLength() >= LF_FACESIZE) + return nullptr; + + FXSYS_strcpy(lfa.lfFaceName, face.c_str()); + return AddWindowsFont(&lfa, bVert, bTranslateName); +} + +CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTA* pLogFont, + bool bVert, + bool bTranslateName) { + pLogFont->lfHeight = -1000; + pLogFont->lfWidth = 0; + HGDIOBJ hFont = CreateFontIndirectA(pLogFont); + HDC hDC = CreateCompatibleDC(nullptr); + hFont = SelectObject(hDC, hFont); + int tm_size = GetOutlineTextMetrics(hDC, 0, nullptr); + if (tm_size == 0) { + hFont = SelectObject(hDC, hFont); + DeleteObject(hFont); + DeleteDC(hDC); + return nullptr; + } + + LPBYTE tm_buf = FX_Alloc(BYTE, tm_size); + OUTLINETEXTMETRIC* ptm = reinterpret_cast(tm_buf); + GetOutlineTextMetrics(hDC, tm_size, ptm); + int flags = CalculateFlags(false, pLogFont->lfItalic != 0, + (pLogFont->lfPitchAndFamily & 3) == FIXED_PITCH, + (pLogFont->lfPitchAndFamily & 0xf8) == FF_ROMAN, + (pLogFont->lfPitchAndFamily & 0xf8) == FF_SCRIPT, + pLogFont->lfCharSet == FXFONT_SYMBOL_CHARSET); + + bool bCJK = pLogFont->lfCharSet == FXFONT_CHINESEBIG5_CHARSET || + pLogFont->lfCharSet == FXFONT_GB2312_CHARSET || + pLogFont->lfCharSet == FXFONT_HANGUL_CHARSET || + pLogFont->lfCharSet == FXFONT_SHIFTJIS_CHARSET; + CFX_ByteString basefont; + if (bTranslateName && bCJK) + basefont = FPDF_GetPSNameFromTT(hDC); + + if (basefont.IsEmpty()) + basefont = pLogFont->lfFaceName; + + int italicangle = ptm->otmItalicAngle / 10; + int ascend = ptm->otmrcFontBox.top; + int descend = ptm->otmrcFontBox.bottom; + int capheight = ptm->otmsCapEmHeight; + int bbox[4] = {ptm->otmrcFontBox.left, ptm->otmrcFontBox.bottom, + ptm->otmrcFontBox.right, ptm->otmrcFontBox.top}; + FX_Free(tm_buf); + basefont.Replace(" ", ""); + CPDF_Dictionary* pBaseDict = NewIndirect(); + pBaseDict->SetNewFor("Type", "Font"); + CPDF_Dictionary* pFontDict = pBaseDict; + if (!bCJK) { + if (pLogFont->lfCharSet == FXFONT_ANSI_CHARSET || + pLogFont->lfCharSet == FXFONT_DEFAULT_CHARSET || + pLogFont->lfCharSet == FXFONT_SYMBOL_CHARSET) { + pBaseDict->SetNewFor("Encoding", "WinAnsiEncoding"); + } else { + CalculateEncodingDict(pLogFont->lfCharSet, pBaseDict); + } + int char_widths[224]; + GetCharWidth(hDC, 32, 255, char_widths); + auto pWidths = pdfium::MakeUnique(); + for (size_t i = 0; i < 224; i++) + pWidths->AddNew(char_widths[i]); + ProcessNonbCJK(pBaseDict, pLogFont->lfWeight > FW_MEDIUM, + pLogFont->lfItalic != 0, basefont, std::move(pWidths)); + } else { + pFontDict = + ProcessbCJK(pBaseDict, pLogFont->lfCharSet, bVert, basefont, + [&hDC](FX_WCHAR start, FX_WCHAR end, CPDF_Array* widthArr) { + InsertWidthArray(hDC, start, end, widthArr); + }); + } + auto pBBox = pdfium::MakeUnique(); + for (int i = 0; i < 4; i++) + pBBox->AddNew(bbox[i]); + std::unique_ptr pFontDesc = + CalculateFontDesc(this, basefont, flags, italicangle, ascend, descend, + std::move(pBBox), pLogFont->lfWeight / 5); + pFontDesc->SetNewFor("CapHeight", capheight); + pFontDict->SetNewFor( + "FontDescriptor", this, + AddIndirectObject(std::move(pFontDesc))->GetObjNum()); + hFont = SelectObject(hDC, hFont); + DeleteObject(hFont); + DeleteDC(hDC); + return LoadFont(pBaseDict); +} +#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_document.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_document.h new file mode 100644 index 000000000000..3848ad622090 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_document.h @@ -0,0 +1,153 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_DOCUMENT_H_ +#define CORE_FPDFAPI_PARSER_CPDF_DOCUMENT_H_ + +#include +#include +#include +#include +#include + +#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfdoc/cpdf_linklist.h" +#include "core/fxcrt/fx_basic.h" + +class CFX_Font; +class CFX_Matrix; +class CPDF_ColorSpace; +class CPDF_DocPageData; +class CPDF_DocRenderData; +class CPDF_Font; +class CPDF_FontEncoding; +class CPDF_IccProfile; +class CPDF_Image; +class CPDF_LinearizedHeader; +class CPDF_Parser; +class CPDF_Pattern; +class CPDF_StreamAcc; +class JBig2_DocumentContext; + +#define FPDFPERM_PRINT 0x0004 +#define FPDFPERM_MODIFY 0x0008 +#define FPDFPERM_EXTRACT 0x0010 +#define FPDFPERM_ANNOT_FORM 0x0020 +#define FPDFPERM_FILL_FORM 0x0100 +#define FPDFPERM_EXTRACT_ACCESS 0x0200 +#define FPDFPERM_ASSEMBLE 0x0400 +#define FPDFPERM_PRINT_HIGH 0x0800 +#define FPDF_PAGE_MAX_NUM 0xFFFFF + +class CPDF_Document : public CPDF_IndirectObjectHolder { + public: + explicit CPDF_Document(std::unique_ptr pParser); + ~CPDF_Document() override; + + CPDF_Parser* GetParser() const { return m_pParser.get(); } + CPDF_Dictionary* GetRoot() const { return m_pRootDict; } + CPDF_Dictionary* GetInfo() const { return m_pInfoDict; } + + void DeletePage(int iPage); + int GetPageCount() const; + bool IsPageLoaded(int iPage) const; + CPDF_Dictionary* GetPage(int iPage); + int GetPageIndex(uint32_t objnum); + uint32_t GetUserPermissions() const; + CPDF_DocPageData* GetPageData() const { return m_pDocPage; } + + void SetPageObjNum(int iPage, uint32_t objNum); + + std::unique_ptr* CodecContext() { + return &m_pCodecContext; + } + std::unique_ptr* LinksContext() { return &m_pLinksContext; } + + CPDF_DocRenderData* GetRenderData() const { return m_pDocRender.get(); } + + // |pFontDict| must not be null. + CPDF_Font* LoadFont(CPDF_Dictionary* pFontDict); + CPDF_ColorSpace* LoadColorSpace(CPDF_Object* pCSObj, + CPDF_Dictionary* pResources = nullptr); + + CPDF_Pattern* LoadPattern(CPDF_Object* pObj, + bool bShading, + const CFX_Matrix& matrix); + + CPDF_Image* LoadImageFromPageData(uint32_t dwStreamObjNum); + CPDF_StreamAcc* LoadFontFile(CPDF_Stream* pStream); + CPDF_IccProfile* LoadIccProfile(CPDF_Stream* pStream); + + void LoadDoc(); + void LoadLinearizedDoc(const CPDF_LinearizedHeader* pLinearizationParams); + void LoadPages(); + + void CreateNewDoc(); + CPDF_Dictionary* CreateNewPage(int iPage); + + CPDF_Font* AddStandardFont(const FX_CHAR* font, CPDF_FontEncoding* pEncoding); + CPDF_Font* AddFont(CFX_Font* pFont, int charset, bool bVert); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + CPDF_Font* AddWindowsFont(LOGFONTA* pLogFont, + bool bVert, + bool bTranslateName = false); + CPDF_Font* AddWindowsFont(LOGFONTW* pLogFont, + bool bVert, + bool bTranslateName = false); +#endif + + protected: + // Retrieve page count information by getting count value from the tree nodes + int RetrievePageCount() const; + // When this method is called, m_pTreeTraversal[level] exists. + CPDF_Dictionary* TraversePDFPages(int iPage, int* nPagesToGo, size_t level); + int FindPageIndex(CPDF_Dictionary* pNode, + uint32_t* skip_count, + uint32_t objnum, + int* index, + int level = 0); + std::unique_ptr ParseIndirectObject(uint32_t objnum) override; + void LoadDocInternal(); + size_t CalculateEncodingDict(int charset, CPDF_Dictionary* pBaseDict); + CPDF_Dictionary* GetPagesDict() const; + CPDF_Dictionary* ProcessbCJK( + CPDF_Dictionary* pBaseDict, + int charset, + bool bVert, + CFX_ByteString basefont, + std::function Insert); + bool InsertDeletePDFPage(CPDF_Dictionary* pPages, + int nPagesToGo, + CPDF_Dictionary* pPageDict, + bool bInsert, + std::set* pVisited); + bool InsertNewPage(int iPage, CPDF_Dictionary* pPageDict); + void ResetTraversal(); + + std::unique_ptr m_pParser; + CPDF_Dictionary* m_pRootDict; + CPDF_Dictionary* m_pInfoDict; + // Vector of pairs to know current position in the page tree. The index in the + // vector corresponds to the level being described. The pair contains a + // pointer to the dictionary being processed at the level, and an index of the + // of the child being processed within the dictionary's /Kids array. + std::vector> m_pTreeTraversal; + // Index of the next page that will be traversed from the page tree. + int m_iNextPageToTraverse; + bool m_bReachedMaxPageLevel; + bool m_bLinearized; + int m_iFirstPageNo; + uint32_t m_dwFirstPageObjNum; + // TODO(thestig): Figure out why this cannot be a std::unique_ptr. + CPDF_DocPageData* m_pDocPage; + std::unique_ptr m_pDocRender; + std::unique_ptr m_pCodecContext; + std::unique_ptr m_pLinksContext; + std::vector m_PageList; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_DOCUMENT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_document_unittest.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_document_unittest.cpp new file mode 100644 index 000000000000..4815ffba520d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_document_unittest.cpp @@ -0,0 +1,221 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_document.h" + +#include +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_boolean.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_linearized_header.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fxcrt/fx_memory.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/base/ptr_util.h" + +namespace { + +CPDF_Dictionary* CreatePageTreeNode(std::unique_ptr kids, + CPDF_Document* pDoc, + int count) { + CPDF_Array* pUnowned = pDoc->AddIndirectObject(std::move(kids))->AsArray(); + CPDF_Dictionary* pageNode = pDoc->NewIndirect(); + pageNode->SetNewFor("Type", "Pages", false); + pageNode->SetNewFor("Kids", pDoc, pUnowned->GetObjNum()); + pageNode->SetNewFor("Count", count); + for (size_t i = 0; i < pUnowned->GetCount(); i++) { + pUnowned->GetDictAt(i)->SetNewFor("Parent", pDoc, + pageNode->GetObjNum()); + } + return pageNode; +} + +std::unique_ptr CreateNumberedPage(size_t number) { + auto page = pdfium::MakeUnique(); + page->SetNewFor("Type", "Page", false); + page->SetNewFor("PageNumbering", static_cast(number)); + return page; +} + +class CPDF_TestDocumentForPages : public CPDF_Document { + public: + CPDF_TestDocumentForPages() : CPDF_Document(nullptr) { + // Set up test + auto zeroToTwo = pdfium::MakeUnique(); + zeroToTwo->AddNew( + this, AddIndirectObject(CreateNumberedPage(0))->GetObjNum()); + zeroToTwo->AddNew( + this, AddIndirectObject(CreateNumberedPage(1))->GetObjNum()); + zeroToTwo->AddNew( + this, AddIndirectObject(CreateNumberedPage(2))->GetObjNum()); + CPDF_Dictionary* branch1 = + CreatePageTreeNode(std::move(zeroToTwo), this, 3); + + auto zeroToThree = pdfium::MakeUnique(); + zeroToThree->AddNew(this, branch1->GetObjNum()); + zeroToThree->AddNew( + this, AddIndirectObject(CreateNumberedPage(3))->GetObjNum()); + CPDF_Dictionary* branch2 = + CreatePageTreeNode(std::move(zeroToThree), this, 4); + + auto fourFive = pdfium::MakeUnique(); + fourFive->AddNew( + this, AddIndirectObject(CreateNumberedPage(4))->GetObjNum()); + fourFive->AddNew( + this, AddIndirectObject(CreateNumberedPage(5))->GetObjNum()); + CPDF_Dictionary* branch3 = CreatePageTreeNode(std::move(fourFive), this, 2); + + auto justSix = pdfium::MakeUnique(); + justSix->AddNew( + this, AddIndirectObject(CreateNumberedPage(6))->GetObjNum()); + CPDF_Dictionary* branch4 = CreatePageTreeNode(std::move(justSix), this, 1); + + auto allPages = pdfium::MakeUnique(); + allPages->AddNew(this, branch2->GetObjNum()); + allPages->AddNew(this, branch3->GetObjNum()); + allPages->AddNew(this, branch4->GetObjNum()); + CPDF_Dictionary* pagesDict = + CreatePageTreeNode(std::move(allPages), this, 7); + + m_pOwnedRootDict = pdfium::MakeUnique(); + m_pOwnedRootDict->SetNewFor("Pages", this, + pagesDict->GetObjNum()); + m_pRootDict = m_pOwnedRootDict.get(); + m_PageList.resize(7); + } + + private: + std::unique_ptr m_pOwnedRootDict; +}; + +class CPDF_TestDocumentWithPageWithoutPageNum : public CPDF_Document { + public: + CPDF_TestDocumentWithPageWithoutPageNum() : CPDF_Document(nullptr) { + // Set up test + auto allPages = pdfium::MakeUnique(); + allPages->AddNew( + this, AddIndirectObject(CreateNumberedPage(0))->GetObjNum()); + allPages->AddNew( + this, AddIndirectObject(CreateNumberedPage(1))->GetObjNum()); + // Page without pageNum. + allPages->Add(CreateNumberedPage(2)); + CPDF_Dictionary* pagesDict = + CreatePageTreeNode(std::move(allPages), this, 3); + m_pOwnedRootDict = pdfium::MakeUnique(); + m_pOwnedRootDict->SetNewFor("Pages", this, + pagesDict->GetObjNum()); + m_pRootDict = m_pOwnedRootDict.get(); + m_PageList.resize(3); + } + + private: + std::unique_ptr m_pOwnedRootDict; +}; + +class TestLinearized : public CPDF_LinearizedHeader { + public: + explicit TestLinearized(CPDF_Dictionary* dict) + : CPDF_LinearizedHeader(dict) {} +}; +} // namespace + +class cpdf_document_test : public testing::Test { + public: + void SetUp() override { + CPDF_ModuleMgr* module_mgr = CPDF_ModuleMgr::Get(); + module_mgr->InitPageModule(); + } + void TearDown() override { CPDF_ModuleMgr::Destroy(); } +}; + +TEST_F(cpdf_document_test, GetPages) { + std::unique_ptr document = + pdfium::MakeUnique(); + for (int i = 0; i < 7; i++) { + CPDF_Dictionary* page = document->GetPage(i); + ASSERT_TRUE(page); + ASSERT_TRUE(page->KeyExist("PageNumbering")); + EXPECT_EQ(i, page->GetIntegerFor("PageNumbering")); + } + CPDF_Dictionary* page = document->GetPage(7); + EXPECT_FALSE(page); +} + +TEST_F(cpdf_document_test, GetPageWithoutObjNumTwice) { + std::unique_ptr document = + pdfium::MakeUnique(); + const CPDF_Dictionary* page = document->GetPage(2); + ASSERT_TRUE(page); + // This is page without obj num. + ASSERT_EQ(0ul, page->GetObjNum()); + const CPDF_Dictionary* second_call_page = document->GetPage(2); + EXPECT_TRUE(second_call_page); + EXPECT_EQ(page, second_call_page); +} + +TEST_F(cpdf_document_test, GetPagesReverseOrder) { + std::unique_ptr document = + pdfium::MakeUnique(); + for (int i = 6; i >= 0; i--) { + CPDF_Dictionary* page = document->GetPage(i); + ASSERT_TRUE(page); + ASSERT_TRUE(page->KeyExist("PageNumbering")); + EXPECT_EQ(i, page->GetIntegerFor("PageNumbering")); + } + CPDF_Dictionary* page = document->GetPage(7); + EXPECT_FALSE(page); +} + +TEST_F(cpdf_document_test, GetPagesInDisorder) { + std::unique_ptr document = + pdfium::MakeUnique(); + + CPDF_Dictionary* page = document->GetPage(1); + ASSERT_TRUE(page); + ASSERT_TRUE(page->KeyExist("PageNumbering")); + EXPECT_EQ(1, page->GetIntegerFor("PageNumbering")); + + page = document->GetPage(3); + ASSERT_TRUE(page); + ASSERT_TRUE(page->KeyExist("PageNumbering")); + EXPECT_EQ(3, page->GetIntegerFor("PageNumbering")); + + page = document->GetPage(7); + EXPECT_FALSE(page); + + page = document->GetPage(6); + ASSERT_TRUE(page); + ASSERT_TRUE(page->KeyExist("PageNumbering")); + EXPECT_EQ(6, page->GetIntegerFor("PageNumbering")); +} + +TEST_F(cpdf_document_test, UseCachedPageObjNumIfHaveNotPagesDict) { + // ObjNum can be added in CPDF_DataAvail::IsPageAvail, and PagesDict + // can be not exists in this case. + // (case, when hint table is used to page check in CPDF_DataAvail). + CPDF_Document document(pdfium::MakeUnique()); + auto dict = pdfium::MakeUnique(); + dict->SetNewFor("Linearized", true); + const int page_count = 100; + dict->SetNewFor("N", page_count); + TestLinearized linearized(dict.get()); + document.LoadLinearizedDoc(&linearized); + ASSERT_EQ(page_count, document.GetPageCount()); + CPDF_Object* page_stub = document.NewIndirect(); + const uint32_t obj_num = page_stub->GetObjNum(); + const int test_page_num = 33; + + EXPECT_FALSE(document.IsPageLoaded(test_page_num)); + EXPECT_EQ(nullptr, document.GetPage(test_page_num)); + + document.SetPageObjNum(test_page_num, obj_num); + EXPECT_TRUE(document.IsPageLoaded(test_page_num)); + EXPECT_EQ(page_stub, document.GetPage(test_page_num)); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_hint_tables.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_hint_tables.cpp new file mode 100644 index 000000000000..e000188e7d68 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_hint_tables.cpp @@ -0,0 +1,512 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_hint_tables.h" + +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_data_avail.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_linearized_header.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fxcrt/fx_safe_types.h" +#include "third_party/base/numerics/safe_conversions.h" + +namespace { + +bool CanReadFromBitStream(const CFX_BitStream* hStream, + const FX_SAFE_UINT32& bits) { + return bits.IsValid() && hStream->BitsRemaining() >= bits.ValueOrDie(); +} + +// Sanity check values from the page table header. The note in the PDF 1.7 +// reference for Table F.3 says the valid range is only 0 through 32. Though 0 +// is not useful either. +bool IsValidPageOffsetHintTableBitCount(uint32_t bits) { + return bits > 0 && bits <= 32; +} + +} // namespace + +CPDF_HintTables::CPDF_HintTables(CPDF_DataAvail* pDataAvail, + CPDF_LinearizedHeader* pLinearized) + : m_pDataAvail(pDataAvail), + m_pLinearized(pLinearized), + m_nFirstPageSharedObjs(0), + m_szFirstPageObjOffset(0) { + ASSERT(m_pLinearized); +} + +CPDF_HintTables::~CPDF_HintTables() {} + +uint32_t CPDF_HintTables::GetItemLength( + uint32_t index, + const std::vector& szArray) { + if (szArray.size() < 2 || index > szArray.size() - 2 || + szArray[index] > szArray[index + 1]) { + return 0; + } + return szArray[index + 1] - szArray[index]; +} + +bool CPDF_HintTables::ReadPageHintTable(CFX_BitStream* hStream) { + if (!hStream || hStream->IsEOF()) + return false; + + int nStreamOffset = ReadPrimaryHintStreamOffset(); + if (nStreamOffset < 0) + return false; + + int nStreamLen = ReadPrimaryHintStreamLength(); + if (nStreamLen < 1 || + !pdfium::base::IsValueInRangeForNumericType(nStreamLen)) { + return false; + } + + const uint32_t kHeaderSize = 288; + if (hStream->BitsRemaining() < kHeaderSize) + return false; + + // Item 1: The least number of objects in a page. + const uint32_t dwObjLeastNum = hStream->GetBits(32); + if (!dwObjLeastNum) + return false; + + // Item 2: The location of the first page's page object. + const uint32_t dwFirstObjLoc = hStream->GetBits(32); + if (dwFirstObjLoc > static_cast(nStreamOffset)) { + FX_SAFE_FILESIZE safeLoc = nStreamLen; + safeLoc += dwFirstObjLoc; + if (!safeLoc.IsValid()) + return false; + m_szFirstPageObjOffset = safeLoc.ValueOrDie(); + } else { + if (!pdfium::base::IsValueInRangeForNumericType(dwFirstObjLoc)) + return false; + m_szFirstPageObjOffset = dwFirstObjLoc; + } + + // Item 3: The number of bits needed to represent the difference + // between the greatest and least number of objects in a page. + const uint32_t dwDeltaObjectsBits = hStream->GetBits(16); + if (!IsValidPageOffsetHintTableBitCount(dwDeltaObjectsBits)) + return false; + + // Item 4: The least length of a page in bytes. + const uint32_t dwPageLeastLen = hStream->GetBits(32); + if (!dwPageLeastLen) + return false; + + // Item 5: The number of bits needed to represent the difference + // between the greatest and least length of a page, in bytes. + const uint32_t dwDeltaPageLenBits = hStream->GetBits(16); + if (!IsValidPageOffsetHintTableBitCount(dwDeltaPageLenBits)) + return false; + + // Skip Item 6, 7, 8, 9 total 96 bits. + hStream->SkipBits(96); + + // Item 10: The number of bits needed to represent the greatest + // number of shared object references. + const uint32_t dwSharedObjBits = hStream->GetBits(16); + if (!IsValidPageOffsetHintTableBitCount(dwSharedObjBits)) + return false; + + // Item 11: The number of bits needed to represent the numerically + // greatest shared object identifier used by the pages. + const uint32_t dwSharedIdBits = hStream->GetBits(16); + if (!IsValidPageOffsetHintTableBitCount(dwSharedIdBits)) + return false; + + // Item 12: The number of bits needed to represent the numerator of + // the fractional position for each shared object reference. For each + // shared object referenced from a page, there is an indication of + // where in the page's content stream the object is first referenced. + const uint32_t dwSharedNumeratorBits = hStream->GetBits(16); + if (!IsValidPageOffsetHintTableBitCount(dwSharedNumeratorBits)) + return false; + + // Item 13: Skip Item 13 which has 16 bits. + hStream->SkipBits(16); + + const int nPages = GetNumberOfPages(); + if (nPages < 1 || nPages >= FPDF_PAGE_MAX_NUM) + return false; + + const uint32_t dwPages = pdfium::base::checked_cast(nPages); + FX_SAFE_UINT32 required_bits = dwDeltaObjectsBits; + required_bits *= dwPages; + if (!CanReadFromBitStream(hStream, required_bits)) + return false; + + for (int i = 0; i < nPages; ++i) { + FX_SAFE_UINT32 safeDeltaObj = hStream->GetBits(dwDeltaObjectsBits); + safeDeltaObj += dwObjLeastNum; + if (!safeDeltaObj.IsValid()) + return false; + m_dwDeltaNObjsArray.push_back(safeDeltaObj.ValueOrDie()); + } + hStream->ByteAlign(); + + required_bits = dwDeltaPageLenBits; + required_bits *= dwPages; + if (!CanReadFromBitStream(hStream, required_bits)) + return false; + + std::vector dwPageLenArray; + for (int i = 0; i < nPages; ++i) { + FX_SAFE_UINT32 safePageLen = hStream->GetBits(dwDeltaPageLenBits); + safePageLen += dwPageLeastLen; + if (!safePageLen.IsValid()) + return false; + + dwPageLenArray.push_back(safePageLen.ValueOrDie()); + } + + int nOffsetE = GetEndOfFirstPageOffset(); + if (nOffsetE < 0) + return false; + + int nFirstPageNum = GetFirstPageNumber(); + if (nFirstPageNum < 0 || nFirstPageNum > std::numeric_limits::max() - 1) + return false; + + for (int i = 0; i < nPages; ++i) { + if (i == nFirstPageNum) { + m_szPageOffsetArray.push_back(m_szFirstPageObjOffset); + } else if (i == nFirstPageNum + 1) { + if (i == 1) { + m_szPageOffsetArray.push_back(nOffsetE); + } else { + m_szPageOffsetArray.push_back(m_szPageOffsetArray[i - 2] + + dwPageLenArray[i - 2]); + } + } else { + if (i == 0) { + m_szPageOffsetArray.push_back(nOffsetE); + } else { + m_szPageOffsetArray.push_back(m_szPageOffsetArray[i - 1] + + dwPageLenArray[i - 1]); + } + } + } + + m_szPageOffsetArray.push_back(m_szPageOffsetArray[nPages - 1] + + dwPageLenArray[nPages - 1]); + hStream->ByteAlign(); + + // Number of shared objects. + required_bits = dwSharedObjBits; + required_bits *= dwPages; + if (!CanReadFromBitStream(hStream, required_bits)) + return false; + + for (int i = 0; i < nPages; i++) + m_dwNSharedObjsArray.push_back(hStream->GetBits(dwSharedObjBits)); + hStream->ByteAlign(); + + // Array of identifiers, size = nshared_objects. + for (int i = 0; i < nPages; i++) { + required_bits = dwSharedIdBits; + required_bits *= m_dwNSharedObjsArray[i]; + if (!CanReadFromBitStream(hStream, required_bits)) + return false; + + for (uint32_t j = 0; j < m_dwNSharedObjsArray[i]; j++) + m_dwIdentifierArray.push_back(hStream->GetBits(dwSharedIdBits)); + } + hStream->ByteAlign(); + + for (int i = 0; i < nPages; i++) { + FX_SAFE_UINT32 safeSize = m_dwNSharedObjsArray[i]; + safeSize *= dwSharedNumeratorBits; + if (!CanReadFromBitStream(hStream, safeSize)) + return false; + + hStream->SkipBits(safeSize.ValueOrDie()); + } + hStream->ByteAlign(); + + FX_SAFE_UINT32 safeTotalPageLen = dwPages; + safeTotalPageLen *= dwDeltaPageLenBits; + if (!CanReadFromBitStream(hStream, safeTotalPageLen)) + return false; + + hStream->SkipBits(safeTotalPageLen.ValueOrDie()); + hStream->ByteAlign(); + return true; +} + +bool CPDF_HintTables::ReadSharedObjHintTable(CFX_BitStream* hStream, + uint32_t offset) { + if (!hStream || hStream->IsEOF()) + return false; + + int nStreamOffset = ReadPrimaryHintStreamOffset(); + int nStreamLen = ReadPrimaryHintStreamLength(); + if (nStreamOffset < 0 || nStreamLen < 1) + return false; + + FX_SAFE_UINT32 bit_offset = offset; + bit_offset *= 8; + if (!bit_offset.IsValid() || hStream->GetPos() > bit_offset.ValueOrDie()) + return false; + hStream->SkipBits((bit_offset - hStream->GetPos()).ValueOrDie()); + + const uint32_t kHeaderSize = 192; + if (hStream->BitsRemaining() < kHeaderSize) + return false; + + // Item 1: The object number of the first object in the shared objects + // section. + uint32_t dwFirstSharedObjNum = hStream->GetBits(32); + + // Item 2: The location of the first object in the shared objects section. + uint32_t dwFirstSharedObjLoc = hStream->GetBits(32); + if (dwFirstSharedObjLoc > static_cast(nStreamOffset)) + dwFirstSharedObjLoc += nStreamLen; + + // Item 3: The number of shared object entries for the first page. + m_nFirstPageSharedObjs = hStream->GetBits(32); + + // Item 4: The number of shared object entries for the shared objects + // section, including the number of shared object entries for the first page. + uint32_t dwSharedObjTotal = hStream->GetBits(32); + + // Item 5: The number of bits needed to represent the greatest number of + // objects in a shared object group. Skipped. + hStream->SkipBits(16); + + // Item 6: The least length of a shared object group in bytes. + uint32_t dwGroupLeastLen = hStream->GetBits(32); + + // Item 7: The number of bits needed to represent the difference between the + // greatest and least length of a shared object group, in bytes. + uint32_t dwDeltaGroupLen = hStream->GetBits(16); + + if (dwFirstSharedObjNum >= CPDF_Parser::kMaxObjectNumber || + m_nFirstPageSharedObjs >= CPDF_Parser::kMaxObjectNumber || + dwSharedObjTotal >= CPDF_Parser::kMaxObjectNumber) { + return false; + } + + int nFirstPageObjNum = GetFirstPageObjectNumber(); + if (nFirstPageObjNum < 0) + return false; + + uint32_t dwPrevObjLen = 0; + uint32_t dwCurObjLen = 0; + FX_SAFE_UINT32 required_bits = dwSharedObjTotal; + required_bits *= dwDeltaGroupLen; + if (!CanReadFromBitStream(hStream, required_bits)) + return false; + + for (uint32_t i = 0; i < dwSharedObjTotal; ++i) { + dwPrevObjLen = dwCurObjLen; + FX_SAFE_UINT32 safeObjLen = hStream->GetBits(dwDeltaGroupLen); + safeObjLen += dwGroupLeastLen; + if (!safeObjLen.IsValid()) + return false; + + dwCurObjLen = safeObjLen.ValueOrDie(); + if (i < m_nFirstPageSharedObjs) { + m_dwSharedObjNumArray.push_back(nFirstPageObjNum + i); + if (i == 0) + m_szSharedObjOffsetArray.push_back(m_szFirstPageObjOffset); + } else { + FX_SAFE_UINT32 safeObjNum = dwFirstSharedObjNum; + safeObjNum += i - m_nFirstPageSharedObjs; + if (!safeObjNum.IsValid()) + return false; + + m_dwSharedObjNumArray.push_back(safeObjNum.ValueOrDie()); + if (i == m_nFirstPageSharedObjs) { + FX_SAFE_FILESIZE safeLoc = dwFirstSharedObjLoc; + if (!safeLoc.IsValid()) + return false; + + m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie()); + } + } + + if (i != 0 && i != m_nFirstPageSharedObjs) { + FX_SAFE_FILESIZE safeLoc = dwPrevObjLen; + safeLoc += m_szSharedObjOffsetArray[i - 1]; + if (!safeLoc.IsValid()) + return false; + + m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie()); + } + } + + if (dwSharedObjTotal > 0) { + FX_SAFE_FILESIZE safeLoc = dwCurObjLen; + safeLoc += m_szSharedObjOffsetArray[dwSharedObjTotal - 1]; + if (!safeLoc.IsValid()) + return false; + + m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie()); + } + + hStream->ByteAlign(); + if (hStream->BitsRemaining() < dwSharedObjTotal) + return false; + + hStream->SkipBits(dwSharedObjTotal); + hStream->ByteAlign(); + return true; +} + +bool CPDF_HintTables::GetPagePos(uint32_t index, + FX_FILESIZE* szPageStartPos, + FX_FILESIZE* szPageLength, + uint32_t* dwObjNum) { + *szPageStartPos = m_szPageOffsetArray[index]; + *szPageLength = GetItemLength(index, m_szPageOffsetArray); + + int nFirstPageObjNum = GetFirstPageObjectNumber(); + if (nFirstPageObjNum < 0) + return false; + + int nFirstPageNum = GetFirstPageNumber(); + if (!pdfium::base::IsValueInRangeForNumericType(nFirstPageNum)) + return false; + + uint32_t dwFirstPageNum = static_cast(nFirstPageNum); + if (index == dwFirstPageNum) { + *dwObjNum = nFirstPageObjNum; + return true; + } + + // The object number of remaining pages starts from 1. + *dwObjNum = 1; + for (uint32_t i = 0; i < index; ++i) { + if (i == dwFirstPageNum) + continue; + *dwObjNum += m_dwDeltaNObjsArray[i]; + } + return true; +} + +CPDF_DataAvail::DocAvailStatus CPDF_HintTables::CheckPage( + uint32_t index, + CPDF_DataAvail::DownloadHints* pHints) { + if (!pHints) + return CPDF_DataAvail::DataError; + + int nFirstPageNum = GetFirstPageNumber(); + if (!pdfium::base::IsValueInRangeForNumericType(nFirstPageNum)) + return CPDF_DataAvail::DataError; + + if (index == static_cast(nFirstPageNum)) + return CPDF_DataAvail::DataAvailable; + + uint32_t dwLength = GetItemLength(index, m_szPageOffsetArray); + // If two pages have the same offset, it should be treated as an error. + if (!dwLength) + return CPDF_DataAvail::DataError; + + if (!m_pDataAvail->IsDataAvail(m_szPageOffsetArray[index], dwLength, pHints)) + return CPDF_DataAvail::DataNotAvailable; + + // Download data of shared objects in the page. + uint32_t offset = 0; + for (uint32_t i = 0; i < index; ++i) + offset += m_dwNSharedObjsArray[i]; + + int nFirstPageObjNum = GetFirstPageObjectNumber(); + if (nFirstPageObjNum < 0) + return CPDF_DataAvail::DataError; + + uint32_t dwIndex = 0; + uint32_t dwObjNum = 0; + for (uint32_t j = 0; j < m_dwNSharedObjsArray[index]; ++j) { + dwIndex = m_dwIdentifierArray[offset + j]; + if (dwIndex >= m_dwSharedObjNumArray.size()) + return CPDF_DataAvail::DataNotAvailable; + + dwObjNum = m_dwSharedObjNumArray[dwIndex]; + if (dwObjNum >= static_cast(nFirstPageObjNum) && + dwObjNum < + static_cast(nFirstPageObjNum) + m_nFirstPageSharedObjs) { + continue; + } + + dwLength = GetItemLength(dwIndex, m_szSharedObjOffsetArray); + // If two objects have the same offset, it should be treated as an error. + if (!dwLength) + return CPDF_DataAvail::DataError; + + if (!m_pDataAvail->IsDataAvail(m_szSharedObjOffsetArray[dwIndex], dwLength, + pHints)) { + return CPDF_DataAvail::DataNotAvailable; + } + } + return CPDF_DataAvail::DataAvailable; +} + +bool CPDF_HintTables::LoadHintStream(CPDF_Stream* pHintStream) { + if (!pHintStream) + return false; + + CPDF_Dictionary* pDict = pHintStream->GetDict(); + CPDF_Object* pOffset = pDict ? pDict->GetObjectFor("S") : nullptr; + if (!pOffset || !pOffset->IsNumber()) + return false; + + int shared_hint_table_offset = pOffset->GetInteger(); + if (shared_hint_table_offset <= 0) + return false; + + CPDF_StreamAcc acc; + acc.LoadAllData(pHintStream); + + uint32_t size = acc.GetSize(); + // The header section of page offset hint table is 36 bytes. + // The header section of shared object hint table is 24 bytes. + // Hint table has at least 60 bytes. + const uint32_t kMinStreamLength = 60; + if (size < kMinStreamLength) + return false; + + FX_SAFE_UINT32 safe_shared_hint_table_offset = shared_hint_table_offset; + if (!safe_shared_hint_table_offset.IsValid() || + size < safe_shared_hint_table_offset.ValueOrDie()) { + return false; + } + + CFX_BitStream bs; + bs.Init(acc.GetData(), size); + return ReadPageHintTable(&bs) && + ReadSharedObjHintTable(&bs, shared_hint_table_offset); +} + +int CPDF_HintTables::GetEndOfFirstPageOffset() const { + return static_cast(m_pLinearized->GetFirstPageEndOffset()); +} + +int CPDF_HintTables::GetNumberOfPages() const { + return static_cast(m_pLinearized->GetPageCount()); +} + +int CPDF_HintTables::GetFirstPageObjectNumber() const { + return static_cast(m_pLinearized->GetFirstPageObjNum()); +} + +int CPDF_HintTables::GetFirstPageNumber() const { + return static_cast(m_pLinearized->GetFirstPageNo()); +} + +int CPDF_HintTables::ReadPrimaryHintStreamOffset() const { + return static_cast(m_pLinearized->GetHintStart()); +} + +int CPDF_HintTables::ReadPrimaryHintStreamLength() const { + return static_cast(m_pLinearized->GetHintLength()); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_hint_tables.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_hint_tables.h new file mode 100644 index 000000000000..e0bc6e075112 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_hint_tables.h @@ -0,0 +1,69 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_HINT_TABLES_H_ +#define CORE_FPDFAPI_PARSER_CPDF_HINT_TABLES_H_ + +#include + +#include "core/fpdfapi/parser/cpdf_data_avail.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_stream.h" + +class CFX_BitStream; +class CPDF_LinearizedHeader; +class CPDF_Stream; + +class CPDF_HintTables { + public: + CPDF_HintTables(CPDF_DataAvail* pDataAvail, + CPDF_LinearizedHeader* pLinearized); + virtual ~CPDF_HintTables(); + + bool GetPagePos(uint32_t index, + FX_FILESIZE* szPageStartPos, + FX_FILESIZE* szPageLength, + uint32_t* dwObjNum); + + CPDF_DataAvail::DocAvailStatus CheckPage( + uint32_t index, + CPDF_DataAvail::DownloadHints* pHints); + + bool LoadHintStream(CPDF_Stream* pHintStream); + + protected: + bool ReadPageHintTable(CFX_BitStream* hStream); + bool ReadSharedObjHintTable(CFX_BitStream* hStream, uint32_t offset); + + private: + // Tests can override. + virtual int GetEndOfFirstPageOffset() const; + virtual int GetNumberOfPages() const; + virtual int GetFirstPageObjectNumber() const; + virtual int GetFirstPageNumber() const; + virtual int ReadPrimaryHintStreamOffset() const; + virtual int ReadPrimaryHintStreamLength() const; + + uint32_t GetItemLength(uint32_t index, + const std::vector& szArray); + + // Owner, outlives this object. + CPDF_DataAvail* const m_pDataAvail; + + // Owned by |m_pDataAvail|. + CPDF_LinearizedHeader* const m_pLinearized; + + uint32_t m_nFirstPageSharedObjs; + FX_FILESIZE m_szFirstPageObjOffset; + std::vector m_dwDeltaNObjsArray; + std::vector m_dwNSharedObjsArray; + std::vector m_dwSharedObjNumArray; + std::vector m_dwIdentifierArray; + std::vector m_szPageOffsetArray; + std::vector m_szSharedObjOffsetArray; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_HINT_TABLES_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp new file mode 100644 index 000000000000..3037d0b9b5f8 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_indirect_object_holder.cpp @@ -0,0 +1,89 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h" + +#include +#include + +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "third_party/base/logging.h" + +CPDF_IndirectObjectHolder::CPDF_IndirectObjectHolder() + : m_LastObjNum(0), + m_pByteStringPool(pdfium::MakeUnique()) {} + +CPDF_IndirectObjectHolder::~CPDF_IndirectObjectHolder() { + m_pByteStringPool.DeleteObject(); // Make weak. +} + +CPDF_Object* CPDF_IndirectObjectHolder::GetIndirectObject( + uint32_t objnum) const { + auto it = m_IndirectObjs.find(objnum); + return it != m_IndirectObjs.end() ? it->second.get() : nullptr; +} + +CPDF_Object* CPDF_IndirectObjectHolder::GetOrParseIndirectObject( + uint32_t objnum) { + if (objnum == 0) + return nullptr; + + CPDF_Object* pObj = GetIndirectObject(objnum); + if (pObj) + return pObj->GetObjNum() != CPDF_Object::kInvalidObjNum ? pObj : nullptr; + + std::unique_ptr pNewObj = ParseIndirectObject(objnum); + if (!pNewObj) + return nullptr; + + pNewObj->m_ObjNum = objnum; + m_LastObjNum = std::max(m_LastObjNum, objnum); + m_IndirectObjs[objnum] = std::move(pNewObj); + return m_IndirectObjs[objnum].get(); +} + +std::unique_ptr CPDF_IndirectObjectHolder::ParseIndirectObject( + uint32_t objnum) { + return nullptr; +} + +CPDF_Object* CPDF_IndirectObjectHolder::AddIndirectObject( + std::unique_ptr pObj) { + CHECK(!pObj->m_ObjNum); + CPDF_Object* pUnowned = pObj.get(); + pObj->m_ObjNum = ++m_LastObjNum; + if (m_IndirectObjs[m_LastObjNum]) + m_OrphanObjs.push_back(std::move(m_IndirectObjs[m_LastObjNum])); + + m_IndirectObjs[m_LastObjNum] = std::move(pObj); + return pUnowned; +} + +bool CPDF_IndirectObjectHolder::ReplaceIndirectObjectIfHigherGeneration( + uint32_t objnum, + std::unique_ptr pObj) { + ASSERT(objnum); + if (!pObj) + return false; + + CPDF_Object* pOldObj = GetIndirectObject(objnum); + if (pOldObj && pObj->GetGenNum() <= pOldObj->GetGenNum()) + return false; + + pObj->m_ObjNum = objnum; + m_IndirectObjs[objnum] = std::move(pObj); + m_LastObjNum = std::max(m_LastObjNum, objnum); + return true; +} + +void CPDF_IndirectObjectHolder::DeleteIndirectObject(uint32_t objnum) { + CPDF_Object* pObj = GetIndirectObject(objnum); + if (!pObj || pObj->GetObjNum() == CPDF_Object::kInvalidObjNum) + return; + + m_IndirectObjs.erase(objnum); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_indirect_object_holder.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_indirect_object_holder.h new file mode 100644 index 000000000000..b6d33a3cd54b --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_indirect_object_holder.h @@ -0,0 +1,78 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_INDIRECT_OBJECT_HOLDER_H_ +#define CORE_FPDFAPI_PARSER_CPDF_INDIRECT_OBJECT_HOLDER_H_ + +#include +#include +#include +#include +#include + +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fxcrt/cfx_string_pool_template.h" +#include "core/fxcrt/cfx_weak_ptr.h" +#include "core/fxcrt/fx_system.h" +#include "third_party/base/ptr_util.h" + +class CPDF_IndirectObjectHolder { + public: + using const_iterator = + std::map>::const_iterator; + + CPDF_IndirectObjectHolder(); + virtual ~CPDF_IndirectObjectHolder(); + + CPDF_Object* GetIndirectObject(uint32_t objnum) const; + CPDF_Object* GetOrParseIndirectObject(uint32_t objnum); + void DeleteIndirectObject(uint32_t objnum); + + // Creates and adds a new object owned by the indirect object holder, + // and returns an unowned pointer to it. We have a special case to + // handle objects that can intern strings from our ByteStringPool. + template + typename std::enable_if::value, T*>::type NewIndirect( + Args&&... args) { + return static_cast( + AddIndirectObject(pdfium::MakeUnique(std::forward(args)...))); + } + template + typename std::enable_if::value, T*>::type NewIndirect( + Args&&... args) { + return static_cast(AddIndirectObject( + pdfium::MakeUnique(m_pByteStringPool, std::forward(args)...))); + } + + // Takes ownership of |pObj|, returns unowned pointer to it. + CPDF_Object* AddIndirectObject(std::unique_ptr pObj); + + // Always takes ownership of |pObj|, return true if higher generation number. + bool ReplaceIndirectObjectIfHigherGeneration( + uint32_t objnum, + std::unique_ptr pObj); + + uint32_t GetLastObjNum() const { return m_LastObjNum; } + void SetLastObjNum(uint32_t objnum) { m_LastObjNum = objnum; } + + CFX_WeakPtr GetByteStringPool() const { + return m_pByteStringPool; + } + + const_iterator begin() const { return m_IndirectObjs.begin(); } + const_iterator end() const { return m_IndirectObjs.end(); } + + protected: + virtual std::unique_ptr ParseIndirectObject(uint32_t objnum); + + private: + uint32_t m_LastObjNum; + std::map> m_IndirectObjs; + std::vector> m_OrphanObjs; + CFX_WeakPtr m_pByteStringPool; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_INDIRECT_OBJECT_HOLDER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_linearized_header.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_linearized_header.cpp new file mode 100644 index 000000000000..a56d64f2590f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_linearized_header.cpp @@ -0,0 +1,72 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_linearized_header.h" + +#include +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "third_party/base/ptr_util.h" + +namespace { + +template +bool IsValidNumericDictionaryValue(const CPDF_Dictionary* pDict, + const char* key, + T min_value, + bool must_exist = true) { + if (!pDict->KeyExist(key)) + return !must_exist; + const CPDF_Number* pNum = ToNumber(pDict->GetObjectFor(key)); + if (!pNum || !pNum->IsInteger()) + return false; + const int raw_value = pNum->GetInteger(); + if (!pdfium::base::IsValueInRangeForNumericType(raw_value)) + return false; + return static_cast(raw_value) >= min_value; +} + +} // namespace + +// static +std::unique_ptr CPDF_LinearizedHeader::CreateForObject( + std::unique_ptr pObj) { + auto pDict = ToDictionary(std::move(pObj)); + if (!pDict || !pDict->KeyExist("Linearized") || + !IsValidNumericDictionaryValue(pDict.get(), "L", 1) || + !IsValidNumericDictionaryValue(pDict.get(), "P", 0, false) || + !IsValidNumericDictionaryValue(pDict.get(), "T", 1) || + !IsValidNumericDictionaryValue(pDict.get(), "N", 0) || + !IsValidNumericDictionaryValue(pDict.get(), "E", 1) || + !IsValidNumericDictionaryValue(pDict.get(), "O", 1)) + return nullptr; + return pdfium::WrapUnique(new CPDF_LinearizedHeader(pDict.get())); +} + +CPDF_LinearizedHeader::CPDF_LinearizedHeader(const CPDF_Dictionary* pDict) { + m_szFileSize = pDict->GetIntegerFor("L"); + m_dwFirstPageNo = pDict->GetIntegerFor("P"); + m_szLastXRefOffset = pDict->GetIntegerFor("T"); + m_PageCount = pDict->GetIntegerFor("N"); + m_szFirstPageEndOffset = pDict->GetIntegerFor("E"); + m_FirstPageObjNum = pDict->GetIntegerFor("O"); + const CPDF_Array* pHintStreamRange = pDict->GetArrayFor("H"); + const size_t nHintStreamSize = + pHintStreamRange ? pHintStreamRange->GetCount() : 0; + if (nHintStreamSize == 2 || nHintStreamSize == 4) { + m_szHintStart = std::max(pHintStreamRange->GetIntegerAt(0), 0); + m_szHintLength = std::max(pHintStreamRange->GetIntegerAt(1), 0); + } +} + +CPDF_LinearizedHeader::~CPDF_LinearizedHeader() {} + +bool CPDF_LinearizedHeader::HasHintTable() const { + return GetPageCount() > 1 && GetHintStart() > 0 && GetHintLength() > 0; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_linearized_header.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_linearized_header.h new file mode 100644 index 000000000000..0d6d725f0050 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_linearized_header.h @@ -0,0 +1,55 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_LINEARIZED_HEADER_H_ +#define CORE_FPDFAPI_PARSER_CPDF_LINEARIZED_HEADER_H_ + +#include + +#include "core/fxcrt/fx_memory.h" +#include "core/fxcrt/fx_stream.h" + +class CPDF_Dictionary; +class CPDF_Object; + +class CPDF_LinearizedHeader { + public: + ~CPDF_LinearizedHeader(); + static std::unique_ptr CreateForObject( + std::unique_ptr pObj); + + // Will only return values > 0. + FX_FILESIZE GetFileSize() const { return m_szFileSize; } + uint32_t GetFirstPageNo() const { return m_dwFirstPageNo; } + // Will only return values > 0. + FX_FILESIZE GetLastXRefOffset() const { return m_szLastXRefOffset; } + uint32_t GetPageCount() const { return m_PageCount; } + // Will only return values > 0. + FX_FILESIZE GetFirstPageEndOffset() const { return m_szFirstPageEndOffset; } + // Will only return values > 0. + uint32_t GetFirstPageObjNum() const { return m_FirstPageObjNum; } + + bool HasHintTable() const; + // Will only return values > 0. + FX_FILESIZE GetHintStart() const { return m_szHintStart; } + // Will only return values > 0. + FX_FILESIZE GetHintLength() const { return m_szHintLength; } + + protected: + explicit CPDF_LinearizedHeader(const CPDF_Dictionary* pDict); + + private: + FX_FILESIZE m_szFileSize = 0; + uint32_t m_dwFirstPageNo = 0; + FX_FILESIZE m_szLastXRefOffset = 0; + uint32_t m_PageCount = 0; + FX_FILESIZE m_szFirstPageEndOffset = 0; + uint32_t m_FirstPageObjNum = 0; + FX_FILESIZE m_szHintStart = 0; + FX_FILESIZE m_szHintLength = 0; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_LINEARIZED_HEADER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_name.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_name.cpp new file mode 100644 index 000000000000..5be64d39d587 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_name.cpp @@ -0,0 +1,51 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_name.h" + +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "third_party/base/ptr_util.h" + +CPDF_Name::CPDF_Name(CFX_WeakPtr pPool, + const CFX_ByteString& str) + : m_Name(str) { + if (pPool) + m_Name = pPool->Intern(m_Name); +} + +CPDF_Name::~CPDF_Name() {} + +CPDF_Object::Type CPDF_Name::GetType() const { + return NAME; +} + +std::unique_ptr CPDF_Name::Clone() const { + return pdfium::MakeUnique(nullptr, m_Name); +} + +CFX_ByteString CPDF_Name::GetString() const { + return m_Name; +} + +void CPDF_Name::SetString(const CFX_ByteString& str) { + m_Name = str; +} + +bool CPDF_Name::IsName() const { + return true; +} + +CPDF_Name* CPDF_Name::AsName() { + return this; +} + +const CPDF_Name* CPDF_Name::AsName() const { + return this; +} + +CFX_WideString CPDF_Name::GetUnicodeText() const { + return PDF_DecodeText(m_Name); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_name.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_name.h new file mode 100644 index 000000000000..61318d4afbe1 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_name.h @@ -0,0 +1,43 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_NAME_H_ +#define CORE_FPDFAPI_PARSER_CPDF_NAME_H_ + +#include + +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fxcrt/cfx_string_pool_template.h" +#include "core/fxcrt/cfx_weak_ptr.h" + +class CPDF_Name : public CPDF_Object { + public: + CPDF_Name(CFX_WeakPtr pPool, const CFX_ByteString& str); + ~CPDF_Name() override; + + // CPDF_Object: + Type GetType() const override; + std::unique_ptr Clone() const override; + CFX_ByteString GetString() const override; + CFX_WideString GetUnicodeText() const override; + void SetString(const CFX_ByteString& str) override; + bool IsName() const override; + CPDF_Name* AsName() override; + const CPDF_Name* AsName() const override; + + protected: + CFX_ByteString m_Name; +}; + +inline CPDF_Name* ToName(CPDF_Object* obj) { + return obj ? obj->AsName() : nullptr; +} + +inline const CPDF_Name* ToName(const CPDF_Object* obj) { + return obj ? obj->AsName() : nullptr; +} + +#endif // CORE_FPDFAPI_PARSER_CPDF_NAME_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_null.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_null.cpp new file mode 100644 index 000000000000..41478d7b4c00 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_null.cpp @@ -0,0 +1,18 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_null.h" +#include "third_party/base/ptr_util.h" + +CPDF_Null::CPDF_Null() {} + +CPDF_Object::Type CPDF_Null::GetType() const { + return NULLOBJ; +} + +std::unique_ptr CPDF_Null::Clone() const { + return pdfium::MakeUnique(); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_null.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_null.h new file mode 100644 index 000000000000..4f8420f29dbd --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_null.h @@ -0,0 +1,23 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_NULL_H_ +#define CORE_FPDFAPI_PARSER_CPDF_NULL_H_ + +#include + +#include "core/fpdfapi/parser/cpdf_object.h" + +class CPDF_Null : public CPDF_Object { + public: + CPDF_Null(); + + // CPDF_Object. + Type GetType() const override; + std::unique_ptr Clone() const override; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_NULL_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_number.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_number.cpp new file mode 100644 index 000000000000..24feb2a2e058 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_number.cpp @@ -0,0 +1,57 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_number.h" +#include "third_party/base/ptr_util.h" + +CPDF_Number::CPDF_Number() : m_bInteger(true), m_Integer(0) {} + +CPDF_Number::CPDF_Number(int value) : m_bInteger(true), m_Integer(value) {} + +CPDF_Number::CPDF_Number(FX_FLOAT value) : m_bInteger(false), m_Float(value) {} + +CPDF_Number::CPDF_Number(const CFX_ByteStringC& str) + : m_bInteger(FX_atonum(str, &m_Integer)) {} + +CPDF_Number::~CPDF_Number() {} + +CPDF_Object::Type CPDF_Number::GetType() const { + return NUMBER; +} + +std::unique_ptr CPDF_Number::Clone() const { + return m_bInteger ? pdfium::MakeUnique(m_Integer) + : pdfium::MakeUnique(m_Float); +} + +FX_FLOAT CPDF_Number::GetNumber() const { + return m_bInteger ? static_cast(m_Integer) : m_Float; +} + +int CPDF_Number::GetInteger() const { + return m_bInteger ? m_Integer : static_cast(m_Float); +} + +bool CPDF_Number::IsNumber() const { + return true; +} + +CPDF_Number* CPDF_Number::AsNumber() { + return this; +} + +const CPDF_Number* CPDF_Number::AsNumber() const { + return this; +} + +void CPDF_Number::SetString(const CFX_ByteString& str) { + m_bInteger = FX_atonum(str.AsStringC(), &m_Integer); +} + +CFX_ByteString CPDF_Number::GetString() const { + return m_bInteger ? CFX_ByteString::FormatInteger(m_Integer, FXFORMAT_SIGNED) + : CFX_ByteString::FormatFloat(m_Float); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_number.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_number.h new file mode 100644 index 000000000000..85a78e5f1a70 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_number.h @@ -0,0 +1,53 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_NUMBER_H_ +#define CORE_FPDFAPI_PARSER_CPDF_NUMBER_H_ + +#include + +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Number : public CPDF_Object { + public: + CPDF_Number(); + explicit CPDF_Number(int value); + explicit CPDF_Number(FX_FLOAT value); + explicit CPDF_Number(const CFX_ByteStringC& str); + ~CPDF_Number() override; + + // CPDF_Object: + Type GetType() const override; + std::unique_ptr Clone() const override; + CFX_ByteString GetString() const override; + FX_FLOAT GetNumber() const override; + int GetInteger() const override; + void SetString(const CFX_ByteString& str) override; + bool IsNumber() const override; + CPDF_Number* AsNumber() override; + const CPDF_Number* AsNumber() const override; + + bool IsInteger() const { return m_bInteger; } + + protected: + bool m_bInteger; + union { + int m_Integer; + FX_FLOAT m_Float; + }; +}; + +inline CPDF_Number* ToNumber(CPDF_Object* obj) { + return obj ? obj->AsNumber() : nullptr; +} + +inline const CPDF_Number* ToNumber(const CPDF_Object* obj) { + return obj ? obj->AsNumber() : nullptr; +} + +#endif // CORE_FPDFAPI_PARSER_CPDF_NUMBER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_object.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_object.cpp new file mode 100644 index 000000000000..acda334c9ef9 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_object.cpp @@ -0,0 +1,159 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_object.h" + +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fxcrt/fx_string.h" +#include "third_party/base/stl_util.h" + +CPDF_Object::~CPDF_Object() {} + +CPDF_Object* CPDF_Object::GetDirect() const { + return const_cast(this); +} + +std::unique_ptr CPDF_Object::CloneObjectNonCyclic( + bool bDirect) const { + std::set visited_objs; + return CloneNonCyclic(bDirect, &visited_objs); +} + +std::unique_ptr CPDF_Object::CloneDirectObject() const { + return CloneObjectNonCyclic(true); +} + +std::unique_ptr CPDF_Object::CloneNonCyclic( + bool bDirect, + std::set* pVisited) const { + return Clone(); +} + +CFX_ByteString CPDF_Object::GetString() const { + return CFX_ByteString(); +} + +CFX_WideString CPDF_Object::GetUnicodeText() const { + return CFX_WideString(); +} + +FX_FLOAT CPDF_Object::GetNumber() const { + return 0; +} + +int CPDF_Object::GetInteger() const { + return 0; +} + +CPDF_Dictionary* CPDF_Object::GetDict() const { + return nullptr; +} + +void CPDF_Object::SetString(const CFX_ByteString& str) { + ASSERT(false); +} + +bool CPDF_Object::IsArray() const { + return false; +} + +bool CPDF_Object::IsBoolean() const { + return false; +} + +bool CPDF_Object::IsDictionary() const { + return false; +} + +bool CPDF_Object::IsName() const { + return false; +} + +bool CPDF_Object::IsNumber() const { + return false; +} + +bool CPDF_Object::IsReference() const { + return false; +} + +bool CPDF_Object::IsStream() const { + return false; +} + +bool CPDF_Object::IsString() const { + return false; +} + +CPDF_Array* CPDF_Object::AsArray() { + return nullptr; +} + +const CPDF_Array* CPDF_Object::AsArray() const { + return nullptr; +} + +CPDF_Boolean* CPDF_Object::AsBoolean() { + return nullptr; +} + +const CPDF_Boolean* CPDF_Object::AsBoolean() const { + return nullptr; +} + +CPDF_Dictionary* CPDF_Object::AsDictionary() { + return nullptr; +} + +const CPDF_Dictionary* CPDF_Object::AsDictionary() const { + return nullptr; +} + +CPDF_Name* CPDF_Object::AsName() { + return nullptr; +} + +const CPDF_Name* CPDF_Object::AsName() const { + return nullptr; +} + +CPDF_Number* CPDF_Object::AsNumber() { + return nullptr; +} + +const CPDF_Number* CPDF_Object::AsNumber() const { + return nullptr; +} + +CPDF_Reference* CPDF_Object::AsReference() { + return nullptr; +} + +const CPDF_Reference* CPDF_Object::AsReference() const { + return nullptr; +} + +CPDF_Stream* CPDF_Object::AsStream() { + return nullptr; +} + +const CPDF_Stream* CPDF_Object::AsStream() const { + return nullptr; +} + +CPDF_String* CPDF_Object::AsString() { + return nullptr; +} + +const CPDF_String* CPDF_Object::AsString() const { + return nullptr; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_object.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_object.h new file mode 100644 index 000000000000..f6bc5b444f4c --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_object.h @@ -0,0 +1,128 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_OBJECT_H_ +#define CORE_FPDFAPI_PARSER_CPDF_OBJECT_H_ + +#include +#include +#include + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Array; +class CPDF_Boolean; +class CPDF_Dictionary; +class CPDF_Name; +class CPDF_Null; +class CPDF_Number; +class CPDF_Reference; +class CPDF_Stream; +class CPDF_String; + +class CPDF_Object { + public: + static const uint32_t kInvalidObjNum = static_cast(-1); + enum Type { + BOOLEAN = 1, + NUMBER, + STRING, + NAME, + ARRAY, + DICTIONARY, + STREAM, + NULLOBJ, + REFERENCE + }; + + virtual ~CPDF_Object(); + + virtual Type GetType() const = 0; + uint32_t GetObjNum() const { return m_ObjNum; } + uint32_t GetGenNum() const { return m_GenNum; } + bool IsInline() const { return m_ObjNum == 0; } + + // Create a deep copy of the object. + virtual std::unique_ptr Clone() const = 0; + + // Create a deep copy of the object except any reference object be + // copied to the object it points to directly. + virtual std::unique_ptr CloneDirectObject() const; + + virtual CPDF_Object* GetDirect() const; + virtual CFX_ByteString GetString() const; + virtual CFX_WideString GetUnicodeText() const; + virtual FX_FLOAT GetNumber() const; + virtual int GetInteger() const; + virtual CPDF_Dictionary* GetDict() const; + + virtual void SetString(const CFX_ByteString& str); + + virtual bool IsArray() const; + virtual bool IsBoolean() const; + virtual bool IsDictionary() const; + virtual bool IsName() const; + virtual bool IsNumber() const; + virtual bool IsReference() const; + virtual bool IsStream() const; + virtual bool IsString() const; + + virtual CPDF_Array* AsArray(); + virtual const CPDF_Array* AsArray() const; + virtual CPDF_Boolean* AsBoolean(); + virtual const CPDF_Boolean* AsBoolean() const; + virtual CPDF_Dictionary* AsDictionary(); + virtual const CPDF_Dictionary* AsDictionary() const; + virtual CPDF_Name* AsName(); + virtual const CPDF_Name* AsName() const; + virtual CPDF_Number* AsNumber(); + virtual const CPDF_Number* AsNumber() const; + virtual CPDF_Reference* AsReference(); + virtual const CPDF_Reference* AsReference() const; + virtual CPDF_Stream* AsStream(); + virtual const CPDF_Stream* AsStream() const; + virtual CPDF_String* AsString(); + virtual const CPDF_String* AsString() const; + + protected: + friend class CPDF_Array; + friend class CPDF_Dictionary; + friend class CPDF_IndirectObjectHolder; + friend class CPDF_Parser; + friend class CPDF_Reference; + friend class CPDF_Stream; + + CPDF_Object() : m_ObjNum(0), m_GenNum(0) {} + + std::unique_ptr CloneObjectNonCyclic(bool bDirect) const; + + // Create a deep copy of the object with the option to either + // copy a reference object or directly copy the object it refers to + // when |bDirect| is true. + // Also check cyclic reference against |pVisited|, no copy if it is found. + // Complex objects should implement their own CloneNonCyclic() + // function to properly check for possible loop. + virtual std::unique_ptr CloneNonCyclic( + bool bDirect, + std::set* pVisited) const; + + uint32_t m_ObjNum; + uint32_t m_GenNum; + + private: + CPDF_Object(const CPDF_Object& src) {} +}; + +template +struct CanInternStrings { + static const bool value = std::is_same::value || + std::is_same::value || + std::is_same::value || + std::is_same::value; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_OBJECT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_object_unittest.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_object_unittest.cpp new file mode 100644 index 000000000000..927b1064745a --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_object_unittest.cpp @@ -0,0 +1,880 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_boolean.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_null.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" + +#include +#include +#include +#include + +#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h" +#include "core/fxcrt/fx_basic.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +void TestArrayAccessors(const CPDF_Array* arr, + size_t index, + const char* str_val, + const char* const_str_val, + int int_val, + float float_val, + CPDF_Array* arr_val, + CPDF_Dictionary* dict_val, + CPDF_Stream* stream_val) { + EXPECT_STREQ(str_val, arr->GetStringAt(index).c_str()); + EXPECT_EQ(int_val, arr->GetIntegerAt(index)); + EXPECT_EQ(float_val, arr->GetNumberAt(index)); + EXPECT_EQ(float_val, arr->GetFloatAt(index)); + EXPECT_EQ(arr_val, arr->GetArrayAt(index)); + EXPECT_EQ(dict_val, arr->GetDictAt(index)); + EXPECT_EQ(stream_val, arr->GetStreamAt(index)); +} + +} // namespace + +class PDFObjectsTest : public testing::Test { + public: + void SetUp() override { + // Initialize different kinds of objects. + // Boolean objects. + CPDF_Boolean* boolean_false_obj = new CPDF_Boolean(false); + CPDF_Boolean* boolean_true_obj = new CPDF_Boolean(true); + // Number objects. + CPDF_Number* number_int_obj = new CPDF_Number(1245); + CPDF_Number* number_float_obj = new CPDF_Number(9.00345f); + // String objects. + CPDF_String* str_reg_obj = new CPDF_String(nullptr, L"A simple test"); + CPDF_String* str_spec_obj = new CPDF_String(nullptr, L"\t\n"); + // Name object. + CPDF_Name* name_obj = new CPDF_Name(nullptr, "space"); + // Array object. + m_ArrayObj = new CPDF_Array; + m_ArrayObj->InsertNewAt(0, 8902); + m_ArrayObj->InsertNewAt(1, "address"); + // Dictionary object. + m_DictObj = new CPDF_Dictionary(); + m_DictObj->SetNewFor("bool", false); + m_DictObj->SetNewFor("num", 0.23f); + // Stream object. + const char content[] = "abcdefghijklmnopqrstuvwxyz"; + size_t buf_len = FX_ArraySize(content); + std::unique_ptr buf(FX_Alloc(uint8_t, buf_len)); + memcpy(buf.get(), content, buf_len); + auto pNewDict = pdfium::MakeUnique(); + m_StreamDictObj = pNewDict.get(); + m_StreamDictObj->SetNewFor("key1", L" test dict"); + m_StreamDictObj->SetNewFor("key2", -1); + CPDF_Stream* stream_obj = + new CPDF_Stream(std::move(buf), buf_len, std::move(pNewDict)); + // Null Object. + CPDF_Null* null_obj = new CPDF_Null; + // All direct objects. + CPDF_Object* objs[] = {boolean_false_obj, boolean_true_obj, number_int_obj, + number_float_obj, str_reg_obj, str_spec_obj, + name_obj, m_ArrayObj, m_DictObj, + stream_obj, null_obj}; + m_DirectObjTypes = { + CPDF_Object::BOOLEAN, CPDF_Object::BOOLEAN, CPDF_Object::NUMBER, + CPDF_Object::NUMBER, CPDF_Object::STRING, CPDF_Object::STRING, + CPDF_Object::NAME, CPDF_Object::ARRAY, CPDF_Object::DICTIONARY, + CPDF_Object::STREAM, CPDF_Object::NULLOBJ}; + for (size_t i = 0; i < FX_ArraySize(objs); ++i) + m_DirectObjs.emplace_back(objs[i]); + + // Indirect references to indirect objects. + m_ObjHolder = pdfium::MakeUnique(); + m_IndirectObjs = {m_ObjHolder->AddIndirectObject(boolean_true_obj->Clone()), + m_ObjHolder->AddIndirectObject(number_int_obj->Clone()), + m_ObjHolder->AddIndirectObject(str_spec_obj->Clone()), + m_ObjHolder->AddIndirectObject(name_obj->Clone()), + m_ObjHolder->AddIndirectObject(m_ArrayObj->Clone()), + m_ObjHolder->AddIndirectObject(m_DictObj->Clone()), + m_ObjHolder->AddIndirectObject(stream_obj->Clone())}; + for (CPDF_Object* pObj : m_IndirectObjs) { + m_RefObjs.emplace_back( + new CPDF_Reference(m_ObjHolder.get(), pObj->GetObjNum())); + } + } + + bool Equal(const CPDF_Object* obj1, const CPDF_Object* obj2) { + if (obj1 == obj2) + return true; + if (!obj1 || !obj2 || obj1->GetType() != obj2->GetType()) + return false; + switch (obj1->GetType()) { + case CPDF_Object::BOOLEAN: + return obj1->GetInteger() == obj2->GetInteger(); + case CPDF_Object::NUMBER: + return obj1->AsNumber()->IsInteger() == obj2->AsNumber()->IsInteger() && + obj1->GetInteger() == obj2->GetInteger(); + case CPDF_Object::STRING: + case CPDF_Object::NAME: + return obj1->GetString() == obj2->GetString(); + case CPDF_Object::ARRAY: { + const CPDF_Array* array1 = obj1->AsArray(); + const CPDF_Array* array2 = obj2->AsArray(); + if (array1->GetCount() != array2->GetCount()) + return false; + for (size_t i = 0; i < array1->GetCount(); ++i) { + if (!Equal(array1->GetObjectAt(i), array2->GetObjectAt(i))) + return false; + } + return true; + } + case CPDF_Object::DICTIONARY: { + const CPDF_Dictionary* dict1 = obj1->AsDictionary(); + const CPDF_Dictionary* dict2 = obj2->AsDictionary(); + if (dict1->GetCount() != dict2->GetCount()) + return false; + for (CPDF_Dictionary::const_iterator it = dict1->begin(); + it != dict1->end(); ++it) { + if (!Equal(it->second.get(), dict2->GetObjectFor(it->first))) + return false; + } + return true; + } + case CPDF_Object::NULLOBJ: + return true; + case CPDF_Object::STREAM: { + const CPDF_Stream* stream1 = obj1->AsStream(); + const CPDF_Stream* stream2 = obj2->AsStream(); + if (!stream1->GetDict() && !stream2->GetDict()) + return true; + // Compare dictionaries. + if (!Equal(stream1->GetDict(), stream2->GetDict())) + return false; + // Compare sizes. + if (stream1->GetRawSize() != stream2->GetRawSize()) + return false; + // Compare contents. + // Since this function is used for testing Clone(), only memory based + // streams need to be handled. + if (!stream1->IsMemoryBased() || !stream2->IsMemoryBased()) + return false; + return FXSYS_memcmp(stream1->GetRawData(), stream2->GetRawData(), + stream1->GetRawSize()) == 0; + } + case CPDF_Object::REFERENCE: + return obj1->AsReference()->GetRefObjNum() == + obj2->AsReference()->GetRefObjNum(); + } + return false; + } + + protected: + // m_ObjHolder needs to be declared first and destructed last since it also + // refers to some objects in m_DirectObjs. + std::unique_ptr m_ObjHolder; + std::vector> m_DirectObjs; + std::vector m_DirectObjTypes; + std::vector> m_RefObjs; + CPDF_Dictionary* m_DictObj; + CPDF_Dictionary* m_StreamDictObj; + CPDF_Array* m_ArrayObj; + std::vector m_IndirectObjs; +}; + +TEST_F(PDFObjectsTest, GetString) { + const char* const direct_obj_results[] = { + "false", "true", "1245", "9.00345", "A simple test", "\t\n", "space", + "", "", "", ""}; + // Check for direct objects. + for (size_t i = 0; i < m_DirectObjs.size(); ++i) + EXPECT_STREQ(direct_obj_results[i], m_DirectObjs[i]->GetString().c_str()); + + // Check indirect references. + const char* const indirect_obj_results[] = {"true", "1245", "\t\n", "space", + "", "", ""}; + for (size_t i = 0; i < m_RefObjs.size(); ++i) { + EXPECT_STREQ(indirect_obj_results[i], m_RefObjs[i]->GetString().c_str()); + } +} + +TEST_F(PDFObjectsTest, GetUnicodeText) { + const wchar_t* const direct_obj_results[] = { + L"", L"", L"", L"", L"A simple test", + L"\t\n", L"space", L"", L"", L"abcdefghijklmnopqrstuvwxyz", + L""}; + // Check for direct objects. + for (size_t i = 0; i < m_DirectObjs.size(); ++i) { + EXPECT_STREQ(direct_obj_results[i], + m_DirectObjs[i]->GetUnicodeText().c_str()); + } + + // Check indirect references. + for (const auto& it : m_RefObjs) + EXPECT_STREQ(L"", it->GetUnicodeText().c_str()); +} + +TEST_F(PDFObjectsTest, GetNumber) { + const FX_FLOAT direct_obj_results[] = {0, 0, 1245, 9.00345f, 0, 0, + 0, 0, 0, 0, 0}; + // Check for direct objects. + for (size_t i = 0; i < m_DirectObjs.size(); ++i) + EXPECT_EQ(direct_obj_results[i], m_DirectObjs[i]->GetNumber()); + + // Check indirect references. + const FX_FLOAT indirect_obj_results[] = {0, 1245, 0, 0, 0, 0, 0}; + for (size_t i = 0; i < m_RefObjs.size(); ++i) + EXPECT_EQ(indirect_obj_results[i], m_RefObjs[i]->GetNumber()); +} + +TEST_F(PDFObjectsTest, GetInteger) { + const int direct_obj_results[] = {0, 1, 1245, 9, 0, 0, 0, 0, 0, 0, 0}; + // Check for direct objects. + for (size_t i = 0; i < m_DirectObjs.size(); ++i) + EXPECT_EQ(direct_obj_results[i], m_DirectObjs[i]->GetInteger()); + + // Check indirect references. + const int indirect_obj_results[] = {1, 1245, 0, 0, 0, 0, 0}; + for (size_t i = 0; i < m_RefObjs.size(); ++i) + EXPECT_EQ(indirect_obj_results[i], m_RefObjs[i]->GetInteger()); +} + +TEST_F(PDFObjectsTest, GetDict) { + const CPDF_Dictionary* const direct_obj_results[] = { + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, m_DictObj, m_StreamDictObj, nullptr}; + // Check for direct objects. + for (size_t i = 0; i < m_DirectObjs.size(); ++i) + EXPECT_EQ(direct_obj_results[i], m_DirectObjs[i]->GetDict()); + + // Check indirect references. + const CPDF_Dictionary* const indirect_obj_results[] = { + nullptr, nullptr, nullptr, nullptr, nullptr, m_DictObj, m_StreamDictObj}; + for (size_t i = 0; i < m_RefObjs.size(); ++i) + EXPECT_TRUE(Equal(indirect_obj_results[i], m_RefObjs[i]->GetDict())); +} + +TEST_F(PDFObjectsTest, GetArray) { + const CPDF_Array* const direct_obj_results[] = { + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, m_ArrayObj, nullptr, nullptr, nullptr}; + // Check for direct objects. + for (size_t i = 0; i < m_DirectObjs.size(); ++i) + EXPECT_EQ(direct_obj_results[i], m_DirectObjs[i]->AsArray()); + + // Check indirect references. + for (const auto& it : m_RefObjs) + EXPECT_EQ(nullptr, it->AsArray()); +} + +TEST_F(PDFObjectsTest, Clone) { + // Check for direct objects. + for (size_t i = 0; i < m_DirectObjs.size(); ++i) { + std::unique_ptr obj = m_DirectObjs[i]->Clone(); + EXPECT_TRUE(Equal(m_DirectObjs[i].get(), obj.get())); + } + + // Check indirect references. + for (const auto& it : m_RefObjs) { + std::unique_ptr obj = it->Clone(); + EXPECT_TRUE(Equal(it.get(), obj.get())); + } +} + +TEST_F(PDFObjectsTest, GetType) { + // Check for direct objects. + for (size_t i = 0; i < m_DirectObjs.size(); ++i) + EXPECT_EQ(m_DirectObjTypes[i], m_DirectObjs[i]->GetType()); + + // Check indirect references. + for (const auto& it : m_RefObjs) + EXPECT_EQ(CPDF_Object::REFERENCE, it->GetType()); +} + +TEST_F(PDFObjectsTest, GetDirect) { + // Check for direct objects. + for (size_t i = 0; i < m_DirectObjs.size(); ++i) + EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->GetDirect()); + + // Check indirect references. + for (size_t i = 0; i < m_RefObjs.size(); ++i) + EXPECT_EQ(m_IndirectObjs[i], m_RefObjs[i]->GetDirect()); +} + +TEST_F(PDFObjectsTest, SetString) { + // Check for direct objects. + const char* const set_values[] = {"true", "fake", "3.125f", "097", + "changed", "", "NewName"}; + const char* const expected[] = {"true", "false", "3.125", "97", + "changed", "", "NewName"}; + for (size_t i = 0; i < FX_ArraySize(set_values); ++i) { + m_DirectObjs[i]->SetString(set_values[i]); + EXPECT_STREQ(expected[i], m_DirectObjs[i]->GetString().c_str()); + } +} + +TEST_F(PDFObjectsTest, IsTypeAndAsType) { + // Check for direct objects. + for (size_t i = 0; i < m_DirectObjs.size(); ++i) { + if (m_DirectObjTypes[i] == CPDF_Object::ARRAY) { + EXPECT_TRUE(m_DirectObjs[i]->IsArray()); + EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsArray()); + } else { + EXPECT_FALSE(m_DirectObjs[i]->IsArray()); + EXPECT_EQ(nullptr, m_DirectObjs[i]->AsArray()); + } + + if (m_DirectObjTypes[i] == CPDF_Object::BOOLEAN) { + EXPECT_TRUE(m_DirectObjs[i]->IsBoolean()); + EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsBoolean()); + } else { + EXPECT_FALSE(m_DirectObjs[i]->IsBoolean()); + EXPECT_EQ(nullptr, m_DirectObjs[i]->AsBoolean()); + } + + if (m_DirectObjTypes[i] == CPDF_Object::NAME) { + EXPECT_TRUE(m_DirectObjs[i]->IsName()); + EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsName()); + } else { + EXPECT_FALSE(m_DirectObjs[i]->IsName()); + EXPECT_EQ(nullptr, m_DirectObjs[i]->AsName()); + } + + if (m_DirectObjTypes[i] == CPDF_Object::NUMBER) { + EXPECT_TRUE(m_DirectObjs[i]->IsNumber()); + EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsNumber()); + } else { + EXPECT_FALSE(m_DirectObjs[i]->IsNumber()); + EXPECT_EQ(nullptr, m_DirectObjs[i]->AsNumber()); + } + + if (m_DirectObjTypes[i] == CPDF_Object::STRING) { + EXPECT_TRUE(m_DirectObjs[i]->IsString()); + EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsString()); + } else { + EXPECT_FALSE(m_DirectObjs[i]->IsString()); + EXPECT_EQ(nullptr, m_DirectObjs[i]->AsString()); + } + + if (m_DirectObjTypes[i] == CPDF_Object::DICTIONARY) { + EXPECT_TRUE(m_DirectObjs[i]->IsDictionary()); + EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsDictionary()); + } else { + EXPECT_FALSE(m_DirectObjs[i]->IsDictionary()); + EXPECT_EQ(nullptr, m_DirectObjs[i]->AsDictionary()); + } + + if (m_DirectObjTypes[i] == CPDF_Object::STREAM) { + EXPECT_TRUE(m_DirectObjs[i]->IsStream()); + EXPECT_EQ(m_DirectObjs[i].get(), m_DirectObjs[i]->AsStream()); + } else { + EXPECT_FALSE(m_DirectObjs[i]->IsStream()); + EXPECT_EQ(nullptr, m_DirectObjs[i]->AsStream()); + } + + EXPECT_FALSE(m_DirectObjs[i]->IsReference()); + EXPECT_EQ(nullptr, m_DirectObjs[i]->AsReference()); + } + // Check indirect references. + for (size_t i = 0; i < m_RefObjs.size(); ++i) { + EXPECT_TRUE(m_RefObjs[i]->IsReference()); + EXPECT_EQ(m_RefObjs[i].get(), m_RefObjs[i]->AsReference()); + } +} + +TEST(PDFArrayTest, GetMatrix) { + float elems[][6] = {{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, + {1, 2, 3, 4, 5, 6}, + {2.3f, 4.05f, 3, -2, -3, 0.0f}, + {0.05f, 0.1f, 0.56f, 0.67f, 1.34f, 99.9f}}; + for (size_t i = 0; i < FX_ArraySize(elems); ++i) { + auto arr = pdfium::MakeUnique(); + CFX_Matrix matrix(elems[i][0], elems[i][1], elems[i][2], elems[i][3], + elems[i][4], elems[i][5]); + for (size_t j = 0; j < 6; ++j) + arr->AddNew(elems[i][j]); + CFX_Matrix arr_matrix = arr->GetMatrix(); + EXPECT_EQ(matrix.a, arr_matrix.a); + EXPECT_EQ(matrix.b, arr_matrix.b); + EXPECT_EQ(matrix.c, arr_matrix.c); + EXPECT_EQ(matrix.d, arr_matrix.d); + EXPECT_EQ(matrix.e, arr_matrix.e); + EXPECT_EQ(matrix.f, arr_matrix.f); + } +} + +TEST(PDFArrayTest, GetRect) { + float elems[][4] = {{0.0f, 0.0f, 0.0f, 0.0f}, + {1, 2, 5, 6}, + {2.3f, 4.05f, -3, 0.0f}, + {0.05f, 0.1f, 1.34f, 99.9f}}; + for (size_t i = 0; i < FX_ArraySize(elems); ++i) { + auto arr = pdfium::MakeUnique(); + CFX_FloatRect rect(elems[i]); + for (size_t j = 0; j < 4; ++j) + arr->AddNew(elems[i][j]); + CFX_FloatRect arr_rect = arr->GetRect(); + EXPECT_EQ(rect.left, arr_rect.left); + EXPECT_EQ(rect.right, arr_rect.right); + EXPECT_EQ(rect.bottom, arr_rect.bottom); + EXPECT_EQ(rect.top, arr_rect.top); + } +} + +TEST(PDFArrayTest, GetTypeAt) { + { + // Boolean array. + const bool vals[] = {true, false, false, true, true}; + auto arr = pdfium::MakeUnique(); + for (size_t i = 0; i < FX_ArraySize(vals); ++i) + arr->InsertNewAt(i, vals[i]); + for (size_t i = 0; i < FX_ArraySize(vals); ++i) { + TestArrayAccessors(arr.get(), i, // Array and index. + vals[i] ? "true" : "false", // String value. + nullptr, // Const string value. + vals[i] ? 1 : 0, // Integer value. + 0, // Float value. + nullptr, // Array value. + nullptr, // Dictionary value. + nullptr); // Stream value. + } + } + { + // Integer array. + const int vals[] = {10, 0, -345, 2089345456, -1000000000, 567, 93658767}; + auto arr = pdfium::MakeUnique(); + for (size_t i = 0; i < FX_ArraySize(vals); ++i) + arr->InsertNewAt(i, vals[i]); + for (size_t i = 0; i < FX_ArraySize(vals); ++i) { + char buf[33]; + TestArrayAccessors(arr.get(), i, // Array and index. + FXSYS_itoa(vals[i], buf, 10), // String value. + nullptr, // Const string value. + vals[i], // Integer value. + vals[i], // Float value. + nullptr, // Array value. + nullptr, // Dictionary value. + nullptr); // Stream value. + } + } + { + // Float array. + const float vals[] = {0.0f, 0, 10, 10.0f, 0.0345f, + 897.34f, -2.5f, -1.0f, -345.0f, -0.0f}; + const char* const expected_str[] = { + "0", "0", "10", "10", "0.0345", "897.34", "-2.5", "-1", "-345", "0"}; + auto arr = pdfium::MakeUnique(); + for (size_t i = 0; i < FX_ArraySize(vals); ++i) + arr->InsertNewAt(i, vals[i]); + for (size_t i = 0; i < FX_ArraySize(vals); ++i) { + TestArrayAccessors(arr.get(), i, // Array and index. + expected_str[i], // String value. + nullptr, // Const string value. + vals[i], // Integer value. + vals[i], // Float value. + nullptr, // Array value. + nullptr, // Dictionary value. + nullptr); // Stream value. + } + } + { + // String and name array + const char* const vals[] = {"this", "adsde$%^", "\r\t", "\"012", + ".", "EYREW", "It is a joke :)"}; + std::unique_ptr string_array(new CPDF_Array); + std::unique_ptr name_array(new CPDF_Array); + for (size_t i = 0; i < FX_ArraySize(vals); ++i) { + string_array->InsertNewAt(i, vals[i], false); + name_array->InsertNewAt(i, vals[i]); + } + for (size_t i = 0; i < FX_ArraySize(vals); ++i) { + TestArrayAccessors(string_array.get(), i, // Array and index. + vals[i], // String value. + vals[i], // Const string value. + 0, // Integer value. + 0, // Float value. + nullptr, // Array value. + nullptr, // Dictionary value. + nullptr); // Stream value. + TestArrayAccessors(name_array.get(), i, // Array and index. + vals[i], // String value. + vals[i], // Const string value. + 0, // Integer value. + 0, // Float value. + nullptr, // Array value. + nullptr, // Dictionary value. + nullptr); // Stream value. + } + } + { + // Null element array. + auto arr = pdfium::MakeUnique(); + for (size_t i = 0; i < 3; ++i) + arr->InsertNewAt(i); + for (size_t i = 0; i < 3; ++i) { + TestArrayAccessors(arr.get(), i, // Array and index. + "", // String value. + nullptr, // Const string value. + 0, // Integer value. + 0, // Float value. + nullptr, // Array value. + nullptr, // Dictionary value. + nullptr); // Stream value. + } + } + { + // Array of array. + CPDF_Array* vals[3]; + auto arr = pdfium::MakeUnique(); + for (size_t i = 0; i < 3; ++i) { + vals[i] = arr->AddNew(); + for (size_t j = 0; j < 3; ++j) { + int value = j + 100; + vals[i]->InsertNewAt(i, value); + } + } + for (size_t i = 0; i < 3; ++i) { + TestArrayAccessors(arr.get(), i, // Array and index. + "", // String value. + nullptr, // Const string value. + 0, // Integer value. + 0, // Float value. + vals[i], // Array value. + nullptr, // Dictionary value. + nullptr); // Stream value. + } + } + { + // Dictionary array. + CPDF_Dictionary* vals[3]; + auto arr = pdfium::MakeUnique(); + for (size_t i = 0; i < 3; ++i) { + vals[i] = arr->AddNew(); + for (size_t j = 0; j < 3; ++j) { + std::string key("key"); + char buf[33]; + key.append(FXSYS_itoa(j, buf, 10)); + int value = j + 200; + vals[i]->SetNewFor(key.c_str(), value); + } + } + for (size_t i = 0; i < 3; ++i) { + TestArrayAccessors(arr.get(), i, // Array and index. + "", // String value. + nullptr, // Const string value. + 0, // Integer value. + 0, // Float value. + nullptr, // Array value. + vals[i], // Dictionary value. + nullptr); // Stream value. + } + } + { + // Stream array. + CPDF_Dictionary* vals[3]; + CPDF_Stream* stream_vals[3]; + auto arr = pdfium::MakeUnique(); + for (size_t i = 0; i < 3; ++i) { + vals[i] = new CPDF_Dictionary(); + for (size_t j = 0; j < 3; ++j) { + std::string key("key"); + char buf[33]; + key.append(FXSYS_itoa(j, buf, 10)); + int value = j + 200; + vals[i]->SetNewFor(key.c_str(), value); + } + uint8_t content[] = "content: this is a stream"; + size_t data_size = FX_ArraySize(content); + std::unique_ptr data( + FX_Alloc(uint8_t, data_size)); + memcpy(data.get(), content, data_size); + stream_vals[i] = arr->AddNew(std::move(data), data_size, + pdfium::WrapUnique(vals[i])); + } + for (size_t i = 0; i < 3; ++i) { + TestArrayAccessors(arr.get(), i, // Array and index. + "", // String value. + nullptr, // Const string value. + 0, // Integer value. + 0, // Float value. + nullptr, // Array value. + vals[i], // Dictionary value. + stream_vals[i]); // Stream value. + } + } + { + // Mixed array. + auto arr = pdfium::MakeUnique(); + arr->InsertNewAt(0, true); + arr->InsertNewAt(1, false); + arr->InsertNewAt(2, 0); + arr->InsertNewAt(3, -1234); + arr->InsertNewAt(4, 2345.0f); + arr->InsertNewAt(5, 0.05f); + arr->InsertNewAt(6, "", false); + arr->InsertNewAt(7, "It is a test!", false); + arr->InsertNewAt(8, "NAME"); + arr->InsertNewAt(9, "test"); + arr->InsertNewAt(10); + + CPDF_Array* arr_val = arr->InsertNewAt(11); + arr_val->AddNew(1); + arr_val->AddNew(2); + + CPDF_Dictionary* dict_val = arr->InsertNewAt(12); + dict_val->SetNewFor("key1", "Linda", false); + dict_val->SetNewFor("key2", "Zoe", false); + + CPDF_Dictionary* stream_dict = new CPDF_Dictionary(); + stream_dict->SetNewFor("key1", "John", false); + stream_dict->SetNewFor("key2", "King", false); + uint8_t data[] = "A stream for test"; + // The data buffer will be owned by stream object, so it needs to be + // dynamically allocated. + size_t buf_size = sizeof(data); + std::unique_ptr buf(FX_Alloc(uint8_t, buf_size)); + memcpy(buf.get(), data, buf_size); + CPDF_Stream* stream_val = arr->InsertNewAt( + 13, std::move(buf), buf_size, pdfium::WrapUnique(stream_dict)); + const char* const expected_str[] = { + "true", "false", "0", "-1234", "2345", "0.05", "", + "It is a test!", "NAME", "test", "", "", "", ""}; + const int expected_int[] = {1, 0, 0, -1234, 2345, 0, 0, + 0, 0, 0, 0, 0, 0, 0}; + const float expected_float[] = {0, 0, 0, -1234, 2345, 0.05f, 0, + 0, 0, 0, 0, 0, 0, 0}; + for (size_t i = 0; i < arr->GetCount(); ++i) { + EXPECT_STREQ(expected_str[i], arr->GetStringAt(i).c_str()); + EXPECT_EQ(expected_int[i], arr->GetIntegerAt(i)); + EXPECT_EQ(expected_float[i], arr->GetNumberAt(i)); + EXPECT_EQ(expected_float[i], arr->GetFloatAt(i)); + if (i == 11) + EXPECT_EQ(arr_val, arr->GetArrayAt(i)); + else + EXPECT_EQ(nullptr, arr->GetArrayAt(i)); + if (i == 13) { + EXPECT_EQ(stream_dict, arr->GetDictAt(i)); + EXPECT_EQ(stream_val, arr->GetStreamAt(i)); + } else { + EXPECT_EQ(nullptr, arr->GetStreamAt(i)); + if (i == 12) + EXPECT_EQ(dict_val, arr->GetDictAt(i)); + else + EXPECT_EQ(nullptr, arr->GetDictAt(i)); + } + } + } +} + +TEST(PDFArrayTest, AddNumber) { + float vals[] = {1.0f, -1.0f, 0, 0.456734f, + 12345.54321f, 0.5f, 1000, 0.000045f}; + auto arr = pdfium::MakeUnique(); + for (size_t i = 0; i < FX_ArraySize(vals); ++i) + arr->AddNew(vals[i]); + for (size_t i = 0; i < FX_ArraySize(vals); ++i) { + EXPECT_EQ(CPDF_Object::NUMBER, arr->GetObjectAt(i)->GetType()); + EXPECT_EQ(vals[i], arr->GetObjectAt(i)->GetNumber()); + } +} + +TEST(PDFArrayTest, AddInteger) { + int vals[] = {0, 1, 934435456, 876, 10000, -1, -24354656, -100}; + auto arr = pdfium::MakeUnique(); + for (size_t i = 0; i < FX_ArraySize(vals); ++i) + arr->AddNew(vals[i]); + for (size_t i = 0; i < FX_ArraySize(vals); ++i) { + EXPECT_EQ(CPDF_Object::NUMBER, arr->GetObjectAt(i)->GetType()); + EXPECT_EQ(vals[i], arr->GetObjectAt(i)->GetNumber()); + } +} + +TEST(PDFArrayTest, AddStringAndName) { + const char* vals[] = {"", "a", "ehjhRIOYTTFdfcdnv", "122323", + "$#%^&**", " ", "This is a test.\r\n"}; + std::unique_ptr string_array(new CPDF_Array); + std::unique_ptr name_array(new CPDF_Array); + for (size_t i = 0; i < FX_ArraySize(vals); ++i) { + string_array->AddNew(vals[i], false); + name_array->AddNew(vals[i]); + } + for (size_t i = 0; i < FX_ArraySize(vals); ++i) { + EXPECT_EQ(CPDF_Object::STRING, string_array->GetObjectAt(i)->GetType()); + EXPECT_STREQ(vals[i], string_array->GetObjectAt(i)->GetString().c_str()); + EXPECT_EQ(CPDF_Object::NAME, name_array->GetObjectAt(i)->GetType()); + EXPECT_STREQ(vals[i], name_array->GetObjectAt(i)->GetString().c_str()); + } +} + +TEST(PDFArrayTest, AddReferenceAndGetObjectAt) { + std::unique_ptr holder( + new CPDF_IndirectObjectHolder()); + CPDF_Boolean* boolean_obj = new CPDF_Boolean(true); + CPDF_Number* int_obj = new CPDF_Number(-1234); + CPDF_Number* float_obj = new CPDF_Number(2345.089f); + CPDF_String* str_obj = + new CPDF_String(nullptr, "Adsfdsf 343434 %&&*\n", false); + CPDF_Name* name_obj = new CPDF_Name(nullptr, "Title:"); + CPDF_Null* null_obj = new CPDF_Null(); + CPDF_Object* indirect_objs[] = {boolean_obj, int_obj, float_obj, + str_obj, name_obj, null_obj}; + unsigned int obj_nums[] = {2, 4, 7, 2345, 799887, 1}; + auto arr = pdfium::MakeUnique(); + std::unique_ptr arr1(new CPDF_Array); + // Create two arrays of references by different AddReference() APIs. + for (size_t i = 0; i < FX_ArraySize(indirect_objs); ++i) { + holder->ReplaceIndirectObjectIfHigherGeneration( + obj_nums[i], pdfium::WrapUnique(indirect_objs[i])); + arr->AddNew(holder.get(), obj_nums[i]); + arr1->AddNew(holder.get(), indirect_objs[i]->GetObjNum()); + } + // Check indirect objects. + for (size_t i = 0; i < FX_ArraySize(obj_nums); ++i) + EXPECT_EQ(indirect_objs[i], holder->GetOrParseIndirectObject(obj_nums[i])); + // Check arrays. + EXPECT_EQ(arr->GetCount(), arr1->GetCount()); + for (size_t i = 0; i < arr->GetCount(); ++i) { + EXPECT_EQ(CPDF_Object::REFERENCE, arr->GetObjectAt(i)->GetType()); + EXPECT_EQ(indirect_objs[i], arr->GetObjectAt(i)->GetDirect()); + EXPECT_EQ(indirect_objs[i], arr->GetDirectObjectAt(i)); + EXPECT_EQ(CPDF_Object::REFERENCE, arr1->GetObjectAt(i)->GetType()); + EXPECT_EQ(indirect_objs[i], arr1->GetObjectAt(i)->GetDirect()); + EXPECT_EQ(indirect_objs[i], arr1->GetDirectObjectAt(i)); + } +} + +TEST(PDFArrayTest, CloneDirectObject) { + CPDF_IndirectObjectHolder objects_holder; + std::unique_ptr array(new CPDF_Array); + array->AddNew(&objects_holder, 1234); + ASSERT_EQ(1U, array->GetCount()); + CPDF_Object* obj = array->GetObjectAt(0); + ASSERT_TRUE(obj); + EXPECT_TRUE(obj->IsReference()); + + std::unique_ptr cloned_array_object = array->CloneDirectObject(); + ASSERT_TRUE(cloned_array_object); + ASSERT_TRUE(cloned_array_object->IsArray()); + + std::unique_ptr cloned_array = + ToArray(std::move(cloned_array_object)); + ASSERT_EQ(1U, cloned_array->GetCount()); + CPDF_Object* cloned_obj = cloned_array->GetObjectAt(0); + EXPECT_FALSE(cloned_obj); +} + +TEST(PDFArrayTest, ConvertIndirect) { + CPDF_IndirectObjectHolder objects_holder; + auto array = pdfium::MakeUnique(); + CPDF_Object* pObj = array->AddNew(42); + array->ConvertToIndirectObjectAt(0, &objects_holder); + CPDF_Object* pRef = array->GetObjectAt(0); + CPDF_Object* pNum = array->GetDirectObjectAt(0); + EXPECT_TRUE(pRef->IsReference()); + EXPECT_TRUE(pNum->IsNumber()); + EXPECT_NE(pObj, pRef); + EXPECT_EQ(pObj, pNum); + EXPECT_EQ(42, array->GetIntegerAt(0)); +} + +TEST(PDFDictionaryTest, CloneDirectObject) { + CPDF_IndirectObjectHolder objects_holder; + std::unique_ptr dict(new CPDF_Dictionary()); + dict->SetNewFor("foo", &objects_holder, 1234); + ASSERT_EQ(1U, dict->GetCount()); + CPDF_Object* obj = dict->GetObjectFor("foo"); + ASSERT_TRUE(obj); + EXPECT_TRUE(obj->IsReference()); + + std::unique_ptr cloned_dict_object = dict->CloneDirectObject(); + ASSERT_TRUE(cloned_dict_object); + ASSERT_TRUE(cloned_dict_object->IsDictionary()); + + std::unique_ptr cloned_dict = + ToDictionary(std::move(cloned_dict_object)); + ASSERT_EQ(1U, cloned_dict->GetCount()); + CPDF_Object* cloned_obj = cloned_dict->GetObjectFor("foo"); + EXPECT_FALSE(cloned_obj); +} + +TEST(PDFObjectTest, CloneCheckLoop) { + { + // Create a dictionary/array pair with a reference loop. It takes + // some work to do this nowadays, in particular we need the + // anti-pattern pdfium::WrapUnique(arr.get()). + auto arr_obj = pdfium::MakeUnique(); + CPDF_Dictionary* dict_obj = arr_obj->InsertNewAt(0); + dict_obj->SetFor("arr", pdfium::WrapUnique(arr_obj.get())); + // Clone this object to see whether stack overflow will be triggered. + std::unique_ptr cloned_array = ToArray(arr_obj->Clone()); + // Cloned object should be the same as the original. + ASSERT_TRUE(cloned_array); + EXPECT_EQ(1u, cloned_array->GetCount()); + CPDF_Object* cloned_dict = cloned_array->GetObjectAt(0); + ASSERT_TRUE(cloned_dict); + ASSERT_TRUE(cloned_dict->IsDictionary()); + // Recursively referenced object is not cloned. + EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("arr")); + } + { + // Create a dictionary/stream pair with a reference loop. It takes + // some work to do this nowadays, in particular we need the + // anti-pattern pdfium::WrapUnique(dict.get()). + auto dict_obj = pdfium::MakeUnique(); + CPDF_Stream* stream_obj = dict_obj->SetNewFor( + "stream", nullptr, 0, pdfium::WrapUnique(dict_obj.get())); + // Clone this object to see whether stack overflow will be triggered. + std::unique_ptr cloned_stream = ToStream(stream_obj->Clone()); + // Cloned object should be the same as the original. + ASSERT_TRUE(cloned_stream); + CPDF_Object* cloned_dict = cloned_stream->GetDict(); + ASSERT_TRUE(cloned_dict); + ASSERT_TRUE(cloned_dict->IsDictionary()); + // Recursively referenced object is not cloned. + EXPECT_EQ(nullptr, cloned_dict->AsDictionary()->GetObjectFor("stream")); + } + { + CPDF_IndirectObjectHolder objects_holder; + // Create an object with a reference loop. + CPDF_Dictionary* dict_obj = objects_holder.NewIndirect(); + std::unique_ptr arr_obj = pdfium::MakeUnique(); + arr_obj->InsertNewAt(0, &objects_holder, + dict_obj->GetObjNum()); + CPDF_Object* elem0 = arr_obj->GetObjectAt(0); + dict_obj->SetFor("arr", std::move(arr_obj)); + EXPECT_EQ(1u, dict_obj->GetObjNum()); + ASSERT_TRUE(elem0); + ASSERT_TRUE(elem0->IsReference()); + EXPECT_EQ(1u, elem0->AsReference()->GetRefObjNum()); + EXPECT_EQ(dict_obj, elem0->AsReference()->GetDirect()); + + // Clone this object to see whether stack overflow will be triggered. + std::unique_ptr cloned_dict = + ToDictionary(dict_obj->CloneDirectObject()); + // Cloned object should be the same as the original. + ASSERT_TRUE(cloned_dict); + CPDF_Object* cloned_arr = cloned_dict->GetObjectFor("arr"); + ASSERT_TRUE(cloned_arr); + ASSERT_TRUE(cloned_arr->IsArray()); + EXPECT_EQ(1u, cloned_arr->AsArray()->GetCount()); + // Recursively referenced object is not cloned. + EXPECT_EQ(nullptr, cloned_arr->AsArray()->GetObjectAt(0)); + } +} + +TEST(PDFDictionaryTest, ConvertIndirect) { + CPDF_IndirectObjectHolder objects_holder; + std::unique_ptr dict(new CPDF_Dictionary); + CPDF_Object* pObj = dict->SetNewFor("clams", 42); + dict->ConvertToIndirectObjectFor("clams", &objects_holder); + CPDF_Object* pRef = dict->GetObjectFor("clams"); + CPDF_Object* pNum = dict->GetDirectObjectFor("clams"); + EXPECT_TRUE(pRef->IsReference()); + EXPECT_TRUE(pNum->IsNumber()); + EXPECT_NE(pObj, pRef); + EXPECT_EQ(pObj, pNum); + EXPECT_EQ(42, dict->GetIntegerFor("clams")); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser.cpp new file mode 100644 index 000000000000..f9d9eb3a979e --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser.cpp @@ -0,0 +1,1579 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_parser.h" + +#include +#include +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_crypto_handler.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_linearized_header.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_security_handler.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fpdfapi/parser/cpdf_syntax_parser.h" +#include "core/fpdfapi/parser/fpdf_parser_utility.h" +#include "core/fxcrt/fx_ext.h" +#include "core/fxcrt/fx_safe_types.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +namespace { + +// A limit on the size of the xref table. Theoretical limits are higher, but +// this may be large enough in practice. +const int32_t kMaxXRefSize = 1048576; + +uint32_t GetVarInt(const uint8_t* p, int32_t n) { + uint32_t result = 0; + for (int32_t i = 0; i < n; ++i) + result = result * 256 + p[i]; + return result; +} + +int32_t GetStreamNCount(CPDF_StreamAcc* pObjStream) { + return pObjStream->GetDict()->GetIntegerFor("N"); +} + +int32_t GetStreamFirst(CPDF_StreamAcc* pObjStream) { + return pObjStream->GetDict()->GetIntegerFor("First"); +} + +} // namespace + +CPDF_Parser::CPDF_Parser() + : m_pDocument(nullptr), + m_bHasParsed(false), + m_bXRefStream(false), + m_bVersionUpdated(false), + m_FileVersion(0), + m_pEncryptDict(nullptr), + m_dwXrefStartObjNum(0) { + m_pSyntax = pdfium::MakeUnique(); +} + +CPDF_Parser::~CPDF_Parser() { + ReleaseEncryptHandler(); + SetEncryptDictionary(nullptr); +} + +uint32_t CPDF_Parser::GetLastObjNum() const { + return m_ObjectInfo.empty() ? 0 : m_ObjectInfo.rbegin()->first; +} + +bool CPDF_Parser::IsValidObjectNumber(uint32_t objnum) const { + return !m_ObjectInfo.empty() && objnum <= m_ObjectInfo.rbegin()->first; +} + +FX_FILESIZE CPDF_Parser::GetObjectPositionOrZero(uint32_t objnum) const { + auto it = m_ObjectInfo.find(objnum); + return it != m_ObjectInfo.end() ? it->second.pos : 0; +} + +uint8_t CPDF_Parser::GetObjectType(uint32_t objnum) const { + ASSERT(IsValidObjectNumber(objnum)); + auto it = m_ObjectInfo.find(objnum); + return it != m_ObjectInfo.end() ? it->second.type : 0; +} + +uint16_t CPDF_Parser::GetObjectGenNum(uint32_t objnum) const { + ASSERT(IsValidObjectNumber(objnum)); + auto it = m_ObjectInfo.find(objnum); + return it != m_ObjectInfo.end() ? it->second.gennum : 0; +} + +bool CPDF_Parser::IsObjectFreeOrNull(uint32_t objnum) const { + uint8_t type = GetObjectType(objnum); + return type == 0 || type == 255; +} + +void CPDF_Parser::SetEncryptDictionary(CPDF_Dictionary* pDict) { + m_pEncryptDict = pDict; +} + +CPDF_CryptoHandler* CPDF_Parser::GetCryptoHandler() { + return m_pSyntax->m_pCryptoHandler.get(); +} + +CFX_RetainPtr CPDF_Parser::GetFileAccess() const { + return m_pSyntax->m_pFileAccess; +} + +void CPDF_Parser::ShrinkObjectMap(uint32_t objnum) { + if (objnum == 0) { + m_ObjectInfo.clear(); + return; + } + + auto it = m_ObjectInfo.lower_bound(objnum); + while (it != m_ObjectInfo.end()) { + auto saved_it = it++; + m_ObjectInfo.erase(saved_it); + } + + if (!pdfium::ContainsKey(m_ObjectInfo, objnum - 1)) + m_ObjectInfo[objnum - 1].pos = 0; +} + +CPDF_Parser::Error CPDF_Parser::StartParse( + const CFX_RetainPtr& pFileAccess, + CPDF_Document* pDocument) { + ASSERT(!m_bHasParsed); + m_bHasParsed = true; + m_bXRefStream = false; + m_LastXRefOffset = 0; + + int32_t offset = GetHeaderOffset(pFileAccess); + if (offset == -1) + return FORMAT_ERROR; + + m_pSyntax->InitParser(pFileAccess, offset); + + uint8_t ch; + if (!m_pSyntax->GetCharAt(5, ch)) + return FORMAT_ERROR; + + if (std::isdigit(ch)) + m_FileVersion = FXSYS_toDecimalDigit(static_cast(ch)) * 10; + + if (!m_pSyntax->GetCharAt(7, ch)) + return FORMAT_ERROR; + + if (std::isdigit(ch)) + m_FileVersion += FXSYS_toDecimalDigit(static_cast(ch)); + + if (m_pSyntax->m_FileLen < m_pSyntax->m_HeaderOffset + 9) + return FORMAT_ERROR; + + m_pSyntax->RestorePos(m_pSyntax->m_FileLen - m_pSyntax->m_HeaderOffset - 9); + m_pDocument = pDocument; + + bool bXRefRebuilt = false; + if (m_pSyntax->SearchWord("startxref", true, false, 4096)) { + m_SortedOffset.insert(m_pSyntax->SavePos()); + m_pSyntax->GetKeyword(); + + bool bNumber; + CFX_ByteString xrefpos_str = m_pSyntax->GetNextWord(&bNumber); + if (!bNumber) + return FORMAT_ERROR; + + m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str.c_str()); + if (!LoadAllCrossRefV4(m_LastXRefOffset) && + !LoadAllCrossRefV5(m_LastXRefOffset)) { + if (!RebuildCrossRef()) + return FORMAT_ERROR; + + bXRefRebuilt = true; + m_LastXRefOffset = 0; + } + } else { + if (!RebuildCrossRef()) + return FORMAT_ERROR; + + bXRefRebuilt = true; + } + Error eRet = SetEncryptHandler(); + if (eRet != SUCCESS) + return eRet; + + m_pDocument->LoadDoc(); + if (!m_pDocument->GetRoot() || m_pDocument->GetPageCount() == 0) { + if (bXRefRebuilt) + return FORMAT_ERROR; + + ReleaseEncryptHandler(); + if (!RebuildCrossRef()) + return FORMAT_ERROR; + + eRet = SetEncryptHandler(); + if (eRet != SUCCESS) + return eRet; + + m_pDocument->LoadDoc(); + if (!m_pDocument->GetRoot()) + return FORMAT_ERROR; + } + if (GetRootObjNum() == 0) { + ReleaseEncryptHandler(); + if (!RebuildCrossRef() || GetRootObjNum() == 0) + return FORMAT_ERROR; + + eRet = SetEncryptHandler(); + if (eRet != SUCCESS) + return eRet; + } + if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) { + CPDF_Reference* pMetadata = + ToReference(m_pDocument->GetRoot()->GetObjectFor("Metadata")); + if (pMetadata) + m_pSyntax->m_MetadataObjnum = pMetadata->GetRefObjNum(); + } + return SUCCESS; +} +CPDF_Parser::Error CPDF_Parser::SetEncryptHandler() { + ReleaseEncryptHandler(); + SetEncryptDictionary(nullptr); + + if (!m_pTrailer) + return FORMAT_ERROR; + + CPDF_Object* pEncryptObj = m_pTrailer->GetObjectFor("Encrypt"); + if (pEncryptObj) { + if (CPDF_Dictionary* pEncryptDict = pEncryptObj->AsDictionary()) { + SetEncryptDictionary(pEncryptDict); + } else if (CPDF_Reference* pRef = pEncryptObj->AsReference()) { + pEncryptObj = m_pDocument->GetOrParseIndirectObject(pRef->GetRefObjNum()); + if (pEncryptObj) + SetEncryptDictionary(pEncryptObj->GetDict()); + } + } + + if (m_pEncryptDict) { + CFX_ByteString filter = m_pEncryptDict->GetStringFor("Filter"); + std::unique_ptr pSecurityHandler; + Error err = HANDLER_ERROR; + if (filter == "Standard") { + pSecurityHandler = pdfium::MakeUnique(); + err = PASSWORD_ERROR; + } + if (!pSecurityHandler) + return HANDLER_ERROR; + + if (!pSecurityHandler->OnInit(this, m_pEncryptDict)) + return err; + + m_pSecurityHandler = std::move(pSecurityHandler); + std::unique_ptr pCryptoHandler( + m_pSecurityHandler->CreateCryptoHandler()); + if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler.get())) + return HANDLER_ERROR; + m_pSyntax->SetEncrypt(std::move(pCryptoHandler)); + } + return SUCCESS; +} + +void CPDF_Parser::ReleaseEncryptHandler() { + m_pSyntax->m_pCryptoHandler.reset(); + m_pSecurityHandler.reset(); +} + +FX_FILESIZE CPDF_Parser::GetObjectOffset(uint32_t objnum) const { + if (!IsValidObjectNumber(objnum)) + return 0; + + if (GetObjectType(objnum) == 1) + return GetObjectPositionOrZero(objnum); + + if (GetObjectType(objnum) == 2) { + FX_FILESIZE pos = GetObjectPositionOrZero(objnum); + return GetObjectPositionOrZero(pos); + } + return 0; +} + +// Ideally, all the cross reference entries should be verified. +// In reality, we rarely see well-formed cross references don't match +// with the objects. crbug/602650 showed a case where object numbers +// in the cross reference table are all off by one. +bool CPDF_Parser::VerifyCrossRefV4() { + for (const auto& it : m_ObjectInfo) { + if (it.second.pos == 0) + continue; + // Find the first non-zero position. + FX_FILESIZE SavedPos = m_pSyntax->SavePos(); + m_pSyntax->RestorePos(it.second.pos); + bool is_num = false; + CFX_ByteString num_str = m_pSyntax->GetNextWord(&is_num); + m_pSyntax->RestorePos(SavedPos); + if (!is_num || num_str.IsEmpty() || + FXSYS_atoui(num_str.c_str()) != it.first) { + // If the object number read doesn't match the one stored, + // something is wrong with the cross reference table. + return false; + } else { + return true; + } + } + return true; +} + +bool CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos) { + if (!LoadCrossRefV4(xrefpos, 0, true)) + return false; + + m_pTrailer = LoadTrailerV4(); + if (!m_pTrailer) + return false; + + int32_t xrefsize = GetDirectInteger(m_pTrailer.get(), "Size"); + if (xrefsize > 0 && xrefsize <= kMaxXRefSize) + ShrinkObjectMap(xrefsize); + + std::vector CrossRefList; + std::vector XRefStreamList; + std::set seen_xrefpos; + + CrossRefList.push_back(xrefpos); + XRefStreamList.push_back(GetDirectInteger(m_pTrailer.get(), "XRefStm")); + seen_xrefpos.insert(xrefpos); + + // When |m_pTrailer| doesn't have Prev entry or Prev entry value is not + // numerical, GetDirectInteger() returns 0. Loading will end. + xrefpos = GetDirectInteger(m_pTrailer.get(), "Prev"); + while (xrefpos) { + // Check for circular references. + if (pdfium::ContainsKey(seen_xrefpos, xrefpos)) + return false; + + seen_xrefpos.insert(xrefpos); + + // SLOW ... + CrossRefList.insert(CrossRefList.begin(), xrefpos); + LoadCrossRefV4(xrefpos, 0, true); + + std::unique_ptr pDict(LoadTrailerV4()); + if (!pDict) + return false; + + xrefpos = GetDirectInteger(pDict.get(), "Prev"); + + // SLOW ... + XRefStreamList.insert(XRefStreamList.begin(), + pDict->GetIntegerFor("XRefStm")); + m_Trailers.push_back(std::move(pDict)); + } + + for (size_t i = 0; i < CrossRefList.size(); ++i) { + if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], false)) + return false; + if (i == 0 && !VerifyCrossRefV4()) + return false; + } + return true; +} + +bool CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos, + uint32_t dwObjCount) { + if (!LoadLinearizedCrossRefV4(xrefpos, dwObjCount)) + return false; + + m_pTrailer = LoadTrailerV4(); + if (!m_pTrailer) + return false; + + int32_t xrefsize = GetDirectInteger(m_pTrailer.get(), "Size"); + if (xrefsize == 0) + return false; + + std::vector CrossRefList; + std::vector XRefStreamList; + std::set seen_xrefpos; + + CrossRefList.push_back(xrefpos); + XRefStreamList.push_back(GetDirectInteger(m_pTrailer.get(), "XRefStm")); + seen_xrefpos.insert(xrefpos); + + xrefpos = GetDirectInteger(m_pTrailer.get(), "Prev"); + while (xrefpos) { + // Check for circular references. + if (pdfium::ContainsKey(seen_xrefpos, xrefpos)) + return false; + + seen_xrefpos.insert(xrefpos); + + // SLOW ... + CrossRefList.insert(CrossRefList.begin(), xrefpos); + LoadCrossRefV4(xrefpos, 0, true); + + std::unique_ptr pDict(LoadTrailerV4()); + if (!pDict) + return false; + + xrefpos = GetDirectInteger(pDict.get(), "Prev"); + + // SLOW ... + XRefStreamList.insert(XRefStreamList.begin(), + pDict->GetIntegerFor("XRefStm")); + m_Trailers.push_back(std::move(pDict)); + } + + for (size_t i = 1; i < CrossRefList.size(); ++i) { + if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], false)) + return false; + } + return true; +} + +bool CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, + uint32_t dwObjCount) { + FX_FILESIZE dwStartPos = pos - m_pSyntax->m_HeaderOffset; + + m_pSyntax->RestorePos(dwStartPos); + m_SortedOffset.insert(pos); + + uint32_t start_objnum = 0; + uint32_t count = dwObjCount; + FX_FILESIZE SavedPos = m_pSyntax->SavePos(); + + const int32_t recordsize = 20; + std::vector buf(1024 * recordsize + 1); + buf[1024 * recordsize] = '\0'; + + int32_t nBlocks = count / 1024 + 1; + for (int32_t block = 0; block < nBlocks; block++) { + int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024; + uint32_t dwReadSize = block_size * recordsize; + if ((FX_FILESIZE)(dwStartPos + dwReadSize) > m_pSyntax->m_FileLen) + return false; + + if (!m_pSyntax->ReadBlock(reinterpret_cast(buf.data()), + dwReadSize)) { + return false; + } + + for (int32_t i = 0; i < block_size; i++) { + uint32_t objnum = start_objnum + block * 1024 + i; + char* pEntry = &buf[i * recordsize]; + if (pEntry[17] == 'f') { + m_ObjectInfo[objnum].pos = 0; + m_ObjectInfo[objnum].type = 0; + } else { + int32_t offset = FXSYS_atoi(pEntry); + if (offset == 0) { + for (int32_t c = 0; c < 10; c++) { + if (!std::isdigit(pEntry[c])) + return false; + } + } + + m_ObjectInfo[objnum].pos = offset; + int32_t version = FXSYS_atoi(pEntry + 11); + if (version >= 1) + m_bVersionUpdated = true; + + m_ObjectInfo[objnum].gennum = version; + if (m_ObjectInfo[objnum].pos < m_pSyntax->m_FileLen) + m_SortedOffset.insert(m_ObjectInfo[objnum].pos); + + m_ObjectInfo[objnum].type = 1; + } + } + } + m_pSyntax->RestorePos(SavedPos + count * recordsize); + return true; +} + +bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, + FX_FILESIZE streampos, + bool bSkip) { + m_pSyntax->RestorePos(pos); + if (m_pSyntax->GetKeyword() != "xref") + return false; + + m_SortedOffset.insert(pos); + if (streampos) + m_SortedOffset.insert(streampos); + + while (1) { + FX_FILESIZE SavedPos = m_pSyntax->SavePos(); + bool bIsNumber; + CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); + if (word.IsEmpty()) + return false; + + if (!bIsNumber) { + m_pSyntax->RestorePos(SavedPos); + break; + } + + uint32_t start_objnum = FXSYS_atoui(word.c_str()); + if (start_objnum >= kMaxObjectNumber) + return false; + + uint32_t count = m_pSyntax->GetDirectNum(); + m_pSyntax->ToNextWord(); + SavedPos = m_pSyntax->SavePos(); + const int32_t recordsize = 20; + + m_dwXrefStartObjNum = start_objnum; + if (!bSkip) { + std::vector buf(1024 * recordsize + 1); + buf[1024 * recordsize] = '\0'; + + int32_t nBlocks = count / 1024 + 1; + for (int32_t block = 0; block < nBlocks; block++) { + int32_t block_size = block == nBlocks - 1 ? count % 1024 : 1024; + m_pSyntax->ReadBlock(reinterpret_cast(buf.data()), + block_size * recordsize); + + for (int32_t i = 0; i < block_size; i++) { + uint32_t objnum = start_objnum + block * 1024 + i; + char* pEntry = &buf[i * recordsize]; + if (pEntry[17] == 'f') { + m_ObjectInfo[objnum].pos = 0; + m_ObjectInfo[objnum].type = 0; + } else { + FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry); + if (offset == 0) { + for (int32_t c = 0; c < 10; c++) { + if (!std::isdigit(pEntry[c])) + return false; + } + } + + m_ObjectInfo[objnum].pos = offset; + int32_t version = FXSYS_atoi(pEntry + 11); + if (version >= 1) + m_bVersionUpdated = true; + + m_ObjectInfo[objnum].gennum = version; + if (m_ObjectInfo[objnum].pos < m_pSyntax->m_FileLen) + m_SortedOffset.insert(m_ObjectInfo[objnum].pos); + + m_ObjectInfo[objnum].type = 1; + } + } + } + } + m_pSyntax->RestorePos(SavedPos + count * recordsize); + } + return !streampos || LoadCrossRefV5(&streampos, false); +} + +bool CPDF_Parser::LoadAllCrossRefV5(FX_FILESIZE xrefpos) { + if (!LoadCrossRefV5(&xrefpos, true)) + return false; + + std::set seen_xrefpos; + while (xrefpos) { + seen_xrefpos.insert(xrefpos); + if (!LoadCrossRefV5(&xrefpos, false)) + return false; + + // Check for circular references. + if (pdfium::ContainsKey(seen_xrefpos, xrefpos)) + return false; + } + m_ObjectStreamMap.clear(); + m_bXRefStream = true; + return true; +} + +bool CPDF_Parser::RebuildCrossRef() { + m_ObjectInfo.clear(); + m_SortedOffset.clear(); + m_pTrailer.reset(); + + ParserState state = ParserState::kDefault; + int32_t inside_index = 0; + uint32_t objnum = 0; + uint32_t gennum = 0; + int32_t depth = 0; + const uint32_t kBufferSize = 4096; + std::vector buffer(kBufferSize); + + FX_FILESIZE pos = m_pSyntax->m_HeaderOffset; + FX_FILESIZE start_pos = 0; + FX_FILESIZE start_pos1 = 0; + FX_FILESIZE last_obj = -1; + FX_FILESIZE last_xref = -1; + FX_FILESIZE last_trailer = -1; + + while (pos < m_pSyntax->m_FileLen) { + const FX_FILESIZE saved_pos = pos; + bool bOverFlow = false; + uint32_t size = + std::min((uint32_t)(m_pSyntax->m_FileLen - pos), kBufferSize); + if (!m_pSyntax->m_pFileAccess->ReadBlock(buffer.data(), pos, size)) + break; + + for (uint32_t i = 0; i < size; i++) { + uint8_t byte = buffer[i]; + switch (state) { + case ParserState::kDefault: + if (PDFCharIsWhitespace(byte)) { + state = ParserState::kWhitespace; + } else if (std::isdigit(byte)) { + --i; + state = ParserState::kWhitespace; + } else if (byte == '%') { + inside_index = 0; + state = ParserState::kComment; + } else if (byte == '(') { + state = ParserState::kString; + depth = 1; + } else if (byte == '<') { + inside_index = 1; + state = ParserState::kHexString; + } else if (byte == '\\') { + state = ParserState::kEscapedString; + } else if (byte == 't') { + state = ParserState::kTrailer; + inside_index = 1; + } + break; + + case ParserState::kWhitespace: + if (std::isdigit(byte)) { + start_pos = pos + i; + state = ParserState::kObjNum; + objnum = FXSYS_toDecimalDigit(static_cast(byte)); + } else if (byte == 't') { + state = ParserState::kTrailer; + inside_index = 1; + } else if (byte == 'x') { + state = ParserState::kXref; + inside_index = 1; + } else if (!PDFCharIsWhitespace(byte)) { + --i; + state = ParserState::kDefault; + } + break; + + case ParserState::kObjNum: + if (std::isdigit(byte)) { + objnum = + objnum * 10 + FXSYS_toDecimalDigit(static_cast(byte)); + } else if (PDFCharIsWhitespace(byte)) { + state = ParserState::kPostObjNum; + } else { + --i; + state = ParserState::kEndObj; + inside_index = 0; + } + break; + + case ParserState::kPostObjNum: + if (std::isdigit(byte)) { + start_pos1 = pos + i; + state = ParserState::kGenNum; + gennum = FXSYS_toDecimalDigit(static_cast(byte)); + } else if (byte == 't') { + state = ParserState::kTrailer; + inside_index = 1; + } else if (!PDFCharIsWhitespace(byte)) { + --i; + state = ParserState::kDefault; + } + break; + + case ParserState::kGenNum: + if (std::isdigit(byte)) { + gennum = + gennum * 10 + FXSYS_toDecimalDigit(static_cast(byte)); + } else if (PDFCharIsWhitespace(byte)) { + state = ParserState::kPostGenNum; + } else { + --i; + state = ParserState::kDefault; + } + break; + + case ParserState::kPostGenNum: + if (byte == 'o') { + state = ParserState::kBeginObj; + inside_index = 1; + } else if (std::isdigit(byte)) { + objnum = gennum; + gennum = FXSYS_toDecimalDigit(static_cast(byte)); + start_pos = start_pos1; + start_pos1 = pos + i; + state = ParserState::kGenNum; + } else if (byte == 't') { + state = ParserState::kTrailer; + inside_index = 1; + } else if (!PDFCharIsWhitespace(byte)) { + --i; + state = ParserState::kDefault; + } + break; + + case ParserState::kBeginObj: + switch (inside_index) { + case 1: + if (byte != 'b') { + --i; + state = ParserState::kDefault; + } else { + inside_index++; + } + break; + case 2: + if (byte != 'j') { + --i; + state = ParserState::kDefault; + } else { + inside_index++; + } + break; + case 3: + if (PDFCharIsWhitespace(byte) || PDFCharIsDelimiter(byte)) { + FX_FILESIZE obj_pos = start_pos - m_pSyntax->m_HeaderOffset; + m_SortedOffset.insert(obj_pos); + last_obj = start_pos; + FX_FILESIZE obj_end = 0; + std::unique_ptr pObject = + ParseIndirectObjectAtByStrict(m_pDocument, obj_pos, objnum, + &obj_end); + if (CPDF_Stream* pStream = ToStream(pObject.get())) { + if (CPDF_Dictionary* pDict = pStream->GetDict()) { + if ((pDict->KeyExist("Type")) && + (pDict->GetStringFor("Type") == "XRef" && + pDict->KeyExist("Size"))) { + CPDF_Object* pRoot = pDict->GetObjectFor("Root"); + if (pRoot && pRoot->GetDict() && + pRoot->GetDict()->GetObjectFor("Pages")) { + m_pTrailer = ToDictionary(pDict->Clone()); + } + } + } + } + + FX_FILESIZE offset = 0; + m_pSyntax->RestorePos(obj_pos); + offset = m_pSyntax->FindTag("obj", 0); + if (offset == -1) + offset = 0; + else + offset += 3; + + FX_FILESIZE nLen = obj_end - obj_pos - offset; + if ((uint32_t)nLen > size - i) { + pos = obj_end + m_pSyntax->m_HeaderOffset; + bOverFlow = true; + } else { + i += (uint32_t)nLen; + } + + if (!m_ObjectInfo.empty() && IsValidObjectNumber(objnum) && + m_ObjectInfo[objnum].pos) { + if (pObject) { + uint32_t oldgen = GetObjectGenNum(objnum); + m_ObjectInfo[objnum].pos = obj_pos; + m_ObjectInfo[objnum].gennum = gennum; + if (oldgen != gennum) + m_bVersionUpdated = true; + } + } else { + m_ObjectInfo[objnum].pos = obj_pos; + m_ObjectInfo[objnum].type = 1; + m_ObjectInfo[objnum].gennum = gennum; + } + } + --i; + state = ParserState::kDefault; + break; + } + break; + + case ParserState::kTrailer: + if (inside_index == 7) { + if (PDFCharIsWhitespace(byte) || PDFCharIsDelimiter(byte)) { + last_trailer = pos + i - 7; + m_pSyntax->RestorePos(pos + i - m_pSyntax->m_HeaderOffset); + + std::unique_ptr pObj = + m_pSyntax->GetObject(m_pDocument, 0, 0, true); + if (pObj) { + if (pObj->IsDictionary() || pObj->AsStream()) { + CPDF_Stream* pStream = pObj->AsStream(); + if (CPDF_Dictionary* pTrailer = + pStream ? pStream->GetDict() : pObj->AsDictionary()) { + if (m_pTrailer) { + CPDF_Object* pRoot = pTrailer->GetObjectFor("Root"); + CPDF_Reference* pRef = ToReference(pRoot); + if (!pRoot || + (pRef && IsValidObjectNumber(pRef->GetRefObjNum()) && + m_ObjectInfo[pRef->GetRefObjNum()].pos != 0)) { + auto it = pTrailer->begin(); + while (it != pTrailer->end()) { + const CFX_ByteString& key = it->first; + CPDF_Object* pElement = it->second.get(); + ++it; + uint32_t dwObjNum = + pElement ? pElement->GetObjNum() : 0; + if (dwObjNum) { + m_pTrailer->SetNewFor( + key, m_pDocument, dwObjNum); + } else { + m_pTrailer->SetFor(key, pElement->Clone()); + } + } + } + } else { + if (pObj->IsStream()) { + m_pTrailer = ToDictionary(pTrailer->Clone()); + } else { + m_pTrailer = ToDictionary(std::move(pObj)); + } + + FX_FILESIZE dwSavePos = m_pSyntax->SavePos(); + CFX_ByteString strWord = m_pSyntax->GetKeyword(); + if (!strWord.Compare("startxref")) { + bool bNumber; + CFX_ByteString bsOffset = + m_pSyntax->GetNextWord(&bNumber); + if (bNumber) + m_LastXRefOffset = FXSYS_atoi(bsOffset.c_str()); + } + m_pSyntax->RestorePos(dwSavePos); + } + } + } + } + } + --i; + state = ParserState::kDefault; + } else if (byte == "trailer"[inside_index]) { + inside_index++; + } else { + --i; + state = ParserState::kDefault; + } + break; + + case ParserState::kXref: + if (inside_index == 4) { + last_xref = pos + i - 4; + state = ParserState::kWhitespace; + } else if (byte == "xref"[inside_index]) { + inside_index++; + } else { + --i; + state = ParserState::kDefault; + } + break; + + case ParserState::kComment: + if (PDFCharIsLineEnding(byte)) + state = ParserState::kDefault; + break; + + case ParserState::kString: + if (byte == ')') { + if (depth > 0) + depth--; + } else if (byte == '(') { + depth++; + } + + if (!depth) + state = ParserState::kDefault; + break; + + case ParserState::kHexString: + if (byte == '>' || (byte == '<' && inside_index == 1)) + state = ParserState::kDefault; + inside_index = 0; + break; + + case ParserState::kEscapedString: + if (PDFCharIsDelimiter(byte) || PDFCharIsWhitespace(byte)) { + --i; + state = ParserState::kDefault; + } + break; + + case ParserState::kEndObj: + if (PDFCharIsWhitespace(byte)) { + state = ParserState::kDefault; + } else if (byte == '%' || byte == '(' || byte == '<' || + byte == '\\') { + state = ParserState::kDefault; + --i; + } else if (inside_index == 6) { + state = ParserState::kDefault; + --i; + } else if (byte == "endobj"[inside_index]) { + inside_index++; + } + break; + } + + if (bOverFlow) { + size = 0; + break; + } + } + pos += size; + + // If the position has not changed at all or went backwards in a loop + // iteration, then break out to prevent infinite looping. + if (pos <= saved_pos) + break; + } + + if (last_xref != -1 && last_xref > last_obj) + last_trailer = last_xref; + else if (last_trailer == -1 || last_xref < last_obj) + last_trailer = m_pSyntax->m_FileLen; + + m_SortedOffset.insert(last_trailer - m_pSyntax->m_HeaderOffset); + return m_pTrailer && !m_ObjectInfo.empty(); +} + +bool CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, bool bMainXRef) { + std::unique_ptr pObject( + ParseIndirectObjectAt(m_pDocument, *pos, 0)); + if (!pObject) + return false; + + uint32_t objnum = pObject->m_ObjNum; + if (!objnum) + return false; + + CPDF_Object* pUnownedObject = pObject.get(); + if (m_pDocument) { + CPDF_Dictionary* pRootDict = m_pDocument->GetRoot(); + if (pRootDict && pRootDict->GetObjNum() == objnum) + return false; + if (!m_pDocument->ReplaceIndirectObjectIfHigherGeneration( + objnum, std::move(pObject))) { + return false; + } + } + + CPDF_Stream* pStream = pUnownedObject->AsStream(); + if (!pStream) + return false; + + CPDF_Dictionary* pDict = pStream->GetDict(); + *pos = pDict->GetIntegerFor("Prev"); + int32_t size = pDict->GetIntegerFor("Size"); + if (size < 0) + return false; + + std::unique_ptr pNewTrailer = ToDictionary(pDict->Clone()); + if (bMainXRef) { + m_pTrailer = std::move(pNewTrailer); + ShrinkObjectMap(size); + for (auto& it : m_ObjectInfo) + it.second.type = 0; + } else { + m_Trailers.push_back(std::move(pNewTrailer)); + } + + std::vector> arrIndex; + CPDF_Array* pArray = pDict->GetArrayFor("Index"); + if (pArray) { + for (size_t i = 0; i < pArray->GetCount() / 2; i++) { + CPDF_Object* pStartNumObj = pArray->GetObjectAt(i * 2); + CPDF_Object* pCountObj = pArray->GetObjectAt(i * 2 + 1); + + if (ToNumber(pStartNumObj) && ToNumber(pCountObj)) { + int nStartNum = pStartNumObj->GetInteger(); + int nCount = pCountObj->GetInteger(); + if (nStartNum >= 0 && nCount > 0) + arrIndex.push_back(std::make_pair(nStartNum, nCount)); + } + } + } + + if (arrIndex.size() == 0) + arrIndex.push_back(std::make_pair(0, size)); + + pArray = pDict->GetArrayFor("W"); + if (!pArray) + return false; + + std::vector WidthArray; + FX_SAFE_UINT32 dwAccWidth = 0; + for (size_t i = 0; i < pArray->GetCount(); ++i) { + WidthArray.push_back(pArray->GetIntegerAt(i)); + dwAccWidth += WidthArray[i]; + } + + if (!dwAccWidth.IsValid() || WidthArray.size() < 3) + return false; + + uint32_t totalWidth = dwAccWidth.ValueOrDie(); + CPDF_StreamAcc acc; + acc.LoadAllData(pStream); + + const uint8_t* pData = acc.GetData(); + uint32_t dwTotalSize = acc.GetSize(); + uint32_t segindex = 0; + for (uint32_t i = 0; i < arrIndex.size(); i++) { + int32_t startnum = arrIndex[i].first; + if (startnum < 0) + continue; + + m_dwXrefStartObjNum = pdfium::base::checked_cast(startnum); + uint32_t count = pdfium::base::checked_cast(arrIndex[i].second); + FX_SAFE_UINT32 dwCaculatedSize = segindex; + dwCaculatedSize += count; + dwCaculatedSize *= totalWidth; + if (!dwCaculatedSize.IsValid() || + dwCaculatedSize.ValueOrDie() > dwTotalSize) { + continue; + } + + const uint8_t* segstart = pData + segindex * totalWidth; + FX_SAFE_UINT32 dwMaxObjNum = startnum; + dwMaxObjNum += count; + uint32_t dwV5Size = m_ObjectInfo.empty() ? 0 : GetLastObjNum() + 1; + if (!dwMaxObjNum.IsValid() || dwMaxObjNum.ValueOrDie() > dwV5Size) + continue; + + for (uint32_t j = 0; j < count; j++) { + int32_t type = 1; + const uint8_t* entrystart = segstart + j * totalWidth; + if (WidthArray[0]) + type = GetVarInt(entrystart, WidthArray[0]); + + if (GetObjectType(startnum + j) == 255) { + FX_FILESIZE offset = + GetVarInt(entrystart + WidthArray[0], WidthArray[1]); + m_ObjectInfo[startnum + j].pos = offset; + m_SortedOffset.insert(offset); + continue; + } + + if (GetObjectType(startnum + j)) + continue; + + m_ObjectInfo[startnum + j].type = type; + if (type == 0) { + m_ObjectInfo[startnum + j].pos = 0; + } else { + FX_FILESIZE offset = + GetVarInt(entrystart + WidthArray[0], WidthArray[1]); + m_ObjectInfo[startnum + j].pos = offset; + if (type == 1) { + m_SortedOffset.insert(offset); + } else { + if (offset < 0 || !IsValidObjectNumber(offset)) + return false; + m_ObjectInfo[offset].type = 255; + } + } + } + segindex += count; + } + return true; +} + +CPDF_Array* CPDF_Parser::GetIDArray() { + if (!m_pTrailer) + return nullptr; + + CPDF_Object* pID = m_pTrailer->GetObjectFor("ID"); + if (!pID) + return nullptr; + + CPDF_Reference* pRef = pID->AsReference(); + if (!pRef) + return ToArray(pID); + + std::unique_ptr pNewObj = + ParseIndirectObject(nullptr, pRef->GetRefObjNum()); + pID = pNewObj.get(); + m_pTrailer->SetFor("ID", std::move(pNewObj)); + return ToArray(pID); +} + +uint32_t CPDF_Parser::GetRootObjNum() { + CPDF_Reference* pRef = + ToReference(m_pTrailer ? m_pTrailer->GetObjectFor("Root") : nullptr); + return pRef ? pRef->GetRefObjNum() : 0; +} + +uint32_t CPDF_Parser::GetInfoObjNum() { + CPDF_Reference* pRef = + ToReference(m_pTrailer ? m_pTrailer->GetObjectFor("Info") : nullptr); + return pRef ? pRef->GetRefObjNum() : 0; +} + +std::unique_ptr CPDF_Parser::ParseIndirectObject( + CPDF_IndirectObjectHolder* pObjList, + uint32_t objnum) { + if (!IsValidObjectNumber(objnum)) + return nullptr; + + // Prevent circular parsing the same object. + if (pdfium::ContainsKey(m_ParsingObjNums, objnum)) + return nullptr; + + pdfium::ScopedSetInsertion local_insert(&m_ParsingObjNums, objnum); + if (GetObjectType(objnum) == 1 || GetObjectType(objnum) == 255) { + FX_FILESIZE pos = m_ObjectInfo[objnum].pos; + if (pos <= 0) + return nullptr; + return ParseIndirectObjectAt(pObjList, pos, objnum); + } + if (GetObjectType(objnum) != 2) + return nullptr; + + CPDF_StreamAcc* pObjStream = GetObjectStream(m_ObjectInfo[objnum].pos); + if (!pObjStream) + return nullptr; + + CFX_RetainPtr file = IFX_MemoryStream::Create( + (uint8_t*)pObjStream->GetData(), (size_t)pObjStream->GetSize(), false); + CPDF_SyntaxParser syntax; + syntax.InitParser(file, 0); + const int32_t offset = GetStreamFirst(pObjStream); + + // Read object numbers from |pObjStream| into a cache. + if (!pdfium::ContainsKey(m_ObjCache, pObjStream)) { + for (int32_t i = GetStreamNCount(pObjStream); i > 0; --i) { + uint32_t thisnum = syntax.GetDirectNum(); + uint32_t thisoff = syntax.GetDirectNum(); + m_ObjCache[pObjStream][thisnum] = thisoff; + } + } + + const auto it = m_ObjCache[pObjStream].find(objnum); + if (it == m_ObjCache[pObjStream].end()) + return nullptr; + + syntax.RestorePos(offset + it->second); + return syntax.GetObject(pObjList, 0, 0, true); +} + +CPDF_StreamAcc* CPDF_Parser::GetObjectStream(uint32_t objnum) { + auto it = m_ObjectStreamMap.find(objnum); + if (it != m_ObjectStreamMap.end()) + return it->second.get(); + + if (!m_pDocument) + return nullptr; + + const CPDF_Stream* pStream = + ToStream(m_pDocument->GetOrParseIndirectObject(objnum)); + if (!pStream) + return nullptr; + + CPDF_StreamAcc* pStreamAcc = new CPDF_StreamAcc; + pStreamAcc->LoadAllData(pStream); + m_ObjectStreamMap[objnum].reset(pStreamAcc); + return pStreamAcc; +} + +FX_FILESIZE CPDF_Parser::GetObjectSize(uint32_t objnum) const { + if (!IsValidObjectNumber(objnum)) + return 0; + + if (GetObjectType(objnum) == 2) + objnum = GetObjectPositionOrZero(objnum); + + if (GetObjectType(objnum) != 1 && GetObjectType(objnum) != 255) + return 0; + + FX_FILESIZE offset = GetObjectPositionOrZero(objnum); + if (offset == 0) + return 0; + + auto it = m_SortedOffset.find(offset); + if (it == m_SortedOffset.end() || ++it == m_SortedOffset.end()) + return 0; + + return *it - offset; +} + +void CPDF_Parser::GetIndirectBinary(uint32_t objnum, + uint8_t*& pBuffer, + uint32_t& size) { + pBuffer = nullptr; + size = 0; + if (!IsValidObjectNumber(objnum)) + return; + + if (GetObjectType(objnum) == 2) { + CPDF_StreamAcc* pObjStream = GetObjectStream(m_ObjectInfo[objnum].pos); + if (!pObjStream) + return; + + int32_t offset = GetStreamFirst(pObjStream); + const uint8_t* pData = pObjStream->GetData(); + uint32_t totalsize = pObjStream->GetSize(); + CFX_RetainPtr file = + IFX_MemoryStream::Create((uint8_t*)pData, (size_t)totalsize, false); + CPDF_SyntaxParser syntax; + syntax.InitParser(file, 0); + + for (int i = GetStreamNCount(pObjStream); i > 0; --i) { + uint32_t thisnum = syntax.GetDirectNum(); + uint32_t thisoff = syntax.GetDirectNum(); + if (thisnum != objnum) + continue; + + if (i == 1) { + size = totalsize - (thisoff + offset); + } else { + syntax.GetDirectNum(); // Skip nextnum. + uint32_t nextoff = syntax.GetDirectNum(); + size = nextoff - thisoff; + } + + pBuffer = FX_Alloc(uint8_t, size); + FXSYS_memcpy(pBuffer, pData + thisoff + offset, size); + return; + } + return; + } + + if (GetObjectType(objnum) != 1) + return; + + FX_FILESIZE pos = m_ObjectInfo[objnum].pos; + if (pos == 0) + return; + + FX_FILESIZE SavedPos = m_pSyntax->SavePos(); + m_pSyntax->RestorePos(pos); + + bool bIsNumber; + CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); + if (!bIsNumber) { + m_pSyntax->RestorePos(SavedPos); + return; + } + + uint32_t parser_objnum = FXSYS_atoui(word.c_str()); + if (parser_objnum && parser_objnum != objnum) { + m_pSyntax->RestorePos(SavedPos); + return; + } + + word = m_pSyntax->GetNextWord(&bIsNumber); + if (!bIsNumber) { + m_pSyntax->RestorePos(SavedPos); + return; + } + + if (m_pSyntax->GetKeyword() != "obj") { + m_pSyntax->RestorePos(SavedPos); + return; + } + + auto it = m_SortedOffset.find(pos); + if (it == m_SortedOffset.end() || ++it == m_SortedOffset.end()) { + m_pSyntax->RestorePos(SavedPos); + return; + } + + FX_FILESIZE nextoff = *it; + bool bNextOffValid = false; + if (nextoff != pos) { + m_pSyntax->RestorePos(nextoff); + word = m_pSyntax->GetNextWord(&bIsNumber); + if (word == "xref") { + bNextOffValid = true; + } else if (bIsNumber) { + word = m_pSyntax->GetNextWord(&bIsNumber); + if (bIsNumber && m_pSyntax->GetKeyword() == "obj") { + bNextOffValid = true; + } + } + } + + if (!bNextOffValid) { + m_pSyntax->RestorePos(pos); + while (1) { + if (m_pSyntax->GetKeyword() == "endobj") + break; + + if (m_pSyntax->SavePos() == m_pSyntax->m_FileLen) + break; + } + nextoff = m_pSyntax->SavePos(); + } + + size = (uint32_t)(nextoff - pos); + pBuffer = FX_Alloc(uint8_t, size); + m_pSyntax->RestorePos(pos); + m_pSyntax->ReadBlock(pBuffer, size); + m_pSyntax->RestorePos(SavedPos); +} + +std::unique_ptr CPDF_Parser::ParseIndirectObjectAt( + CPDF_IndirectObjectHolder* pObjList, + FX_FILESIZE pos, + uint32_t objnum) { + FX_FILESIZE SavedPos = m_pSyntax->SavePos(); + m_pSyntax->RestorePos(pos); + bool bIsNumber; + CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); + if (!bIsNumber) { + m_pSyntax->RestorePos(SavedPos); + return nullptr; + } + + FX_FILESIZE objOffset = m_pSyntax->SavePos(); + objOffset -= word.GetLength(); + uint32_t parser_objnum = FXSYS_atoui(word.c_str()); + if (objnum && parser_objnum != objnum) { + m_pSyntax->RestorePos(SavedPos); + return nullptr; + } + + word = m_pSyntax->GetNextWord(&bIsNumber); + if (!bIsNumber) { + m_pSyntax->RestorePos(SavedPos); + return nullptr; + } + + uint32_t parser_gennum = FXSYS_atoui(word.c_str()); + if (m_pSyntax->GetKeyword() != "obj") { + m_pSyntax->RestorePos(SavedPos); + return nullptr; + } + + std::unique_ptr pObj = + m_pSyntax->GetObject(pObjList, objnum, parser_gennum, true); + m_pSyntax->SavePos(); + + CFX_ByteString bsWord = m_pSyntax->GetKeyword(); + if (bsWord == "endobj") + m_pSyntax->SavePos(); + + m_pSyntax->RestorePos(SavedPos); + if (pObj) { + if (!objnum) + pObj->m_ObjNum = parser_objnum; + pObj->m_GenNum = parser_gennum; + } + return pObj; +} + +std::unique_ptr CPDF_Parser::ParseIndirectObjectAtByStrict( + CPDF_IndirectObjectHolder* pObjList, + FX_FILESIZE pos, + uint32_t objnum, + FX_FILESIZE* pResultPos) { + FX_FILESIZE SavedPos = m_pSyntax->SavePos(); + m_pSyntax->RestorePos(pos); + + bool bIsNumber; + CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); + if (!bIsNumber) { + m_pSyntax->RestorePos(SavedPos); + return nullptr; + } + + uint32_t parser_objnum = FXSYS_atoui(word.c_str()); + if (objnum && parser_objnum != objnum) { + m_pSyntax->RestorePos(SavedPos); + return nullptr; + } + + word = m_pSyntax->GetNextWord(&bIsNumber); + if (!bIsNumber) { + m_pSyntax->RestorePos(SavedPos); + return nullptr; + } + + uint32_t gennum = FXSYS_atoui(word.c_str()); + if (m_pSyntax->GetKeyword() != "obj") { + m_pSyntax->RestorePos(SavedPos); + return nullptr; + } + + std::unique_ptr pObj = + m_pSyntax->GetObjectForStrict(pObjList, objnum, gennum); + + if (pResultPos) + *pResultPos = m_pSyntax->m_Pos; + + m_pSyntax->RestorePos(SavedPos); + return pObj; +} + +uint32_t CPDF_Parser::GetFirstPageNo() const { + return m_pLinearized ? m_pLinearized->GetFirstPageNo() : 0; +} + +std::unique_ptr CPDF_Parser::LoadTrailerV4() { + if (m_pSyntax->GetKeyword() != "trailer") + return nullptr; + + return ToDictionary(m_pSyntax->GetObject(m_pDocument, 0, 0, true)); +} + +uint32_t CPDF_Parser::GetPermissions() const { + if (!m_pSecurityHandler) + return 0xFFFFFFFF; + + uint32_t dwPermission = m_pSecurityHandler->GetPermissions(); + if (m_pEncryptDict && m_pEncryptDict->GetStringFor("Filter") == "Standard") { + // See PDF Reference 1.7, page 123, table 3.20. + dwPermission &= 0xFFFFFFFC; + dwPermission |= 0xFFFFF0C0; + } + return dwPermission; +} + +bool CPDF_Parser::IsLinearizedFile( + const CFX_RetainPtr& pFileAccess, + uint32_t offset) { + m_pSyntax->InitParser(pFileAccess, offset); + m_pSyntax->RestorePos(m_pSyntax->m_HeaderOffset + 9); + + FX_FILESIZE SavedPos = m_pSyntax->SavePos(); + bool bIsNumber; + CFX_ByteString word = m_pSyntax->GetNextWord(&bIsNumber); + if (!bIsNumber) + return false; + + uint32_t objnum = FXSYS_atoui(word.c_str()); + word = m_pSyntax->GetNextWord(&bIsNumber); + if (!bIsNumber) + return false; + + uint32_t gennum = FXSYS_atoui(word.c_str()); + if (m_pSyntax->GetKeyword() != "obj") { + m_pSyntax->RestorePos(SavedPos); + return false; + } + + m_pLinearized = CPDF_LinearizedHeader::CreateForObject( + m_pSyntax->GetObject(nullptr, objnum, gennum, true)); + if (!m_pLinearized) + return false; + + m_LastXRefOffset = m_pLinearized->GetLastXRefOffset(); + // Move parser onto first page xref table start. + m_pSyntax->GetNextWord(nullptr); + return true; +} + +CPDF_Parser::Error CPDF_Parser::StartLinearizedParse( + const CFX_RetainPtr& pFileAccess, + CPDF_Document* pDocument) { + ASSERT(!m_bHasParsed); + m_bXRefStream = false; + m_LastXRefOffset = 0; + + int32_t offset = GetHeaderOffset(pFileAccess); + if (offset == -1) + return FORMAT_ERROR; + + if (!IsLinearizedFile(pFileAccess, offset)) { + m_pSyntax->m_pFileAccess = nullptr; + return StartParse(pFileAccess, std::move(pDocument)); + } + m_bHasParsed = true; + m_pDocument = pDocument; + + FX_FILESIZE dwFirstXRefOffset = m_pSyntax->SavePos(); + bool bXRefRebuilt = false; + bool bLoadV4 = LoadCrossRefV4(dwFirstXRefOffset, 0, false); + if (!bLoadV4 && !LoadCrossRefV5(&dwFirstXRefOffset, true)) { + if (!RebuildCrossRef()) + return FORMAT_ERROR; + + bXRefRebuilt = true; + m_LastXRefOffset = 0; + } + + if (bLoadV4) { + m_pTrailer = LoadTrailerV4(); + if (!m_pTrailer) + return SUCCESS; + + int32_t xrefsize = GetDirectInteger(m_pTrailer.get(), "Size"); + if (xrefsize > 0) + ShrinkObjectMap(xrefsize); + } + + Error eRet = SetEncryptHandler(); + if (eRet != SUCCESS) + return eRet; + + m_pDocument->LoadLinearizedDoc(m_pLinearized.get()); + if (!m_pDocument->GetRoot() || m_pDocument->GetPageCount() == 0) { + if (bXRefRebuilt) + return FORMAT_ERROR; + + ReleaseEncryptHandler(); + if (!RebuildCrossRef()) + return FORMAT_ERROR; + + eRet = SetEncryptHandler(); + if (eRet != SUCCESS) + return eRet; + + m_pDocument->LoadLinearizedDoc(m_pLinearized.get()); + if (!m_pDocument->GetRoot()) + return FORMAT_ERROR; + } + + if (GetRootObjNum() == 0) { + ReleaseEncryptHandler(); + if (!RebuildCrossRef() || GetRootObjNum() == 0) + return FORMAT_ERROR; + + eRet = SetEncryptHandler(); + if (eRet != SUCCESS) + return eRet; + } + + if (m_pSecurityHandler && m_pSecurityHandler->IsMetadataEncrypted()) { + if (CPDF_Reference* pMetadata = + ToReference(m_pDocument->GetRoot()->GetObjectFor("Metadata"))) + m_pSyntax->m_MetadataObjnum = pMetadata->GetRefObjNum(); + } + return SUCCESS; +} + +bool CPDF_Parser::LoadLinearizedAllCrossRefV5(FX_FILESIZE xrefpos) { + if (!LoadCrossRefV5(&xrefpos, false)) + return false; + + std::set seen_xrefpos; + while (xrefpos) { + seen_xrefpos.insert(xrefpos); + if (!LoadCrossRefV5(&xrefpos, false)) + return false; + + // Check for circular references. + if (pdfium::ContainsKey(seen_xrefpos, xrefpos)) + return false; + } + m_ObjectStreamMap.clear(); + m_bXRefStream = true; + return true; +} + +CPDF_Parser::Error CPDF_Parser::LoadLinearizedMainXRefTable() { + uint32_t dwSaveMetadataObjnum = m_pSyntax->m_MetadataObjnum; + m_pSyntax->m_MetadataObjnum = 0; + m_pTrailer.reset(); + m_pSyntax->RestorePos(m_LastXRefOffset - m_pSyntax->m_HeaderOffset); + + uint8_t ch = 0; + uint32_t dwCount = 0; + m_pSyntax->GetNextChar(ch); + while (PDFCharIsWhitespace(ch)) { + ++dwCount; + if (m_pSyntax->m_FileLen <= + (FX_FILESIZE)(m_pSyntax->SavePos() + m_pSyntax->m_HeaderOffset)) { + break; + } + m_pSyntax->GetNextChar(ch); + } + m_LastXRefOffset += dwCount; + m_ObjectStreamMap.clear(); + m_ObjCache.clear(); + + if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && + !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) { + m_LastXRefOffset = 0; + m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; + return FORMAT_ERROR; + } + + m_pSyntax->m_MetadataObjnum = dwSaveMetadataObjnum; + return SUCCESS; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser.h new file mode 100644 index 000000000000..f8ff7a17ec03 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser.h @@ -0,0 +1,183 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_PARSER_H_ +#define CORE_FPDFAPI_PARSER_CPDF_PARSER_H_ + +#include +#include +#include +#include + +#include "core/fxcrt/fx_basic.h" + +class CPDF_Array; +class CPDF_CryptoHandler; +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_IndirectObjectHolder; +class CPDF_LinearizedHeader; +class CPDF_Object; +class CPDF_SecurityHandler; +class CPDF_StreamAcc; +class CPDF_SyntaxParser; +class IFX_SeekableReadStream; + +class CPDF_Parser { + public: + enum Error { + SUCCESS = 0, + FILE_ERROR, + FORMAT_ERROR, + PASSWORD_ERROR, + HANDLER_ERROR + }; + + // A limit on the maximum object number in the xref table. Theoretical limits + // are higher, but this may be large enough in practice. + static const uint32_t kMaxObjectNumber = 1048576; + + CPDF_Parser(); + ~CPDF_Parser(); + + Error StartParse(const CFX_RetainPtr& pFile, + CPDF_Document* pDocument); + Error StartLinearizedParse(const CFX_RetainPtr& pFile, + CPDF_Document* pDocument); + + void SetPassword(const FX_CHAR* password) { m_Password = password; } + CFX_ByteString GetPassword() { return m_Password; } + CPDF_Dictionary* GetTrailer() const { return m_pTrailer.get(); } + FX_FILESIZE GetLastXRefOffset() const { return m_LastXRefOffset; } + + uint32_t GetPermissions() const; + uint32_t GetRootObjNum(); + uint32_t GetInfoObjNum(); + CPDF_Array* GetIDArray(); + + CPDF_Dictionary* GetEncryptDict() const { return m_pEncryptDict; } + + std::unique_ptr ParseIndirectObject( + CPDF_IndirectObjectHolder* pObjList, + uint32_t objnum); + + uint32_t GetLastObjNum() const; + bool IsValidObjectNumber(uint32_t objnum) const; + FX_FILESIZE GetObjectPositionOrZero(uint32_t objnum) const; + uint8_t GetObjectType(uint32_t objnum) const; + uint16_t GetObjectGenNum(uint32_t objnum) const; + bool IsVersionUpdated() const { return m_bVersionUpdated; } + bool IsObjectFreeOrNull(uint32_t objnum) const; + CPDF_CryptoHandler* GetCryptoHandler(); + CFX_RetainPtr GetFileAccess() const; + + FX_FILESIZE GetObjectOffset(uint32_t objnum) const; + FX_FILESIZE GetObjectSize(uint32_t objnum) const; + + void GetIndirectBinary(uint32_t objnum, uint8_t*& pBuffer, uint32_t& size); + int GetFileVersion() const { return m_FileVersion; } + bool IsXRefStream() const { return m_bXRefStream; } + + std::unique_ptr ParseIndirectObjectAt( + CPDF_IndirectObjectHolder* pObjList, + FX_FILESIZE pos, + uint32_t objnum); + + std::unique_ptr ParseIndirectObjectAtByStrict( + CPDF_IndirectObjectHolder* pObjList, + FX_FILESIZE pos, + uint32_t objnum, + FX_FILESIZE* pResultPos); + + uint32_t GetFirstPageNo() const; + + protected: + struct ObjectInfo { + ObjectInfo() : pos(0), type(0), gennum(0) {} + + FX_FILESIZE pos; + uint8_t type; + uint16_t gennum; + }; + + std::unique_ptr m_pSyntax; + std::map m_ObjectInfo; + + bool LoadCrossRefV4(FX_FILESIZE pos, FX_FILESIZE streampos, bool bSkip); + bool RebuildCrossRef(); + + private: + friend class CPDF_DataAvail; + + enum class ParserState { + kDefault, + kComment, + kWhitespace, + kString, + kHexString, + kEscapedString, + kXref, + kObjNum, + kPostObjNum, + kGenNum, + kPostGenNum, + kTrailer, + kBeginObj, + kEndObj + }; + + CPDF_Object* ParseDirect(CPDF_Object* pObj); + bool LoadAllCrossRefV4(FX_FILESIZE pos); + bool LoadAllCrossRefV5(FX_FILESIZE pos); + bool LoadCrossRefV5(FX_FILESIZE* pos, bool bMainXRef); + std::unique_ptr LoadTrailerV4(); + Error SetEncryptHandler(); + void ReleaseEncryptHandler(); + bool LoadLinearizedAllCrossRefV4(FX_FILESIZE pos, uint32_t dwObjCount); + bool LoadLinearizedCrossRefV4(FX_FILESIZE pos, uint32_t dwObjCount); + bool LoadLinearizedAllCrossRefV5(FX_FILESIZE pos); + Error LoadLinearizedMainXRefTable(); + CPDF_StreamAcc* GetObjectStream(uint32_t number); + bool IsLinearizedFile( + const CFX_RetainPtr& pFileAccess, + uint32_t offset); + void SetEncryptDictionary(CPDF_Dictionary* pDict); + void ShrinkObjectMap(uint32_t size); + // A simple check whether the cross reference table matches with + // the objects. + bool VerifyCrossRefV4(); + + CPDF_Document* m_pDocument; // not owned + bool m_bHasParsed; + bool m_bXRefStream; + bool m_bVersionUpdated; + int m_FileVersion; + CPDF_Dictionary* m_pEncryptDict; + FX_FILESIZE m_LastXRefOffset; + std::unique_ptr m_pSecurityHandler; + CFX_ByteString m_Password; + std::set m_SortedOffset; + std::unique_ptr m_pTrailer; + std::vector> m_Trailers; + std::unique_ptr m_pLinearized; + uint32_t m_dwXrefStartObjNum; + + // A map of object numbers to indirect streams. Map owns the streams. + std::map> m_ObjectStreamMap; + + // Mapping of object numbers to offsets. The offsets are relative to the first + // object in the stream. + using StreamObjectCache = std::map; + + // Mapping of streams to their object caches. This is valid as long as the + // streams in |m_ObjectStreamMap| are valid. + std::map m_ObjCache; + + // All indirect object numbers that are being parsed. + std::set m_ParsingObjNums; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_PARSER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser_embeddertest.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser_embeddertest.cpp new file mode 100644 index 000000000000..f523d6b31b3a --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser_embeddertest.cpp @@ -0,0 +1,59 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/fpdf_text.h" +#include "testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +class CPDFParserEmbeddertest : public EmbedderTest {}; + +TEST_F(CPDFParserEmbeddertest, LoadError_454695) { + // Test a dictionary with hex string instead of correct content. + // Verify that the defective pdf shouldn't be opened correctly. + EXPECT_FALSE(OpenDocument("bug_454695.pdf")); +} + +TEST_F(CPDFParserEmbeddertest, Bug_481363) { + // Test colorspace object with malformed dictionary. + EXPECT_TRUE(OpenDocument("bug_481363.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_NE(nullptr, page); + UnloadPage(page); +} + +TEST_F(CPDFParserEmbeddertest, Bug_544880) { + // Test self referencing /Pages object. + EXPECT_TRUE(OpenDocument("bug_544880.pdf")); + // Shouldn't crash. We don't check the return value here because we get the + // the count from the "/Count 1" in the testcase (at the time of writing) + // rather than the actual count (0). + (void)GetPageCount(); +} + +TEST_F(CPDFParserEmbeddertest, Feature_Linearized_Loading) { + EXPECT_TRUE(OpenDocument("feature_linearized_loading.pdf", nullptr, true)); +} + +TEST_F(CPDFParserEmbeddertest, Bug_325a) { + EXPECT_FALSE(OpenDocument("bug_325_a.pdf")); +} + +TEST_F(CPDFParserEmbeddertest, Bug_325b) { + EXPECT_FALSE(OpenDocument("bug_325_b.pdf")); +} + +TEST_F(CPDFParserEmbeddertest, Bug_602650) { + // Test the case that cross reference entries, which are well formed, + // but do not match with the objects. + EXPECT_TRUE(OpenDocument("bug_602650.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_NE(nullptr, page); + FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page); + EXPECT_NE(nullptr, text_page); + // The page should not be blank. + EXPECT_LT(0, FPDFText_CountChars(text_page)); + + FPDFText_ClosePage(text_page); + UnloadPage(page); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser_unittest.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser_unittest.cpp new file mode 100644 index 000000000000..3518f7d16bf5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_parser_unittest.cpp @@ -0,0 +1,209 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include + +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_syntax_parser.h" +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_ext.h" +#include "core/fxcrt/fx_stream.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/utils/path_service.h" + +// Provide a way to read test data from a buffer instead of a file. +class CFX_TestBufferRead : public IFX_SeekableReadStream { + public: + static CFX_RetainPtr Create( + const unsigned char* buffer_in, + size_t buf_size) { + return CFX_RetainPtr( + new CFX_TestBufferRead(buffer_in, buf_size)); + } + + // IFX_SeekableReadStream: + bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override { + if (offset < 0 || offset + size > total_size_) + return false; + + memcpy(buffer, buffer_ + offset, size); + return true; + } + + FX_FILESIZE GetSize() override { return (FX_FILESIZE)total_size_; }; + + protected: + CFX_TestBufferRead(const unsigned char* buffer_in, size_t buf_size) + : buffer_(buffer_in), total_size_(buf_size) {} + + const unsigned char* buffer_; + size_t total_size_; +}; + +// A wrapper class to help test member functions of CPDF_Parser. +class CPDF_TestParser : public CPDF_Parser { + public: + CPDF_TestParser() {} + ~CPDF_TestParser() {} + + // Setup reading from a file and initial states. + bool InitTestFromFile(const FX_CHAR* path) { + CFX_RetainPtr pFileAccess = + IFX_SeekableReadStream::CreateFromFilename(path); + if (!pFileAccess) + return false; + + // For the test file, the header is set at the beginning. + m_pSyntax->InitParser(pFileAccess, 0); + return true; + } + + // Setup reading from a buffer and initial states. + bool InitTestFromBuffer(const unsigned char* buffer, size_t len) { + CFX_RetainPtr buffer_reader = + CFX_TestBufferRead::Create(buffer, len); + + // For the test file, the header is set at the beginning. + m_pSyntax->InitParser(buffer_reader, 0); + return true; + } + + private: + // Add test cases here as private friend so that protected members in + // CPDF_Parser can be accessed by test cases. + // Need to access RebuildCrossRef. + FRIEND_TEST(cpdf_parser, RebuildCrossRefCorrectly); + FRIEND_TEST(cpdf_parser, RebuildCrossRefFailed); + // Need to access LoadCrossRefV4. + FRIEND_TEST(cpdf_parser, LoadCrossRefV4); +}; + +TEST(cpdf_parser, RebuildCrossRefCorrectly) { + CPDF_TestParser parser; + std::string test_file; + ASSERT_TRUE(PathService::GetTestFilePath("parser_rebuildxref_correct.pdf", + &test_file)); + ASSERT_TRUE(parser.InitTestFromFile(test_file.c_str())) << test_file; + + ASSERT_TRUE(parser.RebuildCrossRef()); + const FX_FILESIZE offsets[] = {0, 15, 61, 154, 296, 374, 450}; + const uint16_t versions[] = {0, 0, 2, 4, 6, 8, 0}; + for (size_t i = 0; i < FX_ArraySize(offsets); ++i) + EXPECT_EQ(offsets[i], parser.m_ObjectInfo[i].pos); + for (size_t i = 0; i < FX_ArraySize(versions); ++i) + EXPECT_EQ(versions[i], parser.m_ObjectInfo[i].gennum); +} + +TEST(cpdf_parser, RebuildCrossRefFailed) { + CPDF_TestParser parser; + std::string test_file; + ASSERT_TRUE(PathService::GetTestFilePath( + "parser_rebuildxref_error_notrailer.pdf", &test_file)); + ASSERT_TRUE(parser.InitTestFromFile(test_file.c_str())) << test_file; + + ASSERT_FALSE(parser.RebuildCrossRef()); +} + +TEST(cpdf_parser, LoadCrossRefV4) { + { + const unsigned char xref_table[] = + "xref \n" + "0 6 \n" + "0000000003 65535 f \n" + "0000000017 00000 n \n" + "0000000081 00000 n \n" + "0000000000 00007 f \n" + "0000000331 00000 n \n" + "0000000409 00000 n \n" + "trail"; // Needed to end cross ref table reading. + CPDF_TestParser parser; + ASSERT_TRUE( + parser.InitTestFromBuffer(xref_table, FX_ArraySize(xref_table))); + + ASSERT_TRUE(parser.LoadCrossRefV4(0, 0, false)); + const FX_FILESIZE offsets[] = {0, 17, 81, 0, 331, 409}; + const uint8_t types[] = {0, 1, 1, 0, 1, 1}; + for (size_t i = 0; i < FX_ArraySize(offsets); ++i) { + EXPECT_EQ(offsets[i], parser.m_ObjectInfo[i].pos); + EXPECT_EQ(types[i], parser.m_ObjectInfo[i].type); + } + } + { + const unsigned char xref_table[] = + "xref \n" + "0 1 \n" + "0000000000 65535 f \n" + "3 1 \n" + "0000025325 00000 n \n" + "8 2 \n" + "0000025518 00002 n \n" + "0000025635 00000 n \n" + "12 1 \n" + "0000025777 00000 n \n" + "trail"; // Needed to end cross ref table reading. + CPDF_TestParser parser; + ASSERT_TRUE( + parser.InitTestFromBuffer(xref_table, FX_ArraySize(xref_table))); + + ASSERT_TRUE(parser.LoadCrossRefV4(0, 0, false)); + const FX_FILESIZE offsets[] = {0, 0, 0, 25325, 0, 0, 0, + 0, 25518, 25635, 0, 0, 25777}; + const uint8_t types[] = {0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1}; + for (size_t i = 0; i < FX_ArraySize(offsets); ++i) { + EXPECT_EQ(offsets[i], parser.m_ObjectInfo[i].pos); + EXPECT_EQ(types[i], parser.m_ObjectInfo[i].type); + } + } + { + const unsigned char xref_table[] = + "xref \n" + "0 1 \n" + "0000000000 65535 f \n" + "3 1 \n" + "0000025325 00000 n \n" + "8 2 \n" + "0000000000 65535 f \n" + "0000025635 00000 n \n" + "12 1 \n" + "0000025777 00000 n \n" + "trail"; // Needed to end cross ref table reading. + CPDF_TestParser parser; + ASSERT_TRUE( + parser.InitTestFromBuffer(xref_table, FX_ArraySize(xref_table))); + + ASSERT_TRUE(parser.LoadCrossRefV4(0, 0, false)); + const FX_FILESIZE offsets[] = {0, 0, 0, 25325, 0, 0, 0, + 0, 0, 25635, 0, 0, 25777}; + const uint8_t types[] = {0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1}; + for (size_t i = 0; i < FX_ArraySize(offsets); ++i) { + EXPECT_EQ(offsets[i], parser.m_ObjectInfo[i].pos); + EXPECT_EQ(types[i], parser.m_ObjectInfo[i].type); + } + } + { + const unsigned char xref_table[] = + "xref \n" + "0 7 \n" + "0000000002 65535 f \n" + "0000000023 00000 n \n" + "0000000003 65535 f \n" + "0000000004 65535 f \n" + "0000000000 65535 f \n" + "0000000045 00000 n \n" + "0000000179 00000 n \n" + "trail"; // Needed to end cross ref table reading. + CPDF_TestParser parser; + ASSERT_TRUE( + parser.InitTestFromBuffer(xref_table, FX_ArraySize(xref_table))); + + ASSERT_TRUE(parser.LoadCrossRefV4(0, 0, false)); + const FX_FILESIZE offsets[] = {0, 23, 0, 0, 0, 45, 179}; + const uint8_t types[] = {0, 1, 0, 0, 0, 1, 1}; + for (size_t i = 0; i < FX_ArraySize(offsets); ++i) { + EXPECT_EQ(offsets[i], parser.m_ObjectInfo[i].pos); + EXPECT_EQ(types[i], parser.m_ObjectInfo[i].type); + } + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_reference.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_reference.cpp new file mode 100644 index 000000000000..67b67c24dd1e --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_reference.cpp @@ -0,0 +1,84 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_reference.h" + +#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +CPDF_Reference::CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, uint32_t objnum) + : m_pObjList(pDoc), m_RefObjNum(objnum) {} + +CPDF_Reference::~CPDF_Reference() {} + +CPDF_Object::Type CPDF_Reference::GetType() const { + return REFERENCE; +} + +CFX_ByteString CPDF_Reference::GetString() const { + CPDF_Object* obj = SafeGetDirect(); + return obj ? obj->GetString() : CFX_ByteString(); +} + +FX_FLOAT CPDF_Reference::GetNumber() const { + CPDF_Object* obj = SafeGetDirect(); + return obj ? obj->GetNumber() : 0; +} + +int CPDF_Reference::GetInteger() const { + CPDF_Object* obj = SafeGetDirect(); + return obj ? obj->GetInteger() : 0; +} + +CPDF_Dictionary* CPDF_Reference::GetDict() const { + CPDF_Object* obj = SafeGetDirect(); + return obj ? obj->GetDict() : nullptr; +} + +bool CPDF_Reference::IsReference() const { + return true; +} + +CPDF_Reference* CPDF_Reference::AsReference() { + return this; +} + +const CPDF_Reference* CPDF_Reference::AsReference() const { + return this; +} + +std::unique_ptr CPDF_Reference::Clone() const { + return CloneObjectNonCyclic(false); +} + +std::unique_ptr CPDF_Reference::CloneNonCyclic( + bool bDirect, + std::set* pVisited) const { + pVisited->insert(this); + if (bDirect) { + auto* pDirect = GetDirect(); + return pDirect && !pdfium::ContainsKey(*pVisited, pDirect) + ? pDirect->CloneNonCyclic(true, pVisited) + : nullptr; + } + return pdfium::MakeUnique(m_pObjList, m_RefObjNum); +} + +CPDF_Object* CPDF_Reference::SafeGetDirect() const { + CPDF_Object* obj = GetDirect(); + return (obj && !obj->IsReference()) ? obj : nullptr; +} + +void CPDF_Reference::SetRef(CPDF_IndirectObjectHolder* pDoc, uint32_t objnum) { + m_pObjList = pDoc; + m_RefObjNum = objnum; +} + +CPDF_Object* CPDF_Reference::GetDirect() const { + return m_pObjList ? m_pObjList->GetOrParseIndirectObject(m_RefObjNum) + : nullptr; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_reference.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_reference.h new file mode 100644 index 000000000000..be7f18478e96 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_reference.h @@ -0,0 +1,57 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_REFERENCE_H_ +#define CORE_FPDFAPI_PARSER_CPDF_REFERENCE_H_ + +#include +#include + +#include "core/fpdfapi/parser/cpdf_object.h" + +class CPDF_IndirectObjectHolder; + +class CPDF_Reference : public CPDF_Object { + public: + CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, uint32_t objnum); + ~CPDF_Reference() override; + + // CPDF_Object: + Type GetType() const override; + std::unique_ptr Clone() const override; + CPDF_Object* GetDirect() const override; + CFX_ByteString GetString() const override; + FX_FLOAT GetNumber() const override; + int GetInteger() const override; + CPDF_Dictionary* GetDict() const override; + bool IsReference() const override; + CPDF_Reference* AsReference() override; + const CPDF_Reference* AsReference() const override; + + CPDF_IndirectObjectHolder* GetObjList() const { return m_pObjList; } + uint32_t GetRefObjNum() const { return m_RefObjNum; } + + void SetRef(CPDF_IndirectObjectHolder* pDoc, uint32_t objnum); + + protected: + std::unique_ptr CloneNonCyclic( + bool bDirect, + std::set* pVisited) const override; + CPDF_Object* SafeGetDirect() const; + + CPDF_IndirectObjectHolder* m_pObjList; + uint32_t m_RefObjNum; +}; + +inline CPDF_Reference* ToReference(CPDF_Object* obj) { + return obj ? obj->AsReference() : nullptr; +} + +inline const CPDF_Reference* ToReference(const CPDF_Object* obj) { + return obj ? obj->AsReference() : nullptr; +} + +#endif // CORE_FPDFAPI_PARSER_CPDF_REFERENCE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_security_handler.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_security_handler.cpp new file mode 100644 index 000000000000..61834fca1334 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_security_handler.cpp @@ -0,0 +1,715 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_security_handler.h" + +#include + +#include +#include +#include + +#include "core/fdrm/crypto/fx_crypt.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_crypto_handler.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_string.h" + +namespace { + +const uint8_t defpasscode[32] = { + 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, + 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, + 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a}; + +void CalcEncryptKey(CPDF_Dictionary* pEncrypt, + const uint8_t* password, + uint32_t pass_size, + uint8_t* key, + int keylen, + bool bIgnoreMeta, + CPDF_Array* pIdArray) { + int revision = pEncrypt->GetIntegerFor("R"); + uint8_t passcode[32]; + for (uint32_t i = 0; i < 32; i++) { + passcode[i] = i < pass_size ? password[i] : defpasscode[i - pass_size]; + } + CRYPT_md5_context md5; + CRYPT_MD5Start(&md5); + CRYPT_MD5Update(&md5, passcode, 32); + CFX_ByteString okey = pEncrypt->GetStringFor("O"); + CRYPT_MD5Update(&md5, (uint8_t*)okey.c_str(), okey.GetLength()); + uint32_t perm = pEncrypt->GetIntegerFor("P"); + CRYPT_MD5Update(&md5, (uint8_t*)&perm, 4); + if (pIdArray) { + CFX_ByteString id = pIdArray->GetStringAt(0); + CRYPT_MD5Update(&md5, (uint8_t*)id.c_str(), id.GetLength()); + } + if (!bIgnoreMeta && revision >= 3 && + !pEncrypt->GetIntegerFor("EncryptMetadata", 1)) { + uint32_t tag = (uint32_t)-1; + CRYPT_MD5Update(&md5, (uint8_t*)&tag, 4); + } + uint8_t digest[16]; + CRYPT_MD5Finish(&md5, digest); + uint32_t copy_len = keylen; + if (copy_len > sizeof(digest)) { + copy_len = sizeof(digest); + } + if (revision >= 3) { + for (int i = 0; i < 50; i++) { + CRYPT_MD5Generate(digest, copy_len, digest); + } + } + FXSYS_memset(key, 0, keylen); + FXSYS_memcpy(key, digest, copy_len); +} + +} // namespace + +CPDF_SecurityHandler::CPDF_SecurityHandler() + : m_Version(0), + m_Revision(0), + m_pParser(nullptr), + m_pEncryptDict(nullptr), + m_Permissions(0), + m_Cipher(FXCIPHER_NONE), + m_KeyLen(0), + m_bOwnerUnlocked(false) {} + +CPDF_SecurityHandler::~CPDF_SecurityHandler() {} + +CPDF_CryptoHandler* CPDF_SecurityHandler::CreateCryptoHandler() { + return new CPDF_CryptoHandler; +} + +bool CPDF_SecurityHandler::OnInit(CPDF_Parser* pParser, + CPDF_Dictionary* pEncryptDict) { + m_pParser = pParser; + if (!LoadDict(pEncryptDict)) { + return false; + } + if (m_Cipher == FXCIPHER_NONE) { + return true; + } + return CheckSecurity(m_KeyLen); +} + +bool CPDF_SecurityHandler::CheckSecurity(int32_t key_len) { + CFX_ByteString password = m_pParser->GetPassword(); + if (!password.IsEmpty() && + CheckPassword(password.raw_str(), password.GetLength(), true, + m_EncryptKey, key_len)) { + m_bOwnerUnlocked = true; + return true; + } + return CheckPassword(password.raw_str(), password.GetLength(), false, + m_EncryptKey, key_len); +} + +uint32_t CPDF_SecurityHandler::GetPermissions() { + return m_bOwnerUnlocked ? 0xFFFFFFFF : m_Permissions; +} + +static bool LoadCryptInfo(CPDF_Dictionary* pEncryptDict, + const CFX_ByteString& name, + int& cipher, + int& keylen) { + int Version = pEncryptDict->GetIntegerFor("V"); + cipher = FXCIPHER_RC4; + keylen = 0; + if (Version >= 4) { + CPDF_Dictionary* pCryptFilters = pEncryptDict->GetDictFor("CF"); + if (!pCryptFilters) { + return false; + } + if (name == "Identity") { + cipher = FXCIPHER_NONE; + } else { + CPDF_Dictionary* pDefFilter = pCryptFilters->GetDictFor(name); + if (!pDefFilter) { + return false; + } + int nKeyBits = 0; + if (Version == 4) { + nKeyBits = pDefFilter->GetIntegerFor("Length", 0); + if (nKeyBits == 0) { + nKeyBits = pEncryptDict->GetIntegerFor("Length", 128); + } + } else { + nKeyBits = pEncryptDict->GetIntegerFor("Length", 256); + } + if (nKeyBits < 40) { + nKeyBits *= 8; + } + keylen = nKeyBits / 8; + CFX_ByteString cipher_name = pDefFilter->GetStringFor("CFM"); + if (cipher_name == "AESV2" || cipher_name == "AESV3") { + cipher = FXCIPHER_AES; + } + } + } else { + keylen = Version > 1 ? pEncryptDict->GetIntegerFor("Length", 40) / 8 : 5; + } + if (keylen > 32 || keylen < 0) { + return false; + } + return true; +} + +bool CPDF_SecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict) { + m_pEncryptDict = pEncryptDict; + m_Version = pEncryptDict->GetIntegerFor("V"); + m_Revision = pEncryptDict->GetIntegerFor("R"); + m_Permissions = pEncryptDict->GetIntegerFor("P", -1); + if (m_Version < 4) + return LoadCryptInfo(pEncryptDict, CFX_ByteString(), m_Cipher, m_KeyLen); + + CFX_ByteString stmf_name = pEncryptDict->GetStringFor("StmF"); + CFX_ByteString strf_name = pEncryptDict->GetStringFor("StrF"); + if (stmf_name != strf_name) + return false; + + return LoadCryptInfo(pEncryptDict, strf_name, m_Cipher, m_KeyLen); +} + +bool CPDF_SecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict, + uint32_t type, + int& cipher, + int& key_len) { + m_pEncryptDict = pEncryptDict; + m_Version = pEncryptDict->GetIntegerFor("V"); + m_Revision = pEncryptDict->GetIntegerFor("R"); + m_Permissions = pEncryptDict->GetIntegerFor("P", -1); + + CFX_ByteString strf_name; + CFX_ByteString stmf_name; + if (m_Version >= 4) { + stmf_name = pEncryptDict->GetStringFor("StmF"); + strf_name = pEncryptDict->GetStringFor("StrF"); + if (stmf_name != strf_name) + return false; + } + if (!LoadCryptInfo(pEncryptDict, strf_name, cipher, key_len)) + return false; + + m_Cipher = cipher; + m_KeyLen = key_len; + return true; +} + +bool CPDF_SecurityHandler::GetCryptInfo(int& cipher, + const uint8_t*& buffer, + int& keylen) { + cipher = m_Cipher; + buffer = m_EncryptKey; + keylen = m_KeyLen; + return true; +} +#define FX_GET_32WORD(n, b, i) \ + { \ + (n) = (uint32_t)( \ + ((uint64_t)(b)[(i)] << 24) | ((uint64_t)(b)[(i) + 1] << 16) | \ + ((uint64_t)(b)[(i) + 2] << 8) | ((uint64_t)(b)[(i) + 3])); \ + } +int BigOrder64BitsMod3(uint8_t* data) { + uint64_t ret = 0; + for (int i = 0; i < 4; ++i) { + uint32_t value; + FX_GET_32WORD(value, data, 4 * i); + ret <<= 32; + ret |= value; + ret %= 3; + } + return (int)ret; +} + +void Revision6_Hash(const uint8_t* password, + uint32_t size, + const uint8_t* salt, + const uint8_t* vector, + uint8_t* hash) { + CRYPT_sha256_context sha; + CRYPT_SHA256Start(&sha); + CRYPT_SHA256Update(&sha, password, size); + CRYPT_SHA256Update(&sha, salt, 8); + if (vector) + CRYPT_SHA256Update(&sha, vector, 48); + + uint8_t digest[32]; + CRYPT_SHA256Finish(&sha, digest); + + CFX_ByteTextBuf buf; + uint8_t* input = digest; + uint8_t* key = input; + uint8_t* iv = input + 16; + uint8_t* E = buf.GetBuffer(); + int iBufLen = buf.GetLength(); + CFX_ByteTextBuf interDigest; + int i = 0; + int iBlockSize = 32; + uint8_t* aes = FX_Alloc(uint8_t, 2048); + while (i < 64 || i < E[iBufLen - 1] + 32) { + int iRoundSize = size + iBlockSize; + if (vector) { + iRoundSize += 48; + } + iBufLen = iRoundSize * 64; + buf.EstimateSize(iBufLen); + E = buf.GetBuffer(); + CFX_ByteTextBuf content; + for (int j = 0; j < 64; ++j) { + content.AppendBlock(password, size); + content.AppendBlock(input, iBlockSize); + if (vector) { + content.AppendBlock(vector, 48); + } + } + CRYPT_AESSetKey(aes, 16, key, 16, true); + CRYPT_AESSetIV(aes, iv); + CRYPT_AESEncrypt(aes, E, content.GetBuffer(), iBufLen); + int iHash = 0; + switch (BigOrder64BitsMod3(E)) { + case 0: + iHash = 0; + iBlockSize = 32; + break; + case 1: + iHash = 1; + iBlockSize = 48; + break; + default: + iHash = 2; + iBlockSize = 64; + break; + } + interDigest.EstimateSize(iBlockSize); + input = interDigest.GetBuffer(); + if (iHash == 0) { + CRYPT_SHA256Generate(E, iBufLen, input); + } else if (iHash == 1) { + CRYPT_SHA384Generate(E, iBufLen, input); + } else if (iHash == 2) { + CRYPT_SHA512Generate(E, iBufLen, input); + } + key = input; + iv = input + 16; + ++i; + } + FX_Free(aes); + if (hash) { + FXSYS_memcpy(hash, input, 32); + } +} + +bool CPDF_SecurityHandler::AES256_CheckPassword(const uint8_t* password, + uint32_t size, + bool bOwner, + uint8_t* key) { + if (!m_pEncryptDict) + return false; + + CFX_ByteString okey = m_pEncryptDict->GetStringFor("O"); + if (okey.GetLength() < 48) + return false; + + CFX_ByteString ukey = m_pEncryptDict->GetStringFor("U"); + if (ukey.GetLength() < 48) + return false; + + const uint8_t* pkey = bOwner ? okey.raw_str() : ukey.raw_str(); + CRYPT_sha256_context sha; + uint8_t digest[32]; + if (m_Revision >= 6) { + Revision6_Hash(password, size, (const uint8_t*)pkey + 32, + bOwner ? ukey.raw_str() : nullptr, digest); + } else { + CRYPT_SHA256Start(&sha); + CRYPT_SHA256Update(&sha, password, size); + CRYPT_SHA256Update(&sha, pkey + 32, 8); + if (bOwner) + CRYPT_SHA256Update(&sha, ukey.raw_str(), 48); + + CRYPT_SHA256Finish(&sha, digest); + } + if (FXSYS_memcmp(digest, pkey, 32) != 0) + return false; + + if (!key) + return true; + + if (m_Revision >= 6) { + Revision6_Hash(password, size, (const uint8_t*)pkey + 40, + bOwner ? ukey.raw_str() : nullptr, digest); + } else { + CRYPT_SHA256Start(&sha); + CRYPT_SHA256Update(&sha, password, size); + CRYPT_SHA256Update(&sha, pkey + 40, 8); + if (bOwner) + CRYPT_SHA256Update(&sha, ukey.raw_str(), 48); + + CRYPT_SHA256Finish(&sha, digest); + } + CFX_ByteString ekey = m_pEncryptDict + ? m_pEncryptDict->GetStringFor(bOwner ? "OE" : "UE") + : CFX_ByteString(); + if (ekey.GetLength() < 32) + return false; + + std::vector aes(2048); + CRYPT_AESSetKey(aes.data(), 16, digest, 32, false); + uint8_t iv[16]; + FXSYS_memset(iv, 0, 16); + CRYPT_AESSetIV(aes.data(), iv); + CRYPT_AESDecrypt(aes.data(), key, ekey.raw_str(), 32); + CRYPT_AESSetKey(aes.data(), 16, key, 32, false); + CRYPT_AESSetIV(aes.data(), iv); + CFX_ByteString perms = m_pEncryptDict->GetStringFor("Perms"); + if (perms.IsEmpty()) + return false; + + uint8_t perms_buf[16]; + FXSYS_memset(perms_buf, 0, sizeof(perms_buf)); + size_t copy_len = + std::min(sizeof(perms_buf), static_cast(perms.GetLength())); + FXSYS_memcpy(perms_buf, perms.raw_str(), copy_len); + uint8_t buf[16]; + CRYPT_AESDecrypt(aes.data(), buf, perms_buf, 16); + if (buf[9] != 'a' || buf[10] != 'd' || buf[11] != 'b') + return false; + + if (FXDWORD_GET_LSBFIRST(buf) != m_Permissions) + return false; + + // Relax this check as there appear to be some non-conforming documents + // in the wild. The value in the buffer is the truth; if it requires us + // to encrypt metadata, but the dictionary says otherwise, then we may + // have a tampered doc. Otherwise, give it a pass. + return buf[8] == 'F' || IsMetadataEncrypted(); +} + +bool CPDF_SecurityHandler::CheckPassword(const uint8_t* password, + uint32_t size, + bool bOwner, + uint8_t* key, + int32_t key_len) { + if (m_Revision >= 5) + return AES256_CheckPassword(password, size, bOwner, key); + + uint8_t keybuf[32]; + if (!key) + key = keybuf; + + if (bOwner) + return CheckOwnerPassword(password, size, key, key_len); + + return CheckUserPassword(password, size, false, key, key_len) || + CheckUserPassword(password, size, true, key, key_len); +} +bool CPDF_SecurityHandler::CheckUserPassword(const uint8_t* password, + uint32_t pass_size, + bool bIgnoreEncryptMeta, + uint8_t* key, + int32_t key_len) { + CalcEncryptKey(m_pEncryptDict, password, pass_size, key, key_len, + bIgnoreEncryptMeta, m_pParser->GetIDArray()); + CFX_ByteString ukey = + m_pEncryptDict ? m_pEncryptDict->GetStringFor("U") : CFX_ByteString(); + if (ukey.GetLength() < 16) { + return false; + } + uint8_t ukeybuf[32]; + if (m_Revision == 2) { + FXSYS_memcpy(ukeybuf, defpasscode, 32); + CRYPT_ArcFourCryptBlock(ukeybuf, 32, key, key_len); + } else { + uint8_t test[32], tmpkey[32]; + uint32_t copy_len = sizeof(test); + if (copy_len > (uint32_t)ukey.GetLength()) { + copy_len = ukey.GetLength(); + } + FXSYS_memset(test, 0, sizeof(test)); + FXSYS_memset(tmpkey, 0, sizeof(tmpkey)); + FXSYS_memcpy(test, ukey.c_str(), copy_len); + for (int32_t i = 19; i >= 0; i--) { + for (int j = 0; j < key_len; j++) + tmpkey[j] = key[j] ^ static_cast(i); + CRYPT_ArcFourCryptBlock(test, 32, tmpkey, key_len); + } + CRYPT_md5_context md5; + CRYPT_MD5Start(&md5); + CRYPT_MD5Update(&md5, defpasscode, 32); + CPDF_Array* pIdArray = m_pParser->GetIDArray(); + if (pIdArray) { + CFX_ByteString id = pIdArray->GetStringAt(0); + CRYPT_MD5Update(&md5, (uint8_t*)id.c_str(), id.GetLength()); + } + CRYPT_MD5Finish(&md5, ukeybuf); + return FXSYS_memcmp(test, ukeybuf, 16) == 0; + } + if (FXSYS_memcmp((void*)ukey.c_str(), ukeybuf, 16) == 0) { + return true; + } + return false; +} +CFX_ByteString CPDF_SecurityHandler::GetUserPassword(const uint8_t* owner_pass, + uint32_t pass_size, + int32_t key_len) { + CFX_ByteString okey = m_pEncryptDict->GetStringFor("O"); + uint8_t passcode[32]; + for (uint32_t i = 0; i < 32; i++) { + passcode[i] = i < pass_size ? owner_pass[i] : defpasscode[i - pass_size]; + } + uint8_t digest[16]; + CRYPT_MD5Generate(passcode, 32, digest); + if (m_Revision >= 3) { + for (uint32_t i = 0; i < 50; i++) { + CRYPT_MD5Generate(digest, 16, digest); + } + } + uint8_t enckey[32]; + FXSYS_memset(enckey, 0, sizeof(enckey)); + uint32_t copy_len = key_len; + if (copy_len > sizeof(digest)) { + copy_len = sizeof(digest); + } + FXSYS_memcpy(enckey, digest, copy_len); + int okeylen = okey.GetLength(); + if (okeylen > 32) { + okeylen = 32; + } + uint8_t okeybuf[64]; + FXSYS_memset(okeybuf, 0, sizeof(okeybuf)); + FXSYS_memcpy(okeybuf, okey.c_str(), okeylen); + if (m_Revision == 2) { + CRYPT_ArcFourCryptBlock(okeybuf, okeylen, enckey, key_len); + } else { + for (int32_t i = 19; i >= 0; i--) { + uint8_t tempkey[32]; + FXSYS_memset(tempkey, 0, sizeof(tempkey)); + for (int j = 0; j < m_KeyLen; j++) + tempkey[j] = enckey[j] ^ static_cast(i); + CRYPT_ArcFourCryptBlock(okeybuf, okeylen, tempkey, key_len); + } + } + int len = 32; + while (len && defpasscode[len - 1] == okeybuf[len - 1]) { + len--; + } + return CFX_ByteString(okeybuf, len); +} +bool CPDF_SecurityHandler::CheckOwnerPassword(const uint8_t* password, + uint32_t pass_size, + uint8_t* key, + int32_t key_len) { + CFX_ByteString user_pass = GetUserPassword(password, pass_size, key_len); + if (CheckUserPassword(user_pass.raw_str(), user_pass.GetLength(), false, key, + key_len)) { + return true; + } + return CheckUserPassword(user_pass.raw_str(), user_pass.GetLength(), true, + key, key_len); +} + +bool CPDF_SecurityHandler::IsMetadataEncrypted() const { + return m_pEncryptDict->GetBooleanFor("EncryptMetadata", true); +} + +void CPDF_SecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, + CPDF_Array* pIdArray, + const uint8_t* user_pass, + uint32_t user_size, + const uint8_t* owner_pass, + uint32_t owner_size, + bool bDefault, + uint32_t type) { + int cipher = 0, key_len = 0; + if (!LoadDict(pEncryptDict, type, cipher, key_len)) { + return; + } + if (bDefault && (!owner_pass || owner_size == 0)) { + owner_pass = user_pass; + owner_size = user_size; + } + if (m_Revision >= 5) { + int t = (int)time(nullptr); + CRYPT_sha256_context sha; + CRYPT_SHA256Start(&sha); + CRYPT_SHA256Update(&sha, (uint8_t*)&t, sizeof t); + CRYPT_SHA256Update(&sha, m_EncryptKey, 32); + CRYPT_SHA256Update(&sha, (uint8_t*)"there", 5); + CRYPT_SHA256Finish(&sha, m_EncryptKey); + AES256_SetPassword(pEncryptDict, user_pass, user_size, false, m_EncryptKey); + if (bDefault) { + AES256_SetPassword(pEncryptDict, owner_pass, owner_size, true, + m_EncryptKey); + AES256_SetPerms(pEncryptDict, m_Permissions, + pEncryptDict->GetBooleanFor("EncryptMetadata", true), + m_EncryptKey); + } + return; + } + if (bDefault) { + uint8_t passcode[32]; + for (uint32_t i = 0; i < 32; i++) { + passcode[i] = + i < owner_size ? owner_pass[i] : defpasscode[i - owner_size]; + } + uint8_t digest[16]; + CRYPT_MD5Generate(passcode, 32, digest); + if (m_Revision >= 3) { + for (uint32_t i = 0; i < 50; i++) + CRYPT_MD5Generate(digest, 16, digest); + } + uint8_t enckey[32]; + FXSYS_memcpy(enckey, digest, key_len); + for (uint32_t i = 0; i < 32; i++) { + passcode[i] = i < user_size ? user_pass[i] : defpasscode[i - user_size]; + } + CRYPT_ArcFourCryptBlock(passcode, 32, enckey, key_len); + uint8_t tempkey[32]; + if (m_Revision >= 3) { + for (uint8_t i = 1; i <= 19; i++) { + for (int j = 0; j < key_len; j++) + tempkey[j] = enckey[j] ^ i; + CRYPT_ArcFourCryptBlock(passcode, 32, tempkey, key_len); + } + } + pEncryptDict->SetNewFor("O", CFX_ByteString(passcode, 32), + false); + } + CalcEncryptKey(m_pEncryptDict, (uint8_t*)user_pass, user_size, m_EncryptKey, + key_len, false, pIdArray); + if (m_Revision < 3) { + uint8_t tempbuf[32]; + FXSYS_memcpy(tempbuf, defpasscode, 32); + CRYPT_ArcFourCryptBlock(tempbuf, 32, m_EncryptKey, key_len); + pEncryptDict->SetNewFor("U", CFX_ByteString(tempbuf, 32), + false); + } else { + CRYPT_md5_context md5; + CRYPT_MD5Start(&md5); + CRYPT_MD5Update(&md5, defpasscode, 32); + if (pIdArray) { + CFX_ByteString id = pIdArray->GetStringAt(0); + CRYPT_MD5Update(&md5, (uint8_t*)id.c_str(), id.GetLength()); + } + uint8_t digest[32]; + CRYPT_MD5Finish(&md5, digest); + CRYPT_ArcFourCryptBlock(digest, 16, m_EncryptKey, key_len); + uint8_t tempkey[32]; + for (uint8_t i = 1; i <= 19; i++) { + for (int j = 0; j < key_len; j++) { + tempkey[j] = m_EncryptKey[j] ^ i; + } + CRYPT_ArcFourCryptBlock(digest, 16, tempkey, key_len); + } + CRYPT_MD5Generate(digest, 16, digest + 16); + pEncryptDict->SetNewFor("U", CFX_ByteString(digest, 32), + false); + } +} +void CPDF_SecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, + CPDF_Array* pIdArray, + const uint8_t* user_pass, + uint32_t user_size, + const uint8_t* owner_pass, + uint32_t owner_size, + uint32_t type) { + OnCreate(pEncryptDict, pIdArray, user_pass, user_size, owner_pass, owner_size, + true, type); +} +void CPDF_SecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, + CPDF_Array* pIdArray, + const uint8_t* user_pass, + uint32_t user_size, + uint32_t type) { + OnCreate(pEncryptDict, pIdArray, user_pass, user_size, nullptr, 0, false, + type); +} +void CPDF_SecurityHandler::AES256_SetPassword(CPDF_Dictionary* pEncryptDict, + const uint8_t* password, + uint32_t size, + bool bOwner, + const uint8_t* key) { + CRYPT_sha1_context sha; + CRYPT_SHA1Start(&sha); + CRYPT_SHA1Update(&sha, key, 32); + CRYPT_SHA1Update(&sha, (uint8_t*)"hello", 5); + + uint8_t digest[20]; + CRYPT_SHA1Finish(&sha, digest); + + CFX_ByteString ukey = pEncryptDict->GetStringFor("U"); + CRYPT_sha256_context sha2; + uint8_t digest1[48]; + if (m_Revision >= 6) { + Revision6_Hash(password, size, digest, bOwner ? ukey.raw_str() : nullptr, + digest1); + } else { + CRYPT_SHA256Start(&sha2); + CRYPT_SHA256Update(&sha2, password, size); + CRYPT_SHA256Update(&sha2, digest, 8); + if (bOwner) { + CRYPT_SHA256Update(&sha2, ukey.raw_str(), ukey.GetLength()); + } + CRYPT_SHA256Finish(&sha2, digest1); + } + FXSYS_memcpy(digest1 + 32, digest, 16); + pEncryptDict->SetNewFor(bOwner ? "O" : "U", + CFX_ByteString(digest1, 48), false); + if (m_Revision >= 6) { + Revision6_Hash(password, size, digest + 8, + bOwner ? ukey.raw_str() : nullptr, digest1); + } else { + CRYPT_SHA256Start(&sha2); + CRYPT_SHA256Update(&sha2, password, size); + CRYPT_SHA256Update(&sha2, digest + 8, 8); + if (bOwner) { + CRYPT_SHA256Update(&sha2, ukey.raw_str(), ukey.GetLength()); + } + CRYPT_SHA256Finish(&sha2, digest1); + } + uint8_t* aes = FX_Alloc(uint8_t, 2048); + CRYPT_AESSetKey(aes, 16, digest1, 32, true); + uint8_t iv[16]; + FXSYS_memset(iv, 0, 16); + CRYPT_AESSetIV(aes, iv); + CRYPT_AESEncrypt(aes, digest1, key, 32); + FX_Free(aes); + pEncryptDict->SetNewFor(bOwner ? "OE" : "UE", + CFX_ByteString(digest1, 32), false); +} + +void CPDF_SecurityHandler::AES256_SetPerms(CPDF_Dictionary* pEncryptDict, + uint32_t permissions, + bool bEncryptMetadata, + const uint8_t* key) { + uint8_t buf[16]; + buf[0] = (uint8_t)permissions; + buf[1] = (uint8_t)(permissions >> 8); + buf[2] = (uint8_t)(permissions >> 16); + buf[3] = (uint8_t)(permissions >> 24); + buf[4] = 0xff; + buf[5] = 0xff; + buf[6] = 0xff; + buf[7] = 0xff; + buf[8] = bEncryptMetadata ? 'T' : 'F'; + buf[9] = 'a'; + buf[10] = 'd'; + buf[11] = 'b'; + uint8_t* aes = FX_Alloc(uint8_t, 2048); + CRYPT_AESSetKey(aes, 16, key, 32, true); + uint8_t iv[16], buf1[16]; + FXSYS_memset(iv, 0, 16); + CRYPT_AESSetIV(aes, iv); + CRYPT_AESEncrypt(aes, buf1, buf, 16); + FX_Free(aes); + pEncryptDict->SetNewFor("Perms", CFX_ByteString(buf1, 16), + false); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_security_handler.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_security_handler.h new file mode 100644 index 000000000000..1a41b67195e0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_security_handler.h @@ -0,0 +1,110 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_SECURITY_HANDLER_H_ +#define CORE_FPDFAPI_PARSER_CPDF_SECURITY_HANDLER_H_ + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +#define FXCIPHER_NONE 0 +#define FXCIPHER_RC4 1 +#define FXCIPHER_AES 2 +#define FXCIPHER_AES2 3 + +#define PDF_ENCRYPT_CONTENT 0 + +class CPDF_Array; +class CPDF_CryptoHandler; +class CPDF_Dictionary; +class CPDF_Parser; + +class CPDF_SecurityHandler { + public: + CPDF_SecurityHandler(); + ~CPDF_SecurityHandler(); + + bool OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict); + uint32_t GetPermissions(); + bool GetCryptInfo(int& cipher, const uint8_t*& buffer, int& keylen); + bool IsMetadataEncrypted() const; + CPDF_CryptoHandler* CreateCryptoHandler(); + + void OnCreate(CPDF_Dictionary* pEncryptDict, + CPDF_Array* pIdArray, + const uint8_t* user_pass, + uint32_t user_size, + const uint8_t* owner_pass, + uint32_t owner_size, + uint32_t type = PDF_ENCRYPT_CONTENT); + + void OnCreate(CPDF_Dictionary* pEncryptDict, + CPDF_Array* pIdArray, + const uint8_t* user_pass, + uint32_t user_size, + uint32_t type = PDF_ENCRYPT_CONTENT); + + CFX_ByteString GetUserPassword(const uint8_t* owner_pass, + uint32_t pass_size, + int32_t key_len); + bool CheckPassword(const uint8_t* password, + uint32_t pass_size, + bool bOwner, + uint8_t* key, + int key_len); + + private: + bool LoadDict(CPDF_Dictionary* pEncryptDict); + bool LoadDict(CPDF_Dictionary* pEncryptDict, + uint32_t type, + int& cipher, + int& key_len); + + bool CheckUserPassword(const uint8_t* password, + uint32_t pass_size, + bool bIgnoreEncryptMeta, + uint8_t* key, + int32_t key_len); + + bool CheckOwnerPassword(const uint8_t* password, + uint32_t pass_size, + uint8_t* key, + int32_t key_len); + bool AES256_CheckPassword(const uint8_t* password, + uint32_t size, + bool bOwner, + uint8_t* key); + void AES256_SetPassword(CPDF_Dictionary* pEncryptDict, + const uint8_t* password, + uint32_t size, + bool bOwner, + const uint8_t* key); + void AES256_SetPerms(CPDF_Dictionary* pEncryptDict, + uint32_t permission, + bool bEncryptMetadata, + const uint8_t* key); + void OnCreate(CPDF_Dictionary* pEncryptDict, + CPDF_Array* pIdArray, + const uint8_t* user_pass, + uint32_t user_size, + const uint8_t* owner_pass, + uint32_t owner_size, + bool bDefault, + uint32_t type); + bool CheckSecurity(int32_t key_len); + + int m_Version; + int m_Revision; + CPDF_Parser* m_pParser; + CPDF_Dictionary* m_pEncryptDict; + uint32_t m_Permissions; + int m_Cipher; + uint8_t m_EncryptKey[32]; + int m_KeyLen; + bool m_bOwnerUnlocked; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_SECURITY_HANDLER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp new file mode 100644 index 000000000000..c6c6217e2c73 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_security_handler_embeddertest.cpp @@ -0,0 +1,54 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +class CPDFSecurityHandlerEmbeddertest : public EmbedderTest {}; + +TEST_F(CPDFSecurityHandlerEmbeddertest, Unencrypted) { + ASSERT_TRUE(OpenDocument("about_blank.pdf")); + EXPECT_EQ(0xFFFFFFFF, FPDF_GetDocPermissions(document())); +} + +TEST_F(CPDFSecurityHandlerEmbeddertest, UnencryptedWithPassword) { + ASSERT_TRUE(OpenDocument("about_blank.pdf", "foobar")); + EXPECT_EQ(0xFFFFFFFF, FPDF_GetDocPermissions(document())); +} + +TEST_F(CPDFSecurityHandlerEmbeddertest, NoPassword) { + EXPECT_FALSE(OpenDocument("encrypted.pdf")); +} + +TEST_F(CPDFSecurityHandlerEmbeddertest, BadPassword) { + EXPECT_FALSE(OpenDocument("encrypted.pdf", "tiger")); +} + +TEST_F(CPDFSecurityHandlerEmbeddertest, UserPassword) { + ASSERT_TRUE(OpenDocument("encrypted.pdf", "1234")); + EXPECT_EQ(0xFFFFF2C0, FPDF_GetDocPermissions(document())); +} + +TEST_F(CPDFSecurityHandlerEmbeddertest, OwnerPassword) { + ASSERT_TRUE(OpenDocument("encrypted.pdf", "5678")); + EXPECT_EQ(0xFFFFFFFC, FPDF_GetDocPermissions(document())); +} + +TEST_F(CPDFSecurityHandlerEmbeddertest, NoPasswordVersion5) { + ASSERT_FALSE(OpenDocument("bug_644.pdf")); +} + +TEST_F(CPDFSecurityHandlerEmbeddertest, BadPasswordVersion5) { + ASSERT_FALSE(OpenDocument("bug_644.pdf", "tiger")); +} + +TEST_F(CPDFSecurityHandlerEmbeddertest, OwnerPasswordVersion5) { + ASSERT_TRUE(OpenDocument("bug_644.pdf", "a")); + EXPECT_EQ(0xFFFFFFFC, FPDF_GetDocPermissions(document())); +} + +TEST_F(CPDFSecurityHandlerEmbeddertest, UserPasswordVersion5) { + ASSERT_TRUE(OpenDocument("bug_644.pdf", "b")); + EXPECT_EQ(0xFFFFFFFC, FPDF_GetDocPermissions(document())); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_simple_parser.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_simple_parser.cpp new file mode 100644 index 000000000000..650c216e0591 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_simple_parser.cpp @@ -0,0 +1,170 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_simple_parser.h" + +#include "core/fpdfapi/parser/fpdf_parser_utility.h" + +CPDF_SimpleParser::CPDF_SimpleParser(const uint8_t* pData, uint32_t dwSize) + : m_pData(pData), m_dwSize(dwSize), m_dwCurPos(0) {} + +CPDF_SimpleParser::CPDF_SimpleParser(const CFX_ByteStringC& str) + : m_pData(str.raw_str()), m_dwSize(str.GetLength()), m_dwCurPos(0) {} + +void CPDF_SimpleParser::ParseWord(const uint8_t*& pStart, uint32_t& dwSize) { + pStart = nullptr; + dwSize = 0; + uint8_t ch; + while (1) { + if (m_dwSize <= m_dwCurPos) + return; + ch = m_pData[m_dwCurPos++]; + while (PDFCharIsWhitespace(ch)) { + if (m_dwSize <= m_dwCurPos) + return; + ch = m_pData[m_dwCurPos++]; + } + + if (ch != '%') + break; + + while (1) { + if (m_dwSize <= m_dwCurPos) + return; + ch = m_pData[m_dwCurPos++]; + if (PDFCharIsLineEnding(ch)) + break; + } + } + + uint32_t start_pos = m_dwCurPos - 1; + pStart = m_pData + start_pos; + if (PDFCharIsDelimiter(ch)) { + if (ch == '/') { + while (1) { + if (m_dwSize <= m_dwCurPos) + return; + ch = m_pData[m_dwCurPos++]; + if (!PDFCharIsOther(ch) && !PDFCharIsNumeric(ch)) { + m_dwCurPos--; + dwSize = m_dwCurPos - start_pos; + return; + } + } + } else { + dwSize = 1; + if (ch == '<') { + if (m_dwSize <= m_dwCurPos) + return; + ch = m_pData[m_dwCurPos++]; + if (ch == '<') + dwSize = 2; + else + m_dwCurPos--; + } else if (ch == '>') { + if (m_dwSize <= m_dwCurPos) + return; + ch = m_pData[m_dwCurPos++]; + if (ch == '>') + dwSize = 2; + else + m_dwCurPos--; + } + } + return; + } + + dwSize = 1; + while (1) { + if (m_dwSize <= m_dwCurPos) + return; + ch = m_pData[m_dwCurPos++]; + + if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) { + m_dwCurPos--; + break; + } + dwSize++; + } +} + +CFX_ByteStringC CPDF_SimpleParser::GetWord() { + const uint8_t* pStart; + uint32_t dwSize; + ParseWord(pStart, dwSize); + if (dwSize == 1 && pStart[0] == '<') { + while (m_dwCurPos < m_dwSize && m_pData[m_dwCurPos] != '>') { + m_dwCurPos++; + } + if (m_dwCurPos < m_dwSize) { + m_dwCurPos++; + } + return CFX_ByteStringC(pStart, + (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData))); + } + if (dwSize == 1 && pStart[0] == '(') { + int level = 1; + while (m_dwCurPos < m_dwSize) { + if (m_pData[m_dwCurPos] == ')') { + level--; + if (level == 0) { + break; + } + } + if (m_pData[m_dwCurPos] == '\\') { + if (m_dwSize <= m_dwCurPos) { + break; + } + m_dwCurPos++; + } else if (m_pData[m_dwCurPos] == '(') { + level++; + } + if (m_dwSize <= m_dwCurPos) { + break; + } + m_dwCurPos++; + } + if (m_dwCurPos < m_dwSize) { + m_dwCurPos++; + } + return CFX_ByteStringC(pStart, + (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData))); + } + return CFX_ByteStringC(pStart, dwSize); +} + +bool CPDF_SimpleParser::FindTagParamFromStart(const CFX_ByteStringC& token, + int nParams) { + nParams++; + uint32_t* pBuf = FX_Alloc(uint32_t, nParams); + int buf_index = 0; + int buf_count = 0; + m_dwCurPos = 0; + while (1) { + pBuf[buf_index++] = m_dwCurPos; + if (buf_index == nParams) { + buf_index = 0; + } + buf_count++; + if (buf_count > nParams) { + buf_count = nParams; + } + CFX_ByteStringC word = GetWord(); + if (word.IsEmpty()) { + FX_Free(pBuf); + return false; + } + if (word == token) { + if (buf_count < nParams) { + continue; + } + m_dwCurPos = pBuf[buf_index]; + FX_Free(pBuf); + return true; + } + } + return false; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_simple_parser.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_simple_parser.h new file mode 100644 index 000000000000..0ff698566087 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_simple_parser.h @@ -0,0 +1,35 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_SIMPLE_PARSER_H_ +#define CORE_FPDFAPI_PARSER_CPDF_SIMPLE_PARSER_H_ + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_SimpleParser { + public: + CPDF_SimpleParser(const uint8_t* pData, uint32_t dwSize); + explicit CPDF_SimpleParser(const CFX_ByteStringC& str); + + CFX_ByteStringC GetWord(); + + // Find the token and its |nParams| parameters from the start of data, + // and move the current position to the start of those parameters. + bool FindTagParamFromStart(const CFX_ByteStringC& token, int nParams); + + // For testing only. + uint32_t GetCurPos() const { return m_dwCurPos; } + + private: + void ParseWord(const uint8_t*& pStart, uint32_t& dwSize); + + const uint8_t* m_pData; + uint32_t m_dwSize; + uint32_t m_dwCurPos; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_SIMPLE_PARSER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_simple_parser_unittest.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_simple_parser_unittest.cpp new file mode 100644 index 000000000000..5f56b948cd49 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_simple_parser_unittest.cpp @@ -0,0 +1,96 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_simple_parser.h" + +#include + +#include "core/fpdfapi/parser/fpdf_parser_utility.h" +#include "core/fxcrt/fx_basic.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" + +TEST(SimpleParserTest, GetWord) { + pdfium::StrFuncTestData test_data[] = { + // Empty src string. + STR_IN_OUT_CASE("", ""), + // Content with whitespaces only. + STR_IN_OUT_CASE(" \t \0 \n", ""), + // Content with comments only. + STR_IN_OUT_CASE("%this is a test case\r\n%2nd line", ""), + // Mixed whitespaces and comments. + STR_IN_OUT_CASE(" \t \0%try()%haha\n %another line \aa", ""), + // Name. + STR_IN_OUT_CASE(" /Tester ", "/Tester"), + // String. + STR_IN_OUT_CASE("\t(nice day)!\n ", "(nice day)"), + // String with nested braces. + STR_IN_OUT_CASE("\t(It is a (long) day)!\n ", "(It is a (long) day)"), + // String with escaped chars. + STR_IN_OUT_CASE("\t(It is a \\(long\\) day!)hi\n ", + "(It is a \\(long\\) day!)"), + // Hex string. + STR_IN_OUT_CASE(" \n<4545acdfedertt>abc ", "<4545acdfedertt>"), + STR_IN_OUT_CASE(" \n<4545aertt>abc ", "<4545a"), + // Dictionary. + STR_IN_OUT_CASE("<>", "<<"), + STR_IN_OUT_CASE("\t\t<< /abc>>", "<<"), + // Handling ending delimiters. + STR_IN_OUT_CASE("> little bear", ">"), + STR_IN_OUT_CASE(") another bear", ")"), STR_IN_OUT_CASE(">> end ", ">>"), + // No ending delimiters. + STR_IN_OUT_CASE("(sdfgfgbcv", "(sdfgfgbcv"), + // Regular cases. + STR_IN_OUT_CASE("apple pear", "apple"), + STR_IN_OUT_CASE(" pi=3.1415 ", "pi=3.1415"), + STR_IN_OUT_CASE(" p t x c ", "p"), STR_IN_OUT_CASE(" pt\0xc ", "pt"), + STR_IN_OUT_CASE(" $^&&*\t\0sdff ", "$^&&*"), + STR_IN_OUT_CASE("\n\r+3.5656 -11.0", "+3.5656"), + }; + for (size_t i = 0; i < FX_ArraySize(test_data); ++i) { + const pdfium::StrFuncTestData& data = test_data[i]; + CPDF_SimpleParser parser(data.input, data.input_size); + CFX_ByteStringC word = parser.GetWord(); + EXPECT_EQ(std::string(reinterpret_cast(data.expected), + data.expected_size), + std::string(word.c_str(), word.GetLength())) + << " for case " << i; + } +} + +TEST(SimpleParserTest, FindTagParamFromStart) { + struct FindTagTestStruct { + const unsigned char* input; + unsigned int input_size; + const char* token; + int num_params; + bool result; + unsigned int result_pos; + } test_data[] = { + // Empty strings. + STR_IN_TEST_CASE("", "Tj", 1, false, 0), + STR_IN_TEST_CASE("", "", 1, false, 0), + // Empty token. + STR_IN_TEST_CASE(" T j", "", 1, false, 5), + // No parameter. + STR_IN_TEST_CASE("Tj", "Tj", 1, false, 2), + STR_IN_TEST_CASE("(Tj", "Tj", 1, false, 3), + // Partial token match. + STR_IN_TEST_CASE("\r12\t34 56 78Tj", "Tj", 1, false, 15), + // Regular cases with various parameters. + STR_IN_TEST_CASE("\r\0abd Tj", "Tj", 1, true, 0), + STR_IN_TEST_CASE("12 4 Tj 3 46 Tj", "Tj", 1, true, 2), + STR_IN_TEST_CASE("er^ 2 (34) (5667) Tj", "Tj", 2, true, 5), + STR_IN_TEST_CASE("<344> (232)\t343.4\n12 45 Tj", "Tj", 3, true, 11), + STR_IN_TEST_CASE("1 2 3 4 5 6 7 8 cm", "cm", 6, true, 3), + }; + for (size_t i = 0; i < FX_ArraySize(test_data); ++i) { + const FindTagTestStruct& data = test_data[i]; + CPDF_SimpleParser parser(data.input, data.input_size); + EXPECT_EQ(data.result, + parser.FindTagParamFromStart(data.token, data.num_params)) + << " for case " << i; + EXPECT_EQ(data.result_pos, parser.GetCurPos()) << " for case " << i; + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream.cpp new file mode 100644 index 000000000000..d62b45641b33 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream.cpp @@ -0,0 +1,133 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_stream.h" + +#include + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "third_party/base/numerics/safe_conversions.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +CPDF_Stream::CPDF_Stream() {} + +CPDF_Stream::CPDF_Stream(std::unique_ptr pData, + uint32_t size, + std::unique_ptr pDict) + : m_dwSize(size), m_pDict(std::move(pDict)), m_pDataBuf(std::move(pData)) {} + +CPDF_Stream::~CPDF_Stream() { + m_ObjNum = kInvalidObjNum; + if (m_pDict && m_pDict->GetObjNum() == kInvalidObjNum) + m_pDict.release(); // lowercase release, release ownership. +} + +CPDF_Object::Type CPDF_Stream::GetType() const { + return STREAM; +} + +CPDF_Dictionary* CPDF_Stream::GetDict() const { + return m_pDict.get(); +} + +bool CPDF_Stream::IsStream() const { + return true; +} + +CPDF_Stream* CPDF_Stream::AsStream() { + return this; +} + +const CPDF_Stream* CPDF_Stream::AsStream() const { + return this; +} + +void CPDF_Stream::InitStream(const uint8_t* pData, + uint32_t size, + std::unique_ptr pDict) { + m_pDict = std::move(pDict); + m_bMemoryBased = true; + m_pFile = nullptr; + m_pDataBuf.reset(FX_Alloc(uint8_t, size)); + if (pData) + FXSYS_memcpy(m_pDataBuf.get(), pData, size); + m_dwSize = size; + if (m_pDict) + m_pDict->SetNewFor("Length", static_cast(m_dwSize)); +} + +void CPDF_Stream::InitStreamFromFile( + const CFX_RetainPtr& pFile, + std::unique_ptr pDict) { + m_pDict = std::move(pDict); + m_bMemoryBased = false; + m_pDataBuf.reset(); + m_pFile = pFile; + m_dwSize = pdfium::base::checked_cast(pFile->GetSize()); + if (m_pDict) + m_pDict->SetNewFor("Length", static_cast(m_dwSize)); +} + +std::unique_ptr CPDF_Stream::Clone() const { + return CloneObjectNonCyclic(false); +} + +std::unique_ptr CPDF_Stream::CloneNonCyclic( + bool bDirect, + std::set* pVisited) const { + pVisited->insert(this); + CPDF_StreamAcc acc; + acc.LoadAllData(this, true); + + uint32_t streamSize = acc.GetSize(); + CPDF_Dictionary* pDict = GetDict(); + std::unique_ptr pNewDict; + if (pDict && !pdfium::ContainsKey(*pVisited, pDict)) { + pNewDict = ToDictionary( + static_cast(pDict)->CloneNonCyclic(bDirect, pVisited)); + } + return pdfium::MakeUnique(acc.DetachData(), streamSize, + std::move(pNewDict)); +} + +void CPDF_Stream::SetData(const uint8_t* pData, uint32_t size) { + m_bMemoryBased = true; + m_pDataBuf.reset(FX_Alloc(uint8_t, size)); + if (pData) + FXSYS_memcpy(m_pDataBuf.get(), pData, size); + m_dwSize = size; + if (!m_pDict) + m_pDict = pdfium::MakeUnique(); + m_pDict->SetNewFor("Length", static_cast(size)); + m_pDict->RemoveFor("Filter"); + m_pDict->RemoveFor("DecodeParms"); +} + +bool CPDF_Stream::ReadRawData(FX_FILESIZE offset, + uint8_t* buf, + uint32_t size) const { + if (!m_bMemoryBased && m_pFile) + return m_pFile->ReadBlock(buf, offset, size); + + if (m_pDataBuf) + FXSYS_memcpy(buf, m_pDataBuf.get() + offset, size); + + return true; +} + +bool CPDF_Stream::HasFilter() const { + return m_pDict && m_pDict->KeyExist("Filter"); +} + +CFX_WideString CPDF_Stream::GetUnicodeText() const { + CPDF_StreamAcc stream; + stream.LoadAllData(this, false); + return PDF_DecodeText(stream.GetData(), stream.GetSize()); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream.h new file mode 100644 index 000000000000..902cd75365ce --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream.h @@ -0,0 +1,84 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_STREAM_H_ +#define CORE_FPDFAPI_PARSER_CPDF_STREAM_H_ + +#include +#include + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fxcrt/fx_basic.h" + +class CPDF_Stream : public CPDF_Object { + public: + CPDF_Stream(); + + // Takes ownership of |pData|. + CPDF_Stream(std::unique_ptr pData, + uint32_t size, + std::unique_ptr pDict); + + ~CPDF_Stream() override; + + // CPDF_Object: + Type GetType() const override; + std::unique_ptr Clone() const override; + CPDF_Dictionary* GetDict() const override; + CFX_WideString GetUnicodeText() const override; + bool IsStream() const override; + CPDF_Stream* AsStream() override; + const CPDF_Stream* AsStream() const override; + + uint32_t GetRawSize() const { return m_dwSize; } + uint8_t* GetRawData() const { return m_pDataBuf.get(); } + + // Does not takes onwership of |pData|, copies into internally-owned buffer. + void SetData(const uint8_t* pData, uint32_t size); + + void InitStream(const uint8_t* pData, + uint32_t size, + std::unique_ptr pDict); + void InitStreamFromFile(const CFX_RetainPtr& pFile, + std::unique_ptr pDict); + + bool ReadRawData(FX_FILESIZE start_pos, + uint8_t* pBuf, + uint32_t buf_size) const; + + bool IsMemoryBased() const { return m_bMemoryBased; } + bool HasFilter() const; + + protected: + std::unique_ptr CloneNonCyclic( + bool bDirect, + std::set* pVisited) const override; + + bool m_bMemoryBased = true; + uint32_t m_dwSize = 0; + std::unique_ptr m_pDict; + std::unique_ptr m_pDataBuf; + CFX_RetainPtr m_pFile; +}; + +inline CPDF_Stream* ToStream(CPDF_Object* obj) { + return obj ? obj->AsStream() : nullptr; +} + +inline const CPDF_Stream* ToStream(const CPDF_Object* obj) { + return obj ? obj->AsStream() : nullptr; +} + +inline std::unique_ptr ToStream(std::unique_ptr obj) { + CPDF_Stream* pStream = ToStream(obj.get()); + if (!pStream) + return nullptr; + obj.release(); + return std::unique_ptr(pStream); +} + +#endif // CORE_FPDFAPI_PARSER_CPDF_STREAM_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream_acc.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream_acc.cpp new file mode 100644 index 000000000000..423de7c571d0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream_acc.cpp @@ -0,0 +1,87 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_stream_acc.h" + +#include "core/fpdfapi/parser/fpdf_parser_decode.h" + +CPDF_StreamAcc::CPDF_StreamAcc() + : m_pData(nullptr), + m_dwSize(0), + m_bNewBuf(false), + m_pImageParam(nullptr), + m_pStream(nullptr), + m_pSrcData(nullptr) {} + +void CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream, + bool bRawAccess, + uint32_t estimated_size, + bool bImageAcc) { + if (!pStream) + return; + + m_pStream = pStream; + if (pStream->IsMemoryBased() && (!pStream->HasFilter() || bRawAccess)) { + m_dwSize = pStream->GetRawSize(); + m_pData = pStream->GetRawData(); + return; + } + uint32_t dwSrcSize = pStream->GetRawSize(); + if (dwSrcSize == 0) + return; + + uint8_t* pSrcData; + if (!pStream->IsMemoryBased()) { + pSrcData = m_pSrcData = FX_Alloc(uint8_t, dwSrcSize); + if (!pStream->ReadRawData(0, pSrcData, dwSrcSize)) + return; + } else { + pSrcData = pStream->GetRawData(); + } + if (!pStream->HasFilter() || bRawAccess) { + m_pData = pSrcData; + m_dwSize = dwSrcSize; + } else if (!PDF_DataDecode(pSrcData, dwSrcSize, m_pStream->GetDict(), m_pData, + m_dwSize, m_ImageDecoder, m_pImageParam, + estimated_size, bImageAcc)) { + m_pData = pSrcData; + m_dwSize = dwSrcSize; + } + if (pSrcData != pStream->GetRawData() && pSrcData != m_pData) + FX_Free(pSrcData); + m_pSrcData = nullptr; + m_bNewBuf = m_pData != pStream->GetRawData(); +} + +CPDF_StreamAcc::~CPDF_StreamAcc() { + if (m_bNewBuf) + FX_Free(m_pData); + FX_Free(m_pSrcData); +} + +const uint8_t* CPDF_StreamAcc::GetData() const { + if (m_bNewBuf) + return m_pData; + return m_pStream ? m_pStream->GetRawData() : nullptr; +} + +uint32_t CPDF_StreamAcc::GetSize() const { + if (m_bNewBuf) + return m_dwSize; + return m_pStream ? m_pStream->GetRawSize() : 0; +} + +std::unique_ptr CPDF_StreamAcc::DetachData() { + if (m_bNewBuf) { + std::unique_ptr p(m_pData); + m_pData = nullptr; + m_dwSize = 0; + return p; + } + std::unique_ptr p(FX_Alloc(uint8_t, m_dwSize)); + FXSYS_memcpy(p.get(), m_pData, m_dwSize); + return p; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream_acc.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream_acc.h new file mode 100644 index 000000000000..51a8a183325d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_stream_acc.h @@ -0,0 +1,51 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_STREAM_ACC_H_ +#define CORE_FPDFAPI_PARSER_CPDF_STREAM_ACC_H_ + +#include + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_StreamAcc { + public: + CPDF_StreamAcc(); + ~CPDF_StreamAcc(); + + CPDF_StreamAcc(const CPDF_StreamAcc&) = delete; + CPDF_StreamAcc& operator=(const CPDF_StreamAcc&) = delete; + + void LoadAllData(const CPDF_Stream* pStream, + bool bRawAccess = false, + uint32_t estimated_size = 0, + bool bImageAcc = false); + + const CPDF_Stream* GetStream() const { return m_pStream; } + CPDF_Dictionary* GetDict() const { + return m_pStream ? m_pStream->GetDict() : nullptr; + } + + const uint8_t* GetData() const; + uint32_t GetSize() const; + const CFX_ByteString& GetImageDecoder() const { return m_ImageDecoder; } + const CPDF_Dictionary* GetImageParam() const { return m_pImageParam; } + std::unique_ptr DetachData(); + + protected: + uint8_t* m_pData; + uint32_t m_dwSize; + bool m_bNewBuf; + CFX_ByteString m_ImageDecoder; + CPDF_Dictionary* m_pImageParam; + const CPDF_Stream* m_pStream; + uint8_t* m_pSrcData; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_STREAM_ACC_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_string.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_string.cpp new file mode 100644 index 000000000000..06bae54916ed --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_string.cpp @@ -0,0 +1,66 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_string.h" + +#include + +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "third_party/base/ptr_util.h" + +CPDF_String::CPDF_String() : m_bHex(false) {} + +CPDF_String::CPDF_String(CFX_WeakPtr pPool, + const CFX_ByteString& str, + bool bHex) + : m_String(str), m_bHex(bHex) { + if (pPool) + m_String = pPool->Intern(m_String); +} + +CPDF_String::CPDF_String(CFX_WeakPtr pPool, + const CFX_WideString& str) + : m_String(PDF_EncodeText(str)), m_bHex(false) { + if (pPool) + m_String = pPool->Intern(m_String); +} + +CPDF_String::~CPDF_String() {} + +CPDF_Object::Type CPDF_String::GetType() const { + return STRING; +} + +std::unique_ptr CPDF_String::Clone() const { + auto pRet = pdfium::MakeUnique(); + pRet->m_String = m_String; + pRet->m_bHex = m_bHex; + return std::move(pRet); +} + +CFX_ByteString CPDF_String::GetString() const { + return m_String; +} + +void CPDF_String::SetString(const CFX_ByteString& str) { + m_String = str; +} + +bool CPDF_String::IsString() const { + return true; +} + +CPDF_String* CPDF_String::AsString() { + return this; +} + +const CPDF_String* CPDF_String::AsString() const { + return this; +} + +CFX_WideString CPDF_String::GetUnicodeText() const { + return PDF_DecodeText(m_String); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_string.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_string.h new file mode 100644 index 000000000000..6698d8c5be8d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_string.h @@ -0,0 +1,52 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_STRING_H_ +#define CORE_FPDFAPI_PARSER_CPDF_STRING_H_ + +#include + +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fxcrt/cfx_string_pool_template.h" +#include "core/fxcrt/cfx_weak_ptr.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_String : public CPDF_Object { + public: + CPDF_String(); + CPDF_String(CFX_WeakPtr pPool, + const CFX_ByteString& str, + bool bHex); + CPDF_String(CFX_WeakPtr pPool, const CFX_WideString& str); + ~CPDF_String() override; + + // CPDF_Object: + Type GetType() const override; + std::unique_ptr Clone() const override; + CFX_ByteString GetString() const override; + CFX_WideString GetUnicodeText() const override; + void SetString(const CFX_ByteString& str) override; + bool IsString() const override; + CPDF_String* AsString() override; + const CPDF_String* AsString() const override; + + bool IsHex() const { return m_bHex; } + + protected: + CFX_ByteString m_String; + bool m_bHex; +}; + +inline CPDF_String* ToString(CPDF_Object* obj) { + return obj ? obj->AsString() : nullptr; +} + +inline const CPDF_String* ToString(const CPDF_Object* obj) { + return obj ? obj->AsString() : nullptr; +} + +#endif // CORE_FPDFAPI_PARSER_CPDF_STRING_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_syntax_parser.cpp new file mode 100644 index 000000000000..1b81b98c96b9 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_syntax_parser.cpp @@ -0,0 +1,914 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/cpdf_syntax_parser.h" + +#include +#include +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_boolean.h" +#include "core/fpdfapi/parser/cpdf_crypto_handler.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_null.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfapi/parser/fpdf_parser_utility.h" +#include "core/fxcrt/fx_ext.h" +#include "third_party/base/numerics/safe_math.h" +#include "third_party/base/ptr_util.h" + +namespace { + +enum class ReadStatus { Normal, Backslash, Octal, FinishOctal, CarriageReturn }; + +} // namespace + +// static +int CPDF_SyntaxParser::s_CurrentRecursionDepth = 0; + +CPDF_SyntaxParser::CPDF_SyntaxParser() + : CPDF_SyntaxParser(CFX_WeakPtr()) {} + +CPDF_SyntaxParser::CPDF_SyntaxParser( + const CFX_WeakPtr& pPool) + : m_MetadataObjnum(0), + m_pFileAccess(nullptr), + m_pFileBuf(nullptr), + m_BufSize(CPDF_ModuleMgr::kFileBufSize), + m_pPool(pPool) {} + +CPDF_SyntaxParser::~CPDF_SyntaxParser() { + FX_Free(m_pFileBuf); +} + +bool CPDF_SyntaxParser::GetCharAt(FX_FILESIZE pos, uint8_t& ch) { + CFX_AutoRestorer save_pos(&m_Pos); + m_Pos = pos; + return GetNextChar(ch); +} + +bool CPDF_SyntaxParser::ReadChar(FX_FILESIZE read_pos, uint32_t read_size) { + if (static_cast(read_pos + read_size) > m_FileLen) { + if (m_FileLen < static_cast(read_size)) { + read_pos = 0; + read_size = static_cast(m_FileLen); + } else { + read_pos = m_FileLen - read_size; + } + } + if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) + return false; + + m_BufOffset = read_pos; + return true; +} + +bool CPDF_SyntaxParser::GetNextChar(uint8_t& ch) { + FX_FILESIZE pos = m_Pos + m_HeaderOffset; + if (pos >= m_FileLen) + return false; + + if (CheckPosition(pos)) { + FX_FILESIZE read_pos = pos; + uint32_t read_size = m_BufSize; + read_size = std::min(read_size, static_cast(m_FileLen)); + if (!ReadChar(read_pos, read_size)) + return false; + } + ch = m_pFileBuf[pos - m_BufOffset]; + m_Pos++; + return true; +} + +bool CPDF_SyntaxParser::GetCharAtBackward(FX_FILESIZE pos, uint8_t& ch) { + pos += m_HeaderOffset; + if (pos >= m_FileLen) + return false; + + if (CheckPosition(pos)) { + FX_FILESIZE read_pos; + if (pos < static_cast(m_BufSize)) + read_pos = 0; + else + read_pos = pos - m_BufSize + 1; + uint32_t read_size = m_BufSize; + if (!ReadChar(read_pos, read_size)) + return false; + } + ch = m_pFileBuf[pos - m_BufOffset]; + return true; +} + +bool CPDF_SyntaxParser::ReadBlock(uint8_t* pBuf, uint32_t size) { + if (!m_pFileAccess->ReadBlock(pBuf, m_Pos + m_HeaderOffset, size)) + return false; + m_Pos += size; + return true; +} + +void CPDF_SyntaxParser::GetNextWordInternal(bool* bIsNumber) { + m_WordSize = 0; + if (bIsNumber) + *bIsNumber = true; + + uint8_t ch; + if (!GetNextChar(ch)) + return; + + while (1) { + while (PDFCharIsWhitespace(ch)) { + if (!GetNextChar(ch)) + return; + } + + if (ch != '%') + break; + + while (1) { + if (!GetNextChar(ch)) + return; + if (PDFCharIsLineEnding(ch)) + break; + } + } + + if (PDFCharIsDelimiter(ch)) { + if (bIsNumber) + *bIsNumber = false; + + m_WordBuffer[m_WordSize++] = ch; + if (ch == '/') { + while (1) { + if (!GetNextChar(ch)) + return; + + if (!PDFCharIsOther(ch) && !PDFCharIsNumeric(ch)) { + m_Pos--; + return; + } + + if (m_WordSize < sizeof(m_WordBuffer) - 1) + m_WordBuffer[m_WordSize++] = ch; + } + } else if (ch == '<') { + if (!GetNextChar(ch)) + return; + + if (ch == '<') + m_WordBuffer[m_WordSize++] = ch; + else + m_Pos--; + } else if (ch == '>') { + if (!GetNextChar(ch)) + return; + + if (ch == '>') + m_WordBuffer[m_WordSize++] = ch; + else + m_Pos--; + } + return; + } + + while (1) { + if (m_WordSize < sizeof(m_WordBuffer) - 1) + m_WordBuffer[m_WordSize++] = ch; + + if (!PDFCharIsNumeric(ch)) { + if (bIsNumber) + *bIsNumber = false; + } + + if (!GetNextChar(ch)) + return; + + if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) { + m_Pos--; + break; + } + } +} + +CFX_ByteString CPDF_SyntaxParser::ReadString() { + uint8_t ch; + if (!GetNextChar(ch)) + return CFX_ByteString(); + + CFX_ByteTextBuf buf; + int32_t parlevel = 0; + ReadStatus status = ReadStatus::Normal; + int32_t iEscCode = 0; + while (1) { + switch (status) { + case ReadStatus::Normal: + if (ch == ')') { + if (parlevel == 0) + return buf.MakeString(); + parlevel--; + } else if (ch == '(') { + parlevel++; + } + if (ch == '\\') + status = ReadStatus::Backslash; + else + buf.AppendChar(ch); + break; + case ReadStatus::Backslash: + if (ch >= '0' && ch <= '7') { + iEscCode = FXSYS_toDecimalDigit(static_cast(ch)); + status = ReadStatus::Octal; + break; + } + + if (ch == 'n') { + buf.AppendChar('\n'); + } else if (ch == 'r') { + buf.AppendChar('\r'); + } else if (ch == 't') { + buf.AppendChar('\t'); + } else if (ch == 'b') { + buf.AppendChar('\b'); + } else if (ch == 'f') { + buf.AppendChar('\f'); + } else if (ch == '\r') { + status = ReadStatus::CarriageReturn; + break; + } else if (ch != '\n') { + buf.AppendChar(ch); + } + status = ReadStatus::Normal; + break; + case ReadStatus::Octal: + if (ch >= '0' && ch <= '7') { + iEscCode = + iEscCode * 8 + FXSYS_toDecimalDigit(static_cast(ch)); + status = ReadStatus::FinishOctal; + } else { + buf.AppendChar(iEscCode); + status = ReadStatus::Normal; + continue; + } + break; + case ReadStatus::FinishOctal: + status = ReadStatus::Normal; + if (ch >= '0' && ch <= '7') { + iEscCode = + iEscCode * 8 + FXSYS_toDecimalDigit(static_cast(ch)); + buf.AppendChar(iEscCode); + } else { + buf.AppendChar(iEscCode); + continue; + } + break; + case ReadStatus::CarriageReturn: + status = ReadStatus::Normal; + if (ch != '\n') + continue; + break; + } + + if (!GetNextChar(ch)) + break; + } + + GetNextChar(ch); + return buf.MakeString(); +} + +CFX_ByteString CPDF_SyntaxParser::ReadHexString() { + uint8_t ch; + if (!GetNextChar(ch)) + return CFX_ByteString(); + + CFX_ByteTextBuf buf; + bool bFirst = true; + uint8_t code = 0; + while (1) { + if (ch == '>') + break; + + if (std::isxdigit(ch)) { + int val = FXSYS_toHexDigit(ch); + if (bFirst) { + code = val * 16; + } else { + code += val; + buf.AppendByte(code); + } + bFirst = !bFirst; + } + + if (!GetNextChar(ch)) + break; + } + if (!bFirst) + buf.AppendByte(code); + + return buf.MakeString(); +} + +void CPDF_SyntaxParser::ToNextLine() { + uint8_t ch; + while (GetNextChar(ch)) { + if (ch == '\n') + break; + + if (ch == '\r') { + GetNextChar(ch); + if (ch != '\n') + --m_Pos; + break; + } + } +} + +void CPDF_SyntaxParser::ToNextWord() { + uint8_t ch; + if (!GetNextChar(ch)) + return; + + while (1) { + while (PDFCharIsWhitespace(ch)) { + if (!GetNextChar(ch)) + return; + } + + if (ch != '%') + break; + + while (1) { + if (!GetNextChar(ch)) + return; + if (PDFCharIsLineEnding(ch)) + break; + } + } + m_Pos--; +} + +CFX_ByteString CPDF_SyntaxParser::GetNextWord(bool* bIsNumber) { + GetNextWordInternal(bIsNumber); + return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize); +} + +CFX_ByteString CPDF_SyntaxParser::GetKeyword() { + return GetNextWord(nullptr); +} + +std::unique_ptr CPDF_SyntaxParser::GetObject( + CPDF_IndirectObjectHolder* pObjList, + uint32_t objnum, + uint32_t gennum, + bool bDecrypt) { + CFX_AutoRestorer restorer(&s_CurrentRecursionDepth); + if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) + return nullptr; + + FX_FILESIZE SavedObjPos = m_Pos; + bool bIsNumber; + CFX_ByteString word = GetNextWord(&bIsNumber); + if (word.GetLength() == 0) + return nullptr; + + if (bIsNumber) { + FX_FILESIZE SavedPos = m_Pos; + CFX_ByteString nextword = GetNextWord(&bIsNumber); + if (bIsNumber) { + CFX_ByteString nextword2 = GetNextWord(nullptr); + if (nextword2 == "R") { + uint32_t objnum = FXSYS_atoui(word.c_str()); + if (objnum == CPDF_Object::kInvalidObjNum) + return nullptr; + return pdfium::MakeUnique(pObjList, objnum); + } + } + m_Pos = SavedPos; + return pdfium::MakeUnique(word.AsStringC()); + } + + if (word == "true" || word == "false") + return pdfium::MakeUnique(word == "true"); + + if (word == "null") + return pdfium::MakeUnique(); + + if (word == "(") { + CFX_ByteString str = ReadString(); + if (m_pCryptoHandler && bDecrypt) + m_pCryptoHandler->Decrypt(objnum, gennum, str); + return pdfium::MakeUnique(m_pPool, str, false); + } + if (word == "<") { + CFX_ByteString str = ReadHexString(); + if (m_pCryptoHandler && bDecrypt) + m_pCryptoHandler->Decrypt(objnum, gennum, str); + return pdfium::MakeUnique(m_pPool, str, true); + } + if (word == "[") { + std::unique_ptr pArray = pdfium::MakeUnique(); + while (std::unique_ptr pObj = + GetObject(pObjList, objnum, gennum, true)) { + pArray->Add(std::move(pObj)); + } + return std::move(pArray); + } + if (word[0] == '/') { + return pdfium::MakeUnique( + m_pPool, + PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); + } + if (word == "<<") { + int32_t nKeys = 0; + FX_FILESIZE dwSignValuePos = 0; + std::unique_ptr pDict = + pdfium::MakeUnique(m_pPool); + while (1) { + CFX_ByteString key = GetNextWord(nullptr); + if (key.IsEmpty()) + return nullptr; + + FX_FILESIZE SavedPos = m_Pos - key.GetLength(); + if (key == ">>") + break; + + if (key == "endobj") { + m_Pos = SavedPos; + break; + } + if (key[0] != '/') + continue; + + ++nKeys; + key = PDF_NameDecode(key); + if (key.IsEmpty()) + continue; + + if (key == "/Contents") + dwSignValuePos = m_Pos; + + std::unique_ptr pObj = + GetObject(pObjList, objnum, gennum, true); + if (!pObj) + continue; + + CFX_ByteString keyNoSlash(key.raw_str() + 1, key.GetLength() - 1); + pDict->SetFor(keyNoSlash, std::move(pObj)); + } + + // Only when this is a signature dictionary and has contents, we reset the + // contents to the un-decrypted form. + if (pDict->IsSignatureDict() && dwSignValuePos) { + CFX_AutoRestorer save_pos(&m_Pos); + m_Pos = dwSignValuePos; + pDict->SetFor("Contents", GetObject(pObjList, objnum, gennum, false)); + } + + FX_FILESIZE SavedPos = m_Pos; + CFX_ByteString nextword = GetNextWord(nullptr); + if (nextword != "stream") { + m_Pos = SavedPos; + return std::move(pDict); + } + return ReadStream(std::move(pDict), objnum, gennum); + } + if (word == ">>") + m_Pos = SavedObjPos; + + return nullptr; +} + +std::unique_ptr CPDF_SyntaxParser::GetObjectForStrict( + CPDF_IndirectObjectHolder* pObjList, + uint32_t objnum, + uint32_t gennum) { + CFX_AutoRestorer restorer(&s_CurrentRecursionDepth); + if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) + return nullptr; + + FX_FILESIZE SavedObjPos = m_Pos; + bool bIsNumber; + CFX_ByteString word = GetNextWord(&bIsNumber); + if (word.GetLength() == 0) + return nullptr; + + if (bIsNumber) { + FX_FILESIZE SavedPos = m_Pos; + CFX_ByteString nextword = GetNextWord(&bIsNumber); + if (bIsNumber) { + CFX_ByteString nextword2 = GetNextWord(nullptr); + if (nextword2 == "R") { + uint32_t objnum = FXSYS_atoui(word.c_str()); + if (objnum == CPDF_Object::kInvalidObjNum) + return nullptr; + return pdfium::MakeUnique(pObjList, objnum); + } + } + m_Pos = SavedPos; + return pdfium::MakeUnique(word.AsStringC()); + } + + if (word == "true" || word == "false") + return pdfium::MakeUnique(word == "true"); + + if (word == "null") + return pdfium::MakeUnique(); + + if (word == "(") { + CFX_ByteString str = ReadString(); + if (m_pCryptoHandler) + m_pCryptoHandler->Decrypt(objnum, gennum, str); + return pdfium::MakeUnique(m_pPool, str, false); + } + if (word == "<") { + CFX_ByteString str = ReadHexString(); + if (m_pCryptoHandler) + m_pCryptoHandler->Decrypt(objnum, gennum, str); + return pdfium::MakeUnique(m_pPool, str, true); + } + if (word == "[") { + std::unique_ptr pArray = pdfium::MakeUnique(); + while (std::unique_ptr pObj = + GetObject(pObjList, objnum, gennum, true)) { + pArray->Add(std::move(pObj)); + } + return m_WordBuffer[0] == ']' ? std::move(pArray) : nullptr; + } + if (word[0] == '/') { + return pdfium::MakeUnique( + m_pPool, + PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1))); + } + if (word == "<<") { + std::unique_ptr pDict = + pdfium::MakeUnique(m_pPool); + while (1) { + FX_FILESIZE SavedPos = m_Pos; + CFX_ByteString key = GetNextWord(nullptr); + if (key.IsEmpty()) + return nullptr; + + if (key == ">>") + break; + + if (key == "endobj") { + m_Pos = SavedPos; + break; + } + if (key[0] != '/') + continue; + + key = PDF_NameDecode(key); + std::unique_ptr obj( + GetObject(pObjList, objnum, gennum, true)); + if (!obj) { + uint8_t ch; + while (GetNextChar(ch) && ch != 0x0A && ch != 0x0D) { + continue; + } + return nullptr; + } + + if (key.GetLength() > 1) { + pDict->SetFor(CFX_ByteString(key.c_str() + 1, key.GetLength() - 1), + std::move(obj)); + } + } + + FX_FILESIZE SavedPos = m_Pos; + CFX_ByteString nextword = GetNextWord(nullptr); + if (nextword != "stream") { + m_Pos = SavedPos; + return std::move(pDict); + } + return ReadStream(std::move(pDict), objnum, gennum); + } + if (word == ">>") + m_Pos = SavedObjPos; + + return nullptr; +} + +unsigned int CPDF_SyntaxParser::ReadEOLMarkers(FX_FILESIZE pos) { + unsigned char byte1 = 0; + unsigned char byte2 = 0; + + GetCharAt(pos, byte1); + GetCharAt(pos + 1, byte2); + + if (byte1 == '\r' && byte2 == '\n') + return 2; + + if (byte1 == '\r' || byte1 == '\n') + return 1; + + return 0; +} + +std::unique_ptr CPDF_SyntaxParser::ReadStream( + std::unique_ptr pDict, + uint32_t objnum, + uint32_t gennum) { + CPDF_Object* pLenObj = pDict->GetObjectFor("Length"); + FX_FILESIZE len = -1; + CPDF_Reference* pLenObjRef = ToReference(pLenObj); + + bool differingObjNum = !pLenObjRef || (pLenObjRef->GetObjList() && + pLenObjRef->GetRefObjNum() != objnum); + if (pLenObj && differingObjNum) + len = pLenObj->GetInteger(); + + // Locate the start of stream. + ToNextLine(); + FX_FILESIZE streamStartPos = m_Pos; + + const CFX_ByteStringC kEndStreamStr("endstream"); + const CFX_ByteStringC kEndObjStr("endobj"); + + CPDF_CryptoHandler* pCryptoHandler = + objnum == m_MetadataObjnum ? nullptr : m_pCryptoHandler.get(); + if (!pCryptoHandler) { + bool bSearchForKeyword = true; + if (len >= 0) { + pdfium::base::CheckedNumeric pos = m_Pos; + pos += len; + if (pos.IsValid() && pos.ValueOrDie() < m_FileLen) + m_Pos = pos.ValueOrDie(); + + m_Pos += ReadEOLMarkers(m_Pos); + FXSYS_memset(m_WordBuffer, 0, kEndStreamStr.GetLength() + 1); + GetNextWordInternal(nullptr); + // Earlier version of PDF specification doesn't require EOL marker before + // 'endstream' keyword. If keyword 'endstream' follows the bytes in + // specified length, it signals the end of stream. + if (FXSYS_memcmp(m_WordBuffer, kEndStreamStr.raw_str(), + kEndStreamStr.GetLength()) == 0) { + bSearchForKeyword = false; + } + } + + if (bSearchForKeyword) { + // If len is not available, len needs to be calculated + // by searching the keywords "endstream" or "endobj". + m_Pos = streamStartPos; + FX_FILESIZE endStreamOffset = 0; + while (endStreamOffset >= 0) { + endStreamOffset = FindTag(kEndStreamStr, 0); + + // Can't find "endstream". + if (endStreamOffset < 0) + break; + + // Stop searching when "endstream" is found. + if (IsWholeWord(m_Pos - kEndStreamStr.GetLength(), m_FileLen, + kEndStreamStr, true)) { + endStreamOffset = m_Pos - streamStartPos - kEndStreamStr.GetLength(); + break; + } + } + + m_Pos = streamStartPos; + FX_FILESIZE endObjOffset = 0; + while (endObjOffset >= 0) { + endObjOffset = FindTag(kEndObjStr, 0); + + // Can't find "endobj". + if (endObjOffset < 0) + break; + + // Stop searching when "endobj" is found. + if (IsWholeWord(m_Pos - kEndObjStr.GetLength(), m_FileLen, kEndObjStr, + true)) { + endObjOffset = m_Pos - streamStartPos - kEndObjStr.GetLength(); + break; + } + } + + // Can't find "endstream" or "endobj". + if (endStreamOffset < 0 && endObjOffset < 0) + return nullptr; + + if (endStreamOffset < 0 && endObjOffset >= 0) { + // Correct the position of end stream. + endStreamOffset = endObjOffset; + } else if (endStreamOffset >= 0 && endObjOffset < 0) { + // Correct the position of end obj. + endObjOffset = endStreamOffset; + } else if (endStreamOffset > endObjOffset) { + endStreamOffset = endObjOffset; + } + len = endStreamOffset; + + int numMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset - 2); + if (numMarkers == 2) { + len -= 2; + } else { + numMarkers = ReadEOLMarkers(streamStartPos + endStreamOffset - 1); + if (numMarkers == 1) { + len -= 1; + } + } + if (len < 0) + return nullptr; + + pDict->SetNewFor("Length", static_cast(len)); + } + m_Pos = streamStartPos; + } + if (len < 0) + return nullptr; + + std::unique_ptr pData; + if (len > 0) { + pData.reset(FX_Alloc(uint8_t, len)); + ReadBlock(pData.get(), len); + if (pCryptoHandler) { + CFX_BinaryBuf dest_buf; + dest_buf.EstimateSize(pCryptoHandler->DecryptGetSize(len)); + + void* context = pCryptoHandler->DecryptStart(objnum, gennum); + pCryptoHandler->DecryptStream(context, pData.get(), len, dest_buf); + pCryptoHandler->DecryptFinish(context, dest_buf); + len = dest_buf.GetSize(); + pData = dest_buf.DetachBuffer(); + } + } + + auto pStream = + pdfium::MakeUnique(std::move(pData), len, std::move(pDict)); + streamStartPos = m_Pos; + FXSYS_memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1); + GetNextWordInternal(nullptr); + + int numMarkers = ReadEOLMarkers(m_Pos); + if (m_WordSize == static_cast(kEndObjStr.GetLength()) && + numMarkers != 0 && + FXSYS_memcmp(m_WordBuffer, kEndObjStr.raw_str(), + kEndObjStr.GetLength()) == 0) { + m_Pos = streamStartPos; + } + return pStream; +} + +void CPDF_SyntaxParser::InitParser( + const CFX_RetainPtr& pFileAccess, + uint32_t HeaderOffset) { + FX_Free(m_pFileBuf); + + m_pFileBuf = FX_Alloc(uint8_t, m_BufSize); + m_HeaderOffset = HeaderOffset; + m_FileLen = pFileAccess->GetSize(); + m_Pos = 0; + m_pFileAccess = pFileAccess; + m_BufOffset = 0; + pFileAccess->ReadBlock(m_pFileBuf, 0, + std::min(m_BufSize, static_cast(m_FileLen))); +} + +uint32_t CPDF_SyntaxParser::GetDirectNum() { + bool bIsNumber; + GetNextWordInternal(&bIsNumber); + if (!bIsNumber) + return 0; + + m_WordBuffer[m_WordSize] = 0; + return FXSYS_atoui(reinterpret_cast(m_WordBuffer)); +} + +bool CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, + FX_FILESIZE limit, + const CFX_ByteStringC& tag, + bool checkKeyword) { + const uint32_t taglen = tag.GetLength(); + + bool bCheckLeft = !PDFCharIsDelimiter(tag[0]) && !PDFCharIsWhitespace(tag[0]); + bool bCheckRight = !PDFCharIsDelimiter(tag[taglen - 1]) && + !PDFCharIsWhitespace(tag[taglen - 1]); + + uint8_t ch; + if (bCheckRight && startpos + (int32_t)taglen <= limit && + GetCharAt(startpos + (int32_t)taglen, ch)) { + if (PDFCharIsNumeric(ch) || PDFCharIsOther(ch) || + (checkKeyword && PDFCharIsDelimiter(ch))) { + return false; + } + } + + if (bCheckLeft && startpos > 0 && GetCharAt(startpos - 1, ch)) { + if (PDFCharIsNumeric(ch) || PDFCharIsOther(ch) || + (checkKeyword && PDFCharIsDelimiter(ch))) { + return false; + } + } + return true; +} + +// TODO(dsinclair): Split into a SearchWordForward and SearchWordBackwards +// and drop the bool. +bool CPDF_SyntaxParser::SearchWord(const CFX_ByteStringC& tag, + bool bWholeWord, + bool bForward, + FX_FILESIZE limit) { + int32_t taglen = tag.GetLength(); + if (taglen == 0) + return false; + + FX_FILESIZE pos = m_Pos; + int32_t offset = 0; + if (!bForward) + offset = taglen - 1; + + const uint8_t* tag_data = tag.raw_str(); + uint8_t byte; + while (1) { + if (bForward) { + if (limit && pos >= m_Pos + limit) + return false; + + if (!GetCharAt(pos, byte)) + return false; + + } else { + if (limit && pos <= m_Pos - limit) + return false; + + if (!GetCharAtBackward(pos, byte)) + return false; + } + + if (byte == tag_data[offset]) { + if (bForward) { + offset++; + if (offset < taglen) { + pos++; + continue; + } + } else { + offset--; + if (offset >= 0) { + pos--; + continue; + } + } + + FX_FILESIZE startpos = bForward ? pos - taglen + 1 : pos; + if (!bWholeWord || IsWholeWord(startpos, limit, tag, false)) { + m_Pos = startpos; + return true; + } + } + + if (bForward) { + offset = byte == tag_data[0] ? 1 : 0; + pos++; + } else { + offset = byte == tag_data[taglen - 1] ? taglen - 2 : taglen - 1; + pos--; + } + + if (pos < 0) + return false; + } + + return false; +} + +FX_FILESIZE CPDF_SyntaxParser::FindTag(const CFX_ByteStringC& tag, + FX_FILESIZE limit) { + int32_t taglen = tag.GetLength(); + int32_t match = 0; + limit += m_Pos; + FX_FILESIZE startpos = m_Pos; + + while (1) { + uint8_t ch; + if (!GetNextChar(ch)) + return -1; + + if (ch == tag[match]) { + match++; + if (match == taglen) + return m_Pos - startpos - taglen; + } else { + match = ch == tag[0] ? 1 : 0; + } + + if (limit && m_Pos == limit) + return -1; + } + return -1; +} + +void CPDF_SyntaxParser::SetEncrypt( + std::unique_ptr pCryptoHandler) { + m_pCryptoHandler = std::move(pCryptoHandler); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_syntax_parser.h b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_syntax_parser.h new file mode 100644 index 000000000000..8dd9103f1b74 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_syntax_parser.h @@ -0,0 +1,104 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_CPDF_SYNTAX_PARSER_H_ +#define CORE_FPDFAPI_PARSER_CPDF_SYNTAX_PARSER_H_ + +#include + +#include "core/fxcrt/cfx_string_pool_template.h" +#include "core/fxcrt/cfx_weak_ptr.h" +#include "core/fxcrt/fx_basic.h" + +class CPDF_CryptoHandler; +class CPDF_Dictionary; +class CPDF_IndirectObjectHolder; +class CPDF_Object; +class CPDF_Stream; +class IFX_SeekableReadStream; + +class CPDF_SyntaxParser { + public: + CPDF_SyntaxParser(); + explicit CPDF_SyntaxParser(const CFX_WeakPtr& pPool); + ~CPDF_SyntaxParser(); + + void InitParser(const CFX_RetainPtr& pFileAccess, + uint32_t HeaderOffset); + + FX_FILESIZE SavePos() const { return m_Pos; } + void RestorePos(FX_FILESIZE pos) { m_Pos = pos; } + + std::unique_ptr GetObject(CPDF_IndirectObjectHolder* pObjList, + uint32_t objnum, + uint32_t gennum, + bool bDecrypt); + + std::unique_ptr GetObjectForStrict( + CPDF_IndirectObjectHolder* pObjList, + uint32_t objnum, + uint32_t gennum); + + CFX_ByteString GetKeyword(); + void ToNextLine(); + void ToNextWord(); + bool SearchWord(const CFX_ByteStringC& word, + bool bWholeWord, + bool bForward, + FX_FILESIZE limit); + + FX_FILESIZE FindTag(const CFX_ByteStringC& tag, FX_FILESIZE limit); + void SetEncrypt(std::unique_ptr pCryptoHandler); + bool ReadBlock(uint8_t* pBuf, uint32_t size); + bool GetCharAt(FX_FILESIZE pos, uint8_t& ch); + CFX_ByteString GetNextWord(bool* bIsNumber); + + private: + friend class CPDF_Parser; + friend class CPDF_DataAvail; + friend class cpdf_syntax_parser_ReadHexString_Test; + + static const int kParserMaxRecursionDepth = 64; + static int s_CurrentRecursionDepth; + + uint32_t GetDirectNum(); + bool ReadChar(FX_FILESIZE read_pos, uint32_t read_size); + bool GetNextChar(uint8_t& ch); + bool GetCharAtBackward(FX_FILESIZE pos, uint8_t& ch); + void GetNextWordInternal(bool* bIsNumber); + bool IsWholeWord(FX_FILESIZE startpos, + FX_FILESIZE limit, + const CFX_ByteStringC& tag, + bool checkKeyword); + + CFX_ByteString ReadString(); + CFX_ByteString ReadHexString(); + unsigned int ReadEOLMarkers(FX_FILESIZE pos); + std::unique_ptr ReadStream( + std::unique_ptr pDict, + uint32_t objnum, + uint32_t gennum); + + inline bool CheckPosition(FX_FILESIZE pos) { + return m_BufOffset >= pos || + static_cast(m_BufOffset + m_BufSize) <= pos; + } + + FX_FILESIZE m_Pos; + uint32_t m_MetadataObjnum; + CFX_RetainPtr m_pFileAccess; + FX_FILESIZE m_HeaderOffset; + FX_FILESIZE m_FileLen; + uint8_t* m_pFileBuf; + uint32_t m_BufSize; + FX_FILESIZE m_BufOffset; + std::unique_ptr m_pCryptoHandler; + uint8_t m_WordBuffer[257]; + uint32_t m_WordSize; + CFX_WeakPtr m_pPool; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_SYNTAX_PARSER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_syntax_parser_unittest.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_syntax_parser_unittest.cpp new file mode 100644 index 000000000000..64c33ba9cda0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/cpdf_syntax_parser_unittest.cpp @@ -0,0 +1,156 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include + +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_syntax_parser.h" +#include "core/fxcrt/fx_ext.h" +#include "core/fxcrt/fx_stream.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/utils/path_service.h" + +TEST(cpdf_syntax_parser, ReadHexString) { + { + // Empty string. + uint8_t data[] = ""; + CPDF_SyntaxParser parser; + parser.InitParser(IFX_MemoryStream::Create(data, 0, false), 0); + EXPECT_EQ("", parser.ReadHexString()); + EXPECT_EQ(0, parser.SavePos()); + } + + { + // Blank string. + uint8_t data[] = " "; + CPDF_SyntaxParser parser; + parser.InitParser(IFX_MemoryStream::Create(data, 2, false), 0); + EXPECT_EQ("", parser.ReadHexString()); + EXPECT_EQ(2, parser.SavePos()); + } + + { + // Skips unknown characters. + uint8_t data[] = "z12b"; + CPDF_SyntaxParser parser; + parser.InitParser(IFX_MemoryStream::Create(data, 4, false), 0); + EXPECT_EQ("\x12\xb0", parser.ReadHexString()); + EXPECT_EQ(4, parser.SavePos()); + } + + { + // Skips unknown characters. + uint8_t data[] = "*<&*#$^&@1"; + CPDF_SyntaxParser parser; + parser.InitParser(IFX_MemoryStream::Create(data, 10, false), 0); + EXPECT_EQ("\x10", parser.ReadHexString()); + EXPECT_EQ(10, parser.SavePos()); + } + + { + // Skips unknown characters. + uint8_t data[] = "\x80zab"; + CPDF_SyntaxParser parser; + parser.InitParser(IFX_MemoryStream::Create(data, 4, false), 0); + EXPECT_EQ("\xab", parser.ReadHexString()); + EXPECT_EQ(4, parser.SavePos()); + } + + { + // Skips unknown characters. + uint8_t data[] = "\xffzab"; + CPDF_SyntaxParser parser; + parser.InitParser(IFX_MemoryStream::Create(data, 4, false), 0); + EXPECT_EQ("\xab", parser.ReadHexString()); + EXPECT_EQ(4, parser.SavePos()); + } + + { + // Regular conversion. + uint8_t data[] = "1A2b>abcd"; + CPDF_SyntaxParser parser; + parser.InitParser(IFX_MemoryStream::Create(data, 9, false), 0); + EXPECT_EQ("\x1a\x2b", parser.ReadHexString()); + EXPECT_EQ(5, parser.SavePos()); + } + + { + // Position out of bounds. + uint8_t data[] = "12ab>"; + CPDF_SyntaxParser parser; + parser.InitParser(IFX_MemoryStream::Create(data, 5, false), 0); + parser.RestorePos(5); + EXPECT_EQ("", parser.ReadHexString()); + + parser.RestorePos(6); + EXPECT_EQ("", parser.ReadHexString()); + + parser.RestorePos(-1); + EXPECT_EQ("", parser.ReadHexString()); + + parser.RestorePos(std::numeric_limits::max()); + EXPECT_EQ("", parser.ReadHexString()); + + // Check string still parses when set to 0. + parser.RestorePos(0); + EXPECT_EQ("\x12\xab", parser.ReadHexString()); + } + + { + // Missing ending >. + uint8_t data[] = "1A2b"; + CPDF_SyntaxParser parser; + parser.InitParser(IFX_MemoryStream::Create(data, 4, false), 0); + EXPECT_EQ("\x1a\x2b", parser.ReadHexString()); + EXPECT_EQ(4, parser.SavePos()); + } + + { + // Missing ending >. + uint8_t data[] = "12abz"; + CPDF_SyntaxParser parser; + parser.InitParser(IFX_MemoryStream::Create(data, 5, false), 0); + EXPECT_EQ("\x12\xab", parser.ReadHexString()); + EXPECT_EQ(5, parser.SavePos()); + } + + { + // Uneven number of bytes. + uint8_t data[] = "1A2>asdf"; + CPDF_SyntaxParser parser; + parser.InitParser(IFX_MemoryStream::Create(data, 8, false), 0); + EXPECT_EQ("\x1a\x20", parser.ReadHexString()); + EXPECT_EQ(4, parser.SavePos()); + } + + { + // Uneven number of bytes. + uint8_t data[] = "1A2zasdf"; + CPDF_SyntaxParser parser; + parser.InitParser(IFX_MemoryStream::Create(data, 8, false), 0); + EXPECT_EQ("\x1a\x2a\xdf", parser.ReadHexString()); + EXPECT_EQ(8, parser.SavePos()); + } + + { + // Just ending character. + uint8_t data[] = ">"; + CPDF_SyntaxParser parser; + parser.InitParser(IFX_MemoryStream::Create(data, 1, false), 0); + EXPECT_EQ("", parser.ReadHexString()); + EXPECT_EQ(1, parser.SavePos()); + } +} + +TEST(cpdf_syntax_parser, GetInvalidReference) { + CPDF_SyntaxParser parser; + // Data with a reference with number CPDF_Object::kInvalidObjNum + uint8_t data[] = "4294967295 0 R"; + parser.InitParser(IFX_MemoryStream::Create(data, 14, false), 0); + std::unique_ptr ref = + parser.GetObject(nullptr, CPDF_Object::kInvalidObjNum, 0, false); + EXPECT_FALSE(ref); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode.cpp new file mode 100644 index 000000000000..480e2c111f4c --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode.cpp @@ -0,0 +1,575 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/fpdf_parser_decode.h" + +#include + +#include +#include +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/fpdf_parser_utility.h" +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/fx_ext.h" +#include "third_party/base/stl_util.h" + +namespace { + +const uint32_t kMaxStreamSize = 20 * 1024 * 1024; + +bool CheckFlateDecodeParams(int Colors, int BitsPerComponent, int Columns) { + if (Colors < 0 || BitsPerComponent < 0 || Columns < 0) + return false; + + int check = Columns; + if (check > 0 && Colors > INT_MAX / check) + return false; + + check *= Colors; + if (check > 0 && BitsPerComponent > INT_MAX / check) + return false; + + return check * BitsPerComponent <= INT_MAX - 7; +} + +} // namespace + +const uint16_t PDFDocEncoding[256] = { + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, + 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, + 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x02d8, 0x02c7, 0x02c6, + 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, 0x0020, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, + 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, + 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, + 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, + 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, + 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, + 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, + 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, + 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, + 0x007e, 0x0000, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, + 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, + 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, 0x0178, + 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000, 0x20ac, 0x00a1, + 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, + 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, + 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, + 0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, + 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, + 0x00cf, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, + 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, + 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, + 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, + 0x00fc, 0x00fd, 0x00fe, 0x00ff}; + +uint32_t A85Decode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t*& dest_buf, + uint32_t& dest_size) { + dest_size = 0; + dest_buf = nullptr; + if (src_size == 0) + return 0; + + // Count legal characters and zeros. + uint32_t zcount = 0; + uint32_t pos = 0; + while (pos < src_size) { + uint8_t ch = src_buf[pos]; + if (ch == 'z') { + zcount++; + } else if ((ch < '!' || ch > 'u') && !PDFCharIsLineEnding(ch) && + ch != ' ' && ch != '\t') { + break; + } + pos++; + } + // No content to decode. + if (pos == 0) + return 0; + + // Count the space needed to contain non-zero characters. The encoding ratio + // of Ascii85 is 4:5. + uint32_t space_for_non_zeroes = (pos - zcount) / 5 * 4 + 4; + if (zcount > (UINT_MAX - space_for_non_zeroes) / 4) { + return (uint32_t)-1; + } + dest_buf = FX_Alloc(uint8_t, zcount * 4 + space_for_non_zeroes); + size_t state = 0; + uint32_t res = 0; + pos = dest_size = 0; + while (pos < src_size) { + uint8_t ch = src_buf[pos++]; + if (PDFCharIsLineEnding(ch) || ch == ' ' || ch == '\t') + continue; + + if (ch == 'z') { + FXSYS_memset(dest_buf + dest_size, 0, 4); + state = 0; + res = 0; + dest_size += 4; + } else if (ch >= '!' && ch <= 'u') { + res = res * 85 + ch - 33; + state++; + if (state == 5) { + for (size_t i = 0; i < 4; i++) { + dest_buf[dest_size++] = (uint8_t)(res >> (3 - i) * 8); + } + state = 0; + res = 0; + } + } else { + // The end or illegal character. + break; + } + } + // Handle partial group. + if (state) { + for (size_t i = state; i < 5; i++) + res = res * 85 + 84; + for (size_t i = 0; i < state - 1; i++) + dest_buf[dest_size++] = (uint8_t)(res >> (3 - i) * 8); + } + if (pos < src_size && src_buf[pos] == '>') + pos++; + return pos; +} + +uint32_t HexDecode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t*& dest_buf, + uint32_t& dest_size) { + dest_size = 0; + if (src_size == 0) { + dest_buf = nullptr; + return 0; + } + + uint32_t i = 0; + // Find the end of data. + while (i < src_size && src_buf[i] != '>') + i++; + + dest_buf = FX_Alloc(uint8_t, i / 2 + 1); + bool bFirst = true; + for (i = 0; i < src_size; i++) { + uint8_t ch = src_buf[i]; + if (PDFCharIsLineEnding(ch) || ch == ' ' || ch == '\t') + continue; + + if (ch == '>') { + ++i; + break; + } + if (!std::isxdigit(ch)) + continue; + + int digit = FXSYS_toHexDigit(ch); + if (bFirst) + dest_buf[dest_size] = digit * 16; + else + dest_buf[dest_size++] += digit; + + bFirst = !bFirst; + } + if (!bFirst) + dest_size++; + return i; +} + +uint32_t RunLengthDecode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t*& dest_buf, + uint32_t& dest_size) { + uint32_t i = 0; + dest_size = 0; + while (i < src_size) { + if (src_buf[i] == 128) + break; + + uint32_t old = dest_size; + if (src_buf[i] < 128) { + dest_size += src_buf[i] + 1; + if (dest_size < old) + return FX_INVALID_OFFSET; + i += src_buf[i] + 2; + } else { + dest_size += 257 - src_buf[i]; + if (dest_size < old) + return FX_INVALID_OFFSET; + i += 2; + } + } + if (dest_size >= kMaxStreamSize) + return FX_INVALID_OFFSET; + + dest_buf = FX_Alloc(uint8_t, dest_size); + i = 0; + int dest_count = 0; + while (i < src_size) { + if (src_buf[i] == 128) + break; + + if (src_buf[i] < 128) { + uint32_t copy_len = src_buf[i] + 1; + uint32_t buf_left = src_size - i - 1; + if (buf_left < copy_len) { + uint32_t delta = copy_len - buf_left; + copy_len = buf_left; + FXSYS_memset(dest_buf + dest_count + copy_len, '\0', delta); + } + FXSYS_memcpy(dest_buf + dest_count, src_buf + i + 1, copy_len); + dest_count += src_buf[i] + 1; + i += src_buf[i] + 2; + } else { + int fill = 0; + if (i < src_size - 1) { + fill = src_buf[i + 1]; + } + FXSYS_memset(dest_buf + dest_count, fill, 257 - src_buf[i]); + dest_count += 257 - src_buf[i]; + i += 2; + } + } + + return std::min(i + 1, src_size); +} + +std::unique_ptr FPDFAPI_CreateFaxDecoder( + const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + const CPDF_Dictionary* pParams) { + int K = 0; + bool EndOfLine = false; + bool ByteAlign = false; + bool BlackIs1 = false; + int Columns = 1728; + int Rows = 0; + if (pParams) { + K = pParams->GetIntegerFor("K"); + EndOfLine = !!pParams->GetIntegerFor("EndOfLine"); + ByteAlign = !!pParams->GetIntegerFor("EncodedByteAlign"); + BlackIs1 = !!pParams->GetIntegerFor("BlackIs1"); + Columns = pParams->GetIntegerFor("Columns", 1728); + Rows = pParams->GetIntegerFor("Rows"); + if (Rows > USHRT_MAX) { + Rows = 0; + } + } + return CPDF_ModuleMgr::Get()->GetFaxModule()->CreateDecoder( + src_buf, src_size, width, height, K, EndOfLine, ByteAlign, BlackIs1, + Columns, Rows); +} + +std::unique_ptr FPDFAPI_CreateFlateDecoder( + const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + int bpc, + const CPDF_Dictionary* pParams) { + int predictor = 0; + int Colors = 0, BitsPerComponent = 0, Columns = 0; + if (pParams) { + predictor = pParams->GetIntegerFor("Predictor"); + Colors = pParams->GetIntegerFor("Colors", 1); + BitsPerComponent = pParams->GetIntegerFor("BitsPerComponent", 8); + Columns = pParams->GetIntegerFor("Columns", 1); + if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) + return nullptr; + } + return CPDF_ModuleMgr::Get()->GetFlateModule()->CreateDecoder( + src_buf, src_size, width, height, nComps, bpc, predictor, Colors, + BitsPerComponent, Columns); +} + +uint32_t FPDFAPI_FlateOrLZWDecode(bool bLZW, + const uint8_t* src_buf, + uint32_t src_size, + CPDF_Dictionary* pParams, + uint32_t estimated_size, + uint8_t*& dest_buf, + uint32_t& dest_size) { + int predictor = 0; + int Colors = 0; + int BitsPerComponent = 0; + int Columns = 0; + bool bEarlyChange = true; + if (pParams) { + predictor = pParams->GetIntegerFor("Predictor"); + bEarlyChange = !!pParams->GetIntegerFor("EarlyChange", 1); + Colors = pParams->GetIntegerFor("Colors", 1); + BitsPerComponent = pParams->GetIntegerFor("BitsPerComponent", 8); + Columns = pParams->GetIntegerFor("Columns", 1); + if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) + return (uint32_t)-1; + } + return CPDF_ModuleMgr::Get()->GetFlateModule()->FlateOrLZWDecode( + bLZW, src_buf, src_size, bEarlyChange, predictor, Colors, + BitsPerComponent, Columns, estimated_size, dest_buf, dest_size); +} + +bool PDF_DataDecode(const uint8_t* src_buf, + uint32_t src_size, + const CPDF_Dictionary* pDict, + uint8_t*& dest_buf, + uint32_t& dest_size, + CFX_ByteString& ImageEncoding, + CPDF_Dictionary*& pImageParms, + uint32_t last_estimated_size, + bool bImageAcc) { + CPDF_Object* pDecoder = pDict ? pDict->GetDirectObjectFor("Filter") : nullptr; + if (!pDecoder || (!pDecoder->IsArray() && !pDecoder->IsName())) + return false; + + CPDF_Object* pParams = + pDict ? pDict->GetDirectObjectFor("DecodeParms") : nullptr; + + std::vector> DecoderArray; + if (CPDF_Array* pDecoders = pDecoder->AsArray()) { + CPDF_Array* pParamsArray = ToArray(pParams); + for (size_t i = 0; i < pDecoders->GetCount(); i++) { + DecoderArray.push_back( + {pDecoders->GetStringAt(i), + pParamsArray ? pParamsArray->GetDictAt(i) : nullptr}); + } + } else { + DecoderArray.push_back( + {pDecoder->GetString(), pParams ? pParams->GetDict() : nullptr}); + } + uint8_t* last_buf = const_cast(src_buf); + uint32_t last_size = src_size; + int nSize = pdfium::CollectionSize(DecoderArray); + for (int i = 0; i < nSize; i++) { + int estimated_size = i == nSize - 1 ? last_estimated_size : 0; + CFX_ByteString decoder = DecoderArray[i].first; + CPDF_Dictionary* pParam = ToDictionary(DecoderArray[i].second); + uint8_t* new_buf = nullptr; + uint32_t new_size = (uint32_t)-1; + int offset = -1; + if (decoder == "FlateDecode" || decoder == "Fl") { + if (bImageAcc && i == nSize - 1) { + ImageEncoding = "FlateDecode"; + dest_buf = (uint8_t*)last_buf; + dest_size = last_size; + pImageParms = pParam; + return true; + } + offset = FPDFAPI_FlateOrLZWDecode(false, last_buf, last_size, pParam, + estimated_size, new_buf, new_size); + } else if (decoder == "LZWDecode" || decoder == "LZW") { + offset = FPDFAPI_FlateOrLZWDecode(true, last_buf, last_size, pParam, + estimated_size, new_buf, new_size); + } else if (decoder == "ASCII85Decode" || decoder == "A85") { + offset = A85Decode(last_buf, last_size, new_buf, new_size); + } else if (decoder == "ASCIIHexDecode" || decoder == "AHx") { + offset = HexDecode(last_buf, last_size, new_buf, new_size); + } else if (decoder == "RunLengthDecode" || decoder == "RL") { + if (bImageAcc && i == nSize - 1) { + ImageEncoding = "RunLengthDecode"; + dest_buf = (uint8_t*)last_buf; + dest_size = last_size; + pImageParms = pParam; + return true; + } + offset = RunLengthDecode(last_buf, last_size, new_buf, new_size); + } else if (decoder == "Crypt") { + continue; + } else { + // If we get here, assume it's an image decoder. + if (decoder == "DCT") { + decoder = "DCTDecode"; + } else if (decoder == "CCF") { + decoder = "CCITTFaxDecode"; + } + ImageEncoding = decoder; + pImageParms = pParam; + dest_buf = (uint8_t*)last_buf; + dest_size = last_size; + if (CPDF_Array* pDecoders = pDecoder->AsArray()) + pDecoders->RemoveAt(i + 1, pDecoders->GetCount() - i - 1); + return true; + } + if (last_buf != src_buf) { + FX_Free(last_buf); + } + if (offset == -1) { + FX_Free(new_buf); + return false; + } + last_buf = new_buf; + last_size = new_size; + } + ImageEncoding = ""; + pImageParms = nullptr; + dest_buf = last_buf; + dest_size = last_size; + return true; +} + +CFX_WideString PDF_DecodeText(const uint8_t* src_data, uint32_t src_len) { + CFX_WideString result; + if (src_len >= 2 && ((src_data[0] == 0xfe && src_data[1] == 0xff) || + (src_data[0] == 0xff && src_data[1] == 0xfe))) { + bool bBE = src_data[0] == 0xfe; + uint32_t max_chars = (src_len - 2) / 2; + if (!max_chars) { + return result; + } + if (src_data[0] == 0xff) { + bBE = !src_data[2]; + } + FX_WCHAR* dest_buf = result.GetBuffer(max_chars); + const uint8_t* uni_str = src_data + 2; + int dest_pos = 0; + for (uint32_t i = 0; i < max_chars * 2; i += 2) { + uint16_t unicode = bBE ? (uni_str[i] << 8 | uni_str[i + 1]) + : (uni_str[i + 1] << 8 | uni_str[i]); + if (unicode == 0x1b) { + i += 2; + while (i < max_chars * 2) { + uint16_t unicode2 = bBE ? (uni_str[i] << 8 | uni_str[i + 1]) + : (uni_str[i + 1] << 8 | uni_str[i]); + i += 2; + if (unicode2 == 0x1b) + break; + } + } else { + dest_buf[dest_pos++] = unicode; + } + } + result.ReleaseBuffer(dest_pos); + } else { + FX_WCHAR* dest_buf = result.GetBuffer(src_len); + for (uint32_t i = 0; i < src_len; i++) + dest_buf[i] = PDFDocEncoding[src_data[i]]; + result.ReleaseBuffer(src_len); + } + return result; +} + +CFX_WideString PDF_DecodeText(const CFX_ByteString& bstr) { + return PDF_DecodeText((const uint8_t*)bstr.c_str(), bstr.GetLength()); +} + +CFX_ByteString PDF_EncodeText(const FX_WCHAR* pString, int len) { + if (len == -1) { + len = FXSYS_wcslen(pString); + } + CFX_ByteString result; + FX_CHAR* dest_buf1 = result.GetBuffer(len); + int i; + for (i = 0; i < len; i++) { + int code; + for (code = 0; code < 256; code++) + if (PDFDocEncoding[code] == pString[i]) { + break; + } + if (code == 256) { + break; + } + dest_buf1[i] = code; + } + result.ReleaseBuffer(i); + if (i == len) { + return result; + } + + if (len > INT_MAX / 2 - 1) { + result.ReleaseBuffer(0); + return result; + } + + int encLen = len * 2 + 2; + + uint8_t* dest_buf2 = (uint8_t*)result.GetBuffer(encLen); + dest_buf2[0] = 0xfe; + dest_buf2[1] = 0xff; + dest_buf2 += 2; + for (int j = 0; j < len; j++) { + *dest_buf2++ = pString[j] >> 8; + *dest_buf2++ = (uint8_t)pString[j]; + } + result.ReleaseBuffer(encLen); + return result; +} + +CFX_ByteString PDF_EncodeText(const CFX_WideString& str) { + return PDF_EncodeText(str.c_str(), str.GetLength()); +} + +CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, bool bHex) { + CFX_ByteTextBuf result; + int srclen = src.GetLength(); + if (bHex) { + result.AppendChar('<'); + for (int i = 0; i < srclen; i++) { + result.AppendChar("0123456789ABCDEF"[src[i] / 16]); + result.AppendChar("0123456789ABCDEF"[src[i] % 16]); + } + result.AppendChar('>'); + return result.MakeString(); + } + result.AppendChar('('); + for (int i = 0; i < srclen; i++) { + uint8_t ch = src[i]; + if (ch == 0x0a) { + result << "\\n"; + continue; + } + if (ch == 0x0d) { + result << "\\r"; + continue; + } + if (ch == ')' || ch == '\\' || ch == '(') + result.AppendChar('\\'); + result.AppendChar(ch); + } + result.AppendChar(')'); + return result.MakeString(); +} + +bool FlateEncode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t** dest_buf, + uint32_t* dest_size) { + CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule(); + return pEncoders && + pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, + dest_size); +} + +bool PngEncode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t** dest_buf, + uint32_t* dest_size) { + CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule(); + return pEncoders && + pEncoders->GetFlateModule()->PngEncode(src_buf, src_size, dest_buf, + dest_size); +} + +uint32_t FlateDecode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t*& dest_buf, + uint32_t& dest_size) { + CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule(); + if (pEncoders) { + return pEncoders->GetFlateModule()->FlateOrLZWDecode( + false, src_buf, src_size, false, 0, 0, 0, 0, 0, dest_buf, dest_size); + } + return 0; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode.h b/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode.h new file mode 100644 index 000000000000..dc8ecf0c9b56 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode.h @@ -0,0 +1,95 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_FPDF_PARSER_DECODE_H_ +#define CORE_FPDFAPI_PARSER_FPDF_PARSER_DECODE_H_ + +#include + +#include "core/fxcrt/fx_basic.h" + +class CCodec_ScanlineDecoder; +class CPDF_Dictionary; + +// Indexed by 8-bit char code, contains unicode code points. +extern const uint16_t PDFDocEncoding[256]; + +CFX_ByteString PDF_NameDecode(const CFX_ByteStringC& orig); +CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig); +CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig); +CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, bool bHex = false); +CFX_WideString PDF_DecodeText(const uint8_t* pData, uint32_t size); +CFX_WideString PDF_DecodeText(const CFX_ByteString& bstr); +CFX_ByteString PDF_EncodeText(const FX_WCHAR* pString, int len = -1); +CFX_ByteString PDF_EncodeText(const CFX_WideString& str); + +bool FlateEncode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t** dest_buf, + uint32_t* dest_size); + +// This used to have more parameters like the predictor and bpc, but there was +// only one caller, so the interface has been simplified, the values are hard +// coded, and dead code has been removed. +bool PngEncode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t** dest_buf, + uint32_t* dest_size); + +uint32_t FlateDecode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t*& dest_buf, + uint32_t& dest_size); +uint32_t RunLengthDecode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t*& dest_buf, + uint32_t& dest_size); + +std::unique_ptr FPDFAPI_CreateFaxDecoder( + const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + const CPDF_Dictionary* pParams); + +std::unique_ptr FPDFAPI_CreateFlateDecoder( + const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + int bpc, + const CPDF_Dictionary* pParams); + +// Public for testing. +uint32_t A85Decode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t*& dest_buf, + uint32_t& dest_size); +// Public for testing. +uint32_t HexDecode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t*& dest_buf, + uint32_t& dest_size); +// Public for testing. +uint32_t FPDFAPI_FlateOrLZWDecode(bool bLZW, + const uint8_t* src_buf, + uint32_t src_size, + CPDF_Dictionary* pParams, + uint32_t estimated_size, + uint8_t*& dest_buf, + uint32_t& dest_size); +bool PDF_DataDecode(const uint8_t* src_buf, + uint32_t src_size, + const CPDF_Dictionary* pDict, + uint8_t*& dest_buf, + uint32_t& dest_size, + CFX_ByteString& ImageEncoding, + CPDF_Dictionary*& pImageParms, + uint32_t estimated_size, + bool bImageAcc); + +#endif // CORE_FPDFAPI_PARSER_FPDF_PARSER_DECODE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp new file mode 100644 index 000000000000..9dfc26e369f3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp @@ -0,0 +1,126 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/fpdf_parser_decode.h" + +#include +#include + +#include "core/fxcrt/fx_basic.h" +#include "testing/embedder_test.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" + +class FPDFParserDecodeEmbeddertest : public EmbedderTest {}; + +// NOTE: python's zlib.compress() and zlib.decompress() may be useful for +// external validation of the FlateEncode/FlateDecode test cases. + +TEST_F(FPDFParserDecodeEmbeddertest, FlateEncode) { + pdfium::StrFuncTestData flate_encode_cases[] = { + STR_IN_OUT_CASE("", "\x78\x9c\x03\x00\x00\x00\x00\x01"), + STR_IN_OUT_CASE(" ", "\x78\x9c\x53\x00\x00\x00\x21\x00\x21"), + STR_IN_OUT_CASE("123", "\x78\x9c\x33\x34\x32\x06\x00\01\x2d\x00\x97"), + STR_IN_OUT_CASE("\x00\xff", "\x78\x9c\x63\xf8\x0f\x00\x01\x01\x01\x00"), + STR_IN_OUT_CASE( + "1 0 0 -1 29 763 cm\n0 0 555 735 re\nW n\nq\n0 0 555 734.394 re\n" + "W n\nq\n0.8009 0 0 0.8009 0 0 cm\n1 1 1 RG 1 1 1 rg\n/G0 gs\n" + "0 0 693 917 re\nf\nQ\nQ\n", + "\x78\x9c\x33\x54\x30\x00\x42\x5d\x43\x05\x23\x4b\x05\x73\x33\x63" + "\x85\xe4\x5c\x2e\x90\x80\xa9\xa9\xa9\x82\xb9\xb1\xa9\x42\x51\x2a" + "\x57\xb8\x42\x1e\x57\x21\x92\xa0\x89\x9e\xb1\xa5\x09\x92\x84\x9e" + "\x85\x81\x81\x25\xd8\x14\x24\x26\xd0\x18\x43\x05\x10\x0c\x72\x57" + "\x80\x30\x8a\xd2\xb9\xf4\xdd\x0d\x14\xd2\x8b\xc1\x46\x99\x59\x1a" + "\x2b\x58\x1a\x9a\x83\x8c\x49\xe3\x0a\x04\x42\x00\x37\x4c\x1b\x42"), + }; + + for (size_t i = 0; i < FX_ArraySize(flate_encode_cases); ++i) { + const pdfium::StrFuncTestData& data = flate_encode_cases[i]; + unsigned char* buf = nullptr; + unsigned int buf_size; + EXPECT_TRUE(FlateEncode(data.input, data.input_size, &buf, &buf_size)); + ASSERT_TRUE(buf); + EXPECT_EQ(std::string((const char*)data.expected, data.expected_size), + std::string((const char*)buf, buf_size)) + << " for case " << i; + FX_Free(buf); + } +} + +TEST_F(FPDFParserDecodeEmbeddertest, FlateDecode) { + pdfium::DecodeTestData flate_decode_cases[] = { + STR_IN_OUT_CASE("", "", 0), + STR_IN_OUT_CASE("preposterous nonsense", "", 2), + STR_IN_OUT_CASE("\x78\x9c\x03\x00\x00\x00\x00\x01", "", 8), + STR_IN_OUT_CASE("\x78\x9c\x53\x00\x00\x00\x21\x00\x21", " ", 9), + STR_IN_OUT_CASE("\x78\x9c\x33\x34\x32\x06\x00\01\x2d\x00\x97", "123", 11), + STR_IN_OUT_CASE("\x78\x9c\x63\xf8\x0f\x00\x01\x01\x01\x00", "\x00\xff", + 10), + STR_IN_OUT_CASE( + "\x78\x9c\x33\x54\x30\x00\x42\x5d\x43\x05\x23\x4b\x05\x73\x33\x63" + "\x85\xe4\x5c\x2e\x90\x80\xa9\xa9\xa9\x82\xb9\xb1\xa9\x42\x51\x2a" + "\x57\xb8\x42\x1e\x57\x21\x92\xa0\x89\x9e\xb1\xa5\x09\x92\x84\x9e" + "\x85\x81\x81\x25\xd8\x14\x24\x26\xd0\x18\x43\x05\x10\x0c\x72\x57" + "\x80\x30\x8a\xd2\xb9\xf4\xdd\x0d\x14\xd2\x8b\xc1\x46\x99\x59\x1a" + "\x2b\x58\x1a\x9a\x83\x8c\x49\xe3\x0a\x04\x42\x00\x37\x4c\x1b\x42", + "1 0 0 -1 29 763 cm\n0 0 555 735 re\nW n\nq\n0 0 555 734.394 re\n" + "W n\nq\n0.8009 0 0 0.8009 0 0 cm\n1 1 1 RG 1 1 1 rg\n/G0 gs\n" + "0 0 693 917 re\nf\nQ\nQ\n", + 96), + }; + + for (size_t i = 0; i < FX_ArraySize(flate_decode_cases); ++i) { + const pdfium::DecodeTestData& data = flate_decode_cases[i]; + unsigned char* result = nullptr; + unsigned int result_size; + EXPECT_EQ(data.processed_size, + FlateDecode(data.input, data.input_size, result, result_size)) + << " for case " << i; + ASSERT_TRUE(result); + EXPECT_EQ(std::string((const char*)data.expected, data.expected_size), + std::string((const char*)result, result_size)) + << " for case " << i; + FX_Free(result); + } +} + +TEST_F(FPDFParserDecodeEmbeddertest, Bug_552046) { + // Tests specifying multiple image filters for a stream. Should not cause a + // crash when rendered. + EXPECT_TRUE(OpenDocument("bug_552046.pdf")); + FPDF_PAGE page = LoadPage(0); + FPDF_BITMAP bitmap = RenderPage(page); + CompareBitmap(bitmap, 612, 792, "1940568c9ba33bac5d0b1ee9558c76b3"); + FPDFBitmap_Destroy(bitmap); + UnloadPage(page); +} + +TEST_F(FPDFParserDecodeEmbeddertest, Bug_555784) { + // Tests bad input to the run length decoder that caused a heap overflow. + // Should not cause a crash when rendered. + EXPECT_TRUE(OpenDocument("bug_555784.pdf")); + FPDF_PAGE page = LoadPage(0); + FPDF_BITMAP bitmap = RenderPage(page); + CompareBitmap(bitmap, 612, 792, "1940568c9ba33bac5d0b1ee9558c76b3"); + FPDFBitmap_Destroy(bitmap); + UnloadPage(page); +} + +TEST_F(FPDFParserDecodeEmbeddertest, Bug_455199) { + // Tests object numbers with a value > 01000000. + // Should open successfully. + EXPECT_TRUE(OpenDocument("bug_455199.pdf")); + FPDF_PAGE page = LoadPage(0); + FPDF_BITMAP bitmap = RenderPage(page); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + // Rendering on Mac is inconsistent, so skip this check. + const char* const kExpectedMd5sum = nullptr; +#else + const char kExpectedMd5sum[] = "6f9f0fd903da177babb24dd50a806a56"; +#endif + CompareBitmap(bitmap, 200, 200, kExpectedMd5sum); + FPDFBitmap_Destroy(bitmap); + UnloadPage(page); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp new file mode 100644 index 000000000000..30d30a433da9 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp @@ -0,0 +1,111 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/fpdf_parser_decode.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" + +TEST(fpdf_parser_decode, A85Decode) { + pdfium::DecodeTestData test_data[] = { + // Empty src string. + STR_IN_OUT_CASE("", "", 0), + // Empty content in src string. + STR_IN_OUT_CASE("~>", "", 0), + // Regular conversion. + STR_IN_OUT_CASE("FCfN8~>", "test", 7), + // End at the ending mark. + STR_IN_OUT_CASE("FCfN8~>FCfN8", "test", 7), + // Skip whitespaces. + STR_IN_OUT_CASE("\t F C\r\n \tf N 8 ~>", "test", 17), + // No ending mark. + STR_IN_OUT_CASE("@3B0)DJj_BF*)>@Gp#-s", "a funny story :)", 20), + // Non-multiple length. + STR_IN_OUT_CASE("12A", "2k", 3), + // Stop at unknown characters. + STR_IN_OUT_CASE("FCfN8FCfN8vw", "testtest", 11), + }; + for (size_t i = 0; i < FX_ArraySize(test_data); ++i) { + pdfium::DecodeTestData* ptr = &test_data[i]; + uint8_t* result = nullptr; + uint32_t result_size = 0; + EXPECT_EQ(ptr->processed_size, + A85Decode(ptr->input, ptr->input_size, result, result_size)) + << "for case " << i; + ASSERT_EQ(ptr->expected_size, result_size); + for (size_t j = 0; j < result_size; ++j) { + EXPECT_EQ(ptr->expected[j], result[j]) << "for case " << i << " char " + << j; + } + FX_Free(result); + } +} + +TEST(fpdf_parser_decode, HexDecode) { + pdfium::DecodeTestData test_data[] = { + // Empty src string. + STR_IN_OUT_CASE("", "", 0), + // Empty content in src string. + STR_IN_OUT_CASE(">", "", 1), + // Only whitespaces in src string. + STR_IN_OUT_CASE("\t \r\n>", "", 7), + // Regular conversion. + STR_IN_OUT_CASE("12Ac>zzz", "\x12\xac", 5), + // Skip whitespaces. + STR_IN_OUT_CASE("12 Ac\t02\r\nBF>zzz>", "\x12\xac\x02\xbf", 13), + // Non-multiple length. + STR_IN_OUT_CASE("12A>zzz", "\x12\xa0", 4), + // Skips unknown characters. + STR_IN_OUT_CASE("12tk \tAc>zzz", "\x12\xac", 10), + // No ending mark. + STR_IN_OUT_CASE("12AcED3c3456", "\x12\xac\xed\x3c\x34\x56", 12), + }; + for (size_t i = 0; i < FX_ArraySize(test_data); ++i) { + pdfium::DecodeTestData* ptr = &test_data[i]; + uint8_t* result = nullptr; + uint32_t result_size = 0; + EXPECT_EQ(ptr->processed_size, + HexDecode(ptr->input, ptr->input_size, result, result_size)) + << "for case " << i; + ASSERT_EQ(ptr->expected_size, result_size); + for (size_t j = 0; j < result_size; ++j) { + EXPECT_EQ(ptr->expected[j], result[j]) << "for case " << i << " char " + << j; + } + FX_Free(result); + } +} + +TEST(fpdf_parser_decode, EncodeText) { + struct EncodeTestData { + const FX_WCHAR* input; + const FX_CHAR* expected_output; + FX_STRSIZE expected_length; + } test_data[] = { + // Empty src string. + {L"", "", 0}, + // ASCII text. + {L"the quick\tfox", "the quick\tfox", 13}, + // Unicode text. + {L"\x0330\x0331", "\xFE\xFF\x03\x30\x03\x31", 6}, + // More Unicode text. + {L"\x7F51\x9875\x0020\x56FE\x7247\x0020" + L"\x8D44\x8BAF\x66F4\x591A\x0020\x00BB", + "\xFE\xFF\x7F\x51\x98\x75\x00\x20\x56\xFE\x72\x47\x00" + "\x20\x8D\x44\x8B\xAF\x66\xF4\x59\x1A\x00\x20\x00\xBB", + 26}, + }; + + for (size_t i = 0; i < FX_ArraySize(test_data); ++i) { + const auto& test_case = test_data[i]; + CFX_ByteString output = PDF_EncodeText(test_case.input); + ASSERT_EQ(test_case.expected_length, output.GetLength()) << "for case " + << i; + const FX_CHAR* str_ptr = output.c_str(); + for (FX_STRSIZE j = 0; j < test_case.expected_length; ++j) { + EXPECT_EQ(test_case.expected_output[j], str_ptr[j]) << "for case " << i + << " char " << j; + } + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_utility.cpp b/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_utility.cpp new file mode 100644 index 000000000000..9583ea70bcb4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_utility.cpp @@ -0,0 +1,222 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/parser/fpdf_parser_utility.h" + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_boolean.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fxcrt/fx_ext.h" + +// Indexed by 8-bit character code, contains either: +// 'W' - for whitespace: NUL, TAB, CR, LF, FF, SPACE, 0x80, 0xff +// 'N' - for numeric: 0123456789+-. +// 'D' - for delimiter: %()/<>[]{} +// 'R' - otherwise. +const char PDF_CharType[256] = { + // NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO + // SI + 'W', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'W', 'W', 'R', 'W', 'W', 'R', + 'R', + + // DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS + // US + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', + 'R', + + // SP ! " # $ % & ´ ( ) * + , - . + // / + 'W', 'R', 'R', 'R', 'R', 'D', 'R', 'R', 'D', 'D', 'R', 'N', 'R', 'N', 'N', + 'D', + + // 0 1 2 3 4 5 6 7 8 9 : ; < = > ? + 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'R', 'R', 'D', 'R', 'D', + 'R', + + // @ A B C D E F G H I J K L M N O + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', + 'R', + + // P Q R S T U V W X Y Z [ \ ] ^ _ + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'D', 'R', 'D', 'R', + 'R', + + // ` a b c d e f g h i j k l m n o + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', + 'R', + + // p q r s t u v w x y z { | } ~ + // DEL + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'D', 'R', 'D', 'R', + 'R', + + 'W', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', + 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'W'}; + +int32_t GetHeaderOffset(const CFX_RetainPtr& pFile) { + const size_t kBufSize = 4; + uint8_t buf[kBufSize]; + for (int32_t offset = 0; offset <= 1024; ++offset) { + if (!pFile->ReadBlock(buf, offset, kBufSize)) + return -1; + + if (memcmp(buf, "%PDF", 4) == 0) + return offset; + } + return -1; +} + +int32_t GetDirectInteger(CPDF_Dictionary* pDict, const CFX_ByteString& key) { + CPDF_Number* pObj = ToNumber(pDict->GetObjectFor(key)); + return pObj ? pObj->GetInteger() : 0; +} + +CFX_ByteString PDF_NameDecode(const CFX_ByteStringC& bstr) { + if (bstr.Find('#') == -1) + return CFX_ByteString(bstr); + + int size = bstr.GetLength(); + CFX_ByteString result; + FX_CHAR* pDestStart = result.GetBuffer(size); + FX_CHAR* pDest = pDestStart; + for (int i = 0; i < size; i++) { + if (bstr[i] == '#' && i < size - 2) { + *pDest++ = + FXSYS_toHexDigit(bstr[i + 1]) * 16 + FXSYS_toHexDigit(bstr[i + 2]); + i += 2; + } else { + *pDest++ = bstr[i]; + } + } + result.ReleaseBuffer((FX_STRSIZE)(pDest - pDestStart)); + return result; +} + +CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig) { + if (orig.Find('#') == -1) + return orig; + return PDF_NameDecode(orig.AsStringC()); +} + +CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig) { + uint8_t* src_buf = (uint8_t*)orig.c_str(); + int src_len = orig.GetLength(); + int dest_len = 0; + int i; + for (i = 0; i < src_len; i++) { + uint8_t ch = src_buf[i]; + if (ch >= 0x80 || PDFCharIsWhitespace(ch) || ch == '#' || + PDFCharIsDelimiter(ch)) { + dest_len += 3; + } else { + dest_len++; + } + } + if (dest_len == src_len) + return orig; + + CFX_ByteString res; + FX_CHAR* dest_buf = res.GetBuffer(dest_len); + dest_len = 0; + for (i = 0; i < src_len; i++) { + uint8_t ch = src_buf[i]; + if (ch >= 0x80 || PDFCharIsWhitespace(ch) || ch == '#' || + PDFCharIsDelimiter(ch)) { + dest_buf[dest_len++] = '#'; + dest_buf[dest_len++] = "0123456789ABCDEF"[ch / 16]; + dest_buf[dest_len++] = "0123456789ABCDEF"[ch % 16]; + } else { + dest_buf[dest_len++] = ch; + } + } + dest_buf[dest_len] = 0; + res.ReleaseBuffer(); + return res; +} + +CFX_ByteTextBuf& operator<<(CFX_ByteTextBuf& buf, const CPDF_Object* pObj) { + if (!pObj) { + buf << " null"; + return buf; + } + switch (pObj->GetType()) { + case CPDF_Object::NULLOBJ: + buf << " null"; + break; + case CPDF_Object::BOOLEAN: + case CPDF_Object::NUMBER: + buf << " " << pObj->GetString(); + break; + case CPDF_Object::STRING: + buf << PDF_EncodeString(pObj->GetString(), pObj->AsString()->IsHex()); + break; + case CPDF_Object::NAME: { + CFX_ByteString str = pObj->GetString(); + buf << "/" << PDF_NameEncode(str); + break; + } + case CPDF_Object::REFERENCE: { + buf << " " << pObj->AsReference()->GetRefObjNum() << " 0 R "; + break; + } + case CPDF_Object::ARRAY: { + const CPDF_Array* p = pObj->AsArray(); + buf << "["; + for (size_t i = 0; i < p->GetCount(); i++) { + CPDF_Object* pElement = p->GetObjectAt(i); + if (pElement && !pElement->IsInline()) { + buf << " " << pElement->GetObjNum() << " 0 R"; + } else { + buf << pElement; + } + } + buf << "]"; + break; + } + case CPDF_Object::DICTIONARY: { + const CPDF_Dictionary* p = pObj->AsDictionary(); + buf << "<<"; + for (const auto& it : *p) { + const CFX_ByteString& key = it.first; + CPDF_Object* pValue = it.second.get(); + buf << "/" << PDF_NameEncode(key); + if (pValue && !pValue->IsInline()) { + buf << " " << pValue->GetObjNum() << " 0 R "; + } else { + buf << pValue; + } + } + buf << ">>"; + break; + } + case CPDF_Object::STREAM: { + const CPDF_Stream* p = pObj->AsStream(); + buf << p->GetDict() << "stream\r\n"; + CPDF_StreamAcc acc; + acc.LoadAllData(p, true); + buf.AppendBlock(acc.GetData(), acc.GetSize()); + buf << "\r\nendstream"; + break; + } + default: + ASSERT(false); + break; + } + return buf; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_utility.h b/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_utility.h new file mode 100644 index 000000000000..29f54ee853f5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/parser/fpdf_parser_utility.h @@ -0,0 +1,40 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_PARSER_FPDF_PARSER_UTILITY_H_ +#define CORE_FPDFAPI_PARSER_FPDF_PARSER_UTILITY_H_ + +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class IFX_SeekableReadStream; +class CPDF_Dictionary; + +// Use the accessors below instead of directly accessing PDF_CharType. +extern const char PDF_CharType[256]; + +inline bool PDFCharIsWhitespace(uint8_t c) { + return PDF_CharType[c] == 'W'; +} +inline bool PDFCharIsNumeric(uint8_t c) { + return PDF_CharType[c] == 'N'; +} +inline bool PDFCharIsDelimiter(uint8_t c) { + return PDF_CharType[c] == 'D'; +} +inline bool PDFCharIsOther(uint8_t c) { + return PDF_CharType[c] == 'R'; +} + +inline bool PDFCharIsLineEnding(uint8_t c) { + return c == '\r' || c == '\n'; +} + +int32_t GetHeaderOffset(const CFX_RetainPtr& pFile); +int32_t GetDirectInteger(CPDF_Dictionary* pDict, const CFX_ByteString& key); + +#endif // CORE_FPDFAPI_PARSER_FPDF_PARSER_UTILITY_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_charposlist.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_charposlist.cpp new file mode 100644 index 000000000000..639bdcf17b45 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_charposlist.cpp @@ -0,0 +1,89 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_charposlist.h" + +#include "core/fpdfapi/font/cpdf_cidfont.h" +#include "core/fpdfapi/font/cpdf_font.h" +#include "third_party/base/stl_util.h" + +CPDF_CharPosList::CPDF_CharPosList() { + m_pCharPos = nullptr; + m_nChars = 0; +} + +CPDF_CharPosList::~CPDF_CharPosList() { + FX_Free(m_pCharPos); +} + +void CPDF_CharPosList::Load(const std::vector& charCodes, + const std::vector& charPos, + CPDF_Font* pFont, + FX_FLOAT FontSize) { + int nChars = pdfium::CollectionSize(charCodes); + m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, nChars); + m_nChars = 0; + CPDF_CIDFont* pCIDFont = pFont->AsCIDFont(); + bool bVertWriting = pCIDFont && pCIDFont->IsVertWriting(); + for (int iChar = 0; iChar < nChars; iChar++) { + uint32_t CharCode = charCodes[iChar]; + if (CharCode == static_cast(-1)) + continue; + + bool bVert = false; + FXTEXT_CHARPOS& charpos = m_pCharPos[m_nChars++]; + if (pCIDFont) + charpos.m_bFontStyle = true; + + charpos.m_GlyphIndex = pFont->GlyphFromCharCode(CharCode, &bVert); + if (charpos.m_GlyphIndex != static_cast(-1)) { + charpos.m_FallbackFontPosition = -1; + } else { + charpos.m_FallbackFontPosition = + pFont->FallbackFontFromCharcode(CharCode); + charpos.m_GlyphIndex = pFont->FallbackGlyphFromCharcode( + charpos.m_FallbackFontPosition, CharCode); + } + +// TODO(npm): Figure out how this affects m_ExtGID +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + charpos.m_ExtGID = pFont->GlyphFromCharCodeExt(CharCode); +#endif + if (!pFont->IsEmbedded() && !pFont->IsCIDFont()) + charpos.m_FontCharWidth = pFont->GetCharWidthF(CharCode); + else + charpos.m_FontCharWidth = 0; + + charpos.m_Origin = CFX_PointF(iChar ? charPos[iChar - 1] : 0, 0); + charpos.m_bGlyphAdjust = false; + if (!pCIDFont) + continue; + + uint16_t CID = pCIDFont->CIDFromCharCode(CharCode); + if (bVertWriting) { + charpos.m_Origin = CFX_PointF(0, charpos.m_Origin.x); + + short vx; + short vy; + pCIDFont->GetVertOrigin(CID, vx, vy); + charpos.m_Origin.x -= FontSize * vx / 1000; + charpos.m_Origin.y -= FontSize * vy / 1000; + } + + const uint8_t* pTransform = pCIDFont->GetCIDTransform(CID); + if (pTransform && !bVert) { + charpos.m_AdjustMatrix[0] = pCIDFont->CIDTransformToFloat(pTransform[0]); + charpos.m_AdjustMatrix[2] = pCIDFont->CIDTransformToFloat(pTransform[2]); + charpos.m_AdjustMatrix[1] = pCIDFont->CIDTransformToFloat(pTransform[1]); + charpos.m_AdjustMatrix[3] = pCIDFont->CIDTransformToFloat(pTransform[3]); + charpos.m_Origin.x += + pCIDFont->CIDTransformToFloat(pTransform[4]) * FontSize; + charpos.m_Origin.y += + pCIDFont->CIDTransformToFloat(pTransform[5]) * FontSize; + charpos.m_bGlyphAdjust = true; + } + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_charposlist.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_charposlist.h new file mode 100644 index 000000000000..2f5a44dfa0d2 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_charposlist.h @@ -0,0 +1,29 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_CHARPOSLIST_H_ +#define CORE_FPDFAPI_RENDER_CPDF_CHARPOSLIST_H_ + +#include + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/cfx_renderdevice.h" + +class CPDF_Font; + +class CPDF_CharPosList { + public: + CPDF_CharPosList(); + ~CPDF_CharPosList(); + void Load(const std::vector& charCodes, + const std::vector& charPos, + CPDF_Font* pFont, + FX_FLOAT font_size); + FXTEXT_CHARPOS* m_pCharPos; + uint32_t m_nChars; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_CHARPOSLIST_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_devicebuffer.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_devicebuffer.cpp new file mode 100644 index 000000000000..dec13433e42d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_devicebuffer.cpp @@ -0,0 +1,76 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_devicebuffer.h" + +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/render/cpdf_rendercontext.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fxge/cfx_fxgedevice.h" +#include "core/fxge/cfx_renderdevice.h" +#include "core/fxge/fx_dib.h" +#include "third_party/base/ptr_util.h" + +CPDF_DeviceBuffer::CPDF_DeviceBuffer() + : m_pDevice(nullptr), m_pContext(nullptr), m_pObject(nullptr) {} + +CPDF_DeviceBuffer::~CPDF_DeviceBuffer() {} + +bool CPDF_DeviceBuffer::Initialize(CPDF_RenderContext* pContext, + CFX_RenderDevice* pDevice, + FX_RECT* pRect, + const CPDF_PageObject* pObj, + int max_dpi) { + m_pDevice = pDevice; + m_pContext = pContext; + m_Rect = *pRect; + m_pObject = pObj; + m_Matrix.Translate(-pRect->left, -pRect->top); +#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ + int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE); + int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE); + if (horz_size && vert_size && max_dpi) { + int dpih = + pDevice->GetDeviceCaps(FXDC_PIXEL_WIDTH) * 254 / (horz_size * 10); + int dpiv = + pDevice->GetDeviceCaps(FXDC_PIXEL_HEIGHT) * 254 / (vert_size * 10); + if (dpih > max_dpi) + m_Matrix.Scale((FX_FLOAT)(max_dpi) / dpih, 1.0f); + if (dpiv > max_dpi) + m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv); + } +#endif + CFX_Matrix ctm = m_pDevice->GetCTM(); + m_Matrix.Concat(CFX_Matrix(FXSYS_fabs(ctm.a), 0, 0, FXSYS_fabs(ctm.d), 0, 0)); + + CFX_FloatRect rect(*pRect); + m_Matrix.TransformRect(rect); + + FX_RECT bitmap_rect = rect.GetOuterRect(); + m_pBitmap = pdfium::MakeUnique(); + m_pBitmap->Create(bitmap_rect.Width(), bitmap_rect.Height(), FXDIB_Argb); + return true; +} + +void CPDF_DeviceBuffer::OutputToDevice() { + if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_GET_BITS) { + if (m_Matrix.a == 1.0f && m_Matrix.d == 1.0f) { + m_pDevice->SetDIBits(m_pBitmap.get(), m_Rect.left, m_Rect.top); + } else { + m_pDevice->StretchDIBits(m_pBitmap.get(), m_Rect.left, m_Rect.top, + m_Rect.Width(), m_Rect.Height()); + } + return; + } + CFX_DIBitmap buffer; + m_pDevice->CreateCompatibleBitmap(&buffer, m_pBitmap->GetWidth(), + m_pBitmap->GetHeight()); + m_pContext->GetBackground(&buffer, m_pObject, nullptr, &m_Matrix); + buffer.CompositeBitmap(0, 0, buffer.GetWidth(), buffer.GetHeight(), + m_pBitmap.get(), 0, 0); + m_pDevice->StretchDIBits(&buffer, m_Rect.left, m_Rect.top, m_Rect.Width(), + m_Rect.Height()); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_devicebuffer.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_devicebuffer.h new file mode 100644 index 000000000000..e5bbf1fcdf81 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_devicebuffer.h @@ -0,0 +1,41 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_DEVICEBUFFER_H_ +#define CORE_FPDFAPI_RENDER_CPDF_DEVICEBUFFER_H_ + +#include + +#include "core/fxcrt/fx_coordinates.h" + +class CFX_DIBitmap; +class CFX_RenderDevice; +class CPDF_PageObject; +class CPDF_RenderContext; + +class CPDF_DeviceBuffer { + public: + CPDF_DeviceBuffer(); + ~CPDF_DeviceBuffer(); + bool Initialize(CPDF_RenderContext* pContext, + CFX_RenderDevice* pDevice, + FX_RECT* pRect, + const CPDF_PageObject* pObj, + int max_dpi); + void OutputToDevice(); + CFX_DIBitmap* GetBitmap() const { return m_pBitmap.get(); } + const CFX_Matrix* GetMatrix() const { return &m_Matrix; } + + private: + CFX_RenderDevice* m_pDevice; + CPDF_RenderContext* m_pContext; + FX_RECT m_Rect; + const CPDF_PageObject* m_pObject; + std::unique_ptr m_pBitmap; + CFX_Matrix m_Matrix; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_DEVICEBUFFER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibsource.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibsource.cpp new file mode 100644 index 000000000000..33a8d930a538 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibsource.cpp @@ -0,0 +1,1427 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_dibsource.h" + +#include +#include +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/page/cpdf_image.h" +#include "core/fpdfapi/page/cpdf_imageobject.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfapi/render/cpdf_pagerendercache.h" +#include "core/fpdfapi/render/cpdf_renderstatus.h" +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/fx_safe_types.h" +#include "third_party/base/ptr_util.h" + +namespace { + +unsigned int GetBits8(const uint8_t* pData, uint64_t bitpos, size_t nbits) { + ASSERT(nbits == 1 || nbits == 2 || nbits == 4 || nbits == 8 || nbits == 16); + ASSERT((bitpos & (nbits - 1)) == 0); + unsigned int byte = pData[bitpos / 8]; + if (nbits == 8) + return byte; + + if (nbits == 16) + return byte * 256 + pData[bitpos / 8 + 1]; + + return (byte >> (8 - nbits - (bitpos % 8))) & ((1 << nbits) - 1); +} + +FX_SAFE_UINT32 CalculatePitch8(uint32_t bpc, uint32_t components, int width) { + FX_SAFE_UINT32 pitch = bpc; + pitch *= components; + pitch *= width; + pitch += 7; + pitch /= 8; + return pitch; +} + +FX_SAFE_UINT32 CalculatePitch32(int bpp, int width) { + FX_SAFE_UINT32 pitch = bpp; + pitch *= width; + pitch += 31; + pitch /= 32; // quantized to number of 32-bit words. + pitch *= 4; // and then back to bytes, (not just /8 in one step). + return pitch; +} + +bool IsAllowedBPCValue(int bpc) { + return bpc == 1 || bpc == 2 || bpc == 4 || bpc == 8 || bpc == 16; +} + +bool IsAllowedICCComponents(int nComp) { + return nComp == 1 || nComp == 3 || nComp == 4; +} + +template +T ClampValue(T value, T max_value) { + value = std::min(value, max_value); + value = std::max(0, value); + return value; +} + +// Wrapper class to use with std::unique_ptr for CJPX_Decoder. +class JpxBitMapContext { + public: + explicit JpxBitMapContext(CCodec_JpxModule* jpx_module) + : jpx_module_(jpx_module), decoder_(nullptr) {} + + ~JpxBitMapContext() { jpx_module_->DestroyDecoder(decoder_); } + + // Takes ownership of |decoder|. + void set_decoder(CJPX_Decoder* decoder) { decoder_ = decoder; } + + CJPX_Decoder* decoder() { return decoder_; } + + private: + CCodec_JpxModule* const jpx_module_; // Weak pointer. + CJPX_Decoder* decoder_; // Decoder, owned. + + // Disallow evil constructors + JpxBitMapContext(const JpxBitMapContext&); + void operator=(const JpxBitMapContext&); +}; + +const int kMaxImageDimension = 0x01FFFF; + +} // namespace + +CPDF_DIBSource::CPDF_DIBSource() + : m_pDocument(nullptr), + m_pStream(nullptr), + m_pDict(nullptr), + m_pColorSpace(nullptr), + m_Family(0), + m_bpc(0), + m_bpc_orig(0), + m_nComponents(0), + m_GroupFamily(0), + m_MatteColor(0), + m_bLoadMask(false), + m_bDefaultDecode(true), + m_bImageMask(false), + m_bDoBpcCheck(true), + m_bColorKey(false), + m_bHasMask(false), + m_bStdCS(false), + m_pCompData(nullptr), + m_pLineBuf(nullptr), + m_pMaskedLine(nullptr), + m_pMask(nullptr), + m_pMaskStream(nullptr), + m_Status(0) {} + +CPDF_DIBSource::~CPDF_DIBSource() { + FX_Free(m_pMaskedLine); + FX_Free(m_pLineBuf); + m_pCachedBitmap.reset(); + FX_Free(m_pCompData); + CPDF_ColorSpace* pCS = m_pColorSpace; + if (pCS && m_pDocument) { + m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray()); + } +} + +bool CPDF_DIBSource::Load(CPDF_Document* pDoc, const CPDF_Stream* pStream) { + if (!pStream) + return false; + + m_pDocument = pDoc; + m_pDict = pStream->GetDict(); + if (!m_pDict) + return false; + + m_pStream = pStream; + m_Width = m_pDict->GetIntegerFor("Width"); + m_Height = m_pDict->GetIntegerFor("Height"); + if (m_Width <= 0 || m_Height <= 0 || m_Width > kMaxImageDimension || + m_Height > kMaxImageDimension) { + return false; + } + m_GroupFamily = 0; + m_bLoadMask = false; + if (!LoadColorInfo(nullptr, nullptr)) + return false; + + if (m_bDoBpcCheck && (m_bpc == 0 || m_nComponents == 0)) + return false; + + FX_SAFE_UINT32 src_size = + CalculatePitch8(m_bpc, m_nComponents, m_Width) * m_Height; + if (!src_size.IsValid()) + return false; + + m_pStreamAcc = pdfium::MakeUnique(); + m_pStreamAcc->LoadAllData(pStream, false, src_size.ValueOrDie(), true); + if (m_pStreamAcc->GetSize() == 0 || !m_pStreamAcc->GetData()) + return false; + + if (!CreateDecoder()) + return false; + + if (m_bImageMask) { + m_bpp = 1; + m_bpc = 1; + m_nComponents = 1; + m_AlphaFlag = 1; + } else if (m_bpc * m_nComponents == 1) { + m_bpp = 1; + } else if (m_bpc * m_nComponents <= 8) { + m_bpp = 8; + } else { + m_bpp = 24; + } + FX_SAFE_UINT32 pitch = CalculatePitch32(m_bpp, m_Width); + if (!pitch.IsValid()) + return false; + + m_pLineBuf = FX_Alloc(uint8_t, pitch.ValueOrDie()); + LoadPalette(); + if (m_bColorKey) { + m_bpp = 32; + m_AlphaFlag = 2; + pitch = CalculatePitch32(m_bpp, m_Width); + if (!pitch.IsValid()) + return false; + + m_pMaskedLine = FX_Alloc(uint8_t, pitch.ValueOrDie()); + } + m_Pitch = pitch.ValueOrDie(); + return true; +} + +int CPDF_DIBSource::ContinueToLoadMask() { + if (m_bImageMask) { + m_bpp = 1; + m_bpc = 1; + m_nComponents = 1; + m_AlphaFlag = 1; + } else if (m_bpc * m_nComponents == 1) { + m_bpp = 1; + } else if (m_bpc * m_nComponents <= 8) { + m_bpp = 8; + } else { + m_bpp = 24; + } + if (!m_bpc || !m_nComponents) { + return 0; + } + FX_SAFE_UINT32 pitch = CalculatePitch32(m_bpp, m_Width); + if (!pitch.IsValid()) { + return 0; + } + m_pLineBuf = FX_Alloc(uint8_t, pitch.ValueOrDie()); + if (m_pColorSpace && m_bStdCS) { + m_pColorSpace->EnableStdConversion(true); + } + LoadPalette(); + if (m_bColorKey) { + m_bpp = 32; + m_AlphaFlag = 2; + pitch = CalculatePitch32(m_bpp, m_Width); + if (!pitch.IsValid()) { + return 0; + } + m_pMaskedLine = FX_Alloc(uint8_t, pitch.ValueOrDie()); + } + m_Pitch = pitch.ValueOrDie(); + return 1; +} + +int CPDF_DIBSource::StartLoadDIBSource(CPDF_Document* pDoc, + const CPDF_Stream* pStream, + bool bHasMask, + CPDF_Dictionary* pFormResources, + CPDF_Dictionary* pPageResources, + bool bStdCS, + uint32_t GroupFamily, + bool bLoadMask) { + if (!pStream) { + return 0; + } + m_pDocument = pDoc; + m_pDict = pStream->GetDict(); + m_pStream = pStream; + m_bStdCS = bStdCS; + m_bHasMask = bHasMask; + m_Width = m_pDict->GetIntegerFor("Width"); + m_Height = m_pDict->GetIntegerFor("Height"); + if (m_Width <= 0 || m_Height <= 0 || m_Width > kMaxImageDimension || + m_Height > kMaxImageDimension) { + return 0; + } + m_GroupFamily = GroupFamily; + m_bLoadMask = bLoadMask; + if (!LoadColorInfo(m_pStream->IsInline() ? pFormResources : nullptr, + pPageResources)) { + return 0; + } + if (m_bDoBpcCheck && (m_bpc == 0 || m_nComponents == 0)) { + return 0; + } + FX_SAFE_UINT32 src_size = + CalculatePitch8(m_bpc, m_nComponents, m_Width) * m_Height; + if (!src_size.IsValid()) { + return 0; + } + m_pStreamAcc = pdfium::MakeUnique(); + m_pStreamAcc->LoadAllData(pStream, false, src_size.ValueOrDie(), true); + if (m_pStreamAcc->GetSize() == 0 || !m_pStreamAcc->GetData()) { + return 0; + } + int ret = CreateDecoder(); + if (!ret) + return ret; + + if (ret != 1) { + if (!ContinueToLoadMask()) { + return 0; + } + if (m_bHasMask) { + StratLoadMask(); + } + return ret; + } + if (!ContinueToLoadMask()) { + return 0; + } + if (m_bHasMask) { + ret = StratLoadMask(); + } + if (ret == 2) { + return ret; + } + if (m_pColorSpace && m_bStdCS) { + m_pColorSpace->EnableStdConversion(false); + } + return ret; +} + +int CPDF_DIBSource::ContinueLoadDIBSource(IFX_Pause* pPause) { + FXCODEC_STATUS ret; + if (m_Status == 1) { + const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); + if (decoder == "JPXDecode") { + return 0; + } + CCodec_Jbig2Module* pJbig2Module = CPDF_ModuleMgr::Get()->GetJbig2Module(); + if (!m_pJbig2Context) { + m_pJbig2Context = pdfium::MakeUnique(); + if (m_pStreamAcc->GetImageParam()) { + CPDF_Stream* pGlobals = + m_pStreamAcc->GetImageParam()->GetStreamFor("JBIG2Globals"); + if (pGlobals) { + m_pGlobalStream = pdfium::MakeUnique(); + m_pGlobalStream->LoadAllData(pGlobals, false); + } + } + ret = pJbig2Module->StartDecode( + m_pJbig2Context.get(), m_pDocument->CodecContext(), m_Width, m_Height, + m_pStreamAcc.get(), m_pGlobalStream.get(), + m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch(), pPause); + if (ret < 0) { + m_pCachedBitmap.reset(); + m_pGlobalStream.reset(); + m_pJbig2Context.reset(); + return 0; + } + if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) { + return 2; + } + int ret1 = 1; + if (m_bHasMask) { + ret1 = ContinueLoadMaskDIB(pPause); + m_Status = 2; + } + if (ret1 == 2) { + return ret1; + } + if (m_pColorSpace && m_bStdCS) { + m_pColorSpace->EnableStdConversion(false); + } + return ret1; + } + ret = pJbig2Module->ContinueDecode(m_pJbig2Context.get(), pPause); + if (ret < 0) { + m_pCachedBitmap.reset(); + m_pGlobalStream.reset(); + m_pJbig2Context.reset(); + return 0; + } + if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) { + return 2; + } + int ret1 = 1; + if (m_bHasMask) { + ret1 = ContinueLoadMaskDIB(pPause); + m_Status = 2; + } + if (ret1 == 2) { + return ret1; + } + if (m_pColorSpace && m_bStdCS) { + m_pColorSpace->EnableStdConversion(false); + } + return ret1; + } + if (m_Status == 2) { + return ContinueLoadMaskDIB(pPause); + } + return 0; +} + +bool CPDF_DIBSource::LoadColorInfo(const CPDF_Dictionary* pFormResources, + const CPDF_Dictionary* pPageResources) { + m_bpc_orig = m_pDict->GetIntegerFor("BitsPerComponent"); + if (m_pDict->GetIntegerFor("ImageMask")) + m_bImageMask = true; + + if (m_bImageMask || !m_pDict->KeyExist("ColorSpace")) { + if (!m_bImageMask) { + CPDF_Object* pFilter = m_pDict->GetDirectObjectFor("Filter"); + if (pFilter) { + CFX_ByteString filter; + if (pFilter->IsName()) { + filter = pFilter->GetString(); + } else if (CPDF_Array* pArray = pFilter->AsArray()) { + filter = pArray->GetStringAt(pArray->GetCount() - 1); + } + + if (filter == "JPXDecode") { + m_bDoBpcCheck = false; + return true; + } + } + } + m_bImageMask = true; + m_bpc = m_nComponents = 1; + CPDF_Array* pDecode = m_pDict->GetArrayFor("Decode"); + m_bDefaultDecode = !pDecode || !pDecode->GetIntegerAt(0); + return true; + } + + CPDF_Object* pCSObj = m_pDict->GetDirectObjectFor("ColorSpace"); + if (!pCSObj) + return false; + + CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData(); + if (pFormResources) + m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pFormResources); + if (!m_pColorSpace) + m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pPageResources); + if (!m_pColorSpace) + return false; + + m_Family = m_pColorSpace->GetFamily(); + m_nComponents = m_pColorSpace->CountComponents(); + if (m_Family == PDFCS_ICCBASED && pCSObj->IsName()) { + CFX_ByteString cs = pCSObj->GetString(); + if (cs == "DeviceGray") { + m_nComponents = 1; + } else if (cs == "DeviceRGB") { + m_nComponents = 3; + } else if (cs == "DeviceCMYK") { + m_nComponents = 4; + } + } + ValidateDictParam(); + m_pCompData = GetDecodeAndMaskArray(m_bDefaultDecode, m_bColorKey); + return !!m_pCompData; +} + +DIB_COMP_DATA* CPDF_DIBSource::GetDecodeAndMaskArray(bool& bDefaultDecode, + bool& bColorKey) { + if (!m_pColorSpace) { + return nullptr; + } + DIB_COMP_DATA* pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents); + int max_data = (1 << m_bpc) - 1; + CPDF_Array* pDecode = m_pDict->GetArrayFor("Decode"); + if (pDecode) { + for (uint32_t i = 0; i < m_nComponents; i++) { + pCompData[i].m_DecodeMin = pDecode->GetNumberAt(i * 2); + FX_FLOAT max = pDecode->GetNumberAt(i * 2 + 1); + pCompData[i].m_DecodeStep = (max - pCompData[i].m_DecodeMin) / max_data; + FX_FLOAT def_value; + FX_FLOAT def_min; + FX_FLOAT def_max; + m_pColorSpace->GetDefaultValue(i, def_value, def_min, def_max); + if (m_Family == PDFCS_INDEXED) { + def_max = max_data; + } + if (def_min != pCompData[i].m_DecodeMin || def_max != max) { + bDefaultDecode = false; + } + } + } else { + for (uint32_t i = 0; i < m_nComponents; i++) { + FX_FLOAT def_value; + m_pColorSpace->GetDefaultValue(i, def_value, pCompData[i].m_DecodeMin, + pCompData[i].m_DecodeStep); + if (m_Family == PDFCS_INDEXED) { + pCompData[i].m_DecodeStep = max_data; + } + pCompData[i].m_DecodeStep = + (pCompData[i].m_DecodeStep - pCompData[i].m_DecodeMin) / max_data; + } + } + if (!m_pDict->KeyExist("SMask")) { + CPDF_Object* pMask = m_pDict->GetDirectObjectFor("Mask"); + if (!pMask) { + return pCompData; + } + if (CPDF_Array* pArray = pMask->AsArray()) { + if (pArray->GetCount() >= m_nComponents * 2) { + for (uint32_t i = 0; i < m_nComponents; i++) { + int min_num = pArray->GetIntegerAt(i * 2); + int max_num = pArray->GetIntegerAt(i * 2 + 1); + pCompData[i].m_ColorKeyMin = std::max(min_num, 0); + pCompData[i].m_ColorKeyMax = std::min(max_num, max_data); + } + } + bColorKey = true; + } + } + return pCompData; +} + +int CPDF_DIBSource::CreateDecoder() { + const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); + if (decoder.IsEmpty()) + return 1; + + if (m_bDoBpcCheck && m_bpc == 0) + return 0; + + if (decoder == "JPXDecode") { + LoadJpxBitmap(); + return m_pCachedBitmap ? 1 : 0; + } + if (decoder == "JBIG2Decode") { + m_pCachedBitmap = pdfium::MakeUnique(); + if (!m_pCachedBitmap->Create( + m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) { + m_pCachedBitmap.reset(); + return 0; + } + m_Status = 1; + return 2; + } + + const uint8_t* src_data = m_pStreamAcc->GetData(); + uint32_t src_size = m_pStreamAcc->GetSize(); + const CPDF_Dictionary* pParams = m_pStreamAcc->GetImageParam(); + if (decoder == "CCITTFaxDecode") { + m_pDecoder = FPDFAPI_CreateFaxDecoder(src_data, src_size, m_Width, m_Height, + pParams); + } else if (decoder == "FlateDecode") { + m_pDecoder = FPDFAPI_CreateFlateDecoder( + src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc, pParams); + } else if (decoder == "RunLengthDecode") { + m_pDecoder = CPDF_ModuleMgr::Get() + ->GetCodecModule() + ->GetBasicModule() + ->CreateRunLengthDecoder(src_data, src_size, m_Width, + m_Height, m_nComponents, m_bpc); + } else if (decoder == "DCTDecode") { + m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( + src_data, src_size, m_Width, m_Height, m_nComponents, + !pParams || pParams->GetIntegerFor("ColorTransform", 1)); + if (!m_pDecoder) { + bool bTransform = false; + int comps; + int bpc; + CCodec_JpegModule* pJpegModule = CPDF_ModuleMgr::Get()->GetJpegModule(); + if (pJpegModule->LoadInfo(src_data, src_size, &m_Width, &m_Height, &comps, + &bpc, &bTransform)) { + if (m_nComponents != static_cast(comps)) { + FX_Free(m_pCompData); + m_pCompData = nullptr; + m_nComponents = static_cast(comps); + if (m_pColorSpace) { + switch (m_Family) { + case PDFCS_DEVICEGRAY: + case PDFCS_DEVICERGB: + case PDFCS_DEVICECMYK: { + uint32_t dwMinComps = ComponentsForFamily(m_Family); + if (m_pColorSpace->CountComponents() < dwMinComps || + m_nComponents < dwMinComps) { + return 0; + } + break; + } + case PDFCS_LAB: { + if (m_nComponents != 3 || m_pColorSpace->CountComponents() < 3) + return 0; + break; + } + case PDFCS_ICCBASED: { + if (!IsAllowedICCComponents(m_nComponents) || + !IsAllowedICCComponents(m_pColorSpace->CountComponents()) || + m_pColorSpace->CountComponents() < m_nComponents) { + return 0; + } + break; + } + default: { + if (m_pColorSpace->CountComponents() != m_nComponents) + return 0; + break; + } + } + } else { + if (m_Family == PDFCS_LAB && m_nComponents != 3) + return 0; + } + m_pCompData = GetDecodeAndMaskArray(m_bDefaultDecode, m_bColorKey); + if (!m_pCompData) + return 0; + } + m_bpc = bpc; + m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( + src_data, src_size, m_Width, m_Height, m_nComponents, bTransform); + } + } + } + if (!m_pDecoder) + return 0; + + FX_SAFE_UINT32 requested_pitch = + CalculatePitch8(m_bpc, m_nComponents, m_Width); + if (!requested_pitch.IsValid()) + return 0; + FX_SAFE_UINT32 provided_pitch = CalculatePitch8( + m_pDecoder->GetBPC(), m_pDecoder->CountComps(), m_pDecoder->GetWidth()); + if (!provided_pitch.IsValid()) + return 0; + if (provided_pitch.ValueOrDie() < requested_pitch.ValueOrDie()) + return 0; + return 1; +} + +void CPDF_DIBSource::LoadJpxBitmap() { + CCodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule(); + if (!pJpxModule) + return; + + std::unique_ptr context(new JpxBitMapContext(pJpxModule)); + context->set_decoder(pJpxModule->CreateDecoder( + m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), m_pColorSpace)); + if (!context->decoder()) + return; + + uint32_t width = 0; + uint32_t height = 0; + uint32_t components = 0; + pJpxModule->GetImageInfo(context->decoder(), &width, &height, &components); + if (static_cast(width) < m_Width || static_cast(height) < m_Height) + return; + + bool bSwapRGB = false; + if (m_pColorSpace) { + if (components != m_pColorSpace->CountComponents()) + return; + + if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB)) { + bSwapRGB = true; + m_pColorSpace = nullptr; + } + } else { + if (components == 3) { + bSwapRGB = true; + } else if (components == 4) { + m_pColorSpace = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK); + } + m_nComponents = components; + } + + FXDIB_Format format; + if (components == 1) { + format = FXDIB_8bppRgb; + } else if (components <= 3) { + format = FXDIB_Rgb; + } else if (components == 4) { + format = FXDIB_Rgb32; + } else { + width = (width * components + 2) / 3; + format = FXDIB_Rgb; + } + + m_pCachedBitmap = pdfium::MakeUnique(); + if (!m_pCachedBitmap->Create(width, height, format)) { + m_pCachedBitmap.reset(); + return; + } + m_pCachedBitmap->Clear(0xFFFFFFFF); + std::vector output_offsets(components); + for (uint32_t i = 0; i < components; ++i) + output_offsets[i] = i; + if (bSwapRGB) { + output_offsets[0] = 2; + output_offsets[2] = 0; + } + if (!pJpxModule->Decode(context->decoder(), m_pCachedBitmap->GetBuffer(), + m_pCachedBitmap->GetPitch(), output_offsets)) { + m_pCachedBitmap.reset(); + return; + } + if (m_pColorSpace && m_pColorSpace->GetFamily() == PDFCS_INDEXED && + m_bpc < 8) { + int scale = 8 - m_bpc; + for (uint32_t row = 0; row < height; ++row) { + uint8_t* scanline = + const_cast(m_pCachedBitmap->GetScanline(row)); + for (uint32_t col = 0; col < width; ++col) { + *scanline = (*scanline) >> scale; + ++scanline; + } + } + } + m_bpc = 8; +} + +int CPDF_DIBSource::StratLoadMask() { + m_MatteColor = 0XFFFFFFFF; + m_pMaskStream = m_pDict->GetStreamFor("SMask"); + if (m_pMaskStream) { + CPDF_Array* pMatte = m_pMaskStream->GetDict()->GetArrayFor("Matte"); + if (pMatte && m_pColorSpace && + m_pColorSpace->CountComponents() <= m_nComponents) { + FX_FLOAT R, G, B; + std::vector colors(m_nComponents); + for (uint32_t i = 0; i < m_nComponents; i++) { + colors[i] = pMatte->GetFloatAt(i); + } + m_pColorSpace->GetRGB(colors.data(), R, G, B); + m_MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), + FXSYS_round(B * 255)); + } + return StartLoadMaskDIB(); + } + + m_pMaskStream = ToStream(m_pDict->GetDirectObjectFor("Mask")); + return m_pMaskStream ? StartLoadMaskDIB() : 1; +} + +int CPDF_DIBSource::ContinueLoadMaskDIB(IFX_Pause* pPause) { + if (!m_pMask) { + return 1; + } + int ret = m_pMask->ContinueLoadDIBSource(pPause); + if (ret == 2) { + return ret; + } + if (m_pColorSpace && m_bStdCS) { + m_pColorSpace->EnableStdConversion(false); + } + if (!ret) { + delete m_pMask; + m_pMask = nullptr; + return ret; + } + return 1; +} + +CPDF_DIBSource* CPDF_DIBSource::DetachMask() { + CPDF_DIBSource* pDIBSource = m_pMask; + m_pMask = nullptr; + return pDIBSource; +} + +int CPDF_DIBSource::StartLoadMaskDIB() { + m_pMask = new CPDF_DIBSource; + int ret = m_pMask->StartLoadDIBSource(m_pDocument, m_pMaskStream, false, + nullptr, nullptr, true); + if (ret == 2) { + if (m_Status == 0) + m_Status = 2; + return 2; + } + if (!ret) { + delete m_pMask; + m_pMask = nullptr; + return 1; + } + return 1; +} + +void CPDF_DIBSource::LoadPalette() { + if (m_bpc == 0) { + return; + } + if (m_bpc * m_nComponents > 8) { + return; + } + if (!m_pColorSpace) { + return; + } + if (m_bpc * m_nComponents == 1) { + if (m_bDefaultDecode && + (m_Family == PDFCS_DEVICEGRAY || m_Family == PDFCS_DEVICERGB)) { + return; + } + if (m_pColorSpace->CountComponents() > 3) { + return; + } + FX_FLOAT color_values[3]; + color_values[0] = m_pCompData[0].m_DecodeMin; + color_values[1] = color_values[2] = color_values[0]; + FX_FLOAT R = 0.0f, G = 0.0f, B = 0.0f; + m_pColorSpace->GetRGB(color_values, R, G, B); + FX_ARGB argb0 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), + FXSYS_round(B * 255)); + color_values[0] += m_pCompData[0].m_DecodeStep; + color_values[1] += m_pCompData[0].m_DecodeStep; + color_values[2] += m_pCompData[0].m_DecodeStep; + m_pColorSpace->GetRGB(color_values, R, G, B); + FX_ARGB argb1 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), + FXSYS_round(B * 255)); + if (argb0 != 0xFF000000 || argb1 != 0xFFFFFFFF) { + SetPaletteArgb(0, argb0); + SetPaletteArgb(1, argb1); + } + return; + } + if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY) && + m_bpc == 8 && m_bDefaultDecode) { + } else { + int palette_count = 1 << (m_bpc * m_nComponents); + CFX_FixedBufGrow color_values(m_nComponents); + FX_FLOAT* color_value = color_values; + for (int i = 0; i < palette_count; i++) { + int color_data = i; + for (uint32_t j = 0; j < m_nComponents; j++) { + int encoded_component = color_data % (1 << m_bpc); + color_data /= 1 << m_bpc; + color_value[j] = m_pCompData[j].m_DecodeMin + + m_pCompData[j].m_DecodeStep * encoded_component; + } + FX_FLOAT R = 0, G = 0, B = 0; + if (m_nComponents == 1 && m_Family == PDFCS_ICCBASED && + m_pColorSpace->CountComponents() > 1) { + int nComponents = m_pColorSpace->CountComponents(); + std::vector temp_buf(nComponents); + for (int k = 0; k < nComponents; k++) { + temp_buf[k] = *color_value; + } + m_pColorSpace->GetRGB(temp_buf.data(), R, G, B); + } else { + m_pColorSpace->GetRGB(color_value, R, G, B); + } + SetPaletteArgb(i, ArgbEncode(255, FXSYS_round(R * 255), + FXSYS_round(G * 255), FXSYS_round(B * 255))); + } + } +} + +void CPDF_DIBSource::ValidateDictParam() { + m_bpc = m_bpc_orig; + CPDF_Object* pFilter = m_pDict->GetDirectObjectFor("Filter"); + if (pFilter) { + if (pFilter->IsName()) { + CFX_ByteString filter = pFilter->GetString(); + if (filter == "CCITTFaxDecode" || filter == "JBIG2Decode") { + m_bpc = 1; + m_nComponents = 1; + } else if (filter == "RunLengthDecode") { + if (m_bpc != 1) { + m_bpc = 8; + } + } else if (filter == "DCTDecode") { + m_bpc = 8; + } + } else if (CPDF_Array* pArray = pFilter->AsArray()) { + CFX_ByteString filter = pArray->GetStringAt(pArray->GetCount() - 1); + if (filter == "CCITTFaxDecode" || filter == "JBIG2Decode") { + m_bpc = 1; + m_nComponents = 1; + } else if (filter == "DCTDecode") { + // Previously, filter == "RunLengthDecode" was checked in the "if" + // statement as well, but too many documents don't conform to it. + m_bpc = 8; + } + } + } + + if (!IsAllowedBPCValue(m_bpc)) + m_bpc = 0; +} + +void CPDF_DIBSource::TranslateScanline24bpp(uint8_t* dest_scan, + const uint8_t* src_scan) const { + if (m_bpc == 0) { + return; + } + unsigned int max_data = (1 << m_bpc) - 1; + if (m_bDefaultDecode) { + if (m_Family == PDFCS_DEVICERGB || m_Family == PDFCS_CALRGB) { + if (m_nComponents != 3) + return; + + const uint8_t* src_pos = src_scan; + switch (m_bpc) { + case 16: + for (int col = 0; col < m_Width; col++) { + *dest_scan++ = src_pos[4]; + *dest_scan++ = src_pos[2]; + *dest_scan++ = *src_pos; + src_pos += 6; + } + break; + case 8: + for (int column = 0; column < m_Width; column++) { + *dest_scan++ = src_pos[2]; + *dest_scan++ = src_pos[1]; + *dest_scan++ = *src_pos; + src_pos += 3; + } + break; + default: + uint64_t src_bit_pos = 0; + size_t dest_byte_pos = 0; + for (int column = 0; column < m_Width; column++) { + unsigned int R = GetBits8(src_scan, src_bit_pos, m_bpc); + src_bit_pos += m_bpc; + unsigned int G = GetBits8(src_scan, src_bit_pos, m_bpc); + src_bit_pos += m_bpc; + unsigned int B = GetBits8(src_scan, src_bit_pos, m_bpc); + src_bit_pos += m_bpc; + R = std::min(R, max_data); + G = std::min(G, max_data); + B = std::min(B, max_data); + dest_scan[dest_byte_pos] = B * 255 / max_data; + dest_scan[dest_byte_pos + 1] = G * 255 / max_data; + dest_scan[dest_byte_pos + 2] = R * 255 / max_data; + dest_byte_pos += 3; + } + break; + } + return; + } + if (m_bpc == 8) { + if (m_nComponents == m_pColorSpace->CountComponents()) + m_pColorSpace->TranslateImageLine(dest_scan, src_scan, m_Width, m_Width, + m_Height, TransMask()); + return; + } + } + CFX_FixedBufGrow color_values1(m_nComponents); + FX_FLOAT* color_values = color_values1; + FX_FLOAT R = 0.0f, G = 0.0f, B = 0.0f; + if (m_bpc == 8) { + uint64_t src_byte_pos = 0; + size_t dest_byte_pos = 0; + for (int column = 0; column < m_Width; column++) { + for (uint32_t color = 0; color < m_nComponents; color++) { + uint8_t data = src_scan[src_byte_pos++]; + color_values[color] = m_pCompData[color].m_DecodeMin + + m_pCompData[color].m_DecodeStep * data; + } + if (TransMask()) { + FX_FLOAT k = 1.0f - color_values[3]; + R = (1.0f - color_values[0]) * k; + G = (1.0f - color_values[1]) * k; + B = (1.0f - color_values[2]) * k; + } else { + m_pColorSpace->GetRGB(color_values, R, G, B); + } + R = ClampValue(R, 1.0f); + G = ClampValue(G, 1.0f); + B = ClampValue(B, 1.0f); + dest_scan[dest_byte_pos] = static_cast(B * 255); + dest_scan[dest_byte_pos + 1] = static_cast(G * 255); + dest_scan[dest_byte_pos + 2] = static_cast(R * 255); + dest_byte_pos += 3; + } + } else { + uint64_t src_bit_pos = 0; + size_t dest_byte_pos = 0; + for (int column = 0; column < m_Width; column++) { + for (uint32_t color = 0; color < m_nComponents; color++) { + unsigned int data = GetBits8(src_scan, src_bit_pos, m_bpc); + color_values[color] = m_pCompData[color].m_DecodeMin + + m_pCompData[color].m_DecodeStep * data; + src_bit_pos += m_bpc; + } + if (TransMask()) { + FX_FLOAT k = 1.0f - color_values[3]; + R = (1.0f - color_values[0]) * k; + G = (1.0f - color_values[1]) * k; + B = (1.0f - color_values[2]) * k; + } else { + m_pColorSpace->GetRGB(color_values, R, G, B); + } + R = ClampValue(R, 1.0f); + G = ClampValue(G, 1.0f); + B = ClampValue(B, 1.0f); + dest_scan[dest_byte_pos] = static_cast(B * 255); + dest_scan[dest_byte_pos + 1] = static_cast(G * 255); + dest_scan[dest_byte_pos + 2] = static_cast(R * 255); + dest_byte_pos += 3; + } + } +} + +uint8_t* CPDF_DIBSource::GetBuffer() const { + return m_pCachedBitmap ? m_pCachedBitmap->GetBuffer() : nullptr; +} + +const uint8_t* CPDF_DIBSource::GetScanline(int line) const { + if (m_bpc == 0) { + return nullptr; + } + FX_SAFE_UINT32 src_pitch = CalculatePitch8(m_bpc, m_nComponents, m_Width); + if (!src_pitch.IsValid()) + return nullptr; + uint32_t src_pitch_value = src_pitch.ValueOrDie(); + const uint8_t* pSrcLine = nullptr; + if (m_pCachedBitmap && src_pitch_value <= m_pCachedBitmap->GetPitch()) { + if (line >= m_pCachedBitmap->GetHeight()) { + line = m_pCachedBitmap->GetHeight() - 1; + } + pSrcLine = m_pCachedBitmap->GetScanline(line); + } else if (m_pDecoder) { + pSrcLine = m_pDecoder->GetScanline(line); + } else { + if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch_value) { + pSrcLine = m_pStreamAcc->GetData() + line * src_pitch_value; + } + } + if (!pSrcLine) { + uint8_t* pLineBuf = m_pMaskedLine ? m_pMaskedLine : m_pLineBuf; + FXSYS_memset(pLineBuf, 0xFF, m_Pitch); + return pLineBuf; + } + if (m_bpc * m_nComponents == 1) { + if (m_bImageMask && m_bDefaultDecode) { + for (uint32_t i = 0; i < src_pitch_value; i++) { + m_pLineBuf[i] = ~pSrcLine[i]; + } + } else if (m_bColorKey) { + uint32_t reset_argb, set_argb; + reset_argb = m_pPalette ? m_pPalette.get()[0] : 0xFF000000; + set_argb = m_pPalette ? m_pPalette.get()[1] : 0xFFFFFFFF; + if (m_pCompData[0].m_ColorKeyMin == 0) { + reset_argb = 0; + } + if (m_pCompData[0].m_ColorKeyMax == 1) { + set_argb = 0; + } + set_argb = FXARGB_TODIB(set_argb); + reset_argb = FXARGB_TODIB(reset_argb); + uint32_t* dest_scan = reinterpret_cast(m_pMaskedLine); + for (int col = 0; col < m_Width; col++) { + if (pSrcLine[col / 8] & (1 << (7 - col % 8))) { + *dest_scan = set_argb; + } else { + *dest_scan = reset_argb; + } + dest_scan++; + } + return m_pMaskedLine; + } else { + FXSYS_memcpy(m_pLineBuf, pSrcLine, src_pitch_value); + } + return m_pLineBuf; + } + if (m_bpc * m_nComponents <= 8) { + if (m_bpc == 8) { + FXSYS_memcpy(m_pLineBuf, pSrcLine, src_pitch_value); + } else { + uint64_t src_bit_pos = 0; + for (int col = 0; col < m_Width; col++) { + unsigned int color_index = 0; + for (uint32_t color = 0; color < m_nComponents; color++) { + unsigned int data = GetBits8(pSrcLine, src_bit_pos, m_bpc); + color_index |= data << (color * m_bpc); + src_bit_pos += m_bpc; + } + m_pLineBuf[col] = color_index; + } + } + if (m_bColorKey) { + uint8_t* pDestPixel = m_pMaskedLine; + const uint8_t* pSrcPixel = m_pLineBuf; + for (int col = 0; col < m_Width; col++) { + uint8_t index = *pSrcPixel++; + if (m_pPalette) { + *pDestPixel++ = FXARGB_B(m_pPalette.get()[index]); + *pDestPixel++ = FXARGB_G(m_pPalette.get()[index]); + *pDestPixel++ = FXARGB_R(m_pPalette.get()[index]); + } else { + *pDestPixel++ = index; + *pDestPixel++ = index; + *pDestPixel++ = index; + } + *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || + index > m_pCompData[0].m_ColorKeyMax) + ? 0xFF + : 0; + pDestPixel++; + } + return m_pMaskedLine; + } + return m_pLineBuf; + } + if (m_bColorKey) { + if (m_nComponents == 3 && m_bpc == 8) { + uint8_t* alpha_channel = m_pMaskedLine + 3; + for (int col = 0; col < m_Width; col++) { + const uint8_t* pPixel = pSrcLine + col * 3; + alpha_channel[col * 4] = (pPixel[0] < m_pCompData[0].m_ColorKeyMin || + pPixel[0] > m_pCompData[0].m_ColorKeyMax || + pPixel[1] < m_pCompData[1].m_ColorKeyMin || + pPixel[1] > m_pCompData[1].m_ColorKeyMax || + pPixel[2] < m_pCompData[2].m_ColorKeyMin || + pPixel[2] > m_pCompData[2].m_ColorKeyMax) + ? 0xFF + : 0; + } + } else { + FXSYS_memset(m_pMaskedLine, 0xFF, m_Pitch); + } + } + if (m_pColorSpace) { + TranslateScanline24bpp(m_pLineBuf, pSrcLine); + pSrcLine = m_pLineBuf; + } + if (m_bColorKey) { + const uint8_t* pSrcPixel = pSrcLine; + uint8_t* pDestPixel = m_pMaskedLine; + for (int col = 0; col < m_Width; col++) { + *pDestPixel++ = *pSrcPixel++; + *pDestPixel++ = *pSrcPixel++; + *pDestPixel++ = *pSrcPixel++; + pDestPixel++; + } + return m_pMaskedLine; + } + return pSrcLine; +} + +bool CPDF_DIBSource::SkipToScanline(int line, IFX_Pause* pPause) const { + return m_pDecoder && m_pDecoder->SkipToScanline(line, pPause); +} + +void CPDF_DIBSource::DownSampleScanline(int line, + uint8_t* dest_scan, + int dest_bpp, + int dest_width, + bool bFlipX, + int clip_left, + int clip_width) const { + if (line < 0 || !dest_scan || dest_bpp <= 0 || dest_width <= 0 || + clip_left < 0 || clip_width <= 0) { + return; + } + + uint32_t src_width = m_Width; + FX_SAFE_UINT32 pitch = CalculatePitch8(m_bpc, m_nComponents, m_Width); + if (!pitch.IsValid()) + return; + + const uint8_t* pSrcLine = nullptr; + if (m_pCachedBitmap) { + pSrcLine = m_pCachedBitmap->GetScanline(line); + } else if (m_pDecoder) { + pSrcLine = m_pDecoder->GetScanline(line); + } else { + uint32_t src_pitch = pitch.ValueOrDie(); + pitch *= (line + 1); + if (!pitch.IsValid()) { + return; + } + + if (m_pStreamAcc->GetSize() >= pitch.ValueOrDie()) { + pSrcLine = m_pStreamAcc->GetData() + line * src_pitch; + } + } + int orig_Bpp = m_bpc * m_nComponents / 8; + int dest_Bpp = dest_bpp / 8; + if (!pSrcLine) { + FXSYS_memset(dest_scan, 0xFF, dest_Bpp * clip_width); + return; + } + + FX_SAFE_INT32 max_src_x = clip_left; + max_src_x += clip_width - 1; + max_src_x *= src_width; + max_src_x /= dest_width; + if (!max_src_x.IsValid()) + return; + + if (m_bpc * m_nComponents == 1) { + DownSampleScanline1Bit(orig_Bpp, dest_Bpp, src_width, pSrcLine, dest_scan, + dest_width, bFlipX, clip_left, clip_width); + } else if (m_bpc * m_nComponents <= 8) { + DownSampleScanline8Bit(orig_Bpp, dest_Bpp, src_width, pSrcLine, dest_scan, + dest_width, bFlipX, clip_left, clip_width); + } else { + DownSampleScanline32Bit(orig_Bpp, dest_Bpp, src_width, pSrcLine, dest_scan, + dest_width, bFlipX, clip_left, clip_width); + } +} + +void CPDF_DIBSource::DownSampleScanline1Bit(int orig_Bpp, + int dest_Bpp, + uint32_t src_width, + const uint8_t* pSrcLine, + uint8_t* dest_scan, + int dest_width, + bool bFlipX, + int clip_left, + int clip_width) const { + uint32_t set_argb = (uint32_t)-1; + uint32_t reset_argb = 0; + if (m_bImageMask) { + if (m_bDefaultDecode) { + set_argb = 0; + reset_argb = (uint32_t)-1; + } + } else if (m_bColorKey) { + reset_argb = m_pPalette ? m_pPalette.get()[0] : 0xFF000000; + set_argb = m_pPalette ? m_pPalette.get()[1] : 0xFFFFFFFF; + if (m_pCompData[0].m_ColorKeyMin == 0) { + reset_argb = 0; + } + if (m_pCompData[0].m_ColorKeyMax == 1) { + set_argb = 0; + } + set_argb = FXARGB_TODIB(set_argb); + reset_argb = FXARGB_TODIB(reset_argb); + uint32_t* dest_scan_dword = reinterpret_cast(dest_scan); + for (int i = 0; i < clip_width; i++) { + uint32_t src_x = (clip_left + i) * src_width / dest_width; + if (bFlipX) { + src_x = src_width - src_x - 1; + } + src_x %= src_width; + if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) { + dest_scan_dword[i] = set_argb; + } else { + dest_scan_dword[i] = reset_argb; + } + } + return; + } else { + if (dest_Bpp == 1) { + } else if (m_pPalette) { + reset_argb = m_pPalette.get()[0]; + set_argb = m_pPalette.get()[1]; + } + } + for (int i = 0; i < clip_width; i++) { + uint32_t src_x = (clip_left + i) * src_width / dest_width; + if (bFlipX) { + src_x = src_width - src_x - 1; + } + src_x %= src_width; + int dest_pos = i * dest_Bpp; + if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) { + if (dest_Bpp == 1) { + dest_scan[dest_pos] = static_cast(set_argb); + } else if (dest_Bpp == 3) { + dest_scan[dest_pos] = FXARGB_B(set_argb); + dest_scan[dest_pos + 1] = FXARGB_G(set_argb); + dest_scan[dest_pos + 2] = FXARGB_R(set_argb); + } else { + *reinterpret_cast(dest_scan + dest_pos) = set_argb; + } + } else { + if (dest_Bpp == 1) { + dest_scan[dest_pos] = static_cast(reset_argb); + } else if (dest_Bpp == 3) { + dest_scan[dest_pos] = FXARGB_B(reset_argb); + dest_scan[dest_pos + 1] = FXARGB_G(reset_argb); + dest_scan[dest_pos + 2] = FXARGB_R(reset_argb); + } else { + *reinterpret_cast(dest_scan + dest_pos) = reset_argb; + } + } + } +} + +void CPDF_DIBSource::DownSampleScanline8Bit(int orig_Bpp, + int dest_Bpp, + uint32_t src_width, + const uint8_t* pSrcLine, + uint8_t* dest_scan, + int dest_width, + bool bFlipX, + int clip_left, + int clip_width) const { + if (m_bpc < 8) { + uint64_t src_bit_pos = 0; + for (uint32_t col = 0; col < src_width; col++) { + unsigned int color_index = 0; + for (uint32_t color = 0; color < m_nComponents; color++) { + unsigned int data = GetBits8(pSrcLine, src_bit_pos, m_bpc); + color_index |= data << (color * m_bpc); + src_bit_pos += m_bpc; + } + m_pLineBuf[col] = color_index; + } + pSrcLine = m_pLineBuf; + } + if (m_bColorKey) { + for (int i = 0; i < clip_width; i++) { + uint32_t src_x = (clip_left + i) * src_width / dest_width; + if (bFlipX) { + src_x = src_width - src_x - 1; + } + src_x %= src_width; + uint8_t* pDestPixel = dest_scan + i * 4; + uint8_t index = pSrcLine[src_x]; + if (m_pPalette) { + *pDestPixel++ = FXARGB_B(m_pPalette.get()[index]); + *pDestPixel++ = FXARGB_G(m_pPalette.get()[index]); + *pDestPixel++ = FXARGB_R(m_pPalette.get()[index]); + } else { + *pDestPixel++ = index; + *pDestPixel++ = index; + *pDestPixel++ = index; + } + *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || + index > m_pCompData[0].m_ColorKeyMax) + ? 0xFF + : 0; + } + return; + } + for (int i = 0; i < clip_width; i++) { + uint32_t src_x = (clip_left + i) * src_width / dest_width; + if (bFlipX) { + src_x = src_width - src_x - 1; + } + src_x %= src_width; + uint8_t index = pSrcLine[src_x]; + if (dest_Bpp == 1) { + dest_scan[i] = index; + } else { + int dest_pos = i * dest_Bpp; + FX_ARGB argb = m_pPalette.get()[index]; + dest_scan[dest_pos] = FXARGB_B(argb); + dest_scan[dest_pos + 1] = FXARGB_G(argb); + dest_scan[dest_pos + 2] = FXARGB_R(argb); + } + } +} + +void CPDF_DIBSource::DownSampleScanline32Bit(int orig_Bpp, + int dest_Bpp, + uint32_t src_width, + const uint8_t* pSrcLine, + uint8_t* dest_scan, + int dest_width, + bool bFlipX, + int clip_left, + int clip_width) const { + // last_src_x used to store the last seen src_x position which should be + // in [0, src_width). Set the initial value to be an invalid src_x value. + uint32_t last_src_x = src_width; + FX_ARGB last_argb = FXARGB_MAKE(0xFF, 0xFF, 0xFF, 0xFF); + FX_FLOAT unit_To8Bpc = 255.0f / ((1 << m_bpc) - 1); + for (int i = 0; i < clip_width; i++) { + int dest_x = clip_left + i; + uint32_t src_x = (bFlipX ? (dest_width - dest_x - 1) : dest_x) * + (int64_t)src_width / dest_width; + src_x %= src_width; + + uint8_t* pDestPixel = dest_scan + i * dest_Bpp; + FX_ARGB argb; + if (src_x == last_src_x) { + argb = last_argb; + } else { + CFX_FixedBufGrow extracted_components(m_nComponents); + const uint8_t* pSrcPixel = nullptr; + if (m_bpc % 8 != 0) { + // No need to check for 32-bit overflow, as |src_x| is bounded by + // |src_width| and DownSampleScanline() already checked for overflow + // with the pitch calculation. + size_t num_bits = src_x * m_bpc * m_nComponents; + uint64_t src_bit_pos = num_bits % 8; + pSrcPixel = pSrcLine + num_bits / 8; + for (uint32_t j = 0; j < m_nComponents; ++j) { + extracted_components[j] = static_cast( + GetBits8(pSrcPixel, src_bit_pos, m_bpc) * unit_To8Bpc); + src_bit_pos += m_bpc; + } + pSrcPixel = extracted_components; + } else { + pSrcPixel = pSrcLine + src_x * orig_Bpp; + if (m_bpc == 16) { + for (uint32_t j = 0; j < m_nComponents; ++j) + extracted_components[j] = pSrcPixel[j * 2]; + pSrcPixel = extracted_components; + } + } + + if (m_pColorSpace) { + uint8_t color[4]; + const bool bTransMask = TransMask(); + if (m_bDefaultDecode) { + m_pColorSpace->TranslateImageLine(color, pSrcPixel, 1, 0, 0, + bTransMask); + } else { + for (uint32_t j = 0; j < m_nComponents; ++j) { + FX_FLOAT component_value = + static_cast(extracted_components[j]); + int color_value = static_cast( + (m_pCompData[j].m_DecodeMin + + m_pCompData[j].m_DecodeStep * component_value) * + 255.0f + + 0.5f); + extracted_components[j] = + color_value > 255 ? 255 : (color_value < 0 ? 0 : color_value); + } + m_pColorSpace->TranslateImageLine(color, extracted_components, 1, 0, + 0, bTransMask); + } + argb = FXARGB_MAKE(0xFF, color[2], color[1], color[0]); + } else { + argb = FXARGB_MAKE(0xFF, pSrcPixel[2], pSrcPixel[1], pSrcPixel[0]); + } + if (m_bColorKey) { + int alpha = 0xFF; + if (m_nComponents == 3 && m_bpc == 8) { + alpha = (pSrcPixel[0] < m_pCompData[0].m_ColorKeyMin || + pSrcPixel[0] > m_pCompData[0].m_ColorKeyMax || + pSrcPixel[1] < m_pCompData[1].m_ColorKeyMin || + pSrcPixel[1] > m_pCompData[1].m_ColorKeyMax || + pSrcPixel[2] < m_pCompData[2].m_ColorKeyMin || + pSrcPixel[2] > m_pCompData[2].m_ColorKeyMax) + ? 0xFF + : 0; + } + argb &= 0xFFFFFF; + argb |= alpha << 24; + } + last_src_x = src_x; + last_argb = argb; + } + if (dest_Bpp == 4) { + *reinterpret_cast(pDestPixel) = FXARGB_TODIB(argb); + } else { + *pDestPixel++ = FXARGB_B(argb); + *pDestPixel++ = FXARGB_G(argb); + *pDestPixel = FXARGB_R(argb); + } + } +} + +bool CPDF_DIBSource::TransMask() const { + return m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && + m_Family == PDFCS_DEVICECMYK; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibsource.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibsource.h new file mode 100644 index 000000000000..d5820d8bae7f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibsource.h @@ -0,0 +1,145 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_DIBSOURCE_H_ +#define CORE_FPDFAPI_RENDER_CPDF_DIBSOURCE_H_ + +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_clippath.h" +#include "core/fpdfapi/page/cpdf_countedobject.h" +#include "core/fpdfapi/page/cpdf_graphicstates.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fpdfapi/render/cpdf_imageloader.h" +#include "core/fpdfapi/render/cpdf_rendercontext.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fxge/cfx_fxgedevice.h" +#include "core/fxge/cfx_renderdevice.h" + +class CCodec_Jbig2Context; +class CCodec_ScanlineDecoder; +class CPDF_Color; +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_Stream; + +typedef struct { + FX_FLOAT m_DecodeMin; + FX_FLOAT m_DecodeStep; + int m_ColorKeyMin; + int m_ColorKeyMax; +} DIB_COMP_DATA; + +#define FPDF_HUGE_IMAGE_SIZE 60000000 + +class CPDF_DIBSource : public CFX_DIBSource { + public: + CPDF_DIBSource(); + ~CPDF_DIBSource() override; + + bool Load(CPDF_Document* pDoc, const CPDF_Stream* pStream); + + // CFX_DIBSource + bool SkipToScanline(int line, IFX_Pause* pPause) const override; + uint8_t* GetBuffer() const override; + const uint8_t* GetScanline(int line) const override; + void DownSampleScanline(int line, + uint8_t* dest_scan, + int dest_bpp, + int dest_width, + bool bFlipX, + int clip_left, + int clip_width) const override; + + uint32_t GetMatteColor() const { return m_MatteColor; } + + int StartLoadDIBSource(CPDF_Document* pDoc, + const CPDF_Stream* pStream, + bool bHasMask, + CPDF_Dictionary* pFormResources, + CPDF_Dictionary* pPageResources, + bool bStdCS = false, + uint32_t GroupFamily = 0, + bool bLoadMask = false); + int ContinueLoadDIBSource(IFX_Pause* pPause); + int StratLoadMask(); + int StartLoadMaskDIB(); + int ContinueLoadMaskDIB(IFX_Pause* pPause); + int ContinueToLoadMask(); + CPDF_DIBSource* DetachMask(); + + private: + bool LoadColorInfo(const CPDF_Dictionary* pFormResources, + const CPDF_Dictionary* pPageResources); + DIB_COMP_DATA* GetDecodeAndMaskArray(bool& bDefaultDecode, bool& bColorKey); + void LoadJpxBitmap(); + void LoadPalette(); + int CreateDecoder(); + void TranslateScanline24bpp(uint8_t* dest_scan, + const uint8_t* src_scan) const; + void ValidateDictParam(); + void DownSampleScanline1Bit(int orig_Bpp, + int dest_Bpp, + uint32_t src_width, + const uint8_t* pSrcLine, + uint8_t* dest_scan, + int dest_width, + bool bFlipX, + int clip_left, + int clip_width) const; + void DownSampleScanline8Bit(int orig_Bpp, + int dest_Bpp, + uint32_t src_width, + const uint8_t* pSrcLine, + uint8_t* dest_scan, + int dest_width, + bool bFlipX, + int clip_left, + int clip_width) const; + void DownSampleScanline32Bit(int orig_Bpp, + int dest_Bpp, + uint32_t src_width, + const uint8_t* pSrcLine, + uint8_t* dest_scan, + int dest_width, + bool bFlipX, + int clip_left, + int clip_width) const; + bool TransMask() const; + + CPDF_Document* m_pDocument; + const CPDF_Stream* m_pStream; + std::unique_ptr m_pStreamAcc; + const CPDF_Dictionary* m_pDict; + CPDF_ColorSpace* m_pColorSpace; + uint32_t m_Family; + uint32_t m_bpc; + uint32_t m_bpc_orig; + uint32_t m_nComponents; + uint32_t m_GroupFamily; + uint32_t m_MatteColor; + bool m_bLoadMask; + bool m_bDefaultDecode; + bool m_bImageMask; + bool m_bDoBpcCheck; + bool m_bColorKey; + bool m_bHasMask; + bool m_bStdCS; + DIB_COMP_DATA* m_pCompData; + uint8_t* m_pLineBuf; + uint8_t* m_pMaskedLine; + std::unique_ptr m_pCachedBitmap; + std::unique_ptr m_pDecoder; + CPDF_DIBSource* m_pMask; + std::unique_ptr m_pGlobalStream; + std::unique_ptr m_pJbig2Context; + CPDF_Stream* m_pMaskStream; + int m_Status; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_DIBSOURCE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibtransferfunc.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibtransferfunc.cpp new file mode 100644 index 000000000000..41575fc8c21d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibtransferfunc.cpp @@ -0,0 +1,178 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_dibtransferfunc.h" + +#include + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/render/cpdf_transferfunc.h" + +CPDF_DIBTransferFunc::CPDF_DIBTransferFunc( + const CPDF_TransferFunc* pTransferFunc) { + m_RampR = pTransferFunc->m_Samples; + m_RampG = &pTransferFunc->m_Samples[256]; + m_RampB = &pTransferFunc->m_Samples[512]; +} + +CPDF_DIBTransferFunc::~CPDF_DIBTransferFunc() {} + +FXDIB_Format CPDF_DIBTransferFunc::GetDestFormat() { + if (m_pSrc->IsAlphaMask()) + return FXDIB_8bppMask; + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb32; +#else + return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb; +#endif +} + +FX_ARGB* CPDF_DIBTransferFunc::GetDestPalette() { + return nullptr; +} + +void CPDF_DIBTransferFunc::TranslateScanline( + const uint8_t* src_buf, + std::vector* dest_buf) const { + bool bSkip = false; + switch (m_pSrc->GetFormat()) { + case FXDIB_1bppRgb: { + int r0 = m_RampR[0]; + int g0 = m_RampG[0]; + int b0 = m_RampB[0]; + int r1 = m_RampR[255]; + int g1 = m_RampG[255]; + int b1 = m_RampB[255]; + int index = 0; + for (int i = 0; i < m_Width; i++) { + if (src_buf[i / 8] & (1 << (7 - i % 8))) { + (*dest_buf)[index++] = b1; + (*dest_buf)[index++] = g1; + (*dest_buf)[index++] = r1; + } else { + (*dest_buf)[index++] = b0; + (*dest_buf)[index++] = g0; + (*dest_buf)[index++] = r0; + } +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + index++; +#endif + } + break; + } + case FXDIB_1bppMask: { + int m0 = m_RampR[0]; + int m1 = m_RampR[255]; + int index = 0; + for (int i = 0; i < m_Width; i++) { + if (src_buf[i / 8] & (1 << (7 - i % 8))) + (*dest_buf)[index++] = m1; + else + (*dest_buf)[index++] = m0; + } + break; + } + case FXDIB_8bppRgb: { + FX_ARGB* pPal = m_pSrc->GetPalette(); + int index = 0; + for (int i = 0; i < m_Width; i++) { + if (pPal) { + FX_ARGB src_argb = pPal[*src_buf]; + (*dest_buf)[index++] = m_RampB[FXARGB_R(src_argb)]; + (*dest_buf)[index++] = m_RampG[FXARGB_G(src_argb)]; + (*dest_buf)[index++] = m_RampR[FXARGB_B(src_argb)]; + } else { + uint32_t src_byte = *src_buf; + (*dest_buf)[index++] = m_RampB[src_byte]; + (*dest_buf)[index++] = m_RampG[src_byte]; + (*dest_buf)[index++] = m_RampR[src_byte]; + } + src_buf++; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + index++; +#endif + } + break; + } + case FXDIB_8bppMask: { + int index = 0; + for (int i = 0; i < m_Width; i++) + (*dest_buf)[index++] = m_RampR[*(src_buf++)]; + break; + } + case FXDIB_Rgb: { + int index = 0; + for (int i = 0; i < m_Width; i++) { + (*dest_buf)[index++] = m_RampB[*(src_buf++)]; + (*dest_buf)[index++] = m_RampG[*(src_buf++)]; + (*dest_buf)[index++] = m_RampR[*(src_buf++)]; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + index++; +#endif + } + break; + } + case FXDIB_Rgb32: + bSkip = true; + case FXDIB_Argb: { + int index = 0; + for (int i = 0; i < m_Width; i++) { + (*dest_buf)[index++] = m_RampB[*(src_buf++)]; + (*dest_buf)[index++] = m_RampG[*(src_buf++)]; + (*dest_buf)[index++] = m_RampR[*(src_buf++)]; + if (!bSkip) { + (*dest_buf)[index++] = *src_buf; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + } else { + index++; +#endif + } + src_buf++; + } + break; + } + default: + break; + } +} + +void CPDF_DIBTransferFunc::TranslateDownSamples(uint8_t* dest_buf, + const uint8_t* src_buf, + int pixels, + int Bpp) const { + if (Bpp == 8) { + for (int i = 0; i < pixels; i++) + *dest_buf++ = m_RampR[*(src_buf++)]; + } else if (Bpp == 24) { + for (int i = 0; i < pixels; i++) { + *dest_buf++ = m_RampB[*(src_buf++)]; + *dest_buf++ = m_RampG[*(src_buf++)]; + *dest_buf++ = m_RampR[*(src_buf++)]; + } + } else { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + if (!m_pSrc->HasAlpha()) { + for (int i = 0; i < pixels; i++) { + *dest_buf++ = m_RampB[*(src_buf++)]; + *dest_buf++ = m_RampG[*(src_buf++)]; + *dest_buf++ = m_RampR[*(src_buf++)]; + dest_buf++; + src_buf++; + } + } else { +#endif + for (int i = 0; i < pixels; i++) { + *dest_buf++ = m_RampB[*(src_buf++)]; + *dest_buf++ = m_RampG[*(src_buf++)]; + *dest_buf++ = m_RampR[*(src_buf++)]; + *dest_buf++ = *(src_buf++); + } +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + } +#endif + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibtransferfunc.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibtransferfunc.h new file mode 100644 index 000000000000..d290c00d8adb --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_dibtransferfunc.h @@ -0,0 +1,37 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_DIBTRANSFERFUNC_H_ +#define CORE_FPDFAPI_RENDER_CPDF_DIBTRANSFERFUNC_H_ + +#include + +#include "core/fxge/fx_dib.h" + +class CPDF_TransferFunc; + +class CPDF_DIBTransferFunc : public CFX_FilteredDIB { + public: + explicit CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc); + ~CPDF_DIBTransferFunc() override; + + // CFX_FilteredDIB + FXDIB_Format GetDestFormat() override; + FX_ARGB* GetDestPalette() override; + void TranslateScanline(const uint8_t* src_buf, + std::vector* dest_buf) const override; + void TranslateDownSamples(uint8_t* dest_buf, + const uint8_t* src_buf, + int pixels, + int Bpp) const override; + + private: + const uint8_t* m_RampR; + const uint8_t* m_RampG; + const uint8_t* m_RampB; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_DIBTRANSFERFUNC_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_docrenderdata.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_docrenderdata.cpp new file mode 100644 index 000000000000..0e6f2d07e5a0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_docrenderdata.cpp @@ -0,0 +1,155 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_docrenderdata.h" + +#include + +#include "core/fpdfapi/font/cpdf_type3font.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/render/cpdf_dibsource.h" +#include "core/fpdfapi/render/cpdf_transferfunc.h" +#include "core/fpdfapi/render/cpdf_type3cache.h" + +namespace { + +const int kMaxOutputs = 16; + +} // namespace + +CPDF_DocRenderData::CPDF_DocRenderData(CPDF_Document* pPDFDoc) + : m_pPDFDoc(pPDFDoc) {} + +CPDF_DocRenderData::~CPDF_DocRenderData() { + Clear(true); +} + +void CPDF_DocRenderData::Clear(bool bRelease) { + for (auto it = m_Type3FaceMap.begin(); it != m_Type3FaceMap.end();) { + auto curr_it = it++; + CPDF_CountedObject* cache = curr_it->second; + if (bRelease || cache->use_count() < 2) { + delete cache->get(); + delete cache; + m_Type3FaceMap.erase(curr_it); + } + } + + for (auto it = m_TransferFuncMap.begin(); it != m_TransferFuncMap.end();) { + auto curr_it = it++; + CPDF_CountedObject* value = curr_it->second; + if (bRelease || value->use_count() < 2) { + delete value->get(); + delete value; + m_TransferFuncMap.erase(curr_it); + } + } +} + +CPDF_Type3Cache* CPDF_DocRenderData::GetCachedType3(CPDF_Type3Font* pFont) { + CPDF_CountedObject* pCache; + auto it = m_Type3FaceMap.find(pFont); + if (it == m_Type3FaceMap.end()) { + pCache = new CPDF_CountedObject( + pdfium::MakeUnique(pFont)); + m_Type3FaceMap[pFont] = pCache; + } else { + pCache = it->second; + } + return pCache->AddRef(); +} + +void CPDF_DocRenderData::ReleaseCachedType3(CPDF_Type3Font* pFont) { + auto it = m_Type3FaceMap.find(pFont); + if (it != m_Type3FaceMap.end()) { + it->second->RemoveRef(); + if (it->second->use_count() < 2) { + delete it->second->get(); + delete it->second; + m_Type3FaceMap.erase(it); + } + } +} + +CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj) { + if (!pObj) + return nullptr; + + auto it = m_TransferFuncMap.find(pObj); + if (it != m_TransferFuncMap.end()) { + CPDF_CountedObject* pTransferCounter = it->second; + return pTransferCounter->AddRef(); + } + + std::unique_ptr pFuncs[3]; + bool bUniTransfer = true; + bool bIdentity = true; + if (CPDF_Array* pArray = pObj->AsArray()) { + bUniTransfer = false; + if (pArray->GetCount() < 3) + return nullptr; + + for (uint32_t i = 0; i < 3; ++i) { + pFuncs[2 - i] = CPDF_Function::Load(pArray->GetDirectObjectAt(i)); + if (!pFuncs[2 - i]) + return nullptr; + } + } else { + pFuncs[0] = CPDF_Function::Load(pObj); + if (!pFuncs[0]) + return nullptr; + } + CPDF_CountedObject* pTransferCounter = + new CPDF_CountedObject( + pdfium::MakeUnique(m_pPDFDoc)); + CPDF_TransferFunc* pTransfer = pTransferCounter->get(); + m_TransferFuncMap[pObj] = pTransferCounter; + FX_FLOAT output[kMaxOutputs]; + FXSYS_memset(output, 0, sizeof(output)); + FX_FLOAT input; + int noutput; + for (int v = 0; v < 256; ++v) { + input = (FX_FLOAT)v / 255.0f; + if (bUniTransfer) { + if (pFuncs[0] && pFuncs[0]->CountOutputs() <= kMaxOutputs) + pFuncs[0]->Call(&input, 1, output, noutput); + int o = FXSYS_round(output[0] * 255); + if (o != v) + bIdentity = false; + for (int i = 0; i < 3; ++i) + pTransfer->m_Samples[i * 256 + v] = o; + continue; + } + for (int i = 0; i < 3; ++i) { + if (!pFuncs[i] || pFuncs[i]->CountOutputs() > kMaxOutputs) { + pTransfer->m_Samples[i * 256 + v] = v; + continue; + } + pFuncs[i]->Call(&input, 1, output, noutput); + int o = FXSYS_round(output[0] * 255); + if (o != v) + bIdentity = false; + pTransfer->m_Samples[i * 256 + v] = o; + } + } + + pTransfer->m_bIdentity = bIdentity; + return pTransferCounter->AddRef(); +} + +void CPDF_DocRenderData::ReleaseTransferFunc(CPDF_Object* pObj) { + auto it = m_TransferFuncMap.find(pObj); + if (it != m_TransferFuncMap.end()) { + it->second->RemoveRef(); + if (it->second->use_count() < 2) { + delete it->second->get(); + delete it->second; + m_TransferFuncMap.erase(it); + } + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_docrenderdata.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_docrenderdata.h new file mode 100644 index 000000000000..a8f4167a8d97 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_docrenderdata.h @@ -0,0 +1,43 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_DOCRENDERDATA_H_ +#define CORE_FPDFAPI_RENDER_CPDF_DOCRENDERDATA_H_ + +#include + +#include "core/fpdfapi/page/cpdf_countedobject.h" + +class CPDF_Document; +class CPDF_Font; +class CPDF_Object; +class CPDF_TransferFunc; +class CPDF_Type3Cache; +class CPDF_Type3Font; + +class CPDF_DocRenderData { + public: + explicit CPDF_DocRenderData(CPDF_Document* pPDFDoc); + ~CPDF_DocRenderData(); + + CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont); + void ReleaseCachedType3(CPDF_Type3Font* pFont); + CPDF_TransferFunc* GetTransferFunc(CPDF_Object* pObj); + void ReleaseTransferFunc(CPDF_Object* pObj); + void Clear(bool bRelease); + + private: + using CPDF_Type3CacheMap = + std::map*>; + using CPDF_TransferFuncMap = + std::map*>; + + CPDF_Document* m_pPDFDoc; // Not Owned + CPDF_Type3CacheMap m_Type3FaceMap; + CPDF_TransferFuncMap m_TransferFuncMap; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_DOCRENDERDATA_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagecacheentry.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagecacheentry.cpp new file mode 100644 index 000000000000..82b6117f863b --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagecacheentry.cpp @@ -0,0 +1,135 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_imagecacheentry.h" + +#include +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/render/cpdf_dibsource.h" +#include "core/fpdfapi/render/cpdf_pagerendercache.h" +#include "core/fpdfapi/render/cpdf_rendercontext.h" +#include "core/fpdfapi/render/cpdf_renderstatus.h" + +CPDF_ImageCacheEntry::CPDF_ImageCacheEntry(CPDF_Document* pDoc, + CPDF_Stream* pStream) + : m_dwTimeCount(0), + m_MatteColor(0), + m_pRenderStatus(nullptr), + m_pDocument(pDoc), + m_pStream(pStream), + m_pCurBitmap(nullptr), + m_pCurMask(nullptr), + m_dwCacheSize(0) {} + +CPDF_ImageCacheEntry::~CPDF_ImageCacheEntry() {} + +void CPDF_ImageCacheEntry::Reset(const CFX_DIBitmap* pBitmap) { + m_pCachedBitmap.reset(); + if (pBitmap) + m_pCachedBitmap = pBitmap->Clone(); + CalcSize(); +} + +static uint32_t FPDF_ImageCache_EstimateImageSize(const CFX_DIBSource* pDIB) { + return pDIB && pDIB->GetBuffer() + ? (uint32_t)pDIB->GetHeight() * pDIB->GetPitch() + + (uint32_t)pDIB->GetPaletteSize() * 4 + : 0; +} + +CFX_DIBSource* CPDF_ImageCacheEntry::DetachBitmap() { + CFX_DIBSource* pDIBSource = m_pCurBitmap; + m_pCurBitmap = nullptr; + return pDIBSource; +} + +CFX_DIBSource* CPDF_ImageCacheEntry::DetachMask() { + CFX_DIBSource* pDIBSource = m_pCurMask; + m_pCurMask = nullptr; + return pDIBSource; +} + +int CPDF_ImageCacheEntry::StartGetCachedBitmap(CPDF_Dictionary* pFormResources, + CPDF_Dictionary* pPageResources, + bool bStdCS, + uint32_t GroupFamily, + bool bLoadMask, + CPDF_RenderStatus* pRenderStatus, + int32_t downsampleWidth, + int32_t downsampleHeight) { + if (m_pCachedBitmap) { + m_pCurBitmap = m_pCachedBitmap.get(); + m_pCurMask = m_pCachedMask.get(); + return 1; + } + if (!pRenderStatus) + return 0; + + m_pRenderStatus = pRenderStatus; + m_pCurBitmap = new CPDF_DIBSource; + int ret = + ((CPDF_DIBSource*)m_pCurBitmap) + ->StartLoadDIBSource(m_pDocument, m_pStream, true, pFormResources, + pPageResources, bStdCS, GroupFamily, bLoadMask); + if (ret == 2) + return ret; + + if (!ret) { + delete m_pCurBitmap; + m_pCurBitmap = nullptr; + return 0; + } + ContinueGetCachedBitmap(); + return 0; +} + +void CPDF_ImageCacheEntry::ContinueGetCachedBitmap() { + m_MatteColor = ((CPDF_DIBSource*)m_pCurBitmap)->GetMatteColor(); + m_pCurMask = ((CPDF_DIBSource*)m_pCurBitmap)->DetachMask(); + CPDF_RenderContext* pContext = m_pRenderStatus->GetContext(); + CPDF_PageRenderCache* pPageRenderCache = pContext->GetPageCache(); + m_dwTimeCount = pPageRenderCache->GetTimeCount(); + if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < + FPDF_HUGE_IMAGE_SIZE) { + m_pCachedBitmap = m_pCurBitmap->Clone(); + delete m_pCurBitmap; + m_pCurBitmap = nullptr; + } else { + m_pCachedBitmap = pdfium::WrapUnique(m_pCurBitmap); + } + if (m_pCurMask) { + m_pCachedMask = m_pCurMask->Clone(); + delete m_pCurMask; + m_pCurMask = nullptr; + } + m_pCurBitmap = m_pCachedBitmap.get(); + m_pCurMask = m_pCachedMask.get(); + CalcSize(); +} + +int CPDF_ImageCacheEntry::Continue(IFX_Pause* pPause) { + int ret = ((CPDF_DIBSource*)m_pCurBitmap)->ContinueLoadDIBSource(pPause); + if (ret == 2) + return ret; + + if (!ret) { + delete m_pCurBitmap; + m_pCurBitmap = nullptr; + return 0; + } + ContinueGetCachedBitmap(); + return 0; +} + +void CPDF_ImageCacheEntry::CalcSize() { + m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap.get()) + + FPDF_ImageCache_EstimateImageSize(m_pCachedMask.get()); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagecacheentry.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagecacheentry.h new file mode 100644 index 000000000000..d11fe94c296b --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagecacheentry.h @@ -0,0 +1,61 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_IMAGECACHEENTRY_H_ +#define CORE_FPDFAPI_RENDER_CPDF_IMAGECACHEENTRY_H_ + +#include + +#include "core/fxcrt/fx_system.h" + +class CFX_DIBitmap; +class CFX_DIBSource; +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_RenderStatus; +class CPDF_Stream; +class IFX_Pause; + +class CPDF_ImageCacheEntry { + public: + CPDF_ImageCacheEntry(CPDF_Document* pDoc, CPDF_Stream* pStream); + ~CPDF_ImageCacheEntry(); + + void Reset(const CFX_DIBitmap* pBitmap); + uint32_t EstimateSize() const { return m_dwCacheSize; } + uint32_t GetTimeCount() const { return m_dwTimeCount; } + CPDF_Stream* GetStream() const { return m_pStream; } + + int StartGetCachedBitmap(CPDF_Dictionary* pFormResources, + CPDF_Dictionary* pPageResources, + bool bStdCS, + uint32_t GroupFamily, + bool bLoadMask, + CPDF_RenderStatus* pRenderStatus, + int32_t downsampleWidth, + int32_t downsampleHeight); + int Continue(IFX_Pause* pPause); + CFX_DIBSource* DetachBitmap(); + CFX_DIBSource* DetachMask(); + + int m_dwTimeCount; + uint32_t m_MatteColor; + + private: + void ContinueGetCachedBitmap(); + void CalcSize(); + + CPDF_RenderStatus* m_pRenderStatus; + CPDF_Document* m_pDocument; + CPDF_Stream* m_pStream; + CFX_DIBSource* m_pCurBitmap; + CFX_DIBSource* m_pCurMask; + std::unique_ptr m_pCachedBitmap; + std::unique_ptr m_pCachedMask; + uint32_t m_dwCacheSize; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_IMAGECACHEENTRY_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imageloader.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imageloader.cpp new file mode 100644 index 000000000000..18213ea69549 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imageloader.cpp @@ -0,0 +1,83 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_imageloader.h" + +#include "core/fpdfapi/page/cpdf_image.h" +#include "core/fpdfapi/page/cpdf_imageobject.h" +#include "core/fpdfapi/render/cpdf_dibsource.h" +#include "core/fpdfapi/render/cpdf_imagecacheentry.h" +#include "core/fpdfapi/render/cpdf_pagerendercache.h" +#include "core/fpdfapi/render/cpdf_renderstatus.h" +#include "core/fxcrt/fx_basic.h" + +CPDF_ImageLoader::CPDF_ImageLoader() + : m_pBitmap(nullptr), + m_pMask(nullptr), + m_MatteColor(0), + m_bCached(false), + m_nDownsampleWidth(0), + m_nDownsampleHeight(0), + m_pCache(nullptr), + m_pImage(nullptr) {} + +CPDF_ImageLoader::~CPDF_ImageLoader() { + if (!m_bCached) { + delete m_pBitmap; + delete m_pMask; + } +} + +bool CPDF_ImageLoader::Start(const CPDF_ImageObject* pImage, + CPDF_PageRenderCache* pCache, + bool bStdCS, + uint32_t GroupFamily, + bool bLoadMask, + CPDF_RenderStatus* pRenderStatus, + int32_t nDownsampleWidth, + int32_t nDownsampleHeight) { + m_nDownsampleWidth = nDownsampleWidth; + m_nDownsampleHeight = nDownsampleHeight; + m_pCache = pCache; + m_pImage = const_cast(pImage); + bool ret; + if (pCache) { + ret = pCache->StartGetCachedBitmap( + m_pImage->GetImage()->GetStream(), bStdCS, GroupFamily, bLoadMask, + pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight); + } else { + ret = m_pImage->GetImage()->StartLoadDIBSource( + pRenderStatus->m_pFormResource, pRenderStatus->m_pPageResource, bStdCS, + GroupFamily, bLoadMask); + } + if (!ret) + HandleFailure(); + return ret; +} + +bool CPDF_ImageLoader::Continue(IFX_Pause* pPause) { + bool ret = m_pCache ? m_pCache->Continue(pPause) + : m_pImage->GetImage()->Continue(pPause); + if (!ret) + HandleFailure(); + return ret; +} + +void CPDF_ImageLoader::HandleFailure() { + if (m_pCache) { + CPDF_ImageCacheEntry* entry = m_pCache->GetCurImageCacheEntry(); + m_bCached = true; + m_pBitmap = entry->DetachBitmap(); + m_pMask = entry->DetachMask(); + m_MatteColor = entry->m_MatteColor; + return; + } + CPDF_Image* pImage = m_pImage->GetImage(); + m_bCached = false; + m_pBitmap = pImage->DetachBitmap(); + m_pMask = pImage->DetachMask(); + m_MatteColor = pImage->m_MatteColor; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imageloader.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imageloader.h new file mode 100644 index 000000000000..a270c45bbfbd --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imageloader.h @@ -0,0 +1,48 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_IMAGELOADER_H_ +#define CORE_FPDFAPI_RENDER_CPDF_IMAGELOADER_H_ + +#include + +#include "core/fxcrt/fx_basic.h" +#include "core/fxge/fx_dib.h" + +class CPDF_ImageObject; +class CPDF_PageRenderCache; +class CPDF_RenderStatus; + +class CPDF_ImageLoader { + public: + CPDF_ImageLoader(); + ~CPDF_ImageLoader(); + + bool Start(const CPDF_ImageObject* pImage, + CPDF_PageRenderCache* pCache, + bool bStdCS, + uint32_t GroupFamily, + bool bLoadMask, + CPDF_RenderStatus* pRenderStatus, + int32_t nDownsampleWidth, + int32_t nDownsampleHeight); + bool Continue(IFX_Pause* pPause); + + CFX_DIBSource* m_pBitmap; + CFX_DIBSource* m_pMask; + uint32_t m_MatteColor; + bool m_bCached; + + private: + void HandleFailure(); + + int32_t m_nDownsampleWidth; + int32_t m_nDownsampleHeight; + CPDF_PageRenderCache* m_pCache; + CPDF_ImageObject* m_pImage; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_IMAGELOADER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagerenderer.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagerenderer.cpp new file mode 100644 index 000000000000..358d13edd0c5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagerenderer.cpp @@ -0,0 +1,572 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_imagerenderer.h" + +#include +#include + +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/page/cpdf_image.h" +#include "core/fpdfapi/page/cpdf_imageobject.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/cpdf_shadingpattern.h" +#include "core/fpdfapi/page/cpdf_tilingpattern.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/render/cpdf_dibsource.h" +#include "core/fpdfapi/render/cpdf_pagerendercache.h" +#include "core/fpdfapi/render/cpdf_rendercontext.h" +#include "core/fpdfapi/render/cpdf_renderstatus.h" +#include "core/fpdfapi/render/cpdf_transferfunc.h" +#include "core/fpdfdoc/cpdf_occontext.h" +#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxcrt/fx_safe_types.h" +#include "core/fxge/cfx_fxgedevice.h" +#include "core/fxge/cfx_pathdata.h" +#include "third_party/base/ptr_util.h" + +#ifdef _SKIA_SUPPORT_ +#include "core/fxge/skia/fx_skia_device.h" +#endif + +CPDF_ImageRenderer::CPDF_ImageRenderer() { + m_pRenderStatus = nullptr; + m_pImageObject = nullptr; + m_Result = true; + m_Status = 0; + m_DeviceHandle = nullptr; + m_bStdCS = false; + m_bPatternColor = false; + m_BlendType = FXDIB_BLEND_NORMAL; + m_pPattern = nullptr; + m_pObj2Device = nullptr; +} + +CPDF_ImageRenderer::~CPDF_ImageRenderer() { + if (m_DeviceHandle) + m_pRenderStatus->m_pDevice->CancelDIBits(m_DeviceHandle); +} + +bool CPDF_ImageRenderer::StartLoadDIBSource() { + CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); + FX_RECT image_rect = image_rect_f.GetOuterRect(); + if (!image_rect.Valid()) + return false; + + int dest_width = + m_ImageMatrix.a >= 0 ? image_rect.Width() : -image_rect.Width(); + int dest_height = + m_ImageMatrix.d <= 0 ? image_rect.Height() : -image_rect.Height(); + if (m_Loader.Start( + m_pImageObject, m_pRenderStatus->m_pContext->GetPageCache(), m_bStdCS, + m_pRenderStatus->m_GroupFamily, m_pRenderStatus->m_bLoadMask, + m_pRenderStatus, dest_width, dest_height)) { + m_Status = 4; + return true; + } + return false; +} + +bool CPDF_ImageRenderer::StartRenderDIBSource() { + if (!m_Loader.m_pBitmap) + return false; + + m_BitmapAlpha = + FXSYS_round(255 * m_pImageObject->m_GeneralState.GetFillAlpha()); + m_pDIBSource = m_Loader.m_pBitmap; + if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && + !m_Loader.m_pMask) { + return StartBitmapAlpha(); + } + if (m_pImageObject->m_GeneralState.GetTR()) { + if (!m_pImageObject->m_GeneralState.GetTransferFunc()) { + m_pImageObject->m_GeneralState.SetTransferFunc( + m_pRenderStatus->GetTransferFunc( + m_pImageObject->m_GeneralState.GetTR())); + } + if (m_pImageObject->m_GeneralState.GetTransferFunc() && + !m_pImageObject->m_GeneralState.GetTransferFunc()->m_bIdentity) { + m_pDIBSource = m_Loader.m_pBitmap = + m_pImageObject->m_GeneralState.GetTransferFunc()->TranslateImage( + m_Loader.m_pBitmap, !m_Loader.m_bCached); + if (m_Loader.m_bCached && m_Loader.m_pMask) + m_Loader.m_pMask = m_Loader.m_pMask->Clone().release(); + m_Loader.m_bCached = false; + } + } + m_FillArgb = 0; + m_bPatternColor = false; + m_pPattern = nullptr; + if (m_pDIBSource->IsAlphaMask()) { + const CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor(); + if (pColor && pColor->IsPattern()) { + m_pPattern = pColor->GetPattern(); + if (m_pPattern) + m_bPatternColor = true; + } + m_FillArgb = m_pRenderStatus->GetFillArgb(m_pImageObject); + } else if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_GRAY) { + m_pClone = m_pDIBSource->Clone(); + m_pClone->ConvertColorScale(m_pRenderStatus->m_Options.m_BackColor, + m_pRenderStatus->m_Options.m_ForeColor); + m_pDIBSource = m_pClone.get(); + } + m_Flags = 0; + if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) + m_Flags |= RENDER_FORCE_DOWNSAMPLE; + else if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE) + m_Flags |= RENDER_FORCE_HALFTONE; + if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) { + CPDF_Object* pFilters = + m_pImageObject->GetImage()->GetStream()->GetDict()->GetDirectObjectFor( + "Filter"); + if (pFilters) { + if (pFilters->IsName()) { + CFX_ByteString bsDecodeType = pFilters->GetString(); + if (bsDecodeType == "DCTDecode" || bsDecodeType == "JPXDecode") + m_Flags |= FXRENDER_IMAGE_LOSSY; + } else if (CPDF_Array* pArray = pFilters->AsArray()) { + for (size_t i = 0; i < pArray->GetCount(); i++) { + CFX_ByteString bsDecodeType = pArray->GetStringAt(i); + if (bsDecodeType == "DCTDecode" || bsDecodeType == "JPXDecode") { + m_Flags |= FXRENDER_IMAGE_LOSSY; + break; + } + } + } + } + } + if (m_pRenderStatus->m_Options.m_Flags & RENDER_NOIMAGESMOOTH) + m_Flags |= FXDIB_NOSMOOTH; + else if (m_pImageObject->GetImage()->IsInterpol()) + m_Flags |= FXDIB_INTERPOL; + if (m_Loader.m_pMask) + return DrawMaskedImage(); + + if (m_bPatternColor) + return DrawPatternImage(m_pObj2Device); + + if (m_BitmapAlpha != 255 || !m_pImageObject->m_GeneralState || + !m_pImageObject->m_GeneralState.GetFillOP() || + m_pImageObject->m_GeneralState.GetOPMode() != 0 || + m_pImageObject->m_GeneralState.GetBlendType() != FXDIB_BLEND_NORMAL || + m_pImageObject->m_GeneralState.GetStrokeAlpha() != 1.0f || + m_pImageObject->m_GeneralState.GetFillAlpha() != 1.0f) { + return StartDIBSource(); + } + CPDF_Document* pDocument = nullptr; + CPDF_Page* pPage = nullptr; + if (m_pRenderStatus->m_pContext->GetPageCache()) { + pPage = m_pRenderStatus->m_pContext->GetPageCache()->GetPage(); + pDocument = pPage->m_pDocument; + } else { + pDocument = m_pImageObject->GetImage()->GetDocument(); + } + CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : nullptr; + CPDF_Object* pCSObj = + m_pImageObject->GetImage()->GetStream()->GetDict()->GetDirectObjectFor( + "ColorSpace"); + CPDF_ColorSpace* pColorSpace = + pDocument->LoadColorSpace(pCSObj, pPageResources); + if (!pColorSpace) + return StartDIBSource(); + int format = pColorSpace->GetFamily(); + if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || + format == PDFCS_DEVICEN) { + m_BlendType = FXDIB_BLEND_DARKEN; + } + pDocument->GetPageData()->ReleaseColorSpace(pCSObj); + return StartDIBSource(); +} + +bool CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, + CPDF_PageObject* pObj, + const CFX_Matrix* pObj2Device, + bool bStdCS, + int blendType) { + m_pRenderStatus = pStatus; + m_bStdCS = bStdCS; + m_pImageObject = pObj->AsImage(); + m_BlendType = blendType; + m_pObj2Device = pObj2Device; + CPDF_Dictionary* pOC = m_pImageObject->GetImage()->GetOC(); + if (pOC && m_pRenderStatus->m_Options.m_pOCContext && + !m_pRenderStatus->m_Options.m_pOCContext->CheckOCGVisible(pOC)) { + return false; + } + m_ImageMatrix = m_pImageObject->matrix(); + m_ImageMatrix.Concat(*pObj2Device); + if (StartLoadDIBSource()) + return true; + return StartRenderDIBSource(); +} + +bool CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, + const CFX_DIBSource* pDIBSource, + FX_ARGB bitmap_argb, + int bitmap_alpha, + const CFX_Matrix* pImage2Device, + uint32_t flags, + bool bStdCS, + int blendType) { + m_pRenderStatus = pStatus; + m_pDIBSource = pDIBSource; + m_FillArgb = bitmap_argb; + m_BitmapAlpha = bitmap_alpha; + m_ImageMatrix = *pImage2Device; + m_Flags = flags; + m_bStdCS = bStdCS; + m_BlendType = blendType; + return StartDIBSource(); +} + +bool CPDF_ImageRenderer::NotDrawing() const { + return m_pRenderStatus->m_bPrint && + !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE); +} + +FX_RECT CPDF_ImageRenderer::GetDrawRect() const { + FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOuterRect(); + rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); + return rect; +} + +CFX_Matrix CPDF_ImageRenderer::GetDrawMatrix(const FX_RECT& rect) const { + CFX_Matrix new_matrix = m_ImageMatrix; + new_matrix.Translate(-rect.left, -rect.top); + return new_matrix; +} + +void CPDF_ImageRenderer::CalculateDrawImage(CFX_FxgeDevice* pBitmapDevice1, + CFX_FxgeDevice* pBitmapDevice2, + const CFX_DIBSource* pDIBSource, + CFX_Matrix* pNewMatrix, + const FX_RECT& rect) const { + CPDF_RenderStatus bitmap_render; + bitmap_render.Initialize(m_pRenderStatus->m_pContext, pBitmapDevice2, nullptr, + nullptr, nullptr, nullptr, nullptr, 0, + m_pRenderStatus->m_bDropObjects, nullptr, true); + CPDF_ImageRenderer image_render; + if (image_render.Start(&bitmap_render, pDIBSource, 0xffffffff, 255, + pNewMatrix, m_Flags, true, FXDIB_BLEND_NORMAL)) { + image_render.Continue(nullptr); + } + if (m_Loader.m_MatteColor == 0xffffffff) + return; + int matte_r = FXARGB_R(m_Loader.m_MatteColor); + int matte_g = FXARGB_G(m_Loader.m_MatteColor); + int matte_b = FXARGB_B(m_Loader.m_MatteColor); + for (int row = 0; row < rect.Height(); row++) { + uint8_t* dest_scan = + const_cast(pBitmapDevice1->GetBitmap()->GetScanline(row)); + const uint8_t* mask_scan = pBitmapDevice2->GetBitmap()->GetScanline(row); + for (int col = 0; col < rect.Width(); col++) { + int alpha = *mask_scan++; + if (!alpha) { + dest_scan += 4; + continue; + } + int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b; + *dest_scan++ = std::min(std::max(orig, 0), 255); + orig = (*dest_scan - matte_g) * 255 / alpha + matte_g; + *dest_scan++ = std::min(std::max(orig, 0), 255); + orig = (*dest_scan - matte_r) * 255 / alpha + matte_r; + *dest_scan++ = std::min(std::max(orig, 0), 255); + dest_scan++; + } + } +} + +bool CPDF_ImageRenderer::DrawPatternImage(const CFX_Matrix* pObj2Device) { + if (NotDrawing()) { + m_Result = false; + return false; + } + + FX_RECT rect = GetDrawRect(); + if (rect.IsEmpty()) + return false; + + CFX_Matrix new_matrix = GetDrawMatrix(rect); + CFX_FxgeDevice bitmap_device1; + if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32, nullptr)) + return true; + + bitmap_device1.GetBitmap()->Clear(0xffffff); + CPDF_RenderStatus bitmap_render; + bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device1, + nullptr, nullptr, nullptr, nullptr, + &m_pRenderStatus->m_Options, 0, + m_pRenderStatus->m_bDropObjects, nullptr, true); + CFX_Matrix patternDevice = *pObj2Device; + patternDevice.Translate((FX_FLOAT)-rect.left, (FX_FLOAT)-rect.top); + if (CPDF_TilingPattern* pTilingPattern = m_pPattern->AsTilingPattern()) { + bitmap_render.DrawTilingPattern(pTilingPattern, m_pImageObject, + &patternDevice, false); + } else if (CPDF_ShadingPattern* pShadingPattern = + m_pPattern->AsShadingPattern()) { + bitmap_render.DrawShadingPattern(pShadingPattern, m_pImageObject, + &patternDevice, false); + } + + CFX_FxgeDevice bitmap_device2; + if (!bitmap_device2.Create(rect.Width(), rect.Height(), FXDIB_8bppRgb, + nullptr)) { + return true; + } + bitmap_device2.GetBitmap()->Clear(0); + CalculateDrawImage(&bitmap_device1, &bitmap_device2, m_pDIBSource, + &new_matrix, rect); + bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask); + bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); + bitmap_device1.GetBitmap()->MultiplyAlpha(255); + m_pRenderStatus->m_pDevice->SetDIBitsWithBlend( + bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType); + return false; +} + +bool CPDF_ImageRenderer::DrawMaskedImage() { + if (NotDrawing()) { + m_Result = false; + return false; + } + + FX_RECT rect = GetDrawRect(); + if (rect.IsEmpty()) + return false; + + CFX_Matrix new_matrix = GetDrawMatrix(rect); + CFX_FxgeDevice bitmap_device1; + if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32, nullptr)) + return true; + +#if defined _SKIA_SUPPORT_ + bitmap_device1.Clear(0xffffff); +#else + bitmap_device1.GetBitmap()->Clear(0xffffff); +#endif + CPDF_RenderStatus bitmap_render; + bitmap_render.Initialize(m_pRenderStatus->m_pContext, &bitmap_device1, + nullptr, nullptr, nullptr, nullptr, nullptr, 0, + m_pRenderStatus->m_bDropObjects, nullptr, true); + CPDF_ImageRenderer image_render; + if (image_render.Start(&bitmap_render, m_pDIBSource, 0, 255, &new_matrix, + m_Flags, true, FXDIB_BLEND_NORMAL)) { + image_render.Continue(nullptr); + } + CFX_FxgeDevice bitmap_device2; + if (!bitmap_device2.Create(rect.Width(), rect.Height(), FXDIB_8bppRgb, + nullptr)) + return true; + +#if defined _SKIA_SUPPORT_ + bitmap_device2.Clear(0); +#else + bitmap_device2.GetBitmap()->Clear(0); +#endif + CalculateDrawImage(&bitmap_device1, &bitmap_device2, m_Loader.m_pMask, + &new_matrix, rect); +#ifdef _SKIA_SUPPORT_ + m_pRenderStatus->m_pDevice->SetBitsWithMask( + bitmap_device1.GetBitmap(), bitmap_device2.GetBitmap(), rect.left, + rect.top, m_BitmapAlpha, m_BlendType); +#else + bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask); + bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); + if (m_BitmapAlpha < 255) + bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha); + m_pRenderStatus->m_pDevice->SetDIBitsWithBlend( + bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType); +#endif // _SKIA_SUPPORT_ + return false; +} + +bool CPDF_ImageRenderer::StartDIBSource() { + if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) { + FX_SAFE_SIZE_T image_size = m_pDIBSource->GetBPP(); + image_size /= 8; + image_size *= m_pDIBSource->GetWidth(); + image_size *= m_pDIBSource->GetHeight(); + if (!image_size.IsValid()) + return false; + + if (image_size.ValueOrDie() > FPDF_HUGE_IMAGE_SIZE && + !(m_Flags & RENDER_FORCE_HALFTONE)) { + m_Flags |= RENDER_FORCE_DOWNSAMPLE; + } + } +#ifdef _SKIA_SUPPORT_ + CFX_DIBitmap* premultiplied = m_pDIBSource->Clone().release(); + if (m_pDIBSource->HasAlpha()) + CFX_SkiaDeviceDriver::PreMultiply(premultiplied); + if (m_pRenderStatus->m_pDevice->StartDIBitsWithBlend( + premultiplied, m_BitmapAlpha, m_FillArgb, &m_ImageMatrix, m_Flags, + m_DeviceHandle, m_BlendType)) { + if (m_DeviceHandle) { + m_Status = 3; + return true; + } + return false; + } +#else + if (m_pRenderStatus->m_pDevice->StartDIBitsWithBlend( + m_pDIBSource, m_BitmapAlpha, m_FillArgb, &m_ImageMatrix, m_Flags, + m_DeviceHandle, m_BlendType)) { + if (m_DeviceHandle) { + m_Status = 3; + return true; + } + return false; + } +#endif + CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); + FX_RECT image_rect = image_rect_f.GetOuterRect(); + int dest_width = image_rect.Width(); + int dest_height = image_rect.Height(); + if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) || + (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0)) { + if (NotDrawing()) { + m_Result = false; + return false; + } + + FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); + clip_box.Intersect(image_rect); + m_Status = 2; + m_pTransformer = pdfium::MakeUnique( + m_pDIBSource, &m_ImageMatrix, m_Flags, &clip_box); + m_pTransformer->Start(); + return true; + } + if (m_ImageMatrix.a < 0) + dest_width = -dest_width; + + if (m_ImageMatrix.d > 0) + dest_height = -dest_height; + + int dest_left = dest_width > 0 ? image_rect.left : image_rect.right; + int dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom; + if (m_pDIBSource->IsOpaqueImage() && m_BitmapAlpha == 255) { + if (m_pRenderStatus->m_pDevice->StretchDIBitsWithFlagsAndBlend( + m_pDIBSource, dest_left, dest_top, dest_width, dest_height, m_Flags, + m_BlendType)) { + return false; + } + } + if (m_pDIBSource->IsAlphaMask()) { + if (m_BitmapAlpha != 255) + m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); + if (m_pRenderStatus->m_pDevice->StretchBitMaskWithFlags( + m_pDIBSource, dest_left, dest_top, dest_width, dest_height, + m_FillArgb, m_Flags)) { + return false; + } + } + if (NotDrawing()) { + m_Result = false; + return true; + } + + FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); + FX_RECT dest_rect = clip_box; + dest_rect.Intersect(image_rect); + FX_RECT dest_clip( + dest_rect.left - image_rect.left, dest_rect.top - image_rect.top, + dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top); + std::unique_ptr pStretched( + m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip)); + if (pStretched) { + m_pRenderStatus->CompositeDIBitmap(pStretched.get(), dest_rect.left, + dest_rect.top, m_FillArgb, m_BitmapAlpha, + m_BlendType, false); + } + return false; +} + +bool CPDF_ImageRenderer::StartBitmapAlpha() { + if (m_pDIBSource->IsOpaqueImage()) { + CFX_PathData path; + path.AppendRect(0, 0, 1, 1); + path.Transform(&m_ImageMatrix); + uint32_t fill_color = + ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha); + m_pRenderStatus->m_pDevice->DrawPath(&path, nullptr, nullptr, fill_color, 0, + FXFILL_WINDING); + return false; + } + CFX_MaybeOwned pAlphaMask; + if (m_pDIBSource->IsAlphaMask()) + pAlphaMask = const_cast(m_pDIBSource); + else + pAlphaMask = m_pDIBSource->CloneAlphaMask(); + + if (FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || + FXSYS_fabs(m_ImageMatrix.c) >= 0.5f) { + int left; + int top; + std::unique_ptr pTransformed = + pAlphaMask->TransformTo(&m_ImageMatrix, left, top); + if (!pTransformed) + return true; + + m_pRenderStatus->m_pDevice->SetBitMask( + pTransformed.get(), left, top, + ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha)); + return false; + } + CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); + FX_RECT image_rect = image_rect_f.GetOuterRect(); + int dest_width = + m_ImageMatrix.a > 0 ? image_rect.Width() : -image_rect.Width(); + int dest_height = + m_ImageMatrix.d > 0 ? -image_rect.Height() : image_rect.Height(); + int left = dest_width > 0 ? image_rect.left : image_rect.right; + int top = dest_height > 0 ? image_rect.top : image_rect.bottom; + m_pRenderStatus->m_pDevice->StretchBitMask( + pAlphaMask.Get(), left, top, dest_width, dest_height, + ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha)); + return false; +} + +bool CPDF_ImageRenderer::Continue(IFX_Pause* pPause) { + if (m_Status == 2) { + if (m_pTransformer->Continue(pPause)) + return true; + + std::unique_ptr pBitmap(m_pTransformer->DetachBitmap()); + if (!pBitmap) + return false; + + if (pBitmap->IsAlphaMask()) { + if (m_BitmapAlpha != 255) + m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); + m_Result = m_pRenderStatus->m_pDevice->SetBitMask( + pBitmap.get(), m_pTransformer->result().left, + m_pTransformer->result().top, m_FillArgb); + } else { + if (m_BitmapAlpha != 255) + pBitmap->MultiplyAlpha(m_BitmapAlpha); + m_Result = m_pRenderStatus->m_pDevice->SetDIBitsWithBlend( + pBitmap.get(), m_pTransformer->result().left, + m_pTransformer->result().top, m_BlendType); + } + return false; + } + if (m_Status == 3) + return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause); + + if (m_Status == 4) { + if (m_Loader.Continue(pPause)) + return true; + + if (StartRenderDIBSource()) + return Continue(pPause); + } + return false; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagerenderer.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagerenderer.h new file mode 100644 index 000000000000..d358716e9feb --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_imagerenderer.h @@ -0,0 +1,80 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_IMAGERENDERER_H_ +#define CORE_FPDFAPI_RENDER_CPDF_IMAGERENDERER_H_ + +#include + +#include "core/fpdfapi/render/cpdf_imageloader.h" + +class CFX_FxgeDevice; +class CFX_ImageTransformer; +class CPDF_ImageObject; +class CPDF_PageObject; +class CPDF_Pattern; +class CPDF_RenderStatus; + +class CPDF_ImageRenderer { + public: + CPDF_ImageRenderer(); + ~CPDF_ImageRenderer(); + + bool Start(CPDF_RenderStatus* pStatus, + CPDF_PageObject* pObj, + const CFX_Matrix* pObj2Device, + bool bStdCS, + int blendType); + + bool Start(CPDF_RenderStatus* pStatus, + const CFX_DIBSource* pDIBSource, + FX_ARGB bitmap_argb, + int bitmap_alpha, + const CFX_Matrix* pImage2Device, + uint32_t flags, + bool bStdCS, + int blendType); + + bool Continue(IFX_Pause* pPause); + bool GetResult() const { return m_Result; } + + private: + bool StartBitmapAlpha(); + bool StartDIBSource(); + bool StartRenderDIBSource(); + bool StartLoadDIBSource(); + bool DrawMaskedImage(); + bool DrawPatternImage(const CFX_Matrix* pObj2Device); + bool NotDrawing() const; + FX_RECT GetDrawRect() const; + CFX_Matrix GetDrawMatrix(const FX_RECT& rect) const; + void CalculateDrawImage(CFX_FxgeDevice* bitmap_device1, + CFX_FxgeDevice* bitmap_device2, + const CFX_DIBSource* pDIBSource, + CFX_Matrix* pNewMatrix, + const FX_RECT& rect) const; + + CPDF_RenderStatus* m_pRenderStatus; + CPDF_ImageObject* m_pImageObject; + int m_Status; + const CFX_Matrix* m_pObj2Device; + CFX_Matrix m_ImageMatrix; + CPDF_ImageLoader m_Loader; + const CFX_DIBSource* m_pDIBSource; + std::unique_ptr m_pClone; + int m_BitmapAlpha; + bool m_bPatternColor; + CPDF_Pattern* m_pPattern; + FX_ARGB m_FillArgb; + uint32_t m_Flags; + std::unique_ptr m_pTransformer; + void* m_DeviceHandle; + bool m_bStdCS; + int m_BlendType; + bool m_Result; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_IMAGERENDERER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_pagerendercache.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_pagerendercache.cpp new file mode 100644 index 000000000000..faa9732f9b0e --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_pagerendercache.cpp @@ -0,0 +1,143 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_pagerendercache.h" + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/render/cpdf_imagecacheentry.h" +#include "core/fpdfapi/render/cpdf_renderstatus.h" + +namespace { + +struct CACHEINFO { + uint32_t time; + CPDF_Stream* pStream; +}; + +extern "C" { +static int compare(const void* data1, const void* data2) { + return ((CACHEINFO*)data1)->time - ((CACHEINFO*)data2)->time; +} +} // extern "C" + +} // namespace + +CPDF_PageRenderCache::CPDF_PageRenderCache(CPDF_Page* pPage) + : m_pPage(pPage), + m_pCurImageCacheEntry(nullptr), + m_nTimeCount(0), + m_nCacheSize(0), + m_bCurFindCache(false) {} + +CPDF_PageRenderCache::~CPDF_PageRenderCache() { + for (const auto& it : m_ImageCache) + delete it.second; +} + +void CPDF_PageRenderCache::CacheOptimization(int32_t dwLimitCacheSize) { + if (m_nCacheSize <= (uint32_t)dwLimitCacheSize) + return; + + size_t nCount = m_ImageCache.size(); + CACHEINFO* pCACHEINFO = FX_Alloc(CACHEINFO, nCount); + size_t i = 0; + for (const auto& it : m_ImageCache) { + pCACHEINFO[i].time = it.second->GetTimeCount(); + pCACHEINFO[i++].pStream = it.second->GetStream(); + } + FXSYS_qsort(pCACHEINFO, nCount, sizeof(CACHEINFO), compare); + uint32_t nTimeCount = m_nTimeCount; + + // Check if time value is about to roll over and reset all entries. + // The comparision is legal because uint32_t is an unsigned type. + if (nTimeCount + 1 < nTimeCount) { + for (i = 0; i < nCount; i++) + m_ImageCache[pCACHEINFO[i].pStream]->m_dwTimeCount = i; + m_nTimeCount = nCount; + } + + i = 0; + while (i + 15 < nCount) + ClearImageCacheEntry(pCACHEINFO[i++].pStream); + + while (i < nCount && m_nCacheSize > (uint32_t)dwLimitCacheSize) + ClearImageCacheEntry(pCACHEINFO[i++].pStream); + + FX_Free(pCACHEINFO); +} + +void CPDF_PageRenderCache::ClearImageCacheEntry(CPDF_Stream* pStream) { + auto it = m_ImageCache.find(pStream); + if (it == m_ImageCache.end()) + return; + + m_nCacheSize -= it->second->EstimateSize(); + delete it->second; + m_ImageCache.erase(it); +} + +bool CPDF_PageRenderCache::StartGetCachedBitmap( + CPDF_Stream* pStream, + bool bStdCS, + uint32_t GroupFamily, + bool bLoadMask, + CPDF_RenderStatus* pRenderStatus, + int32_t downsampleWidth, + int32_t downsampleHeight) { + const auto it = m_ImageCache.find(pStream); + m_bCurFindCache = it != m_ImageCache.end(); + if (m_bCurFindCache) { + m_pCurImageCacheEntry = it->second; + } else { + m_pCurImageCacheEntry = + new CPDF_ImageCacheEntry(m_pPage->m_pDocument, pStream); + } + int ret = m_pCurImageCacheEntry->StartGetCachedBitmap( + pRenderStatus->m_pFormResource, m_pPage->m_pPageResources, bStdCS, + GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight); + if (ret == 2) + return true; + + m_nTimeCount++; + if (!m_bCurFindCache) + m_ImageCache[pStream] = m_pCurImageCacheEntry; + + if (!ret) + m_nCacheSize += m_pCurImageCacheEntry->EstimateSize(); + + return false; +} + +bool CPDF_PageRenderCache::Continue(IFX_Pause* pPause) { + int ret = m_pCurImageCacheEntry->Continue(pPause); + if (ret == 2) + return true; + + m_nTimeCount++; + if (!m_bCurFindCache) + m_ImageCache[m_pCurImageCacheEntry->GetStream()] = m_pCurImageCacheEntry; + if (!ret) + m_nCacheSize += m_pCurImageCacheEntry->EstimateSize(); + return false; +} + +void CPDF_PageRenderCache::ResetBitmap(CPDF_Stream* pStream, + const CFX_DIBitmap* pBitmap) { + CPDF_ImageCacheEntry* pEntry; + const auto it = m_ImageCache.find(pStream); + if (it == m_ImageCache.end()) { + if (!pBitmap) + return; + + pEntry = new CPDF_ImageCacheEntry(m_pPage->m_pDocument, pStream); + m_ImageCache[pStream] = pEntry; + } else { + pEntry = it->second; + } + m_nCacheSize -= pEntry->EstimateSize(); + pEntry->Reset(pBitmap); + m_nCacheSize += pEntry->EstimateSize(); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_pagerendercache.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_pagerendercache.h new file mode 100644 index 000000000000..6c9ed7691152 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_pagerendercache.h @@ -0,0 +1,57 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_PAGERENDERCACHE_H_ +#define CORE_FPDFAPI_RENDER_CPDF_PAGERENDERCACHE_H_ + +#include + +#include "core/fxcrt/fx_system.h" + +class CPDF_Stream; +class CPDF_ImageCacheEntry; +class CPDF_Page; +class CPDF_RenderStatus; +class CFX_DIBitmap; +class CFX_DIBSource; +class IFX_Pause; + +class CPDF_PageRenderCache { + public: + explicit CPDF_PageRenderCache(CPDF_Page* pPage); + ~CPDF_PageRenderCache(); + + void CacheOptimization(int32_t dwLimitCacheSize); + uint32_t GetTimeCount() const { return m_nTimeCount; } + + void ResetBitmap(CPDF_Stream* pStream, const CFX_DIBitmap* pBitmap); + CPDF_Page* GetPage() const { return m_pPage; } + CPDF_ImageCacheEntry* GetCurImageCacheEntry() const { + return m_pCurImageCacheEntry; + } + + bool StartGetCachedBitmap(CPDF_Stream* pStream, + bool bStdCS, + uint32_t GroupFamily, + bool bLoadMask, + CPDF_RenderStatus* pRenderStatus, + int32_t downsampleWidth, + int32_t downsampleHeight); + + bool Continue(IFX_Pause* pPause); + + private: + void ClearImageCacheEntry(CPDF_Stream* pStream); + + CPDF_Page* const m_pPage; + CPDF_ImageCacheEntry* m_pCurImageCacheEntry; + std::map m_ImageCache; + uint32_t m_nTimeCount; + uint32_t m_nCacheSize; + bool m_bCurFindCache; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_PAGERENDERCACHE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_progressiverenderer.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_progressiverenderer.cpp new file mode 100644 index 000000000000..6aa3b8a30982 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_progressiverenderer.cpp @@ -0,0 +1,114 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_progressiverenderer.h" + +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/cpdf_pageobjectholder.h" +#include "core/fpdfapi/render/cpdf_pagerendercache.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fpdfapi/render/cpdf_renderstatus.h" +#include "core/fxge/cfx_renderdevice.h" +#include "third_party/base/ptr_util.h" + +CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer( + CPDF_RenderContext* pContext, + CFX_RenderDevice* pDevice, + const CPDF_RenderOptions* pOptions) + : m_Status(Ready), + m_pContext(pContext), + m_pDevice(pDevice), + m_pOptions(pOptions), + m_LayerIndex(0), + m_pCurrentLayer(nullptr) {} + +CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer() { + if (m_pRenderStatus) + m_pDevice->RestoreState(false); +} + +void CPDF_ProgressiveRenderer::Start(IFX_Pause* pPause) { + if (!m_pContext || !m_pDevice || m_Status != Ready) { + m_Status = Failed; + return; + } + m_Status = ToBeContinued; + Continue(pPause); +} + +void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) { + while (m_Status == ToBeContinued) { + if (!m_pCurrentLayer) { + if (m_LayerIndex >= m_pContext->CountLayers()) { + m_Status = Done; + return; + } + m_pCurrentLayer = m_pContext->GetLayer(m_LayerIndex); + m_LastObjectRendered = + m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->end(); + m_pRenderStatus = pdfium::MakeUnique(); + m_pRenderStatus->Initialize( + m_pContext, m_pDevice, nullptr, nullptr, nullptr, nullptr, m_pOptions, + m_pCurrentLayer->m_pObjectHolder->m_Transparency, false, nullptr); + m_pDevice->SaveState(); + m_ClipRect = CFX_FloatRect(m_pDevice->GetClipBox()); + CFX_Matrix device2object; + device2object.SetReverse(m_pCurrentLayer->m_Matrix); + device2object.TransformRect(m_ClipRect); + } + CPDF_PageObjectList::iterator iter; + CPDF_PageObjectList::iterator iterEnd = + m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->end(); + if (m_LastObjectRendered != iterEnd) { + iter = m_LastObjectRendered; + ++iter; + } else { + iter = m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->begin(); + } + int nObjsToGo = kStepLimit; + while (iter != iterEnd) { + CPDF_PageObject* pCurObj = iter->get(); + if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && + pCurObj->m_Right >= m_ClipRect.left && + pCurObj->m_Bottom <= m_ClipRect.top && + pCurObj->m_Top >= m_ClipRect.bottom) { + if (m_pRenderStatus->ContinueSingleObject( + pCurObj, &m_pCurrentLayer->m_Matrix, pPause)) { + return; + } + if (pCurObj->IsImage() && + m_pRenderStatus->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) { + m_pContext->GetPageCache()->CacheOptimization( + m_pRenderStatus->m_Options.m_dwLimitCacheSize); + } + if (pCurObj->IsForm() || pCurObj->IsShading()) + nObjsToGo = 0; + else + --nObjsToGo; + } + m_LastObjectRendered = iter; + if (nObjsToGo == 0) { + if (pPause && pPause->NeedToPauseNow()) + return; + nObjsToGo = kStepLimit; + } + ++iter; + } + if (m_pCurrentLayer->m_pObjectHolder->IsParsed()) { + m_pRenderStatus.reset(); + m_pDevice->RestoreState(false); + m_pCurrentLayer = nullptr; + m_LayerIndex++; + if (pPause && pPause->NeedToPauseNow()) { + return; + } + } else { + m_pCurrentLayer->m_pObjectHolder->ContinueParse(pPause); + if (!m_pCurrentLayer->m_pObjectHolder->IsParsed()) + return; + } + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_progressiverenderer.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_progressiverenderer.h new file mode 100644 index 000000000000..f0b157960190 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_progressiverenderer.h @@ -0,0 +1,60 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_PROGRESSIVERENDERER_H_ +#define CORE_FPDFAPI_RENDER_CPDF_PROGRESSIVERENDERER_H_ + +#include + +#include "core/fpdfapi/page/cpdf_pageobjectlist.h" +#include "core/fpdfapi/render/cpdf_rendercontext.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_RenderOptions; +class CPDF_RenderStatus; +class CFX_RenderDevice; +class IFX_Pause; + +class CPDF_ProgressiveRenderer { + public: + // Must match FDF_RENDER_* definitions in public/fpdf_progressive.h, but + // cannot #include that header. fpdfsdk/fpdf_progressive.cpp has + // static_asserts to make sure the two sets of values match. + enum Status { + Ready, // FPDF_RENDER_READER + ToBeContinued, // FPDF_RENDER_TOBECOUNTINUED + Done, // FPDF_RENDER_DONE + Failed // FPDF_RENDER_FAILED + }; + + static int ToFPDFStatus(Status status) { return static_cast(status); } + + CPDF_ProgressiveRenderer(CPDF_RenderContext* pContext, + CFX_RenderDevice* pDevice, + const CPDF_RenderOptions* pOptions); + ~CPDF_ProgressiveRenderer(); + + Status GetStatus() const { return m_Status; } + void Start(IFX_Pause* pPause); + void Continue(IFX_Pause* pPause); + + private: + // Maximum page objects to render before checking for pause. + static const int kStepLimit = 100; + + Status m_Status; + CPDF_RenderContext* const m_pContext; + CFX_RenderDevice* const m_pDevice; + const CPDF_RenderOptions* const m_pOptions; + std::unique_ptr m_pRenderStatus; + CFX_FloatRect m_ClipRect; + uint32_t m_LayerIndex; + CPDF_RenderContext::Layer* m_pCurrentLayer; + CPDF_PageObjectList::iterator m_LastObjectRendered; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_PROGRESSIVERENDERER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_rendercontext.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_rendercontext.cpp new file mode 100644 index 000000000000..d74f72985860 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_rendercontext.cpp @@ -0,0 +1,96 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_rendercontext.h" + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/cpdf_pageobjectholder.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/render/cpdf_pagerendercache.h" +#include "core/fpdfapi/render/cpdf_progressiverenderer.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fpdfapi/render/cpdf_renderstatus.h" +#include "core/fpdfapi/render/cpdf_textrenderer.h" +#include "core/fxge/cfx_renderdevice.h" +#include "core/fxge/fx_dib.h" + +CPDF_RenderContext::CPDF_RenderContext(CPDF_Page* pPage) + : m_pDocument(pPage->m_pDocument), + m_pPageResources(pPage->m_pPageResources), + m_pPageCache(pPage->GetRenderCache()) {} + +CPDF_RenderContext::CPDF_RenderContext(CPDF_Document* pDoc, + CPDF_PageRenderCache* pPageCache) + : m_pDocument(pDoc), m_pPageResources(nullptr), m_pPageCache(pPageCache) {} + +CPDF_RenderContext::~CPDF_RenderContext() {} + +void CPDF_RenderContext::GetBackground(CFX_DIBitmap* pBuffer, + const CPDF_PageObject* pObj, + const CPDF_RenderOptions* pOptions, + CFX_Matrix* pFinalMatrix) { + CFX_FxgeDevice device; + device.Attach(pBuffer, false, nullptr, false); + + FX_RECT rect(0, 0, device.GetWidth(), device.GetHeight()); + device.FillRect(&rect, 0xffffffff); + Render(&device, pObj, pOptions, pFinalMatrix); +} + +void CPDF_RenderContext::AppendLayer(CPDF_PageObjectHolder* pObjectHolder, + const CFX_Matrix* pObject2Device) { + m_Layers.emplace_back(); + m_Layers.back().m_pObjectHolder = pObjectHolder; + if (pObject2Device) + m_Layers.back().m_Matrix = *pObject2Device; + else + m_Layers.back().m_Matrix.SetIdentity(); +} + +void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, + const CPDF_RenderOptions* pOptions, + const CFX_Matrix* pLastMatrix) { + Render(pDevice, nullptr, pOptions, pLastMatrix); +} + +void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, + const CPDF_PageObject* pStopObj, + const CPDF_RenderOptions* pOptions, + const CFX_Matrix* pLastMatrix) { + for (auto& layer : m_Layers) { + pDevice->SaveState(); + if (pLastMatrix) { + CFX_Matrix FinalMatrix = layer.m_Matrix; + FinalMatrix.Concat(*pLastMatrix); + CPDF_RenderStatus status; + status.Initialize(this, pDevice, pLastMatrix, pStopObj, nullptr, nullptr, + pOptions, layer.m_pObjectHolder->m_Transparency, false, + nullptr); + status.RenderObjectList(layer.m_pObjectHolder, &FinalMatrix); + if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) + m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize); + if (status.m_bStopped) { + pDevice->RestoreState(false); + break; + } + } else { + CPDF_RenderStatus status; + status.Initialize(this, pDevice, nullptr, pStopObj, nullptr, nullptr, + pOptions, layer.m_pObjectHolder->m_Transparency, false, + nullptr); + status.RenderObjectList(layer.m_pObjectHolder, &layer.m_Matrix); + if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) + m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize); + if (status.m_bStopped) { + pDevice->RestoreState(false); + break; + } + } + pDevice->RestoreState(false); + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_rendercontext.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_rendercontext.h new file mode 100644 index 000000000000..a9fd2db78bac --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_rendercontext.h @@ -0,0 +1,69 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_RENDERCONTEXT_H_ +#define CORE_FPDFAPI_RENDER_CPDF_RENDERCONTEXT_H_ + +#include + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" + +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_Page; +class CPDF_PageObject; +class CPDF_PageObjectHolder; +class CPDF_PageRenderCache; +class CPDF_RenderOptions; +class CFX_DIBitmap; +class CFX_Matrix; +class CFX_RenderDevice; + +class CPDF_RenderContext { + public: + class Layer { + public: + CPDF_PageObjectHolder* m_pObjectHolder; + CFX_Matrix m_Matrix; + }; + + explicit CPDF_RenderContext(CPDF_Page* pPage); + CPDF_RenderContext(CPDF_Document* pDoc, CPDF_PageRenderCache* pPageCache); + ~CPDF_RenderContext(); + + void AppendLayer(CPDF_PageObjectHolder* pObjectHolder, + const CFX_Matrix* pObject2Device); + + void Render(CFX_RenderDevice* pDevice, + const CPDF_RenderOptions* pOptions, + const CFX_Matrix* pFinalMatrix); + + void Render(CFX_RenderDevice* pDevice, + const CPDF_PageObject* pStopObj, + const CPDF_RenderOptions* pOptions, + const CFX_Matrix* pFinalMatrix); + + void GetBackground(CFX_DIBitmap* pBuffer, + const CPDF_PageObject* pObj, + const CPDF_RenderOptions* pOptions, + CFX_Matrix* pFinalMatrix); + + size_t CountLayers() const { return m_Layers.size(); } + Layer* GetLayer(uint32_t index) { return &m_Layers[index]; } + + CPDF_Document* GetDocument() const { return m_pDocument; } + CPDF_Dictionary* GetPageResources() const { return m_pPageResources; } + CPDF_PageRenderCache* GetPageCache() const { return m_pPageCache; } + + protected: + CPDF_Document* const m_pDocument; + CPDF_Dictionary* m_pPageResources; + CPDF_PageRenderCache* m_pPageCache; + std::vector m_Layers; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_RENDERCONTEXT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderoptions.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderoptions.cpp new file mode 100644 index 000000000000..717e036feaf8 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderoptions.cpp @@ -0,0 +1,63 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_renderoptions.h" + +CPDF_RenderOptions::CPDF_RenderOptions() + : m_ColorMode(RENDER_COLOR_NORMAL), + m_Flags(RENDER_CLEARTYPE), + m_Interpolation(0), + m_AddFlags(0), + m_dwLimitCacheSize(1024 * 1024 * 100), + m_HalftoneLimit(-1), + m_bDrawAnnots(false) {} + +CPDF_RenderOptions::CPDF_RenderOptions(const CPDF_RenderOptions& rhs) + : m_ColorMode(rhs.m_ColorMode), + m_BackColor(rhs.m_BackColor), + m_ForeColor(rhs.m_ForeColor), + m_Flags(rhs.m_Flags), + m_Interpolation(rhs.m_Interpolation), + m_AddFlags(rhs.m_AddFlags), + m_dwLimitCacheSize(rhs.m_dwLimitCacheSize), + m_HalftoneLimit(rhs.m_HalftoneLimit), + m_bDrawAnnots(rhs.m_bDrawAnnots), + m_pOCContext(rhs.m_pOCContext) {} + +CPDF_RenderOptions::~CPDF_RenderOptions() {} + +FX_ARGB CPDF_RenderOptions::TranslateColor(FX_ARGB argb) const { + if (m_ColorMode == RENDER_COLOR_NORMAL) + return argb; + + if (m_ColorMode == RENDER_COLOR_ALPHA) + return argb; + + int a, r, g, b; + ArgbDecode(argb, a, r, g, b); + int gray = FXRGB2GRAY(r, g, b); + if (m_ColorMode == RENDER_COLOR_TWOCOLOR) { + int color = (r - gray) * (r - gray) + (g - gray) * (g - gray) + + (b - gray) * (b - gray); + if (gray < 35 && color < 20) + return ArgbEncode(a, m_ForeColor); + + if (gray > 221 && color < 20) + return ArgbEncode(a, m_BackColor); + + return argb; + } + int fr = FXSYS_GetRValue(m_ForeColor); + int fg = FXSYS_GetGValue(m_ForeColor); + int fb = FXSYS_GetBValue(m_ForeColor); + int br = FXSYS_GetRValue(m_BackColor); + int bg = FXSYS_GetGValue(m_BackColor); + int bb = FXSYS_GetBValue(m_BackColor); + r = (br - fr) * gray / 255 + fr; + g = (bg - fg) * gray / 255 + fg; + b = (bb - fb) * gray / 255 + fb; + return ArgbEncode(a, r, g, b); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderoptions.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderoptions.h new file mode 100644 index 000000000000..b934941d00b3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderoptions.h @@ -0,0 +1,56 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_RENDEROPTIONS_H_ +#define CORE_FPDFAPI_RENDER_CPDF_RENDEROPTIONS_H_ + +#include "core/fpdfdoc/cpdf_occontext.h" +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxge/fx_dib.h" + +#define RENDER_COLOR_NORMAL 0 +#define RENDER_COLOR_GRAY 1 +#define RENDER_COLOR_TWOCOLOR 2 +#define RENDER_COLOR_ALPHA 3 +#define RENDER_CLEARTYPE 0x00000001 +#define RENDER_PRINTGRAPHICTEXT 0x00000002 +#define RENDER_FORCE_DOWNSAMPLE 0x00000004 +#define RENDER_PRINTPREVIEW 0x00000008 +#define RENDER_BGR_STRIPE 0x00000010 +#define RENDER_NO_NATIVETEXT 0x00000020 +#define RENDER_FORCE_HALFTONE 0x00000040 +#define RENDER_RECT_AA 0x00000080 +#define RENDER_FILL_FULLCOVER 0x00000100 +#define RENDER_PRINTIMAGETEXT 0x00000200 +#define RENDER_OVERPRINT 0x00000400 +#define RENDER_THINLINE 0x00000800 +#define RENDER_NOTEXTSMOOTH 0x10000000 +#define RENDER_NOPATHSMOOTH 0x20000000 +#define RENDER_NOIMAGESMOOTH 0x40000000 +#define RENDER_LIMITEDIMAGECACHE 0x80000000 + +class CPDF_RenderOptions { + public: + CPDF_RenderOptions(); + CPDF_RenderOptions(const CPDF_RenderOptions& rhs); + ~CPDF_RenderOptions(); + + FX_ARGB TranslateColor(FX_ARGB argb) const; + + int m_ColorMode; + FX_COLORREF m_BackColor; + FX_COLORREF m_ForeColor; + uint32_t m_Flags; + int m_Interpolation; + uint32_t m_AddFlags; + uint32_t m_dwLimitCacheSize; + int m_HalftoneLimit; + bool m_bDrawAnnots; + CFX_RetainPtr m_pOCContext; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_RENDEROPTIONS_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderstatus.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderstatus.cpp new file mode 100644 index 000000000000..9022212eccbe --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderstatus.cpp @@ -0,0 +1,2652 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_renderstatus.h" + +#include +#include +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/font/cpdf_type3char.h" +#include "core/fpdfapi/font/cpdf_type3font.h" +#include "core/fpdfapi/page/cpdf_docpagedata.h" +#include "core/fpdfapi/page/cpdf_form.h" +#include "core/fpdfapi/page/cpdf_formobject.h" +#include "core/fpdfapi/page/cpdf_graphicstates.h" +#include "core/fpdfapi/page/cpdf_image.h" +#include "core/fpdfapi/page/cpdf_imageobject.h" +#include "core/fpdfapi/page/cpdf_meshstream.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/cpdf_pathobject.h" +#include "core/fpdfapi/page/cpdf_shadingobject.h" +#include "core/fpdfapi/page/cpdf_shadingpattern.h" +#include "core/fpdfapi/page/cpdf_textobject.h" +#include "core/fpdfapi/page/cpdf_tilingpattern.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/render/cpdf_charposlist.h" +#include "core/fpdfapi/render/cpdf_devicebuffer.h" +#include "core/fpdfapi/render/cpdf_dibsource.h" +#include "core/fpdfapi/render/cpdf_docrenderdata.h" +#include "core/fpdfapi/render/cpdf_imagerenderer.h" +#include "core/fpdfapi/render/cpdf_pagerendercache.h" +#include "core/fpdfapi/render/cpdf_rendercontext.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fpdfapi/render/cpdf_scaledrenderbuffer.h" +#include "core/fpdfapi/render/cpdf_textrenderer.h" +#include "core/fpdfapi/render/cpdf_transferfunc.h" +#include "core/fpdfapi/render/cpdf_type3cache.h" +#include "core/fpdfdoc/cpdf_occontext.h" +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxcrt/fx_safe_types.h" +#include "core/fxge/cfx_fxgedevice.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "core/fxge/ifx_renderdevicedriver.h" +#include "third_party/base/numerics/safe_math.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +#ifdef _SKIA_SUPPORT_ +#include "core/fxge/skia/fx_skia_device.h" +#endif + +#define SHADING_STEPS 256 + +namespace { + +void ReleaseCachedType3(CPDF_Type3Font* pFont) { + if (!pFont->m_pDocument) + return; + + pFont->m_pDocument->GetRenderData()->ReleaseCachedType3(pFont); + pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict()); +} + +class CPDF_RefType3Cache { + public: + explicit CPDF_RefType3Cache(CPDF_Type3Font* pType3Font) + : m_dwCount(0), m_pType3Font(pType3Font) {} + + ~CPDF_RefType3Cache() { + while (m_dwCount--) + ReleaseCachedType3(m_pType3Font); + } + + uint32_t m_dwCount; + CPDF_Type3Font* const m_pType3Font; +}; + +uint32_t CountOutputs( + const std::vector>& funcs) { + uint32_t total = 0; + for (const auto& func : funcs) { + if (func) + total += func->CountOutputs(); + } + return total; +} + +void DrawAxialShading(CFX_DIBitmap* pBitmap, + CFX_Matrix* pObject2Bitmap, + CPDF_Dictionary* pDict, + const std::vector>& funcs, + CPDF_ColorSpace* pCS, + int alpha) { + ASSERT(pBitmap->GetFormat() == FXDIB_Argb); + CPDF_Array* pCoords = pDict->GetArrayFor("Coords"); + if (!pCoords) + return; + + FX_FLOAT start_x = pCoords->GetNumberAt(0); + FX_FLOAT start_y = pCoords->GetNumberAt(1); + FX_FLOAT end_x = pCoords->GetNumberAt(2); + FX_FLOAT end_y = pCoords->GetNumberAt(3); + FX_FLOAT t_min = 0; + FX_FLOAT t_max = 1.0f; + CPDF_Array* pArray = pDict->GetArrayFor("Domain"); + if (pArray) { + t_min = pArray->GetNumberAt(0); + t_max = pArray->GetNumberAt(1); + } + bool bStartExtend = false; + bool bEndExtend = false; + pArray = pDict->GetArrayFor("Extend"); + if (pArray) { + bStartExtend = !!pArray->GetIntegerAt(0); + bEndExtend = !!pArray->GetIntegerAt(1); + } + int width = pBitmap->GetWidth(); + int height = pBitmap->GetHeight(); + FX_FLOAT x_span = end_x - start_x; + FX_FLOAT y_span = end_y - start_y; + FX_FLOAT axis_len_square = (x_span * x_span) + (y_span * y_span); + CFX_Matrix matrix; + matrix.SetReverse(*pObject2Bitmap); + uint32_t total_results = + std::max(CountOutputs(funcs), pCS->CountComponents()); + CFX_FixedBufGrow result_array(total_results); + FX_FLOAT* pResults = result_array; + FXSYS_memset(pResults, 0, total_results * sizeof(FX_FLOAT)); + uint32_t rgb_array[SHADING_STEPS]; + for (int i = 0; i < SHADING_STEPS; i++) { + FX_FLOAT input = (t_max - t_min) * i / SHADING_STEPS + t_min; + int offset = 0; + for (const auto& func : funcs) { + if (func) { + int nresults = 0; + if (func->Call(&input, 1, pResults + offset, nresults)) + offset += nresults; + } + } + FX_FLOAT R = 0.0f, G = 0.0f, B = 0.0f; + pCS->GetRGB(pResults, R, G, B); + rgb_array[i] = + FXARGB_TODIB(FXARGB_MAKE(alpha, FXSYS_round(R * 255), + FXSYS_round(G * 255), FXSYS_round(B * 255))); + } + int pitch = pBitmap->GetPitch(); + for (int row = 0; row < height; row++) { + uint32_t* dib_buf = (uint32_t*)(pBitmap->GetBuffer() + row * pitch); + for (int column = 0; column < width; column++) { + CFX_PointF pos = matrix.Transform(CFX_PointF( + static_cast(column), static_cast(row))); + FX_FLOAT scale = + (((pos.x - start_x) * x_span) + ((pos.y - start_y) * y_span)) / + axis_len_square; + int index = (int32_t)(scale * (SHADING_STEPS - 1)); + if (index < 0) { + if (!bStartExtend) + continue; + + index = 0; + } else if (index >= SHADING_STEPS) { + if (!bEndExtend) + continue; + + index = SHADING_STEPS - 1; + } + dib_buf[column] = rgb_array[index]; + } + } +} + +void DrawRadialShading(CFX_DIBitmap* pBitmap, + CFX_Matrix* pObject2Bitmap, + CPDF_Dictionary* pDict, + const std::vector>& funcs, + CPDF_ColorSpace* pCS, + int alpha) { + ASSERT(pBitmap->GetFormat() == FXDIB_Argb); + CPDF_Array* pCoords = pDict->GetArrayFor("Coords"); + if (!pCoords) + return; + + FX_FLOAT start_x = pCoords->GetNumberAt(0); + FX_FLOAT start_y = pCoords->GetNumberAt(1); + FX_FLOAT start_r = pCoords->GetNumberAt(2); + FX_FLOAT end_x = pCoords->GetNumberAt(3); + FX_FLOAT end_y = pCoords->GetNumberAt(4); + FX_FLOAT end_r = pCoords->GetNumberAt(5); + CFX_Matrix matrix; + matrix.SetReverse(*pObject2Bitmap); + FX_FLOAT t_min = 0; + FX_FLOAT t_max = 1.0f; + CPDF_Array* pArray = pDict->GetArrayFor("Domain"); + if (pArray) { + t_min = pArray->GetNumberAt(0); + t_max = pArray->GetNumberAt(1); + } + bool bStartExtend = false; + bool bEndExtend = false; + pArray = pDict->GetArrayFor("Extend"); + if (pArray) { + bStartExtend = !!pArray->GetIntegerAt(0); + bEndExtend = !!pArray->GetIntegerAt(1); + } + uint32_t total_results = + std::max(CountOutputs(funcs), pCS->CountComponents()); + CFX_FixedBufGrow result_array(total_results); + FX_FLOAT* pResults = result_array; + FXSYS_memset(pResults, 0, total_results * sizeof(FX_FLOAT)); + uint32_t rgb_array[SHADING_STEPS]; + for (int i = 0; i < SHADING_STEPS; i++) { + FX_FLOAT input = (t_max - t_min) * i / SHADING_STEPS + t_min; + int offset = 0; + for (const auto& func : funcs) { + if (func) { + int nresults; + if (func->Call(&input, 1, pResults + offset, nresults)) + offset += nresults; + } + } + FX_FLOAT R = 0.0f, G = 0.0f, B = 0.0f; + pCS->GetRGB(pResults, R, G, B); + rgb_array[i] = + FXARGB_TODIB(FXARGB_MAKE(alpha, FXSYS_round(R * 255), + FXSYS_round(G * 255), FXSYS_round(B * 255))); + } + FX_FLOAT a = ((start_x - end_x) * (start_x - end_x)) + + ((start_y - end_y) * (start_y - end_y)) - + ((start_r - end_r) * (start_r - end_r)); + int width = pBitmap->GetWidth(); + int height = pBitmap->GetHeight(); + int pitch = pBitmap->GetPitch(); + bool bDecreasing = false; + if (start_r > end_r) { + int length = (int)FXSYS_sqrt((((start_x - end_x) * (start_x - end_x)) + + ((start_y - end_y) * (start_y - end_y)))); + if (length < start_r - end_r) { + bDecreasing = true; + } + } + for (int row = 0; row < height; row++) { + uint32_t* dib_buf = (uint32_t*)(pBitmap->GetBuffer() + row * pitch); + for (int column = 0; column < width; column++) { + CFX_PointF pos = matrix.Transform(CFX_PointF( + static_cast(column), static_cast(row))); + FX_FLOAT b = -2 * (((pos.x - start_x) * (end_x - start_x)) + + ((pos.y - start_y) * (end_y - start_y)) + + (start_r * (end_r - start_r))); + FX_FLOAT c = ((pos.x - start_x) * (pos.x - start_x)) + + ((pos.y - start_y) * (pos.y - start_y)) - + (start_r * start_r); + FX_FLOAT s; + if (a == 0) { + s = -c / b; + } else { + FX_FLOAT b2_4ac = (b * b) - 4 * (a * c); + if (b2_4ac < 0) { + continue; + } + FX_FLOAT root = FXSYS_sqrt(b2_4ac); + FX_FLOAT s1, s2; + if (a > 0) { + s1 = (-b - root) / (2 * a); + s2 = (-b + root) / (2 * a); + } else { + s2 = (-b - root) / (2 * a); + s1 = (-b + root) / (2 * a); + } + if (bDecreasing) { + if (s1 >= 0 || bStartExtend) { + s = s1; + } else { + s = s2; + } + } else { + if (s2 <= 1.0f || bEndExtend) { + s = s2; + } else { + s = s1; + } + } + if ((start_r + s * (end_r - start_r)) < 0) { + continue; + } + } + int index = (int32_t)(s * (SHADING_STEPS - 1)); + if (index < 0) { + if (!bStartExtend) { + continue; + } + index = 0; + } + if (index >= SHADING_STEPS) { + if (!bEndExtend) { + continue; + } + index = SHADING_STEPS - 1; + } + dib_buf[column] = rgb_array[index]; + } + } +} + +void DrawFuncShading(CFX_DIBitmap* pBitmap, + CFX_Matrix* pObject2Bitmap, + CPDF_Dictionary* pDict, + const std::vector>& funcs, + CPDF_ColorSpace* pCS, + int alpha) { + ASSERT(pBitmap->GetFormat() == FXDIB_Argb); + CPDF_Array* pDomain = pDict->GetArrayFor("Domain"); + FX_FLOAT xmin = 0, ymin = 0, xmax = 1.0f, ymax = 1.0f; + if (pDomain) { + xmin = pDomain->GetNumberAt(0); + xmax = pDomain->GetNumberAt(1); + ymin = pDomain->GetNumberAt(2); + ymax = pDomain->GetNumberAt(3); + } + CFX_Matrix mtDomain2Target = pDict->GetMatrixFor("Matrix"); + CFX_Matrix matrix; + matrix.SetReverse(*pObject2Bitmap); + + CFX_Matrix reverse_matrix; + reverse_matrix.SetReverse(mtDomain2Target); + matrix.Concat(reverse_matrix); + int width = pBitmap->GetWidth(); + int height = pBitmap->GetHeight(); + int pitch = pBitmap->GetPitch(); + uint32_t total_results = + std::max(CountOutputs(funcs), pCS->CountComponents()); + CFX_FixedBufGrow result_array(total_results); + FX_FLOAT* pResults = result_array; + FXSYS_memset(pResults, 0, total_results * sizeof(FX_FLOAT)); + for (int row = 0; row < height; row++) { + uint32_t* dib_buf = (uint32_t*)(pBitmap->GetBuffer() + row * pitch); + for (int column = 0; column < width; column++) { + CFX_PointF pos = matrix.Transform(CFX_PointF( + static_cast(column), static_cast(row))); + if (pos.x < xmin || pos.x > xmax || pos.y < ymin || pos.y > ymax) + continue; + + FX_FLOAT input[] = {pos.x, pos.y}; + int offset = 0; + for (const auto& func : funcs) { + if (func) { + int nresults; + if (func->Call(input, 2, pResults + offset, nresults)) + offset += nresults; + } + } + + FX_FLOAT R = 0.0f; + FX_FLOAT G = 0.0f; + FX_FLOAT B = 0.0f; + pCS->GetRGB(pResults, R, G, B); + dib_buf[column] = FXARGB_TODIB(FXARGB_MAKE( + alpha, (int32_t)(R * 255), (int32_t)(G * 255), (int32_t)(B * 255))); + } + } +} + +bool GetScanlineIntersect(int y, + const CFX_PointF& first, + const CFX_PointF& second, + FX_FLOAT* x) { + if (first.y == second.y) + return false; + + if (first.y < second.y) { + if (y < first.y || y > second.y) + return false; + } else if (y < second.y || y > first.y) { + return false; + } + *x = first.x + ((second.x - first.x) * (y - first.y) / (second.y - first.y)); + return true; +} + +void DrawGouraud(CFX_DIBitmap* pBitmap, + int alpha, + CPDF_MeshVertex triangle[3]) { + FX_FLOAT min_y = triangle[0].position.y; + FX_FLOAT max_y = triangle[0].position.y; + for (int i = 1; i < 3; i++) { + min_y = std::min(min_y, triangle[i].position.y); + max_y = std::max(max_y, triangle[i].position.y); + } + if (min_y == max_y) + return; + + int min_yi = std::max(static_cast(FXSYS_floor(min_y)), 0); + int max_yi = static_cast(FXSYS_ceil(max_y)); + + if (max_yi >= pBitmap->GetHeight()) + max_yi = pBitmap->GetHeight() - 1; + + for (int y = min_yi; y <= max_yi; y++) { + int nIntersects = 0; + FX_FLOAT inter_x[3]; + FX_FLOAT r[3]; + FX_FLOAT g[3]; + FX_FLOAT b[3]; + for (int i = 0; i < 3; i++) { + CPDF_MeshVertex& vertex1 = triangle[i]; + CPDF_MeshVertex& vertex2 = triangle[(i + 1) % 3]; + CFX_PointF& position1 = vertex1.position; + CFX_PointF& position2 = vertex2.position; + bool bIntersect = + GetScanlineIntersect(y, position1, position2, &inter_x[nIntersects]); + if (!bIntersect) + continue; + + FX_FLOAT y_dist = (y - position1.y) / (position2.y - position1.y); + r[nIntersects] = vertex1.r + ((vertex2.r - vertex1.r) * y_dist); + g[nIntersects] = vertex1.g + ((vertex2.g - vertex1.g) * y_dist); + b[nIntersects] = vertex1.b + ((vertex2.b - vertex1.b) * y_dist); + nIntersects++; + } + if (nIntersects != 2) + continue; + + int min_x, max_x, start_index, end_index; + if (inter_x[0] < inter_x[1]) { + min_x = (int)FXSYS_floor(inter_x[0]); + max_x = (int)FXSYS_ceil(inter_x[1]); + start_index = 0; + end_index = 1; + } else { + min_x = (int)FXSYS_floor(inter_x[1]); + max_x = (int)FXSYS_ceil(inter_x[0]); + start_index = 1; + end_index = 0; + } + + int start_x = std::max(min_x, 0); + int end_x = max_x; + if (end_x > pBitmap->GetWidth()) + end_x = pBitmap->GetWidth(); + + uint8_t* dib_buf = + pBitmap->GetBuffer() + y * pBitmap->GetPitch() + start_x * 4; + FX_FLOAT r_unit = (r[end_index] - r[start_index]) / (max_x - min_x); + FX_FLOAT g_unit = (g[end_index] - g[start_index]) / (max_x - min_x); + FX_FLOAT b_unit = (b[end_index] - b[start_index]) / (max_x - min_x); + FX_FLOAT R = r[start_index] + (start_x - min_x) * r_unit; + FX_FLOAT G = g[start_index] + (start_x - min_x) * g_unit; + FX_FLOAT B = b[start_index] + (start_x - min_x) * b_unit; + for (int x = start_x; x < end_x; x++) { + R += r_unit; + G += g_unit; + B += b_unit; + FXARGB_SETDIB(dib_buf, + FXARGB_MAKE(alpha, (int32_t)(R * 255), (int32_t)(G * 255), + (int32_t)(B * 255))); + dib_buf += 4; + } + } +} + +void DrawFreeGouraudShading( + CFX_DIBitmap* pBitmap, + CFX_Matrix* pObject2Bitmap, + CPDF_Stream* pShadingStream, + const std::vector>& funcs, + CPDF_ColorSpace* pCS, + int alpha) { + ASSERT(pBitmap->GetFormat() == FXDIB_Argb); + + CPDF_MeshStream stream(kFreeFormGouraudTriangleMeshShading, funcs, + pShadingStream, pCS); + if (!stream.Load()) + return; + + CPDF_MeshVertex triangle[3]; + FXSYS_memset(triangle, 0, sizeof(triangle)); + + while (!stream.BitStream()->IsEOF()) { + CPDF_MeshVertex vertex; + uint32_t flag; + if (!stream.ReadVertex(*pObject2Bitmap, &vertex, &flag)) + return; + + if (flag == 0) { + triangle[0] = vertex; + for (int j = 1; j < 3; j++) { + uint32_t tflag; + if (!stream.ReadVertex(*pObject2Bitmap, &triangle[j], &tflag)) + return; + } + } else { + if (flag == 1) + triangle[0] = triangle[1]; + + triangle[1] = triangle[2]; + triangle[2] = vertex; + } + DrawGouraud(pBitmap, alpha, triangle); + } +} + +void DrawLatticeGouraudShading( + CFX_DIBitmap* pBitmap, + CFX_Matrix* pObject2Bitmap, + CPDF_Stream* pShadingStream, + const std::vector>& funcs, + CPDF_ColorSpace* pCS, + int alpha) { + ASSERT(pBitmap->GetFormat() == FXDIB_Argb); + + int row_verts = pShadingStream->GetDict()->GetIntegerFor("VerticesPerRow"); + if (row_verts < 2) + return; + + CPDF_MeshStream stream(kLatticeFormGouraudTriangleMeshShading, funcs, + pShadingStream, pCS); + if (!stream.Load()) + return; + + std::unique_ptr vertex( + FX_Alloc2D(CPDF_MeshVertex, row_verts, 2)); + if (!stream.ReadVertexRow(*pObject2Bitmap, row_verts, vertex.get())) + return; + + int last_index = 0; + while (1) { + CPDF_MeshVertex* last_row = vertex.get() + last_index * row_verts; + CPDF_MeshVertex* this_row = vertex.get() + (1 - last_index) * row_verts; + if (!stream.ReadVertexRow(*pObject2Bitmap, row_verts, this_row)) + return; + + CPDF_MeshVertex triangle[3]; + for (int i = 1; i < row_verts; i++) { + triangle[0] = last_row[i]; + triangle[1] = this_row[i - 1]; + triangle[2] = last_row[i - 1]; + DrawGouraud(pBitmap, alpha, triangle); + triangle[2] = this_row[i]; + DrawGouraud(pBitmap, alpha, triangle); + } + last_index = 1 - last_index; + } +} + +struct Coon_BezierCoeff { + float a, b, c, d; + void FromPoints(float p0, float p1, float p2, float p3) { + a = -p0 + 3 * p1 - 3 * p2 + p3; + b = 3 * p0 - 6 * p1 + 3 * p2; + c = -3 * p0 + 3 * p1; + d = p0; + } + Coon_BezierCoeff first_half() { + Coon_BezierCoeff result; + result.a = a / 8; + result.b = b / 4; + result.c = c / 2; + result.d = d; + return result; + } + Coon_BezierCoeff second_half() { + Coon_BezierCoeff result; + result.a = a / 8; + result.b = 3 * a / 8 + b / 4; + result.c = 3 * a / 8 + b / 2 + c / 2; + result.d = a / 8 + b / 4 + c / 2 + d; + return result; + } + void GetPoints(float p[4]) { + p[0] = d; + p[1] = c / 3 + p[0]; + p[2] = b / 3 - p[0] + 2 * p[1]; + p[3] = a + p[0] - 3 * p[1] + 3 * p[2]; + } + void GetPointsReverse(float p[4]) { + p[3] = d; + p[2] = c / 3 + p[3]; + p[1] = b / 3 - p[3] + 2 * p[2]; + p[0] = a + p[3] - 3 * p[2] + 3 * p[1]; + } + void BezierInterpol(Coon_BezierCoeff& C1, + Coon_BezierCoeff& C2, + Coon_BezierCoeff& D1, + Coon_BezierCoeff& D2) { + a = (D1.a + D2.a) / 2; + b = (D1.b + D2.b) / 2; + c = (D1.c + D2.c) / 2 - (C1.a / 8 + C1.b / 4 + C1.c / 2) + + (C2.a / 8 + C2.b / 4) + (-C1.d + D2.d) / 2 - (C2.a + C2.b) / 2; + d = C1.a / 8 + C1.b / 4 + C1.c / 2 + C1.d; + } + float Distance() { + float dis = a + b + c; + return dis < 0 ? -dis : dis; + } +}; + +struct Coon_Bezier { + Coon_BezierCoeff x, y; + void FromPoints(float x0, + float y0, + float x1, + float y1, + float x2, + float y2, + float x3, + float y3) { + x.FromPoints(x0, x1, x2, x3); + y.FromPoints(y0, y1, y2, y3); + } + + Coon_Bezier first_half() { + Coon_Bezier result; + result.x = x.first_half(); + result.y = y.first_half(); + return result; + } + + Coon_Bezier second_half() { + Coon_Bezier result; + result.x = x.second_half(); + result.y = y.second_half(); + return result; + } + + void BezierInterpol(Coon_Bezier& C1, + Coon_Bezier& C2, + Coon_Bezier& D1, + Coon_Bezier& D2) { + x.BezierInterpol(C1.x, C2.x, D1.x, D2.x); + y.BezierInterpol(C1.y, C2.y, D1.y, D2.y); + } + + void GetPoints(std::vector& pPoints, size_t start_idx) { + float p[4]; + int i; + x.GetPoints(p); + for (i = 0; i < 4; i++) + pPoints[start_idx + i].m_Point.x = p[i]; + + y.GetPoints(p); + for (i = 0; i < 4; i++) + pPoints[start_idx + i].m_Point.y = p[i]; + } + + void GetPointsReverse(std::vector& pPoints, size_t start_idx) { + float p[4]; + int i; + x.GetPointsReverse(p); + for (i = 0; i < 4; i++) + pPoints[i + start_idx].m_Point.x = p[i]; + + y.GetPointsReverse(p); + for (i = 0; i < 4; i++) + pPoints[i + start_idx].m_Point.y = p[i]; + } + + float Distance() { return x.Distance() + y.Distance(); } +}; + +int BiInterpolImpl(int c0, + int c1, + int c2, + int c3, + int x, + int y, + int x_scale, + int y_scale) { + int x1 = c0 + (c3 - c0) * x / x_scale; + int x2 = c1 + (c2 - c1) * x / x_scale; + return x1 + (x2 - x1) * y / y_scale; +} + +struct Coon_Color { + Coon_Color() { FXSYS_memset(comp, 0, sizeof(int) * 3); } + int comp[3]; + + void BiInterpol(Coon_Color colors[4], + int x, + int y, + int x_scale, + int y_scale) { + for (int i = 0; i < 3; i++) { + comp[i] = BiInterpolImpl(colors[0].comp[i], colors[1].comp[i], + colors[2].comp[i], colors[3].comp[i], x, y, + x_scale, y_scale); + } + } + + int Distance(Coon_Color& o) { + return std::max({FXSYS_abs(comp[0] - o.comp[0]), + FXSYS_abs(comp[1] - o.comp[1]), + FXSYS_abs(comp[2] - o.comp[2])}); + } +}; + +#define COONCOLOR_THRESHOLD 4 +struct CPDF_PatchDrawer { + Coon_Color patch_colors[4]; + int max_delta; + CFX_PathData path; + CFX_RenderDevice* pDevice; + int fill_mode; + int alpha; + void Draw(int x_scale, + int y_scale, + int left, + int bottom, + Coon_Bezier C1, + Coon_Bezier C2, + Coon_Bezier D1, + Coon_Bezier D2) { + bool bSmall = C1.Distance() < 2 && C2.Distance() < 2 && D1.Distance() < 2 && + D2.Distance() < 2; + Coon_Color div_colors[4]; + int d_bottom = 0; + int d_left = 0; + int d_top = 0; + int d_right = 0; + div_colors[0].BiInterpol(patch_colors, left, bottom, x_scale, y_scale); + if (!bSmall) { + div_colors[1].BiInterpol(patch_colors, left, bottom + 1, x_scale, + y_scale); + div_colors[2].BiInterpol(patch_colors, left + 1, bottom + 1, x_scale, + y_scale); + div_colors[3].BiInterpol(patch_colors, left + 1, bottom, x_scale, + y_scale); + d_bottom = div_colors[3].Distance(div_colors[0]); + d_left = div_colors[1].Distance(div_colors[0]); + d_top = div_colors[1].Distance(div_colors[2]); + d_right = div_colors[2].Distance(div_colors[3]); + } + + if (bSmall || + (d_bottom < COONCOLOR_THRESHOLD && d_left < COONCOLOR_THRESHOLD && + d_top < COONCOLOR_THRESHOLD && d_right < COONCOLOR_THRESHOLD)) { + std::vector& pPoints = path.GetPoints(); + C1.GetPoints(pPoints, 0); + D2.GetPoints(pPoints, 3); + C2.GetPointsReverse(pPoints, 6); + D1.GetPointsReverse(pPoints, 9); + int fillFlags = FXFILL_WINDING | FXFILL_FULLCOVER; + if (fill_mode & RENDER_NOPATHSMOOTH) { + fillFlags |= FXFILL_NOPATHSMOOTH; + } + pDevice->DrawPath( + &path, nullptr, nullptr, + FXARGB_MAKE(alpha, div_colors[0].comp[0], div_colors[0].comp[1], + div_colors[0].comp[2]), + 0, fillFlags); + } else { + if (d_bottom < COONCOLOR_THRESHOLD && d_top < COONCOLOR_THRESHOLD) { + Coon_Bezier m1; + m1.BezierInterpol(D1, D2, C1, C2); + y_scale *= 2; + bottom *= 2; + Draw(x_scale, y_scale, left, bottom, C1, m1, D1.first_half(), + D2.first_half()); + Draw(x_scale, y_scale, left, bottom + 1, m1, C2, D1.second_half(), + D2.second_half()); + } else if (d_left < COONCOLOR_THRESHOLD && + d_right < COONCOLOR_THRESHOLD) { + Coon_Bezier m2; + m2.BezierInterpol(C1, C2, D1, D2); + x_scale *= 2; + left *= 2; + Draw(x_scale, y_scale, left, bottom, C1.first_half(), C2.first_half(), + D1, m2); + Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), + C2.second_half(), m2, D2); + } else { + Coon_Bezier m1, m2; + m1.BezierInterpol(D1, D2, C1, C2); + m2.BezierInterpol(C1, C2, D1, D2); + Coon_Bezier m1f = m1.first_half(); + Coon_Bezier m1s = m1.second_half(); + Coon_Bezier m2f = m2.first_half(); + Coon_Bezier m2s = m2.second_half(); + x_scale *= 2; + y_scale *= 2; + left *= 2; + bottom *= 2; + Draw(x_scale, y_scale, left, bottom, C1.first_half(), m1f, + D1.first_half(), m2f); + Draw(x_scale, y_scale, left, bottom + 1, m1f, C2.first_half(), + D1.second_half(), m2s); + Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), m1s, m2f, + D2.first_half()); + Draw(x_scale, y_scale, left + 1, bottom + 1, m1s, C2.second_half(), m2s, + D2.second_half()); + } + } + } +}; + +void DrawCoonPatchMeshes( + ShadingType type, + CFX_DIBitmap* pBitmap, + CFX_Matrix* pObject2Bitmap, + CPDF_Stream* pShadingStream, + const std::vector>& funcs, + CPDF_ColorSpace* pCS, + int fill_mode, + int alpha) { + ASSERT(pBitmap->GetFormat() == FXDIB_Argb); + ASSERT(type == kCoonsPatchMeshShading || + type == kTensorProductPatchMeshShading); + + CFX_FxgeDevice device; + device.Attach(pBitmap, false, nullptr, false); + CPDF_MeshStream stream(type, funcs, pShadingStream, pCS); + if (!stream.Load()) + return; + + CPDF_PatchDrawer patch; + patch.alpha = alpha; + patch.pDevice = &device; + patch.fill_mode = fill_mode; + + for (int i = 0; i < 13; i++) { + patch.path.AppendPoint( + CFX_PointF(), i == 0 ? FXPT_TYPE::MoveTo : FXPT_TYPE::BezierTo, false); + } + + CFX_PointF coords[16]; + int point_count = type == kTensorProductPatchMeshShading ? 16 : 12; + while (!stream.BitStream()->IsEOF()) { + if (!stream.CanReadFlag()) + break; + uint32_t flag = stream.ReadFlag(); + int iStartPoint = 0, iStartColor = 0, i = 0; + if (flag) { + iStartPoint = 4; + iStartColor = 2; + CFX_PointF tempCoords[4]; + for (i = 0; i < 4; i++) { + tempCoords[i] = coords[(flag * 3 + i) % 12]; + } + FXSYS_memcpy(coords, tempCoords, sizeof(tempCoords)); + Coon_Color tempColors[2]; + tempColors[0] = patch.patch_colors[flag]; + tempColors[1] = patch.patch_colors[(flag + 1) % 4]; + FXSYS_memcpy(patch.patch_colors, tempColors, sizeof(Coon_Color) * 2); + } + for (i = iStartPoint; i < point_count; i++) { + if (!stream.CanReadCoords()) + break; + coords[i] = pObject2Bitmap->Transform(stream.ReadCoords()); + } + + for (i = iStartColor; i < 4; i++) { + if (!stream.CanReadColor()) + break; + + FX_FLOAT r; + FX_FLOAT g; + FX_FLOAT b; + std::tie(r, g, b) = stream.ReadColor(); + + patch.patch_colors[i].comp[0] = (int32_t)(r * 255); + patch.patch_colors[i].comp[1] = (int32_t)(g * 255); + patch.patch_colors[i].comp[2] = (int32_t)(b * 255); + } + CFX_FloatRect bbox = CFX_FloatRect::GetBBox(coords, point_count); + if (bbox.right <= 0 || bbox.left >= (FX_FLOAT)pBitmap->GetWidth() || + bbox.top <= 0 || bbox.bottom >= (FX_FLOAT)pBitmap->GetHeight()) { + continue; + } + Coon_Bezier C1, C2, D1, D2; + C1.FromPoints(coords[0].x, coords[0].y, coords[11].x, coords[11].y, + coords[10].x, coords[10].y, coords[9].x, coords[9].y); + C2.FromPoints(coords[3].x, coords[3].y, coords[4].x, coords[4].y, + coords[5].x, coords[5].y, coords[6].x, coords[6].y); + D1.FromPoints(coords[0].x, coords[0].y, coords[1].x, coords[1].y, + coords[2].x, coords[2].y, coords[3].x, coords[3].y); + D2.FromPoints(coords[9].x, coords[9].y, coords[8].x, coords[8].y, + coords[7].x, coords[7].y, coords[6].x, coords[6].y); + patch.Draw(1, 1, 0, 0, C1, C2, D1, D2); + } +} + +std::unique_ptr DrawPatternBitmap( + CPDF_Document* pDoc, + CPDF_PageRenderCache* pCache, + CPDF_TilingPattern* pPattern, + const CFX_Matrix* pObject2Device, + int width, + int height, + int flags) { + std::unique_ptr pBitmap(new CFX_DIBitmap); + if (!pBitmap->Create(width, height, + pPattern->colored() ? FXDIB_Argb : FXDIB_8bppMask)) { + return nullptr; + } + CFX_FxgeDevice bitmap_device; + bitmap_device.Attach(pBitmap.get(), false, nullptr, false); + pBitmap->Clear(0); + CFX_FloatRect cell_bbox = pPattern->bbox(); + pPattern->pattern_to_form()->TransformRect(cell_bbox); + pObject2Device->TransformRect(cell_bbox); + CFX_FloatRect bitmap_rect(0.0f, 0.0f, (FX_FLOAT)width, (FX_FLOAT)height); + CFX_Matrix mtAdjust; + mtAdjust.MatchRect(bitmap_rect, cell_bbox); + + CFX_Matrix mtPattern2Bitmap = *pObject2Device; + mtPattern2Bitmap.Concat(mtAdjust); + CPDF_RenderOptions options; + if (!pPattern->colored()) + options.m_ColorMode = RENDER_COLOR_ALPHA; + + flags |= RENDER_FORCE_HALFTONE; + options.m_Flags = flags; + CPDF_RenderContext context(pDoc, pCache); + context.AppendLayer(pPattern->form(), &mtPattern2Bitmap); + context.Render(&bitmap_device, &options, nullptr); +#if defined _SKIA_SUPPORT_PATHS_ + bitmap_device.Flush(); + pBitmap->UnPreMultiply(); +#endif + return pBitmap; +} + +bool IsAvailableMatrix(const CFX_Matrix& matrix) { + if (matrix.a == 0 || matrix.d == 0) + return matrix.b != 0 && matrix.c != 0; + + if (matrix.b == 0 || matrix.c == 0) + return matrix.a != 0 && matrix.d != 0; + + return true; +} + +} // namespace + +// static +int CPDF_RenderStatus::s_CurrentRecursionDepth = 0; + +CPDF_RenderStatus::CPDF_RenderStatus() + : m_pFormResource(nullptr), + m_pPageResource(nullptr), + m_pContext(nullptr), + m_bStopped(false), + m_pDevice(nullptr), + m_pCurObj(nullptr), + m_pStopObj(nullptr), + m_bPrint(false), + m_Transparency(0), + m_bDropObjects(false), + m_bStdCS(false), + m_GroupFamily(0), + m_bLoadMask(false), + m_pType3Char(nullptr), + m_T3FillColor(0), + m_curBlend(FXDIB_BLEND_NORMAL) {} + +CPDF_RenderStatus::~CPDF_RenderStatus() {} + +bool CPDF_RenderStatus::Initialize(CPDF_RenderContext* pContext, + CFX_RenderDevice* pDevice, + const CFX_Matrix* pDeviceMatrix, + const CPDF_PageObject* pStopObj, + const CPDF_RenderStatus* pParentState, + const CPDF_GraphicStates* pInitialStates, + const CPDF_RenderOptions* pOptions, + int transparency, + bool bDropObjects, + CPDF_Dictionary* pFormResource, + bool bStdCS, + CPDF_Type3Char* pType3Char, + FX_ARGB fill_color, + uint32_t GroupFamily, + bool bLoadMask) { + m_pContext = pContext; + m_pDevice = pDevice; + m_bPrint = m_pDevice->GetDeviceClass() != FXDC_DISPLAY; + if (pDeviceMatrix) { + m_DeviceMatrix = *pDeviceMatrix; + } + m_pStopObj = pStopObj; + if (pOptions) { + m_Options = *pOptions; + } + m_bDropObjects = bDropObjects; + m_bStdCS = bStdCS; + m_T3FillColor = fill_color; + m_pType3Char = pType3Char; + m_GroupFamily = GroupFamily; + m_bLoadMask = bLoadMask; + m_pFormResource = pFormResource; + m_pPageResource = m_pContext->GetPageResources(); + if (pInitialStates && !m_pType3Char) { + m_InitialStates.CopyStates(*pInitialStates); + if (pParentState) { + if (!m_InitialStates.m_ColorState.HasFillColor()) { + m_InitialStates.m_ColorState.SetFillRGB( + pParentState->m_InitialStates.m_ColorState.GetFillRGB()); + m_InitialStates.m_ColorState.GetMutableFillColor()->Copy( + pParentState->m_InitialStates.m_ColorState.GetFillColor()); + } + if (!m_InitialStates.m_ColorState.HasStrokeColor()) { + m_InitialStates.m_ColorState.SetStrokeRGB( + pParentState->m_InitialStates.m_ColorState.GetFillRGB()); + m_InitialStates.m_ColorState.GetMutableStrokeColor()->Copy( + pParentState->m_InitialStates.m_ColorState.GetStrokeColor()); + } + } + } else { + m_InitialStates.DefaultStates(); + } + m_pImageRenderer.reset(); + m_Transparency = transparency; + return true; +} + +void CPDF_RenderStatus::RenderObjectList( + const CPDF_PageObjectHolder* pObjectHolder, + const CFX_Matrix* pObj2Device) { +#if defined _SKIA_SUPPORT_ + DebugVerifyDeviceIsPreMultiplied(); +#endif + CFX_FloatRect clip_rect(m_pDevice->GetClipBox()); + CFX_Matrix device2object; + device2object.SetReverse(*pObj2Device); + device2object.TransformRect(clip_rect); + + for (const auto& pCurObj : *pObjectHolder->GetPageObjectList()) { + if (pCurObj.get() == m_pStopObj) { + m_bStopped = true; + return; + } + if (!pCurObj) + continue; + + if (pCurObj->m_Left > clip_rect.right || + pCurObj->m_Right < clip_rect.left || + pCurObj->m_Bottom > clip_rect.top || + pCurObj->m_Top < clip_rect.bottom) { + continue; + } + RenderSingleObject(pCurObj.get(), pObj2Device); + if (m_bStopped) + return; + } +#if defined _SKIA_SUPPORT_ + DebugVerifyDeviceIsPreMultiplied(); +#endif +} + +void CPDF_RenderStatus::RenderSingleObject(CPDF_PageObject* pObj, + const CFX_Matrix* pObj2Device) { +#if defined _SKIA_SUPPORT_ + DebugVerifyDeviceIsPreMultiplied(); +#endif + CFX_AutoRestorer restorer(&s_CurrentRecursionDepth); + if (++s_CurrentRecursionDepth > kRenderMaxRecursionDepth) { + return; + } + m_pCurObj = pObj; + if (m_Options.m_pOCContext && pObj->m_ContentMark) { + if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) { + return; + } + } + ProcessClipPath(pObj->m_ClipPath, pObj2Device); + if (ProcessTransparency(pObj, pObj2Device)) { + return; + } + ProcessObjectNoClip(pObj, pObj2Device); +#if defined _SKIA_SUPPORT_ + DebugVerifyDeviceIsPreMultiplied(); +#endif +} + +bool CPDF_RenderStatus::ContinueSingleObject(CPDF_PageObject* pObj, + const CFX_Matrix* pObj2Device, + IFX_Pause* pPause) { + if (m_pImageRenderer) { + if (m_pImageRenderer->Continue(pPause)) + return true; + + if (!m_pImageRenderer->GetResult()) + DrawObjWithBackground(pObj, pObj2Device); + m_pImageRenderer.reset(); + return false; + } + + m_pCurObj = pObj; + if (m_Options.m_pOCContext && pObj->m_ContentMark && + !m_Options.m_pOCContext->CheckObjectVisible(pObj)) { + return false; + } + + ProcessClipPath(pObj->m_ClipPath, pObj2Device); + if (ProcessTransparency(pObj, pObj2Device)) + return false; + + if (pObj->IsImage()) { + m_pImageRenderer = pdfium::MakeUnique(); + if (!m_pImageRenderer->Start(this, pObj, pObj2Device, false, + FXDIB_BLEND_NORMAL)) { + if (!m_pImageRenderer->GetResult()) + DrawObjWithBackground(pObj, pObj2Device); + m_pImageRenderer.reset(); + return false; + } + return ContinueSingleObject(pObj, pObj2Device, pPause); + } + + ProcessObjectNoClip(pObj, pObj2Device); + return false; +} + +bool CPDF_RenderStatus::GetObjectClippedRect(const CPDF_PageObject* pObj, + const CFX_Matrix* pObj2Device, + bool bLogical, + FX_RECT& rect) const { + rect = pObj->GetBBox(pObj2Device); + FX_RECT rtClip = m_pDevice->GetClipBox(); + if (!bLogical) { + CFX_Matrix dCTM = m_pDevice->GetCTM(); + FX_FLOAT a = FXSYS_fabs(dCTM.a); + FX_FLOAT d = FXSYS_fabs(dCTM.d); + if (a != 1.0f || d != 1.0f) { + rect.right = rect.left + (int32_t)FXSYS_ceil((FX_FLOAT)rect.Width() * a); + rect.bottom = rect.top + (int32_t)FXSYS_ceil((FX_FLOAT)rect.Height() * d); + rtClip.right = + rtClip.left + (int32_t)FXSYS_ceil((FX_FLOAT)rtClip.Width() * a); + rtClip.bottom = + rtClip.top + (int32_t)FXSYS_ceil((FX_FLOAT)rtClip.Height() * d); + } + } + rect.Intersect(rtClip); + return rect.IsEmpty(); +} + +void CPDF_RenderStatus::ProcessObjectNoClip(CPDF_PageObject* pObj, + const CFX_Matrix* pObj2Device) { +#if defined _SKIA_SUPPORT_ + DebugVerifyDeviceIsPreMultiplied(); +#endif + bool bRet = false; + switch (pObj->GetType()) { + case CPDF_PageObject::TEXT: + bRet = ProcessText(pObj->AsText(), pObj2Device, nullptr); + break; + case CPDF_PageObject::PATH: + bRet = ProcessPath(pObj->AsPath(), pObj2Device); + break; + case CPDF_PageObject::IMAGE: + bRet = ProcessImage(pObj->AsImage(), pObj2Device); + break; + case CPDF_PageObject::SHADING: + ProcessShading(pObj->AsShading(), pObj2Device); + return; + case CPDF_PageObject::FORM: + bRet = ProcessForm(pObj->AsForm(), pObj2Device); + break; + } + if (!bRet) + DrawObjWithBackground(pObj, pObj2Device); +#if defined _SKIA_SUPPORT_ + DebugVerifyDeviceIsPreMultiplied(); +#endif +} + +bool CPDF_RenderStatus::DrawObjWithBlend(CPDF_PageObject* pObj, + const CFX_Matrix* pObj2Device) { + bool bRet = false; + switch (pObj->GetType()) { + case CPDF_PageObject::PATH: + bRet = ProcessPath(pObj->AsPath(), pObj2Device); + break; + case CPDF_PageObject::IMAGE: + bRet = ProcessImage(pObj->AsImage(), pObj2Device); + break; + case CPDF_PageObject::FORM: + bRet = ProcessForm(pObj->AsForm(), pObj2Device); + break; + default: + break; + } + return bRet; +} + +void CPDF_RenderStatus::GetScaledMatrix(CFX_Matrix& matrix) const { + CFX_Matrix dCTM = m_pDevice->GetCTM(); + matrix.a *= FXSYS_fabs(dCTM.a); + matrix.d *= FXSYS_fabs(dCTM.d); +} + +void CPDF_RenderStatus::DrawObjWithBackground(CPDF_PageObject* pObj, + const CFX_Matrix* pObj2Device) { + FX_RECT rect; + if (GetObjectClippedRect(pObj, pObj2Device, false, rect)) { + return; + } + int res = 300; + if (pObj->IsImage() && + m_pDevice->GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER) { + res = 0; + } + CPDF_ScaledRenderBuffer buffer; + if (!buffer.Initialize(m_pContext, m_pDevice, rect, pObj, &m_Options, res)) { + return; + } + CFX_Matrix matrix = *pObj2Device; + matrix.Concat(*buffer.GetMatrix()); + GetScaledMatrix(matrix); + CPDF_Dictionary* pFormResource = nullptr; + if (pObj->IsForm()) { + const CPDF_FormObject* pFormObj = pObj->AsForm(); + if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) { + pFormResource = pFormObj->m_pForm->m_pFormDict->GetDictFor("Resources"); + } + } + CPDF_RenderStatus status; + status.Initialize(m_pContext, buffer.GetDevice(), buffer.GetMatrix(), nullptr, + nullptr, nullptr, &m_Options, m_Transparency, + m_bDropObjects, pFormResource); + status.RenderSingleObject(pObj, &matrix); + buffer.OutputToDevice(); +} + +bool CPDF_RenderStatus::ProcessForm(const CPDF_FormObject* pFormObj, + const CFX_Matrix* pObj2Device) { +#if defined _SKIA_SUPPORT_ + DebugVerifyDeviceIsPreMultiplied(); +#endif + CPDF_Dictionary* pOC = pFormObj->m_pForm->m_pFormDict->GetDictFor("OC"); + if (pOC && m_Options.m_pOCContext && + !m_Options.m_pOCContext->CheckOCGVisible(pOC)) { + return true; + } + CFX_Matrix matrix = pFormObj->m_FormMatrix; + matrix.Concat(*pObj2Device); + CPDF_Dictionary* pResources = nullptr; + if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) { + pResources = pFormObj->m_pForm->m_pFormDict->GetDictFor("Resources"); + } + CPDF_RenderStatus status; + status.Initialize(m_pContext, m_pDevice, nullptr, m_pStopObj, this, pFormObj, + &m_Options, m_Transparency, m_bDropObjects, pResources, + false); + status.m_curBlend = m_curBlend; + m_pDevice->SaveState(); + status.RenderObjectList(pFormObj->m_pForm.get(), &matrix); + m_bStopped = status.m_bStopped; + m_pDevice->RestoreState(false); +#if defined _SKIA_SUPPORT_ + DebugVerifyDeviceIsPreMultiplied(); +#endif + return true; +} + +bool CPDF_RenderStatus::ProcessPath(CPDF_PathObject* pPathObj, + const CFX_Matrix* pObj2Device) { + int FillType = pPathObj->m_FillType; + bool bStroke = pPathObj->m_bStroke; + ProcessPathPattern(pPathObj, pObj2Device, FillType, bStroke); + if (FillType == 0 && !bStroke) + return true; + + uint32_t fill_argb = FillType ? GetFillArgb(pPathObj) : 0; + uint32_t stroke_argb = bStroke ? GetStrokeArgb(pPathObj) : 0; + CFX_Matrix path_matrix = pPathObj->m_Matrix; + path_matrix.Concat(*pObj2Device); + if (!IsAvailableMatrix(path_matrix)) + return true; + + if (FillType && (m_Options.m_Flags & RENDER_RECT_AA)) + FillType |= FXFILL_RECT_AA; + if (m_Options.m_Flags & RENDER_FILL_FULLCOVER) + FillType |= FXFILL_FULLCOVER; + if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) + FillType |= FXFILL_NOPATHSMOOTH; + if (bStroke) + FillType |= FX_FILL_STROKE; + + const CPDF_PageObject* pPageObj = + static_cast(pPathObj); + if (pPageObj->m_GeneralState.GetStrokeAdjust()) + FillType |= FX_STROKE_ADJUST; + if (m_pType3Char) + FillType |= FX_FILL_TEXT_MODE; + + CFX_GraphState graphState = pPathObj->m_GraphState; + if (m_Options.m_Flags & RENDER_THINLINE) + graphState.SetLineWidth(0); + return m_pDevice->DrawPathWithBlend( + pPathObj->m_Path.GetObject(), &path_matrix, graphState.GetObject(), + fill_argb, stroke_argb, FillType, m_curBlend); +} + +CPDF_TransferFunc* CPDF_RenderStatus::GetTransferFunc(CPDF_Object* pObj) const { + ASSERT(pObj); + CPDF_DocRenderData* pDocCache = m_pContext->GetDocument()->GetRenderData(); + return pDocCache ? pDocCache->GetTransferFunc(pObj) : nullptr; +} + +FX_ARGB CPDF_RenderStatus::GetFillArgb(CPDF_PageObject* pObj, + bool bType3) const { + const CPDF_ColorState* pColorState = &pObj->m_ColorState; + if (m_pType3Char && !bType3 && + (!m_pType3Char->m_bColored || + (m_pType3Char->m_bColored && + (!*pColorState || pColorState->GetFillColor()->IsNull())))) { + return m_T3FillColor; + } + if (!*pColorState || pColorState->GetFillColor()->IsNull()) + pColorState = &m_InitialStates.m_ColorState; + + FX_COLORREF rgb = pColorState->GetFillRGB(); + if (rgb == (uint32_t)-1) + return 0; + + int32_t alpha = + static_cast((pObj->m_GeneralState.GetFillAlpha() * 255)); + if (pObj->m_GeneralState.GetTR()) { + if (!pObj->m_GeneralState.GetTransferFunc()) { + pObj->m_GeneralState.SetTransferFunc( + GetTransferFunc(pObj->m_GeneralState.GetTR())); + } + if (pObj->m_GeneralState.GetTransferFunc()) + rgb = pObj->m_GeneralState.GetTransferFunc()->TranslateColor(rgb); + } + return m_Options.TranslateColor(ArgbEncode(alpha, rgb)); +} + +FX_ARGB CPDF_RenderStatus::GetStrokeArgb(CPDF_PageObject* pObj) const { + const CPDF_ColorState* pColorState = &pObj->m_ColorState; + if (m_pType3Char && + (!m_pType3Char->m_bColored || + (m_pType3Char->m_bColored && + (!*pColorState || pColorState->GetStrokeColor()->IsNull())))) { + return m_T3FillColor; + } + if (!*pColorState || pColorState->GetStrokeColor()->IsNull()) + pColorState = &m_InitialStates.m_ColorState; + + FX_COLORREF rgb = pColorState->GetStrokeRGB(); + if (rgb == (uint32_t)-1) + return 0; + + int32_t alpha = static_cast(pObj->m_GeneralState.GetStrokeAlpha() * + 255); // not rounded. + if (pObj->m_GeneralState.GetTR()) { + if (!pObj->m_GeneralState.GetTransferFunc()) { + pObj->m_GeneralState.SetTransferFunc( + GetTransferFunc(pObj->m_GeneralState.GetTR())); + } + if (pObj->m_GeneralState.GetTransferFunc()) + rgb = pObj->m_GeneralState.GetTransferFunc()->TranslateColor(rgb); + } + return m_Options.TranslateColor(ArgbEncode(alpha, rgb)); +} + +void CPDF_RenderStatus::ProcessClipPath(CPDF_ClipPath ClipPath, + const CFX_Matrix* pObj2Device) { + if (!ClipPath) { + if (m_LastClipPath) { + m_pDevice->RestoreState(true); + m_LastClipPath.SetNull(); + } + return; + } + if (m_LastClipPath == ClipPath) + return; + + m_LastClipPath = ClipPath; + m_pDevice->RestoreState(true); + int nClipPath = ClipPath.GetPathCount(); + for (int i = 0; i < nClipPath; ++i) { + const CFX_PathData* pPathData = ClipPath.GetPath(i).GetObject(); + if (!pPathData) + continue; + + if (pPathData->GetPoints().empty()) { + CFX_PathData EmptyPath; + EmptyPath.AppendRect(-1, -1, 0, 0); + int fill_mode = FXFILL_WINDING; + m_pDevice->SetClip_PathFill(&EmptyPath, nullptr, fill_mode); + } else { + int ClipType = ClipPath.GetClipType(i); + m_pDevice->SetClip_PathFill(pPathData, pObj2Device, ClipType); + } + } + int textcount = ClipPath.GetTextCount(); + if (textcount == 0) + return; + + if (m_pDevice->GetDeviceClass() == FXDC_DISPLAY && + !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) { + return; + } + + std::unique_ptr pTextClippingPath; + for (int i = 0; i < textcount; ++i) { + CPDF_TextObject* pText = ClipPath.GetText(i); + if (pText) { + if (!pTextClippingPath) + pTextClippingPath = pdfium::MakeUnique(); + ProcessText(pText, pObj2Device, pTextClippingPath.get()); + continue; + } + + if (!pTextClippingPath) + continue; + + int fill_mode = FXFILL_WINDING; + if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) + fill_mode |= FXFILL_NOPATHSMOOTH; + m_pDevice->SetClip_PathFill(pTextClippingPath.get(), nullptr, fill_mode); + pTextClippingPath.reset(); + } +} + +bool CPDF_RenderStatus::SelectClipPath(const CPDF_PathObject* pPathObj, + const CFX_Matrix* pObj2Device, + bool bStroke) { + CFX_Matrix path_matrix = pPathObj->m_Matrix; + path_matrix.Concat(*pObj2Device); + if (bStroke) { + CFX_GraphState graphState = pPathObj->m_GraphState; + if (m_Options.m_Flags & RENDER_THINLINE) + graphState.SetLineWidth(0); + return m_pDevice->SetClip_PathStroke(pPathObj->m_Path.GetObject(), + &path_matrix, graphState.GetObject()); + } + int fill_mode = pPathObj->m_FillType; + if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) { + fill_mode |= FXFILL_NOPATHSMOOTH; + } + return m_pDevice->SetClip_PathFill(pPathObj->m_Path.GetObject(), &path_matrix, + fill_mode); +} + +bool CPDF_RenderStatus::ProcessTransparency(CPDF_PageObject* pPageObj, + const CFX_Matrix* pObj2Device) { +#if defined _SKIA_SUPPORT_ + DebugVerifyDeviceIsPreMultiplied(); +#endif + int blend_type = pPageObj->m_GeneralState.GetBlendType(); + if (blend_type == FXDIB_BLEND_UNSUPPORTED) + return true; + + CPDF_Dictionary* pSMaskDict = + ToDictionary(pPageObj->m_GeneralState.GetSoftMask()); + if (pSMaskDict) { + if (pPageObj->IsImage() && + pPageObj->AsImage()->GetImage()->GetDict()->KeyExist("SMask")) { + pSMaskDict = nullptr; + } + } + CPDF_Dictionary* pFormResource = nullptr; + FX_FLOAT group_alpha = 1.0f; + int Transparency = m_Transparency; + bool bGroupTransparent = false; + if (pPageObj->IsForm()) { + const CPDF_FormObject* pFormObj = pPageObj->AsForm(); + group_alpha = pFormObj->m_GeneralState.GetFillAlpha(); + Transparency = pFormObj->m_pForm->m_Transparency; + bGroupTransparent = !!(Transparency & PDFTRANS_ISOLATED); + if (pFormObj->m_pForm->m_pFormDict) { + pFormResource = pFormObj->m_pForm->m_pFormDict->GetDictFor("Resources"); + } + } + bool bTextClip = + (pPageObj->m_ClipPath && pPageObj->m_ClipPath.GetTextCount() && + m_pDevice->GetDeviceClass() == FXDC_DISPLAY && + !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)); + if ((m_Options.m_Flags & RENDER_OVERPRINT) && pPageObj->IsImage() && + pPageObj->m_GeneralState.GetFillOP() && + pPageObj->m_GeneralState.GetStrokeOP()) { + CPDF_Document* pDocument = nullptr; + CPDF_Page* pPage = nullptr; + if (m_pContext->GetPageCache()) { + pPage = m_pContext->GetPageCache()->GetPage(); + pDocument = pPage->m_pDocument; + } else { + pDocument = pPageObj->AsImage()->GetImage()->GetDocument(); + } + CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : nullptr; + CPDF_Object* pCSObj = pPageObj->AsImage() + ->GetImage() + ->GetStream() + ->GetDict() + ->GetDirectObjectFor("ColorSpace"); + CPDF_ColorSpace* pColorSpace = + pDocument->LoadColorSpace(pCSObj, pPageResources); + if (pColorSpace) { + int format = pColorSpace->GetFamily(); + if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || + format == PDFCS_DEVICEN) { + blend_type = FXDIB_BLEND_DARKEN; + } + pDocument->GetPageData()->ReleaseColorSpace(pCSObj); + } + } + if (!pSMaskDict && group_alpha == 1.0f && blend_type == FXDIB_BLEND_NORMAL && + !bTextClip && !bGroupTransparent) { + return false; + } + bool isolated = !!(Transparency & PDFTRANS_ISOLATED); + if (m_bPrint) { + bool bRet = false; + int rendCaps = m_pDevice->GetRenderCaps(); + if (!((Transparency & PDFTRANS_ISOLATED) || pSMaskDict || bTextClip) && + (rendCaps & FXRC_BLEND_MODE)) { + int oldBlend = m_curBlend; + m_curBlend = blend_type; + bRet = DrawObjWithBlend(pPageObj, pObj2Device); + m_curBlend = oldBlend; + } + if (!bRet) { + DrawObjWithBackground(pPageObj, pObj2Device); + } + return true; + } + FX_RECT rect = pPageObj->GetBBox(pObj2Device); + rect.Intersect(m_pDevice->GetClipBox()); + if (rect.IsEmpty()) { + return true; + } + CFX_Matrix deviceCTM = m_pDevice->GetCTM(); + FX_FLOAT scaleX = FXSYS_fabs(deviceCTM.a); + FX_FLOAT scaleY = FXSYS_fabs(deviceCTM.d); + int width = FXSYS_round((FX_FLOAT)rect.Width() * scaleX); + int height = FXSYS_round((FX_FLOAT)rect.Height() * scaleY); + CFX_FxgeDevice bitmap_device; + std::unique_ptr oriDevice; + if (!isolated && (m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) { + oriDevice = pdfium::MakeUnique(); + if (!m_pDevice->CreateCompatibleBitmap(oriDevice.get(), width, height)) + return true; + m_pDevice->GetDIBits(oriDevice.get(), rect.left, rect.top); + } + if (!bitmap_device.Create(width, height, FXDIB_Argb, oriDevice.get())) + return true; + CFX_DIBitmap* bitmap = bitmap_device.GetBitmap(); + bitmap->Clear(0); + CFX_Matrix new_matrix = *pObj2Device; + new_matrix.Translate(-rect.left, -rect.top); + new_matrix.Scale(scaleX, scaleY); + std::unique_ptr pTextMask; + if (bTextClip) { + pTextMask = pdfium::MakeUnique(); + if (!pTextMask->Create(width, height, FXDIB_8bppMask)) + return true; + + pTextMask->Clear(0); + CFX_FxgeDevice text_device; + text_device.Attach(pTextMask.get(), false, nullptr, false); + for (uint32_t i = 0; i < pPageObj->m_ClipPath.GetTextCount(); i++) { + CPDF_TextObject* textobj = pPageObj->m_ClipPath.GetText(i); + if (!textobj) + break; + + CFX_Matrix text_matrix = textobj->GetTextMatrix(); + CPDF_TextRenderer::DrawTextPath( + &text_device, textobj->m_CharCodes, textobj->m_CharPos, + textobj->m_TextState.GetFont(), textobj->m_TextState.GetFontSize(), + &text_matrix, &new_matrix, textobj->m_GraphState.GetObject(), + (FX_ARGB)-1, 0, nullptr, 0); + } + } + CPDF_RenderStatus bitmap_render; + bitmap_render.Initialize(m_pContext, &bitmap_device, nullptr, m_pStopObj, + nullptr, nullptr, &m_Options, 0, m_bDropObjects, + pFormResource, true); + bitmap_render.ProcessObjectNoClip(pPageObj, &new_matrix); +#if defined _SKIA_SUPPORT_PATHS_ + bitmap_device.Flush(); + bitmap->UnPreMultiply(); +#endif + m_bStopped = bitmap_render.m_bStopped; + if (pSMaskDict) { + CFX_Matrix smask_matrix = *pPageObj->m_GeneralState.GetSMaskMatrix(); + smask_matrix.Concat(*pObj2Device); + std::unique_ptr pSMaskSource = + LoadSMask(pSMaskDict, &rect, &smask_matrix); + if (pSMaskSource) + bitmap->MultiplyAlpha(pSMaskSource.get()); + } + if (pTextMask) { + bitmap->MultiplyAlpha(pTextMask.get()); + pTextMask.reset(); + } + int32_t blitAlpha = 255; + if (Transparency & PDFTRANS_GROUP && group_alpha != 1.0f) { + blitAlpha = (int32_t)(group_alpha * 255); +#ifndef _SKIA_SUPPORT_ + bitmap->MultiplyAlpha(blitAlpha); + blitAlpha = 255; +#endif + } + Transparency = m_Transparency; + if (pPageObj->IsForm()) { + Transparency |= PDFTRANS_GROUP; + } + CompositeDIBitmap(bitmap, rect.left, rect.top, 0, blitAlpha, blend_type, + Transparency); +#if defined _SKIA_SUPPORT_ + DebugVerifyDeviceIsPreMultiplied(); +#endif + return true; +} + +std::unique_ptr CPDF_RenderStatus::GetBackdrop( + const CPDF_PageObject* pObj, + const FX_RECT& rect, + int& left, + int& top, + bool bBackAlphaRequired) { + FX_RECT bbox = rect; + bbox.Intersect(m_pDevice->GetClipBox()); + left = bbox.left; + top = bbox.top; + CFX_Matrix deviceCTM = m_pDevice->GetCTM(); + FX_FLOAT scaleX = FXSYS_fabs(deviceCTM.a); + FX_FLOAT scaleY = FXSYS_fabs(deviceCTM.d); + int width = FXSYS_round(bbox.Width() * scaleX); + int height = FXSYS_round(bbox.Height() * scaleY); + auto pBackdrop = pdfium::MakeUnique(); + if (bBackAlphaRequired && !m_bDropObjects) + pBackdrop->Create(width, height, FXDIB_Argb); + else + m_pDevice->CreateCompatibleBitmap(pBackdrop.get(), width, height); + + if (!pBackdrop->GetBuffer()) + return nullptr; + + bool bNeedDraw; + if (pBackdrop->HasAlpha()) + bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT); + else + bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS); + + if (!bNeedDraw) { + m_pDevice->GetDIBits(pBackdrop.get(), left, top); + return pBackdrop; + } + + CFX_Matrix FinalMatrix = m_DeviceMatrix; + FinalMatrix.Translate(-left, -top); + FinalMatrix.Scale(scaleX, scaleY); + pBackdrop->Clear(pBackdrop->HasAlpha() ? 0 : 0xffffffff); + CFX_FxgeDevice device; + device.Attach(pBackdrop.get(), false, nullptr, false); + m_pContext->Render(&device, pObj, &m_Options, &FinalMatrix); + return pBackdrop; +} + +CPDF_GraphicStates* CPDF_RenderStatus::CloneObjStates( + const CPDF_GraphicStates* pSrcStates, + bool bStroke) { + if (!pSrcStates) + return nullptr; + + CPDF_GraphicStates* pStates = new CPDF_GraphicStates; + pStates->CopyStates(*pSrcStates); + const CPDF_Color* pObjColor = bStroke + ? pSrcStates->m_ColorState.GetStrokeColor() + : pSrcStates->m_ColorState.GetFillColor(); + if (!pObjColor->IsNull()) { + pStates->m_ColorState.SetFillRGB( + bStroke ? pSrcStates->m_ColorState.GetStrokeRGB() + : pSrcStates->m_ColorState.GetFillRGB()); + pStates->m_ColorState.SetStrokeRGB(pStates->m_ColorState.GetFillRGB()); + } + return pStates; +} + +#if defined _SKIA_SUPPORT_ +void CPDF_RenderStatus::DebugVerifyDeviceIsPreMultiplied() const { + m_pDevice->DebugVerifyBitmapIsPreMultiplied(); +} +#endif + +bool CPDF_RenderStatus::ProcessText(CPDF_TextObject* textobj, + const CFX_Matrix* pObj2Device, + CFX_PathData* pClippingPath) { + if (textobj->m_CharCodes.empty()) + return true; + + const TextRenderingMode text_render_mode = textobj->m_TextState.GetTextMode(); + if (text_render_mode == TextRenderingMode::MODE_INVISIBLE) + return true; + + CPDF_Font* pFont = textobj->m_TextState.GetFont(); + if (pFont->IsType3Font()) + return ProcessType3Text(textobj, pObj2Device); + + bool bFill = false; + bool bStroke = false; + bool bClip = false; + if (pClippingPath) { + bClip = true; + } else { + switch (text_render_mode) { + case TextRenderingMode::MODE_FILL: + case TextRenderingMode::MODE_FILL_CLIP: + bFill = true; + break; + case TextRenderingMode::MODE_STROKE: + case TextRenderingMode::MODE_STROKE_CLIP: + if (pFont->GetFace()) + bStroke = true; + else + bFill = true; + break; + case TextRenderingMode::MODE_FILL_STROKE: + case TextRenderingMode::MODE_FILL_STROKE_CLIP: + bFill = true; + if (pFont->GetFace()) + bStroke = true; + break; + case TextRenderingMode::MODE_INVISIBLE: + // Already handled above, but the compiler is not smart enough to + // realize it. Fall through. + ASSERT(false); + case TextRenderingMode::MODE_CLIP: + return true; + } + } + FX_ARGB stroke_argb = 0; + FX_ARGB fill_argb = 0; + bool bPattern = false; + if (bStroke) { + if (textobj->m_ColorState.GetStrokeColor()->IsPattern()) { + bPattern = true; + } else { + stroke_argb = GetStrokeArgb(textobj); + } + } + if (bFill) { + if (textobj->m_ColorState.GetFillColor()->IsPattern()) { + bPattern = true; + } else { + fill_argb = GetFillArgb(textobj); + } + } + CFX_Matrix text_matrix = textobj->GetTextMatrix(); + if (!IsAvailableMatrix(text_matrix)) + return true; + + FX_FLOAT font_size = textobj->m_TextState.GetFontSize(); + if (bPattern) { + DrawTextPathWithPattern(textobj, pObj2Device, pFont, font_size, + &text_matrix, bFill, bStroke); + return true; + } + if (bClip || bStroke) { + const CFX_Matrix* pDeviceMatrix = pObj2Device; + CFX_Matrix device_matrix; + if (bStroke) { + const FX_FLOAT* pCTM = textobj->m_TextState.GetCTM(); + if (pCTM[0] != 1.0f || pCTM[3] != 1.0f) { + CFX_Matrix ctm(pCTM[0], pCTM[1], pCTM[2], pCTM[3], 0, 0); + text_matrix.ConcatInverse(ctm); + device_matrix = ctm; + device_matrix.Concat(*pObj2Device); + pDeviceMatrix = &device_matrix; + } + } + int flag = 0; + if (bStroke && bFill) { + flag |= FX_FILL_STROKE; + flag |= FX_STROKE_TEXT_MODE; + } + if (textobj->m_GeneralState.GetStrokeAdjust()) + flag |= FX_STROKE_ADJUST; + if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) + flag |= FXFILL_NOPATHSMOOTH; + return CPDF_TextRenderer::DrawTextPath( + m_pDevice, textobj->m_CharCodes, textobj->m_CharPos, pFont, font_size, + &text_matrix, pDeviceMatrix, textobj->m_GraphState.GetObject(), + fill_argb, stroke_argb, pClippingPath, flag); + } + text_matrix.Concat(*pObj2Device); + return CPDF_TextRenderer::DrawNormalText(m_pDevice, textobj->m_CharCodes, + textobj->m_CharPos, pFont, font_size, + &text_matrix, fill_argb, &m_Options); +} + +CPDF_Type3Cache* CPDF_RenderStatus::GetCachedType3(CPDF_Type3Font* pFont) { + if (!pFont->m_pDocument) { + return nullptr; + } + pFont->m_pDocument->GetPageData()->GetFont(pFont->GetFontDict()); + return pFont->m_pDocument->GetRenderData()->GetCachedType3(pFont); +} + +// TODO(npm): Font fallback for type 3 fonts? (Completely separate code!!) +bool CPDF_RenderStatus::ProcessType3Text(CPDF_TextObject* textobj, + const CFX_Matrix* pObj2Device) { + CPDF_Type3Font* pType3Font = textobj->m_TextState.GetFont()->AsType3Font(); + if (pdfium::ContainsValue(m_Type3FontCache, pType3Font)) + return true; + + CFX_Matrix dCTM = m_pDevice->GetCTM(); + FX_FLOAT sa = FXSYS_fabs(dCTM.a); + FX_FLOAT sd = FXSYS_fabs(dCTM.d); + CFX_Matrix text_matrix = textobj->GetTextMatrix(); + CFX_Matrix char_matrix = pType3Font->GetFontMatrix(); + FX_FLOAT font_size = textobj->m_TextState.GetFontSize(); + char_matrix.Scale(font_size, font_size); + FX_ARGB fill_argb = GetFillArgb(textobj, true); + int fill_alpha = FXARGB_A(fill_argb); + int device_class = m_pDevice->GetDeviceClass(); + std::vector glyphs; + if (device_class == FXDC_DISPLAY) + glyphs.resize(textobj->m_CharCodes.size()); + else if (fill_alpha < 255) + return false; + + CPDF_RefType3Cache refTypeCache(pType3Font); + for (int iChar = 0; iChar < pdfium::CollectionSize(textobj->m_CharCodes); + iChar++) { + uint32_t charcode = textobj->m_CharCodes[iChar]; + if (charcode == static_cast(-1)) + continue; + + CPDF_Type3Char* pType3Char = pType3Font->LoadChar(charcode); + if (!pType3Char) + continue; + + CFX_Matrix matrix = char_matrix; + matrix.e += iChar ? textobj->m_CharPos[iChar - 1] : 0; + matrix.Concat(text_matrix); + matrix.Concat(*pObj2Device); + if (!pType3Char->LoadBitmap(m_pContext)) { + if (!glyphs.empty()) { + for (int i = 0; i < iChar; i++) { + const FXTEXT_GLYPHPOS& glyph = glyphs[i]; + if (!glyph.m_pGlyph) + continue; + + m_pDevice->SetBitMask(&glyph.m_pGlyph->m_Bitmap, + glyph.m_Origin.x + glyph.m_pGlyph->m_Left, + glyph.m_Origin.y - glyph.m_pGlyph->m_Top, + fill_argb); + } + glyphs.clear(); + } + CPDF_GraphicStates* pStates = CloneObjStates(textobj, false); + CPDF_RenderOptions Options = m_Options; + Options.m_Flags |= RENDER_FORCE_HALFTONE | RENDER_RECT_AA; + Options.m_Flags &= ~RENDER_FORCE_DOWNSAMPLE; + CPDF_Dictionary* pFormResource = nullptr; + if (pType3Char->m_pForm && pType3Char->m_pForm->m_pFormDict) { + pFormResource = + pType3Char->m_pForm->m_pFormDict->GetDictFor("Resources"); + } + if (fill_alpha == 255) { + CPDF_RenderStatus status; + status.Initialize(m_pContext, m_pDevice, nullptr, nullptr, this, + pStates, &Options, + pType3Char->m_pForm->m_Transparency, m_bDropObjects, + pFormResource, false, pType3Char, fill_argb); + status.m_Type3FontCache = m_Type3FontCache; + status.m_Type3FontCache.push_back(pType3Font); + m_pDevice->SaveState(); + status.RenderObjectList(pType3Char->m_pForm.get(), &matrix); + m_pDevice->RestoreState(false); + } else { + CFX_FloatRect rect_f = pType3Char->m_pForm->CalcBoundingBox(); + matrix.TransformRect(rect_f); + + FX_RECT rect = rect_f.GetOuterRect(); + CFX_FxgeDevice bitmap_device; + if (!bitmap_device.Create((int)(rect.Width() * sa), + (int)(rect.Height() * sd), FXDIB_Argb, + nullptr)) { + return true; + } + bitmap_device.GetBitmap()->Clear(0); + CPDF_RenderStatus status; + status.Initialize(m_pContext, &bitmap_device, nullptr, nullptr, this, + pStates, &Options, + pType3Char->m_pForm->m_Transparency, m_bDropObjects, + pFormResource, false, pType3Char, fill_argb); + status.m_Type3FontCache = m_Type3FontCache; + status.m_Type3FontCache.push_back(pType3Font); + matrix.Translate(-rect.left, -rect.top); + matrix.Scale(sa, sd); + status.RenderObjectList(pType3Char->m_pForm.get(), &matrix); + m_pDevice->SetDIBits(bitmap_device.GetBitmap(), rect.left, rect.top); + } + delete pStates; + } else if (pType3Char->m_pBitmap) { + if (device_class == FXDC_DISPLAY) { + CPDF_Type3Cache* pCache = GetCachedType3(pType3Font); + refTypeCache.m_dwCount++; + CFX_GlyphBitmap* pBitmap = pCache->LoadGlyph(charcode, &matrix, sa, sd); + if (!pBitmap) + continue; + + CFX_Point origin(FXSYS_round(matrix.e), FXSYS_round(matrix.f)); + if (glyphs.empty()) { + m_pDevice->SetBitMask(&pBitmap->m_Bitmap, origin.x + pBitmap->m_Left, + origin.y - pBitmap->m_Top, fill_argb); + } else { + glyphs[iChar].m_pGlyph = pBitmap; + glyphs[iChar].m_Origin = origin; + } + } else { + CFX_Matrix image_matrix = pType3Char->m_ImageMatrix; + image_matrix.Concat(matrix); + CPDF_ImageRenderer renderer; + if (renderer.Start(this, pType3Char->m_pBitmap.get(), fill_argb, 255, + &image_matrix, 0, false, FXDIB_BLEND_NORMAL)) { + renderer.Continue(nullptr); + } + if (!renderer.GetResult()) + return false; + } + } + } + + if (glyphs.empty()) + return true; + + FX_RECT rect = FXGE_GetGlyphsBBox(glyphs, 0, sa, sd); + CFX_DIBitmap bitmap; + if (!bitmap.Create(static_cast(rect.Width() * sa), + static_cast(rect.Height() * sd), FXDIB_8bppMask)) { + return true; + } + bitmap.Clear(0); + for (const FXTEXT_GLYPHPOS& glyph : glyphs) { + if (!glyph.m_pGlyph) + continue; + + pdfium::base::CheckedNumeric left = glyph.m_Origin.x; + left += glyph.m_pGlyph->m_Left; + left -= rect.left; + left *= sa; + if (!left.IsValid()) + continue; + + pdfium::base::CheckedNumeric top = glyph.m_Origin.y; + top -= glyph.m_pGlyph->m_Top; + top -= rect.top; + top *= sd; + if (!top.IsValid()) + continue; + + bitmap.CompositeMask(left.ValueOrDie(), top.ValueOrDie(), + glyph.m_pGlyph->m_Bitmap.GetWidth(), + glyph.m_pGlyph->m_Bitmap.GetHeight(), + &glyph.m_pGlyph->m_Bitmap, fill_argb, 0, 0, + FXDIB_BLEND_NORMAL, nullptr, false, 0, nullptr); + } + m_pDevice->SetBitMask(&bitmap, rect.left, rect.top, fill_argb); + return true; +} + +void CPDF_RenderStatus::DrawTextPathWithPattern(const CPDF_TextObject* textobj, + const CFX_Matrix* pObj2Device, + CPDF_Font* pFont, + FX_FLOAT font_size, + const CFX_Matrix* pTextMatrix, + bool bFill, + bool bStroke) { + if (!bStroke) { + CPDF_PathObject path; + std::vector> pCopy; + pCopy.push_back(std::unique_ptr(textobj->Clone())); + path.m_bStroke = false; + path.m_FillType = FXFILL_WINDING; + path.m_ClipPath.AppendTexts(&pCopy); + path.m_ColorState = textobj->m_ColorState; + path.m_Path.AppendRect(textobj->m_Left, textobj->m_Bottom, textobj->m_Right, + textobj->m_Top); + path.m_Left = textobj->m_Left; + path.m_Bottom = textobj->m_Bottom; + path.m_Right = textobj->m_Right; + path.m_Top = textobj->m_Top; + RenderSingleObject(&path, pObj2Device); + return; + } + CPDF_CharPosList CharPosList; + CharPosList.Load(textobj->m_CharCodes, textobj->m_CharPos, pFont, font_size); + for (uint32_t i = 0; i < CharPosList.m_nChars; i++) { + FXTEXT_CHARPOS& charpos = CharPosList.m_pCharPos[i]; + auto font = + charpos.m_FallbackFontPosition == -1 + ? &pFont->m_Font + : pFont->m_FontFallbacks[charpos.m_FallbackFontPosition].get(); + const CFX_PathData* pPath = + font->LoadGlyphPath(charpos.m_GlyphIndex, charpos.m_FontCharWidth); + if (!pPath) + continue; + + CPDF_PathObject path; + path.m_GraphState = textobj->m_GraphState; + path.m_ColorState = textobj->m_ColorState; + + CFX_Matrix matrix; + if (charpos.m_bGlyphAdjust) { + matrix = CFX_Matrix(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1], + charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], + 0, 0); + } + matrix.Concat(CFX_Matrix(font_size, 0, 0, font_size, charpos.m_Origin.x, + charpos.m_Origin.y)); + path.m_Path.Append(pPath, &matrix); + path.m_Matrix = *pTextMatrix; + path.m_bStroke = bStroke; + path.m_FillType = bFill ? FXFILL_WINDING : 0; + path.CalcBoundingBox(); + ProcessPath(&path, pObj2Device); + } +} + +void CPDF_RenderStatus::DrawShading(CPDF_ShadingPattern* pPattern, + CFX_Matrix* pMatrix, + FX_RECT& clip_rect, + int alpha, + bool bAlphaMode) { + const auto& funcs = pPattern->GetFuncs(); + CPDF_Dictionary* pDict = pPattern->GetShadingObject()->GetDict(); + CPDF_ColorSpace* pColorSpace = pPattern->GetCS(); + if (!pColorSpace) + return; + + FX_ARGB background = 0; + if (!pPattern->IsShadingObject() && pDict->KeyExist("Background")) { + CPDF_Array* pBackColor = pDict->GetArrayFor("Background"); + if (pBackColor && + pBackColor->GetCount() >= pColorSpace->CountComponents()) { + CFX_FixedBufGrow comps(pColorSpace->CountComponents()); + for (uint32_t i = 0; i < pColorSpace->CountComponents(); i++) + comps[i] = pBackColor->GetNumberAt(i); + FX_FLOAT R = 0.0f, G = 0.0f, B = 0.0f; + pColorSpace->GetRGB(comps, R, G, B); + background = ArgbEncode(255, (int32_t)(R * 255), (int32_t)(G * 255), + (int32_t)(B * 255)); + } + } + if (pDict->KeyExist("BBox")) { + CFX_FloatRect rect = pDict->GetRectFor("BBox"); + pMatrix->TransformRect(rect); + clip_rect.Intersect(rect.GetOuterRect()); + } + if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SHADING && + m_pDevice->GetDeviceDriver()->DrawShading(pPattern, pMatrix, clip_rect, + alpha, bAlphaMode)) { + return; + } + CPDF_DeviceBuffer buffer; + buffer.Initialize(m_pContext, m_pDevice, &clip_rect, m_pCurObj, 150); + CFX_Matrix FinalMatrix = *pMatrix; + FinalMatrix.Concat(*buffer.GetMatrix()); + CFX_DIBitmap* pBitmap = buffer.GetBitmap(); + if (!pBitmap->GetBuffer()) + return; + + pBitmap->Clear(background); + int fill_mode = m_Options.m_Flags; + switch (pPattern->GetShadingType()) { + case kInvalidShading: + case kMaxShading: + return; + case kFunctionBasedShading: + DrawFuncShading(pBitmap, &FinalMatrix, pDict, funcs, pColorSpace, alpha); + break; + case kAxialShading: + DrawAxialShading(pBitmap, &FinalMatrix, pDict, funcs, pColorSpace, alpha); + break; + case kRadialShading: + DrawRadialShading(pBitmap, &FinalMatrix, pDict, funcs, pColorSpace, + alpha); + break; + case kFreeFormGouraudTriangleMeshShading: { + // The shading object can be a stream or a dictionary. We do not handle + // the case of dictionary at the moment. + if (CPDF_Stream* pStream = ToStream(pPattern->GetShadingObject())) { + DrawFreeGouraudShading(pBitmap, &FinalMatrix, pStream, funcs, + pColorSpace, alpha); + } + } break; + case kLatticeFormGouraudTriangleMeshShading: { + // The shading object can be a stream or a dictionary. We do not handle + // the case of dictionary at the moment. + if (CPDF_Stream* pStream = ToStream(pPattern->GetShadingObject())) { + DrawLatticeGouraudShading(pBitmap, &FinalMatrix, pStream, funcs, + pColorSpace, alpha); + } + } break; + case kCoonsPatchMeshShading: + case kTensorProductPatchMeshShading: { + // The shading object can be a stream or a dictionary. We do not handle + // the case of dictionary at the moment. + if (CPDF_Stream* pStream = ToStream(pPattern->GetShadingObject())) { + DrawCoonPatchMeshes(pPattern->GetShadingType(), pBitmap, &FinalMatrix, + pStream, funcs, pColorSpace, fill_mode, alpha); + } + } break; + } + if (bAlphaMode) + pBitmap->LoadChannel(FXDIB_Red, pBitmap, FXDIB_Alpha); + + if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) + pBitmap->ConvertColorScale(m_Options.m_ForeColor, m_Options.m_BackColor); + buffer.OutputToDevice(); +} + +void CPDF_RenderStatus::DrawShadingPattern(CPDF_ShadingPattern* pattern, + const CPDF_PageObject* pPageObj, + const CFX_Matrix* pObj2Device, + bool bStroke) { + if (!pattern->Load()) + return; + + m_pDevice->SaveState(); + if (pPageObj->IsPath()) { + if (!SelectClipPath(pPageObj->AsPath(), pObj2Device, bStroke)) { + m_pDevice->RestoreState(false); + return; + } + } else if (pPageObj->IsImage()) { + m_pDevice->SetClip_Rect(pPageObj->GetBBox(pObj2Device)); + } else { + return; + } + FX_RECT rect; + if (GetObjectClippedRect(pPageObj, pObj2Device, false, rect)) { + m_pDevice->RestoreState(false); + return; + } + CFX_Matrix matrix = *pattern->pattern_to_form(); + matrix.Concat(*pObj2Device); + GetScaledMatrix(matrix); + int alpha = + FXSYS_round(255 * (bStroke ? pPageObj->m_GeneralState.GetStrokeAlpha() + : pPageObj->m_GeneralState.GetFillAlpha())); + DrawShading(pattern, &matrix, rect, alpha, + m_Options.m_ColorMode == RENDER_COLOR_ALPHA); + m_pDevice->RestoreState(false); +} + +void CPDF_RenderStatus::ProcessShading(const CPDF_ShadingObject* pShadingObj, + const CFX_Matrix* pObj2Device) { + FX_RECT rect = pShadingObj->GetBBox(pObj2Device); + FX_RECT clip_box = m_pDevice->GetClipBox(); + rect.Intersect(clip_box); + if (rect.IsEmpty()) + return; + + CFX_Matrix matrix = pShadingObj->m_Matrix; + matrix.Concat(*pObj2Device); + DrawShading(pShadingObj->m_pShading, &matrix, rect, + FXSYS_round(255 * pShadingObj->m_GeneralState.GetFillAlpha()), + m_Options.m_ColorMode == RENDER_COLOR_ALPHA); +} + +void CPDF_RenderStatus::DrawTilingPattern(CPDF_TilingPattern* pPattern, + CPDF_PageObject* pPageObj, + const CFX_Matrix* pObj2Device, + bool bStroke) { + if (!pPattern->Load()) { + return; + } + m_pDevice->SaveState(); + if (pPageObj->IsPath()) { + if (!SelectClipPath(pPageObj->AsPath(), pObj2Device, bStroke)) { + m_pDevice->RestoreState(false); + return; + } + } else if (pPageObj->IsImage()) { + m_pDevice->SetClip_Rect(pPageObj->GetBBox(pObj2Device)); + } else { + return; + } + FX_RECT clip_box = m_pDevice->GetClipBox(); + if (clip_box.IsEmpty()) { + m_pDevice->RestoreState(false); + return; + } + CFX_Matrix dCTM = m_pDevice->GetCTM(); + FX_FLOAT sa = FXSYS_fabs(dCTM.a); + FX_FLOAT sd = FXSYS_fabs(dCTM.d); + clip_box.right = clip_box.left + (int32_t)FXSYS_ceil(clip_box.Width() * sa); + clip_box.bottom = clip_box.top + (int32_t)FXSYS_ceil(clip_box.Height() * sd); + CFX_Matrix mtPattern2Device = *pPattern->pattern_to_form(); + mtPattern2Device.Concat(*pObj2Device); + GetScaledMatrix(mtPattern2Device); + bool bAligned = false; + if (pPattern->bbox().left == 0 && pPattern->bbox().bottom == 0 && + pPattern->bbox().right == pPattern->x_step() && + pPattern->bbox().top == pPattern->y_step() && + (mtPattern2Device.IsScaled() || mtPattern2Device.Is90Rotated())) { + bAligned = true; + } + CFX_FloatRect cell_bbox = pPattern->bbox(); + mtPattern2Device.TransformRect(cell_bbox); + int width = (int)FXSYS_ceil(cell_bbox.Width()); + int height = (int)FXSYS_ceil(cell_bbox.Height()); + if (width == 0) { + width = 1; + } + if (height == 0) { + height = 1; + } + int min_col, max_col, min_row, max_row; + CFX_Matrix mtDevice2Pattern; + mtDevice2Pattern.SetReverse(mtPattern2Device); + + CFX_FloatRect clip_box_p(clip_box); + mtDevice2Pattern.TransformRect(clip_box_p); + + min_col = (int)FXSYS_ceil((clip_box_p.left - pPattern->bbox().right) / + pPattern->x_step()); + max_col = (int)FXSYS_floor((clip_box_p.right - pPattern->bbox().left) / + pPattern->x_step()); + min_row = (int)FXSYS_ceil((clip_box_p.bottom - pPattern->bbox().top) / + pPattern->y_step()); + max_row = (int)FXSYS_floor((clip_box_p.top - pPattern->bbox().bottom) / + pPattern->y_step()); + + if (width > clip_box.Width() || height > clip_box.Height() || + width * height > clip_box.Width() * clip_box.Height()) { + CPDF_GraphicStates* pStates = nullptr; + if (!pPattern->colored()) + pStates = CloneObjStates(pPageObj, bStroke); + + CPDF_Dictionary* pFormResource = nullptr; + if (pPattern->form()->m_pFormDict) + pFormResource = pPattern->form()->m_pFormDict->GetDictFor("Resources"); + + for (int col = min_col; col <= max_col; col++) + for (int row = min_row; row <= max_row; row++) { + CFX_PointF original = mtPattern2Device.Transform( + CFX_PointF(col * pPattern->x_step(), row * pPattern->y_step())); + CFX_Matrix matrix = *pObj2Device; + matrix.Translate(original.x - mtPattern2Device.e, + original.y - mtPattern2Device.f); + m_pDevice->SaveState(); + CPDF_RenderStatus status; + status.Initialize(m_pContext, m_pDevice, nullptr, nullptr, this, + pStates, &m_Options, pPattern->form()->m_Transparency, + m_bDropObjects, pFormResource); + status.RenderObjectList(pPattern->form(), &matrix); + m_pDevice->RestoreState(false); + } + m_pDevice->RestoreState(false); + delete pStates; + return; + } + if (bAligned) { + int orig_x = FXSYS_round(mtPattern2Device.e); + int orig_y = FXSYS_round(mtPattern2Device.f); + min_col = (clip_box.left - orig_x) / width; + if (clip_box.left < orig_x) { + min_col--; + } + max_col = (clip_box.right - orig_x) / width; + if (clip_box.right <= orig_x) { + max_col--; + } + min_row = (clip_box.top - orig_y) / height; + if (clip_box.top < orig_y) { + min_row--; + } + max_row = (clip_box.bottom - orig_y) / height; + if (clip_box.bottom <= orig_y) { + max_row--; + } + } + FX_FLOAT left_offset = cell_bbox.left - mtPattern2Device.e; + FX_FLOAT top_offset = cell_bbox.bottom - mtPattern2Device.f; + std::unique_ptr pPatternBitmap; + if (width * height < 16) { + std::unique_ptr pEnlargedBitmap = + DrawPatternBitmap(m_pContext->GetDocument(), m_pContext->GetPageCache(), + pPattern, pObj2Device, 8, 8, m_Options.m_Flags); + pPatternBitmap = pEnlargedBitmap->StretchTo(width, height); + } else { + pPatternBitmap = DrawPatternBitmap( + m_pContext->GetDocument(), m_pContext->GetPageCache(), pPattern, + pObj2Device, width, height, m_Options.m_Flags); + } + if (!pPatternBitmap) { + m_pDevice->RestoreState(false); + return; + } + if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) { + pPatternBitmap->ConvertColorScale(m_Options.m_ForeColor, + m_Options.m_BackColor); + } + FX_ARGB fill_argb = GetFillArgb(pPageObj); + int clip_width = clip_box.right - clip_box.left; + int clip_height = clip_box.bottom - clip_box.top; + CFX_DIBitmap screen; + if (!screen.Create(clip_width, clip_height, FXDIB_Argb)) { + return; + } + screen.Clear(0); + uint32_t* src_buf = (uint32_t*)pPatternBitmap->GetBuffer(); + for (int col = min_col; col <= max_col; col++) { + for (int row = min_row; row <= max_row; row++) { + int start_x, start_y; + if (bAligned) { + start_x = FXSYS_round(mtPattern2Device.e) + col * width - clip_box.left; + start_y = FXSYS_round(mtPattern2Device.f) + row * height - clip_box.top; + } else { + CFX_PointF original = mtPattern2Device.Transform( + CFX_PointF(col * pPattern->x_step(), row * pPattern->y_step())); + + pdfium::base::CheckedNumeric safeStartX = + FXSYS_round(original.x + left_offset); + pdfium::base::CheckedNumeric safeStartY = + FXSYS_round(original.y + top_offset); + + safeStartX -= clip_box.left; + safeStartY -= clip_box.top; + if (!safeStartX.IsValid() || !safeStartY.IsValid()) + return; + + start_x = safeStartX.ValueOrDie(); + start_y = safeStartY.ValueOrDie(); + } + if (width == 1 && height == 1) { + if (start_x < 0 || start_x >= clip_box.Width() || start_y < 0 || + start_y >= clip_box.Height()) { + continue; + } + uint32_t* dest_buf = + (uint32_t*)(screen.GetBuffer() + screen.GetPitch() * start_y + + start_x * 4); + if (pPattern->colored()) + *dest_buf = *src_buf; + else + *dest_buf = (*(uint8_t*)src_buf << 24) | (fill_argb & 0xffffff); + } else { + if (pPattern->colored()) { + screen.CompositeBitmap(start_x, start_y, width, height, + pPatternBitmap.get(), 0, 0); + } else { + screen.CompositeMask(start_x, start_y, width, height, + pPatternBitmap.get(), fill_argb, 0, 0); + } + } + } + } + CompositeDIBitmap(&screen, clip_box.left, clip_box.top, 0, 255, + FXDIB_BLEND_NORMAL, false); + m_pDevice->RestoreState(false); +} + +void CPDF_RenderStatus::DrawPathWithPattern(CPDF_PathObject* pPathObj, + const CFX_Matrix* pObj2Device, + const CPDF_Color* pColor, + bool bStroke) { + CPDF_Pattern* pattern = pColor->GetPattern(); + if (!pattern) + return; + + if (CPDF_TilingPattern* pTilingPattern = pattern->AsTilingPattern()) + DrawTilingPattern(pTilingPattern, pPathObj, pObj2Device, bStroke); + else if (CPDF_ShadingPattern* pShadingPattern = pattern->AsShadingPattern()) + DrawShadingPattern(pShadingPattern, pPathObj, pObj2Device, bStroke); +} + +void CPDF_RenderStatus::ProcessPathPattern(CPDF_PathObject* pPathObj, + const CFX_Matrix* pObj2Device, + int& filltype, + bool& bStroke) { + if (filltype) { + const CPDF_Color& FillColor = *pPathObj->m_ColorState.GetFillColor(); + if (FillColor.IsPattern()) { + DrawPathWithPattern(pPathObj, pObj2Device, &FillColor, false); + filltype = 0; + } + } + if (bStroke) { + const CPDF_Color& StrokeColor = *pPathObj->m_ColorState.GetStrokeColor(); + if (StrokeColor.IsPattern()) { + DrawPathWithPattern(pPathObj, pObj2Device, &StrokeColor, true); + bStroke = false; + } + } +} + +bool CPDF_RenderStatus::ProcessImage(CPDF_ImageObject* pImageObj, + const CFX_Matrix* pObj2Device) { + CPDF_ImageRenderer render; + if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) + render.Continue(nullptr); + return render.GetResult(); +} + +void CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, + int left, + int top, + FX_ARGB mask_argb, + int bitmap_alpha, + int blend_mode, + int Transparency) { + if (!pDIBitmap) { + return; + } + if (blend_mode == FXDIB_BLEND_NORMAL) { + if (!pDIBitmap->IsAlphaMask()) { + if (bitmap_alpha < 255) { +#ifdef _SKIA_SUPPORT_ + void* dummy; + CFX_Matrix m(pDIBitmap->GetWidth(), 0, 0, -pDIBitmap->GetHeight(), left, + top + pDIBitmap->GetHeight()); + m_pDevice->StartDIBits(pDIBitmap, bitmap_alpha, 0, &m, 0, dummy); + return; +#else + pDIBitmap->MultiplyAlpha(bitmap_alpha); +#endif + } +#ifdef _SKIA_SUPPORT_ + CFX_SkiaDeviceDriver::PreMultiply(pDIBitmap); +#endif + if (m_pDevice->SetDIBits(pDIBitmap, left, top)) { + return; + } + } else { + uint32_t fill_argb = m_Options.TranslateColor(mask_argb); + if (bitmap_alpha < 255) { + ((uint8_t*)&fill_argb)[3] = + ((uint8_t*)&fill_argb)[3] * bitmap_alpha / 255; + } + if (m_pDevice->SetBitMask(pDIBitmap, left, top, fill_argb)) { + return; + } + } + } + bool bIsolated = !!(Transparency & PDFTRANS_ISOLATED); + bool bGroup = !!(Transparency & PDFTRANS_GROUP); + bool bBackAlphaRequired = blend_mode && bIsolated && !m_bDropObjects; + bool bGetBackGround = + ((m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT)) || + (!(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT) && + (m_pDevice->GetRenderCaps() & FXRC_GET_BITS) && !bBackAlphaRequired); + if (bGetBackGround) { + if (bIsolated || !bGroup) { + if (pDIBitmap->IsAlphaMask()) { + return; + } + m_pDevice->SetDIBitsWithBlend(pDIBitmap, left, top, blend_mode); + } else { + FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), + top + pDIBitmap->GetHeight()); + rect.Intersect(m_pDevice->GetClipBox()); + CFX_MaybeOwned pClone; + if (m_pDevice->GetBackDrop() && m_pDevice->GetBitmap()) { + pClone = m_pDevice->GetBackDrop()->Clone(&rect); + CFX_DIBitmap* pForeBitmap = m_pDevice->GetBitmap(); + pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), + pForeBitmap, rect.left, rect.top); + left = left >= 0 ? 0 : left; + top = top >= 0 ? 0 : top; + if (!pDIBitmap->IsAlphaMask()) + pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), + pDIBitmap, left, top, blend_mode); + else + pClone->CompositeMask(0, 0, pClone->GetWidth(), pClone->GetHeight(), + pDIBitmap, mask_argb, left, top, blend_mode); + } else { + pClone = pDIBitmap; + } + if (m_pDevice->GetBackDrop()) { + m_pDevice->SetDIBits(pClone.Get(), rect.left, rect.top); + } else { + if (pDIBitmap->IsAlphaMask()) + return; + m_pDevice->SetDIBitsWithBlend(pDIBitmap, rect.left, rect.top, + blend_mode); + } + } + return; + } + int back_left, back_top; + FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), + top + pDIBitmap->GetHeight()); + std::unique_ptr pBackdrop = + GetBackdrop(m_pCurObj, rect, back_left, back_top, + blend_mode > FXDIB_BLEND_NORMAL && bIsolated); + if (!pBackdrop) + return; + + if (!pDIBitmap->IsAlphaMask()) { + pBackdrop->CompositeBitmap(left - back_left, top - back_top, + pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), + pDIBitmap, 0, 0, blend_mode); + } else { + pBackdrop->CompositeMask(left - back_left, top - back_top, + pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), + pDIBitmap, mask_argb, 0, 0, blend_mode); + } + + auto pBackdrop1 = pdfium::MakeUnique(); + pBackdrop1->Create(pBackdrop->GetWidth(), pBackdrop->GetHeight(), + FXDIB_Rgb32); + pBackdrop1->Clear((uint32_t)-1); + pBackdrop1->CompositeBitmap(0, 0, pBackdrop->GetWidth(), + pBackdrop->GetHeight(), pBackdrop.get(), 0, 0); + pBackdrop = std::move(pBackdrop1); + m_pDevice->SetDIBits(pBackdrop.get(), back_left, back_top); +} + +std::unique_ptr CPDF_RenderStatus::LoadSMask( + CPDF_Dictionary* pSMaskDict, + FX_RECT* pClipRect, + const CFX_Matrix* pMatrix) { + if (!pSMaskDict) + return nullptr; + + CPDF_Stream* pGroup = pSMaskDict->GetStreamFor("G"); + if (!pGroup) + return nullptr; + + std::unique_ptr pFunc; + CPDF_Object* pFuncObj = pSMaskDict->GetDirectObjectFor("TR"); + if (pFuncObj && (pFuncObj->IsDictionary() || pFuncObj->IsStream())) + pFunc = CPDF_Function::Load(pFuncObj); + + CFX_Matrix matrix = *pMatrix; + matrix.Translate(-pClipRect->left, -pClipRect->top); + + CPDF_Form form(m_pContext->GetDocument(), m_pContext->GetPageResources(), + pGroup); + form.ParseContent(nullptr, nullptr, nullptr); + + CFX_FxgeDevice bitmap_device; + bool bLuminosity = pSMaskDict->GetStringFor("S") != "Alpha"; + int width = pClipRect->right - pClipRect->left; + int height = pClipRect->bottom - pClipRect->top; + FXDIB_Format format; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || defined _SKIA_SUPPORT_ || \ + defined _SKIA_SUPPORT_PATHS_ + format = bLuminosity ? FXDIB_Rgb32 : FXDIB_8bppMask; +#else + format = bLuminosity ? FXDIB_Rgb : FXDIB_8bppMask; +#endif + if (!bitmap_device.Create(width, height, format, nullptr)) + return nullptr; + + CFX_DIBitmap& bitmap = *bitmap_device.GetBitmap(); + int color_space_family = 0; + if (bLuminosity) { + CPDF_Array* pBC = pSMaskDict->GetArrayFor("BC"); + FX_ARGB back_color = 0xff000000; + if (pBC) { + CPDF_Object* pCSObj = nullptr; + CPDF_Dictionary* pDict = pGroup->GetDict(); + if (pDict && pDict->GetDictFor("Group")) { + pCSObj = pDict->GetDictFor("Group")->GetDirectObjectFor("CS"); + } + const CPDF_ColorSpace* pCS = + m_pContext->GetDocument()->LoadColorSpace(pCSObj); + if (pCS) { + // Store Color Space Family to use in CPDF_RenderStatus::Initialize. + color_space_family = pCS->GetFamily(); + + FX_FLOAT R, G, B; + uint32_t comps = 8; + if (pCS->CountComponents() > comps) { + comps = pCS->CountComponents(); + } + CFX_FixedBufGrow float_array(comps); + FX_FLOAT* pFloats = float_array; + FX_SAFE_UINT32 num_floats = comps; + num_floats *= sizeof(FX_FLOAT); + if (!num_floats.IsValid()) { + return nullptr; + } + FXSYS_memset(pFloats, 0, num_floats.ValueOrDie()); + size_t count = pBC->GetCount() > 8 ? 8 : pBC->GetCount(); + for (size_t i = 0; i < count; i++) { + pFloats[i] = pBC->GetNumberAt(i); + } + pCS->GetRGB(pFloats, R, G, B); + back_color = 0xff000000 | ((int32_t)(R * 255) << 16) | + ((int32_t)(G * 255) << 8) | (int32_t)(B * 255); + m_pContext->GetDocument()->GetPageData()->ReleaseColorSpace(pCSObj); + } + } + bitmap.Clear(back_color); + } else { + bitmap.Clear(0); + } + CPDF_Dictionary* pFormResource = nullptr; + if (form.m_pFormDict) { + pFormResource = form.m_pFormDict->GetDictFor("Resources"); + } + CPDF_RenderOptions options; + options.m_ColorMode = bLuminosity ? RENDER_COLOR_NORMAL : RENDER_COLOR_ALPHA; + CPDF_RenderStatus status; + status.Initialize(m_pContext, &bitmap_device, nullptr, nullptr, nullptr, + nullptr, &options, 0, m_bDropObjects, pFormResource, true, + nullptr, 0, color_space_family, bLuminosity); + status.RenderObjectList(&form, &matrix); + + auto pMask = pdfium::MakeUnique(); + if (!pMask->Create(width, height, FXDIB_8bppMask)) + return nullptr; + + uint8_t* dest_buf = pMask->GetBuffer(); + int dest_pitch = pMask->GetPitch(); + uint8_t* src_buf = bitmap.GetBuffer(); + int src_pitch = bitmap.GetPitch(); + std::vector transfers(256); + if (pFunc) { + CFX_FixedBufGrow results(pFunc->CountOutputs()); + for (int i = 0; i < 256; i++) { + FX_FLOAT input = (FX_FLOAT)i / 255.0f; + int nresult; + pFunc->Call(&input, 1, results, nresult); + transfers[i] = FXSYS_round(results[0] * 255); + } + } else { + for (int i = 0; i < 256; i++) { + transfers[i] = i; + } + } + if (bLuminosity) { + int Bpp = bitmap.GetBPP() / 8; + for (int row = 0; row < height; row++) { + uint8_t* dest_pos = dest_buf + row * dest_pitch; + uint8_t* src_pos = src_buf + row * src_pitch; + for (int col = 0; col < width; col++) { + *dest_pos++ = transfers[FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos)]; + src_pos += Bpp; + } + } + } else if (pFunc) { + int size = dest_pitch * height; + for (int i = 0; i < size; i++) { + dest_buf[i] = transfers[src_buf[i]]; + } + } else { + FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height); + } + return pMask; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderstatus.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderstatus.h new file mode 100644 index 000000000000..25ddfb06c379 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_renderstatus.h @@ -0,0 +1,179 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_RENDERSTATUS_H_ +#define CORE_FPDFAPI_RENDER_CPDF_RENDERSTATUS_H_ + +#include +#include + +#include "core/fpdfapi/page/cpdf_clippath.h" +#include "core/fpdfapi/page/cpdf_graphicstates.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fxge/cfx_renderdevice.h" + +class CFX_PathData; +class CPDF_Color; +class CPDF_Dictionary; +class CPDF_Font; +class CPDF_FormObject; +class CPDF_ImageCacheEntry; +class CPDF_ImageObject; +class CPDF_ImageRenderer; +class CPDF_Object; +class CPDF_PageObject; +class CPDF_PageObjectHolder; +class CPDF_PathObject; +class CPDF_ShadingObject; +class CPDF_ShadingPattern; +class CPDF_TilingPattern; +class CPDF_TransferFunc; +class CPDF_Type3Cache; +class CPDF_Type3Char; +class CPDF_Type3Font; + +class CPDF_RenderStatus { + public: + CPDF_RenderStatus(); + ~CPDF_RenderStatus(); + + bool Initialize(class CPDF_RenderContext* pContext, + CFX_RenderDevice* pDevice, + const CFX_Matrix* pDeviceMatrix, + const CPDF_PageObject* pStopObj, + const CPDF_RenderStatus* pParentStatus, + const CPDF_GraphicStates* pInitialStates, + const CPDF_RenderOptions* pOptions, + int transparency, + bool bDropObjects, + CPDF_Dictionary* pFormResource = nullptr, + bool bStdCS = false, + CPDF_Type3Char* pType3Char = nullptr, + FX_ARGB fill_color = 0, + uint32_t GroupFamily = 0, + bool bLoadMask = false); + void RenderObjectList(const CPDF_PageObjectHolder* pObjectHolder, + const CFX_Matrix* pObj2Device); + void RenderSingleObject(CPDF_PageObject* pObj, const CFX_Matrix* pObj2Device); + bool ContinueSingleObject(CPDF_PageObject* pObj, + const CFX_Matrix* pObj2Device, + IFX_Pause* pPause); + CPDF_RenderContext* GetContext() { return m_pContext; } + +#if defined _SKIA_SUPPORT_ + void DebugVerifyDeviceIsPreMultiplied() const; +#endif + + CPDF_RenderOptions m_Options; + CPDF_Dictionary* m_pFormResource; + CPDF_Dictionary* m_pPageResource; + std::vector m_Type3FontCache; + + private: + friend class CPDF_ImageRenderer; + friend class CPDF_RenderContext; + + void ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_Matrix* pObj2Device); + bool ProcessTransparency(CPDF_PageObject* PageObj, + const CFX_Matrix* pObj2Device); + void ProcessObjectNoClip(CPDF_PageObject* PageObj, + const CFX_Matrix* pObj2Device); + void DrawObjWithBackground(CPDF_PageObject* pObj, + const CFX_Matrix* pObj2Device); + bool DrawObjWithBlend(CPDF_PageObject* pObj, const CFX_Matrix* pObj2Device); + bool ProcessPath(CPDF_PathObject* pPathObj, const CFX_Matrix* pObj2Device); + void ProcessPathPattern(CPDF_PathObject* pPathObj, + const CFX_Matrix* pObj2Device, + int& filltype, + bool& bStroke); + void DrawPathWithPattern(CPDF_PathObject* pPathObj, + const CFX_Matrix* pObj2Device, + const CPDF_Color* pColor, + bool bStroke); + void DrawTilingPattern(CPDF_TilingPattern* pPattern, + CPDF_PageObject* pPageObj, + const CFX_Matrix* pObj2Device, + bool bStroke); + void DrawShadingPattern(CPDF_ShadingPattern* pPattern, + const CPDF_PageObject* pPageObj, + const CFX_Matrix* pObj2Device, + bool bStroke); + bool SelectClipPath(const CPDF_PathObject* pPathObj, + const CFX_Matrix* pObj2Device, + bool bStroke); + bool ProcessImage(CPDF_ImageObject* pImageObj, const CFX_Matrix* pObj2Device); + void CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, + int left, + int top, + FX_ARGB mask_argb, + int bitmap_alpha, + int blend_mode, + int bIsolated); + void ProcessShading(const CPDF_ShadingObject* pShadingObj, + const CFX_Matrix* pObj2Device); + void DrawShading(CPDF_ShadingPattern* pPattern, + CFX_Matrix* pMatrix, + FX_RECT& clip_rect, + int alpha, + bool bAlphaMode); + bool ProcessType3Text(CPDF_TextObject* textobj, + const CFX_Matrix* pObj2Device); + bool ProcessText(CPDF_TextObject* textobj, + const CFX_Matrix* pObj2Device, + CFX_PathData* pClippingPath); + void DrawTextPathWithPattern(const CPDF_TextObject* textobj, + const CFX_Matrix* pObj2Device, + CPDF_Font* pFont, + FX_FLOAT font_size, + const CFX_Matrix* pTextMatrix, + bool bFill, + bool bStroke); + bool ProcessForm(const CPDF_FormObject* pFormObj, + const CFX_Matrix* pObj2Device); + std::unique_ptr GetBackdrop(const CPDF_PageObject* pObj, + const FX_RECT& rect, + int& left, + int& top, + bool bBackAlphaRequired); + std::unique_ptr LoadSMask(CPDF_Dictionary* pSMaskDict, + FX_RECT* pClipRect, + const CFX_Matrix* pMatrix); + static CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont); + static CPDF_GraphicStates* CloneObjStates(const CPDF_GraphicStates* pPathObj, + bool bStroke); + CPDF_TransferFunc* GetTransferFunc(CPDF_Object* pObject) const; + FX_ARGB GetFillArgb(CPDF_PageObject* pObj, bool bType3 = false) const; + FX_ARGB GetStrokeArgb(CPDF_PageObject* pObj) const; + bool GetObjectClippedRect(const CPDF_PageObject* pObj, + const CFX_Matrix* pObj2Device, + bool bLogical, + FX_RECT& rect) const; + void GetScaledMatrix(CFX_Matrix& matrix) const; + + static const int kRenderMaxRecursionDepth = 64; + static int s_CurrentRecursionDepth; + + CPDF_RenderContext* m_pContext; + bool m_bStopped; + CFX_RenderDevice* m_pDevice; + CFX_Matrix m_DeviceMatrix; + CPDF_ClipPath m_LastClipPath; + const CPDF_PageObject* m_pCurObj; + const CPDF_PageObject* m_pStopObj; + CPDF_GraphicStates m_InitialStates; + std::unique_ptr m_pImageRenderer; + bool m_bPrint; + int m_Transparency; + bool m_bDropObjects; + bool m_bStdCS; + uint32_t m_GroupFamily; + bool m_bLoadMask; + CPDF_Type3Char* m_pType3Char; + FX_ARGB m_T3FillColor; + int m_curBlend; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_RENDERSTATUS_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp new file mode 100644 index 000000000000..de60e732bb25 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp @@ -0,0 +1,80 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_scaledrenderbuffer.h" + +#include "core/fpdfapi/render/cpdf_rendercontext.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fxge/cfx_fxgedevice.h" +#include "core/fxge/cfx_renderdevice.h" +#include "third_party/base/ptr_util.h" + +#define _FPDFAPI_IMAGESIZE_LIMIT_ (30 * 1024 * 1024) + +CPDF_ScaledRenderBuffer::CPDF_ScaledRenderBuffer() {} + +CPDF_ScaledRenderBuffer::~CPDF_ScaledRenderBuffer() {} + +bool CPDF_ScaledRenderBuffer::Initialize(CPDF_RenderContext* pContext, + CFX_RenderDevice* pDevice, + const FX_RECT& pRect, + const CPDF_PageObject* pObj, + const CPDF_RenderOptions* pOptions, + int max_dpi) { + m_pDevice = pDevice; + if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_GET_BITS) + return true; + + m_pContext = pContext; + m_Rect = pRect; + m_pObject = pObj; + m_Matrix.Translate(-pRect.left, -pRect.top); + int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE); + int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE); + if (horz_size && vert_size && max_dpi) { + int dpih = + pDevice->GetDeviceCaps(FXDC_PIXEL_WIDTH) * 254 / (horz_size * 10); + int dpiv = + pDevice->GetDeviceCaps(FXDC_PIXEL_HEIGHT) * 254 / (vert_size * 10); + if (dpih > max_dpi) + m_Matrix.Scale((FX_FLOAT)(max_dpi) / dpih, 1.0f); + if (dpiv > max_dpi) + m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv); + } + m_pBitmapDevice = pdfium::MakeUnique(); + FXDIB_Format dibFormat = FXDIB_Rgb; + int32_t bpp = 24; + if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_ALPHA_OUTPUT) { + dibFormat = FXDIB_Argb; + bpp = 32; + } + while (1) { + CFX_FloatRect rect(pRect); + m_Matrix.TransformRect(rect); + FX_RECT bitmap_rect = rect.GetOuterRect(); + int32_t iWidth = bitmap_rect.Width(); + int32_t iHeight = bitmap_rect.Height(); + int32_t iPitch = (iWidth * bpp + 31) / 32 * 4; + if (iWidth * iHeight < 1) + return false; + + if (iPitch * iHeight <= _FPDFAPI_IMAGESIZE_LIMIT_ && + m_pBitmapDevice->Create(iWidth, iHeight, dibFormat, nullptr)) { + break; + } + m_Matrix.Scale(0.5f, 0.5f); + } + m_pContext->GetBackground(m_pBitmapDevice->GetBitmap(), m_pObject, pOptions, + &m_Matrix); + return true; +} + +void CPDF_ScaledRenderBuffer::OutputToDevice() { + if (m_pBitmapDevice) { + m_pDevice->StretchDIBits(m_pBitmapDevice->GetBitmap(), m_Rect.left, + m_Rect.top, m_Rect.Width(), m_Rect.Height()); + } +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_scaledrenderbuffer.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_scaledrenderbuffer.h new file mode 100644 index 000000000000..f802349dcb96 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_scaledrenderbuffer.h @@ -0,0 +1,46 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_SCALEDRENDERBUFFER_H_ +#define CORE_FPDFAPI_RENDER_CPDF_SCALEDRENDERBUFFER_H_ + +#include + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxge/cfx_fxgedevice.h" + +class CFX_RenderDevice; +class CPDF_PageObject; +class CPDF_RenderContext; +class CPDF_RenderOptions; + +class CPDF_ScaledRenderBuffer { + public: + CPDF_ScaledRenderBuffer(); + ~CPDF_ScaledRenderBuffer(); + + bool Initialize(CPDF_RenderContext* pContext, + CFX_RenderDevice* pDevice, + const FX_RECT& pRect, + const CPDF_PageObject* pObj, + const CPDF_RenderOptions* pOptions, + int max_dpi); + CFX_RenderDevice* GetDevice() { + return m_pBitmapDevice ? m_pBitmapDevice.get() : m_pDevice; + } + CFX_Matrix* GetMatrix() { return &m_Matrix; } + void OutputToDevice(); + + private: + CFX_RenderDevice* m_pDevice; + CPDF_RenderContext* m_pContext; + FX_RECT m_Rect; + const CPDF_PageObject* m_pObject; + std::unique_ptr m_pBitmapDevice; + CFX_Matrix m_Matrix; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_SCALEDRENDERBUFFER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_textrenderer.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_textrenderer.cpp new file mode 100644 index 000000000000..95af863f7af7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_textrenderer.cpp @@ -0,0 +1,168 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_textrenderer.h" + +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/render/cpdf_charposlist.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" + +// static +bool CPDF_TextRenderer::DrawTextPath(CFX_RenderDevice* pDevice, + const std::vector& charCodes, + const std::vector& charPos, + CPDF_Font* pFont, + FX_FLOAT font_size, + const CFX_Matrix* pText2User, + const CFX_Matrix* pUser2Device, + const CFX_GraphStateData* pGraphState, + FX_ARGB fill_argb, + FX_ARGB stroke_argb, + CFX_PathData* pClippingPath, + int nFlag) { + CPDF_CharPosList CharPosList; + CharPosList.Load(charCodes, charPos, pFont, font_size); + if (CharPosList.m_nChars == 0) + return true; + + bool bDraw = true; + int32_t fontPosition = CharPosList.m_pCharPos[0].m_FallbackFontPosition; + uint32_t startIndex = 0; + for (uint32_t i = 0; i < CharPosList.m_nChars; i++) { + int32_t curFontPosition = CharPosList.m_pCharPos[i].m_FallbackFontPosition; + if (fontPosition == curFontPosition) + continue; + auto* font = fontPosition == -1 + ? &pFont->m_Font + : pFont->m_FontFallbacks[fontPosition].get(); + if (!pDevice->DrawTextPath(i - startIndex, + CharPosList.m_pCharPos + startIndex, font, + font_size, pText2User, pUser2Device, pGraphState, + fill_argb, stroke_argb, pClippingPath, nFlag)) { + bDraw = false; + } + fontPosition = curFontPosition; + startIndex = i; + } + auto* font = fontPosition == -1 ? &pFont->m_Font + : pFont->m_FontFallbacks[fontPosition].get(); + if (!pDevice->DrawTextPath(CharPosList.m_nChars - startIndex, + CharPosList.m_pCharPos + startIndex, font, + font_size, pText2User, pUser2Device, pGraphState, + fill_argb, stroke_argb, pClippingPath, nFlag)) { + bDraw = false; + } + return bDraw; +} + +// static +void CPDF_TextRenderer::DrawTextString(CFX_RenderDevice* pDevice, + FX_FLOAT origin_x, + FX_FLOAT origin_y, + CPDF_Font* pFont, + FX_FLOAT font_size, + const CFX_Matrix* pMatrix, + const CFX_ByteString& str, + FX_ARGB fill_argb, + const CFX_GraphStateData* pGraphState, + const CPDF_RenderOptions* pOptions) { + if (pFont->IsType3Font()) + return; + + int nChars = pFont->CountChar(str.c_str(), str.GetLength()); + if (nChars <= 0) + return; + + int offset = 0; + std::vector codes; + std::vector positions; + codes.resize(nChars); + positions.resize(nChars - 1); + FX_FLOAT cur_pos = 0; + for (int i = 0; i < nChars; i++) { + codes[i] = pFont->GetNextChar(str.c_str(), str.GetLength(), offset); + if (i) + positions[i - 1] = cur_pos; + cur_pos += pFont->GetCharWidthF(codes[i]) * font_size / 1000; + } + CFX_Matrix matrix; + if (pMatrix) + matrix = *pMatrix; + + matrix.e = origin_x; + matrix.f = origin_y; + + DrawNormalText(pDevice, codes, positions, pFont, font_size, &matrix, + fill_argb, pOptions); +} + +// static +bool CPDF_TextRenderer::DrawNormalText(CFX_RenderDevice* pDevice, + const std::vector& charCodes, + const std::vector& charPos, + CPDF_Font* pFont, + FX_FLOAT font_size, + const CFX_Matrix* pText2Device, + FX_ARGB fill_argb, + const CPDF_RenderOptions* pOptions) { + CPDF_CharPosList CharPosList; + CharPosList.Load(charCodes, charPos, pFont, font_size); + if (CharPosList.m_nChars == 0) + return true; + int FXGE_flags = 0; + if (pOptions) { + uint32_t dwFlags = pOptions->m_Flags; + if (dwFlags & RENDER_CLEARTYPE) { + FXGE_flags |= FXTEXT_CLEARTYPE; + if (dwFlags & RENDER_BGR_STRIPE) + FXGE_flags |= FXTEXT_BGR_STRIPE; + } + if (dwFlags & RENDER_NOTEXTSMOOTH) + FXGE_flags |= FXTEXT_NOSMOOTH; + if (dwFlags & RENDER_PRINTGRAPHICTEXT) + FXGE_flags |= FXTEXT_PRINTGRAPHICTEXT; + if (dwFlags & RENDER_NO_NATIVETEXT) + FXGE_flags |= FXTEXT_NO_NATIVETEXT; + if (dwFlags & RENDER_PRINTIMAGETEXT) + FXGE_flags |= FXTEXT_PRINTIMAGETEXT; + } else { + FXGE_flags = FXTEXT_CLEARTYPE; + } + if (pFont->IsCIDFont()) + FXGE_flags |= FXFONT_CIDFONT; + bool bDraw = true; + int32_t fontPosition = CharPosList.m_pCharPos[0].m_FallbackFontPosition; + uint32_t startIndex = 0; + for (uint32_t i = 0; i < CharPosList.m_nChars; i++) { + int32_t curFontPosition = CharPosList.m_pCharPos[i].m_FallbackFontPosition; + if (fontPosition == curFontPosition) + continue; + auto* font = fontPosition == -1 + ? &pFont->m_Font + : pFont->m_FontFallbacks[fontPosition].get(); + if (!pDevice->DrawNormalText( + i - startIndex, CharPosList.m_pCharPos + startIndex, font, + font_size, pText2Device, fill_argb, FXGE_flags)) { + bDraw = false; + } + fontPosition = curFontPosition; + startIndex = i; + } + auto* font = fontPosition == -1 ? &pFont->m_Font + : pFont->m_FontFallbacks[fontPosition].get(); + if (!pDevice->DrawNormalText(CharPosList.m_nChars - startIndex, + CharPosList.m_pCharPos + startIndex, font, + font_size, pText2Device, fill_argb, + FXGE_flags)) { + bDraw = false; + } + return bDraw; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_textrenderer.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_textrenderer.h new file mode 100644 index 000000000000..54e9d1bd054e --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_textrenderer.h @@ -0,0 +1,59 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_TEXTRENDERER_H_ +#define CORE_FPDFAPI_RENDER_CPDF_TEXTRENDERER_H_ + +#include + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxge/fx_dib.h" + +class CFX_RenderDevice; +class CFX_GraphStateData; +class CFX_PathData; +class CPDF_RenderOptions; +class CPDF_Font; + +class CPDF_TextRenderer { + public: + static void DrawTextString(CFX_RenderDevice* pDevice, + FX_FLOAT origin_x, + FX_FLOAT origin_y, + CPDF_Font* pFont, + FX_FLOAT font_size, + const CFX_Matrix* matrix, + const CFX_ByteString& str, + FX_ARGB fill_argb, + const CFX_GraphStateData* pGraphState, + const CPDF_RenderOptions* pOptions); + + static bool DrawTextPath(CFX_RenderDevice* pDevice, + const std::vector& charCodes, + const std::vector& charPos, + CPDF_Font* pFont, + FX_FLOAT font_size, + const CFX_Matrix* pText2User, + const CFX_Matrix* pUser2Device, + const CFX_GraphStateData* pGraphState, + FX_ARGB fill_argb, + FX_ARGB stroke_argb, + CFX_PathData* pClippingPath, + int nFlag); + + static bool DrawNormalText(CFX_RenderDevice* pDevice, + const std::vector& charCodes, + const std::vector& charPos, + CPDF_Font* pFont, + FX_FLOAT font_size, + const CFX_Matrix* pText2Device, + FX_ARGB fill_argb, + const CPDF_RenderOptions* pOptions); +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_TEXTRENDERER_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_transferfunc.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_transferfunc.cpp new file mode 100644 index 000000000000..be4836d20ab4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_transferfunc.cpp @@ -0,0 +1,25 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_transferfunc.h" + +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/render/cpdf_dibtransferfunc.h" + +CPDF_TransferFunc::CPDF_TransferFunc(CPDF_Document* pDoc) : m_pPDFDoc(pDoc) {} + +FX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF rgb) const { + return FXSYS_RGB(m_Samples[FXSYS_GetRValue(rgb)], + m_Samples[256 + FXSYS_GetGValue(rgb)], + m_Samples[512 + FXSYS_GetBValue(rgb)]); +} + +CFX_DIBSource* CPDF_TransferFunc::TranslateImage(const CFX_DIBSource* pSrc, + bool bAutoDropSrc) { + CPDF_DIBTransferFunc* pDest = new CPDF_DIBTransferFunc(this); + pDest->LoadSrc(pSrc, bAutoDropSrc); + return pDest; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_transferfunc.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_transferfunc.h new file mode 100644 index 000000000000..829b274d9b9e --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_transferfunc.h @@ -0,0 +1,26 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_TRANSFERFUNC_H_ +#define CORE_FPDFAPI_RENDER_CPDF_TRANSFERFUNC_H_ + +#include "core/fxge/fx_dib.h" + +class CPDF_Document; + +class CPDF_TransferFunc { + public: + explicit CPDF_TransferFunc(CPDF_Document* pDoc); + + FX_COLORREF TranslateColor(FX_COLORREF src) const; + CFX_DIBSource* TranslateImage(const CFX_DIBSource* pSrc, bool bAutoDropSrc); + + CPDF_Document* const m_pPDFDoc; + bool m_bIdentity; + uint8_t m_Samples[256 * 3]; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_TRANSFERFUNC_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3cache.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3cache.cpp new file mode 100644 index 000000000000..63cc780d1d43 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3cache.cpp @@ -0,0 +1,171 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_type3cache.h" + +#include +#include + +#include "core/fpdfapi/font/cpdf_type3char.h" +#include "core/fpdfapi/font/cpdf_type3font.h" +#include "core/fpdfapi/render/cpdf_type3glyphs.h" +#include "core/fxge/fx_dib.h" +#include "core/fxge/fx_font.h" + +namespace { + +struct CPDF_UniqueKeyGen { + void Generate(int count, ...); + FX_CHAR m_Key[128]; + int m_KeyLen; +}; + +void CPDF_UniqueKeyGen::Generate(int count, ...) { + va_list argList; + va_start(argList, count); + for (int i = 0; i < count; i++) { + int p = va_arg(argList, int); + (reinterpret_cast(m_Key))[i] = p; + } + va_end(argList); + m_KeyLen = count * sizeof(uint32_t); +} + +bool IsScanLine1bpp(uint8_t* pBuf, int width) { + int size = width / 8; + for (int i = 0; i < size; i++) { + if (pBuf[i]) + return true; + } + return (width % 8) && (pBuf[width / 8] & (0xff << (8 - width % 8))); +} + +bool IsScanLine8bpp(uint8_t* pBuf, int width) { + for (int i = 0; i < width; i++) { + if (pBuf[i] > 0x40) + return true; + } + return false; +} + +int DetectFirstLastScan(const CFX_DIBitmap* pBitmap, bool bFirst) { + int height = pBitmap->GetHeight(); + int pitch = pBitmap->GetPitch(); + int width = pBitmap->GetWidth(); + int bpp = pBitmap->GetBPP(); + if (bpp > 8) + width *= bpp / 8; + uint8_t* pBuf = pBitmap->GetBuffer(); + int line = bFirst ? 0 : height - 1; + int line_step = bFirst ? 1 : -1; + int line_end = bFirst ? height : -1; + while (line != line_end) { + if (bpp == 1) { + if (IsScanLine1bpp(pBuf + line * pitch, width)) + return line; + } else { + if (IsScanLine8bpp(pBuf + line * pitch, width)) + return line; + } + line += line_step; + } + return -1; +} + +} // namespace + +CPDF_Type3Cache::CPDF_Type3Cache(CPDF_Type3Font* pFont) : m_pFont(pFont) {} + +CPDF_Type3Cache::~CPDF_Type3Cache() { + for (const auto& pair : m_SizeMap) + delete pair.second; + m_SizeMap.clear(); +} + +CFX_GlyphBitmap* CPDF_Type3Cache::LoadGlyph(uint32_t charcode, + const CFX_Matrix* pMatrix, + FX_FLOAT retinaScaleX, + FX_FLOAT retinaScaleY) { + CPDF_UniqueKeyGen keygen; + keygen.Generate( + 4, FXSYS_round(pMatrix->a * 10000), FXSYS_round(pMatrix->b * 10000), + FXSYS_round(pMatrix->c * 10000), FXSYS_round(pMatrix->d * 10000)); + CFX_ByteString FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen); + CPDF_Type3Glyphs* pSizeCache; + auto it = m_SizeMap.find(FaceGlyphsKey); + if (it == m_SizeMap.end()) { + pSizeCache = new CPDF_Type3Glyphs; + m_SizeMap[FaceGlyphsKey] = pSizeCache; + } else { + pSizeCache = it->second; + } + auto it2 = pSizeCache->m_GlyphMap.find(charcode); + if (it2 != pSizeCache->m_GlyphMap.end()) + return it2->second; + + CFX_GlyphBitmap* pGlyphBitmap = + RenderGlyph(pSizeCache, charcode, pMatrix, retinaScaleX, retinaScaleY); + pSizeCache->m_GlyphMap[charcode] = pGlyphBitmap; + return pGlyphBitmap; +} + +CFX_GlyphBitmap* CPDF_Type3Cache::RenderGlyph(CPDF_Type3Glyphs* pSize, + uint32_t charcode, + const CFX_Matrix* pMatrix, + FX_FLOAT retinaScaleX, + FX_FLOAT retinaScaleY) { + const CPDF_Type3Char* pChar = m_pFont->LoadChar(charcode); + if (!pChar || !pChar->m_pBitmap) + return nullptr; + + CFX_DIBitmap* pBitmap = pChar->m_pBitmap.get(); + CFX_Matrix image_matrix = pChar->m_ImageMatrix; + CFX_Matrix text_matrix(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, 0, 0); + image_matrix.Concat(text_matrix); + + std::unique_ptr pResBitmap; + int left = 0; + int top = 0; + if (FXSYS_fabs(image_matrix.b) < FXSYS_fabs(image_matrix.a) / 100 && + FXSYS_fabs(image_matrix.c) < FXSYS_fabs(image_matrix.d) / 100) { + int top_line = DetectFirstLastScan(pBitmap, true); + int bottom_line = DetectFirstLastScan(pBitmap, false); + if (top_line == 0 && bottom_line == pBitmap->GetHeight() - 1) { + FX_FLOAT top_y = image_matrix.d + image_matrix.f; + FX_FLOAT bottom_y = image_matrix.f; + bool bFlipped = top_y > bottom_y; + if (bFlipped) { + FX_FLOAT temp = top_y; + top_y = bottom_y; + bottom_y = temp; + } + pSize->AdjustBlue(top_y, bottom_y, top_line, bottom_line); + pResBitmap = pBitmap->StretchTo( + (int)(FXSYS_round(image_matrix.a) * retinaScaleX), + (int)((bFlipped ? top_line - bottom_line : bottom_line - top_line) * + retinaScaleY)); + top = top_line; + if (image_matrix.a < 0) { + image_matrix.Scale(retinaScaleX, retinaScaleY); + left = FXSYS_round(image_matrix.e + image_matrix.a); + } else { + left = FXSYS_round(image_matrix.e); + } + } + } + if (!pResBitmap) { + image_matrix.Scale(retinaScaleX, retinaScaleY); + pResBitmap = pBitmap->TransformTo(&image_matrix, left, top); + } + if (!pResBitmap) + return nullptr; + + CFX_GlyphBitmap* pGlyph = new CFX_GlyphBitmap; + pGlyph->m_Left = left; + pGlyph->m_Top = -top; + pGlyph->m_Bitmap.TakeOver(pResBitmap.get()); + return pGlyph; +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3cache.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3cache.h new file mode 100644 index 000000000000..f74a43acc570 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3cache.h @@ -0,0 +1,40 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_TYPE3CACHE_H_ +#define CORE_FPDFAPI_RENDER_CPDF_TYPE3CACHE_H_ + +#include + +#include "core/fpdfapi/font/cpdf_type3font.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Type3Glyphs; + +class CPDF_Type3Cache { + public: + explicit CPDF_Type3Cache(CPDF_Type3Font* pFont); + ~CPDF_Type3Cache(); + + CFX_GlyphBitmap* LoadGlyph(uint32_t charcode, + const CFX_Matrix* pMatrix, + FX_FLOAT retinaScaleX, + FX_FLOAT retinaScaleY); + + private: + CFX_GlyphBitmap* RenderGlyph(CPDF_Type3Glyphs* pSize, + uint32_t charcode, + const CFX_Matrix* pMatrix, + FX_FLOAT retinaScaleX, + FX_FLOAT retinaScaleY); + + CPDF_Type3Font* const m_pFont; + std::map m_SizeMap; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_TYPE3CACHE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3glyphs.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3glyphs.cpp new file mode 100644 index 000000000000..189fc2439d78 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3glyphs.cpp @@ -0,0 +1,46 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/render/cpdf_type3glyphs.h" + +#include + +#include "core/fxge/fx_font.h" + +CPDF_Type3Glyphs::CPDF_Type3Glyphs() + : m_TopBlueCount(0), m_BottomBlueCount(0) {} + +CPDF_Type3Glyphs::~CPDF_Type3Glyphs() { + for (const auto& pair : m_GlyphMap) + delete pair.second; +} + +static int _AdjustBlue(FX_FLOAT pos, int& count, int blues[]) { + FX_FLOAT min_distance = 1000000.0f; + int closest_pos = -1; + for (int i = 0; i < count; i++) { + FX_FLOAT distance = FXSYS_fabs(pos - static_cast(blues[i])); + if (distance < 1.0f * 80.0f / 100.0f && distance < min_distance) { + min_distance = distance; + closest_pos = i; + } + } + if (closest_pos >= 0) + return blues[closest_pos]; + int new_pos = FXSYS_round(pos); + if (count == TYPE3_MAX_BLUES) + return new_pos; + blues[count++] = new_pos; + return new_pos; +} + +void CPDF_Type3Glyphs::AdjustBlue(FX_FLOAT top, + FX_FLOAT bottom, + int& top_line, + int& bottom_line) { + top_line = _AdjustBlue(top, m_TopBlueCount, m_TopBlue); + bottom_line = _AdjustBlue(bottom, m_BottomBlueCount, m_BottomBlue); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3glyphs.h b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3glyphs.h new file mode 100644 index 000000000000..00814d5b3bfa --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/cpdf_type3glyphs.h @@ -0,0 +1,35 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFAPI_RENDER_CPDF_TYPE3GLYPHS_H_ +#define CORE_FPDFAPI_RENDER_CPDF_TYPE3GLYPHS_H_ + +#include + +#include "core/fxcrt/fx_system.h" + +class CFX_GlyphBitmap; + +#define TYPE3_MAX_BLUES 16 + +class CPDF_Type3Glyphs { + public: + CPDF_Type3Glyphs(); + ~CPDF_Type3Glyphs(); + + void AdjustBlue(FX_FLOAT top, + FX_FLOAT bottom, + int& top_line, + int& bottom_line); + + std::map m_GlyphMap; + int m_TopBlue[TYPE3_MAX_BLUES]; + int m_BottomBlue[TYPE3_MAX_BLUES]; + int m_TopBlueCount; + int m_BottomBlueCount; +}; + +#endif // CORE_FPDFAPI_RENDER_CPDF_TYPE3GLYPHS_H_ diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp new file mode 100644 index 000000000000..5b7cbc6f0598 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp @@ -0,0 +1,42 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +class FPDFRenderLoadImageEmbeddertest : public EmbedderTest {}; + +TEST_F(FPDFRenderLoadImageEmbeddertest, Bug_554151) { + // Test scanline downsampling with a BitsPerComponent of 4. + // Should not crash. + EXPECT_TRUE(OpenDocument("bug_554151.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_NE(nullptr, page); + FPDF_BITMAP bitmap = RenderPage(page); + CompareBitmap(bitmap, 612, 792, "a14d7ee573c1b2456d7bf6b7762823cf"); + FPDFBitmap_Destroy(bitmap); + UnloadPage(page); +} + +TEST_F(FPDFRenderLoadImageEmbeddertest, Bug_557223) { + // Should not crash + EXPECT_TRUE(OpenDocument("bug_557223.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_NE(nullptr, page); + FPDF_BITMAP bitmap = RenderPage(page); + CompareBitmap(bitmap, 24, 24, "dc0ea1b743c2edb22c597cadc8537f7b"); + FPDFBitmap_Destroy(bitmap); + UnloadPage(page); +} + +TEST_F(FPDFRenderLoadImageEmbeddertest, Bug_603518) { + // Should not crash + EXPECT_TRUE(OpenDocument("bug_603518.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_NE(nullptr, page); + FPDF_BITMAP bitmap = RenderPage(page); + CompareBitmap(bitmap, 749, 749, "b9e75190cdc5edf0069a408744ca07dc"); + FPDFBitmap_Destroy(bitmap); + UnloadPage(page); +} diff --git a/modules/pdfium/pdfium/core/fpdfapi/render/fpdf_render_pattern_embeddertest.cpp b/modules/pdfium/pdfium/core/fpdfapi/render/fpdf_render_pattern_embeddertest.cpp new file mode 100644 index 000000000000..ed6da46f2ade --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfapi/render/fpdf_render_pattern_embeddertest.cpp @@ -0,0 +1,18 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +class FPDFRenderPatternEmbeddertest : public EmbedderTest {}; + +TEST_F(FPDFRenderPatternEmbeddertest, LoadError_547706) { + // Test shading where object is a dictionary instead of a stream. + EXPECT_TRUE(OpenDocument("bug_547706.pdf")); + FPDF_PAGE page = LoadPage(0); + FPDF_BITMAP bitmap = RenderPage(page); + CompareBitmap(bitmap, 612, 792, "1940568c9ba33bac5d0b1ee9558c76b3"); + FPDFBitmap_Destroy(bitmap); + UnloadPage(page); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cline.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cline.cpp new file mode 100644 index 000000000000..2e8477cfe721 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cline.cpp @@ -0,0 +1,38 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cline.h" + +CLine::CLine() {} + +CLine::~CLine() {} + +CPVT_WordPlace CLine::GetBeginWordPlace() const { + return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, -1); +} + +CPVT_WordPlace CLine::GetEndWordPlace() const { + return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, + m_LineInfo.nEndWordIndex); +} + +CPVT_WordPlace CLine::GetPrevWordPlace(const CPVT_WordPlace& place) const { + if (place.nWordIndex > m_LineInfo.nEndWordIndex) { + return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, + m_LineInfo.nEndWordIndex); + } + return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, + place.nWordIndex - 1); +} + +CPVT_WordPlace CLine::GetNextWordPlace(const CPVT_WordPlace& place) const { + if (place.nWordIndex < m_LineInfo.nBeginWordIndex) { + return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, + m_LineInfo.nBeginWordIndex); + } + return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, + place.nWordIndex + 1); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cline.h b/modules/pdfium/pdfium/core/fpdfdoc/cline.h new file mode 100644 index 000000000000..6f95beb546eb --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cline.h @@ -0,0 +1,26 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CLINE_H_ +#define CORE_FPDFDOC_CLINE_H_ + +#include "core/fpdfdoc/cpvt_lineinfo.h" +#include "core/fpdfdoc/cpvt_wordplace.h" + +class CLine final { + public: + CLine(); + ~CLine(); + + CPVT_WordPlace GetBeginWordPlace() const; + CPVT_WordPlace GetEndWordPlace() const; + CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const; + CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace& place) const; + CPVT_WordPlace LinePlace; + CPVT_LineInfo m_LineInfo; +}; + +#endif // CORE_FPDFDOC_CLINE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/clines.cpp b/modules/pdfium/pdfium/core/fpdfdoc/clines.cpp new file mode 100644 index 000000000000..1e425eab932b --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/clines.cpp @@ -0,0 +1,52 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/clines.h" + +#include "core/fpdfdoc/cline.h" + +CLines::CLines() : m_nTotal(0) {} + +CLines::~CLines() { + RemoveAll(); +} + +int32_t CLines::GetSize() const { + return m_Lines.GetSize(); +} + +CLine* CLines::GetAt(int32_t nIndex) const { + return m_Lines.GetAt(nIndex); +} + +void CLines::Empty() { + m_nTotal = 0; +} + +void CLines::RemoveAll() { + for (int32_t i = 0, sz = GetSize(); i < sz; i++) + delete GetAt(i); + m_Lines.RemoveAll(); + m_nTotal = 0; +} + +int32_t CLines::Add(const CPVT_LineInfo& lineinfo) { + if (m_nTotal >= GetSize()) { + CLine* pLine = new CLine; + pLine->m_LineInfo = lineinfo; + m_Lines.Add(pLine); + } else if (CLine* pLine = GetAt(m_nTotal)) { + pLine->m_LineInfo = lineinfo; + } + return m_nTotal++; +} + +void CLines::Clear() { + for (int32_t i = GetSize() - 1; i >= m_nTotal; i--) { + delete GetAt(i); + m_Lines.RemoveAt(i); + } +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/clines.h b/modules/pdfium/pdfium/core/fpdfdoc/clines.h new file mode 100644 index 000000000000..b4db0e39666d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/clines.h @@ -0,0 +1,35 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CLINES_H_ +#define CORE_FPDFDOC_CLINES_H_ + +#include + +#include "core/fpdfdoc/cpvt_arraytemplate.h" +#include "core/fpdfdoc/cpvt_lineinfo.h" + +class CLine; + +class CLines final { + public: + CLines(); + ~CLines(); + + int32_t GetSize() const; + CLine* GetAt(int32_t nIndex) const; + + void Empty(); + void RemoveAll(); + int32_t Add(const CPVT_LineInfo& lineinfo); + void Clear(); + + private: + CPVT_ArrayTemplate m_Lines; + int32_t m_nTotal; +}; + +#endif // CORE_FPDFDOC_CLINES_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_aaction.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_aaction.cpp new file mode 100644 index 000000000000..39120fcdb333 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_aaction.cpp @@ -0,0 +1,24 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_aaction.h" + +namespace { + +const FX_CHAR* g_sAATypes[] = {"E", "X", "D", "U", "Fo", "Bl", "PO", "PC", + "PV", "PI", "O", "C", "K", "F", "V", "C", + "WC", "WS", "DS", "WP", "DP", ""}; + +} // namespace + +bool CPDF_AAction::ActionExist(AActionType eType) const { + return m_pDict && m_pDict->KeyExist(g_sAATypes[eType]); +} + +CPDF_Action CPDF_AAction::GetAction(AActionType eType) const { + return m_pDict ? CPDF_Action(m_pDict->GetDictFor(g_sAATypes[eType])) + : CPDF_Action(); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_aaction.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_aaction.h new file mode 100644 index 000000000000..d615915ee348 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_aaction.h @@ -0,0 +1,51 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_AACTION_H_ +#define CORE_FPDFDOC_CPDF_AACTION_H_ + +#include "core/fpdfdoc/cpdf_action.h" + +class CPDF_Dictionary; + +class CPDF_AAction { + public: + enum AActionType { + CursorEnter = 0, + CursorExit, + ButtonDown, + ButtonUp, + GetFocus, + LoseFocus, + PageOpen, + PageClose, + PageVisible, + PageInvisible, + OpenPage, + ClosePage, + KeyStroke, + Format, + Validate, + Calculate, + CloseDocument, + SaveDocument, + DocumentSaved, + PrintDocument, + DocumentPrinted + }; + + CPDF_AAction() : m_pDict(nullptr) {} + explicit CPDF_AAction(CPDF_Dictionary* pDict) : m_pDict(pDict) {} + + bool ActionExist(AActionType eType) const; + CPDF_Action GetAction(AActionType eType) const; + CPDF_Dictionary* GetDict() const { return m_pDict; } + + private: + CPDF_Dictionary* const m_pDict; +}; + +#endif // CORE_FPDFDOC_CPDF_AACTION_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_action.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_action.cpp new file mode 100644 index 000000000000..dabc0bb10280 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_action.cpp @@ -0,0 +1,137 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_action.h" + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfdoc/cpdf_filespec.h" +#include "core/fpdfdoc/cpdf_nametree.h" + +namespace { + +const FX_CHAR* const g_sATypes[] = { + "Unknown", "GoTo", "GoToR", "GoToE", "Launch", + "Thread", "URI", "Sound", "Movie", "Hide", + "Named", "SubmitForm", "ResetForm", "ImportData", "JavaScript", + "SetOCGState", "Rendition", "Trans", "GoTo3DView", nullptr}; + +} // namespace + +CPDF_Dest CPDF_Action::GetDest(CPDF_Document* pDoc) const { + if (!m_pDict) + return CPDF_Dest(); + + CFX_ByteString type = m_pDict->GetStringFor("S"); + if (type != "GoTo" && type != "GoToR") + return CPDF_Dest(); + + CPDF_Object* pDest = m_pDict->GetDirectObjectFor("D"); + if (!pDest) + return CPDF_Dest(); + if (pDest->IsString() || pDest->IsName()) { + CPDF_NameTree name_tree(pDoc, "Dests"); + return CPDF_Dest(name_tree.LookupNamedDest(pDoc, pDest->GetString())); + } + if (CPDF_Array* pArray = pDest->AsArray()) + return CPDF_Dest(pArray); + + return CPDF_Dest(); +} + +CPDF_Action::ActionType CPDF_Action::GetType() const { + if (!m_pDict) + return Unknown; + + CFX_ByteString csType = m_pDict->GetStringFor("S"); + if (csType.IsEmpty()) + return Unknown; + + for (int i = 0; g_sATypes[i]; ++i) { + if (csType == g_sATypes[i]) + return static_cast(i); + } + return Unknown; +} + +CFX_WideString CPDF_Action::GetFilePath() const { + CFX_ByteString type = m_pDict->GetStringFor("S"); + if (type != "GoToR" && type != "Launch" && type != "SubmitForm" && + type != "ImportData") { + return CFX_WideString(); + } + + CPDF_Object* pFile = m_pDict->GetDirectObjectFor("F"); + CFX_WideString path; + if (!pFile) { + if (type == "Launch") { + CPDF_Dictionary* pWinDict = m_pDict->GetDictFor("Win"); + if (pWinDict) { + return CFX_WideString::FromLocal( + pWinDict->GetStringFor("F").AsStringC()); + } + } + return path; + } + + CPDF_FileSpec filespec(pFile); + filespec.GetFileName(&path); + return path; +} + +CFX_ByteString CPDF_Action::GetURI(CPDF_Document* pDoc) const { + CFX_ByteString csURI; + if (!m_pDict) + return csURI; + if (m_pDict->GetStringFor("S") != "URI") + return csURI; + + csURI = m_pDict->GetStringFor("URI"); + CPDF_Dictionary* pRoot = pDoc->GetRoot(); + CPDF_Dictionary* pURI = pRoot->GetDictFor("URI"); + if (pURI) { + if (csURI.Find(":", 0) < 1) + csURI = pURI->GetStringFor("Base") + csURI; + } + return csURI; +} + +CFX_WideString CPDF_Action::GetJavaScript() const { + CFX_WideString csJS; + if (!m_pDict) + return csJS; + + CPDF_Object* pJS = m_pDict->GetDirectObjectFor("JS"); + return pJS ? pJS->GetUnicodeText() : csJS; +} + +size_t CPDF_Action::GetSubActionsCount() const { + if (!m_pDict || !m_pDict->KeyExist("Next")) + return 0; + + CPDF_Object* pNext = m_pDict->GetDirectObjectFor("Next"); + if (!pNext) + return 0; + if (pNext->IsDictionary()) + return 1; + if (CPDF_Array* pArray = pNext->AsArray()) + return pArray->GetCount(); + return 0; +} + +CPDF_Action CPDF_Action::GetSubAction(size_t iIndex) const { + if (!m_pDict || !m_pDict->KeyExist("Next")) + return CPDF_Action(); + + CPDF_Object* pNext = m_pDict->GetDirectObjectFor("Next"); + if (CPDF_Dictionary* pDict = ToDictionary(pNext)) { + if (iIndex == 0) + return CPDF_Action(pDict); + } else if (CPDF_Array* pArray = ToArray(pNext)) { + return CPDF_Action(pArray->GetDictAt(iIndex)); + } + return CPDF_Action(); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_action.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_action.h new file mode 100644 index 000000000000..426edb12e93c --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_action.h @@ -0,0 +1,59 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_ACTION_H_ +#define CORE_FPDFDOC_CPDF_ACTION_H_ + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfdoc/cpdf_dest.h" +#include "core/fxcrt/fx_string.h" + +class CPDF_Document; + +class CPDF_Action { + public: + enum ActionType { + Unknown = 0, + GoTo, + GoToR, + GoToE, + Launch, + Thread, + URI, + Sound, + Movie, + Hide, + Named, + SubmitForm, + ResetForm, + ImportData, + JavaScript, + SetOCGState, + Rendition, + Trans, + GoTo3DView + }; + + CPDF_Action() : m_pDict(nullptr) {} + explicit CPDF_Action(CPDF_Dictionary* pDict) : m_pDict(pDict) {} + + CPDF_Dictionary* GetDict() const { return m_pDict; } + ActionType GetType() const; + CPDF_Dest GetDest(CPDF_Document* pDoc) const; + CFX_WideString GetFilePath() const; + CFX_ByteString GetURI(CPDF_Document* pDoc) const; + bool GetHideStatus() const { return m_pDict->GetBooleanFor("H", true); } + CFX_ByteString GetNamedAction() const { return m_pDict->GetStringFor("N"); } + uint32_t GetFlags() const { return m_pDict->GetIntegerFor("Flags"); } + CFX_WideString GetJavaScript() const; + size_t GetSubActionsCount() const; + CPDF_Action GetSubAction(size_t iIndex) const; + + private: + CPDF_Dictionary* const m_pDict; +}; + +#endif // CORE_FPDFDOC_CPDF_ACTION_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_actionfields.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_actionfields.cpp new file mode 100644 index 000000000000..35ec92c1b870 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_actionfields.cpp @@ -0,0 +1,96 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_actionfields.h" + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfdoc/cpdf_action.h" + +size_t CPDF_ActionFields::GetFieldsCount() const { + if (!m_pAction) + return 0; + + CPDF_Dictionary* pDict = m_pAction->GetDict(); + if (!pDict) + return 0; + + CFX_ByteString csType = pDict->GetStringFor("S"); + CPDF_Object* pFields = nullptr; + if (csType == "Hide") + pFields = pDict->GetDirectObjectFor("T"); + else + pFields = pDict->GetArrayFor("Fields"); + + if (!pFields) + return 0; + if (pFields->IsDictionary()) + return 1; + if (pFields->IsString()) + return 1; + if (CPDF_Array* pArray = pFields->AsArray()) + return pArray->GetCount(); + return 0; +} + +std::vector CPDF_ActionFields::GetAllFields() const { + std::vector fields; + if (!m_pAction) + return fields; + + CPDF_Dictionary* pDict = m_pAction->GetDict(); + if (!pDict) + return fields; + + CFX_ByteString csType = pDict->GetStringFor("S"); + CPDF_Object* pFields; + if (csType == "Hide") + pFields = pDict->GetDirectObjectFor("T"); + else + pFields = pDict->GetArrayFor("Fields"); + + if (!pFields) + return fields; + + if (pFields->IsDictionary() || pFields->IsString()) { + fields.push_back(pFields); + } else if (CPDF_Array* pArray = pFields->AsArray()) { + for (size_t i = 0; i < pArray->GetCount(); ++i) { + CPDF_Object* pObj = pArray->GetDirectObjectAt(i); + if (pObj) + fields.push_back(pObj); + } + } + return fields; +} + +CPDF_Object* CPDF_ActionFields::GetField(size_t iIndex) const { + if (!m_pAction) + return nullptr; + + CPDF_Dictionary* pDict = m_pAction->GetDict(); + if (!pDict) + return nullptr; + + CFX_ByteString csType = pDict->GetStringFor("S"); + CPDF_Object* pFields = nullptr; + if (csType == "Hide") + pFields = pDict->GetDirectObjectFor("T"); + else + pFields = pDict->GetArrayFor("Fields"); + + if (!pFields) + return nullptr; + + CPDF_Object* pFindObj = nullptr; + if (pFields->IsDictionary() || pFields->IsString()) { + if (iIndex == 0) + pFindObj = pFields; + } else if (CPDF_Array* pArray = pFields->AsArray()) { + pFindObj = pArray->GetDirectObjectAt(iIndex); + } + return pFindObj; +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_actionfields.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_actionfields.h new file mode 100644 index 000000000000..9e0664cadb56 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_actionfields.h @@ -0,0 +1,29 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_ACTIONFIELDS_H_ +#define CORE_FPDFDOC_CPDF_ACTIONFIELDS_H_ + +#include + +#include + +class CPDF_Action; +class CPDF_Object; + +class CPDF_ActionFields { + public: + explicit CPDF_ActionFields(const CPDF_Action* pAction) : m_pAction(pAction) {} + + size_t GetFieldsCount() const; + std::vector GetAllFields() const; + CPDF_Object* GetField(size_t iIndex) const; + + private: + const CPDF_Action* const m_pAction; +}; + +#endif // CORE_FPDFDOC_CPDF_ACTIONFIELDS_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_annot.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_annot.cpp new file mode 100644 index 000000000000..89c4785d982a --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_annot.cpp @@ -0,0 +1,507 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_annot.h" + +#include + +#include "core/fpdfapi/page/cpdf_form.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_boolean.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/render/cpdf_rendercontext.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fpdfdoc/cpvt_generateap.h" +#include "core/fxcrt/fx_memory.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "third_party/base/ptr_util.h" + +namespace { + +char kPDFiumKey_HasGeneratedAP[] = "PDFIUM_HasGeneratedAP"; + +bool IsTextMarkupAnnotation(CPDF_Annot::Subtype type) { + return type == CPDF_Annot::Subtype::HIGHLIGHT || + type == CPDF_Annot::Subtype::SQUIGGLY || + type == CPDF_Annot::Subtype::STRIKEOUT || + type == CPDF_Annot::Subtype::UNDERLINE; +} + +bool ShouldGenerateAPForAnnotation(CPDF_Dictionary* pAnnotDict) { + // If AP dictionary exists, we use the appearance defined in the + // existing AP dictionary. + if (pAnnotDict->KeyExist("AP")) + return false; + + return !CPDF_Annot::IsAnnotationHidden(pAnnotDict); +} + +CPDF_Form* AnnotGetMatrix(const CPDF_Page* pPage, + CPDF_Annot* pAnnot, + CPDF_Annot::AppearanceMode mode, + const CFX_Matrix* pUser2Device, + CFX_Matrix* matrix) { + CPDF_Form* pForm = pAnnot->GetAPForm(pPage, mode); + if (!pForm) + return nullptr; + + CFX_FloatRect form_bbox = pForm->m_pFormDict->GetRectFor("BBox"); + CFX_Matrix form_matrix = pForm->m_pFormDict->GetMatrixFor("Matrix"); + form_matrix.TransformRect(form_bbox); + matrix->MatchRect(pAnnot->GetRect(), form_bbox); + matrix->Concat(*pUser2Device); + return pForm; +} + +} // namespace + +CPDF_Annot::CPDF_Annot(std::unique_ptr pDict, + CPDF_Document* pDocument) + : m_pAnnotDict(std::move(pDict)), m_pDocument(pDocument) { + Init(); +} + +CPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict, CPDF_Document* pDocument) + : m_pAnnotDict(pDict), m_pDocument(pDocument) { + Init(); +} + +CPDF_Annot::~CPDF_Annot() { + ClearCachedAP(); +} + +void CPDF_Annot::Init() { + m_nSubtype = StringToAnnotSubtype(m_pAnnotDict->GetStringFor("Subtype")); + m_bIsTextMarkupAnnotation = IsTextMarkupAnnotation(m_nSubtype); + m_bHasGeneratedAP = m_pAnnotDict->GetBooleanFor(kPDFiumKey_HasGeneratedAP); + GenerateAPIfNeeded(); +} + +void CPDF_Annot::GenerateAPIfNeeded() { + if (!ShouldGenerateAPForAnnotation(m_pAnnotDict.Get())) + return; + + CPDF_Dictionary* pDict = m_pAnnotDict.Get(); + bool result = false; + if (m_nSubtype == CPDF_Annot::Subtype::CIRCLE) + result = CPVT_GenerateAP::GenerateCircleAP(m_pDocument, pDict); + else if (m_nSubtype == CPDF_Annot::Subtype::HIGHLIGHT) + result = CPVT_GenerateAP::GenerateHighlightAP(m_pDocument, pDict); + else if (m_nSubtype == CPDF_Annot::Subtype::INK) + result = CPVT_GenerateAP::GenerateInkAP(m_pDocument, pDict); + else if (m_nSubtype == CPDF_Annot::Subtype::POPUP) + result = CPVT_GenerateAP::GeneratePopupAP(m_pDocument, pDict); + else if (m_nSubtype == CPDF_Annot::Subtype::SQUARE) + result = CPVT_GenerateAP::GenerateSquareAP(m_pDocument, pDict); + else if (m_nSubtype == CPDF_Annot::Subtype::SQUIGGLY) + result = CPVT_GenerateAP::GenerateSquigglyAP(m_pDocument, pDict); + else if (m_nSubtype == CPDF_Annot::Subtype::STRIKEOUT) + result = CPVT_GenerateAP::GenerateStrikeOutAP(m_pDocument, pDict); + else if (m_nSubtype == CPDF_Annot::Subtype::TEXT) + result = CPVT_GenerateAP::GenerateTextAP(m_pDocument, pDict); + else if (m_nSubtype == CPDF_Annot::Subtype::UNDERLINE) + result = CPVT_GenerateAP::GenerateUnderlineAP(m_pDocument, pDict); + + if (result) { + m_pAnnotDict->SetNewFor(kPDFiumKey_HasGeneratedAP, result); + m_bHasGeneratedAP = result; + } +} + +bool CPDF_Annot::ShouldDrawAnnotation() { + if (IsAnnotationHidden(m_pAnnotDict.Get())) + return false; + + if (m_nSubtype == CPDF_Annot::Subtype::POPUP && !m_bOpenState) + return false; + + return true; +} + +void CPDF_Annot::ClearCachedAP() { + m_APMap.clear(); +} + +CPDF_Annot::Subtype CPDF_Annot::GetSubtype() const { + return m_nSubtype; +} + +CFX_FloatRect CPDF_Annot::RectForDrawing() const { + if (!m_pAnnotDict) + return CFX_FloatRect(); + + bool bShouldUseQuadPointsCoords = + m_bIsTextMarkupAnnotation && m_bHasGeneratedAP; + if (bShouldUseQuadPointsCoords) + return RectFromQuadPoints(m_pAnnotDict.Get()); + + return m_pAnnotDict->GetRectFor("Rect"); +} + +CFX_FloatRect CPDF_Annot::GetRect() const { + if (!m_pAnnotDict) + return CFX_FloatRect(); + + CFX_FloatRect rect = RectForDrawing(); + rect.Normalize(); + return rect; +} + +uint32_t CPDF_Annot::GetFlags() const { + return m_pAnnotDict->GetIntegerFor("F"); +} + +CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, + CPDF_Annot::AppearanceMode mode) { + CPDF_Dictionary* pAP = pAnnotDict->GetDictFor("AP"); + if (!pAP) { + return nullptr; + } + const FX_CHAR* ap_entry = "N"; + if (mode == CPDF_Annot::Down) + ap_entry = "D"; + else if (mode == CPDF_Annot::Rollover) + ap_entry = "R"; + if (!pAP->KeyExist(ap_entry)) + ap_entry = "N"; + + CPDF_Object* psub = pAP->GetDirectObjectFor(ap_entry); + if (!psub) + return nullptr; + if (CPDF_Stream* pStream = psub->AsStream()) + return pStream; + + if (CPDF_Dictionary* pDict = psub->AsDictionary()) { + CFX_ByteString as = pAnnotDict->GetStringFor("AS"); + if (as.IsEmpty()) { + CFX_ByteString value = pAnnotDict->GetStringFor("V"); + if (value.IsEmpty()) { + CPDF_Dictionary* pParentDict = pAnnotDict->GetDictFor("Parent"); + value = pParentDict ? pParentDict->GetStringFor("V") : CFX_ByteString(); + } + if (value.IsEmpty() || !pDict->KeyExist(value)) + as = "Off"; + else + as = value; + } + return pDict->GetStreamFor(as); + } + return nullptr; +} + +CPDF_Form* CPDF_Annot::GetAPForm(const CPDF_Page* pPage, AppearanceMode mode) { + CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pAnnotDict.Get(), mode); + if (!pStream) + return nullptr; + + auto it = m_APMap.find(pStream); + if (it != m_APMap.end()) + return it->second.get(); + + auto pNewForm = + pdfium::MakeUnique(m_pDocument, pPage->m_pResources, pStream); + pNewForm->ParseContent(nullptr, nullptr, nullptr); + + CPDF_Form* pResult = pNewForm.get(); + m_APMap[pStream] = std::move(pNewForm); + return pResult; +} + +// Static. +CFX_FloatRect CPDF_Annot::RectFromQuadPoints(CPDF_Dictionary* pAnnotDict) { + CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints"); + if (!pArray) + return CFX_FloatRect(); + + // QuadPoints are defined with 4 pairs of numbers + // ([ pair0, pair1, pair2, pair3 ]), where + // pair0 = top_left + // pair1 = top_right + // pair2 = bottom_left + // pair3 = bottom_right + // + // On the other hand, /Rect is define as 2 pairs [pair0, pair1] where: + // pair0 = bottom_left + // pair1 = top_right. + return CFX_FloatRect(pArray->GetNumberAt(4), pArray->GetNumberAt(5), + pArray->GetNumberAt(2), pArray->GetNumberAt(3)); +} + +// Static. +bool CPDF_Annot::IsAnnotationHidden(CPDF_Dictionary* pAnnotDict) { + return !!(pAnnotDict->GetIntegerFor("F") & ANNOTFLAG_HIDDEN); +} + +// Static. +CPDF_Annot::Subtype CPDF_Annot::StringToAnnotSubtype( + const CFX_ByteString& sSubtype) { + if (sSubtype == "Text") + return CPDF_Annot::Subtype::TEXT; + if (sSubtype == "Link") + return CPDF_Annot::Subtype::LINK; + if (sSubtype == "FreeText") + return CPDF_Annot::Subtype::FREETEXT; + if (sSubtype == "Line") + return CPDF_Annot::Subtype::LINE; + if (sSubtype == "Square") + return CPDF_Annot::Subtype::SQUARE; + if (sSubtype == "Circle") + return CPDF_Annot::Subtype::CIRCLE; + if (sSubtype == "Polygon") + return CPDF_Annot::Subtype::POLYGON; + if (sSubtype == "PolyLine") + return CPDF_Annot::Subtype::POLYLINE; + if (sSubtype == "Highlight") + return CPDF_Annot::Subtype::HIGHLIGHT; + if (sSubtype == "Underline") + return CPDF_Annot::Subtype::UNDERLINE; + if (sSubtype == "Squiggly") + return CPDF_Annot::Subtype::SQUIGGLY; + if (sSubtype == "StrikeOut") + return CPDF_Annot::Subtype::STRIKEOUT; + if (sSubtype == "Stamp") + return CPDF_Annot::Subtype::STAMP; + if (sSubtype == "Caret") + return CPDF_Annot::Subtype::CARET; + if (sSubtype == "Ink") + return CPDF_Annot::Subtype::INK; + if (sSubtype == "Popup") + return CPDF_Annot::Subtype::POPUP; + if (sSubtype == "FileAttachment") + return CPDF_Annot::Subtype::FILEATTACHMENT; + if (sSubtype == "Sound") + return CPDF_Annot::Subtype::SOUND; + if (sSubtype == "Movie") + return CPDF_Annot::Subtype::MOVIE; + if (sSubtype == "Widget") + return CPDF_Annot::Subtype::WIDGET; + if (sSubtype == "Screen") + return CPDF_Annot::Subtype::SCREEN; + if (sSubtype == "PrinterMark") + return CPDF_Annot::Subtype::PRINTERMARK; + if (sSubtype == "TrapNet") + return CPDF_Annot::Subtype::TRAPNET; + if (sSubtype == "Watermark") + return CPDF_Annot::Subtype::WATERMARK; + if (sSubtype == "3D") + return CPDF_Annot::Subtype::THREED; + if (sSubtype == "RichMedia") + return CPDF_Annot::Subtype::RICHMEDIA; + if (sSubtype == "XFAWidget") + return CPDF_Annot::Subtype::XFAWIDGET; + return CPDF_Annot::Subtype::UNKNOWN; +} + +// Static. +CFX_ByteString CPDF_Annot::AnnotSubtypeToString(CPDF_Annot::Subtype nSubtype) { + if (nSubtype == CPDF_Annot::Subtype::TEXT) + return "Text"; + if (nSubtype == CPDF_Annot::Subtype::LINK) + return "Link"; + if (nSubtype == CPDF_Annot::Subtype::FREETEXT) + return "FreeText"; + if (nSubtype == CPDF_Annot::Subtype::LINE) + return "Line"; + if (nSubtype == CPDF_Annot::Subtype::SQUARE) + return "Square"; + if (nSubtype == CPDF_Annot::Subtype::CIRCLE) + return "Circle"; + if (nSubtype == CPDF_Annot::Subtype::POLYGON) + return "Polygon"; + if (nSubtype == CPDF_Annot::Subtype::POLYLINE) + return "PolyLine"; + if (nSubtype == CPDF_Annot::Subtype::HIGHLIGHT) + return "Highlight"; + if (nSubtype == CPDF_Annot::Subtype::UNDERLINE) + return "Underline"; + if (nSubtype == CPDF_Annot::Subtype::SQUIGGLY) + return "Squiggly"; + if (nSubtype == CPDF_Annot::Subtype::STRIKEOUT) + return "StrikeOut"; + if (nSubtype == CPDF_Annot::Subtype::STAMP) + return "Stamp"; + if (nSubtype == CPDF_Annot::Subtype::CARET) + return "Caret"; + if (nSubtype == CPDF_Annot::Subtype::INK) + return "Ink"; + if (nSubtype == CPDF_Annot::Subtype::POPUP) + return "Popup"; + if (nSubtype == CPDF_Annot::Subtype::FILEATTACHMENT) + return "FileAttachment"; + if (nSubtype == CPDF_Annot::Subtype::SOUND) + return "Sound"; + if (nSubtype == CPDF_Annot::Subtype::MOVIE) + return "Movie"; + if (nSubtype == CPDF_Annot::Subtype::WIDGET) + return "Widget"; + if (nSubtype == CPDF_Annot::Subtype::SCREEN) + return "Screen"; + if (nSubtype == CPDF_Annot::Subtype::PRINTERMARK) + return "PrinterMark"; + if (nSubtype == CPDF_Annot::Subtype::TRAPNET) + return "TrapNet"; + if (nSubtype == CPDF_Annot::Subtype::WATERMARK) + return "Watermark"; + if (nSubtype == CPDF_Annot::Subtype::THREED) + return "3D"; + if (nSubtype == CPDF_Annot::Subtype::RICHMEDIA) + return "RichMedia"; + if (nSubtype == CPDF_Annot::Subtype::XFAWIDGET) + return "XFAWidget"; + return ""; +} + +bool CPDF_Annot::DrawAppearance(CPDF_Page* pPage, + CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + AppearanceMode mode, + const CPDF_RenderOptions* pOptions) { + if (!ShouldDrawAnnotation()) + return false; + + // It might happen that by the time this annotation instance was created, + // it was flagged as "hidden" (e.g. /F 2), and hence CPVT_GenerateAP decided + // to not "generate" its AP. + // If for a reason the object is no longer hidden, but still does not have + // its "AP" generated, generate it now. + GenerateAPIfNeeded(); + + CFX_Matrix matrix; + CPDF_Form* pForm = AnnotGetMatrix(pPage, this, mode, pUser2Device, &matrix); + if (!pForm) + return false; + + CPDF_RenderContext context(pPage); + context.AppendLayer(pForm, &matrix); + context.Render(pDevice, pOptions, nullptr); + return true; +} + +bool CPDF_Annot::DrawInContext(const CPDF_Page* pPage, + CPDF_RenderContext* pContext, + const CFX_Matrix* pUser2Device, + AppearanceMode mode) { + if (!ShouldDrawAnnotation()) + return false; + + // It might happen that by the time this annotation instance was created, + // it was flagged as "hidden" (e.g. /F 2), and hence CPVT_GenerateAP decided + // to not "generate" its AP. + // If for a reason the object is no longer hidden, but still does not have + // its "AP" generated, generate it now. + GenerateAPIfNeeded(); + + CFX_Matrix matrix; + CPDF_Form* pForm = AnnotGetMatrix(pPage, this, mode, pUser2Device, &matrix); + if (!pForm) + return false; + + pContext->AppendLayer(pForm, &matrix); + return true; +} + +void CPDF_Annot::DrawBorder(CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + const CPDF_RenderOptions* pOptions) { + if (GetSubtype() == CPDF_Annot::Subtype::POPUP) + return; + + uint32_t annot_flags = GetFlags(); + if (annot_flags & ANNOTFLAG_HIDDEN) { + return; + } + bool bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || + (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW)); + if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) { + return; + } + if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) { + return; + } + CPDF_Dictionary* pBS = m_pAnnotDict->GetDictFor("BS"); + char style_char; + FX_FLOAT width; + CPDF_Array* pDashArray = nullptr; + if (!pBS) { + CPDF_Array* pBorderArray = m_pAnnotDict->GetArrayFor("Border"); + style_char = 'S'; + if (pBorderArray) { + width = pBorderArray->GetNumberAt(2); + if (pBorderArray->GetCount() == 4) { + pDashArray = pBorderArray->GetArrayAt(3); + if (!pDashArray) { + return; + } + size_t nLen = pDashArray->GetCount(); + size_t i = 0; + for (; i < nLen; ++i) { + CPDF_Object* pObj = pDashArray->GetDirectObjectAt(i); + if (pObj && pObj->GetInteger()) { + break; + } + } + if (i == nLen) { + return; + } + style_char = 'D'; + } + } else { + width = 1; + } + } else { + CFX_ByteString style = pBS->GetStringFor("S"); + pDashArray = pBS->GetArrayFor("D"); + style_char = style[1]; + width = pBS->GetNumberFor("W"); + } + if (width <= 0) { + return; + } + CPDF_Array* pColor = m_pAnnotDict->GetArrayFor("C"); + uint32_t argb = 0xff000000; + if (pColor) { + int R = (int32_t)(pColor->GetNumberAt(0) * 255); + int G = (int32_t)(pColor->GetNumberAt(1) * 255); + int B = (int32_t)(pColor->GetNumberAt(2) * 255); + argb = ArgbEncode(0xff, R, G, B); + } + CFX_GraphStateData graph_state; + graph_state.m_LineWidth = width; + if (style_char == 'D') { + if (pDashArray) { + size_t dash_count = pDashArray->GetCount(); + if (dash_count % 2) { + dash_count++; + } + graph_state.m_DashArray = FX_Alloc(FX_FLOAT, dash_count); + graph_state.m_DashCount = dash_count; + size_t i; + for (i = 0; i < pDashArray->GetCount(); ++i) { + graph_state.m_DashArray[i] = pDashArray->GetNumberAt(i); + } + if (i < dash_count) { + graph_state.m_DashArray[i] = graph_state.m_DashArray[i - 1]; + } + } else { + graph_state.m_DashArray = FX_Alloc(FX_FLOAT, 2); + graph_state.m_DashCount = 2; + graph_state.m_DashArray[0] = graph_state.m_DashArray[1] = 3 * 1.0f; + } + } + CFX_FloatRect rect = GetRect(); + CFX_PathData path; + width /= 2; + path.AppendRect(rect.left + width, rect.bottom + width, rect.right - width, + rect.top - width); + int fill_type = 0; + if (pOptions && (pOptions->m_Flags & RENDER_NOPATHSMOOTH)) + fill_type |= FXFILL_NOPATHSMOOTH; + + pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_annot.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_annot.h new file mode 100644 index 000000000000..188106acdf68 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_annot.h @@ -0,0 +1,130 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_ANNOT_H_ +#define CORE_FPDFDOC_CPDF_ANNOT_H_ + +#include +#include + +#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CFX_RenderDevice; +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_Form; +class CPDF_Page; +class CPDF_RenderContext; +class CPDF_RenderOptions; +class CPDF_Stream; + +#define ANNOTFLAG_INVISIBLE 0x0001 +#define ANNOTFLAG_HIDDEN 0x0002 +#define ANNOTFLAG_PRINT 0x0004 +#define ANNOTFLAG_NOZOOM 0x0008 +#define ANNOTFLAG_NOROTATE 0x0010 +#define ANNOTFLAG_NOVIEW 0x0020 +#define ANNOTFLAG_READONLY 0x0040 +#define ANNOTFLAG_LOCKED 0x0080 +#define ANNOTFLAG_TOGGLENOVIEW 0x0100 + +class CPDF_Annot { + public: + enum AppearanceMode { Normal, Rollover, Down }; + enum class Subtype { + UNKNOWN = 0, + TEXT, + LINK, + FREETEXT, + LINE, + SQUARE, + CIRCLE, + POLYGON, + POLYLINE, + HIGHLIGHT, + UNDERLINE, + SQUIGGLY, + STRIKEOUT, + STAMP, + CARET, + INK, + POPUP, + FILEATTACHMENT, + SOUND, + MOVIE, + WIDGET, + SCREEN, + PRINTERMARK, + TRAPNET, + WATERMARK, + THREED, + RICHMEDIA, + XFAWIDGET + }; + + static bool IsAnnotationHidden(CPDF_Dictionary* pAnnotDict); + static CPDF_Annot::Subtype StringToAnnotSubtype( + const CFX_ByteString& sSubtype); + static CFX_ByteString AnnotSubtypeToString(CPDF_Annot::Subtype nSubtype); + static CFX_FloatRect RectFromQuadPoints(CPDF_Dictionary* pAnnotDict); + + // The second constructor does not take ownership of the dictionary. + CPDF_Annot(std::unique_ptr pDict, CPDF_Document* pDocument); + CPDF_Annot(CPDF_Dictionary* pDict, CPDF_Document* pDocument); + ~CPDF_Annot(); + + CPDF_Annot::Subtype GetSubtype() const; + uint32_t GetFlags() const; + CFX_FloatRect GetRect() const; + CPDF_Document* GetDocument() const { return m_pDocument; } + CPDF_Dictionary* GetAnnotDict() const { return m_pAnnotDict.Get(); } + + bool DrawAppearance(CPDF_Page* pPage, + CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + AppearanceMode mode, + const CPDF_RenderOptions* pOptions); + bool DrawInContext(const CPDF_Page* pPage, + CPDF_RenderContext* pContext, + const CFX_Matrix* pUser2Device, + AppearanceMode mode); + + void ClearCachedAP(); + void DrawBorder(CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + const CPDF_RenderOptions* pOptions); + CPDF_Form* GetAPForm(const CPDF_Page* pPage, AppearanceMode mode); + void SetOpenState(bool bOpenState) { m_bOpenState = bOpenState; } + CPDF_Annot* GetPopupAnnot() const { return m_pPopupAnnot; } + void SetPopupAnnot(CPDF_Annot* pAnnot) { m_pPopupAnnot = pAnnot; } + + private: + void Init(); + void GenerateAPIfNeeded(); + bool ShouldDrawAnnotation(); + + CFX_FloatRect RectForDrawing() const; + + CFX_MaybeOwned m_pAnnotDict; + CPDF_Document* const m_pDocument; + CPDF_Annot::Subtype m_nSubtype; + std::map> m_APMap; + // |m_bOpenState| is only set for popup annotations. + bool m_bOpenState = false; + bool m_bHasGeneratedAP; + bool m_bIsTextMarkupAnnotation; + // Not owned. If there is a valid pointer in |m_pPopupAnnot|, + // then this annot is never a popup. + CPDF_Annot* m_pPopupAnnot = nullptr; +}; + +CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, + CPDF_Annot::AppearanceMode mode); + +#endif // CORE_FPDFDOC_CPDF_ANNOT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_annotlist.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_annotlist.cpp new file mode 100644 index 000000000000..ed1b60c28786 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_annotlist.cpp @@ -0,0 +1,183 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_annotlist.h" + +#include +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fpdfdoc/cpdf_annot.h" +#include "core/fpdfdoc/cpdf_interform.h" +#include "core/fpdfdoc/cpdf_occontext.h" +#include "core/fpdfdoc/cpvt_generateap.h" +#include "core/fxge/cfx_renderdevice.h" +#include "third_party/base/ptr_util.h" + +namespace { + +std::unique_ptr CreatePopupAnnot(CPDF_Annot* pAnnot, + CPDF_Document* pDocument) { + CPDF_Dictionary* pParentDict = pAnnot->GetAnnotDict(); + if (!pParentDict) + return nullptr; + + // TODO(jaepark): We shouldn't strip BOM for some strings and not for others. + // See pdfium:593. + CFX_WideString sContents = pParentDict->GetUnicodeTextFor("Contents"); + if (sContents.IsEmpty()) + return nullptr; + + auto pAnnotDict = + pdfium::MakeUnique(pDocument->GetByteStringPool()); + pAnnotDict->SetNewFor("Type", "Annot"); + pAnnotDict->SetNewFor("Subtype", "Popup"); + pAnnotDict->SetNewFor("T", pParentDict->GetStringFor("T"), + false); + pAnnotDict->SetNewFor("Contents", sContents.UTF8Encode(), false); + + CFX_FloatRect rect = pParentDict->GetRectFor("Rect"); + rect.Normalize(); + CFX_FloatRect popupRect(0, 0, 200, 200); + popupRect.Translate(rect.left, rect.bottom - popupRect.Height()); + + pAnnotDict->SetRectFor("Rect", popupRect); + pAnnotDict->SetNewFor("F", 0); + + auto pPopupAnnot = + pdfium::MakeUnique(std::move(pAnnotDict), pDocument); + pAnnot->SetPopupAnnot(pPopupAnnot.get()); + return pPopupAnnot; +} + +} // namespace + +CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage) + : m_pDocument(pPage->m_pDocument) { + if (!pPage->m_pFormDict) + return; + + CPDF_Array* pAnnots = pPage->m_pFormDict->GetArrayFor("Annots"); + if (!pAnnots) + return; + + CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); + CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm"); + bool bRegenerateAP = pAcroForm && pAcroForm->GetBooleanFor("NeedAppearances"); + for (size_t i = 0; i < pAnnots->GetCount(); ++i) { + CPDF_Dictionary* pDict = ToDictionary(pAnnots->GetDirectObjectAt(i)); + if (!pDict) + continue; + const CFX_ByteString subtype = pDict->GetStringFor("Subtype"); + if (subtype == "Popup") { + // Skip creating Popup annotations in the PDF document since PDFium + // provides its own Popup annotations. + continue; + } + pAnnots->ConvertToIndirectObjectAt(i, m_pDocument); + m_AnnotList.push_back(pdfium::MakeUnique(pDict, m_pDocument)); + if (bRegenerateAP && subtype == "Widget" && + CPDF_InterForm::IsUpdateAPEnabled()) { + FPDF_GenerateAP(m_pDocument, pDict); + } + } + + size_t nAnnotListSize = m_AnnotList.size(); + for (size_t i = 0; i < nAnnotListSize; ++i) { + std::unique_ptr pPopupAnnot( + CreatePopupAnnot(m_AnnotList[i].get(), m_pDocument)); + if (pPopupAnnot) + m_AnnotList.push_back(std::move(pPopupAnnot)); + } +} + +CPDF_AnnotList::~CPDF_AnnotList() {} + +void CPDF_AnnotList::DisplayPass(CPDF_Page* pPage, + CFX_RenderDevice* pDevice, + CPDF_RenderContext* pContext, + bool bPrinting, + const CFX_Matrix* pMatrix, + bool bWidgetPass, + CPDF_RenderOptions* pOptions, + FX_RECT* clip_rect) { + for (const auto& pAnnot : m_AnnotList) { + bool bWidget = pAnnot->GetSubtype() == CPDF_Annot::Subtype::WIDGET; + if ((bWidgetPass && !bWidget) || (!bWidgetPass && bWidget)) + continue; + + uint32_t annot_flags = pAnnot->GetFlags(); + if (annot_flags & ANNOTFLAG_HIDDEN) + continue; + + if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) + continue; + + if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) + continue; + + if (pOptions) { + CFX_RetainPtr pOCContext = pOptions->m_pOCContext; + CPDF_Dictionary* pAnnotDict = pAnnot->GetAnnotDict(); + if (pOCContext && pAnnotDict && + !pOCContext->CheckOCGVisible(pAnnotDict->GetDictFor("OC"))) { + continue; + } + } + CFX_FloatRect annot_rect_f = pAnnot->GetRect(); + CFX_Matrix matrix = *pMatrix; + if (clip_rect) { + matrix.TransformRect(annot_rect_f); + + FX_RECT annot_rect = annot_rect_f.GetOuterRect(); + annot_rect.Intersect(*clip_rect); + if (annot_rect.IsEmpty()) + continue; + } + if (pContext) { + pAnnot->DrawInContext(pPage, pContext, &matrix, CPDF_Annot::Normal); + } else if (!pAnnot->DrawAppearance(pPage, pDevice, &matrix, + CPDF_Annot::Normal, pOptions)) { + pAnnot->DrawBorder(pDevice, &matrix, pOptions); + } + } +} + +void CPDF_AnnotList::DisplayAnnots(CPDF_Page* pPage, + CFX_RenderDevice* pDevice, + CPDF_RenderContext* pContext, + bool bPrinting, + const CFX_Matrix* pUser2Device, + uint32_t dwAnnotFlags, + CPDF_RenderOptions* pOptions, + FX_RECT* pClipRect) { + if (dwAnnotFlags & ANNOTFLAG_INVISIBLE) { + DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, false, + pOptions, pClipRect); + } + if (dwAnnotFlags & ANNOTFLAG_HIDDEN) { + DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, true, + pOptions, pClipRect); + } +} + +void CPDF_AnnotList::DisplayAnnots(CPDF_Page* pPage, + CPDF_RenderContext* pContext, + bool bPrinting, + const CFX_Matrix* pMatrix, + bool bShowWidget, + CPDF_RenderOptions* pOptions) { + uint32_t dwAnnotFlags = bShowWidget ? ANNOTFLAG_INVISIBLE | ANNOTFLAG_HIDDEN + : ANNOTFLAG_INVISIBLE; + DisplayAnnots(pPage, nullptr, pContext, bPrinting, pMatrix, dwAnnotFlags, + pOptions, nullptr); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_annotlist.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_annotlist.h new file mode 100644 index 000000000000..3443277b68da --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_annotlist.h @@ -0,0 +1,64 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_ANNOTLIST_H_ +#define CORE_FPDFDOC_CPDF_ANNOTLIST_H_ + +#include +#include + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CFX_RenderDevice; +class CPDF_Annot; +class CPDF_Document; +class CPDF_Page; +class CPDF_RenderContext; +class CPDF_RenderOptions; + +class CPDF_AnnotList { + public: + explicit CPDF_AnnotList(CPDF_Page* pPage); + ~CPDF_AnnotList(); + + void DisplayAnnots(CPDF_Page* pPage, + CPDF_RenderContext* pContext, + bool bPrinting, + const CFX_Matrix* pMatrix, + bool bShowWidget, + CPDF_RenderOptions* pOptions); + + void DisplayAnnots(CPDF_Page* pPage, + CFX_RenderDevice* pDevice, + CPDF_RenderContext* pContext, + bool bPrinting, + const CFX_Matrix* pMatrix, + uint32_t dwAnnotFlags, + CPDF_RenderOptions* pOptions, + FX_RECT* pClipRect); + + size_t Count() const { return m_AnnotList.size(); } + CPDF_Annot* GetAt(size_t index) const { return m_AnnotList[index].get(); } + const std::vector>& All() const { + return m_AnnotList; + } + + private: + void DisplayPass(CPDF_Page* pPage, + CFX_RenderDevice* pDevice, + CPDF_RenderContext* pContext, + bool bPrinting, + const CFX_Matrix* pMatrix, + bool bWidget, + CPDF_RenderOptions* pOptions, + FX_RECT* clip_rect); + + CPDF_Document* const m_pDocument; + std::vector> m_AnnotList; +}; + +#endif // CORE_FPDFDOC_CPDF_ANNOTLIST_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_apsettings.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_apsettings.cpp new file mode 100644 index 000000000000..9fc9c1aa0667 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_apsettings.cpp @@ -0,0 +1,121 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_apsettings.h" + +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfdoc/cpdf_formcontrol.h" + +CPDF_ApSettings::CPDF_ApSettings(CPDF_Dictionary* pDict) : m_pDict(pDict) {} + +bool CPDF_ApSettings::HasMKEntry(const CFX_ByteString& csEntry) const { + return m_pDict && m_pDict->KeyExist(csEntry); +} + +int CPDF_ApSettings::GetRotation() const { + return m_pDict ? m_pDict->GetIntegerFor("R") : 0; +} + +FX_ARGB CPDF_ApSettings::GetColor(int& iColorType, + const CFX_ByteString& csEntry) const { + iColorType = COLORTYPE_TRANSPARENT; + if (!m_pDict) + return 0; + + CPDF_Array* pEntry = m_pDict->GetArrayFor(csEntry); + if (!pEntry) + return 0; + + FX_ARGB color = 0; + size_t dwCount = pEntry->GetCount(); + if (dwCount == 1) { + iColorType = COLORTYPE_GRAY; + FX_FLOAT g = pEntry->GetNumberAt(0) * 255; + return ArgbEncode(255, (int)g, (int)g, (int)g); + } + if (dwCount == 3) { + iColorType = COLORTYPE_RGB; + FX_FLOAT r = pEntry->GetNumberAt(0) * 255; + FX_FLOAT g = pEntry->GetNumberAt(1) * 255; + FX_FLOAT b = pEntry->GetNumberAt(2) * 255; + return ArgbEncode(255, (int)r, (int)g, (int)b); + } + if (dwCount == 4) { + iColorType = COLORTYPE_CMYK; + FX_FLOAT c = pEntry->GetNumberAt(0); + FX_FLOAT m = pEntry->GetNumberAt(1); + FX_FLOAT y = pEntry->GetNumberAt(2); + FX_FLOAT k = pEntry->GetNumberAt(3); + FX_FLOAT r = 1.0f - std::min(1.0f, c + k); + FX_FLOAT g = 1.0f - std::min(1.0f, m + k); + FX_FLOAT b = 1.0f - std::min(1.0f, y + k); + return ArgbEncode(255, (int)(r * 255), (int)(g * 255), (int)(b * 255)); + } + return color; +} + +FX_FLOAT CPDF_ApSettings::GetOriginalColor( + int index, + const CFX_ByteString& csEntry) const { + if (!m_pDict) + return 0; + + CPDF_Array* pEntry = m_pDict->GetArrayFor(csEntry); + return pEntry ? pEntry->GetNumberAt(index) : 0; +} + +void CPDF_ApSettings::GetOriginalColor(int& iColorType, + FX_FLOAT fc[4], + const CFX_ByteString& csEntry) const { + iColorType = COLORTYPE_TRANSPARENT; + for (int i = 0; i < 4; i++) + fc[i] = 0; + + if (!m_pDict) + return; + + CPDF_Array* pEntry = m_pDict->GetArrayFor(csEntry); + if (!pEntry) + return; + + size_t dwCount = pEntry->GetCount(); + if (dwCount == 1) { + iColorType = COLORTYPE_GRAY; + fc[0] = pEntry->GetNumberAt(0); + } else if (dwCount == 3) { + iColorType = COLORTYPE_RGB; + fc[0] = pEntry->GetNumberAt(0); + fc[1] = pEntry->GetNumberAt(1); + fc[2] = pEntry->GetNumberAt(2); + } else if (dwCount == 4) { + iColorType = COLORTYPE_CMYK; + fc[0] = pEntry->GetNumberAt(0); + fc[1] = pEntry->GetNumberAt(1); + fc[2] = pEntry->GetNumberAt(2); + fc[3] = pEntry->GetNumberAt(3); + } +} + +CFX_WideString CPDF_ApSettings::GetCaption( + const CFX_ByteString& csEntry) const { + return m_pDict ? m_pDict->GetUnicodeTextFor(csEntry) : CFX_WideString(); +} + +CPDF_Stream* CPDF_ApSettings::GetIcon(const CFX_ByteString& csEntry) const { + return m_pDict ? m_pDict->GetStreamFor(csEntry) : nullptr; +} + +CPDF_IconFit CPDF_ApSettings::GetIconFit() const { + return CPDF_IconFit(m_pDict ? m_pDict->GetDictFor("IF") : nullptr); +} + +int CPDF_ApSettings::GetTextPosition() const { + return m_pDict ? m_pDict->GetIntegerFor("TP", TEXTPOS_CAPTION) + : TEXTPOS_CAPTION; +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_apsettings.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_apsettings.h new file mode 100644 index 000000000000..ffddffdbe061 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_apsettings.h @@ -0,0 +1,74 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_APSETTINGS_H_ +#define CORE_FPDFDOC_CPDF_APSETTINGS_H_ + +#include "core/fpdfdoc/cpdf_iconfit.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxge/fx_dib.h" + +class CPDF_Dictionary; +class CPDF_FormControl; +class CPDF_Stream; + +class CPDF_ApSettings { + public: + explicit CPDF_ApSettings(CPDF_Dictionary* pDict); + + bool HasMKEntry(const CFX_ByteString& csEntry) const; + int GetRotation() const; + + FX_ARGB GetBorderColor(int& iColorType) const { + return GetColor(iColorType, "BC"); + } + + FX_FLOAT GetOriginalBorderColor(int index) const { + return GetOriginalColor(index, "BC"); + } + + void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) const { + GetOriginalColor(iColorType, fc, "BC"); + } + + FX_ARGB GetBackgroundColor(int& iColorType) const { + return GetColor(iColorType, "BG"); + } + + FX_FLOAT GetOriginalBackgroundColor(int index) const { + return GetOriginalColor(index, "BG"); + } + + void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) const { + GetOriginalColor(iColorType, fc, "BG"); + } + + CFX_WideString GetNormalCaption() const { return GetCaption("CA"); } + CFX_WideString GetRolloverCaption() const { return GetCaption("RC"); } + CFX_WideString GetDownCaption() const { return GetCaption("AC"); } + CPDF_Stream* GetNormalIcon() const { return GetIcon("I"); } + CPDF_Stream* GetRolloverIcon() const { return GetIcon("RI"); } + CPDF_Stream* GetDownIcon() const { return GetIcon("IX"); } + CPDF_IconFit GetIconFit() const; + int GetTextPosition() const; + + private: + friend class CPDF_FormControl; + + FX_ARGB GetColor(int& iColorType, const CFX_ByteString& csEntry) const; + FX_FLOAT GetOriginalColor(int index, const CFX_ByteString& csEntry) const; + void GetOriginalColor(int& iColorType, + FX_FLOAT fc[4], + const CFX_ByteString& csEntry) const; + + CFX_WideString GetCaption(const CFX_ByteString& csEntry) const; + CPDF_Stream* GetIcon(const CFX_ByteString& csEntry) const; + + CPDF_Dictionary* const m_pDict; +}; + +#endif // CORE_FPDFDOC_CPDF_APSETTINGS_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmark.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmark.cpp new file mode 100644 index 000000000000..c2c37057170d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmark.cpp @@ -0,0 +1,73 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_bookmark.h" + +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfdoc/cpdf_nametree.h" +#include "core/fxge/fx_dib.h" + +uint32_t CPDF_Bookmark::GetColorRef() const { + if (!m_pDict) + return FXSYS_RGB(0, 0, 0); + + CPDF_Array* pColor = m_pDict->GetArrayFor("C"); + if (!pColor) + return FXSYS_RGB(0, 0, 0); + + int r = FXSYS_round(pColor->GetNumberAt(0) * 255); + int g = FXSYS_round(pColor->GetNumberAt(1) * 255); + int b = FXSYS_round(pColor->GetNumberAt(2) * 255); + return FXSYS_RGB(r, g, b); +} + +uint32_t CPDF_Bookmark::GetFontStyle() const { + return m_pDict ? m_pDict->GetIntegerFor("F") : 0; +} + +CFX_WideString CPDF_Bookmark::GetTitle() const { + if (!m_pDict) + return CFX_WideString(); + + CPDF_String* pString = ToString(m_pDict->GetDirectObjectFor("Title")); + if (!pString) + return CFX_WideString(); + + CFX_WideString title = pString->GetUnicodeText(); + int len = title.GetLength(); + if (!len) + return CFX_WideString(); + + std::unique_ptr buf(new FX_WCHAR[len]); + for (int i = 0; i < len; i++) { + FX_WCHAR w = title[i]; + buf[i] = w > 0x20 ? w : 0x20; + } + return CFX_WideString(buf.get(), len); +} + +CPDF_Dest CPDF_Bookmark::GetDest(CPDF_Document* pDocument) const { + if (!m_pDict) + return CPDF_Dest(); + + CPDF_Object* pDest = m_pDict->GetDirectObjectFor("Dest"); + if (!pDest) + return CPDF_Dest(); + if (pDest->IsString() || pDest->IsName()) { + CPDF_NameTree name_tree(pDocument, "Dests"); + return CPDF_Dest(name_tree.LookupNamedDest(pDocument, pDest->GetString())); + } + if (CPDF_Array* pArray = pDest->AsArray()) + return CPDF_Dest(pArray); + return CPDF_Dest(); +} + +CPDF_Action CPDF_Bookmark::GetAction() const { + return m_pDict ? CPDF_Action(m_pDict->GetDictFor("A")) : CPDF_Action(); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmark.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmark.h new file mode 100644 index 000000000000..30a8a512cce3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmark.h @@ -0,0 +1,33 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_BOOKMARK_H_ +#define CORE_FPDFDOC_CPDF_BOOKMARK_H_ + +#include "core/fpdfdoc/cpdf_action.h" +#include "core/fpdfdoc/cpdf_dest.h" +#include "core/fxcrt/fx_string.h" + +class CPDF_Dictionary; +class CPDF_Document; + +class CPDF_Bookmark { + public: + CPDF_Bookmark() : m_pDict(nullptr) {} + explicit CPDF_Bookmark(CPDF_Dictionary* pDict) : m_pDict(pDict) {} + + CPDF_Dictionary* GetDict() const { return m_pDict; } + uint32_t GetColorRef() const; + uint32_t GetFontStyle() const; + CFX_WideString GetTitle() const; + CPDF_Dest GetDest(CPDF_Document* pDocument) const; + CPDF_Action GetAction() const; + + private: + CPDF_Dictionary* m_pDict; +}; + +#endif // CORE_FPDFDOC_CPDF_BOOKMARK_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmarktree.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmarktree.cpp new file mode 100644 index 000000000000..2a4314547ce5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmarktree.cpp @@ -0,0 +1,34 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_bookmarktree.h" + +#include "core/fpdfapi/parser/cpdf_document.h" + +CPDF_Bookmark CPDF_BookmarkTree::GetFirstChild( + const CPDF_Bookmark& parent) const { + CPDF_Dictionary* pParentDict = parent.GetDict(); + if (pParentDict) + return CPDF_Bookmark(pParentDict->GetDictFor("First")); + + CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); + if (!pRoot) + return CPDF_Bookmark(); + + CPDF_Dictionary* pOutlines = pRoot->GetDictFor("Outlines"); + return pOutlines ? CPDF_Bookmark(pOutlines->GetDictFor("First")) + : CPDF_Bookmark(); +} + +CPDF_Bookmark CPDF_BookmarkTree::GetNextSibling( + const CPDF_Bookmark& bookmark) const { + CPDF_Dictionary* pDict = bookmark.GetDict(); + if (!pDict) + return CPDF_Bookmark(); + + CPDF_Dictionary* pNext = pDict->GetDictFor("Next"); + return pNext == pDict ? CPDF_Bookmark() : CPDF_Bookmark(pNext); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmarktree.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmarktree.h new file mode 100644 index 000000000000..7207357b1e59 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_bookmarktree.h @@ -0,0 +1,26 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_BOOKMARKTREE_H_ +#define CORE_FPDFDOC_CPDF_BOOKMARKTREE_H_ + +#include "core/fpdfdoc/cpdf_bookmark.h" + +class CPDF_Document; + +class CPDF_BookmarkTree { + public: + explicit CPDF_BookmarkTree(CPDF_Document* pDoc) : m_pDocument(pDoc) {} + + CPDF_Bookmark GetFirstChild(const CPDF_Bookmark& parent) const; + CPDF_Bookmark GetNextSibling(const CPDF_Bookmark& bookmark) const; + CPDF_Document* GetDocument() const { return m_pDocument; } + + private: + CPDF_Document* const m_pDocument; +}; + +#endif // CORE_FPDFDOC_CPDF_BOOKMARKTREE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_defaultappearance.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_defaultappearance.cpp new file mode 100644 index 000000000000..19767650f3a8 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_defaultappearance.cpp @@ -0,0 +1,223 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_defaultappearance.h" + +#include + +#include "core/fpdfapi/parser/cpdf_simple_parser.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfdoc/cpdf_formcontrol.h" + +bool CPDF_DefaultAppearance::HasFont() { + if (m_csDA.IsEmpty()) + return false; + + CPDF_SimpleParser syntax(m_csDA.AsStringC()); + return syntax.FindTagParamFromStart("Tf", 2); +} + +CFX_ByteString CPDF_DefaultAppearance::GetFontString() { + CFX_ByteString csFont; + if (m_csDA.IsEmpty()) + return csFont; + + CPDF_SimpleParser syntax(m_csDA.AsStringC()); + if (syntax.FindTagParamFromStart("Tf", 2)) { + csFont += syntax.GetWord(); + csFont += " "; + csFont += syntax.GetWord(); + csFont += " "; + csFont += syntax.GetWord(); + } + return csFont; +} + +void CPDF_DefaultAppearance::GetFont(CFX_ByteString& csFontNameTag, + FX_FLOAT& fFontSize) { + csFontNameTag = ""; + fFontSize = 0; + if (m_csDA.IsEmpty()) + return; + + CPDF_SimpleParser syntax(m_csDA.AsStringC()); + if (syntax.FindTagParamFromStart("Tf", 2)) { + csFontNameTag = CFX_ByteString(syntax.GetWord()); + csFontNameTag.Delete(0, 1); + fFontSize = FX_atof(syntax.GetWord()); + } + csFontNameTag = PDF_NameDecode(csFontNameTag); +} + +bool CPDF_DefaultAppearance::HasColor(PaintOperation nOperation) { + if (m_csDA.IsEmpty()) + return false; + + CPDF_SimpleParser syntax(m_csDA.AsStringC()); + if (syntax.FindTagParamFromStart( + (nOperation == PaintOperation::STROKE ? "G" : "g"), 1)) { + return true; + } + if (syntax.FindTagParamFromStart( + (nOperation == PaintOperation::STROKE ? "RG" : "rg"), 3)) { + return true; + } + return syntax.FindTagParamFromStart( + (nOperation == PaintOperation::STROKE ? "K" : "k"), 4); +} + +CFX_ByteString CPDF_DefaultAppearance::GetColorString( + PaintOperation nOperation) { + CFX_ByteString csColor; + if (m_csDA.IsEmpty()) + return csColor; + + CPDF_SimpleParser syntax(m_csDA.AsStringC()); + if (syntax.FindTagParamFromStart( + (nOperation == PaintOperation::STROKE ? "G" : "g"), 1)) { + csColor += syntax.GetWord(); + csColor += " "; + csColor += syntax.GetWord(); + return csColor; + } + if (syntax.FindTagParamFromStart( + (nOperation == PaintOperation::STROKE ? "RG" : "rg"), 3)) { + csColor += syntax.GetWord(); + csColor += " "; + csColor += syntax.GetWord(); + csColor += " "; + csColor += syntax.GetWord(); + csColor += " "; + csColor += syntax.GetWord(); + return csColor; + } + if (syntax.FindTagParamFromStart( + (nOperation == PaintOperation::STROKE ? "K" : "k"), 4)) { + csColor += syntax.GetWord(); + csColor += " "; + csColor += syntax.GetWord(); + csColor += " "; + csColor += syntax.GetWord(); + csColor += " "; + csColor += syntax.GetWord(); + csColor += " "; + csColor += syntax.GetWord(); + } + return csColor; +} + +void CPDF_DefaultAppearance::GetColor(int& iColorType, + FX_FLOAT fc[4], + PaintOperation nOperation) { + iColorType = COLORTYPE_TRANSPARENT; + for (int c = 0; c < 4; c++) + fc[c] = 0; + + if (m_csDA.IsEmpty()) + return; + + CPDF_SimpleParser syntax(m_csDA.AsStringC()); + if (syntax.FindTagParamFromStart( + (nOperation == PaintOperation::STROKE ? "G" : "g"), 1)) { + iColorType = COLORTYPE_GRAY; + fc[0] = FX_atof(syntax.GetWord()); + return; + } + if (syntax.FindTagParamFromStart( + (nOperation == PaintOperation::STROKE ? "RG" : "rg"), 3)) { + iColorType = COLORTYPE_RGB; + fc[0] = FX_atof(syntax.GetWord()); + fc[1] = FX_atof(syntax.GetWord()); + fc[2] = FX_atof(syntax.GetWord()); + return; + } + if (syntax.FindTagParamFromStart( + (nOperation == PaintOperation::STROKE ? "K" : "k"), 4)) { + iColorType = COLORTYPE_CMYK; + fc[0] = FX_atof(syntax.GetWord()); + fc[1] = FX_atof(syntax.GetWord()); + fc[2] = FX_atof(syntax.GetWord()); + fc[3] = FX_atof(syntax.GetWord()); + } +} + +void CPDF_DefaultAppearance::GetColor(FX_ARGB& color, + int& iColorType, + PaintOperation nOperation) { + color = 0; + iColorType = COLORTYPE_TRANSPARENT; + if (m_csDA.IsEmpty()) + return; + + CPDF_SimpleParser syntax(m_csDA.AsStringC()); + if (syntax.FindTagParamFromStart( + (nOperation == PaintOperation::STROKE ? "G" : "g"), 1)) { + iColorType = COLORTYPE_GRAY; + FX_FLOAT g = FX_atof(syntax.GetWord()) * 255 + 0.5f; + color = ArgbEncode(255, (int)g, (int)g, (int)g); + return; + } + if (syntax.FindTagParamFromStart( + (nOperation == PaintOperation::STROKE ? "RG" : "rg"), 3)) { + iColorType = COLORTYPE_RGB; + FX_FLOAT r = FX_atof(syntax.GetWord()) * 255 + 0.5f; + FX_FLOAT g = FX_atof(syntax.GetWord()) * 255 + 0.5f; + FX_FLOAT b = FX_atof(syntax.GetWord()) * 255 + 0.5f; + color = ArgbEncode(255, (int)r, (int)g, (int)b); + return; + } + if (syntax.FindTagParamFromStart( + (nOperation == PaintOperation::STROKE ? "K" : "k"), 4)) { + iColorType = COLORTYPE_CMYK; + FX_FLOAT c = FX_atof(syntax.GetWord()); + FX_FLOAT m = FX_atof(syntax.GetWord()); + FX_FLOAT y = FX_atof(syntax.GetWord()); + FX_FLOAT k = FX_atof(syntax.GetWord()); + FX_FLOAT r = 1.0f - std::min(1.0f, c + k); + FX_FLOAT g = 1.0f - std::min(1.0f, m + k); + FX_FLOAT b = 1.0f - std::min(1.0f, y + k); + color = ArgbEncode(255, (int)(r * 255 + 0.5f), (int)(g * 255 + 0.5f), + (int)(b * 255 + 0.5f)); + } +} + +bool CPDF_DefaultAppearance::HasTextMatrix() { + if (m_csDA.IsEmpty()) + return false; + + CPDF_SimpleParser syntax(m_csDA.AsStringC()); + return syntax.FindTagParamFromStart("Tm", 6); +} + +CFX_ByteString CPDF_DefaultAppearance::GetTextMatrixString() { + CFX_ByteString csTM; + if (m_csDA.IsEmpty()) + return csTM; + + CPDF_SimpleParser syntax(m_csDA.AsStringC()); + if (syntax.FindTagParamFromStart("Tm", 6)) { + for (int i = 0; i < 6; i++) { + csTM += syntax.GetWord(); + csTM += " "; + } + csTM += syntax.GetWord(); + } + return csTM; +} + +CFX_Matrix CPDF_DefaultAppearance::GetTextMatrix() { + if (m_csDA.IsEmpty()) + return CFX_Matrix(); + + CPDF_SimpleParser syntax(m_csDA.AsStringC()); + if (!syntax.FindTagParamFromStart("Tm", 6)) + return CFX_Matrix(); + + FX_FLOAT f[6]; + for (int i = 0; i < 6; i++) + f[i] = FX_atof(syntax.GetWord()); + return CFX_Matrix(f); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_defaultappearance.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_defaultappearance.h new file mode 100644 index 000000000000..4fd32ebd0c76 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_defaultappearance.h @@ -0,0 +1,52 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_DEFAULTAPPEARANCE_H_ +#define CORE_FPDFDOC_CPDF_DEFAULTAPPEARANCE_H_ + +#include "core/fpdfdoc/cpdf_defaultappearance.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxge/fx_dib.h" + +enum class BorderStyle { SOLID, DASH, BEVELED, INSET, UNDERLINE }; +enum class PaintOperation { STROKE, FILL }; + +class CPDF_DefaultAppearance { + public: + CPDF_DefaultAppearance() {} + explicit CPDF_DefaultAppearance(const CFX_ByteString& csDA) : m_csDA(csDA) {} + + CPDF_DefaultAppearance(const CPDF_DefaultAppearance& cDA) { + m_csDA = cDA.GetStr(); + } + + CFX_ByteString GetStr() const { return m_csDA; } + + bool HasFont(); + CFX_ByteString GetFontString(); + void GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize); + + bool HasColor(PaintOperation nOperation = PaintOperation::FILL); + CFX_ByteString GetColorString( + PaintOperation nOperation = PaintOperation::FILL); + void GetColor(int& iColorType, + FX_FLOAT fc[4], + PaintOperation nOperation = PaintOperation::FILL); + void GetColor(FX_ARGB& color, + int& iColorType, + PaintOperation nOperation = PaintOperation::FILL); + + bool HasTextMatrix(); + CFX_ByteString GetTextMatrixString(); + CFX_Matrix GetTextMatrix(); + + private: + CFX_ByteString m_csDA; +}; + +#endif // CORE_FPDFDOC_CPDF_DEFAULTAPPEARANCE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_dest.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_dest.cpp new file mode 100644 index 000000000000..51e2d0b53427 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_dest.cpp @@ -0,0 +1,123 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_dest.h" + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" + +namespace { + +const FX_CHAR* const g_sZoomModes[] = {"XYZ", "Fit", "FitH", "FitV", "FitR", + "FitB", "FitBH", "FitBV", nullptr}; + +} // namespace + +int CPDF_Dest::GetPageIndex(CPDF_Document* pDoc) { + CPDF_Array* pArray = ToArray(m_pObj); + if (!pArray) + return 0; + + CPDF_Object* pPage = pArray->GetDirectObjectAt(0); + if (!pPage) + return 0; + if (pPage->IsNumber()) + return pPage->GetInteger(); + if (!pPage->IsDictionary()) + return 0; + return pDoc->GetPageIndex(pPage->GetObjNum()); +} + +uint32_t CPDF_Dest::GetPageObjNum() { + CPDF_Array* pArray = ToArray(m_pObj); + if (!pArray) + return 0; + + CPDF_Object* pPage = pArray->GetDirectObjectAt(0); + if (!pPage) + return 0; + if (pPage->IsNumber()) + return pPage->GetInteger(); + if (pPage->IsDictionary()) + return pPage->GetObjNum(); + return 0; +} + +int CPDF_Dest::GetZoomMode() { + CPDF_Array* pArray = ToArray(m_pObj); + if (!pArray) + return 0; + + CPDF_Object* pObj = pArray->GetDirectObjectAt(1); + if (!pObj) + return 0; + + CFX_ByteString mode = pObj->GetString(); + for (int i = 0; g_sZoomModes[i]; ++i) { + if (mode == g_sZoomModes[i]) + return i + 1; + } + + return 0; +} + +bool CPDF_Dest::GetXYZ(bool* pHasX, + bool* pHasY, + bool* pHasZoom, + float* pX, + float* pY, + float* pZoom) const { + *pHasX = false; + *pHasY = false; + *pHasZoom = false; + + CPDF_Array* pArray = ToArray(m_pObj); + if (!pArray) + return false; + + if (pArray->GetCount() < 5) + return false; + + const CPDF_Name* xyz = ToName(pArray->GetDirectObjectAt(1)); + if (!xyz || xyz->GetString() != "XYZ") + return false; + + const CPDF_Number* numX = ToNumber(pArray->GetDirectObjectAt(2)); + const CPDF_Number* numY = ToNumber(pArray->GetDirectObjectAt(3)); + const CPDF_Number* numZoom = ToNumber(pArray->GetDirectObjectAt(4)); + + // If the value is a CPDF_Null then ToNumber will return nullptr. + *pHasX = !!numX; + *pHasY = !!numY; + *pHasZoom = !!numZoom; + + if (numX) + *pX = numX->GetNumber(); + if (numY) + *pY = numY->GetNumber(); + + // A zoom value of 0 is equivalent to a null value, so treat it as a null. + if (numZoom) { + float num = numZoom->GetNumber(); + if (num == 0.0) + *pHasZoom = false; + else + *pZoom = num; + } + + return true; +} + +FX_FLOAT CPDF_Dest::GetParam(int index) { + CPDF_Array* pArray = ToArray(m_pObj); + return pArray ? pArray->GetNumberAt(2 + index) : 0; +} + +CFX_ByteString CPDF_Dest::GetRemoteName() { + return m_pObj ? m_pObj->GetString() : CFX_ByteString(); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_dest.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_dest.h new file mode 100644 index 000000000000..527d1dcf8b1f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_dest.h @@ -0,0 +1,39 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_DEST_H_ +#define CORE_FPDFDOC_CPDF_DEST_H_ + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Document; +class CPDF_Object; + +class CPDF_Dest { + public: + CPDF_Dest() : m_pObj(nullptr) {} + explicit CPDF_Dest(CPDF_Object* pObj) : m_pObj(pObj) {} + + CPDF_Object* GetObject() const { return m_pObj; } + CFX_ByteString GetRemoteName(); + int GetPageIndex(CPDF_Document* pDoc); + uint32_t GetPageObjNum(); + int GetZoomMode(); + FX_FLOAT GetParam(int index); + + bool GetXYZ(bool* pHasX, + bool* pHasY, + bool* pHasZoom, + float* pX, + float* pY, + float* pZoom) const; + + private: + CPDF_Object* m_pObj; +}; + +#endif // CORE_FPDFDOC_CPDF_DEST_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_dest_unittest.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_dest_unittest.cpp new file mode 100644 index 000000000000..7c35371085c3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_dest_unittest.cpp @@ -0,0 +1,61 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_null.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfdoc/cpdf_dest.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" +#include "third_party/base/ptr_util.h" + +TEST(cpdf_dest, GetXYZ) { + bool hasX; + bool hasY; + bool hasZoom; + float x; + float y; + float zoom; + + auto dest = pdfium::MakeUnique(); + EXPECT_FALSE(dest->GetXYZ(&hasX, &hasY, &hasZoom, &x, &y, &zoom)); + + auto array = pdfium::MakeUnique(); + array->AddNew(0); // Page Index. + array->AddNew("XYZ"); + array->AddNew(4); // X + + // Not enough entries. + dest = pdfium::MakeUnique(array.get()); + EXPECT_FALSE(dest->GetXYZ(&hasX, &hasY, &hasZoom, &x, &y, &zoom)); + + array->AddNew(5); // Y + array->AddNew(6); // Zoom. + + dest = pdfium::MakeUnique(array.get()); + EXPECT_TRUE(dest->GetXYZ(&hasX, &hasY, &hasZoom, &x, &y, &zoom)); + EXPECT_TRUE(hasX); + EXPECT_TRUE(hasY); + EXPECT_TRUE(hasZoom); + EXPECT_EQ(4, x); + EXPECT_EQ(5, y); + EXPECT_EQ(6, zoom); + + // Set zoom to 0. + array->SetNewAt(4, 0); + dest = pdfium::MakeUnique(array.get()); + EXPECT_TRUE(dest->GetXYZ(&hasX, &hasY, &hasZoom, &x, &y, &zoom)); + EXPECT_FALSE(hasZoom); + + // Set values to null. + array->SetNewAt(2); + array->SetNewAt(3); + array->SetNewAt(4); + dest = pdfium::MakeUnique(array.get()); + EXPECT_TRUE(dest->GetXYZ(&hasX, &hasY, &hasZoom, &x, &y, &zoom)); + EXPECT_FALSE(hasX); + EXPECT_FALSE(hasY); + EXPECT_FALSE(hasZoom); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_docjsactions.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_docjsactions.cpp new file mode 100644 index 000000000000..a7fcdfd07107 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_docjsactions.cpp @@ -0,0 +1,40 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_docjsactions.h" + +#include "core/fpdfdoc/cpdf_nametree.h" + +CPDF_DocJSActions::CPDF_DocJSActions(CPDF_Document* pDoc) : m_pDocument(pDoc) {} + +int CPDF_DocJSActions::CountJSActions() const { + ASSERT(m_pDocument); + CPDF_NameTree name_tree(m_pDocument, "JavaScript"); + return name_tree.GetCount(); +} + +CPDF_Action CPDF_DocJSActions::GetJSAction(int index, + CFX_ByteString& csName) const { + ASSERT(m_pDocument); + CPDF_NameTree name_tree(m_pDocument, "JavaScript"); + CPDF_Object* pAction = name_tree.LookupValue(index, csName); + return ToDictionary(pAction) ? CPDF_Action(pAction->GetDict()) + : CPDF_Action(); +} + +CPDF_Action CPDF_DocJSActions::GetJSAction(const CFX_ByteString& csName) const { + ASSERT(m_pDocument); + CPDF_NameTree name_tree(m_pDocument, "JavaScript"); + CPDF_Object* pAction = name_tree.LookupValue(csName); + return ToDictionary(pAction) ? CPDF_Action(pAction->GetDict()) + : CPDF_Action(); +} + +int CPDF_DocJSActions::FindJSAction(const CFX_ByteString& csName) const { + ASSERT(m_pDocument); + CPDF_NameTree name_tree(m_pDocument, "JavaScript"); + return name_tree.GetIndex(csName); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_docjsactions.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_docjsactions.h new file mode 100644 index 000000000000..8a8d03d3649b --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_docjsactions.h @@ -0,0 +1,29 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_DOCJSACTIONS_H_ +#define CORE_FPDFDOC_CPDF_DOCJSACTIONS_H_ + +#include "core/fpdfdoc/cpdf_action.h" +#include "core/fxcrt/fx_string.h" + +class CPDF_Document; + +class CPDF_DocJSActions { + public: + explicit CPDF_DocJSActions(CPDF_Document* pDoc); + + int CountJSActions() const; + CPDF_Action GetJSAction(int index, CFX_ByteString& csName) const; + CPDF_Action GetJSAction(const CFX_ByteString& csName) const; + int FindJSAction(const CFX_ByteString& csName) const; + CPDF_Document* GetDocument() const { return m_pDocument; } + + private: + CPDF_Document* const m_pDocument; +}; + +#endif // CORE_FPDFDOC_CPDF_DOCJSACTIONS_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_filespec.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_filespec.cpp new file mode 100644 index 000000000000..ce6f9a247e98 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_filespec.cpp @@ -0,0 +1,170 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_filespec.h" + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fxcrt/fx_system.h" + +namespace { + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || \ + _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +CFX_WideString ChangeSlashToPlatform(const FX_WCHAR* str) { + CFX_WideString result; + while (*str) { + if (*str == '/') { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + result += ':'; +#else + result += '\\'; +#endif + } else { + result += *str; + } + str++; + } + return result; +} + +CFX_WideString ChangeSlashToPDF(const FX_WCHAR* str) { + CFX_WideString result; + while (*str) { + if (*str == '\\' || *str == ':') + result += '/'; + else + result += *str; + + str++; + } + return result; +} +#endif // _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_WINDOWS_ + +} // namespace + +CFX_WideString CPDF_FileSpec::DecodeFileName(const CFX_WideStringC& filepath) { + if (filepath.GetLength() <= 1) + return CFX_WideString(); + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + if (filepath.Left(sizeof("/Mac") - 1) == CFX_WideStringC(L"/Mac")) + return ChangeSlashToPlatform(filepath.c_str() + 1); + return ChangeSlashToPlatform(filepath.c_str()); +#elif _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + + if (filepath.GetAt(0) != '/') + return ChangeSlashToPlatform(filepath.c_str()); + if (filepath.GetAt(1) == '/') + return ChangeSlashToPlatform(filepath.c_str() + 1); + if (filepath.GetAt(2) == '/') { + CFX_WideString result; + result += filepath.GetAt(1); + result += ':'; + result += ChangeSlashToPlatform(filepath.c_str() + 2); + return result; + } + CFX_WideString result; + result += '\\'; + result += ChangeSlashToPlatform(filepath.c_str()); + return result; +#else + return CFX_WideString(filepath); +#endif +} + +bool CPDF_FileSpec::GetFileName(CFX_WideString* csFileName) const { + if (CPDF_Dictionary* pDict = m_pObj->AsDictionary()) { + *csFileName = pDict->GetUnicodeTextFor("UF"); + if (csFileName->IsEmpty()) { + *csFileName = + CFX_WideString::FromLocal(pDict->GetStringFor("F").AsStringC()); + } + if (pDict->GetStringFor("FS") == "URL") + return true; + if (csFileName->IsEmpty()) { + if (pDict->KeyExist("DOS")) { + *csFileName = + CFX_WideString::FromLocal(pDict->GetStringFor("DOS").AsStringC()); + } else if (pDict->KeyExist("Mac")) { + *csFileName = + CFX_WideString::FromLocal(pDict->GetStringFor("Mac").AsStringC()); + } else if (pDict->KeyExist("Unix")) { + *csFileName = + CFX_WideString::FromLocal(pDict->GetStringFor("Unix").AsStringC()); + } else { + return false; + } + } + } else if (m_pObj->IsString()) { + *csFileName = CFX_WideString::FromLocal(m_pObj->GetString().AsStringC()); + } else { + return false; + } + *csFileName = DecodeFileName(csFileName->AsStringC()); + return true; +} + +CPDF_FileSpec::CPDF_FileSpec(const CFX_WeakPtr& pPool) { + m_pObj = new CPDF_Dictionary(pPool); + m_pObj->AsDictionary()->SetNewFor("Type", "Filespec"); +} + +CFX_WideString CPDF_FileSpec::EncodeFileName(const CFX_WideStringC& filepath) { + if (filepath.GetLength() <= 1) + return CFX_WideString(); + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + if (filepath.GetAt(1) == ':') { + CFX_WideString result; + result = '/'; + result += filepath.GetAt(0); + if (filepath.GetAt(2) != '\\') + result += '/'; + + result += ChangeSlashToPDF(filepath.c_str() + 2); + return result; + } + if (filepath.GetAt(0) == '\\' && filepath.GetAt(1) == '\\') + return ChangeSlashToPDF(filepath.c_str() + 1); + + if (filepath.GetAt(0) == '\\') { + CFX_WideString result; + result = '/'; + result += ChangeSlashToPDF(filepath.c_str()); + return result; + } + return ChangeSlashToPDF(filepath.c_str()); +#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + if (filepath.Left(sizeof("Mac") - 1) == L"Mac") { + CFX_WideString result; + result = '/'; + result += ChangeSlashToPDF(filepath.c_str()); + return result; + } + return ChangeSlashToPDF(filepath.c_str()); +#else + return CFX_WideString(filepath); +#endif +} + +void CPDF_FileSpec::SetFileName(const CFX_WideStringC& wsFileName) { + if (!m_pObj) + return; + + CFX_WideString wsStr = EncodeFileName(wsFileName); + if (m_pObj->IsString()) { + m_pObj->SetString(CFX_ByteString::FromUnicode(wsStr)); + } else if (CPDF_Dictionary* pDict = m_pObj->AsDictionary()) { + pDict->SetNewFor("F", CFX_ByteString::FromUnicode(wsStr), + false); + pDict->SetNewFor("UF", PDF_EncodeText(wsStr), false); + } +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_filespec.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_filespec.h new file mode 100644 index 000000000000..6266c37a478c --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_filespec.h @@ -0,0 +1,37 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_FILESPEC_H_ +#define CORE_FPDFDOC_CPDF_FILESPEC_H_ + +#include "core/fxcrt/cfx_string_pool_template.h" +#include "core/fxcrt/cfx_weak_ptr.h" +#include "core/fxcrt/fx_string.h" + +class CPDF_Object; + +class CPDF_FileSpec { + public: + explicit CPDF_FileSpec(const CFX_WeakPtr& pPool); + explicit CPDF_FileSpec(CPDF_Object* pObj) : m_pObj(pObj) {} + + // Convert a platform dependent file name into pdf format. + static CFX_WideString EncodeFileName(const CFX_WideStringC& filepath); + + // Convert a pdf file name into platform dependent format. + static CFX_WideString DecodeFileName(const CFX_WideStringC& filepath); + + CPDF_Object* GetObj() const { return m_pObj; } + bool GetFileName(CFX_WideString* wsFileName) const; + + // Set this file spec to refer to a file name (not a url). + void SetFileName(const CFX_WideStringC& wsFileName); + + private: + CPDF_Object* m_pObj; +}; + +#endif // CORE_FPDFDOC_CPDF_FILESPEC_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_filespec_unittest.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_filespec_unittest.cpp new file mode 100644 index 000000000000..d164165f00da --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_filespec_unittest.cpp @@ -0,0 +1,163 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfdoc/cpdf_filespec.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" + +TEST(cpdf_filespec, EncodeDecodeFileName) { + std::vector test_data = { + // Empty src string. + {L"", L""}, + // only file name. + {L"test.pdf", L"test.pdf"}, +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + // With drive identifier. + {L"r:\\pdfdocs\\spec.pdf", L"/r/pdfdocs/spec.pdf"}, + // Relative path. + {L"My Document\\test.pdf", L"My Document/test.pdf"}, + // Absolute path without drive identifier. + {L"\\pdfdocs\\spec.pdf", L"//pdfdocs/spec.pdf"}, + // Absolute path with double backslashes. + {L"\\\\pdfdocs\\spec.pdf", L"/pdfdocs/spec.pdf"}, +// Network resource name. It is not supported yet. +// {L"pclib/eng:\\pdfdocs\\spec.pdf", L"/pclib/eng/pdfdocs/spec.pdf"}, +#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + // Absolute path with colon separator. + {L"Mac HD:PDFDocs:spec.pdf", L"/Mac HD/PDFDocs/spec.pdf"}, + // Relative path with colon separator. + {L"PDFDocs:spec.pdf", L"PDFDocs/spec.pdf"}, +#else + // Relative path. + {L"./docs/test.pdf", L"./docs/test.pdf"}, + // Relative path with parent dir. + {L"../test_docs/test.pdf", L"../test_docs/test.pdf"}, + // Absolute path. + {L"/usr/local/home/test.pdf", L"/usr/local/home/test.pdf"}, +#endif + }; + for (const auto& data : test_data) { + CFX_WideString encoded_str = CPDF_FileSpec::EncodeFileName(data.input); + EXPECT_TRUE(encoded_str == data.expected); + // DecodeFileName is the reverse procedure of EncodeFileName. + CFX_WideString decoded_str = CPDF_FileSpec::DecodeFileName(data.expected); + EXPECT_TRUE(decoded_str == data.input); + } +} + +TEST(cpdf_filespec, GetFileName) { + { + // String object. + pdfium::NullTermWstrFuncTestData test_data = { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + L"/C/docs/test.pdf", + L"C:\\docs\\test.pdf" +#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + L"/Mac HD/docs/test.pdf", + L"Mac HD:docs:test.pdf" +#else + L"/docs/test.pdf", + L"/docs/test.pdf" +#endif + }; + std::unique_ptr str_obj( + new CPDF_String(nullptr, test_data.input)); + CPDF_FileSpec file_spec(str_obj.get()); + CFX_WideString file_name; + EXPECT_TRUE(file_spec.GetFileName(&file_name)); + EXPECT_TRUE(file_name == test_data.expected); + } + { + // Dictionary object. + pdfium::NullTermWstrFuncTestData test_data[5] = { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + {L"/C/docs/test.pdf", L"C:\\docs\\test.pdf"}, + {L"/D/docs/test.pdf", L"D:\\docs\\test.pdf"}, + {L"/E/docs/test.pdf", L"E:\\docs\\test.pdf"}, + {L"/F/docs/test.pdf", L"F:\\docs\\test.pdf"}, + {L"/G/docs/test.pdf", L"G:\\docs\\test.pdf"}, +#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + {L"/Mac HD/docs1/test.pdf", L"Mac HD:docs1:test.pdf"}, + {L"/Mac HD/docs2/test.pdf", L"Mac HD:docs2:test.pdf"}, + {L"/Mac HD/docs3/test.pdf", L"Mac HD:docs3:test.pdf"}, + {L"/Mac HD/docs4/test.pdf", L"Mac HD:docs4:test.pdf"}, + {L"/Mac HD/docs5/test.pdf", L"Mac HD:docs5:test.pdf"}, +#else + {L"/docs/a/test.pdf", L"/docs/a/test.pdf"}, + {L"/docs/b/test.pdf", L"/docs/b/test.pdf"}, + {L"/docs/c/test.pdf", L"/docs/c/test.pdf"}, + {L"/docs/d/test.pdf", L"/docs/d/test.pdf"}, + {L"/docs/e/test.pdf", L"/docs/e/test.pdf"}, +#endif + }; + // Keyword fields in reverse order of precedence to retrieve the file name. + const char* const keywords[5] = {"Unix", "Mac", "DOS", "F", "UF"}; + std::unique_ptr dict_obj(new CPDF_Dictionary()); + CPDF_FileSpec file_spec(dict_obj.get()); + CFX_WideString file_name; + for (int i = 0; i < 5; ++i) { + dict_obj->SetNewFor(keywords[i], test_data[i].input); + EXPECT_TRUE(file_spec.GetFileName(&file_name)); + EXPECT_TRUE(file_name == test_data[i].expected); + } + + // With all the former fields and 'FS' field suggests 'URL' type. + dict_obj->SetNewFor("FS", "URL", false); + EXPECT_TRUE(file_spec.GetFileName(&file_name)); + // Url string is not decoded. + EXPECT_TRUE(file_name == test_data[4].input); + } + { + // Invalid object. + std::unique_ptr name_obj(new CPDF_Name(nullptr, "test.pdf")); + CPDF_FileSpec file_spec(name_obj.get()); + CFX_WideString file_name; + EXPECT_FALSE(file_spec.GetFileName(&file_name)); + } +} + +TEST(cpdf_filespec, SetFileName) { + pdfium::NullTermWstrFuncTestData test_data = { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + L"C:\\docs\\test.pdf", + L"/C/docs/test.pdf" +#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + L"Mac HD:docs:test.pdf", + L"/Mac HD/docs/test.pdf" +#else + L"/docs/test.pdf", + L"/docs/test.pdf" +#endif + }; + // String object. + std::unique_ptr str_obj(new CPDF_String(nullptr, L"babababa")); + CPDF_FileSpec file_spec1(str_obj.get()); + file_spec1.SetFileName(test_data.input); + // Check internal object value. + CFX_ByteString str = CFX_ByteString::FromUnicode(test_data.expected); + EXPECT_TRUE(str == str_obj->GetString()); + // Check we can get the file name back. + CFX_WideString file_name; + EXPECT_TRUE(file_spec1.GetFileName(&file_name)); + EXPECT_TRUE(file_name == test_data.input); + + // Dictionary object. + std::unique_ptr dict_obj(new CPDF_Dictionary()); + CPDF_FileSpec file_spec2(dict_obj.get()); + file_spec2.SetFileName(test_data.input); + // Check internal object value. + file_name = dict_obj->GetUnicodeTextFor("F"); + EXPECT_TRUE(file_name == test_data.expected); + file_name = dict_obj->GetUnicodeTextFor("UF"); + EXPECT_TRUE(file_name == test_data.expected); + // Check we can get the file name back. + EXPECT_TRUE(file_spec2.GetFileName(&file_name)); + EXPECT_TRUE(file_name == test_data.input); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formcontrol.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formcontrol.cpp new file mode 100644 index 000000000000..54edb4910c05 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formcontrol.cpp @@ -0,0 +1,331 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_formcontrol.h" + +#include + +#include "core/fpdfapi/page/cpdf_form.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfapi/render/cpdf_rendercontext.h" +#include "core/fpdfdoc/cpdf_interform.h" +#include "core/fxge/cfx_renderdevice.h" + +namespace { + +const FX_CHAR* const g_sHighlightingMode[] = { + // Must match order of HighlightingMode enum. + "N", "I", "O", "P", "T"}; + +} // namespace + +CPDF_FormControl::CPDF_FormControl(CPDF_FormField* pField, + CPDF_Dictionary* pWidgetDict) + : m_pField(pField), + m_pWidgetDict(pWidgetDict), + m_pForm(m_pField->m_pForm) {} + +CFX_ByteString CPDF_FormControl::GetOnStateName() const { + ASSERT(GetType() == CPDF_FormField::CheckBox || + GetType() == CPDF_FormField::RadioButton); + CFX_ByteString csOn; + CPDF_Dictionary* pAP = m_pWidgetDict->GetDictFor("AP"); + if (!pAP) + return csOn; + + CPDF_Dictionary* pN = pAP->GetDictFor("N"); + if (!pN) + return csOn; + + for (const auto& it : *pN) { + if (it.first != "Off") + return it.first; + } + return CFX_ByteString(); +} + +void CPDF_FormControl::SetOnStateName(const CFX_ByteString& csOn) { + ASSERT(GetType() == CPDF_FormField::CheckBox || + GetType() == CPDF_FormField::RadioButton); + CFX_ByteString csValue = csOn; + if (csValue.IsEmpty()) + csValue = "Yes"; + else if (csValue == "Off") + csValue = "Yes"; + + CFX_ByteString csAS = m_pWidgetDict->GetStringFor("AS", "Off"); + if (csAS != "Off") + m_pWidgetDict->SetNewFor("AS", csValue); + + CPDF_Dictionary* pAP = m_pWidgetDict->GetDictFor("AP"); + if (!pAP) + return; + + for (const auto& it : *pAP) { + CPDF_Object* pObj1 = it.second.get(); + if (!pObj1) + continue; + + CPDF_Object* pObjDirect1 = pObj1->GetDirect(); + CPDF_Dictionary* pSubDict = pObjDirect1->AsDictionary(); + if (!pSubDict) + continue; + + auto subdict_it = pSubDict->begin(); + while (subdict_it != pSubDict->end()) { + const CFX_ByteString& csKey2 = subdict_it->first; + CPDF_Object* pObj2 = subdict_it->second.get(); + ++subdict_it; + if (!pObj2) + continue; + if (csKey2 != "Off") { + pSubDict->ReplaceKey(csKey2, csValue); + break; + } + } + } +} + +CFX_ByteString CPDF_FormControl::GetCheckedAPState() { + ASSERT(GetType() == CPDF_FormField::CheckBox || + GetType() == CPDF_FormField::RadioButton); + CFX_ByteString csOn = GetOnStateName(); + if (GetType() == CPDF_FormField::RadioButton || + GetType() == CPDF_FormField::CheckBox) { + if (ToArray(FPDF_GetFieldAttr(m_pField->m_pDict, "Opt"))) { + int iIndex = m_pField->GetControlIndex(this); + csOn.Format("%d", iIndex); + } + } + if (csOn.IsEmpty()) + csOn = "Yes"; + return csOn; +} + +CFX_WideString CPDF_FormControl::GetExportValue() const { + ASSERT(GetType() == CPDF_FormField::CheckBox || + GetType() == CPDF_FormField::RadioButton); + CFX_ByteString csOn = GetOnStateName(); + if (GetType() == CPDF_FormField::RadioButton || + GetType() == CPDF_FormField::CheckBox) { + if (CPDF_Array* pArray = + ToArray(FPDF_GetFieldAttr(m_pField->m_pDict, "Opt"))) { + int iIndex = m_pField->GetControlIndex(this); + csOn = pArray->GetStringAt(iIndex); + } + } + if (csOn.IsEmpty()) + csOn = "Yes"; + return PDF_DecodeText(csOn); +} + +bool CPDF_FormControl::IsChecked() const { + ASSERT(GetType() == CPDF_FormField::CheckBox || + GetType() == CPDF_FormField::RadioButton); + CFX_ByteString csOn = GetOnStateName(); + CFX_ByteString csAS = m_pWidgetDict->GetStringFor("AS"); + return csAS == csOn; +} + +bool CPDF_FormControl::IsDefaultChecked() const { + ASSERT(GetType() == CPDF_FormField::CheckBox || + GetType() == CPDF_FormField::RadioButton); + CPDF_Object* pDV = FPDF_GetFieldAttr(m_pField->m_pDict, "DV"); + if (!pDV) + return false; + + CFX_ByteString csDV = pDV->GetString(); + CFX_ByteString csOn = GetOnStateName(); + return (csDV == csOn); +} + +void CPDF_FormControl::CheckControl(bool bChecked) { + ASSERT(GetType() == CPDF_FormField::CheckBox || + GetType() == CPDF_FormField::RadioButton); + CFX_ByteString csOn = GetOnStateName(); + CFX_ByteString csOldAS = m_pWidgetDict->GetStringFor("AS", "Off"); + CFX_ByteString csAS = "Off"; + if (bChecked) + csAS = csOn; + if (csOldAS == csAS) + return; + m_pWidgetDict->SetNewFor("AS", csAS); +} + +void CPDF_FormControl::DrawControl(CFX_RenderDevice* pDevice, + CFX_Matrix* pMatrix, + CPDF_Page* pPage, + CPDF_Annot::AppearanceMode mode, + const CPDF_RenderOptions* pOptions) { + if (m_pWidgetDict->GetIntegerFor("F") & ANNOTFLAG_HIDDEN) + return; + + CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pWidgetDict, mode); + if (!pStream) + return; + + CFX_FloatRect form_bbox = pStream->GetDict()->GetRectFor("BBox"); + CFX_Matrix form_matrix = pStream->GetDict()->GetMatrixFor("Matrix"); + form_matrix.TransformRect(form_bbox); + CFX_FloatRect arect = m_pWidgetDict->GetRectFor("Rect"); + CFX_Matrix matrix; + matrix.MatchRect(arect, form_bbox); + matrix.Concat(*pMatrix); + CPDF_Form form(m_pField->m_pForm->m_pDocument, + m_pField->m_pForm->m_pFormDict->GetDictFor("DR"), pStream); + form.ParseContent(nullptr, nullptr, nullptr); + CPDF_RenderContext context(pPage); + context.AppendLayer(&form, &matrix); + context.Render(pDevice, pOptions, nullptr); +} + +CPDF_FormControl::HighlightingMode CPDF_FormControl::GetHighlightingMode() { + if (!m_pWidgetDict) + return Invert; + + CFX_ByteString csH = m_pWidgetDict->GetStringFor("H", "I"); + for (size_t i = 0; i < FX_ArraySize(g_sHighlightingMode); ++i) { + if (csH == g_sHighlightingMode[i]) + return static_cast(i); + } + return Invert; +} + +CPDF_ApSettings CPDF_FormControl::GetMK() const { + return CPDF_ApSettings(m_pWidgetDict ? m_pWidgetDict->GetDictFor("MK") + : nullptr); +} + +bool CPDF_FormControl::HasMKEntry(const CFX_ByteString& csEntry) const { + return GetMK().HasMKEntry(csEntry); +} + +int CPDF_FormControl::GetRotation() { + return GetMK().GetRotation(); +} + +FX_ARGB CPDF_FormControl::GetColor(int& iColorType, + const CFX_ByteString& csEntry) { + return GetMK().GetColor(iColorType, csEntry); +} + +FX_FLOAT CPDF_FormControl::GetOriginalColor(int index, + const CFX_ByteString& csEntry) { + return GetMK().GetOriginalColor(index, csEntry); +} + +void CPDF_FormControl::GetOriginalColor(int& iColorType, + FX_FLOAT fc[4], + const CFX_ByteString& csEntry) { + GetMK().GetOriginalColor(iColorType, fc, csEntry); +} + +CFX_WideString CPDF_FormControl::GetCaption(const CFX_ByteString& csEntry) { + return GetMK().GetCaption(csEntry); +} + +CPDF_Stream* CPDF_FormControl::GetIcon(const CFX_ByteString& csEntry) { + return GetMK().GetIcon(csEntry); +} + +CPDF_IconFit CPDF_FormControl::GetIconFit() { + return GetMK().GetIconFit(); +} + +int CPDF_FormControl::GetTextPosition() { + return GetMK().GetTextPosition(); +} + +CPDF_Action CPDF_FormControl::GetAction() { + if (!m_pWidgetDict) + return CPDF_Action(); + + if (m_pWidgetDict->KeyExist("A")) + return CPDF_Action(m_pWidgetDict->GetDictFor("A")); + + CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "A"); + if (!pObj) + return CPDF_Action(); + + return CPDF_Action(pObj->GetDict()); +} + +CPDF_AAction CPDF_FormControl::GetAdditionalAction() { + if (!m_pWidgetDict) + return CPDF_AAction(); + + if (m_pWidgetDict->KeyExist("AA")) + return CPDF_AAction(m_pWidgetDict->GetDictFor("AA")); + return m_pField->GetAdditionalAction(); +} + +CPDF_DefaultAppearance CPDF_FormControl::GetDefaultAppearance() { + if (!m_pWidgetDict) + return CPDF_DefaultAppearance(); + + if (m_pWidgetDict->KeyExist("DA")) + return CPDF_DefaultAppearance(m_pWidgetDict->GetStringFor("DA")); + + CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "DA"); + if (pObj) + return CPDF_DefaultAppearance(pObj->GetString()); + return m_pField->m_pForm->GetDefaultAppearance(); +} + +CPDF_Font* CPDF_FormControl::GetDefaultControlFont() { + CPDF_DefaultAppearance cDA = GetDefaultAppearance(); + CFX_ByteString csFontNameTag; + FX_FLOAT fFontSize; + cDA.GetFont(csFontNameTag, fFontSize); + if (csFontNameTag.IsEmpty()) + return nullptr; + + CPDF_Object* pObj = FPDF_GetFieldAttr(m_pWidgetDict, "DR"); + if (CPDF_Dictionary* pDict = ToDictionary(pObj)) { + CPDF_Dictionary* pFonts = pDict->GetDictFor("Font"); + if (pFonts) { + CPDF_Dictionary* pElement = pFonts->GetDictFor(csFontNameTag); + if (pElement) { + CPDF_Font* pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement); + if (pFont) + return pFont; + } + } + } + if (CPDF_Font* pFormFont = m_pField->m_pForm->GetFormFont(csFontNameTag)) + return pFormFont; + + CPDF_Dictionary* pPageDict = m_pWidgetDict->GetDictFor("P"); + pObj = FPDF_GetFieldAttr(pPageDict, "Resources"); + if (CPDF_Dictionary* pDict = ToDictionary(pObj)) { + CPDF_Dictionary* pFonts = pDict->GetDictFor("Font"); + if (pFonts) { + CPDF_Dictionary* pElement = pFonts->GetDictFor(csFontNameTag); + if (pElement) { + CPDF_Font* pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement); + if (pFont) + return pFont; + } + } + } + return nullptr; +} + +int CPDF_FormControl::GetControlAlignment() { + if (!m_pWidgetDict) + return 0; + if (m_pWidgetDict->KeyExist("Q")) + return m_pWidgetDict->GetIntegerFor("Q", 0); + + CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "Q"); + if (pObj) + return pObj->GetInteger(); + return m_pField->m_pForm->GetFormAlignment(); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formcontrol.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formcontrol.h new file mode 100644 index 000000000000..c0dad3909852 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formcontrol.h @@ -0,0 +1,134 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_FORMCONTROL_H_ +#define CORE_FPDFDOC_CPDF_FORMCONTROL_H_ + +#include "core/fpdfdoc/cpdf_aaction.h" +#include "core/fpdfdoc/cpdf_action.h" +#include "core/fpdfdoc/cpdf_annot.h" +#include "core/fpdfdoc/cpdf_annotlist.h" +#include "core/fpdfdoc/cpdf_apsettings.h" +#include "core/fpdfdoc/cpdf_defaultappearance.h" +#include "core/fpdfdoc/cpdf_formfield.h" +#include "core/fpdfdoc/cpdf_iconfit.h" +#include "core/fpdfdoc/ipdf_formnotify.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxge/fx_dib.h" + +#define TEXTPOS_CAPTION 0 +#define TEXTPOS_ICON 1 +#define TEXTPOS_BELOW 2 +#define TEXTPOS_ABOVE 3 +#define TEXTPOS_RIGHT 4 +#define TEXTPOS_LEFT 5 +#define TEXTPOS_OVERLAID 6 + +#define COLORTYPE_TRANSPARENT 0 +#define COLORTYPE_GRAY 1 +#define COLORTYPE_RGB 2 +#define COLORTYPE_CMYK 3 + +class CFX_RenderDevice; +class CPDF_Dictionary; +class CPDF_Font; +class CPDF_FormField; +class CPDF_InterForm; +class CPDF_OCContext; +class CPDF_RenderOptions; +class CPDF_Stream; + +class CPDF_FormControl { + public: + enum HighlightingMode { None = 0, Invert, Outline, Push, Toggle }; + + CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict); + + CPDF_FormField::Type GetType() const { return m_pField->GetType(); } + CPDF_InterForm* GetInterForm() const { return m_pForm; } + CPDF_FormField* GetField() const { return m_pField; } + CPDF_Dictionary* GetWidget() const { return m_pWidgetDict; } + CFX_FloatRect GetRect() const { return m_pWidgetDict->GetRectFor("Rect"); } + + void DrawControl(CFX_RenderDevice* pDevice, + CFX_Matrix* pMatrix, + CPDF_Page* pPage, + CPDF_Annot::AppearanceMode mode, + const CPDF_RenderOptions* pOptions = nullptr); + + CFX_ByteString GetCheckedAPState(); + CFX_WideString GetExportValue() const; + + bool IsChecked() const; + bool IsDefaultChecked() const; + + HighlightingMode GetHighlightingMode(); + bool HasMKEntry(const CFX_ByteString& csEntry) const; + int GetRotation(); + + FX_ARGB GetBorderColor(int& iColorType) { return GetColor(iColorType, "BC"); } + + FX_FLOAT GetOriginalBorderColor(int index) { + return GetOriginalColor(index, "BC"); + } + + void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) { + GetOriginalColor(iColorType, fc, "BC"); + } + + FX_ARGB GetBackgroundColor(int& iColorType) { + return GetColor(iColorType, "BG"); + } + + FX_FLOAT GetOriginalBackgroundColor(int index) { + return GetOriginalColor(index, "BG"); + } + + void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) { + GetOriginalColor(iColorType, fc, "BG"); + } + + CFX_WideString GetNormalCaption() { return GetCaption("CA"); } + CFX_WideString GetRolloverCaption() { return GetCaption("RC"); } + CFX_WideString GetDownCaption() { return GetCaption("AC"); } + + CPDF_Stream* GetNormalIcon() { return GetIcon("I"); } + CPDF_Stream* GetRolloverIcon() { return GetIcon("RI"); } + CPDF_Stream* GetDownIcon() { return GetIcon("IX"); } + CPDF_IconFit GetIconFit(); + + int GetTextPosition(); + CPDF_Action GetAction(); + CPDF_AAction GetAdditionalAction(); + CPDF_DefaultAppearance GetDefaultAppearance(); + + CPDF_Font* GetDefaultControlFont(); + int GetControlAlignment(); + + private: + friend class CPDF_InterForm; + friend class CPDF_FormField; + + CFX_ByteString GetOnStateName() const; + void SetOnStateName(const CFX_ByteString& csOn); + void CheckControl(bool bChecked); + FX_ARGB GetColor(int& iColorType, const CFX_ByteString& csEntry); + FX_FLOAT GetOriginalColor(int index, const CFX_ByteString& csEntry); + void GetOriginalColor(int& iColorType, + FX_FLOAT fc[4], + const CFX_ByteString& csEntry); + + CFX_WideString GetCaption(const CFX_ByteString& csEntry); + CPDF_Stream* GetIcon(const CFX_ByteString& csEntry); + CPDF_ApSettings GetMK() const; + + CPDF_FormField* const m_pField; + CPDF_Dictionary* const m_pWidgetDict; + CPDF_InterForm* const m_pForm; +}; + +#endif // CORE_FPDFDOC_CPDF_FORMCONTROL_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formfield.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formfield.cpp new file mode 100644 index 000000000000..b4aa90e2bebc --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formfield.cpp @@ -0,0 +1,984 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_formfield.h" + +#include +#include +#include + +#include "core/fpdfapi/parser/cfdf_document.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_simple_parser.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfdoc/cpdf_formcontrol.h" +#include "core/fpdfdoc/cpdf_interform.h" +#include "core/fpdfdoc/cpvt_generateap.h" +#include "third_party/base/stl_util.h" + +namespace { + +const int kMaxRecursion = 32; + +const int kFormListMultiSelect = 0x100; + +const int kFormComboEdit = 0x100; + +const int kFormRadioNoToggleOff = 0x100; +const int kFormRadioUnison = 0x200; + +const int kFormTextMultiLine = 0x100; +const int kFormTextPassword = 0x200; +const int kFormTextNoScroll = 0x400; +const int kFormTextComb = 0x800; + +bool IsUnison(CPDF_FormField* pField) { + if (pField->GetType() == CPDF_FormField::CheckBox) + return true; + return (pField->GetFieldFlags() & 0x2000000) != 0; +} + +} // namespace + +CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, + const FX_CHAR* name, + int nLevel) { + if (nLevel > kMaxRecursion) + return nullptr; + if (!pFieldDict) + return nullptr; + + CPDF_Object* pAttr = pFieldDict->GetDirectObjectFor(name); + if (pAttr) + return pAttr; + + CPDF_Dictionary* pParent = pFieldDict->GetDictFor("Parent"); + if (!pParent) + return nullptr; + return FPDF_GetFieldAttr(pParent, name, nLevel + 1); +} + +CFX_WideString FPDF_GetFullName(CPDF_Dictionary* pFieldDict) { + CFX_WideString full_name; + std::set visited; + CPDF_Dictionary* pLevel = pFieldDict; + while (pLevel) { + visited.insert(pLevel); + CFX_WideString short_name = pLevel->GetUnicodeTextFor("T"); + if (!short_name.IsEmpty()) { + if (full_name.IsEmpty()) + full_name = short_name; + else + full_name = short_name + L"." + full_name; + } + pLevel = pLevel->GetDictFor("Parent"); + if (pdfium::ContainsKey(visited, pLevel)) + break; + } + return full_name; +} + +CPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict) + : m_Type(Unknown), + m_pForm(pForm), + m_pDict(pDict), + m_FontSize(0), + m_pFont(nullptr) { + SyncFieldFlags(); +} + +CPDF_FormField::~CPDF_FormField() {} + +void CPDF_FormField::SyncFieldFlags() { + CFX_ByteString type_name = FPDF_GetFieldAttr(m_pDict, "FT") + ? FPDF_GetFieldAttr(m_pDict, "FT")->GetString() + : CFX_ByteString(); + uint32_t flags = FPDF_GetFieldAttr(m_pDict, "Ff") + ? FPDF_GetFieldAttr(m_pDict, "Ff")->GetInteger() + : 0; + m_Flags = 0; + if (flags & FORMFLAG_READONLY) + m_Flags |= FORMFLAG_READONLY; + if (flags & FORMFLAG_REQUIRED) + m_Flags |= FORMFLAG_REQUIRED; + if (flags & FORMFLAG_NOEXPORT) + m_Flags |= FORMFLAG_NOEXPORT; + + if (type_name == "Btn") { + if (flags & 0x8000) { + m_Type = RadioButton; + if (flags & 0x4000) + m_Flags |= kFormRadioNoToggleOff; + if (flags & 0x2000000) + m_Flags |= kFormRadioUnison; + } else if (flags & 0x10000) { + m_Type = PushButton; + } else { + m_Type = CheckBox; + } + } else if (type_name == "Tx") { + if (flags & 0x100000) { + m_Type = File; + } else if (flags & 0x2000000) { + m_Type = RichText; + } else { + m_Type = Text; + if (flags & 0x1000) + m_Flags |= kFormTextMultiLine; + if (flags & 0x2000) + m_Flags |= kFormTextPassword; + if (flags & 0x800000) + m_Flags |= kFormTextNoScroll; + if (flags & 0x100000) + m_Flags |= kFormTextComb; + } + LoadDA(); + } else if (type_name == "Ch") { + if (flags & 0x20000) { + m_Type = ComboBox; + if (flags & 0x40000) + m_Flags |= kFormComboEdit; + } else { + m_Type = ListBox; + if (flags & 0x200000) + m_Flags |= kFormListMultiSelect; + } + LoadDA(); + } else if (type_name == "Sig") { + m_Type = Sign; + } +} + +CFX_WideString CPDF_FormField::GetFullName() const { + return FPDF_GetFullName(m_pDict); +} + +bool CPDF_FormField::ResetField(bool bNotify) { + switch (m_Type) { + case CPDF_FormField::CheckBox: + case CPDF_FormField::RadioButton: { + int iCount = CountControls(); + if (iCount) { + // TODO(weili): Check whether anything special needs to be done for + // unison field. Otherwise, merge these branches. + if (IsUnison(this)) { + for (int i = 0; i < iCount; i++) + CheckControl(i, GetControl(i)->IsDefaultChecked(), false); + } else { + for (int i = 0; i < iCount; i++) + CheckControl(i, GetControl(i)->IsDefaultChecked(), false); + } + } + if (bNotify && m_pForm->m_pFormNotify) + m_pForm->m_pFormNotify->AfterCheckedStatusChange(this); + break; + } + case CPDF_FormField::ComboBox: + case CPDF_FormField::ListBox: { + CFX_WideString csValue; + ClearSelection(); + int iIndex = GetDefaultSelectedItem(); + if (iIndex >= 0) + csValue = GetOptionLabel(iIndex); + + if (bNotify && !NotifyListOrComboBoxBeforeChange(csValue)) + return false; + + SetItemSelection(iIndex, true); + if (bNotify) + NotifyListOrComboBoxAfterChange(); + break; + } + case CPDF_FormField::Text: + case CPDF_FormField::RichText: + case CPDF_FormField::File: + default: { + CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict, "DV"); + CFX_WideString csDValue; + if (pDV) + csDValue = pDV->GetUnicodeText(); + + CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V"); + CFX_WideString csValue; + if (pV) + csValue = pV->GetUnicodeText(); + + CPDF_Object* pRV = FPDF_GetFieldAttr(m_pDict, "RV"); + if (!pRV && (csDValue == csValue)) + return false; + + if (bNotify && !NotifyBeforeValueChange(csDValue)) + return false; + + if (pDV) { + std::unique_ptr pClone = pDV->Clone(); + if (!pClone) + return false; + + m_pDict->SetFor("V", std::move(pClone)); + if (pRV) + m_pDict->SetFor("RV", pDV->Clone()); + } else { + m_pDict->RemoveFor("V"); + m_pDict->RemoveFor("RV"); + } + if (bNotify) + NotifyAfterValueChange(); + break; + } + } + return true; +} + +int CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl) const { + if (!pControl) + return -1; + + auto it = std::find(m_ControlList.begin(), m_ControlList.end(), pControl); + return it != m_ControlList.end() ? it - m_ControlList.begin() : -1; +} + +int CPDF_FormField::GetFieldType() const { + switch (m_Type) { + case PushButton: + return FIELDTYPE_PUSHBUTTON; + case CheckBox: + return FIELDTYPE_CHECKBOX; + case RadioButton: + return FIELDTYPE_RADIOBUTTON; + case ComboBox: + return FIELDTYPE_COMBOBOX; + case ListBox: + return FIELDTYPE_LISTBOX; + case Text: + case RichText: + case File: + return FIELDTYPE_TEXTFIELD; + case Sign: + return FIELDTYPE_SIGNATURE; + default: + break; + } + return FIELDTYPE_UNKNOWN; +} + +CPDF_AAction CPDF_FormField::GetAdditionalAction() const { + CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "AA"); + return CPDF_AAction(pObj ? pObj->GetDict() : nullptr); +} + +CFX_WideString CPDF_FormField::GetAlternateName() const { + CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TU"); + return pObj ? pObj->GetUnicodeText() : L""; +} + +CFX_WideString CPDF_FormField::GetMappingName() const { + CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TM"); + return pObj ? pObj->GetUnicodeText() : L""; +} + +uint32_t CPDF_FormField::GetFieldFlags() const { + CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "Ff"); + return pObj ? pObj->GetInteger() : 0; +} + +CFX_ByteString CPDF_FormField::GetDefaultStyle() const { + CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DS"); + return pObj ? pObj->GetString() : ""; +} + +CFX_WideString CPDF_FormField::GetRichTextString() const { + CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "RV"); + return pObj ? pObj->GetUnicodeText() : L""; +} + +CFX_WideString CPDF_FormField::GetValue(bool bDefault) const { + if (GetType() == CheckBox || GetType() == RadioButton) + return GetCheckValue(bDefault); + + CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? "DV" : "V"); + if (!pValue) { + if (!bDefault) { + if (m_Type == RichText) + pValue = FPDF_GetFieldAttr(m_pDict, "V"); + if (!pValue && m_Type != Text) + pValue = FPDF_GetFieldAttr(m_pDict, "DV"); + } + if (!pValue) + return CFX_WideString(); + } + + switch (pValue->GetType()) { + case CPDF_Object::STRING: + case CPDF_Object::STREAM: + return pValue->GetUnicodeText(); + case CPDF_Object::ARRAY: + pValue = pValue->AsArray()->GetDirectObjectAt(0); + if (pValue) + return pValue->GetUnicodeText(); + break; + default: + break; + } + return CFX_WideString(); +} + +CFX_WideString CPDF_FormField::GetValue() const { + return GetValue(false); +} + +CFX_WideString CPDF_FormField::GetDefaultValue() const { + return GetValue(true); +} + +bool CPDF_FormField::SetValue(const CFX_WideString& value, + bool bDefault, + bool bNotify) { + switch (m_Type) { + case CheckBox: + case RadioButton: { + SetCheckValue(value, bDefault, bNotify); + return true; + } + case File: + case RichText: + case Text: + case ComboBox: { + CFX_WideString csValue = value; + if (bNotify && !NotifyBeforeValueChange(csValue)) + return false; + + CFX_ByteString key(bDefault ? "DV" : "V"); + int iIndex = FindOptionValue(csValue); + if (iIndex < 0) { + CFX_ByteString bsEncodeText = PDF_EncodeText(csValue); + m_pDict->SetNewFor(key, bsEncodeText, false); + if (m_Type == RichText && !bDefault) + m_pDict->SetNewFor("RV", bsEncodeText, false); + m_pDict->RemoveFor("I"); + } else { + m_pDict->SetNewFor(key, PDF_EncodeText(csValue), false); + if (!bDefault) { + ClearSelection(); + SetItemSelection(iIndex, true); + } + } + if (bNotify) + NotifyAfterValueChange(); + break; + } + case ListBox: { + int iIndex = FindOptionValue(value); + if (iIndex < 0) + return false; + + if (bDefault && iIndex == GetDefaultSelectedItem()) + return false; + + if (bNotify && !NotifyBeforeSelectionChange(value)) + return false; + + if (!bDefault) { + ClearSelection(); + SetItemSelection(iIndex, true); + } + if (bNotify) + NotifyAfterSelectionChange(); + break; + } + default: + break; + } + return true; +} + +bool CPDF_FormField::SetValue(const CFX_WideString& value, bool bNotify) { + return SetValue(value, false, bNotify); +} + +int CPDF_FormField::GetMaxLen() const { + if (CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "MaxLen")) + return pObj->GetInteger(); + + for (const auto& pControl : m_ControlList) { + if (!pControl) + continue; + CPDF_Dictionary* pWidgetDict = pControl->m_pWidgetDict; + if (pWidgetDict->KeyExist("MaxLen")) + return pWidgetDict->GetIntegerFor("MaxLen"); + } + return 0; +} + +int CPDF_FormField::CountSelectedItems() const { + CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); + if (!pValue) { + pValue = FPDF_GetFieldAttr(m_pDict, "I"); + if (!pValue) + return 0; + } + + if (pValue->IsString() || pValue->IsNumber()) + return pValue->GetString().IsEmpty() ? 0 : 1; + if (CPDF_Array* pArray = pValue->AsArray()) + return pArray->GetCount(); + return 0; +} + +int CPDF_FormField::GetSelectedIndex(int index) const { + CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); + if (!pValue) { + pValue = FPDF_GetFieldAttr(m_pDict, "I"); + if (!pValue) + return -1; + } + if (pValue->IsNumber()) + return pValue->GetInteger(); + + CFX_WideString sel_value; + if (pValue->IsString()) { + if (index != 0) + return -1; + sel_value = pValue->GetUnicodeText(); + } else { + CPDF_Array* pArray = pValue->AsArray(); + if (!pArray || index < 0) + return -1; + + CPDF_Object* elementValue = pArray->GetDirectObjectAt(index); + sel_value = + elementValue ? elementValue->GetUnicodeText() : CFX_WideString(); + } + if (index < CountSelectedOptions()) { + int iOptIndex = GetSelectedOptionIndex(index); + CFX_WideString csOpt = GetOptionValue(iOptIndex); + if (csOpt == sel_value) + return iOptIndex; + } + for (int i = 0; i < CountOptions(); i++) { + if (sel_value == GetOptionValue(i)) + return i; + } + return -1; +} + +bool CPDF_FormField::ClearSelection(bool bNotify) { + if (bNotify && m_pForm->m_pFormNotify) { + CFX_WideString csValue; + int iIndex = GetSelectedIndex(0); + if (iIndex >= 0) + csValue = GetOptionLabel(iIndex); + + if (!NotifyListOrComboBoxBeforeChange(csValue)) + return false; + } + m_pDict->RemoveFor("V"); + m_pDict->RemoveFor("I"); + if (bNotify) + NotifyListOrComboBoxAfterChange(); + return true; +} + +bool CPDF_FormField::IsItemSelected(int index) const { + ASSERT(GetType() == ComboBox || GetType() == ListBox); + if (index < 0 || index >= CountOptions()) + return false; + if (IsOptionSelected(index)) + return true; + + CFX_WideString opt_value = GetOptionValue(index); + CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); + if (!pValue) { + pValue = FPDF_GetFieldAttr(m_pDict, "I"); + if (!pValue) + return false; + } + + if (pValue->IsString()) + return pValue->GetUnicodeText() == opt_value; + + if (pValue->IsNumber()) { + if (pValue->GetString().IsEmpty()) + return false; + return (pValue->GetInteger() == index); + } + + CPDF_Array* pArray = pValue->AsArray(); + if (!pArray) + return false; + + int iPos = -1; + for (int j = 0; j < CountSelectedOptions(); j++) { + if (GetSelectedOptionIndex(j) == index) { + iPos = j; + break; + } + } + for (int i = 0; i < static_cast(pArray->GetCount()); i++) + if (pArray->GetDirectObjectAt(i)->GetUnicodeText() == opt_value && + i == iPos) { + return true; + } + return false; +} + +bool CPDF_FormField::SetItemSelection(int index, bool bSelected, bool bNotify) { + ASSERT(GetType() == ComboBox || GetType() == ListBox); + if (index < 0 || index >= CountOptions()) + return false; + + CFX_WideString opt_value = GetOptionValue(index); + if (bNotify && !NotifyListOrComboBoxBeforeChange(opt_value)) + return false; + + if (bSelected) { + if (GetType() == ListBox) { + SelectOption(index, true); + if (!(m_Flags & kFormListMultiSelect)) { + m_pDict->SetNewFor("V", PDF_EncodeText(opt_value), false); + } else { + CPDF_Array* pArray = m_pDict->SetNewFor("V"); + for (int i = 0; i < CountOptions(); i++) { + if (i == index || IsItemSelected(i)) { + opt_value = GetOptionValue(i); + pArray->AddNew(PDF_EncodeText(opt_value), false); + } + } + } + } else { + m_pDict->SetNewFor("V", PDF_EncodeText(opt_value), false); + CPDF_Array* pI = m_pDict->SetNewFor("I"); + pI->AddNew(index); + } + } else { + CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); + if (pValue) { + if (GetType() == ListBox) { + SelectOption(index, false); + if (pValue->IsString()) { + if (pValue->GetUnicodeText() == opt_value) + m_pDict->RemoveFor("V"); + } else if (pValue->IsArray()) { + std::unique_ptr pArray(new CPDF_Array); + for (int i = 0; i < CountOptions(); i++) { + if (i != index && IsItemSelected(i)) { + opt_value = GetOptionValue(i); + pArray->AddNew(PDF_EncodeText(opt_value), false); + } + } + if (pArray->GetCount() > 0) + m_pDict->SetFor("V", std::move(pArray)); + } + } else { + m_pDict->RemoveFor("V"); + m_pDict->RemoveFor("I"); + } + } + } + if (bNotify) + NotifyListOrComboBoxAfterChange(); + return true; +} + +bool CPDF_FormField::IsItemDefaultSelected(int index) const { + ASSERT(GetType() == ComboBox || GetType() == ListBox); + if (index < 0 || index >= CountOptions()) + return false; + int iDVIndex = GetDefaultSelectedItem(); + return iDVIndex >= 0 && iDVIndex == index; +} + +int CPDF_FormField::GetDefaultSelectedItem() const { + ASSERT(GetType() == ComboBox || GetType() == ListBox); + CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "DV"); + if (!pValue) + return -1; + CFX_WideString csDV = pValue->GetUnicodeText(); + if (csDV.IsEmpty()) + return -1; + for (int i = 0; i < CountOptions(); i++) { + if (csDV == GetOptionValue(i)) + return i; + } + return -1; +} + +int CPDF_FormField::CountOptions() const { + CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt")); + return pArray ? pArray->GetCount() : 0; +} + +CFX_WideString CPDF_FormField::GetOptionText(int index, int sub_index) const { + CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt")); + if (!pArray) + return CFX_WideString(); + + CPDF_Object* pOption = pArray->GetDirectObjectAt(index); + if (!pOption) + return CFX_WideString(); + if (CPDF_Array* pOptionArray = pOption->AsArray()) + pOption = pOptionArray->GetDirectObjectAt(sub_index); + + CPDF_String* pString = ToString(pOption); + return pString ? pString->GetUnicodeText() : CFX_WideString(); +} + +CFX_WideString CPDF_FormField::GetOptionLabel(int index) const { + return GetOptionText(index, 1); +} + +CFX_WideString CPDF_FormField::GetOptionValue(int index) const { + return GetOptionText(index, 0); +} + +int CPDF_FormField::FindOption(CFX_WideString csOptLabel) const { + for (int i = 0; i < CountOptions(); i++) { + if (GetOptionValue(i) == csOptLabel) + return i; + } + return -1; +} + +int CPDF_FormField::FindOptionValue(const CFX_WideString& csOptValue) const { + for (int i = 0; i < CountOptions(); i++) { + if (GetOptionValue(i) == csOptValue) + return i; + } + return -1; +} + +#ifdef PDF_ENABLE_XFA +int CPDF_FormField::InsertOption(CFX_WideString csOptLabel, + int index, + bool bNotify) { + if (csOptLabel.IsEmpty()) + return -1; + + if (bNotify && !NotifyListOrComboBoxBeforeChange(csOptLabel)) + return -1; + + CFX_ByteString csStr = + PDF_EncodeText(csOptLabel.c_str(), csOptLabel.GetLength()); + CPDF_Array* pOpt = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt")); + if (!pOpt) + pOpt = m_pDict->SetNewFor("Opt"); + + int iCount = pdfium::base::checked_cast(pOpt->GetCount()); + if (index >= iCount) { + pOpt->AddNew(csStr, false); + index = iCount; + } else { + pOpt->InsertNewAt(index, csStr, false); + } + + if (bNotify) + NotifyListOrComboBoxAfterChange(); + return index; +} + +bool CPDF_FormField::ClearOptions(bool bNotify) { + if (bNotify && m_pForm->m_pFormNotify) { + CFX_WideString csValue; + int iIndex = GetSelectedIndex(0); + if (iIndex >= 0) + csValue = GetOptionLabel(iIndex); + if (!NotifyListOrComboBoxBeforeChange(csValue)) + return false; + } + + m_pDict->RemoveFor("Opt"); + m_pDict->RemoveFor("V"); + m_pDict->RemoveFor("DV"); + m_pDict->RemoveFor("I"); + m_pDict->RemoveFor("TI"); + + if (bNotify) + NotifyListOrComboBoxAfterChange(); + + return true; +} +#endif // PDF_ENABLE_XFA + +bool CPDF_FormField::CheckControl(int iControlIndex, + bool bChecked, + bool bNotify) { + ASSERT(GetType() == CheckBox || GetType() == RadioButton); + CPDF_FormControl* pControl = GetControl(iControlIndex); + if (!pControl) + return false; + if (!bChecked && pControl->IsChecked() == bChecked) + return false; + + CFX_WideString csWExport = pControl->GetExportValue(); + CFX_ByteString csBExport = PDF_EncodeText(csWExport); + int iCount = CountControls(); + bool bUnison = IsUnison(this); + for (int i = 0; i < iCount; i++) { + CPDF_FormControl* pCtrl = GetControl(i); + if (bUnison) { + CFX_WideString csEValue = pCtrl->GetExportValue(); + if (csEValue == csWExport) { + if (pCtrl->GetOnStateName() == pControl->GetOnStateName()) + pCtrl->CheckControl(bChecked); + else if (bChecked) + pCtrl->CheckControl(false); + } else if (bChecked) { + pCtrl->CheckControl(false); + } + } else { + if (i == iControlIndex) + pCtrl->CheckControl(bChecked); + else if (bChecked) + pCtrl->CheckControl(false); + } + } + + CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pDict, "Opt"); + if (!ToArray(pOpt)) { + if (bChecked) { + m_pDict->SetNewFor("V", csBExport); + } else { + CFX_ByteString csV; + CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V"); + if (pV) + csV = pV->GetString(); + if (csV == csBExport) + m_pDict->SetNewFor("V", "Off"); + } + } else if (bChecked) { + CFX_ByteString csIndex; + csIndex.Format("%d", iControlIndex); + m_pDict->SetNewFor("V", csIndex); + } + if (bNotify && m_pForm->m_pFormNotify) + m_pForm->m_pFormNotify->AfterCheckedStatusChange(this); + return true; +} + +CFX_WideString CPDF_FormField::GetCheckValue(bool bDefault) const { + ASSERT(GetType() == CheckBox || GetType() == RadioButton); + CFX_WideString csExport = L"Off"; + int iCount = CountControls(); + for (int i = 0; i < iCount; i++) { + CPDF_FormControl* pControl = GetControl(i); + bool bChecked = + bDefault ? pControl->IsDefaultChecked() : pControl->IsChecked(); + if (bChecked) { + csExport = pControl->GetExportValue(); + break; + } + } + return csExport; +} + +bool CPDF_FormField::SetCheckValue(const CFX_WideString& value, + bool bDefault, + bool bNotify) { + ASSERT(GetType() == CheckBox || GetType() == RadioButton); + int iCount = CountControls(); + for (int i = 0; i < iCount; i++) { + CPDF_FormControl* pControl = GetControl(i); + CFX_WideString csExport = pControl->GetExportValue(); + bool val = csExport == value; + if (!bDefault) + CheckControl(GetControlIndex(pControl), val); + if (val) + break; + } + if (bNotify && m_pForm->m_pFormNotify) + m_pForm->m_pFormNotify->AfterCheckedStatusChange(this); + return true; +} + +int CPDF_FormField::GetTopVisibleIndex() const { + CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TI"); + return pObj ? pObj->GetInteger() : 0; +} + +int CPDF_FormField::CountSelectedOptions() const { + CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "I")); + return pArray ? pArray->GetCount() : 0; +} + +int CPDF_FormField::GetSelectedOptionIndex(int index) const { + CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "I")); + if (!pArray) + return -1; + + int iCount = pArray->GetCount(); + if (iCount < 0 || index >= iCount) + return -1; + return pArray->GetIntegerAt(index); +} + +bool CPDF_FormField::IsOptionSelected(int iOptIndex) const { + CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "I")); + if (!pArray) + return false; + + for (const auto& pObj : *pArray) { + if (pObj->GetInteger() == iOptIndex) + return true; + } + return false; +} + +bool CPDF_FormField::SelectOption(int iOptIndex, bool bSelected, bool bNotify) { + CPDF_Array* pArray = m_pDict->GetArrayFor("I"); + if (!pArray) { + if (!bSelected) + return true; + + pArray = m_pDict->SetNewFor("I"); + } + + bool bReturn = false; + for (size_t i = 0; i < pArray->GetCount(); i++) { + int iFind = pArray->GetIntegerAt(i); + if (iFind == iOptIndex) { + if (bSelected) + return true; + + if (bNotify && m_pForm->m_pFormNotify) { + CFX_WideString csValue = GetOptionLabel(iOptIndex); + if (!NotifyListOrComboBoxBeforeChange(csValue)) + return false; + } + pArray->RemoveAt(i); + bReturn = true; + break; + } + + if (iFind > iOptIndex) { + if (!bSelected) + continue; + + if (bNotify && m_pForm->m_pFormNotify) { + CFX_WideString csValue = GetOptionLabel(iOptIndex); + if (!NotifyListOrComboBoxBeforeChange(csValue)) + return false; + } + pArray->InsertNewAt(i, iOptIndex); + bReturn = true; + break; + } + } + if (!bReturn) { + if (bSelected) + pArray->AddNew(iOptIndex); + + if (pArray->IsEmpty()) + m_pDict->RemoveFor("I"); + } + if (bNotify) + NotifyListOrComboBoxAfterChange(); + + return true; +} + +bool CPDF_FormField::ClearSelectedOptions(bool bNotify) { + if (bNotify && m_pForm->m_pFormNotify) { + CFX_WideString csValue; + int iIndex = GetSelectedIndex(0); + if (iIndex >= 0) + csValue = GetOptionLabel(iIndex); + + if (!NotifyListOrComboBoxBeforeChange(csValue)) + return false; + } + m_pDict->RemoveFor("I"); + if (bNotify) + NotifyListOrComboBoxAfterChange(); + + return true; +} + +void CPDF_FormField::LoadDA() { + CPDF_Dictionary* pFormDict = m_pForm->m_pFormDict; + if (!pFormDict) + return; + + CFX_ByteString DA; + if (CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DA")) + DA = pObj->GetString(); + + if (DA.IsEmpty()) + DA = pFormDict->GetStringFor("DA"); + + if (DA.IsEmpty()) + return; + + CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); + if (!pDR) + return; + + CPDF_Dictionary* pFont = pDR->GetDictFor("Font"); + if (!pFont) + return; + + CPDF_SimpleParser syntax(DA.AsStringC()); + syntax.FindTagParamFromStart("Tf", 2); + CFX_ByteString font_name(syntax.GetWord()); + CPDF_Dictionary* pFontDict = pFont->GetDictFor(font_name); + if (!pFontDict) + return; + + m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict); + m_FontSize = FX_atof(syntax.GetWord()); +} + +bool CPDF_FormField::NotifyBeforeSelectionChange(const CFX_WideString& value) { + if (!m_pForm->m_pFormNotify) + return true; + return m_pForm->m_pFormNotify->BeforeSelectionChange(this, value) >= 0; +} + +void CPDF_FormField::NotifyAfterSelectionChange() { + if (!m_pForm->m_pFormNotify) + return; + m_pForm->m_pFormNotify->AfterSelectionChange(this); +} + +bool CPDF_FormField::NotifyBeforeValueChange(const CFX_WideString& value) { + if (!m_pForm->m_pFormNotify) + return true; + return m_pForm->m_pFormNotify->BeforeValueChange(this, value) >= 0; +} + +void CPDF_FormField::NotifyAfterValueChange() { + if (!m_pForm->m_pFormNotify) + return; + m_pForm->m_pFormNotify->AfterValueChange(this); +} + +bool CPDF_FormField::NotifyListOrComboBoxBeforeChange( + const CFX_WideString& value) { + switch (GetType()) { + case ListBox: + return NotifyBeforeSelectionChange(value); + case ComboBox: + return NotifyBeforeValueChange(value); + default: + return true; + } +} + +void CPDF_FormField::NotifyListOrComboBoxAfterChange() { + switch (GetType()) { + case ListBox: + NotifyAfterSelectionChange(); + break; + case ComboBox: + NotifyAfterValueChange(); + break; + default: + break; + } +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formfield.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formfield.h new file mode 100644 index 000000000000..42608b1122d7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formfield.h @@ -0,0 +1,167 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_FORMFIELD_H_ +#define CORE_FPDFDOC_CPDF_FORMFIELD_H_ + +#include + +#include "core/fpdfdoc/cpdf_aaction.h" +#include "core/fpdfdoc/cpdf_formfield.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" +#include "third_party/base/stl_util.h" + +#define FIELDTYPE_UNKNOWN 0 +#define FIELDTYPE_PUSHBUTTON 1 +#define FIELDTYPE_CHECKBOX 2 +#define FIELDTYPE_RADIOBUTTON 3 +#define FIELDTYPE_COMBOBOX 4 +#define FIELDTYPE_LISTBOX 5 +#define FIELDTYPE_TEXTFIELD 6 +#define FIELDTYPE_SIGNATURE 7 + +#define FORMFLAG_READONLY 0x01 +#define FORMFLAG_REQUIRED 0x02 +#define FORMFLAG_NOEXPORT 0x04 + +class CPDF_Dictionary; +class CPDF_Font; +class CPDF_FormControl; +class CPDF_InterForm; +class CPDF_String; + +CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, + const FX_CHAR* name, + int nLevel = 0); +CFX_WideString FPDF_GetFullName(CPDF_Dictionary* pFieldDict); + +class CPDF_FormField { + public: + enum Type { + Unknown, + PushButton, + RadioButton, + CheckBox, + Text, + RichText, + File, + ListBox, + ComboBox, + Sign + }; + + CFX_WideString GetFullName() const; + + Type GetType() const { return m_Type; } + uint32_t GetFlags() const { return m_Flags; } + + CPDF_Dictionary* GetFieldDict() const { return m_pDict; } + void SetFieldDict(CPDF_Dictionary* pDict) { m_pDict = pDict; } + + bool ResetField(bool bNotify = false); + + int CountControls() const { + return pdfium::CollectionSize(m_ControlList); + } + + CPDF_FormControl* GetControl(int index) const { return m_ControlList[index]; } + + int GetControlIndex(const CPDF_FormControl* pControl) const; + int GetFieldType() const; + + CPDF_AAction GetAdditionalAction() const; + CFX_WideString GetAlternateName() const; + CFX_WideString GetMappingName() const; + + uint32_t GetFieldFlags() const; + CFX_ByteString GetDefaultStyle() const; + CFX_WideString GetRichTextString() const; + + CFX_WideString GetValue() const; + CFX_WideString GetDefaultValue() const; + bool SetValue(const CFX_WideString& value, bool bNotify = false); + + int GetMaxLen() const; + int CountSelectedItems() const; + int GetSelectedIndex(int index) const; + + bool ClearSelection(bool bNotify = false); + bool IsItemSelected(int index) const; + bool SetItemSelection(int index, bool bSelected, bool bNotify = false); + + bool IsItemDefaultSelected(int index) const; + + int GetDefaultSelectedItem() const; + int CountOptions() const; + + CFX_WideString GetOptionLabel(int index) const; + CFX_WideString GetOptionValue(int index) const; + + int FindOption(CFX_WideString csOptLabel) const; + int FindOptionValue(const CFX_WideString& csOptValue) const; + + bool CheckControl(int iControlIndex, bool bChecked, bool bNotify = false); + + int GetTopVisibleIndex() const; + int CountSelectedOptions() const; + + int GetSelectedOptionIndex(int index) const; + bool IsOptionSelected(int iOptIndex) const; + + bool SelectOption(int iOptIndex, bool bSelected, bool bNotify = false); + + bool ClearSelectedOptions(bool bNotify = false); + +#ifdef PDF_ENABLE_XFA + bool ClearOptions(bool bNotify = false); + + int InsertOption(CFX_WideString csOptLabel, + int index = -1, + bool bNotify = false); +#endif // PDF_ENABLE_XFA + + FX_FLOAT GetFontSize() const { return m_FontSize; } + CPDF_Font* GetFont() const { return m_pFont; } + + private: + friend class CPDF_InterForm; + friend class CPDF_FormControl; + + CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict); + ~CPDF_FormField(); + + CFX_WideString GetValue(bool bDefault) const; + bool SetValue(const CFX_WideString& value, bool bDefault, bool bNotify); + + void SyncFieldFlags(); + int FindListSel(CPDF_String* str); + CFX_WideString GetOptionText(int index, int sub_index) const; + + void LoadDA(); + CFX_WideString GetCheckValue(bool bDefault) const; + bool SetCheckValue(const CFX_WideString& value, bool bDefault, bool bNotify); + + bool NotifyBeforeSelectionChange(const CFX_WideString& value); + void NotifyAfterSelectionChange(); + + bool NotifyBeforeValueChange(const CFX_WideString& value); + void NotifyAfterValueChange(); + + bool NotifyListOrComboBoxBeforeChange(const CFX_WideString& value); + void NotifyListOrComboBoxAfterChange(); + + CPDF_FormField::Type m_Type; + uint32_t m_Flags; + CPDF_InterForm* const m_pForm; + CPDF_Dictionary* m_pDict; + std::vector m_ControlList; // Owned by InterForm parent. + FX_FLOAT m_FontSize; + CPDF_Font* m_pFont; +}; + +#endif // CORE_FPDFDOC_CPDF_FORMFIELD_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formfield_unittest.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formfield_unittest.cpp new file mode 100644 index 000000000000..4aeda84c880a --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_formfield_unittest.cpp @@ -0,0 +1,48 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfdoc/cpdf_formfield.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(cpdf_formfield, FPDF_GetFullName) { + CFX_WideString name = FPDF_GetFullName(nullptr); + EXPECT_TRUE(name.IsEmpty()); + + CPDF_IndirectObjectHolder obj_holder; + CPDF_Dictionary* root = obj_holder.NewIndirect(); + root->SetNewFor("T", "foo"); + name = FPDF_GetFullName(root); + EXPECT_STREQ("foo", name.UTF8Encode().c_str()); + + CPDF_Dictionary* dict1 = obj_holder.NewIndirect(); + root->SetNewFor("Parent", &obj_holder, dict1->GetObjNum()); + dict1->SetNewFor("T", "bar"); + name = FPDF_GetFullName(root); + EXPECT_STREQ("bar.foo", name.UTF8Encode().c_str()); + + CPDF_Dictionary* dict2 = dict1->SetNewFor("Parent"); + name = FPDF_GetFullName(root); + EXPECT_STREQ("bar.foo", name.UTF8Encode().c_str()); + + CPDF_Dictionary* dict3 = obj_holder.NewIndirect(); + dict2->SetNewFor("Parent", &obj_holder, dict3->GetObjNum()); + + dict3->SetNewFor("T", "qux"); + name = FPDF_GetFullName(root); + EXPECT_STREQ("qux.bar.foo", name.UTF8Encode().c_str()); + + dict3->SetNewFor("Parent", &obj_holder, root->GetObjNum()); + name = FPDF_GetFullName(root); + EXPECT_STREQ("qux.bar.foo", name.UTF8Encode().c_str()); + name = FPDF_GetFullName(dict1); + EXPECT_STREQ("foo.qux.bar", name.UTF8Encode().c_str()); + name = FPDF_GetFullName(dict2); + EXPECT_STREQ("bar.foo.qux", name.UTF8Encode().c_str()); + name = FPDF_GetFullName(dict3); + EXPECT_STREQ("bar.foo.qux", name.UTF8Encode().c_str()); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_iconfit.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_iconfit.cpp new file mode 100644 index 000000000000..aedb78591290 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_iconfit.cpp @@ -0,0 +1,48 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_iconfit.h" + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fxcrt/fx_string.h" + +CPDF_IconFit::ScaleMethod CPDF_IconFit::GetScaleMethod() { + if (!m_pDict) + return Always; + + CFX_ByteString csSW = m_pDict->GetStringFor("SW", "A"); + if (csSW == "B") + return Bigger; + if (csSW == "S") + return Smaller; + if (csSW == "N") + return Never; + return Always; +} + +bool CPDF_IconFit::IsProportionalScale() { + return m_pDict ? m_pDict->GetStringFor("S", "P") != "A" : true; +} + +void CPDF_IconFit::GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom) { + fLeft = fBottom = 0.5; + if (!m_pDict) + return; + + CPDF_Array* pA = m_pDict->GetArrayFor("A"); + if (pA) { + uint32_t dwCount = pA->GetCount(); + if (dwCount > 0) + fLeft = pA->GetNumberAt(0); + if (dwCount > 1) + fBottom = pA->GetNumberAt(1); + } +} + +bool CPDF_IconFit::GetFittingBounds() { + return m_pDict ? m_pDict->GetBooleanFor("FB") : false; +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_iconfit.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_iconfit.h new file mode 100644 index 000000000000..37df48d43e51 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_iconfit.h @@ -0,0 +1,30 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_ICONFIT_H_ +#define CORE_FPDFDOC_CPDF_ICONFIT_H_ + +#include "core/fxcrt/fx_system.h" + +class CPDF_Dictionary; + +class CPDF_IconFit { + public: + enum ScaleMethod { Always = 0, Bigger, Smaller, Never }; + + explicit CPDF_IconFit(const CPDF_Dictionary* pDict) : m_pDict(pDict) {} + + ScaleMethod GetScaleMethod(); + bool IsProportionalScale(); + void GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom); + bool GetFittingBounds(); + const CPDF_Dictionary* GetDict() const { return m_pDict; } + + private: + const CPDF_Dictionary* const m_pDict; +}; + +#endif // CORE_FPDFDOC_CPDF_ICONFIT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_interform.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_interform.cpp new file mode 100644 index 000000000000..d9f0db97479c --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_interform.cpp @@ -0,0 +1,1323 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_interform.h" + +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/font/cpdf_fontencoding.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cfdf_document.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfdoc/cpdf_filespec.h" +#include "core/fpdfdoc/cpdf_formcontrol.h" +#include "core/fxge/cfx_substfont.h" +#include "core/fxge/fx_font.h" +#include "third_party/base/stl_util.h" + +namespace { + +const int nMaxRecursion = 32; + +const struct SupportFieldEncoding { + const FX_CHAR* m_name; + uint16_t m_codePage; +} g_fieldEncoding[] = { + {"BigFive", 950}, + {"GBK", 936}, + {"Shift-JIS", 932}, + {"UHC", 949}, +}; + +CFX_WideString GetFieldValue(const CPDF_Dictionary& pFieldDict, + const CFX_ByteString& bsEncoding) { + const CFX_ByteString csBValue = pFieldDict.GetStringFor("V"); + for (const auto& encoding : g_fieldEncoding) { + if (bsEncoding == encoding.m_name) + return CFX_WideString::FromCodePage(csBValue.AsStringC(), + encoding.m_codePage); + } + CFX_ByteString csTemp = csBValue.Left(2); + if (csTemp == "\xFF\xFE" || csTemp == "\xFE\xFF") + return PDF_DecodeText(csBValue); + return CFX_WideString::FromLocal(csBValue.AsStringC()); +} + +void AddFont(CPDF_Dictionary*& pFormDict, + CPDF_Document* pDocument, + const CPDF_Font* pFont, + CFX_ByteString& csNameTag); + +void InitDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument) { + if (!pDocument) + return; + + if (!pFormDict) { + pFormDict = pDocument->NewIndirect(); + pDocument->GetRoot()->SetNewFor("AcroForm", pDocument, + pFormDict->GetObjNum()); + } + + CFX_ByteString csDA; + if (!pFormDict->KeyExist("DR")) { + CFX_ByteString csBaseName; + CFX_ByteString csDefault; + uint8_t charSet = CPDF_InterForm::GetNativeCharSet(); + CPDF_Font* pFont = CPDF_InterForm::AddStandardFont(pDocument, "Helvetica"); + if (pFont) { + AddFont(pFormDict, pDocument, pFont, csBaseName); + csDefault = csBaseName; + } + if (charSet != FXFONT_ANSI_CHARSET) { + CFX_ByteString csFontName = + CPDF_InterForm::GetNativeFont(charSet, nullptr); + if (!pFont || csFontName != "Helvetica") { + pFont = CPDF_InterForm::AddNativeFont(pDocument); + if (pFont) { + csBaseName = ""; + AddFont(pFormDict, pDocument, pFont, csBaseName); + csDefault = csBaseName; + } + } + } + if (pFont) + csDA = "/" + PDF_NameEncode(csDefault) + " 0 Tf"; + } + if (!csDA.IsEmpty()) + csDA += " "; + + csDA += "0 g"; + if (!pFormDict->KeyExist("DA")) + pFormDict->SetNewFor("DA", csDA, false); +} + +CPDF_Font* GetFont(CPDF_Dictionary* pFormDict, + CPDF_Document* pDocument, + CFX_ByteString csNameTag) { + CFX_ByteString csAlias = PDF_NameDecode(csNameTag); + if (!pFormDict || csAlias.IsEmpty()) + return nullptr; + + CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); + if (!pDR) + return nullptr; + + CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); + if (!pFonts) + return nullptr; + + CPDF_Dictionary* pElement = pFonts->GetDictFor(csAlias); + if (!pElement) + return nullptr; + + if (pElement->GetStringFor("Type") == "Font") + return pDocument->LoadFont(pElement); + return nullptr; +} + +CPDF_Font* GetNativeFont(CPDF_Dictionary* pFormDict, + CPDF_Document* pDocument, + uint8_t charSet, + CFX_ByteString& csNameTag) { + if (!pFormDict) + return nullptr; + + CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); + if (!pDR) + return nullptr; + + CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); + if (!pFonts) + return nullptr; + + for (const auto& it : *pFonts) { + const CFX_ByteString& csKey = it.first; + if (!it.second) + continue; + + CPDF_Dictionary* pElement = ToDictionary(it.second->GetDirect()); + if (!pElement) + continue; + if (pElement->GetStringFor("Type") != "Font") + continue; + CPDF_Font* pFind = pDocument->LoadFont(pElement); + if (!pFind) + continue; + + CFX_SubstFont* pSubst = pFind->GetSubstFont(); + if (!pSubst) + continue; + + if (pSubst->m_Charset == (int)charSet) { + csNameTag = csKey; + return pFind; + } + } + return nullptr; +} + +bool FindFont(CPDF_Dictionary* pFormDict, + const CPDF_Font* pFont, + CFX_ByteString& csNameTag) { + if (!pFormDict || !pFont) + return false; + + CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); + if (!pDR) + return false; + + CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); + if (!pFonts) + return false; + + for (const auto& it : *pFonts) { + const CFX_ByteString& csKey = it.first; + if (!it.second) + continue; + CPDF_Dictionary* pElement = ToDictionary(it.second->GetDirect()); + if (!pElement) + continue; + if (pElement->GetStringFor("Type") != "Font") + continue; + if (pFont->GetFontDict() == pElement) { + csNameTag = csKey; + return true; + } + } + return false; +} + +bool FindFont(CPDF_Dictionary* pFormDict, + CPDF_Document* pDocument, + CFX_ByteString csFontName, + CPDF_Font*& pFont, + CFX_ByteString& csNameTag) { + if (!pFormDict) + return false; + + CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); + if (!pDR) + return false; + + CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); + if (!pFonts) + return false; + if (csFontName.GetLength() > 0) + csFontName.Remove(' '); + + for (const auto& it : *pFonts) { + const CFX_ByteString& csKey = it.first; + if (!it.second) + continue; + + CPDF_Dictionary* pElement = ToDictionary(it.second->GetDirect()); + if (!pElement) + continue; + if (pElement->GetStringFor("Type") != "Font") + continue; + pFont = pDocument->LoadFont(pElement); + if (!pFont) + continue; + + CFX_ByteString csBaseFont; + csBaseFont = pFont->GetBaseFont(); + csBaseFont.Remove(' '); + if (csBaseFont == csFontName) { + csNameTag = csKey; + return true; + } + } + return false; +} + +void AddFont(CPDF_Dictionary*& pFormDict, + CPDF_Document* pDocument, + const CPDF_Font* pFont, + CFX_ByteString& csNameTag) { + if (!pFont) + return; + if (!pFormDict) + InitDict(pFormDict, pDocument); + + CFX_ByteString csTag; + if (FindFont(pFormDict, pFont, csTag)) { + csNameTag = csTag; + return; + } + if (!pFormDict) + InitDict(pFormDict, pDocument); + + CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); + if (!pDR) + pDR = pFormDict->SetNewFor("DR"); + + CPDF_Dictionary* pFonts = pDR->GetDictFor("Font"); + if (!pFonts) + pFonts = pDR->SetNewFor("Font"); + + if (csNameTag.IsEmpty()) + csNameTag = pFont->GetBaseFont(); + + csNameTag.Remove(' '); + csNameTag = CPDF_InterForm::GenerateNewResourceName(pDR, "Font", 4, + csNameTag.c_str()); + pFonts->SetNewFor(csNameTag, pDocument, + pFont->GetFontDict()->GetObjNum()); +} + +CPDF_Font* AddNativeFont(CPDF_Dictionary*& pFormDict, + CPDF_Document* pDocument, + uint8_t charSet, + CFX_ByteString& csNameTag) { + if (!pFormDict) + InitDict(pFormDict, pDocument); + + CFX_ByteString csTemp; + CPDF_Font* pFont = GetNativeFont(pFormDict, pDocument, charSet, csTemp); + if (pFont) { + csNameTag = csTemp; + return pFont; + } + CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet, nullptr); + if (!csFontName.IsEmpty() && + FindFont(pFormDict, pDocument, csFontName, pFont, csNameTag)) { + return pFont; + } + pFont = CPDF_InterForm::AddNativeFont(charSet, pDocument); + if (pFont) + AddFont(pFormDict, pDocument, pFont, csNameTag); + + return pFont; +} + +class CFieldNameExtractor { + public: + explicit CFieldNameExtractor(const CFX_WideString& full_name) + : m_FullName(full_name) { + m_pCur = m_FullName.c_str(); + m_pEnd = m_pCur + m_FullName.GetLength(); + } + + void GetNext(const FX_WCHAR*& pSubName, FX_STRSIZE& size) { + pSubName = m_pCur; + while (m_pCur < m_pEnd && m_pCur[0] != L'.') + m_pCur++; + + size = (FX_STRSIZE)(m_pCur - pSubName); + if (m_pCur < m_pEnd && m_pCur[0] == L'.') + m_pCur++; + } + + protected: + CFX_WideString m_FullName; + const FX_WCHAR* m_pCur; + const FX_WCHAR* m_pEnd; +}; + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +typedef struct { + bool bFind; + LOGFONTA lf; +} PDF_FONTDATA; + +static int CALLBACK EnumFontFamExProc(ENUMLOGFONTEXA* lpelfe, + NEWTEXTMETRICEX* lpntme, + DWORD FontType, + LPARAM lParam) { + if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@')) + return 1; + + PDF_FONTDATA* pData = (PDF_FONTDATA*)lParam; + memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA)); + pData->bFind = true; + return 0; +} + +bool RetrieveSpecificFont(LOGFONTA& lf) { + PDF_FONTDATA fd; + memset(&fd, 0, sizeof(PDF_FONTDATA)); + HDC hDC = ::GetDC(nullptr); + EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd, + 0); + ::ReleaseDC(nullptr, hDC); + if (fd.bFind) + memcpy(&lf, &fd.lf, sizeof(LOGFONTA)); + + return fd.bFind; +} + +bool RetrieveSpecificFont(uint8_t charSet, + uint8_t pitchAndFamily, + LPCSTR pcsFontName, + LOGFONTA& lf) { + memset(&lf, 0, sizeof(LOGFONTA)); + lf.lfCharSet = charSet; + lf.lfPitchAndFamily = pitchAndFamily; + if (pcsFontName) { + // TODO(dsinclair): Should this be strncpy? + // NOLINTNEXTLINE(runtime/printf) + strcpy(lf.lfFaceName, pcsFontName); + } + return RetrieveSpecificFont(lf); +} +#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + +int CompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2) { + const FX_WCHAR* ptr1 = name1.c_str(); + const FX_WCHAR* ptr2 = name2.c_str(); + if (name1.GetLength() == name2.GetLength()) + return name1 == name2 ? 1 : 0; + + int i = 0; + while (ptr1[i] == ptr2[i]) + i++; + if (i == name1.GetLength()) + return 2; + if (i == name2.GetLength()) + return 3; + return 0; +} + +} // namespace + +class CFieldTree { + public: + class Node { + public: + Node() : m_pField(nullptr) {} + Node(const CFX_WideString& short_name, CPDF_FormField* pField) + : m_ShortName(short_name), m_pField(pField) {} + ~Node() {} + + void AddChildNode(Node* pNode) { m_Children.push_back(pNode); } + + size_t GetChildrenCount() const { return m_Children.size(); } + + Node* GetChildAt(size_t i) { return m_Children[i]; } + const Node* GetChildAt(size_t i) const { return m_Children[i]; } + + CPDF_FormField* GetFieldAtIndex(size_t index) { + size_t nFieldsToGo = index; + return GetFieldInternal(&nFieldsToGo); + } + + size_t CountFields() const { return CountFieldsInternal(0); } + + void SetField(CPDF_FormField* pField) { m_pField = pField; } + + CPDF_FormField* GetField() { return m_pField; } + const CPDF_FormField* GetField() const { return m_pField; } + + const CFX_WideString& GetShortName() const { return m_ShortName; } + + private: + CPDF_FormField* GetFieldInternal(size_t* pFieldsToGo) { + if (m_pField) { + if (*pFieldsToGo == 0) + return m_pField; + + --*pFieldsToGo; + } + for (size_t i = 0; i < GetChildrenCount(); ++i) { + CPDF_FormField* pField = GetChildAt(i)->GetFieldInternal(pFieldsToGo); + if (pField) + return pField; + } + return nullptr; + } + + size_t CountFieldsInternal(int nLevel) const { + if (nLevel > nMaxRecursion) + return 0; + + size_t count = 0; + if (m_pField) + ++count; + + for (size_t i = 0; i < GetChildrenCount(); ++i) + count += GetChildAt(i)->CountFieldsInternal(nLevel + 1); + return count; + } + + std::vector m_Children; + CFX_WideString m_ShortName; + CPDF_FormField* m_pField; + }; + + CFieldTree(); + ~CFieldTree(); + + void SetField(const CFX_WideString& full_name, CPDF_FormField* pField); + CPDF_FormField* GetField(const CFX_WideString& full_name); + void RemoveAll(); + + Node* FindNode(const CFX_WideString& full_name); + Node* AddChild(Node* pParent, + const CFX_WideString& short_name, + CPDF_FormField* pField); + void RemoveNode(Node* pNode, int nLevel = 0); + + Node* Lookup(Node* pParent, const CFX_WideString& short_name); + + Node m_Root; +}; + +CFieldTree::CFieldTree() {} + +CFieldTree::~CFieldTree() { + RemoveAll(); +} + +CFieldTree::Node* CFieldTree::AddChild(Node* pParent, + const CFX_WideString& short_name, + CPDF_FormField* pField) { + if (!pParent) + return nullptr; + + Node* pNode = new Node(short_name, pField); + pParent->AddChildNode(pNode); + return pNode; +} + +void CFieldTree::RemoveNode(Node* pNode, int nLevel) { + if (!pNode) + return; + + if (nLevel <= nMaxRecursion) { + for (size_t i = 0; i < pNode->GetChildrenCount(); ++i) + RemoveNode(pNode->GetChildAt(i), nLevel + 1); + } + delete pNode; +} + +CFieldTree::Node* CFieldTree::Lookup(Node* pParent, + const CFX_WideString& short_name) { + if (!pParent) + return nullptr; + + for (size_t i = 0; i < pParent->GetChildrenCount(); ++i) { + Node* pNode = pParent->GetChildAt(i); + if (pNode->GetShortName() == short_name) + return pNode; + } + return nullptr; +} + +void CFieldTree::RemoveAll() { + for (size_t i = 0; i < m_Root.GetChildrenCount(); ++i) + RemoveNode(m_Root.GetChildAt(i)); +} + +void CFieldTree::SetField(const CFX_WideString& full_name, + CPDF_FormField* pField) { + if (full_name.IsEmpty()) + return; + + CFieldNameExtractor name_extractor(full_name); + const FX_WCHAR* pName; + FX_STRSIZE nLength; + name_extractor.GetNext(pName, nLength); + Node* pNode = &m_Root; + Node* pLast = nullptr; + while (nLength > 0) { + pLast = pNode; + CFX_WideString name = CFX_WideString(pName, nLength); + pNode = Lookup(pLast, name); + if (!pNode) + pNode = AddChild(pLast, name, nullptr); + + name_extractor.GetNext(pName, nLength); + } + if (pNode != &m_Root) + pNode->SetField(pField); +} + +CPDF_FormField* CFieldTree::GetField(const CFX_WideString& full_name) { + if (full_name.IsEmpty()) + return nullptr; + + CFieldNameExtractor name_extractor(full_name); + const FX_WCHAR* pName; + FX_STRSIZE nLength; + name_extractor.GetNext(pName, nLength); + Node* pNode = &m_Root; + Node* pLast = nullptr; + while (nLength > 0 && pNode) { + pLast = pNode; + CFX_WideString name = CFX_WideString(pName, nLength); + pNode = Lookup(pLast, name); + name_extractor.GetNext(pName, nLength); + } + return pNode ? pNode->GetField() : nullptr; +} + +CFieldTree::Node* CFieldTree::FindNode(const CFX_WideString& full_name) { + if (full_name.IsEmpty()) + return nullptr; + + CFieldNameExtractor name_extractor(full_name); + const FX_WCHAR* pName; + FX_STRSIZE nLength; + name_extractor.GetNext(pName, nLength); + Node* pNode = &m_Root; + Node* pLast = nullptr; + while (nLength > 0 && pNode) { + pLast = pNode; + CFX_WideString name = CFX_WideString(pName, nLength); + pNode = Lookup(pLast, name); + name_extractor.GetNext(pName, nLength); + } + return pNode; +} + +CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, + CPDF_Document* pDocument, + CFX_ByteString& csNameTag) { + uint8_t charSet = CPDF_InterForm::GetNativeCharSet(); + return AddNativeFont(pFormDict, pDocument, charSet, csNameTag); +} + +// static +uint8_t CPDF_InterForm::GetNativeCharSet() { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + uint8_t charSet = FXFONT_ANSI_CHARSET; + UINT iCodePage = ::GetACP(); + switch (iCodePage) { + case 932: + charSet = FXFONT_SHIFTJIS_CHARSET; + break; + case 936: + charSet = FXFONT_GB2312_CHARSET; + break; + case 950: + charSet = FXFONT_CHINESEBIG5_CHARSET; + break; + case 1252: + charSet = FXFONT_ANSI_CHARSET; + break; + case 874: + charSet = FXFONT_THAI_CHARSET; + break; + case 949: + charSet = FXFONT_HANGUL_CHARSET; + break; + case 1200: + charSet = FXFONT_ANSI_CHARSET; + break; + case 1250: + charSet = FXFONT_EASTEUROPE_CHARSET; + break; + case 1251: + charSet = FXFONT_RUSSIAN_CHARSET; + break; + case 1253: + charSet = FXFONT_GREEK_CHARSET; + break; + case 1254: + charSet = FXFONT_TURKISH_CHARSET; + break; + case 1255: + charSet = FXFONT_HEBREW_CHARSET; + break; + case 1256: + charSet = FXFONT_ARABIC_CHARSET; + break; + case 1257: + charSet = FXFONT_BALTIC_CHARSET; + break; + case 1258: + charSet = FXFONT_VIETNAMESE_CHARSET; + break; + case 1361: + charSet = FXFONT_JOHAB_CHARSET; + break; + } + return charSet; +#else + return 0; +#endif +} + +CPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument) + : m_pDocument(pDocument), + m_pFormDict(nullptr), + m_pFieldTree(new CFieldTree), + m_pFormNotify(nullptr) { + CPDF_Dictionary* pRoot = m_pDocument->GetRoot(); + if (!pRoot) + return; + + m_pFormDict = pRoot->GetDictFor("AcroForm"); + if (!m_pFormDict) + return; + + CPDF_Array* pFields = m_pFormDict->GetArrayFor("Fields"); + if (!pFields) + return; + + for (size_t i = 0; i < pFields->GetCount(); ++i) + LoadField(pFields->GetDictAt(i), 0); +} + +CPDF_InterForm::~CPDF_InterForm() { + m_ControlMap.clear(); + size_t nCount = m_pFieldTree->m_Root.CountFields(); + for (size_t i = 0; i < nCount; ++i) + delete m_pFieldTree->m_Root.GetFieldAtIndex(i); +} + +bool CPDF_InterForm::s_bUpdateAP = true; + +bool CPDF_InterForm::IsUpdateAPEnabled() { + return s_bUpdateAP; +} + +void CPDF_InterForm::SetUpdateAP(bool bUpdateAP) { + s_bUpdateAP = bUpdateAP; +} + +CFX_ByteString CPDF_InterForm::GenerateNewResourceName( + const CPDF_Dictionary* pResDict, + const FX_CHAR* csType, + int iMinLen, + const FX_CHAR* csPrefix) { + CFX_ByteString csStr = csPrefix; + CFX_ByteString csBType = csType; + if (csStr.IsEmpty()) { + if (csBType == "ExtGState") + csStr = "GS"; + else if (csBType == "ColorSpace") + csStr = "CS"; + else if (csBType == "Font") + csStr = "ZiTi"; + else + csStr = "Res"; + } + CFX_ByteString csTmp = csStr; + int iCount = csStr.GetLength(); + int m = 0; + if (iMinLen > 0) { + csTmp = ""; + while (m < iMinLen && m < iCount) + csTmp += csStr[m++]; + while (m < iMinLen) { + csTmp += '0' + m % 10; + m++; + } + } else { + m = iCount; + } + if (!pResDict) + return csTmp; + + CPDF_Dictionary* pDict = pResDict->GetDictFor(csType); + if (!pDict) + return csTmp; + + int num = 0; + CFX_ByteString bsNum; + while (true) { + CFX_ByteString csKey = csTmp + bsNum; + if (!pDict->KeyExist(csKey)) + return csKey; + if (m < iCount) + csTmp += csStr[m++]; + else + bsNum.Format("%d", num++); + + m++; + } + return csTmp; +} + +CPDF_Font* CPDF_InterForm::AddStandardFont(CPDF_Document* pDocument, + CFX_ByteString csFontName) { + if (!pDocument || csFontName.IsEmpty()) + return nullptr; + + if (csFontName == "ZapfDingbats") + return pDocument->AddStandardFont(csFontName.c_str(), nullptr); + + CPDF_FontEncoding encoding(PDFFONT_ENCODING_WINANSI); + return pDocument->AddStandardFont(csFontName.c_str(), &encoding); +} + +CFX_ByteString CPDF_InterForm::GetNativeFont(uint8_t charSet, void* pLogFont) { + CFX_ByteString csFontName; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + LOGFONTA lf = {}; + if (charSet == FXFONT_ANSI_CHARSET) { + csFontName = "Helvetica"; + return csFontName; + } + bool bRet = false; + if (charSet == FXFONT_SHIFTJIS_CHARSET) { + bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, + "MS Mincho", lf); + } else if (charSet == FXFONT_GB2312_CHARSET) { + bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "SimSun", + lf); + } else if (charSet == FXFONT_CHINESEBIG5_CHARSET) { + bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MingLiU", + lf); + } + if (!bRet) { + bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, + "Arial Unicode MS", lf); + } + if (!bRet) { + bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, + "Microsoft Sans Serif", lf); + } + if (!bRet) { + bRet = + RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, nullptr, lf); + } + if (bRet) { + if (pLogFont) + memcpy(pLogFont, &lf, sizeof(LOGFONTA)); + + csFontName = lf.lfFaceName; + return csFontName; + } +#endif + return csFontName; +} + +CPDF_Font* CPDF_InterForm::AddNativeFont(uint8_t charSet, + CPDF_Document* pDocument) { + if (!pDocument) + return nullptr; + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + LOGFONTA lf; + CFX_ByteString csFontName = GetNativeFont(charSet, &lf); + if (!csFontName.IsEmpty()) { + if (csFontName == "Helvetica") + return AddStandardFont(pDocument, csFontName); + return pDocument->AddWindowsFont(&lf, false, true); + } +#endif + return nullptr; +} + +CPDF_Font* CPDF_InterForm::AddNativeFont(CPDF_Document* pDocument) { + return pDocument ? AddNativeFont(GetNativeCharSet(), pDocument) : nullptr; +} + +bool CPDF_InterForm::ValidateFieldName( + CFX_WideString& csNewFieldName, + int iType, + const CPDF_FormField* pExcludedField, + const CPDF_FormControl* pExcludedControl) const { + if (csNewFieldName.IsEmpty()) + return false; + + int iPos = 0; + int iLength = csNewFieldName.GetLength(); + CFX_WideString csSub; + while (true) { + while (iPos < iLength && + (csNewFieldName[iPos] == L'.' || csNewFieldName[iPos] == L' ')) { + iPos++; + } + if (iPos < iLength && !csSub.IsEmpty()) + csSub += L'.'; + while (iPos < iLength && csNewFieldName[iPos] != L'.') + csSub += csNewFieldName[iPos++]; + for (int i = csSub.GetLength() - 1; i > -1; i--) { + if (csSub[i] != L' ' && csSub[i] != L'.') + break; + + csSub.SetAt(i, L'\0'); + } + size_t dwCount = m_pFieldTree->m_Root.CountFields(); + for (size_t m = 0; m < dwCount; ++m) { + CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(m); + if (!pField) + continue; + if (pField == pExcludedField) { + if (!pExcludedControl || pField->CountControls() < 2) + continue; + } + CFX_WideString csFullName = pField->GetFullName(); + int iRet = CompareFieldName(csSub, csFullName); + if (iRet == 1) { + if (pField->GetFieldType() != iType) + return false; + } else if (iRet == 2 && csSub == csNewFieldName) { + if (csFullName[iPos] == L'.') + return false; + } else if (iRet == 3 && csSub == csNewFieldName) { + if (csNewFieldName[csFullName.GetLength()] == L'.') + return false; + } + } + if (iPos >= iLength) + break; + } + if (csSub.IsEmpty()) + return false; + + csNewFieldName = csSub; + return true; +} + +size_t CPDF_InterForm::CountFields(const CFX_WideString& csFieldName) const { + if (csFieldName.IsEmpty()) + return m_pFieldTree->m_Root.CountFields(); + + CFieldTree::Node* pNode = m_pFieldTree->FindNode(csFieldName); + return pNode ? pNode->CountFields() : 0; +} + +CPDF_FormField* CPDF_InterForm::GetField( + uint32_t index, + const CFX_WideString& csFieldName) const { + if (csFieldName.IsEmpty()) + return m_pFieldTree->m_Root.GetFieldAtIndex(index); + + CFieldTree::Node* pNode = m_pFieldTree->FindNode(csFieldName); + return pNode ? pNode->GetFieldAtIndex(index) : nullptr; +} + +CPDF_FormField* CPDF_InterForm::GetFieldByDict( + CPDF_Dictionary* pFieldDict) const { + if (!pFieldDict) + return nullptr; + + CFX_WideString csWName = FPDF_GetFullName(pFieldDict); + return m_pFieldTree->GetField(csWName); +} + +CPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage, + const CFX_PointF& point, + + int* z_order) const { + CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArrayFor("Annots"); + if (!pAnnotList) + return nullptr; + + for (size_t i = pAnnotList->GetCount(); i > 0; --i) { + size_t annot_index = i - 1; + CPDF_Dictionary* pAnnot = pAnnotList->GetDictAt(annot_index); + if (!pAnnot) + continue; + + const auto it = m_ControlMap.find(pAnnot); + if (it == m_ControlMap.end()) + continue; + + CPDF_FormControl* pControl = it->second.get(); + if (!pControl->GetRect().Contains(point)) + continue; + + if (z_order) + *z_order = static_cast(annot_index); + return pControl; + } + return nullptr; +} + +CPDF_FormControl* CPDF_InterForm::GetControlByDict( + const CPDF_Dictionary* pWidgetDict) const { + const auto it = m_ControlMap.find(pWidgetDict); + return it != m_ControlMap.end() ? it->second.get() : nullptr; +} + +bool CPDF_InterForm::NeedConstructAP() const { + return m_pFormDict && m_pFormDict->GetBooleanFor("NeedAppearances"); +} + +int CPDF_InterForm::CountFieldsInCalculationOrder() { + if (!m_pFormDict) + return 0; + + CPDF_Array* pArray = m_pFormDict->GetArrayFor("CO"); + return pArray ? pArray->GetCount() : 0; +} + +CPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index) { + if (!m_pFormDict || index < 0) + return nullptr; + + CPDF_Array* pArray = m_pFormDict->GetArrayFor("CO"); + if (!pArray) + return nullptr; + + CPDF_Dictionary* pElement = ToDictionary(pArray->GetDirectObjectAt(index)); + return pElement ? GetFieldByDict(pElement) : nullptr; +} + +int CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField) { + if (!m_pFormDict || !pField) + return -1; + + CPDF_Array* pArray = m_pFormDict->GetArrayFor("CO"); + if (!pArray) + return -1; + + for (size_t i = 0; i < pArray->GetCount(); i++) { + CPDF_Object* pElement = pArray->GetDirectObjectAt(i); + if (pElement == pField->m_pDict) + return i; + } + return -1; +} + +CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag) { + return GetFont(m_pFormDict, m_pDocument, csNameTag); +} + +CPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance() const { + if (!m_pFormDict) + return CPDF_DefaultAppearance(); + return CPDF_DefaultAppearance(m_pFormDict->GetStringFor("DA")); +} + +int CPDF_InterForm::GetFormAlignment() const { + return m_pFormDict ? m_pFormDict->GetIntegerFor("Q", 0) : 0; +} + +bool CPDF_InterForm::ResetForm(const std::vector& fields, + bool bIncludeOrExclude, + bool bNotify) { + if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0) + return false; + + size_t nCount = m_pFieldTree->m_Root.CountFields(); + for (size_t i = 0; i < nCount; ++i) { + CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i); + if (!pField) + continue; + + if (bIncludeOrExclude == pdfium::ContainsValue(fields, pField)) + pField->ResetField(bNotify); + } + if (bNotify && m_pFormNotify) + m_pFormNotify->AfterFormReset(this); + return true; +} + +bool CPDF_InterForm::ResetForm(bool bNotify) { + if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0) + return false; + + size_t nCount = m_pFieldTree->m_Root.CountFields(); + for (size_t i = 0; i < nCount; ++i) { + CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i); + if (!pField) + continue; + + pField->ResetField(bNotify); + } + if (bNotify && m_pFormNotify) + m_pFormNotify->AfterFormReset(this); + return true; +} + +void CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel) { + if (nLevel > nMaxRecursion) + return; + if (!pFieldDict) + return; + + uint32_t dwParentObjNum = pFieldDict->GetObjNum(); + CPDF_Array* pKids = pFieldDict->GetArrayFor("Kids"); + if (!pKids) { + AddTerminalField(pFieldDict); + return; + } + + CPDF_Dictionary* pFirstKid = pKids->GetDictAt(0); + if (!pFirstKid) + return; + + if (pFirstKid->KeyExist("T") || pFirstKid->KeyExist("Kids")) { + for (size_t i = 0; i < pKids->GetCount(); i++) { + CPDF_Dictionary* pChildDict = pKids->GetDictAt(i); + if (pChildDict) { + if (pChildDict->GetObjNum() != dwParentObjNum) + LoadField(pChildDict, nLevel + 1); + } + } + } else { + AddTerminalField(pFieldDict); + } +} + +bool CPDF_InterForm::HasXFAForm() const { + return m_pFormDict && m_pFormDict->GetArrayFor("XFA"); +} + +void CPDF_InterForm::FixPageFields(const CPDF_Page* pPage) { + CPDF_Dictionary* pPageDict = pPage->m_pFormDict; + if (!pPageDict) + return; + + CPDF_Array* pAnnots = pPageDict->GetArrayFor("Annots"); + if (!pAnnots) + return; + + for (size_t i = 0; i < pAnnots->GetCount(); i++) { + CPDF_Dictionary* pAnnot = pAnnots->GetDictAt(i); + if (pAnnot && pAnnot->GetStringFor("Subtype") == "Widget") + LoadField(pAnnot, 0); + } +} + +CPDF_FormField* CPDF_InterForm::AddTerminalField(CPDF_Dictionary* pFieldDict) { + if (!pFieldDict->KeyExist("FT")) { + // Key "FT" is required for terminal fields, it is also inheritable. + CPDF_Dictionary* pParentDict = pFieldDict->GetDictFor("Parent"); + if (!pParentDict || !pParentDict->KeyExist("FT")) + return nullptr; + } + + CPDF_Dictionary* pDict = pFieldDict; + CFX_WideString csWName = FPDF_GetFullName(pFieldDict); + if (csWName.IsEmpty()) + return nullptr; + + CPDF_FormField* pField = nullptr; + pField = m_pFieldTree->GetField(csWName); + if (!pField) { + CPDF_Dictionary* pParent = pFieldDict; + if (!pFieldDict->KeyExist("T") && + pFieldDict->GetStringFor("Subtype") == "Widget") { + pParent = pFieldDict->GetDictFor("Parent"); + if (!pParent) + pParent = pFieldDict; + } + + if (pParent && pParent != pFieldDict && !pParent->KeyExist("FT")) { + if (pFieldDict->KeyExist("FT")) { + CPDF_Object* pFTValue = pFieldDict->GetDirectObjectFor("FT"); + if (pFTValue) + pParent->SetFor("FT", pFTValue->Clone()); + } + + if (pFieldDict->KeyExist("Ff")) { + CPDF_Object* pFfValue = pFieldDict->GetDirectObjectFor("Ff"); + if (pFfValue) + pParent->SetFor("Ff", pFfValue->Clone()); + } + } + + pField = new CPDF_FormField(this, pParent); + CPDF_Object* pTObj = pDict->GetObjectFor("T"); + if (ToReference(pTObj)) { + std::unique_ptr pClone = pTObj->CloneDirectObject(); + if (pClone) + pDict->SetFor("T", std::move(pClone)); + else + pDict->SetNewFor("T", ""); + } + m_pFieldTree->SetField(csWName, pField); + } + + CPDF_Array* pKids = pFieldDict->GetArrayFor("Kids"); + if (pKids) { + for (size_t i = 0; i < pKids->GetCount(); i++) { + CPDF_Dictionary* pKid = pKids->GetDictAt(i); + if (!pKid) + continue; + if (pKid->GetStringFor("Subtype") != "Widget") + continue; + + AddControl(pField, pKid); + } + } else { + if (pFieldDict->GetStringFor("Subtype") == "Widget") + AddControl(pField, pFieldDict); + } + return pField; +} + +CPDF_FormControl* CPDF_InterForm::AddControl(CPDF_FormField* pField, + CPDF_Dictionary* pWidgetDict) { + const auto it = m_ControlMap.find(pWidgetDict); + if (it != m_ControlMap.end()) + return it->second.get(); + + auto pNew = pdfium::MakeUnique(pField, pWidgetDict); + CPDF_FormControl* pControl = pNew.get(); + m_ControlMap[pWidgetDict] = std::move(pNew); + pField->m_ControlList.push_back(pControl); + return pControl; +} + +bool CPDF_InterForm::CheckRequiredFields( + const std::vector* fields, + bool bIncludeOrExclude) const { + size_t nCount = m_pFieldTree->m_Root.CountFields(); + for (size_t i = 0; i < nCount; ++i) { + CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i); + if (!pField) + continue; + + int32_t iType = pField->GetType(); + if (iType == CPDF_FormField::PushButton || + iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) { + continue; + } + uint32_t dwFlags = pField->GetFieldFlags(); + // TODO(thestig): Look up these magic numbers and add constants for them. + if (dwFlags & FORMFLAG_NOEXPORT) + continue; + + bool bFind = true; + if (fields) + bFind = pdfium::ContainsValue(*fields, pField); + if (bIncludeOrExclude == bFind) { + CPDF_Dictionary* pFieldDict = pField->m_pDict; + if ((dwFlags & FORMFLAG_REQUIRED) != 0 && + pFieldDict->GetStringFor("V").IsEmpty()) { + return false; + } + } + } + return true; +} + +std::unique_ptr CPDF_InterForm::ExportToFDF( + const CFX_WideStringC& pdf_path, + bool bSimpleFileSpec) const { + std::vector fields; + size_t nCount = m_pFieldTree->m_Root.CountFields(); + for (size_t i = 0; i < nCount; ++i) + fields.push_back(m_pFieldTree->m_Root.GetFieldAtIndex(i)); + return ExportToFDF(pdf_path, fields, true, bSimpleFileSpec); +} + +std::unique_ptr CPDF_InterForm::ExportToFDF( + const CFX_WideStringC& pdf_path, + const std::vector& fields, + bool bIncludeOrExclude, + bool bSimpleFileSpec) const { + std::unique_ptr pDoc = CFDF_Document::CreateNewDoc(); + if (!pDoc) + return nullptr; + + CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDictFor("FDF"); + if (!pdf_path.IsEmpty()) { + if (bSimpleFileSpec) { + CFX_WideString wsFilePath = CPDF_FileSpec::EncodeFileName(pdf_path); + pMainDict->SetNewFor( + "F", CFX_ByteString::FromUnicode(wsFilePath), false); + pMainDict->SetNewFor("UF", PDF_EncodeText(wsFilePath), + false); + } else { + CPDF_FileSpec filespec(pDoc->GetByteStringPool()); + filespec.SetFileName(pdf_path); + pMainDict->SetFor("F", pdfium::WrapUnique(filespec.GetObj())); + } + } + + CPDF_Array* pFields = pMainDict->SetNewFor("Fields"); + size_t nCount = m_pFieldTree->m_Root.CountFields(); + for (size_t i = 0; i < nCount; ++i) { + CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i); + if (!pField || pField->GetType() == CPDF_FormField::PushButton) + continue; + + uint32_t dwFlags = pField->GetFieldFlags(); + if (dwFlags & 0x04) + continue; + + if (bIncludeOrExclude == pdfium::ContainsValue(fields, pField)) { + if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetStringFor("V").IsEmpty()) + continue; + + CFX_WideString fullname = FPDF_GetFullName(pField->GetFieldDict()); + auto pFieldDict = + pdfium::MakeUnique(pDoc->GetByteStringPool()); + pFieldDict->SetNewFor("T", fullname); + if (pField->GetType() == CPDF_FormField::CheckBox || + pField->GetType() == CPDF_FormField::RadioButton) { + CFX_WideString csExport = pField->GetCheckValue(false); + CFX_ByteString csBExport = PDF_EncodeText(csExport); + CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt"); + if (pOpt) + pFieldDict->SetNewFor("V", csBExport, false); + else + pFieldDict->SetNewFor("V", csBExport); + } else { + CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V"); + if (pV) + pFieldDict->SetFor("V", pV->CloneDirectObject()); + } + pFields->Add(std::move(pFieldDict)); + } + } + return pDoc; +} + +void CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict, + const CFX_WideString& parent_name, + bool bNotify, + int nLevel) { + CFX_WideString name; + if (!parent_name.IsEmpty()) + name = parent_name + L"."; + + name += pFieldDict->GetUnicodeTextFor("T"); + CPDF_Array* pKids = pFieldDict->GetArrayFor("Kids"); + if (pKids) { + for (size_t i = 0; i < pKids->GetCount(); i++) { + CPDF_Dictionary* pKid = pKids->GetDictAt(i); + if (!pKid) + continue; + if (nLevel <= nMaxRecursion) + FDF_ImportField(pKid, name, bNotify, nLevel + 1); + } + return; + } + if (!pFieldDict->KeyExist("V")) + return; + + CPDF_FormField* pField = m_pFieldTree->GetField(name); + if (!pField) + return; + + CFX_WideString csWValue = GetFieldValue(*pFieldDict, m_bsEncoding); + int iType = pField->GetFieldType(); + if (bNotify && m_pFormNotify) { + if (iType == FIELDTYPE_LISTBOX) { + if (m_pFormNotify->BeforeSelectionChange(pField, csWValue) < 0) + return; + } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) { + if (m_pFormNotify->BeforeValueChange(pField, csWValue) < 0) + return; + } + } + pField->SetValue(csWValue); + CPDF_FormField::Type eType = pField->GetType(); + if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && + pFieldDict->KeyExist("Opt")) { + pField->m_pDict->SetFor( + "Opt", pFieldDict->GetDirectObjectFor("Opt")->CloneDirectObject()); + } + + if (bNotify && m_pFormNotify) { + if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) + m_pFormNotify->AfterCheckedStatusChange(pField); + else if (iType == FIELDTYPE_LISTBOX) + m_pFormNotify->AfterSelectionChange(pField); + else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) + m_pFormNotify->AfterValueChange(pField); + } +} + +void CPDF_InterForm::SetFormNotify(IPDF_FormNotify* pNotify) { + m_pFormNotify = pNotify; +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_interform.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_interform.h new file mode 100644 index 000000000000..cbaaa7bc2de7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_interform.h @@ -0,0 +1,120 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_INTERFORM_H_ +#define CORE_FPDFDOC_CPDF_INTERFORM_H_ + +#include +#include +#include + +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfdoc/cpdf_defaultappearance.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CFieldTree; +class CFDF_Document; +class CPDF_Document; +class CPDF_Dictionary; +class CPDF_Font; +class CPDF_FormControl; +class CPDF_FormField; +class CPDF_Object; +class CPDF_Page; +class IPDF_FormNotify; + +CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, + CPDF_Document* pDocument, + CFX_ByteString& csNameTag); + +class CPDF_InterForm { + public: + explicit CPDF_InterForm(CPDF_Document* pDocument); + ~CPDF_InterForm(); + + static void SetUpdateAP(bool bUpdateAP); + static bool IsUpdateAPEnabled(); + static CFX_ByteString GenerateNewResourceName(const CPDF_Dictionary* pResDict, + const FX_CHAR* csType, + int iMinLen, + const FX_CHAR* csPrefix); + static CPDF_Font* AddStandardFont(CPDF_Document* pDocument, + CFX_ByteString csFontName); + static CFX_ByteString GetNativeFont(uint8_t iCharSet, void* pLogFont); + static uint8_t GetNativeCharSet(); + static CPDF_Font* AddNativeFont(uint8_t iCharSet, CPDF_Document* pDocument); + static CPDF_Font* AddNativeFont(CPDF_Document* pDocument); + + size_t CountFields(const CFX_WideString& csFieldName) const; + CPDF_FormField* GetField(uint32_t index, + const CFX_WideString& csFieldName) const; + CPDF_FormField* GetFieldByDict(CPDF_Dictionary* pFieldDict) const; + + CPDF_FormControl* GetControlAtPoint(CPDF_Page* pPage, + const CFX_PointF& point, + int* z_order) const; + CPDF_FormControl* GetControlByDict(const CPDF_Dictionary* pWidgetDict) const; + + bool NeedConstructAP() const; + int CountFieldsInCalculationOrder(); + CPDF_FormField* GetFieldInCalculationOrder(int index); + int FindFieldInCalculationOrder(const CPDF_FormField* pField); + + CPDF_Font* GetFormFont(CFX_ByteString csNameTag); + CPDF_DefaultAppearance GetDefaultAppearance() const; + int GetFormAlignment() const; + + bool CheckRequiredFields(const std::vector* fields, + bool bIncludeOrExclude) const; + + std::unique_ptr ExportToFDF(const CFX_WideStringC& pdf_path, + bool bSimpleFileSpec) const; + + std::unique_ptr ExportToFDF( + const CFX_WideStringC& pdf_path, + const std::vector& fields, + bool bIncludeOrExclude, + bool bSimpleFileSpec) const; + + bool ResetForm(const std::vector& fields, + bool bIncludeOrExclude, + bool bNotify); + bool ResetForm(bool bNotify); + + void SetFormNotify(IPDF_FormNotify* pNotify); + bool HasXFAForm() const; + void FixPageFields(const CPDF_Page* pPage); + + private: + friend class CPDF_FormControl; + friend class CPDF_FormField; + + void LoadField(CPDF_Dictionary* pFieldDict, int nLevel); + CPDF_FormField* AddTerminalField(CPDF_Dictionary* pFieldDict); + CPDF_FormControl* AddControl(CPDF_FormField* pField, + CPDF_Dictionary* pWidgetDict); + void FDF_ImportField(CPDF_Dictionary* pField, + const CFX_WideString& parent_name, + bool bNotify = false, + int nLevel = 0); + bool ValidateFieldName(CFX_WideString& csNewFieldName, + int iType, + const CPDF_FormField* pExcludedField, + const CPDF_FormControl* pExcludedControl) const; + + static bool s_bUpdateAP; + + CPDF_Document* const m_pDocument; + CPDF_Dictionary* m_pFormDict; + std::map> + m_ControlMap; + std::unique_ptr m_pFieldTree; + CFX_ByteString m_bsEncoding; + IPDF_FormNotify* m_pFormNotify; +}; + +#endif // CORE_FPDFDOC_CPDF_INTERFORM_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_link.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_link.cpp new file mode 100644 index 000000000000..20ec486df28a --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_link.cpp @@ -0,0 +1,32 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_link.h" + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfdoc/cpdf_nametree.h" + +CFX_FloatRect CPDF_Link::GetRect() { + return m_pDict->GetRectFor("Rect"); +} + +CPDF_Dest CPDF_Link::GetDest(CPDF_Document* pDoc) { + CPDF_Object* pDest = m_pDict->GetDirectObjectFor("Dest"); + if (!pDest) + return CPDF_Dest(); + + if (pDest->IsString() || pDest->IsName()) { + CPDF_NameTree name_tree(pDoc, "Dests"); + return CPDF_Dest(name_tree.LookupNamedDest(pDoc, pDest->GetString())); + } + if (CPDF_Array* pArray = pDest->AsArray()) + return CPDF_Dest(pArray); + return CPDF_Dest(); +} + +CPDF_Action CPDF_Link::GetAction() { + return CPDF_Action(m_pDict->GetDictFor("A")); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_link.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_link.h new file mode 100644 index 000000000000..162630d6ac2f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_link.h @@ -0,0 +1,31 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_LINK_H_ +#define CORE_FPDFDOC_CPDF_LINK_H_ + +#include "core/fpdfdoc/cpdf_action.h" +#include "core/fpdfdoc/cpdf_dest.h" +#include "core/fxcrt/fx_coordinates.h" + +class CPDF_Dictionary; + +class CPDF_Link { + public: + CPDF_Link() : m_pDict(nullptr) {} + explicit CPDF_Link(CPDF_Dictionary* pDict) : m_pDict(pDict) {} + + CPDF_Dictionary* GetDict() const { return m_pDict; } + + CFX_FloatRect GetRect(); + CPDF_Dest GetDest(CPDF_Document* pDoc); + CPDF_Action GetAction(); + + private: + CPDF_Dictionary* m_pDict; +}; + +#endif // CORE_FPDFDOC_CPDF_LINK_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_linklist.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_linklist.cpp new file mode 100644 index 000000000000..0620dbf32b62 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_linklist.cpp @@ -0,0 +1,68 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_linklist.h" + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_array.h" + +CPDF_LinkList::CPDF_LinkList() {} + +CPDF_LinkList::~CPDF_LinkList() {} + +const std::vector* CPDF_LinkList::GetPageLinks( + CPDF_Page* pPage) { + uint32_t objnum = pPage->m_pFormDict->GetObjNum(); + if (objnum == 0) + return nullptr; + + auto it = m_PageMap.find(objnum); + if (it != m_PageMap.end()) + return &it->second; + + // std::map::operator[] forces the creation of a map entry. + std::vector& page_link_list = m_PageMap[objnum]; + LoadPageLinks(pPage, &page_link_list); + return &page_link_list; +} + +CPDF_Link CPDF_LinkList::GetLinkAtPoint(CPDF_Page* pPage, + const CFX_PointF& point, + int* z_order) { + const std::vector* pPageLinkList = GetPageLinks(pPage); + if (!pPageLinkList) + return CPDF_Link(); + + for (size_t i = pPageLinkList->size(); i > 0; --i) { + size_t annot_index = i - 1; + CPDF_Dictionary* pAnnot = (*pPageLinkList)[annot_index]; + if (!pAnnot) + continue; + + CPDF_Link link(pAnnot); + if (!link.GetRect().Contains(point)) + continue; + + if (z_order) + *z_order = annot_index; + return link; + } + return CPDF_Link(); +} + +void CPDF_LinkList::LoadPageLinks(CPDF_Page* pPage, + std::vector* pList) { + CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArrayFor("Annots"); + if (!pAnnotList) + return; + + for (size_t i = 0; i < pAnnotList->GetCount(); ++i) { + CPDF_Dictionary* pAnnot = pAnnotList->GetDictAt(i); + bool add_link = (pAnnot && pAnnot->GetStringFor("Subtype") == "Link"); + // Add non-links as nullptrs to preserve z-order. + pList->push_back(add_link ? pAnnot : nullptr); + } +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_linklist.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_linklist.h new file mode 100644 index 000000000000..129790f846d2 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_linklist.h @@ -0,0 +1,35 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_LINKLIST_H_ +#define CORE_FPDFDOC_CPDF_LINKLIST_H_ + +#include +#include + +#include "core/fpdfdoc/cpdf_link.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Page; +class CPDF_Dictionary; + +class CPDF_LinkList { + public: + CPDF_LinkList(); + ~CPDF_LinkList(); + + CPDF_Link GetLinkAtPoint(CPDF_Page* pPage, + const CFX_PointF& point, + int* z_order); + + private: + const std::vector* GetPageLinks(CPDF_Page* pPage); + void LoadPageLinks(CPDF_Page* pPage, std::vector* pList); + + std::map> m_PageMap; +}; + +#endif // CORE_FPDFDOC_CPDF_LINKLIST_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_metadata.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_metadata.cpp new file mode 100644 index 000000000000..5e3acbe3a230 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_metadata.cpp @@ -0,0 +1,32 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_metadata.h" + +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fxcrt/fx_xml.h" + +CPDF_Metadata::CPDF_Metadata(CPDF_Document* pDoc) { + CPDF_Dictionary* pRoot = pDoc->GetRoot(); + if (!pRoot) + return; + + CPDF_Stream* pStream = pRoot->GetStreamFor("Metadata"); + if (!pStream) + return; + + CPDF_StreamAcc acc; + acc.LoadAllData(pStream, false); + m_pXmlElement = CXML_Element::Parse(acc.GetData(), acc.GetSize()); +} + +CPDF_Metadata::~CPDF_Metadata() {} + +const CXML_Element* CPDF_Metadata::GetRoot() const { + return m_pXmlElement.get(); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_metadata.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_metadata.h new file mode 100644 index 000000000000..dd68dda713c7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_metadata.h @@ -0,0 +1,26 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_METADATA_H_ +#define CORE_FPDFDOC_CPDF_METADATA_H_ + +#include + +class CPDF_Document; +class CXML_Element; + +class CPDF_Metadata { + public: + explicit CPDF_Metadata(CPDF_Document* pDoc); + ~CPDF_Metadata(); + + const CXML_Element* GetRoot() const; + + private: + std::unique_ptr m_pXmlElement; +}; + +#endif // CORE_FPDFDOC_CPDF_METADATA_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_nametree.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_nametree.cpp new file mode 100644 index 000000000000..b8d1eb0ab14a --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_nametree.cpp @@ -0,0 +1,198 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_nametree.h" + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" + +namespace { + +const int nMaxRecursion = 32; + +CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, + const CFX_ByteString& csName, + size_t& nIndex, + CPDF_Array** ppFind, + int nLevel = 0) { + if (nLevel > nMaxRecursion) + return nullptr; + + CPDF_Array* pLimits = pNode->GetArrayFor("Limits"); + if (pLimits) { + CFX_ByteString csLeft = pLimits->GetStringAt(0); + CFX_ByteString csRight = pLimits->GetStringAt(1); + if (csLeft.Compare(csRight.AsStringC()) > 0) { + CFX_ByteString csTmp = csRight; + csRight = csLeft; + csLeft = csTmp; + } + if (csName.Compare(csLeft.AsStringC()) < 0 || + csName.Compare(csRight.AsStringC()) > 0) { + return nullptr; + } + } + + CPDF_Array* pNames = pNode->GetArrayFor("Names"); + if (pNames) { + size_t dwCount = pNames->GetCount() / 2; + for (size_t i = 0; i < dwCount; i++) { + CFX_ByteString csValue = pNames->GetStringAt(i * 2); + int32_t iCompare = csValue.Compare(csName.AsStringC()); + if (iCompare <= 0) { + if (ppFind) + *ppFind = pNames; + if (iCompare < 0) + continue; + } else { + break; + } + nIndex += i; + return pNames->GetDirectObjectAt(i * 2 + 1); + } + nIndex += dwCount; + return nullptr; + } + + CPDF_Array* pKids = pNode->GetArrayFor("Kids"); + if (!pKids) + return nullptr; + + for (size_t i = 0; i < pKids->GetCount(); i++) { + CPDF_Dictionary* pKid = pKids->GetDictAt(i); + if (!pKid) + continue; + + CPDF_Object* pFound = + SearchNameNode(pKid, csName, nIndex, ppFind, nLevel + 1); + if (pFound) + return pFound; + } + return nullptr; +} + +CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, + size_t nIndex, + size_t& nCurIndex, + CFX_ByteString& csName, + CPDF_Array** ppFind, + int nLevel = 0) { + if (nLevel > nMaxRecursion) + return nullptr; + + CPDF_Array* pNames = pNode->GetArrayFor("Names"); + if (pNames) { + size_t nCount = pNames->GetCount() / 2; + if (nIndex >= nCurIndex + nCount) { + nCurIndex += nCount; + return nullptr; + } + if (ppFind) + *ppFind = pNames; + csName = pNames->GetStringAt((nIndex - nCurIndex) * 2); + return pNames->GetDirectObjectAt((nIndex - nCurIndex) * 2 + 1); + } + CPDF_Array* pKids = pNode->GetArrayFor("Kids"); + if (!pKids) + return nullptr; + for (size_t i = 0; i < pKids->GetCount(); i++) { + CPDF_Dictionary* pKid = pKids->GetDictAt(i); + if (!pKid) + continue; + CPDF_Object* pFound = + SearchNameNode(pKid, nIndex, nCurIndex, csName, ppFind, nLevel + 1); + if (pFound) + return pFound; + } + return nullptr; +} + +size_t CountNames(CPDF_Dictionary* pNode, int nLevel = 0) { + if (nLevel > nMaxRecursion) + return 0; + + CPDF_Array* pNames = pNode->GetArrayFor("Names"); + if (pNames) + return pNames->GetCount() / 2; + + CPDF_Array* pKids = pNode->GetArrayFor("Kids"); + if (!pKids) + return 0; + + size_t nCount = 0; + for (size_t i = 0; i < pKids->GetCount(); i++) { + CPDF_Dictionary* pKid = pKids->GetDictAt(i); + if (!pKid) + continue; + + nCount += CountNames(pKid, nLevel + 1); + } + return nCount; +} + +} // namespace + +CPDF_NameTree::CPDF_NameTree(CPDF_Document* pDoc, + const CFX_ByteString& category) + : m_pRoot(nullptr) { + CPDF_Dictionary* pRoot = pDoc->GetRoot(); + if (!pRoot) + return; + + CPDF_Dictionary* pNames = pRoot->GetDictFor("Names"); + if (!pNames) + return; + + m_pRoot = pNames->GetDictFor(category); +} + +size_t CPDF_NameTree::GetCount() const { + return m_pRoot ? ::CountNames(m_pRoot) : 0; +} + +int CPDF_NameTree::GetIndex(const CFX_ByteString& csName) const { + if (!m_pRoot) + return -1; + + size_t nIndex = 0; + if (!SearchNameNode(m_pRoot, csName, nIndex, nullptr)) + return -1; + return nIndex; +} + +CPDF_Object* CPDF_NameTree::LookupValue(int nIndex, + CFX_ByteString& csName) const { + if (!m_pRoot) + return nullptr; + size_t nCurIndex = 0; + return SearchNameNode(m_pRoot, nIndex, nCurIndex, csName, nullptr); +} + +CPDF_Object* CPDF_NameTree::LookupValue(const CFX_ByteString& csName) const { + if (!m_pRoot) + return nullptr; + size_t nIndex = 0; + return SearchNameNode(m_pRoot, csName, nIndex, nullptr); +} + +CPDF_Array* CPDF_NameTree::LookupNamedDest(CPDF_Document* pDoc, + const CFX_ByteString& sName) { + CPDF_Object* pValue = LookupValue(sName); + if (!pValue) { + CPDF_Dictionary* pDests = pDoc->GetRoot()->GetDictFor("Dests"); + if (!pDests) + return nullptr; + pValue = pDests->GetDirectObjectFor(sName); + } + if (!pValue) + return nullptr; + if (CPDF_Array* pArray = pValue->AsArray()) + return pArray; + if (CPDF_Dictionary* pDict = pValue->AsDictionary()) + return pDict->GetArrayFor("D"); + return nullptr; +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_nametree.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_nametree.h new file mode 100644 index 000000000000..d6763ad98722 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_nametree.h @@ -0,0 +1,34 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_NAMETREE_H_ +#define CORE_FPDFDOC_CPDF_NAMETREE_H_ + +#include "core/fxcrt/fx_string.h" + +class CPDF_Array; +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_Object; + +class CPDF_NameTree { + public: + explicit CPDF_NameTree(CPDF_Dictionary* pRoot) : m_pRoot(pRoot) {} + CPDF_NameTree(CPDF_Document* pDoc, const CFX_ByteString& category); + + CPDF_Object* LookupValue(int nIndex, CFX_ByteString& csName) const; + CPDF_Object* LookupValue(const CFX_ByteString& csName) const; + CPDF_Array* LookupNamedDest(CPDF_Document* pDoc, const CFX_ByteString& sName); + + int GetIndex(const CFX_ByteString& csName) const; + size_t GetCount() const; + CPDF_Dictionary* GetRoot() const { return m_pRoot; } + + private: + CPDF_Dictionary* m_pRoot; +}; + +#endif // CORE_FPDFDOC_CPDF_NAMETREE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_numbertree.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_numbertree.cpp new file mode 100644 index 000000000000..5f2bc06666e2 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_numbertree.cpp @@ -0,0 +1,52 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_numbertree.h" + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" + +namespace { + +CPDF_Object* SearchNumberNode(const CPDF_Dictionary* pNode, int num) { + CPDF_Array* pLimits = pNode->GetArrayFor("Limits"); + if (pLimits && + (num < pLimits->GetIntegerAt(0) || num > pLimits->GetIntegerAt(1))) { + return nullptr; + } + CPDF_Array* pNumbers = pNode->GetArrayFor("Nums"); + if (pNumbers) { + for (size_t i = 0; i < pNumbers->GetCount() / 2; i++) { + int index = pNumbers->GetIntegerAt(i * 2); + if (num == index) + return pNumbers->GetDirectObjectAt(i * 2 + 1); + if (index > num) + break; + } + return nullptr; + } + + CPDF_Array* pKids = pNode->GetArrayFor("Kids"); + if (!pKids) + return nullptr; + + for (size_t i = 0; i < pKids->GetCount(); i++) { + CPDF_Dictionary* pKid = pKids->GetDictAt(i); + if (!pKid) + continue; + + CPDF_Object* pFound = SearchNumberNode(pKid, num); + if (pFound) + return pFound; + } + return nullptr; +} + +} // namespace + +CPDF_Object* CPDF_NumberTree::LookupValue(int num) const { + return SearchNumberNode(m_pRoot, num); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_numbertree.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_numbertree.h new file mode 100644 index 000000000000..bfe44fddb9a5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_numbertree.h @@ -0,0 +1,23 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_NUMBERTREE_H_ +#define CORE_FPDFDOC_CPDF_NUMBERTREE_H_ + +class CPDF_Dictionary; +class CPDF_Object; + +class CPDF_NumberTree { + public: + explicit CPDF_NumberTree(CPDF_Dictionary* pRoot) : m_pRoot(pRoot) {} + + CPDF_Object* LookupValue(int num) const; + + protected: + CPDF_Dictionary* const m_pRoot; +}; + +#endif // CORE_FPDFDOC_CPDF_NUMBERTREE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_occontext.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_occontext.cpp new file mode 100644 index 000000000000..c4272f4897c9 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_occontext.cpp @@ -0,0 +1,279 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_occontext.h" + +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" + +namespace { + +int32_t FindGroup(const CPDF_Array* pArray, const CPDF_Dictionary* pGroupDict) { + if (!pArray || !pGroupDict) + return -1; + + for (size_t i = 0; i < pArray->GetCount(); i++) { + if (pArray->GetDictAt(i) == pGroupDict) + return i; + } + return -1; +} + +bool HasIntent(const CPDF_Dictionary* pDict, + const CFX_ByteStringC& csElement, + const CFX_ByteStringC& csDef) { + CPDF_Object* pIntent = pDict->GetDirectObjectFor("Intent"); + if (!pIntent) + return csElement == csDef; + + CFX_ByteString bsIntent; + if (CPDF_Array* pArray = pIntent->AsArray()) { + for (size_t i = 0; i < pArray->GetCount(); i++) { + bsIntent = pArray->GetStringAt(i); + if (bsIntent == "All" || bsIntent == csElement) + return true; + } + return false; + } + bsIntent = pIntent->GetString(); + return bsIntent == "All" || bsIntent == csElement; +} + +CPDF_Dictionary* GetConfig(CPDF_Document* pDoc, + const CPDF_Dictionary* pOCGDict) { + ASSERT(pOCGDict); + CPDF_Dictionary* pOCProperties = pDoc->GetRoot()->GetDictFor("OCProperties"); + if (!pOCProperties) + return nullptr; + + CPDF_Array* pOCGs = pOCProperties->GetArrayFor("OCGs"); + if (!pOCGs) + return nullptr; + + if (FindGroup(pOCGs, pOCGDict) < 0) + return nullptr; + + CPDF_Dictionary* pConfig = pOCProperties->GetDictFor("D"); + CPDF_Array* pConfigs = pOCProperties->GetArrayFor("Configs"); + if (!pConfigs) + return pConfig; + + for (size_t i = 0; i < pConfigs->GetCount(); i++) { + CPDF_Dictionary* pFind = pConfigs->GetDictAt(i); + if (pFind && HasIntent(pFind, "View", "View")) + return pFind; + } + return pConfig; +} + +CFX_ByteString GetUsageTypeString(CPDF_OCContext::UsageType eType) { + CFX_ByteString csState; + switch (eType) { + case CPDF_OCContext::Design: + csState = "Design"; + break; + case CPDF_OCContext::Print: + csState = "Print"; + break; + case CPDF_OCContext::Export: + csState = "Export"; + break; + default: + csState = "View"; + break; + } + return csState; +} + +} // namespace + +CPDF_OCContext::CPDF_OCContext(CPDF_Document* pDoc, UsageType eUsageType) + : m_pDocument(pDoc), m_eUsageType(eUsageType) { + ASSERT(pDoc); +} + +CPDF_OCContext::~CPDF_OCContext() {} + +bool CPDF_OCContext::LoadOCGStateFromConfig( + const CFX_ByteString& csConfig, + const CPDF_Dictionary* pOCGDict) const { + CPDF_Dictionary* pConfig = GetConfig(m_pDocument, pOCGDict); + if (!pConfig) + return true; + + bool bState = pConfig->GetStringFor("BaseState", "ON") != "OFF"; + CPDF_Array* pArray = pConfig->GetArrayFor("ON"); + if (pArray) { + if (FindGroup(pArray, pOCGDict) >= 0) + bState = true; + } + pArray = pConfig->GetArrayFor("OFF"); + if (pArray) { + if (FindGroup(pArray, pOCGDict) >= 0) + bState = false; + } + pArray = pConfig->GetArrayFor("AS"); + if (!pArray) + return bState; + + CFX_ByteString csFind = csConfig + "State"; + for (size_t i = 0; i < pArray->GetCount(); i++) { + CPDF_Dictionary* pUsage = pArray->GetDictAt(i); + if (!pUsage) + continue; + + if (pUsage->GetStringFor("Event", "View") != csConfig) + continue; + + CPDF_Array* pOCGs = pUsage->GetArrayFor("OCGs"); + if (!pOCGs) + continue; + + if (FindGroup(pOCGs, pOCGDict) < 0) + continue; + + CPDF_Dictionary* pState = pUsage->GetDictFor(csConfig); + if (!pState) + continue; + + bState = pState->GetStringFor(csFind) != "OFF"; + } + return bState; +} + +bool CPDF_OCContext::LoadOCGState(const CPDF_Dictionary* pOCGDict) const { + if (!HasIntent(pOCGDict, "View", "View")) + return true; + + CFX_ByteString csState = GetUsageTypeString(m_eUsageType); + CPDF_Dictionary* pUsage = pOCGDict->GetDictFor("Usage"); + if (pUsage) { + CPDF_Dictionary* pState = pUsage->GetDictFor(csState); + if (pState) { + CFX_ByteString csFind = csState + "State"; + if (pState->KeyExist(csFind)) + return pState->GetStringFor(csFind) != "OFF"; + } + if (csState != "View") { + pState = pUsage->GetDictFor("View"); + if (pState && pState->KeyExist("ViewState")) + return pState->GetStringFor("ViewState") != "OFF"; + } + } + return LoadOCGStateFromConfig(csState, pOCGDict); +} + +bool CPDF_OCContext::GetOCGVisible(const CPDF_Dictionary* pOCGDict) { + if (!pOCGDict) + return false; + + const auto it = m_OCGStates.find(pOCGDict); + if (it != m_OCGStates.end()) + return it->second; + + bool bState = LoadOCGState(pOCGDict); + m_OCGStates[pOCGDict] = bState; + return bState; +} + +bool CPDF_OCContext::CheckObjectVisible(const CPDF_PageObject* pObj) { + for (int i = 0; i < pObj->m_ContentMark.CountItems(); i++) { + const CPDF_ContentMarkItem& item = pObj->m_ContentMark.GetItem(i); + if (item.GetName() == "OC" && + item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict && + !CheckOCGVisible(item.GetParam())) { + return false; + } + } + return true; +} + +bool CPDF_OCContext::GetOCGVE(CPDF_Array* pExpression, int nLevel) { + if (nLevel > 32 || !pExpression) + return false; + + CFX_ByteString csOperator = pExpression->GetStringAt(0); + if (csOperator == "Not") { + CPDF_Object* pOCGObj = pExpression->GetDirectObjectAt(1); + if (!pOCGObj) + return false; + if (CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) + return !GetOCGVisible(pDict); + if (CPDF_Array* pArray = pOCGObj->AsArray()) + return !GetOCGVE(pArray, nLevel + 1); + return false; + } + + if (csOperator != "Or" && csOperator != "And") + return false; + + bool bValue = false; + for (size_t i = 1; i < pExpression->GetCount(); i++) { + CPDF_Object* pOCGObj = pExpression->GetDirectObjectAt(1); + if (!pOCGObj) + continue; + + bool bItem = false; + if (CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) + bItem = GetOCGVisible(pDict); + else if (CPDF_Array* pArray = pOCGObj->AsArray()) + bItem = GetOCGVE(pArray, nLevel + 1); + + if (i == 1) { + bValue = bItem; + } else { + if (csOperator == "Or") { + bValue = bValue || bItem; + } else { + bValue = bValue && bItem; + } + } + } + return bValue; +} + +bool CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary* pOCMDDict) { + CPDF_Array* pVE = pOCMDDict->GetArrayFor("VE"); + if (pVE) + return GetOCGVE(pVE, 0); + + CFX_ByteString csP = pOCMDDict->GetStringFor("P", "AnyOn"); + CPDF_Object* pOCGObj = pOCMDDict->GetDirectObjectFor("OCGs"); + if (!pOCGObj) + return true; + + if (const CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) + return GetOCGVisible(pDict); + + CPDF_Array* pArray = pOCGObj->AsArray(); + if (!pArray) + return true; + + bool bState = (csP == "AllOn" || csP == "AllOff"); + for (size_t i = 0; i < pArray->GetCount(); i++) { + bool bItem = true; + CPDF_Dictionary* pItemDict = pArray->GetDictAt(i); + if (pItemDict) + bItem = GetOCGVisible(pItemDict); + + if ((csP == "AnyOn" && bItem) || (csP == "AnyOff" && !bItem)) + return true; + if ((csP == "AllOn" && !bItem) || (csP == "AllOff" && bItem)) + return false; + } + return bState; +} + +bool CPDF_OCContext::CheckOCGVisible(const CPDF_Dictionary* pOCGDict) { + if (!pOCGDict) + return true; + + CFX_ByteString csType = pOCGDict->GetStringFor("Type", "OCG"); + if (csType == "OCG") + return GetOCGVisible(pOCGDict); + return LoadOCMDState(pOCGDict); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_occontext.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_occontext.h new file mode 100644 index 000000000000..ecdcfae31b66 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_occontext.h @@ -0,0 +1,46 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_OCCONTEXT_H_ +#define CORE_FPDFDOC_CPDF_OCCONTEXT_H_ + +#include + +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_string.h" + +class CPDF_Array; +class CPDF_Dictionary; +class CPDF_Document; +class CPDF_PageObject; + +class CPDF_OCContext : public CFX_Retainable { + public: + template + friend CFX_RetainPtr pdfium::MakeRetain(Args&&... args); + + enum UsageType { View = 0, Design, Print, Export }; + + bool CheckOCGVisible(const CPDF_Dictionary* pOCGDict); + bool CheckObjectVisible(const CPDF_PageObject* pObj); + + private: + CPDF_OCContext(CPDF_Document* pDoc, UsageType eUsageType); + ~CPDF_OCContext() override; + + bool LoadOCGStateFromConfig(const CFX_ByteString& csConfig, + const CPDF_Dictionary* pOCGDict) const; + bool LoadOCGState(const CPDF_Dictionary* pOCGDict) const; + bool GetOCGVisible(const CPDF_Dictionary* pOCGDict); + bool GetOCGVE(CPDF_Array* pExpression, int nLevel); + bool LoadOCMDState(const CPDF_Dictionary* pOCMDDict); + + CPDF_Document* const m_pDocument; + const UsageType m_eUsageType; + std::unordered_map m_OCGStates; +}; + +#endif // CORE_FPDFDOC_CPDF_OCCONTEXT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_pagelabel.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_pagelabel.cpp new file mode 100644 index 000000000000..2a79d77ca7e3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_pagelabel.cpp @@ -0,0 +1,144 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_pagelabel.h" + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfdoc/cpdf_numbertree.h" + +namespace { + +CFX_WideString MakeRoman(int num) { + const int kArabic[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; + const CFX_WideString kRoman[] = {L"m", L"cm", L"d", L"cd", L"c", + L"xc", L"l", L"xl", L"x", L"ix", + L"v", L"iv", L"i"}; + const int kMaxNum = 1000000; + + num %= kMaxNum; + int i = 0; + CFX_WideString wsRomanNumber; + while (num > 0) { + while (num >= kArabic[i]) { + num = num - kArabic[i]; + wsRomanNumber += kRoman[i]; + } + i = i + 1; + } + return wsRomanNumber; +} + +CFX_WideString MakeLetters(int num) { + if (num == 0) + return CFX_WideString(); + + CFX_WideString wsLetters; + const int nMaxCount = 1000; + const int nLetterCount = 26; + --num; + + int count = num / nLetterCount + 1; + count %= nMaxCount; + FX_WCHAR ch = L'a' + num % nLetterCount; + for (int i = 0; i < count; i++) + wsLetters += ch; + return wsLetters; +} + +CFX_WideString GetLabelNumPortion(int num, const CFX_ByteString& bsStyle) { + CFX_WideString wsNumPortion; + if (bsStyle.IsEmpty()) + return wsNumPortion; + if (bsStyle == "D") { + wsNumPortion.Format(L"%d", num); + } else if (bsStyle == "R") { + wsNumPortion = MakeRoman(num); + wsNumPortion.MakeUpper(); + } else if (bsStyle == "r") { + wsNumPortion = MakeRoman(num); + } else if (bsStyle == "A") { + wsNumPortion = MakeLetters(num); + wsNumPortion.MakeUpper(); + } else if (bsStyle == "a") { + wsNumPortion = MakeLetters(num); + } + return wsNumPortion; +} + +} // namespace + +CPDF_PageLabel::CPDF_PageLabel(CPDF_Document* pDocument) + : m_pDocument(pDocument) {} + +bool CPDF_PageLabel::GetLabel(int nPage, CFX_WideString* wsLabel) const { + if (!m_pDocument) + return false; + + if (nPage < 0 || nPage >= m_pDocument->GetPageCount()) + return false; + + CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot(); + if (!pPDFRoot) + return false; + + CPDF_Dictionary* pLabels = pPDFRoot->GetDictFor("PageLabels"); + if (!pLabels) + return false; + + CPDF_NumberTree numberTree(pLabels); + CPDF_Object* pValue = nullptr; + int n = nPage; + while (n >= 0) { + pValue = numberTree.LookupValue(n); + if (pValue) + break; + n--; + } + + if (pValue) { + pValue = pValue->GetDirect(); + if (CPDF_Dictionary* pLabel = pValue->AsDictionary()) { + if (pLabel->KeyExist("P")) + *wsLabel += pLabel->GetUnicodeTextFor("P"); + + CFX_ByteString bsNumberingStyle = pLabel->GetStringFor("S", ""); + int nLabelNum = nPage - n + pLabel->GetIntegerFor("St", 1); + CFX_WideString wsNumPortion = + GetLabelNumPortion(nLabelNum, bsNumberingStyle); + *wsLabel += wsNumPortion; + return true; + } + } + wsLabel->Format(L"%d", nPage + 1); + return true; +} + +int32_t CPDF_PageLabel::GetPageByLabel(const CFX_ByteStringC& bsLabel) const { + if (!m_pDocument) + return -1; + + CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot(); + if (!pPDFRoot) + return -1; + + int nPages = m_pDocument->GetPageCount(); + for (int i = 0; i < nPages; i++) { + CFX_WideString str; + if (!GetLabel(i, &str)) + continue; + if (PDF_EncodeText(str).Compare(bsLabel)) + return i; + } + + int nPage = FXSYS_atoi(CFX_ByteString(bsLabel).c_str()); // NUL terminate. + return nPage > 0 && nPage <= nPages ? nPage : -1; +} + +int32_t CPDF_PageLabel::GetPageByLabel(const CFX_WideStringC& wsLabel) const { + return GetPageByLabel(PDF_EncodeText(wsLabel.c_str()).AsStringC()); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_pagelabel.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_pagelabel.h new file mode 100644 index 000000000000..0f91f614d98f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_pagelabel.h @@ -0,0 +1,26 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_PAGELABEL_H_ +#define CORE_FPDFDOC_CPDF_PAGELABEL_H_ + +#include "core/fxcrt/fx_string.h" + +class CPDF_Document; + +class CPDF_PageLabel { + public: + explicit CPDF_PageLabel(CPDF_Document* pDocument); + + bool GetLabel(int nPage, CFX_WideString* wsLabel) const; + int32_t GetPageByLabel(const CFX_ByteStringC& bsLabel) const; + int32_t GetPageByLabel(const CFX_WideStringC& wsLabel) const; + + private: + CPDF_Document* const m_pDocument; +}; + +#endif // CORE_FPDFDOC_CPDF_PAGELABEL_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_variabletext.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_variabletext.cpp new file mode 100644 index 000000000000..94b3425a097a --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_variabletext.cpp @@ -0,0 +1,1140 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_variabletext.h" + +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfdoc/cline.h" +#include "core/fpdfdoc/cpvt_section.h" +#include "core/fpdfdoc/cpvt_word.h" +#include "core/fpdfdoc/cpvt_wordinfo.h" +#include "core/fpdfdoc/csection.h" +#include "core/fpdfdoc/ipvt_fontmap.h" +#include "third_party/base/ptr_util.h" + +namespace { + +const float kFontScale = 0.001f; +const uint8_t kReturnLength = 1; +const float kScalePercent = 0.01f; + +const uint8_t gFontSizeSteps[] = {4, 6, 8, 9, 10, 12, 14, 18, 20, + 25, 30, 35, 40, 45, 50, 55, 60, 70, + 80, 90, 100, 110, 120, 130, 144}; + +} // namespace + +CPDF_VariableText::Provider::Provider(IPVT_FontMap* pFontMap) + : m_pFontMap(pFontMap) { + ASSERT(m_pFontMap); +} + +CPDF_VariableText::Provider::~Provider() {} + +int32_t CPDF_VariableText::Provider::GetCharWidth(int32_t nFontIndex, + uint16_t word) { + if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) { + uint32_t charcode = pPDFFont->CharCodeFromUnicode(word); + if (charcode != CPDF_Font::kInvalidCharCode) + return pPDFFont->GetCharWidthF(charcode); + } + return 0; +} + +int32_t CPDF_VariableText::Provider::GetTypeAscent(int32_t nFontIndex) { + if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) + return pPDFFont->GetTypeAscent(); + return 0; +} + +int32_t CPDF_VariableText::Provider::GetTypeDescent(int32_t nFontIndex) { + if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) + return pPDFFont->GetTypeDescent(); + return 0; +} + +int32_t CPDF_VariableText::Provider::GetWordFontIndex(uint16_t word, + int32_t charset, + int32_t nFontIndex) { + if (CPDF_Font* pDefFont = m_pFontMap->GetPDFFont(0)) { + if (pDefFont->CharCodeFromUnicode(word) != CPDF_Font::kInvalidCharCode) + return 0; + } + if (CPDF_Font* pSysFont = m_pFontMap->GetPDFFont(1)) { + if (pSysFont->CharCodeFromUnicode(word) != CPDF_Font::kInvalidCharCode) + return 1; + } + return -1; +} + +bool CPDF_VariableText::Provider::IsLatinWord(uint16_t word) { + return (word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) || + word == 0x2D || word == 0x27; +} + +int32_t CPDF_VariableText::Provider::GetDefaultFontIndex() { + return 0; +} + +CPDF_VariableText::Iterator::Iterator(CPDF_VariableText* pVT) + : m_CurPos(-1, -1, -1), m_pVT(pVT) {} + +CPDF_VariableText::Iterator::~Iterator() {} + +void CPDF_VariableText::Iterator::SetAt(int32_t nWordIndex) { + m_CurPos = m_pVT->WordIndexToWordPlace(nWordIndex); +} + +void CPDF_VariableText::Iterator::SetAt(const CPVT_WordPlace& place) { + ASSERT(m_pVT); + m_CurPos = place; +} + +bool CPDF_VariableText::Iterator::NextWord() { + if (m_CurPos == m_pVT->GetEndWordPlace()) + return false; + + m_CurPos = m_pVT->GetNextWordPlace(m_CurPos); + return true; +} + +bool CPDF_VariableText::Iterator::PrevWord() { + if (m_CurPos == m_pVT->GetBeginWordPlace()) + return false; + + m_CurPos = m_pVT->GetPrevWordPlace(m_CurPos); + return true; +} + +bool CPDF_VariableText::Iterator::NextLine() { + if (CSection* pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { + if (m_CurPos.nLineIndex < pSection->m_LineArray.GetSize() - 1) { + m_CurPos = + CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex + 1, -1); + return true; + } + if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) { + m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1); + return true; + } + } + return false; +} + +bool CPDF_VariableText::Iterator::PrevLine() { + if (m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { + if (m_CurPos.nLineIndex > 0) { + m_CurPos = + CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex - 1, -1); + return true; + } + if (m_CurPos.nSecIndex > 0) { + if (CSection* pLastSection = + m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex - 1)) { + m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, + pLastSection->m_LineArray.GetSize() - 1, -1); + return true; + } + } + } + return false; +} + +bool CPDF_VariableText::Iterator::NextSection() { + if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) { + m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1); + return true; + } + return false; +} + +bool CPDF_VariableText::Iterator::PrevSection() { + ASSERT(m_pVT); + if (m_CurPos.nSecIndex > 0) { + m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, 0, -1); + return true; + } + return false; +} + +bool CPDF_VariableText::Iterator::GetWord(CPVT_Word& word) const { + word.WordPlace = m_CurPos; + if (CSection* pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { + if (pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) { + if (CPVT_WordInfo* pWord = + pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) { + word.Word = pWord->Word; + word.nCharset = pWord->nCharset; + word.fWidth = m_pVT->GetWordWidth(*pWord); + word.ptWord = m_pVT->InToOut( + CFX_PointF(pWord->fWordX + pSection->m_SecInfo.rcSection.left, + pWord->fWordY + pSection->m_SecInfo.rcSection.top)); + word.fAscent = m_pVT->GetWordAscent(*pWord); + word.fDescent = m_pVT->GetWordDescent(*pWord); + if (pWord->pWordProps) + word.WordProps = *pWord->pWordProps; + + word.nFontIndex = m_pVT->GetWordFontIndex(*pWord); + word.fFontSize = m_pVT->GetWordFontSize(*pWord); + return true; + } + } + } + return false; +} + +bool CPDF_VariableText::Iterator::SetWord(const CPVT_Word& word) { + if (CSection* pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { + if (CPVT_WordInfo* pWord = + pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) { + if (pWord->pWordProps) + *pWord->pWordProps = word.WordProps; + return true; + } + } + return false; +} + +bool CPDF_VariableText::Iterator::GetLine(CPVT_Line& line) const { + ASSERT(m_pVT); + line.lineplace = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex, -1); + if (CSection* pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { + if (CLine* pLine = pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) { + line.ptLine = m_pVT->InToOut(CFX_PointF( + pLine->m_LineInfo.fLineX + pSection->m_SecInfo.rcSection.left, + pLine->m_LineInfo.fLineY + pSection->m_SecInfo.rcSection.top)); + line.fLineWidth = pLine->m_LineInfo.fLineWidth; + line.fLineAscent = pLine->m_LineInfo.fLineAscent; + line.fLineDescent = pLine->m_LineInfo.fLineDescent; + line.lineEnd = pLine->GetEndWordPlace(); + return true; + } + } + return false; +} + +bool CPDF_VariableText::Iterator::GetSection(CPVT_Section& section) const { + section.secplace = CPVT_WordPlace(m_CurPos.nSecIndex, 0, -1); + if (CSection* pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { + section.rcSection = m_pVT->InToOut(pSection->m_SecInfo.rcSection); + if (pSection->m_SecInfo.pSecProps) + section.SecProps = *pSection->m_SecInfo.pSecProps; + if (pSection->m_SecInfo.pWordProps) + section.WordProps = *pSection->m_SecInfo.pWordProps; + return true; + } + return false; +} + +bool CPDF_VariableText::Iterator::SetSection(const CPVT_Section& section) { + if (CSection* pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) { + if (pSection->m_SecInfo.pSecProps) + *pSection->m_SecInfo.pSecProps = section.SecProps; + if (pSection->m_SecInfo.pWordProps) + *pSection->m_SecInfo.pWordProps = section.WordProps; + return true; + } + return false; +} + +CPDF_VariableText::CPDF_VariableText() + : m_nLimitChar(0), + m_nCharArray(0), + m_bMultiLine(false), + m_bLimitWidth(false), + m_bAutoFontSize(false), + m_nAlignment(0), + m_fLineLeading(0.0f), + m_fCharSpace(0.0f), + m_nHorzScale(100), + m_wSubWord(0), + m_fFontSize(0.0f), + m_bInitial(false), + m_pVTProvider(nullptr) {} + +CPDF_VariableText::~CPDF_VariableText() { + ResetAll(); +} + +void CPDF_VariableText::Initialize() { + if (!m_bInitial) { + CPVT_SectionInfo secinfo; + CPVT_WordPlace place; + place.nSecIndex = 0; + AddSection(place, secinfo); + CPVT_LineInfo lineinfo; + lineinfo.fLineAscent = GetFontAscent(GetDefaultFontIndex(), GetFontSize()); + lineinfo.fLineDescent = + GetFontDescent(GetDefaultFontIndex(), GetFontSize()); + AddLine(place, lineinfo); + if (CSection* pSection = m_SectionArray.GetAt(0)) + pSection->ResetLinePlace(); + + m_bInitial = true; + } +} + +void CPDF_VariableText::ResetAll() { + m_bInitial = false; + ResetSectionArray(); +} + +CPVT_WordPlace CPDF_VariableText::InsertWord(const CPVT_WordPlace& place, + uint16_t word, + int32_t charset, + const CPVT_WordProps* pWordProps) { + int32_t nTotlaWords = GetTotalWords(); + if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) + return place; + if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) + return place; + + CPVT_WordPlace newplace = place; + newplace.nWordIndex++; + int32_t nFontIndex = + GetSubWord() > 0 ? GetDefaultFontIndex() + : GetWordFontIndex(word, charset, GetDefaultFontIndex()); + return AddWord(newplace, CPVT_WordInfo(word, charset, nFontIndex, nullptr)); +} + +CPVT_WordPlace CPDF_VariableText::InsertSection( + const CPVT_WordPlace& place, + const CPVT_SecProps* pSecProps, + const CPVT_WordProps* pWordProps) { + int32_t nTotlaWords = GetTotalWords(); + if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) + return place; + if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) + return place; + if (!m_bMultiLine) + return place; + + CPVT_WordPlace wordplace = place; + UpdateWordPlace(wordplace); + CPVT_WordPlace newplace = place; + if (CSection* pSection = m_SectionArray.GetAt(wordplace.nSecIndex)) { + CPVT_WordPlace NewPlace(wordplace.nSecIndex + 1, 0, -1); + CPVT_SectionInfo secinfo; + AddSection(NewPlace, secinfo); + newplace = NewPlace; + if (CSection* pNewSection = m_SectionArray.GetAt(NewPlace.nSecIndex)) { + for (int32_t w = wordplace.nWordIndex + 1, + sz = pSection->m_WordArray.GetSize(); + w < sz; w++) { + if (CPVT_WordInfo* pWord = pSection->m_WordArray.GetAt(w)) { + NewPlace.nWordIndex++; + pNewSection->AddWord(NewPlace, *pWord); + } + } + } + ClearSectionRightWords(wordplace); + } + return newplace; +} + +CPVT_WordPlace CPDF_VariableText::InsertText(const CPVT_WordPlace& place, + const FX_WCHAR* text) { + CFX_WideString swText = text; + CPVT_WordPlace wp = place; + for (int32_t i = 0, sz = swText.GetLength(); i < sz; i++) { + CPVT_WordPlace oldwp = wp; + uint16_t word = swText.GetAt(i); + switch (word) { + case 0x0D: + if (m_bMultiLine) { + if (swText.GetAt(i + 1) == 0x0A) + i += 1; + + wp = InsertSection(wp, nullptr, nullptr); + } + break; + case 0x0A: + if (m_bMultiLine) { + if (swText.GetAt(i + 1) == 0x0D) + i += 1; + + wp = InsertSection(wp, nullptr, nullptr); + } + break; + case 0x09: + word = 0x20; + default: + wp = InsertWord(wp, word, FXFONT_DEFAULT_CHARSET, nullptr); + break; + } + if (wp == oldwp) + break; + } + return wp; +} + +CPVT_WordPlace CPDF_VariableText::DeleteWords( + const CPVT_WordRange& PlaceRange) { + bool bLastSecPos = false; + if (CSection* pSection = m_SectionArray.GetAt(PlaceRange.EndPos.nSecIndex)) + bLastSecPos = (PlaceRange.EndPos == pSection->GetEndWordPlace()); + + ClearWords(PlaceRange); + if (PlaceRange.BeginPos.nSecIndex != PlaceRange.EndPos.nSecIndex) { + ClearEmptySections(PlaceRange); + if (!bLastSecPos) + LinkLatterSection(PlaceRange.BeginPos); + } + return PlaceRange.BeginPos; +} + +CPVT_WordPlace CPDF_VariableText::DeleteWord(const CPVT_WordPlace& place) { + return ClearRightWord(AdjustLineHeader(place, true)); +} + +CPVT_WordPlace CPDF_VariableText::BackSpaceWord(const CPVT_WordPlace& place) { + return ClearLeftWord(AdjustLineHeader(place, true)); +} + +void CPDF_VariableText::SetText(const CFX_WideString& swText) { + DeleteWords(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace())); + CPVT_WordPlace wp(0, 0, -1); + CPVT_SectionInfo secinfo; + if (CSection* pSection = m_SectionArray.GetAt(0)) + pSection->m_SecInfo = secinfo; + + int32_t nCharCount = 0; + for (int32_t i = 0, sz = swText.GetLength(); i < sz; i++) { + if (m_nLimitChar > 0 && nCharCount >= m_nLimitChar) + break; + if (m_nCharArray > 0 && nCharCount >= m_nCharArray) + break; + + uint16_t word = swText.GetAt(i); + switch (word) { + case 0x0D: + if (m_bMultiLine) { + if (swText.GetAt(i + 1) == 0x0A) + i += 1; + + wp.nSecIndex++; + wp.nLineIndex = 0; + wp.nWordIndex = -1; + AddSection(wp, secinfo); + } + break; + case 0x0A: + if (m_bMultiLine) { + if (swText.GetAt(i + 1) == 0x0D) + i += 1; + + wp.nSecIndex++; + wp.nLineIndex = 0; + wp.nWordIndex = -1; + AddSection(wp, secinfo); + } + break; + case 0x09: + word = 0x20; + default: + wp = InsertWord(wp, word, FXFONT_DEFAULT_CHARSET, nullptr); + break; + } + nCharCount++; + } +} + +void CPDF_VariableText::UpdateWordPlace(CPVT_WordPlace& place) const { + if (place.nSecIndex < 0) + place = GetBeginWordPlace(); + if (place.nSecIndex >= m_SectionArray.GetSize()) + place = GetEndWordPlace(); + + place = AdjustLineHeader(place, true); + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) + pSection->UpdateWordPlace(place); +} + +int32_t CPDF_VariableText::WordPlaceToWordIndex( + const CPVT_WordPlace& place) const { + CPVT_WordPlace newplace = place; + UpdateWordPlace(newplace); + int32_t nIndex = 0; + int32_t i = 0; + int32_t sz = 0; + for (i = 0, sz = m_SectionArray.GetSize(); i < sz && i < newplace.nSecIndex; + i++) { + if (CSection* pSection = m_SectionArray.GetAt(i)) { + nIndex += pSection->m_WordArray.GetSize(); + if (i != m_SectionArray.GetSize() - 1) + nIndex += kReturnLength; + } + } + if (i >= 0 && i < m_SectionArray.GetSize()) + nIndex += newplace.nWordIndex + kReturnLength; + return nIndex; +} + +CPVT_WordPlace CPDF_VariableText::WordIndexToWordPlace(int32_t index) const { + CPVT_WordPlace place = GetBeginWordPlace(); + int32_t nOldIndex = 0, nIndex = 0; + bool bFind = false; + for (int32_t i = 0, sz = m_SectionArray.GetSize(); i < sz; i++) { + if (CSection* pSection = m_SectionArray.GetAt(i)) { + nIndex += pSection->m_WordArray.GetSize(); + if (nIndex == index) { + place = pSection->GetEndWordPlace(); + bFind = true; + break; + } else if (nIndex > index) { + place.nSecIndex = i; + place.nWordIndex = index - nOldIndex - 1; + pSection->UpdateWordPlace(place); + bFind = true; + break; + } + if (i != m_SectionArray.GetSize() - 1) + nIndex += kReturnLength; + nOldIndex = nIndex; + } + } + if (!bFind) + place = GetEndWordPlace(); + return place; +} + +CPVT_WordPlace CPDF_VariableText::GetBeginWordPlace() const { + return m_bInitial ? CPVT_WordPlace(0, 0, -1) : CPVT_WordPlace(); +} + +CPVT_WordPlace CPDF_VariableText::GetEndWordPlace() const { + if (CSection* pSection = m_SectionArray.GetAt(m_SectionArray.GetSize() - 1)) + return pSection->GetEndWordPlace(); + return CPVT_WordPlace(); +} + +CPVT_WordPlace CPDF_VariableText::GetPrevWordPlace( + const CPVT_WordPlace& place) const { + if (place.nSecIndex < 0) + return GetBeginWordPlace(); + if (place.nSecIndex >= m_SectionArray.GetSize()) + return GetEndWordPlace(); + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { + if (place.WordCmp(pSection->GetBeginWordPlace()) <= 0) { + if (CSection* pPrevSection = m_SectionArray.GetAt(place.nSecIndex - 1)) + return pPrevSection->GetEndWordPlace(); + return GetBeginWordPlace(); + } + return pSection->GetPrevWordPlace(place); + } + return place; +} + +CPVT_WordPlace CPDF_VariableText::GetNextWordPlace( + const CPVT_WordPlace& place) const { + if (place.nSecIndex < 0) + return GetBeginWordPlace(); + if (place.nSecIndex >= m_SectionArray.GetSize()) + return GetEndWordPlace(); + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { + if (place.WordCmp(pSection->GetEndWordPlace()) >= 0) { + if (CSection* pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) + return pNextSection->GetBeginWordPlace(); + return GetEndWordPlace(); + } + return pSection->GetNextWordPlace(place); + } + return place; +} + +CPVT_WordPlace CPDF_VariableText::SearchWordPlace( + const CFX_PointF& point) const { + CFX_PointF pt = OutToIn(point); + CPVT_WordPlace place = GetBeginWordPlace(); + int32_t nLeft = 0; + int32_t nRight = m_SectionArray.GetSize() - 1; + int32_t nMid = m_SectionArray.GetSize() / 2; + bool bUp = true; + bool bDown = true; + while (nLeft <= nRight) { + if (CSection* pSection = m_SectionArray.GetAt(nMid)) { + if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.top)) { + bUp = false; + } + if (IsFloatBigger(pSection->m_SecInfo.rcSection.bottom, pt.y)) { + bDown = false; + } + if (IsFloatSmaller(pt.y, pSection->m_SecInfo.rcSection.top)) { + nRight = nMid - 1; + nMid = (nLeft + nRight) / 2; + continue; + } else if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.bottom)) { + nLeft = nMid + 1; + nMid = (nLeft + nRight) / 2; + continue; + } else { + place = pSection->SearchWordPlace( + CFX_PointF(pt.x - pSection->m_SecInfo.rcSection.left, + pt.y - pSection->m_SecInfo.rcSection.top)); + place.nSecIndex = nMid; + return place; + } + } else { + break; + } + } + if (bUp) + place = GetBeginWordPlace(); + if (bDown) + place = GetEndWordPlace(); + return place; +} + +CPVT_WordPlace CPDF_VariableText::GetUpWordPlace( + const CPVT_WordPlace& place, + const CFX_PointF& point) const { + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { + CPVT_WordPlace temp = place; + CFX_PointF pt = OutToIn(point); + if (temp.nLineIndex-- > 0) { + return pSection->SearchWordPlace( + pt.x - pSection->m_SecInfo.rcSection.left, temp); + } + if (temp.nSecIndex-- > 0) { + if (CSection* pLastSection = m_SectionArray.GetAt(temp.nSecIndex)) { + temp.nLineIndex = pLastSection->m_LineArray.GetSize() - 1; + return pLastSection->SearchWordPlace( + pt.x - pLastSection->m_SecInfo.rcSection.left, temp); + } + } + } + return place; +} + +CPVT_WordPlace CPDF_VariableText::GetDownWordPlace( + const CPVT_WordPlace& place, + const CFX_PointF& point) const { + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { + CPVT_WordPlace temp = place; + CFX_PointF pt = OutToIn(point); + if (temp.nLineIndex++ < pSection->m_LineArray.GetSize() - 1) { + return pSection->SearchWordPlace( + pt.x - pSection->m_SecInfo.rcSection.left, temp); + } + if (temp.nSecIndex++ < m_SectionArray.GetSize() - 1) { + if (CSection* pNextSection = m_SectionArray.GetAt(temp.nSecIndex)) { + temp.nLineIndex = 0; + return pNextSection->SearchWordPlace( + pt.x - pSection->m_SecInfo.rcSection.left, temp); + } + } + } + return place; +} + +CPVT_WordPlace CPDF_VariableText::GetLineBeginPlace( + const CPVT_WordPlace& place) const { + return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1); +} + +CPVT_WordPlace CPDF_VariableText::GetLineEndPlace( + const CPVT_WordPlace& place) const { + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { + if (CLine* pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) + return pLine->GetEndWordPlace(); + } + return place; +} + +CPVT_WordPlace CPDF_VariableText::GetSectionBeginPlace( + const CPVT_WordPlace& place) const { + return CPVT_WordPlace(place.nSecIndex, 0, -1); +} + +CPVT_WordPlace CPDF_VariableText::GetSectionEndPlace( + const CPVT_WordPlace& place) const { + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) + return pSection->GetEndWordPlace(); + return place; +} + +int32_t CPDF_VariableText::GetTotalWords() const { + int32_t nTotal = 0; + for (int32_t i = 0, sz = m_SectionArray.GetSize(); i < sz; i++) { + if (CSection* pSection = m_SectionArray.GetAt(i)) + nTotal += (pSection->m_WordArray.GetSize() + kReturnLength); + } + + return nTotal - kReturnLength; +} + +void CPDF_VariableText::ResetSectionArray() { + for (int32_t s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) + delete m_SectionArray.GetAt(s); + + m_SectionArray.RemoveAll(); +} + +CPVT_WordPlace CPDF_VariableText::AddSection(const CPVT_WordPlace& place, + const CPVT_SectionInfo& secinfo) { + if (IsValid() && !m_bMultiLine) + return place; + + int32_t nSecIndex = + std::max(std::min(place.nSecIndex, m_SectionArray.GetSize()), 0); + CSection* pSection = new CSection(this); + pSection->m_SecInfo = secinfo; + pSection->SecPlace.nSecIndex = nSecIndex; + if (nSecIndex == m_SectionArray.GetSize()) + m_SectionArray.Add(pSection); + else + m_SectionArray.InsertAt(nSecIndex, pSection); + + return place; +} + +CPVT_WordPlace CPDF_VariableText::AddLine(const CPVT_WordPlace& place, + const CPVT_LineInfo& lineinfo) { + if (m_SectionArray.IsEmpty()) + return place; + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) + return pSection->AddLine(lineinfo); + return place; +} + +CPVT_WordPlace CPDF_VariableText::AddWord(const CPVT_WordPlace& place, + const CPVT_WordInfo& wordinfo) { + if (m_SectionArray.GetSize() <= 0) { + return place; + } + CPVT_WordPlace newplace = place; + newplace.nSecIndex = + std::max(std::min(newplace.nSecIndex, m_SectionArray.GetSize() - 1), 0); + if (CSection* pSection = m_SectionArray.GetAt(newplace.nSecIndex)) + return pSection->AddWord(newplace, wordinfo); + return place; +} + +bool CPDF_VariableText::GetWordInfo(const CPVT_WordPlace& place, + CPVT_WordInfo& wordinfo) { + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { + if (CPVT_WordInfo* pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) { + wordinfo = *pWord; + return true; + } + } + return false; +} + +bool CPDF_VariableText::SetWordInfo(const CPVT_WordPlace& place, + const CPVT_WordInfo& wordinfo) { + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { + if (CPVT_WordInfo* pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) { + *pWord = wordinfo; + return true; + } + } + return false; +} + +bool CPDF_VariableText::GetLineInfo(const CPVT_WordPlace& place, + CPVT_LineInfo& lineinfo) { + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { + if (CLine* pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) { + lineinfo = pLine->m_LineInfo; + return true; + } + } + return false; +} + +bool CPDF_VariableText::GetSectionInfo(const CPVT_WordPlace& place, + CPVT_SectionInfo& secinfo) { + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { + secinfo = pSection->m_SecInfo; + return true; + } + return false; +} + +void CPDF_VariableText::SetPlateRect(const CFX_FloatRect& rect) { + m_rcPlate = rect; +} + +void CPDF_VariableText::SetContentRect(const CPVT_FloatRect& rect) { + m_rcContent = rect; +} + +CFX_FloatRect CPDF_VariableText::GetContentRect() const { + return InToOut(CPVT_FloatRect(m_rcContent)); +} + +const CFX_FloatRect& CPDF_VariableText::GetPlateRect() const { + return m_rcPlate; +} + +FX_FLOAT CPDF_VariableText::GetWordFontSize(const CPVT_WordInfo& WordInfo) { + return GetFontSize(); +} + +int32_t CPDF_VariableText::GetWordFontIndex(const CPVT_WordInfo& WordInfo) { + return WordInfo.nFontIndex; +} + +FX_FLOAT CPDF_VariableText::GetWordWidth(int32_t nFontIndex, + uint16_t Word, + uint16_t SubWord, + FX_FLOAT fCharSpace, + int32_t nHorzScale, + FX_FLOAT fFontSize, + FX_FLOAT fWordTail) { + return (GetCharWidth(nFontIndex, Word, SubWord) * fFontSize * kFontScale + + fCharSpace) * + nHorzScale * kScalePercent + + fWordTail; +} + +FX_FLOAT CPDF_VariableText::GetWordWidth(const CPVT_WordInfo& WordInfo) { + return GetWordWidth(GetWordFontIndex(WordInfo), WordInfo.Word, GetSubWord(), + GetCharSpace(WordInfo), GetHorzScale(WordInfo), + GetWordFontSize(WordInfo), WordInfo.fWordTail); +} + +FX_FLOAT CPDF_VariableText::GetLineAscent(const CPVT_SectionInfo& SecInfo) { + return GetFontAscent(GetDefaultFontIndex(), GetFontSize()); +} + +FX_FLOAT CPDF_VariableText::GetLineDescent(const CPVT_SectionInfo& SecInfo) { + return GetFontDescent(GetDefaultFontIndex(), GetFontSize()); +} + +FX_FLOAT CPDF_VariableText::GetFontAscent(int32_t nFontIndex, + FX_FLOAT fFontSize) { + return (FX_FLOAT)GetTypeAscent(nFontIndex) * fFontSize * kFontScale; +} + +FX_FLOAT CPDF_VariableText::GetFontDescent(int32_t nFontIndex, + FX_FLOAT fFontSize) { + return (FX_FLOAT)GetTypeDescent(nFontIndex) * fFontSize * kFontScale; +} + +FX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo& WordInfo, + FX_FLOAT fFontSize) { + return GetFontAscent(GetWordFontIndex(WordInfo), fFontSize); +} + +FX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo& WordInfo, + FX_FLOAT fFontSize) { + return GetFontDescent(GetWordFontIndex(WordInfo), fFontSize); +} + +FX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo& WordInfo) { + return GetFontAscent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo)); +} + +FX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo& WordInfo) { + return GetFontDescent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo)); +} + +FX_FLOAT CPDF_VariableText::GetLineLeading(const CPVT_SectionInfo& SecInfo) { + return m_fLineLeading; +} + +FX_FLOAT CPDF_VariableText::GetLineIndent(const CPVT_SectionInfo& SecInfo) { + return 0.0f; +} + +int32_t CPDF_VariableText::GetAlignment(const CPVT_SectionInfo& SecInfo) { + return m_nAlignment; +} + +FX_FLOAT CPDF_VariableText::GetCharSpace(const CPVT_WordInfo& WordInfo) { + return m_fCharSpace; +} + +int32_t CPDF_VariableText::GetHorzScale(const CPVT_WordInfo& WordInfo) { + return m_nHorzScale; +} + +void CPDF_VariableText::ClearSectionRightWords(const CPVT_WordPlace& place) { + CPVT_WordPlace wordplace = AdjustLineHeader(place, true); + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { + for (int32_t w = pSection->m_WordArray.GetSize() - 1; + w > wordplace.nWordIndex; w--) { + delete pSection->m_WordArray.GetAt(w); + pSection->m_WordArray.RemoveAt(w); + } + } +} + +CPVT_WordPlace CPDF_VariableText::AdjustLineHeader(const CPVT_WordPlace& place, + bool bPrevOrNext) const { + if (place.nWordIndex < 0 && place.nLineIndex > 0) + return bPrevOrNext ? GetPrevWordPlace(place) : GetNextWordPlace(place); + return place; +} + +bool CPDF_VariableText::ClearEmptySection(const CPVT_WordPlace& place) { + if (place.nSecIndex == 0 && m_SectionArray.GetSize() == 1) + return false; + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { + if (pSection->m_WordArray.GetSize() == 0) { + delete pSection; + m_SectionArray.RemoveAt(place.nSecIndex); + return true; + } + } + return false; +} + +void CPDF_VariableText::ClearEmptySections(const CPVT_WordRange& PlaceRange) { + CPVT_WordPlace wordplace; + for (int32_t s = PlaceRange.EndPos.nSecIndex; + s > PlaceRange.BeginPos.nSecIndex; s--) { + wordplace.nSecIndex = s; + ClearEmptySection(wordplace); + } +} + +void CPDF_VariableText::LinkLatterSection(const CPVT_WordPlace& place) { + CPVT_WordPlace oldplace = AdjustLineHeader(place, true); + if (CSection* pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) { + if (CSection* pSection = m_SectionArray.GetAt(oldplace.nSecIndex)) { + for (int32_t w = 0, sz = pNextSection->m_WordArray.GetSize(); w < sz; + w++) { + if (CPVT_WordInfo* pWord = pNextSection->m_WordArray.GetAt(w)) { + oldplace.nWordIndex++; + pSection->AddWord(oldplace, *pWord); + } + } + } + delete pNextSection; + m_SectionArray.RemoveAt(place.nSecIndex + 1); + } +} + +void CPDF_VariableText::ClearWords(const CPVT_WordRange& PlaceRange) { + CPVT_WordRange NewRange; + NewRange.BeginPos = AdjustLineHeader(PlaceRange.BeginPos, true); + NewRange.EndPos = AdjustLineHeader(PlaceRange.EndPos, true); + for (int32_t s = NewRange.EndPos.nSecIndex; s >= NewRange.BeginPos.nSecIndex; + s--) { + if (CSection* pSection = m_SectionArray.GetAt(s)) + pSection->ClearWords(NewRange); + } +} + +CPVT_WordPlace CPDF_VariableText::ClearLeftWord(const CPVT_WordPlace& place) { + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { + CPVT_WordPlace leftplace = GetPrevWordPlace(place); + if (leftplace != place) { + if (leftplace.nSecIndex != place.nSecIndex) { + if (pSection->m_WordArray.GetSize() == 0) + ClearEmptySection(place); + else + LinkLatterSection(leftplace); + } else { + pSection->ClearWord(place); + } + } + return leftplace; + } + return place; +} + +CPVT_WordPlace CPDF_VariableText::ClearRightWord(const CPVT_WordPlace& place) { + if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex)) { + CPVT_WordPlace rightplace = + AdjustLineHeader(GetNextWordPlace(place), false); + if (rightplace != place) { + if (rightplace.nSecIndex != place.nSecIndex) + LinkLatterSection(place); + else + pSection->ClearWord(rightplace); + } + } + return place; +} + +void CPDF_VariableText::RearrangeAll() { + Rearrange(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace())); +} + +void CPDF_VariableText::RearrangePart(const CPVT_WordRange& PlaceRange) { + Rearrange(PlaceRange); +} + +CPVT_FloatRect CPDF_VariableText::Rearrange(const CPVT_WordRange& PlaceRange) { + CPVT_FloatRect rcRet; + if (IsValid()) { + if (m_bAutoFontSize) { + SetFontSize(GetAutoFontSize()); + rcRet = RearrangeSections( + CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace())); + } else { + rcRet = RearrangeSections(PlaceRange); + } + } + SetContentRect(rcRet); + return rcRet; +} + +FX_FLOAT CPDF_VariableText::GetAutoFontSize() { + int32_t nTotal = sizeof(gFontSizeSteps) / sizeof(uint8_t); + if (IsMultiLine()) + nTotal /= 4; + if (nTotal <= 0) + return 0; + if (GetPlateWidth() <= 0) + return 0; + + int32_t nLeft = 0; + int32_t nRight = nTotal - 1; + int32_t nMid = nTotal / 2; + while (nLeft <= nRight) { + if (IsBigger(gFontSizeSteps[nMid])) { + nRight = nMid - 1; + nMid = (nLeft + nRight) / 2; + continue; + } else { + nLeft = nMid + 1; + nMid = (nLeft + nRight) / 2; + continue; + } + } + return (FX_FLOAT)gFontSizeSteps[nMid]; +} + +bool CPDF_VariableText::IsBigger(FX_FLOAT fFontSize) const { + CFX_SizeF szTotal; + for (int32_t s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) { + if (CSection* pSection = m_SectionArray.GetAt(s)) { + CFX_SizeF size = pSection->GetSectionSize(fFontSize); + szTotal.width = std::max(size.width, szTotal.width); + szTotal.height += size.height; + if (IsFloatBigger(szTotal.width, GetPlateWidth()) || + IsFloatBigger(szTotal.height, GetPlateHeight())) { + return true; + } + } + } + return false; +} + +CPVT_FloatRect CPDF_VariableText::RearrangeSections( + const CPVT_WordRange& PlaceRange) { + CPVT_WordPlace place; + FX_FLOAT fPosY = 0; + FX_FLOAT fOldHeight; + int32_t nSSecIndex = PlaceRange.BeginPos.nSecIndex; + int32_t nESecIndex = PlaceRange.EndPos.nSecIndex; + CPVT_FloatRect rcRet; + for (int32_t s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) { + place.nSecIndex = s; + if (CSection* pSection = m_SectionArray.GetAt(s)) { + pSection->SecPlace = place; + CPVT_FloatRect rcSec = pSection->m_SecInfo.rcSection; + if (s >= nSSecIndex) { + if (s <= nESecIndex) { + rcSec = pSection->Rearrange(); + rcSec.top += fPosY; + rcSec.bottom += fPosY; + } else { + fOldHeight = pSection->m_SecInfo.rcSection.bottom - + pSection->m_SecInfo.rcSection.top; + rcSec.top = fPosY; + rcSec.bottom = fPosY + fOldHeight; + } + pSection->m_SecInfo.rcSection = rcSec; + pSection->ResetLinePlace(); + } + if (s == 0) { + rcRet = rcSec; + } else { + rcRet.left = std::min(rcSec.left, rcRet.left); + rcRet.top = std::min(rcSec.top, rcRet.top); + rcRet.right = std::max(rcSec.right, rcRet.right); + rcRet.bottom = std::max(rcSec.bottom, rcRet.bottom); + } + fPosY += rcSec.Height(); + } + } + return rcRet; +} + +int32_t CPDF_VariableText::GetCharWidth(int32_t nFontIndex, + uint16_t Word, + uint16_t SubWord) { + if (!m_pVTProvider) + return 0; + uint16_t word = SubWord ? SubWord : Word; + return m_pVTProvider->GetCharWidth(nFontIndex, word); +} + +int32_t CPDF_VariableText::GetTypeAscent(int32_t nFontIndex) { + return m_pVTProvider ? m_pVTProvider->GetTypeAscent(nFontIndex) : 0; +} + +int32_t CPDF_VariableText::GetTypeDescent(int32_t nFontIndex) { + return m_pVTProvider ? m_pVTProvider->GetTypeDescent(nFontIndex) : 0; +} + +int32_t CPDF_VariableText::GetWordFontIndex(uint16_t word, + int32_t charset, + int32_t nFontIndex) { + return m_pVTProvider + ? m_pVTProvider->GetWordFontIndex(word, charset, nFontIndex) + : -1; +} + +int32_t CPDF_VariableText::GetDefaultFontIndex() { + return m_pVTProvider ? m_pVTProvider->GetDefaultFontIndex() : -1; +} + +bool CPDF_VariableText::IsLatinWord(uint16_t word) { + return m_pVTProvider ? m_pVTProvider->IsLatinWord(word) : false; +} + +CPDF_VariableText::Iterator* CPDF_VariableText::GetIterator() { + if (!m_pVTIterator) + m_pVTIterator = pdfium::MakeUnique(this); + return m_pVTIterator.get(); +} + +void CPDF_VariableText::SetProvider(CPDF_VariableText::Provider* pProvider) { + m_pVTProvider = pProvider; +} + +CFX_SizeF CPDF_VariableText::GetPlateSize() const { + return CFX_SizeF(GetPlateWidth(), GetPlateHeight()); +} + +CFX_PointF CPDF_VariableText::GetBTPoint() const { + return CFX_PointF(m_rcPlate.left, m_rcPlate.top); +} + +CFX_PointF CPDF_VariableText::GetETPoint() const { + return CFX_PointF(m_rcPlate.right, m_rcPlate.bottom); +} + +CFX_PointF CPDF_VariableText::InToOut(const CFX_PointF& point) const { + return CFX_PointF(point.x + GetBTPoint().x, GetBTPoint().y - point.y); +} + +CFX_PointF CPDF_VariableText::OutToIn(const CFX_PointF& point) const { + return CFX_PointF(point.x - GetBTPoint().x, GetBTPoint().y - point.y); +} + +CFX_FloatRect CPDF_VariableText::InToOut(const CPVT_FloatRect& rect) const { + CFX_PointF ptLeftTop = InToOut(CFX_PointF(rect.left, rect.top)); + CFX_PointF ptRightBottom = InToOut(CFX_PointF(rect.right, rect.bottom)); + return CFX_FloatRect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, + ptLeftTop.y); +} + +CPVT_FloatRect CPDF_VariableText::OutToIn(const CFX_FloatRect& rect) const { + CFX_PointF ptLeftTop = OutToIn(CFX_PointF(rect.left, rect.top)); + CFX_PointF ptRightBottom = OutToIn(CFX_PointF(rect.right, rect.bottom)); + return CPVT_FloatRect(ptLeftTop.x, ptLeftTop.y, ptRightBottom.x, + ptRightBottom.y); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_variabletext.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_variabletext.h new file mode 100644 index 000000000000..8e7c0c964a68 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_variabletext.h @@ -0,0 +1,243 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_VARIABLETEXT_H_ +#define CORE_FPDFDOC_CPDF_VARIABLETEXT_H_ + +#include + +#include "core/fpdfdoc/cpvt_arraytemplate.h" +#include "core/fpdfdoc/cpvt_floatrect.h" +#include "core/fpdfdoc/cpvt_line.h" +#include "core/fpdfdoc/cpvt_lineinfo.h" +#include "core/fpdfdoc/cpvt_wordplace.h" +#include "core/fpdfdoc/cpvt_wordrange.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxge/fx_font.h" + +class CPVT_Word; +class CSection; +class IPVT_FontMap; +struct CPVT_SecProps; +struct CPVT_Section; +struct CPVT_SectionInfo; + +struct CPVT_WordInfo; +struct CPVT_WordProps; + +#define VARIABLETEXT_HALF 0.5f + +class CPDF_VariableText { + public: + enum class ScriptType { Normal, Super, Sub }; + + class Iterator { + public: + explicit Iterator(CPDF_VariableText* pVT); + ~Iterator(); + + bool NextWord(); + bool PrevWord(); + bool NextLine(); + bool PrevLine(); + bool NextSection(); + bool PrevSection(); + bool SetWord(const CPVT_Word& word); + bool GetWord(CPVT_Word& word) const; + bool GetLine(CPVT_Line& line) const; + bool GetSection(CPVT_Section& section) const; + bool SetSection(const CPVT_Section& section); + void SetAt(int32_t nWordIndex); + void SetAt(const CPVT_WordPlace& place); + const CPVT_WordPlace& GetAt() const { return m_CurPos; } + + private: + CPVT_WordPlace m_CurPos; + CPDF_VariableText* const m_pVT; + }; + + class Provider { + public: + explicit Provider(IPVT_FontMap* pFontMap); + virtual ~Provider(); + + virtual int32_t GetCharWidth(int32_t nFontIndex, uint16_t word); + virtual int32_t GetTypeAscent(int32_t nFontIndex); + virtual int32_t GetTypeDescent(int32_t nFontIndex); + virtual int32_t GetWordFontIndex(uint16_t word, + int32_t charset, + int32_t nFontIndex); + virtual bool IsLatinWord(uint16_t word); + virtual int32_t GetDefaultFontIndex(); + + private: + IPVT_FontMap* const m_pFontMap; + }; + + CPDF_VariableText(); + ~CPDF_VariableText(); + + void SetProvider(CPDF_VariableText::Provider* pProvider); + CPDF_VariableText::Iterator* GetIterator(); + + void SetContentRect(const CPVT_FloatRect& rect); + CFX_FloatRect GetContentRect() const; + void SetPlateRect(const CFX_FloatRect& rect); + const CFX_FloatRect& GetPlateRect() const; + + void SetAlignment(int32_t nFormat) { m_nAlignment = nFormat; } + void SetPasswordChar(uint16_t wSubWord) { m_wSubWord = wSubWord; } + void SetLimitChar(int32_t nLimitChar) { m_nLimitChar = nLimitChar; } + void SetCharSpace(FX_FLOAT fCharSpace) { m_fCharSpace = fCharSpace; } + void SetMultiLine(bool bMultiLine) { m_bMultiLine = bMultiLine; } + void SetAutoReturn(bool bAuto) { m_bLimitWidth = bAuto; } + void SetFontSize(FX_FLOAT fFontSize) { m_fFontSize = fFontSize; } + void SetCharArray(int32_t nCharArray) { m_nCharArray = nCharArray; } + void SetAutoFontSize(bool bAuto) { m_bAutoFontSize = bAuto; } + void Initialize(); + + bool IsValid() const { return m_bInitial; } + + void RearrangeAll(); + void RearrangePart(const CPVT_WordRange& PlaceRange); + void ResetAll(); + void SetText(const CFX_WideString& text); + CPVT_WordPlace InsertWord(const CPVT_WordPlace& place, + uint16_t word, + int32_t charset, + const CPVT_WordProps* pWordProps); + CPVT_WordPlace InsertSection(const CPVT_WordPlace& place, + const CPVT_SecProps* pSecProps, + const CPVT_WordProps* pWordProps); + CPVT_WordPlace InsertText(const CPVT_WordPlace& place, const FX_WCHAR* text); + CPVT_WordPlace DeleteWords(const CPVT_WordRange& PlaceRange); + CPVT_WordPlace DeleteWord(const CPVT_WordPlace& place); + CPVT_WordPlace BackSpaceWord(const CPVT_WordPlace& place); + + int32_t GetTotalWords() const; + FX_FLOAT GetFontSize() const { return m_fFontSize; } + int32_t GetAlignment() const { return m_nAlignment; } + uint16_t GetPasswordChar() const { return GetSubWord(); } + int32_t GetCharArray() const { return m_nCharArray; } + int32_t GetLimitChar() const { return m_nLimitChar; } + bool IsMultiLine() const { return m_bMultiLine; } + int32_t GetHorzScale() const { return m_nHorzScale; } + FX_FLOAT GetCharSpace() const { return m_fCharSpace; } + CPVT_WordPlace GetBeginWordPlace() const; + CPVT_WordPlace GetEndWordPlace() const; + CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const; + CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace& place) const; + CPVT_WordPlace SearchWordPlace(const CFX_PointF& point) const; + CPVT_WordPlace GetUpWordPlace(const CPVT_WordPlace& place, + const CFX_PointF& point) const; + CPVT_WordPlace GetDownWordPlace(const CPVT_WordPlace& place, + const CFX_PointF& point) const; + CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace& place) const; + CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace& place) const; + CPVT_WordPlace GetSectionBeginPlace(const CPVT_WordPlace& place) const; + CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace& place) const; + void UpdateWordPlace(CPVT_WordPlace& place) const; + CPVT_WordPlace AdjustLineHeader(const CPVT_WordPlace& place, + bool bPrevOrNext) const; + int32_t WordPlaceToWordIndex(const CPVT_WordPlace& place) const; + CPVT_WordPlace WordIndexToWordPlace(int32_t index) const; + + uint16_t GetSubWord() const { return m_wSubWord; } + + FX_FLOAT GetPlateWidth() const { return m_rcPlate.right - m_rcPlate.left; } + FX_FLOAT GetPlateHeight() const { return m_rcPlate.top - m_rcPlate.bottom; } + CFX_SizeF GetPlateSize() const; + CFX_PointF GetBTPoint() const; + CFX_PointF GetETPoint() const; + + CFX_PointF InToOut(const CFX_PointF& point) const; + CFX_PointF OutToIn(const CFX_PointF& point) const; + CFX_FloatRect InToOut(const CPVT_FloatRect& rect) const; + CPVT_FloatRect OutToIn(const CFX_FloatRect& rect) const; + + private: + friend class CTypeset; + friend class CSection; + + int32_t GetCharWidth(int32_t nFontIndex, uint16_t Word, uint16_t SubWord); + int32_t GetTypeAscent(int32_t nFontIndex); + int32_t GetTypeDescent(int32_t nFontIndex); + int32_t GetWordFontIndex(uint16_t word, int32_t charset, int32_t nFontIndex); + int32_t GetDefaultFontIndex(); + bool IsLatinWord(uint16_t word); + + CPVT_WordPlace AddSection(const CPVT_WordPlace& place, + const CPVT_SectionInfo& secinfo); + CPVT_WordPlace AddLine(const CPVT_WordPlace& place, + const CPVT_LineInfo& lineinfo); + CPVT_WordPlace AddWord(const CPVT_WordPlace& place, + const CPVT_WordInfo& wordinfo); + bool GetWordInfo(const CPVT_WordPlace& place, CPVT_WordInfo& wordinfo); + bool SetWordInfo(const CPVT_WordPlace& place, const CPVT_WordInfo& wordinfo); + bool GetLineInfo(const CPVT_WordPlace& place, CPVT_LineInfo& lineinfo); + bool GetSectionInfo(const CPVT_WordPlace& place, CPVT_SectionInfo& secinfo); + FX_FLOAT GetWordFontSize(const CPVT_WordInfo& WordInfo); + FX_FLOAT GetWordWidth(int32_t nFontIndex, + uint16_t Word, + uint16_t SubWord, + FX_FLOAT fCharSpace, + int32_t nHorzScale, + FX_FLOAT fFontSize, + FX_FLOAT fWordTail); + FX_FLOAT GetWordWidth(const CPVT_WordInfo& WordInfo); + FX_FLOAT GetWordAscent(const CPVT_WordInfo& WordInfo, FX_FLOAT fFontSize); + FX_FLOAT GetWordDescent(const CPVT_WordInfo& WordInfo, FX_FLOAT fFontSize); + FX_FLOAT GetWordAscent(const CPVT_WordInfo& WordInfo); + FX_FLOAT GetWordDescent(const CPVT_WordInfo& WordInfo); + FX_FLOAT GetLineAscent(const CPVT_SectionInfo& SecInfo); + FX_FLOAT GetLineDescent(const CPVT_SectionInfo& SecInfo); + FX_FLOAT GetFontAscent(int32_t nFontIndex, FX_FLOAT fFontSize); + FX_FLOAT GetFontDescent(int32_t nFontIndex, FX_FLOAT fFontSize); + int32_t GetWordFontIndex(const CPVT_WordInfo& WordInfo); + FX_FLOAT GetCharSpace(const CPVT_WordInfo& WordInfo); + int32_t GetHorzScale(const CPVT_WordInfo& WordInfo); + FX_FLOAT GetLineLeading(const CPVT_SectionInfo& SecInfo); + FX_FLOAT GetLineIndent(const CPVT_SectionInfo& SecInfo); + int32_t GetAlignment(const CPVT_SectionInfo& SecInfo); + + void ClearSectionRightWords(const CPVT_WordPlace& place); + + bool ClearEmptySection(const CPVT_WordPlace& place); + void ClearEmptySections(const CPVT_WordRange& PlaceRange); + void LinkLatterSection(const CPVT_WordPlace& place); + void ClearWords(const CPVT_WordRange& PlaceRange); + CPVT_WordPlace ClearLeftWord(const CPVT_WordPlace& place); + CPVT_WordPlace ClearRightWord(const CPVT_WordPlace& place); + + CPVT_FloatRect Rearrange(const CPVT_WordRange& PlaceRange); + FX_FLOAT GetAutoFontSize(); + bool IsBigger(FX_FLOAT fFontSize) const; + CPVT_FloatRect RearrangeSections(const CPVT_WordRange& PlaceRange); + + void ResetSectionArray(); + + CPVT_ArrayTemplate m_SectionArray; + int32_t m_nLimitChar; + int32_t m_nCharArray; + bool m_bMultiLine; + bool m_bLimitWidth; + bool m_bAutoFontSize; + int32_t m_nAlignment; + FX_FLOAT m_fLineLeading; + FX_FLOAT m_fCharSpace; + int32_t m_nHorzScale; + uint16_t m_wSubWord; + FX_FLOAT m_fFontSize; + bool m_bInitial; + CPDF_VariableText::Provider* m_pVTProvider; + std::unique_ptr m_pVTIterator; + CFX_FloatRect m_rcPlate; + CPVT_FloatRect m_rcContent; +}; + +#endif // CORE_FPDFDOC_CPDF_VARIABLETEXT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_viewerpreferences.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_viewerpreferences.cpp new file mode 100644 index 000000000000..f1fc4b0347d3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_viewerpreferences.cpp @@ -0,0 +1,60 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpdf_viewerpreferences.h" + +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" + +CPDF_ViewerPreferences::CPDF_ViewerPreferences(CPDF_Document* pDoc) + : m_pDoc(pDoc) {} + +CPDF_ViewerPreferences::~CPDF_ViewerPreferences() {} + +bool CPDF_ViewerPreferences::IsDirectionR2L() const { + CPDF_Dictionary* pDict = GetViewerPreferences(); + return pDict ? pDict->GetStringFor("Direction") == "R2L" : false; +} + +bool CPDF_ViewerPreferences::PrintScaling() const { + CPDF_Dictionary* pDict = GetViewerPreferences(); + return pDict ? pDict->GetStringFor("PrintScaling") != "None" : true; +} + +int32_t CPDF_ViewerPreferences::NumCopies() const { + CPDF_Dictionary* pDict = GetViewerPreferences(); + return pDict ? pDict->GetIntegerFor("NumCopies") : 1; +} + +CPDF_Array* CPDF_ViewerPreferences::PrintPageRange() const { + CPDF_Dictionary* pDict = GetViewerPreferences(); + return pDict ? pDict->GetArrayFor("PrintPageRange") : nullptr; +} + +CFX_ByteString CPDF_ViewerPreferences::Duplex() const { + CPDF_Dictionary* pDict = GetViewerPreferences(); + return pDict ? pDict->GetStringFor("Duplex") : CFX_ByteString("None"); +} + +bool CPDF_ViewerPreferences::GenericName(const CFX_ByteString& bsKey, + CFX_ByteString* bsVal) const { + ASSERT(bsVal); + CPDF_Dictionary* pDict = GetViewerPreferences(); + if (!pDict) + return false; + + const CPDF_Name* pName = ToName(pDict->GetObjectFor(bsKey)); + if (!pName) + return false; + + *bsVal = pName->GetString(); + return true; +} + +CPDF_Dictionary* CPDF_ViewerPreferences::GetViewerPreferences() const { + CPDF_Dictionary* pDict = m_pDoc->GetRoot(); + return pDict ? pDict->GetDictFor("ViewerPreferences") : nullptr; +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpdf_viewerpreferences.h b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_viewerpreferences.h new file mode 100644 index 000000000000..c7e9112380d6 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpdf_viewerpreferences.h @@ -0,0 +1,39 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPDF_VIEWERPREFERENCES_H_ +#define CORE_FPDFDOC_CPDF_VIEWERPREFERENCES_H_ + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Array; +class CPDF_Dictionary; +class CPDF_Document; + +class CPDF_ViewerPreferences { + public: + explicit CPDF_ViewerPreferences(CPDF_Document* pDoc); + ~CPDF_ViewerPreferences(); + + bool IsDirectionR2L() const; + bool PrintScaling() const; + int32_t NumCopies() const; + CPDF_Array* PrintPageRange() const; + CFX_ByteString Duplex() const; + + // Gets the entry for |bsKey|. If the entry exists and it is of type name, + // then this method writes the value into |bsVal| and returns true. Otherwise + // returns false and |bsVal| is untouched. |bsVal| must not be NULL. + bool GenericName(const CFX_ByteString& bsKey, CFX_ByteString* bsVal) const; + + private: + CPDF_Dictionary* GetViewerPreferences() const; + + CPDF_Document* const m_pDoc; +}; + +#endif // CORE_FPDFDOC_CPDF_VIEWERPREFERENCES_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_arraytemplate.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_arraytemplate.h new file mode 100644 index 000000000000..5274bd9ba44f --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_arraytemplate.h @@ -0,0 +1,30 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_ARRAYTEMPLATE_H_ +#define CORE_FPDFDOC_CPVT_ARRAYTEMPLATE_H_ + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_system.h" + +template +class CPVT_ArrayTemplate : public CFX_ArrayTemplate { + public: + bool IsEmpty() { return CFX_ArrayTemplate::GetSize() <= 0; } + + TYPE GetAt(int nIndex) const { + if (nIndex >= 0 && nIndex < CFX_ArrayTemplate::GetSize()) + return CFX_ArrayTemplate::GetAt(nIndex); + return nullptr; + } + + void RemoveAt(int nIndex) { + if (nIndex >= 0 && nIndex < CFX_ArrayTemplate::GetSize()) + CFX_ArrayTemplate::RemoveAt(nIndex); + } +}; + +#endif // CORE_FPDFDOC_CPVT_ARRAYTEMPLATE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_color.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_color.cpp new file mode 100644 index 000000000000..e0e6a26db7ab --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_color.cpp @@ -0,0 +1,51 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpvt_color.h" + +#include "core/fpdfapi/parser/cpdf_simple_parser.h" + +// Static. +CPVT_Color CPVT_Color::ParseColor(const CFX_ByteString& str) { + CPDF_SimpleParser syntax(str.AsStringC()); + if (syntax.FindTagParamFromStart("g", 1)) + return CPVT_Color(CPVT_Color::kGray, FX_atof(syntax.GetWord())); + + if (syntax.FindTagParamFromStart("rg", 3)) { + FX_FLOAT f1 = FX_atof(syntax.GetWord()); + FX_FLOAT f2 = FX_atof(syntax.GetWord()); + FX_FLOAT f3 = FX_atof(syntax.GetWord()); + return CPVT_Color(CPVT_Color::kRGB, f1, f2, f3); + } + if (syntax.FindTagParamFromStart("k", 4)) { + FX_FLOAT f1 = FX_atof(syntax.GetWord()); + FX_FLOAT f2 = FX_atof(syntax.GetWord()); + FX_FLOAT f3 = FX_atof(syntax.GetWord()); + FX_FLOAT f4 = FX_atof(syntax.GetWord()); + return CPVT_Color(CPVT_Color::kCMYK, f1, f2, f3, f4); + } + return CPVT_Color(CPVT_Color::kTransparent); +} + +// Static. +CPVT_Color CPVT_Color::ParseColor(const CPDF_Array& array) { + CPVT_Color rt; + switch (array.GetCount()) { + case 1: + rt = CPVT_Color(CPVT_Color::kGray, array.GetFloatAt(0)); + break; + case 3: + rt = CPVT_Color(CPVT_Color::kRGB, array.GetFloatAt(0), + array.GetFloatAt(1), array.GetFloatAt(2)); + break; + case 4: + rt = CPVT_Color(CPVT_Color::kCMYK, array.GetFloatAt(0), + array.GetFloatAt(1), array.GetFloatAt(2), + array.GetFloatAt(3)); + break; + } + return rt; +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_color.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_color.h new file mode 100644 index 000000000000..4d4942dbf989 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_color.h @@ -0,0 +1,38 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_COLOR_H_ +#define CORE_FPDFDOC_CPVT_COLOR_H_ + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +struct CPVT_Color { + enum Type { kTransparent = 0, kGray, kRGB, kCMYK }; + + CPVT_Color(Type type = kTransparent, + FX_FLOAT color1 = 0.0f, + FX_FLOAT color2 = 0.0f, + FX_FLOAT color3 = 0.0f, + FX_FLOAT color4 = 0.0f) + : nColorType(type), + fColor1(color1), + fColor2(color2), + fColor3(color3), + fColor4(color4) {} + + Type nColorType; + FX_FLOAT fColor1; + FX_FLOAT fColor2; + FX_FLOAT fColor3; + FX_FLOAT fColor4; + + static CPVT_Color ParseColor(const CFX_ByteString& str); + static CPVT_Color ParseColor(const CPDF_Array& array); +}; + +#endif // CORE_FPDFDOC_CPVT_COLOR_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_dash.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_dash.h new file mode 100644 index 000000000000..f80d104c96e7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_dash.h @@ -0,0 +1,21 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_DASH_H_ +#define CORE_FPDFDOC_CPVT_DASH_H_ + +#include + +struct CPVT_Dash { + CPVT_Dash(int32_t dash, int32_t gap, int32_t phase) + : nDash(dash), nGap(gap), nPhase(phase) {} + + int32_t nDash; + int32_t nGap; + int32_t nPhase; +}; + +#endif // CORE_FPDFDOC_CPVT_DASH_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_floatrect.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_floatrect.h new file mode 100644 index 000000000000..6fc4b8ebce56 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_floatrect.h @@ -0,0 +1,42 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_FLOATRECT_H_ +#define CORE_FPDFDOC_CPVT_FLOATRECT_H_ + +#include "core/fxcrt/fx_coordinates.h" + +class CPVT_FloatRect : public CFX_FloatRect { + public: + CPVT_FloatRect() { left = top = right = bottom = 0.0f; } + + CPVT_FloatRect(FX_FLOAT other_left, + FX_FLOAT other_top, + FX_FLOAT other_right, + FX_FLOAT other_bottom) { + left = other_left; + top = other_top; + right = other_right; + bottom = other_bottom; + } + + explicit CPVT_FloatRect(const CFX_FloatRect& rect) { + left = rect.left; + top = rect.top; + right = rect.right; + bottom = rect.bottom; + } + + void Default() { left = top = right = bottom = 0.0f; } + + FX_FLOAT Height() const { + if (top > bottom) + return top - bottom; + return bottom - top; + } +}; + +#endif // CORE_FPDFDOC_CPVT_FLOATRECT_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_fontmap.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_fontmap.cpp new file mode 100644 index 000000000000..283f60011b2d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_fontmap.cpp @@ -0,0 +1,94 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpvt_fontmap.h" + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfdoc/cpdf_interform.h" + +CPVT_FontMap::CPVT_FontMap(CPDF_Document* pDoc, + CPDF_Dictionary* pResDict, + CPDF_Font* pDefFont, + const CFX_ByteString& sDefFontAlias) + : m_pDocument(pDoc), + m_pResDict(pResDict), + m_pDefFont(pDefFont), + m_sDefFontAlias(sDefFontAlias), + m_pSysFont(nullptr), + m_sSysFontAlias() {} + +CPVT_FontMap::~CPVT_FontMap() {} + +void CPVT_FontMap::GetAnnotSysPDFFont(CPDF_Document* pDoc, + const CPDF_Dictionary* pResDict, + CPDF_Font*& pSysFont, + CFX_ByteString& sSysFontAlias) { + if (!pDoc || !pResDict) + return; + + CFX_ByteString sFontAlias; + CPDF_Dictionary* pFormDict = pDoc->GetRoot()->GetDictFor("AcroForm"); + CPDF_Font* pPDFFont = AddNativeInterFormFont(pFormDict, pDoc, sSysFontAlias); + if (!pPDFFont) + return; + + CPDF_Dictionary* pFontList = pResDict->GetDictFor("Font"); + if (pFontList && !pFontList->KeyExist(sSysFontAlias)) { + pFontList->SetNewFor(sSysFontAlias, pDoc, + pPDFFont->GetFontDict()->GetObjNum()); + } + pSysFont = pPDFFont; +} + +CPDF_Font* CPVT_FontMap::GetPDFFont(int32_t nFontIndex) { + switch (nFontIndex) { + case 0: + return m_pDefFont; + case 1: + if (!m_pSysFont) { + GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, + m_sSysFontAlias); + } + return m_pSysFont; + default: + return nullptr; + } +} + +CFX_ByteString CPVT_FontMap::GetPDFFontAlias(int32_t nFontIndex) { + switch (nFontIndex) { + case 0: + return m_sDefFontAlias; + case 1: + if (!m_pSysFont) { + GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, + m_sSysFontAlias); + } + return m_sSysFontAlias; + default: + return ""; + } +} + +int32_t CPVT_FontMap::GetWordFontIndex(uint16_t word, + int32_t charset, + int32_t nFontIndex) { + ASSERT(false); + return 0; +} + +int32_t CPVT_FontMap::CharCodeFromUnicode(int32_t nFontIndex, uint16_t word) { + ASSERT(false); + return 0; +} + +int32_t CPVT_FontMap::CharSetFromUnicode(uint16_t word, int32_t nOldCharset) { + ASSERT(false); + return FXFONT_ANSI_CHARSET; +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_fontmap.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_fontmap.h new file mode 100644 index 000000000000..98e390f40975 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_fontmap.h @@ -0,0 +1,50 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_FONTMAP_H_ +#define CORE_FPDFDOC_CPVT_FONTMAP_H_ + +#include + +#include "core/fpdfdoc/ipvt_fontmap.h" +#include "core/fxcrt/fx_string.h" + +class CPDF_Document; +class CPDF_Dictionary; +class CPDF_Font; + +class CPVT_FontMap : public IPVT_FontMap { + public: + CPVT_FontMap(CPDF_Document* pDoc, + CPDF_Dictionary* pResDict, + CPDF_Font* pDefFont, + const CFX_ByteString& sDefFontAlias); + ~CPVT_FontMap() override; + + // IPVT_FontMap: + CPDF_Font* GetPDFFont(int32_t nFontIndex) override; + CFX_ByteString GetPDFFontAlias(int32_t nFontIndex) override; + int32_t GetWordFontIndex(uint16_t word, + int32_t charset, + int32_t nFontIndex) override; + int32_t CharCodeFromUnicode(int32_t nFontIndex, uint16_t word) override; + int32_t CharSetFromUnicode(uint16_t word, int32_t nOldCharset) override; + + static void GetAnnotSysPDFFont(CPDF_Document* pDoc, + const CPDF_Dictionary* pResDict, + CPDF_Font*& pSysFont, + CFX_ByteString& sSysFontAlias); + + private: + CPDF_Document* const m_pDocument; + const CPDF_Dictionary* const m_pResDict; + CPDF_Font* const m_pDefFont; + const CFX_ByteString m_sDefFontAlias; + CPDF_Font* m_pSysFont; + CFX_ByteString m_sSysFontAlias; +}; + +#endif // CORE_FPDFDOC_CPVT_FONTMAP_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_generateap.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_generateap.cpp new file mode 100644 index 000000000000..15515151bc1c --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_generateap.cpp @@ -0,0 +1,1366 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpvt_generateap.h" + +#include +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/parser/cpdf_boolean.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_simple_parser.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfdoc/cpdf_annot.h" +#include "core/fpdfdoc/cpdf_formfield.h" +#include "core/fpdfdoc/cpvt_color.h" +#include "core/fpdfdoc/cpvt_fontmap.h" +#include "core/fpdfdoc/cpvt_word.h" +#include "third_party/base/ptr_util.h" + +namespace { + +bool GenerateWidgetAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict, + const int32_t& nWidgetType) { + CPDF_Dictionary* pFormDict = nullptr; + if (CPDF_Dictionary* pRootDict = pDoc->GetRoot()) + pFormDict = pRootDict->GetDictFor("AcroForm"); + if (!pFormDict) + return false; + + CFX_ByteString DA; + if (CPDF_Object* pDAObj = FPDF_GetFieldAttr(pAnnotDict, "DA")) + DA = pDAObj->GetString(); + if (DA.IsEmpty()) + DA = pFormDict->GetStringFor("DA"); + if (DA.IsEmpty()) + return false; + + CPDF_SimpleParser syntax(DA.AsStringC()); + syntax.FindTagParamFromStart("Tf", 2); + CFX_ByteString sFontName(syntax.GetWord()); + sFontName = PDF_NameDecode(sFontName); + if (sFontName.IsEmpty()) + return false; + + FX_FLOAT fFontSize = FX_atof(syntax.GetWord()); + CPVT_Color crText = CPVT_Color::ParseColor(DA); + CPDF_Dictionary* pDRDict = pFormDict->GetDictFor("DR"); + if (!pDRDict) + return false; + + CPDF_Dictionary* pDRFontDict = pDRDict->GetDictFor("Font"); + if (!pDRFontDict) + return false; + + CPDF_Dictionary* pFontDict = pDRFontDict->GetDictFor(sFontName.Mid(1)); + if (!pFontDict) { + pFontDict = pDoc->NewIndirect(); + pFontDict->SetNewFor("Type", "Font"); + pFontDict->SetNewFor("Subtype", "Type1"); + pFontDict->SetNewFor("BaseFont", "Helvetica"); + pFontDict->SetNewFor("Encoding", "WinAnsiEncoding"); + pDRFontDict->SetNewFor(sFontName.Mid(1), pDoc, + pFontDict->GetObjNum()); + } + CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict); + if (!pDefFont) + return false; + + CFX_FloatRect rcAnnot = pAnnotDict->GetRectFor("Rect"); + int32_t nRotate = 0; + if (CPDF_Dictionary* pMKDict = pAnnotDict->GetDictFor("MK")) + nRotate = pMKDict->GetIntegerFor("R"); + + CFX_FloatRect rcBBox; + CFX_Matrix matrix; + switch (nRotate % 360) { + case 0: + rcBBox = CFX_FloatRect(0, 0, rcAnnot.right - rcAnnot.left, + rcAnnot.top - rcAnnot.bottom); + break; + case 90: + matrix = CFX_Matrix(0, 1, -1, 0, rcAnnot.right - rcAnnot.left, 0); + rcBBox = CFX_FloatRect(0, 0, rcAnnot.top - rcAnnot.bottom, + rcAnnot.right - rcAnnot.left); + break; + case 180: + matrix = CFX_Matrix(-1, 0, 0, -1, rcAnnot.right - rcAnnot.left, + rcAnnot.top - rcAnnot.bottom); + rcBBox = CFX_FloatRect(0, 0, rcAnnot.right - rcAnnot.left, + rcAnnot.top - rcAnnot.bottom); + break; + case 270: + matrix = CFX_Matrix(0, -1, 1, 0, 0, rcAnnot.top - rcAnnot.bottom); + rcBBox = CFX_FloatRect(0, 0, rcAnnot.top - rcAnnot.bottom, + rcAnnot.right - rcAnnot.left); + break; + } + + BorderStyle nBorderStyle = BorderStyle::SOLID; + FX_FLOAT fBorderWidth = 1; + CPVT_Dash dsBorder(3, 0, 0); + CPVT_Color crLeftTop, crRightBottom; + if (CPDF_Dictionary* pBSDict = pAnnotDict->GetDictFor("BS")) { + if (pBSDict->KeyExist("W")) + fBorderWidth = pBSDict->GetNumberFor("W"); + + if (CPDF_Array* pArray = pBSDict->GetArrayFor("D")) { + dsBorder = CPVT_Dash(pArray->GetIntegerAt(0), pArray->GetIntegerAt(1), + pArray->GetIntegerAt(2)); + } + switch (pBSDict->GetStringFor("S").GetAt(0)) { + case 'S': + nBorderStyle = BorderStyle::SOLID; + break; + case 'D': + nBorderStyle = BorderStyle::DASH; + break; + case 'B': + nBorderStyle = BorderStyle::BEVELED; + fBorderWidth *= 2; + crLeftTop = CPVT_Color(CPVT_Color::kGray, 1); + crRightBottom = CPVT_Color(CPVT_Color::kGray, 0.5); + break; + case 'I': + nBorderStyle = BorderStyle::INSET; + fBorderWidth *= 2; + crLeftTop = CPVT_Color(CPVT_Color::kGray, 0.5); + crRightBottom = CPVT_Color(CPVT_Color::kGray, 0.75); + break; + case 'U': + nBorderStyle = BorderStyle::UNDERLINE; + break; + } + } + CPVT_Color crBorder, crBG; + if (CPDF_Dictionary* pMKDict = pAnnotDict->GetDictFor("MK")) { + if (CPDF_Array* pArray = pMKDict->GetArrayFor("BC")) + crBorder = CPVT_Color::ParseColor(*pArray); + if (CPDF_Array* pArray = pMKDict->GetArrayFor("BG")) + crBG = CPVT_Color::ParseColor(*pArray); + } + CFX_ByteTextBuf sAppStream; + CFX_ByteString sBG = + CPVT_GenerateAP::GenerateColorAP(crBG, PaintOperation::FILL); + if (sBG.GetLength() > 0) { + sAppStream << "q\n" << sBG << rcBBox.left << " " << rcBBox.bottom << " " + << rcBBox.Width() << " " << rcBBox.Height() << " re f\n" + << "Q\n"; + } + CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP( + rcBBox, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, + dsBorder); + if (sBorderStream.GetLength() > 0) + sAppStream << "q\n" << sBorderStream << "Q\n"; + + CFX_FloatRect rcBody = + CFX_FloatRect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth, + rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth); + rcBody.Normalize(); + + CPDF_Dictionary* pAPDict = pAnnotDict->GetDictFor("AP"); + if (!pAPDict) + pAPDict = pAnnotDict->SetNewFor("AP"); + + CPDF_Stream* pNormalStream = pAPDict->GetStreamFor("N"); + if (!pNormalStream) { + pNormalStream = pDoc->NewIndirect(); + pAPDict->SetNewFor("N", pDoc, pNormalStream->GetObjNum()); + } + CPDF_Dictionary* pStreamDict = pNormalStream->GetDict(); + if (pStreamDict) { + pStreamDict->SetMatrixFor("Matrix", matrix); + pStreamDict->SetRectFor("BBox", rcBBox); + CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources"); + if (pStreamResList) { + CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDictFor("Font"); + if (!pStreamResFontList) + pStreamResFontList = pStreamResList->SetNewFor("Font"); + if (!pStreamResFontList->KeyExist(sFontName)) { + pStreamResFontList->SetNewFor(sFontName, pDoc, + pFontDict->GetObjNum()); + } + } else { + pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone()); + pStreamResList = pStreamDict->GetDictFor("Resources"); + } + } + switch (nWidgetType) { + case 0: { + CFX_WideString swValue = + FPDF_GetFieldAttr(pAnnotDict, "V") + ? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText() + : CFX_WideString(); + int32_t nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q") + ? FPDF_GetFieldAttr(pAnnotDict, "Q")->GetInteger() + : 0; + uint32_t dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff") + ? FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger() + : 0; + uint32_t dwMaxLen = + FPDF_GetFieldAttr(pAnnotDict, "MaxLen") + ? FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger() + : 0; + CPVT_FontMap map( + pDoc, pStreamDict ? pStreamDict->GetDictFor("Resources") : nullptr, + pDefFont, sFontName.Right(sFontName.GetLength() - 1)); + CPDF_VariableText::Provider prd(&map); + CPDF_VariableText vt; + vt.SetProvider(&prd); + vt.SetPlateRect(rcBody); + vt.SetAlignment(nAlign); + if (IsFloatZero(fFontSize)) + vt.SetAutoFontSize(true); + else + vt.SetFontSize(fFontSize); + + bool bMultiLine = (dwFlags >> 12) & 1; + if (bMultiLine) { + vt.SetMultiLine(true); + vt.SetAutoReturn(true); + } + uint16_t subWord = 0; + if ((dwFlags >> 13) & 1) { + subWord = '*'; + vt.SetPasswordChar(subWord); + } + bool bCharArray = (dwFlags >> 24) & 1; + if (bCharArray) + vt.SetCharArray(dwMaxLen); + else + vt.SetLimitChar(dwMaxLen); + + vt.Initialize(); + vt.SetText(swValue); + vt.RearrangeAll(); + CFX_FloatRect rcContent = vt.GetContentRect(); + CFX_PointF ptOffset; + if (!bMultiLine) { + ptOffset = + CFX_PointF(0.0f, (rcContent.Height() - rcBody.Height()) / 2.0f); + } + CFX_ByteString sBody = CPVT_GenerateAP::GenerateEditAP( + &map, vt.GetIterator(), ptOffset, !bCharArray, subWord); + if (sBody.GetLength() > 0) { + sAppStream << "/Tx BMC\n" + << "q\n"; + if (rcContent.Width() > rcBody.Width() || + rcContent.Height() > rcBody.Height()) { + sAppStream << rcBody.left << " " << rcBody.bottom << " " + << rcBody.Width() << " " << rcBody.Height() + << " re\nW\nn\n"; + } + sAppStream << "BT\n" + << CPVT_GenerateAP::GenerateColorAP(crText, + PaintOperation::FILL) + << sBody << "ET\n" + << "Q\nEMC\n"; + } + } break; + case 1: { + CFX_WideString swValue = + FPDF_GetFieldAttr(pAnnotDict, "V") + ? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText() + : CFX_WideString(); + CPVT_FontMap map( + pDoc, pStreamDict ? pStreamDict->GetDictFor("Resources") : nullptr, + pDefFont, sFontName.Right(sFontName.GetLength() - 1)); + CPDF_VariableText::Provider prd(&map); + CPDF_VariableText vt; + vt.SetProvider(&prd); + CFX_FloatRect rcButton = rcBody; + rcButton.left = rcButton.right - 13; + rcButton.Normalize(); + CFX_FloatRect rcEdit = rcBody; + rcEdit.right = rcButton.left; + rcEdit.Normalize(); + vt.SetPlateRect(rcEdit); + if (IsFloatZero(fFontSize)) + vt.SetAutoFontSize(true); + else + vt.SetFontSize(fFontSize); + + vt.Initialize(); + vt.SetText(swValue); + vt.RearrangeAll(); + CFX_FloatRect rcContent = vt.GetContentRect(); + CFX_PointF ptOffset = + CFX_PointF(0.0f, (rcContent.Height() - rcEdit.Height()) / 2.0f); + CFX_ByteString sEdit = CPVT_GenerateAP::GenerateEditAP( + &map, vt.GetIterator(), ptOffset, true, 0); + if (sEdit.GetLength() > 0) { + sAppStream << "/Tx BMC\n" + << "q\n"; + sAppStream << rcEdit.left << " " << rcEdit.bottom << " " + << rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n"; + sAppStream << "BT\n" + << CPVT_GenerateAP::GenerateColorAP(crText, + PaintOperation::FILL) + << sEdit << "ET\n" + << "Q\nEMC\n"; + } + CFX_ByteString sButton = CPVT_GenerateAP::GenerateColorAP( + CPVT_Color(CPVT_Color::kRGB, 220.0f / 255.0f, 220.0f / 255.0f, + 220.0f / 255.0f), + PaintOperation::FILL); + if (sButton.GetLength() > 0 && !rcButton.IsEmpty()) { + sAppStream << "q\n" << sButton; + sAppStream << rcButton.left << " " << rcButton.bottom << " " + << rcButton.Width() << " " << rcButton.Height() << " re f\n"; + sAppStream << "Q\n"; + CFX_ByteString sButtonBorder = CPVT_GenerateAP::GenerateBorderAP( + rcButton, 2, CPVT_Color(CPVT_Color::kGray, 0), + CPVT_Color(CPVT_Color::kGray, 1), + CPVT_Color(CPVT_Color::kGray, 0.5), BorderStyle::BEVELED, + CPVT_Dash(3, 0, 0)); + if (sButtonBorder.GetLength() > 0) + sAppStream << "q\n" << sButtonBorder << "Q\n"; + + CFX_PointF ptCenter = CFX_PointF((rcButton.left + rcButton.right) / 2, + (rcButton.top + rcButton.bottom) / 2); + if (IsFloatBigger(rcButton.Width(), 6) && + IsFloatBigger(rcButton.Height(), 6)) { + sAppStream << "q\n" + << " 0 g\n"; + sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n"; + sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n"; + sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n"; + sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n"; + sAppStream << sButton << "Q\n"; + } + } + } break; + case 2: { + CPVT_FontMap map( + pDoc, pStreamDict ? pStreamDict->GetDictFor("Resources") : nullptr, + pDefFont, sFontName.Right(sFontName.GetLength() - 1)); + CPDF_VariableText::Provider prd(&map); + CPDF_Array* pOpts = ToArray(FPDF_GetFieldAttr(pAnnotDict, "Opt")); + CPDF_Array* pSels = ToArray(FPDF_GetFieldAttr(pAnnotDict, "I")); + CPDF_Object* pTi = FPDF_GetFieldAttr(pAnnotDict, "TI"); + int32_t nTop = pTi ? pTi->GetInteger() : 0; + CFX_ByteTextBuf sBody; + if (pOpts) { + FX_FLOAT fy = rcBody.top; + for (size_t i = nTop, sz = pOpts->GetCount(); i < sz; i++) { + if (IsFloatSmaller(fy, rcBody.bottom)) + break; + + if (CPDF_Object* pOpt = pOpts->GetDirectObjectAt(i)) { + CFX_WideString swItem; + if (pOpt->IsString()) + swItem = pOpt->GetUnicodeText(); + else if (CPDF_Array* pArray = pOpt->AsArray()) + swItem = pArray->GetDirectObjectAt(1)->GetUnicodeText(); + + bool bSelected = false; + if (pSels) { + for (size_t s = 0, ssz = pSels->GetCount(); s < ssz; s++) { + int value = pSels->GetIntegerAt(s); + if (value >= 0 && i == static_cast(value)) { + bSelected = true; + break; + } + } + } + CPDF_VariableText vt; + vt.SetProvider(&prd); + vt.SetPlateRect( + CFX_FloatRect(rcBody.left, 0.0f, rcBody.right, 0.0f)); + vt.SetFontSize(IsFloatZero(fFontSize) ? 12.0f : fFontSize); + + vt.Initialize(); + vt.SetText(swItem); + vt.RearrangeAll(); + FX_FLOAT fItemHeight = vt.GetContentRect().Height(); + if (bSelected) { + CFX_FloatRect rcItem = CFX_FloatRect( + rcBody.left, fy - fItemHeight, rcBody.right, fy); + sBody << "q\n" + << CPVT_GenerateAP::GenerateColorAP( + CPVT_Color(CPVT_Color::kRGB, 0, 51.0f / 255.0f, + 113.0f / 255.0f), + PaintOperation::FILL) + << rcItem.left << " " << rcItem.bottom << " " + << rcItem.Width() << " " << rcItem.Height() << " re f\n" + << "Q\n"; + sBody << "BT\n" + << CPVT_GenerateAP::GenerateColorAP( + CPVT_Color(CPVT_Color::kGray, 1), + PaintOperation::FILL) + << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), + CFX_PointF(0.0f, fy), + true, 0) + << "ET\n"; + } else { + sBody << "BT\n" + << CPVT_GenerateAP::GenerateColorAP(crText, + PaintOperation::FILL) + << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), + CFX_PointF(0.0f, fy), + true, 0) + << "ET\n"; + } + fy -= fItemHeight; + } + } + } + if (sBody.GetSize() > 0) { + sAppStream << "/Tx BMC\nq\n" + << rcBody.left << " " << rcBody.bottom << " " + << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n" + << sBody.AsStringC() << "Q\nEMC\n"; + } + } break; + } + if (pNormalStream) { + pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize()); + pStreamDict = pNormalStream->GetDict(); + if (pStreamDict) { + pStreamDict->SetMatrixFor("Matrix", matrix); + pStreamDict->SetRectFor("BBox", rcBBox); + CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources"); + if (pStreamResList) { + CPDF_Dictionary* pStreamResFontList = + pStreamResList->GetDictFor("Font"); + if (!pStreamResFontList) { + pStreamResFontList = + pStreamResList->SetNewFor("Font"); + } + if (!pStreamResFontList->KeyExist(sFontName)) { + pStreamResFontList->SetNewFor(sFontName, pDoc, + pFontDict->GetObjNum()); + } + } else { + pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone()); + pStreamResList = pStreamDict->GetDictFor("Resources"); + } + } + } + return true; +} + +CFX_ByteString GetColorStringWithDefault(CPDF_Array* pColor, + const CPVT_Color& crDefaultColor, + PaintOperation nOperation) { + if (pColor) { + CPVT_Color color = CPVT_Color::ParseColor(*pColor); + return CPVT_GenerateAP::GenerateColorAP(color, nOperation); + } + + return CPVT_GenerateAP::GenerateColorAP(crDefaultColor, nOperation); +} + +FX_FLOAT GetBorderWidth(const CPDF_Dictionary& pAnnotDict) { + if (CPDF_Dictionary* pBorderStyleDict = pAnnotDict.GetDictFor("BS")) { + if (pBorderStyleDict->KeyExist("W")) + return pBorderStyleDict->GetNumberFor("W"); + } + + if (CPDF_Array* pBorderArray = pAnnotDict.GetArrayFor("Border")) { + if (pBorderArray->GetCount() > 2) + return pBorderArray->GetNumberAt(2); + } + + return 1; +} + +CPDF_Array* GetDashArray(const CPDF_Dictionary& pAnnotDict) { + if (CPDF_Dictionary* pBorderStyleDict = pAnnotDict.GetDictFor("BS")) { + if (pBorderStyleDict->GetStringFor("S") == "D") + return pBorderStyleDict->GetArrayFor("D"); + } + + if (CPDF_Array* pBorderArray = pAnnotDict.GetArrayFor("Border")) { + if (pBorderArray->GetCount() == 4) + return pBorderArray->GetArrayAt(3); + } + + return nullptr; +} + +CFX_ByteString GetDashPatternString(const CPDF_Dictionary& pAnnotDict) { + CPDF_Array* pDashArray = GetDashArray(pAnnotDict); + if (!pDashArray || pDashArray->IsEmpty()) + return CFX_ByteString(); + + // Support maximum of ten elements in the dash array. + size_t pDashArrayCount = std::min(pDashArray->GetCount(), 10); + CFX_ByteTextBuf sDashStream; + + sDashStream << "["; + for (size_t i = 0; i < pDashArrayCount; ++i) + sDashStream << pDashArray->GetNumberAt(i) << " "; + sDashStream << "] 0 d\n"; + + return sDashStream.MakeString(); +} + +CFX_ByteString GetPopupContentsString(CPDF_Document* pDoc, + const CPDF_Dictionary& pAnnotDict, + CPDF_Font* pDefFont, + const CFX_ByteString& sFontName) { + CFX_WideString swValue(pAnnotDict.GetUnicodeTextFor("T")); + swValue += L'\n'; + swValue += pAnnotDict.GetUnicodeTextFor("Contents"); + CPVT_FontMap map(pDoc, nullptr, pDefFont, sFontName); + + CPDF_VariableText::Provider prd(&map); + CPDF_VariableText vt; + vt.SetProvider(&prd); + vt.SetPlateRect(pAnnotDict.GetRectFor("Rect")); + vt.SetFontSize(12); + vt.SetAutoReturn(true); + vt.SetMultiLine(true); + + vt.Initialize(); + vt.SetText(swValue); + vt.RearrangeAll(); + CFX_PointF ptOffset(3.0f, -3.0f); + CFX_ByteString sContent = CPVT_GenerateAP::GenerateEditAP( + &map, vt.GetIterator(), ptOffset, false, 0); + + if (sContent.IsEmpty()) + return CFX_ByteString(); + + CFX_ByteTextBuf sAppStream; + sAppStream << "BT\n" + << CPVT_GenerateAP::GenerateColorAP( + CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), PaintOperation::FILL) + << sContent << "ET\n" + << "Q\n"; + return sAppStream.MakeString(); +} + +std::unique_ptr GenerateExtGStateDict( + const CPDF_Dictionary& pAnnotDict, + const CFX_ByteString& sExtGSDictName, + const CFX_ByteString& sBlendMode) { + auto pGSDict = + pdfium::MakeUnique(pAnnotDict.GetByteStringPool()); + pGSDict->SetNewFor("Type", "ExtGState", false); + + FX_FLOAT fOpacity = + pAnnotDict.KeyExist("CA") ? pAnnotDict.GetNumberFor("CA") : 1; + pGSDict->SetNewFor("CA", fOpacity); + pGSDict->SetNewFor("ca", fOpacity); + pGSDict->SetNewFor("AIS", false); + pGSDict->SetNewFor("BM", sBlendMode, false); + + auto pExtGStateDict = + pdfium::MakeUnique(pAnnotDict.GetByteStringPool()); + pExtGStateDict->SetFor(sExtGSDictName, std::move(pGSDict)); + return pExtGStateDict; +} + +std::unique_ptr GenerateResourceFontDict( + CPDF_Document* pDoc, + const CFX_ByteString& sFontDictName) { + CPDF_Dictionary* pFontDict = pDoc->NewIndirect(); + pFontDict->SetNewFor("Type", "Font"); + pFontDict->SetNewFor("Subtype", "Type1"); + pFontDict->SetNewFor("BaseFont", "Helvetica"); + pFontDict->SetNewFor("Encoding", "WinAnsiEncoding"); + + auto pResourceFontDict = + pdfium::MakeUnique(pDoc->GetByteStringPool()); + pResourceFontDict->SetNewFor(sFontDictName, pDoc, + pFontDict->GetObjNum()); + return pResourceFontDict; +} + +std::unique_ptr GenerateResourceDict( + CPDF_Document* pDoc, + std::unique_ptr pExtGStateDict, + std::unique_ptr pResourceFontDict) { + auto pResourceDict = + pdfium::MakeUnique(pDoc->GetByteStringPool()); + if (pExtGStateDict) + pResourceDict->SetFor("ExtGState", std::move(pExtGStateDict)); + if (pResourceFontDict) + pResourceDict->SetFor("Font", std::move(pResourceFontDict)); + return pResourceDict; +} + +void GenerateAndSetAPDict(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict, + const CFX_ByteTextBuf& sAppStream, + std::unique_ptr pResourceDict, + bool bIsTextMarkupAnnotation) { + CPDF_Stream* pNormalStream = pDoc->NewIndirect(); + pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize()); + + CPDF_Dictionary* pAPDict = pAnnotDict->SetNewFor("AP"); + pAPDict->SetNewFor("N", pDoc, pNormalStream->GetObjNum()); + + CPDF_Dictionary* pStreamDict = pNormalStream->GetDict(); + pStreamDict->SetNewFor("FormType", 1); + pStreamDict->SetNewFor("Subtype", "Form", false); + pStreamDict->SetMatrixFor("Matrix", CFX_Matrix()); + + CFX_FloatRect rect = bIsTextMarkupAnnotation + ? CPDF_Annot::RectFromQuadPoints(pAnnotDict) + : pAnnotDict->GetRectFor("Rect"); + pStreamDict->SetRectFor("BBox", rect); + pStreamDict->SetFor("Resources", std::move(pResourceDict)); +} + +CFX_ByteString GetPaintOperatorString(bool bIsStrokeRect, bool bIsFillRect) { + if (bIsStrokeRect) + return bIsFillRect ? "b" : "s"; + return bIsFillRect ? "f" : "n"; +} + +CFX_ByteString GenerateTextSymbolAP(const CFX_FloatRect& rect) { + CFX_ByteTextBuf sAppStream; + sAppStream << CPVT_GenerateAP::GenerateColorAP( + CPVT_Color(CPVT_Color::kRGB, 1, 1, 0), PaintOperation::FILL); + sAppStream << CPVT_GenerateAP::GenerateColorAP( + CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), PaintOperation::STROKE); + + const FX_FLOAT fBorderWidth = 1; + sAppStream << fBorderWidth << " w\n"; + + const FX_FLOAT fHalfWidth = fBorderWidth / 2; + const FX_FLOAT fTipDelta = 4; + + CFX_FloatRect outerRect1 = rect; + outerRect1.Deflate(fHalfWidth, fHalfWidth); + outerRect1.bottom += fTipDelta; + + CFX_FloatRect outerRect2 = outerRect1; + outerRect2.left += fTipDelta; + outerRect2.right = outerRect2.left + fTipDelta; + outerRect2.top = outerRect2.bottom - fTipDelta; + FX_FLOAT outerRect2Middle = (outerRect2.left + outerRect2.right) / 2; + + // Draw outer boxes. + sAppStream << outerRect1.left << " " << outerRect1.bottom << " m\n" + << outerRect1.left << " " << outerRect1.top << " l\n" + << outerRect1.right << " " << outerRect1.top << " l\n" + << outerRect1.right << " " << outerRect1.bottom << " l\n" + << outerRect2.right << " " << outerRect2.bottom << " l\n" + << outerRect2Middle << " " << outerRect2.top << " l\n" + << outerRect2.left << " " << outerRect2.bottom << " l\n" + << outerRect1.left << " " << outerRect1.bottom << " l\n"; + + // Draw inner lines. + CFX_FloatRect lineRect = outerRect1; + const FX_FLOAT fXDelta = 2; + const FX_FLOAT fYDelta = (lineRect.top - lineRect.bottom) / 4; + + lineRect.left += fXDelta; + lineRect.right -= fXDelta; + for (int i = 0; i < 3; ++i) { + lineRect.top -= fYDelta; + sAppStream << lineRect.left << " " << lineRect.top << " m\n" + << lineRect.right << " " << lineRect.top << " l\n"; + } + sAppStream << "B*\n"; + + return sAppStream.MakeString(); +} + +} // namespace + +bool FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) { + if (!pAnnotDict || pAnnotDict->GetStringFor("Subtype") != "Widget") + return false; + + CPDF_Object* pFieldTypeObj = FPDF_GetFieldAttr(pAnnotDict, "FT"); + if (!pFieldTypeObj) + return false; + + CFX_ByteString field_type = pFieldTypeObj->GetString(); + if (field_type == "Tx") + return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict); + + CPDF_Object* pFieldFlagsObj = FPDF_GetFieldAttr(pAnnotDict, "Ff"); + uint32_t flags = pFieldFlagsObj ? pFieldFlagsObj->GetInteger() : 0; + if (field_type == "Ch") { + return (flags & (1 << 17)) + ? CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict) + : CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict); + } + + if (field_type == "Btn") { + if (!(flags & (1 << 16))) { + if (!pAnnotDict->KeyExist("AS")) { + if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDictFor("Parent")) { + if (pParentDict->KeyExist("AS")) { + pAnnotDict->SetNewFor( + "AS", pParentDict->GetStringFor("AS"), false); + } + } + } + } + } + + return false; +} + +// Static. +bool CPVT_GenerateAP::GenerateComboBoxAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict) { + return GenerateWidgetAP(pDoc, pAnnotDict, 1); +} + +// Static. +bool CPVT_GenerateAP::GenerateListBoxAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict) { + return GenerateWidgetAP(pDoc, pAnnotDict, 2); +} + +// Static. +bool CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict) { + return GenerateWidgetAP(pDoc, pAnnotDict, 0); +} + +bool CPVT_GenerateAP::GenerateCircleAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict) { + CFX_ByteTextBuf sAppStream; + CFX_ByteString sExtGSDictName = "GS"; + sAppStream << "/" << sExtGSDictName << " gs "; + + CPDF_Array* pInteriorColor = pAnnotDict->GetArrayFor("IC"); + sAppStream << GetColorStringWithDefault(pInteriorColor, + CPVT_Color(CPVT_Color::kTransparent), + PaintOperation::FILL); + + sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"), + CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), + PaintOperation::STROKE); + + FX_FLOAT fBorderWidth = GetBorderWidth(*pAnnotDict); + bool bIsStrokeRect = fBorderWidth > 0; + + if (bIsStrokeRect) { + sAppStream << fBorderWidth << " w "; + sAppStream << GetDashPatternString(*pAnnotDict); + } + + CFX_FloatRect rect = pAnnotDict->GetRectFor("Rect"); + rect.Normalize(); + + if (bIsStrokeRect) { + // Deflating rect because stroking a path entails painting all points whose + // perpendicular distance from the path in user space is less than or equal + // to half the line width. + rect.Deflate(fBorderWidth / 2, fBorderWidth / 2); + } + + const FX_FLOAT fMiddleX = (rect.left + rect.right) / 2; + const FX_FLOAT fMiddleY = (rect.top + rect.bottom) / 2; + + // |fL| is precalculated approximate value of 4 * tan((3.14 / 2) / 4) / 3, + // where |fL| * radius is a good approximation of control points for + // arc with 90 degrees. + const FX_FLOAT fL = 0.5523f; + const FX_FLOAT fDeltaX = fL * rect.Width() / 2.0; + const FX_FLOAT fDeltaY = fL * rect.Height() / 2.0; + + // Starting point + sAppStream << fMiddleX << " " << rect.top << " m\n"; + // First Bezier Curve + sAppStream << fMiddleX + fDeltaX << " " << rect.top << " " << rect.right + << " " << fMiddleY + fDeltaY << " " << rect.right << " " + << fMiddleY << " c\n"; + // Second Bezier Curve + sAppStream << rect.right << " " << fMiddleY - fDeltaY << " " + << fMiddleX + fDeltaX << " " << rect.bottom << " " << fMiddleX + << " " << rect.bottom << " c\n"; + // Third Bezier Curve + sAppStream << fMiddleX - fDeltaX << " " << rect.bottom << " " << rect.left + << " " << fMiddleY - fDeltaY << " " << rect.left << " " << fMiddleY + << " c\n"; + // Fourth Bezier Curve + sAppStream << rect.left << " " << fMiddleY + fDeltaY << " " + << fMiddleX - fDeltaX << " " << rect.top << " " << fMiddleX << " " + << rect.top << " c\n"; + + bool bIsFillRect = pInteriorColor && !pInteriorColor->IsEmpty(); + sAppStream << GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n"; + + auto pExtGStateDict = + GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); + auto pResourceDict = + GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr); + GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict), + false /*IsTextMarkupAnnotation*/); + return true; +} + +bool CPVT_GenerateAP::GenerateHighlightAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict) { + CFX_ByteTextBuf sAppStream; + CFX_ByteString sExtGSDictName = "GS"; + sAppStream << "/" << sExtGSDictName << " gs "; + + sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"), + CPVT_Color(CPVT_Color::kRGB, 1, 1, 0), + PaintOperation::FILL); + + CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict); + rect.Normalize(); + + sAppStream << rect.left << " " << rect.top << " m " << rect.right << " " + << rect.top << " l " << rect.right << " " << rect.bottom << " l " + << rect.left << " " << rect.bottom << " l " + << "h f\n"; + + auto pExtGStateDict = + GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Multiply"); + auto pResourceDict = + GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr); + GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict), + true /*IsTextMarkupAnnotation*/); + + return true; +} + +bool CPVT_GenerateAP::GenerateInkAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict) { + FX_FLOAT fBorderWidth = GetBorderWidth(*pAnnotDict); + bool bIsStroke = fBorderWidth > 0; + + if (!bIsStroke) + return false; + + CPDF_Array* pInkList = pAnnotDict->GetArrayFor("InkList"); + if (!pInkList || pInkList->IsEmpty()) + return false; + + CFX_ByteTextBuf sAppStream; + CFX_ByteString sExtGSDictName = "GS"; + sAppStream << "/" << sExtGSDictName << " gs "; + + sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"), + CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), + PaintOperation::STROKE); + + sAppStream << fBorderWidth << " w "; + sAppStream << GetDashPatternString(*pAnnotDict); + + // Set inflated rect as a new rect because paths near the border with large + // width should not be clipped to the original rect. + CFX_FloatRect rect = pAnnotDict->GetRectFor("Rect"); + rect.Inflate(fBorderWidth / 2, fBorderWidth / 2); + pAnnotDict->SetRectFor("Rect", rect); + + for (size_t i = 0; i < pInkList->GetCount(); i++) { + CPDF_Array* pInkCoordList = pInkList->GetArrayAt(i); + if (!pInkCoordList || pInkCoordList->GetCount() < 2) + continue; + + sAppStream << pInkCoordList->GetNumberAt(0) << " " + << pInkCoordList->GetNumberAt(1) << " m "; + + for (size_t j = 0; j < pInkCoordList->GetCount() - 1; j += 2) { + sAppStream << pInkCoordList->GetNumberAt(j) << " " + << pInkCoordList->GetNumberAt(j + 1) << " l "; + } + + sAppStream << "S\n"; + } + + auto pExtGStateDict = + GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); + auto pResourceDict = + GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr); + GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict), + false /*IsTextMarkupAnnotation*/); + return true; +} + +bool CPVT_GenerateAP::GenerateTextAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict) { + CFX_ByteTextBuf sAppStream; + CFX_ByteString sExtGSDictName = "GS"; + sAppStream << "/" << sExtGSDictName << " gs "; + + CFX_FloatRect rect = pAnnotDict->GetRectFor("Rect"); + const FX_FLOAT fNoteLength = 20; + CFX_FloatRect noteRect(rect.left, rect.bottom, rect.left + fNoteLength, + rect.bottom + fNoteLength); + pAnnotDict->SetRectFor("Rect", noteRect); + + sAppStream << GenerateTextSymbolAP(noteRect); + + auto pExtGStateDict = + GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); + auto pResourceDict = + GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr); + GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict), + false /*IsTextMarkupAnnotation*/); + return true; +} + +bool CPVT_GenerateAP::GenerateUnderlineAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict) { + CFX_ByteTextBuf sAppStream; + CFX_ByteString sExtGSDictName = "GS"; + sAppStream << "/" << sExtGSDictName << " gs "; + + sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"), + CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), + PaintOperation::STROKE); + + CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict); + rect.Normalize(); + + FX_FLOAT fLineWidth = 1.0; + sAppStream << fLineWidth << " w " << rect.left << " " + << rect.bottom + fLineWidth << " m " << rect.right << " " + << rect.bottom + fLineWidth << " l S\n"; + + auto pExtGStateDict = + GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); + auto pResourceDict = + GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr); + GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict), + true /*IsTextMarkupAnnotation*/); + return true; +} + +bool CPVT_GenerateAP::GeneratePopupAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict) { + CFX_ByteTextBuf sAppStream; + CFX_ByteString sExtGSDictName = "GS"; + sAppStream << "/" << sExtGSDictName << " gs\n"; + + sAppStream << GenerateColorAP(CPVT_Color(CPVT_Color::kRGB, 1, 1, 0), + PaintOperation::FILL); + sAppStream << GenerateColorAP(CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), + PaintOperation::STROKE); + + const FX_FLOAT fBorderWidth = 1; + sAppStream << fBorderWidth << " w\n"; + + CFX_FloatRect rect = pAnnotDict->GetRectFor("Rect"); + rect.Normalize(); + rect.Deflate(fBorderWidth / 2, fBorderWidth / 2); + + sAppStream << rect.left << " " << rect.bottom << " " << rect.Width() << " " + << rect.Height() << " re b\n"; + + CFX_ByteString sFontName = "FONT"; + auto pResourceFontDict = GenerateResourceFontDict(pDoc, sFontName); + CPDF_Font* pDefFont = pDoc->LoadFont(pResourceFontDict.get()); + if (!pDefFont) + return false; + + auto pExtGStateDict = + GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); + auto pResourceDict = GenerateResourceDict(pDoc, std::move(pResourceFontDict), + std::move(pExtGStateDict)); + + sAppStream << GetPopupContentsString(pDoc, *pAnnotDict, pDefFont, sFontName); + GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict), + false /*IsTextMarkupAnnotation*/); + return true; +} + +bool CPVT_GenerateAP::GenerateSquareAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict) { + CFX_ByteTextBuf sAppStream; + CFX_ByteString sExtGSDictName = "GS"; + sAppStream << "/" << sExtGSDictName << " gs "; + + CPDF_Array* pInteriorColor = pAnnotDict->GetArrayFor("IC"); + sAppStream << GetColorStringWithDefault(pInteriorColor, + CPVT_Color(CPVT_Color::kTransparent), + PaintOperation::FILL); + + sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"), + CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), + PaintOperation::STROKE); + + FX_FLOAT fBorderWidth = GetBorderWidth(*pAnnotDict); + bool bIsStrokeRect = fBorderWidth > 0; + + if (bIsStrokeRect) { + sAppStream << fBorderWidth << " w "; + sAppStream << GetDashPatternString(*pAnnotDict); + } + + CFX_FloatRect rect = pAnnotDict->GetRectFor("Rect"); + rect.Normalize(); + + if (bIsStrokeRect) { + // Deflating rect because stroking a path entails painting all points whose + // perpendicular distance from the path in user space is less than or equal + // to half the line width. + rect.Deflate(fBorderWidth / 2, fBorderWidth / 2); + } + + bool bIsFillRect = pInteriorColor && (pInteriorColor->GetCount() > 0); + + sAppStream << rect.left << " " << rect.bottom << " " << rect.Width() << " " + << rect.Height() << " re " + << GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n"; + + auto pExtGStateDict = + GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); + auto pResourceDict = + GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr); + GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict), + false /*IsTextMarkupAnnotation*/); + return true; +} + +bool CPVT_GenerateAP::GenerateSquigglyAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict) { + CFX_ByteTextBuf sAppStream; + CFX_ByteString sExtGSDictName = "GS"; + sAppStream << "/" << sExtGSDictName << " gs "; + + sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"), + CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), + PaintOperation::STROKE); + + CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict); + rect.Normalize(); + + FX_FLOAT fLineWidth = 1.0; + sAppStream << fLineWidth << " w "; + + const FX_FLOAT fDelta = 2.0; + const FX_FLOAT fTop = rect.bottom + fDelta; + const FX_FLOAT fBottom = rect.bottom; + + sAppStream << rect.left << " " << fTop << " m "; + + FX_FLOAT fX = rect.left + fDelta; + bool isUpwards = false; + + while (fX < rect.right) { + sAppStream << fX << " " << (isUpwards ? fTop : fBottom) << " l "; + + fX += fDelta; + isUpwards = !isUpwards; + } + + FX_FLOAT fRemainder = rect.right - (fX - fDelta); + if (isUpwards) + sAppStream << rect.right << " " << fBottom + fRemainder << " l "; + else + sAppStream << rect.right << " " << fTop - fRemainder << " l "; + + sAppStream << "S\n"; + + auto pExtGStateDict = + GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); + auto pResourceDict = + GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr); + GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict), + true /*IsTextMarkupAnnotation*/); + return true; +} + +bool CPVT_GenerateAP::GenerateStrikeOutAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict) { + CFX_ByteTextBuf sAppStream; + CFX_ByteString sExtGSDictName = "GS"; + sAppStream << "/" << sExtGSDictName << " gs "; + + sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"), + CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), + PaintOperation::STROKE); + + CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict); + rect.Normalize(); + + FX_FLOAT fLineWidth = 1.0; + FX_FLOAT fY = (rect.top + rect.bottom) / 2; + sAppStream << fLineWidth << " w " << rect.left << " " << fY << " m " + << rect.right << " " << fY << " l S\n"; + + auto pExtGStateDict = + GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); + auto pResourceDict = + GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr); + GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict), + true /*IsTextMarkupAnnotation*/); + return true; +} + +// Static. +CFX_ByteString CPVT_GenerateAP::GenerateEditAP( + IPVT_FontMap* pFontMap, + CPDF_VariableText::Iterator* pIterator, + const CFX_PointF& ptOffset, + bool bContinuous, + uint16_t SubWord) { + CFX_ByteTextBuf sEditStream; + CFX_ByteTextBuf sLineStream; + CFX_ByteTextBuf sWords; + CFX_PointF ptOld; + CFX_PointF ptNew; + int32_t nCurFontIndex = -1; + CPVT_WordPlace oldplace; + + pIterator->SetAt(0); + while (pIterator->NextWord()) { + CPVT_WordPlace place = pIterator->GetAt(); + if (bContinuous) { + if (place.LineCmp(oldplace) != 0) { + if (sWords.GetSize() > 0) { + sLineStream << GetWordRenderString(sWords.MakeString()); + sEditStream << sLineStream; + sLineStream.Clear(); + sWords.Clear(); + } + CPVT_Word word; + if (pIterator->GetWord(word)) { + ptNew = CFX_PointF(word.ptWord.x + ptOffset.x, + word.ptWord.y + ptOffset.y); + } else { + CPVT_Line line; + pIterator->GetLine(line); + ptNew = CFX_PointF(line.ptLine.x + ptOffset.x, + line.ptLine.y + ptOffset.y); + } + if (ptNew != ptOld) { + sLineStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y + << " Td\n"; + ptOld = ptNew; + } + } + CPVT_Word word; + if (pIterator->GetWord(word)) { + if (word.nFontIndex != nCurFontIndex) { + if (sWords.GetSize() > 0) { + sLineStream << GetWordRenderString(sWords.MakeString()); + sWords.Clear(); + } + sLineStream << GetFontSetString(pFontMap, word.nFontIndex, + word.fFontSize); + nCurFontIndex = word.nFontIndex; + } + sWords << GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord); + } + oldplace = place; + } else { + CPVT_Word word; + if (pIterator->GetWord(word)) { + ptNew = + CFX_PointF(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y); + if (ptNew != ptOld) { + sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y + << " Td\n"; + ptOld = ptNew; + } + if (word.nFontIndex != nCurFontIndex) { + sEditStream << GetFontSetString(pFontMap, word.nFontIndex, + word.fFontSize); + nCurFontIndex = word.nFontIndex; + } + sEditStream << GetWordRenderString( + GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord)); + } + } + } + if (sWords.GetSize() > 0) { + sLineStream << GetWordRenderString(sWords.MakeString()); + sEditStream << sLineStream; + sWords.Clear(); + } + return sEditStream.MakeString(); +} + +// Static. +CFX_ByteString CPVT_GenerateAP::GenerateBorderAP( + const CFX_FloatRect& rect, + FX_FLOAT fWidth, + const CPVT_Color& color, + const CPVT_Color& crLeftTop, + const CPVT_Color& crRightBottom, + BorderStyle nStyle, + const CPVT_Dash& dash) { + CFX_ByteTextBuf sAppStream; + CFX_ByteString sColor; + FX_FLOAT fLeft = rect.left; + FX_FLOAT fRight = rect.right; + FX_FLOAT fTop = rect.top; + FX_FLOAT fBottom = rect.bottom; + if (fWidth > 0.0f) { + FX_FLOAT fHalfWidth = fWidth / 2.0f; + switch (nStyle) { + default: + case BorderStyle::SOLID: + sColor = GenerateColorAP(color, PaintOperation::FILL); + if (sColor.GetLength() > 0) { + sAppStream << sColor; + sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " + << fTop - fBottom << " re\n"; + sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " " + << fRight - fLeft - fWidth * 2 << " " + << fTop - fBottom - fWidth * 2 << " re\n"; + sAppStream << "f*\n"; + } + break; + case BorderStyle::DASH: + sColor = GenerateColorAP(color, PaintOperation::STROKE); + if (sColor.GetLength() > 0) { + sAppStream << sColor; + sAppStream << fWidth << " w" + << " [" << dash.nDash << " " << dash.nGap << "] " + << dash.nPhase << " d\n"; + sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 + << " m\n"; + sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 + << " l\n"; + sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 + << " l\n"; + sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 + << " l\n"; + sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 + << " l S\n"; + } + break; + case BorderStyle::BEVELED: + case BorderStyle::INSET: + sColor = GenerateColorAP(crLeftTop, PaintOperation::FILL); + if (sColor.GetLength() > 0) { + sAppStream << sColor; + sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth + << " m\n"; + sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth + << " l\n"; + sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth + << " l\n"; + sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 + << " l\n"; + sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 + << " l\n"; + sAppStream << fLeft + fHalfWidth * 2 << " " + << fBottom + fHalfWidth * 2 << " l f\n"; + } + sColor = GenerateColorAP(crRightBottom, PaintOperation::FILL); + if (sColor.GetLength() > 0) { + sAppStream << sColor; + sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth + << " m\n"; + sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth + << " l\n"; + sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth + << " l\n"; + sAppStream << fLeft + fHalfWidth * 2 << " " + << fBottom + fHalfWidth * 2 << " l\n"; + sAppStream << fRight - fHalfWidth * 2 << " " + << fBottom + fHalfWidth * 2 << " l\n"; + sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 + << " l f\n"; + } + sColor = GenerateColorAP(color, PaintOperation::FILL); + if (sColor.GetLength() > 0) { + sAppStream << sColor; + sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " + << fTop - fBottom << " re\n"; + sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " " + << fRight - fLeft - fHalfWidth * 2 << " " + << fTop - fBottom - fHalfWidth * 2 << " re f*\n"; + } + break; + case BorderStyle::UNDERLINE: + sColor = GenerateColorAP(color, PaintOperation::STROKE); + if (sColor.GetLength() > 0) { + sAppStream << sColor; + sAppStream << fWidth << " w\n"; + sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n"; + sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n"; + } + break; + } + } + return sAppStream.MakeString(); +} + +// Static. +CFX_ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color& color, + PaintOperation nOperation) { + CFX_ByteTextBuf sColorStream; + switch (color.nColorType) { + case CPVT_Color::kRGB: + sColorStream << color.fColor1 << " " << color.fColor2 << " " + << color.fColor3 << " " + << (nOperation == PaintOperation::STROKE ? "RG" : "rg") + << "\n"; + break; + case CPVT_Color::kGray: + sColorStream << color.fColor1 << " " + << (nOperation == PaintOperation::STROKE ? "G" : "g") + << "\n"; + break; + case CPVT_Color::kCMYK: + sColorStream << color.fColor1 << " " << color.fColor2 << " " + << color.fColor3 << " " << color.fColor4 << " " + << (nOperation == PaintOperation::STROKE ? "K" : "k") + << "\n"; + break; + case CPVT_Color::kTransparent: + break; + } + return sColorStream.MakeString(); +} + +// Static. +CFX_ByteString CPVT_GenerateAP::GetPDFWordString(IPVT_FontMap* pFontMap, + int32_t nFontIndex, + uint16_t Word, + uint16_t SubWord) { + CFX_ByteString sWord; + if (SubWord > 0) { + sWord.Format("%c", SubWord); + return sWord; + } + + if (!pFontMap) + return sWord; + + if (CPDF_Font* pPDFFont = pFontMap->GetPDFFont(nFontIndex)) { + if (pPDFFont->GetBaseFont().Compare("Symbol") == 0 || + pPDFFont->GetBaseFont().Compare("ZapfDingbats") == 0) { + sWord.Format("%c", Word); + } else { + uint32_t dwCharCode = pPDFFont->CharCodeFromUnicode(Word); + if (dwCharCode != CPDF_Font::kInvalidCharCode) + pPDFFont->AppendChar(sWord, dwCharCode); + } + } + return sWord; +} + +// Static. +CFX_ByteString CPVT_GenerateAP::GetWordRenderString( + const CFX_ByteString& strWords) { + if (strWords.GetLength() > 0) + return PDF_EncodeString(strWords) + " Tj\n"; + return ""; +} + +// Static. +CFX_ByteString CPVT_GenerateAP::GetFontSetString(IPVT_FontMap* pFontMap, + int32_t nFontIndex, + FX_FLOAT fFontSize) { + CFX_ByteTextBuf sRet; + if (pFontMap) { + CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); + if (sFontAlias.GetLength() > 0 && fFontSize > 0) + sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; + } + return sRet.MakeString(); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_generateap.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_generateap.h new file mode 100644 index 000000000000..62a84531eeec --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_generateap.h @@ -0,0 +1,74 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_GENERATEAP_H_ +#define CORE_FPDFDOC_CPVT_GENERATEAP_H_ + +#include "core/fpdfdoc/cpdf_defaultappearance.h" +#include "core/fpdfdoc/cpdf_variabletext.h" +#include "core/fpdfdoc/cpvt_color.h" +#include "core/fpdfdoc/cpvt_dash.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Dictionary; +class CPDF_Document; +class IPVT_FontMap; + +struct CPVT_WordRange; + +bool FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict); + +class CPVT_GenerateAP { + public: + static bool GenerateCircleAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict); + static bool GenerateComboBoxAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict); + static bool GenerateHighlightAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict); + static bool GenerateInkAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict); + static bool GenerateListBoxAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict); + static bool GeneratePopupAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict); + static bool GenerateSquareAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict); + static bool GenerateSquigglyAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict); + static bool GenerateStrikeOutAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict); + static bool GenerateTextAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict); + static bool GenerateTextFieldAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict); + static bool GenerateUnderlineAP(CPDF_Document* pDoc, + CPDF_Dictionary* pAnnotDict); + static CFX_ByteString GenerateEditAP(IPVT_FontMap* pFontMap, + CPDF_VariableText::Iterator* pIterator, + const CFX_PointF& ptOffset, + bool bContinuous, + uint16_t SubWord); + static CFX_ByteString GenerateBorderAP(const CFX_FloatRect& rect, + FX_FLOAT fWidth, + const CPVT_Color& color, + const CPVT_Color& crLeftTop, + const CPVT_Color& crRightBottom, + BorderStyle nStyle, + const CPVT_Dash& dash); + static CFX_ByteString GenerateColorAP(const CPVT_Color& color, + PaintOperation nOperation); + + static CFX_ByteString GetPDFWordString(IPVT_FontMap* pFontMap, + int32_t nFontIndex, + uint16_t Word, + uint16_t SubWord); + static CFX_ByteString GetWordRenderString(const CFX_ByteString& strWords); + static CFX_ByteString GetFontSetString(IPVT_FontMap* pFontMap, + int32_t nFontIndex, + FX_FLOAT fFontSize); +}; + +#endif // CORE_FPDFDOC_CPVT_GENERATEAP_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_line.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_line.h new file mode 100644 index 000000000000..47c3e84d6aca --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_line.h @@ -0,0 +1,29 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_LINE_H_ +#define CORE_FPDFDOC_CPVT_LINE_H_ + +#include "core/fpdfdoc/cpvt_wordplace.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CPVT_Line { + public: + CPVT_Line(); + + CPVT_WordPlace lineplace; + CPVT_WordPlace lineEnd; + CFX_PointF ptLine; + FX_FLOAT fLineWidth; + FX_FLOAT fLineAscent; + FX_FLOAT fLineDescent; +}; + +inline CPVT_Line::CPVT_Line() + : fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f) {} + +#endif // CORE_FPDFDOC_CPVT_LINE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_lineinfo.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_lineinfo.h new file mode 100644 index 000000000000..8fb10de2507d --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_lineinfo.h @@ -0,0 +1,36 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_LINEINFO_H_ +#define CORE_FPDFDOC_CPVT_LINEINFO_H_ + +#include "core/fxcrt/fx_system.h" + +class CPVT_LineInfo { + public: + CPVT_LineInfo(); + + int32_t nTotalWord; + int32_t nBeginWordIndex; + int32_t nEndWordIndex; + FX_FLOAT fLineX; + FX_FLOAT fLineY; + FX_FLOAT fLineWidth; + FX_FLOAT fLineAscent; + FX_FLOAT fLineDescent; +}; + +inline CPVT_LineInfo::CPVT_LineInfo() + : nTotalWord(0), + nBeginWordIndex(-1), + nEndWordIndex(-1), + fLineX(0.0f), + fLineY(0.0f), + fLineWidth(0.0f), + fLineAscent(0.0f), + fLineDescent(0.0f) {} + +#endif // CORE_FPDFDOC_CPVT_LINEINFO_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_secprops.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_secprops.h new file mode 100644 index 000000000000..d1c4b589f11a --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_secprops.h @@ -0,0 +1,30 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_SECPROPS_H_ +#define CORE_FPDFDOC_CPVT_SECPROPS_H_ + +#include "core/fxcrt/fx_system.h" + +struct CPVT_SecProps { + CPVT_SecProps() : fLineLeading(0.0f), fLineIndent(0.0f), nAlignment(0) {} + + CPVT_SecProps(FX_FLOAT lineLeading, FX_FLOAT lineIndent, int32_t alignment) + : fLineLeading(lineLeading), + fLineIndent(lineIndent), + nAlignment(alignment) {} + + CPVT_SecProps(const CPVT_SecProps& other) + : fLineLeading(other.fLineLeading), + fLineIndent(other.fLineIndent), + nAlignment(other.nAlignment) {} + + FX_FLOAT fLineLeading; + FX_FLOAT fLineIndent; + int32_t nAlignment; +}; + +#endif // CORE_FPDFDOC_CPVT_SECPROPS_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_section.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_section.h new file mode 100644 index 000000000000..42b16fd31061 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_section.h @@ -0,0 +1,22 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_SECTION_H_ +#define CORE_FPDFDOC_CPVT_SECTION_H_ + +#include "core/fpdfdoc/cpvt_secprops.h" +#include "core/fpdfdoc/cpvt_wordplace.h" +#include "core/fpdfdoc/cpvt_wordprops.h" +#include "core/fxcrt/fx_coordinates.h" + +struct CPVT_Section { + CPVT_WordPlace secplace; + CFX_FloatRect rcSection; + CPVT_SecProps SecProps; + CPVT_WordProps WordProps; +}; + +#endif // CORE_FPDFDOC_CPVT_SECTION_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_sectioninfo.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_sectioninfo.cpp new file mode 100644 index 000000000000..ec0262c1a022 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_sectioninfo.cpp @@ -0,0 +1,33 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpvt_sectioninfo.h" +#include "third_party/base/ptr_util.h" + +CPVT_SectionInfo::CPVT_SectionInfo() : rcSection(), nTotalLine(0) {} + +CPVT_SectionInfo::~CPVT_SectionInfo() {} + +CPVT_SectionInfo::CPVT_SectionInfo(const CPVT_SectionInfo& other) { + operator=(other); +} + +void CPVT_SectionInfo::operator=(const CPVT_SectionInfo& other) { + if (this == &other) + return; + + rcSection = other.rcSection; + nTotalLine = other.nTotalLine; + if (other.pSecProps) + pSecProps = pdfium::MakeUnique(*other.pSecProps); + else + pSecProps.reset(); + + if (other.pWordProps) + pWordProps = pdfium::MakeUnique(*other.pWordProps); + else + pWordProps.reset(); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_sectioninfo.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_sectioninfo.h new file mode 100644 index 000000000000..6422efe86859 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_sectioninfo.h @@ -0,0 +1,29 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_SECTIONINFO_H_ +#define CORE_FPDFDOC_CPVT_SECTIONINFO_H_ + +#include + +#include "core/fpdfdoc/cpvt_floatrect.h" +#include "core/fpdfdoc/cpvt_secprops.h" +#include "core/fpdfdoc/cpvt_wordprops.h" + +struct CPVT_SectionInfo { + CPVT_SectionInfo(); + CPVT_SectionInfo(const CPVT_SectionInfo& other); + ~CPVT_SectionInfo(); + + void operator=(const CPVT_SectionInfo& other); + + CPVT_FloatRect rcSection; + int32_t nTotalLine; + std::unique_ptr pSecProps; + std::unique_ptr pWordProps; +}; + +#endif // CORE_FPDFDOC_CPVT_SECTIONINFO_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_word.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_word.h new file mode 100644 index 000000000000..540f0416ad52 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_word.h @@ -0,0 +1,39 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_WORD_H_ +#define CORE_FPDFDOC_CPVT_WORD_H_ + +#include "core/fpdfdoc/cpvt_wordplace.h" +#include "core/fpdfdoc/cpvt_wordprops.h" +#include "core/fxcrt/fx_system.h" + +class CPVT_Word { + public: + CPVT_Word(); + + uint16_t Word; + int32_t nCharset; + CPVT_WordPlace WordPlace; + CFX_PointF ptWord; + FX_FLOAT fAscent; + FX_FLOAT fDescent; + FX_FLOAT fWidth; + int32_t nFontIndex; + FX_FLOAT fFontSize; + CPVT_WordProps WordProps; +}; + +inline CPVT_Word::CPVT_Word() + : Word(0), + nCharset(0), + fAscent(0.0f), + fDescent(0.0f), + fWidth(0.0f), + nFontIndex(-1), + fFontSize(0.0f) {} + +#endif // CORE_FPDFDOC_CPVT_WORD_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordinfo.cpp b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordinfo.cpp new file mode 100644 index 000000000000..f1ea11915c4a --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordinfo.cpp @@ -0,0 +1,55 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/cpvt_wordinfo.h" +#include "third_party/base/ptr_util.h" + +CPVT_WordInfo::CPVT_WordInfo() + : Word(0), + nCharset(FXFONT_ANSI_CHARSET), + fWordX(0.0f), + fWordY(0.0f), + fWordTail(0.0f), + nFontIndex(-1) {} + +CPVT_WordInfo::CPVT_WordInfo(uint16_t word, + int32_t charset, + int32_t fontIndex, + CPVT_WordProps* pProps) + : Word(word), + nCharset(charset), + fWordX(0.0f), + fWordY(0.0f), + fWordTail(0.0f), + nFontIndex(fontIndex) {} + +CPVT_WordInfo::CPVT_WordInfo(const CPVT_WordInfo& word) + : Word(0), + nCharset(FXFONT_ANSI_CHARSET), + fWordX(0.0f), + fWordY(0.0f), + fWordTail(0.0f), + nFontIndex(-1) { + operator=(word); +} + +CPVT_WordInfo::~CPVT_WordInfo() {} + +void CPVT_WordInfo::operator=(const CPVT_WordInfo& word) { + if (this == &word) + return; + + Word = word.Word; + nCharset = word.nCharset; + nFontIndex = word.nFontIndex; + fWordX = word.fWordX; + fWordY = word.fWordY; + fWordTail = word.fWordTail; + if (word.pWordProps) + pWordProps = pdfium::MakeUnique(*word.pWordProps); + else + pWordProps.reset(); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordinfo.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordinfo.h new file mode 100644 index 000000000000..861534b0a52b --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordinfo.h @@ -0,0 +1,35 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_WORDINFO_H_ +#define CORE_FPDFDOC_CPVT_WORDINFO_H_ + +#include + +#include "core/fpdfdoc/cpvt_wordprops.h" +#include "core/fxcrt/fx_system.h" + +struct CPVT_WordInfo { + CPVT_WordInfo(); + CPVT_WordInfo(uint16_t word, + int32_t charset, + int32_t fontIndex, + CPVT_WordProps* pProps); + CPVT_WordInfo(const CPVT_WordInfo& word); + ~CPVT_WordInfo(); + + void operator=(const CPVT_WordInfo& word); + + uint16_t Word; + int32_t nCharset; + FX_FLOAT fWordX; + FX_FLOAT fWordY; + FX_FLOAT fWordTail; + int32_t nFontIndex; + std::unique_ptr pWordProps; +}; + +#endif // CORE_FPDFDOC_CPVT_WORDINFO_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordplace.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordplace.h new file mode 100644 index 000000000000..f4a6b087b924 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordplace.h @@ -0,0 +1,73 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_WORDPLACE_H_ +#define CORE_FPDFDOC_CPVT_WORDPLACE_H_ + +#include "core/fxcrt/fx_system.h" + +struct CPVT_WordPlace { + CPVT_WordPlace() : nSecIndex(-1), nLineIndex(-1), nWordIndex(-1) {} + + CPVT_WordPlace(int32_t other_nSecIndex, + int32_t other_nLineIndex, + int32_t other_nWordIndex) { + nSecIndex = other_nSecIndex; + nLineIndex = other_nLineIndex; + nWordIndex = other_nWordIndex; + } + + void Default() { nSecIndex = nLineIndex = nWordIndex = -1; } + + bool operator==(const CPVT_WordPlace& wp) const { + return wp.nSecIndex == nSecIndex && wp.nLineIndex == nLineIndex && + wp.nWordIndex == nWordIndex; + } + + bool operator!=(const CPVT_WordPlace& wp) const { return !(*this == wp); } + + inline int32_t WordCmp(const CPVT_WordPlace& wp) const { + if (nSecIndex > wp.nSecIndex) + return 1; + if (nSecIndex < wp.nSecIndex) + return -1; + if (nLineIndex > wp.nLineIndex) + return 1; + if (nLineIndex < wp.nLineIndex) + return -1; + if (nWordIndex > wp.nWordIndex) + return 1; + if (nWordIndex < wp.nWordIndex) + return -1; + return 0; + } + + inline int32_t LineCmp(const CPVT_WordPlace& wp) const { + if (nSecIndex > wp.nSecIndex) + return 1; + if (nSecIndex < wp.nSecIndex) + return -1; + if (nLineIndex > wp.nLineIndex) + return 1; + if (nLineIndex < wp.nLineIndex) + return -1; + return 0; + } + + inline int32_t SecCmp(const CPVT_WordPlace& wp) const { + if (nSecIndex > wp.nSecIndex) + return 1; + if (nSecIndex < wp.nSecIndex) + return -1; + return 0; + } + + int32_t nSecIndex; + int32_t nLineIndex; + int32_t nWordIndex; +}; + +#endif // CORE_FPDFDOC_CPVT_WORDPLACE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordprops.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordprops.h new file mode 100644 index 000000000000..2b7084116ae4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordprops.h @@ -0,0 +1,58 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_WORDPROPS_H_ +#define CORE_FPDFDOC_CPVT_WORDPROPS_H_ + +#include "core/fpdfdoc/cpdf_variabletext.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxge/fx_dib.h" + +struct CPVT_WordProps { + CPVT_WordProps() + : nFontIndex(-1), + fFontSize(0.0f), + dwWordColor(0), + nScriptType(CPDF_VariableText::ScriptType::Normal), + nWordStyle(0), + fCharSpace(0.0f), + nHorzScale(0) {} + + CPVT_WordProps(int32_t fontIndex, + FX_FLOAT fontSize, + FX_COLORREF wordColor = 0, + CPDF_VariableText::ScriptType scriptType = + CPDF_VariableText::ScriptType::Normal, + int32_t wordStyle = 0, + FX_FLOAT charSpace = 0, + int32_t horzScale = 100) + : nFontIndex(fontIndex), + fFontSize(fontSize), + dwWordColor(wordColor), + nScriptType(scriptType), + nWordStyle(wordStyle), + fCharSpace(charSpace), + nHorzScale(horzScale) {} + + CPVT_WordProps(const CPVT_WordProps& other) + : nFontIndex(other.nFontIndex), + fFontSize(other.fFontSize), + dwWordColor(other.dwWordColor), + nScriptType(other.nScriptType), + nWordStyle(other.nWordStyle), + fCharSpace(other.fCharSpace), + nHorzScale(other.nHorzScale) {} + + int32_t nFontIndex; + FX_FLOAT fFontSize; + FX_COLORREF dwWordColor; + CPDF_VariableText::ScriptType nScriptType; + int32_t nWordStyle; + FX_FLOAT fCharSpace; + int32_t nHorzScale; +}; + +#endif // CORE_FPDFDOC_CPVT_WORDPROPS_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordrange.h b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordrange.h new file mode 100644 index 000000000000..b291e50e53b0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/cpvt_wordrange.h @@ -0,0 +1,59 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CPVT_WORDRANGE_H_ +#define CORE_FPDFDOC_CPVT_WORDRANGE_H_ + +#include "core/fpdfdoc/cpvt_wordplace.h" +#include "core/fxcrt/fx_system.h" + +struct CPVT_WordRange { + CPVT_WordRange() {} + + CPVT_WordRange(const CPVT_WordPlace& begin, const CPVT_WordPlace& end) { + Set(begin, end); + } + + void Default() { + BeginPos.Default(); + EndPos.Default(); + } + + void Set(const CPVT_WordPlace& begin, const CPVT_WordPlace& end) { + BeginPos = begin; + EndPos = end; + SwapWordPlace(); + } + + void SetBeginPos(const CPVT_WordPlace& begin) { + BeginPos = begin; + SwapWordPlace(); + } + + void SetEndPos(const CPVT_WordPlace& end) { + EndPos = end; + SwapWordPlace(); + } + + bool IsExist() const { return BeginPos != EndPos; } + + bool operator!=(const CPVT_WordRange& wr) const { + return wr.BeginPos != BeginPos || wr.EndPos != EndPos; + } + + void SwapWordPlace() { + if (BeginPos.WordCmp(EndPos) > 0) { + CPVT_WordPlace place = EndPos; + EndPos = BeginPos; + BeginPos = place; + } + } + + CPVT_WordPlace BeginPos; + CPVT_WordPlace EndPos; +}; + +#endif // CORE_FPDFDOC_CPVT_WORDRANGE_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/csection.cpp b/modules/pdfium/pdfium/core/fpdfdoc/csection.cpp new file mode 100644 index 000000000000..490ef1b23061 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/csection.cpp @@ -0,0 +1,291 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/csection.h" + +#include + +#include "core/fpdfdoc/cline.h" +#include "core/fpdfdoc/cpvt_wordinfo.h" + +CSection::CSection(CPDF_VariableText* pVT) : m_pVT(pVT) {} + +CSection::~CSection() { + ResetAll(); +} + +void CSection::ResetAll() { + ResetWordArray(); + ResetLineArray(); +} + +void CSection::ResetLineArray() { + m_LineArray.RemoveAll(); +} + +void CSection::ResetWordArray() { + for (int32_t i = 0, sz = m_WordArray.GetSize(); i < sz; i++) { + delete m_WordArray.GetAt(i); + } + m_WordArray.RemoveAll(); +} + +void CSection::ResetLinePlace() { + for (int32_t i = 0, sz = m_LineArray.GetSize(); i < sz; i++) { + if (CLine* pLine = m_LineArray.GetAt(i)) { + pLine->LinePlace = CPVT_WordPlace(SecPlace.nSecIndex, i, -1); + } + } +} + +CPVT_WordPlace CSection::AddWord(const CPVT_WordPlace& place, + const CPVT_WordInfo& wordinfo) { + CPVT_WordInfo* pWord = new CPVT_WordInfo(wordinfo); + int32_t nWordIndex = + std::max(std::min(place.nWordIndex, m_WordArray.GetSize()), 0); + if (nWordIndex == m_WordArray.GetSize()) { + m_WordArray.Add(pWord); + } else { + m_WordArray.InsertAt(nWordIndex, pWord); + } + return place; +} + +CPVT_WordPlace CSection::AddLine(const CPVT_LineInfo& lineinfo) { + return CPVT_WordPlace(SecPlace.nSecIndex, m_LineArray.Add(lineinfo), -1); +} + +CPVT_FloatRect CSection::Rearrange() { + if (m_pVT->m_nCharArray > 0) { + return CTypeset(this).CharArray(); + } + return CTypeset(this).Typeset(); +} + +CFX_SizeF CSection::GetSectionSize(FX_FLOAT fFontSize) { + return CTypeset(this).GetEditSize(fFontSize); +} + +CPVT_WordPlace CSection::GetBeginWordPlace() const { + if (CLine* pLine = m_LineArray.GetAt(0)) { + return pLine->GetBeginWordPlace(); + } + return SecPlace; +} + +CPVT_WordPlace CSection::GetEndWordPlace() const { + if (CLine* pLine = m_LineArray.GetAt(m_LineArray.GetSize() - 1)) { + return pLine->GetEndWordPlace(); + } + return SecPlace; +} + +CPVT_WordPlace CSection::GetPrevWordPlace(const CPVT_WordPlace& place) const { + if (place.nLineIndex < 0) { + return GetBeginWordPlace(); + } + if (place.nLineIndex >= m_LineArray.GetSize()) { + return GetEndWordPlace(); + } + if (CLine* pLine = m_LineArray.GetAt(place.nLineIndex)) { + if (place.nWordIndex == pLine->m_LineInfo.nBeginWordIndex) { + return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1); + } + if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) { + if (CLine* pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1)) { + return pPrevLine->GetEndWordPlace(); + } + } else { + return pLine->GetPrevWordPlace(place); + } + } + return place; +} + +CPVT_WordPlace CSection::GetNextWordPlace(const CPVT_WordPlace& place) const { + if (place.nLineIndex < 0) { + return GetBeginWordPlace(); + } + if (place.nLineIndex >= m_LineArray.GetSize()) { + return GetEndWordPlace(); + } + if (CLine* pLine = m_LineArray.GetAt(place.nLineIndex)) { + if (place.nWordIndex >= pLine->m_LineInfo.nEndWordIndex) { + if (CLine* pNextLine = m_LineArray.GetAt(place.nLineIndex + 1)) { + return pNextLine->GetBeginWordPlace(); + } + } else { + return pLine->GetNextWordPlace(place); + } + } + return place; +} + +void CSection::UpdateWordPlace(CPVT_WordPlace& place) const { + int32_t nLeft = 0; + int32_t nRight = m_LineArray.GetSize() - 1; + int32_t nMid = (nLeft + nRight) / 2; + while (nLeft <= nRight) { + if (CLine* pLine = m_LineArray.GetAt(nMid)) { + if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) { + nRight = nMid - 1; + nMid = (nLeft + nRight) / 2; + } else if (place.nWordIndex > pLine->m_LineInfo.nEndWordIndex) { + nLeft = nMid + 1; + nMid = (nLeft + nRight) / 2; + } else { + place.nLineIndex = nMid; + return; + } + } else { + break; + } + } +} + +CPVT_WordPlace CSection::SearchWordPlace(const CFX_PointF& point) const { + ASSERT(m_pVT); + CPVT_WordPlace place = GetBeginWordPlace(); + bool bUp = true; + bool bDown = true; + int32_t nLeft = 0; + int32_t nRight = m_LineArray.GetSize() - 1; + int32_t nMid = m_LineArray.GetSize() / 2; + FX_FLOAT fTop = 0; + FX_FLOAT fBottom = 0; + while (nLeft <= nRight) { + if (CLine* pLine = m_LineArray.GetAt(nMid)) { + fTop = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineAscent - + m_pVT->GetLineLeading(m_SecInfo); + fBottom = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineDescent; + if (IsFloatBigger(point.y, fTop)) { + bUp = false; + } + if (IsFloatSmaller(point.y, fBottom)) { + bDown = false; + } + if (IsFloatSmaller(point.y, fTop)) { + nRight = nMid - 1; + nMid = (nLeft + nRight) / 2; + continue; + } else if (IsFloatBigger(point.y, fBottom)) { + nLeft = nMid + 1; + nMid = (nLeft + nRight) / 2; + continue; + } else { + place = SearchWordPlace( + point.x, + CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), + pLine->GetEndWordPlace())); + place.nLineIndex = nMid; + return place; + } + } + } + if (bUp) { + place = GetBeginWordPlace(); + } + if (bDown) { + place = GetEndWordPlace(); + } + return place; +} + +CPVT_WordPlace CSection::SearchWordPlace( + FX_FLOAT fx, + const CPVT_WordPlace& lineplace) const { + if (CLine* pLine = m_LineArray.GetAt(lineplace.nLineIndex)) { + return SearchWordPlace( + fx - m_SecInfo.rcSection.left, + CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), + pLine->GetEndWordPlace())); + } + return GetBeginWordPlace(); +} + +CPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, + const CPVT_WordRange& range) const { + CPVT_WordPlace wordplace = range.BeginPos; + wordplace.nWordIndex = -1; + if (!m_pVT) { + return wordplace; + } + int32_t nLeft = range.BeginPos.nWordIndex; + int32_t nRight = range.EndPos.nWordIndex + 1; + int32_t nMid = (nLeft + nRight) / 2; + while (nLeft < nRight) { + if (nMid == nLeft) { + break; + } + if (nMid == nRight) { + nMid--; + break; + } + if (CPVT_WordInfo* pWord = m_WordArray.GetAt(nMid)) { + if (fx > + pWord->fWordX + m_pVT->GetWordWidth(*pWord) * VARIABLETEXT_HALF) { + nLeft = nMid; + nMid = (nLeft + nRight) / 2; + continue; + } else { + nRight = nMid; + nMid = (nLeft + nRight) / 2; + continue; + } + } else { + break; + } + } + if (CPVT_WordInfo* pWord = m_WordArray.GetAt(nMid)) { + if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * VARIABLETEXT_HALF) { + wordplace.nWordIndex = nMid; + } + } + return wordplace; +} + +void CSection::ClearLeftWords(int32_t nWordIndex) { + for (int32_t i = nWordIndex; i >= 0; i--) { + delete m_WordArray.GetAt(i); + m_WordArray.RemoveAt(i); + } +} + +void CSection::ClearRightWords(int32_t nWordIndex) { + for (int32_t i = m_WordArray.GetSize() - 1; i > nWordIndex; i--) { + delete m_WordArray.GetAt(i); + m_WordArray.RemoveAt(i); + } +} + +void CSection::ClearMidWords(int32_t nBeginIndex, int32_t nEndIndex) { + for (int32_t i = nEndIndex; i > nBeginIndex; i--) { + delete m_WordArray.GetAt(i); + m_WordArray.RemoveAt(i); + } +} + +void CSection::ClearWords(const CPVT_WordRange& PlaceRange) { + CPVT_WordPlace SecBeginPos = GetBeginWordPlace(); + CPVT_WordPlace SecEndPos = GetEndWordPlace(); + if (PlaceRange.BeginPos.WordCmp(SecBeginPos) >= 0) { + if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) { + ClearMidWords(PlaceRange.BeginPos.nWordIndex, + PlaceRange.EndPos.nWordIndex); + } else { + ClearRightWords(PlaceRange.BeginPos.nWordIndex); + } + } else if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) { + ClearLeftWords(PlaceRange.EndPos.nWordIndex); + } else { + ResetWordArray(); + } +} + +void CSection::ClearWord(const CPVT_WordPlace& place) { + delete m_WordArray.GetAt(place.nWordIndex); + m_WordArray.RemoveAt(place.nWordIndex); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/csection.h b/modules/pdfium/pdfium/core/fpdfdoc/csection.h new file mode 100644 index 000000000000..a2ac43b102dc --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/csection.h @@ -0,0 +1,63 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CSECTION_H_ +#define CORE_FPDFDOC_CSECTION_H_ + +#include "core/fpdfdoc/clines.h" +#include "core/fpdfdoc/cpvt_sectioninfo.h" +#include "core/fpdfdoc/ctypeset.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_VariableText; +class CPVT_LineInfo; +struct CPVT_WordLine; +struct CPVT_WordPlace; + +class CSection final { + public: + explicit CSection(CPDF_VariableText* pVT); + ~CSection(); + + void ResetAll(); + void ResetLineArray(); + void ResetWordArray(); + void ResetLinePlace(); + CPVT_WordPlace AddWord(const CPVT_WordPlace& place, + const CPVT_WordInfo& wordinfo); + CPVT_WordPlace AddLine(const CPVT_LineInfo& lineinfo); + void ClearWords(const CPVT_WordRange& PlaceRange); + void ClearWord(const CPVT_WordPlace& place); + CPVT_FloatRect Rearrange(); + CFX_SizeF GetSectionSize(FX_FLOAT fFontSize); + CPVT_WordPlace GetBeginWordPlace() const; + CPVT_WordPlace GetEndWordPlace() const; + CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const; + CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace& place) const; + void UpdateWordPlace(CPVT_WordPlace& place) const; + CPVT_WordPlace SearchWordPlace(const CFX_PointF& point) const; + CPVT_WordPlace SearchWordPlace(FX_FLOAT fx, + const CPVT_WordPlace& lineplace) const; + CPVT_WordPlace SearchWordPlace(FX_FLOAT fx, + const CPVT_WordRange& range) const; + + CPVT_WordPlace SecPlace; + CPVT_SectionInfo m_SecInfo; + CLines m_LineArray; + CPVT_ArrayTemplate m_WordArray; + + private: + friend class CTypeset; + + void ClearLeftWords(int32_t nWordIndex); + void ClearRightWords(int32_t nWordIndex); + void ClearMidWords(int32_t nBeginIndex, int32_t nEndIndex); + + CPDF_VariableText* const m_pVT; +}; + +#endif // CORE_FPDFDOC_CSECTION_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/ctypeset.cpp b/modules/pdfium/pdfium/core/fpdfdoc/ctypeset.cpp new file mode 100644 index 000000000000..452143e68255 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/ctypeset.cpp @@ -0,0 +1,493 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfdoc/ctypeset.h" + +#include + +#include "core/fpdfdoc/cline.h" +#include "core/fpdfdoc/cpvt_wordinfo.h" +#include "core/fpdfdoc/csection.h" + +namespace { + +const uint8_t special_chars[128] = { + 0x00, 0x0C, 0x08, 0x0C, 0x08, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, + 0x10, 0x00, 0x00, 0x28, 0x0C, 0x08, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x08, 0x08, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0C, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x0C, 0x00, 0x08, 0x00, 0x00, +}; + +bool IsLatin(uint16_t word) { + if (word <= 0x007F) + return !!(special_chars[word] & 0x01); + + return ((word >= 0x00C0 && word <= 0x00FF) || + (word >= 0x0100 && word <= 0x024F) || + (word >= 0x1E00 && word <= 0x1EFF) || + (word >= 0x2C60 && word <= 0x2C7F) || + (word >= 0xA720 && word <= 0xA7FF) || + (word >= 0xFF21 && word <= 0xFF3A) || + (word >= 0xFF41 && word <= 0xFF5A)); +} + +bool IsDigit(uint32_t word) { + return word >= 0x0030 && word <= 0x0039; +} + +bool IsCJK(uint32_t word) { + if ((word >= 0x1100 && word <= 0x11FF) || + (word >= 0x2E80 && word <= 0x2FFF) || + (word >= 0x3040 && word <= 0x9FBF) || + (word >= 0xAC00 && word <= 0xD7AF) || + (word >= 0xF900 && word <= 0xFAFF) || + (word >= 0xFE30 && word <= 0xFE4F) || + (word >= 0x20000 && word <= 0x2A6DF) || + (word >= 0x2F800 && word <= 0x2FA1F)) { + return true; + } + if (word >= 0x3000 && word <= 0x303F) { + return ( + word == 0x3005 || word == 0x3006 || word == 0x3021 || word == 0x3022 || + word == 0x3023 || word == 0x3024 || word == 0x3025 || word == 0x3026 || + word == 0x3027 || word == 0x3028 || word == 0x3029 || word == 0x3031 || + word == 0x3032 || word == 0x3033 || word == 0x3034 || word == 0x3035); + } + return word >= 0xFF66 && word <= 0xFF9D; +} + +bool IsPunctuation(uint32_t word) { + if (word <= 0x007F) + return !!(special_chars[word] & 0x08); + + if (word >= 0x0080 && word <= 0x00FF) { + return (word == 0x0082 || word == 0x0084 || word == 0x0085 || + word == 0x0091 || word == 0x0092 || word == 0x0093 || + word <= 0x0094 || word == 0x0096 || word == 0x00B4 || + word == 0x00B8); + } + + if (word >= 0x2000 && word <= 0x206F) { + return ( + word == 0x2010 || word == 0x2011 || word == 0x2012 || word == 0x2013 || + word == 0x2018 || word == 0x2019 || word == 0x201A || word == 0x201B || + word == 0x201C || word == 0x201D || word == 0x201E || word == 0x201F || + word == 0x2032 || word == 0x2033 || word == 0x2034 || word == 0x2035 || + word == 0x2036 || word == 0x2037 || word == 0x203C || word == 0x203D || + word == 0x203E || word == 0x2044); + } + + if (word >= 0x3000 && word <= 0x303F) { + return ( + word == 0x3001 || word == 0x3002 || word == 0x3003 || word == 0x3005 || + word == 0x3009 || word == 0x300A || word == 0x300B || word == 0x300C || + word == 0x300D || word == 0x300F || word == 0x300E || word == 0x3010 || + word == 0x3011 || word == 0x3014 || word == 0x3015 || word == 0x3016 || + word == 0x3017 || word == 0x3018 || word == 0x3019 || word == 0x301A || + word == 0x301B || word == 0x301D || word == 0x301E || word == 0x301F); + } + + if (word >= 0xFE50 && word <= 0xFE6F) + return (word >= 0xFE50 && word <= 0xFE5E) || word == 0xFE63; + + if (word >= 0xFF00 && word <= 0xFFEF) { + return ( + word == 0xFF01 || word == 0xFF02 || word == 0xFF07 || word == 0xFF08 || + word == 0xFF09 || word == 0xFF0C || word == 0xFF0E || word == 0xFF0F || + word == 0xFF1A || word == 0xFF1B || word == 0xFF1F || word == 0xFF3B || + word == 0xFF3D || word == 0xFF40 || word == 0xFF5B || word == 0xFF5C || + word == 0xFF5D || word == 0xFF61 || word == 0xFF62 || word == 0xFF63 || + word == 0xFF64 || word == 0xFF65 || word == 0xFF9E || word == 0xFF9F); + } + + return false; +} + +bool IsConnectiveSymbol(uint32_t word) { + return word <= 0x007F && (special_chars[word] & 0x20); +} + +bool IsOpenStylePunctuation(uint32_t word) { + if (word <= 0x007F) + return !!(special_chars[word] & 0x04); + + return (word == 0x300A || word == 0x300C || word == 0x300E || + word == 0x3010 || word == 0x3014 || word == 0x3016 || + word == 0x3018 || word == 0x301A || word == 0xFF08 || + word == 0xFF3B || word == 0xFF5B || word == 0xFF62); +} + +bool IsCurrencySymbol(uint16_t word) { + return (word == 0x0024 || word == 0x0080 || word == 0x00A2 || + word == 0x00A3 || word == 0x00A4 || word == 0x00A5 || + (word >= 0x20A0 && word <= 0x20CF) || word == 0xFE69 || + word == 0xFF04 || word == 0xFFE0 || word == 0xFFE1 || + word == 0xFFE5 || word == 0xFFE6); +} + +bool IsPrefixSymbol(uint16_t word) { + return IsCurrencySymbol(word) || word == 0x2116; +} + +bool IsSpace(uint16_t word) { + return word == 0x0020 || word == 0x3000; +} + +bool NeedDivision(uint16_t prevWord, uint16_t curWord) { + if ((IsLatin(prevWord) || IsDigit(prevWord)) && + (IsLatin(curWord) || IsDigit(curWord))) { + return false; + } + if (IsSpace(curWord) || IsPunctuation(curWord)) { + return false; + } + if (IsConnectiveSymbol(prevWord) || IsConnectiveSymbol(curWord)) { + return false; + } + if (IsSpace(prevWord) || IsPunctuation(prevWord)) { + return true; + } + if (IsPrefixSymbol(prevWord)) { + return false; + } + if (IsPrefixSymbol(curWord) || IsCJK(curWord)) { + return true; + } + if (IsCJK(prevWord)) { + return true; + } + return false; +} + +} // namespace + +CTypeset::CTypeset(CSection* pSection) + : m_rcRet(0.0f, 0.0f, 0.0f, 0.0f), + m_pVT(pSection->m_pVT), + m_pSection(pSection) {} + +CTypeset::~CTypeset() {} + +CPVT_FloatRect CTypeset::CharArray() { + ASSERT(m_pSection); + FX_FLOAT fLineAscent = + m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize()); + FX_FLOAT fLineDescent = + m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize()); + m_rcRet.Default(); + FX_FLOAT x = 0.0f, y = 0.0f; + FX_FLOAT fNextWidth; + int32_t nStart = 0; + FX_FLOAT fNodeWidth = m_pVT->GetPlateWidth() / + (m_pVT->m_nCharArray <= 0 ? 1 : m_pVT->m_nCharArray); + if (CLine* pLine = m_pSection->m_LineArray.GetAt(0)) { + x = 0.0f; + y += m_pVT->GetLineLeading(m_pSection->m_SecInfo); + y += fLineAscent; + nStart = 0; + switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) { + case 0: + pLine->m_LineInfo.fLineX = fNodeWidth * VARIABLETEXT_HALF; + break; + case 1: + nStart = (m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize()) / 2; + pLine->m_LineInfo.fLineX = + fNodeWidth * nStart - fNodeWidth * VARIABLETEXT_HALF; + break; + case 2: + nStart = m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize(); + pLine->m_LineInfo.fLineX = + fNodeWidth * nStart - fNodeWidth * VARIABLETEXT_HALF; + break; + } + for (int32_t w = 0, sz = m_pSection->m_WordArray.GetSize(); w < sz; w++) { + if (w >= m_pVT->m_nCharArray) { + break; + } + fNextWidth = 0; + if (CPVT_WordInfo* pNextWord = m_pSection->m_WordArray.GetAt(w + 1)) { + pNextWord->fWordTail = 0; + fNextWidth = m_pVT->GetWordWidth(*pNextWord); + } + if (CPVT_WordInfo* pWord = m_pSection->m_WordArray.GetAt(w)) { + pWord->fWordTail = 0; + FX_FLOAT fWordWidth = m_pVT->GetWordWidth(*pWord); + FX_FLOAT fWordAscent = m_pVT->GetWordAscent(*pWord); + FX_FLOAT fWordDescent = m_pVT->GetWordDescent(*pWord); + x = (FX_FLOAT)(fNodeWidth * (w + nStart + 0.5) - + fWordWidth * VARIABLETEXT_HALF); + pWord->fWordX = x; + pWord->fWordY = y; + if (w == 0) { + pLine->m_LineInfo.fLineX = x; + } + if (w != m_pSection->m_WordArray.GetSize() - 1) { + pWord->fWordTail = + (fNodeWidth - (fWordWidth + fNextWidth) * VARIABLETEXT_HALF > 0 + ? fNodeWidth - (fWordWidth + fNextWidth) * VARIABLETEXT_HALF + : 0); + } else { + pWord->fWordTail = 0; + } + x += fWordWidth; + fLineAscent = std::max(fLineAscent, fWordAscent); + fLineDescent = std::min(fLineDescent, fWordDescent); + } + } + pLine->m_LineInfo.nBeginWordIndex = 0; + pLine->m_LineInfo.nEndWordIndex = m_pSection->m_WordArray.GetSize() - 1; + pLine->m_LineInfo.fLineY = y; + pLine->m_LineInfo.fLineWidth = x - pLine->m_LineInfo.fLineX; + pLine->m_LineInfo.fLineAscent = fLineAscent; + pLine->m_LineInfo.fLineDescent = fLineDescent; + y -= fLineDescent; + } + return m_rcRet = CPVT_FloatRect(0, 0, x, y); +} + +CFX_SizeF CTypeset::GetEditSize(FX_FLOAT fFontSize) { + ASSERT(m_pSection); + ASSERT(m_pVT); + SplitLines(false, fFontSize); + return CFX_SizeF(m_rcRet.Width(), m_rcRet.Height()); +} + +CPVT_FloatRect CTypeset::Typeset() { + ASSERT(m_pVT); + m_pSection->m_LineArray.Empty(); + SplitLines(true, 0.0f); + m_pSection->m_LineArray.Clear(); + OutputLines(); + return m_rcRet; +} + +void CTypeset::SplitLines(bool bTypeset, FX_FLOAT fFontSize) { + ASSERT(m_pVT); + ASSERT(m_pSection); + int32_t nLineHead = 0; + int32_t nLineTail = 0; + FX_FLOAT fMaxX = 0.0f, fMaxY = 0.0f; + FX_FLOAT fLineWidth = 0.0f, fBackupLineWidth = 0.0f; + FX_FLOAT fLineAscent = 0.0f, fBackupLineAscent = 0.0f; + FX_FLOAT fLineDescent = 0.0f, fBackupLineDescent = 0.0f; + int32_t nWordStartPos = 0; + bool bFullWord = false; + int32_t nLineFullWordIndex = 0; + int32_t nCharIndex = 0; + CPVT_LineInfo line; + FX_FLOAT fWordWidth = 0; + FX_FLOAT fTypesetWidth = std::max( + m_pVT->GetPlateWidth() - m_pVT->GetLineIndent(m_pSection->m_SecInfo), + 0.0f); + int32_t nTotalWords = m_pSection->m_WordArray.GetSize(); + bool bOpened = false; + if (nTotalWords > 0) { + int32_t i = 0; + while (i < nTotalWords) { + CPVT_WordInfo* pWord = m_pSection->m_WordArray.GetAt(i); + CPVT_WordInfo* pOldWord = pWord; + if (i > 0) { + pOldWord = m_pSection->m_WordArray.GetAt(i - 1); + } + if (pWord) { + if (bTypeset) { + fLineAscent = std::max(fLineAscent, m_pVT->GetWordAscent(*pWord)); + fLineDescent = std::min(fLineDescent, m_pVT->GetWordDescent(*pWord)); + fWordWidth = m_pVT->GetWordWidth(*pWord); + } else { + fLineAscent = + std::max(fLineAscent, m_pVT->GetWordAscent(*pWord, fFontSize)); + fLineDescent = + std::min(fLineDescent, m_pVT->GetWordDescent(*pWord, fFontSize)); + fWordWidth = m_pVT->GetWordWidth( + pWord->nFontIndex, pWord->Word, m_pVT->m_wSubWord, + m_pVT->m_fCharSpace, m_pVT->m_nHorzScale, fFontSize, + pWord->fWordTail); + } + if (!bOpened) { + if (IsOpenStylePunctuation(pWord->Word)) { + bOpened = true; + bFullWord = true; + } else if (pOldWord) { + if (NeedDivision(pOldWord->Word, pWord->Word)) { + bFullWord = true; + } + } + } else { + if (!IsSpace(pWord->Word) && !IsOpenStylePunctuation(pWord->Word)) { + bOpened = false; + } + } + if (bFullWord) { + bFullWord = false; + if (nCharIndex > 0) { + nLineFullWordIndex++; + } + nWordStartPos = i; + fBackupLineWidth = fLineWidth; + fBackupLineAscent = fLineAscent; + fBackupLineDescent = fLineDescent; + } + nCharIndex++; + } + if (m_pVT->m_bLimitWidth && fTypesetWidth > 0 && + fLineWidth + fWordWidth > fTypesetWidth) { + if (nLineFullWordIndex > 0) { + i = nWordStartPos; + fLineWidth = fBackupLineWidth; + fLineAscent = fBackupLineAscent; + fLineDescent = fBackupLineDescent; + } + if (nCharIndex == 1) { + fLineWidth = fWordWidth; + i++; + } + nLineTail = i - 1; + if (bTypeset) { + line.nBeginWordIndex = nLineHead; + line.nEndWordIndex = nLineTail; + line.nTotalWord = nLineTail - nLineHead + 1; + line.fLineWidth = fLineWidth; + line.fLineAscent = fLineAscent; + line.fLineDescent = fLineDescent; + m_pSection->AddLine(line); + } + fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo)); + fMaxY -= fLineDescent; + fMaxX = std::max(fLineWidth, fMaxX); + nLineHead = i; + fLineWidth = 0.0f; + fLineAscent = 0.0f; + fLineDescent = 0.0f; + nCharIndex = 0; + nLineFullWordIndex = 0; + bFullWord = false; + } else { + fLineWidth += fWordWidth; + i++; + } + } + if (nLineHead <= nTotalWords - 1) { + nLineTail = nTotalWords - 1; + if (bTypeset) { + line.nBeginWordIndex = nLineHead; + line.nEndWordIndex = nLineTail; + line.nTotalWord = nLineTail - nLineHead + 1; + line.fLineWidth = fLineWidth; + line.fLineAscent = fLineAscent; + line.fLineDescent = fLineDescent; + m_pSection->AddLine(line); + } + fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo)); + fMaxY -= fLineDescent; + fMaxX = std::max(fLineWidth, fMaxX); + } + } else { + if (bTypeset) { + fLineAscent = m_pVT->GetLineAscent(m_pSection->m_SecInfo); + fLineDescent = m_pVT->GetLineDescent(m_pSection->m_SecInfo); + } else { + fLineAscent = + m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), fFontSize); + fLineDescent = + m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), fFontSize); + } + if (bTypeset) { + line.nBeginWordIndex = -1; + line.nEndWordIndex = -1; + line.nTotalWord = 0; + line.fLineWidth = 0; + line.fLineAscent = fLineAscent; + line.fLineDescent = fLineDescent; + m_pSection->AddLine(line); + } + fMaxY += m_pVT->GetLineLeading(m_pSection->m_SecInfo) + fLineAscent - + fLineDescent; + } + m_rcRet = CPVT_FloatRect(0, 0, fMaxX, fMaxY); +} + +void CTypeset::OutputLines() { + ASSERT(m_pVT); + ASSERT(m_pSection); + FX_FLOAT fMinX = 0.0f, fMinY = 0.0f, fMaxX = 0.0f, fMaxY = 0.0f; + FX_FLOAT fPosX = 0.0f, fPosY = 0.0f; + FX_FLOAT fLineIndent = m_pVT->GetLineIndent(m_pSection->m_SecInfo); + FX_FLOAT fTypesetWidth = std::max(m_pVT->GetPlateWidth() - fLineIndent, 0.0f); + switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) { + default: + case 0: + fMinX = 0.0f; + break; + case 1: + fMinX = (fTypesetWidth - m_rcRet.Width()) * VARIABLETEXT_HALF; + break; + case 2: + fMinX = fTypesetWidth - m_rcRet.Width(); + break; + } + fMaxX = fMinX + m_rcRet.Width(); + fMinY = 0.0f; + fMaxY = m_rcRet.Height(); + int32_t nTotalLines = m_pSection->m_LineArray.GetSize(); + if (nTotalLines > 0) { + m_pSection->m_SecInfo.nTotalLine = nTotalLines; + for (int32_t l = 0; l < nTotalLines; l++) { + if (CLine* pLine = m_pSection->m_LineArray.GetAt(l)) { + switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) { + default: + case 0: + fPosX = 0; + break; + case 1: + fPosX = (fTypesetWidth - pLine->m_LineInfo.fLineWidth) * + VARIABLETEXT_HALF; + break; + case 2: + fPosX = fTypesetWidth - pLine->m_LineInfo.fLineWidth; + break; + } + fPosX += fLineIndent; + fPosY += m_pVT->GetLineLeading(m_pSection->m_SecInfo); + fPosY += pLine->m_LineInfo.fLineAscent; + pLine->m_LineInfo.fLineX = fPosX - fMinX; + pLine->m_LineInfo.fLineY = fPosY - fMinY; + for (int32_t w = pLine->m_LineInfo.nBeginWordIndex; + w <= pLine->m_LineInfo.nEndWordIndex; w++) { + if (CPVT_WordInfo* pWord = m_pSection->m_WordArray.GetAt(w)) { + pWord->fWordX = fPosX - fMinX; + if (pWord->pWordProps) { + switch (pWord->pWordProps->nScriptType) { + default: + case CPDF_VariableText::ScriptType::Normal: + pWord->fWordY = fPosY - fMinY; + break; + case CPDF_VariableText::ScriptType::Super: + pWord->fWordY = fPosY - m_pVT->GetWordAscent(*pWord) - fMinY; + break; + case CPDF_VariableText::ScriptType::Sub: + pWord->fWordY = fPosY - m_pVT->GetWordDescent(*pWord) - fMinY; + break; + } + } else { + pWord->fWordY = fPosY - fMinY; + } + fPosX += m_pVT->GetWordWidth(*pWord); + } + } + fPosY -= pLine->m_LineInfo.fLineDescent; + } + } + } + m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY); +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/ctypeset.h b/modules/pdfium/pdfium/core/fpdfdoc/ctypeset.h new file mode 100644 index 000000000000..4161c03b4260 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/ctypeset.h @@ -0,0 +1,34 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_CTYPESET_H_ +#define CORE_FPDFDOC_CTYPESET_H_ + +#include "core/fpdfdoc/cpvt_floatrect.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_VariableText; +class CSection; + +class CTypeset final { + public: + explicit CTypeset(CSection* pSection); + ~CTypeset(); + + CFX_SizeF GetEditSize(FX_FLOAT fFontSize); + CPVT_FloatRect Typeset(); + CPVT_FloatRect CharArray(); + + private: + void SplitLines(bool bTypeset, FX_FLOAT fFontSize); + void OutputLines(); + + CPVT_FloatRect m_rcRet; + CPDF_VariableText* const m_pVT; + CSection* const m_pSection; +}; + +#endif // CORE_FPDFDOC_CTYPESET_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/doc_tagged.cpp b/modules/pdfium/pdfium/core/fpdfdoc/doc_tagged.cpp new file mode 100644 index 000000000000..af5cf8593823 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/doc_tagged.cpp @@ -0,0 +1,418 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include +#include +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfdoc/cpdf_numbertree.h" +#include "core/fpdfdoc/fpdf_tagged.h" +#include "core/fpdfdoc/tagged_int.h" +#include "third_party/base/ptr_util.h" + +namespace { + +const int nMaxRecursion = 32; + +bool IsTagged(const CPDF_Document* pDoc) { + CPDF_Dictionary* pCatalog = pDoc->GetRoot(); + CPDF_Dictionary* pMarkInfo = pCatalog->GetDictFor("MarkInfo"); + return pMarkInfo && pMarkInfo->GetIntegerFor("Marked"); +} + +} // namespace + +CPDF_StructKid::CPDF_StructKid() + : m_Type(Invalid), + m_pDict(nullptr), + m_PageObjNum(0), + m_RefObjNum(0), + m_ContentId(0) {} + +CPDF_StructKid::CPDF_StructKid(const CPDF_StructKid& that) = default; + +CPDF_StructKid::~CPDF_StructKid() {} + +// static +std::unique_ptr IPDF_StructTree::LoadPage( + const CPDF_Document* pDoc, + const CPDF_Dictionary* pPageDict) { + if (!IsTagged(pDoc)) + return nullptr; + + auto pTree = pdfium::MakeUnique(pDoc); + pTree->LoadPageTree(pPageDict); + return std::move(pTree); +} + +CPDF_StructTree::CPDF_StructTree(const CPDF_Document* pDoc) + : m_pTreeRoot(pDoc->GetRoot()->GetDictFor("StructTreeRoot")), + m_pRoleMap(m_pTreeRoot ? m_pTreeRoot->GetDictFor("RoleMap") : nullptr), + m_pPage(nullptr) {} + +CPDF_StructTree::~CPDF_StructTree() {} + +int CPDF_StructTree::CountTopElements() const { + return pdfium::CollectionSize(m_Kids); +} + +IPDF_StructElement* CPDF_StructTree::GetTopElement(int i) const { + return m_Kids[i].Get(); +} + +void CPDF_StructTree::LoadPageTree(const CPDF_Dictionary* pPageDict) { + m_pPage = pPageDict; + if (!m_pTreeRoot) + return; + + CPDF_Object* pKids = m_pTreeRoot->GetDirectObjectFor("K"); + if (!pKids) + return; + + uint32_t dwKids = 0; + if (pKids->IsDictionary()) + dwKids = 1; + else if (CPDF_Array* pArray = pKids->AsArray()) + dwKids = pArray->GetCount(); + else + return; + + m_Kids.clear(); + m_Kids.resize(dwKids); + CPDF_Dictionary* pParentTree = m_pTreeRoot->GetDictFor("ParentTree"); + if (!pParentTree) + return; + + CPDF_NumberTree parent_tree(pParentTree); + int parents_id = pPageDict->GetIntegerFor("StructParents", -1); + if (parents_id < 0) + return; + + CPDF_Array* pParentArray = ToArray(parent_tree.LookupValue(parents_id)); + if (!pParentArray) + return; + + std::map> element_map; + for (size_t i = 0; i < pParentArray->GetCount(); i++) { + if (CPDF_Dictionary* pParent = pParentArray->GetDictAt(i)) + AddPageNode(pParent, &element_map); + } +} + +CFX_RetainPtr CPDF_StructTree::AddPageNode( + CPDF_Dictionary* pDict, + std::map>* map, + int nLevel) { + if (nLevel > nMaxRecursion) + return nullptr; + + auto it = map->find(pDict); + if (it != map->end()) + return it->second; + + auto pElement = pdfium::MakeRetain(this, nullptr, pDict); + (*map)[pDict] = pElement; + CPDF_Dictionary* pParent = pDict->GetDictFor("P"); + if (!pParent || pParent->GetStringFor("Type") == "StructTreeRoot") { + if (!AddTopLevelNode(pDict, pElement)) + map->erase(pDict); + return pElement; + } + + CFX_RetainPtr pParentElement = + AddPageNode(pParent, map, nLevel + 1); + bool bSave = false; + for (CPDF_StructKid& kid : *pParentElement->GetKids()) { + if (kid.m_Type == CPDF_StructKid::Element && kid.m_pDict == pDict) { + kid.m_pElement = pElement; + bSave = true; + } + } + if (!bSave) + map->erase(pDict); + return pElement; +} + +bool CPDF_StructTree::AddTopLevelNode( + CPDF_Dictionary* pDict, + const CFX_RetainPtr& pElement) { + CPDF_Object* pObj = m_pTreeRoot->GetDirectObjectFor("K"); + if (!pObj) + return false; + + if (pObj->IsDictionary()) { + if (pObj->GetObjNum() != pDict->GetObjNum()) + return false; + m_Kids[0] = pElement; + } + if (CPDF_Array* pTopKids = pObj->AsArray()) { + bool bSave = false; + for (size_t i = 0; i < pTopKids->GetCount(); i++) { + CPDF_Reference* pKidRef = ToReference(pTopKids->GetObjectAt(i)); + if (pKidRef && pKidRef->GetRefObjNum() == pDict->GetObjNum()) { + m_Kids[i] = pElement; + bSave = true; + } + } + if (!bSave) + return false; + } + return true; +} + +CPDF_StructElement::CPDF_StructElement(CPDF_StructTree* pTree, + CPDF_StructElement* pParent, + CPDF_Dictionary* pDict) + : m_pTree(pTree), + m_pParent(pParent), + m_pDict(pDict), + m_Type(pDict->GetStringFor("S")) { + if (pTree->m_pRoleMap) { + CFX_ByteString mapped = pTree->m_pRoleMap->GetStringFor(m_Type); + if (!mapped.IsEmpty()) + m_Type = mapped; + } + LoadKids(pDict); +} + +IPDF_StructTree* CPDF_StructElement::GetTree() const { + return m_pTree; +} + +const CFX_ByteString& CPDF_StructElement::GetType() const { + return m_Type; +} + +IPDF_StructElement* CPDF_StructElement::GetParent() const { + return m_pParent; +} + +CPDF_Dictionary* CPDF_StructElement::GetDict() const { + return m_pDict; +} + +int CPDF_StructElement::CountKids() const { + return pdfium::CollectionSize(m_Kids); +} + +IPDF_StructElement* CPDF_StructElement::GetKidIfElement(int index) const { + if (m_Kids[index].m_Type != CPDF_StructKid::Element) + return nullptr; + + return m_Kids[index].m_pElement.Get(); +} + +CPDF_StructElement::~CPDF_StructElement() {} + +void CPDF_StructElement::LoadKids(CPDF_Dictionary* pDict) { + CPDF_Object* pObj = pDict->GetObjectFor("Pg"); + uint32_t PageObjNum = 0; + if (CPDF_Reference* pRef = ToReference(pObj)) + PageObjNum = pRef->GetRefObjNum(); + + CPDF_Object* pKids = pDict->GetDirectObjectFor("K"); + if (!pKids) + return; + + m_Kids.clear(); + if (CPDF_Array* pArray = pKids->AsArray()) { + m_Kids.resize(pArray->GetCount()); + for (uint32_t i = 0; i < pArray->GetCount(); i++) { + CPDF_Object* pKid = pArray->GetDirectObjectAt(i); + LoadKid(PageObjNum, pKid, &m_Kids[i]); + } + } else { + m_Kids.resize(1); + LoadKid(PageObjNum, pKids, &m_Kids[0]); + } +} +void CPDF_StructElement::LoadKid(uint32_t PageObjNum, + CPDF_Object* pKidObj, + CPDF_StructKid* pKid) { + pKid->m_Type = CPDF_StructKid::Invalid; + if (!pKidObj) + return; + + if (pKidObj->IsNumber()) { + if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) { + return; + } + pKid->m_Type = CPDF_StructKid::PageContent; + pKid->m_ContentId = pKidObj->GetInteger(); + pKid->m_PageObjNum = PageObjNum; + return; + } + + CPDF_Dictionary* pKidDict = pKidObj->AsDictionary(); + if (!pKidDict) + return; + + if (CPDF_Reference* pRef = ToReference(pKidDict->GetObjectFor("Pg"))) + PageObjNum = pRef->GetRefObjNum(); + + CFX_ByteString type = pKidDict->GetStringFor("Type"); + if (type == "MCR") { + if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) { + return; + } + pKid->m_Type = CPDF_StructKid::StreamContent; + CPDF_Reference* pRef = ToReference(pKidDict->GetObjectFor("Stm")); + pKid->m_RefObjNum = pRef ? pRef->GetRefObjNum() : 0; + pKid->m_PageObjNum = PageObjNum; + pKid->m_ContentId = pKidDict->GetIntegerFor("MCID"); + } else if (type == "OBJR") { + if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) { + return; + } + pKid->m_Type = CPDF_StructKid::Object; + CPDF_Reference* pObj = ToReference(pKidDict->GetObjectFor("Obj")); + pKid->m_RefObjNum = pObj ? pObj->GetRefObjNum() : 0; + pKid->m_PageObjNum = PageObjNum; + } else { + pKid->m_Type = CPDF_StructKid::Element; + pKid->m_pDict = pKidDict; + if (!m_pTree->m_pPage) { + pKid->m_pElement = + pdfium::MakeRetain(m_pTree, this, pKidDict); + } else { + pKid->m_pElement = nullptr; + } + } +} +static CPDF_Dictionary* FindAttrDict(CPDF_Object* pAttrs, + const CFX_ByteStringC& owner, + FX_FLOAT nLevel = 0.0F) { + if (nLevel > nMaxRecursion) + return nullptr; + if (!pAttrs) + return nullptr; + + CPDF_Dictionary* pDict = nullptr; + if (pAttrs->IsDictionary()) { + pDict = pAttrs->AsDictionary(); + } else if (CPDF_Stream* pStream = pAttrs->AsStream()) { + pDict = pStream->GetDict(); + } else if (CPDF_Array* pArray = pAttrs->AsArray()) { + for (uint32_t i = 0; i < pArray->GetCount(); i++) { + CPDF_Object* pElement = pArray->GetDirectObjectAt(i); + pDict = FindAttrDict(pElement, owner, nLevel + 1); + if (pDict) + return pDict; + } + } + if (pDict && pDict->GetStringFor("O") == owner) + return pDict; + return nullptr; +} +CPDF_Object* CPDF_StructElement::GetAttr(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + bool bInheritable, + FX_FLOAT fLevel) { + if (fLevel > nMaxRecursion) { + return nullptr; + } + if (bInheritable) { + CPDF_Object* pAttr = GetAttr(owner, name, false); + if (pAttr) { + return pAttr; + } + if (!m_pParent) { + return nullptr; + } + return m_pParent->GetAttr(owner, name, true, fLevel + 1); + } + CPDF_Object* pA = m_pDict->GetDirectObjectFor("A"); + if (pA) { + CPDF_Dictionary* pAttrDict = FindAttrDict(pA, owner); + if (pAttrDict) { + CPDF_Object* pAttr = pAttrDict->GetDirectObjectFor(CFX_ByteString(name)); + if (pAttr) { + return pAttr; + } + } + } + CPDF_Object* pC = m_pDict->GetDirectObjectFor("C"); + if (!pC) + return nullptr; + + CPDF_Dictionary* pClassMap = m_pTree->m_pTreeRoot->GetDictFor("ClassMap"); + if (!pClassMap) + return nullptr; + + if (CPDF_Array* pArray = pC->AsArray()) { + for (uint32_t i = 0; i < pArray->GetCount(); i++) { + CFX_ByteString class_name = pArray->GetStringAt(i); + CPDF_Dictionary* pClassDict = pClassMap->GetDictFor(class_name); + if (pClassDict && pClassDict->GetStringFor("O") == owner) + return pClassDict->GetDirectObjectFor(CFX_ByteString(name)); + } + return nullptr; + } + CFX_ByteString class_name = pC->GetString(); + CPDF_Dictionary* pClassDict = pClassMap->GetDictFor(class_name); + if (pClassDict && pClassDict->GetStringFor("O") == owner) + return pClassDict->GetDirectObjectFor(CFX_ByteString(name)); + return nullptr; +} +CPDF_Object* CPDF_StructElement::GetAttr(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + bool bInheritable, + int subindex) { + CPDF_Object* pAttr = GetAttr(owner, name, bInheritable); + CPDF_Array* pArray = ToArray(pAttr); + if (!pArray || subindex == -1) + return pAttr; + + if (subindex >= static_cast(pArray->GetCount())) + return pAttr; + return pArray->GetDirectObjectAt(subindex); +} +CFX_ByteString CPDF_StructElement::GetName(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + const CFX_ByteStringC& default_value, + bool bInheritable, + int subindex) { + CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex); + if (ToName(pAttr)) + return pAttr->GetString(); + return CFX_ByteString(default_value); +} + +FX_ARGB CPDF_StructElement::GetColor(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + FX_ARGB default_value, + bool bInheritable, + int subindex) { + CPDF_Array* pArray = ToArray(GetAttr(owner, name, bInheritable, subindex)); + if (!pArray) + return default_value; + return 0xff000000 | ((int)(pArray->GetNumberAt(0) * 255) << 16) | + ((int)(pArray->GetNumberAt(1) * 255) << 8) | + (int)(pArray->GetNumberAt(2) * 255); +} +FX_FLOAT CPDF_StructElement::GetNumber(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + FX_FLOAT default_value, + bool bInheritable, + int subindex) { + CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex); + return ToNumber(pAttr) ? pAttr->GetNumber() : default_value; +} +int CPDF_StructElement::GetInteger(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + int default_value, + bool bInheritable, + int subindex) { + CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex); + return ToNumber(pAttr) ? pAttr->GetInteger() : default_value; +} diff --git a/modules/pdfium/pdfium/core/fpdfdoc/fpdf_tagged.h b/modules/pdfium/pdfium/core/fpdfdoc/fpdf_tagged.h new file mode 100644 index 000000000000..fbbb49f85680 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/fpdf_tagged.h @@ -0,0 +1,75 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_FPDF_TAGGED_H_ +#define CORE_FPDFDOC_FPDF_TAGGED_H_ + +#include + +#include "core/fxge/fx_dib.h" + +class CPDF_Dictionary; +class CPDF_Document; +class IPDF_StructElement; + +class IPDF_StructTree { + public: + static std::unique_ptr LoadPage( + const CPDF_Document* pDoc, + const CPDF_Dictionary* pPageDict); + + + virtual int CountTopElements() const = 0; + virtual IPDF_StructElement* GetTopElement(int i) const = 0; + + protected: + friend std::default_delete; + virtual ~IPDF_StructTree() {} +}; + +class IPDF_StructElement { + public: + virtual IPDF_StructTree* GetTree() const = 0; + virtual const CFX_ByteString& GetType() const = 0; + virtual IPDF_StructElement* GetParent() const = 0; + virtual CPDF_Dictionary* GetDict() const = 0; + virtual int CountKids() const = 0; + virtual IPDF_StructElement* GetKidIfElement(int index) const = 0; + + virtual CPDF_Object* GetAttr(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + bool bInheritable = false, + FX_FLOAT fLevel = 0.0F) = 0; + + virtual CFX_ByteString GetName(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + const CFX_ByteStringC& default_value, + bool bInheritable = false, + int subindex = -1) = 0; + + virtual FX_ARGB GetColor(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + FX_ARGB default_value, + bool bInheritable = false, + int subindex = -1) = 0; + + virtual FX_FLOAT GetNumber(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + FX_FLOAT default_value, + bool bInheritable = false, + int subindex = -1) = 0; + + virtual int GetInteger(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + int default_value, + bool bInheritable = false, + int subindex = -1) = 0; + + protected: + virtual ~IPDF_StructElement() {} +}; + +#endif // CORE_FPDFDOC_FPDF_TAGGED_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/ipdf_formnotify.h b/modules/pdfium/pdfium/core/fpdfdoc/ipdf_formnotify.h new file mode 100644 index 000000000000..bf6127dce29a --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/ipdf_formnotify.h @@ -0,0 +1,32 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_IPDF_FORMNOTIFY_H_ +#define CORE_FPDFDOC_IPDF_FORMNOTIFY_H_ + +#include "core/fxcrt/fx_string.h" + +class CPDF_FormField; +class CPDF_InterForm; + +class IPDF_FormNotify { + public: + virtual ~IPDF_FormNotify() {} + + virtual int BeforeValueChange(CPDF_FormField* pField, + const CFX_WideString& csValue) = 0; + virtual void AfterValueChange(CPDF_FormField* pField) = 0; + virtual int BeforeSelectionChange(CPDF_FormField* pField, + const CFX_WideString& csValue) = 0; + virtual void AfterSelectionChange(CPDF_FormField* pField) = 0; + virtual void AfterCheckedStatusChange(CPDF_FormField* pField) = 0; + virtual int BeforeFormReset(CPDF_InterForm* pForm) = 0; + virtual void AfterFormReset(CPDF_InterForm* pForm) = 0; + virtual int BeforeFormImportData(CPDF_InterForm* pForm) = 0; + virtual void AfterFormImportData(CPDF_InterForm* pForm) = 0; +}; + +#endif // CORE_FPDFDOC_IPDF_FORMNOTIFY_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/ipvt_fontmap.h b/modules/pdfium/pdfium/core/fpdfdoc/ipvt_fontmap.h new file mode 100644 index 000000000000..740cb19eb8c9 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/ipvt_fontmap.h @@ -0,0 +1,29 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_IPVT_FONTMAP_H_ +#define CORE_FPDFDOC_IPVT_FONTMAP_H_ + +#include + +#include "core/fxcrt/fx_string.h" + +class CPDF_Font; + +class IPVT_FontMap { + public: + virtual ~IPVT_FontMap() {} + + virtual CPDF_Font* GetPDFFont(int32_t nFontIndex) = 0; + virtual CFX_ByteString GetPDFFontAlias(int32_t nFontIndex) = 0; + virtual int32_t GetWordFontIndex(uint16_t word, + int32_t charset, + int32_t nFontIndex) = 0; + virtual int32_t CharCodeFromUnicode(int32_t nFontIndex, uint16_t word) = 0; + virtual int32_t CharSetFromUnicode(uint16_t word, int32_t nOldCharset) = 0; +}; + +#endif // CORE_FPDFDOC_IPVT_FONTMAP_H_ diff --git a/modules/pdfium/pdfium/core/fpdfdoc/tagged_int.h b/modules/pdfium/pdfium/core/fpdfdoc/tagged_int.h new file mode 100644 index 000000000000..ce246023dfc7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdfdoc/tagged_int.h @@ -0,0 +1,119 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFDOC_TAGGED_INT_H_ +#define CORE_FPDFDOC_TAGGED_INT_H_ + +#include +#include +#include + +#include "core/fpdfdoc/fpdf_tagged.h" +#include "core/fxcrt/cfx_retain_ptr.h" +#include "third_party/base/stl_util.h" + +class CPDF_StructElement; + +struct CPDF_StructKid { + CPDF_StructKid(); + CPDF_StructKid(const CPDF_StructKid& that); + ~CPDF_StructKid(); + + enum { Invalid, Element, PageContent, StreamContent, Object } m_Type; + + CFX_RetainPtr m_pElement; // For Element. + CPDF_Dictionary* m_pDict; // For Element. + uint32_t m_PageObjNum; // For PageContent, StreamContent, Object. + uint32_t m_RefObjNum; // For StreamContent, Object. + uint32_t m_ContentId; // For PageContent, StreamContent. +}; + +class CPDF_StructTree final : public IPDF_StructTree { + public: + explicit CPDF_StructTree(const CPDF_Document* pDoc); + ~CPDF_StructTree() override; + + // IPDF_StructTree: + int CountTopElements() const override; + IPDF_StructElement* GetTopElement(int i) const override; + + void LoadPageTree(const CPDF_Dictionary* pPageDict); + CFX_RetainPtr AddPageNode( + CPDF_Dictionary* pElement, + std::map>* map, + int nLevel = 0); + bool AddTopLevelNode(CPDF_Dictionary* pDict, + const CFX_RetainPtr& pElement); + + protected: + const CPDF_Dictionary* const m_pTreeRoot; + const CPDF_Dictionary* const m_pRoleMap; + const CPDF_Dictionary* m_pPage; + std::vector> m_Kids; + + friend class CPDF_StructElement; +}; + +class CPDF_StructElement final : public CFX_Retainable, + public IPDF_StructElement { + public: + template + friend CFX_RetainPtr pdfium::MakeRetain(Args&&... args); + + // IPDF_StructElement + IPDF_StructTree* GetTree() const override; + const CFX_ByteString& GetType() const override; + IPDF_StructElement* GetParent() const override; + CPDF_Dictionary* GetDict() const override; + int CountKids() const override; + IPDF_StructElement* GetKidIfElement(int index) const override; + CPDF_Object* GetAttr(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + bool bInheritable = false, + FX_FLOAT fLevel = 0.0F) override; + CFX_ByteString GetName(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + const CFX_ByteStringC& default_value, + bool bInheritable = false, + int subindex = -1) override; + FX_ARGB GetColor(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + FX_ARGB default_value, + bool bInheritable = false, + int subindex = -1) override; + FX_FLOAT GetNumber(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + FX_FLOAT default_value, + bool bInheritable = false, + int subindex = -1) override; + int GetInteger(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + int default_value, + bool bInheritable = false, + int subindex = -1) override; + + std::vector* GetKids() { return &m_Kids; } + void LoadKids(CPDF_Dictionary* pDict); + void LoadKid(uint32_t PageObjNum, CPDF_Object* pObj, CPDF_StructKid* pKid); + CPDF_Object* GetAttr(const CFX_ByteStringC& owner, + const CFX_ByteStringC& name, + bool bInheritable, + int subindex); + + private: + CPDF_StructElement(CPDF_StructTree* pTree, + CPDF_StructElement* pParent, + CPDF_Dictionary* pDict); + ~CPDF_StructElement() override; + + CPDF_StructTree* const m_pTree; + CPDF_StructElement* const m_pParent; + CPDF_Dictionary* const m_pDict; + CFX_ByteString m_Type; + std::vector m_Kids; +}; + +#endif // CORE_FPDFDOC_TAGGED_INT_H_ diff --git a/modules/pdfium/pdfium/core/fpdftext/cpdf_linkextract.cpp b/modules/pdfium/pdfium/core/fpdftext/cpdf_linkextract.cpp new file mode 100644 index 000000000000..a1fc93e158cb --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdftext/cpdf_linkextract.cpp @@ -0,0 +1,173 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdftext/cpdf_linkextract.h" + +#include + +#include "core/fpdftext/cpdf_textpage.h" +#include "core/fxcrt/fx_ext.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +CPDF_LinkExtract::CPDF_LinkExtract(const CPDF_TextPage* pTextPage) + : m_pTextPage(pTextPage) {} + +CPDF_LinkExtract::~CPDF_LinkExtract() {} + +void CPDF_LinkExtract::ExtractLinks() { + m_LinkArray.clear(); + if (!m_pTextPage->IsParsed()) + return; + + m_strPageText = m_pTextPage->GetPageText(0, -1); + if (m_strPageText.IsEmpty()) + return; + + ParseLink(); +} + +void CPDF_LinkExtract::ParseLink() { + int start = 0, pos = 0; + int TotalChar = m_pTextPage->CountChars(); + while (pos < TotalChar) { + FPDF_CHAR_INFO pageChar; + m_pTextPage->GetCharInfo(pos, &pageChar); + if (pageChar.m_Flag == FPDFTEXT_CHAR_GENERATED || + pageChar.m_Unicode == 0x20 || pos == TotalChar - 1) { + int nCount = pos - start; + if (pos == TotalChar - 1) + nCount++; + CFX_WideString strBeCheck; + strBeCheck = m_pTextPage->GetPageText(start, nCount); + if (strBeCheck.GetLength() > 5) { + while (strBeCheck.GetLength() > 0) { + FX_WCHAR ch = strBeCheck.GetAt(strBeCheck.GetLength() - 1); + if (ch == L')' || ch == L',' || ch == L'>' || ch == L'.') { + strBeCheck = strBeCheck.Mid(0, strBeCheck.GetLength() - 1); + nCount--; + } else { + break; + } + } + if (nCount > 5 && + (CheckWebLink(strBeCheck) || CheckMailLink(strBeCheck))) { + m_LinkArray.push_back({start, nCount, strBeCheck}); + } + } + start = ++pos; + } else { + pos++; + } + } +} + +bool CPDF_LinkExtract::CheckWebLink(CFX_WideString& strBeCheck) { + CFX_WideString str = strBeCheck; + str.MakeLower(); + if (str.Find(L"http://www.") != -1) { + strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"http://www.")); + return true; + } + if (str.Find(L"http://") != -1) { + strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"http://")); + return true; + } + if (str.Find(L"https://www.") != -1) { + strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"https://www.")); + return true; + } + if (str.Find(L"https://") != -1) { + strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"https://")); + return true; + } + if (str.Find(L"www.") != -1) { + strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"www.")); + strBeCheck = L"http://" + strBeCheck; + return true; + } + return false; +} + +bool CPDF_LinkExtract::CheckMailLink(CFX_WideString& str) { + int aPos = str.Find(L'@'); + // Invalid when no '@'. + if (aPos < 1) + return false; + + // Check the local part. + int pPos = aPos; // Used to track the position of '@' or '.'. + for (int i = aPos - 1; i >= 0; i--) { + FX_WCHAR ch = str.GetAt(i); + if (ch == L'_' || ch == L'-' || FXSYS_iswalnum(ch)) + continue; + + if (ch != L'.' || i == pPos - 1 || i == 0) { + if (i == aPos - 1) { + // There is '.' or invalid char before '@'. + return false; + } + // End extracting for other invalid chars, '.' at the beginning, or + // consecutive '.'. + int removed_len = i == pPos - 1 ? i + 2 : i + 1; + str = str.Right(str.GetLength() - removed_len); + break; + } + // Found a valid '.'. + pPos = i; + } + + // Check the domain name part. + aPos = str.Find(L'@'); + if (aPos < 1) + return false; + + str.TrimRight(L'.'); + // At least one '.' in domain name, but not at the beginning. + // TODO(weili): RFC5322 allows domain names to be a local name without '.'. + // Check whether we should remove this check. + int ePos = str.Find(L'.', aPos + 1); + if (ePos == -1 || ePos == aPos + 1) + return false; + + // Validate all other chars in domain name. + int nLen = str.GetLength(); + pPos = 0; // Used to track the position of '.'. + for (int i = aPos + 1; i < nLen; i++) { + FX_WCHAR wch = str.GetAt(i); + if (wch == L'-' || FXSYS_iswalnum(wch)) + continue; + + if (wch != L'.' || i == pPos + 1) { + // Domain name should end before invalid char. + int host_end = i == pPos + 1 ? i - 2 : i - 1; + if (pPos > 0 && host_end - aPos >= 3) { + // Trim the ending invalid chars if there is at least one '.' and name. + str = str.Left(host_end + 1); + break; + } + return false; + } + pPos = i; + } + + if (str.Find(L"mailto:") == -1) + str = L"mailto:" + str; + + return true; +} + +CFX_WideString CPDF_LinkExtract::GetURL(size_t index) const { + return index < m_LinkArray.size() ? m_LinkArray[index].m_strUrl : L""; +} + +std::vector CPDF_LinkExtract::GetRects(size_t index) const { + if (index >= m_LinkArray.size()) + return std::vector(); + + return m_pTextPage->GetRectArray(m_LinkArray[index].m_Start, + m_LinkArray[index].m_Count); +} diff --git a/modules/pdfium/pdfium/core/fpdftext/cpdf_linkextract.h b/modules/pdfium/pdfium/core/fpdftext/cpdf_linkextract.h new file mode 100644 index 000000000000..43306cf87ad8 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdftext/cpdf_linkextract.h @@ -0,0 +1,46 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFTEXT_CPDF_LINKEXTRACT_H_ +#define CORE_FPDFTEXT_CPDF_LINKEXTRACT_H_ + +#include + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_TextPage; + +class CPDF_LinkExtract { + public: + explicit CPDF_LinkExtract(const CPDF_TextPage* pTextPage); + ~CPDF_LinkExtract(); + + void ExtractLinks(); + size_t CountLinks() const { return m_LinkArray.size(); } + CFX_WideString GetURL(size_t index) const; + std::vector GetRects(size_t index) const; + + protected: + void ParseLink(); + bool CheckWebLink(CFX_WideString& str); + bool CheckMailLink(CFX_WideString& str); + + private: + struct Link { + int m_Start; + int m_Count; + CFX_WideString m_strUrl; + }; + + const CPDF_TextPage* const m_pTextPage; + CFX_WideString m_strPageText; + std::vector m_LinkArray; +}; + +#endif // CORE_FPDFTEXT_CPDF_LINKEXTRACT_H_ diff --git a/modules/pdfium/pdfium/core/fpdftext/cpdf_textpage.cpp b/modules/pdfium/pdfium/core/fpdftext/cpdf_textpage.cpp new file mode 100644 index 000000000000..73a1a7e88e40 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdftext/cpdf_textpage.cpp @@ -0,0 +1,1523 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdftext/cpdf_textpage.h" + +#include +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/page/cpdf_form.h" +#include "core/fpdfapi/page/cpdf_formobject.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/cpdf_textobject.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdftext/unicodenormalizationdata.h" +#include "core/fxcrt/fx_bidi.h" +#include "core/fxcrt/fx_ext.h" +#include "core/fxcrt/fx_ucd.h" +#include "third_party/base/stl_util.h" + +namespace { + +const FX_FLOAT kDefaultFontSize = 1.0f; +const uint16_t* const g_UnicodeData_Normalization_Maps[5] = { + nullptr, g_UnicodeData_Normalization_Map1, g_UnicodeData_Normalization_Map2, + g_UnicodeData_Normalization_Map3, g_UnicodeData_Normalization_Map4}; + +FX_FLOAT NormalizeThreshold(FX_FLOAT threshold) { + if (threshold < 300) + return threshold / 2.0f; + if (threshold < 500) + return threshold / 4.0f; + if (threshold < 700) + return threshold / 5.0f; + return threshold / 6.0f; +} + +FX_FLOAT CalculateBaseSpace(const CPDF_TextObject* pTextObj, + const CFX_Matrix& matrix) { + FX_FLOAT baseSpace = 0.0; + const int nItems = pTextObj->CountItems(); + if (pTextObj->m_TextState.GetCharSpace() && nItems >= 3) { + bool bAllChar = true; + FX_FLOAT spacing = + matrix.TransformDistance(pTextObj->m_TextState.GetCharSpace()); + baseSpace = spacing; + for (int i = 0; i < nItems; i++) { + CPDF_TextObjectItem item; + pTextObj->GetItemInfo(i, &item); + if (item.m_CharCode == static_cast(-1)) { + FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH(); + FX_FLOAT kerning = -fontsize_h * item.m_Origin.x / 1000; + baseSpace = std::min(baseSpace, kerning + spacing); + bAllChar = false; + } + } + if (baseSpace < 0.0 || (nItems == 3 && !bAllChar)) + baseSpace = 0.0; + } + return baseSpace; +} + +FX_STRSIZE Unicode_GetNormalization(FX_WCHAR wch, FX_WCHAR* pDst) { + wch = wch & 0xFFFF; + FX_WCHAR wFind = g_UnicodeData_Normalization[wch]; + if (!wFind) { + if (pDst) + *pDst = wch; + return 1; + } + if (wFind >= 0x8000) { + wch = wFind - 0x8000; + wFind = 1; + } else { + wch = wFind & 0x0FFF; + wFind >>= 12; + } + const uint16_t* pMap = g_UnicodeData_Normalization_Maps[wFind]; + if (pMap == g_UnicodeData_Normalization_Map4) { + pMap = g_UnicodeData_Normalization_Map4 + wch; + wFind = (FX_WCHAR)(*pMap++); + } else { + pMap += wch; + } + if (pDst) { + FX_WCHAR n = wFind; + while (n--) + *pDst++ = *pMap++; + } + return (FX_STRSIZE)wFind; +} + +float MaskPercentFilled(const std::vector& mask, + int32_t start, + int32_t end) { + if (start >= end) + return 0; + float count = std::count_if(mask.begin() + start, mask.begin() + end, + [](bool r) { return r; }); + return count / (end - start); +} + +} // namespace + +FPDF_CHAR_INFO::FPDF_CHAR_INFO() + : m_Unicode(0), + m_Charcode(0), + m_Flag(0), + m_FontSize(0), + m_pTextObj(nullptr) {} + +FPDF_CHAR_INFO::~FPDF_CHAR_INFO() {} + +PAGECHAR_INFO::PAGECHAR_INFO() + : m_Index(0), m_CharCode(0), m_Unicode(0), m_Flag(0), m_pTextObj(nullptr) {} + +PAGECHAR_INFO::PAGECHAR_INFO(const PAGECHAR_INFO&) = default; + +PAGECHAR_INFO::~PAGECHAR_INFO() {} + +CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, FPDFText_Direction flags) + : m_pPage(pPage), + m_parserflag(flags), + m_pPreTextObj(nullptr), + m_bIsParsed(false), + m_TextlineDir(TextOrientation::Unknown) { + m_TextBuf.EstimateSize(0, 10240); + m_DisplayMatrix = + pPage->GetDisplayMatrix(0, 0, static_cast(pPage->GetPageWidth()), + static_cast(pPage->GetPageHeight()), 0); +} + +CPDF_TextPage::~CPDF_TextPage() {} + +bool CPDF_TextPage::IsControlChar(const PAGECHAR_INFO& charInfo) { + switch (charInfo.m_Unicode) { + case 0x2: + case 0x3: + case 0x93: + case 0x94: + case 0x96: + case 0x97: + case 0x98: + case 0xfffe: + return charInfo.m_Flag != FPDFTEXT_CHAR_HYPHEN; + default: + return false; + } +} + +void CPDF_TextPage::ParseTextPage() { + m_bIsParsed = false; + m_TextBuf.Clear(); + m_CharList.clear(); + m_pPreTextObj = nullptr; + ProcessObject(); + + m_bIsParsed = true; + m_CharIndex.clear(); + int nCount = pdfium::CollectionSize(m_CharList); + if (nCount) + m_CharIndex.push_back(0); + + for (int i = 0; i < nCount; i++) { + int indexSize = pdfium::CollectionSize(m_CharIndex); + const PAGECHAR_INFO& charinfo = m_CharList[i]; + if (charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED || + (charinfo.m_Unicode != 0 && !IsControlChar(charinfo))) { + if (indexSize % 2) { + m_CharIndex.push_back(1); + } else { + if (indexSize <= 0) + continue; + m_CharIndex[indexSize - 1] += 1; + } + } else { + if (indexSize % 2) { + if (indexSize <= 0) + continue; + m_CharIndex[indexSize - 1] = i + 1; + } else { + m_CharIndex.push_back(i + 1); + } + } + } + int indexSize = pdfium::CollectionSize(m_CharIndex); + if (indexSize % 2) + m_CharIndex.erase(m_CharIndex.begin() + indexSize - 1); +} + +int CPDF_TextPage::CountChars() const { + return pdfium::CollectionSize(m_CharList); +} + +int CPDF_TextPage::CharIndexFromTextIndex(int TextIndex) const { + int indexSize = pdfium::CollectionSize(m_CharIndex); + int count = 0; + for (int i = 0; i < indexSize; i += 2) { + count += m_CharIndex[i + 1]; + if (count > TextIndex) + return TextIndex - count + m_CharIndex[i + 1] + m_CharIndex[i]; + } + return -1; +} + +int CPDF_TextPage::TextIndexFromCharIndex(int CharIndex) const { + int indexSize = pdfium::CollectionSize(m_CharIndex); + int count = 0; + for (int i = 0; i < indexSize; i += 2) { + count += m_CharIndex[i + 1]; + if (m_CharIndex[i + 1] + m_CharIndex[i] > CharIndex) { + if (CharIndex - m_CharIndex[i] < 0) + return -1; + + return CharIndex - m_CharIndex[i] + count - m_CharIndex[i + 1]; + } + } + return -1; +} + +std::vector CPDF_TextPage::GetRectArray(int start, + int nCount) const { + if (start < 0 || nCount == 0 || !m_bIsParsed) + return std::vector(); + + if (nCount + start > pdfium::CollectionSize(m_CharList) || + nCount == -1) { + nCount = pdfium::CollectionSize(m_CharList) - start; + } + + std::vector rectArray; + CPDF_TextObject* pCurObj = nullptr; + CFX_FloatRect rect; + int curPos = start; + bool bFlagNewRect = true; + while (nCount--) { + PAGECHAR_INFO info_curchar = m_CharList[curPos++]; + if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) + continue; + if (info_curchar.m_CharBox.Width() < 0.01 || + info_curchar.m_CharBox.Height() < 0.01) { + continue; + } + if (!pCurObj) + pCurObj = info_curchar.m_pTextObj; + if (pCurObj != info_curchar.m_pTextObj) { + rectArray.push_back(rect); + pCurObj = info_curchar.m_pTextObj; + bFlagNewRect = true; + } + if (bFlagNewRect) { + CFX_Matrix matrix = info_curchar.m_pTextObj->GetTextMatrix(); + matrix.Concat(info_curchar.m_Matrix); + + CFX_Matrix matrix_reverse; + matrix_reverse.SetReverse(matrix); + + CFX_PointF origin = matrix_reverse.Transform(info_curchar.m_Origin); + rect.left = info_curchar.m_CharBox.left; + rect.right = info_curchar.m_CharBox.right; + if (pCurObj->GetFont()->GetTypeDescent()) { + rect.bottom = origin.y + + pCurObj->GetFont()->GetTypeDescent() * + pCurObj->GetFontSize() / 1000; + + rect.bottom = matrix.Transform(CFX_PointF(origin.x, rect.bottom)).y; + } else { + rect.bottom = info_curchar.m_CharBox.bottom; + } + if (pCurObj->GetFont()->GetTypeAscent()) { + rect.top = + origin.y + + pCurObj->GetFont()->GetTypeAscent() * pCurObj->GetFontSize() / 1000; + FX_FLOAT xPosTemp = + origin.x + + GetCharWidth(info_curchar.m_CharCode, pCurObj->GetFont()) * + pCurObj->GetFontSize() / 1000; + rect.top = matrix.Transform(CFX_PointF(xPosTemp, rect.top)).y; + } else { + rect.top = info_curchar.m_CharBox.top; + } + bFlagNewRect = false; + rect = info_curchar.m_CharBox; + rect.Normalize(); + } else { + info_curchar.m_CharBox.Normalize(); + rect.left = std::min(rect.left, info_curchar.m_CharBox.left); + rect.right = std::max(rect.right, info_curchar.m_CharBox.right); + rect.top = std::max(rect.top, info_curchar.m_CharBox.top); + rect.bottom = std::min(rect.bottom, info_curchar.m_CharBox.bottom); + } + } + rectArray.push_back(rect); + return rectArray; +} + +int CPDF_TextPage::GetIndexAtPos(const CFX_PointF& point, + const CFX_SizeF& tolerance) const { + if (!m_bIsParsed) + return -3; + + int pos = 0; + int NearPos = -1; + double xdif = 5000; + double ydif = 5000; + while (pos < pdfium::CollectionSize(m_CharList)) { + PAGECHAR_INFO charinfo = m_CharList[pos]; + CFX_FloatRect charrect = charinfo.m_CharBox; + if (charrect.Contains(point)) + break; + if (tolerance.width > 0 || tolerance.height > 0) { + CFX_FloatRect charRectExt; + charrect.Normalize(); + charRectExt.left = charrect.left - tolerance.width / 2; + charRectExt.right = charrect.right + tolerance.width / 2; + charRectExt.top = charrect.top + tolerance.height / 2; + charRectExt.bottom = charrect.bottom - tolerance.height / 2; + if (charRectExt.Contains(point)) { + double curXdif, curYdif; + curXdif = FXSYS_fabs(point.x - charrect.left) < + FXSYS_fabs(point.x - charrect.right) + ? FXSYS_fabs(point.x - charrect.left) + : FXSYS_fabs(point.x - charrect.right); + curYdif = FXSYS_fabs(point.y - charrect.bottom) < + FXSYS_fabs(point.y - charrect.top) + ? FXSYS_fabs(point.y - charrect.bottom) + : FXSYS_fabs(point.y - charrect.top); + if (curYdif + curXdif < xdif + ydif) { + ydif = curYdif; + xdif = curXdif; + NearPos = pos; + } + } + } + ++pos; + } + return pos < pdfium::CollectionSize(m_CharList) ? pos : NearPos; +} + +CFX_WideString CPDF_TextPage::GetTextByRect(const CFX_FloatRect& rect) const { + if (!m_bIsParsed) + return CFX_WideString(); + + FX_FLOAT posy = 0; + bool IsContainPreChar = false; + bool IsAddLineFeed = false; + CFX_WideString strText; + for (const auto& charinfo : m_CharList) { + if (IsRectIntersect(rect, charinfo.m_CharBox)) { + if (FXSYS_fabs(posy - charinfo.m_Origin.y) > 0 && !IsContainPreChar && + IsAddLineFeed) { + posy = charinfo.m_Origin.y; + if (!strText.IsEmpty()) + strText += L"\r\n"; + } + IsContainPreChar = true; + IsAddLineFeed = false; + if (charinfo.m_Unicode) + strText += charinfo.m_Unicode; + } else if (charinfo.m_Unicode == 32) { + if (IsContainPreChar && charinfo.m_Unicode) { + strText += charinfo.m_Unicode; + IsContainPreChar = false; + IsAddLineFeed = false; + } + } else { + IsContainPreChar = false; + IsAddLineFeed = true; + } + } + return strText; +} + +void CPDF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO* info) const { + if (!m_bIsParsed) + return; + + if (index < 0 || index >= pdfium::CollectionSize(m_CharList)) + return; + + const PAGECHAR_INFO& charinfo = m_CharList[index]; + info->m_Charcode = charinfo.m_CharCode; + info->m_Origin = charinfo.m_Origin; + info->m_Unicode = charinfo.m_Unicode; + info->m_Flag = charinfo.m_Flag; + info->m_CharBox = charinfo.m_CharBox; + info->m_pTextObj = charinfo.m_pTextObj; + if (charinfo.m_pTextObj && charinfo.m_pTextObj->GetFont()) + info->m_FontSize = charinfo.m_pTextObj->GetFontSize(); + else + info->m_FontSize = kDefaultFontSize; + info->m_Matrix = charinfo.m_Matrix; +} + +void CPDF_TextPage::CheckMarkedContentObject(int32_t& start, + int32_t& nCount) const { + PAGECHAR_INFO charinfo = m_CharList[start]; + PAGECHAR_INFO charinfo2 = m_CharList[start + nCount - 1]; + if (FPDFTEXT_CHAR_PIECE != charinfo.m_Flag && + FPDFTEXT_CHAR_PIECE != charinfo2.m_Flag) { + return; + } + if (FPDFTEXT_CHAR_PIECE == charinfo.m_Flag) { + PAGECHAR_INFO charinfo1 = charinfo; + int startIndex = start; + while (FPDFTEXT_CHAR_PIECE == charinfo1.m_Flag && + charinfo1.m_Index == charinfo.m_Index) { + startIndex--; + if (startIndex < 0) + break; + charinfo1 = m_CharList[startIndex]; + } + startIndex++; + start = startIndex; + } + if (FPDFTEXT_CHAR_PIECE == charinfo2.m_Flag) { + PAGECHAR_INFO charinfo3 = charinfo2; + int endIndex = start + nCount - 1; + while (FPDFTEXT_CHAR_PIECE == charinfo3.m_Flag && + charinfo3.m_Index == charinfo2.m_Index) { + endIndex++; + if (endIndex >= pdfium::CollectionSize(m_CharList)) + break; + charinfo3 = m_CharList[endIndex]; + } + endIndex--; + nCount = endIndex - start + 1; + } +} + +CFX_WideString CPDF_TextPage::GetPageText(int start, int nCount) const { + if (!m_bIsParsed || nCount == 0) + return L""; + + if (start < 0) + start = 0; + + if (nCount == -1) { + nCount = pdfium::CollectionSize(m_CharList) - start; + return CFX_WideString( + m_TextBuf.AsStringC().Mid(start, m_TextBuf.AsStringC().GetLength())); + } + if (nCount <= 0 || m_CharList.empty()) + return L""; + if (nCount + start > pdfium::CollectionSize(m_CharList) - 1) + nCount = pdfium::CollectionSize(m_CharList) - start; + if (nCount <= 0) + return L""; + CheckMarkedContentObject(start, nCount); + int startindex = 0; + PAGECHAR_INFO charinfo = m_CharList[start]; + int startOffset = 0; + while (charinfo.m_Index == -1) { + startOffset++; + if (startOffset > nCount || + start + startOffset >= pdfium::CollectionSize(m_CharList)) { + return L""; + } + charinfo = m_CharList[start + startOffset]; + } + startindex = charinfo.m_Index; + charinfo = m_CharList[start + nCount - 1]; + int nCountOffset = 0; + while (charinfo.m_Index == -1) { + nCountOffset++; + if (nCountOffset >= nCount) + return L""; + charinfo = m_CharList[start + nCount - nCountOffset - 1]; + } + nCount = start + nCount - nCountOffset - startindex; + if (nCount <= 0) + return L""; + return CFX_WideString(m_TextBuf.AsStringC().Mid(startindex, nCount)); +} + +int CPDF_TextPage::CountRects(int start, int nCount) { + if (!m_bIsParsed || start < 0) + return -1; + + if (nCount == -1 || + nCount + start > pdfium::CollectionSize(m_CharList)) { + nCount = pdfium::CollectionSize(m_CharList) - start; + } + m_SelRects = GetRectArray(start, nCount); + return pdfium::CollectionSize(m_SelRects); +} + +void CPDF_TextPage::GetRect(int rectIndex, + FX_FLOAT& left, + FX_FLOAT& top, + FX_FLOAT& right, + FX_FLOAT& bottom) const { + if (!m_bIsParsed) + return; + + if (rectIndex < 0 || rectIndex >= pdfium::CollectionSize(m_SelRects)) + return; + + left = m_SelRects[rectIndex].left; + top = m_SelRects[rectIndex].top; + right = m_SelRects[rectIndex].right; + bottom = m_SelRects[rectIndex].bottom; +} + +CPDF_TextPage::TextOrientation CPDF_TextPage::FindTextlineFlowOrientation() + const { + if (m_pPage->GetPageObjectList()->empty()) + return TextOrientation::Unknown; + + const int32_t nPageWidth = static_cast(m_pPage->GetPageWidth()); + const int32_t nPageHeight = static_cast(m_pPage->GetPageHeight()); + if (nPageWidth <= 0 || nPageHeight <= 0) + return TextOrientation::Unknown; + + std::vector nHorizontalMask(nPageWidth); + std::vector nVerticalMask(nPageHeight); + FX_FLOAT fLineHeight = 0.0f; + int32_t nStartH = nPageWidth; + int32_t nEndH = 0; + int32_t nStartV = nPageHeight; + int32_t nEndV = 0; + for (const auto& pPageObj : *m_pPage->GetPageObjectList()) { + if (!pPageObj->IsText()) + continue; + + int32_t minH = std::max(static_cast(pPageObj->m_Left), 0); + int32_t maxH = + std::min(static_cast(pPageObj->m_Right), nPageWidth); + int32_t minV = std::max(static_cast(pPageObj->m_Bottom), 0); + int32_t maxV = std::min(static_cast(pPageObj->m_Top), nPageHeight); + if (minH >= maxH || minV >= maxV) + continue; + + for (int32_t i = minH; i < maxH; ++i) + nHorizontalMask[i] = true; + for (int32_t i = minV; i < maxV; ++i) + nVerticalMask[i] = true; + + nStartH = std::min(nStartH, minH); + nEndH = std::max(nEndH, maxH); + nStartV = std::min(nStartV, minV); + nEndV = std::max(nEndV, maxV); + + if (fLineHeight <= 0.0f) + fLineHeight = pPageObj->m_Top - pPageObj->m_Bottom; + } + const int32_t nDoubleLineHeight = 2 * fLineHeight; + if ((nEndV - nStartV) < nDoubleLineHeight) + return TextOrientation::Horizontal; + if ((nEndH - nStartH) < nDoubleLineHeight) + return TextOrientation::Vertical; + + const FX_FLOAT nSumH = MaskPercentFilled(nHorizontalMask, nStartH, nEndH); + if (nSumH > 0.8f) + return TextOrientation::Horizontal; + + const FX_FLOAT nSumV = MaskPercentFilled(nVerticalMask, nStartV, nEndV); + if (nSumH > nSumV) + return TextOrientation::Horizontal; + if (nSumH < nSumV) + return TextOrientation::Vertical; + return TextOrientation::Unknown; +} + +void CPDF_TextPage::AppendGeneratedCharacter(FX_WCHAR unicode, + const CFX_Matrix& formMatrix) { + PAGECHAR_INFO generateChar; + if (!GenerateCharInfo(unicode, generateChar)) + return; + + m_TextBuf.AppendChar(unicode); + if (!formMatrix.IsIdentity()) + generateChar.m_Matrix = formMatrix; + m_CharList.push_back(generateChar); +} + +void CPDF_TextPage::ProcessObject() { + if (m_pPage->GetPageObjectList()->empty()) + return; + + m_TextlineDir = FindTextlineFlowOrientation(); + const CPDF_PageObjectList* pObjList = m_pPage->GetPageObjectList(); + for (auto it = pObjList->begin(); it != pObjList->end(); ++it) { + if (CPDF_PageObject* pObj = it->get()) { + if (pObj->IsText()) { + CFX_Matrix matrix; + ProcessTextObject(pObj->AsText(), matrix, pObjList, it); + } else if (pObj->IsForm()) { + CFX_Matrix formMatrix(1, 0, 0, 1, 0, 0); + ProcessFormObject(pObj->AsForm(), formMatrix); + } + } + } + for (const auto& obj : m_LineObj) + ProcessTextObject(obj); + + m_LineObj.clear(); + CloseTempLine(); +} + +void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj, + const CFX_Matrix& formMatrix) { + CPDF_PageObjectList* pObjectList = pFormObj->m_pForm->GetPageObjectList(); + if (pObjectList->empty()) + return; + + CFX_Matrix curFormMatrix; + curFormMatrix = pFormObj->m_FormMatrix; + curFormMatrix.Concat(formMatrix); + + for (auto it = pObjectList->begin(); it != pObjectList->end(); ++it) { + if (CPDF_PageObject* pPageObj = it->get()) { + if (pPageObj->IsText()) + ProcessTextObject(pPageObj->AsText(), curFormMatrix, pObjectList, it); + else if (pPageObj->IsForm()) + ProcessFormObject(pPageObj->AsForm(), curFormMatrix); + } + } +} + +int CPDF_TextPage::GetCharWidth(uint32_t charCode, CPDF_Font* pFont) const { + if (charCode == CPDF_Font::kInvalidCharCode) + return 0; + + if (int w = pFont->GetCharWidthF(charCode)) + return w; + + CFX_ByteString str; + pFont->AppendChar(str, charCode); + if (int w = pFont->GetStringWidth(str.c_str(), 1)) + return w; + + return pFont->GetCharBBox(charCode).Width(); +} + +void CPDF_TextPage::AddCharInfoByLRDirection(FX_WCHAR wChar, + PAGECHAR_INFO info) { + if (IsControlChar(info)) { + info.m_Index = -1; + m_CharList.push_back(info); + return; + } + + info.m_Index = m_TextBuf.GetLength(); + if (wChar >= 0xFB00 && wChar <= 0xFB06) { + FX_WCHAR* pDst = nullptr; + FX_STRSIZE nCount = Unicode_GetNormalization(wChar, pDst); + if (nCount >= 1) { + pDst = FX_Alloc(FX_WCHAR, nCount); + Unicode_GetNormalization(wChar, pDst); + for (int nIndex = 0; nIndex < nCount; nIndex++) { + PAGECHAR_INFO info2 = info; + info2.m_Unicode = pDst[nIndex]; + info2.m_Flag = FPDFTEXT_CHAR_PIECE; + m_TextBuf.AppendChar(info2.m_Unicode); + m_CharList.push_back(info2); + } + FX_Free(pDst); + return; + } + } + m_TextBuf.AppendChar(wChar); + m_CharList.push_back(info); +} + +void CPDF_TextPage::AddCharInfoByRLDirection(FX_WCHAR wChar, + PAGECHAR_INFO info) { + if (IsControlChar(info)) { + info.m_Index = -1; + m_CharList.push_back(info); + return; + } + + info.m_Index = m_TextBuf.GetLength(); + wChar = FX_GetMirrorChar(wChar, true, false); + FX_WCHAR* pDst = nullptr; + FX_STRSIZE nCount = Unicode_GetNormalization(wChar, pDst); + if (nCount >= 1) { + pDst = FX_Alloc(FX_WCHAR, nCount); + Unicode_GetNormalization(wChar, pDst); + for (int nIndex = 0; nIndex < nCount; nIndex++) { + PAGECHAR_INFO info2 = info; + info2.m_Unicode = pDst[nIndex]; + info2.m_Flag = FPDFTEXT_CHAR_PIECE; + m_TextBuf.AppendChar(info2.m_Unicode); + m_CharList.push_back(info2); + } + FX_Free(pDst); + return; + } + info.m_Unicode = wChar; + m_TextBuf.AppendChar(info.m_Unicode); + m_CharList.push_back(info); +} + +void CPDF_TextPage::CloseTempLine() { + if (m_TempCharList.empty()) + return; + + CFX_WideString str = m_TempTextBuf.MakeString(); + bool bPrevSpace = false; + for (int i = 0; i < str.GetLength(); i++) { + if (str.GetAt(i) != ' ') { + bPrevSpace = false; + continue; + } + if (bPrevSpace) { + m_TempTextBuf.Delete(i, 1); + m_TempCharList.erase(m_TempCharList.begin() + i); + str.Delete(i); + i--; + } + bPrevSpace = true; + } + CFX_BidiString bidi(str); + if (m_parserflag == FPDFText_Direction::Right) + bidi.SetOverallDirectionRight(); + CFX_BidiChar::Direction eCurrentDirection = bidi.OverallDirection(); + for (const auto& segment : bidi) { + if (segment.direction == CFX_BidiChar::RIGHT || + (segment.direction == CFX_BidiChar::NEUTRAL && + eCurrentDirection == CFX_BidiChar::RIGHT)) { + eCurrentDirection = CFX_BidiChar::RIGHT; + for (int m = segment.start + segment.count; m > segment.start; --m) + AddCharInfoByRLDirection(bidi.CharAt(m - 1), m_TempCharList[m - 1]); + } else { + eCurrentDirection = CFX_BidiChar::LEFT; + for (int m = segment.start; m < segment.start + segment.count; m++) + AddCharInfoByLRDirection(bidi.CharAt(m), m_TempCharList[m]); + } + } + m_TempCharList.clear(); + m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength()); +} + +void CPDF_TextPage::ProcessTextObject( + CPDF_TextObject* pTextObj, + const CFX_Matrix& formMatrix, + const CPDF_PageObjectList* pObjList, + CPDF_PageObjectList::const_iterator ObjPos) { + if (FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f) + return; + + size_t count = m_LineObj.size(); + PDFTEXT_Obj Obj; + Obj.m_pTextObj = pTextObj; + Obj.m_formMatrix = formMatrix; + if (count == 0) { + m_LineObj.push_back(Obj); + return; + } + if (IsSameAsPreTextObject(pTextObj, pObjList, ObjPos)) + return; + + PDFTEXT_Obj prev_Obj = m_LineObj[count - 1]; + CPDF_TextObjectItem item; + int nItem = prev_Obj.m_pTextObj->CountItems(); + prev_Obj.m_pTextObj->GetItemInfo(nItem - 1, &item); + FX_FLOAT prev_width = + GetCharWidth(item.m_CharCode, prev_Obj.m_pTextObj->GetFont()) * + prev_Obj.m_pTextObj->GetFontSize() / 1000; + + CFX_Matrix prev_matrix = prev_Obj.m_pTextObj->GetTextMatrix(); + prev_width = FXSYS_fabs(prev_width); + prev_matrix.Concat(prev_Obj.m_formMatrix); + prev_width = prev_matrix.TransformDistance(prev_width); + pTextObj->GetItemInfo(0, &item); + FX_FLOAT this_width = GetCharWidth(item.m_CharCode, pTextObj->GetFont()) * + pTextObj->GetFontSize() / 1000; + this_width = FXSYS_fabs(this_width); + + CFX_Matrix this_matrix = pTextObj->GetTextMatrix(); + this_width = FXSYS_fabs(this_width); + this_matrix.Concat(formMatrix); + this_width = this_matrix.TransformDistance(this_width); + + FX_FLOAT threshold = + prev_width > this_width ? prev_width / 4 : this_width / 4; + CFX_PointF prev_pos = m_DisplayMatrix.Transform( + prev_Obj.m_formMatrix.Transform(prev_Obj.m_pTextObj->GetPos())); + CFX_PointF this_pos = + m_DisplayMatrix.Transform(formMatrix.Transform(pTextObj->GetPos())); + if (FXSYS_fabs(this_pos.y - prev_pos.y) > threshold * 2) { + for (size_t i = 0; i < count; i++) + ProcessTextObject(m_LineObj[i]); + m_LineObj.clear(); + m_LineObj.push_back(Obj); + return; + } + + for (size_t i = count; i > 0; --i) { + PDFTEXT_Obj prev_text_obj = m_LineObj[i - 1]; + CFX_PointF new_prev_pos = + m_DisplayMatrix.Transform(prev_text_obj.m_formMatrix.Transform( + prev_text_obj.m_pTextObj->GetPos())); + if (this_pos.x >= new_prev_pos.x) { + m_LineObj.insert(m_LineObj.begin() + i, Obj); + return; + } + } + m_LineObj.insert(m_LineObj.begin(), Obj); +} + +FPDFText_MarkedContent CPDF_TextPage::PreMarkedContent(PDFTEXT_Obj Obj) { + CPDF_TextObject* pTextObj = Obj.m_pTextObj; + if (!pTextObj->m_ContentMark) + return FPDFText_MarkedContent::Pass; + + int nContentMark = pTextObj->m_ContentMark.CountItems(); + if (nContentMark < 1) + return FPDFText_MarkedContent::Pass; + + CFX_WideString actText; + bool bExist = false; + CPDF_Dictionary* pDict = nullptr; + int n = 0; + for (n = 0; n < nContentMark; n++) { + const CPDF_ContentMarkItem& item = pTextObj->m_ContentMark.GetItem(n); + pDict = item.GetParam(); + if (!pDict) + continue; + CPDF_String* temp = ToString(pDict->GetObjectFor("ActualText")); + if (temp) { + bExist = true; + actText = temp->GetUnicodeText(); + } + } + if (!bExist) + return FPDFText_MarkedContent::Pass; + + if (m_pPreTextObj && m_pPreTextObj->m_ContentMark && + m_pPreTextObj->m_ContentMark.CountItems() == n && + pDict == m_pPreTextObj->m_ContentMark.GetItem(n - 1).GetParam()) { + return FPDFText_MarkedContent::Done; + } + + FX_STRSIZE nItems = actText.GetLength(); + if (nItems < 1) + return FPDFText_MarkedContent::Pass; + + CPDF_Font* pFont = pTextObj->GetFont(); + bExist = false; + for (FX_STRSIZE i = 0; i < nItems; i++) { + if (pFont->CharCodeFromUnicode(actText.GetAt(i)) != + CPDF_Font::kInvalidCharCode) { + bExist = true; + break; + } + } + if (!bExist) + return FPDFText_MarkedContent::Pass; + + bExist = false; + for (FX_STRSIZE i = 0; i < nItems; i++) { + FX_WCHAR wChar = actText.GetAt(i); + if ((wChar > 0x80 && wChar < 0xFFFD) || (wChar <= 0x80 && isprint(wChar))) { + bExist = true; + break; + } + } + if (!bExist) + return FPDFText_MarkedContent::Done; + + return FPDFText_MarkedContent::Delay; +} + +void CPDF_TextPage::ProcessMarkedContent(PDFTEXT_Obj Obj) { + CPDF_TextObject* pTextObj = Obj.m_pTextObj; + if (!pTextObj->m_ContentMark) + return; + + int nContentMark = pTextObj->m_ContentMark.CountItems(); + if (nContentMark < 1) + return; + + CFX_WideString actText; + for (int n = 0; n < nContentMark; n++) { + const CPDF_ContentMarkItem& item = pTextObj->m_ContentMark.GetItem(n); + CPDF_Dictionary* pDict = item.GetParam(); + if (pDict) + actText = pDict->GetUnicodeTextFor("ActualText"); + } + FX_STRSIZE nItems = actText.GetLength(); + if (nItems < 1) + return; + + CPDF_Font* pFont = pTextObj->GetFont(); + CFX_Matrix matrix = pTextObj->GetTextMatrix(); + matrix.Concat(Obj.m_formMatrix); + + for (FX_STRSIZE k = 0; k < nItems; k++) { + FX_WCHAR wChar = actText.GetAt(k); + if (wChar <= 0x80 && !isprint(wChar)) + wChar = 0x20; + if (wChar >= 0xFFFD) + continue; + + PAGECHAR_INFO charinfo; + charinfo.m_Origin = pTextObj->GetPos(); + charinfo.m_Index = m_TextBuf.GetLength(); + charinfo.m_Unicode = wChar; + charinfo.m_CharCode = pFont->CharCodeFromUnicode(wChar); + charinfo.m_Flag = FPDFTEXT_CHAR_PIECE; + charinfo.m_pTextObj = pTextObj; + charinfo.m_CharBox = pTextObj->GetRect(); + charinfo.m_Matrix = matrix; + m_TempTextBuf.AppendChar(wChar); + m_TempCharList.push_back(charinfo); + } +} + +void CPDF_TextPage::FindPreviousTextObject() { + if (m_TempCharList.empty() && m_CharList.empty()) + return; + + PAGECHAR_INFO preChar = + m_TempCharList.empty() ? m_CharList.back() : m_TempCharList.back(); + + if (preChar.m_pTextObj) + m_pPreTextObj = preChar.m_pTextObj; +} + +void CPDF_TextPage::SwapTempTextBuf(int32_t iCharListStartAppend, + int32_t iBufStartAppend) { + int32_t i = iCharListStartAppend; + int32_t j = pdfium::CollectionSize(m_TempCharList) - 1; + for (; i < j; i++, j--) { + std::swap(m_TempCharList[i], m_TempCharList[j]); + std::swap(m_TempCharList[i].m_Index, m_TempCharList[j].m_Index); + } + FX_WCHAR* pTempBuffer = m_TempTextBuf.GetBuffer(); + i = iBufStartAppend; + j = m_TempTextBuf.GetLength() - 1; + for (; i < j; i++, j--) + std::swap(pTempBuffer[i], pTempBuffer[j]); +} + +bool CPDF_TextPage::IsRightToLeft(const CPDF_TextObject* pTextObj, + const CPDF_Font* pFont, + int nItems) const { + CFX_WideString str; + for (int32_t i = 0; i < nItems; i++) { + CPDF_TextObjectItem item; + pTextObj->GetItemInfo(i, &item); + if (item.m_CharCode == static_cast(-1)) + continue; + CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode); + FX_WCHAR wChar = wstrItem.GetAt(0); + if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) + wChar = (FX_WCHAR)item.m_CharCode; + if (wChar) + str += wChar; + } + return CFX_BidiString(str).OverallDirection() == CFX_BidiChar::RIGHT; +} + +void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { + CPDF_TextObject* pTextObj = Obj.m_pTextObj; + if (FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f) + return; + CFX_Matrix formMatrix = Obj.m_formMatrix; + CPDF_Font* pFont = pTextObj->GetFont(); + CFX_Matrix matrix = pTextObj->GetTextMatrix(); + matrix.Concat(formMatrix); + + FPDFText_MarkedContent ePreMKC = PreMarkedContent(Obj); + if (ePreMKC == FPDFText_MarkedContent::Done) { + m_pPreTextObj = pTextObj; + m_perMatrix = formMatrix; + return; + } + GenerateCharacter result = GenerateCharacter::None; + if (m_pPreTextObj) { + result = ProcessInsertObject(pTextObj, formMatrix); + if (result == GenerateCharacter::LineBreak) + m_CurlineRect = Obj.m_pTextObj->GetRect(); + else + m_CurlineRect.Union(Obj.m_pTextObj->GetRect()); + + switch (result) { + case GenerateCharacter::None: + break; + case GenerateCharacter::Space: { + PAGECHAR_INFO generateChar; + if (GenerateCharInfo(TEXT_SPACE_CHAR, generateChar)) { + if (!formMatrix.IsIdentity()) + generateChar.m_Matrix = formMatrix; + m_TempTextBuf.AppendChar(TEXT_SPACE_CHAR); + m_TempCharList.push_back(generateChar); + } + break; + } + case GenerateCharacter::LineBreak: + CloseTempLine(); + if (m_TextBuf.GetSize()) { + AppendGeneratedCharacter(TEXT_RETURN_CHAR, formMatrix); + AppendGeneratedCharacter(TEXT_LINEFEED_CHAR, formMatrix); + } + break; + case GenerateCharacter::Hyphen: + if (pTextObj->CountChars() == 1) { + CPDF_TextObjectItem item; + pTextObj->GetCharInfo(0, &item); + CFX_WideString wstrItem = + pTextObj->GetFont()->UnicodeFromCharCode(item.m_CharCode); + if (wstrItem.IsEmpty()) + wstrItem += (FX_WCHAR)item.m_CharCode; + FX_WCHAR curChar = wstrItem.GetAt(0); + if (curChar == 0x2D || curChar == 0xAD) + return; + } + while (m_TempTextBuf.GetSize() > 0 && + m_TempTextBuf.AsStringC().GetAt(m_TempTextBuf.GetLength() - 1) == + 0x20) { + m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); + m_TempCharList.pop_back(); + } + PAGECHAR_INFO* charinfo = &m_TempCharList.back(); + m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); + charinfo->m_Unicode = 0x2; + charinfo->m_Flag = FPDFTEXT_CHAR_HYPHEN; + m_TempTextBuf.AppendChar(0xfffe); + break; + } + } else { + m_CurlineRect = Obj.m_pTextObj->GetRect(); + } + + if (ePreMKC == FPDFText_MarkedContent::Delay) { + ProcessMarkedContent(Obj); + m_pPreTextObj = pTextObj; + m_perMatrix = formMatrix; + return; + } + m_pPreTextObj = pTextObj; + m_perMatrix = formMatrix; + int nItems = pTextObj->CountItems(); + FX_FLOAT baseSpace = CalculateBaseSpace(pTextObj, matrix); + + const bool bR2L = IsRightToLeft(pTextObj, pFont, nItems); + const bool bIsBidiAndMirrorInverse = + bR2L && (matrix.a * matrix.d - matrix.b * matrix.c) < 0; + int32_t iBufStartAppend = m_TempTextBuf.GetLength(); + int32_t iCharListStartAppend = + pdfium::CollectionSize(m_TempCharList); + + FX_FLOAT spacing = 0; + for (int i = 0; i < nItems; i++) { + CPDF_TextObjectItem item; + PAGECHAR_INFO charinfo; + pTextObj->GetItemInfo(i, &item); + if (item.m_CharCode == static_cast(-1)) { + CFX_WideString str = m_TempTextBuf.MakeString(); + if (str.IsEmpty()) + str = m_TextBuf.AsStringC(); + if (str.IsEmpty() || str.GetAt(str.GetLength() - 1) == TEXT_SPACE_CHAR) + continue; + + FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH(); + spacing = -fontsize_h * item.m_Origin.x / 1000; + continue; + } + FX_FLOAT charSpace = pTextObj->m_TextState.GetCharSpace(); + if (charSpace > 0.001) + spacing += matrix.TransformDistance(charSpace); + else if (charSpace < -0.001) + spacing -= matrix.TransformDistance(FXSYS_fabs(charSpace)); + spacing -= baseSpace; + if (spacing && i > 0) { + int last_width = 0; + FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH(); + uint32_t space_charcode = pFont->CharCodeFromUnicode(' '); + FX_FLOAT threshold = 0; + if (space_charcode != CPDF_Font::kInvalidCharCode) + threshold = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000; + if (threshold > fontsize_h / 3) + threshold = 0; + else + threshold /= 2; + if (threshold == 0) { + threshold = fontsize_h; + int this_width = FXSYS_abs(GetCharWidth(item.m_CharCode, pFont)); + threshold = this_width > last_width ? (FX_FLOAT)this_width + : (FX_FLOAT)last_width; + threshold = NormalizeThreshold(threshold); + threshold = fontsize_h * threshold / 1000; + } + if (threshold && (spacing && spacing >= threshold)) { + charinfo.m_Unicode = TEXT_SPACE_CHAR; + charinfo.m_Flag = FPDFTEXT_CHAR_GENERATED; + charinfo.m_pTextObj = pTextObj; + charinfo.m_Index = m_TextBuf.GetLength(); + m_TempTextBuf.AppendChar(TEXT_SPACE_CHAR); + charinfo.m_CharCode = CPDF_Font::kInvalidCharCode; + charinfo.m_Matrix = formMatrix; + charinfo.m_Origin = matrix.Transform(item.m_Origin); + charinfo.m_CharBox = + CFX_FloatRect(charinfo.m_Origin.x, charinfo.m_Origin.y, + charinfo.m_Origin.x, charinfo.m_Origin.y); + m_TempCharList.push_back(charinfo); + } + if (item.m_CharCode == CPDF_Font::kInvalidCharCode) + continue; + } + spacing = 0; + CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode); + bool bNoUnicode = false; + if (wstrItem.IsEmpty() && item.m_CharCode) { + wstrItem += static_cast(item.m_CharCode); + bNoUnicode = true; + } + charinfo.m_Index = -1; + charinfo.m_CharCode = item.m_CharCode; + if (bNoUnicode) + charinfo.m_Flag = FPDFTEXT_CHAR_UNUNICODE; + else + charinfo.m_Flag = FPDFTEXT_CHAR_NORMAL; + + charinfo.m_pTextObj = pTextObj; + charinfo.m_Origin = matrix.Transform(item.m_Origin); + + FX_RECT rect = + charinfo.m_pTextObj->GetFont()->GetCharBBox(charinfo.m_CharCode); + charinfo.m_CharBox.top = + rect.top * pTextObj->GetFontSize() / 1000 + item.m_Origin.y; + charinfo.m_CharBox.left = + rect.left * pTextObj->GetFontSize() / 1000 + item.m_Origin.x; + charinfo.m_CharBox.right = + rect.right * pTextObj->GetFontSize() / 1000 + item.m_Origin.x; + charinfo.m_CharBox.bottom = + rect.bottom * pTextObj->GetFontSize() / 1000 + item.m_Origin.y; + if (fabsf(charinfo.m_CharBox.top - charinfo.m_CharBox.bottom) < 0.01f) { + charinfo.m_CharBox.top = + charinfo.m_CharBox.bottom + pTextObj->GetFontSize(); + } + if (fabsf(charinfo.m_CharBox.right - charinfo.m_CharBox.left) < 0.01f) { + charinfo.m_CharBox.right = + charinfo.m_CharBox.left + pTextObj->GetCharWidth(charinfo.m_CharCode); + } + matrix.TransformRect(charinfo.m_CharBox); + charinfo.m_Matrix = matrix; + if (wstrItem.IsEmpty()) { + charinfo.m_Unicode = 0; + m_TempCharList.push_back(charinfo); + m_TempTextBuf.AppendChar(0xfffe); + continue; + } else { + int nTotal = wstrItem.GetLength(); + bool bDel = false; + const int count = + std::min(pdfium::CollectionSize(m_TempCharList), 7); + FX_FLOAT threshold = charinfo.m_Matrix.TransformXDistance( + (FX_FLOAT)TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize()); + for (int n = pdfium::CollectionSize(m_TempCharList); + n > pdfium::CollectionSize(m_TempCharList) - count; n--) { + const PAGECHAR_INFO& charinfo1 = m_TempCharList[n - 1]; + CFX_PointF diff = charinfo1.m_Origin - charinfo.m_Origin; + if (charinfo1.m_CharCode == charinfo.m_CharCode && + charinfo1.m_pTextObj->GetFont() == charinfo.m_pTextObj->GetFont() && + FXSYS_fabs(diff.x) < threshold && FXSYS_fabs(diff.y) < threshold) { + bDel = true; + break; + } + } + if (!bDel) { + for (int nIndex = 0; nIndex < nTotal; nIndex++) { + charinfo.m_Unicode = wstrItem.GetAt(nIndex); + if (charinfo.m_Unicode) { + charinfo.m_Index = m_TextBuf.GetLength(); + m_TempTextBuf.AppendChar(charinfo.m_Unicode); + } else { + m_TempTextBuf.AppendChar(0xfffe); + } + m_TempCharList.push_back(charinfo); + } + } else if (i == 0) { + CFX_WideString str = m_TempTextBuf.MakeString(); + if (!str.IsEmpty() && + str.GetAt(str.GetLength() - 1) == TEXT_SPACE_CHAR) { + m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); + m_TempCharList.pop_back(); + } + } + } + } + if (bIsBidiAndMirrorInverse) + SwapTempTextBuf(iCharListStartAppend, iBufStartAppend); +} + +CPDF_TextPage::TextOrientation CPDF_TextPage::GetTextObjectWritingMode( + const CPDF_TextObject* pTextObj) const { + int32_t nChars = pTextObj->CountChars(); + if (nChars == 1) + return m_TextlineDir; + + CPDF_TextObjectItem first, last; + pTextObj->GetCharInfo(0, &first); + pTextObj->GetCharInfo(nChars - 1, &last); + + CFX_Matrix textMatrix = pTextObj->GetTextMatrix(); + first.m_Origin = textMatrix.Transform(first.m_Origin); + last.m_Origin = textMatrix.Transform(last.m_Origin); + + FX_FLOAT dX = FXSYS_fabs(last.m_Origin.x - first.m_Origin.x); + FX_FLOAT dY = FXSYS_fabs(last.m_Origin.y - first.m_Origin.y); + if (dX <= 0.0001f && dY <= 0.0001f) + return TextOrientation::Unknown; + + CFX_VectorF v(dX, dY); + v.Normalize(); + if (v.y <= 0.0872f) + return v.x <= 0.0872f ? m_TextlineDir : TextOrientation::Horizontal; + + if (v.x <= 0.0872f) + return TextOrientation::Vertical; + + return m_TextlineDir; +} + +bool CPDF_TextPage::IsHyphen(FX_WCHAR curChar) { + CFX_WideString strCurText = m_TempTextBuf.MakeString(); + if (strCurText.IsEmpty()) + strCurText = m_TextBuf.AsStringC(); + FX_STRSIZE nCount = strCurText.GetLength(); + int nIndex = nCount - 1; + FX_WCHAR wcTmp = strCurText.GetAt(nIndex); + while (wcTmp == 0x20 && nIndex <= nCount - 1 && nIndex >= 0) + wcTmp = strCurText.GetAt(--nIndex); + if (0x2D == wcTmp || 0xAD == wcTmp) { + if (--nIndex > 0) { + FX_WCHAR preChar = strCurText.GetAt((nIndex)); + if (((preChar >= L'A' && preChar <= L'Z') || + (preChar >= L'a' && preChar <= L'z')) && + ((curChar >= L'A' && curChar <= L'Z') || + (curChar >= L'a' && curChar <= L'z'))) { + return true; + } + } + const PAGECHAR_INFO* preInfo; + if (!m_TempCharList.empty()) + preInfo = &m_TempCharList.back(); + else if (!m_CharList.empty()) + preInfo = &m_CharList.back(); + else + return false; + if (FPDFTEXT_CHAR_PIECE == preInfo->m_Flag && + (0xAD == preInfo->m_Unicode || 0x2D == preInfo->m_Unicode)) { + return true; + } + } + return false; +} + +CPDF_TextPage::GenerateCharacter CPDF_TextPage::ProcessInsertObject( + const CPDF_TextObject* pObj, + const CFX_Matrix& formMatrix) { + FindPreviousTextObject(); + TextOrientation WritingMode = GetTextObjectWritingMode(pObj); + if (WritingMode == TextOrientation::Unknown) + WritingMode = GetTextObjectWritingMode(m_pPreTextObj); + + CFX_FloatRect this_rect = pObj->GetRect(); + CFX_FloatRect prev_rect = m_pPreTextObj->GetRect(); + CPDF_TextObjectItem PrevItem; + CPDF_TextObjectItem item; + int nItem = m_pPreTextObj->CountItems(); + m_pPreTextObj->GetItemInfo(nItem - 1, &PrevItem); + pObj->GetItemInfo(0, &item); + CFX_WideString wstrItem = + pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode); + if (wstrItem.IsEmpty()) + wstrItem += static_cast(item.m_CharCode); + FX_WCHAR curChar = wstrItem.GetAt(0); + if (WritingMode == TextOrientation::Horizontal) { + if (this_rect.Height() > 4.5 && prev_rect.Height() > 4.5) { + FX_FLOAT top = + this_rect.top < prev_rect.top ? this_rect.top : prev_rect.top; + FX_FLOAT bottom = this_rect.bottom > prev_rect.bottom ? this_rect.bottom + : prev_rect.bottom; + if (bottom >= top) { + return IsHyphen(curChar) ? GenerateCharacter::Hyphen + : GenerateCharacter::LineBreak; + } + } + } else if (WritingMode == TextOrientation::Vertical) { + if (this_rect.Width() > pObj->GetFontSize() * 0.1f && + prev_rect.Width() > m_pPreTextObj->GetFontSize() * 0.1f) { + FX_FLOAT left = this_rect.left > m_CurlineRect.left ? this_rect.left + : m_CurlineRect.left; + FX_FLOAT right = this_rect.right < m_CurlineRect.right + ? this_rect.right + : m_CurlineRect.right; + if (right <= left) { + return IsHyphen(curChar) ? GenerateCharacter::Hyphen + : GenerateCharacter::LineBreak; + } + } + } + + FX_FLOAT last_pos = PrevItem.m_Origin.x; + int nLastWidth = GetCharWidth(PrevItem.m_CharCode, m_pPreTextObj->GetFont()); + FX_FLOAT last_width = nLastWidth * m_pPreTextObj->GetFontSize() / 1000; + last_width = FXSYS_fabs(last_width); + int nThisWidth = GetCharWidth(item.m_CharCode, pObj->GetFont()); + FX_FLOAT this_width = nThisWidth * pObj->GetFontSize() / 1000; + this_width = FXSYS_fabs(this_width); + FX_FLOAT threshold = + last_width > this_width ? last_width / 4 : this_width / 4; + + CFX_Matrix prev_matrix = m_pPreTextObj->GetTextMatrix(); + prev_matrix.Concat(m_perMatrix); + + CFX_Matrix prev_reverse; + prev_reverse.SetReverse(prev_matrix); + + CFX_PointF pos = prev_reverse.Transform(formMatrix.Transform(pObj->GetPos())); + if (last_width < this_width) + threshold = prev_reverse.TransformDistance(threshold); + + bool bNewline = false; + if (WritingMode == TextOrientation::Horizontal) { + CFX_FloatRect rect1(m_pPreTextObj->m_Left, pObj->m_Bottom, + m_pPreTextObj->m_Right, pObj->m_Top); + CFX_FloatRect rect2 = m_pPreTextObj->GetRect(); + CFX_FloatRect rect3 = rect1; + rect1.Intersect(rect2); + if ((rect1.IsEmpty() && rect2.Height() > 5 && rect3.Height() > 5) || + ((pos.y > threshold * 2 || pos.y < threshold * -3) && + (FXSYS_fabs(pos.y) < 1 ? FXSYS_fabs(pos.x) < FXSYS_fabs(pos.y) + : true))) { + bNewline = true; + if (nItem > 1) { + CPDF_TextObjectItem tempItem; + m_pPreTextObj->GetItemInfo(0, &tempItem); + CFX_Matrix m = m_pPreTextObj->GetTextMatrix(); + if (PrevItem.m_Origin.x > tempItem.m_Origin.x && + m_DisplayMatrix.a > 0.9 && m_DisplayMatrix.b < 0.1 && + m_DisplayMatrix.c < 0.1 && m_DisplayMatrix.d < -0.9 && m.b < 0.1 && + m.c < 0.1) { + CFX_FloatRect re(0, m_pPreTextObj->m_Bottom, 1000, + m_pPreTextObj->m_Top); + if (re.Contains(pObj->GetPos())) { + bNewline = false; + } else { + CFX_FloatRect rect(0, pObj->m_Bottom, 1000, pObj->m_Top); + if (rect.Contains(m_pPreTextObj->GetPos())) + bNewline = false; + } + } + } + } + } + if (bNewline) { + return IsHyphen(curChar) ? GenerateCharacter::Hyphen + : GenerateCharacter::LineBreak; + } + + int32_t nChars = pObj->CountChars(); + if (nChars == 1 && (0x2D == curChar || 0xAD == curChar) && + IsHyphen(curChar)) { + return GenerateCharacter::Hyphen; + } + CFX_WideString PrevStr = + m_pPreTextObj->GetFont()->UnicodeFromCharCode(PrevItem.m_CharCode); + FX_WCHAR preChar = PrevStr.GetAt(PrevStr.GetLength() - 1); + CFX_Matrix matrix = pObj->GetTextMatrix(); + matrix.Concat(formMatrix); + + threshold = (FX_FLOAT)(nLastWidth > nThisWidth ? nLastWidth : nThisWidth); + threshold = threshold > 400 + ? (threshold < 700 + ? threshold / 4 + : (threshold > 800 ? threshold / 6 : threshold / 5)) + : (threshold / 2); + if (nLastWidth >= nThisWidth) { + threshold *= FXSYS_fabs(m_pPreTextObj->GetFontSize()); + } else { + threshold *= FXSYS_fabs(pObj->GetFontSize()); + threshold = matrix.TransformDistance(threshold); + threshold = prev_reverse.TransformDistance(threshold); + } + threshold /= 1000; + if ((threshold < 1.4881 && threshold > 1.4879) || + (threshold < 1.39001 && threshold > 1.38999)) { + threshold *= 1.5; + } + if (FXSYS_fabs(last_pos + last_width - pos.x) > threshold && + curChar != L' ' && preChar != L' ') { + if (curChar != L' ' && preChar != L' ') { + if ((pos.x - last_pos - last_width) > threshold || + (last_pos - pos.x - last_width) > threshold) { + return GenerateCharacter::Space; + } + if (pos.x < 0 && (last_pos - pos.x - last_width) > threshold) + return GenerateCharacter::Space; + if ((pos.x - last_pos - last_width) > this_width || + (pos.x - last_pos - this_width) > last_width) { + return GenerateCharacter::Space; + } + } + } + return GenerateCharacter::None; +} + +bool CPDF_TextPage::IsSameTextObject(CPDF_TextObject* pTextObj1, + CPDF_TextObject* pTextObj2) { + if (!pTextObj1 || !pTextObj2) + return false; + + CFX_FloatRect rcPreObj = pTextObj2->GetRect(); + CFX_FloatRect rcCurObj = pTextObj1->GetRect(); + if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) { + FX_FLOAT dbXdif = FXSYS_fabs(rcPreObj.left - rcCurObj.left); + size_t nCount = m_CharList.size(); + if (nCount >= 2) { + PAGECHAR_INFO perCharTemp = m_CharList[nCount - 2]; + FX_FLOAT dbSpace = perCharTemp.m_CharBox.Width(); + if (dbXdif > dbSpace) + return false; + } + } + if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) { + rcPreObj.Intersect(rcCurObj); + if (rcPreObj.IsEmpty()) + return false; + if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > + rcCurObj.Width() / 2) { + return false; + } + if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) + return false; + } + int nPreCount = pTextObj2->CountItems(); + int nCurCount = pTextObj1->CountItems(); + if (nPreCount != nCurCount) + return false; + // If both objects have no items, consider them same. + if (!nPreCount) + return true; + + CPDF_TextObjectItem itemPer; + CPDF_TextObjectItem itemCur; + for (int i = 0; i < nPreCount; i++) { + pTextObj2->GetItemInfo(i, &itemPer); + pTextObj1->GetItemInfo(i, &itemCur); + if (itemCur.m_CharCode != itemPer.m_CharCode) + return false; + } + + CFX_PointF diff = pTextObj1->GetPos() - pTextObj2->GetPos(); + FX_FLOAT font_size = pTextObj2->GetFontSize(); + FX_FLOAT char_size = GetCharWidth(itemPer.m_CharCode, pTextObj2->GetFont()); + FX_FLOAT max_pre_size = + std::max(std::max(rcPreObj.Height(), rcPreObj.Width()), font_size); + if (FXSYS_fabs(diff.x) > char_size * font_size / 1000 * 0.9 || + FXSYS_fabs(diff.y) > max_pre_size / 8) { + return false; + } + return true; +} + +bool CPDF_TextPage::IsSameAsPreTextObject( + CPDF_TextObject* pTextObj, + const CPDF_PageObjectList* pObjList, + CPDF_PageObjectList::const_iterator iter) { + int i = 0; + while (i < 5 && iter != pObjList->begin()) { + --iter; + CPDF_PageObject* pOtherObj = iter->get(); + if (pOtherObj == pTextObj || !pOtherObj->IsText()) + continue; + if (IsSameTextObject(pOtherObj->AsText(), pTextObj)) + return true; + ++i; + } + return false; +} + +bool CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info) { + const PAGECHAR_INFO* preChar; + if (!m_TempCharList.empty()) + preChar = &m_TempCharList.back(); + else if (!m_CharList.empty()) + preChar = &m_CharList.back(); + else + return false; + + info.m_Index = m_TextBuf.GetLength(); + info.m_Unicode = unicode; + info.m_pTextObj = nullptr; + info.m_CharCode = CPDF_Font::kInvalidCharCode; + info.m_Flag = FPDFTEXT_CHAR_GENERATED; + + int preWidth = 0; + if (preChar->m_pTextObj && preChar->m_CharCode != -1) { + preWidth = + GetCharWidth(preChar->m_CharCode, preChar->m_pTextObj->GetFont()); + } + + FX_FLOAT fFontSize = preChar->m_pTextObj ? preChar->m_pTextObj->GetFontSize() + : preChar->m_CharBox.Height(); + if (!fFontSize) + fFontSize = kDefaultFontSize; + + info.m_Origin = CFX_PointF( + preChar->m_Origin.x + preWidth * (fFontSize) / 1000, preChar->m_Origin.y); + info.m_CharBox = CFX_FloatRect(info.m_Origin.x, info.m_Origin.y, + info.m_Origin.x, info.m_Origin.y); + return true; +} + +bool CPDF_TextPage::IsRectIntersect(const CFX_FloatRect& rect1, + const CFX_FloatRect& rect2) { + CFX_FloatRect rect = rect1; + rect.Intersect(rect2); + return !rect.IsEmpty(); +} diff --git a/modules/pdfium/pdfium/core/fpdftext/cpdf_textpage.h b/modules/pdfium/pdfium/core/fpdftext/cpdf_textpage.h new file mode 100644 index 000000000000..91942d1bec06 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdftext/cpdf_textpage.h @@ -0,0 +1,180 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFTEXT_CPDF_TEXTPAGE_H_ +#define CORE_FPDFTEXT_CPDF_TEXTPAGE_H_ + +#include +#include + +#include "core/fpdfapi/page/cpdf_pageobjectlist.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" + +class CPDF_Font; +class CPDF_FormObject; +class CPDF_Page; +class CPDF_TextObject; + +#define FPDFTEXT_MATCHCASE 0x00000001 +#define FPDFTEXT_MATCHWHOLEWORD 0x00000002 +#define FPDFTEXT_CONSECUTIVE 0x00000004 + +#define FPDFTEXT_CHAR_ERROR -1 +#define FPDFTEXT_CHAR_NORMAL 0 +#define FPDFTEXT_CHAR_GENERATED 1 +#define FPDFTEXT_CHAR_UNUNICODE 2 +#define FPDFTEXT_CHAR_HYPHEN 3 +#define FPDFTEXT_CHAR_PIECE 4 + +#define TEXT_SPACE_CHAR L' ' +#define TEXT_LINEFEED_CHAR L'\n' +#define TEXT_RETURN_CHAR L'\r' +#define TEXT_EMPTY L"" +#define TEXT_SPACE L" " +#define TEXT_RETURN_LINEFEED L"\r\n" +#define TEXT_LINEFEED L"\n" +#define TEXT_CHARRATIO_GAPDELTA 0.070 + +enum class FPDFText_MarkedContent { Pass = 0, Done, Delay }; + +enum class FPDFText_Direction { Left = -1, Right = 1 }; + +class FPDF_CHAR_INFO { + public: + FPDF_CHAR_INFO(); + ~FPDF_CHAR_INFO(); + + FX_WCHAR m_Unicode; + FX_WCHAR m_Charcode; + int32_t m_Flag; + FX_FLOAT m_FontSize; + CFX_PointF m_Origin; + CFX_FloatRect m_CharBox; + CPDF_TextObject* m_pTextObj; + CFX_Matrix m_Matrix; +}; + +struct FPDF_SEGMENT { + int m_Start; + int m_nCount; +}; + +class PAGECHAR_INFO { + public: + PAGECHAR_INFO(); + PAGECHAR_INFO(const PAGECHAR_INFO&); + ~PAGECHAR_INFO(); + + int m_Index; + int m_CharCode; + FX_WCHAR m_Unicode; + int32_t m_Flag; + CFX_PointF m_Origin; + CFX_FloatRect m_CharBox; + CPDF_TextObject* m_pTextObj; + CFX_Matrix m_Matrix; +}; + +struct PDFTEXT_Obj { + CPDF_TextObject* m_pTextObj; + CFX_Matrix m_formMatrix; +}; + +class CPDF_TextPage { + public: + CPDF_TextPage(const CPDF_Page* pPage, FPDFText_Direction flags); + ~CPDF_TextPage(); + + // IPDF_TextPage: + void ParseTextPage(); + bool IsParsed() const { return m_bIsParsed; } + int CharIndexFromTextIndex(int TextIndex) const; + int TextIndexFromCharIndex(int CharIndex) const; + int CountChars() const; + void GetCharInfo(int index, FPDF_CHAR_INFO* info) const; + std::vector GetRectArray(int start, int nCount) const; + int GetIndexAtPos(const CFX_PointF& point, const CFX_SizeF& tolerance) const; + CFX_WideString GetTextByRect(const CFX_FloatRect& rect) const; + CFX_WideString GetPageText(int start = 0, int nCount = -1) const; + int CountRects(int start, int nCount); + void GetRect(int rectIndex, + FX_FLOAT& left, + FX_FLOAT& top, + FX_FLOAT& right, + FX_FLOAT& bottom) const; + + static bool IsRectIntersect(const CFX_FloatRect& rect1, + const CFX_FloatRect& rect2); + + private: + enum class TextOrientation { + Unknown, + Horizontal, + Vertical, + }; + + enum class GenerateCharacter { + None, + Space, + LineBreak, + Hyphen, + }; + + bool IsHyphen(FX_WCHAR curChar); + bool IsControlChar(const PAGECHAR_INFO& charInfo); + void ProcessObject(); + void ProcessFormObject(CPDF_FormObject* pFormObj, + const CFX_Matrix& formMatrix); + void ProcessTextObject(PDFTEXT_Obj pObj); + void ProcessTextObject(CPDF_TextObject* pTextObj, + const CFX_Matrix& formMatrix, + const CPDF_PageObjectList* pObjList, + CPDF_PageObjectList::const_iterator ObjPos); + GenerateCharacter ProcessInsertObject(const CPDF_TextObject* pObj, + const CFX_Matrix& formMatrix); + bool GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info); + bool IsSameAsPreTextObject(CPDF_TextObject* pTextObj, + const CPDF_PageObjectList* pObjList, + CPDF_PageObjectList::const_iterator ObjPos); + bool IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2); + int GetCharWidth(uint32_t charCode, CPDF_Font* pFont) const; + void CloseTempLine(); + FPDFText_MarkedContent PreMarkedContent(PDFTEXT_Obj pObj); + void ProcessMarkedContent(PDFTEXT_Obj pObj); + void CheckMarkedContentObject(int32_t& start, int32_t& nCount) const; + void FindPreviousTextObject(); + void AddCharInfoByLRDirection(FX_WCHAR wChar, PAGECHAR_INFO info); + void AddCharInfoByRLDirection(FX_WCHAR wChar, PAGECHAR_INFO info); + TextOrientation GetTextObjectWritingMode( + const CPDF_TextObject* pTextObj) const; + TextOrientation FindTextlineFlowOrientation() const; + void AppendGeneratedCharacter(FX_WCHAR unicode, const CFX_Matrix& formMatrix); + + void SwapTempTextBuf(int32_t iCharListStartAppend, int32_t iBufStartAppend); + bool IsRightToLeft(const CPDF_TextObject* pTextObj, + const CPDF_Font* pFont, + int nItems) const; + + const CPDF_Page* const m_pPage; + std::vector m_CharIndex; + std::deque m_CharList; + std::deque m_TempCharList; + CFX_WideTextBuf m_TextBuf; + CFX_WideTextBuf m_TempTextBuf; + const FPDFText_Direction m_parserflag; + CPDF_TextObject* m_pPreTextObj; + CFX_Matrix m_perMatrix; + bool m_bIsParsed; + CFX_Matrix m_DisplayMatrix; + std::vector m_SelRects; + std::vector m_LineObj; + TextOrientation m_TextlineDir; + CFX_FloatRect m_CurlineRect; +}; + +#endif // CORE_FPDFTEXT_CPDF_TEXTPAGE_H_ diff --git a/modules/pdfium/pdfium/core/fpdftext/cpdf_textpagefind.cpp b/modules/pdfium/pdfium/core/fpdftext/cpdf_textpagefind.cpp new file mode 100644 index 000000000000..a79b5e7e8a1c --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdftext/cpdf_textpagefind.cpp @@ -0,0 +1,407 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdftext/cpdf_textpagefind.h" + +#include +#include +#include + +#include "core/fpdftext/cpdf_textpage.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" +#include "third_party/base/stl_util.h" + +namespace { + +bool IsIgnoreSpaceCharacter(FX_WCHAR curChar) { + if (curChar < 255 || (curChar >= 0x0600 && curChar <= 0x06FF) || + (curChar >= 0xFE70 && curChar <= 0xFEFF) || + (curChar >= 0xFB50 && curChar <= 0xFDFF) || + (curChar >= 0x0400 && curChar <= 0x04FF) || + (curChar >= 0x0500 && curChar <= 0x052F) || + (curChar >= 0xA640 && curChar <= 0xA69F) || + (curChar >= 0x2DE0 && curChar <= 0x2DFF) || curChar == 8467 || + (curChar >= 0x2000 && curChar <= 0x206F)) { + return false; + } + return true; +} + +} // namespace + +CPDF_TextPageFind::CPDF_TextPageFind(const CPDF_TextPage* pTextPage) + : m_pTextPage(pTextPage), + m_flags(0), + m_findNextStart(-1), + m_findPreStart(-1), + m_bMatchCase(false), + m_bMatchWholeWord(false), + m_resStart(0), + m_resEnd(-1), + m_IsFind(false) { + m_strText = m_pTextPage->GetPageText(); + int nCount = pTextPage->CountChars(); + if (nCount) + m_CharIndex.push_back(0); + for (int i = 0; i < nCount; i++) { + FPDF_CHAR_INFO info; + pTextPage->GetCharInfo(i, &info); + int indexSize = pdfium::CollectionSize(m_CharIndex); + if (info.m_Flag == FPDFTEXT_CHAR_NORMAL || + info.m_Flag == FPDFTEXT_CHAR_GENERATED) { + if (indexSize % 2) { + m_CharIndex.push_back(1); + } else { + if (indexSize <= 0) + continue; + m_CharIndex[indexSize - 1] += 1; + } + } else { + if (indexSize % 2) { + if (indexSize <= 0) + continue; + m_CharIndex[indexSize - 1] = i + 1; + } else { + m_CharIndex.push_back(i + 1); + } + } + } + int indexSize = pdfium::CollectionSize(m_CharIndex); + if (indexSize % 2) + m_CharIndex.erase(m_CharIndex.begin() + indexSize - 1); +} + +CPDF_TextPageFind::~CPDF_TextPageFind() {} + +int CPDF_TextPageFind::GetCharIndex(int index) const { + return m_pTextPage->CharIndexFromTextIndex(index); +} + +bool CPDF_TextPageFind::FindFirst(const CFX_WideString& findwhat, + int flags, + int startPos) { + if (!m_pTextPage) + return false; + if (m_strText.IsEmpty() || m_bMatchCase != (flags & FPDFTEXT_MATCHCASE)) + m_strText = m_pTextPage->GetPageText(); + CFX_WideString findwhatStr = findwhat; + m_findWhat = findwhatStr; + m_flags = flags; + m_bMatchCase = flags & FPDFTEXT_MATCHCASE; + if (m_strText.IsEmpty()) { + m_IsFind = false; + return true; + } + FX_STRSIZE len = findwhatStr.GetLength(); + if (!m_bMatchCase) { + findwhatStr.MakeLower(); + m_strText.MakeLower(); + } + m_bMatchWholeWord = !!(flags & FPDFTEXT_MATCHWHOLEWORD); + m_findNextStart = startPos; + if (startPos == -1) + m_findPreStart = m_strText.GetLength() - 1; + else + m_findPreStart = startPos; + m_csFindWhatArray.clear(); + int i = 0; + while (i < len) { + if (findwhatStr.GetAt(i) != ' ') + break; + i++; + } + if (i < len) + ExtractFindWhat(findwhatStr); + else + m_csFindWhatArray.push_back(findwhatStr); + if (m_csFindWhatArray.empty()) + return false; + m_IsFind = true; + m_resStart = 0; + m_resEnd = -1; + return true; +} + +bool CPDF_TextPageFind::FindNext() { + if (!m_pTextPage) + return false; + m_resArray.clear(); + if (m_findNextStart == -1) + return false; + if (m_strText.IsEmpty()) { + m_IsFind = false; + return m_IsFind; + } + int strLen = m_strText.GetLength(); + if (m_findNextStart > strLen - 1) { + m_IsFind = false; + return m_IsFind; + } + int nCount = pdfium::CollectionSize(m_csFindWhatArray); + int nResultPos = 0; + int nStartPos = 0; + nStartPos = m_findNextStart; + bool bSpaceStart = false; + for (int iWord = 0; iWord < nCount; iWord++) { + CFX_WideString csWord = m_csFindWhatArray[iWord]; + if (csWord.IsEmpty()) { + if (iWord == nCount - 1) { + FX_WCHAR strInsert = m_strText.GetAt(nStartPos); + if (strInsert == TEXT_LINEFEED_CHAR || strInsert == TEXT_SPACE_CHAR || + strInsert == TEXT_RETURN_CHAR || strInsert == 160) { + nResultPos = nStartPos + 1; + break; + } + iWord = -1; + } else if (iWord == 0) { + bSpaceStart = true; + } + continue; + } + int endIndex; + nResultPos = m_strText.Find(csWord.c_str(), nStartPos); + if (nResultPos == -1) { + m_IsFind = false; + return m_IsFind; + } + endIndex = nResultPos + csWord.GetLength() - 1; + if (iWord == 0) + m_resStart = nResultPos; + bool bMatch = true; + if (iWord != 0 && !bSpaceStart) { + int PreResEndPos = nStartPos; + int curChar = csWord.GetAt(0); + CFX_WideString lastWord = m_csFindWhatArray[iWord - 1]; + int lastChar = lastWord.GetAt(lastWord.GetLength() - 1); + if (nStartPos == nResultPos && + !(IsIgnoreSpaceCharacter(lastChar) || + IsIgnoreSpaceCharacter(curChar))) { + bMatch = false; + } + for (int d = PreResEndPos; d < nResultPos; d++) { + FX_WCHAR strInsert = m_strText.GetAt(d); + if (strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_SPACE_CHAR && + strInsert != TEXT_RETURN_CHAR && strInsert != 160) { + bMatch = false; + break; + } + } + } else if (bSpaceStart) { + if (nResultPos > 0) { + FX_WCHAR strInsert = m_strText.GetAt(nResultPos - 1); + if (strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_SPACE_CHAR && + strInsert != TEXT_RETURN_CHAR && strInsert != 160) { + bMatch = false; + m_resStart = nResultPos; + } else { + m_resStart = nResultPos - 1; + } + } + } + if (m_bMatchWholeWord && bMatch) { + bMatch = IsMatchWholeWord(m_strText, nResultPos, endIndex); + } + nStartPos = endIndex + 1; + if (!bMatch) { + iWord = -1; + if (bSpaceStart) + nStartPos = m_resStart + m_csFindWhatArray[1].GetLength(); + else + nStartPos = m_resStart + m_csFindWhatArray[0].GetLength(); + } + } + m_resEnd = nResultPos + m_csFindWhatArray.back().GetLength() - 1; + m_IsFind = true; + int resStart = GetCharIndex(m_resStart); + int resEnd = GetCharIndex(m_resEnd); + m_resArray = m_pTextPage->GetRectArray(resStart, resEnd - resStart + 1); + if (m_flags & FPDFTEXT_CONSECUTIVE) { + m_findNextStart = m_resStart + 1; + m_findPreStart = m_resEnd - 1; + } else { + m_findNextStart = m_resEnd + 1; + m_findPreStart = m_resStart - 1; + } + return m_IsFind; +} + +bool CPDF_TextPageFind::FindPrev() { + if (!m_pTextPage) + return false; + m_resArray.clear(); + if (m_strText.IsEmpty() || m_findPreStart < 0) { + m_IsFind = false; + return m_IsFind; + } + CPDF_TextPageFind findEngine(m_pTextPage); + bool ret = findEngine.FindFirst(m_findWhat, m_flags); + if (!ret) { + m_IsFind = false; + return m_IsFind; + } + int order = -1, MatchedCount = 0; + while (ret) { + ret = findEngine.FindNext(); + if (ret) { + int order1 = findEngine.GetCurOrder(); + int MatchedCount1 = findEngine.GetMatchedCount(); + if (((order1 + MatchedCount1) - 1) > m_findPreStart) + break; + order = order1; + MatchedCount = MatchedCount1; + } + } + if (order == -1) { + m_IsFind = false; + return m_IsFind; + } + m_resStart = m_pTextPage->TextIndexFromCharIndex(order); + m_resEnd = m_pTextPage->TextIndexFromCharIndex(order + MatchedCount - 1); + m_IsFind = true; + m_resArray = m_pTextPage->GetRectArray(order, MatchedCount); + if (m_flags & FPDFTEXT_CONSECUTIVE) { + m_findNextStart = m_resStart + 1; + m_findPreStart = m_resEnd - 1; + } else { + m_findNextStart = m_resEnd + 1; + m_findPreStart = m_resStart - 1; + } + return m_IsFind; +} + +void CPDF_TextPageFind::ExtractFindWhat(const CFX_WideString& findwhat) { + if (findwhat.IsEmpty()) + return; + int index = 0; + while (1) { + CFX_WideString csWord = TEXT_EMPTY; + int ret = + ExtractSubString(csWord, findwhat.c_str(), index, TEXT_SPACE_CHAR); + if (csWord.IsEmpty()) { + if (ret) { + m_csFindWhatArray.push_back(L""); + index++; + continue; + } else { + break; + } + } + int pos = 0; + while (pos < csWord.GetLength()) { + CFX_WideString curStr = csWord.Mid(pos, 1); + FX_WCHAR curChar = csWord.GetAt(pos); + if (IsIgnoreSpaceCharacter(curChar)) { + if (pos > 0 && curChar == 0x2019) { + pos++; + continue; + } + if (pos > 0) + m_csFindWhatArray.push_back(csWord.Mid(0, pos)); + m_csFindWhatArray.push_back(curStr); + if (pos == csWord.GetLength() - 1) { + csWord.clear(); + break; + } + csWord = csWord.Right(csWord.GetLength() - pos - 1); + pos = 0; + continue; + } + pos++; + } + if (!csWord.IsEmpty()) + m_csFindWhatArray.push_back(csWord); + index++; + } +} + +bool CPDF_TextPageFind::IsMatchWholeWord(const CFX_WideString& csPageText, + int startPos, + int endPos) { + FX_WCHAR char_left = 0; + FX_WCHAR char_right = 0; + int char_count = endPos - startPos + 1; + if (char_count < 1) + return false; + if (char_count == 1 && csPageText.GetAt(startPos) > 255) + return true; + if (startPos - 1 >= 0) + char_left = csPageText.GetAt(startPos - 1); + if (startPos + char_count < csPageText.GetLength()) + char_right = csPageText.GetAt(startPos + char_count); + if ((char_left > 'A' && char_left < 'a') || + (char_left > 'a' && char_left < 'z') || + (char_left > 0xfb00 && char_left < 0xfb06) || std::iswdigit(char_left) || + (char_right > 'A' && char_right < 'a') || + (char_right > 'a' && char_right < 'z') || + (char_right > 0xfb00 && char_right < 0xfb06) || + std::iswdigit(char_right)) { + return false; + } + if (!(('A' > char_left || char_left > 'Z') && + ('a' > char_left || char_left > 'z') && + ('A' > char_right || char_right > 'Z') && + ('a' > char_right || char_right > 'z'))) { + return false; + } + if (char_count > 0) { + if (csPageText.GetAt(startPos) >= L'0' && + csPageText.GetAt(startPos) <= L'9' && char_left >= L'0' && + char_left <= L'9') { + return false; + } + if (csPageText.GetAt(endPos) >= L'0' && csPageText.GetAt(endPos) <= L'9' && + char_right >= L'0' && char_right <= L'9') { + return false; + } + } + return true; +} + +bool CPDF_TextPageFind::ExtractSubString(CFX_WideString& rString, + const FX_WCHAR* lpszFullString, + int iSubString, + FX_WCHAR chSep) { + if (!lpszFullString) + return false; + while (iSubString--) { + lpszFullString = std::wcschr(lpszFullString, chSep); + if (!lpszFullString) { + rString.clear(); + return false; + } + lpszFullString++; + while (*lpszFullString == chSep) + lpszFullString++; + } + const FX_WCHAR* lpchEnd = std::wcschr(lpszFullString, chSep); + int nLen = lpchEnd ? (int)(lpchEnd - lpszFullString) + : (int)FXSYS_wcslen(lpszFullString); + ASSERT(nLen >= 0); + FXSYS_memcpy(rString.GetBuffer(nLen), lpszFullString, + nLen * sizeof(FX_WCHAR)); + rString.ReleaseBuffer(); + return true; +} + +CFX_WideString CPDF_TextPageFind::MakeReverse(const CFX_WideString& str) { + CFX_WideString str2; + str2.clear(); + int nlen = str.GetLength(); + for (int i = nlen - 1; i >= 0; i--) + str2 += str.GetAt(i); + return str2; +} + +int CPDF_TextPageFind::GetCurOrder() const { + return GetCharIndex(m_resStart); +} + +int CPDF_TextPageFind::GetMatchedCount() const { + int resStart = GetCharIndex(m_resStart); + int resEnd = GetCharIndex(m_resEnd); + return resEnd - resStart + 1; +} diff --git a/modules/pdfium/pdfium/core/fpdftext/cpdf_textpagefind.h b/modules/pdfium/pdfium/core/fpdftext/cpdf_textpagefind.h new file mode 100644 index 000000000000..c60cb576a775 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdftext/cpdf_textpagefind.h @@ -0,0 +1,58 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFTEXT_CPDF_TEXTPAGEFIND_H_ +#define CORE_FPDFTEXT_CPDF_TEXTPAGEFIND_H_ + +#include + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_TextPage; + +class CPDF_TextPageFind { + public: + explicit CPDF_TextPageFind(const CPDF_TextPage* pTextPage); + ~CPDF_TextPageFind(); + + bool FindFirst(const CFX_WideString& findwhat, int flags, int startPos = 0); + bool FindNext(); + bool FindPrev(); + int GetCurOrder() const; + int GetMatchedCount() const; + + protected: + void ExtractFindWhat(const CFX_WideString& findwhat); + bool IsMatchWholeWord(const CFX_WideString& csPageText, + int startPos, + int endPos); + bool ExtractSubString(CFX_WideString& rString, + const FX_WCHAR* lpszFullString, + int iSubString, + FX_WCHAR chSep); + CFX_WideString MakeReverse(const CFX_WideString& str); + int GetCharIndex(int index) const; + + private: + std::vector m_CharIndex; + const CPDF_TextPage* m_pTextPage; + CFX_WideString m_strText; + CFX_WideString m_findWhat; + int m_flags; + std::vector m_csFindWhatArray; + int m_findNextStart; + int m_findPreStart; + bool m_bMatchCase; + bool m_bMatchWholeWord; + int m_resStart; + int m_resEnd; + std::vector m_resArray; + bool m_IsFind; +}; + +#endif // CORE_FPDFTEXT_CPDF_TEXTPAGEFIND_H_ diff --git a/modules/pdfium/pdfium/core/fpdftext/fpdf_text_int_unittest.cpp b/modules/pdfium/pdfium/core/fpdftext/fpdf_text_int_unittest.cpp new file mode 100644 index 000000000000..d7e48768bc86 --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdftext/fpdf_text_int_unittest.cpp @@ -0,0 +1,59 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fpdftext/cpdf_linkextract.h" + +#include "testing/gtest/include/gtest/gtest.h" + +// Class to help test functions in CPDF_LinkExtract class. +class CPDF_TestLinkExtract : public CPDF_LinkExtract { + public: + CPDF_TestLinkExtract() : CPDF_LinkExtract(nullptr) {} + + private: + // Add test cases as friends to access protected member functions. + // Access CheckMailLink. + FRIEND_TEST(fpdf_text_int, CheckMailLink); +}; + +TEST(fpdf_text_int, CheckMailLink) { + CPDF_TestLinkExtract extractor; + // Check cases that fail to extract valid mail link. + const wchar_t* invalid_strs[] = { + L"", + L"peter.pan", // '@' is required. + L"abc@server", // Domain name needs at least one '.'. + L"abc.@gmail.com", // '.' can not immediately precede '@'. + L"abc@xyz&q.org", // Domain name should not contain '&'. + L"abc@.xyz.org", // Domain name should not start with '.'. + L"fan@g..com" // Domain name should not have consecutive '.' + }; + for (size_t i = 0; i < FX_ArraySize(invalid_strs); ++i) { + CFX_WideString text_str(invalid_strs[i]); + EXPECT_FALSE(extractor.CheckMailLink(text_str)); + } + + // Check cases that can extract valid mail link. + // An array of {input_string, expected_extracted_email_address}. + const wchar_t* valid_strs[][2] = { + {L"peter@abc.d", L"peter@abc.d"}, + {L"red.teddy.b@abc.com", L"red.teddy.b@abc.com"}, + {L"abc_@gmail.com", L"abc_@gmail.com"}, // '_' is ok before '@'. + {L"dummy-hi@gmail.com", + L"dummy-hi@gmail.com"}, // '-' is ok in user name. + {L"a..df@gmail.com", L"df@gmail.com"}, // Stop at consecutive '.'. + {L".john@yahoo.com", L"john@yahoo.com"}, // Remove heading '.'. + {L"abc@xyz.org?/", L"abc@xyz.org"}, // Trim ending invalid chars. + {L"fan{abc@xyz.org", L"abc@xyz.org"}, // Trim beginning invalid chars. + {L"fan@g.com..", L"fan@g.com"}, // Trim the ending periods. + {L"CAP.cap@Gmail.Com", L"CAP.cap@Gmail.Com"}, // Keep the original case. + }; + for (size_t i = 0; i < FX_ArraySize(valid_strs); ++i) { + CFX_WideString text_str(valid_strs[i][0]); + CFX_WideString expected_str(L"mailto:"); + expected_str += valid_strs[i][1]; + EXPECT_TRUE(extractor.CheckMailLink(text_str)); + EXPECT_STREQ(text_str.c_str(), expected_str.c_str()); + } +} diff --git a/modules/pdfium/pdfium/core/fpdftext/unicodenormalizationdata.cpp b/modules/pdfium/pdfium/core/fpdftext/unicodenormalizationdata.cpp new file mode 100644 index 000000000000..7cbc2f73effe --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdftext/unicodenormalizationdata.cpp @@ -0,0 +1,8275 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdftext/unicodenormalizationdata.h" +#include "core/fxcrt/fx_system.h" + +const uint16_t g_UnicodeData_Normalization[65536] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8001, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2002, 0x8002, 0x0000, 0x2004, 0x0000, 0x0000, 0x8003, 0x8004, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8005, 0x0000, 0x8006, + 0x0000, 0x0000, 0x0000, 0x8007, 0x8008, 0x0000, 0x0000, 0x8009, 0x800A, + 0x800B, 0x800C, 0x0000, 0x0000, 0x800D, 0x800E, 0x800F, 0x0000, 0x3000, + 0x3003, 0x3006, 0x0000, 0x8010, 0x8011, 0x8012, 0x8013, 0x8014, 0x8015, + 0x0000, 0x8016, 0x8017, 0x8018, 0x8019, 0x801A, 0x801B, 0x801C, 0x801D, + 0x801E, 0x801F, 0x8020, 0x8021, 0x8022, 0x8023, 0x8024, 0x8025, 0x0000, + 0x8026, 0x8027, 0x8028, 0x8029, 0x802A, 0x802B, 0x0000, 0x0000, 0x802C, + 0x802D, 0x802E, 0x802F, 0x8030, 0x8031, 0x0000, 0x8032, 0x8033, 0x8034, + 0x8035, 0x8036, 0x8037, 0x8038, 0x8039, 0x803A, 0x0000, 0x803B, 0x803C, + 0x803D, 0x803E, 0x803F, 0x8040, 0x0000, 0x8041, 0x8042, 0x8043, 0x8044, + 0x8045, 0x8046, 0x0000, 0x8047, 0x8048, 0x8049, 0x804A, 0x804B, 0x804C, + 0x804D, 0x804E, 0x804F, 0x8050, 0x8051, 0x8052, 0x8053, 0x8054, 0x8055, + 0x8056, 0x8057, 0x8058, 0x8059, 0x805A, 0x805B, 0x805C, 0x805D, 0x805E, + 0x805F, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, + 0x8068, 0x8069, 0x806A, 0x806B, 0x806C, 0x806D, 0x806E, 0x806F, 0x8070, + 0x8071, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077, 0x8078, 0x0000, + 0x2006, 0x2008, 0x8079, 0x807A, 0x807B, 0x807C, 0x807D, 0x807E, 0x807F, + 0x8080, 0x8081, 0x8082, 0x8083, 0x8084, 0x8085, 0x8086, 0x8087, 0x8088, + 0x8089, 0x808A, 0x808B, 0x808C, 0x808D, 0x808E, 0x0000, 0x0000, 0x808F, + 0x8090, 0x8091, 0x8092, 0x8093, 0x8094, 0x200A, 0x200C, 0x8095, 0x8096, + 0x8097, 0x8098, 0x8099, 0x809A, 0x809B, 0x809C, 0x809D, 0x809E, 0x809F, + 0x80A0, 0x80A1, 0x80A2, 0x80A3, 0x80A4, 0x80A5, 0x80A6, 0x80A7, 0x80A8, + 0x80A9, 0x80AA, 0x80AB, 0x80AC, 0x80AD, 0x80AE, 0x80AF, 0x80B0, 0x80B1, + 0x80B2, 0x80B3, 0x80B4, 0x80B5, 0x80B6, 0x80B7, 0x80B8, 0x80B9, 0x80BA, + 0x80BB, 0x80BC, 0x80BD, 0x80BE, 0x80BF, 0x80C0, 0x80C1, 0x80C2, 0x80C3, + 0x80C4, 0x0000, 0x0000, 0x0000, 0x80C5, 0x80C6, 0x80C7, 0x80C8, 0x80C9, + 0x80CA, 0x0000, 0x80CB, 0x0000, 0x80CC, 0x80CD, 0x80CE, 0x80CF, 0x0000, + 0x0000, 0x0000, 0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x0000, 0x80D4, 0x80D5, + 0x80D6, 0x80D7, 0x80D8, 0x80D9, 0x0000, 0x0000, 0x80DA, 0x80DB, 0x0000, + 0x0000, 0x0000, 0x0000, 0x80DC, 0x80DD, 0x80DE, 0x80DF, 0x80E0, 0x80E1, + 0x80E2, 0x0000, 0x80E3, 0x80E4, 0x80E5, 0x80E6, 0x80E7, 0x0000, 0x80E8, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x200E, 0x2010, 0x2012, 0x2014, 0x2016, 0x2018, 0x201A, + 0x201C, 0x201E, 0x80E9, 0x80EA, 0x80EB, 0x80EC, 0x80ED, 0x80EE, 0x80EF, + 0x80F0, 0x80F1, 0x80F2, 0x80F3, 0x80F4, 0x80F5, 0x80F6, 0x80F7, 0x80F8, + 0x80F9, 0x80FA, 0x80FB, 0x80FC, 0x80FD, 0x80FE, 0x80FF, 0x8100, 0x8101, + 0x8102, 0x8103, 0x8104, 0x8105, 0x8106, 0x8107, 0x8108, 0x8109, 0x810A, + 0x810B, 0x810C, 0x2020, 0x2022, 0x2024, 0x810D, 0x810E, 0x0000, 0x0000, + 0x810F, 0x8110, 0x8111, 0x8112, 0x8113, 0x8114, 0x8115, 0x8116, 0x8117, + 0x8118, 0x8119, 0x811A, 0x811B, 0x811C, 0x811D, 0x811E, 0x811F, 0x8120, + 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127, 0x8128, 0x8129, + 0x812A, 0x812B, 0x812C, 0x812D, 0x812E, 0x812F, 0x8130, 0x8131, 0x8132, + 0x0000, 0x0000, 0x8133, 0x8134, 0x8135, 0x8136, 0x0000, 0x0000, 0x8137, + 0x8138, 0x8139, 0x813A, 0x813B, 0x813C, 0x813D, 0x813E, 0x813F, 0x8140, + 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149, + 0x814A, 0x2026, 0x2028, 0x814B, 0x814C, 0x814D, 0x814E, 0x814F, 0x8150, + 0x8151, 0x0000, 0x0000, 0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, + 0x8158, 0x8159, 0x815A, 0x815B, 0x815C, 0x815D, 0x815E, 0x815F, 0x0000, + 0x8160, 0x8161, 0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x0000, 0x8167, + 0x8168, 0x8169, 0x816A, 0x816B, 0x816C, 0x816D, 0x816E, 0x816F, 0x0000, + 0x0000, 0x8170, 0x8171, 0x0000, 0x8172, 0x0000, 0x8173, 0x8174, 0x8175, + 0x8176, 0x0000, 0x8177, 0x8178, 0x8179, 0x817A, 0x817B, 0x817C, 0x817D, + 0x202A, 0x0000, 0x0000, 0x817E, 0x817F, 0x8180, 0x8181, 0x8182, 0x8183, + 0x8184, 0x8185, 0x8186, 0x8187, 0x0000, 0x8188, 0x8189, 0x818A, 0x818B, + 0x818C, 0x818D, 0x0000, 0x818E, 0x818F, 0x8190, 0x8191, 0x8192, 0x8193, + 0x8194, 0x0000, 0x8195, 0x0000, 0x0000, 0x0000, 0x8196, 0x0000, 0x8197, + 0x8198, 0x8199, 0x819A, 0x819B, 0x819C, 0x819D, 0x819E, 0x0000, 0x0000, + 0x202C, 0x202E, 0x2030, 0x2032, 0x2034, 0x2036, 0x2038, 0x203A, 0x203C, + 0x0000, 0x0000, 0x819F, 0x81A0, 0x81A1, 0x81A2, 0x81A3, 0x81A4, 0x81A5, + 0x81A6, 0x81A7, 0x81A8, 0x81A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81AA, 0x81AB, + 0x81AC, 0x81AD, 0x81AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x81AF, 0x81B0, 0x0000, 0x81B1, 0x81B2, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x81B3, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, + 0x81B9, 0x81BA, 0x81BB, 0x81BC, 0x81BD, 0x81BE, 0x81BF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x81C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x81C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x81C2, 0x81C3, 0x81C4, 0x81C5, 0x81C6, 0x81C7, 0x81C8, 0x0000, 0x81C9, + 0x0000, 0x81CA, 0x81CB, 0x81CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, 0x81D2, 0x81D3, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81D4, 0x81D5, + 0x81D6, 0x81D7, 0x81D8, 0x0000, 0x81D9, 0x81DA, 0x81DB, 0x81DC, 0x81DD, + 0x81DE, 0x81DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x81E0, 0x81E1, 0x81E2, 0x0000, 0x81E3, 0x81E4, 0x0000, 0x0000, 0x0000, + 0x81E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81E6, 0x81E7, + 0x0000, 0x81E8, 0x0000, 0x0000, 0x0000, 0x81E9, 0x0000, 0x0000, 0x0000, + 0x0000, 0x81EA, 0x81EB, 0x81EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81ED, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x81EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81EF, 0x81F0, 0x0000, + 0x81F1, 0x0000, 0x0000, 0x0000, 0x81F2, 0x0000, 0x0000, 0x0000, 0x0000, + 0x81F3, 0x81F4, 0x81F5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x81F6, 0x81F7, 0x0000, 0x0000, 0x81F8, 0x81F9, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FA, + 0x81FB, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FC, 0x81FD, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x81FE, 0x81FF, 0x0000, 0x0000, 0x8200, 0x8201, 0x8202, 0x8203, + 0x8204, 0x8205, 0x8206, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, 0x820C, + 0x820D, 0x820E, 0x820F, 0x8210, 0x8211, 0x8212, 0x8213, 0x8214, 0x8215, + 0x203E, 0x2040, 0x8216, 0x8217, 0x0000, 0x0000, 0x8218, 0x8219, 0x821A, + 0x821B, 0x0000, 0x0000, 0x821C, 0x821D, 0x821E, 0x821F, 0x2042, 0x2044, + 0x8220, 0x8221, 0x8222, 0x8223, 0x0000, 0x0000, 0x8224, 0x8225, 0x8226, + 0x8227, 0x0000, 0x8228, 0x8229, 0x822A, 0x822B, 0x822C, 0x822D, 0x822E, + 0x822F, 0x8230, 0x8231, 0x0000, 0x0000, 0x8232, 0x8233, 0x0000, 0x8234, + 0x8235, 0x8236, 0x8237, 0x2046, 0x2048, 0x8238, 0x8239, 0x0000, 0x0000, + 0x823A, 0x823B, 0x823C, 0x823D, 0x823E, 0x823F, 0x0000, 0x0000, 0x8240, + 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x0000, 0x0000, 0x8246, 0x8247, + 0x8248, 0x8249, 0x824A, 0x824B, 0x824C, 0x824D, 0x824E, 0x824F, 0x8250, + 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8258, 0x8259, + 0x825A, 0x825B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x825C, 0x825D, 0x825E, 0x825F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x204A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x204C, 0x204E, 0x2050, + 0x2052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2054, 0x0000, 0x2056, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x205A, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x205C, 0x0000, 0x0000, 0x205E, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2060, 0x2062, + 0x2064, 0x2066, 0x2068, 0x206A, 0x206C, 0x206E, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2070, 0x2072, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2074, 0x2076, 0x0000, 0x2078, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x207A, 0x0000, 0x0000, 0x207C, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x207E, 0x2080, 0x2082, 0x0000, 0x0000, 0x2084, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2086, + 0x0000, 0x0000, 0x2088, 0x208A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x208C, 0x208E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2090, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2092, 0x2094, 0x2096, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2098, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x209A, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x209C, 0x209E, 0x0000, 0x20A0, 0x20A2, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x20A4, 0x20A6, 0x20A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x20AA, 0x0000, 0x20AC, 0x20AE, 0x20B0, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20B2, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x20B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20B6, 0x20B8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8260, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x20BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x20BC, 0x0000, 0x0000, 0x0000, 0x0000, 0x20BE, 0x0000, + 0x0000, 0x0000, 0x0000, 0x20C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C2, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x20C4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x20C6, 0x0000, 0x20C8, 0x20CA, 0x20CC, + 0x20CE, 0x20D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x20D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x20D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x20D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x20D8, 0x0000, 0x0000, + 0x0000, 0x0000, 0x20DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DC, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x20DE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x20E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8261, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E2, 0x0000, 0x20E4, + 0x0000, 0x20E6, 0x0000, 0x20E8, 0x0000, 0x20EA, 0x0000, 0x0000, 0x0000, + 0x20EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20EE, 0x0000, 0x20F0, 0x0000, + 0x0000, 0x20F2, 0x20F4, 0x0000, 0x20F6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8262, 0x8263, + 0x8264, 0x8265, 0x8266, 0x8267, 0x8268, 0x8269, 0x826A, 0x826B, 0x826C, + 0x826D, 0x826E, 0x826F, 0x8270, 0x0000, 0x8271, 0x8272, 0x8273, 0x8274, + 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827A, 0x827B, 0x827C, 0x827D, + 0x827E, 0x827F, 0x8280, 0x8281, 0x8282, 0x0000, 0x8283, 0x8284, 0x8285, + 0x8286, 0x8287, 0x8288, 0x8289, 0x828A, 0x828B, 0x828C, 0x828D, 0x828E, + 0x828F, 0x8290, 0x8291, 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, + 0x8298, 0x8299, 0x829A, 0x829B, 0x829C, 0x829D, 0x829E, 0x0000, 0x829F, + 0x82A0, 0x82A1, 0x82A2, 0x82A3, 0x82A4, 0x82A5, 0x82A6, 0x82A7, 0x82A8, + 0x82A9, 0x82AA, 0x82AB, 0x0000, 0x20F8, 0x82AC, 0x0000, 0x82AD, 0x82AE, + 0x82AF, 0x82B0, 0x82B1, 0x82B2, 0x82B3, 0x82B4, 0x82B5, 0x82B6, 0x82B7, + 0x82B8, 0x82B9, 0x82BA, 0x82BB, 0x82BC, 0x82BD, 0x82BE, 0x82BF, 0x82C0, + 0x82C1, 0x82C2, 0x82C3, 0x82C4, 0x82C5, 0x82C6, 0x0000, 0x82C7, 0x0000, + 0x0000, 0x82C8, 0x82C9, 0x82CA, 0x82CB, 0x82CC, 0x82CD, 0x82CE, 0x82CF, + 0x82D0, 0x82D1, 0x82D2, 0x82D3, 0x82D4, 0x82D5, 0x82D6, 0x82D7, 0x82D8, + 0x82D9, 0x82DA, 0x82DB, 0x82DC, 0x82DD, 0x82DE, 0x82DF, 0x82E0, 0x82E1, + 0x82E2, 0x82E3, 0x82E4, 0x82E5, 0x82E6, 0x82E7, 0x82E8, 0x82E9, 0x82EA, + 0x82EB, 0x82EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x82ED, 0x82EE, 0x82EF, 0x82F0, 0x82F1, 0x82F2, + 0x82F3, 0x82F4, 0x82F5, 0x82F6, 0x82F7, 0x82F8, 0x82F9, 0x82FA, 0x82FB, + 0x82FC, 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x8301, 0x8302, 0x8303, 0x8304, + 0x8305, 0x8306, 0x8307, 0x8308, 0x8309, 0x830A, 0x830B, 0x830C, 0x830D, + 0x830E, 0x830F, 0x8310, 0x8311, 0x8312, 0x8313, 0x8314, 0x8315, 0x8316, + 0x8317, 0x8318, 0x8319, 0x831A, 0x831B, 0x831C, 0x831D, 0x831E, 0x831F, + 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8327, 0x8328, + 0x8329, 0x832A, 0x832B, 0x832C, 0x832D, 0x832E, 0x832F, 0x8330, 0x8331, + 0x8332, 0x8333, 0x8334, 0x8335, 0x8336, 0x8337, 0x8338, 0x8339, 0x833A, + 0x833B, 0x833C, 0x833D, 0x833E, 0x833F, 0x8340, 0x8341, 0x8342, 0x8343, + 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834A, 0x834B, 0x834C, + 0x834D, 0x834E, 0x834F, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, + 0x8356, 0x8357, 0x8358, 0x8359, 0x835A, 0x835B, 0x835C, 0x835D, 0x835E, + 0x835F, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366, 0x8367, + 0x8368, 0x8369, 0x836A, 0x836B, 0x836C, 0x836D, 0x836E, 0x836F, 0x8370, + 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8377, 0x8378, 0x8379, + 0x837A, 0x837B, 0x837C, 0x837D, 0x837E, 0x837F, 0x8380, 0x8381, 0x8382, + 0x8383, 0x8384, 0x8385, 0x8386, 0x8387, 0x8388, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8389, 0x838A, 0x838B, 0x838C, 0x838D, 0x838E, 0x838F, 0x8390, + 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x8397, 0x8398, 0x8399, + 0x839A, 0x839B, 0x839C, 0x839D, 0x839E, 0x839F, 0x83A0, 0x83A1, 0x83A2, + 0x83A3, 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83A8, 0x83A9, 0x83AA, 0x83AB, + 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B0, 0x83B1, 0x83B2, 0x83B3, 0x83B4, + 0x83B5, 0x83B6, 0x83B7, 0x83B8, 0x83B9, 0x83BA, 0x83BB, 0x83BC, 0x83BD, + 0x83BE, 0x83BF, 0x83C0, 0x83C1, 0x83C2, 0x83C3, 0x83C4, 0x83C5, 0x83C6, + 0x83C7, 0x83C8, 0x83C9, 0x83CA, 0x83CB, 0x83CC, 0x83CD, 0x83CE, 0x83CF, + 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D4, 0x83D5, 0x83D6, 0x83D7, 0x83D8, + 0x83D9, 0x83DA, 0x83DB, 0x83DC, 0x83DD, 0x83DE, 0x83DF, 0x83E0, 0x83E1, + 0x83E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x83E3, 0x83E4, + 0x83E5, 0x83E6, 0x83E7, 0x83E8, 0x83E9, 0x83EA, 0x83EB, 0x83EC, 0x83ED, + 0x83EE, 0x83EF, 0x83F0, 0x83F1, 0x83F2, 0x83F3, 0x83F4, 0x83F5, 0x83F6, + 0x83F7, 0x83F8, 0x0000, 0x0000, 0x83F9, 0x83FA, 0x83FB, 0x83FC, 0x83FD, + 0x83FE, 0x0000, 0x0000, 0x83FF, 0x8400, 0x8401, 0x8402, 0x8403, 0x8404, + 0x8405, 0x8406, 0x8407, 0x8408, 0x8409, 0x840A, 0x840B, 0x840C, 0x840D, + 0x840E, 0x840F, 0x8410, 0x8411, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, + 0x8417, 0x8418, 0x8419, 0x841A, 0x841B, 0x841C, 0x841D, 0x841E, 0x841F, + 0x8420, 0x8421, 0x8422, 0x8423, 0x8424, 0x0000, 0x0000, 0x8425, 0x8426, + 0x8427, 0x8428, 0x8429, 0x842A, 0x0000, 0x0000, 0x842B, 0x842C, 0x842D, + 0x842E, 0x842F, 0x8430, 0x8431, 0x8432, 0x0000, 0x8433, 0x0000, 0x8434, + 0x0000, 0x8435, 0x0000, 0x8436, 0x8437, 0x8438, 0x8439, 0x843A, 0x843B, + 0x843C, 0x843D, 0x843E, 0x843F, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, + 0x8445, 0x8446, 0x8447, 0x8448, 0x8449, 0x844A, 0x844B, 0x844C, 0x844D, + 0x844E, 0x844F, 0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x0000, 0x0000, + 0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845A, 0x845B, 0x845C, 0x845D, + 0x845E, 0x845F, 0x8460, 0x8461, 0x8462, 0x8463, 0x8464, 0x8465, 0x8466, + 0x8467, 0x8468, 0x8469, 0x846A, 0x846B, 0x846C, 0x846D, 0x846E, 0x846F, + 0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8476, 0x8477, 0x8478, + 0x8479, 0x847A, 0x847B, 0x847C, 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, + 0x8482, 0x8483, 0x8484, 0x8485, 0x8486, 0x8487, 0x8488, 0x8489, 0x0000, + 0x848A, 0x848B, 0x848C, 0x848D, 0x848E, 0x848F, 0x8490, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8491, 0x8492, 0x8493, 0x0000, 0x8494, 0x8495, + 0x8496, 0x8497, 0x8498, 0x8499, 0x849A, 0x0000, 0x0000, 0x0000, 0x849B, + 0x849C, 0x849D, 0x849E, 0x0000, 0x0000, 0x849F, 0x84A0, 0x84A1, 0x84A2, + 0x84A3, 0x84A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x84A5, 0x84A6, 0x84A7, + 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84AF, 0x84B0, + 0x84B1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84B2, 0x84B3, 0x84B4, + 0x0000, 0x84B5, 0x84B6, 0x84B7, 0x84B8, 0x84B9, 0x84BA, 0x84BB, 0x84BC, + 0x84BD, 0x0000, 0x84BE, 0x84BF, 0x84C0, 0x84C1, 0x84C2, 0x84C3, 0x84C4, + 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x84C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CA, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x84CB, 0x20FA, 0x3009, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x84CC, 0x0000, 0x0000, 0x0000, 0x20FC, + 0x300C, 0x0000, 0x20FE, 0x300F, 0x0000, 0x0000, 0x0000, 0x0000, 0x2100, + 0x0000, 0x2102, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2104, 0x2106, 0x2108, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CD, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CE, 0x84CF, 0x0000, + 0x0000, 0x84D0, 0x84D1, 0x84D2, 0x84D3, 0x84D4, 0x84D5, 0x84D6, 0x84D7, + 0x84D8, 0x84D9, 0x84DA, 0x84DB, 0x84DC, 0x84DD, 0x84DE, 0x84DF, 0x84E0, + 0x84E1, 0x84E2, 0x84E3, 0x84E4, 0x84E5, 0x84E6, 0x84E7, 0x84E8, 0x84E9, + 0x84EA, 0x0000, 0x84EB, 0x84EC, 0x84ED, 0x84EE, 0x84EF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x210A, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3012, 0x3015, 0x84F0, + 0x210C, 0x0000, 0x3018, 0x301B, 0x84F1, 0x0000, 0x210E, 0x84F2, 0x84F3, + 0x84F4, 0x84F5, 0x84F6, 0x84F7, 0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x0000, + 0x84FC, 0x2110, 0x0000, 0x0000, 0x84FD, 0x84FE, 0x84FF, 0x8500, 0x8501, + 0x8502, 0x8503, 0x2112, 0x301E, 0x2114, 0x8504, 0x8505, 0x0000, 0x8506, + 0x8507, 0x8508, 0x0000, 0x8509, 0x850A, 0x850B, 0x850C, 0x850D, 0x850E, + 0x850F, 0x8510, 0x0000, 0x8511, 0x8512, 0x8513, 0x8514, 0x8515, 0x8516, + 0x8517, 0x0000, 0x3021, 0x8518, 0x8519, 0x851A, 0x851B, 0x851C, 0x0000, + 0x0000, 0x0000, 0x0000, 0x851D, 0x851E, 0x851F, 0x8520, 0x8521, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3024, 0x3027, 0x4005, 0x302A, + 0x302D, 0x3030, 0x3033, 0x3036, 0x3039, 0x303C, 0x303F, 0x3042, 0x3045, + 0x3048, 0x304B, 0x2116, 0x8522, 0x2118, 0x304E, 0x211A, 0x8523, 0x211C, + 0x3051, 0x400A, 0x211E, 0x8524, 0x2120, 0x3054, 0x8525, 0x8526, 0x8527, + 0x8528, 0x8529, 0x2122, 0x3057, 0x2124, 0x852A, 0x2126, 0x305A, 0x400F, + 0x2128, 0x852B, 0x212A, 0x305D, 0x852C, 0x852D, 0x852E, 0x852F, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3060, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x212C, 0x212E, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2130, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2132, 0x2134, 0x2136, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8530, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8531, 0x0000, 0x0000, 0x8532, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2138, 0x0000, 0x213A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x213C, 0x3063, 0x0000, 0x213E, 0x3066, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2140, 0x0000, 0x0000, 0x2142, 0x0000, 0x0000, + 0x2144, 0x0000, 0x2146, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2148, 0x0000, + 0x214A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x214C, 0x214E, 0x2150, 0x2152, 0x2154, 0x0000, 0x0000, + 0x2156, 0x2158, 0x0000, 0x0000, 0x215A, 0x215C, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x215E, 0x2160, 0x0000, 0x0000, 0x2162, 0x2164, + 0x0000, 0x0000, 0x2166, 0x2168, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x216A, 0x216C, 0x216E, 0x2170, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2172, 0x2174, 0x2176, 0x2178, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x217A, 0x217C, 0x217E, 0x2180, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8533, 0x8534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3069, 0x306C, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x2182, + 0x2184, 0x2186, 0x2188, 0x218A, 0x218C, 0x218E, 0x2190, 0x3081, 0x3084, + 0x3087, 0x308A, 0x308D, 0x3090, 0x3093, 0x3096, 0x3099, 0x2192, 0x309C, + 0x309F, 0x2194, 0x2196, 0x2198, 0x219A, 0x219C, 0x30A2, 0x8535, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8536, 0x8537, 0x8538, + 0x8539, 0x853A, 0x853B, 0x853C, 0x853D, 0x853E, 0x219E, 0x21A0, 0x21A2, + 0x21A4, 0x21A6, 0x21A8, 0x21AA, 0x21AC, 0x21AE, 0x21B0, 0x21B2, 0x30A5, + 0x30A8, 0x30AB, 0x30AE, 0x30B1, 0x30B4, 0x30B7, 0x30BA, 0x30BD, 0x4014, + 0x4019, 0x401E, 0x4023, 0x4028, 0x402D, 0x4032, 0x4037, 0x403C, 0x4041, + 0x4046, 0x21B4, 0x21B6, 0x21B8, 0x21BA, 0x21BC, 0x21BE, 0x21C0, 0x21C2, + 0x21C4, 0x30C0, 0x30C3, 0x30C6, 0x30C9, 0x30CC, 0x30CF, 0x30D2, 0x30D5, + 0x30D8, 0x30DB, 0x30DE, 0x30E1, 0x30E4, 0x30E7, 0x30EA, 0x30ED, 0x30F0, + 0x30F3, 0x30F6, 0x30F9, 0x30FC, 0x30FF, 0x3102, 0x3105, 0x3108, 0x310B, + 0x310E, 0x3111, 0x3114, 0x3117, 0x311A, 0x311D, 0x3120, 0x3123, 0x3126, + 0x3129, 0x312C, 0x853F, 0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, + 0x8546, 0x8547, 0x8548, 0x8549, 0x854A, 0x854B, 0x854C, 0x854D, 0x854E, + 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, + 0x8558, 0x8559, 0x855A, 0x855B, 0x855C, 0x855D, 0x855E, 0x855F, 0x8560, + 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568, 0x8569, + 0x856A, 0x856B, 0x856C, 0x856D, 0x856E, 0x856F, 0x8570, 0x8571, 0x8572, + 0x8573, 0x21C6, 0x21C8, 0x21CA, 0x21CC, 0x21CE, 0x21D0, 0x21D2, 0x21D4, + 0x21D6, 0x21D8, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578, 0x8579, 0x857A, + 0x857B, 0x857C, 0x21DA, 0x857D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x857E, 0x857F, 0x8580, 0x8581, 0x8582, + 0x8583, 0x8584, 0x8585, 0x8586, 0x21DC, 0x8587, 0x8588, 0x8589, 0x858A, + 0x858B, 0x858C, 0x858D, 0x858E, 0x858F, 0x21DE, 0x8590, 0x8591, 0x8592, + 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x21E0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x404B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x312F, 0x21E2, 0x3132, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x21E4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8599, 0x859A, 0x859B, 0x859C, 0x859D, 0x859E, 0x859F, + 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A4, 0x85A5, 0x0000, 0x0000, 0x0000, + 0x0000, 0x85A6, 0x85A7, 0x85A8, 0x85A9, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x85AA, 0x85AB, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x85AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x85AD, 0x85AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AF, + 0x0000, 0x0000, 0x85B0, 0x0000, 0x85B1, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85B2, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x85B3, 0x0000, 0x0000, 0x0000, 0x0000, + 0x85B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85B5, 0x85B6, 0x0000, + 0x0000, 0x0000, 0x85B7, 0x85B8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x85B9, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85BA, + 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0, 0x85C1, 0x85C2, 0x85C3, + 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85C9, 0x85CA, 0x85CB, 0x85CC, + 0x85CD, 0x85CE, 0x85CF, 0x85D0, 0x85D1, 0x85D2, 0x85D3, 0x85D4, 0x85D5, + 0x85D6, 0x85D7, 0x85D8, 0x85D9, 0x85DA, 0x85DB, 0x85DC, 0x85DD, 0x85DE, + 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E4, 0x85E5, 0x85E6, 0x85E7, + 0x85E8, 0x85E9, 0x85EA, 0x85EB, 0x85EC, 0x85ED, 0x85EE, 0x85EF, 0x85F0, + 0x85F1, 0x85F2, 0x85F3, 0x85F4, 0x85F5, 0x85F6, 0x85F7, 0x85F8, 0x85F9, + 0x85FA, 0x85FB, 0x85FC, 0x85FD, 0x85FE, 0x85FF, 0x8600, 0x8601, 0x8602, + 0x8603, 0x8604, 0x8605, 0x8606, 0x8607, 0x8608, 0x8609, 0x860A, 0x860B, + 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8611, 0x8612, 0x8613, 0x8614, + 0x8615, 0x8616, 0x8617, 0x8618, 0x8619, 0x861A, 0x861B, 0x861C, 0x861D, + 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, 0x8626, + 0x8627, 0x8628, 0x8629, 0x862A, 0x862B, 0x862C, 0x862D, 0x862E, 0x862F, + 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8638, + 0x8639, 0x863A, 0x863B, 0x863C, 0x863D, 0x863E, 0x863F, 0x8640, 0x8641, + 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, 0x864A, + 0x864B, 0x864C, 0x864D, 0x864E, 0x864F, 0x8650, 0x8651, 0x8652, 0x8653, + 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865A, 0x865B, 0x865C, + 0x865D, 0x865E, 0x865F, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8665, + 0x8666, 0x8667, 0x8668, 0x8669, 0x866A, 0x866B, 0x866C, 0x866D, 0x866E, + 0x866F, 0x8670, 0x8671, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, + 0x8678, 0x8679, 0x867A, 0x867B, 0x867C, 0x867D, 0x867E, 0x867F, 0x8680, + 0x8681, 0x8682, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689, + 0x868A, 0x868B, 0x868C, 0x868D, 0x868E, 0x868F, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8690, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8691, 0x0000, 0x8692, 0x8693, 0x8694, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E6, 0x0000, + 0x21E8, 0x0000, 0x21EA, 0x0000, 0x21EC, 0x0000, 0x21EE, 0x0000, 0x21F0, + 0x0000, 0x21F2, 0x0000, 0x21F4, 0x0000, 0x21F6, 0x0000, 0x21F8, 0x0000, + 0x21FA, 0x0000, 0x21FC, 0x0000, 0x0000, 0x21FE, 0x0000, 0x2200, 0x0000, + 0x2202, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2204, 0x2206, + 0x0000, 0x2208, 0x220A, 0x0000, 0x220C, 0x220E, 0x0000, 0x2210, 0x2212, + 0x0000, 0x2214, 0x2216, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2218, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221A, 0x221C, 0x0000, 0x221E, + 0x2220, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2222, 0x0000, 0x2224, 0x0000, 0x2226, + 0x0000, 0x2228, 0x0000, 0x222A, 0x0000, 0x222C, 0x0000, 0x222E, 0x0000, + 0x2230, 0x0000, 0x2232, 0x0000, 0x2234, 0x0000, 0x2236, 0x0000, 0x2238, + 0x0000, 0x0000, 0x223A, 0x0000, 0x223C, 0x0000, 0x223E, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2240, 0x2242, 0x0000, 0x2244, 0x2246, + 0x0000, 0x2248, 0x224A, 0x0000, 0x224C, 0x224E, 0x0000, 0x2250, 0x2252, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2254, 0x0000, 0x0000, 0x2256, 0x2258, + 0x225A, 0x225C, 0x0000, 0x0000, 0x0000, 0x225E, 0x2260, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8695, 0x8696, 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, + 0x869C, 0x869D, 0x869E, 0x869F, 0x86A0, 0x86A1, 0x86A2, 0x86A3, 0x86A4, + 0x86A5, 0x86A6, 0x86A7, 0x86A8, 0x86A9, 0x86AA, 0x86AB, 0x86AC, 0x86AD, + 0x86AE, 0x86AF, 0x86B0, 0x86B1, 0x86B2, 0x86B3, 0x86B4, 0x86B5, 0x86B6, + 0x86B7, 0x86B8, 0x86B9, 0x86BA, 0x86BB, 0x86BC, 0x86BD, 0x86BE, 0x86BF, + 0x86C0, 0x86C1, 0x86C2, 0x86C3, 0x86C4, 0x86C5, 0x86C6, 0x86C7, 0x86C8, + 0x86C9, 0x86CA, 0x86CB, 0x86CC, 0x86CD, 0x86CE, 0x86CF, 0x86D0, 0x86D1, + 0x86D2, 0x86D3, 0x86D4, 0x86D5, 0x86D6, 0x86D7, 0x86D8, 0x86D9, 0x86DA, + 0x86DB, 0x86DC, 0x86DD, 0x86DE, 0x86DF, 0x86E0, 0x86E1, 0x86E2, 0x86E3, + 0x86E4, 0x86E5, 0x86E6, 0x86E7, 0x86E8, 0x86E9, 0x86EA, 0x86EB, 0x86EC, + 0x86ED, 0x86EE, 0x86EF, 0x86F0, 0x86F1, 0x86F2, 0x0000, 0x0000, 0x0000, + 0x86F3, 0x86F4, 0x86F5, 0x86F6, 0x86F7, 0x86F8, 0x86F9, 0x86FA, 0x86FB, + 0x86FC, 0x86FD, 0x86FE, 0x86FF, 0x8700, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3135, 0x3138, 0x313B, 0x313E, 0x3141, 0x3144, 0x3147, + 0x314A, 0x314D, 0x3150, 0x3153, 0x3156, 0x3159, 0x315C, 0x4050, 0x4055, + 0x405A, 0x405F, 0x4064, 0x4069, 0x406E, 0x4073, 0x4078, 0x407D, 0x4082, + 0x4087, 0x408C, 0x4091, 0x4096, 0x409B, 0x40A3, 0x0000, 0x315F, 0x3162, + 0x3165, 0x3168, 0x316B, 0x316E, 0x3171, 0x3174, 0x3177, 0x317A, 0x317D, + 0x3180, 0x3183, 0x3186, 0x3189, 0x318C, 0x318F, 0x3192, 0x3195, 0x3198, + 0x319B, 0x319E, 0x31A1, 0x31A4, 0x31A7, 0x31AA, 0x31AD, 0x31B0, 0x31B3, + 0x31B6, 0x31B9, 0x31BC, 0x31BF, 0x31C2, 0x31C5, 0x31C8, 0x8701, 0x8702, + 0x8703, 0x8704, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x31CB, 0x2262, 0x2264, 0x2266, 0x2268, 0x226A, 0x226C, 0x226E, + 0x2270, 0x2272, 0x2274, 0x2276, 0x2278, 0x227A, 0x227C, 0x227E, 0x8705, + 0x8706, 0x8707, 0x8708, 0x8709, 0x870A, 0x870B, 0x870C, 0x870D, 0x870E, + 0x870F, 0x8710, 0x8711, 0x8712, 0x2280, 0x2282, 0x2284, 0x2286, 0x2288, + 0x228A, 0x228C, 0x228E, 0x2290, 0x2292, 0x2294, 0x2296, 0x2298, 0x229A, + 0x40AA, 0x40B0, 0x229C, 0x0000, 0x8713, 0x8714, 0x8715, 0x8716, 0x8717, + 0x8718, 0x8719, 0x871A, 0x871B, 0x871C, 0x871D, 0x871E, 0x871F, 0x8720, + 0x8721, 0x8722, 0x8723, 0x8724, 0x8725, 0x8726, 0x8727, 0x8728, 0x8729, + 0x872A, 0x872B, 0x872C, 0x872D, 0x872E, 0x872F, 0x8730, 0x8731, 0x8732, + 0x8733, 0x8734, 0x8735, 0x8736, 0x8737, 0x8738, 0x8739, 0x873A, 0x873B, + 0x873C, 0x873D, 0x873E, 0x873F, 0x8740, 0x8741, 0x8742, 0x8743, 0x229E, + 0x22A0, 0x22A2, 0x22A4, 0x22A6, 0x22A8, 0x22AA, 0x22AC, 0x22AE, 0x22B0, + 0x22B2, 0x22B4, 0x22B6, 0x22B8, 0x22BA, 0x22BC, 0x22BE, 0x22C0, 0x22C2, + 0x22C4, 0x22C6, 0x22C8, 0x22CA, 0x22CC, 0x31CE, 0x31D1, 0x31D4, 0x22CE, + 0x31D7, 0x22D0, 0x31DA, 0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, + 0x874A, 0x874B, 0x874C, 0x874D, 0x874E, 0x874F, 0x8750, 0x8751, 0x8752, + 0x8753, 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, 0x875A, 0x875B, + 0x875C, 0x875D, 0x875E, 0x875F, 0x8760, 0x8761, 0x8762, 0x8763, 0x8764, + 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, + 0x876E, 0x876F, 0x8770, 0x8771, 0x8772, 0x0000, 0x40B5, 0x40BA, 0x40BF, + 0x31DD, 0x40C4, 0x31E0, 0x31E3, 0x40C9, 0x40CF, 0x31E6, 0x31E9, 0x31EC, + 0x40D4, 0x40D9, 0x31EF, 0x31F2, 0x22D2, 0x31F5, 0x40DE, 0x40E3, 0x22D4, + 0x40E8, 0x40EE, 0x40F5, 0x31F8, 0x40FB, 0x4101, 0x4107, 0x31FB, 0x31FE, + 0x3201, 0x410C, 0x4111, 0x4117, 0x3204, 0x3207, 0x320A, 0x22D6, 0x22D8, + 0x22DA, 0x22DC, 0x320D, 0x3210, 0x411C, 0x3213, 0x4122, 0x4127, 0x3216, + 0x22DE, 0x22E0, 0x412D, 0x4133, 0x4138, 0x3219, 0x413E, 0x22E2, 0x321C, + 0x321F, 0x3222, 0x3225, 0x3228, 0x4144, 0x322B, 0x22E4, 0x322E, 0x3231, + 0x3234, 0x4149, 0x3237, 0x323A, 0x323D, 0x414E, 0x4154, 0x22E6, 0x4159, + 0x22E8, 0x415F, 0x4164, 0x3240, 0x3243, 0x3246, 0x4169, 0x22EA, 0x3249, + 0x416E, 0x22EC, 0x4173, 0x324C, 0x22EE, 0x22F0, 0x22F2, 0x22F4, 0x22F6, + 0x22F8, 0x22FA, 0x22FC, 0x22FE, 0x2300, 0x324F, 0x3252, 0x3255, 0x3258, + 0x325B, 0x325E, 0x3261, 0x3264, 0x3267, 0x326A, 0x326D, 0x3270, 0x3273, + 0x3276, 0x3279, 0x327C, 0x2302, 0x2304, 0x327F, 0x2306, 0x2308, 0x230A, + 0x3282, 0x3285, 0x230C, 0x230E, 0x2310, 0x2312, 0x2314, 0x4179, 0x2316, + 0x2318, 0x231A, 0x231C, 0x231E, 0x2320, 0x2322, 0x2324, 0x3288, 0x417E, + 0x2326, 0x2328, 0x232A, 0x232C, 0x232E, 0x2330, 0x2332, 0x328B, 0x328E, + 0x3291, 0x3294, 0x2334, 0x2336, 0x2338, 0x233A, 0x233C, 0x233E, 0x2340, + 0x2342, 0x2344, 0x2346, 0x3297, 0x329A, 0x2348, 0x329D, 0x32A0, 0x32A3, + 0x234A, 0x32A6, 0x32A9, 0x4183, 0x234C, 0x32AC, 0x32AF, 0x32B2, 0x32B5, + 0x4188, 0x418E, 0x234E, 0x2350, 0x2352, 0x2354, 0x2356, 0x2358, 0x235A, + 0x235C, 0x235E, 0x2360, 0x2362, 0x2364, 0x2366, 0x2368, 0x236A, 0x236C, + 0x236E, 0x2370, 0x4195, 0x2372, 0x2374, 0x2376, 0x419A, 0x32B8, 0x2378, + 0x237A, 0x237C, 0x237E, 0x2380, 0x2382, 0x2384, 0x2386, 0x2388, 0x238A, + 0x32BB, 0x238C, 0x238E, 0x32BE, 0x32C1, 0x2390, 0x419F, 0x32C4, 0x2392, + 0x2394, 0x2396, 0x2398, 0x32C7, 0x32CA, 0x239A, 0x239C, 0x239E, 0x23A0, + 0x23A2, 0x23A4, 0x23A6, 0x23A8, 0x23AA, 0x32CD, 0x32D0, 0x32D3, 0x32D6, + 0x32D9, 0x32DC, 0x32DF, 0x32E2, 0x32E5, 0x32E8, 0x32EB, 0x32EE, 0x32F1, + 0x32F4, 0x32F7, 0x32FA, 0x32FD, 0x3300, 0x3303, 0x3306, 0x3309, 0x330C, + 0x330F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8773, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8774, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8775, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8776, 0x0000, 0x0000, + 0x0000, 0x8777, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8778, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8779, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x877A, 0x877B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x877C, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x877D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x877E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877F, 0x8780, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8781, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8782, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8783, 0x0000, 0x0000, 0x8784, 0x0000, 0x8785, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8786, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8787, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8788, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8789, 0x878A, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x878B, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x878C, 0x0000, 0x0000, + 0x0000, 0x0000, 0x878D, 0x0000, 0x878E, 0x878F, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8790, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8791, 0x0000, + 0x8792, 0x0000, 0x0000, 0x0000, 0x8793, 0x8794, 0x8795, 0x0000, 0x8796, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8797, 0x0000, 0x0000, + 0x0000, 0x8798, 0x0000, 0x0000, 0x8799, 0x0000, 0x0000, 0x0000, 0x879A, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x879B, 0x0000, + 0x0000, 0x0000, 0x879C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x879D, 0x0000, 0x0000, 0x879E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x879F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x87A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x87A1, 0x0000, 0x87A2, 0x0000, 0x87A3, 0x0000, 0x0000, 0x0000, 0x0000, + 0x87A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A5, 0x0000, + 0x0000, 0x0000, 0x87A6, 0x87A7, 0x0000, 0x0000, 0x87A8, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x87A9, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87AA, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87AB, 0x0000, 0x0000, 0x0000, + 0x0000, 0x87AC, 0x0000, 0x0000, 0x87AD, 0x87AE, 0x87AF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x87B1, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x87B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B3, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x87B4, 0x0000, 0x87B5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x87B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x87B7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B8, 0x87B9, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BA, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x87BB, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BC, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BD, 0x0000, 0x0000, 0x0000, + 0x0000, 0x87BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x87BF, 0x0000, 0x0000, 0x87C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x87C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C2, 0x0000, 0x87C3, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x87C5, 0x87C6, 0x0000, 0x87C7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x87C8, 0x0000, 0x0000, 0x0000, 0x87C9, 0x0000, 0x87CA, 0x87CB, 0x0000, + 0x87CC, 0x87CD, 0x0000, 0x0000, 0x0000, 0x87CE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87CF, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x87D0, 0x0000, 0x87D1, 0x0000, 0x87D2, 0x0000, 0x0000, 0x0000, + 0x87D3, 0x87D4, 0x0000, 0x0000, 0x0000, 0x87D5, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x87D6, 0x0000, 0x87D7, 0x0000, 0x87D8, 0x0000, 0x0000, + 0x87D9, 0x0000, 0x0000, 0x87DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87DB, + 0x0000, 0x87DC, 0x0000, 0x87DD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x87DE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x87DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x87E0, 0x0000, 0x87E1, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E2, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x87E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E4, 0x0000, 0x87E5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E6, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x87E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x87E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x87E9, 0x0000, 0x0000, 0x87EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87EB, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x87EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x87ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x87EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x87EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F0, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x87F1, 0x87F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F3, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F4, 0x0000, 0x87F5, + 0x0000, 0x87F6, 0x0000, 0x0000, 0x0000, 0x87F7, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F8, 0x87F9, + 0x0000, 0x0000, 0x87FA, 0x0000, 0x0000, 0x0000, 0x87FB, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x87FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FD, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x87FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FF, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8801, 0x0000, 0x8802, 0x8803, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8804, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8805, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8806, 0x8807, 0x8808, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8809, 0x0000, 0x0000, 0x880A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x880B, 0x0000, 0x0000, 0x0000, 0x880C, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x880D, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x880E, 0x0000, 0x0000, 0x880F, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8810, 0x8811, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8812, 0x0000, 0x0000, 0x8813, + 0x0000, 0x8814, 0x0000, 0x0000, 0x0000, 0x8815, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8816, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8817, 0x0000, 0x0000, 0x0000, 0x0000, 0x8818, 0x0000, + 0x0000, 0x0000, 0x8819, 0x0000, 0x0000, 0x0000, 0x0000, 0x881A, 0x0000, + 0x0000, 0x0000, 0x881B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x881C, 0x0000, 0x881D, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x881E, 0x881F, 0x8820, 0x0000, 0x8821, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8822, 0x8823, 0x8824, 0x0000, + 0x0000, 0x8825, 0x0000, 0x0000, 0x8826, 0x8827, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8828, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8829, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x882A, 0x0000, 0x0000, 0x0000, 0x882B, + 0x0000, 0x882C, 0x0000, 0x0000, 0x0000, 0x0000, 0x882D, 0x882E, 0x0000, + 0x0000, 0x882F, 0x0000, 0x8830, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8831, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8832, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8833, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8834, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8835, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8836, 0x0000, 0x8837, 0x0000, 0x0000, 0x8838, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8839, 0x883A, 0x0000, 0x0000, 0x0000, 0x883B, + 0x0000, 0x0000, 0x883C, 0x0000, 0x0000, 0x0000, 0x0000, 0x883D, 0x0000, + 0x0000, 0x883E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x883F, 0x0000, 0x8840, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8841, 0x0000, 0x0000, 0x0000, 0x8842, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8843, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8844, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8845, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8846, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8847, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8848, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8849, 0x0000, 0x0000, 0x0000, + 0x0000, 0x884A, 0x884B, 0x884C, 0x0000, 0x0000, 0x0000, 0x884D, 0x884E, + 0x0000, 0x0000, 0x884F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8850, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8851, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8852, + 0x0000, 0x8853, 0x8854, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8855, 0x0000, 0x8856, 0x0000, 0x0000, 0x8857, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8858, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8859, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x885A, 0x0000, 0x885B, 0x885C, 0x0000, 0x0000, 0x0000, 0x885D, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x885E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x885F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8860, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8862, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8863, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8864, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8865, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8866, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8867, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8868, + 0x8869, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886A, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x886B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886C, + 0x0000, 0x0000, 0x0000, 0x886D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x886E, 0x0000, 0x0000, 0x886F, 0x8870, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8871, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8872, 0x0000, 0x0000, 0x8873, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8874, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8875, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8876, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8877, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8878, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8879, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x887A, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x887B, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x887C, 0x0000, 0x0000, 0x0000, + 0x887D, 0x887E, 0x0000, 0x887F, 0x0000, 0x8880, 0x8881, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8882, 0x8883, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8884, 0x8885, 0x0000, + 0x0000, 0x8886, 0x0000, 0x8887, 0x8888, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8889, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888A, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x888B, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x888C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888D, 0x0000, + 0x888E, 0x0000, 0x0000, 0x888F, 0x8890, 0x0000, 0x0000, 0x0000, 0x8891, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8892, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8893, 0x0000, 0x8894, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8895, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8896, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8897, + 0x0000, 0x8898, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8899, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x889A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x889B, 0x0000, 0x0000, + 0x889C, 0x0000, 0x0000, 0x889D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x889E, 0x0000, + 0x0000, 0x889F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x88A0, 0x0000, 0x88A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A2, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A3, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x88A4, 0x0000, 0x0000, 0x0000, 0x88A5, 0x0000, + 0x88A6, 0x0000, 0x88A7, 0x88A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A9, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88AA, 0x0000, 0x88AB, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x88AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88AD, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88AE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x88AF, 0x0000, 0x0000, 0x88B0, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B1, + 0x0000, 0x0000, 0x88B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x88B3, 0x88B4, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x88B5, 0x0000, 0x0000, 0x0000, 0x88B6, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B7, 0x88B8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x88B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BA, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BB, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x88BC, 0x88BD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x88BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x88BF, 0x0000, 0x0000, 0x88C0, 0x0000, 0x88C1, 0x88C2, 0x88C3, 0x88C4, + 0x88C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88C6, 0x0000, 0x0000, + 0x88C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88C8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x88C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88CA, + 0x0000, 0x88CB, 0x0000, 0x88CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x88CD, 0x0000, 0x0000, 0x0000, 0x88CE, 0x0000, 0x88CF, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x88D0, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D1, 0x0000, + 0x0000, 0x0000, 0x0000, 0x88D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D3, 0x0000, + 0x88D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x88D5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x88D6, 0x0000, 0x0000, 0x0000, 0x88D7, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x88D8, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D9, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x88DA, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88DB, 0x88DC, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88DD, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x88DE, 0x88DF, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E0, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x88E1, 0x88E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E3, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E4, + 0x0000, 0x0000, 0x88E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x88E6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x88E7, 0x0000, 0x88E8, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E9, + 0x0000, 0x88EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x88EB, 0x0000, 0x0000, + 0x0000, 0x88EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88ED, + 0x88EE, 0x0000, 0x0000, 0x88EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x88F0, + 0x0000, 0x0000, 0x88F1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88F2, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x88F3, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x88F4, 0x88F5, 0x88F6, 0x0000, 0x0000, 0x0000, 0x88F7, 0x0000, + 0x0000, 0x0000, 0x88F8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x88F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x88FA, 0x0000, 0x0000, 0x88FB, 0x0000, 0x0000, 0x0000, 0x88FC, + 0x0000, 0x0000, 0x0000, 0x88FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x88FE, 0x0000, 0x88FF, 0x0000, 0x0000, 0x8900, 0x8901, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8902, + 0x0000, 0x0000, 0x0000, 0x8903, 0x0000, 0x0000, 0x0000, 0x0000, 0x8904, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8905, 0x0000, 0x0000, 0x0000, 0x8906, 0x8907, 0x8908, 0x0000, 0x8909, + 0x0000, 0x890A, 0x0000, 0x890B, 0x0000, 0x890C, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x890D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x890E, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x890F, + 0x0000, 0x8910, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8911, + 0x0000, 0x8912, 0x0000, 0x0000, 0x0000, 0x8913, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8914, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8915, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8916, 0x0000, 0x0000, 0x8917, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8918, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8919, 0x891A, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x891B, 0x0000, 0x891C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x891D, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x891E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x891F, 0x8920, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8921, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8922, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8923, + 0x8924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8925, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8926, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8927, 0x0000, 0x0000, + 0x8928, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8929, 0x0000, + 0x0000, 0x0000, 0x892A, 0x0000, 0x0000, 0x892B, 0x0000, 0x0000, 0x0000, + 0x0000, 0x892C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x892D, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x892E, 0x0000, 0x0000, 0x892F, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8930, 0x0000, 0x0000, 0x0000, 0x8931, 0x0000, 0x8932, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8933, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8934, 0x8935, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8936, 0x0000, 0x0000, 0x8937, 0x8938, 0x0000, 0x8939, + 0x0000, 0x0000, 0x893A, 0x0000, 0x0000, 0x893B, 0x0000, 0x0000, 0x893C, + 0x893D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x893E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x893F, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8940, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8941, 0x0000, 0x0000, + 0x8942, 0x8943, 0x8944, 0x8945, 0x0000, 0x8946, 0x0000, 0x0000, 0x8947, + 0x0000, 0x0000, 0x8948, 0x8949, 0x894A, 0x0000, 0x894B, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x894C, 0x0000, 0x894D, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x894E, 0x0000, 0x0000, 0x0000, + 0x0000, 0x894F, 0x0000, 0x8950, 0x0000, 0x0000, 0x8951, 0x0000, 0x8952, + 0x8953, 0x8954, 0x0000, 0x0000, 0x0000, 0x0000, 0x8955, 0x8956, 0x8957, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8958, 0x0000, 0x8959, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x895A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x895B, 0x895C, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x895D, + 0x0000, 0x0000, 0x895E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x895F, 0x8960, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8961, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8962, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8963, 0x0000, 0x0000, 0x0000, 0x0000, 0x8964, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8966, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8967, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8968, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8969, 0x896A, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x896B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x896C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x896D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x896E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x896F, 0x0000, 0x8970, 0x8971, 0x0000, 0x8972, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8973, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8974, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8975, 0x0000, 0x0000, 0x0000, 0x8976, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8977, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8978, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8979, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x897A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x897B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x897C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x897D, 0x0000, 0x0000, + 0x0000, 0x897E, 0x0000, 0x0000, 0x0000, 0x0000, 0x897F, 0x0000, 0x8980, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8981, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8982, 0x8983, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8984, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8985, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8986, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8987, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8988, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8989, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x898A, 0x0000, 0x0000, 0x0000, 0x0000, 0x898B, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898C, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898D, 0x0000, 0x0000, 0x0000, + 0x898E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898F, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8990, 0x0000, 0x8991, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8992, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8993, 0x0000, 0x0000, 0x8994, 0x8995, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8996, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8997, 0x8998, 0x0000, 0x0000, 0x8999, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x899A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x899B, + 0x0000, 0x0000, 0x0000, 0x0000, 0x899C, 0x0000, 0x0000, 0x0000, 0x0000, + 0x899D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x899E, 0x899F, 0x89A0, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x89A1, 0x0000, 0x0000, 0x89A2, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A3, 0x0000, 0x0000, + 0x89A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x89A5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x89A6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x89A7, 0x0000, 0x89A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A9, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x89AA, 0x0000, 0x0000, 0x89AB, 0x0000, + 0x0000, 0x89AC, 0x89AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x89AE, 0x89AF, 0x0000, 0x0000, 0x0000, + 0x89B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x89B1, 0x0000, 0x0000, 0x89B2, + 0x0000, 0x0000, 0x89B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x89B4, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89B5, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x89B6, 0x89B7, 0x0000, 0x89B8, 0x89B9, 0x89BA, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89BB, 0x0000, 0x89BC, 0x89BD, + 0x0000, 0x89BE, 0x89BF, 0x89C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x89C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C2, 0x0000, 0x89C3, + 0x89C4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x89C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x89C7, 0x0000, 0x0000, 0x89C8, 0x0000, 0x0000, 0x0000, + 0x89C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x89CA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x89CB, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x89CC, 0x0000, 0x89CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x89CE, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CF, 0x89D0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D1, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x89D2, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x89D3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D4, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D5, 0x0000, 0x0000, 0x89D6, + 0x89D7, 0x0000, 0x0000, 0x89D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x89D9, 0x0000, 0x89DA, 0x0000, 0x0000, 0x0000, 0x89DB, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DC, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DD, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DE, + 0x0000, 0x0000, 0x0000, 0x89DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E1, 0x89E2, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E3, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x89E4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E5, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x89E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x89E8, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x89E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x89EA, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EB, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x89EC, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x89ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EE, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F0, + 0x0000, 0x0000, 0x89F1, 0x0000, 0x89F2, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F3, 0x89F4, 0x0000, + 0x0000, 0x0000, 0x89F5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F6, 0x0000, 0x89F7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F8, 0x0000, 0x0000, + 0x0000, 0x89F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FA, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FB, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x89FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x89FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x89FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x89FF, 0x8A00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8A01, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A02, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A03, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A04, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A05, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A06, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A07, 0x8A08, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A09, 0x0000, 0x8A0A, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A0B, 0x0000, 0x0000, 0x8A0C, 0x0000, 0x0000, 0x8A0D, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A0E, 0x0000, 0x0000, 0x8A0F, 0x0000, + 0x0000, 0x8A10, 0x8A11, 0x0000, 0x8A12, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A13, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8A14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A15, 0x8A16, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8A17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A18, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A19, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A1A, 0x0000, 0x8A1B, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A1C, 0x0000, 0x0000, 0x8A1D, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1E, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1F, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A20, 0x8A21, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A22, 0x8A23, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8A24, 0x8A25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A28, 0x0000, 0x0000, 0x0000, 0x8A29, 0x0000, 0x8A2A, 0x0000, + 0x0000, 0x8A2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A2C, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A2D, 0x0000, + 0x8A2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8A2F, 0x0000, 0x0000, 0x8A30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A31, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A32, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A33, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8A34, 0x8A35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A36, 0x0000, 0x8A37, 0x0000, 0x8A38, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A39, 0x8A3A, 0x0000, 0x0000, 0x8A3B, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3C, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A3D, 0x0000, 0x0000, 0x8A3E, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8A3F, 0x0000, 0x8A40, 0x8A41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8A42, 0x8A43, 0x8A44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A46, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8A47, 0x8A48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A49, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4A, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A4B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4C, 0x8A4D, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4E, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4F, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A50, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A51, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A52, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A53, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A57, 0x0000, 0x0000, 0x8A58, 0x0000, 0x0000, 0x0000, 0x8A59, + 0x0000, 0x0000, 0x8A5A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A5B, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8A5C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A5D, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A5E, 0x0000, 0x0000, 0x8A5F, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A60, 0x8A61, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A62, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A63, 0x0000, 0x0000, 0x8A64, 0x0000, 0x0000, + 0x8A65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A66, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A67, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8A69, 0x0000, 0x8A6A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A6B, 0x0000, 0x0000, 0x8A6C, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6D, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6E, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8A6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A70, 0x0000, 0x0000, 0x0000, 0x8A71, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A72, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A73, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A74, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A75, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A76, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A77, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8A78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8A79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A7A, 0x0000, 0x0000, 0x0000, 0x8A7B, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7E, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A7F, 0x0000, 0x0000, 0x8A80, 0x8A81, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A82, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A83, 0x0000, 0x8A84, + 0x8A85, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A86, 0x0000, 0x8A87, 0x0000, + 0x0000, 0x8A88, 0x0000, 0x8A89, 0x8A8A, 0x0000, 0x8A8B, 0x8A8C, 0x8A8D, + 0x0000, 0x0000, 0x0000, 0x8A8E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8A8F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8A90, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A91, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A92, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A93, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A94, 0x8A95, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8A96, 0x8A97, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A98, + 0x0000, 0x0000, 0x8A99, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A9A, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8A9B, 0x0000, 0x8A9C, 0x0000, 0x0000, + 0x8A9D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A9E, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8A9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA1, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8AA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA3, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8AA4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA5, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8AA6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8AA7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA8, 0x8AA9, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8AAA, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAB, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAC, + 0x8AAD, 0x0000, 0x0000, 0x0000, 0x8AAE, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8AAF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8AB0, 0x0000, 0x0000, 0x8AB1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8AB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB3, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB4, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB6, 0x0000, 0x8AB7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB9, 0x0000, + 0x0000, 0x8ABA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ABB, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8ABC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ABD, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ABE, 0x0000, + 0x0000, 0x0000, 0x8ABF, 0x8AC0, 0x0000, 0x8AC1, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8AC2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8AC3, 0x0000, 0x0000, 0x8AC4, 0x0000, 0x8AC5, 0x0000, 0x0000, 0x8AC6, + 0x0000, 0x8AC7, 0x0000, 0x0000, 0x8AC8, 0x8AC9, 0x8ACA, 0x0000, 0x8ACB, + 0x8ACC, 0x8ACD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8ACE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ACF, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8AD0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AD1, + 0x0000, 0x8AD2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8AD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AD4, + 0x0000, 0x8AD5, 0x0000, 0x0000, 0x8AD6, 0x0000, 0x8AD7, 0x8AD8, 0x0000, + 0x0000, 0x8AD9, 0x0000, 0x0000, 0x8ADA, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8ADB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADC, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADD, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8ADE, 0x0000, 0x8ADF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE1, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8AE2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8AE3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE4, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8AE5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8AE6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8AE8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE9, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEA, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEB, 0x0000, 0x0000, 0x0000, 0x8AEC, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AED, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8AEE, 0x0000, 0x0000, 0x0000, 0x8AEF, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8AF0, 0x0000, 0x8AF1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF2, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF3, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF4, 0x0000, 0x0000, 0x0000, + 0x8AF5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8AF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8AF9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AFA, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8AFB, 0x0000, 0x0000, 0x0000, 0x8AFC, 0x8AFD, 0x8AFE, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8AFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B00, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8B01, 0x8B02, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8B03, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8B04, 0x0000, 0x0000, 0x0000, 0x8B05, 0x0000, 0x0000, + 0x0000, 0x8B06, 0x0000, 0x0000, 0x8B07, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8B08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8B09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0A, 0x0000, + 0x0000, 0x8B0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8B0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8B0D, 0x0000, 0x0000, 0x8B0E, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0F, 0x8B10, 0x8B11, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B12, + 0x8B13, 0x8B14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B15, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8B16, 0x8B17, 0x0000, 0x0000, 0x0000, 0x8B18, 0x8B19, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8B1A, 0x8B1B, 0x0000, 0x0000, 0x0000, 0x8B1C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8B1D, 0x8B1E, 0x0000, 0x8B1F, 0x0000, 0x0000, 0x8B20, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B21, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8B22, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8B23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8B24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8B25, 0x0000, 0x0000, 0x0000, 0x8B26, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8B27, 0x0000, 0x0000, 0x0000, 0x8B28, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8B29, 0x0000, 0x8B2A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8B2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8B2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B2D, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B2E, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8B2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B30, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8B31, 0x0000, 0x0000, 0x8B32, 0x0000, + 0x8B33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B34, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8B35, 0x0000, 0x8B36, 0x0000, 0x0000, 0x0000, 0x8B37, + 0x8B38, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B39, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B3A, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8B3B, 0x0000, 0x8B3C, 0x8B3D, 0x0000, 0x0000, 0x8B3E, 0x8B3F, 0x0000, + 0x0000, 0x0000, 0x8B40, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B41, 0x0000, + 0x0000, 0x8B42, 0x0000, 0x8B43, 0x0000, 0x0000, 0x0000, 0x8B44, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B45, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8B46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B47, 0x8B48, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B49, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B4A, + 0x8B4B, 0x0000, 0x8B4C, 0x0000, 0x8B4D, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8B4E, 0x0000, 0x8B4F, 0x0000, 0x8B50, 0x0000, + 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0x8B56, 0x0000, 0x8B57, 0x0000, + 0x8B58, 0x0000, 0x0000, 0x8B59, 0x0000, 0x0000, 0x8B5A, 0x8B5B, 0x8B5C, + 0x0000, 0x8B5D, 0x0000, 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x0000, + 0x0000, 0x0000, 0x8B63, 0x0000, 0x0000, 0x0000, 0x8B64, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B65, 0x0000, 0x8B66, + 0x8B67, 0x8B68, 0x8B69, 0x0000, 0x8B6A, 0x0000, 0x0000, 0x0000, 0x8B6B, + 0x8B6C, 0x0000, 0x8B6D, 0x0000, 0x0000, 0x8B6E, 0x8B6F, 0x0000, 0x8B70, + 0x8B71, 0x8B72, 0x0000, 0x8B73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8B74, 0x0000, 0x8B75, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8B76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B77, 0x0000, 0x8B78, + 0x8B79, 0x0000, 0x0000, 0x8B7A, 0x8B7B, 0x0000, 0x0000, 0x0000, 0x8B7C, + 0x0000, 0x8B7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8B7E, 0x8B7F, 0x8B80, 0x8B81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8B82, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B83, + 0x0000, 0x8B84, 0x0000, 0x0000, 0x8B85, 0x0000, 0x8B86, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8B87, 0x0000, 0x0000, 0x0000, 0x8B88, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B89, + 0x0000, 0x8B8A, 0x0000, 0x8B8B, 0x0000, 0x8B8C, 0x8B8D, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B8E, 0x8B8F, 0x0000, + 0x0000, 0x8B90, 0x8B91, 0x8B92, 0x0000, 0x8B93, 0x0000, 0x0000, 0x0000, + 0x8B94, 0x8B95, 0x8B96, 0x8B97, 0x0000, 0x8B98, 0x8B99, 0x8B9A, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8B9B, 0x0000, 0x0000, 0x8B9C, 0x0000, 0x0000, + 0x8B9D, 0x8B9E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B9F, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8BA0, 0x8BA1, 0x8BA2, 0x8BA3, 0x0000, + 0x0000, 0x8BA4, 0x8BA5, 0x0000, 0x8BA6, 0x8BA7, 0x0000, 0x8BA8, 0x0000, + 0x0000, 0x8BA9, 0x0000, 0x8BAA, 0x8BAB, 0x0000, 0x0000, 0x8BAC, 0x0000, + 0x0000, 0x8BAD, 0x0000, 0x8BAE, 0x8BAF, 0x0000, 0x8BB0, 0x0000, 0x8BB1, + 0x0000, 0x0000, 0x8BB2, 0x0000, 0x8BB3, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BB4, + 0x8BB5, 0x8BB6, 0x8BB7, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BB8, 0x8BB9, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BBA, 0x0000, 0x0000, 0x0000, + 0x8BBB, 0x0000, 0x8BBC, 0x8BBD, 0x8BBE, 0x0000, 0x0000, 0x0000, 0x8BBF, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BC0, 0x0000, + 0x0000, 0x8BC1, 0x0000, 0x0000, 0x8BC2, 0x8BC3, 0x0000, 0x0000, 0x8BC4, + 0x8BC5, 0x8BC6, 0x0000, 0x8BC7, 0x0000, 0x0000, 0x0000, 0x8BC8, 0x8BC9, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8BCA, 0x0000, 0x8BCB, 0x8BCC, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8BCD, 0x0000, 0x8BCE, 0x8BCF, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8BD0, 0x0000, 0x0000, 0x0000, 0x8BD1, 0x0000, 0x0000, 0x8BD2, 0x8BD3, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BD4, 0x8BD5, 0x8BD6, + 0x0000, 0x8BD7, 0x0000, 0x8BD8, 0x8BD9, 0x0000, 0x0000, 0x8BDA, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8BDB, 0x0000, 0x0000, 0x8BDC, 0x8BDD, + 0x8BDE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8BDF, 0x0000, 0x8BE0, 0x0000, 0x8BE1, 0x0000, 0x0000, 0x8BE2, + 0x0000, 0x0000, 0x0000, 0x8BE3, 0x0000, 0x0000, 0x8BE4, 0x0000, 0x8BE5, + 0x0000, 0x0000, 0x0000, 0x8BE6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8BE7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BE8, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BE9, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8BEA, 0x0000, 0x8BEB, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8BEC, 0x8BED, 0x0000, 0x8BEE, 0x0000, 0x0000, 0x8BEF, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF0, 0x0000, + 0x0000, 0x8BF1, 0x8BF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF3, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF4, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8BF5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8BF7, 0x0000, 0x0000, 0x0000, 0x8BF8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF9, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFA, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8BFB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8BFC, 0x8BFD, 0x0000, 0x8BFE, 0x8BFF, 0x0000, 0x8C00, + 0x8C01, 0x8C02, 0x0000, 0x8C03, 0x0000, 0x0000, 0x0000, 0x8C04, 0x8C05, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C06, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C07, + 0x0000, 0x0000, 0x8C08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8C09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8C0A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0B, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0D, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8C0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0F, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8C10, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8C11, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C12, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C13, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C14, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8C15, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8C16, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8C17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8C18, 0x8C19, 0x8C1A, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C1B, 0x0000, 0x0000, + 0x0000, 0x8C1C, 0x0000, 0x8C1D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8C1E, 0x0000, 0x8C1F, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8C20, 0x8C21, 0x0000, 0x8C22, 0x0000, 0x0000, 0x8C23, 0x0000, + 0x0000, 0x8C24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8C25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C26, 0x8C27, 0x8C28, 0x8C29, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2A, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2B, + 0x0000, 0x8C2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2D, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8C2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8C2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C30, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C31, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8C32, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C33, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8C34, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8C35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C36, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C37, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8C38, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C39, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3A, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3B, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3C, 0x0000, 0x0000, 0x8C3D, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3E, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3F, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C40, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C41, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8C42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8C43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C44, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C45, 0x0000, 0x0000, + 0x0000, 0x8C46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8C47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C48, 0x0000, 0x0000, 0x0000, + 0x8C49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8C4A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8C4B, 0x8C4C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4D, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4E, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4F, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8C50, 0x0000, 0x8C51, 0x8C52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8C53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8C54, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C55, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C56, 0x0000, + 0x0000, 0x0000, 0x8C57, 0x0000, 0x0000, 0x8C58, 0x0000, 0x0000, 0x8C59, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8C5A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5B, + 0x0000, 0x0000, 0x8C5C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8C5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8C5E, 0x0000, 0x8C5F, 0x0000, 0x8C60, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8C61, 0x0000, 0x0000, 0x8C62, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C63, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C64, 0x0000, 0x0000, 0x8C65, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C66, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8C67, 0x0000, 0x0000, 0x0000, 0x8C68, + 0x8C69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6A, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6B, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8C6C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6D, 0x0000, 0x0000, 0x8C6E, 0x8C6F, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C70, 0x0000, 0x0000, 0x0000, + 0x8C71, 0x0000, 0x8C72, 0x8C73, 0x0000, 0x0000, 0x8C74, 0x8C75, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8C76, 0x0000, 0x0000, 0x8C77, 0x0000, 0x0000, 0x0000, 0x8C78, + 0x0000, 0x0000, 0x0000, 0x8C79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7A, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8C7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7C, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8C7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7E, 0x8C7F, 0x0000, + 0x0000, 0x8C80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8C81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C82, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8C83, 0x8C84, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C85, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8C86, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C87, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8C88, 0x0000, 0x8C89, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8C8A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8B, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8C, 0x0000, 0x0000, 0x0000, + 0x8C8D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8E, 0x0000, + 0x0000, 0x0000, 0x8C8F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C90, 0x0000, + 0x0000, 0x0000, 0x8C91, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C92, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8C93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8C94, 0x0000, 0x0000, 0x8C95, 0x0000, 0x0000, 0x8C96, + 0x0000, 0x0000, 0x0000, 0x8C97, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C98, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C99, 0x0000, 0x0000, 0x0000, + 0x8C9A, 0x8C9B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C9C, + 0x0000, 0x0000, 0x8C9D, 0x8C9E, 0x0000, 0x0000, 0x8C9F, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA0, + 0x0000, 0x0000, 0x0000, 0x8CA1, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA2, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA3, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8CA5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8CA6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA8, 0x0000, 0x8CA9, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8CAA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAB, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAC, + 0x8CAD, 0x0000, 0x0000, 0x0000, 0x8CAE, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAF, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8CB1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB2, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB3, 0x8CB4, 0x0000, 0x8CB5, 0x0000, + 0x0000, 0x8CB6, 0x0000, 0x0000, 0x8CB7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8CB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB9, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8CBA, 0x0000, 0x0000, 0x8CBB, 0x0000, 0x0000, 0x0000, + 0x8CBC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBD, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8CBE, 0x0000, 0x0000, 0x8CBF, 0x0000, 0x8CC0, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8CC1, 0x0000, 0x0000, 0x0000, 0x8CC2, 0x0000, + 0x0000, 0x0000, 0x8CC3, 0x0000, 0x0000, 0x8CC4, 0x0000, 0x8CC5, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CC6, 0x0000, + 0x0000, 0x0000, 0x8CC7, 0x8CC8, 0x0000, 0x0000, 0x0000, 0x8CC9, 0x0000, + 0x8CCA, 0x0000, 0x0000, 0x8CCB, 0x0000, 0x0000, 0x8CCC, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8CCD, 0x0000, 0x0000, 0x8CCE, 0x0000, 0x0000, 0x8CCF, + 0x0000, 0x8CD0, 0x8CD1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8CD2, 0x0000, 0x8CD3, 0x0000, 0x8CD4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CD5, 0x8CD6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8CD7, 0x0000, 0x8CD8, 0x0000, 0x8CD9, 0x0000, 0x8CDA, + 0x0000, 0x8CDB, 0x0000, 0x0000, 0x8CDC, 0x0000, 0x8CDD, 0x8CDE, 0x8CDF, + 0x8CE0, 0x0000, 0x0000, 0x8CE1, 0x0000, 0x8CE2, 0x0000, 0x8CE3, 0x0000, + 0x0000, 0x0000, 0x8CE4, 0x0000, 0x8CE5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8CE6, 0x0000, 0x0000, 0x8CE7, 0x0000, 0x0000, 0x0000, 0x8CE8, 0x0000, + 0x0000, 0x8CE9, 0x0000, 0x8CEA, 0x0000, 0x0000, 0x0000, 0x8CEB, 0x0000, + 0x8CEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CED, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8CEE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8CEF, 0x0000, 0x8CF0, 0x0000, 0x8CF1, 0x0000, 0x8CF2, 0x8CF3, 0x0000, + 0x0000, 0x8CF4, 0x0000, 0x0000, 0x8CF5, 0x0000, 0x0000, 0x8CF6, 0x0000, + 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x0000, 0x0000, 0x8CFB, 0x0000, 0x0000, + 0x8CFC, 0x0000, 0x8CFD, 0x8CFE, 0x8CFF, 0x8D00, 0x0000, 0x8D01, 0x8D02, + 0x8D03, 0x8D04, 0x0000, 0x8D05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8D06, 0x0000, 0x0000, 0x8D07, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D0C, + 0x8D0D, 0x0000, 0x0000, 0x0000, 0x8D0E, 0x8D0F, 0x0000, 0x0000, 0x8D10, + 0x0000, 0x0000, 0x8D11, 0x0000, 0x8D12, 0x0000, 0x0000, 0x0000, 0x8D13, + 0x0000, 0x8D14, 0x8D15, 0x0000, 0x8D16, 0x8D17, 0x8D18, 0x8D19, 0x0000, + 0x8D1A, 0x0000, 0x8D1B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D1C, + 0x0000, 0x8D1D, 0x0000, 0x0000, 0x0000, 0x8D1E, 0x0000, 0x0000, 0x8D1F, + 0x0000, 0x0000, 0x8D20, 0x0000, 0x0000, 0x8D21, 0x0000, 0x0000, 0x8D22, + 0x0000, 0x8D23, 0x0000, 0x0000, 0x8D24, 0x0000, 0x8D25, 0x0000, 0x8D26, + 0x0000, 0x8D27, 0x0000, 0x8D28, 0x0000, 0x8D29, 0x8D2A, 0x0000, 0x0000, + 0x0000, 0x8D2B, 0x8D2C, 0x0000, 0x0000, 0x0000, 0x8D2D, 0x8D2E, 0x8D2F, + 0x8D30, 0x0000, 0x0000, 0x8D31, 0x8D32, 0x0000, 0x8D33, 0x0000, 0x8D34, + 0x8D35, 0x0000, 0x0000, 0x0000, 0x8D36, 0x0000, 0x8D37, 0x8D38, 0x0000, + 0x0000, 0x8D39, 0x0000, 0x8D3A, 0x0000, 0x0000, 0x8D3B, 0x8D3C, 0x8D3D, + 0x0000, 0x8D3E, 0x0000, 0x8D3F, 0x0000, 0x8D40, 0x0000, 0x8D41, 0x8D42, + 0x8D43, 0x0000, 0x8D44, 0x8D45, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D46, + 0x0000, 0x0000, 0x0000, 0x8D47, 0x0000, 0x8D48, 0x0000, 0x0000, 0x0000, + 0x8D49, 0x0000, 0x8D4A, 0x8D4B, 0x0000, 0x8D4C, 0x0000, 0x8D4D, 0x0000, + 0x8D4E, 0x0000, 0x0000, 0x8D4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8D50, 0x0000, 0x0000, 0x8D51, 0x8D52, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8D53, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8D54, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D55, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D56, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8D57, 0x8D58, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8D59, 0x0000, 0x8D5A, 0x8D5B, 0x8D5C, 0x0000, + 0x8D5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D5E, 0x0000, 0x0000, + 0x0000, 0x8D5F, 0x8D60, 0x0000, 0x0000, 0x0000, 0x8D61, 0x0000, 0x0000, + 0x8D62, 0x8D63, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D64, 0x8D65, 0x0000, + 0x8D66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8D67, 0x8D68, 0x0000, 0x0000, 0x8D69, 0x0000, 0x0000, 0x0000, + 0x8D6A, 0x8D6B, 0x0000, 0x8D6C, 0x8D6D, 0x0000, 0x0000, 0x0000, 0x8D6E, + 0x0000, 0x8D6F, 0x0000, 0x8D70, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8D71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D72, + 0x0000, 0x8D73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8D74, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8D75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D76, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D77, 0x8D78, 0x0000, + 0x8D79, 0x8D7A, 0x8D7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D7C, 0x8D7D, + 0x8D7E, 0x8D7F, 0x8D80, 0x8D81, 0x0000, 0x0000, 0x8D82, 0x8D83, 0x0000, + 0x8D84, 0x8D85, 0x8D86, 0x0000, 0x8D87, 0x8D88, 0x8D89, 0x0000, 0x8D8A, + 0x8D8B, 0x8D8C, 0x8D8D, 0x0000, 0x8D8E, 0x8D8F, 0x8D90, 0x8D91, 0x8D92, + 0x8D93, 0x8D94, 0x0000, 0x8D95, 0x8D96, 0x0000, 0x8D97, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8D98, 0x8D99, 0x8D9A, 0x0000, 0x8D9B, + 0x0000, 0x0000, 0x0000, 0x8D9C, 0x8D9D, 0x0000, 0x8D9E, 0x0000, 0x8D9F, + 0x0000, 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA3, 0x8DA4, 0x0000, 0x8DA5, 0x8DA6, + 0x0000, 0x0000, 0x8DA7, 0x0000, 0x8DA8, 0x8DA9, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8DAA, 0x8DAB, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8DB1, 0x8DB2, 0x0000, 0x8DB3, 0x8DB4, 0x0000, 0x8DB5, 0x0000, + 0x0000, 0x8DB6, 0x0000, 0x8DB7, 0x8DB8, 0x0000, 0x0000, 0x8DB9, 0x8DBA, + 0x0000, 0x8DBB, 0x8DBC, 0x0000, 0x0000, 0x0000, 0x8DBD, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DBE, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8DBF, 0x0000, 0x0000, 0x0000, 0x8DC0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8DC1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC2, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC3, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC6, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC7, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC8, 0x0000, + 0x0000, 0x8DC9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DCA, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DCB, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8DCC, 0x8DCD, 0x8DCE, 0x0000, 0x8DCF, 0x0000, + 0x0000, 0x0000, 0x8DD0, 0x8DD1, 0x8DD2, 0x0000, 0x8DD3, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8DD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8DD5, 0x0000, 0x0000, 0x0000, 0x8DD6, 0x8DD7, 0x0000, 0x0000, 0x0000, + 0x8DD8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8DD9, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DDA, 0x8DDB, 0x8DDC, 0x8DDD, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8DDE, 0x0000, 0x8DDF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE0, 0x0000, 0x0000, 0x0000, 0x8DE1, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8DE2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8DE3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE4, 0x8DE5, 0x8DE6, + 0x8DE7, 0x8DE8, 0x0000, 0x8DE9, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DEA, + 0x0000, 0x8DEB, 0x0000, 0x8DEC, 0x8DED, 0x8DEE, 0x8DEF, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DF0, 0x0000, 0x8DF1, 0x8DF2, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DF3, 0x8DF4, 0x8DF5, 0x8DF6, + 0x8DF7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DF8, 0x8DF9, 0x0000, + 0x0000, 0x8DFA, 0x8DFB, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DFC, 0x0000, + 0x0000, 0x0000, 0x8DFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DFE, 0x0000, + 0x0000, 0x8DFF, 0x0000, 0x0000, 0x8E00, 0x8E01, 0x8E02, 0x0000, 0x8E03, + 0x0000, 0x8E04, 0x8E05, 0x8E06, 0x0000, 0x0000, 0x8E07, 0x0000, 0x0000, + 0x0000, 0x8E08, 0x8E09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0A, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8E0B, 0x0000, 0x8E0C, 0x8E0D, 0x0000, 0x8E0E, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8E0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E10, 0x8E11, + 0x8E12, 0x0000, 0x0000, 0x8E13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E14, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E15, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8E16, 0x8E17, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8E18, 0x8E19, 0x0000, 0x0000, 0x8E1A, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8E1B, 0x8E1C, 0x0000, 0x0000, 0x0000, 0x8E1D, + 0x0000, 0x0000, 0x8E1E, 0x0000, 0x8E1F, 0x0000, 0x8E20, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E21, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E22, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8E23, 0x8E24, 0x0000, 0x8E25, 0x0000, 0x8E26, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8E27, 0x0000, 0x0000, 0x8E28, 0x0000, 0x0000, + 0x8E29, 0x0000, 0x0000, 0x8E2A, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2B, + 0x8E2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2D, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8E2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8E2F, 0x0000, 0x0000, 0x8E30, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8E31, 0x0000, 0x8E32, 0x0000, 0x8E33, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E34, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8E35, 0x0000, 0x0000, 0x8E36, 0x0000, + 0x8E37, 0x0000, 0x8E38, 0x0000, 0x8E39, 0x0000, 0x0000, 0x0000, 0x8E3A, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8E3B, 0x8E3C, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8E3D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E3E, 0x0000, + 0x8E3F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8E40, 0x8E41, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8E42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E43, 0x8E44, + 0x0000, 0x8E45, 0x0000, 0x8E46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8E47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8E48, 0x8E49, 0x0000, 0x8E4A, 0x8E4B, 0x8E4C, 0x0000, 0x0000, 0x0000, + 0x8E4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E4E, 0x8E4F, 0x0000, + 0x0000, 0x8E50, 0x0000, 0x8E51, 0x0000, 0x0000, 0x8E52, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E53, 0x0000, 0x8E54, + 0x0000, 0x8E55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E56, + 0x8E57, 0x0000, 0x8E58, 0x8E59, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E5A, + 0x0000, 0x0000, 0x0000, 0x8E5B, 0x0000, 0x0000, 0x8E5C, 0x8E5D, 0x0000, + 0x0000, 0x8E5E, 0x8E5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8E60, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E61, 0x0000, + 0x0000, 0x8E62, 0x8E63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8E64, 0x0000, 0x8E65, 0x0000, 0x0000, 0x8E66, 0x8E67, 0x0000, 0x0000, + 0x8E68, 0x8E69, 0x8E6A, 0x8E6B, 0x0000, 0x0000, 0x8E6C, 0x8E6D, 0x8E6E, + 0x8E6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E70, 0x0000, 0x0000, 0x8E71, + 0x8E72, 0x0000, 0x8E73, 0x0000, 0x8E74, 0x0000, 0x0000, 0x0000, 0x8E75, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E76, 0x0000, 0x0000, 0x8E77, + 0x8E78, 0x0000, 0x0000, 0x8E79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8E7A, 0x0000, 0x8E7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7C, + 0x8E7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8E7E, 0x0000, 0x8E7F, 0x0000, 0x8E80, 0x8E81, 0x0000, 0x0000, 0x0000, + 0x8E82, 0x8E83, 0x0000, 0x0000, 0x8E84, 0x0000, 0x8E85, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E86, 0x0000, 0x0000, 0x0000, + 0x8E87, 0x0000, 0x8E88, 0x0000, 0x0000, 0x8E89, 0x0000, 0x8E8A, 0x0000, + 0x8E8B, 0x8E8C, 0x8E8D, 0x0000, 0x0000, 0x0000, 0x8E8E, 0x0000, 0x0000, + 0x8E8F, 0x0000, 0x8E90, 0x8E91, 0x0000, 0x8E92, 0x0000, 0x8E93, 0x8E94, + 0x8E95, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E96, 0x0000, + 0x0000, 0x0000, 0x8E97, 0x0000, 0x8E98, 0x0000, 0x8E99, 0x8E9A, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8E9B, 0x0000, 0x8E9C, 0x0000, 0x8E9D, 0x0000, + 0x8E9E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E9F, 0x0000, 0x0000, 0x8EA0, + 0x0000, 0x0000, 0x8EA1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8EA2, 0x0000, 0x8EA3, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8EA4, 0x8EA5, 0x8EA6, 0x0000, 0x8EA7, 0x8EA8, 0x8EA9, + 0x0000, 0x0000, 0x0000, 0x8EAA, 0x8EAB, 0x8EAC, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8EAD, 0x0000, 0x0000, 0x0000, 0x8EAE, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8EAF, 0x0000, 0x0000, 0x8EB0, 0x0000, + 0x8EB1, 0x0000, 0x8EB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8EB3, 0x8EB4, 0x0000, 0x8EB5, 0x0000, 0x0000, 0x8EB6, 0x0000, 0x0000, + 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBA, 0x0000, 0x0000, 0x0000, 0x8EBB, 0x8EBC, + 0x8EBD, 0x8EBE, 0x0000, 0x0000, 0x0000, 0x8EBF, 0x0000, 0x8EC0, 0x8EC1, + 0x0000, 0x8EC2, 0x0000, 0x0000, 0x8EC3, 0x8EC4, 0x0000, 0x0000, 0x0000, + 0x8EC5, 0x0000, 0x0000, 0x8EC6, 0x0000, 0x8EC7, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EC8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8EC9, 0x8ECA, 0x0000, 0x0000, 0x8ECB, 0x8ECC, 0x0000, 0x8ECD, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ECE, 0x0000, 0x0000, + 0x0000, 0x8ECF, 0x0000, 0x8ED0, 0x8ED1, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8ED2, 0x0000, 0x0000, 0x0000, 0x8ED3, 0x8ED4, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8ED5, 0x0000, 0x0000, 0x0000, 0x8ED6, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8ED7, 0x8ED8, 0x0000, 0x0000, 0x0000, 0x8ED9, + 0x0000, 0x0000, 0x0000, 0x8EDA, 0x0000, 0x0000, 0x0000, 0x8EDB, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EDC, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EDD, 0x0000, + 0x8EDE, 0x0000, 0x8EDF, 0x0000, 0x0000, 0x8EE0, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8EE1, 0x8EE2, 0x8EE3, 0x0000, 0x0000, 0x8EE4, 0x8EE5, + 0x0000, 0x8EE6, 0x8EE7, 0x0000, 0x8EE8, 0x0000, 0x8EE9, 0x0000, 0x8EEA, + 0x0000, 0x0000, 0x8EEB, 0x0000, 0x8EEC, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8EED, 0x0000, 0x0000, 0x0000, 0x8EEE, 0x8EEF, 0x0000, 0x0000, 0x0000, + 0x8EF0, 0x8EF1, 0x0000, 0x0000, 0x8EF2, 0x8EF3, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8EF4, 0x8EF5, 0x0000, 0x0000, 0x0000, 0x8EF6, 0x8EF7, + 0x8EF8, 0x8EF9, 0x0000, 0x8EFA, 0x8EFB, 0x0000, 0x8EFC, 0x0000, 0x0000, + 0x0000, 0x8EFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8EFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EFF, 0x0000, 0x0000, 0x0000, + 0x8F00, 0x0000, 0x0000, 0x0000, 0x8F01, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8F02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F03, 0x0000, 0x0000, 0x8F04, + 0x8F05, 0x0000, 0x0000, 0x0000, 0x8F06, 0x8F07, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8F08, 0x8F09, 0x0000, 0x0000, 0x8F0A, 0x0000, 0x0000, 0x8F0B, + 0x0000, 0x0000, 0x0000, 0x8F0C, 0x8F0D, 0x0000, 0x8F0E, 0x8F0F, 0x0000, + 0x8F10, 0x0000, 0x8F11, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F12, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8F13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8F14, 0x0000, 0x8F15, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F16, 0x0000, + 0x0000, 0x0000, 0x8F17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8F18, 0x0000, 0x8F19, 0x0000, 0x0000, 0x8F1A, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F1B, + 0x0000, 0x0000, 0x8F1C, 0x8F1D, 0x8F1E, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8F1F, 0x0000, 0x8F20, 0x0000, 0x0000, 0x8F21, 0x8F22, 0x8F23, 0x8F24, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8F25, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8F26, 0x0000, 0x8F27, 0x8F28, 0x0000, + 0x0000, 0x8F29, 0x0000, 0x8F2A, 0x8F2B, 0x0000, 0x8F2C, 0x8F2D, 0x0000, + 0x8F2E, 0x8F2F, 0x0000, 0x0000, 0x8F30, 0x8F31, 0x8F32, 0x0000, 0x0000, + 0x0000, 0x8F33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8F34, 0x0000, 0x8F35, 0x0000, 0x8F36, 0x0000, 0x0000, 0x8F37, + 0x8F38, 0x0000, 0x8F39, 0x8F3A, 0x8F3B, 0x0000, 0x0000, 0x0000, 0x8F3C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8F3D, 0x0000, 0x0000, 0x8F3E, 0x0000, + 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43, 0x0000, 0x0000, 0x0000, 0x8F44, + 0x0000, 0x0000, 0x8F45, 0x8F46, 0x8F47, 0x0000, 0x8F48, 0x8F49, 0x8F4A, + 0x0000, 0x0000, 0x0000, 0x8F4B, 0x0000, 0x8F4C, 0x8F4D, 0x8F4E, 0x8F4F, + 0x8F50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F51, 0x0000, 0x8F52, + 0x0000, 0x8F53, 0x8F54, 0x8F55, 0x0000, 0x8F56, 0x8F57, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8F58, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8F59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5A, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8F5B, 0x0000, 0x0000, 0x8F5C, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8F5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5E, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5F, + 0x8F60, 0x0000, 0x0000, 0x0000, 0x8F61, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8F62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F63, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8F64, 0x0000, 0x8F65, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8F66, 0x0000, 0x0000, 0x8F67, 0x0000, 0x0000, + 0x0000, 0x8F68, 0x0000, 0x0000, 0x8F69, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8F6A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8F6B, 0x0000, 0x0000, 0x8F6C, 0x0000, + 0x8F6D, 0x8F6E, 0x0000, 0x8F6F, 0x0000, 0x0000, 0x0000, 0x8F70, 0x8F71, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F72, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F73, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F74, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8F75, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F76, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8F77, 0x0000, 0x8F78, 0x0000, 0x8F79, + 0x0000, 0x8F7A, 0x8F7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8F7C, 0x0000, 0x8F7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8F7E, 0x0000, 0x8F7F, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8F80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8F81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F82, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F83, 0x0000, 0x8F84, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8F85, 0x0000, 0x8F86, 0x8F87, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F88, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8F89, 0x0000, 0x0000, 0x8F8A, 0x0000, 0x8F8B, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8F8C, 0x0000, 0x0000, 0x0000, 0x8F8D, 0x0000, 0x8F8E, 0x8F8F, 0x8F90, + 0x0000, 0x8F91, 0x8F92, 0x8F93, 0x8F94, 0x0000, 0x8F95, 0x0000, 0x8F96, + 0x0000, 0x8F97, 0x8F98, 0x8F99, 0x8F9A, 0x8F9B, 0x8F9C, 0x0000, 0x0000, + 0x0000, 0x8F9D, 0x8F9E, 0x0000, 0x0000, 0x0000, 0x8F9F, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8FA0, 0x0000, 0x0000, 0x8FA1, 0x0000, 0x8FA2, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FA3, 0x0000, 0x0000, 0x8FA4, + 0x0000, 0x8FA5, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FA6, 0x8FA7, 0x8FA8, + 0x0000, 0x8FA9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8FAA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x8FAB, 0x8FAC, 0x8FAD, 0x8FAE, 0x0000, 0x0000, 0x8FAF, 0x8FB0, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8FB1, 0x8FB2, 0x0000, 0x8FB3, 0x0000, 0x0000, + 0x8FB4, 0x0000, 0x0000, 0x0000, 0x8FB5, 0x0000, 0x0000, 0x8FB6, 0x0000, + 0x8FB7, 0x0000, 0x0000, 0x0000, 0x8FB8, 0x8FB9, 0x0000, 0x0000, 0x8FBA, + 0x8FBB, 0x8FBC, 0x0000, 0x8FBD, 0x8FBE, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8FBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FC0, 0x8FC1, + 0x8FC2, 0x0000, 0x8FC3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FC4, 0x0000, + 0x8FC5, 0x0000, 0x8FC6, 0x8FC7, 0x8FC8, 0x0000, 0x0000, 0x0000, 0x8FC9, + 0x0000, 0x0000, 0x0000, 0x8FCA, 0x0000, 0x8FCB, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FCC, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FCD, 0x8FCE, 0x0000, + 0x8FCF, 0x0000, 0x0000, 0x0000, 0x8FD0, 0x8FD1, 0x8FD2, 0x0000, 0x8FD3, + 0x0000, 0x8FD4, 0x0000, 0x0000, 0x8FD5, 0x0000, 0x8FD6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FD7, 0x8FD8, 0x8FD9, 0x8FDA, + 0x0000, 0x0000, 0x0000, 0x8FDB, 0x8FDC, 0x8FDD, 0x0000, 0x0000, 0x0000, + 0x8FDE, 0x8FDF, 0x0000, 0x8FE0, 0x0000, 0x8FE1, 0x0000, 0x0000, 0x8FE2, + 0x8FE3, 0x8FE4, 0x0000, 0x0000, 0x8FE5, 0x0000, 0x8FE6, 0x0000, 0x8FE7, + 0x8FE8, 0x8FE9, 0x0000, 0x8FEA, 0x0000, 0x0000, 0x8FEB, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8FEC, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8FED, 0x0000, 0x8FEE, 0x0000, 0x8FEF, + 0x8FF0, 0x0000, 0x0000, 0x0000, 0x8FF1, 0x0000, 0x8FF2, 0x0000, 0x8FF3, + 0x8FF4, 0x0000, 0x8FF5, 0x0000, 0x8FF6, 0x0000, 0x8FF7, 0x0000, 0x0000, + 0x8FF8, 0x8FF9, 0x0000, 0x8FFA, 0x8FFB, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FFD, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8FFE, 0x0000, 0x8FFF, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x9000, 0x9001, 0x9002, 0x0000, 0x0000, 0x9003, 0x0000, 0x9004, + 0x9005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x9006, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x9007, 0x9008, 0x9009, 0x0000, 0x900A, 0x900B, 0x0000, 0x0000, + 0x900C, 0x900D, 0x0000, 0x900E, 0x0000, 0x900F, 0x0000, 0x9010, 0x0000, + 0x0000, 0x9011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9012, 0x0000, 0x0000, 0x9013, 0x9014, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9015, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9016, 0x0000, 0x9017, 0x9018, 0x0000, 0x0000, + 0x9019, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x901A, + 0x901B, 0x901C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x901D, + 0x0000, 0x0000, 0x901E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x901F, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x9020, 0x0000, 0x9021, 0x9022, 0x0000, 0x9023, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x9024, 0x9025, 0x9026, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9027, 0x0000, 0x9028, 0x9029, 0x902A, 0x902B, + 0x902C, 0x902D, 0x0000, 0x0000, 0x0000, 0x0000, 0x902E, 0x0000, 0x902F, + 0x9030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9031, + 0x0000, 0x9032, 0x0000, 0x0000, 0x9033, 0x9034, 0x0000, 0x0000, 0x0000, + 0x9035, 0x0000, 0x0000, 0x9036, 0x0000, 0x9037, 0x9038, 0x9039, 0x0000, + 0x0000, 0x0000, 0x903A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x903B, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x903C, 0x0000, 0x0000, 0x903D, 0x0000, + 0x903E, 0x903F, 0x9040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9041, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9042, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9043, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9044, 0x0000, 0x0000, + 0x9045, 0x0000, 0x9046, 0x0000, 0x9047, 0x0000, 0x0000, 0x0000, 0x0000, + 0x9048, 0x0000, 0x0000, 0x9049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904A, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904B, 0x0000, 0x904C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x904D, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x904E, 0x0000, 0x0000, 0x0000, 0x0000, 0x904F, 0x0000, + 0x0000, 0x9050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x9051, 0x0000, 0x9052, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9053, 0x9054, 0x0000, 0x9055, + 0x9056, 0x9057, 0x9058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x9059, 0x0000, 0x0000, 0x0000, 0x905A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x905B, 0x0000, 0x0000, 0x0000, 0x905C, 0x905D, + 0x0000, 0x905E, 0x905F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x9060, 0x9061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x9062, 0x0000, 0x9063, 0x9064, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x9065, 0x9066, 0x9067, 0x9068, 0x0000, + 0x0000, 0x0000, 0x9069, 0x0000, 0x906A, 0x0000, 0x0000, 0x0000, 0x906B, + 0x906C, 0x0000, 0x906D, 0x0000, 0x0000, 0x906E, 0x906F, 0x0000, 0x9070, + 0x9071, 0x0000, 0x0000, 0x0000, 0x0000, 0x9072, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x9073, 0x0000, 0x9074, 0x0000, 0x0000, 0x9075, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x9076, 0x9077, 0x0000, 0x0000, 0x0000, 0x9078, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9079, 0x907A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x907B, 0x0000, 0x0000, 0x907C, 0x0000, + 0x0000, 0x0000, 0x907D, 0x0000, 0x907E, 0x0000, 0x0000, 0x907F, 0x9080, + 0x0000, 0x0000, 0x0000, 0x9081, 0x9082, 0x0000, 0x0000, 0x9083, 0x9084, + 0x0000, 0x0000, 0x0000, 0x0000, 0x9085, 0x0000, 0x9086, 0x9087, 0x9088, + 0x0000, 0x0000, 0x9089, 0x0000, 0x0000, 0x0000, 0x908A, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x908B, 0x908C, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x908D, 0x0000, 0x908E, 0x0000, 0x908F, + 0x9090, 0x9091, 0x0000, 0x0000, 0x0000, 0x0000, 0x9092, 0x0000, 0x9093, + 0x9094, 0x0000, 0x0000, 0x9095, 0x0000, 0x0000, 0x0000, 0x9096, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x9097, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9098, 0x9099, 0x0000, 0x909A, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x909B, 0x0000, + 0x909C, 0x0000, 0x909D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x909E, 0x909F, 0x90A0, 0x0000, 0x90A1, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x90A2, 0x90A3, 0x0000, 0x90A4, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90A5, 0x0000, + 0x0000, 0x90A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90A7, 0x0000, + 0x90A8, 0x90A9, 0x90AA, 0x0000, 0x0000, 0x0000, 0x90AB, 0x0000, 0x0000, + 0x90AC, 0x0000, 0x90AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x90AE, 0x90AF, 0x0000, 0x0000, 0x0000, 0x90B0, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x90B1, 0x0000, 0x0000, 0x0000, 0x90B2, 0x0000, + 0x0000, 0x90B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90B4, 0x90B5, + 0x90B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x90B7, 0x90B8, 0x0000, 0x0000, 0x90B9, 0x90BA, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90BB, 0x0000, 0x90BC, 0x0000, + 0x0000, 0x90BD, 0x0000, 0x0000, 0x90BE, 0x0000, 0x0000, 0x0000, 0x0000, + 0x90BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90C0, 0x0000, + 0x90C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x90C2, 0x0000, 0x0000, 0x90C3, 0x0000, 0x90C4, 0x0000, 0x90C5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90C6, 0x0000, 0x0000, + 0x90C7, 0x90C8, 0x0000, 0x0000, 0x0000, 0x90C9, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x90CA, 0x0000, 0x0000, 0x90CB, 0x0000, 0x90CC, 0x0000, + 0x0000, 0x0000, 0x0000, 0x90CD, 0x90CE, 0x90CF, 0x90D0, 0x0000, 0x0000, + 0x90D1, 0x0000, 0x90D2, 0x90D3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x90D4, 0x0000, 0x0000, 0x90D5, 0x90D6, 0x0000, 0x90D7, + 0x90D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x90D9, 0x90DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x90DB, + 0x0000, 0x0000, 0x0000, 0x90DC, 0x0000, 0x0000, 0x90DD, 0x0000, 0x90DE, + 0x0000, 0x0000, 0x0000, 0x90DF, 0x90E0, 0x90E1, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x90E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E3, 0x0000, 0x0000, 0x90E4, + 0x0000, 0x90E5, 0x90E6, 0x0000, 0x90E7, 0x90E8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x90E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x90EA, 0x0000, + 0x90EB, 0x90EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x90ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90EE, 0x0000, 0x0000, 0x0000, + 0x90EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x90F0, 0x90F1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x90F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F3, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x90F6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x90F7, 0x0000, 0x90F8, 0x90F9, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x90FA, 0x0000, 0x90FB, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FC, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x90FD, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FE, + 0x90FF, 0x0000, 0x0000, 0x9100, 0x9101, 0x0000, 0x0000, 0x9102, 0x0000, + 0x9103, 0x9104, 0x0000, 0x0000, 0x0000, 0x9105, 0x0000, 0x0000, 0x9106, + 0x0000, 0x0000, 0x9107, 0x9108, 0x9109, 0x0000, 0x0000, 0x0000, 0x0000, + 0x910A, 0x0000, 0x0000, 0x0000, 0x910B, 0x0000, 0x910C, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x910D, 0x0000, 0x0000, 0x0000, 0x0000, 0x910E, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x910F, 0x9110, 0x0000, 0x9111, 0x0000, 0x0000, + 0x0000, 0x9112, 0x9113, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x9114, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9115, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9116, 0x9117, 0x9118, + 0x9119, 0x911A, 0x911B, 0x911C, 0x911D, 0x911E, 0x911F, 0x9120, 0x9121, + 0x9122, 0x9123, 0x9124, 0x9125, 0x9126, 0x9127, 0x9128, 0x9129, 0x912A, + 0x912B, 0x912C, 0x912D, 0x912E, 0x912F, 0x9130, 0x9131, 0x9132, 0x9133, + 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, 0x9139, 0x913A, 0x913B, 0x913C, + 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, 0x9143, 0x9144, 0x9145, + 0x9146, 0x9147, 0x9148, 0x9149, 0x914A, 0x914B, 0x914C, 0x914D, 0x914E, + 0x914F, 0x9150, 0x9151, 0x9152, 0x9153, 0x9154, 0x9155, 0x9156, 0x9157, + 0x9158, 0x9159, 0x915A, 0x915B, 0x915C, 0x915D, 0x915E, 0x915F, 0x9160, + 0x9161, 0x9162, 0x9163, 0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169, + 0x916A, 0x916B, 0x916C, 0x916D, 0x916E, 0x916F, 0x9170, 0x9171, 0x9172, + 0x9173, 0x9174, 0x9175, 0x9176, 0x9177, 0x9178, 0x9179, 0x917A, 0x917B, + 0x917C, 0x917D, 0x917E, 0x917F, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, + 0x9185, 0x9186, 0x9187, 0x9188, 0x9189, 0x918A, 0x918B, 0x918C, 0x918D, + 0x918E, 0x918F, 0x9190, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195, 0x9196, + 0x9197, 0x9198, 0x9199, 0x919A, 0x919B, 0x919C, 0x919D, 0x919E, 0x919F, + 0x91A0, 0x91A1, 0x91A2, 0x91A3, 0x91A4, 0x91A5, 0x91A6, 0x91A7, 0x91A8, + 0x91A9, 0x91AA, 0x91AB, 0x91AC, 0x91AD, 0x91AE, 0x91AF, 0x91B0, 0x91B1, + 0x91B2, 0x91B3, 0x91B4, 0x91B5, 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BA, + 0x91BB, 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3, + 0x91C4, 0x91C5, 0x91C6, 0x91C7, 0x91C8, 0x91C9, 0x91CA, 0x91CB, 0x91CC, + 0x91CD, 0x91CE, 0x91CF, 0x91D0, 0x91D1, 0x91D2, 0x91D3, 0x91D4, 0x91D5, + 0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, 0x91DC, 0x91DD, 0x91DE, + 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4, 0x91E5, 0x91E6, 0x91E7, + 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, + 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5, 0x91F6, 0x91F7, 0x91F8, 0x91F9, + 0x91FA, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF, 0x9200, 0x9201, 0x9202, + 0x9203, 0x9204, 0x9205, 0x9206, 0x9207, 0x9208, 0x9209, 0x920A, 0x920B, + 0x920C, 0x920D, 0x920E, 0x920F, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, + 0x9215, 0x9216, 0x9217, 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, + 0x921E, 0x921F, 0x9220, 0x9221, 0x9222, 0x9223, 0x0000, 0x0000, 0x9224, + 0x0000, 0x9225, 0x0000, 0x0000, 0x9226, 0x9227, 0x9228, 0x9229, 0x922A, + 0x922B, 0x922C, 0x922D, 0x922E, 0x922F, 0x0000, 0x9230, 0x0000, 0x9231, + 0x0000, 0x0000, 0x9232, 0x9233, 0x0000, 0x0000, 0x0000, 0x9234, 0x9235, + 0x9236, 0x9237, 0x0000, 0x0000, 0x9238, 0x9239, 0x923A, 0x923B, 0x923C, + 0x923D, 0x923E, 0x923F, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, + 0x9246, 0x9247, 0x9248, 0x9249, 0x924A, 0x924B, 0x924C, 0x924D, 0x924E, + 0x924F, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257, + 0x9258, 0x9259, 0x925A, 0x925B, 0x925C, 0x925D, 0x925E, 0x925F, 0x9260, + 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, + 0x926A, 0x926B, 0x926C, 0x926D, 0x926E, 0x926F, 0x9270, 0x9271, 0x9272, + 0x9273, 0x0000, 0x9274, 0x0000, 0x0000, 0x9275, 0x9276, 0x9277, 0x9278, + 0x9279, 0x927A, 0x927B, 0x927C, 0x927D, 0x927E, 0x927F, 0x9280, 0x9281, + 0x9282, 0x9283, 0x9284, 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, + 0x928B, 0x928C, 0x928D, 0x928E, 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, + 0x9294, 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, 0x929C, + 0x929D, 0x929E, 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, 0x92A4, 0x92A5, + 0x92A6, 0x92A7, 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, 0x92AE, + 0x92AF, 0x92B0, 0x92B1, 0x92B2, 0x92B3, 0x92B4, 0x92B5, 0x92B6, 0x92B7, + 0x92B8, 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, 0x92BF, 0x92C0, + 0x92C1, 0x92C2, 0x92C3, 0x92C4, 0x92C5, 0x92C6, 0x92C7, 0x92C8, 0x92C9, + 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1, 0x92D2, + 0x92D3, 0x0000, 0x0000, 0x0000, 0x92D4, 0x92D5, 0x92D6, 0x0000, 0x0000, + 0x0000, 0x92D7, 0x92D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23AC, 0x23AE, 0x23B0, 0x3312, + 0x3315, 0x23B2, 0x23B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23B6, 0x23B8, 0x23BA, + 0x23BC, 0x23BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23C0, 0x0000, + 0x23C2, 0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, 0x92E0, + 0x92E1, 0x92E2, 0x23C4, 0x23C6, 0x23C8, 0x23CA, 0x23CC, 0x23CE, 0x23D0, + 0x23D2, 0x23D4, 0x23D6, 0x23D8, 0x23DA, 0x23DC, 0x0000, 0x23DE, 0x23E0, + 0x23E2, 0x23E4, 0x23E6, 0x0000, 0x23E8, 0x0000, 0x23EA, 0x23EC, 0x0000, + 0x23EE, 0x23F0, 0x0000, 0x23F2, 0x23F4, 0x23F6, 0x23F8, 0x23FA, 0x23FC, + 0x23FE, 0x2400, 0x2402, 0x2404, 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, + 0x92E8, 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, + 0x92F1, 0x92F2, 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8, 0x92F9, + 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, 0x9300, 0x9301, 0x9302, + 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, 0x9309, 0x930A, 0x930B, + 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311, 0x9312, 0x9313, 0x9314, + 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, 0x931A, 0x931B, 0x931C, 0x931D, + 0x931E, 0x931F, 0x9320, 0x9321, 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, + 0x9327, 0x9328, 0x9329, 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, + 0x9330, 0x9331, 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, + 0x9339, 0x933A, 0x933B, 0x933C, 0x933D, 0x933E, 0x933F, 0x9340, 0x9341, + 0x9342, 0x9343, 0x9344, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934A, 0x934B, 0x934C, 0x934D, + 0x934E, 0x934F, 0x9350, 0x9351, 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, + 0x9357, 0x9358, 0x9359, 0x935A, 0x935B, 0x2406, 0x2408, 0x240A, 0x240C, + 0x240E, 0x2410, 0x2412, 0x2414, 0x2416, 0x2418, 0x241A, 0x241C, 0x241E, + 0x2420, 0x2422, 0x2424, 0x2426, 0x2428, 0x935C, 0x935D, 0x935E, 0x935F, + 0x242A, 0x242C, 0x242E, 0x2430, 0x2432, 0x2434, 0x2436, 0x2438, 0x243A, + 0x243C, 0x243E, 0x2440, 0x2442, 0x2444, 0x2446, 0x2448, 0x244A, 0x244C, + 0x244E, 0x2450, 0x2452, 0x2454, 0x2456, 0x2458, 0x245A, 0x245C, 0x245E, + 0x2460, 0x2462, 0x2464, 0x2466, 0x2468, 0x246A, 0x246C, 0x246E, 0x2470, + 0x2472, 0x2474, 0x2476, 0x2478, 0x247A, 0x247C, 0x247E, 0x2480, 0x2482, + 0x2484, 0x2486, 0x2488, 0x248A, 0x248C, 0x248E, 0x2490, 0x2492, 0x2494, + 0x2496, 0x2498, 0x249A, 0x249C, 0x249E, 0x24A0, 0x24A2, 0x24A4, 0x24A6, + 0x24A8, 0x24AA, 0x24AC, 0x24AE, 0x24B0, 0x24B2, 0x24B4, 0x24B6, 0x24B8, + 0x24BA, 0x24BC, 0x24BE, 0x24C0, 0x24C2, 0x24C4, 0x24C6, 0x24C8, 0x24CA, + 0x24CC, 0x24CE, 0x24D0, 0x24D2, 0x24D4, 0x24D6, 0x24D8, 0x24DA, 0x24DC, + 0x24DE, 0x24E0, 0x24E2, 0x24E4, 0x24E6, 0x24E8, 0x24EA, 0x24EC, 0x24EE, + 0x24F0, 0x24F2, 0x24F4, 0x24F6, 0x24F8, 0x24FA, 0x24FC, 0x24FE, 0x2500, + 0x2502, 0x2504, 0x2506, 0x2508, 0x250A, 0x250C, 0x250E, 0x2510, 0x2512, + 0x2514, 0x2516, 0x2518, 0x251A, 0x251C, 0x251E, 0x2520, 0x2522, 0x2524, + 0x2526, 0x2528, 0x252A, 0x252C, 0x252E, 0x2530, 0x2532, 0x2534, 0x2536, + 0x2538, 0x253A, 0x253C, 0x253E, 0x2540, 0x2542, 0x2544, 0x2546, 0x2548, + 0x254A, 0x254C, 0x254E, 0x2550, 0x2552, 0x2554, 0x2556, 0x2558, 0x255A, + 0x255C, 0x255E, 0x2560, 0x2562, 0x2564, 0x2566, 0x2568, 0x256A, 0x256C, + 0x256E, 0x2570, 0x2572, 0x2574, 0x2576, 0x2578, 0x257A, 0x257C, 0x257E, + 0x2580, 0x2582, 0x2584, 0x2586, 0x2588, 0x258A, 0x258C, 0x258E, 0x2590, + 0x2592, 0x2594, 0x2596, 0x2598, 0x259A, 0x259C, 0x259E, 0x25A0, 0x25A2, + 0x25A4, 0x25A6, 0x25A8, 0x25AA, 0x25AC, 0x25AE, 0x25B0, 0x25B2, 0x25B4, + 0x25B6, 0x25B8, 0x25BA, 0x25BC, 0x25BE, 0x25C0, 0x25C2, 0x25C4, 0x25C6, + 0x25C8, 0x25CA, 0x25CC, 0x25CE, 0x25D0, 0x25D2, 0x25D4, 0x25D6, 0x25D8, + 0x25DA, 0x25DC, 0x25DE, 0x25E0, 0x25E2, 0x25E4, 0x25E6, 0x25E8, 0x25EA, + 0x25EC, 0x25EE, 0x25F0, 0x25F2, 0x25F4, 0x25F6, 0x25F8, 0x25FA, 0x25FC, + 0x25FE, 0x2600, 0x2602, 0x2604, 0x2606, 0x2608, 0x260A, 0x260C, 0x3318, + 0x331B, 0x331E, 0x260E, 0x2610, 0x2612, 0x2614, 0x2616, 0x2618, 0x261A, + 0x261C, 0x261E, 0x2620, 0x2622, 0x2624, 0x2626, 0x2628, 0x262A, 0x262C, + 0x262E, 0x2630, 0x2632, 0x2634, 0x2636, 0x2638, 0x263A, 0x263C, 0x263E, + 0x2640, 0x2642, 0x2644, 0x2646, 0x2648, 0x264A, 0x264C, 0x264E, 0x2650, + 0x2652, 0x2654, 0x2656, 0x2658, 0x265A, 0x265C, 0x265E, 0x2660, 0x2662, + 0x2664, 0x2666, 0x2668, 0x266A, 0x266C, 0x266E, 0x2670, 0x2672, 0x2674, + 0x2676, 0x2678, 0x267A, 0x267C, 0x267E, 0x2680, 0x2682, 0x2684, 0x2686, + 0x2688, 0x268A, 0x268C, 0x268E, 0x2690, 0x2692, 0x2694, 0x2696, 0x2698, + 0x269A, 0x269C, 0x269E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3321, 0x3324, 0x3327, 0x332A, 0x332D, 0x3330, + 0x3333, 0x3336, 0x3339, 0x333C, 0x333F, 0x3342, 0x3345, 0x3348, 0x334B, + 0x334E, 0x3351, 0x3354, 0x3357, 0x335A, 0x335D, 0x3360, 0x3363, 0x3366, + 0x3369, 0x336C, 0x336F, 0x3372, 0x3375, 0x3378, 0x337B, 0x337E, 0x3381, + 0x3384, 0x3387, 0x338A, 0x338D, 0x3390, 0x3393, 0x3396, 0x3399, 0x339C, + 0x339F, 0x33A2, 0x33A5, 0x33A8, 0x33AB, 0x33AE, 0x33B1, 0x33B4, 0x33B7, + 0x33BA, 0x33BD, 0x33C0, 0x33C3, 0x33C6, 0x33C9, 0x33CC, 0x33CF, 0x33D2, + 0x33D5, 0x33D8, 0x33DB, 0x33DE, 0x0000, 0x0000, 0x33E1, 0x33E4, 0x33E7, + 0x33EA, 0x33ED, 0x33F0, 0x33F3, 0x33F6, 0x33F9, 0x33FC, 0x33FF, 0x3402, + 0x3405, 0x3408, 0x340B, 0x340E, 0x3411, 0x3414, 0x3417, 0x341A, 0x341D, + 0x3420, 0x3423, 0x3426, 0x3429, 0x342C, 0x342F, 0x3432, 0x3435, 0x3438, + 0x343B, 0x343E, 0x3441, 0x3444, 0x3447, 0x344A, 0x344D, 0x3450, 0x3453, + 0x3456, 0x3459, 0x345C, 0x345F, 0x3462, 0x3465, 0x3468, 0x346B, 0x346E, + 0x3471, 0x3474, 0x3477, 0x347A, 0x347D, 0x3480, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3483, 0x3486, 0x41A4, 0x41A9, 0x41AE, 0x41B3, 0x41B8, 0x41BD, + 0x41C2, 0x3489, 0x41C7, 0x41DA, 0x41E3, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9360, 0x9361, 0x9362, + 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x936A, 0x936B, 0x936C, 0x936D, 0x936E, 0x936F, 0x9370, + 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, + 0x937A, 0x937B, 0x937C, 0x937D, 0x937E, 0x0000, 0x0000, 0x937F, 0x9380, + 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, + 0x938A, 0x0000, 0x938B, 0x938C, 0x938D, 0x938E, 0x938F, 0x9390, 0x9391, + 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939A, + 0x939B, 0x939C, 0x939D, 0x0000, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x0000, + 0x0000, 0x0000, 0x0000, 0x93A2, 0x26A0, 0x93A3, 0x0000, 0x93A4, 0x0000, + 0x93A5, 0x26A2, 0x93A6, 0x26A4, 0x93A7, 0x26A6, 0x93A8, 0x26A8, 0x93A9, + 0x26AA, 0x93AA, 0x93AB, 0x93AC, 0x93AD, 0x93AE, 0x93AF, 0x93B0, 0x93B1, + 0x93B2, 0x93B3, 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9, 0x93BA, + 0x93BB, 0x93BC, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, + 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C8, 0x93C9, 0x93CA, 0x93CB, 0x93CC, + 0x93CD, 0x93CE, 0x93CF, 0x93D0, 0x93D1, 0x93D2, 0x93D3, 0x93D4, 0x93D5, + 0x93D6, 0x93D7, 0x93D8, 0x93D9, 0x93DA, 0x93DB, 0x93DC, 0x93DD, 0x93DE, + 0x93DF, 0x93E0, 0x93E1, 0x93E2, 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0x93E7, + 0x93E8, 0x93E9, 0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, 0x93EF, 0x93F0, + 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0x93F7, 0x93F8, 0x93F9, + 0x93FA, 0x93FB, 0x93FC, 0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, + 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409, 0x940A, 0x940B, + 0x940C, 0x940D, 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, + 0x9415, 0x9416, 0x9417, 0x9418, 0x9419, 0x941A, 0x941B, 0x941C, 0x941D, + 0x941E, 0x26AC, 0x26AE, 0x26B0, 0x26B2, 0x26B4, 0x26B6, 0x26B8, 0x26BA, + 0x0000, 0x0000, 0x0000, 0x0000, 0x941F, 0x9420, 0x9421, 0x9422, 0x9423, + 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, 0x942B, 0x942C, + 0x942D, 0x942E, 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, + 0x9436, 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, 0x943D, 0x943E, + 0x943F, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, + 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D, 0x944E, 0x944F, 0x9450, + 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, + 0x945A, 0x945B, 0x945C, 0x945D, 0x945E, 0x945F, 0x9460, 0x9461, 0x9462, + 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946A, 0x946B, + 0x946C, 0x946D, 0x946E, 0x946F, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, + 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D, + 0x947E, 0x947F, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, + 0x9487, 0x9488, 0x9489, 0x948A, 0x948B, 0x948C, 0x948D, 0x948E, 0x948F, + 0x9490, 0x9491, 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, + 0x9499, 0x949A, 0x949B, 0x949C, 0x949D, 0x949E, 0x949F, 0x94A0, 0x94A1, + 0x94A2, 0x94A3, 0x94A4, 0x94A5, 0x94A6, 0x94A7, 0x94A8, 0x94A9, 0x94AA, + 0x94AB, 0x94AC, 0x94AD, 0x94AE, 0x94AF, 0x94B0, 0x94B1, 0x94B2, 0x94B3, + 0x94B4, 0x94B5, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BB, 0x94BC, + 0x94BD, 0x94BE, 0x94BF, 0x94C0, 0x94C1, 0x94C2, 0x94C3, 0x94C4, 0x94C5, + 0x94C6, 0x94C7, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, + 0x94CF, 0x94D0, 0x94D1, 0x94D2, 0x94D3, 0x94D4, 0x94D5, 0x94D6, 0x94D7, + 0x94D8, 0x94D9, 0x94DA, 0x94DB, 0x94DC, 0x0000, 0x0000, 0x0000, 0x94DD, + 0x94DE, 0x94DF, 0x94E0, 0x94E1, 0x94E2, 0x0000, 0x0000, 0x94E3, 0x94E4, + 0x94E5, 0x94E6, 0x94E7, 0x94E8, 0x0000, 0x0000, 0x94E9, 0x94EA, 0x94EB, + 0x94EC, 0x94ED, 0x94EE, 0x0000, 0x0000, 0x94EF, 0x94F0, 0x94F1, 0x0000, + 0x0000, 0x0000, 0x94F2, 0x94F3, 0x94F4, 0x94F5, 0x94F6, 0x94F7, 0x94F8, + 0x0000, 0x94F9, 0x94FA, 0x94FB, 0x94FC, 0x94FD, 0x94FE, 0x94FF, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}; + +const uint16_t g_UnicodeData_Normalization_Map1[5376] = { + 0x0066, 0x0053, 0x0053, 0x0059, 0x0020, 0x0308, 0x0061, 0x0052, 0x0304, + 0x0032, 0x0033, 0x0301, 0x03BC, 0x0327, 0x0031, 0x006F, 0x0041, 0x0041, + 0x0041, 0x0041, 0x0041, 0x0041, 0x0043, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0049, 0x0049, 0x0049, 0x0049, 0x0044, 0x004E, 0x004F, 0x004F, 0x004F, + 0x004F, 0x004F, 0x004F, 0x0055, 0x0055, 0x0055, 0x0055, 0x0059, 0x0061, + 0x0061, 0x0061, 0x0061, 0x0061, 0x0061, 0x0063, 0x0065, 0x0065, 0x0065, + 0x0065, 0x0069, 0x0069, 0x0069, 0x0069, 0x006E, 0x006F, 0x006F, 0x006F, + 0x006F, 0x006F, 0x006F, 0x0075, 0x0075, 0x0075, 0x0075, 0x0079, 0x0079, + 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0043, 0x0063, 0x0043, + 0x0063, 0x0043, 0x0063, 0x0043, 0x0063, 0x0044, 0x0064, 0x0044, 0x0064, + 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, + 0x0065, 0x0047, 0x0067, 0x0047, 0x0067, 0x0047, 0x0067, 0x0047, 0x0067, + 0x0048, 0x0068, 0x0048, 0x0068, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, + 0x0069, 0x0049, 0x0069, 0x0049, 0x004A, 0x006A, 0x004B, 0x006B, 0x004B, + 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, + 0x006C, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004F, + 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x0052, 0x0072, 0x0052, 0x0072, + 0x0052, 0x0072, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053, + 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0055, 0x0075, + 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, + 0x0075, 0x0057, 0x0077, 0x0059, 0x0079, 0x0059, 0x005A, 0x007A, 0x005A, + 0x007A, 0x005A, 0x007A, 0x0073, 0x0062, 0x0042, 0x0042, 0x0062, 0x0043, + 0x0063, 0x0044, 0x0044, 0x0044, 0x0064, 0x0045, 0x0045, 0x0046, 0x0066, + 0x0047, 0x0049, 0x004B, 0x006B, 0x006C, 0x004D, 0x004E, 0x006E, 0x004F, + 0x004F, 0x006F, 0x0050, 0x0070, 0x0283, 0x0074, 0x0054, 0x0074, 0x0054, + 0x0055, 0x0075, 0x0056, 0x0059, 0x0079, 0x005A, 0x007A, 0x01B7, 0x0041, + 0x0061, 0x0049, 0x0069, 0x004F, 0x006F, 0x0055, 0x0075, 0x00DC, 0x00FC, + 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x0065, 0x0041, 0x0061, + 0x0041, 0x0061, 0x00C6, 0x00E6, 0x0047, 0x0067, 0x0047, 0x0067, 0x004B, + 0x006B, 0x004F, 0x006F, 0x01EA, 0x01EB, 0x01B7, 0x0292, 0x006A, 0x0047, + 0x0067, 0x004E, 0x006E, 0x0041, 0x0061, 0x00C6, 0x00E6, 0x00D8, 0x00F8, + 0x0041, 0x0061, 0x0041, 0x0061, 0x0045, 0x0065, 0x0045, 0x0065, 0x0049, + 0x0069, 0x0049, 0x0069, 0x004F, 0x006F, 0x004F, 0x006F, 0x0052, 0x0072, + 0x0052, 0x0072, 0x0055, 0x0075, 0x0055, 0x0075, 0x0053, 0x0073, 0x0054, + 0x0074, 0x0048, 0x0068, 0x004E, 0x0064, 0x005A, 0x007A, 0x0041, 0x0061, + 0x0045, 0x0065, 0x00D6, 0x00F6, 0x00D5, 0x00F5, 0x004F, 0x006F, 0x022E, + 0x022F, 0x0059, 0x0079, 0x006C, 0x006E, 0x0074, 0x006A, 0x0041, 0x0043, + 0x0063, 0x004C, 0x0054, 0x0053, 0x005A, 0x0042, 0x0055, 0x0056, 0x0045, + 0x0065, 0x004A, 0x006A, 0x0051, 0x0071, 0x0052, 0x0072, 0x0059, 0x0079, + 0x0061, 0x0251, 0x0062, 0x006F, 0x0063, 0x0064, 0x0064, 0x0065, 0x0259, + 0x0065, 0x0065, 0x0065, 0x0065, 0x006A, 0x0067, 0x0067, 0x0047, 0x0068, + 0x0068, 0x0069, 0x0049, 0x006C, 0x006C, 0x006C, 0x006D, 0x006D, 0x006D, + 0x006E, 0x006E, 0x006E, 0x006F, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, + 0x0072, 0x0072, 0x0052, 0x0052, 0x0073, 0x006A, 0x0283, 0x0283, 0x0074, + 0x0074, 0x0055, 0x0076, 0x0076, 0x0077, 0x0079, 0x0059, 0x007A, 0x007A, + 0x0292, 0x0043, 0x0042, 0x0065, 0x0047, 0x0048, 0x006A, 0x006B, 0x004C, + 0x0071, 0x0068, 0x0068, 0x0068, 0x0068, 0x006A, 0x0072, 0x0279, 0x027B, + 0x0281, 0x0077, 0x0079, 0x0263, 0x006C, 0x0073, 0x0078, 0x0295, 0x0300, + 0x0301, 0x0313, 0x0308, 0x0061, 0x0065, 0x0069, 0x006F, 0x0075, 0x0063, + 0x0064, 0x0068, 0x006D, 0x0072, 0x0074, 0x0076, 0x0078, 0x02B9, 0x003B, + 0x0020, 0x00A8, 0x0391, 0x00B7, 0x0395, 0x0397, 0x0399, 0x039F, 0x03A5, + 0x03A9, 0x03CA, 0x0399, 0x03A5, 0x03B1, 0x03B5, 0x03B7, 0x03B9, 0x03CB, + 0x03B9, 0x03C5, 0x03BF, 0x03C5, 0x03C9, 0x03B2, 0x03B8, 0x03A5, 0x03D2, + 0x03D2, 0x03C6, 0x03C0, 0x03BA, 0x03C1, 0x03C2, 0x0398, 0x03B5, 0x03A3, + 0x0415, 0x0415, 0x0413, 0x0406, 0x041A, 0x0418, 0x0423, 0x0418, 0x0438, + 0x0435, 0x0435, 0x0433, 0x0456, 0x043A, 0x0438, 0x0443, 0x0466, 0x0467, + 0x046A, 0x046B, 0x0474, 0x0475, 0x0460, 0x0461, 0x0419, 0x0439, 0x0420, + 0x0440, 0x0413, 0x0433, 0x0413, 0x0433, 0x0413, 0x0433, 0x0416, 0x0436, + 0x0417, 0x0437, 0x041A, 0x043A, 0x041A, 0x043A, 0x041A, 0x043A, 0x041A, + 0x043A, 0x041D, 0x043D, 0x041F, 0x043F, 0x0421, 0x0441, 0x0422, 0x0442, + 0x04AE, 0x04AF, 0x0425, 0x0445, 0x0427, 0x0447, 0x0427, 0x0447, 0x0416, + 0x0436, 0x04BC, 0x04BD, 0x0416, 0x0436, 0x041A, 0x043A, 0x041B, 0x043B, + 0x041D, 0x043D, 0x041D, 0x043D, 0x041C, 0x043C, 0x0410, 0x0430, 0x0410, + 0x0430, 0x0415, 0x0435, 0x04D8, 0x04D9, 0x0416, 0x0436, 0x0417, 0x0437, + 0x0418, 0x0438, 0x0418, 0x0438, 0x041E, 0x043E, 0x04E8, 0x04E9, 0x042D, + 0x044D, 0x0423, 0x0443, 0x0423, 0x0443, 0x0423, 0x0443, 0x0427, 0x0447, + 0x0413, 0x0433, 0x042B, 0x044B, 0x0413, 0x0433, 0x0425, 0x0445, 0x0425, + 0x0445, 0x0417, 0x0437, 0x041B, 0x043B, 0x0F0B, 0x10DC, 0x0041, 0x00C6, + 0x0042, 0x0042, 0x0044, 0x0045, 0x018E, 0x0047, 0x0048, 0x0049, 0x004A, + 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0222, 0x0050, 0x0052, 0x0054, + 0x0055, 0x0057, 0x0061, 0x0250, 0x0251, 0x1D02, 0x0062, 0x0064, 0x0065, + 0x0259, 0x025B, 0x025C, 0x0067, 0x006B, 0x006D, 0x014B, 0x006F, 0x0254, + 0x1D16, 0x1D17, 0x0070, 0x0074, 0x0075, 0x1D1D, 0x026F, 0x0076, 0x1D25, + 0x03B2, 0x03B3, 0x03B4, 0x03C6, 0x03C7, 0x0069, 0x0072, 0x0075, 0x0076, + 0x03B2, 0x03B3, 0x03C1, 0x03C6, 0x03C7, 0x0062, 0x0064, 0x0066, 0x006D, + 0x006E, 0x0070, 0x0072, 0x0072, 0x0073, 0x0074, 0x007A, 0x0067, 0x043D, + 0x004C, 0x0070, 0x0055, 0x028A, 0x0062, 0x0064, 0x0066, 0x0067, 0x006B, + 0x006C, 0x006D, 0x006E, 0x0070, 0x0072, 0x0073, 0x0283, 0x0076, 0x0078, + 0x007A, 0x0061, 0x0251, 0x0064, 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, + 0x0283, 0x0252, 0x0063, 0x0255, 0x00F0, 0x025C, 0x0066, 0x025F, 0x0261, + 0x0265, 0x0268, 0x0269, 0x026A, 0x1D7B, 0x029D, 0x026D, 0x1D85, 0x029F, + 0x0271, 0x0270, 0x0272, 0x0273, 0x0274, 0x0275, 0x0278, 0x0282, 0x0283, + 0x01AB, 0x0289, 0x028A, 0x1D1C, 0x028B, 0x028C, 0x007A, 0x0290, 0x0291, + 0x0292, 0x03B8, 0x0041, 0x0061, 0x0042, 0x0062, 0x0042, 0x0062, 0x0042, + 0x0062, 0x0043, 0x0063, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044, 0x0064, + 0x0044, 0x0064, 0x0044, 0x0064, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, + 0x0065, 0x0045, 0x0065, 0x0228, 0x0229, 0x0046, 0x0066, 0x0047, 0x0067, + 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, + 0x0068, 0x0049, 0x0069, 0x00CF, 0x00EF, 0x004B, 0x006B, 0x004B, 0x006B, + 0x004B, 0x006B, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, + 0x006C, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D, 0x006D, 0x004E, 0x006E, + 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x00D5, 0x00F5, 0x00D5, + 0x00F5, 0x014C, 0x014D, 0x014C, 0x014D, 0x0050, 0x0070, 0x0050, 0x0070, + 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0053, + 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, + 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0055, + 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0168, 0x0169, 0x016A, 0x016B, + 0x0056, 0x0076, 0x0056, 0x0076, 0x0057, 0x0077, 0x0057, 0x0077, 0x0057, + 0x0077, 0x0057, 0x0077, 0x0057, 0x0077, 0x0058, 0x0078, 0x0058, 0x0078, + 0x0059, 0x0079, 0x005A, 0x007A, 0x005A, 0x007A, 0x005A, 0x007A, 0x0068, + 0x0074, 0x0077, 0x0079, 0x0061, 0x017F, 0x0041, 0x0061, 0x0041, 0x0061, + 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, + 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, + 0x0041, 0x0061, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, + 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, + 0x0049, 0x0069, 0x0049, 0x0069, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, + 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, + 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, + 0x006F, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, + 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0059, 0x0079, 0x0059, + 0x0079, 0x0059, 0x0079, 0x0059, 0x0079, 0x03B1, 0x03B1, 0x03B1, 0x03B1, + 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, + 0x0391, 0x0391, 0x0391, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, + 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x03B7, 0x03B7, 0x03B7, + 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x0397, 0x0397, 0x0397, + 0x0397, 0x0397, 0x0397, 0x0397, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, + 0x03B9, 0x03B9, 0x03B9, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, + 0x0399, 0x0399, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x039F, + 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x03C5, 0x03C5, 0x03C5, 0x03C5, + 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03A5, 0x03A5, 0x03A5, 0x03A5, 0x03C9, + 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03A9, 0x03A9, + 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03B1, 0x03B1, 0x03B5, + 0x03B5, 0x03B7, 0x03B7, 0x03B9, 0x03B9, 0x03BF, 0x03BF, 0x03C5, 0x03C5, + 0x03C9, 0x03C9, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, + 0x03B1, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, + 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, + 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x03C9, 0x03C9, + 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03A9, 0x03A9, 0x03A9, + 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03B1, 0x03B1, 0x03B1, 0x03B1, + 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, 0x03B7, + 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0395, 0x0395, 0x0397, 0x0397, 0x0397, + 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x0399, 0x0399, 0x0399, + 0x0399, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C1, 0x03C1, 0x03C5, 0x03C5, + 0x03A5, 0x03A5, 0x03A5, 0x03A5, 0x03A1, 0x03C9, 0x03C9, 0x03C9, 0x03C9, + 0x03C9, 0x039F, 0x039F, 0x03A9, 0x03A9, 0x03A9, 0x00B4, 0x0314, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x2010, 0x0333, 0x002E, 0x0020, 0x0020, 0x0030, 0x0069, 0x0034, + 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x002B, 0x2212, 0x003D, 0x0028, + 0x0029, 0x006E, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, + 0x0037, 0x0038, 0x0039, 0x002B, 0x2212, 0x003D, 0x0028, 0x0029, 0x0061, + 0x0065, 0x006F, 0x0078, 0x0259, 0x0043, 0x0190, 0x0067, 0x0048, 0x0048, + 0x0048, 0x0068, 0x0068, 0x0049, 0x0049, 0x004C, 0x006C, 0x004E, 0x0050, + 0x0051, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0056, 0x005A, 0x03A9, + 0x01B1, 0x005A, 0x004B, 0x00C5, 0x0042, 0x0043, 0x0065, 0x0065, 0x0045, + 0x0046, 0x004D, 0x006F, 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x0069, 0x03C0, + 0x03B3, 0x0393, 0x03A0, 0x2211, 0x0044, 0x0064, 0x0065, 0x0069, 0x006A, + 0x0049, 0x0056, 0x0058, 0x004C, 0x0043, 0x0044, 0x004D, 0x0069, 0x0076, + 0x0078, 0x006C, 0x0063, 0x0064, 0x006D, 0x2203, 0x2208, 0x220B, 0x3008, + 0x3009, 0x0062, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, + 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, + 0x005A, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, + 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, + 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, + 0x0039, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x004C, 0x006C, 0x004C, 0x0050, 0x0052, 0x0061, 0x0074, + 0x0048, 0x0068, 0x004B, 0x006B, 0x005A, 0x007A, 0x0076, 0x0057, 0x0058, + 0x0076, 0x006A, 0x0056, 0x2D61, 0x6BCD, 0x6C11, 0x864E, 0x897F, 0x89D2, + 0x957F, 0x9752, 0x98DF, 0x9AA8, 0x9B3C, 0x9EA6, 0x9EC4, 0x9F9F, 0x4E00, + 0x4E28, 0x4E36, 0x4E3F, 0x4E59, 0x4E85, 0x4E8C, 0x4EA0, 0x4EBA, 0x513F, + 0x5165, 0x516B, 0x5182, 0x5196, 0x51AB, 0x51E0, 0x51F5, 0x5200, 0x529B, + 0x52F9, 0x5315, 0x531A, 0x5338, 0x5341, 0x535C, 0x5369, 0x5382, 0x53B6, + 0x53C8, 0x53E3, 0x56D7, 0x571F, 0x58EB, 0x5902, 0x590A, 0x5915, 0x5927, + 0x5973, 0x5B50, 0x5B80, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C6E, 0x5C71, + 0x5DDB, 0x5DE5, 0x5DF1, 0x5DFE, 0x5E72, 0x5E7A, 0x5E7F, 0x5EF4, 0x5EFE, + 0x5F0B, 0x5F13, 0x5F50, 0x5F61, 0x5F73, 0x5FC3, 0x6208, 0x6236, 0x624B, + 0x652F, 0x6534, 0x6587, 0x6597, 0x65A4, 0x65B9, 0x65E0, 0x65E5, 0x66F0, + 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, 0x6BB3, 0x6BCB, 0x6BD4, 0x6BDB, + 0x6C0F, 0x6C14, 0x6C34, 0x706B, 0x722A, 0x7236, 0x723B, 0x723F, 0x7247, + 0x7259, 0x725B, 0x72AC, 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, + 0x7528, 0x7530, 0x758B, 0x7592, 0x7676, 0x767D, 0x76AE, 0x76BF, 0x76EE, + 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79B8, 0x79BE, 0x7A74, 0x7ACB, 0x7AF9, + 0x7C73, 0x7CF8, 0x7F36, 0x7F51, 0x7F8A, 0x7FBD, 0x8001, 0x800C, 0x8012, + 0x8033, 0x807F, 0x8089, 0x81E3, 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B, + 0x821F, 0x826E, 0x8272, 0x8278, 0x864D, 0x866B, 0x8840, 0x884C, 0x8863, + 0x897E, 0x898B, 0x89D2, 0x8A00, 0x8C37, 0x8C46, 0x8C55, 0x8C78, 0x8C9D, + 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, 0x8FB0, 0x8FB5, 0x9091, + 0x9149, 0x91C6, 0x91CC, 0x91D1, 0x9577, 0x9580, 0x961C, 0x96B6, 0x96B9, + 0x96E8, 0x9751, 0x975E, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, + 0x98A8, 0x98DB, 0x98DF, 0x9996, 0x9999, 0x99AC, 0x9AA8, 0x9AD8, 0x9ADF, + 0x9B25, 0x9B2F, 0x9B32, 0x9B3C, 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F, 0x9EA5, + 0x9EBB, 0x9EC3, 0x9ECD, 0x9ED1, 0x9EF9, 0x9EFD, 0x9F0E, 0x9F13, 0x9F20, + 0x9F3B, 0x9F4A, 0x9F52, 0x9F8D, 0x9F9C, 0x9FA0, 0x0020, 0x3012, 0x5341, + 0x5344, 0x5345, 0x1100, 0x1101, 0x11AA, 0x1102, 0x11AC, 0x11AD, 0x1103, + 0x1104, 0x1105, 0x11B0, 0x11B1, 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x111A, + 0x1106, 0x1107, 0x1108, 0x1121, 0x1109, 0x110A, 0x110B, 0x110C, 0x110D, + 0x110E, 0x110F, 0x1110, 0x1111, 0x1112, 0x1161, 0x1162, 0x1163, 0x1164, + 0x1165, 0x1166, 0x1167, 0x1168, 0x1169, 0x116A, 0x116B, 0x116C, 0x116D, + 0x116E, 0x116F, 0x1170, 0x1171, 0x1172, 0x1173, 0x1174, 0x1175, 0x1160, + 0x1114, 0x1115, 0x11C7, 0x11C8, 0x11CC, 0x11CE, 0x11D3, 0x11D7, 0x11D9, + 0x111C, 0x11DD, 0x11DF, 0x111D, 0x111E, 0x1120, 0x1122, 0x1123, 0x1127, + 0x1129, 0x112B, 0x112C, 0x112D, 0x112E, 0x112F, 0x1132, 0x1136, 0x1140, + 0x1147, 0x114C, 0x11F1, 0x11F2, 0x1157, 0x1158, 0x1159, 0x1184, 0x1185, + 0x1188, 0x1191, 0x1192, 0x1194, 0x119E, 0x11A1, 0x4E00, 0x4E8C, 0x4E09, + 0x56DB, 0x4E0A, 0x4E2D, 0x4E0B, 0x7532, 0x4E59, 0x4E19, 0x4E01, 0x5929, + 0x5730, 0x4EBA, 0x554F, 0x5E7C, 0x6587, 0x7B8F, 0x1100, 0x1102, 0x1103, + 0x1105, 0x1106, 0x1107, 0x1109, 0x110B, 0x110C, 0x110E, 0x110F, 0x1110, + 0x1111, 0x1112, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, + 0x516B, 0x4E5D, 0x5341, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, + 0x65E5, 0x682A, 0x6709, 0x793E, 0x540D, 0x7279, 0x8CA1, 0x795D, 0x52B4, + 0x79D8, 0x7537, 0x5973, 0x9069, 0x512A, 0x5370, 0x6CE8, 0x9805, 0x4F11, + 0x5199, 0x6B63, 0x4E0A, 0x4E2D, 0x4E0B, 0x5DE6, 0x53F3, 0x533B, 0x5B97, + 0x5B66, 0x76E3, 0x4F01, 0x8CC7, 0x5354, 0x591C, 0x30A2, 0x30A4, 0x30A6, + 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, + 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, + 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, + 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, + 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x4E22, + 0x5E76, 0x5E7A, 0x5E72, 0x4E71, 0x4E98, 0x4E9A, 0x4F2B, 0x5E03, 0x5360, + 0x6765, 0x4FA3, 0x4FE3, 0x7CFB, 0x4FA0, 0x4F25, 0x4FE9, 0x4ED3, 0x4E2A, + 0x4EEC, 0x4F26, 0x4F1F, 0x4FA7, 0x4FA6, 0x4F2A, 0x6770, 0x4F27, 0x4F1E, + 0x5907, 0x5BB6, 0x4F63, 0x506C, 0x4F20, 0x4F1B, 0x503A, 0x4F24, 0x503E, + 0x507B, 0x4EC5, 0x4F65, 0x4FA8, 0x4EC6, 0x4FA5, 0x507E, 0x96C7, 0x4EF7, + 0x4EEA, 0x4FAC, 0x4EBF, 0x4FED, 0x50A7, 0x4FE6, 0x4FAA, 0x5C3D, 0x507F, + 0x4F18, 0x50A8, 0x4FEA, 0x50A9, 0x50A5, 0x4FE8, 0x51F6, 0x5151, 0x513F, + 0x5156, 0x5185, 0x4E24, 0x518C, 0x80C4, 0x5199, 0x5E42, 0x51BB, 0x51DB, + 0x51EF, 0x522B, 0x5220, 0x522D, 0x5219, 0x5239, 0x521A, 0x5265, 0x5250, + 0x5240, 0x521B, 0x522C, 0x5212, 0x5267, 0x5218, 0x523D, 0x523F, 0x5251, + 0x5242, 0x52B2, 0x52A8, 0x52D6, 0x52A1, 0x80DC, 0x52B3, 0x52BF, 0x52A2, + 0x52CB, 0x52B1, 0x529D, 0x5300, 0x5326, 0x6C47, 0x532E, 0x533A, 0x534F, + 0x6064, 0x5374, 0x538D, 0x538C, 0x5389, 0x53A3, 0x53C2, 0x4E1B, 0x54A4, + 0x5434, 0x5450, 0x5415, 0x5458, 0x55B1, 0x5457, 0x5FF5, 0x95EE, 0x54D1, + 0x542F, 0x5524, 0x4E27, 0x4E54, 0x5355, 0x54DF, 0x545B, 0x556C, 0x551D, + 0x5417, 0x545C, 0x5522, 0x54D4, 0x53F9, 0x55BD, 0x5455, 0x5567, 0x5C1D, + 0x551B, 0x54D7, 0x5520, 0x5578, 0x53FD, 0x54D3, 0x5452, 0x5574, 0x6076, + 0x5618, 0x549D, 0x54D2, 0x54DD, 0x54D5, 0x55F3, 0x54D9, 0x55B7, 0x5428, + 0x549B, 0x5413, 0x54DC, 0x5C1D, 0x565C, 0x556E, 0x5456, 0x5499, 0x4EB8, + 0x55BE, 0x4E25, 0x5624, 0x556D, 0x55EB, 0x56A3, 0x5181, 0x5453, 0x5570, + 0x5631, 0x56F1, 0x56F5, 0x56FD, 0x56F4, 0x56ED, 0x5706, 0x56FE, 0x56E2, + 0x57AD, 0x6267, 0x575A, 0x57A9, 0x57DA, 0x5C27, 0x62A5, 0x573A, 0x5757, + 0x8314, 0x57B2, 0x57D8, 0x6D82, 0x51A2, 0x575E, 0x57D9, 0x5C18, 0x5811, + 0x57AB, 0x5760, 0x5815, 0x575F, 0x57A6, 0x575B, 0x538B, 0x5792, 0x5739, + 0x5786, 0x574F, 0x5785, 0x575C, 0x575D, 0x58EE, 0x58F6, 0x58F8, 0x5BFF, + 0x591F, 0x68A6, 0x4F19, 0x5939, 0x5942, 0x5965, 0x5941, 0x593A, 0x594B, + 0x59F9, 0x5986, 0x59D7, 0x5978, 0x5A31, 0x5A04, 0x5987, 0x5A05, 0x5A32, + 0x59AB, 0x5AAA, 0x5988, 0x59AA, 0x59A9, 0x5A34, 0x5A73, 0x5A06, 0x5A75, + 0x5A07, 0x5AF1, 0x5AD2, 0x5B37, 0x5AD4, 0x5A74, 0x5A76, 0x5A08, 0x5B59, + 0x5B66, 0x5B6A, 0x5BAB, 0x5BDD, 0x5B9E, 0x5B81, 0x5BA1, 0x5199, 0x5BBD, + 0x5BA0, 0x5B9D, 0x5C06, 0x4E13, 0x5BFB, 0x5BF9, 0x5BFC, 0x5C34, 0x5C4A, + 0x5C38, 0x5C49, 0x5C61, 0x5C42, 0x5C5F, 0x5C66, 0x5C5E, 0x5188, 0x5C98, + 0x5C9B, 0x5CE1, 0x5D03, 0x5C97, 0x4ED1, 0x5CE5, 0x5C9A, 0x5D5D, 0x5D2D, + 0x5C96, 0x5D5A, 0x5D02, 0x5CE4, 0x5CE3, 0x5CC4, 0x5D04, 0x5C99, 0x5D58, + 0x5CAD, 0x5C7F, 0x5CB3, 0x5CBF, 0x5CE6, 0x5DC5, 0x5DEF, 0x5E05, 0x5E08, + 0x5E10, 0x5E26, 0x5E27, 0x5E0F, 0x5E3C, 0x5E3B, 0x5E1C, 0x5E01, 0x5E2E, + 0x5E31, 0x5E72, 0x51E0, 0x5E93, 0x5395, 0x53A2, 0x53A6, 0x53A8, 0x53AE, + 0x5E99, 0x5382, 0x5E91, 0x5E9F, 0x5E7F, 0x5EEA, 0x5E90, 0x5385, 0x5F11, + 0x5F2A, 0x5F20, 0x5F3A, 0x5F39, 0x5F25, 0x5F2F, 0x5F66, 0x540E, 0x5F84, + 0x4ECE, 0x5F95, 0x590D, 0x5F81, 0x5F7B, 0x6052, 0x803B, 0x60A6, 0x6005, + 0x95F7, 0x6076, 0x607C, 0x607D, 0x607B, 0x7231, 0x60EC, 0x60AB, 0x6006, + 0x607A, 0x5FFE, 0x6001, 0x6120, 0x60E8, 0x60ED, 0x6078, 0x60EF, 0x6004, + 0x6002, 0x8651, 0x60AD, 0x5E86, 0x5FE7, 0x60EB, 0x601C, 0x51ED, 0x6126, + 0x616D, 0x60EE, 0x6124, 0x60AF, 0x6003, 0x5BAA, 0x5FC6, 0x6073, 0x5E94, + 0x603F, 0x61D4, 0x603C, 0x61D1, 0x6079, 0x60E9, 0x61D2, 0x6000, 0x60AC, + 0x5FCF, 0x60E7, 0x6151, 0x604B, 0x6206, 0x620B, 0x6217, 0x622C, 0x6218, + 0x620F, 0x6237, 0x629B, 0x631F, 0x820D, 0x626A, 0x5377, 0x626B, 0x62A1, + 0x6323, 0x6302, 0x91C7, 0x62E3, 0x626C, 0x6362, 0x6325, 0x635F, 0x6447, + 0x6363, 0x62A2, 0x63B4, 0x63BC, 0x6402, 0x631A, 0x62A0, 0x629F, 0x63BA, + 0x635E, 0x6491, 0x6320, 0x6322, 0x63B8, 0x62E8, 0x629A, 0x6251, 0x63FF, + 0x631E, 0x631D, 0x6361, 0x62E5, 0x63B3, 0x62E9, 0x51FB, 0x6321, 0x62C5, + 0x636E, 0x6324, 0x62DF, 0x6448, 0x62E7, 0x6401, 0x63B7, 0x6269, 0x64B7, + 0x6446, 0x64DE, 0x64B8, 0x6270, 0x6445, 0x64B5, 0x62E2, 0x62E6, 0x6484, + 0x6400, 0x64BA, 0x643A, 0x6444, 0x6512, 0x631B, 0x644A, 0x6405, 0x63FD, + 0x668B, 0x8D25, 0x53D9, 0x654C, 0x6570, 0x655B, 0x6BD9, 0x6593, 0x65A9, + 0x65AD, 0x4E8E, 0x5347, 0x65F6, 0x664B, 0x663C, 0x6655, 0x6656, 0x65F8, + 0x7545, 0x6682, 0x6635, 0x6654, 0x5386, 0x6619, 0x6653, 0x66A7, 0x65F7, + 0x663D, 0x6652, 0x4E66, 0x4F1A, 0x80E7, 0x4E1C, 0x6805, 0x6746, 0x6800, + 0x67A7, 0x6761, 0x67AD, 0x5F03, 0x67A8, 0x67A3, 0x680B, 0x6808, 0x6816, + 0x6860, 0x6768, 0x67AB, 0x6862, 0x4E1A, 0x6781, 0x6769, 0x8363, 0x6864, + 0x6784, 0x67AA, 0x6760, 0x68BF, 0x6920, 0x6901, 0x6868, 0x6869, 0x4E50, + 0x679E, 0x697C, 0x6807, 0x67A2, 0x6837, 0x6734, 0x6811, 0x6866, 0x6861, + 0x6865, 0x673A, 0x692D, 0x6A2A, 0x6AA9, 0x69DC, 0x67FD, 0x6863, 0x6867, + 0x69DA, 0x68C0, 0x6A2F, 0x68BC, 0x53F0, 0x69DF, 0x67E0, 0x69DB, 0x82D8, + 0x67DC, 0x6A79, 0x6988, 0x6809, 0x691F, 0x6A7C, 0x680E, 0x6A71, 0x69E0, + 0x680C, 0x67A5, 0x6A65, 0x6987, 0x680A, 0x6989, 0x68C2, 0x6A31, 0x680F, + 0x6743, 0x6924, 0x683E, 0x6984, 0x94A6, 0x6B27, 0x6B24, 0x6B22, 0x5C81, + 0x5386, 0x5F52, 0x6B81, 0x6B8B, 0x6B92, 0x6B87, 0x6B9A, 0x6B93, 0x6BA1, + 0x6B7C, 0x6740, 0x58F3, 0x6BC1, 0x6BB4, 0x6BF5, 0x6BE1, 0x6C07, 0x6C14, + 0x6C22, 0x6C29, 0x6C32, 0x51FC, 0x51B3, 0x51B1, 0x6CA1, 0x51B5, 0x6CC4, + 0x6C79, 0x6D43, 0x6CFE, 0x51C9, 0x51C4, 0x6CEA, 0x6E0C, 0x51C0, 0x6CA6, + 0x6E0A, 0x6D9E, 0x6D45, 0x6DA3, 0x51CF, 0x6CA8, 0x6DA1, 0x6D4B, 0x6D51, + 0x51D1, 0x6D48, 0x6D8C, 0x6D07, 0x6C64, 0x6CA9, 0x51C6, 0x6C9F, 0x6E29, + 0x6DA2, 0x6E7F, 0x6CA7, 0x706D, 0x6DA4, 0x8365, 0x6CAA, 0x6EDE, 0x6E17, + 0x6D52, 0x6D50, 0x6EDA, 0x6EE1, 0x6E14, 0x6E87, 0x6CA4, 0x6C49, 0x6D9F, + 0x6E0D, 0x6DA8, 0x6E10, 0x6D46, 0x988D, 0x6CFC, 0x6D01, 0x6F5C, 0x6DA6, + 0x6D54, 0x6E83, 0x6DA0, 0x6DA9, 0x6D47, 0x6D9D, 0x6C84, 0x6DA7, 0x6E11, + 0x6CFD, 0x6EEA, 0x6CF6, 0x6D4D, 0x6D4A, 0x6D53, 0x6E7F, 0x6CDE, 0x6D4E, + 0x6D9B, 0x6EE5, 0x6F4D, 0x6EE8, 0x6E85, 0x6CFA, 0x6EE4, 0x6EE2, 0x6E0E, + 0x6CFB, 0x6D4F, 0x6FD2, 0x6CF8, 0x6CA5, 0x6F47, 0x6F46, 0x6F74, 0x6CF7, + 0x6FD1, 0x6F4B, 0x6F9C, 0x6CA3, 0x6EE0, 0x6D12, 0x6EE9, 0x704F, 0x6E7E, + 0x6EE6, 0x6EDF, 0x707E, 0x4E3A, 0x4E4C, 0x70C3, 0x65E0, 0x70BC, 0x709C, + 0x70DF, 0x8315, 0x7115, 0x70E6, 0x7080, 0x8367, 0x709D, 0x70ED, 0x70BD, + 0x70E8, 0x706F, 0x7096, 0x70E7, 0x70EB, 0x7116, 0x8425, 0x707F, 0x70DB, + 0x70E9, 0x70EC, 0x7118, 0x70C1, 0x7089, 0x70C2, 0x4E89, 0x4E3A, 0x7237, + 0x5C14, 0x5899, 0x724D, 0x7275, 0x8366, 0x7266, 0x728A, 0x727A, 0x72B6, + 0x72ED, 0x72C8, 0x72F0, 0x72B9, 0x72F2, 0x72B8, 0x72F1, 0x72EE, 0x5956, + 0x72EC, 0x72EF, 0x7303, 0x72DE, 0x83B7, 0x730E, 0x72B7, 0x517D, 0x736D, + 0x732E, 0x7315, 0x7321, 0x73B0, 0x73D0, 0x73F2, 0x73AE, 0x739A, 0x7410, + 0x7476, 0x83B9, 0x739B, 0x7405, 0x73B1, 0x740F, 0x740E, 0x7391, 0x7477, + 0x73F0, 0x73AF, 0x7399, 0x73BA, 0x743C, 0x73D1, 0x748E, 0x74D2, 0x74EF, + 0x74EE, 0x4EA7, 0x4EA7, 0x4EA9, 0x6BD5, 0x753B, 0x7572, 0x5F02, 0x5F53, + 0x7574, 0x53E0, 0x75C9, 0x9178, 0x75F9, 0x75D6, 0x75AF, 0x75A1, 0x75EA, + 0x7617, 0x75AE, 0x759F, 0x75AD, 0x7618, 0x7597, 0x75E8, 0x75EB, 0x7605, + 0x75A0, 0x762A, 0x75D2, 0x7596, 0x75AC, 0x765E, 0x7663, 0x763F, 0x763E, + 0x75C8, 0x762B, 0x766B, 0x53D1, 0x7691, 0x75B1, 0x76B2, 0x76B1, 0x676F, + 0x76D7, 0x76CF, 0x5C3D, 0x76D1, 0x76D8, 0x5362, 0x8361, 0x7726, 0x4F17, + 0x56F0, 0x7741, 0x7750, 0x772F, 0x7792, 0x4E86, 0x7786, 0x7751, 0x772C, + 0x77A9, 0x77EB, 0x7845, 0x70AE, 0x7841, 0x7856, 0x7817, 0x781A, 0x7855, + 0x7800, 0x786E, 0x7801, 0x7859, 0x7816, 0x789C, 0x789B, 0x77F6, 0x7857, + 0x785A, 0x7840, 0x788D, 0x77FF, 0x783A, 0x783E, 0x77FE, 0x783B, 0x7984, + 0x7978, 0x796F, 0x794E, 0x5FA1, 0x7985, 0x793C, 0x7977, 0x79C3, 0x7C7C, + 0x7A0E, 0x79C6, 0x68F1, 0x79CD, 0x79F0, 0x7A23, 0x79EF, 0x9896, 0x79FE, + 0x7A51, 0x79FD, 0x7A33, 0x7A9D, 0x6D3C, 0x7A77, 0x7A91, 0x7A8E, 0x7AAD, + 0x7AA5, 0x7A9C, 0x7A8D, 0x7AA6, 0x7A83, 0x7ADE, 0x7B14, 0x7B0B, 0x7B15, + 0x7B3A, 0x7B5D, 0x8282, 0x8303, 0x7B51, 0x7BA7, 0x7B7C, 0x7B03, 0x7B5B, + 0x7B5A, 0x7BA6, 0x7BD3, 0x7BAA, 0x7B80, 0x7BD1, 0x7BAB, 0x6A90, 0x7B5C, + 0x7B7E, 0x5E18, 0x7BEE, 0x7B79, 0x7B93, 0x7BEF, 0x7BA8, 0x7C41, 0x7B3C, + 0x7B7E, 0x7B3E, 0x7BF1, 0x7BA9, 0x5401, 0x5986, 0x7CA4, 0x7CC1, 0x7CAA, + 0x7CAE, 0x7CF5, 0x7C9D, 0x7C74, 0x7C9C, 0x7EA0, 0x7EAA, 0x7EA3, 0x7EA6, + 0x7EA2, 0x7EA1, 0x7EA5, 0x7EA8, 0x7EAB, 0x7EB9, 0x7EB3, 0x7EBD, 0x7EBE, + 0x7EAF, 0x7EB0, 0x7EB1, 0x7EB8, 0x7EA7, 0x7EB7, 0x7EAD, 0x7EB4, 0x7EBA, + 0x624E, 0x624E, 0x7EC6, 0x7EC2, 0x7EC1, 0x7EC5, 0x7EBB, 0x7ECD, 0x7EC0, + 0x7ECB, 0x7ED0, 0x7ECC, 0x7EC8, 0x5F26, 0x7EC4, 0x7ECA, 0x7ED7, 0x7ED3, + 0x7EDD, 0x7EE6, 0x7ED4, 0x7EDE, 0x7EDC, 0x7EDA, 0x7ED9, 0x7ED2, 0x7ED6, + 0x7EDF, 0x4E1D, 0x7EDB, 0x7EE2, 0x7ED1, 0x7EE1, 0x7EE0, 0x7EE8, 0x7EE5, + 0x7ECF, 0x7EFC, 0x7F0D, 0x7EFF, 0x7EF8, 0x7EFB, 0x7EF6, 0x7EF4, 0x7EFE, + 0x7EB2, 0x7F51, 0x7F00, 0x7EB6, 0x7EFA, 0x7EEE, 0x7EFD, 0x7EF0, 0x7EEB, + 0x7EF5, 0x7EF2, 0x7F01, 0x7D27, 0x7EEF, 0x7EEA, 0x7F03, 0x7F04, 0x7F02, + 0x7EBF, 0x7F09, 0x7F0E, 0x7F14, 0x7F17, 0x7F18, 0x7F0C, 0x7F16, 0x7F13, + 0x7F05, 0x7EAC, 0x7F11, 0x7F08, 0x7EC3, 0x7F0F, 0x7F07, 0x81F4, 0x8426, + 0x7F19, 0x7F22, 0x7F12, 0x7EC9, 0x7F23, 0x7F1E, 0x7F1A, 0x7F1C, 0x7F1F, + 0x7F1B, 0x53BF, 0x7F1D, 0x7F29, 0x7EB5, 0x7F27, 0x7F26, 0x7D77, 0x7F15, + 0x7F25, 0x603B, 0x7EE9, 0x7EF7, 0x7F2B, 0x7F2A, 0x7F2F, 0x7EC7, 0x7F2E, + 0x7F2D, 0x7ED5, 0x7EE3, 0x7F0B, 0x7EF3, 0x7ED8, 0x7CFB, 0x8327, 0x7F33, + 0x7F32, 0x7F34, 0x7ECE, 0x7EE7, 0x7F24, 0x7F31, 0x7F2C, 0x7EA9, 0x7EED, + 0x7F20, 0x7F28, 0x7EA4, 0x7F35, 0x7F06, 0x94B5, 0x7F42, 0x7F5A, 0x9A82, + 0x7F62, 0x7F57, 0x7F74, 0x7F81, 0x8288, 0x7F9F, 0x7FA1, 0x4E49, 0x81BB, + 0x4E60, 0x7FC6, 0x7FDA, 0x7FD8, 0x7FD9, 0x8027, 0x5723, 0x95FB, 0x8054, + 0x806A, 0x58F0, 0x8038, 0x8069, 0x8042, 0x804C, 0x804D, 0x542C, 0x804B, + 0x8083, 0x80C1, 0x8109, 0x80EB, 0x8131, 0x80C0, 0x80BE, 0x80E8, 0x8136, + 0x8111, 0x80BF, 0x811A, 0x80A0, 0x817D, 0x8158, 0x80A4, 0x80F6, 0x817B, + 0x80C6, 0x810D, 0x8113, 0x8138, 0x8110, 0x8191, 0x814A, 0x80EA, 0x810F, + 0x8114, 0x81DC, 0x5367, 0x4E34, 0x53F0, 0x4E0E, 0x5174, 0x4E3E, 0x65E7, + 0x8231, 0x8223, 0x8230, 0x823B, 0x8270, 0x8273, 0x82C4, 0x520D, 0x82CE, + 0x5179, 0x8346, 0x8C46, 0x5E84, 0x830E, 0x835A, 0x82CB, 0x534E, 0x70DF, + 0x82CC, 0x83B1, 0x4E07, 0x83B4, 0x53F6, 0x836D, 0x7740, 0x82C7, 0x8364, + 0x641C, 0x83B3, 0x8385, 0x82CD, 0x836A, 0x76D6, 0x83B2, 0x82C1, 0x83BC, + 0x835C, 0x848C, 0x848B, 0x8471, 0x8311, 0x836B, 0x8368, 0x8487, 0x835E, + 0x836C, 0x83B8, 0x835B, 0x8489, 0x829C, 0x8427, 0x84E3, 0x835F, 0x84DF, + 0x8297, 0x59DC, 0x8537, 0x83B6, 0x8350, 0x8428, 0x8360, 0x501F, 0x84DD, + 0x8369, 0x827A, 0x836F, 0x85AE, 0x82C8, 0x853C, 0x853A, 0x841A, 0x8572, + 0x82A6, 0x82CF, 0x8574, 0x82F9, 0x8616, 0x85D3, 0x8539, 0x830F, 0x5170, + 0x84E0, 0x841D, 0x5904, 0x865A, 0x864F, 0x53F7, 0x4E8F, 0x866C, 0x86F1, + 0x8715, 0x86AC, 0x8680, 0x732C, 0x867E, 0x8671, 0x8717, 0x86F3, 0x8682, + 0x8424, 0x877C, 0x8780, 0x86F0, 0x8748, 0x87A8, 0x866E, 0x8749, 0x86F2, + 0x866B, 0x86CF, 0x8681, 0x8683, 0x8747, 0x867F, 0x874E, 0x86F4, 0x877E, + 0x869D, 0x8721, 0x86CE, 0x87CF, 0x86CA, 0x8695, 0x86EE, 0x4F17, 0x672F, + 0x536B, 0x51B2, 0x886E, 0x8885, 0x8865, 0x88C5, 0x91CC, 0x5236, 0x590D, + 0x88C8, 0x8886, 0x88E4, 0x88E2, 0x7F21, 0x891B, 0x4EB5, 0x88E5, 0x8884, + 0x88E3, 0x88C6, 0x8934, 0x889C, 0x886C, 0x88AD, 0x8955, 0x89C1, 0x89C4, + 0x89C5, 0x89C6, 0x89C7, 0x89CB, 0x89CD, 0x89CE, 0x4EB2, 0x89CA, 0x89CF, + 0x89D0, 0x89D1, 0x89C9, 0x89C8, 0x89CC, 0x89C2, 0x89DE, 0x89EF, 0x89E6, + 0x8BA2, 0x8BA3, 0x8BA1, 0x8BAF, 0x8BA7, 0x8BA8, 0x8BA6, 0x8BAD, 0x8BAA, + 0x8BAB, 0x8BAC, 0x8BB0, 0x8BB9, 0x8BB6, 0x8BBC, 0x8BC0, 0x8BB7, 0x8BBF, + 0x8BBE, 0x8BB8, 0x8BC9, 0x8BC3, 0x8BCA, 0x8BC1, 0x8BC2, 0x8BCB, 0x8BB5, + 0x8BC8, 0x8BD2, 0x8BCF, 0x8BC4, 0x8BCE, 0x8BC5, 0x8BCD, 0x548F, 0x8BE9, + 0x8BE2, 0x8BE3, 0x8BD5, 0x8BD7, 0x8BE7, 0x8BDF, 0x8BE1, 0x8BE0, 0x8BD8, + 0x8BDD, 0x8BE5, 0x8BE6, 0x8BDC, 0x8BD9, 0x8BD6, 0x8BD4, 0x8BDB, 0x8BD3, + 0x5938, 0x5FD7, 0x8BA4, 0x8BF3, 0x8BF6, 0x8BDE, 0x8BF1, 0x8BEE, 0x8BED, + 0x8BDA, 0x8BEB, 0x8BEC, 0x8BEF, 0x8BF0, 0x8BF5, 0x8BF2, 0x8BF4, 0x8C01, + 0x8BFE, 0x8C07, 0x8BFD, 0x8C0A, 0x8C03, 0x8C04, 0x8C06, 0x8C08, 0x8BFF, + 0x8BF7, 0x8BE4, 0x8BF9, 0x8BFC, 0x8C05, 0x8BBA, 0x8C02, 0x8C00, 0x8C0D, + 0x8C1E, 0x8C1D, 0x8C25, 0x8BE8, 0x8C14, 0x8C1B, 0x8C10, 0x8C0F, 0x8C15, + 0x8C18, 0x8BB3, 0x8C19, 0x8C0C, 0x8BBD, 0x8BF8, 0x8C1A, 0x8C16, 0x8BFA, + 0x8C0B, 0x8C12, 0x8C13, 0x8A8A, 0x8BCC, 0x8C0E, 0x8C1C, 0x8C27, 0x8C11, + 0x8C21, 0x8C24, 0x8C26, 0x8BB2, 0x8C22, 0x8C23, 0x8C1F, 0x8C2A, 0x8C2C, + 0x8BB4, 0x8C28, 0x8C29, 0x8BC1, 0x8C32, 0x8BA5, 0x8C2E, 0x8BC6, 0x8C2F, + 0x8C2D, 0x8C31, 0x8C35, 0x8BD1, 0x8BAE, 0x8C34, 0x62A4, 0x8BEA, 0x8A89, + 0x8C2B, 0x8BFB, 0x53D8, 0x8A5F, 0x96E0, 0x8C17, 0x8BA9, 0x8C30, 0x8C36, + 0x8D5E, 0x8C20, 0x8C33, 0x5C82, 0x7AD6, 0x4E30, 0x732A, 0x8C6E, 0x732B, + 0x8D1D, 0x8D1E, 0x8D1F, 0x8D22, 0x8D21, 0x8D2B, 0x8D27, 0x8D29, 0x8D2A, + 0x8D2F, 0x8D23, 0x8D2E, 0x8D33, 0x8D40, 0x8D30, 0x8D35, 0x8D2C, 0x4E70, + 0x8D37, 0x8D36, 0x8D39, 0x8D34, 0x8D3B, 0x8D38, 0x8D3A, 0x8D32, 0x8D42, + 0x8D41, 0x8D3F, 0x8D45, 0x8D44, 0x8D3E, 0x8D3C, 0x8D48, 0x8D4A, 0x5BBE, + 0x8D47, 0x8D52, 0x8D49, 0x8D50, 0x8D4F, 0x8D54, 0x8D53, 0x8D24, 0x5356, + 0x8D31, 0x8D4B, 0x8D55, 0x8D28, 0x8D26, 0x8D4C, 0x8D56, 0x8D57, 0x8D5A, + 0x8D59, 0x8D2D, 0x8D5B, 0x8D5C, 0x8D3D, 0x8D58, 0x8D5F, 0x8D60, 0x8D5E, + 0x8D61, 0x8D62, 0x8D46, 0x8D43, 0x8D51, 0x8D4E, 0x8D5D, 0x8D63, 0x8D6A, + 0x8D76, 0x8D75, 0x8D8B, 0x8DB1, 0x8FF9, 0x8DF5, 0x8E0A, 0x8DC4, 0x8DF8, + 0x8DD6, 0x8E52, 0x8DF7, 0x8DF6, 0x8DB8, 0x8E0C, 0x8DFB, 0x8DC3, 0x8E2F, + 0x8DDE, 0x8E2C, 0x8E70, 0x8DF9, 0x8E51, 0x8E7F, 0x8E9C, 0x8E8F, 0x8EAF, + 0x8F66, 0x8F67, 0x8F68, 0x519B, 0x8F69, 0x8F6B, 0x8F6D, 0x8F6F, 0x8F78, + 0x8F71, 0x8F74, 0x8F75, 0x8F7A, 0x8F72, 0x8F76, 0x8F7C, 0x8F83, 0x8F82, + 0x8F81, 0x8F80, 0x8F7D, 0x8F7E, 0x8F84, 0x8F85, 0x8F7B, 0x8F86, 0x8F8E, + 0x8F89, 0x8F8B, 0x8F8D, 0x8F8A, 0x8F87, 0x8F88, 0x8F6E, 0x8F91, 0x8F8F, + 0x8F93, 0x8F90, 0x8F97, 0x8206, 0x8F92, 0x6BC2, 0x8F96, 0x8F95, 0x8F98, + 0x8F6C, 0x8F99, 0x8F7F, 0x8F9A, 0x8F70, 0x8F94, 0x8F79, 0x8F73, 0x529E, + 0x8F9E, 0x8FAB, 0x8FA9, 0x519C, 0x8FD9, 0x8FDE, 0x5468, 0x8FDB, 0x6E38, + 0x8FD0, 0x8FC7, 0x8FBE, 0x8FDD, 0x9065, 0x900A, 0x9012, 0x8FDC, 0x9002, + 0x8FDF, 0x8FC1, 0x9009, 0x9057, 0x8FBD, 0x8FC8, 0x8FD8, 0x8FE9, 0x8FB9, + 0x903B, 0x9026, 0x90CF, 0x90AE, 0x90D3, 0x4E61, 0x90B9, 0x90AC, 0x90E7, + 0x9093, 0x90D1, 0x90BB, 0x90F8, 0x90BA, 0x90D0, 0x909D, 0x9142, 0x90E6, + 0x814C, 0x4E11, 0x915D, 0x533B, 0x9171, 0x9166, 0x917F, 0x8845, 0x917E, + 0x917D, 0x91CA, 0x9487, 0x948C, 0x948A, 0x9489, 0x948B, 0x9488, 0x9493, + 0x9490, 0x948F, 0x9492, 0x948E, 0x9497, 0x948D, 0x9495, 0x94AF, 0x94AB, + 0x9498, 0x94AD, 0x94A0, 0x949D, 0x94A4, 0x94A3, 0x949E, 0x94AE, 0x94A7, + 0x9499, 0x949B, 0x94AA, 0x94CC, 0x94C8, 0x94B6, 0x94C3, 0x94B4, 0x94B9, + 0x94CD, 0x94B0, 0x94B8, 0x94C0, 0x94BF, 0x94BE, 0x949C, 0x94CA, 0x94C9, + 0x94C7, 0x94CB, 0x94C2, 0x94B3, 0x94C6, 0x94C5, 0x94BA, 0x94A9, 0x94B2, + 0x94BC, 0x94BD, 0x94CF, 0x94F0, 0x94D2, 0x94EC, 0x94EA, 0x94F6, 0x94F3, + 0x94DC, 0x94DA, 0x94E3, 0x94E8, 0x94E2, 0x94ED, 0x94EB, 0x94E6, 0x8854, + 0x94D1, 0x94F7, 0x94F1, 0x94DF, 0x94F5, 0x94D5, 0x94EF, 0x94D0, 0x9510, + 0x9500, 0x9508, 0x9511, 0x9509, 0x94DD, 0x9512, 0x950C, 0x94A1, 0x94E4, + 0x94D7, 0x950B, 0x950A, 0x9513, 0x9504, 0x9503, 0x9514, 0x9507, 0x94D3, + 0x94FA, 0x94D6, 0x9506, 0x9502, 0x952F, 0x94A2, 0x951E, 0x5F55, 0x9516, + 0x9529, 0x94D4, 0x9525, 0x9515, 0x951F, 0x9524, 0x9531, 0x94EE, 0x951B, + 0x952C, 0x952D, 0x951C, 0x94B1, 0x9526, 0x951A, 0x9520, 0x9521, 0x9522, + 0x9519, 0x9530, 0x8868, 0x94FC, 0x9528, 0x9494, 0x9534, 0x94FE, 0x9505, + 0x9540, 0x9537, 0x94E1, 0x9496, 0x953B, 0x953D, 0x9538, 0x9532, 0x9539, + 0x953E, 0x952E, 0x9536, 0x9517, 0x953A, 0x9541, 0x9551, 0x9555, 0x9501, + 0x9549, 0x9548, 0x9543, 0x94A8, 0x84E5, 0x954F, 0x94E0, 0x94E9, 0x953C, + 0x9550, 0x9547, 0x9552, 0x954D, 0x9553, 0x955E, 0x955F, 0x94FE, 0x9546, + 0x9559, 0x9560, 0x955D, 0x94FF, 0x9535, 0x9557, 0x9558, 0x955B, 0x94F2, + 0x955C, 0x9556, 0x9542, 0x933E, 0x955A, 0x94E7, 0x956A, 0x9508, 0x94D9, + 0x9563, 0x9566, 0x9561, 0x949F, 0x956B, 0x950F, 0x9544, 0x954C, 0x9570, + 0x956F, 0x956D, 0x94C1, 0x956E, 0x94CE, 0x94DB, 0x9571, 0x94F8, 0x956C, + 0x9554, 0x9274, 0x9527, 0x9574, 0x94C4, 0x9573, 0x9567, 0x94A5, 0x9575, + 0x9576, 0x954A, 0x9569, 0x9523, 0x94BB, 0x92AE, 0x51FF, 0x957F, 0x95E8, + 0x95E9, 0x95EA, 0x95EB, 0x95EC, 0x95ED, 0x5F00, 0x95F6, 0x95F3, 0x95F0, + 0x95F2, 0x95F4, 0x95F5, 0x95F8, 0x9602, 0x9601, 0x9600, 0x95FA, 0x95FD, + 0x9603, 0x9606, 0x95FE, 0x9605, 0x960A, 0x9609, 0x960E, 0x960F, 0x960D, + 0x9608, 0x960C, 0x9612, 0x677F, 0x6697, 0x95F1, 0x9614, 0x9615, 0x9611, + 0x9617, 0x9618, 0x95FF, 0x9616, 0x9619, 0x95EF, 0x5173, 0x961A, 0x9613, + 0x9610, 0x8F9F, 0x961B, 0x95FC, 0x9649, 0x9655, 0x9635, 0x9634, 0x9648, + 0x9646, 0x9633, 0x9667, 0x961F, 0x9636, 0x9668, 0x9645, 0x968F, 0x9669, + 0x9690, 0x9647, 0x96B6, 0x53EA, 0x96BD, 0x867D, 0x53CC, 0x96CF, 0x6742, + 0x9E21, 0x79BB, 0x96BE, 0x4E91, 0x7535, 0x9721, 0x96FE, 0x9701, 0x96F3, + 0x972D, 0x53C7, 0x7075, 0x53C6, 0x9753, 0x9759, 0x817C, 0x9765, 0x9F17, + 0x5DE9, 0x979F, 0x7F30, 0x9791, 0x97AF, 0x97E6, 0x97E7, 0x97E9, 0x97EA, + 0x97EC, 0x97EB, 0x97F5, 0x54CD, 0x9875, 0x9876, 0x9877, 0x9879, 0x987A, + 0x9878, 0x987B, 0x987C, 0x9882, 0x9880, 0x9883, 0x9884, 0x987D, 0x9881, + 0x987F, 0x9887, 0x9886, 0x988C, 0x9889, 0x9890, 0x988F, 0x5934, 0x988A, + 0x988B, 0x9894, 0x9888, 0x9893, 0x9891, 0x9897, 0x9898, 0x989D, 0x989A, + 0x989C, 0x9899, 0x989B, 0x613F, 0x98A1, 0x98A0, 0x7C7B, 0x989F, 0x98A2, + 0x987E, 0x98A4, 0x98A5, 0x663E, 0x98A6, 0x9885, 0x989E, 0x98A7, 0x98CE, + 0x98D0, 0x98D1, 0x98D2, 0x53F0, 0x98D3, 0x98D4, 0x98CF, 0x98D6, 0x98D5, + 0x98D7, 0x98D8, 0x98D9, 0x98DE, 0x9965, 0x9964, 0x9966, 0x9968, 0x996A, + 0x996B, 0x996C, 0x996D, 0x996E, 0x9974, 0x9972, 0x9971, 0x9970, 0x9973, + 0x997A, 0x9978, 0x997C, 0x9977, 0x517B, 0x9975, 0x9979, 0x997D, 0x9981, + 0x997F, 0x997E, 0x4F59, 0x80B4, 0x9984, 0x9983, 0x996F, 0x9985, 0x9986, + 0x7CC7, 0x9967, 0x5582, 0x9989, 0x998E, 0x9969, 0x998F, 0x998A, 0x998C, + 0x998D, 0x9992, 0x9990, 0x9991, 0x9988, 0x9994, 0x9976, 0x98E8, 0x990D, + 0x998B, 0x9A6C, 0x9A6D, 0x51AF, 0x9A6E, 0x9A70, 0x9A6F, 0x9A73, 0x9A7B, + 0x9A7D, 0x9A79, 0x9A75, 0x9A7E, 0x9A80, 0x9A78, 0x9A76, 0x9A7C, 0x9A77, + 0x9A88, 0x9A87, 0x9A83, 0x9A86, 0x9A8E, 0x9A8F, 0x9A8B, 0x9A8D, 0x9A93, + 0x9A92, 0x9A91, 0x9A90, 0x9A9B, 0x9A97, 0x9A99, 0x9A9E, 0x9A98, 0x9A9D, + 0x817E, 0x9A7A, 0x9A9A, 0x9A9F, 0x9AA1, 0x84E6, 0x9A9C, 0x9A96, 0x9AA0, + 0x9AA2, 0x9A71, 0x9A85, 0x9A95, 0x9A81, 0x9A84, 0x9A8C, 0x60CA, 0x9A7F, + 0x9AA4, 0x9A74, 0x9AA7, 0x9AA5, 0x9AA6, 0x9A8A, 0x80AE, 0x9AC5, 0x810F, + 0x4F53, 0x9ACC, 0x9ACB, 0x53D1, 0x677E, 0x80E1, 0x9B13, 0x6597, 0x95F9, + 0x960B, 0x9604, 0x90C1, 0x9B49, 0x9B47, 0x9C7C, 0x9C80, 0x9C81, 0x9C82, + 0x9C7F, 0x9C85, 0x9C86, 0x9C8F, 0x9C87, 0x9C90, 0x9C8D, 0x9C8B, 0x9C8A, + 0x9C92, 0x9C95, 0x9C96, 0x9C94, 0x9C9B, 0x9C91, 0x9C9C, 0x9CA7, 0x9CA0, + 0x9CA9, 0x9CA4, 0x9CA8, 0x9CBB, 0x9CAF, 0x9CAD, 0x9C9E, 0x9CB7, 0x9CB4, + 0x9CB1, 0x9CB5, 0x9CB2, 0x9CB3, 0x9CB8, 0x9CAE, 0x9CB0, 0x9CB6, 0x9CAB, + 0x9CCA, 0x9C97, 0x9CBD, 0x9CC7, 0x9CC5, 0x9CC6, 0x9CC3, 0x9CD2, 0x9CD1, + 0x9CA5, 0x9CCF, 0x9CCE, 0x9CD0, 0x9CCD, 0x9CC1, 0x9CA2, 0x9CCC, 0x9CA6, + 0x9CA3, 0x9CB9, 0x9CD7, 0x9CD4, 0x9CC9, 0x9CD5, 0x9CD6, 0x9CDF, 0x9CDD, + 0x9CDC, 0x9CDE, 0x9C9F, 0x9CBC, 0x9C8E, 0x9C99, 0x9CE3, 0x9CE2, 0x9C9A, + 0x9CC4, 0x9C88, 0x9CA1, 0x9E1F, 0x51EB, 0x9E20, 0x9E24, 0x51E4, 0x9E23, + 0x9E22, 0x9E29, 0x9E28, 0x9E26, 0x9E30, 0x9E35, 0x9E33, 0x9E32, 0x9E2E, + 0x9E31, 0x9E2A, 0x9E2F, 0x9E2D, 0x9E38, 0x9E39, 0x9E3B, 0x9E3F, 0x9E3D, + 0x9E3A, 0x9E43, 0x9E46, 0x9E41, 0x9E48, 0x9E45, 0x9E44, 0x9E49, 0x9E4C, + 0x9E4F, 0x9E4E, 0x9E4A, 0x9E53, 0x9E2B, 0x9E51, 0x9E4B, 0x9E59, 0x9E55, + 0x9E57, 0x9E56, 0x9E4D, 0x9E5B, 0x9E5C, 0x83BA, 0x9E5F, 0x9E64, 0x9E60, + 0x9E61, 0x9E58, 0x9E63, 0x9E5A, 0x9E62, 0x9E5E, 0x9E67, 0x9E65, 0x9E25, + 0x9E37, 0x9E68, 0x9E36, 0x9E6A, 0x9E54, 0x9E69, 0x9E6B, 0x9E47, 0x9E6C, + 0x9E70, 0x9E6D, 0x9E6F, 0x9E2C, 0x9E74, 0x9E66, 0x9E73, 0x9E42, 0x9E3E, + 0x5364, 0x9E7E, 0x7877, 0x76D0, 0x4E3D, 0x9EA6, 0x9EB8, 0x9EB9, 0x9762, + 0x4E48, 0x9EC4, 0x9EC9, 0x70B9, 0x515A, 0x9709, 0x9EE1, 0x9EE9, 0x9EFE, + 0x9F0B, 0x9F0D, 0x9F39, 0x9F50, 0x658B, 0x8D4D, 0x9F51, 0x9F7F, 0x9F80, + 0x9F81, 0x9F85, 0x9F87, 0x9F83, 0x9F86, 0x9F84, 0x9F88, 0x9F8A, 0x9F89, + 0x9F8B, 0x9F8C, 0x9F99, 0x5390, 0x5E9E, 0x9F9A, 0x9F9B, 0x9F9F, 0xA76F, + 0x8C48, 0x66F4, 0x8ECA, 0x8CC8, 0x6ED1, 0x4E32, 0x53E5, 0x9F9C, 0x9F9C, + 0x5951, 0x91D1, 0x5587, 0x5948, 0x61F6, 0x7669, 0x7F85, 0x863F, 0x87BA, + 0x88F8, 0x908F, 0x6A02, 0x6D1B, 0x70D9, 0x73DE, 0x843D, 0x916A, 0x99F1, + 0x4E82, 0x5375, 0x6B04, 0x721B, 0x862D, 0x9E1E, 0x5D50, 0x6FEB, 0x85CD, + 0x8964, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717, 0x6D6A, 0x72FC, 0x90CE, + 0x4F86, 0x51B7, 0x52DE, 0x64C4, 0x6AD3, 0x7210, 0x76E7, 0x8001, 0x8606, + 0x865C, 0x8DEF, 0x9732, 0x9B6F, 0x9DFA, 0x788C, 0x797F, 0x7DA0, 0x83C9, + 0x9304, 0x9E7F, 0x8AD6, 0x58DF, 0x5F04, 0x7C60, 0x807E, 0x7262, 0x78CA, + 0x8CC2, 0x96F7, 0x58D8, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F, 0x7D2F, 0x7E37, + 0x964B, 0x52D2, 0x808B, 0x51DC, 0x51CC, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, + 0x8B80, 0x62CF, 0x6A02, 0x8AFE, 0x4E39, 0x5BE7, 0x6012, 0x7387, 0x7570, + 0x5317, 0x78FB, 0x4FBF, 0x5FA9, 0x4E0D, 0x6CCC, 0x6578, 0x7D22, 0x53C3, + 0x585E, 0x7701, 0x8449, 0x8AAA, 0x6BBA, 0x8FB0, 0x6C88, 0x62FE, 0x82E5, + 0x63A0, 0x7565, 0x4EAE, 0x5169, 0x51C9, 0x6881, 0x7CE7, 0x826F, 0x8AD2, + 0x91CF, 0x52F5, 0x5442, 0x5973, 0x5EEC, 0x65C5, 0x6FFE, 0x792A, 0x95AD, + 0x9A6A, 0x9E97, 0x9ECE, 0x529B, 0x66C6, 0x6B77, 0x8F62, 0x5E74, 0x6190, + 0x6200, 0x649A, 0x6F23, 0x7149, 0x7489, 0x79CA, 0x7DF4, 0x806F, 0x8F26, + 0x84EE, 0x9023, 0x934A, 0x5217, 0x52A3, 0x54BD, 0x70C8, 0x88C2, 0x8AAA, + 0x5EC9, 0x5FF5, 0x637B, 0x6BAE, 0x7C3E, 0x7375, 0x4EE4, 0x56F9, 0x5BE7, + 0x5DBA, 0x601C, 0x73B2, 0x7469, 0x7F9A, 0x8046, 0x9234, 0x96F6, 0x9748, + 0x9818, 0x4F8B, 0x79AE, 0x91B4, 0x96B8, 0x60E1, 0x4E86, 0x50DA, 0x5BEE, + 0x5C3F, 0x6599, 0x6A02, 0x71CE, 0x7642, 0x84FC, 0x907C, 0x9F8D, 0x6688, + 0x962E, 0x5289, 0x677B, 0x67F3, 0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, + 0x7D10, 0x985E, 0x516D, 0x622E, 0x9678, 0x502B, 0x5D19, 0x6DEA, 0x8F2A, + 0x5F8B, 0x6144, 0x6817, 0x7387, 0x9686, 0x5229, 0x540F, 0x5C65, 0x6613, + 0x674E, 0x68A8, 0x6CE5, 0x7406, 0x75E2, 0x7F79, 0x88CF, 0x88E1, 0x91CC, + 0x96E2, 0x533F, 0x6EBA, 0x541D, 0x71D0, 0x7498, 0x85FA, 0x96A3, 0x9C57, + 0x9E9F, 0x6797, 0x6DCB, 0x81E8, 0x7ACB, 0x7B20, 0x7C92, 0x72C0, 0x7099, + 0x8B58, 0x4EC0, 0x8336, 0x523A, 0x5207, 0x5EA6, 0x62D3, 0x7CD6, 0x5B85, + 0x6D1E, 0x66B4, 0x8F3B, 0x884C, 0x964D, 0x898B, 0x5ED3, 0x5140, 0x55C0, + 0x585A, 0x6674, 0x51DE, 0x732A, 0x76CA, 0x793C, 0x795E, 0x7965, 0x798F, + 0x9756, 0x7CBE, 0x7FBD, 0x8612, 0x8AF8, 0x9038, 0x90FD, 0x98EF, 0x98FC, + 0x9928, 0x9DB4, 0x4FAE, 0x50E7, 0x514D, 0x52C9, 0x52E4, 0x5351, 0x559D, + 0x5606, 0x5668, 0x5840, 0x58A8, 0x5C64, 0x5C6E, 0x6094, 0x6168, 0x618E, + 0x61F2, 0x654F, 0x65E2, 0x6691, 0x6885, 0x6D77, 0x6E1A, 0x6F22, 0x716E, + 0x722B, 0x7422, 0x7891, 0x793E, 0x7949, 0x7948, 0x7950, 0x7956, 0x795D, + 0x798D, 0x798E, 0x7A40, 0x7A81, 0x7BC0, 0x7DF4, 0x7E09, 0x7E41, 0x7F72, + 0x8005, 0x81ED, 0x8279, 0x8279, 0x8457, 0x8910, 0x8996, 0x8B01, 0x8B39, + 0x8CD3, 0x8D08, 0x8FB6, 0x9038, 0x96E3, 0x97FF, 0x983B, 0x6075, 0x8218, + 0x4E26, 0x51B5, 0x5168, 0x4F80, 0x5145, 0x5180, 0x52C7, 0x52FA, 0x559D, + 0x5555, 0x5599, 0x55E2, 0x585A, 0x58B3, 0x5944, 0x5954, 0x5A62, 0x5B28, + 0x5ED2, 0x5ED9, 0x5F69, 0x5FAD, 0x60D8, 0x614E, 0x6108, 0x618E, 0x6160, + 0x61F2, 0x6234, 0x63C4, 0x641C, 0x6452, 0x6556, 0x6674, 0x6717, 0x671B, + 0x6756, 0x6B79, 0x6BBA, 0x6D41, 0x6EDB, 0x6ECB, 0x6F22, 0x701E, 0x716E, + 0x77A7, 0x7235, 0x72AF, 0x732A, 0x7471, 0x7506, 0x753B, 0x761D, 0x761F, + 0x76CA, 0x76DB, 0x76F4, 0x774A, 0x7740, 0x78CC, 0x7AB1, 0x7BC0, 0x7C7B, + 0x7D5B, 0x7DF4, 0x7F3E, 0x8005, 0x8352, 0x83EF, 0x8779, 0x8941, 0x8986, + 0x8996, 0x8ABF, 0x8AF8, 0x8ACB, 0x8B01, 0x8AFE, 0x8AED, 0x8B39, 0x8B8A, + 0x8D08, 0x8F38, 0x9072, 0x9199, 0x9276, 0x967C, 0x96E3, 0x9756, 0x97DB, + 0x97FF, 0x980B, 0x983B, 0x9B12, 0x9F9C, 0x3B9D, 0x4018, 0x4039, 0x9F43, + 0x9F8E, 0x05E2, 0x05D0, 0x05D3, 0x05D4, 0x05DB, 0x05DC, 0x05DD, 0x05E8, + 0x05EA, 0x002B, 0x0671, 0x0671, 0x067B, 0x067B, 0x067B, 0x067B, 0x067E, + 0x067E, 0x067E, 0x067E, 0x0680, 0x0680, 0x0680, 0x0680, 0x067A, 0x067A, + 0x067A, 0x067A, 0x067F, 0x067F, 0x067F, 0x067F, 0x0679, 0x0679, 0x0679, + 0x0679, 0x06A4, 0x06A4, 0x06A4, 0x06A4, 0x06A6, 0x06A6, 0x06A6, 0x06A6, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0683, 0x0683, 0x0683, 0x0683, 0x0686, + 0x0686, 0x0686, 0x0686, 0x0687, 0x0687, 0x0687, 0x0687, 0x068D, 0x068D, + 0x068C, 0x068C, 0x068E, 0x068E, 0x0688, 0x0688, 0x0698, 0x0698, 0x0691, + 0x0691, 0x06A9, 0x06A9, 0x06A9, 0x06A9, 0x06AF, 0x06AF, 0x06AF, 0x06AF, + 0x06B3, 0x06B3, 0x06B3, 0x06B3, 0x06B1, 0x06B1, 0x06B1, 0x06B1, 0x06BA, + 0x06BA, 0x06BB, 0x06BB, 0x06BB, 0x06BB, 0x06C0, 0x06C0, 0x06C1, 0x06C1, + 0x06C1, 0x06C1, 0x06BE, 0x06BE, 0x06BE, 0x06BE, 0x06D2, 0x06D2, 0x06D3, + 0x06D3, 0x06AD, 0x06AD, 0x06AD, 0x06AD, 0x06C7, 0x06C7, 0x06C6, 0x06C6, + 0x06C8, 0x06C8, 0x0677, 0x06CB, 0x06CB, 0x06C5, 0x06C5, 0x06C9, 0x06C9, + 0x06D0, 0x06D0, 0x06D0, 0x06D0, 0x0649, 0x0649, 0x06CC, 0x06CC, 0x06CC, + 0x06CC, 0x002C, 0x3001, 0x3002, 0x003A, 0x003B, 0x0021, 0x003F, 0x3016, + 0x3017, 0x2026, 0x2025, 0x2014, 0x2013, 0x005F, 0x005F, 0x0028, 0x0029, + 0x007B, 0x007D, 0x3014, 0x3015, 0x3010, 0x3011, 0x300A, 0x300B, 0x3008, + 0x3009, 0x300C, 0x300D, 0x300E, 0x300F, 0x005B, 0x005D, 0x203E, 0x203E, + 0x203E, 0x203E, 0x005F, 0x005F, 0x005F, 0x002C, 0x3001, 0x002E, 0x003B, + 0x003A, 0x003F, 0x0021, 0x2014, 0x0028, 0x0029, 0x007B, 0x007D, 0x3014, + 0x3015, 0x0023, 0x0026, 0x002A, 0x002B, 0x002D, 0x003C, 0x003E, 0x003D, + 0x005C, 0x0024, 0x0025, 0x0040, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, + 0x0650, 0x0651, 0x0652, 0x0621, 0x0622, 0x0622, 0x0623, 0x0623, 0x0624, + 0x0624, 0x0625, 0x0625, 0x0626, 0x0626, 0x0626, 0x0626, 0x0627, 0x0627, + 0x0628, 0x0628, 0x0628, 0x0628, 0x0629, 0x0629, 0x062A, 0x062A, 0x062A, + 0x062A, 0x062B, 0x062B, 0x062B, 0x062B, 0x062C, 0x062C, 0x062C, 0x062C, + 0x062D, 0x062D, 0x062D, 0x062D, 0x062E, 0x062E, 0x062E, 0x062E, 0x062F, + 0x062F, 0x0630, 0x0630, 0x0631, 0x0631, 0x0632, 0x0632, 0x0633, 0x0633, + 0x0633, 0x0633, 0x0634, 0x0634, 0x0634, 0x0634, 0x0635, 0x0635, 0x0635, + 0x0635, 0x0636, 0x0636, 0x0636, 0x0636, 0x0637, 0x0637, 0x0637, 0x0637, + 0x0638, 0x0638, 0x0638, 0x0638, 0x0639, 0x0639, 0x0639, 0x0639, 0x063A, + 0x063A, 0x063A, 0x063A, 0x0641, 0x0641, 0x0641, 0x0641, 0x0642, 0x0642, + 0x0642, 0x0642, 0x0643, 0x0643, 0x0643, 0x0643, 0x0644, 0x0644, 0x0644, + 0x0644, 0x0645, 0x0645, 0x0645, 0x0645, 0x0646, 0x0646, 0x0646, 0x0646, + 0x0647, 0x0647, 0x0647, 0x0647, 0x0648, 0x0648, 0x0649, 0x0649, 0x064A, + 0x064A, 0x064A, 0x064A, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, + 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, + 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, + 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, + 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, + 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, + 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, + 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, + 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x2985, 0x2986, + 0x3002, 0x300C, 0x300D, 0x3001, 0x30FB, 0x30F2, 0x30A1, 0x30A3, 0x30A5, + 0x30A7, 0x30A9, 0x30E3, 0x30E5, 0x30E7, 0x30C3, 0x30FC, 0x30A2, 0x30A4, + 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, + 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, + 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, + 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, + 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F3, 0x3099, 0x309A, + 0x3164, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, + 0x3139, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141, + 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A, + 0x314B, 0x314C, 0x314D, 0x314E, 0x314F, 0x3150, 0x3151, 0x3152, 0x3153, + 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315A, 0x315B, 0x315C, + 0x315D, 0x315E, 0x315F, 0x3160, 0x3161, 0x3162, 0x3163, 0x00A2, 0x00A3, + 0x00AC, 0x00AF, 0x00A6, 0x00A5, 0x20A9, 0x2502, 0x2190, 0x2191, 0x2192, + 0x2193, 0x25A0, 0x25CB}; + +const uint16_t g_UnicodeData_Normalization_Map2[1724] = { + 0x004F, 0x0045, 0x0054, 0x004D, 0x006F, 0x0065, 0x0049, 0x004A, 0x0069, + 0x006A, 0x004F, 0x0045, 0x006F, 0x0065, 0x0044, 0x017D, 0x0044, 0x017E, + 0x0064, 0x017E, 0x004C, 0x004A, 0x004C, 0x006A, 0x006C, 0x006A, 0x004E, + 0x004A, 0x004E, 0x006A, 0x006E, 0x006A, 0x0044, 0x005A, 0x0044, 0x007A, + 0x0064, 0x007A, 0x0064, 0x0062, 0x0071, 0x0070, 0x004F, 0x0045, 0x0064, + 0x007A, 0x0064, 0x0292, 0x0064, 0x007A, 0x0074, 0x0073, 0x0074, 0x0283, + 0x0074, 0x0063, 0x0066, 0x014B, 0x006C, 0x0073, 0x006C, 0x007A, 0x041D, + 0x0413, 0x043D, 0x0433, 0x0422, 0x0426, 0x0442, 0x0446, 0x0410, 0x0415, + 0x0430, 0x0435, 0x0565, 0x0582, 0x0627, 0x0674, 0x0648, 0x0674, 0x06C7, + 0x0674, 0x064A, 0x0674, 0x06D5, 0x0654, 0x06C1, 0x0654, 0x06D2, 0x0654, + 0x0928, 0x093C, 0x0930, 0x093C, 0x0933, 0x093C, 0x0915, 0x093C, 0x0916, + 0x093C, 0x0917, 0x093C, 0x091C, 0x093C, 0x0921, 0x093C, 0x0922, 0x093C, + 0x092B, 0x093C, 0x092F, 0x093C, 0x09C7, 0x09BE, 0x09C7, 0x09D7, 0x09A1, + 0x09BC, 0x09A2, 0x09BC, 0x09AF, 0x09BC, 0x0A32, 0x0A3C, 0x0A38, 0x0A3C, + 0x0A16, 0x0A3C, 0x0A17, 0x0A3C, 0x0A1C, 0x0A3C, 0x0A2B, 0x0A3C, 0x0B47, + 0x0B56, 0x0B47, 0x0B3E, 0x0B47, 0x0B57, 0x0B21, 0x0B3C, 0x0B22, 0x0B3C, + 0x0B92, 0x0BD7, 0x0BC6, 0x0BBE, 0x0BC7, 0x0BBE, 0x0BC6, 0x0BD7, 0x0C46, + 0x0C56, 0x0CBF, 0x0CD5, 0x0CC6, 0x0CD5, 0x0CC6, 0x0CD6, 0x0CC6, 0x0CC2, + 0x0CCA, 0x0CD5, 0x0D46, 0x0D3E, 0x0D47, 0x0D3E, 0x0D46, 0x0D57, 0x0DD9, + 0x0DCA, 0x0DD9, 0x0DCF, 0x0DDC, 0x0DCA, 0x0DD9, 0x0DDF, 0x0E4D, 0x0E32, + 0x0ECD, 0x0EB2, 0x0EAB, 0x0E99, 0x0EAB, 0x0EA1, 0x0F42, 0x0FB7, 0x0F4C, + 0x0FB7, 0x0F51, 0x0FB7, 0x0F56, 0x0FB7, 0x0F5B, 0x0FB7, 0x0F40, 0x0FB5, + 0x0F71, 0x0F72, 0x0F71, 0x0F74, 0x0FB2, 0x0F80, 0x0FB2, 0x0F81, 0x0FB3, + 0x0F80, 0x0FB3, 0x0F81, 0x0F71, 0x0F80, 0x0F92, 0x0FB7, 0x0F9C, 0x0FB7, + 0x0FA1, 0x0FB7, 0x0FA6, 0x0FB7, 0x0FAB, 0x0FB7, 0x0F90, 0x0FB5, 0x1025, + 0x102E, 0x1B05, 0x1B35, 0x1B07, 0x1B35, 0x1B09, 0x1B35, 0x1B0B, 0x1B35, + 0x1B0D, 0x1B35, 0x1B11, 0x1B35, 0x1B3A, 0x1B35, 0x1B3C, 0x1B35, 0x1B3E, + 0x1B35, 0x1B3F, 0x1B35, 0x1B42, 0x1B35, 0x0074, 0x0068, 0x002E, 0x002E, + 0x2032, 0x2032, 0x2035, 0x2035, 0x0021, 0x0021, 0x0020, 0x0305, 0x003F, + 0x003F, 0x003F, 0x0021, 0x0021, 0x003F, 0x0052, 0x0073, 0x00B0, 0x0043, + 0x00B0, 0x0046, 0x004E, 0x006F, 0x0053, 0x004D, 0x0054, 0x004D, 0x0031, + 0x002F, 0x0049, 0x0049, 0x0049, 0x0056, 0x0056, 0x0049, 0x0049, 0x0058, + 0x0058, 0x0049, 0x0069, 0x0069, 0x0069, 0x0076, 0x0076, 0x0069, 0x0069, + 0x0078, 0x0078, 0x0069, 0x2190, 0x0338, 0x2192, 0x0338, 0x2194, 0x0338, + 0x21D0, 0x0338, 0x21D4, 0x0338, 0x21D2, 0x0338, 0x2223, 0x0338, 0x2225, + 0x0338, 0x222B, 0x222B, 0x222E, 0x222E, 0x223C, 0x0338, 0x2243, 0x0338, + 0x2245, 0x0338, 0x2248, 0x0338, 0x003D, 0x002F, 0x2261, 0x002F, 0x224D, + 0x002F, 0x003C, 0x002F, 0x003E, 0x002F, 0x2264, 0x002F, 0x2265, 0x002F, + 0x2272, 0x002F, 0x2273, 0x002F, 0x2276, 0x002F, 0x2277, 0x002F, 0x227A, + 0x002F, 0x227B, 0x002F, 0x2282, 0x002F, 0x2283, 0x002F, 0x2286, 0x002F, + 0x2287, 0x002F, 0x22A2, 0x002F, 0x22A8, 0x002F, 0x22A9, 0x002F, 0x22AB, + 0x002F, 0x227C, 0x002F, 0x227D, 0x002F, 0x2291, 0x002F, 0x2292, 0x002F, + 0x22B2, 0x002F, 0x22B3, 0x002F, 0x22B4, 0x002F, 0x22B5, 0x002F, 0x0042, + 0x0053, 0x0048, 0x0054, 0x004C, 0x0046, 0x0056, 0x0054, 0x0046, 0x0046, + 0x0043, 0x0052, 0x0053, 0x0053, 0x0053, 0x0049, 0x0045, 0x004D, 0x0046, + 0x0053, 0x0047, 0x0053, 0x0052, 0x0053, 0x0055, 0x0053, 0x0053, 0x0050, + 0x0031, 0x0030, 0x0031, 0x0031, 0x0031, 0x0032, 0x0031, 0x0033, 0x0031, + 0x0034, 0x0031, 0x0035, 0x0031, 0x0036, 0x0031, 0x0037, 0x0031, 0x0038, + 0x0031, 0x0039, 0x0032, 0x0030, 0x0031, 0x002E, 0x0032, 0x002E, 0x0033, + 0x002E, 0x0034, 0x002E, 0x0035, 0x002E, 0x0036, 0x002E, 0x0037, 0x002E, + 0x0038, 0x002E, 0x0039, 0x002E, 0x0031, 0x0031, 0x0031, 0x0032, 0x0031, + 0x0033, 0x0031, 0x0034, 0x0031, 0x0035, 0x0031, 0x0036, 0x0031, 0x0037, + 0x0031, 0x0038, 0x0031, 0x0039, 0x0032, 0x0030, 0x0031, 0x0030, 0x0031, + 0x0030, 0x0031, 0x0030, 0x0031, 0x0030, 0x003D, 0x003D, 0x2ADD, 0x002F, + 0x304B, 0x3099, 0x304D, 0x3099, 0x304F, 0x3099, 0x3051, 0x3099, 0x3053, + 0x3099, 0x3055, 0x3099, 0x3057, 0x3099, 0x3059, 0x3099, 0x305B, 0x3099, + 0x305D, 0x3099, 0x305F, 0x3099, 0x3061, 0x3099, 0x3064, 0x3099, 0x3066, + 0x3099, 0x3068, 0x3099, 0x306F, 0x3099, 0x306F, 0x309A, 0x3072, 0x3099, + 0x3072, 0x309A, 0x3075, 0x3099, 0x3075, 0x309A, 0x3078, 0x3099, 0x3078, + 0x309A, 0x307B, 0x3099, 0x307B, 0x309A, 0x3046, 0x3099, 0x0020, 0x3099, + 0x0020, 0x309A, 0x309D, 0x3099, 0x3088, 0x308A, 0x30AB, 0x3099, 0x30AD, + 0x3099, 0x30AF, 0x3099, 0x30B1, 0x3099, 0x30B3, 0x3099, 0x30B5, 0x3099, + 0x30B7, 0x3099, 0x30B9, 0x3099, 0x30BB, 0x3099, 0x30BD, 0x3099, 0x30BF, + 0x3099, 0x30C1, 0x3099, 0x30C4, 0x3099, 0x30C6, 0x3099, 0x30C8, 0x3099, + 0x30CF, 0x3099, 0x30CF, 0x309A, 0x30D2, 0x3099, 0x30D2, 0x309A, 0x30D5, + 0x3099, 0x30D5, 0x309A, 0x30D8, 0x3099, 0x30D8, 0x309A, 0x30DB, 0x3099, + 0x30DB, 0x309A, 0x30A6, 0x3099, 0x30EF, 0x3099, 0x30F0, 0x3099, 0x30F1, + 0x3099, 0x30F2, 0x3099, 0x30FD, 0x3099, 0x30B3, 0x30C8, 0x0032, 0x0031, + 0x0032, 0x0032, 0x0032, 0x0033, 0x0032, 0x0034, 0x0032, 0x0035, 0x0032, + 0x0036, 0x0032, 0x0037, 0x0032, 0x0038, 0x0032, 0x0039, 0x0033, 0x0030, + 0x0033, 0x0031, 0x0033, 0x0032, 0x0033, 0x0033, 0x0033, 0x0034, 0x0033, + 0x0035, 0x1100, 0x1161, 0x1102, 0x1161, 0x1103, 0x1161, 0x1105, 0x1161, + 0x1106, 0x1161, 0x1107, 0x1161, 0x1109, 0x1161, 0x110B, 0x1161, 0x110C, + 0x1161, 0x110E, 0x1161, 0x110F, 0x1161, 0x1110, 0x1161, 0x1111, 0x1161, + 0x1112, 0x1161, 0x110B, 0x116E, 0x0033, 0x0036, 0x0033, 0x0037, 0x0033, + 0x0038, 0x0033, 0x0039, 0x0034, 0x0030, 0x0034, 0x0031, 0x0034, 0x0032, + 0x0034, 0x0033, 0x0034, 0x0034, 0x0034, 0x0035, 0x0034, 0x0036, 0x0034, + 0x0037, 0x0034, 0x0038, 0x0034, 0x0039, 0x0035, 0x0030, 0x0031, 0x6708, + 0x0032, 0x6708, 0x0033, 0x6708, 0x0034, 0x6708, 0x0035, 0x6708, 0x0036, + 0x6708, 0x0037, 0x6708, 0x0038, 0x6708, 0x0039, 0x6708, 0x0048, 0x0067, + 0x0065, 0x0056, 0x30AE, 0x30AC, 0x30AD, 0x30ED, 0x30C7, 0x30B7, 0x30C9, + 0x30EB, 0x30C8, 0x30F3, 0x30CA, 0x30CE, 0x30D4, 0x30B3, 0x30D3, 0x30EB, + 0x30DA, 0x30BD, 0x30DB, 0x30F3, 0x30DF, 0x30EA, 0x30E1, 0x30AC, 0x30EA, + 0x30E9, 0x30EC, 0x30E0, 0x0030, 0x70B9, 0x0031, 0x70B9, 0x0032, 0x70B9, + 0x0033, 0x70B9, 0x0034, 0x70B9, 0x0035, 0x70B9, 0x0036, 0x70B9, 0x0037, + 0x70B9, 0x0038, 0x70B9, 0x0039, 0x70B9, 0x0064, 0x0061, 0x0041, 0x0055, + 0x006F, 0x0056, 0x0070, 0x0063, 0x0064, 0x006D, 0x0049, 0x0055, 0x5E73, + 0x6210, 0x662D, 0x548C, 0x5927, 0x6B63, 0x660E, 0x6CBB, 0x0070, 0x0041, + 0x006E, 0x0041, 0x03BC, 0x0041, 0x006D, 0x0041, 0x006B, 0x0041, 0x004B, + 0x0042, 0x004D, 0x0042, 0x0047, 0x0042, 0x0070, 0x0046, 0x006E, 0x0046, + 0x03BC, 0x0046, 0x03BC, 0x0067, 0x006D, 0x0067, 0x006B, 0x0067, 0x0048, + 0x007A, 0x03BC, 0x2113, 0x006D, 0x2113, 0x0064, 0x2113, 0x006B, 0x2113, + 0x0066, 0x006D, 0x006E, 0x006D, 0x03BC, 0x006D, 0x006D, 0x006D, 0x0063, + 0x006D, 0x006B, 0x006D, 0x006D, 0x00B2, 0x006D, 0x00B3, 0x0050, 0x0061, + 0x0070, 0x0073, 0x006E, 0x0073, 0x03BC, 0x0073, 0x006D, 0x0073, 0x0070, + 0x0056, 0x006E, 0x0056, 0x03BC, 0x0056, 0x006D, 0x0056, 0x006B, 0x0056, + 0x004D, 0x0056, 0x0070, 0x0057, 0x006E, 0x0057, 0x03BC, 0x0057, 0x006D, + 0x0057, 0x006B, 0x0057, 0x004D, 0x0057, 0x006B, 0x03A9, 0x004D, 0x03A9, + 0x0042, 0x0071, 0x0063, 0x0063, 0x0063, 0x0064, 0x0064, 0x0042, 0x0047, + 0x0079, 0x0068, 0x0061, 0x0048, 0x0050, 0x0069, 0x006E, 0x004B, 0x004B, + 0x004B, 0x004D, 0x006B, 0x0074, 0x006C, 0x006D, 0x006C, 0x006E, 0x006C, + 0x0078, 0x006D, 0x0062, 0x0050, 0x0048, 0x0050, 0x0052, 0x0073, 0x0072, + 0x0053, 0x0076, 0x0057, 0x0062, 0x0031, 0x65E5, 0x0032, 0x65E5, 0x0033, + 0x65E5, 0x0034, 0x65E5, 0x0035, 0x65E5, 0x0036, 0x65E5, 0x0037, 0x65E5, + 0x0038, 0x65E5, 0x0039, 0x65E5, 0x0066, 0x0066, 0x0066, 0x0069, 0x0066, + 0x006C, 0x017F, 0x0074, 0x0073, 0x0074, 0x0574, 0x0576, 0x0574, 0x0565, + 0x0574, 0x056B, 0x057E, 0x0576, 0x0574, 0x056D, 0x05D9, 0x05B4, 0x05F2, + 0x05B7, 0x05E9, 0x05C1, 0x05E9, 0x05C2, 0xFB49, 0x05C1, 0xFB49, 0x05C2, + 0x05D0, 0x05B7, 0x05D0, 0x05B8, 0x05D0, 0x05BC, 0x05D1, 0x05BC, 0x05D2, + 0x05BC, 0x05D3, 0x05BC, 0x05D4, 0x05BC, 0x05D5, 0x05BC, 0x05D6, 0x05BC, + 0x05D8, 0x05BC, 0x05D9, 0x05BC, 0x05DA, 0x05BC, 0x05DB, 0x05BC, 0x05DC, + 0x05BC, 0x05DE, 0x05BC, 0x05E0, 0x05BC, 0x05E1, 0x05BC, 0x05E3, 0x05BC, + 0x05E4, 0x05BC, 0x05E6, 0x05BC, 0x05E7, 0x05BC, 0x05E8, 0x05BC, 0x05E9, + 0x05BC, 0x05EA, 0x05BC, 0x05D5, 0x05B9, 0x05D1, 0x05BF, 0x05DB, 0x05BF, + 0x05E4, 0x05BF, 0x05D0, 0x05DC, 0x0626, 0x0627, 0x0626, 0x0627, 0x0626, + 0x06D5, 0x0626, 0x06D5, 0x0626, 0x0648, 0x0626, 0x0648, 0x0626, 0x06C7, + 0x0626, 0x06C7, 0x0626, 0x06C6, 0x0626, 0x06C6, 0x0626, 0x06C8, 0x0626, + 0x06C8, 0x0626, 0x06D0, 0x0626, 0x06D0, 0x0626, 0x06D0, 0x0626, 0x0649, + 0x0626, 0x0649, 0x0626, 0x0649, 0x0626, 0x062C, 0x0626, 0x062D, 0x0626, + 0x0645, 0x0626, 0x0649, 0x0626, 0x064A, 0x0628, 0x062C, 0x0628, 0x062D, + 0x0628, 0x062E, 0x0628, 0x0645, 0x0628, 0x0649, 0x0628, 0x064A, 0x062A, + 0x062C, 0x062A, 0x062D, 0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0649, + 0x062A, 0x064A, 0x062B, 0x062C, 0x062B, 0x0645, 0x062B, 0x0649, 0x062B, + 0x064A, 0x062C, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x0645, + 0x062E, 0x062C, 0x062E, 0x062D, 0x062E, 0x0645, 0x0633, 0x062C, 0x0633, + 0x062D, 0x0633, 0x062E, 0x0633, 0x0645, 0x0635, 0x062D, 0x0635, 0x0645, + 0x0636, 0x062C, 0x0636, 0x062D, 0x0636, 0x062E, 0x0636, 0x0645, 0x0637, + 0x062D, 0x0637, 0x0645, 0x0638, 0x0645, 0x0639, 0x062C, 0x0639, 0x0645, + 0x063A, 0x062C, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641, + 0x062E, 0x0641, 0x0645, 0x0641, 0x0649, 0x0641, 0x064A, 0x0642, 0x062D, + 0x0642, 0x0645, 0x0642, 0x0649, 0x0642, 0x064A, 0x0643, 0x0627, 0x0643, + 0x062C, 0x0643, 0x062D, 0x0643, 0x062E, 0x0643, 0x0644, 0x0643, 0x0645, + 0x0643, 0x0649, 0x0643, 0x064A, 0x0644, 0x062C, 0x0644, 0x062D, 0x0644, + 0x062E, 0x0644, 0x0645, 0x0644, 0x0649, 0x0644, 0x064A, 0x0645, 0x062C, + 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, 0x0645, 0x0645, 0x0649, 0x0645, + 0x064A, 0x0646, 0x062C, 0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x0645, + 0x0646, 0x0649, 0x0646, 0x064A, 0x0647, 0x062C, 0x0647, 0x0645, 0x0647, + 0x0649, 0x0647, 0x064A, 0x064A, 0x062C, 0x064A, 0x062D, 0x064A, 0x062E, + 0x064A, 0x0645, 0x064A, 0x0649, 0x064A, 0x064A, 0x0630, 0x0670, 0x0631, + 0x0670, 0x0649, 0x0670, 0x064C, 0x0651, 0x064D, 0x0651, 0x064E, 0x0651, + 0x064F, 0x0651, 0x0650, 0x0651, 0x0651, 0x0670, 0x0626, 0x0631, 0x0626, + 0x0632, 0x0626, 0x0645, 0x0626, 0x0646, 0x0626, 0x0649, 0x0626, 0x064A, + 0x0628, 0x0631, 0x0628, 0x0632, 0x0628, 0x0645, 0x0628, 0x0646, 0x0628, + 0x0649, 0x0628, 0x064A, 0x062A, 0x0631, 0x062A, 0x0632, 0x062A, 0x0645, + 0x062A, 0x0646, 0x062A, 0x0649, 0x062A, 0x064A, 0x062B, 0x0631, 0x062B, + 0x0632, 0x062B, 0x0645, 0x062B, 0x0646, 0x062B, 0x0649, 0x062B, 0x064A, + 0x0641, 0x0649, 0x0641, 0x064A, 0x0642, 0x0649, 0x0642, 0x064A, 0x0643, + 0x0627, 0x0643, 0x0644, 0x0643, 0x0645, 0x0643, 0x0649, 0x0643, 0x064A, + 0x0644, 0x0645, 0x0644, 0x0649, 0x0644, 0x064A, 0x0645, 0x0627, 0x0645, + 0x0645, 0x0646, 0x0631, 0x0646, 0x0632, 0x0646, 0x0645, 0x0646, 0x0646, + 0x0646, 0x0649, 0x0646, 0x064A, 0x0649, 0x0670, 0x064A, 0x0631, 0x064A, + 0x0632, 0x064A, 0x0645, 0x064A, 0x0646, 0x064A, 0x0649, 0x064A, 0x064A, + 0x0626, 0x062C, 0x0626, 0x062D, 0x0626, 0x062E, 0x0626, 0x0645, 0x0626, + 0x0647, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x0645, + 0x0628, 0x0647, 0x062A, 0x062C, 0x062A, 0x062D, 0x062A, 0x062E, 0x062A, + 0x0645, 0x062A, 0x0647, 0x062B, 0x0645, 0x062C, 0x062D, 0x062C, 0x0645, + 0x062D, 0x062C, 0x062D, 0x0645, 0x062E, 0x062C, 0x062E, 0x0645, 0x0633, + 0x062C, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x0645, 0x0635, 0x062D, + 0x0635, 0x062E, 0x0635, 0x0645, 0x0636, 0x062C, 0x0636, 0x062D, 0x0636, + 0x062E, 0x0636, 0x0645, 0x0637, 0x062D, 0x0638, 0x0645, 0x0639, 0x062C, + 0x0639, 0x0645, 0x063A, 0x062C, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, + 0x062D, 0x0641, 0x062E, 0x0641, 0x0645, 0x0642, 0x062D, 0x0642, 0x0645, + 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062E, 0x0643, 0x0644, 0x0643, + 0x0645, 0x0644, 0x062C, 0x0644, 0x062D, 0x0644, 0x062E, 0x0644, 0x0645, + 0x0644, 0x0647, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, + 0x0645, 0x0646, 0x062C, 0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x0645, + 0x0646, 0x0647, 0x0647, 0x062C, 0x0647, 0x0645, 0x0647, 0x0670, 0x064A, + 0x062C, 0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0647, + 0x0626, 0x0645, 0x0626, 0x0647, 0x0628, 0x0645, 0x0628, 0x0647, 0x062A, + 0x0645, 0x062A, 0x0647, 0x062B, 0x0645, 0x062B, 0x0647, 0x0633, 0x0645, + 0x0633, 0x0647, 0x0634, 0x0645, 0x0634, 0x0647, 0x0643, 0x0644, 0x0643, + 0x0645, 0x0644, 0x0645, 0x0646, 0x0645, 0x0646, 0x0647, 0x064A, 0x0645, + 0x064A, 0x0647, 0x0637, 0x0649, 0x0637, 0x064A, 0x0639, 0x0649, 0x0639, + 0x064A, 0x063A, 0x0649, 0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x064A, + 0x0634, 0x0649, 0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x064A, 0x062C, + 0x0649, 0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x064A, 0x0635, 0x0649, + 0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x064A, 0x0634, 0x062C, 0x0634, + 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0631, 0x0633, 0x0631, + 0x0635, 0x0631, 0x0636, 0x0631, 0x0637, 0x0649, 0x0637, 0x064A, 0x0639, + 0x0649, 0x0639, 0x064A, 0x063A, 0x0649, 0x063A, 0x064A, 0x0633, 0x0649, + 0x0633, 0x064A, 0x0634, 0x0649, 0x0634, 0x064A, 0x062D, 0x0649, 0x062D, + 0x064A, 0x062C, 0x0649, 0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x064A, + 0x0635, 0x0649, 0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x064A, 0x0634, + 0x062C, 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0631, + 0x0633, 0x0631, 0x0635, 0x0631, 0x0636, 0x0631, 0x0634, 0x062C, 0x0634, + 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0633, 0x0647, 0x0634, 0x0647, + 0x0637, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062E, 0x0634, + 0x062C, 0x0634, 0x062D, 0x0634, 0x062E, 0x0637, 0x0645, 0x0638, 0x0645, + 0x0627, 0x064B, 0x0627, 0x064B, 0x0640, 0x064B, 0x0640, 0x064E, 0x0640, + 0x064F, 0x0640, 0x0650, 0x0640, 0x0651, 0x0640, 0x0652, 0x0644, 0x0622, + 0x0644, 0x0622, 0x0644, 0x0623, 0x0644, 0x0623, 0x0644, 0x0625, 0x0644, + 0x0625, 0x0644, 0x0627, 0x0644, 0x0627}; + +const uint16_t g_UnicodeData_Normalization_Map3[1164] = { + 0x0031, 0x002F, 0x0034, 0x0031, 0x002F, 0x0032, 0x0033, 0x002F, 0x0034, + 0x002E, 0x002E, 0x002E, 0x2032, 0x2032, 0x2032, 0x2035, 0x2035, 0x2035, + 0x0061, 0x002F, 0x0063, 0x0061, 0x002F, 0x0073, 0x0063, 0x002F, 0x006F, + 0x0063, 0x002F, 0x0075, 0x0054, 0x0045, 0x004C, 0x0046, 0x0041, 0x0058, + 0x0031, 0x002F, 0x0037, 0x0031, 0x002F, 0x0039, 0x0031, 0x002F, 0x0033, + 0x0032, 0x002F, 0x0033, 0x0031, 0x002F, 0x0035, 0x0032, 0x002F, 0x0035, + 0x0033, 0x002F, 0x0035, 0x0034, 0x002F, 0x0035, 0x0031, 0x002F, 0x0036, + 0x0035, 0x002F, 0x0036, 0x0031, 0x002F, 0x0038, 0x0033, 0x002F, 0x0038, + 0x0035, 0x002F, 0x0038, 0x0037, 0x002F, 0x0038, 0x0049, 0x0049, 0x0049, + 0x0056, 0x0049, 0x0049, 0x0058, 0x0049, 0x0049, 0x0069, 0x0069, 0x0069, + 0x0076, 0x0069, 0x0069, 0x0078, 0x0069, 0x0069, 0x0030, 0x2044, 0x0033, + 0x222B, 0x222B, 0x222B, 0x222E, 0x222E, 0x222E, 0x004E, 0x0055, 0x004C, + 0x0053, 0x004F, 0x0048, 0x0053, 0x0054, 0x0058, 0x0045, 0x0054, 0x0058, + 0x0045, 0x004F, 0x0054, 0x0045, 0x004E, 0x0051, 0x0041, 0x0043, 0x004B, + 0x0042, 0x0045, 0x004C, 0x0044, 0x004C, 0x0045, 0x0044, 0x0043, 0x0031, + 0x0044, 0x0043, 0x0032, 0x0044, 0x0043, 0x0033, 0x0044, 0x0043, 0x0034, + 0x004E, 0x0041, 0x004B, 0x0053, 0x0059, 0x004E, 0x0045, 0x0054, 0x0042, + 0x0043, 0x0041, 0x004E, 0x0053, 0x0055, 0x0042, 0x0045, 0x0053, 0x0043, + 0x0044, 0x0045, 0x004C, 0x0028, 0x0031, 0x0029, 0x0028, 0x0032, 0x0029, + 0x0028, 0x0033, 0x0029, 0x0028, 0x0034, 0x0029, 0x0028, 0x0035, 0x0029, + 0x0028, 0x0036, 0x0029, 0x0028, 0x0037, 0x0029, 0x0028, 0x0038, 0x0029, + 0x0028, 0x0039, 0x0029, 0x0031, 0x0030, 0x002E, 0x0031, 0x0031, 0x002E, + 0x0031, 0x0032, 0x002E, 0x0031, 0x0033, 0x002E, 0x0031, 0x0034, 0x002E, + 0x0031, 0x0035, 0x002E, 0x0031, 0x0036, 0x002E, 0x0031, 0x0037, 0x002E, + 0x0031, 0x0038, 0x002E, 0x0031, 0x0039, 0x002E, 0x0032, 0x0030, 0x002E, + 0x0028, 0x0061, 0x0029, 0x0028, 0x0062, 0x0029, 0x0028, 0x0063, 0x0029, + 0x0028, 0x0064, 0x0029, 0x0028, 0x0065, 0x0029, 0x0028, 0x0066, 0x0029, + 0x0028, 0x0067, 0x0029, 0x0028, 0x0068, 0x0029, 0x0028, 0x0069, 0x0029, + 0x0028, 0x006A, 0x0029, 0x0028, 0x006B, 0x0029, 0x0028, 0x006C, 0x0029, + 0x0028, 0x006D, 0x0029, 0x0028, 0x006E, 0x0029, 0x0028, 0x006F, 0x0029, + 0x0028, 0x0070, 0x0029, 0x0028, 0x0071, 0x0029, 0x0028, 0x0072, 0x0029, + 0x0028, 0x0073, 0x0029, 0x0028, 0x0074, 0x0029, 0x0028, 0x0075, 0x0029, + 0x0028, 0x0076, 0x0029, 0x0028, 0x0077, 0x0029, 0x0028, 0x0078, 0x0029, + 0x0028, 0x0079, 0x0029, 0x0028, 0x007A, 0x0029, 0x003A, 0x003A, 0x003D, + 0x003D, 0x003D, 0x003D, 0x0028, 0x1100, 0x0029, 0x0028, 0x1102, 0x0029, + 0x0028, 0x1103, 0x0029, 0x0028, 0x1105, 0x0029, 0x0028, 0x1106, 0x0029, + 0x0028, 0x1107, 0x0029, 0x0028, 0x1109, 0x0029, 0x0028, 0x110B, 0x0029, + 0x0028, 0x110C, 0x0029, 0x0028, 0x110E, 0x0029, 0x0028, 0x110F, 0x0029, + 0x0028, 0x1110, 0x0029, 0x0028, 0x1111, 0x0029, 0x0028, 0x1112, 0x0029, + 0x0028, 0x4E00, 0x0029, 0x0028, 0x4E8C, 0x0029, 0x0028, 0x4E09, 0x0029, + 0x0028, 0x56DB, 0x0029, 0x0028, 0x4E94, 0x0029, 0x0028, 0x516D, 0x0029, + 0x0028, 0x4E03, 0x0029, 0x0028, 0x516B, 0x0029, 0x0028, 0x4E5D, 0x0029, + 0x0028, 0x5341, 0x0029, 0x0028, 0x6708, 0x0029, 0x0028, 0x706B, 0x0029, + 0x0028, 0x6C34, 0x0029, 0x0028, 0x6728, 0x0029, 0x0028, 0x91D1, 0x0029, + 0x0028, 0x571F, 0x0029, 0x0028, 0x65E5, 0x0029, 0x0028, 0x682A, 0x0029, + 0x0028, 0x6709, 0x0029, 0x0028, 0x793E, 0x0029, 0x0028, 0x540D, 0x0029, + 0x0028, 0x7279, 0x0029, 0x0028, 0x8CA1, 0x0029, 0x0028, 0x795D, 0x0029, + 0x0028, 0x52B4, 0x0029, 0x0028, 0x4EE3, 0x0029, 0x0028, 0x547C, 0x0029, + 0x0028, 0x5B66, 0x0029, 0x0028, 0x76E3, 0x0029, 0x0028, 0x4F01, 0x0029, + 0x0028, 0x8CC7, 0x0029, 0x0028, 0x5354, 0x0029, 0x0028, 0x796D, 0x0029, + 0x0028, 0x4F11, 0x0029, 0x0028, 0x81EA, 0x0029, 0x0028, 0x81F3, 0x0029, + 0x0050, 0x0054, 0x0045, 0x0031, 0x0030, 0x6708, 0x0031, 0x0031, 0x6708, + 0x0031, 0x0032, 0x6708, 0x0065, 0x0072, 0x0067, 0x004C, 0x0054, 0x0044, + 0x30A2, 0x30FC, 0x30EB, 0x30A4, 0x30F3, 0x30C1, 0x30A6, 0x30A9, 0x30F3, + 0x30AA, 0x30F3, 0x30B9, 0x30AA, 0x30FC, 0x30E0, 0x30AB, 0x30A4, 0x30EA, + 0x30AC, 0x30ED, 0x30F3, 0x30AC, 0x30F3, 0x30DE, 0x30AE, 0x30CB, 0x30FC, + 0x30B0, 0x30E9, 0x30E0, 0x30B1, 0x30FC, 0x30B9, 0x30B3, 0x30EB, 0x30CA, + 0x30B3, 0x30FC, 0x30DD, 0x30BB, 0x30F3, 0x30C1, 0x30BB, 0x30F3, 0x30C8, + 0x30C0, 0x30FC, 0x30B9, 0x30CE, 0x30C3, 0x30C8, 0x30CF, 0x30A4, 0x30C4, + 0x30D1, 0x30FC, 0x30C4, 0x30D4, 0x30AF, 0x30EB, 0x30D5, 0x30E9, 0x30F3, + 0x30DA, 0x30CB, 0x30D2, 0x30D8, 0x30EB, 0x30C4, 0x30DA, 0x30F3, 0x30B9, + 0x30DA, 0x30FC, 0x30B8, 0x30D9, 0x30FC, 0x30BF, 0x30DC, 0x30EB, 0x30C8, + 0x30DD, 0x30F3, 0x30C9, 0x30DB, 0x30FC, 0x30EB, 0x30DB, 0x30FC, 0x30F3, + 0x30DE, 0x30A4, 0x30EB, 0x30DE, 0x30C3, 0x30CF, 0x30DE, 0x30EB, 0x30AF, + 0x30E4, 0x30FC, 0x30C9, 0x30E4, 0x30FC, 0x30EB, 0x30E6, 0x30A2, 0x30F3, + 0x30EB, 0x30D4, 0x30FC, 0x30EF, 0x30C3, 0x30C8, 0x0031, 0x0030, 0x70B9, + 0x0031, 0x0031, 0x70B9, 0x0031, 0x0032, 0x70B9, 0x0031, 0x0033, 0x70B9, + 0x0031, 0x0034, 0x70B9, 0x0031, 0x0035, 0x70B9, 0x0031, 0x0036, 0x70B9, + 0x0031, 0x0037, 0x70B9, 0x0031, 0x0038, 0x70B9, 0x0031, 0x0039, 0x70B9, + 0x0032, 0x0030, 0x70B9, 0x0032, 0x0031, 0x70B9, 0x0032, 0x0032, 0x70B9, + 0x0032, 0x0033, 0x70B9, 0x0032, 0x0034, 0x70B9, 0x0068, 0x0050, 0x0061, + 0x0062, 0x0061, 0x0072, 0x0064, 0x006D, 0x00B2, 0x0064, 0x006D, 0x00B3, + 0x0063, 0x0061, 0x006C, 0x006B, 0x0048, 0x007A, 0x004D, 0x0048, 0x007A, + 0x0047, 0x0048, 0x007A, 0x0054, 0x0048, 0x007A, 0x006D, 0x006D, 0x00B2, + 0x0063, 0x006D, 0x00B2, 0x006B, 0x006D, 0x00B2, 0x006D, 0x006D, 0x00B3, + 0x0063, 0x006D, 0x00B3, 0x006B, 0x006D, 0x00B3, 0x006D, 0x2215, 0x0073, + 0x006B, 0x0050, 0x0061, 0x004D, 0x0050, 0x0061, 0x0047, 0x0050, 0x0061, + 0x0072, 0x0061, 0x0064, 0x0043, 0x006F, 0x002E, 0x006C, 0x006F, 0x0067, + 0x006D, 0x0069, 0x006C, 0x006D, 0x006F, 0x006C, 0x0050, 0x0050, 0x004D, + 0x0056, 0x2215, 0x006D, 0x0041, 0x2215, 0x006D, 0x0031, 0x0030, 0x65E5, + 0x0031, 0x0031, 0x65E5, 0x0031, 0x0032, 0x65E5, 0x0031, 0x0033, 0x65E5, + 0x0031, 0x0034, 0x65E5, 0x0031, 0x0035, 0x65E5, 0x0031, 0x0036, 0x65E5, + 0x0031, 0x0037, 0x65E5, 0x0031, 0x0038, 0x65E5, 0x0031, 0x0039, 0x65E5, + 0x0032, 0x0030, 0x65E5, 0x0032, 0x0031, 0x65E5, 0x0032, 0x0032, 0x65E5, + 0x0032, 0x0033, 0x65E5, 0x0032, 0x0034, 0x65E5, 0x0032, 0x0035, 0x65E5, + 0x0032, 0x0036, 0x65E5, 0x0032, 0x0037, 0x65E5, 0x0032, 0x0038, 0x65E5, + 0x0032, 0x0039, 0x65E5, 0x0033, 0x0030, 0x65E5, 0x0033, 0x0031, 0x65E5, + 0x0067, 0x0061, 0x006C, 0x0066, 0x0066, 0x0069, 0x0066, 0x0066, 0x006C, + 0x0640, 0x064E, 0x0651, 0x0640, 0x064F, 0x0651, 0x0640, 0x0650, 0x0651, + 0x062A, 0x062C, 0x0645, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x062C, + 0x062A, 0x062D, 0x0645, 0x062A, 0x062E, 0x0645, 0x062A, 0x0645, 0x062C, + 0x062A, 0x0645, 0x062D, 0x062A, 0x0645, 0x062E, 0x062C, 0x0645, 0x062D, + 0x062C, 0x0645, 0x062D, 0x062D, 0x0645, 0x064A, 0x062D, 0x0645, 0x0649, + 0x0633, 0x062D, 0x062C, 0x0633, 0x062C, 0x062D, 0x0633, 0x062C, 0x0649, + 0x0633, 0x0645, 0x062D, 0x0633, 0x0645, 0x062D, 0x0633, 0x0645, 0x062C, + 0x0633, 0x0645, 0x0645, 0x0633, 0x0645, 0x0645, 0x0635, 0x062D, 0x062D, + 0x0635, 0x062D, 0x062D, 0x0635, 0x0645, 0x0645, 0x0634, 0x062D, 0x0645, + 0x0634, 0x062D, 0x0645, 0x0634, 0x062C, 0x064A, 0x0634, 0x0645, 0x062E, + 0x0634, 0x0645, 0x062E, 0x0634, 0x0645, 0x0645, 0x0634, 0x0645, 0x0645, + 0x0636, 0x062D, 0x0649, 0x0636, 0x062E, 0x0645, 0x0636, 0x062E, 0x0645, + 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x0645, + 0x0637, 0x0645, 0x064A, 0x0639, 0x062C, 0x0645, 0x0639, 0x0645, 0x0645, + 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0649, 0x063A, 0x0645, 0x0645, + 0x063A, 0x0645, 0x064A, 0x063A, 0x0645, 0x0649, 0x0641, 0x062E, 0x0645, + 0x0641, 0x062E, 0x0645, 0x0642, 0x0645, 0x062D, 0x0642, 0x0645, 0x0645, + 0x0644, 0x062D, 0x0645, 0x0644, 0x062D, 0x064A, 0x0644, 0x062D, 0x0649, + 0x0644, 0x062C, 0x062C, 0x0644, 0x062C, 0x062C, 0x0644, 0x062E, 0x0645, + 0x0644, 0x062E, 0x0645, 0x0644, 0x0645, 0x062D, 0x0644, 0x0645, 0x062D, + 0x0645, 0x062D, 0x062C, 0x0645, 0x062D, 0x0645, 0x0645, 0x062D, 0x064A, + 0x0645, 0x062C, 0x062D, 0x0645, 0x062C, 0x0645, 0x0645, 0x062E, 0x062C, + 0x0645, 0x062E, 0x0645, 0x0645, 0x062C, 0x062E, 0x0647, 0x0645, 0x062C, + 0x0647, 0x0645, 0x0645, 0x0646, 0x062D, 0x0645, 0x0646, 0x062D, 0x0649, + 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0649, + 0x0646, 0x0645, 0x064A, 0x0646, 0x0645, 0x0649, 0x064A, 0x0645, 0x0645, + 0x064A, 0x0645, 0x0645, 0x0628, 0x062E, 0x064A, 0x062A, 0x062C, 0x064A, + 0x062A, 0x062C, 0x0649, 0x062A, 0x062E, 0x064A, 0x062A, 0x062E, 0x0649, + 0x062A, 0x0645, 0x064A, 0x062A, 0x0645, 0x0649, 0x062C, 0x0645, 0x064A, + 0x062C, 0x062D, 0x0649, 0x062C, 0x0645, 0x0649, 0x0633, 0x062E, 0x0649, + 0x0635, 0x062D, 0x064A, 0x0634, 0x062D, 0x064A, 0x0636, 0x062D, 0x064A, + 0x0644, 0x062C, 0x064A, 0x0644, 0x0645, 0x064A, 0x064A, 0x062D, 0x064A, + 0x064A, 0x062C, 0x064A, 0x064A, 0x0645, 0x064A, 0x0645, 0x0645, 0x064A, + 0x0642, 0x0645, 0x064A, 0x0646, 0x062D, 0x064A, 0x0642, 0x0645, 0x062D, + 0x0644, 0x062D, 0x0645, 0x0639, 0x0645, 0x064A, 0x0643, 0x0645, 0x064A, + 0x0646, 0x062C, 0x062D, 0x0645, 0x062E, 0x064A, 0x0644, 0x062C, 0x0645, + 0x0643, 0x0645, 0x0645, 0x0644, 0x062C, 0x0645, 0x0646, 0x062C, 0x062D, + 0x062C, 0x062D, 0x064A, 0x062D, 0x062C, 0x064A, 0x0645, 0x062C, 0x064A, + 0x0641, 0x0645, 0x064A, 0x0628, 0x062D, 0x064A, 0x0643, 0x0645, 0x0645, + 0x0639, 0x062C, 0x0645, 0x0635, 0x0645, 0x0645, 0x0633, 0x062E, 0x064A, + 0x0646, 0x062C, 0x064A, 0x0635, 0x0644, 0x06D2, 0x0642, 0x0644, 0x06D2, + 0x0635, 0x0644, 0x0649}; + +const uint16_t g_UnicodeData_Normalization_Map4[488] = { + 0x0004, 0x2032, 0x2032, 0x2032, 0x2032, 0x0004, 0x0031, 0x002F, 0x0031, + 0x0030, 0x0004, 0x0056, 0x0049, 0x0049, 0x0049, 0x0004, 0x0076, 0x0069, + 0x0069, 0x0069, 0x0004, 0x0028, 0x0031, 0x0030, 0x0029, 0x0004, 0x0028, + 0x0031, 0x0031, 0x0029, 0x0004, 0x0028, 0x0031, 0x0032, 0x0029, 0x0004, + 0x0028, 0x0031, 0x0033, 0x0029, 0x0004, 0x0028, 0x0031, 0x0034, 0x0029, + 0x0004, 0x0028, 0x0031, 0x0035, 0x0029, 0x0004, 0x0028, 0x0031, 0x0036, + 0x0029, 0x0004, 0x0028, 0x0031, 0x0037, 0x0029, 0x0004, 0x0028, 0x0031, + 0x0038, 0x0029, 0x0004, 0x0028, 0x0031, 0x0039, 0x0029, 0x0004, 0x0028, + 0x0032, 0x0030, 0x0029, 0x0004, 0x222B, 0x222B, 0x222B, 0x222B, 0x0004, + 0x0028, 0x1100, 0x1161, 0x0029, 0x0004, 0x0028, 0x1102, 0x1161, 0x0029, + 0x0004, 0x0028, 0x1103, 0x1161, 0x0029, 0x0004, 0x0028, 0x1105, 0x1161, + 0x0029, 0x0004, 0x0028, 0x1106, 0x1161, 0x0029, 0x0004, 0x0028, 0x1107, + 0x1161, 0x0029, 0x0004, 0x0028, 0x1109, 0x1161, 0x0029, 0x0004, 0x0028, + 0x110B, 0x1161, 0x0029, 0x0004, 0x0028, 0x110C, 0x1161, 0x0029, 0x0004, + 0x0028, 0x110E, 0x1161, 0x0029, 0x0004, 0x0028, 0x110F, 0x1161, 0x0029, + 0x0004, 0x0028, 0x1110, 0x1161, 0x0029, 0x0004, 0x0028, 0x1111, 0x1161, + 0x0029, 0x0004, 0x0028, 0x1112, 0x1161, 0x0029, 0x0004, 0x0028, 0x110C, + 0x116E, 0x0029, 0x0007, 0x0028, 0x110B, 0x1169, 0x110C, 0x1165, 0x11AB, + 0x0029, 0x0006, 0x0028, 0x110B, 0x1169, 0x1112, 0x116E, 0x0029, 0x0005, + 0x110E, 0x1161, 0x11B7, 0x1100, 0x1169, 0x0004, 0x110C, 0x116E, 0x110B, + 0x1174, 0x0004, 0x30A2, 0x30D1, 0x30FC, 0x30C8, 0x0004, 0x30A2, 0x30EB, + 0x30D5, 0x30A1, 0x0004, 0x30A2, 0x30F3, 0x30DA, 0x30A2, 0x0004, 0x30A4, + 0x30CB, 0x30F3, 0x30B0, 0x0005, 0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9, + 0x0004, 0x30A8, 0x30FC, 0x30AB, 0x30FC, 0x0004, 0x30AB, 0x30E9, 0x30C3, + 0x30C8, 0x0004, 0x30AB, 0x30ED, 0x30EA, 0x30FC, 0x0004, 0x30AD, 0x30E5, + 0x30EA, 0x30FC, 0x0004, 0x30AE, 0x30EB, 0x30C0, 0x30FC, 0x0005, 0x30AD, + 0x30ED, 0x30B0, 0x30E9, 0x30E0, 0x0006, 0x30AD, 0x30ED, 0x30E1, 0x30FC, + 0x30C8, 0x30EB, 0x0005, 0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8, 0x0005, + 0x30B0, 0x30E9, 0x30E0, 0x30C8, 0x30F3, 0x0005, 0x30AF, 0x30EB, 0x30BC, + 0x30A4, 0x30ED, 0x0004, 0x30AF, 0x30ED, 0x30FC, 0x30CD, 0x0004, 0x30B5, + 0x30A4, 0x30AF, 0x30EB, 0x0005, 0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0, + 0x0004, 0x30B7, 0x30EA, 0x30F3, 0x30B0, 0x0005, 0x30D1, 0x30FC, 0x30BB, + 0x30F3, 0x30C8, 0x0004, 0x30D0, 0x30FC, 0x30EC, 0x30EB, 0x0005, 0x30D4, + 0x30A2, 0x30B9, 0x30C8, 0x30EB, 0x0005, 0x30D5, 0x30A1, 0x30E9, 0x30C3, + 0x30C9, 0x0004, 0x30D5, 0x30A3, 0x30FC, 0x30C8, 0x0005, 0x30D6, 0x30C3, + 0x30B7, 0x30A7, 0x30EB, 0x0005, 0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB, + 0x0004, 0x30DD, 0x30A4, 0x30F3, 0x30C8, 0x0004, 0x30DE, 0x30A4, 0x30AF, + 0x30ED, 0x0005, 0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3, 0x0004, 0x30DF, + 0x30AF, 0x30ED, 0x30F3, 0x0005, 0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB, + 0x0004, 0x30E1, 0x30AC, 0x30C8, 0x30F3, 0x0004, 0x30E1, 0x30FC, 0x30C8, + 0x30EB, 0x0004, 0x30EA, 0x30C3, 0x30C8, 0x30EB, 0x0004, 0x30EB, 0x30FC, + 0x30D6, 0x30EB, 0x0005, 0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3, 0x0004, + 0x682A, 0x5F0F, 0x4F1A, 0x793E, 0x0004, 0x006B, 0x0063, 0x0061, 0x006C, + 0x0004, 0x006D, 0x2215, 0x0073, 0x00B2, 0x0005, 0x0072, 0x0061, 0x0064, + 0x2215, 0x0073, 0x0006, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x00B2, + 0x0004, 0x0061, 0x002E, 0x006D, 0x002E, 0x0004, 0x0043, 0x2215, 0x006B, + 0x0067, 0x0004, 0x0070, 0x002E, 0x006D, 0x002E, 0x0004, 0x0627, 0x0644, + 0x0644, 0x0647, 0x0004, 0x0627, 0x0643, 0x0628, 0x0631, 0x0004, 0x0645, + 0x062D, 0x0645, 0x062F, 0x0004, 0x0635, 0x0644, 0x0639, 0x0645, 0x0004, + 0x0631, 0x0633, 0x0648, 0x0644, 0x0004, 0x0639, 0x0644, 0x064A, 0x0647, + 0x0004, 0x0648, 0x0633, 0x0644, 0x0645, 0x0012, 0x0635, 0x0644, 0x0649, + 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A, + 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645, 0x0008, 0x062C, 0x0644, + 0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647, 0x0004, 0x0631, 0x06CC, + 0x0627, 0x0644}; diff --git a/modules/pdfium/pdfium/core/fpdftext/unicodenormalizationdata.h b/modules/pdfium/pdfium/core/fpdftext/unicodenormalizationdata.h new file mode 100644 index 000000000000..39ee552ec42c --- /dev/null +++ b/modules/pdfium/pdfium/core/fpdftext/unicodenormalizationdata.h @@ -0,0 +1,18 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FPDFTEXT_UNICODENORMALIZATIONDATA_H_ +#define CORE_FPDFTEXT_UNICODENORMALIZATIONDATA_H_ + +#include + +extern const uint16_t g_UnicodeData_Normalization[]; +extern const uint16_t g_UnicodeData_Normalization_Map1[]; +extern const uint16_t g_UnicodeData_Normalization_Map2[]; +extern const uint16_t g_UnicodeData_Normalization_Map3[]; +extern const uint16_t g_UnicodeData_Normalization_Map4[]; + +#endif // CORE_FPDFTEXT_UNICODENORMALIZATIONDATA_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/DEPS b/modules/pdfium/pdfium/core/fxcodec/DEPS new file mode 100644 index 000000000000..a88b3294a9df --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/DEPS @@ -0,0 +1,8 @@ +include_rules = [ + '+third_party/lcms2-2.6', + '+third_party/libjpeg/jpeglib.h', + # For non-standalone builds that may use libjpeg_turbo. + '+third_party/libjpeg_turbo/jpeglib.h', + '+third_party/libopenjpeg20', + '+third_party/zlib_v128', +] diff --git a/modules/pdfium/pdfium/core/fxcodec/JBig2_DocumentContext.h b/modules/pdfium/pdfium/core/fxcodec/JBig2_DocumentContext.h new file mode 100644 index 000000000000..9e5d3b3d3bfa --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/JBig2_DocumentContext.h @@ -0,0 +1,34 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_DOCUMENTCONTEXT_H_ +#define CORE_FXCODEC_JBIG2_DOCUMENTCONTEXT_H_ + +#include +#include +#include + +class CJBig2_SymbolDict; + +using CJBig2_CacheKey = std::pair; +using CJBig2_CachePair = + std::pair>; + +// Holds per-document JBig2 related data. +class JBig2_DocumentContext { + public: + JBig2_DocumentContext(); + ~JBig2_DocumentContext(); + + std::list* GetSymbolDictCache() { + return &m_SymbolDictCache; + } + + private: + std::list m_SymbolDictCache; +}; + +#endif // CORE_FXCODEC_JBIG2_DOCUMENTCONTEXT_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/DEPS b/modules/pdfium/pdfium/core/fxcodec/codec/DEPS new file mode 100644 index 000000000000..495d288992e6 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/DEPS @@ -0,0 +1,4 @@ +include_rules = [ + '+third_party/libpng16/png.h', + '+third_party/libtiff/tiffiop.h', +] diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_basicmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_basicmodule.h new file mode 100644 index 000000000000..015f41a4a4e2 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_basicmodule.h @@ -0,0 +1,35 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CCODEC_BASICMODULE_H_ +#define CORE_FXCODEC_CODEC_CCODEC_BASICMODULE_H_ + +#include + +#include "core/fxcrt/fx_system.h" + +class CCodec_ScanlineDecoder; + +class CCodec_BasicModule { + public: + std::unique_ptr CreateRunLengthDecoder( + const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + int bpc); + bool RunLengthEncode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t** dest_buf, + uint32_t* dest_size); + bool A85Encode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t** dest_buf, + uint32_t* dest_size); +}; + +#endif // CORE_FXCODEC_CODEC_CCODEC_BASICMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_bmpmodule.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_bmpmodule.cpp new file mode 100644 index 000000000000..9d64199501ae --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_bmpmodule.cpp @@ -0,0 +1,131 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/codec/ccodec_bmpmodule.h" + +#include "core/fxcodec/codec/codec_int.h" +#include "core/fxcodec/fx_codec.h" +#include "core/fxcodec/lbmp/fx_bmp.h" +#include "core/fxge/fx_dib.h" + +struct FXBMP_Context { + bmp_decompress_struct_p bmp_ptr; + void* parent_ptr; + + void* (*m_AllocFunc)(unsigned int); + void (*m_FreeFunc)(void*); +}; +extern "C" { +static void* bmp_alloc_func(unsigned int size) { + return FX_Alloc(char, size); +} +static void bmp_free_func(void* p) { + FX_Free(p); +} +}; +static void bmp_error_data(bmp_decompress_struct_p bmp_ptr, + const FX_CHAR* err_msg) { + FXSYS_strncpy((char*)bmp_ptr->err_ptr, err_msg, BMP_MAX_ERROR_SIZE - 1); + longjmp(bmp_ptr->jmpbuf, 1); +} +static void bmp_read_scanline(bmp_decompress_struct_p bmp_ptr, + int32_t row_num, + uint8_t* row_buf) { + FXBMP_Context* p = (FXBMP_Context*)bmp_ptr->context_ptr; + CCodec_BmpModule* pModule = (CCodec_BmpModule*)p->parent_ptr; + pModule->GetDelegate()->BmpReadScanline(row_num, row_buf); +} +static bool bmp_get_data_position(bmp_decompress_struct_p bmp_ptr, + uint32_t rcd_pos) { + FXBMP_Context* p = (FXBMP_Context*)bmp_ptr->context_ptr; + CCodec_BmpModule* pModule = (CCodec_BmpModule*)p->parent_ptr; + return pModule->GetDelegate()->BmpInputImagePositionBuf(rcd_pos); +} + +CCodec_BmpModule::CCodec_BmpModule() { + memset(m_szLastError, 0, sizeof(m_szLastError)); +} + +CCodec_BmpModule::~CCodec_BmpModule() {} + +FXBMP_Context* CCodec_BmpModule::Start() { + FXBMP_Context* p = FX_Alloc(FXBMP_Context, 1); + if (!p) + return nullptr; + + FXSYS_memset(p, 0, sizeof(FXBMP_Context)); + if (!p) + return nullptr; + + p->m_AllocFunc = bmp_alloc_func; + p->m_FreeFunc = bmp_free_func; + p->bmp_ptr = nullptr; + p->parent_ptr = (void*)this; + p->bmp_ptr = bmp_create_decompress(); + if (!p->bmp_ptr) { + FX_Free(p); + return nullptr; + } + p->bmp_ptr->context_ptr = (void*)p; + p->bmp_ptr->err_ptr = m_szLastError; + p->bmp_ptr->bmp_error_fn = bmp_error_data; + p->bmp_ptr->bmp_get_row_fn = bmp_read_scanline; + p->bmp_ptr->bmp_get_data_position_fn = bmp_get_data_position; + return p; +} + +void CCodec_BmpModule::Finish(FXBMP_Context* ctx) { + if (ctx) { + bmp_destroy_decompress(&ctx->bmp_ptr); + ctx->m_FreeFunc(ctx); + } +} +int32_t CCodec_BmpModule::ReadHeader(FXBMP_Context* ctx, + int32_t* width, + int32_t* height, + bool* tb_flag, + int32_t* components, + int32_t* pal_num, + uint32_t** pal_pp, + CFX_DIBAttribute* pAttribute) { + if (setjmp(ctx->bmp_ptr->jmpbuf)) { + return 0; + } + int32_t ret = bmp_read_header(ctx->bmp_ptr); + if (ret != 1) { + return ret; + } + *width = ctx->bmp_ptr->width; + *height = ctx->bmp_ptr->height; + *tb_flag = ctx->bmp_ptr->imgTB_flag; + *components = ctx->bmp_ptr->components; + *pal_num = ctx->bmp_ptr->pal_num; + *pal_pp = ctx->bmp_ptr->pal_ptr; + if (pAttribute) { + pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_METER; + pAttribute->m_nXDPI = ctx->bmp_ptr->dpi_x; + pAttribute->m_nYDPI = ctx->bmp_ptr->dpi_y; + pAttribute->m_nBmpCompressType = ctx->bmp_ptr->compress_flag; + } + return 1; +} + +int32_t CCodec_BmpModule::LoadImage(FXBMP_Context* ctx) { + if (setjmp(ctx->bmp_ptr->jmpbuf)) + return 0; + return bmp_decode_image(ctx->bmp_ptr); +} + +uint32_t CCodec_BmpModule::GetAvailInput(FXBMP_Context* ctx, + uint8_t** avail_buf_ptr) { + return bmp_get_avail_input(ctx->bmp_ptr, avail_buf_ptr); +} + +void CCodec_BmpModule::Input(FXBMP_Context* ctx, + const uint8_t* src_buf, + uint32_t src_size) { + bmp_input_buffer(ctx->bmp_ptr, (uint8_t*)src_buf, src_size); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_bmpmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_bmpmodule.h new file mode 100644 index 000000000000..11d5931cac3b --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_bmpmodule.h @@ -0,0 +1,39 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CCODEC_BMPMODULE_H_ +#define CORE_FXCODEC_CODEC_CCODEC_BMPMODULE_H_ + +#include "core/fxcodec/codec/icodec_bmpmodule.h" +#include "core/fxcrt/fx_system.h" + +class CCodec_BmpModule : public ICodec_BmpModule { + public: + CCodec_BmpModule(); + ~CCodec_BmpModule() override; + + FXBMP_Context* Start() override; + void Finish(FXBMP_Context* pContext) override; + uint32_t GetAvailInput(FXBMP_Context* pContext, + uint8_t** avail_buf_ptr) override; + void Input(FXBMP_Context* pContext, + const uint8_t* src_buf, + uint32_t src_size) override; + int32_t ReadHeader(FXBMP_Context* pContext, + int32_t* width, + int32_t* height, + bool* tb_flag, + int32_t* components, + int32_t* pal_num, + uint32_t** pal_pp, + CFX_DIBAttribute* pAttribute) override; + int32_t LoadImage(FXBMP_Context* pContext) override; + + protected: + FX_CHAR m_szLastError[256]; +}; + +#endif // CORE_FXCODEC_CODEC_CCODEC_BMPMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_faxmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_faxmodule.h new file mode 100644 index 000000000000..92e45e6719a4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_faxmodule.h @@ -0,0 +1,39 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CCODEC_FAXMODULE_H_ +#define CORE_FXCODEC_CODEC_CCODEC_FAXMODULE_H_ + +#include + +#include "core/fxcrt/fx_memory.h" +#include "core/fxcrt/fx_system.h" + +class CCodec_ScanlineDecoder; + +class CCodec_FaxModule { + public: + std::unique_ptr CreateDecoder(const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int K, + bool EndOfLine, + bool EncodedByteAlign, + bool BlackIs1, + int Columns, + int Rows); +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_ + static void FaxEncode(const uint8_t* src_buf, + int width, + int height, + int pitch, + std::unique_ptr* dest_buf, + uint32_t* dest_size); +#endif +}; + +#endif // CORE_FXCODEC_CODEC_CCODEC_FAXMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_flatemodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_flatemodule.h new file mode 100644 index 000000000000..5178943ca0cf --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_flatemodule.h @@ -0,0 +1,49 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CCODEC_FLATEMODULE_H_ +#define CORE_FXCODEC_CODEC_CCODEC_FLATEMODULE_H_ + +#include + +#include "core/fxcrt/fx_system.h" + +class CCodec_ScanlineDecoder; + +class CCodec_FlateModule { + public: + std::unique_ptr CreateDecoder(const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + int bpc, + int predictor, + int Colors, + int BitsPerComponent, + int Columns); + uint32_t FlateOrLZWDecode(bool bLZW, + const uint8_t* src_buf, + uint32_t src_size, + bool bEarlyChange, + int predictor, + int Colors, + int BitsPerComponent, + int Columns, + uint32_t estimated_size, + uint8_t*& dest_buf, + uint32_t& dest_size); + bool Encode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t** dest_buf, + uint32_t* dest_size); + bool PngEncode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t** dest_buf, + uint32_t* dest_size); +}; + +#endif // CORE_FXCODEC_CODEC_CCODEC_FLATEMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_gifmodule.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_gifmodule.cpp new file mode 100644 index 000000000000..a85bc5eddc31 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_gifmodule.cpp @@ -0,0 +1,198 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/codec/ccodec_gifmodule.h" + +#include "core/fxcodec/codec/codec_int.h" +#include "core/fxcodec/fx_codec.h" +#include "core/fxcodec/lgif/fx_gif.h" +#include "core/fxge/fx_dib.h" + +struct FXGIF_Context { + gif_decompress_struct_p gif_ptr; + void* parent_ptr; + + void* (*m_AllocFunc)(unsigned int); + void (*m_FreeFunc)(void*); +}; + +extern "C" { +static void* gif_alloc_func(unsigned int size) { + return FX_Alloc(char, size); +} +static void gif_free_func(void* p) { + FX_Free(p); +} +}; + +static void gif_error_data(gif_decompress_struct_p gif_ptr, + const FX_CHAR* err_msg) { + FXSYS_strncpy((char*)gif_ptr->err_ptr, err_msg, GIF_MAX_ERROR_SIZE - 1); + longjmp(gif_ptr->jmpbuf, 1); +} + +static uint8_t* gif_ask_buf_for_pal(gif_decompress_struct_p gif_ptr, + int32_t pal_size) { + FXGIF_Context* p = (FXGIF_Context*)gif_ptr->context_ptr; + CCodec_GifModule* pModule = (CCodec_GifModule*)p->parent_ptr; + return pModule->GetDelegate()->GifAskLocalPaletteBuf( + gif_get_frame_num(gif_ptr), pal_size); +} + +static void gif_record_current_position(gif_decompress_struct_p gif_ptr, + uint32_t* cur_pos_ptr) { + FXGIF_Context* p = (FXGIF_Context*)gif_ptr->context_ptr; + CCodec_GifModule* pModule = (CCodec_GifModule*)p->parent_ptr; + pModule->GetDelegate()->GifRecordCurrentPosition(*cur_pos_ptr); +} + +static void gif_read_scanline(gif_decompress_struct_p gif_ptr, + int32_t row_num, + uint8_t* row_buf) { + FXGIF_Context* p = (FXGIF_Context*)gif_ptr->context_ptr; + CCodec_GifModule* pModule = (CCodec_GifModule*)p->parent_ptr; + pModule->GetDelegate()->GifReadScanline(row_num, row_buf); +} + +static bool gif_get_record_position(gif_decompress_struct_p gif_ptr, + uint32_t cur_pos, + int32_t left, + int32_t top, + int32_t width, + int32_t height, + int32_t pal_num, + void* pal_ptr, + int32_t delay_time, + bool user_input, + int32_t trans_index, + int32_t disposal_method, + bool interlace) { + FXGIF_Context* p = (FXGIF_Context*)gif_ptr->context_ptr; + CCodec_GifModule* pModule = (CCodec_GifModule*)p->parent_ptr; + return pModule->GetDelegate()->GifInputRecordPositionBuf( + cur_pos, FX_RECT(left, top, left + width, top + height), pal_num, pal_ptr, + delay_time, user_input, trans_index, disposal_method, interlace); +} + +CCodec_GifModule::CCodec_GifModule() { + memset(m_szLastError, 0, sizeof(m_szLastError)); +} + +CCodec_GifModule::~CCodec_GifModule() {} + +FXGIF_Context* CCodec_GifModule::Start() { + FXGIF_Context* p = FX_Alloc(FXGIF_Context, 1); + if (!p) + return nullptr; + + FXSYS_memset(p, 0, sizeof(FXGIF_Context)); + p->m_AllocFunc = gif_alloc_func; + p->m_FreeFunc = gif_free_func; + p->gif_ptr = nullptr; + p->parent_ptr = (void*)this; + p->gif_ptr = gif_create_decompress(); + if (!p->gif_ptr) { + FX_Free(p); + return nullptr; + } + p->gif_ptr->context_ptr = (void*)p; + p->gif_ptr->err_ptr = m_szLastError; + p->gif_ptr->gif_error_fn = gif_error_data; + p->gif_ptr->gif_ask_buf_for_pal_fn = gif_ask_buf_for_pal; + p->gif_ptr->gif_record_current_position_fn = gif_record_current_position; + p->gif_ptr->gif_get_row_fn = gif_read_scanline; + p->gif_ptr->gif_get_record_position_fn = gif_get_record_position; + return p; +} + +void CCodec_GifModule::Finish(FXGIF_Context* ctx) { + if (ctx) { + gif_destroy_decompress(&ctx->gif_ptr); + ctx->m_FreeFunc(ctx); + } +} + +int32_t CCodec_GifModule::ReadHeader(FXGIF_Context* ctx, + int* width, + int* height, + int* pal_num, + void** pal_pp, + int* bg_index, + CFX_DIBAttribute* pAttribute) { + if (setjmp(ctx->gif_ptr->jmpbuf)) + return 0; + + int32_t ret = gif_read_header(ctx->gif_ptr); + if (ret != 1) + return ret; + + *width = ctx->gif_ptr->width; + *height = ctx->gif_ptr->height; + *pal_num = ctx->gif_ptr->global_pal_num; + *pal_pp = ctx->gif_ptr->global_pal_ptr; + *bg_index = ctx->gif_ptr->bc_index; + return 1; +} + +int32_t CCodec_GifModule::LoadFrameInfo(FXGIF_Context* ctx, int* frame_num) { + if (setjmp(ctx->gif_ptr->jmpbuf)) + return 0; + + int32_t ret = gif_get_frame(ctx->gif_ptr); + if (ret != 1) + return ret; + + *frame_num = gif_get_frame_num(ctx->gif_ptr); + return 1; +} + +int32_t CCodec_GifModule::LoadFrame(FXGIF_Context* ctx, + int frame_num, + CFX_DIBAttribute* pAttribute) { + if (setjmp(ctx->gif_ptr->jmpbuf)) + return 0; + + int32_t ret = gif_load_frame(ctx->gif_ptr, frame_num); + if (ret == 1) { + if (pAttribute) { + pAttribute->m_nGifLeft = + (*ctx->gif_ptr->img_ptr_arr_ptr)[frame_num]->image_info_ptr->left; + pAttribute->m_nGifTop = + (*ctx->gif_ptr->img_ptr_arr_ptr)[frame_num]->image_info_ptr->top; + pAttribute->m_fAspectRatio = ctx->gif_ptr->pixel_aspect; + if (ctx->gif_ptr->cmt_data_ptr) { + const uint8_t* buf = + (const uint8_t*)ctx->gif_ptr->cmt_data_ptr->GetBuffer(0); + uint32_t len = ctx->gif_ptr->cmt_data_ptr->GetLength(); + if (len > 21) { + uint8_t size = *buf++; + if (size) { + pAttribute->m_strAuthor = CFX_ByteString(buf, size); + } else { + pAttribute->m_strAuthor.clear(); + } + buf += size; + size = *buf++; + if (size == 20) { + FXSYS_memcpy(pAttribute->m_strTime, buf, size); + } + } + } + } + } + return ret; +} + +uint32_t CCodec_GifModule::GetAvailInput(FXGIF_Context* ctx, + uint8_t** avail_buf_ptr) { + return gif_get_avail_input(ctx->gif_ptr, avail_buf_ptr); +} + +void CCodec_GifModule::Input(FXGIF_Context* ctx, + const uint8_t* src_buf, + uint32_t src_size) { + gif_input_buffer(ctx->gif_ptr, (uint8_t*)src_buf, src_size); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_gifmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_gifmodule.h new file mode 100644 index 000000000000..7721d7a767a4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_gifmodule.h @@ -0,0 +1,45 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CCODEC_GIFMODULE_H_ +#define CORE_FXCODEC_CODEC_CCODEC_GIFMODULE_H_ + +#include "core/fxcodec/codec/icodec_gifmodule.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CCodec_GifModule : public ICodec_GifModule { + public: + CCodec_GifModule(); + ~CCodec_GifModule() override; + + FXGIF_Context* Start() override; + void Finish(FXGIF_Context* pContext) override; + uint32_t GetAvailInput(FXGIF_Context* pContext, + uint8_t** avail_buf_ptr = nullptr) override; + + void Input(FXGIF_Context* pContext, + const uint8_t* src_buf, + uint32_t src_size) override; + + int32_t ReadHeader(FXGIF_Context* pContext, + int* width, + int* height, + int* pal_num, + void** pal_pp, + int* bg_index, + CFX_DIBAttribute* pAttribute) override; + + int32_t LoadFrameInfo(FXGIF_Context* pContext, int* frame_num) override; + int32_t LoadFrame(FXGIF_Context* pContext, + int frame_num, + CFX_DIBAttribute* pAttribute) override; + + protected: + FX_CHAR m_szLastError[256]; +}; + +#endif // CORE_FXCODEC_CODEC_CCODEC_GIFMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_iccmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_iccmodule.h new file mode 100644 index 000000000000..1f856faa041a --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_iccmodule.h @@ -0,0 +1,36 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CCODEC_ICCMODULE_H_ +#define CORE_FXCODEC_CODEC_CCODEC_ICCMODULE_H_ + +#include "core/fxcodec/fx_codec_def.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CCodec_IccModule { + public: + CCodec_IccModule(); + ~CCodec_IccModule(); + + void* CreateTransform_sRGB(const uint8_t* pProfileData, + uint32_t dwProfileSize, + uint32_t& nComponents, + int32_t intent = 0, + uint32_t dwSrcFormat = Icc_FORMAT_DEFAULT); + void DestroyTransform(void* pTransform); + void Translate(void* pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues); + void TranslateScanline(void* pTransform, + uint8_t* pDest, + const uint8_t* pSrc, + int pixels); + void SetComponents(uint32_t nComponents) { m_nComponents = nComponents; } + + protected: + uint32_t m_nComponents; +}; + +#endif // CORE_FXCODEC_CODEC_CCODEC_ICCMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jbig2module.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jbig2module.h new file mode 100644 index 000000000000..c74ed5fb0266 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jbig2module.h @@ -0,0 +1,55 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CCODEC_JBIG2MODULE_H_ +#define CORE_FXCODEC_CODEC_CCODEC_JBIG2MODULE_H_ + +#include + +#include "core/fxcodec/fx_codec_def.h" +#include "core/fxcrt/fx_basic.h" + +class CJBig2_Context; +class CJBig2_Image; +class CPDF_StreamAcc; +class IFX_Pause; +class JBig2_DocumentContext; + +class CCodec_Jbig2Context { + public: + CCodec_Jbig2Context(); + ~CCodec_Jbig2Context(); + + uint32_t m_width; + uint32_t m_height; + CPDF_StreamAcc* m_pGlobalStream; + CPDF_StreamAcc* m_pSrcStream; + uint8_t* m_dest_buf; + uint32_t m_dest_pitch; + IFX_Pause* m_pPause; + std::unique_ptr m_pContext; +}; + +class CCodec_Jbig2Module { + public: + CCodec_Jbig2Module() {} + ~CCodec_Jbig2Module(); + + FXCODEC_STATUS StartDecode( + CCodec_Jbig2Context* pJbig2Context, + std::unique_ptr* pContextHolder, + uint32_t width, + uint32_t height, + CPDF_StreamAcc* src_stream, + CPDF_StreamAcc* global_stream, + uint8_t* dest_buf, + uint32_t dest_pitch, + IFX_Pause* pPause); + FXCODEC_STATUS ContinueDecode(CCodec_Jbig2Context* pJbig2Context, + IFX_Pause* pPause); +}; + +#endif // CORE_FXCODEC_CODEC_CCODEC_JBIG2MODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jpegmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jpegmodule.h new file mode 100644 index 000000000000..bad6fa6a9439 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jpegmodule.h @@ -0,0 +1,69 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CCODEC_JPEGMODULE_H_ +#define CORE_FXCODEC_CODEC_CCODEC_JPEGMODULE_H_ + +#include + +#include "core/fxcrt/fx_system.h" + +class CCodec_ScanlineDecoder; +class CFX_DIBSource; +struct FXJPEG_Context; + +#ifdef PDF_ENABLE_XFA +class CFX_DIBAttribute; +#endif // PDF_ENABLE_XFA + +class CCodec_JpegModule { + public: + CCodec_JpegModule() {} + + std::unique_ptr CreateDecoder(const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + bool ColorTransform); + bool LoadInfo(const uint8_t* src_buf, + uint32_t src_size, + int* width, + int* height, + int* num_components, + int* bits_per_components, + bool* color_transform); + FXJPEG_Context* Start(); + void Finish(FXJPEG_Context* pContext); + void Input(FXJPEG_Context* pContext, + const uint8_t* src_buf, + uint32_t src_size); + +#ifndef PDF_ENABLE_XFA + int ReadHeader(FXJPEG_Context* pContext, + int* width, + int* height, + int* nComps); +#else // PDF_ENABLE_XFA + int ReadHeader(FXJPEG_Context* pContext, + int* width, + int* height, + int* nComps, + CFX_DIBAttribute* pAttribute); +#endif // PDF_ENABLE_XFA + + bool StartScanline(FXJPEG_Context* pContext, int down_scale); + bool ReadScanline(FXJPEG_Context* pContext, uint8_t* dest_buf); + uint32_t GetAvailInput(FXJPEG_Context* pContext, uint8_t** avail_buf_ptr); + +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_ + static bool JpegEncode(const CFX_DIBSource* pSource, + uint8_t** dest_buf, + FX_STRSIZE* dest_size); +#endif +}; + +#endif // CORE_FXCODEC_CODEC_CCODEC_JPEGMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jpxmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jpxmodule.h new file mode 100644 index 000000000000..f0b5cb733361 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_jpxmodule.h @@ -0,0 +1,36 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CCODEC_JPXMODULE_H_ +#define CORE_FXCODEC_CODEC_CCODEC_JPXMODULE_H_ + +#include + +#include "core/fxcrt/fx_system.h" + +class CJPX_Decoder; +class CPDF_ColorSpace; + +class CCodec_JpxModule { + public: + CCodec_JpxModule() {} + ~CCodec_JpxModule() {} + + CJPX_Decoder* CreateDecoder(const uint8_t* src_buf, + uint32_t src_size, + CPDF_ColorSpace* cs) { return nullptr; } + void GetImageInfo(CJPX_Decoder* pDecoder, + uint32_t* width, + uint32_t* height, + uint32_t* components) {} + bool Decode(CJPX_Decoder* pDecoder, + uint8_t* dest_data, + int pitch, + const std::vector& offsets) { return false; } + void DestroyDecoder(CJPX_Decoder* pDecoder) {} +}; + +#endif // CORE_FXCODEC_CODEC_CCODEC_JPXMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_pngmodule.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_pngmodule.cpp new file mode 100644 index 000000000000..028513b72941 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_pngmodule.cpp @@ -0,0 +1,262 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/codec/ccodec_pngmodule.h" + +#include + +#include "core/fxcodec/codec/codec_int.h" +#include "core/fxcodec/fx_codec.h" +#include "core/fxge/fx_dib.h" + +extern "C" { +#undef FAR +#include "third_party/libpng16/png.h" +} + +static void _png_error_data(png_structp png_ptr, png_const_charp error_msg) { + if (png_get_error_ptr(png_ptr)) { + FXSYS_strncpy((char*)png_get_error_ptr(png_ptr), error_msg, + PNG_ERROR_SIZE - 1); + } + longjmp(png_jmpbuf(png_ptr), 1); +} +static void _png_warning_data(png_structp png_ptr, png_const_charp error_msg) {} +static void _png_load_bmp_attribute(png_structp png_ptr, + png_infop info_ptr, + CFX_DIBAttribute* pAttribute) { + if (pAttribute) { +#if defined(PNG_pHYs_SUPPORTED) + pAttribute->m_nXDPI = png_get_x_pixels_per_meter(png_ptr, info_ptr); + pAttribute->m_nYDPI = png_get_y_pixels_per_meter(png_ptr, info_ptr); + png_uint_32 res_x, res_y; + int unit_type; + png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, &unit_type); + switch (unit_type) { + case PNG_RESOLUTION_METER: + pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_METER; + break; + default: + pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_NONE; + } +#endif +#if defined(PNG_iCCP_SUPPORTED) + png_charp icc_name; + png_bytep icc_profile; + png_uint_32 icc_proflen; + int compress_type; + png_get_iCCP(png_ptr, info_ptr, &icc_name, &compress_type, &icc_profile, + &icc_proflen); +#endif + int bTime = 0; +#if defined(PNG_tIME_SUPPORTED) + png_timep t = nullptr; + png_get_tIME(png_ptr, info_ptr, &t); + if (t) { + FXSYS_memset(pAttribute->m_strTime, 0, sizeof(pAttribute->m_strTime)); + FXSYS_snprintf((FX_CHAR*)pAttribute->m_strTime, + sizeof(pAttribute->m_strTime), "%4u:%2u:%2u %2u:%2u:%2u", + t->year, t->month, t->day, t->hour, t->minute, t->second); + pAttribute->m_strTime[sizeof(pAttribute->m_strTime) - 1] = 0; + bTime = 1; + } +#endif +#if defined(PNG_TEXT_SUPPORTED) + int i; + FX_STRSIZE len; + const FX_CHAR* buf; + int num_text; + png_textp text = nullptr; + png_get_text(png_ptr, info_ptr, &text, &num_text); + for (i = 0; i < num_text; i++) { + len = FXSYS_strlen(text[i].key); + buf = "Time"; + if (!FXSYS_memcmp(buf, text[i].key, std::min(len, FXSYS_strlen(buf)))) { + if (!bTime) { + FXSYS_memset(pAttribute->m_strTime, 0, sizeof(pAttribute->m_strTime)); + FXSYS_memcpy( + pAttribute->m_strTime, text[i].text, + std::min(sizeof(pAttribute->m_strTime) - 1, text[i].text_length)); + } + } else { + buf = "Author"; + if (!FXSYS_memcmp(buf, text[i].key, std::min(len, FXSYS_strlen(buf)))) { + pAttribute->m_strAuthor = + CFX_ByteString(reinterpret_cast(text[i].text), + static_cast(text[i].text_length)); + } + } + } +#endif + } +} +struct FXPNG_Context { + png_structp png_ptr; + png_infop info_ptr; + void* parent_ptr; + + void* (*m_AllocFunc)(unsigned int); + void (*m_FreeFunc)(void*); +}; +extern "C" { +static void* _png_alloc_func(unsigned int size) { + return FX_Alloc(char, size); +} +static void _png_free_func(void* p) { + FX_Free(p); +} +}; +static void _png_get_header_func(png_structp png_ptr, png_infop info_ptr) { + FXPNG_Context* p = (FXPNG_Context*)png_get_progressive_ptr(png_ptr); + if (!p) + return; + + CCodec_PngModule* pModule = (CCodec_PngModule*)p->parent_ptr; + if (!pModule) + return; + + png_uint_32 width = 0, height = 0; + int bpc = 0, color_type = 0, color_type1 = 0, pass = 0; + double gamma = 1.0; + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bpc, &color_type, nullptr, + nullptr, nullptr); + color_type1 = color_type; + if (bpc > 8) { + png_set_strip_16(png_ptr); + } else if (bpc < 8) { + png_set_expand_gray_1_2_4_to_8(png_ptr); + } + bpc = 8; + if (color_type == PNG_COLOR_TYPE_PALETTE) { + png_set_palette_to_rgb(png_ptr); + } + pass = png_set_interlace_handling(png_ptr); + if (!pModule->GetDelegate()->PngReadHeader(width, height, bpc, pass, + &color_type, &gamma)) { + png_error(p->png_ptr, "Read Header Callback Error"); + } + int intent; + if (png_get_sRGB(png_ptr, info_ptr, &intent)) { + png_set_gamma(png_ptr, gamma, 0.45455); + } else { + double image_gamma; + if (png_get_gAMA(png_ptr, info_ptr, &image_gamma)) { + png_set_gamma(png_ptr, gamma, image_gamma); + } else { + png_set_gamma(png_ptr, gamma, 0.45455); + } + } + switch (color_type) { + case PNG_COLOR_TYPE_GRAY: + case PNG_COLOR_TYPE_GRAY_ALPHA: { + if (color_type1 & PNG_COLOR_MASK_COLOR) { + png_set_rgb_to_gray(png_ptr, 1, 0.299, 0.587); + } + } break; + case PNG_COLOR_TYPE_PALETTE: + if (color_type1 != PNG_COLOR_TYPE_PALETTE) { + png_error(p->png_ptr, "Not Support Output Palette Now"); + } + case PNG_COLOR_TYPE_RGB: + case PNG_COLOR_TYPE_RGB_ALPHA: + if (!(color_type1 & PNG_COLOR_MASK_COLOR)) { + png_set_gray_to_rgb(png_ptr); + } + png_set_bgr(png_ptr); + break; + } + if (!(color_type & PNG_COLOR_MASK_ALPHA)) { + png_set_strip_alpha(png_ptr); + } + if (color_type & PNG_COLOR_MASK_ALPHA && + !(color_type1 & PNG_COLOR_MASK_ALPHA)) { + png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER); + } + png_read_update_info(png_ptr, info_ptr); +} +static void _png_get_end_func(png_structp png_ptr, png_infop info_ptr) {} +static void _png_get_row_func(png_structp png_ptr, + png_bytep new_row, + png_uint_32 row_num, + int pass) { + FXPNG_Context* p = (FXPNG_Context*)png_get_progressive_ptr(png_ptr); + if (!p) + return; + + CCodec_PngModule* pModule = (CCodec_PngModule*)p->parent_ptr; + uint8_t* src_buf = nullptr; + if (!pModule->GetDelegate()->PngAskScanlineBuf(row_num, src_buf)) { + png_error(png_ptr, "Ask Scanline buffer Callback Error"); + } + if (src_buf) { + png_progressive_combine_row(png_ptr, src_buf, new_row); + } + pModule->GetDelegate()->PngFillScanlineBufCompleted(pass, row_num); +} + +CCodec_PngModule::CCodec_PngModule() { + memset(m_szLastError, 0, sizeof(m_szLastError)); +} + +CCodec_PngModule::~CCodec_PngModule() {} + +FXPNG_Context* CCodec_PngModule::Start() { + FXPNG_Context* p = FX_Alloc(FXPNG_Context, 1); + if (!p) + return nullptr; + + p->m_AllocFunc = _png_alloc_func; + p->m_FreeFunc = _png_free_func; + p->png_ptr = nullptr; + p->info_ptr = nullptr; + p->parent_ptr = (void*)this; + p->png_ptr = + png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); + if (!p->png_ptr) { + FX_Free(p); + return nullptr; + } + p->info_ptr = png_create_info_struct(p->png_ptr); + if (!p->info_ptr) { + png_destroy_read_struct(&(p->png_ptr), nullptr, nullptr); + FX_Free(p); + return nullptr; + } + if (setjmp(png_jmpbuf(p->png_ptr))) { + if (p) { + png_destroy_read_struct(&(p->png_ptr), &(p->info_ptr), nullptr); + FX_Free(p); + } + return nullptr; + } + png_set_progressive_read_fn(p->png_ptr, p, _png_get_header_func, + _png_get_row_func, _png_get_end_func); + png_set_error_fn(p->png_ptr, m_szLastError, (png_error_ptr)_png_error_data, + (png_error_ptr)_png_warning_data); + return p; +} + +void CCodec_PngModule::Finish(FXPNG_Context* ctx) { + if (ctx) { + png_destroy_read_struct(&(ctx->png_ptr), &(ctx->info_ptr), nullptr); + ctx->m_FreeFunc(ctx); + } +} + +bool CCodec_PngModule::Input(FXPNG_Context* ctx, + const uint8_t* src_buf, + uint32_t src_size, + CFX_DIBAttribute* pAttribute) { + if (setjmp(png_jmpbuf(ctx->png_ptr))) { + if (pAttribute && + 0 == FXSYS_strcmp(m_szLastError, "Read Header Callback Error")) { + _png_load_bmp_attribute(ctx->png_ptr, ctx->info_ptr, pAttribute); + } + return false; + } + png_process_data(ctx->png_ptr, ctx->info_ptr, (uint8_t*)src_buf, src_size); + return true; +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_pngmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_pngmodule.h new file mode 100644 index 000000000000..1f3a3d96cc99 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_pngmodule.h @@ -0,0 +1,31 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CCODEC_PNGMODULE_H_ +#define CORE_FXCODEC_CODEC_CCODEC_PNGMODULE_H_ + +#include "core/fxcodec/codec/icodec_pngmodule.h" +#include "core/fxcrt/fx_system.h" + +#define PNG_ERROR_SIZE 256 + +class CCodec_PngModule : public ICodec_PngModule { + public: + CCodec_PngModule(); + ~CCodec_PngModule() override; + + FXPNG_Context* Start() override; + void Finish(FXPNG_Context* pContext) override; + bool Input(FXPNG_Context* pContext, + const uint8_t* src_buf, + uint32_t src_size, + CFX_DIBAttribute* pAttribute) override; + + protected: + FX_CHAR m_szLastError[PNG_ERROR_SIZE]; +}; + +#endif // CORE_FXCODEC_CODEC_CCODEC_PNGMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_progressivedecoder.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_progressivedecoder.h new file mode 100644 index 000000000000..61703dde29f1 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_progressivedecoder.h @@ -0,0 +1,229 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CCODEC_PROGRESSIVEDECODER_H_ +#define CORE_FXCODEC_CODEC_CCODEC_PROGRESSIVEDECODER_H_ + +#include + +#include "core/fxcodec/codec/icodec_bmpmodule.h" +#include "core/fxcodec/codec/icodec_gifmodule.h" +#include "core/fxcodec/codec/icodec_pngmodule.h" +#include "core/fxcodec/codec/icodec_tiffmodule.h" +#include "core/fxcodec/fx_codec_def.h" +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxge/fx_dib.h" + +class CCodec_JpegModule; +class CCodec_ModuleMgr; +class CFX_DIBAttribute; +class IFX_SeekableReadStream; +class IFX_Pause; +struct FXJPEG_Context; + +class CCodec_ProgressiveDecoder : public ICodec_BmpModule::Delegate, + public ICodec_GifModule::Delegate, + public ICodec_PngModule::Delegate { + public: + enum FXCodec_Format { + FXCodec_Invalid = 0, + FXCodec_1bppGray = 0x101, + FXCodec_1bppRgb = 0x001, + FXCodec_8bppGray = 0x108, + FXCodec_8bppRgb = 0x008, + FXCodec_Rgb = 0x018, + FXCodec_Rgb32 = 0x020, + FXCodec_Argb = 0x220, + FXCodec_Cmyk = 0x120 + }; + + explicit CCodec_ProgressiveDecoder(CCodec_ModuleMgr* pCodecMgr); + virtual ~CCodec_ProgressiveDecoder(); + + FXCODEC_STATUS LoadImageInfo( + const CFX_RetainPtr& pFile, + FXCODEC_IMAGE_TYPE imageType, + CFX_DIBAttribute* pAttribute, + bool bSkipImageTypeCheck); + + FXCODEC_IMAGE_TYPE GetType() const { return m_imagType; } + int32_t GetWidth() const { return m_SrcWidth; } + int32_t GetHeight() const { return m_SrcHeight; } + int32_t GetNumComponents() const { return m_SrcComponents; } + int32_t GetBPC() const { return m_SrcBPC; } + void SetClipBox(FX_RECT* clip); + + FXCODEC_STATUS GetFrames(int32_t& frames, IFX_Pause* pPause = nullptr); + FXCODEC_STATUS StartDecode(CFX_DIBitmap* pDIBitmap, + int start_x, + int start_y, + int size_x, + int size_y, + int32_t frames = 0, + bool bInterpol = true); + + FXCODEC_STATUS ContinueDecode(IFX_Pause* pPause = nullptr); + + struct PixelWeight { + int m_SrcStart; + int m_SrcEnd; + int m_Weights[1]; + }; + + class CFXCODEC_WeightTable { + public: + CFXCODEC_WeightTable(); + ~CFXCODEC_WeightTable(); + + void Calc(int dest_len, + int dest_min, + int dest_max, + int src_len, + int src_min, + int src_max, + bool bInterpol); + PixelWeight* GetPixelWeight(int pixel) { + return reinterpret_cast(m_pWeightTables.data() + + (pixel - m_DestMin) * m_ItemSize); + } + + int m_DestMin; + int m_ItemSize; + std::vector m_pWeightTables; + }; + + class CFXCODEC_HorzTable { + public: + CFXCODEC_HorzTable(); + ~CFXCODEC_HorzTable(); + + void Calc(int dest_len, int src_len, bool bInterpol); + PixelWeight* GetPixelWeight(int pixel) { + return reinterpret_cast(m_pWeightTables.data() + + pixel * m_ItemSize); + } + + int m_ItemSize; + std::vector m_pWeightTables; + }; + + class CFXCODEC_VertTable { + public: + CFXCODEC_VertTable(); + ~CFXCODEC_VertTable(); + + void Calc(int dest_len, int src_len); + PixelWeight* GetPixelWeight(int pixel) { + return reinterpret_cast(m_pWeightTables.data() + + pixel * m_ItemSize); + } + int m_ItemSize; + std::vector m_pWeightTables; + }; + + CFX_RetainPtr m_pFile; + CCodec_ModuleMgr* m_pCodecMgr; + FXJPEG_Context* m_pJpegContext; + FXPNG_Context* m_pPngContext; + FXGIF_Context* m_pGifContext; + FXBMP_Context* m_pBmpContext; + CCodec_TiffContext* m_pTiffContext; + FXCODEC_IMAGE_TYPE m_imagType; + uint32_t m_offSet; + uint8_t* m_pSrcBuf; + uint32_t m_SrcSize; + uint8_t* m_pDecodeBuf; + int m_ScanlineSize; + CFX_DIBitmap* m_pDeviceBitmap; + bool m_bInterpol; + CFXCODEC_WeightTable m_WeightHorz; + CFXCODEC_VertTable m_WeightVert; + CFXCODEC_HorzTable m_WeightHorzOO; + int m_SrcWidth; + int m_SrcHeight; + int m_SrcComponents; + int m_SrcBPC; + FX_RECT m_clipBox; + int m_startX; + int m_startY; + int m_sizeX; + int m_sizeY; + int m_TransMethod; + FX_ARGB* m_pSrcPalette; + int m_SrcPaletteNumber; + int m_SrcRow; + FXCodec_Format m_SrcFormat; + int m_SrcPassNumber; + int m_FrameNumber; + int m_FrameCur; + int m_GifBgIndex; + uint8_t* m_pGifPalette; + int32_t m_GifPltNumber; + int m_GifTransIndex; + FX_RECT m_GifFrameRect; + bool m_BmpIsTopBottom; + FXCODEC_STATUS m_status; + + // ICodec_PngModule::Delegate + bool PngReadHeader(int width, + int height, + int bpc, + int pass, + int* color_type, + double* gamma) override; + bool PngAskScanlineBuf(int line, uint8_t*& src_buf) override; + void PngFillScanlineBufCompleted(int pass, int line) override; + + // ICodec_GifModule::Delegate + void GifRecordCurrentPosition(uint32_t& cur_pos) override; + uint8_t* GifAskLocalPaletteBuf(int32_t frame_num, int32_t pal_size) override; + bool GifInputRecordPositionBuf(uint32_t rcd_pos, + const FX_RECT& img_rc, + int32_t pal_num, + void* pal_ptr, + int32_t delay_time, + bool user_input, + int32_t trans_index, + int32_t disposal_method, + bool interlace) override; + void GifReadScanline(int32_t row_num, uint8_t* row_buf) override; + + // ICodec_BmpModule::Delegate + bool BmpInputImagePositionBuf(uint32_t rcd_pos) override; + void BmpReadScanline(int32_t row_num, uint8_t* row_buf) override; + + protected: + bool BmpReadMoreData(ICodec_BmpModule* pBmpModule, + FXCODEC_STATUS& err_status); + bool GifReadMoreData(ICodec_GifModule* pGifModule, + FXCODEC_STATUS& err_status); + void GifDoubleLineResampleVert(CFX_DIBitmap* pDeviceBitmap, + double scale_y, + int des_row); + void PngOneOneMapResampleHorz(CFX_DIBitmap* pDeviceBitmap, + int32_t des_line, + uint8_t* src_scan, + FXCodec_Format src_format); + bool DetectImageType(FXCODEC_IMAGE_TYPE imageType, + CFX_DIBAttribute* pAttribute); + void GetDownScale(int& down_scale); + void GetTransMethod(FXDIB_Format des_format, FXCodec_Format src_format); + void ReSampleScanline(CFX_DIBitmap* pDeviceBitmap, + int32_t des_line, + uint8_t* src_scan, + FXCodec_Format src_format); + void Resample(CFX_DIBitmap* pDeviceBitmap, + int32_t src_line, + uint8_t* src_scan, + FXCodec_Format src_format); + void ResampleVert(CFX_DIBitmap* pDeviceBitmap, double scale_y, int des_row); + bool JpegReadMoreData(CCodec_JpegModule* pJpegModule, + FXCODEC_STATUS& err_status); + void ResampleVertBT(CFX_DIBitmap* pDeviceBitmap, double scale_y, int des_row); +}; + +#endif // CORE_FXCODEC_CODEC_CCODEC_PROGRESSIVEDECODER_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_scanlinedecoder.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_scanlinedecoder.h new file mode 100644 index 000000000000..06bb6d5abe7e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_scanlinedecoder.h @@ -0,0 +1,53 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CCODEC_SCANLINEDECODER_H_ +#define CORE_FXCODEC_CODEC_CCODEC_SCANLINEDECODER_H_ + +#include "core/fxcrt/fx_system.h" + +class IFX_Pause; + +class CCodec_ScanlineDecoder { + public: + CCodec_ScanlineDecoder(); + CCodec_ScanlineDecoder(int nOrigWidth, + int nOrigHeight, + int nOutputWidth, + int nOutputHeight, + int nComps, + int nBpc, + uint32_t nPitch); + virtual ~CCodec_ScanlineDecoder(); + + const uint8_t* GetScanline(int line); + bool SkipToScanline(int line, IFX_Pause* pPause); + + int GetWidth() { return m_OutputWidth; } + int GetHeight() { return m_OutputHeight; } + int CountComps() { return m_nComps; } + int GetBPC() { return m_bpc; } + + virtual uint32_t GetSrcOffset() = 0; + + protected: + virtual bool v_Rewind() = 0; + virtual uint8_t* v_GetNextLine() = 0; + + uint8_t* ReadNextLine(); + + int m_OrigWidth; + int m_OrigHeight; + int m_OutputWidth; + int m_OutputHeight; + int m_nComps; + int m_bpc; + uint32_t m_Pitch; + int m_NextLine; + uint8_t* m_pLastScanline; +}; + +#endif // CORE_FXCODEC_CODEC_CCODEC_SCANLINEDECODER_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_tiffmodule.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_tiffmodule.cpp new file mode 100644 index 000000000000..736772892add --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_tiffmodule.cpp @@ -0,0 +1,504 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/codec/ccodec_tiffmodule.h" + +#include + +#include "core/fxcodec/codec/codec_int.h" +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_safe_types.h" +#include "core/fxge/fx_dib.h" +#include "third_party/base/ptr_util.h" + +extern "C" { +#include "third_party/libtiff/tiffiop.h" +} + +class CCodec_TiffContext { + public: + CCodec_TiffContext(); + ~CCodec_TiffContext(); + + bool InitDecoder(const CFX_RetainPtr& file_ptr); + bool LoadFrameInfo(int32_t frame, + int32_t* width, + int32_t* height, + int32_t* comps, + int32_t* bpc, + CFX_DIBAttribute* pAttribute); + bool Decode(CFX_DIBitmap* pDIBitmap); + + CFX_RetainPtr io_in() const { return m_io_in; } + uint32_t offset() const { return m_offset; } + void set_offset(uint32_t offset) { m_offset = offset; } + + private: + bool IsSupport(const CFX_DIBitmap* pDIBitmap) const; + void SetPalette(CFX_DIBitmap* pDIBitmap, uint16_t bps); + bool Decode1bppRGB(CFX_DIBitmap* pDIBitmap, + int32_t height, + int32_t width, + uint16_t bps, + uint16_t spp); + bool Decode8bppRGB(CFX_DIBitmap* pDIBitmap, + int32_t height, + int32_t width, + uint16_t bps, + uint16_t spp); + bool Decode24bppRGB(CFX_DIBitmap* pDIBitmap, + int32_t height, + int32_t width, + uint16_t bps, + uint16_t spp); + + CFX_RetainPtr m_io_in; + uint32_t m_offset; + TIFF* m_tif_ctx; +}; + +void* _TIFFmalloc(tmsize_t size) { + return FXMEM_DefaultAlloc(size, 0); +} + +void _TIFFfree(void* ptr) { + FXMEM_DefaultFree(ptr, 0); +} + +void* _TIFFrealloc(void* ptr, tmsize_t size) { + return FXMEM_DefaultRealloc(ptr, size, 0); +} + +void _TIFFmemset(void* ptr, int val, tmsize_t size) { + FXSYS_memset(ptr, val, (size_t)size); +} + +void _TIFFmemcpy(void* des, const void* src, tmsize_t size) { + FXSYS_memcpy(des, src, (size_t)size); +} + +int _TIFFmemcmp(const void* ptr1, const void* ptr2, tmsize_t size) { + return FXSYS_memcmp(ptr1, ptr2, (size_t)size); +} + +int _TIFFIfMultiplicationOverflow(tmsize_t op1, tmsize_t op2) { + return op1 > std::numeric_limits::max() / op2; +} + +TIFFErrorHandler _TIFFwarningHandler = nullptr; +TIFFErrorHandler _TIFFerrorHandler = nullptr; + +namespace { + +tsize_t tiff_read(thandle_t context, tdata_t buf, tsize_t length) { + CCodec_TiffContext* pTiffContext = + reinterpret_cast(context); + FX_SAFE_UINT32 increment = pTiffContext->offset(); + increment += length; + if (!increment.IsValid()) + return 0; + + FX_FILESIZE offset = pTiffContext->offset(); + if (!pTiffContext->io_in()->ReadBlock(buf, offset, length)) + return 0; + + pTiffContext->set_offset(increment.ValueOrDie()); + if (offset + length > pTiffContext->io_in()->GetSize()) + return pTiffContext->io_in()->GetSize() - offset; + + return length; +} + +tsize_t tiff_write(thandle_t context, tdata_t buf, tsize_t length) { + ASSERT(false); + return 0; +} + +toff_t tiff_seek(thandle_t context, toff_t offset, int whence) { + CCodec_TiffContext* pTiffContext = + reinterpret_cast(context); + FX_SAFE_FILESIZE safe_offset = offset; + if (!safe_offset.IsValid()) + return static_cast(-1); + FX_FILESIZE file_offset = safe_offset.ValueOrDie(); + + switch (whence) { + case 0: { + if (file_offset > pTiffContext->io_in()->GetSize()) + return static_cast(-1); + pTiffContext->set_offset(file_offset); + return pTiffContext->offset(); + } + case 1: { + FX_SAFE_UINT32 new_increment = pTiffContext->offset(); + new_increment += file_offset; + if (!new_increment.IsValid()) + return static_cast(-1); + pTiffContext->set_offset(new_increment.ValueOrDie()); + return pTiffContext->offset(); + } + case 2: { + if (pTiffContext->io_in()->GetSize() < file_offset) + return static_cast(-1); + pTiffContext->set_offset(pTiffContext->io_in()->GetSize() - file_offset); + return pTiffContext->offset(); + } + default: + return static_cast(-1); + } +} + +int tiff_close(thandle_t context) { + return 0; +} + +toff_t tiff_get_size(thandle_t context) { + CCodec_TiffContext* pTiffContext = + reinterpret_cast(context); + return static_cast(pTiffContext->io_in()->GetSize()); +} + +int tiff_map(thandle_t context, tdata_t*, toff_t*) { + return 0; +} + +void tiff_unmap(thandle_t context, tdata_t, toff_t) {} + +TIFF* tiff_open(void* context, const char* mode) { + TIFF* tif = TIFFClientOpen("Tiff Image", mode, (thandle_t)context, tiff_read, + tiff_write, tiff_seek, tiff_close, tiff_get_size, + tiff_map, tiff_unmap); + if (tif) { + tif->tif_fd = (int)(intptr_t)context; + } + return tif; +} + +template +bool Tiff_Exif_GetInfo(TIFF* tif_ctx, ttag_t tag, CFX_DIBAttribute* pAttr) { + T val = 0; + TIFFGetField(tif_ctx, tag, &val); + if (!val) + return false; + T* ptr = FX_Alloc(T, 1); + *ptr = val; + pAttr->m_Exif[tag] = (void*)ptr; + return true; +} + +void Tiff_Exif_GetStringInfo(TIFF* tif_ctx, + ttag_t tag, + CFX_DIBAttribute* pAttr) { + FX_CHAR* buf = nullptr; + TIFFGetField(tif_ctx, tag, &buf); + if (!buf) + return; + FX_STRSIZE size = FXSYS_strlen(buf); + uint8_t* ptr = FX_Alloc(uint8_t, size + 1); + FXSYS_memcpy(ptr, buf, size); + ptr[size] = 0; + pAttr->m_Exif[tag] = ptr; +} + +void TiffBGRA2RGBA(uint8_t* pBuf, int32_t pixel, int32_t spp) { + for (int32_t n = 0; n < pixel; n++) { + uint8_t tmp = pBuf[0]; + pBuf[0] = pBuf[2]; + pBuf[2] = tmp; + pBuf += spp; + } +} + +} // namespace + +CCodec_TiffContext::CCodec_TiffContext() + : m_io_in(nullptr), m_offset(0), m_tif_ctx(nullptr) {} + +CCodec_TiffContext::~CCodec_TiffContext() { + if (m_tif_ctx) + TIFFClose(m_tif_ctx); +} + +bool CCodec_TiffContext::InitDecoder( + const CFX_RetainPtr& file_ptr) { + m_io_in = file_ptr; + m_tif_ctx = tiff_open(this, "r"); + return !!m_tif_ctx; +} + +bool CCodec_TiffContext::LoadFrameInfo(int32_t frame, + int32_t* width, + int32_t* height, + int32_t* comps, + int32_t* bpc, + CFX_DIBAttribute* pAttribute) { + if (!TIFFSetDirectory(m_tif_ctx, (uint16)frame)) + return false; + + uint32_t tif_width = 0; + uint32_t tif_height = 0; + uint16_t tif_comps = 0; + uint16_t tif_bpc = 0; + uint32_t tif_rps = 0; + TIFFGetField(m_tif_ctx, TIFFTAG_IMAGEWIDTH, &tif_width); + TIFFGetField(m_tif_ctx, TIFFTAG_IMAGELENGTH, &tif_height); + TIFFGetField(m_tif_ctx, TIFFTAG_SAMPLESPERPIXEL, &tif_comps); + TIFFGetField(m_tif_ctx, TIFFTAG_BITSPERSAMPLE, &tif_bpc); + TIFFGetField(m_tif_ctx, TIFFTAG_ROWSPERSTRIP, &tif_rps); + + if (pAttribute) { + pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_INCH; + if (TIFFGetField(m_tif_ctx, TIFFTAG_RESOLUTIONUNIT, + &pAttribute->m_wDPIUnit)) { + pAttribute->m_wDPIUnit--; + } + Tiff_Exif_GetInfo(m_tif_ctx, TIFFTAG_ORIENTATION, pAttribute); + if (Tiff_Exif_GetInfo(m_tif_ctx, TIFFTAG_XRESOLUTION, + pAttribute)) { + void* val = pAttribute->m_Exif[TIFFTAG_XRESOLUTION]; + FX_FLOAT fDpi = val ? *reinterpret_cast(val) : 0; + pAttribute->m_nXDPI = (int32_t)(fDpi + 0.5f); + } + if (Tiff_Exif_GetInfo(m_tif_ctx, TIFFTAG_YRESOLUTION, + pAttribute)) { + void* val = pAttribute->m_Exif[TIFFTAG_YRESOLUTION]; + FX_FLOAT fDpi = val ? *reinterpret_cast(val) : 0; + pAttribute->m_nYDPI = (int32_t)(fDpi + 0.5f); + } + Tiff_Exif_GetStringInfo(m_tif_ctx, TIFFTAG_IMAGEDESCRIPTION, pAttribute); + Tiff_Exif_GetStringInfo(m_tif_ctx, TIFFTAG_MAKE, pAttribute); + Tiff_Exif_GetStringInfo(m_tif_ctx, TIFFTAG_MODEL, pAttribute); + } + pdfium::base::CheckedNumeric checked_width = tif_width; + pdfium::base::CheckedNumeric checked_height = tif_height; + if (!checked_width.IsValid() || !checked_height.IsValid()) + return false; + + *width = checked_width.ValueOrDie(); + *height = checked_height.ValueOrDie(); + *comps = tif_comps; + *bpc = tif_bpc; + if (tif_rps > tif_height) { + tif_rps = tif_height; + TIFFSetField(m_tif_ctx, TIFFTAG_ROWSPERSTRIP, tif_rps); + } + return true; +} + +bool CCodec_TiffContext::IsSupport(const CFX_DIBitmap* pDIBitmap) const { + if (TIFFIsTiled(m_tif_ctx)) + return false; + + uint16_t photometric = 0; + if (!TIFFGetField(m_tif_ctx, TIFFTAG_PHOTOMETRIC, &photometric)) + return false; + + switch (pDIBitmap->GetBPP()) { + case 1: + case 8: + if (photometric != PHOTOMETRIC_PALETTE) { + return false; + } + break; + case 24: + if (photometric != PHOTOMETRIC_RGB) { + return false; + } + break; + default: + return false; + } + uint16_t planarconfig = 0; + if (!TIFFGetFieldDefaulted(m_tif_ctx, TIFFTAG_PLANARCONFIG, &planarconfig)) + return false; + + return planarconfig != PLANARCONFIG_SEPARATE; +} + +void CCodec_TiffContext::SetPalette(CFX_DIBitmap* pDIBitmap, uint16_t bps) { + uint16_t* red_orig = nullptr; + uint16_t* green_orig = nullptr; + uint16_t* blue_orig = nullptr; + TIFFGetField(m_tif_ctx, TIFFTAG_COLORMAP, &red_orig, &green_orig, &blue_orig); + for (int32_t i = (1L << bps) - 1; i >= 0; i--) { +#define CVT(x) ((uint16_t)((x) >> 8)) + red_orig[i] = CVT(red_orig[i]); + green_orig[i] = CVT(green_orig[i]); + blue_orig[i] = CVT(blue_orig[i]); +#undef CVT + } + int32_t len = 1 << bps; + for (int32_t index = 0; index < len; index++) { + uint32_t r = red_orig[index] & 0xFF; + uint32_t g = green_orig[index] & 0xFF; + uint32_t b = blue_orig[index] & 0xFF; + uint32_t color = (uint32_t)b | ((uint32_t)g << 8) | ((uint32_t)r << 16) | + (((uint32)0xffL) << 24); + pDIBitmap->SetPaletteEntry(index, color); + } +} + +bool CCodec_TiffContext::Decode1bppRGB(CFX_DIBitmap* pDIBitmap, + int32_t height, + int32_t width, + uint16_t bps, + uint16_t spp) { + if (pDIBitmap->GetBPP() != 1 || spp != 1 || bps != 1 || + !IsSupport(pDIBitmap)) { + return false; + } + SetPalette(pDIBitmap, bps); + int32_t size = (int32_t)TIFFScanlineSize(m_tif_ctx); + uint8_t* buf = (uint8_t*)_TIFFmalloc(size); + if (!buf) { + TIFFError(TIFFFileName(m_tif_ctx), "No space for scanline buffer"); + return false; + } + uint8_t* bitMapbuffer = (uint8_t*)pDIBitmap->GetBuffer(); + uint32_t pitch = pDIBitmap->GetPitch(); + for (int32_t row = 0; row < height; row++) { + TIFFReadScanline(m_tif_ctx, buf, row, 0); + for (int32_t j = 0; j < size; j++) { + bitMapbuffer[row * pitch + j] = buf[j]; + } + } + _TIFFfree(buf); + return true; +} + +bool CCodec_TiffContext::Decode8bppRGB(CFX_DIBitmap* pDIBitmap, + int32_t height, + int32_t width, + uint16_t bps, + uint16_t spp) { + if (pDIBitmap->GetBPP() != 8 || spp != 1 || (bps != 4 && bps != 8) || + !IsSupport(pDIBitmap)) { + return false; + } + SetPalette(pDIBitmap, bps); + int32_t size = (int32_t)TIFFScanlineSize(m_tif_ctx); + uint8_t* buf = (uint8_t*)_TIFFmalloc(size); + if (!buf) { + TIFFError(TIFFFileName(m_tif_ctx), "No space for scanline buffer"); + return false; + } + uint8_t* bitMapbuffer = (uint8_t*)pDIBitmap->GetBuffer(); + uint32_t pitch = pDIBitmap->GetPitch(); + for (int32_t row = 0; row < height; row++) { + TIFFReadScanline(m_tif_ctx, buf, row, 0); + for (int32_t j = 0; j < size; j++) { + switch (bps) { + case 4: + bitMapbuffer[row * pitch + 2 * j + 0] = (buf[j] & 0xF0) >> 4; + bitMapbuffer[row * pitch + 2 * j + 1] = (buf[j] & 0x0F) >> 0; + break; + case 8: + bitMapbuffer[row * pitch + j] = buf[j]; + break; + } + } + } + _TIFFfree(buf); + return true; +} + +bool CCodec_TiffContext::Decode24bppRGB(CFX_DIBitmap* pDIBitmap, + int32_t height, + int32_t width, + uint16_t bps, + uint16_t spp) { + if (pDIBitmap->GetBPP() != 24 || !IsSupport(pDIBitmap)) + return false; + + int32_t size = (int32_t)TIFFScanlineSize(m_tif_ctx); + uint8_t* buf = (uint8_t*)_TIFFmalloc(size); + if (!buf) { + TIFFError(TIFFFileName(m_tif_ctx), "No space for scanline buffer"); + return false; + } + uint8_t* bitMapbuffer = (uint8_t*)pDIBitmap->GetBuffer(); + uint32_t pitch = pDIBitmap->GetPitch(); + for (int32_t row = 0; row < height; row++) { + TIFFReadScanline(m_tif_ctx, buf, row, 0); + for (int32_t j = 0; j < size - 2; j += 3) { + bitMapbuffer[row * pitch + j + 0] = buf[j + 2]; + bitMapbuffer[row * pitch + j + 1] = buf[j + 1]; + bitMapbuffer[row * pitch + j + 2] = buf[j + 0]; + } + } + _TIFFfree(buf); + return true; +} + +bool CCodec_TiffContext::Decode(CFX_DIBitmap* pDIBitmap) { + uint32_t img_wid = pDIBitmap->GetWidth(); + uint32_t img_hei = pDIBitmap->GetHeight(); + uint32_t width = 0; + uint32_t height = 0; + TIFFGetField(m_tif_ctx, TIFFTAG_IMAGEWIDTH, &width); + TIFFGetField(m_tif_ctx, TIFFTAG_IMAGELENGTH, &height); + if (img_wid != width || img_hei != height) + return false; + + if (pDIBitmap->GetBPP() == 32) { + uint16_t rotation = ORIENTATION_TOPLEFT; + TIFFGetField(m_tif_ctx, TIFFTAG_ORIENTATION, &rotation); + if (TIFFReadRGBAImageOriented(m_tif_ctx, img_wid, img_hei, + (uint32*)pDIBitmap->GetBuffer(), rotation, + 1)) { + for (uint32_t row = 0; row < img_hei; row++) { + uint8_t* row_buf = (uint8_t*)pDIBitmap->GetScanline(row); + TiffBGRA2RGBA(row_buf, img_wid, 4); + } + return true; + } + } + uint16_t spp = 0; + uint16_t bps = 0; + TIFFGetField(m_tif_ctx, TIFFTAG_SAMPLESPERPIXEL, &spp); + TIFFGetField(m_tif_ctx, TIFFTAG_BITSPERSAMPLE, &bps); + FX_SAFE_UINT32 safe_bpp = bps; + safe_bpp *= spp; + if (!safe_bpp.IsValid()) + return false; + uint32_t bpp = safe_bpp.ValueOrDie(); + if (bpp == 1) + return Decode1bppRGB(pDIBitmap, height, width, bps, spp); + if (bpp <= 8) + return Decode8bppRGB(pDIBitmap, height, width, bps, spp); + if (bpp <= 24) + return Decode24bppRGB(pDIBitmap, height, width, bps, spp); + return false; +} + +CCodec_TiffContext* CCodec_TiffModule::CreateDecoder( + const CFX_RetainPtr& file_ptr) { + auto pDecoder = pdfium::MakeUnique(); + if (!pDecoder->InitDecoder(file_ptr)) + return nullptr; + + return pDecoder.release(); +} + +bool CCodec_TiffModule::LoadFrameInfo(CCodec_TiffContext* ctx, + int32_t frame, + int32_t* width, + int32_t* height, + int32_t* comps, + int32_t* bpc, + CFX_DIBAttribute* pAttribute) { + return ctx->LoadFrameInfo(frame, width, height, comps, bpc, pAttribute); +} + +bool CCodec_TiffModule::Decode(CCodec_TiffContext* ctx, + class CFX_DIBitmap* pDIBitmap) { + return ctx->Decode(pDIBitmap); +} + +void CCodec_TiffModule::DestroyDecoder(CCodec_TiffContext* ctx) { + delete ctx; +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_tiffmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_tiffmodule.h new file mode 100644 index 000000000000..a8820f4aacc7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/ccodec_tiffmodule.h @@ -0,0 +1,31 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CCODEC_TIFFMODULE_H_ +#define CORE_FXCODEC_CODEC_CCODEC_TIFFMODULE_H_ + +#include "core/fxcodec/codec/icodec_tiffmodule.h" +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_system.h" + +class CCodec_TiffModule : public ICodec_TiffModule { + public: + ~CCodec_TiffModule() override {} + + CCodec_TiffContext* CreateDecoder( + const CFX_RetainPtr& file_ptr) override; + bool LoadFrameInfo(CCodec_TiffContext* ctx, + int32_t frame, + int32_t* width, + int32_t* height, + int32_t* comps, + int32_t* bpc, + CFX_DIBAttribute* pAttribute) override; + bool Decode(CCodec_TiffContext* ctx, class CFX_DIBitmap* pDIBitmap) override; + void DestroyDecoder(CCodec_TiffContext* ctx) override; +}; + +#endif // CORE_FXCODEC_CODEC_CCODEC_TIFFMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/codec_int.h b/modules/pdfium/pdfium/core/fxcodec/codec/codec_int.h new file mode 100644 index 000000000000..edd5a67a25f4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/codec_int.h @@ -0,0 +1,44 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_CODEC_INT_H_ +#define CORE_FXCODEC_CODEC_CODEC_INT_H_ + +#include + +#include +#include +#include +#include + +#include "core/fxcodec/fx_codec.h" +#include "core/fxcodec/jbig2/JBig2_Context.h" +#include "third_party/libopenjpeg20/openjpeg.h" + +class CPDF_ColorSpace; + +struct DecodeData { + public: + DecodeData(uint8_t* data, OPJ_SIZE_T size) + : src_data(data), src_size(size), offset(0) {} + uint8_t* src_data; + OPJ_SIZE_T src_size; + OPJ_SIZE_T offset; +}; + +void sycc420_to_rgb(opj_image_t* img); + +/* Wrappers for C-style callbacks. */ +OPJ_SIZE_T opj_read_from_memory(void* p_buffer, + OPJ_SIZE_T nb_bytes, + void* p_user_data); +OPJ_SIZE_T opj_write_from_memory(void* p_buffer, + OPJ_SIZE_T nb_bytes, + void* p_user_data); +OPJ_OFF_T opj_skip_from_memory(OPJ_OFF_T nb_bytes, void* p_user_data); +OPJ_BOOL opj_seek_from_memory(OPJ_OFF_T nb_bytes, void* p_user_data); + +#endif // CORE_FXCODEC_CODEC_CODEC_INT_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec.cpp new file mode 100644 index 000000000000..d296b64a115b --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec.cpp @@ -0,0 +1,463 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/fx_codec.h" + +#include +#include +#include +#include + +#include "core/fxcrt/fx_ext.h" +#include "core/fxcrt/fx_safe_types.h" +#include "third_party/base/logging.h" +#include "third_party/base/ptr_util.h" + +CCodec_ModuleMgr::CCodec_ModuleMgr() + : m_pBasicModule(new CCodec_BasicModule), + m_pFaxModule(new CCodec_FaxModule), + m_pJpegModule(new CCodec_JpegModule), + m_pJpxModule(new CCodec_JpxModule), + m_pJbig2Module(new CCodec_Jbig2Module), + m_pIccModule(new CCodec_IccModule), + m_pFlateModule(new CCodec_FlateModule) { +} + +CCodec_ModuleMgr::~CCodec_ModuleMgr() {} + +CCodec_ScanlineDecoder::CCodec_ScanlineDecoder() + : CCodec_ScanlineDecoder(0, 0, 0, 0, 0, 0, 0) {} + +CCodec_ScanlineDecoder::CCodec_ScanlineDecoder(int nOrigWidth, + int nOrigHeight, + int nOutputWidth, + int nOutputHeight, + int nComps, + int nBpc, + uint32_t nPitch) + : m_OrigWidth(nOrigWidth), + m_OrigHeight(nOrigHeight), + m_OutputWidth(nOutputWidth), + m_OutputHeight(nOutputHeight), + m_nComps(nComps), + m_bpc(nBpc), + m_Pitch(nPitch), + m_NextLine(-1), + m_pLastScanline(nullptr) {} + +CCodec_ScanlineDecoder::~CCodec_ScanlineDecoder() {} + +const uint8_t* CCodec_ScanlineDecoder::GetScanline(int line) { + if (m_NextLine == line + 1) + return m_pLastScanline; + + if (m_NextLine < 0 || m_NextLine > line) { + if (!v_Rewind()) + return nullptr; + m_NextLine = 0; + } + while (m_NextLine < line) { + ReadNextLine(); + m_NextLine++; + } + m_pLastScanline = ReadNextLine(); + m_NextLine++; + return m_pLastScanline; +} + +bool CCodec_ScanlineDecoder::SkipToScanline(int line, IFX_Pause* pPause) { + if (m_NextLine == line || m_NextLine == line + 1) + return false; + + if (m_NextLine < 0 || m_NextLine > line) { + v_Rewind(); + m_NextLine = 0; + } + m_pLastScanline = nullptr; + while (m_NextLine < line) { + m_pLastScanline = ReadNextLine(); + m_NextLine++; + if (pPause && pPause->NeedToPauseNow()) { + return true; + } + } + return false; +} + +uint8_t* CCodec_ScanlineDecoder::ReadNextLine() { + return v_GetNextLine(); +} + +bool CCodec_BasicModule::RunLengthEncode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t** dest_buf, + uint32_t* dest_size) { + // Check inputs + if (!src_buf || !dest_buf || !dest_size || src_size == 0) + return false; + + // Edge case + if (src_size == 1) { + *dest_buf = FX_Alloc(uint8_t, 3); + (*dest_buf)[0] = 0; + (*dest_buf)[1] = src_buf[0]; + (*dest_buf)[2] = 128; + *dest_size = 3; + return true; + } + + // Worst case: 1 nonmatch, 2 match, 1 nonmatch, 2 match, etc. This becomes + // 4 output chars for every 3 input, plus up to 4 more for the 1-2 chars + // rounded off plus the terminating character. + uint32_t est_size = 4 * ((src_size + 2) / 3) + 1; + *dest_buf = FX_Alloc(uint8_t, est_size); + + // Set up pointers. + uint8_t* out = *dest_buf; + uint32_t run_start = 0; + uint32_t run_end = 1; + uint8_t x = src_buf[run_start]; + uint8_t y = src_buf[run_end]; + while (run_end < src_size) { + uint32_t max_len = std::min((uint32_t)128, src_size - run_start); + while (x == y && (run_end - run_start < max_len - 1)) + y = src_buf[++run_end]; + + // Reached end with matched run. Update variables to expected values. + if (x == y) { + run_end++; + if (run_end < src_size) + y = src_buf[run_end]; + } + if (run_end - run_start > 1) { // Matched run but not at end of input. + out[0] = 257 - (run_end - run_start); + out[1] = x; + x = y; + run_start = run_end; + run_end++; + if (run_end < src_size) + y = src_buf[run_end]; + out += 2; + continue; + } + // Mismatched run + while (x != y && run_end <= run_start + max_len) { + out[run_end - run_start] = x; + x = y; + run_end++; + if (run_end == src_size) { + if (run_end <= run_start + max_len) { + out[run_end - run_start] = x; + run_end++; + } + break; + } + y = src_buf[run_end]; + } + out[0] = run_end - run_start - 2; + out += run_end - run_start; + run_start = run_end - 1; + } + if (run_start < src_size) { // 1 leftover character + out[0] = 0; + out[1] = x; + out += 2; + } + *out = 128; + *dest_size = out + 1 - *dest_buf; + return true; +} + +bool CCodec_BasicModule::A85Encode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t** dest_buf, + uint32_t* dest_size) { + // Check inputs. + if (!src_buf || !dest_buf || !dest_size) + return false; + + if (src_size == 0) { + *dest_size = 0; + return false; + } + + // Worst case: 5 output for each 4 input (plus up to 4 from leftover), plus + // 2 character new lines each 75 output chars plus 2 termination chars. May + // have fewer if there are special "z" chars. + uint32_t est_size = 5 * (src_size / 4) + 4 + src_size / 30 + 2; + *dest_buf = FX_Alloc(uint8_t, est_size); + + // Set up pointers. + uint8_t* out = *dest_buf; + uint32_t pos = 0; + uint32_t line_length = 0; + while (src_size >= 4 && pos < src_size - 3) { + uint32_t val = ((uint32_t)(src_buf[pos]) << 24) + + ((uint32_t)(src_buf[pos + 1]) << 16) + + ((uint32_t)(src_buf[pos + 2]) << 8) + + (uint32_t)(src_buf[pos + 3]); + pos += 4; + if (val == 0) { // All zero special case + *out = 'z'; + out++; + line_length++; + } else { // Compute base 85 characters and add 33. + for (int i = 4; i >= 0; i--) { + out[i] = (uint8_t)(val % 85) + 33; + val = val / 85; + } + out += 5; + line_length += 5; + } + if (line_length >= 75) { // Add a return. + *out++ = '\r'; + *out++ = '\n'; + line_length = 0; + } + } + if (pos < src_size) { // Leftover bytes + uint32_t val = 0; + int count = 0; + while (pos < src_size) { + val += (uint32_t)(src_buf[pos]) << (8 * (3 - count)); + count++; + pos++; + } + for (int i = 4; i >= 0; i--) { + if (i <= count) + out[i] = (uint8_t)(val % 85) + 33; + val = val / 85; + } + out += count + 1; + } + + // Terminating characters. + out[0] = '~'; + out[1] = '>'; + out += 2; + *dest_size = out - *dest_buf; + return true; +} + +#ifdef PDF_ENABLE_XFA +CFX_DIBAttribute::CFX_DIBAttribute() + : m_nXDPI(-1), + m_nYDPI(-1), + m_fAspectRatio(-1.0f), + m_wDPIUnit(0), + m_nGifLeft(0), + m_nGifTop(0), + m_pGifLocalPalette(nullptr), + m_nGifLocalPalNum(0), + m_nBmpCompressType(0) { + FXSYS_memset(m_strTime, 0, sizeof(m_strTime)); +} +CFX_DIBAttribute::~CFX_DIBAttribute() { + for (const auto& pair : m_Exif) + FX_Free(pair.second); +} +#endif // PDF_ENABLE_XFA + +class CCodec_RLScanlineDecoder : public CCodec_ScanlineDecoder { + public: + CCodec_RLScanlineDecoder(); + ~CCodec_RLScanlineDecoder() override; + + bool Create(const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + int bpc); + + // CCodec_ScanlineDecoder + bool v_Rewind() override; + uint8_t* v_GetNextLine() override; + uint32_t GetSrcOffset() override { return m_SrcOffset; } + + protected: + bool CheckDestSize(); + void GetNextOperator(); + void UpdateOperator(uint8_t used_bytes); + + uint8_t* m_pScanline; + const uint8_t* m_pSrcBuf; + uint32_t m_SrcSize; + uint32_t m_dwLineBytes; + uint32_t m_SrcOffset; + bool m_bEOD; + uint8_t m_Operator; +}; +CCodec_RLScanlineDecoder::CCodec_RLScanlineDecoder() + : m_pScanline(nullptr), + m_pSrcBuf(nullptr), + m_SrcSize(0), + m_dwLineBytes(0), + m_SrcOffset(0), + m_bEOD(false), + m_Operator(0) {} +CCodec_RLScanlineDecoder::~CCodec_RLScanlineDecoder() { + FX_Free(m_pScanline); +} +bool CCodec_RLScanlineDecoder::CheckDestSize() { + uint32_t i = 0; + uint32_t old_size = 0; + uint32_t dest_size = 0; + while (i < m_SrcSize) { + if (m_pSrcBuf[i] < 128) { + old_size = dest_size; + dest_size += m_pSrcBuf[i] + 1; + if (dest_size < old_size) { + return false; + } + i += m_pSrcBuf[i] + 2; + } else if (m_pSrcBuf[i] > 128) { + old_size = dest_size; + dest_size += 257 - m_pSrcBuf[i]; + if (dest_size < old_size) { + return false; + } + i += 2; + } else { + break; + } + } + if (((uint32_t)m_OrigWidth * m_nComps * m_bpc * m_OrigHeight + 7) / 8 > + dest_size) { + return false; + } + return true; +} +bool CCodec_RLScanlineDecoder::Create(const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + int bpc) { + m_pSrcBuf = src_buf; + m_SrcSize = src_size; + m_OutputWidth = m_OrigWidth = width; + m_OutputHeight = m_OrigHeight = height; + m_nComps = nComps; + m_bpc = bpc; + // Aligning the pitch to 4 bytes requires an integer overflow check. + FX_SAFE_UINT32 pitch = width; + pitch *= nComps; + pitch *= bpc; + pitch += 31; + pitch /= 32; + pitch *= 4; + if (!pitch.IsValid()) { + return false; + } + m_Pitch = pitch.ValueOrDie(); + // Overflow should already have been checked before this is called. + m_dwLineBytes = (static_cast(width) * nComps * bpc + 7) / 8; + m_pScanline = FX_Alloc(uint8_t, m_Pitch); + return CheckDestSize(); +} +bool CCodec_RLScanlineDecoder::v_Rewind() { + FXSYS_memset(m_pScanline, 0, m_Pitch); + m_SrcOffset = 0; + m_bEOD = false; + m_Operator = 0; + return true; +} +uint8_t* CCodec_RLScanlineDecoder::v_GetNextLine() { + if (m_SrcOffset == 0) { + GetNextOperator(); + } else { + if (m_bEOD) { + return nullptr; + } + } + FXSYS_memset(m_pScanline, 0, m_Pitch); + uint32_t col_pos = 0; + bool eol = false; + while (m_SrcOffset < m_SrcSize && !eol) { + if (m_Operator < 128) { + uint32_t copy_len = m_Operator + 1; + if (col_pos + copy_len >= m_dwLineBytes) { + copy_len = m_dwLineBytes - col_pos; + eol = true; + } + if (copy_len >= m_SrcSize - m_SrcOffset) { + copy_len = m_SrcSize - m_SrcOffset; + m_bEOD = true; + } + FXSYS_memcpy(m_pScanline + col_pos, m_pSrcBuf + m_SrcOffset, copy_len); + col_pos += copy_len; + UpdateOperator((uint8_t)copy_len); + } else if (m_Operator > 128) { + int fill = 0; + if (m_SrcOffset - 1 < m_SrcSize - 1) { + fill = m_pSrcBuf[m_SrcOffset]; + } + uint32_t duplicate_len = 257 - m_Operator; + if (col_pos + duplicate_len >= m_dwLineBytes) { + duplicate_len = m_dwLineBytes - col_pos; + eol = true; + } + FXSYS_memset(m_pScanline + col_pos, fill, duplicate_len); + col_pos += duplicate_len; + UpdateOperator((uint8_t)duplicate_len); + } else { + m_bEOD = true; + break; + } + } + return m_pScanline; +} +void CCodec_RLScanlineDecoder::GetNextOperator() { + if (m_SrcOffset >= m_SrcSize) { + m_Operator = 128; + return; + } + m_Operator = m_pSrcBuf[m_SrcOffset]; + m_SrcOffset++; +} +void CCodec_RLScanlineDecoder::UpdateOperator(uint8_t used_bytes) { + if (used_bytes == 0) { + return; + } + if (m_Operator < 128) { + ASSERT((uint32_t)m_Operator + 1 >= used_bytes); + if (used_bytes == m_Operator + 1) { + m_SrcOffset += used_bytes; + GetNextOperator(); + return; + } + m_Operator -= used_bytes; + m_SrcOffset += used_bytes; + if (m_SrcOffset >= m_SrcSize) { + m_Operator = 128; + } + return; + } + uint8_t count = 257 - m_Operator; + ASSERT((uint32_t)count >= used_bytes); + if (used_bytes == count) { + m_SrcOffset++; + GetNextOperator(); + return; + } + count -= used_bytes; + m_Operator = 257 - count; +} + +std::unique_ptr +CCodec_BasicModule::CreateRunLengthDecoder(const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + int bpc) { + auto pDecoder = pdfium::MakeUnique(); + if (!pDecoder->Create(src_buf, src_size, width, height, nComps, bpc)) + return nullptr; + + return std::move(pDecoder); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_a85_unittest.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_a85_unittest.cpp new file mode 100644 index 000000000000..78f9bd8fcca5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_a85_unittest.cpp @@ -0,0 +1,211 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include + +#include + +#include "core/fxcodec/codec/ccodec_basicmodule.h" +#include "core/fxcodec/fx_codec.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(fxcodec, A85TestBadInputs) { + const uint8_t src_buf[] = {1, 2, 3, 4}; + uint8_t* dest_buf = nullptr; + uint32_t src_size = 4; + uint32_t dest_size = 0; + + CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule(); + EXPECT_TRUE(pEncoders); + + // Error codes, not segvs, should callers pass us a nullptr pointer. + EXPECT_FALSE(pEncoders->A85Encode(src_buf, src_size, &dest_buf, nullptr)); + EXPECT_FALSE(pEncoders->A85Encode(src_buf, src_size, nullptr, &dest_size)); + EXPECT_FALSE(pEncoders->A85Encode(src_buf, 0, &dest_buf, &dest_size)); + EXPECT_FALSE(pEncoders->A85Encode(nullptr, src_size, &dest_buf, &dest_size)); +} + +// No leftover bytes, just translate 2 sets of symbols. +TEST(fxcodec, A85TestBasic) { + // Make sure really big values don't break. + const uint8_t src_buf[] = {1, 2, 3, 4, 255, 255, 255, 255}; + uint8_t* dest_buf = nullptr; + uint32_t src_size = 8; + uint32_t dest_size = 0; + + CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule(); + EXPECT_TRUE(pEncoders); + + // Should succeed. + EXPECT_TRUE(pEncoders->A85Encode(src_buf, src_size, &dest_buf, &dest_size)); + + // Should have 5 chars for each set of 4 and 2 terminators. + ASSERT_EQ(12u, dest_size); + const uint8_t expected_out[] = {33, 60, 78, 63, 43, 115, + 56, 87, 45, 33, 126, 62}; + + // Check the output + for (uint32_t i = 0; i < 12; i++) + EXPECT_EQ(expected_out[i], dest_buf[i]) << " at " << i; + FX_Free(dest_buf); +} + +// Leftover bytes. +TEST(fxcodec, A85TestLeftoverBytes) { + // 1 Leftover Byte: + const uint8_t src_buf_1leftover[] = {1, 2, 3, 4, 255}; + uint8_t* dest_buf = nullptr; + uint32_t src_size = 5; + uint32_t dest_size = 0; + + CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule(); + EXPECT_TRUE(pEncoders); + + // Should succeed + EXPECT_TRUE( + pEncoders->A85Encode(src_buf_1leftover, src_size, &dest_buf, &dest_size)); + ASSERT_EQ(9u, dest_size); // 5 chars for first symbol + 2 + 2 terminators. + uint8_t expected_out_1leftover[] = {33, 60, 78, 63, 43, 114, 114, 126, 62}; + + // Check the output + for (uint32_t i = 0; i < 9; i++) + EXPECT_EQ(expected_out_1leftover[i], dest_buf[i]) << " at " << i; + FX_Free(dest_buf); + + // 2 Leftover bytes: + src_size++; + dest_buf = nullptr; + dest_size = 0; + const uint8_t src_buf_2leftover[] = {1, 2, 3, 4, 255, 254}; + // Should succeed + EXPECT_TRUE( + pEncoders->A85Encode(src_buf_2leftover, src_size, &dest_buf, &dest_size)); + ASSERT_EQ(10u, dest_size); // 5 chars for first symbol + 3 + 2 terminators. + const uint8_t expected_out_2leftover[] = {33, 60, 78, 63, 43, + 115, 56, 68, 126, 62}; + + // Check the output + for (uint32_t i = 0; i < 10; i++) + EXPECT_EQ(expected_out_2leftover[i], dest_buf[i]) << " at " << i; + FX_Free(dest_buf); + + // 3 Leftover bytes: + src_size++; + dest_buf = nullptr; + dest_size = 0; + const uint8_t src_buf_3leftover[] = {1, 2, 3, 4, 255, 254, 253}; + // Should succeed + EXPECT_TRUE( + pEncoders->A85Encode(src_buf_3leftover, src_size, &dest_buf, &dest_size)); + ASSERT_EQ(11u, dest_size); // 5 chars for first symbol + 4 + 2 terminators. + const uint8_t expected_out_3leftover[] = {33, 60, 78, 63, 43, 115, + 56, 77, 114, 126, 62}; + + // Check the output + for (uint32_t i = 0; i < 11; i++) + EXPECT_EQ(expected_out_3leftover[i], dest_buf[i]) << " at " << i; + FX_Free(dest_buf); +} + +// Test all zeros comes through as "z". +TEST(fxcodec, A85TestZeros) { + // Make sure really big values don't break. + const uint8_t src_buf[] = {1, 2, 3, 4, 0, 0, 0, 0}; + uint8_t* dest_buf = nullptr; + uint32_t src_size = 8; + uint32_t dest_size = 0; + + CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule(); + EXPECT_TRUE(pEncoders); + + // Should succeed. + EXPECT_TRUE(pEncoders->A85Encode(src_buf, src_size, &dest_buf, &dest_size)); + + // Should have 5 chars for first set of 4 + 1 for z + 2 terminators. + ASSERT_EQ(8u, dest_size); + const uint8_t expected_out[] = {33, 60, 78, 63, 43, 122, 126, 62}; + + // Check the output + for (uint32_t i = 0; i < 8; i++) + EXPECT_EQ(expected_out[i], dest_buf[i]) << " at " << i; + FX_Free(dest_buf); + + // Should also work if it is at the start: + dest_buf = nullptr; + dest_size = 0; + const uint8_t src_buf_2[] = {0, 0, 0, 0, 1, 2, 3, 4}; + + // Should succeed. + EXPECT_TRUE(pEncoders->A85Encode(src_buf_2, src_size, &dest_buf, &dest_size)); + + // Should have 5 chars for set of 4 + 1 for z + 2 terminators. + ASSERT_EQ(8u, dest_size); + const uint8_t expected_out_2[] = {122, 33, 60, 78, 63, 43, 126, 62}; + + // Check the output + for (uint32_t i = 0; i < 8; i++) + EXPECT_EQ(expected_out_2[i], dest_buf[i]) << " at " << i; + FX_Free(dest_buf); + + // Try with 2 leftover zero bytes. Make sure we don't get a "z". + src_size = 6; // Cut off the last 2 zeros. + dest_buf = nullptr; + dest_size = 0; + + // Should succeed. + EXPECT_TRUE(pEncoders->A85Encode(src_buf, src_size, &dest_buf, &dest_size)); + + // Should have 5 chars for set of 4 + 3 for last 2 + 2 terminators. + ASSERT_EQ(10u, dest_size); + const uint8_t expected_out_leftover[] = {33, 60, 78, 63, 43, + 33, 33, 33, 126, 62}; + + // Check the output + for (uint32_t i = 0; i < 10; i++) + EXPECT_EQ(expected_out_leftover[i], dest_buf[i]) << " at " << i; + FX_Free(dest_buf); +} + +// Make sure we get returns in the expected locations. +TEST(fxcodec, A85TestLineBreaks) { + // Make sure really big values don't break. + uint8_t src_buf[131] = {0}; + // 1 full line + most of a line of normal symbols. + for (int k = 0; k < 116; k += 4) { + src_buf[k] = 1; + src_buf[k + 1] = 2; + src_buf[k + 2] = 3; + src_buf[k + 3] = 4; + } + // Fill in the end, leaving an all zero gap + 3 extra zeros at the end. + for (int k = 120; k < 128; k++) { + src_buf[k] = 1; + src_buf[k + 1] = 2; + src_buf[k + 2] = 3; + src_buf[k + 3] = 4; + } + uint8_t* dest_buf = nullptr; + uint32_t src_size = 131; + uint32_t dest_size = 0; + + CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule(); + EXPECT_TRUE(pEncoders); + + // Should succeed. + EXPECT_TRUE(pEncoders->A85Encode(src_buf, src_size, &dest_buf, &dest_size)); + + // Should have 75 chars in the first row plus 2 char return, + // 76 chars in the second row plus 2 char return, + // and 9 chars in the last row with 2 terminators. + ASSERT_EQ(166u, dest_size); + + // Check for the returns. + EXPECT_EQ(13, dest_buf[75]); + EXPECT_EQ(10, dest_buf[76]); + EXPECT_EQ(13, dest_buf[153]); + EXPECT_EQ(10, dest_buf[154]); + + FX_Free(dest_buf); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_embeddertest.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_embeddertest.cpp new file mode 100644 index 000000000000..fd02f973a1b3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_embeddertest.cpp @@ -0,0 +1,20 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +class FXCodecEmbeddertest : public EmbedderTest {}; + +TEST_F(FXCodecEmbeddertest, Bug_631912) { + // Test jbig2 image in PDF file can be loaded successfully. + // Should not crash. + EXPECT_TRUE(OpenDocument("bug_631912.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_NE(nullptr, page); + FPDF_BITMAP bitmap = RenderPage(page); + CompareBitmap(bitmap, 691, 432, "24d75af646f8772c5ee7ced260452ae4"); + FPDFBitmap_Destroy(bitmap); + UnloadPage(page); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_fax.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_fax.cpp new file mode 100644 index 000000000000..6b471d838756 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_fax.cpp @@ -0,0 +1,808 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include +#include +#include + +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/fx_memory.h" +#include "third_party/base/ptr_util.h" + +namespace { + +const uint8_t OneLeadPos[256] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +const uint8_t ZeroLeadPos[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, +}; + +// Limit of image dimension, an arbitrary large number. +const int kMaxImageDimension = 0x01FFFF; + +int FindBit(const uint8_t* data_buf, int max_pos, int start_pos, int bit) { + ASSERT(start_pos >= 0); + if (start_pos >= max_pos) + return max_pos; + + const uint8_t* leading_pos = bit ? OneLeadPos : ZeroLeadPos; + if (start_pos % 8) { + uint8_t data = data_buf[start_pos / 8]; + if (bit) + data &= 0xff >> (start_pos % 8); + else + data |= 0xff << (8 - start_pos % 8); + + if (leading_pos[data] < 8) + return start_pos / 8 * 8 + leading_pos[data]; + + start_pos += 7; + } + uint8_t skip = bit ? 0x00 : 0xff; + int byte_pos = start_pos / 8; + int max_byte = (max_pos + 7) / 8; + while (byte_pos < max_byte) { + if (data_buf[byte_pos] != skip) + break; + + ++byte_pos; + } + if (byte_pos == max_byte) + return max_pos; + + return std::min(leading_pos[data_buf[byte_pos]] + byte_pos * 8, max_pos); +} + +void FaxG4FindB1B2(const std::vector& ref_buf, + int columns, + int a0, + bool a0color, + int* b1, + int* b2) { + uint8_t first_bit = + (a0 < 0) ? 1 : ((ref_buf[a0 / 8] & (1 << (7 - a0 % 8))) != 0); + *b1 = FindBit(ref_buf.data(), columns, a0 + 1, !first_bit); + if (*b1 >= columns) { + *b1 = *b2 = columns; + return; + } + if (first_bit == !a0color) { + *b1 = FindBit(ref_buf.data(), columns, *b1 + 1, first_bit); + first_bit = !first_bit; + } + if (*b1 >= columns) { + *b1 = *b2 = columns; + return; + } + *b2 = FindBit(ref_buf.data(), columns, *b1 + 1, first_bit); +} + +void FaxFillBits(uint8_t* dest_buf, int columns, int startpos, int endpos) { + startpos = std::max(startpos, 0); + endpos = std::min(std::max(endpos, 0), columns); + if (startpos >= endpos) + return; + + int first_byte = startpos / 8; + int last_byte = (endpos - 1) / 8; + if (first_byte == last_byte) { + for (int i = startpos % 8; i <= (endpos - 1) % 8; ++i) + dest_buf[first_byte] -= 1 << (7 - i); + return; + } + + for (int i = startpos % 8; i < 8; ++i) + dest_buf[first_byte] -= 1 << (7 - i); + for (int i = 0; i <= (endpos - 1) % 8; ++i) + dest_buf[last_byte] -= 1 << (7 - i); + + if (last_byte > first_byte + 1) + FXSYS_memset(dest_buf + first_byte + 1, 0, last_byte - first_byte - 1); +} + +inline bool NextBit(const uint8_t* src_buf, int* bitpos) { + int pos = (*bitpos)++; + return !!(src_buf[pos / 8] & (1 << (7 - pos % 8))); +} + +const uint8_t FaxBlackRunIns[] = { + 0, 2, 0x02, 3, 0, 0x03, + 2, 0, 2, 0x02, 1, 0, + 0x03, 4, 0, 2, 0x02, 6, + 0, 0x03, 5, 0, 1, 0x03, + 7, 0, 2, 0x04, 9, 0, + 0x05, 8, 0, 3, 0x04, 10, + 0, 0x05, 11, 0, 0x07, 12, + 0, 2, 0x04, 13, 0, 0x07, + 14, 0, 1, 0x18, 15, 0, + 5, 0x08, 18, 0, 0x0f, 64, + 0, 0x17, 16, 0, 0x18, 17, + 0, 0x37, 0, 0, 10, 0x08, + 0x00, 0x07, 0x0c, 0x40, 0x07, 0x0d, + 0x80, 0x07, 0x17, 24, 0, 0x18, + 25, 0, 0x28, 23, 0, 0x37, + 22, 0, 0x67, 19, 0, 0x68, + 20, 0, 0x6c, 21, 0, 54, + 0x12, 1984 % 256, 1984 / 256, 0x13, 2048 % 256, 2048 / 256, + 0x14, 2112 % 256, 2112 / 256, 0x15, 2176 % 256, 2176 / 256, + 0x16, 2240 % 256, 2240 / 256, 0x17, 2304 % 256, 2304 / 256, + 0x1c, 2368 % 256, 2368 / 256, 0x1d, 2432 % 256, 2432 / 256, + 0x1e, 2496 % 256, 2496 / 256, 0x1f, 2560 % 256, 2560 / 256, + 0x24, 52, 0, 0x27, 55, 0, + 0x28, 56, 0, 0x2b, 59, 0, + 0x2c, 60, 0, 0x33, 320 % 256, 320 / 256, + 0x34, 384 % 256, 384 / 256, 0x35, 448 % 256, 448 / 256, + 0x37, 53, 0, 0x38, 54, 0, + 0x52, 50, 0, 0x53, 51, 0, + 0x54, 44, 0, 0x55, 45, 0, + 0x56, 46, 0, 0x57, 47, 0, + 0x58, 57, 0, 0x59, 58, 0, + 0x5a, 61, 0, 0x5b, 256 % 256, 256 / 256, + 0x64, 48, 0, 0x65, 49, 0, + 0x66, 62, 0, 0x67, 63, 0, + 0x68, 30, 0, 0x69, 31, 0, + 0x6a, 32, 0, 0x6b, 33, 0, + 0x6c, 40, 0, 0x6d, 41, 0, + 0xc8, 128, 0, 0xc9, 192, 0, + 0xca, 26, 0, 0xcb, 27, 0, + 0xcc, 28, 0, 0xcd, 29, 0, + 0xd2, 34, 0, 0xd3, 35, 0, + 0xd4, 36, 0, 0xd5, 37, 0, + 0xd6, 38, 0, 0xd7, 39, 0, + 0xda, 42, 0, 0xdb, 43, 0, + 20, 0x4a, 640 % 256, 640 / 256, 0x4b, 704 % 256, + 704 / 256, 0x4c, 768 % 256, 768 / 256, 0x4d, 832 % 256, + 832 / 256, 0x52, 1280 % 256, 1280 / 256, 0x53, 1344 % 256, + 1344 / 256, 0x54, 1408 % 256, 1408 / 256, 0x55, 1472 % 256, + 1472 / 256, 0x5a, 1536 % 256, 1536 / 256, 0x5b, 1600 % 256, + 1600 / 256, 0x64, 1664 % 256, 1664 / 256, 0x65, 1728 % 256, + 1728 / 256, 0x6c, 512 % 256, 512 / 256, 0x6d, 576 % 256, + 576 / 256, 0x72, 896 % 256, 896 / 256, 0x73, 960 % 256, + 960 / 256, 0x74, 1024 % 256, 1024 / 256, 0x75, 1088 % 256, + 1088 / 256, 0x76, 1152 % 256, 1152 / 256, 0x77, 1216 % 256, + 1216 / 256, 0xff}; + +const uint8_t FaxWhiteRunIns[] = { + 0, 0, 0, 6, 0x07, 2, + 0, 0x08, 3, 0, 0x0B, 4, + 0, 0x0C, 5, 0, 0x0E, 6, + 0, 0x0F, 7, 0, 6, 0x07, + 10, 0, 0x08, 11, 0, 0x12, + 128, 0, 0x13, 8, 0, 0x14, + 9, 0, 0x1b, 64, 0, 9, + 0x03, 13, 0, 0x07, 1, 0, + 0x08, 12, 0, 0x17, 192, 0, + 0x18, 1664 % 256, 1664 / 256, 0x2a, 16, 0, + 0x2B, 17, 0, 0x34, 14, 0, + 0x35, 15, 0, 12, 0x03, 22, + 0, 0x04, 23, 0, 0x08, 20, + 0, 0x0c, 19, 0, 0x13, 26, + 0, 0x17, 21, 0, 0x18, 28, + 0, 0x24, 27, 0, 0x27, 18, + 0, 0x28, 24, 0, 0x2B, 25, + 0, 0x37, 256 % 256, 256 / 256, 42, 0x02, + 29, 0, 0x03, 30, 0, 0x04, + 45, 0, 0x05, 46, 0, 0x0a, + 47, 0, 0x0b, 48, 0, 0x12, + 33, 0, 0x13, 34, 0, 0x14, + 35, 0, 0x15, 36, 0, 0x16, + 37, 0, 0x17, 38, 0, 0x1a, + 31, 0, 0x1b, 32, 0, 0x24, + 53, 0, 0x25, 54, 0, 0x28, + 39, 0, 0x29, 40, 0, 0x2a, + 41, 0, 0x2b, 42, 0, 0x2c, + 43, 0, 0x2d, 44, 0, 0x32, + 61, 0, 0x33, 62, 0, 0x34, + 63, 0, 0x35, 0, 0, 0x36, + 320 % 256, 320 / 256, 0x37, 384 % 256, 384 / 256, 0x4a, + 59, 0, 0x4b, 60, 0, 0x52, + 49, 0, 0x53, 50, 0, 0x54, + 51, 0, 0x55, 52, 0, 0x58, + 55, 0, 0x59, 56, 0, 0x5a, + 57, 0, 0x5b, 58, 0, 0x64, + 448 % 256, 448 / 256, 0x65, 512 % 256, 512 / 256, 0x67, + 640 % 256, 640 / 256, 0x68, 576 % 256, 576 / 256, 16, + 0x98, 1472 % 256, 1472 / 256, 0x99, 1536 % 256, 1536 / 256, + 0x9a, 1600 % 256, 1600 / 256, 0x9b, 1728 % 256, 1728 / 256, + 0xcc, 704 % 256, 704 / 256, 0xcd, 768 % 256, 768 / 256, + 0xd2, 832 % 256, 832 / 256, 0xd3, 896 % 256, 896 / 256, + 0xd4, 960 % 256, 960 / 256, 0xd5, 1024 % 256, 1024 / 256, + 0xd6, 1088 % 256, 1088 / 256, 0xd7, 1152 % 256, 1152 / 256, + 0xd8, 1216 % 256, 1216 / 256, 0xd9, 1280 % 256, 1280 / 256, + 0xda, 1344 % 256, 1344 / 256, 0xdb, 1408 % 256, 1408 / 256, + 0, 3, 0x08, 1792 % 256, 1792 / 256, 0x0c, + 1856 % 256, 1856 / 256, 0x0d, 1920 % 256, 1920 / 256, 10, + 0x12, 1984 % 256, 1984 / 256, 0x13, 2048 % 256, 2048 / 256, + 0x14, 2112 % 256, 2112 / 256, 0x15, 2176 % 256, 2176 / 256, + 0x16, 2240 % 256, 2240 / 256, 0x17, 2304 % 256, 2304 / 256, + 0x1c, 2368 % 256, 2368 / 256, 0x1d, 2432 % 256, 2432 / 256, + 0x1e, 2496 % 256, 2496 / 256, 0x1f, 2560 % 256, 2560 / 256, + 0xff, +}; + +int FaxGetRun(const uint8_t* ins_array, + const uint8_t* src_buf, + int* bitpos, + int bitsize) { + uint32_t code = 0; + int ins_off = 0; + while (1) { + uint8_t ins = ins_array[ins_off++]; + if (ins == 0xff) + return -1; + + if (*bitpos >= bitsize) + return -1; + + code <<= 1; + if (src_buf[*bitpos / 8] & (1 << (7 - *bitpos % 8))) + ++code; + + ++(*bitpos); + int next_off = ins_off + ins * 3; + for (; ins_off < next_off; ins_off += 3) { + if (ins_array[ins_off] == code) { + return ins_array[ins_off + 1] + ins_array[ins_off + 2] * 256; + } + } + } +} + +bool FaxG4GetRow(const uint8_t* src_buf, + int bitsize, + int* bitpos, + uint8_t* dest_buf, + const std::vector& ref_buf, + int columns) { + int a0 = -1; + bool a0color = true; + while (1) { + if (*bitpos >= bitsize) + return false; + + int a1; + int a2; + int b1; + int b2; + FaxG4FindB1B2(ref_buf, columns, a0, a0color, &b1, &b2); + + int v_delta = 0; + if (!NextBit(src_buf, bitpos)) { + if (*bitpos >= bitsize) + return false; + + bool bit1 = NextBit(src_buf, bitpos); + if (*bitpos >= bitsize) + return false; + + bool bit2 = NextBit(src_buf, bitpos); + if (bit1) { + v_delta = bit2 ? 1 : -1; + } else if (bit2) { + int run_len1 = 0; + while (1) { + int run = FaxGetRun(a0color ? FaxWhiteRunIns : FaxBlackRunIns, + src_buf, bitpos, bitsize); + run_len1 += run; + if (run < 64) { + break; + } + } + if (a0 < 0) + ++run_len1; + + a1 = a0 + run_len1; + if (!a0color) + FaxFillBits(dest_buf, columns, a0, a1); + + int run_len2 = 0; + while (1) { + int run = FaxGetRun(a0color ? FaxBlackRunIns : FaxWhiteRunIns, + src_buf, bitpos, bitsize); + run_len2 += run; + if (run < 64) { + break; + } + } + a2 = a1 + run_len2; + if (a0color) + FaxFillBits(dest_buf, columns, a1, a2); + + a0 = a2; + if (a0 < columns) + continue; + + return true; + } else { + if (*bitpos >= bitsize) + return false; + + if (NextBit(src_buf, bitpos)) { + if (!a0color) + FaxFillBits(dest_buf, columns, a0, b2); + + if (b2 >= columns) + return true; + + a0 = b2; + continue; + } + + if (*bitpos >= bitsize) + return false; + + bool next_bit1 = NextBit(src_buf, bitpos); + if (*bitpos >= bitsize) + return false; + + bool next_bit2 = NextBit(src_buf, bitpos); + if (next_bit1) { + v_delta = next_bit2 ? 2 : -2; + } else if (next_bit2) { + if (*bitpos >= bitsize) + return false; + + v_delta = NextBit(src_buf, bitpos) ? 3 : -3; + } else { + if (*bitpos >= bitsize) + return false; + + if (NextBit(src_buf, bitpos)) { + *bitpos += 3; + continue; + } + *bitpos += 5; + return true; + } + } + } + a1 = b1 + v_delta; + if (!a0color) + FaxFillBits(dest_buf, columns, a0, a1); + + if (a1 >= columns) + return true; + + // The position of picture element must be monotonic increasing. + if (a0 >= a1) + return false; + + a0 = a1; + a0color = !a0color; + } +} + +bool FaxSkipEOL(const uint8_t* src_buf, int bitsize, int* bitpos) { + int startbit = *bitpos; + while (*bitpos < bitsize) { + if (!NextBit(src_buf, bitpos)) + continue; + if (*bitpos - startbit <= 11) + *bitpos = startbit; + return true; + } + return false; +} + +bool FaxGet1DLine(const uint8_t* src_buf, + int bitsize, + int* bitpos, + std::vector* dest_buf, + int columns) { + bool color = true; + int startpos = 0; + while (1) { + if (*bitpos >= bitsize) + return false; + + int run_len = 0; + while (1) { + int run = FaxGetRun(color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf, + bitpos, bitsize); + if (run < 0) { + while (*bitpos < bitsize) { + if (NextBit(src_buf, bitpos)) + return true; + } + return false; + } + run_len += run; + if (run < 64) { + break; + } + } + if (!color) + FaxFillBits(dest_buf->data(), columns, startpos, startpos + run_len); + + startpos += run_len; + if (startpos >= columns) + break; + + color = !color; + } + return true; +} + +} // namespace + +class CCodec_FaxDecoder : public CCodec_ScanlineDecoder { + public: + CCodec_FaxDecoder(const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + uint32_t pitch, + int K, + bool EndOfLine, + bool EncodedByteAlign, + bool BlackIs1); + ~CCodec_FaxDecoder() override; + + // CCodec_ScanlineDecoder + bool v_Rewind() override; + uint8_t* v_GetNextLine() override; + uint32_t GetSrcOffset() override; + + private: + const int m_Encoding; + int m_bitpos; + bool m_bByteAlign; + const bool m_bEndOfLine; + const bool m_bBlack; + const uint32_t m_SrcSize; + const uint8_t* const m_pSrcBuf; + std::vector m_ScanlineBuf; + std::vector m_RefBuf; +}; + +CCodec_FaxDecoder::CCodec_FaxDecoder(const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + uint32_t pitch, + int K, + bool EndOfLine, + bool EncodedByteAlign, + bool BlackIs1) + : CCodec_ScanlineDecoder(width, height, width, height, 1, 1, pitch), + m_Encoding(K), + m_bitpos(0), + m_bByteAlign(EncodedByteAlign), + m_bEndOfLine(EndOfLine), + m_bBlack(BlackIs1), + m_SrcSize(src_size), + m_pSrcBuf(src_buf), + m_ScanlineBuf(pitch), + m_RefBuf(pitch) {} + +CCodec_FaxDecoder::~CCodec_FaxDecoder() {} + +bool CCodec_FaxDecoder::v_Rewind() { + FXSYS_memset(m_RefBuf.data(), 0xff, m_RefBuf.size()); + m_bitpos = 0; + return true; +} + +uint8_t* CCodec_FaxDecoder::v_GetNextLine() { + int bitsize = m_SrcSize * 8; + FaxSkipEOL(m_pSrcBuf, bitsize, &m_bitpos); + if (m_bitpos >= bitsize) + return nullptr; + + FXSYS_memset(m_ScanlineBuf.data(), 0xff, m_ScanlineBuf.size()); + if (m_Encoding < 0) { + FaxG4GetRow(m_pSrcBuf, bitsize, &m_bitpos, m_ScanlineBuf.data(), m_RefBuf, + m_OrigWidth); + m_RefBuf = m_ScanlineBuf; + } else if (m_Encoding == 0) { + FaxGet1DLine(m_pSrcBuf, bitsize, &m_bitpos, &m_ScanlineBuf, m_OrigWidth); + } else { + if (NextBit(m_pSrcBuf, &m_bitpos)) { + FaxGet1DLine(m_pSrcBuf, bitsize, &m_bitpos, &m_ScanlineBuf, m_OrigWidth); + } else { + FaxG4GetRow(m_pSrcBuf, bitsize, &m_bitpos, m_ScanlineBuf.data(), m_RefBuf, + m_OrigWidth); + } + m_RefBuf = m_ScanlineBuf; + } + if (m_bEndOfLine) + FaxSkipEOL(m_pSrcBuf, bitsize, &m_bitpos); + + if (m_bByteAlign && m_bitpos < bitsize) { + int bitpos0 = m_bitpos; + int bitpos1 = (m_bitpos + 7) / 8 * 8; + while (m_bByteAlign && bitpos0 < bitpos1) { + int bit = m_pSrcBuf[bitpos0 / 8] & (1 << (7 - bitpos0 % 8)); + if (bit != 0) { + m_bByteAlign = false; + } else { + ++bitpos0; + } + } + if (m_bByteAlign) + m_bitpos = bitpos1; + } + if (m_bBlack) { + for (uint32_t i = 0; i < m_Pitch; ++i) { + m_ScanlineBuf[i] = ~m_ScanlineBuf[i]; + } + } + return m_ScanlineBuf.data(); +} + +uint32_t CCodec_FaxDecoder::GetSrcOffset() { + return std::min(static_cast((m_bitpos + 7) / 8), m_SrcSize); +} + +void FaxG4Decode(const uint8_t* src_buf, + uint32_t src_size, + int* pbitpos, + uint8_t* dest_buf, + int width, + int height, + int pitch) { + if (pitch == 0) + pitch = (width + 7) / 8; + + std::vector ref_buf(pitch, 0xff); + int bitpos = *pbitpos; + for (int iRow = 0; iRow < height; iRow++) { + uint8_t* line_buf = dest_buf + iRow * pitch; + FXSYS_memset(line_buf, 0xff, pitch); + FaxG4GetRow(src_buf, src_size << 3, &bitpos, line_buf, ref_buf, width); + FXSYS_memcpy(ref_buf.data(), line_buf, pitch); + } + *pbitpos = bitpos; +} + +std::unique_ptr CCodec_FaxModule::CreateDecoder( + const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int K, + bool EndOfLine, + bool EncodedByteAlign, + bool BlackIs1, + int Columns, + int Rows) { + int actual_width = Columns ? Columns : width; + int actual_height = Rows ? Rows : height; + + // Reject invalid values. + if (actual_width <= 0 || actual_height <= 0) + return nullptr; + + // Reject unreasonable large input. + if (actual_width > kMaxImageDimension || actual_height > kMaxImageDimension) + return nullptr; + + uint32_t pitch = (static_cast(actual_width) + 31) / 32 * 4; + return pdfium::MakeUnique( + src_buf, src_size, actual_width, actual_height, pitch, K, EndOfLine, + EncodedByteAlign, BlackIs1); +} + +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_ +namespace { +const uint8_t BlackRunTerminator[128] = { + 0x37, 10, 0x02, 3, 0x03, 2, 0x02, 2, 0x03, 3, 0x03, 4, 0x02, 4, + 0x03, 5, 0x05, 6, 0x04, 6, 0x04, 7, 0x05, 7, 0x07, 7, 0x04, 8, + 0x07, 8, 0x18, 9, 0x17, 10, 0x18, 10, 0x08, 10, 0x67, 11, 0x68, 11, + 0x6c, 11, 0x37, 11, 0x28, 11, 0x17, 11, 0x18, 11, 0xca, 12, 0xcb, 12, + 0xcc, 12, 0xcd, 12, 0x68, 12, 0x69, 12, 0x6a, 12, 0x6b, 12, 0xd2, 12, + 0xd3, 12, 0xd4, 12, 0xd5, 12, 0xd6, 12, 0xd7, 12, 0x6c, 12, 0x6d, 12, + 0xda, 12, 0xdb, 12, 0x54, 12, 0x55, 12, 0x56, 12, 0x57, 12, 0x64, 12, + 0x65, 12, 0x52, 12, 0x53, 12, 0x24, 12, 0x37, 12, 0x38, 12, 0x27, 12, + 0x28, 12, 0x58, 12, 0x59, 12, 0x2b, 12, 0x2c, 12, 0x5a, 12, 0x66, 12, + 0x67, 12, +}; + +const uint8_t BlackRunMarkup[80] = { + 0x0f, 10, 0xc8, 12, 0xc9, 12, 0x5b, 12, 0x33, 12, 0x34, 12, 0x35, 12, + 0x6c, 13, 0x6d, 13, 0x4a, 13, 0x4b, 13, 0x4c, 13, 0x4d, 13, 0x72, 13, + 0x73, 13, 0x74, 13, 0x75, 13, 0x76, 13, 0x77, 13, 0x52, 13, 0x53, 13, + 0x54, 13, 0x55, 13, 0x5a, 13, 0x5b, 13, 0x64, 13, 0x65, 13, 0x08, 11, + 0x0c, 11, 0x0d, 11, 0x12, 12, 0x13, 12, 0x14, 12, 0x15, 12, 0x16, 12, + 0x17, 12, 0x1c, 12, 0x1d, 12, 0x1e, 12, 0x1f, 12, +}; + +const uint8_t WhiteRunTerminator[128] = { + 0x35, 8, 0x07, 6, 0x07, 4, 0x08, 4, 0x0B, 4, 0x0C, 4, 0x0E, 4, 0x0F, 4, + 0x13, 5, 0x14, 5, 0x07, 5, 0x08, 5, 0x08, 6, 0x03, 6, 0x34, 6, 0x35, 6, + 0x2a, 6, 0x2B, 6, 0x27, 7, 0x0c, 7, 0x08, 7, 0x17, 7, 0x03, 7, 0x04, 7, + 0x28, 7, 0x2B, 7, 0x13, 7, 0x24, 7, 0x18, 7, 0x02, 8, 0x03, 8, 0x1a, 8, + 0x1b, 8, 0x12, 8, 0x13, 8, 0x14, 8, 0x15, 8, 0x16, 8, 0x17, 8, 0x28, 8, + 0x29, 8, 0x2a, 8, 0x2b, 8, 0x2c, 8, 0x2d, 8, 0x04, 8, 0x05, 8, 0x0a, 8, + 0x0b, 8, 0x52, 8, 0x53, 8, 0x54, 8, 0x55, 8, 0x24, 8, 0x25, 8, 0x58, 8, + 0x59, 8, 0x5a, 8, 0x5b, 8, 0x4a, 8, 0x4b, 8, 0x32, 8, 0x33, 8, 0x34, 8, +}; + +const uint8_t WhiteRunMarkup[80] = { + 0x1b, 5, 0x12, 5, 0x17, 6, 0x37, 7, 0x36, 8, 0x37, 8, 0x64, 8, + 0x65, 8, 0x68, 8, 0x67, 8, 0xcc, 9, 0xcd, 9, 0xd2, 9, 0xd3, 9, + 0xd4, 9, 0xd5, 9, 0xd6, 9, 0xd7, 9, 0xd8, 9, 0xd9, 9, 0xda, 9, + 0xdb, 9, 0x98, 9, 0x99, 9, 0x9a, 9, 0x18, 6, 0x9b, 9, 0x08, 11, + 0x0c, 11, 0x0d, 11, 0x12, 12, 0x13, 12, 0x14, 12, 0x15, 12, 0x16, 12, + 0x17, 12, 0x1c, 12, 0x1d, 12, 0x1e, 12, 0x1f, 12, +}; + +void AddBitStream(uint8_t* dest_buf, int* dest_bitpos, int data, int bitlen) { + for (int i = bitlen - 1; i >= 0; i--) { + if (data & (1 << i)) { + dest_buf[*dest_bitpos / 8] |= 1 << (7 - *dest_bitpos % 8); + } + (*dest_bitpos)++; + } +} + +void FaxEncodeRun(uint8_t* dest_buf, int* dest_bitpos, int run, bool bWhite) { + while (run >= 2560) { + AddBitStream(dest_buf, dest_bitpos, 0x1f, 12); + run -= 2560; + } + if (run >= 64) { + int markup = run - run % 64; + const uint8_t* p = bWhite ? WhiteRunMarkup : BlackRunMarkup; + p += (markup / 64 - 1) * 2; + AddBitStream(dest_buf, dest_bitpos, *p, p[1]); + } + run %= 64; + const uint8_t* p = bWhite ? WhiteRunTerminator : BlackRunTerminator; + p += run * 2; + AddBitStream(dest_buf, dest_bitpos, *p, p[1]); +} + +void FaxEncode2DLine(uint8_t* dest_buf, + int* dest_bitpos, + const uint8_t* src_buf, + const std::vector& ref_buf, + int cols) { + int a0 = -1; + bool a0color = true; + while (1) { + int a1 = FindBit(src_buf, cols, a0 + 1, !a0color); + int b1; + int b2; + FaxG4FindB1B2(ref_buf, cols, a0, a0color, &b1, &b2); + if (b2 < a1) { + *dest_bitpos += 3; + dest_buf[*dest_bitpos / 8] |= 1 << (7 - *dest_bitpos % 8); + (*dest_bitpos)++; + a0 = b2; + } else if (a1 - b1 <= 3 && b1 - a1 <= 3) { + int delta = a1 - b1; + switch (delta) { + case 0: + dest_buf[*dest_bitpos / 8] |= 1 << (7 - *dest_bitpos % 8); + break; + case 1: + case 2: + case 3: + *dest_bitpos += delta == 1 ? 1 : delta + 2; + dest_buf[*dest_bitpos / 8] |= 1 << (7 - *dest_bitpos % 8); + (*dest_bitpos)++; + dest_buf[*dest_bitpos / 8] |= 1 << (7 - *dest_bitpos % 8); + break; + case -1: + case -2: + case -3: + *dest_bitpos += delta == -1 ? 1 : -delta + 2; + dest_buf[*dest_bitpos / 8] |= 1 << (7 - *dest_bitpos % 8); + (*dest_bitpos)++; + break; + } + (*dest_bitpos)++; + a0 = a1; + a0color = !a0color; + } else { + int a2 = FindBit(src_buf, cols, a1 + 1, a0color); + (*dest_bitpos)++; + (*dest_bitpos)++; + dest_buf[*dest_bitpos / 8] |= 1 << (7 - *dest_bitpos % 8); + (*dest_bitpos)++; + if (a0 < 0) { + a0 = 0; + } + FaxEncodeRun(dest_buf, dest_bitpos, a1 - a0, a0color); + FaxEncodeRun(dest_buf, dest_bitpos, a2 - a1, !a0color); + a0 = a2; + } + if (a0 >= cols) { + return; + } + } +} + +class CCodec_FaxEncoder { + public: + CCodec_FaxEncoder(const uint8_t* src_buf, int width, int height, int pitch); + ~CCodec_FaxEncoder(); + void Encode(std::unique_ptr* dest_buf, + uint32_t* dest_size); + + private: + CFX_BinaryBuf m_DestBuf; + std::vector m_RefLine; + uint8_t* m_pLineBuf; + const int m_Cols; + const int m_Rows; + const int m_Pitch; + const uint8_t* m_pSrcBuf; +}; + +CCodec_FaxEncoder::CCodec_FaxEncoder(const uint8_t* src_buf, + int width, + int height, + int pitch) + : m_Cols(width), m_Rows(height), m_Pitch(pitch), m_pSrcBuf(src_buf) { + m_RefLine.resize(m_Pitch); + FXSYS_memset(m_RefLine.data(), 0xff, m_Pitch); + m_pLineBuf = FX_Alloc2D(uint8_t, m_Pitch, 8); + m_DestBuf.EstimateSize(0, 10240); +} + +CCodec_FaxEncoder::~CCodec_FaxEncoder() { + FX_Free(m_pLineBuf); +} + +void CCodec_FaxEncoder::Encode( + std::unique_ptr* dest_buf, + uint32_t* dest_size) { + int dest_bitpos = 0; + uint8_t last_byte = 0; + for (int i = 0; i < m_Rows; i++) { + const uint8_t* scan_line = m_pSrcBuf + i * m_Pitch; + FXSYS_memset(m_pLineBuf, 0, m_Pitch * 8); + m_pLineBuf[0] = last_byte; + FaxEncode2DLine(m_pLineBuf, &dest_bitpos, scan_line, m_RefLine, m_Cols); + m_DestBuf.AppendBlock(m_pLineBuf, dest_bitpos / 8); + last_byte = m_pLineBuf[dest_bitpos / 8]; + dest_bitpos %= 8; + FXSYS_memcpy(m_RefLine.data(), scan_line, m_Pitch); + } + if (dest_bitpos) { + m_DestBuf.AppendByte(last_byte); + } + *dest_size = m_DestBuf.GetSize(); + *dest_buf = m_DestBuf.DetachBuffer(); +} + +} // namespace + +void CCodec_FaxModule::FaxEncode( + const uint8_t* src_buf, + int width, + int height, + int pitch, + std::unique_ptr* dest_buf, + uint32_t* dest_size) { + CCodec_FaxEncoder encoder(src_buf, width, height, pitch); + encoder.Encode(dest_buf, dest_size); +} + +#endif diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_flate.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_flate.cpp new file mode 100644 index 000000000000..87bd6db80a47 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_flate.cpp @@ -0,0 +1,870 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include +#include +#include +#include + +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/fx_ext.h" +#include "third_party/base/ptr_util.h" +#include "zlib.h" + +extern "C" { +static void* my_alloc_func(void* opaque, + unsigned int items, + unsigned int size) { + return FX_Alloc2D(uint8_t, items, size); +} +static void my_free_func(void* opaque, void* address) { + FX_Free(address); +} +static int FPDFAPI_FlateGetTotalOut(void* context) { + return ((z_stream*)context)->total_out; +} +static int FPDFAPI_FlateGetTotalIn(void* context) { + return ((z_stream*)context)->total_in; +} + +static bool FPDFAPI_FlateCompress(unsigned char* dest_buf, + unsigned long* dest_size, + const unsigned char* src_buf, + unsigned long src_size) { + return compress(dest_buf, dest_size, src_buf, src_size) == Z_OK; +} + +void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int), + void (*free_func)(void*, void*)) { + z_stream* p = (z_stream*)alloc_func(0, 1, sizeof(z_stream)); + if (!p) + return nullptr; + + FXSYS_memset(p, 0, sizeof(z_stream)); + p->zalloc = alloc_func; + p->zfree = free_func; + inflateInit(p); + return p; +} + +void FPDFAPI_FlateInput(void* context, + const unsigned char* src_buf, + unsigned int src_size) { + ((z_stream*)context)->next_in = (unsigned char*)src_buf; + ((z_stream*)context)->avail_in = src_size; +} + +int FPDFAPI_FlateOutput(void* context, + unsigned char* dest_buf, + unsigned int dest_size) { + ((z_stream*)context)->next_out = dest_buf; + ((z_stream*)context)->avail_out = dest_size; + unsigned int pre_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context); + int ret = inflate((z_stream*)context, Z_SYNC_FLUSH); + unsigned int post_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context); + unsigned int written = post_pos - pre_pos; + if (written < dest_size) { + FXSYS_memset(dest_buf + written, '\0', dest_size - written); + } + return ret; +} + +int FPDFAPI_FlateGetAvailIn(void* context) { + return ((z_stream*)context)->avail_in; +} + +int FPDFAPI_FlateGetAvailOut(void* context) { + return ((z_stream*)context)->avail_out; +} + +void FPDFAPI_FlateEnd(void* context) { + inflateEnd((z_stream*)context); + ((z_stream*)context)->zfree(0, context); +} + +} // extern "C" + +namespace { + +class CLZWDecoder { + public: + int Decode(uint8_t* output, + uint32_t& outlen, + const uint8_t* input, + uint32_t& size, + bool bEarlyChange); + + private: + void AddCode(uint32_t prefix_code, uint8_t append_char); + void DecodeString(uint32_t code); + + uint32_t m_InPos; + uint32_t m_OutPos; + uint8_t* m_pOutput; + const uint8_t* m_pInput; + bool m_Early; + uint32_t m_CodeArray[5021]; + uint32_t m_nCodes; + uint8_t m_DecodeStack[4000]; + uint32_t m_StackLen; + int m_CodeLen; +}; + +void CLZWDecoder::AddCode(uint32_t prefix_code, uint8_t append_char) { + if (m_nCodes + m_Early == 4094) { + return; + } + m_CodeArray[m_nCodes++] = (prefix_code << 16) | append_char; + if (m_nCodes + m_Early == 512 - 258) { + m_CodeLen = 10; + } else if (m_nCodes + m_Early == 1024 - 258) { + m_CodeLen = 11; + } else if (m_nCodes + m_Early == 2048 - 258) { + m_CodeLen = 12; + } +} +void CLZWDecoder::DecodeString(uint32_t code) { + while (1) { + int index = code - 258; + if (index < 0 || index >= (int)m_nCodes) { + break; + } + uint32_t data = m_CodeArray[index]; + if (m_StackLen >= sizeof(m_DecodeStack)) { + return; + } + m_DecodeStack[m_StackLen++] = (uint8_t)data; + code = data >> 16; + } + if (m_StackLen >= sizeof(m_DecodeStack)) { + return; + } + m_DecodeStack[m_StackLen++] = (uint8_t)code; +} +int CLZWDecoder::Decode(uint8_t* dest_buf, + uint32_t& dest_size, + const uint8_t* src_buf, + uint32_t& src_size, + bool bEarlyChange) { + m_CodeLen = 9; + m_InPos = 0; + m_OutPos = 0; + m_pInput = src_buf; + m_pOutput = dest_buf; + m_Early = bEarlyChange ? 1 : 0; + m_nCodes = 0; + uint32_t old_code = (uint32_t)-1; + uint8_t last_char = 0; + while (1) { + if (m_InPos + m_CodeLen > src_size * 8) { + break; + } + int byte_pos = m_InPos / 8; + int bit_pos = m_InPos % 8, bit_left = m_CodeLen; + uint32_t code = 0; + if (bit_pos) { + bit_left -= 8 - bit_pos; + code = (m_pInput[byte_pos++] & ((1 << (8 - bit_pos)) - 1)) << bit_left; + } + if (bit_left < 8) { + code |= m_pInput[byte_pos] >> (8 - bit_left); + } else { + bit_left -= 8; + code |= m_pInput[byte_pos++] << bit_left; + if (bit_left) { + code |= m_pInput[byte_pos] >> (8 - bit_left); + } + } + m_InPos += m_CodeLen; + if (code < 256) { + if (m_OutPos == dest_size) { + return -5; + } + if (m_pOutput) { + m_pOutput[m_OutPos] = (uint8_t)code; + } + m_OutPos++; + last_char = (uint8_t)code; + if (old_code != (uint32_t)-1) { + AddCode(old_code, last_char); + } + old_code = code; + } else if (code == 256) { + m_CodeLen = 9; + m_nCodes = 0; + old_code = (uint32_t)-1; + } else if (code == 257) { + break; + } else { + if (old_code == (uint32_t)-1) { + return 2; + } + m_StackLen = 0; + if (code >= m_nCodes + 258) { + if (m_StackLen < sizeof(m_DecodeStack)) { + m_DecodeStack[m_StackLen++] = last_char; + } + DecodeString(old_code); + } else { + DecodeString(code); + } + if (m_OutPos + m_StackLen > dest_size) { + return -5; + } + if (m_pOutput) { + for (uint32_t i = 0; i < m_StackLen; i++) { + m_pOutput[m_OutPos + i] = m_DecodeStack[m_StackLen - i - 1]; + } + } + m_OutPos += m_StackLen; + last_char = m_DecodeStack[m_StackLen - 1]; + if (old_code < 256) { + AddCode(old_code, last_char); + } else if (old_code - 258 >= m_nCodes) { + dest_size = m_OutPos; + src_size = (m_InPos + 7) / 8; + return 0; + } else { + AddCode(old_code, last_char); + } + old_code = code; + } + } + dest_size = m_OutPos; + src_size = (m_InPos + 7) / 8; + return 0; +} + +uint8_t PathPredictor(int a, int b, int c) { + int p = a + b - c; + int pa = FXSYS_abs(p - a); + int pb = FXSYS_abs(p - b); + int pc = FXSYS_abs(p - c); + if (pa <= pb && pa <= pc) + return (uint8_t)a; + if (pb <= pc) + return (uint8_t)b; + return (uint8_t)c; +} + +void PNG_PredictorEncode(uint8_t** data_buf, uint32_t* data_size) { + const int row_size = 7; + const int row_count = (*data_size + row_size - 1) / row_size; + const int last_row_size = *data_size % row_size; + uint8_t* dest_buf = FX_Alloc2D(uint8_t, row_size + 1, row_count); + int byte_cnt = 0; + uint8_t* pSrcData = *data_buf; + uint8_t* pDestData = dest_buf; + for (int row = 0; row < row_count; row++) { + for (int byte = 0; byte < row_size && byte_cnt < (int)*data_size; byte++) { + pDestData[0] = 2; + uint8_t up = 0; + if (row) + up = pSrcData[byte - row_size]; + pDestData[byte + 1] = pSrcData[byte] - up; + ++byte_cnt; + } + pDestData += (row_size + 1); + pSrcData += row_size; + } + FX_Free(*data_buf); + *data_buf = dest_buf; + *data_size = (row_size + 1) * row_count - + (last_row_size > 0 ? (row_size - last_row_size) : 0); +} + +void PNG_PredictLine(uint8_t* pDestData, + const uint8_t* pSrcData, + const uint8_t* pLastLine, + int bpc, + int nColors, + int nPixels) { + int row_size = (nPixels * bpc * nColors + 7) / 8; + int BytesPerPixel = (bpc * nColors + 7) / 8; + uint8_t tag = pSrcData[0]; + if (tag == 0) { + FXSYS_memmove(pDestData, pSrcData + 1, row_size); + return; + } + for (int byte = 0; byte < row_size; byte++) { + uint8_t raw_byte = pSrcData[byte + 1]; + switch (tag) { + case 1: { + uint8_t left = 0; + if (byte >= BytesPerPixel) { + left = pDestData[byte - BytesPerPixel]; + } + pDestData[byte] = raw_byte + left; + break; + } + case 2: { + uint8_t up = 0; + if (pLastLine) { + up = pLastLine[byte]; + } + pDestData[byte] = raw_byte + up; + break; + } + case 3: { + uint8_t left = 0; + if (byte >= BytesPerPixel) { + left = pDestData[byte - BytesPerPixel]; + } + uint8_t up = 0; + if (pLastLine) { + up = pLastLine[byte]; + } + pDestData[byte] = raw_byte + (up + left) / 2; + break; + } + case 4: { + uint8_t left = 0; + if (byte >= BytesPerPixel) { + left = pDestData[byte - BytesPerPixel]; + } + uint8_t up = 0; + if (pLastLine) { + up = pLastLine[byte]; + } + uint8_t upper_left = 0; + if (byte >= BytesPerPixel && pLastLine) { + upper_left = pLastLine[byte - BytesPerPixel]; + } + pDestData[byte] = raw_byte + PathPredictor(left, up, upper_left); + break; + } + default: + pDestData[byte] = raw_byte; + break; + } + } +} + +bool PNG_Predictor(uint8_t*& data_buf, + uint32_t& data_size, + int Colors, + int BitsPerComponent, + int Columns) { + const int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8; + const int row_size = (Colors * BitsPerComponent * Columns + 7) / 8; + if (row_size <= 0) + return false; + const int row_count = (data_size + row_size) / (row_size + 1); + if (row_count <= 0) + return false; + const int last_row_size = data_size % (row_size + 1); + uint8_t* dest_buf = FX_Alloc2D(uint8_t, row_size, row_count); + int byte_cnt = 0; + uint8_t* pSrcData = data_buf; + uint8_t* pDestData = dest_buf; + for (int row = 0; row < row_count; row++) { + uint8_t tag = pSrcData[0]; + byte_cnt++; + if (tag == 0) { + int move_size = row_size; + if ((row + 1) * (move_size + 1) > (int)data_size) { + move_size = last_row_size - 1; + } + FXSYS_memmove(pDestData, pSrcData + 1, move_size); + pSrcData += move_size + 1; + pDestData += move_size; + byte_cnt += move_size; + continue; + } + for (int byte = 0; byte < row_size && byte_cnt < (int)data_size; byte++) { + uint8_t raw_byte = pSrcData[byte + 1]; + switch (tag) { + case 1: { + uint8_t left = 0; + if (byte >= BytesPerPixel) { + left = pDestData[byte - BytesPerPixel]; + } + pDestData[byte] = raw_byte + left; + break; + } + case 2: { + uint8_t up = 0; + if (row) { + up = pDestData[byte - row_size]; + } + pDestData[byte] = raw_byte + up; + break; + } + case 3: { + uint8_t left = 0; + if (byte >= BytesPerPixel) { + left = pDestData[byte - BytesPerPixel]; + } + uint8_t up = 0; + if (row) { + up = pDestData[byte - row_size]; + } + pDestData[byte] = raw_byte + (up + left) / 2; + break; + } + case 4: { + uint8_t left = 0; + if (byte >= BytesPerPixel) { + left = pDestData[byte - BytesPerPixel]; + } + uint8_t up = 0; + if (row) { + up = pDestData[byte - row_size]; + } + uint8_t upper_left = 0; + if (byte >= BytesPerPixel && row) { + upper_left = pDestData[byte - row_size - BytesPerPixel]; + } + pDestData[byte] = raw_byte + PathPredictor(left, up, upper_left); + break; + } + default: + pDestData[byte] = raw_byte; + break; + } + byte_cnt++; + } + pSrcData += row_size + 1; + pDestData += row_size; + } + FX_Free(data_buf); + data_buf = dest_buf; + data_size = row_size * row_count - + (last_row_size > 0 ? (row_size + 1 - last_row_size) : 0); + return true; +} + +void TIFF_PredictLine(uint8_t* dest_buf, + uint32_t row_size, + int BitsPerComponent, + int Colors, + int Columns) { + if (BitsPerComponent == 1) { + int row_bits = std::min(BitsPerComponent * Colors * Columns, + pdfium::base::checked_cast(row_size * 8)); + int index_pre = 0; + int col_pre = 0; + for (int i = 1; i < row_bits; i++) { + int col = i % 8; + int index = i / 8; + if (((dest_buf[index] >> (7 - col)) & 1) ^ + ((dest_buf[index_pre] >> (7 - col_pre)) & 1)) { + dest_buf[index] |= 1 << (7 - col); + } else { + dest_buf[index] &= ~(1 << (7 - col)); + } + index_pre = index; + col_pre = col; + } + return; + } + int BytesPerPixel = BitsPerComponent * Colors / 8; + if (BitsPerComponent == 16) { + for (uint32_t i = BytesPerPixel; i < row_size; i += 2) { + uint16_t pixel = + (dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerPixel + 1]; + pixel += (dest_buf[i] << 8) | dest_buf[i + 1]; + dest_buf[i] = pixel >> 8; + dest_buf[i + 1] = (uint8_t)pixel; + } + } else { + for (uint32_t i = BytesPerPixel; i < row_size; i++) { + dest_buf[i] += dest_buf[i - BytesPerPixel]; + } + } +} + +bool TIFF_Predictor(uint8_t*& data_buf, + uint32_t& data_size, + int Colors, + int BitsPerComponent, + int Columns) { + int row_size = (Colors * BitsPerComponent * Columns + 7) / 8; + if (row_size == 0) + return false; + const int row_count = (data_size + row_size - 1) / row_size; + const int last_row_size = data_size % row_size; + for (int row = 0; row < row_count; row++) { + uint8_t* scan_line = data_buf + row * row_size; + if ((row + 1) * row_size > (int)data_size) { + row_size = last_row_size; + } + TIFF_PredictLine(scan_line, row_size, BitsPerComponent, Colors, Columns); + } + return true; +} + +void FlateUncompress(const uint8_t* src_buf, + uint32_t src_size, + uint32_t orig_size, + uint8_t*& dest_buf, + uint32_t& dest_size, + uint32_t& offset) { + uint32_t guess_size = orig_size ? orig_size : src_size * 2; + const uint32_t kStepSize = 10240; + uint32_t alloc_step = orig_size ? kStepSize : std::min(src_size, kStepSize); + static const uint32_t kMaxInitialAllocSize = 10000000; + if (guess_size > kMaxInitialAllocSize) { + guess_size = kMaxInitialAllocSize; + alloc_step = kMaxInitialAllocSize; + } + uint32_t buf_size = guess_size; + uint32_t last_buf_size = buf_size; + + dest_buf = nullptr; + dest_size = 0; + void* context = FPDFAPI_FlateInit(my_alloc_func, my_free_func); + if (!context) + return; + + std::unique_ptr guess_buf( + FX_Alloc(uint8_t, guess_size + 1)); + guess_buf.get()[guess_size] = '\0'; + + FPDFAPI_FlateInput(context, src_buf, src_size); + + if (src_size < kStepSize) { + // This is the old implementation. + uint8_t* cur_buf = guess_buf.get(); + while (1) { + int32_t ret = FPDFAPI_FlateOutput(context, cur_buf, buf_size); + if (ret != Z_OK) + break; + int32_t avail_buf_size = FPDFAPI_FlateGetAvailOut(context); + if (avail_buf_size != 0) + break; + + uint32_t old_size = guess_size; + guess_size += alloc_step; + if (guess_size < old_size || guess_size + 1 < guess_size) { + FPDFAPI_FlateEnd(context); + return; + } + + { + uint8_t* new_buf = + FX_Realloc(uint8_t, guess_buf.release(), guess_size + 1); + guess_buf.reset(new_buf); + } + guess_buf.get()[guess_size] = '\0'; + cur_buf = guess_buf.get() + old_size; + buf_size = guess_size - old_size; + } + dest_size = FPDFAPI_FlateGetTotalOut(context); + offset = FPDFAPI_FlateGetTotalIn(context); + if (guess_size / 2 > dest_size) { + { + uint8_t* new_buf = + FX_Realloc(uint8_t, guess_buf.release(), dest_size + 1); + guess_buf.reset(new_buf); + } + guess_size = dest_size; + guess_buf.get()[guess_size] = '\0'; + } + dest_buf = guess_buf.release(); + } else { + std::vector result_tmp_bufs; + uint8_t* cur_buf = guess_buf.release(); + while (1) { + int32_t ret = FPDFAPI_FlateOutput(context, cur_buf, buf_size); + int32_t avail_buf_size = FPDFAPI_FlateGetAvailOut(context); + if (ret != Z_OK) { + last_buf_size = buf_size - avail_buf_size; + result_tmp_bufs.push_back(cur_buf); + break; + } + if (avail_buf_size != 0) { + last_buf_size = buf_size - avail_buf_size; + result_tmp_bufs.push_back(cur_buf); + break; + } + result_tmp_bufs.push_back(cur_buf); + cur_buf = FX_Alloc(uint8_t, buf_size + 1); + cur_buf[buf_size] = '\0'; + } + dest_size = FPDFAPI_FlateGetTotalOut(context); + offset = FPDFAPI_FlateGetTotalIn(context); + if (result_tmp_bufs.size() == 1) { + dest_buf = result_tmp_bufs[0]; + } else { + uint8_t* result_buf = FX_Alloc(uint8_t, dest_size); + uint32_t result_pos = 0; + for (size_t i = 0; i < result_tmp_bufs.size(); i++) { + uint8_t* tmp_buf = result_tmp_bufs[i]; + uint32_t tmp_buf_size = buf_size; + if (i == result_tmp_bufs.size() - 1) { + tmp_buf_size = last_buf_size; + } + FXSYS_memcpy(result_buf + result_pos, tmp_buf, tmp_buf_size); + result_pos += tmp_buf_size; + FX_Free(result_tmp_bufs[i]); + } + dest_buf = result_buf; + } + } + FPDFAPI_FlateEnd(context); +} + +} // namespace + +class CCodec_FlateScanlineDecoder : public CCodec_ScanlineDecoder { + public: + CCodec_FlateScanlineDecoder(); + ~CCodec_FlateScanlineDecoder() override; + + void Create(const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + int bpc, + int predictor, + int Colors, + int BitsPerComponent, + int Columns); + + // CCodec_ScanlineDecoder + bool v_Rewind() override; + uint8_t* v_GetNextLine() override; + uint32_t GetSrcOffset() override; + + void* m_pFlate; + const uint8_t* m_SrcBuf; + uint32_t m_SrcSize; + uint8_t* m_pScanline; + uint8_t* m_pLastLine; + uint8_t* m_pPredictBuffer; + uint8_t* m_pPredictRaw; + int m_Predictor; + int m_Colors; + int m_BitsPerComponent; + int m_Columns; + uint32_t m_PredictPitch; + size_t m_LeftOver; +}; + +CCodec_FlateScanlineDecoder::CCodec_FlateScanlineDecoder() { + m_pFlate = nullptr; + m_pScanline = nullptr; + m_pLastLine = nullptr; + m_pPredictBuffer = nullptr; + m_pPredictRaw = nullptr; + m_LeftOver = 0; +} +CCodec_FlateScanlineDecoder::~CCodec_FlateScanlineDecoder() { + FX_Free(m_pScanline); + FX_Free(m_pLastLine); + FX_Free(m_pPredictBuffer); + FX_Free(m_pPredictRaw); + if (m_pFlate) { + FPDFAPI_FlateEnd(m_pFlate); + } +} +void CCodec_FlateScanlineDecoder::Create(const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + int bpc, + int predictor, + int Colors, + int BitsPerComponent, + int Columns) { + m_SrcBuf = src_buf; + m_SrcSize = src_size; + m_OutputWidth = m_OrigWidth = width; + m_OutputHeight = m_OrigHeight = height; + m_nComps = nComps; + m_bpc = bpc; + m_Pitch = (static_cast(width) * nComps * bpc + 7) / 8; + m_pScanline = FX_Alloc(uint8_t, m_Pitch); + m_Predictor = 0; + if (predictor) { + if (predictor >= 10) { + m_Predictor = 2; + } else if (predictor == 2) { + m_Predictor = 1; + } + if (m_Predictor) { + if (BitsPerComponent * Colors * Columns == 0) { + BitsPerComponent = m_bpc; + Colors = m_nComps; + Columns = m_OrigWidth; + } + m_Colors = Colors; + m_BitsPerComponent = BitsPerComponent; + m_Columns = Columns; + m_PredictPitch = + (static_cast(m_BitsPerComponent) * m_Colors * m_Columns + + 7) / + 8; + m_pLastLine = FX_Alloc(uint8_t, m_PredictPitch); + m_pPredictRaw = FX_Alloc(uint8_t, m_PredictPitch + 1); + m_pPredictBuffer = FX_Alloc(uint8_t, m_PredictPitch); + } + } +} +bool CCodec_FlateScanlineDecoder::v_Rewind() { + if (m_pFlate) { + FPDFAPI_FlateEnd(m_pFlate); + } + m_pFlate = FPDFAPI_FlateInit(my_alloc_func, my_free_func); + if (!m_pFlate) { + return false; + } + FPDFAPI_FlateInput(m_pFlate, m_SrcBuf, m_SrcSize); + m_LeftOver = 0; + return true; +} +uint8_t* CCodec_FlateScanlineDecoder::v_GetNextLine() { + if (m_Predictor) { + if (m_Pitch == m_PredictPitch) { + if (m_Predictor == 2) { + FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1); + PNG_PredictLine(m_pScanline, m_pPredictRaw, m_pLastLine, + m_BitsPerComponent, m_Colors, m_Columns); + FXSYS_memcpy(m_pLastLine, m_pScanline, m_PredictPitch); + } else { + FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch); + TIFF_PredictLine(m_pScanline, m_PredictPitch, m_bpc, m_nComps, + m_OutputWidth); + } + } else { + size_t bytes_to_go = m_Pitch; + size_t read_leftover = + m_LeftOver > bytes_to_go ? bytes_to_go : m_LeftOver; + if (read_leftover) { + FXSYS_memcpy(m_pScanline, + m_pPredictBuffer + m_PredictPitch - m_LeftOver, + read_leftover); + m_LeftOver -= read_leftover; + bytes_to_go -= read_leftover; + } + while (bytes_to_go) { + if (m_Predictor == 2) { + FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1); + PNG_PredictLine(m_pPredictBuffer, m_pPredictRaw, m_pLastLine, + m_BitsPerComponent, m_Colors, m_Columns); + FXSYS_memcpy(m_pLastLine, m_pPredictBuffer, m_PredictPitch); + } else { + FPDFAPI_FlateOutput(m_pFlate, m_pPredictBuffer, m_PredictPitch); + TIFF_PredictLine(m_pPredictBuffer, m_PredictPitch, m_BitsPerComponent, + m_Colors, m_Columns); + } + size_t read_bytes = + m_PredictPitch > bytes_to_go ? bytes_to_go : m_PredictPitch; + FXSYS_memcpy(m_pScanline + m_Pitch - bytes_to_go, m_pPredictBuffer, + read_bytes); + m_LeftOver += m_PredictPitch - read_bytes; + bytes_to_go -= read_bytes; + } + } + } else { + FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch); + } + return m_pScanline; +} +uint32_t CCodec_FlateScanlineDecoder::GetSrcOffset() { + return FPDFAPI_FlateGetTotalIn(m_pFlate); +} + +std::unique_ptr CCodec_FlateModule::CreateDecoder( + const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + int bpc, + int predictor, + int Colors, + int BitsPerComponent, + int Columns) { + auto pDecoder = pdfium::MakeUnique(); + pDecoder->Create(src_buf, src_size, width, height, nComps, bpc, predictor, + Colors, BitsPerComponent, Columns); + return std::move(pDecoder); +} + +uint32_t CCodec_FlateModule::FlateOrLZWDecode(bool bLZW, + const uint8_t* src_buf, + uint32_t src_size, + bool bEarlyChange, + int predictor, + int Colors, + int BitsPerComponent, + int Columns, + uint32_t estimated_size, + uint8_t*& dest_buf, + uint32_t& dest_size) { + dest_buf = nullptr; + uint32_t offset = 0; + int predictor_type = 0; + if (predictor) { + if (predictor >= 10) { + predictor_type = 2; + } else if (predictor == 2) { + predictor_type = 1; + } + } + if (bLZW) { + { + std::unique_ptr decoder(new CLZWDecoder); + dest_size = (uint32_t)-1; + offset = src_size; + int err = + decoder->Decode(nullptr, dest_size, src_buf, offset, bEarlyChange); + if (err || dest_size == 0 || dest_size + 1 < dest_size) { + return FX_INVALID_OFFSET; + } + } + { + std::unique_ptr decoder(new CLZWDecoder); + dest_buf = FX_Alloc(uint8_t, dest_size + 1); + dest_buf[dest_size] = '\0'; + decoder->Decode(dest_buf, dest_size, src_buf, offset, bEarlyChange); + } + } else { + FlateUncompress(src_buf, src_size, estimated_size, dest_buf, dest_size, + offset); + } + if (predictor_type == 0) { + return offset; + } + bool ret = true; + if (predictor_type == 2) { + ret = PNG_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, Columns); + } else if (predictor_type == 1) { + ret = + TIFF_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, Columns); + } + return ret ? offset : FX_INVALID_OFFSET; +} + +bool CCodec_FlateModule::Encode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t** dest_buf, + uint32_t* dest_size) { + *dest_size = src_size + src_size / 1000 + 12; + *dest_buf = FX_Alloc(uint8_t, *dest_size); + unsigned long temp_size = *dest_size; + if (!FPDFAPI_FlateCompress(*dest_buf, &temp_size, src_buf, src_size)) + return false; + + *dest_size = (uint32_t)temp_size; + return true; +} + +bool CCodec_FlateModule::PngEncode(const uint8_t* src_buf, + uint32_t src_size, + uint8_t** dest_buf, + uint32_t* dest_size) { + uint8_t* pSrcBuf = FX_Alloc(uint8_t, src_size); + FXSYS_memcpy(pSrcBuf, src_buf, src_size); + PNG_PredictorEncode(&pSrcBuf, &src_size); + bool ret = Encode(pSrcBuf, src_size, dest_buf, dest_size); + FX_Free(pSrcBuf); + return ret; +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_icc.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_icc.cpp new file mode 100644 index 000000000000..47b1f9011cfa --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_icc.cpp @@ -0,0 +1,1667 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/fx_codec.h" +#include "third_party/lcms2-2.6/include/lcms2.h" + +struct CLcmsCmm { + cmsHTRANSFORM m_hTransform; + int m_nSrcComponents; + int m_nDstComponents; + bool m_bLab; +}; +bool CheckComponents(cmsColorSpaceSignature cs, int nComponents, bool bDst) { + if (nComponents <= 0 || nComponents > 15) { + return false; + } + switch (cs) { + case cmsSigLabData: + if (nComponents < 3) { + return false; + } + break; + case cmsSigGrayData: + if (bDst && nComponents != 1) { + return false; + } + if (!bDst && nComponents > 2) { + return false; + } + break; + case cmsSigRgbData: + if (bDst && nComponents != 3) { + return false; + } + break; + case cmsSigCmykData: + if (bDst && nComponents != 4) { + return false; + } + break; + default: + if (nComponents != 3) { + return false; + } + break; + } + return true; +} + +void* IccLib_CreateTransform(const unsigned char* pSrcProfileData, + uint32_t dwSrcProfileSize, + uint32_t& nSrcComponents, + const unsigned char* pDstProfileData, + uint32_t dwDstProfileSize, + int32_t nDstComponents, + int intent, + uint32_t dwSrcFormat = Icc_FORMAT_DEFAULT, + uint32_t dwDstFormat = Icc_FORMAT_DEFAULT) { + nSrcComponents = 0; + cmsHPROFILE srcProfile = + cmsOpenProfileFromMem((void*)pSrcProfileData, dwSrcProfileSize); + if (!srcProfile) + return nullptr; + + cmsHPROFILE dstProfile; + if (!pDstProfileData && dwDstProfileSize == 0 && nDstComponents == 3) { + dstProfile = cmsCreate_sRGBProfile(); + } else { + dstProfile = + cmsOpenProfileFromMem((void*)pDstProfileData, dwDstProfileSize); + } + if (!dstProfile) { + cmsCloseProfile(srcProfile); + return nullptr; + } + int srcFormat; + bool bLab = false; + cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile); + + nSrcComponents = cmsChannelsOf(srcCS); + // According to PDF spec, number of components must be 1, 3, or 4. + if (nSrcComponents != 1 && nSrcComponents != 3 && nSrcComponents != 4) { + cmsCloseProfile(srcProfile); + cmsCloseProfile(dstProfile); + return nullptr; + } + + if (srcCS == cmsSigLabData) { + srcFormat = + COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0); + bLab = true; + } else { + srcFormat = + COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1); + if (srcCS == cmsSigRgbData && T_DOSWAP(dwSrcFormat)) { + srcFormat |= DOSWAP_SH(1); + } + } + cmsColorSpaceSignature dstCS = cmsGetColorSpace(dstProfile); + if (!CheckComponents(dstCS, nDstComponents, true)) { + cmsCloseProfile(srcProfile); + cmsCloseProfile(dstProfile); + return nullptr; + } + + cmsHTRANSFORM hTransform = nullptr; + switch (dstCS) { + case cmsSigGrayData: + hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, + TYPE_GRAY_8, intent, 0); + break; + case cmsSigRgbData: + hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, + TYPE_BGR_8, intent, 0); + break; + case cmsSigCmykData: + hTransform = cmsCreateTransform( + srcProfile, srcFormat, dstProfile, + T_DOSWAP(dwDstFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8, intent, 0); + break; + default: + break; + } + if (!hTransform) { + cmsCloseProfile(srcProfile); + cmsCloseProfile(dstProfile); + return nullptr; + } + CLcmsCmm* pCmm = new CLcmsCmm; + pCmm->m_nSrcComponents = nSrcComponents; + pCmm->m_nDstComponents = nDstComponents; + pCmm->m_hTransform = hTransform; + pCmm->m_bLab = bLab; + cmsCloseProfile(srcProfile); + cmsCloseProfile(dstProfile); + return pCmm; +} +void* IccLib_CreateTransform_sRGB(const unsigned char* pProfileData, + uint32_t dwProfileSize, + uint32_t& nComponents, + int32_t intent, + uint32_t dwSrcFormat) { + return IccLib_CreateTransform(pProfileData, dwProfileSize, nComponents, + nullptr, 0, 3, intent, dwSrcFormat); +} +void IccLib_DestroyTransform(void* pTransform) { + if (!pTransform) { + return; + } + cmsDeleteTransform(((CLcmsCmm*)pTransform)->m_hTransform); + delete (CLcmsCmm*)pTransform; +} +void IccLib_Translate(void* pTransform, + uint32_t nSrcComponents, + FX_FLOAT* pSrcValues, + FX_FLOAT* pDestValues) { + if (!pTransform) { + return; + } + CLcmsCmm* p = (CLcmsCmm*)pTransform; + uint8_t output[4]; + if (p->m_bLab) { + CFX_FixedBufGrow inputs(nSrcComponents); + double* input = inputs; + for (uint32_t i = 0; i < nSrcComponents; i++) { + input[i] = pSrcValues[i]; + } + cmsDoTransform(p->m_hTransform, input, output, 1); + } else { + CFX_FixedBufGrow inputs(nSrcComponents); + uint8_t* input = inputs; + for (uint32_t i = 0; i < nSrcComponents; i++) { + if (pSrcValues[i] > 1.0f) { + input[i] = 255; + } else if (pSrcValues[i] < 0) { + input[i] = 0; + } else { + input[i] = (int)(pSrcValues[i] * 255.0f); + } + } + cmsDoTransform(p->m_hTransform, input, output, 1); + } + switch (p->m_nDstComponents) { + case 1: + pDestValues[0] = output[0] / 255.0f; + break; + case 3: + pDestValues[0] = output[2] / 255.0f; + pDestValues[1] = output[1] / 255.0f; + pDestValues[2] = output[0] / 255.0f; + break; + case 4: + pDestValues[0] = output[0] / 255.0f; + pDestValues[1] = output[1] / 255.0f; + pDestValues[2] = output[2] / 255.0f; + pDestValues[3] = output[3] / 255.0f; + break; + } +} +void IccLib_TranslateImage(void* pTransform, + unsigned char* pDest, + const unsigned char* pSrc, + int32_t pixels) { + cmsDoTransform(((CLcmsCmm*)pTransform)->m_hTransform, (void*)pSrc, pDest, + pixels); +} + +CCodec_IccModule::CCodec_IccModule() : m_nComponents(0) {} + +CCodec_IccModule::~CCodec_IccModule() { +} +void* CCodec_IccModule::CreateTransform_sRGB(const uint8_t* pProfileData, + uint32_t dwProfileSize, + uint32_t& nComponents, + int32_t intent, + uint32_t dwSrcFormat) { + return IccLib_CreateTransform_sRGB(pProfileData, dwProfileSize, nComponents, + intent, dwSrcFormat); +} + +void CCodec_IccModule::DestroyTransform(void* pTransform) { + IccLib_DestroyTransform(pTransform); +} +void CCodec_IccModule::Translate(void* pTransform, + FX_FLOAT* pSrcValues, + FX_FLOAT* pDestValues) { + IccLib_Translate(pTransform, m_nComponents, pSrcValues, pDestValues); +} +void CCodec_IccModule::TranslateScanline(void* pTransform, + uint8_t* pDest, + const uint8_t* pSrc, + int32_t pixels) { + IccLib_TranslateImage(pTransform, pDest, pSrc, pixels); +} +const uint8_t g_CMYKSamples[81 * 81 * 3] = { + 255, 255, 255, 225, 226, 228, 199, 200, 202, 173, 174, 178, 147, 149, 152, + 123, 125, 128, 99, 99, 102, 69, 70, 71, 34, 30, 31, 255, 253, 229, + 226, 224, 203, 200, 199, 182, 173, 173, 158, 149, 148, 135, 125, 124, 113, + 99, 99, 90, 70, 69, 63, 33, 29, 24, 255, 251, 204, 228, 223, 182, + 201, 198, 163, 174, 172, 142, 150, 147, 122, 125, 123, 101, 99, 98, 80, + 70, 68, 54, 32, 28, 16, 255, 249, 179, 230, 222, 160, 203, 197, 144, + 174, 170, 124, 150, 145, 105, 125, 122, 88, 99, 97, 69, 70, 68, 46, + 31, 28, 6, 255, 247, 154, 229, 220, 138, 203, 195, 122, 176, 169, 107, + 150, 145, 91, 125, 121, 74, 100, 96, 57, 70, 67, 35, 29, 26, 0, + 255, 246, 128, 231, 217, 114, 205, 194, 101, 176, 167, 88, 150, 144, 75, + 125, 120, 60, 100, 96, 44, 70, 66, 24, 28, 26, 0, 255, 244, 96, + 231, 217, 87, 203, 192, 78, 175, 167, 66, 150, 143, 56, 125, 119, 43, + 100, 95, 29, 69, 66, 7, 26, 26, 0, 255, 243, 51, 232, 215, 51, + 204, 191, 43, 176, 165, 38, 150, 142, 28, 125, 118, 17, 99, 94, 0, + 68, 65, 0, 24, 25, 0, 255, 241, 0, 231, 215, 0, 203, 190, 0, + 176, 164, 0, 150, 141, 0, 126, 117, 0, 99, 93, 0, 68, 65, 0, + 24, 25, 0, 252, 228, 238, 222, 201, 211, 197, 180, 190, 171, 156, 166, + 147, 133, 143, 123, 111, 119, 99, 88, 94, 71, 61, 66, 34, 22, 26, + 254, 226, 213, 224, 201, 191, 199, 179, 171, 172, 155, 148, 147, 133, 128, + 123, 110, 106, 98, 87, 83, 70, 59, 57, 33, 21, 18, 254, 224, 191, + 224, 199, 172, 200, 177, 153, 173, 154, 133, 147, 132, 115, 123, 109, 94, + 98, 86, 74, 70, 59, 49, 32, 21, 9, 255, 222, 168, 227, 198, 150, + 200, 175, 135, 173, 153, 118, 148, 130, 99, 123, 109, 82, 98, 86, 64, + 69, 58, 40, 31, 19, 0, 255, 221, 145, 227, 196, 129, 201, 174, 115, + 173, 151, 99, 148, 129, 85, 124, 108, 69, 98, 85, 52, 69, 58, 30, + 30, 19, 0, 255, 219, 121, 227, 195, 109, 201, 174, 97, 174, 150, 83, + 148, 129, 70, 124, 107, 55, 98, 84, 40, 69, 58, 19, 28, 18, 0, + 255, 218, 92, 229, 194, 82, 202, 173, 75, 174, 150, 63, 149, 128, 51, + 124, 106, 39, 98, 84, 24, 68, 57, 3, 26, 18, 0, 255, 217, 54, + 228, 193, 52, 201, 172, 46, 174, 148, 36, 148, 127, 27, 123, 105, 14, + 98, 83, 0, 68, 56, 0, 25, 18, 0, 255, 216, 0, 229, 192, 2, + 202, 171, 4, 173, 148, 0, 148, 126, 0, 124, 105, 0, 98, 83, 0, + 68, 56, 0, 24, 17, 0, 249, 204, 223, 219, 181, 199, 195, 160, 178, + 170, 140, 156, 146, 119, 134, 123, 99, 112, 98, 77, 88, 70, 52, 61, + 34, 11, 20, 250, 201, 200, 221, 180, 178, 197, 159, 161, 171, 139, 139, + 147, 119, 120, 123, 98, 99, 98, 77, 78, 69, 51, 52, 34, 11, 10, + 252, 201, 180, 223, 179, 162, 197, 159, 144, 170, 138, 125, 146, 117, 107, + 122, 97, 89, 98, 76, 69, 69, 50, 44, 32, 11, 2, 252, 199, 158, + 222, 177, 143, 199, 158, 127, 171, 137, 110, 147, 117, 93, 122, 96, 76, + 97, 75, 58, 69, 50, 36, 32, 10, 0, 253, 198, 137, 223, 177, 123, + 198, 156, 110, 171, 136, 95, 146, 116, 80, 122, 96, 65, 97, 75, 47, + 69, 50, 25, 30, 10, 0, 254, 197, 115, 225, 175, 104, 198, 156, 92, + 172, 135, 79, 147, 115, 66, 123, 95, 52, 98, 74, 37, 69, 49, 15, + 29, 10, 0, 254, 196, 89, 224, 175, 80, 199, 154, 70, 172, 134, 59, + 146, 114, 48, 122, 95, 36, 97, 74, 21, 68, 49, 0, 27, 9, 0, + 255, 195, 57, 225, 173, 52, 198, 154, 44, 172, 133, 36, 147, 113, 26, + 123, 94, 14, 98, 74, 0, 68, 49, 0, 26, 10, 0, 254, 194, 15, + 225, 172, 12, 198, 153, 7, 172, 132, 3, 146, 113, 0, 123, 93, 0, + 98, 73, 0, 68, 49, 0, 26, 9, 0, 246, 178, 209, 218, 159, 186, + 194, 140, 166, 168, 122, 145, 144, 104, 125, 121, 85, 103, 97, 65, 81, + 69, 41, 55, 34, 0, 12, 248, 176, 186, 219, 157, 166, 195, 139, 149, + 168, 121, 130, 144, 103, 111, 121, 85, 91, 97, 65, 71, 69, 41, 46, + 34, 0, 4, 249, 175, 168, 220, 156, 150, 196, 139, 135, 169, 121, 116, + 144, 103, 100, 122, 84, 83, 98, 65, 63, 70, 41, 39, 33, 0, 0, + 249, 175, 148, 220, 155, 133, 196, 138, 119, 169, 120, 103, 145, 101, 87, + 121, 83, 71, 97, 65, 54, 69, 41, 31, 32, 0, 0, 249, 173, 128, + 222, 154, 115, 195, 137, 102, 170, 119, 88, 145, 101, 74, 122, 83, 59, + 97, 64, 43, 68, 40, 20, 30, 0, 0, 250, 172, 108, 221, 154, 98, + 195, 136, 86, 170, 118, 73, 145, 100, 61, 122, 82, 48, 97, 63, 32, + 69, 40, 11, 28, 0, 0, 250, 171, 85, 221, 153, 76, 196, 136, 67, + 170, 117, 56, 145, 99, 44, 121, 82, 33, 97, 63, 17, 68, 40, 0, + 28, 0, 0, 251, 171, 58, 222, 152, 50, 197, 135, 43, 169, 117, 34, + 146, 99, 25, 121, 81, 10, 96, 63, 0, 68, 40, 0, 27, 0, 0, + 250, 170, 26, 222, 151, 19, 196, 134, 13, 169, 116, 4, 145, 99, 0, + 122, 81, 0, 97, 63, 0, 67, 40, 0, 26, 0, 0, 244, 153, 194, + 215, 136, 173, 192, 121, 155, 167, 104, 135, 143, 89, 115, 121, 72, 96, + 97, 54, 75, 70, 31, 49, 34, 0, 6, 245, 153, 173, 216, 136, 155, + 192, 120, 138, 167, 104, 121, 144, 88, 103, 121, 71, 85, 97, 54, 66, + 69, 31, 42, 34, 0, 0, 246, 152, 157, 217, 135, 140, 193, 120, 126, + 167, 103, 109, 143, 88, 92, 121, 72, 76, 97, 54, 58, 69, 31, 35, + 33, 0, 0, 245, 150, 139, 218, 134, 125, 193, 119, 111, 167, 103, 96, + 144, 87, 80, 121, 71, 66, 96, 53, 49, 68, 31, 26, 32, 0, 0, + 246, 151, 122, 218, 133, 108, 194, 118, 96, 168, 102, 81, 144, 86, 69, + 120, 71, 55, 95, 53, 39, 68, 30, 17, 31, 0, 0, 248, 150, 103, + 218, 133, 91, 193, 118, 81, 168, 102, 69, 143, 86, 56, 120, 70, 43, + 96, 53, 28, 68, 31, 6, 29, 0, 0, 247, 149, 81, 218, 132, 72, + 194, 117, 62, 168, 101, 52, 144, 86, 42, 121, 70, 29, 96, 52, 13, + 68, 30, 0, 28, 0, 0, 247, 148, 55, 219, 131, 50, 194, 117, 43, + 167, 101, 32, 144, 85, 22, 120, 69, 8, 96, 52, 0, 67, 30, 0, + 27, 0, 0, 247, 147, 29, 218, 131, 24, 194, 116, 20, 168, 100, 11, + 144, 85, 0, 120, 69, 0, 96, 52, 0, 67, 30, 0, 26, 0, 0, + 242, 130, 179, 214, 114, 160, 190, 101, 143, 166, 87, 125, 143, 72, 107, + 120, 58, 88, 96, 42, 68, 69, 17, 44, 35, 0, 0, 243, 129, 161, + 215, 114, 143, 191, 101, 128, 166, 87, 113, 143, 73, 96, 120, 58, 79, + 96, 41, 60, 69, 18, 37, 33, 0, 0, 243, 129, 146, 216, 114, 130, + 192, 101, 117, 166, 87, 101, 143, 72, 86, 121, 58, 69, 96, 42, 52, + 69, 18, 29, 31, 0, 0, 243, 128, 130, 216, 114, 115, 191, 101, 102, + 165, 86, 88, 142, 72, 75, 120, 58, 60, 95, 42, 43, 68, 19, 21, + 30, 0, 0, 244, 127, 112, 217, 113, 101, 192, 99, 89, 166, 85, 75, + 142, 72, 63, 119, 57, 50, 96, 41, 35, 68, 19, 13, 30, 0, 0, + 244, 127, 96, 216, 112, 86, 191, 99, 75, 166, 86, 64, 143, 72, 52, + 120, 57, 40, 95, 41, 24, 67, 20, 1, 29, 0, 0, 245, 126, 77, + 216, 113, 68, 191, 100, 59, 166, 85, 49, 142, 71, 38, 119, 57, 26, + 95, 41, 10, 67, 20, 0, 28, 0, 0, 244, 126, 55, 216, 112, 48, + 191, 99, 40, 166, 85, 31, 143, 71, 20, 119, 57, 6, 95, 42, 0, + 67, 20, 0, 28, 0, 0, 245, 126, 33, 217, 112, 26, 192, 99, 22, + 166, 84, 11, 142, 70, 0, 119, 57, 0, 95, 41, 0, 66, 20, 0, + 27, 0, 0, 241, 102, 167, 213, 90, 149, 189, 79, 133, 165, 66, 115, + 141, 54, 98, 119, 41, 81, 96, 25, 63, 69, 0, 38, 30, 0, 0, + 241, 102, 149, 213, 90, 133, 189, 79, 119, 165, 66, 103, 142, 55, 88, + 119, 41, 71, 96, 25, 53, 69, 0, 31, 28, 0, 0, 241, 102, 135, + 214, 90, 121, 190, 79, 108, 165, 66, 92, 141, 55, 78, 119, 42, 63, + 96, 26, 46, 69, 0, 24, 28, 0, 0, 241, 101, 120, 214, 90, 107, + 189, 79, 95, 165, 67, 83, 141, 54, 68, 118, 41, 54, 95, 27, 39, + 68, 0, 16, 27, 0, 0, 241, 102, 106, 213, 90, 93, 189, 78, 82, + 164, 67, 70, 141, 55, 58, 118, 42, 45, 94, 27, 29, 67, 2, 6, + 27, 0, 0, 242, 101, 90, 214, 89, 79, 190, 79, 69, 166, 67, 59, + 141, 55, 47, 118, 41, 35, 95, 27, 19, 67, 3, 0, 26, 0, 0, + 242, 102, 72, 213, 89, 63, 191, 79, 56, 164, 67, 45, 141, 55, 34, + 118, 42, 22, 94, 28, 6, 67, 3, 0, 26, 0, 0, 242, 100, 51, + 214, 89, 45, 190, 78, 38, 164, 67, 30, 141, 55, 18, 118, 42, 3, + 95, 28, 0, 66, 4, 0, 26, 0, 0, 243, 100, 33, 214, 90, 27, + 190, 78, 22, 165, 67, 13, 141, 55, 0, 118, 43, 0, 94, 29, 0, + 66, 5, 0, 26, 0, 0, 237, 69, 153, 211, 58, 135, 187, 51, 121, + 163, 41, 105, 141, 28, 90, 118, 15, 73, 96, 0, 56, 68, 0, 33, + 25, 0, 0, 239, 67, 137, 212, 60, 123, 189, 50, 110, 163, 41, 94, + 141, 29, 79, 118, 17, 65, 95, 0, 48, 69, 0, 26, 25, 0, 0, + 240, 69, 124, 211, 60, 111, 188, 50, 98, 163, 42, 85, 141, 31, 72, + 118, 18, 57, 94, 0, 41, 68, 0, 19, 25, 0, 0, 240, 70, 112, + 212, 61, 99, 188, 52, 87, 163, 41, 74, 140, 31, 62, 118, 20, 48, + 94, 2, 32, 68, 0, 11, 24, 0, 0, 239, 70, 98, 212, 62, 86, + 188, 53, 77, 164, 42, 64, 140, 32, 52, 118, 20, 40, 94, 3, 24, + 67, 0, 3, 23, 0, 0, 239, 71, 85, 212, 61, 74, 187, 53, 65, + 163, 44, 54, 140, 34, 43, 118, 22, 30, 95, 3, 14, 67, 0, 0, + 23, 0, 0, 239, 70, 67, 212, 62, 59, 188, 53, 51, 163, 45, 42, + 141, 34, 31, 117, 22, 17, 94, 5, 2, 66, 0, 0, 23, 0, 0, + 239, 71, 50, 213, 62, 43, 188, 54, 37, 164, 45, 28, 139, 34, 16, + 117, 22, 2, 94, 7, 0, 65, 0, 0, 23, 0, 0, 240, 71, 34, + 212, 63, 29, 189, 54, 24, 163, 46, 15, 139, 36, 2, 117, 25, 0, + 94, 8, 0, 66, 0, 0, 23, 0, 0, 237, 0, 140, 209, 0, 124, + 186, 0, 112, 162, 0, 97, 141, 0, 82, 118, 0, 67, 95, 0, 49, + 68, 0, 27, 20, 0, 0, 237, 0, 126, 210, 0, 113, 187, 0, 99, + 163, 0, 86, 139, 0, 72, 118, 0, 58, 95, 0, 42, 67, 0, 20, + 20, 0, 0, 237, 1, 114, 209, 1, 102, 187, 0, 90, 163, 0, 78, + 139, 0, 64, 118, 0, 50, 95, 0, 35, 67, 0, 13, 20, 0, 0, + 236, 16, 102, 209, 7, 91, 186, 0, 80, 162, 0, 68, 139, 0, 56, + 117, 0, 43, 94, 0, 27, 67, 0, 6, 20, 0, 0, 238, 15, 89, + 209, 13, 79, 186, 6, 69, 162, 0, 58, 139, 0, 47, 117, 0, 34, + 93, 0, 20, 66, 0, 2, 20, 0, 0, 237, 20, 78, 210, 12, 68, + 187, 4, 59, 163, 0, 49, 139, 0, 38, 116, 0, 26, 94, 0, 11, + 66, 0, 0, 20, 0, 0, 237, 25, 64, 210, 18, 56, 186, 11, 48, + 162, 4, 39, 138, 0, 27, 117, 0, 14, 93, 0, 0, 66, 0, 0, + 20, 0, 0, 238, 25, 48, 210, 22, 43, 186, 15, 35, 162, 8, 26, + 140, 0, 14, 117, 0, 0, 93, 0, 0, 65, 0, 0, 20, 0, 0, + 238, 28, 35, 210, 21, 30, 187, 15, 24, 162, 8, 16, 139, 1, 2, + 117, 0, 0, 93, 0, 0, 65, 0, 0, 22, 0, 0, 219, 242, 252, + 195, 214, 225, 172, 191, 201, 148, 165, 175, 127, 142, 150, 106, 119, 126, + 84, 95, 101, 58, 66, 72, 24, 27, 32, 222, 239, 226, 196, 213, 202, + 173, 189, 180, 150, 165, 158, 129, 141, 135, 107, 118, 113, 85, 94, 90, + 58, 66, 63, 21, 26, 24, 223, 237, 203, 198, 211, 182, 175, 188, 163, + 152, 164, 141, 129, 140, 121, 107, 117, 101, 85, 93, 80, 58, 64, 54, + 21, 26, 18, 226, 236, 179, 201, 210, 160, 177, 187, 143, 153, 162, 125, + 130, 139, 106, 108, 116, 89, 85, 92, 69, 58, 64, 45, 20, 25, 8, + 227, 234, 153, 201, 208, 139, 178, 185, 124, 154, 161, 107, 131, 138, 91, + 108, 115, 75, 85, 91, 58, 58, 63, 35, 17, 25, 0, 229, 233, 130, + 203, 207, 116, 178, 184, 104, 154, 160, 90, 131, 137, 76, 109, 114, 62, + 85, 90, 46, 58, 63, 25, 16, 24, 0, 230, 231, 100, 202, 205, 90, + 179, 183, 80, 154, 159, 69, 131, 136, 57, 109, 113, 46, 86, 90, 32, + 58, 63, 10, 14, 24, 0, 230, 230, 65, 204, 204, 58, 180, 182, 52, + 155, 157, 44, 132, 135, 35, 110, 113, 24, 86, 89, 9, 57, 62, 0, + 11, 24, 0, 232, 230, 19, 204, 204, 19, 180, 181, 17, 155, 157, 10, + 131, 134, 2, 109, 112, 0, 85, 89, 0, 57, 62, 0, 10, 23, 0, + 218, 216, 236, 194, 192, 211, 172, 171, 188, 149, 149, 164, 128, 127, 141, + 106, 106, 119, 84, 84, 94, 59, 57, 66, 25, 18, 26, 221, 214, 211, + 196, 191, 190, 174, 170, 170, 150, 148, 148, 128, 126, 127, 107, 105, 106, + 85, 83, 84, 59, 56, 58, 23, 17, 18, 222, 213, 190, 197, 189, 170, + 175, 169, 153, 151, 147, 133, 129, 126, 113, 108, 105, 94, 85, 82, 74, + 59, 56, 49, 22, 17, 11, 224, 211, 168, 199, 188, 151, 175, 168, 135, + 152, 146, 117, 129, 124, 99, 107, 103, 82, 84, 82, 64, 59, 55, 41, + 21, 17, 1, 224, 210, 145, 199, 187, 130, 176, 166, 117, 152, 145, 101, + 129, 123, 86, 107, 103, 70, 85, 81, 53, 58, 55, 31, 19, 17, 0, + 227, 208, 123, 200, 186, 110, 177, 165, 98, 153, 143, 84, 130, 122, 70, + 108, 102, 57, 85, 80, 41, 58, 54, 20, 18, 16, 0, 227, 208, 97, + 202, 185, 86, 177, 164, 77, 153, 142, 65, 130, 122, 54, 108, 101, 42, + 85, 80, 27, 58, 54, 7, 16, 16, 0, 228, 206, 66, 202, 184, 58, + 178, 163, 50, 154, 141, 42, 131, 121, 33, 109, 101, 21, 86, 79, 5, + 58, 54, 0, 13, 16, 0, 228, 206, 29, 202, 183, 25, 178, 163, 20, + 154, 141, 15, 131, 121, 5, 108, 100, 0, 85, 79, 0, 58, 53, 0, + 13, 16, 0, 217, 193, 221, 193, 172, 198, 172, 153, 178, 149, 133, 154, + 128, 114, 132, 107, 94, 111, 85, 74, 89, 59, 49, 61, 25, 8, 22, + 219, 191, 198, 195, 171, 178, 173, 153, 159, 149, 132, 139, 128, 113, 119, + 107, 94, 100, 85, 73, 79, 59, 48, 52, 25, 7, 14, 221, 191, 180, + 196, 170, 160, 174, 152, 144, 150, 132, 125, 129, 113, 107, 107, 93, 89, + 85, 73, 69, 59, 48, 45, 23, 7, 4, 222, 189, 159, 197, 169, 142, + 174, 151, 127, 151, 131, 110, 129, 112, 94, 108, 93, 78, 85, 72, 60, + 58, 47, 37, 22, 7, 0, 223, 188, 138, 197, 168, 123, 175, 150, 109, + 151, 130, 95, 130, 111, 81, 108, 92, 65, 85, 72, 49, 59, 47, 27, + 21, 7, 0, 224, 187, 118, 198, 167, 105, 176, 149, 93, 152, 129, 79, + 130, 110, 68, 108, 91, 54, 85, 71, 38, 59, 47, 17, 18, 7, 0, + 224, 187, 93, 199, 166, 83, 176, 148, 73, 152, 128, 62, 129, 109, 51, + 108, 90, 39, 85, 71, 25, 58, 46, 3, 16, 8, 0, 226, 186, 64, + 200, 165, 57, 177, 147, 50, 153, 127, 40, 130, 108, 31, 108, 90, 19, + 85, 70, 3, 58, 46, 0, 16, 8, 0, 227, 185, 35, 200, 165, 30, + 176, 146, 25, 152, 127, 18, 130, 108, 7, 108, 89, 0, 85, 70, 0, + 57, 46, 0, 14, 8, 0, 216, 169, 205, 192, 150, 184, 171, 134, 164, + 149, 116, 144, 128, 99, 124, 107, 81, 103, 85, 63, 81, 60, 39, 55, + 26, 0, 15, 217, 168, 186, 193, 150, 165, 172, 134, 149, 150, 116, 130, + 128, 99, 111, 107, 81, 92, 85, 62, 72, 59, 39, 47, 25, 0, 6, + 219, 168, 168, 194, 149, 150, 173, 133, 135, 150, 116, 117, 128, 98, 99, + 107, 80, 82, 86, 62, 63, 59, 38, 39, 24, 0, 0, 219, 166, 148, + 195, 149, 133, 173, 133, 119, 150, 115, 103, 128, 98, 88, 107, 80, 72, + 85, 61, 54, 59, 38, 32, 23, 0, 0, 220, 166, 129, 196, 148, 116, + 174, 132, 103, 151, 114, 89, 129, 97, 75, 107, 79, 60, 85, 61, 44, + 59, 38, 22, 21, 0, 0, 222, 164, 110, 197, 147, 99, 175, 131, 87, + 151, 113, 75, 129, 96, 63, 107, 79, 49, 85, 61, 33, 58, 38, 12, + 19, 0, 0, 222, 164, 88, 197, 146, 79, 174, 130, 69, 151, 113, 58, + 129, 95, 47, 107, 78, 35, 85, 60, 20, 58, 38, 0, 18, 0, 0, + 223, 164, 63, 198, 145, 55, 175, 129, 48, 151, 112, 39, 129, 95, 29, + 107, 78, 16, 85, 60, 1, 58, 38, 0, 17, 0, 0, 223, 163, 36, + 198, 145, 32, 174, 129, 26, 151, 111, 17, 129, 95, 7, 107, 78, 0, + 84, 60, 0, 57, 37, 0, 15, 0, 0, 215, 147, 192, 191, 130, 172, + 170, 116, 153, 148, 100, 133, 127, 85, 115, 107, 69, 96, 85, 51, 75, + 60, 28, 50, 25, 0, 8, 217, 146, 173, 192, 130, 154, 171, 115, 138, + 149, 100, 121, 128, 84, 103, 107, 68, 85, 85, 51, 66, 60, 28, 42, + 25, 0, 0, 217, 145, 157, 193, 129, 140, 173, 115, 125, 149, 100, 109, + 128, 84, 92, 107, 68, 76, 85, 51, 58, 59, 28, 35, 23, 0, 0, + 218, 145, 140, 193, 129, 125, 172, 114, 110, 149, 99, 96, 128, 83, 81, + 107, 67, 65, 84, 51, 49, 59, 29, 27, 22, 0, 0, 219, 144, 121, + 194, 128, 108, 172, 113, 96, 149, 98, 83, 128, 83, 69, 107, 68, 55, + 85, 50, 40, 59, 28, 18, 20, 0, 0, 220, 143, 104, 195, 128, 93, + 173, 114, 82, 150, 98, 69, 127, 82, 58, 107, 67, 45, 85, 50, 30, + 59, 28, 7, 19, 0, 0, 220, 143, 84, 195, 127, 74, 173, 113, 65, + 149, 97, 55, 128, 82, 44, 106, 67, 32, 84, 50, 16, 58, 28, 0, + 18, 0, 0, 221, 142, 62, 196, 126, 53, 173, 112, 46, 150, 97, 37, + 128, 82, 26, 107, 66, 14, 84, 50, 0, 58, 28, 0, 16, 0, 0, + 222, 142, 38, 196, 126, 34, 174, 112, 27, 150, 96, 17, 128, 82, 6, + 106, 66, 0, 84, 50, 0, 57, 29, 0, 16, 0, 0, 214, 123, 179, + 191, 110, 159, 169, 98, 143, 147, 84, 124, 126, 70, 106, 107, 55, 88, + 85, 39, 69, 60, 15, 45, 23, 0, 2, 216, 123, 161, 192, 110, 144, + 170, 98, 129, 148, 84, 112, 127, 70, 95, 107, 55, 79, 85, 39, 61, + 60, 15, 37, 20, 0, 0, 217, 122, 145, 192, 110, 130, 170, 97, 116, + 149, 84, 101, 127, 70, 85, 106, 55, 70, 85, 39, 53, 59, 16, 30, + 19, 0, 0, 217, 123, 131, 192, 109, 116, 171, 96, 103, 149, 83, 89, + 127, 70, 75, 106, 55, 60, 85, 40, 45, 59, 16, 23, 17, 0, 0, + 217, 122, 114, 193, 109, 101, 172, 96, 91, 149, 82, 77, 128, 69, 64, + 106, 55, 50, 84, 39, 35, 59, 17, 14, 17, 0, 0, 218, 122, 98, + 194, 108, 87, 171, 96, 77, 149, 82, 65, 127, 69, 52, 106, 55, 40, + 84, 40, 25, 59, 18, 3, 15, 0, 0, 219, 122, 80, 193, 108, 70, + 172, 95, 61, 149, 82, 51, 127, 69, 40, 106, 55, 28, 84, 39, 12, + 58, 17, 0, 13, 0, 0, 219, 121, 59, 194, 108, 52, 172, 96, 44, + 149, 82, 35, 127, 68, 24, 106, 55, 11, 84, 40, 0, 57, 18, 0, + 13, 0, 0, 219, 121, 40, 193, 108, 33, 172, 95, 26, 149, 81, 19, + 128, 68, 6, 106, 54, 0, 84, 39, 0, 57, 18, 0, 13, 0, 0, + 213, 99, 165, 189, 87, 148, 169, 76, 132, 147, 64, 115, 126, 52, 98, + 106, 39, 81, 85, 23, 63, 60, 0, 39, 16, 0, 0, 214, 98, 149, + 191, 87, 133, 170, 76, 119, 148, 65, 103, 127, 53, 88, 106, 39, 72, + 85, 24, 55, 60, 0, 32, 15, 0, 0, 215, 99, 136, 191, 87, 121, + 170, 77, 108, 148, 65, 93, 126, 53, 79, 106, 40, 64, 85, 24, 47, + 59, 0, 25, 14, 0, 0, 215, 99, 121, 192, 87, 108, 170, 77, 96, + 148, 65, 82, 126, 53, 69, 106, 40, 55, 85, 25, 39, 59, 0, 18, + 13, 0, 0, 216, 99, 106, 191, 87, 95, 170, 76, 83, 148, 65, 71, + 126, 53, 58, 106, 41, 45, 85, 26, 30, 59, 0, 8, 11, 0, 0, + 216, 98, 91, 192, 88, 82, 170, 77, 71, 148, 65, 60, 127, 53, 48, + 105, 41, 36, 83, 26, 21, 58, 1, 2, 11, 0, 0, 217, 99, 75, + 192, 87, 66, 170, 76, 57, 148, 65, 47, 126, 53, 36, 105, 41, 24, + 83, 26, 8, 57, 2, 0, 9, 0, 0, 217, 98, 57, 192, 87, 49, + 171, 77, 41, 147, 65, 32, 126, 53, 21, 105, 41, 8, 84, 27, 0, + 57, 3, 0, 9, 0, 0, 217, 98, 40, 193, 87, 34, 171, 76, 27, + 148, 65, 19, 126, 53, 6, 105, 41, 0, 83, 27, 0, 57, 4, 0, + 9, 0, 0, 211, 67, 152, 189, 58, 136, 168, 50, 122, 147, 39, 105, + 127, 28, 89, 106, 14, 74, 85, 0, 56, 59, 0, 33, 9, 0, 0, + 213, 68, 138, 190, 59, 123, 169, 51, 109, 148, 40, 95, 126, 30, 80, + 106, 16, 65, 85, 0, 48, 59, 0, 27, 9, 0, 0, 214, 69, 125, + 190, 59, 111, 168, 51, 99, 148, 41, 86, 126, 31, 72, 106, 18, 58, + 85, 0, 41, 59, 0, 20, 7, 0, 0, 215, 70, 112, 190, 61, 100, + 169, 52, 88, 147, 42, 76, 126, 32, 63, 106, 19, 49, 84, 1, 34, + 58, 0, 13, 7, 0, 0, 214, 70, 99, 190, 62, 88, 169, 53, 77, + 147, 43, 65, 125, 32, 53, 106, 20, 40, 84, 3, 26, 58, 0, 4, + 7, 0, 0, 214, 71, 86, 190, 61, 75, 169, 53, 65, 146, 43, 54, + 126, 33, 44, 105, 21, 31, 83, 4, 17, 57, 0, 0, 7, 0, 0, + 215, 71, 71, 191, 62, 62, 169, 53, 53, 147, 44, 44, 126, 34, 33, + 105, 22, 20, 83, 5, 4, 57, 0, 0, 7, 0, 0, 215, 71, 54, + 191, 62, 47, 169, 54, 39, 147, 44, 30, 126, 35, 20, 105, 23, 6, + 83, 6, 0, 56, 0, 0, 5, 0, 0, 215, 71, 41, 191, 63, 34, + 170, 54, 27, 147, 45, 17, 126, 35, 6, 105, 23, 0, 83, 8, 0, + 56, 0, 0, 5, 0, 0, 210, 13, 140, 189, 1, 125, 167, 0, 110, + 146, 0, 96, 126, 0, 81, 106, 0, 67, 85, 0, 51, 59, 0, 28, + 4, 0, 0, 212, 18, 126, 190, 7, 113, 168, 0, 100, 146, 0, 86, + 126, 0, 73, 106, 0, 59, 84, 0, 43, 59, 0, 22, 4, 0, 0, + 212, 21, 115, 190, 13, 103, 168, 3, 91, 146, 0, 78, 125, 0, 65, + 105, 0, 52, 84, 0, 36, 58, 0, 16, 4, 0, 0, 213, 24, 103, + 189, 19, 91, 168, 9, 82, 146, 0, 69, 125, 0, 57, 105, 0, 44, + 84, 0, 29, 58, 0, 7, 4, 0, 0, 213, 27, 92, 188, 21, 81, + 168, 14, 71, 146, 1, 59, 125, 0, 48, 105, 0, 36, 84, 0, 21, + 58, 0, 4, 4, 0, 0, 213, 30, 80, 189, 22, 69, 168, 17, 61, + 146, 5, 50, 125, 0, 39, 104, 0, 27, 83, 0, 12, 57, 0, 0, + 4, 0, 0, 214, 30, 67, 189, 25, 57, 168, 20, 50, 146, 9, 40, + 125, 0, 29, 104, 0, 17, 83, 0, 2, 56, 0, 0, 4, 0, 0, + 214, 32, 53, 189, 27, 44, 169, 20, 38, 146, 13, 28, 124, 2, 17, + 104, 0, 4, 83, 0, 0, 56, 0, 0, 4, 0, 0, 214, 33, 41, + 190, 27, 33, 168, 23, 27, 146, 13, 18, 125, 3, 5, 105, 0, 0, + 83, 0, 0, 56, 0, 0, 4, 0, 0, 185, 229, 250, 164, 204, 223, + 146, 182, 199, 127, 158, 174, 108, 136, 149, 89, 113, 125, 70, 90, 100, + 46, 62, 71, 10, 25, 33, 189, 227, 225, 168, 202, 201, 148, 181, 179, + 129, 157, 156, 109, 135, 134, 90, 113, 113, 70, 89, 90, 46, 62, 62, + 8, 24, 25, 192, 226, 202, 170, 202, 182, 151, 179, 162, 130, 156, 141, + 110, 133, 121, 91, 112, 101, 71, 89, 80, 46, 61, 54, 7, 24, 19, + 194, 224, 179, 173, 200, 160, 153, 178, 144, 132, 155, 125, 112, 133, 107, + 92, 111, 89, 71, 88, 69, 46, 61, 45, 6, 23, 10, 196, 223, 155, + 174, 198, 139, 154, 176, 124, 132, 153, 107, 113, 131, 91, 92, 110, 75, + 72, 87, 58, 47, 60, 37, 4, 23, 0, 198, 221, 131, 175, 197, 117, + 155, 175, 105, 133, 152, 91, 113, 130, 76, 92, 109, 63, 72, 86, 47, + 46, 60, 26, 3, 23, 0, 200, 220, 104, 176, 196, 94, 156, 175, 84, + 134, 151, 72, 113, 129, 59, 93, 108, 47, 72, 85, 33, 46, 59, 13, + 0, 23, 0, 201, 219, 73, 179, 195, 65, 157, 173, 57, 135, 150, 48, + 114, 129, 39, 94, 108, 28, 72, 85, 15, 47, 59, 0, 0, 22, 0, + 203, 219, 42, 178, 195, 37, 157, 173, 32, 135, 150, 26, 114, 128, 16, + 94, 107, 6, 73, 85, 0, 46, 58, 0, 0, 22, 0, 186, 205, 233, + 165, 183, 209, 148, 163, 187, 128, 142, 163, 109, 121, 140, 91, 101, 118, + 71, 80, 94, 48, 54, 66, 12, 15, 27, 189, 204, 211, 169, 182, 189, + 151, 163, 169, 131, 141, 147, 111, 121, 126, 92, 101, 105, 72, 79, 84, + 48, 54, 58, 11, 15, 19, 192, 202, 190, 171, 181, 170, 152, 161, 152, + 131, 141, 133, 112, 120, 113, 93, 100, 94, 72, 79, 74, 48, 53, 50, + 10, 15, 11, 195, 201, 169, 172, 179, 151, 153, 160, 135, 132, 139, 117, + 113, 119, 100, 93, 99, 82, 72, 78, 64, 48, 53, 41, 9, 14, 3, + 195, 200, 146, 174, 179, 131, 154, 159, 117, 133, 138, 101, 113, 118, 86, + 93, 98, 70, 73, 77, 53, 48, 52, 32, 8, 15, 0, 198, 199, 125, + 175, 177, 111, 155, 158, 100, 133, 137, 85, 113, 117, 71, 93, 97, 57, + 72, 77, 42, 47, 52, 22, 5, 14, 0, 199, 198, 101, 176, 177, 89, + 155, 157, 79, 134, 136, 68, 113, 116, 56, 94, 97, 44, 73, 76, 30, + 47, 52, 10, 2, 15, 0, 200, 197, 72, 178, 176, 63, 157, 156, 56, + 135, 136, 46, 114, 116, 37, 94, 96, 26, 73, 76, 11, 47, 51, 0, + 0, 14, 0, 201, 197, 45, 177, 175, 38, 156, 155, 31, 135, 135, 25, + 114, 115, 17, 94, 96, 5, 73, 75, 0, 46, 51, 0, 0, 14, 0, + 187, 183, 218, 167, 165, 197, 149, 147, 176, 129, 127, 153, 111, 109, 132, + 92, 90, 111, 73, 70, 89, 49, 46, 62, 15, 4, 22, 190, 183, 197, + 170, 164, 177, 151, 146, 159, 130, 127, 139, 112, 109, 119, 93, 90, 99, + 72, 70, 78, 49, 45, 53, 14, 4, 15, 192, 182, 179, 171, 163, 161, + 153, 145, 144, 132, 126, 125, 113, 108, 107, 93, 89, 88, 73, 70, 69, + 49, 45, 45, 13, 5, 6, 195, 181, 159, 172, 162, 142, 152, 145, 127, + 132, 125, 111, 113, 107, 94, 93, 88, 77, 73, 69, 59, 48, 45, 37, + 11, 5, 0, 195, 180, 139, 173, 161, 124, 153, 143, 110, 133, 125, 96, + 113, 106, 81, 94, 88, 66, 73, 68, 49, 49, 44, 28, 9, 6, 0, + 196, 179, 118, 174, 160, 106, 154, 142, 94, 133, 124, 81, 113, 105, 68, + 94, 87, 54, 73, 68, 39, 48, 44, 18, 5, 5, 0, 197, 178, 96, + 176, 159, 86, 155, 141, 75, 134, 123, 64, 114, 105, 53, 94, 87, 40, + 73, 68, 26, 48, 44, 5, 2, 6, 0, 199, 178, 70, 176, 158, 62, + 156, 141, 54, 134, 122, 44, 114, 104, 35, 94, 86, 23, 73, 67, 8, + 47, 44, 0, 2, 6, 0, 199, 177, 45, 178, 158, 40, 156, 140, 32, + 135, 122, 26, 114, 104, 16, 94, 86, 4, 73, 67, 0, 47, 44, 0, + 0, 7, 0, 188, 161, 204, 168, 144, 183, 149, 129, 164, 130, 112, 144, + 112, 95, 123, 93, 78, 103, 74, 60, 81, 50, 36, 56, 16, 0, 16, + 190, 160, 185, 170, 144, 165, 151, 128, 148, 132, 111, 130, 112, 95, 110, + 93, 78, 92, 74, 59, 72, 50, 36, 48, 16, 0, 8, 192, 160, 167, + 171, 143, 150, 153, 128, 134, 132, 111, 117, 112, 94, 100, 94, 77, 82, + 74, 59, 63, 50, 36, 40, 14, 0, 0, 193, 159, 149, 172, 143, 134, + 153, 127, 119, 133, 110, 103, 113, 94, 87, 93, 77, 72, 73, 59, 54, + 50, 36, 32, 12, 0, 0, 195, 159, 131, 173, 142, 117, 153, 127, 104, + 132, 110, 90, 113, 93, 76, 93, 76, 61, 74, 59, 45, 49, 36, 23, + 9, 0, 0, 196, 158, 113, 174, 141, 101, 155, 126, 89, 133, 109, 76, + 113, 93, 64, 94, 76, 51, 74, 58, 35, 49, 36, 14, 6, 0, 0, + 197, 157, 92, 174, 141, 80, 154, 125, 71, 134, 108, 60, 114, 92, 50, + 94, 75, 37, 73, 58, 22, 48, 36, 1, 5, 0, 0, 197, 157, 68, + 175, 140, 59, 155, 124, 51, 134, 108, 41, 113, 91, 32, 94, 75, 21, + 73, 57, 5, 48, 35, 0, 5, 0, 0, 198, 156, 46, 176, 140, 40, + 155, 124, 32, 134, 107, 24, 114, 91, 14, 94, 75, 2, 73, 57, 0, + 48, 36, 0, 3, 0, 0, 189, 140, 191, 168, 126, 172, 150, 112, 154, + 131, 97, 134, 112, 82, 115, 94, 66, 96, 74, 49, 75, 51, 25, 50, + 12, 0, 10, 191, 139, 173, 170, 125, 154, 152, 111, 138, 132, 96, 121, + 113, 81, 103, 94, 66, 85, 74, 48, 66, 50, 26, 42, 12, 0, 1, + 192, 139, 157, 171, 125, 140, 152, 111, 125, 132, 96, 109, 113, 81, 92, + 94, 65, 76, 74, 48, 58, 50, 26, 35, 9, 0, 0, 193, 139, 140, + 172, 124, 125, 153, 110, 112, 133, 95, 96, 113, 80, 82, 94, 65, 66, + 74, 49, 50, 50, 26, 28, 7, 0, 0, 194, 138, 123, 172, 123, 109, + 153, 110, 97, 133, 95, 84, 113, 80, 70, 94, 65, 56, 74, 48, 40, + 50, 26, 20, 6, 0, 0, 194, 138, 105, 173, 123, 94, 153, 109, 83, + 133, 94, 70, 112, 79, 59, 94, 64, 46, 74, 48, 31, 50, 26, 9, + 4, 0, 0, 196, 138, 87, 174, 122, 77, 153, 109, 67, 133, 93, 56, + 113, 79, 46, 94, 64, 34, 73, 48, 18, 49, 27, 0, 4, 0, 0, + 196, 137, 65, 174, 122, 57, 154, 108, 49, 133, 93, 39, 113, 79, 29, + 94, 64, 18, 74, 48, 3, 49, 27, 0, 2, 0, 0, 197, 137, 47, + 175, 122, 40, 155, 108, 32, 133, 93, 23, 114, 79, 14, 94, 64, 1, + 73, 48, 0, 48, 27, 0, 2, 0, 0, 189, 119, 177, 168, 106, 159, + 150, 94, 142, 131, 81, 124, 113, 67, 107, 94, 53, 89, 74, 37, 69, + 51, 11, 45, 6, 0, 3, 191, 119, 161, 170, 106, 144, 152, 94, 129, + 132, 81, 112, 113, 67, 96, 94, 53, 79, 74, 37, 61, 51, 13, 38, + 6, 0, 0, 192, 119, 146, 170, 106, 131, 152, 94, 117, 132, 80, 101, + 112, 67, 85, 94, 53, 70, 74, 37, 53, 50, 14, 31, 4, 0, 0, + 192, 119, 131, 171, 106, 117, 153, 94, 105, 132, 80, 89, 113, 67, 75, + 94, 54, 61, 74, 38, 45, 51, 14, 23, 3, 0, 0, 193, 118, 114, + 171, 106, 102, 153, 93, 90, 132, 80, 78, 113, 67, 65, 94, 53, 52, + 74, 37, 36, 50, 15, 16, 1, 0, 0, 194, 118, 99, 172, 105, 89, + 153, 93, 78, 132, 80, 66, 113, 67, 54, 94, 53, 42, 74, 38, 27, + 50, 16, 5, 1, 0, 0, 194, 118, 82, 173, 105, 72, 153, 93, 63, + 132, 79, 53, 113, 67, 42, 94, 53, 30, 74, 38, 15, 49, 16, 0, + 0, 0, 0, 195, 117, 63, 173, 105, 55, 154, 93, 47, 133, 79, 37, + 113, 66, 27, 94, 53, 15, 73, 38, 0, 48, 16, 0, 0, 0, 0, + 195, 117, 46, 173, 104, 39, 154, 92, 32, 133, 79, 22, 113, 66, 13, + 94, 53, 0, 73, 38, 0, 48, 17, 0, 0, 0, 0, 189, 96, 166, + 168, 85, 147, 150, 74, 132, 131, 62, 115, 113, 51, 99, 94, 38, 82, + 74, 21, 63, 51, 0, 40, 1, 0, 0, 190, 96, 150, 170, 85, 133, + 152, 75, 119, 132, 63, 104, 113, 51, 88, 94, 38, 72, 75, 22, 55, + 51, 0, 33, 1, 0, 0, 192, 96, 137, 170, 85, 121, 152, 74, 108, + 132, 64, 94, 113, 52, 79, 94, 39, 64, 74, 23, 48, 50, 0, 26, + 0, 0, 0, 192, 96, 122, 171, 86, 109, 152, 75, 96, 132, 63, 83, + 113, 52, 69, 94, 39, 56, 74, 24, 41, 50, 0, 19, 0, 0, 0, + 193, 96, 107, 171, 85, 96, 152, 75, 84, 132, 64, 72, 113, 52, 60, + 94, 39, 47, 74, 24, 32, 50, 1, 10, 0, 0, 0, 193, 96, 93, + 172, 85, 82, 152, 75, 72, 133, 63, 61, 113, 51, 49, 94, 39, 37, + 73, 25, 23, 49, 2, 2, 0, 0, 0, 194, 96, 78, 172, 85, 68, + 152, 75, 59, 132, 63, 49, 113, 52, 39, 94, 40, 26, 73, 25, 11, + 48, 3, 0, 0, 0, 0, 194, 96, 60, 173, 85, 52, 153, 75, 44, + 132, 64, 35, 112, 52, 25, 94, 40, 12, 73, 26, 0, 48, 4, 0, + 0, 0, 0, 195, 96, 46, 173, 85, 38, 154, 74, 31, 133, 63, 22, + 113, 52, 11, 93, 40, 0, 73, 26, 0, 47, 5, 0, 0, 0, 0, + 188, 67, 153, 168, 58, 137, 151, 49, 122, 131, 39, 106, 113, 28, 90, + 94, 13, 75, 75, 0, 57, 51, 0, 35, 0, 0, 0, 190, 68, 138, + 170, 59, 123, 152, 50, 110, 132, 41, 96, 113, 29, 80, 94, 16, 66, + 75, 0, 49, 50, 0, 27, 0, 0, 0, 191, 69, 126, 170, 59, 112, + 151, 52, 100, 132, 42, 86, 113, 30, 73, 95, 17, 58, 75, 0, 42, + 50, 0, 21, 0, 0, 0, 192, 70, 113, 170, 61, 100, 151, 52, 89, + 132, 42, 77, 113, 31, 64, 94, 19, 50, 74, 1, 35, 50, 0, 14, + 0, 0, 0, 192, 70, 100, 170, 62, 89, 151, 53, 77, 131, 43, 66, + 112, 32, 54, 94, 20, 42, 74, 2, 27, 49, 0, 5, 0, 0, 0, + 192, 71, 87, 171, 61, 77, 152, 53, 67, 131, 44, 57, 112, 33, 45, + 94, 21, 33, 74, 4, 19, 49, 0, 1, 0, 0, 0, 193, 71, 74, + 171, 62, 64, 152, 53, 55, 132, 44, 45, 113, 34, 34, 94, 22, 23, + 73, 5, 7, 48, 0, 0, 0, 0, 0, 193, 70, 58, 172, 62, 50, + 152, 54, 42, 132, 44, 32, 112, 35, 22, 93, 23, 10, 73, 6, 0, + 47, 0, 0, 0, 0, 0, 193, 70, 45, 172, 62, 38, 153, 54, 31, + 132, 44, 21, 112, 35, 9, 94, 23, 0, 73, 7, 0, 47, 0, 0, + 0, 0, 0, 189, 26, 141, 169, 15, 126, 150, 2, 112, 131, 0, 97, + 113, 0, 82, 94, 0, 67, 75, 0, 51, 50, 0, 29, 0, 0, 0, + 190, 28, 128, 170, 18, 114, 151, 8, 101, 132, 0, 88, 113, 0, 74, + 94, 0, 60, 75, 0, 44, 50, 0, 23, 0, 0, 0, 191, 30, 117, + 170, 23, 104, 152, 11, 92, 132, 1, 79, 113, 0, 67, 95, 0, 53, + 75, 0, 37, 50, 0, 17, 0, 0, 0, 191, 33, 105, 170, 26, 93, + 151, 18, 83, 132, 6, 70, 112, 0, 58, 94, 0, 45, 75, 0, 30, + 49, 0, 8, 0, 0, 0, 191, 34, 93, 170, 27, 82, 151, 20, 72, + 131, 8, 61, 112, 0, 49, 94, 0, 38, 74, 0, 23, 49, 0, 4, + 0, 0, 0, 191, 36, 82, 170, 29, 71, 151, 22, 63, 131, 11, 52, + 112, 0, 41, 93, 0, 29, 74, 0, 14, 48, 0, 1, 0, 0, 0, + 191, 38, 69, 170, 31, 60, 151, 24, 51, 131, 14, 41, 112, 1, 31, + 93, 0, 19, 73, 0, 3, 48, 0, 0, 0, 0, 0, 192, 37, 56, + 171, 31, 47, 152, 25, 40, 131, 17, 30, 112, 4, 19, 93, 0, 7, + 73, 0, 0, 47, 0, 0, 0, 0, 0, 192, 38, 45, 171, 33, 36, + 152, 26, 30, 131, 18, 21, 111, 7, 9, 93, 0, 0, 73, 0, 0, + 47, 0, 0, 0, 0, 0, 149, 218, 248, 133, 194, 222, 119, 173, 198, + 102, 151, 173, 86, 130, 148, 70, 108, 125, 53, 85, 100, 32, 59, 71, + 0, 22, 33, 154, 216, 223, 137, 193, 200, 122, 172, 178, 106, 150, 156, + 89, 128, 133, 73, 107, 112, 54, 85, 89, 31, 59, 63, 0, 22, 26, + 159, 215, 202, 141, 192, 181, 126, 171, 161, 108, 149, 141, 90, 128, 121, + 74, 107, 100, 55, 85, 80, 32, 58, 55, 0, 22, 19, 161, 213, 179, + 144, 190, 160, 126, 170, 143, 109, 148, 125, 92, 127, 107, 74, 106, 89, + 56, 84, 69, 32, 58, 46, 0, 21, 11, 163, 211, 156, 144, 189, 139, + 129, 168, 125, 110, 147, 108, 93, 126, 92, 75, 105, 76, 57, 83, 58, + 33, 58, 37, 0, 21, 1, 167, 211, 133, 147, 188, 120, 130, 167, 105, + 110, 145, 92, 93, 125, 78, 76, 104, 64, 58, 83, 48, 33, 57, 27, + 0, 21, 0, 169, 210, 108, 149, 187, 96, 131, 166, 86, 112, 144, 74, + 94, 124, 62, 77, 103, 49, 58, 82, 35, 33, 57, 15, 0, 21, 0, + 170, 209, 80, 151, 186, 71, 133, 165, 62, 114, 143, 52, 95, 123, 42, + 77, 103, 32, 58, 81, 18, 33, 56, 0, 0, 21, 0, 173, 208, 55, + 152, 186, 49, 134, 165, 41, 114, 143, 34, 95, 122, 25, 77, 102, 14, + 58, 81, 0, 33, 56, 0, 0, 21, 0, 154, 195, 232, 137, 174, 207, + 122, 156, 185, 105, 136, 163, 89, 116, 140, 73, 97, 117, 56, 76, 94, + 35, 51, 66, 0, 13, 28, 158, 194, 209, 141, 174, 187, 125, 155, 167, + 109, 135, 146, 91, 116, 125, 75, 96, 105, 57, 75, 83, 35, 50, 57, + 0, 12, 21, 161, 193, 189, 144, 173, 169, 128, 154, 151, 110, 134, 132, + 93, 115, 113, 77, 95, 94, 58, 75, 74, 35, 50, 50, 0, 12, 13, + 164, 192, 168, 145, 171, 151, 129, 153, 134, 111, 133, 117, 94, 114, 100, + 76, 95, 82, 58, 75, 64, 36, 50, 42, 0, 12, 5, 165, 191, 147, + 147, 170, 131, 130, 152, 117, 113, 132, 102, 95, 113, 86, 77, 94, 71, + 58, 74, 54, 35, 50, 33, 0, 13, 0, 167, 189, 126, 148, 169, 113, + 132, 151, 100, 113, 131, 86, 96, 112, 73, 77, 93, 59, 59, 73, 43, + 35, 49, 23, 0, 12, 0, 170, 189, 104, 150, 168, 91, 133, 150, 81, + 114, 130, 69, 96, 111, 57, 78, 92, 46, 59, 73, 31, 35, 49, 11, + 0, 13, 0, 171, 188, 78, 152, 168, 68, 134, 149, 60, 115, 130, 50, + 96, 111, 41, 78, 92, 29, 60, 73, 15, 35, 49, 0, 0, 12, 0, + 173, 187, 55, 153, 167, 47, 134, 149, 39, 115, 129, 33, 97, 110, 24, + 79, 92, 13, 60, 72, 0, 35, 48, 0, 0, 12, 0, 157, 175, 217, + 139, 157, 196, 125, 141, 175, 109, 122, 153, 92, 104, 132, 76, 86, 110, + 59, 67, 88, 37, 43, 61, 1, 1, 23, 161, 174, 196, 144, 156, 176, + 127, 140, 158, 110, 121, 137, 94, 104, 118, 77, 85, 98, 59, 67, 78, + 37, 43, 53, 0, 2, 16, 163, 174, 178, 146, 156, 160, 130, 139, 143, + 112, 121, 124, 95, 103, 106, 78, 85, 88, 60, 66, 69, 37, 42, 46, + 0, 2, 7, 166, 173, 159, 147, 154, 142, 130, 138, 127, 113, 120, 111, + 96, 103, 95, 78, 84, 77, 60, 66, 59, 37, 43, 37, 0, 2, 0, + 166, 172, 139, 148, 154, 125, 131, 137, 112, 113, 120, 96, 96, 102, 81, + 78, 84, 66, 60, 65, 50, 37, 42, 29, 0, 3, 0, 167, 171, 120, + 149, 153, 107, 133, 137, 95, 114, 118, 81, 97, 101, 69, 79, 84, 56, + 60, 65, 40, 37, 42, 19, 0, 3, 0, 170, 170, 99, 151, 152, 87, + 134, 136, 77, 115, 118, 66, 97, 101, 55, 79, 83, 42, 61, 65, 28, + 37, 42, 7, 0, 3, 0, 172, 170, 75, 152, 151, 65, 134, 135, 57, + 115, 117, 48, 97, 100, 38, 79, 83, 27, 61, 64, 12, 36, 42, 0, + 0, 3, 0, 172, 169, 55, 154, 151, 46, 135, 134, 40, 116, 116, 32, + 97, 99, 21, 80, 82, 10, 61, 64, 0, 36, 41, 0, 0, 3, 0, + 160, 154, 203, 143, 139, 182, 127, 124, 164, 111, 107, 143, 95, 91, 122, + 78, 75, 103, 60, 57, 81, 39, 33, 56, 1, 0, 18, 163, 154, 184, + 146, 138, 165, 130, 123, 148, 113, 107, 129, 96, 90, 110, 79, 74, 92, + 61, 56, 72, 39, 34, 48, 2, 0, 9, 165, 154, 167, 147, 137, 149, + 131, 122, 134, 114, 106, 117, 96, 90, 100, 79, 74, 82, 61, 56, 64, + 39, 33, 40, 2, 0, 1, 166, 153, 150, 149, 137, 133, 132, 122, 119, + 114, 106, 104, 97, 90, 88, 79, 74, 72, 61, 56, 55, 39, 34, 33, + 0, 0, 0, 168, 152, 132, 149, 136, 117, 132, 121, 104, 114, 105, 90, + 97, 89, 76, 79, 73, 62, 61, 56, 46, 38, 34, 25, 0, 0, 0, + 169, 151, 114, 150, 135, 101, 133, 121, 90, 114, 104, 77, 97, 89, 65, + 80, 73, 51, 61, 56, 36, 38, 34, 16, 0, 0, 0, 170, 150, 94, + 151, 135, 83, 134, 120, 73, 115, 104, 62, 98, 88, 51, 80, 72, 39, + 61, 56, 24, 38, 34, 3, 0, 0, 0, 172, 150, 72, 153, 134, 63, + 135, 119, 55, 115, 103, 45, 98, 88, 36, 80, 72, 24, 61, 55, 9, + 38, 34, 0, 0, 0, 0, 172, 150, 54, 153, 134, 47, 135, 119, 38, + 116, 103, 30, 98, 87, 21, 80, 72, 8, 62, 55, 0, 37, 34, 0, + 0, 0, 0, 162, 134, 190, 145, 120, 171, 129, 108, 153, 113, 93, 134, + 97, 78, 115, 80, 63, 96, 62, 46, 75, 41, 23, 51, 0, 0, 11, + 165, 134, 173, 147, 120, 154, 131, 107, 138, 114, 92, 120, 97, 78, 103, + 80, 63, 85, 62, 46, 66, 40, 23, 43, 0, 0, 2, 166, 134, 157, + 148, 120, 140, 132, 106, 125, 114, 92, 109, 97, 77, 93, 81, 63, 77, + 62, 46, 58, 40, 24, 36, 0, 0, 0, 168, 133, 140, 149, 119, 125, + 132, 106, 112, 115, 92, 97, 98, 77, 82, 81, 62, 67, 62, 46, 50, + 40, 24, 29, 0, 0, 0, 168, 133, 123, 150, 119, 110, 133, 106, 97, + 115, 91, 84, 98, 77, 70, 81, 62, 57, 62, 46, 41, 40, 24, 20, + 0, 0, 0, 169, 132, 107, 150, 118, 94, 133, 105, 84, 115, 91, 72, + 98, 76, 60, 80, 62, 47, 62, 46, 32, 39, 25, 11, 0, 0, 0, + 171, 132, 89, 152, 118, 79, 135, 105, 69, 115, 90, 58, 98, 76, 47, + 80, 62, 36, 62, 46, 21, 39, 25, 0, 0, 0, 0, 171, 132, 69, + 153, 117, 60, 135, 104, 52, 116, 90, 42, 98, 76, 33, 81, 61, 21, + 62, 46, 6, 38, 25, 0, 0, 0, 0, 172, 132, 54, 153, 118, 45, + 135, 104, 38, 116, 90, 28, 98, 76, 18, 81, 61, 6, 62, 46, 0, + 38, 25, 0, 0, 0, 0, 164, 115, 177, 146, 103, 159, 130, 91, 143, + 114, 78, 125, 97, 65, 107, 81, 51, 89, 63, 34, 69, 41, 9, 46, + 0, 0, 4, 166, 115, 161, 148, 103, 144, 132, 91, 129, 115, 78, 112, + 98, 65, 96, 81, 51, 79, 63, 35, 61, 41, 11, 38, 0, 0, 0, + 167, 115, 146, 150, 102, 131, 132, 91, 117, 115, 78, 101, 98, 65, 86, + 81, 51, 71, 63, 35, 54, 41, 12, 32, 0, 0, 0, 168, 114, 132, + 150, 103, 118, 133, 91, 105, 116, 78, 91, 98, 64, 76, 82, 51, 61, + 63, 36, 46, 41, 13, 24, 0, 0, 0, 169, 114, 116, 150, 102, 103, + 134, 90, 91, 116, 78, 79, 98, 65, 66, 81, 51, 53, 63, 36, 37, + 40, 14, 17, 0, 0, 0, 169, 114, 101, 151, 101, 89, 134, 90, 79, + 116, 77, 67, 98, 64, 56, 81, 51, 44, 63, 36, 29, 40, 15, 7, + 0, 0, 0, 170, 114, 85, 152, 101, 75, 135, 90, 65, 116, 77, 54, + 98, 64, 44, 81, 51, 32, 63, 36, 17, 39, 15, 0, 0, 0, 0, + 172, 113, 66, 152, 101, 58, 135, 89, 49, 116, 77, 40, 99, 64, 30, + 81, 51, 18, 62, 36, 3, 38, 16, 0, 0, 0, 0, 171, 113, 51, + 153, 101, 44, 136, 89, 36, 116, 77, 28, 99, 64, 18, 81, 51, 5, + 62, 36, 0, 38, 16, 0, 0, 0, 0, 165, 94, 166, 147, 82, 147, + 132, 72, 132, 115, 61, 115, 98, 49, 99, 82, 36, 82, 64, 19, 64, + 42, 0, 41, 0, 0, 0, 167, 93, 150, 150, 83, 134, 133, 73, 120, + 116, 62, 104, 99, 49, 88, 82, 36, 72, 64, 20, 55, 41, 0, 33, + 0, 0, 0, 169, 93, 137, 150, 83, 122, 134, 73, 109, 116, 61, 94, + 99, 50, 80, 82, 37, 65, 64, 21, 49, 41, 0, 27, 0, 0, 0, + 169, 94, 123, 150, 83, 110, 133, 73, 97, 116, 61, 83, 99, 50, 70, + 82, 38, 57, 63, 23, 42, 41, 0, 20, 0, 0, 0, 169, 94, 109, + 150, 84, 97, 134, 73, 85, 116, 62, 73, 99, 51, 61, 81, 38, 48, + 63, 23, 33, 41, 1, 11, 0, 0, 0, 170, 94, 96, 150, 83, 84, + 134, 73, 74, 116, 61, 62, 99, 50, 51, 82, 38, 39, 64, 23, 24, + 40, 3, 4, 0, 0, 0, 171, 93, 79, 152, 82, 70, 135, 73, 61, + 116, 62, 51, 98, 51, 40, 81, 38, 28, 63, 24, 14, 39, 4, 0, + 0, 0, 0, 171, 94, 64, 152, 83, 55, 135, 73, 47, 116, 62, 37, + 98, 50, 27, 81, 38, 15, 63, 24, 1, 39, 4, 0, 0, 0, 0, + 172, 93, 51, 153, 82, 42, 135, 73, 35, 117, 62, 26, 99, 51, 16, + 81, 39, 3, 63, 25, 0, 38, 5, 0, 0, 0, 0, 166, 68, 153, + 148, 59, 137, 133, 49, 121, 115, 39, 106, 99, 28, 91, 82, 13, 75, + 65, 0, 58, 42, 0, 36, 0, 0, 0, 168, 68, 139, 150, 59, 124, + 134, 50, 110, 116, 40, 96, 99, 30, 81, 82, 16, 66, 64, 0, 50, + 41, 0, 29, 0, 0, 0, 169, 69, 126, 150, 59, 113, 134, 51, 101, + 117, 42, 87, 100, 30, 73, 82, 17, 59, 65, 0, 43, 41, 0, 23, + 0, 0, 0, 169, 70, 115, 150, 61, 102, 134, 52, 89, 116, 42, 77, + 99, 32, 65, 82, 19, 52, 64, 0, 36, 41, 0, 15, 0, 0, 0, + 169, 70, 101, 150, 61, 90, 134, 52, 79, 116, 43, 68, 99, 32, 55, + 82, 21, 43, 64, 2, 28, 41, 0, 6, 0, 0, 0, 170, 70, 89, + 151, 62, 79, 134, 53, 69, 116, 44, 58, 99, 33, 46, 81, 21, 34, + 64, 3, 20, 41, 0, 2, 0, 0, 0, 170, 71, 76, 152, 62, 66, + 134, 53, 57, 116, 43, 46, 99, 33, 36, 82, 22, 24, 64, 5, 10, + 40, 0, 0, 0, 0, 0, 171, 70, 61, 152, 62, 52, 135, 53, 44, + 116, 44, 35, 99, 34, 24, 82, 22, 12, 63, 6, 0, 39, 0, 0, + 0, 0, 0, 171, 71, 49, 153, 62, 41, 135, 54, 33, 117, 45, 25, + 98, 34, 13, 81, 23, 0, 63, 7, 0, 39, 0, 0, 0, 0, 0, + 167, 33, 142, 149, 24, 127, 134, 10, 113, 116, 0, 97, 100, 0, 83, + 83, 0, 68, 65, 0, 52, 40, 0, 30, 0, 0, 0, 169, 33, 129, + 150, 26, 115, 134, 17, 102, 116, 3, 89, 100, 0, 75, 83, 0, 60, + 65, 0, 45, 40, 0, 24, 0, 0, 0, 169, 36, 118, 151, 27, 104, + 134, 19, 93, 116, 7, 80, 100, 0, 67, 83, 0, 54, 65, 0, 38, + 41, 0, 17, 0, 0, 0, 169, 39, 107, 150, 30, 94, 134, 22, 84, + 116, 11, 71, 99, 0, 59, 83, 0, 46, 64, 0, 31, 40, 0, 9, + 0, 0, 0, 169, 39, 95, 151, 31, 83, 134, 24, 73, 116, 15, 62, + 100, 1, 51, 83, 0, 38, 64, 0, 24, 40, 0, 5, 0, 0, 0, + 169, 41, 83, 151, 33, 73, 134, 26, 64, 117, 17, 54, 99, 4, 42, + 82, 0, 30, 64, 0, 16, 40, 0, 1, 0, 0, 0, 170, 42, 71, + 152, 34, 62, 134, 28, 53, 117, 19, 44, 99, 6, 33, 82, 0, 21, + 63, 0, 4, 39, 0, 0, 0, 0, 0, 171, 42, 59, 152, 35, 50, + 134, 29, 42, 117, 21, 32, 99, 9, 22, 82, 0, 9, 63, 0, 0, + 38, 0, 0, 0, 0, 0, 172, 42, 48, 152, 36, 40, 135, 29, 32, + 117, 21, 23, 99, 10, 12, 82, 0, 0, 63, 0, 0, 38, 0, 0, + 0, 0, 0, 107, 207, 246, 96, 185, 220, 86, 165, 196, 73, 144, 171, + 60, 123, 147, 46, 103, 125, 32, 82, 100, 9, 56, 71, 0, 20, 33, + 115, 206, 221, 104, 184, 198, 92, 164, 178, 78, 143, 154, 64, 123, 133, + 51, 102, 111, 34, 81, 89, 10, 56, 63, 0, 20, 27, 122, 204, 200, + 108, 183, 180, 95, 163, 161, 82, 142, 140, 68, 122, 120, 54, 102, 101, + 36, 81, 79, 11, 56, 55, 0, 20, 20, 125, 203, 179, 111, 181, 160, + 97, 162, 143, 85, 141, 124, 70, 121, 107, 55, 101, 89, 38, 80, 69, + 14, 55, 46, 0, 19, 10, 128, 202, 156, 113, 180, 140, 102, 161, 125, + 87, 140, 108, 71, 120, 92, 56, 100, 76, 39, 79, 59, 14, 55, 38, + 0, 20, 3, 132, 200, 135, 117, 179, 121, 103, 159, 106, 88, 139, 93, + 73, 119, 79, 57, 100, 65, 41, 79, 49, 15, 54, 28, 0, 19, 0, + 134, 200, 111, 119, 178, 98, 105, 158, 87, 89, 138, 76, 74, 118, 64, + 58, 99, 51, 41, 78, 37, 16, 54, 17, 0, 19, 0, 137, 199, 85, + 122, 177, 75, 108, 158, 66, 91, 137, 56, 75, 118, 46, 59, 98, 35, + 42, 78, 22, 16, 54, 3, 0, 19, 0, 140, 198, 62, 125, 177, 55, + 109, 158, 47, 92, 137, 40, 76, 117, 32, 59, 98, 21, 42, 78, 6, + 16, 54, 0, 0, 18, 0, 118, 186, 231, 106, 167, 206, 93, 149, 184, + 81, 130, 161, 67, 111, 139, 54, 92, 117, 39, 72, 93, 17, 48, 66, + 0, 10, 29, 123, 185, 207, 110, 166, 186, 98, 148, 167, 85, 129, 145, + 71, 111, 125, 56, 92, 104, 40, 72, 83, 18, 48, 57, 0, 10, 22, + 128, 184, 188, 113, 165, 168, 102, 147, 151, 88, 128, 131, 73, 110, 113, + 58, 91, 94, 42, 71, 74, 19, 48, 50, 0, 9, 15, 131, 183, 168, + 116, 164, 151, 104, 146, 134, 89, 127, 117, 73, 109, 100, 58, 90, 83, + 42, 71, 65, 20, 48, 42, 0, 9, 5, 134, 182, 148, 120, 163, 131, + 105, 145, 118, 90, 126, 102, 75, 108, 86, 59, 90, 72, 43, 71, 55, + 19, 47, 34, 0, 9, 0, 136, 181, 128, 122, 162, 115, 107, 144, 102, + 92, 125, 87, 76, 107, 74, 61, 89, 60, 44, 70, 45, 20, 47, 24, + 0, 8, 0, 139, 180, 106, 124, 161, 95, 109, 144, 83, 93, 124, 71, + 77, 107, 60, 61, 89, 47, 44, 70, 33, 20, 47, 13, 0, 8, 0, + 142, 179, 82, 125, 160, 72, 111, 143, 63, 94, 124, 54, 77, 106, 44, + 61, 88, 32, 44, 69, 18, 20, 46, 0, 0, 8, 0, 143, 179, 62, + 127, 160, 54, 111, 142, 47, 94, 124, 39, 78, 106, 29, 62, 88, 18, + 45, 69, 3, 20, 46, 0, 0, 8, 0, 124, 167, 216, 112, 150, 194, + 99, 134, 174, 87, 117, 153, 73, 100, 131, 58, 82, 110, 43, 64, 88, + 23, 40, 61, 0, 0, 24, 129, 166, 195, 116, 150, 175, 103, 134, 158, + 89, 116, 137, 75, 99, 118, 60, 82, 98, 44, 63, 78, 23, 40, 53, + 0, 0, 17, 132, 166, 177, 119, 149, 160, 106, 133, 143, 90, 115, 124, + 76, 99, 107, 61, 81, 88, 45, 63, 69, 24, 40, 46, 0, 0, 9, + 136, 166, 159, 121, 148, 143, 107, 132, 126, 92, 115, 111, 77, 98, 94, + 62, 81, 78, 46, 63, 60, 23, 40, 38, 0, 0, 0, 138, 164, 140, + 122, 147, 125, 108, 131, 111, 93, 114, 97, 79, 98, 82, 63, 80, 67, + 46, 62, 50, 24, 40, 29, 0, 0, 0, 139, 163, 122, 124, 146, 109, + 110, 131, 96, 94, 114, 83, 79, 97, 70, 63, 81, 57, 46, 62, 41, + 24, 40, 21, 0, 0, 0, 141, 163, 101, 126, 145, 90, 111, 130, 79, + 95, 113, 68, 79, 96, 56, 63, 80, 44, 47, 62, 30, 23, 40, 10, + 0, 0, 0, 144, 162, 79, 127, 145, 70, 112, 129, 60, 95, 112, 51, + 79, 96, 41, 64, 79, 30, 47, 61, 15, 23, 40, 0, 0, 0, 0, + 145, 162, 60, 129, 145, 52, 113, 129, 46, 96, 112, 37, 79, 95, 27, + 64, 79, 16, 47, 61, 1, 23, 39, 0, 0, 0, 0, 131, 147, 202, + 117, 133, 181, 105, 119, 162, 91, 103, 142, 77, 87, 122, 62, 71, 102, + 47, 54, 81, 26, 31, 56, 0, 0, 18, 135, 147, 183, 120, 132, 164, + 107, 118, 147, 93, 102, 128, 78, 87, 110, 63, 71, 92, 47, 54, 72, + 26, 31, 48, 0, 0, 10, 138, 147, 166, 123, 131, 149, 108, 118, 133, + 94, 102, 116, 79, 86, 100, 64, 71, 82, 48, 54, 64, 27, 31, 41, + 0, 0, 2, 139, 146, 149, 124, 131, 134, 111, 117, 119, 94, 101, 103, + 79, 86, 88, 64, 70, 72, 48, 53, 55, 27, 31, 33, 0, 0, 0, + 141, 146, 132, 125, 131, 117, 111, 117, 104, 95, 101, 91, 80, 86, 77, + 65, 70, 62, 48, 53, 46, 26, 31, 25, 0, 0, 0, 143, 145, 115, + 126, 130, 101, 112, 116, 90, 96, 100, 78, 80, 85, 65, 65, 70, 52, + 49, 53, 37, 27, 32, 17, 0, 0, 0, 144, 144, 96, 128, 129, 85, + 112, 115, 75, 97, 100, 64, 81, 85, 52, 65, 69, 40, 49, 53, 26, + 26, 31, 5, 0, 0, 0, 146, 144, 76, 129, 129, 67, 114, 115, 58, + 97, 99, 48, 82, 84, 38, 66, 69, 27, 49, 53, 12, 26, 32, 0, + 0, 0, 0, 146, 144, 59, 130, 128, 51, 114, 114, 43, 98, 99, 35, + 82, 84, 25, 66, 69, 13, 49, 53, 0, 26, 32, 0, 0, 0, 0, + 135, 129, 189, 122, 115, 170, 107, 103, 152, 94, 89, 133, 79, 74, 114, + 64, 60, 95, 49, 43, 75, 29, 20, 51, 0, 0, 12, 138, 129, 171, + 124, 115, 153, 110, 103, 138, 95, 89, 120, 81, 74, 103, 66, 60, 86, + 50, 44, 67, 28, 21, 43, 0, 0, 3, 140, 129, 156, 125, 115, 140, + 111, 103, 125, 96, 89, 109, 81, 74, 93, 67, 60, 76, 50, 44, 59, + 29, 22, 36, 0, 0, 0, 142, 128, 140, 127, 115, 125, 112, 102, 112, + 97, 88, 97, 82, 74, 83, 67, 60, 67, 50, 44, 51, 29, 22, 29, + 0, 0, 0, 142, 128, 124, 127, 114, 111, 113, 102, 98, 98, 88, 85, + 82, 74, 71, 66, 60, 58, 50, 44, 42, 29, 22, 21, 0, 0, 0, + 144, 127, 108, 128, 114, 96, 113, 101, 85, 98, 87, 73, 82, 74, 61, + 67, 60, 48, 50, 44, 33, 28, 23, 12, 0, 0, 0, 145, 127, 91, + 129, 114, 81, 115, 101, 71, 98, 87, 60, 82, 73, 48, 67, 59, 37, + 50, 44, 22, 29, 23, 1, 0, 0, 0, 147, 127, 73, 130, 113, 63, + 115, 101, 55, 98, 87, 45, 83, 73, 35, 67, 59, 24, 50, 44, 10, + 28, 24, 0, 0, 0, 0, 147, 127, 58, 131, 113, 49, 115, 100, 42, + 99, 86, 33, 83, 73, 23, 67, 59, 10, 50, 44, 0, 27, 24, 0, + 0, 0, 0, 138, 110, 177, 124, 99, 159, 110, 88, 142, 96, 75, 125, + 82, 62, 107, 66, 48, 89, 51, 33, 70, 30, 8, 46, 0, 0, 5, + 142, 111, 160, 127, 99, 144, 113, 88, 130, 98, 75, 112, 82, 62, 96, + 68, 49, 80, 51, 33, 61, 30, 10, 39, 0, 0, 0, 143, 111, 146, + 128, 99, 131, 114, 88, 118, 98, 75, 101, 83, 62, 86, 68, 49, 71, + 52, 33, 54, 30, 11, 32, 0, 0, 0, 144, 111, 132, 128, 99, 118, + 113, 88, 106, 99, 75, 91, 83, 62, 77, 68, 49, 62, 52, 34, 46, + 30, 12, 25, 0, 0, 0, 144, 111, 117, 129, 98, 104, 114, 87, 92, + 99, 75, 80, 83, 62, 67, 68, 49, 53, 51, 34, 38, 30, 13, 18, + 0, 0, 0, 145, 111, 103, 130, 98, 91, 114, 87, 80, 99, 75, 68, + 83, 63, 57, 68, 50, 45, 51, 34, 30, 30, 14, 8, 0, 0, 0, + 146, 110, 87, 131, 98, 76, 115, 87, 67, 99, 75, 56, 83, 62, 45, + 68, 49, 33, 52, 35, 19, 30, 15, 2, 0, 0, 0, 148, 110, 70, + 131, 98, 60, 116, 86, 52, 99, 74, 43, 84, 62, 33, 69, 49, 21, + 52, 35, 6, 29, 15, 0, 0, 0, 0, 148, 110, 56, 132, 97, 48, + 117, 87, 40, 100, 75, 31, 84, 62, 22, 68, 49, 9, 51, 35, 0, + 28, 15, 0, 0, 0, 0, 142, 91, 166, 126, 80, 148, 113, 71, 132, + 98, 59, 115, 83, 47, 99, 69, 34, 82, 53, 17, 64, 32, 0, 41, + 0, 0, 0, 143, 91, 150, 128, 81, 135, 114, 71, 120, 99, 60, 104, + 85, 48, 89, 69, 35, 73, 53, 19, 56, 32, 0, 34, 0, 0, 0, + 145, 91, 137, 129, 81, 122, 115, 71, 109, 100, 60, 94, 85, 48, 81, + 69, 35, 65, 53, 19, 49, 32, 0, 28, 0, 0, 0, 146, 92, 124, + 130, 81, 110, 115, 71, 98, 100, 60, 84, 85, 49, 71, 69, 36, 57, + 53, 21, 42, 32, 0, 21, 0, 0, 0, 147, 91, 110, 130, 81, 97, + 115, 71, 86, 100, 60, 74, 84, 49, 62, 69, 36, 48, 53, 22, 34, + 32, 0, 13, 0, 0, 0, 147, 92, 97, 130, 81, 85, 116, 72, 76, + 100, 60, 63, 85, 49, 52, 69, 37, 40, 53, 22, 26, 31, 1, 5, + 0, 0, 0, 148, 92, 82, 131, 81, 71, 116, 71, 62, 100, 60, 53, + 84, 49, 42, 69, 37, 30, 52, 23, 16, 31, 2, 0, 0, 0, 0, + 148, 91, 67, 132, 81, 57, 117, 71, 49, 100, 60, 39, 84, 49, 30, + 69, 37, 18, 52, 23, 2, 30, 2, 0, 0, 0, 0, 149, 91, 54, + 132, 81, 46, 118, 71, 39, 101, 60, 29, 85, 49, 19, 69, 37, 6, + 52, 23, 0, 29, 3, 0, 0, 0, 0, 143, 68, 153, 128, 59, 137, + 115, 49, 122, 99, 39, 107, 85, 28, 91, 70, 13, 75, 54, 0, 58, + 32, 0, 36, 0, 0, 0, 146, 68, 140, 131, 59, 125, 116, 51, 111, + 100, 40, 97, 85, 29, 82, 70, 15, 67, 54, 0, 50, 32, 0, 29, + 0, 0, 0, 147, 68, 127, 131, 59, 114, 117, 51, 102, 101, 41, 88, + 86, 30, 74, 70, 17, 60, 54, 0, 44, 32, 0, 23, 0, 0, 0, + 147, 70, 115, 131, 60, 103, 116, 52, 91, 100, 42, 78, 85, 32, 65, + 70, 19, 53, 54, 1, 38, 32, 0, 17, 0, 0, 0, 147, 70, 103, + 131, 61, 91, 117, 53, 81, 101, 43, 69, 86, 32, 57, 70, 20, 44, + 54, 2, 30, 32, 0, 7, 0, 0, 0, 148, 70, 91, 132, 61, 80, + 117, 52, 70, 101, 43, 59, 85, 33, 48, 70, 21, 36, 53, 4, 22, + 32, 0, 3, 0, 0, 0, 148, 70, 78, 132, 62, 68, 117, 53, 58, + 101, 43, 48, 85, 34, 38, 70, 22, 26, 53, 6, 12, 31, 0, 0, + 0, 0, 0, 149, 71, 64, 132, 62, 54, 118, 54, 46, 101, 44, 37, + 85, 34, 27, 69, 23, 15, 53, 7, 1, 30, 0, 0, 0, 0, 0, + 150, 70, 53, 134, 61, 44, 118, 54, 36, 101, 44, 28, 85, 35, 17, + 69, 23, 4, 52, 8, 0, 30, 0, 0, 0, 0, 0, 145, 38, 143, + 130, 29, 128, 117, 18, 114, 101, 3, 98, 87, 0, 84, 72, 0, 69, + 54, 0, 53, 30, 0, 31, 0, 0, 0, 147, 38, 130, 132, 30, 116, + 117, 22, 103, 101, 8, 89, 87, 0, 76, 72, 0, 62, 54, 0, 46, + 30, 0, 24, 0, 0, 0, 148, 40, 119, 132, 31, 105, 117, 23, 94, + 101, 13, 81, 87, 0, 68, 71, 0, 55, 54, 0, 39, 30, 0, 18, + 0, 0, 0, 148, 42, 108, 132, 34, 96, 117, 25, 85, 102, 15, 73, + 86, 2, 60, 71, 0, 47, 54, 0, 33, 30, 0, 11, 0, 0, 0, + 148, 43, 96, 133, 35, 85, 117, 28, 75, 102, 18, 64, 87, 5, 52, + 71, 0, 40, 54, 0, 25, 30, 0, 5, 0, 0, 0, 149, 44, 85, + 132, 36, 75, 118, 29, 66, 101, 20, 55, 86, 8, 44, 70, 0, 32, + 53, 0, 18, 29, 0, 2, 0, 0, 0, 149, 45, 74, 133, 37, 64, + 118, 31, 55, 102, 21, 45, 85, 10, 34, 70, 0, 22, 53, 0, 6, + 28, 0, 0, 0, 0, 0, 150, 46, 61, 133, 39, 52, 118, 31, 44, + 102, 23, 34, 85, 12, 24, 70, 0, 12, 52, 0, 0, 28, 0, 0, + 0, 0, 0, 150, 46, 51, 133, 40, 42, 119, 32, 35, 102, 24, 25, + 85, 13, 14, 70, 0, 1, 52, 0, 0, 27, 0, 0, 0, 0, 0, + 53, 198, 244, 49, 177, 218, 41, 158, 195, 32, 138, 171, 22, 118, 147, + 11, 98, 124, 0, 78, 100, 0, 54, 71, 0, 18, 34, 69, 196, 220, + 64, 175, 196, 54, 157, 176, 45, 137, 154, 32, 117, 133, 19, 98, 111, + 0, 78, 89, 0, 53, 63, 0, 17, 27, 80, 195, 198, 69, 175, 179, + 60, 156, 159, 50, 136, 139, 38, 116, 120, 25, 98, 101, 4, 77, 80, + 0, 53, 55, 0, 17, 21, 84, 193, 177, 75, 173, 159, 64, 155, 142, + 55, 135, 124, 41, 116, 107, 27, 97, 89, 9, 76, 70, 0, 53, 47, + 0, 17, 11, 89, 193, 157, 79, 172, 140, 70, 154, 125, 57, 134, 109, + 44, 115, 92, 32, 96, 76, 13, 76, 59, 0, 52, 39, 0, 16, 4, + 94, 191, 135, 85, 171, 121, 72, 152, 108, 60, 133, 94, 47, 114, 80, + 32, 95, 65, 15, 76, 49, 0, 52, 29, 0, 16, 0, 98, 190, 113, + 87, 170, 100, 76, 152, 89, 62, 132, 77, 49, 113, 65, 35, 95, 52, + 18, 75, 37, 0, 52, 18, 0, 15, 0, 103, 190, 89, 90, 169, 80, + 78, 151, 70, 64, 132, 60, 51, 113, 49, 37, 94, 38, 20, 75, 25, + 0, 52, 5, 0, 15, 0, 106, 189, 69, 93, 169, 61, 80, 151, 53, + 66, 131, 45, 52, 113, 36, 37, 94, 25, 19, 74, 11, 0, 51, 0, + 0, 15, 0, 76, 178, 229, 68, 159, 205, 61, 142, 183, 50, 124, 160, + 40, 106, 138, 28, 88, 116, 12, 69, 93, 0, 45, 66, 0, 5, 29, + 86, 177, 207, 78, 158, 184, 67, 142, 166, 56, 123, 145, 45, 106, 125, + 31, 88, 105, 16, 69, 83, 0, 45, 58, 0, 6, 22, 93, 176, 187, + 81, 158, 168, 71, 141, 150, 61, 123, 131, 47, 105, 113, 35, 87, 94, + 20, 68, 74, 0, 45, 51, 0, 5, 16, 98, 175, 168, 84, 157, 150, + 75, 140, 134, 63, 122, 117, 50, 104, 100, 37, 87, 83, 21, 68, 65, + 0, 45, 42, 0, 4, 7, 100, 174, 149, 89, 155, 132, 76, 139, 117, + 65, 121, 102, 53, 104, 87, 39, 86, 72, 23, 67, 55, 0, 45, 34, + 0, 3, 0, 103, 173, 130, 92, 155, 115, 80, 138, 102, 68, 120, 88, + 53, 103, 75, 40, 86, 61, 24, 67, 45, 0, 45, 25, 0, 3, 0, + 107, 172, 108, 95, 154, 96, 82, 137, 85, 70, 119, 73, 55, 102, 61, + 42, 85, 49, 25, 67, 34, 0, 45, 14, 0, 3, 0, 110, 172, 86, + 97, 153, 76, 85, 137, 67, 70, 119, 57, 56, 102, 46, 42, 84, 35, + 26, 66, 21, 0, 44, 1, 0, 3, 0, 112, 171, 67, 98, 153, 59, + 86, 137, 52, 71, 119, 44, 58, 102, 34, 44, 85, 22, 27, 66, 7, + 0, 44, 0, 0, 3, 0, 90, 160, 215, 81, 144, 193, 70, 129, 173, + 61, 112, 151, 49, 95, 131, 37, 79, 109, 22, 61, 87, 0, 38, 61, + 0, 0, 25, 96, 160, 194, 86, 143, 174, 75, 128, 157, 65, 112, 137, + 53, 95, 117, 40, 78, 98, 25, 60, 78, 0, 38, 53, 0, 0, 17, + 100, 159, 177, 89, 143, 159, 79, 128, 143, 67, 111, 124, 55, 95, 107, + 42, 78, 89, 27, 60, 70, 2, 38, 46, 0, 0, 9, 104, 158, 159, + 92, 142, 143, 81, 127, 127, 69, 110, 110, 56, 94, 94, 43, 78, 78, + 28, 60, 60, 2, 38, 38, 0, 0, 1, 107, 157, 140, 94, 141, 125, + 82, 126, 112, 71, 110, 97, 59, 94, 82, 45, 77, 67, 29, 59, 51, + 4, 37, 30, 0, 0, 0, 110, 156, 122, 97, 140, 109, 85, 125, 97, + 72, 109, 83, 58, 93, 71, 45, 77, 57, 29, 60, 42, 5, 38, 22, + 0, 0, 0, 111, 156, 103, 99, 139, 91, 87, 125, 81, 73, 108, 69, + 60, 92, 58, 46, 77, 45, 30, 59, 31, 5, 38, 12, 0, 0, 0, + 115, 156, 82, 101, 140, 73, 88, 124, 63, 74, 108, 53, 60, 92, 44, + 46, 76, 32, 31, 59, 18, 6, 37, 0, 0, 0, 0, 116, 155, 65, + 102, 139, 58, 89, 124, 49, 75, 108, 41, 61, 92, 32, 48, 76, 21, + 31, 59, 6, 5, 37, 0, 0, 0, 0, 100, 141, 201, 88, 127, 181, + 79, 114, 162, 69, 99, 142, 57, 83, 122, 44, 68, 102, 30, 51, 81, + 7, 28, 56, 0, 0, 19, 105, 141, 182, 94, 127, 163, 83, 114, 146, + 71, 98, 128, 59, 83, 110, 46, 68, 91, 31, 51, 72, 10, 28, 48, + 0, 0, 11, 108, 141, 166, 96, 127, 149, 85, 113, 133, 73, 98, 116, + 60, 83, 99, 46, 68, 82, 32, 51, 64, 11, 29, 41, 0, 0, 2, + 111, 141, 149, 98, 126, 134, 88, 112, 119, 74, 97, 103, 61, 83, 88, + 48, 67, 72, 33, 51, 56, 11, 29, 34, 0, 0, 0, 112, 140, 132, + 100, 125, 118, 89, 112, 105, 75, 97, 91, 62, 82, 77, 49, 68, 62, + 33, 51, 47, 12, 29, 26, 0, 0, 0, 115, 140, 116, 102, 125, 103, + 90, 111, 91, 76, 96, 78, 62, 82, 65, 49, 67, 52, 34, 51, 38, + 13, 29, 18, 0, 0, 0, 117, 139, 97, 103, 124, 87, 91, 111, 77, + 78, 96, 65, 63, 81, 54, 49, 67, 41, 34, 51, 27, 12, 29, 7, + 0, 0, 0, 119, 138, 78, 105, 124, 69, 92, 110, 60, 78, 95, 50, + 65, 81, 40, 50, 67, 29, 34, 51, 15, 13, 30, 0, 0, 0, 0, + 120, 138, 64, 106, 124, 54, 93, 110, 47, 78, 95, 38, 65, 81, 29, + 50, 66, 17, 34, 50, 2, 13, 29, 0, 0, 0, 0, 107, 124, 189, + 96, 111, 169, 85, 99, 152, 73, 85, 132, 61, 71, 114, 48, 57, 95, + 34, 41, 75, 14, 18, 51, 0, 0, 13, 111, 124, 171, 100, 111, 153, + 88, 99, 137, 75, 85, 120, 63, 72, 103, 50, 58, 85, 36, 41, 66, + 15, 19, 43, 0, 0, 4, 113, 124, 156, 101, 111, 139, 90, 99, 125, + 77, 85, 109, 64, 71, 93, 51, 57, 77, 36, 42, 59, 17, 20, 37, + 0, 0, 0, 115, 124, 140, 103, 111, 125, 90, 99, 112, 78, 85, 97, + 64, 71, 82, 52, 57, 67, 36, 42, 50, 16, 20, 30, 0, 0, 0, + 117, 123, 125, 104, 110, 111, 92, 98, 99, 79, 85, 86, 65, 71, 72, + 51, 58, 59, 37, 42, 43, 17, 21, 22, 0, 0, 0, 118, 123, 110, + 105, 110, 97, 93, 98, 86, 78, 84, 74, 66, 71, 62, 52, 57, 49, + 37, 42, 34, 17, 22, 14, 0, 0, 0, 120, 123, 93, 106, 109, 82, + 94, 97, 72, 80, 84, 61, 66, 71, 50, 52, 57, 38, 37, 42, 24, + 17, 22, 2, 0, 0, 0, 121, 122, 75, 108, 109, 66, 95, 97, 58, + 80, 84, 48, 66, 71, 37, 52, 57, 26, 37, 42, 12, 16, 22, 0, + 0, 0, 0, 122, 123, 62, 108, 109, 52, 95, 97, 45, 81, 84, 36, + 67, 70, 26, 52, 57, 14, 37, 42, 0, 15, 22, 0, 0, 0, 0, + 113, 107, 177, 102, 96, 159, 89, 85, 141, 78, 72, 124, 65, 60, 107, + 52, 46, 89, 37, 30, 70, 18, 5, 46, 0, 0, 6, 116, 107, 160, + 104, 96, 144, 92, 85, 129, 80, 72, 112, 67, 60, 96, 53, 47, 80, + 38, 31, 62, 19, 7, 39, 0, 0, 0, 118, 107, 147, 105, 96, 131, + 93, 85, 118, 80, 72, 101, 67, 60, 87, 54, 47, 71, 39, 31, 54, + 19, 8, 32, 0, 0, 0, 119, 107, 132, 106, 96, 118, 94, 85, 106, + 81, 73, 91, 67, 60, 77, 54, 47, 63, 39, 32, 47, 20, 9, 25, + 0, 0, 0, 119, 107, 118, 106, 95, 105, 94, 85, 93, 81, 72, 80, + 68, 60, 68, 54, 47, 54, 39, 32, 39, 20, 11, 18, 0, 0, 0, + 121, 107, 104, 107, 96, 92, 95, 84, 80, 81, 72, 69, 68, 61, 58, + 54, 48, 46, 39, 33, 31, 20, 12, 9, 0, 0, 0, 123, 107, 88, + 108, 95, 77, 96, 84, 68, 82, 72, 57, 68, 60, 46, 54, 47, 35, + 39, 33, 20, 19, 13, 2, 0, 0, 0, 123, 106, 72, 110, 95, 63, + 96, 84, 54, 82, 72, 45, 69, 60, 35, 55, 48, 23, 39, 33, 9, + 18, 14, 0, 0, 0, 0, 125, 106, 60, 110, 94, 50, 98, 84, 42, + 83, 72, 34, 69, 60, 25, 55, 48, 12, 39, 33, 0, 17, 13, 0, + 0, 0, 0, 118, 89, 165, 105, 79, 148, 93, 69, 132, 81, 57, 115, + 68, 45, 99, 55, 32, 82, 41, 15, 64, 21, 0, 41, 0, 0, 0, + 120, 89, 150, 107, 79, 135, 96, 69, 121, 82, 58, 105, 70, 46, 89, + 56, 34, 73, 41, 17, 56, 21, 0, 34, 0, 0, 0, 121, 89, 137, + 108, 79, 123, 96, 69, 109, 82, 58, 95, 70, 47, 81, 56, 34, 66, + 41, 18, 49, 21, 0, 28, 0, 0, 0, 122, 90, 124, 109, 79, 110, + 96, 69, 99, 83, 58, 85, 70, 47, 72, 56, 35, 58, 41, 19, 42, + 21, 0, 22, 0, 0, 0, 123, 90, 111, 110, 79, 98, 97, 69, 87, + 83, 59, 75, 70, 47, 63, 56, 35, 50, 41, 20, 35, 21, 0, 14, + 0, 0, 0, 123, 90, 98, 110, 79, 87, 97, 70, 76, 84, 58, 64, + 70, 48, 53, 56, 36, 41, 40, 21, 26, 21, 0, 5, 0, 0, 0, + 125, 89, 84, 111, 79, 73, 97, 69, 64, 84, 59, 54, 70, 48, 43, + 56, 36, 31, 40, 22, 17, 20, 1, 1, 0, 0, 0, 125, 89, 69, + 112, 79, 60, 98, 70, 51, 84, 59, 42, 70, 48, 32, 56, 36, 20, + 41, 22, 5, 19, 2, 0, 0, 0, 0, 126, 89, 57, 112, 79, 49, + 99, 70, 41, 84, 59, 32, 70, 48, 22, 56, 36, 10, 40, 22, 0, + 18, 2, 0, 0, 0, 0, 121, 67, 154, 108, 58, 138, 97, 50, 124, + 84, 39, 107, 71, 28, 92, 58, 12, 76, 43, 0, 59, 20, 0, 37, + 0, 0, 0, 124, 68, 140, 111, 59, 126, 98, 50, 112, 84, 40, 98, + 71, 29, 83, 58, 15, 67, 42, 0, 51, 20, 0, 30, 0, 0, 0, + 124, 68, 129, 111, 59, 114, 99, 51, 102, 86, 41, 88, 71, 30, 75, + 58, 17, 60, 42, 0, 45, 20, 0, 24, 0, 0, 0, 125, 70, 116, + 111, 60, 103, 99, 51, 92, 85, 41, 79, 71, 31, 66, 58, 19, 53, + 42, 3, 38, 20, 0, 17, 0, 0, 0, 125, 70, 104, 111, 61, 93, + 99, 52, 81, 85, 43, 69, 72, 32, 58, 58, 20, 45, 42, 4, 31, + 20, 0, 8, 0, 0, 0, 126, 70, 92, 111, 61, 81, 99, 52, 71, + 85, 42, 60, 71, 33, 49, 57, 21, 37, 42, 6, 23, 20, 0, 3, + 0, 0, 0, 126, 70, 79, 112, 61, 70, 99, 53, 60, 85, 43, 50, + 71, 33, 39, 57, 22, 28, 41, 7, 13, 19, 0, 0, 0, 0, 0, + 127, 71, 66, 113, 62, 56, 100, 53, 48, 86, 44, 39, 71, 34, 29, + 57, 23, 18, 41, 8, 2, 18, 0, 0, 0, 0, 0, 128, 70, 55, + 114, 62, 46, 100, 54, 39, 86, 44, 30, 71, 34, 20, 57, 23, 7, + 41, 9, 0, 18, 0, 0, 0, 0, 0, 124, 41, 145, 111, 32, 128, + 99, 23, 114, 86, 10, 100, 73, 0, 85, 60, 0, 71, 43, 0, 54, + 17, 0, 32, 0, 0, 0, 126, 42, 131, 113, 33, 117, 100, 25, 104, + 86, 14, 90, 73, 0, 77, 60, 0, 63, 44, 0, 47, 18, 0, 25, + 0, 0, 0, 127, 43, 120, 113, 34, 106, 101, 26, 95, 86, 17, 82, + 73, 2, 69, 59, 0, 56, 43, 0, 41, 18, 0, 19, 0, 0, 0, + 127, 45, 109, 113, 37, 97, 101, 28, 85, 86, 19, 74, 73, 5, 61, + 59, 0, 48, 43, 0, 34, 19, 0, 11, 0, 0, 0, 127, 46, 98, + 114, 38, 86, 100, 30, 76, 87, 21, 65, 73, 9, 54, 59, 0, 41, + 43, 0, 26, 18, 0, 5, 0, 0, 0, 127, 47, 87, 113, 39, 76, + 101, 31, 67, 86, 22, 56, 72, 11, 45, 59, 0, 33, 43, 0, 19, + 18, 0, 2, 0, 0, 0, 128, 48, 75, 114, 39, 65, 101, 33, 56, + 86, 23, 46, 72, 12, 36, 58, 0, 24, 42, 0, 9, 17, 0, 0, + 0, 0, 0, 129, 48, 63, 114, 41, 54, 102, 33, 46, 87, 24, 36, + 72, 14, 26, 58, 1, 14, 42, 0, 2, 16, 0, 0, 0, 0, 0, + 128, 48, 53, 114, 41, 44, 102, 34, 37, 87, 25, 27, 72, 15, 17, + 58, 1, 3, 41, 0, 0, 15, 0, 0, 0, 0, 0, 0, 189, 242, + 0, 169, 217, 0, 151, 194, 0, 132, 170, 0, 113, 147, 0, 94, 123, + 0, 74, 99, 0, 51, 71, 0, 15, 34, 1, 187, 219, 1, 167, 195, + 0, 150, 175, 0, 131, 153, 0, 113, 132, 0, 94, 111, 0, 74, 89, + 0, 50, 63, 0, 13, 28, 1, 186, 198, 1, 167, 178, 0, 149, 158, + 0, 130, 139, 0, 111, 119, 0, 93, 100, 0, 74, 80, 0, 50, 55, + 0, 13, 22, 1, 185, 176, 1, 165, 159, 1, 148, 142, 0, 129, 123, + 0, 111, 106, 0, 93, 89, 0, 73, 70, 0, 50, 47, 0, 13, 13, + 1, 184, 157, 1, 164, 141, 1, 147, 125, 0, 128, 110, 0, 110, 93, + 0, 92, 77, 0, 73, 60, 0, 50, 39, 0, 12, 5, 25, 182, 137, + 25, 163, 122, 17, 146, 109, 0, 128, 96, 0, 110, 81, 0, 92, 66, + 0, 73, 51, 0, 50, 30, 0, 10, 0, 42, 181, 114, 35, 163, 102, + 30, 145, 91, 14, 127, 80, 0, 109, 67, 0, 91, 53, 0, 72, 39, + 0, 50, 19, 0, 10, 0, 52, 181, 92, 43, 162, 83, 32, 145, 73, + 19, 126, 63, 0, 108, 52, 0, 90, 40, 0, 72, 27, 0, 50, 7, + 0, 10, 0, 57, 181, 74, 48, 162, 66, 37, 144, 57, 24, 126, 49, + 7, 108, 40, 0, 90, 29, 0, 72, 15, 0, 49, 0, 0, 10, 0, + 1, 170, 227, 1, 152, 203, 0, 136, 182, 0, 119, 159, 0, 101, 137, + 0, 84, 115, 0, 65, 92, 0, 43, 66, 0, 1, 29, 1, 169, 206, + 1, 151, 184, 1, 136, 165, 0, 118, 144, 0, 102, 125, 0, 84, 105, + 0, 65, 83, 0, 43, 58, 0, 0, 22, 29, 168, 186, 21, 151, 167, + 14, 135, 150, 4, 118, 131, 0, 101, 112, 0, 83, 94, 0, 65, 75, + 0, 43, 51, 0, 0, 16, 41, 167, 167, 33, 150, 150, 31, 134, 134, + 19, 117, 117, 4, 100, 100, 0, 83, 83, 0, 65, 65, 0, 42, 43, + 0, 0, 8, 48, 167, 149, 41, 149, 133, 33, 133, 118, 25, 116, 103, + 13, 99, 88, 0, 83, 73, 0, 65, 56, 0, 42, 35, 0, 0, 0, + 58, 165, 130, 49, 148, 115, 42, 132, 103, 31, 115, 89, 18, 99, 75, + 0, 82, 61, 0, 64, 46, 0, 42, 26, 0, 0, 0, 62, 164, 110, + 55, 147, 97, 45, 132, 87, 35, 115, 75, 22, 98, 63, 5, 82, 50, + 0, 64, 36, 0, 42, 16, 0, 0, 0, 69, 164, 89, 60, 147, 78, + 50, 131, 70, 37, 114, 59, 26, 98, 49, 10, 81, 37, 0, 64, 24, + 0, 42, 4, 0, 0, 0, 71, 164, 71, 63, 147, 63, 53, 131, 55, + 40, 114, 47, 28, 98, 38, 13, 81, 26, 0, 64, 12, 0, 42, 0, + 0, 0, 0, 28, 153, 214, 24, 138, 193, 23, 123, 171, 16, 107, 150, + 0, 91, 130, 0, 75, 109, 0, 58, 87, 0, 35, 61, 0, 0, 25, + 48, 153, 194, 41, 138, 174, 34, 123, 156, 27, 107, 136, 16, 91, 117, + 1, 75, 98, 0, 57, 78, 0, 35, 53, 0, 0, 17, 55, 153, 177, + 47, 137, 158, 42, 122, 142, 33, 107, 124, 22, 91, 106, 6, 75, 88, + 0, 57, 70, 0, 35, 46, 0, 0, 9, 61, 152, 158, 53, 136, 143, + 45, 122, 127, 36, 106, 111, 24, 90, 94, 10, 74, 78, 0, 57, 61, + 0, 35, 39, 0, 0, 2, 67, 151, 141, 59, 135, 126, 49, 121, 112, + 39, 105, 98, 29, 90, 83, 14, 74, 68, 0, 57, 52, 0, 35, 31, + 0, 0, 0, 71, 150, 123, 62, 135, 110, 54, 120, 98, 42, 105, 84, + 31, 89, 71, 16, 74, 58, 0, 57, 43, 0, 35, 22, 0, 0, 0, + 74, 150, 105, 64, 134, 92, 55, 120, 83, 45, 104, 71, 34, 89, 59, + 20, 73, 47, 0, 57, 32, 0, 35, 13, 0, 0, 0, 78, 149, 84, + 69, 134, 75, 59, 120, 66, 47, 103, 56, 34, 88, 46, 22, 73, 34, + 1, 57, 20, 0, 35, 1, 0, 0, 0, 80, 149, 69, 70, 133, 61, + 60, 119, 53, 49, 103, 44, 36, 88, 35, 23, 73, 24, 2, 56, 10, + 0, 35, 0, 0, 0, 0, 58, 136, 200, 50, 122, 180, 45, 109, 162, + 38, 94, 141, 27, 80, 121, 15, 65, 102, 0, 48, 81, 0, 26, 56, + 0, 0, 19, 66, 136, 182, 59, 122, 163, 52, 109, 146, 42, 94, 128, + 32, 80, 109, 20, 65, 91, 2, 48, 72, 0, 26, 49, 0, 0, 11, + 70, 136, 165, 62, 122, 149, 55, 108, 133, 46, 94, 116, 35, 80, 99, + 21, 65, 82, 4, 49, 64, 0, 26, 41, 0, 0, 3, 76, 135, 149, + 66, 121, 133, 58, 108, 119, 48, 94, 103, 36, 79, 88, 23, 65, 73, + 7, 49, 56, 0, 27, 34, 0, 0, 0, 78, 135, 133, 69, 120, 118, + 60, 107, 106, 50, 93, 92, 39, 79, 77, 26, 65, 63, 8, 49, 47, + 0, 27, 26, 0, 0, 0, 82, 134, 117, 71, 120, 104, 62, 107, 92, + 51, 93, 79, 39, 78, 66, 27, 64, 53, 10, 48, 39, 0, 27, 18, + 0, 0, 0, 84, 134, 99, 73, 119, 87, 64, 106, 77, 53, 92, 66, + 42, 78, 55, 28, 64, 42, 11, 48, 29, 0, 28, 9, 0, 0, 0, + 87, 133, 81, 76, 119, 72, 66, 106, 62, 55, 92, 52, 43, 78, 42, + 29, 64, 31, 12, 48, 17, 0, 28, 0, 0, 0, 0, 88, 134, 67, + 77, 119, 58, 68, 106, 51, 56, 92, 42, 44, 78, 32, 30, 64, 20, + 12, 48, 6, 0, 28, 0, 0, 0, 0, 73, 120, 189, 64, 107, 168, + 57, 96, 151, 47, 82, 133, 38, 69, 114, 26, 55, 95, 11, 39, 75, + 0, 16, 51, 0, 0, 14, 78, 120, 171, 69, 107, 153, 62, 95, 137, + 51, 82, 119, 40, 69, 102, 29, 55, 85, 15, 39, 66, 0, 17, 44, + 0, 0, 4, 81, 120, 156, 71, 107, 140, 64, 95, 125, 53, 82, 109, + 42, 69, 93, 31, 55, 77, 16, 39, 59, 0, 18, 37, 0, 0, 0, + 85, 120, 141, 74, 107, 126, 65, 95, 112, 54, 82, 97, 43, 69, 82, + 32, 55, 67, 17, 39, 51, 0, 19, 30, 0, 0, 0, 86, 119, 126, + 76, 106, 112, 66, 95, 100, 56, 81, 85, 45, 69, 72, 33, 55, 59, + 18, 40, 43, 0, 19, 22, 0, 0, 0, 89, 119, 110, 78, 106, 98, + 69, 94, 87, 56, 81, 75, 46, 68, 62, 33, 55, 49, 18, 40, 35, + 0, 20, 15, 0, 0, 0, 89, 119, 95, 80, 106, 83, 70, 94, 73, + 58, 81, 63, 46, 68, 51, 34, 55, 39, 19, 40, 25, 0, 20, 4, + 0, 0, 0, 92, 118, 78, 82, 106, 68, 70, 93, 59, 59, 81, 49, + 47, 68, 39, 34, 55, 28, 19, 40, 14, 0, 20, 0, 0, 0, 0, + 93, 118, 65, 82, 105, 55, 72, 93, 48, 60, 81, 39, 47, 68, 29, + 34, 55, 18, 20, 40, 2, 0, 20, 0, 0, 0, 0, 83, 104, 177, + 74, 93, 159, 65, 82, 142, 56, 70, 124, 45, 57, 106, 33, 44, 89, + 20, 28, 70, 1, 4, 46, 0, 0, 8, 86, 104, 161, 78, 93, 145, + 68, 82, 128, 58, 70, 112, 48, 58, 96, 35, 45, 80, 21, 29, 62, + 1, 6, 40, 0, 0, 0, 89, 104, 147, 79, 93, 131, 69, 82, 118, + 59, 70, 102, 47, 58, 87, 36, 45, 72, 23, 29, 55, 3, 7, 33, + 0, 0, 0, 90, 104, 132, 80, 93, 119, 71, 82, 106, 60, 70, 91, + 48, 58, 77, 37, 45, 62, 23, 30, 47, 4, 7, 26, 0, 0, 0, + 92, 104, 118, 82, 93, 105, 72, 82, 93, 61, 69, 80, 50, 58, 68, + 37, 45, 55, 23, 30, 39, 4, 8, 18, 0, 0, 0, 94, 104, 105, + 82, 92, 93, 72, 82, 82, 61, 70, 70, 50, 58, 58, 38, 46, 46, + 23, 31, 31, 6, 10, 11, 0, 0, 0, 95, 104, 90, 84, 92, 79, + 74, 82, 70, 62, 70, 58, 50, 58, 48, 37, 46, 36, 23, 31, 22, + 4, 11, 3, 0, 0, 0, 96, 103, 74, 85, 92, 65, 75, 81, 56, + 63, 70, 47, 50, 58, 37, 38, 46, 25, 24, 31, 11, 3, 11, 0, + 0, 0, 0, 97, 103, 62, 86, 92, 53, 76, 81, 45, 63, 69, 36, + 51, 58, 27, 38, 46, 15, 23, 31, 0, 3, 11, 0, 0, 0, 0, + 90, 87, 165, 81, 77, 148, 72, 67, 132, 62, 55, 116, 50, 44, 99, + 39, 31, 82, 25, 14, 64, 1, 0, 42, 0, 0, 1, 93, 87, 150, + 83, 77, 135, 74, 67, 121, 63, 56, 105, 52, 45, 90, 40, 32, 74, + 25, 16, 57, 3, 0, 35, 0, 0, 0, 95, 87, 138, 85, 77, 123, + 75, 67, 109, 63, 57, 95, 53, 45, 81, 41, 33, 66, 26, 17, 50, + 4, 0, 28, 0, 0, 0, 95, 88, 124, 85, 77, 111, 75, 67, 99, + 63, 57, 86, 53, 45, 72, 41, 33, 58, 26, 18, 43, 5, 1, 22, + 0, 0, 0, 97, 88, 112, 87, 77, 100, 76, 68, 88, 64, 57, 76, + 53, 46, 63, 41, 34, 50, 26, 19, 35, 5, 2, 14, 0, 0, 0, + 99, 87, 99, 87, 78, 88, 76, 68, 77, 65, 57, 65, 53, 46, 54, + 41, 35, 42, 27, 20, 27, 6, 2, 5, 0, 0, 0, 100, 87, 85, + 88, 77, 75, 77, 68, 65, 65, 57, 54, 53, 46, 44, 41, 35, 32, + 27, 21, 19, 5, 3, 2, 0, 0, 0, 100, 88, 71, 89, 77, 61, + 78, 68, 53, 66, 57, 44, 53, 47, 33, 41, 35, 22, 27, 21, 7, + 5, 3, 0, 0, 0, 0, 101, 87, 60, 90, 77, 52, 79, 68, 44, + 66, 58, 34, 53, 47, 25, 41, 35, 13, 26, 22, 0, 5, 3, 0, + 0, 0, 0, 97, 67, 155, 86, 58, 138, 77, 50, 125, 66, 39, 108, + 55, 28, 92, 43, 12, 76, 29, 0, 59, 2, 0, 37, 0, 0, 0, + 99, 67, 141, 88, 59, 127, 78, 50, 113, 68, 40, 98, 56, 29, 83, + 44, 15, 68, 29, 0, 52, 3, 0, 30, 0, 0, 0, 100, 68, 129, + 89, 59, 115, 80, 51, 103, 68, 41, 89, 56, 30, 75, 44, 16, 61, + 30, 0, 45, 4, 0, 24, 0, 0, 0, 100, 69, 118, 90, 60, 104, + 80, 51, 92, 67, 41, 79, 56, 31, 66, 44, 18, 53, 29, 2, 38, + 4, 0, 18, 0, 0, 0, 101, 69, 104, 90, 61, 93, 79, 51, 82, + 67, 42, 70, 56, 32, 59, 44, 20, 46, 29, 4, 31, 6, 0, 9, + 0, 0, 0, 102, 69, 93, 90, 61, 83, 80, 52, 72, 68, 42, 61, + 56, 33, 50, 43, 20, 38, 29, 5, 23, 7, 0, 4, 0, 0, 0, + 102, 70, 80, 91, 61, 71, 80, 52, 61, 68, 43, 51, 56, 32, 40, + 44, 21, 29, 30, 6, 14, 7, 0, 0, 0, 0, 0, 103, 70, 68, + 92, 61, 58, 81, 53, 50, 69, 43, 41, 56, 34, 31, 43, 22, 19, + 29, 7, 3, 7, 0, 0, 0, 0, 0, 104, 70, 57, 92, 61, 48, + 82, 53, 40, 69, 43, 32, 56, 34, 22, 43, 23, 10, 29, 8, 0, + 6, 0, 0, 0, 0, 0, 101, 45, 145, 91, 35, 129, 80, 26, 116, + 69, 15, 101, 59, 0, 86, 46, 0, 71, 31, 0, 55, 0, 0, 33, + 0, 0, 0, 104, 44, 132, 92, 36, 118, 82, 28, 105, 71, 17, 91, + 58, 3, 77, 46, 0, 63, 31, 0, 48, 2, 0, 26, 0, 0, 0, + 104, 46, 121, 93, 37, 107, 82, 30, 96, 70, 20, 83, 58, 6, 70, + 46, 0, 57, 32, 0, 41, 4, 0, 20, 0, 0, 0, 104, 48, 110, + 93, 40, 98, 82, 31, 87, 70, 22, 74, 59, 9, 62, 45, 0, 49, + 31, 0, 35, 6, 0, 13, 0, 0, 0, 104, 48, 99, 92, 41, 88, + 82, 32, 77, 70, 23, 65, 58, 11, 54, 46, 0, 42, 32, 0, 27, + 7, 0, 5, 0, 0, 0, 105, 50, 88, 93, 41, 77, 82, 34, 68, + 71, 24, 57, 58, 13, 46, 45, 1, 35, 31, 0, 21, 7, 0, 2, + 0, 0, 0, 105, 50, 76, 94, 41, 66, 83, 34, 57, 71, 25, 47, + 58, 15, 37, 45, 2, 25, 32, 0, 11, 7, 0, 0, 0, 0, 0, + 106, 50, 64, 94, 42, 55, 83, 35, 47, 71, 26, 38, 58, 16, 27, + 45, 4, 17, 31, 0, 4, 7, 0, 0, 0, 0, 0, 106, 51, 54, + 95, 42, 45, 83, 35, 38, 71, 27, 30, 58, 16, 19, 45, 5, 7, + 30, 0, 0, 6, 0, 0, 0, 0, 0, 0, 181, 240, 0, 162, 216, + 0, 144, 193, 0, 126, 168, 0, 109, 146, 0, 91, 123, 0, 71, 98, + 0, 48, 71, 0, 9, 34, 0, 179, 218, 0, 161, 195, 0, 144, 174, + 0, 126, 153, 0, 108, 132, 0, 90, 110, 0, 71, 88, 0, 48, 63, + 0, 8, 29, 0, 178, 197, 0, 159, 177, 0, 143, 159, 0, 125, 139, + 0, 107, 119, 0, 90, 99, 0, 71, 79, 0, 48, 55, 0, 8, 22, + 0, 177, 177, 0, 158, 158, 0, 142, 141, 0, 124, 123, 0, 107, 106, + 0, 89, 88, 0, 71, 70, 0, 48, 47, 0, 8, 14, 0, 176, 157, + 0, 158, 141, 0, 141, 126, 0, 123, 109, 0, 106, 93, 0, 89, 78, + 0, 70, 60, 0, 47, 39, 0, 7, 5, 0, 175, 138, 0, 157, 123, + 0, 141, 110, 0, 123, 96, 0, 105, 81, 0, 88, 67, 0, 70, 51, + 0, 48, 30, 0, 6, 0, 0, 173, 115, 0, 155, 104, 0, 140, 92, + 0, 122, 80, 0, 105, 67, 0, 88, 55, 0, 69, 40, 0, 47, 20, + 0, 6, 0, 0, 173, 94, 0, 155, 85, 0, 139, 75, 0, 121, 64, + 0, 104, 53, 0, 88, 42, 0, 70, 28, 0, 47, 9, 0, 6, 0, + 0, 173, 76, 0, 155, 70, 0, 138, 61, 0, 122, 53, 0, 104, 44, + 0, 87, 32, 0, 69, 18, 0, 47, 0, 0, 6, 0, 0, 164, 226, + 0, 147, 203, 0, 131, 181, 0, 114, 158, 0, 97, 136, 0, 80, 115, + 0, 63, 92, 0, 40, 65, 0, 0, 30, 0, 162, 205, 0, 145, 184, + 0, 130, 164, 0, 114, 143, 0, 97, 124, 0, 81, 104, 0, 63, 83, + 0, 40, 58, 0, 0, 23, 0, 162, 187, 0, 145, 167, 0, 130, 150, + 0, 113, 131, 0, 96, 112, 0, 80, 93, 0, 62, 74, 0, 40, 50, + 0, 0, 16, 0, 160, 167, 0, 144, 150, 0, 129, 134, 0, 112, 116, + 0, 96, 100, 0, 80, 82, 0, 62, 65, 0, 40, 43, 0, 0, 7, + 0, 160, 148, 0, 143, 133, 0, 128, 118, 0, 111, 103, 0, 96, 88, + 0, 80, 73, 0, 62, 56, 0, 40, 35, 0, 0, 0, 0, 158, 130, + 0, 142, 117, 0, 127, 104, 0, 111, 89, 0, 95, 76, 0, 79, 62, + 0, 62, 46, 0, 40, 26, 0, 0, 0, 0, 158, 111, 0, 141, 99, + 0, 127, 88, 0, 111, 76, 0, 95, 63, 0, 79, 51, 0, 62, 37, + 0, 40, 18, 0, 0, 0, 0, 158, 91, 0, 141, 81, 0, 126, 72, + 0, 110, 62, 0, 94, 50, 0, 79, 39, 0, 62, 25, 0, 40, 5, + 0, 0, 0, 0, 157, 74, 0, 141, 66, 0, 126, 59, 0, 110, 49, + 0, 94, 40, 0, 78, 29, 0, 61, 15, 0, 40, 0, 0, 0, 0, + 0, 148, 214, 0, 133, 192, 0, 119, 171, 0, 103, 150, 0, 87, 129, + 0, 72, 108, 0, 55, 86, 0, 32, 61, 0, 0, 25, 0, 147, 193, + 0, 132, 173, 0, 118, 155, 0, 103, 136, 0, 87, 116, 0, 72, 98, + 0, 55, 78, 0, 32, 53, 0, 0, 17, 0, 147, 176, 0, 132, 158, + 0, 118, 142, 0, 102, 124, 0, 87, 106, 0, 72, 88, 0, 55, 69, + 0, 33, 46, 0, 0, 9, 0, 146, 159, 0, 131, 142, 0, 117, 127, + 0, 102, 111, 0, 87, 95, 0, 71, 79, 0, 55, 61, 0, 33, 39, + 0, 0, 2, 0, 145, 140, 0, 130, 126, 0, 117, 112, 0, 101, 98, + 0, 86, 83, 0, 71, 68, 0, 55, 52, 0, 33, 31, 0, 0, 0, + 0, 144, 124, 0, 130, 111, 0, 116, 99, 0, 101, 84, 0, 86, 72, + 0, 71, 59, 0, 55, 43, 0, 33, 23, 0, 0, 0, 0, 144, 106, + 0, 129, 94, 0, 115, 83, 0, 101, 72, 0, 85, 60, 0, 71, 48, + 0, 55, 34, 0, 33, 14, 0, 0, 0, 3, 143, 86, 0, 129, 77, + 0, 115, 68, 0, 100, 58, 0, 85, 48, 0, 70, 36, 0, 54, 22, + 0, 33, 3, 0, 0, 0, 18, 143, 72, 13, 128, 63, 0, 115, 57, + 0, 100, 47, 0, 85, 37, 0, 70, 26, 0, 54, 13, 0, 33, 0, + 0, 0, 0, 0, 132, 200, 0, 118, 179, 0, 105, 161, 0, 91, 140, + 0, 76, 121, 0, 62, 101, 0, 46, 81, 0, 24, 56, 0, 0, 19, + 0, 131, 182, 0, 118, 163, 0, 105, 146, 0, 91, 128, 0, 77, 110, + 0, 62, 91, 0, 46, 72, 0, 25, 48, 0, 0, 11, 0, 131, 165, + 0, 117, 149, 0, 104, 133, 0, 91, 116, 0, 77, 99, 0, 62, 82, + 0, 46, 64, 0, 25, 41, 0, 0, 4, 0, 131, 149, 0, 116, 134, + 0, 104, 119, 0, 91, 104, 0, 77, 89, 0, 62, 73, 0, 46, 56, + 0, 25, 34, 0, 0, 0, 10, 130, 133, 2, 116, 119, 0, 104, 106, + 0, 90, 91, 0, 76, 78, 0, 62, 64, 0, 46, 48, 0, 26, 27, + 0, 0, 0, 23, 130, 118, 20, 116, 104, 13, 103, 93, 3, 89, 79, + 0, 76, 67, 0, 62, 54, 0, 46, 39, 0, 26, 19, 0, 0, 0, + 33, 129, 101, 27, 115, 89, 19, 103, 79, 9, 89, 67, 0, 75, 56, + 0, 61, 43, 0, 46, 29, 0, 26, 10, 0, 0, 0, 41, 128, 83, + 35, 115, 73, 27, 102, 64, 15, 89, 55, 0, 76, 45, 0, 62, 33, + 0, 46, 18, 0, 26, 0, 0, 0, 0, 43, 129, 69, 38, 115, 61, + 30, 102, 54, 17, 89, 45, 2, 75, 34, 0, 61, 23, 0, 46, 9, + 0, 26, 0, 0, 0, 0, 1, 116, 188, 1, 104, 168, 0, 92, 151, + 0, 79, 132, 0, 66, 113, 0, 52, 94, 0, 36, 75, 0, 14, 52, + 0, 0, 14, 17, 116, 171, 16, 104, 153, 14, 92, 137, 8, 79, 119, + 0, 67, 102, 0, 53, 85, 0, 37, 67, 0, 16, 44, 0, 0, 4, + 31, 116, 155, 27, 104, 140, 21, 92, 125, 13, 79, 109, 3, 66, 93, + 0, 53, 77, 0, 37, 59, 0, 16, 38, 0, 0, 0, 37, 115, 141, + 30, 103, 126, 26, 92, 112, 16, 79, 98, 5, 66, 83, 0, 53, 67, + 0, 38, 51, 0, 17, 31, 0, 0, 0, 41, 115, 126, 37, 103, 112, + 31, 92, 100, 22, 79, 86, 10, 66, 72, 0, 53, 59, 0, 38, 44, + 0, 17, 23, 0, 0, 0, 48, 115, 111, 41, 102, 99, 34, 91, 88, + 24, 78, 76, 14, 66, 63, 0, 53, 50, 0, 38, 36, 0, 18, 15, + 0, 0, 0, 51, 115, 95, 46, 102, 85, 37, 91, 74, 26, 78, 63, + 16, 66, 52, 0, 53, 40, 0, 38, 26, 0, 18, 5, 0, 0, 0, + 55, 114, 80, 47, 102, 69, 40, 90, 60, 30, 78, 51, 19, 66, 41, + 3, 53, 29, 0, 38, 15, 0, 17, 0, 0, 0, 0, 56, 114, 66, + 50, 102, 58, 40, 91, 50, 32, 78, 41, 18, 66, 32, 4, 53, 21, + 0, 38, 5, 0, 17, 0, 0, 0, 0, 39, 102, 178, 37, 90, 159, + 30, 79, 142, 21, 68, 124, 14, 55, 106, 0, 42, 89, 0, 26, 70, + 0, 4, 46, 0, 0, 8, 48, 102, 161, 42, 90, 145, 35, 79, 128, + 26, 68, 112, 19, 55, 96, 3, 43, 79, 0, 27, 62, 0, 6, 40, + 0, 0, 0, 50, 102, 147, 44, 90, 132, 37, 79, 118, 30, 68, 102, + 20, 56, 87, 7, 43, 72, 0, 28, 55, 0, 6, 34, 0, 0, 0, + 53, 101, 133, 47, 90, 118, 41, 79, 106, 32, 68, 91, 21, 56, 78, + 9, 43, 63, 0, 28, 47, 0, 6, 26, 0, 0, 0, 57, 101, 119, + 50, 89, 106, 42, 79, 94, 34, 67, 81, 24, 56, 68, 9, 44, 55, + 0, 29, 40, 0, 6, 19, 0, 0, 0, 60, 100, 105, 50, 90, 94, + 45, 80, 83, 36, 68, 71, 24, 56, 59, 11, 44, 46, 0, 29, 32, + 0, 7, 12, 0, 0, 0, 63, 101, 91, 55, 90, 80, 46, 79, 70, + 37, 68, 59, 26, 56, 49, 12, 44, 37, 1, 29, 23, 0, 7, 3, + 0, 0, 0, 64, 101, 75, 56, 89, 67, 48, 79, 57, 37, 68, 48, + 27, 56, 37, 15, 44, 26, 0, 29, 12, 0, 7, 0, 0, 0, 0, + 66, 101, 64, 58, 89, 55, 49, 79, 47, 39, 68, 38, 27, 56, 29, + 14, 44, 18, 1, 30, 2, 0, 7, 0, 0, 0, 0, 57, 86, 165, + 51, 75, 148, 45, 65, 133, 38, 54, 116, 28, 43, 100, 16, 29, 83, + 0, 13, 64, 0, 0, 42, 0, 0, 3, 60, 86, 151, 55, 75, 135, + 47, 66, 121, 39, 55, 105, 30, 44, 90, 18, 31, 74, 3, 16, 57, + 0, 1, 35, 0, 0, 0, 62, 86, 139, 56, 75, 123, 49, 66, 110, + 40, 55, 95, 30, 44, 81, 19, 31, 66, 4, 17, 51, 0, 1, 29, + 0, 0, 0, 65, 86, 125, 56, 76, 112, 49, 66, 99, 39, 55, 86, + 31, 44, 72, 19, 32, 59, 5, 18, 44, 0, 1, 23, 0, 0, 0, + 67, 86, 113, 58, 75, 100, 51, 66, 88, 41, 56, 77, 31, 45, 64, + 20, 32, 51, 6, 18, 35, 0, 1, 14, 0, 0, 0, 69, 86, 99, + 61, 76, 88, 52, 66, 78, 43, 56, 66, 32, 45, 55, 20, 33, 42, + 7, 19, 27, 0, 1, 6, 0, 0, 0, 69, 86, 86, 61, 76, 75, + 53, 67, 66, 43, 56, 55, 33, 45, 45, 21, 34, 34, 8, 20, 20, + 0, 2, 2, 0, 0, 0, 71, 86, 72, 63, 75, 62, 54, 66, 55, + 45, 56, 45, 33, 45, 35, 22, 34, 23, 7, 20, 8, 0, 2, 0, + 0, 0, 0, 71, 86, 62, 64, 75, 53, 55, 66, 46, 45, 56, 36, + 33, 46, 27, 22, 34, 15, 8, 20, 0, 0, 2, 0, 0, 0, 0, + 69, 67, 156, 61, 58, 140, 53, 50, 125, 45, 39, 108, 35, 28, 93, + 25, 12, 77, 12, 0, 59, 0, 0, 37, 0, 0, 0, 71, 68, 142, + 63, 59, 126, 56, 50, 114, 47, 40, 98, 37, 28, 84, 26, 15, 68, + 12, 0, 53, 0, 0, 30, 0, 0, 0, 72, 68, 130, 63, 59, 116, + 56, 50, 104, 47, 40, 90, 38, 30, 75, 27, 16, 61, 13, 0, 46, + 0, 0, 24, 0, 0, 0, 73, 69, 118, 65, 59, 105, 57, 51, 92, + 47, 41, 80, 37, 30, 67, 26, 18, 53, 14, 1, 39, 0, 0, 18, + 0, 0, 0, 74, 69, 106, 65, 60, 93, 57, 51, 82, 48, 41, 70, + 38, 31, 59, 26, 19, 46, 13, 2, 32, 0, 0, 10, 0, 0, 0, + 76, 69, 95, 66, 61, 84, 58, 52, 73, 48, 42, 61, 37, 32, 50, + 26, 20, 38, 14, 4, 24, 0, 0, 4, 0, 0, 0, 76, 69, 81, + 68, 60, 72, 58, 52, 62, 48, 42, 51, 38, 32, 41, 27, 21, 30, + 14, 4, 16, 0, 0, 1, 0, 0, 0, 76, 69, 68, 68, 61, 60, + 60, 52, 51, 49, 43, 41, 38, 33, 32, 27, 21, 20, 14, 5, 5, + 0, 0, 0, 0, 0, 0, 78, 70, 59, 69, 61, 50, 60, 52, 42, + 49, 43, 34, 39, 33, 24, 27, 22, 13, 14, 7, 1, 0, 0, 0, + 0, 0, 0, 75, 46, 146, 68, 38, 131, 60, 30, 117, 50, 19, 102, + 41, 4, 87, 29, 0, 72, 13, 0, 55, 0, 0, 33, 0, 0, 0, + 78, 47, 132, 70, 39, 119, 61, 30, 105, 53, 20, 92, 42, 5, 78, + 30, 0, 64, 13, 0, 49, 0, 0, 27, 0, 0, 0, 79, 48, 122, + 70, 40, 108, 62, 32, 96, 52, 22, 84, 42, 9, 71, 30, 0, 58, + 14, 0, 42, 0, 0, 20, 0, 0, 0, 79, 50, 111, 70, 42, 99, + 62, 33, 88, 52, 23, 74, 41, 11, 63, 29, 0, 50, 14, 0, 36, + 0, 0, 14, 0, 0, 0, 80, 50, 99, 70, 42, 89, 61, 34, 78, + 52, 25, 67, 41, 14, 55, 30, 0, 42, 15, 0, 28, 0, 0, 6, + 0, 0, 0, 81, 51, 89, 71, 43, 78, 62, 35, 69, 52, 25, 58, + 42, 15, 47, 30, 3, 36, 15, 0, 22, 0, 0, 3, 0, 0, 0, + 81, 51, 77, 71, 44, 68, 63, 36, 59, 53, 26, 49, 41, 16, 38, + 31, 4, 27, 16, 0, 12, 0, 0, 0, 0, 0, 0, 81, 52, 65, + 72, 43, 56, 63, 36, 48, 53, 27, 39, 41, 17, 29, 30, 4, 18, + 14, 0, 3, 0, 0, 0, 0, 0, 0, 81, 52, 55, 73, 44, 47, + 64, 36, 39, 53, 28, 32, 42, 18, 21, 31, 6, 9, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 174, 239, 0, 156, 214, 0, 139, 192, + 0, 121, 168, 0, 105, 145, 0, 87, 123, 0, 68, 98, 0, 46, 70, + 0, 3, 35, 0, 172, 217, 0, 155, 194, 0, 139, 173, 0, 121, 152, + 0, 104, 130, 0, 87, 110, 0, 69, 88, 0, 46, 63, 0, 4, 28, + 0, 171, 197, 0, 153, 175, 0, 138, 158, 0, 121, 139, 0, 103, 118, + 0, 86, 100, 0, 68, 79, 0, 46, 55, 0, 4, 22, 0, 170, 177, + 0, 152, 158, 0, 136, 141, 0, 119, 124, 0, 103, 106, 0, 86, 88, + 0, 68, 70, 0, 45, 47, 0, 3, 14, 0, 169, 157, 0, 152, 141, + 0, 136, 126, 0, 119, 109, 0, 102, 94, 0, 86, 78, 0, 68, 60, + 0, 46, 39, 0, 3, 5, 0, 167, 138, 0, 150, 124, 0, 135, 111, + 0, 118, 97, 0, 102, 82, 0, 85, 68, 0, 68, 52, 0, 46, 31, + 0, 3, 0, 0, 167, 118, 0, 150, 104, 0, 135, 94, 0, 118, 81, + 0, 101, 69, 0, 84, 56, 0, 67, 41, 0, 45, 21, 0, 3, 0, + 0, 166, 97, 0, 149, 87, 0, 134, 77, 0, 117, 67, 0, 101, 56, + 0, 85, 44, 0, 67, 30, 0, 45, 10, 0, 3, 0, 0, 165, 79, + 0, 149, 73, 0, 133, 64, 0, 117, 56, 0, 101, 46, 0, 85, 34, + 0, 68, 21, 0, 46, 1, 0, 3, 0, 0, 158, 225, 0, 141, 201, + 0, 126, 180, 0, 109, 158, 0, 94, 136, 0, 78, 114, 0, 60, 91, + 0, 38, 66, 0, 0, 30, 0, 156, 203, 0, 140, 183, 0, 125, 164, + 0, 109, 143, 0, 94, 124, 0, 78, 104, 0, 61, 83, 0, 38, 57, + 0, 0, 23, 0, 156, 186, 0, 140, 166, 0, 125, 150, 0, 109, 130, + 0, 93, 111, 0, 77, 93, 0, 60, 74, 0, 38, 50, 0, 0, 17, + 0, 155, 167, 0, 138, 149, 0, 124, 134, 0, 109, 117, 0, 93, 100, + 0, 76, 83, 0, 60, 65, 0, 38, 43, 0, 0, 9, 0, 153, 147, + 0, 138, 134, 0, 124, 120, 0, 107, 103, 0, 92, 88, 0, 77, 73, + 0, 60, 56, 0, 38, 35, 0, 0, 0, 0, 153, 131, 0, 137, 118, + 0, 122, 105, 0, 107, 90, 0, 91, 76, 0, 76, 63, 0, 60, 47, + 0, 39, 28, 0, 0, 0, 0, 153, 111, 0, 136, 100, 0, 123, 90, + 0, 107, 77, 0, 92, 65, 0, 76, 52, 0, 60, 37, 0, 38, 18, + 0, 0, 0, 0, 152, 93, 0, 136, 82, 0, 122, 74, 0, 106, 63, + 0, 91, 52, 0, 76, 40, 0, 59, 26, 0, 38, 6, 0, 0, 0, + 0, 151, 78, 0, 136, 69, 0, 121, 61, 0, 106, 52, 0, 91, 43, + 0, 76, 32, 0, 59, 17, 0, 38, 0, 0, 0, 0, 0, 143, 213, + 0, 128, 191, 0, 115, 171, 0, 100, 149, 0, 84, 128, 0, 69, 108, + 0, 52, 86, 0, 30, 61, 0, 0, 25, 0, 142, 193, 0, 127, 173, + 0, 114, 154, 0, 99, 134, 0, 84, 116, 0, 69, 98, 0, 52, 77, + 0, 31, 53, 0, 0, 18, 0, 141, 176, 0, 127, 158, 0, 114, 141, + 0, 98, 122, 0, 84, 105, 0, 69, 88, 0, 53, 69, 0, 31, 46, + 0, 0, 9, 0, 141, 159, 0, 126, 142, 0, 113, 127, 0, 98, 110, + 0, 83, 95, 0, 69, 78, 0, 53, 60, 0, 32, 39, 0, 0, 2, + 0, 140, 140, 0, 126, 126, 0, 112, 112, 0, 98, 98, 0, 83, 83, + 0, 68, 69, 0, 52, 52, 0, 31, 31, 0, 0, 0, 0, 140, 124, + 0, 125, 112, 0, 112, 100, 0, 97, 86, 0, 83, 72, 0, 68, 59, + 0, 52, 44, 0, 31, 23, 0, 0, 0, 0, 139, 106, 0, 125, 96, + 0, 111, 85, 0, 97, 72, 0, 83, 62, 0, 68, 49, 0, 52, 35, + 0, 31, 15, 0, 0, 0, 0, 138, 88, 0, 124, 79, 0, 111, 70, + 0, 96, 59, 0, 82, 48, 0, 68, 38, 0, 52, 24, 0, 31, 4, + 0, 0, 0, 0, 139, 76, 0, 124, 66, 0, 111, 58, 0, 96, 50, + 0, 82, 40, 0, 68, 29, 0, 52, 15, 0, 31, 0, 0, 0, 0, + 0, 129, 200, 0, 114, 179, 0, 102, 160, 0, 87, 139, 0, 74, 120, + 0, 60, 101, 0, 44, 81, 0, 22, 56, 0, 0, 19, 0, 127, 181, + 0, 114, 163, 0, 102, 146, 0, 88, 127, 0, 74, 109, 0, 60, 91, + 0, 44, 72, 0, 23, 48, 0, 0, 11, 0, 127, 166, 0, 113, 148, + 0, 101, 133, 0, 87, 115, 0, 74, 99, 0, 60, 82, 0, 44, 64, + 0, 23, 42, 0, 0, 4, 0, 127, 150, 0, 113, 134, 0, 101, 119, + 0, 87, 104, 0, 74, 89, 0, 60, 73, 0, 44, 56, 0, 23, 35, + 0, 0, 0, 0, 125, 134, 0, 112, 118, 0, 100, 106, 0, 87, 92, + 0, 73, 78, 0, 60, 64, 0, 44, 48, 0, 23, 27, 0, 0, 0, + 0, 125, 118, 0, 112, 105, 0, 100, 94, 0, 86, 80, 0, 73, 68, + 0, 60, 54, 0, 44, 39, 0, 23, 20, 0, 0, 0, 0, 125, 101, + 0, 111, 90, 0, 99, 80, 0, 86, 69, 0, 73, 58, 0, 59, 45, + 0, 44, 30, 0, 23, 11, 0, 0, 0, 0, 124, 85, 0, 111, 75, + 0, 99, 66, 0, 86, 56, 0, 73, 45, 0, 59, 34, 0, 44, 20, + 0, 23, 1, 0, 0, 0, 0, 125, 72, 0, 111, 62, 0, 99, 56, + 0, 86, 46, 0, 73, 36, 0, 60, 26, 0, 44, 12, 0, 23, 0, + 0, 0, 0, 0, 114, 188, 0, 101, 167, 0, 89, 150, 0, 77, 131, + 0, 64, 113, 0, 50, 95, 0, 34, 75, 0, 12, 52, 0, 0, 14, + 0, 113, 170, 0, 101, 153, 0, 89, 137, 0, 77, 120, 0, 64, 102, + 0, 50, 85, 0, 35, 67, 0, 12, 44, 0, 0, 4, 0, 113, 156, + 0, 100, 139, 0, 89, 125, 0, 77, 109, 0, 64, 92, 0, 51, 77, + 0, 35, 60, 0, 12, 38, 0, 0, 0, 0, 112, 141, 0, 100, 126, + 0, 89, 113, 0, 77, 98, 0, 64, 83, 0, 51, 68, 0, 35, 51, + 0, 12, 30, 0, 0, 0, 0, 112, 127, 0, 100, 112, 0, 89, 100, + 0, 76, 87, 0, 64, 74, 0, 51, 59, 0, 35, 44, 0, 13, 24, + 0, 0, 0, 0, 112, 111, 0, 100, 100, 0, 88, 88, 0, 76, 76, + 0, 64, 64, 0, 51, 52, 0, 36, 37, 0, 13, 17, 0, 0, 0, + 0, 111, 96, 0, 99, 85, 0, 88, 76, 0, 76, 64, 0, 64, 53, + 0, 51, 41, 0, 36, 27, 0, 13, 6, 0, 0, 0, 0, 111, 81, + 0, 99, 71, 0, 88, 62, 0, 76, 52, 0, 64, 43, 0, 51, 31, + 0, 36, 17, 0, 13, 0, 0, 0, 0, 0, 111, 69, 0, 99, 60, + 0, 88, 52, 0, 75, 43, 0, 63, 34, 0, 51, 21, 0, 36, 7, + 0, 13, 0, 0, 0, 0, 0, 99, 177, 0, 88, 158, 0, 77, 141, + 0, 66, 123, 0, 53, 106, 0, 40, 89, 0, 25, 71, 0, 5, 47, + 0, 0, 8, 0, 99, 160, 0, 88, 144, 0, 77, 129, 0, 66, 112, + 0, 54, 97, 0, 41, 80, 0, 26, 62, 0, 5, 40, 0, 0, 0, + 0, 99, 147, 0, 87, 132, 0, 78, 117, 0, 66, 102, 0, 54, 87, + 0, 42, 72, 0, 26, 55, 0, 5, 34, 0, 0, 0, 0, 99, 134, + 0, 88, 119, 0, 77, 107, 0, 66, 92, 0, 54, 78, 0, 42, 64, + 0, 27, 48, 0, 5, 27, 0, 0, 0, 0, 99, 120, 0, 87, 107, + 0, 78, 94, 0, 66, 81, 0, 54, 68, 0, 42, 55, 0, 27, 40, + 0, 6, 20, 0, 0, 0, 0, 98, 105, 0, 87, 94, 0, 77, 84, + 0, 65, 71, 0, 55, 59, 0, 42, 47, 0, 28, 33, 0, 6, 12, + 0, 0, 0, 0, 98, 93, 0, 87, 81, 0, 77, 72, 0, 66, 61, + 0, 54, 49, 0, 42, 37, 0, 28, 24, 0, 6, 4, 0, 0, 0, + 0, 98, 77, 0, 87, 68, 0, 77, 59, 0, 65, 49, 0, 54, 39, + 0, 42, 27, 0, 29, 14, 0, 6, 0, 0, 0, 0, 1, 98, 65, + 7, 87, 56, 0, 77, 49, 0, 66, 41, 0, 54, 30, 0, 42, 19, + 0, 29, 3, 0, 6, 0, 0, 0, 0, 0, 84, 166, 0, 74, 149, + 0, 64, 134, 0, 53, 117, 0, 41, 100, 0, 28, 83, 0, 11, 64, + 0, 0, 42, 0, 0, 3, 0, 84, 151, 0, 74, 135, 0, 64, 121, + 0, 53, 105, 0, 42, 90, 0, 30, 75, 0, 14, 58, 0, 0, 36, + 0, 0, 0, 0, 84, 138, 0, 74, 124, 1, 64, 110, 0, 54, 95, + 0, 43, 81, 0, 30, 67, 0, 15, 51, 0, 1, 29, 0, 0, 0, + 14, 84, 126, 12, 74, 112, 2, 65, 99, 0, 54, 85, 0, 44, 73, + 0, 31, 59, 0, 16, 44, 0, 1, 23, 0, 0, 0, 16, 84, 113, + 13, 74, 100, 6, 65, 89, 0, 54, 77, 0, 44, 65, 0, 31, 51, + 0, 17, 36, 0, 1, 16, 0, 0, 0, 24, 84, 100, 18, 74, 88, + 13, 65, 78, 2, 55, 68, 0, 44, 55, 0, 32, 43, 0, 18, 28, + 0, 1, 6, 0, 0, 0, 26, 84, 87, 24, 74, 76, 17, 65, 67, + 7, 54, 57, 0, 44, 46, 0, 32, 35, 0, 19, 21, 0, 2, 3, + 0, 0, 0, 30, 84, 74, 28, 74, 64, 20, 65, 55, 12, 55, 46, + 0, 44, 35, 0, 32, 24, 0, 18, 9, 0, 1, 0, 0, 0, 0, + 32, 84, 63, 28, 74, 54, 21, 65, 47, 13, 54, 38, 0, 44, 28, + 0, 32, 16, 0, 18, 1, 0, 1, 0, 0, 0, 0, 30, 67, 155, + 20, 58, 139, 20, 49, 126, 12, 39, 110, 0, 27, 94, 0, 13, 77, + 0, 0, 60, 0, 0, 37, 0, 0, 0, 35, 67, 142, 30, 58, 126, + 23, 50, 114, 16, 40, 99, 7, 29, 85, 0, 15, 69, 0, 0, 52, + 0, 0, 30, 0, 0, 0, 35, 68, 131, 30, 59, 116, 27, 50, 104, + 18, 40, 90, 9, 29, 76, 0, 17, 62, 0, 2, 46, 0, 0, 24, + 0, 0, 0, 37, 69, 119, 33, 59, 106, 27, 51, 94, 21, 41, 80, + 9, 30, 67, 0, 18, 54, 0, 3, 39, 0, 0, 18, 0, 0, 0, + 40, 69, 107, 36, 59, 94, 28, 51, 84, 18, 41, 72, 10, 31, 60, + 0, 19, 47, 0, 4, 32, 0, 0, 10, 0, 0, 0, 42, 69, 95, + 36, 59, 84, 29, 51, 74, 19, 41, 63, 10, 31, 52, 0, 20, 39, + 0, 4, 25, 0, 0, 4, 0, 0, 0, 43, 69, 83, 38, 60, 73, + 32, 51, 62, 23, 42, 53, 11, 31, 42, 0, 20, 31, 0, 5, 17, + 0, 0, 1, 0, 0, 0, 45, 69, 70, 39, 60, 60, 33, 51, 52, + 24, 42, 43, 13, 32, 33, 0, 21, 21, 0, 5, 6, 0, 0, 0, + 0, 0, 0, 47, 69, 59, 41, 60, 51, 34, 51, 43, 24, 42, 35, + 12, 33, 26, 1, 22, 14, 0, 5, 1, 0, 0, 0, 0, 0, 0, + 46, 48, 146, 42, 40, 131, 36, 32, 118, 27, 22, 103, 17, 6, 88, + 5, 0, 73, 0, 0, 55, 0, 0, 33, 0, 0, 0, 48, 48, 133, + 44, 40, 119, 37, 32, 107, 28, 22, 93, 20, 8, 79, 7, 0, 65, + 0, 0, 49, 0, 0, 27, 0, 0, 0, 48, 50, 123, 44, 41, 109, + 37, 33, 97, 30, 23, 83, 21, 11, 71, 8, 0, 58, 0, 0, 42, + 0, 0, 21, 0, 0, 0, 49, 51, 111, 45, 42, 99, 38, 34, 87, + 29, 25, 75, 20, 13, 63, 8, 0, 51, 0, 0, 36, 0, 0, 14, + 0, 0, 0, 52, 52, 100, 44, 43, 89, 38, 35, 79, 29, 26, 68, + 19, 15, 56, 10, 1, 43, 0, 0, 28, 0, 0, 6, 0, 0, 0, + 52, 52, 90, 47, 44, 79, 39, 36, 70, 30, 27, 59, 20, 16, 47, + 9, 2, 36, 0, 0, 22, 0, 0, 2, 0, 0, 0, 52, 53, 78, + 46, 44, 68, 39, 37, 60, 32, 27, 49, 22, 17, 39, 10, 3, 28, + 0, 0, 12, 0, 0, 0, 0, 0, 0, 53, 53, 66, 47, 44, 57, + 40, 36, 48, 32, 27, 39, 22, 18, 30, 9, 4, 18, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 54, 53, 57, 48, 45, 49, 41, 37, 41, + 33, 28, 32, 22, 19, 23, 11, 6, 10, 1, 0, 0, 0, 0, 0, + 0, 0, 0, +}; +void AdobeCMYK_to_sRGB1(uint8_t c, + uint8_t m, + uint8_t y, + uint8_t k, + uint8_t& R, + uint8_t& G, + uint8_t& B) { + int fix_c = c << 8; + int fix_m = m << 8; + int fix_y = y << 8; + int fix_k = k << 8; + int c_index = (fix_c + 4096) >> 13; + int m_index = (fix_m + 4096) >> 13; + int y_index = (fix_y + 4096) >> 13; + int k_index = (fix_k + 4096) >> 13; + int pos = (c_index * 9 * 9 * 9 + m_index * 9 * 9 + y_index * 9 + k_index) * 3; + int fix_r = g_CMYKSamples[pos] << 8; + int fix_g = g_CMYKSamples[pos + 1] << 8; + int fix_b = g_CMYKSamples[pos + 2] << 8; + int c1_index = fix_c >> 13; + if (c1_index == c_index) { + c1_index = c1_index == 8 ? c1_index - 1 : c1_index + 1; + } + int m1_index = fix_m >> 13; + if (m1_index == m_index) { + m1_index = m1_index == 8 ? m1_index - 1 : m1_index + 1; + } + int y1_index = fix_y >> 13; + if (y1_index == y_index) { + y1_index = y1_index == 8 ? y1_index - 1 : y1_index + 1; + } + int k1_index = fix_k >> 13; + if (k1_index == k_index) { + k1_index = k1_index == 8 ? k1_index - 1 : k1_index + 1; + } + int c1_pos = pos + (c1_index - c_index) * 9 * 9 * 9 * 3; + int m1_pos = pos + (m1_index - m_index) * 9 * 9 * 3; + int y1_pos = pos + (y1_index - y_index) * 9 * 3; + int k1_pos = pos + (k1_index - k_index) * 3; + int c_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[c1_pos]; + int c_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[c1_pos + 1]; + int c_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[c1_pos + 2]; + int m_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[m1_pos]; + int m_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[m1_pos + 1]; + int m_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[m1_pos + 2]; + int y_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[y1_pos]; + int y_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[y1_pos + 1]; + int y_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[y1_pos + 2]; + int k_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[k1_pos]; + int k_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[k1_pos + 1]; + int k_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[k1_pos + 2]; + int c_rate = (fix_c - (c_index << 13)) * (c_index - c1_index); + fix_r += c_r_delta * c_rate / 32; + fix_g += c_g_delta * c_rate / 32; + fix_b += c_b_delta * c_rate / 32; + int m_rate = (fix_m - (m_index << 13)) * (m_index - m1_index); + fix_r += m_r_delta * m_rate / 32; + fix_g += m_g_delta * m_rate / 32; + fix_b += m_b_delta * m_rate / 32; + int y_rate = (fix_y - (y_index << 13)) * (y_index - y1_index); + fix_r += y_r_delta * y_rate / 32; + fix_g += y_g_delta * y_rate / 32; + fix_b += y_b_delta * y_rate / 32; + int k_rate = (fix_k - (k_index << 13)) * (k_index - k1_index); + fix_r += k_r_delta * k_rate / 32; + fix_g += k_g_delta * k_rate / 32; + fix_b += k_b_delta * k_rate / 32; + if (fix_r < 0) { + fix_r = 0; + } + if (fix_g < 0) { + fix_g = 0; + } + if (fix_b < 0) { + fix_b = 0; + } + R = fix_r >> 8; + G = fix_g >> 8; + B = fix_b >> 8; +} +void AdobeCMYK_to_sRGB(FX_FLOAT c, + FX_FLOAT m, + FX_FLOAT y, + FX_FLOAT k, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B) { + // Convert to uint8_t with round-to-nearest. Avoid using FXSYS_round because + // it is incredibly expensive with VC++ (tested on VC++ 2015) because round() + // is very expensive. + // The 'magic' value of 0.49999997f, the float that precedes 0.5f, was chosen + // because it gives identical results to FXSYS_round(). Using the constant + // 0.5f gives different results (1 instead of 0) for one value, 0.0019607842. + // That value is close to the cusp but zero is the correct answer, and + // getting the same answer as before is desirable. + // All floats from 0.0 to 1.0 were tested and now give the same results. + const float rounding_offset = 0.49999997f; + uint8_t c1 = int(c * 255.f + rounding_offset); + uint8_t m1 = int(m * 255.f + rounding_offset); + uint8_t y1 = int(y * 255.f + rounding_offset); + uint8_t k1 = int(k * 255.f + rounding_offset); + + ASSERT(c1 == FXSYS_round(c * 255)); + ASSERT(m1 == FXSYS_round(m * 255)); + ASSERT(y1 == FXSYS_round(y * 255)); + ASSERT(k1 == FXSYS_round(k * 255)); + + uint8_t r, g, b; + AdobeCMYK_to_sRGB1(c1, m1, y1, k1, r, g, b); + // Multiply by a constant rather than dividing because division is much + // more expensive. + R = r * (1.0f / 255); + G = g * (1.0f / 255); + B = b * (1.0f / 255); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jbig.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jbig.cpp new file mode 100644 index 000000000000..926541f07dce --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jbig.cpp @@ -0,0 +1,106 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/codec/ccodec_jbig2module.h" + +#include +#include + +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fxcodec/JBig2_DocumentContext.h" +#include "core/fxcodec/jbig2/JBig2_Context.h" +#include "core/fxcodec/jbig2/JBig2_Image.h" +#include "core/fxcrt/fx_memory.h" +#include "third_party/base/ptr_util.h" + +JBig2_DocumentContext::JBig2_DocumentContext() {} + +JBig2_DocumentContext::~JBig2_DocumentContext() {} + +JBig2_DocumentContext* GetJBig2DocumentContext( + std::unique_ptr* pContextHolder) { + if (!pContextHolder->get()) + *pContextHolder = pdfium::MakeUnique(); + return pContextHolder->get(); +} + +CCodec_Jbig2Context::CCodec_Jbig2Context() + : m_width(0), + m_height(0), + m_pGlobalStream(nullptr), + m_pSrcStream(nullptr), + m_dest_buf(0), + m_dest_pitch(0), + m_pPause(nullptr) {} + +CCodec_Jbig2Context::~CCodec_Jbig2Context() {} + +CCodec_Jbig2Module::~CCodec_Jbig2Module() {} + +FXCODEC_STATUS CCodec_Jbig2Module::StartDecode( + CCodec_Jbig2Context* pJbig2Context, + std::unique_ptr* pContextHolder, + uint32_t width, + uint32_t height, + CPDF_StreamAcc* src_stream, + CPDF_StreamAcc* global_stream, + uint8_t* dest_buf, + uint32_t dest_pitch, + IFX_Pause* pPause) { + if (!pJbig2Context) + return FXCODEC_STATUS_ERR_PARAMS; + + JBig2_DocumentContext* pJBig2DocumentContext = + GetJBig2DocumentContext(pContextHolder); + pJbig2Context->m_width = width; + pJbig2Context->m_height = height; + pJbig2Context->m_pSrcStream = src_stream; + pJbig2Context->m_pGlobalStream = global_stream; + pJbig2Context->m_dest_buf = dest_buf; + pJbig2Context->m_dest_pitch = dest_pitch; + pJbig2Context->m_pPause = pPause; + FXSYS_memset(dest_buf, 0, height * dest_pitch); + pJbig2Context->m_pContext = pdfium::MakeUnique( + global_stream, src_stream, pJBig2DocumentContext->GetSymbolDictCache(), + pPause, false); + if (!pJbig2Context->m_pContext) + return FXCODEC_STATUS_ERROR; + + int ret = pJbig2Context->m_pContext->getFirstPage(dest_buf, width, height, + dest_pitch, pPause); + if (pJbig2Context->m_pContext->GetProcessingStatus() == + FXCODEC_STATUS_DECODE_FINISH) { + pJbig2Context->m_pContext.reset(); + if (ret != JBIG2_SUCCESS) + return FXCODEC_STATUS_ERROR; + + int dword_size = height * dest_pitch / 4; + uint32_t* dword_buf = (uint32_t*)dest_buf; + for (int i = 0; i < dword_size; i++) + dword_buf[i] = ~dword_buf[i]; + return FXCODEC_STATUS_DECODE_FINISH; + } + return pJbig2Context->m_pContext->GetProcessingStatus(); +} + +FXCODEC_STATUS CCodec_Jbig2Module::ContinueDecode( + CCodec_Jbig2Context* pJbig2Context, + IFX_Pause* pPause) { + int ret = pJbig2Context->m_pContext->Continue(pPause); + if (pJbig2Context->m_pContext->GetProcessingStatus() != + FXCODEC_STATUS_DECODE_FINISH) { + return pJbig2Context->m_pContext->GetProcessingStatus(); + } + pJbig2Context->m_pContext.reset(); + if (ret != JBIG2_SUCCESS) + return FXCODEC_STATUS_ERROR; + + int dword_size = pJbig2Context->m_height * pJbig2Context->m_dest_pitch / 4; + uint32_t* dword_buf = (uint32_t*)pJbig2Context->m_dest_buf; + for (int i = 0; i < dword_size; i++) + dword_buf[i] = ~dword_buf[i]; + return FXCODEC_STATUS_DECODE_FINISH; +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpeg.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpeg.cpp new file mode 100644 index 000000000000..44fb1fb4ebd8 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpeg.cpp @@ -0,0 +1,585 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include +#include + +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/fx_safe_types.h" +#include "core/fxge/fx_dib.h" +#include "third_party/base/ptr_util.h" + +extern "C" { +#undef FAR +#if defined(USE_SYSTEM_LIBJPEG) +#include +#elif defined(USE_LIBJPEG_TURBO) +#include "jpeglib.h" +#else +#include "third_party/libjpeg/jpeglib.h" +#endif +} + +extern "C" { + +static void JpegScanSOI(const uint8_t** src_buf, uint32_t* src_size) { + if (*src_size == 0) + return; + + uint32_t offset = 0; + while (offset < *src_size - 1) { + if ((*src_buf)[offset] == 0xff && (*src_buf)[offset + 1] == 0xd8) { + *src_buf += offset; + *src_size -= offset; + return; + } + offset++; + } +} + +static void _src_do_nothing(struct jpeg_decompress_struct* cinfo) {} + +static void _error_fatal(j_common_ptr cinfo) { + longjmp(*(jmp_buf*)cinfo->client_data, -1); +} + +static void _src_skip_data(struct jpeg_decompress_struct* cinfo, long num) { + if (num > (long)cinfo->src->bytes_in_buffer) { + _error_fatal((j_common_ptr)cinfo); + } + cinfo->src->next_input_byte += num; + cinfo->src->bytes_in_buffer -= num; +} + +static boolean _src_fill_buffer(j_decompress_ptr cinfo) { + return 0; +} + +static boolean _src_resync(j_decompress_ptr cinfo, int desired) { + return 0; +} + +static void _error_do_nothing(j_common_ptr cinfo) {} + +static void _error_do_nothing1(j_common_ptr cinfo, int) {} + +static void _error_do_nothing2(j_common_ptr cinfo, char*) {} + +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_ +static void _dest_do_nothing(j_compress_ptr cinfo) {} + +static boolean _dest_empty(j_compress_ptr cinfo) { + return false; +} +#endif +}; + +#define JPEG_MARKER_ICC (JPEG_APP0 + 2) +#define JPEG_MARKER_MAXSIZE 0xFFFF + +#ifdef PDF_ENABLE_XFA +static void JpegLoadAttribute(struct jpeg_decompress_struct* pInfo, + CFX_DIBAttribute* pAttribute) { + if (!pAttribute) + return; + + pAttribute->m_nXDPI = pInfo->X_density; + pAttribute->m_nYDPI = pInfo->Y_density; + pAttribute->m_wDPIUnit = pInfo->density_unit; +} +#endif // PDF_ENABLE_XFA + +static bool JpegLoadInfo(const uint8_t* src_buf, + uint32_t src_size, + int* width, + int* height, + int* num_components, + int* bits_per_components, + bool* color_transform) { + JpegScanSOI(&src_buf, &src_size); + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + jerr.error_exit = _error_fatal; + jerr.emit_message = _error_do_nothing1; + jerr.output_message = _error_do_nothing; + jerr.format_message = _error_do_nothing2; + jerr.reset_error_mgr = _error_do_nothing; + jerr.trace_level = 0; + cinfo.err = &jerr; + jmp_buf mark; + cinfo.client_data = &mark; + if (setjmp(mark) == -1) + return false; + + jpeg_create_decompress(&cinfo); + struct jpeg_source_mgr src; + src.init_source = _src_do_nothing; + src.term_source = _src_do_nothing; + src.skip_input_data = _src_skip_data; + src.fill_input_buffer = _src_fill_buffer; + src.resync_to_restart = _src_resync; + src.bytes_in_buffer = src_size; + src.next_input_byte = src_buf; + cinfo.src = &src; + if (setjmp(mark) == -1) { + jpeg_destroy_decompress(&cinfo); + return false; + } + int ret = jpeg_read_header(&cinfo, true); + if (ret != JPEG_HEADER_OK) { + jpeg_destroy_decompress(&cinfo); + return false; + } + *width = cinfo.image_width; + *height = cinfo.image_height; + *num_components = cinfo.num_components; + *color_transform = + cinfo.jpeg_color_space == JCS_YCbCr || cinfo.jpeg_color_space == JCS_YCCK; + *bits_per_components = cinfo.data_precision; + jpeg_destroy_decompress(&cinfo); + return true; +} + +class CCodec_JpegDecoder : public CCodec_ScanlineDecoder { + public: + CCodec_JpegDecoder(); + ~CCodec_JpegDecoder() override; + + bool Create(const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + bool ColorTransform); + + // CCodec_ScanlineDecoder + bool v_Rewind() override; + uint8_t* v_GetNextLine() override; + uint32_t GetSrcOffset() override; + + bool InitDecode(); + + jmp_buf m_JmpBuf; + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + struct jpeg_source_mgr src; + const uint8_t* m_SrcBuf; + uint32_t m_SrcSize; + uint8_t* m_pScanlineBuf; + + bool m_bInited; + bool m_bStarted; + bool m_bJpegTransform; + + protected: + uint32_t m_nDefaultScaleDenom; +}; + +CCodec_JpegDecoder::CCodec_JpegDecoder() { + m_pScanlineBuf = nullptr; + m_bStarted = false; + m_bInited = false; + FXSYS_memset(&cinfo, 0, sizeof(cinfo)); + FXSYS_memset(&jerr, 0, sizeof(jerr)); + FXSYS_memset(&src, 0, sizeof(src)); + m_nDefaultScaleDenom = 1; +} + +CCodec_JpegDecoder::~CCodec_JpegDecoder() { + FX_Free(m_pScanlineBuf); + if (m_bInited) + jpeg_destroy_decompress(&cinfo); +} + +bool CCodec_JpegDecoder::InitDecode() { + cinfo.err = &jerr; + cinfo.client_data = &m_JmpBuf; + if (setjmp(m_JmpBuf) == -1) + return false; + + jpeg_create_decompress(&cinfo); + m_bInited = true; + cinfo.src = &src; + src.bytes_in_buffer = m_SrcSize; + src.next_input_byte = m_SrcBuf; + if (setjmp(m_JmpBuf) == -1) { + jpeg_destroy_decompress(&cinfo); + m_bInited = false; + return false; + } + cinfo.image_width = m_OrigWidth; + cinfo.image_height = m_OrigHeight; + int ret = jpeg_read_header(&cinfo, true); + if (ret != JPEG_HEADER_OK) + return false; + + if (cinfo.saw_Adobe_marker) + m_bJpegTransform = true; + + if (cinfo.num_components == 3 && !m_bJpegTransform) + cinfo.out_color_space = cinfo.jpeg_color_space; + + m_OrigWidth = cinfo.image_width; + m_OrigHeight = cinfo.image_height; + m_OutputWidth = m_OrigWidth; + m_OutputHeight = m_OrigHeight; + m_nDefaultScaleDenom = cinfo.scale_denom; + return true; +} + +bool CCodec_JpegDecoder::Create(const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + bool ColorTransform) { + JpegScanSOI(&src_buf, &src_size); + m_SrcBuf = src_buf; + m_SrcSize = src_size; + jerr.error_exit = _error_fatal; + jerr.emit_message = _error_do_nothing1; + jerr.output_message = _error_do_nothing; + jerr.format_message = _error_do_nothing2; + jerr.reset_error_mgr = _error_do_nothing; + src.init_source = _src_do_nothing; + src.term_source = _src_do_nothing; + src.skip_input_data = _src_skip_data; + src.fill_input_buffer = _src_fill_buffer; + src.resync_to_restart = _src_resync; + m_bJpegTransform = ColorTransform; + if (src_size > 1 && + FXSYS_memcmp(src_buf + src_size - 2, "\xFF\xD9", 2) != 0) { + ((uint8_t*)src_buf)[src_size - 2] = 0xFF; + ((uint8_t*)src_buf)[src_size - 1] = 0xD9; + } + m_OutputWidth = m_OrigWidth = width; + m_OutputHeight = m_OrigHeight = height; + if (!InitDecode()) + return false; + + if (cinfo.num_components < nComps) + return false; + + if ((int)cinfo.image_width < width) + return false; + + m_Pitch = + (static_cast(cinfo.image_width) * cinfo.num_components + 3) / + 4 * 4; + m_pScanlineBuf = FX_Alloc(uint8_t, m_Pitch); + m_nComps = cinfo.num_components; + m_bpc = 8; + m_bStarted = false; + return true; +} + +bool CCodec_JpegDecoder::v_Rewind() { + if (m_bStarted) { + jpeg_destroy_decompress(&cinfo); + if (!InitDecode()) { + return false; + } + } + if (setjmp(m_JmpBuf) == -1) { + return false; + } + cinfo.scale_denom = m_nDefaultScaleDenom; + m_OutputWidth = m_OrigWidth; + m_OutputHeight = m_OrigHeight; + if (!jpeg_start_decompress(&cinfo)) { + jpeg_destroy_decompress(&cinfo); + return false; + } + if ((int)cinfo.output_width > m_OrigWidth) { + ASSERT(false); + return false; + } + m_bStarted = true; + return true; +} + +uint8_t* CCodec_JpegDecoder::v_GetNextLine() { + if (setjmp(m_JmpBuf) == -1) + return nullptr; + + int nlines = jpeg_read_scanlines(&cinfo, &m_pScanlineBuf, 1); + return nlines > 0 ? m_pScanlineBuf : nullptr; +} + +uint32_t CCodec_JpegDecoder::GetSrcOffset() { + return (uint32_t)(m_SrcSize - src.bytes_in_buffer); +} + +std::unique_ptr CCodec_JpegModule::CreateDecoder( + const uint8_t* src_buf, + uint32_t src_size, + int width, + int height, + int nComps, + bool ColorTransform) { + if (!src_buf || src_size == 0) + return nullptr; + + auto pDecoder = pdfium::MakeUnique(); + if (!pDecoder->Create(src_buf, src_size, width, height, nComps, + ColorTransform)) { + return nullptr; + } + return std::move(pDecoder); +} + +bool CCodec_JpegModule::LoadInfo(const uint8_t* src_buf, + uint32_t src_size, + int* width, + int* height, + int* num_components, + int* bits_per_components, + bool* color_transform) { + return JpegLoadInfo(src_buf, src_size, width, height, num_components, + bits_per_components, color_transform); +} + +struct FXJPEG_Context { + jmp_buf m_JumpMark; + jpeg_decompress_struct m_Info; + jpeg_error_mgr m_ErrMgr; + jpeg_source_mgr m_SrcMgr; + unsigned int m_SkipSize; + void* (*m_AllocFunc)(unsigned int); + void (*m_FreeFunc)(void*); +}; +extern "C" { +static void _error_fatal1(j_common_ptr cinfo) { + longjmp(((FXJPEG_Context*)cinfo->client_data)->m_JumpMark, -1); +} +}; +extern "C" { +static void _src_skip_data1(struct jpeg_decompress_struct* cinfo, long num) { + if (cinfo->src->bytes_in_buffer < (size_t)num) { + ((FXJPEG_Context*)cinfo->client_data)->m_SkipSize = + (unsigned int)(num - cinfo->src->bytes_in_buffer); + cinfo->src->bytes_in_buffer = 0; + } else { + cinfo->src->next_input_byte += num; + cinfo->src->bytes_in_buffer -= num; + } +} +}; +static void* jpeg_alloc_func(unsigned int size) { + return FX_Alloc(char, size); +} +static void jpeg_free_func(void* p) { + FX_Free(p); +} +FXJPEG_Context* CCodec_JpegModule::Start() { + FXJPEG_Context* p = FX_Alloc(FXJPEG_Context, 1); + p->m_AllocFunc = jpeg_alloc_func; + p->m_FreeFunc = jpeg_free_func; + p->m_ErrMgr.error_exit = _error_fatal1; + p->m_ErrMgr.emit_message = _error_do_nothing1; + p->m_ErrMgr.output_message = _error_do_nothing; + p->m_ErrMgr.format_message = _error_do_nothing2; + p->m_ErrMgr.reset_error_mgr = _error_do_nothing; + p->m_SrcMgr.init_source = _src_do_nothing; + p->m_SrcMgr.term_source = _src_do_nothing; + p->m_SrcMgr.skip_input_data = _src_skip_data1; + p->m_SrcMgr.fill_input_buffer = _src_fill_buffer; + p->m_SrcMgr.resync_to_restart = _src_resync; + p->m_Info.client_data = p; + p->m_Info.err = &p->m_ErrMgr; + if (setjmp(p->m_JumpMark) == -1) { + return 0; + } + jpeg_create_decompress(&p->m_Info); + p->m_Info.src = &p->m_SrcMgr; + p->m_SkipSize = 0; + return p; +} + +void CCodec_JpegModule::Finish(FXJPEG_Context* ctx) { + jpeg_destroy_decompress(&ctx->m_Info); + ctx->m_FreeFunc(ctx); +} + +void CCodec_JpegModule::Input(FXJPEG_Context* ctx, + const unsigned char* src_buf, + uint32_t src_size) { + if (ctx->m_SkipSize) { + if (ctx->m_SkipSize > src_size) { + ctx->m_SrcMgr.bytes_in_buffer = 0; + ctx->m_SkipSize -= src_size; + return; + } + src_size -= ctx->m_SkipSize; + src_buf += ctx->m_SkipSize; + ctx->m_SkipSize = 0; + } + ctx->m_SrcMgr.next_input_byte = src_buf; + ctx->m_SrcMgr.bytes_in_buffer = src_size; +} + +#ifdef PDF_ENABLE_XFA +int CCodec_JpegModule::ReadHeader(FXJPEG_Context* ctx, + int* width, + int* height, + int* nComps, + CFX_DIBAttribute* pAttribute) { +#else // PDF_ENABLE_XFA +int CCodec_JpegModule::ReadHeader(FXJPEG_Context* ctx, + int* width, + int* height, + int* nComps) { +#endif // PDF_ENABLE_XFA + if (setjmp(ctx->m_JumpMark) == -1) + return 1; + + int ret = jpeg_read_header(&ctx->m_Info, true); + if (ret == JPEG_SUSPENDED) + return 2; + if (ret != JPEG_HEADER_OK) + return 1; + + *width = ctx->m_Info.image_width; + *height = ctx->m_Info.image_height; + *nComps = ctx->m_Info.num_components; +#ifdef PDF_ENABLE_XFA + JpegLoadAttribute(&ctx->m_Info, pAttribute); +#endif + return 0; +} + +bool CCodec_JpegModule::StartScanline(FXJPEG_Context* ctx, int down_scale) { + if (setjmp(ctx->m_JumpMark) == -1) + return false; + + ctx->m_Info.scale_denom = down_scale; + return !!jpeg_start_decompress(&ctx->m_Info); +} + +bool CCodec_JpegModule::ReadScanline(FXJPEG_Context* ctx, + unsigned char* dest_buf) { + if (setjmp(ctx->m_JumpMark) == -1) + return false; + + int nlines = jpeg_read_scanlines(&ctx->m_Info, &dest_buf, 1); + return nlines == 1; +} + +uint32_t CCodec_JpegModule::GetAvailInput(FXJPEG_Context* ctx, + uint8_t** avail_buf_ptr) { + if (avail_buf_ptr) { + *avail_buf_ptr = nullptr; + if (ctx->m_SrcMgr.bytes_in_buffer > 0) { + *avail_buf_ptr = (uint8_t*)ctx->m_SrcMgr.next_input_byte; + } + } + return (uint32_t)ctx->m_SrcMgr.bytes_in_buffer; +} + +#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_ +#define JPEG_BLOCK_SIZE 1048576 +bool CCodec_JpegModule::JpegEncode(const CFX_DIBSource* pSource, + uint8_t** dest_buf, + FX_STRSIZE* dest_size) { + struct jpeg_error_mgr jerr; + jerr.error_exit = _error_do_nothing; + jerr.emit_message = _error_do_nothing1; + jerr.output_message = _error_do_nothing; + jerr.format_message = _error_do_nothing2; + jerr.reset_error_mgr = _error_do_nothing; + + struct jpeg_compress_struct cinfo; + memset(&cinfo, 0, sizeof(cinfo)); + cinfo.err = &jerr; + jpeg_create_compress(&cinfo); + int Bpp = pSource->GetBPP() / 8; + uint32_t nComponents = Bpp >= 3 ? (pSource->IsCmykImage() ? 4 : 3) : 1; + uint32_t pitch = pSource->GetPitch(); + uint32_t width = pdfium::base::checked_cast(pSource->GetWidth()); + uint32_t height = pdfium::base::checked_cast(pSource->GetHeight()); + FX_SAFE_UINT32 safe_buf_len = width; + safe_buf_len *= height; + safe_buf_len *= nComponents; + safe_buf_len += 1024; + if (!safe_buf_len.IsValid()) + return false; + + uint32_t dest_buf_length = safe_buf_len.ValueOrDie(); + *dest_buf = FX_TryAlloc(uint8_t, dest_buf_length); + const int MIN_TRY_BUF_LEN = 1024; + while (!(*dest_buf) && dest_buf_length > MIN_TRY_BUF_LEN) { + dest_buf_length >>= 1; + *dest_buf = FX_TryAlloc(uint8_t, dest_buf_length); + } + if (!(*dest_buf)) + return false; + + struct jpeg_destination_mgr dest; + dest.init_destination = _dest_do_nothing; + dest.term_destination = _dest_do_nothing; + dest.empty_output_buffer = _dest_empty; + dest.next_output_byte = *dest_buf; + dest.free_in_buffer = dest_buf_length; + cinfo.dest = &dest; + cinfo.image_width = width; + cinfo.image_height = height; + cinfo.input_components = nComponents; + if (nComponents == 1) { + cinfo.in_color_space = JCS_GRAYSCALE; + } else if (nComponents == 3) { + cinfo.in_color_space = JCS_RGB; + } else { + cinfo.in_color_space = JCS_CMYK; + } + uint8_t* line_buf = nullptr; + if (nComponents > 1) + line_buf = FX_Alloc2D(uint8_t, width, nComponents); + + jpeg_set_defaults(&cinfo); + jpeg_start_compress(&cinfo, TRUE); + JSAMPROW row_pointer[1]; + JDIMENSION row; + while (cinfo.next_scanline < cinfo.image_height) { + const uint8_t* src_scan = pSource->GetScanline(cinfo.next_scanline); + if (nComponents > 1) { + uint8_t* dest_scan = line_buf; + if (nComponents == 3) { + for (uint32_t i = 0; i < width; i++) { + dest_scan[0] = src_scan[2]; + dest_scan[1] = src_scan[1]; + dest_scan[2] = src_scan[0]; + dest_scan += 3; + src_scan += Bpp; + } + } else { + for (uint32_t i = 0; i < pitch; i++) { + *dest_scan++ = ~*src_scan++; + } + } + row_pointer[0] = line_buf; + } else { + row_pointer[0] = (uint8_t*)src_scan; + } + row = cinfo.next_scanline; + jpeg_write_scanlines(&cinfo, row_pointer, 1); + if (cinfo.next_scanline == row) { + *dest_buf = + FX_Realloc(uint8_t, *dest_buf, dest_buf_length + JPEG_BLOCK_SIZE); + dest.next_output_byte = *dest_buf + dest_buf_length - dest.free_in_buffer; + dest_buf_length += JPEG_BLOCK_SIZE; + dest.free_in_buffer += JPEG_BLOCK_SIZE; + } + } + jpeg_finish_compress(&cinfo); + jpeg_destroy_compress(&cinfo); + FX_Free(line_buf); + *dest_size = dest_buf_length - (FX_STRSIZE)dest.free_in_buffer; + + return true; +} +#endif diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpx_opj.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpx_opj.cpp new file mode 100644 index 000000000000..fa163567f423 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpx_opj.cpp @@ -0,0 +1,919 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_colorspace.h" +#include "core/fxcodec/codec/codec_int.h" +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/fx_safe_types.h" +#include "third_party/lcms2-2.6/include/lcms2.h" +#include "third_party/libopenjpeg20/openjpeg.h" + +static void fx_error_callback(const char* msg, void* client_data) { + (void)client_data; +} +static void fx_warning_callback(const char* msg, void* client_data) { + (void)client_data; +} +static void fx_info_callback(const char* msg, void* client_data) { + (void)client_data; +} + +OPJ_SIZE_T opj_read_from_memory(void* p_buffer, + OPJ_SIZE_T nb_bytes, + void* p_user_data) { + DecodeData* srcData = static_cast(p_user_data); + if (!srcData || !srcData->src_data || srcData->src_size == 0) { + return static_cast(-1); + } + // Reads at EOF return an error code. + if (srcData->offset >= srcData->src_size) { + return static_cast(-1); + } + OPJ_SIZE_T bufferLength = srcData->src_size - srcData->offset; + OPJ_SIZE_T readlength = nb_bytes < bufferLength ? nb_bytes : bufferLength; + memcpy(p_buffer, &srcData->src_data[srcData->offset], readlength); + srcData->offset += readlength; + return readlength; +} + +OPJ_SIZE_T opj_write_from_memory(void* p_buffer, + OPJ_SIZE_T nb_bytes, + void* p_user_data) { + DecodeData* srcData = static_cast(p_user_data); + if (!srcData || !srcData->src_data || srcData->src_size == 0) { + return static_cast(-1); + } + // Writes at EOF return an error code. + if (srcData->offset >= srcData->src_size) { + return static_cast(-1); + } + OPJ_SIZE_T bufferLength = srcData->src_size - srcData->offset; + OPJ_SIZE_T writeLength = nb_bytes < bufferLength ? nb_bytes : bufferLength; + memcpy(&srcData->src_data[srcData->offset], p_buffer, writeLength); + srcData->offset += writeLength; + return writeLength; +} + +OPJ_OFF_T opj_skip_from_memory(OPJ_OFF_T nb_bytes, void* p_user_data) { + DecodeData* srcData = static_cast(p_user_data); + if (!srcData || !srcData->src_data || srcData->src_size == 0) { + return static_cast(-1); + } + // Offsets are signed and may indicate a negative skip. Do not support this + // because of the strange return convention where either bytes skipped or + // -1 is returned. Following that convention, a successful relative seek of + // -1 bytes would be required to to give the same result as the error case. + if (nb_bytes < 0) { + return static_cast(-1); + } + // FIXME: use std::make_unsigned::type once c++11 lib is OK'd. + uint64_t unsignedNbBytes = static_cast(nb_bytes); + // Additionally, the offset may take us beyond the range of a size_t (e.g. + // 32-bit platforms). If so, just clamp at EOF. + if (unsignedNbBytes > + std::numeric_limits::max() - srcData->offset) { + srcData->offset = srcData->src_size; + } else { + OPJ_SIZE_T checkedNbBytes = static_cast(unsignedNbBytes); + // Otherwise, mimic fseek() semantics to always succeed, even past EOF, + // clamping at EOF. We can get away with this since we don't actually + // provide negative relative skips from beyond EOF back to inside the + // data, which would be the only reason to need to know exactly how far + // beyond EOF we are. + srcData->offset = + std::min(srcData->offset + checkedNbBytes, srcData->src_size); + } + return nb_bytes; +} + +OPJ_BOOL opj_seek_from_memory(OPJ_OFF_T nb_bytes, void* p_user_data) { + DecodeData* srcData = static_cast(p_user_data); + if (!srcData || !srcData->src_data || srcData->src_size == 0) { + return OPJ_FALSE; + } + // Offsets are signed and may indicate a negative position, which would + // be before the start of the file. Do not support this. + if (nb_bytes < 0) { + return OPJ_FALSE; + } + // FIXME: use std::make_unsigned::type once c++11 lib is OK'd. + uint64_t unsignedNbBytes = static_cast(nb_bytes); + // Additionally, the offset may take us beyond the range of a size_t (e.g. + // 32-bit platforms). If so, just clamp at EOF. + if (unsignedNbBytes > std::numeric_limits::max()) { + srcData->offset = srcData->src_size; + } else { + OPJ_SIZE_T checkedNbBytes = static_cast(nb_bytes); + // Otherwise, mimic fseek() semantics to always succeed, even past EOF, + // again clamping at EOF. + srcData->offset = std::min(checkedNbBytes, srcData->src_size); + } + return OPJ_TRUE; +} +opj_stream_t* fx_opj_stream_create_memory_stream(DecodeData* data, + OPJ_SIZE_T p_size, + OPJ_BOOL p_is_read_stream) { + opj_stream_t* l_stream = 00; + if (!data || !data->src_data || data->src_size <= 0) { + return nullptr; + } + l_stream = opj_stream_create(p_size, p_is_read_stream); + if (!l_stream) { + return nullptr; + } + opj_stream_set_user_data(l_stream, data, nullptr); + opj_stream_set_user_data_length(l_stream, data->src_size); + opj_stream_set_read_function(l_stream, opj_read_from_memory); + opj_stream_set_write_function(l_stream, opj_write_from_memory); + opj_stream_set_skip_function(l_stream, opj_skip_from_memory); + opj_stream_set_seek_function(l_stream, opj_seek_from_memory); + return l_stream; +} +static void sycc_to_rgb(int offset, + int upb, + int y, + int cb, + int cr, + int* out_r, + int* out_g, + int* out_b) { + int r, g, b; + cb -= offset; + cr -= offset; + r = y + (int)(1.402 * (float)cr); + if (r < 0) { + r = 0; + } else if (r > upb) { + r = upb; + } + *out_r = r; + g = y - (int)(0.344 * (float)cb + 0.714 * (float)cr); + if (g < 0) { + g = 0; + } else if (g > upb) { + g = upb; + } + *out_g = g; + b = y + (int)(1.772 * (float)cb); + if (b < 0) { + b = 0; + } else if (b > upb) { + b = upb; + } + *out_b = b; +} + +static void sycc444_to_rgb(opj_image_t* img) { + int prec = img->comps[0].prec; + int offset = 1 << (prec - 1); + int upb = (1 << prec) - 1; + OPJ_UINT32 maxw = + std::min({img->comps[0].w, img->comps[1].w, img->comps[2].w}); + OPJ_UINT32 maxh = + std::min({img->comps[0].h, img->comps[1].h, img->comps[2].h}); + FX_SAFE_SIZE_T max_size = maxw; + max_size *= maxh; + if (!max_size.IsValid()) + return; + + const int* y = img->comps[0].data; + const int* cb = img->comps[1].data; + const int* cr = img->comps[2].data; + if (!y || !cb || !cr) + return; + + int* r = FX_Alloc(int, max_size.ValueOrDie()); + int* g = FX_Alloc(int, max_size.ValueOrDie()); + int* b = FX_Alloc(int, max_size.ValueOrDie()); + int* d0 = r; + int* d1 = g; + int* d2 = b; + for (size_t i = 0; i < max_size.ValueOrDie(); ++i) { + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++cb; + ++cr; + ++r; + ++g; + ++b; + } + FX_Free(img->comps[0].data); + FX_Free(img->comps[1].data); + FX_Free(img->comps[2].data); + img->comps[0].data = d0; + img->comps[1].data = d1; + img->comps[2].data = d2; +} + +static bool sycc420_422_size_is_valid(opj_image_t* img) { + return (img && img->comps[0].w != std::numeric_limits::max() && + (img->comps[0].w + 1) / 2 == img->comps[1].w && + img->comps[1].w == img->comps[2].w && + img->comps[1].h == img->comps[2].h); +} +static bool sycc420_size_is_valid(opj_image_t* img) { + return (sycc420_422_size_is_valid(img) && + img->comps[0].h != std::numeric_limits::max() && + (img->comps[0].h + 1) / 2 == img->comps[1].h); +} +static bool sycc422_size_is_valid(opj_image_t* img) { + return (sycc420_422_size_is_valid(img) && img->comps[0].h == img->comps[1].h); +} +static void sycc422_to_rgb(opj_image_t* img) { + if (!sycc422_size_is_valid(img)) + return; + + int prec = img->comps[0].prec; + if (prec <= 0 || prec >= 32) + return; + + int offset = 1 << (prec - 1); + int upb = (1 << prec) - 1; + + OPJ_UINT32 maxw = img->comps[0].w; + OPJ_UINT32 maxh = img->comps[0].h; + FX_SAFE_SIZE_T max_size = maxw; + max_size *= maxh; + if (!max_size.IsValid()) + return; + + const int* y = img->comps[0].data; + const int* cb = img->comps[1].data; + const int* cr = img->comps[2].data; + if (!y || !cb || !cr) + return; + + int *d0, *d1, *d2, *r, *g, *b; + d0 = r = FX_Alloc(int, max_size.ValueOrDie()); + d1 = g = FX_Alloc(int, max_size.ValueOrDie()); + d2 = b = FX_Alloc(int, max_size.ValueOrDie()); + for (uint32_t i = 0; i < maxh; ++i) { + OPJ_UINT32 j; + for (j = 0; j < (maxw & ~static_cast(1)); j += 2) { + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + ++cb; + ++cr; + } + if (j < maxw) { + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + ++cb; + ++cr; + } + } + FX_Free(img->comps[0].data); + img->comps[0].data = d0; + FX_Free(img->comps[1].data); + img->comps[1].data = d1; + FX_Free(img->comps[2].data); + img->comps[2].data = d2; + img->comps[1].w = maxw; + img->comps[1].h = maxh; + img->comps[2].w = maxw; + img->comps[2].h = maxh; + img->comps[1].dx = img->comps[0].dx; + img->comps[2].dx = img->comps[0].dx; + img->comps[1].dy = img->comps[0].dy; + img->comps[2].dy = img->comps[0].dy; +} +static bool sycc420_must_extend_cbcr(OPJ_UINT32 y, OPJ_UINT32 cbcr) { + return (y & 1) && (cbcr == y / 2); +} +void sycc420_to_rgb(opj_image_t* img) { + if (!sycc420_size_is_valid(img)) + return; + + OPJ_UINT32 prec = img->comps[0].prec; + if (!prec) + return; + OPJ_UINT32 offset = 1 << (prec - 1); + OPJ_UINT32 upb = (1 << prec) - 1; + OPJ_UINT32 yw = img->comps[0].w; + OPJ_UINT32 yh = img->comps[0].h; + OPJ_UINT32 cbw = img->comps[1].w; + OPJ_UINT32 cbh = img->comps[1].h; + OPJ_UINT32 crw = img->comps[2].w; + bool extw = sycc420_must_extend_cbcr(yw, cbw); + bool exth = sycc420_must_extend_cbcr(yh, cbh); + FX_SAFE_UINT32 safeSize = yw; + safeSize *= yh; + if (!safeSize.IsValid()) + return; + int* r = FX_Alloc(int, safeSize.ValueOrDie()); + int* g = FX_Alloc(int, safeSize.ValueOrDie()); + int* b = FX_Alloc(int, safeSize.ValueOrDie()); + int* d0 = r; + int* d1 = g; + int* d2 = b; + const int* y = img->comps[0].data; + const int* cb = img->comps[1].data; + const int* cr = img->comps[2].data; + if (!y || !cb || !cr) + return; + + const int* ny = nullptr; + int* nr = nullptr; + int* ng = nullptr; + int* nb = nullptr; + OPJ_UINT32 i = 0; + OPJ_UINT32 j = 0; + for (i = 0; i < (yh & ~(OPJ_UINT32)1); i += 2) { + ny = y + yw; + nr = r + yw; + ng = g + yw; + nb = b + yw; + for (j = 0; j < (yw & ~(OPJ_UINT32)1); j += 2) { + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); + ++ny; + ++nr; + ++ng; + ++nb; + sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); + ++ny; + ++nr; + ++ng; + ++nb; + ++cb; + ++cr; + } + if (j < yw) { + if (extw) { + --cb; + --cr; + } + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); + ++ny; + ++nr; + ++ng; + ++nb; + ++cb; + ++cr; + } + y += yw; + r += yw; + g += yw; + b += yw; + } + if (i < yh) { + if (exth) { + cb -= cbw; + cr -= crw; + } + for (j = 0; j < (yw & ~(OPJ_UINT32)1); j += 2) { + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + ++y; + ++r; + ++g; + ++b; + ++cb; + ++cr; + } + if (j < yw) { + if (extw) { + --cb; + --cr; + } + sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); + } + } + + FX_Free(img->comps[0].data); + img->comps[0].data = d0; + FX_Free(img->comps[1].data); + img->comps[1].data = d1; + FX_Free(img->comps[2].data); + img->comps[2].data = d2; + img->comps[1].w = yw; + img->comps[1].h = yh; + img->comps[2].w = yw; + img->comps[2].h = yh; + img->comps[1].w = yw; + img->comps[1].h = yh; + img->comps[2].w = yw; + img->comps[2].h = yh; + img->comps[1].dx = img->comps[0].dx; + img->comps[2].dx = img->comps[0].dx; + img->comps[1].dy = img->comps[0].dy; + img->comps[2].dy = img->comps[0].dy; +} +void color_sycc_to_rgb(opj_image_t* img) { + if (img->numcomps < 3) { + img->color_space = OPJ_CLRSPC_GRAY; + return; + } + if ((img->comps[0].dx == 1) && (img->comps[1].dx == 2) && + (img->comps[2].dx == 2) && (img->comps[0].dy == 1) && + (img->comps[1].dy == 2) && (img->comps[2].dy == 2)) { + sycc420_to_rgb(img); + } else if ((img->comps[0].dx == 1) && (img->comps[1].dx == 2) && + (img->comps[2].dx == 2) && (img->comps[0].dy == 1) && + (img->comps[1].dy == 1) && (img->comps[2].dy == 1)) { + sycc422_to_rgb(img); + } else if ((img->comps[0].dx == 1) && (img->comps[1].dx == 1) && + (img->comps[2].dx == 1) && (img->comps[0].dy == 1) && + (img->comps[1].dy == 1) && (img->comps[2].dy == 1)) { + sycc444_to_rgb(img); + } else { + return; + } + img->color_space = OPJ_CLRSPC_SRGB; +} +void color_apply_icc_profile(opj_image_t* image) { + cmsHPROFILE out_prof; + cmsUInt32Number in_type; + cmsUInt32Number out_type; + int* r; + int* g; + int* b; + int max; + cmsHPROFILE in_prof = + cmsOpenProfileFromMem(image->icc_profile_buf, image->icc_profile_len); + if (!in_prof) { + return; + } + cmsColorSpaceSignature out_space = cmsGetColorSpace(in_prof); + cmsUInt32Number intent = cmsGetHeaderRenderingIntent(in_prof); + int max_w = (int)image->comps[0].w; + int max_h = (int)image->comps[0].h; + int prec = (int)image->comps[0].prec; + OPJ_COLOR_SPACE oldspace = image->color_space; + if (out_space == cmsSigRgbData) { + if (prec <= 8) { + in_type = TYPE_RGB_8; + out_type = TYPE_RGB_8; + } else { + in_type = TYPE_RGB_16; + out_type = TYPE_RGB_16; + } + out_prof = cmsCreate_sRGBProfile(); + image->color_space = OPJ_CLRSPC_SRGB; + } else if (out_space == cmsSigGrayData) { + if (prec <= 8) { + in_type = TYPE_GRAY_8; + out_type = TYPE_RGB_8; + } else { + in_type = TYPE_GRAY_16; + out_type = TYPE_RGB_16; + } + out_prof = cmsCreate_sRGBProfile(); + image->color_space = OPJ_CLRSPC_SRGB; + } else if (out_space == cmsSigYCbCrData) { + in_type = TYPE_YCbCr_16; + out_type = TYPE_RGB_16; + out_prof = cmsCreate_sRGBProfile(); + image->color_space = OPJ_CLRSPC_SRGB; + } else { + return; + } + cmsHTRANSFORM transform = + cmsCreateTransform(in_prof, in_type, out_prof, out_type, intent, 0); + cmsCloseProfile(in_prof); + cmsCloseProfile(out_prof); + if (!transform) { + image->color_space = oldspace; + return; + } + if (image->numcomps > 2) { + if (prec <= 8) { + unsigned char *inbuf, *outbuf, *in, *out; + max = max_w * max_h; + cmsUInt32Number nr_samples = max * 3 * sizeof(unsigned char); + in = inbuf = FX_Alloc(unsigned char, nr_samples); + out = outbuf = FX_Alloc(unsigned char, nr_samples); + r = image->comps[0].data; + g = image->comps[1].data; + b = image->comps[2].data; + for (int i = 0; i < max; ++i) { + *in++ = (unsigned char)*r++; + *in++ = (unsigned char)*g++; + *in++ = (unsigned char)*b++; + } + cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); + r = image->comps[0].data; + g = image->comps[1].data; + b = image->comps[2].data; + for (int i = 0; i < max; ++i) { + *r++ = (int)*out++; + *g++ = (int)*out++; + *b++ = (int)*out++; + } + FX_Free(inbuf); + FX_Free(outbuf); + } else { + unsigned short *inbuf, *outbuf, *in, *out; + max = max_w * max_h; + cmsUInt32Number nr_samples = max * 3 * sizeof(unsigned short); + in = inbuf = FX_Alloc(unsigned short, nr_samples); + out = outbuf = FX_Alloc(unsigned short, nr_samples); + r = image->comps[0].data; + g = image->comps[1].data; + b = image->comps[2].data; + for (int i = 0; i < max; ++i) { + *in++ = (unsigned short)*r++; + *in++ = (unsigned short)*g++; + *in++ = (unsigned short)*b++; + } + cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); + r = image->comps[0].data; + g = image->comps[1].data; + b = image->comps[2].data; + for (int i = 0; i < max; ++i) { + *r++ = (int)*out++; + *g++ = (int)*out++; + *b++ = (int)*out++; + } + FX_Free(inbuf); + FX_Free(outbuf); + } + } else { + unsigned char *in, *inbuf, *out, *outbuf; + max = max_w * max_h; + cmsUInt32Number nr_samples = + (cmsUInt32Number)max * 3 * sizeof(unsigned char); + in = inbuf = FX_Alloc(unsigned char, nr_samples); + out = outbuf = FX_Alloc(unsigned char, nr_samples); + image->comps = (opj_image_comp_t*)realloc( + image->comps, (image->numcomps + 2) * sizeof(opj_image_comp_t)); + if (image->numcomps == 2) { + image->comps[3] = image->comps[1]; + } + image->comps[1] = image->comps[0]; + image->comps[2] = image->comps[0]; + image->comps[1].data = FX_Alloc(int, (size_t)max); + FXSYS_memset(image->comps[1].data, 0, sizeof(int) * (size_t)max); + image->comps[2].data = FX_Alloc(int, (size_t)max); + FXSYS_memset(image->comps[2].data, 0, sizeof(int) * (size_t)max); + image->numcomps += 2; + r = image->comps[0].data; + for (int i = 0; i < max; ++i) { + *in++ = (unsigned char)*r++; + } + cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max); + r = image->comps[0].data; + g = image->comps[1].data; + b = image->comps[2].data; + for (int i = 0; i < max; ++i) { + *r++ = (int)*out++; + *g++ = (int)*out++; + *b++ = (int)*out++; + } + FX_Free(inbuf); + FX_Free(outbuf); + } + cmsDeleteTransform(transform); +} +void color_apply_conversion(opj_image_t* image) { + int* row; + int enumcs, numcomps; + numcomps = image->numcomps; + if (numcomps < 3) { + return; + } + row = (int*)image->icc_profile_buf; + enumcs = row[0]; + if (enumcs == 14) { + int *L, *a, *b, *red, *green, *blue, *src0, *src1, *src2; + double rl, ol, ra, oa, rb, ob, prec0, prec1, prec2; + double minL, maxL, mina, maxa, minb, maxb; + unsigned int default_type; + unsigned int i, max; + cmsHPROFILE in, out; + cmsHTRANSFORM transform; + cmsUInt16Number RGB[3]; + cmsCIELab Lab; + in = cmsCreateLab4Profile(nullptr); + out = cmsCreate_sRGBProfile(); + transform = cmsCreateTransform(in, TYPE_Lab_DBL, out, TYPE_RGB_16, + INTENT_PERCEPTUAL, 0); + cmsCloseProfile(in); + cmsCloseProfile(out); + if (!transform) { + return; + } + prec0 = (double)image->comps[0].prec; + prec1 = (double)image->comps[1].prec; + prec2 = (double)image->comps[2].prec; + default_type = row[1]; + if (default_type == 0x44454600) { + rl = 100; + ra = 170; + rb = 200; + ol = 0; + oa = pow(2, prec1 - 1); + ob = pow(2, prec2 - 2) + pow(2, prec2 - 3); + } else { + rl = row[2]; + ra = row[4]; + rb = row[6]; + ol = row[3]; + oa = row[5]; + ob = row[7]; + } + L = src0 = image->comps[0].data; + a = src1 = image->comps[1].data; + b = src2 = image->comps[2].data; + max = image->comps[0].w * image->comps[0].h; + red = FX_Alloc(int, max); + image->comps[0].data = red; + green = FX_Alloc(int, max); + image->comps[1].data = green; + blue = FX_Alloc(int, max); + image->comps[2].data = blue; + minL = -(rl * ol) / (pow(2, prec0) - 1); + maxL = minL + rl; + mina = -(ra * oa) / (pow(2, prec1) - 1); + maxa = mina + ra; + minb = -(rb * ob) / (pow(2, prec2) - 1); + maxb = minb + rb; + for (i = 0; i < max; ++i) { + Lab.L = minL + (double)(*L) * (maxL - minL) / (pow(2, prec0) - 1); + ++L; + Lab.a = mina + (double)(*a) * (maxa - mina) / (pow(2, prec1) - 1); + ++a; + Lab.b = minb + (double)(*b) * (maxb - minb) / (pow(2, prec2) - 1); + ++b; + cmsDoTransform(transform, &Lab, RGB, 1); + *red++ = RGB[0]; + *green++ = RGB[1]; + *blue++ = RGB[2]; + } + cmsDeleteTransform(transform); + FX_Free(src0); + FX_Free(src1); + FX_Free(src2); + image->color_space = OPJ_CLRSPC_SRGB; + image->comps[0].prec = 16; + image->comps[1].prec = 16; + image->comps[2].prec = 16; + return; + } +} +class CJPX_Decoder { + public: + explicit CJPX_Decoder(CPDF_ColorSpace* cs); + ~CJPX_Decoder(); + bool Init(const unsigned char* src_data, uint32_t src_size); + void GetInfo(uint32_t* width, uint32_t* height, uint32_t* components); + bool Decode(uint8_t* dest_buf, + int pitch, + const std::vector& offsets); + + private: + const uint8_t* m_SrcData; + uint32_t m_SrcSize; + opj_image_t* image; + opj_codec_t* l_codec; + opj_stream_t* l_stream; + const CPDF_ColorSpace* const m_ColorSpace; +}; + +CJPX_Decoder::CJPX_Decoder(CPDF_ColorSpace* cs) + : image(nullptr), l_codec(nullptr), l_stream(nullptr), m_ColorSpace(cs) {} + +CJPX_Decoder::~CJPX_Decoder() { + if (l_codec) { + opj_destroy_codec(l_codec); + } + if (l_stream) { + opj_stream_destroy(l_stream); + } + if (image) { + opj_image_destroy(image); + } +} + +bool CJPX_Decoder::Init(const unsigned char* src_data, uint32_t src_size) { + static const unsigned char szJP2Header[] = { + 0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50, 0x20, 0x20, 0x0d, 0x0a, 0x87, 0x0a}; + if (!src_data || src_size < sizeof(szJP2Header)) + return false; + + image = nullptr; + m_SrcData = src_data; + m_SrcSize = src_size; + DecodeData srcData(const_cast(src_data), src_size); + l_stream = fx_opj_stream_create_memory_stream(&srcData, + OPJ_J2K_STREAM_CHUNK_SIZE, 1); + if (!l_stream) { + return false; + } + opj_dparameters_t parameters; + opj_set_default_decoder_parameters(¶meters); + parameters.decod_format = 0; + parameters.cod_format = 3; + if (FXSYS_memcmp(m_SrcData, szJP2Header, sizeof(szJP2Header)) == 0) { + l_codec = opj_create_decompress(OPJ_CODEC_JP2); + parameters.decod_format = 1; + } else { + l_codec = opj_create_decompress(OPJ_CODEC_J2K); + } + if (!l_codec) { + return false; + } + if (m_ColorSpace && m_ColorSpace->GetFamily() == PDFCS_INDEXED) + parameters.flags |= OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG; + opj_set_info_handler(l_codec, fx_info_callback, 00); + opj_set_warning_handler(l_codec, fx_warning_callback, 00); + opj_set_error_handler(l_codec, fx_error_callback, 00); + if (!opj_setup_decoder(l_codec, ¶meters)) { + return false; + } + if (!opj_read_header(l_stream, l_codec, &image)) { + image = nullptr; + return false; + } + image->pdfium_use_colorspace = !!m_ColorSpace; + + if (!parameters.nb_tile_to_decode) { + if (!opj_set_decode_area(l_codec, image, parameters.DA_x0, parameters.DA_y0, + parameters.DA_x1, parameters.DA_y1)) { + opj_image_destroy(image); + image = nullptr; + return false; + } + if (!(opj_decode(l_codec, l_stream, image) && + opj_end_decompress(l_codec, l_stream))) { + opj_image_destroy(image); + image = nullptr; + return false; + } + } else { + if (!opj_get_decoded_tile(l_codec, l_stream, image, + parameters.tile_index)) { + return false; + } + } + opj_stream_destroy(l_stream); + l_stream = nullptr; + if (image->color_space != OPJ_CLRSPC_SYCC && image->numcomps == 3 && + image->comps[0].dx == image->comps[0].dy && image->comps[1].dx != 1) { + image->color_space = OPJ_CLRSPC_SYCC; + } else if (image->numcomps <= 2) { + image->color_space = OPJ_CLRSPC_GRAY; + } + if (image->color_space == OPJ_CLRSPC_SYCC) { + color_sycc_to_rgb(image); + } + if (image->icc_profile_buf) { + FX_Free(image->icc_profile_buf); + image->icc_profile_buf = nullptr; + image->icc_profile_len = 0; + } + if (!image) { + return false; + } + return true; +} + +void CJPX_Decoder::GetInfo(uint32_t* width, + uint32_t* height, + uint32_t* components) { + *width = (uint32_t)image->x1; + *height = (uint32_t)image->y1; + *components = (uint32_t)image->numcomps; +} + +bool CJPX_Decoder::Decode(uint8_t* dest_buf, + int pitch, + const std::vector& offsets) { + if (image->comps[0].w != image->x1 || image->comps[0].h != image->y1) + return false; + + if (pitch<(int)(image->comps[0].w * 8 * image->numcomps + 31)>> 5 << 2) + return false; + + FXSYS_memset(dest_buf, 0xff, image->y1 * pitch); + std::vector channel_bufs(image->numcomps); + std::vector adjust_comps(image->numcomps); + for (uint32_t i = 0; i < image->numcomps; i++) { + channel_bufs[i] = dest_buf + offsets[i]; + adjust_comps[i] = image->comps[i].prec - 8; + if (i > 0) { + if (image->comps[i].dx != image->comps[i - 1].dx || + image->comps[i].dy != image->comps[i - 1].dy || + image->comps[i].prec != image->comps[i - 1].prec) { + return false; + } + } + } + int width = image->comps[0].w; + int height = image->comps[0].h; + for (uint32_t channel = 0; channel < image->numcomps; ++channel) { + uint8_t* pChannel = channel_bufs[channel]; + if (adjust_comps[channel] < 0) { + for (int row = 0; row < height; ++row) { + uint8_t* pScanline = pChannel + row * pitch; + for (int col = 0; col < width; ++col) { + uint8_t* pPixel = pScanline + col * image->numcomps; + if (!image->comps[channel].data) + continue; + + int src = image->comps[channel].data[row * width + col]; + src += image->comps[channel].sgnd + ? 1 << (image->comps[channel].prec - 1) + : 0; + if (adjust_comps[channel] > 0) { + *pPixel = 0; + } else { + *pPixel = (uint8_t)(src << -adjust_comps[channel]); + } + } + } + } else { + for (int row = 0; row < height; ++row) { + uint8_t* pScanline = pChannel + row * pitch; + for (int col = 0; col < width; ++col) { + uint8_t* pPixel = pScanline + col * image->numcomps; + if (!image->comps[channel].data) + continue; + + int src = image->comps[channel].data[row * width + col]; + src += image->comps[channel].sgnd + ? 1 << (image->comps[channel].prec - 1) + : 0; + if (adjust_comps[channel] - 1 < 0) { + *pPixel = (uint8_t)((src >> adjust_comps[channel])); + } else { + int tmpPixel = (src >> adjust_comps[channel]) + + ((src >> (adjust_comps[channel] - 1)) % 2); + if (tmpPixel > 255) { + tmpPixel = 255; + } else if (tmpPixel < 0) { + tmpPixel = 0; + } + *pPixel = (uint8_t)tmpPixel; + } + } + } + } + } + return true; +} + +CCodec_JpxModule::CCodec_JpxModule() {} +CCodec_JpxModule::~CCodec_JpxModule() {} + +CJPX_Decoder* CCodec_JpxModule::CreateDecoder(const uint8_t* src_buf, + uint32_t src_size, + CPDF_ColorSpace* cs) { + std::unique_ptr decoder(new CJPX_Decoder(cs)); + return decoder->Init(src_buf, src_size) ? decoder.release() : nullptr; +} + +void CCodec_JpxModule::GetImageInfo(CJPX_Decoder* pDecoder, + uint32_t* width, + uint32_t* height, + uint32_t* components) { + pDecoder->GetInfo(width, height, components); +} + +bool CCodec_JpxModule::Decode(CJPX_Decoder* pDecoder, + uint8_t* dest_data, + int pitch, + const std::vector& offsets) { + return pDecoder->Decode(dest_data, pitch, offsets); +} + +void CCodec_JpxModule::DestroyDecoder(CJPX_Decoder* pDecoder) { + delete pDecoder; +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpx_unittest.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpx_unittest.cpp new file mode 100644 index 000000000000..3ef14e62c357 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_jpx_unittest.cpp @@ -0,0 +1,555 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include + +#include + +#include "core/fxcodec/codec/codec_int.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +static const OPJ_OFF_T kSkipError = static_cast(-1); +static const OPJ_SIZE_T kReadError = static_cast(-1); +static const OPJ_SIZE_T kWriteError = static_cast(-1); + +static unsigned char stream_data[] = { + 0x00, 0x01, 0x02, 0x03, + 0x84, 0x85, 0x86, 0x87, // Include some hi-bytes, too. +}; + +union Float_t { + Float_t(float num = 0.0f) : f(num) {} + + int32_t i; + FX_FLOAT f; +}; + +TEST(fxcodec, CMYK_Rounding) { + // Testing all floats from 0.0 to 1.0 takes about 35 seconds in release + // builds and much longer in debug builds, so just test the known-dangerous + // range. + const FX_FLOAT startValue = 0.001f; + const FX_FLOAT endValue = 0.003f; + FX_FLOAT R = 0.0f, G = 0.0f, B = 0.0f; + // Iterate through floats by incrementing the representation, as discussed in + // https://randomascii.wordpress.com/2012/01/23/stupid-float-tricks-2/ + for (Float_t f = startValue; f.f < endValue; f.i++) { + AdobeCMYK_to_sRGB(f.f, f.f, f.f, f.f, R, G, B); + } + // Check various other 'special' numbers. + AdobeCMYK_to_sRGB(0.0f, 0.25f, 0.5f, 1.0f, R, G, B); +} + +TEST(fxcodec, DecodeDataNullDecodeData) { + unsigned char buffer[16]; + DecodeData* ptr = nullptr; + + // Error codes, not segvs, should callers pass us a nullptr pointer. + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, sizeof(buffer), ptr)); + EXPECT_EQ(kWriteError, opj_write_from_memory(buffer, sizeof(buffer), ptr)); + EXPECT_EQ(kSkipError, opj_skip_from_memory(1, ptr)); + EXPECT_FALSE(opj_seek_from_memory(1, ptr)); +} + +TEST(fxcodec, DecodeDataNullStream) { + DecodeData dd(nullptr, 0); + unsigned char buffer[16]; + + // Reads of size 0 do nothing but return an error code. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 0, &dd)); + EXPECT_EQ(0xbd, buffer[0]); + + // Reads of nonzero size do nothing but return an error code. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, sizeof(buffer), &dd)); + EXPECT_EQ(0xbd, buffer[0]); + + // writes of size 0 do nothing but return an error code. + EXPECT_EQ(kWriteError, opj_write_from_memory(buffer, 0, &dd)); + + // writes of nonzero size do nothing but return an error code. + EXPECT_EQ(kWriteError, opj_write_from_memory(buffer, sizeof(buffer), &dd)); + + // Skips of size 0 always return an error code. + EXPECT_EQ(kSkipError, opj_skip_from_memory(0, &dd)); + + // Skips of nonzero size always return an error code. + EXPECT_EQ(kSkipError, opj_skip_from_memory(1, &dd)); + + // Seeks to 0 offset return in error. + EXPECT_FALSE(opj_seek_from_memory(0, &dd)); + + // Seeks to non-zero offsets return in error. + EXPECT_FALSE(opj_seek_from_memory(1, &dd)); +} + +TEST(fxcodec, DecodeDataZeroSize) { + DecodeData dd(stream_data, 0); + unsigned char buffer[16]; + + // Reads of size 0 do nothing but return an error code. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 0, &dd)); + EXPECT_EQ(0xbd, buffer[0]); + + // Reads of nonzero size do nothing but return an error code. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, sizeof(buffer), &dd)); + EXPECT_EQ(0xbd, buffer[0]); + + // writes of size 0 do nothing but return an error code. + EXPECT_EQ(kWriteError, opj_write_from_memory(buffer, 0, &dd)); + + // writes of nonzero size do nothing but return an error code. + EXPECT_EQ(kWriteError, opj_write_from_memory(buffer, sizeof(buffer), &dd)); + + // Skips of size 0 always return an error code. + EXPECT_EQ(kSkipError, opj_skip_from_memory(0, &dd)); + + // Skips of nonzero size always return an error code. + EXPECT_EQ(kSkipError, opj_skip_from_memory(1, &dd)); + + // Seeks to 0 offset return in error. + EXPECT_FALSE(opj_seek_from_memory(0, &dd)); + + // Seeks to non-zero offsets return in error. + EXPECT_FALSE(opj_seek_from_memory(1, &dd)); +} + +TEST(fxcodec, DecodeDataReadInBounds) { + unsigned char buffer[16]; + { + DecodeData dd(stream_data, sizeof(stream_data)); + + // Exact sized read in a single call. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(8u, opj_read_from_memory(buffer, sizeof(buffer), &dd)); + EXPECT_EQ(0x00, buffer[0]); + EXPECT_EQ(0x01, buffer[1]); + EXPECT_EQ(0x02, buffer[2]); + EXPECT_EQ(0x03, buffer[3]); + EXPECT_EQ(0x84, buffer[4]); + EXPECT_EQ(0x85, buffer[5]); + EXPECT_EQ(0x86, buffer[6]); + EXPECT_EQ(0x87, buffer[7]); + EXPECT_EQ(0xbd, buffer[8]); + } + { + DecodeData dd(stream_data, sizeof(stream_data)); + + // Simple read. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(2u, opj_read_from_memory(buffer, 2, &dd)); + EXPECT_EQ(0x00, buffer[0]); + EXPECT_EQ(0x01, buffer[1]); + EXPECT_EQ(0xbd, buffer[2]); + + // Read of size 0 doesn't affect things. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(0u, opj_read_from_memory(buffer, 0, &dd)); + EXPECT_EQ(0xbd, buffer[0]); + + // Read exactly up to end of data. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(6u, opj_read_from_memory(buffer, 6, &dd)); + EXPECT_EQ(0x02, buffer[0]); + EXPECT_EQ(0x03, buffer[1]); + EXPECT_EQ(0x84, buffer[2]); + EXPECT_EQ(0x85, buffer[3]); + EXPECT_EQ(0x86, buffer[4]); + EXPECT_EQ(0x87, buffer[5]); + EXPECT_EQ(0xbd, buffer[6]); + + // Read of size 0 at EOF is still an error. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 0, &dd)); + EXPECT_EQ(0xbd, buffer[0]); + } +} + +TEST(fxcodec, DecodeDataReadBeyondBounds) { + unsigned char buffer[16]; + { + DecodeData dd(stream_data, sizeof(stream_data)); + + // Read beyond bounds in a single step. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(8u, opj_read_from_memory(buffer, sizeof(buffer) + 1, &dd)); + EXPECT_EQ(0x00, buffer[0]); + EXPECT_EQ(0x01, buffer[1]); + EXPECT_EQ(0x02, buffer[2]); + EXPECT_EQ(0x03, buffer[3]); + EXPECT_EQ(0x84, buffer[4]); + EXPECT_EQ(0x85, buffer[5]); + EXPECT_EQ(0x86, buffer[6]); + EXPECT_EQ(0x87, buffer[7]); + EXPECT_EQ(0xbd, buffer[8]); + } + { + DecodeData dd(stream_data, sizeof(stream_data)); + + // Read well beyond bounds in a single step. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(8u, opj_read_from_memory( + buffer, std::numeric_limits::max(), &dd)); + EXPECT_EQ(0x00, buffer[0]); + EXPECT_EQ(0x01, buffer[1]); + EXPECT_EQ(0x02, buffer[2]); + EXPECT_EQ(0x03, buffer[3]); + EXPECT_EQ(0x84, buffer[4]); + EXPECT_EQ(0x85, buffer[5]); + EXPECT_EQ(0x86, buffer[6]); + EXPECT_EQ(0x87, buffer[7]); + EXPECT_EQ(0xbd, buffer[8]); + } + { + DecodeData dd(stream_data, sizeof(stream_data)); + + // Read of size 6 gets first 6 bytes. + // rest of buffer intact. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(6u, opj_read_from_memory(buffer, 6, &dd)); + EXPECT_EQ(0x00, buffer[0]); + EXPECT_EQ(0x01, buffer[1]); + EXPECT_EQ(0x02, buffer[2]); + EXPECT_EQ(0x03, buffer[3]); + EXPECT_EQ(0x84, buffer[4]); + EXPECT_EQ(0x85, buffer[5]); + EXPECT_EQ(0xbd, buffer[6]); + + // Read of size 6 gets remaining two bytes. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(2u, opj_read_from_memory(buffer, 6, &dd)); + EXPECT_EQ(0x86, buffer[0]); + EXPECT_EQ(0x87, buffer[1]); + EXPECT_EQ(0xbd, buffer[2]); + + // Read of 6 more gets nothing and leaves rest of buffer intact. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 6, &dd)); + EXPECT_EQ(0xbd, buffer[0]); + } +} + +TEST(fxcodec, DecodeDataWriteInBounds) { + unsigned char stream[16]; + static unsigned char buffer_data[] = { + 0x00, 0x01, 0x02, 0x03, 0x80, 0x80, 0x81, 0x82, 0x83, 0x84, + }; + { + // Pretend the stream can only hold 4 bytes. + DecodeData dd(stream, 4); + + memset(stream, 0xbd, sizeof(stream)); + EXPECT_EQ(4u, opj_write_from_memory(buffer_data, 4, &dd)); + EXPECT_EQ(0x00, stream[0]); + EXPECT_EQ(0x01, stream[1]); + EXPECT_EQ(0x02, stream[2]); + EXPECT_EQ(0x03, stream[3]); + EXPECT_EQ(0xbd, stream[4]); + } + { + // Pretend the stream can only hold 4 bytes. + DecodeData dd(stream, 4); + + memset(stream, 0xbd, sizeof(stream)); + EXPECT_EQ(2u, opj_write_from_memory(buffer_data, 2, &dd)); + EXPECT_EQ(2u, opj_write_from_memory(buffer_data, 2, &dd)); + EXPECT_EQ(0x00, stream[0]); + EXPECT_EQ(0x01, stream[1]); + EXPECT_EQ(0x00, stream[2]); + EXPECT_EQ(0x01, stream[3]); + EXPECT_EQ(0xbd, stream[4]); + } +} + +TEST(fxcodec, DecodeDataWriteBeyondBounds) { + unsigned char stream[16]; + static unsigned char buffer_data[] = { + 0x10, 0x11, 0x12, 0x13, 0x94, 0x95, 0x96, 0x97, + }; + { + // Pretend the stream can only hold 4 bytes. + DecodeData dd(stream, 4); + + // Write ending past EOF transfers up til EOF. + memset(stream, 0xbd, sizeof(stream)); + EXPECT_EQ(4u, opj_write_from_memory(buffer_data, 5, &dd)); + EXPECT_EQ(0x10, stream[0]); + EXPECT_EQ(0x11, stream[1]); + EXPECT_EQ(0x12, stream[2]); + EXPECT_EQ(0x13, stream[3]); + EXPECT_EQ(0xbd, stream[4]); + + // Subsequent writes fail. + memset(stream, 0xbd, sizeof(stream)); + EXPECT_EQ(kWriteError, opj_write_from_memory(buffer_data, 5, &dd)); + EXPECT_EQ(0xbd, stream[0]); + } + { + // Pretend the stream can only hold 4 bytes. + DecodeData dd(stream, 4); + + // Write ending past EOF (two steps) transfers up til EOF. + memset(stream, 0xbd, sizeof(stream)); + EXPECT_EQ(2u, opj_write_from_memory(buffer_data, 2, &dd)); + EXPECT_EQ(2u, opj_write_from_memory(buffer_data, 4, &dd)); + EXPECT_EQ(0x10, stream[0]); + EXPECT_EQ(0x11, stream[1]); + EXPECT_EQ(0x10, stream[2]); + EXPECT_EQ(0x11, stream[3]); + EXPECT_EQ(0xbd, stream[4]); + + // Subsequent writes fail. + memset(stream, 0xbd, sizeof(stream)); + EXPECT_EQ(kWriteError, opj_write_from_memory(buffer_data, 5, &dd)); + EXPECT_EQ(0xbd, stream[0]); + } +} + +// Note: Some care needs to be taken here because the skip/seek functions +// take OPJ_OFF_T's as arguments, which are typically a signed type. +TEST(fxcodec, DecodeDataSkip) { + unsigned char buffer[16]; + { + DecodeData dd(stream_data, sizeof(stream_data)); + + // Skiping within buffer is allowed. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(1u, opj_skip_from_memory(1, &dd)); + EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0x01, buffer[0]); + EXPECT_EQ(0xbd, buffer[1]); + + // Skiping 0 bytes changes nothing. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(0, opj_skip_from_memory(0, &dd)); + EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0x02, buffer[0]); + EXPECT_EQ(0xbd, buffer[1]); + + // Skiping to EOS-1 is possible. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(4u, opj_skip_from_memory(4, &dd)); + EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0x87, buffer[0]); + EXPECT_EQ(0xbd, buffer[1]); + + // Next read fails. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0xbd, buffer[0]); + } + { + DecodeData dd(stream_data, sizeof(stream_data)); + + // Skiping directly to EOS is allowed. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(8u, opj_skip_from_memory(8, &dd)); + + // Next read fails. + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0xbd, buffer[0]); + } + { + DecodeData dd(stream_data, sizeof(stream_data)); + + // Skipping beyond end of stream is allowed and returns full distance. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(9u, opj_skip_from_memory(9, &dd)); + + // Next read fails. + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0xbd, buffer[0]); + } + { + DecodeData dd(stream_data, sizeof(stream_data)); + + // Skipping way beyond EOS is allowd, doesn't wrap, and returns + // full distance. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(4u, opj_skip_from_memory(4, &dd)); + EXPECT_EQ(std::numeric_limits::max(), + opj_skip_from_memory(std::numeric_limits::max(), &dd)); + + // Next read fails. If it succeeds, it may mean we wrapped. + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0xbd, buffer[0]); + } + { + DecodeData dd(stream_data, sizeof(stream_data)); + + // Negative skip within buffer not is allowed, position unchanged. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(4u, opj_skip_from_memory(4, &dd)); + EXPECT_EQ(kSkipError, opj_skip_from_memory(-2, &dd)); + + // Next read succeeds as if nothing has happenned. + EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0x84, buffer[0]); + EXPECT_EQ(0xbd, buffer[1]); + + // Negative skip before buffer is not allowed, position unchanged. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(kSkipError, opj_skip_from_memory(-4, &dd)); + + // Next read succeeds as if nothing has happenned. + EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0x85, buffer[0]); + EXPECT_EQ(0xbd, buffer[1]); + } + { + DecodeData dd(stream_data, sizeof(stream_data)); + + // Negative skip way before buffer is not allowed, doesn't wrap + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(4u, opj_skip_from_memory(4, &dd)); + EXPECT_EQ(kSkipError, + opj_skip_from_memory(std::numeric_limits::min(), &dd)); + + // Next read succeeds. If it fails, it may mean we wrapped. + EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0x84, buffer[0]); + EXPECT_EQ(0xbd, buffer[1]); + } + { + DecodeData dd(stream_data, sizeof(stream_data)); + + // Negative skip after EOS isn't alowed, still EOS. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_EQ(8u, opj_skip_from_memory(8, &dd)); + EXPECT_EQ(kSkipError, opj_skip_from_memory(-4, &dd)); + + // Next read fails. + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0xbd, buffer[0]); + } +} + +TEST(fxcodec, DecodeDataSeek) { + unsigned char buffer[16]; + DecodeData dd(stream_data, sizeof(stream_data)); + + // Seeking within buffer is allowed and read succeeds + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_TRUE(opj_seek_from_memory(1, &dd)); + EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0x01, buffer[0]); + EXPECT_EQ(0xbd, buffer[1]); + + // Seeking before start returns error leaving position unchanged. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_FALSE(opj_seek_from_memory(-1, &dd)); + EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0x02, buffer[0]); + EXPECT_EQ(0xbd, buffer[1]); + + // Seeking way before start returns error leaving position unchanged. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_FALSE( + opj_seek_from_memory(std::numeric_limits::min(), &dd)); + EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0x03, buffer[0]); + EXPECT_EQ(0xbd, buffer[1]); + + // Seeking exactly to EOS is allowed but read fails. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_TRUE(opj_seek_from_memory(8, &dd)); + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0xbd, buffer[0]); + + // Seeking back to zero offset is allowed and read succeeds. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_TRUE(opj_seek_from_memory(0, &dd)); + EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0x00, buffer[0]); + EXPECT_EQ(0xbd, buffer[1]); + + // Seeking beyond end of stream is allowed but read fails. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_TRUE(opj_seek_from_memory(16, &dd)); + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0xbd, buffer[0]); + + // Seeking within buffer after seek past EOF restores good state. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_TRUE(opj_seek_from_memory(4, &dd)); + EXPECT_EQ(1u, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0x84, buffer[0]); + EXPECT_EQ(0xbd, buffer[1]); + + // Seeking way beyond EOS is allowed, doesn't wrap, and read fails. + memset(buffer, 0xbd, sizeof(buffer)); + EXPECT_TRUE(opj_seek_from_memory(std::numeric_limits::max(), &dd)); + EXPECT_EQ(kReadError, opj_read_from_memory(buffer, 1, &dd)); + EXPECT_EQ(0xbd, buffer[0]); +} + +TEST(fxcodec, YUV420ToRGB) { + opj_image_comp_t u; + memset(&u, 0, sizeof(u)); + u.dx = 1; + u.dy = 1; + u.w = 16; + u.h = 16; + u.prec = 8; + u.bpp = 8; + opj_image_comp_t v; + memset(&v, 0, sizeof(v)); + v.dx = 1; + v.dy = 1; + v.w = 16; + v.h = 16; + v.prec = 8; + v.bpp = 8; + opj_image_comp_t y; + memset(&y, 0, sizeof(y)); + y.dx = 1; + y.dy = 1; + y.prec = 8; + y.bpp = 8; + opj_image_t img; + memset(&img, 0, sizeof(img)); + img.numcomps = 3; + img.color_space = OPJ_CLRSPC_SYCC; + img.comps = FX_Alloc(opj_image_comp_t, 3); + const struct { + OPJ_UINT32 w; + bool expected; + } cases[] = {{0, false}, {1, false}, {30, false}, {31, true}, + {32, true}, {33, false}, {34, false}, {UINT_MAX, false}}; + for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); ++i) { + y.w = cases[i].w; + y.h = y.w; + img.x1 = y.w; + img.y1 = y.h; + y.data = FX_Alloc(OPJ_INT32, y.w * y.h); + memset(y.data, 1, y.w * y.h * sizeof(OPJ_INT32)); + u.data = FX_Alloc(OPJ_INT32, u.w * u.h); + memset(u.data, 0, u.w * u.h * sizeof(OPJ_INT32)); + v.data = FX_Alloc(OPJ_INT32, v.w * v.h); + memset(v.data, 0, v.w * v.h * sizeof(OPJ_INT32)); + img.comps[0] = y; + img.comps[1] = u; + img.comps[2] = v; + sycc420_to_rgb(&img); + if (cases[i].expected) { + EXPECT_EQ(img.comps[0].w, img.comps[1].w); + EXPECT_EQ(img.comps[0].h, img.comps[1].h); + EXPECT_EQ(img.comps[0].w, img.comps[2].w); + EXPECT_EQ(img.comps[0].h, img.comps[2].h); + } else { + EXPECT_NE(img.comps[0].w, img.comps[1].w); + EXPECT_NE(img.comps[0].h, img.comps[1].h); + EXPECT_NE(img.comps[0].w, img.comps[2].w); + EXPECT_NE(img.comps[0].h, img.comps[2].h); + } + FX_Free(img.comps[0].data); + FX_Free(img.comps[1].data); + FX_Free(img.comps[2].data); + } + FX_Free(img.comps); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_progress.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_progress.cpp new file mode 100644 index 000000000000..1f2f50c29e12 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_progress.cpp @@ -0,0 +1,2353 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/codec/ccodec_progressivedecoder.h" + +#include +#include + +#include "core/fxcodec/fx_codec.h" +#include "core/fxge/fx_dib.h" +#include "third_party/base/numerics/safe_math.h" +#include "third_party/base/ptr_util.h" + +#define FXCODEC_BLOCK_SIZE 4096 + +namespace { + +#if _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_ +const double kPngGamma = 1.7; +#else // _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_ +const double kPngGamma = 2.2; +#endif // _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_ + +void RGB2BGR(uint8_t* buffer, int width = 1) { + if (buffer && width > 0) { + uint8_t temp; + int i = 0; + int j = 0; + for (; i < width; i++, j += 3) { + temp = buffer[j]; + buffer[j] = buffer[j + 2]; + buffer[j + 2] = temp; + } + } +} + +} // namespace + +CCodec_ProgressiveDecoder::CFXCODEC_WeightTable::CFXCODEC_WeightTable() {} + +CCodec_ProgressiveDecoder::CFXCODEC_WeightTable::~CFXCODEC_WeightTable() {} + +void CCodec_ProgressiveDecoder::CFXCODEC_WeightTable::Calc(int dest_len, + int dest_min, + int dest_max, + int src_len, + int src_min, + int src_max, + bool bInterpol) { + double scale, base; + scale = (FX_FLOAT)src_len / (FX_FLOAT)dest_len; + if (dest_len < 0) { + base = (FX_FLOAT)(src_len); + } else { + base = 0.0f; + } + m_ItemSize = + (int)(sizeof(int) * 2 + + sizeof(int) * (FXSYS_ceil(FXSYS_fabs((FX_FLOAT)scale)) + 1)); + m_DestMin = dest_min; + m_pWeightTables.resize((dest_max - dest_min) * m_ItemSize + 4); + if (FXSYS_fabs((FX_FLOAT)scale) < 1.0f) { + for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel++) { + PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel); + double src_pos = dest_pixel * scale + scale / 2 + base; + if (bInterpol) { + pixel_weights.m_SrcStart = + (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2); + pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2); + if (pixel_weights.m_SrcStart < src_min) { + pixel_weights.m_SrcStart = src_min; + } + if (pixel_weights.m_SrcEnd >= src_max) { + pixel_weights.m_SrcEnd = src_max - 1; + } + if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) { + pixel_weights.m_Weights[0] = 65536; + } else { + pixel_weights.m_Weights[1] = FXSYS_round( + (FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * + 65536); + pixel_weights.m_Weights[0] = 65536 - pixel_weights.m_Weights[1]; + } + } else { + pixel_weights.m_SrcStart = pixel_weights.m_SrcEnd = + (int)FXSYS_floor((FX_FLOAT)src_pos); + pixel_weights.m_Weights[0] = 65536; + } + } + return; + } + for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel++) { + PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel); + double src_start = dest_pixel * scale + base; + double src_end = src_start + scale; + int start_i, end_i; + if (src_start < src_end) { + start_i = (int)FXSYS_floor((FX_FLOAT)src_start); + end_i = (int)FXSYS_ceil((FX_FLOAT)src_end); + } else { + start_i = (int)FXSYS_floor((FX_FLOAT)src_end); + end_i = (int)FXSYS_ceil((FX_FLOAT)src_start); + } + if (start_i < src_min) { + start_i = src_min; + } + if (end_i >= src_max) { + end_i = src_max - 1; + } + if (start_i > end_i) { + pixel_weights.m_SrcStart = start_i; + pixel_weights.m_SrcEnd = start_i; + continue; + } + pixel_weights.m_SrcStart = start_i; + pixel_weights.m_SrcEnd = end_i; + for (int j = start_i; j <= end_i; j++) { + double dest_start = ((FX_FLOAT)j - base) / scale; + double dest_end = ((FX_FLOAT)(j + 1) - base) / scale; + if (dest_start > dest_end) { + double temp = dest_start; + dest_start = dest_end; + dest_end = temp; + } + double area_start = dest_start > (FX_FLOAT)(dest_pixel) + ? dest_start + : (FX_FLOAT)(dest_pixel); + double area_end = dest_end > (FX_FLOAT)(dest_pixel + 1) + ? (FX_FLOAT)(dest_pixel + 1) + : dest_end; + double weight = area_start >= area_end ? 0.0f : area_end - area_start; + if (weight == 0 && j == end_i) { + pixel_weights.m_SrcEnd--; + break; + } + pixel_weights.m_Weights[j - start_i] = + FXSYS_round((FX_FLOAT)(weight * 65536)); + } + } +} + +CCodec_ProgressiveDecoder::CFXCODEC_HorzTable::CFXCODEC_HorzTable() {} + +CCodec_ProgressiveDecoder::CFXCODEC_HorzTable::~CFXCODEC_HorzTable() {} + +void CCodec_ProgressiveDecoder::CFXCODEC_HorzTable::Calc(int dest_len, + int src_len, + bool bInterpol) { + double scale = (double)dest_len / (double)src_len; + m_ItemSize = sizeof(int) * 4; + int size = dest_len * m_ItemSize + 4; + m_pWeightTables.resize(size, 0); + if (scale > 1) { + int pre_des_col = 0; + for (int src_col = 0; src_col < src_len; src_col++) { + double des_col_f = src_col * scale; + int des_col = FXSYS_round((FX_FLOAT)des_col_f); + PixelWeight* pWeight = GetPixelWeight(des_col); + pWeight->m_SrcStart = pWeight->m_SrcEnd = src_col; + pWeight->m_Weights[0] = 65536; + pWeight->m_Weights[1] = 0; + if (src_col == src_len - 1 && des_col < dest_len - 1) { + for (int des_col_index = pre_des_col + 1; des_col_index < dest_len; + des_col_index++) { + pWeight = GetPixelWeight(des_col_index); + pWeight->m_SrcStart = pWeight->m_SrcEnd = src_col; + pWeight->m_Weights[0] = 65536; + pWeight->m_Weights[1] = 0; + } + return; + } + int des_col_len = des_col - pre_des_col; + for (int des_col_index = pre_des_col + 1; des_col_index < des_col; + des_col_index++) { + pWeight = GetPixelWeight(des_col_index); + pWeight->m_SrcStart = src_col - 1; + pWeight->m_SrcEnd = src_col; + pWeight->m_Weights[0] = + bInterpol ? FXSYS_round((FX_FLOAT)( + ((FX_FLOAT)des_col - (FX_FLOAT)des_col_index) / + (FX_FLOAT)des_col_len * 65536)) + : 65536; + pWeight->m_Weights[1] = 65536 - pWeight->m_Weights[0]; + } + pre_des_col = des_col; + } + return; + } + for (int des_col = 0; des_col < dest_len; des_col++) { + double src_col_f = des_col / scale; + int src_col = FXSYS_round((FX_FLOAT)src_col_f); + PixelWeight* pWeight = GetPixelWeight(des_col); + pWeight->m_SrcStart = pWeight->m_SrcEnd = src_col; + pWeight->m_Weights[0] = 65536; + pWeight->m_Weights[1] = 0; + } +} + +CCodec_ProgressiveDecoder::CFXCODEC_VertTable::CFXCODEC_VertTable() {} + +CCodec_ProgressiveDecoder::CFXCODEC_VertTable::~CFXCODEC_VertTable() {} + +void CCodec_ProgressiveDecoder::CFXCODEC_VertTable::Calc(int dest_len, + int src_len) { + double scale = (double)dest_len / (double)src_len; + m_ItemSize = sizeof(int) * 4; + int size = dest_len * m_ItemSize + 4; + m_pWeightTables.resize(size, 0); + if (scale <= 1) { + for (int des_row = 0; des_row < dest_len; des_row++) { + PixelWeight* pWeight = GetPixelWeight(des_row); + pWeight->m_SrcStart = des_row; + pWeight->m_SrcEnd = des_row; + pWeight->m_Weights[0] = 65536; + pWeight->m_Weights[1] = 0; + } + return; + } + + double step = 0.0; + int src_row = 0; + while (step < (double)dest_len) { + int start_step = (int)step; + step = scale * (++src_row); + int end_step = (int)step; + if (end_step >= dest_len) { + end_step = dest_len; + for (int des_row = start_step; des_row < end_step; des_row++) { + PixelWeight* pWeight = GetPixelWeight(des_row); + pWeight->m_SrcStart = start_step; + pWeight->m_SrcEnd = start_step; + pWeight->m_Weights[0] = 65536; + pWeight->m_Weights[1] = 0; + } + return; + } + int length = end_step - start_step; + { + PixelWeight* pWeight = GetPixelWeight(start_step); + pWeight->m_SrcStart = start_step; + pWeight->m_SrcEnd = start_step; + pWeight->m_Weights[0] = 65536; + pWeight->m_Weights[1] = 0; + } + for (int des_row = start_step + 1; des_row < end_step; des_row++) { + PixelWeight* pWeight = GetPixelWeight(des_row); + pWeight->m_SrcStart = start_step; + pWeight->m_SrcEnd = end_step; + pWeight->m_Weights[0] = FXSYS_round((FX_FLOAT)(end_step - des_row) / + (FX_FLOAT)length * 65536); + pWeight->m_Weights[1] = 65536 - pWeight->m_Weights[0]; + } + } +} + +CCodec_ProgressiveDecoder::CCodec_ProgressiveDecoder( + CCodec_ModuleMgr* pCodecMgr) { + m_pFile = nullptr; + m_pJpegContext = nullptr; + m_pPngContext = nullptr; + m_pGifContext = nullptr; + m_pBmpContext = nullptr; + m_pTiffContext = nullptr; + m_pCodecMgr = nullptr; + m_pSrcBuf = nullptr; + m_pDecodeBuf = nullptr; + m_pDeviceBitmap = nullptr; + m_pSrcPalette = nullptr; + m_pCodecMgr = pCodecMgr; + m_offSet = 0; + m_SrcSize = 0; + m_ScanlineSize = 0; + m_SrcWidth = 0; + m_SrcHeight = 0; + m_SrcComponents = 0; + m_SrcBPC = 0; + m_SrcPassNumber = 0; + m_clipBox = FX_RECT(0, 0, 0, 0); + m_imagType = FXCODEC_IMAGE_UNKNOWN; + m_status = FXCODEC_STATUS_DECODE_FINISH; + m_TransMethod = -1; + m_SrcRow = 0; + m_SrcFormat = FXCodec_Invalid; + m_bInterpol = true; + m_FrameNumber = 0; + m_FrameCur = 0; + m_SrcPaletteNumber = 0; + m_GifPltNumber = 0; + m_GifBgIndex = 0; + m_pGifPalette = nullptr; + m_GifTransIndex = -1; + m_GifFrameRect = FX_RECT(0, 0, 0, 0); + m_BmpIsTopBottom = false; +} + +CCodec_ProgressiveDecoder::~CCodec_ProgressiveDecoder() { + m_pFile = nullptr; + if (m_pJpegContext) + m_pCodecMgr->GetJpegModule()->Finish(m_pJpegContext); + if (m_pBmpContext) + m_pCodecMgr->GetBmpModule()->Finish(m_pBmpContext); + if (m_pGifContext) + m_pCodecMgr->GetGifModule()->Finish(m_pGifContext); + if (m_pPngContext) + m_pCodecMgr->GetPngModule()->Finish(m_pPngContext); + if (m_pTiffContext) + m_pCodecMgr->GetTiffModule()->DestroyDecoder(m_pTiffContext); + FX_Free(m_pSrcBuf); + FX_Free(m_pDecodeBuf); + FX_Free(m_pSrcPalette); +} + +bool CCodec_ProgressiveDecoder::JpegReadMoreData(CCodec_JpegModule* pJpegModule, + FXCODEC_STATUS& err_status) { + uint32_t dwSize = (uint32_t)m_pFile->GetSize(); + if (dwSize <= m_offSet) { + return false; + } + dwSize = dwSize - m_offSet; + uint32_t dwAvail = pJpegModule->GetAvailInput(m_pJpegContext, nullptr); + if (dwAvail == m_SrcSize) { + if (dwSize > FXCODEC_BLOCK_SIZE) { + dwSize = FXCODEC_BLOCK_SIZE; + } + m_SrcSize = (dwSize + dwAvail + FXCODEC_BLOCK_SIZE - 1) / + FXCODEC_BLOCK_SIZE * FXCODEC_BLOCK_SIZE; + m_pSrcBuf = FX_Realloc(uint8_t, m_pSrcBuf, m_SrcSize); + if (!m_pSrcBuf) { + err_status = FXCODEC_STATUS_ERR_MEMORY; + return false; + } + } else { + uint32_t dwConsume = m_SrcSize - dwAvail; + if (dwAvail) { + FXSYS_memmove(m_pSrcBuf, m_pSrcBuf + dwConsume, dwAvail); + } + if (dwSize > dwConsume) { + dwSize = dwConsume; + } + } + if (!m_pFile->ReadBlock(m_pSrcBuf + dwAvail, m_offSet, dwSize)) { + err_status = FXCODEC_STATUS_ERR_READ; + return false; + } + m_offSet += dwSize; + pJpegModule->Input(m_pJpegContext, m_pSrcBuf, dwSize + dwAvail); + return true; +} + +bool CCodec_ProgressiveDecoder::PngReadHeader(int width, + int height, + int bpc, + int pass, + int* color_type, + double* gamma) { + if (!m_pDeviceBitmap) { + m_SrcWidth = width; + m_SrcHeight = height; + m_SrcBPC = bpc; + m_SrcPassNumber = pass; + switch (*color_type) { + case 0: + m_SrcComponents = 1; + break; + case 4: + m_SrcComponents = 2; + break; + case 2: + m_SrcComponents = 3; + break; + case 3: + case 6: + m_SrcComponents = 4; + break; + default: + m_SrcComponents = 0; + break; + } + m_clipBox = FX_RECT(0, 0, width, height); + return false; + } + FXDIB_Format format = m_pDeviceBitmap->GetFormat(); + switch (format) { + case FXDIB_1bppMask: + case FXDIB_1bppRgb: + ASSERT(false); + return false; + case FXDIB_8bppMask: + case FXDIB_8bppRgb: + *color_type = 0; + break; + case FXDIB_Rgb: + *color_type = 2; + break; + case FXDIB_Rgb32: + case FXDIB_Argb: + *color_type = 6; + break; + default: + ASSERT(false); + return false; + } + *gamma = kPngGamma; + return true; +} + +bool CCodec_ProgressiveDecoder::PngAskScanlineBuf(int line, uint8_t*& src_buf) { + CFX_DIBitmap* pDIBitmap = m_pDeviceBitmap; + if (!pDIBitmap) { + ASSERT(false); + return false; + } + if (line >= m_clipBox.top && line < m_clipBox.bottom) { + double scale_y = (double)m_sizeY / (double)m_clipBox.Height(); + int32_t row = (int32_t)((line - m_clipBox.top) * scale_y) + m_startY; + uint8_t* src_scan = (uint8_t*)pDIBitmap->GetScanline(row); + uint8_t* des_scan = m_pDecodeBuf; + src_buf = m_pDecodeBuf; + int32_t src_Bpp = pDIBitmap->GetBPP() >> 3; + int32_t des_Bpp = (m_SrcFormat & 0xff) >> 3; + int32_t src_left = m_startX; + int32_t des_left = m_clipBox.left; + src_scan += src_left * src_Bpp; + des_scan += des_left * des_Bpp; + for (int32_t src_col = 0; src_col < m_sizeX; src_col++) { + PixelWeight* pPixelWeights = m_WeightHorzOO.GetPixelWeight(src_col); + if (pPixelWeights->m_SrcStart != pPixelWeights->m_SrcEnd) { + continue; + } + switch (pDIBitmap->GetFormat()) { + case FXDIB_1bppMask: + case FXDIB_1bppRgb: + ASSERT(false); + return false; + case FXDIB_8bppMask: + case FXDIB_8bppRgb: { + if (pDIBitmap->GetPalette()) { + return false; + } + uint32_t des_g = 0; + des_g += pPixelWeights->m_Weights[0] * src_scan[src_col]; + des_scan[pPixelWeights->m_SrcStart] = (uint8_t)(des_g >> 16); + } break; + case FXDIB_Rgb: + case FXDIB_Rgb32: { + uint32_t des_b = 0, des_g = 0, des_r = 0; + const uint8_t* p = src_scan + src_col * src_Bpp; + des_b += pPixelWeights->m_Weights[0] * (*p++); + des_g += pPixelWeights->m_Weights[0] * (*p++); + des_r += pPixelWeights->m_Weights[0] * (*p); + uint8_t* pDes = &des_scan[pPixelWeights->m_SrcStart * des_Bpp]; + *pDes++ = (uint8_t)((des_b) >> 16); + *pDes++ = (uint8_t)((des_g) >> 16); + *pDes = (uint8_t)((des_r) >> 16); + } break; + case FXDIB_Argb: { + uint32_t des_r = 0, des_g = 0, des_b = 0; + const uint8_t* p = src_scan + src_col * src_Bpp; + des_b += pPixelWeights->m_Weights[0] * (*p++); + des_g += pPixelWeights->m_Weights[0] * (*p++); + des_r += pPixelWeights->m_Weights[0] * (*p++); + uint8_t* pDes = &des_scan[pPixelWeights->m_SrcStart * des_Bpp]; + *pDes++ = (uint8_t)((des_b) >> 16); + *pDes++ = (uint8_t)((des_g) >> 16); + *pDes++ = (uint8_t)((des_r) >> 16); + *pDes = *p; + } break; + default: + return false; + } + } + } + return true; +} + +void CCodec_ProgressiveDecoder::PngOneOneMapResampleHorz( + CFX_DIBitmap* pDeviceBitmap, + int32_t des_line, + uint8_t* src_scan, + FXCodec_Format src_format) { + uint8_t* des_scan = (uint8_t*)pDeviceBitmap->GetScanline(des_line); + int32_t src_Bpp = (m_SrcFormat & 0xff) >> 3; + int32_t des_Bpp = pDeviceBitmap->GetBPP() >> 3; + int32_t src_left = m_clipBox.left; + int32_t des_left = m_startX; + src_scan += src_left * src_Bpp; + des_scan += des_left * des_Bpp; + for (int32_t des_col = 0; des_col < m_sizeX; des_col++) { + PixelWeight* pPixelWeights = m_WeightHorzOO.GetPixelWeight(des_col); + switch (pDeviceBitmap->GetFormat()) { + case FXDIB_1bppMask: + case FXDIB_1bppRgb: + ASSERT(false); + return; + case FXDIB_8bppMask: + case FXDIB_8bppRgb: { + if (pDeviceBitmap->GetPalette()) { + return; + } + uint32_t des_g = 0; + des_g += + pPixelWeights->m_Weights[0] * src_scan[pPixelWeights->m_SrcStart]; + des_g += + pPixelWeights->m_Weights[1] * src_scan[pPixelWeights->m_SrcEnd]; + *des_scan++ = (uint8_t)(des_g >> 16); + } break; + case FXDIB_Rgb: + case FXDIB_Rgb32: { + uint32_t des_b = 0, des_g = 0, des_r = 0; + const uint8_t* p = src_scan; + p = src_scan + pPixelWeights->m_SrcStart * src_Bpp; + des_b += pPixelWeights->m_Weights[0] * (*p++); + des_g += pPixelWeights->m_Weights[0] * (*p++); + des_r += pPixelWeights->m_Weights[0] * (*p); + p = src_scan + pPixelWeights->m_SrcEnd * src_Bpp; + des_b += pPixelWeights->m_Weights[1] * (*p++); + des_g += pPixelWeights->m_Weights[1] * (*p++); + des_r += pPixelWeights->m_Weights[1] * (*p); + *des_scan++ = (uint8_t)((des_b) >> 16); + *des_scan++ = (uint8_t)((des_g) >> 16); + *des_scan++ = (uint8_t)((des_r) >> 16); + des_scan += des_Bpp - 3; + } break; + case FXDIB_Argb: { + uint32_t des_a = 0, des_b = 0, des_g = 0, des_r = 0; + const uint8_t* p = src_scan; + p = src_scan + pPixelWeights->m_SrcStart * src_Bpp; + des_b += pPixelWeights->m_Weights[0] * (*p++); + des_g += pPixelWeights->m_Weights[0] * (*p++); + des_r += pPixelWeights->m_Weights[0] * (*p++); + des_a += pPixelWeights->m_Weights[0] * (*p); + p = src_scan + pPixelWeights->m_SrcEnd * src_Bpp; + des_b += pPixelWeights->m_Weights[1] * (*p++); + des_g += pPixelWeights->m_Weights[1] * (*p++); + des_r += pPixelWeights->m_Weights[1] * (*p++); + des_a += pPixelWeights->m_Weights[1] * (*p); + *des_scan++ = (uint8_t)((des_b) >> 16); + *des_scan++ = (uint8_t)((des_g) >> 16); + *des_scan++ = (uint8_t)((des_r) >> 16); + *des_scan++ = (uint8_t)((des_a) >> 16); + } break; + default: + return; + } + } +} + +void CCodec_ProgressiveDecoder::PngFillScanlineBufCompleted(int pass, + int line) { + CFX_DIBitmap* pDIBitmap = m_pDeviceBitmap; + ASSERT(pDIBitmap); + int src_top = m_clipBox.top; + int src_bottom = m_clipBox.bottom; + int des_top = m_startY; + int src_hei = m_clipBox.Height(); + int des_hei = m_sizeY; + if (line >= src_top && line < src_bottom) { + double scale_y = (double)des_hei / (double)src_hei; + int src_row = line - src_top; + int des_row = (int)(src_row * scale_y) + des_top; + if (des_row >= des_top + des_hei) { + return; + } + PngOneOneMapResampleHorz(pDIBitmap, des_row, m_pDecodeBuf, m_SrcFormat); + if (m_SrcPassNumber == 1 && scale_y > 1.0) { + ResampleVert(pDIBitmap, scale_y, des_row); + return; + } + if (pass == 6 && scale_y > 1.0) { + ResampleVert(pDIBitmap, scale_y, des_row); + } + } +} + +bool CCodec_ProgressiveDecoder::GifReadMoreData(ICodec_GifModule* pGifModule, + FXCODEC_STATUS& err_status) { + uint32_t dwSize = (uint32_t)m_pFile->GetSize(); + if (dwSize <= m_offSet) { + return false; + } + dwSize = dwSize - m_offSet; + uint32_t dwAvail = pGifModule->GetAvailInput(m_pGifContext, nullptr); + if (dwAvail == m_SrcSize) { + if (dwSize > FXCODEC_BLOCK_SIZE) { + dwSize = FXCODEC_BLOCK_SIZE; + } + m_SrcSize = (dwSize + dwAvail + FXCODEC_BLOCK_SIZE - 1) / + FXCODEC_BLOCK_SIZE * FXCODEC_BLOCK_SIZE; + m_pSrcBuf = FX_Realloc(uint8_t, m_pSrcBuf, m_SrcSize); + if (!m_pSrcBuf) { + err_status = FXCODEC_STATUS_ERR_MEMORY; + return false; + } + } else { + uint32_t dwConsume = m_SrcSize - dwAvail; + if (dwAvail) { + FXSYS_memmove(m_pSrcBuf, m_pSrcBuf + dwConsume, dwAvail); + } + if (dwSize > dwConsume) { + dwSize = dwConsume; + } + } + if (!m_pFile->ReadBlock(m_pSrcBuf + dwAvail, m_offSet, dwSize)) { + err_status = FXCODEC_STATUS_ERR_READ; + return false; + } + m_offSet += dwSize; + pGifModule->Input(m_pGifContext, m_pSrcBuf, dwSize + dwAvail); + return true; +} + +void CCodec_ProgressiveDecoder::GifRecordCurrentPosition(uint32_t& cur_pos) { + uint32_t remain_size = + m_pCodecMgr->GetGifModule()->GetAvailInput(m_pGifContext); + cur_pos = m_offSet - remain_size; +} + +uint8_t* CCodec_ProgressiveDecoder::GifAskLocalPaletteBuf(int32_t frame_num, + int32_t pal_size) { + return FX_Alloc(uint8_t, pal_size); +} + +bool CCodec_ProgressiveDecoder::GifInputRecordPositionBuf( + uint32_t rcd_pos, + const FX_RECT& img_rc, + int32_t pal_num, + void* pal_ptr, + int32_t delay_time, + bool user_input, + int32_t trans_index, + int32_t disposal_method, + bool interlace) { + m_offSet = rcd_pos; + FXCODEC_STATUS error_status = FXCODEC_STATUS_ERROR; + if (!GifReadMoreData(m_pCodecMgr->GetGifModule(), error_status)) { + return false; + } + uint8_t* pPalette = nullptr; + if (pal_num != 0 && pal_ptr) { + pPalette = (uint8_t*)pal_ptr; + } else { + pal_num = m_GifPltNumber; + pPalette = m_pGifPalette; + } + if (!m_pSrcPalette) + m_pSrcPalette = FX_Alloc(FX_ARGB, pal_num); + else if (pal_num > m_SrcPaletteNumber) + m_pSrcPalette = FX_Realloc(FX_ARGB, m_pSrcPalette, pal_num); + if (!m_pSrcPalette) + return false; + + m_SrcPaletteNumber = pal_num; + for (int i = 0; i < pal_num; i++) { + uint32_t j = i * 3; + m_pSrcPalette[i] = + ArgbEncode(0xff, pPalette[j], pPalette[j + 1], pPalette[j + 2]); + } + m_GifTransIndex = trans_index; + m_GifFrameRect = img_rc; + m_SrcPassNumber = interlace ? 4 : 1; + int32_t pal_index = m_GifBgIndex; + CFX_DIBitmap* pDevice = m_pDeviceBitmap; + if (trans_index >= pal_num) + trans_index = -1; + if (trans_index != -1) { + m_pSrcPalette[trans_index] &= 0x00ffffff; + if (pDevice->HasAlpha()) + pal_index = trans_index; + } + if (pal_index >= pal_num) + return false; + + int startX = m_startX; + int startY = m_startY; + int sizeX = m_sizeX; + int sizeY = m_sizeY; + int Bpp = pDevice->GetBPP() / 8; + FX_ARGB argb = m_pSrcPalette[pal_index]; + for (int row = 0; row < sizeY; row++) { + uint8_t* pScanline = + (uint8_t*)pDevice->GetScanline(row + startY) + startX * Bpp; + switch (m_TransMethod) { + case 3: { + uint8_t gray = + FXRGB2GRAY(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb)); + FXSYS_memset(pScanline, gray, sizeX); + break; + } + case 8: { + for (int col = 0; col < sizeX; col++) { + *pScanline++ = FXARGB_B(argb); + *pScanline++ = FXARGB_G(argb); + *pScanline++ = FXARGB_R(argb); + pScanline += Bpp - 3; + } + break; + } + case 12: { + for (int col = 0; col < sizeX; col++) { + FXARGB_SETDIB(pScanline, argb); + pScanline += 4; + } + break; + } + } + } + return true; +} + +void CCodec_ProgressiveDecoder::GifReadScanline(int32_t row_num, + uint8_t* row_buf) { + CFX_DIBitmap* pDIBitmap = m_pDeviceBitmap; + ASSERT(pDIBitmap); + int32_t img_width = m_GifFrameRect.Width(); + if (!pDIBitmap->HasAlpha()) { + uint8_t* byte_ptr = row_buf; + for (int i = 0; i < img_width; i++) { + if (*byte_ptr == m_GifTransIndex) { + *byte_ptr = m_GifBgIndex; + } + byte_ptr++; + } + } + int32_t pal_index = m_GifBgIndex; + if (m_GifTransIndex != -1 && m_pDeviceBitmap->HasAlpha()) { + pal_index = m_GifTransIndex; + } + FXSYS_memset(m_pDecodeBuf, pal_index, m_SrcWidth); + bool bLastPass = (row_num % 2) == 1; + int32_t line = row_num + m_GifFrameRect.top; + int32_t left = m_GifFrameRect.left; + FXSYS_memcpy(m_pDecodeBuf + left, row_buf, img_width); + int src_top = m_clipBox.top; + int src_bottom = m_clipBox.bottom; + int des_top = m_startY; + int src_hei = m_clipBox.Height(); + int des_hei = m_sizeY; + if (line < src_top || line >= src_bottom) + return; + + double scale_y = (double)des_hei / (double)src_hei; + int src_row = line - src_top; + int des_row = (int)(src_row * scale_y) + des_top; + if (des_row >= des_top + des_hei) + return; + + ReSampleScanline(pDIBitmap, des_row, m_pDecodeBuf, m_SrcFormat); + if (scale_y > 1.0 && (!m_bInterpol || m_SrcPassNumber == 1)) { + ResampleVert(pDIBitmap, scale_y, des_row); + return; + } + if (scale_y <= 1.0) + return; + + int des_bottom = des_top + m_sizeY; + int des_Bpp = pDIBitmap->GetBPP() >> 3; + uint32_t des_ScanOffet = m_startX * des_Bpp; + if (des_row + (int)scale_y >= des_bottom - 1) { + uint8_t* scan_src = + (uint8_t*)pDIBitmap->GetScanline(des_row) + des_ScanOffet; + int cur_row = des_row; + while (++cur_row < des_bottom) { + uint8_t* scan_des = + (uint8_t*)pDIBitmap->GetScanline(cur_row) + des_ScanOffet; + uint32_t size = m_sizeX * des_Bpp; + FXSYS_memmove(scan_des, scan_src, size); + } + } + if (bLastPass) + GifDoubleLineResampleVert(pDIBitmap, scale_y, des_row); +} + +void CCodec_ProgressiveDecoder::GifDoubleLineResampleVert( + CFX_DIBitmap* pDeviceBitmap, + double scale_y, + int des_row) { + int des_Bpp = pDeviceBitmap->GetBPP() >> 3; + uint32_t des_ScanOffet = m_startX * des_Bpp; + int des_top = m_startY; + pdfium::base::CheckedNumeric scale_y2 = scale_y; + scale_y2 *= 2; + pdfium::base::CheckedNumeric check_des_row_1 = des_row; + check_des_row_1 -= scale_y2.ValueOrDie(); + int des_row_1 = check_des_row_1.ValueOrDie(); + des_row_1 = std::max(des_row_1, des_top); + for (; des_row_1 < des_row; des_row_1++) { + uint8_t* scan_des = + (uint8_t*)pDeviceBitmap->GetScanline(des_row_1) + des_ScanOffet; + PixelWeight* pWeight = m_WeightVert.GetPixelWeight(des_row_1 - des_top); + const uint8_t* scan_src1 = + pDeviceBitmap->GetScanline(pWeight->m_SrcStart + des_top) + + des_ScanOffet; + const uint8_t* scan_src2 = + pDeviceBitmap->GetScanline(pWeight->m_SrcEnd + des_top) + des_ScanOffet; + for (int des_col = 0; des_col < m_sizeX; des_col++) { + switch (pDeviceBitmap->GetFormat()) { + case FXDIB_Invalid: + case FXDIB_1bppMask: + case FXDIB_1bppRgb: + return; + case FXDIB_8bppMask: + case FXDIB_8bppRgb: { + if (pDeviceBitmap->GetPalette()) { + return; + } + int des_g = 0; + des_g += pWeight->m_Weights[0] * (*scan_src1++); + des_g += pWeight->m_Weights[1] * (*scan_src2++); + *scan_des++ = (uint8_t)(des_g >> 16); + } break; + case FXDIB_Rgb: + case FXDIB_Rgb32: { + uint32_t des_b = 0, des_g = 0, des_r = 0; + des_b += pWeight->m_Weights[0] * (*scan_src1++); + des_g += pWeight->m_Weights[0] * (*scan_src1++); + des_r += pWeight->m_Weights[0] * (*scan_src1++); + scan_src1 += des_Bpp - 3; + des_b += pWeight->m_Weights[1] * (*scan_src2++); + des_g += pWeight->m_Weights[1] * (*scan_src2++); + des_r += pWeight->m_Weights[1] * (*scan_src2++); + scan_src2 += des_Bpp - 3; + *scan_des++ = (uint8_t)((des_b) >> 16); + *scan_des++ = (uint8_t)((des_g) >> 16); + *scan_des++ = (uint8_t)((des_r) >> 16); + scan_des += des_Bpp - 3; + } break; + case FXDIB_Argb: { + uint32_t des_a = 0, des_b = 0, des_g = 0, des_r = 0; + des_b += pWeight->m_Weights[0] * (*scan_src1++); + des_g += pWeight->m_Weights[0] * (*scan_src1++); + des_r += pWeight->m_Weights[0] * (*scan_src1++); + des_a += pWeight->m_Weights[0] * (*scan_src1++); + des_b += pWeight->m_Weights[1] * (*scan_src2++); + des_g += pWeight->m_Weights[1] * (*scan_src2++); + des_r += pWeight->m_Weights[1] * (*scan_src2++); + des_a += pWeight->m_Weights[1] * (*scan_src2++); + *scan_des++ = (uint8_t)((des_b) >> 16); + *scan_des++ = (uint8_t)((des_g) >> 16); + *scan_des++ = (uint8_t)((des_r) >> 16); + *scan_des++ = (uint8_t)((des_a) >> 16); + } break; + default: + return; + } + } + } + int des_bottom = des_top + m_sizeY - 1; + if (des_row + (int)(2 * scale_y) >= des_bottom && + des_row + (int)scale_y < des_bottom) { + GifDoubleLineResampleVert(pDeviceBitmap, scale_y, des_row + (int)scale_y); + } +} + +bool CCodec_ProgressiveDecoder::BmpReadMoreData(ICodec_BmpModule* pBmpModule, + FXCODEC_STATUS& err_status) { + uint32_t dwSize = (uint32_t)m_pFile->GetSize(); + if (dwSize <= m_offSet) + return false; + + dwSize = dwSize - m_offSet; + uint32_t dwAvail = pBmpModule->GetAvailInput(m_pBmpContext, nullptr); + if (dwAvail == m_SrcSize) { + if (dwSize > FXCODEC_BLOCK_SIZE) { + dwSize = FXCODEC_BLOCK_SIZE; + } + m_SrcSize = (dwSize + dwAvail + FXCODEC_BLOCK_SIZE - 1) / + FXCODEC_BLOCK_SIZE * FXCODEC_BLOCK_SIZE; + m_pSrcBuf = FX_Realloc(uint8_t, m_pSrcBuf, m_SrcSize); + if (!m_pSrcBuf) { + err_status = FXCODEC_STATUS_ERR_MEMORY; + return false; + } + } else { + uint32_t dwConsume = m_SrcSize - dwAvail; + if (dwAvail) { + FXSYS_memmove(m_pSrcBuf, m_pSrcBuf + dwConsume, dwAvail); + } + if (dwSize > dwConsume) { + dwSize = dwConsume; + } + } + if (!m_pFile->ReadBlock(m_pSrcBuf + dwAvail, m_offSet, dwSize)) { + err_status = FXCODEC_STATUS_ERR_READ; + return false; + } + m_offSet += dwSize; + pBmpModule->Input(m_pBmpContext, m_pSrcBuf, dwSize + dwAvail); + return true; +} + +bool CCodec_ProgressiveDecoder::BmpInputImagePositionBuf(uint32_t rcd_pos) { + m_offSet = rcd_pos; + FXCODEC_STATUS error_status = FXCODEC_STATUS_ERROR; + return BmpReadMoreData(m_pCodecMgr->GetBmpModule(), error_status); +} + +void CCodec_ProgressiveDecoder::BmpReadScanline(int32_t row_num, + uint8_t* row_buf) { + CFX_DIBitmap* pDIBitmap = m_pDeviceBitmap; + ASSERT(pDIBitmap); + FXSYS_memcpy(m_pDecodeBuf, row_buf, m_ScanlineSize); + int src_top = m_clipBox.top; + int src_bottom = m_clipBox.bottom; + int des_top = m_startY; + int src_hei = m_clipBox.Height(); + int des_hei = m_sizeY; + if (row_num < src_top || row_num >= src_bottom) + return; + + double scale_y = (double)des_hei / (double)src_hei; + int src_row = row_num - src_top; + int des_row = (int)(src_row * scale_y) + des_top; + if (des_row >= des_top + des_hei) + return; + + ReSampleScanline(pDIBitmap, des_row, m_pDecodeBuf, m_SrcFormat); + if (scale_y <= 1.0) + return; + + if (m_BmpIsTopBottom || !m_bInterpol) { + ResampleVert(pDIBitmap, scale_y, des_row); + return; + } + ResampleVertBT(pDIBitmap, scale_y, des_row); +} + +void CCodec_ProgressiveDecoder::ResampleVertBT(CFX_DIBitmap* pDeviceBitmap, + double scale_y, + int des_row) { + int des_Bpp = pDeviceBitmap->GetBPP() >> 3; + uint32_t des_ScanOffet = m_startX * des_Bpp; + int des_top = m_startY; + int des_bottom = m_startY + m_sizeY; + pdfium::base::CheckedNumeric check_des_row_1 = des_row; + check_des_row_1 += pdfium::base::checked_cast(scale_y); + int des_row_1 = check_des_row_1.ValueOrDie(); + if (des_row_1 >= des_bottom - 1) { + uint8_t* scan_src = + (uint8_t*)pDeviceBitmap->GetScanline(des_row) + des_ScanOffet; + while (++des_row < des_bottom) { + uint8_t* scan_des = + (uint8_t*)pDeviceBitmap->GetScanline(des_row) + des_ScanOffet; + uint32_t size = m_sizeX * des_Bpp; + FXSYS_memmove(scan_des, scan_src, size); + } + return; + } + for (; des_row_1 > des_row; des_row_1--) { + uint8_t* scan_des = + (uint8_t*)pDeviceBitmap->GetScanline(des_row_1) + des_ScanOffet; + PixelWeight* pWeight = m_WeightVert.GetPixelWeight(des_row_1 - des_top); + const uint8_t* scan_src1 = + pDeviceBitmap->GetScanline(pWeight->m_SrcStart + des_top) + + des_ScanOffet; + const uint8_t* scan_src2 = + pDeviceBitmap->GetScanline(pWeight->m_SrcEnd + des_top) + des_ScanOffet; + for (int des_col = 0; des_col < m_sizeX; des_col++) { + switch (pDeviceBitmap->GetFormat()) { + case FXDIB_Invalid: + case FXDIB_1bppMask: + case FXDIB_1bppRgb: + return; + case FXDIB_8bppMask: + case FXDIB_8bppRgb: { + if (pDeviceBitmap->GetPalette()) { + return; + } + int des_g = 0; + des_g += pWeight->m_Weights[0] * (*scan_src1++); + des_g += pWeight->m_Weights[1] * (*scan_src2++); + *scan_des++ = (uint8_t)(des_g >> 16); + } break; + case FXDIB_Rgb: + case FXDIB_Rgb32: { + uint32_t des_b = 0, des_g = 0, des_r = 0; + des_b += pWeight->m_Weights[0] * (*scan_src1++); + des_g += pWeight->m_Weights[0] * (*scan_src1++); + des_r += pWeight->m_Weights[0] * (*scan_src1++); + scan_src1 += des_Bpp - 3; + des_b += pWeight->m_Weights[1] * (*scan_src2++); + des_g += pWeight->m_Weights[1] * (*scan_src2++); + des_r += pWeight->m_Weights[1] * (*scan_src2++); + scan_src2 += des_Bpp - 3; + *scan_des++ = (uint8_t)((des_b) >> 16); + *scan_des++ = (uint8_t)((des_g) >> 16); + *scan_des++ = (uint8_t)((des_r) >> 16); + scan_des += des_Bpp - 3; + } break; + case FXDIB_Argb: { + uint32_t des_a = 0, des_b = 0, des_g = 0, des_r = 0; + des_b += pWeight->m_Weights[0] * (*scan_src1++); + des_g += pWeight->m_Weights[0] * (*scan_src1++); + des_r += pWeight->m_Weights[0] * (*scan_src1++); + des_a += pWeight->m_Weights[0] * (*scan_src1++); + des_b += pWeight->m_Weights[1] * (*scan_src2++); + des_g += pWeight->m_Weights[1] * (*scan_src2++); + des_r += pWeight->m_Weights[1] * (*scan_src2++); + des_a += pWeight->m_Weights[1] * (*scan_src2++); + *scan_des++ = (uint8_t)((des_b) >> 16); + *scan_des++ = (uint8_t)((des_g) >> 16); + *scan_des++ = (uint8_t)((des_r) >> 16); + *scan_des++ = (uint8_t)((des_a) >> 16); + } break; + default: + return; + } + } + } +} + +bool CCodec_ProgressiveDecoder::DetectImageType(FXCODEC_IMAGE_TYPE imageType, + CFX_DIBAttribute* pAttribute) { + m_offSet = 0; + uint32_t size = (uint32_t)m_pFile->GetSize(); + if (size > FXCODEC_BLOCK_SIZE) { + size = FXCODEC_BLOCK_SIZE; + } + FX_Free(m_pSrcBuf); + m_pSrcBuf = FX_Alloc(uint8_t, size); + FXSYS_memset(m_pSrcBuf, 0, size); + m_SrcSize = size; + switch (imageType) { + case FXCODEC_IMAGE_BMP: { + ICodec_BmpModule* pBmpModule = m_pCodecMgr->GetBmpModule(); + if (!pBmpModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return false; + } + pBmpModule->SetDelegate(this); + m_pBmpContext = pBmpModule->Start(); + if (!m_pBmpContext) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return false; + } + bool bResult = m_pFile->ReadBlock(m_pSrcBuf, 0, size); + if (!bResult) { + m_status = FXCODEC_STATUS_ERR_READ; + return false; + } + m_offSet += size; + pBmpModule->Input(m_pBmpContext, m_pSrcBuf, size); + uint32_t* pPalette = nullptr; + int32_t readResult = pBmpModule->ReadHeader( + m_pBmpContext, &m_SrcWidth, &m_SrcHeight, &m_BmpIsTopBottom, + &m_SrcComponents, &m_SrcPaletteNumber, &pPalette, pAttribute); + while (readResult == 2) { + FXCODEC_STATUS error_status = FXCODEC_STATUS_ERR_FORMAT; + if (!BmpReadMoreData(pBmpModule, error_status)) { + m_status = error_status; + return false; + } + readResult = pBmpModule->ReadHeader( + m_pBmpContext, &m_SrcWidth, &m_SrcHeight, &m_BmpIsTopBottom, + &m_SrcComponents, &m_SrcPaletteNumber, &pPalette, pAttribute); + } + if (readResult == 1) { + m_SrcBPC = 8; + m_clipBox = FX_RECT(0, 0, m_SrcWidth, m_SrcHeight); + FX_Free(m_pSrcPalette); + if (m_SrcPaletteNumber) { + m_pSrcPalette = FX_Alloc(FX_ARGB, m_SrcPaletteNumber); + FXSYS_memcpy(m_pSrcPalette, pPalette, + m_SrcPaletteNumber * sizeof(uint32_t)); + } else { + m_pSrcPalette = nullptr; + } + return true; + } + if (m_pBmpContext) { + pBmpModule->Finish(m_pBmpContext); + m_pBmpContext = nullptr; + } + m_status = FXCODEC_STATUS_ERR_FORMAT; + return false; + } + case FXCODEC_IMAGE_JPG: { + CCodec_JpegModule* pJpegModule = m_pCodecMgr->GetJpegModule(); + if (!pJpegModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return false; + } + m_pJpegContext = pJpegModule->Start(); + if (!m_pJpegContext) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return false; + } + bool bResult = m_pFile->ReadBlock(m_pSrcBuf, 0, size); + if (!bResult) { + m_status = FXCODEC_STATUS_ERR_READ; + return false; + } + m_offSet += size; + pJpegModule->Input(m_pJpegContext, m_pSrcBuf, size); + int32_t readResult = + pJpegModule->ReadHeader(m_pJpegContext, &m_SrcWidth, &m_SrcHeight, + &m_SrcComponents, pAttribute); + while (readResult == 2) { + FXCODEC_STATUS error_status = FXCODEC_STATUS_ERR_FORMAT; + if (!JpegReadMoreData(pJpegModule, error_status)) { + m_status = error_status; + return false; + } + readResult = + pJpegModule->ReadHeader(m_pJpegContext, &m_SrcWidth, &m_SrcHeight, + &m_SrcComponents, pAttribute); + } + if (!readResult) { + m_SrcBPC = 8; + m_clipBox = FX_RECT(0, 0, m_SrcWidth, m_SrcHeight); + return true; + } + if (m_pJpegContext) { + pJpegModule->Finish(m_pJpegContext); + m_pJpegContext = nullptr; + } + m_status = FXCODEC_STATUS_ERR_FORMAT; + return false; + } + case FXCODEC_IMAGE_PNG: { + ICodec_PngModule* pPngModule = m_pCodecMgr->GetPngModule(); + if (!pPngModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return false; + } + pPngModule->SetDelegate(this); + m_pPngContext = pPngModule->Start(); + if (!m_pPngContext) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return false; + } + bool bResult = m_pFile->ReadBlock(m_pSrcBuf, 0, size); + if (!bResult) { + m_status = FXCODEC_STATUS_ERR_READ; + return false; + } + m_offSet += size; + bResult = pPngModule->Input(m_pPngContext, m_pSrcBuf, size, pAttribute); + while (bResult) { + uint32_t remain_size = (uint32_t)m_pFile->GetSize() - m_offSet; + uint32_t input_size = + remain_size > FXCODEC_BLOCK_SIZE ? FXCODEC_BLOCK_SIZE : remain_size; + if (input_size == 0) { + if (m_pPngContext) { + pPngModule->Finish(m_pPngContext); + } + m_pPngContext = nullptr; + m_status = FXCODEC_STATUS_ERR_FORMAT; + return false; + } + if (m_pSrcBuf && input_size > m_SrcSize) { + FX_Free(m_pSrcBuf); + m_pSrcBuf = FX_Alloc(uint8_t, input_size); + FXSYS_memset(m_pSrcBuf, 0, input_size); + m_SrcSize = input_size; + } + bResult = m_pFile->ReadBlock(m_pSrcBuf, m_offSet, input_size); + if (!bResult) { + m_status = FXCODEC_STATUS_ERR_READ; + return false; + } + m_offSet += input_size; + bResult = + pPngModule->Input(m_pPngContext, m_pSrcBuf, input_size, pAttribute); + } + ASSERT(!bResult); + if (m_pPngContext) { + pPngModule->Finish(m_pPngContext); + m_pPngContext = nullptr; + } + if (m_SrcPassNumber == 0) { + m_status = FXCODEC_STATUS_ERR_FORMAT; + return false; + } + return true; + } + case FXCODEC_IMAGE_GIF: { + ICodec_GifModule* pGifModule = m_pCodecMgr->GetGifModule(); + if (!pGifModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return false; + } + pGifModule->SetDelegate(this); + m_pGifContext = pGifModule->Start(); + if (!m_pGifContext) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return false; + } + bool bResult = m_pFile->ReadBlock(m_pSrcBuf, 0, size); + if (!bResult) { + m_status = FXCODEC_STATUS_ERR_READ; + return false; + } + m_offSet += size; + pGifModule->Input(m_pGifContext, m_pSrcBuf, size); + m_SrcComponents = 1; + int32_t readResult = pGifModule->ReadHeader( + m_pGifContext, &m_SrcWidth, &m_SrcHeight, &m_GifPltNumber, + (void**)&m_pGifPalette, &m_GifBgIndex, nullptr); + while (readResult == 2) { + FXCODEC_STATUS error_status = FXCODEC_STATUS_ERR_FORMAT; + if (!GifReadMoreData(pGifModule, error_status)) { + m_status = error_status; + return false; + } + readResult = pGifModule->ReadHeader( + m_pGifContext, &m_SrcWidth, &m_SrcHeight, &m_GifPltNumber, + (void**)&m_pGifPalette, &m_GifBgIndex, nullptr); + } + if (readResult == 1) { + m_SrcBPC = 8; + m_clipBox = FX_RECT(0, 0, m_SrcWidth, m_SrcHeight); + return true; + } + if (m_pGifContext) { + pGifModule->Finish(m_pGifContext); + m_pGifContext = nullptr; + } + m_status = FXCODEC_STATUS_ERR_FORMAT; + return false; + } + case FXCODEC_IMAGE_TIF: { + ICodec_TiffModule* pTiffModule = m_pCodecMgr->GetTiffModule(); + if (!pTiffModule) { + m_status = FXCODEC_STATUS_ERR_FORMAT; + return false; + } + m_pTiffContext = pTiffModule->CreateDecoder(m_pFile); + if (!m_pTiffContext) { + m_status = FXCODEC_STATUS_ERR_FORMAT; + return false; + } + int32_t dummy_bpc; + bool ret = pTiffModule->LoadFrameInfo(m_pTiffContext, 0, &m_SrcWidth, + &m_SrcHeight, &m_SrcComponents, + &dummy_bpc, pAttribute); + m_SrcComponents = 4; + m_clipBox = FX_RECT(0, 0, m_SrcWidth, m_SrcHeight); + if (!ret) { + pTiffModule->DestroyDecoder(m_pTiffContext); + m_pTiffContext = nullptr; + m_status = FXCODEC_STATUS_ERR_FORMAT; + return false; + } + return true; + } + default: + m_status = FXCODEC_STATUS_ERR_FORMAT; + return false; + } +} + +FXCODEC_STATUS CCodec_ProgressiveDecoder::LoadImageInfo( + const CFX_RetainPtr& pFile, + FXCODEC_IMAGE_TYPE imageType, + CFX_DIBAttribute* pAttribute, + bool bSkipImageTypeCheck) { + switch (m_status) { + case FXCODEC_STATUS_FRAME_READY: + case FXCODEC_STATUS_FRAME_TOBECONTINUE: + case FXCODEC_STATUS_DECODE_READY: + case FXCODEC_STATUS_DECODE_TOBECONTINUE: + return FXCODEC_STATUS_ERROR; + default: + break; + } + if (!pFile) { + m_status = FXCODEC_STATUS_ERR_PARAMS; + m_pFile = nullptr; + return m_status; + } + m_pFile = pFile; + m_offSet = 0; + m_SrcWidth = m_SrcHeight = 0; + m_SrcComponents = m_SrcBPC = 0; + m_clipBox = FX_RECT(0, 0, 0, 0); + m_startX = m_startY = 0; + m_sizeX = m_sizeY = 0; + m_SrcPassNumber = 0; + if (imageType != FXCODEC_IMAGE_UNKNOWN && + DetectImageType(imageType, pAttribute)) { + m_imagType = imageType; + m_status = FXCODEC_STATUS_FRAME_READY; + return m_status; + } + // If we got here then the image data does not match the requested decoder. + // If we're skipping the type check then bail out at this point and return + // the failed status. + if (bSkipImageTypeCheck) + return m_status; + + for (int type = FXCODEC_IMAGE_BMP; type < FXCODEC_IMAGE_MAX; type++) { + if (DetectImageType((FXCODEC_IMAGE_TYPE)type, pAttribute)) { + m_imagType = (FXCODEC_IMAGE_TYPE)type; + m_status = FXCODEC_STATUS_FRAME_READY; + return m_status; + } + } + m_status = FXCODEC_STATUS_ERR_FORMAT; + m_pFile = nullptr; + return m_status; +} + +void CCodec_ProgressiveDecoder::SetClipBox(FX_RECT* clip) { + if (m_status != FXCODEC_STATUS_FRAME_READY) + return; + + if (clip->IsEmpty()) { + m_clipBox = FX_RECT(0, 0, 0, 0); + return; + } + clip->left = std::max(clip->left, 0); + clip->right = std::min(clip->right, m_SrcWidth); + clip->top = std::max(clip->top, 0); + clip->bottom = std::min(clip->bottom, m_SrcHeight); + if (clip->IsEmpty()) { + m_clipBox = FX_RECT(0, 0, 0, 0); + return; + } + m_clipBox = *clip; +} + +void CCodec_ProgressiveDecoder::GetDownScale(int& down_scale) { + down_scale = 1; + int ratio_w = m_clipBox.Width() / m_sizeX; + int ratio_h = m_clipBox.Height() / m_sizeY; + int ratio = (ratio_w > ratio_h) ? ratio_h : ratio_w; + if (ratio >= 8) { + down_scale = 8; + } else if (ratio >= 4) { + down_scale = 4; + } else if (ratio >= 2) { + down_scale = 2; + } + m_clipBox.left /= down_scale; + m_clipBox.right /= down_scale; + m_clipBox.top /= down_scale; + m_clipBox.bottom /= down_scale; + if (m_clipBox.right == m_clipBox.left) { + m_clipBox.right = m_clipBox.left + 1; + } + if (m_clipBox.bottom == m_clipBox.top) { + m_clipBox.bottom = m_clipBox.top + 1; + } +} + +void CCodec_ProgressiveDecoder::GetTransMethod(FXDIB_Format des_format, + FXCodec_Format src_format) { + switch (des_format) { + case FXDIB_1bppMask: + case FXDIB_1bppRgb: { + switch (src_format) { + case FXCodec_1bppGray: + m_TransMethod = 0; + break; + default: + m_TransMethod = -1; + } + } break; + case FXDIB_8bppMask: + case FXDIB_8bppRgb: { + switch (src_format) { + case FXCodec_1bppGray: + m_TransMethod = 1; + break; + case FXCodec_8bppGray: + m_TransMethod = 2; + break; + case FXCodec_1bppRgb: + case FXCodec_8bppRgb: + m_TransMethod = 3; + break; + case FXCodec_Rgb: + case FXCodec_Rgb32: + case FXCodec_Argb: + m_TransMethod = 4; + break; + case FXCodec_Cmyk: + m_TransMethod = 5; + break; + default: + m_TransMethod = -1; + } + } break; + case FXDIB_Rgb: { + switch (src_format) { + case FXCodec_1bppGray: + m_TransMethod = 6; + break; + case FXCodec_8bppGray: + m_TransMethod = 7; + break; + case FXCodec_1bppRgb: + case FXCodec_8bppRgb: + m_TransMethod = 8; + break; + case FXCodec_Rgb: + case FXCodec_Rgb32: + case FXCodec_Argb: + m_TransMethod = 9; + break; + case FXCodec_Cmyk: + m_TransMethod = 10; + break; + default: + m_TransMethod = -1; + } + } break; + case FXDIB_Rgb32: + case FXDIB_Argb: { + switch (src_format) { + case FXCodec_1bppGray: + m_TransMethod = 6; + break; + case FXCodec_8bppGray: + m_TransMethod = 7; + break; + case FXCodec_1bppRgb: + case FXCodec_8bppRgb: + if (des_format == FXDIB_Argb) { + m_TransMethod = 12; + } else { + m_TransMethod = 8; + } + break; + case FXCodec_Rgb: + case FXCodec_Rgb32: + m_TransMethod = 9; + break; + case FXCodec_Cmyk: + m_TransMethod = 10; + break; + case FXCodec_Argb: + m_TransMethod = 11; + break; + default: + m_TransMethod = -1; + } + } break; + default: + m_TransMethod = -1; + } +} + +void CCodec_ProgressiveDecoder::ReSampleScanline(CFX_DIBitmap* pDeviceBitmap, + int des_line, + uint8_t* src_scan, + FXCodec_Format src_format) { + int src_left = m_clipBox.left; + int des_left = m_startX; + uint8_t* des_scan = + pDeviceBitmap->GetBuffer() + des_line * pDeviceBitmap->GetPitch(); + int src_bpp = src_format & 0xff; + int des_bpp = pDeviceBitmap->GetBPP(); + int src_Bpp = src_bpp >> 3; + int des_Bpp = des_bpp >> 3; + src_scan += src_left * src_Bpp; + des_scan += des_left * des_Bpp; + for (int des_col = 0; des_col < m_sizeX; des_col++) { + PixelWeight* pPixelWeights = m_WeightHorz.GetPixelWeight(des_col); + switch (m_TransMethod) { + case -1: + return; + case 0: + return; + case 1: + return; + case 2: { + uint32_t des_g = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int pixel_weight = + pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart]; + des_g += pixel_weight * src_scan[j]; + } + *des_scan++ = (uint8_t)(des_g >> 16); + } break; + case 3: { + int des_r = 0, des_g = 0, des_b = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int pixel_weight = + pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart]; + unsigned long argb = m_pSrcPalette[src_scan[j]]; + des_r += pixel_weight * (uint8_t)(argb >> 16); + des_g += pixel_weight * (uint8_t)(argb >> 8); + des_b += pixel_weight * (uint8_t)argb; + } + *des_scan++ = + (uint8_t)FXRGB2GRAY((des_r >> 16), (des_g >> 16), (des_b >> 16)); + } break; + case 4: { + uint32_t des_b = 0, des_g = 0, des_r = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int pixel_weight = + pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart]; + const uint8_t* src_pixel = src_scan + j * src_Bpp; + des_b += pixel_weight * (*src_pixel++); + des_g += pixel_weight * (*src_pixel++); + des_r += pixel_weight * (*src_pixel); + } + *des_scan++ = + (uint8_t)FXRGB2GRAY((des_r >> 16), (des_g >> 16), (des_b >> 16)); + } break; + case 5: { + uint32_t des_b = 0, des_g = 0, des_r = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int pixel_weight = + pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart]; + const uint8_t* src_pixel = src_scan + j * src_Bpp; + uint8_t src_b = 0, src_g = 0, src_r = 0; + AdobeCMYK_to_sRGB1(255 - src_pixel[0], 255 - src_pixel[1], + 255 - src_pixel[2], 255 - src_pixel[3], src_r, + src_g, src_b); + des_b += pixel_weight * src_b; + des_g += pixel_weight * src_g; + des_r += pixel_weight * src_r; + } + *des_scan++ = + (uint8_t)FXRGB2GRAY((des_r >> 16), (des_g >> 16), (des_b >> 16)); + } break; + case 6: + return; + case 7: { + uint32_t des_g = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int pixel_weight = + pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart]; + des_g += pixel_weight * src_scan[j]; + } + FXSYS_memset(des_scan, (uint8_t)(des_g >> 16), 3); + des_scan += des_Bpp; + } break; + case 8: { + int des_r = 0, des_g = 0, des_b = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int pixel_weight = + pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart]; + unsigned long argb = m_pSrcPalette[src_scan[j]]; + des_r += pixel_weight * (uint8_t)(argb >> 16); + des_g += pixel_weight * (uint8_t)(argb >> 8); + des_b += pixel_weight * (uint8_t)argb; + } + *des_scan++ = (uint8_t)((des_b) >> 16); + *des_scan++ = (uint8_t)((des_g) >> 16); + *des_scan++ = (uint8_t)((des_r) >> 16); + des_scan += des_Bpp - 3; + } break; + case 12: { + if (m_pBmpContext) { + int des_r = 0, des_g = 0, des_b = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int pixel_weight = + pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart]; + unsigned long argb = m_pSrcPalette[src_scan[j]]; + des_r += pixel_weight * (uint8_t)(argb >> 16); + des_g += pixel_weight * (uint8_t)(argb >> 8); + des_b += pixel_weight * (uint8_t)argb; + } + *des_scan++ = (uint8_t)((des_b) >> 16); + *des_scan++ = (uint8_t)((des_g) >> 16); + *des_scan++ = (uint8_t)((des_r) >> 16); + *des_scan++ = 0xFF; + } else { + int des_a = 0, des_r = 0, des_g = 0, des_b = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int pixel_weight = + pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart]; + unsigned long argb = m_pSrcPalette[src_scan[j]]; + des_a += pixel_weight * (uint8_t)(argb >> 24); + des_r += pixel_weight * (uint8_t)(argb >> 16); + des_g += pixel_weight * (uint8_t)(argb >> 8); + des_b += pixel_weight * (uint8_t)argb; + } + *des_scan++ = (uint8_t)((des_b) >> 16); + *des_scan++ = (uint8_t)((des_g) >> 16); + *des_scan++ = (uint8_t)((des_r) >> 16); + *des_scan++ = (uint8_t)((des_a) >> 16); + } + } break; + case 9: { + uint32_t des_b = 0, des_g = 0, des_r = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int pixel_weight = + pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart]; + const uint8_t* src_pixel = src_scan + j * src_Bpp; + des_b += pixel_weight * (*src_pixel++); + des_g += pixel_weight * (*src_pixel++); + des_r += pixel_weight * (*src_pixel); + } + *des_scan++ = (uint8_t)((des_b) >> 16); + *des_scan++ = (uint8_t)((des_g) >> 16); + *des_scan++ = (uint8_t)((des_r) >> 16); + des_scan += des_Bpp - 3; + } break; + case 10: { + uint32_t des_b = 0, des_g = 0, des_r = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int pixel_weight = + pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart]; + const uint8_t* src_pixel = src_scan + j * src_Bpp; + uint8_t src_b = 0, src_g = 0, src_r = 0; + AdobeCMYK_to_sRGB1(255 - src_pixel[0], 255 - src_pixel[1], + 255 - src_pixel[2], 255 - src_pixel[3], src_r, + src_g, src_b); + des_b += pixel_weight * src_b; + des_g += pixel_weight * src_g; + des_r += pixel_weight * src_r; + } + *des_scan++ = (uint8_t)((des_b) >> 16); + *des_scan++ = (uint8_t)((des_g) >> 16); + *des_scan++ = (uint8_t)((des_r) >> 16); + des_scan += des_Bpp - 3; + } break; + case 11: { + uint32_t des_alpha = 0, des_r = 0, des_g = 0, des_b = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int pixel_weight = + pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart]; + const uint8_t* src_pixel = src_scan + j * src_Bpp; + pixel_weight = pixel_weight * src_pixel[3] / 255; + des_b += pixel_weight * (*src_pixel++); + des_g += pixel_weight * (*src_pixel++); + des_r += pixel_weight * (*src_pixel); + des_alpha += pixel_weight; + } + *des_scan++ = (uint8_t)((des_b) >> 16); + *des_scan++ = (uint8_t)((des_g) >> 16); + *des_scan++ = (uint8_t)((des_r) >> 16); + *des_scan++ = (uint8_t)((des_alpha * 255) >> 16); + } break; + default: + return; + } + } +} + +void CCodec_ProgressiveDecoder::ResampleVert(CFX_DIBitmap* pDeviceBitmap, + double scale_y, + int des_row) { + int des_Bpp = pDeviceBitmap->GetBPP() >> 3; + uint32_t des_ScanOffet = m_startX * des_Bpp; + if (m_bInterpol) { + int des_top = m_startY; + pdfium::base::CheckedNumeric check_des_row_1 = des_row; + check_des_row_1 -= pdfium::base::checked_cast(scale_y); + int des_row_1 = check_des_row_1.ValueOrDie(); + if (des_row_1 < des_top) { + int des_bottom = des_top + m_sizeY; + if (des_row + (int)scale_y >= des_bottom - 1) { + uint8_t* scan_src = + (uint8_t*)pDeviceBitmap->GetScanline(des_row) + des_ScanOffet; + while (++des_row < des_bottom) { + uint8_t* scan_des = + (uint8_t*)pDeviceBitmap->GetScanline(des_row) + des_ScanOffet; + uint32_t size = m_sizeX * des_Bpp; + FXSYS_memmove(scan_des, scan_src, size); + } + } + return; + } + for (; des_row_1 < des_row; des_row_1++) { + uint8_t* scan_des = + (uint8_t*)pDeviceBitmap->GetScanline(des_row_1) + des_ScanOffet; + PixelWeight* pWeight = m_WeightVert.GetPixelWeight(des_row_1 - des_top); + const uint8_t* scan_src1 = + pDeviceBitmap->GetScanline(pWeight->m_SrcStart + des_top) + + des_ScanOffet; + const uint8_t* scan_src2 = + pDeviceBitmap->GetScanline(pWeight->m_SrcEnd + des_top) + + des_ScanOffet; + for (int des_col = 0; des_col < m_sizeX; des_col++) { + switch (pDeviceBitmap->GetFormat()) { + case FXDIB_Invalid: + case FXDIB_1bppMask: + case FXDIB_1bppRgb: + return; + case FXDIB_8bppMask: + case FXDIB_8bppRgb: { + if (pDeviceBitmap->GetPalette()) { + return; + } + int des_g = 0; + des_g += pWeight->m_Weights[0] * (*scan_src1++); + des_g += pWeight->m_Weights[1] * (*scan_src2++); + *scan_des++ = (uint8_t)(des_g >> 16); + } break; + case FXDIB_Rgb: + case FXDIB_Rgb32: { + uint32_t des_b = 0, des_g = 0, des_r = 0; + des_b += pWeight->m_Weights[0] * (*scan_src1++); + des_g += pWeight->m_Weights[0] * (*scan_src1++); + des_r += pWeight->m_Weights[0] * (*scan_src1++); + scan_src1 += des_Bpp - 3; + des_b += pWeight->m_Weights[1] * (*scan_src2++); + des_g += pWeight->m_Weights[1] * (*scan_src2++); + des_r += pWeight->m_Weights[1] * (*scan_src2++); + scan_src2 += des_Bpp - 3; + *scan_des++ = (uint8_t)((des_b) >> 16); + *scan_des++ = (uint8_t)((des_g) >> 16); + *scan_des++ = (uint8_t)((des_r) >> 16); + scan_des += des_Bpp - 3; + } break; + case FXDIB_Argb: { + uint32_t des_a = 0, des_b = 0, des_g = 0, des_r = 0; + des_b += pWeight->m_Weights[0] * (*scan_src1++); + des_g += pWeight->m_Weights[0] * (*scan_src1++); + des_r += pWeight->m_Weights[0] * (*scan_src1++); + des_a += pWeight->m_Weights[0] * (*scan_src1++); + des_b += pWeight->m_Weights[1] * (*scan_src2++); + des_g += pWeight->m_Weights[1] * (*scan_src2++); + des_r += pWeight->m_Weights[1] * (*scan_src2++); + des_a += pWeight->m_Weights[1] * (*scan_src2++); + *scan_des++ = (uint8_t)((des_b) >> 16); + *scan_des++ = (uint8_t)((des_g) >> 16); + *scan_des++ = (uint8_t)((des_r) >> 16); + *scan_des++ = (uint8_t)((des_a) >> 16); + } break; + default: + return; + } + } + } + int des_bottom = des_top + m_sizeY; + if (des_row + (int)scale_y >= des_bottom - 1) { + uint8_t* scan_src = + (uint8_t*)pDeviceBitmap->GetScanline(des_row) + des_ScanOffet; + while (++des_row < des_bottom) { + uint8_t* scan_des = + (uint8_t*)pDeviceBitmap->GetScanline(des_row) + des_ScanOffet; + uint32_t size = m_sizeX * des_Bpp; + FXSYS_memmove(scan_des, scan_src, size); + } + } + return; + } + int multiple = (int)FXSYS_ceil((FX_FLOAT)scale_y - 1); + if (multiple > 0) { + uint8_t* scan_src = + (uint8_t*)pDeviceBitmap->GetScanline(des_row) + des_ScanOffet; + for (int i = 1; i <= multiple; i++) { + if (des_row + i >= m_startY + m_sizeY) { + return; + } + uint8_t* scan_des = + (uint8_t*)pDeviceBitmap->GetScanline(des_row + i) + des_ScanOffet; + uint32_t size = m_sizeX * des_Bpp; + FXSYS_memmove(scan_des, scan_src, size); + } + } +} + +void CCodec_ProgressiveDecoder::Resample(CFX_DIBitmap* pDeviceBitmap, + int32_t src_line, + uint8_t* src_scan, + FXCodec_Format src_format) { + int src_top = m_clipBox.top; + int des_top = m_startY; + int src_hei = m_clipBox.Height(); + int des_hei = m_sizeY; + if (src_line >= src_top) { + double scale_y = (double)des_hei / (double)src_hei; + int src_row = src_line - src_top; + int des_row = (int)(src_row * scale_y) + des_top; + if (des_row >= des_top + des_hei) { + return; + } + ReSampleScanline(pDeviceBitmap, des_row, m_pDecodeBuf, src_format); + if (scale_y > 1.0) { + ResampleVert(pDeviceBitmap, scale_y, des_row); + } + } +} + +FXCODEC_STATUS CCodec_ProgressiveDecoder::GetFrames(int32_t& frames, + IFX_Pause* pPause) { + if (!(m_status == FXCODEC_STATUS_FRAME_READY || + m_status == FXCODEC_STATUS_FRAME_TOBECONTINUE)) { + return FXCODEC_STATUS_ERROR; + } + switch (m_imagType) { + case FXCODEC_IMAGE_JPG: + case FXCODEC_IMAGE_BMP: + case FXCODEC_IMAGE_PNG: + case FXCODEC_IMAGE_TIF: + frames = m_FrameNumber = 1; + m_status = FXCODEC_STATUS_DECODE_READY; + return m_status; + case FXCODEC_IMAGE_GIF: { + ICodec_GifModule* pGifModule = m_pCodecMgr->GetGifModule(); + if (!pGifModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } + while (true) { + int32_t readResult = + pGifModule->LoadFrameInfo(m_pGifContext, &m_FrameNumber); + while (readResult == 2) { + FXCODEC_STATUS error_status = FXCODEC_STATUS_ERR_READ; + if (!GifReadMoreData(pGifModule, error_status)) { + return error_status; + } + if (pPause && pPause->NeedToPauseNow()) { + m_status = FXCODEC_STATUS_FRAME_TOBECONTINUE; + return m_status; + } + readResult = pGifModule->LoadFrameInfo(m_pGifContext, &m_FrameNumber); + } + if (readResult == 1) { + frames = m_FrameNumber; + m_status = FXCODEC_STATUS_DECODE_READY; + return m_status; + } + if (m_pGifContext) { + pGifModule->Finish(m_pGifContext); + m_pGifContext = nullptr; + } + m_status = FXCODEC_STATUS_ERROR; + return m_status; + } + } + default: + return FXCODEC_STATUS_ERROR; + } +} + +FXCODEC_STATUS CCodec_ProgressiveDecoder::StartDecode(CFX_DIBitmap* pDIBitmap, + int start_x, + int start_y, + int size_x, + int size_y, + int32_t frames, + bool bInterpol) { + if (m_status != FXCODEC_STATUS_DECODE_READY) + return FXCODEC_STATUS_ERROR; + + if (!pDIBitmap || pDIBitmap->GetBPP() < 8 || frames < 0 || + frames >= m_FrameNumber) { + return FXCODEC_STATUS_ERR_PARAMS; + } + m_pDeviceBitmap = pDIBitmap; + if (m_clipBox.IsEmpty()) + return FXCODEC_STATUS_ERR_PARAMS; + if (size_x <= 0 || size_x > 65535 || size_y <= 0 || size_y > 65535) + return FXCODEC_STATUS_ERR_PARAMS; + + FX_RECT device_rc = + FX_RECT(start_x, start_y, start_x + size_x, start_y + size_y); + int32_t out_range_x = device_rc.right - pDIBitmap->GetWidth(); + int32_t out_range_y = device_rc.bottom - pDIBitmap->GetHeight(); + device_rc.Intersect( + FX_RECT(0, 0, pDIBitmap->GetWidth(), pDIBitmap->GetHeight())); + if (device_rc.IsEmpty()) + return FXCODEC_STATUS_ERR_PARAMS; + + m_startX = device_rc.left; + m_startY = device_rc.top; + m_sizeX = device_rc.Width(); + m_sizeY = device_rc.Height(); + m_bInterpol = bInterpol; + m_FrameCur = 0; + if (start_x < 0 || out_range_x > 0) { + FX_FLOAT scaleX = (FX_FLOAT)m_clipBox.Width() / (FX_FLOAT)size_x; + if (start_x < 0) { + m_clipBox.left -= (int32_t)FXSYS_ceil((FX_FLOAT)start_x * scaleX); + } + if (out_range_x > 0) { + m_clipBox.right -= (int32_t)FXSYS_floor((FX_FLOAT)out_range_x * scaleX); + } + } + if (start_y < 0 || out_range_y > 0) { + FX_FLOAT scaleY = (FX_FLOAT)m_clipBox.Height() / (FX_FLOAT)size_y; + if (start_y < 0) { + m_clipBox.top -= (int32_t)FXSYS_ceil((FX_FLOAT)start_y * scaleY); + } + if (out_range_y > 0) { + m_clipBox.bottom -= (int32_t)FXSYS_floor((FX_FLOAT)out_range_y * scaleY); + } + } + if (m_clipBox.IsEmpty()) { + return FXCODEC_STATUS_ERR_PARAMS; + } + switch (m_imagType) { + case FXCODEC_IMAGE_JPG: { + CCodec_JpegModule* pJpegModule = m_pCodecMgr->GetJpegModule(); + int down_scale = 1; + GetDownScale(down_scale); + bool bStart = pJpegModule->StartScanline(m_pJpegContext, down_scale); + while (!bStart) { + FXCODEC_STATUS error_status = FXCODEC_STATUS_ERROR; + if (!JpegReadMoreData(pJpegModule, error_status)) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = error_status; + return m_status; + } + bStart = pJpegModule->StartScanline(m_pJpegContext, down_scale); + } + int scanline_size = (m_SrcWidth + down_scale - 1) / down_scale; + scanline_size = (scanline_size * m_SrcComponents + 3) / 4 * 4; + FX_Free(m_pDecodeBuf); + m_pDecodeBuf = FX_Alloc(uint8_t, scanline_size); + FXSYS_memset(m_pDecodeBuf, 0, scanline_size); + m_WeightHorz.Calc(m_sizeX, 0, m_sizeX, m_clipBox.Width(), 0, + m_clipBox.Width(), m_bInterpol); + m_WeightVert.Calc(m_sizeY, m_clipBox.Height()); + switch (m_SrcComponents) { + case 1: + m_SrcFormat = FXCodec_8bppGray; + break; + case 3: + m_SrcFormat = FXCodec_Rgb; + break; + case 4: + m_SrcFormat = FXCodec_Cmyk; + break; + } + GetTransMethod(pDIBitmap->GetFormat(), m_SrcFormat); + m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return m_status; + } + case FXCODEC_IMAGE_PNG: { + ICodec_PngModule* pPngModule = m_pCodecMgr->GetPngModule(); + if (!pPngModule) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } + if (m_pPngContext) { + pPngModule->Finish(m_pPngContext); + m_pPngContext = nullptr; + } + m_pPngContext = pPngModule->Start(); + if (!m_pPngContext) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } + m_offSet = 0; + switch (m_pDeviceBitmap->GetFormat()) { + case FXDIB_8bppMask: + case FXDIB_8bppRgb: + m_SrcComponents = 1; + m_SrcFormat = FXCodec_8bppGray; + break; + case FXDIB_Rgb: + m_SrcComponents = 3; + m_SrcFormat = FXCodec_Rgb; + break; + case FXDIB_Rgb32: + case FXDIB_Argb: + m_SrcComponents = 4; + m_SrcFormat = FXCodec_Argb; + break; + default: { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERR_PARAMS; + return m_status; + } + } + GetTransMethod(m_pDeviceBitmap->GetFormat(), m_SrcFormat); + int scanline_size = (m_SrcWidth * m_SrcComponents + 3) / 4 * 4; + FX_Free(m_pDecodeBuf); + m_pDecodeBuf = FX_Alloc(uint8_t, scanline_size); + FXSYS_memset(m_pDecodeBuf, 0, scanline_size); + m_WeightHorzOO.Calc(m_sizeX, m_clipBox.Width(), m_bInterpol); + m_WeightVert.Calc(m_sizeY, m_clipBox.Height()); + m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return m_status; + } + case FXCODEC_IMAGE_GIF: { + ICodec_GifModule* pGifModule = m_pCodecMgr->GetGifModule(); + if (!pGifModule) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } + m_SrcFormat = FXCodec_8bppRgb; + GetTransMethod(m_pDeviceBitmap->GetFormat(), m_SrcFormat); + int scanline_size = (m_SrcWidth + 3) / 4 * 4; + FX_Free(m_pDecodeBuf); + m_pDecodeBuf = FX_Alloc(uint8_t, scanline_size); + FXSYS_memset(m_pDecodeBuf, 0, scanline_size); + m_WeightHorz.Calc(m_sizeX, 0, m_sizeX, m_clipBox.Width(), 0, + m_clipBox.Width(), m_bInterpol); + m_WeightVert.Calc(m_sizeY, m_clipBox.Height()); + m_FrameCur = frames; + m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return m_status; + } + case FXCODEC_IMAGE_BMP: { + ICodec_BmpModule* pBmpModule = m_pCodecMgr->GetBmpModule(); + if (!pBmpModule) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } + switch (m_SrcComponents) { + case 1: + m_SrcFormat = FXCodec_8bppRgb; + break; + case 3: + m_SrcFormat = FXCodec_Rgb; + break; + case 4: + m_SrcFormat = FXCodec_Rgb32; + break; + } + GetTransMethod(m_pDeviceBitmap->GetFormat(), m_SrcFormat); + m_ScanlineSize = (m_SrcWidth * m_SrcComponents + 3) / 4 * 4; + FX_Free(m_pDecodeBuf); + m_pDecodeBuf = FX_Alloc(uint8_t, m_ScanlineSize); + FXSYS_memset(m_pDecodeBuf, 0, m_ScanlineSize); + m_WeightHorz.Calc(m_sizeX, 0, m_sizeX, m_clipBox.Width(), 0, + m_clipBox.Width(), m_bInterpol); + m_WeightVert.Calc(m_sizeY, m_clipBox.Height()); + m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return m_status; + } + case FXCODEC_IMAGE_TIF: + m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return m_status; + default: + return FXCODEC_STATUS_ERROR; + } +} + +FXCODEC_STATUS CCodec_ProgressiveDecoder::ContinueDecode(IFX_Pause* pPause) { + if (m_status != FXCODEC_STATUS_DECODE_TOBECONTINUE) + return FXCODEC_STATUS_ERROR; + + switch (m_imagType) { + case FXCODEC_IMAGE_JPG: { + CCodec_JpegModule* pJpegModule = m_pCodecMgr->GetJpegModule(); + while (true) { + bool readRes = pJpegModule->ReadScanline(m_pJpegContext, m_pDecodeBuf); + while (!readRes) { + FXCODEC_STATUS error_status = FXCODEC_STATUS_DECODE_FINISH; + if (!JpegReadMoreData(pJpegModule, error_status)) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = error_status; + return m_status; + } + readRes = pJpegModule->ReadScanline(m_pJpegContext, m_pDecodeBuf); + } + if (m_SrcFormat == FXCodec_Rgb) { + int src_Bpp = (m_SrcFormat & 0xff) >> 3; + RGB2BGR(m_pDecodeBuf + m_clipBox.left * src_Bpp, m_clipBox.Width()); + } + if (m_SrcRow >= m_clipBox.bottom) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_DECODE_FINISH; + return m_status; + } + Resample(m_pDeviceBitmap, m_SrcRow, m_pDecodeBuf, m_SrcFormat); + m_SrcRow++; + if (pPause && pPause->NeedToPauseNow()) { + m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return m_status; + } + } + } + case FXCODEC_IMAGE_PNG: { + ICodec_PngModule* pPngModule = m_pCodecMgr->GetPngModule(); + if (!pPngModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } + while (true) { + uint32_t remain_size = (uint32_t)m_pFile->GetSize() - m_offSet; + uint32_t input_size = + remain_size > FXCODEC_BLOCK_SIZE ? FXCODEC_BLOCK_SIZE : remain_size; + if (input_size == 0) { + if (m_pPngContext) { + pPngModule->Finish(m_pPngContext); + } + m_pPngContext = nullptr; + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_DECODE_FINISH; + return m_status; + } + if (m_pSrcBuf && input_size > m_SrcSize) { + FX_Free(m_pSrcBuf); + m_pSrcBuf = FX_Alloc(uint8_t, input_size); + FXSYS_memset(m_pSrcBuf, 0, input_size); + m_SrcSize = input_size; + } + bool bResult = m_pFile->ReadBlock(m_pSrcBuf, m_offSet, input_size); + if (!bResult) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERR_READ; + return m_status; + } + m_offSet += input_size; + bResult = + pPngModule->Input(m_pPngContext, m_pSrcBuf, input_size, nullptr); + if (!bResult) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERROR; + return m_status; + } + if (pPause && pPause->NeedToPauseNow()) { + m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return m_status; + } + } + } + case FXCODEC_IMAGE_GIF: { + ICodec_GifModule* pGifModule = m_pCodecMgr->GetGifModule(); + if (!pGifModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } + while (true) { + int32_t readRes = + pGifModule->LoadFrame(m_pGifContext, m_FrameCur, nullptr); + while (readRes == 2) { + FXCODEC_STATUS error_status = FXCODEC_STATUS_DECODE_FINISH; + if (!GifReadMoreData(pGifModule, error_status)) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = error_status; + return m_status; + } + if (pPause && pPause->NeedToPauseNow()) { + m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return m_status; + } + readRes = pGifModule->LoadFrame(m_pGifContext, m_FrameCur, nullptr); + } + if (readRes == 1) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_DECODE_FINISH; + return m_status; + } + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERROR; + return m_status; + } + } + case FXCODEC_IMAGE_BMP: { + ICodec_BmpModule* pBmpModule = m_pCodecMgr->GetBmpModule(); + if (!pBmpModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } + while (true) { + int32_t readRes = pBmpModule->LoadImage(m_pBmpContext); + while (readRes == 2) { + FXCODEC_STATUS error_status = FXCODEC_STATUS_DECODE_FINISH; + if (!BmpReadMoreData(pBmpModule, error_status)) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = error_status; + return m_status; + } + if (pPause && pPause->NeedToPauseNow()) { + m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return m_status; + } + readRes = pBmpModule->LoadImage(m_pBmpContext); + } + if (readRes == 1) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_DECODE_FINISH; + return m_status; + } + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERROR; + return m_status; + } + } + case FXCODEC_IMAGE_TIF: { + ICodec_TiffModule* pTiffModule = m_pCodecMgr->GetTiffModule(); + if (!pTiffModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } + bool ret = false; + if (m_pDeviceBitmap->GetBPP() == 32 && + m_pDeviceBitmap->GetWidth() == m_SrcWidth && m_SrcWidth == m_sizeX && + m_pDeviceBitmap->GetHeight() == m_SrcHeight && + m_SrcHeight == m_sizeY && m_startX == 0 && m_startY == 0 && + m_clipBox.left == 0 && m_clipBox.top == 0 && + m_clipBox.right == m_SrcWidth && m_clipBox.bottom == m_SrcHeight) { + ret = pTiffModule->Decode(m_pTiffContext, m_pDeviceBitmap); + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + if (!ret) { + m_status = FXCODEC_STATUS_ERROR; + return m_status; + } + m_status = FXCODEC_STATUS_DECODE_FINISH; + return m_status; + } + + CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap; + pDIBitmap->Create(m_SrcWidth, m_SrcHeight, FXDIB_Argb); + if (!pDIBitmap->GetBuffer()) { + delete pDIBitmap; + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } + ret = pTiffModule->Decode(m_pTiffContext, pDIBitmap); + if (!ret) { + delete pDIBitmap; + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERROR; + return m_status; + } + CFX_DIBitmap* pClipBitmap = + (m_clipBox.left == 0 && m_clipBox.top == 0 && + m_clipBox.right == m_SrcWidth && m_clipBox.bottom == m_SrcHeight) + ? pDIBitmap + : pDIBitmap->Clone(&m_clipBox).release(); + if (pDIBitmap != pClipBitmap) { + delete pDIBitmap; + } + if (!pClipBitmap) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } + CFX_DIBitmap* pFormatBitmap = nullptr; + switch (m_pDeviceBitmap->GetFormat()) { + case FXDIB_8bppRgb: + pFormatBitmap = new CFX_DIBitmap; + pFormatBitmap->Create(pClipBitmap->GetWidth(), + pClipBitmap->GetHeight(), FXDIB_8bppRgb); + break; + case FXDIB_8bppMask: + pFormatBitmap = new CFX_DIBitmap; + pFormatBitmap->Create(pClipBitmap->GetWidth(), + pClipBitmap->GetHeight(), FXDIB_8bppMask); + break; + case FXDIB_Rgb: + pFormatBitmap = new CFX_DIBitmap; + pFormatBitmap->Create(pClipBitmap->GetWidth(), + pClipBitmap->GetHeight(), FXDIB_Rgb); + break; + case FXDIB_Rgb32: + pFormatBitmap = new CFX_DIBitmap; + pFormatBitmap->Create(pClipBitmap->GetWidth(), + pClipBitmap->GetHeight(), FXDIB_Rgb32); + break; + case FXDIB_Argb: + pFormatBitmap = pClipBitmap; + break; + default: + break; + } + switch (m_pDeviceBitmap->GetFormat()) { + case FXDIB_8bppRgb: + case FXDIB_8bppMask: { + for (int32_t row = 0; row < pClipBitmap->GetHeight(); row++) { + uint8_t* src_line = (uint8_t*)pClipBitmap->GetScanline(row); + uint8_t* des_line = (uint8_t*)pFormatBitmap->GetScanline(row); + for (int32_t col = 0; col < pClipBitmap->GetWidth(); col++) { + uint8_t _a = 255 - src_line[3]; + uint8_t b = (src_line[0] * src_line[3] + 0xFF * _a) / 255; + uint8_t g = (src_line[1] * src_line[3] + 0xFF * _a) / 255; + uint8_t r = (src_line[2] * src_line[3] + 0xFF * _a) / 255; + *des_line++ = FXRGB2GRAY(r, g, b); + src_line += 4; + } + } + } break; + case FXDIB_Rgb: + case FXDIB_Rgb32: { + int32_t desBpp = (m_pDeviceBitmap->GetFormat() == FXDIB_Rgb) ? 3 : 4; + for (int32_t row = 0; row < pClipBitmap->GetHeight(); row++) { + uint8_t* src_line = (uint8_t*)pClipBitmap->GetScanline(row); + uint8_t* des_line = (uint8_t*)pFormatBitmap->GetScanline(row); + for (int32_t col = 0; col < pClipBitmap->GetWidth(); col++) { + uint8_t _a = 255 - src_line[3]; + uint8_t b = (src_line[0] * src_line[3] + 0xFF * _a) / 255; + uint8_t g = (src_line[1] * src_line[3] + 0xFF * _a) / 255; + uint8_t r = (src_line[2] * src_line[3] + 0xFF * _a) / 255; + *des_line++ = b; + *des_line++ = g; + *des_line++ = r; + des_line += desBpp - 3; + src_line += 4; + } + } + } break; + default: + break; + } + if (pClipBitmap != pFormatBitmap) { + delete pClipBitmap; + } + if (!pFormatBitmap) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } + std::unique_ptr pStrechBitmap = pFormatBitmap->StretchTo( + m_sizeX, m_sizeY, m_bInterpol ? FXDIB_INTERPOL : FXDIB_DOWNSAMPLE); + delete pFormatBitmap; + pFormatBitmap = nullptr; + if (!pStrechBitmap) { + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } + m_pDeviceBitmap->TransferBitmap(m_startX, m_startY, m_sizeX, m_sizeY, + pStrechBitmap.get(), 0, 0); + m_pDeviceBitmap = nullptr; + m_pFile = nullptr; + m_status = FXCODEC_STATUS_DECODE_FINISH; + return m_status; + } + default: + return FXCODEC_STATUS_ERROR; + } +} + +std::unique_ptr +CCodec_ModuleMgr::CreateProgressiveDecoder() { + return pdfium::MakeUnique(this); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_rle_unittest.cpp b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_rle_unittest.cpp new file mode 100644 index 000000000000..d90a515d450b --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/fx_codec_rle_unittest.cpp @@ -0,0 +1,195 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include + +#include + +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fxcodec/codec/ccodec_basicmodule.h" +#include "core/fxcodec/fx_codec.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(fxcodec, RLETestBadInputs) { + const uint8_t src_buf[] = {1}; + uint8_t* dest_buf = nullptr; + uint32_t src_size = 4; + uint32_t dest_size = 0; + + CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule(); + EXPECT_TRUE(pEncoders); + + // Error codes, not segvs, should callers pass us a nullptr pointer. + EXPECT_FALSE( + pEncoders->RunLengthEncode(src_buf, src_size, &dest_buf, nullptr)); + EXPECT_FALSE( + pEncoders->RunLengthEncode(src_buf, src_size, nullptr, &dest_size)); + EXPECT_FALSE(pEncoders->RunLengthEncode(src_buf, 0, &dest_buf, &dest_size)); + EXPECT_FALSE( + pEncoders->RunLengthEncode(nullptr, src_size, &dest_buf, &dest_size)); +} + +// Check length 1 input works. Check terminating character is applied. +TEST(fxcodec, RLETestShortInput) { + const uint8_t src_buf[] = {1}; + uint8_t* dest_buf = nullptr; + uint32_t src_size = 1; + uint32_t dest_size = 0; + + CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule(); + EXPECT_TRUE(pEncoders); + + EXPECT_TRUE( + pEncoders->RunLengthEncode(src_buf, src_size, &dest_buf, &dest_size)); + ASSERT_EQ(3u, dest_size); + EXPECT_EQ(0, dest_buf[0]); + EXPECT_EQ(1, dest_buf[1]); + EXPECT_EQ(128, dest_buf[2]); + + FX_Free(dest_buf); +} + +// Check a few basic cases (2 matching runs in a row, matching run followed +// by a non-matching run, and non-matching run followed by a matching run). +TEST(fxcodec, RLETestNormalInputs) { + // Match, match + const uint8_t src_buf_1[] = {2, 2, 2, 2, 4, 4, 4, 4, 4, 4}; + + // Match, non-match + const uint8_t src_buf_2[] = {2, 2, 2, 2, 1, 2, 3, 4, 5, 6}; + + // Non-match, match + const uint8_t src_buf_3[] = {1, 2, 3, 4, 5, 3, 3, 3, 3, 3}; + + uint32_t src_size = 10; + uint32_t dest_size = 0; + uint8_t* dest_buf = nullptr; + + CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule(); + EXPECT_TRUE(pEncoders); + + // Case 1: + EXPECT_TRUE( + pEncoders->RunLengthEncode(src_buf_1, src_size, &dest_buf, &dest_size)); + uint8_t* decoded_buf = nullptr; + uint32_t decoded_size = 0; + RunLengthDecode(dest_buf, dest_size, decoded_buf, decoded_size); + ASSERT_EQ(src_size, decoded_size); + for (uint32_t i = 0; i < src_size; i++) + EXPECT_EQ(src_buf_1[i], decoded_buf[i]) << " at " << i; + FX_Free(dest_buf); + FX_Free(decoded_buf); + + // Case 2: + dest_buf = nullptr; + dest_size = 0; + EXPECT_TRUE( + pEncoders->RunLengthEncode(src_buf_2, src_size, &dest_buf, &dest_size)); + decoded_buf = nullptr; + decoded_size = 0; + RunLengthDecode(dest_buf, dest_size, decoded_buf, decoded_size); + ASSERT_EQ(src_size, decoded_size); + for (uint32_t i = 0; i < src_size; i++) + EXPECT_EQ(src_buf_2[i], decoded_buf[i]) << " at " << i; + FX_Free(dest_buf); + FX_Free(decoded_buf); + + // Case 3: + dest_buf = nullptr; + dest_size = 0; + EXPECT_TRUE( + pEncoders->RunLengthEncode(src_buf_3, src_size, &dest_buf, &dest_size)); + decoded_buf = nullptr; + decoded_size = 0; + RunLengthDecode(dest_buf, dest_size, decoded_buf, decoded_size); + ASSERT_EQ(src_size, decoded_size); + for (uint32_t i = 0; i < src_size; i++) + EXPECT_EQ(src_buf_3[i], decoded_buf[i]) << " at " << i; + FX_Free(dest_buf); + FX_Free(decoded_buf); +} + +// Check that runs longer than 128 are broken up properly, both matched and +// non-matched. +TEST(fxcodec, RLETestFullLengthInputs) { + // Match, match + const uint8_t src_buf_1[260] = {1}; + + // Match, non-match + uint8_t src_buf_2[260] = {2}; + for (uint16_t i = 128; i < 260; i++) + src_buf_2[i] = (uint8_t)(i - 125); + + // Non-match, match + uint8_t src_buf_3[260] = {3}; + for (uint8_t i = 0; i < 128; i++) + src_buf_3[i] = i; + + // Non-match, non-match + uint8_t src_buf_4[260]; + for (uint16_t i = 0; i < 260; i++) + src_buf_4[i] = (uint8_t)(i); + + uint32_t src_size = 260; + uint32_t dest_size = 0; + uint8_t* dest_buf = nullptr; + + CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule(); + EXPECT_TRUE(pEncoders); + + // Case 1: + EXPECT_TRUE( + pEncoders->RunLengthEncode(src_buf_1, src_size, &dest_buf, &dest_size)); + uint8_t* decoded_buf = nullptr; + uint32_t decoded_size = 0; + RunLengthDecode(dest_buf, dest_size, decoded_buf, decoded_size); + ASSERT_EQ(src_size, decoded_size); + for (uint32_t i = 0; i < src_size; i++) + EXPECT_EQ(src_buf_1[i], decoded_buf[i]) << " at " << i; + FX_Free(dest_buf); + FX_Free(decoded_buf); + + // Case 2: + dest_buf = nullptr; + dest_size = 0; + EXPECT_TRUE( + pEncoders->RunLengthEncode(src_buf_2, src_size, &dest_buf, &dest_size)); + decoded_buf = nullptr; + decoded_size = 0; + RunLengthDecode(dest_buf, dest_size, decoded_buf, decoded_size); + ASSERT_EQ(src_size, decoded_size); + for (uint32_t i = 0; i < src_size; i++) + EXPECT_EQ(src_buf_2[i], decoded_buf[i]) << " at " << i; + FX_Free(dest_buf); + FX_Free(decoded_buf); + + // Case 3: + dest_buf = nullptr; + dest_size = 0; + EXPECT_TRUE( + pEncoders->RunLengthEncode(src_buf_3, src_size, &dest_buf, &dest_size)); + decoded_buf = nullptr; + decoded_size = 0; + RunLengthDecode(dest_buf, dest_size, decoded_buf, decoded_size); + ASSERT_EQ(src_size, decoded_size); + for (uint32_t i = 0; i < src_size; i++) + EXPECT_EQ(src_buf_3[i], decoded_buf[i]) << " at " << i; + FX_Free(dest_buf); + FX_Free(decoded_buf); + + // Case 4: + dest_buf = nullptr; + dest_size = 0; + EXPECT_TRUE( + pEncoders->RunLengthEncode(src_buf_4, src_size, &dest_buf, &dest_size)); + decoded_buf = nullptr; + decoded_size = 0; + RunLengthDecode(dest_buf, dest_size, decoded_buf, decoded_size); + ASSERT_EQ(src_size, decoded_size); + for (uint32_t i = 0; i < src_size; i++) + EXPECT_EQ(src_buf_4[i], decoded_buf[i]) << " at " << i; + FX_Free(dest_buf); + FX_Free(decoded_buf); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/icodec_bmpmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/icodec_bmpmodule.h new file mode 100644 index 000000000000..a67e20cf0211 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/icodec_bmpmodule.h @@ -0,0 +1,51 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_ICODEC_BMPMODULE_H_ +#define CORE_FXCODEC_CODEC_ICODEC_BMPMODULE_H_ + +#include "core/fxcrt/fx_system.h" + +struct FXBMP_Context; +class CFX_DIBAttribute; + +// Virtual interface to avoid linking in a concrete implementation +// if we do not enable this codec. +class ICodec_BmpModule { + public: + class Delegate { + public: + virtual bool BmpInputImagePositionBuf(uint32_t rcd_pos) = 0; + virtual void BmpReadScanline(int32_t row_num, uint8_t* row_buf) = 0; + }; + + virtual ~ICodec_BmpModule() {} + + virtual FXBMP_Context* Start() = 0; + virtual void Finish(FXBMP_Context* pContext) = 0; + virtual uint32_t GetAvailInput(FXBMP_Context* pContext, + uint8_t** avail_buf_ptr) = 0; + virtual void Input(FXBMP_Context* pContext, + const uint8_t* src_buf, + uint32_t src_size) = 0; + virtual int32_t ReadHeader(FXBMP_Context* pContext, + int32_t* width, + int32_t* height, + bool* tb_flag, + int32_t* components, + int32_t* pal_num, + uint32_t** pal_pp, + CFX_DIBAttribute* pAttribute) = 0; + virtual int32_t LoadImage(FXBMP_Context* pContext) = 0; + + Delegate* GetDelegate() const { return m_pDelegate; } + void SetDelegate(Delegate* pDelegate) { m_pDelegate = pDelegate; } + + protected: + Delegate* m_pDelegate; +}; + +#endif // CORE_FXCODEC_CODEC_ICODEC_BMPMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/icodec_gifmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/icodec_gifmodule.h new file mode 100644 index 000000000000..9dc0708ebe23 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/icodec_gifmodule.h @@ -0,0 +1,68 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_ICODEC_GIFMODULE_H_ +#define CORE_FXCODEC_CODEC_ICODEC_GIFMODULE_H_ + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CFX_DIBAttribute; +struct FXGIF_Context; + +// Virtual interface to avoid linking in a concrete implementation +// if we do not enable this codec. +class ICodec_GifModule { + public: + class Delegate { + public: + virtual void GifRecordCurrentPosition(uint32_t& cur_pos) = 0; + virtual uint8_t* GifAskLocalPaletteBuf(int32_t frame_num, + int32_t pal_size) = 0; + virtual bool GifInputRecordPositionBuf(uint32_t rcd_pos, + const FX_RECT& img_rc, + int32_t pal_num, + void* pal_ptr, + int32_t delay_time, + bool user_input, + int32_t trans_index, + int32_t disposal_method, + bool interlace) = 0; + virtual void GifReadScanline(int32_t row_num, uint8_t* row_buf) = 0; + }; + + virtual ~ICodec_GifModule() {} + + virtual FXGIF_Context* Start() = 0; + virtual void Finish(FXGIF_Context* pContext) = 0; + virtual uint32_t GetAvailInput(FXGIF_Context* pContext, + uint8_t** avail_buf_ptr = nullptr) = 0; + + virtual void Input(FXGIF_Context* pContext, + const uint8_t* src_buf, + uint32_t src_size) = 0; + + virtual int32_t ReadHeader(FXGIF_Context* pContext, + int* width, + int* height, + int* pal_num, + void** pal_pp, + int* bg_index, + CFX_DIBAttribute* pAttribute) = 0; + + virtual int32_t LoadFrameInfo(FXGIF_Context* pContext, int* frame_num) = 0; + virtual int32_t LoadFrame(FXGIF_Context* pContext, + int frame_num, + CFX_DIBAttribute* pAttribute) = 0; + + Delegate* GetDelegate() const { return m_pDelegate; } + void SetDelegate(Delegate* pDelegate) { m_pDelegate = pDelegate; } + + protected: + Delegate* m_pDelegate; +}; + +#endif // CORE_FXCODEC_CODEC_ICODEC_GIFMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/icodec_pngmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/icodec_pngmodule.h new file mode 100644 index 000000000000..63e61fe5b5d3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/icodec_pngmodule.h @@ -0,0 +1,47 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_ICODEC_PNGMODULE_H_ +#define CORE_FXCODEC_CODEC_ICODEC_PNGMODULE_H_ + +#include "core/fxcrt/fx_system.h" + +class CFX_DIBAttribute; +struct FXPNG_Context; + +// Virtual interface to avoid linking in a concrete implementation +// if we do not enable this codec. +class ICodec_PngModule { + public: + class Delegate { + public: + virtual bool PngReadHeader(int width, + int height, + int bpc, + int pass, + int* color_type, + double* gamma) = 0; + virtual bool PngAskScanlineBuf(int line, uint8_t*& src_buf) = 0; + virtual void PngFillScanlineBufCompleted(int pass, int line) = 0; + }; + + virtual ~ICodec_PngModule() {} + + virtual FXPNG_Context* Start() = 0; + virtual void Finish(FXPNG_Context* pContext) = 0; + virtual bool Input(FXPNG_Context* pContext, + const uint8_t* src_buf, + uint32_t src_size, + CFX_DIBAttribute* pAttribute) = 0; + + Delegate* GetDelegate() const { return m_pDelegate; } + void SetDelegate(Delegate* delegate) { m_pDelegate = delegate; } + + protected: + Delegate* m_pDelegate; +}; + +#endif // CORE_FXCODEC_CODEC_ICODEC_PNGMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/codec/icodec_tiffmodule.h b/modules/pdfium/pdfium/core/fxcodec/codec/icodec_tiffmodule.h new file mode 100644 index 000000000000..540d82ff639c --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/codec/icodec_tiffmodule.h @@ -0,0 +1,36 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_CODEC_ICODEC_TIFFMODULE_H_ +#define CORE_FXCODEC_CODEC_ICODEC_TIFFMODULE_H_ + +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_system.h" + +class CCodec_TiffContext; +class CFX_DIBAttribute; +class CFX_DIBitmap; +class IFX_SeekableReadStream; + +class ICodec_TiffModule { + public: + virtual ~ICodec_TiffModule() {} + + virtual CCodec_TiffContext* CreateDecoder( + const CFX_RetainPtr& file_ptr) = 0; + virtual bool LoadFrameInfo(CCodec_TiffContext* ctx, + int32_t frame, + int32_t* width, + int32_t* height, + int32_t* comps, + int32_t* bpc, + CFX_DIBAttribute* pAttribute) = 0; + virtual bool Decode(CCodec_TiffContext* ctx, + class CFX_DIBitmap* pDIBitmap) = 0; + virtual void DestroyDecoder(CCodec_TiffContext* ctx) = 0; +}; + +#endif // CORE_FXCODEC_CODEC_ICODEC_TIFFMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/fx_codec.h b/modules/pdfium/pdfium/core/fxcodec/fx_codec.h new file mode 100644 index 000000000000..b0b9fa1821e3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/fx_codec.h @@ -0,0 +1,145 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_FX_CODEC_H_ +#define CORE_FXCODEC_FX_CODEC_H_ + +#include +#include +#include +#include + +#include "core/fxcodec/codec/ccodec_basicmodule.h" +#include "core/fxcodec/codec/ccodec_faxmodule.h" +#include "core/fxcodec/codec/ccodec_flatemodule.h" +#include "core/fxcodec/codec/ccodec_iccmodule.h" +#include "core/fxcodec/codec/ccodec_jbig2module.h" +#include "core/fxcodec/codec/ccodec_jpegmodule.h" +#include "core/fxcodec/codec/ccodec_jpxmodule.h" +#include "core/fxcodec/codec/ccodec_scanlinedecoder.h" +#include "core/fxcodec/fx_codec_def.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" + +#ifdef PDF_ENABLE_XFA +#include "core/fxcodec/codec/icodec_bmpmodule.h" +#include "core/fxcodec/codec/icodec_gifmodule.h" +#include "core/fxcodec/codec/icodec_pngmodule.h" +#include "core/fxcodec/codec/icodec_tiffmodule.h" +#endif // PDF_ENABLE_XFA + +class CFX_DIBSource; +class CJPX_Decoder; +class CPDF_ColorSpace; +class CPDF_StreamAcc; + +#ifdef PDF_ENABLE_XFA +class CCodec_ProgressiveDecoder; + +class CFX_DIBAttribute { + public: + CFX_DIBAttribute(); + ~CFX_DIBAttribute(); + + int32_t m_nXDPI; + int32_t m_nYDPI; + FX_FLOAT m_fAspectRatio; + uint16_t m_wDPIUnit; + CFX_ByteString m_strAuthor; + uint8_t m_strTime[20]; + int32_t m_nGifLeft; + int32_t m_nGifTop; + uint32_t* m_pGifLocalPalette; + uint32_t m_nGifLocalPalNum; + int32_t m_nBmpCompressType; + std::map m_Exif; +}; +#endif // PDF_ENABLE_XFA + +class CCodec_ModuleMgr { + public: + CCodec_ModuleMgr(); + ~CCodec_ModuleMgr(); + + CCodec_BasicModule* GetBasicModule() const { return m_pBasicModule.get(); } + CCodec_FaxModule* GetFaxModule() const { return m_pFaxModule.get(); } + CCodec_JpegModule* GetJpegModule() const { return m_pJpegModule.get(); } + CCodec_JpxModule* GetJpxModule() const { return m_pJpxModule.get(); } + CCodec_Jbig2Module* GetJbig2Module() const { return m_pJbig2Module.get(); } + CCodec_IccModule* GetIccModule() const { return m_pIccModule.get(); } + CCodec_FlateModule* GetFlateModule() const { return m_pFlateModule.get(); } + +#ifdef PDF_ENABLE_XFA + std::unique_ptr CreateProgressiveDecoder(); + void SetBmpModule(std::unique_ptr module) { + m_pBmpModule = std::move(module); + } + void SetGifModule(std::unique_ptr module) { + m_pGifModule = std::move(module); + } + void SetPngModule(std::unique_ptr module) { + m_pPngModule = std::move(module); + } + void SetTiffModule(std::unique_ptr module) { + m_pTiffModule = std::move(module); + } + ICodec_BmpModule* GetBmpModule() const { return m_pBmpModule.get(); } + ICodec_GifModule* GetGifModule() const { return m_pGifModule.get(); } + ICodec_PngModule* GetPngModule() const { return m_pPngModule.get(); } + ICodec_TiffModule* GetTiffModule() const { return m_pTiffModule.get(); } +#endif // PDF_ENABLE_XFA + + protected: + std::unique_ptr m_pBasicModule; + std::unique_ptr m_pFaxModule; + std::unique_ptr m_pJpegModule; + std::unique_ptr m_pJpxModule; + std::unique_ptr m_pJbig2Module; + std::unique_ptr m_pIccModule; + +#ifdef PDF_ENABLE_XFA + std::unique_ptr m_pBmpModule; + std::unique_ptr m_pGifModule; + std::unique_ptr m_pPngModule; + std::unique_ptr m_pTiffModule; +#endif // PDF_ENABLE_XFA + + std::unique_ptr m_pFlateModule; +}; + +void ReverseRGB(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels); +uint32_t ComponentsForFamily(int family); +void sRGB_to_AdobeCMYK(FX_FLOAT R, + FX_FLOAT G, + FX_FLOAT B, + FX_FLOAT& c, + FX_FLOAT& m, + FX_FLOAT& y, + FX_FLOAT& k); +void AdobeCMYK_to_sRGB(FX_FLOAT c, + FX_FLOAT m, + FX_FLOAT y, + FX_FLOAT k, + FX_FLOAT& R, + FX_FLOAT& G, + FX_FLOAT& B); +void AdobeCMYK_to_sRGB1(uint8_t c, + uint8_t m, + uint8_t y, + uint8_t k, + uint8_t& R, + uint8_t& G, + uint8_t& B); +bool MD5ComputeID(const void* buf, uint32_t dwSize, uint8_t ID[16]); +void FaxG4Decode(const uint8_t* src_buf, + uint32_t src_size, + int* pbitpos, + uint8_t* dest_buf, + int width, + int height, + int pitch); + +#endif // CORE_FXCODEC_FX_CODEC_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/fx_codec_def.h b/modules/pdfium/pdfium/core/fxcodec/fx_codec_def.h new file mode 100644 index 000000000000..fd23d78fa593 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/fx_codec_def.h @@ -0,0 +1,92 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_FX_CODEC_DEF_H_ +#define CORE_FXCODEC_FX_CODEC_DEF_H_ + +enum FXCODEC_STATUS { + FXCODEC_STATUS_ERROR = -1, + FXCODEC_STATUS_FRAME_READY, + FXCODEC_STATUS_FRAME_TOBECONTINUE, + FXCODEC_STATUS_DECODE_READY, + FXCODEC_STATUS_DECODE_TOBECONTINUE, + FXCODEC_STATUS_DECODE_FINISH, +#ifdef PDF_ENABLE_XFA + FXCODEC_STATUS_ERR_MEMORY, +#endif // PDF_ENABLE_XFA + FXCODEC_STATUS_ERR_READ, + FXCODEC_STATUS_ERR_FLUSH, + FXCODEC_STATUS_ERR_FORMAT, + FXCODEC_STATUS_ERR_PARAMS +}; +#define JP2_SPACE_INVALID -1 +#define JPX_SPACE_INVALID -1 +#define JP2_SPACE_bilevel1 0 +#define JP2_SPACE_YCbCr1 1 +#define JP2_SPACE_YCbCr2 3 +#define JP2_SPACE_YCbCr3 4 +#define JP2_SPACE_PhotoYCC 9 +#define JP2_SPACE_CMY 11 +#define JP2_SPACE_CMYK 12 +#define JP2_SPACE_YCCK 13 +#define JP2_SPACE_CIELab 14 +#define JP2_SPACE_bilevel2 15 +#define JP2_SPACE_sRGB 16 +#define JP2_SPACE_sLUM 17 +#define JP2_SPACE_sYCC 18 +#define JP2_SPACE_CIEJab 19 +#define JP2_SPACE_esRGB 20 +#define JP2_SPACE_ROMMRGB 21 +#define JP2_SPACE_YPbPr60 22 +#define JP2_SPACE_YPbPr50 23 +#define JP2_SPACE_esYCC 24 +#define JP2_SPACE_iccLUM 100 +#define JP2_SPACE_iccRGB 101 +#define Icc_INTENT_PERCEPTUAL 0 +#define Icc_INTENT_RELATIVE_COLORIMETRIC 1 +#define Icc_INTENT_SATURATION 2 +#define Icc_INTENT_ABSOLUTE_COLORIMETRIC 3 +#define Icc_FORMAT_DEFAULT 0 +#define Icc_FORMAT_SWAP (1 << 10) +#define Icc_FLAGS_DEFAULT 0x0000 +#define Icc_FLAGS_BLACKPOINTCOMPENSATION 0x2000 +#define Icc_FLAGS_NOWHITEONWHITEFIXUP 0x0004 +#define Icc_FLAGS_HIGHRESPRECALC 0x0400 +#define Icc_FLAGS_LOWRESPRECALC 0x0800 +#define Icc_FLAGS_GAMUTCHECK 0x1000 +#define Icc_FLAGS_SOFTPROOFING 0x4000 +#define Icc_PARAMTYPE_NONE 0 +#define Icc_PARAMTYPE_BUFFER 1 +#define Icc_PARAMTYPE_PARAM 2 +#ifdef PDF_ENABLE_XFA +enum FXCODEC_IMAGE_TYPE { + FXCODEC_IMAGE_UNKNOWN = 0, + FXCODEC_IMAGE_BMP, + FXCODEC_IMAGE_JPG, + FXCODEC_IMAGE_PNG, + FXCODEC_IMAGE_GIF, + FXCODEC_IMAGE_TIF, + FXCODEC_IMAGE_MAX +}; +enum FXCODEC_RESUNIT { + FXCODEC_RESUNIT_NONE = 0, + FXCODEC_RESUNIT_INCH, + FXCODEC_RESUNIT_CENTIMETER, + FXCODEC_RESUNIT_METER +}; +#endif // PDF_ENABLE_XFA +#define EXIFTAG_USHORT_RESUNIT 296 +#define EXIFTAG_FLOAT_DPIX 282 +#define EXIFTAG_FLOAT_DPIY 283 +#define EXIFTAG_USHORT_ORIENTATION 274 +#define EXIFTAG_STRING_MANUFACTURER 271 +#define EXIFTAG_STRING_MODULE 272 +#define EXIFTAG_STRING_SOFTWARE 305 +#define EXIFTAG_STRING_IAMGEDESCRIPTION 270 +#define EXIFTAG_STRING_DATETIME 306 +#define EXIFTAG_STRING_COPYRIGHT 33432 + +#endif // CORE_FXCODEC_FX_CODEC_DEF_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithDecoder.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithDecoder.cpp new file mode 100644 index 000000000000..0d45f57bdfb6 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithDecoder.cpp @@ -0,0 +1,120 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_ArithDecoder.h" + +#include "core/fxcodec/jbig2/JBig2_BitStream.h" +#include "core/fxcrt/fx_basic.h" + +namespace { + +struct JBig2ArithQe { + unsigned int Qe; + unsigned int NMPS; + unsigned int NLPS; + unsigned int nSwitch; +}; + +const JBig2ArithQe kQeTable[] = { + // Stupid hack to keep clang-format from reformatting this badly. + {0x5601, 1, 1, 1}, {0x3401, 2, 6, 0}, {0x1801, 3, 9, 0}, + {0x0AC1, 4, 12, 0}, {0x0521, 5, 29, 0}, {0x0221, 38, 33, 0}, + {0x5601, 7, 6, 1}, {0x5401, 8, 14, 0}, {0x4801, 9, 14, 0}, + {0x3801, 10, 14, 0}, {0x3001, 11, 17, 0}, {0x2401, 12, 18, 0}, + {0x1C01, 13, 20, 0}, {0x1601, 29, 21, 0}, {0x5601, 15, 14, 1}, + {0x5401, 16, 14, 0}, {0x5101, 17, 15, 0}, {0x4801, 18, 16, 0}, + {0x3801, 19, 17, 0}, {0x3401, 20, 18, 0}, {0x3001, 21, 19, 0}, + {0x2801, 22, 19, 0}, {0x2401, 23, 20, 0}, {0x2201, 24, 21, 0}, + {0x1C01, 25, 22, 0}, {0x1801, 26, 23, 0}, {0x1601, 27, 24, 0}, + {0x1401, 28, 25, 0}, {0x1201, 29, 26, 0}, {0x1101, 30, 27, 0}, + {0x0AC1, 31, 28, 0}, {0x09C1, 32, 29, 0}, {0x08A1, 33, 30, 0}, + {0x0521, 34, 31, 0}, {0x0441, 35, 32, 0}, {0x02A1, 36, 33, 0}, + {0x0221, 37, 34, 0}, {0x0141, 38, 35, 0}, {0x0111, 39, 36, 0}, + {0x0085, 40, 37, 0}, {0x0049, 41, 38, 0}, {0x0025, 42, 39, 0}, + {0x0015, 43, 40, 0}, {0x0009, 44, 41, 0}, {0x0005, 45, 42, 0}, + {0x0001, 45, 43, 0}, {0x5601, 46, 46, 0}}; + +const unsigned int kDefaultAValue = 0x8000; + +int DecodeNMPS(JBig2ArithCtx* pCX, const JBig2ArithQe& qe) { + pCX->I = qe.NMPS; + return pCX->MPS; +} + +int DecodeNLPS(JBig2ArithCtx* pCX, const JBig2ArithQe& qe) { + // TODO(thestig): |D|, |MPS| and friends probably should be booleans. + int D = 1 - pCX->MPS; + if (qe.nSwitch == 1) + pCX->MPS = 1 - pCX->MPS; + pCX->I = qe.NLPS; + return D; +} + +} // namespace + +CJBig2_ArithDecoder::CJBig2_ArithDecoder(CJBig2_BitStream* pStream) + : m_pStream(pStream) { + m_B = m_pStream->getCurByte_arith(); + m_C = (m_B ^ 0xff) << 16; + BYTEIN(); + m_C = m_C << 7; + m_CT = m_CT - 7; + m_A = kDefaultAValue; +} + +CJBig2_ArithDecoder::~CJBig2_ArithDecoder() {} + +int CJBig2_ArithDecoder::DECODE(JBig2ArithCtx* pCX) { + if (!pCX || pCX->I >= FX_ArraySize(kQeTable)) + return 0; + + const JBig2ArithQe& qe = kQeTable[pCX->I]; + m_A -= qe.Qe; + if ((m_C >> 16) < m_A) { + if (m_A & kDefaultAValue) + return pCX->MPS; + + const int D = m_A < qe.Qe ? DecodeNLPS(pCX, qe) : DecodeNMPS(pCX, qe); + ReadValueA(); + return D; + } + + m_C -= m_A << 16; + const int D = m_A < qe.Qe ? DecodeNMPS(pCX, qe) : DecodeNLPS(pCX, qe); + m_A = qe.Qe; + ReadValueA(); + return D; +} + +void CJBig2_ArithDecoder::BYTEIN() { + unsigned char B1; + if (m_B == 0xff) { + B1 = m_pStream->getNextByte_arith(); + if (B1 > 0x8f) { + m_CT = 8; + } else { + m_pStream->incByteIdx(); + m_B = B1; + m_C = m_C + 0xfe00 - (m_B << 9); + m_CT = 7; + } + } else { + m_pStream->incByteIdx(); + m_B = m_pStream->getCurByte_arith(); + m_C = m_C + 0xff00 - (m_B << 8); + m_CT = 8; + } +} + +void CJBig2_ArithDecoder::ReadValueA() { + do { + if (m_CT == 0) + BYTEIN(); + m_A <<= 1; + m_C <<= 1; + --m_CT; + } while ((m_A & kDefaultAValue) == 0); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithDecoder.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithDecoder.h new file mode 100644 index 000000000000..a8ab5dd7309a --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithDecoder.h @@ -0,0 +1,38 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_ARITHDECODER_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_ARITHDECODER_H_ + +class CJBig2_BitStream; + +struct JBig2ArithCtx { + JBig2ArithCtx() : MPS(0), I(0) {} + + unsigned int MPS; + unsigned int I; +}; + +class CJBig2_ArithDecoder { + public: + explicit CJBig2_ArithDecoder(CJBig2_BitStream* pStream); + + ~CJBig2_ArithDecoder(); + + int DECODE(JBig2ArithCtx* pCX); + + private: + void BYTEIN(); + void ReadValueA(); + + unsigned char m_B; + unsigned int m_C; + unsigned int m_A; + unsigned int m_CT; + CJBig2_BitStream* const m_pStream; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_ARITHDECODER_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp new file mode 100644 index 000000000000..228e16ec09a1 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp @@ -0,0 +1,92 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_ArithIntDecoder.h" + +#include + +#include "core/fxcrt/fx_basic.h" + +namespace { + +int ShiftOr(int val, int bitwise_or_val) { + return (val << 1) | bitwise_or_val; +} + +const struct ArithIntDecodeData { + int nNeedBits; + int nValue; +} g_ArithIntDecodeData[] = { + {2, 0}, {4, 4}, {6, 20}, {8, 84}, {12, 340}, {32, 4436}, +}; + +size_t RecursiveDecode(CJBig2_ArithDecoder* decoder, + std::vector* context, + int* prev, + size_t depth) { + static const size_t kDepthEnd = FX_ArraySize(g_ArithIntDecodeData) - 1; + if (depth == kDepthEnd) + return kDepthEnd; + + JBig2ArithCtx* pCX = &(*context)[*prev]; + int D = decoder->DECODE(pCX); + *prev = ShiftOr(*prev, D); + if (!D) + return depth; + return RecursiveDecode(decoder, context, prev, depth + 1); +} + +} // namespace + +CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder() { + m_IAx.resize(512); +} + +CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder() {} + +bool CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder* pArithDecoder, + int* nResult) { + int PREV = 1; + const int S = pArithDecoder->DECODE(&m_IAx[PREV]); + PREV = ShiftOr(PREV, S); + + const size_t nDecodeDataIndex = + RecursiveDecode(pArithDecoder, &m_IAx, &PREV, 0); + + int nTemp = 0; + for (int i = 0; i < g_ArithIntDecodeData[nDecodeDataIndex].nNeedBits; ++i) { + int D = pArithDecoder->DECODE(&m_IAx[PREV]); + PREV = ShiftOr(PREV, D); + if (PREV >= 256) + PREV = (PREV & 511) | 256; + nTemp = ShiftOr(nTemp, D); + } + int nValue = g_ArithIntDecodeData[nDecodeDataIndex].nValue; + nValue += nTemp; + if (S == 1 && nValue > 0) + nValue = -nValue; + + *nResult = nValue; + return S != 1 || nValue != 0; +} + +CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA) + : SBSYMCODELEN(SBSYMCODELENA) { + m_IAID.resize(static_cast(1) << SBSYMCODELEN); +} + +CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder() {} + +void CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder* pArithDecoder, + uint32_t* nResult) { + int PREV = 1; + for (unsigned char i = 0; i < SBSYMCODELEN; ++i) { + JBig2ArithCtx* pCX = &m_IAID[PREV]; + int D = pArithDecoder->DECODE(pCX); + PREV = ShiftOr(PREV, D); + } + *nResult = PREV - (1 << SBSYMCODELEN); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithIntDecoder.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithIntDecoder.h new file mode 100644 index 000000000000..fd9fa89f194d --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_ArithIntDecoder.h @@ -0,0 +1,41 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_ARITHINTDECODER_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_ARITHINTDECODER_H_ + +#include + +#include "core/fxcodec/jbig2/JBig2_ArithDecoder.h" +#include "core/fxcrt/fx_system.h" + +class CJBig2_ArithIntDecoder { + public: + CJBig2_ArithIntDecoder(); + ~CJBig2_ArithIntDecoder(); + + // Returns true on success, and false when an OOB condition occurs. Many + // callers can tolerate OOB and do not check the return value. + bool decode(CJBig2_ArithDecoder* pArithDecoder, int* nResult); + + private: + std::vector m_IAx; +}; + +class CJBig2_ArithIaidDecoder { + public: + explicit CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA); + ~CJBig2_ArithIaidDecoder(); + + void decode(CJBig2_ArithDecoder* pArithDecoder, uint32_t* nResult); + + private: + std::vector m_IAID; + + const unsigned char SBSYMCODELEN; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_ARITHINTDECODER_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_BitStream.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_BitStream.cpp new file mode 100644 index 000000000000..dc4beabc4b80 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_BitStream.cpp @@ -0,0 +1,189 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_BitStream.h" + +#include + +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" + +CJBig2_BitStream::CJBig2_BitStream(CPDF_StreamAcc* pSrcStream) + : m_pBuf(pSrcStream->GetData()), + m_dwLength(pSrcStream->GetSize()), + m_dwByteIdx(0), + m_dwBitIdx(0), + m_dwObjNum(pSrcStream->GetStream() ? pSrcStream->GetStream()->GetObjNum() + : 0) { + if (m_dwLength > 256 * 1024 * 1024) { + m_dwLength = 0; + m_pBuf = nullptr; + } +} + +CJBig2_BitStream::~CJBig2_BitStream() {} + +int32_t CJBig2_BitStream::readNBits(uint32_t dwBits, uint32_t* dwResult) { + uint32_t dwBitPos = getBitPos(); + if (dwBitPos > LengthInBits()) + return -1; + + *dwResult = 0; + if (dwBitPos + dwBits <= LengthInBits()) + dwBitPos = dwBits; + else + dwBitPos = LengthInBits() - dwBitPos; + + for (; dwBitPos > 0; --dwBitPos) { + *dwResult = + (*dwResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01); + AdvanceBit(); + } + return 0; +} + +int32_t CJBig2_BitStream::readNBits(uint32_t dwBits, int32_t* nResult) { + uint32_t dwBitPos = getBitPos(); + if (dwBitPos > LengthInBits()) + return -1; + + *nResult = 0; + if (dwBitPos + dwBits <= LengthInBits()) + dwBitPos = dwBits; + else + dwBitPos = LengthInBits() - dwBitPos; + + for (; dwBitPos > 0; --dwBitPos) { + *nResult = + (*nResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01); + AdvanceBit(); + } + return 0; +} + +int32_t CJBig2_BitStream::read1Bit(uint32_t* dwResult) { + if (!IsInBound()) + return -1; + + *dwResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01; + AdvanceBit(); + return 0; +} + +int32_t CJBig2_BitStream::read1Bit(bool* bResult) { + if (!IsInBound()) + return -1; + + *bResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01; + AdvanceBit(); + return 0; +} + +int32_t CJBig2_BitStream::read1Byte(uint8_t* cResult) { + if (!IsInBound()) + return -1; + + *cResult = m_pBuf[m_dwByteIdx]; + ++m_dwByteIdx; + return 0; +} + +int32_t CJBig2_BitStream::readInteger(uint32_t* dwResult) { + if (m_dwByteIdx + 3 >= m_dwLength) + return -1; + + *dwResult = (m_pBuf[m_dwByteIdx] << 24) | (m_pBuf[m_dwByteIdx + 1] << 16) | + (m_pBuf[m_dwByteIdx + 2] << 8) | m_pBuf[m_dwByteIdx + 3]; + m_dwByteIdx += 4; + return 0; +} + +int32_t CJBig2_BitStream::readShortInteger(uint16_t* dwResult) { + if (m_dwByteIdx + 1 >= m_dwLength) + return -1; + + *dwResult = (m_pBuf[m_dwByteIdx] << 8) | m_pBuf[m_dwByteIdx + 1]; + m_dwByteIdx += 2; + return 0; +} + +void CJBig2_BitStream::alignByte() { + if (m_dwBitIdx != 0) { + ++m_dwByteIdx; + m_dwBitIdx = 0; + } +} + +uint8_t CJBig2_BitStream::getCurByte() const { + return IsInBound() ? m_pBuf[m_dwByteIdx] : 0; +} + +void CJBig2_BitStream::incByteIdx() { + if (IsInBound()) + ++m_dwByteIdx; +} + +uint8_t CJBig2_BitStream::getCurByte_arith() const { + return IsInBound() ? m_pBuf[m_dwByteIdx] : 0xFF; +} + +uint8_t CJBig2_BitStream::getNextByte_arith() const { + return m_dwByteIdx + 1 < m_dwLength ? m_pBuf[m_dwByteIdx + 1] : 0xFF; +} + +uint32_t CJBig2_BitStream::getOffset() const { + return m_dwByteIdx; +} + +void CJBig2_BitStream::setOffset(uint32_t dwOffset) { + m_dwByteIdx = std::min(dwOffset, m_dwLength); +} + +uint32_t CJBig2_BitStream::getBitPos() const { + return (m_dwByteIdx << 3) + m_dwBitIdx; +} + +void CJBig2_BitStream::setBitPos(uint32_t dwBitPos) { + m_dwByteIdx = dwBitPos >> 3; + m_dwBitIdx = dwBitPos & 7; +} + +const uint8_t* CJBig2_BitStream::getBuf() const { + return m_pBuf; +} + +const uint8_t* CJBig2_BitStream::getPointer() const { + return m_pBuf + m_dwByteIdx; +} + +void CJBig2_BitStream::offset(uint32_t dwOffset) { + m_dwByteIdx += dwOffset; +} + +uint32_t CJBig2_BitStream::getByteLeft() const { + return m_dwLength - m_dwByteIdx; +} + +void CJBig2_BitStream::AdvanceBit() { + if (m_dwBitIdx == 7) { + ++m_dwByteIdx; + m_dwBitIdx = 0; + } else { + ++m_dwBitIdx; + } +} + +bool CJBig2_BitStream::IsInBound() const { + return m_dwByteIdx < m_dwLength; +} + +uint32_t CJBig2_BitStream::LengthInBits() const { + return m_dwLength << 3; +} + +uint32_t CJBig2_BitStream::getObjNum() const { + return m_dwObjNum; +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_BitStream.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_BitStream.h new file mode 100644 index 000000000000..aeb2eba693c4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_BitStream.h @@ -0,0 +1,58 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_BITSTREAM_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_BITSTREAM_H_ + +#include "core/fxcrt/fx_basic.h" + +class CPDF_StreamAcc; + +class CJBig2_BitStream { + public: + explicit CJBig2_BitStream(CPDF_StreamAcc* pSrcStream); + ~CJBig2_BitStream(); + + // TODO(thestig): readFoo() should return bool. + int32_t readNBits(uint32_t nBits, uint32_t* dwResult); + int32_t readNBits(uint32_t nBits, int32_t* nResult); + int32_t read1Bit(uint32_t* dwResult); + int32_t read1Bit(bool* bResult); + int32_t read1Byte(uint8_t* cResult); + int32_t readInteger(uint32_t* dwResult); + int32_t readShortInteger(uint16_t* wResult); + void alignByte(); + uint8_t getCurByte() const; + void incByteIdx(); + uint8_t getCurByte_arith() const; + uint8_t getNextByte_arith() const; + uint32_t getOffset() const; + void setOffset(uint32_t dwOffset); + uint32_t getBitPos() const; + void setBitPos(uint32_t dwBitPos); + const uint8_t* getBuf() const; + uint32_t getLength() const { return m_dwLength; } + const uint8_t* getPointer() const; + void offset(uint32_t dwOffset); + uint32_t getByteLeft() const; + uint32_t getObjNum() const; + + private: + void AdvanceBit(); + bool IsInBound() const; + uint32_t LengthInBits() const; + + const uint8_t* m_pBuf; + uint32_t m_dwLength; + uint32_t m_dwByteIdx; + uint32_t m_dwBitIdx; + const uint32_t m_dwObjNum; + + CJBig2_BitStream(const CJBig2_BitStream&) = delete; + void operator=(const CJBig2_BitStream&) = delete; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_BITSTREAM_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Context.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Context.cpp new file mode 100644 index 000000000000..109013204e15 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Context.cpp @@ -0,0 +1,1396 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_Context.h" + +#include +#include +#include +#include + +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fxcodec/jbig2/JBig2_ArithDecoder.h" +#include "core/fxcodec/jbig2/JBig2_BitStream.h" +#include "core/fxcodec/jbig2/JBig2_GrdProc.h" +#include "core/fxcodec/jbig2/JBig2_GrrdProc.h" +#include "core/fxcodec/jbig2/JBig2_HtrdProc.h" +#include "core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h" +#include "core/fxcodec/jbig2/JBig2_PddProc.h" +#include "core/fxcodec/jbig2/JBig2_SddProc.h" +#include "core/fxcodec/jbig2/JBig2_TrdProc.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +namespace { + +size_t GetHuffContextSize(uint8_t val) { + return val == 0 ? 65536 : val == 1 ? 8192 : 1024; +} + +size_t GetRefAggContextSize(bool val) { + return val ? 1024 : 8192; +} + +} // namespace + +// Implement a very small least recently used (LRU) cache. It is very +// common for a JBIG2 dictionary to span multiple pages in a PDF file, +// and we do not want to decode the same dictionary over and over +// again. We key off of the memory location of the dictionary. The +// list keeps track of the freshness of entries, with freshest ones +// at the front. Even a tiny cache size like 2 makes a dramatic +// difference for typical JBIG2 documents. +static const int kSymbolDictCacheMaxSize = 2; + +CJBig2_Context::CJBig2_Context(CPDF_StreamAcc* pGlobalStream, + CPDF_StreamAcc* pSrcStream, + std::list* pSymbolDictCache, + IFX_Pause* pPause, + bool bIsGlobal) + : m_nSegmentDecoded(0), + m_bInPage(false), + m_bBufSpecified(false), + m_PauseStep(10), + m_pPause(pPause), + m_ProcessingStatus(FXCODEC_STATUS_FRAME_READY), + m_dwOffset(0), + m_pSymbolDictCache(pSymbolDictCache), + m_bIsGlobal(bIsGlobal) { + if (pGlobalStream && (pGlobalStream->GetSize() > 0)) { + m_pGlobalContext = pdfium::MakeUnique( + nullptr, pGlobalStream, pSymbolDictCache, pPause, true); + } + m_pStream = pdfium::MakeUnique(pSrcStream); +} + +CJBig2_Context::~CJBig2_Context() {} + +int32_t CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause) { + int32_t nRet; + if (m_pStream->getByteLeft() <= 0) + return JBIG2_END_OF_FILE; + + while (m_pStream->getByteLeft() >= JBIG2_MIN_SEGMENT_SIZE) { + if (!m_pSegment) { + m_pSegment = pdfium::MakeUnique(); + nRet = parseSegmentHeader(m_pSegment.get()); + if (nRet != JBIG2_SUCCESS) { + m_pSegment.reset(); + return nRet; + } + m_dwOffset = m_pStream->getOffset(); + } + nRet = parseSegmentData(m_pSegment.get(), pPause); + if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { + m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; + m_PauseStep = 2; + return JBIG2_SUCCESS; + } + if (nRet == JBIG2_END_OF_PAGE || nRet == JBIG2_END_OF_FILE) { + m_pSegment.reset(); + return JBIG2_SUCCESS; + } + if (nRet != JBIG2_SUCCESS) { + m_pSegment.reset(); + return nRet; + } + if (m_pSegment->m_dwData_length != 0xffffffff) { + m_dwOffset += m_pSegment->m_dwData_length; + m_pStream->setOffset(m_dwOffset); + } else { + m_pStream->offset(4); + } + m_SegmentList.push_back(std::move(m_pSegment)); + if (m_pStream->getByteLeft() > 0 && m_pPage && pPause && + pPause->NeedToPauseNow()) { + m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; + m_PauseStep = 2; + return JBIG2_SUCCESS; + } + } + return JBIG2_SUCCESS; +} + +int32_t CJBig2_Context::decode_EmbedOrgnazation(IFX_Pause* pPause) { + return decode_SquentialOrgnazation(pPause); +} + +int32_t CJBig2_Context::decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause) { + int32_t nRet; + while (m_pStream->getByteLeft() > JBIG2_MIN_SEGMENT_SIZE) { + std::unique_ptr pSegment(new CJBig2_Segment); + nRet = parseSegmentHeader(pSegment.get()); + if (nRet != JBIG2_SUCCESS) { + return nRet; + } else if (pSegment->m_cFlags.s.type == 51) { + break; + } + m_SegmentList.push_back(std::move(pSegment)); + if (pPause && m_pPause && pPause->NeedToPauseNow()) { + m_PauseStep = 3; + m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return JBIG2_SUCCESS; + } + } + m_nSegmentDecoded = 0; + return decode_RandomOrgnazation(pPause); +} + +int32_t CJBig2_Context::decode_RandomOrgnazation(IFX_Pause* pPause) { + for (; m_nSegmentDecoded < m_SegmentList.size(); ++m_nSegmentDecoded) { + int32_t nRet = + parseSegmentData(m_SegmentList[m_nSegmentDecoded].get(), pPause); + if (nRet == JBIG2_END_OF_PAGE || nRet == JBIG2_END_OF_FILE) + return JBIG2_SUCCESS; + + if (nRet != JBIG2_SUCCESS) + return nRet; + + if (m_pPage && pPause && pPause->NeedToPauseNow()) { + m_PauseStep = 4; + m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return JBIG2_SUCCESS; + } + } + return JBIG2_SUCCESS; +} + +int32_t CJBig2_Context::getFirstPage(uint8_t* pBuf, + int32_t width, + int32_t height, + int32_t stride, + IFX_Pause* pPause) { + int32_t nRet = 0; + if (m_pGlobalContext) { + nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause); + if (nRet != JBIG2_SUCCESS) { + m_ProcessingStatus = FXCODEC_STATUS_ERROR; + return nRet; + } + } + m_PauseStep = 0; + m_pPage = pdfium::MakeUnique(width, height, stride, pBuf); + m_bBufSpecified = true; + if (pPause && pPause->NeedToPauseNow()) { + m_PauseStep = 1; + m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return nRet; + } + return Continue(pPause); +} + +int32_t CJBig2_Context::Continue(IFX_Pause* pPause) { + m_ProcessingStatus = FXCODEC_STATUS_DECODE_READY; + int32_t nRet = 0; + if (m_PauseStep <= 1) { + nRet = decode_EmbedOrgnazation(pPause); + } else if (m_PauseStep == 2) { + nRet = decode_SquentialOrgnazation(pPause); + } else if (m_PauseStep == 3) { + nRet = decode_RandomOrgnazation_FirstPage(pPause); + } else if (m_PauseStep == 4) { + nRet = decode_RandomOrgnazation(pPause); + } else if (m_PauseStep == 5) { + m_ProcessingStatus = FXCODEC_STATUS_DECODE_FINISH; + return JBIG2_SUCCESS; + } + if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { + return nRet; + } + m_PauseStep = 5; + if (!m_bBufSpecified && nRet == JBIG2_SUCCESS) { + m_ProcessingStatus = FXCODEC_STATUS_DECODE_FINISH; + return JBIG2_SUCCESS; + } + if (nRet == JBIG2_SUCCESS) { + m_ProcessingStatus = FXCODEC_STATUS_DECODE_FINISH; + } else { + m_ProcessingStatus = FXCODEC_STATUS_ERROR; + } + return nRet; +} + +CJBig2_Segment* CJBig2_Context::findSegmentByNumber(uint32_t dwNumber) { + if (m_pGlobalContext) { + CJBig2_Segment* pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber); + if (pSeg) { + return pSeg; + } + } + for (const auto& pSeg : m_SegmentList) { + if (pSeg->m_dwNumber == dwNumber) + return pSeg.get(); + } + return nullptr; +} + +CJBig2_Segment* CJBig2_Context::findReferredSegmentByTypeAndIndex( + CJBig2_Segment* pSegment, + uint8_t cType, + int32_t nIndex) { + int32_t count = 0; + for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) { + CJBig2_Segment* pSeg = + findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); + if (pSeg && pSeg->m_cFlags.s.type == cType) { + if (count == nIndex) + return pSeg; + ++count; + } + } + return nullptr; +} + +int32_t CJBig2_Context::parseSegmentHeader(CJBig2_Segment* pSegment) { + if (m_pStream->readInteger(&pSegment->m_dwNumber) != 0 || + m_pStream->read1Byte(&pSegment->m_cFlags.c) != 0) { + return JBIG2_ERROR_TOO_SHORT; + } + + uint32_t dwTemp; + uint8_t cTemp = m_pStream->getCurByte(); + if ((cTemp >> 5) == 7) { + if (m_pStream->readInteger( + (uint32_t*)&pSegment->m_nReferred_to_segment_count) != 0) { + return JBIG2_ERROR_TOO_SHORT; + } + pSegment->m_nReferred_to_segment_count &= 0x1fffffff; + if (pSegment->m_nReferred_to_segment_count > + JBIG2_MAX_REFERRED_SEGMENT_COUNT) { + return JBIG2_ERROR_LIMIT; + } + dwTemp = 5 + 4 + (pSegment->m_nReferred_to_segment_count + 1) / 8; + } else { + if (m_pStream->read1Byte(&cTemp) != 0) + return JBIG2_ERROR_TOO_SHORT; + + pSegment->m_nReferred_to_segment_count = cTemp >> 5; + dwTemp = 5 + 1; + } + uint8_t cSSize = + pSegment->m_dwNumber > 65536 ? 4 : pSegment->m_dwNumber > 256 ? 2 : 1; + uint8_t cPSize = pSegment->m_cFlags.s.page_association_size ? 4 : 1; + if (pSegment->m_nReferred_to_segment_count) { + pSegment->m_pReferred_to_segment_numbers = + FX_Alloc(uint32_t, pSegment->m_nReferred_to_segment_count); + for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) { + switch (cSSize) { + case 1: + if (m_pStream->read1Byte(&cTemp) != 0) + return JBIG2_ERROR_TOO_SHORT; + + pSegment->m_pReferred_to_segment_numbers[i] = cTemp; + break; + case 2: + uint16_t wTemp; + if (m_pStream->readShortInteger(&wTemp) != 0) + return JBIG2_ERROR_TOO_SHORT; + + pSegment->m_pReferred_to_segment_numbers[i] = wTemp; + break; + case 4: + if (m_pStream->readInteger(&dwTemp) != 0) + return JBIG2_ERROR_TOO_SHORT; + + pSegment->m_pReferred_to_segment_numbers[i] = dwTemp; + break; + } + if (pSegment->m_pReferred_to_segment_numbers[i] >= pSegment->m_dwNumber) + return JBIG2_ERROR_TOO_SHORT; + } + } + if (cPSize == 1) { + if (m_pStream->read1Byte(&cTemp) != 0) + return JBIG2_ERROR_TOO_SHORT; + pSegment->m_dwPage_association = cTemp; + } else { + if (m_pStream->readInteger(&pSegment->m_dwPage_association) != 0) { + return JBIG2_ERROR_TOO_SHORT; + } + } + if (m_pStream->readInteger(&pSegment->m_dwData_length) != 0) + return JBIG2_ERROR_TOO_SHORT; + + pSegment->m_dwObjNum = m_pStream->getObjNum(); + pSegment->m_dwDataOffset = m_pStream->getOffset(); + pSegment->m_State = JBIG2_SEGMENT_DATA_UNPARSED; + return JBIG2_SUCCESS; +} + +int32_t CJBig2_Context::parseSegmentData(CJBig2_Segment* pSegment, + IFX_Pause* pPause) { + int32_t ret = ProcessingParseSegmentData(pSegment, pPause); + while (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE && + m_pStream->getByteLeft() > 0) { + ret = ProcessingParseSegmentData(pSegment, pPause); + } + return ret; +} + +int32_t CJBig2_Context::ProcessingParseSegmentData(CJBig2_Segment* pSegment, + IFX_Pause* pPause) { + switch (pSegment->m_cFlags.s.type) { + case 0: + return parseSymbolDict(pSegment, pPause); + case 4: + case 6: + case 7: + if (!m_bInPage) + return JBIG2_ERROR_FATAL; + return parseTextRegion(pSegment); + case 16: + return parsePatternDict(pSegment, pPause); + case 20: + case 22: + case 23: + if (!m_bInPage) + return JBIG2_ERROR_FATAL; + return parseHalftoneRegion(pSegment, pPause); + case 36: + case 38: + case 39: + if (!m_bInPage) + return JBIG2_ERROR_FATAL; + return parseGenericRegion(pSegment, pPause); + case 40: + case 42: + case 43: + if (!m_bInPage) + return JBIG2_ERROR_FATAL; + return parseGenericRefinementRegion(pSegment); + case 48: { + uint16_t wTemp; + std::unique_ptr pPageInfo(new JBig2PageInfo); + if (m_pStream->readInteger(&pPageInfo->m_dwWidth) != 0 || + m_pStream->readInteger(&pPageInfo->m_dwHeight) != 0 || + m_pStream->readInteger(&pPageInfo->m_dwResolutionX) != 0 || + m_pStream->readInteger(&pPageInfo->m_dwResolutionY) != 0 || + m_pStream->read1Byte(&pPageInfo->m_cFlags) != 0 || + m_pStream->readShortInteger(&wTemp) != 0) { + return JBIG2_ERROR_TOO_SHORT; + } + pPageInfo->m_bIsStriped = !!(wTemp & 0x8000); + pPageInfo->m_wMaxStripeSize = wTemp & 0x7fff; + bool bMaxHeight = (pPageInfo->m_dwHeight == 0xffffffff); + if (bMaxHeight && pPageInfo->m_bIsStriped != true) + pPageInfo->m_bIsStriped = true; + + if (!m_bBufSpecified) { + uint32_t height = + bMaxHeight ? pPageInfo->m_wMaxStripeSize : pPageInfo->m_dwHeight; + m_pPage = + pdfium::MakeUnique(pPageInfo->m_dwWidth, height); + } + + if (!m_pPage->m_pData) { + m_ProcessingStatus = FXCODEC_STATUS_ERROR; + return JBIG2_ERROR_TOO_SHORT; + } + + m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0); + m_PageInfoList.push_back(std::move(pPageInfo)); + m_bInPage = true; + } break; + case 49: + m_bInPage = false; + return JBIG2_END_OF_PAGE; + break; + case 50: + m_pStream->offset(pSegment->m_dwData_length); + break; + case 51: + return JBIG2_END_OF_FILE; + case 52: + m_pStream->offset(pSegment->m_dwData_length); + break; + case 53: + return parseTable(pSegment); + case 62: + m_pStream->offset(pSegment->m_dwData_length); + break; + default: + break; + } + return JBIG2_SUCCESS; +} + +int32_t CJBig2_Context::parseSymbolDict(CJBig2_Segment* pSegment, + IFX_Pause* pPause) { + uint16_t wFlags; + if (m_pStream->readShortInteger(&wFlags) != 0) + return JBIG2_ERROR_TOO_SHORT; + + std::unique_ptr pSymbolDictDecoder(new CJBig2_SDDProc); + pSymbolDictDecoder->SDHUFF = wFlags & 0x0001; + pSymbolDictDecoder->SDREFAGG = (wFlags >> 1) & 0x0001; + pSymbolDictDecoder->SDTEMPLATE = (wFlags >> 10) & 0x0003; + pSymbolDictDecoder->SDRTEMPLATE = !!((wFlags >> 12) & 0x0003); + uint8_t cSDHUFFDH = (wFlags >> 2) & 0x0003; + uint8_t cSDHUFFDW = (wFlags >> 4) & 0x0003; + uint8_t cSDHUFFBMSIZE = (wFlags >> 6) & 0x0001; + uint8_t cSDHUFFAGGINST = (wFlags >> 7) & 0x0001; + if (pSymbolDictDecoder->SDHUFF == 0) { + const uint32_t dwTemp = (pSymbolDictDecoder->SDTEMPLATE == 0) ? 8 : 2; + for (uint32_t i = 0; i < dwTemp; ++i) { + if (m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDAT[i]) != 0) + return JBIG2_ERROR_TOO_SHORT; + } + } + if (pSymbolDictDecoder->SDREFAGG == 1 && !pSymbolDictDecoder->SDRTEMPLATE) { + for (int32_t i = 0; i < 4; ++i) { + if (m_pStream->read1Byte((uint8_t*)&pSymbolDictDecoder->SDRAT[i]) != 0) + return JBIG2_ERROR_TOO_SHORT; + } + } + if (m_pStream->readInteger(&pSymbolDictDecoder->SDNUMEXSYMS) != 0 || + m_pStream->readInteger(&pSymbolDictDecoder->SDNUMNEWSYMS) != 0) { + return JBIG2_ERROR_TOO_SHORT; + } + if (pSymbolDictDecoder->SDNUMEXSYMS > JBIG2_MAX_EXPORT_SYSMBOLS || + pSymbolDictDecoder->SDNUMNEWSYMS > JBIG2_MAX_NEW_SYSMBOLS) { + return JBIG2_ERROR_LIMIT; + } + for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) { + if (!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) + return JBIG2_ERROR_FATAL; + } + CJBig2_Segment* pLRSeg = nullptr; + pSymbolDictDecoder->SDNUMINSYMS = 0; + for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) { + CJBig2_Segment* pSeg = + findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); + if (pSeg->m_cFlags.s.type == 0) { + pSymbolDictDecoder->SDNUMINSYMS += pSeg->m_Result.sd->NumImages(); + pLRSeg = pSeg; + } + } + + std::unique_ptr SDINSYMS; + if (pSymbolDictDecoder->SDNUMINSYMS != 0) { + SDINSYMS.reset(FX_Alloc(CJBig2_Image*, pSymbolDictDecoder->SDNUMINSYMS)); + uint32_t dwTemp = 0; + for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) { + CJBig2_Segment* pSeg = + findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); + if (pSeg->m_cFlags.s.type == 0) { + const CJBig2_SymbolDict& dict = *pSeg->m_Result.sd; + for (size_t j = 0; j < dict.NumImages(); ++j) + SDINSYMS.get()[dwTemp + j] = dict.GetImage(j); + dwTemp += dict.NumImages(); + } + } + } + pSymbolDictDecoder->SDINSYMS = SDINSYMS.get(); + + std::unique_ptr Table_B1; + std::unique_ptr Table_B2; + std::unique_ptr Table_B3; + std::unique_ptr Table_B4; + std::unique_ptr Table_B5; + if (pSymbolDictDecoder->SDHUFF == 1) { + if (cSDHUFFDH == 2 || cSDHUFFDW == 2) + return JBIG2_ERROR_FATAL; + + int32_t nIndex = 0; + if (cSDHUFFDH == 0) { + Table_B4 = pdfium::MakeUnique( + HuffmanTable_B4, HuffmanTable_B4_Size, HuffmanTable_HTOOB_B4); + pSymbolDictDecoder->SDHUFFDH = Table_B4.get(); + } else if (cSDHUFFDH == 1) { + Table_B5 = pdfium::MakeUnique( + HuffmanTable_B5, HuffmanTable_B5_Size, HuffmanTable_HTOOB_B5); + pSymbolDictDecoder->SDHUFFDH = Table_B5.get(); + } else { + CJBig2_Segment* pSeg = + findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); + if (!pSeg) + return JBIG2_ERROR_FATAL; + pSymbolDictDecoder->SDHUFFDH = pSeg->m_Result.ht; + } + if (cSDHUFFDW == 0) { + Table_B2 = pdfium::MakeUnique( + HuffmanTable_B2, HuffmanTable_B2_Size, HuffmanTable_HTOOB_B2); + pSymbolDictDecoder->SDHUFFDW = Table_B2.get(); + } else if (cSDHUFFDW == 1) { + Table_B3 = pdfium::MakeUnique( + HuffmanTable_B3, HuffmanTable_B3_Size, HuffmanTable_HTOOB_B3); + pSymbolDictDecoder->SDHUFFDW = Table_B3.get(); + } else { + CJBig2_Segment* pSeg = + findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); + if (!pSeg) + return JBIG2_ERROR_FATAL; + pSymbolDictDecoder->SDHUFFDW = pSeg->m_Result.ht; + } + if (cSDHUFFBMSIZE == 0) { + Table_B1 = pdfium::MakeUnique( + HuffmanTable_B1, HuffmanTable_B1_Size, HuffmanTable_HTOOB_B1); + pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1.get(); + } else { + CJBig2_Segment* pSeg = + findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); + if (!pSeg) + return JBIG2_ERROR_FATAL; + pSymbolDictDecoder->SDHUFFBMSIZE = pSeg->m_Result.ht; + } + if (pSymbolDictDecoder->SDREFAGG == 1) { + if (cSDHUFFAGGINST == 0) { + if (!Table_B1) { + Table_B1 = pdfium::MakeUnique( + HuffmanTable_B1, HuffmanTable_B1_Size, HuffmanTable_HTOOB_B1); + } + pSymbolDictDecoder->SDHUFFAGGINST = Table_B1.get(); + } else { + CJBig2_Segment* pSeg = + findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); + if (!pSeg) + return JBIG2_ERROR_FATAL; + pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht; + } + } + } + + const bool bUseGbContext = (pSymbolDictDecoder->SDHUFF == 0); + const bool bUseGrContext = (pSymbolDictDecoder->SDREFAGG == 1); + const size_t gbContextSize = + GetHuffContextSize(pSymbolDictDecoder->SDTEMPLATE); + const size_t grContextSize = + GetRefAggContextSize(pSymbolDictDecoder->SDRTEMPLATE); + std::vector gbContext; + std::vector grContext; + if ((wFlags & 0x0100) && pLRSeg) { + if (bUseGbContext) { + gbContext = pLRSeg->m_Result.sd->GbContext(); + if (gbContext.size() != gbContextSize) + return JBIG2_ERROR_FATAL; + } + if (bUseGrContext) { + grContext = pLRSeg->m_Result.sd->GrContext(); + if (grContext.size() != grContextSize) + return JBIG2_ERROR_FATAL; + } + } else { + if (bUseGbContext) + gbContext.resize(gbContextSize); + if (bUseGrContext) + grContext.resize(grContextSize); + } + + CJBig2_CacheKey key = + CJBig2_CacheKey(pSegment->m_dwObjNum, pSegment->m_dwDataOffset); + bool cache_hit = false; + pSegment->m_nResultType = JBIG2_SYMBOL_DICT_POINTER; + if (m_bIsGlobal && key.first != 0) { + for (auto it = m_pSymbolDictCache->begin(); it != m_pSymbolDictCache->end(); + ++it) { + if (it->first == key) { + std::unique_ptr copy(it->second->DeepCopy()); + pSegment->m_Result.sd = copy.release(); + m_pSymbolDictCache->push_front( + CJBig2_CachePair(key, std::move(it->second))); + m_pSymbolDictCache->erase(it); + cache_hit = true; + break; + } + } + } + if (!cache_hit) { + if (bUseGbContext) { + std::unique_ptr pArithDecoder( + new CJBig2_ArithDecoder(m_pStream.get())); + pSegment->m_Result.sd = pSymbolDictDecoder->decode_Arith( + pArithDecoder.get(), &gbContext, &grContext); + if (!pSegment->m_Result.sd) + return JBIG2_ERROR_FATAL; + + m_pStream->alignByte(); + m_pStream->offset(2); + } else { + pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman( + m_pStream.get(), &gbContext, &grContext, pPause); + if (!pSegment->m_Result.sd) + return JBIG2_ERROR_FATAL; + m_pStream->alignByte(); + } + if (m_bIsGlobal) { + std::unique_ptr value = + pSegment->m_Result.sd->DeepCopy(); + int size = pdfium::CollectionSize(*m_pSymbolDictCache); + while (size >= kSymbolDictCacheMaxSize) { + m_pSymbolDictCache->pop_back(); + --size; + } + m_pSymbolDictCache->push_front(CJBig2_CachePair(key, std::move(value))); + } + } + if (wFlags & 0x0200) { + if (bUseGbContext) + pSegment->m_Result.sd->SetGbContext(gbContext); + if (bUseGrContext) + pSegment->m_Result.sd->SetGrContext(grContext); + } + return JBIG2_SUCCESS; +} + +int32_t CJBig2_Context::parseTextRegion(CJBig2_Segment* pSegment) { + uint16_t wFlags; + JBig2RegionInfo ri; + if (parseRegionInfo(&ri) != JBIG2_SUCCESS || + m_pStream->readShortInteger(&wFlags) != 0) { + return JBIG2_ERROR_TOO_SHORT; + } + + std::unique_ptr pTRD(new CJBig2_TRDProc); + pTRD->SBW = ri.width; + pTRD->SBH = ri.height; + pTRD->SBHUFF = wFlags & 0x0001; + pTRD->SBREFINE = (wFlags >> 1) & 0x0001; + uint32_t dwTemp = (wFlags >> 2) & 0x0003; + pTRD->SBSTRIPS = 1 << dwTemp; + pTRD->REFCORNER = (JBig2Corner)((wFlags >> 4) & 0x0003); + pTRD->TRANSPOSED = (wFlags >> 6) & 0x0001; + pTRD->SBCOMBOP = (JBig2ComposeOp)((wFlags >> 7) & 0x0003); + pTRD->SBDEFPIXEL = (wFlags >> 9) & 0x0001; + pTRD->SBDSOFFSET = (wFlags >> 10) & 0x001f; + if (pTRD->SBDSOFFSET >= 0x0010) { + pTRD->SBDSOFFSET = pTRD->SBDSOFFSET - 0x0020; + } + pTRD->SBRTEMPLATE = !!((wFlags >> 15) & 0x0001); + + uint8_t cSBHUFFFS = 0; + uint8_t cSBHUFFDS = 0; + uint8_t cSBHUFFDT = 0; + uint8_t cSBHUFFRDW = 0; + uint8_t cSBHUFFRDH = 0; + uint8_t cSBHUFFRDX = 0; + uint8_t cSBHUFFRDY = 0; + uint8_t cSBHUFFRSIZE = 0; + if (pTRD->SBHUFF == 1) { + if (m_pStream->readShortInteger(&wFlags) != 0) + return JBIG2_ERROR_TOO_SHORT; + + cSBHUFFFS = wFlags & 0x0003; + cSBHUFFDS = (wFlags >> 2) & 0x0003; + cSBHUFFDT = (wFlags >> 4) & 0x0003; + cSBHUFFRDW = (wFlags >> 6) & 0x0003; + cSBHUFFRDH = (wFlags >> 8) & 0x0003; + cSBHUFFRDX = (wFlags >> 10) & 0x0003; + cSBHUFFRDY = (wFlags >> 12) & 0x0003; + cSBHUFFRSIZE = (wFlags >> 14) & 0x0001; + } + if (pTRD->SBREFINE == 1 && !pTRD->SBRTEMPLATE) { + for (int32_t i = 0; i < 4; ++i) { + if (m_pStream->read1Byte((uint8_t*)&pTRD->SBRAT[i]) != 0) + return JBIG2_ERROR_TOO_SHORT; + } + } + if (m_pStream->readInteger(&pTRD->SBNUMINSTANCES) != 0) + return JBIG2_ERROR_TOO_SHORT; + + for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) { + if (!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) + return JBIG2_ERROR_FATAL; + } + + pTRD->SBNUMSYMS = 0; + for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) { + CJBig2_Segment* pSeg = + findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); + if (pSeg->m_cFlags.s.type == 0) { + pTRD->SBNUMSYMS += pSeg->m_Result.sd->NumImages(); + } + } + + std::unique_ptr SBSYMS; + if (pTRD->SBNUMSYMS > 0) { + SBSYMS.reset(FX_Alloc(CJBig2_Image*, pTRD->SBNUMSYMS)); + dwTemp = 0; + for (int32_t i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) { + CJBig2_Segment* pSeg = + findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]); + if (pSeg->m_cFlags.s.type == 0) { + const CJBig2_SymbolDict& dict = *pSeg->m_Result.sd; + for (size_t j = 0; j < dict.NumImages(); ++j) + SBSYMS.get()[dwTemp + j] = dict.GetImage(j); + dwTemp += dict.NumImages(); + } + } + pTRD->SBSYMS = SBSYMS.get(); + } else { + pTRD->SBSYMS = nullptr; + } + + std::unique_ptr SBSYMCODES; + if (pTRD->SBHUFF == 1) { + SBSYMCODES.reset( + decodeSymbolIDHuffmanTable(m_pStream.get(), pTRD->SBNUMSYMS)); + if (!SBSYMCODES) + return JBIG2_ERROR_FATAL; + + m_pStream->alignByte(); + pTRD->SBSYMCODES = SBSYMCODES.get(); + } else { + dwTemp = 0; + while ((uint32_t)(1 << dwTemp) < pTRD->SBNUMSYMS) { + ++dwTemp; + } + pTRD->SBSYMCODELEN = (uint8_t)dwTemp; + } + + std::unique_ptr Table_B1; + std::unique_ptr Table_B6; + std::unique_ptr Table_B7; + std::unique_ptr Table_B8; + std::unique_ptr Table_B9; + std::unique_ptr Table_B10; + std::unique_ptr Table_B11; + std::unique_ptr Table_B12; + std::unique_ptr Table_B13; + std::unique_ptr Table_B14; + std::unique_ptr Table_B15; + if (pTRD->SBHUFF == 1) { + if (cSBHUFFFS == 2 || cSBHUFFRDW == 2 || cSBHUFFRDH == 2 || + cSBHUFFRDX == 2 || cSBHUFFRDY == 2) { + return JBIG2_ERROR_FATAL; + } + int32_t nIndex = 0; + if (cSBHUFFFS == 0) { + Table_B6 = pdfium::MakeUnique( + HuffmanTable_B6, HuffmanTable_B6_Size, HuffmanTable_HTOOB_B6); + pTRD->SBHUFFFS = Table_B6.get(); + } else if (cSBHUFFFS == 1) { + Table_B7 = pdfium::MakeUnique( + HuffmanTable_B7, HuffmanTable_B7_Size, HuffmanTable_HTOOB_B7); + pTRD->SBHUFFFS = Table_B7.get(); + } else { + CJBig2_Segment* pSeg = + findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); + if (!pSeg) + return JBIG2_ERROR_FATAL; + pTRD->SBHUFFFS = pSeg->m_Result.ht; + } + if (cSBHUFFDS == 0) { + Table_B8 = pdfium::MakeUnique( + HuffmanTable_B8, HuffmanTable_B8_Size, HuffmanTable_HTOOB_B8); + pTRD->SBHUFFDS = Table_B8.get(); + } else if (cSBHUFFDS == 1) { + Table_B9 = pdfium::MakeUnique( + HuffmanTable_B9, HuffmanTable_B9_Size, HuffmanTable_HTOOB_B9); + pTRD->SBHUFFDS = Table_B9.get(); + } else if (cSBHUFFDS == 2) { + Table_B10 = pdfium::MakeUnique( + HuffmanTable_B10, HuffmanTable_B10_Size, HuffmanTable_HTOOB_B10); + pTRD->SBHUFFDS = Table_B10.get(); + } else { + CJBig2_Segment* pSeg = + findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); + if (!pSeg) + return JBIG2_ERROR_FATAL; + pTRD->SBHUFFDS = pSeg->m_Result.ht; + } + if (cSBHUFFDT == 0) { + Table_B11 = pdfium::MakeUnique( + HuffmanTable_B11, HuffmanTable_B11_Size, HuffmanTable_HTOOB_B11); + pTRD->SBHUFFDT = Table_B11.get(); + } else if (cSBHUFFDT == 1) { + Table_B12 = pdfium::MakeUnique( + HuffmanTable_B12, HuffmanTable_B12_Size, HuffmanTable_HTOOB_B12); + pTRD->SBHUFFDT = Table_B12.get(); + } else if (cSBHUFFDT == 2) { + Table_B13 = pdfium::MakeUnique( + HuffmanTable_B13, HuffmanTable_B13_Size, HuffmanTable_HTOOB_B13); + pTRD->SBHUFFDT = Table_B13.get(); + } else { + CJBig2_Segment* pSeg = + findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); + if (!pSeg) + return JBIG2_ERROR_FATAL; + pTRD->SBHUFFDT = pSeg->m_Result.ht; + } + if (cSBHUFFRDW == 0) { + Table_B14 = pdfium::MakeUnique( + HuffmanTable_B14, HuffmanTable_B14_Size, HuffmanTable_HTOOB_B14); + pTRD->SBHUFFRDW = Table_B14.get(); + } else if (cSBHUFFRDW == 1) { + Table_B15 = pdfium::MakeUnique( + HuffmanTable_B15, HuffmanTable_B15_Size, HuffmanTable_HTOOB_B15); + pTRD->SBHUFFRDW = Table_B15.get(); + } else { + CJBig2_Segment* pSeg = + findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); + if (!pSeg) + return JBIG2_ERROR_FATAL; + pTRD->SBHUFFRDW = pSeg->m_Result.ht; + } + if (cSBHUFFRDH == 0) { + if (!Table_B14) { + Table_B14 = pdfium::MakeUnique( + HuffmanTable_B14, HuffmanTable_B14_Size, HuffmanTable_HTOOB_B14); + } + pTRD->SBHUFFRDH = Table_B14.get(); + } else if (cSBHUFFRDH == 1) { + if (!Table_B15) { + Table_B15 = pdfium::MakeUnique( + HuffmanTable_B15, HuffmanTable_B15_Size, HuffmanTable_HTOOB_B15); + } + pTRD->SBHUFFRDH = Table_B15.get(); + } else { + CJBig2_Segment* pSeg = + findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); + if (!pSeg) + return JBIG2_ERROR_FATAL; + pTRD->SBHUFFRDH = pSeg->m_Result.ht; + } + if (cSBHUFFRDX == 0) { + if (!Table_B14) { + Table_B14 = pdfium::MakeUnique( + HuffmanTable_B14, HuffmanTable_B14_Size, HuffmanTable_HTOOB_B14); + } + pTRD->SBHUFFRDX = Table_B14.get(); + } else if (cSBHUFFRDX == 1) { + if (!Table_B15) { + Table_B15 = pdfium::MakeUnique( + HuffmanTable_B15, HuffmanTable_B15_Size, HuffmanTable_HTOOB_B15); + } + pTRD->SBHUFFRDX = Table_B15.get(); + } else { + CJBig2_Segment* pSeg = + findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); + if (!pSeg) + return JBIG2_ERROR_FATAL; + pTRD->SBHUFFRDX = pSeg->m_Result.ht; + } + if (cSBHUFFRDY == 0) { + if (!Table_B14) { + Table_B14 = pdfium::MakeUnique( + HuffmanTable_B14, HuffmanTable_B14_Size, HuffmanTable_HTOOB_B14); + } + pTRD->SBHUFFRDY = Table_B14.get(); + } else if (cSBHUFFRDY == 1) { + if (!Table_B15) { + Table_B15 = pdfium::MakeUnique( + HuffmanTable_B15, HuffmanTable_B15_Size, HuffmanTable_HTOOB_B15); + } + pTRD->SBHUFFRDY = Table_B15.get(); + } else { + CJBig2_Segment* pSeg = + findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); + if (!pSeg) + return JBIG2_ERROR_FATAL; + pTRD->SBHUFFRDY = pSeg->m_Result.ht; + } + if (cSBHUFFRSIZE == 0) { + Table_B1 = pdfium::MakeUnique( + HuffmanTable_B1, HuffmanTable_B1_Size, HuffmanTable_HTOOB_B1); + pTRD->SBHUFFRSIZE = Table_B1.get(); + } else { + CJBig2_Segment* pSeg = + findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++); + if (!pSeg) + return JBIG2_ERROR_FATAL; + pTRD->SBHUFFRSIZE = pSeg->m_Result.ht; + } + } + std::unique_ptr grContext; + if (pTRD->SBREFINE == 1) { + const size_t size = GetRefAggContextSize(pTRD->SBRTEMPLATE); + grContext.reset(FX_Alloc(JBig2ArithCtx, size)); + JBIG2_memset(grContext.get(), 0, sizeof(JBig2ArithCtx) * size); + } + if (pTRD->SBHUFF == 0) { + std::unique_ptr pArithDecoder( + new CJBig2_ArithDecoder(m_pStream.get())); + pSegment->m_nResultType = JBIG2_IMAGE_POINTER; + pSegment->m_Result.im = + pTRD->decode_Arith(pArithDecoder.get(), grContext.get(), nullptr); + if (!pSegment->m_Result.im) + return JBIG2_ERROR_FATAL; + m_pStream->alignByte(); + m_pStream->offset(2); + } else { + pSegment->m_nResultType = JBIG2_IMAGE_POINTER; + pSegment->m_Result.im = + pTRD->decode_Huffman(m_pStream.get(), grContext.get()); + if (!pSegment->m_Result.im) + return JBIG2_ERROR_FATAL; + m_pStream->alignByte(); + } + if (pSegment->m_cFlags.s.type != 4) { + if (!m_bBufSpecified) { + const auto& pPageInfo = m_PageInfoList.back(); + if ((pPageInfo->m_bIsStriped == 1) && + (ri.y + ri.height > m_pPage->height())) { + m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); + } + } + m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, + (JBig2ComposeOp)(ri.flags & 0x03)); + delete pSegment->m_Result.im; + pSegment->m_Result.im = nullptr; + } + return JBIG2_SUCCESS; +} + +int32_t CJBig2_Context::parsePatternDict(CJBig2_Segment* pSegment, + IFX_Pause* pPause) { + uint8_t cFlags; + std::unique_ptr pPDD(new CJBig2_PDDProc); + if (m_pStream->read1Byte(&cFlags) != 0 || + m_pStream->read1Byte(&pPDD->HDPW) != 0 || + m_pStream->read1Byte(&pPDD->HDPH) != 0 || + m_pStream->readInteger(&pPDD->GRAYMAX) != 0) { + return JBIG2_ERROR_TOO_SHORT; + } + if (pPDD->GRAYMAX > JBIG2_MAX_PATTERN_INDEX) + return JBIG2_ERROR_LIMIT; + + pPDD->HDMMR = cFlags & 0x01; + pPDD->HDTEMPLATE = (cFlags >> 1) & 0x03; + pSegment->m_nResultType = JBIG2_PATTERN_DICT_POINTER; + if (pPDD->HDMMR == 0) { + const size_t size = GetHuffContextSize(pPDD->HDTEMPLATE); + std::unique_ptr gbContext( + FX_Alloc(JBig2ArithCtx, size)); + JBIG2_memset(gbContext.get(), 0, sizeof(JBig2ArithCtx) * size); + std::unique_ptr pArithDecoder( + new CJBig2_ArithDecoder(m_pStream.get())); + pSegment->m_Result.pd = + pPDD->decode_Arith(pArithDecoder.get(), gbContext.get(), pPause); + if (!pSegment->m_Result.pd) + return JBIG2_ERROR_FATAL; + + m_pStream->alignByte(); + m_pStream->offset(2); + } else { + pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream.get(), pPause); + if (!pSegment->m_Result.pd) + return JBIG2_ERROR_FATAL; + m_pStream->alignByte(); + } + return JBIG2_SUCCESS; +} + +int32_t CJBig2_Context::parseHalftoneRegion(CJBig2_Segment* pSegment, + IFX_Pause* pPause) { + uint8_t cFlags; + JBig2RegionInfo ri; + std::unique_ptr pHRD(new CJBig2_HTRDProc); + if (parseRegionInfo(&ri) != JBIG2_SUCCESS || + m_pStream->read1Byte(&cFlags) != 0 || + m_pStream->readInteger(&pHRD->HGW) != 0 || + m_pStream->readInteger(&pHRD->HGH) != 0 || + m_pStream->readInteger((uint32_t*)&pHRD->HGX) != 0 || + m_pStream->readInteger((uint32_t*)&pHRD->HGY) != 0 || + m_pStream->readShortInteger(&pHRD->HRX) != 0 || + m_pStream->readShortInteger(&pHRD->HRY) != 0) { + return JBIG2_ERROR_TOO_SHORT; + } + + if (pHRD->HGW == 0 || pHRD->HGH == 0) + return JBIG2_ERROR_FATAL; + + pHRD->HBW = ri.width; + pHRD->HBH = ri.height; + pHRD->HMMR = cFlags & 0x01; + pHRD->HTEMPLATE = (cFlags >> 1) & 0x03; + pHRD->HENABLESKIP = (cFlags >> 3) & 0x01; + pHRD->HCOMBOP = (JBig2ComposeOp)((cFlags >> 4) & 0x07); + pHRD->HDEFPIXEL = (cFlags >> 7) & 0x01; + if (pSegment->m_nReferred_to_segment_count != 1) + return JBIG2_ERROR_FATAL; + + CJBig2_Segment* pSeg = + findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]); + if (!pSeg || (pSeg->m_cFlags.s.type != 16)) + return JBIG2_ERROR_FATAL; + + CJBig2_PatternDict* pPatternDict = pSeg->m_Result.pd; + if (!pPatternDict || (pPatternDict->NUMPATS == 0)) + return JBIG2_ERROR_FATAL; + + pHRD->HNUMPATS = pPatternDict->NUMPATS; + pHRD->HPATS = pPatternDict->HDPATS; + pHRD->HPW = pPatternDict->HDPATS[0]->width(); + pHRD->HPH = pPatternDict->HDPATS[0]->height(); + pSegment->m_nResultType = JBIG2_IMAGE_POINTER; + if (pHRD->HMMR == 0) { + const size_t size = GetHuffContextSize(pHRD->HTEMPLATE); + std::unique_ptr gbContext( + FX_Alloc(JBig2ArithCtx, size)); + JBIG2_memset(gbContext.get(), 0, sizeof(JBig2ArithCtx) * size); + std::unique_ptr pArithDecoder( + new CJBig2_ArithDecoder(m_pStream.get())); + pSegment->m_Result.im = + pHRD->decode_Arith(pArithDecoder.get(), gbContext.get(), pPause); + if (!pSegment->m_Result.im) + return JBIG2_ERROR_FATAL; + + m_pStream->alignByte(); + m_pStream->offset(2); + } else { + pSegment->m_Result.im = pHRD->decode_MMR(m_pStream.get(), pPause); + if (!pSegment->m_Result.im) + return JBIG2_ERROR_FATAL; + m_pStream->alignByte(); + } + if (pSegment->m_cFlags.s.type != 20) { + if (!m_bBufSpecified) { + const auto& pPageInfo = m_PageInfoList.back(); + if (pPageInfo->m_bIsStriped == 1 && + ri.y + ri.height > m_pPage->height()) { + m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); + } + } + m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, + (JBig2ComposeOp)(ri.flags & 0x03)); + delete pSegment->m_Result.im; + pSegment->m_Result.im = nullptr; + } + return JBIG2_SUCCESS; +} + +int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment, + IFX_Pause* pPause) { + if (!m_pGRD) { + std::unique_ptr pGRD(new CJBig2_GRDProc); + uint8_t cFlags; + if (parseRegionInfo(&m_ri) != JBIG2_SUCCESS || + m_pStream->read1Byte(&cFlags) != 0) { + return JBIG2_ERROR_TOO_SHORT; + } + if (m_ri.height < 0 || m_ri.width < 0) + return JBIG2_FAILED; + + pGRD->GBW = m_ri.width; + pGRD->GBH = m_ri.height; + pGRD->MMR = cFlags & 0x01; + pGRD->GBTEMPLATE = (cFlags >> 1) & 0x03; + pGRD->TPGDON = (cFlags >> 3) & 0x01; + if (pGRD->MMR == 0) { + if (pGRD->GBTEMPLATE == 0) { + for (int32_t i = 0; i < 8; ++i) { + if (m_pStream->read1Byte((uint8_t*)&pGRD->GBAT[i]) != 0) { + return JBIG2_ERROR_TOO_SHORT; + } + } + } else { + for (int32_t i = 0; i < 2; ++i) { + if (m_pStream->read1Byte((uint8_t*)&pGRD->GBAT[i]) != 0) { + return JBIG2_ERROR_TOO_SHORT; + } + } + } + } + pGRD->USESKIP = 0; + m_pGRD = std::move(pGRD); + } + pSegment->m_nResultType = JBIG2_IMAGE_POINTER; + if (m_pGRD->MMR == 0) { + if (m_gbContext.empty()) { + const size_t size = GetHuffContextSize(m_pGRD->GBTEMPLATE); + m_gbContext.resize(size); + } + if (!m_pArithDecoder) { + m_pArithDecoder = + pdfium::MakeUnique(m_pStream.get()); + m_ProcessingStatus = m_pGRD->Start_decode_Arith(&pSegment->m_Result.im, + m_pArithDecoder.get(), + &m_gbContext[0], pPause); + } else { + m_ProcessingStatus = m_pGRD->Continue_decode(pPause); + } + if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { + if (pSegment->m_cFlags.s.type != 36) { + if (!m_bBufSpecified) { + const auto& pPageInfo = m_PageInfoList.back(); + if ((pPageInfo->m_bIsStriped == 1) && + (m_ri.y + m_ri.height > m_pPage->height())) { + m_pPage->expand(m_ri.y + m_ri.height, + (pPageInfo->m_cFlags & 4) ? 1 : 0); + } + } + FX_RECT Rect = m_pGRD->GetReplaceRect(); + m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, + pSegment->m_Result.im, + (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect); + } + return JBIG2_SUCCESS; + } else { + m_pArithDecoder.reset(); + m_gbContext.clear(); + if (!pSegment->m_Result.im) { + m_ProcessingStatus = FXCODEC_STATUS_ERROR; + m_pGRD.reset(); + return JBIG2_ERROR_FATAL; + } + m_pStream->alignByte(); + m_pStream->offset(2); + } + } else { + m_pGRD->Start_decode_MMR(&pSegment->m_Result.im, m_pStream.get(), pPause); + if (!pSegment->m_Result.im) { + m_pGRD.reset(); + return JBIG2_ERROR_FATAL; + } + m_pStream->alignByte(); + } + if (pSegment->m_cFlags.s.type != 36) { + if (!m_bBufSpecified) { + JBig2PageInfo* pPageInfo = m_PageInfoList.back().get(); + if ((pPageInfo->m_bIsStriped == 1) && + (m_ri.y + m_ri.height > m_pPage->height())) { + m_pPage->expand(m_ri.y + m_ri.height, + (pPageInfo->m_cFlags & 4) ? 1 : 0); + } + } + FX_RECT Rect = m_pGRD->GetReplaceRect(); + m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, + pSegment->m_Result.im, + (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect); + delete pSegment->m_Result.im; + pSegment->m_Result.im = nullptr; + } + m_pGRD.reset(); + return JBIG2_SUCCESS; +} + +int32_t CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment* pSegment) { + JBig2RegionInfo ri; + uint8_t cFlags; + if (parseRegionInfo(&ri) != JBIG2_SUCCESS || + m_pStream->read1Byte(&cFlags) != 0) { + return JBIG2_ERROR_TOO_SHORT; + } + std::unique_ptr pGRRD(new CJBig2_GRRDProc); + pGRRD->GRW = ri.width; + pGRRD->GRH = ri.height; + pGRRD->GRTEMPLATE = !!(cFlags & 0x01); + pGRRD->TPGRON = (cFlags >> 1) & 0x01; + if (!pGRRD->GRTEMPLATE) { + for (int32_t i = 0; i < 4; ++i) { + if (m_pStream->read1Byte((uint8_t*)&pGRRD->GRAT[i]) != 0) + return JBIG2_ERROR_TOO_SHORT; + } + } + CJBig2_Segment* pSeg = nullptr; + if (pSegment->m_nReferred_to_segment_count > 0) { + int32_t i; + for (i = 0; i < pSegment->m_nReferred_to_segment_count; ++i) { + pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]); + if (!pSeg) + return JBIG2_ERROR_FATAL; + + if (pSeg->m_cFlags.s.type == 4 || pSeg->m_cFlags.s.type == 20 || + pSeg->m_cFlags.s.type == 36 || pSeg->m_cFlags.s.type == 40) { + break; + } + } + if (i >= pSegment->m_nReferred_to_segment_count) + return JBIG2_ERROR_FATAL; + + pGRRD->GRREFERENCE = pSeg->m_Result.im; + } else { + pGRRD->GRREFERENCE = m_pPage.get(); + } + pGRRD->GRREFERENCEDX = 0; + pGRRD->GRREFERENCEDY = 0; + const size_t size = GetRefAggContextSize(pGRRD->GRTEMPLATE); + std::unique_ptr grContext( + FX_Alloc(JBig2ArithCtx, size)); + JBIG2_memset(grContext.get(), 0, sizeof(JBig2ArithCtx) * size); + std::unique_ptr pArithDecoder( + new CJBig2_ArithDecoder(m_pStream.get())); + pSegment->m_nResultType = JBIG2_IMAGE_POINTER; + pSegment->m_Result.im = pGRRD->decode(pArithDecoder.get(), grContext.get()); + if (!pSegment->m_Result.im) + return JBIG2_ERROR_FATAL; + + m_pStream->alignByte(); + m_pStream->offset(2); + if (pSegment->m_cFlags.s.type != 40) { + if (!m_bBufSpecified) { + JBig2PageInfo* pPageInfo = m_PageInfoList.back().get(); + if ((pPageInfo->m_bIsStriped == 1) && + (ri.y + ri.height > m_pPage->height())) { + m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0); + } + } + m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, + (JBig2ComposeOp)(ri.flags & 0x03)); + delete pSegment->m_Result.im; + pSegment->m_Result.im = nullptr; + } + return JBIG2_SUCCESS; +} + +int32_t CJBig2_Context::parseTable(CJBig2_Segment* pSegment) { + pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER; + pSegment->m_Result.ht = nullptr; + std::unique_ptr pHuff( + new CJBig2_HuffmanTable(m_pStream.get())); + if (!pHuff->IsOK()) + return JBIG2_ERROR_FATAL; + + pSegment->m_Result.ht = pHuff.release(); + m_pStream->alignByte(); + return JBIG2_SUCCESS; +} + +int32_t CJBig2_Context::parseRegionInfo(JBig2RegionInfo* pRI) { + if (m_pStream->readInteger((uint32_t*)&pRI->width) != 0 || + m_pStream->readInteger((uint32_t*)&pRI->height) != 0 || + m_pStream->readInteger((uint32_t*)&pRI->x) != 0 || + m_pStream->readInteger((uint32_t*)&pRI->y) != 0 || + m_pStream->read1Byte(&pRI->flags) != 0) { + return JBIG2_ERROR_TOO_SHORT; + } + return JBIG2_SUCCESS; +} + +JBig2HuffmanCode* CJBig2_Context::decodeSymbolIDHuffmanTable( + CJBig2_BitStream* pStream, + uint32_t SBNUMSYMS) { + const size_t kRunCodesSize = 35; + int32_t runcodes[kRunCodesSize]; + int32_t runcodes_len[kRunCodesSize]; + for (size_t i = 0; i < kRunCodesSize; ++i) { + if (pStream->readNBits(4, &runcodes_len[i]) != 0) + return nullptr; + } + huffman_assign_code(runcodes, runcodes_len, kRunCodesSize); + + std::unique_ptr SBSYMCODES( + FX_Alloc(JBig2HuffmanCode, SBNUMSYMS)); + int32_t run = 0; + int32_t i = 0; + while (i < (int)SBNUMSYMS) { + size_t j; + int32_t nVal = 0; + int32_t nBits = 0; + uint32_t nTemp; + while (true) { + if (pStream->read1Bit(&nTemp) != 0) + return nullptr; + + nVal = (nVal << 1) | nTemp; + ++nBits; + for (j = 0; j < kRunCodesSize; ++j) { + if (nBits == runcodes_len[j] && nVal == runcodes[j]) + break; + } + if (j < kRunCodesSize) + break; + } + int32_t runcode = static_cast(j); + if (runcode < 32) { + SBSYMCODES.get()[i].codelen = runcode; + run = 0; + } else if (runcode == 32) { + if (pStream->readNBits(2, &nTemp) != 0) + return nullptr; + run = nTemp + 3; + } else if (runcode == 33) { + if (pStream->readNBits(3, &nTemp) != 0) + return nullptr; + run = nTemp + 3; + } else if (runcode == 34) { + if (pStream->readNBits(7, &nTemp) != 0) + return nullptr; + run = nTemp + 11; + } + if (run > 0) { + if (i + run > (int)SBNUMSYMS) + return nullptr; + for (int32_t k = 0; k < run; ++k) { + if (runcode == 32 && i > 0) { + SBSYMCODES.get()[i + k].codelen = SBSYMCODES.get()[i - 1].codelen; + } else { + SBSYMCODES.get()[i + k].codelen = 0; + } + } + i += run; + } else { + ++i; + } + } + huffman_assign_code(SBSYMCODES.get(), SBNUMSYMS); + return SBSYMCODES.release(); +} + +void CJBig2_Context::huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP) { + // TODO(thestig) CJBig2_HuffmanTable::parseFromCodedBuffer() has similar code. + int CURLEN, LENMAX, CURCODE, CURTEMP, i; + int* LENCOUNT; + int* FIRSTCODE; + LENMAX = 0; + for (i = 0; i < NTEMP; ++i) { + if (PREFLEN[i] > LENMAX) { + LENMAX = PREFLEN[i]; + } + } + LENCOUNT = FX_Alloc(int, LENMAX + 1); + JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1)); + FIRSTCODE = FX_Alloc(int, LENMAX + 1); + for (i = 0; i < NTEMP; ++i) { + ++LENCOUNT[PREFLEN[i]]; + } + CURLEN = 1; + FIRSTCODE[0] = 0; + LENCOUNT[0] = 0; + while (CURLEN <= LENMAX) { + FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1; + CURCODE = FIRSTCODE[CURLEN]; + CURTEMP = 0; + while (CURTEMP < NTEMP) { + if (PREFLEN[CURTEMP] == CURLEN) { + CODES[CURTEMP] = CURCODE; + CURCODE = CURCODE + 1; + } + CURTEMP = CURTEMP + 1; + } + CURLEN = CURLEN + 1; + } + FX_Free(LENCOUNT); + FX_Free(FIRSTCODE); +} + +void CJBig2_Context::huffman_assign_code(JBig2HuffmanCode* SBSYMCODES, + int NTEMP) { + int CURLEN, LENMAX, CURCODE, CURTEMP, i; + int* LENCOUNT; + int* FIRSTCODE; + LENMAX = 0; + for (i = 0; i < NTEMP; ++i) { + if (SBSYMCODES[i].codelen > LENMAX) { + LENMAX = SBSYMCODES[i].codelen; + } + } + LENCOUNT = FX_Alloc(int, (LENMAX + 1)); + JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1)); + FIRSTCODE = FX_Alloc(int, (LENMAX + 1)); + for (i = 0; i < NTEMP; ++i) { + ++LENCOUNT[SBSYMCODES[i].codelen]; + } + CURLEN = 1; + FIRSTCODE[0] = 0; + LENCOUNT[0] = 0; + while (CURLEN <= LENMAX) { + FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1; + CURCODE = FIRSTCODE[CURLEN]; + CURTEMP = 0; + while (CURTEMP < NTEMP) { + if (SBSYMCODES[CURTEMP].codelen == CURLEN) { + SBSYMCODES[CURTEMP].code = CURCODE; + CURCODE = CURCODE + 1; + } + CURTEMP = CURTEMP + 1; + } + CURLEN = CURLEN + 1; + } + FX_Free(LENCOUNT); + FX_Free(FIRSTCODE); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Context.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Context.h new file mode 100644 index 000000000000..cd44a82c61d6 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Context.h @@ -0,0 +1,110 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_CONTEXT_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_CONTEXT_H_ + +#include +#include +#include +#include + +#include "core/fpdfapi/parser/cpdf_object.h" +#include "core/fxcodec/fx_codec_def.h" +#include "core/fxcodec/jbig2/JBig2_Page.h" +#include "core/fxcodec/jbig2/JBig2_Segment.h" + +class CJBig2_ArithDecoder; +class CJBig2_GRDProc; +class CPDF_StreamAcc; +class IFX_Pause; + +// Cache is keyed by the ObjNum of a stream and an index within the stream. +using CJBig2_CacheKey = std::pair; +using CJBig2_CachePair = + std::pair>; + +#define JBIG2_SUCCESS 0 +#define JBIG2_FAILED -1 +#define JBIG2_ERROR_TOO_SHORT -2 +#define JBIG2_ERROR_FATAL -3 +#define JBIG2_END_OF_PAGE 2 +#define JBIG2_END_OF_FILE 3 +#define JBIG2_ERROR_FILE_FORMAT -4 +#define JBIG2_ERROR_STREAM_TYPE -5 +#define JBIG2_ERROR_LIMIT -6 +#define JBIG2_MIN_SEGMENT_SIZE 11 + +class CJBig2_Context { + public: + CJBig2_Context(CPDF_StreamAcc* pGlobalStream, + CPDF_StreamAcc* pSrcStream, + std::list* pSymbolDictCache, + IFX_Pause* pPause, + bool bIsGlobal); + ~CJBig2_Context(); + + int32_t getFirstPage(uint8_t* pBuf, + int32_t width, + int32_t height, + int32_t stride, + IFX_Pause* pPause); + + int32_t Continue(IFX_Pause* pPause); + FXCODEC_STATUS GetProcessingStatus() { return m_ProcessingStatus; } + + private: + int32_t decode_SquentialOrgnazation(IFX_Pause* pPause); + int32_t decode_EmbedOrgnazation(IFX_Pause* pPause); + int32_t decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause); + int32_t decode_RandomOrgnazation(IFX_Pause* pPause); + + CJBig2_Segment* findSegmentByNumber(uint32_t dwNumber); + CJBig2_Segment* findReferredSegmentByTypeAndIndex(CJBig2_Segment* pSegment, + uint8_t cType, + int32_t nIndex); + + int32_t parseSegmentHeader(CJBig2_Segment* pSegment); + int32_t parseSegmentData(CJBig2_Segment* pSegment, IFX_Pause* pPause); + int32_t ProcessingParseSegmentData(CJBig2_Segment* pSegment, + IFX_Pause* pPause); + int32_t parseSymbolDict(CJBig2_Segment* pSegment, IFX_Pause* pPause); + int32_t parseTextRegion(CJBig2_Segment* pSegment); + int32_t parsePatternDict(CJBig2_Segment* pSegment, IFX_Pause* pPause); + int32_t parseHalftoneRegion(CJBig2_Segment* pSegment, IFX_Pause* pPause); + int32_t parseGenericRegion(CJBig2_Segment* pSegment, IFX_Pause* pPause); + int32_t parseGenericRefinementRegion(CJBig2_Segment* pSegment); + int32_t parseTable(CJBig2_Segment* pSegment); + int32_t parseRegionInfo(JBig2RegionInfo* pRI); + + JBig2HuffmanCode* decodeSymbolIDHuffmanTable(CJBig2_BitStream* pStream, + uint32_t SBNUMSYMS); + + void huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP); + void huffman_assign_code(JBig2HuffmanCode* SBSYMCODES, int NTEMP); + + std::unique_ptr m_pGlobalContext; + std::unique_ptr m_pStream; + std::vector> m_SegmentList; + std::vector> m_PageInfoList; + std::unique_ptr m_pPage; + size_t m_nSegmentDecoded; + bool m_bInPage; + bool m_bBufSpecified; + int32_t m_PauseStep; + IFX_Pause* const m_pPause; + FXCODEC_STATUS m_ProcessingStatus; + std::vector m_gbContext; + std::unique_ptr m_pArithDecoder; + std::unique_ptr m_pGRD; + std::unique_ptr m_pSegment; + uint32_t m_dwOffset; + JBig2RegionInfo m_ri; + std::list* const m_pSymbolDictCache; + bool m_bIsGlobal; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_CONTEXT_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Define.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Define.h new file mode 100644 index 000000000000..86df248786b7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Define.h @@ -0,0 +1,36 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_DEFINE_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_DEFINE_H_ + +#include "core/fxcrt/fx_system.h" + +#define JBIG2_memset FXSYS_memset +#define JBIG2_memcmp FXSYS_memcmp +#define JBIG2_memcpy FXSYS_memcpy +#define JBIG2_OOB 1 + +struct JBig2RegionInfo { + int32_t width; + int32_t height; + int32_t x; + int32_t y; + uint8_t flags; +}; + +struct JBig2HuffmanCode { + int32_t codelen; + int32_t code; +}; + +#define JBIG2_MAX_REFERRED_SEGMENT_COUNT 64 +#define JBIG2_MAX_EXPORT_SYSMBOLS 65535 +#define JBIG2_MAX_NEW_SYSMBOLS 65535 +#define JBIG2_MAX_PATTERN_INDEX 65535 +#define JBIG2_MAX_IMAGE_SIZE 65535 + +#endif // CORE_FXCODEC_JBIG2_JBIG2_DEFINE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrdProc.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrdProc.cpp new file mode 100644 index 000000000000..8c6d58e5119e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrdProc.cpp @@ -0,0 +1,1164 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_GrdProc.h" + +#include + +#include "core/fxcodec/fx_codec.h" +#include "core/fxcodec/jbig2/JBig2_ArithDecoder.h" +#include "core/fxcodec/jbig2/JBig2_BitStream.h" +#include "core/fxcodec/jbig2/JBig2_Image.h" + +CJBig2_GRDProc::CJBig2_GRDProc() + : m_loopIndex(0), + m_pLine(nullptr), + m_pPause(nullptr), + m_DecodeType(0), + m_LTP(0) { + m_ReplaceRect.left = 0; + m_ReplaceRect.bottom = 0; + m_ReplaceRect.top = 0; + m_ReplaceRect.right = 0; +} + +bool CJBig2_GRDProc::UseTemplate0Opt3() const { + return (GBAT[0] == 3) && (GBAT[1] == -1) && (GBAT[2] == -3) && + (GBAT[3] == -1) && (GBAT[4] == 2) && (GBAT[5] == -2) && + (GBAT[6] == -2) && (GBAT[7] == -2); +} + +bool CJBig2_GRDProc::UseTemplate1Opt3() const { + return (GBAT[0] == 3) && (GBAT[1] == -1); +} + +bool CJBig2_GRDProc::UseTemplate23Opt3() const { + return (GBAT[0] == 2) && (GBAT[1] == -1); +} + +CJBig2_Image* CJBig2_GRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext) { + if (GBW == 0 || GBH == 0) + return new CJBig2_Image(GBW, GBH); + + if (GBTEMPLATE == 0) { + if (UseTemplate0Opt3()) + return decode_Arith_Template0_opt3(pArithDecoder, gbContext); + return decode_Arith_Template0_unopt(pArithDecoder, gbContext); + } else if (GBTEMPLATE == 1) { + if (UseTemplate1Opt3()) + return decode_Arith_Template1_opt3(pArithDecoder, gbContext); + return decode_Arith_Template1_unopt(pArithDecoder, gbContext); + } else if (GBTEMPLATE == 2) { + if (UseTemplate23Opt3()) + return decode_Arith_Template2_opt3(pArithDecoder, gbContext); + return decode_Arith_Template2_unopt(pArithDecoder, gbContext); + } else { + if (UseTemplate23Opt3()) + return decode_Arith_Template3_opt3(pArithDecoder, gbContext); + return decode_Arith_Template3_unopt(pArithDecoder, gbContext); + } +} +CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_opt3( + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext) { + std::unique_ptr GBREG(new CJBig2_Image(GBW, GBH)); + if (!GBREG->m_pData) + return nullptr; + + int LTP = 0; + uint8_t* pLine = GBREG->m_pData; + int32_t nStride = GBREG->stride(); + int32_t nStride2 = nStride << 1; + int32_t nLineBytes = ((GBW + 7) >> 3) - 1; + int32_t nBitsLeft = GBW - (nLineBytes << 3); + uint32_t height = GBH & 0x7fffffff; + for (uint32_t h = 0; h < height; h++) { + if (TPGDON) + LTP = LTP ^ pArithDecoder->DECODE(&gbContext[0x9b25]); + if (LTP) { + GBREG->copyLine(h, h - 1); + } else { + if (h > 1) { + uint8_t* pLine1 = pLine - nStride2; + uint8_t* pLine2 = pLine - nStride; + uint32_t line1 = (*pLine1++) << 6; + uint32_t line2 = *pLine2++; + uint32_t CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0)); + for (int32_t cc = 0; cc < nLineBytes; cc++) { + line1 = (line1 << 8) | ((*pLine1++) << 6); + line2 = (line2 << 8) | (*pLine2++); + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | + ((line1 >> k) & 0x0800) | ((line2 >> k) & 0x0010)); + } + pLine[cc] = cVal; + } + line1 <<= 8; + line2 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = + (((CONTEXT & 0x7bf7) << 1) | bVal | + ((line1 >> (7 - k)) & 0x0800) | ((line2 >> (7 - k)) & 0x0010)); + } + pLine[nLineBytes] = cVal1; + } else { + uint8_t* pLine2 = pLine - nStride; + uint32_t line2 = (h & 1) ? (*pLine2++) : 0; + uint32_t CONTEXT = (line2 & 0x07f0); + for (int32_t cc = 0; cc < nLineBytes; cc++) { + if (h & 1) { + line2 = (line2 << 8) | (*pLine2++); + } + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = + (((CONTEXT & 0x7bf7) << 1) | bVal | ((line2 >> k) & 0x0010)); + } + pLine[cc] = cVal; + } + line2 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | + (((line2 >> (7 - k))) & 0x0010)); + } + pLine[nLineBytes] = cVal1; + } + } + pLine += nStride; + } + return GBREG.release(); +} + +CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template0_unopt( + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext) { + int LTP = 0; + std::unique_ptr GBREG(new CJBig2_Image(GBW, GBH)); + GBREG->fill(0); + for (uint32_t h = 0; h < GBH; h++) { + if (TPGDON) + LTP = LTP ^ pArithDecoder->DECODE(&gbContext[0x9b25]); + if (LTP) { + GBREG->copyLine(h, h - 1); + } else { + uint32_t line1 = GBREG->getPixel(1, h - 2); + line1 |= GBREG->getPixel(0, h - 2) << 1; + uint32_t line2 = GBREG->getPixel(2, h - 1); + line2 |= GBREG->getPixel(1, h - 1) << 1; + line2 |= GBREG->getPixel(0, h - 1) << 2; + uint32_t line3 = 0; + for (uint32_t w = 0; w < GBW; w++) { + int bVal; + if (USESKIP && SKIP->getPixel(w, h)) { + bVal = 0; + } else { + uint32_t CONTEXT = line3; + CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; + CONTEXT |= line2 << 5; + CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10; + CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11; + CONTEXT |= line1 << 12; + CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15; + bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + } + if (bVal) { + GBREG->setPixel(w, h, bVal); + } + line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; + line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; + line3 = ((line3 << 1) | bVal) & 0x0f; + } + } + } + return GBREG.release(); +} + +CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_opt3( + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext) { + std::unique_ptr GBREG(new CJBig2_Image(GBW, GBH)); + if (!GBREG->m_pData) + return nullptr; + + int LTP = 0; + uint8_t* pLine = GBREG->m_pData; + int32_t nStride = GBREG->stride(); + int32_t nStride2 = nStride << 1; + int32_t nLineBytes = ((GBW + 7) >> 3) - 1; + int32_t nBitsLeft = GBW - (nLineBytes << 3); + for (uint32_t h = 0; h < GBH; h++) { + if (TPGDON) + LTP = LTP ^ pArithDecoder->DECODE(&gbContext[0x0795]); + if (LTP) { + GBREG->copyLine(h, h - 1); + } else { + if (h > 1) { + uint8_t* pLine1 = pLine - nStride2; + uint8_t* pLine2 = pLine - nStride; + uint32_t line1 = (*pLine1++) << 4; + uint32_t line2 = *pLine2++; + uint32_t CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); + for (int32_t cc = 0; cc < nLineBytes; cc++) { + line1 = (line1 << 8) | ((*pLine1++) << 4); + line2 = (line2 << 8) | (*pLine2++); + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | + ((line1 >> k) & 0x0200) | ((line2 >> (k + 1)) & 0x0008); + } + pLine[cc] = cVal; + } + line1 <<= 8; + line2 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | + ((line1 >> (7 - k)) & 0x0200) | + ((line2 >> (8 - k)) & 0x0008); + } + pLine[nLineBytes] = cVal1; + } else { + uint8_t* pLine2 = pLine - nStride; + uint32_t line2 = (h & 1) ? (*pLine2++) : 0; + uint32_t CONTEXT = (line2 >> 1) & 0x01f8; + for (int32_t cc = 0; cc < nLineBytes; cc++) { + if (h & 1) { + line2 = (line2 << 8) | (*pLine2++); + } + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | + ((line2 >> (k + 1)) & 0x0008); + } + pLine[cc] = cVal; + } + line2 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = + ((CONTEXT & 0x0efb) << 1) | bVal | ((line2 >> (8 - k)) & 0x0008); + } + pLine[nLineBytes] = cVal1; + } + } + pLine += nStride; + } + return GBREG.release(); +} + +CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template1_unopt( + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext) { + int LTP = 0; + std::unique_ptr GBREG(new CJBig2_Image(GBW, GBH)); + GBREG->fill(0); + for (uint32_t h = 0; h < GBH; h++) { + if (TPGDON) + LTP = LTP ^ pArithDecoder->DECODE(&gbContext[0x0795]); + if (LTP) { + GBREG->copyLine(h, h - 1); + } else { + uint32_t line1 = GBREG->getPixel(2, h - 2); + line1 |= GBREG->getPixel(1, h - 2) << 1; + line1 |= GBREG->getPixel(0, h - 2) << 2; + uint32_t line2 = GBREG->getPixel(2, h - 1); + line2 |= GBREG->getPixel(1, h - 1) << 1; + line2 |= GBREG->getPixel(0, h - 1) << 2; + uint32_t line3 = 0; + for (uint32_t w = 0; w < GBW; w++) { + int bVal; + if (USESKIP && SKIP->getPixel(w, h)) { + bVal = 0; + } else { + uint32_t CONTEXT = line3; + CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3; + CONTEXT |= line2 << 4; + CONTEXT |= line1 << 9; + bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + } + if (bVal) { + GBREG->setPixel(w, h, bVal); + } + line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f; + line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f; + line3 = ((line3 << 1) | bVal) & 0x07; + } + } + } + return GBREG.release(); +} + +CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_opt3( + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext) { + std::unique_ptr GBREG(new CJBig2_Image(GBW, GBH)); + if (!GBREG->m_pData) + return nullptr; + + int LTP = 0; + uint8_t* pLine = GBREG->m_pData; + int32_t nStride = GBREG->stride(); + int32_t nStride2 = nStride << 1; + int32_t nLineBytes = ((GBW + 7) >> 3) - 1; + int32_t nBitsLeft = GBW - (nLineBytes << 3); + for (uint32_t h = 0; h < GBH; h++) { + if (TPGDON) + LTP = LTP ^ pArithDecoder->DECODE(&gbContext[0x00e5]); + if (LTP) { + GBREG->copyLine(h, h - 1); + } else { + if (h > 1) { + uint8_t* pLine1 = pLine - nStride2; + uint8_t* pLine2 = pLine - nStride; + uint32_t line1 = (*pLine1++) << 1; + uint32_t line2 = *pLine2++; + uint32_t CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); + for (int32_t cc = 0; cc < nLineBytes; cc++) { + line1 = (line1 << 8) | ((*pLine1++) << 1); + line2 = (line2 << 8) | (*pLine2++); + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | + ((line1 >> k) & 0x0080) | ((line2 >> (k + 3)) & 0x0004); + } + pLine[cc] = cVal; + } + line1 <<= 8; + line2 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | + ((line1 >> (7 - k)) & 0x0080) | + ((line2 >> (10 - k)) & 0x0004); + } + pLine[nLineBytes] = cVal1; + } else { + uint8_t* pLine2 = pLine - nStride; + uint32_t line2 = (h & 1) ? (*pLine2++) : 0; + uint32_t CONTEXT = (line2 >> 3) & 0x007c; + for (int32_t cc = 0; cc < nLineBytes; cc++) { + if (h & 1) { + line2 = (line2 << 8) | (*pLine2++); + } + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | + ((line2 >> (k + 3)) & 0x0004); + } + pLine[cc] = cVal; + } + line2 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | + (((line2 >> (10 - k))) & 0x0004); + } + pLine[nLineBytes] = cVal1; + } + } + pLine += nStride; + } + return GBREG.release(); +} + +CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template2_unopt( + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext) { + int LTP = 0; + std::unique_ptr GBREG(new CJBig2_Image(GBW, GBH)); + GBREG->fill(0); + for (uint32_t h = 0; h < GBH; h++) { + if (TPGDON) + LTP = LTP ^ pArithDecoder->DECODE(&gbContext[0x00e5]); + if (LTP) { + GBREG->copyLine(h, h - 1); + } else { + uint32_t line1 = GBREG->getPixel(1, h - 2); + line1 |= GBREG->getPixel(0, h - 2) << 1; + uint32_t line2 = GBREG->getPixel(1, h - 1); + line2 |= GBREG->getPixel(0, h - 1) << 1; + uint32_t line3 = 0; + for (uint32_t w = 0; w < GBW; w++) { + int bVal; + if (USESKIP && SKIP->getPixel(w, h)) { + bVal = 0; + } else { + uint32_t CONTEXT = line3; + CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2; + CONTEXT |= line2 << 3; + CONTEXT |= line1 << 7; + bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + } + if (bVal) { + GBREG->setPixel(w, h, bVal); + } + line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07; + line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f; + line3 = ((line3 << 1) | bVal) & 0x03; + } + } + } + return GBREG.release(); +} + +CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_opt3( + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext) { + std::unique_ptr GBREG(new CJBig2_Image(GBW, GBH)); + if (!GBREG->m_pData) + return nullptr; + + int LTP = 0; + uint8_t* pLine = GBREG->m_pData; + int32_t nStride = GBREG->stride(); + int32_t nLineBytes = ((GBW + 7) >> 3) - 1; + int32_t nBitsLeft = GBW - (nLineBytes << 3); + for (uint32_t h = 0; h < GBH; h++) { + if (TPGDON) + LTP = LTP ^ pArithDecoder->DECODE(&gbContext[0x0195]); + if (LTP) { + GBREG->copyLine(h, h - 1); + } else { + if (h > 0) { + uint8_t* pLine1 = pLine - nStride; + uint32_t line1 = *pLine1++; + uint32_t CONTEXT = (line1 >> 1) & 0x03f0; + for (int32_t cc = 0; cc < nLineBytes; cc++) { + line1 = (line1 << 8) | (*pLine1++); + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal | + ((line1 >> (k + 1)) & 0x0010); + } + pLine[cc] = cVal; + } + line1 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = + ((CONTEXT & 0x01f7) << 1) | bVal | ((line1 >> (8 - k)) & 0x0010); + } + pLine[nLineBytes] = cVal1; + } else { + uint32_t CONTEXT = 0; + for (int32_t cc = 0; cc < nLineBytes; cc++) { + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; + } + pLine[cc] = cVal; + } + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; + } + pLine[nLineBytes] = cVal1; + } + } + pLine += nStride; + } + return GBREG.release(); +} + +CJBig2_Image* CJBig2_GRDProc::decode_Arith_Template3_unopt( + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext) { + int LTP = 0; + std::unique_ptr GBREG(new CJBig2_Image(GBW, GBH)); + GBREG->fill(0); + for (uint32_t h = 0; h < GBH; h++) { + if (TPGDON) + LTP = LTP ^ pArithDecoder->DECODE(&gbContext[0x0195]); + if (LTP == 1) { + GBREG->copyLine(h, h - 1); + } else { + uint32_t line1 = GBREG->getPixel(1, h - 1); + line1 |= GBREG->getPixel(0, h - 1) << 1; + uint32_t line2 = 0; + for (uint32_t w = 0; w < GBW; w++) { + int bVal; + if (USESKIP && SKIP->getPixel(w, h)) { + bVal = 0; + } else { + uint32_t CONTEXT = line2; + CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4; + CONTEXT |= line1 << 5; + bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + } + if (bVal) { + GBREG->setPixel(w, h, bVal); + } + line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f; + line2 = ((line2 << 1) | bVal) & 0x0f; + } + } + } + return GBREG.release(); +} + +FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith( + CJBig2_Image** pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause) { + if (GBW == 0 || GBH == 0) { + m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; + return FXCODEC_STATUS_DECODE_FINISH; + } + m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY; + m_pPause = pPause; + if (!*pImage) + *pImage = new CJBig2_Image(GBW, GBH); + if (!(*pImage)->m_pData) { + delete *pImage; + *pImage = nullptr; + m_ProssiveStatus = FXCODEC_STATUS_ERROR; + return FXCODEC_STATUS_ERROR; + } + m_DecodeType = 1; + m_pImage = pImage; + (*m_pImage)->fill(0); + m_pArithDecoder = pArithDecoder; + m_gbContext = gbContext; + m_LTP = 0; + m_pLine = nullptr; + m_loopIndex = 0; + return decode_Arith(pPause); +} + +FXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause) { + int iline = m_loopIndex; + CJBig2_Image* pImage = *m_pImage; + if (GBTEMPLATE == 0) { + if (UseTemplate0Opt3()) { + m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecoder, + m_gbContext, pPause); + } else { + m_ProssiveStatus = decode_Arith_Template0_unopt(pImage, m_pArithDecoder, + m_gbContext, pPause); + } + } else if (GBTEMPLATE == 1) { + if (UseTemplate1Opt3()) { + m_ProssiveStatus = decode_Arith_Template1_opt3(pImage, m_pArithDecoder, + m_gbContext, pPause); + } else { + m_ProssiveStatus = decode_Arith_Template1_unopt(pImage, m_pArithDecoder, + m_gbContext, pPause); + } + } else if (GBTEMPLATE == 2) { + if (UseTemplate23Opt3()) { + m_ProssiveStatus = decode_Arith_Template2_opt3(pImage, m_pArithDecoder, + m_gbContext, pPause); + } else { + m_ProssiveStatus = decode_Arith_Template2_unopt(pImage, m_pArithDecoder, + m_gbContext, pPause); + } + } else { + if (UseTemplate23Opt3()) { + m_ProssiveStatus = decode_Arith_Template3_opt3(pImage, m_pArithDecoder, + m_gbContext, pPause); + } else { + m_ProssiveStatus = decode_Arith_Template3_unopt(pImage, m_pArithDecoder, + m_gbContext, pPause); + } + } + m_ReplaceRect.left = 0; + m_ReplaceRect.right = pImage->width(); + m_ReplaceRect.top = iline; + m_ReplaceRect.bottom = m_loopIndex; + if (m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) { + m_loopIndex = 0; + } + return m_ProssiveStatus; +} + +FXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage, + CJBig2_BitStream* pStream, + IFX_Pause* pPause) { + int bitpos, i; + *pImage = new CJBig2_Image(GBW, GBH); + if (!(*pImage)->m_pData) { + delete (*pImage); + (*pImage) = nullptr; + m_ProssiveStatus = FXCODEC_STATUS_ERROR; + return m_ProssiveStatus; + } + bitpos = (int)pStream->getBitPos(); + FaxG4Decode(pStream->getBuf(), pStream->getLength(), &bitpos, + (*pImage)->m_pData, GBW, GBH, (*pImage)->stride()); + pStream->setBitPos(bitpos); + for (i = 0; (uint32_t)i < (*pImage)->stride() * GBH; i++) { + (*pImage)->m_pData[i] = ~(*pImage)->m_pData[i]; + } + m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; + return m_ProssiveStatus; +} + +FXCODEC_STATUS CJBig2_GRDProc::Continue_decode(IFX_Pause* pPause) { + if (m_ProssiveStatus != FXCODEC_STATUS_DECODE_TOBECONTINUE) + return m_ProssiveStatus; + + if (m_DecodeType != 1) { + m_ProssiveStatus = FXCODEC_STATUS_ERROR; + return m_ProssiveStatus; + } + + return decode_Arith(pPause); +} + +FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_opt3( + CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause) { + if (!m_pLine) { + m_pLine = pImage->m_pData; + } + int32_t nStride = pImage->stride(); + int32_t nStride2 = nStride << 1; + int32_t nLineBytes = ((GBW + 7) >> 3) - 1; + int32_t nBitsLeft = GBW - (nLineBytes << 3); + uint32_t height = GBH & 0x7fffffff; + for (; m_loopIndex < height; m_loopIndex++) { + if (TPGDON) + m_LTP = m_LTP ^ pArithDecoder->DECODE(&gbContext[0x9b25]); + if (m_LTP) { + pImage->copyLine(m_loopIndex, m_loopIndex - 1); + } else { + if (m_loopIndex > 1) { + uint8_t* pLine1 = m_pLine - nStride2; + uint8_t* pLine2 = m_pLine - nStride; + uint32_t line1 = (*pLine1++) << 6; + uint32_t line2 = *pLine2++; + uint32_t CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0)); + for (int32_t cc = 0; cc < nLineBytes; cc++) { + line1 = (line1 << 8) | ((*pLine1++) << 6); + line2 = (line2 << 8) | (*pLine2++); + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | + ((line1 >> k) & 0x0800) | ((line2 >> k) & 0x0010)); + } + m_pLine[cc] = cVal; + } + line1 <<= 8; + line2 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = + (((CONTEXT & 0x7bf7) << 1) | bVal | + ((line1 >> (7 - k)) & 0x0800) | ((line2 >> (7 - k)) & 0x0010)); + } + m_pLine[nLineBytes] = cVal1; + } else { + uint8_t* pLine2 = m_pLine - nStride; + uint32_t line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; + uint32_t CONTEXT = (line2 & 0x07f0); + for (int32_t cc = 0; cc < nLineBytes; cc++) { + if (m_loopIndex & 1) { + line2 = (line2 << 8) | (*pLine2++); + } + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = + (((CONTEXT & 0x7bf7) << 1) | bVal | ((line2 >> k) & 0x0010)); + } + m_pLine[cc] = cVal; + } + line2 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal | + ((line2 >> (7 - k)) & 0x0010)); + } + m_pLine[nLineBytes] = cVal1; + } + } + m_pLine += nStride; + if (pPause && pPause->NeedToPauseNow()) { + m_loopIndex++; + m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return FXCODEC_STATUS_DECODE_TOBECONTINUE; + } + } + m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; + return FXCODEC_STATUS_DECODE_FINISH; +} + +FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt( + CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause) { + for (; m_loopIndex < GBH; m_loopIndex++) { + if (TPGDON) + m_LTP = m_LTP ^ pArithDecoder->DECODE(&gbContext[0x9b25]); + if (m_LTP) { + pImage->copyLine(m_loopIndex, m_loopIndex - 1); + } else { + uint32_t line1 = pImage->getPixel(1, m_loopIndex - 2); + line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1; + uint32_t line2 = pImage->getPixel(2, m_loopIndex - 1); + line2 |= pImage->getPixel(1, m_loopIndex - 1) << 1; + line2 |= pImage->getPixel(0, m_loopIndex - 1) << 2; + uint32_t line3 = 0; + for (uint32_t w = 0; w < GBW; w++) { + int bVal; + if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { + bVal = 0; + } else { + uint32_t CONTEXT = line3; + CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4; + CONTEXT |= line2 << 5; + CONTEXT |= pImage->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10; + CONTEXT |= pImage->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11; + CONTEXT |= line1 << 12; + CONTEXT |= pImage->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15; + bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + } + if (bVal) { + pImage->setPixel(w, m_loopIndex, bVal); + } + line1 = + ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07; + line2 = + ((line2 << 1) | pImage->getPixel(w + 3, m_loopIndex - 1)) & 0x1f; + line3 = ((line3 << 1) | bVal) & 0x0f; + } + } + if (pPause && pPause->NeedToPauseNow()) { + m_loopIndex++; + m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return FXCODEC_STATUS_DECODE_TOBECONTINUE; + } + } + m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; + return FXCODEC_STATUS_DECODE_FINISH; +} + +FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3( + CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause) { + if (!m_pLine) { + m_pLine = pImage->m_pData; + } + int32_t nStride = pImage->stride(); + int32_t nStride2 = nStride << 1; + int32_t nLineBytes = ((GBW + 7) >> 3) - 1; + int32_t nBitsLeft = GBW - (nLineBytes << 3); + for (; m_loopIndex < GBH; m_loopIndex++) { + if (TPGDON) + m_LTP = m_LTP ^ pArithDecoder->DECODE(&gbContext[0x0795]); + if (m_LTP) { + pImage->copyLine(m_loopIndex, m_loopIndex - 1); + } else { + if (m_loopIndex > 1) { + uint8_t* pLine1 = m_pLine - nStride2; + uint8_t* pLine2 = m_pLine - nStride; + uint32_t line1 = (*pLine1++) << 4; + uint32_t line2 = *pLine2++; + uint32_t CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8); + for (int32_t cc = 0; cc < nLineBytes; cc++) { + line1 = (line1 << 8) | ((*pLine1++) << 4); + line2 = (line2 << 8) | (*pLine2++); + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | + ((line1 >> k) & 0x0200) | ((line2 >> (k + 1)) & 0x0008); + } + m_pLine[cc] = cVal; + } + line1 <<= 8; + line2 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | + ((line1 >> (7 - k)) & 0x0200) | + ((line2 >> (8 - k)) & 0x0008); + } + m_pLine[nLineBytes] = cVal1; + } else { + uint8_t* pLine2 = m_pLine - nStride; + uint32_t line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; + uint32_t CONTEXT = (line2 >> 1) & 0x01f8; + for (int32_t cc = 0; cc < nLineBytes; cc++) { + if (m_loopIndex & 1) { + line2 = (line2 << 8) | (*pLine2++); + } + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal | + ((line2 >> (k + 1)) & 0x0008); + } + m_pLine[cc] = cVal; + } + line2 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = + ((CONTEXT & 0x0efb) << 1) | bVal | ((line2 >> (8 - k)) & 0x0008); + } + m_pLine[nLineBytes] = cVal1; + } + } + m_pLine += nStride; + if (pPause && pPause->NeedToPauseNow()) { + m_loopIndex++; + m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return FXCODEC_STATUS_DECODE_TOBECONTINUE; + } + } + m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; + return FXCODEC_STATUS_DECODE_FINISH; +} + +FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt( + CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause) { + for (uint32_t h = 0; h < GBH; h++) { + if (TPGDON) + m_LTP = m_LTP ^ pArithDecoder->DECODE(&gbContext[0x0795]); + if (m_LTP) { + pImage->copyLine(h, h - 1); + } else { + uint32_t line1 = pImage->getPixel(2, h - 2); + line1 |= pImage->getPixel(1, h - 2) << 1; + line1 |= pImage->getPixel(0, h - 2) << 2; + uint32_t line2 = pImage->getPixel(2, h - 1); + line2 |= pImage->getPixel(1, h - 1) << 1; + line2 |= pImage->getPixel(0, h - 1) << 2; + uint32_t line3 = 0; + for (uint32_t w = 0; w < GBW; w++) { + int bVal; + if (USESKIP && SKIP->getPixel(w, h)) { + bVal = 0; + } else { + uint32_t CONTEXT = line3; + CONTEXT |= pImage->getPixel(w + GBAT[0], h + GBAT[1]) << 3; + CONTEXT |= line2 << 4; + CONTEXT |= line1 << 9; + bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + } + if (bVal) { + pImage->setPixel(w, h, bVal); + } + line1 = ((line1 << 1) | pImage->getPixel(w + 3, h - 2)) & 0x0f; + line2 = ((line2 << 1) | pImage->getPixel(w + 3, h - 1)) & 0x1f; + line3 = ((line3 << 1) | bVal) & 0x07; + } + } + if (pPause && pPause->NeedToPauseNow()) { + m_loopIndex++; + m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return FXCODEC_STATUS_DECODE_TOBECONTINUE; + } + } + m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; + return FXCODEC_STATUS_DECODE_FINISH; +} + +FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3( + CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause) { + if (!m_pLine) { + m_pLine = pImage->m_pData; + } + int32_t nStride = pImage->stride(); + int32_t nStride2 = nStride << 1; + int32_t nLineBytes = ((GBW + 7) >> 3) - 1; + int32_t nBitsLeft = GBW - (nLineBytes << 3); + for (; m_loopIndex < GBH; m_loopIndex++) { + if (TPGDON) + m_LTP = m_LTP ^ pArithDecoder->DECODE(&gbContext[0x00e5]); + if (m_LTP) { + pImage->copyLine(m_loopIndex, m_loopIndex - 1); + } else { + if (m_loopIndex > 1) { + uint8_t* pLine1 = m_pLine - nStride2; + uint8_t* pLine2 = m_pLine - nStride; + uint32_t line1 = (*pLine1++) << 1; + uint32_t line2 = *pLine2++; + uint32_t CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c); + for (int32_t cc = 0; cc < nLineBytes; cc++) { + line1 = (line1 << 8) | ((*pLine1++) << 1); + line2 = (line2 << 8) | (*pLine2++); + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | + ((line1 >> k) & 0x0080) | ((line2 >> (k + 3)) & 0x0004); + } + m_pLine[cc] = cVal; + } + line1 <<= 8; + line2 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | + ((line1 >> (7 - k)) & 0x0080) | + ((line2 >> (10 - k)) & 0x0004); + } + m_pLine[nLineBytes] = cVal1; + } else { + uint8_t* pLine2 = m_pLine - nStride; + uint32_t line2 = (m_loopIndex & 1) ? (*pLine2++) : 0; + uint32_t CONTEXT = (line2 >> 3) & 0x007c; + for (int32_t cc = 0; cc < nLineBytes; cc++) { + if (m_loopIndex & 1) { + line2 = (line2 << 8) | (*pLine2++); + } + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | + ((line2 >> (k + 3)) & 0x0004); + } + m_pLine[cc] = cVal; + } + line2 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal | + (((line2 >> (10 - k))) & 0x0004); + } + m_pLine[nLineBytes] = cVal1; + } + } + m_pLine += nStride; + if (pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) { + m_loopIndex++; + m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return FXCODEC_STATUS_DECODE_TOBECONTINUE; + } + } + m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; + return FXCODEC_STATUS_DECODE_FINISH; +} + +FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt( + CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause) { + for (; m_loopIndex < GBH; m_loopIndex++) { + if (TPGDON) + m_LTP = m_LTP ^ pArithDecoder->DECODE(&gbContext[0x00e5]); + if (m_LTP) { + pImage->copyLine(m_loopIndex, m_loopIndex - 1); + } else { + uint32_t line1 = pImage->getPixel(1, m_loopIndex - 2); + line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1; + uint32_t line2 = pImage->getPixel(1, m_loopIndex - 1); + line2 |= pImage->getPixel(0, m_loopIndex - 1) << 1; + uint32_t line3 = 0; + for (uint32_t w = 0; w < GBW; w++) { + int bVal; + if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { + bVal = 0; + } else { + uint32_t CONTEXT = line3; + CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2; + CONTEXT |= line2 << 3; + CONTEXT |= line1 << 7; + bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + } + if (bVal) { + pImage->setPixel(w, m_loopIndex, bVal); + } + line1 = + ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07; + line2 = + ((line2 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x0f; + line3 = ((line3 << 1) | bVal) & 0x03; + } + } + if (pPause && pPause->NeedToPauseNow()) { + m_loopIndex++; + m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return FXCODEC_STATUS_DECODE_TOBECONTINUE; + } + } + m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; + return FXCODEC_STATUS_DECODE_FINISH; +} + +FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3( + CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause) { + if (!m_pLine) + m_pLine = pImage->m_pData; + + int32_t nStride = pImage->stride(); + int32_t nLineBytes = ((GBW + 7) >> 3) - 1; + int32_t nBitsLeft = GBW - (nLineBytes << 3); + for (; m_loopIndex < GBH; m_loopIndex++) { + if (TPGDON) + m_LTP = m_LTP ^ pArithDecoder->DECODE(&gbContext[0x0195]); + if (m_LTP) { + pImage->copyLine(m_loopIndex, m_loopIndex - 1); + } else { + if (m_loopIndex > 0) { + uint8_t* pLine1 = m_pLine - nStride; + uint32_t line1 = *pLine1++; + uint32_t CONTEXT = (line1 >> 1) & 0x03f0; + for (int32_t cc = 0; cc < nLineBytes; cc++) { + line1 = (line1 << 8) | (*pLine1++); + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal | + ((line1 >> (k + 1)) & 0x0010); + } + m_pLine[cc] = cVal; + } + line1 <<= 8; + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = + ((CONTEXT & 0x01f7) << 1) | bVal | ((line1 >> (8 - k)) & 0x0010); + } + m_pLine[nLineBytes] = cVal1; + } else { + uint32_t CONTEXT = 0; + for (int32_t cc = 0; cc < nLineBytes; cc++) { + uint8_t cVal = 0; + for (int32_t k = 7; k >= 0; k--) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal |= bVal << k; + CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; + } + m_pLine[cc] = cVal; + } + uint8_t cVal1 = 0; + for (int32_t k = 0; k < nBitsLeft; k++) { + int bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + cVal1 |= bVal << (7 - k); + CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal; + } + m_pLine[nLineBytes] = cVal1; + } + } + m_pLine += nStride; + if (pPause && pPause->NeedToPauseNow()) { + m_loopIndex++; + m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return FXCODEC_STATUS_DECODE_TOBECONTINUE; + } + } + m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; + return FXCODEC_STATUS_DECODE_FINISH; +} + +FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt( + CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause) { + for (; m_loopIndex < GBH; m_loopIndex++) { + if (TPGDON) + m_LTP = m_LTP ^ pArithDecoder->DECODE(&gbContext[0x0195]); + if (m_LTP) { + pImage->copyLine(m_loopIndex, m_loopIndex - 1); + } else { + uint32_t line1 = pImage->getPixel(1, m_loopIndex - 1); + line1 |= pImage->getPixel(0, m_loopIndex - 1) << 1; + uint32_t line2 = 0; + for (uint32_t w = 0; w < GBW; w++) { + int bVal; + if (USESKIP && SKIP->getPixel(w, m_loopIndex)) { + bVal = 0; + } else { + uint32_t CONTEXT = line2; + CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4; + CONTEXT |= line1 << 5; + bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]); + } + if (bVal) { + pImage->setPixel(w, m_loopIndex, bVal); + } + line1 = + ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x1f; + line2 = ((line2 << 1) | bVal) & 0x0f; + } + } + if (pPause && pPause->NeedToPauseNow()) { + m_loopIndex++; + m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; + return FXCODEC_STATUS_DECODE_TOBECONTINUE; + } + } + m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH; + return FXCODEC_STATUS_DECODE_FINISH; +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrdProc.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrdProc.h new file mode 100644 index 000000000000..a82aecbf1201 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrdProc.h @@ -0,0 +1,124 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_GRDPROC_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_GRDPROC_H_ + +#include "core/fxcodec/fx_codec_def.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +class CJBig2_ArithDecoder; +class CJBig2_BitStream; +class CJBig2_Image; +class IFX_Pause; +struct JBig2ArithCtx; + +class CJBig2_GRDProc { + public: + CJBig2_GRDProc(); + + CJBig2_Image* decode_Arith(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext); + + FXCODEC_STATUS Start_decode_Arith(CJBig2_Image** pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause); + FXCODEC_STATUS Start_decode_MMR(CJBig2_Image** pImage, + CJBig2_BitStream* pStream, + IFX_Pause* pPause); + FXCODEC_STATUS Continue_decode(IFX_Pause* pPause); + FX_RECT GetReplaceRect() const { return m_ReplaceRect; } + + bool MMR; + uint32_t GBW; + uint32_t GBH; + uint8_t GBTEMPLATE; + bool TPGDON; + bool USESKIP; + CJBig2_Image* SKIP; + int8_t GBAT[8]; + + private: + bool UseTemplate0Opt3() const; + bool UseTemplate1Opt3() const; + bool UseTemplate23Opt3() const; + + FXCODEC_STATUS decode_Arith(IFX_Pause* pPause); + FXCODEC_STATUS decode_Arith_Template0_opt3(CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause); + FXCODEC_STATUS decode_Arith_Template0_unopt( + CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause); + FXCODEC_STATUS decode_Arith_Template1_opt3(CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause); + FXCODEC_STATUS decode_Arith_Template1_unopt( + CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause); + FXCODEC_STATUS decode_Arith_Template2_opt3(CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause); + FXCODEC_STATUS decode_Arith_Template2_unopt( + CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause); + FXCODEC_STATUS decode_Arith_Template3_opt3(CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause); + FXCODEC_STATUS decode_Arith_Template3_unopt( + CJBig2_Image* pImage, + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause); + CJBig2_Image* decode_Arith_Template0_opt3(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext); + + CJBig2_Image* decode_Arith_Template0_unopt(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext); + + CJBig2_Image* decode_Arith_Template1_opt3(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext); + + CJBig2_Image* decode_Arith_Template1_unopt(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext); + + CJBig2_Image* decode_Arith_Template2_opt3(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext); + + CJBig2_Image* decode_Arith_Template2_unopt(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext); + + CJBig2_Image* decode_Arith_Template3_opt3(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext); + + CJBig2_Image* decode_Arith_Template3_unopt(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext); + + uint32_t m_loopIndex; + uint8_t* m_pLine; + IFX_Pause* m_pPause; + FXCODEC_STATUS m_ProssiveStatus; + CJBig2_Image** m_pImage; + CJBig2_ArithDecoder* m_pArithDecoder; + JBig2ArithCtx* m_gbContext; + uint16_t m_DecodeType; + int m_LTP; + FX_RECT m_ReplaceRect; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_GRDPROC_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrrdProc.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrrdProc.cpp new file mode 100644 index 000000000000..669fed68e9c1 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrrdProc.cpp @@ -0,0 +1,503 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_GrrdProc.h" + +#include + +#include "core/fxcodec/jbig2/JBig2_ArithDecoder.h" +#include "core/fxcodec/jbig2/JBig2_BitStream.h" +#include "core/fxcodec/jbig2/JBig2_Image.h" + +CJBig2_Image* CJBig2_GRRDProc::decode(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* grContext) { + if (GRW == 0 || GRH == 0) + return new CJBig2_Image(GRW, GRH); + + if (!GRTEMPLATE) { + if ((GRAT[0] == -1) && (GRAT[1] == -1) && (GRAT[2] == -1) && + (GRAT[3] == -1) && (GRREFERENCEDX == 0) && + (GRW == (uint32_t)GRREFERENCE->width())) { + return decode_Template0_opt(pArithDecoder, grContext); + } + return decode_Template0_unopt(pArithDecoder, grContext); + } + + if ((GRREFERENCEDX == 0) && (GRW == (uint32_t)GRREFERENCE->width())) + return decode_Template1_opt(pArithDecoder, grContext); + return decode_Template1_unopt(pArithDecoder, grContext); +} + +CJBig2_Image* CJBig2_GRRDProc::decode_Template0_unopt( + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* grContext) { + int LTP = 0; + std::unique_ptr GRREG(new CJBig2_Image(GRW, GRH)); + GRREG->fill(0); + for (uint32_t h = 0; h < GRH; h++) { + if (TPGRON) + LTP = LTP ^ pArithDecoder->DECODE(&grContext[0x0010]); + if (!LTP) { + uint32_t line1 = GRREG->getPixel(1, h - 1); + line1 |= GRREG->getPixel(0, h - 1) << 1; + uint32_t line2 = 0; + uint32_t line3 = + GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1); + line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) + << 1; + uint32_t line4 = + GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); + line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; + line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) + << 2; + uint32_t line5 = + GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); + line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) + << 1; + line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) + << 2; + for (uint32_t w = 0; w < GRW; w++) { + uint32_t CONTEXT = line5; + CONTEXT |= line4 << 3; + CONTEXT |= line3 << 6; + CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], + h - GRREFERENCEDY + GRAT[3]) + << 8; + CONTEXT |= line2 << 9; + CONTEXT |= line1 << 10; + CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; + int bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); + GRREG->setPixel(w, h, bVal); + line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03; + line2 = ((line2 << 1) | bVal) & 0x01; + line3 = ((line3 << 1) | + GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, + h - GRREFERENCEDY - 1)) & + 0x03; + line4 = + ((line4 << 1) | + GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & + 0x07; + line5 = ((line5 << 1) | + GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, + h - GRREFERENCEDY + 1)) & + 0x07; + } + } else { + uint32_t line1 = GRREG->getPixel(1, h - 1); + line1 |= GRREG->getPixel(0, h - 1) << 1; + uint32_t line2 = 0; + uint32_t line3 = + GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1); + line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) + << 1; + uint32_t line4 = + GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); + line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; + line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) + << 2; + uint32_t line5 = + GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); + line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) + << 1; + line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) + << 2; + for (uint32_t w = 0; w < GRW; w++) { + int bVal = GRREFERENCE->getPixel(w, h); + if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) && + (bVal == GRREFERENCE->getPixel(w, h - 1)) && + (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) && + (bVal == GRREFERENCE->getPixel(w - 1, h)) && + (bVal == GRREFERENCE->getPixel(w + 1, h)) && + (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) && + (bVal == GRREFERENCE->getPixel(w, h + 1)) && + (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) { + uint32_t CONTEXT = line5; + CONTEXT |= line4 << 3; + CONTEXT |= line3 << 6; + CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], + h - GRREFERENCEDY + GRAT[3]) + << 8; + CONTEXT |= line2 << 9; + CONTEXT |= line1 << 10; + CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12; + bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); + } + GRREG->setPixel(w, h, bVal); + line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03; + line2 = ((line2 << 1) | bVal) & 0x01; + line3 = ((line3 << 1) | + GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, + h - GRREFERENCEDY - 1)) & + 0x03; + line4 = + ((line4 << 1) | + GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & + 0x07; + line5 = ((line5 << 1) | + GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, + h - GRREFERENCEDY + 1)) & + 0x07; + } + } + } + return GRREG.release(); +} + +CJBig2_Image* CJBig2_GRRDProc::decode_Template0_opt( + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* grContext) { + if (!GRREFERENCE->m_pData) + return nullptr; + + int32_t iGRW = static_cast(GRW); + int32_t iGRH = static_cast(GRH); + std::unique_ptr GRREG(new CJBig2_Image(iGRW, iGRH)); + if (!GRREG->m_pData) + return nullptr; + + int LTP = 0; + uint8_t* pLine = GRREG->m_pData; + uint8_t* pLineR = GRREFERENCE->m_pData; + intptr_t nStride = GRREG->stride(); + intptr_t nStrideR = GRREFERENCE->stride(); + int32_t GRWR = GRREFERENCE->width(); + int32_t GRHR = GRREFERENCE->height(); + if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) + GRREFERENCEDY = 0; + intptr_t nOffset = -GRREFERENCEDY * nStrideR; + for (int32_t h = 0; h < iGRH; h++) { + if (TPGRON) + LTP = LTP ^ pArithDecoder->DECODE(&grContext[0x0010]); + uint32_t line1 = (h > 0) ? pLine[-nStride] << 4 : 0; + int32_t reference_h = h - GRREFERENCEDY; + bool line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1); + bool line2_r_ok = (reference_h > -1 && reference_h < GRHR); + bool line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1); + uint32_t line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0; + uint32_t line2_r = line2_r_ok ? pLineR[nOffset] : 0; + uint32_t line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0; + if (!LTP) { + uint32_t CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0) | + ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007); + for (int32_t w = 0; w < iGRW; w += 8) { + int32_t nBits = iGRW - w > 8 ? 8 : iGRW - w; + if (h > 0) { + line1 = (line1 << 8) | + (w + 8 < iGRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0); + } + if (h > GRHR + GRREFERENCEDY + 1) { + line1_r = 0; + line2_r = 0; + line3_r = 0; + } else { + if (line1_r_ok) { + line1_r = + (line1_r << 8) | + (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); + } + if (line2_r_ok) { + line2_r = (line2_r << 8) | + (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); + } + if (line3_r_ok) { + line3_r = + (line3_r << 8) | + (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); + } else { + line3_r = 0; + } + } + uint8_t cVal = 0; + for (int32_t k = 0; k < nBits; k++) { + int bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); + cVal |= bVal << (7 - k); + CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) | + ((line1 >> (7 - k)) & 0x0400) | + ((line1_r >> (7 - k)) & 0x0040) | + ((line2_r >> (10 - k)) & 0x0008) | + ((line3_r >> (13 - k)) & 0x0001); + } + pLine[w >> 3] = cVal; + } + } else { + uint32_t CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0) | + ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007); + for (int32_t w = 0; w < iGRW; w += 8) { + int32_t nBits = iGRW - w > 8 ? 8 : iGRW - w; + if (h > 0) { + line1 = (line1 << 8) | + (w + 8 < iGRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0); + } + if (line1_r_ok) { + line1_r = + (line1_r << 8) | + (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); + } + if (line2_r_ok) { + line2_r = (line2_r << 8) | + (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); + } + if (line3_r_ok) { + line3_r = + (line3_r << 8) | + (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); + } else { + line3_r = 0; + } + uint8_t cVal = 0; + for (int32_t k = 0; k < nBits; k++) { + int bVal = GRREFERENCE->getPixel(w + k, h); + if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1)) && + (bVal == GRREFERENCE->getPixel(w + k, h - 1)) && + (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1)) && + (bVal == GRREFERENCE->getPixel(w + k - 1, h)) && + (bVal == GRREFERENCE->getPixel(w + k + 1, h)) && + (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1)) && + (bVal == GRREFERENCE->getPixel(w + k, h + 1)) && + (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) { + bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); + } + cVal |= bVal << (7 - k); + CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) | + ((line1 >> (7 - k)) & 0x0400) | + ((line1_r >> (7 - k)) & 0x0040) | + ((line2_r >> (10 - k)) & 0x0008) | + ((line3_r >> (13 - k)) & 0x0001); + } + pLine[w >> 3] = cVal; + } + } + pLine += nStride; + if (h < GRHR + GRREFERENCEDY) { + pLineR += nStrideR; + } + } + return GRREG.release(); +} + +CJBig2_Image* CJBig2_GRRDProc::decode_Template1_unopt( + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* grContext) { + int LTP = 0; + std::unique_ptr GRREG(new CJBig2_Image(GRW, GRH)); + GRREG->fill(0); + for (uint32_t h = 0; h < GRH; h++) { + if (TPGRON) + LTP = LTP ^ pArithDecoder->DECODE(&grContext[0x0008]); + if (!LTP) { + uint32_t line1 = GRREG->getPixel(1, h - 1); + line1 |= GRREG->getPixel(0, h - 1) << 1; + line1 |= GRREG->getPixel(-1, h - 1) << 2; + uint32_t line2 = 0; + uint32_t line3 = + GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1); + uint32_t line4 = + GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); + line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; + line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) + << 2; + uint32_t line5 = + GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); + line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) + << 1; + for (uint32_t w = 0; w < GRW; w++) { + uint32_t CONTEXT = line5; + CONTEXT |= line4 << 2; + CONTEXT |= line3 << 5; + CONTEXT |= line2 << 6; + CONTEXT |= line1 << 7; + int bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); + GRREG->setPixel(w, h, bVal); + line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07; + line2 = ((line2 << 1) | bVal) & 0x01; + line3 = ((line3 << 1) | + GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, + h - GRREFERENCEDY - 1)) & + 0x01; + line4 = + ((line4 << 1) | + GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & + 0x07; + line5 = ((line5 << 1) | + GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, + h - GRREFERENCEDY + 1)) & + 0x03; + } + } else { + uint32_t line1 = GRREG->getPixel(1, h - 1); + line1 |= GRREG->getPixel(0, h - 1) << 1; + line1 |= GRREG->getPixel(-1, h - 1) << 2; + uint32_t line2 = 0; + uint32_t line3 = + GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1); + uint32_t line4 = + GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY); + line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1; + line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) + << 2; + uint32_t line5 = + GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1); + line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) + << 1; + for (uint32_t w = 0; w < GRW; w++) { + int bVal = GRREFERENCE->getPixel(w, h); + if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1)) && + (bVal == GRREFERENCE->getPixel(w, h - 1)) && + (bVal == GRREFERENCE->getPixel(w + 1, h - 1)) && + (bVal == GRREFERENCE->getPixel(w - 1, h)) && + (bVal == GRREFERENCE->getPixel(w + 1, h)) && + (bVal == GRREFERENCE->getPixel(w - 1, h + 1)) && + (bVal == GRREFERENCE->getPixel(w, h + 1)) && + (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) { + uint32_t CONTEXT = line5; + CONTEXT |= line4 << 2; + CONTEXT |= line3 << 5; + CONTEXT |= line2 << 6; + CONTEXT |= line1 << 7; + bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); + } + GRREG->setPixel(w, h, bVal); + line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07; + line2 = ((line2 << 1) | bVal) & 0x01; + line3 = ((line3 << 1) | + GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, + h - GRREFERENCEDY - 1)) & + 0x01; + line4 = + ((line4 << 1) | + GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & + 0x07; + line5 = ((line5 << 1) | + GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, + h - GRREFERENCEDY + 1)) & + 0x03; + } + } + } + return GRREG.release(); +} + +CJBig2_Image* CJBig2_GRRDProc::decode_Template1_opt( + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* grContext) { + if (!GRREFERENCE->m_pData) + return nullptr; + + int32_t iGRW = static_cast(GRW); + int32_t iGRH = static_cast(GRH); + std::unique_ptr GRREG(new CJBig2_Image(iGRW, iGRH)); + if (!GRREG->m_pData) + return nullptr; + + int LTP = 0; + uint8_t* pLine = GRREG->m_pData; + uint8_t* pLineR = GRREFERENCE->m_pData; + intptr_t nStride = GRREG->stride(); + intptr_t nStrideR = GRREFERENCE->stride(); + int32_t GRWR = GRREFERENCE->width(); + int32_t GRHR = GRREFERENCE->height(); + if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) { + GRREFERENCEDY = 0; + } + intptr_t nOffset = -GRREFERENCEDY * nStrideR; + for (int32_t h = 0; h < iGRH; h++) { + if (TPGRON) + LTP = LTP ^ pArithDecoder->DECODE(&grContext[0x0008]); + uint32_t line1 = (h > 0) ? pLine[-nStride] << 1 : 0; + int32_t reference_h = h - GRREFERENCEDY; + bool line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1); + bool line2_r_ok = (reference_h > -1 && reference_h < GRHR); + bool line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1); + uint32_t line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0; + uint32_t line2_r = line2_r_ok ? pLineR[nOffset] : 0; + uint32_t line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0; + if (!LTP) { + uint32_t CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020) | + ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003); + for (int32_t w = 0; w < iGRW; w += 8) { + int32_t nBits = iGRW - w > 8 ? 8 : iGRW - w; + if (h > 0) + line1 = (line1 << 8) | + (w + 8 < iGRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0); + if (line1_r_ok) + line1_r = + (line1_r << 8) | + (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); + if (line2_r_ok) + line2_r = (line2_r << 8) | + (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); + if (line3_r_ok) { + line3_r = + (line3_r << 8) | + (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); + } else { + line3_r = 0; + } + uint8_t cVal = 0; + for (int32_t k = 0; k < nBits; k++) { + int bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); + cVal |= bVal << (7 - k); + CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) | + ((line1 >> (7 - k)) & 0x0080) | + ((line1_r >> (9 - k)) & 0x0020) | + ((line2_r >> (11 - k)) & 0x0004) | + ((line3_r >> (13 - k)) & 0x0001); + } + pLine[w >> 3] = cVal; + } + } else { + uint32_t CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020) | + ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003); + for (int32_t w = 0; w < iGRW; w += 8) { + int32_t nBits = iGRW - w > 8 ? 8 : iGRW - w; + if (h > 0) + line1 = (line1 << 8) | + (w + 8 < iGRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0); + if (line1_r_ok) + line1_r = + (line1_r << 8) | + (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0); + if (line2_r_ok) + line2_r = (line2_r << 8) | + (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0); + if (line3_r_ok) { + line3_r = + (line3_r << 8) | + (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0); + } else { + line3_r = 0; + } + uint8_t cVal = 0; + for (int32_t k = 0; k < nBits; k++) { + int bVal = GRREFERENCE->getPixel(w + k, h); + if (!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1)) && + (bVal == GRREFERENCE->getPixel(w + k, h - 1)) && + (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1)) && + (bVal == GRREFERENCE->getPixel(w + k - 1, h)) && + (bVal == GRREFERENCE->getPixel(w + k + 1, h)) && + (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1)) && + (bVal == GRREFERENCE->getPixel(w + k, h + 1)) && + (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) { + bVal = pArithDecoder->DECODE(&grContext[CONTEXT]); + } + cVal |= bVal << (7 - k); + CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) | + ((line1 >> (7 - k)) & 0x0080) | + ((line1_r >> (9 - k)) & 0x0020) | + ((line2_r >> (11 - k)) & 0x0004) | + ((line3_r >> (13 - k)) & 0x0001); + } + pLine[w >> 3] = cVal; + } + } + pLine += nStride; + if (h < GRHR + GRREFERENCEDY) { + pLineR += nStrideR; + } + } + return GRREG.release(); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrrdProc.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrrdProc.h new file mode 100644 index 000000000000..bdb49d7e9177 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GrrdProc.h @@ -0,0 +1,43 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_GRRDPROC_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_GRRDPROC_H_ + +#include "core/fxcrt/fx_system.h" + +class CJBig2_ArithDecoder; +class CJBig2_Image; +struct JBig2ArithCtx; + +class CJBig2_GRRDProc { + public: + CJBig2_Image* decode(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* grContext); + + CJBig2_Image* decode_Template0_unopt(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* grContext); + + CJBig2_Image* decode_Template0_opt(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* grContext); + + CJBig2_Image* decode_Template1_unopt(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* grContext); + + CJBig2_Image* decode_Template1_opt(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* grContext); + + uint32_t GRW; + uint32_t GRH; + bool GRTEMPLATE; + CJBig2_Image* GRREFERENCE; + int32_t GRREFERENCEDX; + int32_t GRREFERENCEDY; + bool TPGRON; + int8_t GRAT[4]; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_GRRDPROC_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GsidProc.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GsidProc.cpp new file mode 100644 index 000000000000..387f8ee51151 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GsidProc.cpp @@ -0,0 +1,112 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_GsidProc.h" + +#include +#include + +#include "core/fxcodec/jbig2/JBig2_BitStream.h" +#include "core/fxcodec/jbig2/JBig2_GrdProc.h" +#include "core/fxcodec/jbig2/JBig2_Image.h" +#include "core/fxcrt/fx_basic.h" + +uint32_t* CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause) { + std::unique_ptr pGRD(new CJBig2_GRDProc()); + pGRD->MMR = GSMMR; + pGRD->GBW = GSW; + pGRD->GBH = GSH; + pGRD->GBTEMPLATE = GSTEMPLATE; + pGRD->TPGDON = 0; + pGRD->USESKIP = GSUSESKIP; + pGRD->SKIP = GSKIP; + if (GSTEMPLATE <= 1) { + pGRD->GBAT[0] = 3; + } else { + pGRD->GBAT[0] = 2; + } + pGRD->GBAT[1] = -1; + if (pGRD->GBTEMPLATE == 0) { + pGRD->GBAT[2] = -3; + pGRD->GBAT[3] = -1; + pGRD->GBAT[4] = 2; + pGRD->GBAT[5] = -2; + pGRD->GBAT[6] = -2; + pGRD->GBAT[7] = -2; + } + + std::vector> GSPLANES(GSBPP); + for (int32_t i = GSBPP - 1; i >= 0; --i) { + CJBig2_Image* pImage = nullptr; + FXCODEC_STATUS status = + pGRD->Start_decode_Arith(&pImage, pArithDecoder, gbContext, nullptr); + while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) + status = pGRD->Continue_decode(pPause); + + if (!pImage) + return nullptr; + + GSPLANES[i].reset(pImage); + if (i < GSBPP - 1) + pImage->composeFrom(0, 0, GSPLANES[i + 1].get(), JBIG2_COMPOSE_XOR); + } + std::unique_ptr GSVALS( + FX_Alloc2D(uint32_t, GSW, GSH)); + JBIG2_memset(GSVALS.get(), 0, sizeof(uint32_t) * GSW * GSH); + for (uint32_t y = 0; y < GSH; ++y) { + for (uint32_t x = 0; x < GSW; ++x) { + for (int32_t i = 0; i < GSBPP; ++i) + GSVALS.get()[y * GSW + x] |= GSPLANES[i]->getPixel(x, y) << i; + } + } + return GSVALS.release(); +} + +uint32_t* CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream* pStream, + IFX_Pause* pPause) { + std::unique_ptr pGRD(new CJBig2_GRDProc()); + pGRD->MMR = GSMMR; + pGRD->GBW = GSW; + pGRD->GBH = GSH; + + std::unique_ptr GSPLANES(FX_Alloc(CJBig2_Image*, GSBPP)); + JBIG2_memset(GSPLANES.get(), 0, sizeof(CJBig2_Image*) * GSBPP); + pGRD->Start_decode_MMR(&GSPLANES.get()[GSBPP - 1], pStream, nullptr); + if (!GSPLANES.get()[GSBPP - 1]) + return nullptr; + + pStream->alignByte(); + pStream->offset(3); + int32_t J = GSBPP - 2; + while (J >= 0) { + pGRD->Start_decode_MMR(&GSPLANES.get()[J], pStream, nullptr); + if (!GSPLANES.get()[J]) { + for (int32_t K = GSBPP - 1; K > J; --K) + delete GSPLANES.get()[K]; + return nullptr; + } + pStream->alignByte(); + pStream->offset(3); + GSPLANES.get()[J]->composeFrom(0, 0, GSPLANES.get()[J + 1], + JBIG2_COMPOSE_XOR); + J = J - 1; + } + std::unique_ptr GSVALS(FX_Alloc2D(uint32_t, GSW, GSH)); + JBIG2_memset(GSVALS.get(), 0, sizeof(uint32_t) * GSW * GSH); + for (uint32_t y = 0; y < GSH; ++y) { + for (uint32_t x = 0; x < GSW; ++x) { + for (J = 0; J < GSBPP; ++J) { + GSVALS.get()[y * GSW + x] |= GSPLANES.get()[J]->getPixel(x, y) << J; + } + } + } + for (J = 0; J < GSBPP; ++J) { + delete GSPLANES.get()[J]; + } + return GSVALS.release(); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GsidProc.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GsidProc.h new file mode 100644 index 000000000000..3d5dc2dd4a5e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_GsidProc.h @@ -0,0 +1,36 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_GSIDPROC_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_GSIDPROC_H_ + +#include "core/fxcrt/fx_system.h" + +class CJBig2_ArithDecoder; +class CJBig2_BitStream; +class CJBig2_Image; +class IFX_Pause; +struct JBig2ArithCtx; + +class CJBig2_GSIDProc { + public: + uint32_t* decode_Arith(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause); + + uint32_t* decode_MMR(CJBig2_BitStream* pStream, IFX_Pause* pPause); + + public: + bool GSMMR; + bool GSUSESKIP; + uint8_t GSBPP; + uint32_t GSW; + uint32_t GSH; + uint8_t GSTEMPLATE; + CJBig2_Image* GSKIP; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_GSIDPROC_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HtrdProc.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HtrdProc.cpp new file mode 100644 index 000000000000..121bf1d6dfa8 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HtrdProc.cpp @@ -0,0 +1,105 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_HtrdProc.h" + +#include + +#include "core/fxcodec/jbig2/JBig2_GsidProc.h" +#include "core/fxcrt/fx_basic.h" +#include "third_party/base/ptr_util.h" + +CJBig2_Image* CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause) { + uint32_t ng, mg; + int32_t x, y; + uint32_t HBPP; + uint32_t* GI; + std::unique_ptr HSKIP; + std::unique_ptr HTREG(new CJBig2_Image(HBW, HBH)); + HTREG->fill(HDEFPIXEL); + if (HENABLESKIP == 1) { + HSKIP = pdfium::MakeUnique(HGW, HGH); + for (mg = 0; mg < HGH; mg++) { + for (ng = 0; ng < HGW; ng++) { + x = (HGX + mg * HRY + ng * HRX) >> 8; + y = (HGY + mg * HRX - ng * HRY) >> 8; + if ((x + HPW <= 0) | (x >= (int32_t)HBW) | (y + HPH <= 0) | + (y >= (int32_t)HPH)) { + HSKIP->setPixel(ng, mg, 1); + } else { + HSKIP->setPixel(ng, mg, 0); + } + } + } + } + HBPP = 1; + while ((uint32_t)(1 << HBPP) < HNUMPATS) { + HBPP++; + } + std::unique_ptr pGID(new CJBig2_GSIDProc()); + pGID->GSMMR = HMMR; + pGID->GSW = HGW; + pGID->GSH = HGH; + pGID->GSBPP = (uint8_t)HBPP; + pGID->GSUSESKIP = HENABLESKIP; + pGID->GSKIP = HSKIP.get(); + pGID->GSTEMPLATE = HTEMPLATE; + GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause); + if (!GI) + return nullptr; + + for (mg = 0; mg < HGH; mg++) { + for (ng = 0; ng < HGW; ng++) { + x = (HGX + mg * HRY + ng * HRX) >> 8; + y = (HGY + mg * HRX - ng * HRY) >> 8; + uint32_t pat_index = GI[mg * HGW + ng]; + if (pat_index >= HNUMPATS) { + pat_index = HNUMPATS - 1; + } + HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP); + } + } + FX_Free(GI); + return HTREG.release(); +} + +CJBig2_Image* CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream* pStream, + IFX_Pause* pPause) { + uint32_t ng, mg; + int32_t x, y; + uint32_t* GI; + std::unique_ptr HTREG(new CJBig2_Image(HBW, HBH)); + HTREG->fill(HDEFPIXEL); + uint32_t HBPP = 1; + while ((uint32_t)(1 << HBPP) < HNUMPATS) { + HBPP++; + } + std::unique_ptr pGID(new CJBig2_GSIDProc()); + pGID->GSMMR = HMMR; + pGID->GSW = HGW; + pGID->GSH = HGH; + pGID->GSBPP = (uint8_t)HBPP; + pGID->GSUSESKIP = 0; + GI = pGID->decode_MMR(pStream, pPause); + if (!GI) + return nullptr; + + for (mg = 0; mg < HGH; mg++) { + for (ng = 0; ng < HGW; ng++) { + x = (HGX + mg * HRY + ng * HRX) >> 8; + y = (HGY + mg * HRX - ng * HRY) >> 8; + uint32_t pat_index = GI[mg * HGW + ng]; + if (pat_index >= HNUMPATS) { + pat_index = HNUMPATS - 1; + } + HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP); + } + } + FX_Free(GI); + return HTREG.release(); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HtrdProc.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HtrdProc.h new file mode 100644 index 000000000000..9a9a5c59c4bc --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HtrdProc.h @@ -0,0 +1,46 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_HTRDPROC_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_HTRDPROC_H_ + +#include "core/fxcodec/jbig2/JBig2_Image.h" +#include "core/fxcrt/fx_system.h" + +class CJBig2_ArithDecoder; +class CJBig2_BitStream; +class IFX_Pause; +struct JBig2ArithCtx; + +class CJBig2_HTRDProc { + public: + CJBig2_Image* decode_Arith(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause); + + CJBig2_Image* decode_MMR(CJBig2_BitStream* pStream, IFX_Pause* pPause); + + public: + uint32_t HBW; + uint32_t HBH; + bool HMMR; + uint8_t HTEMPLATE; + uint32_t HNUMPATS; + CJBig2_Image** HPATS; + bool HDEFPIXEL; + JBig2ComposeOp HCOMBOP; + bool HENABLESKIP; + uint32_t HGW; + uint32_t HGH; + int32_t HGX; + int32_t HGY; + uint16_t HRX; + uint16_t HRY; + uint8_t HPW; + uint8_t HPH; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_HTRDPROC_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp new file mode 100644 index 000000000000..050b5e60741e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp @@ -0,0 +1,45 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_HuffmanDecoder.h" + +#include "core/fxcodec/jbig2/JBig2_Define.h" + +CJBig2_HuffmanDecoder::CJBig2_HuffmanDecoder(CJBig2_BitStream* pStream) + : m_pStream(pStream) {} + +CJBig2_HuffmanDecoder::~CJBig2_HuffmanDecoder() {} + +int CJBig2_HuffmanDecoder::decodeAValue(CJBig2_HuffmanTable* pTable, + int* nResult) { + int nVal = 0; + int nBits = 0; + while (1) { + uint32_t nTmp; + if (m_pStream->read1Bit(&nTmp) == -1) + break; + + nVal = (nVal << 1) | nTmp; + ++nBits; + for (uint32_t i = 0; i < pTable->Size(); ++i) { + if (pTable->GetPREFLEN()[i] == nBits && pTable->GetCODES()[i] == nVal) { + if (pTable->IsHTOOB() && i == pTable->Size() - 1) + return JBIG2_OOB; + + if (m_pStream->readNBits(pTable->GetRANGELEN()[i], &nTmp) == -1) + return -1; + + uint32_t offset = pTable->IsHTOOB() ? 3 : 2; + if (i == pTable->Size() - offset) + *nResult = pTable->GetRANGELOW()[i] - nTmp; + else + *nResult = pTable->GetRANGELOW()[i] + nTmp; + return 0; + } + } + } + return -1; +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanDecoder.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanDecoder.h new file mode 100644 index 000000000000..c72346ac1829 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanDecoder.h @@ -0,0 +1,24 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_HUFFMANDECODER_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_HUFFMANDECODER_H_ + +#include "core/fxcodec/jbig2/JBig2_BitStream.h" +#include "core/fxcodec/jbig2/JBig2_HuffmanTable.h" +class CJBig2_HuffmanDecoder { + public: + explicit CJBig2_HuffmanDecoder(CJBig2_BitStream* pStream); + + ~CJBig2_HuffmanDecoder(); + + int decodeAValue(CJBig2_HuffmanTable* pTable, int* nResult); + + private: + CJBig2_BitStream* const m_pStream; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_HUFFMANDECODER_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable.cpp new file mode 100644 index 000000000000..baf97567fb79 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable.cpp @@ -0,0 +1,140 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_HuffmanTable.h" + +#include +#include + +#include "core/fxcodec/jbig2/JBig2_BitStream.h" +#include "core/fxcodec/jbig2/JBig2_Define.h" +#include "core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h" +#include "core/fxcrt/fx_memory.h" +#include "third_party/base/numerics/safe_math.h" + +CJBig2_HuffmanTable::CJBig2_HuffmanTable(const JBig2TableLine* pTable, + uint32_t nLines, + bool bHTOOB) + : m_bOK(true), HTOOB(bHTOOB), NTEMP(nLines) { + ParseFromStandardTable(pTable); +} + +CJBig2_HuffmanTable::CJBig2_HuffmanTable(CJBig2_BitStream* pStream) + : HTOOB(false), NTEMP(0) { + m_bOK = ParseFromCodedBuffer(pStream); +} + +CJBig2_HuffmanTable::~CJBig2_HuffmanTable() {} + +void CJBig2_HuffmanTable::ParseFromStandardTable(const JBig2TableLine* pTable) { + PREFLEN.resize(NTEMP); + RANGELEN.resize(NTEMP); + RANGELOW.resize(NTEMP); + for (uint32_t i = 0; i < NTEMP; ++i) { + PREFLEN[i] = pTable[i].PREFLEN; + RANGELEN[i] = pTable[i].RANDELEN; + RANGELOW[i] = pTable[i].RANGELOW; + } + InitCodes(); +} + +bool CJBig2_HuffmanTable::ParseFromCodedBuffer(CJBig2_BitStream* pStream) { + unsigned char cTemp; + if (pStream->read1Byte(&cTemp) == -1) + return false; + + HTOOB = !!(cTemp & 0x01); + unsigned char HTPS = ((cTemp >> 1) & 0x07) + 1; + unsigned char HTRS = ((cTemp >> 4) & 0x07) + 1; + uint32_t HTLOW; + uint32_t HTHIGH; + if (pStream->readInteger(&HTLOW) == -1 || + pStream->readInteger(&HTHIGH) == -1) { + return false; + } + + const int low = static_cast(HTLOW); + const int high = static_cast(HTHIGH); + if (low > high) + return false; + + ExtendBuffers(false); + pdfium::base::CheckedNumeric cur_low = low; + do { + if ((pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) || + (pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1) || + (static_cast(RANGELEN[NTEMP]) >= 8 * sizeof(cur_low))) { + return false; + } + RANGELOW[NTEMP] = cur_low.ValueOrDie(); + cur_low += (1 << RANGELEN[NTEMP]); + if (!cur_low.IsValid()) + return false; + ExtendBuffers(true); + } while (cur_low.ValueOrDie() < high); + + if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) + return false; + + RANGELEN[NTEMP] = 32; + RANGELOW[NTEMP] = low - 1; + ExtendBuffers(true); + + if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) + return false; + + RANGELEN[NTEMP] = 32; + RANGELOW[NTEMP] = high; + ExtendBuffers(true); + + if (HTOOB) { + if (pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) + return false; + + ++NTEMP; + } + + InitCodes(); + return true; +} + +void CJBig2_HuffmanTable::InitCodes() { + int lenmax = 0; + for (uint32_t i = 0; i < NTEMP; ++i) + lenmax = std::max(PREFLEN[i], lenmax); + + CODES.resize(NTEMP); + std::vector LENCOUNT(lenmax + 1); + std::vector FIRSTCODE(lenmax + 1); + for (int len : PREFLEN) + ++LENCOUNT[len]; + + FIRSTCODE[0] = 0; + LENCOUNT[0] = 0; + for (int i = 1; i <= lenmax; ++i) { + FIRSTCODE[i] = (FIRSTCODE[i - 1] + LENCOUNT[i - 1]) << 1; + int CURCODE = FIRSTCODE[i]; + for (uint32_t j = 0; j < NTEMP; ++j) { + if (PREFLEN[j] == i) + CODES[j] = CURCODE++; + } + } +} + +void CJBig2_HuffmanTable::ExtendBuffers(bool increment) { + if (increment) + ++NTEMP; + + size_t size = PREFLEN.size(); + if (NTEMP < size) + return; + + size += 16; + ASSERT(NTEMP < size); + PREFLEN.resize(size); + RANGELEN.resize(size); + RANGELOW.resize(size); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable.h new file mode 100644 index 000000000000..58a312488133 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable.h @@ -0,0 +1,50 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_HUFFMANTABLE_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_HUFFMANTABLE_H_ + +#include + +#include "core/fxcrt/fx_system.h" + +class CJBig2_BitStream; +struct JBig2TableLine; + +class CJBig2_HuffmanTable { + public: + CJBig2_HuffmanTable(const JBig2TableLine* pTable, + uint32_t nLines, + bool bHTOOB); + + explicit CJBig2_HuffmanTable(CJBig2_BitStream* pStream); + + ~CJBig2_HuffmanTable(); + + bool IsHTOOB() const { return HTOOB; } + uint32_t Size() const { return NTEMP; } + const std::vector& GetCODES() const { return CODES; } + const std::vector& GetPREFLEN() const { return PREFLEN; } + const std::vector& GetRANGELEN() const { return RANGELEN; } + const std::vector& GetRANGELOW() const { return RANGELOW; } + bool IsOK() const { return m_bOK; } + + private: + void ParseFromStandardTable(const JBig2TableLine* pTable); + bool ParseFromCodedBuffer(CJBig2_BitStream* pStream); + void InitCodes(); + void ExtendBuffers(bool increment); + + bool m_bOK; + bool HTOOB; + uint32_t NTEMP; + std::vector CODES; + std::vector PREFLEN; + std::vector RANGELEN; + std::vector RANGELOW; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_HUFFMANTABLE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.cpp new file mode 100644 index 000000000000..4c2ba997d557 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.cpp @@ -0,0 +1,117 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h" +#include "core/fxcrt/fx_basic.h" + +const bool HuffmanTable_HTOOB_B1 = false; +const JBig2TableLine HuffmanTable_B1[] = {{1, 4, 0}, + {2, 8, 16}, + {3, 16, 272}, + {0, 32, -1}, + {3, 32, 65808}}; +const size_t HuffmanTable_B1_Size = FX_ArraySize(HuffmanTable_B1); + +const bool HuffmanTable_HTOOB_B2 = true; +const JBig2TableLine HuffmanTable_B2[] = {{1, 0, 0}, {2, 0, 1}, {3, 0, 2}, + {4, 3, 3}, {5, 6, 11}, {0, 32, -1}, + {6, 32, 75}, {6, 0, 0}}; +const size_t HuffmanTable_B2_Size = FX_ArraySize(HuffmanTable_B2); + +const bool HuffmanTable_HTOOB_B3 = true; +const JBig2TableLine HuffmanTable_B3[] = { + {8, 8, -256}, {1, 0, 0}, {2, 0, 1}, {3, 0, 2}, {4, 3, 3}, + {5, 6, 11}, {8, 32, -257}, {7, 32, 75}, {6, 0, 0}}; +const size_t HuffmanTable_B3_Size = FX_ArraySize(HuffmanTable_B3); + +const bool HuffmanTable_HTOOB_B4 = false; +const JBig2TableLine HuffmanTable_B4[] = { + {1, 0, 1}, {2, 0, 2}, {3, 0, 3}, {4, 3, 4}, + {5, 6, 12}, {0, 32, -1}, {5, 32, 76}, +}; +const size_t HuffmanTable_B4_Size = FX_ArraySize(HuffmanTable_B4); + +const bool HuffmanTable_HTOOB_B5 = false; +const JBig2TableLine HuffmanTable_B5[] = {{7, 8, -255}, {1, 0, 1}, {2, 0, 2}, + {3, 0, 3}, {4, 3, 4}, {5, 6, 12}, + {7, 32, -256}, {6, 32, 76}}; +const size_t HuffmanTable_B5_Size = FX_ArraySize(HuffmanTable_B5); + +const bool HuffmanTable_HTOOB_B6 = false; +const JBig2TableLine HuffmanTable_B6[] = { + {5, 10, -2048}, {4, 9, -1024}, {4, 8, -512}, {4, 7, -256}, {5, 6, -128}, + {5, 5, -64}, {4, 5, -32}, {2, 7, 0}, {3, 7, 128}, {3, 8, 256}, + {4, 9, 512}, {4, 10, 1024}, {6, 32, -2049}, {6, 32, 2048}}; +const size_t HuffmanTable_B6_Size = FX_ArraySize(HuffmanTable_B6); + +const bool HuffmanTable_HTOOB_B7 = false; +const JBig2TableLine HuffmanTable_B7[] = { + {4, 9, -1024}, {3, 8, -512}, {4, 7, -256}, {5, 6, -128}, {5, 5, -64}, + {4, 5, -32}, {4, 5, 0}, {5, 5, 32}, {5, 6, 64}, {4, 7, 128}, + {3, 8, 256}, {3, 9, 512}, {3, 10, 1024}, {5, 32, -1025}, {5, 32, 2048}, +}; +const size_t HuffmanTable_B7_Size = FX_ArraySize(HuffmanTable_B7); + +const bool HuffmanTable_HTOOB_B8 = true; +const JBig2TableLine HuffmanTable_B8[] = { + {8, 3, -15}, {9, 1, -7}, {8, 1, -5}, {9, 0, -3}, {7, 0, -2}, + {4, 0, -1}, {2, 1, 0}, {5, 0, 2}, {6, 0, 3}, {3, 4, 4}, + {6, 1, 20}, {4, 4, 22}, {4, 5, 38}, {5, 6, 70}, {5, 7, 134}, + {6, 7, 262}, {7, 8, 390}, {6, 10, 646}, {9, 32, -16}, {9, 32, 1670}, + {2, 0, 0}}; +const size_t HuffmanTable_B8_Size = FX_ArraySize(HuffmanTable_B8); + +const bool HuffmanTable_HTOOB_B9 = true; +const JBig2TableLine HuffmanTable_B9[] = { + {8, 4, -31}, {9, 2, -15}, {8, 2, -11}, {9, 1, -7}, {7, 1, -5}, + {4, 1, -3}, {3, 1, -1}, {3, 1, 1}, {5, 1, 3}, {6, 1, 5}, + {3, 5, 7}, {6, 2, 39}, {4, 5, 43}, {4, 6, 75}, {5, 7, 139}, + {5, 8, 267}, {6, 8, 523}, {7, 9, 779}, {6, 11, 1291}, {9, 32, -32}, + {9, 32, 3339}, {2, 0, 0}}; +const size_t HuffmanTable_B9_Size = FX_ArraySize(HuffmanTable_B9); + +const bool HuffmanTable_HTOOB_B10 = true; +const JBig2TableLine HuffmanTable_B10[] = { + {7, 4, -21}, {8, 0, -5}, {7, 0, -4}, {5, 0, -3}, {2, 2, -2}, + {5, 0, 2}, {6, 0, 3}, {7, 0, 4}, {8, 0, 5}, {2, 6, 6}, + {5, 5, 70}, {6, 5, 102}, {6, 6, 134}, {6, 7, 198}, {6, 8, 326}, + {6, 9, 582}, {6, 10, 1094}, {7, 11, 2118}, {8, 32, -22}, {8, 32, 4166}, + {2, 0, 0}}; +const size_t HuffmanTable_B10_Size = FX_ArraySize(HuffmanTable_B10); + +const bool HuffmanTable_HTOOB_B11 = false; +const JBig2TableLine HuffmanTable_B11[] = { + {1, 0, 1}, {2, 1, 2}, {4, 0, 4}, {4, 1, 5}, {5, 1, 7}, + {5, 2, 9}, {6, 2, 13}, {7, 2, 17}, {7, 3, 21}, {7, 4, 29}, + {7, 5, 45}, {7, 6, 77}, {0, 32, 0}, {7, 32, 141}}; +const size_t HuffmanTable_B11_Size = FX_ArraySize(HuffmanTable_B11); + +const bool HuffmanTable_HTOOB_B12 = false; +const JBig2TableLine HuffmanTable_B12[] = { + {1, 0, 1}, {2, 0, 2}, {3, 1, 3}, {5, 0, 5}, {5, 1, 6}, + {6, 1, 8}, {7, 0, 10}, {7, 1, 11}, {7, 2, 13}, {7, 3, 17}, + {7, 4, 25}, {8, 5, 41}, {0, 32, 0}, {8, 32, 73}}; +const size_t HuffmanTable_B12_Size = FX_ArraySize(HuffmanTable_B12); + +const bool HuffmanTable_HTOOB_B13 = false; +const JBig2TableLine HuffmanTable_B13[] = { + {1, 0, 1}, {3, 0, 2}, {4, 0, 3}, {5, 0, 4}, {4, 1, 5}, + {3, 3, 7}, {6, 1, 15}, {6, 2, 17}, {6, 3, 21}, {6, 4, 29}, + {6, 5, 45}, {7, 6, 77}, {0, 32, 0}, {7, 32, 141}}; +const size_t HuffmanTable_B13_Size = FX_ArraySize(HuffmanTable_B13); + +const bool HuffmanTable_HTOOB_B14 = false; +const JBig2TableLine HuffmanTable_B14[] = {{3, 0, -2}, {3, 0, -1}, {1, 0, 0}, + {3, 0, 1}, {3, 0, 2}, {0, 32, -3}, + {0, 32, 3}}; +const size_t HuffmanTable_B14_Size = FX_ArraySize(HuffmanTable_B14); + +const bool HuffmanTable_HTOOB_B15 = false; +const JBig2TableLine HuffmanTable_B15[] = { + {7, 4, -24}, {6, 2, -8}, {5, 1, -4}, {4, 0, -2}, {3, 0, -1}, + {1, 0, 0}, {3, 0, 1}, {4, 0, 2}, {5, 1, 3}, {6, 2, 5}, + {7, 4, 9}, {7, 32, -25}, {7, 32, 25}}; +const size_t HuffmanTable_B15_Size = FX_ArraySize(HuffmanTable_B15); diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h new file mode 100644 index 000000000000..c064f57d0c33 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h @@ -0,0 +1,78 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_HUFFMANTABLE_STANDARD_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_HUFFMANTABLE_STANDARD_H_ + +#include "core/fxcrt/fx_system.h" + +struct JBig2TableLine { + uint8_t PREFLEN; + uint8_t RANDELEN; + int32_t RANGELOW; +}; + +extern const bool HuffmanTable_HTOOB_B1; +extern const JBig2TableLine HuffmanTable_B1[]; +extern const size_t HuffmanTable_B1_Size; + +extern const bool HuffmanTable_HTOOB_B2; +extern const JBig2TableLine HuffmanTable_B2[]; +extern const size_t HuffmanTable_B2_Size; + +extern const bool HuffmanTable_HTOOB_B3; +extern const JBig2TableLine HuffmanTable_B3[]; +extern const size_t HuffmanTable_B3_Size; + +extern const bool HuffmanTable_HTOOB_B4; +extern const JBig2TableLine HuffmanTable_B4[]; +extern const size_t HuffmanTable_B4_Size; + +extern const bool HuffmanTable_HTOOB_B5; +extern const JBig2TableLine HuffmanTable_B5[]; +extern const size_t HuffmanTable_B5_Size; + +extern const bool HuffmanTable_HTOOB_B6; +extern const JBig2TableLine HuffmanTable_B6[]; +extern const size_t HuffmanTable_B6_Size; + +extern const bool HuffmanTable_HTOOB_B7; +extern const JBig2TableLine HuffmanTable_B7[]; +extern const size_t HuffmanTable_B7_Size; + +extern const bool HuffmanTable_HTOOB_B8; +extern const JBig2TableLine HuffmanTable_B8[]; +extern const size_t HuffmanTable_B8_Size; + +extern const bool HuffmanTable_HTOOB_B9; +extern const JBig2TableLine HuffmanTable_B9[]; +extern const size_t HuffmanTable_B9_Size; + +extern const bool HuffmanTable_HTOOB_B10; +extern const JBig2TableLine HuffmanTable_B10[]; +extern const size_t HuffmanTable_B10_Size; + +extern const bool HuffmanTable_HTOOB_B11; +extern const JBig2TableLine HuffmanTable_B11[]; +extern const size_t HuffmanTable_B11_Size; + +extern const bool HuffmanTable_HTOOB_B12; +extern const JBig2TableLine HuffmanTable_B12[]; +extern const size_t HuffmanTable_B12_Size; + +extern const bool HuffmanTable_HTOOB_B13; +extern const JBig2TableLine HuffmanTable_B13[]; +extern const size_t HuffmanTable_B13_Size; + +extern const bool HuffmanTable_HTOOB_B14; +extern const JBig2TableLine HuffmanTable_B14[]; +extern const size_t HuffmanTable_B14_Size; + +extern const bool HuffmanTable_HTOOB_B15; +extern const JBig2TableLine HuffmanTable_B15[]; +extern const size_t HuffmanTable_B15_Size; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_HUFFMANTABLE_STANDARD_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Image.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Image.cpp new file mode 100644 index 000000000000..8f935ceb1f94 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Image.cpp @@ -0,0 +1,1096 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include "core/fxcodec/jbig2/JBig2_Image.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_safe_types.h" + +namespace { + +const int kMaxImagePixels = INT_MAX - 31; +const int kMaxImageBytes = kMaxImagePixels / 8; + +} // namespace + +CJBig2_Image::CJBig2_Image(int32_t w, int32_t h) + : m_pData(nullptr), + m_nWidth(0), + m_nHeight(0), + m_nStride(0), + m_bOwnsBuffer(true) { + if (w <= 0 || h <= 0 || w > kMaxImagePixels) + return; + + int32_t stride_pixels = (w + 31) & ~31; + if (h > kMaxImagePixels / stride_pixels) + return; + + m_nWidth = w; + m_nHeight = h; + m_nStride = stride_pixels / 8; + m_pData = FX_Alloc2D(uint8_t, m_nStride, m_nHeight); +} + +CJBig2_Image::CJBig2_Image(int32_t w, int32_t h, int32_t stride, uint8_t* pBuf) + : m_pData(nullptr), + m_nWidth(0), + m_nHeight(0), + m_nStride(0), + m_bOwnsBuffer(false) { + if (w < 0 || h < 0 || stride < 0 || stride > kMaxImageBytes) + return; + + int32_t stride_pixels = 8 * stride; + if (stride_pixels < w || h > kMaxImagePixels / stride_pixels) + return; + + m_nWidth = w; + m_nHeight = h; + m_nStride = stride; + m_pData = pBuf; +} + +CJBig2_Image::CJBig2_Image(const CJBig2_Image& other) + : m_pData(nullptr), + m_nWidth(other.m_nWidth), + m_nHeight(other.m_nHeight), + m_nStride(other.m_nStride), + m_bOwnsBuffer(true) { + if (other.m_pData) { + m_pData = FX_Alloc2D(uint8_t, m_nStride, m_nHeight); + JBIG2_memcpy(m_pData, other.m_pData, m_nStride * m_nHeight); + } +} + +CJBig2_Image::~CJBig2_Image() { + if (m_bOwnsBuffer) { + FX_Free(m_pData); + } +} + +int CJBig2_Image::getPixel(int32_t x, int32_t y) { + if (!m_pData) + return 0; + + if (x < 0 || x >= m_nWidth) + return 0; + + if (y < 0 || y >= m_nHeight) + return 0; + + int32_t m = y * m_nStride + (x >> 3); + int32_t n = x & 7; + return ((m_pData[m] >> (7 - n)) & 1); +} + +int32_t CJBig2_Image::setPixel(int32_t x, int32_t y, int v) { + if (!m_pData) + return 0; + + if (x < 0 || x >= m_nWidth) + return 0; + + if (y < 0 || y >= m_nHeight) + return 0; + + int32_t m = y * m_nStride + (x >> 3); + int32_t n = x & 7; + if (v) + m_pData[m] |= 1 << (7 - n); + else + m_pData[m] &= ~(1 << (7 - n)); + + return 1; +} + +void CJBig2_Image::copyLine(int32_t hTo, int32_t hFrom) { + if (!m_pData) { + return; + } + if (hFrom < 0 || hFrom >= m_nHeight) { + JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride); + } else { + JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride, + m_nStride); + } +} +void CJBig2_Image::fill(bool v) { + if (!m_pData) { + return; + } + JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight); +} +bool CJBig2_Image::composeTo(CJBig2_Image* pDst, + int32_t x, + int32_t y, + JBig2ComposeOp op) { + if (!m_pData) { + return false; + } + return composeTo_opt2(pDst, x, y, op); +} +bool CJBig2_Image::composeTo(CJBig2_Image* pDst, + int32_t x, + int32_t y, + JBig2ComposeOp op, + const FX_RECT* pSrcRect) { + if (!m_pData) + return false; + + if (!pSrcRect || *pSrcRect == FX_RECT(0, 0, m_nWidth, m_nHeight)) + return composeTo_opt2(pDst, x, y, op); + + return composeTo_opt2(pDst, x, y, op, pSrcRect); +} + +bool CJBig2_Image::composeFrom(int32_t x, + int32_t y, + CJBig2_Image* pSrc, + JBig2ComposeOp op) { + if (!m_pData) { + return false; + } + return pSrc->composeTo(this, x, y, op); +} +bool CJBig2_Image::composeFrom(int32_t x, + int32_t y, + CJBig2_Image* pSrc, + JBig2ComposeOp op, + const FX_RECT* pSrcRect) { + if (!m_pData) { + return false; + } + return pSrc->composeTo(this, x, y, op, pSrcRect); +} +#define JBIG2_GETDWORD(buf) \ + ((uint32_t)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3])) +CJBig2_Image* CJBig2_Image::subImage(int32_t x, + int32_t y, + int32_t w, + int32_t h) { + int32_t m, n, j; + uint8_t *pLineSrc, *pLineDst; + uint32_t wTmp; + uint8_t *pSrc, *pSrcEnd, *pDst, *pDstEnd; + if (w == 0 || h == 0) { + return nullptr; + } + CJBig2_Image* pImage = new CJBig2_Image(w, h); + if (!m_pData) { + pImage->fill(0); + return pImage; + } + if (!pImage->m_pData) { + return pImage; + } + pLineSrc = m_pData + m_nStride * y; + pLineDst = pImage->m_pData; + m = (x >> 5) << 2; + n = x & 31; + if (n == 0) { + for (j = 0; j < h; j++) { + pSrc = pLineSrc + m; + pSrcEnd = pLineSrc + m_nStride; + pDst = pLineDst; + pDstEnd = pLineDst + pImage->m_nStride; + for (; pDst < pDstEnd; pSrc += 4, pDst += 4) { + *((uint32_t*)pDst) = *((uint32_t*)pSrc); + } + pLineSrc += m_nStride; + pLineDst += pImage->m_nStride; + } + } else { + for (j = 0; j < h; j++) { + pSrc = pLineSrc + m; + pSrcEnd = pLineSrc + m_nStride; + pDst = pLineDst; + pDstEnd = pLineDst + pImage->m_nStride; + for (; pDst < pDstEnd; pSrc += 4, pDst += 4) { + if (pSrc + 4 < pSrcEnd) { + wTmp = (JBIG2_GETDWORD(pSrc) << n) | + (JBIG2_GETDWORD(pSrc + 4) >> (32 - n)); + } else { + wTmp = JBIG2_GETDWORD(pSrc) << n; + } + pDst[0] = (uint8_t)(wTmp >> 24); + pDst[1] = (uint8_t)(wTmp >> 16); + pDst[2] = (uint8_t)(wTmp >> 8); + pDst[3] = (uint8_t)wTmp; + } + pLineSrc += m_nStride; + pLineDst += pImage->m_nStride; + } + } + return pImage; +} + +void CJBig2_Image::expand(int32_t h, bool v) { + if (!m_pData || h <= m_nHeight || h > kMaxImageBytes / m_nStride) + return; + + if (m_bOwnsBuffer) { + m_pData = FX_Realloc(uint8_t, m_pData, h * m_nStride); + } else { + uint8_t* pExternalBuffer = m_pData; + m_pData = FX_Alloc(uint8_t, h * m_nStride); + JBIG2_memcpy(m_pData, pExternalBuffer, m_nHeight * m_nStride); + m_bOwnsBuffer = true; + } + JBIG2_memset(m_pData + m_nHeight * m_nStride, v ? 0xff : 0, + (h - m_nHeight) * m_nStride); + m_nHeight = h; +} + +bool CJBig2_Image::composeTo_opt2(CJBig2_Image* pDst, + int32_t x, + int32_t y, + JBig2ComposeOp op) { + int32_t xs0 = 0, ys0 = 0, xs1 = 0, ys1 = 0, xd0 = 0, yd0 = 0, xd1 = 0, + yd1 = 0, xx = 0, yy = 0, w = 0, h = 0, middleDwords = 0, lineLeft = 0; + + uint32_t s1 = 0, d1 = 0, d2 = 0, shift = 0, shift1 = 0, shift2 = 0, tmp = 0, + tmp1 = 0, tmp2 = 0, maskL = 0, maskR = 0, maskM = 0; + + if (!m_pData) + return false; + + if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) + return false; + + if (y < 0) { + ys0 = -y; + } + if (y + m_nHeight > pDst->m_nHeight) { + ys1 = pDst->m_nHeight - y; + } else { + ys1 = m_nHeight; + } + if (x < 0) { + xs0 = -x; + } + if (x + m_nWidth > pDst->m_nWidth) { + xs1 = pDst->m_nWidth - x; + } else { + xs1 = m_nWidth; + } + if ((ys0 >= ys1) || (xs0 >= xs1)) { + return 0; + } + w = xs1 - xs0; + h = ys1 - ys0; + if (y >= 0) { + yd0 = y; + } + if (x >= 0) { + xd0 = x; + } + xd1 = xd0 + w; + yd1 = yd0 + h; + d1 = xd0 & 31; + d2 = xd1 & 31; + s1 = xs0 & 31; + maskL = 0xffffffff >> d1; + maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32); + maskM = maskL & maskR; + uint8_t* lineSrc = m_pData + ys0 * m_nStride + ((xs0 >> 5) << 2); + lineLeft = m_nStride - ((xs0 >> 5) << 2); + uint8_t* lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2); + if ((xd0 & ~31) == ((xd1 - 1) & ~31)) { + if ((xs0 & ~31) == ((xs1 - 1) & ~31)) { + if (s1 > d1) { + shift = s1 - d1; + for (yy = yd0; yy < yd1; yy++) { + tmp1 = JBIG2_GETDWORD(lineSrc) << shift; + tmp2 = JBIG2_GETDWORD(lineDst); + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskM) | (tmp1 & maskM); + break; + } + lineDst[0] = (uint8_t)(tmp >> 24); + lineDst[1] = (uint8_t)(tmp >> 16); + lineDst[2] = (uint8_t)(tmp >> 8); + lineDst[3] = (uint8_t)tmp; + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } else { + shift = d1 - s1; + for (yy = yd0; yy < yd1; yy++) { + tmp1 = JBIG2_GETDWORD(lineSrc) >> shift; + tmp2 = JBIG2_GETDWORD(lineDst); + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskM) | (tmp1 & maskM); + break; + } + lineDst[0] = (uint8_t)(tmp >> 24); + lineDst[1] = (uint8_t)(tmp >> 16); + lineDst[2] = (uint8_t)(tmp >> 8); + lineDst[3] = (uint8_t)tmp; + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } + } else { + shift1 = s1 - d1; + shift2 = 32 - shift1; + for (yy = yd0; yy < yd1; yy++) { + tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | + (JBIG2_GETDWORD(lineSrc + 4) >> shift2); + tmp2 = JBIG2_GETDWORD(lineDst); + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskM) | (tmp1 & maskM); + break; + } + lineDst[0] = (uint8_t)(tmp >> 24); + lineDst[1] = (uint8_t)(tmp >> 16); + lineDst[2] = (uint8_t)(tmp >> 8); + lineDst[3] = (uint8_t)tmp; + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } + } else { + uint8_t* sp = nullptr; + uint8_t* dp = nullptr; + + if (s1 > d1) { + shift1 = s1 - d1; + shift2 = 32 - shift1; + middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); + for (yy = yd0; yy < yd1; yy++) { + sp = lineSrc; + dp = lineDst; + if (d1 != 0) { + tmp1 = (JBIG2_GETDWORD(sp) << shift1) | + (JBIG2_GETDWORD(sp + 4) >> shift2); + tmp2 = JBIG2_GETDWORD(dp); + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskL) | (tmp1 & maskL); + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + sp += 4; + dp += 4; + } + for (xx = 0; xx < middleDwords; xx++) { + tmp1 = (JBIG2_GETDWORD(sp) << shift1) | + (JBIG2_GETDWORD(sp + 4) >> shift2); + tmp2 = JBIG2_GETDWORD(dp); + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = tmp1 | tmp2; + break; + case JBIG2_COMPOSE_AND: + tmp = tmp1 & tmp2; + break; + case JBIG2_COMPOSE_XOR: + tmp = tmp1 ^ tmp2; + break; + case JBIG2_COMPOSE_XNOR: + tmp = ~(tmp1 ^ tmp2); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = tmp1; + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + sp += 4; + dp += 4; + } + if (d2 != 0) { + tmp1 = + (JBIG2_GETDWORD(sp) << shift1) | + (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> + shift2); + tmp2 = JBIG2_GETDWORD(dp); + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskR) | (tmp1 & maskR); + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + } + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } else if (s1 == d1) { + middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); + for (yy = yd0; yy < yd1; yy++) { + sp = lineSrc; + dp = lineDst; + if (d1 != 0) { + tmp1 = JBIG2_GETDWORD(sp); + tmp2 = JBIG2_GETDWORD(dp); + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskL) | (tmp1 & maskL); + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + sp += 4; + dp += 4; + } + for (xx = 0; xx < middleDwords; xx++) { + tmp1 = JBIG2_GETDWORD(sp); + tmp2 = JBIG2_GETDWORD(dp); + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = tmp1 | tmp2; + break; + case JBIG2_COMPOSE_AND: + tmp = tmp1 & tmp2; + break; + case JBIG2_COMPOSE_XOR: + tmp = tmp1 ^ tmp2; + break; + case JBIG2_COMPOSE_XNOR: + tmp = ~(tmp1 ^ tmp2); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = tmp1; + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + sp += 4; + dp += 4; + } + if (d2 != 0) { + tmp1 = JBIG2_GETDWORD(sp); + tmp2 = JBIG2_GETDWORD(dp); + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskR) | (tmp1 & maskR); + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + } + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } else { + shift1 = d1 - s1; + shift2 = 32 - shift1; + middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); + for (yy = yd0; yy < yd1; yy++) { + sp = lineSrc; + dp = lineDst; + if (d1 != 0) { + tmp1 = JBIG2_GETDWORD(sp) >> shift1; + tmp2 = JBIG2_GETDWORD(dp); + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskL) | (tmp1 & maskL); + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + dp += 4; + } + for (xx = 0; xx < middleDwords; xx++) { + tmp1 = (JBIG2_GETDWORD(sp) << shift2) | + ((JBIG2_GETDWORD(sp + 4)) >> shift1); + tmp2 = JBIG2_GETDWORD(dp); + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = tmp1 | tmp2; + break; + case JBIG2_COMPOSE_AND: + tmp = tmp1 & tmp2; + break; + case JBIG2_COMPOSE_XOR: + tmp = tmp1 ^ tmp2; + break; + case JBIG2_COMPOSE_XNOR: + tmp = ~(tmp1 ^ tmp2); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = tmp1; + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + sp += 4; + dp += 4; + } + if (d2 != 0) { + tmp1 = + (JBIG2_GETDWORD(sp) << shift2) | + (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> + shift1); + tmp2 = JBIG2_GETDWORD(dp); + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskR) | (tmp1 & maskR); + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + } + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } + } + return 1; +} +bool CJBig2_Image::composeTo_opt2(CJBig2_Image* pDst, + int32_t x, + int32_t y, + JBig2ComposeOp op, + const FX_RECT* pSrcRect) { + if (!m_pData) { + return false; + } + // TODO(weili): Check whether the range check is correct. Should x>=1048576? + if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) { + return false; + } + int32_t sw = pSrcRect->Width(); + int32_t sh = pSrcRect->Height(); + int32_t ys0 = y < 0 ? -y : 0; + int32_t ys1 = y + sh > pDst->m_nHeight ? pDst->m_nHeight - y : sh; + int32_t xs0 = x < 0 ? -x : 0; + int32_t xs1 = x + sw > pDst->m_nWidth ? pDst->m_nWidth - x : sw; + if ((ys0 >= ys1) || (xs0 >= xs1)) { + return 0; + } + int32_t w = xs1 - xs0; + int32_t h = ys1 - ys0; + int32_t yd0 = y < 0 ? 0 : y; + int32_t xd0 = x < 0 ? 0 : x; + int32_t xd1 = xd0 + w; + int32_t yd1 = yd0 + h; + int32_t d1 = xd0 & 31; + int32_t d2 = xd1 & 31; + int32_t s1 = xs0 & 31; + int32_t maskL = 0xffffffff >> d1; + int32_t maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32); + int32_t maskM = maskL & maskR; + uint8_t* lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride + + (((xs0 + pSrcRect->left) >> 5) << 2); + int32_t lineLeft = m_nStride - ((xs0 >> 5) << 2); + uint8_t* lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2); + if ((xd0 & ~31) == ((xd1 - 1) & ~31)) { + if ((xs0 & ~31) == ((xs1 - 1) & ~31)) { + if (s1 > d1) { + uint32_t shift = s1 - d1; + for (int32_t yy = yd0; yy < yd1; yy++) { + uint32_t tmp1 = JBIG2_GETDWORD(lineSrc) << shift; + uint32_t tmp2 = JBIG2_GETDWORD(lineDst); + uint32_t tmp = 0; + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskM) | (tmp1 & maskM); + break; + } + lineDst[0] = (uint8_t)(tmp >> 24); + lineDst[1] = (uint8_t)(tmp >> 16); + lineDst[2] = (uint8_t)(tmp >> 8); + lineDst[3] = (uint8_t)tmp; + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } else { + uint32_t shift = d1 - s1; + for (int32_t yy = yd0; yy < yd1; yy++) { + uint32_t tmp1 = JBIG2_GETDWORD(lineSrc) >> shift; + uint32_t tmp2 = JBIG2_GETDWORD(lineDst); + uint32_t tmp = 0; + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskM) | (tmp1 & maskM); + break; + } + lineDst[0] = (uint8_t)(tmp >> 24); + lineDst[1] = (uint8_t)(tmp >> 16); + lineDst[2] = (uint8_t)(tmp >> 8); + lineDst[3] = (uint8_t)tmp; + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } + } else { + uint32_t shift1 = s1 - d1; + uint32_t shift2 = 32 - shift1; + for (int32_t yy = yd0; yy < yd1; yy++) { + uint32_t tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | + (JBIG2_GETDWORD(lineSrc + 4) >> shift2); + uint32_t tmp2 = JBIG2_GETDWORD(lineDst); + uint32_t tmp = 0; + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskM) | (tmp1 & maskM); + break; + } + lineDst[0] = (uint8_t)(tmp >> 24); + lineDst[1] = (uint8_t)(tmp >> 16); + lineDst[2] = (uint8_t)(tmp >> 8); + lineDst[3] = (uint8_t)tmp; + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } + } else { + if (s1 > d1) { + uint32_t shift1 = s1 - d1; + uint32_t shift2 = 32 - shift1; + int32_t middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); + for (int32_t yy = yd0; yy < yd1; yy++) { + uint8_t* sp = lineSrc; + uint8_t* dp = lineDst; + if (d1 != 0) { + uint32_t tmp1 = (JBIG2_GETDWORD(sp) << shift1) | + (JBIG2_GETDWORD(sp + 4) >> shift2); + uint32_t tmp2 = JBIG2_GETDWORD(dp); + uint32_t tmp = 0; + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskL) | (tmp1 & maskL); + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + sp += 4; + dp += 4; + } + for (int32_t xx = 0; xx < middleDwords; xx++) { + uint32_t tmp1 = (JBIG2_GETDWORD(sp) << shift1) | + (JBIG2_GETDWORD(sp + 4) >> shift2); + uint32_t tmp2 = JBIG2_GETDWORD(dp); + uint32_t tmp = 0; + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = tmp1 | tmp2; + break; + case JBIG2_COMPOSE_AND: + tmp = tmp1 & tmp2; + break; + case JBIG2_COMPOSE_XOR: + tmp = tmp1 ^ tmp2; + break; + case JBIG2_COMPOSE_XNOR: + tmp = ~(tmp1 ^ tmp2); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = tmp1; + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + sp += 4; + dp += 4; + } + if (d2 != 0) { + uint32_t tmp1 = + (JBIG2_GETDWORD(sp) << shift1) | + (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> + shift2); + uint32_t tmp2 = JBIG2_GETDWORD(dp); + uint32_t tmp = 0; + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskR) | (tmp1 & maskR); + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + } + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } else if (s1 == d1) { + int32_t middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); + for (int32_t yy = yd0; yy < yd1; yy++) { + uint8_t* sp = lineSrc; + uint8_t* dp = lineDst; + if (d1 != 0) { + uint32_t tmp1 = JBIG2_GETDWORD(sp); + uint32_t tmp2 = JBIG2_GETDWORD(dp); + uint32_t tmp = 0; + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskL) | (tmp1 & maskL); + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + sp += 4; + dp += 4; + } + for (int32_t xx = 0; xx < middleDwords; xx++) { + uint32_t tmp1 = JBIG2_GETDWORD(sp); + uint32_t tmp2 = JBIG2_GETDWORD(dp); + uint32_t tmp = 0; + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = tmp1 | tmp2; + break; + case JBIG2_COMPOSE_AND: + tmp = tmp1 & tmp2; + break; + case JBIG2_COMPOSE_XOR: + tmp = tmp1 ^ tmp2; + break; + case JBIG2_COMPOSE_XNOR: + tmp = ~(tmp1 ^ tmp2); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = tmp1; + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + sp += 4; + dp += 4; + } + if (d2 != 0) { + uint32_t tmp1 = JBIG2_GETDWORD(sp); + uint32_t tmp2 = JBIG2_GETDWORD(dp); + uint32_t tmp = 0; + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskR) | (tmp1 & maskR); + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + } + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } else { + uint32_t shift1 = d1 - s1; + uint32_t shift2 = 32 - shift1; + int32_t middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); + for (int32_t yy = yd0; yy < yd1; yy++) { + uint8_t* sp = lineSrc; + uint8_t* dp = lineDst; + if (d1 != 0) { + uint32_t tmp1 = JBIG2_GETDWORD(sp) >> shift1; + uint32_t tmp2 = JBIG2_GETDWORD(dp); + uint32_t tmp = 0; + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskL) | (tmp1 & maskL); + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + dp += 4; + } + for (int32_t xx = 0; xx < middleDwords; xx++) { + uint32_t tmp1 = (JBIG2_GETDWORD(sp) << shift2) | + ((JBIG2_GETDWORD(sp + 4)) >> shift1); + uint32_t tmp2 = JBIG2_GETDWORD(dp); + uint32_t tmp = 0; + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = tmp1 | tmp2; + break; + case JBIG2_COMPOSE_AND: + tmp = tmp1 & tmp2; + break; + case JBIG2_COMPOSE_XOR: + tmp = tmp1 ^ tmp2; + break; + case JBIG2_COMPOSE_XNOR: + tmp = ~(tmp1 ^ tmp2); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = tmp1; + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + sp += 4; + dp += 4; + } + if (d2 != 0) { + uint32_t tmp1 = + (JBIG2_GETDWORD(sp) << shift2) | + (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> + shift1); + uint32_t tmp2 = JBIG2_GETDWORD(dp); + uint32_t tmp = 0; + switch (op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskR) | (tmp1 & maskR); + break; + } + dp[0] = (uint8_t)(tmp >> 24); + dp[1] = (uint8_t)(tmp >> 16); + dp[2] = (uint8_t)(tmp >> 8); + dp[3] = (uint8_t)tmp; + } + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } + } + return 1; +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Image.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Image.h new file mode 100644 index 000000000000..54529ef868d3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Image.h @@ -0,0 +1,75 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_IMAGE_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_IMAGE_H_ + +#include "core/fxcodec/jbig2/JBig2_Define.h" + +struct FX_RECT; + +enum JBig2ComposeOp { + JBIG2_COMPOSE_OR = 0, + JBIG2_COMPOSE_AND = 1, + JBIG2_COMPOSE_XOR = 2, + JBIG2_COMPOSE_XNOR = 3, + JBIG2_COMPOSE_REPLACE = 4 +}; + +class CJBig2_Image { + public: + CJBig2_Image(int32_t w, int32_t h); + CJBig2_Image(int32_t w, int32_t h, int32_t stride, uint8_t* pBuf); + CJBig2_Image(const CJBig2_Image& im); + ~CJBig2_Image(); + + int32_t width() const { return m_nWidth; } + int32_t height() const { return m_nHeight; } + int32_t stride() const { return m_nStride; } + + int getPixel(int32_t x, int32_t y); + int32_t setPixel(int32_t x, int32_t y, int bVal); + + void copyLine(int32_t hTo, int32_t hFrom); + void fill(bool v); + + bool composeTo(CJBig2_Image* pDst, int32_t x, int32_t y, JBig2ComposeOp op); + bool composeTo(CJBig2_Image* pDst, + int32_t x, + int32_t y, + JBig2ComposeOp op, + const FX_RECT* pSrcRect); + + bool composeTo_opt2(CJBig2_Image* pDst, + int32_t x, + int32_t y, + JBig2ComposeOp op); + bool composeTo_opt2(CJBig2_Image* pDst, + int32_t x, + int32_t y, + JBig2ComposeOp op, + const FX_RECT* pSrcRect); + + bool composeFrom(int32_t x, int32_t y, CJBig2_Image* pSrc, JBig2ComposeOp op); + bool composeFrom(int32_t x, + int32_t y, + CJBig2_Image* pSrc, + JBig2ComposeOp op, + const FX_RECT* pSrcRect); + + CJBig2_Image* subImage(int32_t x, int32_t y, int32_t w, int32_t h); + void expand(int32_t h, bool v); + + uint8_t* m_pData; + + private: + int32_t m_nWidth; // 1-bit pixels + int32_t m_nHeight; // lines + int32_t m_nStride; // bytes + bool m_bOwnsBuffer; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_IMAGE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Image_unittest.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Image_unittest.cpp new file mode 100644 index 000000000000..788f922a02e9 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Image_unittest.cpp @@ -0,0 +1,105 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// TODO(tsepez) this requires a lot more testing. + +#include + +#include "core/fxcodec/jbig2/JBig2_Image.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +const int32_t kWidthPixels = 80; +const int32_t kWidthBytes = 10; +const int32_t kStrideBytes = kWidthBytes + 1; // For testing stride != width. +const int32_t kHeightLines = 20; +const int32_t kLargerHeightLines = 100; +const int32_t kTooLargeHeightLines = 40000000; + +} // namespace + +TEST(fxcodec, JBig2ImageCreate) { + CJBig2_Image img(kWidthPixels, kHeightLines); + img.setPixel(0, 0, true); + img.setPixel(kWidthPixels - 1, kHeightLines - 1, false); + EXPECT_EQ(kWidthPixels, img.width()); + EXPECT_EQ(kHeightLines, img.height()); + EXPECT_TRUE(img.getPixel(0, 0)); + EXPECT_FALSE(img.getPixel(kWidthPixels - 1, kHeightLines - 1)); +} + +TEST(fxcodec, JBig2ImageCreateTooBig) { + CJBig2_Image img(kWidthPixels, kTooLargeHeightLines); + EXPECT_EQ(0, img.width()); + EXPECT_EQ(0, img.height()); + EXPECT_EQ(nullptr, img.m_pData); +} + +TEST(fxcodec, JBig2ImageCreateExternal) { + uint8_t buf[kHeightLines * kStrideBytes]; + CJBig2_Image img(kWidthPixels, kHeightLines, kStrideBytes, buf); + img.setPixel(0, 0, true); + img.setPixel(kWidthPixels - 1, kHeightLines - 1, false); + EXPECT_EQ(kWidthPixels, img.width()); + EXPECT_EQ(kHeightLines, img.height()); + EXPECT_TRUE(img.getPixel(0, 0)); + EXPECT_FALSE(img.getPixel(kWidthPixels - 1, kHeightLines - 1)); +} + +TEST(fxcodec, JBig2ImageCreateExternalTooBig) { + uint8_t buf[kHeightLines * kStrideBytes]; + CJBig2_Image img(kWidthPixels, kTooLargeHeightLines, kStrideBytes, buf); + EXPECT_EQ(0, img.width()); + EXPECT_EQ(0, img.height()); + EXPECT_EQ(nullptr, img.m_pData); +} + +TEST(fxcodec, JBig2ImageExpand) { + CJBig2_Image img(kWidthPixels, kHeightLines); + img.setPixel(0, 0, true); + img.setPixel(kWidthPixels - 1, kHeightLines - 1, false); + img.expand(kLargerHeightLines, true); + EXPECT_EQ(kWidthPixels, img.width()); + EXPECT_EQ(kLargerHeightLines, img.height()); + EXPECT_TRUE(img.getPixel(0, 0)); + EXPECT_FALSE(img.getPixel(kWidthPixels - 1, kHeightLines - 1)); + EXPECT_TRUE(img.getPixel(kWidthPixels - 1, kLargerHeightLines - 1)); +} + +TEST(fxcodec, JBig2ImageExpandTooBig) { + CJBig2_Image img(kWidthPixels, kHeightLines); + img.setPixel(0, 0, true); + img.setPixel(kWidthPixels - 1, kHeightLines - 1, false); + img.expand(kTooLargeHeightLines, true); + EXPECT_EQ(kWidthPixels, img.width()); + EXPECT_EQ(kHeightLines, img.height()); + EXPECT_TRUE(img.getPixel(0, 0)); + EXPECT_FALSE(img.getPixel(kWidthPixels - 1, kHeightLines - 1)); +} + +TEST(fxcodec, JBig2ImageExpandExternal) { + uint8_t buf[kHeightLines * kStrideBytes]; + CJBig2_Image img(kWidthPixels, kHeightLines, kStrideBytes, buf); + img.setPixel(0, 0, true); + img.setPixel(kWidthPixels - 1, kHeightLines - 1, false); + img.expand(kLargerHeightLines, true); + EXPECT_EQ(kWidthPixels, img.width()); + EXPECT_EQ(kLargerHeightLines, img.height()); + EXPECT_TRUE(img.getPixel(0, 0)); + EXPECT_FALSE(img.getPixel(kWidthPixels - 1, kHeightLines - 1)); + EXPECT_TRUE(img.getPixel(kWidthPixels - 1, kLargerHeightLines - 1)); +} + +TEST(fxcodec, JBig2ImageExpandExternalTooBig) { + uint8_t buf[kHeightLines * kStrideBytes]; + CJBig2_Image img(kWidthPixels, kHeightLines, kStrideBytes, buf); + img.setPixel(0, 0, true); + img.setPixel(kWidthPixels - 1, kHeightLines - 1, false); + img.expand(kTooLargeHeightLines, true); + EXPECT_EQ(kWidthPixels, img.width()); + EXPECT_EQ(kHeightLines, img.height()); + EXPECT_TRUE(img.getPixel(0, 0)); + EXPECT_FALSE(img.getPixel(kWidthPixels - 1, kHeightLines - 1)); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Page.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Page.h new file mode 100644 index 000000000000..064b9b35452f --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Page.h @@ -0,0 +1,22 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_PAGE_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_PAGE_H_ + +#include "core/fxcrt/fx_system.h" + +struct JBig2PageInfo { + uint32_t m_dwWidth; + uint32_t m_dwHeight; + uint32_t m_dwResolutionX; + uint32_t m_dwResolutionY; + uint8_t m_cFlags; + bool m_bIsStriped; + uint16_t m_wMaxStripeSize; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_PAGE_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PatternDict.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PatternDict.cpp new file mode 100644 index 000000000000..cd6a2ad3c2cc --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PatternDict.cpp @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_PatternDict.h" + +#include "core/fxcrt/fx_memory.h" + +CJBig2_PatternDict::CJBig2_PatternDict() { + NUMPATS = 0; + HDPATS = nullptr; +} + +CJBig2_PatternDict::~CJBig2_PatternDict() { + if (HDPATS) { + for (uint32_t i = 0; i < NUMPATS; i++) { + delete HDPATS[i]; + } + FX_Free(HDPATS); + } +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PatternDict.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PatternDict.h new file mode 100644 index 000000000000..dddd4747f0b1 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PatternDict.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_PATTERNDICT_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_PATTERNDICT_H_ + +#include "core/fxcodec/jbig2/JBig2_Define.h" +#include "core/fxcodec/jbig2/JBig2_Image.h" + +class CJBig2_PatternDict { + public: + CJBig2_PatternDict(); + + ~CJBig2_PatternDict(); + + uint32_t NUMPATS; + CJBig2_Image** HDPATS; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_PATTERNDICT_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PddProc.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PddProc.cpp new file mode 100644 index 000000000000..679a87a03695 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PddProc.cpp @@ -0,0 +1,83 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_PddProc.h" + +#include + +#include "core/fxcodec/jbig2/JBig2_GrdProc.h" +#include "core/fxcodec/jbig2/JBig2_Image.h" +#include "core/fxcodec/jbig2/JBig2_PatternDict.h" + +CJBig2_PatternDict* CJBig2_PDDProc::decode_Arith( + CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause) { + uint32_t GRAY; + CJBig2_Image* BHDC = nullptr; + std::unique_ptr pDict(new CJBig2_PatternDict()); + pDict->NUMPATS = GRAYMAX + 1; + pDict->HDPATS = FX_Alloc(CJBig2_Image*, pDict->NUMPATS); + JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS); + + std::unique_ptr pGRD(new CJBig2_GRDProc()); + pGRD->MMR = HDMMR; + pGRD->GBW = (GRAYMAX + 1) * HDPW; + pGRD->GBH = HDPH; + pGRD->GBTEMPLATE = HDTEMPLATE; + pGRD->TPGDON = 0; + pGRD->USESKIP = 0; + pGRD->GBAT[0] = -(int32_t)HDPW; + pGRD->GBAT[1] = 0; + if (pGRD->GBTEMPLATE == 0) { + pGRD->GBAT[2] = -3; + pGRD->GBAT[3] = -1; + pGRD->GBAT[4] = 2; + pGRD->GBAT[5] = -2; + pGRD->GBAT[6] = -2; + pGRD->GBAT[7] = -2; + } + FXCODEC_STATUS status = + pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbContext, nullptr); + while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) + status = pGRD->Continue_decode(pPause); + if (!BHDC) + return nullptr; + + GRAY = 0; + while (GRAY <= GRAYMAX) { + pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH); + GRAY = GRAY + 1; + } + delete BHDC; + return pDict.release(); +} + +CJBig2_PatternDict* CJBig2_PDDProc::decode_MMR(CJBig2_BitStream* pStream, + IFX_Pause* pPause) { + uint32_t GRAY; + CJBig2_Image* BHDC = nullptr; + std::unique_ptr pDict(new CJBig2_PatternDict()); + pDict->NUMPATS = GRAYMAX + 1; + pDict->HDPATS = FX_Alloc(CJBig2_Image*, pDict->NUMPATS); + JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*) * pDict->NUMPATS); + + std::unique_ptr pGRD(new CJBig2_GRDProc()); + pGRD->MMR = HDMMR; + pGRD->GBW = (GRAYMAX + 1) * HDPW; + pGRD->GBH = HDPH; + pGRD->Start_decode_MMR(&BHDC, pStream, nullptr); + if (!BHDC) + return nullptr; + + GRAY = 0; + while (GRAY <= GRAYMAX) { + pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH); + GRAY = GRAY + 1; + } + delete BHDC; + return pDict.release(); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PddProc.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PddProc.h new file mode 100644 index 000000000000..578f6031227e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_PddProc.h @@ -0,0 +1,34 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_PDDPROC_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_PDDPROC_H_ + +#include "core/fxcrt/fx_system.h" + +class CJBig2_ArithDecoder; +class CJBig2_BitStream; +class CJBig2_PatternDict; +class IFX_Pause; +struct JBig2ArithCtx; + +class CJBig2_PDDProc { + public: + CJBig2_PatternDict* decode_Arith(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* gbContext, + IFX_Pause* pPause); + + CJBig2_PatternDict* decode_MMR(CJBig2_BitStream* pStream, IFX_Pause* pPause); + + public: + bool HDMMR; + uint8_t HDPW; + uint8_t HDPH; + uint32_t GRAYMAX; + uint8_t HDTEMPLATE; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_PDDPROC_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SddProc.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SddProc.cpp new file mode 100644 index 000000000000..5f23fcf4e1db --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SddProc.cpp @@ -0,0 +1,627 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_SddProc.h" + +#include +#include + +#include "core/fxcodec/jbig2/JBig2_ArithIntDecoder.h" +#include "core/fxcodec/jbig2/JBig2_GrdProc.h" +#include "core/fxcodec/jbig2/JBig2_GrrdProc.h" +#include "core/fxcodec/jbig2/JBig2_HuffmanDecoder.h" +#include "core/fxcodec/jbig2/JBig2_HuffmanTable.h" +#include "core/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h" +#include "core/fxcodec/jbig2/JBig2_SymbolDict.h" +#include "core/fxcodec/jbig2/JBig2_TrdProc.h" +#include "core/fxcrt/fx_basic.h" +#include "third_party/base/ptr_util.h" + +CJBig2_SymbolDict* CJBig2_SDDProc::decode_Arith( + CJBig2_ArithDecoder* pArithDecoder, + std::vector* gbContext, + std::vector* grContext) { + CJBig2_Image** SDNEWSYMS; + uint32_t HCHEIGHT, NSYMSDECODED; + int32_t HCDH; + uint32_t SYMWIDTH, TOTWIDTH; + int32_t DW; + CJBig2_Image* BS; + uint32_t I, J, REFAGGNINST; + bool* EXFLAGS; + uint32_t EXINDEX; + bool CUREXFLAG; + uint32_t EXRUNLENGTH; + uint32_t nTmp; + uint32_t SBNUMSYMS; + uint8_t SBSYMCODELEN; + int32_t RDXI, RDYI; + uint32_t num_ex_syms; + CJBig2_Image** SBSYMS; + std::unique_ptr IAID; + std::unique_ptr pDict; + std::unique_ptr IADH(new CJBig2_ArithIntDecoder); + std::unique_ptr IADW(new CJBig2_ArithIntDecoder); + std::unique_ptr IAAI(new CJBig2_ArithIntDecoder); + std::unique_ptr IARDX(new CJBig2_ArithIntDecoder); + std::unique_ptr IARDY(new CJBig2_ArithIntDecoder); + std::unique_ptr IAEX(new CJBig2_ArithIntDecoder); + std::unique_ptr IADT(new CJBig2_ArithIntDecoder); + std::unique_ptr IAFS(new CJBig2_ArithIntDecoder); + std::unique_ptr IADS(new CJBig2_ArithIntDecoder); + std::unique_ptr IAIT(new CJBig2_ArithIntDecoder); + std::unique_ptr IARI(new CJBig2_ArithIntDecoder); + std::unique_ptr IARDW(new CJBig2_ArithIntDecoder); + std::unique_ptr IARDH(new CJBig2_ArithIntDecoder); + nTmp = 0; + while ((uint32_t)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) { + nTmp++; + } + IAID = pdfium::MakeUnique((uint8_t)nTmp); + SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); + FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); + + HCHEIGHT = 0; + NSYMSDECODED = 0; + while (NSYMSDECODED < SDNUMNEWSYMS) { + BS = nullptr; + IADH->decode(pArithDecoder, &HCDH); + HCHEIGHT = HCHEIGHT + HCDH; + if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { + goto failed; + } + SYMWIDTH = 0; + TOTWIDTH = 0; + for (;;) { + if (!IADW->decode(pArithDecoder, &DW)) + break; + + if (NSYMSDECODED >= SDNUMNEWSYMS) + goto failed; + + SYMWIDTH = SYMWIDTH + DW; + if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) + goto failed; + + if (HCHEIGHT == 0 || SYMWIDTH == 0) { + TOTWIDTH = TOTWIDTH + SYMWIDTH; + SDNEWSYMS[NSYMSDECODED] = nullptr; + NSYMSDECODED = NSYMSDECODED + 1; + continue; + } + TOTWIDTH = TOTWIDTH + SYMWIDTH; + if (SDREFAGG == 0) { + std::unique_ptr pGRD(new CJBig2_GRDProc()); + pGRD->MMR = 0; + pGRD->GBW = SYMWIDTH; + pGRD->GBH = HCHEIGHT; + pGRD->GBTEMPLATE = SDTEMPLATE; + pGRD->TPGDON = 0; + pGRD->USESKIP = 0; + pGRD->GBAT[0] = SDAT[0]; + pGRD->GBAT[1] = SDAT[1]; + pGRD->GBAT[2] = SDAT[2]; + pGRD->GBAT[3] = SDAT[3]; + pGRD->GBAT[4] = SDAT[4]; + pGRD->GBAT[5] = SDAT[5]; + pGRD->GBAT[6] = SDAT[6]; + pGRD->GBAT[7] = SDAT[7]; + BS = pGRD->decode_Arith(pArithDecoder, gbContext->data()); + if (!BS) { + goto failed; + } + } else { + IAAI->decode(pArithDecoder, (int*)&REFAGGNINST); + if (REFAGGNINST > 1) { + std::unique_ptr pDecoder(new CJBig2_TRDProc()); + pDecoder->SBHUFF = SDHUFF; + pDecoder->SBREFINE = 1; + pDecoder->SBW = SYMWIDTH; + pDecoder->SBH = HCHEIGHT; + pDecoder->SBNUMINSTANCES = REFAGGNINST; + pDecoder->SBSTRIPS = 1; + pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; + SBNUMSYMS = pDecoder->SBNUMSYMS; + nTmp = 0; + while ((uint32_t)(1 << nTmp) < SBNUMSYMS) { + nTmp++; + } + SBSYMCODELEN = (uint8_t)nTmp; + pDecoder->SBSYMCODELEN = SBSYMCODELEN; + SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); + JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); + JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, + NSYMSDECODED * sizeof(CJBig2_Image*)); + pDecoder->SBSYMS = SBSYMS; + pDecoder->SBDEFPIXEL = 0; + pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; + pDecoder->TRANSPOSED = 0; + pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; + pDecoder->SBDSOFFSET = 0; + std::unique_ptr SBHUFFFS(new CJBig2_HuffmanTable( + HuffmanTable_B6, HuffmanTable_B6_Size, HuffmanTable_HTOOB_B6)); + std::unique_ptr SBHUFFDS(new CJBig2_HuffmanTable( + HuffmanTable_B8, HuffmanTable_B8_Size, HuffmanTable_HTOOB_B8)); + std::unique_ptr SBHUFFDT(new CJBig2_HuffmanTable( + HuffmanTable_B11, HuffmanTable_B11_Size, HuffmanTable_HTOOB_B11)); + std::unique_ptr SBHUFFRDW( + new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, + HuffmanTable_HTOOB_B15)); + std::unique_ptr SBHUFFRDH( + new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, + HuffmanTable_HTOOB_B15)); + std::unique_ptr SBHUFFRDX( + new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, + HuffmanTable_HTOOB_B15)); + std::unique_ptr SBHUFFRDY( + new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, + HuffmanTable_HTOOB_B15)); + std::unique_ptr SBHUFFRSIZE( + new CJBig2_HuffmanTable(HuffmanTable_B1, HuffmanTable_B1_Size, + HuffmanTable_HTOOB_B1)); + pDecoder->SBHUFFFS = SBHUFFFS.get(); + pDecoder->SBHUFFDS = SBHUFFDS.get(); + pDecoder->SBHUFFDT = SBHUFFDT.get(); + pDecoder->SBHUFFRDW = SBHUFFRDW.get(); + pDecoder->SBHUFFRDH = SBHUFFRDH.get(); + pDecoder->SBHUFFRDX = SBHUFFRDX.get(); + pDecoder->SBHUFFRDY = SBHUFFRDY.get(); + pDecoder->SBHUFFRSIZE = SBHUFFRSIZE.get(); + pDecoder->SBRTEMPLATE = SDRTEMPLATE; + pDecoder->SBRAT[0] = SDRAT[0]; + pDecoder->SBRAT[1] = SDRAT[1]; + pDecoder->SBRAT[2] = SDRAT[2]; + pDecoder->SBRAT[3] = SDRAT[3]; + JBig2IntDecoderState ids; + ids.IADT = IADT.get(); + ids.IAFS = IAFS.get(); + ids.IADS = IADS.get(); + ids.IAIT = IAIT.get(); + ids.IARI = IARI.get(); + ids.IARDW = IARDW.get(); + ids.IARDH = IARDH.get(); + ids.IARDX = IARDX.get(); + ids.IARDY = IARDY.get(); + ids.IAID = IAID.get(); + BS = pDecoder->decode_Arith(pArithDecoder, grContext->data(), &ids); + if (!BS) { + FX_Free(SBSYMS); + goto failed; + } + FX_Free(SBSYMS); + } else if (REFAGGNINST == 1) { + SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; + uint32_t IDI; + IAID->decode(pArithDecoder, &IDI); + IARDX->decode(pArithDecoder, &RDXI); + IARDY->decode(pArithDecoder, &RDYI); + if (IDI >= SBNUMSYMS) { + goto failed; + } + SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); + JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); + JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, + NSYMSDECODED * sizeof(CJBig2_Image*)); + if (!SBSYMS[IDI]) { + FX_Free(SBSYMS); + goto failed; + } + std::unique_ptr pGRRD(new CJBig2_GRRDProc()); + pGRRD->GRW = SYMWIDTH; + pGRRD->GRH = HCHEIGHT; + pGRRD->GRTEMPLATE = SDRTEMPLATE; + pGRRD->GRREFERENCE = SBSYMS[IDI]; + pGRRD->GRREFERENCEDX = RDXI; + pGRRD->GRREFERENCEDY = RDYI; + pGRRD->TPGRON = 0; + pGRRD->GRAT[0] = SDRAT[0]; + pGRRD->GRAT[1] = SDRAT[1]; + pGRRD->GRAT[2] = SDRAT[2]; + pGRRD->GRAT[3] = SDRAT[3]; + BS = pGRRD->decode(pArithDecoder, grContext->data()); + if (!BS) { + FX_Free(SBSYMS); + goto failed; + } + FX_Free(SBSYMS); + } + } + SDNEWSYMS[NSYMSDECODED] = BS; + BS = nullptr; + NSYMSDECODED = NSYMSDECODED + 1; + } + } + EXINDEX = 0; + CUREXFLAG = 0; + EXFLAGS = FX_Alloc(bool, SDNUMINSYMS + SDNUMNEWSYMS); + num_ex_syms = 0; + while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { + IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH); + if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { + FX_Free(EXFLAGS); + goto failed; + } + if (EXRUNLENGTH != 0) { + for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { + if (CUREXFLAG) + num_ex_syms++; + EXFLAGS[I] = CUREXFLAG; + } + } + EXINDEX = EXINDEX + EXRUNLENGTH; + CUREXFLAG = !CUREXFLAG; + } + if (num_ex_syms > SDNUMEXSYMS) { + FX_Free(EXFLAGS); + goto failed; + } + + pDict = pdfium::MakeUnique(); + I = J = 0; + for (I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) { + if (EXFLAGS[I] && J < SDNUMEXSYMS) { + if (I < SDNUMINSYMS) { + pDict->AddImage(SDINSYMS[I] + ? pdfium::MakeUnique(*SDINSYMS[I]) + : nullptr); + } else { + pDict->AddImage(pdfium::WrapUnique(SDNEWSYMS[I - SDNUMINSYMS])); + } + ++J; + } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) { + delete SDNEWSYMS[I - SDNUMINSYMS]; + } + } + FX_Free(EXFLAGS); + FX_Free(SDNEWSYMS); + return pDict.release(); +failed: + for (I = 0; I < NSYMSDECODED; I++) { + if (SDNEWSYMS[I]) { + delete SDNEWSYMS[I]; + SDNEWSYMS[I] = nullptr; + } + } + FX_Free(SDNEWSYMS); + return nullptr; +} + +CJBig2_SymbolDict* CJBig2_SDDProc::decode_Huffman( + CJBig2_BitStream* pStream, + std::vector* gbContext, + std::vector* grContext, + IFX_Pause* pPause) { + CJBig2_Image** SDNEWSYMS; + uint32_t* SDNEWSYMWIDTHS; + uint32_t HCHEIGHT, NSYMSDECODED; + int32_t HCDH; + uint32_t SYMWIDTH, TOTWIDTH, HCFIRSTSYM; + int32_t DW; + CJBig2_Image *BS, *BHC; + uint32_t I, J, REFAGGNINST; + bool* EXFLAGS; + uint32_t EXINDEX; + bool CUREXFLAG; + uint32_t EXRUNLENGTH; + int32_t nVal, nBits; + uint32_t nTmp; + uint32_t SBNUMSYMS; + uint8_t SBSYMCODELEN; + JBig2HuffmanCode* SBSYMCODES; + uint32_t IDI; + int32_t RDXI, RDYI; + uint32_t BMSIZE; + uint32_t stride; + uint32_t num_ex_syms; + CJBig2_Image** SBSYMS; + std::unique_ptr pHuffmanDecoder( + new CJBig2_HuffmanDecoder(pStream)); + SDNEWSYMS = FX_Alloc(CJBig2_Image*, SDNUMNEWSYMS); + FXSYS_memset(SDNEWSYMS, 0, SDNUMNEWSYMS * sizeof(CJBig2_Image*)); + SDNEWSYMWIDTHS = nullptr; + BHC = nullptr; + if (SDREFAGG == 0) { + SDNEWSYMWIDTHS = FX_Alloc(uint32_t, SDNUMNEWSYMS); + FXSYS_memset(SDNEWSYMWIDTHS, 0, SDNUMNEWSYMS * sizeof(uint32_t)); + } + std::unique_ptr pDict(new CJBig2_SymbolDict()); + std::unique_ptr pTable; + + HCHEIGHT = 0; + NSYMSDECODED = 0; + BS = nullptr; + while (NSYMSDECODED < SDNUMNEWSYMS) { + if (pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) { + goto failed; + } + HCHEIGHT = HCHEIGHT + HCDH; + if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) { + goto failed; + } + SYMWIDTH = 0; + TOTWIDTH = 0; + HCFIRSTSYM = NSYMSDECODED; + for (;;) { + nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW); + if (nVal == JBIG2_OOB) { + break; + } else if (nVal != 0) { + goto failed; + } else { + if (NSYMSDECODED >= SDNUMNEWSYMS) { + goto failed; + } + SYMWIDTH = SYMWIDTH + DW; + if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) { + goto failed; + } else if (HCHEIGHT == 0 || SYMWIDTH == 0) { + TOTWIDTH = TOTWIDTH + SYMWIDTH; + SDNEWSYMS[NSYMSDECODED] = nullptr; + NSYMSDECODED = NSYMSDECODED + 1; + continue; + } + TOTWIDTH = TOTWIDTH + SYMWIDTH; + } + if (SDREFAGG == 1) { + if (pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != + 0) { + goto failed; + } + BS = nullptr; + if (REFAGGNINST > 1) { + std::unique_ptr pDecoder(new CJBig2_TRDProc()); + pDecoder->SBHUFF = SDHUFF; + pDecoder->SBREFINE = 1; + pDecoder->SBW = SYMWIDTH; + pDecoder->SBH = HCHEIGHT; + pDecoder->SBNUMINSTANCES = REFAGGNINST; + pDecoder->SBSTRIPS = 1; + pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED; + SBNUMSYMS = pDecoder->SBNUMSYMS; + SBSYMCODES = FX_Alloc(JBig2HuffmanCode, SBNUMSYMS); + nTmp = 1; + while ((uint32_t)(1 << nTmp) < SBNUMSYMS) { + nTmp++; + } + for (I = 0; I < SBNUMSYMS; I++) { + SBSYMCODES[I].codelen = nTmp; + SBSYMCODES[I].code = I; + } + pDecoder->SBSYMCODES = SBSYMCODES; + SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); + JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); + JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, + NSYMSDECODED * sizeof(CJBig2_Image*)); + pDecoder->SBSYMS = SBSYMS; + pDecoder->SBDEFPIXEL = 0; + pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR; + pDecoder->TRANSPOSED = 0; + pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT; + pDecoder->SBDSOFFSET = 0; + std::unique_ptr SBHUFFFS(new CJBig2_HuffmanTable( + HuffmanTable_B6, HuffmanTable_B6_Size, HuffmanTable_HTOOB_B6)); + std::unique_ptr SBHUFFDS(new CJBig2_HuffmanTable( + HuffmanTable_B8, HuffmanTable_B8_Size, HuffmanTable_HTOOB_B8)); + std::unique_ptr SBHUFFDT(new CJBig2_HuffmanTable( + HuffmanTable_B11, HuffmanTable_B11_Size, HuffmanTable_HTOOB_B11)); + std::unique_ptr SBHUFFRDW( + new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, + HuffmanTable_HTOOB_B15)); + std::unique_ptr SBHUFFRDH( + new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, + HuffmanTable_HTOOB_B15)); + std::unique_ptr SBHUFFRDX( + new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, + HuffmanTable_HTOOB_B15)); + std::unique_ptr SBHUFFRDY( + new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, + HuffmanTable_HTOOB_B15)); + std::unique_ptr SBHUFFRSIZE( + new CJBig2_HuffmanTable(HuffmanTable_B1, HuffmanTable_B1_Size, + HuffmanTable_HTOOB_B1)); + pDecoder->SBHUFFFS = SBHUFFFS.get(); + pDecoder->SBHUFFDS = SBHUFFDS.get(); + pDecoder->SBHUFFDT = SBHUFFDT.get(); + pDecoder->SBHUFFRDW = SBHUFFRDW.get(); + pDecoder->SBHUFFRDH = SBHUFFRDH.get(); + pDecoder->SBHUFFRDX = SBHUFFRDX.get(); + pDecoder->SBHUFFRDY = SBHUFFRDY.get(); + pDecoder->SBHUFFRSIZE = SBHUFFRSIZE.get(); + pDecoder->SBRTEMPLATE = SDRTEMPLATE; + pDecoder->SBRAT[0] = SDRAT[0]; + pDecoder->SBRAT[1] = SDRAT[1]; + pDecoder->SBRAT[2] = SDRAT[2]; + pDecoder->SBRAT[3] = SDRAT[3]; + BS = pDecoder->decode_Huffman(pStream, grContext->data()); + if (!BS) { + FX_Free(SBSYMCODES); + FX_Free(SBSYMS); + goto failed; + } + FX_Free(SBSYMCODES); + FX_Free(SBSYMS); + } else if (REFAGGNINST == 1) { + SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS; + nTmp = 1; + while ((uint32_t)(1 << nTmp) < SBNUMSYMS) { + nTmp++; + } + SBSYMCODELEN = (uint8_t)nTmp; + SBSYMCODES = FX_Alloc(JBig2HuffmanCode, SBNUMSYMS); + for (I = 0; I < SBNUMSYMS; I++) { + SBSYMCODES[I].codelen = SBSYMCODELEN; + SBSYMCODES[I].code = I; + } + nVal = 0; + nBits = 0; + for (;;) { + if (pStream->read1Bit(&nTmp) != 0) { + FX_Free(SBSYMCODES); + goto failed; + } + nVal = (nVal << 1) | nTmp; + for (IDI = 0; IDI < SBNUMSYMS; IDI++) { + if ((nVal == SBSYMCODES[IDI].code) && + (nBits == SBSYMCODES[IDI].codelen)) { + break; + } + } + if (IDI < SBNUMSYMS) { + break; + } + } + FX_Free(SBSYMCODES); + std::unique_ptr SBHUFFRDX( + new CJBig2_HuffmanTable(HuffmanTable_B15, HuffmanTable_B15_Size, + HuffmanTable_HTOOB_B15)); + std::unique_ptr SBHUFFRSIZE( + new CJBig2_HuffmanTable(HuffmanTable_B1, HuffmanTable_B1_Size, + HuffmanTable_HTOOB_B1)); + if ((pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDXI) != 0) || + (pHuffmanDecoder->decodeAValue(SBHUFFRDX.get(), &RDYI) != 0) || + (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE.get(), &nVal) != 0)) { + goto failed; + } + pStream->alignByte(); + nTmp = pStream->getOffset(); + SBSYMS = FX_Alloc(CJBig2_Image*, SBNUMSYMS); + JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*)); + JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, + NSYMSDECODED * sizeof(CJBig2_Image*)); + std::unique_ptr pGRRD(new CJBig2_GRRDProc()); + pGRRD->GRW = SYMWIDTH; + pGRRD->GRH = HCHEIGHT; + pGRRD->GRTEMPLATE = SDRTEMPLATE; + pGRRD->GRREFERENCE = SBSYMS[IDI]; + pGRRD->GRREFERENCEDX = RDXI; + pGRRD->GRREFERENCEDY = RDYI; + pGRRD->TPGRON = 0; + pGRRD->GRAT[0] = SDRAT[0]; + pGRRD->GRAT[1] = SDRAT[1]; + pGRRD->GRAT[2] = SDRAT[2]; + pGRRD->GRAT[3] = SDRAT[3]; + std::unique_ptr pArithDecoder( + new CJBig2_ArithDecoder(pStream)); + BS = pGRRD->decode(pArithDecoder.get(), grContext->data()); + if (!BS) { + FX_Free(SBSYMS); + goto failed; + } + pStream->alignByte(); + pStream->offset(2); + if ((uint32_t)nVal != (pStream->getOffset() - nTmp)) { + delete BS; + FX_Free(SBSYMS); + goto failed; + } + FX_Free(SBSYMS); + } + SDNEWSYMS[NSYMSDECODED] = BS; + } + if (SDREFAGG == 0) { + SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH; + } + NSYMSDECODED = NSYMSDECODED + 1; + } + if (SDREFAGG == 0) { + if (pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (int32_t*)&BMSIZE) != 0) { + goto failed; + } + pStream->alignByte(); + if (BMSIZE == 0) { + stride = (TOTWIDTH + 7) >> 3; + if (pStream->getByteLeft() >= stride * HCHEIGHT) { + BHC = new CJBig2_Image(TOTWIDTH, HCHEIGHT); + for (I = 0; I < HCHEIGHT; I++) { + JBIG2_memcpy(BHC->m_pData + I * BHC->stride(), + pStream->getPointer(), stride); + pStream->offset(stride); + } + } else { + goto failed; + } + } else { + std::unique_ptr pGRD(new CJBig2_GRDProc()); + pGRD->MMR = 1; + pGRD->GBW = TOTWIDTH; + pGRD->GBH = HCHEIGHT; + pGRD->Start_decode_MMR(&BHC, pStream, nullptr); + pStream->alignByte(); + } + nTmp = 0; + if (!BHC) { + continue; + } + for (I = HCFIRSTSYM; I < NSYMSDECODED; I++) { + SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT); + nTmp += SDNEWSYMWIDTHS[I]; + } + delete BHC; + BHC = nullptr; + } + } + EXINDEX = 0; + CUREXFLAG = 0; + pTable = pdfium::MakeUnique( + HuffmanTable_B1, HuffmanTable_B1_Size, HuffmanTable_HTOOB_B1); + EXFLAGS = FX_Alloc(bool, SDNUMINSYMS + SDNUMNEWSYMS); + num_ex_syms = 0; + while (EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) { + if (pHuffmanDecoder->decodeAValue(pTable.get(), (int*)&EXRUNLENGTH) != 0) { + FX_Free(EXFLAGS); + goto failed; + } + if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) { + FX_Free(EXFLAGS); + goto failed; + } + if (EXRUNLENGTH != 0) { + for (I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) { + if (CUREXFLAG) + num_ex_syms++; + + EXFLAGS[I] = CUREXFLAG; + } + } + EXINDEX = EXINDEX + EXRUNLENGTH; + CUREXFLAG = !CUREXFLAG; + } + if (num_ex_syms > SDNUMEXSYMS) { + FX_Free(EXFLAGS); + goto failed; + } + + I = J = 0; + for (I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) { + if (EXFLAGS[I] && J < SDNUMEXSYMS) { + if (I < SDNUMINSYMS) { + pDict->AddImage(SDINSYMS[I] + ? pdfium::MakeUnique(*SDINSYMS[I]) + : nullptr); + } else { + pDict->AddImage(pdfium::WrapUnique(SDNEWSYMS[I - SDNUMINSYMS])); + } + ++J; + } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) { + delete SDNEWSYMS[I - SDNUMINSYMS]; + } + } + FX_Free(EXFLAGS); + FX_Free(SDNEWSYMS); + if (SDREFAGG == 0) { + FX_Free(SDNEWSYMWIDTHS); + } + return pDict.release(); +failed: + for (I = 0; I < NSYMSDECODED; I++) { + delete SDNEWSYMS[I]; + } + FX_Free(SDNEWSYMS); + if (SDREFAGG == 0) { + FX_Free(SDNEWSYMWIDTHS); + } + return nullptr; +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SddProc.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SddProc.h new file mode 100644 index 000000000000..4df0cb414601 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SddProc.h @@ -0,0 +1,49 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_SDDPROC_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_SDDPROC_H_ + +#include + +#include "core/fxcodec/jbig2/JBig2_ArithDecoder.h" +#include "core/fxcrt/fx_system.h" + +class CJBig2_BitStream; +class CJBig2_HuffmanTable; +class CJBig2_Image; +class CJBig2_SymbolDict; +class IFX_Pause; + +class CJBig2_SDDProc { + public: + CJBig2_SymbolDict* decode_Arith(CJBig2_ArithDecoder* pArithDecoder, + std::vector* gbContext, + std::vector* grContext); + + CJBig2_SymbolDict* decode_Huffman(CJBig2_BitStream* pStream, + std::vector* gbContext, + std::vector* grContext, + IFX_Pause* pPause); + + public: + bool SDHUFF; + bool SDREFAGG; + uint32_t SDNUMINSYMS; + CJBig2_Image** SDINSYMS; + uint32_t SDNUMNEWSYMS; + uint32_t SDNUMEXSYMS; + CJBig2_HuffmanTable* SDHUFFDH; + CJBig2_HuffmanTable* SDHUFFDW; + CJBig2_HuffmanTable* SDHUFFBMSIZE; + CJBig2_HuffmanTable* SDHUFFAGGINST; + uint8_t SDTEMPLATE; + int8_t SDAT[8]; + bool SDRTEMPLATE; + int8_t SDRAT[4]; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_SDDPROC_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Segment.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Segment.cpp new file mode 100644 index 000000000000..610246b6e2ce --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Segment.cpp @@ -0,0 +1,44 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_Segment.h" + +#include "core/fxcrt/fx_memory.h" + +CJBig2_Segment::CJBig2_Segment() { + m_dwNumber = 0; + m_cFlags.c = 0; + m_nReferred_to_segment_count = 0; + m_pReferred_to_segment_numbers = nullptr; + m_dwPage_association = 0; + m_dwData_length = 0; + m_dwHeader_Length = 0; + m_dwObjNum = 0; + m_dwDataOffset = 0; + m_State = JBIG2_SEGMENT_HEADER_UNPARSED; + m_nResultType = JBIG2_VOID_POINTER; + m_Result.vd = nullptr; +} +CJBig2_Segment::~CJBig2_Segment() { + FX_Free(m_pReferred_to_segment_numbers); + + switch (m_nResultType) { + case JBIG2_IMAGE_POINTER: + delete m_Result.im; + break; + case JBIG2_SYMBOL_DICT_POINTER: + delete m_Result.sd; + break; + case JBIG2_PATTERN_DICT_POINTER: + delete m_Result.pd; + break; + case JBIG2_HUFFMAN_TABLE_POINTER: + delete m_Result.ht; + break; + default: + FX_Free(m_Result.vd); + } +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Segment.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Segment.h new file mode 100644 index 000000000000..d89d65269928 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_Segment.h @@ -0,0 +1,66 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_SEGMENT_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_SEGMENT_H_ + +#include "core/fxcodec/jbig2/JBig2_Define.h" +#include "core/fxcodec/jbig2/JBig2_HuffmanTable.h" +#include "core/fxcodec/jbig2/JBig2_PatternDict.h" +#include "core/fxcodec/jbig2/JBig2_SymbolDict.h" + +#define JBIG2_GET_INT32(buf) \ + (((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3]) +#define JBIG2_GET_INT16(buf) (((buf)[0] << 8) | (buf)[1]) +typedef enum { + JBIG2_SEGMENT_HEADER_UNPARSED, + JBIG2_SEGMENT_DATA_UNPARSED, + JBIG2_SEGMENT_PARSE_COMPLETE, + JBIG2_SEGMENT_PAUSED, + JBIG2_SEGMENT_ERROR +} JBig2_SegmentState; +typedef enum { + JBIG2_VOID_POINTER = 0, + JBIG2_IMAGE_POINTER, + JBIG2_SYMBOL_DICT_POINTER, + JBIG2_PATTERN_DICT_POINTER, + JBIG2_HUFFMAN_TABLE_POINTER +} JBig2_ResultType; +class CJBig2_Segment { + public: + CJBig2_Segment(); + + ~CJBig2_Segment(); + + uint32_t m_dwNumber; + union { + struct { + uint8_t type : 6; + uint8_t page_association_size : 1; + uint8_t deferred_non_retain : 1; + } s; + uint8_t c; + } m_cFlags; + int32_t m_nReferred_to_segment_count; + uint32_t* m_pReferred_to_segment_numbers; + uint32_t m_dwPage_association; + uint32_t m_dwData_length; + + uint32_t m_dwHeader_Length; + uint32_t m_dwObjNum; + uint32_t m_dwDataOffset; + JBig2_SegmentState m_State; + JBig2_ResultType m_nResultType; + union { + CJBig2_SymbolDict* sd; + CJBig2_PatternDict* pd; + CJBig2_Image* im; + CJBig2_HuffmanTable* ht; + void* vd; + } m_Result; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_SEGMENT_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SymbolDict.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SymbolDict.cpp new file mode 100644 index 000000000000..c89609577bc6 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SymbolDict.cpp @@ -0,0 +1,26 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_SymbolDict.h" + +#include "core/fxcodec/jbig2/JBig2_Image.h" +#include "core/fxcrt/fx_memory.h" +#include "third_party/base/ptr_util.h" + +CJBig2_SymbolDict::CJBig2_SymbolDict() {} + +CJBig2_SymbolDict::~CJBig2_SymbolDict() {} + +std::unique_ptr CJBig2_SymbolDict::DeepCopy() const { + auto dst = pdfium::MakeUnique(); + for (const auto& image : m_SDEXSYMS) { + dst->m_SDEXSYMS.push_back(image ? pdfium::MakeUnique(*image) + : nullptr); + } + dst->m_gbContext = m_gbContext; + dst->m_grContext = m_grContext; + return dst; +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SymbolDict.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SymbolDict.h new file mode 100644 index 000000000000..d6b897ce7066 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_SymbolDict.h @@ -0,0 +1,50 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_SYMBOLDICT_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_SYMBOLDICT_H_ + +#include +#include +#include + +#include "core/fxcodec/jbig2/JBig2_ArithDecoder.h" +#include "core/fxcrt/fx_basic.h" + +class CJBig2_Image; + +class CJBig2_SymbolDict { + public: + CJBig2_SymbolDict(); + ~CJBig2_SymbolDict(); + + std::unique_ptr DeepCopy() const; + + // Takes ownership of |image|. + void AddImage(std::unique_ptr image) { + m_SDEXSYMS.push_back(std::move(image)); + } + + size_t NumImages() const { return m_SDEXSYMS.size(); } + CJBig2_Image* GetImage(size_t index) const { return m_SDEXSYMS[index].get(); } + + const std::vector& GbContext() const { return m_gbContext; } + const std::vector& GrContext() const { return m_grContext; } + + void SetGbContext(const std::vector& gbContext) { + m_gbContext = gbContext; + } + void SetGrContext(const std::vector& grContext) { + m_grContext = grContext; + } + + private: + std::vector m_gbContext; + std::vector m_grContext; + std::vector> m_SDEXSYMS; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_SYMBOLDICT_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_TrdProc.cpp b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_TrdProc.cpp new file mode 100644 index 000000000000..84042dbd8ce1 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_TrdProc.cpp @@ -0,0 +1,408 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/jbig2/JBig2_TrdProc.h" + +#include + +#include "core/fxcodec/jbig2/JBig2_ArithDecoder.h" +#include "core/fxcodec/jbig2/JBig2_ArithIntDecoder.h" +#include "core/fxcodec/jbig2/JBig2_GrrdProc.h" +#include "core/fxcodec/jbig2/JBig2_HuffmanDecoder.h" +#include "third_party/base/ptr_util.h" + +CJBig2_Image* CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream* pStream, + JBig2ArithCtx* grContext) { + std::unique_ptr pHuffmanDecoder( + new CJBig2_HuffmanDecoder(pStream)); + std::unique_ptr SBREG(new CJBig2_Image(SBW, SBH)); + SBREG->fill(SBDEFPIXEL); + int32_t STRIPT; + if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0) + return nullptr; + + STRIPT *= SBSTRIPS; + STRIPT = -STRIPT; + int32_t FIRSTS = 0; + uint32_t NINSTANCES = 0; + while (NINSTANCES < SBNUMINSTANCES) { + int32_t DT; + if (pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0) + return nullptr; + + DT *= SBSTRIPS; + STRIPT = STRIPT + DT; + bool bFirst = true; + int32_t CURS = 0; + for (;;) { + if (bFirst) { + int32_t DFS; + if (pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0) + return nullptr; + + FIRSTS = FIRSTS + DFS; + CURS = FIRSTS; + bFirst = false; + } else { + int32_t IDS; + int32_t nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS); + if (nVal == JBIG2_OOB) { + break; + } else if (nVal != 0) { + return nullptr; + } else { + CURS = CURS + IDS + SBDSOFFSET; + } + } + uint8_t CURT = 0; + if (SBSTRIPS != 1) { + uint32_t nTmp = 1; + while ((uint32_t)(1 << nTmp) < SBSTRIPS) { + nTmp++; + } + int32_t nVal; + if (pStream->readNBits(nTmp, &nVal) != 0) + return nullptr; + + CURT = nVal; + } + int32_t TI = STRIPT + CURT; + int32_t nVal = 0; + int32_t nBits = 0; + uint32_t IDI; + for (;;) { + uint32_t nTmp; + if (pStream->read1Bit(&nTmp) != 0) + return nullptr; + + nVal = (nVal << 1) | nTmp; + nBits++; + for (IDI = 0; IDI < SBNUMSYMS; IDI++) { + if ((nBits == SBSYMCODES[IDI].codelen) && + (nVal == SBSYMCODES[IDI].code)) { + break; + } + } + if (IDI < SBNUMSYMS) { + break; + } + } + bool RI = 0; + if (SBREFINE != 0 && pStream->read1Bit(&RI) != 0) { + return nullptr; + } + CJBig2_Image* IBI = nullptr; + if (RI == 0) { + IBI = SBSYMS[IDI]; + } else { + int32_t RDWI; + int32_t RDHI; + int32_t RDXI; + int32_t RDYI; + if ((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0) || + (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0) || + (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0) || + (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0) || + (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) { + return nullptr; + } + pStream->alignByte(); + uint32_t nTmp = pStream->getOffset(); + CJBig2_Image* IBOI = SBSYMS[IDI]; + if (!IBOI) + return nullptr; + + uint32_t WOI = IBOI->width(); + uint32_t HOI = IBOI->height(); + if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) + return nullptr; + + std::unique_ptr pGRRD(new CJBig2_GRRDProc()); + pGRRD->GRW = WOI + RDWI; + pGRRD->GRH = HOI + RDHI; + pGRRD->GRTEMPLATE = SBRTEMPLATE; + pGRRD->GRREFERENCE = IBOI; + pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI; + pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI; + pGRRD->TPGRON = 0; + pGRRD->GRAT[0] = SBRAT[0]; + pGRRD->GRAT[1] = SBRAT[1]; + pGRRD->GRAT[2] = SBRAT[2]; + pGRRD->GRAT[3] = SBRAT[3]; + + { + std::unique_ptr pArithDecoder( + new CJBig2_ArithDecoder(pStream)); + IBI = pGRRD->decode(pArithDecoder.get(), grContext); + if (!IBI) + return nullptr; + } + + pStream->alignByte(); + pStream->offset(2); + if ((uint32_t)nVal != (pStream->getOffset() - nTmp)) { + delete IBI; + return nullptr; + } + } + if (!IBI) { + continue; + } + uint32_t WI = IBI->width(); + uint32_t HI = IBI->height(); + if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) || + (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { + CURS = CURS + WI - 1; + } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) || + (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { + CURS = CURS + HI - 1; + } + int32_t SI = CURS; + if (TRANSPOSED == 0) { + switch (REFCORNER) { + case JBIG2_CORNER_TOPLEFT: + SBREG->composeFrom(SI, TI, IBI, SBCOMBOP); + break; + case JBIG2_CORNER_TOPRIGHT: + SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP); + break; + case JBIG2_CORNER_BOTTOMLEFT: + SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP); + break; + case JBIG2_CORNER_BOTTOMRIGHT: + SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP); + break; + } + } else { + switch (REFCORNER) { + case JBIG2_CORNER_TOPLEFT: + SBREG->composeFrom(TI, SI, IBI, SBCOMBOP); + break; + case JBIG2_CORNER_TOPRIGHT: + SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP); + break; + case JBIG2_CORNER_BOTTOMLEFT: + SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP); + break; + case JBIG2_CORNER_BOTTOMRIGHT: + SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP); + break; + } + } + if (RI != 0) { + delete IBI; + } + if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || + (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) { + CURS = CURS + WI - 1; + } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || + (REFCORNER == JBIG2_CORNER_TOPRIGHT))) { + CURS = CURS + HI - 1; + } + NINSTANCES = NINSTANCES + 1; + } + } + return SBREG.release(); +} + +CJBig2_Image* CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* grContext, + JBig2IntDecoderState* pIDS) { + std::unique_ptr IADT; + std::unique_ptr IAFS; + std::unique_ptr IADS; + std::unique_ptr IAIT; + std::unique_ptr IARI; + std::unique_ptr IARDW; + std::unique_ptr IARDH; + std::unique_ptr IARDX; + std::unique_ptr IARDY; + std::unique_ptr IAID; + CJBig2_ArithIntDecoder* pIADT; + CJBig2_ArithIntDecoder* pIAFS; + CJBig2_ArithIntDecoder* pIADS; + CJBig2_ArithIntDecoder* pIAIT; + CJBig2_ArithIntDecoder* pIARI; + CJBig2_ArithIntDecoder* pIARDW; + CJBig2_ArithIntDecoder* pIARDH; + CJBig2_ArithIntDecoder* pIARDX; + CJBig2_ArithIntDecoder* pIARDY; + CJBig2_ArithIaidDecoder* pIAID; + if (pIDS) { + pIADT = pIDS->IADT; + pIAFS = pIDS->IAFS; + pIADS = pIDS->IADS; + pIAIT = pIDS->IAIT; + pIARI = pIDS->IARI; + pIARDW = pIDS->IARDW; + pIARDH = pIDS->IARDH; + pIARDX = pIDS->IARDX; + pIARDY = pIDS->IARDY; + pIAID = pIDS->IAID; + } else { + IADT = pdfium::MakeUnique(); + IAFS = pdfium::MakeUnique(); + IADS = pdfium::MakeUnique(); + IAIT = pdfium::MakeUnique(); + IARI = pdfium::MakeUnique(); + IARDW = pdfium::MakeUnique(); + IARDH = pdfium::MakeUnique(); + IARDX = pdfium::MakeUnique(); + IARDY = pdfium::MakeUnique(); + IAID = pdfium::MakeUnique(SBSYMCODELEN); + pIADT = IADT.get(); + pIAFS = IAFS.get(); + pIADS = IADS.get(); + pIAIT = IAIT.get(); + pIARI = IARI.get(); + pIARDW = IARDW.get(); + pIARDH = IARDH.get(); + pIARDX = IARDX.get(); + pIARDY = IARDY.get(); + pIAID = IAID.get(); + } + std::unique_ptr SBREG(new CJBig2_Image(SBW, SBH)); + SBREG->fill(SBDEFPIXEL); + int32_t STRIPT; + if (!pIADT->decode(pArithDecoder, &STRIPT)) + return nullptr; + STRIPT *= SBSTRIPS; + STRIPT = -STRIPT; + int32_t FIRSTS = 0; + uint32_t NINSTANCES = 0; + while (NINSTANCES < SBNUMINSTANCES) { + int32_t CURS = 0; + int32_t DT; + if (!pIADT->decode(pArithDecoder, &DT)) + return nullptr; + DT *= SBSTRIPS; + STRIPT += DT; + bool bFirst = true; + for (;;) { + if (bFirst) { + int32_t DFS; + pIAFS->decode(pArithDecoder, &DFS); + FIRSTS += DFS; + CURS = FIRSTS; + bFirst = false; + } else { + int32_t IDS; + if (!pIADS->decode(pArithDecoder, &IDS)) + break; + CURS += IDS + SBDSOFFSET; + } + if (NINSTANCES >= SBNUMINSTANCES) { + break; + } + int CURT = 0; + if (SBSTRIPS != 1) + pIAIT->decode(pArithDecoder, &CURT); + + int32_t TI = STRIPT + CURT; + uint32_t IDI; + pIAID->decode(pArithDecoder, &IDI); + if (IDI >= SBNUMSYMS) + return nullptr; + + int RI; + if (SBREFINE == 0) + RI = 0; + else + pIARI->decode(pArithDecoder, &RI); + + std::unique_ptr IBI; + CJBig2_Image* pIBI; + if (RI == 0) { + pIBI = SBSYMS[IDI]; + } else { + int32_t RDWI; + int32_t RDHI; + int32_t RDXI; + int32_t RDYI; + pIARDW->decode(pArithDecoder, &RDWI); + pIARDH->decode(pArithDecoder, &RDHI); + pIARDX->decode(pArithDecoder, &RDXI); + pIARDY->decode(pArithDecoder, &RDYI); + CJBig2_Image* IBOI = SBSYMS[IDI]; + if (!IBOI) + return nullptr; + + uint32_t WOI = IBOI->width(); + uint32_t HOI = IBOI->height(); + if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) + return nullptr; + + std::unique_ptr pGRRD(new CJBig2_GRRDProc()); + pGRRD->GRW = WOI + RDWI; + pGRRD->GRH = HOI + RDHI; + pGRRD->GRTEMPLATE = SBRTEMPLATE; + pGRRD->GRREFERENCE = IBOI; + pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI; + pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI; + pGRRD->TPGRON = 0; + pGRRD->GRAT[0] = SBRAT[0]; + pGRRD->GRAT[1] = SBRAT[1]; + pGRRD->GRAT[2] = SBRAT[2]; + pGRRD->GRAT[3] = SBRAT[3]; + IBI.reset(pGRRD->decode(pArithDecoder, grContext)); + pIBI = IBI.get(); + } + if (!pIBI) + return nullptr; + + uint32_t WI = pIBI->width(); + uint32_t HI = pIBI->height(); + if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT) || + (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { + CURS += WI - 1; + } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT) || + (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) { + CURS += HI - 1; + } + int32_t SI = CURS; + if (TRANSPOSED == 0) { + switch (REFCORNER) { + case JBIG2_CORNER_TOPLEFT: + SBREG->composeFrom(SI, TI, pIBI, SBCOMBOP); + break; + case JBIG2_CORNER_TOPRIGHT: + SBREG->composeFrom(SI - WI + 1, TI, pIBI, SBCOMBOP); + break; + case JBIG2_CORNER_BOTTOMLEFT: + SBREG->composeFrom(SI, TI - HI + 1, pIBI, SBCOMBOP); + break; + case JBIG2_CORNER_BOTTOMRIGHT: + SBREG->composeFrom(SI - WI + 1, TI - HI + 1, pIBI, SBCOMBOP); + break; + } + } else { + switch (REFCORNER) { + case JBIG2_CORNER_TOPLEFT: + SBREG->composeFrom(TI, SI, pIBI, SBCOMBOP); + break; + case JBIG2_CORNER_TOPRIGHT: + SBREG->composeFrom(TI - WI + 1, SI, pIBI, SBCOMBOP); + break; + case JBIG2_CORNER_BOTTOMLEFT: + SBREG->composeFrom(TI, SI - HI + 1, pIBI, SBCOMBOP); + break; + case JBIG2_CORNER_BOTTOMRIGHT: + SBREG->composeFrom(TI - WI + 1, SI - HI + 1, pIBI, SBCOMBOP); + break; + } + } + if (TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || + (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) { + CURS += WI - 1; + } else if (TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT) || + (REFCORNER == JBIG2_CORNER_TOPRIGHT))) { + CURS += HI - 1; + } + ++NINSTANCES; + } + } + return SBREG.release(); +} diff --git a/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_TrdProc.h b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_TrdProc.h new file mode 100644 index 000000000000..be50ec152f42 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/jbig2/JBig2_TrdProc.h @@ -0,0 +1,81 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_JBIG2_JBIG2_TRDPROC_H_ +#define CORE_FXCODEC_JBIG2_JBIG2_TRDPROC_H_ + +#include "core/fxcodec/jbig2/JBig2_Image.h" +#include "core/fxcrt/fx_system.h" + +class CJBig2_ArithDecoder; +class CJBig2_ArithIaidDecoder; +class CJBig2_ArithIntDecoder; +class CJBig2_BitStream; +class CJBig2_HuffmanTable; +struct JBig2ArithCtx; +struct JBig2HuffmanCode; + +struct JBig2IntDecoderState { + CJBig2_ArithIntDecoder* IADT; + CJBig2_ArithIntDecoder* IAFS; + CJBig2_ArithIntDecoder* IADS; + CJBig2_ArithIntDecoder* IAIT; + CJBig2_ArithIntDecoder* IARI; + CJBig2_ArithIntDecoder* IARDW; + CJBig2_ArithIntDecoder* IARDH; + CJBig2_ArithIntDecoder* IARDX; + CJBig2_ArithIntDecoder* IARDY; + CJBig2_ArithIaidDecoder* IAID; +}; + +enum JBig2Corner { + JBIG2_CORNER_BOTTOMLEFT = 0, + JBIG2_CORNER_TOPLEFT = 1, + JBIG2_CORNER_BOTTOMRIGHT = 2, + JBIG2_CORNER_TOPRIGHT = 3 +}; + +class CJBig2_TRDProc { + public: + CJBig2_Image* decode_Huffman(CJBig2_BitStream* pStream, + JBig2ArithCtx* grContext); + + CJBig2_Image* decode_Arith(CJBig2_ArithDecoder* pArithDecoder, + JBig2ArithCtx* grContext, + JBig2IntDecoderState* pIDS); + + bool SBHUFF; + bool SBREFINE; + uint32_t SBW; + uint32_t SBH; + uint32_t SBNUMINSTANCES; + uint32_t SBSTRIPS; + uint32_t SBNUMSYMS; + + JBig2HuffmanCode* SBSYMCODES; + uint8_t SBSYMCODELEN; + + CJBig2_Image** SBSYMS; + bool SBDEFPIXEL; + + JBig2ComposeOp SBCOMBOP; + bool TRANSPOSED; + + JBig2Corner REFCORNER; + int8_t SBDSOFFSET; + CJBig2_HuffmanTable* SBHUFFFS; + CJBig2_HuffmanTable* SBHUFFDS; + CJBig2_HuffmanTable* SBHUFFDT; + CJBig2_HuffmanTable* SBHUFFRDW; + CJBig2_HuffmanTable* SBHUFFRDH; + CJBig2_HuffmanTable* SBHUFFRDX; + CJBig2_HuffmanTable* SBHUFFRDY; + CJBig2_HuffmanTable* SBHUFFRSIZE; + bool SBRTEMPLATE; + int8_t SBRAT[4]; +}; + +#endif // CORE_FXCODEC_JBIG2_JBIG2_TRDPROC_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/lbmp/fx_bmp.cpp b/modules/pdfium/pdfium/core/fxcodec/lbmp/fx_bmp.cpp new file mode 100644 index 000000000000..2b072a4a0c06 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/lbmp/fx_bmp.cpp @@ -0,0 +1,939 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/lbmp/fx_bmp.h" + +#include + +namespace { + +const size_t kBmpCoreHeaderSize = 12; +const size_t kBmpInfoHeaderSize = 40; + +// TODO(thestig): Replace with FXDWORD_GET_LSBFIRST? +uint32_t GetDWord_LSBFirst(uint8_t* p) { + return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); +} + +void SetDWord_LSBFirst(uint8_t* p, uint32_t v) { + p[0] = (uint8_t)v; + p[1] = (uint8_t)(v >> 8); + p[2] = (uint8_t)(v >> 16); + p[3] = (uint8_t)(v >> 24); +} +} // namespace + +uint16_t GetWord_LSBFirst(uint8_t* p) { + return p[0] | (p[1] << 8); +} +void SetWord_LSBFirst(uint8_t* p, uint16_t v) { + p[0] = (uint8_t)v; + p[1] = (uint8_t)(v >> 8); +} +void bmp_error(bmp_decompress_struct_p bmp_ptr, const FX_CHAR* err_msg) { + if (bmp_ptr && bmp_ptr->bmp_error_fn) { + bmp_ptr->bmp_error_fn(bmp_ptr, err_msg); + } +} +bmp_decompress_struct_p bmp_create_decompress() { + bmp_decompress_struct_p bmp_ptr = FX_Alloc(bmp_decompress_struct, 1); + FXSYS_memset(bmp_ptr, 0, sizeof(bmp_decompress_struct)); + bmp_ptr->decode_status = BMP_D_STATUS_HEADER; + bmp_ptr->bmp_header_ptr = FX_Alloc(BmpFileHeader, 1); + return bmp_ptr; +} +void bmp_destroy_decompress(bmp_decompress_struct_pp bmp_ptr_ptr) { + if (!bmp_ptr_ptr || !*bmp_ptr_ptr) + return; + + bmp_decompress_struct_p bmp_ptr = *bmp_ptr_ptr; + *bmp_ptr_ptr = nullptr; + if (bmp_ptr->out_row_buffer) { + FX_Free(bmp_ptr->out_row_buffer); + } + FX_Free(bmp_ptr->pal_ptr); + FX_Free(bmp_ptr->bmp_header_ptr); + FX_Free(bmp_ptr); +} +int32_t bmp_read_header(bmp_decompress_struct_p bmp_ptr) { + if (!bmp_ptr) + return 0; + + uint32_t skip_size_org = bmp_ptr->skip_size; + if (bmp_ptr->decode_status == BMP_D_STATUS_HEADER) { + ASSERT(sizeof(BmpFileHeader) == 14); + BmpFileHeader* bmp_header_ptr = nullptr; + if (!bmp_read_data(bmp_ptr, (uint8_t**)&bmp_header_ptr, 14)) + return 2; + + bmp_ptr->bmp_header_ptr->bfType = + GetWord_LSBFirst((uint8_t*)&bmp_header_ptr->bfType); + bmp_ptr->bmp_header_ptr->bfOffBits = + GetDWord_LSBFirst((uint8_t*)&bmp_header_ptr->bfOffBits); + bmp_ptr->data_size = GetDWord_LSBFirst((uint8_t*)&bmp_header_ptr->bfSize); + if (bmp_ptr->bmp_header_ptr->bfType != BMP_SIGNATURE) { + bmp_error(bmp_ptr, "Not A Bmp Image"); + return 0; + } + if (bmp_ptr->avail_in < sizeof(uint32_t)) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + bmp_ptr->img_ifh_size = + GetDWord_LSBFirst(bmp_ptr->next_in + bmp_ptr->skip_size); + bmp_ptr->pal_type = 0; + static_assert(sizeof(BmpCoreHeader) == kBmpCoreHeaderSize, + "BmpCoreHeader has wrong size"); + static_assert(sizeof(BmpInfoHeader) == kBmpInfoHeaderSize, + "BmpInfoHeader has wrong size"); + switch (bmp_ptr->img_ifh_size) { + case kBmpCoreHeaderSize: { + bmp_ptr->pal_type = 1; + BmpCoreHeaderPtr bmp_core_header_ptr = nullptr; + if (!bmp_read_data(bmp_ptr, (uint8_t**)&bmp_core_header_ptr, + bmp_ptr->img_ifh_size)) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + bmp_ptr->width = + GetWord_LSBFirst((uint8_t*)&bmp_core_header_ptr->bcWidth); + bmp_ptr->height = + GetWord_LSBFirst((uint8_t*)&bmp_core_header_ptr->bcHeight); + bmp_ptr->bitCounts = + GetWord_LSBFirst((uint8_t*)&bmp_core_header_ptr->bcBitCount); + bmp_ptr->compress_flag = BMP_RGB; + bmp_ptr->imgTB_flag = false; + } break; + case kBmpInfoHeaderSize: { + BmpInfoHeaderPtr bmp_info_header_ptr = nullptr; + if (!bmp_read_data(bmp_ptr, (uint8_t**)&bmp_info_header_ptr, + bmp_ptr->img_ifh_size)) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + bmp_ptr->width = + GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biWidth); + bmp_ptr->height = + GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biHeight); + bmp_ptr->bitCounts = + GetWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biBitCount); + bmp_ptr->compress_flag = + GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biCompression); + bmp_ptr->color_used = + GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biClrUsed); + bmp_ptr->dpi_x = (int32_t)GetDWord_LSBFirst( + (uint8_t*)&bmp_info_header_ptr->biXPelsPerMeter); + bmp_ptr->dpi_y = (int32_t)GetDWord_LSBFirst( + (uint8_t*)&bmp_info_header_ptr->biYPelsPerMeter); + if (bmp_ptr->height < 0) { + bmp_ptr->height = -bmp_ptr->height; + bmp_ptr->imgTB_flag = true; + } + } break; + default: { + if (bmp_ptr->img_ifh_size > + std::min(kBmpInfoHeaderSize, sizeof(BmpInfoHeader))) { + BmpInfoHeaderPtr bmp_info_header_ptr = nullptr; + if (!bmp_read_data(bmp_ptr, (uint8_t**)&bmp_info_header_ptr, + bmp_ptr->img_ifh_size)) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + uint16_t biPlanes; + bmp_ptr->width = + GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biWidth); + bmp_ptr->height = + GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biHeight); + bmp_ptr->bitCounts = + GetWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biBitCount); + bmp_ptr->compress_flag = + GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biCompression); + bmp_ptr->color_used = + GetDWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biClrUsed); + biPlanes = GetWord_LSBFirst((uint8_t*)&bmp_info_header_ptr->biPlanes); + bmp_ptr->dpi_x = GetDWord_LSBFirst( + (uint8_t*)&bmp_info_header_ptr->biXPelsPerMeter); + bmp_ptr->dpi_y = GetDWord_LSBFirst( + (uint8_t*)&bmp_info_header_ptr->biYPelsPerMeter); + if (bmp_ptr->height < 0) { + bmp_ptr->height = -bmp_ptr->height; + bmp_ptr->imgTB_flag = true; + } + if (bmp_ptr->compress_flag == BMP_RGB && biPlanes == 1 && + bmp_ptr->color_used == 0) { + break; + } + } + bmp_error(bmp_ptr, "Unsupported Bmp File"); + return 0; + } + } + if (bmp_ptr->width <= 0 || bmp_ptr->compress_flag > BMP_BITFIELDS) { + bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); + return 0; + } + switch (bmp_ptr->bitCounts) { + case 1: + case 4: + case 8: + case 16: + case 24: { + if (bmp_ptr->color_used > ((uint32_t)1) << bmp_ptr->bitCounts) { + bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); + return 0; + } + } + case 32: + break; + default: + bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); + return 0; + } + bmp_ptr->src_row_bytes = BMP_WIDTHBYTES(bmp_ptr->width, bmp_ptr->bitCounts); + switch (bmp_ptr->bitCounts) { + case 1: + case 4: + case 8: + bmp_ptr->out_row_bytes = BMP_WIDTHBYTES(bmp_ptr->width, 8); + bmp_ptr->components = 1; + break; + case 16: + case 24: + bmp_ptr->out_row_bytes = BMP_WIDTHBYTES(bmp_ptr->width, 24); + bmp_ptr->components = 3; + break; + case 32: + bmp_ptr->out_row_bytes = bmp_ptr->src_row_bytes; + bmp_ptr->components = 4; + break; + } + FX_Free(bmp_ptr->out_row_buffer); + + if (bmp_ptr->out_row_bytes <= 0) { + bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); + return 0; + } + + bmp_ptr->out_row_buffer = FX_Alloc(uint8_t, bmp_ptr->out_row_bytes); + FXSYS_memset(bmp_ptr->out_row_buffer, 0, bmp_ptr->out_row_bytes); + bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_PAL); + } + if (bmp_ptr->decode_status == BMP_D_STATUS_PAL) { + skip_size_org = bmp_ptr->skip_size; + if (bmp_ptr->compress_flag == BMP_BITFIELDS) { + if (bmp_ptr->bitCounts != 16 && bmp_ptr->bitCounts != 32) { + bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); + return 0; + } + uint32_t* mask; + if (bmp_read_data(bmp_ptr, (uint8_t**)&mask, 3 * sizeof(uint32_t)) == + nullptr) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + bmp_ptr->mask_red = GetDWord_LSBFirst((uint8_t*)&mask[0]); + bmp_ptr->mask_green = GetDWord_LSBFirst((uint8_t*)&mask[1]); + bmp_ptr->mask_blue = GetDWord_LSBFirst((uint8_t*)&mask[2]); + if (bmp_ptr->mask_red & bmp_ptr->mask_green || + bmp_ptr->mask_red & bmp_ptr->mask_blue || + bmp_ptr->mask_green & bmp_ptr->mask_blue) { + bmp_error(bmp_ptr, "The Bitfield Bmp File Is Corrupt"); + return 0; + } + if (bmp_ptr->bmp_header_ptr->bfOffBits < 26 + bmp_ptr->img_ifh_size) { + bmp_ptr->bmp_header_ptr->bfOffBits = 26 + bmp_ptr->img_ifh_size; + } + bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_DATA_PRE); + return 1; + } else if (bmp_ptr->bitCounts == 16) { + bmp_ptr->mask_red = 0x7C00; + bmp_ptr->mask_green = 0x03E0; + bmp_ptr->mask_blue = 0x001F; + } + bmp_ptr->pal_num = 0; + if (bmp_ptr->bitCounts < 16) { + bmp_ptr->pal_num = 1 << bmp_ptr->bitCounts; + if (bmp_ptr->color_used != 0) { + bmp_ptr->pal_num = bmp_ptr->color_used; + } + uint8_t* src_pal_ptr = nullptr; + uint32_t src_pal_size = bmp_ptr->pal_num * (bmp_ptr->pal_type ? 3 : 4); + if (bmp_read_data(bmp_ptr, (uint8_t**)&src_pal_ptr, src_pal_size) == + nullptr) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + FX_Free(bmp_ptr->pal_ptr); + bmp_ptr->pal_ptr = FX_Alloc(uint32_t, bmp_ptr->pal_num); + int32_t src_pal_index = 0; + if (bmp_ptr->pal_type == BMP_PAL_OLD) { + while (src_pal_index < bmp_ptr->pal_num) { + bmp_ptr->pal_ptr[src_pal_index++] = BMP_PAL_ENCODE( + 0x00, src_pal_ptr[2], src_pal_ptr[1], src_pal_ptr[0]); + src_pal_ptr += 3; + } + } else { + while (src_pal_index < bmp_ptr->pal_num) { + bmp_ptr->pal_ptr[src_pal_index++] = BMP_PAL_ENCODE( + src_pal_ptr[3], src_pal_ptr[2], src_pal_ptr[1], src_pal_ptr[0]); + src_pal_ptr += 4; + } + } + } + if (bmp_ptr->bmp_header_ptr->bfOffBits < + 14 + bmp_ptr->img_ifh_size + + bmp_ptr->pal_num * (bmp_ptr->pal_type ? 3 : 4)) { + bmp_ptr->bmp_header_ptr->bfOffBits = + 14 + bmp_ptr->img_ifh_size + + bmp_ptr->pal_num * (bmp_ptr->pal_type ? 3 : 4); + } + bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_DATA_PRE); + } + return 1; +} +int32_t bmp_decode_image(bmp_decompress_struct_p bmp_ptr) { + if (bmp_ptr->decode_status == BMP_D_STATUS_DATA_PRE) { + bmp_ptr->avail_in = 0; + if (!bmp_ptr->bmp_get_data_position_fn( + bmp_ptr, bmp_ptr->bmp_header_ptr->bfOffBits)) { + bmp_ptr->decode_status = BMP_D_STATUS_TAIL; + bmp_error(bmp_ptr, "The Bmp File Is Corrupt, Unexpected Stream Offset"); + return 0; + } + bmp_ptr->row_num = 0; + bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_DATA); + } + if (bmp_ptr->decode_status == BMP_D_STATUS_DATA) { + switch (bmp_ptr->compress_flag) { + case BMP_RGB: + case BMP_BITFIELDS: + return bmp_decode_rgb(bmp_ptr); + case BMP_RLE8: + return bmp_decode_rle8(bmp_ptr); + case BMP_RLE4: + return bmp_decode_rle4(bmp_ptr); + } + } + bmp_error(bmp_ptr, "Any Uncontrol Error"); + return 0; +} +int32_t bmp_decode_rgb(bmp_decompress_struct_p bmp_ptr) { + uint8_t* row_buf = bmp_ptr->out_row_buffer; + uint8_t* des_buf = nullptr; + while (bmp_ptr->row_num < bmp_ptr->height) { + if (!bmp_read_data(bmp_ptr, &des_buf, bmp_ptr->src_row_bytes)) + return 2; + + bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_DATA); + switch (bmp_ptr->bitCounts) { + case 1: { + for (int32_t col = 0; col < bmp_ptr->width; col++) { + *row_buf++ = des_buf[col >> 3] & (0x80 >> (col % 8)) ? 0x01 : 0x00; + } + } break; + case 4: { + for (int32_t col = 0; col < bmp_ptr->width; col++) { + *row_buf++ = (col & 0x01) ? (des_buf[col >> 1] & 0x0F) + : ((des_buf[col >> 1] & 0xF0) >> 4); + } + } break; + case 16: { + uint16_t* buf = (uint16_t*)des_buf; + uint8_t blue_bits = 0; + uint8_t green_bits = 0; + uint8_t red_bits = 0; + for (int32_t i = 0; i < 16; i++) { + if ((bmp_ptr->mask_blue >> i) & 0x01) { + blue_bits++; + } + if ((bmp_ptr->mask_green >> i) & 0x01) { + green_bits++; + } + if ((bmp_ptr->mask_red >> i) & 0x01) { + red_bits++; + } + } + green_bits += blue_bits; + red_bits += green_bits; + if (blue_bits > 8 || green_bits < 8 || red_bits < 8) + return 2; + blue_bits = 8 - blue_bits; + green_bits -= 8; + red_bits -= 8; + for (int32_t col = 0; col < bmp_ptr->width; col++) { + *buf = GetWord_LSBFirst((uint8_t*)buf); + *row_buf++ = (uint8_t)((*buf & bmp_ptr->mask_blue) << blue_bits); + *row_buf++ = (uint8_t)((*buf & bmp_ptr->mask_green) >> green_bits); + *row_buf++ = (uint8_t)((*buf++ & bmp_ptr->mask_red) >> red_bits); + } + } break; + case 8: + case 24: + case 32: + FXSYS_memcpy(bmp_ptr->out_row_buffer, des_buf, bmp_ptr->src_row_bytes); + break; + } + row_buf = bmp_ptr->out_row_buffer; + bmp_ptr->bmp_get_row_fn(bmp_ptr, + bmp_ptr->imgTB_flag + ? bmp_ptr->row_num++ + : (bmp_ptr->height - 1 - bmp_ptr->row_num++), + bmp_ptr->out_row_buffer); + } + bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_TAIL); + return 1; +} +int32_t bmp_decode_rle8(bmp_decompress_struct_p bmp_ptr) { + uint8_t* first_byte_ptr = nullptr; + uint8_t* second_byte_ptr = nullptr; + bmp_ptr->col_num = 0; + while (true) { + uint32_t skip_size_org = bmp_ptr->skip_size; + if (!bmp_read_data(bmp_ptr, &first_byte_ptr, 1)) + return 2; + + switch (*first_byte_ptr) { + case RLE_MARKER: { + if (!bmp_read_data(bmp_ptr, &first_byte_ptr, 1)) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + switch (*first_byte_ptr) { + case RLE_EOL: { + if (bmp_ptr->row_num >= bmp_ptr->height) { + bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_TAIL); + bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); + return 0; + } + bmp_ptr->bmp_get_row_fn( + bmp_ptr, bmp_ptr->imgTB_flag + ? bmp_ptr->row_num++ + : (bmp_ptr->height - 1 - bmp_ptr->row_num++), + bmp_ptr->out_row_buffer); + bmp_ptr->col_num = 0; + FXSYS_memset(bmp_ptr->out_row_buffer, 0, bmp_ptr->out_row_bytes); + bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_DATA); + continue; + } + case RLE_EOI: { + if (bmp_ptr->row_num < bmp_ptr->height) { + bmp_ptr->bmp_get_row_fn( + bmp_ptr, bmp_ptr->imgTB_flag + ? bmp_ptr->row_num++ + : (bmp_ptr->height - 1 - bmp_ptr->row_num++), + bmp_ptr->out_row_buffer); + } + bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_TAIL); + return 1; + } + case RLE_DELTA: { + uint8_t* delta_ptr; + if (!bmp_read_data(bmp_ptr, &delta_ptr, 2)) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + bmp_ptr->col_num += (int32_t)delta_ptr[0]; + int32_t bmp_row_num_next = bmp_ptr->row_num + (int32_t)delta_ptr[1]; + if (bmp_ptr->col_num >= bmp_ptr->out_row_bytes || + bmp_row_num_next >= bmp_ptr->height) { + bmp_error(bmp_ptr, "The Bmp File Is Corrupt Or Not Supported"); + return 0; + } + while (bmp_ptr->row_num < bmp_row_num_next) { + FXSYS_memset(bmp_ptr->out_row_buffer, 0, bmp_ptr->out_row_bytes); + bmp_ptr->bmp_get_row_fn( + bmp_ptr, bmp_ptr->imgTB_flag + ? bmp_ptr->row_num++ + : (bmp_ptr->height - 1 - bmp_ptr->row_num++), + bmp_ptr->out_row_buffer); + } + } break; + default: { + if ((int32_t)(*first_byte_ptr) > + bmp_ptr->src_row_bytes - bmp_ptr->col_num) { + bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); + return 0; + } + if (!bmp_read_data(bmp_ptr, &second_byte_ptr, + *first_byte_ptr & 1 ? *first_byte_ptr + 1 + : *first_byte_ptr)) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + FXSYS_memcpy(bmp_ptr->out_row_buffer + bmp_ptr->col_num, + second_byte_ptr, *first_byte_ptr); + bmp_ptr->col_num += (int32_t)(*first_byte_ptr); + } + } + } break; + default: { + if (!bmp_read_data(bmp_ptr, &second_byte_ptr, 1)) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + if ((int32_t)(*first_byte_ptr) > + bmp_ptr->src_row_bytes - bmp_ptr->col_num) { + bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); + return 0; + } + FXSYS_memset(bmp_ptr->out_row_buffer + bmp_ptr->col_num, + *second_byte_ptr, *first_byte_ptr); + bmp_ptr->col_num += (int32_t)(*first_byte_ptr); + } + } + } + bmp_error(bmp_ptr, "Any Uncontrol Error"); + return 0; +} +int32_t bmp_decode_rle4(bmp_decompress_struct_p bmp_ptr) { + uint8_t* first_byte_ptr = nullptr; + uint8_t* second_byte_ptr = nullptr; + bmp_ptr->col_num = 0; + while (true) { + uint32_t skip_size_org = bmp_ptr->skip_size; + if (!bmp_read_data(bmp_ptr, &first_byte_ptr, 1)) + return 2; + + switch (*first_byte_ptr) { + case RLE_MARKER: { + if (!bmp_read_data(bmp_ptr, &first_byte_ptr, 1)) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + switch (*first_byte_ptr) { + case RLE_EOL: { + if (bmp_ptr->row_num >= bmp_ptr->height) { + bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_TAIL); + bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); + return 0; + } + bmp_ptr->bmp_get_row_fn( + bmp_ptr, bmp_ptr->imgTB_flag + ? bmp_ptr->row_num++ + : (bmp_ptr->height - 1 - bmp_ptr->row_num++), + bmp_ptr->out_row_buffer); + bmp_ptr->col_num = 0; + FXSYS_memset(bmp_ptr->out_row_buffer, 0, bmp_ptr->out_row_bytes); + bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_DATA); + continue; + } + case RLE_EOI: { + if (bmp_ptr->row_num < bmp_ptr->height) { + bmp_ptr->bmp_get_row_fn( + bmp_ptr, bmp_ptr->imgTB_flag + ? bmp_ptr->row_num++ + : (bmp_ptr->height - 1 - bmp_ptr->row_num++), + bmp_ptr->out_row_buffer); + } + bmp_save_decoding_status(bmp_ptr, BMP_D_STATUS_TAIL); + return 1; + } + case RLE_DELTA: { + uint8_t* delta_ptr; + if (!bmp_read_data(bmp_ptr, &delta_ptr, 2)) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + bmp_ptr->col_num += (int32_t)delta_ptr[0]; + int32_t bmp_row_num_next = bmp_ptr->row_num + (int32_t)delta_ptr[1]; + if (bmp_ptr->col_num >= bmp_ptr->out_row_bytes || + bmp_row_num_next >= bmp_ptr->height) { + bmp_error(bmp_ptr, "The Bmp File Is Corrupt Or Not Supported"); + return 0; + } + while (bmp_ptr->row_num < bmp_row_num_next) { + FXSYS_memset(bmp_ptr->out_row_buffer, 0, bmp_ptr->out_row_bytes); + bmp_ptr->bmp_get_row_fn( + bmp_ptr, bmp_ptr->imgTB_flag + ? bmp_ptr->row_num++ + : (bmp_ptr->height - 1 - bmp_ptr->row_num++), + bmp_ptr->out_row_buffer); + } + } break; + default: { + uint8_t size = (uint8_t)(((uint16_t)(*first_byte_ptr) + 1) >> 1); + if ((int32_t)*first_byte_ptr >= + bmp_ptr->out_row_bytes - bmp_ptr->col_num) { + if (size + (bmp_ptr->col_num >> 1) > bmp_ptr->src_row_bytes) { + bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); + return 0; + } + *first_byte_ptr = bmp_ptr->out_row_bytes - bmp_ptr->col_num - 1; + } + if (!bmp_read_data(bmp_ptr, &second_byte_ptr, + size & 1 ? size + 1 : size)) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + for (uint8_t i = 0; i < *first_byte_ptr; i++) { + if (i & 0x01) { + *(bmp_ptr->out_row_buffer + bmp_ptr->col_num++) = + (*second_byte_ptr++ & 0x0F); + } else { + *(bmp_ptr->out_row_buffer + bmp_ptr->col_num++) = + ((*second_byte_ptr & 0xF0) >> 4); + } + } + } + } + } break; + default: { + if (!bmp_read_data(bmp_ptr, &second_byte_ptr, 1)) { + bmp_ptr->skip_size = skip_size_org; + return 2; + } + if ((int32_t)*first_byte_ptr > + bmp_ptr->out_row_bytes - bmp_ptr->col_num) { + uint8_t size = (uint8_t)(((uint16_t)(*first_byte_ptr) + 1) >> 1); + if (size + (bmp_ptr->col_num >> 1) > bmp_ptr->src_row_bytes) { + bmp_error(bmp_ptr, "The Bmp File Is Corrupt"); + return 0; + } + *first_byte_ptr = bmp_ptr->out_row_bytes - bmp_ptr->col_num - 1; + } + for (uint8_t i = 0; i < *first_byte_ptr; i++) { + if (i & 0x01) { + *(bmp_ptr->out_row_buffer + bmp_ptr->col_num++) = + (*second_byte_ptr & 0x0F); + } else { + *(bmp_ptr->out_row_buffer + bmp_ptr->col_num++) = + ((*second_byte_ptr & 0xF0) >> 4); + } + } + } + } + } + bmp_error(bmp_ptr, "Any Uncontrol Error"); + return 0; +} +uint8_t* bmp_read_data(bmp_decompress_struct_p bmp_ptr, + uint8_t** des_buf_pp, + uint32_t data_size) { + if (!bmp_ptr || bmp_ptr->avail_in < bmp_ptr->skip_size + data_size) + return nullptr; + + *des_buf_pp = bmp_ptr->next_in + bmp_ptr->skip_size; + bmp_ptr->skip_size += data_size; + return *des_buf_pp; +} +void bmp_save_decoding_status(bmp_decompress_struct_p bmp_ptr, int32_t status) { + bmp_ptr->decode_status = status; + bmp_ptr->next_in += bmp_ptr->skip_size; + bmp_ptr->avail_in -= bmp_ptr->skip_size; + bmp_ptr->skip_size = 0; +} +void bmp_input_buffer(bmp_decompress_struct_p bmp_ptr, + uint8_t* src_buf, + uint32_t src_size) { + bmp_ptr->next_in = src_buf; + bmp_ptr->avail_in = src_size; + bmp_ptr->skip_size = 0; +} +uint32_t bmp_get_avail_input(bmp_decompress_struct_p bmp_ptr, + uint8_t** avail_buf_ptr) { + if (avail_buf_ptr) { + *avail_buf_ptr = nullptr; + if (bmp_ptr->avail_in > 0) { + *avail_buf_ptr = bmp_ptr->next_in; + } + } + return bmp_ptr->avail_in; +} +bmp_compress_struct_p bmp_create_compress() { + bmp_compress_struct_p bmp_ptr; + bmp_ptr = FX_Alloc(bmp_compress_struct, 1); + if (bmp_ptr) { + FXSYS_memset(bmp_ptr, 0, sizeof(bmp_compress_struct)); + } + return bmp_ptr; +} +void bmp_destroy_compress(bmp_compress_struct_p bmp_ptr) { + if (bmp_ptr) { + if (bmp_ptr->src_free && bmp_ptr->src_buf) { + FX_Free(bmp_ptr->src_buf); + } + FX_Free(bmp_ptr); + } +} +static void WriteFileHeader(BmpFileHeaderPtr head_ptr, uint8_t* dst_buf) { + uint32_t offset; + offset = 0; + SetWord_LSBFirst(&dst_buf[offset], head_ptr->bfType); + offset += 2; + SetDWord_LSBFirst(&dst_buf[offset], head_ptr->bfSize); + offset += 4; + SetWord_LSBFirst(&dst_buf[offset], head_ptr->bfReserved1); + offset += 2; + SetWord_LSBFirst(&dst_buf[offset], head_ptr->bfReserved2); + offset += 2; + SetDWord_LSBFirst(&dst_buf[offset], head_ptr->bfOffBits); + offset += 4; +} +static void WriteInfoHeader(BmpInfoHeaderPtr info_head_ptr, uint8_t* dst_buf) { + uint32_t offset; + offset = sizeof(BmpFileHeader); + SetDWord_LSBFirst(&dst_buf[offset], info_head_ptr->biSize); + offset += 4; + SetDWord_LSBFirst(&dst_buf[offset], info_head_ptr->biWidth); + offset += 4; + SetDWord_LSBFirst(&dst_buf[offset], info_head_ptr->biHeight); + offset += 4; + SetWord_LSBFirst(&dst_buf[offset], info_head_ptr->biPlanes); + offset += 2; + SetWord_LSBFirst(&dst_buf[offset], info_head_ptr->biBitCount); + offset += 2; + SetDWord_LSBFirst(&dst_buf[offset], info_head_ptr->biCompression); + offset += 4; + SetDWord_LSBFirst(&dst_buf[offset], info_head_ptr->biSizeImage); + offset += 4; + SetDWord_LSBFirst(&dst_buf[offset], info_head_ptr->biXPelsPerMeter); + offset += 4; + SetDWord_LSBFirst(&dst_buf[offset], info_head_ptr->biYPelsPerMeter); + offset += 4; + SetDWord_LSBFirst(&dst_buf[offset], info_head_ptr->biClrUsed); + offset += 4; + SetDWord_LSBFirst(&dst_buf[offset], info_head_ptr->biClrImportant); + offset += 4; +} +static void bmp_encode_bitfields(bmp_compress_struct_p bmp_ptr, + uint8_t*& dst_buf, + uint32_t& dst_size) { + if (bmp_ptr->info_header.biBitCount != 16 && + bmp_ptr->info_header.biBitCount != 32) { + return; + } + uint32_t size, dst_pos, i; + size = bmp_ptr->src_pitch * bmp_ptr->src_row * + bmp_ptr->info_header.biBitCount / 16; + dst_pos = bmp_ptr->file_header.bfOffBits; + dst_size += size; + dst_buf = FX_Realloc(uint8_t, dst_buf, dst_size); + FXSYS_memset(&dst_buf[dst_pos], 0, size); + uint32_t mask_red; + uint32_t mask_green; + uint32_t mask_blue; + mask_red = 0x7C00; + mask_green = 0x03E0; + mask_blue = 0x001F; + if (bmp_ptr->info_header.biCompression == BMP_BITFIELDS) { + if (bmp_ptr->bit_type == BMP_BIT_565) { + mask_red = 0xF800; + mask_green = 0x07E0; + mask_blue = 0x001F; + } + if (bmp_ptr->info_header.biBitCount == 32) { + mask_red = 0xFF0000; + mask_green = 0x00FF00; + mask_blue = 0x0000FF; + } + SetDWord_LSBFirst(&dst_buf[dst_pos], mask_red); + dst_pos += 4; + SetDWord_LSBFirst(&dst_buf[dst_pos], mask_green); + dst_pos += 4; + SetDWord_LSBFirst(&dst_buf[dst_pos], mask_blue); + dst_pos += 4; + bmp_ptr->file_header.bfOffBits = dst_pos; + } + uint8_t blue_bits = 0; + uint8_t green_bits = 0; + uint8_t red_bits = 0; + for (i = 0; i < bmp_ptr->info_header.biBitCount; i++) { + if ((mask_blue >> i) & 0x01) { + blue_bits++; + } + if ((mask_green >> i) & 0x01) { + green_bits++; + } + if ((mask_red >> i) & 0x01) { + red_bits++; + } + } + green_bits += blue_bits; + red_bits += green_bits; + blue_bits = 8 - blue_bits; + green_bits -= 8; + red_bits -= 8; + i = 0; + for (int32_t row_num = bmp_ptr->src_row - 1; row_num > -1; row_num--, i = 0) { + while (i < bmp_ptr->src_width * bmp_ptr->src_bpp / 8) { + uint8_t b = bmp_ptr->src_buf[row_num * bmp_ptr->src_pitch + i++]; + uint8_t g = bmp_ptr->src_buf[row_num * bmp_ptr->src_pitch + i++]; + uint8_t r = bmp_ptr->src_buf[row_num * bmp_ptr->src_pitch + i++]; + if (bmp_ptr->src_bpp == 32) { + i++; + } + uint32_t pix_val = 0; + pix_val |= (b >> blue_bits) & mask_blue; + pix_val |= (g << green_bits) & mask_green; + pix_val |= (r << red_bits) & mask_red; + if (bmp_ptr->info_header.biBitCount == 16) { + SetWord_LSBFirst(&dst_buf[dst_pos], pix_val); + dst_pos += 2; + } else { + SetDWord_LSBFirst(&dst_buf[dst_pos], pix_val); + dst_pos += 4; + } + } + } + dst_size = dst_pos; +} + +static void bmp_encode_rgb(bmp_compress_struct_p bmp_ptr, + uint8_t*& dst_buf, + uint32_t& dst_size) { + if (bmp_ptr->info_header.biBitCount == 16) { + bmp_encode_bitfields(bmp_ptr, dst_buf, dst_size); + return; + } + uint32_t size, dst_pos; + uint32_t dst_pitch = + (bmp_ptr->src_width * bmp_ptr->info_header.biBitCount + 31) / 32 * 4; + size = dst_pitch * bmp_ptr->src_row; + dst_pos = bmp_ptr->file_header.bfOffBits; + dst_size += size; + dst_buf = FX_Realloc(uint8_t, dst_buf, dst_size); + FXSYS_memset(&dst_buf[dst_pos], 0, size); + for (int32_t row_num = bmp_ptr->src_row - 1; row_num > -1; row_num--) { + FXSYS_memcpy(&dst_buf[dst_pos], + &bmp_ptr->src_buf[row_num * bmp_ptr->src_pitch], + bmp_ptr->src_pitch); + dst_pos += dst_pitch; + } + dst_size = dst_pos; +} +static uint8_t bmp_rle8_search(const uint8_t* buf, int32_t len) { + uint8_t num; + num = 1; + while (num < len) { + if (buf[num - 1] != buf[num] || num == 0xFF) { + break; + } + num++; + } + return num; +} +static void bmp_encode_rle8(bmp_compress_struct_p bmp_ptr, + uint8_t*& dst_buf, + uint32_t& dst_size) { + uint32_t size, dst_pos, index; + uint8_t rle[2] = {0}; + size = bmp_ptr->src_pitch * bmp_ptr->src_row * 2; + dst_pos = bmp_ptr->file_header.bfOffBits; + dst_size += size; + dst_buf = FX_Realloc(uint8_t, dst_buf, dst_size); + FXSYS_memset(&dst_buf[dst_pos], 0, size); + for (int32_t row_num = bmp_ptr->src_row - 1, i = 0; row_num > -1;) { + index = row_num * bmp_ptr->src_pitch; + rle[0] = bmp_rle8_search(&bmp_ptr->src_buf[index + i], size - index - i); + rle[1] = bmp_ptr->src_buf[index + i]; + if (i + rle[0] >= (int32_t)bmp_ptr->src_pitch) { + rle[0] = uint8_t(bmp_ptr->src_pitch - i); + if (rle[0]) { + dst_buf[dst_pos++] = rle[0]; + dst_buf[dst_pos++] = rle[1]; + } + dst_buf[dst_pos++] = RLE_MARKER; + dst_buf[dst_pos++] = RLE_EOL; + i = 0; + row_num--; + } else { + i += rle[0]; + dst_buf[dst_pos++] = rle[0]; + dst_buf[dst_pos++] = rle[1]; + } + } + dst_buf[dst_pos++] = RLE_MARKER; + dst_buf[dst_pos++] = RLE_EOI; + dst_size = dst_pos; +} +static uint8_t bmp_rle4_search(const uint8_t* buf, int32_t len) { + uint8_t num; + num = 2; + while (num < len) { + if (buf[num - 2] != buf[num] || num == 0xFF) { + break; + } + num++; + } + return num; +} +static void bmp_encode_rle4(bmp_compress_struct_p bmp_ptr, + uint8_t*& dst_buf, + uint32_t& dst_size) { + uint32_t size, dst_pos, index; + uint8_t rle[2] = {0}; + size = bmp_ptr->src_pitch * bmp_ptr->src_row; + dst_pos = bmp_ptr->file_header.bfOffBits; + dst_size += size; + dst_buf = FX_Realloc(uint8_t, dst_buf, dst_size); + FXSYS_memset(&dst_buf[dst_pos], 0, size); + for (int32_t row_num = bmp_ptr->src_row - 1, i = 0; row_num > -1; + rle[1] = 0) { + index = row_num * bmp_ptr->src_pitch; + rle[0] = bmp_rle4_search(&bmp_ptr->src_buf[index + i], size - index - i); + rle[1] |= (bmp_ptr->src_buf[index + i] & 0x0f) << 4; + rle[1] |= bmp_ptr->src_buf[index + i + 1] & 0x0f; + if (i + rle[0] >= (int32_t)bmp_ptr->src_pitch) { + rle[0] = uint8_t(bmp_ptr->src_pitch - i); + if (rle[0]) { + dst_buf[dst_pos++] = rle[0]; + dst_buf[dst_pos++] = rle[1]; + } + dst_buf[dst_pos++] = RLE_MARKER; + dst_buf[dst_pos++] = RLE_EOL; + i = 0; + row_num--; + } else { + i += rle[0]; + dst_buf[dst_pos++] = rle[0]; + dst_buf[dst_pos++] = rle[1]; + } + } + dst_buf[dst_pos++] = RLE_MARKER; + dst_buf[dst_pos++] = RLE_EOI; + dst_size = dst_pos; +} +bool bmp_encode_image(bmp_compress_struct_p bmp_ptr, + uint8_t*& dst_buf, + uint32_t& dst_size) { + uint32_t head_size = sizeof(BmpFileHeader) + sizeof(BmpInfoHeader); + uint32_t pal_size = sizeof(uint32_t) * bmp_ptr->pal_num; + if (bmp_ptr->info_header.biClrUsed > 0 && + bmp_ptr->info_header.biClrUsed < bmp_ptr->pal_num) { + pal_size = sizeof(uint32_t) * bmp_ptr->info_header.biClrUsed; + } + dst_size = head_size + sizeof(uint32_t) * bmp_ptr->pal_num; + dst_buf = FX_TryAlloc(uint8_t, dst_size); + if (!dst_buf) + return false; + + FXSYS_memset(dst_buf, 0, dst_size); + bmp_ptr->file_header.bfOffBits = head_size; + if (bmp_ptr->pal_ptr && pal_size) { + FXSYS_memcpy(&dst_buf[head_size], bmp_ptr->pal_ptr, pal_size); + bmp_ptr->file_header.bfOffBits += pal_size; + } + WriteInfoHeader(&bmp_ptr->info_header, dst_buf); + switch (bmp_ptr->info_header.biCompression) { + case BMP_RGB: + bmp_encode_rgb(bmp_ptr, dst_buf, dst_size); + break; + case BMP_BITFIELDS: + bmp_encode_bitfields(bmp_ptr, dst_buf, dst_size); + break; + case BMP_RLE8: + bmp_encode_rle8(bmp_ptr, dst_buf, dst_size); + break; + case BMP_RLE4: + bmp_encode_rle4(bmp_ptr, dst_buf, dst_size); + break; + default: + break; + } + bmp_ptr->file_header.bfSize = dst_size; + WriteFileHeader(&bmp_ptr->file_header, dst_buf); + return true; +} diff --git a/modules/pdfium/pdfium/core/fxcodec/lbmp/fx_bmp.h b/modules/pdfium/pdfium/core/fxcodec/lbmp/fx_bmp.h new file mode 100644 index 000000000000..27a0f19970de --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/lbmp/fx_bmp.h @@ -0,0 +1,155 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_LBMP_FX_BMP_H_ +#define CORE_FXCODEC_LBMP_FX_BMP_H_ + +#include + +#include "core/fxcrt/fx_basic.h" + +#define BMP_WIDTHBYTES(width, bitCount) ((width * bitCount) + 31) / 32 * 4 +#define BMP_PAL_ENCODE(a, r, g, b) \ + (((uint32_t)(a) << 24) | ((r) << 16) | ((g) << 8) | (b)) +#define BMP_D_STATUS_HEADER 0x01 +#define BMP_D_STATUS_PAL 0x02 +#define BMP_D_STATUS_DATA_PRE 0x03 +#define BMP_D_STATUS_DATA 0x04 +#define BMP_D_STATUS_TAIL 0x00 +#define BMP_SIGNATURE 0x4D42 +#define BMP_PAL_NEW 0 +#define BMP_PAL_OLD 1 +#define RLE_MARKER 0 +#define RLE_EOL 0 +#define RLE_EOI 1 +#define RLE_DELTA 2 +#define BMP_RGB 0L +#define BMP_RLE8 1L +#define BMP_RLE4 2L +#define BMP_BITFIELDS 3L +#define BMP_BIT_555 0 +#define BMP_BIT_565 1 +#define BMP_MAX_ERROR_SIZE 256 +#pragma pack(1) +typedef struct tagBmpFileHeader { + uint16_t bfType; + uint32_t bfSize; + uint16_t bfReserved1; + uint16_t bfReserved2; + uint32_t bfOffBits; +} BmpFileHeader, *BmpFileHeaderPtr; +typedef struct tagBmpCoreHeader { + uint32_t bcSize; + uint16_t bcWidth; + uint16_t bcHeight; + uint16_t bcPlanes; + uint16_t bcBitCount; +} BmpCoreHeader, *BmpCoreHeaderPtr; +typedef struct tagBmpInfoHeader { + uint32_t biSize; + int32_t biWidth; + int32_t biHeight; + uint16_t biPlanes; + uint16_t biBitCount; + uint32_t biCompression; + uint32_t biSizeImage; + int32_t biXPelsPerMeter; + int32_t biYPelsPerMeter; + uint32_t biClrUsed; + uint32_t biClrImportant; +} BmpInfoHeader, *BmpInfoHeaderPtr; +#pragma pack() + +typedef struct tag_bmp_decompress_struct bmp_decompress_struct; +typedef bmp_decompress_struct* bmp_decompress_struct_p; +typedef bmp_decompress_struct_p* bmp_decompress_struct_pp; +struct tag_bmp_decompress_struct { + jmp_buf jmpbuf; + FX_CHAR* err_ptr; + void (*bmp_error_fn)(bmp_decompress_struct_p gif_ptr, const FX_CHAR* err_msg); + + void* context_ptr; + + BmpFileHeaderPtr bmp_header_ptr; + BmpInfoHeaderPtr bmp_infoheader_ptr; + int32_t width; + int32_t height; + uint32_t compress_flag; + int32_t components; + int32_t src_row_bytes; + int32_t out_row_bytes; + uint8_t* out_row_buffer; + uint16_t bitCounts; + uint32_t color_used; + bool imgTB_flag; + int32_t pal_num; + int32_t pal_type; + uint32_t* pal_ptr; + uint32_t data_size; + uint32_t img_data_offset; + uint32_t img_ifh_size; + int32_t row_num; + int32_t col_num; + int32_t dpi_x; + int32_t dpi_y; + uint32_t mask_red; + uint32_t mask_green; + uint32_t mask_blue; + + bool (*bmp_get_data_position_fn)(bmp_decompress_struct_p bmp_ptr, + uint32_t cur_pos); + void (*bmp_get_row_fn)(bmp_decompress_struct_p bmp_ptr, + int32_t row_num, + uint8_t* row_buf); + uint8_t* next_in; + uint32_t avail_in; + uint32_t skip_size; + int32_t decode_status; +}; +void bmp_error(bmp_decompress_struct_p bmp_ptr, const FX_CHAR* err_msg); +bmp_decompress_struct_p bmp_create_decompress(); +void bmp_destroy_decompress(bmp_decompress_struct_pp bmp_ptr_ptr); +int32_t bmp_read_header(bmp_decompress_struct_p bmp_ptr); +int32_t bmp_decode_image(bmp_decompress_struct_p bmp_ptr); +int32_t bmp_decode_rgb(bmp_decompress_struct_p bmp_ptr); +int32_t bmp_decode_rle8(bmp_decompress_struct_p bmp_ptr); +int32_t bmp_decode_rle4(bmp_decompress_struct_p bmp_ptr); +uint8_t* bmp_read_data(bmp_decompress_struct_p bmp_ptr, + uint8_t** des_buf_pp, + uint32_t data_size); +void bmp_save_decoding_status(bmp_decompress_struct_p bmp_ptr, int32_t status); +void bmp_input_buffer(bmp_decompress_struct_p bmp_ptr, + uint8_t* src_buf, + uint32_t src_size); +uint32_t bmp_get_avail_input(bmp_decompress_struct_p bmp_ptr, + uint8_t** avail_buf_ptr); +typedef struct tag_bmp_compress_struct bmp_compress_struct; +typedef bmp_compress_struct* bmp_compress_struct_p; +typedef bmp_compress_struct_p* bmp_compress_struct_pp; +struct tag_bmp_compress_struct { + BmpFileHeader file_header; + BmpInfoHeader info_header; + uint8_t* src_buf; + uint32_t src_pitch; + uint32_t src_row; + uint8_t src_bpp; + uint32_t src_width; + bool src_free; + uint32_t* pal_ptr; + uint16_t pal_num; + uint8_t bit_type; +}; + +bmp_compress_struct_p bmp_create_compress(); +void bmp_destroy_compress(bmp_compress_struct_p bmp_ptr); +bool bmp_encode_image(bmp_compress_struct_p bmp_ptr, + uint8_t*& dst_buf, + uint32_t& dst_size); + +uint16_t GetWord_LSBFirst(uint8_t* p); +void SetWord_LSBFirst(uint8_t* p, uint16_t v); + +#endif // CORE_FXCODEC_LBMP_FX_BMP_H_ diff --git a/modules/pdfium/pdfium/core/fxcodec/lgif/fx_gif.cpp b/modules/pdfium/pdfium/core/fxcodec/lgif/fx_gif.cpp new file mode 100644 index 000000000000..d62dacb36c28 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/lgif/fx_gif.cpp @@ -0,0 +1,1262 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/lgif/fx_gif.h" + +#include "core/fxcodec/lbmp/fx_bmp.h" +#include "third_party/base/stl_util.h" + +void CGifLZWDecoder::Input(uint8_t* src_buf, uint32_t src_size) { + next_in = src_buf; + avail_in = src_size; +} + +uint32_t CGifLZWDecoder::GetAvailInput() { + return avail_in; +} + +CGifLZWDecoder::CGifLZWDecoder(FX_CHAR* error_ptr) + : code_size(0), + code_size_cur(0), + code_clear(0), + code_end(0), + code_next(0), + code_first(0), + stack_size(0), + code_old(0), + next_in(nullptr), + avail_in(0), + bits_left(0), + code_store(0), + err_msg_ptr(error_ptr) {} + +CGifLZWDecoder::~CGifLZWDecoder() {} + +void CGifLZWDecoder::InitTable(uint8_t code_len) { + code_size = code_len; + ASSERT(code_size < 32); + code_clear = 1 << code_size; + code_end = code_clear + 1; + bits_left = 0; + code_store = 0; + next_in = nullptr; + avail_in = 0; + stack_size = 0; + code_first = 0; + ClearTable(); +} +void CGifLZWDecoder::ClearTable() { + code_size_cur = code_size + 1; + code_next = code_end + 1; + code_old = (uint16_t)-1; + FXSYS_memset(code_table, 0, sizeof(tag_Table) * GIF_MAX_LZW_CODE); + FXSYS_memset(stack, 0, GIF_MAX_LZW_CODE); + for (uint16_t i = 0; i < code_clear; i++) { + code_table[i].suffix = (uint8_t)i; + } +} +void CGifLZWDecoder::DecodeString(uint16_t code) { + stack_size = 0; + while (true) { + ASSERT(code <= code_next); + if (code < code_clear || code > code_next) { + break; + } + stack[GIF_MAX_LZW_CODE - 1 - stack_size++] = code_table[code].suffix; + code = code_table[code].prefix; + } + stack[GIF_MAX_LZW_CODE - 1 - stack_size++] = (uint8_t)code; + code_first = (uint8_t)code; +} +void CGifLZWDecoder::AddCode(uint16_t prefix_code, uint8_t append_char) { + if (code_next == GIF_MAX_LZW_CODE) { + return; + } + code_table[code_next].prefix = prefix_code; + code_table[code_next].suffix = append_char; + if (++code_next < GIF_MAX_LZW_CODE) { + if (code_next >> code_size_cur) { + code_size_cur++; + } + } +} +int32_t CGifLZWDecoder::Decode(uint8_t* des_buf, uint32_t& des_size) { + if (des_size == 0) { + return 3; + } + uint32_t i = 0; + if (stack_size != 0) { + if (des_size < stack_size) { + FXSYS_memcpy(des_buf, &stack[GIF_MAX_LZW_CODE - stack_size], des_size); + stack_size -= (uint16_t)des_size; + return 3; + } + FXSYS_memcpy(des_buf, &stack[GIF_MAX_LZW_CODE - stack_size], stack_size); + des_buf += stack_size; + i += stack_size; + stack_size = 0; + } + uint16_t code = 0; + while (i <= des_size && (avail_in > 0 || bits_left >= code_size_cur)) { + if (code_size_cur > 12) { + if (err_msg_ptr) { + FXSYS_strncpy(err_msg_ptr, "Code Length Out Of Range", + GIF_MAX_ERROR_SIZE - 1); + } + return 0; + } + if (avail_in > 0) { + if (bits_left > 31) { + if (err_msg_ptr) + FXSYS_strncpy(err_msg_ptr, "Decode Error", GIF_MAX_ERROR_SIZE - 1); + return 0; + } + pdfium::base::CheckedNumeric safe_code = *next_in++; + safe_code <<= bits_left; + safe_code |= code_store; + if (!safe_code.IsValid()) { + if (err_msg_ptr) { + FXSYS_strncpy(err_msg_ptr, "Code Store Out Of Range", + GIF_MAX_ERROR_SIZE - 1); + } + return 0; + } + code_store = safe_code.ValueOrDie(); + avail_in--; + bits_left += 8; + } + while (bits_left >= code_size_cur) { + code = (uint16_t)code_store & ((1 << code_size_cur) - 1); + code_store >>= code_size_cur; + bits_left -= code_size_cur; + if (code == code_clear) { + ClearTable(); + continue; + } else if (code >= code_end) { + des_size = i; + return 1; + } else { + if (code_old != (uint16_t)-1) { + if (code_next < GIF_MAX_LZW_CODE) { + if (code == code_next) { + AddCode(code_old, code_first); + DecodeString(code); + } else if (code > code_next) { + if (err_msg_ptr) { + FXSYS_strncpy(err_msg_ptr, "Decode Error, Out Of Range", + GIF_MAX_ERROR_SIZE - 1); + } + return 0; + } else { + DecodeString(code); + uint8_t append_char = stack[GIF_MAX_LZW_CODE - stack_size]; + AddCode(code_old, append_char); + } + } + } else { + DecodeString(code); + } + code_old = code; + if (i + stack_size > des_size) { + FXSYS_memcpy(des_buf, &stack[GIF_MAX_LZW_CODE - stack_size], + des_size - i); + stack_size -= (uint16_t)(des_size - i); + return 3; + } + FXSYS_memcpy(des_buf, &stack[GIF_MAX_LZW_CODE - stack_size], + stack_size); + des_buf += stack_size; + i += stack_size; + stack_size = 0; + } + } + } + if (avail_in == 0) { + des_size = i; + return 2; + } + return 0; +} +static bool gif_grow_buf(uint8_t*& dst_buf, uint32_t& dst_len, uint32_t size) { + if (dst_len < size) { + uint32_t len_org = dst_len; + while (dst_buf && dst_len < size) { + dst_len <<= 1; + // TODO(thestig): Probably should be a try-realloc here. + dst_buf = FX_Realloc(uint8_t, dst_buf, dst_len); + } + if (!dst_buf) { + dst_len = size; + dst_buf = FX_Realloc(uint8_t, dst_buf, dst_len); + } + FXSYS_memset(dst_buf + len_org, 0, dst_len - len_org); + return !!dst_buf; + } + return true; +} +static inline void gif_cut_index(uint8_t& val, + uint32_t index, + uint8_t index_bit, + uint8_t index_bit_use, + uint8_t bit_use) { + uint32_t cut = ((1 << (index_bit - index_bit_use)) - 1) << index_bit_use; + val |= ((index & cut) >> index_bit_use) << bit_use; +} +static inline uint8_t gif_cut_buf(const uint8_t* buf, + uint32_t& offset, + uint8_t bit_cut, + uint8_t& bit_offset, + uint32_t& bit_num) { + if (bit_cut != 8) { + uint16_t index = 0; + index |= ((1 << bit_cut) - 1) << (7 - bit_offset); + uint8_t ret = ((index & buf[offset]) >> (7 - bit_offset)); + bit_offset += bit_cut; + if (bit_offset >= 8) { + if (bit_offset > 8) { + ret |= ((index & (buf[offset + 1] << 8)) >> 8); + } + bit_offset -= 8; + offset++; + } + bit_num += bit_cut; + return ret; + } + bit_num += bit_cut; + return buf[offset++]; +} +CGifLZWEncoder::CGifLZWEncoder() { + FXSYS_memset(this, 0, sizeof(CGifLZWEncoder)); +} +CGifLZWEncoder::~CGifLZWEncoder() {} +void CGifLZWEncoder::ClearTable() { + index_bit_cur = code_size + 1; + index_num = code_end + 1; + table_cur = code_end + 1; + for (uint16_t i = 0; i < GIF_MAX_LZW_CODE; i++) { + code_table[i].prefix = 0; + code_table[i].suffix = 0; + } +} +void CGifLZWEncoder::Start(uint8_t code_len, + const uint8_t* src_buf, + uint8_t*& dst_buf, + uint32_t& offset) { + code_size = code_len + 1; + ASSERT(code_size < 32); + src_bit_cut = code_size; + if (code_len == 0) { + src_bit_cut = 1; + code_size = 2; + } + code_clear = 1 << code_size; + code_end = code_clear + 1; + dst_buf[offset++] = code_size; + bit_offset = 0; + ClearTable(); + src_offset = 0; + src_bit_offset = 0; + src_bit_num = 0; + code_table[index_num].prefix = gif_cut_buf(src_buf, src_offset, src_bit_cut, + src_bit_offset, src_bit_num); + code_table[index_num].suffix = gif_cut_buf(src_buf, src_offset, src_bit_cut, + src_bit_offset, src_bit_num); +} +void CGifLZWEncoder::WriteBlock(uint8_t*& dst_buf, + uint32_t& dst_len, + uint32_t& offset) { + if (!gif_grow_buf(dst_buf, dst_len, offset + GIF_DATA_BLOCK + 1)) { + longjmp(jmp, 1); + } + dst_buf[offset++] = index_buf_len; + FXSYS_memcpy(&dst_buf[offset], index_buf, index_buf_len); + offset += index_buf_len; + FXSYS_memset(index_buf, 0, GIF_DATA_BLOCK); + index_buf_len = 0; +} +void CGifLZWEncoder::EncodeString(uint32_t index, + uint8_t*& dst_buf, + uint32_t& dst_len, + uint32_t& offset) { + uint8_t index_bit_use; + index_bit_use = 0; + if (index_buf_len == GIF_DATA_BLOCK) { + WriteBlock(dst_buf, dst_len, offset); + } + gif_cut_index(index_buf[index_buf_len], index, index_bit_cur, index_bit_use, + bit_offset); + if (index_bit_cur <= (8 - bit_offset)) { + bit_offset += index_bit_cur; + } else if (index_bit_cur <= (16 - bit_offset)) { + index_bit_use += (8 - bit_offset); + bit_offset = 0; + index_buf_len++; + if (index_buf_len == GIF_DATA_BLOCK) { + WriteBlock(dst_buf, dst_len, offset); + } + gif_cut_index(index_buf[index_buf_len], index, index_bit_cur, index_bit_use, + bit_offset); + bit_offset = index_bit_cur - index_bit_use; + } else { + index_bit_use += (8 - bit_offset); + bit_offset = 0; + index_buf_len++; + if (index_buf_len == GIF_DATA_BLOCK) { + WriteBlock(dst_buf, dst_len, offset); + } + gif_cut_index(index_buf[index_buf_len], index, index_bit_cur, index_bit_use, + bit_offset); + index_bit_use += 8; + bit_offset = 0; + index_buf_len++; + if (index_buf_len == GIF_DATA_BLOCK) { + WriteBlock(dst_buf, dst_len, offset); + } + gif_cut_index(index_buf[index_buf_len], index, index_bit_cur, index_bit_use, + bit_offset); + bit_offset = index_bit_cur - index_bit_use; + } + if (bit_offset == 8) { + bit_offset = 0; + index_buf_len++; + if (index_buf_len == GIF_DATA_BLOCK) { + WriteBlock(dst_buf, dst_len, offset); + } + } + if (index == code_end) { + index_buf_len++; + WriteBlock(dst_buf, dst_len, offset); + } + if (index_num++ >> index_bit_cur) { + index_bit_cur++; + } +} +bool CGifLZWEncoder::Encode(const uint8_t* src_buf, + uint32_t src_len, + uint8_t*& dst_buf, + uint32_t& dst_len, + uint32_t& offset) { + uint8_t suffix; + if (setjmp(jmp)) { + return false; + } + while (src_bit_num < src_len) { + if (!LookUpInTable(src_buf, src_offset, src_bit_offset)) { + EncodeString(code_table[index_num].prefix, dst_buf, dst_len, offset); + if (index_num == GIF_MAX_LZW_CODE) { + suffix = code_table[index_num - 1].suffix; + EncodeString(code_clear, dst_buf, dst_len, offset); + ClearTable(); + code_table[index_num].prefix = suffix; + code_table[index_num].suffix = gif_cut_buf( + src_buf, src_offset, src_bit_cut, src_bit_offset, src_bit_num); + } else { + code_table[index_num].prefix = code_table[index_num - 1].suffix; + code_table[index_num].suffix = gif_cut_buf( + src_buf, src_offset, src_bit_cut, src_bit_offset, src_bit_num); + } + } + } + src_offset = 0; + src_bit_offset = 0; + src_bit_num = 0; + return true; +} +bool CGifLZWEncoder::LookUpInTable(const uint8_t* buf, + uint32_t& offset, + uint8_t& out_bit_offset) { + for (uint16_t i = table_cur; i < index_num; i++) { + if (code_table[i].prefix == code_table[index_num].prefix && + code_table[i].suffix == code_table[index_num].suffix) { + code_table[index_num].prefix = i; + code_table[index_num].suffix = + gif_cut_buf(buf, offset, src_bit_cut, out_bit_offset, src_bit_num); + table_cur = i; + return true; + } + } + table_cur = code_end + 1; + return false; +} +void CGifLZWEncoder::Finish(uint8_t*& dst_buf, + uint32_t& dst_len, + uint32_t& offset) { + EncodeString(code_table[index_num].prefix, dst_buf, dst_len, offset); + EncodeString(code_end, dst_buf, dst_len, offset); + bit_offset = 0; + ClearTable(); +} +gif_decompress_struct_p gif_create_decompress() { + gif_decompress_struct_p gif_ptr = FX_Alloc(gif_decompress_struct, 1); + FXSYS_memset(gif_ptr, 0, sizeof(gif_decompress_struct)); + gif_ptr->decode_status = GIF_D_STATUS_SIG; + gif_ptr->img_ptr_arr_ptr = new std::vector; + gif_ptr->cmt_data_ptr = new CFX_ByteString; + gif_ptr->pt_ptr_arr_ptr = new std::vector; + return gif_ptr; +} +void gif_destroy_decompress(gif_decompress_struct_pp gif_ptr_ptr) { + if (!gif_ptr_ptr || !*gif_ptr_ptr) + return; + + gif_decompress_struct_p gif_ptr = *gif_ptr_ptr; + *gif_ptr_ptr = nullptr; + FX_Free(gif_ptr->global_pal_ptr); + delete gif_ptr->img_decoder_ptr; + if (gif_ptr->img_ptr_arr_ptr) { + size_t size_img_arr = gif_ptr->img_ptr_arr_ptr->size(); + for (size_t i = 0; i < size_img_arr; i++) { + GifImage* p = (*gif_ptr->img_ptr_arr_ptr)[i]; + FX_Free(p->image_info_ptr); + FX_Free(p->image_gce_ptr); + FX_Free(p->image_row_buf); + if (p->local_pal_ptr && p->local_pal_ptr != gif_ptr->global_pal_ptr) { + FX_Free(p->local_pal_ptr); + } + FX_Free(p); + } + gif_ptr->img_ptr_arr_ptr->clear(); + delete gif_ptr->img_ptr_arr_ptr; + } + delete gif_ptr->cmt_data_ptr; + FX_Free(gif_ptr->gce_ptr); + if (gif_ptr->pt_ptr_arr_ptr) { + size_t size_pt_arr = gif_ptr->pt_ptr_arr_ptr->size(); + for (size_t i = 0; i < size_pt_arr; i++) { + GifPlainText* p = (*gif_ptr->pt_ptr_arr_ptr)[i]; + FX_Free(p->gce_ptr); + FX_Free(p->pte_ptr); + delete p->string_ptr; + FX_Free(p); + } + gif_ptr->pt_ptr_arr_ptr->clear(); + delete gif_ptr->pt_ptr_arr_ptr; + } + FX_Free(gif_ptr); +} +gif_compress_struct_p gif_create_compress() { + gif_compress_struct_p gif_ptr = FX_Alloc(gif_compress_struct, 1); + FXSYS_memset(gif_ptr, 0, sizeof(gif_compress_struct)); + gif_ptr->img_encoder_ptr = new CGifLZWEncoder; + gif_ptr->header_ptr = FX_Alloc(GifHeader, 1); + if (!gif_ptr->header_ptr) { + delete (gif_ptr->img_encoder_ptr); + FX_Free(gif_ptr); + return nullptr; + } + FXSYS_memcpy(gif_ptr->header_ptr->signature, GIF_SIGNATURE, 3); + FXSYS_memcpy(gif_ptr->header_ptr->version, "89a", 3); + gif_ptr->lsd_ptr = FX_Alloc(GifLSD, 1); + if (!gif_ptr->lsd_ptr) { + FX_Free(gif_ptr->header_ptr); + delete (gif_ptr->img_encoder_ptr); + FX_Free(gif_ptr); + return nullptr; + } + FXSYS_memset(gif_ptr->lsd_ptr, 0, sizeof(GifLSD)); + gif_ptr->image_info_ptr = FX_Alloc(GifImageInfo, 1); + if (!gif_ptr->image_info_ptr) { + FX_Free(gif_ptr->lsd_ptr); + FX_Free(gif_ptr->header_ptr); + delete (gif_ptr->img_encoder_ptr); + FX_Free(gif_ptr); + return nullptr; + } + FXSYS_memset(gif_ptr->image_info_ptr, 0, sizeof(GifImageInfo)); + gif_ptr->gce_ptr = FX_Alloc(GifGCE, 1); + if (!gif_ptr->gce_ptr) { + FX_Free(gif_ptr->image_info_ptr); + FX_Free(gif_ptr->lsd_ptr); + FX_Free(gif_ptr->header_ptr); + delete (gif_ptr->img_encoder_ptr); + FX_Free(gif_ptr); + return nullptr; + } + gif_ptr->pte_ptr = FX_Alloc(GifPTE, 1); + if (!gif_ptr->pte_ptr) { + FX_Free(gif_ptr->gce_ptr); + FX_Free(gif_ptr->image_info_ptr); + FX_Free(gif_ptr->lsd_ptr); + FX_Free(gif_ptr->header_ptr); + delete (gif_ptr->img_encoder_ptr); + FX_Free(gif_ptr); + return nullptr; + } + FXSYS_memset(gif_ptr->pte_ptr, 0, sizeof(GifPTE)); + gif_ptr->pte_ptr->block_size = 12; + return gif_ptr; +} +void gif_destroy_compress(gif_compress_struct_pp gif_ptr_ptr) { + if (!gif_ptr_ptr || !*gif_ptr_ptr) + return; + + gif_compress_struct_p gif_ptr = *gif_ptr_ptr; + *gif_ptr_ptr = nullptr; + FX_Free(gif_ptr->header_ptr); + FX_Free(gif_ptr->lsd_ptr); + FX_Free(gif_ptr->global_pal); + FX_Free(gif_ptr->image_info_ptr); + FX_Free(gif_ptr->local_pal); + delete gif_ptr->img_encoder_ptr; + FX_Free(gif_ptr->gce_ptr); + FX_Free(gif_ptr->cmt_data_ptr); + FX_Free(gif_ptr->pte_ptr); + FX_Free(gif_ptr); +} +void gif_error(gif_decompress_struct_p gif_ptr, const FX_CHAR* err_msg) { + if (gif_ptr && gif_ptr->gif_error_fn) { + gif_ptr->gif_error_fn(gif_ptr, err_msg); + } +} +void gif_warn(gif_decompress_struct_p gif_ptr, const FX_CHAR* err_msg) {} +int32_t gif_read_header(gif_decompress_struct_p gif_ptr) { + if (!gif_ptr) + return 0; + + uint32_t skip_size_org = gif_ptr->skip_size; + ASSERT(sizeof(GifHeader) == 6); + GifHeader* gif_header_ptr = nullptr; + if (!gif_read_data(gif_ptr, (uint8_t**)&gif_header_ptr, 6)) + return 2; + + if (FXSYS_strncmp(gif_header_ptr->signature, GIF_SIGNATURE, 3) != 0 || + gif_header_ptr->version[0] != '8' || gif_header_ptr->version[2] != 'a') { + gif_error(gif_ptr, "Not A Gif Image"); + return 0; + } + ASSERT(sizeof(GifLSD) == 7); + GifLSD* gif_lsd_ptr = nullptr; + if (!gif_read_data(gif_ptr, (uint8_t**)&gif_lsd_ptr, 7)) { + gif_ptr->skip_size = skip_size_org; + return 2; + } + if (((GifGF*)&gif_lsd_ptr->global_flag)->global_pal) { + gif_ptr->global_pal_num = 2 + << ((GifGF*)&gif_lsd_ptr->global_flag)->pal_bits; + ASSERT(sizeof(GifPalette) == 3); + int32_t global_pal_size = gif_ptr->global_pal_num * 3; + uint8_t* global_pal_ptr = nullptr; + if (!gif_read_data(gif_ptr, &global_pal_ptr, global_pal_size)) { + gif_ptr->skip_size = skip_size_org; + return 2; + } + gif_ptr->global_sort_flag = ((GifGF*)&gif_lsd_ptr->global_flag)->sort_flag; + gif_ptr->global_color_resolution = + ((GifGF*)&gif_lsd_ptr->global_flag)->color_resolution; + FX_Free(gif_ptr->global_pal_ptr); + gif_ptr->global_pal_ptr = (GifPalette*)FX_Alloc(uint8_t, global_pal_size); + FXSYS_memcpy(gif_ptr->global_pal_ptr, global_pal_ptr, global_pal_size); + } + gif_ptr->width = (int)GetWord_LSBFirst((uint8_t*)&gif_lsd_ptr->width); + gif_ptr->height = (int)GetWord_LSBFirst((uint8_t*)&gif_lsd_ptr->height); + gif_ptr->bc_index = gif_lsd_ptr->bc_index; + gif_ptr->pixel_aspect = gif_lsd_ptr->pixel_aspect; + return 1; +} +int32_t gif_get_frame(gif_decompress_struct_p gif_ptr) { + if (!gif_ptr) + return 0; + + int32_t ret = 1; + while (true) { + switch (gif_ptr->decode_status) { + case GIF_D_STATUS_TAIL: + return 1; + case GIF_D_STATUS_SIG: { + uint8_t* sig_ptr = nullptr; + if (!gif_read_data(gif_ptr, &sig_ptr, 1)) + return 2; + + switch (*sig_ptr) { + case GIF_SIG_EXTENSION: + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_EXT); + continue; + case GIF_SIG_IMAGE: + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_INFO); + continue; + case GIF_SIG_TRAILER: + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL); + return 1; + default: + if (gif_ptr->avail_in) { + gif_warn(gif_ptr, "The Gif File has non_standard Tag!"); + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_SIG); + continue; + } + gif_warn(gif_ptr, "The Gif File Doesn't have Trailer Tag!"); + return 1; + } + } + case GIF_D_STATUS_EXT: { + uint8_t* ext_ptr = nullptr; + if (!gif_read_data(gif_ptr, &ext_ptr, 1)) + return 2; + + switch (*ext_ptr) { + case GIF_BLOCK_CE: + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_EXT_CE); + continue; + case GIF_BLOCK_GCE: + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_EXT_GCE); + continue; + case GIF_BLOCK_PTE: + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_EXT_PTE); + continue; + default: { + int32_t status = GIF_D_STATUS_EXT_UNE; + if (*ext_ptr == GIF_BLOCK_PTE) { + status = GIF_D_STATUS_EXT_PTE; + } + gif_save_decoding_status(gif_ptr, status); + continue; + } + } + } + case GIF_D_STATUS_IMG_INFO: { + ret = gif_decode_image_info(gif_ptr); + if (ret != 1) { + return ret; + } + continue; + } + case GIF_D_STATUS_IMG_DATA: { + uint8_t* data_size_ptr = nullptr; + uint8_t* data_ptr = nullptr; + uint32_t skip_size_org = gif_ptr->skip_size; + if (!gif_read_data(gif_ptr, &data_size_ptr, 1)) + return 2; + + while (*data_size_ptr != GIF_BLOCK_TERMINAL) { + if (!gif_read_data(gif_ptr, &data_ptr, *data_size_ptr)) { + gif_ptr->skip_size = skip_size_org; + return 2; + } + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA); + skip_size_org = gif_ptr->skip_size; + if (!gif_read_data(gif_ptr, &data_size_ptr, 1)) + return 2; + } + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_SIG); + continue; + } + default: { + ret = gif_decode_extension(gif_ptr); + if (ret != 1) { + return ret; + } + continue; + } + } + } + return 1; +} +void gif_takeover_gce_ptr(gif_decompress_struct_p gif_ptr, + GifGCE** gce_ptr_ptr) { + *gce_ptr_ptr = nullptr; + if (gif_ptr->gce_ptr && gce_ptr_ptr) { + *gce_ptr_ptr = gif_ptr->gce_ptr; + gif_ptr->gce_ptr = nullptr; + } +} +int32_t gif_decode_extension(gif_decompress_struct_p gif_ptr) { + uint8_t* data_size_ptr = nullptr; + uint8_t* data_ptr = nullptr; + uint32_t skip_size_org = gif_ptr->skip_size; + switch (gif_ptr->decode_status) { + case GIF_D_STATUS_EXT_CE: { + if (!gif_read_data(gif_ptr, &data_size_ptr, 1)) { + gif_ptr->skip_size = skip_size_org; + return 2; + } + gif_ptr->cmt_data_ptr->clear(); + while (*data_size_ptr != GIF_BLOCK_TERMINAL) { + uint8_t data_size = *data_size_ptr; + if (!gif_read_data(gif_ptr, &data_ptr, *data_size_ptr) || + !gif_read_data(gif_ptr, &data_size_ptr, 1)) { + gif_ptr->skip_size = skip_size_org; + return 2; + } + *(gif_ptr->cmt_data_ptr) += + CFX_ByteString((const FX_CHAR*)data_ptr, data_size); + } + } break; + case GIF_D_STATUS_EXT_PTE: { + ASSERT(sizeof(GifPTE) == 13); + GifPTE* gif_pte_ptr = nullptr; + if (!gif_read_data(gif_ptr, (uint8_t**)&gif_pte_ptr, 13)) { + return 2; + } + GifPlainText* gif_pt_ptr = FX_Alloc(GifPlainText, 1); + FXSYS_memset(gif_pt_ptr, 0, sizeof(GifPlainText)); + gif_takeover_gce_ptr(gif_ptr, &gif_pt_ptr->gce_ptr); + gif_pt_ptr->pte_ptr = FX_Alloc(GifPTE, 1); + gif_pt_ptr->string_ptr = new CFX_ByteString; + gif_pt_ptr->pte_ptr->block_size = gif_pte_ptr->block_size; + gif_pt_ptr->pte_ptr->grid_left = + GetWord_LSBFirst((uint8_t*)&gif_pte_ptr->grid_left); + gif_pt_ptr->pte_ptr->grid_top = + GetWord_LSBFirst((uint8_t*)&gif_pte_ptr->grid_top); + gif_pt_ptr->pte_ptr->grid_width = + GetWord_LSBFirst((uint8_t*)&gif_pte_ptr->grid_width); + gif_pt_ptr->pte_ptr->grid_height = + GetWord_LSBFirst((uint8_t*)&gif_pte_ptr->grid_height); + gif_pt_ptr->pte_ptr->char_width = gif_pte_ptr->char_width; + gif_pt_ptr->pte_ptr->char_height = gif_pte_ptr->char_height; + gif_pt_ptr->pte_ptr->fc_index = gif_pte_ptr->fc_index; + gif_pt_ptr->pte_ptr->bc_index = gif_pte_ptr->bc_index; + if (!gif_read_data(gif_ptr, &data_size_ptr, 1)) { + gif_ptr->skip_size = skip_size_org; + if (gif_pt_ptr) { + FX_Free(gif_pt_ptr->gce_ptr); + FX_Free(gif_pt_ptr->pte_ptr); + delete gif_pt_ptr->string_ptr; + FX_Free(gif_pt_ptr); + } + return 2; + } + while (*data_size_ptr != GIF_BLOCK_TERMINAL) { + uint8_t data_size = *data_size_ptr; + if (!gif_read_data(gif_ptr, &data_ptr, *data_size_ptr) || + !gif_read_data(gif_ptr, &data_size_ptr, 1)) { + gif_ptr->skip_size = skip_size_org; + if (gif_pt_ptr) { + FX_Free(gif_pt_ptr->gce_ptr); + FX_Free(gif_pt_ptr->pte_ptr); + delete gif_pt_ptr->string_ptr; + FX_Free(gif_pt_ptr); + } + return 2; + } + *(gif_pt_ptr->string_ptr) += + CFX_ByteString((const FX_CHAR*)data_ptr, data_size); + } + gif_ptr->pt_ptr_arr_ptr->push_back(gif_pt_ptr); + } break; + case GIF_D_STATUS_EXT_GCE: { + ASSERT(sizeof(GifGCE) == 5); + GifGCE* gif_gce_ptr = nullptr; + if (!gif_read_data(gif_ptr, (uint8_t**)&gif_gce_ptr, 6)) + return 2; + + if (!gif_ptr->gce_ptr) + gif_ptr->gce_ptr = FX_Alloc(GifGCE, 1); + gif_ptr->gce_ptr->block_size = gif_gce_ptr->block_size; + gif_ptr->gce_ptr->gce_flag = gif_gce_ptr->gce_flag; + gif_ptr->gce_ptr->delay_time = + GetWord_LSBFirst((uint8_t*)&gif_gce_ptr->delay_time); + gif_ptr->gce_ptr->trans_index = gif_gce_ptr->trans_index; + } break; + default: { + if (gif_ptr->decode_status == GIF_D_STATUS_EXT_PTE) { + FX_Free(gif_ptr->gce_ptr); + gif_ptr->gce_ptr = nullptr; + } + if (!gif_read_data(gif_ptr, &data_size_ptr, 1)) + return 2; + + while (*data_size_ptr != GIF_BLOCK_TERMINAL) { + if (!gif_read_data(gif_ptr, &data_ptr, *data_size_ptr) || + !gif_read_data(gif_ptr, &data_size_ptr, 1)) { + gif_ptr->skip_size = skip_size_org; + return 2; + } + } + } + } + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_SIG); + return 1; +} +int32_t gif_decode_image_info(gif_decompress_struct_p gif_ptr) { + if (gif_ptr->width == 0 || gif_ptr->height == 0) { + gif_error(gif_ptr, "No Image Header Info"); + return 0; + } + uint32_t skip_size_org = gif_ptr->skip_size; + ASSERT(sizeof(GifImageInfo) == 9); + GifImageInfo* gif_img_info_ptr = nullptr; + if (!gif_read_data(gif_ptr, (uint8_t**)&gif_img_info_ptr, 9)) + return 2; + + GifImage* gif_image_ptr = FX_Alloc(GifImage, 1); + FXSYS_memset(gif_image_ptr, 0, sizeof(GifImage)); + gif_image_ptr->image_info_ptr = FX_Alloc(GifImageInfo, 1); + gif_image_ptr->image_info_ptr->left = + GetWord_LSBFirst((uint8_t*)&gif_img_info_ptr->left); + gif_image_ptr->image_info_ptr->top = + GetWord_LSBFirst((uint8_t*)&gif_img_info_ptr->top); + gif_image_ptr->image_info_ptr->width = + GetWord_LSBFirst((uint8_t*)&gif_img_info_ptr->width); + gif_image_ptr->image_info_ptr->height = + GetWord_LSBFirst((uint8_t*)&gif_img_info_ptr->height); + gif_image_ptr->image_info_ptr->local_flag = gif_img_info_ptr->local_flag; + if (gif_image_ptr->image_info_ptr->left + + gif_image_ptr->image_info_ptr->width > + gif_ptr->width || + gif_image_ptr->image_info_ptr->top + + gif_image_ptr->image_info_ptr->height > + gif_ptr->height) { + FX_Free(gif_image_ptr->image_info_ptr); + FX_Free(gif_image_ptr->image_row_buf); + FX_Free(gif_image_ptr); + gif_error(gif_ptr, "Image Data Out Of LSD, The File May Be Corrupt"); + return 0; + } + GifLF* gif_img_info_lf_ptr = (GifLF*)&gif_img_info_ptr->local_flag; + if (gif_img_info_lf_ptr->local_pal) { + ASSERT(sizeof(GifPalette) == 3); + int32_t loc_pal_size = (2 << gif_img_info_lf_ptr->pal_bits) * 3; + uint8_t* loc_pal_ptr = nullptr; + if (!gif_read_data(gif_ptr, &loc_pal_ptr, loc_pal_size)) { + gif_ptr->skip_size = skip_size_org; + FX_Free(gif_image_ptr->image_info_ptr); + FX_Free(gif_image_ptr->image_row_buf); + FX_Free(gif_image_ptr); + return 2; + } + gif_image_ptr->local_pal_ptr = + (GifPalette*)gif_ptr->gif_ask_buf_for_pal_fn(gif_ptr, loc_pal_size); + if (gif_image_ptr->local_pal_ptr) { + FXSYS_memcpy((uint8_t*)gif_image_ptr->local_pal_ptr, loc_pal_ptr, + loc_pal_size); + } + } + uint8_t* code_size_ptr = nullptr; + if (!gif_read_data(gif_ptr, &code_size_ptr, 1)) { + gif_ptr->skip_size = skip_size_org; + FX_Free(gif_image_ptr->image_info_ptr); + FX_Free(gif_image_ptr->local_pal_ptr); + FX_Free(gif_image_ptr->image_row_buf); + FX_Free(gif_image_ptr); + return 2; + } + gif_image_ptr->image_code_size = *code_size_ptr; + gif_ptr->gif_record_current_position_fn(gif_ptr, + &gif_image_ptr->image_data_pos); + gif_image_ptr->image_data_pos += gif_ptr->skip_size; + gif_takeover_gce_ptr(gif_ptr, &gif_image_ptr->image_gce_ptr); + gif_ptr->img_ptr_arr_ptr->push_back(gif_image_ptr); + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA); + return 1; +} +int32_t gif_load_frame(gif_decompress_struct_p gif_ptr, int32_t frame_num) { + if (!gif_ptr || frame_num < 0 || + frame_num >= pdfium::CollectionSize(*gif_ptr->img_ptr_arr_ptr)) { + return 0; + } + uint8_t* data_size_ptr = nullptr; + uint8_t* data_ptr = nullptr; + uint32_t skip_size_org = gif_ptr->skip_size; + GifImage* gif_image_ptr = (*gif_ptr->img_ptr_arr_ptr)[frame_num]; + uint32_t gif_img_row_bytes = gif_image_ptr->image_info_ptr->width; + if (gif_img_row_bytes == 0) { + gif_error(gif_ptr, "Error Invalid Number of Row Bytes"); + return 0; + } + if (gif_ptr->decode_status == GIF_D_STATUS_TAIL) { + if (gif_image_ptr->image_row_buf) { + FX_Free(gif_image_ptr->image_row_buf); + gif_image_ptr->image_row_buf = nullptr; + } + gif_image_ptr->image_row_buf = FX_Alloc(uint8_t, gif_img_row_bytes); + GifGCE* gif_img_gce_ptr = gif_image_ptr->image_gce_ptr; + int32_t loc_pal_num = + ((GifLF*)&gif_image_ptr->image_info_ptr->local_flag)->local_pal + ? (2 << ((GifLF*)&gif_image_ptr->image_info_ptr->local_flag) + ->pal_bits) + : 0; + gif_ptr->avail_in = 0; + if (!gif_img_gce_ptr) { + bool bRes = gif_ptr->gif_get_record_position_fn( + gif_ptr, gif_image_ptr->image_data_pos, + gif_image_ptr->image_info_ptr->left, + gif_image_ptr->image_info_ptr->top, + gif_image_ptr->image_info_ptr->width, + gif_image_ptr->image_info_ptr->height, loc_pal_num, + gif_image_ptr->local_pal_ptr, 0, 0, -1, 0, + (bool)((GifLF*)&gif_image_ptr->image_info_ptr->local_flag) + ->interlace); + if (!bRes) { + FX_Free(gif_image_ptr->image_row_buf); + gif_image_ptr->image_row_buf = nullptr; + gif_error(gif_ptr, "Error Read Record Position Data"); + return 0; + } + } else { + bool bRes = gif_ptr->gif_get_record_position_fn( + gif_ptr, gif_image_ptr->image_data_pos, + gif_image_ptr->image_info_ptr->left, + gif_image_ptr->image_info_ptr->top, + gif_image_ptr->image_info_ptr->width, + gif_image_ptr->image_info_ptr->height, loc_pal_num, + gif_image_ptr->local_pal_ptr, + (int32_t)gif_image_ptr->image_gce_ptr->delay_time, + (bool)((GifCEF*)&gif_image_ptr->image_gce_ptr->gce_flag)->user_input, + ((GifCEF*)&gif_image_ptr->image_gce_ptr->gce_flag)->transparency + ? (int32_t)gif_image_ptr->image_gce_ptr->trans_index + : -1, + (int32_t)((GifCEF*)&gif_image_ptr->image_gce_ptr->gce_flag) + ->disposal_method, + (bool)((GifLF*)&gif_image_ptr->image_info_ptr->local_flag) + ->interlace); + if (!bRes) { + FX_Free(gif_image_ptr->image_row_buf); + gif_image_ptr->image_row_buf = nullptr; + gif_error(gif_ptr, "Error Read Record Position Data"); + return 0; + } + } + if (gif_image_ptr->image_code_size >= 32) { + FX_Free(gif_image_ptr->image_row_buf); + gif_image_ptr->image_row_buf = nullptr; + gif_error(gif_ptr, "Error Invalid Code Size"); + return 0; + } + if (!gif_ptr->img_decoder_ptr) + gif_ptr->img_decoder_ptr = new CGifLZWDecoder(gif_ptr->err_ptr); + gif_ptr->img_decoder_ptr->InitTable(gif_image_ptr->image_code_size); + gif_ptr->img_row_offset = 0; + gif_ptr->img_row_avail_size = 0; + gif_ptr->img_pass_num = 0; + gif_image_ptr->image_row_num = 0; + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA); + } + CGifLZWDecoder* img_decoder_ptr = gif_ptr->img_decoder_ptr; + if (gif_ptr->decode_status == GIF_D_STATUS_IMG_DATA) { + if (!gif_read_data(gif_ptr, &data_size_ptr, 1)) + return 2; + + if (*data_size_ptr != GIF_BLOCK_TERMINAL) { + if (!gif_read_data(gif_ptr, &data_ptr, *data_size_ptr)) { + gif_ptr->skip_size = skip_size_org; + return 2; + } + img_decoder_ptr->Input(data_ptr, *data_size_ptr); + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA); + gif_ptr->img_row_offset += gif_ptr->img_row_avail_size; + gif_ptr->img_row_avail_size = gif_img_row_bytes - gif_ptr->img_row_offset; + int32_t ret = img_decoder_ptr->Decode( + gif_image_ptr->image_row_buf + gif_ptr->img_row_offset, + gif_ptr->img_row_avail_size); + if (ret == 0) { + gif_decoding_failure_at_tail_cleanup(gif_ptr, gif_image_ptr); + return 0; + } + while (ret != 0) { + if (ret == 1) { + gif_ptr->gif_get_row_fn(gif_ptr, gif_image_ptr->image_row_num, + gif_image_ptr->image_row_buf); + FX_Free(gif_image_ptr->image_row_buf); + gif_image_ptr->image_row_buf = nullptr; + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL); + return 1; + } + if (ret == 2) { + ASSERT(img_decoder_ptr->GetAvailInput() == 0); + skip_size_org = gif_ptr->skip_size; + if (!gif_read_data(gif_ptr, &data_size_ptr, 1)) + return 2; + + if (*data_size_ptr != GIF_BLOCK_TERMINAL) { + if (!gif_read_data(gif_ptr, &data_ptr, *data_size_ptr)) { + gif_ptr->skip_size = skip_size_org; + return 2; + } + img_decoder_ptr->Input(data_ptr, *data_size_ptr); + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_IMG_DATA); + gif_ptr->img_row_offset += gif_ptr->img_row_avail_size; + gif_ptr->img_row_avail_size = + gif_img_row_bytes - gif_ptr->img_row_offset; + ret = img_decoder_ptr->Decode( + gif_image_ptr->image_row_buf + gif_ptr->img_row_offset, + gif_ptr->img_row_avail_size); + } + } + if (ret == 3) { + if (((GifLF*)&gif_image_ptr->image_info_ptr->local_flag)->interlace) { + gif_ptr->gif_get_row_fn(gif_ptr, gif_image_ptr->image_row_num, + gif_image_ptr->image_row_buf); + gif_image_ptr->image_row_num += + s_gif_interlace_step[gif_ptr->img_pass_num]; + if (gif_image_ptr->image_row_num >= + (int32_t)gif_image_ptr->image_info_ptr->height) { + gif_ptr->img_pass_num++; + if (gif_ptr->img_pass_num == FX_ArraySize(s_gif_interlace_step)) { + gif_decoding_failure_at_tail_cleanup(gif_ptr, gif_image_ptr); + return 0; + } + gif_image_ptr->image_row_num = + s_gif_interlace_step[gif_ptr->img_pass_num] / 2; + } + } else { + gif_ptr->gif_get_row_fn(gif_ptr, gif_image_ptr->image_row_num++, + gif_image_ptr->image_row_buf); + } + gif_ptr->img_row_offset = 0; + gif_ptr->img_row_avail_size = gif_img_row_bytes; + ret = img_decoder_ptr->Decode( + gif_image_ptr->image_row_buf + gif_ptr->img_row_offset, + gif_ptr->img_row_avail_size); + } + if (ret == 0) { + gif_decoding_failure_at_tail_cleanup(gif_ptr, gif_image_ptr); + return 0; + } + } + } + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL); + } + gif_error(gif_ptr, "Decode Image Data Error"); + return 0; +} +void gif_decoding_failure_at_tail_cleanup(gif_decompress_struct_p gif_ptr, + GifImage* gif_image_ptr) { + FX_Free(gif_image_ptr->image_row_buf); + gif_image_ptr->image_row_buf = nullptr; + gif_save_decoding_status(gif_ptr, GIF_D_STATUS_TAIL); + gif_error(gif_ptr, "Decode Image Data Error"); +} +void gif_save_decoding_status(gif_decompress_struct_p gif_ptr, int32_t status) { + gif_ptr->decode_status = status; + gif_ptr->next_in += gif_ptr->skip_size; + gif_ptr->avail_in -= gif_ptr->skip_size; + gif_ptr->skip_size = 0; +} +uint8_t* gif_read_data(gif_decompress_struct_p gif_ptr, + uint8_t** des_buf_pp, + uint32_t data_size) { + if (!gif_ptr || gif_ptr->avail_in < gif_ptr->skip_size + data_size) + return nullptr; + + *des_buf_pp = gif_ptr->next_in + gif_ptr->skip_size; + gif_ptr->skip_size += data_size; + return *des_buf_pp; +} +void gif_input_buffer(gif_decompress_struct_p gif_ptr, + uint8_t* src_buf, + uint32_t src_size) { + gif_ptr->next_in = src_buf; + gif_ptr->avail_in = src_size; + gif_ptr->skip_size = 0; +} +uint32_t gif_get_avail_input(gif_decompress_struct_p gif_ptr, + uint8_t** avail_buf_ptr) { + if (avail_buf_ptr) { + *avail_buf_ptr = nullptr; + if (gif_ptr->avail_in > 0) { + *avail_buf_ptr = gif_ptr->next_in; + } + } + return gif_ptr->avail_in; +} +int32_t gif_get_frame_num(gif_decompress_struct_p gif_ptr) { + return pdfium::CollectionSize(*gif_ptr->img_ptr_arr_ptr); +} +static bool gif_write_header(gif_compress_struct_p gif_ptr, + uint8_t*& dst_buf, + uint32_t& dst_len) { + if (gif_ptr->cur_offset) { + return true; + } + dst_len = sizeof(GifHeader) + sizeof(GifLSD) + sizeof(GifGF); + dst_buf = FX_TryAlloc(uint8_t, dst_len); + if (!dst_buf) + return false; + + FXSYS_memset(dst_buf, 0, dst_len); + FXSYS_memcpy(dst_buf, gif_ptr->header_ptr, sizeof(GifHeader)); + gif_ptr->cur_offset += sizeof(GifHeader); + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, gif_ptr->lsd_ptr->width); + gif_ptr->cur_offset += 2; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, gif_ptr->lsd_ptr->height); + gif_ptr->cur_offset += 2; + dst_buf[gif_ptr->cur_offset++] = gif_ptr->lsd_ptr->global_flag; + dst_buf[gif_ptr->cur_offset++] = gif_ptr->lsd_ptr->bc_index; + dst_buf[gif_ptr->cur_offset++] = gif_ptr->lsd_ptr->pixel_aspect; + if (gif_ptr->global_pal) { + uint16_t size = sizeof(GifPalette) * gif_ptr->gpal_num; + if (!gif_grow_buf(dst_buf, dst_len, gif_ptr->cur_offset + size)) { + return false; + } + FXSYS_memcpy(&dst_buf[gif_ptr->cur_offset], gif_ptr->global_pal, size); + gif_ptr->cur_offset += size; + } + return true; +} +void interlace_buf(const uint8_t* buf, uint32_t pitch, uint32_t height) { + std::vector pass[4]; + uint32_t row = 0; + uint8_t* temp; + while (row < height) { + size_t j; + if (row % 8 == 0) { + j = 0; + } else if (row % 4 == 0) { + j = 1; + } else if (row % 2 == 0) { + j = 2; + } else { + j = 3; + } + temp = FX_Alloc(uint8_t, pitch); + FXSYS_memcpy(temp, &buf[pitch * row], pitch); + pass[j].push_back(temp); + row++; + } + for (size_t i = 0, row = 0; i < 4; i++) { + for (size_t j = 0; j < pass[i].size(); j++, row++) { + FXSYS_memcpy((uint8_t*)&buf[pitch * row], pass[i][j], pitch); + FX_Free(pass[i][j]); + } + } +} +static void gif_write_block_data(const uint8_t* src_buf, + uint32_t src_len, + uint8_t*& dst_buf, + uint32_t& dst_len, + uint32_t& dst_offset) { + uint32_t src_offset = 0; + while (src_len > GIF_DATA_BLOCK) { + dst_buf[dst_offset++] = GIF_DATA_BLOCK; + FXSYS_memcpy(&dst_buf[dst_offset], &src_buf[src_offset], GIF_DATA_BLOCK); + dst_offset += GIF_DATA_BLOCK; + src_offset += GIF_DATA_BLOCK; + src_len -= GIF_DATA_BLOCK; + } + dst_buf[dst_offset++] = (uint8_t)src_len; + FXSYS_memcpy(&dst_buf[dst_offset], &src_buf[src_offset], src_len); + dst_offset += src_len; +} +static bool gif_write_data(gif_compress_struct_p gif_ptr, + uint8_t*& dst_buf, + uint32_t& dst_len) { + if (!gif_grow_buf(dst_buf, dst_len, gif_ptr->cur_offset + GIF_DATA_BLOCK)) { + return false; + } + if (FXSYS_memcmp(gif_ptr->header_ptr->version, "89a", 3) == 0) { + dst_buf[gif_ptr->cur_offset++] = GIF_SIG_EXTENSION; + dst_buf[gif_ptr->cur_offset++] = GIF_BLOCK_GCE; + gif_ptr->gce_ptr->block_size = 4; + dst_buf[gif_ptr->cur_offset++] = gif_ptr->gce_ptr->block_size; + gif_ptr->gce_ptr->gce_flag = 0; + dst_buf[gif_ptr->cur_offset++] = gif_ptr->gce_ptr->gce_flag; + gif_ptr->gce_ptr->delay_time = 10; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, + gif_ptr->gce_ptr->delay_time); + gif_ptr->cur_offset += 2; + gif_ptr->gce_ptr->trans_index = 0; + dst_buf[gif_ptr->cur_offset++] = gif_ptr->gce_ptr->trans_index; + dst_buf[gif_ptr->cur_offset++] = 0; + } + dst_buf[gif_ptr->cur_offset++] = GIF_SIG_IMAGE; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, + gif_ptr->image_info_ptr->left); + gif_ptr->cur_offset += 2; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, gif_ptr->image_info_ptr->top); + gif_ptr->cur_offset += 2; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, + gif_ptr->image_info_ptr->width); + gif_ptr->cur_offset += 2; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, + gif_ptr->image_info_ptr->height); + gif_ptr->cur_offset += 2; + GifLF& lf = (GifLF&)gif_ptr->image_info_ptr->local_flag; + dst_buf[gif_ptr->cur_offset++] = gif_ptr->image_info_ptr->local_flag; + if (gif_ptr->local_pal) { + uint32_t pal_size = sizeof(GifPalette) * gif_ptr->lpal_num; + if (!gif_grow_buf(dst_buf, dst_len, pal_size + gif_ptr->cur_offset)) { + return false; + } + FXSYS_memcpy(&dst_buf[gif_ptr->cur_offset], gif_ptr->local_pal, pal_size); + gif_ptr->cur_offset += pal_size; + } + if (lf.interlace) { + interlace_buf(gif_ptr->src_buf, gif_ptr->src_pitch, + gif_ptr->image_info_ptr->height); + } + uint8_t code_bit = lf.pal_bits; + if (lf.local_pal == 0) { + GifGF& gf = (GifGF&)gif_ptr->lsd_ptr->global_flag; + code_bit = gf.pal_bits; + } + if (code_bit >= 31) + return false; + gif_ptr->img_encoder_ptr->Start(code_bit, gif_ptr->src_buf, dst_buf, + gif_ptr->cur_offset); + uint32_t i; + for (i = 0; i < gif_ptr->src_row; i++) { + if (!gif_ptr->img_encoder_ptr->Encode( + &gif_ptr->src_buf[i * gif_ptr->src_pitch], + gif_ptr->src_width * (code_bit + 1), dst_buf, dst_len, + gif_ptr->cur_offset)) { + return false; + } + } + gif_ptr->img_encoder_ptr->Finish(dst_buf, dst_len, gif_ptr->cur_offset); + dst_buf[gif_ptr->cur_offset++] = 0; + if (FXSYS_memcmp(gif_ptr->header_ptr->version, "89a", 3) == 0 && + gif_ptr->cmt_data_ptr) { + dst_buf[gif_ptr->cur_offset++] = GIF_SIG_EXTENSION; + dst_buf[gif_ptr->cur_offset++] = GIF_BLOCK_CE; + gif_write_block_data(gif_ptr->cmt_data_ptr, gif_ptr->cmt_data_len, dst_buf, + dst_len, gif_ptr->cur_offset); + dst_buf[gif_ptr->cur_offset++] = 0; + } + if (FXSYS_memcmp(gif_ptr->header_ptr->version, "89a", 3) == 0 && + gif_ptr->pte_data_ptr) { + dst_buf[gif_ptr->cur_offset++] = GIF_SIG_EXTENSION; + dst_buf[gif_ptr->cur_offset++] = GIF_BLOCK_PTE; + dst_buf[gif_ptr->cur_offset++] = gif_ptr->pte_ptr->block_size; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, + gif_ptr->pte_ptr->grid_left); + gif_ptr->cur_offset += 2; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, gif_ptr->pte_ptr->grid_top); + gif_ptr->cur_offset += 2; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, + gif_ptr->pte_ptr->grid_width); + gif_ptr->cur_offset += 2; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, + gif_ptr->pte_ptr->grid_height); + gif_ptr->cur_offset += 2; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, + gif_ptr->pte_ptr->char_width); + gif_ptr->cur_offset += 2; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, + gif_ptr->pte_ptr->char_height); + gif_ptr->cur_offset += 2; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, gif_ptr->pte_ptr->fc_index); + gif_ptr->cur_offset += 2; + SetWord_LSBFirst(dst_buf + gif_ptr->cur_offset, gif_ptr->pte_ptr->bc_index); + gif_ptr->cur_offset += 2; + gif_write_block_data(gif_ptr->pte_data_ptr, gif_ptr->pte_data_len, dst_buf, + dst_len, gif_ptr->cur_offset); + gif_ptr->cur_offset += gif_ptr->pte_data_len; + dst_buf[gif_ptr->cur_offset++] = 0; + } + dst_buf[gif_ptr->cur_offset++] = GIF_SIG_TRAILER; + return true; +} +bool gif_encode(gif_compress_struct_p gif_ptr, + uint8_t*& dst_buf, + uint32_t& dst_len) { + if (!gif_write_header(gif_ptr, dst_buf, dst_len)) { + return false; + } + uint32_t cur_offset = gif_ptr->cur_offset; + bool res = true; + if (gif_ptr->frames) { + gif_ptr->cur_offset--; + } + if (!gif_write_data(gif_ptr, dst_buf, dst_len)) { + gif_ptr->cur_offset = cur_offset; + res = false; + } + dst_len = gif_ptr->cur_offset; + dst_buf[dst_len - 1] = GIF_SIG_TRAILER; + if (res) { + gif_ptr->frames++; + } + return res; +} diff --git a/modules/pdfium/pdfium/core/fxcodec/lgif/fx_gif.h b/modules/pdfium/pdfium/core/fxcodec/lgif/fx_gif.h new file mode 100644 index 000000000000..a8b780b09995 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcodec/lgif/fx_gif.h @@ -0,0 +1,313 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCODEC_LGIF_FX_GIF_H_ +#define CORE_FXCODEC_LGIF_FX_GIF_H_ + +#include +#include + +#include "core/fxcrt/fx_basic.h" + +#define GIF_SIGNATURE "GIF" +#define GIF_SIG_EXTENSION 0x21 +#define GIF_SIG_IMAGE 0x2C +#define GIF_SIG_TRAILER 0x3B +#define GIF_BLOCK_GCE 0xF9 +#define GIF_BLOCK_PTE 0x01 +#define GIF_BLOCK_CE 0xFE +#define GIF_BLOCK_AE 0xFF +#define GIF_BLOCK_TERMINAL 0x00 +#define GIF_MAX_LZW_CODE 4096 +#define GIF_DATA_BLOCK 255 +#define GIF_MAX_ERROR_SIZE 256 +#define GIF_D_STATUS_SIG 0x01 +#define GIF_D_STATUS_TAIL 0x02 +#define GIF_D_STATUS_EXT 0x03 +#define GIF_D_STATUS_EXT_AE 0x04 +#define GIF_D_STATUS_EXT_CE 0x05 +#define GIF_D_STATUS_EXT_GCE 0x06 +#define GIF_D_STATUS_EXT_PTE 0x07 +#define GIF_D_STATUS_EXT_UNE 0x08 +#define GIF_D_STATUS_IMG_INFO 0x09 +#define GIF_D_STATUS_IMG_DATA 0x0A +#pragma pack(1) +typedef struct tagGifGF { + uint8_t pal_bits : 3; + uint8_t sort_flag : 1; + uint8_t color_resolution : 3; + uint8_t global_pal : 1; +} GifGF; +typedef struct tagGifLF { + uint8_t pal_bits : 3; + uint8_t reserved : 2; + uint8_t sort_flag : 1; + uint8_t interlace : 1; + uint8_t local_pal : 1; +} GifLF; +typedef struct tagGifHeader { + char signature[3]; + char version[3]; +} GifHeader; +typedef struct tagGifLSD { + uint16_t width; + uint16_t height; + uint8_t global_flag; + uint8_t bc_index; + uint8_t pixel_aspect; +} GifLSD; +typedef struct tagGifImageInfo { + uint16_t left; + uint16_t top; + uint16_t width; + uint16_t height; + + uint8_t local_flag; +} GifImageInfo; +typedef struct tagGifCEF { + uint8_t transparency : 1; + uint8_t user_input : 1; + uint8_t disposal_method : 3; + uint8_t reserved : 3; +} GifCEF; +typedef struct tagGifGCE { + uint8_t block_size; + uint8_t gce_flag; + uint16_t delay_time; + uint8_t trans_index; +} GifGCE; +typedef struct tagGifPTE { + uint8_t block_size; + uint16_t grid_left; + uint16_t grid_top; + uint16_t grid_width; + uint16_t grid_height; + + uint8_t char_width; + uint8_t char_height; + + uint8_t fc_index; + uint8_t bc_index; +} GifPTE; +typedef struct tagGifAE { + uint8_t block_size; + uint8_t app_identify[8]; + uint8_t app_authentication[3]; +} GifAE; +typedef struct tagGifPalette { uint8_t r, g, b; } GifPalette; +#pragma pack() +typedef struct tagGifImage { + GifGCE* image_gce_ptr; + GifPalette* local_pal_ptr; + GifImageInfo* image_info_ptr; + uint8_t image_code_size; + uint32_t image_data_pos; + uint8_t* image_row_buf; + int32_t image_row_num; +} GifImage; + +typedef struct tagGifPlainText { + GifGCE* gce_ptr; + GifPTE* pte_ptr; + CFX_ByteString* string_ptr; +} GifPlainText; + +class CGifLZWDecoder { + public: + struct tag_Table { + uint16_t prefix; + uint8_t suffix; + }; + + explicit CGifLZWDecoder(FX_CHAR* error_ptr); + ~CGifLZWDecoder(); + + void InitTable(uint8_t code_len); + int32_t Decode(uint8_t* des_buf, uint32_t& des_size); + void Input(uint8_t* src_buf, uint32_t src_size); + uint32_t GetAvailInput(); + + private: + void ClearTable(); + void AddCode(uint16_t prefix_code, uint8_t append_char); + void DecodeString(uint16_t code); + + uint8_t code_size; + uint8_t code_size_cur; + uint16_t code_clear; + uint16_t code_end; + uint16_t code_next; + uint8_t code_first; + uint8_t stack[GIF_MAX_LZW_CODE]; + uint16_t stack_size; + tag_Table code_table[GIF_MAX_LZW_CODE]; + uint16_t code_old; + + uint8_t* next_in; + uint32_t avail_in; + + uint8_t bits_left; + uint32_t code_store; + + FX_CHAR* err_msg_ptr; +}; + +class CGifLZWEncoder { + public: + struct tag_Table { + uint16_t prefix; + uint8_t suffix; + }; + + CGifLZWEncoder(); + ~CGifLZWEncoder(); + + void Start(uint8_t code_len, + const uint8_t* src_buf, + uint8_t*& dst_buf, + uint32_t& offset); + bool Encode(const uint8_t* src_buf, + uint32_t src_len, + uint8_t*& dst_buf, + uint32_t& dst_len, + uint32_t& offset); + void Finish(uint8_t*& dst_buf, uint32_t& dst_len, uint32_t& offset); + + private: + void ClearTable(); + bool LookUpInTable(const uint8_t* buf, uint32_t& offset, uint8_t& bit_offset); + void EncodeString(uint32_t index, + uint8_t*& dst_buf, + uint32_t& dst_len, + uint32_t& offset); + void WriteBlock(uint8_t*& dst_buf, uint32_t& dst_len, uint32_t& offset); + + jmp_buf jmp; + uint32_t src_offset; + uint8_t src_bit_offset; + uint8_t src_bit_cut; + uint32_t src_bit_num; + uint8_t code_size; + uint16_t code_clear; + uint16_t code_end; + uint16_t index_num; + uint8_t bit_offset; + uint8_t index_bit_cur; + uint8_t index_buf[GIF_DATA_BLOCK]; + uint8_t index_buf_len; + tag_Table code_table[GIF_MAX_LZW_CODE]; + uint16_t table_cur; +}; + +typedef struct tag_gif_decompress_struct gif_decompress_struct; +typedef gif_decompress_struct* gif_decompress_struct_p; +typedef gif_decompress_struct_p* gif_decompress_struct_pp; +static const int32_t s_gif_interlace_step[4] = {8, 8, 4, 2}; +struct tag_gif_decompress_struct { + jmp_buf jmpbuf; + FX_CHAR* err_ptr; + void (*gif_error_fn)(gif_decompress_struct_p gif_ptr, const FX_CHAR* err_msg); + void* context_ptr; + int width; + int height; + GifPalette* global_pal_ptr; + int32_t global_pal_num; + uint8_t global_sort_flag; + uint8_t global_color_resolution; + + uint8_t bc_index; + uint8_t pixel_aspect; + CGifLZWDecoder* img_decoder_ptr; + uint32_t img_row_offset; + uint32_t img_row_avail_size; + uint8_t img_pass_num; + std::vector* img_ptr_arr_ptr; + uint8_t* (*gif_ask_buf_for_pal_fn)(gif_decompress_struct_p gif_ptr, + int32_t pal_size); + uint8_t* next_in; + uint32_t avail_in; + int32_t decode_status; + uint32_t skip_size; + void (*gif_record_current_position_fn)(gif_decompress_struct_p gif_ptr, + uint32_t* cur_pos_ptr); + void (*gif_get_row_fn)(gif_decompress_struct_p gif_ptr, + int32_t row_num, + uint8_t* row_buf); + bool (*gif_get_record_position_fn)(gif_decompress_struct_p gif_ptr, + uint32_t cur_pos, + int32_t left, + int32_t top, + int32_t width, + int32_t height, + int32_t pal_num, + void* pal_ptr, + int32_t delay_time, + bool user_input, + int32_t trans_index, + int32_t disposal_method, + bool interlace); + CFX_ByteString* cmt_data_ptr; + GifGCE* gce_ptr; + std::vector* pt_ptr_arr_ptr; +}; +typedef struct tag_gif_compress_struct gif_compress_struct; +typedef gif_compress_struct* gif_compress_struct_p; +typedef gif_compress_struct_p* gif_compress_struct_pp; +struct tag_gif_compress_struct { + const uint8_t* src_buf; + uint32_t src_pitch; + uint32_t src_width; + uint32_t src_row; + uint32_t cur_offset; + uint32_t frames; + GifHeader* header_ptr; + GifLSD* lsd_ptr; + GifPalette* global_pal; + uint16_t gpal_num; + GifPalette* local_pal; + uint16_t lpal_num; + GifImageInfo* image_info_ptr; + CGifLZWEncoder* img_encoder_ptr; + + uint8_t* cmt_data_ptr; + uint32_t cmt_data_len; + GifGCE* gce_ptr; + GifPTE* pte_ptr; + const uint8_t* pte_data_ptr; + uint32_t pte_data_len; +}; + +void gif_error(gif_decompress_struct_p gif_ptr, const FX_CHAR* err_msg); +void gif_warn(gif_decompress_struct_p gif_ptr, const FX_CHAR* err_msg); +gif_decompress_struct_p gif_create_decompress(); +void gif_destroy_decompress(gif_decompress_struct_pp gif_ptr_ptr); +gif_compress_struct_p gif_create_compress(); +void gif_destroy_compress(gif_compress_struct_pp gif_ptr_ptr); +int32_t gif_read_header(gif_decompress_struct_p gif_ptr); +int32_t gif_get_frame(gif_decompress_struct_p gif_ptr); +int32_t gif_get_frame_num(gif_decompress_struct_p gif_ptr); +int32_t gif_decode_extension(gif_decompress_struct_p gif_ptr); +int32_t gif_decode_image_info(gif_decompress_struct_p gif_ptr); +void gif_takeover_gce_ptr(gif_decompress_struct_p gif_ptr, + GifGCE** gce_ptr_ptr); +int32_t gif_load_frame(gif_decompress_struct_p gif_ptr, int32_t frame_num); +uint8_t* gif_read_data(gif_decompress_struct_p gif_ptr, + uint8_t** des_buf_pp, + uint32_t data_size); +void gif_decoding_failure_at_tail_cleanup(gif_decompress_struct_p gif_ptr, + GifImage* gif_image_ptr); +void gif_save_decoding_status(gif_decompress_struct_p gif_ptr, int32_t status); +void gif_input_buffer(gif_decompress_struct_p gif_ptr, + uint8_t* src_buf, + uint32_t src_size); +uint32_t gif_get_avail_input(gif_decompress_struct_p gif_ptr, + uint8_t** avail_buf_ptr); +void interlace_buf(const uint8_t* buf, uint32_t width, uint32_t height); +bool gif_encode(gif_compress_struct_p gif_ptr, + uint8_t*& dst_buf, + uint32_t& dst_len); + +#endif // CORE_FXCODEC_LGIF_FX_GIF_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_maybe_owned.h b/modules/pdfium/pdfium/core/fxcrt/cfx_maybe_owned.h new file mode 100644 index 000000000000..92b1c1c24254 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_maybe_owned.h @@ -0,0 +1,88 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CORE_FXCRT_CFX_MAYBE_OWNED_H_ +#define CORE_FXCRT_CFX_MAYBE_OWNED_H_ + +#include +#include +#include + +#include "core/fxcrt/fx_memory.h" +#include "core/fxcrt/fx_system.h" + +// A template that can hold either owned or unowned references, and cleans up +// appropriately. Possibly the most pernicious anti-pattern imaginable, but +// it crops up throughout the codebase due to a desire to avoid copying-in +// objects or data. +template > +class CFX_MaybeOwned { + public: + CFX_MaybeOwned() : m_pObj(nullptr) {} + explicit CFX_MaybeOwned(T* ptr) : m_pObj(ptr) {} + explicit CFX_MaybeOwned(std::unique_ptr ptr) + : m_pOwnedObj(std::move(ptr)), m_pObj(m_pOwnedObj.get()) {} + + CFX_MaybeOwned(const CFX_MaybeOwned& that) = delete; + CFX_MaybeOwned(CFX_MaybeOwned&& that) + : m_pOwnedObj(that.m_pOwnedObj.release()), m_pObj(that.m_pObj) { + that.m_pObj = nullptr; + } + + void Reset(std::unique_ptr ptr) { + m_pOwnedObj = std::move(ptr); + m_pObj = m_pOwnedObj.get(); + } + void Reset(T* ptr = nullptr) { + m_pOwnedObj.reset(); + m_pObj = ptr; + } + + bool IsOwned() const { return !!m_pOwnedObj; } + T* Get() const { return m_pObj; } + std::unique_ptr Release() { + ASSERT(IsOwned()); + return std::move(m_pOwnedObj); + } + + CFX_MaybeOwned& operator=(const CFX_MaybeOwned& that) = delete; + CFX_MaybeOwned& operator=(CFX_MaybeOwned&& that) { + m_pOwnedObj = std::move(that.m_pOwnedObj); + m_pObj = that.m_pObj; + that.m_pObj = nullptr; + return *this; + } + CFX_MaybeOwned& operator=(T* ptr) { + Reset(ptr); + return *this; + } + CFX_MaybeOwned& operator=(std::unique_ptr ptr) { + Reset(std::move(ptr)); + return *this; + } + + bool operator==(const CFX_MaybeOwned& that) const { + return Get() == that.Get(); + } + bool operator==(const std::unique_ptr& ptr) const { + return Get() == ptr.get(); + } + bool operator==(T* ptr) const { return Get() == ptr; } + + bool operator!=(const CFX_MaybeOwned& that) const { return !(*this == that); } + bool operator!=(const std::unique_ptr ptr) const { + return !(*this == ptr); + } + bool operator!=(T* ptr) const { return !(*this == ptr); } + + explicit operator bool() const { return !!m_pObj; } + T& operator*() const { return *m_pObj; } + T* operator->() const { return m_pObj; } + + private: + std::unique_ptr m_pOwnedObj; + T* m_pObj; +}; + +#endif // CORE_FXCRT_CFX_MAYBE_OWNED_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_maybe_owned_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/cfx_maybe_owned_unittest.cpp new file mode 100644 index 000000000000..8f513a358d4b --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_maybe_owned_unittest.cpp @@ -0,0 +1,179 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/cfx_maybe_owned.h" + +#include +#include + +#include "core/fxcrt/fx_memory.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/base/ptr_util.h" + +namespace { + +class PseudoDeletable { + public: + explicit PseudoDeletable(int id, int* count_location) + : id_(id), count_location_(count_location) {} + ~PseudoDeletable() { ++(*count_location_); } + int GetID() const { return id_; } + + private: + int id_; + int* count_location_; +}; + +} // namespace + +TEST(fxcrt, MaybeOwnedNull) { + CFX_MaybeOwned ptr1; + EXPECT_FALSE(ptr1.IsOwned()); + EXPECT_FALSE(ptr1); + EXPECT_EQ(nullptr, ptr1.Get()); + + CFX_MaybeOwned ptr2; + EXPECT_TRUE(ptr1 == ptr2); + EXPECT_FALSE(ptr1 != ptr2); +} + +TEST(fxcrt, MaybeOwnedNotOwned) { + int delete_count = 0; + PseudoDeletable thing1(100, &delete_count); + { + CFX_MaybeOwned ptr(&thing1); + EXPECT_FALSE(ptr.IsOwned()); + EXPECT_EQ(ptr.Get(), &thing1); + EXPECT_EQ(100, ptr->GetID()); + EXPECT_TRUE(ptr == &thing1); + EXPECT_FALSE(ptr != &thing1); + + CFX_MaybeOwned empty; + EXPECT_FALSE(ptr == empty); + EXPECT_TRUE(ptr != empty); + } + EXPECT_EQ(0, delete_count); + + delete_count = 0; + PseudoDeletable thing2(200, &delete_count); + { + CFX_MaybeOwned ptr(&thing1); + ptr = &thing2; + EXPECT_FALSE(ptr.IsOwned()); + EXPECT_EQ(ptr.Get(), &thing2); + EXPECT_EQ(200, ptr->GetID()); + } + EXPECT_EQ(0, delete_count); + + delete_count = 0; + int owned_delete_count = 0; + { + CFX_MaybeOwned ptr(&thing1); + EXPECT_EQ(100, ptr->GetID()); + ptr = pdfium::MakeUnique(300, &owned_delete_count); + EXPECT_TRUE(ptr.IsOwned()); + EXPECT_EQ(300, ptr->GetID()); + } + EXPECT_EQ(0, delete_count); + EXPECT_EQ(1, owned_delete_count); +} + +TEST(fxcrt, MaybeOwnedOwned) { + int delete_count = 0; + { + CFX_MaybeOwned ptr( + pdfium::MakeUnique(100, &delete_count)); + EXPECT_TRUE(ptr.IsOwned()); + EXPECT_EQ(100, ptr->GetID()); + + CFX_MaybeOwned empty; + EXPECT_FALSE(ptr == empty); + EXPECT_TRUE(ptr != empty); + } + EXPECT_EQ(1, delete_count); + + delete_count = 0; + { + CFX_MaybeOwned ptr( + pdfium::MakeUnique(200, &delete_count)); + ptr = pdfium::MakeUnique(300, &delete_count); + EXPECT_TRUE(ptr.IsOwned()); + EXPECT_EQ(300, ptr->GetID()); + EXPECT_EQ(1, delete_count); + } + EXPECT_EQ(2, delete_count); + + delete_count = 0; + int unowned_delete_count = 0; + PseudoDeletable thing2(400, &unowned_delete_count); + { + CFX_MaybeOwned ptr( + pdfium::MakeUnique(500, &delete_count)); + ptr = &thing2; + EXPECT_FALSE(ptr.IsOwned()); + EXPECT_EQ(400, ptr->GetID()); + EXPECT_EQ(1, delete_count); + EXPECT_EQ(0, unowned_delete_count); + } + EXPECT_EQ(1, delete_count); + EXPECT_EQ(0, unowned_delete_count); +} + +TEST(fxcrt, MaybeOwnedRelease) { + int delete_count = 0; + { + std::unique_ptr stolen; + { + CFX_MaybeOwned ptr( + pdfium::MakeUnique(100, &delete_count)); + EXPECT_TRUE(ptr.IsOwned()); + stolen = ptr.Release(); + EXPECT_FALSE(ptr.IsOwned()); + EXPECT_EQ(ptr, stolen); + EXPECT_EQ(0, delete_count); + } + EXPECT_EQ(0, delete_count); + } + EXPECT_EQ(1, delete_count); +} + +TEST(fxcrt, MaybeOwnedMove) { + int delete_count = 0; + PseudoDeletable thing1(100, &delete_count); + { + CFX_MaybeOwned ptr1(&thing1); + CFX_MaybeOwned ptr2( + pdfium::MakeUnique(200, &delete_count)); + EXPECT_FALSE(ptr1.IsOwned()); + EXPECT_TRUE(ptr2.IsOwned()); + + CFX_MaybeOwned ptr3(std::move(ptr1)); + CFX_MaybeOwned ptr4(std::move(ptr2)); + EXPECT_FALSE(ptr1.IsOwned()); + EXPECT_FALSE(ptr2.IsOwned()); + EXPECT_FALSE(ptr3.IsOwned()); + EXPECT_TRUE(ptr4.IsOwned()); + EXPECT_EQ(0, delete_count); + EXPECT_EQ(nullptr, ptr1.Get()); + EXPECT_EQ(nullptr, ptr2.Get()); + EXPECT_EQ(100, ptr3->GetID()); + EXPECT_EQ(200, ptr4->GetID()); + + CFX_MaybeOwned ptr5; + CFX_MaybeOwned ptr6; + ptr5 = std::move(ptr3); + ptr6 = std::move(ptr4); + EXPECT_FALSE(ptr3.IsOwned()); + EXPECT_FALSE(ptr4.IsOwned()); + EXPECT_FALSE(ptr5.IsOwned()); + EXPECT_TRUE(ptr6.IsOwned()); + EXPECT_EQ(0, delete_count); + EXPECT_EQ(nullptr, ptr3.Get()); + EXPECT_EQ(nullptr, ptr4.Get()); + EXPECT_EQ(100, ptr5->GetID()); + EXPECT_EQ(200, ptr6->GetID()); + } + EXPECT_EQ(1, delete_count); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_observable.h b/modules/pdfium/pdfium/core/fxcrt/cfx_observable.h new file mode 100644 index 000000000000..8dc0907cae6f --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_observable.h @@ -0,0 +1,81 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CORE_FXCRT_CFX_OBSERVABLE_H_ +#define CORE_FXCRT_CFX_OBSERVABLE_H_ + +#include + +#include "core/fxcrt/fx_system.h" +#include "third_party/base/stl_util.h" + +template +class CFX_Observable { + public: + class ObservedPtr { + public: + ObservedPtr() : m_pObservable(nullptr) {} + explicit ObservedPtr(T* pObservable) : m_pObservable(pObservable) { + if (m_pObservable) + m_pObservable->AddObservedPtr(this); + } + ObservedPtr(const ObservedPtr& that) : ObservedPtr(that.Get()) {} + ~ObservedPtr() { + if (m_pObservable) + m_pObservable->RemoveObservedPtr(this); + } + void Reset(T* pObservable = nullptr) { + if (m_pObservable) + m_pObservable->RemoveObservedPtr(this); + m_pObservable = pObservable; + if (m_pObservable) + m_pObservable->AddObservedPtr(this); + } + void OnDestroy() { + ASSERT(m_pObservable); + m_pObservable = nullptr; + } + ObservedPtr& operator=(const ObservedPtr& that) { + Reset(that.Get()); + return *this; + } + bool operator==(const ObservedPtr& that) const { + return m_pObservable == that.m_pObservable; + } + bool operator!=(const ObservedPtr& that) const { return !(*this == that); } + explicit operator bool() const { return !!m_pObservable; } + T* Get() const { return m_pObservable; } + T& operator*() const { return *m_pObservable; } + T* operator->() const { return m_pObservable; } + + private: + T* m_pObservable; + }; + + CFX_Observable() {} + CFX_Observable(const CFX_Observable& that) = delete; + ~CFX_Observable() { NotifyObservedPtrs(); } + void AddObservedPtr(ObservedPtr* pObservedPtr) { + ASSERT(!pdfium::ContainsKey(m_ObservedPtrs, pObservedPtr)); + m_ObservedPtrs.insert(pObservedPtr); + } + void RemoveObservedPtr(ObservedPtr* pObservedPtr) { + ASSERT(pdfium::ContainsKey(m_ObservedPtrs, pObservedPtr)); + m_ObservedPtrs.erase(pObservedPtr); + } + void NotifyObservedPtrs() { + for (auto* pObservedPtr : m_ObservedPtrs) + pObservedPtr->OnDestroy(); + m_ObservedPtrs.clear(); + } + CFX_Observable& operator=(const CFX_Observable& that) = delete; + + protected: + size_t ActiveObservedPtrsForTesting() const { return m_ObservedPtrs.size(); } + + private: + std::set m_ObservedPtrs; +}; + +#endif // CORE_FXCRT_CFX_OBSERVABLE_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_observable_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/cfx_observable_unittest.cpp new file mode 100644 index 000000000000..3c0fabb13e92 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_observable_unittest.cpp @@ -0,0 +1,186 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/cfx_observable.h" + +#include +#include + +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class PseudoObservable : public CFX_Observable { + public: + PseudoObservable() {} + int SomeMethod() { return 42; } + size_t ActiveObservedPtrs() const { return ActiveObservedPtrsForTesting(); } +}; + +} // namespace + +TEST(fxcrt, ObservePtrNull) { + PseudoObservable::ObservedPtr ptr; + EXPECT_EQ(nullptr, ptr.Get()); +} + +TEST(fxcrt, ObservePtrLivesLonger) { + PseudoObservable* pObs = new PseudoObservable; + PseudoObservable::ObservedPtr ptr(pObs); + EXPECT_NE(nullptr, ptr.Get()); + EXPECT_EQ(1u, pObs->ActiveObservedPtrs()); + delete pObs; + EXPECT_EQ(nullptr, ptr.Get()); +} + +TEST(fxcrt, ObservePtrLivesShorter) { + PseudoObservable obs; + { + PseudoObservable::ObservedPtr ptr(&obs); + EXPECT_NE(nullptr, ptr.Get()); + EXPECT_EQ(1u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(0u, obs.ActiveObservedPtrs()); +} + +TEST(fxcrt, ObserveCopyConstruct) { + PseudoObservable obs; + { + PseudoObservable::ObservedPtr ptr(&obs); + EXPECT_NE(nullptr, ptr.Get()); + EXPECT_EQ(1u, obs.ActiveObservedPtrs()); + { + PseudoObservable::ObservedPtr ptr2(ptr); + EXPECT_NE(nullptr, ptr2.Get()); + EXPECT_EQ(2u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(1u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(0u, obs.ActiveObservedPtrs()); +} + +TEST(fxcrt, ObserveCopyAssign) { + PseudoObservable obs; + { + PseudoObservable::ObservedPtr ptr(&obs); + EXPECT_NE(nullptr, ptr.Get()); + EXPECT_EQ(1u, obs.ActiveObservedPtrs()); + { + PseudoObservable::ObservedPtr ptr2; + ptr2 = ptr; + EXPECT_NE(nullptr, ptr2.Get()); + EXPECT_EQ(2u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(1u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(0u, obs.ActiveObservedPtrs()); +} + +TEST(fxcrt, ObserveVector) { + PseudoObservable obs; + { + std::vector vec1; + std::vector vec2; + vec1.emplace_back(&obs); + vec1.emplace_back(&obs); + EXPECT_NE(nullptr, vec1[0].Get()); + EXPECT_NE(nullptr, vec1[1].Get()); + EXPECT_EQ(2u, obs.ActiveObservedPtrs()); + vec2 = vec1; + EXPECT_NE(nullptr, vec2[0].Get()); + EXPECT_NE(nullptr, vec2[1].Get()); + EXPECT_EQ(4u, obs.ActiveObservedPtrs()); + vec1.clear(); + EXPECT_EQ(2u, obs.ActiveObservedPtrs()); + vec2.resize(10000); + EXPECT_EQ(2u, obs.ActiveObservedPtrs()); + vec2.resize(0); + EXPECT_EQ(0u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(0u, obs.ActiveObservedPtrs()); +} + +TEST(fxcrt, ObserveVectorAutoClear) { + std::vector vec1; + { + PseudoObservable obs; + vec1.emplace_back(&obs); + vec1.emplace_back(&obs); + EXPECT_NE(nullptr, vec1[0].Get()); + EXPECT_NE(nullptr, vec1[1].Get()); + EXPECT_EQ(2u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(nullptr, vec1[0].Get()); + EXPECT_EQ(nullptr, vec1[1].Get()); +} + +TEST(fxcrt, ObservePtrResetNull) { + PseudoObservable obs; + PseudoObservable::ObservedPtr ptr(&obs); + EXPECT_EQ(1u, obs.ActiveObservedPtrs()); + ptr.Reset(); + EXPECT_EQ(0u, obs.ActiveObservedPtrs()); +} + +TEST(fxcrt, ObservePtrReset) { + PseudoObservable obs1; + PseudoObservable obs2; + PseudoObservable::ObservedPtr ptr(&obs1); + EXPECT_EQ(1u, obs1.ActiveObservedPtrs()); + EXPECT_EQ(0u, obs2.ActiveObservedPtrs()); + ptr.Reset(&obs2); + EXPECT_EQ(0u, obs1.ActiveObservedPtrs()); + EXPECT_EQ(1u, obs2.ActiveObservedPtrs()); +} + +TEST(fxcrt, ObservePtrEquals) { + PseudoObservable obj1; + PseudoObservable obj2; + PseudoObservable::ObservedPtr null_ptr1; + PseudoObservable::ObservedPtr obj1_ptr1(&obj1); + PseudoObservable::ObservedPtr obj2_ptr1(&obj2); + { + PseudoObservable::ObservedPtr null_ptr2; + EXPECT_TRUE(null_ptr1 == null_ptr2); + + PseudoObservable::ObservedPtr obj1_ptr2(&obj1); + EXPECT_TRUE(obj1_ptr1 == obj1_ptr2); + + PseudoObservable::ObservedPtr obj2_ptr2(&obj2); + EXPECT_TRUE(obj2_ptr1 == obj2_ptr2); + } + EXPECT_FALSE(null_ptr1 == obj1_ptr1); + EXPECT_FALSE(null_ptr1 == obj2_ptr1); + EXPECT_FALSE(obj1_ptr1 == obj2_ptr1); +} + +TEST(fxcrt, ObservePtrNotEquals) { + PseudoObservable obj1; + PseudoObservable obj2; + PseudoObservable::ObservedPtr null_ptr1; + PseudoObservable::ObservedPtr obj1_ptr1(&obj1); + PseudoObservable::ObservedPtr obj2_ptr1(&obj2); + { + PseudoObservable::ObservedPtr null_ptr2; + PseudoObservable::ObservedPtr obj1_ptr2(&obj1); + PseudoObservable::ObservedPtr obj2_ptr2(&obj2); + EXPECT_FALSE(null_ptr1 != null_ptr2); + EXPECT_FALSE(obj1_ptr1 != obj1_ptr2); + EXPECT_FALSE(obj2_ptr1 != obj2_ptr2); + } + EXPECT_TRUE(null_ptr1 != obj1_ptr1); + EXPECT_TRUE(null_ptr1 != obj2_ptr1); + EXPECT_TRUE(obj1_ptr1 != obj2_ptr1); +} + +TEST(fxcrt, ObservePtrBool) { + PseudoObservable obj1; + PseudoObservable::ObservedPtr null_ptr; + PseudoObservable::ObservedPtr obj1_ptr(&obj1); + bool null_bool = !!null_ptr; + bool obj1_bool = !!obj1_ptr; + EXPECT_FALSE(null_bool); + EXPECT_TRUE(obj1_bool); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_retain_ptr.h b/modules/pdfium/pdfium/core/fxcrt/cfx_retain_ptr.h new file mode 100644 index 000000000000..0267ae04cd8f --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_retain_ptr.h @@ -0,0 +1,112 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CORE_FXCRT_CFX_RETAIN_PTR_H_ +#define CORE_FXCRT_CFX_RETAIN_PTR_H_ + +#include +#include +#include + +#include "core/fxcrt/fx_memory.h" + +// Analogous to base's scoped_refptr. +template +class CFX_RetainPtr { + public: + explicit CFX_RetainPtr(T* pObj) : m_pObj(pObj) { + if (m_pObj) + m_pObj->Retain(); + } + + CFX_RetainPtr() {} + CFX_RetainPtr(const CFX_RetainPtr& that) : CFX_RetainPtr(that.Get()) {} + CFX_RetainPtr(CFX_RetainPtr&& that) { Swap(that); } + + // Deliberately implicit to allow returning nullptrs. + CFX_RetainPtr(std::nullptr_t ptr) {} + + template + CFX_RetainPtr(const CFX_RetainPtr& that) : CFX_RetainPtr(that.Get()) {} + + template + CFX_RetainPtr As() const { + return CFX_RetainPtr(static_cast(Get())); + } + + void Reset(T* obj = nullptr) { + if (obj) + obj->Retain(); + m_pObj.reset(obj); + } + + T* Get() const { return m_pObj.get(); } + void Swap(CFX_RetainPtr& that) { m_pObj.swap(that.m_pObj); } + + // TODO(tsepez): temporary scaffolding, to be removed. + T* Leak() { return m_pObj.release(); } + void Unleak(T* ptr) { m_pObj.reset(ptr); } + + CFX_RetainPtr& operator=(const CFX_RetainPtr& that) { + if (*this != that) + Reset(that.Get()); + return *this; + } + + bool operator==(const CFX_RetainPtr& that) const { + return Get() == that.Get(); + } + bool operator!=(const CFX_RetainPtr& that) const { return !(*this == that); } + + bool operator<(const CFX_RetainPtr& that) const { + return std::less()(Get(), that.Get()); + } + + explicit operator bool() const { return !!m_pObj; } + T& operator*() const { return *m_pObj.get(); } + T* operator->() const { return m_pObj.get(); } + + private: + std::unique_ptr> m_pObj; +}; + +// Trivial implementation - internal ref count with virtual destructor. +class CFX_Retainable { + public: + bool HasOneRef() const { return m_nRefCount == 1; } + + protected: + virtual ~CFX_Retainable() {} + + private: + template + friend struct ReleaseDeleter; + + template + friend class CFX_RetainPtr; + + void Retain() { ++m_nRefCount; } + void Release() { + ASSERT(m_nRefCount > 0); + if (--m_nRefCount == 0) + delete this; + } + + intptr_t m_nRefCount = 0; +}; + +namespace pdfium { + +// Helper to make a CFX_RetainPtr along the lines of std::make_unique<>(), +// or pdfium::MakeUnique<>(). Arguments are forwarded to T's constructor. +// Classes managed by CFX_RetainPtr should have protected (or private) +// constructors, and should friend this function. +template +CFX_RetainPtr MakeRetain(Args&&... args) { + return CFX_RetainPtr(new T(std::forward(args)...)); +} + +} // namespace pdfium + +#endif // CORE_FXCRT_CFX_RETAIN_PTR_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_retain_ptr_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/cfx_retain_ptr_unittest.cpp new file mode 100644 index 000000000000..3168b5a4c7bf --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_retain_ptr_unittest.cpp @@ -0,0 +1,254 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/cfx_retain_ptr.h" + +#include + +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class PseudoRetainable { + public: + PseudoRetainable() : retain_count_(0), release_count_(0) {} + void Retain() { ++retain_count_; } + void Release() { ++release_count_; } + int retain_count() const { return retain_count_; } + int release_count() const { return release_count_; } + + private: + int retain_count_; + int release_count_; +}; + +} // namespace + +TEST(fxcrt, RetainPtrNull) { + CFX_RetainPtr ptr; + EXPECT_EQ(nullptr, ptr.Get()); +} + +TEST(fxcrt, RetainPtrNormal) { + PseudoRetainable obj; + { + CFX_RetainPtr ptr(&obj); + EXPECT_EQ(&obj, ptr.Get()); + EXPECT_EQ(1, obj.retain_count()); + EXPECT_EQ(0, obj.release_count()); + } + EXPECT_EQ(1, obj.retain_count()); + EXPECT_EQ(1, obj.release_count()); +} + +TEST(fxcrt, RetainPtrCopyCtor) { + PseudoRetainable obj; + { + CFX_RetainPtr ptr1(&obj); + { + CFX_RetainPtr ptr2(ptr1); + EXPECT_EQ(2, obj.retain_count()); + EXPECT_EQ(0, obj.release_count()); + } + EXPECT_EQ(2, obj.retain_count()); + EXPECT_EQ(1, obj.release_count()); + } + EXPECT_EQ(2, obj.retain_count()); + EXPECT_EQ(2, obj.release_count()); +} + +TEST(fxcrt, RetainPtrMoveCtor) { + PseudoRetainable obj; + { + CFX_RetainPtr ptr1(&obj); + { + CFX_RetainPtr ptr2(std::move(ptr1)); + EXPECT_EQ(1, obj.retain_count()); + EXPECT_EQ(0, obj.release_count()); + } + EXPECT_EQ(1, obj.retain_count()); + EXPECT_EQ(1, obj.release_count()); + } + EXPECT_EQ(1, obj.retain_count()); + EXPECT_EQ(1, obj.release_count()); +} + +TEST(fxcrt, RetainPtrResetNull) { + PseudoRetainable obj; + { + CFX_RetainPtr ptr(&obj); + ptr.Reset(); + EXPECT_EQ(1, obj.retain_count()); + EXPECT_EQ(1, obj.release_count()); + } + EXPECT_EQ(1, obj.retain_count()); + EXPECT_EQ(1, obj.release_count()); +} + +TEST(fxcrt, RetainPtrReset) { + PseudoRetainable obj1; + PseudoRetainable obj2; + { + CFX_RetainPtr ptr(&obj1); + ptr.Reset(&obj2); + EXPECT_EQ(1, obj1.retain_count()); + EXPECT_EQ(1, obj1.release_count()); + EXPECT_EQ(1, obj2.retain_count()); + EXPECT_EQ(0, obj2.release_count()); + } + EXPECT_EQ(1, obj1.retain_count()); + EXPECT_EQ(1, obj1.release_count()); + EXPECT_EQ(1, obj2.retain_count()); + EXPECT_EQ(1, obj2.release_count()); +} + +TEST(fxcrt, RetainPtrSwap) { + PseudoRetainable obj1; + PseudoRetainable obj2; + { + CFX_RetainPtr ptr1(&obj1); + { + CFX_RetainPtr ptr2(&obj2); + ptr1.Swap(ptr2); + EXPECT_EQ(1, obj1.retain_count()); + EXPECT_EQ(0, obj1.release_count()); + EXPECT_EQ(1, obj2.retain_count()); + EXPECT_EQ(0, obj2.release_count()); + } + EXPECT_EQ(1, obj1.retain_count()); + EXPECT_EQ(1, obj1.release_count()); + EXPECT_EQ(1, obj2.retain_count()); + EXPECT_EQ(0, obj2.release_count()); + } + EXPECT_EQ(1, obj1.retain_count()); + EXPECT_EQ(1, obj1.release_count()); + EXPECT_EQ(1, obj2.retain_count()); + EXPECT_EQ(1, obj2.release_count()); +} + +TEST(fxcrt, RetainPtrLeak) { + PseudoRetainable obj; + PseudoRetainable* leak; + { + CFX_RetainPtr ptr(&obj); + leak = ptr.Leak(); + EXPECT_EQ(1, obj.retain_count()); + EXPECT_EQ(0, obj.release_count()); + } + EXPECT_EQ(1, obj.retain_count()); + EXPECT_EQ(0, obj.release_count()); + { + CFX_RetainPtr ptr; + ptr.Unleak(leak); + EXPECT_EQ(1, obj.retain_count()); + EXPECT_EQ(0, obj.release_count()); + } + EXPECT_EQ(1, obj.retain_count()); + EXPECT_EQ(1, obj.release_count()); +} + +TEST(fxcrt, RetainPtrSwapNull) { + PseudoRetainable obj1; + { + CFX_RetainPtr ptr1(&obj1); + { + CFX_RetainPtr ptr2; + ptr1.Swap(ptr2); + EXPECT_FALSE(ptr1); + EXPECT_TRUE(ptr2); + EXPECT_EQ(1, obj1.retain_count()); + EXPECT_EQ(0, obj1.release_count()); + } + EXPECT_EQ(1, obj1.retain_count()); + EXPECT_EQ(1, obj1.release_count()); + } + EXPECT_EQ(1, obj1.retain_count()); + EXPECT_EQ(1, obj1.release_count()); +} + +TEST(fxcrt, RetainPtrAssign) { + PseudoRetainable obj; + { + CFX_RetainPtr ptr(&obj); + { + CFX_RetainPtr ptr2; + ptr2 = ptr; + EXPECT_EQ(2, obj.retain_count()); + EXPECT_EQ(0, obj.release_count()); + } + EXPECT_EQ(2, obj.retain_count()); + EXPECT_EQ(1, obj.release_count()); + } + EXPECT_EQ(2, obj.retain_count()); + EXPECT_EQ(2, obj.release_count()); +} + +TEST(fxcrt, RetainPtrEquals) { + PseudoRetainable obj1; + PseudoRetainable obj2; + CFX_RetainPtr null_ptr1; + CFX_RetainPtr obj1_ptr1(&obj1); + CFX_RetainPtr obj2_ptr1(&obj2); + { + CFX_RetainPtr null_ptr2; + EXPECT_TRUE(null_ptr1 == null_ptr2); + + CFX_RetainPtr obj1_ptr2(&obj1); + EXPECT_TRUE(obj1_ptr1 == obj1_ptr2); + + CFX_RetainPtr obj2_ptr2(&obj2); + EXPECT_TRUE(obj2_ptr1 == obj2_ptr2); + } + EXPECT_FALSE(null_ptr1 == obj1_ptr1); + EXPECT_FALSE(null_ptr1 == obj2_ptr1); + EXPECT_FALSE(obj1_ptr1 == obj2_ptr1); +} + +TEST(fxcrt, RetainPtrNotEquals) { + PseudoRetainable obj1; + PseudoRetainable obj2; + CFX_RetainPtr null_ptr1; + CFX_RetainPtr obj1_ptr1(&obj1); + CFX_RetainPtr obj2_ptr1(&obj2); + { + CFX_RetainPtr null_ptr2; + CFX_RetainPtr obj1_ptr2(&obj1); + CFX_RetainPtr obj2_ptr2(&obj2); + EXPECT_FALSE(null_ptr1 != null_ptr2); + EXPECT_FALSE(obj1_ptr1 != obj1_ptr2); + EXPECT_FALSE(obj2_ptr1 != obj2_ptr2); + } + EXPECT_TRUE(null_ptr1 != obj1_ptr1); + EXPECT_TRUE(null_ptr1 != obj2_ptr1); + EXPECT_TRUE(obj1_ptr1 != obj2_ptr1); +} + +TEST(fxcrt, RetainPtrLessThan) { + PseudoRetainable objs[2]; + CFX_RetainPtr obj1_ptr(&objs[0]); + CFX_RetainPtr obj2_ptr(&objs[1]); + EXPECT_TRUE(obj1_ptr < obj2_ptr); + EXPECT_FALSE(obj2_ptr < obj1_ptr); +} + +TEST(fxcrt, RetainPtrBool) { + PseudoRetainable obj1; + CFX_RetainPtr null_ptr; + CFX_RetainPtr obj1_ptr(&obj1); + bool null_bool = !!null_ptr; + bool obj1_bool = !!obj1_ptr; + EXPECT_FALSE(null_bool); + EXPECT_TRUE(obj1_bool); +} + +TEST(fxcrt, RetainPtrMakeRetained) { + auto ptr = pdfium::MakeRetain(); + EXPECT_TRUE(ptr->HasOneRef()); + { + CFX_RetainPtr other = ptr; + EXPECT_FALSE(ptr->HasOneRef()); + } + EXPECT_TRUE(ptr->HasOneRef()); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_shared_copy_on_write.h b/modules/pdfium/pdfium/core/fxcrt/cfx_shared_copy_on_write.h new file mode 100644 index 000000000000..c87d96509df9 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_shared_copy_on_write.h @@ -0,0 +1,85 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_CFX_SHARED_COPY_ON_WRITE_H_ +#define CORE_FXCRT_CFX_SHARED_COPY_ON_WRITE_H_ + +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_system.h" + +// A shared object with Copy on Write semantics that makes it appear as +// if each one were independent. +template +class CFX_SharedCopyOnWrite { + public: + CFX_SharedCopyOnWrite() {} + CFX_SharedCopyOnWrite(const CFX_SharedCopyOnWrite& other) + : m_pObject(other.m_pObject) {} + ~CFX_SharedCopyOnWrite() {} + + template + ObjClass* Emplace(Args... params) { + m_pObject.Reset(new CountedObj(params...)); + return m_pObject.Get(); + } + + CFX_SharedCopyOnWrite& operator=(const CFX_SharedCopyOnWrite& that) { + if (*this != that) + m_pObject = that.m_pObject; + return *this; + } + + void SetNull() { m_pObject.Reset(); } + const ObjClass* GetObject() const { return m_pObject.Get(); } + + template + ObjClass* GetPrivateCopy(Args... params) { + if (!m_pObject) + return Emplace(params...); + if (!m_pObject->HasOneRef()) + m_pObject.Reset(new CountedObj(*m_pObject)); + return m_pObject.Get(); + } + + bool operator==(const CFX_SharedCopyOnWrite& that) const { + return m_pObject == that.m_pObject; + } + bool operator!=(const CFX_SharedCopyOnWrite& that) const { + return !(*this == that); + } + explicit operator bool() const { return !!m_pObject; } + + private: + class CountedObj : public ObjClass { + public: + template + // NOLINTNEXTLINE(runtime/explicit) + CountedObj(Args... params) : ObjClass(params...), m_RefCount(0) {} + + CountedObj(const CountedObj& src) : ObjClass(src), m_RefCount(0) {} + ~CountedObj() { m_RefCount = 0; } + + bool HasOneRef() const { return m_RefCount == 1; } + void Retain() { m_RefCount++; } + void Release() { + ASSERT(m_RefCount); + if (--m_RefCount == 0) + delete this; + } + + private: + // To ensure ref counts do not overflow, consider the worst possible case: + // the entire address space contains nothing but pointers to this object. + // Since the count increments with each new pointer, the largest value is + // the number of pointers that can fit into the address space. The size of + // the address space itself is a good upper bound on it. + intptr_t m_RefCount; + }; + + CFX_RetainPtr m_pObject; +}; + +#endif // CORE_FXCRT_CFX_SHARED_COPY_ON_WRITE_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_shared_copy_on_write_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/cfx_shared_copy_on_write_unittest.cpp new file mode 100644 index 000000000000..b0205d899bcd --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_shared_copy_on_write_unittest.cpp @@ -0,0 +1,129 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/cfx_shared_copy_on_write.h" + +#include +#include + +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class Observer { + public: + void OnConstruct(const std::string& name) { construction_counts_[name]++; } + void OnDestruct(const std::string& name) { destruction_counts_[name]++; } + int GetConstructionCount(const std::string& name) { + return construction_counts_[name]; + } + int GetDestructionCount(const std::string& name) { + return destruction_counts_[name]; + } + + private: + std::map construction_counts_; + std::map destruction_counts_; +}; + +class Object { + public: + Object(Observer* observer, const std::string& name) + : name_(name), observer_(observer) { + observer->OnConstruct(name_); + } + Object(const Object& that) : name_(that.name_), observer_(that.observer_) { + observer_->OnConstruct(name_); + } + ~Object() { observer_->OnDestruct(name_); } + + private: + std::string name_; + Observer* observer_; +}; + +} // namespace + +TEST(fxcrt, SharedCopyOnWriteNull) { + Observer observer; + { + CFX_SharedCopyOnWrite ptr; + EXPECT_EQ(nullptr, ptr.GetObject()); + } +} + +TEST(fxcrt, SharedCopyOnWriteCopy) { + Observer observer; + { + CFX_SharedCopyOnWrite ptr1; + ptr1.Emplace(&observer, std::string("one")); + { + CFX_SharedCopyOnWrite ptr2 = ptr1; + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + { + CFX_SharedCopyOnWrite ptr3(ptr1); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + EXPECT_EQ(1, observer.GetDestructionCount("one")); +} + +TEST(fxcrt, SharedCopyOnWriteAssignOverOld) { + Observer observer; + { + CFX_SharedCopyOnWrite ptr1; + ptr1.Emplace(&observer, std::string("one")); + ptr1.Emplace(&observer, std::string("two")); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(1, observer.GetConstructionCount("two")); + EXPECT_EQ(1, observer.GetDestructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("two")); + } + EXPECT_EQ(1, observer.GetDestructionCount("two")); +} + +TEST(fxcrt, SharedCopyOnWriteAssignOverRetained) { + Observer observer; + { + CFX_SharedCopyOnWrite ptr1; + ptr1.Emplace(&observer, std::string("one")); + CFX_SharedCopyOnWrite ptr2(ptr1); + ptr1.Emplace(&observer, std::string("two")); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(1, observer.GetConstructionCount("two")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("two")); + } + EXPECT_EQ(1, observer.GetDestructionCount("one")); + EXPECT_EQ(1, observer.GetDestructionCount("two")); +} + +TEST(fxcrt, SharedCopyOnWriteGetModify) { + Observer observer; + { + CFX_SharedCopyOnWrite ptr; + EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + + EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + { + CFX_SharedCopyOnWrite other(ptr); + EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); + EXPECT_EQ(2, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + EXPECT_EQ(2, observer.GetConstructionCount("one")); + EXPECT_EQ(1, observer.GetDestructionCount("one")); + } + EXPECT_EQ(2, observer.GetDestructionCount("one")); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_string_c_template.h b/modules/pdfium/pdfium/core/fxcrt/cfx_string_c_template.h new file mode 100644 index 000000000000..3bfcc915fb36 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_string_c_template.h @@ -0,0 +1,170 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_CFX_STRING_C_TEMPLATE_H_ +#define CORE_FXCRT_CFX_STRING_C_TEMPLATE_H_ + +#include +#include + +#include "core/fxcrt/fx_system.h" + +// An immutable string with caller-provided storage which must outlive the +// string itself. These are not necessarily nul-terminated, so that substring +// extraction (via the Mid(), Left(), and Right() methods) is copy-free. +template +class CFX_StringCTemplate { + public: + using CharType = T; + using UnsignedType = typename std::make_unsigned::type; + + CFX_StringCTemplate() : m_Ptr(nullptr), m_Length(0) {} + + // Deliberately implicit to avoid calling on every string literal. + // NOLINTNEXTLINE(runtime/explicit) + CFX_StringCTemplate(const CharType* ptr) + : m_Ptr(reinterpret_cast(ptr)), + m_Length(ptr ? FXSYS_len(ptr) : 0) {} + + CFX_StringCTemplate(const CharType* ptr, FX_STRSIZE len) + : m_Ptr(reinterpret_cast(ptr)), + m_Length(len == -1 ? FXSYS_len(ptr) : len) {} + + template + CFX_StringCTemplate( + const UnsignedType* ptr, + FX_STRSIZE size, + typename std::enable_if::value>::type* = 0) + : m_Ptr(ptr), m_Length(size) {} + + // Deliberately implicit to avoid calling on every string literal. + // |ch| must be an lvalue that outlives the the CFX_StringCTemplate. + // NOLINTNEXTLINE(runtime/explicit) + CFX_StringCTemplate(CharType& ch) { + m_Ptr = reinterpret_cast(&ch); + m_Length = 1; + } + + CFX_StringCTemplate(const CFX_StringCTemplate& src) { + m_Ptr = src.m_Ptr; + m_Length = src.m_Length; + } + + CFX_StringCTemplate& operator=(const CharType* src) { + m_Ptr = reinterpret_cast(src); + m_Length = src ? FXSYS_len(src) : 0; + return *this; + } + + CFX_StringCTemplate& operator=(const CFX_StringCTemplate& src) { + m_Ptr = src.m_Ptr; + m_Length = src.m_Length; + return *this; + } + + bool operator==(const CharType* ptr) const { + return FXSYS_len(ptr) == m_Length && + FXSYS_cmp(ptr, reinterpret_cast(m_Ptr), m_Length) == + 0; + } + bool operator==(const CFX_StringCTemplate& other) const { + return other.m_Length == m_Length && + FXSYS_cmp(reinterpret_cast(other.m_Ptr), + reinterpret_cast(m_Ptr), m_Length) == 0; + } + bool operator!=(const CharType* ptr) const { return !(*this == ptr); } + bool operator!=(const CFX_StringCTemplate& other) const { + return !(*this == other); + } + + uint32_t GetID(FX_STRSIZE start_pos = 0) const { + if (m_Length == 0 || start_pos < 0 || start_pos >= m_Length) + return 0; + + uint32_t strid = 0; + FX_STRSIZE size = std::min(4, m_Length - start_pos); + for (FX_STRSIZE i = 0; i < size; i++) + strid = strid * 256 + m_Ptr[start_pos + i]; + + return strid << ((4 - size) * 8); + } + + const UnsignedType* raw_str() const { return m_Ptr; } + const CharType* c_str() const { + return reinterpret_cast(m_Ptr); + } + + FX_STRSIZE GetLength() const { return m_Length; } + bool IsEmpty() const { return m_Length == 0; } + + UnsignedType GetAt(FX_STRSIZE index) const { return m_Ptr[index]; } + CharType CharAt(FX_STRSIZE index) const { + return static_cast(m_Ptr[index]); + } + + FX_STRSIZE Find(CharType ch) const { + const UnsignedType* found = reinterpret_cast( + FXSYS_chr(reinterpret_cast(m_Ptr), ch, m_Length)); + return found ? found - m_Ptr : -1; + } + + CFX_StringCTemplate Mid(FX_STRSIZE index, FX_STRSIZE count = -1) const { + index = std::max(0, index); + if (index > m_Length) + return CFX_StringCTemplate(); + + if (count < 0 || count > m_Length - index) + count = m_Length - index; + + return CFX_StringCTemplate(m_Ptr + index, count); + } + + CFX_StringCTemplate Left(FX_STRSIZE count) const { + if (count <= 0) + return CFX_StringCTemplate(); + + return CFX_StringCTemplate(m_Ptr, std::min(count, m_Length)); + } + + CFX_StringCTemplate Right(FX_STRSIZE count) const { + if (count <= 0) + return CFX_StringCTemplate(); + + count = std::min(count, m_Length); + return CFX_StringCTemplate(m_Ptr + m_Length - count, count); + } + + const UnsignedType& operator[](size_t index) const { return m_Ptr[index]; } + + bool operator<(const CFX_StringCTemplate& that) const { + int result = FXSYS_cmp(reinterpret_cast(m_Ptr), + reinterpret_cast(that.m_Ptr), + std::min(m_Length, that.m_Length)); + return result < 0 || (result == 0 && m_Length < that.m_Length); + } + + protected: + const UnsignedType* m_Ptr; + FX_STRSIZE m_Length; + + private: + void* operator new(size_t) throw() { return nullptr; } +}; + +template +inline bool operator==(const T* lhs, const CFX_StringCTemplate& rhs) { + return rhs == lhs; +} + +template +inline bool operator!=(const T* lhs, const CFX_StringCTemplate& rhs) { + return rhs != lhs; +} + +extern template class CFX_StringCTemplate; +extern template class CFX_StringCTemplate; + +#endif // CORE_FXCRT_CFX_STRING_C_TEMPLATE_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_string_data_template.h b/modules/pdfium/pdfium/core/fxcrt/cfx_string_data_template.h new file mode 100644 index 000000000000..c3e090fef0c8 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_string_data_template.h @@ -0,0 +1,116 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_CFX_STRING_DATA_TEMPLATE_H_ +#define CORE_FXCRT_CFX_STRING_DATA_TEMPLATE_H_ + +#include "core/fxcrt/fx_memory.h" +#include "core/fxcrt/fx_system.h" +#include "third_party/base/numerics/safe_math.h" + +template +class CFX_StringDataTemplate { + public: + static CFX_StringDataTemplate* Create(FX_STRSIZE nLen) { + ASSERT(nLen > 0); + + // Calculate space needed for the fixed portion of the struct plus the + // NUL char that is not included in |m_nAllocLength|. + int overhead = + offsetof(CFX_StringDataTemplate, m_String) + sizeof(CharType); + pdfium::base::CheckedNumeric nSize = nLen; + nSize *= sizeof(CharType); + nSize += overhead; + + // Now round to an 8-byte boundary. We'd expect that this is the minimum + // granularity of any of the underlying allocators, so there may be cases + // where we can save a re-alloc when adding a few characters to a string + // by using this otherwise wasted space. + nSize += 7; + nSize &= ~7; + int totalSize = nSize.ValueOrDie(); + int usableLen = (totalSize - overhead) / sizeof(CharType); + ASSERT(usableLen >= nLen); + + void* pData = FX_Alloc(uint8_t, totalSize); + return new (pData) CFX_StringDataTemplate(nLen, usableLen); + } + + static CFX_StringDataTemplate* Create(const CFX_StringDataTemplate& other) { + CFX_StringDataTemplate* result = Create(other.m_nDataLength); + result->CopyContents(other); + return result; + } + + static CFX_StringDataTemplate* Create(const CharType* pStr, FX_STRSIZE nLen) { + CFX_StringDataTemplate* result = Create(nLen); + result->CopyContents(pStr, nLen); + return result; + } + + void Retain() { ++m_nRefs; } + void Release() { + if (--m_nRefs <= 0) + FX_Free(this); + } + + bool CanOperateInPlace(FX_STRSIZE nTotalLen) const { + return m_nRefs <= 1 && nTotalLen <= m_nAllocLength; + } + + void CopyContents(const CFX_StringDataTemplate& other) { + ASSERT(other.m_nDataLength <= m_nAllocLength); + FXSYS_memcpy(m_String, other.m_String, + (other.m_nDataLength + 1) * sizeof(CharType)); + } + + void CopyContents(const CharType* pStr, FX_STRSIZE nLen) { + ASSERT(nLen >= 0 && nLen <= m_nAllocLength); + FXSYS_memcpy(m_String, pStr, nLen * sizeof(CharType)); + m_String[nLen] = 0; + } + + void CopyContentsAt(FX_STRSIZE offset, + const CharType* pStr, + FX_STRSIZE nLen) { + ASSERT(offset >= 0 && nLen >= 0 && offset + nLen <= m_nAllocLength); + FXSYS_memcpy(m_String + offset, pStr, nLen * sizeof(CharType)); + m_String[offset + nLen] = 0; + } + + // To ensure ref counts do not overflow, consider the worst possible case: + // the entire address space contains nothing but pointers to this object. + // Since the count increments with each new pointer, the largest value is + // the number of pointers that can fit into the address space. The size of + // the address space itself is a good upper bound on it. + intptr_t m_nRefs; + + // |FX_STRSIZE| is currently typedef'd as |int|. + // TODO(palmer): It should be a |size_t|, or at least unsigned. + // These lengths are in terms of number of characters, not bytes, and do not + // include the terminating NUL character, but the underlying buffer is sized + // to be capable of holding it. + FX_STRSIZE m_nDataLength; + FX_STRSIZE m_nAllocLength; + + // Not really 1, variable size. + CharType m_String[1]; + + private: + CFX_StringDataTemplate(FX_STRSIZE dataLen, FX_STRSIZE allocLen) + : m_nRefs(0), m_nDataLength(dataLen), m_nAllocLength(allocLen) { + ASSERT(dataLen >= 0); + ASSERT(dataLen <= allocLen); + m_String[dataLen] = 0; + } + + ~CFX_StringDataTemplate() = delete; +}; + +extern template class CFX_StringDataTemplate; +extern template class CFX_StringDataTemplate; + +#endif // CORE_FXCRT_CFX_STRING_DATA_TEMPLATE_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_string_pool_template.h b/modules/pdfium/pdfium/core/fxcrt/cfx_string_pool_template.h new file mode 100644 index 000000000000..bfc1ce4bfb64 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_string_pool_template.h @@ -0,0 +1,30 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_CFX_STRING_POOL_TEMPLATE_H_ +#define CORE_FXCRT_CFX_STRING_POOL_TEMPLATE_H_ + +#include + +#include "core/fxcrt/fx_string.h" + +template +class CFX_StringPoolTemplate { + public: + StringType Intern(const StringType& str) { return *m_Pool.insert(str).first; } + void Clear() { m_Pool.clear(); } + + private: + std::unordered_set m_Pool; +}; + +using CFX_ByteStringPool = CFX_StringPoolTemplate; +using CFX_WideStringPool = CFX_StringPoolTemplate; + +extern template class CFX_StringPoolTemplate; +extern template class CFX_StringPoolTemplate; + +#endif // CORE_FXCRT_CFX_STRING_POOL_TEMPLATE_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_string_pool_template_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/cfx_string_pool_template_unittest.cpp new file mode 100644 index 000000000000..d0f5fbe96d1e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_string_pool_template_unittest.cpp @@ -0,0 +1,94 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/cfx_string_pool_template.h" +#include "core/fxcrt/fx_string.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(fxcrt, ByteStringPool) { + CFX_ByteStringPool pool; + + CFX_ByteString null1; + CFX_ByteString null2; + CFX_ByteString goats1("goats"); + CFX_ByteString goats2("goats"); + + // Underlying storage, if non-null, is not shared. + EXPECT_EQ(nullptr, null1.m_pData.Get()); + EXPECT_EQ(nullptr, null2.m_pData.Get()); + EXPECT_NE(goats1.m_pData, goats2.m_pData); + + CFX_ByteString interned_null1 = pool.Intern(null1); + CFX_ByteString interned_null2 = pool.Intern(null2); + CFX_ByteString interned_goats1 = pool.Intern(goats1); + CFX_ByteString interned_goats2 = pool.Intern(goats2); + + // Strings are logically equal after being interned. + EXPECT_EQ(null1, interned_null1); + EXPECT_EQ(null2, interned_null2); + EXPECT_EQ(goats1, interned_goats1); + EXPECT_EQ(goats2, interned_goats2); + + // Interned underlying storage, if non-null, belongs to first seen. + EXPECT_EQ(nullptr, interned_null1.m_pData.Get()); + EXPECT_EQ(nullptr, interned_null2.m_pData.Get()); + EXPECT_EQ(goats1.m_pData, interned_goats1.m_pData); + EXPECT_EQ(goats1.m_pData, interned_goats2.m_pData); + + pool.Clear(); + CFX_ByteString reinterned_null2 = pool.Intern(null2); + CFX_ByteString reinterned_null1 = pool.Intern(null2); + CFX_ByteString reinterned_goats2 = pool.Intern(goats2); + CFX_ByteString reinterned_goats1 = pool.Intern(goats2); + + // After clearing pool, storage was re-interned using second strings. + EXPECT_EQ(nullptr, interned_null1.m_pData.Get()); + EXPECT_EQ(nullptr, interned_null2.m_pData.Get()); + EXPECT_EQ(goats2.m_pData, reinterned_goats1.m_pData); + EXPECT_EQ(goats2.m_pData, reinterned_goats2.m_pData); +} + +TEST(fxcrt, WideStringPool) { + CFX_WideStringPool pool; + + CFX_WideString null1; + CFX_WideString null2; + CFX_WideString goats1(L"goats"); + CFX_WideString goats2(L"goats"); + + // Underlying storage, if non-null, is not shared. + EXPECT_EQ(nullptr, null1.m_pData.Get()); + EXPECT_EQ(nullptr, null2.m_pData.Get()); + EXPECT_NE(goats1.m_pData, goats2.m_pData); + + CFX_WideString interned_null1 = pool.Intern(null1); + CFX_WideString interned_null2 = pool.Intern(null2); + CFX_WideString interned_goats1 = pool.Intern(goats1); + CFX_WideString interned_goats2 = pool.Intern(goats2); + + // Strings are logically equal after being interned. + EXPECT_EQ(null1, interned_null1); + EXPECT_EQ(null2, interned_null2); + EXPECT_EQ(goats1, interned_goats1); + EXPECT_EQ(goats2, interned_goats2); + + // Interned underlying storage, if non-null, belongs to first seen. + EXPECT_EQ(nullptr, interned_null1.m_pData.Get()); + EXPECT_EQ(nullptr, interned_null2.m_pData.Get()); + EXPECT_EQ(goats1.m_pData, interned_goats1.m_pData); + EXPECT_EQ(goats1.m_pData, interned_goats2.m_pData); + + pool.Clear(); + CFX_WideString reinterned_null2 = pool.Intern(null2); + CFX_WideString reinterned_null1 = pool.Intern(null2); + CFX_WideString reinterned_goats2 = pool.Intern(goats2); + CFX_WideString reinterned_goats1 = pool.Intern(goats2); + + // After clearing pool, storage was re-interned using second strings. + EXPECT_EQ(nullptr, interned_null1.m_pData.Get()); + EXPECT_EQ(nullptr, interned_null2.m_pData.Get()); + EXPECT_EQ(goats2.m_pData, reinterned_goats1.m_pData); + EXPECT_EQ(goats2.m_pData, reinterned_goats2.m_pData); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_weak_ptr.h b/modules/pdfium/pdfium/core/fxcrt/cfx_weak_ptr.h new file mode 100644 index 000000000000..43ae5b881d47 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_weak_ptr.h @@ -0,0 +1,86 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_CFX_WEAK_PTR_H_ +#define CORE_FXCRT_CFX_WEAK_PTR_H_ + +#include +#include +#include + +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_system.h" + +template > +class CFX_WeakPtr { + public: + CFX_WeakPtr() {} + CFX_WeakPtr(const CFX_WeakPtr& that) : m_pHandle(that.m_pHandle) {} + CFX_WeakPtr(CFX_WeakPtr&& that) { Swap(that); } + explicit CFX_WeakPtr(std::unique_ptr pObj) + : m_pHandle(new Handle(std::move(pObj))) {} + + // Deliberately implicit to allow passing nullptr. + // NOLINTNEXTLINE(runtime/explicit) + CFX_WeakPtr(std::nullptr_t arg) {} + + explicit operator bool() const { return m_pHandle && !!m_pHandle->Get(); } + bool HasOneRef() const { return m_pHandle && m_pHandle->HasOneRef(); } + T* operator->() { return m_pHandle->Get(); } + const T* operator->() const { return m_pHandle->Get(); } + CFX_WeakPtr& operator=(const CFX_WeakPtr& that) { + m_pHandle = that.m_pHandle; + return *this; + } + bool operator==(const CFX_WeakPtr& that) const { + return m_pHandle == that.m_pHandle; + } + bool operator!=(const CFX_WeakPtr& that) const { return !(*this == that); } + + T* Get() const { return m_pHandle ? m_pHandle->Get() : nullptr; } + void DeleteObject() { + if (m_pHandle) { + m_pHandle->Clear(); + m_pHandle.Reset(); + } + } + void Reset() { m_pHandle.Reset(); } + void Reset(std::unique_ptr pObj) { + m_pHandle.Reset(new Handle(std::move(pObj))); + } + void Swap(CFX_WeakPtr& that) { m_pHandle.Swap(that.m_pHandle); } + + private: + class Handle { + public: + explicit Handle(std::unique_ptr ptr) + : m_nCount(0), m_pObj(std::move(ptr)) {} + void Reset(std::unique_ptr ptr) { m_pObj = std::move(ptr); } + void Clear() { // Now you're all weak ptrs ... + m_pObj.reset(); // unique_ptr nulls first before invoking delete. + } + T* Get() const { return m_pObj.get(); } + T* Retain() { + ++m_nCount; + return m_pObj.get(); + } + void Release() { + if (--m_nCount == 0) + delete this; + } + bool HasOneRef() const { return m_nCount == 1; } + + private: + ~Handle() {} + + intptr_t m_nCount; + std::unique_ptr m_pObj; + }; + + CFX_RetainPtr m_pHandle; +}; + +#endif // CORE_FXCRT_CFX_WEAK_PTR_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/cfx_weak_ptr_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/cfx_weak_ptr_unittest.cpp new file mode 100644 index 000000000000..47f63c35b240 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/cfx_weak_ptr_unittest.cpp @@ -0,0 +1,174 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/cfx_weak_ptr.h" + +#include +#include + +#include "core/fxcrt/fx_memory.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class PseudoDeletable; +using WeakPtr = CFX_WeakPtr>; +using UniquePtr = + std::unique_ptr>; + +class PseudoDeletable { + public: + PseudoDeletable() : delete_count_(0) {} + void Release() { + ++delete_count_; + next_.Reset(); + } + void SetNext(const WeakPtr& next) { next_ = next; } + int delete_count() const { return delete_count_; } + + private: + int delete_count_; + WeakPtr next_; +}; + +} // namespace + +TEST(fxcrt, WeakPtrNull) { + WeakPtr ptr1; + EXPECT_FALSE(ptr1); + + WeakPtr ptr2; + EXPECT_TRUE(ptr1 == ptr2); + EXPECT_FALSE(ptr1 != ptr2); + + WeakPtr ptr3(ptr1); + EXPECT_TRUE(ptr1 == ptr3); + EXPECT_FALSE(ptr1 != ptr3); + + WeakPtr ptr4 = ptr1; + EXPECT_TRUE(ptr1 == ptr4); + EXPECT_FALSE(ptr1 != ptr4); +} + +TEST(fxcrt, WeakPtrNonNull) { + PseudoDeletable thing; + EXPECT_EQ(0, thing.delete_count()); + { + UniquePtr unique(&thing); + WeakPtr ptr1(std::move(unique)); + EXPECT_TRUE(ptr1); + EXPECT_EQ(&thing, ptr1.Get()); + + WeakPtr ptr2; + EXPECT_FALSE(ptr1 == ptr2); + EXPECT_TRUE(ptr1 != ptr2); + { + WeakPtr ptr3(ptr1); + EXPECT_TRUE(ptr1 == ptr3); + EXPECT_FALSE(ptr1 != ptr3); + EXPECT_EQ(&thing, ptr3.Get()); + { + WeakPtr ptr4 = ptr1; + EXPECT_TRUE(ptr1 == ptr4); + EXPECT_FALSE(ptr1 != ptr4); + EXPECT_EQ(&thing, ptr4.Get()); + } + } + EXPECT_EQ(0, thing.delete_count()); + } + EXPECT_EQ(1, thing.delete_count()); +} + +TEST(fxcrt, WeakPtrResetNull) { + PseudoDeletable thing; + { + UniquePtr unique(&thing); + WeakPtr ptr1(std::move(unique)); + WeakPtr ptr2 = ptr1; + ptr1.Reset(); + EXPECT_FALSE(ptr1); + EXPECT_EQ(nullptr, ptr1.Get()); + EXPECT_TRUE(ptr2); + EXPECT_EQ(&thing, ptr2.Get()); + EXPECT_FALSE(ptr1 == ptr2); + EXPECT_TRUE(ptr1 != ptr2); + EXPECT_EQ(0, thing.delete_count()); + } + EXPECT_EQ(1, thing.delete_count()); +} + +TEST(fxcrt, WeakPtrResetNonNull) { + PseudoDeletable thing1; + PseudoDeletable thing2; + { + UniquePtr unique1(&thing1); + WeakPtr ptr1(std::move(unique1)); + WeakPtr ptr2 = ptr1; + UniquePtr unique2(&thing2); + ptr2.Reset(std::move(unique2)); + EXPECT_TRUE(ptr1); + EXPECT_EQ(&thing1, ptr1.Get()); + EXPECT_TRUE(ptr2); + EXPECT_EQ(&thing2, ptr2.Get()); + EXPECT_FALSE(ptr1 == ptr2); + EXPECT_TRUE(ptr1 != ptr2); + EXPECT_EQ(0, thing1.delete_count()); + EXPECT_EQ(0, thing2.delete_count()); + } + EXPECT_EQ(1, thing1.delete_count()); + EXPECT_EQ(1, thing2.delete_count()); +} + +TEST(fxcrt, WeakPtrDeleteObject) { + PseudoDeletable thing; + { + UniquePtr unique(&thing); + WeakPtr ptr1(std::move(unique)); + WeakPtr ptr2 = ptr1; + ptr1.DeleteObject(); + EXPECT_FALSE(ptr1); + EXPECT_EQ(nullptr, ptr1.Get()); + EXPECT_FALSE(ptr2); + EXPECT_EQ(nullptr, ptr2.Get()); + EXPECT_FALSE(ptr1 == ptr2); + EXPECT_TRUE(ptr1 != ptr2); + EXPECT_EQ(1, thing.delete_count()); + } + EXPECT_EQ(1, thing.delete_count()); +} + +TEST(fxcrt, WeakPtrCyclic) { + PseudoDeletable thing1; + PseudoDeletable thing2; + { + UniquePtr unique1(&thing1); + UniquePtr unique2(&thing2); + WeakPtr ptr1(std::move(unique1)); + WeakPtr ptr2(std::move(unique2)); + ptr1->SetNext(ptr2); + ptr2->SetNext(ptr1); + } + // Leaks without explicit clear. + EXPECT_EQ(0, thing1.delete_count()); + EXPECT_EQ(0, thing2.delete_count()); +} + +TEST(fxcrt, WeakPtrCyclicDeleteObject) { + PseudoDeletable thing1; + PseudoDeletable thing2; + { + UniquePtr unique1(&thing1); + UniquePtr unique2(&thing2); + WeakPtr ptr1(std::move(unique1)); + WeakPtr ptr2(std::move(unique2)); + ptr1->SetNext(ptr2); + ptr2->SetNext(ptr1); + ptr1.DeleteObject(); + EXPECT_EQ(1, thing1.delete_count()); + EXPECT_EQ(0, thing2.delete_count()); + } + EXPECT_EQ(1, thing1.delete_count()); + EXPECT_EQ(1, thing2.delete_count()); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/extension.h b/modules/pdfium/pdfium/core/fxcrt/extension.h new file mode 100644 index 000000000000..b62f67772b3d --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/extension.h @@ -0,0 +1,61 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_EXTENSION_H_ +#define CORE_FXCRT_EXTENSION_H_ + +#include +#include + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_safe_types.h" + +class IFXCRT_FileAccess { + public: + static IFXCRT_FileAccess* Create(); + virtual ~IFXCRT_FileAccess() {} + + virtual bool Open(const CFX_ByteStringC& fileName, uint32_t dwMode) = 0; + virtual bool Open(const CFX_WideStringC& fileName, uint32_t dwMode) = 0; + virtual void Close() = 0; + virtual FX_FILESIZE GetSize() const = 0; + virtual FX_FILESIZE GetPosition() const = 0; + virtual FX_FILESIZE SetPosition(FX_FILESIZE pos) = 0; + virtual size_t Read(void* pBuffer, size_t szBuffer) = 0; + virtual size_t Write(const void* pBuffer, size_t szBuffer) = 0; + virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0; + virtual size_t WritePos(const void* pBuffer, + size_t szBuffer, + FX_FILESIZE pos) = 0; + virtual bool Flush() = 0; + virtual bool Truncate(FX_FILESIZE szFile) = 0; +}; + +#ifdef __cplusplus +extern "C" { +#endif +#define MT_N 848 +#define MT_M 456 +#define MT_Matrix_A 0x9908b0df +#define MT_Upper_Mask 0x80000000 +#define MT_Lower_Mask 0x7fffffff +struct FX_MTRANDOMCONTEXT { + FX_MTRANDOMCONTEXT() { + mti = MT_N + 1; + bHaveSeed = false; + } + uint32_t mti; + bool bHaveSeed; + uint32_t mt[MT_N]; +}; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +bool FX_GenerateCryptoRandom(uint32_t* pBuffer, int32_t iCount); +#endif +#ifdef __cplusplus +} +#endif + +#endif // CORE_FXCRT_EXTENSION_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_arabic.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_arabic.cpp new file mode 100644 index 000000000000..108c6c19ac47 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_arabic.cpp @@ -0,0 +1,733 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fx_arabic.h" + +#include +#include + +#include "core/fxcrt/fx_ucd.h" +#include "third_party/base/stl_util.h" + +namespace { + +const FX_ARBFORMTABLE g_FX_ArabicFormTables[] = { + {0xFE81, 0xFE82, 0xFE81, 0xFE82}, {0xFE83, 0xFE84, 0xFE83, 0xFE84}, + {0xFE85, 0xFE86, 0xFE85, 0xFE86}, {0xFE87, 0xFE88, 0xFE87, 0xFE88}, + {0xFE89, 0xFE8A, 0xFE8B, 0xFE8C}, {0xFE8D, 0xFE8E, 0xFE8D, 0xFE8E}, + {0xFE8F, 0xFE90, 0xFE91, 0xFE92}, {0xFE93, 0xFE94, 0xFE93, 0xFE94}, + {0xFE95, 0xFE96, 0xFE97, 0xFE98}, {0xFE99, 0xFE9A, 0xFE9B, 0xFE9C}, + {0xFE9D, 0xFE9E, 0xFE9F, 0xFEA0}, {0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4}, + {0xFEA5, 0xFEA6, 0xFEA7, 0xFEA8}, {0xFEA9, 0xFEAA, 0xFEA9, 0xFEAA}, + {0xFEAB, 0xFEAC, 0xFEAB, 0xFEAC}, {0xFEAD, 0xFEAE, 0xFEAD, 0xFEAE}, + {0xFEAF, 0xFEB0, 0xFEAF, 0xFEB0}, {0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4}, + {0xFEB5, 0xFEB6, 0xFEB7, 0xFEB8}, {0xFEB9, 0xFEBA, 0xFEBB, 0xFEBC}, + {0xFEBD, 0xFEBE, 0xFEBF, 0xFEC0}, {0xFEC1, 0xFEC2, 0xFEC3, 0xFEC4}, + {0xFEC5, 0xFEC6, 0xFEC7, 0xFEC8}, {0xFEC9, 0xFECA, 0xFECB, 0xFECC}, + {0xFECD, 0xFECE, 0xFECF, 0xFED0}, {0x063B, 0x063B, 0x063B, 0x063B}, + {0x063C, 0x063C, 0x063C, 0x063C}, {0x063D, 0x063D, 0x063D, 0x063D}, + {0x063E, 0x063E, 0x063E, 0x063E}, {0x063F, 0x063F, 0x063F, 0x063F}, + {0x0640, 0x0640, 0x0640, 0x0640}, {0xFED1, 0xFED2, 0xFED3, 0xFED4}, + {0xFED5, 0xFED6, 0xFED7, 0xFED8}, {0xFED9, 0xFEDA, 0xFEDB, 0xFEDC}, + {0xFEDD, 0xFEDE, 0xFEDF, 0xFEE0}, {0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4}, + {0xFEE5, 0xFEE6, 0xFEE7, 0xFEE8}, {0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC}, + {0xFEED, 0xFEEE, 0xFEED, 0xFEEE}, {0xFEEF, 0xFEF0, 0xFBFE, 0xFBFF}, + {0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4}, {0x064B, 0x064B, 0x064B, 0x064B}, + {0x064C, 0x064C, 0x064C, 0x064C}, {0x064D, 0x064D, 0x064D, 0x064D}, + {0x064E, 0x064E, 0x064E, 0x064E}, {0x064F, 0x064F, 0x064F, 0x064F}, + {0x0650, 0x0650, 0x0650, 0x0650}, {0x0651, 0x0651, 0x0651, 0x0651}, + {0x0652, 0x0652, 0x0652, 0x0652}, {0x0653, 0x0653, 0x0653, 0x0653}, + {0x0654, 0x0654, 0x0654, 0x0654}, {0x0655, 0x0655, 0x0655, 0x0655}, + {0x0656, 0x0656, 0x0656, 0x0656}, {0x0657, 0x0657, 0x0657, 0x0657}, + {0x0658, 0x0658, 0x0658, 0x0658}, {0x0659, 0x0659, 0x0659, 0x0659}, + {0x065A, 0x065A, 0x065A, 0x065A}, {0x065B, 0x065B, 0x065B, 0x065B}, + {0x065C, 0x065C, 0x065C, 0x065C}, {0x065D, 0x065D, 0x065D, 0x065D}, + {0x065E, 0x065E, 0x065E, 0x065E}, {0x065F, 0x065F, 0x065F, 0x065F}, + {0x0660, 0x0660, 0x0660, 0x0660}, {0x0661, 0x0661, 0x0661, 0x0661}, + {0x0662, 0x0662, 0x0662, 0x0662}, {0x0663, 0x0663, 0x0663, 0x0663}, + {0x0664, 0x0664, 0x0664, 0x0664}, {0x0665, 0x0665, 0x0665, 0x0665}, + {0x0666, 0x0666, 0x0666, 0x0666}, {0x0667, 0x0667, 0x0667, 0x0667}, + {0x0668, 0x0668, 0x0668, 0x0668}, {0x0669, 0x0669, 0x0669, 0x0669}, + {0x066A, 0x066A, 0x066A, 0x066A}, {0x066B, 0x066B, 0x066B, 0x066B}, + {0x066C, 0x066C, 0x066C, 0x066C}, {0x066D, 0x066D, 0x066D, 0x066D}, + {0x066E, 0x066E, 0x066E, 0x066E}, {0x066F, 0x066F, 0x066F, 0x066F}, + {0x0670, 0x0670, 0x0670, 0x0670}, {0xFB50, 0xFB51, 0xFB50, 0xFB51}, + {0x0672, 0x0672, 0x0672, 0x0672}, {0x0673, 0x0673, 0x0673, 0x0673}, + {0x0674, 0x0674, 0x0674, 0x0674}, {0x0675, 0x0675, 0x0675, 0x0675}, + {0x0676, 0x0676, 0x0676, 0x0676}, {0x0677, 0x0677, 0x0677, 0x0677}, + {0x0678, 0x0678, 0x0678, 0x0678}, {0xFB66, 0xFB67, 0xFB68, 0xFB69}, + {0xFB5E, 0xFB5F, 0xFB60, 0xFB61}, {0xFB52, 0xFB53, 0xFB54, 0xFB55}, + {0x067C, 0x067C, 0x067C, 0x067C}, {0x067D, 0x067D, 0x067D, 0x067D}, + {0xFB56, 0xFB57, 0xFB58, 0xFB59}, {0xFB62, 0xFB63, 0xFB64, 0xFB65}, + {0xFB5A, 0xFB5B, 0xFB5C, 0xFB5D}, {0x0681, 0x0681, 0x0681, 0x0681}, + {0x0682, 0x0682, 0x0682, 0x0682}, {0xFB76, 0xFB77, 0xFB78, 0xFB79}, + {0xFB72, 0xFB73, 0xFB74, 0xFB75}, {0x0685, 0x0685, 0x0685, 0x0685}, + {0xFB7A, 0xFB7B, 0xFB7C, 0xFB7D}, {0xFB7E, 0xFB7F, 0xFB80, 0xFB81}, + {0xFB88, 0xFB89, 0xFB88, 0xFB89}, {0x0689, 0x0689, 0x0689, 0x0689}, + {0x068A, 0x068A, 0x068A, 0x068A}, {0x068B, 0x068B, 0x068B, 0x068B}, + {0xFB84, 0xFB85, 0xFB84, 0xFB85}, {0xFB82, 0xFB83, 0xFB82, 0xFB83}, + {0xFB86, 0xFB87, 0xFB86, 0xFB87}, {0x068F, 0x068F, 0x068F, 0x068F}, + {0x0690, 0x0690, 0x0690, 0x0690}, {0xFB8C, 0xFB8D, 0xFB8C, 0xFB8D}, + {0x0692, 0x0692, 0x0692, 0x0692}, {0x0693, 0x0693, 0x0693, 0x0693}, + {0x0694, 0x0694, 0x0694, 0x0694}, {0x0695, 0x0695, 0x0695, 0x0695}, + {0x0696, 0x0696, 0x0696, 0x0696}, {0x0697, 0x0697, 0x0697, 0x0697}, + {0xFB8A, 0xFB8B, 0xFB8A, 0xFB8B}, {0x0699, 0x0699, 0x0699, 0x0699}, + {0x069A, 0x069A, 0x069A, 0x069A}, {0x069B, 0x069B, 0x069B, 0x069B}, + {0x069C, 0x069C, 0x069C, 0x069C}, {0x069D, 0x069D, 0x069D, 0x069D}, + {0x069E, 0x069E, 0x069E, 0x069E}, {0x069F, 0x069F, 0x069F, 0x069F}, + {0x06A0, 0x06A0, 0x06A0, 0x06A0}, {0x06A1, 0x06A1, 0x06A1, 0x06A1}, + {0x06A2, 0x06A2, 0x06A2, 0x06A2}, {0x06A3, 0x06A3, 0x06A3, 0x06A3}, + {0xFB6A, 0xFB6B, 0xFB6C, 0xFB6D}, {0x06A5, 0x06A5, 0x06A5, 0x06A5}, + {0xFB6E, 0xFB6F, 0xFB70, 0xFB71}, {0x06A7, 0x06A7, 0x06A7, 0x06A7}, + {0x06A8, 0x06A8, 0x06A8, 0x06A8}, {0xFB8E, 0xFB8F, 0xFB90, 0xFB91}, + {0x06AA, 0x06AA, 0x06AA, 0x06AA}, {0x06AB, 0x06AB, 0x06AB, 0x06AB}, + {0x06AC, 0x06AC, 0x06AC, 0x06AC}, {0xFBD3, 0xFBD4, 0xFBD5, 0xFBD6}, + {0x06AE, 0x06AE, 0x06AE, 0x06AE}, {0xFB92, 0xFB93, 0xFB94, 0xFB95}, + {0x06B0, 0x06B0, 0x06B0, 0x06B0}, {0xFB9A, 0xFB9B, 0xFB9C, 0xFB9D}, + {0x06B2, 0x06B2, 0x06B2, 0x06B2}, {0xFB96, 0xFB97, 0xFB98, 0xFB99}, + {0x06B4, 0x06B4, 0x06B4, 0x06B4}, {0x06B5, 0x06B5, 0x06B5, 0x06B5}, + {0x06B6, 0x06B6, 0x06B6, 0x06B6}, {0x06B7, 0x06B7, 0x06B7, 0x06B7}, + {0x06B8, 0x06B8, 0x06B8, 0x06B8}, {0x06B9, 0x06B9, 0x06B9, 0x06B9}, + {0xFB9E, 0xFB9F, 0xFBE8, 0xFBE9}, {0xFBA0, 0xFBA1, 0xFBA2, 0xFBA3}, + {0x06BC, 0x06BC, 0x06BC, 0x06BC}, {0x06BD, 0x06BD, 0x06BD, 0x06BD}, + {0xFBAA, 0xFBAB, 0xFBAC, 0xFBAD}, {0x06BF, 0x06BF, 0x06BF, 0x06BF}, + {0xFBA4, 0xFBA5, 0xFBA4, 0xFBA5}, {0xFBA6, 0xFBA7, 0xFBA8, 0xFBA9}, + {0x06C2, 0x06C2, 0x06C2, 0x06C2}, {0x06C3, 0x06C3, 0x06C3, 0x06C3}, + {0x06C4, 0x06C4, 0x06C4, 0x06C4}, {0xFBE0, 0xFBE1, 0xFBE0, 0xFBE1}, + {0xFBD9, 0xFBDA, 0xFBD9, 0xFBDA}, {0xFBD7, 0xFBD8, 0xFBD7, 0xFBD8}, + {0xFBDB, 0xFBDC, 0xFBDB, 0xFBDC}, {0xFBE2, 0xFBE3, 0xFBE2, 0xFBE3}, + {0x06CA, 0x06CA, 0x06CA, 0x06CA}, {0xFBDE, 0xFBDF, 0xFBDE, 0xFBDF}, + {0xFBFC, 0xFBFD, 0xFBFE, 0xFBFF}, {0x06CD, 0x06CD, 0x06CD, 0x06CD}, + {0x06CE, 0x06CE, 0x06CE, 0x06CE}, {0x06CF, 0x06CF, 0x06CF, 0x06CF}, + {0xFBE4, 0xFBE5, 0xFBE6, 0xFBE7}, {0x06D1, 0x06D1, 0x06D1, 0x06D1}, + {0xFBAE, 0xFBAF, 0xFBAE, 0xFBAF}, {0xFBB0, 0xFBB1, 0xFBB0, 0xFBB1}, + {0x06D4, 0x06D4, 0x06D4, 0x06D4}, {0x06D5, 0x06D5, 0x06D5, 0x06D5}, +}; + +const FX_ARAALEF gs_FX_AlefTable[] = { + {0x0622, 0xFEF5}, + {0x0623, 0xFEF7}, + {0x0625, 0xFEF9}, + {0x0627, 0xFEFB}, +}; + +const FX_ARASHADDA gs_FX_ShaddaTable[] = { + {0x064C, 0xFC5E}, {0x064D, 0xFC5F}, {0x064E, 0xFC60}, + {0x064F, 0xFC61}, {0x0650, 0xFC62}, +}; + +const int32_t gc_FX_BidiNTypes[] = { + FX_BIDICLASS_N, FX_BIDICLASS_L, FX_BIDICLASS_R, FX_BIDICLASS_AN, + FX_BIDICLASS_EN, FX_BIDICLASS_AL, FX_BIDICLASS_NSM, FX_BIDICLASS_CS, + FX_BIDICLASS_ES, FX_BIDICLASS_ET, FX_BIDICLASS_BN, FX_BIDICLASS_BN, + FX_BIDICLASS_N, FX_BIDICLASS_B, FX_BIDICLASS_RLO, FX_BIDICLASS_RLE, + FX_BIDICLASS_LRO, FX_BIDICLASS_LRE, FX_BIDICLASS_PDF, FX_BIDICLASS_ON, +}; + +const int32_t gc_FX_BidiWeakStates[][10] = { + {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn, FX_BWSxa, FX_BWSxa, + FX_BWSao, FX_BWSao, FX_BWSao}, + {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSxr, + FX_BWSro, FX_BWSro, FX_BWSrt}, + {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSxl, + FX_BWSlo, FX_BWSlo, FX_BWSlt}, + {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn, FX_BWSxa, FX_BWSao, + FX_BWSao, FX_BWSao, FX_BWSao}, + {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSro, + FX_BWSro, FX_BWSro, FX_BWSrt}, + {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSlo, + FX_BWSlo, FX_BWSlo, FX_BWSlt}, + {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSrt, + FX_BWSro, FX_BWSro, FX_BWSrt}, + {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSlt, + FX_BWSlo, FX_BWSlo, FX_BWSlt}, + {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn, FX_BWSxa, FX_BWScn, + FX_BWSac, FX_BWSao, FX_BWSao}, + {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSra, + FX_BWSrc, FX_BWSro, FX_BWSrt}, + {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSre, + FX_BWSrs, FX_BWSrs, FX_BWSret}, + {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSla, + FX_BWSlc, FX_BWSlo, FX_BWSlt}, + {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSle, + FX_BWSls, FX_BWSls, FX_BWSlet}, + {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn, FX_BWSxa, FX_BWSao, + FX_BWSao, FX_BWSao, FX_BWSao}, + {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSro, + FX_BWSro, FX_BWSro, FX_BWSrt}, + {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSro, + FX_BWSro, FX_BWSro, FX_BWSrt}, + {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSlo, + FX_BWSlo, FX_BWSlo, FX_BWSlt}, + {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSlo, + FX_BWSlo, FX_BWSlo, FX_BWSlt}, + {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSret, + FX_BWSro, FX_BWSro, FX_BWSret}, + {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSlet, + FX_BWSlo, FX_BWSlo, FX_BWSlet}, +}; + +const int32_t gc_FX_BidiWeakActions[][10] = { + {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxA, FX_BWAxxR, + FX_BWAxxR, FX_BWAxxN, FX_BWAxxN, FX_BWAxxN}, + {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, + FX_BWAxxR, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx}, + {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, + FX_BWAxxL, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx}, + {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxA, FX_BWAxxR, + FX_BWAxxN, FX_BWAxxN, FX_BWAxxN, FX_BWAxxN}, + {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, + FX_BWAxxN, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx}, + {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, + FX_BWAxxN, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx}, + {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAExE, FX_BWANxR, + FX_BWAxIx, FX_BWANxN, FX_BWANxN, FX_BWAxIx}, + {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWALxL, FX_BWANxR, + FX_BWAxIx, FX_BWANxN, FX_BWANxN, FX_BWAxIx}, + {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxA, FX_BWAxxR, + FX_BWAxxA, FX_BWAxIx, FX_BWAxxN, FX_BWAxxN}, + {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, + FX_BWAxxA, FX_BWAxIx, FX_BWAxxN, FX_BWAxIx}, + {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, + FX_BWAxxE, FX_BWAxIx, FX_BWAxIx, FX_BWAxxE}, + {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, + FX_BWAxxA, FX_BWAxIx, FX_BWAxxN, FX_BWAxIx}, + {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, + FX_BWAxxL, FX_BWAxIx, FX_BWAxIx, FX_BWAxxL}, + {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAAxx, FX_BWAAxA, FX_BWANxR, + FX_BWANxN, FX_BWANxN, FX_BWANxN, FX_BWANxN}, + {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAAxx, FX_BWANxE, FX_BWANxR, + FX_BWANxN, FX_BWANxN, FX_BWANxN, FX_BWANIx}, + {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAExE, FX_BWANxR, + FX_BWANxN, FX_BWANxN, FX_BWANxN, FX_BWANIx}, + {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAAxx, FX_BWANxL, FX_BWANxR, + FX_BWANxN, FX_BWANxN, FX_BWANxN, FX_BWANIx}, + {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWALxL, FX_BWANxR, + FX_BWANxN, FX_BWANxN, FX_BWANxN, FX_BWANIx}, + {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR, + FX_BWAxxE, FX_BWAxxN, FX_BWAxxN, FX_BWAxxE}, + {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR, + FX_BWAxxL, FX_BWAxxN, FX_BWAxxN, FX_BWAxxL}, +}; + +const int32_t gc_FX_BidiNeutralStates[][5] = { + {FX_BNSrn, FX_BNSl, FX_BNSr, FX_BNSr, FX_BNSr}, + {FX_BNSln, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl}, + {FX_BNSrn, FX_BNSl, FX_BNSr, FX_BNSr, FX_BNSr}, + {FX_BNSln, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl}, + {FX_BNSna, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl}, + {FX_BNSna, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl}, +}; +const int32_t gc_FX_BidiNeutralActions[][5] = { + {FX_BNAIn, 0, 0, 0, 0}, + {FX_BNAIn, 0, 0, 0, FX_BIDICLASS_L}, + {FX_BNAIn, FX_BNAEn, FX_BNARn, FX_BNARn, FX_BNARn}, + {FX_BNAIn, FX_BNALn, FX_BNAEn, FX_BNAEn, FX_BNALnL}, + {FX_BNAIn, 0, 0, 0, FX_BIDICLASS_L}, + {FX_BNAIn, FX_BNAEn, FX_BNARn, FX_BNARn, FX_BNAEn}, +}; + +const int32_t gc_FX_BidiAddLevel[][4] = { + {0, 1, 2, 2}, + {1, 0, 1, 1}, +}; + +const FX_ARBFORMTABLE* ParseChar(const CFX_Char* pTC, + FX_WCHAR& wChar, + FX_CHARTYPE& eType) { + if (!pTC) { + eType = FX_CHARTYPE_Unknown; + wChar = 0xFEFF; + return nullptr; + } + eType = pTC->GetCharType(); + wChar = (FX_WCHAR)pTC->m_wCharCode; + const FX_ARBFORMTABLE* pFT = FX_GetArabicFormTable(wChar); + if (!pFT || eType >= FX_CHARTYPE_ArabicNormal) + eType = FX_CHARTYPE_Unknown; + + return pFT; +} + +} // namespace + +const FX_ARBFORMTABLE* FX_GetArabicFormTable(FX_WCHAR unicode) { + if (unicode < 0x622 || unicode > 0x6d5) { + return nullptr; + } + return g_FX_ArabicFormTables + unicode - 0x622; +} +FX_WCHAR FX_GetArabicFromAlefTable(FX_WCHAR alef) { + static const int32_t s_iAlefCount = + sizeof(gs_FX_AlefTable) / sizeof(FX_ARAALEF); + for (int32_t iStart = 0; iStart < s_iAlefCount; iStart++) { + const FX_ARAALEF& v = gs_FX_AlefTable[iStart]; + if (v.wAlef == alef) { + return v.wIsolated; + } + } + return alef; +} +FX_WCHAR FX_GetArabicFromShaddaTable(FX_WCHAR shadda) { + static const int32_t s_iShaddaCount = + sizeof(gs_FX_ShaddaTable) / sizeof(FX_ARASHADDA); + for (int32_t iStart = 0; iStart < s_iShaddaCount; iStart++) { + const FX_ARASHADDA& v = gs_FX_ShaddaTable[iStart]; + if (v.wShadda == shadda) { + return v.wIsolated; + } + } + return shadda; +} + +namespace pdfium { +namespace arabic { + +bool IsArabicChar(FX_WCHAR wch) { + uint32_t dwRet = + kTextLayoutCodeProperties[(uint16_t)wch] & FX_CHARTYPEBITSMASK; + return dwRet >= FX_CHARTYPE_ArabicAlef; +} + +bool IsArabicFormChar(FX_WCHAR wch) { + return (kTextLayoutCodeProperties[(uint16_t)wch] & FX_CHARTYPEBITSMASK) == + FX_CHARTYPE_ArabicForm; +} + +FX_WCHAR GetFormChar(FX_WCHAR wch, FX_WCHAR prev, FX_WCHAR next) { + CFX_Char c(wch, kTextLayoutCodeProperties[(uint16_t)wch]); + CFX_Char p(prev, kTextLayoutCodeProperties[(uint16_t)prev]); + CFX_Char n(next, kTextLayoutCodeProperties[(uint16_t)next]); + return GetFormChar(&c, &p, &n); +} + +FX_WCHAR GetFormChar(const CFX_Char* cur, + const CFX_Char* prev, + const CFX_Char* next) { + FX_CHARTYPE eCur; + FX_WCHAR wCur; + const FX_ARBFORMTABLE* ft = ParseChar(cur, wCur, eCur); + if (eCur < FX_CHARTYPE_ArabicAlef || eCur >= FX_CHARTYPE_ArabicNormal) { + return wCur; + } + FX_CHARTYPE ePrev; + FX_WCHAR wPrev; + ParseChar(prev, wPrev, ePrev); + if (wPrev == 0x0644 && eCur == FX_CHARTYPE_ArabicAlef) { + return 0xFEFF; + } + FX_CHARTYPE eNext; + FX_WCHAR wNext; + ParseChar(next, wNext, eNext); + bool bAlef = (eNext == FX_CHARTYPE_ArabicAlef && wCur == 0x644); + if (ePrev < FX_CHARTYPE_ArabicAlef) { + if (bAlef) { + return FX_GetArabicFromAlefTable(wNext); + } + return (eNext < FX_CHARTYPE_ArabicAlef) ? ft->wIsolated : ft->wInitial; + } + if (bAlef) { + wCur = FX_GetArabicFromAlefTable(wNext); + return (ePrev != FX_CHARTYPE_ArabicDistortion) ? wCur : ++wCur; + } + if (ePrev == FX_CHARTYPE_ArabicAlef || ePrev == FX_CHARTYPE_ArabicSpecial) { + return (eNext < FX_CHARTYPE_ArabicAlef) ? ft->wIsolated : ft->wInitial; + } + return (eNext < FX_CHARTYPE_ArabicAlef) ? ft->wFinal : ft->wMedial; +} + +} // namespace arabic +} // namespace pdfium + +void FX_BidiReverseString(CFX_WideString& wsText, + int32_t iStart, + int32_t iCount) { + ASSERT(iStart > -1 && iStart < wsText.GetLength()); + ASSERT(iCount >= 0 && iStart + iCount <= wsText.GetLength()); + FX_WCHAR wch; + FX_WCHAR* pStart = const_cast(wsText.c_str()); + pStart += iStart; + FX_WCHAR* pEnd = pStart + iCount - 1; + while (pStart < pEnd) { + wch = *pStart; + *pStart++ = *pEnd; + *pEnd-- = wch; + } +} + + +int32_t FX_BidiGetDeferredNeutrals(int32_t iAction, int32_t iLevel) { + iAction = (iAction >> 4) & 0xF; + if (iAction == (FX_BIDINEUTRALACTION_En >> 4)) { + return FX_BidiDirection(iLevel); + } else { + return iAction; + } +} + +int32_t FX_BidiGetResolvedNeutrals(int32_t iAction) { + iAction = (iAction & 0xF); + if (iAction == FX_BIDINEUTRALACTION_In) { + return 0; + } else { + return iAction; + } +} + +int32_t FX_BidiReorderLevel(int32_t iBaseLevel, + CFX_WideString& wsText, + const CFX_ArrayTemplate& levels, + int32_t iStart, + bool bReverse) { + ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); + ASSERT(wsText.GetLength() == levels.GetSize()); + ASSERT(iStart >= 0 && iStart < wsText.GetLength()); + int32_t iSize = wsText.GetLength(); + if (iSize < 1) { + return 0; + } + bReverse = bReverse || FX_IsOdd(iBaseLevel); + int32_t i = iStart, iLevel; + for (; i < iSize; i++) { + if ((iLevel = levels.GetAt(i)) == iBaseLevel) { + continue; + } + if (iLevel < iBaseLevel) { + break; + } + i += FX_BidiReorderLevel(iBaseLevel + 1, wsText, levels, i, bReverse) - 1; + } + int32_t iCount = i - iStart; + if (bReverse && iCount > 1) { + FX_BidiReverseString(wsText, iStart, iCount); + } + return iCount; +} +void FX_BidiReorder(int32_t iBaseLevel, + CFX_WideString& wsText, + const CFX_ArrayTemplate& levels) { + ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); + ASSERT(wsText.GetLength() == levels.GetSize()); + int32_t iSize = wsText.GetLength(); + if (iSize < 1) { + return; + } + int32_t i = 0; + while (i < iSize) { + i += FX_BidiReorderLevel(iBaseLevel, wsText, levels, i, false); + } +} + +template +class CFX_BidiLineTemplate { + public: + void FX_BidiReverseString(std::vector& chars, + int32_t iStart, + int32_t iCount) { + ASSERT(iStart >= 0 && iStart < pdfium::CollectionSize(chars)); + ASSERT(iCount >= 0 && + iStart + iCount <= pdfium::CollectionSize(chars)); + std::reverse(chars.begin() + iStart, chars.begin() + iStart + iCount); + } + + void FX_BidiSetDeferredRun(std::vector& chars, + bool bClass, + int32_t iStart, + int32_t iCount, + int32_t iValue) { + ASSERT(iStart >= 0 && iStart <= pdfium::CollectionSize(chars)); + ASSERT(iStart - iCount > -1); + int32_t iLast = iStart - iCount; + if (bClass) { + for (int32_t i = iStart - 1; i >= iLast; i--) + chars[i].m_iBidiClass = (int16_t)iValue; + } else { + for (int32_t i = iStart - 1; i >= iLast; i--) + chars[i].m_iBidiLevel = (int16_t)iValue; + } + } + + void FX_BidiClassify(std::vector& chars, int32_t iCount, bool bWS) { + ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize(chars)); + if (bWS) { + for (int32_t i = 0; i < iCount; i++) { + chars[i].m_iBidiClass = + (int16_t)(chars[i].m_dwCharProps & FX_BIDICLASSBITSMASK) >> + FX_BIDICLASSBITS; + } + } else { + for (int32_t i = 0; i < iCount; i++) { + chars[i].m_iBidiClass = (int16_t) + gc_FX_BidiNTypes[(chars[i].m_dwCharProps & FX_BIDICLASSBITSMASK) >> + FX_BIDICLASSBITS]; + } + } + } + + void FX_BidiResolveExplicit(std::vector& chars, + int32_t iCount, + int32_t iBaseLevel) { + ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize(chars)); + ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); + for (int32_t i = 0; i < iCount; i++) + chars[i].m_iBidiLevel = static_cast(iBaseLevel); + } + + void FX_BidiResolveWeak(std::vector& chars, + int32_t iCount, + int32_t iBaseLevel) { + ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize(chars)); + iCount--; + if (iCount < 1) { + return; + } + baseType *pTC, *pTCNext; + int32_t iLevelCur = iBaseLevel; + int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BWSxr : FX_BWSxl; + int32_t i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction; + for (; i <= iCount; i++) { + pTC = &chars[i]; + iClsCur = pTC->m_iBidiClass; + if (iClsCur == FX_BIDICLASS_BN) { + pTC->m_iBidiLevel = (int16_t)iLevelCur; + if (i == iCount && iLevelCur != iBaseLevel) { + iClsCur = FX_BidiDirection(iLevelCur); + pTC->m_iBidiClass = (int16_t)iClsCur; + } else if (i < iCount) { + pTCNext = &chars[i + 1]; + int32_t iLevelNext, iLevelNew; + iClsNew = pTCNext->m_iBidiClass; + iLevelNext = pTCNext->m_iBidiLevel; + if (iClsNew != FX_BIDICLASS_BN && iLevelCur != iLevelNext) { + iLevelNew = iLevelNext; + if (iLevelCur > iLevelNew) { + iLevelNew = iLevelCur; + } + pTC->m_iBidiLevel = (int16_t)iLevelNew; + iClsCur = FX_BidiDirection(iLevelNew); + pTC->m_iBidiClass = (int16_t)iClsCur; + iLevelCur = iLevelNext; + } else { + if (iNum > 0) { + iNum++; + } + continue; + } + } else { + if (iNum > 0) { + iNum++; + } + continue; + } + } + ASSERT(iClsCur <= FX_BIDICLASS_BN); + iAction = gc_FX_BidiWeakActions[iState][iClsCur]; + iClsRun = FX_BidiGetDeferredType(iAction); + if (iClsRun != FX_BIDIWEAKACTION_XX && iNum > 0) { + FX_BidiSetDeferredRun(chars, true, i, iNum, iClsRun); + iNum = 0; + } + iClsNew = FX_BidiGetResolvedType(iAction); + if (iClsNew != FX_BIDIWEAKACTION_XX) { + pTC->m_iBidiClass = (int16_t)iClsNew; + } + if (FX_BIDIWEAKACTION_IX & iAction) { + iNum++; + } + iState = gc_FX_BidiWeakStates[iState][iClsCur]; + } + if (iNum > 0) { + iClsCur = FX_BidiDirection(iBaseLevel); + iClsRun = FX_BidiGetDeferredType(gc_FX_BidiWeakActions[iState][iClsCur]); + if (iClsRun != FX_BIDIWEAKACTION_XX) { + FX_BidiSetDeferredRun(chars, true, i, iNum, iClsRun); + } + } + } + + void FX_BidiResolveNeutrals(std::vector& chars, + int32_t iCount, + int32_t iBaseLevel) { + ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize(chars)); + ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); + iCount--; + if (iCount < 1) { + return; + } + baseType* pTC; + int32_t iLevel = iBaseLevel; + int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BNSr : FX_BNSl; + int32_t i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction; + for (; i <= iCount; i++) { + pTC = &chars[i]; + iClsCur = pTC->m_iBidiClass; + if (iClsCur == FX_BIDICLASS_BN) { + if (iNum) { + iNum++; + } + continue; + } + ASSERT(iClsCur < FX_BIDICLASS_AL); + iAction = gc_FX_BidiNeutralActions[iState][iClsCur]; + iClsRun = FX_BidiGetDeferredNeutrals(iAction, iLevel); + if (iClsRun != FX_BIDICLASS_N && iNum > 0) { + FX_BidiSetDeferredRun(chars, true, i, iNum, iClsRun); + iNum = 0; + } + iClsNew = FX_BidiGetResolvedNeutrals(iAction); + if (iClsNew != FX_BIDICLASS_N) { + pTC->m_iBidiClass = (int16_t)iClsNew; + } + if (FX_BIDINEUTRALACTION_In & iAction) { + iNum++; + } + iState = gc_FX_BidiNeutralStates[iState][iClsCur]; + iLevel = pTC->m_iBidiLevel; + } + if (iNum > 0) { + iClsCur = FX_BidiDirection(iLevel); + iClsRun = FX_BidiGetDeferredNeutrals( + gc_FX_BidiNeutralActions[iState][iClsCur], iLevel); + if (iClsRun != FX_BIDICLASS_N) { + FX_BidiSetDeferredRun(chars, true, i, iNum, iClsRun); + } + } + } + + void FX_BidiResolveImplicit(std::vector& chars, int32_t iCount) { + ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize(chars)); + for (int32_t i = 0; i < iCount; i++) { + int32_t iCls = chars[i].m_iBidiClass; + if (iCls == FX_BIDICLASS_BN) { + continue; + } + ASSERT(iCls > FX_BIDICLASS_ON && iCls < FX_BIDICLASS_AL); + int32_t iLevel = chars[i].m_iBidiLevel; + iLevel += gc_FX_BidiAddLevel[FX_IsOdd(iLevel)][iCls - 1]; + chars[i].m_iBidiLevel = (int16_t)iLevel; + } + } + + void FX_BidiResolveWhitespace(std::vector& chars, + int32_t iCount, + int32_t iBaseLevel) { + ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize(chars)); + ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); + if (iCount < 1) { + return; + } + iCount--; + int32_t iLevel = iBaseLevel; + int32_t i = 0, iNum = 0; + for (; i <= iCount; i++) { + switch (chars[i].m_iBidiClass) { + case FX_BIDICLASS_WS: + iNum++; + break; + case FX_BIDICLASS_RLE: + case FX_BIDICLASS_LRE: + case FX_BIDICLASS_LRO: + case FX_BIDICLASS_RLO: + case FX_BIDICLASS_PDF: + case FX_BIDICLASS_BN: + chars[i].m_iBidiLevel = (int16_t)iLevel; + iNum++; + break; + case FX_BIDICLASS_S: + case FX_BIDICLASS_B: + if (iNum > 0) { + FX_BidiSetDeferredRun(chars, false, i, iNum, iBaseLevel); + } + chars[i].m_iBidiLevel = (int16_t)iBaseLevel; + iNum = 0; + break; + default: + iNum = 0; + break; + } + iLevel = chars[i].m_iBidiLevel; + } + if (iNum > 0) { + FX_BidiSetDeferredRun(chars, false, i, iNum, iBaseLevel); + } + } + + int32_t FX_BidiReorderLevel(std::vector& chars, + int32_t iCount, + int32_t iBaseLevel, + int32_t iStart, + bool bReverse) { + ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize(chars)); + ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); + ASSERT(iStart >= 0 && iStart < iCount); + if (iCount < 1) { + return 0; + } + bReverse = bReverse || FX_IsOdd(iBaseLevel); + int32_t i = iStart; + for (; i < iCount; i++) { + int32_t iLevel = chars[i].m_iBidiLevel; + if (iLevel == iBaseLevel) + continue; + if (iLevel < iBaseLevel) + break; + i += FX_BidiReorderLevel(chars, iCount, iBaseLevel + 1, i, bReverse) - 1; + } + int32_t iNum = i - iStart; + if (bReverse && iNum > 1) { + FX_BidiReverseString(chars, iStart, iNum); + } + return iNum; + } + + void FX_BidiReorder(std::vector& chars, + int32_t iCount, + int32_t iBaseLevel) { + ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize(chars)); + ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); + int32_t i = 0; + while (i < iCount) { + i += FX_BidiReorderLevel(chars, iCount, iBaseLevel, i, false); + } + } + + void FX_BidiPosition(std::vector& chars, int32_t iCount) { + ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize(chars)); + for (int32_t i = 0; i < iCount; ++i) + chars[chars[i].m_iBidiPos].m_iBidiOrder = i; + } + + void FX_BidiLine(std::vector& chars, + int32_t iCount, + int32_t iBaseLevel) { + ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize(chars)); + if (iCount < 2) { + return; + } + FX_BidiClassify(chars, iCount, false); + FX_BidiResolveExplicit(chars, iCount, iBaseLevel); + FX_BidiResolveWeak(chars, iCount, iBaseLevel); + FX_BidiResolveNeutrals(chars, iCount, iBaseLevel); + FX_BidiResolveImplicit(chars, iCount); + FX_BidiClassify(chars, iCount, true); + FX_BidiResolveWhitespace(chars, iCount, iBaseLevel); + FX_BidiReorder(chars, iCount, iBaseLevel); + FX_BidiPosition(chars, iCount); + } +}; + +void FX_BidiLine(std::vector& chars, + int32_t iCount, + int32_t iBaseLevel) { + CFX_BidiLineTemplate blt; + blt.FX_BidiLine(chars, iCount, iBaseLevel); +} +void FX_BidiLine(std::vector& chars, + int32_t iCount, + int32_t iBaseLevel) { + CFX_BidiLineTemplate blt; + blt.FX_BidiLine(chars, iCount, iBaseLevel); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_arabic.h b/modules/pdfium/pdfium/core/fxcrt/fx_arabic.h new file mode 100644 index 000000000000..e7ba079f4379 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_arabic.h @@ -0,0 +1,188 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FX_ARABIC_H_ +#define CORE_FXCRT_FX_ARABIC_H_ + +#include "core/fxcrt/fx_arb.h" + +#define FX_BIDIMAXLEVEL 61 +#define FX_BidiDirection(a) (FX_IsOdd(a) ? FX_BIDICLASS_R : FX_BIDICLASS_L) +#define FX_BidiGetDeferredType(a) (((a) >> 4) & 0x0F) +#define FX_BidiGetResolvedType(a) ((a)&0x0F) + +namespace pdfium { +namespace arabic { + +bool IsArabicChar(FX_WCHAR wch); +bool IsArabicFormChar(FX_WCHAR wch); +FX_WCHAR GetFormChar(FX_WCHAR wch, FX_WCHAR prev = 0, FX_WCHAR next = 0); +FX_WCHAR GetFormChar(const CFX_Char* cur, + const CFX_Char* prev, + const CFX_Char* next); + +} // namespace arabic +} // namespace pdfium + +void FX_BidiReverseString(CFX_WideString& wsText, + int32_t iStart, + int32_t iCount); +void FX_BidiSetDeferredRun(CFX_ArrayTemplate& values, + int32_t iStart, + int32_t iCount, + int32_t iValue); +void FX_BidiClassify(const CFX_WideString& wsText, + CFX_ArrayTemplate& classes, + bool bWS = false); +int32_t FX_BidiResolveExplicit(int32_t iBaseLevel, + int32_t iDirection, + CFX_ArrayTemplate& classes, + CFX_ArrayTemplate& levels, + int32_t iStart, + int32_t iCount, + int32_t iNest = 0); + +enum FX_BIDIWEAKSTATE { + FX_BIDIWEAKSTATE_xa = 0, + FX_BIDIWEAKSTATE_xr, + FX_BIDIWEAKSTATE_xl, + FX_BIDIWEAKSTATE_ao, + FX_BIDIWEAKSTATE_ro, + FX_BIDIWEAKSTATE_lo, + FX_BIDIWEAKSTATE_rt, + FX_BIDIWEAKSTATE_lt, + FX_BIDIWEAKSTATE_cn, + FX_BIDIWEAKSTATE_ra, + FX_BIDIWEAKSTATE_re, + FX_BIDIWEAKSTATE_la, + FX_BIDIWEAKSTATE_le, + FX_BIDIWEAKSTATE_ac, + FX_BIDIWEAKSTATE_rc, + FX_BIDIWEAKSTATE_rs, + FX_BIDIWEAKSTATE_lc, + FX_BIDIWEAKSTATE_ls, + FX_BIDIWEAKSTATE_ret, + FX_BIDIWEAKSTATE_let, +}; +#define FX_BWSxa FX_BIDIWEAKSTATE_xa +#define FX_BWSxr FX_BIDIWEAKSTATE_xr +#define FX_BWSxl FX_BIDIWEAKSTATE_xl +#define FX_BWSao FX_BIDIWEAKSTATE_ao +#define FX_BWSro FX_BIDIWEAKSTATE_ro +#define FX_BWSlo FX_BIDIWEAKSTATE_lo +#define FX_BWSrt FX_BIDIWEAKSTATE_rt +#define FX_BWSlt FX_BIDIWEAKSTATE_lt +#define FX_BWScn FX_BIDIWEAKSTATE_cn +#define FX_BWSra FX_BIDIWEAKSTATE_ra +#define FX_BWSre FX_BIDIWEAKSTATE_re +#define FX_BWSla FX_BIDIWEAKSTATE_la +#define FX_BWSle FX_BIDIWEAKSTATE_le +#define FX_BWSac FX_BIDIWEAKSTATE_ac +#define FX_BWSrc FX_BIDIWEAKSTATE_rc +#define FX_BWSrs FX_BIDIWEAKSTATE_rs +#define FX_BWSlc FX_BIDIWEAKSTATE_lc +#define FX_BWSls FX_BIDIWEAKSTATE_ls +#define FX_BWSret FX_BIDIWEAKSTATE_ret +#define FX_BWSlet FX_BIDIWEAKSTATE_let + +enum FX_BIDIWEAKACTION { + FX_BIDIWEAKACTION_IX = 0x100, + FX_BIDIWEAKACTION_XX = 0x0F, + FX_BIDIWEAKACTION_xxx = (0x0F << 4) + 0x0F, + FX_BIDIWEAKACTION_xIx = 0x100 + FX_BIDIWEAKACTION_xxx, + FX_BIDIWEAKACTION_xxN = (0x0F << 4) + FX_BIDICLASS_ON, + FX_BIDIWEAKACTION_xxE = (0x0F << 4) + FX_BIDICLASS_EN, + FX_BIDIWEAKACTION_xxA = (0x0F << 4) + FX_BIDICLASS_AN, + FX_BIDIWEAKACTION_xxR = (0x0F << 4) + FX_BIDICLASS_R, + FX_BIDIWEAKACTION_xxL = (0x0F << 4) + FX_BIDICLASS_L, + FX_BIDIWEAKACTION_Nxx = (FX_BIDICLASS_ON << 4) + 0x0F, + FX_BIDIWEAKACTION_Axx = (FX_BIDICLASS_AN << 4) + 0x0F, + FX_BIDIWEAKACTION_ExE = (FX_BIDICLASS_EN << 4) + FX_BIDICLASS_EN, + FX_BIDIWEAKACTION_NIx = (FX_BIDICLASS_ON << 4) + 0x0F + 0x100, + FX_BIDIWEAKACTION_NxN = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_ON, + FX_BIDIWEAKACTION_NxR = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_R, + FX_BIDIWEAKACTION_NxE = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_EN, + FX_BIDIWEAKACTION_AxA = (FX_BIDICLASS_AN << 4) + FX_BIDICLASS_AN, + FX_BIDIWEAKACTION_NxL = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_L, + FX_BIDIWEAKACTION_LxL = (FX_BIDICLASS_L << 4) + FX_BIDICLASS_L, + FX_BIDIWEAKACTION_xIL = (0x0F << 4) + FX_BIDICLASS_L + 0x100, + FX_BIDIWEAKACTION_AxR = (FX_BIDICLASS_AN << 4) + FX_BIDICLASS_R, + FX_BIDIWEAKACTION_Lxx = (FX_BIDICLASS_L << 4) + 0x0F, +}; +#define FX_BWAIX FX_BIDIWEAKACTION_IX +#define FX_BWAXX FX_BIDIWEAKACTION_XX +#define FX_BWAxxx FX_BIDIWEAKACTION_xxx +#define FX_BWAxIx FX_BIDIWEAKACTION_xIx +#define FX_BWAxxN FX_BIDIWEAKACTION_xxN +#define FX_BWAxxE FX_BIDIWEAKACTION_xxE +#define FX_BWAxxA FX_BIDIWEAKACTION_xxA +#define FX_BWAxxR FX_BIDIWEAKACTION_xxR +#define FX_BWAxxL FX_BIDIWEAKACTION_xxL +#define FX_BWANxx FX_BIDIWEAKACTION_Nxx +#define FX_BWAAxx FX_BIDIWEAKACTION_Axx +#define FX_BWAExE FX_BIDIWEAKACTION_ExE +#define FX_BWANIx FX_BIDIWEAKACTION_NIx +#define FX_BWANxN FX_BIDIWEAKACTION_NxN +#define FX_BWANxR FX_BIDIWEAKACTION_NxR +#define FX_BWANxE FX_BIDIWEAKACTION_NxE +#define FX_BWAAxA FX_BIDIWEAKACTION_AxA +#define FX_BWANxL FX_BIDIWEAKACTION_NxL +#define FX_BWALxL FX_BIDIWEAKACTION_LxL +#define FX_BWAxIL FX_BIDIWEAKACTION_xIL +#define FX_BWAAxR FX_BIDIWEAKACTION_AxR +#define FX_BWALxx FX_BIDIWEAKACTION_Lxx + +void FX_BidiResolveWeak(int32_t iBaseLevel, + CFX_ArrayTemplate& classes, + CFX_ArrayTemplate& levels); +enum FX_BIDINEUTRALSTATE { + FX_BIDINEUTRALSTATE_r = 0, + FX_BIDINEUTRALSTATE_l, + FX_BIDINEUTRALSTATE_rn, + FX_BIDINEUTRALSTATE_ln, + FX_BIDINEUTRALSTATE_a, + FX_BIDINEUTRALSTATE_na, +}; +#define FX_BNSr FX_BIDINEUTRALSTATE_r +#define FX_BNSl FX_BIDINEUTRALSTATE_l +#define FX_BNSrn FX_BIDINEUTRALSTATE_rn +#define FX_BNSln FX_BIDINEUTRALSTATE_ln +#define FX_BNSa FX_BIDINEUTRALSTATE_a +#define FX_BNSna FX_BIDINEUTRALSTATE_na +enum FX_BIDINEUTRALACTION { + FX_BIDINEUTRALACTION_nL = FX_BIDICLASS_L, + FX_BIDINEUTRALACTION_En = (FX_BIDICLASS_AN << 4), + FX_BIDINEUTRALACTION_Rn = (FX_BIDICLASS_R << 4), + FX_BIDINEUTRALACTION_Ln = (FX_BIDICLASS_L << 4), + FX_BIDINEUTRALACTION_In = FX_BIDIWEAKACTION_IX, + FX_BIDINEUTRALACTION_LnL = (FX_BIDICLASS_L << 4) + FX_BIDICLASS_L, +}; +#define FX_BNAnL FX_BIDINEUTRALACTION_nL +#define FX_BNAEn FX_BIDINEUTRALACTION_En +#define FX_BNARn FX_BIDINEUTRALACTION_Rn +#define FX_BNALn FX_BIDINEUTRALACTION_Ln +#define FX_BNAIn FX_BIDINEUTRALACTION_In +#define FX_BNALnL FX_BIDINEUTRALACTION_LnL +int32_t FX_BidiGetDeferredNeutrals(int32_t iAction, int32_t iLevel); +int32_t FX_BidiGetResolvedNeutrals(int32_t iAction); +void FX_BidiResolveNeutrals(int32_t iBaseLevel, + CFX_ArrayTemplate& classes, + const CFX_ArrayTemplate& levels); +void FX_BidiResolveImplicit(const CFX_ArrayTemplate& classes, + CFX_ArrayTemplate& levels); +void FX_BidiResolveWhitespace(int32_t iBaseLevel, + const CFX_ArrayTemplate& classes, + CFX_ArrayTemplate& levels); +int32_t FX_BidiReorderLevel(int32_t iBaseLevel, + CFX_WideString& wsText, + const CFX_ArrayTemplate& levels, + int32_t iStart, + bool bReverse = false); +void FX_BidiReorder(int32_t iBaseLevel, + CFX_WideString& wsText, + const CFX_ArrayTemplate& levels); + +#endif // CORE_FXCRT_FX_ARABIC_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_arb.h b/modules/pdfium/pdfium/core/fxcrt/fx_arb.h new file mode 100644 index 000000000000..d24197c7e5c7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_arb.h @@ -0,0 +1,51 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FX_ARB_H_ +#define CORE_FXCRT_FX_ARB_H_ + +#include + +#include "core/fxcrt/fx_system.h" +#include "core/fxcrt/fx_ucd.h" + +struct FX_ARBFORMTABLE { + uint16_t wIsolated; + uint16_t wFinal; + uint16_t wInitial; + uint16_t wMedial; +}; + +struct FX_ARAALEF { + uint16_t wAlef; + uint16_t wIsolated; +}; + +struct FX_ARASHADDA { + uint16_t wShadda; + uint16_t wIsolated; +}; + +const FX_ARBFORMTABLE* FX_GetArabicFormTable(FX_WCHAR unicode); +FX_WCHAR FX_GetArabicFromAlefTable(FX_WCHAR alef); +FX_WCHAR FX_GetArabicFromShaddaTable(FX_WCHAR shadda); + +enum FX_ARBPOSITION { + FX_ARBPOSITION_Isolated = 0, + FX_ARBPOSITION_Final, + FX_ARBPOSITION_Initial, + FX_ARBPOSITION_Medial, +}; + +void FX_BidiLine(CFX_WideString& wsText, int32_t iBaseLevel = 0); +void FX_BidiLine(std::vector& chars, + int32_t iCount, + int32_t iBaseLevel = 0); +void FX_BidiLine(std::vector& chars, + int32_t iCount, + int32_t iBaseLevel = 0); + +#endif // CORE_FXCRT_FX_ARB_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic.h b/modules/pdfium/pdfium/core/fxcrt/fx_basic.h new file mode 100644 index 000000000000..18413b2e7066 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic.h @@ -0,0 +1,559 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FX_BASIC_H_ +#define CORE_FXCRT_FX_BASIC_H_ + +#include +#include + +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_memory.h" +#include "core/fxcrt/fx_stream.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +#ifdef PDF_ENABLE_XFA +#define FX_IsOdd(a) ((a)&1) +#endif // PDF_ENABLE_XFA + +class CFX_BinaryBuf { + public: + CFX_BinaryBuf(); + explicit CFX_BinaryBuf(FX_STRSIZE size); + ~CFX_BinaryBuf(); + + uint8_t* GetBuffer() const { return m_pBuffer.get(); } + FX_STRSIZE GetSize() const { return m_DataSize; } + + void Clear(); + void EstimateSize(FX_STRSIZE size, FX_STRSIZE alloc_step = 0); + void AppendBlock(const void* pBuf, FX_STRSIZE size); + void AppendString(const CFX_ByteString& str) { + AppendBlock(str.c_str(), str.GetLength()); + } + + void AppendByte(uint8_t byte) { + ExpandBuf(1); + m_pBuffer.get()[m_DataSize++] = byte; + } + + void InsertBlock(FX_STRSIZE pos, const void* pBuf, FX_STRSIZE size); + void Delete(int start_index, int count); + + // Releases ownership of |m_pBuffer| and returns it. + std::unique_ptr DetachBuffer(); + + protected: + void ExpandBuf(FX_STRSIZE size); + + FX_STRSIZE m_AllocStep; + FX_STRSIZE m_AllocSize; + FX_STRSIZE m_DataSize; + std::unique_ptr m_pBuffer; +}; + +class CFX_ByteTextBuf : public CFX_BinaryBuf { + public: + FX_STRSIZE GetLength() const { return m_DataSize; } + CFX_ByteString MakeString() const { + return CFX_ByteString(m_pBuffer.get(), m_DataSize); + } + CFX_ByteStringC AsStringC() const { + return CFX_ByteStringC(m_pBuffer.get(), m_DataSize); + } + + void AppendChar(int ch) { AppendByte(static_cast(ch)); } + CFX_ByteTextBuf& operator<<(int i); + CFX_ByteTextBuf& operator<<(uint32_t i); + CFX_ByteTextBuf& operator<<(double f); + CFX_ByteTextBuf& operator<<(const FX_CHAR* pStr) { + return *this << CFX_ByteStringC(pStr); + } + CFX_ByteTextBuf& operator<<(const CFX_ByteString& str) { + return *this << str.AsStringC(); + } + CFX_ByteTextBuf& operator<<(const CFX_ByteStringC& lpsz); + CFX_ByteTextBuf& operator<<(const CFX_ByteTextBuf& buf); +}; + +class CFX_WideTextBuf : public CFX_BinaryBuf { + public: + void AppendChar(FX_WCHAR wch); + FX_STRSIZE GetLength() const { return m_DataSize / sizeof(FX_WCHAR); } + FX_WCHAR* GetBuffer() const { + return reinterpret_cast(m_pBuffer.get()); + } + + CFX_WideStringC AsStringC() const { + return CFX_WideStringC(reinterpret_cast(m_pBuffer.get()), + m_DataSize / sizeof(FX_WCHAR)); + } + CFX_WideString MakeString() const { + return CFX_WideString(reinterpret_cast(m_pBuffer.get()), + m_DataSize / sizeof(FX_WCHAR)); + } + + void Delete(int start_index, int count) { + CFX_BinaryBuf::Delete(start_index * sizeof(FX_WCHAR), + count * sizeof(FX_WCHAR)); + } + + CFX_WideTextBuf& operator<<(int i); + CFX_WideTextBuf& operator<<(double f); + CFX_WideTextBuf& operator<<(const FX_WCHAR* lpsz); + CFX_WideTextBuf& operator<<(const CFX_WideStringC& str); + CFX_WideTextBuf& operator<<(const CFX_WideString& str); + CFX_WideTextBuf& operator<<(const CFX_WideTextBuf& buf); +}; + +class CFX_FileBufferArchive { + public: + CFX_FileBufferArchive(); + ~CFX_FileBufferArchive(); + + void Clear(); + bool Flush(); + int32_t AppendBlock(const void* pBuf, size_t size); + int32_t AppendByte(uint8_t byte); + int32_t AppendDWord(uint32_t i); + int32_t AppendString(const CFX_ByteStringC& lpsz); + void AttachFile(const CFX_RetainPtr& pFile); + + private: + static const size_t kBufSize = 32768; + + size_t m_Length; + std::unique_ptr m_pBuffer; + CFX_RetainPtr m_pFile; +}; + +class CFX_CharMap { + public: + static CFX_ByteString GetByteString(uint16_t codepage, + const CFX_WideStringC& wstr); + + static CFX_WideString GetWideString(uint16_t codepage, + const CFX_ByteStringC& bstr); + + CFX_CharMap() = delete; +}; + +class CFX_UTF8Decoder { + public: + CFX_UTF8Decoder() { m_PendingBytes = 0; } + + void Clear(); + + void Input(uint8_t byte); + + void AppendChar(uint32_t ch); + + void ClearStatus() { m_PendingBytes = 0; } + + CFX_WideStringC GetResult() const { return m_Buffer.AsStringC(); } + + protected: + int m_PendingBytes; + + uint32_t m_PendingChar; + + CFX_WideTextBuf m_Buffer; +}; + +class CFX_UTF8Encoder { + public: + CFX_UTF8Encoder() {} + + void Input(FX_WCHAR unicode); + void AppendStr(const CFX_ByteStringC& str) { m_Buffer << str; } + CFX_ByteStringC GetResult() const { return m_Buffer.AsStringC(); } + + protected: + CFX_ByteTextBuf m_Buffer; +}; + +class CFX_BasicArray { + protected: + explicit CFX_BasicArray(int unit_size); + CFX_BasicArray(const CFX_BasicArray&) = delete; + ~CFX_BasicArray(); + + bool SetSize(int nNewSize); + bool Append(const CFX_BasicArray& src); + bool Copy(const CFX_BasicArray& src); + uint8_t* InsertSpaceAt(int nIndex, int nCount); + bool RemoveAt(int nIndex, int nCount); + bool InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray); + const void* GetDataPtr(int index) const; + + protected: + uint8_t* m_pData; + int m_nSize; + int m_nMaxSize; + int m_nUnitSize; +}; + +template +class CFX_ArrayTemplate : public CFX_BasicArray { + public: + CFX_ArrayTemplate() : CFX_BasicArray(sizeof(TYPE)) {} + + int GetSize() const { return m_nSize; } + + int GetUpperBound() const { return m_nSize - 1; } + + bool SetSize(int nNewSize) { return CFX_BasicArray::SetSize(nNewSize); } + + void RemoveAll() { SetSize(0); } + + const TYPE GetAt(int nIndex) const { + if (nIndex < 0 || nIndex >= m_nSize) { + PDFIUM_IMMEDIATE_CRASH(); + } + return ((const TYPE*)m_pData)[nIndex]; + } + + bool SetAt(int nIndex, TYPE newElement) { + if (nIndex < 0 || nIndex >= m_nSize) { + return false; + } + ((TYPE*)m_pData)[nIndex] = newElement; + return true; + } + + TYPE& ElementAt(int nIndex) { + if (nIndex < 0 || nIndex >= m_nSize) { + PDFIUM_IMMEDIATE_CRASH(); + } + return ((TYPE*)m_pData)[nIndex]; + } + + const TYPE* GetData() const { return (const TYPE*)m_pData; } + + TYPE* GetData() { return (TYPE*)m_pData; } + + bool SetAtGrow(int nIndex, TYPE newElement) { + if (nIndex < 0) + return false; + + if (nIndex >= m_nSize && !SetSize(nIndex + 1)) + return false; + + ((TYPE*)m_pData)[nIndex] = newElement; + return true; + } + + bool Add(TYPE newElement) { + if (m_nSize < m_nMaxSize) { + m_nSize++; + } else if (!SetSize(m_nSize + 1)) { + return false; + } + ((TYPE*)m_pData)[m_nSize - 1] = newElement; + return true; + } + + bool Append(const CFX_ArrayTemplate& src) { + return CFX_BasicArray::Append(src); + } + + bool Copy(const CFX_ArrayTemplate& src) { return CFX_BasicArray::Copy(src); } + + TYPE* GetDataPtr(int index) { + return (TYPE*)CFX_BasicArray::GetDataPtr(index); + } + + TYPE* AddSpace() { return (TYPE*)CFX_BasicArray::InsertSpaceAt(m_nSize, 1); } + + TYPE* InsertSpaceAt(int nIndex, int nCount) { + return (TYPE*)CFX_BasicArray::InsertSpaceAt(nIndex, nCount); + } + + const TYPE operator[](int nIndex) const { + if (nIndex < 0 || nIndex >= m_nSize) { + *(volatile char*)0 = '\0'; + } + return ((const TYPE*)m_pData)[nIndex]; + } + + TYPE& operator[](int nIndex) { + if (nIndex < 0 || nIndex >= m_nSize) { + *(volatile char*)0 = '\0'; + } + return ((TYPE*)m_pData)[nIndex]; + } + + bool InsertAt(int nIndex, TYPE newElement, int nCount = 1) { + if (!InsertSpaceAt(nIndex, nCount)) { + return false; + } + while (nCount--) { + ((TYPE*)m_pData)[nIndex++] = newElement; + } + return true; + } + + bool RemoveAt(int nIndex, int nCount = 1) { + return CFX_BasicArray::RemoveAt(nIndex, nCount); + } + + bool InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray) { + return CFX_BasicArray::InsertAt(nStartIndex, pNewArray); + } + + int Find(TYPE data, int iStart = 0) const { + if (iStart < 0) { + return -1; + } + for (; iStart < (int)m_nSize; iStart++) + if (((TYPE*)m_pData)[iStart] == data) { + return iStart; + } + return -1; + } +}; + +template +class CFX_FixedBufGrow { + public: + explicit CFX_FixedBufGrow(int data_size) { + if (data_size > FixedSize) { + m_pGrowData.reset(FX_Alloc(DataType, data_size)); + return; + } + FXSYS_memset(m_FixedData, 0, sizeof(DataType) * FixedSize); + } + operator DataType*() { return m_pGrowData ? m_pGrowData.get() : m_FixedData; } + + private: + DataType m_FixedData[FixedSize]; + std::unique_ptr m_pGrowData; +}; + +class CFX_BitStream { + public: + void Init(const uint8_t* pData, uint32_t dwSize); + + uint32_t GetBits(uint32_t nBits); + + void ByteAlign(); + + bool IsEOF() { return m_BitPos >= m_BitSize; } + + void SkipBits(uint32_t nBits) { m_BitPos += nBits; } + + void Rewind() { m_BitPos = 0; } + + uint32_t GetPos() const { return m_BitPos; } + + uint32_t BitsRemaining() const { + return m_BitSize >= m_BitPos ? m_BitSize - m_BitPos : 0; + } + + protected: + uint32_t m_BitPos; + uint32_t m_BitSize; + const uint8_t* m_pData; +}; + +class IFX_Pause { + public: + virtual ~IFX_Pause() {} + virtual bool NeedToPauseNow() = 0; +}; + +template +class CFX_AutoRestorer { + public: + explicit CFX_AutoRestorer(T* location) + : m_Location(location), m_OldValue(*location) {} + ~CFX_AutoRestorer() { *m_Location = m_OldValue; } + + private: + T* const m_Location; + const T m_OldValue; +}; + +#define FX_DATALIST_LENGTH 1024 +template +class CFX_SortListArray { + protected: + struct DataList { + int32_t start; + + int32_t count; + uint8_t* data; + }; + + public: + CFX_SortListArray() : m_CurList(0) {} + + ~CFX_SortListArray() { Clear(); } + + void Clear() { + for (int32_t i = m_DataLists.GetUpperBound(); i >= 0; i--) { + DataList list = m_DataLists.ElementAt(i); + FX_Free(list.data); + } + m_DataLists.RemoveAll(); + m_CurList = 0; + } + + void Append(int32_t nStart, int32_t nCount) { + if (nStart < 0) { + return; + } + while (nCount > 0) { + int32_t temp_count = std::min(nCount, FX_DATALIST_LENGTH); + DataList list; + list.data = FX_Alloc2D(uint8_t, temp_count, unit); + list.start = nStart; + list.count = temp_count; + Append(list); + nCount -= temp_count; + nStart += temp_count; + } + } + + uint8_t* GetAt(int32_t nIndex) { + if (nIndex < 0) { + return nullptr; + } + if (m_CurList < 0 || m_CurList >= m_DataLists.GetSize()) { + return nullptr; + } + DataList* pCurList = m_DataLists.GetDataPtr(m_CurList); + if (!pCurList || nIndex < pCurList->start || + nIndex >= pCurList->start + pCurList->count) { + pCurList = nullptr; + int32_t iStart = 0; + int32_t iEnd = m_DataLists.GetUpperBound(); + int32_t iMid = 0; + while (iStart <= iEnd) { + iMid = (iStart + iEnd) / 2; + DataList* list = m_DataLists.GetDataPtr(iMid); + if (nIndex < list->start) { + iEnd = iMid - 1; + } else if (nIndex >= list->start + list->count) { + iStart = iMid + 1; + } else { + pCurList = list; + m_CurList = iMid; + break; + } + } + } + return pCurList ? pCurList->data + (nIndex - pCurList->start) * unit + : nullptr; + } + + protected: + void Append(const DataList& list) { + int32_t iStart = 0; + int32_t iEnd = m_DataLists.GetUpperBound(); + int32_t iFind = 0; + while (iStart <= iEnd) { + int32_t iMid = (iStart + iEnd) / 2; + DataList* cur_list = m_DataLists.GetDataPtr(iMid); + if (list.start < cur_list->start + cur_list->count) { + iEnd = iMid - 1; + } else { + if (iMid == iEnd) { + iFind = iMid + 1; + break; + } + DataList* next_list = m_DataLists.GetDataPtr(iMid + 1); + if (list.start < next_list->start) { + iFind = iMid + 1; + break; + } else { + iStart = iMid + 1; + } + } + } + m_DataLists.InsertAt(iFind, list); + } + int32_t m_CurList; + CFX_ArrayTemplate m_DataLists; +}; +template +class CFX_ListArrayTemplate { + public: + void Clear() { m_Data.Clear(); } + + void Add(int32_t nStart, int32_t nCount) { m_Data.Append(nStart, nCount); } + + T2& operator[](int32_t nIndex) { + uint8_t* data = m_Data.GetAt(nIndex); + ASSERT(data); + return (T2&)(*(volatile T2*)data); + } + + T2* GetPtrAt(int32_t nIndex) { return (T2*)m_Data.GetAt(nIndex); } + + protected: + T1 m_Data; +}; +typedef CFX_ListArrayTemplate, + FX_FILESIZE> + CFX_FileSizeListArray; + +class CFX_Vector_3by1 { + public: + CFX_Vector_3by1() : a(0.0f), b(0.0f), c(0.0f) {} + + CFX_Vector_3by1(FX_FLOAT a1, FX_FLOAT b1, FX_FLOAT c1) + : a(a1), b(b1), c(c1) {} + + FX_FLOAT a; + FX_FLOAT b; + FX_FLOAT c; +}; +class CFX_Matrix_3by3 { + public: + CFX_Matrix_3by3() + : a(0.0f), + b(0.0f), + c(0.0f), + d(0.0f), + e(0.0f), + f(0.0f), + g(0.0f), + h(0.0f), + i(0.0f) {} + + CFX_Matrix_3by3(FX_FLOAT a1, + FX_FLOAT b1, + FX_FLOAT c1, + FX_FLOAT d1, + FX_FLOAT e1, + FX_FLOAT f1, + FX_FLOAT g1, + FX_FLOAT h1, + FX_FLOAT i1) + : a(a1), b(b1), c(c1), d(d1), e(e1), f(f1), g(g1), h(h1), i(i1) {} + + CFX_Matrix_3by3 Inverse(); + + CFX_Matrix_3by3 Multiply(const CFX_Matrix_3by3& m); + + CFX_Vector_3by1 TransformVector(const CFX_Vector_3by1& v); + + FX_FLOAT a; + FX_FLOAT b; + FX_FLOAT c; + FX_FLOAT d; + FX_FLOAT e; + FX_FLOAT f; + FX_FLOAT g; + FX_FLOAT h; + FX_FLOAT i; +}; + +uint32_t GetBits32(const uint8_t* pData, int bitpos, int nbits); + +#endif // CORE_FXCRT_FX_BASIC_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_array.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_array.cpp new file mode 100644 index 000000000000..83c981e9e764 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_array.cpp @@ -0,0 +1,138 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fx_basic.h" +#include "third_party/base/numerics/safe_math.h" + +CFX_BasicArray::CFX_BasicArray(int unit_size) + : m_pData(nullptr), m_nSize(0), m_nMaxSize(0) { + if (unit_size < 0 || unit_size > (1 << 28)) { + m_nUnitSize = 4; + } else { + m_nUnitSize = unit_size; + } +} +CFX_BasicArray::~CFX_BasicArray() { + FX_Free(m_pData); +} +bool CFX_BasicArray::SetSize(int nNewSize) { + if (nNewSize <= 0) { + FX_Free(m_pData); + m_pData = nullptr; + m_nSize = m_nMaxSize = 0; + return 0 == nNewSize; + } + + if (!m_pData) { + pdfium::base::CheckedNumeric totalSize = nNewSize; + totalSize *= m_nUnitSize; + if (!totalSize.IsValid()) { + m_nSize = m_nMaxSize = 0; + return false; + } + m_pData = + FX_Alloc(uint8_t, pdfium::base::ValueOrDieForType(totalSize)); + m_nSize = m_nMaxSize = nNewSize; + } else if (nNewSize <= m_nMaxSize) { + if (nNewSize > m_nSize) { + FXSYS_memset(m_pData + m_nSize * m_nUnitSize, 0, + (nNewSize - m_nSize) * m_nUnitSize); + } + m_nSize = nNewSize; + } else { + int nNewMax = nNewSize < m_nMaxSize ? m_nMaxSize : nNewSize; + pdfium::base::CheckedNumeric totalSize = nNewMax; + totalSize *= m_nUnitSize; + if (!totalSize.IsValid() || nNewMax < m_nSize) { + return false; + } + uint8_t* pNewData = FX_Realloc( + uint8_t, m_pData, pdfium::base::ValueOrDieForType(totalSize)); + if (!pNewData) { + return false; + } + FXSYS_memset(pNewData + m_nSize * m_nUnitSize, 0, + (nNewMax - m_nSize) * m_nUnitSize); + m_pData = pNewData; + m_nSize = nNewSize; + m_nMaxSize = nNewMax; + } + return true; +} +bool CFX_BasicArray::Append(const CFX_BasicArray& src) { + int nOldSize = m_nSize; + pdfium::base::CheckedNumeric newSize = m_nSize; + newSize += src.m_nSize; + if (m_nUnitSize != src.m_nUnitSize || !newSize.IsValid() || + !SetSize(newSize.ValueOrDie())) { + return false; + } + + FXSYS_memcpy(m_pData + nOldSize * m_nUnitSize, src.m_pData, + src.m_nSize * m_nUnitSize); + return true; +} +bool CFX_BasicArray::Copy(const CFX_BasicArray& src) { + if (!SetSize(src.m_nSize)) { + return false; + } + FXSYS_memcpy(m_pData, src.m_pData, src.m_nSize * m_nUnitSize); + return true; +} +uint8_t* CFX_BasicArray::InsertSpaceAt(int nIndex, int nCount) { + if (nIndex < 0 || nCount <= 0) { + return nullptr; + } + if (nIndex >= m_nSize) { + if (!SetSize(nIndex + nCount)) { + return nullptr; + } + } else { + int nOldSize = m_nSize; + if (!SetSize(m_nSize + nCount)) { + return nullptr; + } + FXSYS_memmove(m_pData + (nIndex + nCount) * m_nUnitSize, + m_pData + nIndex * m_nUnitSize, + (nOldSize - nIndex) * m_nUnitSize); + FXSYS_memset(m_pData + nIndex * m_nUnitSize, 0, nCount * m_nUnitSize); + } + return m_pData + nIndex * m_nUnitSize; +} +bool CFX_BasicArray::RemoveAt(int nIndex, int nCount) { + if (nIndex < 0 || nCount <= 0 || m_nSize < nIndex + nCount) { + return false; + } + int nMoveCount = m_nSize - (nIndex + nCount); + if (nMoveCount) { + FXSYS_memmove(m_pData + nIndex * m_nUnitSize, + m_pData + (nIndex + nCount) * m_nUnitSize, + nMoveCount * m_nUnitSize); + } + m_nSize -= nCount; + return true; +} +bool CFX_BasicArray::InsertAt(int nStartIndex, + const CFX_BasicArray* pNewArray) { + if (!pNewArray) { + return false; + } + if (pNewArray->m_nSize == 0) { + return true; + } + if (!InsertSpaceAt(nStartIndex, pNewArray->m_nSize)) { + return false; + } + FXSYS_memcpy(m_pData + nStartIndex * m_nUnitSize, pNewArray->m_pData, + pNewArray->m_nSize * m_nUnitSize); + return true; +} +const void* CFX_BasicArray::GetDataPtr(int index) const { + if (index < 0 || index >= m_nSize || !m_pData) { + return nullptr; + } + return m_pData + index * m_nUnitSize; +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_bstring.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_bstring.cpp new file mode 100644 index 000000000000..2669474f0093 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_bstring.cpp @@ -0,0 +1,1012 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include +#include + +#include "core/fxcrt/cfx_string_pool_template.h" +#include "core/fxcrt/fx_basic.h" +#include "third_party/base/numerics/safe_math.h" + +template class CFX_StringDataTemplate; +template class CFX_StringCTemplate; +template class CFX_StringPoolTemplate; +template struct std::hash; + +namespace { + +int Buffer_itoa(char* buf, int i, uint32_t flags) { + if (i == 0) { + buf[0] = '0'; + return 1; + } + char buf1[32]; + int buf_pos = 31; + uint32_t u = i; + if ((flags & FXFORMAT_SIGNED) && i < 0) { + u = -i; + } + int base = 10; + const FX_CHAR* str = "0123456789abcdef"; + if (flags & FXFORMAT_HEX) { + base = 16; + if (flags & FXFORMAT_CAPITAL) { + str = "0123456789ABCDEF"; + } + } + while (u != 0) { + buf1[buf_pos--] = str[u % base]; + u = u / base; + } + if ((flags & FXFORMAT_SIGNED) && i < 0) { + buf1[buf_pos--] = '-'; + } + int len = 31 - buf_pos; + for (int ii = 0; ii < len; ii++) { + buf[ii] = buf1[ii + buf_pos + 1]; + } + return len; +} + +const FX_CHAR* FX_strstr(const FX_CHAR* haystack, + int haystack_len, + const FX_CHAR* needle, + int needle_len) { + if (needle_len > haystack_len || needle_len == 0) { + return nullptr; + } + const FX_CHAR* end_ptr = haystack + haystack_len - needle_len; + while (haystack <= end_ptr) { + int i = 0; + while (1) { + if (haystack[i] != needle[i]) { + break; + } + i++; + if (i == needle_len) { + return haystack; + } + } + haystack++; + } + return nullptr; +} + +} // namespace + +static_assert(sizeof(CFX_ByteString) <= sizeof(FX_CHAR*), + "Strings must not require more space than pointers"); + +CFX_ByteString::CFX_ByteString(const FX_CHAR* pStr, FX_STRSIZE nLen) { + if (nLen < 0) + nLen = pStr ? FXSYS_strlen(pStr) : 0; + + if (nLen) + m_pData.Reset(StringData::Create(pStr, nLen)); +} + +CFX_ByteString::CFX_ByteString(const uint8_t* pStr, FX_STRSIZE nLen) { + if (nLen > 0) { + m_pData.Reset( + StringData::Create(reinterpret_cast(pStr), nLen)); + } +} + +CFX_ByteString::CFX_ByteString() {} + +CFX_ByteString::CFX_ByteString(const CFX_ByteString& other) + : m_pData(other.m_pData) {} + +CFX_ByteString::CFX_ByteString(CFX_ByteString&& other) { + m_pData.Swap(other.m_pData); +} + +CFX_ByteString::CFX_ByteString(char ch) { + m_pData.Reset(StringData::Create(1)); + m_pData->m_String[0] = ch; +} + +CFX_ByteString::CFX_ByteString(const FX_CHAR* ptr) + : CFX_ByteString(ptr, ptr ? FXSYS_strlen(ptr) : 0) {} + +CFX_ByteString::CFX_ByteString(const CFX_ByteStringC& stringSrc) { + if (!stringSrc.IsEmpty()) + m_pData.Reset(StringData::Create(stringSrc.c_str(), stringSrc.GetLength())); +} + +CFX_ByteString::CFX_ByteString(const CFX_ByteStringC& str1, + const CFX_ByteStringC& str2) { + int nNewLen = str1.GetLength() + str2.GetLength(); + if (nNewLen == 0) + return; + + m_pData.Reset(StringData::Create(nNewLen)); + m_pData->CopyContents(str1.c_str(), str1.GetLength()); + m_pData->CopyContentsAt(str1.GetLength(), str2.c_str(), str2.GetLength()); +} + +CFX_ByteString::~CFX_ByteString() {} + +const CFX_ByteString& CFX_ByteString::operator=(const FX_CHAR* pStr) { + if (!pStr || !pStr[0]) + clear(); + else + AssignCopy(pStr, FXSYS_strlen(pStr)); + + return *this; +} + +const CFX_ByteString& CFX_ByteString::operator=( + const CFX_ByteStringC& stringSrc) { + if (stringSrc.IsEmpty()) + clear(); + else + AssignCopy(stringSrc.c_str(), stringSrc.GetLength()); + + return *this; +} + +const CFX_ByteString& CFX_ByteString::operator=( + const CFX_ByteString& stringSrc) { + if (m_pData != stringSrc.m_pData) + m_pData = stringSrc.m_pData; + + return *this; +} + +const CFX_ByteString& CFX_ByteString::operator+=(const FX_CHAR* pStr) { + if (pStr) + Concat(pStr, FXSYS_strlen(pStr)); + + return *this; +} + +const CFX_ByteString& CFX_ByteString::operator+=(char ch) { + Concat(&ch, 1); + return *this; +} + +const CFX_ByteString& CFX_ByteString::operator+=(const CFX_ByteString& str) { + if (str.m_pData) + Concat(str.m_pData->m_String, str.m_pData->m_nDataLength); + + return *this; +} + +const CFX_ByteString& CFX_ByteString::operator+=(const CFX_ByteStringC& str) { + if (!str.IsEmpty()) + Concat(str.c_str(), str.GetLength()); + + return *this; +} + +bool CFX_ByteString::operator==(const char* ptr) const { + if (!m_pData) + return !ptr || !ptr[0]; + + if (!ptr) + return m_pData->m_nDataLength == 0; + + return FXSYS_strlen(ptr) == m_pData->m_nDataLength && + FXSYS_memcmp(ptr, m_pData->m_String, m_pData->m_nDataLength) == 0; +} + +bool CFX_ByteString::operator==(const CFX_ByteStringC& str) const { + if (!m_pData) + return str.IsEmpty(); + + return m_pData->m_nDataLength == str.GetLength() && + FXSYS_memcmp(m_pData->m_String, str.c_str(), str.GetLength()) == 0; +} + +bool CFX_ByteString::operator==(const CFX_ByteString& other) const { + if (m_pData == other.m_pData) + return true; + + if (IsEmpty()) + return other.IsEmpty(); + + if (other.IsEmpty()) + return false; + + return other.m_pData->m_nDataLength == m_pData->m_nDataLength && + FXSYS_memcmp(other.m_pData->m_String, m_pData->m_String, + m_pData->m_nDataLength) == 0; +} + +bool CFX_ByteString::operator<(const CFX_ByteString& str) const { + if (m_pData == str.m_pData) + return false; + + int result = FXSYS_memcmp(c_str(), str.c_str(), + std::min(GetLength(), str.GetLength())); + return result < 0 || (result == 0 && GetLength() < str.GetLength()); +} + +bool CFX_ByteString::EqualNoCase(const CFX_ByteStringC& str) const { + if (!m_pData) + return str.IsEmpty(); + + FX_STRSIZE len = str.GetLength(); + if (m_pData->m_nDataLength != len) + return false; + + const uint8_t* pThis = (const uint8_t*)m_pData->m_String; + const uint8_t* pThat = str.raw_str(); + for (FX_STRSIZE i = 0; i < len; i++) { + if ((*pThis) != (*pThat)) { + uint8_t bThis = *pThis; + if (bThis >= 'A' && bThis <= 'Z') + bThis += 'a' - 'A'; + + uint8_t bThat = *pThat; + if (bThat >= 'A' && bThat <= 'Z') + bThat += 'a' - 'A'; + + if (bThis != bThat) + return false; + } + pThis++; + pThat++; + } + return true; +} + +void CFX_ByteString::AssignCopy(const FX_CHAR* pSrcData, FX_STRSIZE nSrcLen) { + AllocBeforeWrite(nSrcLen); + m_pData->CopyContents(pSrcData, nSrcLen); + m_pData->m_nDataLength = nSrcLen; +} + +void CFX_ByteString::ReallocBeforeWrite(FX_STRSIZE nNewLength) { + if (m_pData && m_pData->CanOperateInPlace(nNewLength)) + return; + + if (nNewLength <= 0) { + clear(); + return; + } + + CFX_RetainPtr pNewData(StringData::Create(nNewLength)); + if (m_pData) { + FX_STRSIZE nCopyLength = std::min(m_pData->m_nDataLength, nNewLength); + pNewData->CopyContents(m_pData->m_String, nCopyLength); + pNewData->m_nDataLength = nCopyLength; + } else { + pNewData->m_nDataLength = 0; + } + pNewData->m_String[pNewData->m_nDataLength] = 0; + m_pData.Swap(pNewData); +} + +void CFX_ByteString::AllocBeforeWrite(FX_STRSIZE nNewLength) { + if (m_pData && m_pData->CanOperateInPlace(nNewLength)) + return; + + if (nNewLength <= 0) { + clear(); + return; + } + + m_pData.Reset(StringData::Create(nNewLength)); +} + +void CFX_ByteString::ReleaseBuffer(FX_STRSIZE nNewLength) { + if (!m_pData) + return; + + if (nNewLength == -1) + nNewLength = FXSYS_strlen(m_pData->m_String); + + nNewLength = std::min(nNewLength, m_pData->m_nAllocLength); + if (nNewLength == 0) { + clear(); + return; + } + + ASSERT(m_pData->m_nRefs == 1); + m_pData->m_nDataLength = nNewLength; + m_pData->m_String[nNewLength] = 0; + if (m_pData->m_nAllocLength - nNewLength >= 32) { + // Over arbitrary threshold, so pay the price to relocate. Force copy to + // always occur by holding a second reference to the string. + CFX_ByteString preserve(*this); + ReallocBeforeWrite(nNewLength); + } +} + +void CFX_ByteString::Reserve(FX_STRSIZE len) { + GetBuffer(len); +} + +FX_CHAR* CFX_ByteString::GetBuffer(FX_STRSIZE nMinBufLength) { + if (!m_pData) { + if (nMinBufLength == 0) + return nullptr; + + m_pData.Reset(StringData::Create(nMinBufLength)); + m_pData->m_nDataLength = 0; + m_pData->m_String[0] = 0; + return m_pData->m_String; + } + + if (m_pData->CanOperateInPlace(nMinBufLength)) + return m_pData->m_String; + + nMinBufLength = std::max(nMinBufLength, m_pData->m_nDataLength); + if (nMinBufLength == 0) + return nullptr; + + CFX_RetainPtr pNewData(StringData::Create(nMinBufLength)); + pNewData->CopyContents(*m_pData); + pNewData->m_nDataLength = m_pData->m_nDataLength; + m_pData.Swap(pNewData); + return m_pData->m_String; +} + +FX_STRSIZE CFX_ByteString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount) { + if (!m_pData) + return 0; + + if (nIndex < 0) + nIndex = 0; + + FX_STRSIZE nOldLength = m_pData->m_nDataLength; + if (nCount > 0 && nIndex < nOldLength) { + FX_STRSIZE mLength = nIndex + nCount; + if (mLength >= nOldLength) { + m_pData->m_nDataLength = nIndex; + return m_pData->m_nDataLength; + } + ReallocBeforeWrite(nOldLength); + int nCharsToCopy = nOldLength - mLength + 1; + FXSYS_memmove(m_pData->m_String + nIndex, m_pData->m_String + mLength, + nCharsToCopy); + m_pData->m_nDataLength = nOldLength - nCount; + } + return m_pData->m_nDataLength; +} + +void CFX_ByteString::Concat(const FX_CHAR* pSrcData, FX_STRSIZE nSrcLen) { + if (!pSrcData || nSrcLen <= 0) + return; + + if (!m_pData) { + m_pData.Reset(StringData::Create(pSrcData, nSrcLen)); + return; + } + + if (m_pData->CanOperateInPlace(m_pData->m_nDataLength + nSrcLen)) { + m_pData->CopyContentsAt(m_pData->m_nDataLength, pSrcData, nSrcLen); + m_pData->m_nDataLength += nSrcLen; + return; + } + + CFX_RetainPtr pNewData( + StringData::Create(m_pData->m_nDataLength + nSrcLen)); + pNewData->CopyContents(*m_pData); + pNewData->CopyContentsAt(m_pData->m_nDataLength, pSrcData, nSrcLen); + m_pData.Swap(pNewData); +} + +CFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst) const { + if (!m_pData) + return CFX_ByteString(); + + return Mid(nFirst, m_pData->m_nDataLength - nFirst); +} + +CFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst, FX_STRSIZE nCount) const { + if (!m_pData) + return CFX_ByteString(); + + nFirst = std::min(std::max(nFirst, 0), m_pData->m_nDataLength); + nCount = std::min(std::max(nCount, 0), m_pData->m_nDataLength - nFirst); + if (nCount == 0) + return CFX_ByteString(); + + if (nFirst == 0 && nCount == m_pData->m_nDataLength) + return *this; + + CFX_ByteString dest; + AllocCopy(dest, nCount, nFirst); + return dest; +} + +void CFX_ByteString::AllocCopy(CFX_ByteString& dest, + FX_STRSIZE nCopyLen, + FX_STRSIZE nCopyIndex) const { + if (nCopyLen <= 0) + return; + + CFX_RetainPtr pNewData( + StringData::Create(m_pData->m_String + nCopyIndex, nCopyLen)); + dest.m_pData.Swap(pNewData); +} + +#define FORCE_ANSI 0x10000 +#define FORCE_UNICODE 0x20000 +#define FORCE_INT64 0x40000 + +CFX_ByteString CFX_ByteString::FormatInteger(int i, uint32_t flags) { + char buf[32]; + return CFX_ByteString(buf, Buffer_itoa(buf, i, flags)); +} + +void CFX_ByteString::FormatV(const FX_CHAR* pFormat, va_list argList) { + va_list argListSave; +#if defined(__ARMCC_VERSION) || \ + (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || \ + _FX_CPU_ == _FX_ARM64_)) || \ + defined(__native_client__) + va_copy(argListSave, argList); +#else + argListSave = argList; +#endif + int nMaxLen = 0; + for (const FX_CHAR* pStr = pFormat; *pStr != 0; pStr++) { + if (*pStr != '%' || *(pStr = pStr + 1) == '%') { + nMaxLen += FXSYS_strlen(pStr); + continue; + } + int nItemLen = 0; + int nWidth = 0; + for (; *pStr != 0; pStr++) { + if (*pStr == '#') { + nMaxLen += 2; + } else if (*pStr == '*') { + nWidth = va_arg(argList, int); + } else if (*pStr != '-' && *pStr != '+' && *pStr != '0' && *pStr != ' ') { + break; + } + } + if (nWidth == 0) { + nWidth = FXSYS_atoi(pStr); + while (std::isdigit(*pStr)) + pStr++; + } + if (nWidth < 0 || nWidth > 128 * 1024) { + pFormat = "Bad width"; + nMaxLen = 10; + break; + } + int nPrecision = 0; + if (*pStr == '.') { + pStr++; + if (*pStr == '*') { + nPrecision = va_arg(argList, int); + pStr++; + } else { + nPrecision = FXSYS_atoi(pStr); + while (std::isdigit(*pStr)) + pStr++; + } + } + if (nPrecision < 0 || nPrecision > 128 * 1024) { + pFormat = "Bad precision"; + nMaxLen = 14; + break; + } + int nModifier = 0; + if (FXSYS_strncmp(pStr, "I64", 3) == 0) { + pStr += 3; + nModifier = FORCE_INT64; + } else { + switch (*pStr) { + case 'h': + nModifier = FORCE_ANSI; + pStr++; + break; + case 'l': + nModifier = FORCE_UNICODE; + pStr++; + break; + case 'F': + case 'N': + case 'L': + pStr++; + break; + } + } + switch (*pStr | nModifier) { + case 'c': + case 'C': + nItemLen = 2; + va_arg(argList, int); + break; + case 'c' | FORCE_ANSI: + case 'C' | FORCE_ANSI: + nItemLen = 2; + va_arg(argList, int); + break; + case 'c' | FORCE_UNICODE: + case 'C' | FORCE_UNICODE: + nItemLen = 2; + va_arg(argList, int); + break; + case 's': { + const FX_CHAR* pstrNextArg = va_arg(argList, const FX_CHAR*); + if (pstrNextArg) { + nItemLen = FXSYS_strlen(pstrNextArg); + if (nItemLen < 1) { + nItemLen = 1; + } + } else { + nItemLen = 6; + } + } break; + case 'S': { + FX_WCHAR* pstrNextArg = va_arg(argList, FX_WCHAR*); + if (pstrNextArg) { + nItemLen = FXSYS_wcslen(pstrNextArg); + if (nItemLen < 1) { + nItemLen = 1; + } + } else { + nItemLen = 6; + } + } break; + case 's' | FORCE_ANSI: + case 'S' | FORCE_ANSI: { + const FX_CHAR* pstrNextArg = va_arg(argList, const FX_CHAR*); + if (pstrNextArg) { + nItemLen = FXSYS_strlen(pstrNextArg); + if (nItemLen < 1) { + nItemLen = 1; + } + } else { + nItemLen = 6; + } + } break; + case 's' | FORCE_UNICODE: + case 'S' | FORCE_UNICODE: { + FX_WCHAR* pstrNextArg = va_arg(argList, FX_WCHAR*); + if (pstrNextArg) { + nItemLen = FXSYS_wcslen(pstrNextArg); + if (nItemLen < 1) { + nItemLen = 1; + } + } else { + nItemLen = 6; + } + } break; + } + if (nItemLen != 0) { + if (nPrecision != 0 && nItemLen > nPrecision) { + nItemLen = nPrecision; + } + if (nItemLen < nWidth) { + nItemLen = nWidth; + } + } else { + switch (*pStr) { + case 'd': + case 'i': + case 'u': + case 'x': + case 'X': + case 'o': + if (nModifier & FORCE_INT64) { + va_arg(argList, int64_t); + } else { + va_arg(argList, int); + } + nItemLen = 32; + if (nItemLen < nWidth + nPrecision) { + nItemLen = nWidth + nPrecision; + } + break; + case 'a': + case 'A': + case 'e': + case 'E': + case 'g': + case 'G': + va_arg(argList, double); + nItemLen = 128; + if (nItemLen < nWidth + nPrecision) { + nItemLen = nWidth + nPrecision; + } + break; + case 'f': + if (nWidth + nPrecision > 100) { + nItemLen = nPrecision + nWidth + 128; + } else { + char pszTemp[256]; + double f = va_arg(argList, double); + memset(pszTemp, 0, sizeof(pszTemp)); + FXSYS_snprintf(pszTemp, sizeof(pszTemp) - 1, "%*.*f", nWidth, + nPrecision + 6, f); + nItemLen = FXSYS_strlen(pszTemp); + } + break; + case 'p': + va_arg(argList, void*); + nItemLen = 32; + if (nItemLen < nWidth + nPrecision) { + nItemLen = nWidth + nPrecision; + } + break; + case 'n': + va_arg(argList, int*); + break; + } + } + nMaxLen += nItemLen; + } + nMaxLen += 32; // Fudge factor. + GetBuffer(nMaxLen); + if (m_pData) { + memset(m_pData->m_String, 0, nMaxLen); + FXSYS_vsnprintf(m_pData->m_String, nMaxLen - 1, pFormat, argListSave); + ReleaseBuffer(); + } + va_end(argListSave); +} + +void CFX_ByteString::Format(const FX_CHAR* pFormat, ...) { + va_list argList; + va_start(argList, pFormat); + FormatV(pFormat, argList); + va_end(argList); +} + +FX_STRSIZE CFX_ByteString::Insert(FX_STRSIZE nIndex, FX_CHAR ch) { + FX_STRSIZE nNewLength = m_pData ? m_pData->m_nDataLength : 0; + nIndex = std::max(nIndex, 0); + nIndex = std::min(nIndex, nNewLength); + nNewLength++; + + ReallocBeforeWrite(nNewLength); + FXSYS_memmove(m_pData->m_String + nIndex + 1, m_pData->m_String + nIndex, + nNewLength - nIndex); + m_pData->m_String[nIndex] = ch; + m_pData->m_nDataLength = nNewLength; + return nNewLength; +} + +CFX_ByteString CFX_ByteString::Right(FX_STRSIZE nCount) const { + if (!m_pData) + return CFX_ByteString(); + + nCount = std::max(nCount, 0); + if (nCount >= m_pData->m_nDataLength) + return *this; + + CFX_ByteString dest; + AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount); + return dest; +} + +CFX_ByteString CFX_ByteString::Left(FX_STRSIZE nCount) const { + if (!m_pData) + return CFX_ByteString(); + + nCount = std::max(nCount, 0); + if (nCount >= m_pData->m_nDataLength) + return *this; + + CFX_ByteString dest; + AllocCopy(dest, nCount, 0); + return dest; +} + +FX_STRSIZE CFX_ByteString::Find(FX_CHAR ch, FX_STRSIZE nStart) const { + if (!m_pData) + return -1; + + if (nStart < 0 || nStart >= m_pData->m_nDataLength) + return -1; + + const FX_CHAR* pStr = static_cast( + memchr(m_pData->m_String + nStart, ch, m_pData->m_nDataLength - nStart)); + return pStr ? pStr - m_pData->m_String : -1; +} + +FX_STRSIZE CFX_ByteString::ReverseFind(FX_CHAR ch) const { + if (!m_pData) + return -1; + + FX_STRSIZE nLength = m_pData->m_nDataLength; + while (nLength--) { + if (m_pData->m_String[nLength] == ch) + return nLength; + } + return -1; +} + +FX_STRSIZE CFX_ByteString::Find(const CFX_ByteStringC& pSub, + FX_STRSIZE nStart) const { + if (!m_pData) + return -1; + + FX_STRSIZE nLength = m_pData->m_nDataLength; + if (nStart > nLength) + return -1; + + const FX_CHAR* pStr = + FX_strstr(m_pData->m_String + nStart, m_pData->m_nDataLength - nStart, + pSub.c_str(), pSub.GetLength()); + return pStr ? (int)(pStr - m_pData->m_String) : -1; +} + +void CFX_ByteString::MakeLower() { + if (!m_pData) + return; + + ReallocBeforeWrite(m_pData->m_nDataLength); + FXSYS_strlwr(m_pData->m_String); +} + +void CFX_ByteString::MakeUpper() { + if (!m_pData) + return; + + ReallocBeforeWrite(m_pData->m_nDataLength); + FXSYS_strupr(m_pData->m_String); +} + +FX_STRSIZE CFX_ByteString::Remove(FX_CHAR chRemove) { + if (!m_pData || m_pData->m_nDataLength < 1) + return 0; + + FX_CHAR* pstrSource = m_pData->m_String; + FX_CHAR* pstrEnd = m_pData->m_String + m_pData->m_nDataLength; + while (pstrSource < pstrEnd) { + if (*pstrSource == chRemove) + break; + pstrSource++; + } + if (pstrSource == pstrEnd) + return 0; + + ptrdiff_t copied = pstrSource - m_pData->m_String; + ReallocBeforeWrite(m_pData->m_nDataLength); + pstrSource = m_pData->m_String + copied; + pstrEnd = m_pData->m_String + m_pData->m_nDataLength; + + FX_CHAR* pstrDest = pstrSource; + while (pstrSource < pstrEnd) { + if (*pstrSource != chRemove) { + *pstrDest = *pstrSource; + pstrDest++; + } + pstrSource++; + } + + *pstrDest = 0; + FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest); + m_pData->m_nDataLength -= nCount; + return nCount; +} + +FX_STRSIZE CFX_ByteString::Replace(const CFX_ByteStringC& pOld, + const CFX_ByteStringC& pNew) { + if (!m_pData || pOld.IsEmpty()) + return 0; + + FX_STRSIZE nSourceLen = pOld.GetLength(); + FX_STRSIZE nReplacementLen = pNew.GetLength(); + FX_STRSIZE nCount = 0; + const FX_CHAR* pStart = m_pData->m_String; + FX_CHAR* pEnd = m_pData->m_String + m_pData->m_nDataLength; + while (1) { + const FX_CHAR* pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), + pOld.c_str(), nSourceLen); + if (!pTarget) + break; + + nCount++; + pStart = pTarget + nSourceLen; + } + if (nCount == 0) + return 0; + + FX_STRSIZE nNewLength = + m_pData->m_nDataLength + (nReplacementLen - nSourceLen) * nCount; + + if (nNewLength == 0) { + clear(); + return nCount; + } + + CFX_RetainPtr pNewData(StringData::Create(nNewLength)); + pStart = m_pData->m_String; + FX_CHAR* pDest = pNewData->m_String; + for (FX_STRSIZE i = 0; i < nCount; i++) { + const FX_CHAR* pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), + pOld.c_str(), nSourceLen); + FXSYS_memcpy(pDest, pStart, pTarget - pStart); + pDest += pTarget - pStart; + FXSYS_memcpy(pDest, pNew.c_str(), pNew.GetLength()); + pDest += pNew.GetLength(); + pStart = pTarget + nSourceLen; + } + FXSYS_memcpy(pDest, pStart, pEnd - pStart); + m_pData.Swap(pNewData); + return nCount; +} + +void CFX_ByteString::SetAt(FX_STRSIZE nIndex, FX_CHAR ch) { + if (!m_pData) { + return; + } + ASSERT(nIndex >= 0); + ASSERT(nIndex < m_pData->m_nDataLength); + ReallocBeforeWrite(m_pData->m_nDataLength); + m_pData->m_String[nIndex] = ch; +} + +CFX_WideString CFX_ByteString::UTF8Decode() const { + CFX_UTF8Decoder decoder; + for (FX_STRSIZE i = 0; i < GetLength(); i++) { + decoder.Input((uint8_t)m_pData->m_String[i]); + } + return CFX_WideString(decoder.GetResult()); +} + +// static +CFX_ByteString CFX_ByteString::FromUnicode(const FX_WCHAR* str, + FX_STRSIZE len) { + FX_STRSIZE str_len = len >= 0 ? len : FXSYS_wcslen(str); + return FromUnicode(CFX_WideString(str, str_len)); +} + +// static +CFX_ByteString CFX_ByteString::FromUnicode(const CFX_WideString& str) { + return CFX_CharMap::GetByteString(0, str.AsStringC()); +} + +int CFX_ByteString::Compare(const CFX_ByteStringC& str) const { + if (!m_pData) { + return str.IsEmpty() ? 0 : -1; + } + int this_len = m_pData->m_nDataLength; + int that_len = str.GetLength(); + int min_len = this_len < that_len ? this_len : that_len; + for (int i = 0; i < min_len; i++) { + if ((uint8_t)m_pData->m_String[i] < str.GetAt(i)) { + return -1; + } + if ((uint8_t)m_pData->m_String[i] > str.GetAt(i)) { + return 1; + } + } + if (this_len < that_len) { + return -1; + } + if (this_len > that_len) { + return 1; + } + return 0; +} + +void CFX_ByteString::TrimRight(const CFX_ByteStringC& pTargets) { + if (!m_pData || pTargets.IsEmpty()) { + return; + } + FX_STRSIZE pos = GetLength(); + if (pos < 1) { + return; + } + while (pos) { + FX_STRSIZE i = 0; + while (i < pTargets.GetLength() && + pTargets[i] != m_pData->m_String[pos - 1]) { + i++; + } + if (i == pTargets.GetLength()) { + break; + } + pos--; + } + if (pos < m_pData->m_nDataLength) { + ReallocBeforeWrite(m_pData->m_nDataLength); + m_pData->m_String[pos] = 0; + m_pData->m_nDataLength = pos; + } +} + +void CFX_ByteString::TrimRight(FX_CHAR chTarget) { + TrimRight(CFX_ByteStringC(chTarget)); +} + +void CFX_ByteString::TrimRight() { + TrimRight("\x09\x0a\x0b\x0c\x0d\x20"); +} + +void CFX_ByteString::TrimLeft(const CFX_ByteStringC& pTargets) { + if (!m_pData || pTargets.IsEmpty()) + return; + + FX_STRSIZE len = GetLength(); + if (len < 1) + return; + + FX_STRSIZE pos = 0; + while (pos < len) { + FX_STRSIZE i = 0; + while (i < pTargets.GetLength() && pTargets[i] != m_pData->m_String[pos]) { + i++; + } + if (i == pTargets.GetLength()) { + break; + } + pos++; + } + if (pos) { + ReallocBeforeWrite(len); + FX_STRSIZE nDataLength = len - pos; + FXSYS_memmove(m_pData->m_String, m_pData->m_String + pos, + (nDataLength + 1) * sizeof(FX_CHAR)); + m_pData->m_nDataLength = nDataLength; + } +} + +void CFX_ByteString::TrimLeft(FX_CHAR chTarget) { + TrimLeft(CFX_ByteStringC(chTarget)); +} + +void CFX_ByteString::TrimLeft() { + TrimLeft("\x09\x0a\x0b\x0c\x0d\x20"); +} + +uint32_t CFX_ByteString::GetID(FX_STRSIZE start_pos) const { + return AsStringC().GetID(start_pos); +} +FX_STRSIZE FX_ftoa(FX_FLOAT d, FX_CHAR* buf) { + buf[0] = '0'; + buf[1] = '\0'; + if (d == 0.0f) { + return 1; + } + bool bNegative = false; + if (d < 0) { + bNegative = true; + d = -d; + } + int scale = 1; + int scaled = FXSYS_round(d); + while (scaled < 100000) { + if (scale == 1000000) { + break; + } + scale *= 10; + scaled = FXSYS_round(d * scale); + } + if (scaled == 0) { + return 1; + } + char buf2[32]; + int buf_size = 0; + if (bNegative) { + buf[buf_size++] = '-'; + } + int i = scaled / scale; + FXSYS_itoa(i, buf2, 10); + FX_STRSIZE len = FXSYS_strlen(buf2); + FXSYS_memcpy(buf + buf_size, buf2, len); + buf_size += len; + int fraction = scaled % scale; + if (fraction == 0) { + return buf_size; + } + buf[buf_size++] = '.'; + scale /= 10; + while (fraction) { + buf[buf_size++] = '0' + fraction / scale; + fraction %= scale; + scale /= 10; + } + return buf_size; +} +CFX_ByteString CFX_ByteString::FormatFloat(FX_FLOAT d, int precision) { + FX_CHAR buf[32]; + FX_STRSIZE len = FX_ftoa(d, buf); + return CFX_ByteString(buf, len); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_bstring_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_bstring_unittest.cpp new file mode 100644 index 000000000000..503e68458ab8 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_bstring_unittest.cpp @@ -0,0 +1,1102 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/fx_string.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(fxcrt, ByteStringOperatorSubscript) { + // CFX_ByteString includes the NUL terminator for non-empty strings. + CFX_ByteString abc("abc"); + EXPECT_EQ('a', abc[0]); + EXPECT_EQ('b', abc[1]); + EXPECT_EQ('c', abc[2]); + EXPECT_EQ(0, abc[3]); +} + +TEST(fxcrt, ByteStringOperatorLT) { + CFX_ByteString empty; + CFX_ByteString a("a"); + CFX_ByteString abc("abc"); + CFX_ByteString def("def"); + + EXPECT_FALSE(empty < empty); + EXPECT_FALSE(a < a); + EXPECT_FALSE(abc < abc); + EXPECT_FALSE(def < def); + + EXPECT_TRUE(empty < a); + EXPECT_FALSE(a < empty); + + EXPECT_TRUE(empty < abc); + EXPECT_FALSE(abc < empty); + + EXPECT_TRUE(empty < def); + EXPECT_FALSE(def < empty); + + EXPECT_TRUE(a < abc); + EXPECT_FALSE(abc < a); + + EXPECT_TRUE(a < def); + EXPECT_FALSE(def < a); + + EXPECT_TRUE(abc < def); + EXPECT_FALSE(def < abc); +} + +TEST(fxcrt, ByteStringOperatorEQ) { + CFX_ByteString null_string; + EXPECT_TRUE(null_string == null_string); + + CFX_ByteString empty_string(""); + EXPECT_TRUE(empty_string == empty_string); + EXPECT_TRUE(empty_string == null_string); + EXPECT_TRUE(null_string == empty_string); + + CFX_ByteString deleted_string("hello"); + deleted_string.Delete(0, 5); + EXPECT_TRUE(deleted_string == deleted_string); + EXPECT_TRUE(deleted_string == null_string); + EXPECT_TRUE(deleted_string == empty_string); + EXPECT_TRUE(null_string == deleted_string); + EXPECT_TRUE(empty_string == deleted_string); + + CFX_ByteString byte_string("hello"); + EXPECT_TRUE(byte_string == byte_string); + EXPECT_FALSE(byte_string == null_string); + EXPECT_FALSE(byte_string == empty_string); + EXPECT_FALSE(byte_string == deleted_string); + EXPECT_FALSE(null_string == byte_string); + EXPECT_FALSE(empty_string == byte_string); + EXPECT_FALSE(deleted_string == byte_string); + + CFX_ByteString byte_string_same1("hello"); + EXPECT_TRUE(byte_string == byte_string_same1); + EXPECT_TRUE(byte_string_same1 == byte_string); + + CFX_ByteString byte_string_same2(byte_string); + EXPECT_TRUE(byte_string == byte_string_same2); + EXPECT_TRUE(byte_string_same2 == byte_string); + + CFX_ByteString byte_string1("he"); + CFX_ByteString byte_string2("hellp"); + CFX_ByteString byte_string3("hellod"); + EXPECT_FALSE(byte_string == byte_string1); + EXPECT_FALSE(byte_string == byte_string2); + EXPECT_FALSE(byte_string == byte_string3); + EXPECT_FALSE(byte_string1 == byte_string); + EXPECT_FALSE(byte_string2 == byte_string); + EXPECT_FALSE(byte_string3 == byte_string); + + CFX_ByteStringC null_string_c; + CFX_ByteStringC empty_string_c(""); + EXPECT_TRUE(null_string == null_string_c); + EXPECT_TRUE(null_string == empty_string_c); + EXPECT_TRUE(empty_string == null_string_c); + EXPECT_TRUE(empty_string == empty_string_c); + EXPECT_TRUE(deleted_string == null_string_c); + EXPECT_TRUE(deleted_string == empty_string_c); + EXPECT_TRUE(null_string_c == null_string); + EXPECT_TRUE(empty_string_c == null_string); + EXPECT_TRUE(null_string_c == empty_string); + EXPECT_TRUE(empty_string_c == empty_string); + EXPECT_TRUE(null_string_c == deleted_string); + EXPECT_TRUE(empty_string_c == deleted_string); + + CFX_ByteStringC byte_string_c_same1("hello"); + EXPECT_TRUE(byte_string == byte_string_c_same1); + EXPECT_TRUE(byte_string_c_same1 == byte_string); + + CFX_ByteStringC byte_string_c1("he"); + CFX_ByteStringC byte_string_c2("hellp"); + CFX_ByteStringC byte_string_c3("hellod"); + EXPECT_FALSE(byte_string == byte_string_c1); + EXPECT_FALSE(byte_string == byte_string_c2); + EXPECT_FALSE(byte_string == byte_string_c3); + EXPECT_FALSE(byte_string_c1 == byte_string); + EXPECT_FALSE(byte_string_c2 == byte_string); + EXPECT_FALSE(byte_string_c3 == byte_string); + + const char* c_null_string = nullptr; + const char* c_empty_string = ""; + EXPECT_TRUE(null_string == c_null_string); + EXPECT_TRUE(null_string == c_empty_string); + EXPECT_TRUE(empty_string == c_null_string); + EXPECT_TRUE(empty_string == c_empty_string); + EXPECT_TRUE(deleted_string == c_null_string); + EXPECT_TRUE(deleted_string == c_empty_string); + EXPECT_TRUE(c_null_string == null_string); + EXPECT_TRUE(c_empty_string == null_string); + EXPECT_TRUE(c_null_string == empty_string); + EXPECT_TRUE(c_empty_string == empty_string); + EXPECT_TRUE(c_null_string == deleted_string); + EXPECT_TRUE(c_empty_string == deleted_string); + + const char* c_string_same1 = "hello"; + EXPECT_TRUE(byte_string == c_string_same1); + EXPECT_TRUE(c_string_same1 == byte_string); + + const char* c_string1 = "he"; + const char* c_string2 = "hellp"; + const char* c_string3 = "hellod"; + EXPECT_FALSE(byte_string == c_string1); + EXPECT_FALSE(byte_string == c_string2); + EXPECT_FALSE(byte_string == c_string3); + EXPECT_FALSE(c_string1 == byte_string); + EXPECT_FALSE(c_string2 == byte_string); + EXPECT_FALSE(c_string3 == byte_string); +} + +TEST(fxcrt, ByteStringOperatorNE) { + CFX_ByteString null_string; + EXPECT_FALSE(null_string != null_string); + + CFX_ByteString empty_string(""); + EXPECT_FALSE(empty_string != empty_string); + EXPECT_FALSE(empty_string != null_string); + EXPECT_FALSE(null_string != empty_string); + + CFX_ByteString deleted_string("hello"); + deleted_string.Delete(0, 5); + EXPECT_FALSE(deleted_string != deleted_string); + EXPECT_FALSE(deleted_string != null_string); + EXPECT_FALSE(deleted_string != empty_string); + EXPECT_FALSE(deleted_string != deleted_string); + EXPECT_FALSE(null_string != deleted_string); + EXPECT_FALSE(empty_string != deleted_string); + EXPECT_FALSE(deleted_string != deleted_string); + + CFX_ByteString byte_string("hello"); + EXPECT_FALSE(byte_string != byte_string); + EXPECT_TRUE(byte_string != null_string); + EXPECT_TRUE(byte_string != empty_string); + EXPECT_TRUE(byte_string != deleted_string); + EXPECT_TRUE(null_string != byte_string); + EXPECT_TRUE(empty_string != byte_string); + EXPECT_TRUE(deleted_string != byte_string); + + CFX_ByteString byte_string_same1("hello"); + EXPECT_FALSE(byte_string != byte_string_same1); + EXPECT_FALSE(byte_string_same1 != byte_string); + + CFX_ByteString byte_string_same2(byte_string); + EXPECT_FALSE(byte_string != byte_string_same2); + EXPECT_FALSE(byte_string_same2 != byte_string); + + CFX_ByteString byte_string1("he"); + CFX_ByteString byte_string2("hellp"); + CFX_ByteString byte_string3("hellod"); + EXPECT_TRUE(byte_string != byte_string1); + EXPECT_TRUE(byte_string != byte_string2); + EXPECT_TRUE(byte_string != byte_string3); + EXPECT_TRUE(byte_string1 != byte_string); + EXPECT_TRUE(byte_string2 != byte_string); + EXPECT_TRUE(byte_string3 != byte_string); + + CFX_ByteStringC null_string_c; + CFX_ByteStringC empty_string_c(""); + EXPECT_FALSE(null_string != null_string_c); + EXPECT_FALSE(null_string != empty_string_c); + EXPECT_FALSE(empty_string != null_string_c); + EXPECT_FALSE(empty_string != empty_string_c); + EXPECT_FALSE(null_string_c != null_string); + EXPECT_FALSE(empty_string_c != null_string); + EXPECT_FALSE(null_string_c != empty_string); + EXPECT_FALSE(empty_string_c != empty_string); + + CFX_ByteStringC byte_string_c_same1("hello"); + EXPECT_FALSE(byte_string != byte_string_c_same1); + EXPECT_FALSE(byte_string_c_same1 != byte_string); + + CFX_ByteStringC byte_string_c1("he"); + CFX_ByteStringC byte_string_c2("hellp"); + CFX_ByteStringC byte_string_c3("hellod"); + EXPECT_TRUE(byte_string != byte_string_c1); + EXPECT_TRUE(byte_string != byte_string_c2); + EXPECT_TRUE(byte_string != byte_string_c3); + EXPECT_TRUE(byte_string_c1 != byte_string); + EXPECT_TRUE(byte_string_c2 != byte_string); + EXPECT_TRUE(byte_string_c3 != byte_string); + + const char* c_null_string = nullptr; + const char* c_empty_string = ""; + EXPECT_FALSE(null_string != c_null_string); + EXPECT_FALSE(null_string != c_empty_string); + EXPECT_FALSE(empty_string != c_null_string); + EXPECT_FALSE(empty_string != c_empty_string); + EXPECT_FALSE(deleted_string != c_null_string); + EXPECT_FALSE(deleted_string != c_empty_string); + EXPECT_FALSE(c_null_string != null_string); + EXPECT_FALSE(c_empty_string != null_string); + EXPECT_FALSE(c_null_string != empty_string); + EXPECT_FALSE(c_empty_string != empty_string); + EXPECT_FALSE(c_null_string != deleted_string); + EXPECT_FALSE(c_empty_string != deleted_string); + + const char* c_string_same1 = "hello"; + EXPECT_FALSE(byte_string != c_string_same1); + EXPECT_FALSE(c_string_same1 != byte_string); + + const char* c_string1 = "he"; + const char* c_string2 = "hellp"; + const char* c_string3 = "hellod"; + EXPECT_TRUE(byte_string != c_string1); + EXPECT_TRUE(byte_string != c_string2); + EXPECT_TRUE(byte_string != c_string3); + EXPECT_TRUE(c_string1 != byte_string); + EXPECT_TRUE(c_string2 != byte_string); + EXPECT_TRUE(c_string3 != byte_string); +} + +TEST(fxcrt, ByteStringCNull) { + CFX_ByteStringC null_string; + EXPECT_FALSE(null_string.raw_str()); + EXPECT_EQ(null_string.GetLength(), 0); + EXPECT_TRUE(null_string.IsEmpty()); + + CFX_ByteStringC another_null_string; + EXPECT_EQ(null_string, another_null_string); + + CFX_ByteStringC copied_null_string(null_string); + EXPECT_FALSE(copied_null_string.raw_str()); + EXPECT_EQ(copied_null_string.GetLength(), 0); + EXPECT_TRUE(copied_null_string.IsEmpty()); + EXPECT_EQ(null_string, copied_null_string); + + CFX_ByteStringC empty_string(""); // Pointer to NUL, not NULL pointer. + EXPECT_TRUE(empty_string.raw_str()); + EXPECT_EQ(empty_string.GetLength(), 0); + EXPECT_TRUE(empty_string.IsEmpty()); + EXPECT_EQ(null_string, empty_string); + + CFX_ByteStringC assigned_null_string("initially not nullptr"); + assigned_null_string = null_string; + EXPECT_FALSE(assigned_null_string.raw_str()); + EXPECT_EQ(assigned_null_string.GetLength(), 0); + EXPECT_TRUE(assigned_null_string.IsEmpty()); + EXPECT_EQ(null_string, assigned_null_string); + + CFX_ByteStringC assigned_nullptr_string("initially not nullptr"); + assigned_nullptr_string = (const FX_CHAR*)nullptr; + EXPECT_FALSE(assigned_nullptr_string.raw_str()); + EXPECT_EQ(assigned_nullptr_string.GetLength(), 0); + EXPECT_TRUE(assigned_nullptr_string.IsEmpty()); + EXPECT_EQ(null_string, assigned_nullptr_string); + + CFX_ByteStringC non_null_string("a"); + EXPECT_NE(null_string, non_null_string); +} + +TEST(fxcrt, ByteStringConcat) { + CFX_ByteString fred; + fred.Concat("FRED", 4); + EXPECT_EQ("FRED", fred); + + fred.Concat("DY", 2); + EXPECT_EQ("FREDDY", fred); + + fred.Delete(3, 3); + EXPECT_EQ("FRE", fred); + + fred.Concat("D", 1); + EXPECT_EQ("FRED", fred); + + CFX_ByteString copy = fred; + fred.Concat("DY", 2); + EXPECT_EQ("FREDDY", fred); + EXPECT_EQ("FRED", copy); + + // Test invalid arguments. + copy = fred; + fred.Concat("freddy", -6); + CFX_ByteString not_aliased("xxxxxx"); + EXPECT_EQ("FREDDY", fred); + EXPECT_EQ("xxxxxx", not_aliased); +} + +TEST(fxcrt, ByteStringRemove) { + CFX_ByteString freed("FREED"); + freed.Remove('E'); + EXPECT_EQ("FRD", freed); + freed.Remove('F'); + EXPECT_EQ("RD", freed); + freed.Remove('D'); + EXPECT_EQ("R", freed); + freed.Remove('X'); + EXPECT_EQ("R", freed); + freed.Remove('R'); + EXPECT_EQ("", freed); + + CFX_ByteString empty; + empty.Remove('X'); + EXPECT_EQ("", empty); +} + +TEST(fxcrt, ByteStringRemoveCopies) { + CFX_ByteString freed("FREED"); + const FX_CHAR* old_buffer = freed.c_str(); + + // No change with single reference - no copy. + freed.Remove('Q'); + EXPECT_EQ("FREED", freed); + EXPECT_EQ(old_buffer, freed.c_str()); + + // Change with single reference - no copy. + freed.Remove('E'); + EXPECT_EQ("FRD", freed); + EXPECT_EQ(old_buffer, freed.c_str()); + + // No change with multiple references - no copy. + CFX_ByteString shared(freed); + freed.Remove('Q'); + EXPECT_EQ("FRD", freed); + EXPECT_EQ(old_buffer, freed.c_str()); + EXPECT_EQ(old_buffer, shared.c_str()); + + // Change with multiple references -- must copy. + freed.Remove('D'); + EXPECT_EQ("FR", freed); + EXPECT_NE(old_buffer, freed.c_str()); + EXPECT_EQ("FRD", shared); + EXPECT_EQ(old_buffer, shared.c_str()); +} + +TEST(fxcrt, ByteStringReplace) { + CFX_ByteString fred("FRED"); + fred.Replace("FR", "BL"); + EXPECT_EQ("BLED", fred); + fred.Replace("D", "DDY"); + EXPECT_EQ("BLEDDY", fred); + fred.Replace("LEDD", ""); + EXPECT_EQ("BY", fred); + fred.Replace("X", "CLAMS"); + EXPECT_EQ("BY", fred); + fred.Replace("BY", "HI"); + EXPECT_EQ("HI", fred); + fred.Replace("", "CLAMS"); + EXPECT_EQ("HI", fred); + fred.Replace("HI", ""); + EXPECT_EQ("", fred); +} + +TEST(fxcrt, ByteStringInsert) { + CFX_ByteString fred("FRED"); + fred.Insert(-1, 'X'); + EXPECT_EQ("XFRED", fred); + fred.Insert(0, 'S'); + EXPECT_EQ("SXFRED", fred); + fred.Insert(2, 'T'); + EXPECT_EQ("SXTFRED", fred); + fred.Insert(5, 'U'); + EXPECT_EQ("SXTFRUED", fred); + fred.Insert(8, 'V'); + EXPECT_EQ("SXTFRUEDV", fred); + fred.Insert(12, 'P'); + EXPECT_EQ("SXTFRUEDVP", fred); + { + CFX_ByteString empty; + empty.Insert(-1, 'X'); + EXPECT_EQ("X", empty); + } + { + CFX_ByteString empty; + empty.Insert(0, 'X'); + EXPECT_EQ("X", empty); + } + { + CFX_ByteString empty; + empty.Insert(5, 'X'); + EXPECT_EQ("X", empty); + } +} + +TEST(fxcrt, ByteStringDelete) { + CFX_ByteString fred("FRED"); + fred.Delete(0, 2); + EXPECT_EQ("ED", fred); + fred.Delete(1); + EXPECT_EQ("E", fred); + fred.Delete(-1); + EXPECT_EQ("", fred); + fred.Delete(1); + EXPECT_EQ("", fred); + + CFX_ByteString empty; + empty.Delete(0); + EXPECT_EQ("", empty); + empty.Delete(-1); + EXPECT_EQ("", empty); + empty.Delete(1); + EXPECT_EQ("", empty); +} + +TEST(fxcrt, ByteStringMid) { + CFX_ByteString fred("FRED"); + EXPECT_EQ("", fred.Mid(0, 0)); + EXPECT_EQ("", fred.Mid(3, 0)); + EXPECT_EQ("FRED", fred.Mid(0)); + EXPECT_EQ("RED", fred.Mid(1)); + EXPECT_EQ("ED", fred.Mid(2)); + EXPECT_EQ("D", fred.Mid(3)); + EXPECT_EQ("F", fred.Mid(0, 1)); + EXPECT_EQ("R", fred.Mid(1, 1)); + EXPECT_EQ("E", fred.Mid(2, 1)); + EXPECT_EQ("D", fred.Mid(3, 1)); + EXPECT_EQ("FR", fred.Mid(0, 2)); + EXPECT_EQ("FRED", fred.Mid(0, 4)); + EXPECT_EQ("FRED", fred.Mid(0, 10)); + + EXPECT_EQ("FR", fred.Mid(-1, 2)); + EXPECT_EQ("RED", fred.Mid(1, 4)); + EXPECT_EQ("", fred.Mid(4, 1)); + + CFX_ByteString empty; + EXPECT_EQ("", empty.Mid(0, 0)); + EXPECT_EQ("", empty.Mid(0)); + EXPECT_EQ("", empty.Mid(1)); + EXPECT_EQ("", empty.Mid(-1)); +} + +TEST(fxcrt, ByteStringLeft) { + CFX_ByteString fred("FRED"); + EXPECT_EQ("", fred.Left(0)); + EXPECT_EQ("F", fred.Left(1)); + EXPECT_EQ("FR", fred.Left(2)); + EXPECT_EQ("FRE", fred.Left(3)); + EXPECT_EQ("FRED", fred.Left(4)); + + EXPECT_EQ("FRED", fred.Left(5)); + EXPECT_EQ("", fred.Left(-1)); + + CFX_ByteString empty; + EXPECT_EQ("", empty.Left(0)); + EXPECT_EQ("", empty.Left(1)); + EXPECT_EQ("", empty.Left(-1)); +} + +TEST(fxcrt, ByteStringRight) { + CFX_ByteString fred("FRED"); + EXPECT_EQ("", fred.Right(0)); + EXPECT_EQ("D", fred.Right(1)); + EXPECT_EQ("ED", fred.Right(2)); + EXPECT_EQ("RED", fred.Right(3)); + EXPECT_EQ("FRED", fred.Right(4)); + + EXPECT_EQ("FRED", fred.Right(5)); + EXPECT_EQ("", fred.Right(-1)); + + CFX_ByteString empty; + EXPECT_EQ("", empty.Right(0)); + EXPECT_EQ("", empty.Right(1)); + EXPECT_EQ("", empty.Right(-1)); +} + +TEST(fxcrt, ByteStringUpperLower) { + CFX_ByteString fred("F-Re.42D"); + fred.MakeLower(); + EXPECT_EQ("f-re.42d", fred); + fred.MakeUpper(); + EXPECT_EQ("F-RE.42D", fred); + + CFX_ByteString empty; + empty.MakeLower(); + EXPECT_EQ("", empty); + empty.MakeUpper(); + EXPECT_EQ("", empty); +} + +TEST(fxcrt, ByteStringTrimRight) { + CFX_ByteString fred(" FRED "); + fred.TrimRight(); + EXPECT_EQ(" FRED", fred); + fred.TrimRight('E'); + EXPECT_EQ(" FRED", fred); + fred.TrimRight('D'); + EXPECT_EQ(" FRE", fred); + fred.TrimRight("ERP"); + EXPECT_EQ(" F", fred); + + CFX_ByteString blank(" "); + blank.TrimRight("ERP"); + EXPECT_EQ(" ", blank); + blank.TrimRight('E'); + EXPECT_EQ(" ", blank); + blank.TrimRight(); + EXPECT_EQ("", blank); + + CFX_ByteString empty; + empty.TrimRight("ERP"); + EXPECT_EQ("", empty); + empty.TrimRight('E'); + EXPECT_EQ("", empty); + empty.TrimRight(); + EXPECT_EQ("", empty); +} + +TEST(fxcrt, ByteStringTrimRightCopies) { + { + // With a single reference, no copy takes place. + CFX_ByteString fred(" FRED "); + const FX_CHAR* old_buffer = fred.c_str(); + fred.TrimRight(); + EXPECT_EQ(" FRED", fred); + EXPECT_EQ(old_buffer, fred.c_str()); + } + { + // With multiple references, we must copy. + CFX_ByteString fred(" FRED "); + CFX_ByteString other_fred = fred; + const FX_CHAR* old_buffer = fred.c_str(); + fred.TrimRight(); + EXPECT_EQ(" FRED", fred); + EXPECT_EQ(" FRED ", other_fred); + EXPECT_NE(old_buffer, fred.c_str()); + } + { + // With multiple references, but no modifications, no copy. + CFX_ByteString fred("FRED"); + CFX_ByteString other_fred = fred; + const FX_CHAR* old_buffer = fred.c_str(); + fred.TrimRight(); + EXPECT_EQ("FRED", fred); + EXPECT_EQ("FRED", other_fred); + EXPECT_EQ(old_buffer, fred.c_str()); + } +} + +TEST(fxcrt, ByteStringTrimLeft) { + CFX_ByteString fred(" FRED "); + fred.TrimLeft(); + EXPECT_EQ("FRED ", fred); + fred.TrimLeft('E'); + EXPECT_EQ("FRED ", fred); + fred.TrimLeft('F'); + EXPECT_EQ("RED ", fred); + fred.TrimLeft("ERP"); + EXPECT_EQ("D ", fred); + + CFX_ByteString blank(" "); + blank.TrimLeft("ERP"); + EXPECT_EQ(" ", blank); + blank.TrimLeft('E'); + EXPECT_EQ(" ", blank); + blank.TrimLeft(); + EXPECT_EQ("", blank); + + CFX_ByteString empty; + empty.TrimLeft("ERP"); + EXPECT_EQ("", empty); + empty.TrimLeft('E'); + EXPECT_EQ("", empty); + empty.TrimLeft(); + EXPECT_EQ("", empty); +} + +TEST(fxcrt, ByteStringTrimLeftCopies) { + { + // With a single reference, no copy takes place. + CFX_ByteString fred(" FRED "); + const FX_CHAR* old_buffer = fred.c_str(); + fred.TrimLeft(); + EXPECT_EQ("FRED ", fred); + EXPECT_EQ(old_buffer, fred.c_str()); + } + { + // With multiple references, we must copy. + CFX_ByteString fred(" FRED "); + CFX_ByteString other_fred = fred; + const FX_CHAR* old_buffer = fred.c_str(); + fred.TrimLeft(); + EXPECT_EQ("FRED ", fred); + EXPECT_EQ(" FRED ", other_fred); + EXPECT_NE(old_buffer, fred.c_str()); + } + { + // With multiple references, but no modifications, no copy. + CFX_ByteString fred("FRED"); + CFX_ByteString other_fred = fred; + const FX_CHAR* old_buffer = fred.c_str(); + fred.TrimLeft(); + EXPECT_EQ("FRED", fred); + EXPECT_EQ("FRED", other_fred); + EXPECT_EQ(old_buffer, fred.c_str()); + } +} + +TEST(fxcrt, ByteStringReserve) { + { + CFX_ByteString str; + str.Reserve(6); + const FX_CHAR* old_buffer = str.c_str(); + str += "ABCDEF"; + EXPECT_EQ(old_buffer, str.c_str()); + str += "Blah Blah Blah Blah Blah Blah"; + EXPECT_NE(old_buffer, str.c_str()); + } + { + CFX_ByteString str("A"); + str.Reserve(6); + const FX_CHAR* old_buffer = str.c_str(); + str += "BCDEF"; + EXPECT_EQ(old_buffer, str.c_str()); + str += "Blah Blah Blah Blah Blah Blah"; + EXPECT_NE(old_buffer, str.c_str()); + } +} + +TEST(fxcrt, ByteStringGetBuffer) { + { + CFX_ByteString str; + FX_CHAR* buffer = str.GetBuffer(12); + // NOLINTNEXTLINE(runtime/printf) + strcpy(buffer, "clams"); + str.ReleaseBuffer(); + EXPECT_EQ("clams", str); + } + { + CFX_ByteString str("cl"); + FX_CHAR* buffer = str.GetBuffer(12); + // NOLINTNEXTLINE(runtime/printf) + strcpy(buffer + 2, "ams"); + str.ReleaseBuffer(); + EXPECT_EQ("clams", str); + } +} + +TEST(fxcrt, ByteStringReleaseBuffer) { + { + CFX_ByteString str; + str.Reserve(12); + str += "clams"; + const FX_CHAR* old_buffer = str.c_str(); + str.ReleaseBuffer(4); + EXPECT_EQ(old_buffer, str.c_str()); + EXPECT_EQ("clam", str); + } + { + CFX_ByteString str("c"); + str.Reserve(12); + str += "lams"; + const FX_CHAR* old_buffer = str.c_str(); + str.ReleaseBuffer(4); + EXPECT_EQ(old_buffer, str.c_str()); + EXPECT_EQ("clam", str); + } + { + CFX_ByteString str; + str.Reserve(200); + str += "clams"; + const FX_CHAR* old_buffer = str.c_str(); + str.ReleaseBuffer(4); + EXPECT_NE(old_buffer, str.c_str()); + EXPECT_EQ("clam", str); + } + { + CFX_ByteString str("c"); + str.Reserve(200); + str += "lams"; + const FX_CHAR* old_buffer = str.c_str(); + str.ReleaseBuffer(4); + EXPECT_NE(old_buffer, str.c_str()); + EXPECT_EQ("clam", str); + } +} + +TEST(fxcrt, ByteStringCNotNull) { + CFX_ByteStringC string3("abc"); + CFX_ByteStringC string6("abcdef"); + CFX_ByteStringC alternate_string3("abcdef", 3); + CFX_ByteStringC embedded_nul_string7("abc\0def", 7); + CFX_ByteStringC illegal_string7("abcdef", 7); + + EXPECT_EQ(3, string3.GetLength()); + EXPECT_EQ(6, string6.GetLength()); + EXPECT_EQ(3, alternate_string3.GetLength()); + EXPECT_EQ(7, embedded_nul_string7.GetLength()); + EXPECT_EQ(7, illegal_string7.GetLength()); + + EXPECT_NE(string3, string6); + EXPECT_EQ(string3, alternate_string3); + EXPECT_NE(string3, embedded_nul_string7); + EXPECT_NE(string3, illegal_string7); + EXPECT_NE(string6, alternate_string3); + EXPECT_NE(string6, embedded_nul_string7); + EXPECT_NE(string6, illegal_string7); + EXPECT_NE(alternate_string3, embedded_nul_string7); + EXPECT_NE(alternate_string3, illegal_string7); + EXPECT_NE(embedded_nul_string7, illegal_string7); + + CFX_ByteStringC copied_string3(string3); + CFX_ByteStringC copied_alternate_string3(alternate_string3); + CFX_ByteStringC copied_embedded_nul_string7(embedded_nul_string7); + + EXPECT_EQ(string3, copied_string3); + EXPECT_EQ(alternate_string3, copied_alternate_string3); + EXPECT_EQ(embedded_nul_string7, copied_embedded_nul_string7); + + CFX_ByteStringC assigned_string3("intially something else"); + CFX_ByteStringC assigned_alternate_string3("initally something else"); + CFX_ByteStringC assigned_ptr_string3("initially something else"); + CFX_ByteStringC assigned_embedded_nul_string7("initially something else"); + + assigned_string3 = string3; + assigned_alternate_string3 = alternate_string3; + assigned_ptr_string3 = "abc"; + assigned_embedded_nul_string7 = embedded_nul_string7; + EXPECT_EQ(string3, assigned_string3); + EXPECT_EQ(alternate_string3, assigned_alternate_string3); + EXPECT_EQ(alternate_string3, assigned_ptr_string3); + EXPECT_EQ(embedded_nul_string7, assigned_embedded_nul_string7); +} + +TEST(fxcrt, ByteStringCFromChar) { + CFX_ByteStringC null_string; + CFX_ByteStringC lower_a_string("a"); + + // Must have lvalues that outlive the corresponding ByteStringC. + char nul = '\0'; + char lower_a = 'a'; + CFX_ByteStringC nul_string_from_char(nul); + CFX_ByteStringC lower_a_string_from_char(lower_a); + + // Pointer to nul, not nullptr ptr, hence length 1 ... + EXPECT_EQ(1, nul_string_from_char.GetLength()); + EXPECT_NE(null_string, nul_string_from_char); + + EXPECT_EQ(1, lower_a_string_from_char.GetLength()); + EXPECT_EQ(lower_a_string, lower_a_string_from_char); + EXPECT_NE(nul_string_from_char, lower_a_string_from_char); + + CFX_ByteStringC longer_string("ab"); + EXPECT_NE(longer_string, lower_a_string_from_char); +} + +TEST(fxcrt, ByteStringCGetID) { + CFX_ByteStringC null_string; + EXPECT_EQ(0u, null_string.GetID()); + EXPECT_EQ(0u, null_string.GetID(1)); + EXPECT_EQ(0u, null_string.GetID(-1)); + EXPECT_EQ(0u, null_string.GetID(-1000000)); + + CFX_ByteStringC empty_string(""); + EXPECT_EQ(0u, empty_string.GetID()); + EXPECT_EQ(0u, empty_string.GetID(1)); + EXPECT_EQ(0u, empty_string.GetID(-1)); + EXPECT_EQ(0u, empty_string.GetID(-1000000)); + + CFX_ByteStringC short_string("ab"); + EXPECT_EQ(FXBSTR_ID('a', 'b', 0, 0), short_string.GetID()); + EXPECT_EQ(FXBSTR_ID('b', 0, 0, 0), short_string.GetID(1)); + EXPECT_EQ(0u, short_string.GetID(2)); + EXPECT_EQ(0u, short_string.GetID(-1)); + EXPECT_EQ(0u, short_string.GetID(-1000000)); + + CFX_ByteStringC longer_string("abcdef"); + EXPECT_EQ(FXBSTR_ID('a', 'b', 'c', 'd'), longer_string.GetID()); + EXPECT_EQ(FXBSTR_ID('b', 'c', 'd', 'e'), longer_string.GetID(1)); + EXPECT_EQ(FXBSTR_ID('c', 'd', 'e', 'f'), longer_string.GetID(2)); + EXPECT_EQ(FXBSTR_ID('d', 'e', 'f', 0), longer_string.GetID(3)); + EXPECT_EQ(FXBSTR_ID('e', 'f', 0, 0), longer_string.GetID(4)); + EXPECT_EQ(FXBSTR_ID('f', 0, 0, 0), longer_string.GetID(5)); + EXPECT_EQ(0u, longer_string.GetID(6)); + EXPECT_EQ(0u, longer_string.GetID(-1)); + EXPECT_EQ(0u, longer_string.GetID(-1000000)); +} + +TEST(fxcrt, ByteStringCFind) { + CFX_ByteStringC null_string; + EXPECT_EQ(-1, null_string.Find('a')); + EXPECT_EQ(-1, null_string.Find(0)); + + CFX_ByteStringC empty_string(""); + EXPECT_EQ(-1, empty_string.Find('a')); + EXPECT_EQ(-1, empty_string.Find(0)); + + CFX_ByteStringC single_string("a"); + EXPECT_EQ(0, single_string.Find('a')); + EXPECT_EQ(-1, single_string.Find('b')); + EXPECT_EQ(-1, single_string.Find(0)); + + CFX_ByteStringC longer_string("abccc"); + EXPECT_EQ(0, longer_string.Find('a')); + EXPECT_EQ(2, longer_string.Find('c')); + EXPECT_EQ(-1, longer_string.Find(0)); + + CFX_ByteStringC hibyte_string( + "ab\x8c" + "def"); + EXPECT_EQ(2, hibyte_string.Find('\x8c')); +} + +TEST(fxcrt, ByteStringCMid) { + CFX_ByteStringC null_string; + EXPECT_EQ(null_string, null_string.Mid(0, 1)); + EXPECT_EQ(null_string, null_string.Mid(1, 1)); + + CFX_ByteStringC empty_string(""); + EXPECT_EQ(empty_string, empty_string.Mid(0, 1)); + EXPECT_EQ(empty_string, empty_string.Mid(1, 1)); + + CFX_ByteStringC single_character("a"); + EXPECT_EQ(empty_string, single_character.Mid(0, 0)); + EXPECT_EQ(single_character, single_character.Mid(0, 1)); + EXPECT_EQ(empty_string, single_character.Mid(1, 0)); + EXPECT_EQ(empty_string, single_character.Mid(1, 1)); + + CFX_ByteStringC longer_string("abcdef"); + EXPECT_EQ(longer_string, longer_string.Mid(0, 6)); + EXPECT_EQ(longer_string, longer_string.Mid(0, 187)); + EXPECT_EQ(longer_string, longer_string.Mid(-42, 6)); + EXPECT_EQ(longer_string, longer_string.Mid(-42, 187)); + + CFX_ByteStringC leading_substring("ab"); + EXPECT_EQ(leading_substring, longer_string.Mid(0, 2)); + EXPECT_EQ(leading_substring, longer_string.Mid(-1, 2)); + + CFX_ByteStringC middle_substring("bcde"); + EXPECT_EQ(middle_substring, longer_string.Mid(1, 4)); + + CFX_ByteStringC trailing_substring("ef"); + EXPECT_EQ(trailing_substring, longer_string.Mid(4, 2)); + EXPECT_EQ(trailing_substring, longer_string.Mid(4, 3)); +} + +TEST(fxcrt, ByteStringCGetAt) { + CFX_ByteString short_string("a"); + CFX_ByteString longer_string("abc"); + CFX_ByteString embedded_nul_string("ab\0c", 4); + + EXPECT_EQ('a', short_string.GetAt(0)); + EXPECT_EQ('c', longer_string.GetAt(2)); + EXPECT_EQ('b', embedded_nul_string.GetAt(1)); + EXPECT_EQ('\0', embedded_nul_string.GetAt(2)); + EXPECT_EQ('c', embedded_nul_string.GetAt(3)); +} + +TEST(fxcrt, ByteStringCOperatorSubscript) { + // CFX_ByteStringC includes the NUL terminator for non-empty strings. + CFX_ByteStringC abc("abc"); + EXPECT_EQ('a', abc[0]); + EXPECT_EQ('b', abc[1]); + EXPECT_EQ('c', abc[2]); + EXPECT_EQ(0, abc[3]); +} + +TEST(fxcrt, ByteStringCOperatorLT) { + CFX_ByteStringC empty; + CFX_ByteStringC a("a"); + CFX_ByteStringC abc("abc"); + CFX_ByteStringC def("def"); + + EXPECT_FALSE(empty < empty); + EXPECT_FALSE(a < a); + EXPECT_FALSE(abc < abc); + EXPECT_FALSE(def < def); + + EXPECT_TRUE(empty < a); + EXPECT_FALSE(a < empty); + + EXPECT_TRUE(empty < abc); + EXPECT_FALSE(abc < empty); + + EXPECT_TRUE(empty < def); + EXPECT_FALSE(def < empty); + + EXPECT_TRUE(a < abc); + EXPECT_FALSE(abc < a); + + EXPECT_TRUE(a < def); + EXPECT_FALSE(def < a); + + EXPECT_TRUE(abc < def); + EXPECT_FALSE(def < abc); +} + +TEST(fxcrt, ByteStringCOperatorEQ) { + CFX_ByteStringC byte_string_c("hello"); + EXPECT_TRUE(byte_string_c == byte_string_c); + + CFX_ByteStringC byte_string_c_same1("hello"); + EXPECT_TRUE(byte_string_c == byte_string_c_same1); + EXPECT_TRUE(byte_string_c_same1 == byte_string_c); + + CFX_ByteStringC byte_string_c_same2(byte_string_c); + EXPECT_TRUE(byte_string_c == byte_string_c_same2); + EXPECT_TRUE(byte_string_c_same2 == byte_string_c); + + CFX_ByteStringC byte_string_c1("he"); + CFX_ByteStringC byte_string_c2("hellp"); + CFX_ByteStringC byte_string_c3("hellod"); + EXPECT_FALSE(byte_string_c == byte_string_c1); + EXPECT_FALSE(byte_string_c == byte_string_c2); + EXPECT_FALSE(byte_string_c == byte_string_c3); + EXPECT_FALSE(byte_string_c1 == byte_string_c); + EXPECT_FALSE(byte_string_c2 == byte_string_c); + EXPECT_FALSE(byte_string_c3 == byte_string_c); + + CFX_ByteString byte_string_same1("hello"); + EXPECT_TRUE(byte_string_c == byte_string_same1); + EXPECT_TRUE(byte_string_same1 == byte_string_c); + + CFX_ByteString byte_string1("he"); + CFX_ByteString byte_string2("hellp"); + CFX_ByteString byte_string3("hellod"); + EXPECT_FALSE(byte_string_c == byte_string1); + EXPECT_FALSE(byte_string_c == byte_string2); + EXPECT_FALSE(byte_string_c == byte_string3); + EXPECT_FALSE(byte_string1 == byte_string_c); + EXPECT_FALSE(byte_string2 == byte_string_c); + EXPECT_FALSE(byte_string3 == byte_string_c); + + const char* c_string_same1 = "hello"; + EXPECT_TRUE(byte_string_c == c_string_same1); + EXPECT_TRUE(c_string_same1 == byte_string_c); + + const char* c_string1 = "he"; + const char* c_string2 = "hellp"; + const char* c_string3 = "hellod"; + EXPECT_FALSE(byte_string_c == c_string1); + EXPECT_FALSE(byte_string_c == c_string2); + EXPECT_FALSE(byte_string_c == c_string3); + + EXPECT_FALSE(c_string1 == byte_string_c); + EXPECT_FALSE(c_string2 == byte_string_c); + EXPECT_FALSE(c_string3 == byte_string_c); +} + +TEST(fxcrt, ByteStringCOperatorNE) { + CFX_ByteStringC byte_string_c("hello"); + EXPECT_FALSE(byte_string_c != byte_string_c); + + CFX_ByteStringC byte_string_c_same1("hello"); + EXPECT_FALSE(byte_string_c != byte_string_c_same1); + EXPECT_FALSE(byte_string_c_same1 != byte_string_c); + + CFX_ByteStringC byte_string_c_same2(byte_string_c); + EXPECT_FALSE(byte_string_c != byte_string_c_same2); + EXPECT_FALSE(byte_string_c_same2 != byte_string_c); + + CFX_ByteStringC byte_string_c1("he"); + CFX_ByteStringC byte_string_c2("hellp"); + CFX_ByteStringC byte_string_c3("hellod"); + EXPECT_TRUE(byte_string_c != byte_string_c1); + EXPECT_TRUE(byte_string_c != byte_string_c2); + EXPECT_TRUE(byte_string_c != byte_string_c3); + EXPECT_TRUE(byte_string_c1 != byte_string_c); + EXPECT_TRUE(byte_string_c2 != byte_string_c); + EXPECT_TRUE(byte_string_c3 != byte_string_c); + + CFX_ByteString byte_string_same1("hello"); + EXPECT_FALSE(byte_string_c != byte_string_same1); + EXPECT_FALSE(byte_string_same1 != byte_string_c); + + CFX_ByteString byte_string1("he"); + CFX_ByteString byte_string2("hellp"); + CFX_ByteString byte_string3("hellod"); + EXPECT_TRUE(byte_string_c != byte_string1); + EXPECT_TRUE(byte_string_c != byte_string2); + EXPECT_TRUE(byte_string_c != byte_string3); + EXPECT_TRUE(byte_string1 != byte_string_c); + EXPECT_TRUE(byte_string2 != byte_string_c); + EXPECT_TRUE(byte_string3 != byte_string_c); + + const char* c_string_same1 = "hello"; + EXPECT_FALSE(byte_string_c != c_string_same1); + EXPECT_FALSE(c_string_same1 != byte_string_c); + + const char* c_string1 = "he"; + const char* c_string2 = "hellp"; + const char* c_string3 = "hellod"; + EXPECT_TRUE(byte_string_c != c_string1); + EXPECT_TRUE(byte_string_c != c_string2); + EXPECT_TRUE(byte_string_c != c_string3); + + EXPECT_TRUE(c_string1 != byte_string_c); + EXPECT_TRUE(c_string2 != byte_string_c); + EXPECT_TRUE(c_string3 != byte_string_c); +} + +TEST(fxcrt, ByteStringFormatWidth) { + { + CFX_ByteString str; + str.Format("%5d", 1); + EXPECT_EQ(" 1", str); + } + + { + CFX_ByteString str; + str.Format("%d", 1); + EXPECT_EQ("1", str); + } + + { + CFX_ByteString str; + str.Format("%*d", 5, 1); + EXPECT_EQ(" 1", str); + } + + { + CFX_ByteString str; + str.Format("%-1d", 1); + EXPECT_EQ("1", str); + } + + { + CFX_ByteString str; + str.Format("%0d", 1); + EXPECT_EQ("1", str); + } + + { + CFX_ByteString str; + str.Format("%1048576d", 1); + EXPECT_EQ("Bad width", str); + } +} + +TEST(fxcrt, ByteStringFormatPrecision) { + { + CFX_ByteString str; + str.Format("%.2f", 1.12345); + EXPECT_EQ("1.12", str); + } + + { + CFX_ByteString str; + str.Format("%.*f", 3, 1.12345); + EXPECT_EQ("1.123", str); + } + + { + CFX_ByteString str; + str.Format("%f", 1.12345); + EXPECT_EQ("1.123450", str); + } + + { + CFX_ByteString str; + str.Format("%-1f", 1.12345); + EXPECT_EQ("1.123450", str); + } + + { + CFX_ByteString str; + str.Format("%0f", 1.12345); + EXPECT_EQ("1.123450", str); + } + + { + CFX_ByteString str; + str.Format("%.1048576f", 1.2); + EXPECT_EQ("Bad precision", str); + } +} + +TEST(fxcrt, EmptyByteString) { + CFX_ByteString empty_str; + EXPECT_TRUE(empty_str.IsEmpty()); + EXPECT_EQ(0, empty_str.GetLength()); + const FX_CHAR* cstr = empty_str.c_str(); + EXPECT_EQ(0, FXSYS_strlen(cstr)); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_buffer.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_buffer.cpp new file mode 100644 index 000000000000..14a85c2ee5ed --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_buffer.cpp @@ -0,0 +1,288 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include +#include +#include +#include + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_safe_types.h" +#include "third_party/base/numerics/safe_conversions.h" + +CFX_BinaryBuf::CFX_BinaryBuf() + : m_AllocStep(0), m_AllocSize(0), m_DataSize(0) {} + +CFX_BinaryBuf::CFX_BinaryBuf(FX_STRSIZE size) + : m_AllocStep(0), m_AllocSize(size), m_DataSize(size) { + m_pBuffer.reset(FX_Alloc(uint8_t, size)); +} + +CFX_BinaryBuf::~CFX_BinaryBuf() {} + +void CFX_BinaryBuf::Delete(int start_index, int count) { + if (!m_pBuffer || start_index < 0 || count < 0 || count > m_DataSize || + start_index > m_DataSize - count) { + return; + } + FXSYS_memmove(m_pBuffer.get() + start_index, + m_pBuffer.get() + start_index + count, + m_DataSize - start_index - count); + m_DataSize -= count; +} + +void CFX_BinaryBuf::Clear() { + m_DataSize = 0; +} + +std::unique_ptr CFX_BinaryBuf::DetachBuffer() { + m_DataSize = 0; + m_AllocSize = 0; + return std::move(m_pBuffer); +} + +void CFX_BinaryBuf::EstimateSize(FX_STRSIZE size, FX_STRSIZE step) { + m_AllocStep = step; + if (m_AllocSize < size) + ExpandBuf(size - m_DataSize); +} + +void CFX_BinaryBuf::ExpandBuf(FX_STRSIZE add_size) { + FX_SAFE_STRSIZE new_size = m_DataSize; + new_size += add_size; + if (m_AllocSize >= new_size.ValueOrDie()) + return; + + int alloc_step = std::max(128, m_AllocStep ? m_AllocStep : m_AllocSize / 4); + new_size += alloc_step - 1; // Quantize, don't combine these lines. + new_size /= alloc_step; + new_size *= alloc_step; + m_AllocSize = new_size.ValueOrDie(); + m_pBuffer.reset(m_pBuffer + ? FX_Realloc(uint8_t, m_pBuffer.release(), m_AllocSize) + : FX_Alloc(uint8_t, m_AllocSize)); +} + +void CFX_BinaryBuf::AppendBlock(const void* pBuf, FX_STRSIZE size) { + if (size <= 0) + return; + + ExpandBuf(size); + if (pBuf) { + FXSYS_memcpy(m_pBuffer.get() + m_DataSize, pBuf, size); + } else { + FXSYS_memset(m_pBuffer.get() + m_DataSize, 0, size); + } + m_DataSize += size; +} + +void CFX_BinaryBuf::InsertBlock(FX_STRSIZE pos, + const void* pBuf, + FX_STRSIZE size) { + if (size <= 0) + return; + + ExpandBuf(size); + FXSYS_memmove(m_pBuffer.get() + pos + size, m_pBuffer.get() + pos, + m_DataSize - pos); + if (pBuf) { + FXSYS_memcpy(m_pBuffer.get() + pos, pBuf, size); + } else { + FXSYS_memset(m_pBuffer.get() + pos, 0, size); + } + m_DataSize += size; +} + +CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(const CFX_ByteStringC& lpsz) { + AppendBlock(lpsz.raw_str(), lpsz.GetLength()); + return *this; +} + +CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(int i) { + char buf[32]; + FXSYS_itoa(i, buf, 10); + AppendBlock(buf, FXSYS_strlen(buf)); + return *this; +} + +CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(uint32_t i) { + char buf[32]; + FXSYS_itoa(i, buf, 10); + AppendBlock(buf, FXSYS_strlen(buf)); + return *this; +} + +CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(double f) { + char buf[32]; + FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf); + AppendBlock(buf, len); + return *this; +} + +CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(const CFX_ByteTextBuf& buf) { + AppendBlock(buf.m_pBuffer.get(), buf.m_DataSize); + return *this; +} + +void CFX_WideTextBuf::AppendChar(FX_WCHAR ch) { + ExpandBuf(sizeof(FX_WCHAR)); + *(FX_WCHAR*)(m_pBuffer.get() + m_DataSize) = ch; + m_DataSize += sizeof(FX_WCHAR); +} + +CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const CFX_WideStringC& str) { + AppendBlock(str.c_str(), str.GetLength() * sizeof(FX_WCHAR)); + return *this; +} + +CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const CFX_WideString& str) { + AppendBlock(str.c_str(), str.GetLength() * sizeof(FX_WCHAR)); + return *this; +} + +CFX_WideTextBuf& CFX_WideTextBuf::operator<<(int i) { + char buf[32]; + FXSYS_itoa(i, buf, 10); + FX_STRSIZE len = FXSYS_strlen(buf); + ExpandBuf(len * sizeof(FX_WCHAR)); + FX_WCHAR* str = (FX_WCHAR*)(m_pBuffer.get() + m_DataSize); + for (FX_STRSIZE j = 0; j < len; j++) { + *str++ = buf[j]; + } + m_DataSize += len * sizeof(FX_WCHAR); + return *this; +} + +CFX_WideTextBuf& CFX_WideTextBuf::operator<<(double f) { + char buf[32]; + FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf); + ExpandBuf(len * sizeof(FX_WCHAR)); + FX_WCHAR* str = (FX_WCHAR*)(m_pBuffer.get() + m_DataSize); + for (FX_STRSIZE i = 0; i < len; i++) { + *str++ = buf[i]; + } + m_DataSize += len * sizeof(FX_WCHAR); + return *this; +} + +CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const FX_WCHAR* lpsz) { + AppendBlock(lpsz, FXSYS_wcslen(lpsz) * sizeof(FX_WCHAR)); + return *this; +} + +CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const CFX_WideTextBuf& buf) { + AppendBlock(buf.m_pBuffer.get(), buf.m_DataSize); + return *this; +} + +void CFX_BitStream::Init(const uint8_t* pData, uint32_t dwSize) { + m_pData = pData; + m_BitSize = dwSize * 8; + m_BitPos = 0; +} + +void CFX_BitStream::ByteAlign() { + m_BitPos = (m_BitPos + 7) & ~7; +} + +uint32_t CFX_BitStream::GetBits(uint32_t nBits) { + if (nBits > m_BitSize || m_BitPos + nBits > m_BitSize) + return 0; + + if (nBits == 1) { + int bit = (m_pData[m_BitPos / 8] & (1 << (7 - m_BitPos % 8))) ? 1 : 0; + m_BitPos++; + return bit; + } + + uint32_t byte_pos = m_BitPos / 8; + uint32_t bit_pos = m_BitPos % 8; + uint32_t bit_left = nBits; + uint32_t result = 0; + if (bit_pos) { + if (8 - bit_pos >= bit_left) { + result = + (m_pData[byte_pos] & (0xff >> bit_pos)) >> (8 - bit_pos - bit_left); + m_BitPos += bit_left; + return result; + } + bit_left -= 8 - bit_pos; + result = (m_pData[byte_pos++] & ((1 << (8 - bit_pos)) - 1)) << bit_left; + } + while (bit_left >= 8) { + bit_left -= 8; + result |= m_pData[byte_pos++] << bit_left; + } + if (bit_left) + result |= m_pData[byte_pos] >> (8 - bit_left); + m_BitPos += nBits; + return result; +} + +CFX_FileBufferArchive::CFX_FileBufferArchive() + : m_Length(0), m_pFile(nullptr) {} + +CFX_FileBufferArchive::~CFX_FileBufferArchive() {} + +void CFX_FileBufferArchive::Clear() { + m_Length = 0; + m_pBuffer.reset(); + m_pFile.Reset(); +} + +bool CFX_FileBufferArchive::Flush() { + size_t nRemaining = m_Length; + m_Length = 0; + if (!m_pFile) + return false; + if (!m_pBuffer || !nRemaining) + return true; + return m_pFile->WriteBlock(m_pBuffer.get(), nRemaining); +} + +int32_t CFX_FileBufferArchive::AppendBlock(const void* pBuf, size_t size) { + if (!pBuf || size < 1) + return 0; + + if (!m_pBuffer) + m_pBuffer.reset(FX_Alloc(uint8_t, kBufSize)); + + const uint8_t* buffer = reinterpret_cast(pBuf); + size_t temp_size = size; + while (temp_size) { + size_t buf_size = std::min(kBufSize - m_Length, temp_size); + FXSYS_memcpy(m_pBuffer.get() + m_Length, buffer, buf_size); + m_Length += buf_size; + if (m_Length == kBufSize) { + if (!Flush()) { + return -1; + } + } + temp_size -= buf_size; + buffer += buf_size; + } + return pdfium::base::checked_cast(size); +} + +int32_t CFX_FileBufferArchive::AppendByte(uint8_t byte) { + return AppendBlock(&byte, 1); +} + +int32_t CFX_FileBufferArchive::AppendDWord(uint32_t i) { + char buf[32]; + FXSYS_itoa(i, buf, 10); + return AppendBlock(buf, (size_t)FXSYS_strlen(buf)); +} + +int32_t CFX_FileBufferArchive::AppendString(const CFX_ByteStringC& lpsz) { + return AppendBlock(lpsz.raw_str(), lpsz.GetLength()); +} + +void CFX_FileBufferArchive::AttachFile( + const CFX_RetainPtr& pFile) { + ASSERT(pFile); + m_pFile = pFile; +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_coords.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_coords.cpp new file mode 100644 index 000000000000..cb5a01042713 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_coords.cpp @@ -0,0 +1,416 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_ext.h" + +namespace { + +void MatchFloatRange(FX_FLOAT f1, FX_FLOAT f2, int* i1, int* i2) { + int length = static_cast(FXSYS_ceil(f2 - f1)); + int i1_1 = static_cast(FXSYS_floor(f1)); + int i1_2 = static_cast(FXSYS_ceil(f1)); + FX_FLOAT error1 = f1 - i1_1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_1 - length); + FX_FLOAT error2 = i1_2 - f1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_2 - length); + + *i1 = (error1 > error2) ? i1_2 : i1_1; + *i2 = *i1 + length; +} + +} // namespace + +void FX_RECT::Normalize() { + if (left > right) { + int temp = left; + left = right; + right = temp; + } + if (top > bottom) { + int temp = top; + top = bottom; + bottom = temp; + } +} +void FX_RECT::Intersect(const FX_RECT& src) { + FX_RECT src_n = src; + src_n.Normalize(); + Normalize(); + left = left > src_n.left ? left : src_n.left; + top = top > src_n.top ? top : src_n.top; + right = right < src_n.right ? right : src_n.right; + bottom = bottom < src_n.bottom ? bottom : src_n.bottom; + if (left > right || top > bottom) { + left = top = right = bottom = 0; + } +} + +bool GetIntersection(FX_FLOAT low1, + FX_FLOAT high1, + FX_FLOAT low2, + FX_FLOAT high2, + FX_FLOAT& interlow, + FX_FLOAT& interhigh) { + if (low1 >= high2 || low2 >= high1) { + return false; + } + interlow = low1 > low2 ? low1 : low2; + interhigh = high1 > high2 ? high2 : high1; + return true; +} +extern "C" int FXSYS_round(FX_FLOAT d) { + if (d < (FX_FLOAT)INT_MIN) { + return INT_MIN; + } + if (d > (FX_FLOAT)INT_MAX) { + return INT_MAX; + } + + return (int)round(d); +} +CFX_FloatRect::CFX_FloatRect(const FX_RECT& rect) { + left = (FX_FLOAT)(rect.left); + right = (FX_FLOAT)(rect.right); + bottom = (FX_FLOAT)(rect.top); + top = (FX_FLOAT)(rect.bottom); +} +void CFX_FloatRect::Normalize() { + FX_FLOAT temp; + if (left > right) { + temp = left; + left = right; + right = temp; + } + if (bottom > top) { + temp = top; + top = bottom; + bottom = temp; + } +} +void CFX_FloatRect::Intersect(const CFX_FloatRect& other_rect) { + Normalize(); + CFX_FloatRect other = other_rect; + other.Normalize(); + left = left > other.left ? left : other.left; + right = right < other.right ? right : other.right; + bottom = bottom > other.bottom ? bottom : other.bottom; + top = top < other.top ? top : other.top; + if (left > right || bottom > top) { + left = right = bottom = top = 0; + } +} +void CFX_FloatRect::Union(const CFX_FloatRect& other_rect) { + Normalize(); + CFX_FloatRect other = other_rect; + other.Normalize(); + left = left < other.left ? left : other.left; + right = right > other.right ? right : other.right; + bottom = bottom < other.bottom ? bottom : other.bottom; + top = top > other.top ? top : other.top; +} + +int CFX_FloatRect::Substract4(CFX_FloatRect& s, CFX_FloatRect* pRects) { + Normalize(); + s.Normalize(); + int nRects = 0; + CFX_FloatRect rects[4]; + if (left < s.left) { + rects[nRects].left = left; + rects[nRects].right = s.left; + rects[nRects].bottom = bottom; + rects[nRects].top = top; + nRects++; + } + if (s.left < right && s.top < top) { + rects[nRects].left = s.left; + rects[nRects].right = right; + rects[nRects].bottom = s.top; + rects[nRects].top = top; + nRects++; + } + if (s.top > bottom && s.right < right) { + rects[nRects].left = s.right; + rects[nRects].right = right; + rects[nRects].bottom = bottom; + rects[nRects].top = s.top; + nRects++; + } + if (s.bottom > bottom) { + rects[nRects].left = s.left; + rects[nRects].right = s.right; + rects[nRects].bottom = bottom; + rects[nRects].top = s.bottom; + nRects++; + } + if (nRects == 0) { + return 0; + } + for (int i = 0; i < nRects; i++) { + pRects[i] = rects[i]; + pRects[i].Intersect(*this); + } + return nRects; +} + +FX_RECT CFX_FloatRect::GetOuterRect() const { + CFX_FloatRect rect1 = *this; + FX_RECT rect; + rect.left = (int)FXSYS_floor(rect1.left); + rect.right = (int)FXSYS_ceil(rect1.right); + rect.top = (int)FXSYS_floor(rect1.bottom); + rect.bottom = (int)FXSYS_ceil(rect1.top); + rect.Normalize(); + return rect; +} + +FX_RECT CFX_FloatRect::GetInnerRect() const { + CFX_FloatRect rect1 = *this; + FX_RECT rect; + rect.left = (int)FXSYS_ceil(rect1.left); + rect.right = (int)FXSYS_floor(rect1.right); + rect.top = (int)FXSYS_ceil(rect1.bottom); + rect.bottom = (int)FXSYS_floor(rect1.top); + rect.Normalize(); + return rect; +} + +FX_RECT CFX_FloatRect::GetClosestRect() const { + CFX_FloatRect rect1 = *this; + FX_RECT rect; + MatchFloatRange(rect1.left, rect1.right, &rect.left, &rect.right); + MatchFloatRange(rect1.bottom, rect1.top, &rect.top, &rect.bottom); + rect.Normalize(); + return rect; +} + +bool CFX_FloatRect::Contains(const CFX_PointF& point) const { + CFX_FloatRect n1(*this); + n1.Normalize(); + return point.x <= n1.right && point.x >= n1.left && point.y <= n1.top && + point.y >= n1.bottom; +} + +bool CFX_FloatRect::Contains(const CFX_FloatRect& other_rect) const { + CFX_FloatRect n1(*this); + CFX_FloatRect n2(other_rect); + n1.Normalize(); + n2.Normalize(); + return n2.left >= n1.left && n2.right <= n1.right && n2.bottom >= n1.bottom && + n2.top <= n1.top; +} + +void CFX_FloatRect::UpdateRect(FX_FLOAT x, FX_FLOAT y) { + left = std::min(left, x); + right = std::max(right, x); + bottom = std::min(bottom, y); + top = std::max(top, y); +} + +CFX_FloatRect CFX_FloatRect::GetBBox(const CFX_PointF* pPoints, int nPoints) { + if (nPoints == 0) + return CFX_FloatRect(); + + FX_FLOAT min_x = pPoints->x; + FX_FLOAT max_x = pPoints->x; + FX_FLOAT min_y = pPoints->y; + FX_FLOAT max_y = pPoints->y; + for (int i = 1; i < nPoints; i++) { + min_x = std::min(min_x, pPoints[i].x); + max_x = std::max(max_x, pPoints[i].x); + min_y = std::min(min_y, pPoints[i].y); + max_y = std::max(max_y, pPoints[i].y); + } + return CFX_FloatRect(min_x, min_y, max_x, max_y); +} + +void CFX_Matrix::SetReverse(const CFX_Matrix& m) { + FX_FLOAT i = m.a * m.d - m.b * m.c; + if (FXSYS_fabs(i) == 0) + return; + + FX_FLOAT j = -i; + a = m.d / i; + b = m.b / j; + c = m.c / j; + d = m.a / i; + e = (m.c * m.f - m.d * m.e) / i; + f = (m.a * m.f - m.b * m.e) / j; +} + +void CFX_Matrix::Concat(const CFX_Matrix& m, bool bPrepended) { + ConcatInternal(m, bPrepended); +} + +void CFX_Matrix::ConcatInverse(const CFX_Matrix& src, bool bPrepended) { + CFX_Matrix m; + m.SetReverse(src); + Concat(m, bPrepended); +} + +bool CFX_Matrix::Is90Rotated() const { + return FXSYS_fabs(a * 1000) < FXSYS_fabs(b) && + FXSYS_fabs(d * 1000) < FXSYS_fabs(c); +} + +bool CFX_Matrix::IsScaled() const { + return FXSYS_fabs(b * 1000) < FXSYS_fabs(a) && + FXSYS_fabs(c * 1000) < FXSYS_fabs(d); +} + +void CFX_Matrix::Translate(FX_FLOAT x, FX_FLOAT y, bool bPrepended) { + if (bPrepended) { + e += x * a + y * c; + f += y * d + x * b; + return; + } + e += x; + f += y; +} + +void CFX_Matrix::Scale(FX_FLOAT sx, FX_FLOAT sy, bool bPrepended) { + a *= sx; + d *= sy; + if (bPrepended) { + b *= sx; + c *= sy; + return; + } + + b *= sy; + c *= sx; + e *= sx; + f *= sy; +} + +void CFX_Matrix::Rotate(FX_FLOAT fRadian, bool bPrepended) { + FX_FLOAT cosValue = FXSYS_cos(fRadian); + FX_FLOAT sinValue = FXSYS_sin(fRadian); + ConcatInternal(CFX_Matrix(cosValue, sinValue, -sinValue, cosValue, 0, 0), + bPrepended); +} + +void CFX_Matrix::RotateAt(FX_FLOAT fRadian, + FX_FLOAT dx, + FX_FLOAT dy, + bool bPrepended) { + Translate(dx, dy, bPrepended); + Rotate(fRadian, bPrepended); + Translate(-dx, -dy, bPrepended); +} + +void CFX_Matrix::Shear(FX_FLOAT fAlphaRadian, + FX_FLOAT fBetaRadian, + bool bPrepended) { + ConcatInternal( + CFX_Matrix(1, FXSYS_tan(fAlphaRadian), FXSYS_tan(fBetaRadian), 1, 0, 0), + bPrepended); +} + +void CFX_Matrix::MatchRect(const CFX_FloatRect& dest, + const CFX_FloatRect& src) { + FX_FLOAT fDiff = src.left - src.right; + a = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.left - dest.right) / fDiff; + + fDiff = src.bottom - src.top; + d = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.bottom - dest.top) / fDiff; + e = dest.left - src.left * a; + f = dest.bottom - src.bottom * d; + b = 0; + c = 0; +} + +FX_FLOAT CFX_Matrix::GetXUnit() const { + if (b == 0) + return (a > 0 ? a : -a); + if (a == 0) + return (b > 0 ? b : -b); + return FXSYS_sqrt(a * a + b * b); +} + +FX_FLOAT CFX_Matrix::GetYUnit() const { + if (c == 0) + return (d > 0 ? d : -d); + if (d == 0) + return (c > 0 ? c : -c); + return FXSYS_sqrt(c * c + d * d); +} + +CFX_FloatRect CFX_Matrix::GetUnitRect() const { + CFX_FloatRect rect(0, 0, 1, 1); + TransformRect(rect); + return rect; +} + +FX_FLOAT CFX_Matrix::TransformXDistance(FX_FLOAT dx) const { + FX_FLOAT fx = a * dx; + FX_FLOAT fy = b * dx; + return FXSYS_sqrt(fx * fx + fy * fy); +} + +FX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const { + FX_FLOAT fx = a * dx + c * dy; + FX_FLOAT fy = b * dx + d * dy; + return FXSYS_sqrt(fx * fx + fy * fy); +} + +FX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT distance) const { + return distance * (GetXUnit() + GetYUnit()) / 2; +} + +CFX_PointF CFX_Matrix::Transform(const CFX_PointF& point) const { + return CFX_PointF(a * point.x + c * point.y + e, + b * point.x + d * point.y + f); +} + +void CFX_Matrix::TransformRect(CFX_RectF& rect) const { + FX_FLOAT right = rect.right(), bottom = rect.bottom(); + TransformRect(rect.left, right, bottom, rect.top); + rect.width = right - rect.left; + rect.height = bottom - rect.top; +} + +void CFX_Matrix::TransformRect(FX_FLOAT& left, + FX_FLOAT& right, + FX_FLOAT& top, + FX_FLOAT& bottom) const { + CFX_PointF points[] = { + {left, top}, {left, bottom}, {right, top}, {right, bottom}}; + for (int i = 0; i < 4; i++) + points[i] = Transform(points[i]); + + right = points[0].x; + left = points[0].x; + top = points[0].y; + bottom = points[0].y; + for (int i = 1; i < 4; i++) { + right = std::max(right, points[i].x); + left = std::min(left, points[i].x); + top = std::max(top, points[i].y); + bottom = std::min(bottom, points[i].y); + } +} + +void CFX_Matrix::ConcatInternal(const CFX_Matrix& other, bool prepend) { + CFX_Matrix left; + CFX_Matrix right; + if (prepend) { + left = other; + right = *this; + } else { + left = *this; + right = other; + } + + a = left.a * right.a + left.b * right.c; + b = left.a * right.b + left.b * right.d; + c = left.c * right.a + left.d * right.c; + d = left.c * right.b + left.d * right.d; + e = left.e * right.a + left.f * right.c + right.e; + f = left.e * right.b + left.f * right.d + right.f; +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_gcc.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_gcc.cpp new file mode 100644 index 000000000000..42fb2a17f7a7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_gcc.cpp @@ -0,0 +1,254 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include +#include +#include + +#include "core/fxcrt/fx_ext.h" +#include "core/fxcrt/fx_string.h" + +template +IntType FXSYS_StrToInt(const CharType* str) { + if (!str) + return 0; + + // Process the sign. + bool neg = *str == '-'; + if (neg || *str == '+') + str++; + + IntType num = 0; + while (*str && FXSYS_isDecimalDigit(*str)) { + IntType val = FXSYS_toDecimalDigit(*str); + if (num > (std::numeric_limits::max() - val) / 10) { + if (neg && std::numeric_limits::is_signed) { + // Return MIN when the represented number is signed type and is smaller + // than the min value. + return std::numeric_limits::min(); + } else { + // Return MAX when the represented number is signed type and is larger + // than the max value, or the number is unsigned type and out of range. + return std::numeric_limits::max(); + } + } + + num = num * 10 + val; + str++; + } + // When it is a negative value, -num should be returned. Since num may be of + // unsigned type, use ~num + 1 to avoid the warning of applying unary minus + // operator to unsigned type. + return neg ? ~num + 1 : num; +} + +template +STR_T FXSYS_IntToStr(T value, STR_T str, int radix) { + if (radix < 2 || radix > 16) { + str[0] = 0; + return str; + } + if (value == 0) { + str[0] = '0'; + str[1] = 0; + return str; + } + int i = 0; + UT uvalue; + if (value < 0) { + str[i++] = '-'; + // Standard trick to avoid undefined behaviour when negating INT_MIN. + uvalue = static_cast(-(value + 1)) + 1; + } else { + uvalue = value; + } + int digits = 1; + T order = uvalue / radix; + while (order > 0) { + digits++; + order = order / radix; + } + for (int d = digits - 1; d > -1; d--) { + str[d + i] = "0123456789abcdef"[uvalue % radix]; + uvalue /= radix; + } + str[digits + i] = 0; + return str; +} + +#ifdef __cplusplus +extern "C" { +#endif +int32_t FXSYS_atoi(const FX_CHAR* str) { + return FXSYS_StrToInt(str); +} +uint32_t FXSYS_atoui(const FX_CHAR* str) { + return FXSYS_StrToInt(str); +} +int32_t FXSYS_wtoi(const FX_WCHAR* str) { + return FXSYS_StrToInt(str); +} +int64_t FXSYS_atoi64(const FX_CHAR* str) { + return FXSYS_StrToInt(str); +} +int64_t FXSYS_wtoi64(const FX_WCHAR* str) { + return FXSYS_StrToInt(str); +} +const FX_CHAR* FXSYS_i64toa(int64_t value, FX_CHAR* str, int radix) { + return FXSYS_IntToStr(value, str, radix); +} +#ifdef __cplusplus +} +#endif +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ +#ifdef __cplusplus +extern "C" { +#endif +int FXSYS_GetACP() { + return 0; +} +uint32_t FXSYS_GetFullPathName(const FX_CHAR* filename, + uint32_t buflen, + FX_CHAR* buf, + FX_CHAR** filepart) { + int srclen = FXSYS_strlen(filename); + if (!buf || (int)buflen < srclen + 1) { + return srclen + 1; + } + FXSYS_strcpy(buf, filename); + return srclen; +} +uint32_t FXSYS_GetModuleFileName(void* hModule, char* buf, uint32_t bufsize) { + return (uint32_t)-1; +} +#ifdef __cplusplus +} +#endif +#endif +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ +#ifdef __cplusplus +extern "C" { +#endif +FXSYS_FILE* FXSYS_wfopen(const FX_WCHAR* filename, const FX_WCHAR* mode) { + return FXSYS_fopen(CFX_ByteString::FromUnicode(filename).c_str(), + CFX_ByteString::FromUnicode(mode).c_str()); +} +char* FXSYS_strlwr(char* str) { + if (!str) { + return nullptr; + } + char* s = str; + while (*str) { + *str = FXSYS_tolower(*str); + str++; + } + return s; +} +char* FXSYS_strupr(char* str) { + if (!str) { + return nullptr; + } + char* s = str; + while (*str) { + *str = FXSYS_toupper(*str); + str++; + } + return s; +} +FX_WCHAR* FXSYS_wcslwr(FX_WCHAR* str) { + if (!str) { + return nullptr; + } + FX_WCHAR* s = str; + while (*str) { + *str = FXSYS_tolower(*str); + str++; + } + return s; +} +FX_WCHAR* FXSYS_wcsupr(FX_WCHAR* str) { + if (!str) { + return nullptr; + } + FX_WCHAR* s = str; + while (*str) { + *str = FXSYS_toupper(*str); + str++; + } + return s; +} +int FXSYS_stricmp(const char* dst, const char* src) { + int f, l; + do { + if (((f = (unsigned char)(*(dst++))) >= 'A') && (f <= 'Z')) { + f -= ('A' - 'a'); + } + if (((l = (unsigned char)(*(src++))) >= 'A') && (l <= 'Z')) { + l -= ('A' - 'a'); + } + } while (f && (f == l)); + return (f - l); +} +int FXSYS_wcsicmp(const FX_WCHAR* dst, const FX_WCHAR* src) { + FX_WCHAR f, l; + do { + if (((f = (FX_WCHAR)(*(dst++))) >= 'A') && (f <= 'Z')) { + f -= ('A' - 'a'); + } + if (((l = (FX_WCHAR)(*(src++))) >= 'A') && (l <= 'Z')) { + l -= ('A' - 'a'); + } + } while (f && (f == l)); + return (f - l); +} +char* FXSYS_itoa(int value, char* str, int radix) { + return FXSYS_IntToStr(value, str, radix); +} +#ifdef __cplusplus +} +#endif +#endif +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ +#ifdef __cplusplus +extern "C" { +#endif +int FXSYS_WideCharToMultiByte(uint32_t codepage, + uint32_t dwFlags, + const FX_WCHAR* wstr, + int wlen, + FX_CHAR* buf, + int buflen, + const FX_CHAR* default_str, + int* pUseDefault) { + int len = 0; + for (int i = 0; i < wlen; i++) { + if (wstr[i] < 0x100) { + if (buf && len < buflen) + buf[len] = static_cast(wstr[i]); + len++; + } + } + return len; +} +int FXSYS_MultiByteToWideChar(uint32_t codepage, + uint32_t dwFlags, + const FX_CHAR* bstr, + int blen, + FX_WCHAR* buf, + int buflen) { + int wlen = 0; + for (int i = 0; i < blen; i++) { + if (buf && wlen < buflen) { + buf[wlen] = bstr[i]; + } + wlen++; + } + return wlen; +} +#ifdef __cplusplus +} +#endif +#endif diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_gcc_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_gcc_unittest.cpp new file mode 100644 index 000000000000..665eede9ffe3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_gcc_unittest.cpp @@ -0,0 +1,112 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/fx_system.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(fxcrt, FXSYS_atoi) { + EXPECT_EQ(0, FXSYS_atoi("")); + EXPECT_EQ(0, FXSYS_atoi("0")); + EXPECT_EQ(-1, FXSYS_atoi("-1")); + EXPECT_EQ(2345, FXSYS_atoi("2345")); + EXPECT_EQ(-2147483647, FXSYS_atoi("-2147483647")); + // Handle the sign. + EXPECT_EQ(-2345, FXSYS_atoi("-2345")); + EXPECT_EQ(2345, FXSYS_atoi("+2345")); + // The max value. + EXPECT_EQ(2147483647, FXSYS_atoi("2147483647")); + // The min value. Written in -1 format to avoid "unary minus operator applied + // to unsigned type" warning. + EXPECT_EQ(-2147483647 - 1, FXSYS_atoi("-2147483648")); + // With invalid char. + EXPECT_EQ(9, FXSYS_atoi("9x9")); + + // Out of range values. + EXPECT_EQ(2147483647, FXSYS_atoi("2147483623423412348")); + EXPECT_EQ(2147483647, FXSYS_atoi("2147483648")); + EXPECT_EQ(-2147483647 - 1, FXSYS_atoi("-2147483650")); +} + +TEST(fxcrt, FXSYS_atoi64) { + EXPECT_EQ(0, FXSYS_atoi64("")); + EXPECT_EQ(0, FXSYS_atoi64("0")); + EXPECT_EQ(-1, FXSYS_atoi64("-1")); + EXPECT_EQ(2345, FXSYS_atoi64("2345")); + EXPECT_EQ(-9223372036854775807LL, FXSYS_atoi64("-9223372036854775807")); + // Handle the sign. + EXPECT_EQ(-2345, FXSYS_atoi64("-2345")); + EXPECT_EQ(2345, FXSYS_atoi64("+2345")); + // The max value. + EXPECT_EQ(9223372036854775807LL, FXSYS_atoi64("9223372036854775807")); + // The min value. Written in -1 format to avoid implicit unsigned warning. + EXPECT_EQ(-9223372036854775807LL - 1LL, FXSYS_atoi64("-9223372036854775808")); + // With invalid char. + EXPECT_EQ(9, FXSYS_atoi64("9x9")); + + // Out of range values. + EXPECT_EQ(9223372036854775807LL, FXSYS_atoi64("922337203685471234123475807")); + EXPECT_EQ(9223372036854775807LL, FXSYS_atoi64("9223372036854775808")); + EXPECT_EQ(-9223372036854775807LL - 1LL, FXSYS_atoi64("-9223372036854775810")); +} + +TEST(fxcrt, FXSYS_wtoi) { + EXPECT_EQ(0, FXSYS_wtoi(L"")); + EXPECT_EQ(0, FXSYS_wtoi(L"0")); + EXPECT_EQ(-1, FXSYS_wtoi(L"-1")); + EXPECT_EQ(2345, FXSYS_wtoi(L"2345")); + EXPECT_EQ(-2147483647, FXSYS_wtoi(L"-2147483647")); + // The max value. + EXPECT_EQ(2147483647, FXSYS_wtoi(L"2147483647")); + // The min value. + EXPECT_EQ(-2147483647 - 1, FXSYS_wtoi(L"-2147483648")); + EXPECT_EQ(9, FXSYS_wtoi64(L"9x9")); + + // Out of range values. + EXPECT_EQ(2147483647, FXSYS_wtoi(L"2147483623423412348")); + EXPECT_EQ(2147483647, FXSYS_wtoi(L"2147483648")); + EXPECT_EQ(-2147483647 - 1, FXSYS_wtoi(L"-2147483652")); +} + +TEST(fxcrt, FXSYS_wtoi64) { + EXPECT_EQ(0, FXSYS_wtoi64(L"")); + EXPECT_EQ(0, FXSYS_wtoi64(L"0")); + EXPECT_EQ(-1, FXSYS_wtoi64(L"-1")); + EXPECT_EQ(2345, FXSYS_wtoi64(L"2345")); + EXPECT_EQ(-9223372036854775807LL, FXSYS_wtoi64(L"-9223372036854775807")); + // Handle the sign. + EXPECT_EQ(-2345, FXSYS_wtoi64(L"-2345")); + EXPECT_EQ(2345, FXSYS_wtoi64(L"+2345")); + // The max value. + EXPECT_EQ(9223372036854775807LL, FXSYS_wtoi64(L"9223372036854775807")); + // The min value. + EXPECT_EQ(-9223372036854775807LL - 1LL, + FXSYS_wtoi64(L"-9223372036854775808")); + // With invalid char. + EXPECT_EQ(9, FXSYS_wtoi64(L"9x9")); + + // Out of range values. + EXPECT_EQ(9223372036854775807LL, + FXSYS_wtoi64(L"922337203685471234123475807")); + EXPECT_EQ(9223372036854775807LL, FXSYS_wtoi64(L"9223372036854775808")); + EXPECT_EQ(-9223372036854775807LL - 1LL, + FXSYS_wtoi64(L"-9223372036854775810")); +} + +TEST(fxcrt, FXSYS_atoui) { + EXPECT_EQ(0u, FXSYS_atoui("")); + EXPECT_EQ(0u, FXSYS_atoui("0")); + EXPECT_EQ(4294967295, FXSYS_atoui("-1")); + EXPECT_EQ(2345u, FXSYS_atoui("2345")); + // Handle the sign. + EXPECT_EQ(4294964951, FXSYS_atoui("-2345")); + EXPECT_EQ(2345u, FXSYS_atoui("+2345")); + // The max value. + EXPECT_EQ(4294967295, FXSYS_atoui("4294967295")); + EXPECT_EQ(9u, FXSYS_atoui("9x9")); + + // Out of range values. + EXPECT_EQ(4294967295, FXSYS_atoui("2147483623423412348")); + EXPECT_EQ(4294967295, FXSYS_atoui("4294967296")); + EXPECT_EQ(4294967295, FXSYS_atoui("-4294967345")); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_memmgr.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_memmgr.cpp new file mode 100644 index 000000000000..927b994b5ff6 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_memmgr.cpp @@ -0,0 +1,27 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include // For abort(). + +#include "core/fxcrt/fx_memory.h" + +void* FXMEM_DefaultAlloc(size_t byte_size, int flags) { + return (void*)malloc(byte_size); +} +void* FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags) { + return realloc(pointer, new_size); +} +void FXMEM_DefaultFree(void* pointer, int flags) { + free(pointer); +} + +NEVER_INLINE void FX_OutOfMemoryTerminate() { + // Termimate cleanly if we can, else crash at a specific address (0xbd). + abort(); +#ifndef _WIN32 + reinterpret_cast(0xbd)(); +#endif +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_memmgr_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_memmgr_unittest.cpp new file mode 100644 index 000000000000..fdffd98f1978 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_memmgr_unittest.cpp @@ -0,0 +1,80 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include + +#include "core/fxcrt/fx_memory.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +const size_t kMaxByteAlloc = std::numeric_limits::max(); +const size_t kMaxIntAlloc = kMaxByteAlloc / sizeof(int); +const size_t kOverflowIntAlloc = kMaxIntAlloc + 100; +const size_t kWidth = 640; +const size_t kOverflowIntAlloc2D = kMaxIntAlloc / kWidth + 10; + +} // namespace + +// TODO(tsepez): re-enable OOM tests if we can find a way to +// prevent it from hosing the bots. +TEST(fxcrt, DISABLED_FX_AllocOOM) { + EXPECT_DEATH_IF_SUPPORTED((void)FX_Alloc(int, kMaxIntAlloc), ""); + + int* ptr = FX_Alloc(int, 1); + EXPECT_TRUE(ptr); + EXPECT_DEATH_IF_SUPPORTED((void)FX_Realloc(int, ptr, kMaxIntAlloc), ""); + FX_Free(ptr); +} + +TEST(fxcrt, FX_AllocOverflow) { + // |ptr| needs to be defined and used to avoid Clang optimizes away the + // FX_Alloc() statement overzealously for optimized builds. + int* ptr = nullptr; + EXPECT_DEATH_IF_SUPPORTED(ptr = FX_Alloc(int, kOverflowIntAlloc), "") << ptr; + + ptr = FX_Alloc(int, 1); + EXPECT_TRUE(ptr); + EXPECT_DEATH_IF_SUPPORTED((void)FX_Realloc(int, ptr, kOverflowIntAlloc), ""); + FX_Free(ptr); +} + +TEST(fxcrt, FX_AllocOverflow2D) { + // |ptr| needs to be defined and used to avoid Clang optimizes away the + // FX_Alloc() statement overzealously for optimized builds. + int* ptr = nullptr; + EXPECT_DEATH_IF_SUPPORTED(ptr = FX_Alloc2D(int, kWidth, kOverflowIntAlloc2D), + "") + << ptr; +} + +TEST(fxcrt, DISABLED_FX_TryAllocOOM) { + EXPECT_FALSE(FX_TryAlloc(int, kMaxIntAlloc)); + + int* ptr = FX_Alloc(int, 1); + EXPECT_TRUE(ptr); + EXPECT_FALSE(FX_TryRealloc(int, ptr, kMaxIntAlloc)); + FX_Free(ptr); +} + +TEST(fxcrt, FX_TryAllocOverflow) { + // |ptr| needs to be defined and used to avoid Clang optimizes away the + // calloc() statement overzealously for optimized builds. + int* ptr = (int*)calloc(sizeof(int), kOverflowIntAlloc); + EXPECT_FALSE(ptr) << ptr; + + ptr = FX_Alloc(int, 1); + EXPECT_TRUE(ptr); + EXPECT_FALSE(FX_TryRealloc(int, ptr, kOverflowIntAlloc)); + FX_Free(ptr); +} + +TEST(fxcrt, DISABLED_FXMEM_DefaultOOM) { + EXPECT_FALSE(FXMEM_DefaultAlloc(kMaxByteAlloc, 0)); + + void* ptr = FXMEM_DefaultAlloc(1, 0); + EXPECT_TRUE(ptr); + EXPECT_FALSE(FXMEM_DefaultRealloc(ptr, kMaxByteAlloc, 0)); + FXMEM_DefaultFree(ptr, 0); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_utf.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_utf.cpp new file mode 100644 index 000000000000..c0f14c81787c --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_utf.cpp @@ -0,0 +1,85 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fx_basic.h" + +void CFX_UTF8Decoder::Clear() { + m_Buffer.Clear(); + m_PendingBytes = 0; +} +void CFX_UTF8Decoder::AppendChar(uint32_t ch) { + m_Buffer.AppendChar((FX_WCHAR)ch); +} +void CFX_UTF8Decoder::Input(uint8_t byte) { + if (byte < 0x80) { + m_PendingBytes = 0; + m_Buffer.AppendChar(byte); + } else if (byte < 0xc0) { + if (m_PendingBytes == 0) { + return; + } + m_PendingBytes--; + m_PendingChar |= (byte & 0x3f) << (m_PendingBytes * 6); + if (m_PendingBytes == 0) { + AppendChar(m_PendingChar); + } + } else if (byte < 0xe0) { + m_PendingBytes = 1; + m_PendingChar = (byte & 0x1f) << 6; + } else if (byte < 0xf0) { + m_PendingBytes = 2; + m_PendingChar = (byte & 0x0f) << 12; + } else if (byte < 0xf8) { + m_PendingBytes = 3; + m_PendingChar = (byte & 0x07) << 18; + } else if (byte < 0xfc) { + m_PendingBytes = 4; + m_PendingChar = (byte & 0x03) << 24; + } else if (byte < 0xfe) { + m_PendingBytes = 5; + m_PendingChar = (byte & 0x01) << 30; + } +} +void CFX_UTF8Encoder::Input(FX_WCHAR unicode) { + if ((uint32_t)unicode < 0x80) { + m_Buffer.AppendChar(unicode); + } else { + if ((uint32_t)unicode >= 0x80000000) { + return; + } + int nbytes = 0; + if ((uint32_t)unicode < 0x800) { + nbytes = 2; + } else if ((uint32_t)unicode < 0x10000) { + nbytes = 3; + } else if ((uint32_t)unicode < 0x200000) { + nbytes = 4; + } else if ((uint32_t)unicode < 0x4000000) { + nbytes = 5; + } else { + nbytes = 6; + } + static uint8_t prefix[] = {0xc0, 0xe0, 0xf0, 0xf8, 0xfc}; + int order = 1 << ((nbytes - 1) * 6); + int code = unicode; + m_Buffer.AppendChar(prefix[nbytes - 2] | (code / order)); + for (int i = 0; i < nbytes - 1; i++) { + code = code % order; + order >>= 6; + m_Buffer.AppendChar(0x80 | (code / order)); + } + } +} + +CFX_ByteString FX_UTF8Encode(const CFX_WideStringC& wsStr) { + FX_STRSIZE len = wsStr.GetLength(); + const FX_WCHAR* pStr = wsStr.c_str(); + CFX_UTF8Encoder encoder; + while (len-- > 0) + encoder.Input(*pStr++); + + return CFX_ByteString(encoder.GetResult()); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_util.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_util.cpp new file mode 100644 index 000000000000..f608e290a2a9 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_util.cpp @@ -0,0 +1,264 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_ext.h" + +#include +#include +#include +#include + +bool FX_atonum(const CFX_ByteStringC& strc, void* pData) { + if (strc.Find('.') != -1) { + FX_FLOAT* pFloat = static_cast(pData); + *pFloat = FX_atof(strc); + return false; + } + + // Note, numbers in PDF are typically of the form 123, -123, etc. But, + // for things like the Permissions on the encryption hash the number is + // actually an unsigned value. We use a uint32_t so we can deal with the + // unsigned and then check for overflow if the user actually signed the value. + // The Permissions flag is listed in Table 3.20 PDF 1.7 spec. + pdfium::base::CheckedNumeric integer = 0; + bool bNegative = false; + bool bSigned = false; + int cc = 0; + if (strc[0] == '+') { + cc++; + bSigned = true; + } else if (strc[0] == '-') { + bNegative = true; + bSigned = true; + cc++; + } + + while (cc < strc.GetLength() && std::isdigit(strc[cc])) { + integer = integer * 10 + FXSYS_toDecimalDigit(strc.CharAt(cc)); + if (!integer.IsValid()) + break; + cc++; + } + + // We have a sign, and the value was greater then a regular integer + // we've overflowed, reset to the default value. + if (bSigned) { + if (bNegative) { + if (integer.ValueOrDefault(0) > + static_cast(std::numeric_limits::max()) + 1) { + integer = 0; + } + } else if (integer.ValueOrDefault(0) > + static_cast(std::numeric_limits::max())) { + integer = 0; + } + } + + // Switch back to the int space so we can flip to a negative if we need. + uint32_t uValue = integer.ValueOrDefault(0); + int32_t value = static_cast(uValue); + if (bNegative) + value = -value; + + int* pInt = static_cast(pData); + *pInt = value; + return true; +} + +static const FX_FLOAT fraction_scales[] = { + 0.1f, 0.01f, 0.001f, 0.0001f, + 0.00001f, 0.000001f, 0.0000001f, 0.00000001f, + 0.000000001f, 0.0000000001f, 0.00000000001f}; + +int FXSYS_FractionalScaleCount() { + return FX_ArraySize(fraction_scales); +} + +FX_FLOAT FXSYS_FractionalScale(size_t scale_factor, int value) { + return fraction_scales[scale_factor] * value; +} + +FX_FLOAT FX_atof(const CFX_ByteStringC& strc) { + if (strc.IsEmpty()) + return 0.0; + + int cc = 0; + bool bNegative = false; + int len = strc.GetLength(); + if (strc[0] == '+') { + cc++; + } else if (strc[0] == '-') { + bNegative = true; + cc++; + } + while (cc < len) { + if (strc[cc] != '+' && strc[cc] != '-') + break; + cc++; + } + FX_FLOAT value = 0; + while (cc < len) { + if (strc[cc] == '.') + break; + value = value * 10 + FXSYS_toDecimalDigit(strc.CharAt(cc)); + cc++; + } + int scale = 0; + if (cc < len && strc[cc] == '.') { + cc++; + while (cc < len) { + value += + FXSYS_FractionalScale(scale, FXSYS_toDecimalDigit(strc.CharAt(cc))); + scale++; + if (scale == FXSYS_FractionalScaleCount()) + break; + cc++; + } + } + return bNegative ? -value : value; +} + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ && _MSC_VER < 1900 +void FXSYS_snprintf(char* str, + size_t size, + _Printf_format_string_ const char* fmt, + ...) { + va_list ap; + va_start(ap, fmt); + FXSYS_vsnprintf(str, size, fmt, ap); + va_end(ap); +} + +void FXSYS_vsnprintf(char* str, size_t size, const char* fmt, va_list ap) { + (void)_vsnprintf(str, size, fmt, ap); + if (size) + str[size - 1] = 0; +} +#endif // _FXM_PLATFORM_WINDOWS_ && _MSC_VER < 1900 + +FX_FileHandle* FX_OpenFolder(const FX_CHAR* path) { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + std::unique_ptr pData(new CFindFileDataA); + pData->m_Handle = FindFirstFileExA((CFX_ByteString(path) + "/*.*").c_str(), + FindExInfoStandard, &pData->m_FindData, + FindExSearchNameMatch, nullptr, 0); + if (pData->m_Handle == INVALID_HANDLE_VALUE) + return nullptr; + + pData->m_bEnd = false; + return pData.release(); +#else + return opendir(path); +#endif +} + +bool FX_GetNextFile(FX_FileHandle* handle, + CFX_ByteString* filename, + bool* bFolder) { + if (!handle) + return false; + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + if (handle->m_bEnd) + return false; + + *filename = handle->m_FindData.cFileName; + *bFolder = + (handle->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + if (!FindNextFileA(handle->m_Handle, &handle->m_FindData)) + handle->m_bEnd = true; + return true; +#elif defined(__native_client__) + abort(); + return false; +#else + struct dirent* de = readdir(handle); + if (!de) + return false; + *filename = de->d_name; + *bFolder = de->d_type == DT_DIR; + return true; +#endif +} + +void FX_CloseFolder(FX_FileHandle* handle) { + if (!handle) + return; + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + FindClose(handle->m_Handle); + delete handle; +#else + closedir(handle); +#endif +} + +FX_WCHAR FX_GetFolderSeparator() { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + return '\\'; +#else + return '/'; +#endif +} + +CFX_Matrix_3by3 CFX_Matrix_3by3::Inverse() { + FX_FLOAT det = + a * (e * i - f * h) - b * (i * d - f * g) + c * (d * h - e * g); + if (FXSYS_fabs(det) < 0.0000001) + return CFX_Matrix_3by3(); + + return CFX_Matrix_3by3( + (e * i - f * h) / det, -(b * i - c * h) / det, (b * f - c * e) / det, + -(d * i - f * g) / det, (a * i - c * g) / det, -(a * f - c * d) / det, + (d * h - e * g) / det, -(a * h - b * g) / det, (a * e - b * d) / det); +} + +CFX_Matrix_3by3 CFX_Matrix_3by3::Multiply(const CFX_Matrix_3by3& m) { + return CFX_Matrix_3by3( + a * m.a + b * m.d + c * m.g, a * m.b + b * m.e + c * m.h, + a * m.c + b * m.f + c * m.i, d * m.a + e * m.d + f * m.g, + d * m.b + e * m.e + f * m.h, d * m.c + e * m.f + f * m.i, + g * m.a + h * m.d + i * m.g, g * m.b + h * m.e + i * m.h, + g * m.c + h * m.f + i * m.i); +} + +CFX_Vector_3by1 CFX_Matrix_3by3::TransformVector(const CFX_Vector_3by1& v) { + return CFX_Vector_3by1(a * v.a + b * v.b + c * v.c, + d * v.a + e * v.b + f * v.c, + g * v.a + h * v.b + i * v.c); +} + +uint32_t GetBits32(const uint8_t* pData, int bitpos, int nbits) { + ASSERT(0 < nbits && nbits <= 32); + const uint8_t* dataPtr = &pData[bitpos / 8]; + int bitShift; + int bitMask; + int dstShift; + int bitCount = bitpos & 0x07; + if (nbits < 8 && nbits + bitCount <= 8) { + bitShift = 8 - nbits - bitCount; + bitMask = (1 << nbits) - 1; + dstShift = 0; + } else { + bitShift = 0; + int bitOffset = 8 - bitCount; + bitMask = (1 << std::min(bitOffset, nbits)) - 1; + dstShift = nbits - bitOffset; + } + uint32_t result = + static_cast((*dataPtr++ >> bitShift & bitMask) << dstShift); + while (dstShift >= 8) { + dstShift -= 8; + result |= *dataPtr++ << dstShift; + } + if (dstShift > 0) { + bitShift = 8 - dstShift; + bitMask = (1 << dstShift) - 1; + result |= *dataPtr++ >> bitShift & bitMask; + } + return result; +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_util_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_util_unittest.cpp new file mode 100644 index 000000000000..471c6deeb3f4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_util_unittest.cpp @@ -0,0 +1,77 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include + +#include "core/fxcrt/fx_basic.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +uint32_t ReferenceGetBits32(const uint8_t* pData, int bitpos, int nbits) { + int result = 0; + for (int i = 0; i < nbits; i++) { + if (pData[(bitpos + i) / 8] & (1 << (7 - (bitpos + i) % 8))) + result |= 1 << (nbits - i - 1); + } + return result; +} + +} // namespace + +TEST(fxge, GetBits32) { + unsigned char data[] = {0xDE, 0x3F, 0xB1, 0x7C, 0x12, 0x9A, 0x04, 0x56}; + for (int nbits = 1; nbits <= 32; ++nbits) { + for (int bitpos = 0; bitpos < (int)sizeof(data) * 8 - nbits; ++bitpos) { + EXPECT_EQ(ReferenceGetBits32(data, bitpos, nbits), + GetBits32(data, bitpos, nbits)); + } + } +} + +TEST(fxcrt, FX_atonum) { + int i; + EXPECT_TRUE(FX_atonum("10", &i)); + EXPECT_EQ(10, i); + + EXPECT_TRUE(FX_atonum("-10", &i)); + EXPECT_EQ(-10, i); + + EXPECT_TRUE(FX_atonum("+10", &i)); + EXPECT_EQ(10, i); + + EXPECT_TRUE(FX_atonum("-2147483648", &i)); + EXPECT_EQ(std::numeric_limits::min(), i); + + EXPECT_TRUE(FX_atonum("2147483647", &i)); + EXPECT_EQ(2147483647, i); + + // Value overflows. + EXPECT_TRUE(FX_atonum("-2147483649", &i)); + EXPECT_EQ(0, i); + + // Value overflows. + EXPECT_TRUE(FX_atonum("+2147483648", &i)); + EXPECT_EQ(0, i); + + // Value overflows. + EXPECT_TRUE(FX_atonum("4223423494965252", &i)); + EXPECT_EQ(0, i); + + // No explicit sign will allow the number to go negative. This is for things + // like the encryption Permissions flag (Table 3.20 PDF 1.7 spec) + EXPECT_TRUE(FX_atonum("4294965252", &i)); + EXPECT_EQ(-2044, i); + + EXPECT_TRUE(FX_atonum("-4294965252", &i)); + EXPECT_EQ(0, i); + + EXPECT_TRUE(FX_atonum("+4294965252", &i)); + EXPECT_EQ(0, i); + + float f; + EXPECT_FALSE(FX_atonum("3.24", &f)); + EXPECT_FLOAT_EQ(3.24f, f); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_wstring.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_wstring.cpp new file mode 100644 index 000000000000..93b9ba7c25a1 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_wstring.cpp @@ -0,0 +1,1022 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include +#include + +#include "core/fxcrt/cfx_string_pool_template.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_ext.h" +#include "third_party/base/numerics/safe_math.h" + +template class CFX_StringDataTemplate; +template class CFX_StringCTemplate; +template class CFX_StringPoolTemplate; +template struct std::hash; + +namespace { + +#ifndef NDEBUG +bool IsValidCodePage(uint16_t codepage) { + switch (codepage) { + case 0: + case 932: + case 936: + case 949: + case 950: + return true; + + default: + return false; + } +} +#endif + +const FX_WCHAR* FX_wcsstr(const FX_WCHAR* haystack, + int haystack_len, + const FX_WCHAR* needle, + int needle_len) { + if (needle_len > haystack_len || needle_len == 0) { + return nullptr; + } + const FX_WCHAR* end_ptr = haystack + haystack_len - needle_len; + while (haystack <= end_ptr) { + int i = 0; + while (1) { + if (haystack[i] != needle[i]) { + break; + } + i++; + if (i == needle_len) { + return haystack; + } + } + haystack++; + } + return nullptr; +} + +} // namespace + +static_assert(sizeof(CFX_WideString) <= sizeof(FX_WCHAR*), + "Strings must not require more space than pointers"); + +CFX_WideString::CFX_WideString() {} + +CFX_WideString::CFX_WideString(const CFX_WideString& other) + : m_pData(other.m_pData) {} + +CFX_WideString::CFX_WideString(CFX_WideString&& other) { + m_pData.Swap(other.m_pData); +} + +CFX_WideString::CFX_WideString(const FX_WCHAR* pStr, FX_STRSIZE nLen) { + if (nLen < 0) + nLen = pStr ? FXSYS_wcslen(pStr) : 0; + + if (nLen) + m_pData.Reset(StringData::Create(pStr, nLen)); +} + +CFX_WideString::CFX_WideString(FX_WCHAR ch) { + m_pData.Reset(StringData::Create(1)); + m_pData->m_String[0] = ch; +} + +CFX_WideString::CFX_WideString(const FX_WCHAR* ptr) + : CFX_WideString(ptr, ptr ? FXSYS_wcslen(ptr) : 0) {} + +CFX_WideString::CFX_WideString(const CFX_WideStringC& stringSrc) { + if (!stringSrc.IsEmpty()) { + m_pData.Reset(StringData::Create(stringSrc.c_str(), stringSrc.GetLength())); + } +} + +CFX_WideString::CFX_WideString(const CFX_WideStringC& str1, + const CFX_WideStringC& str2) { + int nNewLen = str1.GetLength() + str2.GetLength(); + if (nNewLen == 0) + return; + + m_pData.Reset(StringData::Create(nNewLen)); + m_pData->CopyContents(str1.c_str(), str1.GetLength()); + m_pData->CopyContentsAt(str1.GetLength(), str2.c_str(), str2.GetLength()); +} + +CFX_WideString::~CFX_WideString() {} + +const CFX_WideString& CFX_WideString::operator=(const FX_WCHAR* pStr) { + if (!pStr || !pStr[0]) + clear(); + else + AssignCopy(pStr, FXSYS_wcslen(pStr)); + + return *this; +} + +const CFX_WideString& CFX_WideString::operator=( + const CFX_WideStringC& stringSrc) { + if (stringSrc.IsEmpty()) + clear(); + else + AssignCopy(stringSrc.c_str(), stringSrc.GetLength()); + + return *this; +} + +const CFX_WideString& CFX_WideString::operator=( + const CFX_WideString& stringSrc) { + if (m_pData != stringSrc.m_pData) + m_pData = stringSrc.m_pData; + + return *this; +} + +const CFX_WideString& CFX_WideString::operator+=(const FX_WCHAR* pStr) { + if (pStr) + Concat(pStr, FXSYS_wcslen(pStr)); + + return *this; +} + +const CFX_WideString& CFX_WideString::operator+=(FX_WCHAR ch) { + Concat(&ch, 1); + return *this; +} + +const CFX_WideString& CFX_WideString::operator+=(const CFX_WideString& str) { + if (str.m_pData) + Concat(str.m_pData->m_String, str.m_pData->m_nDataLength); + + return *this; +} + +const CFX_WideString& CFX_WideString::operator+=(const CFX_WideStringC& str) { + if (!str.IsEmpty()) + Concat(str.c_str(), str.GetLength()); + + return *this; +} + +bool CFX_WideString::operator==(const wchar_t* ptr) const { + if (!m_pData) + return !ptr || !ptr[0]; + + if (!ptr) + return m_pData->m_nDataLength == 0; + + return wcslen(ptr) == static_cast(m_pData->m_nDataLength) && + wmemcmp(ptr, m_pData->m_String, m_pData->m_nDataLength) == 0; +} + +bool CFX_WideString::operator==(const CFX_WideStringC& str) const { + if (!m_pData) + return str.IsEmpty(); + + return m_pData->m_nDataLength == str.GetLength() && + wmemcmp(m_pData->m_String, str.c_str(), str.GetLength()) == 0; +} + +bool CFX_WideString::operator==(const CFX_WideString& other) const { + if (m_pData == other.m_pData) + return true; + + if (IsEmpty()) + return other.IsEmpty(); + + if (other.IsEmpty()) + return false; + + return other.m_pData->m_nDataLength == m_pData->m_nDataLength && + wmemcmp(other.m_pData->m_String, m_pData->m_String, + m_pData->m_nDataLength) == 0; +} + +bool CFX_WideString::operator<(const CFX_WideString& str) const { + if (m_pData == str.m_pData) + return false; + + int result = + wmemcmp(c_str(), str.c_str(), std::min(GetLength(), str.GetLength())); + return result < 0 || (result == 0 && GetLength() < str.GetLength()); +} + +void CFX_WideString::AssignCopy(const FX_WCHAR* pSrcData, FX_STRSIZE nSrcLen) { + AllocBeforeWrite(nSrcLen); + m_pData->CopyContents(pSrcData, nSrcLen); + m_pData->m_nDataLength = nSrcLen; +} + +void CFX_WideString::ReallocBeforeWrite(FX_STRSIZE nNewLength) { + if (m_pData && m_pData->CanOperateInPlace(nNewLength)) + return; + + if (nNewLength <= 0) { + clear(); + return; + } + + CFX_RetainPtr pNewData(StringData::Create(nNewLength)); + if (m_pData) { + FX_STRSIZE nCopyLength = std::min(m_pData->m_nDataLength, nNewLength); + pNewData->CopyContents(m_pData->m_String, nCopyLength); + pNewData->m_nDataLength = nCopyLength; + } else { + pNewData->m_nDataLength = 0; + } + pNewData->m_String[pNewData->m_nDataLength] = 0; + m_pData.Swap(pNewData); +} + +void CFX_WideString::AllocBeforeWrite(FX_STRSIZE nNewLength) { + if (m_pData && m_pData->CanOperateInPlace(nNewLength)) + return; + + if (nNewLength <= 0) { + clear(); + return; + } + + m_pData.Reset(StringData::Create(nNewLength)); +} + +void CFX_WideString::ReleaseBuffer(FX_STRSIZE nNewLength) { + if (!m_pData) + return; + + if (nNewLength == -1) + nNewLength = FXSYS_wcslen(m_pData->m_String); + + nNewLength = std::min(nNewLength, m_pData->m_nAllocLength); + if (nNewLength == 0) { + clear(); + return; + } + + ASSERT(m_pData->m_nRefs == 1); + m_pData->m_nDataLength = nNewLength; + m_pData->m_String[nNewLength] = 0; + if (m_pData->m_nAllocLength - nNewLength >= 32) { + // Over arbitrary threshold, so pay the price to relocate. Force copy to + // always occur by holding a second reference to the string. + CFX_WideString preserve(*this); + ReallocBeforeWrite(nNewLength); + } +} + +void CFX_WideString::Reserve(FX_STRSIZE len) { + GetBuffer(len); +} + +FX_WCHAR* CFX_WideString::GetBuffer(FX_STRSIZE nMinBufLength) { + if (!m_pData) { + if (nMinBufLength == 0) + return nullptr; + + m_pData.Reset(StringData::Create(nMinBufLength)); + m_pData->m_nDataLength = 0; + m_pData->m_String[0] = 0; + return m_pData->m_String; + } + + if (m_pData->CanOperateInPlace(nMinBufLength)) + return m_pData->m_String; + + nMinBufLength = std::max(nMinBufLength, m_pData->m_nDataLength); + if (nMinBufLength == 0) + return nullptr; + + CFX_RetainPtr pNewData(StringData::Create(nMinBufLength)); + pNewData->CopyContents(*m_pData); + pNewData->m_nDataLength = m_pData->m_nDataLength; + m_pData.Swap(pNewData); + return m_pData->m_String; +} + +FX_STRSIZE CFX_WideString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount) { + if (!m_pData) + return 0; + + if (nIndex < 0) + nIndex = 0; + + FX_STRSIZE nOldLength = m_pData->m_nDataLength; + if (nCount > 0 && nIndex < nOldLength) { + FX_STRSIZE mLength = nIndex + nCount; + if (mLength >= nOldLength) { + m_pData->m_nDataLength = nIndex; + return m_pData->m_nDataLength; + } + ReallocBeforeWrite(nOldLength); + int nCharsToCopy = nOldLength - mLength + 1; + wmemmove(m_pData->m_String + nIndex, m_pData->m_String + mLength, + nCharsToCopy); + m_pData->m_nDataLength = nOldLength - nCount; + } + return m_pData->m_nDataLength; +} + +void CFX_WideString::Concat(const FX_WCHAR* pSrcData, FX_STRSIZE nSrcLen) { + if (!pSrcData || nSrcLen <= 0) + return; + + if (!m_pData) { + m_pData.Reset(StringData::Create(pSrcData, nSrcLen)); + return; + } + + if (m_pData->CanOperateInPlace(m_pData->m_nDataLength + nSrcLen)) { + m_pData->CopyContentsAt(m_pData->m_nDataLength, pSrcData, nSrcLen); + m_pData->m_nDataLength += nSrcLen; + return; + } + + CFX_RetainPtr pNewData( + StringData::Create(m_pData->m_nDataLength + nSrcLen)); + pNewData->CopyContents(*m_pData); + pNewData->CopyContentsAt(m_pData->m_nDataLength, pSrcData, nSrcLen); + m_pData.Swap(pNewData); +} + +CFX_ByteString CFX_WideString::UTF8Encode() const { + return FX_UTF8Encode(AsStringC()); +} + +CFX_ByteString CFX_WideString::UTF16LE_Encode() const { + if (!m_pData) { + return CFX_ByteString("\0\0", 2); + } + int len = m_pData->m_nDataLength; + CFX_ByteString result; + FX_CHAR* buffer = result.GetBuffer(len * 2 + 2); + for (int i = 0; i < len; i++) { + buffer[i * 2] = m_pData->m_String[i] & 0xff; + buffer[i * 2 + 1] = m_pData->m_String[i] >> 8; + } + buffer[len * 2] = 0; + buffer[len * 2 + 1] = 0; + result.ReleaseBuffer(len * 2 + 2); + return result; +} + +CFX_WideString CFX_WideString::Mid(FX_STRSIZE nFirst) const { + if (!m_pData) + return CFX_WideString(); + + return Mid(nFirst, m_pData->m_nDataLength - nFirst); +} + +CFX_WideString CFX_WideString::Mid(FX_STRSIZE nFirst, FX_STRSIZE nCount) const { + if (!m_pData) + return CFX_WideString(); + + nFirst = std::min(std::max(nFirst, 0), m_pData->m_nDataLength); + nCount = std::min(std::max(nCount, 0), m_pData->m_nDataLength - nFirst); + if (nCount == 0) + return CFX_WideString(); + + if (nFirst == 0 && nCount == m_pData->m_nDataLength) + return *this; + + CFX_WideString dest; + AllocCopy(dest, nCount, nFirst); + return dest; +} + +void CFX_WideString::AllocCopy(CFX_WideString& dest, + FX_STRSIZE nCopyLen, + FX_STRSIZE nCopyIndex) const { + if (nCopyLen <= 0) + return; + + CFX_RetainPtr pNewData( + StringData::Create(m_pData->m_String + nCopyIndex, nCopyLen)); + dest.m_pData.Swap(pNewData); +} + +#define FORCE_ANSI 0x10000 +#define FORCE_UNICODE 0x20000 +#define FORCE_INT64 0x40000 + +void CFX_WideString::FormatV(const FX_WCHAR* pFormat, va_list argList) { + va_list argListSave; +#if defined(__ARMCC_VERSION) || \ + (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || \ + _FX_CPU_ == _FX_ARM64_)) || \ + defined(__native_client__) + va_copy(argListSave, argList); +#else + argListSave = argList; +#endif + int nMaxLen = 0; + for (const FX_WCHAR* pStr = pFormat; *pStr != 0; pStr++) { + if (*pStr != '%' || *(pStr = pStr + 1) == '%') { + nMaxLen += FXSYS_wcslen(pStr); + continue; + } + int nItemLen = 0; + int nWidth = 0; + for (; *pStr != 0; pStr++) { + if (*pStr == '#') { + nMaxLen += 2; + } else if (*pStr == '*') { + nWidth = va_arg(argList, int); + } else if (*pStr != '-' && *pStr != '+' && *pStr != '0' && *pStr != ' ') { + break; + } + } + if (nWidth == 0) { + nWidth = FXSYS_wtoi(pStr); + while (std::iswdigit(*pStr)) + ++pStr; + } + if (nWidth < 0 || nWidth > 128 * 1024) { + pFormat = L"Bad width"; + nMaxLen = 10; + break; + } + int nPrecision = 0; + if (*pStr == '.') { + pStr++; + if (*pStr == '*') { + nPrecision = va_arg(argList, int); + pStr++; + } else { + nPrecision = FXSYS_wtoi(pStr); + while (std::iswdigit(*pStr)) + ++pStr; + } + } + if (nPrecision < 0 || nPrecision > 128 * 1024) { + pFormat = L"Bad precision"; + nMaxLen = 14; + break; + } + int nModifier = 0; + if (*pStr == L'I' && *(pStr + 1) == L'6' && *(pStr + 2) == L'4') { + pStr += 3; + nModifier = FORCE_INT64; + } else { + switch (*pStr) { + case 'h': + nModifier = FORCE_ANSI; + pStr++; + break; + case 'l': + nModifier = FORCE_UNICODE; + pStr++; + break; + case 'F': + case 'N': + case 'L': + pStr++; + break; + } + } + switch (*pStr | nModifier) { + case 'c': + case 'C': + nItemLen = 2; + va_arg(argList, int); + break; + case 'c' | FORCE_ANSI: + case 'C' | FORCE_ANSI: + nItemLen = 2; + va_arg(argList, int); + break; + case 'c' | FORCE_UNICODE: + case 'C' | FORCE_UNICODE: + nItemLen = 2; + va_arg(argList, int); + break; + case 's': { + const FX_WCHAR* pstrNextArg = va_arg(argList, const FX_WCHAR*); + if (pstrNextArg) { + nItemLen = FXSYS_wcslen(pstrNextArg); + if (nItemLen < 1) { + nItemLen = 1; + } + } else { + nItemLen = 6; + } + } break; + case 'S': { + const FX_CHAR* pstrNextArg = va_arg(argList, const FX_CHAR*); + if (pstrNextArg) { + nItemLen = FXSYS_strlen(pstrNextArg); + if (nItemLen < 1) { + nItemLen = 1; + } + } else { + nItemLen = 6; + } + } break; + case 's' | FORCE_ANSI: + case 'S' | FORCE_ANSI: { + const FX_CHAR* pstrNextArg = va_arg(argList, const FX_CHAR*); + if (pstrNextArg) { + nItemLen = FXSYS_strlen(pstrNextArg); + if (nItemLen < 1) { + nItemLen = 1; + } + } else { + nItemLen = 6; + } + } break; + case 's' | FORCE_UNICODE: + case 'S' | FORCE_UNICODE: { + const FX_WCHAR* pstrNextArg = va_arg(argList, FX_WCHAR*); + if (pstrNextArg) { + nItemLen = FXSYS_wcslen(pstrNextArg); + if (nItemLen < 1) { + nItemLen = 1; + } + } else { + nItemLen = 6; + } + } break; + } + if (nItemLen != 0) { + if (nPrecision != 0 && nItemLen > nPrecision) { + nItemLen = nPrecision; + } + if (nItemLen < nWidth) { + nItemLen = nWidth; + } + } else { + switch (*pStr) { + case 'd': + case 'i': + case 'u': + case 'x': + case 'X': + case 'o': + if (nModifier & FORCE_INT64) { + va_arg(argList, int64_t); + } else { + va_arg(argList, int); + } + nItemLen = 32; + if (nItemLen < nWidth + nPrecision) { + nItemLen = nWidth + nPrecision; + } + break; + case 'a': + case 'A': + case 'e': + case 'E': + case 'g': + case 'G': + va_arg(argList, double); + nItemLen = 128; + if (nItemLen < nWidth + nPrecision) { + nItemLen = nWidth + nPrecision; + } + break; + case 'f': + if (nWidth + nPrecision > 100) { + nItemLen = nPrecision + nWidth + 128; + } else { + double f; + char pszTemp[256]; + f = va_arg(argList, double); + FXSYS_snprintf(pszTemp, sizeof(pszTemp), "%*.*f", nWidth, + nPrecision + 6, f); + nItemLen = FXSYS_strlen(pszTemp); + } + break; + case 'p': + va_arg(argList, void*); + nItemLen = 32; + if (nItemLen < nWidth + nPrecision) { + nItemLen = nWidth + nPrecision; + } + break; + case 'n': + va_arg(argList, int*); + break; + } + } + nMaxLen += nItemLen; + } + GetBuffer(nMaxLen); + if (m_pData) { + FXSYS_vswprintf((wchar_t*)m_pData->m_String, nMaxLen + 1, + (const wchar_t*)pFormat, argListSave); + ReleaseBuffer(); + } + va_end(argListSave); +} + +void CFX_WideString::Format(const FX_WCHAR* pFormat, ...) { + va_list argList; + va_start(argList, pFormat); + FormatV(pFormat, argList); + va_end(argList); +} + +FX_STRSIZE CFX_WideString::Insert(FX_STRSIZE nIndex, FX_WCHAR ch) { + FX_STRSIZE nNewLength = m_pData ? m_pData->m_nDataLength : 0; + nIndex = std::max(nIndex, 0); + nIndex = std::min(nIndex, nNewLength); + nNewLength++; + + ReallocBeforeWrite(nNewLength); + wmemmove(m_pData->m_String + nIndex + 1, m_pData->m_String + nIndex, + nNewLength - nIndex); + m_pData->m_String[nIndex] = ch; + m_pData->m_nDataLength = nNewLength; + return nNewLength; +} + +CFX_WideString CFX_WideString::Right(FX_STRSIZE nCount) const { + if (!m_pData) + return CFX_WideString(); + + nCount = std::max(nCount, 0); + if (nCount >= m_pData->m_nDataLength) + return *this; + + CFX_WideString dest; + AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount); + return dest; +} + +CFX_WideString CFX_WideString::Left(FX_STRSIZE nCount) const { + if (!m_pData) + return CFX_WideString(); + + nCount = std::max(nCount, 0); + if (nCount >= m_pData->m_nDataLength) + return *this; + + CFX_WideString dest; + AllocCopy(dest, nCount, 0); + return dest; +} + +FX_STRSIZE CFX_WideString::Find(FX_WCHAR ch, FX_STRSIZE nStart) const { + if (!m_pData) + return -1; + + if (nStart < 0 || nStart >= m_pData->m_nDataLength) + return -1; + + const FX_WCHAR* pStr = + wmemchr(m_pData->m_String + nStart, ch, m_pData->m_nDataLength - nStart); + return pStr ? pStr - m_pData->m_String : -1; +} + +FX_STRSIZE CFX_WideString::Find(const CFX_WideStringC& pSub, + FX_STRSIZE nStart) const { + if (!m_pData) + return -1; + + FX_STRSIZE nLength = m_pData->m_nDataLength; + if (nStart > nLength) + return -1; + + const FX_WCHAR* pStr = + FX_wcsstr(m_pData->m_String + nStart, m_pData->m_nDataLength - nStart, + pSub.c_str(), pSub.GetLength()); + return pStr ? (int)(pStr - m_pData->m_String) : -1; +} + +void CFX_WideString::MakeLower() { + if (!m_pData) + return; + + ReallocBeforeWrite(m_pData->m_nDataLength); + FXSYS_wcslwr(m_pData->m_String); +} + +void CFX_WideString::MakeUpper() { + if (!m_pData) + return; + + ReallocBeforeWrite(m_pData->m_nDataLength); + FXSYS_wcsupr(m_pData->m_String); +} + +FX_STRSIZE CFX_WideString::Remove(FX_WCHAR chRemove) { + if (!m_pData || m_pData->m_nDataLength < 1) + return 0; + + FX_WCHAR* pstrSource = m_pData->m_String; + FX_WCHAR* pstrEnd = m_pData->m_String + m_pData->m_nDataLength; + while (pstrSource < pstrEnd) { + if (*pstrSource == chRemove) + break; + pstrSource++; + } + if (pstrSource == pstrEnd) + return 0; + + ptrdiff_t copied = pstrSource - m_pData->m_String; + ReallocBeforeWrite(m_pData->m_nDataLength); + pstrSource = m_pData->m_String + copied; + pstrEnd = m_pData->m_String + m_pData->m_nDataLength; + + FX_WCHAR* pstrDest = pstrSource; + while (pstrSource < pstrEnd) { + if (*pstrSource != chRemove) { + *pstrDest = *pstrSource; + pstrDest++; + } + pstrSource++; + } + + *pstrDest = 0; + FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest); + m_pData->m_nDataLength -= nCount; + return nCount; +} + +FX_STRSIZE CFX_WideString::Replace(const CFX_WideStringC& pOld, + const CFX_WideStringC& pNew) { + if (!m_pData || pOld.IsEmpty()) + return 0; + + FX_STRSIZE nSourceLen = pOld.GetLength(); + FX_STRSIZE nReplacementLen = pNew.GetLength(); + FX_STRSIZE nCount = 0; + const FX_WCHAR* pStart = m_pData->m_String; + FX_WCHAR* pEnd = m_pData->m_String + m_pData->m_nDataLength; + while (1) { + const FX_WCHAR* pTarget = FX_wcsstr(pStart, (FX_STRSIZE)(pEnd - pStart), + pOld.c_str(), nSourceLen); + if (!pTarget) + break; + + nCount++; + pStart = pTarget + nSourceLen; + } + if (nCount == 0) + return 0; + + FX_STRSIZE nNewLength = + m_pData->m_nDataLength + (nReplacementLen - nSourceLen) * nCount; + + if (nNewLength == 0) { + clear(); + return nCount; + } + + CFX_RetainPtr pNewData(StringData::Create(nNewLength)); + pStart = m_pData->m_String; + FX_WCHAR* pDest = pNewData->m_String; + for (FX_STRSIZE i = 0; i < nCount; i++) { + const FX_WCHAR* pTarget = FX_wcsstr(pStart, (FX_STRSIZE)(pEnd - pStart), + pOld.c_str(), nSourceLen); + wmemcpy(pDest, pStart, pTarget - pStart); + pDest += pTarget - pStart; + wmemcpy(pDest, pNew.c_str(), pNew.GetLength()); + pDest += pNew.GetLength(); + pStart = pTarget + nSourceLen; + } + wmemcpy(pDest, pStart, pEnd - pStart); + m_pData.Swap(pNewData); + return nCount; +} + +void CFX_WideString::SetAt(FX_STRSIZE nIndex, FX_WCHAR ch) { + if (!m_pData) { + return; + } + ASSERT(nIndex >= 0); + ASSERT(nIndex < m_pData->m_nDataLength); + ReallocBeforeWrite(m_pData->m_nDataLength); + m_pData->m_String[nIndex] = ch; +} + +// static +CFX_WideString CFX_WideString::FromLocal(const CFX_ByteStringC& str) { + return FromCodePage(str, 0); +} + +// static +CFX_WideString CFX_WideString::FromCodePage(const CFX_ByteStringC& str, + uint16_t codepage) { + return CFX_CharMap::GetWideString(codepage, str); +} + +// static +CFX_WideString CFX_WideString::FromUTF8(const CFX_ByteStringC& str) { + if (str.IsEmpty()) + return CFX_WideString(); + + CFX_UTF8Decoder decoder; + for (FX_STRSIZE i = 0; i < str.GetLength(); i++) + decoder.Input(str[i]); + + return CFX_WideString(decoder.GetResult()); +} + +// static +CFX_WideString CFX_WideString::FromUTF16LE(const unsigned short* wstr, + FX_STRSIZE wlen) { + if (!wstr || 0 == wlen) { + return CFX_WideString(); + } + + CFX_WideString result; + FX_WCHAR* buf = result.GetBuffer(wlen); + for (int i = 0; i < wlen; i++) { + buf[i] = wstr[i]; + } + result.ReleaseBuffer(wlen); + return result; +} + +int CFX_WideString::Compare(const FX_WCHAR* lpsz) const { + if (m_pData) + return FXSYS_wcscmp(m_pData->m_String, lpsz); + return (!lpsz || lpsz[0] == 0) ? 0 : -1; +} + +int CFX_WideString::Compare(const CFX_WideString& str) const { + if (!m_pData) { + if (!str.m_pData) { + return 0; + } + return -1; + } + if (!str.m_pData) { + return 1; + } + int this_len = m_pData->m_nDataLength; + int that_len = str.m_pData->m_nDataLength; + int min_len = this_len < that_len ? this_len : that_len; + for (int i = 0; i < min_len; i++) { + if (m_pData->m_String[i] < str.m_pData->m_String[i]) { + return -1; + } + if (m_pData->m_String[i] > str.m_pData->m_String[i]) { + return 1; + } + } + if (this_len < that_len) { + return -1; + } + if (this_len > that_len) { + return 1; + } + return 0; +} + +int CFX_WideString::CompareNoCase(const FX_WCHAR* lpsz) const { + if (!m_pData) { + return (!lpsz || lpsz[0] == 0) ? 0 : -1; + } + return FXSYS_wcsicmp(m_pData->m_String, lpsz); +} + +FX_STRSIZE CFX_WideString::WStringLength(const unsigned short* str) { + FX_STRSIZE len = 0; + if (str) + while (str[len]) + len++; + return len; +} + +void CFX_WideString::TrimRight(const CFX_WideStringC& pTargets) { + if (IsEmpty() || pTargets.IsEmpty()) + return; + + FX_STRSIZE pos = GetLength(); + while (pos && pTargets.Find(m_pData->m_String[pos - 1]) != -1) + pos--; + + if (pos < m_pData->m_nDataLength) { + ReallocBeforeWrite(m_pData->m_nDataLength); + m_pData->m_String[pos] = 0; + m_pData->m_nDataLength = pos; + } +} + +void CFX_WideString::TrimRight(FX_WCHAR chTarget) { + FX_WCHAR str[2] = {chTarget, 0}; + TrimRight(str); +} + +void CFX_WideString::TrimRight() { + TrimRight(L"\x09\x0a\x0b\x0c\x0d\x20"); +} + +void CFX_WideString::TrimLeft(const CFX_WideStringC& pTargets) { + if (!m_pData || pTargets.IsEmpty()) + return; + + FX_STRSIZE len = GetLength(); + if (len < 1) + return; + + FX_STRSIZE pos = 0; + while (pos < len) { + FX_STRSIZE i = 0; + while (i < pTargets.GetLength() && + pTargets.CharAt(i) != m_pData->m_String[pos]) { + i++; + } + if (i == pTargets.GetLength()) { + break; + } + pos++; + } + if (pos) { + ReallocBeforeWrite(len); + FX_STRSIZE nDataLength = len - pos; + FXSYS_memmove(m_pData->m_String, m_pData->m_String + pos, + (nDataLength + 1) * sizeof(FX_WCHAR)); + m_pData->m_nDataLength = nDataLength; + } +} + +void CFX_WideString::TrimLeft(FX_WCHAR chTarget) { + FX_WCHAR str[2] = {chTarget, 0}; + TrimLeft(str); +} + +void CFX_WideString::TrimLeft() { + TrimLeft(L"\x09\x0a\x0b\x0c\x0d\x20"); +} +FX_FLOAT FX_wtof(const FX_WCHAR* str, int len) { + if (len == 0) { + return 0.0; + } + int cc = 0; + bool bNegative = false; + if (str[0] == '+') { + cc++; + } else if (str[0] == '-') { + bNegative = true; + cc++; + } + int integer = 0; + while (cc < len) { + if (str[cc] == '.') { + break; + } + integer = integer * 10 + FXSYS_toDecimalDigit(str[cc]); + cc++; + } + FX_FLOAT fraction = 0; + if (str[cc] == '.') { + cc++; + FX_FLOAT scale = 0.1f; + while (cc < len) { + fraction += scale * FXSYS_toDecimalDigit(str[cc]); + scale *= 0.1f; + cc++; + } + } + fraction += (FX_FLOAT)integer; + return bNegative ? -fraction : fraction; +} + +int CFX_WideString::GetInteger() const { + return m_pData ? FXSYS_wtoi(m_pData->m_String) : 0; +} + +FX_FLOAT CFX_WideString::GetFloat() const { + return m_pData ? FX_wtof(m_pData->m_String, m_pData->m_nDataLength) : 0.0f; +} + +// static +CFX_ByteString CFX_CharMap::GetByteString(uint16_t codepage, + const CFX_WideStringC& wstr) { + ASSERT(IsValidCodePage(codepage)); + int src_len = wstr.GetLength(); + int dest_len = FXSYS_WideCharToMultiByte(codepage, 0, wstr.c_str(), src_len, + nullptr, 0, nullptr, nullptr); + CFX_ByteString bstr; + if (dest_len) { + FX_CHAR* dest_buf = bstr.GetBuffer(dest_len); + FXSYS_WideCharToMultiByte(codepage, 0, wstr.c_str(), src_len, dest_buf, + dest_len, nullptr, nullptr); + bstr.ReleaseBuffer(dest_len); + } + return bstr; +} + +// static +CFX_WideString CFX_CharMap::GetWideString(uint16_t codepage, + const CFX_ByteStringC& bstr) { + ASSERT(IsValidCodePage(codepage)); + int src_len = bstr.GetLength(); + int dest_len = + FXSYS_MultiByteToWideChar(codepage, 0, bstr.c_str(), src_len, nullptr, 0); + CFX_WideString wstr; + if (dest_len) { + FX_WCHAR* dest_buf = wstr.GetBuffer(dest_len); + FXSYS_MultiByteToWideChar(codepage, 0, bstr.c_str(), src_len, dest_buf, + dest_len); + wstr.ReleaseBuffer(dest_len); + } + return wstr; +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_basic_wstring_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_basic_wstring_unittest.cpp new file mode 100644 index 000000000000..07b5aaf13c19 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_basic_wstring_unittest.cpp @@ -0,0 +1,941 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/fx_basic.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(fxcrt, WideStringOperatorSubscript) { + // CFX_WideString includes the NUL terminator for non-empty strings. + CFX_WideString abc(L"abc"); + EXPECT_EQ(L'a', abc[0]); + EXPECT_EQ(L'b', abc[1]); + EXPECT_EQ(L'c', abc[2]); + EXPECT_EQ(L'\0', abc[3]); +} + +TEST(fxcrt, WideStringOperatorLT) { + CFX_WideString empty; + CFX_WideString a(L"a"); + CFX_WideString abc(L"\x0110qq"); // Comes before despite endianness. + CFX_WideString def(L"\x1001qq"); // Comes after despite endianness. + + EXPECT_FALSE(empty < empty); + EXPECT_FALSE(a < a); + EXPECT_FALSE(abc < abc); + EXPECT_FALSE(def < def); + + EXPECT_TRUE(empty < a); + EXPECT_FALSE(a < empty); + + EXPECT_TRUE(empty < abc); + EXPECT_FALSE(abc < empty); + + EXPECT_TRUE(empty < def); + EXPECT_FALSE(def < empty); + + EXPECT_TRUE(a < abc); + EXPECT_FALSE(abc < a); + + EXPECT_TRUE(a < def); + EXPECT_FALSE(def < a); + + EXPECT_TRUE(abc < def); + EXPECT_FALSE(def < abc); +} + +TEST(fxcrt, WideStringOperatorEQ) { + CFX_WideString null_string; + EXPECT_TRUE(null_string == null_string); + + CFX_WideString empty_string(L""); + EXPECT_TRUE(empty_string == empty_string); + EXPECT_TRUE(empty_string == null_string); + EXPECT_TRUE(null_string == empty_string); + + CFX_WideString deleted_string(L"hello"); + deleted_string.Delete(0, 5); + EXPECT_TRUE(deleted_string == deleted_string); + EXPECT_TRUE(deleted_string == null_string); + EXPECT_TRUE(deleted_string == empty_string); + EXPECT_TRUE(null_string == deleted_string); + EXPECT_TRUE(null_string == empty_string); + + CFX_WideString wide_string(L"hello"); + EXPECT_TRUE(wide_string == wide_string); + EXPECT_FALSE(wide_string == null_string); + EXPECT_FALSE(wide_string == empty_string); + EXPECT_FALSE(wide_string == deleted_string); + EXPECT_FALSE(null_string == wide_string); + EXPECT_FALSE(empty_string == wide_string); + EXPECT_FALSE(deleted_string == wide_string); + + CFX_WideString wide_string_same1(L"hello"); + EXPECT_TRUE(wide_string == wide_string_same1); + EXPECT_TRUE(wide_string_same1 == wide_string); + + CFX_WideString wide_string_same2(wide_string); + EXPECT_TRUE(wide_string == wide_string_same2); + EXPECT_TRUE(wide_string_same2 == wide_string); + + CFX_WideString wide_string1(L"he"); + CFX_WideString wide_string2(L"hellp"); + CFX_WideString wide_string3(L"hellod"); + EXPECT_FALSE(wide_string == wide_string1); + EXPECT_FALSE(wide_string == wide_string2); + EXPECT_FALSE(wide_string == wide_string3); + EXPECT_FALSE(wide_string1 == wide_string); + EXPECT_FALSE(wide_string2 == wide_string); + EXPECT_FALSE(wide_string3 == wide_string); + + CFX_WideStringC null_string_c; + CFX_WideStringC empty_string_c(L""); + EXPECT_TRUE(null_string == null_string_c); + EXPECT_TRUE(null_string == empty_string_c); + EXPECT_TRUE(empty_string == null_string_c); + EXPECT_TRUE(empty_string == empty_string_c); + EXPECT_TRUE(deleted_string == null_string_c); + EXPECT_TRUE(deleted_string == empty_string_c); + EXPECT_TRUE(null_string_c == null_string); + EXPECT_TRUE(empty_string_c == null_string); + EXPECT_TRUE(null_string_c == empty_string); + EXPECT_TRUE(empty_string_c == empty_string); + EXPECT_TRUE(null_string_c == deleted_string); + EXPECT_TRUE(empty_string_c == deleted_string); + + CFX_WideStringC wide_string_c_same1(L"hello"); + EXPECT_TRUE(wide_string == wide_string_c_same1); + EXPECT_TRUE(wide_string_c_same1 == wide_string); + + CFX_WideStringC wide_string_c1(L"he"); + CFX_WideStringC wide_string_c2(L"hellp"); + CFX_WideStringC wide_string_c3(L"hellod"); + EXPECT_FALSE(wide_string == wide_string_c1); + EXPECT_FALSE(wide_string == wide_string_c2); + EXPECT_FALSE(wide_string == wide_string_c3); + EXPECT_FALSE(wide_string_c1 == wide_string); + EXPECT_FALSE(wide_string_c2 == wide_string); + EXPECT_FALSE(wide_string_c3 == wide_string); + + const wchar_t* c_null_string = nullptr; + const wchar_t* c_empty_string = L""; + EXPECT_TRUE(null_string == c_null_string); + EXPECT_TRUE(null_string == c_empty_string); + EXPECT_TRUE(empty_string == c_null_string); + EXPECT_TRUE(empty_string == c_empty_string); + EXPECT_TRUE(deleted_string == c_null_string); + EXPECT_TRUE(deleted_string == c_empty_string); + EXPECT_TRUE(c_null_string == null_string); + EXPECT_TRUE(c_empty_string == null_string); + EXPECT_TRUE(c_null_string == empty_string); + EXPECT_TRUE(c_empty_string == empty_string); + EXPECT_TRUE(c_null_string == deleted_string); + EXPECT_TRUE(c_empty_string == deleted_string); + + const wchar_t* c_string_same1 = L"hello"; + EXPECT_TRUE(wide_string == c_string_same1); + EXPECT_TRUE(c_string_same1 == wide_string); + + const wchar_t* c_string1 = L"he"; + const wchar_t* c_string2 = L"hellp"; + const wchar_t* c_string3 = L"hellod"; + EXPECT_FALSE(wide_string == c_string1); + EXPECT_FALSE(wide_string == c_string2); + EXPECT_FALSE(wide_string == c_string3); + EXPECT_FALSE(c_string1 == wide_string); + EXPECT_FALSE(c_string2 == wide_string); + EXPECT_FALSE(c_string3 == wide_string); +} + +TEST(fxcrt, WideStringOperatorNE) { + CFX_WideString null_string; + EXPECT_FALSE(null_string != null_string); + + CFX_WideString empty_string(L""); + EXPECT_FALSE(empty_string != empty_string); + EXPECT_FALSE(empty_string != null_string); + EXPECT_FALSE(null_string != empty_string); + + CFX_WideString deleted_string(L"hello"); + deleted_string.Delete(0, 5); + EXPECT_FALSE(deleted_string != deleted_string); + EXPECT_FALSE(deleted_string != null_string); + EXPECT_FALSE(deleted_string != empty_string); + EXPECT_FALSE(null_string != deleted_string); + EXPECT_FALSE(null_string != empty_string); + + CFX_WideString wide_string(L"hello"); + EXPECT_FALSE(wide_string != wide_string); + EXPECT_TRUE(wide_string != null_string); + EXPECT_TRUE(wide_string != empty_string); + EXPECT_TRUE(wide_string != deleted_string); + EXPECT_TRUE(null_string != wide_string); + EXPECT_TRUE(empty_string != wide_string); + EXPECT_TRUE(deleted_string != wide_string); + + CFX_WideString wide_string_same1(L"hello"); + EXPECT_FALSE(wide_string != wide_string_same1); + EXPECT_FALSE(wide_string_same1 != wide_string); + + CFX_WideString wide_string_same2(wide_string); + EXPECT_FALSE(wide_string != wide_string_same2); + EXPECT_FALSE(wide_string_same2 != wide_string); + + CFX_WideString wide_string1(L"he"); + CFX_WideString wide_string2(L"hellp"); + CFX_WideString wide_string3(L"hellod"); + EXPECT_TRUE(wide_string != wide_string1); + EXPECT_TRUE(wide_string != wide_string2); + EXPECT_TRUE(wide_string != wide_string3); + EXPECT_TRUE(wide_string1 != wide_string); + EXPECT_TRUE(wide_string2 != wide_string); + EXPECT_TRUE(wide_string3 != wide_string); + + CFX_WideStringC null_string_c; + CFX_WideStringC empty_string_c(L""); + EXPECT_FALSE(null_string != null_string_c); + EXPECT_FALSE(null_string != empty_string_c); + EXPECT_FALSE(empty_string != null_string_c); + EXPECT_FALSE(empty_string != empty_string_c); + EXPECT_FALSE(deleted_string != null_string_c); + EXPECT_FALSE(deleted_string != empty_string_c); + EXPECT_FALSE(null_string_c != null_string); + EXPECT_FALSE(empty_string_c != null_string); + EXPECT_FALSE(null_string_c != empty_string); + EXPECT_FALSE(empty_string_c != empty_string); + + CFX_WideStringC wide_string_c_same1(L"hello"); + EXPECT_FALSE(wide_string != wide_string_c_same1); + EXPECT_FALSE(wide_string_c_same1 != wide_string); + + CFX_WideStringC wide_string_c1(L"he"); + CFX_WideStringC wide_string_c2(L"hellp"); + CFX_WideStringC wide_string_c3(L"hellod"); + EXPECT_TRUE(wide_string != wide_string_c1); + EXPECT_TRUE(wide_string != wide_string_c2); + EXPECT_TRUE(wide_string != wide_string_c3); + EXPECT_TRUE(wide_string_c1 != wide_string); + EXPECT_TRUE(wide_string_c2 != wide_string); + EXPECT_TRUE(wide_string_c3 != wide_string); + + const wchar_t* c_null_string = nullptr; + const wchar_t* c_empty_string = L""; + EXPECT_FALSE(null_string != c_null_string); + EXPECT_FALSE(null_string != c_empty_string); + EXPECT_FALSE(empty_string != c_null_string); + EXPECT_FALSE(empty_string != c_empty_string); + EXPECT_FALSE(deleted_string != c_null_string); + EXPECT_FALSE(deleted_string != c_empty_string); + EXPECT_FALSE(c_null_string != null_string); + EXPECT_FALSE(c_empty_string != null_string); + EXPECT_FALSE(c_null_string != empty_string); + EXPECT_FALSE(c_empty_string != empty_string); + EXPECT_FALSE(c_null_string != deleted_string); + EXPECT_FALSE(c_empty_string != deleted_string); + + const wchar_t* c_string_same1 = L"hello"; + EXPECT_FALSE(wide_string != c_string_same1); + EXPECT_FALSE(c_string_same1 != wide_string); + + const wchar_t* c_string1 = L"he"; + const wchar_t* c_string2 = L"hellp"; + const wchar_t* c_string3 = L"hellod"; + EXPECT_TRUE(wide_string != c_string1); + EXPECT_TRUE(wide_string != c_string2); + EXPECT_TRUE(wide_string != c_string3); + EXPECT_TRUE(c_string1 != wide_string); + EXPECT_TRUE(c_string2 != wide_string); + EXPECT_TRUE(c_string3 != wide_string); +} + +TEST(fxcrt, WideStringConcatInPlace) { + CFX_WideString fred; + fred.Concat(L"FRED", 4); + EXPECT_EQ(L"FRED", fred); + + fred.Concat(L"DY", 2); + EXPECT_EQ(L"FREDDY", fred); + + fred.Delete(3, 3); + EXPECT_EQ(L"FRE", fred); + + fred.Concat(L"D", 1); + EXPECT_EQ(L"FRED", fred); + + CFX_WideString copy = fred; + fred.Concat(L"DY", 2); + EXPECT_EQ(L"FREDDY", fred); + EXPECT_EQ(L"FRED", copy); + + // Test invalid arguments. + copy = fred; + fred.Concat(L"freddy", -6); + CFX_WideString not_aliased(L"xxxxxx"); + EXPECT_EQ(L"FREDDY", fred); + EXPECT_EQ(L"xxxxxx", not_aliased); +} + +TEST(fxcrt, WideStringRemove) { + CFX_WideString freed(L"FREED"); + freed.Remove(L'E'); + EXPECT_EQ(L"FRD", freed); + freed.Remove(L'F'); + EXPECT_EQ(L"RD", freed); + freed.Remove(L'D'); + EXPECT_EQ(L"R", freed); + freed.Remove(L'X'); + EXPECT_EQ(L"R", freed); + freed.Remove(L'R'); + EXPECT_EQ(L"", freed); + + CFX_WideString empty; + empty.Remove(L'X'); + EXPECT_EQ(L"", empty); +} + +TEST(fxcrt, WideStringRemoveCopies) { + CFX_WideString freed(L"FREED"); + const FX_WCHAR* old_buffer = freed.c_str(); + + // No change with single reference - no copy. + freed.Remove(L'Q'); + EXPECT_EQ(L"FREED", freed); + EXPECT_EQ(old_buffer, freed.c_str()); + + // Change with single reference - no copy. + freed.Remove(L'E'); + EXPECT_EQ(L"FRD", freed); + EXPECT_EQ(old_buffer, freed.c_str()); + + // No change with multiple references - no copy. + CFX_WideString shared(freed); + freed.Remove(L'Q'); + EXPECT_EQ(L"FRD", freed); + EXPECT_EQ(old_buffer, freed.c_str()); + EXPECT_EQ(old_buffer, shared.c_str()); + + // Change with multiple references -- must copy. + freed.Remove(L'D'); + EXPECT_EQ(L"FR", freed); + EXPECT_NE(old_buffer, freed.c_str()); + EXPECT_EQ(L"FRD", shared); + EXPECT_EQ(old_buffer, shared.c_str()); +} + +TEST(fxcrt, WideStringReplace) { + CFX_WideString fred(L"FRED"); + fred.Replace(L"FR", L"BL"); + EXPECT_EQ(L"BLED", fred); + fred.Replace(L"D", L"DDY"); + EXPECT_EQ(L"BLEDDY", fred); + fred.Replace(L"LEDD", L""); + EXPECT_EQ(L"BY", fred); + fred.Replace(L"X", L"CLAMS"); + EXPECT_EQ(L"BY", fred); + fred.Replace(L"BY", L"HI"); + EXPECT_EQ(L"HI", fred); + fred.Replace(L"", L"CLAMS"); + EXPECT_EQ(L"HI", fred); + fred.Replace(L"HI", L""); + EXPECT_EQ(L"", fred); +} + +TEST(fxcrt, WideStringInsert) { + CFX_WideString fred(L"FRED"); + fred.Insert(-1, 'X'); + EXPECT_EQ(L"XFRED", fred); + + fred.Insert(0, 'S'); + EXPECT_EQ(L"SXFRED", fred); + + fred.Insert(2, 'T'); + EXPECT_EQ(L"SXTFRED", fred); + + fred.Insert(5, 'U'); + EXPECT_EQ(L"SXTFRUED", fred); + + fred.Insert(8, 'V'); + EXPECT_EQ(L"SXTFRUEDV", fred); + + fred.Insert(12, 'P'); + EXPECT_EQ(L"SXTFRUEDVP", fred); + + { + CFX_WideString empty; + empty.Insert(-1, 'X'); + EXPECT_EQ(L"X", empty); + } + { + CFX_WideString empty; + empty.Insert(0, 'X'); + EXPECT_EQ(L"X", empty); + } + { + CFX_WideString empty; + empty.Insert(5, 'X'); + EXPECT_EQ(L"X", empty); + } +} + +TEST(fxcrt, WideStringDelete) { + CFX_WideString fred(L"FRED"); + fred.Delete(0, 2); + EXPECT_EQ(L"ED", fred); + fred.Delete(1); + EXPECT_EQ(L"E", fred); + fred.Delete(-1); + EXPECT_EQ(L"", fred); + fred.Delete(1); + EXPECT_EQ(L"", fred); + + CFX_WideString empty; + empty.Delete(0); + EXPECT_EQ(L"", empty); + empty.Delete(-1); + EXPECT_EQ(L"", empty); + empty.Delete(1); + EXPECT_EQ(L"", empty); +} + +TEST(fxcrt, WideStringMid) { + CFX_WideString fred(L"FRED"); + EXPECT_EQ(L"", fred.Mid(0, 0)); + EXPECT_EQ(L"", fred.Mid(3, 0)); + EXPECT_EQ(L"FRED", fred.Mid(0)); + EXPECT_EQ(L"RED", fred.Mid(1)); + EXPECT_EQ(L"ED", fred.Mid(2)); + EXPECT_EQ(L"D", fred.Mid(3)); + EXPECT_EQ(L"F", fred.Mid(0, 1)); + EXPECT_EQ(L"R", fred.Mid(1, 1)); + EXPECT_EQ(L"E", fred.Mid(2, 1)); + EXPECT_EQ(L"D", fred.Mid(3, 1)); + EXPECT_EQ(L"FR", fred.Mid(0, 2)); + EXPECT_EQ(L"FRED", fred.Mid(0, 4)); + EXPECT_EQ(L"FRED", fred.Mid(0, 10)); + + EXPECT_EQ(L"FR", fred.Mid(-1, 2)); + EXPECT_EQ(L"RED", fred.Mid(1, 4)); + EXPECT_EQ(L"", fred.Mid(4, 1)); + + CFX_WideString empty; + EXPECT_EQ(L"", empty.Mid(0, 0)); + EXPECT_EQ(L"", empty.Mid(0)); + EXPECT_EQ(L"", empty.Mid(1)); + EXPECT_EQ(L"", empty.Mid(-1)); +} + +TEST(fxcrt, WideStringLeft) { + CFX_WideString fred(L"FRED"); + EXPECT_EQ(L"", fred.Left(0)); + EXPECT_EQ(L"F", fred.Left(1)); + EXPECT_EQ(L"FR", fred.Left(2)); + EXPECT_EQ(L"FRE", fred.Left(3)); + EXPECT_EQ(L"FRED", fred.Left(4)); + + EXPECT_EQ(L"FRED", fred.Left(5)); + EXPECT_EQ(L"", fred.Left(-1)); + + CFX_WideString empty; + EXPECT_EQ(L"", empty.Left(0)); + EXPECT_EQ(L"", empty.Left(1)); + EXPECT_EQ(L"", empty.Left(-1)); +} + +TEST(fxcrt, WideStringRight) { + CFX_WideString fred(L"FRED"); + EXPECT_EQ(L"", fred.Right(0)); + EXPECT_EQ(L"D", fred.Right(1)); + EXPECT_EQ(L"ED", fred.Right(2)); + EXPECT_EQ(L"RED", fred.Right(3)); + EXPECT_EQ(L"FRED", fred.Right(4)); + + EXPECT_EQ(L"FRED", fred.Right(5)); + EXPECT_EQ(L"", fred.Right(-1)); + + CFX_WideString empty; + EXPECT_EQ(L"", empty.Right(0)); + EXPECT_EQ(L"", empty.Right(1)); + EXPECT_EQ(L"", empty.Right(-1)); +} + +TEST(fxcrt, WideStringUpperLower) { + CFX_WideString fred(L"F-Re.42D"); + fred.MakeLower(); + EXPECT_EQ(L"f-re.42d", fred); + fred.MakeUpper(); + EXPECT_EQ(L"F-RE.42D", fred); + + CFX_WideString empty; + empty.MakeLower(); + EXPECT_EQ(L"", empty); + empty.MakeUpper(); + EXPECT_EQ(L"", empty); +} + +TEST(fxcrt, WideStringTrimRight) { + CFX_WideString fred(L" FRED "); + fred.TrimRight(); + EXPECT_EQ(L" FRED", fred); + fred.TrimRight(L'E'); + EXPECT_EQ(L" FRED", fred); + fred.TrimRight(L'D'); + EXPECT_EQ(L" FRE", fred); + fred.TrimRight(L"ERP"); + EXPECT_EQ(L" F", fred); + + CFX_WideString blank(L" "); + blank.TrimRight(L"ERP"); + EXPECT_EQ(L" ", blank); + blank.TrimRight(L'E'); + EXPECT_EQ(L" ", blank); + blank.TrimRight(); + EXPECT_EQ(L"", blank); + + CFX_WideString empty; + empty.TrimRight(L"ERP"); + EXPECT_EQ(L"", empty); + empty.TrimRight(L'E'); + EXPECT_EQ(L"", empty); + empty.TrimRight(); + EXPECT_EQ(L"", empty); +} + +TEST(fxcrt, WideStringTrimRightCopies) { + { + // With a single reference, no copy takes place. + CFX_WideString fred(L" FRED "); + const FX_WCHAR* old_buffer = fred.c_str(); + fred.TrimRight(); + EXPECT_EQ(L" FRED", fred); + EXPECT_EQ(old_buffer, fred.c_str()); + } + { + // With multiple references, we must copy. + CFX_WideString fred(L" FRED "); + CFX_WideString other_fred = fred; + const FX_WCHAR* old_buffer = fred.c_str(); + fred.TrimRight(); + EXPECT_EQ(L" FRED", fred); + EXPECT_EQ(L" FRED ", other_fred); + EXPECT_NE(old_buffer, fred.c_str()); + } + { + // With multiple references, but no modifications, no copy. + CFX_WideString fred(L"FRED"); + CFX_WideString other_fred = fred; + const FX_WCHAR* old_buffer = fred.c_str(); + fred.TrimRight(); + EXPECT_EQ(L"FRED", fred); + EXPECT_EQ(L"FRED", other_fred); + EXPECT_EQ(old_buffer, fred.c_str()); + } +} + +TEST(fxcrt, WideStringTrimLeft) { + CFX_WideString fred(L" FRED "); + fred.TrimLeft(); + EXPECT_EQ(L"FRED ", fred); + fred.TrimLeft(L'E'); + EXPECT_EQ(L"FRED ", fred); + fred.TrimLeft(L'F'); + EXPECT_EQ(L"RED ", fred); + fred.TrimLeft(L"ERP"); + EXPECT_EQ(L"D ", fred); + + CFX_WideString blank(L" "); + blank.TrimLeft(L"ERP"); + EXPECT_EQ(L" ", blank); + blank.TrimLeft(L'E'); + EXPECT_EQ(L" ", blank); + blank.TrimLeft(); + EXPECT_EQ(L"", blank); + + CFX_WideString empty; + empty.TrimLeft(L"ERP"); + EXPECT_EQ(L"", empty); + empty.TrimLeft(L'E'); + EXPECT_EQ(L"", empty); + empty.TrimLeft(); + EXPECT_EQ(L"", empty); +} + +TEST(fxcrt, WideStringTrimLeftCopies) { + { + // With a single reference, no copy takes place. + CFX_WideString fred(L" FRED "); + const FX_WCHAR* old_buffer = fred.c_str(); + fred.TrimLeft(); + EXPECT_EQ(L"FRED ", fred); + EXPECT_EQ(old_buffer, fred.c_str()); + } + { + // With multiple references, we must copy. + CFX_WideString fred(L" FRED "); + CFX_WideString other_fred = fred; + const FX_WCHAR* old_buffer = fred.c_str(); + fred.TrimLeft(); + EXPECT_EQ(L"FRED ", fred); + EXPECT_EQ(L" FRED ", other_fred); + EXPECT_NE(old_buffer, fred.c_str()); + } + { + // With multiple references, but no modifications, no copy. + CFX_WideString fred(L"FRED"); + CFX_WideString other_fred = fred; + const FX_WCHAR* old_buffer = fred.c_str(); + fred.TrimLeft(); + EXPECT_EQ(L"FRED", fred); + EXPECT_EQ(L"FRED", other_fred); + EXPECT_EQ(old_buffer, fred.c_str()); + } +} + +TEST(fxcrt, WideStringReserve) { + { + CFX_WideString str; + str.Reserve(6); + const FX_WCHAR* old_buffer = str.c_str(); + str += L"ABCDEF"; + EXPECT_EQ(old_buffer, str.c_str()); + str += L"Blah Blah Blah Blah Blah Blah"; + EXPECT_NE(old_buffer, str.c_str()); + } + { + CFX_WideString str(L"A"); + str.Reserve(6); + const FX_WCHAR* old_buffer = str.c_str(); + str += L"BCDEF"; + EXPECT_EQ(old_buffer, str.c_str()); + str += L"Blah Blah Blah Blah Blah Blah"; + EXPECT_NE(old_buffer, str.c_str()); + } +} + +TEST(fxcrt, WideStringGetBuffer) { + { + CFX_WideString str; + FX_WCHAR* buffer = str.GetBuffer(12); + wcscpy(buffer, L"clams"); + str.ReleaseBuffer(); + EXPECT_EQ(L"clams", str); + } + { + CFX_WideString str(L"cl"); + FX_WCHAR* buffer = str.GetBuffer(12); + wcscpy(buffer + 2, L"ams"); + str.ReleaseBuffer(); + EXPECT_EQ(L"clams", str); + } +} + +TEST(fxcrt, WideStringReleaseBuffer) { + { + CFX_WideString str; + str.Reserve(12); + str += L"clams"; + const FX_WCHAR* old_buffer = str.c_str(); + str.ReleaseBuffer(4); + EXPECT_EQ(old_buffer, str.c_str()); + EXPECT_EQ(L"clam", str); + } + { + CFX_WideString str(L"c"); + str.Reserve(12); + str += L"lams"; + const FX_WCHAR* old_buffer = str.c_str(); + str.ReleaseBuffer(4); + EXPECT_EQ(old_buffer, str.c_str()); + EXPECT_EQ(L"clam", str); + } + { + CFX_WideString str; + str.Reserve(200); + str += L"clams"; + const FX_WCHAR* old_buffer = str.c_str(); + str.ReleaseBuffer(4); + EXPECT_NE(old_buffer, str.c_str()); + EXPECT_EQ(L"clam", str); + } + { + CFX_WideString str(L"c"); + str.Reserve(200); + str += L"lams"; + const FX_WCHAR* old_buffer = str.c_str(); + str.ReleaseBuffer(4); + EXPECT_NE(old_buffer, str.c_str()); + EXPECT_EQ(L"clam", str); + } +} + +TEST(fxcrt, WideStringUTF16LE_Encode) { + struct UTF16LEEncodeCase { + CFX_WideString ws; + CFX_ByteString bs; + } utf16le_encode_cases[] = { + {L"", CFX_ByteString("\0\0", 2)}, + {L"abc", CFX_ByteString("a\0b\0c\0\0\0", 8)}, + {L"abcdef", CFX_ByteString("a\0b\0c\0d\0e\0f\0\0\0", 14)}, + {L"abc\0def", CFX_ByteString("a\0b\0c\0\0\0", 8)}, + {L"\xaabb\xccdd", CFX_ByteString("\xbb\xaa\xdd\xcc\0\0", 6)}, + {L"\x3132\x6162", CFX_ByteString("\x32\x31\x62\x61\0\0", 6)}, + }; + + for (size_t i = 0; i < FX_ArraySize(utf16le_encode_cases); ++i) { + EXPECT_EQ(utf16le_encode_cases[i].bs, + utf16le_encode_cases[i].ws.UTF16LE_Encode()) + << " for case number " << i; + } +} + +TEST(fxcrt, WideStringCOperatorSubscript) { + // CFX_WideStringC includes the NUL terminator for non-empty strings. + CFX_WideStringC abc(L"abc"); + EXPECT_EQ(L'a', abc.CharAt(0)); + EXPECT_EQ(L'b', abc.CharAt(1)); + EXPECT_EQ(L'c', abc.CharAt(2)); + EXPECT_EQ(L'\0', abc.CharAt(3)); +} + +TEST(fxcrt, WideStringCOperatorLT) { + CFX_WideStringC empty; + CFX_WideStringC a(L"a"); + CFX_WideStringC abc(L"\x0110qq"); // Comes before despite endianness. + CFX_WideStringC def(L"\x1001qq"); // Comes after despite endianness. + + EXPECT_FALSE(empty < empty); + EXPECT_FALSE(a < a); + EXPECT_FALSE(abc < abc); + EXPECT_FALSE(def < def); + + EXPECT_TRUE(empty < a); + EXPECT_FALSE(a < empty); + + EXPECT_TRUE(empty < abc); + EXPECT_FALSE(abc < empty); + + EXPECT_TRUE(empty < def); + EXPECT_FALSE(def < empty); + + EXPECT_TRUE(a < abc); + EXPECT_FALSE(abc < a); + + EXPECT_TRUE(a < def); + EXPECT_FALSE(def < a); + + EXPECT_TRUE(abc < def); + EXPECT_FALSE(def < abc); +} + +TEST(fxcrt, WideStringCOperatorEQ) { + CFX_WideStringC wide_string_c(L"hello"); + EXPECT_TRUE(wide_string_c == wide_string_c); + + CFX_WideStringC wide_string_c_same1(L"hello"); + EXPECT_TRUE(wide_string_c == wide_string_c_same1); + EXPECT_TRUE(wide_string_c_same1 == wide_string_c); + + CFX_WideStringC wide_string_c_same2(wide_string_c); + EXPECT_TRUE(wide_string_c == wide_string_c_same2); + EXPECT_TRUE(wide_string_c_same2 == wide_string_c); + + CFX_WideStringC wide_string_c1(L"he"); + CFX_WideStringC wide_string_c2(L"hellp"); + CFX_WideStringC wide_string_c3(L"hellod"); + EXPECT_FALSE(wide_string_c == wide_string_c1); + EXPECT_FALSE(wide_string_c == wide_string_c2); + EXPECT_FALSE(wide_string_c == wide_string_c3); + EXPECT_FALSE(wide_string_c1 == wide_string_c); + EXPECT_FALSE(wide_string_c2 == wide_string_c); + EXPECT_FALSE(wide_string_c3 == wide_string_c); + + CFX_WideString wide_string_same1(L"hello"); + EXPECT_TRUE(wide_string_c == wide_string_same1); + EXPECT_TRUE(wide_string_same1 == wide_string_c); + + CFX_WideString wide_string1(L"he"); + CFX_WideString wide_string2(L"hellp"); + CFX_WideString wide_string3(L"hellod"); + EXPECT_FALSE(wide_string_c == wide_string1); + EXPECT_FALSE(wide_string_c == wide_string2); + EXPECT_FALSE(wide_string_c == wide_string3); + EXPECT_FALSE(wide_string1 == wide_string_c); + EXPECT_FALSE(wide_string2 == wide_string_c); + EXPECT_FALSE(wide_string3 == wide_string_c); + + const wchar_t* c_string_same1 = L"hello"; + EXPECT_TRUE(wide_string_c == c_string_same1); + EXPECT_TRUE(c_string_same1 == wide_string_c); + + const wchar_t* c_string1 = L"he"; + const wchar_t* c_string2 = L"hellp"; + const wchar_t* c_string3 = L"hellod"; + EXPECT_FALSE(wide_string_c == c_string1); + EXPECT_FALSE(wide_string_c == c_string2); + EXPECT_FALSE(wide_string_c == c_string3); + + EXPECT_FALSE(c_string1 == wide_string_c); + EXPECT_FALSE(c_string2 == wide_string_c); + EXPECT_FALSE(c_string3 == wide_string_c); +} + +TEST(fxcrt, WideStringCOperatorNE) { + CFX_WideStringC wide_string_c(L"hello"); + EXPECT_FALSE(wide_string_c != wide_string_c); + + CFX_WideStringC wide_string_c_same1(L"hello"); + EXPECT_FALSE(wide_string_c != wide_string_c_same1); + EXPECT_FALSE(wide_string_c_same1 != wide_string_c); + + CFX_WideStringC wide_string_c_same2(wide_string_c); + EXPECT_FALSE(wide_string_c != wide_string_c_same2); + EXPECT_FALSE(wide_string_c_same2 != wide_string_c); + + CFX_WideStringC wide_string_c1(L"he"); + CFX_WideStringC wide_string_c2(L"hellp"); + CFX_WideStringC wide_string_c3(L"hellod"); + EXPECT_TRUE(wide_string_c != wide_string_c1); + EXPECT_TRUE(wide_string_c != wide_string_c2); + EXPECT_TRUE(wide_string_c != wide_string_c3); + EXPECT_TRUE(wide_string_c1 != wide_string_c); + EXPECT_TRUE(wide_string_c2 != wide_string_c); + EXPECT_TRUE(wide_string_c3 != wide_string_c); + + CFX_WideString wide_string_same1(L"hello"); + EXPECT_FALSE(wide_string_c != wide_string_same1); + EXPECT_FALSE(wide_string_same1 != wide_string_c); + + CFX_WideString wide_string1(L"he"); + CFX_WideString wide_string2(L"hellp"); + CFX_WideString wide_string3(L"hellod"); + EXPECT_TRUE(wide_string_c != wide_string1); + EXPECT_TRUE(wide_string_c != wide_string2); + EXPECT_TRUE(wide_string_c != wide_string3); + EXPECT_TRUE(wide_string1 != wide_string_c); + EXPECT_TRUE(wide_string2 != wide_string_c); + EXPECT_TRUE(wide_string3 != wide_string_c); + + const wchar_t* c_string_same1 = L"hello"; + EXPECT_FALSE(wide_string_c != c_string_same1); + EXPECT_FALSE(c_string_same1 != wide_string_c); + + const wchar_t* c_string1 = L"he"; + const wchar_t* c_string2 = L"hellp"; + const wchar_t* c_string3 = L"hellod"; + EXPECT_TRUE(wide_string_c != c_string1); + EXPECT_TRUE(wide_string_c != c_string2); + EXPECT_TRUE(wide_string_c != c_string3); + + EXPECT_TRUE(c_string1 != wide_string_c); + EXPECT_TRUE(c_string2 != wide_string_c); + EXPECT_TRUE(c_string3 != wide_string_c); +} + +TEST(fxcrt, WideStringCFind) { + CFX_WideStringC null_string; + EXPECT_EQ(-1, null_string.Find(L'a')); + EXPECT_EQ(-1, null_string.Find(0)); + + CFX_WideStringC empty_string(L""); + EXPECT_EQ(-1, empty_string.Find(L'a')); + EXPECT_EQ(-1, empty_string.Find(0)); + + CFX_WideStringC single_string(L"a"); + EXPECT_EQ(0, single_string.Find(L'a')); + EXPECT_EQ(-1, single_string.Find(L'b')); + EXPECT_EQ(-1, single_string.Find(0)); + + CFX_WideStringC longer_string(L"abccc"); + EXPECT_EQ(0, longer_string.Find(L'a')); + EXPECT_EQ(2, longer_string.Find(L'c')); + EXPECT_EQ(-1, longer_string.Find(0)); + + CFX_WideStringC hibyte_string( + L"ab\xff08" + L"def"); + EXPECT_EQ(2, hibyte_string.Find(L'\xff08')); +} + +TEST(fxcrt, WideStringFormatWidth) { + { + CFX_WideString str; + str.Format(L"%5d", 1); + EXPECT_EQ(L" 1", str); + } + + { + CFX_WideString str; + str.Format(L"%d", 1); + EXPECT_EQ(L"1", str); + } + + { + CFX_WideString str; + str.Format(L"%*d", 5, 1); + EXPECT_EQ(L" 1", str); + } + + { + CFX_WideString str; + str.Format(L"%-1d", 1); + EXPECT_EQ(L"1", str); + } + + { + CFX_WideString str; + str.Format(L"%0d", 1); + EXPECT_EQ(L"1", str); + } + + { + CFX_WideString str; + str.Format(L"%1048576d", 1); + EXPECT_EQ(L"Bad width", str); + } +} + +TEST(fxcrt, WideStringFormatPrecision) { + { + CFX_WideString str; + str.Format(L"%.2f", 1.12345); + EXPECT_EQ(L"1.12", str); + } + + { + CFX_WideString str; + str.Format(L"%.*f", 3, 1.12345); + EXPECT_EQ(L"1.123", str); + } + + { + CFX_WideString str; + str.Format(L"%f", 1.12345); + EXPECT_EQ(L"1.123450", str); + } + + { + CFX_WideString str; + str.Format(L"%-1f", 1.12345); + EXPECT_EQ(L"1.123450", str); + } + + { + CFX_WideString str; + str.Format(L"%0f", 1.12345); + EXPECT_EQ(L"1.123450", str); + } + + { + CFX_WideString str; + str.Format(L"%.1048576f", 1.2); + EXPECT_EQ(L"Bad precision", str); + } +} + +TEST(fxcrt, EmptyWideString) { + CFX_WideString empty_str; + EXPECT_TRUE(empty_str.IsEmpty()); + EXPECT_EQ(0, empty_str.GetLength()); + const FX_WCHAR* cstr = empty_str.c_str(); + EXPECT_EQ(0, FXSYS_wcslen(cstr)); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_bidi.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_bidi.cpp new file mode 100644 index 000000000000..e82b3e72847c --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_bidi.cpp @@ -0,0 +1,83 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fx_bidi.h" +#include "core/fxcrt/fx_ucd.h" + +#include + +CFX_BidiChar::CFX_BidiChar() + : m_CurrentSegment({0, 0, NEUTRAL}), m_LastSegment({0, 0, NEUTRAL}) {} + +bool CFX_BidiChar::AppendChar(FX_WCHAR wch) { + uint32_t dwProps = FX_GetUnicodeProperties(wch); + int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; + Direction direction = NEUTRAL; + switch (iBidiCls) { + case FX_BIDICLASS_L: + case FX_BIDICLASS_AN: + case FX_BIDICLASS_EN: + direction = LEFT; + break; + case FX_BIDICLASS_R: + case FX_BIDICLASS_AL: + direction = RIGHT; + break; + } + + bool bChangeDirection = (direction != m_CurrentSegment.direction); + if (bChangeDirection) + StartNewSegment(direction); + + m_CurrentSegment.count++; + return bChangeDirection; +} + +bool CFX_BidiChar::EndChar() { + StartNewSegment(NEUTRAL); + return m_LastSegment.count > 0; +} + +void CFX_BidiChar::StartNewSegment(CFX_BidiChar::Direction direction) { + m_LastSegment = m_CurrentSegment; + m_CurrentSegment.start += m_CurrentSegment.count; + m_CurrentSegment.count = 0; + m_CurrentSegment.direction = direction; +} + +CFX_BidiString::CFX_BidiString(const CFX_WideString& str) + : m_Str(str), + m_pBidiChar(new CFX_BidiChar), + m_eOverallDirection(CFX_BidiChar::LEFT) { + for (int i = 0; i < m_Str.GetLength(); ++i) { + if (m_pBidiChar->AppendChar(m_Str.GetAt(i))) + m_Order.push_back(m_pBidiChar->GetSegmentInfo()); + } + if (m_pBidiChar->EndChar()) + m_Order.push_back(m_pBidiChar->GetSegmentInfo()); + + size_t nR2L = std::count_if(m_Order.begin(), m_Order.end(), + [](const CFX_BidiChar::Segment& seg) { + return seg.direction == CFX_BidiChar::RIGHT; + }); + + size_t nL2R = std::count_if(m_Order.begin(), m_Order.end(), + [](const CFX_BidiChar::Segment& seg) { + return seg.direction == CFX_BidiChar::LEFT; + }); + + if (nR2L > 0 && nR2L >= nL2R) + SetOverallDirectionRight(); +} + +CFX_BidiString::~CFX_BidiString() {} + +void CFX_BidiString::SetOverallDirectionRight() { + if (m_eOverallDirection != CFX_BidiChar::RIGHT) { + std::reverse(m_Order.begin(), m_Order.end()); + m_eOverallDirection = CFX_BidiChar::RIGHT; + } +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_bidi.h b/modules/pdfium/pdfium/core/fxcrt/fx_bidi.h new file mode 100644 index 000000000000..8d12cc899784 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_bidi.h @@ -0,0 +1,75 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FX_BIDI_H_ +#define CORE_FXCRT_FX_BIDI_H_ + +#include +#include + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +// Processes characters and group them into segments based on text direction. +class CFX_BidiChar { + public: + enum Direction { NEUTRAL, LEFT, RIGHT }; + struct Segment { + int32_t start; // Start position. + int32_t count; // Character count. + Direction direction; // Segment direction. + }; + + CFX_BidiChar(); + + // Append a character and classify it as left, right, or neutral. + // Returns true if the character has a different direction than the + // existing direction to indicate there is a segment to process. + bool AppendChar(FX_WCHAR wch); + + // Call this after the last character has been appended. AppendChar() + // must not be called after this. + // Returns true if there is still a segment to process. + bool EndChar(); + + // Call after a change in direction is indicated by the above to get + // information about the segment to process. + Segment GetSegmentInfo() const { return m_LastSegment; } + + private: + void StartNewSegment(CFX_BidiChar::Direction direction); + + Segment m_CurrentSegment; + Segment m_LastSegment; +}; + +class CFX_BidiString { + public: + using const_iterator = std::vector::const_iterator; + + explicit CFX_BidiString(const CFX_WideString& str); + ~CFX_BidiString(); + + // Overall direction is always LEFT or RIGHT, never NEUTRAL. + CFX_BidiChar::Direction OverallDirection() const { + return m_eOverallDirection; + } + + // Force the overall direction to be R2L regardless of what was detected. + void SetOverallDirectionRight(); + + FX_WCHAR CharAt(size_t x) const { return m_Str[x]; } + const_iterator begin() const { return m_Order.begin(); } + const_iterator end() const { return m_Order.end(); } + + private: + const CFX_WideString m_Str; + std::unique_ptr m_pBidiChar; + std::vector m_Order; + CFX_BidiChar::Direction m_eOverallDirection; +}; + +#endif // CORE_FXCRT_FX_BIDI_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_bidi_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_bidi_unittest.cpp new file mode 100644 index 000000000000..2c1996be4610 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_bidi_unittest.cpp @@ -0,0 +1,365 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/fx_bidi.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +const FX_WCHAR kNeutralChar = 32; +const FX_WCHAR kLeftChar = 65; +const FX_WCHAR kRightChar = 1424; + +} // namespace + +TEST(fxcrt, BidiCharEmpty) { + CFX_BidiChar bidi; + CFX_BidiChar::Segment info; + + info = bidi.GetSegmentInfo(); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, info.direction); + EXPECT_EQ(0, info.start); + EXPECT_EQ(0, info.count); + EXPECT_FALSE(bidi.EndChar()); +} + +TEST(fxcrt, BidiCharLeft) { + CFX_BidiChar bidi; + CFX_BidiChar::Segment info; + + EXPECT_TRUE(bidi.AppendChar(kLeftChar)); + info = bidi.GetSegmentInfo(); + EXPECT_EQ(0, info.start); + EXPECT_EQ(0, info.count); + + EXPECT_FALSE(bidi.AppendChar(kLeftChar)); + EXPECT_FALSE(bidi.AppendChar(kLeftChar)); + + info = bidi.GetSegmentInfo(); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, info.direction); + EXPECT_EQ(0, info.start); + EXPECT_EQ(0, info.count); + + EXPECT_TRUE(bidi.EndChar()); + info = bidi.GetSegmentInfo(); + EXPECT_EQ(CFX_BidiChar::LEFT, info.direction); + EXPECT_EQ(0, info.start); + EXPECT_EQ(3, info.count); + + EXPECT_FALSE(bidi.EndChar()); +} + +TEST(fxcrt, BidiCharLeftNeutralRight) { + CFX_BidiChar bidi; + CFX_BidiChar::Segment info; + + EXPECT_TRUE(bidi.AppendChar(kLeftChar)); + info = bidi.GetSegmentInfo(); + EXPECT_EQ(0, info.start); + EXPECT_EQ(0, info.count); + + EXPECT_FALSE(bidi.AppendChar(kLeftChar)); + EXPECT_FALSE(bidi.AppendChar(kLeftChar)); + EXPECT_TRUE(bidi.AppendChar(kNeutralChar)); + info = bidi.GetSegmentInfo(); + EXPECT_EQ(0, info.start); + EXPECT_EQ(3, info.count); + + EXPECT_FALSE(bidi.AppendChar(kNeutralChar)); + EXPECT_FALSE(bidi.AppendChar(kNeutralChar)); + EXPECT_FALSE(bidi.AppendChar(kNeutralChar)); + EXPECT_TRUE(bidi.AppendChar(kRightChar)); + info = bidi.GetSegmentInfo(); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, info.direction); + EXPECT_EQ(3, info.start); + EXPECT_EQ(4, info.count); + + EXPECT_TRUE(bidi.EndChar()); + info = bidi.GetSegmentInfo(); + EXPECT_EQ(CFX_BidiChar::RIGHT, info.direction); + EXPECT_EQ(7, info.start); + EXPECT_EQ(1, info.count); + + EXPECT_FALSE(bidi.EndChar()); +} + +TEST(fxcrt, BidiCharLeftRightLeft) { + CFX_BidiChar bidi; + CFX_BidiChar::Segment info; + + EXPECT_TRUE(bidi.AppendChar(kLeftChar)); + info = bidi.GetSegmentInfo(); + EXPECT_EQ(0, info.start); + EXPECT_EQ(0, info.count); + + EXPECT_FALSE(bidi.AppendChar(kLeftChar)); + EXPECT_FALSE(bidi.AppendChar(kLeftChar)); + EXPECT_TRUE(bidi.AppendChar(kRightChar)); + info = bidi.GetSegmentInfo(); + EXPECT_EQ(0, info.start); + EXPECT_EQ(3, info.count); + + EXPECT_FALSE(bidi.AppendChar(kRightChar)); + EXPECT_FALSE(bidi.AppendChar(kRightChar)); + EXPECT_FALSE(bidi.AppendChar(kRightChar)); + EXPECT_TRUE(bidi.AppendChar(kLeftChar)); + info = bidi.GetSegmentInfo(); + EXPECT_EQ(CFX_BidiChar::RIGHT, info.direction); + EXPECT_EQ(3, info.start); + EXPECT_EQ(4, info.count); + + EXPECT_TRUE(bidi.EndChar()); + info = bidi.GetSegmentInfo(); + EXPECT_EQ(CFX_BidiChar::LEFT, info.direction); + EXPECT_EQ(7, info.start); + EXPECT_EQ(1, info.count); + + EXPECT_FALSE(bidi.EndChar()); +} + +TEST(fxcrt, BidiStringEmpty) { + CFX_BidiString bidi(L""); + EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); + EXPECT_TRUE(bidi.begin() == bidi.end()); +} + +TEST(fxcrt, BidiStringAllNeutral) { + { + const FX_WCHAR str[] = {kNeutralChar, 0}; + CFX_BidiString bidi(str); + EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); + + auto it = bidi.begin(); + ASSERT_FALSE(it == bidi.end()); + EXPECT_EQ(0, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); + ++it; + EXPECT_TRUE(it == bidi.end()); + } + { + const FX_WCHAR str[] = {kNeutralChar, kNeutralChar, kNeutralChar, 0}; + CFX_BidiString bidi(str); + EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); + + auto it = bidi.begin(); + ASSERT_FALSE(it == bidi.end()); + EXPECT_EQ(0, it->start); + EXPECT_EQ(3, it->count); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); + ++it; + EXPECT_TRUE(it == bidi.end()); + } +} + +TEST(fxcrt, BidiStringAllLeft) { + { + const FX_WCHAR str[] = {kLeftChar, 0}; + CFX_BidiString bidi(str); + EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); + + auto it = bidi.begin(); + ASSERT_FALSE(it == bidi.end()); + EXPECT_EQ(0, it->start); + EXPECT_EQ(0, it->count); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_EQ(0, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_TRUE(it == bidi.end()); + } + { + const FX_WCHAR str[] = {kLeftChar, kLeftChar, kLeftChar, 0}; + CFX_BidiString bidi(str); + EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); + + auto it = bidi.begin(); + ASSERT_FALSE(it == bidi.end()); + EXPECT_EQ(0, it->start); + EXPECT_EQ(0, it->count); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_EQ(0, it->start); + EXPECT_EQ(3, it->count); + EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_TRUE(it == bidi.end()); + } +} + +TEST(fxcrt, BidiStringAllRight) { + { + const FX_WCHAR str[] = {kRightChar, 0}; + CFX_BidiString bidi(str); + EXPECT_EQ(CFX_BidiChar::RIGHT, bidi.OverallDirection()); + + auto it = bidi.begin(); + EXPECT_EQ(0, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + ASSERT_FALSE(it == bidi.end()); + EXPECT_EQ(0, it->start); + EXPECT_EQ(0, it->count); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_TRUE(it == bidi.end()); + } + { + const FX_WCHAR str[] = {kRightChar, kRightChar, kRightChar, 0}; + CFX_BidiString bidi(str); + EXPECT_EQ(CFX_BidiChar::RIGHT, bidi.OverallDirection()); + + auto it = bidi.begin(); + EXPECT_EQ(0, it->start); + EXPECT_EQ(3, it->count); + EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + ASSERT_FALSE(it == bidi.end()); + EXPECT_EQ(0, it->start); + EXPECT_EQ(0, it->count); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_TRUE(it == bidi.end()); + } +} + +TEST(fxcrt, BidiStringLeftNeutralLeftRight) { + const FX_WCHAR str[] = {kLeftChar, kNeutralChar, kLeftChar, kRightChar, 0}; + CFX_BidiString bidi(str); + EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); + + auto it = bidi.begin(); + ASSERT_FALSE(it == bidi.end()); + EXPECT_EQ(0, it->start); + EXPECT_EQ(0, it->count); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_EQ(0, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_EQ(1, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_EQ(2, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_EQ(3, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_TRUE(it == bidi.end()); +} + +TEST(fxcrt, BidiStringRightNeutralLeftRight) { + const FX_WCHAR str[] = {kRightChar, kNeutralChar, kLeftChar, kRightChar, 0}; + CFX_BidiString bidi(str); + EXPECT_EQ(CFX_BidiChar::RIGHT, bidi.OverallDirection()); + + auto it = bidi.begin(); + EXPECT_EQ(3, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_EQ(2, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_EQ(1, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_EQ(0, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + ASSERT_FALSE(it == bidi.end()); + EXPECT_EQ(0, it->start); + EXPECT_EQ(0, it->count); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + EXPECT_TRUE(it == bidi.end()); +} + +TEST(fxcrt, BidiStringReverse) { + const FX_WCHAR str[] = {kLeftChar, kNeutralChar, kRightChar, kLeftChar, 0}; + CFX_BidiString bidi(str); + EXPECT_EQ(CFX_BidiChar::LEFT, bidi.OverallDirection()); + bidi.SetOverallDirectionRight(); + + auto it = bidi.begin(); + ASSERT_FALSE(it == bidi.end()); + EXPECT_EQ(3, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); + + ++it; + ASSERT_FALSE(it == bidi.end()); + EXPECT_EQ(2, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::RIGHT, it->direction); + ASSERT_FALSE(it == bidi.end()); + + ++it; + ASSERT_FALSE(it == bidi.end()); + EXPECT_EQ(1, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); + + ++it; + ASSERT_FALSE(it == bidi.end()); + EXPECT_EQ(0, it->start); + EXPECT_EQ(1, it->count); + EXPECT_EQ(CFX_BidiChar::LEFT, it->direction); + + ++it; + ASSERT_FALSE(it == bidi.end()); + EXPECT_EQ(0, it->start); + EXPECT_EQ(0, it->count); + EXPECT_EQ(CFX_BidiChar::NEUTRAL, it->direction); + + ++it; + EXPECT_TRUE(it == bidi.end()); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_coordinates.h b/modules/pdfium/pdfium/core/fxcrt/fx_coordinates.h new file mode 100644 index 000000000000..2c84d0776ced --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_coordinates.h @@ -0,0 +1,671 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FX_COORDINATES_H_ +#define CORE_FXCRT_FX_COORDINATES_H_ + +#include "core/fxcrt/fx_basic.h" + +class CFX_Matrix; + +template +class CFX_PTemplate { + public: + CFX_PTemplate() : x(0), y(0) {} + CFX_PTemplate(BaseType new_x, BaseType new_y) : x(new_x), y(new_y) {} + CFX_PTemplate(const CFX_PTemplate& other) : x(other.x), y(other.y) {} + void clear() { + x = 0; + y = 0; + } + CFX_PTemplate operator=(const CFX_PTemplate& other) { + if (this != &other) { + x = other.x; + y = other.y; + } + return *this; + } + bool operator==(const CFX_PTemplate& other) const { + return x == other.x && y == other.y; + } + bool operator!=(const CFX_PTemplate& other) const { + return !(*this == other); + } + CFX_PTemplate& operator+=(const CFX_PTemplate& obj) { + x += obj.x; + y += obj.y; + return *this; + } + CFX_PTemplate& operator-=(const CFX_PTemplate& obj) { + x -= obj.x; + y -= obj.y; + return *this; + } + CFX_PTemplate& operator*=(BaseType factor) { + x *= factor; + y *= factor; + return *this; + } + CFX_PTemplate& operator/=(BaseType divisor) { + x /= divisor; + y /= divisor; + return *this; + } + CFX_PTemplate operator+(const CFX_PTemplate& other) const { + return CFX_PTemplate(x + other.x, y + other.y); + } + CFX_PTemplate operator-(const CFX_PTemplate& other) const { + return CFX_PTemplate(x - other.x, y - other.y); + } + CFX_PTemplate operator*(BaseType factor) const { + return CFX_PTemplate(x * factor, y * factor); + } + CFX_PTemplate operator/(BaseType divisor) const { + return CFX_PTemplate(x / divisor, y / divisor); + } + + BaseType x; + BaseType y; +}; +using CFX_Point = CFX_PTemplate; +using CFX_PointF = CFX_PTemplate; + +template +class CFX_STemplate { + public: + CFX_STemplate() : width(0), height(0) {} + + CFX_STemplate(BaseType new_width, BaseType new_height) + : width(new_width), height(new_height) {} + + CFX_STemplate(const CFX_STemplate& other) + : width(other.width), height(other.height) {} + + template + CFX_STemplate As() const { + return CFX_STemplate(static_cast(width), + static_cast(height)); + } + + void clear() { + width = 0; + height = 0; + } + CFX_STemplate operator=(const CFX_STemplate& other) { + if (this != &other) { + width = other.width; + height = other.height; + } + return *this; + } + bool operator==(const CFX_STemplate& other) const { + return width == other.width && height == other.height; + } + bool operator!=(const CFX_STemplate& other) const { + return !(*this == other); + } + CFX_STemplate& operator+=(const CFX_STemplate& obj) { + width += obj.width; + height += obj.height; + return *this; + } + CFX_STemplate& operator-=(const CFX_STemplate& obj) { + width -= obj.width; + height -= obj.height; + return *this; + } + CFX_STemplate& operator*=(BaseType factor) { + width *= factor; + height *= factor; + return *this; + } + CFX_STemplate& operator/=(BaseType divisor) { + width /= divisor; + height /= divisor; + return *this; + } + CFX_STemplate operator+(const CFX_STemplate& other) const { + return CFX_STemplate(width + other.width, height + other.height); + } + CFX_STemplate operator-(const CFX_STemplate& other) const { + return CFX_STemplate(width - other.width, height - other.height); + } + CFX_STemplate operator*(BaseType factor) const { + return CFX_STemplate(width * factor, height * factor); + } + CFX_STemplate operator/(BaseType divisor) const { + return CFX_STemplate(width / divisor, height / divisor); + } + + BaseType width; + BaseType height; +}; +using CFX_Size = CFX_STemplate; +using CFX_SizeF = CFX_STemplate; + +template +class CFX_VTemplate : public CFX_PTemplate { + public: + using CFX_PTemplate::x; + using CFX_PTemplate::y; + + CFX_VTemplate() : CFX_PTemplate() {} + CFX_VTemplate(BaseType new_x, BaseType new_y) + : CFX_PTemplate(new_x, new_y) {} + + CFX_VTemplate(const CFX_VTemplate& other) : CFX_PTemplate(other) {} + + CFX_VTemplate(const CFX_PTemplate& point1, + const CFX_PTemplate& point2) + : CFX_PTemplate(point2.x - point1.x, point2.y - point1.y) {} + + FX_FLOAT Length() const { return FXSYS_sqrt(x * x + y * y); } + void Normalize() { + FX_FLOAT fLen = Length(); + if (fLen < 0.0001f) + return; + + x /= fLen; + y /= fLen; + } + void Translate(BaseType dx, BaseType dy) { + x += dx; + y += dy; + } + void Scale(BaseType sx, BaseType sy) { + x *= sx; + y *= sy; + } + void Rotate(FX_FLOAT fRadian) { + FX_FLOAT cosValue = FXSYS_cos(fRadian); + FX_FLOAT sinValue = FXSYS_sin(fRadian); + x = x * cosValue - y * sinValue; + y = x * sinValue + y * cosValue; + } +}; +using CFX_Vector = CFX_VTemplate; +using CFX_VectorF = CFX_VTemplate; + +// Rectangles. +// TODO(tsepez): Consolidate all these different rectangle classes. + +// LTWH rectangles (y-axis runs downwards). +template +class CFX_RTemplate { + public: + using PointType = CFX_PTemplate; + using SizeType = CFX_STemplate; + using VectorType = CFX_VTemplate; + using RectType = CFX_RTemplate; + + CFX_RTemplate() : left(0), top(0), width(0), height(0) {} + CFX_RTemplate(BaseType dst_left, + BaseType dst_top, + BaseType dst_width, + BaseType dst_height) + : left(dst_left), top(dst_top), width(dst_width), height(dst_height) {} + CFX_RTemplate(BaseType dst_left, BaseType dst_top, const SizeType& dst_size) + : left(dst_left), + top(dst_top), + width(dst_size.width), + height(dst_size.height) {} + CFX_RTemplate(const PointType& p, BaseType dst_width, BaseType dst_height) + : left(p.x), top(p.y), width(dst_width), height(dst_height) {} + CFX_RTemplate(const PointType& p1, const SizeType& s2) + : left(p1.x), top(p1.y), width(s2.width), height(s2.height) {} + CFX_RTemplate(const PointType& p1, const PointType& p2) + : left(p1.x), + top(p1.y), + width(p2.width - p1.width), + height(p2.height - p1.height) { + Normalize(); + } + CFX_RTemplate(const PointType& p, const VectorType& v) + : left(p.x), top(p.y), width(v.x), height(v.y) { + Normalize(); + } + + // NOLINTNEXTLINE(runtime/explicit) + CFX_RTemplate(const RectType& other) + : left(other.left), + top(other.top), + width(other.width), + height(other.height) {} + + template + CFX_RTemplate As() const { + return CFX_RTemplate( + static_cast(left), static_cast(top), + static_cast(width), static_cast(height)); + } + + void Reset() { + left = 0; + top = 0; + width = 0; + height = 0; + } + RectType& operator+=(const PointType& p) { + left += p.x; + top += p.y; + return *this; + } + RectType& operator-=(const PointType& p) { + left -= p.x; + top -= p.y; + return *this; + } + BaseType right() const { return left + width; } + BaseType bottom() const { return top + height; } + void Normalize() { + if (width < 0) { + left += width; + width = -width; + } + if (height < 0) { + top += height; + height = -height; + } + } + void Offset(BaseType dx, BaseType dy) { + left += dx; + top += dy; + } + void Inflate(BaseType x, BaseType y) { + left -= x; + width += x * 2; + top -= y; + height += y * 2; + } + void Inflate(const PointType& p) { Inflate(p.x, p.y); } + void Inflate(BaseType off_left, + BaseType off_top, + BaseType off_right, + BaseType off_bottom) { + left -= off_left; + top -= off_top; + width += off_left + off_right; + height += off_top + off_bottom; + } + void Inflate(const RectType& rt) { + Inflate(rt.left, rt.top, rt.left + rt.width, rt.top + rt.height); + } + void Deflate(BaseType x, BaseType y) { + left += x; + width -= x * 2; + top += y; + height -= y * 2; + } + void Deflate(const PointType& p) { Deflate(p.x, p.y); } + void Deflate(BaseType off_left, + BaseType off_top, + BaseType off_right, + BaseType off_bottom) { + left += off_left; + top += off_top; + width -= off_left + off_right; + height -= off_top + off_bottom; + } + void Deflate(const RectType& rt) { + Deflate(rt.left, rt.top, rt.top + rt.width, rt.top + rt.height); + } + bool IsEmpty() const { return width <= 0 || height <= 0; } + bool IsEmpty(FX_FLOAT fEpsilon) const { + return width <= fEpsilon || height <= fEpsilon; + } + void Empty() { width = height = 0; } + bool Contains(const PointType& p) const { + return p.x >= left && p.x < left + width && p.y >= top && + p.y < top + height; + } + bool Contains(const RectType& rt) const { + return rt.left >= left && rt.right() <= right() && rt.top >= top && + rt.bottom() <= bottom(); + } + BaseType Width() const { return width; } + BaseType Height() const { return height; } + SizeType Size() const { return SizeType(width, height); } + PointType TopLeft() const { return PointType(left, top); } + PointType TopRight() const { return PointType(left + width, top); } + PointType BottomLeft() const { return PointType(left, top + height); } + PointType BottomRight() const { + return PointType(left + width, top + height); + } + PointType Center() const { + return PointType(left + width / 2, top + height / 2); + } + void Union(BaseType x, BaseType y) { + BaseType r = right(); + BaseType b = bottom(); + if (left > x) + left = x; + if (r < x) + r = x; + if (top > y) + top = y; + if (b < y) + b = y; + width = r - left; + height = b - top; + } + void Union(const PointType& p) { Union(p.x, p.y); } + void Union(const RectType& rt) { + BaseType r = right(); + BaseType b = bottom(); + if (left > rt.left) + left = rt.left; + if (r < rt.right()) + r = rt.right(); + if (top > rt.top) + top = rt.top; + if (b < rt.bottom()) + b = rt.bottom(); + width = r - left; + height = b - top; + } + void Intersect(const RectType& rt) { + BaseType r = right(); + BaseType b = bottom(); + if (left < rt.left) + left = rt.left; + if (r > rt.right()) + r = rt.right(); + if (top < rt.top) + top = rt.top; + if (b > rt.bottom()) + b = rt.bottom(); + width = r - left; + height = b - top; + } + bool IntersectWith(const RectType& rt) const { + RectType rect = rt; + rect.Intersect(*this); + return !rect.IsEmpty(); + } + bool IntersectWith(const RectType& rt, FX_FLOAT fEpsilon) const { + RectType rect = rt; + rect.Intersect(*this); + return !rect.IsEmpty(fEpsilon); + } + friend bool operator==(const RectType& rc1, const RectType& rc2) { + return rc1.left == rc2.left && rc1.top == rc2.top && + rc1.width == rc2.width && rc1.height == rc2.height; + } + friend bool operator!=(const RectType& rc1, const RectType& rc2) { + return !(rc1 == rc2); + } + + BaseType left; + BaseType top; + BaseType width; + BaseType height; +}; +using CFX_Rect = CFX_RTemplate; +using CFX_RectF = CFX_RTemplate; + +// LTRB rectangles (y-axis runs downwards). +struct FX_RECT { + FX_RECT() : left(0), top(0), right(0), bottom(0) {} + FX_RECT(int l, int t, int r, int b) : left(l), top(t), right(r), bottom(b) {} + + int Width() const { return right - left; } + int Height() const { return bottom - top; } + bool IsEmpty() const { return right <= left || bottom <= top; } + + bool Valid() const { + pdfium::base::CheckedNumeric w = right; + pdfium::base::CheckedNumeric h = bottom; + w -= left; + h -= top; + return w.IsValid() && h.IsValid(); + } + + void Normalize(); + + void Intersect(const FX_RECT& src); + void Intersect(int l, int t, int r, int b) { Intersect(FX_RECT(l, t, r, b)); } + + void Offset(int dx, int dy) { + left += dx; + right += dx; + top += dy; + bottom += dy; + } + + bool operator==(const FX_RECT& src) const { + return left == src.left && right == src.right && top == src.top && + bottom == src.bottom; + } + + bool Contains(int x, int y) const { + return x >= left && x < right && y >= top && y < bottom; + } + + int32_t left; + int32_t top; + int32_t right; + int32_t bottom; +}; + +// LTRB rectangles (y-axis runs upwards). +class CFX_FloatRect { + public: + CFX_FloatRect() : CFX_FloatRect(0.0f, 0.0f, 0.0f, 0.0f) {} + CFX_FloatRect(FX_FLOAT l, FX_FLOAT b, FX_FLOAT r, FX_FLOAT t) + : left(l), bottom(b), right(r), top(t) {} + + explicit CFX_FloatRect(const FX_FLOAT* pArray) + : CFX_FloatRect(pArray[0], pArray[1], pArray[2], pArray[3]) {} + + explicit CFX_FloatRect(const FX_RECT& rect); + + void Normalize(); + + void Reset() { + left = 0.0f; + right = 0.0f; + bottom = 0.0f; + top = 0.0f; + } + + bool IsEmpty() const { return left >= right || bottom >= top; } + + bool Contains(const CFX_PointF& point) const; + bool Contains(const CFX_FloatRect& other_rect) const; + + void Intersect(const CFX_FloatRect& other_rect); + void Union(const CFX_FloatRect& other_rect); + + FX_RECT GetInnerRect() const; + FX_RECT GetOuterRect() const; + FX_RECT GetClosestRect() const; + + int Substract4(CFX_FloatRect& substract_rect, CFX_FloatRect* pRects); + + void InitRect(FX_FLOAT x, FX_FLOAT y) { + left = x; + right = x; + bottom = y; + top = y; + } + void UpdateRect(FX_FLOAT x, FX_FLOAT y); + + FX_FLOAT Width() const { return right - left; } + FX_FLOAT Height() const { return top - bottom; } + + void Inflate(FX_FLOAT x, FX_FLOAT y) { + Normalize(); + left -= x; + right += x; + bottom -= y; + top += y; + } + + void Inflate(FX_FLOAT other_left, + FX_FLOAT other_bottom, + FX_FLOAT other_right, + FX_FLOAT other_top) { + Normalize(); + left -= other_left; + bottom -= other_bottom; + right += other_right; + top += other_top; + } + + void Inflate(const CFX_FloatRect& rt) { + Inflate(rt.left, rt.bottom, rt.right, rt.top); + } + + void Deflate(FX_FLOAT x, FX_FLOAT y) { + Normalize(); + left += x; + right -= x; + bottom += y; + top -= y; + } + + void Deflate(FX_FLOAT other_left, + FX_FLOAT other_bottom, + FX_FLOAT other_right, + FX_FLOAT other_top) { + Normalize(); + left += other_left; + bottom += other_bottom; + right -= other_right; + top -= other_top; + } + + void Deflate(const CFX_FloatRect& rt) { + Deflate(rt.left, rt.bottom, rt.right, rt.top); + } + + void Translate(FX_FLOAT e, FX_FLOAT f) { + left += e; + right += e; + top += f; + bottom += f; + } + + static CFX_FloatRect GetBBox(const CFX_PointF* pPoints, int nPoints); + + FX_RECT ToFxRect() const { + return FX_RECT(static_cast(left), static_cast(top), + static_cast(right), static_cast(bottom)); + } + + static CFX_FloatRect FromCFXRectF(const CFX_RectF& rect) { + return CFX_FloatRect(rect.left, rect.top, rect.right(), rect.bottom()); + } + + FX_FLOAT left; + FX_FLOAT bottom; + FX_FLOAT right; + FX_FLOAT top; +}; + +class CFX_Matrix { + public: + CFX_Matrix() { SetIdentity(); } + + explicit CFX_Matrix(const FX_FLOAT n[6]) + : a(n[0]), b(n[1]), c(n[2]), d(n[3]), e(n[4]), f(n[5]) {} + + CFX_Matrix(const CFX_Matrix& other) + : a(other.a), + b(other.b), + c(other.c), + d(other.d), + e(other.e), + f(other.f) {} + + CFX_Matrix(FX_FLOAT a1, + FX_FLOAT b1, + FX_FLOAT c1, + FX_FLOAT d1, + FX_FLOAT e1, + FX_FLOAT f1) + : a(a1), b(b1), c(c1), d(d1), e(e1), f(f1) {} + + void operator=(const CFX_Matrix& other) { + a = other.a; + b = other.b; + c = other.c; + d = other.d; + e = other.e; + f = other.f; + } + + void SetIdentity() { + a = 1; + b = 0; + c = 0; + d = 1; + e = 0; + f = 0; + } + + void SetReverse(const CFX_Matrix& m); + + void Concat(const CFX_Matrix& m, bool bPrepended = false); + void ConcatInverse(const CFX_Matrix& m, bool bPrepended = false); + + bool IsIdentity() const { + return a == 1 && b == 0 && c == 0 && d == 1 && e == 0 && f == 0; + } + + bool Is90Rotated() const; + bool IsScaled() const; + bool WillScale() const { return a != 1.0f || b != 0 || c != 0 || d != 1.0f; } + + void Translate(FX_FLOAT x, FX_FLOAT y, bool bPrepended = false); + void Translate(int32_t x, int32_t y, bool bPrepended = false) { + Translate(static_cast(x), static_cast(y), bPrepended); + } + + void Scale(FX_FLOAT sx, FX_FLOAT sy, bool bPrepended = false); + void Rotate(FX_FLOAT fRadian, bool bPrepended = false); + void RotateAt(FX_FLOAT fRadian, + FX_FLOAT x, + FX_FLOAT y, + bool bPrepended = false); + + void Shear(FX_FLOAT fAlphaRadian, + FX_FLOAT fBetaRadian, + bool bPrepended = false); + + void MatchRect(const CFX_FloatRect& dest, const CFX_FloatRect& src); + + FX_FLOAT GetXUnit() const; + FX_FLOAT GetYUnit() const; + CFX_FloatRect GetUnitRect() const; + + FX_FLOAT TransformXDistance(FX_FLOAT dx) const; + FX_FLOAT TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const; + FX_FLOAT TransformDistance(FX_FLOAT distance) const; + + CFX_PointF Transform(const CFX_PointF& point) const; + + void TransformRect(CFX_RectF& rect) const; + void TransformRect(FX_FLOAT& left, + FX_FLOAT& right, + FX_FLOAT& top, + FX_FLOAT& bottom) const; + void TransformRect(CFX_FloatRect& rect) const { + TransformRect(rect.left, rect.right, rect.top, rect.bottom); + } + + FX_FLOAT a; + FX_FLOAT b; + FX_FLOAT c; + FX_FLOAT d; + FX_FLOAT e; + FX_FLOAT f; + + private: + void ConcatInternal(const CFX_Matrix& other, bool prepend); +}; + +#endif // CORE_FXCRT_FX_COORDINATES_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_ext.h b/modules/pdfium/pdfium/core/fxcrt/fx_ext.h new file mode 100644 index 000000000000..9203938c2c7b --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_ext.h @@ -0,0 +1,101 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FX_EXT_H_ +#define CORE_FXCRT_FX_EXT_H_ + +#include +#include +#include + +#include "core/fxcrt/fx_basic.h" + +#define FX_INVALID_OFFSET static_cast(-1) + +FX_FLOAT FXSYS_tan(FX_FLOAT a); +FX_FLOAT FXSYS_logb(FX_FLOAT b, FX_FLOAT x); +FX_FLOAT FXSYS_strtof(const FX_CHAR* pcsStr, + int32_t iLength = -1, + int32_t* pUsedLen = nullptr); +FX_FLOAT FXSYS_wcstof(const FX_WCHAR* pwsStr, + int32_t iLength = -1, + int32_t* pUsedLen = nullptr); +FX_WCHAR* FXSYS_wcsncpy(FX_WCHAR* dstStr, const FX_WCHAR* srcStr, size_t count); +int32_t FXSYS_wcsnicmp(const FX_WCHAR* s1, const FX_WCHAR* s2, size_t count); +int32_t FXSYS_strnicmp(const FX_CHAR* s1, const FX_CHAR* s2, size_t count); + +inline bool FXSYS_islower(int32_t ch) { + return ch >= 'a' && ch <= 'z'; +} +inline bool FXSYS_isupper(int32_t ch) { + return ch >= 'A' && ch <= 'Z'; +} +inline int32_t FXSYS_tolower(int32_t ch) { + return ch < 'A' || ch > 'Z' ? ch : (ch + 0x20); +} +inline int32_t FXSYS_toupper(int32_t ch) { + return ch < 'a' || ch > 'z' ? ch : (ch - 0x20); +} +inline bool FXSYS_iswalpha(wchar_t wch) { + return (wch >= L'A' && wch <= L'Z') || (wch >= L'a' && wch <= L'z'); +} +inline bool FXSYS_iswdigit(wchar_t wch) { + return wch >= L'0' && wch <= L'9'; +} +inline bool FXSYS_iswalnum(wchar_t wch) { + return FXSYS_iswalpha(wch) || FXSYS_iswdigit(wch); +} +inline bool FXSYS_iswspace(FX_WCHAR c) { + return (c == 0x20) || (c == 0x0d) || (c == 0x0a) || (c == 0x09); +} + +inline int FXSYS_toHexDigit(const FX_CHAR c) { + if (!std::isxdigit(c)) + return 0; + char upchar = std::toupper(c); + return upchar > '9' ? upchar - 'A' + 10 : upchar - '0'; +} + +inline bool FXSYS_isDecimalDigit(const FX_CHAR c) { + return !!std::isdigit(c); +} + +inline bool FXSYS_isDecimalDigit(const FX_WCHAR c) { + return !!std::iswdigit(c); +} + +inline int FXSYS_toDecimalDigit(const FX_CHAR c) { + return std::isdigit(c) ? c - '0' : 0; +} + +inline int FXSYS_toDecimalDigit(const FX_WCHAR c) { + return std::iswdigit(c) ? c - L'0' : 0; +} + +FX_FLOAT FXSYS_FractionalScale(size_t scale_factor, int value); +int FXSYS_FractionalScaleCount(); + +void* FX_Random_MT_Start(uint32_t dwSeed); +void FX_Random_MT_Close(void* pContext); +uint32_t FX_Random_MT_Generate(void* pContext); +void FX_Random_GenerateBase(uint32_t* pBuffer, int32_t iCount); +void FX_Random_GenerateMT(uint32_t* pBuffer, int32_t iCount); +void FX_Random_GenerateCrypto(uint32_t* pBuffer, int32_t iCount); + +#ifdef PDF_ENABLE_XFA +struct FX_GUID { + uint32_t data1; + uint16_t data2; + uint16_t data3; + uint8_t data4[8]; +}; +void FX_GUID_CreateV4(FX_GUID* pGUID); +void FX_GUID_ToString(const FX_GUID* pGUID, + CFX_ByteString& bsStr, + bool bSeparator = true); +#endif // PDF_ENABLE_XFA + +#endif // CORE_FXCRT_FX_EXT_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_extension.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_extension.cpp new file mode 100644 index 000000000000..5b577f745cab --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_extension.cpp @@ -0,0 +1,676 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/extension.h" + +#include +#include +#include + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_ext.h" + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +#include +#else +#include +#endif + +namespace { + +#ifdef PDF_ENABLE_XFA + +class CFX_CRTFileAccess : public IFX_FileAccess { + public: + template + friend CFX_RetainPtr pdfium::MakeRetain(Args&&... args); + + // IFX_FileAccess + void GetPath(CFX_WideString& wsPath) override; + CFX_RetainPtr CreateFileStream(uint32_t dwModes) override; + + bool Init(const CFX_WideStringC& wsPath); + + private: + CFX_CRTFileAccess(); + ~CFX_CRTFileAccess() override; + + CFX_WideString m_path; +}; + +CFX_CRTFileAccess::CFX_CRTFileAccess() {} + +CFX_CRTFileAccess::~CFX_CRTFileAccess() {} + +void CFX_CRTFileAccess::GetPath(CFX_WideString& wsPath) { + wsPath = m_path; +} + +CFX_RetainPtr CFX_CRTFileAccess::CreateFileStream( + uint32_t dwModes) { + return IFX_SeekableStream::CreateFromFilename(m_path.c_str(), dwModes); +} + +bool CFX_CRTFileAccess::Init(const CFX_WideStringC& wsPath) { + m_path = wsPath; + return true; +} + +#endif // PDF_ENABLE_XFA + +class CFX_CRTFileStream final : public IFX_SeekableStream { + public: + template + friend CFX_RetainPtr pdfium::MakeRetain(Args&&... args); + + // IFX_SeekableStream: + FX_FILESIZE GetSize() override; + bool IsEOF() override; + FX_FILESIZE GetPosition() override; + bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; + size_t ReadBlock(void* buffer, size_t size) override; + bool WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) override; + bool Flush() override; + + private: + explicit CFX_CRTFileStream(std::unique_ptr pFA); + ~CFX_CRTFileStream() override; + + std::unique_ptr m_pFile; +}; + +CFX_CRTFileStream::CFX_CRTFileStream(std::unique_ptr pFA) + : m_pFile(std::move(pFA)) {} + +CFX_CRTFileStream::~CFX_CRTFileStream() {} + +FX_FILESIZE CFX_CRTFileStream::GetSize() { + return m_pFile->GetSize(); +} + +bool CFX_CRTFileStream::IsEOF() { + return GetPosition() >= GetSize(); +} + +FX_FILESIZE CFX_CRTFileStream::GetPosition() { + return m_pFile->GetPosition(); +} + +bool CFX_CRTFileStream::ReadBlock(void* buffer, + FX_FILESIZE offset, + size_t size) { + return m_pFile->ReadPos(buffer, size, offset) > 0; +} + +size_t CFX_CRTFileStream::ReadBlock(void* buffer, size_t size) { + return m_pFile->Read(buffer, size); +} + +bool CFX_CRTFileStream::WriteBlock(const void* buffer, + FX_FILESIZE offset, + size_t size) { + return !!m_pFile->WritePos(buffer, size, offset); +} + +bool CFX_CRTFileStream::Flush() { + return m_pFile->Flush(); +} + +#define FX_MEMSTREAM_BlockSize (64 * 1024) +#define FX_MEMSTREAM_Consecutive 0x01 +#define FX_MEMSTREAM_TakeOver 0x02 + +class CFX_MemoryStream final : public IFX_MemoryStream { + public: + template + friend CFX_RetainPtr pdfium::MakeRetain(Args&&... args); + + // IFX_MemoryStream + FX_FILESIZE GetSize() override; + bool IsEOF() override; + FX_FILESIZE GetPosition() override; + bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; + size_t ReadBlock(void* buffer, size_t size) override; + bool WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) override; + bool Flush() override; + bool IsConsecutive() const override; + void EstimateSize(size_t nInitSize, size_t nGrowSize) override; + uint8_t* GetBuffer() const override; + void AttachBuffer(uint8_t* pBuffer, + size_t nSize, + bool bTakeOver = false) override; + void DetachBuffer() override; + + private: + explicit CFX_MemoryStream(bool bConsecutive); + CFX_MemoryStream(uint8_t* pBuffer, size_t nSize, bool bTakeOver); + ~CFX_MemoryStream() override; + + bool ExpandBlocks(size_t size); + + CFX_ArrayTemplate m_Blocks; + size_t m_nTotalSize; + size_t m_nCurSize; + size_t m_nCurPos; + size_t m_nGrowSize; + uint32_t m_dwFlags; +}; + +CFX_MemoryStream::CFX_MemoryStream(bool bConsecutive) + : m_nTotalSize(0), + m_nCurSize(0), + m_nCurPos(0), + m_nGrowSize(FX_MEMSTREAM_BlockSize) { + m_dwFlags = + FX_MEMSTREAM_TakeOver | (bConsecutive ? FX_MEMSTREAM_Consecutive : 0); +} + +CFX_MemoryStream::CFX_MemoryStream(uint8_t* pBuffer, + size_t nSize, + bool bTakeOver) + : m_nTotalSize(nSize), + m_nCurSize(nSize), + m_nCurPos(0), + m_nGrowSize(FX_MEMSTREAM_BlockSize) { + m_Blocks.Add(pBuffer); + m_dwFlags = + FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0); +} + +CFX_MemoryStream::~CFX_MemoryStream() { + if (m_dwFlags & FX_MEMSTREAM_TakeOver) { + for (int32_t i = 0; i < m_Blocks.GetSize(); i++) { + FX_Free(m_Blocks[i]); + } + } + m_Blocks.RemoveAll(); +} + +FX_FILESIZE CFX_MemoryStream::GetSize() { + return (FX_FILESIZE)m_nCurSize; +} + +bool CFX_MemoryStream::IsEOF() { + return m_nCurPos >= (size_t)GetSize(); +} + +FX_FILESIZE CFX_MemoryStream::GetPosition() { + return (FX_FILESIZE)m_nCurPos; +} + +bool CFX_MemoryStream::ReadBlock(void* buffer, + FX_FILESIZE offset, + size_t size) { + if (!buffer || !size || offset < 0) + return false; + + FX_SAFE_SIZE_T newPos = size; + newPos += offset; + if (!newPos.IsValid() || newPos.ValueOrDefault(0) == 0 || + newPos.ValueOrDie() > m_nCurSize) { + return false; + } + + m_nCurPos = newPos.ValueOrDie(); + if (m_dwFlags & FX_MEMSTREAM_Consecutive) { + FXSYS_memcpy(buffer, m_Blocks[0] + (size_t)offset, size); + return true; + } + size_t nStartBlock = (size_t)offset / m_nGrowSize; + offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize); + while (size) { + size_t nRead = m_nGrowSize - (size_t)offset; + if (nRead > size) { + nRead = size; + } + FXSYS_memcpy(buffer, m_Blocks[(int)nStartBlock] + (size_t)offset, nRead); + buffer = ((uint8_t*)buffer) + nRead; + size -= nRead; + nStartBlock++; + offset = 0; + } + return true; +} + +size_t CFX_MemoryStream::ReadBlock(void* buffer, size_t size) { + if (m_nCurPos >= m_nCurSize) { + return 0; + } + size_t nRead = std::min(size, m_nCurSize - m_nCurPos); + if (!ReadBlock(buffer, (int32_t)m_nCurPos, nRead)) { + return 0; + } + return nRead; +} + +bool CFX_MemoryStream::WriteBlock(const void* buffer, + FX_FILESIZE offset, + size_t size) { + if (!buffer || !size) + return false; + + if (m_dwFlags & FX_MEMSTREAM_Consecutive) { + FX_SAFE_SIZE_T newPos = size; + newPos += offset; + if (!newPos.IsValid()) + return false; + + m_nCurPos = newPos.ValueOrDie(); + if (m_nCurPos > m_nTotalSize) { + m_nTotalSize = (m_nCurPos + m_nGrowSize - 1) / m_nGrowSize * m_nGrowSize; + if (m_Blocks.GetSize() < 1) { + uint8_t* block = FX_Alloc(uint8_t, m_nTotalSize); + m_Blocks.Add(block); + } else { + m_Blocks[0] = FX_Realloc(uint8_t, m_Blocks[0], m_nTotalSize); + } + if (!m_Blocks[0]) { + m_Blocks.RemoveAll(); + return false; + } + } + FXSYS_memcpy(m_Blocks[0] + (size_t)offset, buffer, size); + if (m_nCurSize < m_nCurPos) { + m_nCurSize = m_nCurPos; + } + return true; + } + + FX_SAFE_SIZE_T newPos = size; + newPos += offset; + if (!newPos.IsValid()) { + return false; + } + + if (!ExpandBlocks(newPos.ValueOrDie())) { + return false; + } + m_nCurPos = newPos.ValueOrDie(); + size_t nStartBlock = (size_t)offset / m_nGrowSize; + offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize); + while (size) { + size_t nWrite = m_nGrowSize - (size_t)offset; + if (nWrite > size) { + nWrite = size; + } + FXSYS_memcpy(m_Blocks[(int)nStartBlock] + (size_t)offset, buffer, nWrite); + buffer = ((uint8_t*)buffer) + nWrite; + size -= nWrite; + nStartBlock++; + offset = 0; + } + return true; +} + +bool CFX_MemoryStream::Flush() { + return true; +} + +bool CFX_MemoryStream::IsConsecutive() const { + return !!(m_dwFlags & FX_MEMSTREAM_Consecutive); +} + +void CFX_MemoryStream::EstimateSize(size_t nInitSize, size_t nGrowSize) { + if (m_dwFlags & FX_MEMSTREAM_Consecutive) { + if (m_Blocks.GetSize() < 1) { + uint8_t* pBlock = + FX_Alloc(uint8_t, std::max(nInitSize, static_cast(4096))); + m_Blocks.Add(pBlock); + } + m_nGrowSize = std::max(nGrowSize, static_cast(4096)); + } else if (m_Blocks.GetSize() < 1) { + m_nGrowSize = std::max(nGrowSize, static_cast(4096)); + } +} + +uint8_t* CFX_MemoryStream::GetBuffer() const { + return m_Blocks.GetSize() ? m_Blocks[0] : nullptr; +} + +void CFX_MemoryStream::AttachBuffer(uint8_t* pBuffer, + size_t nSize, + bool bTakeOver) { + if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) + return; + + m_Blocks.RemoveAll(); + m_Blocks.Add(pBuffer); + m_nTotalSize = m_nCurSize = nSize; + m_nCurPos = 0; + m_dwFlags = + FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0); +} + +void CFX_MemoryStream::DetachBuffer() { + if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) { + return; + } + m_Blocks.RemoveAll(); + m_nTotalSize = m_nCurSize = m_nCurPos = 0; + m_dwFlags = FX_MEMSTREAM_TakeOver; +} + +bool CFX_MemoryStream::ExpandBlocks(size_t size) { + if (m_nCurSize < size) { + m_nCurSize = size; + } + if (size <= m_nTotalSize) { + return true; + } + int32_t iCount = m_Blocks.GetSize(); + size = (size - m_nTotalSize + m_nGrowSize - 1) / m_nGrowSize; + m_Blocks.SetSize(m_Blocks.GetSize() + (int32_t)size); + while (size--) { + uint8_t* pBlock = FX_Alloc(uint8_t, m_nGrowSize); + m_Blocks.SetAt(iCount++, pBlock); + m_nTotalSize += m_nGrowSize; + } + return true; +} + +} // namespace + +#ifdef PDF_ENABLE_XFA +CFX_RetainPtr IFX_FileAccess::CreateDefault( + const CFX_WideStringC& wsPath) { + if (wsPath.GetLength() == 0) + return nullptr; + + auto pFA = pdfium::MakeRetain(); + pFA->Init(wsPath); + return pFA; +} +#endif // PDF_ENABLE_XFA + +// static +CFX_RetainPtr IFX_SeekableStream::CreateFromFilename( + const FX_CHAR* filename, + uint32_t dwModes) { + std::unique_ptr pFA(IFXCRT_FileAccess::Create()); + if (!pFA->Open(filename, dwModes)) + return nullptr; + return pdfium::MakeRetain(std::move(pFA)); +} + +// static +CFX_RetainPtr IFX_SeekableStream::CreateFromFilename( + const FX_WCHAR* filename, + uint32_t dwModes) { + std::unique_ptr pFA(IFXCRT_FileAccess::Create()); + if (!pFA->Open(filename, dwModes)) + return nullptr; + return pdfium::MakeRetain(std::move(pFA)); +} + +// static +CFX_RetainPtr +IFX_SeekableReadStream::CreateFromFilename(const FX_CHAR* filename) { + return IFX_SeekableStream::CreateFromFilename(filename, FX_FILEMODE_ReadOnly); +} + +// static +CFX_RetainPtr IFX_MemoryStream::Create(uint8_t* pBuffer, + size_t dwSize, + bool bTakeOver) { + return pdfium::MakeRetain(pBuffer, dwSize, bTakeOver); +} + +// static +CFX_RetainPtr IFX_MemoryStream::Create(bool bConsecutive) { + return pdfium::MakeRetain(bConsecutive); +} + +FX_FLOAT FXSYS_tan(FX_FLOAT a) { + return (FX_FLOAT)tan(a); +} +FX_FLOAT FXSYS_logb(FX_FLOAT b, FX_FLOAT x) { + return FXSYS_log(x) / FXSYS_log(b); +} +FX_FLOAT FXSYS_strtof(const FX_CHAR* pcsStr, + int32_t iLength, + int32_t* pUsedLen) { + ASSERT(pcsStr); + if (iLength < 0) { + iLength = (int32_t)FXSYS_strlen(pcsStr); + } + CFX_WideString ws = + CFX_WideString::FromLocal(CFX_ByteStringC(pcsStr, iLength)); + return FXSYS_wcstof(ws.c_str(), iLength, pUsedLen); +} +FX_FLOAT FXSYS_wcstof(const FX_WCHAR* pwsStr, + int32_t iLength, + int32_t* pUsedLen) { + ASSERT(pwsStr); + if (iLength < 0) { + iLength = (int32_t)FXSYS_wcslen(pwsStr); + } + if (iLength == 0) { + return 0.0f; + } + int32_t iUsedLen = 0; + bool bNegtive = false; + switch (pwsStr[iUsedLen]) { + case '-': + bNegtive = true; + case '+': + iUsedLen++; + break; + } + FX_FLOAT fValue = 0.0f; + while (iUsedLen < iLength) { + FX_WCHAR wch = pwsStr[iUsedLen]; + if (wch >= L'0' && wch <= L'9') { + fValue = fValue * 10.0f + (wch - L'0'); + } else { + break; + } + iUsedLen++; + } + if (iUsedLen < iLength && pwsStr[iUsedLen] == L'.') { + FX_FLOAT fPrecise = 0.1f; + while (++iUsedLen < iLength) { + FX_WCHAR wch = pwsStr[iUsedLen]; + if (wch >= L'0' && wch <= L'9') { + fValue += (wch - L'0') * fPrecise; + fPrecise *= 0.1f; + } else { + break; + } + } + } + if (pUsedLen) { + *pUsedLen = iUsedLen; + } + return bNegtive ? -fValue : fValue; +} +FX_WCHAR* FXSYS_wcsncpy(FX_WCHAR* dstStr, + const FX_WCHAR* srcStr, + size_t count) { + ASSERT(dstStr && srcStr && count > 0); + for (size_t i = 0; i < count; ++i) + if ((dstStr[i] = srcStr[i]) == L'\0') { + break; + } + return dstStr; +} +int32_t FXSYS_wcsnicmp(const FX_WCHAR* s1, const FX_WCHAR* s2, size_t count) { + ASSERT(s1 && s2 && count > 0); + FX_WCHAR wch1 = 0, wch2 = 0; + while (count-- > 0) { + wch1 = (FX_WCHAR)FXSYS_tolower(*s1++); + wch2 = (FX_WCHAR)FXSYS_tolower(*s2++); + if (wch1 != wch2) { + break; + } + } + return wch1 - wch2; +} +int32_t FXSYS_strnicmp(const FX_CHAR* s1, const FX_CHAR* s2, size_t count) { + ASSERT(s1 && s2 && count > 0); + FX_CHAR ch1 = 0, ch2 = 0; + while (count-- > 0) { + ch1 = (FX_CHAR)FXSYS_tolower(*s1++); + ch2 = (FX_CHAR)FXSYS_tolower(*s2++); + if (ch1 != ch2) { + break; + } + } + return ch1 - ch2; +} + +uint32_t FX_HashCode_GetA(const CFX_ByteStringC& str, bool bIgnoreCase) { + uint32_t dwHashCode = 0; + if (bIgnoreCase) { + for (FX_STRSIZE i = 0; i < str.GetLength(); ++i) + dwHashCode = 31 * dwHashCode + FXSYS_tolower(str.CharAt(i)); + } else { + for (FX_STRSIZE i = 0; i < str.GetLength(); ++i) + dwHashCode = 31 * dwHashCode + str.CharAt(i); + } + return dwHashCode; +} + +uint32_t FX_HashCode_GetW(const CFX_WideStringC& str, bool bIgnoreCase) { + uint32_t dwHashCode = 0; + if (bIgnoreCase) { + for (FX_STRSIZE i = 0; i < str.GetLength(); ++i) + dwHashCode = 1313 * dwHashCode + FXSYS_tolower(str.CharAt(i)); + } else { + for (FX_STRSIZE i = 0; i < str.GetLength(); ++i) + dwHashCode = 1313 * dwHashCode + str.CharAt(i); + } + return dwHashCode; +} + +void* FX_Random_MT_Start(uint32_t dwSeed) { + FX_MTRANDOMCONTEXT* pContext = FX_Alloc(FX_MTRANDOMCONTEXT, 1); + pContext->mt[0] = dwSeed; + uint32_t& i = pContext->mti; + uint32_t* pBuf = pContext->mt; + for (i = 1; i < MT_N; i++) { + pBuf[i] = (1812433253UL * (pBuf[i - 1] ^ (pBuf[i - 1] >> 30)) + i); + } + pContext->bHaveSeed = true; + return pContext; +} +uint32_t FX_Random_MT_Generate(void* pContext) { + ASSERT(pContext); + FX_MTRANDOMCONTEXT* pMTC = static_cast(pContext); + uint32_t v; + static uint32_t mag[2] = {0, MT_Matrix_A}; + uint32_t& mti = pMTC->mti; + uint32_t* pBuf = pMTC->mt; + if ((int)mti < 0 || mti >= MT_N) { + if (mti > MT_N && !pMTC->bHaveSeed) { + return 0; + } + uint32_t kk; + for (kk = 0; kk < MT_N - MT_M; kk++) { + v = (pBuf[kk] & MT_Upper_Mask) | (pBuf[kk + 1] & MT_Lower_Mask); + pBuf[kk] = pBuf[kk + MT_M] ^ (v >> 1) ^ mag[v & 1]; + } + for (; kk < MT_N - 1; kk++) { + v = (pBuf[kk] & MT_Upper_Mask) | (pBuf[kk + 1] & MT_Lower_Mask); + pBuf[kk] = pBuf[kk + (MT_M - MT_N)] ^ (v >> 1) ^ mag[v & 1]; + } + v = (pBuf[MT_N - 1] & MT_Upper_Mask) | (pBuf[0] & MT_Lower_Mask); + pBuf[MT_N - 1] = pBuf[MT_M - 1] ^ (v >> 1) ^ mag[v & 1]; + mti = 0; + } + v = pBuf[mti++]; + v ^= (v >> 11); + v ^= (v << 7) & 0x9d2c5680UL; + v ^= (v << 15) & 0xefc60000UL; + v ^= (v >> 18); + return v; +} +void FX_Random_MT_Close(void* pContext) { + ASSERT(pContext); + FX_Free(pContext); +} +void FX_Random_GenerateMT(uint32_t* pBuffer, int32_t iCount) { + uint32_t dwSeed; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + if (!FX_GenerateCryptoRandom(&dwSeed, 1)) { + FX_Random_GenerateBase(&dwSeed, 1); + } +#else + FX_Random_GenerateBase(&dwSeed, 1); +#endif + void* pContext = FX_Random_MT_Start(dwSeed); + while (iCount-- > 0) { + *pBuffer++ = FX_Random_MT_Generate(pContext); + } + FX_Random_MT_Close(pContext); +} +void FX_Random_GenerateBase(uint32_t* pBuffer, int32_t iCount) { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + SYSTEMTIME st1, st2; + ::GetSystemTime(&st1); + do { + ::GetSystemTime(&st2); + } while (FXSYS_memcmp(&st1, &st2, sizeof(SYSTEMTIME)) == 0); + uint32_t dwHash1 = + FX_HashCode_GetA(CFX_ByteStringC((uint8_t*)&st1, sizeof(st1)), true); + uint32_t dwHash2 = + FX_HashCode_GetA(CFX_ByteStringC((uint8_t*)&st2, sizeof(st2)), true); + ::srand((dwHash1 << 16) | (uint32_t)dwHash2); +#else + time_t tmLast = time(nullptr); + time_t tmCur; + while ((tmCur = time(nullptr)) == tmLast) { + continue; + } + + ::srand((tmCur << 16) | (tmLast & 0xFFFF)); +#endif + while (iCount-- > 0) { + *pBuffer++ = (uint32_t)((::rand() << 16) | (::rand() & 0xFFFF)); + } +} +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +bool FX_GenerateCryptoRandom(uint32_t* pBuffer, int32_t iCount) { + HCRYPTPROV hCP = 0; + if (!::CryptAcquireContext(&hCP, nullptr, nullptr, PROV_RSA_FULL, 0) || + !hCP) { + return false; + } + ::CryptGenRandom(hCP, iCount * sizeof(uint32_t), (uint8_t*)pBuffer); + ::CryptReleaseContext(hCP, 0); + return true; +} +#endif +void FX_Random_GenerateCrypto(uint32_t* pBuffer, int32_t iCount) { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + FX_GenerateCryptoRandom(pBuffer, iCount); +#else + FX_Random_GenerateBase(pBuffer, iCount); +#endif +} + +#ifdef PDF_ENABLE_XFA +static const FX_CHAR gs_FX_pHexChars[] = "0123456789ABCDEF"; +void FX_GUID_CreateV4(FX_GUID* pGUID) { + FX_Random_GenerateMT((uint32_t*)pGUID, 4); + uint8_t& b = ((uint8_t*)pGUID)[6]; + b = (b & 0x0F) | 0x40; +} +void FX_GUID_ToString(const FX_GUID* pGUID, + CFX_ByteString& bsStr, + bool bSeparator) { + FX_CHAR* pBuf = bsStr.GetBuffer(40); + uint8_t b; + for (int32_t i = 0; i < 16; i++) { + b = ((const uint8_t*)pGUID)[i]; + *pBuf++ = gs_FX_pHexChars[b >> 4]; + *pBuf++ = gs_FX_pHexChars[b & 0x0F]; + if (bSeparator && (i == 3 || i == 5 || i == 7 || i == 9)) { + *pBuf++ = L'-'; + } + } + bsStr.ReleaseBuffer(bSeparator ? 36 : 32); +} +#endif // PDF_ENABLE_XFA diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_extension_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_extension_unittest.cpp new file mode 100644 index 000000000000..3739a3db8c65 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_extension_unittest.cpp @@ -0,0 +1,42 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "testing/gtest/include/gtest/gtest.h" + +#include "core/fxcrt/fx_ext.h" + +TEST(fxcrt, FXSYS_toHexDigit) { + EXPECT_EQ(10, FXSYS_toHexDigit('a')); + EXPECT_EQ(10, FXSYS_toHexDigit('A')); + EXPECT_EQ(7, FXSYS_toHexDigit('7')); + EXPECT_EQ(0, FXSYS_toHexDigit('i')); +} + +TEST(fxcrt, FXSYS_toDecimalDigit) { + EXPECT_EQ(7, FXSYS_toDecimalDigit('7')); + EXPECT_EQ(0, FXSYS_toDecimalDigit('a')); + EXPECT_EQ(7, FXSYS_toDecimalDigit(L'7')); + EXPECT_EQ(0, FXSYS_toDecimalDigit(L'a')); +} + +TEST(fxcrt, FXSYS_isDecimalDigit) { + EXPECT_TRUE(FXSYS_isDecimalDigit('7')); + EXPECT_TRUE(FXSYS_isDecimalDigit(L'7')); + EXPECT_FALSE(FXSYS_isDecimalDigit('a')); + EXPECT_FALSE(FXSYS_isDecimalDigit(L'a')); +} + +TEST(fxcrt, FX_HashCode_Ascii) { + EXPECT_EQ(0u, FX_HashCode_GetA("", false)); + EXPECT_EQ(65u, FX_HashCode_GetA("A", false)); + EXPECT_EQ(97u, FX_HashCode_GetA("A", true)); + EXPECT_EQ(31 * 65u + 66u, FX_HashCode_GetA("AB", false)); +} + +TEST(fxcrt, FX_HashCode_Wide) { + EXPECT_EQ(0u, FX_HashCode_GetW(L"", false)); + EXPECT_EQ(65u, FX_HashCode_GetW(L"A", false)); + EXPECT_EQ(97u, FX_HashCode_GetW(L"A", true)); + EXPECT_EQ(1313 * 65u + 66u, FX_HashCode_GetW(L"AB", false)); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_memory.h b/modules/pdfium/pdfium/core/fxcrt/fx_memory.h new file mode 100644 index 000000000000..0ad28ce89611 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_memory.h @@ -0,0 +1,106 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FX_MEMORY_H_ +#define CORE_FXCRT_FX_MEMORY_H_ + +#include "core/fxcrt/fx_system.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// For external C libraries to malloc through PDFium. These may return nullptr. +void* FXMEM_DefaultAlloc(size_t byte_size, int flags); +void* FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags); +void FXMEM_DefaultFree(void* pointer, int flags); + +#ifdef __cplusplus +} // extern "C" + +#include +#include +#include +#include + +NEVER_INLINE void FX_OutOfMemoryTerminate(); + +inline void* FX_SafeRealloc(void* ptr, size_t num_members, size_t member_size) { + if (num_members < std::numeric_limits::max() / member_size) { + return realloc(ptr, num_members * member_size); + } + return nullptr; +} + +inline void* FX_AllocOrDie(size_t num_members, size_t member_size) { + // TODO(tsepez): See if we can avoid the implicit memset(0). + if (void* result = calloc(num_members, member_size)) { + return result; + } + FX_OutOfMemoryTerminate(); // Never returns. + return nullptr; // Suppress compiler warning. +} + +inline void* FX_AllocOrDie2D(size_t w, size_t h, size_t member_size) { + if (w < std::numeric_limits::max() / h) { + return FX_AllocOrDie(w * h, member_size); + } + FX_OutOfMemoryTerminate(); // Never returns. + return nullptr; // Suppress compiler warning. +} + +inline void* FX_ReallocOrDie(void* ptr, + size_t num_members, + size_t member_size) { + if (void* result = FX_SafeRealloc(ptr, num_members, member_size)) { + return result; + } + FX_OutOfMemoryTerminate(); // Never returns. + return nullptr; // Suppress compiler warning. +} + +// Never returns nullptr. +#define FX_Alloc(type, size) (type*)FX_AllocOrDie(size, sizeof(type)) +#define FX_Alloc2D(type, w, h) (type*)FX_AllocOrDie2D(w, h, sizeof(type)) +#define FX_Realloc(type, ptr, size) \ + (type*)FX_ReallocOrDie(ptr, size, sizeof(type)) + +// May return nullptr. +#define FX_TryAlloc(type, size) (type*)calloc(size, sizeof(type)) +#define FX_TryRealloc(type, ptr, size) \ + (type*)FX_SafeRealloc(ptr, size, sizeof(type)) + +#define FX_Free(ptr) free(ptr) + +// The FX_ArraySize(arr) macro returns the # of elements in an array arr. +// The expression is a compile-time constant, and therefore can be +// used in defining new arrays, for example. If you use FX_ArraySize on +// a pointer by mistake, you will get a compile-time error. +// +// One caveat is that FX_ArraySize() doesn't accept any array of an +// anonymous type or a type defined inside a function. +#define FX_ArraySize(array) (sizeof(ArraySizeHelper(array))) + +// This template function declaration is used in defining FX_ArraySize. +// Note that the function doesn't need an implementation, as we only +// use its type. +template +char (&ArraySizeHelper(T (&array)[N]))[N]; + +// Used with std::unique_ptr to FX_Free raw memory. +struct FxFreeDeleter { + inline void operator()(void* ptr) const { FX_Free(ptr); } +}; + +// Used with std::unique_ptr to Release() objects that can't be deleted. +template +struct ReleaseDeleter { + inline void operator()(T* ptr) const { ptr->Release(); } +}; + +#endif // __cplusplus + +#endif // CORE_FXCRT_FX_MEMORY_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_safe_types.h b/modules/pdfium/pdfium/core/fxcrt/fx_safe_types.h new file mode 100644 index 000000000000..66dbc576811a --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_safe_types.h @@ -0,0 +1,20 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CORE_FXCRT_FX_SAFE_TYPES_H_ +#define CORE_FXCRT_FX_SAFE_TYPES_H_ + +#include // For size_t. + +#include "core/fxcrt/fx_stream.h" // for FX_FILESIZE. +#include "core/fxcrt/fx_system.h" +#include "third_party/base/numerics/safe_math.h" + +typedef pdfium::base::CheckedNumeric FX_SAFE_UINT32; +typedef pdfium::base::CheckedNumeric FX_SAFE_INT32; +typedef pdfium::base::CheckedNumeric FX_SAFE_SIZE_T; +typedef pdfium::base::CheckedNumeric FX_SAFE_FILESIZE; +typedef pdfium::base::CheckedNumeric FX_SAFE_STRSIZE; + +#endif // CORE_FXCRT_FX_SAFE_TYPES_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_stream.h b/modules/pdfium/pdfium/core/fxcrt/fx_stream.h new file mode 100644 index 000000000000..2f4b5ad28055 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_stream.h @@ -0,0 +1,178 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FX_STREAM_H_ +#define CORE_FXCRT_FX_STREAM_H_ + +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +#include + +class CFindFileDataA; +typedef CFindFileDataA FX_FileHandle; +#define FX_FILESIZE int32_t + +#else + +#include +#include +#include +#include +#include + +#ifndef O_BINARY +#define O_BINARY 0 +#endif // O_BINARY + +#ifndef O_LARGEFILE +#define O_LARGEFILE 0 +#endif // O_LARGEFILE + +typedef DIR FX_FileHandle; +#define FX_FILESIZE off_t +#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + +FX_FileHandle* FX_OpenFolder(const FX_CHAR* path); +bool FX_GetNextFile(FX_FileHandle* handle, + CFX_ByteString* filename, + bool* bFolder); +void FX_CloseFolder(FX_FileHandle* handle); +FX_WCHAR FX_GetFolderSeparator(); + +#define FX_FILEMODE_Write 0 +#define FX_FILEMODE_ReadOnly 1 +#define FX_FILEMODE_Truncate 2 + +class IFX_WriteStream : virtual public CFX_Retainable { + public: + virtual bool WriteBlock(const void* pData, size_t size) = 0; +}; + +class IFX_ReadStream : virtual public CFX_Retainable { + public: + virtual bool IsEOF() = 0; + virtual FX_FILESIZE GetPosition() = 0; + virtual size_t ReadBlock(void* buffer, size_t size) = 0; +}; + +class IFX_SeekableWriteStream : public IFX_WriteStream { + public: + // IFX_WriteStream: + bool WriteBlock(const void* pData, size_t size) override; + + virtual FX_FILESIZE GetSize() = 0; + virtual bool Flush() = 0; + virtual bool WriteBlock(const void* pData, + FX_FILESIZE offset, + size_t size) = 0; +}; + +class IFX_SeekableReadStream : public IFX_ReadStream { + public: + static CFX_RetainPtr CreateFromFilename( + const FX_CHAR* filename); + + // IFX_ReadStream: + bool IsEOF() override; + FX_FILESIZE GetPosition() override; + size_t ReadBlock(void* buffer, size_t size) override; + + virtual bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) = 0; + virtual FX_FILESIZE GetSize() = 0; +}; + +class IFX_SeekableStream : public IFX_SeekableReadStream, + public IFX_SeekableWriteStream { + public: + static CFX_RetainPtr CreateFromFilename( + const FX_CHAR* filename, + uint32_t dwModes); + + static CFX_RetainPtr CreateFromFilename( + const FX_WCHAR* filename, + uint32_t dwModes); + + // IFX_SeekableReadStream: + bool IsEOF() override = 0; + FX_FILESIZE GetPosition() override = 0; + size_t ReadBlock(void* buffer, size_t size) override = 0; + bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override = 0; + FX_FILESIZE GetSize() override = 0; + + // IFX_SeekableWriteStream: + bool WriteBlock(const void* buffer, + FX_FILESIZE offset, + size_t size) override = 0; + bool WriteBlock(const void* buffer, size_t size) override; + bool Flush() override = 0; +}; + +class IFX_MemoryStream : public IFX_SeekableStream { + public: + static CFX_RetainPtr Create(uint8_t* pBuffer, + size_t nSize, + bool bTakeOver = false); + static CFX_RetainPtr Create(bool bConsecutive = false); + + virtual bool IsConsecutive() const = 0; + virtual void EstimateSize(size_t nInitSize, size_t nGrowSize) = 0; + virtual uint8_t* GetBuffer() const = 0; + virtual void AttachBuffer(uint8_t* pBuffer, + size_t nSize, + bool bTakeOver = false) = 0; + virtual void DetachBuffer() = 0; +}; + +class IFX_BufferedReadStream : public IFX_ReadStream { + public: + // IFX_ReadStream: + bool IsEOF() override = 0; + FX_FILESIZE GetPosition() override = 0; + size_t ReadBlock(void* buffer, size_t size) override = 0; + + virtual bool ReadNextBlock(bool bRestart = false) = 0; + virtual const uint8_t* GetBlockBuffer() = 0; + virtual size_t GetBlockSize() = 0; + virtual FX_FILESIZE GetBlockOffset() = 0; +}; + +#ifdef PDF_ENABLE_XFA +class IFX_FileAccess : public CFX_Retainable { + public: + static CFX_RetainPtr CreateDefault( + const CFX_WideStringC& wsPath); + + virtual void GetPath(CFX_WideString& wsPath) = 0; + virtual CFX_RetainPtr CreateFileStream( + uint32_t dwModes) = 0; +}; +#endif // PDF_ENABLE_XFA + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +class CFindFileData { + public: + virtual ~CFindFileData() {} + HANDLE m_Handle; + bool m_bEnd; +}; + +class CFindFileDataA : public CFindFileData { + public: + ~CFindFileDataA() override {} + WIN32_FIND_DATAA m_FindData; +}; + +class CFindFileDataW : public CFindFileData { + public: + ~CFindFileDataW() override {} + WIN32_FIND_DATAW m_FindData; +}; +#endif + +#endif // CORE_FXCRT_FX_STREAM_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_string.h b/modules/pdfium/pdfium/core/fxcrt/fx_string.h new file mode 100644 index 000000000000..cd93f272750d --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_string.h @@ -0,0 +1,459 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FX_STRING_H_ +#define CORE_FXCRT_FX_STRING_H_ + +#include // For intptr_t. + +#include +#include + +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/cfx_string_c_template.h" +#include "core/fxcrt/cfx_string_data_template.h" +#include "core/fxcrt/fx_memory.h" +#include "core/fxcrt/fx_system.h" + +class CFX_ByteString; +class CFX_WideString; + +using CFX_ByteStringC = CFX_StringCTemplate; +using CFX_WideStringC = CFX_StringCTemplate; + +#define FXBSTR_ID(c1, c2, c3, c4) \ + (((uint32_t)c1 << 24) | ((uint32_t)c2 << 16) | ((uint32_t)c3 << 8) | \ + ((uint32_t)c4)) + +// A mutable string with shared buffers using copy-on-write semantics that +// avoids the cost of std::string's iterator stability guarantees. +class CFX_ByteString { + public: + using CharType = FX_CHAR; + + CFX_ByteString(); + CFX_ByteString(const CFX_ByteString& other); + CFX_ByteString(CFX_ByteString&& other); + + // Deliberately implicit to avoid calling on every string literal. + // NOLINTNEXTLINE(runtime/explicit) + CFX_ByteString(char ch); + // NOLINTNEXTLINE(runtime/explicit) + CFX_ByteString(const FX_CHAR* ptr); + + CFX_ByteString(const FX_CHAR* ptr, FX_STRSIZE len); + CFX_ByteString(const uint8_t* ptr, FX_STRSIZE len); + + explicit CFX_ByteString(const CFX_ByteStringC& bstrc); + CFX_ByteString(const CFX_ByteStringC& bstrc1, const CFX_ByteStringC& bstrc2); + + ~CFX_ByteString(); + + void clear() { m_pData.Reset(); } + + static CFX_ByteString FromUnicode(const FX_WCHAR* ptr, FX_STRSIZE len = -1); + static CFX_ByteString FromUnicode(const CFX_WideString& str); + + // Explicit conversion to C-style string. + // Note: Any subsequent modification of |this| will invalidate the result. + const FX_CHAR* c_str() const { return m_pData ? m_pData->m_String : ""; } + + // Explicit conversion to uint8_t*. + // Note: Any subsequent modification of |this| will invalidate the result. + const uint8_t* raw_str() const { + return m_pData ? reinterpret_cast(m_pData->m_String) + : nullptr; + } + + // Explicit conversion to CFX_ByteStringC. + // Note: Any subsequent modification of |this| will invalidate the result. + CFX_ByteStringC AsStringC() const { + return CFX_ByteStringC(raw_str(), GetLength()); + } + + FX_STRSIZE GetLength() const { return m_pData ? m_pData->m_nDataLength : 0; } + bool IsEmpty() const { return !GetLength(); } + + int Compare(const CFX_ByteStringC& str) const; + bool EqualNoCase(const CFX_ByteStringC& str) const; + + bool operator==(const char* ptr) const; + bool operator==(const CFX_ByteStringC& str) const; + bool operator==(const CFX_ByteString& other) const; + + bool operator!=(const char* ptr) const { return !(*this == ptr); } + bool operator!=(const CFX_ByteStringC& str) const { return !(*this == str); } + bool operator!=(const CFX_ByteString& other) const { + return !(*this == other); + } + + bool operator<(const CFX_ByteString& str) const; + + const CFX_ByteString& operator=(const FX_CHAR* str); + const CFX_ByteString& operator=(const CFX_ByteStringC& bstrc); + const CFX_ByteString& operator=(const CFX_ByteString& stringSrc); + + const CFX_ByteString& operator+=(FX_CHAR ch); + const CFX_ByteString& operator+=(const FX_CHAR* str); + const CFX_ByteString& operator+=(const CFX_ByteString& str); + const CFX_ByteString& operator+=(const CFX_ByteStringC& bstrc); + + uint8_t GetAt(FX_STRSIZE nIndex) const { + return m_pData ? m_pData->m_String[nIndex] : 0; + } + + uint8_t operator[](FX_STRSIZE nIndex) const { + return m_pData ? m_pData->m_String[nIndex] : 0; + } + + void SetAt(FX_STRSIZE nIndex, FX_CHAR ch); + FX_STRSIZE Insert(FX_STRSIZE index, FX_CHAR ch); + FX_STRSIZE Delete(FX_STRSIZE index, FX_STRSIZE count = 1); + + void Format(const FX_CHAR* lpszFormat, ...); + void FormatV(const FX_CHAR* lpszFormat, va_list argList); + + void Reserve(FX_STRSIZE len); + FX_CHAR* GetBuffer(FX_STRSIZE len); + void ReleaseBuffer(FX_STRSIZE len = -1); + + CFX_ByteString Mid(FX_STRSIZE first) const; + CFX_ByteString Mid(FX_STRSIZE first, FX_STRSIZE count) const; + CFX_ByteString Left(FX_STRSIZE count) const; + CFX_ByteString Right(FX_STRSIZE count) const; + + FX_STRSIZE Find(const CFX_ByteStringC& lpszSub, FX_STRSIZE start = 0) const; + FX_STRSIZE Find(FX_CHAR ch, FX_STRSIZE start = 0) const; + FX_STRSIZE ReverseFind(FX_CHAR ch) const; + + void MakeLower(); + void MakeUpper(); + + void TrimRight(); + void TrimRight(FX_CHAR chTarget); + void TrimRight(const CFX_ByteStringC& lpszTargets); + + void TrimLeft(); + void TrimLeft(FX_CHAR chTarget); + void TrimLeft(const CFX_ByteStringC& lpszTargets); + + FX_STRSIZE Replace(const CFX_ByteStringC& lpszOld, + const CFX_ByteStringC& lpszNew); + + FX_STRSIZE Remove(FX_CHAR ch); + + CFX_WideString UTF8Decode() const; + + uint32_t GetID(FX_STRSIZE start_pos = 0) const; + +#define FXFORMAT_SIGNED 1 +#define FXFORMAT_HEX 2 +#define FXFORMAT_CAPITAL 4 + + static CFX_ByteString FormatInteger(int i, uint32_t flags = 0); + static CFX_ByteString FormatFloat(FX_FLOAT f, int precision = 0); + + protected: + using StringData = CFX_StringDataTemplate; + + void ReallocBeforeWrite(FX_STRSIZE nNewLen); + void AllocBeforeWrite(FX_STRSIZE nNewLen); + void AllocCopy(CFX_ByteString& dest, + FX_STRSIZE nCopyLen, + FX_STRSIZE nCopyIndex) const; + void AssignCopy(const FX_CHAR* pSrcData, FX_STRSIZE nSrcLen); + void Concat(const FX_CHAR* lpszSrcData, FX_STRSIZE nSrcLen); + + CFX_RetainPtr m_pData; + + friend class fxcrt_ByteStringConcat_Test; + friend class fxcrt_ByteStringPool_Test; +}; + +inline bool operator==(const char* lhs, const CFX_ByteString& rhs) { + return rhs == lhs; +} +inline bool operator==(const CFX_ByteStringC& lhs, const CFX_ByteString& rhs) { + return rhs == lhs; +} +inline bool operator!=(const char* lhs, const CFX_ByteString& rhs) { + return rhs != lhs; +} +inline bool operator!=(const CFX_ByteStringC& lhs, const CFX_ByteString& rhs) { + return rhs != lhs; +} + +inline CFX_ByteString operator+(const CFX_ByteStringC& str1, + const CFX_ByteStringC& str2) { + return CFX_ByteString(str1, str2); +} +inline CFX_ByteString operator+(const CFX_ByteStringC& str1, + const FX_CHAR* str2) { + return CFX_ByteString(str1, str2); +} +inline CFX_ByteString operator+(const FX_CHAR* str1, + const CFX_ByteStringC& str2) { + return CFX_ByteString(str1, str2); +} +inline CFX_ByteString operator+(const CFX_ByteStringC& str1, FX_CHAR ch) { + return CFX_ByteString(str1, CFX_ByteStringC(ch)); +} +inline CFX_ByteString operator+(FX_CHAR ch, const CFX_ByteStringC& str2) { + return CFX_ByteString(ch, str2); +} +inline CFX_ByteString operator+(const CFX_ByteString& str1, + const CFX_ByteString& str2) { + return CFX_ByteString(str1.AsStringC(), str2.AsStringC()); +} +inline CFX_ByteString operator+(const CFX_ByteString& str1, FX_CHAR ch) { + return CFX_ByteString(str1.AsStringC(), CFX_ByteStringC(ch)); +} +inline CFX_ByteString operator+(FX_CHAR ch, const CFX_ByteString& str2) { + return CFX_ByteString(ch, str2.AsStringC()); +} +inline CFX_ByteString operator+(const CFX_ByteString& str1, + const FX_CHAR* str2) { + return CFX_ByteString(str1.AsStringC(), str2); +} +inline CFX_ByteString operator+(const FX_CHAR* str1, + const CFX_ByteString& str2) { + return CFX_ByteString(str1, str2.AsStringC()); +} +inline CFX_ByteString operator+(const CFX_ByteString& str1, + const CFX_ByteStringC& str2) { + return CFX_ByteString(str1.AsStringC(), str2); +} +inline CFX_ByteString operator+(const CFX_ByteStringC& str1, + const CFX_ByteString& str2) { + return CFX_ByteString(str1, str2.AsStringC()); +} + +// A mutable string with shared buffers using copy-on-write semantics that +// avoids the cost of std::string's iterator stability guarantees. +class CFX_WideString { + public: + using CharType = FX_WCHAR; + + CFX_WideString(); + CFX_WideString(const CFX_WideString& other); + CFX_WideString(CFX_WideString&& other); + + // Deliberately implicit to avoid calling on every string literal. + // NOLINTNEXTLINE(runtime/explicit) + CFX_WideString(FX_WCHAR ch); + // NOLINTNEXTLINE(runtime/explicit) + CFX_WideString(const FX_WCHAR* ptr); + + CFX_WideString(const FX_WCHAR* ptr, FX_STRSIZE len); + + explicit CFX_WideString(const CFX_WideStringC& str); + CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2); + + ~CFX_WideString(); + + static CFX_WideString FromLocal(const CFX_ByteStringC& str); + static CFX_WideString FromCodePage(const CFX_ByteStringC& str, + uint16_t codepage); + + static CFX_WideString FromUTF8(const CFX_ByteStringC& str); + static CFX_WideString FromUTF16LE(const unsigned short* str, FX_STRSIZE len); + + static FX_STRSIZE WStringLength(const unsigned short* str); + + // Explicit conversion to C-style wide string. + // Note: Any subsequent modification of |this| will invalidate the result. + const FX_WCHAR* c_str() const { return m_pData ? m_pData->m_String : L""; } + + // Explicit conversion to CFX_WideStringC. + // Note: Any subsequent modification of |this| will invalidate the result. + CFX_WideStringC AsStringC() const { + return CFX_WideStringC(c_str(), GetLength()); + } + + void clear() { m_pData.Reset(); } + + FX_STRSIZE GetLength() const { return m_pData ? m_pData->m_nDataLength : 0; } + bool IsEmpty() const { return !GetLength(); } + + const CFX_WideString& operator=(const FX_WCHAR* str); + const CFX_WideString& operator=(const CFX_WideString& stringSrc); + const CFX_WideString& operator=(const CFX_WideStringC& stringSrc); + + const CFX_WideString& operator+=(const FX_WCHAR* str); + const CFX_WideString& operator+=(FX_WCHAR ch); + const CFX_WideString& operator+=(const CFX_WideString& str); + const CFX_WideString& operator+=(const CFX_WideStringC& str); + + bool operator==(const wchar_t* ptr) const; + bool operator==(const CFX_WideStringC& str) const; + bool operator==(const CFX_WideString& other) const; + + bool operator!=(const wchar_t* ptr) const { return !(*this == ptr); } + bool operator!=(const CFX_WideStringC& str) const { return !(*this == str); } + bool operator!=(const CFX_WideString& other) const { + return !(*this == other); + } + + bool operator<(const CFX_WideString& str) const; + + FX_WCHAR GetAt(FX_STRSIZE nIndex) const { + return m_pData ? m_pData->m_String[nIndex] : 0; + } + + FX_WCHAR operator[](FX_STRSIZE nIndex) const { + return m_pData ? m_pData->m_String[nIndex] : 0; + } + + void SetAt(FX_STRSIZE nIndex, FX_WCHAR ch); + + int Compare(const FX_WCHAR* str) const; + int Compare(const CFX_WideString& str) const; + int CompareNoCase(const FX_WCHAR* str) const; + + CFX_WideString Mid(FX_STRSIZE first) const; + CFX_WideString Mid(FX_STRSIZE first, FX_STRSIZE count) const; + CFX_WideString Left(FX_STRSIZE count) const; + CFX_WideString Right(FX_STRSIZE count) const; + + FX_STRSIZE Insert(FX_STRSIZE index, FX_WCHAR ch); + FX_STRSIZE Delete(FX_STRSIZE index, FX_STRSIZE count = 1); + + void Format(const FX_WCHAR* lpszFormat, ...); + void FormatV(const FX_WCHAR* lpszFormat, va_list argList); + + void MakeLower(); + void MakeUpper(); + + void TrimRight(); + void TrimRight(FX_WCHAR chTarget); + void TrimRight(const CFX_WideStringC& pTargets); + + void TrimLeft(); + void TrimLeft(FX_WCHAR chTarget); + void TrimLeft(const CFX_WideStringC& pTargets); + + void Reserve(FX_STRSIZE len); + FX_WCHAR* GetBuffer(FX_STRSIZE len); + void ReleaseBuffer(FX_STRSIZE len = -1); + + int GetInteger() const; + FX_FLOAT GetFloat() const; + + FX_STRSIZE Find(const CFX_WideStringC& pSub, FX_STRSIZE start = 0) const; + FX_STRSIZE Find(FX_WCHAR ch, FX_STRSIZE start = 0) const; + FX_STRSIZE Replace(const CFX_WideStringC& pOld, const CFX_WideStringC& pNew); + FX_STRSIZE Remove(FX_WCHAR ch); + + CFX_ByteString UTF8Encode() const; + CFX_ByteString UTF16LE_Encode() const; + + protected: + using StringData = CFX_StringDataTemplate; + + void ReallocBeforeWrite(FX_STRSIZE nLen); + void AllocBeforeWrite(FX_STRSIZE nLen); + void AllocCopy(CFX_WideString& dest, + FX_STRSIZE nCopyLen, + FX_STRSIZE nCopyIndex) const; + void AssignCopy(const FX_WCHAR* pSrcData, FX_STRSIZE nSrcLen); + void Concat(const FX_WCHAR* lpszSrcData, FX_STRSIZE nSrcLen); + + CFX_RetainPtr m_pData; + + friend class fxcrt_WideStringConcatInPlace_Test; + friend class fxcrt_WideStringPool_Test; +}; + +inline CFX_WideString operator+(const CFX_WideStringC& str1, + const CFX_WideStringC& str2) { + return CFX_WideString(str1, str2); +} +inline CFX_WideString operator+(const CFX_WideStringC& str1, + const FX_WCHAR* str2) { + return CFX_WideString(str1, str2); +} +inline CFX_WideString operator+(const FX_WCHAR* str1, + const CFX_WideStringC& str2) { + return CFX_WideString(str1, str2); +} +inline CFX_WideString operator+(const CFX_WideStringC& str1, FX_WCHAR ch) { + return CFX_WideString(str1, CFX_WideStringC(ch)); +} +inline CFX_WideString operator+(FX_WCHAR ch, const CFX_WideStringC& str2) { + return CFX_WideString(ch, str2); +} +inline CFX_WideString operator+(const CFX_WideString& str1, + const CFX_WideString& str2) { + return CFX_WideString(str1.AsStringC(), str2.AsStringC()); +} +inline CFX_WideString operator+(const CFX_WideString& str1, FX_WCHAR ch) { + return CFX_WideString(str1.AsStringC(), CFX_WideStringC(ch)); +} +inline CFX_WideString operator+(FX_WCHAR ch, const CFX_WideString& str2) { + return CFX_WideString(ch, str2.AsStringC()); +} +inline CFX_WideString operator+(const CFX_WideString& str1, + const FX_WCHAR* str2) { + return CFX_WideString(str1.AsStringC(), str2); +} +inline CFX_WideString operator+(const FX_WCHAR* str1, + const CFX_WideString& str2) { + return CFX_WideString(str1, str2.AsStringC()); +} +inline CFX_WideString operator+(const CFX_WideString& str1, + const CFX_WideStringC& str2) { + return CFX_WideString(str1.AsStringC(), str2); +} +inline CFX_WideString operator+(const CFX_WideStringC& str1, + const CFX_WideString& str2) { + return CFX_WideString(str1, str2.AsStringC()); +} +inline bool operator==(const wchar_t* lhs, const CFX_WideString& rhs) { + return rhs == lhs; +} +inline bool operator==(const CFX_WideStringC& lhs, const CFX_WideString& rhs) { + return rhs == lhs; +} +inline bool operator!=(const wchar_t* lhs, const CFX_WideString& rhs) { + return rhs != lhs; +} +inline bool operator!=(const CFX_WideStringC& lhs, const CFX_WideString& rhs) { + return rhs != lhs; +} + +CFX_ByteString FX_UTF8Encode(const CFX_WideStringC& wsStr); +FX_FLOAT FX_atof(const CFX_ByteStringC& str); +inline FX_FLOAT FX_atof(const CFX_WideStringC& wsStr) { + return FX_atof(FX_UTF8Encode(wsStr).c_str()); +} +bool FX_atonum(const CFX_ByteStringC& str, void* pData); +FX_STRSIZE FX_ftoa(FX_FLOAT f, FX_CHAR* buf); + +uint32_t FX_HashCode_GetA(const CFX_ByteStringC& str, bool bIgnoreCase); +uint32_t FX_HashCode_GetW(const CFX_WideStringC& str, bool bIgnoreCase); + +namespace std { + +template <> +struct hash { + std::size_t operator()(const CFX_ByteString& str) const { + return FX_HashCode_GetA(str.AsStringC(), false); + } +}; + +template <> +struct hash { + std::size_t operator()(const CFX_WideString& str) const { + return FX_HashCode_GetW(str.AsStringC(), false); + } +}; + +} // namespace std + +extern template struct std::hash; +extern template struct std::hash; + +#endif // CORE_FXCRT_FX_STRING_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_system.h b/modules/pdfium/pdfium/core/fxcrt/fx_system.h new file mode 100644 index 000000000000..c31bef974fe0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_system.h @@ -0,0 +1,329 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FX_SYSTEM_H_ +#define CORE_FXCRT_FX_SYSTEM_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// _FX_OS_ values: +#define _FX_WIN32_DESKTOP_ 1 +#define _FX_WIN64_DESKTOP_ 2 +#define _FX_LINUX_DESKTOP_ 4 +#define _FX_MACOSX_ 7 +#define _FX_ANDROID_ 12 + +// _FXM_PLATFORM_ values; +#define _FXM_PLATFORM_WINDOWS_ 1 // _FX_WIN32_DESKTOP_ or _FX_WIN64_DESKTOP_. +#define _FXM_PLATFORM_LINUX_ 2 // _FX_LINUX_DESKTOP_ always. +#define _FXM_PLATFORM_APPLE_ 3 // _FX_MACOSX_ always. +#define _FXM_PLATFORM_ANDROID_ 4 // _FX_ANDROID_ always. + +#ifndef _FX_OS_ +#if defined(__ANDROID__) +#define _FX_OS_ _FX_ANDROID_ +#define _FXM_PLATFORM_ _FXM_PLATFORM_ANDROID_ +#elif defined(_WIN32) +#define _FX_OS_ _FX_WIN32_DESKTOP_ +#define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_ +#elif defined(_WIN64) +#define _FX_OS_ _FX_WIN64_DESKTOP_ +#define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_ +#elif defined(__linux__) +#define _FX_OS_ _FX_LINUX_DESKTOP_ +#define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_ +#elif defined(__APPLE__) +#define _FX_OS_ _FX_MACOSX_ +#define _FXM_PLATFORM_ _FXM_PLATFORM_APPLE_ +#endif +#endif // _FX_OS_ + +#if !defined(_FX_OS_) || _FX_OS_ == 0 +#error Sorry, can not figure out target OS. Please specify _FX_OS_ macro. +#endif + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +#include +#include +#endif + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ +#include +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef void* FX_POSITION; // Keep until fxcrt containers gone +typedef float FX_FLOAT; // Keep, allow upgrade to doubles. +typedef double FX_DOUBLE; // Keep, allow downgrade to floats. +typedef char FX_CHAR; // Keep, questionable signedness. +typedef wchar_t FX_WCHAR; // Keep, maybe bad platform wchars. + +#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) +#define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) +#define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb)) + +// PDFium string sizes are limited to 2^31-1, and the value is signed to +// allow -1 as a placeholder for "unknown". +// TODO(palmer): it should be a |size_t|, or at least unsigned. +typedef int FX_STRSIZE; + +#ifndef ASSERT +#ifndef NDEBUG +#define ASSERT assert +#else +#define ASSERT(a) +#endif +#endif + +#if defined(__clang__) || defined(__GNUC__) +#define PDFIUM_IMMEDIATE_CRASH() __builtin_trap() +#else +#define PDFIUM_IMMEDIATE_CRASH() ((void)(*(volatile char*)0 = 0)) +#endif + +// M_PI not universally present on all platforms. +#define FX_PI 3.1415926535897932384626433832795f +#define FX_BEZIER 0.5522847498308f + +// NOTE: prevent use of the return value from snprintf() since some platforms +// have different return values (e.g. windows _vsnprintf()), and provide +// versions that always NUL-terminate. +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ && _MSC_VER < 1900 +void FXSYS_snprintf(char* str, + size_t size, + _Printf_format_string_ const char* fmt, + ...); +void FXSYS_vsnprintf(char* str, size_t size, const char* fmt, va_list ap); +#else +#define FXSYS_snprintf (void)snprintf +#define FXSYS_vsnprintf (void)vsnprintf +#endif + +#define FXSYS_sprintf DO_NOT_USE_SPRINTF_DIE_DIE_DIE +#define FXSYS_vsprintf DO_NOT_USE_VSPRINTF_DIE_DIE_DIE +#define FXSYS_strncmp strncmp +#define FXSYS_strcmp strcmp +#define FXSYS_strcpy strcpy +#define FXSYS_strncpy strncpy +#define FXSYS_strstr strstr +#define FXSYS_FILE FILE +#define FXSYS_fopen fopen +#define FXSYS_fclose fclose +#define FXSYS_SEEK_END SEEK_END +#define FXSYS_SEEK_SET SEEK_SET +#define FXSYS_fseek fseek +#define FXSYS_ftell ftell +#define FXSYS_fread fread +#define FXSYS_fwrite fwrite +#define FXSYS_fprintf fprintf +#define FXSYS_fflush fflush + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +#ifdef _NATIVE_WCHAR_T_DEFINED +#define FXSYS_wfopen(f, m) _wfopen((const wchar_t*)(f), (const wchar_t*)(m)) +#else +#define FXSYS_wfopen _wfopen +#endif +#else +FXSYS_FILE* FXSYS_wfopen(const FX_WCHAR* filename, const FX_WCHAR* mode); +#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + +#ifdef __cplusplus +} // extern "C" + +#include "third_party/base/numerics/safe_conversions.h" + +#define FXSYS_strlen(ptr) pdfium::base::checked_cast(strlen(ptr)) +#define FXSYS_wcslen(ptr) pdfium::base::checked_cast(wcslen(ptr)) + +// Overloaded functions for C++ templates +inline FX_STRSIZE FXSYS_len(const FX_CHAR* ptr) { + return FXSYS_strlen(ptr); +} + +inline FX_STRSIZE FXSYS_len(const FX_WCHAR* ptr) { + return FXSYS_wcslen(ptr); +} + +inline int FXSYS_cmp(const FX_CHAR* ptr1, const FX_CHAR* ptr2, size_t len) { + return memcmp(ptr1, ptr2, len); +} + +inline int FXSYS_cmp(const FX_WCHAR* ptr1, const FX_WCHAR* ptr2, size_t len) { + return wmemcmp(ptr1, ptr2, len); +} + +inline const FX_CHAR* FXSYS_chr(const FX_CHAR* ptr, FX_CHAR ch, size_t len) { + return reinterpret_cast(memchr(ptr, ch, len)); +} + +inline const FX_WCHAR* FXSYS_chr(const FX_WCHAR* ptr, FX_WCHAR ch, size_t len) { + return wmemchr(ptr, ch, len); +} + +extern "C" { +#else +#define FXSYS_strlen(ptr) ((FX_STRSIZE)strlen(ptr)) +#define FXSYS_wcslen(ptr) ((FX_STRSIZE)wcslen(ptr)) +#endif + +#define FXSYS_wcscmp wcscmp +#define FXSYS_wcsstr wcsstr +#define FXSYS_wcsncmp wcsncmp +#define FXSYS_vswprintf vswprintf +#define FXSYS_mbstowcs mbstowcs +#define FXSYS_wcstombs wcstombs +#define FXSYS_memcmp memcmp +#define FXSYS_memcpy memcpy +#define FXSYS_memmove memmove +#define FXSYS_memset memset +#define FXSYS_qsort qsort +#define FXSYS_bsearch bsearch + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +#define FXSYS_GetACP GetACP +#define FXSYS_itoa _itoa +#define FXSYS_strlwr _strlwr +#define FXSYS_strupr _strupr +#define FXSYS_stricmp _stricmp +#ifdef _NATIVE_WCHAR_T_DEFINED +#define FXSYS_wcsicmp(str1, str2) _wcsicmp((wchar_t*)(str1), (wchar_t*)(str2)) +#define FXSYS_WideCharToMultiByte(p1, p2, p3, p4, p5, p6, p7, p8) \ + WideCharToMultiByte(p1, p2, (const wchar_t*)(p3), p4, p5, p6, p7, p8) +#define FXSYS_MultiByteToWideChar(p1, p2, p3, p4, p5, p6) \ + MultiByteToWideChar(p1, p2, p3, p4, (wchar_t*)(p5), p6) +#define FXSYS_wcslwr(str) _wcslwr((wchar_t*)(str)) +#define FXSYS_wcsupr(str) _wcsupr((wchar_t*)(str)) +#else +#define FXSYS_wcsicmp _wcsicmp +#define FXSYS_WideCharToMultiByte WideCharToMultiByte +#define FXSYS_MultiByteToWideChar MultiByteToWideChar +#define FXSYS_wcslwr _wcslwr +#define FXSYS_wcsupr _wcsupr +#endif +#define FXSYS_GetFullPathName GetFullPathName +#define FXSYS_GetModuleFileName GetModuleFileName +#else +int FXSYS_GetACP(); +char* FXSYS_itoa(int value, char* str, int radix); +int FXSYS_WideCharToMultiByte(uint32_t codepage, + uint32_t dwFlags, + const wchar_t* wstr, + int wlen, + char* buf, + int buflen, + const char* default_str, + int* pUseDefault); +int FXSYS_MultiByteToWideChar(uint32_t codepage, + uint32_t dwFlags, + const char* bstr, + int blen, + wchar_t* buf, + int buflen); +uint32_t FXSYS_GetFullPathName(const char* filename, + uint32_t buflen, + char* buf, + char** filepart); +uint32_t FXSYS_GetModuleFileName(void* hModule, char* buf, uint32_t bufsize); +char* FXSYS_strlwr(char* str); +char* FXSYS_strupr(char* str); +int FXSYS_stricmp(const char*, const char*); +int FXSYS_wcsicmp(const wchar_t* str1, const wchar_t* str2); +wchar_t* FXSYS_wcslwr(wchar_t* str); +wchar_t* FXSYS_wcsupr(wchar_t* str); +#endif // _FXM_PLATFORM == _FXM_PLATFORM_WINDOWS_ + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +#define FXSYS_pow(a, b) (FX_FLOAT) powf(a, b) +#else +#define FXSYS_pow(a, b) (FX_FLOAT) pow(a, b) +#endif +#define FXSYS_sqrt(a) (FX_FLOAT) sqrt(a) +#define FXSYS_fabs(a) (FX_FLOAT) fabs(a) +#define FXSYS_atan2(a, b) (FX_FLOAT) atan2(a, b) +#define FXSYS_ceil(a) (FX_FLOAT) ceil(a) +#define FXSYS_floor(a) (FX_FLOAT) floor(a) +#define FXSYS_cos(a) (FX_FLOAT) cos(a) +#define FXSYS_acos(a) (FX_FLOAT) acos(a) +#define FXSYS_sin(a) (FX_FLOAT) sin(a) +#define FXSYS_log(a) (FX_FLOAT) log(a) +#define FXSYS_log10(a) (FX_FLOAT) log10(a) +#define FXSYS_fmod(a, b) (FX_FLOAT) fmod(a, b) +#define FXSYS_abs abs +#define FXDWORD_GET_LSBFIRST(p) \ + ((static_cast(p[3]) << 24) | (static_cast(p[2]) << 16) | \ + (static_cast(p[1]) << 8) | (static_cast(p[0]))) +#define FXDWORD_GET_MSBFIRST(p) \ + ((static_cast(p[0]) << 24) | (static_cast(p[1]) << 16) | \ + (static_cast(p[2]) << 8) | (static_cast(p[3]))) +#define FXSYS_HIBYTE(word) ((uint8_t)((word) >> 8)) +#define FXSYS_LOBYTE(word) ((uint8_t)(word)) +#define FXSYS_HIWORD(dword) ((uint16_t)((dword) >> 16)) +#define FXSYS_LOWORD(dword) ((uint16_t)(dword)) +int32_t FXSYS_atoi(const FX_CHAR* str); +uint32_t FXSYS_atoui(const FX_CHAR* str); +int32_t FXSYS_wtoi(const FX_WCHAR* str); +int64_t FXSYS_atoi64(const FX_CHAR* str); +int64_t FXSYS_wtoi64(const FX_WCHAR* str); +const FX_CHAR* FXSYS_i64toa(int64_t value, FX_CHAR* str, int radix); +int FXSYS_round(FX_FLOAT f); +#define FXSYS_sqrt2(a, b) (FX_FLOAT) FXSYS_sqrt((a) * (a) + (b) * (b)) +#ifdef __cplusplus +}; +#endif + +// To print a size_t value in a portable way: +// size_t size; +// printf("xyz: %" PRIuS, size); +// The "u" in the macro corresponds to %u, and S is for "size". + +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + +#if (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && !defined(PRId64) +#error "inttypes.h has already been included before this header file, but " +#error "without __STDC_FORMAT_MACROS defined." +#endif + +#if !defined(__STDC_FORMAT_MACROS) +#define __STDC_FORMAT_MACROS +#endif + +#include + +#if !defined(PRIuS) +#define PRIuS "zu" +#endif + +#else // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + +#if !defined(PRIuS) +#define PRIuS "Iu" +#endif + +#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + +// Prevent a function from ever being inlined, typically because we'd +// like it to appear in stack traces. +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +#define NEVER_INLINE __declspec(noinline) +#else // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +#define NEVER_INLINE __attribute__((__noinline__)) +#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + +#endif // CORE_FXCRT_FX_SYSTEM_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_system_unittest.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_system_unittest.cpp new file mode 100644 index 000000000000..4ab37c7bdb41 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_system_unittest.cpp @@ -0,0 +1,162 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include + +#include "core/fxcrt/fx_system.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" + +// Unit test covering cases where PDFium replaces well-known library +// functionality on any given platformn. + +#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ + +namespace { + +const FX_CHAR kSentinel = 0x7f; + +void Check32BitBase16Itoa(int32_t input, const char* expected_output) { + const size_t kBufLen = 11; // "-" + 8 digits + NUL + sentinel. + FX_CHAR buf[kBufLen]; + buf[kBufLen - 1] = kSentinel; + FXSYS_itoa(input, buf, 16); + EXPECT_EQ(std::string(expected_output), buf); + EXPECT_EQ(kSentinel, buf[kBufLen - 1]); +} + +void Check32BitBase10Itoa(int32_t input, const char* expected_output) { + const size_t kBufLen = 13; // "-" + 10 digits + NUL + sentinel. + FX_CHAR buf[kBufLen]; + buf[kBufLen - 1] = kSentinel; + FXSYS_itoa(input, buf, 10); + EXPECT_EQ(std::string(expected_output), buf); + EXPECT_EQ(kSentinel, buf[kBufLen - 1]); +} + +void Check32BitBase2Itoa(int32_t input, const char* expected_output) { + const size_t kBufLen = 35; // "-" + 32 digits + NUL + sentinel. + FX_CHAR buf[kBufLen]; + buf[kBufLen - 1] = kSentinel; + FXSYS_itoa(input, buf, 2); + EXPECT_EQ(std::string(expected_output), buf); + EXPECT_EQ(kSentinel, buf[kBufLen - 1]); +} + +void Check64BitBase16Itoa(int64_t input, const char* expected_output) { + const size_t kBufLen = 19; // "-" + 16 digits + NUL + sentinel. + FX_CHAR buf[kBufLen]; + buf[kBufLen - 1] = kSentinel; + FXSYS_i64toa(input, buf, 16); + EXPECT_EQ(std::string(expected_output), buf); + EXPECT_EQ(kSentinel, buf[kBufLen - 1]); +} + +void Check64BitBase10Itoa(int64_t input, const char* expected_output) { + const size_t kBufLen = 22; // "-" + 19 digits + NUL + sentinel. + FX_CHAR buf[kBufLen]; + buf[kBufLen - 1] = kSentinel; + FXSYS_i64toa(input, buf, 10); + EXPECT_EQ(std::string(expected_output), buf); + EXPECT_EQ(kSentinel, buf[kBufLen - 1]); +} + +void Check64BitBase2Itoa(int64_t input, const char* expected_output) { + const size_t kBufLen = 67; // "-" + 64 digits + NUL + sentinel. + FX_CHAR buf[kBufLen]; + buf[kBufLen - 1] = kSentinel; + FXSYS_i64toa(input, buf, 2); + EXPECT_EQ(std::string(expected_output), buf); + EXPECT_EQ(kSentinel, buf[kBufLen - 1]); +} + +} // namespace + +TEST(fxcrt, FXSYS_itoa_InvalidRadix) { + FX_CHAR buf[32]; + + FXSYS_itoa(42, buf, 17); // Ours stops at 16. + EXPECT_EQ(std::string(""), buf); + + FXSYS_itoa(42, buf, 1); + EXPECT_EQ(std::string(""), buf); + + FXSYS_itoa(42, buf, 0); + EXPECT_EQ(std::string(""), buf); + + FXSYS_itoa(42, buf, -1); + EXPECT_EQ(std::string(""), buf); +} + +TEST(fxcrt, FXSYS_itoa) { + Check32BitBase16Itoa(std::numeric_limits::min(), "-80000000"); + Check32BitBase10Itoa(std::numeric_limits::min(), "-2147483648"); + Check32BitBase2Itoa(std::numeric_limits::min(), + "-10000000000000000000000000000000"); + + Check32BitBase16Itoa(-1, "-1"); + Check32BitBase10Itoa(-1, "-1"); + Check32BitBase2Itoa(-1, "-1"); + + Check32BitBase16Itoa(0, "0"); + Check32BitBase10Itoa(0, "0"); + Check32BitBase2Itoa(0, "0"); + + Check32BitBase16Itoa(42, "2a"); + Check32BitBase10Itoa(42, "42"); + Check32BitBase2Itoa(42, "101010"); + + Check32BitBase16Itoa(std::numeric_limits::max(), "7fffffff"); + Check32BitBase10Itoa(std::numeric_limits::max(), "2147483647"); + Check32BitBase2Itoa(std::numeric_limits::max(), + "1111111111111111111111111111111"); +} + +TEST(fxcrt, FXSYS_i64toa_InvalidRadix) { + FX_CHAR buf[32]; + + FXSYS_i64toa(42, buf, 17); // Ours stops at 16. + EXPECT_EQ(std::string(""), buf); + + FXSYS_i64toa(42, buf, 1); + EXPECT_EQ(std::string(""), buf); + + FXSYS_i64toa(42, buf, 0); + EXPECT_EQ(std::string(""), buf); + + FXSYS_i64toa(42, buf, -1); + EXPECT_EQ(std::string(""), buf); +} + +TEST(fxcrt, FXSYS_i64toa) { + Check64BitBase16Itoa(std::numeric_limits::min(), + "-8000000000000000"); + Check64BitBase10Itoa(std::numeric_limits::min(), + "-9223372036854775808"); + Check64BitBase2Itoa( + std::numeric_limits::min(), + "-1000000000000000000000000000000000000000000000000000000000000000"); + + Check64BitBase16Itoa(-1, "-1"); + Check64BitBase10Itoa(-1, "-1"); + Check64BitBase2Itoa(-1, "-1"); + + Check64BitBase16Itoa(0, "0"); + Check64BitBase10Itoa(0, "0"); + Check64BitBase2Itoa(0, "0"); + + Check64BitBase16Itoa(42, "2a"); + Check64BitBase10Itoa(42, "42"); + Check64BitBase2Itoa(42, "101010"); + + Check64BitBase16Itoa(std::numeric_limits::max(), "7fffffffffffffff"); + Check64BitBase10Itoa(std::numeric_limits::max(), + "9223372036854775807"); + Check64BitBase2Itoa( + std::numeric_limits::max(), + "111111111111111111111111111111111111111111111111111111111111111"); +} + +#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_ucd.h b/modules/pdfium/pdfium/core/fxcrt/fx_ucd.h new file mode 100644 index 000000000000..eb4bad097e9d --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_ucd.h @@ -0,0 +1,204 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FX_UCD_H_ +#define CORE_FXCRT_FX_UCD_H_ + +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxcrt/fx_basic.h" + +#define FX_BIDICLASSBITS 6 +#define FX_BIDICLASSBITSMASK (31 << FX_BIDICLASSBITS) + +enum FX_BIDICLASS { + FX_BIDICLASS_ON = 0, // Other Neutral + FX_BIDICLASS_L = 1, // Left Letter + FX_BIDICLASS_R = 2, // Right Letter + FX_BIDICLASS_AN = 3, // Arabic Number + FX_BIDICLASS_EN = 4, // European Number + FX_BIDICLASS_AL = 5, // Arabic Letter + FX_BIDICLASS_NSM = 6, // Non-spacing Mark + FX_BIDICLASS_CS = 7, // Common Number Separator + FX_BIDICLASS_ES = 8, // European Separator + FX_BIDICLASS_ET = 9, // European Number Terminator + FX_BIDICLASS_BN = 10, // Boundary Neutral + FX_BIDICLASS_S = 11, // Segment Separator + FX_BIDICLASS_WS = 12, // Whitespace + FX_BIDICLASS_B = 13, // Paragraph Separator + FX_BIDICLASS_RLO = 14, // Right-to-Left Override + FX_BIDICLASS_RLE = 15, // Right-to-Left Embedding + FX_BIDICLASS_LRO = 16, // Left-to-Right Override + FX_BIDICLASS_LRE = 17, // Left-to-Right Embedding + FX_BIDICLASS_PDF = 18, // Pop Directional Format + FX_BIDICLASS_N = FX_BIDICLASS_ON, +}; + +extern const uint32_t kTextLayoutCodeProperties[]; +extern const size_t kTextLayoutCodePropertiesSize; + +extern const uint16_t kFXTextLayoutVerticalMirror[]; +extern const size_t kFXTextLayoutVerticalMirrorSize; + +extern const uint16_t kFXTextLayoutBidiMirror[]; +extern const size_t kFXTextLayoutBidiMirrorSize; + +uint32_t FX_GetUnicodeProperties(FX_WCHAR wch); +FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, bool bRTL, bool bVertical); + +#ifdef PDF_ENABLE_XFA +enum FX_CHARBREAKPROP { + FX_CBP_OP = 0, + FX_CBP_CL = 1, + FX_CBP_QU = 2, + FX_CBP_GL = 3, + FX_CBP_NS = 4, + FX_CBP_EX = 5, + FX_CBP_SY = 6, + FX_CBP_IS = 7, + FX_CBP_PR = 8, + FX_CBP_PO = 9, + FX_CBP_NU = 10, + FX_CBP_AL = 11, + FX_CBP_ID = 12, + FX_CBP_IN = 13, + FX_CBP_HY = 14, + FX_CBP_BA = 15, + FX_CBP_BB = 16, + FX_CBP_B2 = 17, + FX_CBP_ZW = 18, + FX_CBP_CM = 19, + FX_CBP_WJ = 20, + FX_CBP_H2 = 21, + FX_CBP_H3 = 22, + FX_CBP_JL = 23, + FX_CBP_JV = 24, + FX_CBP_JT = 25, + + FX_CBP_BK = 26, + FX_CBP_CR = 27, + FX_CBP_LF = 28, + FX_CBP_NL = 29, + FX_CBP_SA = 30, + FX_CBP_SG = 31, + FX_CBP_CB = 32, + FX_CBP_XX = 33, + FX_CBP_AI = 34, + FX_CBP_SP = 35, + FX_CBP_TB = 37, + FX_CBP_NONE = 36, +}; + +#define FX_CHARTYPEBITS 11 +#define FX_CHARTYPEBITSMASK (15 << FX_CHARTYPEBITS) +enum FX_CHARTYPE { + FX_CHARTYPE_Unknown = 0, + FX_CHARTYPE_Tab = (1 << FX_CHARTYPEBITS), + FX_CHARTYPE_Space = (2 << FX_CHARTYPEBITS), + FX_CHARTYPE_Control = (3 << FX_CHARTYPEBITS), + FX_CHARTYPE_Combination = (4 << FX_CHARTYPEBITS), + FX_CHARTYPE_Numeric = (5 << FX_CHARTYPEBITS), + FX_CHARTYPE_Normal = (6 << FX_CHARTYPEBITS), + FX_CHARTYPE_ArabicAlef = (7 << FX_CHARTYPEBITS), + FX_CHARTYPE_ArabicSpecial = (8 << FX_CHARTYPEBITS), + FX_CHARTYPE_ArabicDistortion = (9 << FX_CHARTYPEBITS), + FX_CHARTYPE_ArabicNormal = (10 << FX_CHARTYPEBITS), + FX_CHARTYPE_ArabicForm = (11 << FX_CHARTYPEBITS), + FX_CHARTYPE_Arabic = (12 << FX_CHARTYPEBITS), +}; +inline FX_CHARTYPE GetCharTypeFromProp(uint32_t prop) { + return static_cast(prop & FX_CHARTYPEBITSMASK); +} + +bool FX_IsCtrlCode(FX_WCHAR ch); +FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, + uint32_t dwProps, + bool bRTL, + bool bVertical); +class CFX_Char { + public: + CFX_Char() + : m_wCharCode(0), + m_nBreakType(0), + m_dwCharProps(0), + m_iCharWidth(0), + m_iHorizontalScale(100), + m_iVerticalScale(100) {} + + CFX_Char(uint16_t wCharCode, uint32_t dwCharProps) + : m_wCharCode(wCharCode), + m_nBreakType(0), + m_dwCharProps(dwCharProps), + m_iCharWidth(0), + m_iHorizontalScale(100), + m_iVerticalScale(100) {} + + FX_CHARTYPE GetCharType() const { return GetCharTypeFromProp(m_dwCharProps); } + + uint16_t m_wCharCode; + uint8_t m_nBreakType; + uint32_t m_dwCharProps; + int32_t m_iCharWidth; + int32_t m_iHorizontalScale; + int32_t m_iVerticalScale; +}; + +class CFX_TxtChar : public CFX_Char { + public: + CFX_TxtChar() + : m_nRotation(0), + m_dwCharStyles(0), + m_dwStatus(0), + m_iBidiClass(0), + m_iBidiLevel(0), + m_iBidiPos(0), + m_iBidiOrder(0), + m_pUserData(nullptr) {} + + int8_t m_nRotation; + uint32_t m_dwCharStyles; + uint32_t m_dwStatus; + int16_t m_iBidiClass; + int16_t m_iBidiLevel; + int16_t m_iBidiPos; + int16_t m_iBidiOrder; + void* m_pUserData; +}; + +enum class CFX_RTFBreakType { None = 0, Piece, Line, Paragraph, Page }; + +class CFX_RTFChar : public CFX_Char { + public: + CFX_RTFChar(); + CFX_RTFChar(const CFX_RTFChar& other); + ~CFX_RTFChar(); + + CFX_RTFBreakType m_dwStatus; + int32_t m_iFontSize; + int32_t m_iFontHeight; + int16_t m_iBidiClass; + int16_t m_iBidiLevel; + int16_t m_iBidiPos; + int16_t m_iBidiOrder; + uint32_t m_dwIdentity; + CFX_RetainPtr m_pUserData; +}; + +inline CFX_RTFChar::CFX_RTFChar() + : m_dwStatus(CFX_RTFBreakType::None), + m_iFontSize(0), + m_iFontHeight(0), + m_iBidiClass(0), + m_iBidiLevel(0), + m_iBidiPos(0), + m_dwIdentity(0), + m_pUserData(nullptr) {} + +inline CFX_RTFChar::CFX_RTFChar(const CFX_RTFChar& other) = default; +inline CFX_RTFChar::~CFX_RTFChar() = default; + +#endif // PDF_ENABLE_XFA + +#endif // CORE_FXCRT_FX_UCD_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_ucddata.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_ucddata.cpp new file mode 100644 index 000000000000..b8661b87cb7d --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_ucddata.cpp @@ -0,0 +1,11013 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_ucd.h" + +const uint32_t kTextLayoutCodeProperties[] = { + 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, + 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe8ae5, 0xfffe9b5c, 0xfffe9ada, + 0xfffe9b1a, 0xfffe9b5b, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, + 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, + 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9b53, 0xfffe9b53, + 0xfffe9b53, 0xfffe9ad3, 0xfffe9323, 0xfffeb005, 0xfffeb002, 0xfffeb24b, + 0xfffeb248, 0xfffeb249, 0xfffeb00b, 0xfffeb002, 0x007eb000, 0x00feb001, + 0xfffeb00b, 0xfffeb208, 0xfffeb1c7, 0xfffeb20e, 0xfffeb1c7, 0xfffeb1c6, + 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, + 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffeb1c7, 0xfffeb007, + 0x017eb000, 0xfffeb00b, 0x01feb001, 0xfffeb005, 0xfffeb00b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0x027eb000, 0xfffeb008, 0x02feb001, 0xfffeb00b, 0xff80b00b, + 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0x037eb000, 0xfffeb00f, 0x03feb001, + 0xfffeb00b, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, + 0xfffeb293, 0xfffeb35d, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, + 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, + 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, + 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, + 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffe91c3, 0xfffeb000, + 0xfffeb249, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb00b, 0xfffeb022, + 0xfffeb022, 0xfffeb00b, 0xfffeb062, 0x047eb000, 0xfffeb00b, 0xfffeb28f, + 0xfffeb00b, 0xfffeb00b, 0xfffeb249, 0xfffeb248, 0xfffeb122, 0xfffeb122, + 0xfffeb010, 0xfffeb04b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb122, + 0xfffeb062, 0x04feb001, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb000, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb022, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb022, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb010, 0xfffeb022, + 0xfffeb022, 0xfffeb022, 0xfffeb010, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, + 0xfffeb062, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, + 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb010, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea183, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea183, 0xfffea183, 0xfffea183, 0xfffea183, + 0xfffea183, 0xfffea183, 0xfffea183, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb007, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffeb193, 0xfffeb193, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffeb047, 0xfffeb00f, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe80a4, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffeb08f, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffeb08b, + 0xfffea193, 0xfffea193, 0xfffeb085, 0xfffea193, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffed0cb, 0xfffed0cb, 0xfffed0cb, 0xfffed0cb, 0xfffed164, 0xfffed164, + 0xfffed00b, 0xfffed00b, 0xfffed14b, 0xfffed249, 0xfffed249, 0xfffed149, + 0xfffed1c7, 0xfffed147, 0xfffed00b, 0xfffed00b, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed145, 0xfffed164, 0xfffed164, + 0xfffed145, 0xfffed145, 0xfffed164, 0xfffed14b, 0xfffeb94b, 0xfffeb94b, + 0xfffec14b, 0xfffeb94b, 0xfffec94b, 0xfffeb94b, 0xfffec94b, 0xfffec14b, + 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec14b, + 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, + 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffed14b, + 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec94b, 0xfffec94b, + 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, + 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed164, + 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, + 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed249, 0xfffed0ca, + 0xfffed0ca, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffea193, 0xfffec14b, + 0xfffec14b, 0xfffec14b, 0xfffea14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, + 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, + 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, + 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec14b, + 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, + 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, + 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec94b, + 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, + 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, + 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, + 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, + 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffed14b, 0xfffed14b, + 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, + 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec14b, 0xfffec14b, + 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, + 0xfffec94b, 0xfffec14b, 0xfffec94b, 0xfffec14b, 0xfffec94b, 0xfffec94b, + 0xfffec14b, 0xfffec14b, 0xfffec945, 0xfffec14b, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed0cb, + 0xfffed193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffed14b, 0xfffed14b, 0xfffea193, 0xfffea193, 0xfffed00b, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffec14b, 0xfffec14b, + 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, + 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed14b, 0xfffed14b, + 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffeb14b, 0xfffeb14b, + 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, + 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, + 0xfffe8164, 0xfffeb28b, 0xfffeb14b, 0xfffea193, 0xfffeb14b, 0xfffeb14b, + 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, + 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, + 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, + 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, + 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffe8164, 0xfffe8164, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, + 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, + 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, + 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, + 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, + 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffed14b, + 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec14b, 0xfffed14b, 0xfffec14b, + 0xfffec14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, + 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, + 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, + 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, + 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, + 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, + 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, + 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, + 0xfffeb14b, 0xfffeb14b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffeb14b, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, + 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, + 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffeb08a, 0xfffeb08a, + 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, + 0xfffeb08a, 0xfffeb08a, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffeb08b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb007, 0xfffeb005, 0xfffeb08b, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffe80a4, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, + 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, + 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffeb04f, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffea193, 0xfffeb053, 0xfffeb053, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffeb053, + 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, + 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffeb053, + 0xfffeb053, 0xfffea193, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, + 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04b, 0xfffeb04b, 0xfffeb249, 0xfffeb249, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb049, 0xfffeb04b, 0xfffeb248, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, + 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffe8024, + 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffe8024, + 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, + 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, + 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffea193, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffeb248, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb053, 0xfffeb053, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffea193, + 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, + 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffeb053, + 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb053, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, + 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffea193, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, + 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb248, + 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, + 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffea053, + 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, + 0xfffea053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, + 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, + 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, + 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, + 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb049, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffeb053, 0xfffeb053, + 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb053, 0xfffeb053, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, + 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, + 0xfffea19e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb248, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, + 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb04b, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04f, 0xfffeb04f, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb05e, + 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffeb05e, + 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffeb05e, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, + 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, + 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, + 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, + 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffea19e, 0xfffea19e, 0xfffeb05e, + 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffea19e, 0xfffea19e, + 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffe8024, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, + 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb050, 0xfffeb050, 0xfffeb050, 0xfffeb050, 0xfffeb04b, + 0xfffeb050, 0xfffeb050, 0xfffeb043, 0xfffeb050, 0xfffeb050, 0xfffeb04f, + 0xfffeb043, 0xfffeb045, 0xfffeb045, 0xfffeb045, 0xfffeb045, 0xfffeb045, + 0xfffeb043, 0xfffeb04b, 0xfffeb045, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffea193, + 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffea193, 0x057eb000, 0x05feb001, + 0x067eb000, 0x06feb001, 0xfffeb053, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffeb04f, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffeb04f, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffeb04f, 0xfffeb04f, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb050, 0xfffeb050, + 0xfffeb04f, 0xfffeb050, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, + 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, + 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, + 0xfffea19e, 0xfffeb05e, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, + 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, + 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, + 0xfffe3057, 0xfffe3057, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb04f, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb00f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb30f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0x077eb000, 0x07feb001, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, + 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffeb04f, 0xfffeb04f, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, + 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, + 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, + 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb04f, 0xfffeb04f, + 0xfffeb044, 0xfffeb05e, 0xfffeb04f, 0xfffeb04b, 0xfffeb04f, 0xfffeb248, + 0xfffeb05e, 0xfffea19e, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb00b, 0xfffeb00b, 0xfffeb005, 0xfffeb005, 0xfffeb00f, 0xfffeb00f, + 0xfffeb010, 0xfffeb00b, 0xfffeb005, 0xfffeb005, 0xfffeb00b, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffeb303, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, + 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, + 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, + 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb005, 0xfffeb005, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb01e, 0xfffeb01e, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, + 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, + 0xfffea19e, 0xfffe8024, 0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, + 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, + 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, + 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, + 0xfffea19e, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb053, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, + 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, + 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, + 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, + 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffeb053, + 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, + 0xfffeb04f, 0xfffeb04f, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04b, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, + 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb010, + 0xfffeb00b, 0xfffe8024, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, + 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb303, 0xfffeb30f, 0xfffeb30f, + 0xfffeb30f, 0xfffeb292, 0xfffe9a93, 0xfffe9a93, 0xfffe9853, 0xfffe9893, + 0xfffeb00f, 0xfffeb003, 0xfffeb00f, 0xff82b00f, 0xff84b011, 0xfffeb022, + 0xfffeb022, 0xfffeb00b, 0x0806b000, 0x0888b002, 0xfffeb000, 0xfffeb002, + 0x090ab000, 0x098cb001, 0xfffeb000, 0xfffeb002, 0xfffeb022, 0xfffeb022, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00d, 0xfffeb00d, 0xfffeb00d, 0xfffeb00f, + 0xfffe9b1a, 0xfffe9b5a, 0xfffe9c53, 0xfffe9bd3, 0xfffe9c93, 0xfffe9c13, + 0xfffe9b93, 0xfffeb1c3, 0xfffeb249, 0xfffeb249, 0xfffeb249, 0xfffeb249, + 0xfffeb249, 0xfffeb009, 0xfffeb009, 0xfffeb009, 0xfffeb00b, 0x0a7eb000, + 0x0afeb001, 0xfffeb022, 0xfffeb004, 0xfffeb004, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb1c7, 0x0b7eb000, + 0x0bfeb001, 0xfffeb004, 0xfffeb004, 0xfffeb004, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00f, 0xfffeb00b, + 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00b, 0xfffeb00f, + 0xfffeb00f, 0xfffeb30f, 0xfffeb294, 0xfffeb28b, 0xfffeb28b, 0xfffeb28b, + 0xfffeb28b, 0xfffe82a4, 0xfffe82a4, 0xfffe82a4, 0xfffe82a4, 0xfffe82a4, + 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, + 0xfffeb10b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb122, 0xfffeb10b, + 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb20b, 0xfffeb20b, + 0xfffeb00b, 0x0c7eb000, 0x0cfeb001, 0xfffeb062, 0xfffeb10b, 0xfffeb122, + 0xfffeb122, 0xfffeb122, 0xfffeb122, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, + 0xfffeb10b, 0xfffeb10b, 0xfffeb20b, 0xfffeb20b, 0xfffeb00b, 0x0d7eb000, + 0x0dfeb001, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, + 0xfffeb248, 0xfffeb249, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, + 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, + 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb249, 0xfffeb248, + 0xfffeb248, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffeb193, 0xfffeb193, 0xfffeb193, 0xfffeb193, 0xfffea193, + 0xfffeb193, 0xfffeb193, 0xfffeb193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb009, 0xfffeb00b, 0xfffeb022, + 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb009, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb062, 0xfffeb00b, 0xfffeb04b, 0xfffeb008, 0xfffeb00b, + 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb00b, + 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, + 0xfffeb04b, 0xfffeb062, 0xfffeb04b, 0xfffeb04b, 0xfffeb24b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, + 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, + 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb062, 0xfffeb062, + 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, + 0xfffeb062, 0xfffeb062, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb022, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, + 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, + 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, + 0x0e7eb022, 0x0efeb00b, 0x0f7eb00b, 0x0ffeb022, 0x107eb00b, 0x10feb00b, + 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb208, 0xfffeb248, + 0xfffeb00b, 0x117eb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022, + 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb022, + 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, + 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x11feb022, 0x127eb022, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x12feb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0x137eb022, 0x13feb00b, 0x147eb00b, 0x14feb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, + 0xfffeb00b, 0xfffeb00b, 0x157eb022, 0x15feb022, 0x167eb022, 0x16feb022, + 0x177eb00b, 0x17feb00b, 0x187eb022, 0x18feb022, 0xfffeb00b, 0xfffeb00b, + 0x197eb022, 0x19feb022, 0x1a7eb00b, 0x1afeb00b, 0x1b7eb00b, 0x1bfeb00b, + 0x1c7eb00b, 0x1cfeb00b, 0x1d7eb00b, 0x1dfeb00b, 0x1e7eb00b, 0x1efeb00b, + 0x1f7eb00b, 0x1ffeb00b, 0x207eb00b, 0x20feb00b, 0x217eb00b, 0x21feb00b, + 0x227eb00b, 0x22feb00b, 0x237eb022, 0x23feb022, 0x247eb00b, 0x24feb00b, + 0x257eb022, 0x25feb022, 0x267eb00b, 0x26feb00b, 0x277eb00b, 0x27feb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x287eb00b, 0x28feb00b, 0x297eb00b, + 0x29feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, + 0x2a7eb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x2afeb00b, 0x2b7eb00b, + 0xfffeb00b, 0xfffeb022, 0x2bfeb00b, 0xfffeb00b, 0x2c7eb00b, 0x2cfeb00b, + 0xfffeb00b, 0x2d7eb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0x2dfeb00b, 0x2e7eb00b, 0x2efeb00b, 0x2f7eb00b, 0x2ffeb00b, 0x307eb00b, + 0x30feb00b, 0x317eb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0x31feb00b, 0x327eb00b, 0x32feb00b, 0x337eb00b, 0x33feb00b, + 0xfffeb00b, 0xfffeb00b, 0x347eb00b, 0x34feb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0x357eb00b, 0x35feb00b, 0x367eb00b, 0x36feb00b, + 0x377eb00b, 0x37feb00b, 0x387eb00b, 0x38feb00b, 0x397eb00b, 0x39feb00b, + 0x3a7eb00b, 0x3afeb00b, 0x3b7eb00b, 0x3bfeb00b, 0x3c7eb00b, 0x3cfeb00b, + 0x3d7eb00b, 0x3dfeb00b, 0x3e7eb00b, 0x3efeb00b, 0x3f7eb00b, 0x3ffeb00b, + 0x407eb00b, 0x40feb00b, 0xfffeb00b, 0xfffeb00b, 0x417eb00b, 0x41feb00b, + 0x427eb00b, 0x42feb00b, 0x437eb00b, 0xfffeb00b, 0x43feb00b, 0x447eb00b, + 0xfffeb00b, 0xfffeb00b, 0x44feb00b, 0x457eb00b, 0x45feb00b, 0x467eb00b, + 0x46feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x477eb00b, 0x47feb00b, + 0x487eb00b, 0x48feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0x497eb000, 0x49feb001, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3122, 0xfffe3122, + 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, + 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, + 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, + 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe304b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe0024, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe0024, 0xfffe3022, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe0024, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, + 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe3002, 0xfffe3002, 0xfffe3002, 0xfffe3002, 0xfffe0024, + 0xfffe0024, 0xfffe300b, 0xfffe3005, 0xfffe3005, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0x4a7e3000, 0x4afe3001, 0x4b7e3000, 0x4bfe3001, + 0x4c7e3000, 0x4cfe3001, 0x4d7e3000, 0x4dfe3001, 0x4e7e3000, 0x4efe3001, + 0x4f7e3000, 0x4ffe3001, 0x507e3000, 0x50fe3001, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x517e300b, 0x51fe300b, 0x527e3000, + 0x52fe3001, 0xfffe300b, 0x537e300b, 0x53fe300b, 0xfffe300b, 0xfffe0024, + 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x547e300b, 0x54fe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x557e300b, + 0x55fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x567e300b, 0x56fe300b, + 0x577e300b, 0x57fe300b, 0x587e3000, 0x58fe3001, 0x597e3000, 0x59fe3001, + 0x5a7e3000, 0x5afe3001, 0x5b7e3000, 0x5bfe3001, 0x5c7e3000, 0x5cfe3001, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0x5d7e3000, 0x5dfe3001, 0x5e7e3000, 0x5efe3001, 0x5f7e3000, + 0x5ffe3001, 0x607e3000, 0x60fe3001, 0x617e3000, 0x61fe3001, 0x627e3000, + 0x62fe3001, 0x637e3000, 0x63fe3001, 0x647e3000, 0x64fe3001, 0x657e3000, + 0x65fe3001, 0x667e3000, 0x66fe3001, 0x677e3000, 0x67fe3001, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0x687e300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0x68fe300b, 0x697e300b, 0xfffe300b, 0xfffe300b, + 0x69fe300b, 0x6a7e300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x6afe300b, + 0x6b7e300b, 0x6bfe300b, 0x6c7e300b, 0xfffe300b, 0x6cfe300b, 0x6d7e300b, + 0xfffe300b, 0xfffe300b, 0x6dfe3000, 0x6e7e3001, 0x6efe3000, 0x6f7e3001, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0x6ffe300b, 0xfffe300b, 0xfffe300b, 0x707e300b, 0x70fe300b, + 0xfffe300b, 0xfffe300b, 0x717e3000, 0x71fe3001, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0x727e300b, 0x72fe300b, 0x737e300b, 0x73fe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x747e300b, 0x74fe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0x757e300b, 0x75fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x767e300b, 0x76fe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0x777e300b, 0x77fe300b, 0xfffe300b, 0xfffe300b, 0x787e300b, + 0x78fe300b, 0x797e300b, 0x79fe300b, 0x7a7e300b, 0x7afe300b, 0x7b7e300b, + 0x7bfe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0x7c7e300b, 0x7cfe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0x7d7e300b, 0x7dfe300b, 0x7e7e300b, 0x7efe300b, 0x7f7e300b, + 0x7ffe300b, 0x807e300b, 0x80fe300b, 0x817e300b, 0x81fe300b, 0x827e300b, + 0x82fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x837e300b, + 0x83fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x847e300b, 0x84fe300b, + 0x857e300b, 0x85fe300b, 0x867e300b, 0x86fe300b, 0x877e300b, 0x87fe300b, + 0xfffe300b, 0x887e300b, 0x88fe300b, 0xfffe300b, 0xfffe300b, 0x897e300b, + 0x89fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0x8a7e300b, 0x8afe300b, 0x8b7e300b, 0x8bfe300b, 0x8c7e300b, + 0x8cfe300b, 0x8d7e300b, 0x8dfe300b, 0x8e7e300b, 0x8efe300b, 0x8f7e300b, + 0x8ffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0x907e300b, 0x90fe300b, 0x917e300b, 0x91fe300b, 0x927e300b, + 0x92fe300b, 0x937e300b, 0x93fe300b, 0x947e300b, 0x94fe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0x957e300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x95fe300b, + 0x967e300b, 0x96fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0x977e300b, 0x97fe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0x987e300b, 0x98fe300b, 0x997e300b, 0x99fe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, + 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb005, + 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00b, 0xfffeb005, 0xfffeb00f, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb001, 0xfffeb001, + 0x9a7eb000, 0x9afeb001, 0x9b7eb000, 0x9bfeb001, 0xfffeb002, 0xfffeb002, + 0xfffeb002, 0x9c7eb000, 0x9cfeb001, 0xfffeb002, 0x9d7eb000, 0x9dfeb001, + 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, + 0xfffeb00f, 0xfffeb00f, 0xfffeb00b, 0xfffeb00f, 0xfffeb000, 0xfffeb00f, + 0xfffeb00b, 0xfffeb00b, 0x9e7eb000, 0x9efeb001, 0xfffeb00b, 0xfffeb00b, + 0x9f7eb000, 0x9ffeb001, 0xa07eb000, 0xa0feb001, 0xa17eb000, 0xa1feb001, + 0xa27eb000, 0xa2feb001, 0xa37eb000, 0xa3feb001, 0xfffeb00f, 0xfffeb00f, + 0xfffeb00f, 0xfffeb00f, 0xfffeb005, 0xfffeb00b, 0xfffeb00f, 0xfffeb00f, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe330c, 0xffff3001, 0xffff3001, 0xfffe300c, 0xfffe300c, 0xfffe3044, + 0xfffe304c, 0xfffe304c, 0xa40eb000, 0xa490b001, 0xa512b000, 0xa594b001, + 0xa616b000, 0xa698b001, 0xa71ab000, 0xa79cb001, 0xa81eb000, 0xa8a0b001, + 0xfffe300c, 0xfffe300c, 0xa922b000, 0xa9a4b001, 0xaa7eb000, 0xaafeb001, + 0xab7eb000, 0xabfeb001, 0xac7eb000, 0xacfeb001, 0xfffe3004, 0xfffe3000, + 0xfffe3001, 0xfffe3001, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe2193, 0xfffe2193, 0xfffe2193, 0xfffe2193, 0xfffe2193, 0xfffe2193, + 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe300c, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, + 0xfffe3044, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe3044, + 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, + 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xffff3044, + 0xfffe304c, 0xffff3044, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, + 0xfffe3044, 0xfffe0024, 0xfffe0024, 0xfffe2193, 0xfffe2193, 0xfffe3004, + 0xfffe3004, 0xfffe3044, 0xfffe3044, 0xfffe304c, 0xfffe3004, 0xfffe3044, + 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, + 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, + 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, + 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3004, + 0xfffeb044, 0xfffe3044, 0xfffe3044, 0xfffe304c, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffeb04c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe3044, 0xfffe3044, + 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, + 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, + 0xfffe3044, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, + 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe300c, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0064, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0064, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304f, 0xfffe304f, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe300f, + 0xfffe3005, 0xfffe300f, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, + 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304b, 0xfffe304b, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffea193, 0xfffeb193, 0xfffeb193, 0xfffeb193, 0xfffeb00b, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb00b, 0xfffeb00b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, + 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, + 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb00b, 0xfffeb00b, + 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb249, 0xfffeb24b, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb010, 0xfffeb010, 0xfffeb005, 0xfffeb005, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, + 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, + 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04f, 0xfffeb04f, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb057, 0xfffeb057, + 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, + 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, + 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, + 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, + 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb053, 0xfffeb053, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, + 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, + 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffeb04b, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, + 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04f, + 0xfffeb04f, 0xfffeb04f, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, + 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, + 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, + 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb05e, + 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, + 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, + 0xfffeb053, 0xfffeb04f, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, + 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, + 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, + 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, + 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, + 0xfffe3059, 0xfffe3059, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe0024, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe0024, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, + 0xfffe301f, 0xfffe0024, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, + 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe0064, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe0024, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe300c, 0xfffe0024, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe0024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, + 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffeb08b, 0xfffea193, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb20b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffe80a4, + 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, + 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, + 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, + 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, + 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, + 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, + 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed800, 0xfffed801, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, + 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, + 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed964, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, + 0xfffed964, 0xfffed964, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, + 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, + 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, + 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, + 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, + 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed949, 0xfffed80b, + 0xfffed964, 0xfffed964, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, + 0xfffe3007, 0xfffe3001, 0xfffe3001, 0xfffe3007, 0xfffe3007, 0xfffe3005, + 0xfffe3005, 0xfffe3000, 0xfffe3001, 0xfffe300d, 0xfffe0024, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffea193, 0xfffea193, + 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, + 0xfffe8024, 0xfffe8024, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, + 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, + 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe300c, + 0xfffe300c, 0xfffe3000, 0xfffe3001, 0xfffe300c, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xffa6300c, 0xfffe31c1, 0xfffe300c, + 0xfffe31c1, 0xfffe0024, 0xfffe3004, 0xfffe31c4, 0xfffe3005, 0xfffe3005, + 0xfffe300c, 0xad7e3000, 0xadfe3001, 0xae7e3000, 0xaefe3001, 0xaf7e3000, + 0xaffe3001, 0xfffe324c, 0xfffe300c, 0xfffe300c, 0xfffe320c, 0xfffe320c, + 0xb07e300c, 0xb0fe300c, 0xfffe300c, 0xfffe0024, 0xfffe300c, 0xfffe3248, + 0xfffe3249, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed964, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, + 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed964, 0xfffe9a94, + 0xfffe0024, 0xffff3005, 0xfffe300c, 0xfffe324c, 0xfffe3248, 0xfffe3249, + 0xfffe300c, 0xfffe300c, 0xb1283000, 0xb1aa3001, 0xfffe300c, 0xfffe320c, + 0xffff31c1, 0xfffeb20c, 0xffff31c1, 0xfffe31cc, 0xfffe310c, 0xfffe310c, + 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, + 0xfffe310c, 0xfffe310c, 0xffff31c4, 0xffff3004, 0xb27e300c, 0xfffe300c, + 0xb2fe300c, 0xffff3005, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xb37eb000, + 0xfffe300c, 0xb3feb001, 0xfffe300c, 0xfffeb00c, 0xfffe300c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, + 0xfffe304c, 0xb42c3000, 0xfffe300c, 0xb4ae3001, 0xfffeb00c, 0xb57e3000, + 0xb5fe3001, 0xfffeb001, 0xb67eb000, 0xb6feb001, 0xfffeb001, 0xfffe3004, + 0xfffe304b, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, + 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe3044, 0xfffe3044, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, + 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, + 0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024, + 0xfffe0024, 0xfffe0024, 0xfffe3249, 0xfffe3248, 0xfffe300c, 0xfffe300c, + 0xfffe300c, 0xfffe3248, 0xfffe3248, 0xfffe0024, 0xfffe300b, 0xfffe300b, + 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, + 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, + 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe3013, 0xfffe3013, 0xfffe3013, + 0xfffe3011, 0xfffe3022, 0xfffe1aa4, 0xfffe1aa4, +}; + +const size_t kTextLayoutCodePropertiesSize = + FX_ArraySize(kTextLayoutCodeProperties); + +const uint16_t kFXTextLayoutVerticalMirror[] = { + 0xFE33, 0xFE32, 0xFE31, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xFE3F, + 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xFE3B, + 0xFE3C, 0xFE39, 0xFE3A, 0xFE34, 0xFE35, 0xFE36, 0xFE37, 0xFE38, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, +}; +const size_t kFXTextLayoutVerticalMirrorSize = + FX_ArraySize(kFXTextLayoutVerticalMirror); + +const uint16_t kFXTextLayoutBidiMirror[] = { + 0x0029, 0x0028, 0x003E, 0x003C, 0x005D, 0x005B, 0x007D, 0x007B, 0x00BB, + 0x00AB, 0x0F3B, 0x0F3A, 0x0F3D, 0x0F3C, 0x169C, 0x169B, 0x2019, 0x2018, + 0x201D, 0x201C, 0x203A, 0x2039, 0x2046, 0x2045, 0x207E, 0x207D, 0x208E, + 0x208D, 0x220B, 0x220C, 0x220D, 0x2208, 0x2209, 0x220A, 0x29F5, 0x223D, + 0x223C, 0x22CD, 0x2253, 0x2252, 0x2255, 0x2254, 0x2265, 0x2264, 0x2267, + 0x2266, 0x2269, 0x2268, 0x226B, 0x226A, 0x226F, 0x226E, 0x2271, 0x2270, + 0x2273, 0x2272, 0x2275, 0x2274, 0x2277, 0x2276, 0x2279, 0x2278, 0x227B, + 0x227A, 0x227D, 0x227C, 0x227F, 0x227E, 0x2281, 0x2280, 0x2283, 0x2282, + 0x2285, 0x2284, 0x2287, 0x2286, 0x2289, 0x2288, 0x228B, 0x228A, 0x2290, + 0x228F, 0x2292, 0x2291, 0x29B8, 0x22A3, 0x22A2, 0x2ADE, 0x2AE4, 0x2AE3, + 0x2AE5, 0x22B1, 0x22B0, 0x22B3, 0x22B2, 0x22B5, 0x22B4, 0x22B7, 0x22B6, + 0x22CA, 0x22C9, 0x22CC, 0x22CB, 0x2243, 0x22D1, 0x22D0, 0x22D7, 0x22D6, + 0x22D9, 0x22D8, 0x22DB, 0x22DA, 0x22DD, 0x22DC, 0x22DF, 0x22DE, 0x22E1, + 0x22E0, 0x22E3, 0x22E2, 0x22E5, 0x22E4, 0x22E7, 0x22E6, 0x22E9, 0x22E8, + 0x22EB, 0x22EA, 0x22ED, 0x22EC, 0x22F1, 0x22F0, 0x22FA, 0x22FB, 0x22FC, + 0x22FD, 0x22FE, 0x22F2, 0x22F3, 0x22F4, 0x22F6, 0x22F7, 0x2309, 0x2308, + 0x230B, 0x230A, 0x232A, 0x2329, 0x2769, 0x2768, 0x276B, 0x276A, 0x276D, + 0x276C, 0x276F, 0x276E, 0x2771, 0x2770, 0x2773, 0x2772, 0x2775, 0x2774, + 0x27C4, 0x27C3, 0x27C6, 0x27C5, 0x27C9, 0x27C8, 0x27D6, 0x27D5, 0x27DE, + 0x27DD, 0x27E3, 0x27E2, 0x27E5, 0x27E4, 0x27E7, 0x27E6, 0x27E9, 0x27E8, + 0x27EB, 0x27EA, 0x27ED, 0x27EC, 0x27EF, 0x27EE, 0x2984, 0x2983, 0x2986, + 0x2985, 0x2988, 0x2987, 0x298A, 0x2989, 0x298C, 0x298B, 0x2990, 0x298F, + 0x298E, 0x298D, 0x2992, 0x2991, 0x2994, 0x2993, 0x2996, 0x2995, 0x2998, + 0x2997, 0x2298, 0x29C1, 0x29C0, 0x29C5, 0x29C4, 0x29D0, 0x29CF, 0x29D2, + 0x29D1, 0x29D5, 0x29D4, 0x29D9, 0x29D8, 0x29DB, 0x29DA, 0x2215, 0x29F9, + 0x29F8, 0x29FD, 0x29FC, 0x2A2C, 0x2A2B, 0x2A2E, 0x2A2D, 0x2A35, 0x2A34, + 0x2A3D, 0x2A3C, 0x2A65, 0x2A64, 0x2A7A, 0x2A79, 0x2A7E, 0x2A7D, 0x2A80, + 0x2A7F, 0x2A82, 0x2A81, 0x2A84, 0x2A83, 0x2A8C, 0x2A8B, 0x2A92, 0x2A91, + 0x2A94, 0x2A93, 0x2A96, 0x2A95, 0x2A98, 0x2A97, 0x2A9A, 0x2A99, 0x2A9C, + 0x2A9B, 0x2AA2, 0x2AA1, 0x2AA7, 0x2AA6, 0x2AA9, 0x2AA8, 0x2AAB, 0x2AAA, + 0x2AAD, 0x2AAC, 0x2AB0, 0x2AAF, 0x2AB4, 0x2AB3, 0x2ABC, 0x2ABB, 0x2ABE, + 0x2ABD, 0x2AC0, 0x2ABF, 0x2AC2, 0x2AC1, 0x2AC4, 0x2AC3, 0x2AC6, 0x2AC5, + 0x2ACE, 0x2ACD, 0x2AD0, 0x2ACF, 0x2AD2, 0x2AD1, 0x2AD4, 0x2AD3, 0x2AD6, + 0x2AD5, 0x22A6, 0x22A9, 0x22A8, 0x22AB, 0x2AED, 0x2AEC, 0x2AF8, 0x2AF7, + 0x2AFA, 0x2AF9, 0x2E03, 0x2E02, 0x2E05, 0x2E04, 0x2E0A, 0x2E09, 0x2E0D, + 0x2E0C, 0x2E1D, 0x2E1C, 0x2E21, 0x2E20, 0x2E23, 0x2E22, 0x2E25, 0x2E24, + 0x2E27, 0x2E26, 0x2E29, 0x2E28, 0x3009, 0x3008, 0x300B, 0x300A, 0x300D, + 0x300C, 0x300F, 0x300E, 0x3011, 0x3010, 0x3015, 0x3014, 0x3017, 0x3016, + 0x3019, 0x3018, 0x301B, 0x301A, 0xFE5A, 0xFE59, 0xFE5C, 0xFE5B, 0xFE5E, + 0xFE5D, 0xFE65, 0xFE64, 0xFF09, 0xFF08, 0xFF1E, 0xFF1C, 0xFF3D, 0xFF3B, + 0xFF5D, 0xFF5B, 0xFF60, 0xFF5F, 0xFF63, 0xFF62, 0xFFFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, + 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, +}; + +const size_t kFXTextLayoutBidiMirrorSize = + FX_ArraySize(kFXTextLayoutBidiMirror); diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_unicode.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_unicode.cpp new file mode 100644 index 000000000000..e6f423e2afa0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_unicode.cpp @@ -0,0 +1,67 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fx_ucd.h" + +uint32_t FX_GetUnicodeProperties(FX_WCHAR wch) { + size_t idx = static_cast(wch); + if (idx < kTextLayoutCodePropertiesSize) + return kTextLayoutCodeProperties[(uint16_t)wch]; + return 0; +} + +#ifdef PDF_ENABLE_XFA +bool FX_IsCtrlCode(FX_WCHAR ch) { + uint32_t dwRet = (FX_GetUnicodeProperties(ch) & FX_CHARTYPEBITSMASK); + return dwRet == FX_CHARTYPE_Tab || dwRet == FX_CHARTYPE_Control; +} +#endif // PDF_ENABLE_XFA + +FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, bool bRTL, bool bVertical) { + uint32_t dwProps = FX_GetUnicodeProperties(wch); + uint32_t dwTemp = (dwProps & 0xFF800000); + if (bRTL && dwTemp < 0xFF800000) { + size_t idx = dwTemp >> 23; + if (idx < kFXTextLayoutBidiMirrorSize) { + wch = kFXTextLayoutBidiMirror[idx]; + dwProps = FX_GetUnicodeProperties(wch); + } + } + if (bVertical) { + dwTemp = (dwProps & 0x007E0000); + if (dwTemp < 0x007E0000) { + size_t idx = dwTemp >> 17; + if (idx < kFXTextLayoutVerticalMirrorSize) + wch = kFXTextLayoutVerticalMirror[idx]; + } + } + return wch; +} + +#ifdef PDF_ENABLE_XFA +FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, + uint32_t dwProps, + bool bRTL, + bool bVertical) { + uint32_t dwTemp = (dwProps & 0xFF800000); + if (bRTL && dwTemp < 0xFF800000) { + size_t idx = dwTemp >> 23; + if (idx < kFXTextLayoutBidiMirrorSize) { + wch = kFXTextLayoutBidiMirror[idx]; + dwProps = FX_GetUnicodeProperties(wch); + } + } + if (bVertical) { + dwTemp = (dwProps & 0x007E0000); + if (dwTemp < 0x007E0000) { + size_t idx = dwTemp >> 17; + if (idx < kFXTextLayoutVerticalMirrorSize) + wch = kFXTextLayoutVerticalMirror[idx]; + } + } + return wch; +} +#endif // PDF_ENABLE_XFA diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_xml.h b/modules/pdfium/pdfium/core/fxcrt/fx_xml.h new file mode 100644 index 000000000000..87f1915cb1a0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_xml.h @@ -0,0 +1,163 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FX_XML_H_ +#define CORE_FXCRT_FX_XML_H_ + +#include +#include + +#include "core/fxcrt/fx_basic.h" + +class CXML_AttrItem { + public: + bool Matches(const CFX_ByteString& space, const CFX_ByteString& name) const; + + CFX_ByteString m_QSpaceName; + CFX_ByteString m_AttrName; + CFX_WideString m_Value; +}; + +class CXML_AttrMap { + public: + CXML_AttrMap(); + ~CXML_AttrMap(); + + const CFX_WideString* Lookup(const CFX_ByteString& space, + const CFX_ByteString& name) const; + int GetSize() const; + CXML_AttrItem& GetAt(int index) const; + + void SetAt(const CFX_ByteString& space, + const CFX_ByteString& name, + const CFX_WideString& value); + + std::unique_ptr> m_pMap; +}; + +class CXML_Content { + public: + CXML_Content() : m_bCDATA(false), m_Content() {} + void Set(bool bCDATA, const CFX_WideStringC& content) { + m_bCDATA = bCDATA; + m_Content = content; + } + + bool m_bCDATA; + CFX_WideString m_Content; +}; + +class CXML_Element { + public: + enum ChildType { Invalid, Element, Content }; + + static std::unique_ptr Parse(const void* pBuffer, size_t size); + + CXML_Element(const CXML_Element* pParent, + const CFX_ByteStringC& qSpace, + const CFX_ByteStringC& tagname); + ~CXML_Element(); + + void Empty(); + CFX_ByteString GetTagName(bool bQualified = false) const; + CFX_ByteString GetNamespace(bool bQualified = false) const; + CFX_ByteString GetNamespaceURI(const CFX_ByteString& qName) const; + const CXML_Element* GetParent() const { return m_pParent; } + uint32_t CountAttrs() const { return m_AttrMap.GetSize(); } + void GetAttrByIndex(int index, + CFX_ByteString& space, + CFX_ByteString& name, + CFX_WideString& value) const; + bool HasAttr(const CFX_ByteStringC& qName) const; + bool GetAttrValue(const CFX_ByteStringC& name, + CFX_WideString& attribute) const; + CFX_WideString GetAttrValue(const CFX_ByteStringC& name) const { + CFX_WideString attr; + GetAttrValue(name, attr); + return attr; + } + + bool GetAttrValue(const CFX_ByteStringC& space, + const CFX_ByteStringC& name, + CFX_WideString& attribute) const; + CFX_WideString GetAttrValue(const CFX_ByteStringC& space, + const CFX_ByteStringC& name) const { + CFX_WideString attr; + GetAttrValue(space, name, attr); + return attr; + } + + bool GetAttrInteger(const CFX_ByteStringC& name, int& attribute) const; + int GetAttrInteger(const CFX_ByteStringC& name) const { + int attr = 0; + GetAttrInteger(name, attr); + return attr; + } + + bool GetAttrInteger(const CFX_ByteStringC& space, + const CFX_ByteStringC& name, + int& attribute) const; + int GetAttrInteger(const CFX_ByteStringC& space, + const CFX_ByteStringC& name) const { + int attr = 0; + GetAttrInteger(space, name, attr); + return attr; + } + + bool GetAttrFloat(const CFX_ByteStringC& name, FX_FLOAT& attribute) const; + FX_FLOAT GetAttrFloat(const CFX_ByteStringC& name) const { + FX_FLOAT attr = 0; + GetAttrFloat(name, attr); + return attr; + } + + bool GetAttrFloat(const CFX_ByteStringC& space, + const CFX_ByteStringC& name, + FX_FLOAT& attribute) const; + FX_FLOAT GetAttrFloat(const CFX_ByteStringC& space, + const CFX_ByteStringC& name) const { + FX_FLOAT attr = 0; + GetAttrFloat(space, name, attr); + return attr; + } + + uint32_t CountChildren() const { return m_Children.size(); } + ChildType GetChildType(uint32_t index) const; + CFX_WideString GetContent(uint32_t index) const; + CXML_Element* GetElement(uint32_t index) const; + CXML_Element* GetElement(const CFX_ByteStringC& space, + const CFX_ByteStringC& tag) const { + return GetElement(space, tag, 0); + } + + uint32_t CountElements(const CFX_ByteStringC& space, + const CFX_ByteStringC& tag) const; + CXML_Element* GetElement(const CFX_ByteStringC& space, + const CFX_ByteStringC& tag, + int index) const; + + uint32_t FindElement(CXML_Element* pChild) const; + void SetTag(const CFX_ByteStringC& qTagName); + void RemoveChildren(); + void RemoveChild(uint32_t index); + + protected: + struct ChildRecord { + ChildType type; + void* child; // CXML_Element and CXML_Content lack a common ancestor. + }; + + const CXML_Element* const m_pParent; + CFX_ByteString m_QSpaceName; + CFX_ByteString m_TagName; + CXML_AttrMap m_AttrMap; + std::vector m_Children; + + friend class CXML_Parser; + friend class CXML_Composer; +}; + +#endif // CORE_FXCRT_FX_XML_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_xml_composer.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_xml_composer.cpp new file mode 100644 index 000000000000..637d64cd82f6 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_xml_composer.cpp @@ -0,0 +1,33 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/xml_int.h" + +#include "core/fxcrt/fx_xml.h" + +void FX_XML_SplitQualifiedName(const CFX_ByteStringC& bsFullName, + CFX_ByteStringC& bsSpace, + CFX_ByteStringC& bsName) { + if (bsFullName.IsEmpty()) + return; + + FX_STRSIZE iStart = bsFullName.Find(':'); + if (iStart == -1) { + bsName = bsFullName; + } else { + bsSpace = bsFullName.Mid(0, iStart); + bsName = bsFullName.Mid(iStart + 1); + } +} + +void CXML_Element::SetTag(const CFX_ByteStringC& qTagName) { + ASSERT(!qTagName.IsEmpty()); + CFX_ByteStringC bsSpace; + CFX_ByteStringC bsName; + FX_XML_SplitQualifiedName(qTagName, bsSpace, bsName); + m_QSpaceName = bsSpace; + m_TagName = bsName; +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fx_xml_parser.cpp b/modules/pdfium/pdfium/core/fxcrt/fx_xml_parser.cpp new file mode 100644 index 000000000000..761aae777584 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fx_xml_parser.cpp @@ -0,0 +1,918 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include +#include +#include + +#include "core/fxcrt/fx_ext.h" +#include "core/fxcrt/fx_xml.h" +#include "core/fxcrt/xml_int.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +namespace { + +#define FXCRTM_XML_CHARTYPE_Normal 0x00 +#define FXCRTM_XML_CHARTYPE_SpaceChar 0x01 +#define FXCRTM_XML_CHARTYPE_Letter 0x02 +#define FXCRTM_XML_CHARTYPE_Digital 0x04 +#define FXCRTM_XML_CHARTYPE_NameIntro 0x08 +#define FXCRTM_XML_CHARTYPE_NameChar 0x10 +#define FXCRTM_XML_CHARTYPE_HexDigital 0x20 +#define FXCRTM_XML_CHARTYPE_HexLowerLetter 0x40 +#define FXCRTM_XML_CHARTYPE_HexUpperLetter 0x60 +#define FXCRTM_XML_CHARTYPE_HexChar 0x60 + +const uint8_t g_FXCRT_XML_ByteTypes[256] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, + 0x1A, 0x1A, 0x01, 0x01, +}; + +bool g_FXCRT_XML_IsWhiteSpace(uint8_t ch) { + return !!(g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_SpaceChar); +} + +bool g_FXCRT_XML_IsDigital(uint8_t ch) { + return !!(g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Digital); +} + +bool g_FXCRT_XML_IsNameIntro(uint8_t ch) { + return !!(g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameIntro); +} + +bool g_FXCRT_XML_IsNameChar(uint8_t ch) { + return !!(g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameChar); +} + +class CXML_DataBufAcc : public IFX_BufferedReadStream { + public: + template + friend CFX_RetainPtr pdfium::MakeRetain(Args&&... args); + + // IFX_BufferedReadStream + bool IsEOF() override; + FX_FILESIZE GetPosition() override; + size_t ReadBlock(void* buffer, size_t size) override; + bool ReadNextBlock(bool bRestart) override; + const uint8_t* GetBlockBuffer() override; + size_t GetBlockSize() override; + FX_FILESIZE GetBlockOffset() override; + + private: + CXML_DataBufAcc(const uint8_t* pBuffer, size_t size); + ~CXML_DataBufAcc() override; + + const uint8_t* m_pBuffer; + size_t m_dwSize; + size_t m_dwCurPos; +}; + +CXML_DataBufAcc::CXML_DataBufAcc(const uint8_t* pBuffer, size_t size) + : m_pBuffer(pBuffer), m_dwSize(size), m_dwCurPos(0) {} + +CXML_DataBufAcc::~CXML_DataBufAcc() {} + +bool CXML_DataBufAcc::IsEOF() { + return m_dwCurPos >= m_dwSize; +} + +FX_FILESIZE CXML_DataBufAcc::GetPosition() { + return static_cast(m_dwCurPos); +} + +size_t CXML_DataBufAcc::ReadBlock(void* buffer, size_t size) { + return 0; +} + +bool CXML_DataBufAcc::ReadNextBlock(bool bRestart) { + if (bRestart) + m_dwCurPos = 0; + + if (m_dwCurPos < m_dwSize) { + m_dwCurPos = m_dwSize; + return true; + } + return false; +} + +const uint8_t* CXML_DataBufAcc::GetBlockBuffer() { + return m_pBuffer; +} + +size_t CXML_DataBufAcc::GetBlockSize() { + return m_dwSize; +} + +FX_FILESIZE CXML_DataBufAcc::GetBlockOffset() { + return 0; +} + +class CXML_DataStmAcc : public IFX_BufferedReadStream { + public: + template + friend CFX_RetainPtr pdfium::MakeRetain(Args&&... args); + + // IFX_BufferedReadStream + bool IsEOF() override; + FX_FILESIZE GetPosition() override; + size_t ReadBlock(void* buffer, size_t size) override; + bool ReadNextBlock(bool bRestart) override; + const uint8_t* GetBlockBuffer() override; + size_t GetBlockSize() override; + FX_FILESIZE GetBlockOffset() override; + + private: + explicit CXML_DataStmAcc( + const CFX_RetainPtr& pFileRead); + ~CXML_DataStmAcc() override; + + CFX_RetainPtr m_pFileRead; + uint8_t* m_pBuffer; + FX_FILESIZE m_nStart; + size_t m_dwSize; +}; + +CXML_DataStmAcc::CXML_DataStmAcc( + const CFX_RetainPtr& pFileRead) + : m_pFileRead(pFileRead), m_pBuffer(nullptr), m_nStart(0), m_dwSize(0) { + ASSERT(m_pFileRead); +} + +CXML_DataStmAcc::~CXML_DataStmAcc() { + FX_Free(m_pBuffer); +} + +bool CXML_DataStmAcc::IsEOF() { + return m_nStart + static_cast(m_dwSize) >= + m_pFileRead->GetSize(); +} + +FX_FILESIZE CXML_DataStmAcc::GetPosition() { + return m_nStart + static_cast(m_dwSize); +} + +size_t CXML_DataStmAcc::ReadBlock(void* buffer, size_t size) { + return 0; +} + +bool CXML_DataStmAcc::ReadNextBlock(bool bRestart) { + if (bRestart) + m_nStart = 0; + + FX_FILESIZE nLength = m_pFileRead->GetSize(); + m_nStart += static_cast(m_dwSize); + if (m_nStart >= nLength) + return false; + + static const FX_FILESIZE FX_XMLDATASTREAM_BufferSize = 32 * 1024; + m_dwSize = static_cast( + std::min(FX_XMLDATASTREAM_BufferSize, nLength - m_nStart)); + if (!m_pBuffer) + m_pBuffer = FX_Alloc(uint8_t, m_dwSize); + + return m_pFileRead->ReadBlock(m_pBuffer, m_nStart, m_dwSize); +} + +const uint8_t* CXML_DataStmAcc::GetBlockBuffer() { + return (const uint8_t*)m_pBuffer; +} + +size_t CXML_DataStmAcc::GetBlockSize() { + return m_dwSize; +} + +FX_FILESIZE CXML_DataStmAcc::GetBlockOffset() { + return m_nStart; +} + +} // namespace + +CXML_Parser::CXML_Parser() + : m_nOffset(0), + m_pBuffer(nullptr), + m_dwBufferSize(0), + m_nBufferOffset(0), + m_dwIndex(0) {} + +CXML_Parser::~CXML_Parser() {} + +bool CXML_Parser::Init(const uint8_t* pBuffer, size_t size) { + m_pDataAcc = pdfium::MakeRetain(pBuffer, size); + m_nOffset = 0; + return ReadNextBlock(); +} + +bool CXML_Parser::ReadNextBlock() { + if (!m_pDataAcc->ReadNextBlock()) + return false; + + m_pBuffer = m_pDataAcc->GetBlockBuffer(); + m_dwBufferSize = m_pDataAcc->GetBlockSize(); + m_nBufferOffset = m_pDataAcc->GetBlockOffset(); + m_dwIndex = 0; + return m_dwBufferSize > 0; +} + +bool CXML_Parser::IsEOF() { + return m_pDataAcc->IsEOF() && m_dwIndex >= m_dwBufferSize; +} + +void CXML_Parser::SkipWhiteSpaces() { + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (IsEOF()) + return; + + do { + while (m_dwIndex < m_dwBufferSize && + g_FXCRT_XML_IsWhiteSpace(m_pBuffer[m_dwIndex])) { + m_dwIndex++; + } + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (m_dwIndex < m_dwBufferSize || IsEOF()) + break; + } while (ReadNextBlock()); +} + +void CXML_Parser::GetName(CFX_ByteString* space, CFX_ByteString* name) { + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (IsEOF()) + return; + + CFX_ByteTextBuf buf; + uint8_t ch; + do { + while (m_dwIndex < m_dwBufferSize) { + ch = m_pBuffer[m_dwIndex]; + if (ch == ':') { + *space = buf.AsStringC(); + buf.Clear(); + } else if (g_FXCRT_XML_IsNameChar(ch)) { + buf.AppendChar(ch); + } else { + break; + } + m_dwIndex++; + } + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (m_dwIndex < m_dwBufferSize || IsEOF()) + break; + } while (ReadNextBlock()); + *name = buf.AsStringC(); +} + +void CXML_Parser::SkipLiterals(const CFX_ByteStringC& str) { + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (IsEOF()) { + return; + } + int32_t i = 0, iLen = str.GetLength(); + do { + while (m_dwIndex < m_dwBufferSize) { + if (str.GetAt(i) != m_pBuffer[m_dwIndex++]) { + i = 0; + continue; + } + i++; + if (i == iLen) + break; + } + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (i == iLen) + return; + + if (m_dwIndex < m_dwBufferSize || IsEOF()) + break; + } while (ReadNextBlock()); + while (!m_pDataAcc->IsEOF()) { + ReadNextBlock(); + m_nOffset = m_nBufferOffset + static_cast(m_dwBufferSize); + } + m_dwIndex = m_dwBufferSize; +} + +uint32_t CXML_Parser::GetCharRef() { + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (IsEOF()) + return 0; + + uint8_t ch; + int32_t iState = 0; + CFX_ByteTextBuf buf; + uint32_t code = 0; + do { + while (m_dwIndex < m_dwBufferSize) { + ch = m_pBuffer[m_dwIndex]; + switch (iState) { + case 0: + if (ch == '#') { + m_dwIndex++; + iState = 2; + break; + } + iState = 1; + case 1: + m_dwIndex++; + if (ch == ';') { + CFX_ByteStringC ref = buf.AsStringC(); + if (ref == "gt") + code = '>'; + else if (ref == "lt") + code = '<'; + else if (ref == "amp") + code = '&'; + else if (ref == "apos") + code = '\''; + else if (ref == "quot") + code = '"'; + iState = 10; + break; + } + buf.AppendByte(ch); + break; + case 2: + if (ch == 'x') { + m_dwIndex++; + iState = 4; + break; + } + iState = 3; + case 3: + m_dwIndex++; + if (ch == ';') { + iState = 10; + break; + } + if (g_FXCRT_XML_IsDigital(ch)) + code = code * 10 + FXSYS_toDecimalDigit(static_cast(ch)); + break; + case 4: + m_dwIndex++; + if (ch == ';') { + iState = 10; + break; + } + uint8_t nHex = + g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar; + if (nHex) { + if (nHex == FXCRTM_XML_CHARTYPE_HexDigital) { + code = + (code << 4) + FXSYS_toDecimalDigit(static_cast(ch)); + } else if (nHex == FXCRTM_XML_CHARTYPE_HexLowerLetter) { + code = (code << 4) + ch - 87; + } else { + code = (code << 4) + ch - 55; + } + } + break; + } + if (iState == 10) + break; + } + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) { + break; + } + } while (ReadNextBlock()); + return code; +} + +void CXML_Parser::GetAttrValue(CFX_WideString& value) { + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (IsEOF()) + return; + + CFX_UTF8Decoder decoder; + uint8_t mark = 0, ch = 0; + do { + while (m_dwIndex < m_dwBufferSize) { + ch = m_pBuffer[m_dwIndex]; + if (mark == 0) { + if (ch != '\'' && ch != '"') + return; + + mark = ch; + m_dwIndex++; + ch = 0; + continue; + } + m_dwIndex++; + if (ch == mark) + break; + + if (ch == '&') { + decoder.AppendChar(GetCharRef()); + if (IsEOF()) { + value = decoder.GetResult(); + return; + } + } else { + decoder.Input(ch); + } + } + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (ch == mark || m_dwIndex < m_dwBufferSize || IsEOF()) + break; + } while (ReadNextBlock()); + value = decoder.GetResult(); +} + +void CXML_Parser::GetTagName(bool bStartTag, + bool* bEndTag, + CFX_ByteString* space, + CFX_ByteString* name) { + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (IsEOF()) + return; + + *bEndTag = false; + uint8_t ch; + int32_t iState = bStartTag ? 1 : 0; + do { + while (m_dwIndex < m_dwBufferSize) { + ch = m_pBuffer[m_dwIndex]; + switch (iState) { + case 0: + m_dwIndex++; + if (ch != '<') + break; + + iState = 1; + break; + case 1: + if (ch == '?') { + m_dwIndex++; + SkipLiterals("?>"); + iState = 0; + break; + } + if (ch == '!') { + m_dwIndex++; + SkipLiterals("-->"); + iState = 0; + break; + } + if (ch == '/') { + m_dwIndex++; + GetName(space, name); + *bEndTag = true; + } else { + GetName(space, name); + *bEndTag = false; + } + return; + } + } + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (m_dwIndex < m_dwBufferSize || IsEOF()) + break; + } while (ReadNextBlock()); +} + +std::unique_ptr CXML_Parser::ParseElement(CXML_Element* pParent, + bool bStartTag) { + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (IsEOF()) + return nullptr; + + CFX_ByteString tag_name; + CFX_ByteString tag_space; + bool bEndTag; + GetTagName(bStartTag, &bEndTag, &tag_space, &tag_name); + if (tag_name.IsEmpty() || bEndTag) + return nullptr; + + auto pElement = pdfium::MakeUnique( + pParent, tag_space.AsStringC(), tag_name.AsStringC()); + do { + CFX_ByteString attr_space; + CFX_ByteString attr_name; + while (m_dwIndex < m_dwBufferSize) { + SkipWhiteSpaces(); + if (IsEOF()) + break; + + if (!g_FXCRT_XML_IsNameIntro(m_pBuffer[m_dwIndex])) + break; + + GetName(&attr_space, &attr_name); + SkipWhiteSpaces(); + if (IsEOF()) + break; + + if (m_pBuffer[m_dwIndex] != '=') + break; + + m_dwIndex++; + SkipWhiteSpaces(); + if (IsEOF()) + break; + + CFX_WideString attr_value; + GetAttrValue(attr_value); + pElement->m_AttrMap.SetAt(attr_space, attr_name, attr_value); + } + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (m_dwIndex < m_dwBufferSize || IsEOF()) + break; + } while (ReadNextBlock()); + SkipWhiteSpaces(); + if (IsEOF()) + return pElement; + + uint8_t ch = m_pBuffer[m_dwIndex++]; + if (ch == '/') { + m_dwIndex++; + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + return pElement; + } + if (ch != '>') { + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + return nullptr; + } + SkipWhiteSpaces(); + if (IsEOF()) + return pElement; + + CFX_UTF8Decoder decoder; + CFX_WideTextBuf content; + bool bCDATA = false; + int32_t iState = 0; + do { + while (m_dwIndex < m_dwBufferSize) { + ch = m_pBuffer[m_dwIndex++]; + switch (iState) { + case 0: + if (ch == '<') { + iState = 1; + } else if (ch == '&') { + decoder.ClearStatus(); + decoder.AppendChar(GetCharRef()); + } else { + decoder.Input(ch); + } + break; + case 1: + if (ch == '!') { + iState = 2; + } else if (ch == '?') { + SkipLiterals("?>"); + SkipWhiteSpaces(); + iState = 0; + } else if (ch == '/') { + CFX_ByteString space; + CFX_ByteString name; + GetName(&space, &name); + SkipWhiteSpaces(); + m_dwIndex++; + iState = 10; + } else { + content << decoder.GetResult(); + CFX_WideString dataStr = content.MakeString(); + if (!bCDATA) + dataStr.TrimRight(L" \t\r\n"); + + InsertContentSegment(bCDATA, dataStr.AsStringC(), pElement.get()); + content.Clear(); + decoder.Clear(); + bCDATA = false; + iState = 0; + m_dwIndex--; + std::unique_ptr pSubElement( + ParseElement(pElement.get(), true)); + if (!pSubElement) + break; + + pElement->m_Children.push_back( + {CXML_Element::Element, pSubElement.release()}); + SkipWhiteSpaces(); + } + break; + case 2: + if (ch == '[') { + SkipLiterals("]]>"); + } else if (ch == '-') { + m_dwIndex++; + SkipLiterals("-->"); + } else { + SkipLiterals(">"); + } + decoder.Clear(); + SkipWhiteSpaces(); + iState = 0; + break; + } + if (iState == 10) { + break; + } + } + m_nOffset = m_nBufferOffset + static_cast(m_dwIndex); + if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) + break; + } while (ReadNextBlock()); + content << decoder.GetResult(); + CFX_WideString dataStr = content.MakeString(); + dataStr.TrimRight(L" \t\r\n"); + + InsertContentSegment(bCDATA, dataStr.AsStringC(), pElement.get()); + content.Clear(); + decoder.Clear(); + bCDATA = false; + return pElement; +} + +void CXML_Parser::InsertContentSegment(bool bCDATA, + const CFX_WideStringC& content, + CXML_Element* pElement) { + if (content.IsEmpty()) + return; + + CXML_Content* pContent = new CXML_Content; + pContent->Set(bCDATA, content); + pElement->m_Children.push_back({CXML_Element::Content, pContent}); +} + +std::unique_ptr CXML_Element::Parse(const void* pBuffer, + size_t size) { + CXML_Parser parser; + if (!parser.Init(static_cast(pBuffer), size)) + return nullptr; + return parser.ParseElement(nullptr, false); +} + +CXML_Element::CXML_Element(const CXML_Element* pParent, + const CFX_ByteStringC& qSpace, + const CFX_ByteStringC& tagname) + : m_pParent(pParent), m_QSpaceName(qSpace), m_TagName(tagname) {} + +CXML_Element::~CXML_Element() { + Empty(); +} + +void CXML_Element::Empty() { + RemoveChildren(); +} +void CXML_Element::RemoveChildren() { + for (const ChildRecord& record : m_Children) { + if (record.type == Content) { + delete static_cast(record.child); + } else if (record.type == Element) { + CXML_Element* child = static_cast(record.child); + child->RemoveChildren(); + delete child; + } + } + m_Children.clear(); +} +CFX_ByteString CXML_Element::GetTagName(bool bQualified) const { + if (!bQualified || m_QSpaceName.IsEmpty()) { + return m_TagName; + } + CFX_ByteString bsTag = m_QSpaceName; + bsTag += ":"; + bsTag += m_TagName; + return bsTag; +} + +CFX_ByteString CXML_Element::GetNamespace(bool bQualified) const { + return bQualified ? m_QSpaceName : GetNamespaceURI(m_QSpaceName); +} + +CFX_ByteString CXML_Element::GetNamespaceURI( + const CFX_ByteString& qName) const { + const CFX_WideString* pwsSpace; + const CXML_Element* pElement = this; + do { + if (qName.IsEmpty()) + pwsSpace = pElement->m_AttrMap.Lookup("", "xmlns"); + else + pwsSpace = pElement->m_AttrMap.Lookup("xmlns", qName); + if (pwsSpace) + break; + + pElement = pElement->GetParent(); + } while (pElement); + return pwsSpace ? pwsSpace->UTF8Encode() : CFX_ByteString(); +} + +void CXML_Element::GetAttrByIndex(int index, + CFX_ByteString& space, + CFX_ByteString& name, + CFX_WideString& value) const { + if (index < 0 || index >= m_AttrMap.GetSize()) + return; + + CXML_AttrItem& item = m_AttrMap.GetAt(index); + space = item.m_QSpaceName; + name = item.m_AttrName; + value = item.m_Value; +} + +bool CXML_Element::HasAttr(const CFX_ByteStringC& name) const { + CFX_ByteStringC bsSpace; + CFX_ByteStringC bsName; + FX_XML_SplitQualifiedName(name, bsSpace, bsName); + return !!m_AttrMap.Lookup(CFX_ByteString(bsSpace), CFX_ByteString(bsName)); +} + +bool CXML_Element::GetAttrValue(const CFX_ByteStringC& name, + CFX_WideString& attribute) const { + CFX_ByteStringC bsSpace; + CFX_ByteStringC bsName; + FX_XML_SplitQualifiedName(name, bsSpace, bsName); + return GetAttrValue(bsSpace, bsName, attribute); +} + +bool CXML_Element::GetAttrValue(const CFX_ByteStringC& space, + const CFX_ByteStringC& name, + CFX_WideString& attribute) const { + const CFX_WideString* pValue = + m_AttrMap.Lookup(CFX_ByteString(space), CFX_ByteString(name)); + if (!pValue) + return false; + + attribute = *pValue; + return true; +} + +bool CXML_Element::GetAttrInteger(const CFX_ByteStringC& name, + int& attribute) const { + CFX_ByteStringC bsSpace; + CFX_ByteStringC bsName; + FX_XML_SplitQualifiedName(name, bsSpace, bsName); + const CFX_WideString* pwsValue = + m_AttrMap.Lookup(CFX_ByteString(bsSpace), CFX_ByteString(bsName)); + if (!pwsValue) + return false; + + attribute = pwsValue->GetInteger(); + return true; +} + +bool CXML_Element::GetAttrInteger(const CFX_ByteStringC& space, + const CFX_ByteStringC& name, + int& attribute) const { + const CFX_WideString* pwsValue = + m_AttrMap.Lookup(CFX_ByteString(space), CFX_ByteString(name)); + if (!pwsValue) + return false; + + attribute = pwsValue->GetInteger(); + return true; +} + +bool CXML_Element::GetAttrFloat(const CFX_ByteStringC& name, + FX_FLOAT& attribute) const { + CFX_ByteStringC bsSpace; + CFX_ByteStringC bsName; + FX_XML_SplitQualifiedName(name, bsSpace, bsName); + return GetAttrFloat(bsSpace, bsName, attribute); +} + +bool CXML_Element::GetAttrFloat(const CFX_ByteStringC& space, + const CFX_ByteStringC& name, + FX_FLOAT& attribute) const { + const CFX_WideString* pValue = + m_AttrMap.Lookup(CFX_ByteString(space), CFX_ByteString(name)); + if (!pValue) + return false; + + attribute = pValue->GetFloat(); + return true; +} + +CXML_Element::ChildType CXML_Element::GetChildType(uint32_t index) const { + return index < m_Children.size() ? m_Children[index].type : Invalid; +} + +CFX_WideString CXML_Element::GetContent(uint32_t index) const { + if (index < m_Children.size() && m_Children[index].type == Content) { + CXML_Content* pContent = + static_cast(m_Children[index].child); + if (pContent) + return pContent->m_Content; + } + return CFX_WideString(); +} + +CXML_Element* CXML_Element::GetElement(uint32_t index) const { + if (index < m_Children.size() && m_Children[index].type == Element) + return static_cast(m_Children[index].child); + return nullptr; +} + +uint32_t CXML_Element::CountElements(const CFX_ByteStringC& space, + const CFX_ByteStringC& tag) const { + int count = 0; + for (const ChildRecord& record : m_Children) { + if (record.type != Element) + continue; + + CXML_Element* pKid = static_cast(record.child); + if ((space.IsEmpty() || pKid->m_QSpaceName == space) && + pKid->m_TagName == tag) { + count++; + } + } + return count; +} + +CXML_Element* CXML_Element::GetElement(const CFX_ByteStringC& space, + const CFX_ByteStringC& tag, + int index) const { + if (index < 0) + return nullptr; + + for (const ChildRecord& record : m_Children) { + if (record.type != Element) + continue; + + CXML_Element* pKid = static_cast(record.child); + if ((space.IsEmpty() || pKid->m_QSpaceName == space) && + pKid->m_TagName == tag) { + if (index-- == 0) + return pKid; + } + } + return nullptr; +} + +uint32_t CXML_Element::FindElement(CXML_Element* pChild) const { + int index = 0; + for (const ChildRecord& record : m_Children) { + if (record.type == Element && + static_cast(record.child) == pChild) { + return index; + } + ++index; + } + return (uint32_t)-1; +} + +bool CXML_AttrItem::Matches(const CFX_ByteString& space, + const CFX_ByteString& name) const { + return (space.IsEmpty() || m_QSpaceName == space) && m_AttrName == name; +} + +CXML_AttrMap::CXML_AttrMap() {} + +CXML_AttrMap::~CXML_AttrMap() {} + +const CFX_WideString* CXML_AttrMap::Lookup(const CFX_ByteString& space, + const CFX_ByteString& name) const { + if (!m_pMap) + return nullptr; + + for (const auto& item : *m_pMap) { + if (item.Matches(space, name)) + return &item.m_Value; + } + return nullptr; +} + +void CXML_AttrMap::SetAt(const CFX_ByteString& space, + const CFX_ByteString& name, + const CFX_WideString& value) { + if (!m_pMap) + m_pMap = pdfium::MakeUnique>(); + + for (CXML_AttrItem& item : *m_pMap) { + if (item.Matches(space, name)) { + item.m_Value = value; + return; + } + } + + m_pMap->push_back({space, name, CFX_WideString(value)}); +} + +int CXML_AttrMap::GetSize() const { + return m_pMap ? pdfium::CollectionSize(*m_pMap) : 0; +} + +CXML_AttrItem& CXML_AttrMap::GetAt(int index) const { + return (*m_pMap)[index]; +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fxcrt_posix.cpp b/modules/pdfium/pdfium/core/fxcrt/fxcrt_posix.cpp new file mode 100644 index 000000000000..a96f164c7f16 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fxcrt_posix.cpp @@ -0,0 +1,137 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fxcrt_posix.h" + +#include "core/fxcrt/fx_basic.h" + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || \ + _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || \ + _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ + +// static +IFXCRT_FileAccess* IFXCRT_FileAccess::Create() { + return new CFXCRT_FileAccess_Posix; +} + +void FXCRT_Posix_GetFileMode(uint32_t dwModes, + int32_t& nFlags, + int32_t& nMasks) { + nFlags = O_BINARY | O_LARGEFILE; + if (dwModes & FX_FILEMODE_ReadOnly) { + nFlags |= O_RDONLY; + nMasks = 0; + } else { + nFlags |= O_RDWR | O_CREAT; + if (dwModes & FX_FILEMODE_Truncate) { + nFlags |= O_TRUNC; + } + nMasks = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; + } +} +CFXCRT_FileAccess_Posix::CFXCRT_FileAccess_Posix() : m_nFD(-1) {} +CFXCRT_FileAccess_Posix::~CFXCRT_FileAccess_Posix() { + Close(); +} + +bool CFXCRT_FileAccess_Posix::Open(const CFX_ByteStringC& fileName, + uint32_t dwMode) { + if (m_nFD > -1) + return false; + + int32_t nFlags; + int32_t nMasks; + FXCRT_Posix_GetFileMode(dwMode, nFlags, nMasks); + m_nFD = open(fileName.c_str(), nFlags, nMasks); + return m_nFD > -1; +} + +bool CFXCRT_FileAccess_Posix::Open(const CFX_WideStringC& fileName, + uint32_t dwMode) { + return Open(FX_UTF8Encode(fileName).AsStringC(), dwMode); +} + +void CFXCRT_FileAccess_Posix::Close() { + if (m_nFD < 0) { + return; + } + close(m_nFD); + m_nFD = -1; +} +FX_FILESIZE CFXCRT_FileAccess_Posix::GetSize() const { + if (m_nFD < 0) { + return 0; + } + struct stat s; + FXSYS_memset(&s, 0, sizeof(s)); + fstat(m_nFD, &s); + return s.st_size; +} +FX_FILESIZE CFXCRT_FileAccess_Posix::GetPosition() const { + if (m_nFD < 0) { + return (FX_FILESIZE)-1; + } + return lseek(m_nFD, 0, SEEK_CUR); +} +FX_FILESIZE CFXCRT_FileAccess_Posix::SetPosition(FX_FILESIZE pos) { + if (m_nFD < 0) { + return (FX_FILESIZE)-1; + } + return lseek(m_nFD, pos, SEEK_SET); +} +size_t CFXCRT_FileAccess_Posix::Read(void* pBuffer, size_t szBuffer) { + if (m_nFD < 0) { + return 0; + } + return read(m_nFD, pBuffer, szBuffer); +} +size_t CFXCRT_FileAccess_Posix::Write(const void* pBuffer, size_t szBuffer) { + if (m_nFD < 0) { + return 0; + } + return write(m_nFD, pBuffer, szBuffer); +} +size_t CFXCRT_FileAccess_Posix::ReadPos(void* pBuffer, + size_t szBuffer, + FX_FILESIZE pos) { + if (m_nFD < 0) { + return 0; + } + if (pos >= GetSize()) { + return 0; + } + if (SetPosition(pos) == (FX_FILESIZE)-1) { + return 0; + } + return Read(pBuffer, szBuffer); +} +size_t CFXCRT_FileAccess_Posix::WritePos(const void* pBuffer, + size_t szBuffer, + FX_FILESIZE pos) { + if (m_nFD < 0) { + return 0; + } + if (SetPosition(pos) == (FX_FILESIZE)-1) { + return 0; + } + return Write(pBuffer, szBuffer); +} + +bool CFXCRT_FileAccess_Posix::Flush() { + if (m_nFD < 0) + return false; + + return fsync(m_nFD) > -1; +} + +bool CFXCRT_FileAccess_Posix::Truncate(FX_FILESIZE szFile) { + if (m_nFD < 0) + return false; + + return !ftruncate(m_nFD, szFile); +} + +#endif diff --git a/modules/pdfium/pdfium/core/fxcrt/fxcrt_posix.h b/modules/pdfium/pdfium/core/fxcrt/fxcrt_posix.h new file mode 100644 index 000000000000..20faa5c02f0e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fxcrt_posix.h @@ -0,0 +1,41 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FXCRT_POSIX_H_ +#define CORE_FXCRT_FXCRT_POSIX_H_ + +#include "core/fxcrt/extension.h" + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || \ + _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || \ + _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ +class CFXCRT_FileAccess_Posix : public IFXCRT_FileAccess { + public: + CFXCRT_FileAccess_Posix(); + ~CFXCRT_FileAccess_Posix() override; + + // IFXCRT_FileAccess: + bool Open(const CFX_ByteStringC& fileName, uint32_t dwMode) override; + bool Open(const CFX_WideStringC& fileName, uint32_t dwMode) override; + void Close() override; + FX_FILESIZE GetSize() const override; + FX_FILESIZE GetPosition() const override; + FX_FILESIZE SetPosition(FX_FILESIZE pos) override; + size_t Read(void* pBuffer, size_t szBuffer) override; + size_t Write(const void* pBuffer, size_t szBuffer) override; + size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos) override; + size_t WritePos(const void* pBuffer, + size_t szBuffer, + FX_FILESIZE pos) override; + bool Flush() override; + bool Truncate(FX_FILESIZE szFile) override; + + protected: + int32_t m_nFD; +}; +#endif + +#endif // CORE_FXCRT_FXCRT_POSIX_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/fxcrt_stream.cpp b/modules/pdfium/pdfium/core/fxcrt/fxcrt_stream.cpp new file mode 100644 index 000000000000..3afe6323b282 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fxcrt_stream.cpp @@ -0,0 +1,27 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fx_stream.h" + +bool IFX_SeekableWriteStream::WriteBlock(const void* pData, size_t size) { + return WriteBlock(pData, GetSize(), size); +} + +bool IFX_SeekableReadStream::IsEOF() { + return false; +} + +FX_FILESIZE IFX_SeekableReadStream::GetPosition() { + return 0; +} + +size_t IFX_SeekableReadStream::ReadBlock(void* buffer, size_t size) { + return 0; +} + +bool IFX_SeekableStream::WriteBlock(const void* buffer, size_t size) { + return WriteBlock(buffer, GetSize(), size); +} diff --git a/modules/pdfium/pdfium/core/fxcrt/fxcrt_windows.cpp b/modules/pdfium/pdfium/core/fxcrt/fxcrt_windows.cpp new file mode 100644 index 000000000000..638338706e2c --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fxcrt_windows.cpp @@ -0,0 +1,188 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fxcrt_windows.h" + +#include "core/fxcrt/fx_string.h" + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + +// static +IFXCRT_FileAccess* IFXCRT_FileAccess::Create() { + return new CFXCRT_FileAccess_Win64; +} + +void FXCRT_Windows_GetFileMode(uint32_t dwMode, + uint32_t& dwAccess, + uint32_t& dwShare, + uint32_t& dwCreation) { + dwAccess = GENERIC_READ; + dwShare = FILE_SHARE_READ | FILE_SHARE_WRITE; + if (!(dwMode & FX_FILEMODE_ReadOnly)) { + dwAccess |= GENERIC_WRITE; + dwCreation = (dwMode & FX_FILEMODE_Truncate) ? CREATE_ALWAYS : OPEN_ALWAYS; + } else { + dwCreation = OPEN_EXISTING; + } +} + +#ifdef __cplusplus +extern "C" { +#endif +WINBASEAPI BOOL WINAPI GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize); +WINBASEAPI BOOL WINAPI SetFilePointerEx(HANDLE hFile, + LARGE_INTEGER liDistanceToMove, + PLARGE_INTEGER lpNewFilePointer, + DWORD dwMoveMethod); +#ifdef __cplusplus +} +#endif + +CFXCRT_FileAccess_Win64::CFXCRT_FileAccess_Win64() : m_hFile(nullptr) {} + +CFXCRT_FileAccess_Win64::~CFXCRT_FileAccess_Win64() { + Close(); +} + +bool CFXCRT_FileAccess_Win64::Open(const CFX_ByteStringC& fileName, + uint32_t dwMode) { + if (m_hFile) + return false; + + uint32_t dwAccess, dwShare, dwCreation; + FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation); + m_hFile = ::CreateFileA(fileName.c_str(), dwAccess, dwShare, nullptr, + dwCreation, FILE_ATTRIBUTE_NORMAL, nullptr); + if (m_hFile == INVALID_HANDLE_VALUE) + m_hFile = nullptr; + + return !!m_hFile; +} + +bool CFXCRT_FileAccess_Win64::Open(const CFX_WideStringC& fileName, + uint32_t dwMode) { + if (m_hFile) + return false; + + uint32_t dwAccess, dwShare, dwCreation; + FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation); + m_hFile = ::CreateFileW((LPCWSTR)fileName.c_str(), dwAccess, dwShare, nullptr, + dwCreation, FILE_ATTRIBUTE_NORMAL, nullptr); + if (m_hFile == INVALID_HANDLE_VALUE) + m_hFile = nullptr; + + return !!m_hFile; +} + +void CFXCRT_FileAccess_Win64::Close() { + if (!m_hFile) + return; + + ::CloseHandle(m_hFile); + m_hFile = nullptr; +} + +FX_FILESIZE CFXCRT_FileAccess_Win64::GetSize() const { + if (!m_hFile) + return 0; + + LARGE_INTEGER size = {}; + if (!::GetFileSizeEx(m_hFile, &size)) + return 0; + + return (FX_FILESIZE)size.QuadPart; +} + +FX_FILESIZE CFXCRT_FileAccess_Win64::GetPosition() const { + if (!m_hFile) + return (FX_FILESIZE)-1; + + LARGE_INTEGER dist = {}; + LARGE_INTEGER newPos = {}; + if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_CURRENT)) + return (FX_FILESIZE)-1; + + return (FX_FILESIZE)newPos.QuadPart; +} + +FX_FILESIZE CFXCRT_FileAccess_Win64::SetPosition(FX_FILESIZE pos) { + if (!m_hFile) + return (FX_FILESIZE)-1; + + LARGE_INTEGER dist; + dist.QuadPart = pos; + LARGE_INTEGER newPos = {}; + if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_BEGIN)) + return (FX_FILESIZE)-1; + + return (FX_FILESIZE)newPos.QuadPart; +} + +size_t CFXCRT_FileAccess_Win64::Read(void* pBuffer, size_t szBuffer) { + if (!m_hFile) + return 0; + + size_t szRead = 0; + if (!::ReadFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szRead, + nullptr)) { + return 0; + } + return szRead; +} + +size_t CFXCRT_FileAccess_Win64::Write(const void* pBuffer, size_t szBuffer) { + if (!m_hFile) + return 0; + + size_t szWrite = 0; + if (!::WriteFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szWrite, + nullptr)) { + return 0; + } + return szWrite; +} + +size_t CFXCRT_FileAccess_Win64::ReadPos(void* pBuffer, + size_t szBuffer, + FX_FILESIZE pos) { + if (!m_hFile) + return 0; + + if (pos >= GetSize()) + return 0; + + if (SetPosition(pos) == (FX_FILESIZE)-1) + return 0; + + return Read(pBuffer, szBuffer); +} + +size_t CFXCRT_FileAccess_Win64::WritePos(const void* pBuffer, + size_t szBuffer, + FX_FILESIZE pos) { + if (!m_hFile) { + return 0; + } + if (SetPosition(pos) == (FX_FILESIZE)-1) { + return 0; + } + return Write(pBuffer, szBuffer); +} + +bool CFXCRT_FileAccess_Win64::Flush() { + if (!m_hFile) + return false; + + return !!::FlushFileBuffers(m_hFile); +} + +bool CFXCRT_FileAccess_Win64::Truncate(FX_FILESIZE szFile) { + if (SetPosition(szFile) == (FX_FILESIZE)-1) + return false; + + return !!::SetEndOfFile(m_hFile); +} +#endif diff --git a/modules/pdfium/pdfium/core/fxcrt/fxcrt_windows.h b/modules/pdfium/pdfium/core/fxcrt/fxcrt_windows.h new file mode 100644 index 000000000000..f8f948360da4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/fxcrt_windows.h @@ -0,0 +1,39 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FXCRT_WINDOWS_H_ +#define CORE_FXCRT_FXCRT_WINDOWS_H_ + +#include "core/fxcrt/extension.h" + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +class CFXCRT_FileAccess_Win64 : public IFXCRT_FileAccess { + public: + CFXCRT_FileAccess_Win64(); + ~CFXCRT_FileAccess_Win64() override; + + // IFXCRT_FileAccess + bool Open(const CFX_ByteStringC& fileName, uint32_t dwMode) override; + bool Open(const CFX_WideStringC& fileName, uint32_t dwMode) override; + void Close() override; + FX_FILESIZE GetSize() const override; + FX_FILESIZE GetPosition() const override; + FX_FILESIZE SetPosition(FX_FILESIZE pos) override; + size_t Read(void* pBuffer, size_t szBuffer) override; + size_t Write(const void* pBuffer, size_t szBuffer) override; + size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos) override; + size_t WritePos(const void* pBuffer, + size_t szBuffer, + FX_FILESIZE pos) override; + bool Flush() override; + bool Truncate(FX_FILESIZE szFile) override; + + protected: + void* m_hFile; +}; +#endif + +#endif // CORE_FXCRT_FXCRT_WINDOWS_H_ diff --git a/modules/pdfium/pdfium/core/fxcrt/xml_int.h b/modules/pdfium/pdfium/core/fxcrt/xml_int.h new file mode 100644 index 000000000000..96a7da9c51de --- /dev/null +++ b/modules/pdfium/pdfium/core/fxcrt/xml_int.h @@ -0,0 +1,55 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_XML_INT_H_ +#define CORE_FXCRT_XML_INT_H_ + +#include +#include + +#include "core/fxcrt/fx_stream.h" + +class CFX_UTF8Decoder; +class CXML_Element; + +class CXML_Parser { + public: + CXML_Parser(); + ~CXML_Parser(); + + bool Init(const uint8_t* pBuffer, size_t size); + bool ReadNextBlock(); + bool IsEOF(); + bool HaveAvailData(); + void SkipWhiteSpaces(); + void GetName(CFX_ByteString* space, CFX_ByteString* name); + void GetAttrValue(CFX_WideString& value); + uint32_t GetCharRef(); + void GetTagName(bool bStartTag, + bool* bEndTag, + CFX_ByteString* space, + CFX_ByteString* name); + void SkipLiterals(const CFX_ByteStringC& str); + std::unique_ptr ParseElement(CXML_Element* pParent, + bool bStartTag); + void InsertContentSegment(bool bCDATA, + const CFX_WideStringC& content, + CXML_Element* pElement); + void InsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement); + + CFX_RetainPtr m_pDataAcc; + FX_FILESIZE m_nOffset; + const uint8_t* m_pBuffer; + size_t m_dwBufferSize; + FX_FILESIZE m_nBufferOffset; + size_t m_dwIndex; +}; + +void FX_XML_SplitQualifiedName(const CFX_ByteStringC& bsFullName, + CFX_ByteStringC& bsSpace, + CFX_ByteStringC& bsName); + +#endif // CORE_FXCRT_XML_INT_H_ diff --git a/modules/pdfium/pdfium/core/fxge/agg/DEPS b/modules/pdfium/pdfium/core/fxge/agg/DEPS new file mode 100644 index 000000000000..25d9e110e6fd --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/agg/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + '+third_party/agg23', +] diff --git a/modules/pdfium/pdfium/core/fxge/agg/fx_agg_driver.cpp b/modules/pdfium/pdfium/core/fxge/agg/fx_agg_driver.cpp new file mode 100644 index 000000000000..8c7277752eec --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/agg/fx_agg_driver.cpp @@ -0,0 +1,1763 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/agg/fx_agg_driver.h" + +#include +#include + +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/fx_memory.h" +#include "core/fxge/cfx_fxgedevice.h" +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "core/fxge/dib/dib_int.h" +#include "core/fxge/ge/cfx_cliprgn.h" +#include "core/fxge/ge/fx_text_int.h" +#include "core/fxge/ifx_renderdevicedriver.h" +#include "third_party/agg23/agg_conv_dash.h" +#include "third_party/agg23/agg_conv_stroke.h" +#include "third_party/agg23/agg_curves.h" +#include "third_party/agg23/agg_path_storage.h" +#include "third_party/agg23/agg_pixfmt_gray.h" +#include "third_party/agg23/agg_rasterizer_scanline_aa.h" +#include "third_party/agg23/agg_renderer_scanline.h" +#include "third_party/agg23/agg_scanline_u.h" +#include "third_party/base/ptr_util.h" + +namespace { + +CFX_PointF HardClip(const CFX_PointF& pos) { + return CFX_PointF(std::max(std::min(pos.x, 50000.0f), -50000.0f), + std::max(std::min(pos.y, 50000.0f), -50000.0f)); +} + +void RgbByteOrderSetPixel(CFX_DIBitmap* pBitmap, int x, int y, uint32_t argb) { + if (x < 0 || x >= pBitmap->GetWidth() || y < 0 || y >= pBitmap->GetHeight()) + return; + + uint8_t* pos = (uint8_t*)pBitmap->GetBuffer() + y * pBitmap->GetPitch() + + x * pBitmap->GetBPP() / 8; + if (pBitmap->GetFormat() == FXDIB_Argb) { + FXARGB_SETRGBORDERDIB(pos, argb); + return; + } + + int alpha = FXARGB_A(argb); + pos[0] = (FXARGB_R(argb) * alpha + pos[0] * (255 - alpha)) / 255; + pos[1] = (FXARGB_G(argb) * alpha + pos[1] * (255 - alpha)) / 255; + pos[2] = (FXARGB_B(argb) * alpha + pos[2] * (255 - alpha)) / 255; +} + +void RgbByteOrderCompositeRect(CFX_DIBitmap* pBitmap, + int left, + int top, + int width, + int height, + FX_ARGB argb) { + int src_alpha = FXARGB_A(argb); + if (src_alpha == 0) + return; + + FX_RECT rect(left, top, left + width, top + height); + rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()); + width = rect.Width(); + int src_r = FXARGB_R(argb); + int src_g = FXARGB_G(argb); + int src_b = FXARGB_B(argb); + int Bpp = pBitmap->GetBPP() / 8; + bool bAlpha = pBitmap->HasAlpha(); + int dib_argb = FXARGB_TOBGRORDERDIB(argb); + uint8_t* pBuffer = pBitmap->GetBuffer(); + if (src_alpha == 255) { + for (int row = rect.top; row < rect.bottom; row++) { + uint8_t* dest_scan = + pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp; + if (Bpp == 4) { + uint32_t* scan = (uint32_t*)dest_scan; + for (int col = 0; col < width; col++) + *scan++ = dib_argb; + } else { + for (int col = 0; col < width; col++) { + *dest_scan++ = src_r; + *dest_scan++ = src_g; + *dest_scan++ = src_b; + } + } + } + return; + } + for (int row = rect.top; row < rect.bottom; row++) { + uint8_t* dest_scan = pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp; + if (bAlpha) { + for (int col = 0; col < width; col++) { + uint8_t back_alpha = dest_scan[3]; + if (back_alpha == 0) { + FXARGB_SETRGBORDERDIB(dest_scan, + FXARGB_MAKE(src_alpha, src_r, src_g, src_b)); + dest_scan += 4; + continue; + } + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); + dest_scan += 2; + } + } else { + for (int col = 0; col < width; col++) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha); + dest_scan++; + if (Bpp == 4) + dest_scan++; + } + } + } +} + +void RgbByteOrderTransferBitmap(CFX_DIBitmap* pBitmap, + int dest_left, + int dest_top, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + if (!pBitmap) + return; + + pBitmap->GetOverlapRect(dest_left, dest_top, width, height, + pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), + src_left, src_top, nullptr); + if (width == 0 || height == 0) + return; + + int Bpp = pBitmap->GetBPP() / 8; + FXDIB_Format dest_format = pBitmap->GetFormat(); + FXDIB_Format src_format = pSrcBitmap->GetFormat(); + int pitch = pBitmap->GetPitch(); + uint8_t* buffer = pBitmap->GetBuffer(); + if (dest_format == src_format) { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = buffer + (dest_top + row) * pitch + dest_left * Bpp; + uint8_t* src_scan = + (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp; + if (Bpp == 4) { + for (int col = 0; col < width; col++) { + FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_scan[3], src_scan[0], + src_scan[1], src_scan[2])); + dest_scan += 4; + src_scan += 4; + } + } else { + for (int col = 0; col < width; col++) { + *dest_scan++ = src_scan[2]; + *dest_scan++ = src_scan[1]; + *dest_scan++ = src_scan[0]; + src_scan += 3; + } + } + } + return; + } + + uint8_t* dest_buf = buffer + dest_top * pitch + dest_left * Bpp; + if (dest_format == FXDIB_Rgb) { + if (src_format == FXDIB_Rgb32) { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * pitch; + uint8_t* src_scan = + (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * 4; + for (int col = 0; col < width; col++) { + *dest_scan++ = src_scan[2]; + *dest_scan++ = src_scan[1]; + *dest_scan++ = src_scan[0]; + src_scan += 4; + } + } + } else { + ASSERT(false); + } + return; + } + + if (dest_format == FXDIB_Argb || dest_format == FXDIB_Rgb32) { + if (src_format == FXDIB_Rgb) { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = (uint8_t*)(dest_buf + row * pitch); + uint8_t* src_scan = + (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * 3; + for (int col = 0; col < width; col++) { + FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], + src_scan[2])); + dest_scan += 4; + src_scan += 3; + } + } + } else if (src_format == FXDIB_Rgb32) { + ASSERT(dest_format == FXDIB_Argb); + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * pitch; + uint8_t* src_scan = + (uint8_t*)(pSrcBitmap->GetScanline(src_top + row) + src_left * 4); + for (int col = 0; col < width; col++) { + FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], + src_scan[2])); + src_scan += 4; + dest_scan += 4; + } + } + } + return; + } + + ASSERT(false); +} + +FX_ARGB DefaultCMYK2ARGB(FX_CMYK cmyk, uint8_t alpha) { + uint8_t r, g, b; + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), + FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk), r, g, b); + return ArgbEncode(alpha, r, g, b); +} + +bool DibSetPixel(CFX_DIBitmap* pDevice, + int x, + int y, + uint32_t color, + int alpha_flag, + void* pIccTransform) { + bool bObjCMYK = !!FXGETFLAG_COLORTYPE(alpha_flag); + int alpha = bObjCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color); + if (pIccTransform) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); + pIccModule->TranslateScanline(pIccTransform, (uint8_t*)&color, + (uint8_t*)&color, 1); + color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); + if (!pDevice->IsCmykImage()) { + color = (color & 0xffffff) | (alpha << 24); + } + } else { + if (pDevice->IsCmykImage()) { + if (!bObjCMYK) + return false; + } else { + if (bObjCMYK) + color = DefaultCMYK2ARGB(color, alpha); + } + } + pDevice->SetPixel(x, y, color); + if (pDevice->m_pAlphaMask) { + pDevice->m_pAlphaMask->SetPixel(x, y, alpha << 24); + } + return true; +} + +} // namespace + +void CAgg_PathData::BuildPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device) { + const std::vector& pPoints = pPathData->GetPoints(); + for (size_t i = 0; i < pPoints.size(); i++) { + CFX_PointF pos = pPoints[i].m_Point; + if (pObject2Device) + pos = pObject2Device->Transform(pos); + + pos = HardClip(pos); + FXPT_TYPE point_type = pPoints[i].m_Type; + if (point_type == FXPT_TYPE::MoveTo) { + m_PathData.move_to(pos.x, pos.y); + } else if (point_type == FXPT_TYPE::LineTo) { + if (pPoints[i - 1].IsTypeAndOpen(FXPT_TYPE::MoveTo) && + (i == pPoints.size() - 1 || + pPoints[i + 1].IsTypeAndOpen(FXPT_TYPE::MoveTo)) && + pPoints[i].m_Point == pPoints[i - 1].m_Point) { + pos.x += 1; + } + m_PathData.line_to(pos.x, pos.y); + } else if (point_type == FXPT_TYPE::BezierTo) { + CFX_PointF pos0 = pPoints[i - 1].m_Point; + CFX_PointF pos2 = pPoints[i + 1].m_Point; + CFX_PointF pos3 = pPoints[i + 2].m_Point; + if (pObject2Device) { + pos0 = pObject2Device->Transform(pos0); + pos2 = pObject2Device->Transform(pos2); + pos3 = pObject2Device->Transform(pos3); + } + pos0 = HardClip(pos0); + pos2 = HardClip(pos2); + pos3 = HardClip(pos3); + agg::curve4 curve(pos0.x, pos0.y, pos.x, pos.y, pos2.x, pos2.y, pos3.x, + pos3.y); + i += 2; + m_PathData.add_path_curve(curve); + } + if (pPoints[i].m_CloseFigure) + m_PathData.end_poly(); + } +} + +namespace agg { + +template +class renderer_scanline_aa_offset { + public: + typedef BaseRenderer base_ren_type; + typedef typename base_ren_type::color_type color_type; + renderer_scanline_aa_offset(base_ren_type& ren, unsigned left, unsigned top) + : m_ren(&ren), m_left(left), m_top(top) {} + void color(const color_type& c) { m_color = c; } + const color_type& color() const { return m_color; } + void prepare(unsigned) {} + template + void render(const Scanline& sl) { + int y = sl.y(); + unsigned num_spans = sl.num_spans(); + typename Scanline::const_iterator span = sl.begin(); + for (;;) { + int x = span->x; + if (span->len > 0) { + m_ren->blend_solid_hspan(x - m_left, y - m_top, (unsigned)span->len, + m_color, span->covers); + } else { + m_ren->blend_hline(x - m_left, y - m_top, (unsigned)(x - span->len - 1), + m_color, *(span->covers)); + } + if (--num_spans == 0) { + break; + } + ++span; + } + } + + private: + base_ren_type* m_ren; + color_type m_color; + unsigned m_left, m_top; +}; + +} // namespace agg + +static void RasterizeStroke(agg::rasterizer_scanline_aa& rasterizer, + agg::path_storage& path_data, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + FX_FLOAT scale = 1.0f, + bool bStrokeAdjust = false, + bool bTextMode = false) { + agg::line_cap_e cap; + switch (pGraphState->m_LineCap) { + case CFX_GraphStateData::LineCapRound: + cap = agg::round_cap; + break; + case CFX_GraphStateData::LineCapSquare: + cap = agg::square_cap; + break; + default: + cap = agg::butt_cap; + break; + } + agg::line_join_e join; + switch (pGraphState->m_LineJoin) { + case CFX_GraphStateData::LineJoinRound: + join = agg::round_join; + break; + case CFX_GraphStateData::LineJoinBevel: + join = agg::bevel_join; + break; + default: + join = agg::miter_join_revert; + break; + } + FX_FLOAT width = pGraphState->m_LineWidth * scale; + FX_FLOAT unit = 1.f; + if (pObject2Device) { + unit = + 1.0f / ((pObject2Device->GetXUnit() + pObject2Device->GetYUnit()) / 2); + } + if (width < unit) { + width = unit; + } + if (pGraphState->m_DashArray) { + typedef agg::conv_dash dash_converter; + dash_converter dash(path_data); + for (int i = 0; i < (pGraphState->m_DashCount + 1) / 2; i++) { + FX_FLOAT on = pGraphState->m_DashArray[i * 2]; + if (on <= 0.000001f) { + on = 1.0f / 10; + } + FX_FLOAT off = i * 2 + 1 == pGraphState->m_DashCount + ? on + : pGraphState->m_DashArray[i * 2 + 1]; + if (off < 0) { + off = 0; + } + dash.add_dash(on * scale, off * scale); + } + dash.dash_start(pGraphState->m_DashPhase * scale); + typedef agg::conv_stroke dash_stroke; + dash_stroke stroke(dash); + stroke.line_join(join); + stroke.line_cap(cap); + stroke.miter_limit(pGraphState->m_MiterLimit); + stroke.width(width); + rasterizer.add_path_transformed(stroke, pObject2Device); + } else { + agg::conv_stroke stroke(path_data); + stroke.line_join(join); + stroke.line_cap(cap); + stroke.miter_limit(pGraphState->m_MiterLimit); + stroke.width(width); + rasterizer.add_path_transformed(stroke, pObject2Device); + } +} + +CFX_AggDeviceDriver::CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap, + bool bRgbByteOrder, + CFX_DIBitmap* pOriDevice, + bool bGroupKnockout) + : m_pBitmap(pBitmap), +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + m_pPlatformGraphics(nullptr), +#endif + m_FillFlags(0), + m_bRgbByteOrder(bRgbByteOrder), + m_pOriDevice(pOriDevice), + m_bGroupKnockout(bGroupKnockout) { + InitPlatform(); +} + +CFX_AggDeviceDriver::~CFX_AggDeviceDriver() { + DestroyPlatform(); +} + +uint8_t* CFX_AggDeviceDriver::GetBuffer() const { + return m_pBitmap->GetBuffer(); +} + +#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ +void CFX_AggDeviceDriver::InitPlatform() {} + +void CFX_AggDeviceDriver::DestroyPlatform() {} + +bool CFX_AggDeviceDriver::DrawDeviceText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t color) { + return false; +} +#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ + +int CFX_AggDeviceDriver::GetDeviceCaps(int caps_id) const { + switch (caps_id) { + case FXDC_DEVICE_CLASS: + return FXDC_DISPLAY; + case FXDC_PIXEL_WIDTH: + return m_pBitmap->GetWidth(); + case FXDC_PIXEL_HEIGHT: + return m_pBitmap->GetHeight(); + case FXDC_BITS_PIXEL: + return m_pBitmap->GetBPP(); + case FXDC_HORZ_SIZE: + case FXDC_VERT_SIZE: + return 0; + case FXDC_RENDER_CAPS: { + int flags = FXRC_GET_BITS | FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE | + FXRC_BLEND_MODE | FXRC_SOFT_CLIP; + if (m_pBitmap->HasAlpha()) { + flags |= FXRC_ALPHA_OUTPUT; + } else if (m_pBitmap->IsAlphaMask()) { + if (m_pBitmap->GetBPP() == 1) { + flags |= FXRC_BITMASK_OUTPUT; + } else { + flags |= FXRC_BYTEMASK_OUTPUT; + } + } + if (m_pBitmap->IsCmykImage()) { + flags |= FXRC_CMYK_OUTPUT; + } + return flags; + } + } + return 0; +} + +void CFX_AggDeviceDriver::SaveState() { + std::unique_ptr pClip; + if (m_pClipRgn) + pClip = pdfium::MakeUnique(*m_pClipRgn); + m_StateStack.push_back(std::move(pClip)); +} + +void CFX_AggDeviceDriver::RestoreState(bool bKeepSaved) { + m_pClipRgn.reset(); + + if (m_StateStack.empty()) + return; + + if (bKeepSaved) { + if (m_StateStack.back()) + m_pClipRgn = pdfium::MakeUnique(*m_StateStack.back()); + } else { + m_pClipRgn = std::move(m_StateStack.back()); + m_StateStack.pop_back(); + } +} + +void CFX_AggDeviceDriver::SetClipMask(agg::rasterizer_scanline_aa& rasterizer) { + FX_RECT path_rect(rasterizer.min_x(), rasterizer.min_y(), + rasterizer.max_x() + 1, rasterizer.max_y() + 1); + path_rect.Intersect(m_pClipRgn->GetBox()); + CFX_DIBitmapRef mask; + CFX_DIBitmap* pThisLayer = mask.Emplace(); + pThisLayer->Create(path_rect.Width(), path_rect.Height(), FXDIB_8bppMask); + pThisLayer->Clear(0); + agg::rendering_buffer raw_buf(pThisLayer->GetBuffer(), pThisLayer->GetWidth(), + pThisLayer->GetHeight(), + pThisLayer->GetPitch()); + agg::pixfmt_gray8 pixel_buf(raw_buf); + agg::renderer_base base_buf(pixel_buf); + agg::renderer_scanline_aa_offset > + final_render(base_buf, path_rect.left, path_rect.top); + final_render.color(agg::gray8(255)); + agg::scanline_u8 scanline; + agg::render_scanlines(rasterizer, scanline, final_render, + (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0); + m_pClipRgn->IntersectMaskF(path_rect.left, path_rect.top, mask); +} + +bool CFX_AggDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + int fill_mode) { + m_FillFlags = fill_mode; + if (!m_pClipRgn) { + m_pClipRgn = pdfium::MakeUnique( + GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); + } + size_t size = pPathData->GetPoints().size(); + if (size == 5 || size == 4) { + CFX_FloatRect rectf; + if (pPathData->IsRect(pObject2Device, &rectf)) { + rectf.Intersect( + CFX_FloatRect(0, 0, (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH), + (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_HEIGHT))); + FX_RECT rect = rectf.GetOuterRect(); + m_pClipRgn->IntersectRect(rect); + return true; + } + } + CAgg_PathData path_data; + path_data.BuildPath(pPathData, pObject2Device); + path_data.m_PathData.end_poly(); + agg::rasterizer_scanline_aa rasterizer; + rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), + (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); + rasterizer.add_path(path_data.m_PathData); + rasterizer.filling_rule((fill_mode & 3) == FXFILL_WINDING + ? agg::fill_non_zero + : agg::fill_even_odd); + SetClipMask(rasterizer); + return true; +} + +bool CFX_AggDeviceDriver::SetClip_PathStroke( + const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState) { + if (!m_pClipRgn) { + m_pClipRgn = pdfium::MakeUnique( + GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); + } + CAgg_PathData path_data; + path_data.BuildPath(pPathData, nullptr); + agg::rasterizer_scanline_aa rasterizer; + rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), + (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); + RasterizeStroke(rasterizer, path_data.m_PathData, pObject2Device, + pGraphState); + rasterizer.filling_rule(agg::fill_non_zero); + SetClipMask(rasterizer); + return true; +} + +class CFX_Renderer { + private: + int m_Alpha, m_Red, m_Green, m_Blue, m_Gray; + uint32_t m_Color; + bool m_bFullCover; + bool m_bRgbByteOrder; + CFX_DIBitmap* m_pOriDevice; + FX_RECT m_ClipBox; + const CFX_DIBitmap* m_pClipMask; + CFX_DIBitmap* m_pDevice; + const CFX_ClipRgn* m_pClipRgn; + void (CFX_Renderer::*composite_span)(uint8_t*, + int, + int, + int, + uint8_t*, + int, + int, + uint8_t*, + uint8_t*); + + public: + void prepare(unsigned) {} + + void CompositeSpan(uint8_t* dest_scan, + uint8_t* ori_scan, + int Bpp, + bool bDestAlpha, + int span_left, + int span_len, + uint8_t* cover_scan, + int clip_left, + int clip_right, + uint8_t* clip_scan) { + ASSERT(!m_pDevice->IsCmykImage()); + int col_start = span_left < clip_left ? clip_left - span_left : 0; + int col_end = (span_left + span_len) < clip_right + ? span_len + : (clip_right - span_left); + if (Bpp) { + dest_scan += col_start * Bpp; + ori_scan += col_start * Bpp; + } else { + dest_scan += col_start / 8; + ori_scan += col_start / 8; + } + if (m_bRgbByteOrder) { + if (Bpp == 4 && bDestAlpha) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + uint8_t dest_alpha = + ori_scan[3] + src_alpha - ori_scan[3] * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (m_bFullCover) { + *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, alpha_ratio); + *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, alpha_ratio); + *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, alpha_ratio); + dest_scan++; + ori_scan++; + } else { + int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, alpha_ratio); + int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, alpha_ratio); + int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, alpha_ratio); + ori_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]); + dest_scan += 2; + } + } + return; + } + if (Bpp == 3 || Bpp == 4) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, src_alpha); + int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); + int b = FXDIB_ALPHA_MERGE(*ori_scan, m_Blue, src_alpha); + ori_scan += Bpp - 2; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]); + dest_scan += Bpp - 2; + } + } + return; + } + if (Bpp == 4 && bDestAlpha) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + int src_alpha_covered = src_alpha * cover_scan[col] / 255; + if (src_alpha_covered == 0) { + dest_scan += 4; + continue; + } + if (cover_scan[col] == 255) { + dest_scan[3] = src_alpha_covered; + *dest_scan++ = m_Blue; + *dest_scan++ = m_Green; + *dest_scan = m_Red; + dest_scan += 2; + continue; + } else { + if (dest_scan[3] == 0) { + dest_scan[3] = src_alpha_covered; + *dest_scan++ = m_Blue; + *dest_scan++ = m_Green; + *dest_scan = m_Red; + dest_scan += 2; + continue; + } + uint8_t cover = cover_scan[col]; + dest_scan[3] = FXDIB_ALPHA_MERGE(dest_scan[3], src_alpha, cover); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, cover); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, cover); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, cover); + dest_scan += 2; + } + } + return; + } + if (Bpp == 3 || Bpp == 4) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + if (m_bFullCover) { + *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha); + *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha); + dest_scan += Bpp - 2; + ori_scan += Bpp - 2; + continue; + } + int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha); + int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); + int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha); + ori_scan += Bpp - 2; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan[col]); + dest_scan += Bpp - 2; + continue; + } + return; + } + if (Bpp == 1) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + if (m_bFullCover) { + *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha); + } else { + int gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan[col]); + dest_scan++; + } + } + } else { + int index = 0; + if (m_pDevice->GetPalette()) { + for (int i = 0; i < 2; i++) { + if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) { + index = i; + } + } + } else { + index = ((uint8_t)m_Color == 0xff) ? 1 : 0; + } + uint8_t* dest_scan1 = dest_scan; + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + if (src_alpha) { + if (!index) { + *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8)); + } else { + *dest_scan1 |= 1 << (7 - (col + span_left) % 8); + } + } + dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8; + } + } + } + + void CompositeSpan1bpp(uint8_t* dest_scan, + int Bpp, + int span_left, + int span_len, + uint8_t* cover_scan, + int clip_left, + int clip_right, + uint8_t* clip_scan, + uint8_t* dest_extra_alpha_scan) { + ASSERT(!m_bRgbByteOrder); + ASSERT(!m_pDevice->IsCmykImage()); + int col_start = span_left < clip_left ? clip_left - span_left : 0; + int col_end = (span_left + span_len) < clip_right + ? span_len + : (clip_right - span_left); + dest_scan += col_start / 8; + int index = 0; + if (m_pDevice->GetPalette()) { + for (int i = 0; i < 2; i++) { + if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) { + index = i; + } + } + } else { + index = ((uint8_t)m_Color == 0xff) ? 1 : 0; + } + uint8_t* dest_scan1 = dest_scan; + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + if (src_alpha) { + if (!index) { + *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8)); + } else { + *dest_scan1 |= 1 << (7 - (col + span_left) % 8); + } + } + dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8; + } + } + + void CompositeSpanGray(uint8_t* dest_scan, + int Bpp, + int span_left, + int span_len, + uint8_t* cover_scan, + int clip_left, + int clip_right, + uint8_t* clip_scan, + uint8_t* dest_extra_alpha_scan) { + ASSERT(!m_bRgbByteOrder); + int col_start = span_left < clip_left ? clip_left - span_left : 0; + int col_end = (span_left + span_len) < clip_right + ? span_len + : (clip_right - span_left); + dest_scan += col_start; + if (dest_extra_alpha_scan) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (m_bFullCover) { + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + } else { + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + } + if (src_alpha) { + if (src_alpha == 255) { + *dest_scan = m_Gray; + *dest_extra_alpha_scan = m_Alpha; + } else { + uint8_t dest_alpha = (*dest_extra_alpha_scan) + src_alpha - + (*dest_extra_alpha_scan) * src_alpha / 255; + *dest_extra_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio); + dest_scan++; + continue; + } + } + dest_extra_alpha_scan++; + dest_scan++; + } + } else { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + if (src_alpha) { + if (src_alpha == 255) { + *dest_scan = m_Gray; + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha); + } + } + dest_scan++; + } + } + } + + void CompositeSpanARGB(uint8_t* dest_scan, + int Bpp, + int span_left, + int span_len, + uint8_t* cover_scan, + int clip_left, + int clip_right, + uint8_t* clip_scan, + uint8_t* dest_extra_alpha_scan) { + int col_start = span_left < clip_left ? clip_left - span_left : 0; + int col_end = (span_left + span_len) < clip_right + ? span_len + : (clip_right - span_left); + dest_scan += col_start * Bpp; + if (m_bRgbByteOrder) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (m_bFullCover) { + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + } else { + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + } + if (src_alpha) { + if (src_alpha == 255) { + *(uint32_t*)dest_scan = m_Color; + } else { + uint8_t dest_alpha = + dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); + dest_scan += 2; + continue; + } + } + dest_scan += 4; + } + return; + } + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (m_bFullCover) { + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + } else { + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + } + if (src_alpha) { + if (src_alpha == 255) { + *(uint32_t*)dest_scan = m_Color; + } else { + if (dest_scan[3] == 0) { + dest_scan[3] = src_alpha; + *dest_scan++ = m_Blue; + *dest_scan++ = m_Green; + *dest_scan = m_Red; + dest_scan += 2; + continue; + } + uint8_t dest_alpha = + dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); + dest_scan += 2; + continue; + } + } + dest_scan += Bpp; + } + } + + void CompositeSpanRGB(uint8_t* dest_scan, + int Bpp, + int span_left, + int span_len, + uint8_t* cover_scan, + int clip_left, + int clip_right, + uint8_t* clip_scan, + uint8_t* dest_extra_alpha_scan) { + int col_start = span_left < clip_left ? clip_left - span_left : 0; + int col_end = (span_left + span_len) < clip_right + ? span_len + : (clip_right - span_left); + dest_scan += col_start * Bpp; + if (m_bRgbByteOrder) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + if (src_alpha) { + if (src_alpha == 255) { + if (Bpp == 4) { + *(uint32_t*)dest_scan = m_Color; + } else if (Bpp == 3) { + *dest_scan++ = m_Red; + *dest_scan++ = m_Green; + *dest_scan++ = m_Blue; + continue; + } + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); + dest_scan += Bpp - 2; + continue; + } + } + dest_scan += Bpp; + } + return; + } + if (Bpp == 3 && dest_extra_alpha_scan) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (m_bFullCover) { + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + } else { + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + } + if (src_alpha) { + if (src_alpha == 255) { + *dest_scan++ = (uint8_t)m_Blue; + *dest_scan++ = (uint8_t)m_Green; + *dest_scan++ = (uint8_t)m_Red; + *dest_extra_alpha_scan++ = (uint8_t)m_Alpha; + continue; + } else { + uint8_t dest_alpha = (*dest_extra_alpha_scan) + src_alpha - + (*dest_extra_alpha_scan) * src_alpha / 255; + *dest_extra_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); + dest_scan++; + continue; + } + } + dest_extra_alpha_scan++; + dest_scan += Bpp; + } + } else { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (m_bFullCover) { + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + } else { + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + } + if (src_alpha) { + if (src_alpha == 255) { + if (Bpp == 4) { + *(uint32_t*)dest_scan = m_Color; + } else if (Bpp == 3) { + *dest_scan++ = m_Blue; + *dest_scan++ = m_Green; + *dest_scan++ = m_Red; + continue; + } + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha); + dest_scan += Bpp - 2; + continue; + } + } + dest_scan += Bpp; + } + } + } + + void CompositeSpanCMYK(uint8_t* dest_scan, + int Bpp, + int span_left, + int span_len, + uint8_t* cover_scan, + int clip_left, + int clip_right, + uint8_t* clip_scan, + uint8_t* dest_extra_alpha_scan) { + ASSERT(!m_bRgbByteOrder); + int col_start = span_left < clip_left ? clip_left - span_left : 0; + int col_end = (span_left + span_len) < clip_right + ? span_len + : (clip_right - span_left); + dest_scan += col_start * 4; + if (dest_extra_alpha_scan) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (m_bFullCover) { + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + } else { + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + } + if (src_alpha) { + if (src_alpha == 255) { + *(FX_CMYK*)dest_scan = m_Color; + *dest_extra_alpha_scan = (uint8_t)m_Alpha; + } else { + uint8_t dest_alpha = (*dest_extra_alpha_scan) + src_alpha - + (*dest_extra_alpha_scan) * src_alpha / 255; + *dest_extra_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio); + dest_scan++; + continue; + } + } + dest_extra_alpha_scan++; + dest_scan += 4; + } + } else { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + if (src_alpha) { + if (src_alpha == 255) { + *(FX_CMYK*)dest_scan = m_Color; + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha); + dest_scan++; + continue; + } + } + dest_scan += 4; + } + } + } + + template + void render(const Scanline& sl) { + if (!m_pOriDevice && !composite_span) { + return; + } + int y = sl.y(); + if (y < m_ClipBox.top || y >= m_ClipBox.bottom) { + return; + } + uint8_t* dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPitch() * y; + uint8_t* dest_scan_extra_alpha = nullptr; + CFX_DIBitmap* pAlphaMask = m_pDevice->m_pAlphaMask; + if (pAlphaMask) { + dest_scan_extra_alpha = + pAlphaMask->GetBuffer() + pAlphaMask->GetPitch() * y; + } + uint8_t* ori_scan = nullptr; + if (m_pOriDevice) { + ori_scan = m_pOriDevice->GetBuffer() + m_pOriDevice->GetPitch() * y; + } + int Bpp = m_pDevice->GetBPP() / 8; + bool bDestAlpha = m_pDevice->HasAlpha() || m_pDevice->IsAlphaMask(); + unsigned num_spans = sl.num_spans(); + typename Scanline::const_iterator span = sl.begin(); + while (1) { + int x = span->x; + ASSERT(span->len > 0); + uint8_t* dest_pos = nullptr; + uint8_t* dest_extra_alpha_pos = nullptr; + uint8_t* ori_pos = nullptr; + if (Bpp) { + ori_pos = ori_scan ? ori_scan + x * Bpp : nullptr; + dest_pos = dest_scan + x * Bpp; + dest_extra_alpha_pos = + dest_scan_extra_alpha ? dest_scan_extra_alpha + x : nullptr; + } else { + dest_pos = dest_scan + x / 8; + ori_pos = ori_scan ? ori_scan + x / 8 : nullptr; + } + uint8_t* clip_pos = nullptr; + if (m_pClipMask) { + clip_pos = m_pClipMask->GetBuffer() + + (y - m_ClipBox.top) * m_pClipMask->GetPitch() + x - + m_ClipBox.left; + } + if (ori_pos) { + CompositeSpan(dest_pos, ori_pos, Bpp, bDestAlpha, x, span->len, + span->covers, m_ClipBox.left, m_ClipBox.right, clip_pos); + } else { + (this->*composite_span)(dest_pos, Bpp, x, span->len, span->covers, + m_ClipBox.left, m_ClipBox.right, clip_pos, + dest_extra_alpha_pos); + } + if (--num_spans == 0) { + break; + } + ++span; + } + } + + bool Init(CFX_DIBitmap* pDevice, + CFX_DIBitmap* pOriDevice, + const CFX_ClipRgn* pClipRgn, + uint32_t color, + bool bFullCover, + bool bRgbByteOrder, + int alpha_flag = 0, + void* pIccTransform = nullptr) { + m_pDevice = pDevice; + m_pClipRgn = pClipRgn; + composite_span = nullptr; + m_bRgbByteOrder = bRgbByteOrder; + m_pOriDevice = pOriDevice; + if (m_pClipRgn) { + m_ClipBox = m_pClipRgn->GetBox(); + } else { + m_ClipBox.left = m_ClipBox.top = 0; + m_ClipBox.right = m_pDevice->GetWidth(); + m_ClipBox.bottom = m_pDevice->GetHeight(); + } + m_pClipMask = nullptr; + if (m_pClipRgn && m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) { + m_pClipMask = m_pClipRgn->GetMask().GetObject(); + } + m_bFullCover = bFullCover; + bool bObjectCMYK = !!FXGETFLAG_COLORTYPE(alpha_flag); + bool bDeviceCMYK = pDevice->IsCmykImage(); + m_Alpha = bObjectCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color); + CCodec_IccModule* pIccModule = nullptr; + if (!CFX_GEModule::Get()->GetCodecModule() || + !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) { + pIccTransform = nullptr; + } else { + pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + } + if (m_pDevice->GetBPP() == 8) { + ASSERT(!m_bRgbByteOrder); + composite_span = &CFX_Renderer::CompositeSpanGray; + if (m_pDevice->IsAlphaMask()) { + m_Gray = 255; + } else { + if (pIccTransform) { + uint8_t gray; + color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); + pIccModule->TranslateScanline(pIccTransform, &gray, + (const uint8_t*)&color, 1); + m_Gray = gray; + } else { + if (bObjectCMYK) { + uint8_t r, g, b; + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), + FXSYS_GetYValue(color), FXSYS_GetKValue(color), + r, g, b); + m_Gray = FXRGB2GRAY(r, g, b); + } else { + m_Gray = + FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color)); + } + } + } + return true; + } + if (bDeviceCMYK) { + ASSERT(!m_bRgbByteOrder); + composite_span = &CFX_Renderer::CompositeSpanCMYK; + if (bObjectCMYK) { + m_Color = FXCMYK_TODIB(color); + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, (uint8_t*)&m_Color, + (const uint8_t*)&m_Color, 1); + } + } else { + if (!pIccTransform) { + return false; + } + color = FXARGB_TODIB(color); + pIccModule->TranslateScanline(pIccTransform, (uint8_t*)&m_Color, + (const uint8_t*)&color, 1); + } + m_Red = ((uint8_t*)&m_Color)[0]; + m_Green = ((uint8_t*)&m_Color)[1]; + m_Blue = ((uint8_t*)&m_Color)[2]; + m_Gray = ((uint8_t*)&m_Color)[3]; + } else { + composite_span = (pDevice->GetFormat() == FXDIB_Argb) + ? &CFX_Renderer::CompositeSpanARGB + : &CFX_Renderer::CompositeSpanRGB; + if (pIccTransform) { + color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); + pIccModule->TranslateScanline(pIccTransform, (uint8_t*)&m_Color, + (const uint8_t*)&color, 1); + ((uint8_t*)&m_Color)[3] = m_Alpha; + m_Red = ((uint8_t*)&m_Color)[2]; + m_Green = ((uint8_t*)&m_Color)[1]; + m_Blue = ((uint8_t*)&m_Color)[0]; + if (m_bRgbByteOrder) { + m_Color = FXARGB_TODIB(m_Color); + m_Color = FXARGB_TOBGRORDERDIB(m_Color); + } + } else { + if (bObjectCMYK) { + uint8_t r, g, b; + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), + FXSYS_GetYValue(color), FXSYS_GetKValue(color), r, + g, b); + m_Color = FXARGB_MAKE(m_Alpha, r, g, b); + if (m_bRgbByteOrder) { + m_Color = FXARGB_TOBGRORDERDIB(m_Color); + } else { + m_Color = FXARGB_TODIB(m_Color); + } + m_Red = r; + m_Green = g; + m_Blue = b; + } else { + if (m_bRgbByteOrder) { + m_Color = FXARGB_TOBGRORDERDIB(color); + } else { + m_Color = FXARGB_TODIB(color); + } + ArgbDecode(color, m_Alpha, m_Red, m_Green, m_Blue); + } + } + } + if (m_pDevice->GetBPP() == 1) { + composite_span = &CFX_Renderer::CompositeSpan1bpp; + } + return true; + } +}; + +int CFX_AggDeviceDriver::GetDriverType() const { + return 1; +} + +bool CFX_AggDeviceDriver::RenderRasterizer( + agg::rasterizer_scanline_aa& rasterizer, + uint32_t color, + bool bFullCover, + bool bGroupKnockout, + int alpha_flag, + void* pIccTransform) { + CFX_DIBitmap* pt = bGroupKnockout ? m_pOriDevice : nullptr; + CFX_Renderer render; + if (!render.Init(m_pBitmap, pt, m_pClipRgn.get(), color, bFullCover, + m_bRgbByteOrder, alpha_flag, pIccTransform)) { + return false; + } + agg::scanline_u8 scanline; + agg::render_scanlines(rasterizer, scanline, render, + (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0); + return true; +} + +bool CFX_AggDeviceDriver::DrawPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode, + int blend_type) { + if (blend_type != FXDIB_BLEND_NORMAL) + return false; + + if (!GetBuffer()) + return true; + + m_FillFlags = fill_mode; + if ((fill_mode & 3) && fill_color) { + CAgg_PathData path_data; + path_data.BuildPath(pPathData, pObject2Device); + agg::rasterizer_scanline_aa rasterizer; + rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), + (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); + rasterizer.add_path(path_data.m_PathData); + rasterizer.filling_rule((fill_mode & 3) == FXFILL_WINDING + ? agg::fill_non_zero + : agg::fill_even_odd); + if (!RenderRasterizer(rasterizer, fill_color, + !!(fill_mode & FXFILL_FULLCOVER), false, 0, + nullptr)) { + return false; + } + } + int stroke_alpha = FXARGB_A(stroke_color); + if (!pGraphState || !stroke_alpha) + return true; + + if (fill_mode & FX_ZEROAREA_FILL) { + CAgg_PathData path_data; + path_data.BuildPath(pPathData, pObject2Device); + agg::rasterizer_scanline_aa rasterizer; + rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), + (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); + RasterizeStroke(rasterizer, path_data.m_PathData, nullptr, pGraphState, 1, + false, !!(fill_mode & FX_STROKE_TEXT_MODE)); + return RenderRasterizer(rasterizer, stroke_color, + !!(fill_mode & FXFILL_FULLCOVER), m_bGroupKnockout, + 0, nullptr); + } + CFX_Matrix matrix1; + CFX_Matrix matrix2; + if (pObject2Device) { + matrix1.a = + std::max(FXSYS_fabs(pObject2Device->a), FXSYS_fabs(pObject2Device->b)); + matrix1.d = matrix1.a; + matrix2 = CFX_Matrix( + pObject2Device->a / matrix1.a, pObject2Device->b / matrix1.a, + pObject2Device->c / matrix1.d, pObject2Device->d / matrix1.d, 0, 0); + + CFX_Matrix mtRervese; + mtRervese.SetReverse(matrix2); + matrix1 = *pObject2Device; + matrix1.Concat(mtRervese); + } + + CAgg_PathData path_data; + path_data.BuildPath(pPathData, &matrix1); + agg::rasterizer_scanline_aa rasterizer; + rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), + (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT))); + RasterizeStroke(rasterizer, path_data.m_PathData, &matrix2, pGraphState, + matrix1.a, false, !!(fill_mode & FX_STROKE_TEXT_MODE)); + return RenderRasterizer(rasterizer, stroke_color, + !!(fill_mode & FXFILL_FULLCOVER), m_bGroupKnockout, 0, + nullptr); +} + +bool CFX_AggDeviceDriver::SetPixel(int x, int y, uint32_t color) { + if (!m_pBitmap->GetBuffer()) + return true; + + if (!m_pClipRgn) { + if (!m_bRgbByteOrder) + return DibSetPixel(m_pBitmap, x, y, color, 0, nullptr); + RgbByteOrderSetPixel(m_pBitmap, x, y, color); + return true; + } + if (!m_pClipRgn->GetBox().Contains(x, y)) + return true; + + if (m_pClipRgn->GetType() == CFX_ClipRgn::RectI) { + if (!m_bRgbByteOrder) + return DibSetPixel(m_pBitmap, x, y, color, 0, nullptr); + RgbByteOrderSetPixel(m_pBitmap, x, y, color); + return true; + } + if (m_pClipRgn->GetType() != CFX_ClipRgn::MaskF) + return true; + + const CFX_DIBitmap* pMask = m_pClipRgn->GetMask().GetObject(); + int new_alpha = FXARGB_A(color) * pMask->GetScanline(y)[x] / 255; + color = (color & 0xffffff) | (new_alpha << 24); + if (m_bRgbByteOrder) { + RgbByteOrderSetPixel(m_pBitmap, x, y, color); + return true; + } + return DibSetPixel(m_pBitmap, x, y, color, 0, nullptr); +} + +bool CFX_AggDeviceDriver::FillRectWithBlend(const FX_RECT* pRect, + uint32_t fill_color, + int blend_type) { + if (blend_type != FXDIB_BLEND_NORMAL) + return false; + + if (!m_pBitmap->GetBuffer()) + return true; + + FX_RECT clip_rect; + GetClipBox(&clip_rect); + FX_RECT draw_rect = clip_rect; + if (pRect) + draw_rect.Intersect(*pRect); + if (draw_rect.IsEmpty()) + return true; + + if (!m_pClipRgn || m_pClipRgn->GetType() == CFX_ClipRgn::RectI) { + if (m_bRgbByteOrder) { + RgbByteOrderCompositeRect(m_pBitmap, draw_rect.left, draw_rect.top, + draw_rect.Width(), draw_rect.Height(), + fill_color); + } else { + m_pBitmap->CompositeRect(draw_rect.left, draw_rect.top, draw_rect.Width(), + draw_rect.Height(), fill_color, 0, nullptr); + } + return true; + } + m_pBitmap->CompositeMask( + draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), + m_pClipRgn->GetMask().GetObject(), fill_color, + draw_rect.left - clip_rect.left, draw_rect.top - clip_rect.top, + FXDIB_BLEND_NORMAL, nullptr, m_bRgbByteOrder, 0, nullptr); + return true; +} + +bool CFX_AggDeviceDriver::GetClipBox(FX_RECT* pRect) { + if (!m_pClipRgn) { + pRect->left = pRect->top = 0; + pRect->right = GetDeviceCaps(FXDC_PIXEL_WIDTH); + pRect->bottom = GetDeviceCaps(FXDC_PIXEL_HEIGHT); + return true; + } + *pRect = m_pClipRgn->GetBox(); + return true; +} + +bool CFX_AggDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top) { + if (!m_pBitmap || !m_pBitmap->GetBuffer()) + return true; + + FX_RECT rect(left, top, left + pBitmap->GetWidth(), + top + pBitmap->GetHeight()); + std::unique_ptr pBack; + if (m_pOriDevice) { + pBack = m_pOriDevice->Clone(&rect); + if (!pBack) + return true; + + pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(), + m_pBitmap, 0, 0); + } else { + pBack = m_pBitmap->Clone(&rect); + if (!pBack) + return true; + } + + left = std::min(left, 0); + top = std::min(top, 0); + if (m_bRgbByteOrder) { + RgbByteOrderTransferBitmap(pBitmap, 0, 0, rect.Width(), rect.Height(), + pBack.get(), left, top); + return true; + } + return pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(), pBack.get(), + left, top); +} + +CFX_DIBitmap* CFX_AggDeviceDriver::GetBackDrop() { + return m_pOriDevice; +} + +bool CFX_AggDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap, + uint32_t argb, + const FX_RECT* pSrcRect, + int left, + int top, + int blend_type) { + if (!m_pBitmap->GetBuffer()) + return true; + + if (pBitmap->IsAlphaMask()) { + return m_pBitmap->CompositeMask( + left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, argb, + pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn.get(), + m_bRgbByteOrder, 0, nullptr); + } + return m_pBitmap->CompositeBitmap( + left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, pSrcRect->left, + pSrcRect->top, blend_type, m_pClipRgn.get(), m_bRgbByteOrder, nullptr); +} + +bool CFX_AggDeviceDriver::StretchDIBits(const CFX_DIBSource* pSource, + uint32_t argb, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + uint32_t flags, + int blend_type) { + if (!m_pBitmap->GetBuffer()) + return true; + + if (dest_width == pSource->GetWidth() && + dest_height == pSource->GetHeight()) { + FX_RECT rect(0, 0, dest_width, dest_height); + return SetDIBits(pSource, argb, &rect, dest_left, dest_top, blend_type); + } + FX_RECT dest_rect(dest_left, dest_top, dest_left + dest_width, + dest_top + dest_height); + dest_rect.Normalize(); + FX_RECT dest_clip = dest_rect; + dest_clip.Intersect(*pClipRect); + CFX_BitmapComposer composer; + composer.Compose(m_pBitmap, m_pClipRgn.get(), 255, argb, dest_clip, false, + false, false, m_bRgbByteOrder, 0, nullptr, blend_type); + dest_clip.Offset(-dest_rect.left, -dest_rect.top); + CFX_ImageStretcher stretcher(&composer, pSource, dest_width, dest_height, + dest_clip, flags); + if (stretcher.Start()) + stretcher.Continue(nullptr); + return true; +} + +bool CFX_AggDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, + int bitmap_alpha, + uint32_t argb, + const CFX_Matrix* pMatrix, + uint32_t render_flags, + void*& handle, + int blend_type) { + if (!m_pBitmap->GetBuffer()) + return true; + + CFX_ImageRenderer* pRenderer = new CFX_ImageRenderer; + pRenderer->Start(m_pBitmap, m_pClipRgn.get(), pSource, bitmap_alpha, argb, + pMatrix, render_flags, m_bRgbByteOrder, 0, nullptr); + handle = pRenderer; + return true; +} + +bool CFX_AggDeviceDriver::ContinueDIBits(void* pHandle, IFX_Pause* pPause) { + if (!m_pBitmap->GetBuffer()) { + return true; + } + return ((CFX_ImageRenderer*)pHandle)->Continue(pPause); +} + +void CFX_AggDeviceDriver::CancelDIBits(void* pHandle) { + if (!m_pBitmap->GetBuffer()) { + return; + } + delete (CFX_ImageRenderer*)pHandle; +} + +#ifndef _SKIA_SUPPORT_ +CFX_FxgeDevice::CFX_FxgeDevice() { + m_bOwnedBitmap = false; +} + +bool CFX_FxgeDevice::Attach(CFX_DIBitmap* pBitmap, + bool bRgbByteOrder, + CFX_DIBitmap* pOriDevice, + bool bGroupKnockout) { + if (!pBitmap) + return false; + + SetBitmap(pBitmap); + SetDeviceDriver(pdfium::MakeUnique( + pBitmap, bRgbByteOrder, pOriDevice, bGroupKnockout)); + return true; +} + +bool CFX_FxgeDevice::Create(int width, + int height, + FXDIB_Format format, + CFX_DIBitmap* pOriDevice) { + m_bOwnedBitmap = true; + CFX_DIBitmap* pBitmap = new CFX_DIBitmap; + if (!pBitmap->Create(width, height, format)) { + delete pBitmap; + return false; + } + SetBitmap(pBitmap); + SetDeviceDriver(pdfium::MakeUnique(pBitmap, false, + pOriDevice, false)); + return true; +} + +CFX_FxgeDevice::~CFX_FxgeDevice() { + if (m_bOwnedBitmap) { + delete GetBitmap(); + } +} +#endif diff --git a/modules/pdfium/pdfium/core/fxge/agg/fx_agg_driver.h b/modules/pdfium/pdfium/core/fxge/agg/fx_agg_driver.h new file mode 100644 index 000000000000..8da63394a465 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/agg/fx_agg_driver.h @@ -0,0 +1,124 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_AGG_FX_AGG_DRIVER_H_ +#define CORE_FXGE_AGG_FX_AGG_DRIVER_H_ + +#include +#include + +#include "core/fxge/ifx_renderdevicedriver.h" +#include "third_party/agg23/agg_clip_liang_barsky.h" +#include "third_party/agg23/agg_path_storage.h" +#include "third_party/agg23/agg_rasterizer_scanline_aa.h" + +class CFX_ClipRgn; +class CFX_GraphStateData; +class CFX_Matrix; +class CFX_PathData; + +class CAgg_PathData { + public: + CAgg_PathData() {} + ~CAgg_PathData() {} + void BuildPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device); + + agg::path_storage m_PathData; +}; + +class CFX_AggDeviceDriver : public IFX_RenderDeviceDriver { + public: + CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap, + bool bRgbByteOrder, + CFX_DIBitmap* pOriDevice, + bool bGroupKnockout); + ~CFX_AggDeviceDriver() override; + + void InitPlatform(); + void DestroyPlatform(); + + // IFX_RenderDeviceDriver + int GetDeviceCaps(int caps_id) const override; + void SaveState() override; + void RestoreState(bool bKeepSaved) override; + bool SetClip_PathFill(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + int fill_mode) override; + bool SetClip_PathStroke(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState) override; + bool DrawPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode, + int blend_type) override; + bool SetPixel(int x, int y, uint32_t color) override; + bool FillRectWithBlend(const FX_RECT* pRect, + uint32_t fill_color, + int blend_type) override; + bool GetClipBox(FX_RECT* pRect) override; + bool GetDIBits(CFX_DIBitmap* pBitmap, int left, int top) override; + CFX_DIBitmap* GetBackDrop() override; + bool SetDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + const FX_RECT* pSrcRect, + int left, + int top, + int blend_type) override; + bool StretchDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + uint32_t flags, + int blend_type) override; + bool StartDIBits(const CFX_DIBSource* pBitmap, + int bitmap_alpha, + uint32_t color, + const CFX_Matrix* pMatrix, + uint32_t flags, + void*& handle, + int blend_type) override; + bool ContinueDIBits(void* handle, IFX_Pause* pPause) override; + void CancelDIBits(void* handle) override; + bool DrawDeviceText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t color) override; + int GetDriverType() const override; + + bool RenderRasterizer(agg::rasterizer_scanline_aa& rasterizer, + uint32_t color, + bool bFullCover, + bool bGroupKnockout, + int alpha_flag, + void* pIccTransform); + + void SetClipMask(agg::rasterizer_scanline_aa& rasterizer); + + virtual uint8_t* GetBuffer() const; + + private: + CFX_DIBitmap* m_pBitmap; + std::unique_ptr m_pClipRgn; + std::vector> m_StateStack; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + void* m_pPlatformGraphics; +#endif + int m_FillFlags; + bool m_bRgbByteOrder; + CFX_DIBitmap* m_pOriDevice; + bool m_bGroupKnockout; +}; + +#endif // CORE_FXGE_AGG_FX_AGG_DRIVER_H_ diff --git a/modules/pdfium/pdfium/core/fxge/android/cfpf_skiabufferfont.h b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiabufferfont.h new file mode 100644 index 000000000000..02fdadea1ed9 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiabufferfont.h @@ -0,0 +1,25 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_ANDROID_CFPF_SKIABUFFERFONT_H_ +#define CORE_FXGE_ANDROID_CFPF_SKIABUFFERFONT_H_ + +#include "core/fxge/android/cfpf_skiafontdescriptor.h" + +#define FPF_SKIAFONTTYPE_Buffer 3 + +class CFPF_SkiaBufferFont : public CFPF_SkiaFontDescriptor { + public: + CFPF_SkiaBufferFont() : m_pBuffer(nullptr), m_szBuffer(0) {} + + // CFPF_SkiaFontDescriptor + int32_t GetType() const override { return FPF_SKIAFONTTYPE_Buffer; } + + void* m_pBuffer; + size_t m_szBuffer; +}; + +#endif // CORE_FXGE_ANDROID_CFPF_SKIABUFFERFONT_H_ diff --git a/modules/pdfium/pdfium/core/fxge/android/cfpf_skiadevicemodule.cpp b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiadevicemodule.cpp new file mode 100644 index 000000000000..7bdf64666f5d --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiadevicemodule.cpp @@ -0,0 +1,41 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/android/cfpf_skiadevicemodule.h" + +#include "core/fxge/android/cfpf_skiafontmgr.h" + +namespace { + +CFPF_SkiaDeviceModule* gs_pPFModule = nullptr; + +} // namespace + +CFPF_SkiaDeviceModule* CFPF_GetSkiaDeviceModule() { + if (!gs_pPFModule) + gs_pPFModule = new CFPF_SkiaDeviceModule; + return gs_pPFModule; +} + +CFPF_SkiaDeviceModule::~CFPF_SkiaDeviceModule() { + delete m_pFontMgr; +} + +void CFPF_SkiaDeviceModule::Destroy() { + delete gs_pPFModule; + gs_pPFModule = nullptr; +} + +CFPF_SkiaFontMgr* CFPF_SkiaDeviceModule::GetFontMgr() { + if (!m_pFontMgr) { + m_pFontMgr = new CFPF_SkiaFontMgr; + if (!m_pFontMgr->InitFTLibrary()) { + delete m_pFontMgr; + return nullptr; + } + } + return m_pFontMgr; +} diff --git a/modules/pdfium/pdfium/core/fxge/android/cfpf_skiadevicemodule.h b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiadevicemodule.h new file mode 100644 index 000000000000..326182003922 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiadevicemodule.h @@ -0,0 +1,26 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_ANDROID_CFPF_SKIADEVICEMODULE_H_ +#define CORE_FXGE_ANDROID_CFPF_SKIADEVICEMODULE_H_ + +class CFPF_SkiaFontMgr; + +class CFPF_SkiaDeviceModule { + public: + CFPF_SkiaDeviceModule() : m_pFontMgr(nullptr) {} + ~CFPF_SkiaDeviceModule(); + + void Destroy(); + CFPF_SkiaFontMgr* GetFontMgr(); + + protected: + CFPF_SkiaFontMgr* m_pFontMgr; +}; + +CFPF_SkiaDeviceModule* CFPF_GetSkiaDeviceModule(); + +#endif // CORE_FXGE_ANDROID_CFPF_SKIADEVICEMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafilefont.h b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafilefont.h new file mode 100644 index 000000000000..2c9fc90ad2d3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafilefont.h @@ -0,0 +1,27 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_ANDROID_CFPF_SKIAFILEFONT_H_ +#define CORE_FXGE_ANDROID_CFPF_SKIAFILEFONT_H_ + +#include "core/fxcrt/cfx_retain_ptr.h" +#include "core/fxge/android/cfpf_skiafontdescriptor.h" + +class IFX_SeekableReadStream; + +#define FPF_SKIAFONTTYPE_File 2 + +class CFPF_SkiaFileFont : public CFPF_SkiaFontDescriptor { + public: + CFPF_SkiaFileFont() {} + + // CFPF_SkiaFontDescriptor + int32_t GetType() const override { return FPF_SKIAFONTTYPE_File; } + + CFX_RetainPtr m_pFile; +}; + +#endif // CORE_FXGE_ANDROID_CFPF_SKIAFILEFONT_H_ diff --git a/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafont.cpp b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafont.cpp new file mode 100644 index 000000000000..5e11efae9dfe --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafont.cpp @@ -0,0 +1,219 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/android/cfpf_skiafont.h" + +#include + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/android/cfpf_skiabufferfont.h" +#include "core/fxge/android/cfpf_skiafilefont.h" +#include "core/fxge/android/cfpf_skiafontdescriptor.h" +#include "core/fxge/android/cfpf_skiafontmgr.h" +#include "core/fxge/android/cfpf_skiapathfont.h" +#include "core/fxge/fx_freetype.h" + +#define FPF_EM_ADJUST(em, a) (em == 0 ? (a) : (a)*1000 / em) + +CFPF_SkiaFont::CFPF_SkiaFont() + : m_pFontMgr(nullptr), + m_pFontDes(nullptr), + m_Face(nullptr), + m_dwStyle(0), + m_uCharset(0), + m_dwRefCount(0) {} + +CFPF_SkiaFont::~CFPF_SkiaFont() { + if (m_Face) + FXFT_Done_Face(m_Face); +} + +void CFPF_SkiaFont::Release() { + if (--m_dwRefCount == 0) + delete this; +} + +CFPF_SkiaFont* CFPF_SkiaFont::Retain() { + m_dwRefCount++; + return this; +} + +CFX_ByteString CFPF_SkiaFont::GetFamilyName() { + if (!m_Face) + return CFX_ByteString(); + return CFX_ByteString(FXFT_Get_Face_Family_Name(m_Face)); +} + +CFX_ByteString CFPF_SkiaFont::GetPsName() { + if (!m_Face) + return CFX_ByteString(); + return FXFT_Get_Postscript_Name(m_Face); +} + +int32_t CFPF_SkiaFont::GetGlyphIndex(FX_WCHAR wUnicode) { + if (!m_Face) + return wUnicode; + if (FXFT_Select_Charmap(m_Face, FXFT_ENCODING_UNICODE)) + return 0; + return FXFT_Get_Char_Index(m_Face, wUnicode); +} + +int32_t CFPF_SkiaFont::GetGlyphWidth(int32_t iGlyphIndex) { + if (!m_Face) + return 0; + if (FXFT_Load_Glyph( + m_Face, iGlyphIndex, + FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) { + return 0; + } + return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Glyph_HoriAdvance(m_Face)); +} + +int32_t CFPF_SkiaFont::GetAscent() const { + if (!m_Face) + return 0; + return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_Ascender(m_Face)); +} + +int32_t CFPF_SkiaFont::GetDescent() const { + if (!m_Face) + return 0; + return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_Descender(m_Face)); +} + +bool CFPF_SkiaFont::GetGlyphBBox(int32_t iGlyphIndex, FX_RECT& rtBBox) { + if (!m_Face) + return false; + if (FXFT_Is_Face_Tricky(m_Face)) { + if (FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72)) + return false; + if (FXFT_Load_Glyph(m_Face, iGlyphIndex, + FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) { + FXFT_Set_Pixel_Sizes(m_Face, 0, 64); + return false; + } + FXFT_Glyph glyph; + if (FXFT_Get_Glyph(m_Face->glyph, &glyph)) { + FXFT_Set_Pixel_Sizes(m_Face, 0, 64); + return false; + } + FXFT_BBox cbox; + FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox); + int32_t x_ppem = m_Face->size->metrics.x_ppem; + int32_t y_ppem = m_Face->size->metrics.y_ppem; + rtBBox.left = FPF_EM_ADJUST(x_ppem, cbox.xMin); + rtBBox.right = FPF_EM_ADJUST(x_ppem, cbox.xMax); + rtBBox.top = FPF_EM_ADJUST(y_ppem, cbox.yMax); + rtBBox.bottom = FPF_EM_ADJUST(y_ppem, cbox.yMin); + rtBBox.top = std::min(rtBBox.top, GetAscent()); + rtBBox.bottom = std::max(rtBBox.bottom, GetDescent()); + FXFT_Done_Glyph(glyph); + return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0; + } + if (FXFT_Load_Glyph( + m_Face, iGlyphIndex, + FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) { + return false; + } + rtBBox.left = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Glyph_HoriBearingX(m_Face)); + rtBBox.bottom = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Glyph_HoriBearingY(m_Face)); + rtBBox.right = FPF_EM_ADJUST( + FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)); + rtBBox.top = FPF_EM_ADJUST( + FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)); + return true; +} + +bool CFPF_SkiaFont::GetBBox(FX_RECT& rtBBox) { + if (!m_Face) { + return false; + } + rtBBox.left = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_xMin(m_Face)); + rtBBox.top = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_yMin(m_Face)); + rtBBox.right = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_xMax(m_Face)); + rtBBox.bottom = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_yMax(m_Face)); + return true; +} + +int32_t CFPF_SkiaFont::GetHeight() const { + if (!m_Face) + return 0; + return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_Height(m_Face)); +} + +int32_t CFPF_SkiaFont::GetItalicAngle() const { + if (!m_Face) + return 0; + + TT_Postscript* ttInfo = + (TT_Postscript*)FT_Get_Sfnt_Table(m_Face, ft_sfnt_post); + if (ttInfo) + return ttInfo->italicAngle; + return 0; +} + +uint32_t CFPF_SkiaFont::GetFontData(uint32_t dwTable, + uint8_t* pBuffer, + uint32_t dwSize) { + if (!m_Face) + return 0; + + FT_ULong ulSize = pdfium::base::checked_cast(dwSize); + if (FXFT_Load_Sfnt_Table(m_Face, dwTable, 0, pBuffer, &ulSize)) + return 0; + return pdfium::base::checked_cast(ulSize); +} + +bool CFPF_SkiaFont::InitFont(CFPF_SkiaFontMgr* pFontMgr, + CFPF_SkiaFontDescriptor* pFontDes, + const CFX_ByteStringC& bsFamily, + uint32_t dwStyle, + uint8_t uCharset) { + if (!pFontMgr || !pFontDes) + return false; + + switch (pFontDes->GetType()) { + case FPF_SKIAFONTTYPE_Path: { + CFPF_SkiaPathFont* pFont = (CFPF_SkiaPathFont*)pFontDes; + m_Face = pFontMgr->GetFontFace(pFont->m_pPath, pFont->m_iFaceIndex); + break; + } + case FPF_SKIAFONTTYPE_File: { + CFPF_SkiaFileFont* pFont = (CFPF_SkiaFileFont*)pFontDes; + m_Face = pFontMgr->GetFontFace(pFont->m_pFile, pFont->m_iFaceIndex); + break; + } + case FPF_SKIAFONTTYPE_Buffer: { + CFPF_SkiaBufferFont* pFont = (CFPF_SkiaBufferFont*)pFontDes; + m_Face = pFontMgr->GetFontFace((const uint8_t*)pFont->m_pBuffer, + pFont->m_szBuffer, pFont->m_iFaceIndex); + break; + } + default: + return false; + } + if (!m_Face) + return false; + + m_dwStyle = dwStyle; + m_uCharset = uCharset; + m_pFontMgr = pFontMgr; + m_pFontDes = pFontDes; + m_dwRefCount = 1; + return true; +} diff --git a/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafont.h b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafont.h new file mode 100644 index 000000000000..b72c1111778c --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafont.h @@ -0,0 +1,53 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_ANDROID_CFPF_SKIAFONT_H_ +#define CORE_FXGE_ANDROID_CFPF_SKIAFONT_H_ + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/fx_font.h" + +class CFPF_SkiaFontDescriptor; +class CFPF_SkiaFontMgr; + +class CFPF_SkiaFont { + public: + CFPF_SkiaFont(); + ~CFPF_SkiaFont(); + + void Release(); + CFPF_SkiaFont* Retain(); + + CFX_ByteString GetFamilyName(); + CFX_ByteString GetPsName(); + uint32_t GetFontStyle() const { return m_dwStyle; } + uint8_t GetCharset() const { return m_uCharset; } + int32_t GetGlyphIndex(FX_WCHAR wUnicode); + int32_t GetGlyphWidth(int32_t iGlyphIndex); + int32_t GetAscent() const; + int32_t GetDescent() const; + bool GetGlyphBBox(int32_t iGlyphIndex, FX_RECT& rtBBox); + bool GetBBox(FX_RECT& rtBBox); + int32_t GetHeight() const; + int32_t GetItalicAngle() const; + uint32_t GetFontData(uint32_t dwTable, uint8_t* pBuffer, uint32_t dwSize); + + bool InitFont(CFPF_SkiaFontMgr* pFontMgr, + CFPF_SkiaFontDescriptor* pFontDes, + const CFX_ByteStringC& bsFamily, + uint32_t dwStyle, + uint8_t uCharset); + + private: + CFPF_SkiaFontMgr* m_pFontMgr; + CFPF_SkiaFontDescriptor* m_pFontDes; + FXFT_Face m_Face; + uint32_t m_dwStyle; + uint8_t m_uCharset; + uint32_t m_dwRefCount; +}; + +#endif // CORE_FXGE_ANDROID_CFPF_SKIAFONT_H_ diff --git a/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafontdescriptor.h b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafontdescriptor.h new file mode 100644 index 000000000000..57b85404ad6c --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafontdescriptor.h @@ -0,0 +1,40 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_ANDROID_CFPF_SKIAFONTDESCRIPTOR_H_ +#define CORE_FXGE_ANDROID_CFPF_SKIAFONTDESCRIPTOR_H_ + +#include "core/fxcrt/fx_system.h" + +#define FPF_SKIAFONTTYPE_Unknown 0 + +class CFPF_SkiaFontDescriptor { + public: + CFPF_SkiaFontDescriptor() + : m_pFamily(nullptr), + m_dwStyle(0), + m_iFaceIndex(0), + m_dwCharsets(0), + m_iGlyphNum(0) {} + virtual ~CFPF_SkiaFontDescriptor() { FX_Free(m_pFamily); } + + virtual int32_t GetType() const { return FPF_SKIAFONTTYPE_Unknown; } + + void SetFamily(const FX_CHAR* pFamily) { + FX_Free(m_pFamily); + int32_t iSize = FXSYS_strlen(pFamily); + m_pFamily = FX_Alloc(FX_CHAR, iSize + 1); + FXSYS_memcpy(m_pFamily, pFamily, iSize * sizeof(FX_CHAR)); + m_pFamily[iSize] = 0; + } + FX_CHAR* m_pFamily; + uint32_t m_dwStyle; + int32_t m_iFaceIndex; + uint32_t m_dwCharsets; + int32_t m_iGlyphNum; +}; + +#endif // CORE_FXGE_ANDROID_CFPF_SKIAFONTDESCRIPTOR_H_ diff --git a/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafontmgr.cpp b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafontmgr.cpp new file mode 100644 index 000000000000..e3511be67a1e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafontmgr.cpp @@ -0,0 +1,487 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/android/cfpf_skiafontmgr.h" + +#define FPF_SKIAMATCHWEIGHT_NAME1 62 +#define FPF_SKIAMATCHWEIGHT_NAME2 60 +#define FPF_SKIAMATCHWEIGHT_1 16 +#define FPF_SKIAMATCHWEIGHT_2 8 + +#include + +#include "core/fxcrt/fx_ext.h" +#include "core/fxcrt/fx_memory.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxge/android/cfpf_skiafont.h" +#include "core/fxge/android/cfpf_skiafontdescriptor.h" +#include "core/fxge/android/cfpf_skiapathfont.h" +#include "core/fxge/fx_freetype.h" + +#ifdef __cplusplus +extern "C" { +#endif +static unsigned long FPF_SkiaStream_Read(FXFT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count) { + if (count == 0) + return 0; + + IFX_SeekableReadStream* pFileRead = + static_cast(stream->descriptor.pointer); + if (!pFileRead) + return 0; + + if (!pFileRead->ReadBlock(buffer, (FX_FILESIZE)offset, (size_t)count)) + return 0; + + return count; +} + +static void FPF_SkiaStream_Close(FXFT_Stream stream) {} +#ifdef __cplusplus +}; +#endif + +namespace { + +struct FPF_SKIAFONTMAP { + uint32_t dwFamily; + uint32_t dwSubSt; +}; + +const FPF_SKIAFONTMAP g_SkiaFontmap[] = { + {0x58c5083, 0xc8d2e345}, {0x5dfade2, 0xe1633081}, + {0x684317d, 0xe1633081}, {0x14ee2d13, 0xc8d2e345}, + {0x3918fe2d, 0xbbeeec72}, {0x3b98b31c, 0xe1633081}, + {0x3d49f40e, 0xe1633081}, {0x432c41c5, 0xe1633081}, + {0x491b6ad0, 0xe1633081}, {0x5612cab1, 0x59b9f8f1}, + {0x779ce19d, 0xc8d2e345}, {0x7cc9510b, 0x59b9f8f1}, + {0x83746053, 0xbbeeec72}, {0xaaa60c03, 0xbbeeec72}, + {0xbf85ff26, 0xe1633081}, {0xc04fe601, 0xbbeeec72}, + {0xca3812d5, 0x59b9f8f1}, {0xca383e15, 0x59b9f8f1}, + {0xcad5eaf6, 0x59b9f8f1}, {0xcb7a04c8, 0xc8d2e345}, + {0xfb4ce0de, 0xe1633081}, +}; + +const FPF_SKIAFONTMAP g_SkiaSansFontMap[] = { + {0x58c5083, 0xd5b8d10f}, {0x14ee2d13, 0xd5b8d10f}, + {0x779ce19d, 0xd5b8d10f}, {0xcb7a04c8, 0xd5b8d10f}, + {0xfb4ce0de, 0xd5b8d10f}, +}; + +uint32_t FPF_SkiaGetSubstFont(uint32_t dwHash, + const FPF_SKIAFONTMAP* skFontMap, + size_t length) { + const FPF_SKIAFONTMAP* pEnd = skFontMap + length; + const FPF_SKIAFONTMAP* pFontMap = std::lower_bound( + skFontMap, pEnd, dwHash, [](const FPF_SKIAFONTMAP& item, uint32_t hash) { + return item.dwFamily < hash; + }); + if (pFontMap < pEnd && pFontMap->dwFamily == dwHash) + return pFontMap->dwSubSt; + return 0; +} + +uint32_t FPF_GetHashCode_StringA(const FX_CHAR* pStr, int32_t iLength) { + if (!pStr) + return 0; + if (iLength < 0) + iLength = FXSYS_strlen(pStr); + const FX_CHAR* pStrEnd = pStr + iLength; + uint32_t uHashCode = 0; + while (pStr < pStrEnd) + uHashCode = 31 * uHashCode + FXSYS_tolower(*pStr++); + return uHashCode; +} + +enum FPF_SKIACHARSET { + FPF_SKIACHARSET_Ansi = 1 << 0, + FPF_SKIACHARSET_Default = 1 << 1, + FPF_SKIACHARSET_Symbol = 1 << 2, + FPF_SKIACHARSET_ShiftJIS = 1 << 3, + FPF_SKIACHARSET_Korean = 1 << 4, + FPF_SKIACHARSET_Johab = 1 << 5, + FPF_SKIACHARSET_GB2312 = 1 << 6, + FPF_SKIACHARSET_BIG5 = 1 << 7, + FPF_SKIACHARSET_Greek = 1 << 8, + FPF_SKIACHARSET_Turkish = 1 << 9, + FPF_SKIACHARSET_Vietnamese = 1 << 10, + FPF_SKIACHARSET_Hebrew = 1 << 11, + FPF_SKIACHARSET_Arabic = 1 << 12, + FPF_SKIACHARSET_Baltic = 1 << 13, + FPF_SKIACHARSET_Cyrillic = 1 << 14, + FPF_SKIACHARSET_Thai = 1 << 15, + FPF_SKIACHARSET_EeasternEuropean = 1 << 16, + FPF_SKIACHARSET_PC = 1 << 17, + FPF_SKIACHARSET_OEM = 1 << 18, +}; + +uint32_t FPF_SkiaGetCharset(uint8_t uCharset) { + switch (uCharset) { + case FXFONT_ANSI_CHARSET: + return FPF_SKIACHARSET_Ansi; + case FXFONT_DEFAULT_CHARSET: + return FPF_SKIACHARSET_Default; + case FXFONT_SYMBOL_CHARSET: + return FPF_SKIACHARSET_Symbol; + case FXFONT_SHIFTJIS_CHARSET: + return FPF_SKIACHARSET_ShiftJIS; + case FXFONT_HANGUL_CHARSET: + return FPF_SKIACHARSET_Korean; + case FXFONT_GB2312_CHARSET: + return FPF_SKIACHARSET_GB2312; + case FXFONT_CHINESEBIG5_CHARSET: + return FPF_SKIACHARSET_BIG5; + case FXFONT_GREEK_CHARSET: + return FPF_SKIACHARSET_Greek; + case FXFONT_TURKISH_CHARSET: + return FPF_SKIACHARSET_Turkish; + case FXFONT_HEBREW_CHARSET: + return FPF_SKIACHARSET_Hebrew; + case FXFONT_ARABIC_CHARSET: + return FPF_SKIACHARSET_Arabic; + case FXFONT_BALTIC_CHARSET: + return FPF_SKIACHARSET_Baltic; + case FXFONT_RUSSIAN_CHARSET: + return FPF_SKIACHARSET_Cyrillic; + case FXFONT_THAI_CHARSET: + return FPF_SKIACHARSET_Thai; + case FXFONT_EASTEUROPE_CHARSET: + return FPF_SKIACHARSET_EeasternEuropean; + } + return FPF_SKIACHARSET_Default; +} + +uint32_t FPF_SKIANormalizeFontName(const CFX_ByteStringC& bsfamily) { + uint32_t dwHash = 0; + int32_t iLength = bsfamily.GetLength(); + const FX_CHAR* pBuffer = bsfamily.c_str(); + for (int32_t i = 0; i < iLength; i++) { + FX_CHAR ch = pBuffer[i]; + if (ch == ' ' || ch == '-' || ch == ',') + continue; + dwHash = 31 * dwHash + FXSYS_tolower(ch); + } + return dwHash; +} + +uint32_t FPF_SKIAGetFamilyHash(const CFX_ByteStringC& bsFamily, + uint32_t dwStyle, + uint8_t uCharset) { + CFX_ByteString bsFont(bsFamily); + if (dwStyle & FXFONT_BOLD) + bsFont += "Bold"; + if (dwStyle & FXFONT_ITALIC) + bsFont += "Italic"; + if (dwStyle & FXFONT_SERIF) + bsFont += "Serif"; + bsFont += uCharset; + return FPF_GetHashCode_StringA(bsFont.c_str(), bsFont.GetLength()); +} + +bool FPF_SkiaIsCJK(uint8_t uCharset) { + return (uCharset == FXFONT_GB2312_CHARSET) || + (uCharset == FXFONT_CHINESEBIG5_CHARSET) || + (uCharset == FXFONT_HANGUL_CHARSET) || + (uCharset == FXFONT_SHIFTJIS_CHARSET); +} + +bool FPF_SkiaMaybeSymbol(const CFX_ByteStringC& bsFacename) { + CFX_ByteString bsName(bsFacename); + bsName.MakeLower(); + return bsName.Find("symbol") > -1; +} + +bool FPF_SkiaMaybeArabic(const CFX_ByteStringC& bsFacename) { + CFX_ByteString bsName(bsFacename); + bsName.MakeLower(); + return bsName.Find("arabic") > -1; +} + +const uint32_t g_FPFSkiaFontCharsets[] = { + FPF_SKIACHARSET_Ansi, + FPF_SKIACHARSET_EeasternEuropean, + FPF_SKIACHARSET_Cyrillic, + FPF_SKIACHARSET_Greek, + FPF_SKIACHARSET_Turkish, + FPF_SKIACHARSET_Hebrew, + FPF_SKIACHARSET_Arabic, + FPF_SKIACHARSET_Baltic, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + FPF_SKIACHARSET_Thai, + FPF_SKIACHARSET_ShiftJIS, + FPF_SKIACHARSET_GB2312, + FPF_SKIACHARSET_Korean, + FPF_SKIACHARSET_BIG5, + FPF_SKIACHARSET_Johab, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + FPF_SKIACHARSET_OEM, + FPF_SKIACHARSET_Symbol, +}; + +uint32_t FPF_SkiaGetFaceCharset(TT_OS2* pOS2) { + uint32_t dwCharset = 0; + if (pOS2) { + for (int32_t i = 0; i < 32; i++) { + if (pOS2->ulCodePageRange1 & (1 << i)) + dwCharset |= g_FPFSkiaFontCharsets[i]; + } + } + dwCharset |= FPF_SKIACHARSET_Default; + return dwCharset; +} + +} // namespace + +CFPF_SkiaFontMgr::CFPF_SkiaFontMgr() : m_bLoaded(false), m_FTLibrary(nullptr) {} + +CFPF_SkiaFontMgr::~CFPF_SkiaFontMgr() { + for (const auto& pair : m_FamilyFonts) { + if (pair.second) + pair.second->Release(); + } + m_FamilyFonts.clear(); + for (auto it = m_FontFaces.begin(); it != m_FontFaces.end(); ++it) + delete *it; + m_FontFaces.clear(); + if (m_FTLibrary) + FXFT_Done_FreeType(m_FTLibrary); +} + +bool CFPF_SkiaFontMgr::InitFTLibrary() { + if (!m_FTLibrary) + FXFT_Init_FreeType(&m_FTLibrary); + return !!m_FTLibrary; +} + +void CFPF_SkiaFontMgr::LoadSystemFonts() { + if (m_bLoaded) + return; + ScanPath("/system/fonts"); + m_bLoaded = true; +} + +CFPF_SkiaFont* CFPF_SkiaFontMgr::CreateFont(const CFX_ByteStringC& bsFamilyname, + uint8_t uCharset, + uint32_t dwStyle, + uint32_t dwMatch) { + uint32_t dwHash = FPF_SKIAGetFamilyHash(bsFamilyname, dwStyle, uCharset); + auto it = m_FamilyFonts.find(dwHash); + if (it != m_FamilyFonts.end() && it->second) + return it->second->Retain(); + + uint32_t dwFaceName = FPF_SKIANormalizeFontName(bsFamilyname); + uint32_t dwSubst = FPF_SkiaGetSubstFont(dwFaceName, g_SkiaFontmap, + FX_ArraySize(g_SkiaFontmap)); + uint32_t dwSubstSans = FPF_SkiaGetSubstFont(dwFaceName, g_SkiaSansFontMap, + FX_ArraySize(g_SkiaSansFontMap)); + bool bMaybeSymbol = FPF_SkiaMaybeSymbol(bsFamilyname); + if (uCharset != FXFONT_ARABIC_CHARSET && FPF_SkiaMaybeArabic(bsFamilyname)) { + uCharset = FXFONT_ARABIC_CHARSET; + } else if (uCharset == FXFONT_ANSI_CHARSET && + (dwMatch & FPF_MATCHFONT_REPLACEANSI)) { + uCharset = FXFONT_DEFAULT_CHARSET; + } + int32_t nExpectVal = FPF_SKIAMATCHWEIGHT_NAME1 + FPF_SKIAMATCHWEIGHT_1 * 3 + + FPF_SKIAMATCHWEIGHT_2 * 2; + CFPF_SkiaFontDescriptor* pBestFontDes = nullptr; + int32_t nMax = -1; + int32_t nGlyphNum = 0; + for (auto it = m_FontFaces.rbegin(); it != m_FontFaces.rend(); ++it) { + CFPF_SkiaPathFont* pFontDes = static_cast(*it); + if (!(pFontDes->m_dwCharsets & FPF_SkiaGetCharset(uCharset))) + continue; + int32_t nFind = 0; + uint32_t dwSysFontName = FPF_SKIANormalizeFontName(pFontDes->m_pFamily); + if (dwFaceName == dwSysFontName) + nFind += FPF_SKIAMATCHWEIGHT_NAME1; + bool bMatchedName = (nFind == FPF_SKIAMATCHWEIGHT_NAME1); + if ((dwStyle & FXFONT_BOLD) == (pFontDes->m_dwStyle & FXFONT_BOLD)) + nFind += FPF_SKIAMATCHWEIGHT_1; + if ((dwStyle & FXFONT_ITALIC) == (pFontDes->m_dwStyle & FXFONT_ITALIC)) + nFind += FPF_SKIAMATCHWEIGHT_1; + if ((dwStyle & FXFONT_FIXED_PITCH) == + (pFontDes->m_dwStyle & FXFONT_FIXED_PITCH)) { + nFind += FPF_SKIAMATCHWEIGHT_2; + } + if ((dwStyle & FXFONT_SERIF) == (pFontDes->m_dwStyle & FXFONT_SERIF)) + nFind += FPF_SKIAMATCHWEIGHT_1; + if ((dwStyle & FXFONT_SCRIPT) == (pFontDes->m_dwStyle & FXFONT_SCRIPT)) + nFind += FPF_SKIAMATCHWEIGHT_2; + if (dwSubst == dwSysFontName || dwSubstSans == dwSysFontName) { + nFind += FPF_SKIAMATCHWEIGHT_NAME2; + bMatchedName = true; + } + if (uCharset == FXFONT_DEFAULT_CHARSET || bMaybeSymbol) { + if (nFind > nMax && bMatchedName) { + nMax = nFind; + pBestFontDes = *it; + } + } else if (FPF_SkiaIsCJK(uCharset)) { + if (bMatchedName || pFontDes->m_iGlyphNum > nGlyphNum) { + pBestFontDes = *it; + nGlyphNum = pFontDes->m_iGlyphNum; + } + } else if (nFind > nMax) { + nMax = nFind; + pBestFontDes = *it; + } + if (nExpectVal <= nFind) { + pBestFontDes = *it; + break; + } + } + if (pBestFontDes) { + CFPF_SkiaFont* pFont = new CFPF_SkiaFont; + if (pFont->InitFont(this, pBestFontDes, bsFamilyname, dwStyle, uCharset)) { + m_FamilyFonts[dwHash] = pFont; + return pFont->Retain(); + } + pFont->Release(); + } + return nullptr; +} + +FXFT_Face CFPF_SkiaFontMgr::GetFontFace( + const CFX_RetainPtr& pFileRead, + int32_t iFaceIndex) { + if (!pFileRead) + return nullptr; + if (pFileRead->GetSize() == 0) + return nullptr; + if (iFaceIndex < 0) + return nullptr; + FXFT_StreamRec streamRec; + FXSYS_memset(&streamRec, 0, sizeof(FXFT_StreamRec)); + streamRec.size = pFileRead->GetSize(); + streamRec.descriptor.pointer = static_cast(pFileRead.Get()); + streamRec.read = FPF_SkiaStream_Read; + streamRec.close = FPF_SkiaStream_Close; + FXFT_Open_Args args; + args.flags = FT_OPEN_STREAM; + args.stream = &streamRec; + FXFT_Face face; + if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) + return nullptr; + FXFT_Set_Pixel_Sizes(face, 0, 64); + return face; +} + +FXFT_Face CFPF_SkiaFontMgr::GetFontFace(const CFX_ByteStringC& bsFile, + int32_t iFaceIndex) { + if (bsFile.IsEmpty()) + return nullptr; + if (iFaceIndex < 0) + return nullptr; + FXFT_Open_Args args; + args.flags = FT_OPEN_PATHNAME; + args.pathname = const_cast(bsFile.c_str()); + FXFT_Face face; + if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) + return nullptr; + FXFT_Set_Pixel_Sizes(face, 0, 64); + return face; +} + +FXFT_Face CFPF_SkiaFontMgr::GetFontFace(const uint8_t* pBuffer, + size_t szBuffer, + int32_t iFaceIndex) { + if (!pBuffer || szBuffer < 1) + return nullptr; + if (iFaceIndex < 0) + return nullptr; + FXFT_Open_Args args; + args.flags = FT_OPEN_MEMORY; + args.memory_base = pBuffer; + args.memory_size = szBuffer; + FXFT_Face face; + if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) + return nullptr; + FXFT_Set_Pixel_Sizes(face, 0, 64); + return face; +} + +void CFPF_SkiaFontMgr::ScanPath(const CFX_ByteString& path) { + DIR* handle = FX_OpenFolder(path.c_str()); + if (!handle) + return; + CFX_ByteString filename; + bool bFolder = false; + while (FX_GetNextFile(handle, &filename, &bFolder)) { + if (bFolder) { + if (filename == "." || filename == "..") + continue; + } else { + CFX_ByteString ext = filename.Right(4); + ext.MakeLower(); + if (ext != ".ttf" && ext != ".ttc" && ext != ".otf") + continue; + } + CFX_ByteString fullpath(path); + fullpath += "/"; + fullpath += filename; + if (bFolder) + ScanPath(fullpath); + else + ScanFile(fullpath); + } + FX_CloseFolder(handle); +} + +void CFPF_SkiaFontMgr::ScanFile(const CFX_ByteString& file) { + FXFT_Face face = GetFontFace(file.AsStringC()); + if (!face) + return; + CFPF_SkiaPathFont* pFontDesc = new CFPF_SkiaPathFont; + pFontDesc->SetPath(file.c_str()); + ReportFace(face, pFontDesc); + m_FontFaces.push_back(pFontDesc); + FXFT_Done_Face(face); +} + +void CFPF_SkiaFontMgr::ReportFace(FXFT_Face face, + CFPF_SkiaFontDescriptor* pFontDesc) { + if (!face || !pFontDesc) + return; + pFontDesc->SetFamily(FXFT_Get_Face_Family_Name(face)); + if (FXFT_Is_Face_Bold(face)) + pFontDesc->m_dwStyle |= FXFONT_BOLD; + if (FXFT_Is_Face_Italic(face)) + pFontDesc->m_dwStyle |= FXFONT_ITALIC; + if (FT_IS_FIXED_WIDTH(face)) + pFontDesc->m_dwStyle |= FXFONT_FIXED_PITCH; + TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(face, ft_sfnt_os2); + if (pOS2) { + if (pOS2->ulCodePageRange1 & (1 << 31)) + pFontDesc->m_dwStyle |= FXFONT_SYMBOLIC; + if (pOS2->panose[0] == 2) { + uint8_t uSerif = pOS2->panose[1]; + if ((uSerif > 1 && uSerif < 10) || uSerif > 13) + pFontDesc->m_dwStyle |= FXFONT_SERIF; + } + } + if (pOS2 && (pOS2->ulCodePageRange1 & (1 << 31))) + pFontDesc->m_dwStyle |= FXFONT_SYMBOLIC; + pFontDesc->m_dwCharsets = FPF_SkiaGetFaceCharset(pOS2); + pFontDesc->m_iFaceIndex = face->face_index; + pFontDesc->m_iGlyphNum = face->num_glyphs; +} diff --git a/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafontmgr.h b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafontmgr.h new file mode 100644 index 000000000000..4d0ea0e0d2df --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiafontmgr.h @@ -0,0 +1,52 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_ANDROID_CFPF_SKIAFONTMGR_H_ +#define CORE_FXGE_ANDROID_CFPF_SKIAFONTMGR_H_ + +#include +#include + +#include "core/fxcrt/fx_stream.h" +#include "core/fxcrt/fx_string.h" +#include "core/fxge/fx_font.h" + +#define FPF_MATCHFONT_REPLACEANSI 1 + +class CFPF_SkiaFont; +class CFPF_SkiaFontDescriptor; + +class CFPF_SkiaFontMgr { + public: + CFPF_SkiaFontMgr(); + ~CFPF_SkiaFontMgr(); + + void LoadSystemFonts(); + CFPF_SkiaFont* CreateFont(const CFX_ByteStringC& bsFamilyname, + uint8_t uCharset, + uint32_t dwStyle, + uint32_t dwMatch = 0); + + bool InitFTLibrary(); + FXFT_Face GetFontFace(const CFX_RetainPtr& pFileRead, + int32_t iFaceIndex = 0); + FXFT_Face GetFontFace(const CFX_ByteStringC& bsFile, int32_t iFaceIndex = 0); + FXFT_Face GetFontFace(const uint8_t* pBuffer, + size_t szBuffer, + int32_t iFaceIndex = 0); + + private: + void ScanPath(const CFX_ByteString& path); + void ScanFile(const CFX_ByteString& file); + void ReportFace(FXFT_Face face, CFPF_SkiaFontDescriptor* pFontDesc); + + bool m_bLoaded; + FXFT_Library m_FTLibrary; + std::vector m_FontFaces; + std::map m_FamilyFonts; +}; + +#endif // CORE_FXGE_ANDROID_CFPF_SKIAFONTMGR_H_ diff --git a/modules/pdfium/pdfium/core/fxge/android/cfpf_skiapathfont.h b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiapathfont.h new file mode 100644 index 000000000000..f1cff2574b7d --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/android/cfpf_skiapathfont.h @@ -0,0 +1,33 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_ANDROID_CFPF_SKIAPATHFONT_H_ +#define CORE_FXGE_ANDROID_CFPF_SKIAPATHFONT_H_ + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/android/cfpf_skiafontdescriptor.h" + +#define FPF_SKIAFONTTYPE_Path 1 + +class CFPF_SkiaPathFont : public CFPF_SkiaFontDescriptor { + public: + CFPF_SkiaPathFont() : m_pPath(nullptr) {} + ~CFPF_SkiaPathFont() override { FX_Free(m_pPath); } + + // CFPF_SkiaFontDescriptor + int32_t GetType() const override { return FPF_SKIAFONTTYPE_Path; } + + void SetPath(const FX_CHAR* pPath) { + FX_Free(m_pPath); + int32_t iSize = FXSYS_strlen(pPath); + m_pPath = FX_Alloc(FX_CHAR, iSize + 1); + FXSYS_memcpy(m_pPath, pPath, iSize * sizeof(FX_CHAR)); + m_pPath[iSize] = 0; + } + FX_CHAR* m_pPath; +}; + +#endif // CORE_FXGE_ANDROID_CFPF_SKIAPATHFONT_H_ diff --git a/modules/pdfium/pdfium/core/fxge/android/cfx_androidfontinfo.cpp b/modules/pdfium/pdfium/core/fxge/android/cfx_androidfontinfo.cpp new file mode 100644 index 000000000000..03a7ffbd9e42 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/android/cfx_androidfontinfo.cpp @@ -0,0 +1,87 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/android/cfx_androidfontinfo.h" + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/android/cfpf_skiafont.h" +#include "core/fxge/android/cfpf_skiafontmgr.h" +#include "core/fxge/cfx_fontmapper.h" + +CFX_AndroidFontInfo::CFX_AndroidFontInfo() : m_pFontMgr(nullptr) {} +CFX_AndroidFontInfo::~CFX_AndroidFontInfo() {} +bool CFX_AndroidFontInfo::Init(CFPF_SkiaFontMgr* pFontMgr) { + if (!pFontMgr) + return false; + + pFontMgr->LoadSystemFonts(); + m_pFontMgr = pFontMgr; + return true; +} + +bool CFX_AndroidFontInfo::EnumFontList(CFX_FontMapper* pMapper) { + return false; +} + +void* CFX_AndroidFontInfo::MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* face, + int& iExact) { + if (!m_pFontMgr) + return nullptr; + + uint32_t dwStyle = 0; + if (weight >= 700) + dwStyle |= FXFONT_BOLD; + if (bItalic) + dwStyle |= FXFONT_ITALIC; + if (pitch_family & FXFONT_FF_FIXEDPITCH) + dwStyle |= FXFONT_FIXED_PITCH; + if (pitch_family & FXFONT_FF_SCRIPT) + dwStyle |= FXFONT_SCRIPT; + if (pitch_family & FXFONT_FF_ROMAN) + dwStyle |= FXFONT_SERIF; + return m_pFontMgr->CreateFont(face, charset, dwStyle, + FPF_MATCHFONT_REPLACEANSI); +} + +void* CFX_AndroidFontInfo::GetFont(const FX_CHAR* face) { + return nullptr; +} + +uint32_t CFX_AndroidFontInfo::GetFontData(void* hFont, + uint32_t table, + uint8_t* buffer, + uint32_t size) { + if (!hFont) + return 0; + return static_cast(hFont)->GetFontData(table, buffer, size); +} + +bool CFX_AndroidFontInfo::GetFaceName(void* hFont, CFX_ByteString& name) { + if (!hFont) + return false; + + name = static_cast(hFont)->GetFamilyName(); + return true; +} + +bool CFX_AndroidFontInfo::GetFontCharset(void* hFont, int& charset) { + if (!hFont) + return false; + + charset = static_cast(hFont)->GetCharset(); + return false; +} + +void CFX_AndroidFontInfo::DeleteFont(void* hFont) { + if (!hFont) + return; + + static_cast(hFont)->Release(); +} diff --git a/modules/pdfium/pdfium/core/fxge/android/cfx_androidfontinfo.h b/modules/pdfium/pdfium/core/fxge/android/cfx_androidfontinfo.h new file mode 100644 index 000000000000..94e1db88ac03 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/android/cfx_androidfontinfo.h @@ -0,0 +1,45 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_ANDROID_CFX_ANDROIDFONTINFO_H_ +#define CORE_FXGE_ANDROID_CFX_ANDROIDFONTINFO_H_ + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/cfx_fontmapper.h" +#include "core/fxge/fx_font.h" +#include "core/fxge/ifx_systemfontinfo.h" + +class CFPF_SkiaFontMgr; + +class CFX_AndroidFontInfo : public IFX_SystemFontInfo { + public: + CFX_AndroidFontInfo(); + ~CFX_AndroidFontInfo() override; + + bool Init(CFPF_SkiaFontMgr* pFontMgr); + + // IFX_SystemFontInfo: + bool EnumFontList(CFX_FontMapper* pMapper) override; + void* MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* face, + int& bExact) override; + void* GetFont(const FX_CHAR* face) override; + uint32_t GetFontData(void* hFont, + uint32_t table, + uint8_t* buffer, + uint32_t size) override; + bool GetFaceName(void* hFont, CFX_ByteString& name) override; + bool GetFontCharset(void* hFont, int& charset) override; + void DeleteFont(void* hFont) override; + + protected: + CFPF_SkiaFontMgr* m_pFontMgr; +}; + +#endif // CORE_FXGE_ANDROID_CFX_ANDROIDFONTINFO_H_ diff --git a/modules/pdfium/pdfium/core/fxge/android/fx_android_imp.cpp b/modules/pdfium/pdfium/core/fxge/android/fx_android_imp.cpp new file mode 100644 index 000000000000..b8e7c5b21809 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/android/fx_android_imp.cpp @@ -0,0 +1,32 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/cfx_gemodule.h" + +#include +#include + +#include "core/fxge/android/cfpf_skiadevicemodule.h" +#include "core/fxge/android/cfx_androidfontinfo.h" + +void CFX_GEModule::InitPlatform() { + CFPF_SkiaDeviceModule* pDeviceModule = CFPF_GetSkiaDeviceModule(); + if (!pDeviceModule) + return; + + CFPF_SkiaFontMgr* pFontMgr = pDeviceModule->GetFontMgr(); + if (pFontMgr) { + std::unique_ptr pFontInfo(new CFX_AndroidFontInfo); + pFontInfo->Init(pFontMgr); + m_pFontMgr->SetSystemFontInfo(std::move(pFontInfo)); + } + m_pPlatformData = pDeviceModule; +} + +void CFX_GEModule::DestroyPlatform() { + if (m_pPlatformData) + static_cast(m_pPlatformData)->Destroy(); +} diff --git a/modules/pdfium/pdfium/core/fxge/apple/apple_int.h b/modules/pdfium/pdfium/core/fxge/apple/apple_int.h new file mode 100644 index 000000000000..fed6abcfb09d --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/apple/apple_int.h @@ -0,0 +1,48 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_APPLE_APPLE_INT_H_ +#define CORE_FXGE_APPLE_APPLE_INT_H_ + +#include "core/fxcrt/fx_system.h" + +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "core/fxge/fx_dib.h" +#include "core/fxge/ifx_renderdevicedriver.h" + +#include + +class CQuartz2D { + public: + void* createGraphics(CFX_DIBitmap* bitmap); + void destroyGraphics(void* graphics); + + void* CreateFont(const uint8_t* pFontData, uint32_t dwFontSize); + void DestroyFont(void* pFont); + void setGraphicsTextMatrix(void* graphics, CFX_Matrix* matrix); + bool drawGraphicsString(void* graphics, + void* font, + FX_FLOAT fontSize, + uint16_t* glyphIndices, + CGPoint* glyphPositions, + int32_t chars, + FX_ARGB argb, + CFX_Matrix* matrix = nullptr); + void saveGraphicsState(void* graphics); + void restoreGraphicsState(void* graphics); +}; + +class CApplePlatform { + public: + CApplePlatform() {} + ~CApplePlatform() {} + + CQuartz2D m_quartz2d; +}; + +#endif // CORE_FXGE_APPLE_APPLE_INT_H_ diff --git a/modules/pdfium/pdfium/core/fxge/apple/fx_apple_platform.cpp b/modules/pdfium/pdfium/core/fxge/apple/fx_apple_platform.cpp new file mode 100644 index 000000000000..f576eb0ba272 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/apple/fx_apple_platform.cpp @@ -0,0 +1,183 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fx_system.h" + +#ifndef _SKIA_SUPPORT_ +#include "core/fxge/agg/fx_agg_driver.h" +#endif + +#include "core/fxge/apple/apple_int.h" +#include "core/fxge/cfx_facecache.h" +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/cfx_renderdevice.h" +#include "core/fxge/dib/dib_int.h" +#include "core/fxge/fx_freetype.h" +#include "core/fxge/ge/cfx_cliprgn.h" +#include "core/fxge/ge/fx_text_int.h" + +#ifndef _SKIA_SUPPORT_ + +namespace { + +void DoNothing(void* info, const void* data, size_t size) {} + +bool CGDrawGlyphRun(CGContextRef pContext, + int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t argb) { + if (nChars == 0) + return true; + + bool bNegSize = font_size < 0; + if (bNegSize) + font_size = -font_size; + + CFX_Matrix new_matrix; + if (pObject2Device) + new_matrix.Concat(*pObject2Device); + + CQuartz2D& quartz2d = + static_cast(CFX_GEModule::Get()->GetPlatformData()) + ->m_quartz2d; + if (!pFont->GetPlatformFont()) { + if (pFont->GetPsName() == "DFHeiStd-W5") + return false; + + pFont->SetPlatformFont( + quartz2d.CreateFont(pFont->GetFontData(), pFont->GetSize())); + if (!pFont->GetPlatformFont()) + return false; + } + CFX_FixedBufGrow glyph_indices(nChars); + CFX_FixedBufGrow glyph_positions(nChars); + for (int i = 0; i < nChars; i++) { + glyph_indices[i] = + pCharPos[i].m_ExtGID ? pCharPos[i].m_ExtGID : pCharPos[i].m_GlyphIndex; + if (bNegSize) + glyph_positions[i].x = -pCharPos[i].m_Origin.x; + else + glyph_positions[i].x = pCharPos[i].m_Origin.x; + glyph_positions[i].y = pCharPos[i].m_Origin.y; + } + if (bNegSize) { + new_matrix.a = -new_matrix.a; + new_matrix.c = -new_matrix.c; + } else { + new_matrix.b = -new_matrix.b; + new_matrix.d = -new_matrix.d; + } + quartz2d.setGraphicsTextMatrix(pContext, &new_matrix); + return quartz2d.drawGraphicsString(pContext, pFont->GetPlatformFont(), + font_size, glyph_indices, glyph_positions, + nChars, argb, nullptr); +} + +} // namespace + +void CFX_AggDeviceDriver::InitPlatform() { + CQuartz2D& quartz2d = + static_cast(CFX_GEModule::Get()->GetPlatformData()) + ->m_quartz2d; + m_pPlatformGraphics = quartz2d.createGraphics(m_pBitmap); +} + +void CFX_AggDeviceDriver::DestroyPlatform() { + CQuartz2D& quartz2d = + static_cast(CFX_GEModule::Get()->GetPlatformData()) + ->m_quartz2d; + if (m_pPlatformGraphics) { + quartz2d.destroyGraphics(m_pPlatformGraphics); + m_pPlatformGraphics = nullptr; + } +} + +bool CFX_AggDeviceDriver::DrawDeviceText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t argb) { + if (!pFont) + return false; + + bool bBold = pFont->IsBold(); + if (!bBold && pFont->GetSubstFont() && + pFont->GetSubstFont()->m_Weight >= 500 && + pFont->GetSubstFont()->m_Weight <= 600) { + return false; + } + for (int i = 0; i < nChars; i++) { + if (pCharPos[i].m_bGlyphAdjust) + return false; + } + CGContextRef ctx = CGContextRef(m_pPlatformGraphics); + if (!ctx) + return false; + + CGContextSaveGState(ctx); + CGContextSetTextDrawingMode(ctx, kCGTextFillClip); + CGRect rect_cg; + CGImageRef pImageCG = nullptr; + if (m_pClipRgn) { + rect_cg = + CGRectMake(m_pClipRgn->GetBox().left, m_pClipRgn->GetBox().top, + m_pClipRgn->GetBox().Width(), m_pClipRgn->GetBox().Height()); + const CFX_DIBitmap* pClipMask = m_pClipRgn->GetMask().GetObject(); + if (pClipMask) { + CGDataProviderRef pClipMaskDataProvider = CGDataProviderCreateWithData( + nullptr, pClipMask->GetBuffer(), + pClipMask->GetPitch() * pClipMask->GetHeight(), DoNothing); + CGFloat decode_f[2] = {255.f, 0.f}; + pImageCG = CGImageMaskCreate( + pClipMask->GetWidth(), pClipMask->GetHeight(), 8, 8, + pClipMask->GetPitch(), pClipMaskDataProvider, decode_f, false); + CGDataProviderRelease(pClipMaskDataProvider); + } + } else { + rect_cg = CGRectMake(0, 0, m_pBitmap->GetWidth(), m_pBitmap->GetHeight()); + } + rect_cg = CGContextConvertRectToDeviceSpace(ctx, rect_cg); + if (pImageCG) + CGContextClipToMask(ctx, rect_cg, pImageCG); + else + CGContextClipToRect(ctx, rect_cg); + + bool ret = CGDrawGlyphRun(ctx, nChars, pCharPos, pFont, pObject2Device, + font_size, argb); + if (pImageCG) + CGImageRelease(pImageCG); + CGContextRestoreGState(ctx); + return ret; +} + +#endif // _SKIA_SUPPORT_ + +void CFX_FaceCache::InitPlatform() {} + +void CFX_FaceCache::DestroyPlatform() {} + +CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext( + const CFX_Font* pFont, + uint32_t glyph_index, + const CFX_Matrix* pMatrix, + int dest_width, + int anti_alias) { + return nullptr; +} + +void CFX_Font::ReleasePlatformResource() { + if (m_pPlatformFont) { + CQuartz2D& quartz2d = + static_cast(CFX_GEModule::Get()->GetPlatformData()) + ->m_quartz2d; + quartz2d.DestroyFont(m_pPlatformFont); + m_pPlatformFont = nullptr; + } +} diff --git a/modules/pdfium/pdfium/core/fxge/apple/fx_mac_imp.cpp b/modules/pdfium/pdfium/core/fxge/apple/fx_mac_imp.cpp new file mode 100644 index 000000000000..c05aea34f54b --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/apple/fx_mac_imp.cpp @@ -0,0 +1,139 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include "core/fxge/apple/apple_int.h" +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/ge/cfx_folderfontinfo.h" +#include "core/fxge/ifx_systemfontinfo.h" + +namespace { + +const struct { + const FX_CHAR* m_pName; + const FX_CHAR* m_pSubstName; +} g_Base14Substs[] = { + {"Courier", "Courier New"}, + {"Courier-Bold", "Courier New Bold"}, + {"Courier-BoldOblique", "Courier New Bold Italic"}, + {"Courier-Oblique", "Courier New Italic"}, + {"Helvetica", "Arial"}, + {"Helvetica-Bold", "Arial Bold"}, + {"Helvetica-BoldOblique", "Arial Bold Italic"}, + {"Helvetica-Oblique", "Arial Italic"}, + {"Times-Roman", "Times New Roman"}, + {"Times-Bold", "Times New Roman Bold"}, + {"Times-BoldItalic", "Times New Roman Bold Italic"}, + {"Times-Italic", "Times New Roman Italic"}, +}; + +class CFX_MacFontInfo : public CFX_FolderFontInfo { + public: + CFX_MacFontInfo() {} + ~CFX_MacFontInfo() override {} + + // CFX_FolderFontInfo + void* MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* family, + int& iExact) override; +}; + +const char JAPAN_GOTHIC[] = "Hiragino Kaku Gothic Pro W6"; +const char JAPAN_MINCHO[] = "Hiragino Mincho Pro W6"; + +void GetJapanesePreference(CFX_ByteString* face, int weight, int pitch_family) { + if (face->Find("Gothic") >= 0) { + *face = JAPAN_GOTHIC; + return; + } + *face = ((pitch_family & FXFONT_FF_ROMAN) || weight <= 400) ? JAPAN_MINCHO + : JAPAN_GOTHIC; +} + +void* CFX_MacFontInfo::MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* cstr_face, + int& iExact) { + CFX_ByteString face = cstr_face; + for (size_t i = 0; i < FX_ArraySize(g_Base14Substs); ++i) { + if (face == CFX_ByteStringC(g_Base14Substs[i].m_pName)) { + face = g_Base14Substs[i].m_pSubstName; + iExact = true; + return GetFont(face.c_str()); + } + } + + // The request may not ask for the bold and/or italic version of a font by + // name. So try to construct the appropriate name. This is not 100% foolproof + // as there are fonts that have "Oblique" or "BoldOblique" or "Heavy" in their + // names instead. But this at least works for common fonts like Arial and + // Times New Roman. A more sophisticated approach would be to find all the + // fonts in |m_FontList| with |face| in the name, and examine the fonts to + // see which best matches the requested characteristics. + if (face.Find("Bold") == -1 && face.Find("Italic") == -1) { + CFX_ByteString new_face = face; + if (weight > 400) + new_face += " Bold"; + if (bItalic) + new_face += " Italic"; + auto it = m_FontList.find(new_face); + if (it != m_FontList.end()) + return it->second; + } + + auto it = m_FontList.find(face); + if (it != m_FontList.end()) + return it->second; + + if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) + return GetFont("Courier New"); + + if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_SYMBOL_CHARSET) + return nullptr; + + switch (charset) { + case FXFONT_SHIFTJIS_CHARSET: + GetJapanesePreference(&face, weight, pitch_family); + break; + case FXFONT_GB2312_CHARSET: + face = "STSong"; + break; + case FXFONT_HANGUL_CHARSET: + face = "AppleMyungjo"; + break; + case FXFONT_CHINESEBIG5_CHARSET: + face = "LiSong Pro Light"; + } + it = m_FontList.find(face); + return it != m_FontList.end() ? it->second : nullptr; +} + +} // namespace + +std::unique_ptr IFX_SystemFontInfo::CreateDefault( + const char** pUnused) { + CFX_MacFontInfo* pInfo(new CFX_MacFontInfo); + pInfo->AddPath("~/Library/Fonts"); + pInfo->AddPath("/Library/Fonts"); + pInfo->AddPath("/System/Library/Fonts"); + return std::unique_ptr(pInfo); +} + +void CFX_GEModule::InitPlatform() { + m_pPlatformData = new CApplePlatform; + m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault(nullptr)); +} + +void CFX_GEModule::DestroyPlatform() { + delete reinterpret_cast(m_pPlatformData); + m_pPlatformData = nullptr; +} diff --git a/modules/pdfium/pdfium/core/fxge/apple/fx_quartz_device.cpp b/modules/pdfium/pdfium/core/fxge/apple/fx_quartz_device.cpp new file mode 100644 index 000000000000..0cd5b6b93a07 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/apple/fx_quartz_device.cpp @@ -0,0 +1,128 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fx_ext.h" + +#if !defined _SKIA_SUPPORT_ && !defined _SKIA_SUPPORT_PATHS_ +#include "core/fxge/agg/fx_agg_driver.h" +#endif + +#include "core/fxcrt/fx_memory.h" +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "core/fxge/dib/dib_int.h" +#include "core/fxge/fx_freetype.h" +#include "core/fxge/ge/fx_text_int.h" +#include "third_party/base/ptr_util.h" + +#include "core/fxge/apple/apple_int.h" +#ifndef CGFLOAT_IS_DOUBLE +#error Expected CGFLOAT_IS_DOUBLE to be defined by CoreGraphics headers +#endif + +void* CQuartz2D::createGraphics(CFX_DIBitmap* pBitmap) { + if (!pBitmap) + return nullptr; + CGBitmapInfo bmpInfo = kCGBitmapByteOrder32Little; + switch (pBitmap->GetFormat()) { + case FXDIB_Rgb32: + bmpInfo |= kCGImageAlphaNoneSkipFirst; + break; + case FXDIB_Argb: + default: + return nullptr; + } + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef context = CGBitmapContextCreate( + pBitmap->GetBuffer(), pBitmap->GetWidth(), pBitmap->GetHeight(), 8, + pBitmap->GetPitch(), colorSpace, bmpInfo); + CGColorSpaceRelease(colorSpace); + return context; +} + +void CQuartz2D::destroyGraphics(void* graphics) { + if (graphics) + CGContextRelease((CGContextRef)graphics); +} + +void* CQuartz2D::CreateFont(const uint8_t* pFontData, uint32_t dwFontSize) { + CGDataProviderRef pDataProvider = CGDataProviderCreateWithData( + nullptr, pFontData, (size_t)dwFontSize, nullptr); + if (!pDataProvider) + return nullptr; + + CGFontRef pCGFont = CGFontCreateWithDataProvider(pDataProvider); + CGDataProviderRelease(pDataProvider); + return pCGFont; +} + +void CQuartz2D::DestroyFont(void* pFont) { + CGFontRelease((CGFontRef)pFont); +} + +void CQuartz2D::setGraphicsTextMatrix(void* graphics, CFX_Matrix* matrix) { + if (!graphics || !matrix) + return; + CGContextRef context = (CGContextRef)graphics; + CGFloat ty = CGBitmapContextGetHeight(context) - matrix->f; + CGContextSetTextMatrix( + context, CGAffineTransformMake(matrix->a, matrix->b, matrix->c, matrix->d, + matrix->e, ty)); +} + +bool CQuartz2D::drawGraphicsString(void* graphics, + void* font, + FX_FLOAT fontSize, + uint16_t* glyphIndices, + CGPoint* glyphPositions, + int32_t charsCount, + FX_ARGB argb, + CFX_Matrix* matrix) { + if (!graphics) + return false; + CGContextRef context = (CGContextRef)graphics; + CGContextSetFont(context, (CGFontRef)font); + CGContextSetFontSize(context, fontSize); + if (matrix) { + CGAffineTransform m = CGContextGetTextMatrix(context); + m = CGAffineTransformConcat( + m, CGAffineTransformMake(matrix->a, matrix->b, matrix->c, matrix->d, + matrix->e, matrix->f)); + CGContextSetTextMatrix(context, m); + } + int32_t a, r, g, b; + ArgbDecode(argb, a, r, g, b); + CGContextSetRGBFillColor(context, r / 255.f, g / 255.f, b / 255.f, a / 255.f); + CGContextSaveGState(context); +#if CGFLOAT_IS_DOUBLE + CGPoint* glyphPositionsCG = new CGPoint[charsCount]; + for (int index = 0; index < charsCount; ++index) { + glyphPositionsCG[index].x = glyphPositions[index].x; + glyphPositionsCG[index].y = glyphPositions[index].y; + } +#else + CGPoint* glyphPositionsCG = (CGPoint*)glyphPositions; +#endif + CGContextShowGlyphsAtPositions(context, (CGGlyph*)glyphIndices, + glyphPositionsCG, charsCount); +#if CGFLOAT_IS_DOUBLE + delete[] glyphPositionsCG; +#endif + CGContextRestoreGState(context); + return true; +} + +void CQuartz2D::saveGraphicsState(void* graphics) { + if (graphics) + CGContextSaveGState((CGContextRef)graphics); +} + +void CQuartz2D::restoreGraphicsState(void* graphics) { + if (graphics) + CGContextRestoreGState((CGContextRef)graphics); +} diff --git a/modules/pdfium/pdfium/core/fxge/cfx_facecache.h b/modules/pdfium/pdfium/core/fxge/cfx_facecache.h new file mode 100644 index 000000000000..44ed0b287ac2 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_facecache.h @@ -0,0 +1,65 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_FACECACHE_H_ +#define CORE_FXGE_CFX_FACECACHE_H_ + +#include +#include + +#include "core/fxge/fx_font.h" +#include "core/fxge/fx_freetype.h" + +class CFX_FaceCache { + public: + explicit CFX_FaceCache(FXFT_Face face); + ~CFX_FaceCache(); + const CFX_GlyphBitmap* LoadGlyphBitmap(const CFX_Font* pFont, + uint32_t glyph_index, + bool bFontStyle, + const CFX_Matrix* pMatrix, + int dest_width, + int anti_alias, + int& text_flags); + const CFX_PathData* LoadGlyphPath(const CFX_Font* pFont, + uint32_t glyph_index, + int dest_width); + +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ + CFX_TypeFace* GetDeviceCache(const CFX_Font* pFont); +#endif + + private: + CFX_GlyphBitmap* RenderGlyph(const CFX_Font* pFont, + uint32_t glyph_index, + bool bFontStyle, + const CFX_Matrix* pMatrix, + int dest_width, + int anti_alias); + CFX_GlyphBitmap* RenderGlyph_Nativetext(const CFX_Font* pFont, + uint32_t glyph_index, + const CFX_Matrix* pMatrix, + int dest_width, + int anti_alias); + CFX_GlyphBitmap* LookUpGlyphBitmap(const CFX_Font* pFont, + const CFX_Matrix* pMatrix, + const CFX_ByteString& FaceGlyphsKey, + uint32_t glyph_index, + bool bFontStyle, + int dest_width, + int anti_alias); + void InitPlatform(); + void DestroyPlatform(); + + FXFT_Face const m_Face; + std::map> m_SizeMap; + std::map> m_PathMap; +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ + CFX_TypeFace* m_pTypeface; +#endif +}; + +#endif // CORE_FXGE_CFX_FACECACHE_H_ diff --git a/modules/pdfium/pdfium/core/fxge/cfx_fontcache.h b/modules/pdfium/pdfium/core/fxge/cfx_fontcache.h new file mode 100644 index 000000000000..52ac3fa342bb --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_fontcache.h @@ -0,0 +1,42 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_FONTCACHE_H_ +#define CORE_FXGE_CFX_FONTCACHE_H_ + +#include +#include + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/fx_font.h" +#include "core/fxge/fx_freetype.h" + +class CFX_FaceCache; + +class CFX_FontCache { + public: + CFX_FontCache(); + ~CFX_FontCache(); + CFX_FaceCache* GetCachedFace(const CFX_Font* pFont); + void ReleaseCachedFace(const CFX_Font* pFont); +#ifdef _SKIA_SUPPORT_ + CFX_TypeFace* GetDeviceCache(const CFX_Font* pFont); +#endif + + private: + struct CountedFaceCache { + CountedFaceCache(); + ~CountedFaceCache(); + std::unique_ptr m_Obj; + uint32_t m_nCount; + }; + + using CFX_FTCacheMap = std::map>; + CFX_FTCacheMap m_FTFaceMap; + CFX_FTCacheMap m_ExtFaceMap; +}; + +#endif // CORE_FXGE_CFX_FONTCACHE_H_ diff --git a/modules/pdfium/pdfium/core/fxge/cfx_fontmapper.h b/modules/pdfium/pdfium/core/fxge/cfx_fontmapper.h new file mode 100644 index 000000000000..96630a77dfdb --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_fontmapper.h @@ -0,0 +1,86 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_FONTMAPPER_H_ +#define CORE_FXGE_CFX_FONTMAPPER_H_ + +#include +#include +#include + +#include "core/fxge/cfx_fontmgr.h" +#include "core/fxge/fx_font.h" + +class CFX_SubstFont; + +class CFX_FontMapper { + public: + explicit CFX_FontMapper(CFX_FontMgr* mgr); + ~CFX_FontMapper(); + + void SetSystemFontInfo(std::unique_ptr pFontInfo); + IFX_SystemFontInfo* GetSystemFontInfo() { return m_pFontInfo.get(); } + void AddInstalledFont(const CFX_ByteString& name, int charset); + void LoadInstalledFonts(); + + FXFT_Face FindSubstFont(const CFX_ByteString& face_name, + bool bTrueType, + uint32_t flags, + int weight, + int italic_angle, + int CharsetCP, + CFX_SubstFont* pSubstFont); +#ifdef PDF_ENABLE_XFA + FXFT_Face FindSubstFontByUnicode(uint32_t dwUnicode, + uint32_t flags, + int weight, + int italic_angle); +#endif // PDF_ENABLE_XFA + bool IsBuiltinFace(const FXFT_Face face) const; + int GetFaceSize() const; + CFX_ByteString GetFaceName(int index) const { + return m_FaceArray[index].name; + } + + std::vector m_InstalledTTFonts; + std::vector> m_LocalizedTTFonts; + + private: + static const size_t MM_FACE_COUNT = 2; + static const size_t FOXIT_FACE_COUNT = 14; + + CFX_ByteString GetPSNameFromTT(void* hFont); + CFX_ByteString MatchInstalledFonts(const CFX_ByteString& norm_name); + FXFT_Face UseInternalSubst(CFX_SubstFont* pSubstFont, + int iBaseFont, + int italic_angle, + int weight, + int picthfamily); + FXFT_Face GetCachedTTCFace(void* hFont, + const uint32_t tableTTCF, + uint32_t ttc_size, + uint32_t font_size); + FXFT_Face GetCachedFace(void* hFont, + CFX_ByteString SubstName, + int weight, + bool bItalic, + uint32_t font_size); + + struct FaceData { + CFX_ByteString name; + uint32_t charset; + }; + + bool m_bListLoaded; + FXFT_Face m_MMFaces[MM_FACE_COUNT]; + CFX_ByteString m_LastFamily; + std::vector m_FaceArray; + std::unique_ptr m_pFontInfo; + FXFT_Face m_FoxitFaces[FOXIT_FACE_COUNT]; + CFX_FontMgr* const m_pFontMgr; +}; + +#endif // CORE_FXGE_CFX_FONTMAPPER_H_ diff --git a/modules/pdfium/pdfium/core/fxge/cfx_fontmgr.h b/modules/pdfium/pdfium/core/fxge/cfx_fontmgr.h new file mode 100644 index 000000000000..432f34b38ca1 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_fontmgr.h @@ -0,0 +1,69 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_FONTMGR_H_ +#define CORE_FXGE_CFX_FONTMGR_H_ + +#include +#include + +#include "core/fxge/fx_font.h" + +class IFX_SystemFontInfo; +class CFX_FontMapper; +class CFX_SubstFont; +class CTTFontDesc; + +class CFX_FontMgr { + public: + CFX_FontMgr(); + ~CFX_FontMgr(); + + void InitFTLibrary(); + + FXFT_Face GetCachedFace(const CFX_ByteString& face_name, + int weight, + bool bItalic, + uint8_t*& pFontData); + FXFT_Face AddCachedFace(const CFX_ByteString& face_name, + int weight, + bool bItalic, + uint8_t* pData, + uint32_t size, + int face_index); + FXFT_Face GetCachedTTCFace(int ttc_size, + uint32_t checksum, + int font_offset, + uint8_t*& pFontData); + FXFT_Face AddCachedTTCFace(int ttc_size, + uint32_t checksum, + uint8_t* pData, + uint32_t size, + int font_offset); + FXFT_Face GetFileFace(const FX_CHAR* filename, int face_index); + FXFT_Face GetFixedFace(const uint8_t* pData, uint32_t size, int face_index); + void ReleaseFace(FXFT_Face face); + void SetSystemFontInfo(std::unique_ptr pFontInfo); + FXFT_Face FindSubstFont(const CFX_ByteString& face_name, + bool bTrueType, + uint32_t flags, + int weight, + int italic_angle, + int CharsetCP, + CFX_SubstFont* pSubstFont); + bool GetBuiltinFont(size_t index, const uint8_t** pFontData, uint32_t* size); + CFX_FontMapper* GetBuiltinMapper() const { return m_pBuiltinMapper.get(); } + FXFT_Library GetFTLibrary() const { return m_FTLibrary; } + bool FTLibrarySupportsHinting() const { return m_FTLibrarySupportsHinting; } + + private: + std::unique_ptr m_pBuiltinMapper; + std::map m_FaceMap; + FXFT_Library m_FTLibrary; + bool m_FTLibrarySupportsHinting; +}; + +#endif // CORE_FXGE_CFX_FONTMGR_H_ diff --git a/modules/pdfium/pdfium/core/fxge/cfx_fxgedevice.h b/modules/pdfium/pdfium/core/fxge/cfx_fxgedevice.h new file mode 100644 index 000000000000..8358e436667a --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_fxgedevice.h @@ -0,0 +1,46 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_FXGEDEVICE_H_ +#define CORE_FXGE_CFX_FXGEDEVICE_H_ + +#include "core/fxge/cfx_renderdevice.h" +#include "core/fxge/fx_dib.h" + +class SkPictureRecorder; + +class CFX_FxgeDevice : public CFX_RenderDevice { + public: + CFX_FxgeDevice(); + ~CFX_FxgeDevice() override; + + bool Attach(CFX_DIBitmap* pBitmap, + bool bRgbByteOrder, + CFX_DIBitmap* pOriDevice, + bool bGroupKnockout); + bool Create(int width, + int height, + FXDIB_Format format, + CFX_DIBitmap* pOriDevice); + +#ifdef _SKIA_SUPPORT_ + bool AttachRecorder(SkPictureRecorder* recorder); + void Clear(uint32_t color); + SkPictureRecorder* CreateRecorder(int size_x, int size_y); + void DebugVerifyBitmapIsPreMultiplied() const override; + bool SetBitsWithMask(const CFX_DIBSource* pBitmap, + const CFX_DIBSource* pMask, + int left, + int top, + int bitmap_alpha, + int blend_type) override; +#endif + + private: + bool m_bOwnedBitmap; +}; + +#endif // CORE_FXGE_CFX_FXGEDEVICE_H_ diff --git a/modules/pdfium/pdfium/core/fxge/cfx_gemodule.h b/modules/pdfium/pdfium/core/fxge/cfx_gemodule.h new file mode 100644 index 000000000000..c5bd84100257 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_gemodule.h @@ -0,0 +1,50 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_GEMODULE_H_ +#define CORE_FXGE_CFX_GEMODULE_H_ + +#include + +#include "core/fxge/cfx_fontmgr.h" +#include "core/fxge/fx_font.h" + +class CCodec_ModuleMgr; +class CFX_FontCache; +class CFX_FontMgr; + +class CFX_GEModule { + public: + static CFX_GEModule* Get(); + static void Destroy(); + + void Init(const char** pUserFontPaths, CCodec_ModuleMgr* pCodecModule); + CFX_FontCache* GetFontCache(); + CFX_FontMgr* GetFontMgr() { return m_pFontMgr.get(); } + void SetTextGamma(FX_FLOAT gammaValue); + const uint8_t* GetTextGammaTable() const; + + CCodec_ModuleMgr* GetCodecModule() { return m_pCodecModule; } + void* GetPlatformData() { return m_pPlatformData; } + + FXFT_Library m_FTLibrary; + + private: + CFX_GEModule(); + ~CFX_GEModule(); + + void InitPlatform(); + void DestroyPlatform(); + + uint8_t m_GammaValue[256]; + CFX_FontCache* m_pFontCache; + std::unique_ptr m_pFontMgr; + CCodec_ModuleMgr* m_pCodecModule; + void* m_pPlatformData; + const char** m_pUserFontPaths; +}; + +#endif // CORE_FXGE_CFX_GEMODULE_H_ diff --git a/modules/pdfium/pdfium/core/fxge/cfx_graphstate.h b/modules/pdfium/pdfium/core/fxge/cfx_graphstate.h new file mode 100644 index 000000000000..a838dfc17ca6 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_graphstate.h @@ -0,0 +1,44 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_GRAPHSTATE_H_ +#define CORE_FXGE_CFX_GRAPHSTATE_H_ + +#include "core/fxcrt/cfx_shared_copy_on_write.h" +#include "core/fxge/cfx_graphstatedata.h" + +class CPDF_Array; + +class CFX_GraphState { + public: + CFX_GraphState(); + CFX_GraphState(const CFX_GraphState& that); + ~CFX_GraphState(); + + void Emplace(); + + void SetLineDash(CPDF_Array* pArray, FX_FLOAT phase, FX_FLOAT scale); + + FX_FLOAT GetLineWidth() const; + void SetLineWidth(FX_FLOAT width); + + CFX_GraphStateData::LineCap GetLineCap() const; + void SetLineCap(CFX_GraphStateData::LineCap cap); + + CFX_GraphStateData::LineJoin GetLineJoin() const; + void SetLineJoin(CFX_GraphStateData::LineJoin join); + + FX_FLOAT GetMiterLimit() const; + void SetMiterLimit(FX_FLOAT limit); + + // FIXME(tsepez): remove when all GraphStateData usage gone. + const CFX_GraphStateData* GetObject() const { return m_Ref.GetObject(); } + + private: + CFX_SharedCopyOnWrite m_Ref; +}; + +#endif // CORE_FXGE_CFX_GRAPHSTATE_H_ diff --git a/modules/pdfium/pdfium/core/fxge/cfx_graphstatedata.h b/modules/pdfium/pdfium/core/fxge/cfx_graphstatedata.h new file mode 100644 index 000000000000..03e4a8f51a9c --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_graphstatedata.h @@ -0,0 +1,38 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_GRAPHSTATEDATA_H_ +#define CORE_FXGE_CFX_GRAPHSTATEDATA_H_ + +#include "core/fxcrt/fx_system.h" + +class CFX_GraphStateData { + public: + enum LineCap { LineCapButt = 0, LineCapRound = 1, LineCapSquare = 2 }; + + CFX_GraphStateData(); + CFX_GraphStateData(const CFX_GraphStateData& src); + ~CFX_GraphStateData(); + + void Copy(const CFX_GraphStateData& src); + void SetDashCount(int count); + + LineCap m_LineCap; + int m_DashCount; + FX_FLOAT* m_DashArray; + FX_FLOAT m_DashPhase; + + enum LineJoin { + LineJoinMiter = 0, + LineJoinRound = 1, + LineJoinBevel = 2, + }; + LineJoin m_LineJoin; + FX_FLOAT m_MiterLimit; + FX_FLOAT m_LineWidth; +}; + +#endif // CORE_FXGE_CFX_GRAPHSTATEDATA_H_ diff --git a/modules/pdfium/pdfium/core/fxge/cfx_pathdata.h b/modules/pdfium/pdfium/core/fxge/cfx_pathdata.h new file mode 100644 index 000000000000..b0e30e32ad7f --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_pathdata.h @@ -0,0 +1,70 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_PATHDATA_H_ +#define CORE_FXGE_CFX_PATHDATA_H_ + +#include + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxge/cfx_renderdevice.h" + +class FX_PATHPOINT { + public: + FX_PATHPOINT(); + FX_PATHPOINT(const CFX_PointF& point, FXPT_TYPE type, bool close); + FX_PATHPOINT(const FX_PATHPOINT& other); + ~FX_PATHPOINT(); + + bool IsTypeAndOpen(FXPT_TYPE type) const { + return m_Type == type && !m_CloseFigure; + } + + CFX_PointF m_Point; + FXPT_TYPE m_Type; + bool m_CloseFigure; +}; + +class CFX_PathData { + public: + CFX_PathData(); + CFX_PathData(const CFX_PathData& src); + ~CFX_PathData(); + + void Clear(); + + FXPT_TYPE GetType(int index) const { return m_Points[index].m_Type; } + bool IsClosingFigure(int index) const { + return m_Points[index].m_CloseFigure; + } + + CFX_PointF GetPoint(int index) const { return m_Points[index].m_Point; } + const std::vector& GetPoints() const { return m_Points; } + std::vector& GetPoints() { return m_Points; } + + CFX_FloatRect GetBoundingBox() const; + CFX_FloatRect GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const; + + void Transform(const CFX_Matrix* pMatrix); + bool IsRect() const; + bool GetZeroAreaPath(const CFX_Matrix* pMatrix, + bool bAdjust, + CFX_PathData* NewPath, + bool* bThin, + bool* setIdentity) const; + bool IsRect(const CFX_Matrix* pMatrix, CFX_FloatRect* rect) const; + + void Append(const CFX_PathData* pSrc, const CFX_Matrix* pMatrix); + void AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top); + void AppendPoint(const CFX_PointF& pos, FXPT_TYPE type, bool closeFigure); + void ClosePath(); + + private: + std::vector m_Points; +}; + +#endif // CORE_FXGE_CFX_PATHDATA_H_ diff --git a/modules/pdfium/pdfium/core/fxge/cfx_renderdevice.h b/modules/pdfium/pdfium/core/fxge/cfx_renderdevice.h new file mode 100644 index 000000000000..2e9abf9963d5 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_renderdevice.h @@ -0,0 +1,256 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_RENDERDEVICE_H_ +#define CORE_FXGE_CFX_RENDERDEVICE_H_ + +#include + +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/fx_dib.h" +#include "core/fxge/fx_font.h" + +class CFX_Font; +class CFX_GraphStateData; +class IFX_RenderDeviceDriver; + +#define FXDC_DEVICE_CLASS 1 +#define FXDC_PIXEL_WIDTH 2 +#define FXDC_PIXEL_HEIGHT 3 +#define FXDC_BITS_PIXEL 4 +#define FXDC_HORZ_SIZE 5 +#define FXDC_VERT_SIZE 6 +#define FXDC_RENDER_CAPS 7 +#define FXDC_DISPLAY 1 +#define FXDC_PRINTER 2 + +#define FXRC_GET_BITS 0x01 +#define FXRC_BIT_MASK 0x02 +#define FXRC_ALPHA_MASK 0x04 +#define FXRC_ALPHA_PATH 0x10 +#define FXRC_ALPHA_IMAGE 0x20 +#define FXRC_ALPHA_OUTPUT 0x40 +#define FXRC_BLEND_MODE 0x80 +#define FXRC_SOFT_CLIP 0x100 +#define FXRC_CMYK_OUTPUT 0x200 +#define FXRC_BITMASK_OUTPUT 0x400 +#define FXRC_BYTEMASK_OUTPUT 0x800 +#define FXRENDER_IMAGE_LOSSY 0x1000 +#define FXRC_FILLSTROKE_PATH 0x2000 +#define FXRC_SHADING 0x4000 + +#define FXFILL_ALTERNATE 1 +#define FXFILL_WINDING 2 +#define FXFILL_FULLCOVER 4 +#define FXFILL_RECT_AA 8 +#define FX_FILL_STROKE 16 +#define FX_STROKE_ADJUST 32 +#define FX_STROKE_TEXT_MODE 64 +#define FX_FILL_TEXT_MODE 128 +#define FX_ZEROAREA_FILL 256 +#define FXFILL_NOPATHSMOOTH 512 + +#define FXTEXT_CLEARTYPE 0x01 +#define FXTEXT_BGR_STRIPE 0x02 +#define FXTEXT_PRINTGRAPHICTEXT 0x04 +#define FXTEXT_NO_NATIVETEXT 0x08 +#define FXTEXT_PRINTIMAGETEXT 0x10 +#define FXTEXT_NOSMOOTH 0x20 + +enum class FXPT_TYPE : uint8_t { LineTo, BezierTo, MoveTo }; + +class FXTEXT_CHARPOS { + public: + FXTEXT_CHARPOS(); + FXTEXT_CHARPOS(const FXTEXT_CHARPOS&); + ~FXTEXT_CHARPOS(); + + FX_FLOAT m_AdjustMatrix[4]; + CFX_PointF m_Origin; + uint32_t m_GlyphIndex; + int32_t m_FontCharWidth; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + uint32_t m_ExtGID; +#endif + int32_t m_FallbackFontPosition; + bool m_bGlyphAdjust; + bool m_bFontStyle; +}; + +class CFX_RenderDevice { + public: + CFX_RenderDevice(); + virtual ~CFX_RenderDevice(); + + // Take ownership of |pDriver|. + void SetDeviceDriver(std::unique_ptr pDriver); + IFX_RenderDeviceDriver* GetDeviceDriver() const { + return m_pDeviceDriver.get(); + } + + void SaveState(); + void RestoreState(bool bKeepSaved); + + int GetWidth() const { return m_Width; } + int GetHeight() const { return m_Height; } + int GetDeviceClass() const { return m_DeviceClass; } + int GetRenderCaps() const { return m_RenderCaps; } + int GetDeviceCaps(int id) const; + CFX_Matrix GetCTM() const; + CFX_DIBitmap* GetBitmap() const { return m_pBitmap; } + void SetBitmap(CFX_DIBitmap* pBitmap) { m_pBitmap = pBitmap; } + bool CreateCompatibleBitmap(CFX_DIBitmap* pDIB, int width, int height) const; + const FX_RECT& GetClipBox() const { return m_ClipBox; } + bool SetClip_PathFill(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + int fill_mode); + bool SetClip_Rect(const FX_RECT& pRect); + bool SetClip_PathStroke(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState); + bool DrawPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode) { + return DrawPathWithBlend(pPathData, pObject2Device, pGraphState, fill_color, + stroke_color, fill_mode, FXDIB_BLEND_NORMAL); + } + bool DrawPathWithBlend(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode, + int blend_type); + bool SetPixel(int x, int y, uint32_t color); + bool FillRect(const FX_RECT* pRect, uint32_t color) { + return FillRectWithBlend(pRect, color, FXDIB_BLEND_NORMAL); + } + bool FillRectWithBlend(const FX_RECT* pRect, uint32_t color, int blend_type); + bool DrawCosmeticLine(FX_FLOAT x1, + FX_FLOAT y1, + FX_FLOAT x2, + FX_FLOAT y2, + uint32_t color, + int fill_mode, + int blend_type); + + bool GetDIBits(CFX_DIBitmap* pBitmap, int left, int top); + CFX_DIBitmap* GetBackDrop(); + bool SetDIBits(const CFX_DIBSource* pBitmap, int left, int top) { + return SetDIBitsWithBlend(pBitmap, left, top, FXDIB_BLEND_NORMAL); + } + bool SetDIBitsWithBlend(const CFX_DIBSource* pBitmap, + int left, + int top, + int blend_type); + bool StretchDIBits(const CFX_DIBSource* pBitmap, + int left, + int top, + int dest_width, + int dest_height) { + return StretchDIBitsWithFlagsAndBlend(pBitmap, left, top, dest_width, + dest_height, 0, FXDIB_BLEND_NORMAL); + } + bool StretchDIBitsWithFlagsAndBlend(const CFX_DIBSource* pBitmap, + int left, + int top, + int dest_width, + int dest_height, + uint32_t flags, + int blend_type); + bool SetBitMask(const CFX_DIBSource* pBitmap, + int left, + int top, + uint32_t color); + bool StretchBitMask(const CFX_DIBSource* pBitmap, + int left, + int top, + int dest_width, + int dest_height, + uint32_t color); + bool StretchBitMaskWithFlags(const CFX_DIBSource* pBitmap, + int left, + int top, + int dest_width, + int dest_height, + uint32_t color, + uint32_t flags); + bool StartDIBits(const CFX_DIBSource* pBitmap, + int bitmap_alpha, + uint32_t color, + const CFX_Matrix* pMatrix, + uint32_t flags, + void*& handle) { + return StartDIBitsWithBlend(pBitmap, bitmap_alpha, color, pMatrix, flags, + handle, FXDIB_BLEND_NORMAL); + } + bool StartDIBitsWithBlend(const CFX_DIBSource* pBitmap, + int bitmap_alpha, + uint32_t color, + const CFX_Matrix* pMatrix, + uint32_t flags, + void*& handle, + int blend_type); + bool ContinueDIBits(void* handle, IFX_Pause* pPause); + void CancelDIBits(void* handle); + + bool DrawNormalText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + FX_FLOAT font_size, + const CFX_Matrix* pText2Device, + uint32_t fill_color, + uint32_t text_flags); + bool DrawTextPath(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + FX_FLOAT font_size, + const CFX_Matrix* pText2User, + const CFX_Matrix* pUser2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + CFX_PathData* pClippingPath, + int nFlag); + +#ifdef _SKIA_SUPPORT_ + virtual void DebugVerifyBitmapIsPreMultiplied() const; + virtual bool SetBitsWithMask(const CFX_DIBSource* pBitmap, + const CFX_DIBSource* pMask, + int left, + int top, + int bitmap_alpha, + int blend_type); +#endif +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ + void Flush(); +#endif + + private: + void InitDeviceInfo(); + void UpdateClipBox(); + bool DrawFillStrokePath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode, + int blend_type); + + CFX_DIBitmap* m_pBitmap; + int m_Width; + int m_Height; + int m_bpp; + int m_RenderCaps; + int m_DeviceClass; + FX_RECT m_ClipBox; + std::unique_ptr m_pDeviceDriver; +}; + +#endif // CORE_FXGE_CFX_RENDERDEVICE_H_ diff --git a/modules/pdfium/pdfium/core/fxge/cfx_substfont.h b/modules/pdfium/pdfium/core/fxge/cfx_substfont.h new file mode 100644 index 000000000000..01196d442ab4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_substfont.h @@ -0,0 +1,29 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_SUBSTFONT_H_ +#define CORE_FXGE_CFX_SUBSTFONT_H_ + +#include "core/fxcrt/fx_string.h" + +#define FXFONT_SUBST_MM 0x01 +#define FXFONT_SUBST_EXACT 0x40 + +class CFX_SubstFont { + public: + CFX_SubstFont(); + + CFX_ByteString m_Family; + int m_Charset; + uint32_t m_SubstFlags; + int m_Weight; + int m_ItalicAngle; + bool m_bSubstCJK; + int m_WeightCJK; + bool m_bItalicCJK; +}; + +#endif // CORE_FXGE_CFX_SUBSTFONT_H_ diff --git a/modules/pdfium/pdfium/core/fxge/cfx_unicodeencoding.h b/modules/pdfium/pdfium/core/fxge/cfx_unicodeencoding.h new file mode 100644 index 000000000000..7d020894c077 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_unicodeencoding.h @@ -0,0 +1,46 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_UNICODEENCODING_H_ +#define CORE_FXGE_CFX_UNICODEENCODING_H_ + +#include "core/fxge/fx_font.h" + +#define ENCODING_INTERNAL 0 +#define ENCODING_UNICODE 1 + +#ifdef PDF_ENABLE_XFA +#define FXFM_ENC_TAG(a, b, c, d) \ + (((uint32_t)(a) << 24) | ((uint32_t)(b) << 16) | ((uint32_t)(c) << 8) | \ + (uint32_t)(d)) +#define FXFM_ENCODING_NONE FXFM_ENC_TAG(0, 0, 0, 0) +#define FXFM_ENCODING_MS_SYMBOL FXFM_ENC_TAG('s', 'y', 'm', 'b') +#define FXFM_ENCODING_UNICODE FXFM_ENC_TAG('u', 'n', 'i', 'c') +#define FXFM_ENCODING_MS_SJIS FXFM_ENC_TAG('s', 'j', 'i', 's') +#define FXFM_ENCODING_MS_GB2312 FXFM_ENC_TAG('g', 'b', ' ', ' ') +#define FXFM_ENCODING_MS_BIG5 FXFM_ENC_TAG('b', 'i', 'g', '5') +#define FXFM_ENCODING_MS_WANSUNG FXFM_ENC_TAG('w', 'a', 'n', 's') +#define FXFM_ENCODING_MS_JOHAB FXFM_ENC_TAG('j', 'o', 'h', 'a') +#define FXFM_ENCODING_ADOBE_STANDARD FXFM_ENC_TAG('A', 'D', 'O', 'B') +#define FXFM_ENCODING_ADOBE_EXPERT FXFM_ENC_TAG('A', 'D', 'B', 'E') +#define FXFM_ENCODING_ADOBE_CUSTOM FXFM_ENC_TAG('A', 'D', 'B', 'C') +#define FXFM_ENCODING_ADOBE_LATIN_1 FXFM_ENC_TAG('l', 'a', 't', '1') +#define FXFM_ENCODING_OLD_LATIN_2 FXFM_ENC_TAG('l', 'a', 't', '2') +#define FXFM_ENCODING_APPLE_ROMAN FXFM_ENC_TAG('a', 'r', 'm', 'n') +#endif // PDF_ENABLE_XFA + +class CFX_UnicodeEncoding { + public: + explicit CFX_UnicodeEncoding(CFX_Font* pFont); + virtual ~CFX_UnicodeEncoding(); + + virtual uint32_t GlyphFromCharCode(uint32_t charcode); + + protected: + CFX_Font* m_pFont; // Unowned, not nullptr. +}; + +#endif // CORE_FXGE_CFX_UNICODEENCODING_H_ diff --git a/modules/pdfium/pdfium/core/fxge/cfx_unicodeencodingex.h b/modules/pdfium/pdfium/core/fxge/cfx_unicodeencodingex.h new file mode 100644 index 000000000000..df2edbe1bf63 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_unicodeencodingex.h @@ -0,0 +1,37 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_UNICODEENCODINGEX_H_ +#define CORE_FXGE_CFX_UNICODEENCODINGEX_H_ + +#include +#include +#include + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/cfx_unicodeencoding.h" +#include "core/fxge/fx_dib.h" +#include "core/fxge/fx_freetype.h" + +class CFX_UnicodeEncodingEx : public CFX_UnicodeEncoding { + public: + CFX_UnicodeEncodingEx(CFX_Font* pFont, uint32_t EncodingID); + ~CFX_UnicodeEncodingEx() override; + + // CFX_UnicodeEncoding: + uint32_t GlyphFromCharCode(uint32_t charcode) override; + + uint32_t CharCodeFromUnicode(FX_WCHAR Unicode) const; + + private: + uint32_t m_nEncodingID; +}; + +CFX_UnicodeEncodingEx* FX_CreateFontEncodingEx( + CFX_Font* pFont, + uint32_t nEncodingID = FXFM_ENCODING_NONE); + +#endif // CORE_FXGE_CFX_UNICODEENCODINGEX_H_ diff --git a/modules/pdfium/pdfium/core/fxge/cfx_windowsdevice.h b/modules/pdfium/pdfium/core/fxge/cfx_windowsdevice.h new file mode 100644 index 000000000000..6240d842197c --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/cfx_windowsdevice.h @@ -0,0 +1,42 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_CFX_WINDOWSDEVICE_H_ +#define CORE_FXGE_CFX_WINDOWSDEVICE_H_ + +#ifdef _WIN32 +#ifndef _WINDOWS_ +#include +#endif + +#include "core/fxge/cfx_renderdevice.h" + +class IFX_RenderDeviceDriver; + +#if defined(PDFIUM_PRINT_TEXT_WITH_GDI) +typedef void (*PDFiumEnsureTypefaceCharactersAccessible)(const LOGFONT* font, + const wchar_t* text, + size_t text_length); + +extern bool g_pdfium_print_text_with_gdi; +extern PDFiumEnsureTypefaceCharactersAccessible + g_pdfium_typeface_accessible_func; +#endif +extern int g_pdfium_print_postscript_level; + +class CFX_WindowsDevice : public CFX_RenderDevice { + public: + static IFX_RenderDeviceDriver* CreateDriver(HDC hDC); + + explicit CFX_WindowsDevice(HDC hDC); + ~CFX_WindowsDevice() override; + + HDC GetDC() const; +}; + +#endif // _WIN32 + +#endif // CORE_FXGE_CFX_WINDOWSDEVICE_H_ diff --git a/modules/pdfium/pdfium/core/fxge/dib/dib_int.h b/modules/pdfium/pdfium/core/fxge/dib/dib_int.h new file mode 100644 index 000000000000..000003a9c6eb --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/dib/dib_int.h @@ -0,0 +1,116 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_DIB_DIB_INT_H_ +#define CORE_FXGE_DIB_DIB_INT_H_ + +#include + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxge/fx_dib.h" + +class IFX_ScanlineComposer; + +extern const int16_t SDP_Table[513]; + +class CPDF_FixedMatrix { + public: + CPDF_FixedMatrix(const CFX_Matrix& src, int bits) { + base = 1 << bits; + a = FXSYS_round(src.a * base); + b = FXSYS_round(src.b * base); + c = FXSYS_round(src.c * base); + d = FXSYS_round(src.d * base); + e = FXSYS_round(src.e * base); + f = FXSYS_round(src.f * base); + } + inline void Transform(int x, int y, int& x1, int& y1) { + x1 = (a * x + c * y + e + base / 2) / base; + y1 = (b * x + d * y + f + base / 2) / base; + } + int a, b, c, d, e, f; + int base; +}; +#define FPDF_HUGE_IMAGE_SIZE 60000000 +struct PixelWeight { + int m_SrcStart; + int m_SrcEnd; + int m_Weights[1]; +}; + +class CWeightTable { + public: + CWeightTable(); + ~CWeightTable(); + + bool Calc(int dest_len, + int dest_min, + int dest_max, + int src_len, + int src_min, + int src_max, + int flags); + PixelWeight* GetPixelWeight(int pixel) const; + int* GetValueFromPixelWeight(PixelWeight* pWeight, int index) const; + size_t GetPixelWeightSize() const; + + private: + int m_DestMin; + int m_ItemSize; + uint8_t* m_pWeightTables; + size_t m_dwWeightTablesSize; +}; + +class CStretchEngine { + public: + CStretchEngine(IFX_ScanlineComposer* pDestBitmap, + FXDIB_Format dest_format, + int dest_width, + int dest_height, + const FX_RECT& clip_rect, + const CFX_DIBSource* pSrcBitmap, + int flags); + ~CStretchEngine(); + + bool Continue(IFX_Pause* pPause); + + bool StartStretchHorz(); + bool ContinueStretchHorz(IFX_Pause* pPause); + void StretchVert(); + + FXDIB_Format m_DestFormat; + int m_DestBpp; + int m_SrcBpp; + int m_bHasAlpha; + IFX_ScanlineComposer* m_pDestBitmap; + int m_DestWidth, m_DestHeight; + FX_RECT m_DestClip; + uint8_t* m_pDestScanline; + uint8_t* m_pDestMaskScanline; + FX_RECT m_SrcClip; + const CFX_DIBSource* m_pSource; + uint32_t* m_pSrcPalette; + int m_SrcWidth; + int m_SrcHeight; + int m_SrcPitch; + int m_InterPitch; + int m_ExtraMaskPitch; + uint8_t* m_pInterBuf; + uint8_t* m_pExtraAlphaBuf; + int m_TransMethod; + int m_Flags; + CWeightTable m_WeightTable; + int m_CurRow; + int m_State; +}; + +FX_RECT FXDIB_SwapClipBox(FX_RECT& clip, + int width, + int height, + bool bFlipX, + bool bFlipY); + +#endif // CORE_FXGE_DIB_DIB_INT_H_ diff --git a/modules/pdfium/pdfium/core/fxge/dib/fx_dib_composite.cpp b/modules/pdfium/pdfium/core/fxge/dib/fx_dib_composite.cpp new file mode 100644 index 000000000000..072ebbddd592 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/dib/fx_dib_composite.cpp @@ -0,0 +1,5040 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcodec/fx_codec.h" +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/dib/dib_int.h" +#include "core/fxge/ge/cfx_cliprgn.h" + +namespace { + +const uint8_t color_sqrt[256] = { + 0x00, 0x03, 0x07, 0x0B, 0x0F, 0x12, 0x16, 0x19, 0x1D, 0x20, 0x23, 0x26, + 0x29, 0x2C, 0x2F, 0x32, 0x35, 0x37, 0x3A, 0x3C, 0x3F, 0x41, 0x43, 0x46, + 0x48, 0x4A, 0x4C, 0x4E, 0x50, 0x52, 0x54, 0x56, 0x57, 0x59, 0x5B, 0x5C, + 0x5E, 0x60, 0x61, 0x63, 0x64, 0x65, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D, + 0x6E, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, + 0x7B, 0x7C, 0x7D, 0x7E, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x91, + 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, + 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA4, 0xA5, + 0xA6, 0xA7, 0xA7, 0xA8, 0xA9, 0xAA, 0xAA, 0xAB, 0xAC, 0xAD, 0xAD, 0xAE, + 0xAF, 0xB0, 0xB0, 0xB1, 0xB2, 0xB3, 0xB3, 0xB4, 0xB5, 0xB5, 0xB6, 0xB7, + 0xB7, 0xB8, 0xB9, 0xBA, 0xBA, 0xBB, 0xBC, 0xBC, 0xBD, 0xBE, 0xBE, 0xBF, + 0xC0, 0xC0, 0xC1, 0xC2, 0xC2, 0xC3, 0xC4, 0xC4, 0xC5, 0xC6, 0xC6, 0xC7, + 0xC7, 0xC8, 0xC9, 0xC9, 0xCA, 0xCB, 0xCB, 0xCC, 0xCC, 0xCD, 0xCE, 0xCE, + 0xCF, 0xD0, 0xD0, 0xD1, 0xD1, 0xD2, 0xD3, 0xD3, 0xD4, 0xD4, 0xD5, 0xD6, + 0xD6, 0xD7, 0xD7, 0xD8, 0xD9, 0xD9, 0xDA, 0xDA, 0xDB, 0xDC, 0xDC, 0xDD, + 0xDD, 0xDE, 0xDE, 0xDF, 0xE0, 0xE0, 0xE1, 0xE1, 0xE2, 0xE2, 0xE3, 0xE4, + 0xE4, 0xE5, 0xE5, 0xE6, 0xE6, 0xE7, 0xE7, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, + 0xEB, 0xEB, 0xEC, 0xEC, 0xED, 0xED, 0xEE, 0xEE, 0xEF, 0xF0, 0xF0, 0xF1, + 0xF1, 0xF2, 0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF5, 0xF5, 0xF6, 0xF6, 0xF7, + 0xF7, 0xF8, 0xF8, 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, + 0xFD, 0xFE, 0xFE, 0xFF}; + +int Blend(int blend_mode, int back_color, int src_color) { + switch (blend_mode) { + case FXDIB_BLEND_NORMAL: + return src_color; + case FXDIB_BLEND_MULTIPLY: + return src_color * back_color / 255; + case FXDIB_BLEND_SCREEN: + return src_color + back_color - src_color * back_color / 255; + case FXDIB_BLEND_OVERLAY: + return Blend(FXDIB_BLEND_HARDLIGHT, src_color, back_color); + case FXDIB_BLEND_DARKEN: + return src_color < back_color ? src_color : back_color; + case FXDIB_BLEND_LIGHTEN: + return src_color > back_color ? src_color : back_color; + case FXDIB_BLEND_COLORDODGE: { + if (src_color == 255) { + return src_color; + } + int result = back_color * 255 / (255 - src_color); + if (result > 255) { + return 255; + } + return result; + } + case FXDIB_BLEND_COLORBURN: { + if (src_color == 0) { + return src_color; + } + int result = (255 - back_color) * 255 / src_color; + if (result > 255) { + result = 255; + } + return 255 - result; + } + case FXDIB_BLEND_HARDLIGHT: + if (src_color < 128) { + return (src_color * back_color * 2) / 255; + } + return Blend(FXDIB_BLEND_SCREEN, back_color, 2 * src_color - 255); + case FXDIB_BLEND_SOFTLIGHT: { + if (src_color < 128) { + return back_color - + (255 - 2 * src_color) * back_color * (255 - back_color) / 255 / + 255; + } + return back_color + + (2 * src_color - 255) * (color_sqrt[back_color] - back_color) / + 255; + } + case FXDIB_BLEND_DIFFERENCE: + return back_color < src_color ? src_color - back_color + : back_color - src_color; + case FXDIB_BLEND_EXCLUSION: + return back_color + src_color - 2 * back_color * src_color / 255; + } + return src_color; +} + +struct RGB { + int red; + int green; + int blue; +}; + +int Lum(RGB color) { + return (color.red * 30 + color.green * 59 + color.blue * 11) / 100; +} + +RGB ClipColor(RGB color) { + int l = Lum(color); + int n = color.red; + if (color.green < n) { + n = color.green; + } + if (color.blue < n) { + n = color.blue; + } + int x = color.red; + if (color.green > x) { + x = color.green; + } + if (color.blue > x) { + x = color.blue; + } + if (n < 0) { + color.red = l + ((color.red - l) * l / (l - n)); + color.green = l + ((color.green - l) * l / (l - n)); + color.blue = l + ((color.blue - l) * l / (l - n)); + } + if (x > 255) { + color.red = l + ((color.red - l) * (255 - l) / (x - l)); + color.green = l + ((color.green - l) * (255 - l) / (x - l)); + color.blue = l + ((color.blue - l) * (255 - l) / (x - l)); + } + return color; +} + +RGB SetLum(RGB color, int l) { + int d = l - Lum(color); + color.red += d; + color.green += d; + color.blue += d; + return ClipColor(color); +} + +int Sat(RGB color) { + int n = color.red; + if (color.green < n) { + n = color.green; + } + if (color.blue < n) { + n = color.blue; + } + int x = color.red; + if (color.green > x) { + x = color.green; + } + if (color.blue > x) { + x = color.blue; + } + return x - n; +} + +RGB SetSat(RGB color, int s) { + int* max = &color.red; + int* mid = &color.red; + int* min = &color.red; + if (color.green > *max) { + max = &color.green; + } + if (color.blue > *max) { + max = &color.blue; + } + if (color.green < *min) { + min = &color.green; + } + if (color.blue < *min) { + min = &color.blue; + } + if (*max == *min) { + color.red = 0; + color.green = 0; + color.blue = 0; + return color; + } + if (max == &color.red) { + if (min == &color.green) { + mid = &color.blue; + } else { + mid = &color.green; + } + } else if (max == &color.green) { + if (min == &color.red) { + mid = &color.blue; + } else { + mid = &color.red; + } + } else { + if (min == &color.green) { + mid = &color.red; + } else { + mid = &color.green; + } + } + if (*max > *min) { + *mid = (*mid - *min) * s / (*max - *min); + *max = s; + *min = 0; + } + return color; +} + +void RGB_Blend(int blend_mode, + const uint8_t* src_scan, + uint8_t* dest_scan, + int results[3]) { + RGB src; + RGB back; + RGB result = {0, 0, 0}; + src.red = src_scan[2]; + src.green = src_scan[1]; + src.blue = src_scan[0]; + back.red = dest_scan[2]; + back.green = dest_scan[1]; + back.blue = dest_scan[0]; + switch (blend_mode) { + case FXDIB_BLEND_HUE: + result = SetLum(SetSat(src, Sat(back)), Lum(back)); + break; + case FXDIB_BLEND_SATURATION: + result = SetLum(SetSat(back, Sat(src)), Lum(back)); + break; + case FXDIB_BLEND_COLOR: + result = SetLum(src, Lum(back)); + break; + case FXDIB_BLEND_LUMINOSITY: + result = SetLum(back, Lum(src)); + break; + } + results[0] = result.blue; + results[1] = result.green; + results[2] = result.red; +} + +void CompositeRow_Argb2Mask(uint8_t* dest_scan, + const uint8_t* src_scan, + int pixel_count, + const uint8_t* clip_scan) { + src_scan += 3; + for (int col = 0; col < pixel_count; col++) { + int src_alpha = *src_scan; + if (clip_scan) { + src_alpha = clip_scan[col] * src_alpha / 255; + } + uint8_t back_alpha = *dest_scan; + if (!back_alpha) { + *dest_scan = src_alpha; + } else if (src_alpha) { + *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255; + } + dest_scan++; + src_scan += 4; + } +} + +void CompositeRow_Rgba2Mask(uint8_t* dest_scan, + const uint8_t* src_alpha_scan, + int pixel_count, + const uint8_t* clip_scan) { + for (int col = 0; col < pixel_count; col++) { + int src_alpha = *src_alpha_scan++; + if (clip_scan) { + src_alpha = clip_scan[col] * src_alpha / 255; + } + uint8_t back_alpha = *dest_scan; + if (!back_alpha) { + *dest_scan = src_alpha; + } else if (src_alpha) { + *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255; + } + dest_scan++; + } +} + +void CompositeRow_Rgb2Mask(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + const uint8_t* clip_scan) { + if (clip_scan) { + for (int i = 0; i < width; i++) { + *dest_scan = FXDIB_ALPHA_UNION(*dest_scan, *clip_scan); + dest_scan++; + clip_scan++; + } + } else { + FXSYS_memset(dest_scan, 0xff, width); + } +} + +void CompositeRow_Argb2Graya(uint8_t* dest_scan, + const uint8_t* src_scan, + int pixel_count, + int blend_type, + const uint8_t* clip_scan, + const uint8_t* src_alpha_scan, + uint8_t* dst_alpha_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = nullptr; + if (pIccTransform) + pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + + if (blend_type) { + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + if (src_alpha_scan) { + for (int col = 0; col < pixel_count; col++) { + uint8_t back_alpha = *dst_alpha_scan; + if (back_alpha == 0) { + int src_alpha = *src_alpha_scan++; + if (clip_scan) + src_alpha = clip_scan[col] * src_alpha / 255; + + if (src_alpha) { + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, + 1); + } else { + *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + } + *dst_alpha_scan = src_alpha; + } + dest_scan++; + dst_alpha_scan++; + src_scan += 3; + continue; + } + uint8_t src_alpha = *src_alpha_scan++; + if (clip_scan) + src_alpha = clip_scan[col] * src_alpha / 255; + + if (src_alpha == 0) { + dest_scan++; + dst_alpha_scan++; + src_scan += 3; + continue; + } + *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha); + int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan); + uint8_t gray; + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1); + } else { + gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + } + if (bNonseparableBlend) + gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan; + else + gray = Blend(blend_type, *dest_scan, gray); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio); + dest_scan++; + dst_alpha_scan++; + src_scan += 3; + } + } else { + for (int col = 0; col < pixel_count; col++) { + uint8_t back_alpha = *dst_alpha_scan; + if (back_alpha == 0) { + int src_alpha = src_scan[3]; + if (clip_scan) + src_alpha = clip_scan[col] * src_alpha / 255; + + if (src_alpha) { + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, + 1); + } else { + *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + } + *dst_alpha_scan = src_alpha; + } + dest_scan++; + dst_alpha_scan++; + src_scan += 4; + continue; + } + uint8_t src_alpha = src_scan[3]; + if (clip_scan) + src_alpha = clip_scan[col] * src_alpha / 255; + + if (src_alpha == 0) { + dest_scan++; + dst_alpha_scan++; + src_scan += 4; + continue; + } + *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha); + int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan); + uint8_t gray; + if (pIccTransform) + pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1); + else + gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio); + dest_scan++; + dst_alpha_scan++; + src_scan += 4; + } + } + return; + } + if (src_alpha_scan) { + for (int col = 0; col < pixel_count; col++) { + uint8_t back_alpha = *dst_alpha_scan; + if (back_alpha == 0) { + int src_alpha = *src_alpha_scan++; + if (clip_scan) + src_alpha = clip_scan[col] * src_alpha / 255; + + if (src_alpha) { + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, + 1); + } else { + *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + } + *dst_alpha_scan = src_alpha; + } + dest_scan++; + dst_alpha_scan++; + src_scan += 3; + continue; + } + uint8_t src_alpha = *src_alpha_scan++; + if (clip_scan) + src_alpha = clip_scan[col] * src_alpha / 255; + + if (src_alpha == 0) { + dest_scan++; + dst_alpha_scan++; + src_scan += 3; + continue; + } + *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha); + int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan); + uint8_t gray; + if (pIccTransform) + pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1); + else + gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio); + dest_scan++; + dst_alpha_scan++; + src_scan += 3; + } + } else { + for (int col = 0; col < pixel_count; col++) { + uint8_t back_alpha = *dst_alpha_scan; + if (back_alpha == 0) { + int src_alpha = src_scan[3]; + if (clip_scan) + src_alpha = clip_scan[col] * src_alpha / 255; + + if (src_alpha) { + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, + 1); + } else { + *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + } + *dst_alpha_scan = src_alpha; + } + dest_scan++; + dst_alpha_scan++; + src_scan += 4; + continue; + } + uint8_t src_alpha = src_scan[3]; + if (clip_scan) + src_alpha = clip_scan[col] * src_alpha / 255; + + if (src_alpha == 0) { + dest_scan++; + dst_alpha_scan++; + src_scan += 4; + continue; + } + *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha); + int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan); + uint8_t gray; + if (pIccTransform) + pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1); + else + gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio); + dest_scan++; + dst_alpha_scan++; + src_scan += 4; + } + } +} + +void CompositeRow_Argb2Gray(uint8_t* dest_scan, + const uint8_t* src_scan, + int pixel_count, + int blend_type, + const uint8_t* clip_scan, + const uint8_t* src_alpha_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = nullptr; + uint8_t gray; + if (pIccTransform) + pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + + if (blend_type) { + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + if (src_alpha_scan) { + for (int col = 0; col < pixel_count; col++) { + int src_alpha = *src_alpha_scan++; + if (clip_scan) + src_alpha = clip_scan[col] * src_alpha / 255; + + if (src_alpha) { + if (pIccTransform) + pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1); + else + gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + + if (bNonseparableBlend) + gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan; + else + gray = Blend(blend_type, *dest_scan, gray); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha); + } + dest_scan++; + src_scan += 3; + } + } else { + for (int col = 0; col < pixel_count; col++) { + int src_alpha = src_scan[3]; + if (clip_scan) + src_alpha = clip_scan[col] * src_alpha / 255; + + if (src_alpha) { + if (pIccTransform) + pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1); + else + gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + + if (bNonseparableBlend) + gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan; + else + gray = Blend(blend_type, *dest_scan, gray); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha); + } + dest_scan++; + src_scan += 4; + } + } + return; + } + if (src_alpha_scan) { + for (int col = 0; col < pixel_count; col++) { + int src_alpha = *src_alpha_scan++; + if (clip_scan) + src_alpha = clip_scan[col] * src_alpha / 255; + + if (src_alpha) { + if (pIccTransform) + pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1); + else + gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha); + } + dest_scan++; + src_scan += 3; + } + } else { + for (int col = 0; col < pixel_count; col++) { + int src_alpha = src_scan[3]; + if (clip_scan) + src_alpha = clip_scan[col] * src_alpha / 255; + + if (src_alpha) { + if (pIccTransform) + pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1); + else + gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha); + } + dest_scan++; + src_scan += 4; + } + } +} + +void CompositeRow_Rgb2Gray(uint8_t* dest_scan, + const uint8_t* src_scan, + int src_Bpp, + int pixel_count, + int blend_type, + const uint8_t* clip_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = nullptr; + uint8_t gray; + if (pIccTransform) { + pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + } + if (blend_type) { + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + for (int col = 0; col < pixel_count; col++) { + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1); + } else { + gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + } + if (bNonseparableBlend) + gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan; + else + gray = Blend(blend_type, *dest_scan, gray); + if (clip_scan && clip_scan[col] < 255) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]); + } else { + *dest_scan = gray; + } + dest_scan++; + src_scan += src_Bpp; + } + return; + } + for (int col = 0; col < pixel_count; col++) { + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1); + } else { + gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + } + if (clip_scan && clip_scan[col] < 255) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]); + } else { + *dest_scan = gray; + } + dest_scan++; + src_scan += src_Bpp; + } +} + +void CompositeRow_Rgb2Graya(uint8_t* dest_scan, + const uint8_t* src_scan, + int src_Bpp, + int pixel_count, + int blend_type, + const uint8_t* clip_scan, + uint8_t* dest_alpha_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = nullptr; + if (pIccTransform) { + pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + } + if (blend_type) { + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + for (int col = 0; col < pixel_count; col++) { + int back_alpha = *dest_alpha_scan; + if (back_alpha == 0) { + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1); + } else { + *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + } + dest_scan++; + dest_alpha_scan++; + src_scan += src_Bpp; + continue; + } + int src_alpha = 255; + if (clip_scan) { + src_alpha = clip_scan[col]; + } + if (src_alpha == 0) { + dest_scan++; + dest_alpha_scan++; + src_scan += src_Bpp; + continue; + } + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + uint8_t gray; + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1); + } else { + gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + } + if (bNonseparableBlend) + gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan; + else + gray = Blend(blend_type, *dest_scan, gray); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio); + dest_scan++; + src_scan += src_Bpp; + } + return; + } + for (int col = 0; col < pixel_count; col++) { + int src_alpha = 255; + if (clip_scan) { + src_alpha = clip_scan[col]; + } + if (src_alpha == 255) { + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1); + } else { + *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + } + dest_scan++; + *dest_alpha_scan++ = 255; + src_scan += src_Bpp; + continue; + } + if (src_alpha == 0) { + dest_scan++; + dest_alpha_scan++; + src_scan += src_Bpp; + continue; + } + int back_alpha = *dest_alpha_scan; + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + uint8_t gray; + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1); + } else { + gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan); + } + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio); + dest_scan++; + src_scan += src_Bpp; + } +} + +void CompositeRow_Argb2Argb(uint8_t* dest_scan, + const uint8_t* src_scan, + int pixel_count, + int blend_type, + const uint8_t* clip_scan, + uint8_t* dest_alpha_scan, + const uint8_t* src_alpha_scan) { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + if (!dest_alpha_scan) { + if (!src_alpha_scan) { + uint8_t back_alpha = 0; + for (int col = 0; col < pixel_count; col++) { + back_alpha = dest_scan[3]; + if (back_alpha == 0) { + if (clip_scan) { + int src_alpha = clip_scan[col] * src_scan[3] / 255; + FXARGB_SETDIB(dest_scan, (FXARGB_GETDIB(src_scan) & 0xffffff) | + (src_alpha << 24)); + } else { + FXARGB_COPY(dest_scan, src_scan); + } + dest_scan += 4; + src_scan += 4; + continue; + } + uint8_t src_alpha; + if (clip_scan) { + src_alpha = clip_scan[col] * src_scan[3] / 255; + } else { + src_alpha = src_scan[3]; + } + if (src_alpha == 0) { + dest_scan += 4; + src_scan += 4; + continue; + } + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + if (blend_type) { + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, *dest_scan, *src_scan); + blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio); + } + dest_scan++; + src_scan++; + } + dest_scan++; + src_scan++; + } + } else { + for (int col = 0; col < pixel_count; col++) { + uint8_t back_alpha = dest_scan[3]; + if (back_alpha == 0) { + if (clip_scan) { + int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255; + FXARGB_SETDIB(dest_scan, FXARGB_MAKE((src_alpha << 24), src_scan[2], + src_scan[1], *src_scan)); + } else { + FXARGB_SETDIB(dest_scan, + FXARGB_MAKE((*src_alpha_scan << 24), src_scan[2], + src_scan[1], *src_scan)); + } + dest_scan += 4; + src_scan += 3; + src_alpha_scan++; + continue; + } + uint8_t src_alpha; + if (clip_scan) { + src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255; + } else { + src_alpha = *src_alpha_scan++; + } + if (src_alpha == 0) { + dest_scan += 4; + src_scan += 3; + continue; + } + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + if (blend_type) { + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, *dest_scan, *src_scan); + blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio); + } + dest_scan++; + src_scan++; + } + dest_scan++; + } + } + } else { + if (src_alpha_scan) { + for (int col = 0; col < pixel_count; col++) { + uint8_t back_alpha = *dest_alpha_scan; + if (back_alpha == 0) { + if (clip_scan) { + int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255; + *dest_alpha_scan = src_alpha; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + } else { + *dest_alpha_scan = *src_alpha_scan; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + } + dest_alpha_scan++; + src_alpha_scan++; + continue; + } + uint8_t src_alpha; + if (clip_scan) { + src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255; + } else { + src_alpha = *src_alpha_scan++; + } + if (src_alpha == 0) { + dest_scan += 3; + src_scan += 3; + dest_alpha_scan++; + continue; + } + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + if (blend_type) { + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, *dest_scan, *src_scan); + blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio); + } + dest_scan++; + src_scan++; + } + } + } else { + for (int col = 0; col < pixel_count; col++) { + uint8_t back_alpha = *dest_alpha_scan; + if (back_alpha == 0) { + if (clip_scan) { + int src_alpha = clip_scan[col] * src_scan[3] / 255; + *dest_alpha_scan = src_alpha; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + } else { + *dest_alpha_scan = src_scan[3]; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + } + dest_alpha_scan++; + src_scan++; + continue; + } + uint8_t src_alpha; + if (clip_scan) { + src_alpha = clip_scan[col] * src_scan[3] / 255; + } else { + src_alpha = src_scan[3]; + } + if (src_alpha == 0) { + dest_scan += 3; + src_scan += 4; + dest_alpha_scan++; + continue; + } + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + if (blend_type) { + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, *dest_scan, *src_scan); + blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio); + } + dest_scan++; + src_scan++; + } + src_scan++; + } + } + } +} + +void CompositeRow_Rgb2Argb_Blend_NoClip(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int src_Bpp, + uint8_t* dest_alpha_scan) { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + int src_gap = src_Bpp - 3; + if (dest_alpha_scan) { + for (int col = 0; col < width; col++) { + uint8_t back_alpha = *dest_alpha_scan; + if (back_alpha == 0) { + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_alpha_scan++ = 0xff; + src_scan += src_gap; + continue; + } + *dest_alpha_scan++ = 0xff; + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + int src_color = *src_scan; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, *dest_scan, src_color); + *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha); + dest_scan++; + src_scan++; + } + src_scan += src_gap; + } + } else { + for (int col = 0; col < width; col++) { + uint8_t back_alpha = dest_scan[3]; + if (back_alpha == 0) { + if (src_Bpp == 4) { + FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan)); + } else { + FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], + src_scan[0])); + } + dest_scan += 4; + src_scan += src_Bpp; + continue; + } + dest_scan[3] = 0xff; + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + int src_color = *src_scan; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, *dest_scan, src_color); + *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha); + dest_scan++; + src_scan++; + } + dest_scan++; + src_scan += src_gap; + } + } +} + +void CompositeRow_Rgb2Argb_Blend_Clip(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int src_Bpp, + const uint8_t* clip_scan, + uint8_t* dest_alpha_scan) { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + int src_gap = src_Bpp - 3; + if (dest_alpha_scan) { + for (int col = 0; col < width; col++) { + int src_alpha = *clip_scan++; + uint8_t back_alpha = *dest_alpha_scan; + if (back_alpha == 0) { + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + src_scan += src_gap; + dest_alpha_scan++; + continue; + } + if (src_alpha == 0) { + dest_scan += 3; + dest_alpha_scan++; + src_scan += src_Bpp; + continue; + } + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + int src_color = *src_scan; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, *dest_scan, src_color); + blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + dest_scan++; + src_scan++; + } + src_scan += src_gap; + } + } else { + for (int col = 0; col < width; col++) { + int src_alpha = *clip_scan++; + uint8_t back_alpha = dest_scan[3]; + if (back_alpha == 0) { + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + src_scan += src_gap; + dest_scan++; + continue; + } + if (src_alpha == 0) { + dest_scan += 4; + src_scan += src_Bpp; + continue; + } + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + int src_color = *src_scan; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, *dest_scan, src_color); + blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + dest_scan++; + src_scan++; + } + dest_scan++; + src_scan += src_gap; + } + } +} + +void CompositeRow_Rgb2Argb_NoBlend_Clip(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int src_Bpp, + const uint8_t* clip_scan, + uint8_t* dest_alpha_scan) { + int src_gap = src_Bpp - 3; + if (dest_alpha_scan) { + for (int col = 0; col < width; col++) { + int src_alpha = clip_scan[col]; + if (src_alpha == 255) { + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_alpha_scan++ = 255; + src_scan += src_gap; + continue; + } + if (src_alpha == 0) { + dest_scan += 3; + dest_alpha_scan++; + src_scan += src_Bpp; + continue; + } + int back_alpha = *dest_alpha_scan; + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + for (int color = 0; color < 3; color++) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio); + dest_scan++; + src_scan++; + } + src_scan += src_gap; + } + } else { + for (int col = 0; col < width; col++) { + int src_alpha = clip_scan[col]; + if (src_alpha == 255) { + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = 255; + src_scan += src_gap; + continue; + } + if (src_alpha == 0) { + dest_scan += 4; + src_scan += src_Bpp; + continue; + } + int back_alpha = dest_scan[3]; + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + for (int color = 0; color < 3; color++) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio); + dest_scan++; + src_scan++; + } + dest_scan++; + src_scan += src_gap; + } + } +} + +void CompositeRow_Rgb2Argb_NoBlend_NoClip(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int src_Bpp, + uint8_t* dest_alpha_scan) { + if (dest_alpha_scan) { + int src_gap = src_Bpp - 3; + for (int col = 0; col < width; col++) { + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_alpha_scan++ = 0xff; + src_scan += src_gap; + } + } else { + for (int col = 0; col < width; col++) { + if (src_Bpp == 4) { + FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan)); + } else { + FXARGB_SETDIB(dest_scan, + FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0])); + } + dest_scan += 4; + src_scan += src_Bpp; + } + } +} + +void CompositeRow_Argb2Rgb_Blend(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int dest_Bpp, + const uint8_t* clip_scan, + const uint8_t* src_alpha_scan) { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + int dest_gap = dest_Bpp - 3; + if (src_alpha_scan) { + for (int col = 0; col < width; col++) { + uint8_t src_alpha; + if (clip_scan) { + src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255; + } else { + src_alpha = *src_alpha_scan++; + } + if (src_alpha == 0) { + dest_scan += dest_Bpp; + src_scan += 3; + continue; + } + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + int back_color = *dest_scan; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, back_color, *src_scan); + *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha); + dest_scan++; + src_scan++; + } + dest_scan += dest_gap; + } + } else { + for (int col = 0; col < width; col++) { + uint8_t src_alpha; + if (clip_scan) { + src_alpha = src_scan[3] * (*clip_scan++) / 255; + } else { + src_alpha = src_scan[3]; + } + if (src_alpha == 0) { + dest_scan += dest_Bpp; + src_scan += 4; + continue; + } + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + int back_color = *dest_scan; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, back_color, *src_scan); + *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha); + dest_scan++; + src_scan++; + } + dest_scan += dest_gap; + src_scan++; + } + } +} + +void CompositeRow_Argb2Rgb_NoBlend(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int dest_Bpp, + const uint8_t* clip_scan, + const uint8_t* src_alpha_scan) { + int dest_gap = dest_Bpp - 3; + if (src_alpha_scan) { + for (int col = 0; col < width; col++) { + uint8_t src_alpha; + if (clip_scan) { + src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255; + } else { + src_alpha = *src_alpha_scan++; + } + if (src_alpha == 255) { + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + dest_scan += dest_gap; + continue; + } + if (src_alpha == 0) { + dest_scan += dest_Bpp; + src_scan += 3; + continue; + } + for (int color = 0; color < 3; color++) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha); + dest_scan++; + src_scan++; + } + dest_scan += dest_gap; + } + } else { + for (int col = 0; col < width; col++) { + uint8_t src_alpha; + if (clip_scan) { + src_alpha = src_scan[3] * (*clip_scan++) / 255; + } else { + src_alpha = src_scan[3]; + } + if (src_alpha == 255) { + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + dest_scan += dest_gap; + src_scan++; + continue; + } + if (src_alpha == 0) { + dest_scan += dest_Bpp; + src_scan += 4; + continue; + } + for (int color = 0; color < 3; color++) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha); + dest_scan++; + src_scan++; + } + dest_scan += dest_gap; + src_scan++; + } + } +} + +void CompositeRow_Rgb2Rgb_Blend_NoClip(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int dest_Bpp, + int src_Bpp) { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + int dest_gap = dest_Bpp - 3; + int src_gap = src_Bpp - 3; + for (int col = 0; col < width; col++) { + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + int back_color = *dest_scan; + int src_color = *src_scan; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, back_color, src_color); + *dest_scan = blended; + dest_scan++; + src_scan++; + } + dest_scan += dest_gap; + src_scan += src_gap; + } +} + +void CompositeRow_Rgb2Rgb_Blend_Clip(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int dest_Bpp, + int src_Bpp, + const uint8_t* clip_scan) { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + int dest_gap = dest_Bpp - 3; + int src_gap = src_Bpp - 3; + for (int col = 0; col < width; col++) { + uint8_t src_alpha = *clip_scan++; + if (src_alpha == 0) { + dest_scan += dest_Bpp; + src_scan += src_Bpp; + continue; + } + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + int src_color = *src_scan; + int back_color = *dest_scan; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, back_color, src_color); + *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha); + dest_scan++; + src_scan++; + } + dest_scan += dest_gap; + src_scan += src_gap; + } +} + +void CompositeRow_Rgb2Rgb_NoBlend_NoClip(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int dest_Bpp, + int src_Bpp) { + if (dest_Bpp == src_Bpp) { + FXSYS_memcpy(dest_scan, src_scan, width * dest_Bpp); + return; + } + for (int col = 0; col < width; col++) { + dest_scan[0] = src_scan[0]; + dest_scan[1] = src_scan[1]; + dest_scan[2] = src_scan[2]; + dest_scan += dest_Bpp; + src_scan += src_Bpp; + } +} + +void CompositeRow_Rgb2Rgb_NoBlend_Clip(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int dest_Bpp, + int src_Bpp, + const uint8_t* clip_scan) { + for (int col = 0; col < width; col++) { + int src_alpha = clip_scan[col]; + if (src_alpha == 255) { + dest_scan[0] = src_scan[0]; + dest_scan[1] = src_scan[1]; + dest_scan[2] = src_scan[2]; + } else if (src_alpha) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha); + dest_scan++; + src_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha); + dest_scan++; + src_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha); + dest_scan += dest_Bpp - 2; + src_scan += src_Bpp - 2; + continue; + } + dest_scan += dest_Bpp; + src_scan += src_Bpp; + } +} + +void CompositeRow_Argb2Argb_Transform(uint8_t* dest_scan, + const uint8_t* src_scan, + int pixel_count, + int blend_type, + const uint8_t* clip_scan, + uint8_t* dest_alpha_scan, + const uint8_t* src_alpha_scan, + uint8_t* src_cache_scan, + void* pIccTransform) { + uint8_t* dp = src_cache_scan; + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + if (src_alpha_scan) { + if (dest_alpha_scan) { + pIccModule->TranslateScanline(pIccTransform, dp, src_scan, pixel_count); + } else { + for (int col = 0; col < pixel_count; col++) { + pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1); + dp[3] = *src_alpha_scan++; + src_scan += 3; + dp += 4; + } + src_alpha_scan = nullptr; + } + } else { + if (dest_alpha_scan) { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + for (int col = 0; col < pixel_count; col++) { + pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, + 1); + uint8_t back_alpha = *dest_alpha_scan; + if (back_alpha == 0) { + if (clip_scan) { + int src_alpha = clip_scan[col] * src_scan[3] / 255; + *dest_alpha_scan = src_alpha; + *dest_scan++ = *src_cache_scan++; + *dest_scan++ = *src_cache_scan++; + *dest_scan++ = *src_cache_scan++; + } else { + *dest_alpha_scan = src_scan[3]; + *dest_scan++ = *src_cache_scan++; + *dest_scan++ = *src_cache_scan++; + *dest_scan++ = *src_cache_scan++; + } + dest_alpha_scan++; + src_scan += 4; + continue; + } + uint8_t src_alpha; + if (clip_scan) { + src_alpha = clip_scan[col] * src_scan[3] / 255; + } else { + src_alpha = src_scan[3]; + } + src_scan += 4; + if (src_alpha == 0) { + dest_scan += 3; + src_cache_scan += 3; + dest_alpha_scan++; + continue; + } + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + if (blend_type) { + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, *dest_scan, *src_cache_scan); + blended = FXDIB_ALPHA_MERGE(*src_cache_scan, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + } else { + *dest_scan = + FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, alpha_ratio); + } + dest_scan++; + src_cache_scan++; + } + } + return; + } + for (int col = 0; col < pixel_count; col++) { + pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1); + dp[3] = src_scan[3]; + src_scan += 4; + dp += 4; + } + } + CompositeRow_Argb2Argb(dest_scan, src_cache_scan, pixel_count, blend_type, + clip_scan, dest_alpha_scan, src_alpha_scan); +} + +void CompositeRow_Rgb2Argb_Blend_NoClip_Transform(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int src_Bpp, + uint8_t* dest_alpha_scan, + uint8_t* src_cache_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + if (src_Bpp == 3) { + pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, + width); + } else { + uint8_t* dp = src_cache_scan; + for (int col = 0; col < width; col++) { + pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1); + src_scan += 4; + dp += 3; + } + } + CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_cache_scan, width, + blend_type, 3, dest_alpha_scan); +} + +void CompositeRow_Rgb2Argb_Blend_Clip_Transform(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int src_Bpp, + const uint8_t* clip_scan, + uint8_t* dest_alpha_scan, + uint8_t* src_cache_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + if (src_Bpp == 3) { + pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, + width); + } else { + uint8_t* dp = src_cache_scan; + for (int col = 0; col < width; col++) { + pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1); + src_scan += 4; + dp += 3; + } + } + CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, + 3, clip_scan, dest_alpha_scan); +} + +void CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int src_Bpp, + const uint8_t* clip_scan, + uint8_t* dest_alpha_scan, + uint8_t* src_cache_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + if (src_Bpp == 3) { + pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, + width); + } else { + uint8_t* dp = src_cache_scan; + for (int col = 0; col < width; col++) { + pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1); + src_scan += 4; + dp += 3; + } + } + CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_cache_scan, width, 3, + clip_scan, dest_alpha_scan); +} + +void CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int src_Bpp, + uint8_t* dest_alpha_scan, + uint8_t* src_cache_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + if (src_Bpp == 3) { + pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, + width); + } else { + uint8_t* dp = src_cache_scan; + for (int col = 0; col < width; col++) { + pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1); + src_scan += 4; + dp += 3; + } + } + CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_cache_scan, width, 3, + dest_alpha_scan); +} + +void CompositeRow_Argb2Rgb_Blend_Transform(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int dest_Bpp, + const uint8_t* clip_scan, + const uint8_t* src_alpha_scan, + uint8_t* src_cache_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + if (src_alpha_scan) { + pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, + width); + } else { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + int dest_gap = dest_Bpp - 3; + for (int col = 0; col < width; col++) { + pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1); + uint8_t src_alpha; + if (clip_scan) { + src_alpha = src_scan[3] * (*clip_scan++) / 255; + } else { + src_alpha = src_scan[3]; + } + src_scan += 4; + if (src_alpha == 0) { + dest_scan += dest_Bpp; + src_cache_scan += 3; + continue; + } + if (bNonseparableBlend) { + RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors); + } + for (int color = 0; color < 3; color++) { + int back_color = *dest_scan; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, back_color, *src_cache_scan); + *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha); + dest_scan++; + src_cache_scan++; + } + dest_scan += dest_gap; + } + return; + } + CompositeRow_Argb2Rgb_Blend(dest_scan, src_cache_scan, width, blend_type, + dest_Bpp, clip_scan, src_alpha_scan); +} + +void CompositeRow_Argb2Rgb_NoBlend_Transform(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int dest_Bpp, + const uint8_t* clip_scan, + const uint8_t* src_alpha_scan, + uint8_t* src_cache_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + if (src_alpha_scan) { + pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, + width); + } else { + int dest_gap = dest_Bpp - 3; + for (int col = 0; col < width; col++) { + pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1); + uint8_t src_alpha; + if (clip_scan) { + src_alpha = src_scan[3] * (*clip_scan++) / 255; + } else { + src_alpha = src_scan[3]; + } + src_scan += 4; + if (src_alpha == 255) { + *dest_scan++ = *src_cache_scan++; + *dest_scan++ = *src_cache_scan++; + *dest_scan++ = *src_cache_scan++; + dest_scan += dest_gap; + continue; + } + if (src_alpha == 0) { + dest_scan += dest_Bpp; + src_cache_scan += 3; + continue; + } + for (int color = 0; color < 3; color++) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, src_alpha); + dest_scan++; + src_cache_scan++; + } + dest_scan += dest_gap; + } + return; + } + CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_cache_scan, width, dest_Bpp, + clip_scan, src_alpha_scan); +} + +void CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int dest_Bpp, + int src_Bpp, + uint8_t* src_cache_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + if (src_Bpp == 3) { + pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, + width); + } else { + uint8_t* dp = src_cache_scan; + for (int col = 0; col < width; col++) { + pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1); + src_scan += 4; + dp += 3; + } + } + CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_cache_scan, width, + blend_type, dest_Bpp, 3); +} + +void CompositeRow_Rgb2Rgb_Blend_Clip_Transform(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int dest_Bpp, + int src_Bpp, + const uint8_t* clip_scan, + uint8_t* src_cache_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + if (src_Bpp == 3) { + pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, + width); + } else { + uint8_t* dp = src_cache_scan; + for (int col = 0; col < width; col++) { + pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1); + src_scan += 4; + dp += 3; + } + } + CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, + dest_Bpp, 3, clip_scan); +} + +void CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int dest_Bpp, + int src_Bpp, + uint8_t* src_cache_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + if (src_Bpp == 3) { + pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, + width); + } else { + uint8_t* dp = src_cache_scan; + for (int col = 0; col < width; col++) { + pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1); + src_scan += 4; + dp += 3; + } + } + CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_cache_scan, width, + dest_Bpp, 3); +} + +void CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int dest_Bpp, + int src_Bpp, + const uint8_t* clip_scan, + uint8_t* src_cache_scan, + void* pIccTransform) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + if (src_Bpp == 3) { + pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, + width); + } else { + uint8_t* dp = src_cache_scan; + for (int col = 0; col < width; col++) { + pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1); + src_scan += 4; + dp += 3; + } + } + CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_cache_scan, width, dest_Bpp, + 3, clip_scan); +} + +void CompositeRow_8bppPal2Gray(uint8_t* dest_scan, + const uint8_t* src_scan, + const uint8_t* pPalette, + int pixel_count, + int blend_type, + const uint8_t* clip_scan, + const uint8_t* src_alpha_scan) { + if (src_alpha_scan) { + if (blend_type) { + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + for (int col = 0; col < pixel_count; col++) { + uint8_t gray = pPalette[*src_scan]; + int src_alpha = *src_alpha_scan++; + if (clip_scan) { + src_alpha = clip_scan[col] * src_alpha / 255; + } + if (bNonseparableBlend) + gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan; + else + gray = Blend(blend_type, *dest_scan, gray); + if (src_alpha) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha); + } else { + *dest_scan = gray; + } + dest_scan++; + src_scan++; + } + return; + } + for (int col = 0; col < pixel_count; col++) { + uint8_t gray = pPalette[*src_scan]; + int src_alpha = *src_alpha_scan++; + if (clip_scan) { + src_alpha = clip_scan[col] * src_alpha / 255; + } + if (src_alpha) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha); + } else { + *dest_scan = gray; + } + dest_scan++; + src_scan++; + } + } else { + if (blend_type) { + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + for (int col = 0; col < pixel_count; col++) { + uint8_t gray = pPalette[*src_scan]; + if (bNonseparableBlend) + gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan; + else + gray = Blend(blend_type, *dest_scan, gray); + if (clip_scan && clip_scan[col] < 255) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]); + } else { + *dest_scan = gray; + } + dest_scan++; + src_scan++; + } + return; + } + for (int col = 0; col < pixel_count; col++) { + uint8_t gray = pPalette[*src_scan]; + if (clip_scan && clip_scan[col] < 255) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]); + } else { + *dest_scan = gray; + } + dest_scan++; + src_scan++; + } + } +} + +void CompositeRow_8bppPal2Graya(uint8_t* dest_scan, + const uint8_t* src_scan, + const uint8_t* pPalette, + int pixel_count, + int blend_type, + const uint8_t* clip_scan, + uint8_t* dest_alpha_scan, + const uint8_t* src_alpha_scan) { + if (src_alpha_scan) { + if (blend_type) { + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + for (int col = 0; col < pixel_count; col++) { + uint8_t gray = pPalette[*src_scan]; + src_scan++; + uint8_t back_alpha = *dest_alpha_scan; + if (back_alpha == 0) { + int src_alpha = *src_alpha_scan++; + if (clip_scan) { + src_alpha = clip_scan[col] * src_alpha / 255; + } + if (src_alpha) { + *dest_scan = gray; + *dest_alpha_scan = src_alpha; + } + dest_scan++; + dest_alpha_scan++; + continue; + } + uint8_t src_alpha = *src_alpha_scan++; + if (clip_scan) { + src_alpha = clip_scan[col] * src_alpha / 255; + } + if (src_alpha == 0) { + dest_scan++; + dest_alpha_scan++; + continue; + } + *dest_alpha_scan = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan); + if (bNonseparableBlend) + gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan; + else + gray = Blend(blend_type, *dest_scan, gray); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio); + dest_alpha_scan++; + dest_scan++; + } + return; + } + for (int col = 0; col < pixel_count; col++) { + uint8_t gray = pPalette[*src_scan]; + src_scan++; + uint8_t back_alpha = *dest_alpha_scan; + if (back_alpha == 0) { + int src_alpha = *src_alpha_scan++; + if (clip_scan) { + src_alpha = clip_scan[col] * src_alpha / 255; + } + if (src_alpha) { + *dest_scan = gray; + *dest_alpha_scan = src_alpha; + } + dest_scan++; + dest_alpha_scan++; + continue; + } + uint8_t src_alpha = *src_alpha_scan++; + if (clip_scan) { + src_alpha = clip_scan[col] * src_alpha / 255; + } + if (src_alpha == 0) { + dest_scan++; + dest_alpha_scan++; + continue; + } + *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255; + int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan); + dest_alpha_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio); + dest_scan++; + } + } else { + if (blend_type) { + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + for (int col = 0; col < pixel_count; col++) { + uint8_t gray = pPalette[*src_scan]; + src_scan++; + if (!clip_scan || clip_scan[col] == 255) { + *dest_scan++ = gray; + *dest_alpha_scan++ = 255; + continue; + } + int src_alpha = clip_scan[col]; + if (src_alpha == 0) { + dest_scan++; + dest_alpha_scan++; + continue; + } + int back_alpha = *dest_alpha_scan; + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (bNonseparableBlend) + gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan; + else + gray = Blend(blend_type, *dest_scan, gray); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio); + dest_scan++; + } + return; + } + for (int col = 0; col < pixel_count; col++) { + uint8_t gray = pPalette[*src_scan]; + src_scan++; + if (!clip_scan || clip_scan[col] == 255) { + *dest_scan++ = gray; + *dest_alpha_scan++ = 255; + continue; + } + int src_alpha = clip_scan[col]; + if (src_alpha == 0) { + dest_scan++; + dest_alpha_scan++; + continue; + } + int back_alpha = *dest_alpha_scan; + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio); + dest_scan++; + } + } +} + +void CompositeRow_1bppPal2Gray(uint8_t* dest_scan, + const uint8_t* src_scan, + int src_left, + const uint8_t* pPalette, + int pixel_count, + int blend_type, + const uint8_t* clip_scan) { + int reset_gray = pPalette[0]; + int set_gray = pPalette[1]; + if (blend_type) { + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + for (int col = 0; col < pixel_count; col++) { + uint8_t gray = + (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) + ? set_gray + : reset_gray; + if (bNonseparableBlend) + gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan; + else + gray = Blend(blend_type, *dest_scan, gray); + if (clip_scan && clip_scan[col] < 255) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]); + } else { + *dest_scan = gray; + } + dest_scan++; + } + return; + } + for (int col = 0; col < pixel_count; col++) { + uint8_t gray = + (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) + ? set_gray + : reset_gray; + if (clip_scan && clip_scan[col] < 255) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]); + } else { + *dest_scan = gray; + } + dest_scan++; + } +} + +void CompositeRow_1bppPal2Graya(uint8_t* dest_scan, + const uint8_t* src_scan, + int src_left, + const uint8_t* pPalette, + int pixel_count, + int blend_type, + const uint8_t* clip_scan, + uint8_t* dest_alpha_scan) { + int reset_gray = pPalette[0]; + int set_gray = pPalette[1]; + if (blend_type) { + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + for (int col = 0; col < pixel_count; col++) { + uint8_t gray = + (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) + ? set_gray + : reset_gray; + if (!clip_scan || clip_scan[col] == 255) { + *dest_scan++ = gray; + *dest_alpha_scan++ = 255; + continue; + } + int src_alpha = clip_scan[col]; + if (src_alpha == 0) { + dest_scan++; + dest_alpha_scan++; + continue; + } + int back_alpha = *dest_alpha_scan; + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (bNonseparableBlend) + gray = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan; + else + gray = Blend(blend_type, *dest_scan, gray); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio); + dest_scan++; + } + return; + } + for (int col = 0; col < pixel_count; col++) { + uint8_t gray = + (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) + ? set_gray + : reset_gray; + if (!clip_scan || clip_scan[col] == 255) { + *dest_scan++ = gray; + *dest_alpha_scan++ = 255; + continue; + } + int src_alpha = clip_scan[col]; + if (src_alpha == 0) { + dest_scan++; + dest_alpha_scan++; + continue; + } + int back_alpha = *dest_alpha_scan; + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio); + dest_scan++; + } +} + +void CompositeRow_8bppRgb2Rgb_NoBlend(uint8_t* dest_scan, + const uint8_t* src_scan, + uint32_t* pPalette, + int pixel_count, + int DestBpp, + const uint8_t* clip_scan, + const uint8_t* src_alpha_scan) { + if (src_alpha_scan) { + int dest_gap = DestBpp - 3; + FX_ARGB argb = 0; + for (int col = 0; col < pixel_count; col++) { + argb = pPalette[*src_scan]; + int src_r = FXARGB_R(argb); + int src_g = FXARGB_G(argb); + int src_b = FXARGB_B(argb); + src_scan++; + uint8_t src_alpha = 0; + if (clip_scan) { + src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255; + } else { + src_alpha = *src_alpha_scan++; + } + if (src_alpha == 255) { + *dest_scan++ = src_b; + *dest_scan++ = src_g; + *dest_scan++ = src_r; + dest_scan += dest_gap; + continue; + } + if (src_alpha == 0) { + dest_scan += DestBpp; + continue; + } + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha); + dest_scan++; + dest_scan += dest_gap; + } + } else { + FX_ARGB argb = 0; + for (int col = 0; col < pixel_count; col++) { + argb = pPalette[*src_scan]; + int src_r = FXARGB_R(argb); + int src_g = FXARGB_G(argb); + int src_b = FXARGB_B(argb); + if (clip_scan && clip_scan[col] < 255) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]); + dest_scan++; + } else { + *dest_scan++ = src_b; + *dest_scan++ = src_g; + *dest_scan++ = src_r; + } + if (DestBpp == 4) { + dest_scan++; + } + src_scan++; + } + } +} + +void CompositeRow_1bppRgb2Rgb_NoBlend(uint8_t* dest_scan, + const uint8_t* src_scan, + int src_left, + uint32_t* pPalette, + int pixel_count, + int DestBpp, + const uint8_t* clip_scan) { + int reset_r, reset_g, reset_b; + int set_r, set_g, set_b; + reset_r = FXARGB_R(pPalette[0]); + reset_g = FXARGB_G(pPalette[0]); + reset_b = FXARGB_B(pPalette[0]); + set_r = FXARGB_R(pPalette[1]); + set_g = FXARGB_G(pPalette[1]); + set_b = FXARGB_B(pPalette[1]); + for (int col = 0; col < pixel_count; col++) { + int src_r, src_g, src_b; + if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) { + src_r = set_r; + src_g = set_g; + src_b = set_b; + } else { + src_r = reset_r; + src_g = reset_g; + src_b = reset_b; + } + if (clip_scan && clip_scan[col] < 255) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]); + dest_scan++; + } else { + *dest_scan++ = src_b; + *dest_scan++ = src_g; + *dest_scan++ = src_r; + } + if (DestBpp == 4) { + dest_scan++; + } + } +} + +void CompositeRow_8bppRgb2Argb_NoBlend(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + uint32_t* pPalette, + const uint8_t* clip_scan, + const uint8_t* src_alpha_scan) { + if (src_alpha_scan) { + for (int col = 0; col < width; col++) { + FX_ARGB argb = pPalette[*src_scan]; + src_scan++; + int src_r = FXARGB_R(argb); + int src_g = FXARGB_G(argb); + int src_b = FXARGB_B(argb); + uint8_t back_alpha = dest_scan[3]; + if (back_alpha == 0) { + if (clip_scan) { + int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255; + FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b)); + } else { + FXARGB_SETDIB(dest_scan, + FXARGB_MAKE(*src_alpha_scan, src_r, src_g, src_b)); + } + dest_scan += 4; + src_alpha_scan++; + continue; + } + uint8_t src_alpha; + if (clip_scan) { + src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255; + } else { + src_alpha = *src_alpha_scan++; + } + if (src_alpha == 0) { + dest_scan += 4; + continue; + } + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); + dest_scan++; + dest_scan++; + } + } else { + for (int col = 0; col < width; col++) { + FX_ARGB argb = pPalette[*src_scan]; + int src_r = FXARGB_R(argb); + int src_g = FXARGB_G(argb); + int src_b = FXARGB_B(argb); + if (!clip_scan || clip_scan[col] == 255) { + *dest_scan++ = src_b; + *dest_scan++ = src_g; + *dest_scan++ = src_r; + *dest_scan++ = 255; + src_scan++; + continue; + } + int src_alpha = clip_scan[col]; + if (src_alpha == 0) { + dest_scan += 4; + src_scan++; + continue; + } + int back_alpha = dest_scan[3]; + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); + dest_scan++; + dest_scan++; + src_scan++; + } + } +} + +void CompositeRow_1bppRgb2Argb_NoBlend(uint8_t* dest_scan, + const uint8_t* src_scan, + int src_left, + int width, + uint32_t* pPalette, + const uint8_t* clip_scan) { + int reset_r, reset_g, reset_b; + int set_r, set_g, set_b; + reset_r = FXARGB_R(pPalette[0]); + reset_g = FXARGB_G(pPalette[0]); + reset_b = FXARGB_B(pPalette[0]); + set_r = FXARGB_R(pPalette[1]); + set_g = FXARGB_G(pPalette[1]); + set_b = FXARGB_B(pPalette[1]); + for (int col = 0; col < width; col++) { + int src_r, src_g, src_b; + if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) { + src_r = set_r; + src_g = set_g; + src_b = set_b; + } else { + src_r = reset_r; + src_g = reset_g; + src_b = reset_b; + } + if (!clip_scan || clip_scan[col] == 255) { + *dest_scan++ = src_b; + *dest_scan++ = src_g; + *dest_scan++ = src_r; + *dest_scan++ = 255; + continue; + } + int src_alpha = clip_scan[col]; + if (src_alpha == 0) { + dest_scan += 4; + continue; + } + int back_alpha = dest_scan[3]; + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); + dest_scan++; + dest_scan++; + } +} + +void CompositeRow_1bppRgb2Rgba_NoBlend(uint8_t* dest_scan, + const uint8_t* src_scan, + int src_left, + int width, + uint32_t* pPalette, + const uint8_t* clip_scan, + uint8_t* dest_alpha_scan) { + int reset_r, reset_g, reset_b; + int set_r, set_g, set_b; + reset_r = FXARGB_R(pPalette[0]); + reset_g = FXARGB_G(pPalette[0]); + reset_b = FXARGB_B(pPalette[0]); + set_r = FXARGB_R(pPalette[1]); + set_g = FXARGB_G(pPalette[1]); + set_b = FXARGB_B(pPalette[1]); + for (int col = 0; col < width; col++) { + int src_r, src_g, src_b; + if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) { + src_r = set_r; + src_g = set_g; + src_b = set_b; + } else { + src_r = reset_r; + src_g = reset_g; + src_b = reset_b; + } + if (!clip_scan || clip_scan[col] == 255) { + *dest_scan++ = src_b; + *dest_scan++ = src_g; + *dest_scan++ = src_r; + *dest_alpha_scan++ = 255; + continue; + } + int src_alpha = clip_scan[col]; + if (src_alpha == 0) { + dest_scan += 3; + dest_alpha_scan++; + continue; + } + int back_alpha = *dest_alpha_scan; + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); + dest_scan++; + } +} + +void CompositeRow_ByteMask2Argb(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_r, + int src_g, + int src_b, + int pixel_count, + int blend_type, + const uint8_t* clip_scan) { + for (int col = 0; col < pixel_count; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255; + } else { + src_alpha = mask_alpha * src_scan[col] / 255; + } + uint8_t back_alpha = dest_scan[3]; + if (back_alpha == 0) { + FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b)); + dest_scan += 4; + continue; + } + if (src_alpha == 0) { + dest_scan += 4; + continue; + } + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (blend_type >= FXDIB_BLEND_NONSEPARABLE) { + int blended_colors[3]; + uint8_t scan[3] = {static_cast(src_b), + static_cast(src_g), + static_cast(src_r)}; + RGB_Blend(blend_type, scan, dest_scan, blended_colors); + *dest_scan = + FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio); + dest_scan++; + *dest_scan = + FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio); + dest_scan++; + *dest_scan = + FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio); + } else if (blend_type) { + int blended = Blend(blend_type, *dest_scan, src_b); + blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + dest_scan++; + blended = Blend(blend_type, *dest_scan, src_g); + blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + dest_scan++; + blended = Blend(blend_type, *dest_scan, src_r); + blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); + } + dest_scan += 2; + } +} + +void CompositeRow_ByteMask2Rgba(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_r, + int src_g, + int src_b, + int pixel_count, + int blend_type, + const uint8_t* clip_scan, + uint8_t* dest_alpha_scan) { + for (int col = 0; col < pixel_count; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255; + } else { + src_alpha = mask_alpha * src_scan[col] / 255; + } + uint8_t back_alpha = *dest_alpha_scan; + if (back_alpha == 0) { + *dest_scan++ = src_b; + *dest_scan++ = src_g; + *dest_scan++ = src_r; + *dest_alpha_scan++ = src_alpha; + continue; + } + if (src_alpha == 0) { + dest_scan += 3; + dest_alpha_scan++; + continue; + } + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (blend_type >= FXDIB_BLEND_NONSEPARABLE) { + int blended_colors[3]; + uint8_t scan[3] = {static_cast(src_b), + static_cast(src_g), + static_cast(src_r)}; + RGB_Blend(blend_type, scan, dest_scan, blended_colors); + *dest_scan = + FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio); + dest_scan++; + *dest_scan = + FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio); + dest_scan++; + *dest_scan = + FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio); + dest_scan++; + } else if (blend_type) { + int blended = Blend(blend_type, *dest_scan, src_b); + blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + dest_scan++; + blended = Blend(blend_type, *dest_scan, src_g); + blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + dest_scan++; + blended = Blend(blend_type, *dest_scan, src_r); + blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + dest_scan++; + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); + dest_scan++; + } + } +} + +void CompositeRow_ByteMask2Rgb(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_r, + int src_g, + int src_b, + int pixel_count, + int blend_type, + int Bpp, + const uint8_t* clip_scan) { + for (int col = 0; col < pixel_count; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255; + } else { + src_alpha = mask_alpha * src_scan[col] / 255; + } + if (src_alpha == 0) { + dest_scan += Bpp; + continue; + } + if (blend_type >= FXDIB_BLEND_NONSEPARABLE) { + int blended_colors[3]; + uint8_t scan[3] = {static_cast(src_b), + static_cast(src_g), + static_cast(src_r)}; + RGB_Blend(blend_type, scan, dest_scan, blended_colors); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha); + } else if (blend_type) { + int blended = Blend(blend_type, *dest_scan, src_b); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha); + dest_scan++; + blended = Blend(blend_type, *dest_scan, src_g); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha); + dest_scan++; + blended = Blend(blend_type, *dest_scan, src_r); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha); + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha); + } + dest_scan += Bpp - 2; + } +} + +void CompositeRow_ByteMask2Mask(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int pixel_count, + const uint8_t* clip_scan) { + for (int col = 0; col < pixel_count; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255; + } else { + src_alpha = mask_alpha * src_scan[col] / 255; + } + uint8_t back_alpha = *dest_scan; + if (!back_alpha) { + *dest_scan = src_alpha; + } else if (src_alpha) { + *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255; + } + dest_scan++; + } +} + +void CompositeRow_ByteMask2Gray(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_gray, + int pixel_count, + const uint8_t* clip_scan) { + for (int col = 0; col < pixel_count; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255; + } else { + src_alpha = mask_alpha * src_scan[col] / 255; + } + if (src_alpha) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha); + } + dest_scan++; + } +} + +void CompositeRow_ByteMask2Graya(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_gray, + int pixel_count, + const uint8_t* clip_scan, + uint8_t* dest_alpha_scan) { + for (int col = 0; col < pixel_count; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255; + } else { + src_alpha = mask_alpha * src_scan[col] / 255; + } + uint8_t back_alpha = *dest_alpha_scan; + if (back_alpha == 0) { + *dest_scan++ = src_gray; + *dest_alpha_scan++ = src_alpha; + continue; + } + if (src_alpha == 0) { + dest_scan++; + dest_alpha_scan++; + continue; + } + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio); + dest_scan++; + } +} + +void CompositeRow_BitMask2Argb(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_r, + int src_g, + int src_b, + int src_left, + int pixel_count, + int blend_type, + const uint8_t* clip_scan) { + if (blend_type == FXDIB_BLEND_NORMAL && !clip_scan && mask_alpha == 255) { + FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b); + for (int col = 0; col < pixel_count; col++) { + if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) { + FXARGB_SETDIB(dest_scan, argb); + } + dest_scan += 4; + } + return; + } + for (int col = 0; col < pixel_count; col++) { + if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) { + dest_scan += 4; + continue; + } + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] / 255; + } else { + src_alpha = mask_alpha; + } + uint8_t back_alpha = dest_scan[3]; + if (back_alpha == 0) { + FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b)); + dest_scan += 4; + continue; + } + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (blend_type >= FXDIB_BLEND_NONSEPARABLE) { + int blended_colors[3]; + uint8_t scan[3] = {static_cast(src_b), + static_cast(src_g), + static_cast(src_r)}; + RGB_Blend(blend_type, scan, dest_scan, blended_colors); + *dest_scan = + FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio); + dest_scan++; + *dest_scan = + FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio); + dest_scan++; + *dest_scan = + FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio); + } else if (blend_type) { + int blended = Blend(blend_type, *dest_scan, src_b); + blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + dest_scan++; + blended = Blend(blend_type, *dest_scan, src_g); + blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + dest_scan++; + blended = Blend(blend_type, *dest_scan, src_r); + blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio); + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio); + } + dest_scan += 2; + } +} + +void CompositeRow_BitMask2Rgb(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_r, + int src_g, + int src_b, + int src_left, + int pixel_count, + int blend_type, + int Bpp, + const uint8_t* clip_scan) { + if (blend_type == FXDIB_BLEND_NORMAL && !clip_scan && mask_alpha == 255) { + for (int col = 0; col < pixel_count; col++) { + if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) { + dest_scan[2] = src_r; + dest_scan[1] = src_g; + dest_scan[0] = src_b; + } + dest_scan += Bpp; + } + return; + } + for (int col = 0; col < pixel_count; col++) { + if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) { + dest_scan += Bpp; + continue; + } + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] / 255; + } else { + src_alpha = mask_alpha; + } + if (src_alpha == 0) { + dest_scan += Bpp; + continue; + } + if (blend_type >= FXDIB_BLEND_NONSEPARABLE) { + int blended_colors[3]; + uint8_t scan[3] = {static_cast(src_b), + static_cast(src_g), + static_cast(src_r)}; + RGB_Blend(blend_type, scan, dest_scan, blended_colors); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha); + } else if (blend_type) { + int blended = Blend(blend_type, *dest_scan, src_b); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha); + dest_scan++; + blended = Blend(blend_type, *dest_scan, src_g); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha); + dest_scan++; + blended = Blend(blend_type, *dest_scan, src_r); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha); + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha); + } + dest_scan += Bpp - 2; + } +} + +void CompositeRow_BitMask2Mask(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_left, + int pixel_count, + const uint8_t* clip_scan) { + for (int col = 0; col < pixel_count; col++) { + if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) { + dest_scan++; + continue; + } + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] / 255; + } else { + src_alpha = mask_alpha; + } + uint8_t back_alpha = *dest_scan; + if (!back_alpha) { + *dest_scan = src_alpha; + } else if (src_alpha) { + *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255; + } + dest_scan++; + } +} + +void CompositeRow_BitMask2Gray(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_gray, + int src_left, + int pixel_count, + const uint8_t* clip_scan) { + for (int col = 0; col < pixel_count; col++) { + if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) { + dest_scan++; + continue; + } + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] / 255; + } else { + src_alpha = mask_alpha; + } + if (src_alpha) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha); + } + dest_scan++; + } +} + +void CompositeRow_BitMask2Graya(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_gray, + int src_left, + int pixel_count, + const uint8_t* clip_scan, + uint8_t* dest_alpha_scan) { + for (int col = 0; col < pixel_count; col++) { + if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) { + dest_scan++; + dest_alpha_scan++; + continue; + } + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] / 255; + } else { + src_alpha = mask_alpha; + } + uint8_t back_alpha = *dest_alpha_scan; + if (back_alpha == 0) { + *dest_scan++ = src_gray; + *dest_alpha_scan++ = src_alpha; + continue; + } + if (src_alpha == 0) { + dest_scan++; + dest_alpha_scan++; + continue; + } + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio); + dest_scan++; + } +} + +void CompositeRow_Argb2Argb_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int pixel_count, + int blend_type, + const uint8_t* clip_scan) { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + for (int col = 0; col < pixel_count; col++) { + uint8_t back_alpha = dest_scan[3]; + if (back_alpha == 0) { + if (clip_scan) { + int src_alpha = clip_scan[col] * src_scan[3] / 255; + dest_scan[3] = src_alpha; + dest_scan[0] = src_scan[2]; + dest_scan[1] = src_scan[1]; + dest_scan[2] = src_scan[0]; + } else { + FXARGB_RGBORDERCOPY(dest_scan, src_scan); + } + dest_scan += 4; + src_scan += 4; + continue; + } + uint8_t src_alpha; + if (clip_scan) { + src_alpha = clip_scan[col] * src_scan[3] / 255; + } else { + src_alpha = src_scan[3]; + } + if (src_alpha == 0) { + dest_scan += 4; + src_scan += 4; + continue; + } + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (bNonseparableBlend) { + uint8_t dest_scan_o[3]; + dest_scan_o[0] = dest_scan[2]; + dest_scan_o[1] = dest_scan[1]; + dest_scan_o[2] = dest_scan[0]; + RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors); + } + for (int color = 0; color < 3; color++) { + int index = 2 - color; + if (blend_type) { + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, dest_scan[index], *src_scan); + blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha); + dest_scan[index] = + FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio); + } else { + dest_scan[index] = + FXDIB_ALPHA_MERGE(dest_scan[index], *src_scan, alpha_ratio); + } + src_scan++; + } + dest_scan += 4; + src_scan++; + } +} + +void CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int src_Bpp) { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + int src_gap = src_Bpp - 3; + for (int col = 0; col < width; col++) { + uint8_t back_alpha = dest_scan[3]; + if (back_alpha == 0) { + if (src_Bpp == 4) { + FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan)); + } else { + FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], + src_scan[1], src_scan[0])); + } + dest_scan += 4; + src_scan += src_Bpp; + continue; + } + dest_scan[3] = 0xff; + if (bNonseparableBlend) { + uint8_t dest_scan_o[3]; + dest_scan_o[0] = dest_scan[2]; + dest_scan_o[1] = dest_scan[1]; + dest_scan_o[2] = dest_scan[0]; + RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors); + } + for (int color = 0; color < 3; color++) { + int index = 2 - color; + int src_color = *src_scan; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, dest_scan[index], src_color); + dest_scan[index] = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha); + src_scan++; + } + dest_scan += 4; + src_scan += src_gap; + } +} + +void CompositeRow_Argb2Rgb_Blend_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int dest_Bpp, + const uint8_t* clip_scan) { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + for (int col = 0; col < width; col++) { + uint8_t src_alpha; + if (clip_scan) { + src_alpha = src_scan[3] * (*clip_scan++) / 255; + } else { + src_alpha = src_scan[3]; + } + if (src_alpha == 0) { + dest_scan += dest_Bpp; + src_scan += 4; + continue; + } + if (bNonseparableBlend) { + uint8_t dest_scan_o[3]; + dest_scan_o[0] = dest_scan[2]; + dest_scan_o[1] = dest_scan[1]; + dest_scan_o[2] = dest_scan[0]; + RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors); + } + for (int color = 0; color < 3; color++) { + int index = 2 - color; + int back_color = dest_scan[index]; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, back_color, *src_scan); + dest_scan[index] = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha); + src_scan++; + } + dest_scan += dest_Bpp; + src_scan++; + } +} + +void CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int src_Bpp) { + for (int col = 0; col < width; col++) { + if (src_Bpp == 4) { + FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan)); + } else { + FXARGB_SETRGBORDERDIB( + dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0])); + } + dest_scan += 4; + src_scan += src_Bpp; + } +} + +void CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int dest_Bpp, + int src_Bpp) { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + int src_gap = src_Bpp - 3; + for (int col = 0; col < width; col++) { + if (bNonseparableBlend) { + uint8_t dest_scan_o[3]; + dest_scan_o[0] = dest_scan[2]; + dest_scan_o[1] = dest_scan[1]; + dest_scan_o[2] = dest_scan[0]; + RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors); + } + for (int color = 0; color < 3; color++) { + int index = 2 - color; + int back_color = dest_scan[index]; + int src_color = *src_scan; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, back_color, src_color); + dest_scan[index] = blended; + src_scan++; + } + dest_scan += dest_Bpp; + src_scan += src_gap; + } +} + +void CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int dest_Bpp, + const uint8_t* clip_scan) { + for (int col = 0; col < width; col++) { + uint8_t src_alpha; + if (clip_scan) { + src_alpha = src_scan[3] * (*clip_scan++) / 255; + } else { + src_alpha = src_scan[3]; + } + if (src_alpha == 255) { + dest_scan[2] = *src_scan++; + dest_scan[1] = *src_scan++; + dest_scan[0] = *src_scan++; + dest_scan += dest_Bpp; + src_scan++; + continue; + } + if (src_alpha == 0) { + dest_scan += dest_Bpp; + src_scan += 4; + continue; + } + for (int color = 0; color < 3; color++) { + int index = 2 - color; + dest_scan[index] = + FXDIB_ALPHA_MERGE(dest_scan[index], *src_scan, src_alpha); + src_scan++; + } + dest_scan += dest_Bpp; + src_scan++; + } +} + +void CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int dest_Bpp, + int src_Bpp) { + for (int col = 0; col < width; col++) { + dest_scan[2] = src_scan[0]; + dest_scan[1] = src_scan[1]; + dest_scan[0] = src_scan[2]; + dest_scan += dest_Bpp; + src_scan += src_Bpp; + } +} + +void CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int src_Bpp, + const uint8_t* clip_scan) { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + int src_gap = src_Bpp - 3; + for (int col = 0; col < width; col++) { + int src_alpha = *clip_scan++; + uint8_t back_alpha = dest_scan[3]; + if (back_alpha == 0) { + dest_scan[2] = *src_scan++; + dest_scan[1] = *src_scan++; + dest_scan[0] = *src_scan++; + src_scan += src_gap; + dest_scan += 4; + continue; + } + if (src_alpha == 0) { + dest_scan += 4; + src_scan += src_Bpp; + continue; + } + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (bNonseparableBlend) { + uint8_t dest_scan_o[3]; + dest_scan_o[0] = dest_scan[2]; + dest_scan_o[1] = dest_scan[1]; + dest_scan_o[2] = dest_scan[0]; + RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors); + } + for (int color = 0; color < 3; color++) { + int index = 2 - color; + int src_color = *src_scan; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, dest_scan[index], src_color); + blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha); + dest_scan[index] = + FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio); + src_scan++; + } + dest_scan += 4; + src_scan += src_gap; + } +} + +void CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int blend_type, + int dest_Bpp, + int src_Bpp, + const uint8_t* clip_scan) { + int blended_colors[3]; + bool bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE; + int src_gap = src_Bpp - 3; + for (int col = 0; col < width; col++) { + uint8_t src_alpha = *clip_scan++; + if (src_alpha == 0) { + dest_scan += dest_Bpp; + src_scan += src_Bpp; + continue; + } + if (bNonseparableBlend) { + uint8_t dest_scan_o[3]; + dest_scan_o[0] = dest_scan[2]; + dest_scan_o[1] = dest_scan[1]; + dest_scan_o[2] = dest_scan[0]; + RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors); + } + for (int color = 0; color < 3; color++) { + int index = 2 - color; + int src_color = *src_scan; + int back_color = dest_scan[index]; + int blended = bNonseparableBlend + ? blended_colors[color] + : Blend(blend_type, back_color, src_color); + dest_scan[index] = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha); + src_scan++; + } + dest_scan += dest_Bpp; + src_scan += src_gap; + } +} + +void CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int src_Bpp, + const uint8_t* clip_scan) { + int src_gap = src_Bpp - 3; + for (int col = 0; col < width; col++) { + int src_alpha = clip_scan[col]; + if (src_alpha == 255) { + dest_scan[2] = *src_scan++; + dest_scan[1] = *src_scan++; + dest_scan[0] = *src_scan++; + dest_scan[3] = 255; + dest_scan += 4; + src_scan += src_gap; + continue; + } + if (src_alpha == 0) { + dest_scan += 4; + src_scan += src_Bpp; + continue; + } + int back_alpha = dest_scan[3]; + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + for (int color = 0; color < 3; color++) { + int index = 2 - color; + dest_scan[index] = + FXDIB_ALPHA_MERGE(dest_scan[index], *src_scan, alpha_ratio); + src_scan++; + } + dest_scan += 4; + src_scan += src_gap; + } +} + +void CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + int dest_Bpp, + int src_Bpp, + const uint8_t* clip_scan) { + for (int col = 0; col < width; col++) { + int src_alpha = clip_scan[col]; + if (src_alpha == 255) { + dest_scan[2] = src_scan[0]; + dest_scan[1] = src_scan[1]; + dest_scan[0] = src_scan[2]; + } else if (src_alpha) { + dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], *src_scan, src_alpha); + src_scan++; + dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], *src_scan, src_alpha); + src_scan++; + dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], *src_scan, src_alpha); + dest_scan += dest_Bpp; + src_scan += src_Bpp - 2; + continue; + } + dest_scan += dest_Bpp; + src_scan += src_Bpp; + } +} + +void CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + FX_ARGB* pPalette, + int pixel_count, + int DestBpp, + const uint8_t* clip_scan) { + for (int col = 0; col < pixel_count; col++) { + FX_ARGB argb = pPalette ? pPalette[*src_scan] : (*src_scan) * 0x010101; + int src_r = FXARGB_R(argb); + int src_g = FXARGB_G(argb); + int src_b = FXARGB_B(argb); + if (clip_scan && clip_scan[col] < 255) { + dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]); + dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]); + dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]); + } else { + dest_scan[2] = src_b; + dest_scan[1] = src_g; + dest_scan[0] = src_r; + } + dest_scan += DestBpp; + src_scan++; + } +} + +void CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int src_left, + FX_ARGB* pPalette, + int pixel_count, + int DestBpp, + const uint8_t* clip_scan) { + int reset_r, reset_g, reset_b; + int set_r, set_g, set_b; + if (pPalette) { + reset_r = FXARGB_R(pPalette[0]); + reset_g = FXARGB_G(pPalette[0]); + reset_b = FXARGB_B(pPalette[0]); + set_r = FXARGB_R(pPalette[1]); + set_g = FXARGB_G(pPalette[1]); + set_b = FXARGB_B(pPalette[1]); + } else { + reset_r = reset_g = reset_b = 0; + set_r = set_g = set_b = 255; + } + for (int col = 0; col < pixel_count; col++) { + int src_r, src_g, src_b; + if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) { + src_r = set_r; + src_g = set_g; + src_b = set_b; + } else { + src_r = reset_r; + src_g = reset_g; + src_b = reset_b; + } + if (clip_scan && clip_scan[col] < 255) { + dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]); + dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]); + dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]); + } else { + dest_scan[2] = src_b; + dest_scan[1] = src_g; + dest_scan[0] = src_r; + } + dest_scan += DestBpp; + } +} + +void CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + FX_ARGB* pPalette, + const uint8_t* clip_scan) { + for (int col = 0; col < width; col++) { + int src_r, src_g, src_b; + if (pPalette) { + FX_ARGB argb = pPalette[*src_scan]; + src_r = FXARGB_R(argb); + src_g = FXARGB_G(argb); + src_b = FXARGB_B(argb); + } else { + src_r = src_g = src_b = *src_scan; + } + if (!clip_scan || clip_scan[col] == 255) { + dest_scan[2] = src_b; + dest_scan[1] = src_g; + dest_scan[0] = src_r; + dest_scan[3] = 255; + src_scan++; + dest_scan += 4; + continue; + } + int src_alpha = clip_scan[col]; + if (src_alpha == 0) { + dest_scan += 4; + src_scan++; + continue; + } + int back_alpha = dest_scan[3]; + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio); + dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio); + dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio); + dest_scan += 4; + src_scan++; + } +} + +void CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int src_left, + int width, + FX_ARGB* pPalette, + const uint8_t* clip_scan) { + int reset_r, reset_g, reset_b; + int set_r, set_g, set_b; + if (pPalette) { + reset_r = FXARGB_R(pPalette[0]); + reset_g = FXARGB_G(pPalette[0]); + reset_b = FXARGB_B(pPalette[0]); + set_r = FXARGB_R(pPalette[1]); + set_g = FXARGB_G(pPalette[1]); + set_b = FXARGB_B(pPalette[1]); + } else { + reset_r = reset_g = reset_b = 0; + set_r = set_g = set_b = 255; + } + for (int col = 0; col < width; col++) { + int src_r, src_g, src_b; + if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) { + src_r = set_r; + src_g = set_g; + src_b = set_b; + } else { + src_r = reset_r; + src_g = reset_g; + src_b = reset_b; + } + if (!clip_scan || clip_scan[col] == 255) { + dest_scan[2] = src_b; + dest_scan[1] = src_g; + dest_scan[0] = src_r; + dest_scan[3] = 255; + dest_scan += 4; + continue; + } + int src_alpha = clip_scan[col]; + if (src_alpha == 0) { + dest_scan += 4; + continue; + } + int back_alpha = dest_scan[3]; + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio); + dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio); + dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio); + dest_scan += 4; + } +} + +void CompositeRow_ByteMask2Argb_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_r, + int src_g, + int src_b, + int pixel_count, + int blend_type, + const uint8_t* clip_scan) { + for (int col = 0; col < pixel_count; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255; + } else { + src_alpha = mask_alpha * src_scan[col] / 255; + } + uint8_t back_alpha = dest_scan[3]; + if (back_alpha == 0) { + FXARGB_SETRGBORDERDIB(dest_scan, + FXARGB_MAKE(src_alpha, src_r, src_g, src_b)); + dest_scan += 4; + continue; + } + if (src_alpha == 0) { + dest_scan += 4; + continue; + } + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (blend_type >= FXDIB_BLEND_NONSEPARABLE) { + int blended_colors[3]; + uint8_t scan[3] = {static_cast(src_b), + static_cast(src_g), + static_cast(src_r)}; + uint8_t dest_scan_o[3] = {dest_scan[2], dest_scan[1], dest_scan[0]}; + RGB_Blend(blend_type, scan, dest_scan_o, blended_colors); + dest_scan[2] = + FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio); + dest_scan[1] = + FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio); + dest_scan[0] = + FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio); + } else if (blend_type) { + int blended = Blend(blend_type, dest_scan[2], src_b); + blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha); + dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio); + blended = Blend(blend_type, dest_scan[1], src_g); + blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha); + dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio); + blended = Blend(blend_type, dest_scan[0], src_r); + blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha); + dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio); + } else { + dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio); + dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio); + dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio); + } + dest_scan += 4; + } +} + +void CompositeRow_ByteMask2Rgb_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_r, + int src_g, + int src_b, + int pixel_count, + int blend_type, + int Bpp, + const uint8_t* clip_scan) { + for (int col = 0; col < pixel_count; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255; + } else { + src_alpha = mask_alpha * src_scan[col] / 255; + } + if (src_alpha == 0) { + dest_scan += Bpp; + continue; + } + if (blend_type >= FXDIB_BLEND_NONSEPARABLE) { + int blended_colors[3]; + uint8_t scan[3] = {static_cast(src_b), + static_cast(src_g), + static_cast(src_r)}; + uint8_t dest_scan_o[3] = {dest_scan[2], dest_scan[1], dest_scan[0]}; + RGB_Blend(blend_type, scan, dest_scan_o, blended_colors); + dest_scan[2] = + FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha); + dest_scan[1] = + FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha); + dest_scan[0] = + FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha); + } else if (blend_type) { + int blended = Blend(blend_type, dest_scan[2], src_b); + dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, src_alpha); + blended = Blend(blend_type, dest_scan[1], src_g); + dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, src_alpha); + blended = Blend(blend_type, dest_scan[0], src_r); + dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, src_alpha); + } else { + dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, src_alpha); + dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, src_alpha); + dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, src_alpha); + } + dest_scan += Bpp; + } +} + +void CompositeRow_BitMask2Argb_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_r, + int src_g, + int src_b, + int src_left, + int pixel_count, + int blend_type, + const uint8_t* clip_scan) { + if (blend_type == FXDIB_BLEND_NORMAL && !clip_scan && mask_alpha == 255) { + FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b); + for (int col = 0; col < pixel_count; col++) { + if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) { + FXARGB_SETRGBORDERDIB(dest_scan, argb); + } + dest_scan += 4; + } + return; + } + for (int col = 0; col < pixel_count; col++) { + if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) { + dest_scan += 4; + continue; + } + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] / 255; + } else { + src_alpha = mask_alpha; + } + uint8_t back_alpha = dest_scan[3]; + if (back_alpha == 0) { + FXARGB_SETRGBORDERDIB(dest_scan, + FXARGB_MAKE(src_alpha, src_r, src_g, src_b)); + dest_scan += 4; + continue; + } + uint8_t dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (blend_type >= FXDIB_BLEND_NONSEPARABLE) { + int blended_colors[3]; + uint8_t scan[3] = {static_cast(src_b), + static_cast(src_g), + static_cast(src_r)}; + uint8_t dest_scan_o[3] = {dest_scan[2], dest_scan[1], dest_scan[0]}; + RGB_Blend(blend_type, scan, dest_scan_o, blended_colors); + dest_scan[2] = + FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio); + dest_scan[1] = + FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio); + dest_scan[0] = + FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio); + } else if (blend_type) { + int blended = Blend(blend_type, dest_scan[2], src_b); + blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha); + dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio); + blended = Blend(blend_type, dest_scan[1], src_g); + blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha); + dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio); + blended = Blend(blend_type, dest_scan[0], src_r); + blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha); + dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio); + } else { + dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio); + dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio); + dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio); + } + dest_scan += 4; + } +} + +void CompositeRow_BitMask2Rgb_RgbByteOrder(uint8_t* dest_scan, + const uint8_t* src_scan, + int mask_alpha, + int src_r, + int src_g, + int src_b, + int src_left, + int pixel_count, + int blend_type, + int Bpp, + const uint8_t* clip_scan) { + if (blend_type == FXDIB_BLEND_NORMAL && !clip_scan && mask_alpha == 255) { + for (int col = 0; col < pixel_count; col++) { + if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) { + dest_scan[2] = src_b; + dest_scan[1] = src_g; + dest_scan[0] = src_r; + } + dest_scan += Bpp; + } + return; + } + for (int col = 0; col < pixel_count; col++) { + if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) { + dest_scan += Bpp; + continue; + } + int src_alpha; + if (clip_scan) { + src_alpha = mask_alpha * clip_scan[col] / 255; + } else { + src_alpha = mask_alpha; + } + if (src_alpha == 0) { + dest_scan += Bpp; + continue; + } + if (blend_type >= FXDIB_BLEND_NONSEPARABLE) { + int blended_colors[3]; + uint8_t scan[3] = {static_cast(src_b), + static_cast(src_g), + static_cast(src_r)}; + uint8_t dest_scan_o[3] = {dest_scan[2], dest_scan[1], dest_scan[0]}; + RGB_Blend(blend_type, scan, dest_scan_o, blended_colors); + dest_scan[2] = + FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha); + dest_scan[1] = + FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha); + dest_scan[0] = + FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha); + } else if (blend_type) { + int back_color = dest_scan[2]; + int blended = Blend(blend_type, back_color, src_b); + dest_scan[2] = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha); + back_color = dest_scan[1]; + blended = Blend(blend_type, back_color, src_g); + dest_scan[1] = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha); + back_color = dest_scan[0]; + blended = Blend(blend_type, back_color, src_r); + dest_scan[0] = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha); + } else { + dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, src_alpha); + dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, src_alpha); + dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, src_alpha); + } + dest_scan += Bpp; + } +} + +bool ScanlineCompositor_InitSourceMask(FXDIB_Format dest_format, + int alpha_flag, + uint32_t mask_color, + int& mask_alpha, + int& mask_red, + int& mask_green, + int& mask_blue, + int& mask_black, + CCodec_IccModule* pIccModule, + void* pIccTransform) { + if (alpha_flag >> 8) { + mask_alpha = alpha_flag & 0xff; + mask_red = FXSYS_GetCValue(mask_color); + mask_green = FXSYS_GetMValue(mask_color); + mask_blue = FXSYS_GetYValue(mask_color); + mask_black = FXSYS_GetKValue(mask_color); + } else { + mask_alpha = FXARGB_A(mask_color); + mask_red = FXARGB_R(mask_color); + mask_green = FXARGB_G(mask_color); + mask_blue = FXARGB_B(mask_color); + } + if (dest_format == FXDIB_8bppMask) { + return true; + } + if ((dest_format & 0xff) == 8) { + if (pIccTransform) { + mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) + : FXARGB_TODIB(mask_color); + uint8_t* gray_p = (uint8_t*)&mask_color; + pIccModule->TranslateScanline(pIccTransform, gray_p, gray_p, 1); + mask_red = dest_format & 0x0400 ? FX_CCOLOR(gray_p[0]) : gray_p[0]; + } else { + if (alpha_flag >> 8) { + uint8_t r, g, b; + AdobeCMYK_to_sRGB1(mask_red, mask_green, mask_blue, mask_black, r, g, + b); + mask_red = FXRGB2GRAY(r, g, b); + } else { + mask_red = FXRGB2GRAY(mask_red, mask_green, mask_blue); + } + if (dest_format & 0x0400) { + mask_red = FX_CCOLOR(mask_red); + } + } + } else { + uint8_t* mask_color_p = (uint8_t*)&mask_color; + mask_color = + (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color); + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, mask_color_p, mask_color_p, + 1); + mask_red = mask_color_p[2]; + mask_green = mask_color_p[1]; + mask_blue = mask_color_p[0]; + } else if (alpha_flag >> 8) { + AdobeCMYK_to_sRGB1(mask_color_p[0], mask_color_p[1], mask_color_p[2], + mask_color_p[3], mask_color_p[2], mask_color_p[1], + mask_color_p[0]); + mask_red = mask_color_p[2]; + mask_green = mask_color_p[1]; + mask_blue = mask_color_p[0]; + } + } + return true; +} + +void ScanlineCompositor_InitSourcePalette(FXDIB_Format src_format, + FXDIB_Format dest_format, + uint32_t*& pDestPalette, + uint32_t* pSrcPalette, + CCodec_IccModule* pIccModule, + void* pIccTransform) { + bool isSrcCmyk = !!(src_format & 0x0400); + bool isDstCmyk = !!(dest_format & 0x0400); + pDestPalette = nullptr; + if (pIccTransform) { + if (pSrcPalette) { + if ((dest_format & 0xff) == 8) { + int pal_count = 1 << (src_format & 0xff); + uint8_t* gray_pal = FX_Alloc(uint8_t, pal_count); + pDestPalette = (uint32_t*)gray_pal; + for (int i = 0; i < pal_count; i++) { + uint32_t color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) + : FXARGB_TODIB(pSrcPalette[i]); + pIccModule->TranslateScanline(pIccTransform, gray_pal, + (const uint8_t*)&color, 1); + gray_pal++; + } + } else { + int palsize = 1 << (src_format & 0xff); + pDestPalette = FX_Alloc(uint32_t, palsize); + for (int i = 0; i < palsize; i++) { + uint32_t color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) + : FXARGB_TODIB(pSrcPalette[i]); + pIccModule->TranslateScanline(pIccTransform, (uint8_t*)&color, + (const uint8_t*)&color, 1); + pDestPalette[i] = + isDstCmyk ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); + } + } + } else { + int pal_count = 1 << (src_format & 0xff); + uint8_t* gray_pal = FX_Alloc(uint8_t, pal_count); + if (pal_count == 2) { + gray_pal[0] = 0; + gray_pal[1] = 255; + } else { + for (int i = 0; i < pal_count; i++) { + gray_pal[i] = i; + } + } + if ((dest_format & 0xff) == 8) { + pIccModule->TranslateScanline(pIccTransform, gray_pal, gray_pal, + pal_count); + pDestPalette = (uint32_t*)gray_pal; + } else { + pDestPalette = FX_Alloc(uint32_t, pal_count); + for (int i = 0; i < pal_count; i++) { + pIccModule->TranslateScanline( + pIccTransform, (uint8_t*)&pDestPalette[i], &gray_pal[i], 1); + pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(pDestPalette[i]) + : FXARGB_TODIB(pDestPalette[i]); + } + FX_Free(gray_pal); + } + } + } else { + if (pSrcPalette) { + if ((dest_format & 0xff) == 8) { + int pal_count = 1 << (src_format & 0xff); + uint8_t* gray_pal = FX_Alloc(uint8_t, pal_count); + pDestPalette = (uint32_t*)gray_pal; + if (isSrcCmyk) { + for (int i = 0; i < pal_count; i++) { + FX_CMYK cmyk = pSrcPalette[i]; + uint8_t r, g, b; + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), + FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk), r, + g, b); + *gray_pal++ = FXRGB2GRAY(r, g, b); + } + } else { + for (int i = 0; i < pal_count; i++) { + FX_ARGB argb = pSrcPalette[i]; + *gray_pal++ = + FXRGB2GRAY(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb)); + } + } + } else { + int palsize = 1 << (src_format & 0xff); + pDestPalette = FX_Alloc(uint32_t, palsize); + if (isDstCmyk == isSrcCmyk) { + FXSYS_memcpy(pDestPalette, pSrcPalette, palsize * sizeof(uint32_t)); + } else { + for (int i = 0; i < palsize; i++) { + FX_CMYK cmyk = pSrcPalette[i]; + uint8_t r, g, b; + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), + FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk), r, + g, b); + pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b); + } + } + } + } else { + if ((dest_format & 0xff) == 8) { + int pal_count = 1 << (src_format & 0xff); + uint8_t* gray_pal = FX_Alloc(uint8_t, pal_count); + if (pal_count == 2) { + gray_pal[0] = 0; + gray_pal[1] = 255; + } else { + for (int i = 0; i < pal_count; i++) { + gray_pal[i] = i; + } + } + pDestPalette = (uint32_t*)gray_pal; + } else { + int palsize = 1 << (src_format & 0xff); + pDestPalette = FX_Alloc(uint32_t, palsize); + if (palsize == 2) { + pDestPalette[0] = isSrcCmyk ? 255 : 0xff000000; + pDestPalette[1] = isSrcCmyk ? 0 : 0xffffffff; + } else { + for (int i = 0; i < palsize; i++) { + pDestPalette[i] = isSrcCmyk ? FX_CCOLOR(i) : (i * 0x10101); + } + } + if (isSrcCmyk != isDstCmyk) { + for (int i = 0; i < palsize; i++) { + FX_CMYK cmyk = pDestPalette[i]; + uint8_t r, g, b; + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), + FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk), r, + g, b); + pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b); + } + } + } + } + } +} + +} // namespace + +CFX_ScanlineCompositor::CFX_ScanlineCompositor() { + m_pSrcPalette = nullptr; + m_pCacheScanline = nullptr; + m_CacheSize = 0; + m_bRgbByteOrder = false; + m_BlendType = FXDIB_BLEND_NORMAL; + m_pIccTransform = nullptr; +} + +CFX_ScanlineCompositor::~CFX_ScanlineCompositor() { + FX_Free(m_pSrcPalette); + FX_Free(m_pCacheScanline); +} + +bool CFX_ScanlineCompositor::Init(FXDIB_Format dest_format, + FXDIB_Format src_format, + int32_t width, + uint32_t* pSrcPalette, + uint32_t mask_color, + int blend_type, + bool bClip, + bool bRgbByteOrder, + int alpha_flag, + void* pIccTransform) { + m_SrcFormat = src_format; + m_DestFormat = dest_format; + m_BlendType = blend_type; + m_bRgbByteOrder = bRgbByteOrder; + CCodec_IccModule* pIccModule = nullptr; + if (CFX_GEModule::Get()->GetCodecModule()) { + pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + } + if (!pIccModule) { + pIccTransform = nullptr; + } + m_pIccTransform = pIccTransform; + if ((dest_format & 0xff) == 1) { + return false; + } + if (m_SrcFormat == FXDIB_1bppMask || m_SrcFormat == FXDIB_8bppMask) { + return ScanlineCompositor_InitSourceMask( + dest_format, alpha_flag, mask_color, m_MaskAlpha, m_MaskRed, + m_MaskGreen, m_MaskBlue, m_MaskBlack, pIccModule, pIccTransform); + } + if (!pIccTransform && (~src_format & 0x0400) && (dest_format & 0x0400)) { + return false; + } + if ((m_SrcFormat & 0xff) <= 8) { + if (dest_format == FXDIB_8bppMask) { + return true; + } + ScanlineCompositor_InitSourcePalette(src_format, dest_format, m_pSrcPalette, + pSrcPalette, pIccModule, + pIccTransform); + m_Transparency = + (dest_format == FXDIB_Argb ? 1 : 0) + (dest_format & 0x0200 ? 2 : 0) + + (dest_format & 0x0400 ? 4 : 0) + ((src_format & 0xff) == 1 ? 8 : 0); + return true; + } + m_Transparency = (src_format & 0x0200 ? 0 : 1) + + (dest_format & 0x0200 ? 0 : 2) + + (blend_type == FXDIB_BLEND_NORMAL ? 4 : 0) + + (bClip ? 8 : 0) + (src_format & 0x0400 ? 16 : 0) + + (dest_format & 0x0400 ? 32 : 0) + (pIccTransform ? 64 : 0); + return true; +} + +void CFX_ScanlineCompositor::CompositeRgbBitmapLine( + uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + const uint8_t* clip_scan, + const uint8_t* src_extra_alpha, + uint8_t* dst_extra_alpha) { + int src_Bpp = (m_SrcFormat & 0xff) >> 3; + int dest_Bpp = (m_DestFormat & 0xff) >> 3; + if (m_bRgbByteOrder) { + switch (m_Transparency) { + case 0: + case 4: + case 8: + case 12: + CompositeRow_Argb2Argb_RgbByteOrder(dest_scan, src_scan, width, + m_BlendType, clip_scan); + break; + case 1: + CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder( + dest_scan, src_scan, width, m_BlendType, src_Bpp); + break; + case 2: + case 10: + CompositeRow_Argb2Rgb_Blend_RgbByteOrder( + dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan); + break; + case 3: + CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder( + dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp); + break; + case 5: + CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, + width, src_Bpp); + break; + case 6: + case 14: + CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, + dest_Bpp, clip_scan); + break; + case 7: + CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder( + dest_scan, src_scan, width, dest_Bpp, src_Bpp); + break; + case 9: + CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder( + dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan); + break; + case 11: + CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, + m_BlendType, dest_Bpp, + src_Bpp, clip_scan); + break; + case 13: + CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder( + dest_scan, src_scan, width, src_Bpp, clip_scan); + break; + case 15: + CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder( + dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan); + break; + } + return; + } + if (m_DestFormat == FXDIB_8bppMask) { + if (m_SrcFormat & 0x0200) { + if (m_SrcFormat == FXDIB_Argb) { + CompositeRow_Argb2Mask(dest_scan, src_scan, width, clip_scan); + } else { + CompositeRow_Rgba2Mask(dest_scan, src_extra_alpha, width, clip_scan); + } + } else { + CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan); + } + } else if ((m_DestFormat & 0xff) == 8) { + if (m_DestFormat & 0x0400) { + for (int i = 0; i < width; i++) { + *dest_scan = ~*dest_scan; + dest_scan++; + } + } + if (m_SrcFormat & 0x0200) { + if (m_DestFormat & 0x0200) { + CompositeRow_Argb2Graya(dest_scan, src_scan, width, m_BlendType, + clip_scan, src_extra_alpha, dst_extra_alpha, + m_pIccTransform); + } else { + CompositeRow_Argb2Gray(dest_scan, src_scan, width, m_BlendType, + clip_scan, src_extra_alpha, m_pIccTransform); + } + } else { + if (m_DestFormat & 0x0200) { + CompositeRow_Rgb2Graya(dest_scan, src_scan, src_Bpp, width, m_BlendType, + clip_scan, dst_extra_alpha, m_pIccTransform); + } else { + CompositeRow_Rgb2Gray(dest_scan, src_scan, src_Bpp, width, m_BlendType, + clip_scan, m_pIccTransform); + } + } + if (m_DestFormat & 0x0400) { + for (int i = 0; i < width; i++) { + *dest_scan = ~*dest_scan; + dest_scan++; + } + } + } else { + int dest_Size = width * dest_Bpp + 4; + if (dest_Size > m_CacheSize) { + m_pCacheScanline = FX_Realloc(uint8_t, m_pCacheScanline, dest_Size); + if (!m_pCacheScanline) { + return; + } + m_CacheSize = dest_Size; + } + switch (m_Transparency) { + case 0: + case 4: + case 8: + case 4 + 8: { + CompositeRow_Argb2Argb(dest_scan, src_scan, width, m_BlendType, + clip_scan, dst_extra_alpha, src_extra_alpha); + } break; + case 64: + case 4 + 64: + case 8 + 64: + case 4 + 8 + 64: { + CompositeRow_Argb2Argb_Transform( + dest_scan, src_scan, width, m_BlendType, clip_scan, dst_extra_alpha, + src_extra_alpha, m_pCacheScanline, m_pIccTransform); + } break; + case 1: + CompositeRow_Rgb2Argb_Blend_NoClip( + dest_scan, src_scan, width, m_BlendType, src_Bpp, dst_extra_alpha); + break; + case 1 + 64: + CompositeRow_Rgb2Argb_Blend_NoClip_Transform( + dest_scan, src_scan, width, m_BlendType, src_Bpp, dst_extra_alpha, + m_pCacheScanline, m_pIccTransform); + break; + case 1 + 8: + CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_scan, width, + m_BlendType, src_Bpp, clip_scan, + dst_extra_alpha); + break; + case 1 + 8 + 64: + CompositeRow_Rgb2Argb_Blend_Clip_Transform( + dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan, + dst_extra_alpha, m_pCacheScanline, m_pIccTransform); + break; + case 1 + 4: + CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_scan, width, + src_Bpp, dst_extra_alpha); + break; + case 1 + 4 + 64: + CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform( + dest_scan, src_scan, width, src_Bpp, dst_extra_alpha, + m_pCacheScanline, m_pIccTransform); + break; + case 1 + 4 + 8: + CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_scan, width, src_Bpp, + clip_scan, dst_extra_alpha); + break; + case 1 + 4 + 8 + 64: + CompositeRow_Rgb2Argb_NoBlend_Clip_Transform( + dest_scan, src_scan, width, src_Bpp, clip_scan, dst_extra_alpha, + m_pCacheScanline, m_pIccTransform); + break; + case 2: + case 2 + 8: + CompositeRow_Argb2Rgb_Blend(dest_scan, src_scan, width, m_BlendType, + dest_Bpp, clip_scan, src_extra_alpha); + break; + case 2 + 64: + case 2 + 8 + 64: + CompositeRow_Argb2Rgb_Blend_Transform( + dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan, + src_extra_alpha, m_pCacheScanline, m_pIccTransform); + break; + case 2 + 4: + case 2 + 4 + 8: + CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_scan, width, dest_Bpp, + clip_scan, src_extra_alpha); + break; + case 2 + 4 + 64: + case 2 + 4 + 8 + 64: + CompositeRow_Argb2Rgb_NoBlend_Transform( + dest_scan, src_scan, width, dest_Bpp, clip_scan, src_extra_alpha, + m_pCacheScanline, m_pIccTransform); + break; + case 1 + 2: + CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_scan, width, + m_BlendType, dest_Bpp, src_Bpp); + break; + case 1 + 2 + 64: + CompositeRow_Rgb2Rgb_Blend_NoClip_Transform( + dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, + m_pCacheScanline, m_pIccTransform); + break; + case 1 + 2 + 8: + CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, + dest_Bpp, src_Bpp, clip_scan); + break; + case 1 + 2 + 8 + 64: + CompositeRow_Rgb2Rgb_Blend_Clip_Transform( + dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, + clip_scan, m_pCacheScanline, m_pIccTransform); + break; + case 1 + 2 + 4: + CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_scan, width, + dest_Bpp, src_Bpp); + break; + case 1 + 2 + 4 + 64: + CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform( + dest_scan, src_scan, width, dest_Bpp, src_Bpp, m_pCacheScanline, + m_pIccTransform); + break; + case 1 + 2 + 4 + 8: + CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_scan, width, dest_Bpp, + src_Bpp, clip_scan); + break; + case 1 + 2 + 4 + 8 + 64: + CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform( + dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan, + m_pCacheScanline, m_pIccTransform); + break; + } + } +} + +void CFX_ScanlineCompositor::CompositePalBitmapLine( + uint8_t* dest_scan, + const uint8_t* src_scan, + int src_left, + int width, + const uint8_t* clip_scan, + const uint8_t* src_extra_alpha, + uint8_t* dst_extra_alpha) { + if (m_bRgbByteOrder) { + if (m_SrcFormat == FXDIB_1bppRgb) { + if (m_DestFormat == FXDIB_8bppRgb) { + return; + } + if (m_DestFormat == FXDIB_Argb) { + CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder( + dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan); + } else { + CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder( + dest_scan, src_scan, src_left, m_pSrcPalette, width, + (m_DestFormat & 0xff) >> 3, clip_scan); + } + } else { + if (m_DestFormat == FXDIB_8bppRgb) { + return; + } + if (m_DestFormat == FXDIB_Argb) { + CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder( + dest_scan, src_scan, width, m_pSrcPalette, clip_scan); + } else { + CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder( + dest_scan, src_scan, m_pSrcPalette, width, + (m_DestFormat & 0xff) >> 3, clip_scan); + } + } + return; + } + if (m_DestFormat == FXDIB_8bppMask) { + CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan); + return; + } + if ((m_DestFormat & 0xff) == 8) { + if (m_Transparency & 8) { + if (m_DestFormat & 0x0200) { + CompositeRow_1bppPal2Graya(dest_scan, src_scan, src_left, + (const uint8_t*)m_pSrcPalette, width, + m_BlendType, clip_scan, dst_extra_alpha); + } else { + CompositeRow_1bppPal2Gray(dest_scan, src_scan, src_left, + (const uint8_t*)m_pSrcPalette, width, + m_BlendType, clip_scan); + } + } else { + if (m_DestFormat & 0x0200) + CompositeRow_8bppPal2Graya( + dest_scan, src_scan, (const uint8_t*)m_pSrcPalette, width, + m_BlendType, clip_scan, dst_extra_alpha, src_extra_alpha); + else + CompositeRow_8bppPal2Gray(dest_scan, src_scan, + (const uint8_t*)m_pSrcPalette, width, + m_BlendType, clip_scan, src_extra_alpha); + } + } else { + switch (m_Transparency) { + case 1 + 2: + CompositeRow_8bppRgb2Argb_NoBlend(dest_scan, src_scan, width, + m_pSrcPalette, clip_scan, + src_extra_alpha); + break; + case 1 + 2 + 8: + CompositeRow_1bppRgb2Argb_NoBlend(dest_scan, src_scan, src_left, width, + m_pSrcPalette, clip_scan); + break; + case 0: + CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, + width, (m_DestFormat & 0xff) >> 3, + clip_scan, src_extra_alpha); + break; + case 0 + 8: + CompositeRow_1bppRgb2Rgb_NoBlend(dest_scan, src_scan, src_left, + m_pSrcPalette, width, + (m_DestFormat & 0xff) >> 3, clip_scan); + break; + case 0 + 2: + CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, + width, (m_DestFormat & 0xff) >> 3, + clip_scan, src_extra_alpha); + break; + case 0 + 2 + 8: + CompositeRow_1bppRgb2Rgba_NoBlend(dest_scan, src_scan, src_left, width, + m_pSrcPalette, clip_scan, + dst_extra_alpha); + break; + break; + } + } +} + +void CFX_ScanlineCompositor::CompositeByteMaskLine(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + const uint8_t* clip_scan, + uint8_t* dst_extra_alpha) { + if (m_DestFormat == FXDIB_8bppMask) { + CompositeRow_ByteMask2Mask(dest_scan, src_scan, m_MaskAlpha, width, + clip_scan); + } else if ((m_DestFormat & 0xff) == 8) { + if (m_DestFormat & 0x0200) { + CompositeRow_ByteMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, + width, clip_scan, dst_extra_alpha); + } else { + CompositeRow_ByteMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, + width, clip_scan); + } + } else if (m_bRgbByteOrder) { + if (m_DestFormat == FXDIB_Argb) { + CompositeRow_ByteMask2Argb_RgbByteOrder( + dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, + width, m_BlendType, clip_scan); + } else { + CompositeRow_ByteMask2Rgb_RgbByteOrder( + dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, + width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan); + } + return; + } else if (m_DestFormat == FXDIB_Argb) { + CompositeRow_ByteMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, + m_MaskGreen, m_MaskBlue, width, m_BlendType, + clip_scan); + } else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32) { + CompositeRow_ByteMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, + m_MaskGreen, m_MaskBlue, width, m_BlendType, + (m_DestFormat & 0xff) >> 3, clip_scan); + } else if (m_DestFormat == FXDIB_Rgba) { + CompositeRow_ByteMask2Rgba(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, + m_MaskGreen, m_MaskBlue, width, m_BlendType, + clip_scan, dst_extra_alpha); + } +} + +void CFX_ScanlineCompositor::CompositeBitMaskLine(uint8_t* dest_scan, + const uint8_t* src_scan, + int src_left, + int width, + const uint8_t* clip_scan, + uint8_t* dst_extra_alpha) { + if (m_DestFormat == FXDIB_8bppMask) { + CompositeRow_BitMask2Mask(dest_scan, src_scan, m_MaskAlpha, src_left, width, + clip_scan); + } else if ((m_DestFormat & 0xff) == 8) { + if (m_DestFormat & 0x0200) { + CompositeRow_BitMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, + src_left, width, clip_scan, dst_extra_alpha); + } else { + CompositeRow_BitMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, + src_left, width, clip_scan); + } + } else if (m_bRgbByteOrder) { + if (m_DestFormat == FXDIB_Argb) { + CompositeRow_BitMask2Argb_RgbByteOrder( + dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, + src_left, width, m_BlendType, clip_scan); + } else { + CompositeRow_BitMask2Rgb_RgbByteOrder( + dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, + src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan); + } + return; + } else if (m_DestFormat == FXDIB_Argb) { + CompositeRow_BitMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, + m_MaskGreen, m_MaskBlue, src_left, width, + m_BlendType, clip_scan); + } else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32) { + CompositeRow_BitMask2Rgb( + dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, + src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan); + } +} + +bool CFX_DIBitmap::CompositeBitmap(int dest_left, + int dest_top, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top, + int blend_type, + const CFX_ClipRgn* pClipRgn, + bool bRgbByteOrder, + void* pIccTransform) { + if (!m_pBuffer) { + return false; + } + ASSERT(!pSrcBitmap->IsAlphaMask()); + ASSERT(m_bpp >= 8); + if (pSrcBitmap->IsAlphaMask() || m_bpp < 8) { + return false; + } + GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), + pSrcBitmap->GetHeight(), src_left, src_top, pClipRgn); + if (width == 0 || height == 0) { + return true; + } + const CFX_DIBitmap* pClipMask = nullptr; + FX_RECT clip_box; + if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) { + ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF); + pClipMask = pClipRgn->GetMask().GetObject(); + clip_box = pClipRgn->GetBox(); + } + CFX_ScanlineCompositor compositor; + if (!compositor.Init(GetFormat(), pSrcBitmap->GetFormat(), width, + pSrcBitmap->GetPalette(), 0, blend_type, + pClipMask != nullptr, bRgbByteOrder, 0, pIccTransform)) { + return false; + } + int dest_Bpp = m_bpp / 8; + int src_Bpp = pSrcBitmap->GetBPP() / 8; + bool bRgb = src_Bpp > 1 && !pSrcBitmap->IsCmykImage(); + CFX_DIBitmap* pSrcAlphaMask = pSrcBitmap->m_pAlphaMask; + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = + m_pBuffer + (dest_top + row) * m_Pitch + dest_left * dest_Bpp; + const uint8_t* src_scan = + pSrcBitmap->GetScanline(src_top + row) + src_left * src_Bpp; + const uint8_t* src_scan_extra_alpha = + pSrcAlphaMask ? pSrcAlphaMask->GetScanline(src_top + row) + src_left + : nullptr; + uint8_t* dst_scan_extra_alpha = + m_pAlphaMask + ? (uint8_t*)m_pAlphaMask->GetScanline(dest_top + row) + dest_left + : nullptr; + const uint8_t* clip_scan = nullptr; + if (pClipMask) { + clip_scan = pClipMask->m_pBuffer + + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + + (dest_left - clip_box.left); + } + if (bRgb) { + compositor.CompositeRgbBitmapLine(dest_scan, src_scan, width, clip_scan, + src_scan_extra_alpha, + dst_scan_extra_alpha); + } else { + compositor.CompositePalBitmapLine(dest_scan, src_scan, src_left, width, + clip_scan, src_scan_extra_alpha, + dst_scan_extra_alpha); + } + } + return true; +} + +bool CFX_DIBitmap::CompositeMask(int dest_left, + int dest_top, + int width, + int height, + const CFX_DIBSource* pMask, + uint32_t color, + int src_left, + int src_top, + int blend_type, + const CFX_ClipRgn* pClipRgn, + bool bRgbByteOrder, + int alpha_flag, + void* pIccTransform) { + if (!m_pBuffer) { + return false; + } + ASSERT(pMask->IsAlphaMask()); + ASSERT(m_bpp >= 8); + if (!pMask->IsAlphaMask() || m_bpp < 8) { + return false; + } + GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), + pMask->GetHeight(), src_left, src_top, pClipRgn); + if (width == 0 || height == 0) { + return true; + } + int src_alpha = + (uint8_t)(alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color); + if (src_alpha == 0) { + return true; + } + const CFX_DIBitmap* pClipMask = nullptr; + FX_RECT clip_box; + if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) { + ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF); + pClipMask = pClipRgn->GetMask().GetObject(); + clip_box = pClipRgn->GetBox(); + } + int src_bpp = pMask->GetBPP(); + int Bpp = GetBPP() / 8; + CFX_ScanlineCompositor compositor; + if (!compositor.Init(GetFormat(), pMask->GetFormat(), width, nullptr, color, + blend_type, pClipMask != nullptr, bRgbByteOrder, + alpha_flag, pIccTransform)) { + return false; + } + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = + m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp; + const uint8_t* src_scan = pMask->GetScanline(src_top + row); + uint8_t* dst_scan_extra_alpha = + m_pAlphaMask + ? (uint8_t*)m_pAlphaMask->GetScanline(dest_top + row) + dest_left + : nullptr; + const uint8_t* clip_scan = nullptr; + if (pClipMask) { + clip_scan = pClipMask->m_pBuffer + + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + + (dest_left - clip_box.left); + } + if (src_bpp == 1) { + compositor.CompositeBitMaskLine(dest_scan, src_scan, src_left, width, + clip_scan, dst_scan_extra_alpha); + } else { + compositor.CompositeByteMaskLine(dest_scan, src_scan + src_left, width, + clip_scan, dst_scan_extra_alpha); + } + } + return true; +} + +bool CFX_DIBitmap::CompositeRect(int left, + int top, + int width, + int height, + uint32_t color, + int alpha_flag, + void* pIccTransform) { + if (!m_pBuffer) { + return false; + } + int src_alpha = (alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color); + if (src_alpha == 0) { + return true; + } + FX_RECT rect(left, top, left + width, top + height); + rect.Intersect(0, 0, m_Width, m_Height); + if (rect.IsEmpty()) { + return true; + } + width = rect.Width(); + uint32_t dst_color; + if (alpha_flag >> 8) { + dst_color = FXCMYK_TODIB(color); + } else { + dst_color = FXARGB_TODIB(color); + } + uint8_t* color_p = (uint8_t*)&dst_color; + if (m_bpp == 8) { + uint8_t gray = 255; + if (!IsAlphaMask()) { + if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && + CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + pIccModule->TranslateScanline(pIccTransform, &gray, color_p, 1); + } else { + if (alpha_flag >> 8) { + uint8_t r, g, b; + AdobeCMYK_to_sRGB1(color_p[0], color_p[1], color_p[2], color_p[3], r, + g, b); + gray = FXRGB2GRAY(r, g, b); + } else { + gray = (uint8_t)FXRGB2GRAY((int)color_p[2], color_p[1], color_p[0]); + } + } + if (IsCmykImage()) { + gray = ~gray; + } + } + for (int row = rect.top; row < rect.bottom; row++) { + uint8_t* dest_scan = m_pBuffer + row * m_Pitch + rect.left; + if (src_alpha == 255) { + FXSYS_memset(dest_scan, gray, width); + } else { + for (int col = 0; col < width; col++) { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha); + dest_scan++; + } + } + } + return true; + } + if (m_bpp == 1) { + ASSERT(!IsCmykImage() && (uint8_t)(alpha_flag >> 8) == 0); + int left_shift = rect.left % 8; + int right_shift = rect.right % 8; + int new_width = rect.right / 8 - rect.left / 8; + int index = 0; + if (m_pPalette) { + for (int i = 0; i < 2; i++) { + if (m_pPalette.get()[i] == color) { + index = i; + } + } + } else { + index = ((uint8_t)color == 0xff) ? 1 : 0; + } + for (int row = rect.top; row < rect.bottom; row++) { + uint8_t* dest_scan_top = (uint8_t*)GetScanline(row) + rect.left / 8; + uint8_t* dest_scan_top_r = (uint8_t*)GetScanline(row) + rect.right / 8; + uint8_t left_flag = *dest_scan_top & (255 << (8 - left_shift)); + uint8_t right_flag = *dest_scan_top_r & (255 >> right_shift); + if (new_width) { + FXSYS_memset(dest_scan_top + 1, index ? 255 : 0, new_width - 1); + if (!index) { + *dest_scan_top &= left_flag; + *dest_scan_top_r &= right_flag; + } else { + *dest_scan_top |= ~left_flag; + *dest_scan_top_r |= ~right_flag; + } + } else { + if (!index) { + *dest_scan_top &= left_flag | right_flag; + } else { + *dest_scan_top |= ~(left_flag | right_flag); + } + } + } + return true; + } + ASSERT(m_bpp >= 24); + if (m_bpp < 24) { + return false; + } + if (pIccTransform && CFX_GEModule::Get()->GetCodecModule()) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1); + } else { + if (alpha_flag >> 8 && !IsCmykImage()) { + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), + FXSYS_GetYValue(color), FXSYS_GetKValue(color), + color_p[2], color_p[1], color_p[0]); + } else if (!(alpha_flag >> 8) && IsCmykImage()) { + return false; + } + } + if (!IsCmykImage()) { + color_p[3] = (uint8_t)src_alpha; + } + int Bpp = m_bpp / 8; + bool bAlpha = HasAlpha(); + bool bArgb = GetFormat() == FXDIB_Argb; + if (src_alpha == 255) { + for (int row = rect.top; row < rect.bottom; row++) { + uint8_t* dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp; + uint8_t* dest_scan_alpha = + m_pAlphaMask ? (uint8_t*)m_pAlphaMask->GetScanline(row) + rect.left + : nullptr; + if (dest_scan_alpha) { + FXSYS_memset(dest_scan_alpha, 0xff, width); + } + if (Bpp == 4) { + uint32_t* scan = (uint32_t*)dest_scan; + for (int col = 0; col < width; col++) { + *scan++ = dst_color; + } + } else { + for (int col = 0; col < width; col++) { + *dest_scan++ = color_p[0]; + *dest_scan++ = color_p[1]; + *dest_scan++ = color_p[2]; + } + } + } + return true; + } + for (int row = rect.top; row < rect.bottom; row++) { + uint8_t* dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp; + if (bAlpha) { + if (bArgb) { + for (int col = 0; col < width; col++) { + uint8_t back_alpha = dest_scan[3]; + if (back_alpha == 0) { + FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, color_p[2], + color_p[1], color_p[0])); + dest_scan += 4; + continue; + } + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[0], alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[1], alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[2], alpha_ratio); + dest_scan++; + *dest_scan++ = dest_alpha; + } + } else { + uint8_t* dest_scan_alpha = + (uint8_t*)m_pAlphaMask->GetScanline(row) + rect.left; + for (int col = 0; col < width; col++) { + uint8_t back_alpha = *dest_scan_alpha; + if (back_alpha == 0) { + *dest_scan_alpha++ = src_alpha; + FXSYS_memcpy(dest_scan, color_p, Bpp); + dest_scan += Bpp; + continue; + } + uint8_t dest_alpha = + back_alpha + src_alpha - back_alpha * src_alpha / 255; + *dest_scan_alpha++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + for (int comps = 0; comps < Bpp; comps++) { + *dest_scan = + FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], alpha_ratio); + dest_scan++; + } + } + } + } else { + for (int col = 0; col < width; col++) { + for (int comps = 0; comps < Bpp; comps++) { + if (comps == 3) { + *dest_scan++ = 255; + continue; + } + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], src_alpha); + dest_scan++; + } + } + } + } + return true; +} + +CFX_BitmapComposer::CFX_BitmapComposer() { + m_pScanlineV = nullptr; + m_pScanlineAlphaV = nullptr; + m_pClipScanV = nullptr; + m_pAddClipScan = nullptr; + m_bRgbByteOrder = false; + m_BlendType = FXDIB_BLEND_NORMAL; +} + +CFX_BitmapComposer::~CFX_BitmapComposer() { + FX_Free(m_pScanlineV); + FX_Free(m_pScanlineAlphaV); + FX_Free(m_pClipScanV); + FX_Free(m_pAddClipScan); +} + +void CFX_BitmapComposer::Compose(CFX_DIBitmap* pDest, + const CFX_ClipRgn* pClipRgn, + int bitmap_alpha, + uint32_t mask_color, + FX_RECT& dest_rect, + bool bVertical, + bool bFlipX, + bool bFlipY, + bool bRgbByteOrder, + int alpha_flag, + void* pIccTransform, + int blend_type) { + m_pBitmap = pDest; + m_pClipRgn = pClipRgn; + m_DestLeft = dest_rect.left; + m_DestTop = dest_rect.top; + m_DestWidth = dest_rect.Width(); + m_DestHeight = dest_rect.Height(); + m_BitmapAlpha = bitmap_alpha; + m_MaskColor = mask_color; + m_pClipMask = nullptr; + if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) { + m_pClipMask = pClipRgn->GetMask().GetObject(); + } + m_bVertical = bVertical; + m_bFlipX = bFlipX; + m_bFlipY = bFlipY; + m_AlphaFlag = alpha_flag; + m_pIccTransform = pIccTransform; + m_bRgbByteOrder = bRgbByteOrder; + m_BlendType = blend_type; +} +bool CFX_BitmapComposer::SetInfo(int width, + int height, + FXDIB_Format src_format, + uint32_t* pSrcPalette) { + m_SrcFormat = src_format; + if (!m_Compositor.Init(m_pBitmap->GetFormat(), src_format, width, pSrcPalette, + m_MaskColor, FXDIB_BLEND_NORMAL, + m_pClipMask != nullptr || (m_BitmapAlpha < 255), + m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform)) { + return false; + } + if (m_bVertical) { + m_pScanlineV = FX_Alloc(uint8_t, m_pBitmap->GetBPP() / 8 * width + 4); + m_pClipScanV = FX_Alloc(uint8_t, m_pBitmap->GetHeight()); + if (m_pBitmap->m_pAlphaMask) { + m_pScanlineAlphaV = FX_Alloc(uint8_t, width + 4); + } + } + if (m_BitmapAlpha < 255) { + m_pAddClipScan = FX_Alloc( + uint8_t, m_bVertical ? m_pBitmap->GetHeight() : m_pBitmap->GetWidth()); + } + return true; +} + +void CFX_BitmapComposer::DoCompose(uint8_t* dest_scan, + const uint8_t* src_scan, + int dest_width, + const uint8_t* clip_scan, + const uint8_t* src_extra_alpha, + uint8_t* dst_extra_alpha) { + if (m_BitmapAlpha < 255) { + if (clip_scan) { + for (int i = 0; i < dest_width; i++) { + m_pAddClipScan[i] = clip_scan[i] * m_BitmapAlpha / 255; + } + } else { + FXSYS_memset(m_pAddClipScan, m_BitmapAlpha, dest_width); + } + clip_scan = m_pAddClipScan; + } + if (m_SrcFormat == FXDIB_8bppMask) { + m_Compositor.CompositeByteMaskLine(dest_scan, src_scan, dest_width, + clip_scan, dst_extra_alpha); + } else if ((m_SrcFormat & 0xff) == 8) { + m_Compositor.CompositePalBitmapLine(dest_scan, src_scan, 0, dest_width, + clip_scan, src_extra_alpha, + dst_extra_alpha); + } else { + m_Compositor.CompositeRgbBitmapLine(dest_scan, src_scan, dest_width, + clip_scan, src_extra_alpha, + dst_extra_alpha); + } +} + +void CFX_BitmapComposer::ComposeScanline(int line, + const uint8_t* scanline, + const uint8_t* scan_extra_alpha) { + if (m_bVertical) { + ComposeScanlineV(line, scanline, scan_extra_alpha); + return; + } + const uint8_t* clip_scan = nullptr; + if (m_pClipMask) + clip_scan = m_pClipMask->GetBuffer() + + (m_DestTop + line - m_pClipRgn->GetBox().top) * + m_pClipMask->GetPitch() + + (m_DestLeft - m_pClipRgn->GetBox().left); + uint8_t* dest_scan = (uint8_t*)m_pBitmap->GetScanline(line + m_DestTop) + + m_DestLeft * m_pBitmap->GetBPP() / 8; + uint8_t* dest_alpha_scan = + m_pBitmap->m_pAlphaMask + ? (uint8_t*)m_pBitmap->m_pAlphaMask->GetScanline(line + m_DestTop) + + m_DestLeft + : nullptr; + DoCompose(dest_scan, scanline, m_DestWidth, clip_scan, scan_extra_alpha, + dest_alpha_scan); +} + +void CFX_BitmapComposer::ComposeScanlineV(int line, + const uint8_t* scanline, + const uint8_t* scan_extra_alpha) { + int i; + int Bpp = m_pBitmap->GetBPP() / 8; + int dest_pitch = m_pBitmap->GetPitch(); + int dest_alpha_pitch = + m_pBitmap->m_pAlphaMask ? m_pBitmap->m_pAlphaMask->GetPitch() : 0; + int dest_x = m_DestLeft + (m_bFlipX ? (m_DestWidth - line - 1) : line); + uint8_t* dest_buf = + m_pBitmap->GetBuffer() + dest_x * Bpp + m_DestTop * dest_pitch; + uint8_t* dest_alpha_buf = m_pBitmap->m_pAlphaMask + ? m_pBitmap->m_pAlphaMask->GetBuffer() + + dest_x + m_DestTop * dest_alpha_pitch + : nullptr; + if (m_bFlipY) { + dest_buf += dest_pitch * (m_DestHeight - 1); + dest_alpha_buf += dest_alpha_pitch * (m_DestHeight - 1); + } + int y_step = dest_pitch; + int y_alpha_step = dest_alpha_pitch; + if (m_bFlipY) { + y_step = -y_step; + y_alpha_step = -y_alpha_step; + } + uint8_t* src_scan = m_pScanlineV; + uint8_t* dest_scan = dest_buf; + for (i = 0; i < m_DestHeight; i++) { + for (int j = 0; j < Bpp; j++) { + *src_scan++ = dest_scan[j]; + } + dest_scan += y_step; + } + uint8_t* src_alpha_scan = m_pScanlineAlphaV; + uint8_t* dest_alpha_scan = dest_alpha_buf; + if (dest_alpha_scan) { + for (i = 0; i < m_DestHeight; i++) { + *src_alpha_scan++ = *dest_alpha_scan; + dest_alpha_scan += y_alpha_step; + } + } + uint8_t* clip_scan = nullptr; + if (m_pClipMask) { + clip_scan = m_pClipScanV; + int clip_pitch = m_pClipMask->GetPitch(); + const uint8_t* src_clip = + m_pClipMask->GetBuffer() + + (m_DestTop - m_pClipRgn->GetBox().top) * clip_pitch + + (dest_x - m_pClipRgn->GetBox().left); + if (m_bFlipY) { + src_clip += clip_pitch * (m_DestHeight - 1); + clip_pitch = -clip_pitch; + } + for (i = 0; i < m_DestHeight; i++) { + clip_scan[i] = *src_clip; + src_clip += clip_pitch; + } + } + DoCompose(m_pScanlineV, scanline, m_DestHeight, clip_scan, scan_extra_alpha, + m_pScanlineAlphaV); + src_scan = m_pScanlineV; + dest_scan = dest_buf; + for (i = 0; i < m_DestHeight; i++) { + for (int j = 0; j < Bpp; j++) { + dest_scan[j] = *src_scan++; + } + dest_scan += y_step; + } + src_alpha_scan = m_pScanlineAlphaV; + dest_alpha_scan = dest_alpha_buf; + if (dest_alpha_scan) { + for (i = 0; i < m_DestHeight; i++) { + *dest_alpha_scan = *src_alpha_scan++; + dest_alpha_scan += y_alpha_step; + } + } +} diff --git a/modules/pdfium/pdfium/core/fxge/dib/fx_dib_convert.cpp b/modules/pdfium/pdfium/core/fxge/dib/fx_dib_convert.cpp new file mode 100644 index 000000000000..aad3f343e209 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/dib/fx_dib_convert.cpp @@ -0,0 +1,911 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include +#include + +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxge/fx_dib.h" +#include "third_party/base/ptr_util.h" + +class CFX_Palette { + public: + CFX_Palette(); + ~CFX_Palette(); + + bool BuildPalette(const CFX_DIBSource* pBitmap); + uint32_t* GetPalette() const { return m_pPalette; } + uint32_t* GetColorLut() const { return m_cLut; } + uint32_t* GetAmountLut() const { return m_aLut; } + int32_t Getlut() const { return m_lut; } + + protected: + uint32_t* m_pPalette; + uint32_t* m_cLut; + uint32_t* m_aLut; + int m_lut; +}; +int _Partition(uint32_t* alut, uint32_t* clut, int l, int r) { + uint32_t p_a = alut[l]; + uint32_t p_c = clut[l]; + while (l < r) { + while (l < r && alut[r] >= p_a) { + r--; + } + if (l < r) { + alut[l] = alut[r]; + clut[l++] = clut[r]; + } + while (l < r && alut[l] <= p_a) { + l++; + } + if (l < r) { + alut[r] = alut[l]; + clut[r--] = clut[l]; + } + } + alut[l] = p_a; + clut[l] = p_c; + return l; +} + +void _Qsort(uint32_t* alut, uint32_t* clut, int l, int r) { + if (l < r) { + int pI = _Partition(alut, clut, l, r); + _Qsort(alut, clut, l, pI - 1); + _Qsort(alut, clut, pI + 1, r); + } +} + +void _ColorDecode(uint32_t pal_v, uint8_t& r, uint8_t& g, uint8_t& b) { + r = (uint8_t)((pal_v & 0xf00) >> 4); + g = (uint8_t)(pal_v & 0x0f0); + b = (uint8_t)((pal_v & 0x00f) << 4); +} + +void _Obtain_Pal(uint32_t* aLut, + uint32_t* cLut, + uint32_t* dest_pal, + uint32_t lut) { + uint32_t lut_1 = lut - 1; + for (int row = 0; row < 256; row++) { + int lut_offset = lut_1 - row; + if (lut_offset < 0) { + lut_offset += 256; + } + uint32_t color = cLut[lut_offset]; + uint8_t r; + uint8_t g; + uint8_t b; + _ColorDecode(color, r, g, b); + dest_pal[row] = ((uint32_t)r << 16) | ((uint32_t)g << 8) | b | 0xff000000; + aLut[lut_offset] = row; + } +} + +CFX_Palette::CFX_Palette() { + m_pPalette = nullptr; + m_cLut = nullptr; + m_aLut = nullptr; + m_lut = 0; +} + +CFX_Palette::~CFX_Palette() { + FX_Free(m_pPalette); + FX_Free(m_cLut); + FX_Free(m_aLut); + m_lut = 0; +} + +bool CFX_Palette::BuildPalette(const CFX_DIBSource* pBitmap) { + if (!pBitmap) { + return false; + } + FX_Free(m_pPalette); + m_pPalette = FX_Alloc(uint32_t, 256); + int bpp = pBitmap->GetBPP() / 8; + int width = pBitmap->GetWidth(); + int height = pBitmap->GetHeight(); + FX_Free(m_cLut); + m_cLut = nullptr; + FX_Free(m_aLut); + m_aLut = nullptr; + m_cLut = FX_Alloc(uint32_t, 4096); + m_aLut = FX_Alloc(uint32_t, 4096); + int row, col; + m_lut = 0; + for (row = 0; row < height; row++) { + uint8_t* scan_line = (uint8_t*)pBitmap->GetScanline(row); + for (col = 0; col < width; col++) { + uint8_t* src_port = scan_line + col * bpp; + uint32_t b = src_port[0] & 0xf0; + uint32_t g = src_port[1] & 0xf0; + uint32_t r = src_port[2] & 0xf0; + uint32_t index = (r << 4) + g + (b >> 4); + m_aLut[index]++; + } + } + for (row = 0; row < 4096; row++) { + if (m_aLut[row] != 0) { + m_aLut[m_lut] = m_aLut[row]; + m_cLut[m_lut] = row; + m_lut++; + } + } + _Qsort(m_aLut, m_cLut, 0, m_lut - 1); + _Obtain_Pal(m_aLut, m_cLut, m_pPalette, m_lut); + return true; +} + +bool ConvertBuffer_1bppMask2Gray(uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + uint8_t set_gray, reset_gray; + set_gray = 0xff; + reset_gray = 0x00; + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + FXSYS_memset(dest_scan, reset_gray, width); + const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row); + for (int col = src_left; col < src_left + width; col++) { + if (src_scan[col / 8] & (1 << (7 - col % 8))) { + *dest_scan = set_gray; + } + dest_scan++; + } + } + return true; +} + +bool ConvertBuffer_8bppMask2Gray(uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left; + FXSYS_memcpy(dest_scan, src_scan, width); + } + return true; +} + +bool ConvertBuffer_1bppPlt2Gray(uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + uint32_t* src_plt = pSrcBitmap->GetPalette(); + uint8_t gray[2]; + uint8_t reset_r; + uint8_t reset_g; + uint8_t reset_b; + uint8_t set_r; + uint8_t set_g; + uint8_t set_b; + if (pSrcBitmap->IsCmykImage()) { + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), + FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]), + reset_r, reset_g, reset_b); + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), + FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]), + set_r, set_g, set_b); + } else { + reset_r = FXARGB_R(src_plt[0]); + reset_g = FXARGB_G(src_plt[0]); + reset_b = FXARGB_B(src_plt[0]); + set_r = FXARGB_R(src_plt[1]); + set_g = FXARGB_G(src_plt[1]); + set_b = FXARGB_B(src_plt[1]); + } + gray[0] = FXRGB2GRAY(reset_r, reset_g, reset_b); + gray[1] = FXRGB2GRAY(set_r, set_g, set_b); + + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + FXSYS_memset(dest_scan, gray[0], width); + const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row); + for (int col = src_left; col < src_left + width; col++) { + if (src_scan[col / 8] & (1 << (7 - col % 8))) { + *dest_scan = gray[1]; + } + dest_scan++; + } + } + return true; +} + +bool ConvertBuffer_8bppPlt2Gray(uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + uint32_t* src_plt = pSrcBitmap->GetPalette(); + uint8_t gray[256]; + if (pSrcBitmap->IsCmykImage()) { + uint8_t r; + uint8_t g; + uint8_t b; + for (size_t i = 0; i < FX_ArraySize(gray); i++) { + AdobeCMYK_to_sRGB1( + FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), + FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]), r, g, b); + gray[i] = FXRGB2GRAY(r, g, b); + } + } else { + for (size_t i = 0; i < FX_ArraySize(gray); i++) { + gray[i] = FXRGB2GRAY(FXARGB_R(src_plt[i]), FXARGB_G(src_plt[i]), + FXARGB_B(src_plt[i])); + } + } + + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left; + for (int col = 0; col < width; col++) { + *dest_scan++ = gray[*src_scan++]; + } + } + return true; +} + +bool ConvertBuffer_RgbOrCmyk2Gray(uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + int Bpp = pSrcBitmap->GetBPP() / 8; + if (pSrcBitmap->IsCmykImage()) { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + const uint8_t* src_scan = + pSrcBitmap->GetScanline(src_top + row) + src_left * 4; + for (int col = 0; col < width; col++) { + uint8_t r, g, b; + AdobeCMYK_to_sRGB1(FXSYS_GetCValue((uint32_t)src_scan[0]), + FXSYS_GetMValue((uint32_t)src_scan[1]), + FXSYS_GetYValue((uint32_t)src_scan[2]), + FXSYS_GetKValue((uint32_t)src_scan[3]), r, g, b); + *dest_scan++ = FXRGB2GRAY(r, g, b); + src_scan += 4; + } + } + } else { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + const uint8_t* src_scan = + pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp; + for (int col = 0; col < width; col++) { + *dest_scan++ = FXRGB2GRAY(src_scan[2], src_scan[1], src_scan[0]); + src_scan += Bpp; + } + } + } + return true; +} + +void ConvertBuffer_IndexCopy(uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + if (pSrcBitmap->GetBPP() == 1) { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + FXSYS_memset(dest_scan, 0, width); + const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row); + for (int col = src_left; col < src_left + width; col++) { + if (src_scan[col / 8] & (1 << (7 - col % 8))) { + *dest_scan = 1; + } + dest_scan++; + } + } + } else { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + const uint8_t* src_scan = + pSrcBitmap->GetScanline(src_top + row) + src_left; + FXSYS_memcpy(dest_scan, src_scan, width); + } + } +} + +bool ConvertBuffer_Plt2PltRgb8(uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top, + uint32_t* dst_plt) { + ConvertBuffer_IndexCopy(dest_buf, dest_pitch, width, height, pSrcBitmap, + src_left, src_top); + uint32_t* src_plt = pSrcBitmap->GetPalette(); + int plt_size = pSrcBitmap->GetPaletteSize(); + if (pSrcBitmap->IsCmykImage()) { + for (int i = 0; i < plt_size; i++) { + uint8_t r; + uint8_t g; + uint8_t b; + AdobeCMYK_to_sRGB1( + FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), + FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]), r, g, b); + dst_plt[i] = FXARGB_MAKE(0xff, r, g, b); + } + } else { + FXSYS_memcpy(dst_plt, src_plt, plt_size * 4); + } + return true; +} + +bool ConvertBuffer_Rgb2PltRgb8(uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top, + uint32_t* dst_plt) { + int bpp = pSrcBitmap->GetBPP() / 8; + CFX_Palette palette; + palette.BuildPalette(pSrcBitmap); + uint32_t* cLut = palette.GetColorLut(); + uint32_t* aLut = palette.GetAmountLut(); + if (!cLut || !aLut) { + return false; + } + int lut = palette.Getlut(); + uint32_t* pPalette = palette.GetPalette(); + if (lut > 256) { + int err, min_err; + int lut_256 = lut - 256; + for (int row = 0; row < lut_256; row++) { + min_err = 1000000; + uint8_t r, g, b; + _ColorDecode(cLut[row], r, g, b); + int clrindex = 0; + for (int col = 0; col < 256; col++) { + uint32_t p_color = *(pPalette + col); + int d_r = r - (uint8_t)(p_color >> 16); + int d_g = g - (uint8_t)(p_color >> 8); + int d_b = b - (uint8_t)(p_color); + err = d_r * d_r + d_g * d_g + d_b * d_b; + if (err < min_err) { + min_err = err; + clrindex = col; + } + } + aLut[row] = clrindex; + } + } + int32_t lut_1 = lut - 1; + for (int row = 0; row < height; row++) { + uint8_t* src_scan = + (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left; + uint8_t* dest_scan = dest_buf + row * dest_pitch; + for (int col = 0; col < width; col++) { + uint8_t* src_port = src_scan + col * bpp; + int r = src_port[2] & 0xf0; + int g = src_port[1] & 0xf0; + int b = src_port[0] & 0xf0; + uint32_t clrindex = (r << 4) + g + (b >> 4); + for (int i = lut_1; i >= 0; i--) + if (clrindex == cLut[i]) { + *(dest_scan + col) = (uint8_t)(aLut[i]); + break; + } + } + } + FXSYS_memcpy(dst_plt, pPalette, sizeof(uint32_t) * 256); + return true; +} + +bool ConvertBuffer_1bppMask2Rgb(FXDIB_Format dst_format, + uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + int comps = (dst_format & 0xff) / 8; + uint8_t set_gray, reset_gray; + set_gray = 0xff; + reset_gray = 0x00; + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row); + for (int col = src_left; col < src_left + width; col++) { + if (src_scan[col / 8] & (1 << (7 - col % 8))) { + dest_scan[0] = set_gray; + dest_scan[1] = set_gray; + dest_scan[2] = set_gray; + } else { + dest_scan[0] = reset_gray; + dest_scan[1] = reset_gray; + dest_scan[2] = reset_gray; + } + dest_scan += comps; + } + } + return true; +} + +bool ConvertBuffer_8bppMask2Rgb(FXDIB_Format dst_format, + uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + int comps = (dst_format & 0xff) / 8; + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left; + uint8_t src_pixel; + for (int col = 0; col < width; col++) { + src_pixel = *src_scan++; + *dest_scan++ = src_pixel; + *dest_scan++ = src_pixel; + *dest_scan = src_pixel; + dest_scan += comps - 2; + } + } + return true; +} + +bool ConvertBuffer_1bppPlt2Rgb(FXDIB_Format dst_format, + uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + int comps = (dst_format & 0xff) / 8; + uint32_t* src_plt = pSrcBitmap->GetPalette(); + uint32_t plt[2]; + uint8_t* bgr_ptr = (uint8_t*)plt; + if (pSrcBitmap->IsCmykImage()) { + plt[0] = FXCMYK_TODIB(src_plt[0]); + plt[1] = FXCMYK_TODIB(src_plt[1]); + } else { + bgr_ptr[0] = FXARGB_B(src_plt[0]); + bgr_ptr[1] = FXARGB_G(src_plt[0]); + bgr_ptr[2] = FXARGB_R(src_plt[0]); + bgr_ptr[3] = FXARGB_B(src_plt[1]); + bgr_ptr[4] = FXARGB_G(src_plt[1]); + bgr_ptr[5] = FXARGB_R(src_plt[1]); + } + + if (pSrcBitmap->IsCmykImage()) { + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), + FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]), + bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]); + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), + FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]), + bgr_ptr[5], bgr_ptr[4], bgr_ptr[3]); + } + + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row); + for (int col = src_left; col < src_left + width; col++) { + if (src_scan[col / 8] & (1 << (7 - col % 8))) { + *dest_scan++ = bgr_ptr[3]; + *dest_scan++ = bgr_ptr[4]; + *dest_scan = bgr_ptr[5]; + } else { + *dest_scan++ = bgr_ptr[0]; + *dest_scan++ = bgr_ptr[1]; + *dest_scan = bgr_ptr[2]; + } + dest_scan += comps - 2; + } + } + return true; +} + +bool ConvertBuffer_8bppPlt2Rgb(FXDIB_Format dst_format, + uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + int comps = (dst_format & 0xff) / 8; + uint32_t* src_plt = pSrcBitmap->GetPalette(); + uint32_t plt[256]; + uint8_t* bgr_ptr = (uint8_t*)plt; + if (!pSrcBitmap->IsCmykImage()) { + for (int i = 0; i < 256; i++) { + *bgr_ptr++ = FXARGB_B(src_plt[i]); + *bgr_ptr++ = FXARGB_G(src_plt[i]); + *bgr_ptr++ = FXARGB_R(src_plt[i]); + } + bgr_ptr = (uint8_t*)plt; + } + + if (pSrcBitmap->IsCmykImage()) { + for (int i = 0; i < 256; i++) { + AdobeCMYK_to_sRGB1( + FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), + FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]), bgr_ptr[2], + bgr_ptr[1], bgr_ptr[0]); + bgr_ptr += 3; + } + bgr_ptr = (uint8_t*)plt; + } + + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left; + for (int col = 0; col < width; col++) { + uint8_t* src_pixel = bgr_ptr + 3 * (*src_scan++); + *dest_scan++ = *src_pixel++; + *dest_scan++ = *src_pixel++; + *dest_scan = *src_pixel++; + dest_scan += comps - 2; + } + } + return true; +} + +bool ConvertBuffer_24bppRgb2Rgb24(uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + const uint8_t* src_scan = + pSrcBitmap->GetScanline(src_top + row) + src_left * 3; + FXSYS_memcpy(dest_scan, src_scan, width * 3); + } + return true; +} + +bool ConvertBuffer_32bppRgb2Rgb24(uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + const uint8_t* src_scan = + pSrcBitmap->GetScanline(src_top + row) + src_left * 4; + for (int col = 0; col < width; col++) { + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + src_scan++; + } + } + return true; +} + +bool ConvertBuffer_Rgb2Rgb32(uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + int comps = pSrcBitmap->GetBPP() / 8; + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + const uint8_t* src_scan = + pSrcBitmap->GetScanline(src_top + row) + src_left * comps; + for (int col = 0; col < width; col++) { + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + dest_scan++; + src_scan += comps - 3; + } + } + return true; +} + +bool ConvertBuffer_32bppCmyk2Rgb32(uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * dest_pitch; + const uint8_t* src_scan = + pSrcBitmap->GetScanline(src_top + row) + src_left * 4; + for (int col = 0; col < width; col++) { + AdobeCMYK_to_sRGB1(src_scan[0], src_scan[1], src_scan[2], src_scan[3], + dest_scan[2], dest_scan[1], dest_scan[0]); + dest_scan += 4; + src_scan += 4; + } + } + return true; +} + +bool ConvertBuffer(FXDIB_Format dest_format, + uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top, + std::unique_ptr* p_pal) { + FXDIB_Format src_format = pSrcBitmap->GetFormat(); + switch (dest_format) { + case FXDIB_Invalid: + case FXDIB_1bppCmyk: + case FXDIB_1bppMask: + case FXDIB_1bppRgb: + ASSERT(false); + return false; + case FXDIB_8bppMask: { + if ((src_format & 0xff) == 1) { + if (pSrcBitmap->GetPalette()) { + return ConvertBuffer_1bppPlt2Gray(dest_buf, dest_pitch, width, height, + pSrcBitmap, src_left, src_top); + } + return ConvertBuffer_1bppMask2Gray(dest_buf, dest_pitch, width, height, + pSrcBitmap, src_left, src_top); + } + if ((src_format & 0xff) == 8) { + if (pSrcBitmap->GetPalette()) { + return ConvertBuffer_8bppPlt2Gray(dest_buf, dest_pitch, width, height, + pSrcBitmap, src_left, src_top); + } + return ConvertBuffer_8bppMask2Gray(dest_buf, dest_pitch, width, height, + pSrcBitmap, src_left, src_top); + } + if ((src_format & 0xff) >= 24) { + return ConvertBuffer_RgbOrCmyk2Gray(dest_buf, dest_pitch, width, height, + pSrcBitmap, src_left, src_top); + } + return false; + } + case FXDIB_8bppRgb: + case FXDIB_8bppRgba: { + if ((src_format & 0xff) == 8 && !pSrcBitmap->GetPalette()) { + return ConvertBuffer(FXDIB_8bppMask, dest_buf, dest_pitch, width, + height, pSrcBitmap, src_left, src_top, p_pal); + } + p_pal->reset(FX_Alloc(uint32_t, 256)); + if (((src_format & 0xff) == 1 || (src_format & 0xff) == 8) && + pSrcBitmap->GetPalette()) { + return ConvertBuffer_Plt2PltRgb8(dest_buf, dest_pitch, width, height, + pSrcBitmap, src_left, src_top, + p_pal->get()); + } + if ((src_format & 0xff) >= 24) { + return ConvertBuffer_Rgb2PltRgb8(dest_buf, dest_pitch, width, height, + pSrcBitmap, src_left, src_top, + p_pal->get()); + } + return false; + } + case FXDIB_Rgb: + case FXDIB_Rgba: { + if ((src_format & 0xff) == 1) { + if (pSrcBitmap->GetPalette()) { + return ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, + width, height, pSrcBitmap, src_left, + src_top); + } + return ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, + width, height, pSrcBitmap, src_left, + src_top); + } + if ((src_format & 0xff) == 8) { + if (pSrcBitmap->GetPalette()) { + return ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, + width, height, pSrcBitmap, src_left, + src_top); + } + return ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, + width, height, pSrcBitmap, src_left, + src_top); + } + if ((src_format & 0xff) == 24) { + return ConvertBuffer_24bppRgb2Rgb24(dest_buf, dest_pitch, width, height, + pSrcBitmap, src_left, src_top); + } + if ((src_format & 0xff) == 32) { + return ConvertBuffer_32bppRgb2Rgb24(dest_buf, dest_pitch, width, height, + pSrcBitmap, src_left, src_top); + } + return false; + } + case FXDIB_Argb: + case FXDIB_Rgb32: { + if ((src_format & 0xff) == 1) { + if (pSrcBitmap->GetPalette()) { + return ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, + width, height, pSrcBitmap, src_left, + src_top); + } + return ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, + width, height, pSrcBitmap, src_left, + src_top); + } + if ((src_format & 0xff) == 8) { + if (pSrcBitmap->GetPalette()) { + return ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, + width, height, pSrcBitmap, src_left, + src_top); + } + return ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, + width, height, pSrcBitmap, src_left, + src_top); + } + if ((src_format & 0xff) >= 24) { + if (src_format & 0x0400) { + return ConvertBuffer_32bppCmyk2Rgb32(dest_buf, dest_pitch, width, + height, pSrcBitmap, src_left, + src_top); + } + return ConvertBuffer_Rgb2Rgb32(dest_buf, dest_pitch, width, height, + pSrcBitmap, src_left, src_top); + } + return false; + } + default: + return false; + } +} + +std::unique_ptr CFX_DIBSource::CloneConvert( + FXDIB_Format dest_format) const { + if (dest_format == GetFormat()) + return Clone(nullptr); + + std::unique_ptr pClone = pdfium::MakeUnique(); + if (!pClone->Create(m_Width, m_Height, dest_format)) + return nullptr; + + CFX_MaybeOwned pSrcAlpha; + if (HasAlpha()) { + if (GetFormat() == FXDIB_Argb) + pSrcAlpha = CloneAlphaMask(); + else + pSrcAlpha = m_pAlphaMask; + + if (!pSrcAlpha) + return nullptr; + } + bool ret = true; + if (dest_format & 0x0200) { + if (dest_format == FXDIB_Argb) { + ret = pSrcAlpha + ? pClone->LoadChannel(FXDIB_Alpha, pSrcAlpha.Get(), FXDIB_Alpha) + : pClone->LoadChannel(FXDIB_Alpha, 0xff); + } else { + ret = pClone->SetAlphaMask(pSrcAlpha.Get()); + } + } + if (!ret) + return nullptr; + + std::unique_ptr pal_8bpp; + if (!ConvertBuffer(dest_format, pClone->GetBuffer(), pClone->GetPitch(), + m_Width, m_Height, this, 0, 0, &pal_8bpp)) { + return nullptr; + } + if (pal_8bpp) + pClone->SetPalette(pal_8bpp.get()); + + return pClone; +} + +bool CFX_DIBitmap::ConvertFormat(FXDIB_Format dest_format) { + FXDIB_Format src_format = GetFormat(); + if (dest_format == src_format) + return true; + + if (dest_format == FXDIB_8bppMask && src_format == FXDIB_8bppRgb && + !m_pPalette) { + m_AlphaFlag = 1; + return true; + } + if (dest_format == FXDIB_Argb && src_format == FXDIB_Rgb32) { + m_AlphaFlag = 2; + for (int row = 0; row < m_Height; row++) { + uint8_t* scanline = m_pBuffer + row * m_Pitch + 3; + for (int col = 0; col < m_Width; col++) { + *scanline = 0xff; + scanline += 4; + } + } + return true; + } + int dest_bpp = dest_format & 0xff; + int dest_pitch = (dest_bpp * m_Width + 31) / 32 * 4; + uint8_t* dest_buf = FX_TryAlloc(uint8_t, dest_pitch * m_Height + 4); + if (!dest_buf) { + return false; + } + CFX_DIBitmap* pAlphaMask = nullptr; + if (dest_format == FXDIB_Argb) { + FXSYS_memset(dest_buf, 0xff, dest_pitch * m_Height + 4); + if (m_pAlphaMask) { + for (int row = 0; row < m_Height; row++) { + uint8_t* pDstScanline = dest_buf + row * dest_pitch + 3; + const uint8_t* pSrcScanline = m_pAlphaMask->GetScanline(row); + for (int col = 0; col < m_Width; col++) { + *pDstScanline = *pSrcScanline++; + pDstScanline += 4; + } + } + } + } else if (dest_format & 0x0200) { + if (src_format == FXDIB_Argb) { + pAlphaMask = CloneAlphaMask().release(); + if (!pAlphaMask) { + FX_Free(dest_buf); + return false; + } + } else { + if (!m_pAlphaMask) { + if (!BuildAlphaMask()) { + FX_Free(dest_buf); + return false; + } + pAlphaMask = m_pAlphaMask; + m_pAlphaMask = nullptr; + } else { + pAlphaMask = m_pAlphaMask; + } + } + } + bool ret = false; + std::unique_ptr pal_8bpp; + ret = ConvertBuffer(dest_format, dest_buf, dest_pitch, m_Width, m_Height, + this, 0, 0, &pal_8bpp); + if (!ret) { + if (pAlphaMask != m_pAlphaMask) + delete pAlphaMask; + FX_Free(dest_buf); + return false; + } + if (m_pAlphaMask && pAlphaMask != m_pAlphaMask) + delete m_pAlphaMask; + m_pAlphaMask = pAlphaMask; + m_pPalette = std::move(pal_8bpp); + if (!m_bExtBuf) + FX_Free(m_pBuffer); + m_bExtBuf = false; + m_pBuffer = dest_buf; + m_bpp = (uint8_t)dest_format; + m_AlphaFlag = (uint8_t)(dest_format >> 8); + m_Pitch = dest_pitch; + return true; +} diff --git a/modules/pdfium/pdfium/core/fxge/dib/fx_dib_engine.cpp b/modules/pdfium/pdfium/core/fxge/dib/fx_dib_engine.cpp new file mode 100644 index 000000000000..c004aac538d7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/dib/fx_dib_engine.cpp @@ -0,0 +1,1007 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include + +#include "core/fxge/dib/dib_int.h" +#include "core/fxge/fx_dib.h" +#include "third_party/base/ptr_util.h" + +namespace { + +bool SourceSizeWithinLimit(int width, int height) { + const int kMaxProgressiveStretchPixels = 1000000; + return !height || width < kMaxProgressiveStretchPixels / height; +} + +FXDIB_Format GetStretchedFormat(const CFX_DIBSource& src) { + FXDIB_Format format = src.GetFormat(); + if (format == FXDIB_1bppMask) + return FXDIB_8bppMask; + if (format == FXDIB_1bppRgb) + return FXDIB_8bppRgb; + if (format == FXDIB_8bppRgb && src.GetPalette()) + return FXDIB_Rgb; + return format; +} + +} // namespace + +CWeightTable::CWeightTable() + : m_DestMin(0), + m_ItemSize(0), + m_pWeightTables(nullptr), + m_dwWeightTablesSize(0) {} + +CWeightTable::~CWeightTable() { + FX_Free(m_pWeightTables); +} + +size_t CWeightTable::GetPixelWeightSize() const { + return m_ItemSize / sizeof(int) - 2; +} + +bool CWeightTable::Calc(int dest_len, + int dest_min, + int dest_max, + int src_len, + int src_min, + int src_max, + int flags) { + FX_Free(m_pWeightTables); + m_pWeightTables = nullptr; + m_dwWeightTablesSize = 0; + const double scale = (FX_FLOAT)src_len / (FX_FLOAT)dest_len; + const double base = dest_len < 0 ? (FX_FLOAT)(src_len) : 0; + const int ext_size = flags & FXDIB_BICUBIC_INTERPOL ? 3 : 1; + m_ItemSize = + sizeof(int) * 2 + + (int)(sizeof(int) * (FXSYS_ceil(FXSYS_fabs((FX_FLOAT)scale)) + ext_size)); + m_DestMin = dest_min; + if ((dest_max - dest_min) > (int)((1U << 30) - 4) / m_ItemSize) + return false; + + m_dwWeightTablesSize = (dest_max - dest_min) * m_ItemSize + 4; + m_pWeightTables = FX_TryAlloc(uint8_t, m_dwWeightTablesSize); + if (!m_pWeightTables) + return false; + + if ((flags & FXDIB_NOSMOOTH) != 0 || FXSYS_fabs((FX_FLOAT)scale) < 1.0f) { + for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel++) { + PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel); + double src_pos = dest_pixel * scale + scale / 2 + base; + if (flags & FXDIB_INTERPOL) { + pixel_weights.m_SrcStart = + (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2); + pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2); + if (pixel_weights.m_SrcStart < src_min) { + pixel_weights.m_SrcStart = src_min; + } + if (pixel_weights.m_SrcEnd >= src_max) { + pixel_weights.m_SrcEnd = src_max - 1; + } + if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) { + pixel_weights.m_Weights[0] = 65536; + } else { + pixel_weights.m_Weights[1] = FXSYS_round( + (FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * + 65536); + pixel_weights.m_Weights[0] = 65536 - pixel_weights.m_Weights[1]; + } + } else if (flags & FXDIB_BICUBIC_INTERPOL) { + pixel_weights.m_SrcStart = + (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2); + pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2); + int start = pixel_weights.m_SrcStart - 1; + int end = pixel_weights.m_SrcEnd + 1; + if (start < src_min) { + start = src_min; + } + if (end >= src_max) { + end = src_max - 1; + } + if (pixel_weights.m_SrcStart < src_min) { + src_pos += src_min - pixel_weights.m_SrcStart; + pixel_weights.m_SrcStart = src_min; + } + if (pixel_weights.m_SrcEnd >= src_max) { + pixel_weights.m_SrcEnd = src_max - 1; + } + int weight; + weight = FXSYS_round( + (FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 256); + if (start == end) { + pixel_weights.m_Weights[0] = + (SDP_Table[256 + weight] + SDP_Table[weight] + + SDP_Table[256 - weight] + SDP_Table[512 - weight]) + << 8; + } else if ((start == pixel_weights.m_SrcStart && + (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd || + end == pixel_weights.m_SrcEnd) && + start < end) || + (start < pixel_weights.m_SrcStart && + pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd && + end == pixel_weights.m_SrcEnd)) { + if (start < pixel_weights.m_SrcStart) { + pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8; + pixel_weights.m_Weights[1] = + (SDP_Table[weight] + SDP_Table[256 - weight] + + SDP_Table[512 - weight]) + << 8; + } else { + if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) { + pixel_weights.m_Weights[0] = + (SDP_Table[256 + weight] + SDP_Table[weight] + + SDP_Table[256 - weight]) + << 8; + pixel_weights.m_Weights[1] = SDP_Table[512 - weight] << 8; + } else { + pixel_weights.m_Weights[0] = + (SDP_Table[256 + weight] + SDP_Table[weight]) << 8; + pixel_weights.m_Weights[1] = + (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8; + } + } + if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) { + pixel_weights.m_SrcEnd = end; + } + if (start < pixel_weights.m_SrcStart) { + pixel_weights.m_SrcStart = start; + } + } else if (start == pixel_weights.m_SrcStart && + start < pixel_weights.m_SrcEnd && + pixel_weights.m_SrcEnd < end) { + pixel_weights.m_Weights[0] = + (SDP_Table[256 + weight] + SDP_Table[weight]) << 8; + pixel_weights.m_Weights[1] = SDP_Table[256 - weight] << 8; + pixel_weights.m_Weights[2] = SDP_Table[512 - weight] << 8; + pixel_weights.m_SrcEnd = end; + } else if (start < pixel_weights.m_SrcStart && + pixel_weights.m_SrcStart < pixel_weights.m_SrcEnd && + pixel_weights.m_SrcEnd == end) { + pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8; + pixel_weights.m_Weights[1] = SDP_Table[weight] << 8; + pixel_weights.m_Weights[2] = + (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8; + pixel_weights.m_SrcStart = start; + } else { + pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8; + pixel_weights.m_Weights[1] = SDP_Table[weight] << 8; + pixel_weights.m_Weights[2] = SDP_Table[256 - weight] << 8; + pixel_weights.m_Weights[3] = SDP_Table[512 - weight] << 8; + pixel_weights.m_SrcStart = start; + pixel_weights.m_SrcEnd = end; + } + } else { + pixel_weights.m_SrcStart = pixel_weights.m_SrcEnd = + (int)FXSYS_floor((FX_FLOAT)src_pos); + if (pixel_weights.m_SrcStart < src_min) { + pixel_weights.m_SrcStart = src_min; + } + if (pixel_weights.m_SrcEnd >= src_max) { + pixel_weights.m_SrcEnd = src_max - 1; + } + pixel_weights.m_Weights[0] = 65536; + } + } + return true; + } + + for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel++) { + PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel); + double src_start = dest_pixel * scale + base; + double src_end = src_start + scale; + int start_i, end_i; + if (src_start < src_end) { + start_i = (int)FXSYS_floor((FX_FLOAT)src_start); + end_i = (int)FXSYS_ceil((FX_FLOAT)src_end); + } else { + start_i = (int)FXSYS_floor((FX_FLOAT)src_end); + end_i = (int)FXSYS_ceil((FX_FLOAT)src_start); + } + if (start_i < src_min) { + start_i = src_min; + } + if (end_i >= src_max) { + end_i = src_max - 1; + } + if (start_i > end_i) { + if (start_i >= src_max) { + start_i = src_max - 1; + } + pixel_weights.m_SrcStart = start_i; + pixel_weights.m_SrcEnd = start_i; + continue; + } + pixel_weights.m_SrcStart = start_i; + pixel_weights.m_SrcEnd = end_i; + for (int j = start_i; j <= end_i; j++) { + double dest_start = ((FX_FLOAT)j - base) / scale; + double dest_end = ((FX_FLOAT)(j + 1) - base) / scale; + if (dest_start > dest_end) { + double temp = dest_start; + dest_start = dest_end; + dest_end = temp; + } + double area_start = dest_start > (FX_FLOAT)(dest_pixel) + ? dest_start + : (FX_FLOAT)(dest_pixel); + double area_end = dest_end > (FX_FLOAT)(dest_pixel + 1) + ? (FX_FLOAT)(dest_pixel + 1) + : dest_end; + double weight = area_start >= area_end ? 0.0f : area_end - area_start; + if (weight == 0 && j == end_i) { + pixel_weights.m_SrcEnd--; + break; + } + size_t idx = j - start_i; + if (idx >= GetPixelWeightSize()) + return false; + pixel_weights.m_Weights[idx] = FXSYS_round((FX_FLOAT)(weight * 65536)); + } + } + return true; +} + +PixelWeight* CWeightTable::GetPixelWeight(int pixel) const { + ASSERT(pixel >= m_DestMin); + return reinterpret_cast(m_pWeightTables + + (pixel - m_DestMin) * m_ItemSize); +} + +int* CWeightTable::GetValueFromPixelWeight(PixelWeight* pWeight, + int index) const { + if (index < pWeight->m_SrcStart) + return nullptr; + + size_t idx = index - pWeight->m_SrcStart; + return idx < GetPixelWeightSize() ? &pWeight->m_Weights[idx] : nullptr; +} + +CStretchEngine::CStretchEngine(IFX_ScanlineComposer* pDestBitmap, + FXDIB_Format dest_format, + int dest_width, + int dest_height, + const FX_RECT& clip_rect, + const CFX_DIBSource* pSrcBitmap, + int flags) { + m_State = 0; + m_DestFormat = dest_format; + m_DestBpp = dest_format & 0xff; + m_SrcBpp = pSrcBitmap->GetFormat() & 0xff; + m_bHasAlpha = pSrcBitmap->GetFormat() & 0x200; + m_pSrcPalette = pSrcBitmap->GetPalette(); + m_pDestBitmap = pDestBitmap; + m_DestWidth = dest_width; + m_DestHeight = dest_height; + m_pInterBuf = nullptr; + m_pExtraAlphaBuf = nullptr; + m_pDestMaskScanline = nullptr; + m_DestClip = clip_rect; + uint32_t size = clip_rect.Width(); + if (size && m_DestBpp > (int)(INT_MAX / size)) { + return; + } + size *= m_DestBpp; + if (size > INT_MAX - 31) { + return; + } + size += 31; + size = size / 32 * 4; + m_pDestScanline = FX_TryAlloc(uint8_t, size); + if (!m_pDestScanline) { + return; + } + if (dest_format == FXDIB_Rgb32) { + FXSYS_memset(m_pDestScanline, 255, size); + } + m_InterPitch = (m_DestClip.Width() * m_DestBpp + 31) / 32 * 4; + m_ExtraMaskPitch = (m_DestClip.Width() * 8 + 31) / 32 * 4; + m_pInterBuf = nullptr; + m_pSource = pSrcBitmap; + m_SrcWidth = pSrcBitmap->GetWidth(); + m_SrcHeight = pSrcBitmap->GetHeight(); + m_SrcPitch = (m_SrcWidth * m_SrcBpp + 31) / 32 * 4; + if ((flags & FXDIB_NOSMOOTH) == 0) { + bool bInterpol = flags & FXDIB_INTERPOL || flags & FXDIB_BICUBIC_INTERPOL; + if (!bInterpol && FXSYS_abs(dest_width) != 0 && + FXSYS_abs(dest_height) / 8 < static_cast(m_SrcWidth) * + m_SrcHeight / FXSYS_abs(dest_width)) { + flags = FXDIB_INTERPOL; + } + m_Flags = flags; + } else { + m_Flags = FXDIB_NOSMOOTH; + if (flags & FXDIB_DOWNSAMPLE) { + m_Flags |= FXDIB_DOWNSAMPLE; + } + } + double scale_x = (FX_FLOAT)m_SrcWidth / (FX_FLOAT)m_DestWidth; + double scale_y = (FX_FLOAT)m_SrcHeight / (FX_FLOAT)m_DestHeight; + double base_x = m_DestWidth > 0 ? 0.0f : (FX_FLOAT)(m_DestWidth); + double base_y = m_DestHeight > 0 ? 0.0f : (FX_FLOAT)(m_DestHeight); + double src_left = scale_x * ((FX_FLOAT)(clip_rect.left) + base_x); + double src_right = scale_x * ((FX_FLOAT)(clip_rect.right) + base_x); + double src_top = scale_y * ((FX_FLOAT)(clip_rect.top) + base_y); + double src_bottom = scale_y * ((FX_FLOAT)(clip_rect.bottom) + base_y); + if (src_left > src_right) { + double temp = src_left; + src_left = src_right; + src_right = temp; + } + if (src_top > src_bottom) { + double temp = src_top; + src_top = src_bottom; + src_bottom = temp; + } + m_SrcClip.left = (int)FXSYS_floor((FX_FLOAT)src_left); + m_SrcClip.right = (int)FXSYS_ceil((FX_FLOAT)src_right); + m_SrcClip.top = (int)FXSYS_floor((FX_FLOAT)src_top); + m_SrcClip.bottom = (int)FXSYS_ceil((FX_FLOAT)src_bottom); + FX_RECT src_rect(0, 0, m_SrcWidth, m_SrcHeight); + m_SrcClip.Intersect(src_rect); + if (m_SrcBpp == 1) { + if (m_DestBpp == 8) { + m_TransMethod = 1; + } else { + m_TransMethod = 2; + } + } else if (m_SrcBpp == 8) { + if (m_DestBpp == 8) { + if (!m_bHasAlpha) { + m_TransMethod = 3; + } else { + m_TransMethod = 4; + } + } else { + if (!m_bHasAlpha) { + m_TransMethod = 5; + } else { + m_TransMethod = 6; + } + } + } else { + if (!m_bHasAlpha) { + m_TransMethod = 7; + } else { + m_TransMethod = 8; + } + } +} + +CStretchEngine::~CStretchEngine() { + FX_Free(m_pDestScanline); + FX_Free(m_pInterBuf); + FX_Free(m_pExtraAlphaBuf); + FX_Free(m_pDestMaskScanline); +} + +bool CStretchEngine::Continue(IFX_Pause* pPause) { + while (m_State == 1) { + if (ContinueStretchHorz(pPause)) { + return true; + } + m_State = 2; + StretchVert(); + } + return false; +} + +bool CStretchEngine::StartStretchHorz() { + if (m_DestWidth == 0 || m_InterPitch == 0 || !m_pDestScanline) + return false; + + if (m_SrcClip.Height() == 0 || + m_SrcClip.Height() > (1 << 29) / m_InterPitch) { + return false; + } + + m_pInterBuf = FX_TryAlloc(unsigned char, m_SrcClip.Height() * m_InterPitch); + if (!m_pInterBuf) + return false; + + if (m_pSource && m_bHasAlpha && m_pSource->m_pAlphaMask) { + m_pExtraAlphaBuf = + FX_Alloc2D(unsigned char, m_SrcClip.Height(), m_ExtraMaskPitch); + uint32_t size = (m_DestClip.Width() * 8 + 31) / 32 * 4; + m_pDestMaskScanline = FX_TryAlloc(unsigned char, size); + if (!m_pDestMaskScanline) + return false; + } + bool ret = + m_WeightTable.Calc(m_DestWidth, m_DestClip.left, m_DestClip.right, + m_SrcWidth, m_SrcClip.left, m_SrcClip.right, m_Flags); + if (!ret) + return false; + + m_CurRow = m_SrcClip.top; + m_State = 1; + return true; +} + +bool CStretchEngine::ContinueStretchHorz(IFX_Pause* pPause) { + if (!m_DestWidth) + return false; + + if (m_pSource->SkipToScanline(m_CurRow, pPause)) + return true; + + int Bpp = m_DestBpp / 8; + static const int kStrechPauseRows = 10; + int rows_to_go = kStrechPauseRows; + for (; m_CurRow < m_SrcClip.bottom; m_CurRow++) { + if (rows_to_go == 0) { + if (pPause && pPause->NeedToPauseNow()) + return true; + + rows_to_go = kStrechPauseRows; + } + + const uint8_t* src_scan = m_pSource->GetScanline(m_CurRow); + uint8_t* dest_scan = + m_pInterBuf + (m_CurRow - m_SrcClip.top) * m_InterPitch; + const uint8_t* src_scan_mask = nullptr; + uint8_t* dest_scan_mask = nullptr; + if (m_pExtraAlphaBuf) { + src_scan_mask = m_pSource->m_pAlphaMask->GetScanline(m_CurRow); + dest_scan_mask = + m_pExtraAlphaBuf + (m_CurRow - m_SrcClip.top) * m_ExtraMaskPitch; + } + switch (m_TransMethod) { + case 1: + case 2: { + for (int col = m_DestClip.left; col < m_DestClip.right; col++) { + PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col); + int dest_a = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int* pWeight = + m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j); + if (!pWeight) + return false; + + int pixel_weight = *pWeight; + if (src_scan[j / 8] & (1 << (7 - j % 8))) { + dest_a += pixel_weight * 255; + } + } + if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a; + } + *dest_scan++ = (uint8_t)(dest_a >> 16); + } + break; + } + case 3: { + for (int col = m_DestClip.left; col < m_DestClip.right; col++) { + PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col); + int dest_a = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int* pWeight = + m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j); + if (!pWeight) + return false; + + int pixel_weight = *pWeight; + dest_a += pixel_weight * src_scan[j]; + } + if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a; + } + *dest_scan++ = (uint8_t)(dest_a >> 16); + } + break; + } + case 4: { + for (int col = m_DestClip.left; col < m_DestClip.right; col++) { + PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col); + int dest_a = 0, dest_r = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int* pWeight = + m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j); + if (!pWeight) + return false; + + int pixel_weight = *pWeight; + pixel_weight = pixel_weight * src_scan_mask[j] / 255; + dest_r += pixel_weight * src_scan[j]; + dest_a += pixel_weight; + } + if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + dest_r = dest_r < 0 ? 0 : dest_r > 16711680 ? 16711680 : dest_r; + dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a; + } + *dest_scan++ = (uint8_t)(dest_r >> 16); + *dest_scan_mask++ = (uint8_t)((dest_a * 255) >> 16); + } + break; + } + case 5: { + for (int col = m_DestClip.left; col < m_DestClip.right; col++) { + PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col); + int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int* pWeight = + m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j); + if (!pWeight) + return false; + + int pixel_weight = *pWeight; + unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]]; + if (m_DestFormat == FXDIB_Rgb) { + dest_r_y += pixel_weight * (uint8_t)(argb_cmyk >> 16); + dest_g_m += pixel_weight * (uint8_t)(argb_cmyk >> 8); + dest_b_c += pixel_weight * (uint8_t)argb_cmyk; + } else { + dest_b_c += pixel_weight * (uint8_t)(argb_cmyk >> 24); + dest_g_m += pixel_weight * (uint8_t)(argb_cmyk >> 16); + dest_r_y += pixel_weight * (uint8_t)(argb_cmyk >> 8); + } + } + if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + dest_r_y = + dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y; + dest_g_m = + dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m; + dest_b_c = + dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c; + } + *dest_scan++ = (uint8_t)(dest_b_c >> 16); + *dest_scan++ = (uint8_t)(dest_g_m >> 16); + *dest_scan++ = (uint8_t)(dest_r_y >> 16); + } + break; + } + case 6: { + for (int col = m_DestClip.left; col < m_DestClip.right; col++) { + PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col); + int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int* pWeight = + m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j); + if (!pWeight) + return false; + + int pixel_weight = *pWeight; + pixel_weight = pixel_weight * src_scan_mask[j] / 255; + unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]]; + if (m_DestFormat == FXDIB_Rgba) { + dest_r_y += pixel_weight * (uint8_t)(argb_cmyk >> 16); + dest_g_m += pixel_weight * (uint8_t)(argb_cmyk >> 8); + dest_b_c += pixel_weight * (uint8_t)argb_cmyk; + } else { + dest_b_c += pixel_weight * (uint8_t)(argb_cmyk >> 24); + dest_g_m += pixel_weight * (uint8_t)(argb_cmyk >> 16); + dest_r_y += pixel_weight * (uint8_t)(argb_cmyk >> 8); + } + dest_a += pixel_weight; + } + if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + dest_b_c = + dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c; + dest_g_m = + dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m; + dest_r_y = + dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y; + dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a; + } + *dest_scan++ = (uint8_t)(dest_b_c >> 16); + *dest_scan++ = (uint8_t)(dest_g_m >> 16); + *dest_scan++ = (uint8_t)(dest_r_y >> 16); + *dest_scan_mask++ = (uint8_t)((dest_a * 255) >> 16); + } + break; + } + case 7: { + for (int col = m_DestClip.left; col < m_DestClip.right; col++) { + PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col); + int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int* pWeight = + m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j); + if (!pWeight) + return false; + + int pixel_weight = *pWeight; + const uint8_t* src_pixel = src_scan + j * Bpp; + dest_b_c += pixel_weight * (*src_pixel++); + dest_g_m += pixel_weight * (*src_pixel++); + dest_r_y += pixel_weight * (*src_pixel); + } + if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + dest_b_c = + dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c; + dest_g_m = + dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m; + dest_r_y = + dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y; + } + *dest_scan++ = (uint8_t)((dest_b_c) >> 16); + *dest_scan++ = (uint8_t)((dest_g_m) >> 16); + *dest_scan++ = (uint8_t)((dest_r_y) >> 16); + dest_scan += Bpp - 3; + } + break; + } + case 8: { + for (int col = m_DestClip.left; col < m_DestClip.right; col++) { + PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col); + int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int* pWeight = + m_WeightTable.GetValueFromPixelWeight(pPixelWeights, j); + if (!pWeight) + return false; + + int pixel_weight = *pWeight; + const uint8_t* src_pixel = src_scan + j * Bpp; + if (m_DestFormat == FXDIB_Argb) { + pixel_weight = pixel_weight * src_pixel[3] / 255; + } else { + pixel_weight = pixel_weight * src_scan_mask[j] / 255; + } + dest_b_c += pixel_weight * (*src_pixel++); + dest_g_m += pixel_weight * (*src_pixel++); + dest_r_y += pixel_weight * (*src_pixel); + dest_a += pixel_weight; + } + if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + dest_r_y = + dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y; + dest_g_m = + dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m; + dest_b_c = + dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c; + dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a; + } + *dest_scan++ = (uint8_t)((dest_b_c) >> 16); + *dest_scan++ = (uint8_t)((dest_g_m) >> 16); + *dest_scan++ = (uint8_t)((dest_r_y) >> 16); + if (m_DestFormat == FXDIB_Argb) { + *dest_scan = (uint8_t)((dest_a * 255) >> 16); + } + if (dest_scan_mask) { + *dest_scan_mask++ = (uint8_t)((dest_a * 255) >> 16); + } + dest_scan += Bpp - 3; + } + break; + } + } + rows_to_go--; + } + return false; +} + +void CStretchEngine::StretchVert() { + if (m_DestHeight == 0) + return; + + CWeightTable table; + bool ret = table.Calc(m_DestHeight, m_DestClip.top, m_DestClip.bottom, + m_SrcHeight, m_SrcClip.top, m_SrcClip.bottom, m_Flags); + if (!ret) + return; + + const int DestBpp = m_DestBpp / 8; + for (int row = m_DestClip.top; row < m_DestClip.bottom; row++) { + unsigned char* dest_scan = m_pDestScanline; + unsigned char* dest_scan_mask = m_pDestMaskScanline; + PixelWeight* pPixelWeights = table.GetPixelWeight(row); + switch (m_TransMethod) { + case 1: + case 2: + case 3: { + for (int col = m_DestClip.left; col < m_DestClip.right; col++) { + unsigned char* src_scan = + m_pInterBuf + (col - m_DestClip.left) * DestBpp; + int dest_a = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int* pWeight = table.GetValueFromPixelWeight(pPixelWeights, j); + if (!pWeight) + return; + + int pixel_weight = *pWeight; + dest_a += + pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch]; + } + if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a; + } + *dest_scan = (uint8_t)(dest_a >> 16); + dest_scan += DestBpp; + } + break; + } + case 4: { + for (int col = m_DestClip.left; col < m_DestClip.right; col++) { + unsigned char* src_scan = + m_pInterBuf + (col - m_DestClip.left) * DestBpp; + unsigned char* src_scan_mask = + m_pExtraAlphaBuf + (col - m_DestClip.left); + int dest_a = 0, dest_k = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int* pWeight = table.GetValueFromPixelWeight(pPixelWeights, j); + if (!pWeight) + return; + + int pixel_weight = *pWeight; + dest_k += + pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch]; + dest_a += pixel_weight * + src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch]; + } + if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k; + dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a; + } + *dest_scan = (uint8_t)(dest_k >> 16); + dest_scan += DestBpp; + *dest_scan_mask++ = (uint8_t)(dest_a >> 16); + } + break; + } + case 5: + case 7: { + for (int col = m_DestClip.left; col < m_DestClip.right; col++) { + unsigned char* src_scan = + m_pInterBuf + (col - m_DestClip.left) * DestBpp; + int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int* pWeight = table.GetValueFromPixelWeight(pPixelWeights, j); + if (!pWeight) + return; + + int pixel_weight = *pWeight; + const uint8_t* src_pixel = + src_scan + (j - m_SrcClip.top) * m_InterPitch; + dest_b_c += pixel_weight * (*src_pixel++); + dest_g_m += pixel_weight * (*src_pixel++); + dest_r_y += pixel_weight * (*src_pixel); + } + if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + dest_r_y = + dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y; + dest_g_m = + dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m; + dest_b_c = + dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c; + } + dest_scan[0] = (uint8_t)((dest_b_c) >> 16); + dest_scan[1] = (uint8_t)((dest_g_m) >> 16); + dest_scan[2] = (uint8_t)((dest_r_y) >> 16); + dest_scan += DestBpp; + } + break; + } + case 6: + case 8: { + for (int col = m_DestClip.left; col < m_DestClip.right; col++) { + unsigned char* src_scan = + m_pInterBuf + (col - m_DestClip.left) * DestBpp; + unsigned char* src_scan_mask = nullptr; + if (m_DestFormat != FXDIB_Argb) { + src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left); + } + int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int* pWeight = table.GetValueFromPixelWeight(pPixelWeights, j); + if (!pWeight) + return; + + int pixel_weight = *pWeight; + const uint8_t* src_pixel = + src_scan + (j - m_SrcClip.top) * m_InterPitch; + int mask_v = 255; + if (src_scan_mask) { + mask_v = src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch]; + } + dest_b_c += pixel_weight * (*src_pixel++); + dest_g_m += pixel_weight * (*src_pixel++); + dest_r_y += pixel_weight * (*src_pixel); + if (m_DestFormat == FXDIB_Argb) { + dest_a += pixel_weight * (*(src_pixel + 1)); + } else { + dest_a += pixel_weight * mask_v; + } + } + if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + dest_r_y = + dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y; + dest_g_m = + dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m; + dest_b_c = + dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c; + dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a; + } + if (dest_a) { + int r = ((uint32_t)dest_r_y) * 255 / dest_a; + int g = ((uint32_t)dest_g_m) * 255 / dest_a; + int b = ((uint32_t)dest_b_c) * 255 / dest_a; + dest_scan[0] = b > 255 ? 255 : b < 0 ? 0 : b; + dest_scan[1] = g > 255 ? 255 : g < 0 ? 0 : g; + dest_scan[2] = r > 255 ? 255 : r < 0 ? 0 : r; + } + if (m_DestFormat == FXDIB_Argb) { + dest_scan[3] = (uint8_t)((dest_a) >> 16); + } else { + *dest_scan_mask = (uint8_t)((dest_a) >> 16); + } + dest_scan += DestBpp; + if (dest_scan_mask) { + dest_scan_mask++; + } + } + break; + } + } + m_pDestBitmap->ComposeScanline(row - m_DestClip.top, m_pDestScanline, + m_pDestMaskScanline); + } +} + +CFX_ImageStretcher::CFX_ImageStretcher(IFX_ScanlineComposer* pDest, + const CFX_DIBSource* pSource, + int dest_width, + int dest_height, + const FX_RECT& bitmap_rect, + uint32_t flags) + : m_pDest(pDest), + m_pSource(pSource), + m_Flags(flags), + m_bFlipX(false), + m_bFlipY(false), + m_DestWidth(dest_width), + m_DestHeight(dest_height), + m_ClipRect(bitmap_rect), + m_DestFormat(GetStretchedFormat(*pSource)), + m_DestBPP(m_DestFormat & 0xff), + m_LineIndex(0) {} + +CFX_ImageStretcher::~CFX_ImageStretcher() { +} + +bool CFX_ImageStretcher::Start() { + if (m_DestWidth == 0 || m_DestHeight == 0) + return false; + + if (m_pSource->GetFormat() == FXDIB_1bppRgb && m_pSource->GetPalette()) { + FX_ARGB pal[256]; + int a0, r0, g0, b0, a1, r1, g1, b1; + ArgbDecode(m_pSource->GetPaletteEntry(0), a0, r0, g0, b0); + ArgbDecode(m_pSource->GetPaletteEntry(1), a1, r1, g1, b1); + for (int i = 0; i < 256; i++) { + int a = a0 + (a1 - a0) * i / 255; + int r = r0 + (r1 - r0) * i / 255; + int g = g0 + (g1 - g0) * i / 255; + int b = b0 + (b1 - b0) * i / 255; + pal[i] = ArgbEncode(a, r, g, b); + } + if (!m_pDest->SetInfo(m_ClipRect.Width(), m_ClipRect.Height(), m_DestFormat, + pal)) { + return false; + } + } else if (m_pSource->GetFormat() == FXDIB_1bppCmyk && + m_pSource->GetPalette()) { + FX_CMYK pal[256]; + int c0, m0, y0, k0, c1, m1, y1, k1; + CmykDecode(m_pSource->GetPaletteEntry(0), c0, m0, y0, k0); + CmykDecode(m_pSource->GetPaletteEntry(1), c1, m1, y1, k1); + for (int i = 0; i < 256; i++) { + int c = c0 + (c1 - c0) * i / 255; + int m = m0 + (m1 - m0) * i / 255; + int y = y0 + (y1 - y0) * i / 255; + int k = k0 + (k1 - k0) * i / 255; + pal[i] = CmykEncode(c, m, y, k); + } + if (!m_pDest->SetInfo(m_ClipRect.Width(), m_ClipRect.Height(), m_DestFormat, + pal)) { + return false; + } + } else if (!m_pDest->SetInfo(m_ClipRect.Width(), m_ClipRect.Height(), + m_DestFormat, nullptr)) { + return false; + } + + if (m_Flags & FXDIB_DOWNSAMPLE) + return StartQuickStretch(); + return StartStretch(); +} + +bool CFX_ImageStretcher::Continue(IFX_Pause* pPause) { + if (m_Flags & FXDIB_DOWNSAMPLE) + return ContinueQuickStretch(pPause); + return ContinueStretch(pPause); +} + +bool CFX_ImageStretcher::StartStretch() { + m_pStretchEngine = pdfium::MakeUnique( + m_pDest, m_DestFormat, m_DestWidth, m_DestHeight, m_ClipRect, m_pSource, + m_Flags); + m_pStretchEngine->StartStretchHorz(); + if (SourceSizeWithinLimit(m_pSource->GetWidth(), m_pSource->GetHeight())) { + m_pStretchEngine->Continue(nullptr); + return false; + } + return true; +} + +bool CFX_ImageStretcher::ContinueStretch(IFX_Pause* pPause) { + return m_pStretchEngine && m_pStretchEngine->Continue(pPause); +} + +bool CFX_ImageStretcher::StartQuickStretch() { + if (m_DestWidth < 0) { + m_bFlipX = true; + m_DestWidth = -m_DestWidth; + } + if (m_DestHeight < 0) { + m_bFlipY = true; + m_DestHeight = -m_DestHeight; + } + uint32_t size = m_ClipRect.Width(); + if (size && m_DestBPP > (int)(INT_MAX / size)) { + return false; + } + size *= m_DestBPP; + m_pScanline.reset(FX_Alloc(uint8_t, (size / 8 + 3) / 4 * 4)); + if (m_pSource->m_pAlphaMask) + m_pMaskScanline.reset(FX_Alloc(uint8_t, (m_ClipRect.Width() + 3) / 4 * 4)); + + if (SourceSizeWithinLimit(m_pSource->GetWidth(), m_pSource->GetHeight())) { + ContinueQuickStretch(nullptr); + return false; + } + return true; +} + +bool CFX_ImageStretcher::ContinueQuickStretch(IFX_Pause* pPause) { + if (!m_pScanline) + return false; + + int result_width = m_ClipRect.Width(); + int result_height = m_ClipRect.Height(); + int src_height = m_pSource->GetHeight(); + for (; m_LineIndex < result_height; m_LineIndex++) { + int dest_y; + int src_y; + if (m_bFlipY) { + dest_y = result_height - m_LineIndex - 1; + src_y = (m_DestHeight - (dest_y + m_ClipRect.top) - 1) * src_height / + m_DestHeight; + } else { + dest_y = m_LineIndex; + src_y = (dest_y + m_ClipRect.top) * src_height / m_DestHeight; + } + src_y = std::max(std::min(src_y, src_height - 1), 0); + + if (m_pSource->SkipToScanline(src_y, pPause)) + return true; + + m_pSource->DownSampleScanline(src_y, m_pScanline.get(), m_DestBPP, + m_DestWidth, m_bFlipX, m_ClipRect.left, + result_width); + if (m_pMaskScanline) { + m_pSource->m_pAlphaMask->DownSampleScanline( + src_y, m_pMaskScanline.get(), 1, m_DestWidth, m_bFlipX, + m_ClipRect.left, result_width); + } + m_pDest->ComposeScanline(dest_y, m_pScanline.get(), m_pMaskScanline.get()); + } + return false; +} diff --git a/modules/pdfium/pdfium/core/fxge/dib/fx_dib_engine_unittest.cpp b/modules/pdfium/pdfium/core/fxge/dib/fx_dib_engine_unittest.cpp new file mode 100644 index 000000000000..705d761ca83f --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/dib/fx_dib_engine_unittest.cpp @@ -0,0 +1,31 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include + +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/render/cpdf_dibsource.h" +#include "core/fxcrt/fx_memory.h" +#include "core/fxge/dib/dib_int.h" +#include "core/fxge/fx_dib.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/base/ptr_util.h" + +TEST(CStretchEngine, OverflowInCtor) { + FX_RECT clip_rect; + std::unique_ptr dict_obj = + pdfium::MakeUnique(); + dict_obj->SetNewFor("Width", 71000); + dict_obj->SetNewFor("Height", 12500); + std::unique_ptr stream = + pdfium::MakeUnique(nullptr, 0, std::move(dict_obj)); + CPDF_DIBSource dib_source; + dib_source.Load(nullptr, stream.get()); + CStretchEngine engine(nullptr, FXDIB_8bppRgb, 500, 500, clip_rect, + &dib_source, 0); + EXPECT_EQ(FXDIB_INTERPOL, engine.m_Flags); +} diff --git a/modules/pdfium/pdfium/core/fxge/dib/fx_dib_main.cpp b/modules/pdfium/pdfium/core/fxge/dib/fx_dib_main.cpp new file mode 100644 index 000000000000..96cae9d4e7bc --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/dib/fx_dib_main.cpp @@ -0,0 +1,1647 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fx_dib.h" + +#include + +#include +#include +#include + +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/dib/dib_int.h" +#include "core/fxge/ge/cfx_cliprgn.h" +#include "third_party/base/ptr_util.h" + +void CmykDecode(uint32_t cmyk, int& c, int& m, int& y, int& k) { + c = FXSYS_GetCValue(cmyk); + m = FXSYS_GetMValue(cmyk); + y = FXSYS_GetYValue(cmyk); + k = FXSYS_GetKValue(cmyk); +} + +void ArgbDecode(uint32_t argb, int& a, int& r, int& g, int& b) { + a = FXARGB_A(argb); + r = FXARGB_R(argb); + g = FXARGB_G(argb); + b = FXARGB_B(argb); +} + +void ArgbDecode(uint32_t argb, int& a, FX_COLORREF& rgb) { + a = FXARGB_A(argb); + rgb = FXSYS_RGB(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb)); +} + +uint32_t ArgbEncode(int a, FX_COLORREF rgb) { + return FXARGB_MAKE(a, FXSYS_GetRValue(rgb), FXSYS_GetGValue(rgb), + FXSYS_GetBValue(rgb)); +} + +CFX_DIBSource::CFX_DIBSource() + : m_pAlphaMask(nullptr), + m_Width(0), + m_Height(0), + m_bpp(0), + m_AlphaFlag(0), + m_Pitch(0) {} + +CFX_DIBSource::~CFX_DIBSource() { + delete m_pAlphaMask; +} + +uint8_t* CFX_DIBSource::GetBuffer() const { + return nullptr; +} + +bool CFX_DIBSource::SkipToScanline(int line, IFX_Pause* pPause) const { + return false; +} + +CFX_DIBitmap::CFX_DIBitmap() { + m_bExtBuf = false; + m_pBuffer = nullptr; + m_pPalette = nullptr; +#ifdef _SKIA_SUPPORT_PATHS_ + m_nFormat = Format::kCleared; +#endif +} + +#define _MAX_OOM_LIMIT_ 12000000 +bool CFX_DIBitmap::Create(int width, + int height, + FXDIB_Format format, + uint8_t* pBuffer, + int pitch) { + m_pBuffer = nullptr; + m_bpp = (uint8_t)format; + m_AlphaFlag = (uint8_t)(format >> 8); + m_Width = m_Height = m_Pitch = 0; + if (width <= 0 || height <= 0 || pitch < 0) { + return false; + } + if ((INT_MAX - 31) / width < (format & 0xff)) { + return false; + } + if (!pitch) { + pitch = (width * (format & 0xff) + 31) / 32 * 4; + } + if ((1 << 30) / pitch < height) { + return false; + } + if (pBuffer) { + m_pBuffer = pBuffer; + m_bExtBuf = true; + } else { + int size = pitch * height + 4; + int oomlimit = _MAX_OOM_LIMIT_; + if (oomlimit >= 0 && size >= oomlimit) { + m_pBuffer = FX_TryAlloc(uint8_t, size); + if (!m_pBuffer) { + return false; + } + } else { + m_pBuffer = FX_Alloc(uint8_t, size); + } + } + m_Width = width; + m_Height = height; + m_Pitch = pitch; + if (HasAlpha() && format != FXDIB_Argb) { + bool ret = true; + ret = BuildAlphaMask(); + if (!ret) { + if (!m_bExtBuf) { + FX_Free(m_pBuffer); + m_pBuffer = nullptr; + m_Width = m_Height = m_Pitch = 0; + return false; + } + } + } + return true; +} + +bool CFX_DIBitmap::Copy(const CFX_DIBSource* pSrc) { + if (m_pBuffer) + return false; + + if (!Create(pSrc->GetWidth(), pSrc->GetHeight(), pSrc->GetFormat())) + return false; + + SetPalette(pSrc->GetPalette()); + SetAlphaMask(pSrc->m_pAlphaMask); + for (int row = 0; row < pSrc->GetHeight(); row++) + FXSYS_memcpy(m_pBuffer + row * m_Pitch, pSrc->GetScanline(row), m_Pitch); + + return true; +} + +CFX_DIBitmap::~CFX_DIBitmap() { + if (!m_bExtBuf) + FX_Free(m_pBuffer); + + m_pBuffer = nullptr; +} + +uint8_t* CFX_DIBitmap::GetBuffer() const { + return m_pBuffer; +} + +const uint8_t* CFX_DIBitmap::GetScanline(int line) const { + return m_pBuffer ? m_pBuffer + line * m_Pitch : nullptr; +} + +void CFX_DIBitmap::TakeOver(CFX_DIBitmap* pSrcBitmap) { + if (!m_bExtBuf) + FX_Free(m_pBuffer); + + delete m_pAlphaMask; + m_pBuffer = pSrcBitmap->m_pBuffer; + m_pPalette = std::move(pSrcBitmap->m_pPalette); + m_pAlphaMask = pSrcBitmap->m_pAlphaMask; + pSrcBitmap->m_pBuffer = nullptr; + pSrcBitmap->m_pAlphaMask = nullptr; + m_bpp = pSrcBitmap->m_bpp; + m_bExtBuf = pSrcBitmap->m_bExtBuf; + m_AlphaFlag = pSrcBitmap->m_AlphaFlag; + m_Width = pSrcBitmap->m_Width; + m_Height = pSrcBitmap->m_Height; + m_Pitch = pSrcBitmap->m_Pitch; +} + +std::unique_ptr CFX_DIBSource::Clone(const FX_RECT* pClip) const { + FX_RECT rect(0, 0, m_Width, m_Height); + if (pClip) { + rect.Intersect(*pClip); + if (rect.IsEmpty()) + return nullptr; + } + auto pNewBitmap = pdfium::MakeUnique(); + if (!pNewBitmap->Create(rect.Width(), rect.Height(), GetFormat())) + return nullptr; + + pNewBitmap->SetPalette(m_pPalette.get()); + pNewBitmap->SetAlphaMask(m_pAlphaMask, pClip); + if (GetBPP() == 1 && rect.left % 8 != 0) { + int left_shift = rect.left % 32; + int right_shift = 32 - left_shift; + int dword_count = pNewBitmap->m_Pitch / 4; + for (int row = rect.top; row < rect.bottom; row++) { + uint32_t* src_scan = (uint32_t*)GetScanline(row) + rect.left / 32; + uint32_t* dest_scan = (uint32_t*)pNewBitmap->GetScanline(row - rect.top); + for (int i = 0; i < dword_count; i++) { + dest_scan[i] = + (src_scan[i] << left_shift) | (src_scan[i + 1] >> right_shift); + } + } + } else { + int copy_len = (pNewBitmap->GetWidth() * pNewBitmap->GetBPP() + 7) / 8; + if (m_Pitch < (uint32_t)copy_len) + copy_len = m_Pitch; + + for (int row = rect.top; row < rect.bottom; row++) { + const uint8_t* src_scan = GetScanline(row) + rect.left * m_bpp / 8; + uint8_t* dest_scan = (uint8_t*)pNewBitmap->GetScanline(row - rect.top); + FXSYS_memcpy(dest_scan, src_scan, copy_len); + } + } + return pNewBitmap; +} + +void CFX_DIBSource::BuildPalette() { + if (m_pPalette) + return; + + if (GetBPP() == 1) { + m_pPalette.reset(FX_Alloc(uint32_t, 2)); + if (IsCmykImage()) { + m_pPalette.get()[0] = 0xff; + m_pPalette.get()[1] = 0; + } else { + m_pPalette.get()[0] = 0xff000000; + m_pPalette.get()[1] = 0xffffffff; + } + } else if (GetBPP() == 8) { + m_pPalette.reset(FX_Alloc(uint32_t, 256)); + if (IsCmykImage()) { + for (int i = 0; i < 256; i++) + m_pPalette.get()[i] = 0xff - i; + } else { + for (int i = 0; i < 256; i++) + m_pPalette.get()[i] = 0xff000000 | (i * 0x10101); + } + } +} + +bool CFX_DIBSource::BuildAlphaMask() { + if (m_pAlphaMask) { + return true; + } + m_pAlphaMask = new CFX_DIBitmap; + if (!m_pAlphaMask->Create(m_Width, m_Height, FXDIB_8bppMask)) { + delete m_pAlphaMask; + m_pAlphaMask = nullptr; + return false; + } + FXSYS_memset(m_pAlphaMask->GetBuffer(), 0xff, + m_pAlphaMask->GetHeight() * m_pAlphaMask->GetPitch()); + return true; +} + +uint32_t CFX_DIBSource::GetPaletteEntry(int index) const { + ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask()); + if (m_pPalette) { + return m_pPalette.get()[index]; + } + if (IsCmykImage()) { + if (GetBPP() == 1) { + return index ? 0 : 0xff; + } + return 0xff - index; + } + if (GetBPP() == 1) { + return index ? 0xffffffff : 0xff000000; + } + return index * 0x10101 | 0xff000000; +} + +void CFX_DIBSource::SetPaletteEntry(int index, uint32_t color) { + ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask()); + if (!m_pPalette) { + BuildPalette(); + } + m_pPalette.get()[index] = color; +} + +int CFX_DIBSource::FindPalette(uint32_t color) const { + ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask()); + if (!m_pPalette) { + if (IsCmykImage()) { + if (GetBPP() == 1) { + return ((uint8_t)color == 0xff) ? 0 : 1; + } + return 0xff - (uint8_t)color; + } + if (GetBPP() == 1) { + return ((uint8_t)color == 0xff) ? 1 : 0; + } + return (uint8_t)color; + } + int palsize = (1 << GetBPP()); + for (int i = 0; i < palsize; i++) + if (m_pPalette.get()[i] == color) { + return i; + } + return -1; +} + +void CFX_DIBitmap::Clear(uint32_t color) { + if (!m_pBuffer) { + return; + } + switch (GetFormat()) { + case FXDIB_1bppMask: + FXSYS_memset(m_pBuffer, (color & 0xff000000) ? 0xff : 0, + m_Pitch * m_Height); + break; + case FXDIB_1bppRgb: { + int index = FindPalette(color); + FXSYS_memset(m_pBuffer, index ? 0xff : 0, m_Pitch * m_Height); + break; + } + case FXDIB_8bppMask: + FXSYS_memset(m_pBuffer, color >> 24, m_Pitch * m_Height); + break; + case FXDIB_8bppRgb: { + int index = FindPalette(color); + FXSYS_memset(m_pBuffer, index, m_Pitch * m_Height); + break; + } + case FXDIB_Rgb: + case FXDIB_Rgba: { + int a, r, g, b; + ArgbDecode(color, a, r, g, b); + if (r == g && g == b) { + FXSYS_memset(m_pBuffer, r, m_Pitch * m_Height); + } else { + int byte_pos = 0; + for (int col = 0; col < m_Width; col++) { + m_pBuffer[byte_pos++] = b; + m_pBuffer[byte_pos++] = g; + m_pBuffer[byte_pos++] = r; + } + for (int row = 1; row < m_Height; row++) { + FXSYS_memcpy(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch); + } + } + break; + } + case FXDIB_Rgb32: + case FXDIB_Argb: { + color = IsCmykImage() ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); +#ifdef _SKIA_SUPPORT_ + if (FXDIB_Rgb32 == GetFormat() && !IsCmykImage()) { + color |= 0xFF000000; + } +#endif + for (int i = 0; i < m_Width; i++) { + ((uint32_t*)m_pBuffer)[i] = color; + } + for (int row = 1; row < m_Height; row++) { + FXSYS_memcpy(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch); + } + break; + } + default: + break; + } +} + +void CFX_DIBSource::GetOverlapRect(int& dest_left, + int& dest_top, + int& width, + int& height, + int src_width, + int src_height, + int& src_left, + int& src_top, + const CFX_ClipRgn* pClipRgn) { + if (width == 0 || height == 0) { + return; + } + ASSERT(width > 0 && height > 0); + if (dest_left > m_Width || dest_top > m_Height) { + width = 0; + height = 0; + return; + } + int x_offset = dest_left - src_left; + int y_offset = dest_top - src_top; + FX_RECT src_rect(src_left, src_top, src_left + width, src_top + height); + FX_RECT src_bound(0, 0, src_width, src_height); + src_rect.Intersect(src_bound); + FX_RECT dest_rect(src_rect.left + x_offset, src_rect.top + y_offset, + src_rect.right + x_offset, src_rect.bottom + y_offset); + FX_RECT dest_bound(0, 0, m_Width, m_Height); + dest_rect.Intersect(dest_bound); + if (pClipRgn) { + dest_rect.Intersect(pClipRgn->GetBox()); + } + dest_left = dest_rect.left; + dest_top = dest_rect.top; + src_left = dest_left - x_offset; + src_top = dest_top - y_offset; + width = dest_rect.right - dest_rect.left; + height = dest_rect.bottom - dest_rect.top; +} + +bool CFX_DIBitmap::TransferBitmap(int dest_left, + int dest_top, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + if (!m_pBuffer) + return false; + + GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), + pSrcBitmap->GetHeight(), src_left, src_top, nullptr); + if (width == 0 || height == 0) + return true; + + FXDIB_Format dest_format = GetFormat(); + FXDIB_Format src_format = pSrcBitmap->GetFormat(); + if (dest_format == src_format) { + if (GetBPP() == 1) { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = m_pBuffer + (dest_top + row) * m_Pitch; + const uint8_t* src_scan = pSrcBitmap->GetScanline(src_top + row); + for (int col = 0; col < width; col++) { + if (src_scan[(src_left + col) / 8] & + (1 << (7 - (src_left + col) % 8))) { + dest_scan[(dest_left + col) / 8] |= 1 + << (7 - (dest_left + col) % 8); + } else { + dest_scan[(dest_left + col) / 8] &= + ~(1 << (7 - (dest_left + col) % 8)); + } + } + } + } else { + int Bpp = GetBPP() / 8; + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = + m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp; + const uint8_t* src_scan = + pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp; + FXSYS_memcpy(dest_scan, src_scan, width * Bpp); + } + } + } else { + if (m_pPalette) + return false; + + if (m_bpp == 8) + dest_format = FXDIB_8bppMask; + + uint8_t* dest_buf = + m_pBuffer + dest_top * m_Pitch + dest_left * GetBPP() / 8; + std::unique_ptr d_plt; + if (!ConvertBuffer(dest_format, dest_buf, m_Pitch, width, height, + pSrcBitmap, src_left, src_top, &d_plt)) { + return false; + } + } + return true; +} + +bool CFX_DIBitmap::TransferMask(int dest_left, + int dest_top, + int width, + int height, + const CFX_DIBSource* pMask, + uint32_t color, + int src_left, + int src_top, + int alpha_flag, + void* pIccTransform) { + if (!m_pBuffer) { + return false; + } + ASSERT(HasAlpha() && (m_bpp >= 24)); + ASSERT(pMask->IsAlphaMask()); + if (!HasAlpha() || !pMask->IsAlphaMask() || m_bpp < 24) { + return false; + } + GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), + pMask->GetHeight(), src_left, src_top, nullptr); + if (width == 0 || height == 0) { + return true; + } + int src_bpp = pMask->GetBPP(); + int alpha; + uint32_t dst_color; + if (alpha_flag >> 8) { + alpha = alpha_flag & 0xff; + dst_color = FXCMYK_TODIB(color); + } else { + alpha = FXARGB_A(color); + dst_color = FXARGB_TODIB(color); + } + uint8_t* color_p = (uint8_t*)&dst_color; + if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && + CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) { + CCodec_IccModule* pIccModule = + CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1); + } else { + if (alpha_flag >> 8 && !IsCmykImage()) { + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), + FXSYS_GetYValue(color), FXSYS_GetKValue(color), + color_p[2], color_p[1], color_p[0]); + } else if (!(alpha_flag >> 8) && IsCmykImage()) { + return false; + } + } + if (!IsCmykImage()) { + color_p[3] = (uint8_t)alpha; + } + if (GetFormat() == FXDIB_Argb) { + for (int row = 0; row < height; row++) { + uint32_t* dest_pos = + (uint32_t*)(m_pBuffer + (dest_top + row) * m_Pitch + dest_left * 4); + const uint8_t* src_scan = pMask->GetScanline(src_top + row); + if (src_bpp == 1) { + for (int col = 0; col < width; col++) { + int src_bitpos = src_left + col; + if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) { + *dest_pos = dst_color; + } else { + *dest_pos = 0; + } + dest_pos++; + } + } else { + src_scan += src_left; + dst_color = FXARGB_TODIB(dst_color); + dst_color &= 0xffffff; + for (int col = 0; col < width; col++) { + FXARGB_SETDIB(dest_pos++, + dst_color | ((alpha * (*src_scan++) / 255) << 24)); + } + } + } + } else { + int comps = m_bpp / 8; + for (int row = 0; row < height; row++) { + uint8_t* dest_color_pos = + m_pBuffer + (dest_top + row) * m_Pitch + dest_left * comps; + uint8_t* dest_alpha_pos = + (uint8_t*)m_pAlphaMask->GetScanline(dest_top + row) + dest_left; + const uint8_t* src_scan = pMask->GetScanline(src_top + row); + if (src_bpp == 1) { + for (int col = 0; col < width; col++) { + int src_bitpos = src_left + col; + if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) { + FXSYS_memcpy(dest_color_pos, color_p, comps); + *dest_alpha_pos = 0xff; + } else { + FXSYS_memset(dest_color_pos, 0, comps); + *dest_alpha_pos = 0; + } + dest_color_pos += comps; + dest_alpha_pos++; + } + } else { + src_scan += src_left; + for (int col = 0; col < width; col++) { + FXSYS_memcpy(dest_color_pos, color_p, comps); + dest_color_pos += comps; + *dest_alpha_pos++ = (alpha * (*src_scan++) / 255); + } + } + } + } + return true; +} + +void CFX_DIBSource::SetPalette(const uint32_t* pSrc) { + static const uint32_t kPaletteSize = 256; + if (!pSrc || GetBPP() > 8) { + m_pPalette.reset(); + return; + } + uint32_t pal_size = 1 << GetBPP(); + if (!m_pPalette) + m_pPalette.reset(FX_Alloc(uint32_t, pal_size)); + pal_size = std::min(pal_size, kPaletteSize); + FXSYS_memcpy(m_pPalette.get(), pSrc, pal_size * sizeof(uint32_t)); +} + +void CFX_DIBSource::GetPalette(uint32_t* pal, int alpha) const { + ASSERT(GetBPP() <= 8 && !IsCmykImage()); + if (GetBPP() == 1) { + pal[0] = ((m_pPalette ? m_pPalette.get()[0] : 0xff000000) & 0xffffff) | + (alpha << 24); + pal[1] = ((m_pPalette ? m_pPalette.get()[1] : 0xffffffff) & 0xffffff) | + (alpha << 24); + return; + } + if (m_pPalette) { + for (int i = 0; i < 256; i++) { + pal[i] = (m_pPalette.get()[i] & 0x00ffffff) | (alpha << 24); + } + } else { + for (int i = 0; i < 256; i++) { + pal[i] = (i * 0x10101) | (alpha << 24); + } + } +} + +std::unique_ptr CFX_DIBSource::CloneAlphaMask( + const FX_RECT* pClip) const { + ASSERT(GetFormat() == FXDIB_Argb); + FX_RECT rect(0, 0, m_Width, m_Height); + if (pClip) { + rect.Intersect(*pClip); + if (rect.IsEmpty()) + return nullptr; + } + auto pMask = pdfium::MakeUnique(); + if (!pMask->Create(rect.Width(), rect.Height(), FXDIB_8bppMask)) + return nullptr; + + for (int row = rect.top; row < rect.bottom; row++) { + const uint8_t* src_scan = GetScanline(row) + rect.left * 4 + 3; + uint8_t* dest_scan = + const_cast(pMask->GetScanline(row - rect.top)); + for (int col = rect.left; col < rect.right; col++) { + *dest_scan++ = *src_scan; + src_scan += 4; + } + } + return pMask; +} + +bool CFX_DIBSource::SetAlphaMask(const CFX_DIBSource* pAlphaMask, + const FX_RECT* pClip) { + if (!HasAlpha() || GetFormat() == FXDIB_Argb) + return false; + + if (!pAlphaMask) { + m_pAlphaMask->Clear(0xff000000); + return true; + } + FX_RECT rect(0, 0, pAlphaMask->m_Width, pAlphaMask->m_Height); + if (pClip) { + rect.Intersect(*pClip); + if (rect.IsEmpty() || rect.Width() != m_Width || + rect.Height() != m_Height) { + return false; + } + } else { + if (pAlphaMask->m_Width != m_Width || pAlphaMask->m_Height != m_Height) + return false; + } + for (int row = 0; row < m_Height; row++) { + FXSYS_memcpy(const_cast(m_pAlphaMask->GetScanline(row)), + pAlphaMask->GetScanline(row + rect.top) + rect.left, + m_pAlphaMask->m_Pitch); + } + return true; +} + +const int g_ChannelOffset[] = {0, 2, 1, 0, 0, 1, 2, 3, 3}; +bool CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, + CFX_DIBSource* pSrcBitmap, + FXDIB_Channel srcChannel) { + if (!m_pBuffer) + return false; + + CFX_MaybeOwned pSrcClone(pSrcBitmap); + int srcOffset; + if (srcChannel == FXDIB_Alpha) { + if (!pSrcBitmap->HasAlpha() && !pSrcBitmap->IsAlphaMask()) + return false; + + if (pSrcBitmap->GetBPP() == 1) { + pSrcClone = pSrcBitmap->CloneConvert(FXDIB_8bppMask); + if (!pSrcClone) + return false; + } + srcOffset = pSrcBitmap->GetFormat() == FXDIB_Argb ? 3 : 0; + } else { + if (pSrcBitmap->IsAlphaMask()) + return false; + + if (pSrcBitmap->GetBPP() < 24) { + if (pSrcBitmap->IsCmykImage()) { + pSrcClone = pSrcBitmap->CloneConvert(static_cast( + (pSrcBitmap->GetFormat() & 0xff00) | 0x20)); + } else { + pSrcClone = pSrcBitmap->CloneConvert(static_cast( + (pSrcBitmap->GetFormat() & 0xff00) | 0x18)); + } + if (!pSrcClone) + return false; + } + srcOffset = g_ChannelOffset[srcChannel]; + } + int destOffset = 0; + if (destChannel == FXDIB_Alpha) { + if (IsAlphaMask()) { + if (!ConvertFormat(FXDIB_8bppMask)) + return false; + } else { + if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) + return false; + + if (GetFormat() == FXDIB_Argb) + destOffset = 3; + } + } else { + if (IsAlphaMask()) + return false; + + if (GetBPP() < 24) { + if (HasAlpha()) { + if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) + return false; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + } else if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) { +#else + } else if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) { +#endif + return false; + } + } + destOffset = g_ChannelOffset[destChannel]; + } + if (srcChannel == FXDIB_Alpha && pSrcClone->m_pAlphaMask) { + CFX_MaybeOwned pAlphaMask(pSrcClone->m_pAlphaMask); + if (pSrcClone->GetWidth() != m_Width || + pSrcClone->GetHeight() != m_Height) { + if (pAlphaMask) { + pAlphaMask = pAlphaMask->StretchTo(m_Width, m_Height); + if (!pAlphaMask) + return false; + } + } + pSrcClone = std::move(pAlphaMask); + srcOffset = 0; + } else if (pSrcClone->GetWidth() != m_Width || + pSrcClone->GetHeight() != m_Height) { + std::unique_ptr pSrcMatched = + pSrcClone->StretchTo(m_Width, m_Height); + if (!pSrcMatched) + return false; + + pSrcClone = std::move(pSrcMatched); + } + CFX_DIBitmap* pDst = this; + if (destChannel == FXDIB_Alpha && m_pAlphaMask) { + pDst = m_pAlphaMask; + destOffset = 0; + } + int srcBytes = pSrcClone->GetBPP() / 8; + int destBytes = pDst->GetBPP() / 8; + for (int row = 0; row < m_Height; row++) { + uint8_t* dest_pos = (uint8_t*)pDst->GetScanline(row) + destOffset; + const uint8_t* src_pos = pSrcClone->GetScanline(row) + srcOffset; + for (int col = 0; col < m_Width; col++) { + *dest_pos = *src_pos; + dest_pos += destBytes; + src_pos += srcBytes; + } + } + return true; +} + +bool CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, int value) { + if (!m_pBuffer) { + return false; + } + int destOffset; + if (destChannel == FXDIB_Alpha) { + if (IsAlphaMask()) { + if (!ConvertFormat(FXDIB_8bppMask)) { + return false; + } + destOffset = 0; + } else { + destOffset = 0; + if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) { + return false; + } + if (GetFormat() == FXDIB_Argb) { + destOffset = 3; + } + } + } else { + if (IsAlphaMask()) { + return false; + } + if (GetBPP() < 24) { + if (HasAlpha()) { + if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) { + return false; + } +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + } else if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) { +#else + } else if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) { +#endif + return false; + } + } + destOffset = g_ChannelOffset[destChannel]; + } + int Bpp = GetBPP() / 8; + if (Bpp == 1) { + FXSYS_memset(m_pBuffer, value, m_Height * m_Pitch); + return true; + } + if (destChannel == FXDIB_Alpha && m_pAlphaMask) { + FXSYS_memset(m_pAlphaMask->GetBuffer(), value, + m_pAlphaMask->GetHeight() * m_pAlphaMask->GetPitch()); + return true; + } + for (int row = 0; row < m_Height; row++) { + uint8_t* scan_line = m_pBuffer + row * m_Pitch + destOffset; + for (int col = 0; col < m_Width; col++) { + *scan_line = value; + scan_line += Bpp; + } + } + return true; +} + +bool CFX_DIBitmap::MultiplyAlpha(CFX_DIBSource* pSrcBitmap) { + if (!m_pBuffer) + return false; + + ASSERT(pSrcBitmap->IsAlphaMask()); + if (!pSrcBitmap->IsAlphaMask()) + return false; + + if (!IsAlphaMask() && !HasAlpha()) + return LoadChannel(FXDIB_Alpha, pSrcBitmap, FXDIB_Alpha); + + CFX_MaybeOwned pSrcClone( + static_cast(pSrcBitmap)); + if (pSrcBitmap->GetWidth() != m_Width || + pSrcBitmap->GetHeight() != m_Height) { + pSrcClone = pSrcBitmap->StretchTo(m_Width, m_Height); + if (!pSrcClone) + return false; + } + if (IsAlphaMask()) { + if (!ConvertFormat(FXDIB_8bppMask)) + return false; + + for (int row = 0; row < m_Height; row++) { + uint8_t* dest_scan = m_pBuffer + m_Pitch * row; + uint8_t* src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row; + if (pSrcClone->GetBPP() == 1) { + for (int col = 0; col < m_Width; col++) { + if (!((1 << (7 - col % 8)) & src_scan[col / 8])) + dest_scan[col] = 0; + } + } else { + for (int col = 0; col < m_Width; col++) { + *dest_scan = (*dest_scan) * src_scan[col] / 255; + dest_scan++; + } + } + } + } else { + if (GetFormat() == FXDIB_Argb) { + if (pSrcClone->GetBPP() == 1) + return false; + + for (int row = 0; row < m_Height; row++) { + uint8_t* dest_scan = m_pBuffer + m_Pitch * row + 3; + uint8_t* src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row; + for (int col = 0; col < m_Width; col++) { + *dest_scan = (*dest_scan) * src_scan[col] / 255; + dest_scan += 4; + } + } + } else { + m_pAlphaMask->MultiplyAlpha(pSrcClone.Get()); + } + } + return true; +} + +bool CFX_DIBitmap::GetGrayData(void* pIccTransform) { + if (!m_pBuffer) { + return false; + } + switch (GetFormat()) { + case FXDIB_1bppRgb: { + if (!m_pPalette) { + return false; + } + uint8_t gray[2]; + for (int i = 0; i < 2; i++) { + int r = static_cast(m_pPalette.get()[i] >> 16); + int g = static_cast(m_pPalette.get()[i] >> 8); + int b = static_cast(m_pPalette.get()[i]); + gray[i] = static_cast(FXRGB2GRAY(r, g, b)); + } + CFX_DIBitmap* pMask = new CFX_DIBitmap; + if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) { + delete pMask; + return false; + } + FXSYS_memset(pMask->GetBuffer(), gray[0], pMask->GetPitch() * m_Height); + for (int row = 0; row < m_Height; row++) { + uint8_t* src_pos = m_pBuffer + row * m_Pitch; + uint8_t* dest_pos = (uint8_t*)pMask->GetScanline(row); + for (int col = 0; col < m_Width; col++) { + if (src_pos[col / 8] & (1 << (7 - col % 8))) { + *dest_pos = gray[1]; + } + dest_pos++; + } + } + TakeOver(pMask); + delete pMask; + break; + } + case FXDIB_8bppRgb: { + if (!m_pPalette) { + return false; + } + uint8_t gray[256]; + for (int i = 0; i < 256; i++) { + int r = static_cast(m_pPalette.get()[i] >> 16); + int g = static_cast(m_pPalette.get()[i] >> 8); + int b = static_cast(m_pPalette.get()[i]); + gray[i] = static_cast(FXRGB2GRAY(r, g, b)); + } + CFX_DIBitmap* pMask = new CFX_DIBitmap; + if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) { + delete pMask; + return false; + } + for (int row = 0; row < m_Height; row++) { + uint8_t* dest_pos = pMask->GetBuffer() + row * pMask->GetPitch(); + uint8_t* src_pos = m_pBuffer + row * m_Pitch; + for (int col = 0; col < m_Width; col++) { + *dest_pos++ = gray[*src_pos++]; + } + } + TakeOver(pMask); + delete pMask; + break; + } + case FXDIB_Rgb: { + CFX_DIBitmap* pMask = new CFX_DIBitmap; + if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) { + delete pMask; + return false; + } + for (int row = 0; row < m_Height; row++) { + uint8_t* src_pos = m_pBuffer + row * m_Pitch; + uint8_t* dest_pos = pMask->GetBuffer() + row * pMask->GetPitch(); + for (int col = 0; col < m_Width; col++) { + *dest_pos++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos); + src_pos += 3; + } + } + TakeOver(pMask); + delete pMask; + break; + } + case FXDIB_Rgb32: { + CFX_DIBitmap* pMask = new CFX_DIBitmap; + if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) { + delete pMask; + return false; + } + for (int row = 0; row < m_Height; row++) { + uint8_t* src_pos = m_pBuffer + row * m_Pitch; + uint8_t* dest_pos = pMask->GetBuffer() + row * pMask->GetPitch(); + for (int col = 0; col < m_Width; col++) { + *dest_pos++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos); + src_pos += 4; + } + } + TakeOver(pMask); + delete pMask; + break; + } + default: + return false; + } + return true; +} + +bool CFX_DIBitmap::MultiplyAlpha(int alpha) { + if (!m_pBuffer) { + return false; + } + switch (GetFormat()) { + case FXDIB_1bppMask: + if (!ConvertFormat(FXDIB_8bppMask)) { + return false; + } + MultiplyAlpha(alpha); + break; + case FXDIB_8bppMask: { + for (int row = 0; row < m_Height; row++) { + uint8_t* scan_line = m_pBuffer + row * m_Pitch; + for (int col = 0; col < m_Width; col++) { + scan_line[col] = scan_line[col] * alpha / 255; + } + } + break; + } + case FXDIB_Argb: { + for (int row = 0; row < m_Height; row++) { + uint8_t* scan_line = m_pBuffer + row * m_Pitch + 3; + for (int col = 0; col < m_Width; col++) { + *scan_line = (*scan_line) * alpha / 255; + scan_line += 4; + } + } + break; + } + default: + if (HasAlpha()) { + m_pAlphaMask->MultiplyAlpha(alpha); + } else if (IsCmykImage()) { + if (!ConvertFormat((FXDIB_Format)(GetFormat() | 0x0200))) { + return false; + } + m_pAlphaMask->MultiplyAlpha(alpha); + } else { + if (!ConvertFormat(FXDIB_Argb)) { + return false; + } + MultiplyAlpha(alpha); + } + break; + } + return true; +} + +uint32_t CFX_DIBitmap::GetPixel(int x, int y) const { + if (!m_pBuffer) { + return 0; + } + uint8_t* pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8; + switch (GetFormat()) { + case FXDIB_1bppMask: { + if ((*pos) & (1 << (7 - x % 8))) { + return 0xff000000; + } + return 0; + } + case FXDIB_1bppRgb: { + if ((*pos) & (1 << (7 - x % 8))) { + return m_pPalette ? m_pPalette.get()[1] : 0xffffffff; + } + return m_pPalette ? m_pPalette.get()[0] : 0xff000000; + } + case FXDIB_8bppMask: + return (*pos) << 24; + case FXDIB_8bppRgb: + return m_pPalette ? m_pPalette.get()[*pos] + : (0xff000000 | ((*pos) * 0x10101)); + case FXDIB_Rgb: + case FXDIB_Rgba: + case FXDIB_Rgb32: + return FXARGB_GETDIB(pos) | 0xff000000; + case FXDIB_Argb: + return FXARGB_GETDIB(pos); + default: + break; + } + return 0; +} + +void CFX_DIBitmap::SetPixel(int x, int y, uint32_t color) { + if (!m_pBuffer) { + return; + } + if (x < 0 || x >= m_Width || y < 0 || y >= m_Height) { + return; + } + uint8_t* pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8; + switch (GetFormat()) { + case FXDIB_1bppMask: + if (color >> 24) { + *pos |= 1 << (7 - x % 8); + } else { + *pos &= ~(1 << (7 - x % 8)); + } + break; + case FXDIB_1bppRgb: + if (m_pPalette) { + if (color == m_pPalette.get()[1]) { + *pos |= 1 << (7 - x % 8); + } else { + *pos &= ~(1 << (7 - x % 8)); + } + } else { + if (color == 0xffffffff) { + *pos |= 1 << (7 - x % 8); + } else { + *pos &= ~(1 << (7 - x % 8)); + } + } + break; + case FXDIB_8bppMask: + *pos = (uint8_t)(color >> 24); + break; + case FXDIB_8bppRgb: { + if (m_pPalette) { + for (int i = 0; i < 256; i++) { + if (m_pPalette.get()[i] == color) { + *pos = (uint8_t)i; + return; + } + } + *pos = 0; + } else { + *pos = FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color)); + } + break; + } + case FXDIB_Rgb: + case FXDIB_Rgb32: { + int alpha = FXARGB_A(color); + pos[0] = (FXARGB_B(color) * alpha + pos[0] * (255 - alpha)) / 255; + pos[1] = (FXARGB_G(color) * alpha + pos[1] * (255 - alpha)) / 255; + pos[2] = (FXARGB_R(color) * alpha + pos[2] * (255 - alpha)) / 255; + break; + } + case FXDIB_Rgba: { + pos[0] = FXARGB_B(color); + pos[1] = FXARGB_G(color); + pos[2] = FXARGB_R(color); + break; + } + case FXDIB_Argb: + FXARGB_SETDIB(pos, color); + break; + default: + break; + } +} + +void CFX_DIBitmap::DownSampleScanline(int line, + uint8_t* dest_scan, + int dest_bpp, + int dest_width, + bool bFlipX, + int clip_left, + int clip_width) const { + if (!m_pBuffer) { + return; + } + int src_Bpp = m_bpp / 8; + uint8_t* scanline = m_pBuffer + line * m_Pitch; + if (src_Bpp == 0) { + for (int i = 0; i < clip_width; i++) { + uint32_t dest_x = clip_left + i; + uint32_t src_x = dest_x * m_Width / dest_width; + if (bFlipX) { + src_x = m_Width - src_x - 1; + } + src_x %= m_Width; + dest_scan[i] = (scanline[src_x / 8] & (1 << (7 - src_x % 8))) ? 255 : 0; + } + } else if (src_Bpp == 1) { + for (int i = 0; i < clip_width; i++) { + uint32_t dest_x = clip_left + i; + uint32_t src_x = dest_x * m_Width / dest_width; + if (bFlipX) { + src_x = m_Width - src_x - 1; + } + src_x %= m_Width; + int dest_pos = i; + if (m_pPalette) { + if (!IsCmykImage()) { + dest_pos *= 3; + FX_ARGB argb = m_pPalette.get()[scanline[src_x]]; + dest_scan[dest_pos] = FXARGB_B(argb); + dest_scan[dest_pos + 1] = FXARGB_G(argb); + dest_scan[dest_pos + 2] = FXARGB_R(argb); + } else { + dest_pos *= 4; + FX_CMYK cmyk = m_pPalette.get()[scanline[src_x]]; + dest_scan[dest_pos] = FXSYS_GetCValue(cmyk); + dest_scan[dest_pos + 1] = FXSYS_GetMValue(cmyk); + dest_scan[dest_pos + 2] = FXSYS_GetYValue(cmyk); + dest_scan[dest_pos + 3] = FXSYS_GetKValue(cmyk); + } + } else { + dest_scan[dest_pos] = scanline[src_x]; + } + } + } else { + for (int i = 0; i < clip_width; i++) { + uint32_t dest_x = clip_left + i; + uint32_t src_x = + bFlipX ? (m_Width - dest_x * m_Width / dest_width - 1) * src_Bpp + : (dest_x * m_Width / dest_width) * src_Bpp; + src_x %= m_Width * src_Bpp; + int dest_pos = i * src_Bpp; + for (int b = 0; b < src_Bpp; b++) { + dest_scan[dest_pos + b] = scanline[src_x + b]; + } + } + } +} + +// TODO(weili): Split this function into two for handling CMYK and RGB +// colors separately. +bool CFX_DIBitmap::ConvertColorScale(uint32_t forecolor, uint32_t backcolor) { + ASSERT(!IsAlphaMask()); + if (!m_pBuffer || IsAlphaMask()) { + return false; + } + // Values used for CMYK colors. + int fc = 0; + int fm = 0; + int fy = 0; + int fk = 0; + int bc = 0; + int bm = 0; + int by = 0; + int bk = 0; + // Values used for RGB colors. + int fr = 0; + int fg = 0; + int fb = 0; + int br = 0; + int bg = 0; + int bb = 0; + bool isCmykImage = IsCmykImage(); + if (isCmykImage) { + fc = FXSYS_GetCValue(forecolor); + fm = FXSYS_GetMValue(forecolor); + fy = FXSYS_GetYValue(forecolor); + fk = FXSYS_GetKValue(forecolor); + bc = FXSYS_GetCValue(backcolor); + bm = FXSYS_GetMValue(backcolor); + by = FXSYS_GetYValue(backcolor); + bk = FXSYS_GetKValue(backcolor); + } else { + fr = FXSYS_GetRValue(forecolor); + fg = FXSYS_GetGValue(forecolor); + fb = FXSYS_GetBValue(forecolor); + br = FXSYS_GetRValue(backcolor); + bg = FXSYS_GetGValue(backcolor); + bb = FXSYS_GetBValue(backcolor); + } + if (m_bpp <= 8) { + if (isCmykImage) { + if (forecolor == 0xff && backcolor == 0 && !m_pPalette) { + return true; + } + } else if (forecolor == 0 && backcolor == 0xffffff && !m_pPalette) { + return true; + } + if (!m_pPalette) { + BuildPalette(); + } + int size = 1 << m_bpp; + if (isCmykImage) { + for (int i = 0; i < size; i++) { + uint8_t b, g, r; + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(m_pPalette.get()[i]), + FXSYS_GetMValue(m_pPalette.get()[i]), + FXSYS_GetYValue(m_pPalette.get()[i]), + FXSYS_GetKValue(m_pPalette.get()[i]), r, g, b); + int gray = 255 - FXRGB2GRAY(r, g, b); + m_pPalette.get()[i] = CmykEncode( + bc + (fc - bc) * gray / 255, bm + (fm - bm) * gray / 255, + by + (fy - by) * gray / 255, bk + (fk - bk) * gray / 255); + } + } else { + for (int i = 0; i < size; i++) { + int gray = FXRGB2GRAY(FXARGB_R(m_pPalette.get()[i]), + FXARGB_G(m_pPalette.get()[i]), + FXARGB_B(m_pPalette.get()[i])); + m_pPalette.get()[i] = FXARGB_MAKE(0xff, br + (fr - br) * gray / 255, + bg + (fg - bg) * gray / 255, + bb + (fb - bb) * gray / 255); + } + } + return true; + } + if (isCmykImage) { + if (forecolor == 0xff && backcolor == 0x00) { + for (int row = 0; row < m_Height; row++) { + uint8_t* scanline = m_pBuffer + row * m_Pitch; + for (int col = 0; col < m_Width; col++) { + uint8_t b, g, r; + AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3], + r, g, b); + *scanline++ = 0; + *scanline++ = 0; + *scanline++ = 0; + *scanline++ = 255 - FXRGB2GRAY(r, g, b); + } + } + return true; + } + } else if (forecolor == 0 && backcolor == 0xffffff) { + for (int row = 0; row < m_Height; row++) { + uint8_t* scanline = m_pBuffer + row * m_Pitch; + int gap = m_bpp / 8 - 2; + for (int col = 0; col < m_Width; col++) { + int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]); + *scanline++ = gray; + *scanline++ = gray; + *scanline = gray; + scanline += gap; + } + } + return true; + } + if (isCmykImage) { + for (int row = 0; row < m_Height; row++) { + uint8_t* scanline = m_pBuffer + row * m_Pitch; + for (int col = 0; col < m_Width; col++) { + uint8_t b, g, r; + AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3], + r, g, b); + int gray = 255 - FXRGB2GRAY(r, g, b); + *scanline++ = bc + (fc - bc) * gray / 255; + *scanline++ = bm + (fm - bm) * gray / 255; + *scanline++ = by + (fy - by) * gray / 255; + *scanline++ = bk + (fk - bk) * gray / 255; + } + } + } else { + for (int row = 0; row < m_Height; row++) { + uint8_t* scanline = m_pBuffer + row * m_Pitch; + int gap = m_bpp / 8 - 2; + for (int col = 0; col < m_Width; col++) { + int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]); + *scanline++ = bb + (fb - bb) * gray / 255; + *scanline++ = bg + (fg - bg) * gray / 255; + *scanline = br + (fr - br) * gray / 255; + scanline += gap; + } + } + } + return true; +} + +std::unique_ptr CFX_DIBSource::FlipImage(bool bXFlip, + bool bYFlip) const { + auto pFlipped = pdfium::MakeUnique(); + if (!pFlipped->Create(m_Width, m_Height, GetFormat())) + return nullptr; + + pFlipped->SetPalette(m_pPalette.get()); + uint8_t* pDestBuffer = pFlipped->GetBuffer(); + int Bpp = m_bpp / 8; + for (int row = 0; row < m_Height; row++) { + const uint8_t* src_scan = GetScanline(row); + uint8_t* dest_scan = + pDestBuffer + m_Pitch * (bYFlip ? (m_Height - row - 1) : row); + if (!bXFlip) { + FXSYS_memcpy(dest_scan, src_scan, m_Pitch); + continue; + } + if (m_bpp == 1) { + FXSYS_memset(dest_scan, 0, m_Pitch); + for (int col = 0; col < m_Width; col++) + if (src_scan[col / 8] & (1 << (7 - col % 8))) { + int dest_col = m_Width - col - 1; + dest_scan[dest_col / 8] |= (1 << (7 - dest_col % 8)); + } + } else { + dest_scan += (m_Width - 1) * Bpp; + if (Bpp == 1) { + for (int col = 0; col < m_Width; col++) { + *dest_scan = *src_scan; + dest_scan--; + src_scan++; + } + } else if (Bpp == 3) { + for (int col = 0; col < m_Width; col++) { + dest_scan[0] = src_scan[0]; + dest_scan[1] = src_scan[1]; + dest_scan[2] = src_scan[2]; + dest_scan -= 3; + src_scan += 3; + } + } else { + ASSERT(Bpp == 4); + for (int col = 0; col < m_Width; col++) { + *(uint32_t*)dest_scan = *(uint32_t*)src_scan; + dest_scan -= 4; + src_scan += 4; + } + } + } + } + if (m_pAlphaMask) { + pDestBuffer = pFlipped->m_pAlphaMask->GetBuffer(); + uint32_t dest_pitch = pFlipped->m_pAlphaMask->GetPitch(); + for (int row = 0; row < m_Height; row++) { + const uint8_t* src_scan = m_pAlphaMask->GetScanline(row); + uint8_t* dest_scan = + pDestBuffer + dest_pitch * (bYFlip ? (m_Height - row - 1) : row); + if (!bXFlip) { + FXSYS_memcpy(dest_scan, src_scan, dest_pitch); + continue; + } + dest_scan += (m_Width - 1); + for (int col = 0; col < m_Width; col++) { + *dest_scan = *src_scan; + dest_scan--; + src_scan++; + } + } + } + return pFlipped; +} + +CFX_DIBExtractor::CFX_DIBExtractor(const CFX_DIBSource* pSrc) { + if (pSrc->GetBuffer()) { + m_pBitmap = pdfium::MakeUnique(); + if (!m_pBitmap->Create(pSrc->GetWidth(), pSrc->GetHeight(), + pSrc->GetFormat(), pSrc->GetBuffer())) { + m_pBitmap.reset(); + return; + } + m_pBitmap->SetPalette(pSrc->GetPalette()); + m_pBitmap->SetAlphaMask(pSrc->m_pAlphaMask); + } else { + m_pBitmap = pSrc->Clone(); + } +} + +CFX_DIBExtractor::~CFX_DIBExtractor() {} + +CFX_FilteredDIB::CFX_FilteredDIB() : m_pSrc(nullptr) {} + +CFX_FilteredDIB::~CFX_FilteredDIB() { + if (m_bAutoDropSrc) { + delete m_pSrc; + } +} + +void CFX_FilteredDIB::LoadSrc(const CFX_DIBSource* pSrc, bool bAutoDropSrc) { + m_pSrc = pSrc; + m_bAutoDropSrc = bAutoDropSrc; + m_Width = pSrc->GetWidth(); + m_Height = pSrc->GetHeight(); + FXDIB_Format format = GetDestFormat(); + m_bpp = (uint8_t)format; + m_AlphaFlag = (uint8_t)(format >> 8); + m_Pitch = (m_Width * (format & 0xff) + 31) / 32 * 4; + m_pPalette.reset(GetDestPalette()); + m_Scanline.resize(m_Pitch); +} + +const uint8_t* CFX_FilteredDIB::GetScanline(int line) const { + TranslateScanline(m_pSrc->GetScanline(line), &m_Scanline); + return m_Scanline.data(); +} + +void CFX_FilteredDIB::DownSampleScanline(int line, + uint8_t* dest_scan, + int dest_bpp, + int dest_width, + bool bFlipX, + int clip_left, + int clip_width) const { + m_pSrc->DownSampleScanline(line, dest_scan, dest_bpp, dest_width, bFlipX, + clip_left, clip_width); + TranslateDownSamples(dest_scan, dest_scan, clip_width, dest_bpp); +} + +CFX_ImageRenderer::CFX_ImageRenderer() { + m_Status = 0; + m_pIccTransform = nullptr; + m_bRgbByteOrder = false; + m_BlendType = FXDIB_BLEND_NORMAL; +} + +CFX_ImageRenderer::~CFX_ImageRenderer() {} + +bool CFX_ImageRenderer::Start(CFX_DIBitmap* pDevice, + const CFX_ClipRgn* pClipRgn, + const CFX_DIBSource* pSource, + int bitmap_alpha, + uint32_t mask_color, + const CFX_Matrix* pMatrix, + uint32_t dib_flags, + bool bRgbByteOrder, + int alpha_flag, + void* pIccTransform, + int blend_type) { + m_Matrix = *pMatrix; + CFX_FloatRect image_rect_f = m_Matrix.GetUnitRect(); + FX_RECT image_rect = image_rect_f.GetOuterRect(); + m_ClipBox = pClipRgn ? pClipRgn->GetBox() : FX_RECT(0, 0, pDevice->GetWidth(), + pDevice->GetHeight()); + m_ClipBox.Intersect(image_rect); + if (m_ClipBox.IsEmpty()) + return false; + + m_pDevice = pDevice; + m_pClipRgn = pClipRgn; + m_MaskColor = mask_color; + m_BitmapAlpha = bitmap_alpha; + m_Matrix = *pMatrix; + m_Flags = dib_flags; + m_AlphaFlag = alpha_flag; + m_pIccTransform = pIccTransform; + m_bRgbByteOrder = bRgbByteOrder; + m_BlendType = blend_type; + + if ((FXSYS_fabs(m_Matrix.b) >= 0.5f || m_Matrix.a == 0) || + (FXSYS_fabs(m_Matrix.c) >= 0.5f || m_Matrix.d == 0)) { + if (FXSYS_fabs(m_Matrix.a) < FXSYS_fabs(m_Matrix.b) / 20 && + FXSYS_fabs(m_Matrix.d) < FXSYS_fabs(m_Matrix.c) / 20 && + FXSYS_fabs(m_Matrix.a) < 0.5f && FXSYS_fabs(m_Matrix.d) < 0.5f) { + int dest_width = image_rect.Width(); + int dest_height = image_rect.Height(); + FX_RECT bitmap_clip = m_ClipBox; + bitmap_clip.Offset(-image_rect.left, -image_rect.top); + bitmap_clip = FXDIB_SwapClipBox(bitmap_clip, dest_width, dest_height, + m_Matrix.c > 0, m_Matrix.b < 0); + m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color, m_ClipBox, + true, m_Matrix.c > 0, m_Matrix.b < 0, m_bRgbByteOrder, + alpha_flag, pIccTransform, m_BlendType); + m_Stretcher = pdfium::MakeUnique( + &m_Composer, pSource, dest_height, dest_width, bitmap_clip, + dib_flags); + if (!m_Stretcher->Start()) + return false; + + m_Status = 1; + return true; + } + m_Status = 2; + m_pTransformer.reset( + new CFX_ImageTransformer(pSource, &m_Matrix, dib_flags, &m_ClipBox)); + m_pTransformer->Start(); + return true; + } + + int dest_width = image_rect.Width(); + if (m_Matrix.a < 0) + dest_width = -dest_width; + + int dest_height = image_rect.Height(); + if (m_Matrix.d > 0) + dest_height = -dest_height; + + if (dest_width == 0 || dest_height == 0) + return false; + + FX_RECT bitmap_clip = m_ClipBox; + bitmap_clip.Offset(-image_rect.left, -image_rect.top); + m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color, m_ClipBox, + false, false, false, m_bRgbByteOrder, alpha_flag, + pIccTransform, m_BlendType); + m_Status = 1; + m_Stretcher = pdfium::MakeUnique( + &m_Composer, pSource, dest_width, dest_height, bitmap_clip, dib_flags); + return m_Stretcher->Start(); +} + +bool CFX_ImageRenderer::Continue(IFX_Pause* pPause) { + if (m_Status == 1) + return m_Stretcher->Continue(pPause); + + if (m_Status == 2) { + if (m_pTransformer->Continue(pPause)) + return true; + + std::unique_ptr pBitmap(m_pTransformer->DetachBitmap()); + if (!pBitmap || !pBitmap->GetBuffer()) + return false; + + if (pBitmap->IsAlphaMask()) { + if (m_BitmapAlpha != 255) { + if (m_AlphaFlag >> 8) { + m_AlphaFlag = + (((uint8_t)((m_AlphaFlag & 0xff) * m_BitmapAlpha / 255)) | + ((m_AlphaFlag >> 8) << 8)); + } else { + m_MaskColor = FXARGB_MUL_ALPHA(m_MaskColor, m_BitmapAlpha); + } + } + m_pDevice->CompositeMask( + m_pTransformer->result().left, m_pTransformer->result().top, + pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap.get(), m_MaskColor, + 0, 0, m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_AlphaFlag, + m_pIccTransform); + } else { + if (m_BitmapAlpha != 255) + pBitmap->MultiplyAlpha(m_BitmapAlpha); + m_pDevice->CompositeBitmap( + m_pTransformer->result().left, m_pTransformer->result().top, + pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap.get(), 0, 0, + m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_pIccTransform); + } + return false; + } + return false; +} + +CFX_BitmapStorer::CFX_BitmapStorer() { +} + +CFX_BitmapStorer::~CFX_BitmapStorer() { +} + +std::unique_ptr CFX_BitmapStorer::Detach() { + return std::move(m_pBitmap); +} + +void CFX_BitmapStorer::Replace(std::unique_ptr pBitmap) { + m_pBitmap = std::move(pBitmap); +} + +void CFX_BitmapStorer::ComposeScanline(int line, + const uint8_t* scanline, + const uint8_t* scan_extra_alpha) { + uint8_t* dest_buf = const_cast(m_pBitmap->GetScanline(line)); + uint8_t* dest_alpha_buf = + m_pBitmap->m_pAlphaMask + ? const_cast(m_pBitmap->m_pAlphaMask->GetScanline(line)) + : nullptr; + if (dest_buf) + FXSYS_memcpy(dest_buf, scanline, m_pBitmap->GetPitch()); + + if (dest_alpha_buf) { + FXSYS_memcpy(dest_alpha_buf, scan_extra_alpha, + m_pBitmap->m_pAlphaMask->GetPitch()); + } +} + +bool CFX_BitmapStorer::SetInfo(int width, + int height, + FXDIB_Format src_format, + uint32_t* pSrcPalette) { + m_pBitmap = pdfium::MakeUnique(); + if (!m_pBitmap->Create(width, height, src_format)) { + m_pBitmap.reset(); + return false; + } + if (pSrcPalette) + m_pBitmap->SetPalette(pSrcPalette); + return true; +} diff --git a/modules/pdfium/pdfium/core/fxge/dib/fx_dib_transform.cpp b/modules/pdfium/pdfium/core/fxge/dib/fx_dib_transform.cpp new file mode 100644 index 000000000000..bd882729413e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/dib/fx_dib_transform.cpp @@ -0,0 +1,963 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/dib/dib_int.h" + +#include +#include + +#include "core/fxge/fx_dib.h" +#include "third_party/base/ptr_util.h" + +namespace { + +uint8_t bilinear_interpol(const uint8_t* buf, + int row_offset_l, + int row_offset_r, + int src_col_l, + int src_col_r, + int res_x, + int res_y, + int bpp, + int c_offset) { + int i_resx = 255 - res_x; + int col_bpp_l = src_col_l * bpp; + int col_bpp_r = src_col_r * bpp; + const uint8_t* buf_u = buf + row_offset_l + c_offset; + const uint8_t* buf_d = buf + row_offset_r + c_offset; + const uint8_t* src_pos0 = buf_u + col_bpp_l; + const uint8_t* src_pos1 = buf_u + col_bpp_r; + const uint8_t* src_pos2 = buf_d + col_bpp_l; + const uint8_t* src_pos3 = buf_d + col_bpp_r; + uint8_t r_pos_0 = (*src_pos0 * i_resx + *src_pos1 * res_x) >> 8; + uint8_t r_pos_1 = (*src_pos2 * i_resx + *src_pos3 * res_x) >> 8; + return (r_pos_0 * (255 - res_y) + r_pos_1 * res_y) >> 8; +} + +uint8_t bicubic_interpol(const uint8_t* buf, + int pitch, + int pos_pixel[], + int u_w[], + int v_w[], + int res_x, + int res_y, + int bpp, + int c_offset) { + int s_result = 0; + for (int i = 0; i < 4; i++) { + int a_result = 0; + for (int j = 0; j < 4; j++) { + a_result += u_w[j] * (*(uint8_t*)(buf + pos_pixel[i + 4] * pitch + + pos_pixel[j] * bpp + c_offset)); + } + s_result += a_result * v_w[i]; + } + s_result >>= 16; + return (uint8_t)(s_result < 0 ? 0 : s_result > 255 ? 255 : s_result); +} + +void bicubic_get_pos_weight(int pos_pixel[], + int u_w[], + int v_w[], + int src_col_l, + int src_row_l, + int res_x, + int res_y, + int stretch_width, + int stretch_height) { + pos_pixel[0] = src_col_l - 1; + pos_pixel[1] = src_col_l; + pos_pixel[2] = src_col_l + 1; + pos_pixel[3] = src_col_l + 2; + pos_pixel[4] = src_row_l - 1; + pos_pixel[5] = src_row_l; + pos_pixel[6] = src_row_l + 1; + pos_pixel[7] = src_row_l + 2; + for (int i = 0; i < 4; i++) { + if (pos_pixel[i] < 0) { + pos_pixel[i] = 0; + } + if (pos_pixel[i] >= stretch_width) { + pos_pixel[i] = stretch_width - 1; + } + if (pos_pixel[i + 4] < 0) { + pos_pixel[i + 4] = 0; + } + if (pos_pixel[i + 4] >= stretch_height) { + pos_pixel[i + 4] = stretch_height - 1; + } + } + u_w[0] = SDP_Table[256 + res_x]; + u_w[1] = SDP_Table[res_x]; + u_w[2] = SDP_Table[256 - res_x]; + u_w[3] = SDP_Table[512 - res_x]; + v_w[0] = SDP_Table[256 + res_y]; + v_w[1] = SDP_Table[res_y]; + v_w[2] = SDP_Table[256 - res_y]; + v_w[3] = SDP_Table[512 - res_y]; +} + +FXDIB_Format GetTransformedFormat(const CFX_DIBSource* pDrc) { + FXDIB_Format format = pDrc->GetFormat(); + if (pDrc->IsAlphaMask()) { + format = FXDIB_8bppMask; + } else if (format >= 1025) { + format = FXDIB_Cmyka; + } else if (format <= 32 || format == FXDIB_Argb) { + format = FXDIB_Argb; + } else { + format = FXDIB_Rgba; + } + return format; +} + +} // namespace + +const int16_t SDP_Table[513] = { + 256, 256, 256, 256, 256, 256, 256, 256, 256, 255, 255, 255, 255, 255, 255, + 254, 254, 254, 254, 253, 253, 253, 252, 252, 252, 251, 251, 251, 250, 250, + 249, 249, 249, 248, 248, 247, 247, 246, 246, 245, 244, 244, 243, 243, 242, + 242, 241, 240, 240, 239, 238, 238, 237, 236, 236, 235, 234, 233, 233, 232, + 231, 230, 230, 229, 228, 227, 226, 226, 225, 224, 223, 222, 221, 220, 219, + 218, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, + 204, 203, 202, 201, 200, 199, 198, 196, 195, 194, 193, 192, 191, 190, 189, + 188, 186, 185, 184, 183, 182, 181, 179, 178, 177, 176, 175, 173, 172, 171, + 170, 169, 167, 166, 165, 164, 162, 161, 160, 159, 157, 156, 155, 154, 152, + 151, 150, 149, 147, 146, 145, 143, 142, 141, 140, 138, 137, 136, 134, 133, + 132, 130, 129, 128, 126, 125, 124, 122, 121, 120, 119, 117, 116, 115, 113, + 112, 111, 109, 108, 107, 105, 104, 103, 101, 100, 99, 97, 96, 95, 93, + 92, 91, 89, 88, 87, 85, 84, 83, 81, 80, 79, 77, 76, 75, 73, + 72, 71, 69, 68, 67, 66, 64, 63, 62, 60, 59, 58, 57, 55, 54, + 53, 52, 50, 49, 48, 47, 45, 44, 43, 42, 40, 39, 38, 37, 36, + 34, 33, 32, 31, 30, 28, 27, 26, 25, 24, 23, 21, 20, 19, 18, + 17, 16, 15, 14, 13, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, + 1, 0, 0, -1, -2, -3, -4, -5, -6, -7, -7, -8, -9, -10, -11, + -12, -12, -13, -14, -15, -15, -16, -17, -17, -18, -19, -19, -20, -21, -21, + -22, -22, -23, -24, -24, -25, -25, -26, -26, -27, -27, -27, -28, -28, -29, + -29, -30, -30, -30, -31, -31, -31, -32, -32, -32, -33, -33, -33, -33, -34, + -34, -34, -34, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, + -37, -37, -37, -37, -37, -37, -37, -37, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -35, -35, -35, -35, -35, -35, -34, -34, -34, -34, -34, -33, -33, + -33, -33, -33, -32, -32, -32, -32, -31, -31, -31, -31, -30, -30, -30, -30, + -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -27, -26, -26, -26, -25, + -25, -25, -24, -24, -24, -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, + -20, -20, -20, -19, -19, -19, -18, -18, -18, -17, -17, -17, -16, -16, -16, + -15, -15, -15, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11, -11, + -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -7, -7, -6, + -6, -6, -6, -5, -5, -5, -5, -4, -4, -4, -4, -3, -3, -3, -3, + -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; + +class CFX_BilinearMatrix : public CPDF_FixedMatrix { + public: + CFX_BilinearMatrix(const CFX_Matrix& src, int bits) + : CPDF_FixedMatrix(src, bits) {} + inline void Transform(int x, + int y, + int& x1, + int& y1, + int& res_x, + int& res_y) { + x1 = a * x + c * y + e + base / 2; + y1 = b * x + d * y + f + base / 2; + res_x = x1 % base; + res_y = y1 % base; + if (res_x < 0 && res_x > -base) { + res_x = base + res_x; + } + if (res_y < 0 && res_x > -base) { + res_y = base + res_y; + } + x1 /= base; + y1 /= base; + } +}; + +std::unique_ptr CFX_DIBSource::SwapXY( + bool bXFlip, + bool bYFlip, + const FX_RECT* pDestClip) const { + FX_RECT dest_clip(0, 0, m_Height, m_Width); + if (pDestClip) + dest_clip.Intersect(*pDestClip); + if (dest_clip.IsEmpty()) + return nullptr; + + auto pTransBitmap = pdfium::MakeUnique(); + int result_height = dest_clip.Height(); + int result_width = dest_clip.Width(); + if (!pTransBitmap->Create(result_width, result_height, GetFormat())) + return nullptr; + + pTransBitmap->SetPalette(m_pPalette.get()); + int dest_pitch = pTransBitmap->GetPitch(); + uint8_t* dest_buf = pTransBitmap->GetBuffer(); + int row_start = bXFlip ? m_Height - dest_clip.right : dest_clip.left; + int row_end = bXFlip ? m_Height - dest_clip.left : dest_clip.right; + int col_start = bYFlip ? m_Width - dest_clip.bottom : dest_clip.top; + int col_end = bYFlip ? m_Width - dest_clip.top : dest_clip.bottom; + if (GetBPP() == 1) { + FXSYS_memset(dest_buf, 0xff, dest_pitch * result_height); + for (int row = row_start; row < row_end; row++) { + const uint8_t* src_scan = GetScanline(row); + int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - + dest_clip.left; + uint8_t* dest_scan = dest_buf; + if (bYFlip) { + dest_scan += (result_height - 1) * dest_pitch; + } + int dest_step = bYFlip ? -dest_pitch : dest_pitch; + for (int col = col_start; col < col_end; col++) { + if (!(src_scan[col / 8] & (1 << (7 - col % 8)))) { + dest_scan[dest_col / 8] &= ~(1 << (7 - dest_col % 8)); + } + dest_scan += dest_step; + } + } + } else { + int nBytes = GetBPP() / 8; + int dest_step = bYFlip ? -dest_pitch : dest_pitch; + if (nBytes == 3) { + dest_step -= 2; + } + for (int row = row_start; row < row_end; row++) { + int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - + dest_clip.left; + uint8_t* dest_scan = dest_buf + dest_col * nBytes; + if (bYFlip) { + dest_scan += (result_height - 1) * dest_pitch; + } + if (nBytes == 4) { + uint32_t* src_scan = (uint32_t*)GetScanline(row) + col_start; + for (int col = col_start; col < col_end; col++) { + *(uint32_t*)dest_scan = *src_scan++; + dest_scan += dest_step; + } + } else { + const uint8_t* src_scan = GetScanline(row) + col_start * nBytes; + if (nBytes == 1) { + for (int col = col_start; col < col_end; col++) { + *dest_scan = *src_scan++; + dest_scan += dest_step; + } + } else { + for (int col = col_start; col < col_end; col++) { + *dest_scan++ = *src_scan++; + *dest_scan++ = *src_scan++; + *dest_scan = *src_scan++; + dest_scan += dest_step; + } + } + } + } + } + if (m_pAlphaMask) { + dest_pitch = pTransBitmap->m_pAlphaMask->GetPitch(); + dest_buf = pTransBitmap->m_pAlphaMask->GetBuffer(); + int dest_step = bYFlip ? -dest_pitch : dest_pitch; + for (int row = row_start; row < row_end; row++) { + int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - + dest_clip.left; + uint8_t* dest_scan = dest_buf + dest_col; + if (bYFlip) { + dest_scan += (result_height - 1) * dest_pitch; + } + const uint8_t* src_scan = m_pAlphaMask->GetScanline(row) + col_start; + for (int col = col_start; col < col_end; col++) { + *dest_scan = *src_scan++; + dest_scan += dest_step; + } + } + } + return pTransBitmap; +} + +#define FIX16_005 0.05f +FX_RECT FXDIB_SwapClipBox(FX_RECT& clip, + int width, + int height, + bool bFlipX, + bool bFlipY) { + FX_RECT rect; + if (bFlipY) { + rect.left = height - clip.top; + rect.right = height - clip.bottom; + } else { + rect.left = clip.top; + rect.right = clip.bottom; + } + if (bFlipX) { + rect.top = width - clip.left; + rect.bottom = width - clip.right; + } else { + rect.top = clip.left; + rect.bottom = clip.right; + } + rect.Normalize(); + return rect; +} + +std::unique_ptr CFX_DIBSource::TransformTo( + const CFX_Matrix* pDestMatrix, + int& result_left, + int& result_top, + uint32_t flags, + const FX_RECT* pDestClip) const { + CFX_ImageTransformer transformer(this, pDestMatrix, flags, pDestClip); + transformer.Start(); + transformer.Continue(nullptr); + result_left = transformer.result().left; + result_top = transformer.result().top; + return transformer.DetachBitmap(); +} + +std::unique_ptr CFX_DIBSource::StretchTo( + int dest_width, + int dest_height, + uint32_t flags, + const FX_RECT* pClip) const { + FX_RECT clip_rect(0, 0, FXSYS_abs(dest_width), FXSYS_abs(dest_height)); + if (pClip) + clip_rect.Intersect(*pClip); + + if (clip_rect.IsEmpty()) + return nullptr; + + if (dest_width == m_Width && dest_height == m_Height) + return Clone(&clip_rect); + + CFX_BitmapStorer storer; + CFX_ImageStretcher stretcher(&storer, this, dest_width, dest_height, + clip_rect, flags); + if (stretcher.Start()) + stretcher.Continue(nullptr); + + return storer.Detach(); +} + +CFX_ImageTransformer::CFX_ImageTransformer(const CFX_DIBSource* pSrc, + const CFX_Matrix* pMatrix, + int flags, + const FX_RECT* pClip) + : m_pSrc(pSrc), + m_pMatrix(pMatrix), + m_pClip(pClip), + m_Flags(flags), + m_Status(0) {} + +CFX_ImageTransformer::~CFX_ImageTransformer() {} + +bool CFX_ImageTransformer::Start() { + CFX_FloatRect unit_rect = m_pMatrix->GetUnitRect(); + FX_RECT result_rect = unit_rect.GetClosestRect(); + FX_RECT result_clip = result_rect; + if (m_pClip) + result_clip.Intersect(*m_pClip); + + if (result_clip.IsEmpty()) + return false; + + m_result = result_clip; + if (FXSYS_fabs(m_pMatrix->a) < FXSYS_fabs(m_pMatrix->b) / 20 && + FXSYS_fabs(m_pMatrix->d) < FXSYS_fabs(m_pMatrix->c) / 20 && + FXSYS_fabs(m_pMatrix->a) < 0.5f && FXSYS_fabs(m_pMatrix->d) < 0.5f) { + int dest_width = result_rect.Width(); + int dest_height = result_rect.Height(); + result_clip.Offset(-result_rect.left, -result_rect.top); + result_clip = FXDIB_SwapClipBox(result_clip, dest_width, dest_height, + m_pMatrix->c > 0, m_pMatrix->b < 0); + m_Stretcher = pdfium::MakeUnique( + &m_Storer, m_pSrc, dest_height, dest_width, result_clip, m_Flags); + m_Stretcher->Start(); + m_Status = 1; + return true; + } + if (FXSYS_fabs(m_pMatrix->b) < FIX16_005 && + FXSYS_fabs(m_pMatrix->c) < FIX16_005) { + int dest_width = m_pMatrix->a > 0 ? (int)FXSYS_ceil(m_pMatrix->a) + : (int)FXSYS_floor(m_pMatrix->a); + int dest_height = m_pMatrix->d > 0 ? (int)-FXSYS_ceil(m_pMatrix->d) + : (int)-FXSYS_floor(m_pMatrix->d); + result_clip.Offset(-result_rect.left, -result_rect.top); + m_Stretcher = pdfium::MakeUnique( + &m_Storer, m_pSrc, dest_width, dest_height, result_clip, m_Flags); + m_Stretcher->Start(); + m_Status = 2; + return true; + } + int stretch_width = (int)FXSYS_ceil(FXSYS_sqrt2(m_pMatrix->a, m_pMatrix->b)); + int stretch_height = (int)FXSYS_ceil(FXSYS_sqrt2(m_pMatrix->c, m_pMatrix->d)); + CFX_Matrix stretch2dest(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, + (FX_FLOAT)(stretch_height)); + stretch2dest.Concat( + CFX_Matrix(m_pMatrix->a / stretch_width, m_pMatrix->b / stretch_width, + m_pMatrix->c / stretch_height, m_pMatrix->d / stretch_height, + m_pMatrix->e, m_pMatrix->f)); + m_dest2stretch.SetReverse(stretch2dest); + + CFX_FloatRect clip_rect_f(result_clip); + m_dest2stretch.TransformRect(clip_rect_f); + m_StretchClip = clip_rect_f.GetOuterRect(); + m_StretchClip.Intersect(0, 0, stretch_width, stretch_height); + m_Stretcher = pdfium::MakeUnique( + &m_Storer, m_pSrc, stretch_width, stretch_height, m_StretchClip, m_Flags); + m_Stretcher->Start(); + m_Status = 3; + return true; +} + +bool CFX_ImageTransformer::Continue(IFX_Pause* pPause) { + if (m_Status == 1) { + if (m_Stretcher->Continue(pPause)) + return true; + + if (m_Storer.GetBitmap()) { + m_Storer.Replace( + m_Storer.GetBitmap()->SwapXY(m_pMatrix->c > 0, m_pMatrix->b < 0)); + } + return false; + } + + if (m_Status == 2) + return m_Stretcher->Continue(pPause); + + if (m_Status != 3) + return false; + + if (m_Stretcher->Continue(pPause)) + return true; + + int stretch_width = m_StretchClip.Width(); + int stretch_height = m_StretchClip.Height(); + if (!m_Storer.GetBitmap()) + return false; + + const uint8_t* stretch_buf = m_Storer.GetBitmap()->GetBuffer(); + const uint8_t* stretch_buf_mask = nullptr; + if (m_Storer.GetBitmap()->m_pAlphaMask) + stretch_buf_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetBuffer(); + + int stretch_pitch = m_Storer.GetBitmap()->GetPitch(); + std::unique_ptr pTransformed(new CFX_DIBitmap); + FXDIB_Format transformF = GetTransformedFormat(m_Stretcher->source()); + if (!pTransformed->Create(m_result.Width(), m_result.Height(), transformF)) + return false; + + pTransformed->Clear(0); + if (pTransformed->m_pAlphaMask) + pTransformed->m_pAlphaMask->Clear(0); + + CFX_Matrix result2stretch(1.0f, 0.0f, 0.0f, 1.0f, (FX_FLOAT)(m_result.left), + (FX_FLOAT)(m_result.top)); + result2stretch.Concat(m_dest2stretch); + result2stretch.Translate(-m_StretchClip.left, -m_StretchClip.top); + if (!stretch_buf_mask && pTransformed->m_pAlphaMask) { + pTransformed->m_pAlphaMask->Clear(0xff000000); + } else if (pTransformed->m_pAlphaMask) { + int stretch_pitch_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetPitch(); + if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { + CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); + for (int row = 0; row < m_result.Height(); row++) { + uint8_t* dest_pos_mask = + (uint8_t*)pTransformed->m_pAlphaMask->GetScanline(row); + for (int col = 0; col < m_result.Width(); col++) { + int src_col_l, src_row_l, res_x, res_y; + result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, + res_y); + if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && + src_row_l <= stretch_height) { + if (src_col_l == stretch_width) { + src_col_l--; + } + if (src_row_l == stretch_height) { + src_row_l--; + } + int src_col_r = src_col_l + 1; + int src_row_r = src_row_l + 1; + if (src_col_r == stretch_width) { + src_col_r--; + } + if (src_row_r == stretch_height) { + src_row_r--; + } + int row_offset_l = src_row_l * stretch_pitch_mask; + int row_offset_r = src_row_r * stretch_pitch_mask; + *dest_pos_mask = + bilinear_interpol(stretch_buf_mask, row_offset_l, row_offset_r, + src_col_l, src_col_r, res_x, res_y, 1, 0); + } + dest_pos_mask++; + } + } + } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); + for (int row = 0; row < m_result.Height(); row++) { + uint8_t* dest_pos_mask = + (uint8_t*)pTransformed->m_pAlphaMask->GetScanline(row); + for (int col = 0; col < m_result.Width(); col++) { + int src_col_l, src_row_l, res_x, res_y; + result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, + res_y); + if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && + src_row_l <= stretch_height) { + int pos_pixel[8]; + int u_w[4], v_w[4]; + if (src_col_l == stretch_width) { + src_col_l--; + } + if (src_row_l == stretch_height) { + src_row_l--; + } + bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, + res_x, res_y, stretch_width, stretch_height); + *dest_pos_mask = + bicubic_interpol(stretch_buf_mask, stretch_pitch_mask, + pos_pixel, u_w, v_w, res_x, res_y, 1, 0); + } + dest_pos_mask++; + } + } + } else { + CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); + for (int row = 0; row < m_result.Height(); row++) { + uint8_t* dest_pos_mask = + (uint8_t*)pTransformed->m_pAlphaMask->GetScanline(row); + for (int col = 0; col < m_result.Width(); col++) { + int src_col, src_row; + result2stretch_fix.Transform(col, row, src_col, src_row); + if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && + src_row <= stretch_height) { + if (src_col == stretch_width) { + src_col--; + } + if (src_row == stretch_height) { + src_row--; + } + *dest_pos_mask = + stretch_buf_mask[src_row * stretch_pitch_mask + src_col]; + } + dest_pos_mask++; + } + } + } + } + if (m_Storer.GetBitmap()->IsAlphaMask()) { + if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { + CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); + for (int row = 0; row < m_result.Height(); row++) { + uint8_t* dest_scan = (uint8_t*)pTransformed->GetScanline(row); + for (int col = 0; col < m_result.Width(); col++) { + int src_col_l, src_row_l, res_x, res_y; + result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, + res_y); + if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && + src_row_l <= stretch_height) { + if (src_col_l == stretch_width) { + src_col_l--; + } + if (src_row_l == stretch_height) { + src_row_l--; + } + int src_col_r = src_col_l + 1; + int src_row_r = src_row_l + 1; + if (src_col_r == stretch_width) { + src_col_r--; + } + if (src_row_r == stretch_height) { + src_row_r--; + } + int row_offset_l = src_row_l * stretch_pitch; + int row_offset_r = src_row_r * stretch_pitch; + *dest_scan = + bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, + src_col_l, src_col_r, res_x, res_y, 1, 0); + } + dest_scan++; + } + } + } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); + for (int row = 0; row < m_result.Height(); row++) { + uint8_t* dest_scan = (uint8_t*)pTransformed->GetScanline(row); + for (int col = 0; col < m_result.Width(); col++) { + int src_col_l, src_row_l, res_x, res_y; + result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, + res_y); + if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && + src_row_l <= stretch_height) { + int pos_pixel[8]; + int u_w[4], v_w[4]; + if (src_col_l == stretch_width) { + src_col_l--; + } + if (src_row_l == stretch_height) { + src_row_l--; + } + bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, + res_x, res_y, stretch_width, stretch_height); + *dest_scan = bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, + u_w, v_w, res_x, res_y, 1, 0); + } + dest_scan++; + } + } + } else { + CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); + for (int row = 0; row < m_result.Height(); row++) { + uint8_t* dest_scan = (uint8_t*)pTransformed->GetScanline(row); + for (int col = 0; col < m_result.Width(); col++) { + int src_col, src_row; + result2stretch_fix.Transform(col, row, src_col, src_row); + if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && + src_row <= stretch_height) { + if (src_col == stretch_width) { + src_col--; + } + if (src_row == stretch_height) { + src_row--; + } + const uint8_t* src_pixel = + stretch_buf + stretch_pitch * src_row + src_col; + *dest_scan = *src_pixel; + } + dest_scan++; + } + } + } + } else { + int Bpp = m_Storer.GetBitmap()->GetBPP() / 8; + if (Bpp == 1) { + uint32_t argb[256]; + FX_ARGB* pPal = m_Storer.GetBitmap()->GetPalette(); + if (pPal) { + for (int i = 0; i < 256; i++) { + argb[i] = pPal[i]; + } + } else { + if (m_Storer.GetBitmap()->IsCmykImage()) { + for (int i = 0; i < 256; i++) { + argb[i] = 255 - i; + } + } else { + for (int i = 0; i < 256; i++) { + argb[i] = 0xff000000 | (i * 0x010101); + } + } + } + int destBpp = pTransformed->GetBPP() / 8; + if (!(m_Flags & FXDIB_DOWNSAMPLE) && + !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { + CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); + for (int row = 0; row < m_result.Height(); row++) { + uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); + for (int col = 0; col < m_result.Width(); col++) { + int src_col_l, src_row_l, res_x, res_y; + result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, + res_y); + if (src_col_l >= 0 && src_col_l <= stretch_width && + src_row_l >= 0 && src_row_l <= stretch_height) { + if (src_col_l == stretch_width) { + src_col_l--; + } + if (src_row_l == stretch_height) { + src_row_l--; + } + int src_col_r = src_col_l + 1; + int src_row_r = src_row_l + 1; + if (src_col_r == stretch_width) { + src_col_r--; + } + if (src_row_r == stretch_height) { + src_row_r--; + } + int row_offset_l = src_row_l * stretch_pitch; + int row_offset_r = src_row_r * stretch_pitch; + uint32_t r_bgra_cmyk = argb[bilinear_interpol( + stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, + res_x, res_y, 1, 0)]; + if (transformF == FXDIB_Rgba) { + dest_pos[0] = (uint8_t)(r_bgra_cmyk >> 24); + dest_pos[1] = (uint8_t)(r_bgra_cmyk >> 16); + dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8); + } else { + *(uint32_t*)dest_pos = r_bgra_cmyk; + } + } + dest_pos += destBpp; + } + } + } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); + for (int row = 0; row < m_result.Height(); row++) { + uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); + for (int col = 0; col < m_result.Width(); col++) { + int src_col_l, src_row_l, res_x, res_y; + result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, + res_y); + if (src_col_l >= 0 && src_col_l <= stretch_width && + src_row_l >= 0 && src_row_l <= stretch_height) { + int pos_pixel[8]; + int u_w[4], v_w[4]; + if (src_col_l == stretch_width) { + src_col_l--; + } + if (src_row_l == stretch_height) { + src_row_l--; + } + bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, + res_x, res_y, stretch_width, + stretch_height); + uint32_t r_bgra_cmyk = + argb[bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, + u_w, v_w, res_x, res_y, 1, 0)]; + if (transformF == FXDIB_Rgba) { + dest_pos[0] = (uint8_t)(r_bgra_cmyk >> 24); + dest_pos[1] = (uint8_t)(r_bgra_cmyk >> 16); + dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8); + } else { + *(uint32_t*)dest_pos = r_bgra_cmyk; + } + } + dest_pos += destBpp; + } + } + } else { + CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); + for (int row = 0; row < m_result.Height(); row++) { + uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); + for (int col = 0; col < m_result.Width(); col++) { + int src_col, src_row; + result2stretch_fix.Transform(col, row, src_col, src_row); + if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && + src_row <= stretch_height) { + if (src_col == stretch_width) { + src_col--; + } + if (src_row == stretch_height) { + src_row--; + } + uint32_t r_bgra_cmyk = + argb[stretch_buf[src_row * stretch_pitch + src_col]]; + if (transformF == FXDIB_Rgba) { + dest_pos[0] = (uint8_t)(r_bgra_cmyk >> 24); + dest_pos[1] = (uint8_t)(r_bgra_cmyk >> 16); + dest_pos[2] = (uint8_t)(r_bgra_cmyk >> 8); + } else { + *(uint32_t*)dest_pos = r_bgra_cmyk; + } + } + dest_pos += destBpp; + } + } + } + } else { + bool bHasAlpha = m_Storer.GetBitmap()->HasAlpha(); + int destBpp = pTransformed->GetBPP() / 8; + if (!(m_Flags & FXDIB_DOWNSAMPLE) && + !(m_Flags & FXDIB_BICUBIC_INTERPOL)) { + CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); + for (int row = 0; row < m_result.Height(); row++) { + uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); + for (int col = 0; col < m_result.Width(); col++) { + int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0; + result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, + res_y); + if (src_col_l >= 0 && src_col_l <= stretch_width && + src_row_l >= 0 && src_row_l <= stretch_height) { + if (src_col_l == stretch_width) { + src_col_l--; + } + if (src_row_l == stretch_height) { + src_row_l--; + } + int src_col_r = src_col_l + 1; + int src_row_r = src_row_l + 1; + if (src_col_r == stretch_width) { + src_col_r--; + } + if (src_row_r == stretch_height) { + src_row_r--; + } + int row_offset_l = src_row_l * stretch_pitch; + int row_offset_r = src_row_r * stretch_pitch; + uint8_t r_pos_red_y_r = + bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, + src_col_l, src_col_r, res_x, res_y, Bpp, 2); + uint8_t r_pos_green_m_r = + bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, + src_col_l, src_col_r, res_x, res_y, Bpp, 1); + uint8_t r_pos_blue_c_r = + bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, + src_col_l, src_col_r, res_x, res_y, Bpp, 0); + if (bHasAlpha) { + if (transformF != FXDIB_Argb) { + if (transformF == FXDIB_Rgba) { + dest_pos[0] = r_pos_blue_c_r; + dest_pos[1] = r_pos_green_m_r; + dest_pos[2] = r_pos_red_y_r; + } else { + r_pos_k_r = bilinear_interpol( + stretch_buf, row_offset_l, row_offset_r, src_col_l, + src_col_r, res_x, res_y, Bpp, 3); + *(uint32_t*)dest_pos = + FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, + r_pos_red_y_r, r_pos_k_r)); + } + } else { + uint8_t r_pos_a_r = bilinear_interpol( + stretch_buf, row_offset_l, row_offset_r, src_col_l, + src_col_r, res_x, res_y, Bpp, 3); + *(uint32_t*)dest_pos = FXARGB_TODIB( + FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, + r_pos_blue_c_r)); + } + } else { + r_pos_k_r = 0xff; + if (transformF == FXDIB_Cmyka) { + r_pos_k_r = bilinear_interpol( + stretch_buf, row_offset_l, row_offset_r, src_col_l, + src_col_r, res_x, res_y, Bpp, 3); + *(uint32_t*)dest_pos = + FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, + r_pos_red_y_r, r_pos_k_r)); + } else { + *(uint32_t*)dest_pos = FXARGB_TODIB( + FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, + r_pos_blue_c_r)); + } + } + } + dest_pos += destBpp; + } + } + } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) { + CFX_BilinearMatrix result2stretch_fix(result2stretch, 8); + for (int row = 0; row < m_result.Height(); row++) { + uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); + for (int col = 0; col < m_result.Width(); col++) { + int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0; + result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, + res_y); + if (src_col_l >= 0 && src_col_l <= stretch_width && + src_row_l >= 0 && src_row_l <= stretch_height) { + int pos_pixel[8]; + int u_w[4], v_w[4]; + if (src_col_l == stretch_width) { + src_col_l--; + } + if (src_row_l == stretch_height) { + src_row_l--; + } + bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, + res_x, res_y, stretch_width, + stretch_height); + uint8_t r_pos_red_y_r = + bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, + v_w, res_x, res_y, Bpp, 2); + uint8_t r_pos_green_m_r = + bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, + v_w, res_x, res_y, Bpp, 1); + uint8_t r_pos_blue_c_r = + bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, + v_w, res_x, res_y, Bpp, 0); + if (bHasAlpha) { + if (transformF != FXDIB_Argb) { + if (transformF == FXDIB_Rgba) { + dest_pos[0] = r_pos_blue_c_r; + dest_pos[1] = r_pos_green_m_r; + dest_pos[2] = r_pos_red_y_r; + } else { + r_pos_k_r = + bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, + u_w, v_w, res_x, res_y, Bpp, 3); + *(uint32_t*)dest_pos = + FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, + r_pos_red_y_r, r_pos_k_r)); + } + } else { + uint8_t r_pos_a_r = + bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, + u_w, v_w, res_x, res_y, Bpp, 3); + *(uint32_t*)dest_pos = FXARGB_TODIB( + FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, + r_pos_blue_c_r)); + } + } else { + r_pos_k_r = 0xff; + if (transformF == FXDIB_Cmyka) { + r_pos_k_r = + bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, + u_w, v_w, res_x, res_y, Bpp, 3); + *(uint32_t*)dest_pos = + FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, + r_pos_red_y_r, r_pos_k_r)); + } else { + *(uint32_t*)dest_pos = FXARGB_TODIB( + FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, + r_pos_blue_c_r)); + } + } + } + dest_pos += destBpp; + } + } + } else { + CPDF_FixedMatrix result2stretch_fix(result2stretch, 8); + for (int row = 0; row < m_result.Height(); row++) { + uint8_t* dest_pos = (uint8_t*)pTransformed->GetScanline(row); + for (int col = 0; col < m_result.Width(); col++) { + int src_col, src_row; + result2stretch_fix.Transform(col, row, src_col, src_row); + if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && + src_row <= stretch_height) { + if (src_col == stretch_width) { + src_col--; + } + if (src_row == stretch_height) { + src_row--; + } + const uint8_t* src_pos = + stretch_buf + src_row * stretch_pitch + src_col * Bpp; + if (bHasAlpha) { + if (transformF != FXDIB_Argb) { + if (transformF == FXDIB_Rgba) { + dest_pos[0] = src_pos[0]; + dest_pos[1] = src_pos[1]; + dest_pos[2] = src_pos[2]; + } else { + *(uint32_t*)dest_pos = FXCMYK_TODIB(CmykEncode( + src_pos[0], src_pos[1], src_pos[2], src_pos[3])); + } + } else { + *(uint32_t*)dest_pos = FXARGB_TODIB(FXARGB_MAKE( + src_pos[3], src_pos[2], src_pos[1], src_pos[0])); + } + } else { + if (transformF == FXDIB_Cmyka) { + *(uint32_t*)dest_pos = FXCMYK_TODIB(CmykEncode( + src_pos[0], src_pos[1], src_pos[2], src_pos[3])); + } else { + *(uint32_t*)dest_pos = FXARGB_TODIB( + FXARGB_MAKE(0xff, src_pos[2], src_pos[1], src_pos[0])); + } + } + } + dest_pos += destBpp; + } + } + } + } + } + m_Storer.Replace(std::move(pTransformed)); + return false; +} + +std::unique_ptr CFX_ImageTransformer::DetachBitmap() { + return m_Storer.Detach(); +} diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitDingbats.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitDingbats.cpp new file mode 100644 index 000000000000..75088cef5d81 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitDingbats.cpp @@ -0,0 +1,2469 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitDingbatsFontData[29513] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x11, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x44, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x74, 0x73, 0x4f, 0x54, + 0x46, 0x0, 0x1, 0x1, 0x1, 0x25, 0xf8, 0x10, 0x0, 0xf8, 0xe4, 0x1, + 0xf8, 0xe5, 0x2, 0xf8, 0xe5, 0x3, 0xf8, 0xe6, 0x4, 0x8a, 0xfb, 0x38, + 0xfa, 0x69, 0xf9, 0xce, 0x5, 0x1c, 0x4, 0xdc, 0xf, 0x1c, 0x4, 0xe3, + 0x11, 0xa7, 0x1c, 0x6e, 0x3f, 0x12, 0x0, 0xcc, 0x2, 0x0, 0x1, 0x0, + 0x3, 0x0, 0x6, 0x0, 0xa, 0x0, 0xe, 0x0, 0x12, 0x0, 0x16, 0x0, + 0x1a, 0x0, 0x1e, 0x0, 0x22, 0x0, 0x26, 0x0, 0x2a, 0x0, 0x2e, 0x0, + 0x31, 0x0, 0x35, 0x0, 0x39, 0x0, 0x3d, 0x0, 0x41, 0x0, 0x45, 0x0, + 0x49, 0x0, 0x4c, 0x0, 0x50, 0x0, 0x54, 0x0, 0x58, 0x0, 0x5c, 0x0, + 0x60, 0x0, 0x64, 0x0, 0x68, 0x0, 0x6c, 0x0, 0x70, 0x0, 0x74, 0x0, + 0x77, 0x0, 0x7b, 0x0, 0x7f, 0x0, 0x83, 0x0, 0x87, 0x0, 0x8b, 0x0, + 0x8f, 0x0, 0x93, 0x0, 0x97, 0x0, 0x9b, 0x0, 0x9f, 0x0, 0xa2, 0x0, + 0xa6, 0x0, 0xaa, 0x0, 0xae, 0x0, 0xb2, 0x0, 0xb6, 0x0, 0xba, 0x0, + 0xbe, 0x0, 0xc2, 0x0, 0xc6, 0x0, 0xca, 0x0, 0xcd, 0x0, 0xd1, 0x0, + 0xd5, 0x0, 0xd9, 0x0, 0xdd, 0x0, 0xe1, 0x0, 0xe5, 0x0, 0xe9, 0x0, + 0xed, 0x0, 0xf1, 0x0, 0xf5, 0x0, 0xf8, 0x0, 0xfc, 0x1, 0x0, 0x1, + 0x4, 0x1, 0x8, 0x1, 0xc, 0x1, 0x10, 0x1, 0x14, 0x1, 0x18, 0x1, + 0x1c, 0x1, 0x20, 0x1, 0x23, 0x1, 0x27, 0x1, 0x2b, 0x1, 0x2f, 0x1, + 0x33, 0x1, 0x37, 0x1, 0x3b, 0x1, 0x3f, 0x1, 0x43, 0x1, 0x47, 0x1, + 0x4b, 0x1, 0x4e, 0x1, 0x52, 0x1, 0x56, 0x1, 0x5a, 0x1, 0x5e, 0x1, + 0x62, 0x1, 0x66, 0x1, 0x6a, 0x1, 0x6e, 0x1, 0x72, 0x1, 0x76, 0x1, + 0x79, 0x1, 0x7d, 0x1, 0x81, 0x1, 0x85, 0x1, 0x89, 0x1, 0x8d, 0x1, + 0x91, 0x1, 0x95, 0x1, 0x99, 0x1, 0x9d, 0x1, 0xa1, 0x1, 0xa3, 0x1, + 0xa6, 0x1, 0xaa, 0x1, 0xae, 0x1, 0xb2, 0x1, 0xb6, 0x1, 0xba, 0x1, + 0xbe, 0x1, 0xc2, 0x1, 0xc5, 0x1, 0xc8, 0x1, 0xcb, 0x1, 0xce, 0x1, + 0xd1, 0x1, 0xd4, 0x1, 0xd7, 0x1, 0xda, 0x1, 0xdd, 0x1, 0xdf, 0x1, + 0xe2, 0x1, 0xe5, 0x1, 0xe8, 0x1, 0xeb, 0x1, 0xee, 0x1, 0xf1, 0x1, + 0xf4, 0x1, 0xf7, 0x1, 0xfa, 0x1, 0xfd, 0x1, 0xff, 0x2, 0x2, 0x2, + 0x5, 0x2, 0x8, 0x2, 0xb, 0x2, 0xe, 0x2, 0x11, 0x2, 0x14, 0x2, + 0x17, 0x2, 0x1a, 0x2, 0x1d, 0x2, 0x1f, 0x2, 0x22, 0x2, 0x25, 0x2, + 0x28, 0x2, 0x2b, 0x2, 0x2e, 0x2, 0x31, 0x2, 0x34, 0x2, 0x37, 0x2, + 0x3a, 0x2, 0x3d, 0x2, 0x3f, 0x2, 0x42, 0x2, 0x45, 0x2, 0x48, 0x2, + 0x4b, 0x2, 0x4e, 0x2, 0x51, 0x2, 0x54, 0x2, 0x57, 0x2, 0x5a, 0x2, + 0x5d, 0x2, 0x5f, 0x2, 0x62, 0x2, 0x65, 0x2, 0x68, 0x2, 0x6b, 0x2, + 0x6e, 0x2, 0x71, 0x2, 0x74, 0x2, 0x77, 0x2, 0x7a, 0x2, 0x7d, 0x2, + 0x7f, 0x2, 0x82, 0x2, 0x85, 0x2, 0x88, 0x2, 0x8b, 0x2, 0x8e, 0x2, + 0x91, 0x2, 0x94, 0x2, 0x97, 0x2, 0x9a, 0x2, 0x9c, 0x2, 0x9f, 0x2, + 0xa2, 0x2, 0xa5, 0x2, 0xa8, 0x2, 0xab, 0x2, 0xae, 0x2, 0xb1, 0x2, + 0xb4, 0x2, 0xb7, 0x2, 0xba, 0x2, 0xe4, 0x2, 0xf6, 0x2, 0xfc, 0x61, + 0x31, 0x61, 0x31, 0x30, 0x61, 0x31, 0x30, 0x30, 0x61, 0x31, 0x30, 0x31, + 0x61, 0x31, 0x30, 0x32, 0x61, 0x31, 0x30, 0x33, 0x61, 0x31, 0x30, 0x34, + 0x61, 0x31, 0x30, 0x35, 0x61, 0x31, 0x30, 0x36, 0x61, 0x31, 0x30, 0x37, + 0x61, 0x31, 0x30, 0x38, 0x61, 0x31, 0x30, 0x39, 0x61, 0x31, 0x31, 0x61, + 0x31, 0x31, 0x30, 0x61, 0x31, 0x31, 0x31, 0x61, 0x31, 0x31, 0x32, 0x61, + 0x31, 0x31, 0x37, 0x61, 0x31, 0x31, 0x38, 0x61, 0x31, 0x31, 0x39, 0x61, + 0x31, 0x32, 0x61, 0x31, 0x32, 0x30, 0x61, 0x31, 0x32, 0x31, 0x61, 0x31, + 0x32, 0x32, 0x61, 0x31, 0x32, 0x33, 0x61, 0x31, 0x32, 0x34, 0x61, 0x31, + 0x32, 0x35, 0x61, 0x31, 0x32, 0x36, 0x61, 0x31, 0x32, 0x37, 0x61, 0x31, + 0x32, 0x38, 0x61, 0x31, 0x32, 0x39, 0x61, 0x31, 0x33, 0x61, 0x31, 0x33, + 0x30, 0x61, 0x31, 0x33, 0x31, 0x61, 0x31, 0x33, 0x32, 0x61, 0x31, 0x33, + 0x33, 0x61, 0x31, 0x33, 0x34, 0x61, 0x31, 0x33, 0x35, 0x61, 0x31, 0x33, + 0x36, 0x61, 0x31, 0x33, 0x37, 0x61, 0x31, 0x33, 0x38, 0x61, 0x31, 0x33, + 0x39, 0x61, 0x31, 0x34, 0x61, 0x31, 0x34, 0x30, 0x61, 0x31, 0x34, 0x31, + 0x61, 0x31, 0x34, 0x32, 0x61, 0x31, 0x34, 0x33, 0x61, 0x31, 0x34, 0x34, + 0x61, 0x31, 0x34, 0x35, 0x61, 0x31, 0x34, 0x36, 0x61, 0x31, 0x34, 0x37, + 0x61, 0x31, 0x34, 0x38, 0x61, 0x31, 0x34, 0x39, 0x61, 0x31, 0x35, 0x61, + 0x31, 0x35, 0x30, 0x61, 0x31, 0x35, 0x31, 0x61, 0x31, 0x35, 0x32, 0x61, + 0x31, 0x35, 0x33, 0x61, 0x31, 0x35, 0x34, 0x61, 0x31, 0x35, 0x35, 0x61, + 0x31, 0x35, 0x36, 0x61, 0x31, 0x35, 0x37, 0x61, 0x31, 0x35, 0x38, 0x61, + 0x31, 0x35, 0x39, 0x61, 0x31, 0x36, 0x61, 0x31, 0x36, 0x30, 0x61, 0x31, + 0x36, 0x31, 0x61, 0x31, 0x36, 0x32, 0x61, 0x31, 0x36, 0x33, 0x61, 0x31, + 0x36, 0x34, 0x61, 0x31, 0x36, 0x35, 0x61, 0x31, 0x36, 0x36, 0x61, 0x31, + 0x36, 0x37, 0x61, 0x31, 0x36, 0x38, 0x61, 0x31, 0x36, 0x39, 0x61, 0x31, + 0x37, 0x61, 0x31, 0x37, 0x30, 0x61, 0x31, 0x37, 0x31, 0x61, 0x31, 0x37, + 0x32, 0x61, 0x31, 0x37, 0x33, 0x61, 0x31, 0x37, 0x34, 0x61, 0x31, 0x37, + 0x35, 0x61, 0x31, 0x37, 0x36, 0x61, 0x31, 0x37, 0x37, 0x61, 0x31, 0x37, + 0x38, 0x61, 0x31, 0x37, 0x39, 0x61, 0x31, 0x38, 0x61, 0x31, 0x38, 0x30, + 0x61, 0x31, 0x38, 0x31, 0x61, 0x31, 0x38, 0x32, 0x61, 0x31, 0x38, 0x33, + 0x61, 0x31, 0x38, 0x34, 0x61, 0x31, 0x38, 0x35, 0x61, 0x31, 0x38, 0x36, + 0x61, 0x31, 0x38, 0x37, 0x61, 0x31, 0x38, 0x38, 0x61, 0x31, 0x38, 0x39, + 0x61, 0x31, 0x39, 0x61, 0x31, 0x39, 0x30, 0x61, 0x31, 0x39, 0x31, 0x61, + 0x31, 0x39, 0x32, 0x61, 0x31, 0x39, 0x33, 0x61, 0x31, 0x39, 0x34, 0x61, + 0x31, 0x39, 0x35, 0x61, 0x31, 0x39, 0x36, 0x61, 0x31, 0x39, 0x37, 0x61, + 0x31, 0x39, 0x38, 0x61, 0x31, 0x39, 0x39, 0x61, 0x32, 0x61, 0x32, 0x30, + 0x61, 0x32, 0x30, 0x30, 0x61, 0x32, 0x30, 0x31, 0x61, 0x32, 0x30, 0x32, + 0x61, 0x32, 0x30, 0x33, 0x61, 0x32, 0x30, 0x34, 0x61, 0x32, 0x30, 0x35, + 0x61, 0x32, 0x30, 0x36, 0x61, 0x32, 0x31, 0x61, 0x32, 0x32, 0x61, 0x32, + 0x33, 0x61, 0x32, 0x34, 0x61, 0x32, 0x35, 0x61, 0x32, 0x36, 0x61, 0x32, + 0x37, 0x61, 0x32, 0x38, 0x61, 0x32, 0x39, 0x61, 0x33, 0x61, 0x33, 0x30, + 0x61, 0x33, 0x31, 0x61, 0x33, 0x32, 0x61, 0x33, 0x33, 0x61, 0x33, 0x34, + 0x61, 0x33, 0x35, 0x61, 0x33, 0x36, 0x61, 0x33, 0x37, 0x61, 0x33, 0x38, + 0x61, 0x33, 0x39, 0x61, 0x34, 0x61, 0x34, 0x30, 0x61, 0x34, 0x31, 0x61, + 0x34, 0x32, 0x61, 0x34, 0x33, 0x61, 0x34, 0x34, 0x61, 0x34, 0x35, 0x61, + 0x34, 0x36, 0x61, 0x34, 0x37, 0x61, 0x34, 0x38, 0x61, 0x34, 0x39, 0x61, + 0x35, 0x61, 0x35, 0x30, 0x61, 0x35, 0x31, 0x61, 0x35, 0x32, 0x61, 0x35, + 0x33, 0x61, 0x35, 0x34, 0x61, 0x35, 0x35, 0x61, 0x35, 0x36, 0x61, 0x35, + 0x37, 0x61, 0x35, 0x38, 0x61, 0x35, 0x39, 0x61, 0x36, 0x61, 0x36, 0x30, + 0x61, 0x36, 0x31, 0x61, 0x36, 0x32, 0x61, 0x36, 0x33, 0x61, 0x36, 0x34, + 0x61, 0x36, 0x35, 0x61, 0x36, 0x36, 0x61, 0x36, 0x37, 0x61, 0x36, 0x38, + 0x61, 0x36, 0x39, 0x61, 0x37, 0x61, 0x37, 0x30, 0x61, 0x37, 0x31, 0x61, + 0x37, 0x32, 0x61, 0x37, 0x33, 0x61, 0x37, 0x34, 0x61, 0x37, 0x35, 0x61, + 0x37, 0x36, 0x61, 0x37, 0x37, 0x61, 0x37, 0x38, 0x61, 0x37, 0x39, 0x61, + 0x38, 0x61, 0x38, 0x31, 0x61, 0x38, 0x32, 0x61, 0x38, 0x33, 0x61, 0x38, + 0x34, 0x61, 0x38, 0x35, 0x61, 0x38, 0x36, 0x61, 0x38, 0x37, 0x61, 0x38, + 0x38, 0x61, 0x38, 0x39, 0x61, 0x39, 0x61, 0x39, 0x30, 0x61, 0x39, 0x31, + 0x61, 0x39, 0x32, 0x61, 0x39, 0x33, 0x61, 0x39, 0x34, 0x61, 0x39, 0x35, + 0x61, 0x39, 0x36, 0x61, 0x39, 0x37, 0x61, 0x39, 0x38, 0x61, 0x39, 0x39, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, + 0x44, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x74, 0x73, 0x20, 0x4f, 0x54, 0x46, + 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x0, 0x0, 0x1, 0x1, 0x87, 0xc8, + 0x0, 0x1, 0x0, 0x0, 0xcb, 0x2, 0x0, 0x1, 0x0, 0x4, 0x1, 0x3, + 0x1, 0x8d, 0x1, 0xfa, 0x2, 0x4a, 0x2, 0x95, 0x2, 0xe3, 0x3, 0x25, + 0x3, 0x71, 0x3, 0xc9, 0x4, 0xe0, 0x6, 0x2f, 0x6, 0x9f, 0x7, 0xcc, + 0x8, 0x9, 0x8, 0x4e, 0x8, 0xce, 0x9, 0x5d, 0xb, 0x1d, 0xc, 0xf8, + 0xe, 0x27, 0xe, 0x74, 0xe, 0xe7, 0xf, 0x55, 0xf, 0xa7, 0x10, 0x36, + 0x10, 0x90, 0x10, 0xde, 0x11, 0x71, 0x12, 0x22, 0x12, 0xaa, 0x14, 0x21, + 0x14, 0x5e, 0x14, 0xca, 0x15, 0x6f, 0x15, 0xce, 0x16, 0x5e, 0x16, 0xe9, + 0x17, 0x2d, 0x17, 0xa2, 0x18, 0x1c, 0x18, 0xaa, 0x1a, 0x1f, 0x1a, 0x45, + 0x1a, 0x95, 0x1a, 0xfe, 0x1b, 0x34, 0x1b, 0x91, 0x1c, 0xa, 0x1c, 0x3e, + 0x1c, 0xbf, 0x1d, 0x35, 0x1d, 0x97, 0x1d, 0xe3, 0x1e, 0x1, 0x1e, 0x56, + 0x1e, 0xbc, 0x1e, 0xfa, 0x1f, 0x45, 0x1f, 0xa3, 0x1f, 0xcd, 0x20, 0x42, + 0x20, 0xa9, 0x21, 0x14, 0x21, 0x57, 0x21, 0x87, 0x21, 0xb7, 0x21, 0xcc, + 0x22, 0x15, 0x22, 0x5f, 0x22, 0x8f, 0x23, 0x15, 0x23, 0x69, 0x23, 0x8f, + 0x23, 0xb6, 0x24, 0x5f, 0x24, 0xa1, 0x24, 0xf7, 0x25, 0x18, 0x25, 0x2b, + 0x25, 0x40, 0x25, 0x72, 0x25, 0xa2, 0x25, 0xc4, 0x25, 0xf4, 0x26, 0x38, + 0x26, 0xa7, 0x26, 0xfc, 0x27, 0x3c, 0x27, 0x82, 0x27, 0xc8, 0x28, 0x22, + 0x28, 0x67, 0x28, 0xca, 0x29, 0x3f, 0x29, 0xa5, 0x29, 0xcb, 0x2a, 0x28, + 0x2a, 0x4d, 0x2a, 0x81, 0x2a, 0xb0, 0x2a, 0xf3, 0x2b, 0x4e, 0x2b, 0xbc, + 0x2b, 0xec, 0x2c, 0x47, 0x2c, 0xb5, 0x2d, 0xc, 0x2d, 0xcd, 0x2e, 0x37, + 0x2e, 0x78, 0x2e, 0xbf, 0x2f, 0x84, 0x2f, 0xb8, 0x2f, 0xdf, 0x30, 0x10, + 0x30, 0x2d, 0x30, 0xaf, 0x31, 0x34, 0x31, 0xf2, 0x32, 0xcd, 0x33, 0x1a, + 0x33, 0x46, 0x33, 0x7e, 0x33, 0xb6, 0x36, 0x8, 0x36, 0xf2, 0x38, 0x52, + 0x39, 0x3f, 0x3b, 0x97, 0x3c, 0x1a, 0x3c, 0x82, 0x3c, 0xb1, 0x3d, 0x6, + 0x3d, 0x60, 0x3d, 0xb0, 0x3d, 0xdd, 0x40, 0x4b, 0x40, 0x76, 0x40, 0xb1, + 0x41, 0x1b, 0x41, 0x81, 0x41, 0xbf, 0x42, 0x1b, 0x42, 0xa2, 0x43, 0x2, + 0x45, 0xaf, 0x45, 0xe5, 0x47, 0xc, 0x47, 0xb8, 0x47, 0xfc, 0x48, 0x55, + 0x49, 0x91, 0x4a, 0xda, 0x4b, 0xee, 0x4c, 0xb1, 0x4e, 0x67, 0x4f, 0x36, + 0x51, 0x49, 0x51, 0x6f, 0x54, 0xde, 0x55, 0x5e, 0x58, 0xd9, 0x59, 0xc7, + 0x5a, 0xb9, 0x5b, 0xa5, 0x5c, 0xb1, 0x5d, 0xb9, 0x5e, 0x95, 0x60, 0xef, + 0x61, 0x45, 0x62, 0xd, 0x62, 0x38, 0x62, 0x8b, 0x62, 0x9a, 0x62, 0xcb, + 0x62, 0xf5, 0x63, 0x9, 0x63, 0x20, 0x63, 0x36, 0x63, 0x8e, 0x63, 0xf7, + 0x64, 0x17, 0x64, 0x24, 0x64, 0x32, 0x64, 0x42, 0x64, 0x72, 0x64, 0x8c, + 0x64, 0xaa, 0x64, 0xca, 0x65, 0x2, 0x65, 0x74, 0x65, 0xad, 0x65, 0xc5, + 0x65, 0xdb, 0x66, 0xb, 0x66, 0x3b, 0x66, 0x8f, 0x66, 0xe5, 0x67, 0x29, + 0x67, 0x6c, 0x67, 0xbf, 0x67, 0xc2, 0xfc, 0xc5, 0xe, 0xf7, 0x1b, 0xf7, + 0x18, 0x9f, 0x9d, 0xae, 0xbf, 0xb9, 0x88, 0xa6, 0x71, 0xa6, 0xf7, 0x6a, + 0xb3, 0x64, 0xb3, 0x12, 0xf8, 0xfa, 0xac, 0xa2, 0xb1, 0x65, 0xf7, 0x15, + 0xfb, 0x13, 0xf7, 0x12, 0x9f, 0xb5, 0x62, 0xb5, 0xbe, 0xbb, 0x5c, 0xbb, + 0x13, 0xe5, 0x34, 0xf9, 0x33, 0xf7, 0x95, 0x15, 0xbb, 0x89, 0x9c, 0x83, + 0xae, 0x6a, 0x8, 0x73, 0xa4, 0xac, 0x77, 0xaf, 0x1b, 0x13, 0xe5, 0x32, + 0xb9, 0xbd, 0xb1, 0xbc, 0x1f, 0x13, 0xcd, 0x34, 0xba, 0x63, 0xa3, 0x60, + 0x56, 0x52, 0x78, 0x87, 0x54, 0x1e, 0x64, 0x88, 0x5, 0x13, 0xe5, 0x34, + 0xfc, 0x64, 0xfb, 0x3e, 0x15, 0xf8, 0x42, 0x9f, 0xfb, 0x38, 0x6, 0xf7, + 0x3d, 0xf5, 0x8f, 0xc2, 0xb5, 0xb2, 0xb2, 0xaf, 0xbc, 0xa1, 0xb5, 0xab, + 0x19, 0x13, 0xe5, 0x2c, 0xa1, 0x9c, 0x9d, 0xa3, 0xa8, 0x1a, 0x13, 0xe3, + 0x34, 0xb6, 0x65, 0xa7, 0x62, 0x1e, 0x13, 0xe5, 0x94, 0x45, 0x67, 0x4f, + 0x4d, 0x85, 0x1f, 0x85, 0x50, 0x6f, 0x71, 0x60, 0x67, 0xfb, 0x76, 0xfb, + 0x50, 0x18, 0xfb, 0x31, 0x6, 0xfb, 0x60, 0xcb, 0x15, 0xf8, 0x45, 0x9d, + 0xf3, 0xe2, 0x5, 0x8c, 0x7, 0xfc, 0xb0, 0x2c, 0x5, 0xf9, 0x55, 0xf7, + 0x95, 0x15, 0x13, 0xe3, 0x34, 0xaa, 0xb0, 0xa7, 0xa8, 0x1e, 0x13, 0xe5, + 0x2c, 0xa4, 0x9f, 0x76, 0x72, 0x6c, 0x68, 0x71, 0x6e, 0x1f, 0x13, 0xe5, + 0x94, 0x73, 0x74, 0x9e, 0xa4, 0x1f, 0x13, 0xcd, 0x54, 0xe6, 0xfb, 0x80, + 0x15, 0xac, 0xac, 0x9f, 0xa9, 0x1e, 0x13, 0xe5, 0x32, 0xa6, 0xa3, 0x7a, + 0x6e, 0x6a, 0x6c, 0x7a, 0x6d, 0x1f, 0x13, 0xd5, 0x54, 0x71, 0x70, 0x98, + 0xa9, 0x1f, 0xfb, 0x6d, 0xaf, 0x15, 0x93, 0x90, 0x93, 0x94, 0x94, 0x94, + 0x84, 0x82, 0x83, 0x82, 0x84, 0x83, 0x82, 0x85, 0x91, 0x94, 0x1e, 0xe, + 0xfb, 0x27, 0x92, 0x76, 0xf7, 0x4b, 0xae, 0xf7, 0xb0, 0xaf, 0xf7, 0x49, + 0x54, 0xa, 0xf7, 0x3d, 0x15, 0xf7, 0x61, 0x6, 0xf5, 0xfb, 0x4b, 0xf5, + 0xf7, 0x4b, 0x5, 0xf7, 0x61, 0x6, 0x25, 0xf7, 0x45, 0xf1, 0xf7, 0x46, + 0x5, 0xfb, 0x61, 0x6, 0x21, 0xf7, 0x49, 0x21, 0xfb, 0x49, 0x5, 0xfb, + 0x61, 0x6, 0xf0, 0xfb, 0x46, 0x5, 0xf8, 0x23, 0xb2, 0x15, 0x4c, 0xf2, + 0x5, 0xf7, 0xe, 0x6, 0xfb, 0xc, 0xfb, 0xb0, 0x15, 0xc8, 0xf3, 0xc5, + 0x23, 0x5, 0xfc, 0x86, 0x16, 0xca, 0xf3, 0xc9, 0x23, 0x5, 0x4d, 0xf7, + 0x49, 0x15, 0x4f, 0xf2, 0x5, 0xf7, 0xd, 0x6, 0xb6, 0xfb, 0xb0, 0x15, + 0x39, 0xf7, 0x22, 0xdd, 0xf7, 0x22, 0x5, 0xf7, 0x3d, 0x6, 0xdd, 0xfb, + 0x22, 0x39, 0xfb, 0x22, 0x5, 0xfb, 0x29, 0xf7, 0xd4, 0x15, 0xcb, 0xf7, + 0x3, 0xca, 0xfb, 0x3, 0x5, 0xfb, 0xd, 0xfb, 0xf7, 0x15, 0xf7, 0x10, + 0x6, 0x49, 0xfb, 0x0, 0x5, 0xe, 0xfb, 0x3f, 0x73, 0xa, 0xf8, 0xee, + 0xfc, 0x24, 0xeb, 0xf7, 0x65, 0xea, 0x13, 0xb0, 0xdb, 0xf7, 0x78, 0x15, + 0xf7, 0xc, 0x68, 0xa, 0x1e, 0x13, 0xc0, 0x31, 0x54, 0x42, 0x44, 0x53, + 0xa4, 0x6a, 0x9f, 0x7f, 0x1f, 0x96, 0x85, 0x9a, 0x87, 0x9c, 0x90, 0x8, + 0x90, 0x9c, 0x95, 0x90, 0xa4, 0x1b, 0x13, 0xb0, 0xb1, 0xa3, 0x76, 0x61, + 0x59, 0x6a, 0x4a, 0xfb, 0x16, 0x6b, 0x1f, 0x8f, 0x76, 0x5, 0xf7, 0xc5, + 0x16, 0xf7, 0xb, 0x68, 0xa, 0x31, 0x54, 0x42, 0x44, 0x53, 0xa4, 0x6a, + 0xa0, 0x7f, 0x1e, 0x96, 0x85, 0x99, 0x87, 0x9c, 0x90, 0x8, 0x90, 0x9d, + 0x94, 0x90, 0xa5, 0x1b, 0xb0, 0xa4, 0x76, 0x61, 0x59, 0x69, 0x4a, 0xfb, + 0x16, 0x6b, 0x1f, 0x90, 0x76, 0x5, 0xe, 0x20, 0xfb, 0x38, 0xd6, 0xf9, + 0xaa, 0x77, 0xf7, 0x25, 0x77, 0x1, 0xf8, 0x8c, 0xa7, 0x3, 0xf7, 0x94, + 0x2f, 0x15, 0x65, 0x9d, 0xab, 0x69, 0xb6, 0x1b, 0xd5, 0xf7, 0x1, 0xbb, + 0xf7, 0x8d, 0x1f, 0xf8, 0xcc, 0x7, 0xb7, 0xf7, 0x11, 0x40, 0x7d, 0x86, + 0xfb, 0x3, 0x5, 0x72, 0x6, 0xfb, 0x41, 0xfb, 0x22, 0x33, 0xfb, 0x42, + 0xfb, 0x4d, 0xf7, 0x3a, 0x3d, 0xf7, 0x15, 0x91, 0x95, 0x8e, 0x99, 0xb0, + 0x1f, 0x5f, 0x7, 0xfb, 0x58, 0x34, 0x61, 0x32, 0x7b, 0x6b, 0x90, 0x91, + 0x7d, 0x1e, 0xe, 0xfb, 0xbb, 0x92, 0x76, 0xf9, 0x64, 0x77, 0x1, 0xf7, + 0xa4, 0xf7, 0xa4, 0x15, 0x9f, 0xd2, 0xaa, 0x96, 0xcc, 0xa8, 0x8, 0xd3, + 0xa9, 0xa7, 0xc5, 0xdc, 0x1a, 0xf7, 0x27, 0xfb, 0x1, 0x92, 0xfb, 0x5, + 0x25, 0xfb, 0x0, 0x78, 0xfb, 0x15, 0x37, 0xa4, 0x51, 0xd6, 0x6a, 0x1e, + 0xcd, 0x6e, 0xa9, 0x80, 0x9f, 0x44, 0x8, 0xfb, 0x10, 0xfb, 0x35, 0x15, + 0x47, 0xc4, 0x52, 0xcf, 0xd1, 0xc2, 0xc4, 0xcf, 0xd1, 0x54, 0xc2, 0x45, + 0x47, 0x52, 0x54, 0x45, 0x1e, 0xe, 0xfb, 0xbb, 0x3a, 0xa, 0xf7, 0xa3, + 0xf7, 0xa8, 0x15, 0xa4, 0xcd, 0xbe, 0xa8, 0xc8, 0xa5, 0x8, 0xcd, 0xa8, + 0xad, 0xd8, 0xd6, 0x1a, 0xd1, 0x62, 0xc4, 0x3f, 0x4a, 0x63, 0x55, 0x52, + 0x7c, 0x1e, 0xc4, 0x7f, 0x5f, 0xc1, 0x4c, 0x1b, 0x3a, 0x66, 0x4e, 0x42, + 0x45, 0xb4, 0x3d, 0xc7, 0x71, 0x1f, 0xc8, 0x70, 0xbe, 0x6f, 0xa3, 0x49, + 0x8, 0xfb, 0x12, 0xfb, 0x38, 0x15, 0x46, 0xc3, 0x52, 0xd1, 0xd1, 0xc3, + 0xc4, 0xd0, 0xd2, 0x53, 0xc2, 0x45, 0x46, 0x52, 0x54, 0x44, 0x1e, 0xe, + 0xd2, 0xc8, 0x76, 0xf8, 0xf7, 0x77, 0x1, 0xf8, 0x5b, 0xb3, 0x15, 0xb0, + 0xe2, 0xe3, 0xbe, 0xe0, 0xab, 0x8, 0xf7, 0x2d, 0xc3, 0xc4, 0xdc, 0xec, + 0x1a, 0xf7, 0xb, 0x39, 0xe3, 0xfb, 0xd, 0xfb, 0x3, 0x40, 0x2c, 0x25, + 0x6c, 0x1e, 0xf1, 0x6f, 0x3a, 0xea, 0xfb, 0x1, 0x1b, 0xfb, 0xd, 0x3a, + 0x32, 0xfb, 0xb, 0x2e, 0xc6, 0x35, 0xe2, 0x6c, 0x1f, 0xf7, 0x29, 0x54, + 0xe3, 0x59, 0xb0, 0x33, 0x8, 0xe, 0xd3, 0x61, 0x76, 0xcc, 0x76, 0xf8, + 0xb4, 0x77, 0xe6, 0x77, 0x1, 0xf8, 0xde, 0x96, 0x3, 0xf7, 0x23, 0xc0, + 0x15, 0xa0, 0x75, 0xf8, 0x3a, 0xf8, 0x39, 0x8c, 0x6f, 0xfc, 0x2c, 0xfc, + 0x2c, 0x96, 0x81, 0xf8, 0x2a, 0xf8, 0x2a, 0xaf, 0x7d, 0xfc, 0x35, 0xfc, + 0x35, 0xbb, 0x5a, 0xf8, 0x43, 0xf8, 0x43, 0xf2, 0xf7, 0x72, 0x80, 0x96, + 0xfb, 0x74, 0xfb, 0x10, 0x5, 0xb0, 0x5c, 0x15, 0x88, 0xab, 0xf7, 0x17, + 0xd8, 0x95, 0x82, 0x34, 0xfb, 0x1d, 0x80, 0xa0, 0x5, 0xe, 0xfb, 0x40, + 0x92, 0x76, 0xf7, 0xea, 0xaf, 0xf7, 0xe9, 0x54, 0xa, 0xf8, 0xea, 0x3, + 0xf7, 0x59, 0xf7, 0xe6, 0x15, 0x36, 0x7b, 0x3e, 0x44, 0x32, 0x1a, 0x2b, + 0xd8, 0x3b, 0xec, 0xb3, 0xaf, 0x96, 0xa3, 0xab, 0x1e, 0xda, 0xc6, 0x88, + 0xf7, 0x4, 0xd2, 0xcf, 0x8, 0xac, 0xae, 0xbc, 0xae, 0xbc, 0x1b, 0xaf, + 0x89, 0x5, 0xb3, 0x7, 0x67, 0x89, 0x63, 0x8e, 0x61, 0xa5, 0x69, 0xa4, + 0x19, 0x3a, 0xc6, 0x8c, 0xf7, 0x1, 0x4a, 0xcf, 0x8, 0xab, 0x6b, 0x60, + 0x9e, 0x5e, 0x1b, 0x28, 0x39, 0x40, 0x27, 0x33, 0xd8, 0x42, 0xe0, 0x7c, + 0x1f, 0xe, 0x3c, 0x81, 0xab, 0xee, 0xa4, 0x90, 0xde, 0xf7, 0x4a, 0x94, + 0x82, 0xf7, 0x4, 0xf7, 0x0, 0xa2, 0x12, 0x9d, 0xb9, 0xf7, 0x2b, 0xf7, + 0x10, 0x60, 0x9d, 0xf7, 0x16, 0xaf, 0x7e, 0xf7, 0x36, 0xd2, 0xb5, 0x13, + 0xef, 0x50, 0xf7, 0xce, 0xf7, 0x34, 0x15, 0x8d, 0x6, 0x84, 0x92, 0x94, + 0x89, 0x98, 0x1b, 0x9c, 0xe0, 0x95, 0xc6, 0xd7, 0x1f, 0xc2, 0xb6, 0xbe, + 0xc6, 0xd9, 0x1a, 0xb2, 0x72, 0xb7, 0x56, 0x60, 0x6b, 0x71, 0x6b, 0x71, + 0x1e, 0x87, 0x8d, 0x5, 0x9f, 0xaf, 0x99, 0xa5, 0xb5, 0x1a, 0xb8, 0x71, + 0xde, 0xfb, 0x9, 0xfb, 0x50, 0xfb, 0x17, 0xfb, 0x50, 0xfb, 0x44, 0xfb, + 0x2d, 0xe2, 0xfb, 0x2c, 0xf7, 0x6b, 0xf7, 0x71, 0xf7, 0x5d, 0xf7, 0x5e, + 0xf7, 0x70, 0xf7, 0xa, 0x48, 0xd7, 0x59, 0x7f, 0x7f, 0x84, 0x7e, 0x84, + 0x1e, 0x90, 0x88, 0x97, 0x87, 0x96, 0x84, 0x8, 0xb7, 0x6c, 0xad, 0x49, + 0x33, 0x1a, 0xfb, 0x5f, 0xfb, 0x27, 0xfb, 0x36, 0xfb, 0x62, 0xfb, 0x45, + 0x21, 0xf7, 0x1d, 0xf7, 0x3c, 0x1e, 0x13, 0xf6, 0xb0, 0xf7, 0x22, 0xe3, + 0xf7, 0x3b, 0xf7, 0x31, 0xf3, 0xaa, 0x38, 0x5b, 0x1e, 0x8c, 0x75, 0x87, + 0x72, 0x85, 0x7a, 0x8, 0x89, 0x6, 0xb0, 0x82, 0x76, 0xbd, 0x4a, 0x1b, + 0x40, 0x5b, 0x42, 0x45, 0x64, 0x95, 0x78, 0xa3, 0x6a, 0x1f, 0xb1, 0x57, + 0x97, 0x79, 0x88, 0x66, 0x8, 0x69, 0x88, 0x6d, 0x84, 0x84, 0x1b, 0x67, + 0x74, 0xb6, 0xa3, 0x8d, 0x1f, 0x8c, 0x96, 0x87, 0x8e, 0x83, 0x81, 0x8, + 0x81, 0x7f, 0x87, 0x7f, 0x7c, 0x1a, 0x69, 0xa4, 0x74, 0xaf, 0xb4, 0xa4, + 0x9b, 0xa2, 0x98, 0x1e, 0x13, 0xf7, 0x50, 0xa4, 0xf7, 0x23, 0x15, 0xc1, + 0xa9, 0xc1, 0xc6, 0x90, 0x1e, 0x96, 0x8c, 0x8b, 0x89, 0x90, 0x85, 0x8, + 0x13, 0xf7, 0x30, 0x98, 0x7c, 0x95, 0x74, 0x6f, 0x1a, 0x59, 0x67, 0x5b, + 0x59, 0x80, 0x1e, 0x7f, 0x88, 0x8a, 0x8c, 0x84, 0x93, 0x8, 0x7f, 0x99, + 0x81, 0xa0, 0xa7, 0x1a, 0xe, 0x3c, 0xcf, 0xf7, 0x37, 0xfb, 0x37, 0xf7, + 0x38, 0x4b, 0xca, 0xf7, 0xa, 0xf7, 0x44, 0xca, 0x77, 0x12, 0x96, 0xe0, + 0x74, 0xcf, 0xc7, 0xa0, 0x8b, 0xdf, 0x9e, 0xac, 0xf7, 0xed, 0xb3, 0x13, + 0x9b, 0xe0, 0xf7, 0xcb, 0xf7, 0xb5, 0x15, 0x85, 0x86, 0x75, 0x7c, 0x80, + 0x7b, 0x8, 0x7d, 0x78, 0x86, 0x77, 0x7b, 0x1a, 0x7b, 0x92, 0x65, 0xb3, + 0x67, 0x1e, 0x6a, 0xb0, 0xb5, 0x84, 0xa1, 0x1b, 0xba, 0xbf, 0xa6, 0xb1, + 0xaa, 0x1f, 0xbb, 0xc5, 0x9a, 0x94, 0xb8, 0x96, 0xad, 0x93, 0xa8, 0x9d, + 0x9d, 0x99, 0x8, 0x9a, 0x98, 0x93, 0xa0, 0x98, 0x1a, 0xa2, 0x7f, 0x9c, + 0x78, 0x7a, 0x81, 0x7c, 0x83, 0x87, 0x1e, 0x88, 0x84, 0x8e, 0x85, 0x8f, + 0x8a, 0x8, 0x93, 0x88, 0x95, 0x84, 0x7f, 0x1a, 0x79, 0x7d, 0x7e, 0x77, + 0x79, 0x6a, 0x8e, 0xf2, 0x64, 0x1e, 0x85, 0x9b, 0x85, 0x9b, 0x85, 0x99, + 0x8, 0xd5, 0x6d, 0x6d, 0xbe, 0x3b, 0x1b, 0x6f, 0x6a, 0x7e, 0x73, 0x75, + 0x1f, 0x77, 0x75, 0x7f, 0x6d, 0x6d, 0x1a, 0x6e, 0x9a, 0x6c, 0x8f, 0x85, + 0x1e, 0x8e, 0x85, 0x8b, 0x88, 0x87, 0x88, 0x85, 0x8a, 0x84, 0x8c, 0x85, + 0x8c, 0x7e, 0x8c, 0x6a, 0x95, 0x6b, 0xa1, 0x8, 0x9a, 0x82, 0x9c, 0x83, + 0x97, 0x1e, 0x83, 0x96, 0x85, 0x8f, 0x73, 0x85, 0x8, 0x78, 0x99, 0x7f, + 0x9d, 0xaa, 0x1a, 0xaa, 0x91, 0x99, 0x91, 0x9a, 0x1e, 0x90, 0x95, 0x8e, + 0x90, 0x82, 0x96, 0x8, 0x99, 0x81, 0x7e, 0x95, 0x82, 0x1b, 0x70, 0x77, + 0x59, 0x75, 0x82, 0x8f, 0x78, 0xab, 0x60, 0x1f, 0xa7, 0x67, 0xad, 0x6b, + 0xa9, 0x74, 0x8d, 0x73, 0x85, 0x68, 0x7a, 0x6d, 0x8, 0x74, 0x7e, 0x77, + 0x80, 0x78, 0x1b, 0x13, 0x3d, 0xe0, 0x72, 0x84, 0x9f, 0x99, 0x94, 0x8b, + 0x89, 0x89, 0x8e, 0x1f, 0x90, 0x84, 0x81, 0x91, 0x7e, 0x1b, 0x6f, 0x72, + 0x72, 0x6b, 0x68, 0xab, 0x71, 0xb0, 0xa0, 0xa0, 0x90, 0x9d, 0xa4, 0x1f, + 0xb7, 0xab, 0xab, 0xcb, 0x8a, 0xbe, 0x9d, 0x81, 0xbb, 0x77, 0x95, 0x88, + 0x98, 0x86, 0x87, 0x84, 0x8f, 0x87, 0x8, 0xbd, 0x8e, 0x15, 0x87, 0x96, + 0x8b, 0x8d, 0x91, 0x92, 0x8, 0x9e, 0x9b, 0x9f, 0x9d, 0xb4, 0x1b, 0xbc, + 0xaa, 0x61, 0x67, 0x97, 0x1f, 0x8e, 0x83, 0x8a, 0x88, 0x85, 0x87, 0x8, + 0x13, 0x5d, 0xe0, 0x7d, 0x7a, 0x6d, 0x81, 0x6b, 0x1b, 0x58, 0x6e, 0xb0, + 0xa2, 0x83, 0x1f, 0xe, 0xfb, 0x69, 0xa0, 0x76, 0xf9, 0x7a, 0x77, 0x1, + 0xf7, 0xba, 0xb1, 0x3, 0xf7, 0x6e, 0x16, 0xea, 0x6, 0xea, 0x96, 0x6, + 0x5f, 0xcc, 0x70, 0xf5, 0x86, 0xf7, 0x20, 0x8, 0x93, 0x6, 0x8f, 0x75, + 0x5, 0x4b, 0x97, 0xbd, 0x64, 0xbb, 0x1b, 0xbb, 0xcd, 0xa8, 0xe7, 0xb4, + 0x74, 0xae, 0x6f, 0xa7, 0x1f, 0x6d, 0xa9, 0x68, 0xa2, 0x79, 0xa0, 0x61, + 0xba, 0x57, 0xd8, 0x79, 0xf7, 0xc, 0x82, 0x8d, 0x18, 0x82, 0x89, 0x79, + 0xfb, 0xc, 0x57, 0x3e, 0x61, 0x5c, 0x19, 0x78, 0x76, 0x65, 0x72, 0x6d, + 0x6b, 0x8, 0x71, 0x6f, 0x76, 0x6b, 0x63, 0x1a, 0x2f, 0xcd, 0x6e, 0xbb, + 0xbb, 0xbd, 0xb2, 0xcb, 0x97, 0x1e, 0x8f, 0xa1, 0x5, 0x93, 0x6, 0x86, + 0xfb, 0x20, 0x70, 0x21, 0x5f, 0x4a, 0x8, 0xe, 0xf7, 0xd, 0xf7, 0x2e, + 0x76, 0xf7, 0xb7, 0xda, 0x43, 0xd3, 0xa9, 0x77, 0x12, 0x13, 0xd0, 0xf8, + 0x25, 0xf7, 0xd7, 0x15, 0xf7, 0x6e, 0x42, 0xb5, 0x91, 0xb0, 0xc1, 0x5, + 0xad, 0x7, 0x52, 0xd4, 0xb9, 0x8d, 0xb9, 0x8d, 0xb9, 0x8e, 0x19, 0x13, + 0xb0, 0xaf, 0x8d, 0xaf, 0x8e, 0xaf, 0x8d, 0x8, 0xa2, 0x8d, 0x9e, 0x95, + 0xa4, 0x1a, 0xa5, 0x76, 0x95, 0x73, 0x1e, 0xfc, 0x3, 0x8a, 0xd2, 0x3f, + 0x5, 0x8e, 0x88, 0x8d, 0x7b, 0x87, 0x1a, 0x83, 0x89, 0x81, 0x85, 0x85, + 0x1e, 0xc2, 0x6f, 0x89, 0x81, 0x3b, 0x93, 0x7b, 0x8d, 0x82, 0x8a, 0x7c, + 0x8e, 0x19, 0x74, 0x8f, 0x65, 0x98, 0x73, 0x91, 0x8, 0x74, 0x88, 0x81, + 0x79, 0x76, 0x1a, 0x87, 0x8b, 0x87, 0x8c, 0x87, 0x1e, 0x8e, 0x33, 0x15, + 0xf7, 0x22, 0x55, 0x9d, 0x8e, 0xaa, 0xc5, 0xfb, 0x5c, 0xce, 0x5, 0x81, + 0x86, 0x85, 0x82, 0x80, 0x1a, 0x7a, 0x99, 0x78, 0x96, 0x7e, 0x1e, 0xfb, + 0xf4, 0x67, 0x15, 0xf7, 0x22, 0x98, 0x9e, 0x82, 0xd6, 0x67, 0x9a, 0x87, + 0x19, 0x91, 0x89, 0xd6, 0x84, 0x96, 0x8a, 0x8, 0x7f, 0x97, 0x7c, 0x9d, + 0x9d, 0x1a, 0x98, 0x93, 0x95, 0x96, 0x91, 0x1e, 0x7f, 0x9b, 0x7f, 0x9f, + 0xa0, 0x1a, 0x92, 0x8d, 0x92, 0x8e, 0x91, 0x1e, 0x7d, 0x6f, 0x6c, 0x84, + 0x6c, 0x1b, 0x7b, 0x7c, 0x8d, 0x8e, 0x7c, 0x1f, 0x8e, 0x9b, 0x5, 0x88, + 0x9a, 0x9a, 0x8a, 0x9b, 0x1b, 0xb1, 0xad, 0x95, 0xa0, 0xaa, 0x1f, 0xab, + 0x9f, 0xa2, 0xab, 0x8f, 0x1e, 0xdb, 0x75, 0x34, 0xc8, 0x4e, 0x79, 0x87, + 0x9a, 0xc4, 0x9c, 0x95, 0xb5, 0x9b, 0x86, 0x81, 0x66, 0xe3, 0x4d, 0x5, + 0x89, 0x8d, 0x9a, 0x8a, 0x8f, 0x1b, 0x9d, 0x97, 0x8e, 0x9e, 0x1f, 0x90, + 0x8a, 0x90, 0x90, 0x1a, 0x20, 0xf7, 0x1, 0xfb, 0x33, 0x91, 0xfb, 0x17, + 0xfb, 0xf, 0xfb, 0x17, 0x8f, 0x5, 0x78, 0x6e, 0x82, 0x68, 0x68, 0x1a, + 0x62, 0x97, 0x63, 0xa0, 0x68, 0x1e, 0xf8, 0x4, 0x58, 0x15, 0xbd, 0x7c, + 0xa9, 0x9b, 0xa0, 0xa3, 0xfb, 0xe, 0xba, 0x5, 0x83, 0x88, 0x86, 0x84, + 0x82, 0x1a, 0x78, 0x9f, 0x75, 0x99, 0x7f, 0x1e, 0xe, 0xfb, 0x25, 0x92, + 0x76, 0xf9, 0x4d, 0x77, 0x1, 0xf7, 0xef, 0x7d, 0x15, 0xa8, 0xf3, 0xf2, + 0xf7, 0x25, 0xd8, 0xec, 0x8, 0xc2, 0xd0, 0xbb, 0xcb, 0xe8, 0x1a, 0xe0, + 0x49, 0xc9, 0x36, 0x3a, 0x4c, 0x3d, 0x3f, 0x7a, 0x1e, 0xda, 0x76, 0x52, + 0xd6, 0x33, 0x1b, 0x3a, 0x4a, 0x49, 0x39, 0x33, 0xc4, 0x42, 0xc0, 0x4a, + 0x1f, 0xe0, 0x23, 0xe8, 0xfb, 0x1d, 0xa3, 0x23, 0x8, 0xe, 0xfb, 0x88, + 0x94, 0x76, 0xf9, 0x86, 0x77, 0x1, 0xcb, 0xf8, 0x66, 0x3, 0xf7, 0xb4, + 0x81, 0x15, 0x94, 0x89, 0x94, 0x8d, 0xa5, 0xf7, 0x39, 0xf1, 0xf7, 0x22, + 0xe9, 0xc6, 0x19, 0x8d, 0x94, 0x89, 0x94, 0x2d, 0xc6, 0x25, 0xf7, 0x22, + 0x71, 0xf7, 0x39, 0x19, 0x82, 0x8d, 0x82, 0x89, 0x71, 0xfb, 0x39, 0x25, + 0xfb, 0x22, 0x2d, 0x50, 0x19, 0x89, 0x82, 0x8d, 0x82, 0xe9, 0x50, 0xf1, + 0xfb, 0x22, 0xa5, 0xfb, 0x39, 0x19, 0xe, 0x4c, 0xa0, 0x76, 0xf7, 0xd0, + 0xad, 0xf7, 0xf2, 0x77, 0x12, 0xf8, 0x5, 0xb1, 0x66, 0xaf, 0x13, 0xf0, + 0xf7, 0xb9, 0x16, 0xea, 0x6, 0xea, 0x96, 0x6, 0x5f, 0xcb, 0x71, 0xf3, + 0x85, 0xf7, 0x1d, 0x8, 0x9a, 0x6, 0x48, 0x93, 0xc4, 0x58, 0xd0, 0x1b, + 0xd6, 0xc7, 0xc7, 0xd6, 0xd6, 0x4f, 0xc7, 0x40, 0x46, 0x52, 0x58, 0x48, + 0x83, 0x1f, 0x13, 0xe8, 0x7b, 0x6, 0x94, 0x8b, 0x94, 0x94, 0x1a, 0xc1, + 0x7, 0xcd, 0x94, 0xbe, 0xc4, 0xcf, 0x1a, 0xd6, 0x4f, 0xc7, 0x40, 0x40, + 0x4f, 0x4f, 0x40, 0x47, 0xbe, 0x52, 0xcd, 0x82, 0x1e, 0x55, 0x7, 0x82, + 0x8b, 0x82, 0x82, 0x1a, 0x7b, 0x6, 0xce, 0x83, 0x52, 0xbe, 0x46, 0x1b, + 0x40, 0x4f, 0x4f, 0x40, 0x40, 0xc7, 0x4f, 0xd6, 0xd0, 0xc4, 0xbe, 0xce, + 0x93, 0x1f, 0x13, 0xf0, 0x9a, 0x6, 0x85, 0xfb, 0x1d, 0x71, 0x23, 0x5f, + 0x4b, 0x8, 0xe, 0xfb, 0x29, 0xf7, 0x33, 0x76, 0xb3, 0xf7, 0xe4, 0xfb, + 0x8f, 0xf7, 0x39, 0xf7, 0x11, 0x77, 0x12, 0xc1, 0xf8, 0xa, 0xfb, 0x37, + 0xf8, 0x1a, 0xfb, 0xcc, 0xf7, 0xcc, 0x13, 0xb2, 0xae, 0xf7, 0x1e, 0x15, + 0xf9, 0x0, 0xf8, 0x33, 0xfd, 0x0, 0x6, 0x13, 0xd8, 0xf8, 0x1d, 0xfb, + 0x6e, 0x15, 0xa2, 0x7, 0xf7, 0x64, 0xf7, 0x30, 0x5, 0xfb, 0xe4, 0x7, + 0xfc, 0xda, 0x76, 0x15, 0x13, 0xb4, 0xf7, 0x67, 0xf7, 0x34, 0x5, 0x68, + 0x99, 0xa9, 0x78, 0xb1, 0x1b, 0xaf, 0xa7, 0xa1, 0xab, 0x98, 0x1f, 0xf7, + 0x66, 0xfb, 0x34, 0x5, 0x13, 0xb8, 0x13, 0xb4, 0xfc, 0x5, 0xf7, 0x6e, + 0x15, 0x13, 0xb8, 0xfb, 0x67, 0xf7, 0x36, 0x5, 0xf8, 0xda, 0x6, 0xfb, + 0x69, 0xfb, 0x36, 0x5, 0x13, 0xb2, 0xad, 0x7e, 0x6d, 0x9e, 0x66, 0x1b, + 0x13, 0xd4, 0x6a, 0x69, 0x75, 0x6c, 0x80, 0x1f, 0x13, 0xd8, 0xfb, 0x67, + 0xfb, 0x59, 0x15, 0xf7, 0xe4, 0x7, 0xf7, 0x63, 0xfb, 0x30, 0x5, 0x74, + 0x7, 0xe, 0x5b, 0xf7, 0x23, 0x9f, 0xc3, 0x9f, 0x84, 0x99, 0x8a, 0x9f, + 0xa7, 0x9f, 0x95, 0x9f, 0x8f, 0x9f, 0xed, 0xa3, 0xf3, 0x77, 0x12, 0xf7, + 0x1f, 0x9f, 0x80, 0x9f, 0xf7, 0x5f, 0x99, 0xab, 0x9f, 0x96, 0xa9, 0xda, + 0x9f, 0x93, 0xa5, 0x13, 0xdf, 0xdf, 0x8d, 0xf8, 0x12, 0x15, 0xce, 0x72, + 0x5, 0x7b, 0x8c, 0x95, 0x79, 0xa1, 0x1b, 0x99, 0x95, 0x90, 0x91, 0x92, + 0x1f, 0x91, 0x8a, 0x5, 0x73, 0x9a, 0x7b, 0xa2, 0x96, 0x94, 0x8e, 0x90, + 0x94, 0x1e, 0x8c, 0x8a, 0x77, 0x7d, 0x7f, 0x7a, 0x85, 0x75, 0x19, 0x13, + 0xdf, 0xbf, 0x81, 0x7e, 0x80, 0x7b, 0x76, 0x1a, 0x67, 0xa6, 0x79, 0xa4, + 0xad, 0xb0, 0x9e, 0xa5, 0xab, 0x1e, 0xd8, 0xcb, 0xb0, 0x92, 0x5, 0x75, + 0x8e, 0x9a, 0x79, 0xa7, 0x1b, 0x13, 0xaf, 0xdf, 0xa0, 0x9d, 0x99, 0x98, + 0x98, 0x1f, 0xa9, 0xaa, 0x97, 0x8d, 0x5, 0x13, 0xdf, 0xbf, 0x76, 0x8f, + 0x9e, 0x7e, 0x9e, 0x1b, 0xa7, 0xa6, 0xaa, 0x9f, 0x9d, 0x1f, 0xaf, 0x91, + 0xdd, 0xc2, 0x5, 0x99, 0x7, 0xfb, 0x79, 0x84, 0x34, 0x90, 0x94, 0x9a, + 0x94, 0x99, 0x92, 0x9b, 0x19, 0xcf, 0xa6, 0xbc, 0xbc, 0x8a, 0x8f, 0x29, + 0x82, 0xab, 0xf5, 0x87, 0x8d, 0x3d, 0x60, 0x66, 0x48, 0x5d, 0x94, 0x59, + 0x74, 0x5, 0x88, 0x7, 0xcd, 0x69, 0x78, 0x74, 0x6e, 0x7c, 0x72, 0x7b, + 0x19, 0xfb, 0xa1, 0xbe, 0x53, 0x6b, 0x5, 0x86, 0x8b, 0x86, 0x86, 0x1a, + 0xf8, 0xd3, 0x31, 0x15, 0x93, 0x8c, 0x5, 0x7f, 0x8f, 0x85, 0x94, 0x93, + 0x90, 0x95, 0x97, 0x1e, 0xb3, 0x90, 0x5, 0x7b, 0x7c, 0x76, 0x76, 0x7b, + 0x1b, 0x7a, 0x84, 0x97, 0x9a, 0x8d, 0x1f, 0xfb, 0x54, 0x78, 0x15, 0x86, + 0xa5, 0xa9, 0xa2, 0xb2, 0xa7, 0xf7, 0x4, 0x85, 0x18, 0xf7, 0x4b, 0x91, + 0x5c, 0x6d, 0xfb, 0x9a, 0x67, 0x7e, 0x89, 0x77, 0x86, 0x7a, 0x87, 0x19, + 0xad, 0xf7, 0x40, 0x15, 0x61, 0xa1, 0x94, 0x8f, 0xb6, 0x83, 0x5, 0x93, + 0xfb, 0x52, 0x15, 0x96, 0x8c, 0x5, 0x7f, 0x89, 0x8f, 0x80, 0x96, 0x1b, + 0x97, 0x91, 0x96, 0x9b, 0x8a, 0x1f, 0xbb, 0x92, 0x72, 0x72, 0x5, 0x81, + 0x81, 0x7e, 0x80, 0x7c, 0x1b, 0x74, 0x86, 0x9d, 0x9b, 0x8d, 0x1f, 0xfb, + 0x8c, 0x6b, 0x15, 0x86, 0x92, 0x96, 0x87, 0x9d, 0x1b, 0xa1, 0x84, 0x94, + 0xa4, 0x6d, 0x81, 0x71, 0x95, 0x83, 0x8e, 0x19, 0x97, 0xa8, 0xa6, 0x97, + 0xa6, 0x9c, 0xeb, 0xc7, 0x18, 0x9d, 0x96, 0x9c, 0x97, 0x9a, 0x99, 0xa0, + 0xa0, 0x95, 0xa3, 0x9a, 0xa5, 0xab, 0xc3, 0x18, 0xae, 0x9e, 0x6f, 0x2f, + 0xd9, 0x92, 0x80, 0x80, 0x43, 0x6f, 0x80, 0x70, 0x7b, 0x73, 0x7b, 0x73, + 0x19, 0x63, 0x70, 0x66, 0x6d, 0x92, 0x6e, 0x3b, 0x49, 0x18, 0x78, 0x74, + 0x68, 0x76, 0x6a, 0x1b, 0x13, 0xaf, 0xdf, 0x7a, 0x7c, 0x98, 0xa0, 0x9e, + 0x96, 0x99, 0x95, 0x96, 0x1f, 0xc5, 0xd6, 0x15, 0xfb, 0x6a, 0xd7, 0xa7, + 0x9b, 0xf7, 0x93, 0x5b, 0x5, 0xfb, 0x31, 0x73, 0x15, 0xb5, 0x7c, 0x5, + 0x86, 0x84, 0x83, 0x88, 0x82, 0x1b, 0x7d, 0x85, 0x96, 0x97, 0x8d, 0x1f, + 0x45, 0xa3, 0x15, 0xaa, 0x80, 0x5, 0x87, 0x86, 0x86, 0x89, 0x83, 0x1b, + 0x81, 0x88, 0x93, 0x94, 0x1f, 0xe, 0x5a, 0xaf, 0x9f, 0xbd, 0xc5, 0xc0, + 0xf5, 0x29, 0xf7, 0x3, 0x61, 0xe7, 0x9d, 0xea, 0x9d, 0x9f, 0x93, 0xcd, + 0x84, 0xca, 0x12, 0xc9, 0xa3, 0x80, 0xb6, 0x76, 0xa0, 0xf8, 0xd1, 0x9f, + 0x13, 0xe6, 0xd8, 0xcc, 0xf8, 0xa1, 0x15, 0xaf, 0x97, 0xb8, 0xb6, 0xeb, + 0x1b, 0xc1, 0xcd, 0x7c, 0x7d, 0xcc, 0x1f, 0x13, 0xe7, 0x58, 0x7c, 0xce, + 0xce, 0x7c, 0xbc, 0x1b, 0xc8, 0xbe, 0xa4, 0xa1, 0xa9, 0x1f, 0x78, 0xd3, + 0x5, 0x71, 0x6d, 0x61, 0x70, 0x57, 0x1b, 0x54, 0x4f, 0x98, 0x99, 0x4e, + 0x1f, 0x13, 0xe6, 0xd8, 0x99, 0x4c, 0x4b, 0x9a, 0x4e, 0x1b, 0xfb, 0x7, + 0x5c, 0x50, 0x53, 0x82, 0x8f, 0x82, 0x8d, 0x82, 0x1f, 0xb6, 0xfb, 0x83, + 0x15, 0x85, 0x7b, 0x86, 0x80, 0x70, 0x1a, 0x2f, 0xf7, 0x3, 0x23, 0xf7, + 0x58, 0xf7, 0x3f, 0xf7, 0x1c, 0xde, 0xf7, 0x9, 0xa2, 0x86, 0x96, 0x85, + 0x9b, 0x1e, 0x8b, 0x96, 0xaa, 0xa2, 0x1a, 0xf7, 0x1, 0xfb, 0x18, 0xe3, + 0xfb, 0x44, 0x22, 0x3a, 0x6b, 0x66, 0x5c, 0x1e, 0x69, 0x95, 0x62, 0xa2, + 0x82, 0xad, 0x8, 0x13, 0xe7, 0x28, 0x85, 0x86, 0x86, 0x7f, 0x80, 0x1a, + 0x5e, 0x9e, 0x73, 0xa8, 0x7a, 0x1e, 0x13, 0xe7, 0x58, 0x7a, 0x71, 0x82, + 0x78, 0x67, 0x1a, 0x72, 0x8e, 0x7f, 0x93, 0x7a, 0x1e, 0x95, 0xc1, 0x15, + 0xed, 0xf7, 0x13, 0xda, 0xf7, 0x32, 0xf7, 0x32, 0xf7, 0x16, 0x3c, 0x29, + 0x2a, 0xfb, 0x16, 0x3c, 0xfb, 0x32, 0xfb, 0x32, 0xfb, 0x13, 0xda, 0xec, + 0x1e, 0x93, 0x48, 0x15, 0x97, 0x77, 0xa4, 0x71, 0x9e, 0x7e, 0x8, 0x79, + 0x87, 0x7f, 0x8a, 0x83, 0x1a, 0x6e, 0xd1, 0x4c, 0xa6, 0x94, 0x94, 0x92, + 0x96, 0x96, 0x1e, 0x83, 0xa7, 0xc5, 0x7e, 0xc2, 0x1b, 0xc0, 0xc1, 0x9d, + 0x97, 0x9f, 0x1f, 0x92, 0x85, 0x9e, 0x77, 0x99, 0x94, 0x9d, 0x96, 0x9c, + 0x99, 0x9a, 0x9f, 0x8, 0x99, 0x9e, 0x93, 0x9c, 0x98, 0x1a, 0x90, 0x85, + 0x91, 0x83, 0x90, 0x1e, 0x98, 0x95, 0x9c, 0x9f, 0x93, 0x99, 0x8, 0x90, + 0x83, 0x8e, 0x7d, 0x78, 0x1a, 0x2b, 0xfb, 0x13, 0x3b, 0xfb, 0x35, 0xfb, + 0x33, 0xfb, 0x11, 0xdc, 0xe8, 0x9e, 0x8f, 0x9b, 0x8f, 0x93, 0x1e, 0xf7, + 0x82, 0xf7, 0x1c, 0x15, 0x8e, 0x86, 0x94, 0x8a, 0x91, 0x8d, 0x96, 0x8d, + 0xa6, 0x8c, 0x9b, 0x87, 0x97, 0x88, 0x8f, 0x8e, 0x8f, 0x90, 0xbf, 0xcf, + 0x18, 0x90, 0x92, 0x85, 0x8d, 0x81, 0x8d, 0x55, 0x97, 0x66, 0x8f, 0x44, + 0x80, 0x82, 0x8a, 0x85, 0x85, 0x8e, 0x87, 0x8, 0xf7, 0x37, 0xfb, 0x5a, + 0x15, 0xdc, 0x54, 0x94, 0x85, 0x91, 0x8d, 0x92, 0x90, 0x19, 0xb1, 0xa5, + 0x9e, 0x9f, 0x98, 0xb7, 0x8, 0x91, 0x8d, 0x86, 0x90, 0x82, 0x1b, 0x13, + 0xd7, 0x58, 0xfb, 0x10, 0x90, 0x5, 0x81, 0x87, 0x87, 0x87, 0x1f, 0x8a, + 0x83, 0x82, 0x7d, 0x7e, 0x82, 0x82, 0x86, 0x8e, 0x87, 0x91, 0x87, 0x8, + 0xfb, 0x31, 0xc3, 0x15, 0x13, 0xcf, 0x58, 0x72, 0xad, 0x76, 0xb4, 0xb4, + 0xad, 0xa0, 0xa4, 0xa4, 0x69, 0xa0, 0x62, 0x62, 0x69, 0x76, 0x72, 0x1e, + 0x2f, 0xfb, 0xc, 0x15, 0x93, 0x87, 0x95, 0x8b, 0x8f, 0x8f, 0xd6, 0xc8, + 0x18, 0x91, 0x90, 0x87, 0x8f, 0x85, 0x8e, 0x82, 0x90, 0x7b, 0x98, 0x87, + 0x95, 0x88, 0x93, 0x85, 0x8c, 0x82, 0x8a, 0xfb, 0xc, 0x7f, 0x18, 0x7e, + 0x8a, 0xe0, 0x31, 0x8d, 0x85, 0x9a, 0x69, 0x46, 0xcb, 0xc1, 0x6d, 0x8, + 0xe, 0xef, 0xf7, 0x2c, 0x76, 0xd1, 0xa5, 0xf7, 0x3d, 0xa5, 0x78, 0xa4, + 0xbd, 0xa3, 0x90, 0xa4, 0x8f, 0x77, 0x12, 0x9f, 0xa4, 0x13, 0xed, 0xc2, + 0xf7, 0x57, 0x15, 0xf7, 0x1f, 0x98, 0xf1, 0x5c, 0xde, 0x84, 0xda, 0x74, + 0xad, 0x9b, 0x9e, 0xa4, 0xb6, 0x96, 0xab, 0xc5, 0xc8, 0x93, 0xb2, 0xc6, + 0x5, 0xb3, 0x7, 0x5d, 0xc0, 0xf7, 0x7, 0x8f, 0xf7, 0x5, 0x91, 0x5, + 0xa4, 0x8c, 0x9f, 0x9f, 0xa2, 0x1a, 0xa3, 0x74, 0x9e, 0x6a, 0x8c, 0x1e, + 0xfb, 0xf7, 0x91, 0x73, 0xa3, 0x5, 0x13, 0xeb, 0xfb, 0x46, 0x92, 0xfb, + 0xe, 0xfb, 0xa, 0xfb, 0x13, 0x90, 0x5, 0x75, 0x69, 0x82, 0x66, 0x65, + 0x1a, 0x8c, 0x62, 0x97, 0x61, 0xa1, 0x67, 0x8, 0xf7, 0xe5, 0xf7, 0x16, + 0x15, 0x87, 0xa1, 0x90, 0xa3, 0xa8, 0x90, 0xdb, 0x75, 0x18, 0xf7, 0x5, + 0x7f, 0x8d, 0x95, 0x57, 0xa6, 0x95, 0x95, 0x89, 0xa2, 0x86, 0x95, 0x19, + 0x56, 0xc5, 0xf7, 0xe5, 0x88, 0x5, 0xa2, 0x97, 0x81, 0x7e, 0x7f, 0x83, + 0x81, 0x75, 0x8a, 0x1f, 0x25, 0x86, 0xfb, 0x32, 0x84, 0xcb, 0x3b, 0x5, + 0x74, 0x7, 0x6e, 0x5f, 0x4f, 0x83, 0x5, 0xfb, 0x46, 0x74, 0x15, 0x78, + 0xa2, 0x78, 0xab, 0xa9, 0x9a, 0xf7, 0x45, 0x51, 0x18, 0x72, 0x5a, 0x6e, + 0x85, 0x5, 0xfc, 0x4c, 0xa3, 0x15, 0x7b, 0xa8, 0x83, 0xab, 0xaa, 0x1a, + 0xaa, 0x91, 0xa9, 0x98, 0xa3, 0x1e, 0xf7, 0x10, 0x85, 0xf7, 0xe, 0xf7, + 0xa, 0xf7, 0x35, 0x83, 0xdf, 0x32, 0x90, 0x83, 0x89, 0x7b, 0x87, 0x89, + 0x19, 0x7f, 0x81, 0x7d, 0x8b, 0x78, 0x8f, 0x37, 0xc5, 0x18, 0x95, 0xaf, + 0x7c, 0x8f, 0x82, 0x63, 0x55, 0x7c, 0x8f, 0x7c, 0x5, 0x13, 0xdd, 0xc4, + 0x9d, 0xdd, 0x50, 0x3f, 0xa0, 0x6d, 0x88, 0x77, 0x73, 0x8c, 0x6f, 0x19, + 0x60, 0x6e, 0x5e, 0x84, 0x57, 0x95, 0x89, 0x7c, 0x18, 0xb7, 0x83, 0xb7, + 0x8e, 0xb3, 0x9f, 0x81, 0x78, 0x92, 0x6f, 0xa0, 0x72, 0x72, 0x7b, 0x90, + 0x75, 0x98, 0x78, 0x46, 0x91, 0x18, 0x23, 0xba, 0x5, 0xf7, 0x59, 0x51, + 0x15, 0x7d, 0x99, 0x7a, 0xa7, 0xa4, 0x96, 0xf1, 0x63, 0x18, 0x7a, 0x77, + 0x78, 0x81, 0x5, 0xe, 0x7d, 0xae, 0xe5, 0xab, 0xf7, 0xe3, 0x9c, 0xf7, + 0x43, 0x4c, 0xa, 0xf7, 0xb2, 0xe7, 0xf7, 0xa3, 0xae, 0x17, 0xae, 0xf7, + 0xee, 0x37, 0xa, 0x13, 0x6c, 0x33, 0xa, 0x1f, 0xf7, 0x5e, 0x6b, 0xa, + 0xf7, 0x9c, 0xa9, 0x6, 0x57, 0x8f, 0x5, 0x65, 0x8e, 0x8d, 0x97, 0xa7, + 0x1a, 0xf8, 0x1d, 0x56, 0x7, 0x67, 0x5a, 0x64, 0x6f, 0x4d, 0x82, 0x8, + 0x7a, 0xc5, 0x7, 0xb5, 0x89, 0x89, 0x61, 0x1f, 0xfb, 0x8a, 0x7, 0x74, + 0x81, 0x79, 0x72, 0x89, 0x1e, 0x5a, 0x87, 0x5, 0xe, 0x7d, 0xae, 0x68, + 0xf7, 0x11, 0xf8, 0x70, 0xf7, 0xa, 0x68, 0x4c, 0xa, 0x68, 0xf7, 0x53, + 0xf7, 0xdc, 0xf7, 0x5c, 0xfb, 0x51, 0xf7, 0x51, 0x68, 0xae, 0x13, 0x98, + 0x80, 0x22, 0xa, 0x13, 0x66, 0x0, 0xf7, 0x30, 0x6b, 0xa, 0xa2, 0x7, + 0xd4, 0xbd, 0xc1, 0xc2, 0xb4, 0x1e, 0xc1, 0xb3, 0xcb, 0xbb, 0xd6, 0x1a, + 0xb3, 0x7c, 0xb8, 0x5c, 0x7b, 0x6a, 0x7b, 0x78, 0x1e, 0x7f, 0x91, 0x81, + 0x7f, 0x1a, 0x71, 0x76, 0x77, 0x71, 0x6c, 0x78, 0xa3, 0xa9, 0xa7, 0x99, + 0xa1, 0xa0, 0x9c, 0x1e, 0xa4, 0xaa, 0xb2, 0x91, 0xb1, 0x1b, 0xd8, 0xe2, + 0x68, 0x31, 0xfb, 0x2e, 0xfb, 0x6d, 0x9a, 0x58, 0xfb, 0xf, 0x1f, 0xf7, + 0x60, 0x6, 0xba, 0x8e, 0xb1, 0xc1, 0x96, 0x1f, 0x13, 0x65, 0x0, 0x99, + 0xfb, 0x49, 0x6, 0xe, 0x7d, 0xae, 0xf9, 0x1a, 0x77, 0x1, 0x22, 0xa, + 0xf7, 0x8f, 0x91, 0x15, 0x8c, 0xab, 0x8b, 0x9c, 0xc7, 0xae, 0x68, 0x4f, + 0x54, 0x66, 0x46, 0x4f, 0x78, 0x6d, 0x9d, 0xa3, 0x1e, 0x96, 0x91, 0x96, + 0x96, 0x1a, 0xa7, 0x79, 0xa1, 0x6c, 0x68, 0x77, 0x77, 0x68, 0x68, 0xa5, + 0x71, 0xa7, 0x7b, 0x1e, 0x7a, 0xaa, 0xb0, 0x84, 0xad, 0x1b, 0xe6, 0xf3, + 0xb9, 0xf4, 0xf7, 0x2, 0xfb, 0x19, 0x92, 0x88, 0x91, 0x1f, 0x89, 0x8f, + 0xf4, 0xb1, 0xcd, 0x1a, 0xdc, 0x3c, 0xa0, 0x48, 0x55, 0x2a, 0x79, 0x45, + 0x6f, 0x9f, 0x79, 0xa6, 0xa5, 0x9f, 0xa3, 0xa3, 0x92, 0x8a, 0x92, 0x87, + 0x91, 0x1e, 0xa2, 0xa8, 0x9d, 0x9d, 0xbb, 0xa0, 0x5d, 0x60, 0x50, 0x5b, + 0x6a, 0x54, 0x1e, 0x75, 0x6, 0xe, 0x7d, 0xae, 0xe5, 0xf7, 0x3d, 0x5a, + 0xbc, 0xf8, 0x1a, 0x4c, 0xa, 0xf7, 0xc2, 0xe4, 0xf7, 0x96, 0xae, 0x13, + 0xbe, 0x22, 0xa, 0xf7, 0x1, 0xfb, 0x7, 0x15, 0xf7, 0x55, 0x78, 0x6, + 0x48, 0x7b, 0x8b, 0x6e, 0x88, 0x1e, 0x77, 0x89, 0x5, 0x13, 0xde, 0x6e, + 0xf7, 0x71, 0xa8, 0x7, 0x79, 0x8e, 0x5, 0x54, 0x94, 0x91, 0x89, 0xc9, + 0x1a, 0x13, 0xbe, 0x9e, 0xee, 0xbc, 0x28, 0xf7, 0xc1, 0x33, 0x7, 0xfb, + 0x56, 0xfb, 0xd4, 0x5, 0xce, 0x9e, 0x15, 0xf7, 0x12, 0xf7, 0x63, 0x5, + 0xfb, 0x63, 0x7, 0xe, 0x7e, 0xae, 0xdd, 0xaf, 0xf7, 0x6c, 0xb5, 0xdf, + 0xe1, 0xf1, 0x4c, 0xa, 0xf7, 0x43, 0xb4, 0xf7, 0x33, 0xf7, 0x6, 0xf7, + 0x34, 0xae, 0x17, 0x23, 0xa, 0xae, 0x16, 0x40, 0xa, 0x41, 0xa, 0x1e, + 0x13, 0xf3, 0x80, 0x28, 0xa, 0xfb, 0x24, 0xfb, 0x48, 0x1f, 0x13, 0x77, + 0x0, 0xfb, 0x47, 0xfb, 0x25, 0xf7, 0x24, 0xf7, 0x48, 0x1f, 0xf7, 0x43, + 0x76, 0x15, 0xb4, 0x7a, 0x5, 0xa4, 0x9d, 0xa7, 0xa2, 0xab, 0x1b, 0xc3, + 0xa4, 0x56, 0x5a, 0x57, 0x6a, 0x4d, 0x50, 0x79, 0x6b, 0x93, 0xa2, 0x1f, + 0x98, 0x95, 0x94, 0x9b, 0x1a, 0xaa, 0x71, 0x9a, 0x6f, 0x6b, 0x79, 0x72, + 0x6d, 0x43, 0xef, 0x73, 0xc4, 0xe8, 0xef, 0xc4, 0xf1, 0xe3, 0x3b, 0xba, + 0x3b, 0x66, 0x5d, 0x81, 0x72, 0x6d, 0x1e, 0xf7, 0xd, 0x7, 0xe9, 0x88, + 0x5, 0xb1, 0xca, 0x86, 0xa4, 0xab, 0x1f, 0x9d, 0x99, 0x9c, 0xb7, 0x90, + 0xa3, 0x8, 0x7f, 0x65, 0x63, 0x88, 0x64, 0x1b, 0x51, 0x44, 0x92, 0x98, + 0x4d, 0x1f, 0xe, 0x7d, 0xae, 0xf9, 0x1d, 0xae, 0x1, 0x22, 0xa, 0xf7, + 0x75, 0x78, 0x15, 0xb7, 0xa8, 0xc5, 0xa9, 0xc0, 0x1b, 0xda, 0xc7, 0x56, + 0x39, 0x28, 0x38, 0x4c, 0x2c, 0xfb, 0x1d, 0x4e, 0xf7, 0x1, 0xf7, 0x11, + 0xf7, 0x11, 0xce, 0xf7, 0x11, 0xf7, 0x1c, 0xc1, 0xe6, 0x74, 0x47, 0x6e, + 0x7b, 0x71, 0x6c, 0x71, 0x77, 0x9e, 0xa5, 0x1f, 0x96, 0x90, 0x98, 0x95, + 0x1a, 0xa3, 0x65, 0x96, 0x78, 0x2c, 0x80, 0xfb, 0x9, 0x41, 0x1e, 0x91, + 0xfb, 0xe, 0x15, 0x55, 0xb1, 0x58, 0xc6, 0xc6, 0xa4, 0xc4, 0xbf, 0xba, + 0x76, 0xc7, 0x52, 0x4c, 0x63, 0x57, 0x50, 0x1e, 0xe, 0x7d, 0xae, 0xf8, + 0x6b, 0xe4, 0xe4, 0x4c, 0xa, 0xf7, 0x72, 0xf7, 0x4, 0xfb, 0x4, 0xf7, + 0xc, 0xf7, 0xc7, 0xae, 0x13, 0xf6, 0x22, 0xa, 0xf7, 0x27, 0xcd, 0x15, + 0x9f, 0x6, 0xb8, 0x9f, 0x8d, 0xae, 0xb2, 0x1b, 0xf7, 0x50, 0x6, 0x20, + 0xfb, 0x24, 0x5, 0x67, 0x5c, 0x58, 0x46, 0x4d, 0x1a, 0x65, 0xa1, 0x6f, + 0xb3, 0xae, 0xa2, 0xa2, 0xaf, 0x1e, 0x13, 0xfa, 0xa2, 0x83, 0xa2, 0xa2, + 0x1a, 0xce, 0xbb, 0xd0, 0xab, 0xc2, 0x1e, 0xe7, 0xf7, 0x32, 0x5, 0xfb, + 0xf6, 0x6, 0xe, 0x7d, 0xae, 0xde, 0xb1, 0xf8, 0x30, 0xad, 0xdd, 0x4c, + 0xa, 0xf7, 0x2e, 0xc5, 0x71, 0xd9, 0xf7, 0x1d, 0xbd, 0x60, 0xe3, 0xf7, + 0x2d, 0xae, 0x13, 0xfc, 0xc0, 0xf7, 0xd7, 0xf7, 0xfe, 0x15, 0x55, 0x6c, + 0x5e, 0x6a, 0x46, 0x1a, 0x2f, 0xde, 0x6a, 0xd9, 0xe3, 0xe8, 0xc0, 0xeb, + 0xd5, 0x5c, 0xaf, 0x4e, 0xa9, 0x1e, 0x13, 0xbb, 0x40, 0xb1, 0xa4, 0xa4, + 0xa4, 0xbd, 0x1a, 0xd1, 0x49, 0xa4, 0x51, 0x1e, 0x42, 0x47, 0x5d, 0x3c, + 0x5a, 0xa8, 0x6e, 0xb1, 0x74, 0x1f, 0xf0, 0xbb, 0x15, 0x5b, 0xa4, 0x61, + 0x9d, 0xb4, 0x1a, 0xae, 0xa8, 0xa4, 0xad, 0x1e, 0x13, 0x99, 0x40, 0xb4, + 0xac, 0x74, 0x60, 0x69, 0x79, 0x6f, 0x6e, 0x7b, 0x1f, 0x48, 0x48, 0x15, + 0x13, 0xdc, 0xc0, 0xa0, 0x7f, 0x9e, 0x81, 0x9a, 0x81, 0x8, 0xb8, 0x6f, + 0xa0, 0x76, 0x6a, 0x1a, 0x54, 0x62, 0x6b, 0x57, 0x53, 0x5c, 0xb6, 0xc2, + 0xb4, 0xb2, 0xb5, 0xaf, 0x9f, 0x1e, 0xfb, 0xd6, 0x8e, 0x37, 0xa, 0x13, + 0x8, 0x0, 0x33, 0xa, 0x1f, 0xe, 0x7d, 0xae, 0xde, 0xac, 0x6a, 0xf7, + 0x26, 0xb4, 0xba, 0x98, 0x77, 0xf7, 0x72, 0xae, 0xdd, 0x4c, 0xa, 0xf7, + 0x2d, 0xdc, 0x4c, 0xe8, 0xf7, 0x24, 0xf7, 0x1, 0x23, 0xf3, 0x25, 0xf1, + 0xf7, 0x18, 0xae, 0x13, 0xcf, 0x94, 0x2e, 0xa, 0xf7, 0x5b, 0xf7, 0x5a, + 0x25, 0xa, 0xfb, 0x5a, 0xfb, 0x5b, 0x2a, 0xa, 0xae, 0x16, 0x40, 0xa, + 0xf7, 0x25, 0xf7, 0x48, 0xf7, 0x47, 0x2f, 0xa, 0xfb, 0x47, 0xfb, 0x48, + 0x36, 0xa, 0x1e, 0xf8, 0x31, 0x90, 0x15, 0x13, 0xcf, 0x4c, 0x8d, 0x6, + 0x22, 0x8e, 0x7a, 0xfb, 0x1, 0x32, 0x1b, 0x77, 0x69, 0x95, 0xa3, 0x1f, + 0x94, 0x91, 0x96, 0x98, 0x1a, 0x13, 0xb7, 0x54, 0xa4, 0x78, 0xa0, 0x72, + 0x6d, 0x78, 0x72, 0x6e, 0x48, 0xe2, 0x72, 0xc1, 0xcd, 0xbd, 0x9b, 0xc4, + 0xb2, 0x1e, 0xae, 0xbf, 0x9a, 0xce, 0xc9, 0x1a, 0xf7, 0xa, 0x49, 0xf7, + 0x4, 0xfb, 0x16, 0x1e, 0x13, 0xd7, 0xa4, 0x2a, 0x44, 0x4f, 0x23, 0x39, + 0xbc, 0x58, 0xdb, 0x1f, 0x13, 0xcf, 0x94, 0xbf, 0xbc, 0x9c, 0xb6, 0xa9, + 0x1f, 0xfb, 0x47, 0xe6, 0x15, 0xc2, 0xa3, 0xc3, 0xca, 0x1e, 0x13, 0xd7, + 0xa4, 0xc1, 0xac, 0x57, 0x5a, 0x53, 0x70, 0x51, 0x4c, 0x50, 0x72, 0xc0, + 0xbe, 0x1f, 0xe, 0x7d, 0xae, 0xe4, 0xaf, 0xf7, 0xee, 0x9b, 0xb0, 0xad, + 0xe6, 0x4c, 0xa, 0xf7, 0x42, 0xdf, 0xba, 0xeb, 0xf2, 0xeb, 0xbc, 0xae, + 0x17, 0xf8, 0xb, 0xf7, 0xea, 0x15, 0x13, 0xff, 0xc0, 0x22, 0x9d, 0xfb, + 0x13, 0xf7, 0x15, 0xf7, 0x16, 0x9d, 0xf7, 0x10, 0xf7, 0x0, 0xe9, 0x7a, + 0xf7, 0x23, 0xfb, 0x11, 0xfb, 0x1b, 0x79, 0xfb, 0x16, 0x20, 0x1e, 0xeb, + 0x16, 0xb3, 0x8a, 0xf7, 0x37, 0xc0, 0xc1, 0x88, 0xfb, 0x38, 0x64, 0x66, + 0x8c, 0xfb, 0x33, 0x57, 0x55, 0x8d, 0xf7, 0x32, 0xb1, 0x1e, 0xfc, 0x48, + 0x8f, 0x21, 0xa, 0xf7, 0x8, 0x6b, 0xa, 0xf7, 0x5c, 0xad, 0x6, 0x80, + 0x8c, 0x5, 0x5a, 0x8f, 0x8d, 0x91, 0x9d, 0x1a, 0xf8, 0x2b, 0x54, 0x7, + 0x6f, 0x5b, 0x69, 0x75, 0x58, 0x88, 0x8, 0x7b, 0xa5, 0x7, 0x13, 0x2, + 0x0, 0xab, 0xa5, 0x8f, 0x64, 0x1f, 0xfb, 0xaf, 0x7, 0x76, 0x83, 0x86, + 0x78, 0x8a, 0x1e, 0x6c, 0x89, 0x5, 0xe, 0xfb, 0xb6, 0x58, 0xa3, 0xb8, + 0x76, 0xf7, 0x7c, 0x9a, 0x92, 0x9a, 0xf7, 0xa, 0x9a, 0xb6, 0xa3, 0xf7, + 0x57, 0xa4, 0x86, 0xa3, 0x12, 0xf7, 0x1e, 0xa4, 0xc2, 0x99, 0xae, 0x9a, + 0x8b, 0x9b, 0xa1, 0x9b, 0xa9, 0xa4, 0xac, 0xa4, 0x80, 0xa3, 0x13, 0xfd, + 0xfe, 0xea, 0x88, 0x15, 0x6a, 0xa4, 0xae, 0x7c, 0xaf, 0x1b, 0xab, 0xab, + 0x95, 0x9e, 0xa6, 0x1f, 0xbc, 0xf7, 0x1e, 0xb1, 0xb1, 0xb7, 0xd4, 0xbb, + 0xa6, 0x90, 0xb2, 0x75, 0xb6, 0x8f, 0xb3, 0x90, 0xc4, 0x6e, 0xaa, 0x6c, + 0x8f, 0x74, 0x7f, 0xa1, 0xf7, 0x5b, 0x5, 0xab, 0x8f, 0x76, 0x9d, 0x74, + 0x1b, 0x77, 0x76, 0x7f, 0x70, 0x84, 0x1f, 0x5b, 0xfb, 0x56, 0x71, 0xe6, + 0x79, 0xdb, 0x5, 0x13, 0xfe, 0xfd, 0xa4, 0x85, 0x82, 0x9d, 0x6d, 0x1b, + 0x6b, 0x87, 0x6a, 0x7a, 0x8c, 0x1f, 0x98, 0xfb, 0x8b, 0x74, 0x88, 0x72, + 0x74, 0x78, 0xfb, 0x21, 0xba, 0xfb, 0x7, 0x5, 0xf7, 0x68, 0xf7, 0x29, + 0x15, 0xba, 0xaa, 0x75, 0x7d, 0xa9, 0x9e, 0xa4, 0x95, 0x18, 0x94, 0x9a, + 0x9a, 0x6e, 0x88, 0x78, 0x81, 0x86, 0x65, 0x7e, 0x5b, 0x76, 0x86, 0xa5, + 0x19, 0xfb, 0x6b, 0xfb, 0x92, 0x15, 0xa9, 0xf6, 0x5a, 0xf7, 0x8, 0x9c, + 0xf7, 0x12, 0x99, 0x97, 0xf7, 0x1a, 0xa0, 0x98, 0x89, 0x93, 0x7d, 0x81, + 0x7d, 0x19, 0x79, 0x72, 0x61, 0x7b, 0x6e, 0x80, 0x60, 0xa2, 0x18, 0x85, + 0x7d, 0xb3, 0x77, 0xa2, 0x72, 0x94, 0x6c, 0x91, 0x61, 0x19, 0x99, 0x8e, + 0x85, 0xb3, 0x85, 0xa8, 0x77, 0xa5, 0x19, 0xaa, 0x96, 0xb3, 0x9b, 0x9e, + 0xa5, 0x8, 0x91, 0x93, 0x8d, 0x95, 0x93, 0x1a, 0x9a, 0x80, 0x98, 0x77, + 0x8c, 0x1e, 0x29, 0x7c, 0x7e, 0xf7, 0x92, 0x5, 0x9d, 0x8a, 0x91, 0x90, + 0x90, 0x1b, 0x97, 0x8f, 0x88, 0x77, 0x8f, 0x1f, 0x9d, 0x3b, 0xb1, 0xfb, + 0x19, 0x5, 0xa6, 0x6, 0xc6, 0xf7, 0x80, 0x5, 0x13, 0xfd, 0xfe, 0x98, + 0x8e, 0x94, 0x92, 0x94, 0x1b, 0x95, 0x94, 0x83, 0x7c, 0x89, 0x1f, 0x70, + 0xfb, 0x8a, 0xc5, 0xaa, 0x99, 0x89, 0x9b, 0x79, 0x86, 0x5d, 0x86, 0x61, + 0x7e, 0x76, 0xfb, 0x0, 0x5b, 0x85, 0x8c, 0x85, 0x8e, 0x89, 0x91, 0x19, + 0x85, 0x9d, 0xb5, 0xa2, 0x9c, 0x98, 0xb0, 0xcb, 0x18, 0x7f, 0x91, 0x56, + 0x5c, 0x9b, 0x7c, 0x5, 0x81, 0x84, 0x5c, 0x71, 0x72, 0x1a, 0x88, 0x8b, + 0x88, 0x8c, 0x88, 0x1e, 0x80, 0x8f, 0x99, 0x82, 0x98, 0x1b, 0xa1, 0x93, + 0x5, 0x76, 0x8c, 0x98, 0x82, 0x9d, 0x1b, 0x95, 0x97, 0x8d, 0x8f, 0x98, + 0x1f, 0x64, 0x49, 0x63, 0x65, 0x5c, 0xfb, 0x1e, 0x5, 0x7f, 0x78, 0x71, + 0x83, 0x72, 0x1b, 0x70, 0x71, 0x94, 0x9f, 0x7a, 0x1f, 0xe, 0x7d, 0xef, + 0xf8, 0x9c, 0xee, 0x1, 0xf7, 0xf4, 0xf0, 0x26, 0xa, 0xf7, 0x74, 0xfb, + 0x98, 0x15, 0xac, 0x7, 0xc1, 0x8e, 0xad, 0x8d, 0x91, 0xad, 0x8a, 0xa6, + 0x19, 0xf7, 0x98, 0x7, 0xb7, 0x8c, 0x8e, 0x5e, 0x1e, 0x4a, 0x9f, 0x6, + 0xd0, 0x95, 0xa4, 0xa8, 0xb2, 0xc2, 0x8, 0xd8, 0xfc, 0x39, 0x6, 0x4a, + 0x9b, 0x90, 0xc9, 0x86, 0x1e, 0x9f, 0x8a, 0x5, 0x6a, 0x7, 0xe, 0x7d, + 0xef, 0xf8, 0xa3, 0xe7, 0x12, 0xae, 0xf7, 0x43, 0xfb, 0x43, 0xf7, 0x58, + 0xf7, 0xe8, 0xf7, 0x4b, 0xfb, 0x3f, 0xf7, 0x3f, 0x13, 0xe8, 0x23, 0xa, + 0xf7, 0x43, 0xfb, 0x98, 0x15, 0x89, 0xf6, 0xc2, 0xc6, 0xc8, 0xb8, 0x8, + 0xc7, 0xb8, 0xd1, 0xc0, 0xde, 0x1a, 0xb7, 0x7c, 0xbd, 0x56, 0x7b, 0x65, + 0x79, 0x77, 0x1e, 0x7e, 0x92, 0x80, 0x7d, 0x1a, 0x6e, 0x73, 0x74, 0x6e, + 0x1e, 0x13, 0xd8, 0x69, 0x76, 0xa6, 0xac, 0xd9, 0xe3, 0xaa, 0xcc, 0xe2, + 0xef, 0x67, 0x25, 0x2f, 0x43, 0x63, 0x42, 0x68, 0x1f, 0x54, 0x72, 0x42, + 0x63, 0x74, 0x51, 0x8, 0xf7, 0x75, 0x6, 0x9b, 0x8a, 0x9c, 0x8b, 0x92, + 0x9c, 0xa4, 0xe0, 0x18, 0x13, 0xe4, 0x9d, 0xfb, 0x5c, 0x6, 0xe, 0x7d, + 0xe6, 0xf7, 0xa9, 0x77, 0xba, 0xde, 0x38, 0xf7, 0x55, 0xb2, 0xe7, 0x12, + 0xae, 0xf7, 0x3c, 0xfb, 0x3c, 0xf7, 0x53, 0xe7, 0xf7, 0x2e, 0xfb, 0x24, + 0xf7, 0xf, 0xf2, 0xf7, 0x5c, 0xfb, 0x37, 0xf7, 0x37, 0x13, 0xdc, 0xc0, + 0x23, 0xa, 0xf7, 0xaa, 0x94, 0x15, 0xa5, 0xa3, 0x7, 0xc9, 0xbf, 0xb4, + 0xcc, 0xbb, 0x74, 0xb2, 0x55, 0x69, 0x7a, 0x76, 0x82, 0x1f, 0x83, 0x90, + 0x8a, 0x78, 0x1a, 0x13, 0xea, 0xc0, 0x70, 0x74, 0x72, 0x70, 0x6c, 0x76, + 0xa0, 0xa9, 0xd8, 0xf6, 0xa0, 0xc6, 0xd5, 0xe3, 0x74, 0x31, 0x4a, 0x61, + 0x6d, 0x53, 0x7a, 0x1e, 0x88, 0x8a, 0x7e, 0x89, 0x87, 0x1a, 0x85, 0x93, + 0x8a, 0x8f, 0x99, 0xb5, 0x7e, 0x85, 0x97, 0x1e, 0x13, 0xdd, 0x20, 0xb8, + 0x76, 0xa5, 0x62, 0x5a, 0x1a, 0xfb, 0x5, 0xfb, 0x5, 0x55, 0x28, 0x65, + 0x64, 0x91, 0x9c, 0x69, 0x1e, 0x6a, 0x9c, 0x6b, 0xaa, 0xb4, 0x1a, 0xb1, + 0xa0, 0xa1, 0xb3, 0xac, 0xa0, 0x74, 0x6b, 0x1e, 0x7e, 0x84, 0x80, 0x7e, + 0x1a, 0x71, 0xac, 0x82, 0xa0, 0xcd, 0xb4, 0xcd, 0xc8, 0xcd, 0x65, 0xb2, + 0x48, 0x79, 0x79, 0x90, 0x87, 0x79, 0x1e, 0xe, 0x7d, 0xef, 0x8b, 0xd3, + 0xf8, 0x54, 0xee, 0x12, 0xae, 0xf8, 0xb3, 0xfb, 0x2, 0xf7, 0xb2, 0x13, + 0xf0, 0x29, 0xa, 0x1e, 0x13, 0xe8, 0x24, 0xa, 0x1f, 0x13, 0xf0, 0x27, + 0xa, 0x1f, 0xf7, 0xd, 0xfb, 0x13, 0x15, 0xac, 0x7, 0xf7, 0x6d, 0xf7, + 0xf6, 0x5, 0x13, 0xe8, 0xea, 0xfb, 0xe1, 0x6, 0x13, 0xf0, 0xf7, 0x2, + 0x55, 0x6, 0x13, 0xe8, 0xfb, 0x2, 0x4c, 0x6, 0x78, 0x93, 0x84, 0x9b, + 0x88, 0x1e, 0xbe, 0x82, 0x5, 0x6b, 0xfb, 0xa0, 0xab, 0x7, 0xd2, 0x94, + 0x5, 0xa0, 0x8e, 0x8e, 0xa0, 0x92, 0x1a, 0xc8, 0x7, 0xfb, 0x2b, 0xc1, + 0x15, 0xf7, 0x2b, 0xf7, 0x97, 0x6, 0xe, 0x7b, 0xe7, 0x31, 0xe7, 0xf7, + 0xab, 0x77, 0xce, 0xe8, 0xe9, 0xf7, 0x6, 0x12, 0xae, 0xf7, 0x2e, 0xfb, + 0x2e, 0xf7, 0x57, 0xd5, 0xf7, 0x26, 0xf7, 0x12, 0xf7, 0x46, 0x13, 0xbd, + 0x80, 0x3b, 0xa, 0x13, 0x7d, 0x80, 0x2c, 0xa, 0x13, 0xbb, 0x80, 0xf7, + 0x57, 0x74, 0x15, 0x8c, 0xf7, 0xb7, 0x5, 0x7d, 0xcc, 0xda, 0x82, 0xc8, + 0x1b, 0xb8, 0xb9, 0x8e, 0x99, 0xb6, 0x1f, 0x85, 0x72, 0x79, 0x58, 0x78, + 0x7d, 0x8, 0x6f, 0x66, 0x47, 0x90, 0x5f, 0x1b, 0x23, 0x8f, 0x5, 0xfb, + 0x1a, 0x7, 0xa7, 0xac, 0xbf, 0x96, 0xb4, 0x1b, 0xb4, 0xb4, 0x82, 0x72, + 0xac, 0x1f, 0xb0, 0x71, 0xa3, 0x61, 0x5d, 0x1a, 0x13, 0x7d, 0x80, 0xfb, + 0x7, 0xfb, 0x2, 0x4c, 0x23, 0x4d, 0xfb, 0x3, 0xa6, 0xdb, 0xac, 0x9f, + 0xa7, 0xaf, 0xaa, 0xa7, 0x7a, 0x69, 0x1e, 0x78, 0x81, 0x81, 0x7e, 0x1a, + 0x71, 0xae, 0x82, 0x9f, 0xcc, 0xaf, 0xd0, 0xc4, 0xc1, 0x70, 0xc6, 0x4d, + 0x67, 0x6d, 0x71, 0x70, 0x76, 0x1e, 0xe, 0x7d, 0xe7, 0xf7, 0xa9, 0x77, + 0xd3, 0xb9, 0x5d, 0xf7, 0x3f, 0xae, 0xe7, 0x12, 0xae, 0xf7, 0x29, 0xf7, + 0x7, 0xf7, 0x55, 0x6a, 0xf2, 0x8b, 0xf7, 0x54, 0xfb, 0x3a, 0xf7, 0x3a, + 0x13, 0xee, 0x40, 0x23, 0xa, 0xf7, 0x97, 0x76, 0x15, 0xbc, 0xaa, 0xc3, + 0xac, 0xc5, 0x1b, 0xe3, 0xc8, 0x49, 0x31, 0xfb, 0x3, 0x34, 0x4d, 0x22, + 0x49, 0x52, 0xa0, 0xc0, 0x63, 0x1f, 0x65, 0xbe, 0x80, 0xcc, 0xca, 0x1a, + 0xcb, 0x93, 0xcf, 0xad, 0xc2, 0x1e, 0xcf, 0xb5, 0xc4, 0xa6, 0xda, 0x1b, + 0x13, 0xed, 0x80, 0xc7, 0xed, 0x72, 0x40, 0x6b, 0x7a, 0x6f, 0x68, 0x6e, + 0x75, 0x9f, 0xa8, 0x1f, 0x98, 0x91, 0x99, 0x96, 0x1a, 0x13, 0xde, 0x40, + 0xa5, 0x63, 0x97, 0x76, 0x56, 0x7c, 0x6d, 0x5e, 0x78, 0x1e, 0x7c, 0x5a, + 0x8b, 0x45, 0x83, 0x50, 0x8, 0x90, 0x33, 0x15, 0x4e, 0xa6, 0x4f, 0xd1, + 0xcd, 0xa9, 0xcb, 0xc5, 0xbf, 0x72, 0xcc, 0x4e, 0x48, 0x63, 0x55, 0x4b, + 0x1e, 0xe, 0x7d, 0xe8, 0xf8, 0xa4, 0xed, 0x1, 0xae, 0xf7, 0x38, 0x26, + 0xa, 0xf7, 0x38, 0xd5, 0x15, 0x8c, 0xf7, 0x4f, 0x5, 0xf8, 0x1e, 0x6, + 0x25, 0xfb, 0x44, 0x5, 0x68, 0x4e, 0x56, 0x3f, 0x42, 0x71, 0x94, 0x6c, + 0x77, 0x1a, 0x64, 0x72, 0x71, 0x64, 0x5f, 0x73, 0xaa, 0xb5, 0xcf, 0xc2, + 0xd7, 0xb4, 0xbf, 0x1e, 0xf7, 0xa, 0xf7, 0x34, 0x5, 0xfb, 0x6b, 0x6, + 0x76, 0x80, 0x84, 0x71, 0x84, 0x1f, 0x79, 0x54, 0x5, 0xe, 0x7d, 0xe7, + 0xf8, 0xab, 0xe7, 0x12, 0xae, 0xf7, 0x3f, 0xd7, 0xf7, 0x61, 0xfb, 0x34, + 0xf7, 0x2c, 0xf4, 0xf7, 0x3e, 0x13, 0xec, 0x23, 0xa, 0xf7, 0xad, 0x9d, + 0x15, 0x60, 0xa5, 0x75, 0xab, 0xc2, 0x1a, 0xe1, 0xcd, 0xbd, 0xdb, 0xcb, + 0xd5, 0x6c, 0x3e, 0x53, 0x6f, 0x73, 0x61, 0x70, 0x1e, 0xce, 0x6a, 0xbf, + 0x63, 0x3a, 0x1a, 0x20, 0x29, 0x50, 0x2a, 0x35, 0x2a, 0xb0, 0xf1, 0xd7, + 0xbc, 0xb0, 0xc8, 0xad, 0x1e, 0xf7, 0x4, 0xbf, 0x15, 0xaa, 0x9e, 0x9f, + 0xaa, 0xb0, 0x1a, 0xbb, 0x66, 0xa5, 0x5e, 0x66, 0x6a, 0x66, 0x65, 0x5f, + 0xb7, 0x7f, 0xac, 0x7a, 0x1e, 0x58, 0x34, 0x15, 0x13, 0xf4, 0x61, 0x75, + 0x6e, 0x5d, 0x5b, 0x1a, 0x50, 0xb5, 0x5c, 0xc7, 0xc4, 0xb9, 0xaf, 0xc7, + 0xbc, 0x60, 0xa5, 0x66, 0xa0, 0x1e, 0xe, 0x7d, 0xe7, 0xb0, 0xf7, 0x3e, + 0x5e, 0xb8, 0xf7, 0xdc, 0xe7, 0x12, 0xae, 0xf7, 0x36, 0xfb, 0x36, 0xf7, + 0x51, 0xd1, 0xf7, 0x55, 0xf7, 0x6, 0xf7, 0x2d, 0x13, 0xbb, 0x23, 0xa, + 0xf8, 0x5e, 0x90, 0x15, 0x5e, 0x6a, 0x54, 0x76, 0x54, 0x1b, 0x30, 0x4d, + 0xd3, 0xe9, 0xf7, 0x0, 0xe4, 0xc1, 0xf3, 0xf7, 0x27, 0xcb, 0xfb, 0xf, + 0xfb, 0x1c, 0x47, 0x82, 0x4a, 0x65, 0x52, 0x1f, 0x49, 0x61, 0x51, 0x77, + 0x3f, 0x1b, 0x13, 0xb7, 0x4f, 0x2d, 0xa7, 0xd5, 0xab, 0xa0, 0xa7, 0xad, + 0xa6, 0xa0, 0x73, 0x70, 0x1f, 0x7d, 0x85, 0x7f, 0x81, 0x1a, 0x13, 0xdb, + 0x70, 0xab, 0x80, 0xa0, 0xee, 0x9f, 0xf7, 0x1b, 0xd7, 0x1e, 0xfb, 0x5b, + 0xf7, 0x13, 0x15, 0x52, 0xa7, 0x50, 0xcb, 0xd1, 0xaa, 0xcb, 0xc8, 0xc2, + 0x66, 0xc5, 0x4f, 0x45, 0x71, 0x4e, 0x4e, 0x1e, 0xe, 0x7d, 0xe7, 0x2f, + 0xef, 0xf8, 0x4c, 0xf7, 0x47, 0x28, 0xee, 0x2f, 0xe7, 0x12, 0xae, 0xf7, + 0x55, 0xe8, 0xc4, 0xf1, 0xf7, 0x5, 0xeb, 0xcc, 0x13, 0x67, 0x80, 0x23, + 0xa, 0xf7, 0x15, 0xfb, 0x98, 0x15, 0xb0, 0x7, 0xad, 0x8e, 0x5, 0xb0, + 0x8d, 0x84, 0xa1, 0xa9, 0x1a, 0xf7, 0xb5, 0x7, 0xb5, 0x72, 0x87, 0x67, + 0x1e, 0x6b, 0x9e, 0x6, 0x13, 0x57, 0x80, 0xc4, 0x8e, 0x9b, 0xa3, 0xaa, + 0xc0, 0x8, 0xdd, 0xfc, 0x3e, 0x6, 0x56, 0x88, 0x8e, 0xc2, 0x86, 0x1e, + 0x98, 0x89, 0x5, 0x66, 0x7, 0x83, 0xf7, 0x93, 0x15, 0x13, 0x8f, 0x80, + 0xf7, 0xa, 0x93, 0xf7, 0x2e, 0xf7, 0x2a, 0xf7, 0x1e, 0x9a, 0xfb, 0x3c, + 0x23, 0xfb, 0x0, 0x7e, 0xfb, 0x2f, 0xfb, 0x1f, 0xfb, 0x29, 0x81, 0xf7, + 0x22, 0xf7, 0xd, 0x1e, 0xf1, 0x16, 0x60, 0x89, 0xfb, 0x48, 0xc6, 0xc4, + 0x8a, 0xf7, 0x4b, 0xb3, 0x1e, 0xf7, 0x45, 0x80, 0x81, 0xc4, 0x67, 0x1b, + 0x54, 0x8a, 0xfb, 0x57, 0x64, 0x1f, 0xe, 0x9b, 0xae, 0x76, 0xc3, 0xa4, + 0x86, 0xa5, 0xab, 0x9a, 0x97, 0xa3, 0x96, 0x9d, 0xf7, 0x6, 0xf7, 0x3d, + 0x67, 0xa5, 0x79, 0xa8, 0x70, 0xf7, 0x32, 0x12, 0x9e, 0xa4, 0xf8, 0x3b, + 0x9a, 0xf7, 0x7b, 0x9b, 0xb3, 0xa4, 0x13, 0xbc, 0xbc, 0xcf, 0xb5, 0x15, + 0xf7, 0x1f, 0xc2, 0x5, 0x13, 0xdc, 0xbc, 0x80, 0xaa, 0xb3, 0x7b, 0xac, + 0x1b, 0xb5, 0xb5, 0x9d, 0xa2, 0xb4, 0x1f, 0xd0, 0x70, 0xc9, 0xad, 0xc4, + 0x97, 0xa6, 0x67, 0xae, 0x78, 0xb6, 0xa9, 0x19, 0x8c, 0x8e, 0x8e, 0x86, + 0xdc, 0x32, 0x94, 0x91, 0x68, 0xf7, 0x5, 0x73, 0xb5, 0x9a, 0x8e, 0x98, + 0x94, 0x90, 0x9c, 0x19, 0x86, 0xf7, 0x24, 0xfb, 0xc, 0xf7, 0x18, 0x54, + 0x9f, 0x61, 0x8e, 0x5, 0x13, 0xbc, 0x7c, 0x3a, 0xf7, 0x20, 0x5, 0x40, + 0x6, 0xda, 0xfb, 0x1b, 0x25, 0x91, 0x58, 0x7a, 0xfb, 0x87, 0xfb, 0x34, + 0x58, 0x80, 0x5, 0x73, 0x66, 0x83, 0x53, 0x5f, 0x1a, 0x5c, 0x9f, 0x4b, + 0xa8, 0x67, 0x1e, 0x13, 0xbe, 0x3c, 0xf8, 0xec, 0xf7, 0xc0, 0x15, 0x3d, + 0xf7, 0x1b, 0xa0, 0x8a, 0xba, 0x79, 0xf7, 0x2, 0xfb, 0xc, 0x8e, 0xfb, + 0x16, 0x86, 0x82, 0x83, 0x8a, 0x83, 0x8c, 0x19, 0x69, 0xc5, 0x5, 0x94, + 0x95, 0x8f, 0x98, 0x97, 0x1a, 0xa2, 0x78, 0x9f, 0x73, 0x8f, 0x1e, 0x59, + 0xfb, 0x4b, 0x15, 0x78, 0xd3, 0xb2, 0x93, 0xc3, 0x29, 0x86, 0x7a, 0x6b, + 0x79, 0x74, 0xaa, 0x7b, 0xa1, 0x19, 0xfb, 0x20, 0x8c, 0x15, 0x81, 0x93, + 0x87, 0x93, 0x92, 0x1a, 0x99, 0x96, 0x97, 0x9e, 0x94, 0x1e, 0x8b, 0xc7, + 0x91, 0xa9, 0x90, 0x1e, 0x9e, 0x44, 0x54, 0x7f, 0x5, 0xfc, 0x7a, 0x44, + 0x15, 0x75, 0xaf, 0x7d, 0xb0, 0xb7, 0x1a, 0xb8, 0x8e, 0xaf, 0x9e, 0xac, + 0x1e, 0xb9, 0x95, 0x5, 0x13, 0xbd, 0x3c, 0xf7, 0x87, 0xf7, 0x36, 0xb8, + 0x98, 0xf7, 0x5, 0x85, 0xd5, 0xfb, 0x14, 0x5a, 0x93, 0x39, 0xad, 0x92, + 0xac, 0x79, 0x8e, 0x7b, 0x44, 0xfb, 0x24, 0x7d, 0x8c, 0x7c, 0xf7, 0x6a, + 0x9f, 0xf7, 0x4c, 0x70, 0x5, 0x9e, 0x88, 0x95, 0x7b, 0x7b, 0x1a, 0x81, + 0x88, 0x81, 0x82, 0x84, 0x1e, 0x77, 0x42, 0x2a, 0x7d, 0x4f, 0x1b, 0x6d, + 0x98, 0x65, 0x59, 0x43, 0x69, 0x4a, 0x89, 0x3e, 0x9d, 0x19, 0x88, 0x7c, + 0xd7, 0x79, 0xca, 0x8d, 0xd1, 0xa8, 0x19, 0xa6, 0x63, 0x5, 0x13, 0xdc, + 0xbc, 0x79, 0x6a, 0x63, 0x78, 0x65, 0x1b, 0x6c, 0x5f, 0x9d, 0x95, 0x6e, + 0x1f, 0xf7, 0x7b, 0x99, 0x15, 0x6f, 0xb4, 0x8e, 0x8d, 0xa0, 0xa6, 0xbe, + 0x92, 0x5, 0x82, 0x83, 0x82, 0x81, 0x7b, 0x1a, 0x7b, 0x95, 0x7f, 0x98, + 0x82, 0x1e, 0xbf, 0x81, 0x64, 0x76, 0x5, 0xe, 0x7d, 0xae, 0xf8, 0x52, + 0xa0, 0xf7, 0x4a, 0x74, 0xa, 0xf7, 0xbe, 0xc9, 0xf7, 0xb5, 0xae, 0x3, + 0x22, 0xa, 0xf7, 0xbe, 0x6b, 0xa, 0xc9, 0xf8, 0x6a, 0x51, 0x6, 0x7e, + 0x4a, 0x71, 0x70, 0x4d, 0x8a, 0x8, 0x76, 0xec, 0x7, 0xe, 0x7d, 0xae, + 0xe5, 0xbe, 0xf8, 0xb, 0xbd, 0xde, 0x74, 0xa, 0xf7, 0x3f, 0xc7, 0xf7, + 0x47, 0xcc, 0xf7, 0x42, 0xae, 0x3, 0x22, 0xa, 0xf7, 0x46, 0x6b, 0xa, + 0xf7, 0xbe, 0xbe, 0xfb, 0x7e, 0x6, 0x9a, 0xae, 0xae, 0xa0, 0xa9, 0x9f, + 0x8, 0xd7, 0xbe, 0xd8, 0xbb, 0xf2, 0x1a, 0xe4, 0x44, 0xc5, 0x35, 0x38, + 0x4a, 0x4d, 0xfb, 0x1, 0x8c, 0x1e, 0xc7, 0x86, 0x5, 0xd5, 0xa3, 0xbf, + 0xc9, 0xc6, 0xad, 0x5e, 0x52, 0x3d, 0x50, 0x66, 0x51, 0x65, 0x1e, 0x54, + 0x68, 0x4e, 0x58, 0x45, 0x1a, 0xe, 0x7d, 0xae, 0xde, 0xbf, 0xf8, 0x15, + 0xba, 0xdd, 0x4c, 0xa, 0xf8, 0x25, 0xc9, 0x5b, 0xc8, 0xf7, 0x41, 0xae, + 0x13, 0xfb, 0x22, 0xa, 0xf7, 0x4b, 0x30, 0x15, 0xfb, 0x3, 0x8a, 0xcf, + 0x63, 0xd3, 0x1b, 0xdb, 0xd5, 0xc0, 0xdf, 0xc2, 0x71, 0xb9, 0x54, 0x99, + 0x1f, 0x8d, 0x7, 0x13, 0xfd, 0xba, 0x9d, 0xa0, 0xa8, 0xbe, 0x1a, 0xdb, + 0x47, 0xbf, 0x40, 0x40, 0x50, 0x5c, 0x3f, 0x8d, 0x1e, 0xc1, 0x85, 0x5, + 0xbc, 0x89, 0xa5, 0xac, 0xc0, 0x1b, 0xc1, 0xa7, 0x6b, 0x56, 0x53, 0x5e, + 0x71, 0x58, 0x1f, 0x72, 0x8c, 0x5, 0x63, 0x7, 0x13, 0xfb, 0xc8, 0x92, + 0xd5, 0x6f, 0x42, 0x1a, 0x52, 0x66, 0x6f, 0x53, 0x56, 0x64, 0xb7, 0xc2, + 0x92, 0x1e, 0xe, 0x7d, 0xae, 0xf7, 0x64, 0xc0, 0xf8, 0x18, 0x74, 0xa, + 0xf7, 0xe6, 0xc2, 0xf7, 0x94, 0xae, 0x3, 0x22, 0xa, 0xf7, 0x16, 0xfb, + 0x9, 0x15, 0xf7, 0x64, 0xfb, 0xa, 0xc2, 0xf7, 0xa, 0xda, 0xc0, 0x3c, + 0xf7, 0xc5, 0x6, 0x58, 0x8c, 0xfb, 0x68, 0xfb, 0xc6, 0x5, 0xc3, 0x16, + 0xf7, 0x2c, 0xf7, 0x75, 0x5, 0xfb, 0x75, 0x7, 0xe, 0x7d, 0xae, 0xde, + 0xbd, 0xf7, 0x70, 0xc2, 0xee, 0xc0, 0xe4, 0x4c, 0xa, 0xf7, 0x54, 0xbf, + 0x5e, 0xbe, 0xf7, 0x41, 0xca, 0xf7, 0x37, 0xae, 0x13, 0xfe, 0xc0, 0x22, + 0xa, 0xf7, 0x54, 0xfb, 0xe, 0x15, 0x42, 0x8f, 0xc5, 0x5c, 0xd3, 0x1b, + 0xf2, 0xc4, 0xd4, 0xec, 0xdc, 0x55, 0xd5, 0x35, 0x1f, 0x13, 0xfd, 0xc0, + 0x66, 0x63, 0x82, 0x69, 0x78, 0x1f, 0xf7, 0x22, 0xf7, 0x76, 0xc0, 0xfb, + 0xa9, 0xfb, 0xab, 0x7, 0x13, 0xfe, 0xc0, 0xb8, 0x6, 0xb9, 0x93, 0xa9, + 0xa5, 0xbd, 0x1b, 0xc9, 0xa8, 0x60, 0x54, 0x48, 0x77, 0x54, 0x3d, 0x5f, + 0x64, 0xb0, 0xb8, 0x8d, 0x1f, 0xe, 0x7d, 0xae, 0xde, 0xb9, 0xf7, 0x67, + 0xbf, 0xf7, 0x10, 0xbe, 0xdd, 0x4c, 0xa, 0xf7, 0x37, 0xc3, 0x53, 0xcd, + 0xf7, 0x45, 0xc3, 0xf7, 0x4f, 0xae, 0x13, 0xfe, 0xc0, 0x22, 0xa, 0xf7, + 0x6f, 0x8a, 0x15, 0xe6, 0x9f, 0xf0, 0xe1, 0xbc, 0x9b, 0x70, 0x61, 0x94, + 0x1e, 0xbd, 0x98, 0x5, 0xcf, 0x81, 0x5f, 0xb2, 0x46, 0x1b, 0x53, 0x53, + 0x65, 0x58, 0x73, 0x1f, 0x75, 0x5b, 0x86, 0x54, 0x57, 0x1a, 0x59, 0x8f, + 0x4c, 0xa1, 0x5e, 0x1e, 0x58, 0xa3, 0xbd, 0x6c, 0xc4, 0x1b, 0xe4, 0xc0, + 0xda, 0xde, 0xd9, 0x5a, 0xd0, 0x38, 0x73, 0x74, 0x86, 0x7f, 0x78, 0x1f, + 0x77, 0x80, 0x7c, 0x7a, 0x81, 0x74, 0x8, 0x13, 0xfd, 0xc0, 0x95, 0x3b, + 0x15, 0xbf, 0xac, 0xb7, 0xc2, 0xcb, 0xa4, 0x5d, 0x53, 0x56, 0x76, 0x53, + 0x4d, 0x4b, 0x6d, 0xc3, 0xc6, 0x1e, 0xe, 0x7d, 0xae, 0xf8, 0x8e, 0xc1, + 0xe4, 0x74, 0xa, 0xf7, 0x3b, 0xf7, 0xcc, 0xf7, 0x3e, 0xae, 0x3, 0x22, + 0xa, 0xf7, 0x72, 0x6b, 0xa, 0xce, 0x6, 0xa4, 0xf7, 0x2e, 0xd7, 0xf7, + 0x1f, 0xe4, 0xf7, 0x13, 0x8, 0xbd, 0xfb, 0xcc, 0x55, 0xf7, 0x89, 0x7, + 0x29, 0xfb, 0xb, 0x48, 0xfb, 0x23, 0x72, 0xfb, 0x2e, 0x8, 0xe, 0x7d, + 0xae, 0xe8, 0xbf, 0xf7, 0x37, 0xc1, 0xf7, 0x32, 0xba, 0xdd, 0x4c, 0xa, + 0xf7, 0x44, 0xc3, 0x64, 0xc3, 0xf7, 0x35, 0xbf, 0x5e, 0xc3, 0xf7, 0x44, + 0xae, 0x13, 0xfe, 0x60, 0xf7, 0xe3, 0xf7, 0xfb, 0x15, 0x55, 0x7c, 0x68, + 0x64, 0x50, 0x1a, 0x39, 0xc9, 0x59, 0xdc, 0xdc, 0xd4, 0xb6, 0xe1, 0xc4, + 0x6d, 0xb6, 0x54, 0x9b, 0x1e, 0x8d, 0x7, 0x13, 0xfd, 0xa0, 0xbc, 0x9a, + 0xa4, 0xae, 0xc0, 0x1a, 0xd5, 0x50, 0xbd, 0x43, 0x43, 0x49, 0x5b, 0x3e, + 0x5c, 0xa7, 0x63, 0xb7, 0x7c, 0x1e, 0x7b, 0xf2, 0x15, 0xba, 0xab, 0xa9, + 0xba, 0xbd, 0xab, 0x6f, 0x5a, 0x58, 0x6b, 0x6d, 0x58, 0x56, 0x72, 0xaa, + 0xbd, 0x1e, 0x13, 0xfe, 0x60, 0x7a, 0xfb, 0x74, 0x15, 0xbe, 0xad, 0xb1, + 0xc0, 0xc4, 0xb4, 0x74, 0x4f, 0x52, 0x69, 0x74, 0x51, 0x56, 0x63, 0xa0, + 0xc0, 0x1e, 0xfb, 0x9f, 0xf5, 0x21, 0xa, 0xe, 0x7d, 0xae, 0xde, 0xbd, + 0xf7, 0x13, 0xbf, 0xf7, 0x67, 0xb7, 0xdd, 0x4c, 0xa, 0xf7, 0x42, 0xc3, + 0x67, 0xbc, 0xf7, 0x39, 0xcd, 0x53, 0xc3, 0xf7, 0x43, 0xae, 0x13, 0xfd, + 0x60, 0x22, 0xa, 0xf7, 0x56, 0xfb, 0x20, 0x15, 0x4a, 0x93, 0xb6, 0x66, + 0xce, 0x1b, 0xc9, 0xc1, 0xb5, 0xc2, 0xa2, 0x1f, 0x9c, 0xb3, 0x91, 0xd1, + 0xb7, 0x1a, 0xf1, 0x71, 0xf7, 0x17, 0xfb, 0x14, 0x1e, 0x13, 0xfe, 0x60, + 0x32, 0x52, 0x41, 0x36, 0x3b, 0xba, 0x47, 0xe0, 0xbd, 0xb6, 0xa1, 0xb9, + 0x9e, 0x1f, 0x43, 0x83, 0xfb, 0xf, 0x29, 0x1e, 0x13, 0xfd, 0xa0, 0x67, + 0x70, 0xa7, 0xad, 0x85, 0x1f, 0xd7, 0xf7, 0x9, 0x15, 0x13, 0xfe, 0xa0, + 0x4e, 0x6f, 0xb3, 0xc3, 0xc8, 0xa0, 0xc1, 0xd1, 0xc4, 0xa9, 0x53, 0x58, + 0x52, 0x70, 0x5c, 0x4d, 0x1f, 0xe, 0x7d, 0xae, 0xdd, 0xb8, 0xf8, 0x1e, + 0xb8, 0xde, 0x74, 0xa, 0xf7, 0x3a, 0xc8, 0xbc, 0xc3, 0xf7, 0x44, 0xc3, + 0xe0, 0xae, 0x3, 0xf8, 0x26, 0x4d, 0xa, 0xc4, 0x93, 0xf7, 0x1f, 0xdd, + 0xe2, 0x8a, 0xfb, 0x1b, 0x4e, 0x53, 0x85, 0xfb, 0x22, 0x3b, 0x35, 0x87, + 0xf7, 0x1d, 0xc8, 0x1e, 0x53, 0x16, 0x34, 0xab, 0xfb, 0x30, 0xf7, 0x6, + 0xf7, 0x17, 0x96, 0xf7, 0x23, 0xef, 0xeb, 0x79, 0xf7, 0x25, 0xfb, 0x10, + 0xfb, 0x18, 0x7d, 0xfb, 0x21, 0x27, 0x1e, 0xfb, 0xcb, 0x16, 0x20, 0xa, + 0xf7, 0x3a, 0x6b, 0xa, 0xc8, 0xf8, 0x6a, 0x58, 0x6, 0x85, 0x56, 0x65, + 0x69, 0x5b, 0x8c, 0x8, 0x6d, 0xdd, 0x7, 0xe, 0xd3, 0xa0, 0x76, 0xf7, + 0x5a, 0x96, 0xf8, 0x51, 0x77, 0x1, 0xf3, 0xf9, 0x2c, 0x3, 0xf8, 0xaa, + 0xf2, 0x15, 0xf7, 0x73, 0x24, 0x96, 0x96, 0xfb, 0x10, 0xf7, 0x74, 0xfc, + 0x37, 0xf8, 0x37, 0x75, 0x75, 0xf8, 0x39, 0xfc, 0x39, 0x6f, 0x89, 0xfc, + 0x2c, 0xf8, 0x2c, 0x80, 0x81, 0xf8, 0x2b, 0xfc, 0x2b, 0x7d, 0x68, 0xfc, + 0x36, 0xf8, 0x35, 0x5b, 0x5a, 0x5, 0xf8, 0x5c, 0xfc, 0x17, 0x15, 0xa0, + 0x97, 0x9a, 0xb2, 0xac, 0x8e, 0xd8, 0xfb, 0x17, 0x82, 0x82, 0x5, 0xe, + 0x7d, 0x72, 0xa, 0x1, 0xf7, 0xf6, 0xe5, 0x26, 0xa, 0xf7, 0xd3, 0x6b, + 0xa, 0xf7, 0xf8, 0x2a, 0xae, 0x7, 0xd2, 0x8c, 0xa8, 0xa1, 0x97, 0xd1, + 0x8, 0xd6, 0xfc, 0x78, 0x6, 0xe, 0x7d, 0xf7, 0x11, 0xf8, 0x7e, 0xf3, + 0x12, 0xae, 0xf7, 0x54, 0xfb, 0x54, 0xf7, 0x5c, 0xdb, 0xf7, 0x2c, 0xe7, + 0xf7, 0x57, 0x13, 0xec, 0x23, 0xa, 0x13, 0xdc, 0xf7, 0x5c, 0x6b, 0xa, + 0x89, 0xec, 0xce, 0xbf, 0xc5, 0xb0, 0x8, 0xc2, 0xae, 0xc1, 0xaf, 0xd4, + 0x1a, 0xbd, 0x72, 0xb1, 0x54, 0x54, 0x79, 0x5e, 0x46, 0x8c, 0x1e, 0x13, + 0xec, 0x33, 0x93, 0x5, 0xf7, 0x8, 0xd5, 0xc9, 0xe3, 0xe6, 0xda, 0x4a, + 0x2c, 0x22, 0x37, 0x5c, 0x3d, 0x57, 0x1e, 0x74, 0x7c, 0x6a, 0x77, 0x80, + 0x71, 0x8, 0xf7, 0x7a, 0x4a, 0x6, 0xe, 0x7d, 0xf7, 0xa, 0xcd, 0xf7, + 0x36, 0xc3, 0xf7, 0x25, 0xd0, 0xf2, 0x1, 0xf7, 0xd4, 0xf7, 0x2b, 0xe3, + 0xf7, 0x57, 0x26, 0xa, 0xf7, 0x60, 0x40, 0x15, 0xdc, 0x8c, 0x5, 0x4e, + 0x8f, 0x61, 0xcf, 0x8c, 0x1e, 0xbf, 0x8c, 0xa6, 0xab, 0xbd, 0x1a, 0xc3, + 0x66, 0xa2, 0x58, 0x1e, 0x5c, 0x88, 0x5, 0xc9, 0x7, 0xb2, 0x88, 0x5, + 0xbd, 0xac, 0xa4, 0xbf, 0xb3, 0x79, 0xa7, 0x5f, 0x50, 0x7e, 0x6b, 0x59, + 0x8d, 0x1f, 0x39, 0x94, 0x5, 0xe8, 0x89, 0xce, 0xbc, 0xe3, 0x1b, 0xd7, + 0xd5, 0x56, 0x3a, 0x5c, 0x79, 0x68, 0x60, 0x75, 0x1f, 0xbc, 0x71, 0xa3, + 0x6e, 0x4f, 0x1a, 0x30, 0x3e, 0x55, 0x36, 0x3f, 0x39, 0xb4, 0xe1, 0x1e, + 0xe, 0x7d, 0xf7, 0x11, 0xf8, 0x80, 0xf1, 0x12, 0xf7, 0x4e, 0xf7, 0xb7, + 0xfb, 0x5e, 0xf7, 0xb, 0x13, 0xd0, 0x23, 0xa, 0x13, 0xe0, 0xf7, 0x2b, + 0xfb, 0x9, 0x15, 0xc7, 0x7, 0xf7, 0x5f, 0xf7, 0xce, 0x5, 0xe3, 0xfb, + 0xc7, 0xdf, 0x48, 0x37, 0xfb, 0xa, 0x6, 0x13, 0xd0, 0x38, 0xf7, 0xa, + 0x6, 0x13, 0xe0, 0x13, 0xd0, 0xfb, 0xb, 0xce, 0x15, 0xf7, 0xb, 0xf7, + 0x56, 0x6, 0xe, 0x7d, 0xf7, 0xa, 0xf7, 0xf1, 0xd6, 0xce, 0xf7, 0x2, + 0x1, 0xf8, 0xce, 0xf7, 0x4c, 0x26, 0xa, 0xf7, 0x69, 0xfb, 0x2, 0x15, + 0xda, 0x9d, 0x5, 0x61, 0x87, 0xa5, 0x66, 0xb9, 0x1b, 0xd0, 0x9b, 0xc8, + 0xc5, 0xbb, 0x74, 0xb4, 0x54, 0x5a, 0x77, 0x6e, 0x61, 0x84, 0x1f, 0x44, + 0xf7, 0xaf, 0xf7, 0xbf, 0x48, 0xfb, 0x70, 0x2d, 0x6, 0x97, 0xa4, 0xa2, + 0x92, 0xa7, 0x1b, 0xef, 0xc7, 0x44, 0x2a, 0x27, 0x42, 0x3a, 0x26, 0x3c, + 0x49, 0xbd, 0xdd, 0x88, 0x1f, 0xe, 0x7d, 0xf7, 0xa, 0xd1, 0xf7, 0x4e, + 0xce, 0xf5, 0xd0, 0xf2, 0x1, 0xae, 0xf7, 0x4c, 0xe5, 0xf7, 0x2e, 0x26, + 0xa, 0xf7, 0xa0, 0xb9, 0x15, 0xa4, 0xa9, 0xa7, 0x95, 0xb2, 0x1b, 0xe4, + 0xc4, 0x47, 0x34, 0x31, 0x4d, 0x3d, 0x2d, 0xfb, 0x20, 0x6c, 0xf7, 0x1a, + 0xf7, 0x5, 0xf7, 0x4, 0xb2, 0xf7, 0x1f, 0xf7, 0x1e, 0xd7, 0xbf, 0x61, + 0x40, 0x95, 0x1f, 0x3f, 0x76, 0x5, 0xb0, 0x81, 0x86, 0xab, 0x5a, 0x1b, + 0x45, 0x78, 0x36, 0x53, 0x89, 0x1f, 0x91, 0xfb, 0xc, 0x15, 0x58, 0xa5, + 0x5c, 0xc5, 0xc2, 0x9a, 0xb9, 0xb8, 0xbb, 0x79, 0xba, 0x51, 0x59, 0x6f, + 0x5f, 0x5f, 0x1e, 0xe, 0x7d, 0x72, 0xa, 0x1, 0xf7, 0x73, 0xf7, 0xe8, + 0x26, 0xa, 0xf7, 0x9a, 0x6b, 0xa, 0xa2, 0xf7, 0x2c, 0xc1, 0xf7, 0x21, + 0xed, 0xf7, 0xf, 0x8, 0xfb, 0x8d, 0xcf, 0xf7, 0xe8, 0x4d, 0x6, 0x32, + 0xfb, 0x17, 0x3d, 0xfb, 0x18, 0x73, 0xfb, 0x33, 0x8, 0xe, 0x7d, 0xf7, + 0xa, 0xd0, 0xf7, 0x2a, 0xda, 0xf7, 0x16, 0xd0, 0xf3, 0x12, 0xae, 0xf7, + 0x59, 0xde, 0xf7, 0x33, 0xfb, 0x24, 0xf7, 0x1c, 0xe6, 0xf7, 0x59, 0x13, + 0xfb, 0x23, 0xa, 0xf7, 0xab, 0xa0, 0x15, 0x64, 0x9c, 0x72, 0xb5, 0xb4, + 0x1a, 0xdf, 0xd4, 0xbd, 0xd9, 0xd7, 0xd0, 0x56, 0x3a, 0x5b, 0x76, 0x6a, + 0x5e, 0x78, 0x1e, 0xbe, 0x6f, 0xa5, 0x6d, 0x4d, 0x1a, 0x34, 0x3d, 0x53, + 0x38, 0x33, 0x3f, 0xbc, 0xe9, 0xc1, 0xaa, 0xbb, 0xbe, 0x9d, 0x1e, 0x9b, + 0xef, 0x15, 0x62, 0xa2, 0x73, 0xb7, 0xb9, 0xa2, 0xa1, 0xb6, 0xb5, 0x75, + 0xa2, 0x5e, 0x5b, 0x76, 0x75, 0x60, 0x1e, 0x13, 0xfd, 0x7c, 0xfb, 0x70, + 0x15, 0x5c, 0xaa, 0x70, 0xbc, 0xc0, 0xa5, 0xa4, 0xbc, 0xbb, 0x6f, 0xa7, + 0x5a, 0x56, 0x6e, 0x72, 0x58, 0x1e, 0xe, 0x7d, 0xf7, 0xa, 0xd1, 0xf6, + 0xcf, 0xf7, 0x4d, 0xce, 0xf3, 0x1, 0xae, 0xf7, 0x57, 0xdf, 0xf7, 0x32, + 0xe0, 0xf7, 0x59, 0x26, 0xa, 0xf7, 0x6a, 0xfb, 0x14, 0x15, 0xd7, 0x99, + 0x5, 0x6c, 0x90, 0x9b, 0x70, 0xaf, 0x1b, 0xd4, 0x99, 0xe0, 0xc2, 0x8e, + 0x1f, 0x73, 0x72, 0x67, 0x82, 0x68, 0x1b, 0x30, 0x54, 0xce, 0xe3, 0xe7, + 0xcc, 0xd4, 0xea, 0xf7, 0x18, 0xae, 0xfb, 0xe, 0xfb, 0x3, 0x58, 0x86, + 0x3b, 0x72, 0x5e, 0x1f, 0x52, 0x6c, 0x54, 0x6c, 0x4b, 0x1b, 0x45, 0x57, + 0xb7, 0xd1, 0x85, 0x1f, 0xcc, 0xf7, 0x68, 0x15, 0x5c, 0xa3, 0x69, 0xbe, + 0xc3, 0xa1, 0xb4, 0xbc, 0xbc, 0x71, 0xb9, 0x53, 0x4e, 0x81, 0x51, 0x5d, + 0x1e, 0xe, 0x7d, 0xf7, 0x9, 0xfb, 0x9, 0x72, 0xa, 0x23, 0xf3, 0x12, + 0xae, 0xf7, 0x4f, 0xf7, 0x53, 0xf7, 0x29, 0xdf, 0xf7, 0x0, 0x13, 0x6e, + 0xf7, 0x72, 0xf7, 0x3, 0x15, 0xf7, 0xf6, 0x39, 0xad, 0x7, 0xc1, 0x8a, + 0xad, 0xb0, 0x90, 0xc7, 0x8, 0xd9, 0xfc, 0x78, 0x6, 0xfb, 0xa8, 0xf7, + 0x7f, 0x15, 0x2c, 0xa, 0xf7, 0xbb, 0x97, 0x15, 0x13, 0x9e, 0xf7, 0x2, + 0x9d, 0xf7, 0x19, 0xf7, 0x21, 0xf7, 0x1a, 0xa2, 0xfb, 0x1d, 0x21, 0xfb, + 0x2, 0x7a, 0xfb, 0x25, 0xfb, 0x20, 0xfb, 0xe, 0x66, 0xf7, 0x33, 0xeb, + 0x1e, 0xde, 0x16, 0x59, 0x8e, 0xfb, 0x26, 0xd4, 0xce, 0x91, 0xf7, 0x2a, + 0xb9, 0xbf, 0x8c, 0xf7, 0x1c, 0x41, 0x46, 0x84, 0xfb, 0x1f, 0x5a, 0x1e, + 0xe, 0xe9, 0xf7, 0x89, 0xd0, 0x49, 0xf7, 0xb, 0x6c, 0xce, 0x7c, 0xaa, + 0x1, 0xa2, 0xf7, 0x8c, 0x15, 0xf8, 0xf5, 0x6, 0xf7, 0x7a, 0xe0, 0x5, + 0x9a, 0x7, 0xfb, 0x8a, 0xd2, 0x5, 0xfc, 0xe5, 0x6c, 0xf8, 0xe8, 0x6, + 0x78, 0x76, 0x5, 0xfc, 0xd5, 0x7c, 0xf8, 0xd3, 0x6, 0x9a, 0x68, 0x5, + 0xfc, 0xe2, 0x6, 0xf8, 0xe8, 0x77, 0x15, 0x92, 0xa2, 0x7a, 0xb2, 0xa0, + 0xa4, 0xf7, 0x27, 0x65, 0x5, 0x7e, 0x7, 0xe, 0xc2, 0xa3, 0x76, 0xf7, + 0xb9, 0xe2, 0xf7, 0xba, 0x77, 0x1, 0xc1, 0xf9, 0xb9, 0x3, 0xc1, 0xf7, + 0xb5, 0x15, 0xf7, 0xc4, 0x9a, 0x5, 0xfb, 0xc0, 0x7, 0x8d, 0x8a, 0xf8, + 0x87, 0xf7, 0xe4, 0x75, 0xa, 0xfc, 0x87, 0xf7, 0xe4, 0x89, 0x8a, 0x5, + 0xfb, 0xc0, 0x7, 0xfb, 0xc4, 0x9a, 0x5, 0xe, 0x8a, 0xf7, 0x41, 0x76, + 0xf7, 0x4b, 0xa2, 0xf7, 0x4a, 0x54, 0xa, 0xf7, 0xe3, 0x15, 0xf8, 0xbe, + 0x6, 0x61, 0x57, 0x65, 0x4d, 0x8e, 0x46, 0xca, 0xe2, 0xf7, 0x12, 0xd1, + 0xf1, 0xb0, 0x25, 0xb0, 0xfb, 0x10, 0xd1, 0x4a, 0xe2, 0x8a, 0x4c, 0xab, + 0x3e, 0xb9, 0x61, 0x8, 0xfc, 0xbe, 0x6, 0xe, 0x49, 0xa, 0xf7, 0xba, + 0xfb, 0x8c, 0x5, 0xfb, 0x4b, 0xfb, 0x44, 0x15, 0xf7, 0x78, 0xf7, 0x44, + 0x5, 0xf8, 0x39, 0x6, 0xe, 0xf7, 0x45, 0xf7, 0x41, 0x76, 0xf7, 0x4b, + 0xa2, 0xf7, 0x4a, 0x77, 0x1, 0xad, 0x4d, 0xa, 0xf2, 0x65, 0xed, 0x45, + 0xcc, 0x35, 0x8c, 0xca, 0x6b, 0xd6, 0x5d, 0xb8, 0x8, 0xf8, 0xce, 0x6, + 0x61, 0x57, 0x64, 0x4d, 0x8f, 0x46, 0xca, 0xe2, 0xf0, 0xd1, 0xf0, 0xb0, + 0x25, 0xaf, 0x29, 0xd2, 0x4a, 0xe2, 0x8a, 0x4c, 0xaa, 0x3d, 0xba, 0x62, + 0x8, 0xfc, 0xce, 0x6, 0xb5, 0xbd, 0xb1, 0xc9, 0x88, 0xd1, 0x4c, 0x33, + 0x26, 0x45, 0x25, 0x67, 0x8, 0xe, 0xfc, 0x11, 0x23, 0x76, 0xfa, 0x45, + 0x77, 0x1, 0xf7, 0x6d, 0xa2, 0x3, 0xae, 0xf7, 0x1e, 0x15, 0xe2, 0x4c, + 0xd1, 0x28, 0xb0, 0x26, 0xaf, 0xf1, 0xd2, 0xeb, 0xe1, 0xcc, 0x4d, 0x8c, + 0x3d, 0x6c, 0x61, 0x5c, 0x8, 0xf8, 0xce, 0x7, 0xbe, 0x61, 0xc9, 0x65, + 0xd0, 0x8e, 0x34, 0xca, 0x45, 0xf0, 0x67, 0xf1, 0x65, 0x24, 0x45, 0x29, + 0x35, 0x4a, 0xca, 0x8a, 0xd6, 0xab, 0xb7, 0xb9, 0x8, 0xfc, 0xce, 0x7, + 0x58, 0xb5, 0x4d, 0xb2, 0x46, 0x87, 0x8, 0xe, 0xe0, 0xcb, 0x76, 0xf7, + 0x97, 0xd5, 0xf7, 0x98, 0x77, 0x1, 0xc3, 0xf9, 0xcc, 0x3, 0xc3, 0xf7, + 0xbc, 0x15, 0xf8, 0x12, 0x98, 0x5, 0xfb, 0x9d, 0x7, 0x8c, 0x8a, 0xf8, + 0x4d, 0xf7, 0xbc, 0x75, 0xa, 0xfc, 0x4d, 0xf7, 0xbb, 0x8a, 0x8a, 0x5, + 0xfb, 0x9d, 0x7, 0xfc, 0x12, 0x98, 0x5, 0xe, 0xda, 0xf7, 0xdb, 0xa5, + 0x71, 0xa6, 0x7f, 0x94, 0x12, 0x9f, 0xfa, 0x3, 0x13, 0x90, 0xc3, 0xf7, + 0xd9, 0x15, 0xf9, 0x1c, 0x8f, 0x3c, 0x7a, 0xfb, 0x0, 0x57, 0x75, 0x58, + 0x19, 0x7d, 0x85, 0x8c, 0x82, 0x8f, 0x1b, 0x8d, 0x8f, 0x8e, 0x8e, 0x8d, + 0x1f, 0xca, 0xe0, 0xf7, 0x5a, 0xb4, 0xf3, 0x9a, 0x8, 0x8d, 0x8c, 0x8c, + 0x8d, 0x8c, 0x1f, 0x13, 0x30, 0x8e, 0x8d, 0x8e, 0x8e, 0x95, 0x1b, 0x92, + 0x8c, 0x94, 0x8e, 0x8e, 0x1a, 0x8c, 0x88, 0x8c, 0x88, 0x1e, 0xfb, 0x19, + 0x95, 0xfb, 0x2f, 0xb1, 0x46, 0xe6, 0x8, 0x8d, 0x89, 0x89, 0x8e, 0x8a, + 0x1b, 0x89, 0x8d, 0x81, 0x80, 0x8f, 0x1f, 0xa2, 0x53, 0xdd, 0x67, 0xd7, + 0x6d, 0x8, 0x13, 0x50, 0xfc, 0xf7, 0x8d, 0x5, 0x70, 0x66, 0x94, 0x8d, + 0x78, 0x1f, 0x88, 0x8c, 0x87, 0x89, 0x88, 0x1a, 0x88, 0x8e, 0x88, 0x90, + 0x86, 0x1e, 0x90, 0x86, 0x95, 0x7e, 0x9a, 0x84, 0x8, 0xe, 0xe3, 0xc0, + 0x76, 0xf7, 0x7c, 0xf7, 0x38, 0xf7, 0x7c, 0x77, 0x12, 0xae, 0xf9, 0xed, + 0x17, 0xf8, 0xda, 0xf7, 0x9c, 0x15, 0x4d, 0x4d, 0x5, 0x76, 0x74, 0x7d, + 0x74, 0x6a, 0x1a, 0x57, 0xb3, 0x64, 0xbe, 0xaf, 0xa4, 0xa3, 0xa4, 0xa0, + 0x1e, 0x13, 0x30, 0xf7, 0x7e, 0xf7, 0x9d, 0xfb, 0x81, 0xf7, 0xa1, 0x5, + 0xa3, 0x77, 0x72, 0xa0, 0x6a, 0x1b, 0x13, 0x50, 0x56, 0x64, 0x61, 0x56, + 0x6f, 0xa1, 0x70, 0x9e, 0x78, 0x1f, 0xc3, 0x4c, 0x5, 0xfc, 0x48, 0x6, + 0x51, 0x56, 0x7a, 0x4a, 0x47, 0xbf, 0x7d, 0xc6, 0x1f, 0xe, 0xe4, 0xf7, + 0x2a, 0x76, 0xf7, 0x5c, 0xac, 0xf7, 0x5c, 0x54, 0xa, 0xf9, 0xec, 0x3, + 0xae, 0xf7, 0xdd, 0x15, 0xf8, 0xff, 0xfb, 0x5c, 0x6, 0xf7, 0x81, 0xf7, + 0x6d, 0xfb, 0x81, 0xf7, 0x6c, 0x5, 0xfb, 0x5c, 0xfc, 0xff, 0x7, 0xe, + 0xe4, 0xf7, 0x29, 0x76, 0xf7, 0x34, 0xf7, 0x8, 0xf7, 0x33, 0x54, 0xa, + 0xf9, 0xee, 0x3, 0xae, 0xf7, 0xb4, 0x15, 0xf8, 0xff, 0xfb, 0x34, 0x6, + 0xf7, 0x83, 0xf7, 0x6e, 0xfb, 0x83, 0xf7, 0x6d, 0x5, 0xfb, 0x33, 0xfc, + 0xff, 0x7, 0xe, 0xf5, 0x43, 0x76, 0xf9, 0xd6, 0x77, 0x1, 0x34, 0xa, + 0xfc, 0x7d, 0xfc, 0xc3, 0x15, 0xb5, 0x64, 0xf7, 0xc, 0xd6, 0xf7, 0x25, + 0xaf, 0xf7, 0x1f, 0x99, 0x19, 0xbc, 0xf7, 0x58, 0xcb, 0xd9, 0xf7, 0x11, + 0xf7, 0x2e, 0x8, 0x8e, 0x94, 0x8d, 0x93, 0x94, 0x1a, 0xb6, 0x61, 0xb8, + 0x5d, 0x7b, 0x7b, 0x86, 0x7e, 0x7b, 0x1e, 0xfb, 0x19, 0xfb, 0x1e, 0x21, + 0x36, 0xfb, 0x32, 0xfb, 0x0, 0x6a, 0x31, 0x4d, 0xfb, 0x7, 0x4e, 0x41, + 0x8, 0xb1, 0x95, 0x15, 0xa3, 0xa9, 0xa7, 0xb3, 0x9b, 0xa8, 0xa7, 0xbd, + 0xa4, 0xbe, 0x9e, 0xbf, 0xe0, 0xc5, 0xde, 0xc8, 0xd8, 0xce, 0xbe, 0xb7, + 0xba, 0xba, 0xba, 0xbb, 0x8, 0x95, 0x95, 0x8f, 0x90, 0x9b, 0x1b, 0xa9, + 0xad, 0x6d, 0x6d, 0x81, 0x87, 0x85, 0x86, 0x84, 0x1f, 0x72, 0x6b, 0x70, + 0x6b, 0x73, 0x6a, 0x3d, 0x24, 0x61, 0x38, 0x6a, 0xfb, 0x11, 0xfb, 0x0, + 0x7f, 0xfb, 0xa, 0x6e, 0x26, 0x5b, 0x7b, 0x84, 0x78, 0x80, 0x81, 0x84, + 0x8a, 0x8c, 0x18, 0xf7, 0x21, 0xf7, 0x2a, 0x5, 0xa8, 0xab, 0xae, 0xa7, + 0x92, 0x84, 0x93, 0x83, 0x6e, 0x65, 0x68, 0x6d, 0x90, 0x1f, 0xfb, 0x1d, + 0xfb, 0x2c, 0x5, 0xe, 0x86, 0xf7, 0x44, 0x76, 0xf2, 0xf7, 0x44, 0xf2, + 0x54, 0xa, 0xa4, 0xcb, 0xba, 0xaf, 0xd9, 0x3, 0xf7, 0xca, 0xf7, 0x96, + 0x15, 0xf7, 0x99, 0x24, 0x6, 0xf7, 0x78, 0xf7, 0x53, 0xfb, 0x78, 0xf7, + 0x53, 0x5, 0x24, 0xfb, 0x99, 0x7, 0x24, 0xfb, 0x44, 0x15, 0xd9, 0xf7, + 0x44, 0x3d, 0x6, 0x38, 0xfb, 0x44, 0x15, 0xba, 0xf7, 0x44, 0x5c, 0x6, + 0x32, 0xfb, 0x44, 0x15, 0xa4, 0xf7, 0x44, 0x72, 0x6, 0xe, 0xad, 0xf7, + 0x6, 0x76, 0xf8, 0x8e, 0x54, 0xa, 0xa2, 0xd3, 0xab, 0xc6, 0xbe, 0xb1, + 0xd5, 0x3, 0xf8, 0x2c, 0xf7, 0x5b, 0x15, 0xf7, 0x3a, 0x21, 0x92, 0x6, + 0xb7, 0xf7, 0xb, 0xf4, 0xe3, 0xf7, 0x0, 0xb9, 0xfb, 0x2, 0xba, 0xfb, + 0x0, 0xe6, 0x64, 0xf7, 0x7, 0x8, 0x84, 0x21, 0xfb, 0x3a, 0x6, 0x29, + 0xfb, 0xba, 0x15, 0xd5, 0xf7, 0xba, 0x41, 0x6, 0x32, 0xfb, 0xba, 0x15, + 0xbe, 0xf7, 0xba, 0x58, 0x6, 0x30, 0xfb, 0xba, 0x15, 0xab, 0xf7, 0xba, + 0x6b, 0x6, 0x2c, 0xfb, 0xba, 0x15, 0xa2, 0xf7, 0xba, 0x74, 0x6, 0xe, + 0x80, 0xf7, 0x11, 0x76, 0xf8, 0x78, 0x54, 0xa, 0xf9, 0x88, 0x3, 0xae, + 0xf7, 0x5d, 0x15, 0xf8, 0x8b, 0x2a, 0x6, 0xf7, 0x91, 0xf7, 0x86, 0xfb, + 0x91, 0xf7, 0x86, 0x5, 0x2a, 0xfc, 0x8b, 0x7, 0xe, 0x49, 0xa, 0xf7, + 0xbc, 0xfb, 0x8c, 0x5, 0xb8, 0x16, 0xfb, 0x70, 0xf7, 0x44, 0xf9, 0x13, + 0xfb, 0x44, 0x5, 0xe, 0xd9, 0x3d, 0xa, 0xf9, 0xe3, 0x7a, 0xa, 0xf9, + 0xe3, 0xf7, 0xee, 0xfd, 0xe3, 0xf7, 0xee, 0xf7, 0x67, 0xfb, 0xee, 0x5, + 0xe, 0xe6, 0xf4, 0x76, 0xf7, 0xaf, 0xd8, 0xf7, 0x38, 0x54, 0xa, 0xb3, + 0x3, 0xf8, 0xb5, 0xdf, 0x15, 0x76, 0xa, 0x23, 0xfb, 0xcb, 0x7, 0x25, + 0x8a, 0x52, 0xa8, 0xf7, 0x1c, 0x1a, 0x63, 0xfb, 0x85, 0x6, 0x8c, 0x4e, + 0x8b, 0x6f, 0xb8, 0x5c, 0x8, 0x62, 0xb1, 0xb9, 0x87, 0xc0, 0x1b, 0xf7, + 0xdb, 0x6, 0xe, 0xe7, 0xf4, 0x76, 0xf7, 0x37, 0xf7, 0x97, 0xf1, 0x54, + 0xa, 0xb3, 0x3, 0xae, 0xdf, 0x15, 0xb3, 0x6, 0xf7, 0x1c, 0xc5, 0xa7, + 0xf1, 0x8a, 0x1e, 0xf7, 0xca, 0x24, 0x6, 0x76, 0xa, 0x25, 0xfb, 0xdb, + 0x7, 0x56, 0x5e, 0x86, 0x62, 0x64, 0x1f, 0x5f, 0x5d, 0x8a, 0x6e, 0x8a, + 0x4f, 0x8, 0xe, 0xfc, 0xc, 0x3d, 0x76, 0xfa, 0xe, 0x54, 0xa, 0xf8, + 0x1e, 0x3, 0xae, 0xc2, 0x15, 0xf7, 0x14, 0xfb, 0x2e, 0x6, 0xf7, 0x9e, + 0xf8, 0x51, 0xfb, 0x9e, 0xf8, 0x51, 0x5, 0xfb, 0x2e, 0xfb, 0x14, 0x7, + 0xe, 0xb7, 0xe7, 0x76, 0xf8, 0xbc, 0x77, 0x1, 0xf8, 0x42, 0x96, 0x3, + 0xae, 0xf7, 0x38, 0x15, 0xf8, 0x1f, 0x2e, 0x96, 0x6, 0xae, 0xd2, 0xf7, + 0x7e, 0xf7, 0x71, 0xf7, 0x1e, 0x77, 0x8, 0x94, 0x7, 0xfb, 0x3d, 0x9f, + 0xfb, 0x29, 0xf6, 0x32, 0xf7, 0x24, 0x8, 0x80, 0x2d, 0xfc, 0x1f, 0x6, + 0xe, 0x88, 0xb7, 0xa0, 0x76, 0x6c, 0xa, 0x76, 0xa0, 0x12, 0xae, 0xa5, + 0xf7, 0xe4, 0xa5, 0x13, 0xb7, 0xae, 0xf7, 0x5d, 0x15, 0xf7, 0xfe, 0x6, + 0x13, 0x4b, 0xfb, 0x31, 0xf7, 0x28, 0x7, 0xf7, 0x95, 0xf7, 0xc2, 0xfb, + 0x95, 0xf7, 0xc2, 0x5, 0xfb, 0x28, 0x6, 0x13, 0xb7, 0xfb, 0x31, 0xfb, + 0xfe, 0x7, 0xa5, 0xfb, 0x9d, 0x15, 0xf7, 0x84, 0xf7, 0xfe, 0xf7, 0x35, + 0x7, 0xf7, 0x8e, 0xfb, 0xad, 0xfb, 0x8e, 0x7d, 0xa, 0xf7, 0x1b, 0x50, + 0x76, 0xf8, 0x57, 0xf7, 0x47, 0x8b, 0xb3, 0x8b, 0xa0, 0xf7, 0x16, 0x77, + 0x1, 0xc6, 0xf9, 0xde, 0x3, 0x34, 0xa, 0xfc, 0x6f, 0xfc, 0xc1, 0x15, + 0x96, 0x83, 0xf7, 0x2b, 0xf7, 0x3b, 0x5, 0xa9, 0x86, 0xb1, 0xae, 0xa8, + 0x1b, 0x93, 0x92, 0x83, 0x84, 0x6f, 0x6b, 0x68, 0x6e, 0x1f, 0xfb, 0x30, + 0xfb, 0x3a, 0x93, 0x83, 0xf7, 0x6, 0xd2, 0xf7, 0x2b, 0xb0, 0xf7, 0x15, + 0x99, 0x19, 0xb8, 0xf7, 0x4a, 0xca, 0xdd, 0xf7, 0x9, 0xf7, 0x24, 0x8, + 0x89, 0x6, 0xbd, 0x91, 0x6f, 0xbd, 0x52, 0x1b, 0x83, 0x83, 0x89, 0x8a, + 0x83, 0x1f, 0x6b, 0x69, 0xfb, 0x1, 0xfb, 0x5, 0xfb, 0x10, 0x2e, 0xfb, + 0x15, 0x33, 0x19, 0x6f, 0x3e, 0x4c, 0xfb, 0xf, 0x50, 0x44, 0x8, 0xe, + 0xa7, 0x90, 0xf9, 0x4e, 0x1, 0xc5, 0xf9, 0x73, 0x3, 0xf3, 0xf7, 0xbe, + 0x15, 0xbc, 0xf7, 0x44, 0xf7, 0x8f, 0x64, 0x5, 0x8b, 0xc8, 0xf7, 0x51, + 0x88, 0x1a, 0x88, 0x8a, 0xf7, 0xa7, 0xfb, 0x86, 0x8b, 0x1a, 0x88, 0x7, + 0x8e, 0xfc, 0x28, 0xfb, 0x75, 0x8b, 0x1e, 0x8a, 0xb9, 0xf7, 0x48, 0x8b, + 0x1e, 0xfb, 0xd5, 0xfb, 0x16, 0x15, 0xf7, 0x92, 0xb4, 0x6b, 0xfb, 0x16, + 0x88, 0xfb, 0x0, 0xf8, 0x98, 0xf7, 0xad, 0x5, 0xf5, 0x7, 0xfb, 0xee, + 0xf7, 0xcb, 0x44, 0xfb, 0x6e, 0xfb, 0x91, 0xb2, 0x4d, 0xfb, 0x76, 0x5, + 0xe, 0xfb, 0x23, 0xcc, 0x76, 0xe4, 0xe4, 0xf7, 0xb8, 0xa8, 0xf4, 0x54, + 0xa, 0xa7, 0xf7, 0x78, 0xa5, 0x3, 0xf7, 0xd, 0xf7, 0x19, 0x15, 0xf7, + 0x3e, 0x71, 0x6, 0xd7, 0x4c, 0xf7, 0xba, 0xf7, 0xb0, 0xfc, 0x6, 0xf7, + 0xd4, 0x5, 0x22, 0xfb, 0x94, 0xfb, 0xe6, 0x7, 0xa7, 0x9c, 0x15, 0xf7, + 0xb8, 0xf7, 0x92, 0xd6, 0x7, 0xf7, 0x96, 0xfb, 0x72, 0xfb, 0x96, 0xfb, + 0x88, 0x5, 0xee, 0x7, 0xe, 0xae, 0xed, 0x76, 0xeb, 0xcf, 0xf7, 0x99, + 0xa5, 0xe6, 0x77, 0x1, 0xf8, 0xb6, 0xa3, 0x3, 0xf3, 0xf7, 0x41, 0x15, + 0xf8, 0x4e, 0x66, 0x6, 0xc9, 0x50, 0xf7, 0x7c, 0xf7, 0x8a, 0xfb, 0xba, + 0xf7, 0xbc, 0x5, 0x30, 0xfc, 0x91, 0x7, 0xd8, 0xfb, 0x31, 0x3c, 0xfb, + 0x16, 0x5, 0xa7, 0x16, 0xd9, 0xf7, 0x16, 0x4b, 0xf7, 0x17, 0x5, 0xf8, + 0x81, 0xc7, 0x6, 0xf7, 0x4e, 0xfb, 0x53, 0xfb, 0x4e, 0xfb, 0x4b, 0x5, + 0xc0, 0x7, 0xe, 0x3c, 0x9c, 0x76, 0xf9, 0x43, 0x77, 0x1, 0xb6, 0xf7, + 0x3c, 0x3, 0xb6, 0xf7, 0xe8, 0x15, 0xfb, 0x52, 0xf7, 0x2b, 0xfb, 0x2e, + 0xf7, 0x4e, 0xf7, 0x4e, 0xf7, 0x2b, 0xf7, 0x2e, 0xf7, 0x52, 0xf7, 0x52, + 0xfb, 0x2b, 0xf7, 0x2d, 0xfb, 0x4e, 0xfb, 0x4e, 0xfb, 0x2b, 0xfb, 0x2d, + 0xfb, 0x52, 0x1e, 0xf7, 0x3c, 0xfb, 0xb4, 0x15, 0xf8, 0xd4, 0x7, 0x8c, + 0x8c, 0xf8, 0x87, 0xfb, 0xb4, 0x80, 0xa, 0xfc, 0x87, 0xfb, 0xb4, 0x5, + 0xe, 0xf6, 0xf7, 0xb, 0x76, 0xf7, 0xd, 0xad, 0xd2, 0xab, 0xd2, 0xad, + 0xf7, 0xd, 0x77, 0x1, 0xf9, 0x3a, 0xac, 0x3, 0xb2, 0xf7, 0x6f, 0x15, + 0xf7, 0xed, 0x6, 0xec, 0xf4, 0x5, 0xf7, 0x59, 0xfb, 0x76, 0x6, 0xf7, + 0x7d, 0xf7, 0x86, 0xfb, 0x7d, 0xf7, 0x86, 0x5, 0xfb, 0x76, 0xfb, 0x59, + 0x7, 0x2a, 0xf4, 0x5, 0xfb, 0xed, 0x6, 0xf7, 0x6, 0xfb, 0xd, 0x5, + 0xf8, 0xc2, 0xfb, 0x3b, 0x15, 0xf7, 0xe2, 0x7, 0xf7, 0x32, 0xfb, 0x3b, + 0x5, 0xfd, 0x8b, 0x34, 0x15, 0xdf, 0xe2, 0x37, 0xe2, 0x5, 0xf7, 0x9f, + 0x6, 0xda, 0x34, 0x3c, 0x34, 0x5, 0xe, 0xa5, 0xf8, 0x87, 0xf7, 0xda, + 0x15, 0xf7, 0x2d, 0x6, 0x71, 0x69, 0x8b, 0x5c, 0xaa, 0x6a, 0xb3, 0xc7, + 0xce, 0xb4, 0xcd, 0xb2, 0x48, 0xa6, 0x49, 0xb3, 0x63, 0xc8, 0x69, 0x6e, + 0x8e, 0x54, 0xa5, 0x6d, 0x8, 0xfb, 0x2d, 0x6, 0xfc, 0x64, 0xfb, 0x33, + 0x15, 0xf7, 0xe8, 0x6, 0xf7, 0xb, 0xf7, 0xb, 0x5, 0xfb, 0xe6, 0x6, + 0xb3, 0x4, 0xf7, 0xe6, 0x6, 0x90, 0xfb, 0x11, 0xf7, 0x7, 0x8b, 0x1f, + 0xfb, 0xe7, 0x6, 0xe, 0xf7, 0x14, 0xf7, 0x25, 0x76, 0xf7, 0x61, 0xad, + 0xf7, 0x61, 0x77, 0x1, 0xf7, 0x4a, 0xf8, 0x73, 0x3, 0xae, 0xf7, 0x23, + 0x15, 0xf7, 0xe6, 0x6, 0x91, 0xc0, 0xa0, 0xd2, 0xb6, 0xaa, 0x8, 0xa9, + 0xb5, 0xd8, 0x8c, 0xbd, 0x1b, 0xe7, 0x6, 0x56, 0x53, 0x88, 0x31, 0x98, + 0x50, 0xd5, 0xe6, 0xe2, 0xe2, 0xf7, 0x2, 0xb7, 0xfb, 0x2, 0xb9, 0x30, + 0xdd, 0x45, 0xe9, 0x7e, 0x64, 0x90, 0xfb, 0x7, 0xbe, 0x58, 0x8, 0x2f, + 0x6, 0x4f, 0x4e, 0x8b, 0xb5, 0x5b, 0x1f, 0x65, 0xab, 0x70, 0xc8, 0x86, + 0xbe, 0x8, 0xfb, 0xe6, 0x6, 0x97, 0x30, 0xbb, 0x3d, 0xe2, 0x69, 0x35, + 0x6c, 0x56, 0x37, 0x83, 0x33, 0x8, 0xe, 0x83, 0xf7, 0xb, 0x76, 0xf7, + 0x64, 0xd3, 0x5b, 0xa1, 0xf7, 0x7c, 0x77, 0x12, 0xa3, 0xf9, 0xa3, 0x13, + 0xb8, 0xf9, 0x7e, 0xf7, 0xde, 0x15, 0x60, 0x71, 0xfb, 0x6, 0x45, 0x45, + 0x62, 0x8, 0x63, 0x74, 0x83, 0x7b, 0x75, 0x1a, 0x72, 0xa3, 0x82, 0x95, + 0x9e, 0x93, 0x94, 0xa7, 0xa5, 0x1e, 0xcd, 0xd1, 0xf4, 0xe9, 0xd9, 0xb6, + 0x8, 0x89, 0x7, 0x8d, 0x7, 0x3b, 0xb6, 0x23, 0xe6, 0x49, 0xd2, 0x8, + 0xa7, 0x71, 0x82, 0x94, 0x78, 0x1b, 0x81, 0x75, 0x82, 0x72, 0x75, 0x94, + 0x7b, 0xb3, 0x74, 0x1f, 0xd1, 0x63, 0xf7, 0x7, 0x44, 0xb4, 0x71, 0x8, + 0x13, 0xd8, 0xfb, 0xaf, 0xfb, 0xb5, 0xa5, 0x2f, 0x1b, 0x64, 0x78, 0x7d, + 0x74, 0x72, 0xa0, 0x81, 0xb1, 0x1f, 0x13, 0xb8, 0xea, 0xf7, 0xbc, 0xa3, + 0xf7, 0xa4, 0x1b, 0xe, 0xad, 0xdc, 0x76, 0xf7, 0x9f, 0xa3, 0xf7, 0xa5, + 0x77, 0x1, 0xf9, 0xab, 0xf7, 0xdb, 0x15, 0x5e, 0x71, 0xfb, 0x7, 0x55, + 0x35, 0x71, 0x8, 0x4d, 0x78, 0x8e, 0x58, 0x66, 0x1a, 0x62, 0xc1, 0x7e, + 0xb4, 0x9c, 0xa9, 0xa1, 0x9d, 0x98, 0x1e, 0xc9, 0xe0, 0xc6, 0xf7, 0x3, + 0xdd, 0xb7, 0x38, 0xb8, 0x42, 0xf7, 0xf, 0x4c, 0xe1, 0x8, 0x9c, 0x7f, + 0x6f, 0x98, 0x7a, 0x1b, 0x5c, 0x5f, 0x70, 0x62, 0x63, 0xa4, 0x61, 0xb6, + 0x7a, 0x1f, 0xde, 0x6c, 0xf7, 0xa, 0x5a, 0xb7, 0x71, 0x8, 0xfb, 0xbb, + 0xfb, 0x96, 0xe7, 0x2b, 0x1b, 0x54, 0x52, 0x41, 0x6d, 0x64, 0xc3, 0x4b, + 0xc4, 0x1f, 0xee, 0xf7, 0x9f, 0xe6, 0xf7, 0xaf, 0x1b, 0xe, 0xe3, 0xf7, + 0x5f, 0xf7, 0xa6, 0x1, 0xa9, 0xf9, 0xf8, 0x3, 0xa9, 0xf7, 0x5f, 0x15, + 0xf9, 0x19, 0x6, 0xf7, 0x73, 0xf7, 0x1c, 0x75, 0xa, 0xfb, 0x73, 0xf7, + 0x1c, 0x5, 0xfd, 0x19, 0x6, 0xf7, 0x18, 0xfb, 0x1c, 0x80, 0xa, 0xe, + 0x37, 0x93, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xad, 0xf9, 0x43, 0x3, 0xf8, + 0x66, 0xf8, 0xb6, 0x15, 0xfb, 0xf2, 0xfb, 0x7f, 0x7b, 0x74, 0x81, 0x1b, + 0x80, 0x82, 0xa7, 0x93, 0x88, 0x1f, 0xca, 0x71, 0x89, 0x9c, 0x77, 0x1b, + 0x71, 0x6d, 0x7a, 0x7c, 0x76, 0x1f, 0x7e, 0x82, 0x81, 0x83, 0x7a, 0x1a, + 0x59, 0xb2, 0x27, 0xa1, 0x5d, 0x1e, 0x92, 0x7d, 0x90, 0x7d, 0x95, 0x84, + 0x8, 0x86, 0x92, 0x9a, 0x8b, 0xab, 0x1b, 0x99, 0xa7, 0x8c, 0x90, 0x92, + 0x1f, 0x94, 0x91, 0xf7, 0xf3, 0xf8, 0xd0, 0xf7, 0xb, 0xf7, 0x5, 0xa1, + 0xa0, 0x18, 0x55, 0x33, 0x77, 0x63, 0x67, 0x1f, 0xe, 0xf7, 0x17, 0xd4, + 0xf8, 0xaa, 0x1, 0xa9, 0xf9, 0xf8, 0x3, 0xa9, 0xd4, 0x15, 0xf9, 0x19, + 0x6, 0xf7, 0x73, 0xf7, 0x9e, 0x75, 0xa, 0xfb, 0x73, 0xf7, 0x9e, 0x5, + 0xfd, 0x19, 0x6, 0xf7, 0x18, 0xfb, 0x9e, 0x80, 0xa, 0xe, 0xda, 0x91, + 0xf9, 0x30, 0x1, 0xe4, 0xf9, 0xa2, 0x3, 0xe4, 0x91, 0x15, 0xf9, 0xa2, + 0xf7, 0xe1, 0x75, 0xa, 0xfd, 0xa2, 0xf7, 0xe1, 0x5, 0x38, 0x7, 0xf8, + 0xe7, 0xfb, 0x8e, 0x80, 0xa, 0xfc, 0xe7, 0xfb, 0x8e, 0x5, 0x95, 0xf7, + 0x16, 0x15, 0xf7, 0xe1, 0xf7, 0xc, 0x75, 0xa, 0xfb, 0xe1, 0xf7, 0xc, + 0x5, 0xe, 0x30, 0xbb, 0x76, 0xf8, 0x87, 0x77, 0x1, 0xd4, 0xf8, 0xef, + 0x3, 0xf7, 0x12, 0xdd, 0x15, 0xf7, 0x63, 0xf7, 0x38, 0xf7, 0x2f, 0xfb, + 0x6e, 0x8c, 0x8a, 0xf7, 0x4f, 0xf8, 0x87, 0x5, 0x8a, 0x6, 0xfc, 0xa9, + 0x81, 0x8c, 0x8a, 0xf7, 0x2d, 0xfb, 0x6e, 0xfb, 0x73, 0xfb, 0x1f, 0x5, + 0xe, 0x88, 0xb7, 0x6c, 0xa, 0x12, 0xae, 0xf7, 0x4, 0xf7, 0x81, 0xf7, + 0xb, 0x13, 0x6c, 0xae, 0xf7, 0x5d, 0x15, 0xf7, 0xf1, 0x6, 0x13, 0x9c, + 0xfb, 0x31, 0xf7, 0x1a, 0x7, 0xf7, 0xb0, 0xf7, 0xc2, 0xfb, 0xb0, 0xf7, + 0xc2, 0x5, 0xfb, 0x1a, 0x6, 0x13, 0xac, 0xfb, 0x31, 0xfb, 0xf1, 0x7, + 0xf7, 0x4, 0xfb, 0x9d, 0x15, 0xf7, 0x84, 0xf7, 0xf8, 0xf7, 0x35, 0x7, + 0xf7, 0x9c, 0xfb, 0xad, 0xfb, 0x9c, 0x7d, 0xa, 0x47, 0xc5, 0x76, 0xf8, + 0x91, 0xea, 0x99, 0x77, 0x12, 0xf8, 0xee, 0xe0, 0x13, 0xb0, 0xf8, 0x7e, + 0xf8, 0x3d, 0x15, 0xf7, 0x4, 0xe7, 0x8f, 0x63, 0xb4, 0x6d, 0xb3, 0x80, + 0x19, 0x88, 0xe5, 0xaa, 0xcf, 0xa0, 0xc8, 0x8, 0x13, 0xd0, 0x45, 0x77, + 0x3b, 0x7c, 0x44, 0xa0, 0x8c, 0x66, 0xa7, 0x56, 0xad, 0x86, 0xfb, 0x4, + 0x2f, 0x18, 0xfc, 0x44, 0xfb, 0x63, 0x15, 0xf7, 0x3d, 0x7e, 0xf7, 0x97, + 0xf7, 0x6e, 0xfb, 0x3b, 0x99, 0x5, 0x36, 0xfc, 0x41, 0x15, 0xf7, 0x98, + 0xf7, 0x6e, 0x5, 0xcd, 0x92, 0xbf, 0x94, 0xbc, 0x1e, 0xfb, 0x98, 0xfb, + 0x6e, 0x5, 0xe, 0xbc, 0x8d, 0x76, 0xf7, 0xf1, 0xf7, 0x39, 0xf7, 0x6d, + 0x77, 0x12, 0xf9, 0x46, 0xec, 0x13, 0xb0, 0xad, 0xf7, 0xb8, 0x15, 0x5e, + 0xba, 0xc7, 0x6e, 0xcd, 0x1b, 0xa3, 0xa3, 0x8f, 0x94, 0xa2, 0x1f, 0x78, + 0x68, 0x83, 0x68, 0x64, 0x1a, 0x5a, 0x9d, 0x59, 0xa5, 0x61, 0x1e, 0xf7, + 0x97, 0xf7, 0x6d, 0x5, 0x13, 0xd0, 0x72, 0xb2, 0x7d, 0xba, 0xb9, 0x1a, + 0xd7, 0xc0, 0xb7, 0xbf, 0xb8, 0x1e, 0xd1, 0xc4, 0x8a, 0x3a, 0xbc, 0x49, + 0xbc, 0x66, 0x19, 0xf7, 0x28, 0x9b, 0xee, 0xbd, 0xec, 0x1e, 0xfb, 0x6, + 0x68, 0xfb, 0xd, 0x95, 0xfb, 0x8, 0xa0, 0xaa, 0x4f, 0xc4, 0x4e, 0xd9, + 0x82, 0x43, 0x51, 0x18, 0x68, 0x62, 0x57, 0x63, 0x53, 0x1b, 0x58, 0x4a, + 0xa8, 0xae, 0x65, 0x1f, 0xe, 0x30, 0xed, 0x76, 0xf8, 0x4d, 0x77, 0xd9, + 0x77, 0x1, 0xce, 0xf8, 0xf1, 0x3, 0xf7, 0x20, 0xde, 0x15, 0xf8, 0xa8, + 0x85, 0x75, 0xa, 0xfb, 0x54, 0xf8, 0x85, 0x80, 0xa, 0xfb, 0x2c, 0xfb, + 0x6e, 0xfb, 0x64, 0xf7, 0x36, 0x56, 0x40, 0xf7, 0x75, 0xfb, 0x1f, 0xfb, + 0x2c, 0xfb, 0x70, 0x5, 0xe, 0x47, 0xc5, 0x76, 0xa3, 0xdc, 0xf8, 0x95, + 0x77, 0x1, 0xf8, 0xe9, 0xe5, 0x3, 0xf8, 0x66, 0xf7, 0x82, 0x15, 0xf6, + 0x2b, 0x69, 0x86, 0x74, 0x5a, 0x8a, 0x66, 0x19, 0x93, 0xa4, 0xa7, 0x8d, + 0xa6, 0x1b, 0xbb, 0xbd, 0x80, 0x7e, 0xb6, 0x1f, 0x76, 0xc8, 0x6c, 0xcf, + 0x8e, 0xe5, 0x63, 0x80, 0x5d, 0x69, 0x87, 0x63, 0x20, 0xeb, 0x18, 0xfb, + 0x57, 0x62, 0x15, 0xf7, 0x3b, 0x99, 0xfb, 0x97, 0xf7, 0x6e, 0xfb, 0x3d, + 0x7e, 0x5, 0xf7, 0x54, 0xb6, 0x15, 0xf7, 0x98, 0xfb, 0x6e, 0x5, 0x8f, + 0x88, 0x77, 0xf7, 0x3e, 0x8b, 0x1a, 0xfb, 0x98, 0xf7, 0x6e, 0x5, 0xe, + 0xbc, 0x8d, 0x76, 0xa2, 0xf7, 0x7, 0xf8, 0xe5, 0x77, 0x1, 0xf9, 0x3f, + 0xf3, 0x3, 0xf7, 0xb9, 0xf7, 0x4c, 0x15, 0xae, 0xb1, 0xcc, 0xa8, 0xbe, + 0x1b, 0xc3, 0xbf, 0x63, 0x68, 0xb4, 0x1f, 0xcc, 0x55, 0x3d, 0x82, 0x57, + 0x48, 0x6e, 0x51, 0x19, 0x96, 0xc6, 0xc9, 0x93, 0xc7, 0x1b, 0xc5, 0xc3, + 0x85, 0x7a, 0xc3, 0x1f, 0x59, 0xec, 0x7b, 0xee, 0xf7, 0x28, 0x1a, 0x5f, + 0x70, 0x4e, 0x43, 0x8c, 0x3a, 0x4c, 0xc0, 0x18, 0x57, 0xb8, 0x56, 0xb7, + 0xd7, 0x1a, 0xb9, 0x99, 0xba, 0xa4, 0xb2, 0x1e, 0xfb, 0x97, 0xf7, 0x6d, + 0x5, 0x71, 0x61, 0x79, 0x59, 0x5a, 0x1a, 0x64, 0x93, 0x68, 0x9e, 0x68, + 0x1e, 0x94, 0x74, 0x73, 0x8f, 0x73, 0x1b, 0x49, 0x4f, 0x6e, 0x5e, 0x5c, + 0x1f, 0xe, 0xa7, 0xa4, 0x76, 0xf8, 0x89, 0x77, 0xf7, 0x6d, 0x77, 0x1, + 0xbb, 0xf9, 0x9b, 0x3, 0xf7, 0x18, 0xf7, 0x7d, 0x15, 0x63, 0xf7, 0x44, + 0xf7, 0xad, 0x69, 0x5, 0x8b, 0x5d, 0xf7, 0x48, 0x8a, 0x8b, 0xf8, 0x1d, + 0xfb, 0x75, 0x8e, 0x1a, 0x88, 0x7, 0x8b, 0xfb, 0xaa, 0xfb, 0x86, 0x8e, + 0x8a, 0x1e, 0x88, 0x5f, 0xf7, 0x51, 0x8b, 0x1e, 0xfb, 0xc2, 0x32, 0x15, + 0xf7, 0xa4, 0xb2, 0xc0, 0xfb, 0x6e, 0xf7, 0xf4, 0xf7, 0xcb, 0xba, 0xec, + 0xfc, 0x7a, 0xf7, 0xb6, 0x4d, 0xfb, 0x0, 0xaf, 0xfb, 0x16, 0xfb, 0x5d, + 0xb4, 0x4d, 0x2b, 0x5, 0xe, 0xf7, 0xe, 0xee, 0xb3, 0xf0, 0xf7, 0x50, + 0x44, 0x77, 0xf7, 0x55, 0xb3, 0x12, 0xf9, 0x96, 0xf7, 0xa, 0x8b, 0xbb, + 0x13, 0xdc, 0xf9, 0x39, 0xf7, 0xed, 0x15, 0xb7, 0x9e, 0xbc, 0xa0, 0xc1, + 0x93, 0xbd, 0x9f, 0x19, 0xac, 0x98, 0xa8, 0xa4, 0xb2, 0x1a, 0xbc, 0x5d, + 0xaa, 0x5d, 0x51, 0x68, 0x5e, 0x59, 0x78, 0x1e, 0x7a, 0x5d, 0x80, 0x7b, + 0x5f, 0x73, 0x8, 0xfd, 0x1e, 0xf7, 0x1d, 0x15, 0xf8, 0xf0, 0xfb, 0x85, + 0xc1, 0x75, 0xb1, 0x7a, 0xa3, 0x52, 0x19, 0x58, 0xa1, 0xb1, 0x64, 0xc5, + 0x1b, 0xb9, 0xb7, 0xaa, 0xbc, 0xb2, 0x6c, 0xa6, 0x69, 0x97, 0x1f, 0x57, + 0x9e, 0x54, 0x92, 0x59, 0xa1, 0x55, 0xa3, 0x18, 0x75, 0xc1, 0xfd, 0x8, + 0xf7, 0x31, 0x5, 0x93, 0xfc, 0x34, 0x15, 0xf8, 0xb7, 0xf7, 0x31, 0x5, + 0x8c, 0x7, 0xfb, 0x6, 0xb8, 0xfc, 0x47, 0xfb, 0x54, 0x5, 0xf9, 0x84, + 0xf7, 0xe8, 0x15, 0xab, 0xae, 0xa2, 0xa9, 0xa5, 0xa6, 0x7a, 0x6e, 0x6a, + 0x6a, 0x74, 0x6c, 0x70, 0x70, 0x9d, 0xa8, 0x1e, 0x8d, 0xfb, 0xaf, 0x15, + 0xa9, 0xa4, 0x9d, 0xa7, 0xa9, 0xaf, 0x78, 0x6a, 0x6e, 0x76, 0x77, 0x6e, + 0x6e, 0x63, 0x9f, 0xac, 0x1e, 0xfb, 0x50, 0xf7, 0x28, 0x15, 0x13, 0xbc, + 0x94, 0x93, 0x93, 0x94, 0x94, 0x93, 0x83, 0x82, 0x82, 0x83, 0x83, 0x82, + 0x82, 0x83, 0x93, 0x94, 0x1e, 0xe, 0x92, 0x3a, 0xa, 0xaf, 0xf9, 0x9b, + 0x3, 0xc2, 0xf3, 0x15, 0x87, 0x69, 0xa9, 0x74, 0xa2, 0x78, 0x8, 0x81, + 0x98, 0xb4, 0x6b, 0xb0, 0x1b, 0xa5, 0xea, 0xe3, 0xa2, 0xa4, 0x1f, 0xf8, + 0x4f, 0xf8, 0x5d, 0x5, 0xa1, 0xa1, 0x90, 0x8b, 0xa8, 0x1a, 0xcc, 0x7, + 0xa8, 0x8b, 0x91, 0x6b, 0x79, 0x83, 0x87, 0x81, 0x7e, 0x1e, 0xfb, 0x71, + 0xfb, 0x5f, 0x5, 0xfb, 0x71, 0xfb, 0x76, 0x83, 0x83, 0x83, 0x1b, 0x6b, + 0x87, 0xac, 0xa3, 0x87, 0x1f, 0x82, 0xc1, 0x5, 0x88, 0x9f, 0x84, 0xad, + 0x9f, 0x1a, 0xbe, 0x4d, 0x85, 0x69, 0x7f, 0x1e, 0x76, 0x84, 0x78, 0x72, + 0x7e, 0x7b, 0x8, 0x6a, 0x64, 0x8b, 0x92, 0x57, 0x1a, 0x5f, 0x8b, 0x6a, + 0x90, 0x60, 0x1e, 0xe, 0xfb, 0x23, 0xcc, 0x76, 0xf4, 0xa8, 0xf7, 0xb8, + 0xe4, 0xe4, 0x54, 0xa, 0xa7, 0xf7, 0x78, 0xa5, 0x3, 0xae, 0xf7, 0x29, + 0x15, 0xf7, 0x94, 0x22, 0x6, 0xf8, 0x6, 0xf7, 0xd9, 0xfb, 0xb9, 0xf7, + 0xab, 0x3e, 0x4c, 0x5, 0x71, 0xfb, 0x3e, 0x7, 0x35, 0x43, 0x5, 0xa7, + 0xfb, 0xc9, 0x15, 0xf7, 0xb8, 0xf7, 0x92, 0xee, 0x7, 0xf7, 0x96, 0xfb, + 0x88, 0xfb, 0x96, 0xfb, 0x72, 0x5, 0xd6, 0x7, 0xe, 0xae, 0xe9, 0x76, + 0xe6, 0xa5, 0xf7, 0x99, 0xcf, 0xeb, 0x77, 0x1, 0xf8, 0xb8, 0xa3, 0x3, + 0xb0, 0xf7, 0x38, 0x15, 0xf8, 0x93, 0x30, 0x6, 0xf7, 0xb8, 0xf7, 0xba, + 0xfb, 0x7c, 0xf7, 0x8c, 0x4f, 0x56, 0x5, 0x60, 0xfc, 0x50, 0x7, 0x46, + 0x47, 0xd0, 0xfb, 0x16, 0x5, 0x70, 0xfb, 0x17, 0x15, 0xc1, 0xf7, 0x17, + 0x47, 0xf7, 0x16, 0x5, 0xf8, 0x91, 0xc0, 0x6, 0xf7, 0x4e, 0xfb, 0x4b, + 0xfb, 0x4e, 0xfb, 0x53, 0x5, 0xc7, 0x7, 0xe, 0xf7, 0x1b, 0xec, 0xb3, + 0xf7, 0x6b, 0xa6, 0xeb, 0xae, 0xb1, 0x77, 0x12, 0xf9, 0x32, 0xb1, 0x65, + 0xf7, 0x15, 0x9f, 0xb5, 0xbf, 0xbb, 0x13, 0xf7, 0xf9, 0x36, 0xf8, 0xe, + 0x15, 0xb2, 0x88, 0x5, 0x87, 0xc2, 0xc4, 0x78, 0xc0, 0x1b, 0xb6, 0xb3, + 0xa3, 0xba, 0xbc, 0x59, 0xb1, 0x5d, 0x67, 0x6a, 0x77, 0x73, 0x72, 0x1f, + 0x68, 0x6a, 0x7a, 0x83, 0x5b, 0x89, 0x8, 0xfc, 0x61, 0xf4, 0x15, 0xf7, + 0x31, 0x6, 0xf7, 0x76, 0xfb, 0x50, 0xb6, 0x67, 0xa7, 0x71, 0x91, 0x50, + 0x19, 0x4d, 0x91, 0xaf, 0x4f, 0xd1, 0x1b, 0xb4, 0xb1, 0xa7, 0xb6, 0xa8, + 0x79, 0xa3, 0x75, 0x9c, 0x1f, 0x61, 0xab, 0x5a, 0xa1, 0x64, 0xaf, 0x61, + 0xb2, 0x18, 0x87, 0xc2, 0xfb, 0x3d, 0xf5, 0x5, 0xf7, 0x38, 0x9f, 0xfc, + 0x42, 0x6, 0xfb, 0x63, 0x2c, 0x15, 0xf8, 0xb0, 0x2c, 0x5, 0x8c, 0x7, + 0x23, 0xe2, 0xfc, 0x45, 0x9d, 0x5, 0xf9, 0xad, 0x6b, 0x15, 0xa9, 0xa6, + 0x98, 0xa5, 0xa9, 0xaa, 0x7a, 0x6a, 0x6e, 0x73, 0x7a, 0x70, 0x6d, 0x6a, + 0x9f, 0xac, 0x1e, 0xfb, 0x6e, 0x67, 0x15, 0x94, 0x92, 0x91, 0x94, 0x93, + 0x94, 0x84, 0x83, 0x82, 0x82, 0x84, 0x82, 0x82, 0x85, 0x93, 0x93, 0x1e, + 0x13, 0xfb, 0xf7, 0x13, 0xfb, 0x5c, 0x15, 0xa4, 0xa2, 0x9e, 0xa3, 0xa8, + 0xae, 0x71, 0x6c, 0x72, 0x77, 0x76, 0x72, 0x6e, 0x66, 0xa7, 0xaa, 0x1e, + 0xe, 0x3e, 0x8b, 0xa9, 0xf8, 0xab, 0xa7, 0x6f, 0xf7, 0x13, 0x12, 0xae, + 0xa8, 0xf8, 0xa9, 0xa7, 0x6f, 0xf7, 0x16, 0x13, 0xd8, 0xae, 0x16, 0xf8, + 0xe2, 0xf5, 0x6, 0x13, 0xb4, 0xf1, 0xf8, 0xde, 0xfc, 0xdb, 0x6, 0x13, + 0xd8, 0x28, 0xfb, 0x1, 0x7, 0xa8, 0xfc, 0xc7, 0x15, 0xf8, 0xab, 0xf8, + 0xa9, 0xfc, 0xab, 0x7, 0xe, 0x3b, 0x8b, 0xab, 0xf8, 0xad, 0xf7, 0xf, + 0x1, 0xae, 0xaa, 0xf8, 0xa8, 0xf7, 0x13, 0x7a, 0xa, 0xf8, 0xcd, 0x6, + 0xf7, 0xd, 0xf7, 0xb, 0x5, 0xf8, 0xd1, 0xfc, 0xc6, 0x7, 0xfb, 0x14, + 0xfb, 0x7, 0x5, 0xaa, 0xfc, 0xb5, 0x6d, 0xa, 0x66, 0xa, 0xaf, 0xf7, + 0xe9, 0x15, 0xe6, 0x54, 0xf7, 0x3f, 0xfb, 0x1f, 0xf7, 0x34, 0xfb, 0x5b, + 0x9a, 0x96, 0x18, 0x5f, 0xf7, 0xb, 0x33, 0xf7, 0x3d, 0x47, 0xe9, 0xca, + 0xdf, 0xe8, 0xf7, 0x65, 0xad, 0xde, 0x80, 0x98, 0x18, 0xfb, 0x38, 0xfb, + 0x56, 0xfb, 0x42, 0xfb, 0x27, 0x3d, 0x5b, 0x8, 0xe, 0xfc, 0x41, 0x38, + 0xa, 0xf7, 0x1b, 0x8b, 0x3, 0xf7, 0x1b, 0x16, 0xf7, 0x84, 0x6, 0x27, + 0xf7, 0xee, 0xef, 0xf7, 0xee, 0x5, 0xfb, 0x84, 0x6, 0x27, 0xfb, 0xee, + 0x5, 0xe, 0x3e, 0x8f, 0xf9, 0x3f, 0x1, 0xab, 0xf9, 0x4e, 0x3, 0xb1, + 0x93, 0x15, 0xa4, 0x90, 0xd6, 0xa0, 0x9d, 0x95, 0xa3, 0x97, 0xd4, 0xd0, + 0xed, 0xf5, 0x91, 0x91, 0x9d, 0x89, 0x90, 0x85, 0xce, 0x41, 0xda, 0x40, + 0xa3, 0x73, 0x8, 0x64, 0xb3, 0xab, 0x7e, 0xa3, 0x1b, 0x94, 0xcb, 0x95, + 0x91, 0x93, 0x1f, 0x8e, 0x97, 0x69, 0xa5, 0xfb, 0x42, 0xf7, 0x45, 0x40, + 0xe7, 0x19, 0xf7, 0x3c, 0xf7, 0x4c, 0xd8, 0xf7, 0x3, 0x9f, 0xb1, 0x84, + 0x99, 0x18, 0x5b, 0x85, 0x38, 0x7d, 0x87, 0x83, 0x63, 0x4e, 0x3f, 0x26, + 0x3c, 0x39, 0x59, 0xb3, 0xfb, 0x2f, 0xf7, 0x50, 0x6f, 0xc4, 0x8, 0x80, + 0x6, 0x7f, 0x82, 0x68, 0x5e, 0x81, 0x78, 0x84, 0x78, 0x8b, 0x83, 0xa0, + 0x65, 0x9d, 0x6c, 0xd9, 0x34, 0xee, 0xfb, 0x2, 0x90, 0x84, 0x8b, 0x80, + 0x86, 0x84, 0x67, 0x5e, 0xfb, 0x4d, 0xfb, 0x5c, 0x6d, 0x70, 0x8, 0xe, + 0x3d, 0xa5, 0x76, 0xf9, 0x21, 0x99, 0xa5, 0x77, 0x1, 0xa8, 0xf9, 0x53, + 0x3, 0xae, 0x94, 0x15, 0xa7, 0x8e, 0xea, 0x9a, 0xaf, 0xa2, 0x9f, 0x97, + 0xb2, 0xa6, 0xe0, 0xf6, 0x90, 0x92, 0x9c, 0x89, 0x94, 0x82, 0xba, 0x58, + 0xc1, 0x4e, 0xa4, 0x74, 0x8, 0x64, 0xb6, 0xa9, 0x7e, 0xa3, 0x1b, 0x97, + 0xf7, 0x8, 0x94, 0x90, 0x95, 0x1f, 0x8d, 0x9a, 0x66, 0xad, 0xfb, 0x32, + 0xf7, 0x4f, 0x49, 0xe5, 0x19, 0xe0, 0xe2, 0xf7, 0x31, 0xf7, 0x4d, 0x9b, + 0xb4, 0x82, 0x99, 0x18, 0x63, 0x88, 0xfb, 0x13, 0x7a, 0x87, 0x84, 0x6c, + 0x5a, 0x42, 0x2a, 0x55, 0x55, 0x46, 0xd0, 0x2e, 0xf7, 0x14, 0x6e, 0xc3, + 0x8, 0x7d, 0x6, 0x73, 0x80, 0x3b, 0x38, 0x83, 0x79, 0x84, 0x79, 0x8d, + 0x7a, 0xa0, 0x66, 0x9d, 0x6b, 0xc3, 0x47, 0xe6, 0x24, 0x90, 0x85, 0x89, + 0x7c, 0x86, 0x86, 0x67, 0x5d, 0xfb, 0x32, 0xfb, 0x50, 0x6d, 0x70, 0x8, + 0xe, 0xfb, 0xa0, 0x5c, 0x76, 0xf9, 0x6d, 0x77, 0x1, 0xf7, 0x50, 0xf7, + 0x98, 0x3, 0xf7, 0xb4, 0xf7, 0x96, 0x15, 0xfb, 0x34, 0xee, 0x9f, 0x67, + 0x98, 0x1b, 0x97, 0x9e, 0x98, 0x97, 0x8d, 0x1f, 0x89, 0x8f, 0x88, 0x91, + 0x8f, 0x1a, 0x91, 0x9b, 0x91, 0x8f, 0x8f, 0x1e, 0x93, 0x7, 0x92, 0x8e, + 0x8f, 0x8f, 0x8e, 0x92, 0xfb, 0x1, 0xf7, 0x79, 0x18, 0xe3, 0xf7, 0x13, + 0xe3, 0xf3, 0x96, 0x95, 0x8, 0x8f, 0x8f, 0x92, 0x91, 0x91, 0x1a, 0x92, + 0x7b, 0x96, 0x87, 0x95, 0x1e, 0x8d, 0x8a, 0x89, 0x91, 0x88, 0x1b, 0x88, + 0x85, 0x84, 0x88, 0x89, 0x1f, 0x80, 0x81, 0x5, 0x90, 0x85, 0x67, 0x86, + 0x85, 0x1b, 0xfb, 0x31, 0xfb, 0x41, 0x3f, 0xf7, 0x2a, 0x5, 0x93, 0x87, + 0x88, 0x95, 0x80, 0x1b, 0x80, 0x83, 0x7b, 0x81, 0x82, 0x89, 0x8, 0x8f, + 0x86, 0x87, 0x90, 0x84, 0x1b, 0x79, 0x7d, 0x82, 0x82, 0x84, 0x1a, 0x82, + 0x93, 0x7a, 0x8e, 0x83, 0x1e, 0xd7, 0xfb, 0x54, 0x49, 0x3c, 0x3d, 0x25, + 0x62, 0x43, 0x19, 0x6c, 0x56, 0x7a, 0x73, 0x7e, 0x1a, 0x88, 0x8e, 0x89, + 0x8d, 0x89, 0x1e, 0x92, 0x85, 0x87, 0x85, 0x89, 0x83, 0x8, 0x89, 0x85, + 0x8a, 0x87, 0x85, 0x1a, 0x80, 0x94, 0x80, 0x91, 0x82, 0x1e, 0x81, 0x91, + 0x8d, 0x81, 0x98, 0x1b, 0x99, 0xa5, 0x8e, 0x94, 0x97, 0x1f, 0xe, 0xfb, + 0x36, 0x93, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xf7, 0x5f, 0xf7, 0x64, 0x3, + 0xf3, 0x93, 0x15, 0x9e, 0x76, 0x5, 0x98, 0x6, 0x92, 0x94, 0xf7, 0x26, + 0xf7, 0x58, 0xb1, 0x5a, 0xa9, 0x53, 0xb7, 0x5e, 0x19, 0x8e, 0x8e, 0x89, + 0x8d, 0x9b, 0xa0, 0xad, 0x90, 0x1b, 0x8e, 0x93, 0x83, 0x8a, 0x8d, 0x1f, + 0x88, 0x8f, 0x91, 0x85, 0x90, 0x1b, 0x90, 0x93, 0x94, 0x8e, 0x8e, 0x1f, + 0x92, 0x91, 0x94, 0x8e, 0x87, 0x95, 0x8, 0x91, 0x89, 0x96, 0x99, 0x8d, + 0x1b, 0x93, 0x6, 0x94, 0x97, 0xa4, 0x91, 0x8e, 0x1f, 0x92, 0x97, 0x8b, + 0x8a, 0x8d, 0x98, 0xfb, 0x28, 0xf7, 0x4b, 0x18, 0xf7, 0x4b, 0xf7, 0x70, + 0xbb, 0x89, 0xb5, 0x1a, 0x7c, 0xae, 0x86, 0x92, 0x8b, 0x8c, 0x84, 0x89, + 0x19, 0x7f, 0x88, 0x87, 0xab, 0x90, 0x1a, 0x8e, 0x8d, 0x8d, 0x8d, 0x8d, + 0x1e, 0x96, 0x92, 0x59, 0x92, 0x89, 0x1b, 0x7f, 0xfb, 0x5b, 0xfb, 0x65, + 0x70, 0x74, 0x1f, 0xfb, 0xa, 0xf7, 0x45, 0x5, 0x92, 0x87, 0x83, 0x96, + 0x82, 0x1b, 0x7e, 0x7d, 0x80, 0x7e, 0x8c, 0x1f, 0x82, 0x88, 0x81, 0x80, + 0x88, 0x7d, 0x9d, 0x8c, 0x86, 0x1e, 0x7d, 0x7e, 0x7e, 0x7d, 0x82, 0x7a, + 0xa6, 0x2f, 0xb7, 0x35, 0xb8, 0x37, 0xfb, 0x3b, 0xfb, 0x5b, 0x18, 0x7e, + 0x9b, 0x7b, 0x81, 0x7e, 0x7f, 0x85, 0x84, 0x1a, 0x87, 0x93, 0x82, 0x8d, + 0x88, 0x1e, 0x92, 0x7f, 0x93, 0x7a, 0x98, 0x85, 0x8, 0x8e, 0x93, 0x92, + 0x90, 0x94, 0x1b, 0x8d, 0x8e, 0x89, 0x88, 0x1f, 0x87, 0x88, 0x85, 0x87, + 0x1a, 0xe, 0x3f, 0x86, 0xb0, 0xf7, 0x7a, 0xaf, 0xdc, 0xb0, 0xf7, 0x77, + 0xb0, 0x1, 0xbc, 0xb0, 0xf7, 0x6c, 0xae, 0xe3, 0xb0, 0xf7, 0x6b, 0xb0, + 0x3, 0xbc, 0xf7, 0x9a, 0x15, 0xf7, 0x91, 0xfb, 0x9f, 0xf7, 0x34, 0xf7, + 0x9f, 0xf7, 0x90, 0xf7, 0x2e, 0xfb, 0x91, 0x6, 0x8c, 0xf7, 0x9c, 0x5, + 0xfb, 0x35, 0xfb, 0x9c, 0xfb, 0x90, 0x6, 0xb0, 0xfb, 0xa, 0x15, 0xdc, + 0xf7, 0x90, 0xf7, 0x9c, 0xe2, 0xfb, 0x9c, 0xf7, 0x90, 0x3a, 0xfb, 0x90, + 0xfb, 0x9e, 0x33, 0xf7, 0x9e, 0x7, 0xe, 0x3c, 0xa0, 0x76, 0xf7, 0x7c, + 0xf7, 0x7a, 0xf7, 0x7a, 0x77, 0x1, 0xf7, 0x9b, 0xf7, 0x7c, 0x3, 0xae, + 0xf7, 0x7c, 0x15, 0xf7, 0x78, 0xfb, 0x7c, 0xf7, 0x7c, 0xf7, 0x7c, 0xf7, + 0x7b, 0xf7, 0x7a, 0xfb, 0x7b, 0xf7, 0x7a, 0xfb, 0x7c, 0xfb, 0x7a, 0xfb, + 0x78, 0x6, 0xe, 0x3b, 0xa0, 0x76, 0xf7, 0xb2, 0xf7, 0xc, 0xf7, 0xb2, + 0x77, 0x1, 0xf7, 0xd5, 0xf7, 0x9, 0x3, 0xae, 0xf7, 0xa8, 0x15, 0xf7, + 0xa8, 0xfb, 0xa8, 0xf7, 0x1d, 0xf7, 0xa8, 0xf7, 0xa9, 0xf7, 0x20, 0xfb, + 0xa9, 0xf7, 0xa8, 0xfb, 0x1d, 0xfb, 0xa8, 0xfb, 0xa8, 0x6, 0xf7, 0xa8, + 0xfb, 0x20, 0x15, 0xf7, 0x20, 0xf7, 0x1d, 0xfb, 0x20, 0x7, 0xe, 0x36, + 0xa0, 0x76, 0xf7, 0x7f, 0xf7, 0x6d, 0xf7, 0x84, 0x77, 0x1, 0xf7, 0x9e, + 0xf7, 0x70, 0x3, 0xae, 0xf7, 0x7f, 0x15, 0xf7, 0x7b, 0xfb, 0x7f, 0xf7, + 0x71, 0xf7, 0x7f, 0xf7, 0x7d, 0xf7, 0x6d, 0xfb, 0x7d, 0xf7, 0x84, 0xfb, + 0x71, 0xfb, 0x84, 0xfb, 0x7b, 0x6, 0xf7, 0x7b, 0xfb, 0x6d, 0x15, 0xf7, + 0x6d, 0xf7, 0x70, 0xfb, 0x6d, 0x7, 0xe, 0x56, 0x7b, 0x76, 0xf7, 0xb9, + 0xac, 0x6a, 0xad, 0xaf, 0xa9, 0xaf, 0xae, 0xf7, 0xb6, 0x77, 0x12, 0xf7, + 0xcb, 0xad, 0xa2, 0xa9, 0xb8, 0xaf, 0x69, 0xad, 0x13, 0xdf, 0x80, 0xf8, + 0xe, 0xf7, 0xc3, 0x15, 0x86, 0x53, 0x7b, 0x63, 0x7b, 0x69, 0x8, 0x7a, + 0x65, 0x7a, 0x6c, 0x64, 0x1a, 0x6c, 0x98, 0x78, 0xa5, 0x79, 0x1e, 0x98, + 0x83, 0x9d, 0x81, 0x91, 0x85, 0x8, 0x89, 0x8d, 0x8f, 0x83, 0x8f, 0x1b, + 0x8f, 0x8f, 0x93, 0x8d, 0x8d, 0x1f, 0x91, 0x91, 0x9d, 0x95, 0x98, 0x93, + 0x8, 0xa5, 0x9d, 0x98, 0x9e, 0xaa, 0x1a, 0xb7, 0x79, 0xab, 0x79, 0xb2, + 0x1e, 0x7c, 0xac, 0x7c, 0xb1, 0x86, 0xbf, 0x95, 0x90, 0x93, 0x93, 0x90, + 0x96, 0xbe, 0x86, 0xb1, 0x7d, 0xab, 0x7c, 0x8, 0x78, 0xb5, 0xab, 0x77, + 0xb5, 0x1b, 0xaa, 0x9e, 0x98, 0xa5, 0x9d, 0x1f, 0x93, 0x98, 0x95, 0x9d, + 0x91, 0x91, 0x8, 0x8d, 0x8d, 0x93, 0x8f, 0x8f, 0x1a, 0x8f, 0x83, 0x8f, + 0x89, 0x8d, 0x1e, 0x85, 0x91, 0x81, 0x9d, 0x83, 0x98, 0x8, 0xa5, 0x79, + 0x75, 0x99, 0x6c, 0x1b, 0x5a, 0x6a, 0x74, 0x77, 0x5d, 0x1f, 0x6e, 0x7e, + 0x69, 0x80, 0x5e, 0x87, 0x87, 0x94, 0x83, 0x93, 0x82, 0x8e, 0x8f, 0xbd, + 0x98, 0xb0, 0x99, 0xaa, 0x8, 0x9e, 0xb7, 0xa0, 0xac, 0xb7, 0x1a, 0xaa, + 0x7e, 0x9e, 0x71, 0x9d, 0x1e, 0x7e, 0x93, 0x79, 0x95, 0x85, 0x91, 0x8, + 0x8d, 0x89, 0x87, 0x93, 0x87, 0x1b, 0x87, 0x87, 0x83, 0x89, 0x89, 0x1f, + 0x85, 0x85, 0x79, 0x81, 0x7e, 0x83, 0x8, 0x71, 0x79, 0x7e, 0x78, 0x6c, + 0x1a, 0x5e, 0x9e, 0x6a, 0x9e, 0x62, 0x1e, 0x99, 0x6b, 0x9a, 0x66, 0x8f, + 0x58, 0x81, 0x87, 0x84, 0x84, 0x87, 0x82, 0x53, 0x90, 0x64, 0x9b, 0x69, + 0x9a, 0x8, 0x9d, 0x64, 0x6c, 0x9c, 0x63, 0x1b, 0x6c, 0x78, 0x7d, 0x71, + 0x79, 0x1f, 0x83, 0x7e, 0x81, 0x79, 0x85, 0x85, 0x8, 0x89, 0x89, 0x83, + 0x87, 0x87, 0x1a, 0x87, 0x93, 0x87, 0x8d, 0x89, 0x1e, 0x91, 0x85, 0x95, + 0x79, 0x93, 0x7e, 0x8, 0x71, 0x9d, 0x9f, 0x80, 0xa9, 0x1b, 0xb5, 0xab, + 0x9b, 0x9c, 0xb0, 0x1f, 0xad, 0x9a, 0xb1, 0x9c, 0xc2, 0x90, 0x8f, 0x81, + 0x93, 0x83, 0x95, 0x86, 0x8, 0x96, 0xf7, 0x7f, 0x15, 0x89, 0xa0, 0x7f, + 0x96, 0x80, 0x94, 0x8, 0x7f, 0x95, 0x80, 0x93, 0x9b, 0x1a, 0x9c, 0x94, + 0x96, 0x9b, 0x96, 0x1e, 0x92, 0x8f, 0x96, 0x92, 0x8f, 0x8f, 0x8, 0x8b, + 0x8f, 0x93, 0x8c, 0x1e, 0x8d, 0x89, 0x8f, 0x87, 0x8c, 0x8a, 0x8e, 0x87, + 0x96, 0x84, 0x91, 0x86, 0x8, 0x9b, 0x80, 0x92, 0x82, 0x7a, 0x1a, 0x77, + 0x7b, 0x83, 0x7d, 0x7d, 0x1e, 0x82, 0x82, 0x83, 0x81, 0x89, 0x7a, 0x8, + 0xf7, 0x59, 0xfb, 0x59, 0x15, 0x8a, 0x8f, 0x9e, 0x8e, 0x96, 0x94, 0x94, + 0x95, 0x19, 0x98, 0x97, 0x93, 0x98, 0x9c, 0x1b, 0x9c, 0x97, 0x83, 0x7b, + 0x96, 0x1f, 0x8e, 0x84, 0x93, 0x81, 0x8f, 0x87, 0x8c, 0x8a, 0x8f, 0x87, + 0x8d, 0x89, 0x8, 0x8a, 0x85, 0x88, 0x89, 0x8a, 0x1e, 0x87, 0x87, 0x85, + 0x7f, 0x86, 0x85, 0x8, 0x13, 0xbf, 0x40, 0x7b, 0x80, 0x83, 0x84, 0x79, + 0x1b, 0x79, 0x83, 0x99, 0x98, 0x80, 0x1f, 0x82, 0x96, 0x80, 0x95, 0x77, + 0x8d, 0x8, 0xfc, 0x1f, 0x87, 0x15, 0x79, 0x88, 0x81, 0x83, 0x82, 0x82, + 0x8, 0x7e, 0x7f, 0x83, 0x7d, 0x79, 0x1b, 0x78, 0x81, 0x93, 0x9b, 0x80, + 0x1f, 0x87, 0x92, 0x84, 0x96, 0x87, 0x8f, 0x8, 0x8b, 0x85, 0x8e, 0x8c, + 0x8d, 0x1e, 0x8a, 0x8d, 0x91, 0x8e, 0x8b, 0x1a, 0x8f, 0x90, 0x92, 0x95, + 0x8f, 0x92, 0x8, 0x13, 0xdf, 0x40, 0x9b, 0x96, 0x94, 0x92, 0x9c, 0x1b, + 0x9c, 0x93, 0x7e, 0x7f, 0x96, 0x1f, 0x95, 0x80, 0x97, 0x80, 0xa0, 0x88, + 0x8, 0xf7, 0x59, 0xfb, 0x59, 0x15, 0x8f, 0x8d, 0x8e, 0x79, 0x93, 0x80, + 0x94, 0x82, 0x19, 0x98, 0x7e, 0x9a, 0x82, 0x8a, 0x79, 0x8, 0x79, 0x83, + 0x81, 0x7b, 0x80, 0x1e, 0x84, 0x88, 0x80, 0x82, 0x88, 0x88, 0x8, 0x89, + 0x89, 0x88, 0x87, 0x8a, 0x1b, 0x8a, 0x86, 0x91, 0x8b, 0x1f, 0x86, 0x8f, + 0x82, 0x93, 0x83, 0x90, 0x8, 0x7c, 0x95, 0x83, 0x93, 0x9c, 0x1a, 0x9d, + 0x99, 0x93, 0x98, 0x97, 0x1e, 0x96, 0x94, 0x95, 0x97, 0x8e, 0x9e, 0x8, + 0xe, 0xf7, 0x21, 0xee, 0xb3, 0xef, 0xf7, 0x52, 0x42, 0x77, 0xf7, 0x58, + 0xb2, 0x12, 0xf9, 0x9b, 0xf7, 0xa, 0x8b, 0xbc, 0x13, 0xdc, 0xf9, 0x3c, + 0xf7, 0xef, 0x15, 0xb7, 0x9e, 0xbd, 0xa1, 0xc2, 0x90, 0xbd, 0xa0, 0x19, + 0xac, 0x99, 0xa9, 0xa5, 0xb2, 0x1a, 0xbc, 0x5c, 0xa8, 0x5e, 0x51, 0x67, + 0x5f, 0x59, 0x78, 0x1e, 0x79, 0x5d, 0x7f, 0x7a, 0x5f, 0x74, 0x8, 0xfd, + 0x1c, 0xf7, 0x20, 0x15, 0xf8, 0xf1, 0xfb, 0x8b, 0xc1, 0x75, 0xaf, 0x7a, + 0xa4, 0x52, 0x19, 0x58, 0xa1, 0xb0, 0x65, 0xc6, 0x1b, 0xb9, 0xb8, 0xaa, + 0xbc, 0xb1, 0x6a, 0xa6, 0x6a, 0x97, 0x1f, 0x57, 0x9d, 0x54, 0x93, 0x59, + 0xa1, 0x55, 0xa3, 0x18, 0x76, 0xc1, 0xfd, 0x8, 0xf7, 0x36, 0x5, 0x92, + 0xfc, 0x3a, 0x15, 0xf8, 0xb8, 0xf7, 0x33, 0x8a, 0x8c, 0xfb, 0x2, 0xb7, + 0xfc, 0x4b, 0xfb, 0x55, 0x5, 0xf9, 0x84, 0xf7, 0xeb, 0x15, 0xab, 0xae, + 0xa3, 0xa9, 0xa5, 0xa6, 0x7a, 0x6e, 0x69, 0x6c, 0x74, 0x6a, 0x71, 0x6f, + 0x9d, 0xa8, 0x1e, 0x8e, 0xfb, 0xb1, 0x15, 0xa9, 0xa4, 0x9d, 0xa7, 0xa9, + 0xae, 0x78, 0x6a, 0x6e, 0x77, 0x78, 0x6e, 0x6e, 0x63, 0x9d, 0xad, 0x1e, + 0xfc, 0xf2, 0xf7, 0xbc, 0x15, 0xf8, 0x5a, 0xfb, 0x10, 0x9d, 0x5b, 0xc1, + 0x74, 0x7a, 0x7f, 0x7a, 0x95, 0x79, 0x93, 0x79, 0x92, 0x19, 0xfc, 0x5d, + 0xf7, 0x49, 0x5, 0x90, 0xfb, 0xc2, 0x15, 0xf7, 0xb3, 0xf7, 0xe, 0xbd, + 0x75, 0xfb, 0xe4, 0x26, 0x5, 0xf8, 0x31, 0xf7, 0x31, 0x15, 0x82, 0x92, + 0x84, 0x94, 0x94, 0x92, 0x92, 0x94, 0x1e, 0x13, 0xbc, 0x94, 0x84, 0x92, + 0x82, 0x82, 0x84, 0x84, 0x82, 0x1e, 0xe, 0x9e, 0xc2, 0xea, 0xc2, 0x58, + 0xf7, 0xa, 0xec, 0xf7, 0x2, 0x5a, 0xc2, 0x54, 0xc3, 0xe9, 0xc2, 0x12, + 0xd6, 0xc2, 0x56, 0xc0, 0xeb, 0xc2, 0x58, 0xf7, 0x6, 0xea, 0xf7, 0x8, + 0x5a, 0xc3, 0x54, 0xc2, 0xe9, 0xc2, 0x13, 0xd3, 0x52, 0xf7, 0x7e, 0xf7, + 0x64, 0x15, 0x95, 0x7a, 0x78, 0x91, 0x77, 0x1b, 0x52, 0x5d, 0x5d, 0x52, + 0x52, 0xb9, 0x5e, 0xc4, 0xc4, 0xb9, 0xb9, 0xc4, 0x9f, 0x86, 0x9e, 0x80, + 0x9b, 0x1f, 0xd9, 0xd8, 0x94, 0x86, 0x94, 0x87, 0x95, 0x89, 0x19, 0x13, + 0xb2, 0xca, 0x98, 0x45, 0x5, 0x9d, 0x6, 0x98, 0xd1, 0x96, 0x8d, 0x95, + 0x8f, 0x94, 0x91, 0x19, 0xd9, 0x3d, 0x5, 0x80, 0x7a, 0x85, 0x78, 0x77, + 0x1a, 0x53, 0xb8, 0x5d, 0xc4, 0xc4, 0xb9, 0xb9, 0xc4, 0x1e, 0x13, 0xca, + 0xd2, 0xc3, 0x5d, 0xb9, 0x53, 0x78, 0x78, 0x85, 0x81, 0x7b, 0x1e, 0x3d, + 0xd9, 0x91, 0x94, 0x8e, 0x95, 0x8e, 0x95, 0x19, 0xcd, 0x97, 0x5, 0x9d, + 0x7, 0x4b, 0x97, 0x89, 0x96, 0x87, 0x96, 0x85, 0x95, 0x19, 0xd6, 0xd7, + 0x5, 0x81, 0x9c, 0x9e, 0x85, 0x9f, 0x1b, 0xc4, 0xb9, 0xb9, 0xc4, 0xc4, + 0x5d, 0xb8, 0x52, 0x1f, 0x13, 0xd2, 0xc6, 0x53, 0x5c, 0x5e, 0x52, 0x78, + 0x91, 0x78, 0x95, 0x7a, 0x1f, 0x3e, 0x40, 0x81, 0x92, 0x81, 0x90, 0x7f, + 0x8d, 0x19, 0x7f, 0xc9, 0x5, 0x79, 0x6, 0x7f, 0x4c, 0x80, 0x88, 0x81, + 0x87, 0x81, 0x85, 0x19, 0x41, 0xd6, 0x5, 0x95, 0x9b, 0x90, 0x9e, 0x9e, + 0x1a, 0xc4, 0x5d, 0xb9, 0x52, 0x52, 0x5e, 0x5e, 0x52, 0x1e, 0x13, 0xc6, + 0xa6, 0x52, 0xb8, 0x5d, 0xc4, 0x9e, 0x9f, 0x91, 0x95, 0x9b, 0x1e, 0xd6, + 0x3f, 0x85, 0x81, 0x87, 0x80, 0x89, 0x80, 0x19, 0x48, 0x7f, 0x5, 0x79, + 0x7, 0xd0, 0x7e, 0x8e, 0x81, 0x8e, 0x82, 0x91, 0x82, 0x19, 0xf7, 0x8f, + 0xf7, 0x9e, 0x15, 0xa6, 0x9f, 0x9f, 0xa6, 0xa6, 0x9f, 0x77, 0x70, 0x70, + 0x77, 0x77, 0x70, 0x70, 0x77, 0x9f, 0xa6, 0x1e, 0xfb, 0x6e, 0xfb, 0x68, + 0x15, 0x13, 0xb2, 0xb2, 0xa5, 0xa0, 0xa1, 0xa5, 0xa5, 0xa1, 0x75, 0x71, + 0x71, 0x75, 0x74, 0x71, 0x71, 0x76, 0xa3, 0xa4, 0x1e, 0xf7, 0x6d, 0xfb, + 0x6f, 0x15, 0x13, 0xca, 0xd2, 0xa5, 0xa1, 0xa1, 0xa5, 0xa5, 0xa0, 0x75, + 0x71, 0x71, 0x76, 0x76, 0x71, 0x71, 0x75, 0xa0, 0xa5, 0x1e, 0xfc, 0x43, + 0xf8, 0x43, 0x15, 0xa5, 0xa1, 0xa0, 0x69, 0xa, 0xa1, 0xa5, 0x1e, 0xfc, + 0x43, 0x4, 0xa5, 0xa1, 0xa1, 0x69, 0xa, 0xa0, 0xa5, 0x1e, 0xe, 0x9f, + 0xf7, 0x18, 0xfb, 0x4, 0x76, 0xf7, 0x77, 0xc8, 0x6c, 0xf7, 0x15, 0x69, + 0xd0, 0x48, 0xce, 0xea, 0xf7, 0x10, 0xfb, 0x10, 0xf7, 0x11, 0x12, 0xd5, + 0xf7, 0x13, 0xfb, 0x12, 0xf7, 0x12, 0xea, 0xcd, 0x49, 0xce, 0x6a, 0xf7, + 0x14, 0x6b, 0xcb, 0x4d, 0xc9, 0xea, 0xf7, 0x15, 0xfb, 0x15, 0xf7, 0x16, + 0x13, 0xa5, 0xa2, 0x80, 0xf7, 0xc4, 0xf7, 0xaa, 0x15, 0x9e, 0x72, 0x6d, + 0x95, 0x6c, 0x1b, 0x3c, 0x4a, 0x4b, 0x3c, 0x3c, 0xcc, 0x4a, 0xda, 0xda, + 0xcc, 0xc9, 0xdb, 0xaa, 0x80, 0xaa, 0x79, 0xa4, 0x1f, 0x13, 0x51, 0x55, + 0x0, 0x9f, 0x9a, 0xa1, 0x92, 0xa3, 0x1b, 0xa6, 0x9c, 0x83, 0x78, 0x9d, + 0x1f, 0x78, 0x72, 0x80, 0x6c, 0x6c, 0x1a, 0x3c, 0xce, 0x4b, 0xd9, 0xda, + 0xcb, 0xcb, 0xda, 0xda, 0x4a, 0xcc, 0x3c, 0x6d, 0x6d, 0x81, 0x79, 0x73, + 0x1e, 0x13, 0xaa, 0x48, 0x80, 0x76, 0x9e, 0x84, 0x99, 0xa8, 0x1a, 0xa4, + 0x94, 0x9d, 0x9d, 0x9d, 0x1e, 0x78, 0xa4, 0xaa, 0x80, 0xaa, 0x1b, 0xda, + 0xcb, 0xce, 0xd9, 0xda, 0x4b, 0xcb, 0x3c, 0x1f, 0x13, 0x91, 0x52, 0x80, + 0x3c, 0x4a, 0x49, 0x3c, 0x6d, 0x95, 0x6d, 0x9d, 0x73, 0x1f, 0x78, 0x79, + 0x7a, 0x85, 0x71, 0x1b, 0x73, 0x77, 0x91, 0x9e, 0x7a, 0x1f, 0x9d, 0xa4, + 0x96, 0xa9, 0xaa, 0x1a, 0xda, 0x4a, 0xcc, 0x3c, 0x3c, 0x4a, 0x4b, 0x3c, + 0x1e, 0x13, 0xa5, 0x48, 0x80, 0x3c, 0xcd, 0x4a, 0xda, 0xa9, 0xa9, 0x95, + 0x9d, 0xa3, 0x1e, 0x9d, 0x79, 0x93, 0x7b, 0x71, 0x1a, 0x6f, 0x85, 0x7c, + 0x77, 0x77, 0x1e, 0x13, 0xa5, 0x52, 0x80, 0xf7, 0x4e, 0xf7, 0x65, 0x42, + 0xa, 0xfb, 0xb5, 0xf7, 0xb4, 0x42, 0xa, 0xe, 0x5a, 0x8b, 0xf7, 0xc, + 0x6d, 0xf6, 0x22, 0xa7, 0xbf, 0x93, 0x83, 0x95, 0xb2, 0xe8, 0x30, 0xe9, + 0x66, 0xf7, 0xb, 0x39, 0xbd, 0x63, 0xa4, 0x72, 0xf7, 0x17, 0x2f, 0xac, + 0x6c, 0xe5, 0xa3, 0xa7, 0x6f, 0xf6, 0x31, 0x96, 0xc0, 0xa3, 0xe7, 0x77, + 0x12, 0xf7, 0x24, 0xab, 0x6e, 0xf4, 0x71, 0x95, 0xb4, 0xe8, 0x30, 0xf7, + 0x20, 0x38, 0xae, 0x68, 0xf7, 0xb, 0x35, 0xbd, 0x59, 0xf7, 0x26, 0xfb, + 0x18, 0xa4, 0x97, 0xe7, 0xa5, 0xf5, 0x2f, 0x98, 0xbe, 0xa9, 0x7e, 0xa, + 0xf8, 0x4d, 0xf8, 0x14, 0x79, 0xa, 0x93, 0x9c, 0x86, 0x90, 0x86, 0x92, + 0x78, 0x81, 0x7c, 0x7b, 0x7b, 0x7a, 0x83, 0x7a, 0x90, 0x86, 0x8, 0x9e, + 0xfb, 0x14, 0x78, 0xa, 0x83, 0x9c, 0x7b, 0x9c, 0x7c, 0x9b, 0x78, 0x94, + 0x86, 0x86, 0x86, 0x85, 0x93, 0x7a, 0x9b, 0x7b, 0x8, 0xfb, 0x28, 0xf7, + 0x28, 0x78, 0xa, 0x82, 0x9c, 0x7b, 0x9c, 0x7c, 0x9b, 0x78, 0x95, 0x86, + 0x84, 0x86, 0x86, 0x94, 0x7a, 0x9b, 0x7b, 0x8, 0xd2, 0xfb, 0x74, 0x15, + 0x13, 0x44, 0x54, 0xea, 0xb, 0x94, 0x7f, 0x78, 0x93, 0x7d, 0x1b, 0x6a, + 0x71, 0x74, 0x6c, 0x70, 0x9f, 0x71, 0xab, 0x1f, 0x13, 0x34, 0x54, 0xe8, + 0x83, 0x90, 0x91, 0x8c, 0x8c, 0x90, 0x1f, 0x8c, 0x8d, 0x8b, 0x8c, 0x1b, + 0x87, 0x85, 0x80, 0x80, 0x77, 0x1a, 0x13, 0x94, 0x54, 0xe8, 0x83, 0x6d, + 0xa6, 0x72, 0xab, 0xac, 0xa6, 0xa4, 0xa9, 0xa0, 0x83, 0x92, 0x87, 0x93, + 0x1e, 0x93, 0x89, 0x5, 0x89, 0x93, 0x92, 0x8b, 0x92, 0x1b, 0x13, 0x44, + 0x54, 0xe8, 0x23, 0xa7, 0x99, 0xa7, 0xa8, 0x1f, 0x13, 0x44, 0x54, 0xe8, + 0x83, 0xaa, 0x70, 0xa1, 0x6a, 0x1e, 0x13, 0x8a, 0x24, 0xec, 0x1c, 0x7d, + 0x74, 0x85, 0x82, 0x81, 0x1f, 0x8c, 0xb5, 0x89, 0xc7, 0xa1, 0xa1, 0xa4, + 0xa4, 0xc4, 0x8b, 0xb7, 0x87, 0x8, 0x81, 0x81, 0x84, 0x76, 0x7d, 0x1a, + 0x6a, 0xa3, 0x71, 0xaa, 0xa4, 0xa5, 0xa0, 0xa8, 0x91, 0x8a, 0x91, 0x8a, + 0x91, 0x1e, 0x8c, 0x8b, 0x8e, 0x8c, 0x1a, 0x13, 0x91, 0x4, 0xec, 0x1b, + 0x87, 0x93, 0x95, 0x7f, 0x9d, 0x1b, 0xaa, 0xa4, 0xa7, 0xab, 0xac, 0x72, + 0xa5, 0x6c, 0x77, 0x86, 0x83, 0x87, 0x83, 0x1f, 0x8c, 0x94, 0x5, 0x8c, + 0x90, 0x8b, 0x90, 0x90, 0x1a, 0x13, 0x94, 0x24, 0xec, 0x1c, 0xac, 0x73, + 0x99, 0x6a, 0x6d, 0x75, 0x72, 0x6a, 0x1e, 0x13, 0x94, 0x51, 0xec, 0x1b, + 0x7b, 0x90, 0x77, 0x94, 0x7f, 0x1e, 0x54, 0x8a, 0x5e, 0x8b, 0x74, 0xa2, + 0x71, 0xa5, 0x91, 0xc8, 0x8a, 0xb1, 0x8, 0x13, 0x94, 0x52, 0x6c, 0x1b, + 0x82, 0x95, 0xa0, 0x83, 0x98, 0x1b, 0xac, 0xa6, 0xa2, 0xaa, 0xa6, 0x76, + 0xa5, 0x6c, 0x1f, 0x13, 0x94, 0x54, 0xe9, 0x1b, 0x86, 0x86, 0x8a, 0x8a, + 0x85, 0x1f, 0x88, 0x8a, 0x8b, 0x8a, 0x1b, 0x8f, 0x92, 0x96, 0x96, 0x9e, + 0x1a, 0xa9, 0x71, 0xa4, 0x6a, 0x6b, 0x70, 0x72, 0x6d, 0x76, 0x92, 0x84, + 0x8f, 0x83, 0x1e, 0x83, 0x8d, 0x5, 0x8d, 0x84, 0x85, 0x8b, 0x86, 0x1b, + 0x7e, 0xa, 0x6d, 0x7d, 0x70, 0x6d, 0x6c, 0xa4, 0x75, 0xac, 0x9b, 0x9f, + 0x91, 0x94, 0x97, 0x1f, 0x8a, 0x69, 0x92, 0x4e, 0x6f, 0x6f, 0x7a, 0x7a, + 0x45, 0x85, 0x65, 0x8c, 0x8, 0x13, 0x91, 0x4, 0xd4, 0x1b, 0x94, 0x97, + 0x92, 0x9e, 0x99, 0x1a, 0xac, 0x74, 0xa5, 0x6d, 0x72, 0x70, 0x79, 0x6f, + 0x84, 0x8a, 0x84, 0x8d, 0x83, 0x1e, 0x8a, 0x8b, 0x8a, 0x88, 0x1a, 0x8f, + 0x83, 0x83, 0x97, 0x77, 0x1b, 0x6c, 0x72, 0x70, 0x6a, 0x6a, 0xa4, 0x71, + 0xaa, 0xa0, 0x91, 0x93, 0x8f, 0x91, 0x1f, 0x7e, 0xa, 0x8a, 0x82, 0x5, + 0x8a, 0x86, 0x8b, 0x87, 0x87, 0x1a, 0x69, 0xa2, 0x7c, 0xad, 0x1e, 0x13, + 0x92, 0x54, 0xd4, 0x1b, 0xaa, 0xa0, 0xa4, 0xac, 0x9b, 0x86, 0x9f, 0x82, + 0x97, 0x1f, 0xb3, 0x8e, 0xc4, 0x8d, 0xa5, 0x71, 0x8, 0xa4, 0x72, 0x88, + 0x49, 0x68, 0x1a, 0x30, 0xc3, 0x79, 0xa, 0x94, 0x9c, 0x86, 0x91, 0x86, + 0x90, 0x78, 0x82, 0x7c, 0x7b, 0x7b, 0x7a, 0x82, 0x7a, 0x90, 0x86, 0x8, + 0xf7, 0xa5, 0xf5, 0x50, 0xa, 0x1e, 0x13, 0x94, 0x8c, 0xe8, 0x4b, 0x51, + 0xa, 0xfb, 0x58, 0xf7, 0x56, 0x44, 0xa, 0xfb, 0x56, 0xfb, 0x58, 0x44, + 0xa, 0xf7, 0x59, 0xfb, 0x56, 0x44, 0xa, 0xe, 0x5d, 0x9b, 0x76, 0xf7, + 0xd1, 0xc3, 0xf7, 0xd1, 0x77, 0x1, 0xf8, 0x6, 0xbf, 0x3, 0xf7, 0x94, + 0xf7, 0x57, 0x15, 0xf7, 0x20, 0xfb, 0x5c, 0xf7, 0x20, 0xf7, 0x5c, 0xf7, + 0x6f, 0xf7, 0x25, 0xfb, 0x6f, 0xf7, 0x25, 0xfb, 0x20, 0xf7, 0x5c, 0xfb, + 0x20, 0xfb, 0x5c, 0xfb, 0x6f, 0xfb, 0x25, 0x5, 0xf8, 0x15, 0xad, 0x15, + 0xa3, 0xc2, 0xc8, 0xa4, 0x90, 0x8f, 0x88, 0x86, 0x72, 0x4f, 0x51, 0x73, + 0x87, 0x8a, 0x8d, 0x8f, 0x1e, 0x52, 0x85, 0x15, 0x73, 0x4f, 0xc5, 0xa4, + 0x90, 0x8f, 0x8e, 0x90, 0xa4, 0xc2, 0x4e, 0x73, 0x87, 0x8a, 0x89, 0x87, + 0x1f, 0xc4, 0x4d, 0x15, 0x8f, 0x8c, 0x8d, 0x8f, 0xa3, 0xc7, 0x51, 0x72, + 0x86, 0x87, 0x88, 0x86, 0x72, 0x54, 0xc8, 0xa3, 0x1e, 0xfb, 0x21, 0x3e, + 0x15, 0xa4, 0xc7, 0xc5, 0xa3, 0x8f, 0x8c, 0x89, 0x87, 0x73, 0x54, 0x4e, + 0x72, 0x86, 0x87, 0x8e, 0x90, 0x1e, 0xe, 0x5e, 0x78, 0xf9, 0x54, 0x1, + 0xb1, 0xf9, 0x62, 0x3, 0xf7, 0x99, 0xf7, 0x58, 0x15, 0xf7, 0x1c, 0xfb, + 0x6b, 0xf7, 0x27, 0xf7, 0x73, 0xf7, 0x68, 0xf7, 0x1c, 0xfb, 0x6e, 0xf7, + 0x22, 0xfb, 0x21, 0xf7, 0x5f, 0xfb, 0x1e, 0xfb, 0x5f, 0xfb, 0x71, 0xfb, + 0x22, 0x5, 0xf7, 0x7e, 0xfb, 0x1a, 0x15, 0x9e, 0xca, 0xfb, 0x36, 0xbc, + 0x92, 0x9d, 0x83, 0x9d, 0xf7, 0x33, 0xc7, 0x79, 0xc6, 0xc4, 0x78, 0xbc, + 0xf7, 0x37, 0xa1, 0x7e, 0xa0, 0x99, 0xbf, 0xfb, 0x33, 0xc8, 0x9a, 0x79, + 0x52, 0xf7, 0x35, 0x55, 0x84, 0x78, 0x95, 0x7a, 0xfb, 0x33, 0x55, 0x9e, + 0x4d, 0x4f, 0xa1, 0x4f, 0xfb, 0x37, 0x77, 0x93, 0x79, 0x82, 0x5c, 0xf7, + 0x32, 0x5, 0xe, 0x74, 0x3a, 0xa, 0xf7, 0xd6, 0xf7, 0x78, 0x3, 0xf7, + 0x45, 0x7d, 0x15, 0xf7, 0x7b, 0xf7, 0x3d, 0xf7, 0x7c, 0xfb, 0x3d, 0x31, + 0xf7, 0xa9, 0xf7, 0x7c, 0xf7, 0x41, 0x5, 0xfb, 0xb5, 0x6, 0x36, 0xf7, + 0xa1, 0x35, 0xfb, 0xa1, 0x5, 0xfb, 0xb3, 0x6, 0xf7, 0x7e, 0xfb, 0x41, + 0x5, 0xe, 0x7b, 0x92, 0x76, 0xf8, 0x4c, 0xa6, 0xf7, 0x90, 0x54, 0xa, + 0xf9, 0x84, 0x3, 0xf7, 0x46, 0x7d, 0x15, 0xf7, 0x7d, 0xf7, 0x2d, 0xf7, + 0x7d, 0xfb, 0x2d, 0x45, 0xf7, 0xa3, 0xf7, 0x69, 0xf7, 0x4f, 0xfb, 0xa8, + 0x9e, 0x27, 0xf7, 0x86, 0x27, 0xfb, 0x86, 0xfb, 0xa8, 0x78, 0xf7, 0x60, + 0xfb, 0x4f, 0x5, 0x63, 0xfb, 0x86, 0x15, 0xe6, 0xf7, 0x8e, 0xfb, 0x71, + 0xf7, 0x3b, 0xf7, 0xa1, 0x80, 0xd4, 0xf7, 0x90, 0xd4, 0xfb, 0x90, 0xf7, + 0xa1, 0x96, 0xfb, 0x78, 0xfb, 0x3b, 0xec, 0xfb, 0x8e, 0xfb, 0x67, 0xf7, + 0x44, 0x5, 0xe, 0x59, 0x92, 0x76, 0xf9, 0x45, 0xa9, 0x8b, 0x54, 0xa, + 0xb9, 0xf9, 0xd, 0xb3, 0x3, 0xae, 0xf7, 0xec, 0x15, 0xfb, 0x5b, 0xf7, + 0x37, 0xfb, 0x33, 0xf7, 0x59, 0xf7, 0x5b, 0xf7, 0x34, 0xf7, 0x36, 0xf7, + 0x5a, 0xf7, 0x5a, 0xfb, 0x34, 0xf7, 0x35, 0xfb, 0x5a, 0xfb, 0x5d, 0xfb, + 0x34, 0xfb, 0x35, 0xfb, 0x5c, 0x1e, 0xf7, 0x32, 0xfb, 0xa3, 0x15, 0xda, + 0xf7, 0x7e, 0xfb, 0x53, 0xf7, 0x24, 0x5, 0xf7, 0x84, 0x6, 0xd6, 0xf7, + 0x74, 0xd7, 0xfb, 0x74, 0x5, 0xf7, 0x86, 0x6, 0xfb, 0x59, 0xfb, 0x24, + 0xd4, 0xfb, 0x7e, 0xfb, 0x56, 0xf7, 0x25, 0x5, 0xe, 0x8d, 0x92, 0x76, + 0xf7, 0x53, 0xad, 0x8b, 0xf7, 0x4f, 0xf7, 0xc7, 0x77, 0x1, 0xf7, 0xb1, + 0xac, 0x8b, 0xf7, 0x50, 0x8b, 0xaf, 0x3, 0xf7, 0x49, 0x7d, 0x15, 0xf7, + 0x7e, 0xf7, 0x53, 0xf7, 0x84, 0xfb, 0x53, 0xfb, 0x5, 0xf7, 0xb0, 0xf7, + 0x9d, 0xf7, 0x26, 0xfb, 0xcc, 0x89, 0x36, 0xf7, 0xb7, 0x3b, 0xfb, 0xb7, + 0xfb, 0xbb, 0x8d, 0xf7, 0x8e, 0xfb, 0x26, 0x5, 0xac, 0xb3, 0x15, 0xbf, + 0xb6, 0xaf, 0xbf, 0xbd, 0xb6, 0x66, 0x58, 0x59, 0x63, 0x5a, 0x56, 0x58, + 0x5f, 0xb9, 0xc0, 0x1e, 0xe, 0x7b, 0xb2, 0x76, 0xf7, 0x7b, 0xf7, 0x4a, + 0x86, 0xb0, 0xf7, 0xa7, 0x77, 0x12, 0xf7, 0xd4, 0xf7, 0x4a, 0x13, 0xb8, + 0xf7, 0x45, 0x35, 0xa, 0xec, 0x15, 0x13, 0xd8, 0x59, 0xb4, 0x62, 0xbd, + 0xbd, 0xb4, 0xb4, 0xbd, 0xbd, 0x62, 0xb4, 0x59, 0x59, 0x62, 0x62, 0x59, + 0x1e, 0xe, 0xfb, 0xc, 0xc6, 0xa8, 0xf7, 0x5c, 0xc7, 0x9e, 0xe1, 0xb3, + 0xaf, 0x75, 0x77, 0xf7, 0x39, 0x77, 0x12, 0xf8, 0xae, 0xa2, 0xce, 0xa5, + 0x13, 0xef, 0xf8, 0xae, 0xf8, 0x6a, 0x15, 0x90, 0x8d, 0x97, 0x90, 0x8e, + 0x8f, 0x8f, 0x9a, 0x8b, 0xa1, 0x8a, 0x9c, 0x7b, 0x7b, 0x73, 0x82, 0x7e, + 0x88, 0x8, 0x8b, 0x9f, 0x71, 0x95, 0x80, 0x1e, 0xfc, 0xc, 0x97, 0x15, + 0x97, 0x96, 0xd0, 0xb5, 0xdb, 0xaf, 0xbb, 0xa1, 0xc7, 0xa2, 0xa6, 0x94, + 0x8, 0x9c, 0x91, 0x94, 0x8d, 0x90, 0x1a, 0x94, 0x52, 0x90, 0x7e, 0x7e, + 0x4d, 0x73, 0x68, 0x3b, 0x1e, 0x3b, 0x68, 0x34, 0x5f, 0x7f, 0x1a, 0x80, + 0xa4, 0x83, 0x99, 0x85, 0x1e, 0x99, 0x85, 0x92, 0x8d, 0x95, 0x94, 0x8, + 0xfb, 0xe, 0x4c, 0x15, 0x75, 0x95, 0xaf, 0x6d, 0xaf, 0x1b, 0xaf, 0xbd, + 0xaf, 0x96, 0x93, 0x1f, 0x91, 0x98, 0x95, 0xa2, 0x9e, 0x99, 0x9e, 0x98, + 0xb2, 0xa1, 0xab, 0x9b, 0xa2, 0x97, 0xb3, 0x9f, 0xb1, 0x8c, 0x9c, 0x8c, + 0xa1, 0x85, 0x9c, 0x78, 0xa2, 0x91, 0xb0, 0x9c, 0x8a, 0x95, 0x8, 0xa3, + 0x8a, 0x6f, 0xbd, 0x7e, 0x1b, 0x82, 0x26, 0x66, 0x6a, 0x42, 0x1f, 0x42, + 0x6a, 0x47, 0x5c, 0x83, 0x86, 0x8, 0x86, 0x83, 0x7b, 0x79, 0x81, 0x1b, + 0x81, 0x79, 0x94, 0x90, 0x7e, 0x1f, 0x83, 0x8e, 0x79, 0x97, 0x83, 0x95, + 0x7e, 0x7f, 0x81, 0x7d, 0x80, 0x5c, 0x8, 0xf7, 0xf, 0xfb, 0x29, 0x15, + 0x8b, 0xf7, 0x7c, 0xfb, 0x4d, 0x97, 0x81, 0x1e, 0x81, 0x97, 0x9a, 0x85, + 0x92, 0x1b, 0x92, 0x90, 0x8e, 0x92, 0x96, 0x1f, 0x96, 0x92, 0xf7, 0x2c, + 0xf4, 0x96, 0x94, 0x8, 0x96, 0x94, 0x8f, 0x9d, 0x98, 0x98, 0x8c, 0x94, + 0x9d, 0x1a, 0x9d, 0x86, 0x9b, 0x7a, 0xa3, 0x1e, 0x7a, 0xa3, 0x29, 0xf7, + 0x9, 0x80, 0x98, 0x83, 0x95, 0x7f, 0xa0, 0x7a, 0x94, 0x8, 0x13, 0xf7, + 0x83, 0x8f, 0x82, 0x8f, 0x7d, 0x8a, 0x77, 0x8a, 0x66, 0x7e, 0x6d, 0x7b, + 0x78, 0x81, 0x61, 0x77, 0x72, 0x78, 0x77, 0x7b, 0x84, 0x72, 0x88, 0x74, + 0x84, 0x54, 0x87, 0x79, 0x84, 0x83, 0x80, 0x7e, 0x73, 0x7d, 0x78, 0x87, + 0x8, 0xfb, 0x15, 0xf7, 0x11, 0x15, 0x8c, 0x7a, 0x8d, 0x6b, 0x90, 0x75, + 0x8, 0x77, 0x97, 0xb3, 0x77, 0xa9, 0x1b, 0xa9, 0xa8, 0x94, 0x9e, 0x9e, + 0x1f, 0x92, 0xa1, 0x8f, 0xa9, 0x8e, 0xa2, 0x8, 0x80, 0x81, 0x67, 0x6b, + 0x5d, 0x1b, 0x5d, 0x6c, 0xaf, 0x9a, 0x7e, 0x1f, 0xf8, 0x44, 0x8e, 0x15, + 0x76, 0xa2, 0xae, 0xa0, 0x9f, 0x74, 0x5, 0x87, 0x54, 0x15, 0x79, 0xa0, + 0xac, 0xa0, 0x9c, 0x76, 0x5, 0x88, 0x55, 0x15, 0x79, 0x9e, 0xaa, 0xa1, + 0x9d, 0x77, 0x5, 0x53, 0x4, 0x77, 0xa2, 0xa9, 0xa0, 0x9f, 0x77, 0x5, + 0xfb, 0x40, 0xb9, 0x15, 0x75, 0xa2, 0xaf, 0xa3, 0xa1, 0x73, 0x5, 0x86, + 0x51, 0x15, 0x77, 0xa0, 0xae, 0xa3, 0xa0, 0x75, 0x5, 0x86, 0x50, 0x15, + 0x78, 0x9f, 0xaf, 0xa4, 0x9d, 0x78, 0x5, 0x86, 0x50, 0x15, 0x76, 0xa3, + 0xad, 0xa4, 0xa0, 0x73, 0x5, 0xfb, 0x91, 0xf1, 0x15, 0x97, 0x93, 0xf7, + 0x17, 0xd9, 0x94, 0x90, 0x8, 0x90, 0x94, 0x94, 0x8f, 0x92, 0x1b, 0x92, + 0x8c, 0x88, 0x86, 0x86, 0x84, 0x88, 0x7e, 0x83, 0x1f, 0x6e, 0x7a, 0x22, + 0x4d, 0x81, 0x85, 0x8, 0x84, 0x80, 0x7e, 0x7e, 0x80, 0x1b, 0x85, 0x88, + 0x8b, 0x91, 0x93, 0x90, 0x8e, 0x9d, 0x97, 0x1f, 0xd7, 0x58, 0x15, 0x78, + 0xa2, 0xab, 0x9f, 0x9f, 0x74, 0x5, 0x8e, 0x51, 0x15, 0x76, 0xa2, 0xa8, + 0xa0, 0xa1, 0x74, 0x5, 0x8c, 0x53, 0x15, 0x79, 0xa0, 0xa8, 0x9e, 0x9d, + 0x78, 0x5, 0x8a, 0x54, 0x15, 0x77, 0xa2, 0xa9, 0xa1, 0xa1, 0x72, 0x5, + 0x42, 0x48, 0x15, 0x83, 0x95, 0x2f, 0xf4, 0x7c, 0x9c, 0x7c, 0x9c, 0x8c, + 0x94, 0x8f, 0x8e, 0x90, 0x8f, 0x9c, 0x7c, 0x93, 0x82, 0x95, 0x80, 0xe6, + 0x20, 0x92, 0x84, 0x8, 0x84, 0x92, 0x93, 0x87, 0x8f, 0x1b, 0x8f, 0x95, + 0x91, 0x90, 0x92, 0x1f, 0x92, 0x90, 0xf7, 0x6, 0xd8, 0x92, 0x90, 0x8, + 0x90, 0x92, 0x94, 0x92, 0x8f, 0x1b, 0x8f, 0x91, 0x88, 0x86, 0x86, 0x82, + 0x84, 0x82, 0x86, 0x1f, 0x82, 0x86, 0xfb, 0x16, 0x33, 0x84, 0x86, 0x84, + 0x86, 0x89, 0x89, 0x89, 0x85, 0x89, 0x85, 0x8c, 0x70, 0x8a, 0x82, 0x8, + 0x78, 0x88, 0x8b, 0x79, 0x86, 0x1b, 0x86, 0x88, 0x95, 0x9b, 0x93, 0x88, + 0x9e, 0x8a, 0x9d, 0x1f, 0x8a, 0x95, 0x86, 0x94, 0x83, 0x95, 0x8, 0xe, + 0x85, 0xb2, 0x76, 0xf8, 0x2, 0xb5, 0x8b, 0xb0, 0xf7, 0xa7, 0x77, 0x1, + 0xf7, 0x4a, 0x35, 0xa, 0x6e, 0x15, 0xe6, 0xd7, 0xe6, 0x3f, 0x5f, 0xf7, + 0x3, 0xf0, 0xca, 0xfb, 0xb, 0x83, 0x6e, 0xf7, 0x7, 0x6e, 0xfb, 0x7, + 0xfb, 0xb, 0x93, 0xf0, 0x4c, 0x5, 0xe, 0x74, 0xb2, 0x76, 0xf7, 0x75, + 0xa9, 0xf7, 0x19, 0xa5, 0x85, 0xb0, 0xf7, 0xa7, 0x77, 0x12, 0x13, 0xe8, + 0xf7, 0x42, 0x4f, 0xa, 0x5, 0x13, 0xd8, 0x32, 0xa, 0xfb, 0x10, 0x42, + 0x15, 0xf7, 0x10, 0xf2, 0xf7, 0x10, 0x24, 0x4f, 0xf7, 0x29, 0xf7, 0x1c, + 0xe1, 0xfb, 0x34, 0x81, 0x63, 0xf7, 0x30, 0x63, 0xfb, 0x30, 0xfb, 0x34, + 0x95, 0xf7, 0x1c, 0x35, 0x5, 0xe, 0x83, 0x92, 0x76, 0xf8, 0x3f, 0xa0, + 0xf7, 0xa3, 0x77, 0x1, 0xf8, 0x38, 0xd9, 0x3, 0xf7, 0x3f, 0x7d, 0x15, + 0xf7, 0x8d, 0xf7, 0x44, 0xf7, 0x95, 0xfb, 0x44, 0x25, 0xf7, 0xae, 0xf7, + 0x71, 0xf7, 0x3a, 0x5, 0xfb, 0xad, 0x6, 0x2c, 0xf7, 0xa3, 0x2a, 0xfb, + 0xa3, 0x5, 0xfb, 0xb4, 0x6, 0xf7, 0x7d, 0xfb, 0x3a, 0x5, 0xf7, 0x2c, + 0xba, 0x15, 0x38, 0xed, 0xde, 0xf7, 0x8d, 0x5, 0xfb, 0xef, 0x4, 0xd9, + 0xed, 0x5, 0xf7, 0x92, 0x6, 0xfc, 0x61, 0xfb, 0x1f, 0x15, 0xfb, 0x69, + 0xf7, 0x24, 0xf7, 0xea, 0x24, 0x5, 0x8b, 0x4, 0xf7, 0x19, 0x62, 0xf2, + 0xfb, 0x9f, 0x5, 0xfc, 0x61, 0x95, 0x15, 0xf7, 0x75, 0xf7, 0xbd, 0x5, + 0xfb, 0x16, 0x7, 0xe, 0xdf, 0x92, 0x76, 0xf8, 0x47, 0xa0, 0xf7, 0x9b, + 0x77, 0x1, 0xf7, 0xd3, 0xf7, 0xed, 0x3, 0xf7, 0x43, 0x92, 0x15, 0xf7, + 0xd, 0x76, 0xf7, 0x47, 0xf7, 0x17, 0xf7, 0x35, 0xfb, 0x12, 0xf7, 0xf, + 0x86, 0x2c, 0xf7, 0xa9, 0xf7, 0x74, 0xf7, 0x32, 0x4e, 0xa0, 0x5, 0xfb, + 0x73, 0x6, 0x37, 0xf7, 0x89, 0xfb, 0x4, 0x9d, 0x32, 0xfb, 0x9b, 0x5, + 0xfb, 0xb0, 0x6, 0xf7, 0x76, 0xfb, 0x41, 0x5, 0x55, 0xfb, 0x7c, 0x15, + 0xdb, 0xf7, 0x86, 0xfb, 0x53, 0xf7, 0x22, 0x5, 0xf7, 0x84, 0x6, 0xdc, + 0xf7, 0x8b, 0xdd, 0xfb, 0x8b, 0x5, 0xf7, 0x8c, 0x6, 0xfb, 0x5f, 0xfb, + 0x22, 0xda, 0xfb, 0x91, 0xfb, 0x62, 0xf7, 0x38, 0x5, 0xe, 0x2c, 0x9d, + 0x76, 0xf9, 0x4b, 0x77, 0x1, 0xbf, 0xf9, 0x14, 0x3, 0xd2, 0xf7, 0x3, + 0x15, 0xf7, 0x82, 0xf7, 0x9, 0xf7, 0x2d, 0xfb, 0x7b, 0xa0, 0x98, 0x68, + 0xf7, 0xa0, 0xf7, 0x88, 0xd6, 0x5, 0xa3, 0x7, 0xfb, 0x8c, 0xb3, 0xa2, + 0xf7, 0x9e, 0x70, 0x94, 0xfb, 0x1e, 0xfb, 0x86, 0xfb, 0x7f, 0xf7, 0x14, + 0x7c, 0x76, 0xf7, 0x38, 0xfb, 0x71, 0xfb, 0x36, 0xfb, 0x5d, 0x5, 0xe, + 0xfb, 0x8, 0x9a, 0x76, 0xf7, 0x99, 0xf7, 0x3f, 0xf7, 0x9b, 0x77, 0x1, + 0xf7, 0x85, 0x96, 0x8b, 0xf7, 0x3c, 0x3, 0xc4, 0xf7, 0x3, 0x15, 0xf7, + 0x91, 0xf7, 0x20, 0xf7, 0x2f, 0xfb, 0x95, 0x9e, 0x99, 0x4f, 0xf7, 0xac, + 0xf7, 0x9b, 0xc9, 0x5, 0xa7, 0x7, 0xfb, 0xa2, 0x9e, 0xb8, 0xf7, 0xab, + 0x6f, 0x98, 0xfb, 0x16, 0xfb, 0xa0, 0xfb, 0x8f, 0xf7, 0x2e, 0x7a, 0x76, + 0xf7, 0x61, 0xfb, 0x71, 0xfb, 0x5a, 0xfb, 0x5c, 0x5, 0xf7, 0x65, 0xf7, + 0x64, 0x15, 0xb9, 0xb0, 0xb2, 0xbb, 0xba, 0xaf, 0x64, 0x5d, 0x5c, 0x67, + 0x64, 0x5c, 0x5b, 0x66, 0xb2, 0xba, 0x1e, 0xe, 0x31, 0xa0, 0x76, 0xf9, + 0x30, 0x77, 0x1, 0xb3, 0xf9, 0x31, 0x3, 0xf7, 0x4, 0xf7, 0x10, 0x15, + 0xf7, 0x83, 0xf7, 0x45, 0xfb, 0x5, 0xfb, 0xa8, 0xb2, 0x8a, 0xa4, 0x85, + 0xb1, 0x79, 0x19, 0xb4, 0xf7, 0xb8, 0xf7, 0x9, 0xfb, 0xa5, 0xa7, 0xa5, + 0xa2, 0x9b, 0xb1, 0x95, 0x19, 0xfb, 0x48, 0xf7, 0x82, 0xf7, 0xa9, 0xfb, + 0x3, 0x88, 0xaa, 0x99, 0xb2, 0x99, 0xa8, 0x19, 0xfb, 0xb9, 0xb5, 0xf7, + 0xa6, 0xf7, 0x9, 0x74, 0xa3, 0x76, 0xb0, 0x82, 0xa6, 0x19, 0xfb, 0x82, + 0xfb, 0x45, 0xf7, 0x4, 0xf7, 0xa8, 0x6c, 0x8c, 0x62, 0x96, 0x6f, 0x98, + 0x19, 0x60, 0xfb, 0xb8, 0xfb, 0x8, 0xf7, 0xa5, 0x77, 0x79, 0x68, 0x76, + 0x6a, 0x7e, 0x19, 0x8c, 0x6, 0xf7, 0x45, 0xfb, 0x82, 0xfb, 0xa8, 0xf7, + 0x3, 0x5, 0x64, 0x80, 0x70, 0x7c, 0x6a, 0x1e, 0xf7, 0xb9, 0x60, 0xfb, + 0xa5, 0xfb, 0x8, 0xa4, 0x6f, 0x98, 0x74, 0x99, 0x66, 0x19, 0xe, 0x5a, + 0x9f, 0x76, 0xf8, 0x8f, 0x77, 0xae, 0x77, 0xf7, 0x46, 0x77, 0x12, 0xc2, + 0xf9, 0x3c, 0x13, 0xd8, 0xeb, 0xf7, 0x31, 0x15, 0xf7, 0x8b, 0xf7, 0x6, + 0x5c, 0xfb, 0xa1, 0x9d, 0x88, 0xe7, 0xf7, 0x93, 0xf7, 0x31, 0xfb, 0x73, + 0x99, 0x94, 0xfb, 0x7, 0xf7, 0x8b, 0xf7, 0xa2, 0x5c, 0x8e, 0x9b, 0xfb, + 0x93, 0xe9, 0xf7, 0x73, 0xf7, 0x30, 0x5, 0x13, 0xb8, 0x80, 0x9a, 0xfb, + 0x89, 0xfb, 0x6, 0xba, 0xf7, 0xa1, 0x79, 0x8e, 0x2d, 0xfb, 0x93, 0xfb, + 0x2f, 0xf7, 0x73, 0x7c, 0x82, 0xf7, 0x8, 0xfb, 0x8b, 0xfb, 0xa2, 0xba, + 0x88, 0x7b, 0xf7, 0x93, 0x2d, 0xfb, 0x73, 0xfb, 0x30, 0x5, 0xe, 0x5c, + 0x78, 0x60, 0xa, 0x8e, 0xbe, 0x7e, 0x67, 0xa, 0x95, 0x77, 0xb8, 0xcf, + 0x48, 0xcf, 0xd7, 0xa7, 0x8c, 0x77, 0x12, 0xb0, 0x60, 0xa, 0x95, 0xbe, + 0x77, 0x67, 0xa, 0xae, 0xcf, 0x48, 0xcf, 0xd7, 0xa7, 0x13, 0xec, 0x52, + 0xb4, 0x55, 0x40, 0xf7, 0x8a, 0xa1, 0x15, 0x73, 0xa6, 0x7f, 0xb9, 0xae, + 0x1a, 0xb8, 0x9d, 0xb5, 0xab, 0xab, 0x1e, 0x8d, 0x89, 0x5, 0x81, 0x7a, + 0x85, 0x76, 0x78, 0x1a, 0x61, 0xa3, 0x6c, 0xb4, 0x82, 0x1e, 0x49, 0x97, + 0xbf, 0x4e, 0xd2, 0x1b, 0xa5, 0xa3, 0x95, 0x9d, 0x9e, 0x1f, 0x79, 0x8c, + 0x79, 0x92, 0x7b, 0x93, 0x4f, 0xa9, 0x65, 0xc3, 0x8a, 0xcf, 0x8e, 0x8c, + 0x18, 0x64, 0x94, 0xaf, 0x64, 0xb6, 0x1b, 0x9b, 0x9b, 0x91, 0x93, 0x98, + 0x1f, 0x78, 0xa7, 0xad, 0x80, 0xad, 0x1b, 0xc9, 0xc0, 0xb2, 0xcc, 0x8e, + 0x1f, 0x73, 0x70, 0x5d, 0x7f, 0x68, 0x1b, 0x5e, 0x61, 0x9d, 0xab, 0x6b, + 0x7f, 0xa, 0x13, 0xd1, 0x52, 0xb9, 0x21, 0x40, 0x81, 0x9c, 0xa0, 0x85, + 0x9e, 0x1b, 0xb5, 0xaa, 0xa3, 0xb4, 0x94, 0x1f, 0xcd, 0x97, 0xc8, 0xbf, + 0xd2, 0x1a, 0xa5, 0x81, 0xa3, 0x79, 0x9e, 0x1e, 0x8a, 0x79, 0x84, 0x79, + 0x83, 0x7b, 0x6d, 0x4f, 0x53, 0x65, 0x47, 0x8a, 0x8a, 0x8e, 0x18, 0xb2, + 0x94, 0xb2, 0xaf, 0xb6, 0x1a, 0x9b, 0x85, 0x9b, 0x83, 0x98, 0x1e, 0x13, + 0xe5, 0x52, 0xb9, 0x54, 0xc0, 0x9e, 0xa7, 0x96, 0xad, 0xad, 0x1a, 0x13, + 0xe5, 0x52, 0xb9, 0x21, 0x40, 0xc9, 0x64, 0xc0, 0x4a, 0x8e, 0x1e, 0x13, + 0xe5, 0x52, 0xb9, 0x54, 0xc0, 0xa3, 0x70, 0x97, 0x5d, 0x68, 0x1a, 0x5e, + 0x79, 0x61, 0x6b, 0x6b, 0x1e, 0x89, 0x8d, 0x5, 0x13, 0xe4, 0x82, 0xb9, + 0x49, 0x40, 0x95, 0x9c, 0x91, 0xa0, 0x9e, 0x1a, 0xb5, 0x73, 0xaa, 0x62, + 0x94, 0x1e, 0x13, 0xe5, 0x46, 0x79, 0x49, 0x40, 0xcd, 0x7f, 0x57, 0xc8, + 0x44, 0x1b, 0x71, 0x73, 0x81, 0x79, 0x78, 0x1f, 0x9d, 0x8a, 0x9d, 0x84, + 0x9b, 0x83, 0xc7, 0x6d, 0xb1, 0x53, 0x8c, 0x47, 0x88, 0x8a, 0x18, 0xb2, + 0x82, 0x67, 0xb2, 0x60, 0x1b, 0x7b, 0x7b, 0x85, 0x83, 0x7e, 0x1f, 0x13, + 0xe5, 0x51, 0xb9, 0x55, 0x40, 0x9e, 0x6f, 0x69, 0x96, 0x69, 0x1b, 0x6e, + 0xa, 0x4d, 0x56, 0x64, 0x4a, 0x88, 0x1f, 0x13, 0xe5, 0x51, 0xb9, 0x55, + 0x40, 0xa3, 0xa6, 0xb9, 0x97, 0xae, 0x1b, 0xb8, 0xb5, 0x79, 0x6b, 0xab, + 0x1f, 0x89, 0x89, 0x5, 0x13, 0xe8, 0x22, 0xb9, 0x55, 0x40, 0x95, 0x7a, + 0x76, 0x91, 0x78, 0x1b, 0x61, 0x6c, 0x73, 0x62, 0x82, 0x1f, 0x49, 0x7f, + 0x4e, 0x57, 0x44, 0x1a, 0x71, 0x95, 0x73, 0x9d, 0x78, 0x1e, 0x8c, 0x9d, + 0x92, 0x9d, 0x93, 0x9b, 0xa9, 0xc7, 0xc3, 0xb1, 0xcf, 0x8c, 0x8c, 0x88, + 0x18, 0x64, 0x82, 0x64, 0x67, 0x60, 0x1a, 0x7b, 0x91, 0x7b, 0x93, 0x7e, + 0x1e, 0x78, 0x6f, 0x80, 0x69, 0x69, 0x1a, 0x4d, 0xb2, 0x56, 0xcc, 0x88, + 0x1e, 0xc6, 0xf7, 0x6, 0x15, 0x81, 0x9b, 0x87, 0x9e, 0x9e, 0x1a, 0x13, + 0xe3, 0x52, 0xb9, 0x55, 0x40, 0xb6, 0xa1, 0xbc, 0xb4, 0x9d, 0x1e, 0x8a, + 0x8d, 0x5, 0x8e, 0x7f, 0x7e, 0x8d, 0x7f, 0x1b, 0x65, 0x4c, 0x79, 0x6e, + 0x70, 0x1f, 0x6e, 0xa, 0xbd, 0x98, 0xc2, 0xb1, 0xbd, 0x1b, 0x96, 0x96, + 0x89, 0x87, 0x95, 0x1f, 0x8c, 0x8d, 0x73, 0xb6, 0x42, 0xb8, 0x59, 0x8a, + 0x19, 0x13, 0xe5, 0x4a, 0xb2, 0x15, 0x40, 0x95, 0x9b, 0x9e, 0x8f, 0x9e, + 0x1b, 0x13, 0xe5, 0x52, 0xb8, 0xd5, 0x40, 0xb6, 0xbc, 0x75, 0x62, 0x9d, + 0x1f, 0x8d, 0x8c, 0x5, 0x8e, 0x97, 0x8d, 0x98, 0x97, 0x1a, 0xb1, 0x79, + 0xca, 0x6e, 0xa6, 0x1e, 0x13, 0xe5, 0x52, 0xb9, 0x21, 0x40, 0xbd, 0x7e, + 0xb1, 0x54, 0x59, 0x1a, 0x80, 0x89, 0x80, 0x87, 0x81, 0x1e, 0x8d, 0x8a, + 0xb6, 0xa3, 0xb8, 0xd4, 0x8a, 0xbd, 0x19, 0x13, 0xc8, 0x82, 0xb9, 0x53, + 0x40, 0x95, 0x7b, 0x8f, 0x78, 0x78, 0x1a, 0x60, 0x75, 0x5a, 0x62, 0x79, + 0x1e, 0x8c, 0x89, 0x5, 0x88, 0x97, 0x98, 0x89, 0x97, 0x1b, 0xb1, 0xca, + 0x9d, 0xa8, 0xa6, 0x1f, 0x59, 0x7e, 0x54, 0x65, 0x59, 0x1b, 0x80, 0x80, + 0x8d, 0x8f, 0x81, 0x1f, 0x8a, 0x89, 0x5, 0x13, 0xe5, 0x52, 0xb9, 0x55, + 0x40, 0xa3, 0x60, 0xd4, 0x5e, 0xbd, 0x8c, 0x8, 0x13, 0xe5, 0x52, 0xb2, + 0x21, 0x40, 0x81, 0x7b, 0x78, 0x87, 0x78, 0x1b, 0x60, 0x5a, 0xa1, 0xb4, + 0x79, 0x1f, 0x89, 0x8a, 0x5, 0x88, 0x7f, 0x89, 0x7e, 0x7f, 0x1a, 0x65, + 0x9d, 0x4c, 0xa8, 0x70, 0x1e, 0x59, 0x98, 0x65, 0xc2, 0xbd, 0x1a, 0x96, + 0x8d, 0x96, 0x8f, 0x95, 0x1e, 0x89, 0x8c, 0x5, 0x13, 0xe5, 0x52, 0xb9, + 0x55, 0x40, 0x60, 0x73, 0x5e, 0x42, 0x8c, 0x59, 0x8, 0xd1, 0xf7, 0x39, + 0x15, 0xa4, 0x97, 0xa6, 0x86, 0x87, 0xa6, 0x98, 0xa4, 0x70, 0x8f, 0x78, + 0x9f, 0x7e, 0x73, 0x5, 0x6e, 0xa, 0x72, 0x7f, 0x9f, 0x77, 0x5, 0xe, + 0xfb, 0x24, 0x92, 0x76, 0xf9, 0x64, 0x77, 0x1, 0xb2, 0xf8, 0xfd, 0x3, + 0xb2, 0xf7, 0x3e, 0x15, 0xf7, 0x8d, 0xd7, 0xc6, 0xfb, 0x98, 0xc7, 0xf7, + 0x98, 0xf7, 0x8d, 0x3e, 0xfb, 0x5a, 0xf7, 0x44, 0xf7, 0x5f, 0xf7, 0x44, + 0xfb, 0x92, 0x3c, 0x51, 0xf7, 0x9c, 0x4e, 0xfb, 0x9c, 0xfb, 0x91, 0xda, + 0xf7, 0x5e, 0xfb, 0x44, 0x5, 0xe, 0x59, 0x4c, 0xa2, 0xf7, 0x6a, 0xa8, + 0xf8, 0x8a, 0x77, 0x1, 0xf7, 0x51, 0xcd, 0x15, 0x81, 0x7c, 0x87, 0x79, + 0x79, 0x1a, 0x5b, 0xa4, 0x6d, 0xbc, 0xa7, 0xa8, 0x95, 0x97, 0xa5, 0x1e, + 0xc0, 0xa4, 0xba, 0xb1, 0xb5, 0xb3, 0x8, 0xb4, 0xb6, 0xdb, 0xd2, 0xca, + 0x1b, 0xa2, 0x9e, 0x82, 0x79, 0x99, 0x1f, 0x8f, 0x9c, 0x9d, 0x8e, 0x5, + 0xa3, 0x7a, 0x72, 0x97, 0x6e, 0x1b, 0x4c, 0x46, 0x56, 0x61, 0x5f, 0x1f, + 0x5a, 0x58, 0xfb, 0x2, 0x28, 0x40, 0x1b, 0x6e, 0x6d, 0xa1, 0xaa, 0x97, + 0x8f, 0x97, 0x90, 0x96, 0x1f, 0x84, 0x92, 0x99, 0x7d, 0x95, 0x1b, 0x90, + 0x8e, 0x8d, 0x8f, 0x8e, 0x1f, 0xe8, 0xf7, 0x13, 0x5, 0x8f, 0x91, 0x8c, + 0x98, 0x92, 0x1a, 0x94, 0x89, 0x9f, 0x84, 0x91, 0x1e, 0x81, 0x94, 0x77, + 0x9b, 0x9a, 0x1a, 0xad, 0xc4, 0xe0, 0x9f, 0xa7, 0x1e, 0xa5, 0x9e, 0xb7, + 0xc8, 0xb1, 0xac, 0xa5, 0x71, 0x95, 0x1b, 0x90, 0x8f, 0x8f, 0x8f, 0x8e, + 0x1f, 0xe7, 0xf7, 0x13, 0x5, 0x8f, 0x90, 0x8b, 0x97, 0x91, 0x1a, 0x93, + 0x8b, 0x9d, 0x84, 0x91, 0x1e, 0xa0, 0x73, 0x54, 0x9b, 0x6c, 0x1b, 0x7c, + 0x7d, 0x88, 0x83, 0x7f, 0x1f, 0x4a, 0x60, 0x32, 0xfb, 0x5, 0x5c, 0x4a, + 0x59, 0x46, 0x41, 0xfb, 0x0, 0x72, 0x39, 0x8, 0x88, 0x80, 0x89, 0x7e, + 0x7f, 0x1a, 0x65, 0x9d, 0x67, 0xa2, 0x6e, 0x1e, 0xa8, 0xb3, 0x15, 0x72, + 0x9d, 0x74, 0xb1, 0xaa, 0x1a, 0xbb, 0xf7, 0x8, 0xf7, 0x3f, 0xaa, 0xb6, + 0x1e, 0xba, 0xcc, 0xd9, 0xf4, 0xcc, 0xb8, 0x8, 0x92, 0x95, 0x97, 0x8d, + 0x97, 0x1b, 0xa4, 0xad, 0x80, 0x7c, 0x9f, 0x1f, 0x8e, 0x88, 0x8f, 0x88, + 0x86, 0x1a, 0x83, 0x4d, 0x3a, 0x82, 0x7f, 0x1e, 0x88, 0x89, 0x87, 0x87, + 0x87, 0x84, 0x79, 0x9d, 0x79, 0x1b, 0x7b, 0x7e, 0x85, 0x82, 0x7e, 0x1f, + 0x54, 0x66, 0x37, 0xfb, 0x16, 0x6e, 0x4c, 0x8, 0x87, 0x82, 0x7d, 0x6e, + 0x81, 0x7e, 0xb0, 0x73, 0x83, 0x1a, 0x81, 0x4a, 0x37, 0x81, 0x7e, 0x1e, + 0x88, 0x89, 0x88, 0x89, 0x87, 0x1b, 0x87, 0x88, 0x8d, 0x8d, 0x88, 0x1f, + 0xe, 0x4c, 0x9a, 0x76, 0xf9, 0x55, 0x54, 0xa, 0xf9, 0x56, 0x3, 0xf7, + 0xad, 0xf7, 0x86, 0x15, 0x62, 0xfb, 0x7d, 0x5, 0x7e, 0x89, 0x8c, 0x89, + 0x8c, 0x1b, 0x91, 0x92, 0x95, 0x8f, 0x8e, 0x1f, 0xf7, 0x16, 0xf7, 0x4c, + 0xf7, 0x1b, 0xfb, 0x53, 0x5, 0x85, 0x90, 0x8c, 0x8a, 0x8d, 0x1b, 0x8f, + 0x8e, 0x8d, 0x93, 0x89, 0x1f, 0x5e, 0xf7, 0x82, 0xf7, 0x7b, 0x5f, 0x5, + 0x9d, 0x88, 0x8e, 0x8c, 0x8d, 0x1a, 0x90, 0x7f, 0x93, 0x89, 0x8c, 0x1e, + 0xfb, 0x53, 0xf7, 0x1b, 0xf7, 0x51, 0xf7, 0x17, 0x5, 0x94, 0x91, 0x92, + 0x93, 0x8f, 0x1a, 0x90, 0x7c, 0x8b, 0x81, 0x88, 0x1e, 0xfb, 0x77, 0x62, + 0xb4, 0xf7, 0x6e, 0x5, 0x9f, 0x8f, 0x8b, 0x8f, 0x89, 0x1b, 0x81, 0x82, + 0x7b, 0x8a, 0x8a, 0x1f, 0xfb, 0x12, 0xfb, 0x49, 0xfb, 0x16, 0xf7, 0x4c, + 0x5, 0x8d, 0x8a, 0x84, 0x97, 0x87, 0x1b, 0x81, 0x91, 0x7a, 0x87, 0x1f, + 0xb4, 0xfb, 0x71, 0xfb, 0x74, 0xb4, 0x5, 0x86, 0x8c, 0x7a, 0x90, 0x82, + 0x1a, 0x85, 0x97, 0x85, 0x8d, 0x89, 0x1e, 0xf7, 0x50, 0xfb, 0x1a, 0xfb, + 0x4f, 0xfb, 0x12, 0x5, 0x87, 0x88, 0x80, 0x84, 0x87, 0x1a, 0x84, 0x9c, + 0x8e, 0x8f, 0x8c, 0x1e, 0xe, 0x44, 0x99, 0x76, 0xf9, 0x56, 0x54, 0xa, + 0xf9, 0x4f, 0x3, 0xae, 0xf7, 0x58, 0x15, 0xf7, 0x6c, 0xa8, 0x70, 0xfb, + 0x7c, 0xf7, 0x32, 0xf7, 0x3d, 0xf7, 0x32, 0xfb, 0x3d, 0x72, 0xf7, 0x7c, + 0xf7, 0x6f, 0x6e, 0xfb, 0x3d, 0xf7, 0x31, 0xf7, 0x39, 0xf7, 0x31, 0xfb, + 0x6b, 0x6e, 0xa4, 0xf7, 0x6e, 0xfb, 0x32, 0xfb, 0x3d, 0xfb, 0x32, 0xf7, + 0x3d, 0xa6, 0xfb, 0x6e, 0xfb, 0x6c, 0xa8, 0xf7, 0x3c, 0xfb, 0x31, 0x5, + 0xe, 0x5c, 0x3a, 0xa, 0xdf, 0xf9, 0x7, 0x3, 0xdf, 0xf7, 0x35, 0x15, + 0xf7, 0x48, 0xbb, 0x5b, 0xfb, 0x41, 0xf7, 0x18, 0xf7, 0x16, 0xc7, 0xfb, + 0x48, 0xb5, 0xf7, 0x41, 0xf7, 0x14, 0xfb, 0xf, 0x5b, 0xf7, 0x3f, 0xf7, + 0x49, 0x63, 0xfb, 0x14, 0xf7, 0x18, 0xf7, 0x42, 0xb9, 0xfb, 0x41, 0xba, + 0xf7, 0x17, 0xf7, 0x10, 0xfb, 0x50, 0x62, 0xb9, 0xf7, 0x47, 0xfb, 0x12, + 0xfb, 0x14, 0x5b, 0xf7, 0x47, 0x5a, 0xfb, 0x43, 0xfb, 0x15, 0xf7, 0x12, + 0xb8, 0xfb, 0x49, 0xfb, 0x4a, 0xba, 0xf7, 0x19, 0xfb, 0x19, 0xfb, 0x4a, + 0x56, 0xf7, 0x44, 0x5c, 0x5, 0xe, 0x3b, 0x9c, 0x76, 0xa3, 0x76, 0xf7, + 0xa4, 0x7c, 0xa, 0xe6, 0x77, 0xa0, 0x77, 0xf7, 0x5f, 0x77, 0x12, 0xf7, + 0xcb, 0x7c, 0xa, 0x13, 0x6e, 0xd8, 0xf7, 0x7, 0xf7, 0xb, 0x15, 0x99, + 0x82, 0xa0, 0x76, 0x94, 0x7d, 0xf7, 0x49, 0xf7, 0x63, 0x18, 0x8c, 0x8a, + 0xfb, 0xe, 0xfb, 0x8b, 0x9c, 0x88, 0xa6, 0x81, 0x99, 0x80, 0x19, 0xe3, + 0xf7, 0x99, 0x5, 0x8d, 0x6, 0x13, 0xae, 0xd8, 0x79, 0xfb, 0xa7, 0x9c, + 0x8f, 0xa7, 0x8b, 0x9c, 0x87, 0x19, 0x79, 0xf7, 0xa7, 0x5, 0x8c, 0x6, + 0xe4, 0xfb, 0x99, 0x99, 0x96, 0xa5, 0x95, 0x9c, 0x8e, 0x19, 0xfb, 0xe, + 0xf7, 0x8b, 0x8d, 0x8c, 0xf7, 0x49, 0xfb, 0x63, 0x94, 0x99, 0xa0, 0xa0, + 0x99, 0x94, 0x19, 0xfb, 0x63, 0xf7, 0x49, 0x8c, 0x8c, 0xf7, 0x8b, 0xfb, + 0xe, 0x8e, 0x9c, 0x95, 0xa6, 0x96, 0x99, 0x19, 0xfb, 0x99, 0xe3, 0x75, + 0xa, 0xf7, 0xa7, 0x79, 0x87, 0x9c, 0x8b, 0xa7, 0x8f, 0x9c, 0x19, 0xfb, + 0xa7, 0x79, 0x5, 0x8c, 0x7, 0xf7, 0x99, 0xe4, 0x80, 0x99, 0x81, 0xa5, + 0x88, 0x9c, 0x19, 0xfb, 0x8b, 0xfb, 0xe, 0x8a, 0x8d, 0xf7, 0x63, 0xf7, + 0x49, 0x7d, 0x94, 0x76, 0xa0, 0x82, 0x99, 0x19, 0xfb, 0x49, 0xfb, 0x63, + 0x8a, 0x8c, 0xf7, 0xe, 0xf7, 0x8b, 0x7a, 0x8e, 0x70, 0x95, 0x7d, 0x96, + 0x19, 0x33, 0xfb, 0x99, 0x5, 0x89, 0x6, 0x9d, 0xf7, 0xa7, 0x7a, 0x87, + 0x6f, 0x8b, 0x7a, 0x8f, 0x19, 0x9d, 0xfb, 0xa7, 0x5, 0x8a, 0x6, 0x32, + 0xf7, 0x99, 0x5, 0x7d, 0x7e, 0x71, 0x81, 0x79, 0x1b, 0xf7, 0xe, 0xfb, + 0x8b, 0x89, 0x8a, 0xfb, 0x49, 0xf7, 0x63, 0x82, 0x7d, 0x76, 0x76, 0x7d, + 0x82, 0x19, 0xf7, 0x63, 0xfb, 0x49, 0x8a, 0x8a, 0x5, 0x13, 0x75, 0xe8, + 0xfb, 0x8b, 0xf7, 0xe, 0x88, 0x7a, 0x81, 0x70, 0x80, 0x7d, 0x19, 0xf7, + 0x99, 0x33, 0x80, 0xa, 0xfb, 0xa7, 0x9d, 0x8f, 0x7a, 0x8b, 0x6f, 0x87, + 0x7a, 0x19, 0xf7, 0xa7, 0x9d, 0x5, 0x8a, 0x7, 0xfb, 0x99, 0x32, 0x96, + 0x7d, 0x95, 0x71, 0x8e, 0x7a, 0x19, 0xf7, 0x8b, 0xf7, 0xe, 0x8c, 0x89, + 0x5, 0x8e, 0xb3, 0x15, 0xa9, 0xa4, 0xa4, 0xa9, 0xa9, 0xa4, 0x72, 0x6d, + 0x6d, 0x72, 0x72, 0x6d, 0x6d, 0x72, 0xa4, 0xa9, 0x1e, 0xe, 0xfb, 0x18, + 0xac, 0x76, 0xf7, 0xc8, 0xa0, 0x89, 0xa0, 0xf7, 0xc8, 0x77, 0x12, 0xf7, + 0xe1, 0xa0, 0x89, 0xa0, 0x13, 0xb8, 0xa4, 0xf7, 0x99, 0x15, 0x47, 0xf7, + 0x8, 0xaa, 0xaa, 0x99, 0x1e, 0xa3, 0x96, 0xa4, 0x99, 0xa4, 0x99, 0xa4, + 0x99, 0xa5, 0x99, 0xa0, 0x97, 0x8, 0x8d, 0x8f, 0x8e, 0x8c, 0x8d, 0x1b, + 0x8f, 0x8d, 0x89, 0x87, 0x89, 0x8a, 0x88, 0x89, 0x87, 0x1f, 0x7f, 0x74, + 0x7c, 0x71, 0x7c, 0x70, 0x8, 0x71, 0x5e, 0x6d, 0x5a, 0x57, 0x1a, 0x6e, + 0x93, 0x61, 0xad, 0xae, 0xa6, 0xbe, 0xa7, 0x92, 0x1e, 0x94, 0xac, 0x8d, + 0xb9, 0xb9, 0xa8, 0x8c, 0xa7, 0xa4, 0x1a, 0x93, 0x8e, 0x90, 0x8f, 0x8e, + 0x8f, 0x88, 0x86, 0x8e, 0x1e, 0x99, 0x75, 0x9a, 0x71, 0x9b, 0x70, 0xa2, + 0x65, 0xa3, 0x64, 0xa1, 0x75, 0xa4, 0x72, 0xc1, 0x6d, 0xa6, 0xa6, 0xa6, + 0xa6, 0x6d, 0xc1, 0x72, 0xa4, 0x73, 0xa3, 0x64, 0xa4, 0x63, 0xa2, 0x72, + 0x9a, 0x72, 0x9a, 0x76, 0x97, 0x8, 0x86, 0x8e, 0x88, 0x8f, 0x8e, 0x1a, + 0x8f, 0x90, 0x8e, 0x93, 0x1e, 0x8c, 0xa5, 0xa9, 0x8b, 0xaa, 0x1b, 0xb8, + 0x8c, 0xb7, 0x8d, 0xaa, 0x93, 0x8, 0xa9, 0x93, 0xbc, 0xa4, 0xaf, 0x1a, + 0x13, 0xd4, 0x99, 0x83, 0x95, 0x7f, 0x92, 0x1e, 0x67, 0xa1, 0x57, 0x7e, + 0x67, 0x7b, 0x73, 0x80, 0x70, 0x7d, 0x71, 0x7c, 0x72, 0x7d, 0x72, 0x7d, + 0x75, 0x7f, 0x8, 0x89, 0x87, 0x88, 0x8a, 0x89, 0x1b, 0x87, 0x89, 0x8d, + 0x8f, 0x8d, 0x8c, 0x8e, 0x8d, 0x8f, 0x1f, 0x97, 0xa2, 0x9a, 0xa5, 0x9a, + 0xa6, 0x9a, 0xa5, 0x99, 0xa6, 0x95, 0xa3, 0x8, 0xaa, 0x99, 0xa4, 0xf7, + 0x1, 0x4b, 0x1b, 0x66, 0x74, 0x5a, 0x6d, 0x82, 0x1f, 0x82, 0x6a, 0x89, + 0x5d, 0x5d, 0x6e, 0x8a, 0x6f, 0x72, 0x1a, 0x83, 0x88, 0x86, 0x87, 0x88, + 0x87, 0x8e, 0x90, 0x88, 0x1e, 0x7d, 0xa1, 0x7c, 0xa5, 0x7b, 0xa6, 0x74, + 0xb1, 0x73, 0xb2, 0x75, 0xa1, 0x72, 0xa4, 0x55, 0xa9, 0x70, 0x70, 0x70, + 0x70, 0xa9, 0x55, 0xa4, 0x72, 0xa3, 0x73, 0xb2, 0x72, 0xb3, 0x74, 0xa4, + 0x7c, 0xa4, 0x7c, 0xa0, 0x7f, 0x8, 0x90, 0x88, 0x8e, 0x87, 0x88, 0x1a, + 0x87, 0x86, 0x88, 0x83, 0x1e, 0x8a, 0x71, 0x6d, 0x8b, 0x6c, 0x1b, 0x5e, + 0x8a, 0x5f, 0x89, 0x6c, 0x83, 0x8, 0x13, 0xd8, 0x6c, 0x83, 0x5b, 0x71, + 0x68, 0x1a, 0xe, 0xfb, 0x17, 0xae, 0x76, 0xf7, 0x64, 0xf7, 0x8, 0x63, + 0xb3, 0x94, 0xf7, 0xa, 0xf7, 0x63, 0x77, 0x12, 0xf7, 0x80, 0xf7, 0xa, + 0x9d, 0xf7, 0xc, 0x13, 0xde, 0xa4, 0xf7, 0x9a, 0x15, 0x6b, 0xbe, 0x83, + 0xa3, 0x1e, 0x13, 0xbe, 0xda, 0xc2, 0xd7, 0xb6, 0x1b, 0x9d, 0x9a, 0x7d, + 0x79, 0x1f, 0x6e, 0x3f, 0x45, 0x3c, 0x1a, 0x73, 0x92, 0x59, 0xac, 0xad, + 0xa7, 0xbd, 0xa7, 0x93, 0x1e, 0x91, 0x9f, 0x8d, 0xa0, 0xa0, 0xa2, 0x88, + 0xa0, 0xa2, 0x1a, 0xa2, 0x8d, 0xa5, 0xaa, 0x97, 0x93, 0x86, 0x81, 0x92, + 0x1e, 0xa8, 0x61, 0x95, 0x61, 0xb3, 0x63, 0x8, 0x77, 0x9f, 0xac, 0x79, + 0xa7, 0x1b, 0xa1, 0x99, 0x97, 0xa2, 0xa7, 0x77, 0xad, 0x78, 0x9e, 0x1f, + 0x64, 0xb2, 0x62, 0x96, 0x5f, 0xa7, 0x8, 0x81, 0x92, 0x84, 0x94, 0x98, + 0x1a, 0xa4, 0xa1, 0x91, 0xa0, 0x1e, 0xa2, 0xa2, 0x89, 0xa2, 0x1b, 0xa2, + 0xa2, 0x8d, 0x91, 0xa1, 0x1f, 0xa7, 0x93, 0xbd, 0xa7, 0xad, 0x1a, 0xac, + 0x59, 0x94, 0x72, 0x1e, 0x3e, 0x44, 0x3c, 0x6c, 0x1b, 0x7a, 0x7d, 0x9a, + 0x9c, 0x1f, 0xa9, 0xd9, 0xd6, 0xd6, 0x1a, 0xa3, 0x82, 0xbd, 0x6b, 0x69, + 0x6d, 0x59, 0x6f, 0x84, 0x1e, 0x84, 0x71, 0x8a, 0x71, 0x70, 0x74, 0x8d, + 0x74, 0x75, 0x1a, 0x79, 0x81, 0x79, 0x77, 0x7e, 0x81, 0x94, 0x95, 0x84, + 0x1e, 0x85, 0x95, 0x85, 0x97, 0x86, 0x96, 0x7a, 0xac, 0x79, 0xac, 0x71, + 0xa5, 0x8, 0x9e, 0x78, 0x6b, 0x9e, 0x6f, 0x1b, 0x74, 0x7d, 0x7d, 0x74, + 0x6f, 0x9e, 0x6b, 0x9e, 0x78, 0x1f, 0xb0, 0x66, 0xb8, 0x7b, 0xb6, 0x71, + 0x8, 0x95, 0x85, 0x94, 0x81, 0x7e, 0x1a, 0x76, 0x74, 0x81, 0x79, 0x1e, + 0x72, 0x73, 0x8d, 0x72, 0x1b, 0x75, 0x74, 0x8a, 0x85, 0x76, 0x1f, 0x6f, + 0x83, 0x57, 0x6e, 0x69, 0x1a, 0xf7, 0xa5, 0xda, 0x15, 0xaa, 0xa4, 0xa4, + 0xaa, 0xaa, 0xa4, 0x72, 0x6c, 0x6c, 0x72, 0x72, 0x6c, 0x6c, 0x72, 0xa4, + 0xaa, 0x1e, 0xe, 0xfb, 0x31, 0x3f, 0xa, 0x12, 0xf7, 0x9d, 0xf7, 0x2f, + 0x2f, 0xa3, 0x13, 0xd0, 0xae, 0xf7, 0x49, 0x15, 0xc2, 0x52, 0xd6, 0x96, + 0xb2, 0xc4, 0x8, 0x13, 0xe0, 0xae, 0xbb, 0xb0, 0xc1, 0xbf, 0xa9, 0x8, + 0x56, 0x7b, 0x5d, 0x7b, 0x63, 0x1e, 0x73, 0x4d, 0x84, 0x76, 0x73, 0x1a, + 0x5b, 0xae, 0x6b, 0xb6, 0x7f, 0x1e, 0x13, 0xd0, 0xb7, 0x97, 0xac, 0xac, + 0xbe, 0x1a, 0x67, 0xf5, 0x7c, 0xae, 0x79, 0xbc, 0x8c, 0xbf, 0x19, 0xbe, + 0x6e, 0xaf, 0x57, 0xad, 0x5d, 0xa7, 0x4a, 0xec, 0x83, 0xbc, 0xc2, 0x8, + 0xd3, 0x6d, 0xb1, 0x48, 0x94, 0x1e, 0x20, 0x9a, 0x60, 0x98, 0x64, 0x9f, + 0xc0, 0xab, 0xc9, 0x92, 0xc7, 0x94, 0x8, 0xd5, 0x94, 0xb0, 0xb0, 0xe1, + 0x1a, 0x4a, 0xb4, 0x4b, 0x7b, 0x5e, 0x53, 0x3b, 0x2b, 0x6f, 0x72, 0x7e, + 0x86, 0x89, 0xcb, 0x98, 0xa8, 0xa3, 0xc4, 0x8, 0x94, 0xa0, 0xa2, 0xc4, + 0xa2, 0x1a, 0xb5, 0x63, 0xaa, 0x67, 0x97, 0x1e, 0x5f, 0x7f, 0x66, 0x6c, + 0x5a, 0x1a, 0x6c, 0x9d, 0x67, 0x96, 0x70, 0x1e, 0x9a, 0x68, 0xa1, 0x53, + 0x50, 0x1a, 0x5e, 0xa0, 0x67, 0xbe, 0x6f, 0xb3, 0x61, 0xc7, 0x50, 0xaf, + 0x38, 0x59, 0x8, 0xfb, 0xc, 0xd0, 0x84, 0xcc, 0x81, 0x1e, 0xbe, 0x84, + 0xbf, 0x81, 0xba, 0x70, 0x67, 0x75, 0x5e, 0x7f, 0x2a, 0x7d, 0x8, 0x45, + 0x82, 0x67, 0x79, 0x31, 0x1a, 0xe, 0xfb, 0x1e, 0x95, 0xc3, 0x87, 0xb4, + 0xef, 0xa7, 0x7c, 0xcc, 0x57, 0xdb, 0xa0, 0x96, 0x89, 0x96, 0x91, 0x77, + 0xaf, 0xda, 0x57, 0xcd, 0x7c, 0xa6, 0xa5, 0x77, 0xea, 0xb3, 0x87, 0xc3, + 0x12, 0x90, 0xcc, 0xb0, 0xab, 0xb2, 0xa4, 0xe6, 0xd1, 0x66, 0xb5, 0x65, + 0xb5, 0x68, 0xcf, 0xe8, 0xa2, 0xb1, 0xac, 0xb1, 0xcb, 0x13, 0xa4, 0x9b, + 0xa7, 0xf7, 0x8, 0x5b, 0xa, 0x62, 0x86, 0x99, 0xfb, 0x12, 0x58, 0xa, + 0x13, 0x64, 0x9b, 0x8f, 0x59, 0xa, 0xad, 0x81, 0xae, 0x7f, 0xab, 0x7f, + 0xa, 0x13, 0x8c, 0x37, 0x97, 0x43, 0xa, 0x71, 0xa, 0x19, 0x4e, 0xa, + 0x13, 0xa4, 0x9b, 0xc7, 0x57, 0xa, 0x69, 0x95, 0x68, 0x3c, 0xa, 0xf7, + 0xa9, 0xf7, 0xbf, 0x15, 0x8f, 0x96, 0x8d, 0x97, 0x97, 0x1a, 0x9e, 0x86, + 0x7b, 0xa, 0x97, 0x1a, 0x13, 0x8c, 0x37, 0xc7, 0xa5, 0xad, 0x9a, 0xa1, + 0xb0, 0xb5, 0x6c, 0x64, 0x68, 0x6a, 0x90, 0x75, 0x80, 0x1e, 0x75, 0x80, + 0x78, 0x74, 0x83, 0x74, 0x8, 0xcf, 0x30, 0x15, 0x92, 0x7, 0xb8, 0x94, + 0x9d, 0xa6, 0x98, 0xa1, 0x8, 0x9b, 0x95, 0x93, 0x99, 0x9b, 0x1b, 0xae, + 0xa2, 0x61, 0x6c, 0x72, 0x7a, 0x60, 0x6d, 0x79, 0x7e, 0xa2, 0x94, 0x7b, + 0x1f, 0x13, 0xa1, 0x9b, 0xc7, 0x95, 0x79, 0x76, 0x90, 0x77, 0x1b, 0x86, + 0x86, 0x8b, 0x8a, 0x86, 0x1f, 0x96, 0xe5, 0x15, 0x7b, 0x67, 0x76, 0x5f, + 0x62, 0x7e, 0x8, 0x13, 0x92, 0x9b, 0xa7, 0x8a, 0x88, 0x87, 0x8a, 0x87, + 0x1b, 0x55, 0xa, 0x47, 0xa, 0x13, 0x52, 0x5b, 0x97, 0x61, 0xa, 0xfb, + 0x78, 0xf7, 0x23, 0x15, 0xa2, 0x77, 0x6e, 0x99, 0x6d, 0x1b, 0x7e, 0x7f, + 0x8b, 0x8d, 0x81, 0x1f, 0x7e, 0x8e, 0x82, 0x94, 0xa2, 0x1a, 0xb6, 0xb3, + 0xac, 0xb4, 0x9e, 0xa4, 0x81, 0x74, 0x1e, 0x7d, 0x83, 0x7e, 0x7c, 0x1a, + 0x72, 0x94, 0x70, 0x9b, 0x78, 0x1e, 0xf7, 0x1d, 0xfb, 0x4b, 0x15, 0x91, + 0x8f, 0x5, 0x74, 0x9f, 0xa8, 0x7d, 0xa9, 0x1b, 0xa9, 0xa6, 0x8e, 0x63, + 0x60, 0x63, 0x6a, 0x62, 0x78, 0x72, 0x95, 0xa2, 0x1f, 0x99, 0x93, 0x98, + 0x9a, 0x1a, 0xa4, 0x82, 0xa6, 0x7b, 0x9e, 0x1e, 0xfb, 0x71, 0xf7, 0x26, + 0x15, 0x8d, 0x9a, 0x9b, 0x8d, 0x9a, 0x1b, 0x13, 0xa1, 0x9b, 0xa7, 0xa2, + 0xc8, 0x7d, 0x6e, 0x1f, 0x13, 0xa4, 0x9b, 0x97, 0x77, 0xa, 0x1e, 0x48, + 0xa, 0x9b, 0xaf, 0xa0, 0xb7, 0xb4, 0x98, 0x8, 0x8c, 0x8e, 0x8f, 0x8c, + 0x8f, 0x1b, 0x5d, 0xa, 0x97, 0xdf, 0x15, 0x66, 0x84, 0x79, 0x78, 0x7e, + 0x78, 0x8, 0x75, 0x7c, 0x84, 0x76, 0x77, 0x1b, 0x68, 0x74, 0xb6, 0xaa, + 0xa4, 0x9c, 0xb5, 0xa9, 0x98, 0x95, 0x7e, 0x7e, 0x9c, 0x1f, 0x80, 0x99, + 0x9e, 0x81, 0xaa, 0x1b, 0x91, 0x90, 0x8b, 0x8c, 0x91, 0x1f, 0xd0, 0x2f, + 0x15, 0x91, 0x88, 0x5, 0x13, 0xa4, 0x9b, 0x8f, 0x87, 0x7f, 0x89, 0x7e, + 0x7f, 0x1a, 0x75, 0x92, 0x7c, 0x92, 0x7e, 0x1e, 0x93, 0x7c, 0x94, 0x80, + 0x80, 0x1a, 0x71, 0x69, 0x7c, 0x75, 0x66, 0x61, 0xaa, 0xb2, 0xae, 0xac, + 0x85, 0xa1, 0x97, 0x1e, 0xa0, 0x96, 0x9f, 0xa2, 0x93, 0xa2, 0x8, 0xe, + 0x7e, 0xaa, 0x76, 0xf7, 0x6f, 0xbf, 0xbc, 0x96, 0x89, 0x96, 0xbc, 0xbf, + 0xbf, 0x77, 0xf7, 0x4f, 0x77, 0x12, 0xf8, 0x1a, 0xb5, 0x65, 0xb5, 0x83, + 0xf7, 0x31, 0xfb, 0x12, 0x95, 0x13, 0xef, 0x20, 0xf7, 0x47, 0x5b, 0xa, + 0x8a, 0x83, 0x8b, 0x83, 0x83, 0x1a, 0x65, 0x9a, 0x22, 0xbe, 0xb7, 0xc1, + 0xbe, 0xac, 0xa4, 0x1e, 0x53, 0xa, 0x8f, 0x9c, 0x8d, 0x9e, 0x63, 0xa, + 0xc2, 0x75, 0xb7, 0x1b, 0xb6, 0x95, 0xaa, 0xb0, 0xad, 0x81, 0xaf, 0x7f, + 0xaa, 0x7f, 0xa, 0x5c, 0xa, 0x77, 0x99, 0x77, 0x39, 0xa, 0x5, 0x13, + 0xee, 0x40, 0x71, 0xa, 0x8, 0xb3, 0x8f, 0x7f, 0xf7, 0x13, 0x62, 0xa, + 0x13, 0xde, 0xa0, 0x52, 0xa, 0x87, 0x7a, 0x89, 0x78, 0x64, 0xa, 0x54, + 0xa1, 0x5f, 0x1b, 0x60, 0x81, 0x6c, 0x66, 0x69, 0x95, 0x67, 0x97, 0x6c, + 0x4a, 0xa, 0x9f, 0x7d, 0x9f, 0x81, 0x8, 0x65, 0x7a, 0x3b, 0x45, 0xa, + 0xf7, 0xfe, 0xf7, 0xbb, 0x15, 0x7a, 0x65, 0x78, 0x63, 0x61, 0x7c, 0x8, + 0x8a, 0x87, 0x88, 0x8a, 0x87, 0x1b, 0x13, 0xef, 0x20, 0x55, 0xa, 0x13, + 0xee, 0x40, 0x47, 0xa, 0x13, 0xde, 0xa0, 0x61, 0xa, 0xfb, 0xc6, 0xf7, + 0x2, 0x15, 0x8d, 0x9a, 0x9b, 0x8d, 0x9a, 0x1b, 0x13, 0xef, 0x20, 0xa2, + 0xc8, 0x7d, 0x6e, 0x77, 0xa, 0x1f, 0x48, 0xa, 0x9c, 0xb1, 0x9e, 0xb3, + 0xb5, 0x9a, 0x8, 0x8c, 0x8f, 0x8e, 0x8c, 0x8f, 0x1b, 0x13, 0xee, 0xa0, + 0x5d, 0xa, 0xe, 0x73, 0x95, 0xb3, 0x97, 0xa9, 0xf7, 0xf, 0xaa, 0x7a, + 0x9c, 0xc1, 0xdb, 0x75, 0x77, 0xeb, 0x9c, 0x7a, 0xaa, 0xb1, 0x77, 0xf4, + 0xa9, 0x97, 0xb3, 0x12, 0xca, 0xb5, 0xc7, 0xa7, 0xb6, 0xa2, 0xbf, 0xb0, + 0x8f, 0x9c, 0x86, 0x9d, 0x7d, 0xdb, 0x7d, 0x9d, 0x86, 0x9c, 0x8f, 0xb0, + 0x66, 0xf7, 0x4b, 0x2d, 0xa2, 0xb6, 0xa7, 0xc7, 0xb5, 0x13, 0xda, 0xff, + 0x14, 0x80, 0xf7, 0x42, 0x5b, 0xa, 0x63, 0x86, 0x99, 0xfb, 0x13, 0x58, + 0xa, 0x59, 0xa, 0xae, 0x81, 0xad, 0x7f, 0xab, 0x7f, 0xa, 0x43, 0xa, + 0x5, 0x13, 0xd6, 0xff, 0x2b, 0x80, 0x71, 0xa, 0x8, 0x4e, 0xa, 0x57, + 0xa, 0x68, 0x95, 0x69, 0x3c, 0xa, 0xf7, 0xa8, 0xf7, 0xc1, 0x15, 0x8f, + 0x96, 0x8d, 0x96, 0x97, 0x1a, 0x9d, 0x87, 0x7b, 0xa, 0x96, 0x1a, 0xab, + 0xbd, 0xa5, 0xa7, 0xb1, 0x9e, 0x5e, 0x6a, 0x71, 0x81, 0x84, 0x73, 0x86, + 0x1e, 0x6b, 0x84, 0x6f, 0x6e, 0x80, 0x6d, 0x8, 0xd3, 0x2f, 0x15, 0x8a, + 0x92, 0xad, 0x90, 0xa5, 0xa1, 0x9a, 0xa9, 0x19, 0x92, 0x99, 0x90, 0x95, + 0x9b, 0x8e, 0x8, 0x8c, 0x8e, 0x8d, 0x8b, 0x8e, 0x1b, 0xab, 0xb8, 0x6c, + 0x69, 0x6e, 0x66, 0x5f, 0x6d, 0x7f, 0x82, 0x98, 0x97, 0x7c, 0x1f, 0x97, + 0x7d, 0x78, 0x96, 0x6a, 0x1b, 0x85, 0x85, 0x8a, 0x8a, 0x85, 0x1f, 0xfb, + 0x55, 0xd3, 0x15, 0x13, 0xe9, 0xff, 0x2b, 0x80, 0xa3, 0x78, 0x6c, 0x98, + 0x6c, 0x85, 0x86, 0x8b, 0x85, 0x1b, 0x6b, 0x83, 0xa7, 0xa6, 0xb0, 0x9b, + 0xaa, 0xb4, 0xa2, 0xb9, 0x7f, 0x6e, 0x1f, 0x7c, 0x83, 0x7c, 0x7b, 0x1a, + 0x73, 0x94, 0x71, 0x9b, 0x78, 0x1e, 0xfb, 0x13, 0xfb, 0x90, 0x15, 0xaa, + 0xca, 0xa8, 0xc1, 0xcf, 0xaa, 0x8a, 0x8d, 0x18, 0x43, 0x94, 0x5d, 0xb6, + 0x5b, 0xbd, 0x8, 0x8c, 0x9d, 0x9e, 0x8c, 0x9d, 0x1b, 0xbe, 0xb7, 0x82, + 0x6d, 0xb5, 0x1f, 0x8c, 0x8d, 0x5, 0x80, 0xa4, 0x87, 0xa7, 0xa7, 0x1a, + 0xb2, 0x95, 0xb0, 0x96, 0xb1, 0x1e, 0xad, 0x58, 0xaa, 0x5a, 0x4b, 0x1a, + 0x84, 0x8b, 0x84, 0x8a, 0x84, 0x1e, 0x8d, 0x6, 0xb7, 0xc5, 0xc8, 0x9e, + 0xce, 0x9b, 0x6c, 0x4c, 0x6e, 0x55, 0x47, 0x6c, 0x8c, 0x89, 0x18, 0xd3, + 0x82, 0xb9, 0x60, 0xbb, 0x59, 0x8, 0x8a, 0x79, 0x78, 0x8a, 0x79, 0x1b, + 0x58, 0x5f, 0x94, 0xa9, 0x61, 0x1f, 0x8a, 0x89, 0x5, 0x96, 0x72, 0x8f, + 0x6f, 0x6f, 0x1a, 0x13, 0xea, 0xfe, 0x9b, 0x80, 0x64, 0x81, 0x66, 0x80, + 0x65, 0x1e, 0x69, 0xbe, 0x6c, 0xbc, 0xcb, 0x1a, 0x92, 0x8b, 0x92, 0x8c, + 0x92, 0x1e, 0x89, 0x6, 0x5f, 0x51, 0x4e, 0x78, 0x48, 0x7b, 0x8, 0xf7, + 0xa3, 0xcf, 0x15, 0x90, 0x8f, 0x5, 0x73, 0x9e, 0xaa, 0x7e, 0xaa, 0x91, + 0x90, 0x8b, 0x91, 0x1b, 0xab, 0x93, 0x6f, 0x70, 0x66, 0x7b, 0x6c, 0x62, + 0x74, 0x5d, 0x97, 0xa8, 0x1f, 0x9a, 0x93, 0x9a, 0x9b, 0x1a, 0xa3, 0x82, + 0xa5, 0x7b, 0x9e, 0x1e, 0xfb, 0x4f, 0xd0, 0x15, 0x69, 0x86, 0x71, 0x75, + 0x7c, 0x6d, 0x84, 0x7d, 0x86, 0x81, 0x7b, 0x88, 0x8, 0x6a, 0x80, 0x57, + 0xb6, 0xab, 0x1a, 0xa8, 0xb0, 0xb7, 0xa9, 0x94, 0x92, 0x84, 0x82, 0x94, + 0x1e, 0x7d, 0x9a, 0xa0, 0x79, 0xb4, 0x1b, 0x91, 0x91, 0x8c, 0x8c, 0x91, + 0x1f, 0xd3, 0x2f, 0x15, 0x13, 0xda, 0xfe, 0xab, 0x80, 0x91, 0x88, 0x5, + 0x87, 0x80, 0x89, 0x80, 0x7f, 0x1a, 0x75, 0x92, 0x7b, 0x92, 0x7d, 0x1e, + 0x93, 0x7c, 0x93, 0x80, 0x82, 0x1a, 0x6b, 0x59, 0x71, 0x6f, 0x65, 0x78, + 0xb8, 0xac, 0xa5, 0x95, 0x92, 0xa3, 0x90, 0x1e, 0xab, 0x92, 0xa7, 0xa8, + 0x96, 0xa9, 0x8, 0x13, 0xda, 0xfe, 0x4b, 0x80, 0x8f, 0xf7, 0x0, 0x15, + 0x75, 0x9d, 0x79, 0xa1, 0xa1, 0x9d, 0x9d, 0xa1, 0xa1, 0x79, 0x9d, 0x75, + 0x75, 0x79, 0x79, 0x75, 0x1e, 0xe, 0xfb, 0xed, 0xa0, 0x76, 0xf8, 0x36, + 0xea, 0xf7, 0x47, 0x77, 0x1, 0xf7, 0x5c, 0xeb, 0x3, 0xf7, 0x5c, 0x16, + 0xeb, 0xf8, 0x36, 0xf7, 0x38, 0xea, 0xfb, 0x38, 0xf7, 0x47, 0x2b, 0xfb, + 0x47, 0xfb, 0x39, 0x2c, 0xf7, 0x39, 0x6, 0xe, 0x59, 0x83, 0x56, 0xa, + 0x8d, 0x77, 0xb4, 0x5e, 0xa, 0x12, 0xb9, 0x56, 0xa, 0xa2, 0x5e, 0xa, + 0x13, 0xb2, 0x9a, 0x96, 0x96, 0xa0, 0xb9, 0xf8, 0x19, 0x15, 0x57, 0xb2, + 0x70, 0xbb, 0xa3, 0xa3, 0x92, 0x90, 0xa2, 0x1e, 0x90, 0xa6, 0xa7, 0x8f, + 0xa6, 0x1b, 0x92, 0xa1, 0x8b, 0x81, 0x1f, 0x13, 0x74, 0x9a, 0x95, 0xa, + 0xa0, 0x84, 0x7a, 0x82, 0x85, 0x89, 0x1e, 0x74, 0x81, 0x73, 0x83, 0x72, + 0x84, 0x8, 0x56, 0x7d, 0x3f, 0x80, 0x43, 0x1a, 0x61, 0xaf, 0x69, 0xb5, + 0xbf, 0xa5, 0xbe, 0xb0, 0xa4, 0x1e, 0x98, 0x9f, 0x9a, 0x9d, 0x9b, 0x9d, + 0x8, 0x92, 0x91, 0x99, 0x9b, 0x95, 0x1b, 0x13, 0xb4, 0x9a, 0x96, 0x56, + 0x60, 0x8f, 0x8f, 0x88, 0x86, 0x85, 0x87, 0x81, 0x89, 0x85, 0x1f, 0x82, + 0x73, 0x80, 0x74, 0x7e, 0x75, 0x8, 0x78, 0x6a, 0x71, 0x6a, 0x63, 0x1a, + 0x61, 0xac, 0x6a, 0xb5, 0xbf, 0xa6, 0xb2, 0xbb, 0xa3, 0x84, 0xa3, 0x86, + 0xa2, 0x1e, 0x86, 0xa6, 0x87, 0xa7, 0xa6, 0x1a, 0x13, 0xb2, 0x9a, 0x96, + 0x56, 0x88, 0x92, 0x8b, 0xa1, 0x95, 0x1e, 0x13, 0xa8, 0x2a, 0x96, 0x56, + 0xa0, 0x92, 0x94, 0x7a, 0x85, 0x8d, 0x1f, 0x95, 0x74, 0x93, 0x73, 0x92, + 0x72, 0x8, 0x65, 0xa, 0x56, 0x99, 0x96, 0x3f, 0xd3, 0x1b, 0x70, 0xa, + 0xb5, 0xad, 0xaf, 0xb5, 0xbf, 0x58, 0xa5, 0x66, 0xa4, 0x1f, 0x77, 0x98, + 0x79, 0x9a, 0x79, 0x9b, 0x8, 0x13, 0xb2, 0x9a, 0x96, 0x56, 0x90, 0x86, + 0x90, 0x79, 0x9b, 0x93, 0x1a, 0x13, 0xb2, 0x99, 0x96, 0x56, 0xa0, 0x8f, + 0x8f, 0x90, 0x8f, 0x91, 0x95, 0x87, 0x89, 0x91, 0x1e, 0xa3, 0x82, 0xa2, + 0x80, 0xa1, 0x7e, 0x8, 0x78, 0xac, 0xac, 0x71, 0xb3, 0x1b, 0xb5, 0xac, + 0xac, 0xb5, 0xbf, 0x64, 0xa6, 0x5b, 0x1f, 0x70, 0xa, 0x73, 0x73, 0x84, + 0x86, 0x74, 0x1f, 0x86, 0x70, 0x6f, 0x87, 0x70, 0x1b, 0x13, 0xb2, 0x9a, + 0x36, 0x56, 0xa0, 0x84, 0x75, 0x8b, 0x95, 0x1f, 0x13, 0xb2, 0x9a, 0x96, + 0x60, 0xa0, 0x92, 0x9c, 0x94, 0x91, 0x8d, 0x1e, 0xa2, 0x95, 0xa3, 0x93, + 0xa4, 0x92, 0x8, 0xc0, 0x99, 0xd7, 0x96, 0xd3, 0x1a, 0x6f, 0xa, 0xb5, + 0x67, 0xad, 0x61, 0x57, 0x71, 0x58, 0x66, 0x72, 0x1e, 0x7e, 0x77, 0x7c, + 0x79, 0x7b, 0x79, 0x8, 0x13, 0xb2, 0x9a, 0x56, 0x56, 0xa0, 0x84, 0x85, + 0x7d, 0x7b, 0x81, 0x1b, 0x87, 0x87, 0x8e, 0x90, 0x91, 0x8f, 0x95, 0x8d, + 0x91, 0x1f, 0x94, 0xa3, 0x96, 0xa2, 0x98, 0xa1, 0x8, 0x9e, 0xac, 0xa5, + 0xac, 0xb3, 0x1a, 0xb5, 0x6a, 0xac, 0x61, 0x57, 0x70, 0x64, 0x5b, 0x1e, + 0x6f, 0xa, 0x73, 0x92, 0x73, 0x90, 0x74, 0x1e, 0x90, 0x70, 0x8f, 0x6f, + 0x70, 0x1a, 0x84, 0x8b, 0x75, 0x81, 0x1e, 0x13, 0xb3, 0x2, 0x8e, 0x96, + 0xa0, 0x84, 0x82, 0x9c, 0x91, 0x89, 0x1f, 0x81, 0xa2, 0x83, 0xa3, 0x84, + 0xa4, 0x8, 0xc0, 0x7d, 0x80, 0xd7, 0x43, 0x1b, 0x61, 0x69, 0x67, 0x61, + 0x57, 0xbe, 0x71, 0xb0, 0x72, 0x1f, 0x9f, 0x7e, 0x9d, 0x7c, 0x9d, 0x7b, + 0x8, 0x91, 0x85, 0x9c, 0x7c, 0x82, 0x1a, 0x86, 0x87, 0x88, 0x87, 0x85, + 0x81, 0x8f, 0x8d, 0x85, 0x1e, 0x73, 0x94, 0x74, 0x96, 0x75, 0x98, 0x8, + 0x9e, 0x6a, 0x6a, 0xa5, 0x63, 0x1b, 0x61, 0x6a, 0x6a, 0x61, 0x1f, 0xf8, + 0x2c, 0x8c, 0x15, 0xa3, 0xa0, 0xa2, 0xa0, 0x9e, 0xa4, 0x8, 0x13, 0xb2, + 0x99, 0x96, 0x56, 0xa0, 0xa4, 0x9e, 0xa4, 0xb2, 0xaf, 0x1b, 0x13, 0xb2, + 0x9a, 0x96, 0x56, 0x90, 0x9e, 0x9c, 0x7a, 0x78, 0x65, 0x51, 0x7a, 0x6e, + 0x81, 0x1f, 0x6c, 0x81, 0x6e, 0x7d, 0x6f, 0x7c, 0x8, 0x4f, 0xb0, 0x15, + 0x8d, 0xaa, 0x8c, 0xab, 0x87, 0xaa, 0x8, 0x89, 0x9b, 0x88, 0x9c, 0x9b, + 0x1a, 0x13, 0xb2, 0x9a, 0x36, 0x56, 0xa0, 0xa5, 0x94, 0xaf, 0xab, 0x1e, + 0x70, 0xa, 0xa4, 0x97, 0x7b, 0x73, 0x6d, 0x7e, 0x76, 0x7e, 0x71, 0x1f, + 0x7d, 0x6e, 0x7f, 0x6d, 0x82, 0x6c, 0x8, 0xc5, 0x2d, 0x15, 0x8d, 0x96, + 0xaa, 0x89, 0xab, 0x8a, 0xaa, 0x8f, 0x19, 0x8d, 0x9b, 0x9c, 0x8e, 0x9b, + 0x1b, 0x13, 0xb4, 0x9a, 0x96, 0x56, 0x88, 0xa5, 0xaf, 0x82, 0x6b, 0x72, + 0x7b, 0x7f, 0x73, 0x6d, 0x76, 0x98, 0x98, 0x71, 0x1f, 0x6e, 0x99, 0x6d, + 0x97, 0x6c, 0x94, 0x8, 0xfb, 0x12, 0xd9, 0x15, 0x76, 0xa3, 0x76, 0xa2, + 0x72, 0x9e, 0x8, 0x72, 0x9e, 0x64, 0xa4, 0xaf, 0x1a, 0x13, 0xb2, 0x9a, + 0x56, 0x56, 0xa0, 0x9e, 0x9c, 0x9c, 0x9e, 0xb1, 0x9c, 0x51, 0x6e, 0x95, + 0x1e, 0x95, 0x6c, 0x99, 0x6e, 0x9a, 0x6f, 0x8, 0x13, 0xb3, 0x2, 0x96, + 0x56, 0xa0, 0x89, 0x2a, 0x15, 0x8e, 0xa0, 0x5, 0x65, 0xa, 0x7f, 0x9d, + 0x9c, 0x98, 0x5, 0x13, 0xb2, 0x9a, 0x96, 0x60, 0xa0, 0x90, 0xa0, 0xa0, + 0x88, 0x9d, 0x97, 0x98, 0x7a, 0x5, 0x13, 0xa8, 0x2a, 0x96, 0x56, 0xa0, + 0xa0, 0x86, 0x5, 0x65, 0xa, 0x88, 0x76, 0x97, 0x79, 0x7a, 0x7e, 0x5, + 0x13, 0xb2, 0x9a, 0x95, 0xa, 0xa0, 0x86, 0x76, 0x76, 0x8e, 0x79, 0x7f, + 0x7e, 0x9c, 0x5, 0x13, 0xb3, 0x2, 0x96, 0x56, 0xa0, 0xca, 0x6b, 0x15, + 0x94, 0x92, 0xa0, 0x73, 0xa0, 0x74, 0xa4, 0x78, 0x19, 0x13, 0x72, 0x9a, + 0x96, 0x56, 0x60, 0xa4, 0x78, 0xb2, 0x72, 0x67, 0x1a, 0x78, 0x7a, 0x7a, + 0x78, 0x65, 0x7a, 0xc5, 0xa8, 0x81, 0x1e, 0x81, 0xaa, 0x7d, 0xa8, 0x7c, + 0xa7, 0x8, 0xfb, 0xb, 0xd5, 0x15, 0x65, 0xa, 0x8c, 0x7b, 0x7b, 0x8c, + 0x7b, 0x1b, 0x7c, 0x7b, 0x8a, 0x89, 0x7c, 0x1f, 0x89, 0x7b, 0x7a, 0x88, + 0x7b, 0x1b, 0x71, 0x67, 0x94, 0xab, 0x1f, 0x6f, 0xa, 0xa4, 0x9b, 0x97, + 0xa3, 0xa9, 0xa0, 0x7e, 0x7e, 0xa5, 0x1e, 0xa8, 0x7d, 0xa9, 0x7f, 0xaa, + 0x82, 0x8, 0xc5, 0x2d, 0x15, 0x96, 0x89, 0x89, 0x6c, 0x8a, 0x6b, 0x8f, + 0x6c, 0x19, 0x8d, 0x7b, 0x8e, 0x7a, 0x7b, 0x1a, 0x13, 0xb2, 0x9a, 0x8e, + 0x96, 0xa0, 0x71, 0x82, 0x67, 0x6b, 0x72, 0x7f, 0x9b, 0xa3, 0xa9, 0x98, + 0xa0, 0x98, 0xa5, 0x1e, 0x99, 0xa8, 0x97, 0xa9, 0x94, 0xaa, 0x8, 0x5a, + 0xae, 0x15, 0x92, 0x82, 0x73, 0x76, 0x74, 0x76, 0x78, 0x72, 0x19, 0x72, + 0x78, 0x72, 0x64, 0x67, 0x1b, 0x78, 0x7a, 0x9c, 0x9e, 0xb1, 0xc5, 0x9c, + 0xa8, 0x95, 0x1f, 0xaa, 0x95, 0xa8, 0x99, 0xa7, 0x9a, 0x8, 0xe, 0x59, + 0x94, 0x76, 0xa9, 0x76, 0xf7, 0x6d, 0x9e, 0xf7, 0x69, 0x9e, 0xf7, 0x7a, + 0x77, 0x12, 0xf7, 0xa3, 0x9b, 0xf7, 0x6b, 0x9c, 0x13, 0xbe, 0xf7, 0x2c, + 0xdf, 0x15, 0xf7, 0x55, 0xf7, 0x16, 0xb8, 0xfb, 0x76, 0x5, 0x13, 0x7e, + 0x9c, 0x94, 0x5, 0x87, 0xb9, 0xf7, 0x6e, 0x8b, 0x1f, 0xf7, 0x50, 0xfb, + 0x11, 0x98, 0x91, 0xfb, 0x17, 0xf7, 0x54, 0xf7, 0x75, 0xb9, 0x91, 0x98, + 0xfb, 0x7b, 0xb7, 0xf7, 0x11, 0xf7, 0x4f, 0x86, 0x9c, 0xfb, 0x56, 0xfb, + 0x16, 0x5d, 0xf7, 0x7a, 0x7e, 0x85, 0x5e, 0xfb, 0x75, 0xfb, 0x4e, 0xf7, + 0x10, 0x7c, 0x85, 0xf7, 0x17, 0xfb, 0x54, 0xfb, 0x71, 0x5f, 0x80, 0x7d, + 0xf7, 0x7c, 0x5e, 0xfb, 0x10, 0xfb, 0x4b, 0x5, 0xf7, 0x20, 0xf7, 0x80, + 0x15, 0xc6, 0xbc, 0xba, 0xc6, 0xc6, 0xbb, 0x5c, 0x50, 0x50, 0x5a, 0x5b, + 0x50, 0x50, 0x5b, 0xbb, 0xc6, 0x1e, 0xe, 0xfb, 0x18, 0x97, 0xc3, 0x92, + 0xd6, 0xae, 0xac, 0x6a, 0xe6, 0x77, 0x9f, 0x97, 0xc1, 0x64, 0x9f, 0x9a, + 0xc1, 0x68, 0x9f, 0xa6, 0x9f, 0x77, 0xe6, 0x6a, 0xac, 0x94, 0x77, 0xb0, + 0x77, 0xa8, 0xd6, 0x92, 0xc3, 0x12, 0xa0, 0xd1, 0x8d, 0xb4, 0xc8, 0xa1, + 0x85, 0xcd, 0x73, 0x9f, 0xa2, 0xb5, 0x65, 0xa5, 0x80, 0xaa, 0x99, 0xaa, + 0x74, 0xb5, 0x6d, 0xa5, 0xa2, 0xcd, 0x4d, 0x9f, 0xaf, 0xa1, 0xc8, 0xb4, + 0x8d, 0xd1, 0x13, 0xec, 0xd7, 0xec, 0x33, 0xf8, 0x8, 0xf8, 0x30, 0x15, + 0x8e, 0x8f, 0x92, 0x8d, 0x8c, 0x1f, 0x95, 0x9c, 0x98, 0x9a, 0x9a, 0x98, + 0x98, 0x97, 0x9a, 0x94, 0x9b, 0x92, 0x8, 0x8d, 0x8c, 0x90, 0x8e, 0x8e, + 0x1a, 0x13, 0xea, 0xcb, 0xea, 0x53, 0x8e, 0x85, 0x8b, 0x89, 0x63, 0x56, + 0x67, 0x60, 0x89, 0x8b, 0x80, 0x8f, 0x1e, 0xc0, 0x58, 0x15, 0x87, 0x95, + 0x8b, 0x8d, 0x9f, 0x9e, 0x87, 0x85, 0x9e, 0x1e, 0x9c, 0x85, 0x9a, 0x83, + 0x99, 0x81, 0x8, 0x89, 0x8d, 0x8e, 0x8a, 0x8e, 0x1b, 0x8d, 0x8c, 0x8b, + 0x8d, 0x8e, 0x89, 0x8f, 0x89, 0x8d, 0x1f, 0xa5, 0x7a, 0x68, 0x9f, 0x6c, + 0x1b, 0x83, 0x6b, 0x85, 0x81, 0x1f, 0xfb, 0x13, 0xa9, 0x15, 0x8d, 0x8b, + 0x8c, 0x8d, 0x1f, 0x13, 0xec, 0xd7, 0xec, 0x93, 0x8e, 0x89, 0x8f, 0x89, + 0x8e, 0x1e, 0x81, 0x9c, 0x85, 0x9f, 0x87, 0x9e, 0x8, 0x89, 0x96, 0x8a, + 0x96, 0x97, 0x92, 0x8c, 0x91, 0x92, 0x1a, 0x8d, 0x8b, 0x90, 0x88, 0x80, + 0x84, 0x5e, 0x82, 0x70, 0x95, 0x6e, 0xa3, 0x7c, 0x1e, 0x89, 0x8e, 0x90, + 0x88, 0x8e, 0x1b, 0x13, 0xec, 0xd7, 0xd4, 0x33, 0xfb, 0xa9, 0xfb, 0x4, + 0x15, 0x4c, 0xcf, 0x6c, 0xc1, 0xcb, 0xc2, 0xb0, 0xb7, 0xb6, 0x1e, 0x93, + 0x93, 0x95, 0x92, 0x97, 0x1b, 0x9b, 0x94, 0x7e, 0x7c, 0x1f, 0x13, 0xeb, + 0x57, 0xec, 0x8f, 0x73, 0x80, 0x6c, 0x7c, 0x79, 0x1e, 0x78, 0x74, 0x72, + 0x7e, 0x6e, 0x87, 0x8, 0x69, 0x86, 0x7b, 0x71, 0x6a, 0x1a, 0x63, 0xa9, + 0x73, 0xb2, 0xca, 0xbc, 0xcc, 0xc4, 0x95, 0x1e, 0x8e, 0x9a, 0x8c, 0x9a, + 0x9b, 0x1a, 0xa7, 0x85, 0xa5, 0x84, 0xa6, 0x1e, 0x8a, 0x90, 0x8a, 0x91, + 0x91, 0x1a, 0x9b, 0x94, 0x98, 0x9c, 0x1e, 0x13, 0xeb, 0x27, 0xe9, 0x53, + 0x91, 0x8f, 0x8a, 0x88, 0x90, 0x1f, 0xac, 0x76, 0xa3, 0x66, 0x63, 0x6f, + 0x7d, 0x78, 0x77, 0x1a, 0x6a, 0xb0, 0x6d, 0xab, 0xb7, 0xa4, 0xbb, 0xb2, + 0xb7, 0x74, 0xb8, 0x69, 0xa7, 0x1e, 0x67, 0xaa, 0x69, 0x98, 0x5e, 0x97, + 0x8, 0x7d, 0x8f, 0x7a, 0x94, 0x9c, 0x1a, 0xa9, 0xbe, 0x94, 0xa2, 0x1e, + 0xda, 0x8e, 0x49, 0xbb, 0x1b, 0xae, 0xaf, 0xa5, 0xb0, 0xca, 0x47, 0xaa, + 0x55, 0x4b, 0x54, 0x66, 0x5f, 0x60, 0x1f, 0x13, 0xec, 0xd7, 0xea, 0x93, + 0x83, 0x83, 0x81, 0x84, 0x7f, 0x1b, 0x7b, 0x82, 0x98, 0x9a, 0x1f, 0x13, + 0xec, 0xd7, 0xe9, 0x93, 0xa3, 0x96, 0xaa, 0x9a, 0x9d, 0x1e, 0x9e, 0xa2, + 0xa4, 0x98, 0xa8, 0x8f, 0x8, 0xad, 0x90, 0x9b, 0xa5, 0xac, 0x1a, 0xb3, + 0x6d, 0xa3, 0x64, 0x4c, 0x5a, 0x4a, 0x52, 0x81, 0x1e, 0x88, 0x7c, 0x8a, + 0x7c, 0x7b, 0x1a, 0x6f, 0x91, 0x71, 0x92, 0x70, 0x1e, 0x8c, 0x86, 0x8c, + 0x85, 0x85, 0x1a, 0x7b, 0x82, 0x7e, 0x7a, 0x1e, 0x13, 0xd4, 0xd7, 0xd4, + 0x93, 0x85, 0x87, 0x8c, 0x8e, 0x86, 0x1f, 0x6a, 0xa0, 0x73, 0xb0, 0xb3, + 0xa7, 0x99, 0x9e, 0x9f, 0x1a, 0xac, 0x66, 0xa9, 0x6b, 0x5f, 0x72, 0x5b, + 0x64, 0x5f, 0xa2, 0x5e, 0xad, 0x6f, 0x1e, 0xaf, 0x6c, 0xad, 0x7e, 0xb8, + 0x7f, 0x8, 0x99, 0x87, 0x9c, 0x82, 0x7a, 0x1a, 0x6d, 0x58, 0x82, 0x74, + 0x56, 0x78, 0xa9, 0x9f, 0x76, 0x1e, 0x94, 0x81, 0x80, 0x92, 0x7b, 0x1b, + 0x68, 0x67, 0x71, 0x66, 0x1f, 0x13, 0xec, 0xd7, 0xec, 0x33, 0xf8, 0x15, + 0x92, 0x15, 0x13, 0xec, 0xd7, 0xec, 0x4f, 0x88, 0x8d, 0x87, 0x8d, 0x88, + 0x1e, 0x95, 0x7a, 0x91, 0x77, 0x8f, 0x78, 0x8, 0x8d, 0x80, 0x8c, 0x80, + 0x7f, 0x84, 0x8a, 0x85, 0x84, 0x1a, 0x89, 0x8b, 0x86, 0x8e, 0x96, 0x92, + 0xb8, 0x94, 0xa6, 0x81, 0xa8, 0x73, 0x9a, 0x1e, 0x8d, 0x88, 0x86, 0x8e, + 0x88, 0x1b, 0x13, 0xea, 0xd7, 0xd4, 0x33, 0x89, 0x8b, 0x8a, 0x89, 0x1f, + 0xfb, 0x8c, 0xca, 0x15, 0x71, 0x9c, 0xae, 0x77, 0xaa, 0x1b, 0x93, 0xab, + 0x91, 0x95, 0x8f, 0x81, 0x8b, 0x89, 0x77, 0x78, 0x8f, 0x91, 0x78, 0x1f, + 0x7a, 0x91, 0x7c, 0x93, 0x7d, 0x95, 0x8, 0x8d, 0x89, 0x88, 0x8c, 0x88, + 0x1b, 0x89, 0x8a, 0x8b, 0x89, 0x88, 0x8d, 0x87, 0x8d, 0x89, 0x1f, 0xda, + 0xfb, 0x3e, 0x15, 0x88, 0x91, 0x8b, 0x8d, 0xb3, 0xc0, 0xaf, 0xb6, 0x8d, + 0x8b, 0x96, 0x87, 0x1e, 0x13, 0xeb, 0x57, 0xea, 0x33, 0x88, 0x87, 0x84, + 0x89, 0x8a, 0x1f, 0x81, 0x7a, 0x7e, 0x7c, 0x7c, 0x7e, 0x7e, 0x7f, 0x7c, + 0x82, 0x7b, 0x84, 0x8, 0x89, 0x8a, 0x86, 0x88, 0x88, 0x1a, 0xf7, 0x68, + 0xf7, 0x88, 0x15, 0xa6, 0xa8, 0xb3, 0x97, 0xb2, 0x1b, 0xa3, 0xad, 0x81, + 0x6d, 0x79, 0x7f, 0x7f, 0x79, 0x82, 0x84, 0x8e, 0x90, 0x84, 0x1f, 0x6d, + 0xa3, 0x5e, 0x91, 0x67, 0x7f, 0x8, 0xfb, 0xe, 0xba, 0x15, 0x89, 0x95, + 0x8a, 0x94, 0x95, 0x1a, 0xb0, 0xa3, 0xdc, 0xb9, 0x9b, 0x9c, 0x7e, 0x7a, + 0x7e, 0x7f, 0x7e, 0x80, 0x86, 0x1e, 0x6a, 0x7e, 0x69, 0x65, 0x86, 0x67, + 0x8, 0xf7, 0x1f, 0xfb, 0x3a, 0x15, 0xb4, 0x7e, 0xc5, 0x58, 0x5c, 0x1a, + 0x77, 0x7f, 0x7a, 0x76, 0x79, 0x7f, 0x9c, 0x9c, 0x1e, 0x13, 0xec, 0xd7, + 0xec, 0x2f, 0x91, 0x8d, 0x91, 0x91, 0x1a, 0xaa, 0x7b, 0xb5, 0x72, 0x9e, + 0x1e, 0xfb, 0x81, 0xe3, 0x15, 0x62, 0x98, 0x51, 0xbe, 0xba, 0x1a, 0x9f, + 0x97, 0x9c, 0xa0, 0x9d, 0x97, 0x7a, 0x7a, 0x1e, 0x85, 0x89, 0x85, 0x85, + 0x1a, 0x6c, 0x9b, 0x61, 0xa4, 0x78, 0x1e, 0xf7, 0x21, 0xfb, 0x3f, 0x15, + 0x8d, 0x81, 0x8c, 0x82, 0x81, 0x1a, 0x66, 0x73, 0x3a, 0x5d, 0x1e, 0x13, + 0xec, 0xd7, 0xd2, 0x93, 0x7b, 0x7a, 0x98, 0x9c, 0x98, 0x97, 0x98, 0x96, + 0x90, 0x1f, 0xac, 0x98, 0xad, 0xb1, 0x90, 0xaf, 0x8, 0xfb, 0x7, 0xb4, + 0x15, 0x70, 0x6e, 0x63, 0x7f, 0x64, 0x1b, 0x73, 0x69, 0x95, 0xa9, 0x9d, + 0x97, 0x97, 0x9d, 0x94, 0x92, 0x88, 0x86, 0x92, 0x1f, 0x7a, 0xa0, 0xa7, + 0x84, 0xa6, 0x1b, 0x97, 0x97, 0x8c, 0x90, 0x96, 0x1f, 0xe, 0xfb, 0x2c, + 0x99, 0x76, 0xf9, 0x4a, 0x77, 0x1, 0xf7, 0xda, 0xaf, 0x3, 0xd1, 0xf7, + 0xd, 0x15, 0xae, 0x81, 0xa3, 0xdf, 0xc3, 0xab, 0x70, 0x2b, 0xae, 0x81, + 0xb0, 0xf7, 0x18, 0xdc, 0xba, 0x9a, 0x82, 0x5, 0x2e, 0x7, 0x2b, 0x29, + 0xa5, 0x71, 0xd1, 0xd3, 0x5, 0x4a, 0x7, 0x4e, 0x4c, 0xa5, 0x72, 0xc0, + 0xc1, 0xc0, 0x55, 0xa5, 0xa4, 0x4e, 0xca, 0x5, 0xcc, 0x7, 0xd1, 0x43, + 0xa5, 0xa5, 0x2b, 0xed, 0x5, 0xe8, 0x7, 0x9a, 0x94, 0xdc, 0x5c, 0xb0, + 0xfb, 0x18, 0xae, 0x95, 0x70, 0xeb, 0xc3, 0x6b, 0xa3, 0x37, 0xae, 0x95, + 0x77, 0xd4, 0xd4, 0x9d, 0x82, 0xae, 0x36, 0x76, 0x53, 0xac, 0xec, 0xa3, + 0x82, 0xaf, 0xfb, 0x19, 0x69, 0x3a, 0xb9, 0x5, 0x9d, 0x7, 0xdc, 0xb9, + 0xf7, 0x19, 0x69, 0x94, 0xaf, 0x2a, 0xa3, 0xc3, 0xac, 0xe0, 0x76, 0x94, + 0xae, 0x42, 0x9e, 0x9f, 0xd3, 0x68, 0x95, 0x73, 0x37, 0x53, 0x6b, 0xa6, + 0xeb, 0x68, 0x95, 0x66, 0xfb, 0x18, 0x3a, 0x5c, 0x7c, 0x94, 0x5, 0xe8, + 0x7, 0xeb, 0xed, 0x71, 0xa5, 0x45, 0x43, 0x5, 0xcc, 0x7, 0xc8, 0xca, + 0x71, 0xa4, 0x56, 0x55, 0x56, 0xc1, 0x71, 0x72, 0xc8, 0x4c, 0x5, 0x4a, + 0x7, 0x45, 0xd3, 0x71, 0x71, 0xeb, 0x29, 0x5, 0x2e, 0x7, 0x7c, 0x82, + 0x3a, 0xba, 0x66, 0xf7, 0x18, 0x68, 0x81, 0xa6, 0x2b, 0x53, 0xab, 0x73, + 0xdf, 0x68, 0x81, 0x9f, 0x43, 0x42, 0x78, 0x94, 0x68, 0xe0, 0xa0, 0xc3, + 0x6a, 0x2a, 0x73, 0x94, 0x67, 0xf7, 0x19, 0xad, 0xdc, 0x5d, 0x5, 0x79, + 0x7, 0x3a, 0x5d, 0xfb, 0x19, 0xad, 0x82, 0x67, 0xec, 0x73, 0x53, 0x6a, + 0x36, 0xa0, 0x82, 0x68, 0xd4, 0x78, 0x5, 0xe, 0xfb, 0x23, 0x9e, 0x76, + 0xf9, 0x40, 0x77, 0x12, 0xf7, 0x71, 0xb0, 0xd0, 0xb3, 0x64, 0xb3, 0xcf, + 0xb0, 0x67, 0xb0, 0x13, 0xf2, 0xdb, 0xf7, 0xc, 0x15, 0xb1, 0x7f, 0xa3, + 0xe5, 0xdd, 0xba, 0x86, 0x27, 0xa4, 0x7d, 0x5, 0x13, 0xea, 0xdf, 0xc1, + 0x5, 0x2d, 0x7, 0x49, 0x49, 0xa8, 0x70, 0xc4, 0xc4, 0xc4, 0x52, 0xa8, + 0xa6, 0x49, 0xcd, 0x5, 0xe9, 0x7, 0xdf, 0x55, 0xa4, 0x99, 0x86, 0xef, + 0xdd, 0x5c, 0xa3, 0x31, 0xb1, 0x97, 0x76, 0xd9, 0xd9, 0x9f, 0x82, 0xb2, + 0x31, 0x73, 0x39, 0xba, 0xe4, 0xb9, 0x5, 0xa7, 0x7, 0x32, 0xb9, 0xdd, + 0xba, 0xe5, 0x73, 0x94, 0xb2, 0x3d, 0xa0, 0xa0, 0xd8, 0x65, 0x97, 0x73, + 0x31, 0x39, 0x5c, 0x90, 0xef, 0x72, 0x99, 0x37, 0x55, 0x5, 0xe9, 0x7, + 0xcd, 0xcd, 0x6e, 0xa6, 0x52, 0x52, 0x52, 0xc4, 0x6e, 0x70, 0xcd, 0x49, + 0x5, 0x2d, 0x7, 0x37, 0xc1, 0x72, 0x7d, 0x90, 0x27, 0x39, 0xba, 0x73, + 0xe5, 0x65, 0x7f, 0xa0, 0x3e, 0x3d, 0x76, 0x94, 0x64, 0xe5, 0xa3, 0xdd, + 0x5c, 0x32, 0x5d, 0x5, 0x6f, 0x7, 0xe4, 0x5d, 0x39, 0x5c, 0x31, 0xa3, + 0x82, 0x64, 0xd9, 0x76, 0x5, 0xf7, 0x9f, 0xf7, 0x46, 0x15, 0xd9, 0x7, + 0xd2, 0xb7, 0x5, 0x13, 0xf4, 0x88, 0x38, 0x5, 0x13, 0xea, 0x5b, 0x41, + 0x15, 0xcf, 0xb2, 0xd5, 0x64, 0x41, 0x64, 0x5, 0xfb, 0x14, 0xd5, 0x15, + 0x47, 0xb2, 0x88, 0xde, 0xd2, 0x5f, 0x5, 0xb3, 0xfb, 0x76, 0x15, 0xd9, + 0x7, 0x13, 0xf4, 0xcf, 0x64, 0x8e, 0x38, 0x5, 0x13, 0xea, 0xfb, 0x5b, + 0xf7, 0xa, 0x15, 0x41, 0xb2, 0xd5, 0xb2, 0xcf, 0x64, 0x5, 0x58, 0xfb, + 0x31, 0x15, 0x8e, 0xde, 0xcf, 0xb2, 0x5, 0x3d, 0x7, 0xe, 0xfb, 0x2a, + 0x9b, 0x76, 0xf9, 0x46, 0x77, 0x1, 0xf7, 0xd2, 0xbf, 0x3, 0xd3, 0xf7, + 0xe, 0x15, 0xbd, 0x7d, 0xa3, 0xe2, 0xac, 0x9e, 0x74, 0x35, 0xbc, 0x7e, + 0xb0, 0xf7, 0x1c, 0xd4, 0xb5, 0x8e, 0x8a, 0x5, 0x36, 0x7, 0x28, 0x27, + 0xaf, 0x67, 0xca, 0xca, 0x5, 0x65, 0x7, 0x4b, 0x4b, 0xb0, 0x66, 0xc0, + 0xbf, 0xc0, 0x57, 0xb0, 0xb0, 0x4b, 0xcb, 0x5, 0xb1, 0x7, 0xca, 0x4c, + 0xaf, 0xaf, 0x28, 0xef, 0x5, 0xe0, 0x7, 0x8e, 0x8c, 0xd4, 0x61, 0xb0, + 0xfb, 0x1c, 0xbc, 0x98, 0x74, 0xe1, 0xac, 0x78, 0xa3, 0x34, 0xbd, 0x99, + 0x79, 0xd3, 0xd2, 0x9e, 0x7e, 0xbe, 0x33, 0x74, 0x6a, 0x9e, 0xe1, 0xa2, + 0x7e, 0xbc, 0xfb, 0x1c, 0x67, 0x42, 0xb6, 0x75, 0xa, 0xd4, 0xb6, 0xf7, + 0x1c, 0x67, 0x98, 0xbc, 0x35, 0xa2, 0xac, 0x9e, 0xe3, 0x74, 0x98, 0xbe, + 0x44, 0x9f, 0x9d, 0xd2, 0x59, 0x99, 0x73, 0x34, 0x6a, 0x78, 0xa2, 0xe1, + 0x5a, 0x98, 0x66, 0xfb, 0x1c, 0x42, 0x61, 0x88, 0x8c, 0x5, 0xe0, 0x7, + 0xee, 0xef, 0x67, 0xaf, 0x4c, 0x4c, 0x5, 0xb1, 0x7, 0xcb, 0xcb, 0x66, + 0xb0, 0x56, 0x57, 0x56, 0xbf, 0x66, 0x66, 0xcb, 0x4b, 0x5, 0x65, 0x7, + 0x4c, 0xca, 0x67, 0x67, 0xee, 0x27, 0x5, 0x36, 0x7, 0x88, 0x8a, 0x42, + 0xb5, 0x66, 0xf7, 0x1c, 0x5a, 0x7e, 0xa2, 0x35, 0x6a, 0x9e, 0x73, 0xe2, + 0x59, 0x7d, 0x9d, 0x44, 0x44, 0x77, 0x98, 0x58, 0xe3, 0xa2, 0xac, 0x78, + 0x35, 0x74, 0x98, 0x5a, 0xf7, 0x1c, 0xaf, 0xd4, 0x60, 0x80, 0xa, 0x42, + 0x60, 0xfb, 0x1c, 0xaf, 0x7e, 0x5a, 0xe1, 0x74, 0x6a, 0x78, 0x33, 0xa2, + 0x7e, 0x58, 0xd2, 0x77, 0x5, 0xe, 0x56, 0x97, 0x76, 0xa5, 0x76, 0xf7, + 0xdc, 0xaa, 0xf7, 0xe2, 0x77, 0x12, 0xf8, 0xd, 0xaa, 0x13, 0xb8, 0xf8, + 0x30, 0xf8, 0x13, 0x15, 0x94, 0x86, 0xf7, 0x3d, 0xf7, 0x8f, 0x76, 0x8f, + 0x81, 0x91, 0x7d, 0x9b, 0x19, 0xfb, 0x1, 0xfb, 0xbc, 0x15, 0xf7, 0xa4, + 0xf7, 0x19, 0x7b, 0x99, 0x85, 0x95, 0x87, 0xa0, 0x19, 0xfb, 0x8f, 0xfb, + 0x3d, 0x5, 0x60, 0x9e, 0x15, 0x95, 0x6, 0xa0, 0xf7, 0xc2, 0x5, 0x88, + 0x82, 0x83, 0x89, 0x83, 0x1b, 0x83, 0x83, 0x8c, 0x8f, 0x80, 0x1f, 0xd4, + 0xfb, 0xf6, 0x15, 0xf7, 0xc2, 0x76, 0x5, 0x87, 0x95, 0x8a, 0x93, 0x93, + 0x1a, 0x93, 0x8c, 0x93, 0x8f, 0x95, 0x1e, 0xfb, 0xc2, 0x76, 0x5, 0x40, + 0xac, 0x15, 0x94, 0x90, 0xfb, 0x19, 0xf7, 0xa4, 0x7d, 0x7b, 0x81, 0x85, + 0x76, 0x87, 0x19, 0xf7, 0x7f, 0xfb, 0xd1, 0x15, 0xf7, 0x8f, 0xfb, 0x3d, + 0x8f, 0xa0, 0x91, 0x95, 0x9b, 0x99, 0x19, 0xfb, 0xa4, 0xf7, 0x19, 0x5, + 0x35, 0xb1, 0x15, 0x90, 0x94, 0xfb, 0x8f, 0xf7, 0x3d, 0x87, 0x76, 0x85, + 0x81, 0x7b, 0x7d, 0x19, 0xf7, 0xe2, 0xfb, 0x57, 0x15, 0xf7, 0x19, 0xfb, + 0xa4, 0x99, 0x9b, 0x95, 0x91, 0xa0, 0x8f, 0x19, 0xfb, 0x3d, 0xf7, 0x8f, + 0x5, 0xfc, 0xd, 0x97, 0x15, 0xf7, 0xc2, 0xa0, 0x5, 0x95, 0x7, 0xfb, + 0xc2, 0xa0, 0x5, 0x8f, 0x80, 0x8c, 0x84, 0x82, 0x1a, 0x83, 0x89, 0x83, + 0x88, 0x82, 0x1e, 0xf7, 0xd7, 0xfb, 0xd7, 0x15, 0x13, 0x78, 0x8e, 0x95, + 0x93, 0x8d, 0x93, 0x1b, 0x13, 0xb8, 0x93, 0x93, 0x89, 0x88, 0x95, 0x1f, + 0x76, 0xf7, 0xc2, 0x5, 0x81, 0x6, 0xfb, 0xb0, 0xfb, 0x2a, 0x15, 0xf7, + 0x8f, 0xf7, 0x3d, 0x86, 0x94, 0xfb, 0xa4, 0xfb, 0x19, 0x9b, 0x7d, 0x91, + 0x81, 0x8f, 0x76, 0x19, 0xe7, 0x2f, 0x15, 0xa0, 0x87, 0x95, 0x85, 0x99, + 0x7b, 0xf7, 0x19, 0xf7, 0xa4, 0x18, 0x82, 0x90, 0x5, 0xe, 0x57, 0x97, + 0x76, 0xa5, 0x76, 0xf9, 0x49, 0x77, 0x12, 0xb7, 0xf9, 0x4e, 0x13, 0xb0, + 0xf8, 0x35, 0xf8, 0x7, 0x15, 0xf7, 0x55, 0xf7, 0x8b, 0x78, 0x8e, 0x55, + 0xaa, 0x7f, 0x9a, 0x19, 0xfb, 0x9, 0xfb, 0xb7, 0x5, 0xa0, 0x76, 0x15, + 0xf7, 0xb7, 0xf7, 0x9, 0x7c, 0x97, 0x6c, 0xc1, 0x88, 0x9e, 0x19, 0xfb, + 0x8b, 0xfb, 0x55, 0x5, 0x67, 0x9a, 0x15, 0x95, 0x6, 0xb7, 0xf7, 0xca, + 0x5, 0x87, 0x82, 0x77, 0x8a, 0x77, 0x1b, 0x77, 0x77, 0x8c, 0x8f, 0x82, + 0x1f, 0xe3, 0xfb, 0xf6, 0x15, 0xf7, 0xca, 0x5f, 0x5, 0x87, 0x94, 0x8a, + 0xa0, 0x9f, 0x1a, 0x9f, 0x8d, 0x9e, 0x8e, 0x94, 0x1e, 0xfb, 0xca, 0x5f, + 0x5, 0x4c, 0xa5, 0x15, 0x94, 0x90, 0xfb, 0x9, 0xf7, 0xb7, 0x7f, 0x7c, + 0x55, 0x6c, 0x78, 0x88, 0x19, 0xf7, 0x8c, 0xfb, 0xc2, 0x15, 0xf7, 0x8b, + 0xfb, 0x55, 0x8e, 0x9e, 0xaa, 0xc1, 0x9a, 0x97, 0x19, 0xfb, 0xb7, 0xf7, + 0x9, 0x5, 0x43, 0xa9, 0x15, 0x90, 0x94, 0xfb, 0x8b, 0xf7, 0x55, 0x88, + 0x78, 0x6c, 0x55, 0x7c, 0x7f, 0x19, 0xf8, 0x5f, 0xfc, 0x5f, 0x15, 0x97, + 0x9a, 0xc1, 0xaa, 0x9e, 0x8e, 0xfb, 0x55, 0xf7, 0x8b, 0x18, 0x82, 0x86, + 0x5, 0xfc, 0x0, 0x7e, 0x15, 0xf7, 0xca, 0xb7, 0x5, 0x95, 0x7, 0xfb, + 0xca, 0xb7, 0x5, 0x8f, 0x82, 0x8c, 0x76, 0x77, 0x1a, 0x77, 0x89, 0x78, + 0x88, 0x82, 0x1e, 0xf7, 0xc0, 0xfb, 0xc0, 0x15, 0x13, 0x70, 0x8e, 0x94, + 0x9e, 0x8d, 0x9f, 0x1b, 0x13, 0xb0, 0x9f, 0xa0, 0x8a, 0x87, 0x94, 0x1f, + 0x5f, 0xf7, 0xca, 0x5, 0x81, 0x6, 0xfb, 0xa5, 0xfb, 0x46, 0x15, 0xf7, + 0x8b, 0xf7, 0x55, 0x86, 0x94, 0xfb, 0xb7, 0xfb, 0x9, 0x9a, 0x7f, 0xaa, + 0x55, 0x8e, 0x78, 0x19, 0xc8, 0x4e, 0x15, 0x9e, 0x88, 0xc1, 0x6c, 0x97, + 0x7c, 0xf7, 0x9, 0xf7, 0xb7, 0x18, 0x82, 0x90, 0x5, 0xe, 0xfb, 0x12, + 0x92, 0x76, 0xf7, 0x1f, 0xf7, 0x43, 0xe6, 0xf7, 0x42, 0xf7, 0x15, 0x77, + 0x12, 0xae, 0xf7, 0x45, 0xc5, 0xf7, 0x42, 0x22, 0xae, 0xf7, 0x14, 0xf7, + 0x44, 0x13, 0xfb, 0xf7, 0xe7, 0xf7, 0x35, 0x15, 0x66, 0x7f, 0x6b, 0x6b, + 0x61, 0x1a, 0x59, 0xaf, 0x64, 0xbe, 0xbd, 0xb0, 0xb3, 0xbc, 0xb6, 0x6b, + 0xaa, 0x65, 0x97, 0x1e, 0xf7, 0x30, 0x7, 0xf7, 0x18, 0x3e, 0x5, 0x89, + 0x83, 0x89, 0x83, 0x82, 0x1a, 0x5a, 0xb3, 0x62, 0xbc, 0x1e, 0x13, 0xfd, + 0xbd, 0xb0, 0xb1, 0xbc, 0xba, 0x65, 0xb4, 0x5a, 0x6f, 0x76, 0x7f, 0x78, + 0x77, 0x1f, 0x13, 0xfb, 0xfb, 0x16, 0xd7, 0xf7, 0x16, 0xd7, 0x5, 0x76, + 0xa0, 0x9f, 0x82, 0xa9, 0x1b, 0xbc, 0xaf, 0xb6, 0xba, 0xbd, 0x62, 0xad, + 0x5b, 0x5e, 0x61, 0x63, 0x5e, 0x81, 0x8c, 0x80, 0x8e, 0x83, 0x1f, 0xfb, + 0x18, 0x3d, 0x5, 0xf7, 0x31, 0x7, 0xb1, 0x96, 0xab, 0xab, 0xb5, 0x1a, + 0xbd, 0x66, 0xb3, 0x59, 0x59, 0x66, 0x63, 0x59, 0x61, 0xaa, 0x6b, 0xb1, + 0x80, 0x1e, 0xfb, 0x31, 0x7, 0xfb, 0x18, 0xd9, 0x5, 0x8e, 0x92, 0x8d, + 0x93, 0x95, 0x1a, 0xbc, 0x63, 0xb3, 0x5a, 0x1e, 0x13, 0xfd, 0x59, 0x65, + 0x66, 0x59, 0x5c, 0xb2, 0x62, 0xbb, 0xa8, 0xa0, 0x97, 0x9e, 0x9f, 0x1f, + 0x13, 0xfb, 0xf7, 0x16, 0x3f, 0xfb, 0x16, 0x3f, 0x5, 0xa1, 0x76, 0x77, + 0x94, 0x6c, 0x1b, 0x5a, 0x67, 0x5f, 0x5c, 0x59, 0xb5, 0x69, 0xbb, 0xb7, + 0xb6, 0xb3, 0xb8, 0x96, 0x7e, 0x99, 0x93, 0x90, 0x1f, 0xf7, 0x18, 0xd8, + 0x5, 0xe, 0x5b, 0x97, 0x76, 0xf7, 0x83, 0xf7, 0xf, 0x71, 0xf7, 0xf, + 0xf7, 0x83, 0x77, 0x12, 0xf7, 0xb2, 0xf7, 0xf, 0x71, 0xf7, 0xf, 0x13, + 0xd4, 0xf8, 0x39, 0xf7, 0xf1, 0x15, 0xbf, 0xaf, 0xbb, 0x9f, 0xc7, 0x9b, + 0xa8, 0x93, 0xa9, 0x92, 0xa4, 0x9d, 0x9a, 0x95, 0x8b, 0x9e, 0x8c, 0x9e, + 0x8c, 0x95, 0x8b, 0x96, 0x8f, 0x94, 0x8, 0x8c, 0x8d, 0x8b, 0x8d, 0x8d, + 0x1a, 0x93, 0x84, 0x8c, 0x84, 0x81, 0x81, 0x8e, 0x8e, 0x82, 0x1e, 0x8e, + 0x81, 0x81, 0x8f, 0x81, 0x1b, 0x6f, 0x67, 0x56, 0x76, 0x7c, 0x1f, 0x6f, + 0x63, 0x6e, 0x68, 0x65, 0x6c, 0x82, 0x84, 0x82, 0x85, 0x82, 0x85, 0x8, + 0x78, 0x91, 0x15, 0x98, 0x88, 0x96, 0xc9, 0xa0, 0xbb, 0xaa, 0xc1, 0x19, + 0x98, 0xa2, 0xa2, 0xb3, 0xa6, 0x1a, 0x98, 0x83, 0x93, 0x83, 0x94, 0x1e, + 0x81, 0x96, 0x83, 0x94, 0x84, 0x98, 0x8, 0x8e, 0x8a, 0x88, 0x90, 0x87, + 0x1b, 0x86, 0x8b, 0x89, 0x88, 0x87, 0x1f, 0x7f, 0x80, 0x80, 0x87, 0x82, + 0x86, 0x8, 0x77, 0x81, 0x7e, 0x85, 0x61, 0x1a, 0x75, 0x8f, 0x76, 0x8f, + 0x76, 0x1e, 0x91, 0x6b, 0x8f, 0x6b, 0x6a, 0x1a, 0x71, 0x89, 0x71, 0x86, + 0x71, 0x1e, 0xa5, 0x65, 0x15, 0xc9, 0x80, 0xbb, 0x76, 0xc1, 0x6c, 0x8, + 0x7e, 0xa2, 0xb3, 0x74, 0xa6, 0x1b, 0x98, 0x94, 0x93, 0x93, 0x93, 0x1f, + 0x96, 0x95, 0x94, 0x93, 0x98, 0x92, 0x8, 0x8e, 0x8c, 0x90, 0x8e, 0x8f, + 0x1a, 0x90, 0x89, 0x8b, 0x88, 0x8f, 0x1e, 0x82, 0x96, 0x85, 0x94, 0x87, + 0x94, 0x8, 0xa1, 0x80, 0x87, 0x99, 0x5f, 0x1b, 0x75, 0x76, 0x87, 0x87, + 0x76, 0x1f, 0x85, 0x6b, 0x6b, 0x87, 0x6a, 0x1b, 0x71, 0x71, 0x8d, 0x90, + 0x71, 0x1f, 0x5b, 0x9a, 0x15, 0x97, 0x93, 0x67, 0xbf, 0x77, 0xbb, 0x7b, + 0xc7, 0x19, 0x83, 0xa8, 0x84, 0xa9, 0x79, 0xa4, 0x82, 0x98, 0x7c, 0x8d, + 0x7b, 0x8c, 0x7e, 0x8c, 0x7e, 0x8b, 0x7f, 0x8f, 0x8, 0x8c, 0x89, 0x89, + 0x8b, 0x89, 0x1b, 0x83, 0x8a, 0x84, 0x84, 0x80, 0x88, 0x80, 0x87, 0x81, + 0x1f, 0x88, 0x82, 0x88, 0x82, 0x82, 0x1a, 0x6f, 0xc0, 0x67, 0xa0, 0x7c, + 0x1e, 0xb3, 0x6f, 0xae, 0x6e, 0xaa, 0x65, 0x92, 0x82, 0x91, 0x82, 0x91, + 0x82, 0x8, 0xa9, 0x61, 0x15, 0xaf, 0x57, 0x9f, 0x5b, 0x9b, 0x4f, 0x93, + 0x6e, 0x92, 0x6d, 0x9d, 0x72, 0x94, 0x7d, 0x9c, 0x8a, 0x9c, 0x8a, 0x97, + 0x8a, 0x97, 0x8b, 0x96, 0x87, 0x8, 0x8a, 0x8d, 0x8d, 0x8b, 0x8d, 0x1b, + 0x93, 0x8c, 0x92, 0x92, 0x94, 0x8d, 0x93, 0x8e, 0x94, 0x1f, 0x8f, 0x96, + 0x8f, 0x96, 0x96, 0x1a, 0xa7, 0x56, 0xaf, 0x76, 0x9a, 0x1e, 0x63, 0xa7, + 0x68, 0xa8, 0x6c, 0xb1, 0x84, 0x94, 0x85, 0x94, 0x85, 0x94, 0x8, 0x5b, + 0x9a, 0x15, 0x8e, 0x98, 0x4d, 0x96, 0x5b, 0xa0, 0x55, 0xaa, 0x19, 0x13, + 0xb8, 0x98, 0x74, 0x63, 0xa2, 0x70, 0x1b, 0x7e, 0x82, 0x83, 0x83, 0x83, + 0x1f, 0x80, 0x81, 0x82, 0x83, 0x7e, 0x84, 0x8, 0x88, 0x8a, 0x86, 0x88, + 0x87, 0x1a, 0x86, 0x8d, 0x8b, 0x8e, 0x87, 0x1e, 0x95, 0x80, 0x91, 0x80, + 0x8f, 0x82, 0x8, 0x76, 0x95, 0x90, 0x7e, 0xb6, 0x1b, 0xa1, 0xa0, 0x8f, + 0x8f, 0xa0, 0x1f, 0x91, 0xab, 0xab, 0x8f, 0xac, 0x1b, 0xa5, 0xa5, 0x89, + 0x86, 0xa5, 0x1f, 0x9b, 0x75, 0x15, 0x80, 0x4d, 0x76, 0x5b, 0x6c, 0x55, + 0x8, 0x7e, 0x74, 0x74, 0x63, 0x70, 0x1a, 0x7e, 0x93, 0x82, 0x93, 0x83, + 0x1e, 0x95, 0x80, 0x93, 0x82, 0x92, 0x7e, 0x8, 0x88, 0x8c, 0x8e, 0x86, + 0x8f, 0x1b, 0x90, 0x8b, 0x8d, 0x8e, 0x8f, 0x1f, 0x94, 0x93, 0x93, 0x90, + 0x93, 0x8f, 0x8, 0xa3, 0x97, 0x9b, 0x8d, 0xba, 0x1a, 0xa1, 0x87, 0xa0, + 0x87, 0xa0, 0x1e, 0x85, 0xab, 0x87, 0xab, 0xac, 0x1a, 0xa5, 0x8d, 0xa5, + 0x90, 0xa5, 0x1e, 0x78, 0x91, 0x15, 0x83, 0x97, 0x57, 0x67, 0x5b, 0x77, + 0x4f, 0x7b, 0x19, 0x6e, 0x83, 0x6d, 0x84, 0x72, 0x79, 0x7e, 0x82, 0x89, + 0x7b, 0x8a, 0x7a, 0x8a, 0x7f, 0x8b, 0x7e, 0x87, 0x80, 0x8, 0x8a, 0x89, + 0x8b, 0x89, 0x89, 0x1a, 0x83, 0x92, 0x8a, 0x92, 0x95, 0x95, 0x88, 0x88, + 0x95, 0x1e, 0x88, 0x95, 0x94, 0x87, 0x95, 0x1b, 0xa7, 0xaf, 0xc0, 0xa0, + 0x9a, 0x1f, 0xa7, 0xb3, 0xa8, 0xae, 0xb1, 0xaa, 0x94, 0x92, 0x94, 0x91, + 0x94, 0x91, 0x8, 0xe, 0xfb, 0xb3, 0x8b, 0xcd, 0xf7, 0xb6, 0xd1, 0xe7, + 0xa4, 0xf7, 0xf, 0xa5, 0x1, 0xae, 0xa4, 0xf7, 0xf, 0xa6, 0xe8, 0xd3, + 0xd4, 0xd0, 0x3, 0xf7, 0x4b, 0xc8, 0x15, 0xe4, 0x4e, 0x5, 0xf2, 0xf7, + 0xf8, 0xf7, 0x22, 0xf7, 0x9, 0x6, 0x4b, 0xd1, 0x5, 0x3d, 0xd7, 0x6, + 0x46, 0xd4, 0x5, 0xfb, 0xf, 0xfb, 0x29, 0xfb, 0x28, 0xfb, 0xd, 0x6, + 0xe6, 0x49, 0x5, 0xc4, 0x6, 0xa6, 0xfb, 0xb6, 0x15, 0xf7, 0xfc, 0xfb, + 0x2a, 0xe7, 0xf7, 0x2a, 0xf7, 0x28, 0xe8, 0xfb, 0x28, 0xf7, 0x25, 0x2f, + 0xfb, 0x25, 0xfb, 0xfc, 0x7, 0xe, 0x55, 0x3a, 0xa, 0xf7, 0xdf, 0xf7, + 0xc9, 0x15, 0xfb, 0x33, 0xfb, 0x3, 0x72, 0x7a, 0x7d, 0x7a, 0x86, 0x73, + 0x19, 0x69, 0x84, 0xa6, 0x6d, 0xad, 0x1b, 0xa3, 0x9a, 0xa2, 0xaa, 0xa4, + 0x1f, 0xf7, 0x2, 0xf7, 0x2e, 0x9e, 0x83, 0x64, 0xfb, 0x66, 0x5, 0x65, + 0x84, 0xa1, 0x61, 0xb6, 0x1b, 0xba, 0x9b, 0xb4, 0xb2, 0x83, 0x1f, 0x65, + 0xf7, 0x66, 0x9d, 0x93, 0xf7, 0x4, 0xfb, 0x32, 0x5, 0x70, 0x9f, 0x98, + 0x74, 0xb1, 0x1b, 0xac, 0xa1, 0xa9, 0xaa, 0xa4, 0x7d, 0x99, 0x77, 0x98, + 0x1f, 0xfb, 0x46, 0xf7, 0xc, 0x93, 0x9f, 0xf7, 0x51, 0x6d, 0x5, 0xb4, + 0x85, 0xc5, 0x86, 0xc5, 0x1a, 0xca, 0x51, 0x89, 0x60, 0x84, 0x1e, 0xfb, + 0x4f, 0x67, 0x83, 0x9f, 0xf7, 0x44, 0xf7, 0xd, 0x5, 0x8b, 0xab, 0xa7, + 0xa4, 0x1a, 0xa9, 0x72, 0xa9, 0x6c, 0x6c, 0x7e, 0x7c, 0x74, 0x7b, 0x1e, + 0xfb, 0xa, 0xfb, 0x40, 0x79, 0x94, 0xab, 0xf7, 0x4d, 0x5, 0xb5, 0x92, + 0x8a, 0xc8, 0x50, 0x1b, 0x5d, 0x78, 0x69, 0x46, 0x97, 0x1f, 0xb1, 0xfb, + 0x4d, 0x78, 0x82, 0xfb, 0x2, 0xf7, 0x29, 0x5, 0xa1, 0x7b, 0x79, 0xab, + 0x6c, 0x1b, 0x6a, 0x6f, 0x74, 0x69, 0x65, 0xa7, 0x7e, 0xa6, 0x78, 0x1f, + 0xf7, 0x30, 0x26, 0x83, 0x78, 0xfb, 0x4e, 0xaf, 0x5, 0x60, 0x93, 0x51, + 0x8a, 0x4e, 0x1a, 0x4e, 0xc6, 0x94, 0xb4, 0x91, 0x1e, 0xf7, 0x4f, 0xa7, + 0x5, 0xe, 0x5b, 0x3a, 0xa, 0xae, 0xf9, 0x66, 0x3, 0x3b, 0xa, 0xfb, + 0x5c, 0xf7, 0x37, 0xfb, 0x34, 0xf7, 0x5b, 0xf7, 0x5a, 0xf7, 0x36, 0xf7, + 0x36, 0xf7, 0x5a, 0xf7, 0x5a, 0xfb, 0x36, 0xf7, 0x35, 0xfb, 0x5a, 0xfb, + 0x5b, 0xfb, 0x37, 0xfb, 0x33, 0xfb, 0x5c, 0x1e, 0xe, 0xad, 0x7d, 0xae, + 0xf9, 0x1c, 0xaf, 0x1, 0xae, 0x9f, 0xf9, 0x1e, 0xf7, 0x19, 0x3, 0xae, + 0xf7, 0xec, 0x15, 0xfb, 0x75, 0xf7, 0x49, 0xfb, 0x19, 0xf7, 0x6a, 0xf7, + 0x6b, 0xf7, 0x55, 0xf7, 0x13, 0xf7, 0x7b, 0xf7, 0x77, 0xfb, 0x52, 0xf7, + 0x1a, 0xfb, 0x69, 0xfb, 0x69, 0xfb, 0x4f, 0xfb, 0x1b, 0xfb, 0x76, 0x1e, + 0x9f, 0x16, 0xf7, 0x48, 0xf7, 0x28, 0x41, 0xa, 0xf7, 0x46, 0xf7, 0x25, + 0xfb, 0x27, 0xfb, 0x46, 0xfb, 0x46, 0xfb, 0x25, 0x3e, 0xa, 0xfb, 0x49, + 0xfb, 0x25, 0xf7, 0x23, 0xf7, 0x48, 0x1e, 0xe, 0x3d, 0x3d, 0xa, 0xf9, + 0x47, 0x7a, 0xa, 0xf9, 0x47, 0xf9, 0x48, 0xfd, 0x47, 0x6, 0xe, 0x3e, + 0x8b, 0xf7, 0x12, 0x6e, 0xa8, 0xf8, 0xac, 0xa9, 0x12, 0xae, 0xa8, 0xf8, + 0xa9, 0xa8, 0x13, 0x78, 0xae, 0xec, 0x15, 0xf7, 0x0, 0x6, 0x13, 0xb8, + 0x2a, 0xf8, 0xdc, 0xf8, 0xde, 0x26, 0xf5, 0xfc, 0xe3, 0x7, 0x13, 0x78, + 0xa8, 0xfc, 0xca, 0x15, 0xf8, 0xac, 0xf8, 0xa9, 0xfc, 0xac, 0x7, 0xe, + 0x3b, 0x8b, 0xf7, 0xf, 0xf8, 0xad, 0xab, 0x1, 0xae, 0xaa, 0xf8, 0xa8, + 0xf7, 0x13, 0x3, 0xae, 0xf7, 0x7, 0x15, 0xf7, 0xa, 0xfb, 0x7, 0x5, + 0xf8, 0xd0, 0xf8, 0xc7, 0x6, 0xfb, 0xd, 0xf7, 0x15, 0x5, 0xfc, 0xcd, + 0x6, 0xaa, 0xfc, 0xcd, 0x6d, 0xa, 0xc0, 0xa0, 0x76, 0xf9, 0x55, 0x54, + 0xa, 0xf9, 0xcb, 0x7a, 0xa, 0xf9, 0xcb, 0x6, 0xfc, 0x30, 0xf9, 0x55, + 0x5, 0xe, 0xc0, 0x92, 0x76, 0xf9, 0x56, 0x54, 0xa, 0xf9, 0xcb, 0x3, + 0xf8, 0x52, 0x7d, 0x15, 0xf8, 0x30, 0xf9, 0x56, 0x5, 0xfd, 0xcb, 0x6, + 0xe, 0x3a, 0xa, 0xa3, 0xf9, 0x63, 0x3, 0x3b, 0xa, 0xf7, 0xfb, 0xfb, + 0xfc, 0xf7, 0xfc, 0xf7, 0xfc, 0xfb, 0xfc, 0xf7, 0xfb, 0x5, 0xe, 0x54, + 0x3f, 0xa, 0x12, 0xaf, 0xf9, 0x5d, 0xfc, 0x8e, 0xf7, 0xc6, 0x13, 0xd0, + 0xf8, 0x1c, 0xf8, 0x21, 0x15, 0xf7, 0x2d, 0xf7, 0x2d, 0xfb, 0x2d, 0xf7, + 0x2f, 0xfb, 0x2d, 0xfb, 0x2e, 0x5, 0xf7, 0x5f, 0xfb, 0x5f, 0x15, 0xf7, + 0x2c, 0xfb, 0x2c, 0x5, 0x13, 0xe0, 0xf7, 0x2f, 0xf7, 0x25, 0xfb, 0x2d, + 0xf7, 0x35, 0x5, 0xfb, 0xf9, 0xfb, 0xfb, 0x15, 0xf7, 0x2d, 0xfb, 0x31, + 0xf7, 0x30, 0xf7, 0x31, 0xfb, 0x30, 0xf7, 0x2f, 0x5, 0xfb, 0x5f, 0x25, + 0x15, 0xf7, 0x2d, 0xf7, 0x2c, 0xfb, 0x2f, 0xf7, 0x2e, 0xfb, 0x2b, 0xfb, + 0x2e, 0x5, 0xe, 0xfb, 0xc2, 0x8b, 0xa4, 0xf7, 0xdb, 0xa2, 0xaa, 0xda, + 0xaa, 0xa4, 0xf7, 0x12, 0xa4, 0x1, 0xae, 0xa3, 0xf7, 0x6, 0xa4, 0xaa, + 0xdc, 0xa9, 0xa3, 0xf7, 0x6, 0xa4, 0x3, 0xf7, 0x41, 0x16, 0xf7, 0x53, + 0xf7, 0xf4, 0xf7, 0x1f, 0xf7, 0x51, 0xfb, 0x1f, 0xf7, 0x2b, 0xfb, 0x53, + 0xfb, 0x2b, 0xfb, 0x1e, 0xfb, 0x51, 0xf7, 0x1e, 0x6, 0xa4, 0xfb, 0xdb, + 0x15, 0xf7, 0xf2, 0xfb, 0x1f, 0xf7, 0x21, 0xf7, 0x1f, 0xf7, 0x2b, 0xf7, + 0x22, 0xfb, 0x2b, 0xf7, 0x1e, 0xfb, 0x21, 0xfb, 0x1e, 0xfb, 0xf2, 0x7, + 0xfb, 0x3, 0xa9, 0x15, 0xdc, 0xf7, 0xf3, 0xf7, 0x1d, 0xda, 0xfb, 0x1d, + 0xf7, 0x2a, 0x3a, 0xfb, 0x2a, 0xfb, 0x1f, 0x3c, 0xf7, 0x1f, 0x6, 0xe, + 0xfc, 0x25, 0x3a, 0xa, 0xae, 0xf8, 0x4, 0x3, 0xae, 0x7d, 0x15, 0xf7, + 0x66, 0xf7, 0x32, 0xf7, 0x35, 0xf7, 0x5c, 0xf7, 0x5c, 0xfb, 0x37, 0xf7, + 0x32, 0xfb, 0x61, 0x1f, 0xfd, 0x63, 0x7, 0xe, 0xfd, 0x51, 0x3d, 0xa, + 0xd0, 0x7a, 0xa, 0xd0, 0xf9, 0x48, 0x46, 0x6, 0xe, 0xfc, 0xc6, 0x5a, + 0xa, 0xae, 0x16, 0xf7, 0x63, 0xf9, 0x48, 0xfb, 0x63, 0x6, 0xe, 0xfc, + 0x3c, 0x3d, 0xa, 0xf7, 0xed, 0x7a, 0xa, 0xf7, 0xed, 0xf9, 0x48, 0xfb, + 0xed, 0x6, 0xe, 0x66, 0xa, 0xb9, 0x64, 0x15, 0x96, 0x7e, 0xf7, 0x38, + 0xf7, 0x56, 0xf7, 0x42, 0xf7, 0x27, 0xd9, 0xbb, 0x19, 0x30, 0xc2, 0xfb, + 0x3f, 0xf7, 0x1f, 0xfb, 0x34, 0xf7, 0x5b, 0x7c, 0x80, 0x18, 0xb7, 0xfb, + 0xb, 0xe3, 0xfb, 0x3d, 0xcf, 0x2d, 0x4c, 0x37, 0x2e, 0xfb, 0x65, 0x69, + 0x38, 0x8, 0xe, 0xfc, 0x41, 0x3d, 0xa, 0xf7, 0xe8, 0x7a, 0xa, 0xf7, + 0x84, 0x6, 0xef, 0xf7, 0xee, 0x27, 0xf7, 0xee, 0x5, 0xfb, 0x84, 0x6, + 0xef, 0xfb, 0xee, 0x5, 0xe, 0xfc, 0xf1, 0x3a, 0xa, 0xae, 0xc7, 0x3, + 0xae, 0xd3, 0x15, 0xf7, 0x22, 0x35, 0xa1, 0xa0, 0x23, 0xd2, 0x5, 0xf8, + 0xaf, 0x7, 0xf3, 0xcf, 0x75, 0x9f, 0xfb, 0x22, 0x33, 0x5, 0xe, 0xfc, + 0xf1, 0x3a, 0xa, 0xf7, 0x1e, 0xc8, 0x3, 0xae, 0x93, 0x15, 0xa0, 0x75, + 0xf7, 0x23, 0xe1, 0x5, 0xf8, 0xb5, 0x7, 0xfb, 0x23, 0xe3, 0x76, 0x77, + 0xf2, 0x47, 0x5, 0xfc, 0xae, 0x7, 0xe, 0xfc, 0x55, 0x3a, 0xa, 0xae, + 0xf7, 0x10, 0x3, 0xf7, 0xf2, 0x7d, 0x15, 0x91, 0x96, 0x5, 0xfb, 0x25, + 0xbc, 0x57, 0xf7, 0x32, 0xf7, 0x21, 0x1a, 0xf7, 0x1e, 0xc3, 0xf7, 0x38, + 0xf7, 0x21, 0xba, 0x1e, 0x83, 0x96, 0x5, 0xfb, 0x52, 0x54, 0xfb, 0xf, + 0x20, 0xfb, 0x5a, 0x1a, 0xfb, 0x5b, 0xf7, 0x1a, 0xfb, 0x2, 0xf7, 0x49, + 0x59, 0x1e, 0xe, 0xfb, 0x9a, 0xf3, 0xa2, 0xf7, 0x55, 0xb3, 0xf7, 0x69, + 0xa2, 0x1, 0xae, 0xa2, 0xf7, 0x66, 0xb4, 0xf7, 0x66, 0xa2, 0x14, 0x1c, + 0xf4, 0xf3, 0x15, 0xf8, 0x4, 0x6, 0x81, 0xa2, 0x5, 0x21, 0x5b, 0xe2, + 0xf7, 0x4, 0x1f, 0xf7, 0xa, 0xe7, 0x5c, 0x20, 0x1f, 0xa2, 0x81, 0x5, + 0xf8, 0x4, 0x7, 0x74, 0x81, 0x8e, 0xfb, 0x5, 0xfb, 0x0, 0x65, 0x22, + 0x88, 0x19, 0xf2, 0xb6, 0xf7, 0x2, 0xf7, 0x3, 0x85, 0x1e, 0x95, 0xa2, + 0x5, 0xfc, 0x4, 0x6, 0x95, 0x74, 0x5, 0xf6, 0x88, 0xb9, 0x31, 0xfb, + 0x6, 0x1a, 0xfb, 0x2, 0x22, 0xbb, 0xf5, 0x90, 0x1f, 0x74, 0x95, 0x5, + 0xfc, 0x4, 0x7, 0xa2, 0x95, 0x8c, 0xf6, 0xf7, 0x0, 0xc4, 0xf0, 0x81, + 0x19, 0x22, 0x63, 0x29, 0xfb, 0x5, 0x8f, 0x1e, 0xe, 0xfc, 0x55, 0x3a, + 0xa, 0xf7, 0x7c, 0xf7, 0xf, 0x3, 0xae, 0x88, 0x15, 0x92, 0x80, 0x5, + 0xf7, 0x50, 0xbf, 0xf7, 0x11, 0xf7, 0x0, 0xf7, 0x5b, 0x1a, 0xf7, 0x59, + 0xfb, 0xf, 0xf7, 0x0, 0xfb, 0x52, 0xc2, 0x1e, 0x84, 0x80, 0x5, 0xf7, + 0x20, 0x5b, 0xc4, 0xfb, 0x37, 0xfb, 0x1e, 0x1a, 0xfb, 0x21, 0x56, 0xfb, + 0x32, 0xfb, 0x24, 0x5a, 0x1e, 0xe, 0xfc, 0xc7, 0x5a, 0xa, 0xf7, 0x19, + 0x16, 0xf7, 0x1, 0x6, 0x26, 0xf7, 0xed, 0xf0, 0xf7, 0xef, 0x5, 0x22, + 0x6, 0x25, 0xfb, 0xef, 0x5, 0xe, 0xfc, 0xc7, 0x5a, 0xa, 0xae, 0x16, + 0xf5, 0x6, 0xf0, 0xf7, 0xed, 0x24, 0xf7, 0xef, 0x5, 0x23, 0x6, 0xef, + 0xfb, 0xef, 0x5, 0xe, 0xfc, 0x9e, 0x3d, 0xa, 0xf7, 0x34, 0x3, 0xf7, + 0x4c, 0x16, 0xee, 0x6, 0x54, 0xf7, 0x4, 0x6a, 0xf7, 0x4, 0xf7, 0x11, + 0x1a, 0xf7, 0x12, 0xa9, 0xed, 0xbd, 0xf7, 0xb, 0x1e, 0x2b, 0x6, 0x3a, + 0x29, 0x4c, 0xfb, 0xc, 0xfb, 0x14, 0x1a, 0xfb, 0x12, 0xcc, 0xfb, 0x13, + 0xdf, 0x2e, 0x1e, 0xe, 0xfc, 0x9e, 0x38, 0xa, 0xf7, 0xc, 0xf7, 0x37, + 0x7a, 0xa, 0xee, 0x6, 0xde, 0xe7, 0xcd, 0xf7, 0x14, 0xf7, 0x11, 0x1a, + 0xf7, 0x16, 0x4b, 0xf7, 0x9, 0x3b, 0xef, 0x1e, 0x28, 0x6, 0xc0, 0xfb, + 0xc, 0xa6, 0x2a, 0xfb, 0x12, 0x1a, 0xfb, 0x10, 0x6c, 0xfb, 0x5, 0x55, + 0xfb, 0x4, 0x1e, 0xe, 0xfc, 0x8d, 0x38, 0xa, 0xe1, 0xf7, 0x1b, 0x3, + 0xf7, 0xbf, 0x16, 0x99, 0x7, 0x3d, 0x8b, 0xc1, 0xc1, 0xf7, 0x2e, 0x8f, + 0xc0, 0x38, 0x9c, 0x1f, 0xde, 0x9d, 0x87, 0xc6, 0xf7, 0x24, 0x1a, 0xd7, + 0x8b, 0xaf, 0xd9, 0x1e, 0x98, 0x61, 0x7, 0x67, 0x39, 0x8b, 0x7c, 0x76, + 0x1f, 0x6c, 0x75, 0x87, 0x70, 0x68, 0x1a, 0x91, 0xfb, 0x3e, 0x5, 0x64, + 0x7f, 0x6d, 0x61, 0x83, 0x1e, 0xb5, 0x83, 0x97, 0x6f, 0x63, 0x1a, 0x85, + 0xfb, 0x3d, 0x5, 0x68, 0x8c, 0x69, 0xaf, 0x79, 0x1e, 0x7f, 0xa3, 0xd2, + 0x89, 0xaf, 0x1b, 0xe, 0xfc, 0x8d, 0x38, 0xa, 0xf7, 0x5, 0xf7, 0x1b, + 0x7a, 0xa, 0xbb, 0x6, 0xaf, 0xdc, 0x8b, 0x99, 0x99, 0x1f, 0xaf, 0x9d, + 0x8c, 0xad, 0xae, 0x1a, 0x85, 0xf7, 0x3d, 0x8a, 0xb4, 0x98, 0xa6, 0xb5, + 0x93, 0x19, 0x61, 0x93, 0x7d, 0xa0, 0x8d, 0xbb, 0x91, 0xf7, 0x3e, 0x18, + 0xae, 0x88, 0xa7, 0x6b, 0xa0, 0x1e, 0x9a, 0x74, 0x3b, 0x8b, 0x67, 0x1b, + 0x61, 0x7e, 0x6, 0xd9, 0x8b, 0x54, 0x56, 0x1f, 0x37, 0x7, 0x45, 0x87, + 0x56, 0xdd, 0x79, 0x1e, 0x39, 0x7a, 0x8f, 0x56, 0x45, 0x1a, 0x37, 0x7, + 0x55, 0x8b, 0x55, 0x3d, 0x1e, 0xe, 0xfc, 0x53, 0x73, 0xa, 0xf0, 0x26, + 0xf7, 0xd0, 0x13, 0xa0, 0xf7, 0xcc, 0xf9, 0x3a, 0x15, 0x86, 0xa0, 0x5, + 0xfb, 0x13, 0x7a, 0xfb, 0x23, 0x4b, 0xfb, 0x5b, 0x1a, 0x36, 0xc6, 0x21, + 0xf2, 0xeb, 0xc5, 0xd4, 0xd2, 0xc3, 0x71, 0xac, 0x75, 0x97, 0x1e, 0x7e, + 0x91, 0x7a, 0x8f, 0x7c, 0x86, 0x8, 0x86, 0x78, 0x81, 0x86, 0x70, 0x1b, + 0x13, 0xc0, 0x63, 0x71, 0xa0, 0xb5, 0xbd, 0xaf, 0xcc, 0xf7, 0x1e, 0xab, + 0x1f, 0xe, 0xfc, 0x53, 0x73, 0xa, 0xf7, 0xd0, 0x26, 0xf0, 0x13, 0xc0, + 0xde, 0xf7, 0x78, 0x15, 0xf7, 0x13, 0x9c, 0xf7, 0x23, 0xcb, 0xf7, 0x5b, + 0x1a, 0xe0, 0x50, 0xf5, 0x24, 0x2b, 0x51, 0x42, 0x44, 0x53, 0xa5, 0x6a, + 0xa1, 0x7f, 0x1e, 0x97, 0x85, 0x9a, 0x87, 0x9d, 0x90, 0x8, 0x90, 0x9e, + 0x95, 0x90, 0xa6, 0x1b, 0x13, 0xa0, 0xb3, 0xa5, 0x76, 0x61, 0x59, 0x67, + 0x4a, 0xfb, 0x1e, 0x6b, 0x1f, 0x90, 0x76, 0x5, 0xe, 0xfb, 0x3f, 0xf8, + 0xec, 0xf9, 0x3a, 0x15, 0x87, 0xa0, 0x5, 0xfb, 0xc, 0x5f, 0xa, 0x73, + 0xac, 0x76, 0x97, 0x1e, 0x80, 0x91, 0x7c, 0x8f, 0x7a, 0x86, 0x8, 0x86, + 0x7a, 0x81, 0x86, 0x72, 0x1b, 0x65, 0x73, 0xa0, 0xb5, 0xbd, 0xac, 0xcc, + 0xf7, 0x16, 0xab, 0x1f, 0xfb, 0xc4, 0x16, 0x86, 0xa0, 0x5, 0xfb, 0xb, + 0x5f, 0xa, 0x72, 0xac, 0x76, 0x97, 0x1e, 0x80, 0x91, 0x7d, 0x8f, 0x7a, + 0x86, 0x8, 0x86, 0x79, 0x82, 0x86, 0x71, 0x1b, 0x66, 0x72, 0xa0, 0xb5, + 0xbd, 0xad, 0xcc, 0xf7, 0x16, 0xab, 0x1f, 0xe, 0xfc, 0xc5, 0xe, 0x7d, + 0x99, 0xf7, 0xee, 0x98, 0xf7, 0xe1, 0x98, 0x6, 0x1e, 0xa0, 0x39, 0x63, + 0xff, 0xc, 0x9, 0xa7, 0xa, 0xe5, 0xb, 0xf9, 0xa8, 0x14, 0xf9, 0xdb, + 0x15, 0xa7, 0x13, 0x0, 0x61, 0x2, 0x0, 0x1, 0x0, 0x7, 0x0, 0xb, + 0x0, 0x11, 0x0, 0x18, 0x0, 0x1f, 0x0, 0x2c, 0x0, 0x30, 0x0, 0x39, + 0x0, 0x3e, 0x0, 0x43, 0x0, 0x4b, 0x0, 0x52, 0x0, 0x5a, 0x0, 0x5f, + 0x0, 0x64, 0x0, 0x69, 0x0, 0x78, 0x0, 0x7f, 0x0, 0xba, 0x0, 0xbf, + 0x1, 0xb, 0x1, 0x11, 0x1, 0x18, 0x1, 0x1d, 0x1, 0x24, 0x1, 0x3e, + 0x1, 0x42, 0x1, 0x46, 0x1, 0x55, 0x1, 0x59, 0x1, 0x5e, 0x1, 0x64, + 0x1, 0x69, 0x1, 0x6e, 0x1, 0x85, 0x1, 0x8d, 0x1, 0x92, 0x1, 0xa5, + 0x1, 0xaa, 0x1, 0xc7, 0x1, 0xe2, 0x1, 0xfc, 0x2, 0xb, 0x2, 0x16, + 0x2, 0x1b, 0x2, 0x1f, 0x2, 0x29, 0x2, 0x37, 0x2, 0x41, 0x2, 0x4b, + 0x2, 0x58, 0x2, 0x65, 0x2, 0x69, 0x2, 0x7f, 0x2, 0x95, 0x2, 0xa4, + 0x2, 0xaf, 0x2, 0xbe, 0x2, 0xc4, 0x2, 0xcf, 0x2, 0xda, 0x2, 0xec, + 0x2, 0xfe, 0x3, 0xf, 0x3, 0x20, 0x3, 0x2f, 0x3, 0x38, 0x3, 0x41, + 0x3, 0x4a, 0x3, 0x51, 0x3, 0x5e, 0x3, 0x6b, 0x3, 0x77, 0x3, 0x83, + 0x3, 0x89, 0x3, 0x8d, 0x3, 0x98, 0x3, 0xa1, 0x3, 0xa8, 0x3, 0xaf, + 0x3, 0xb6, 0x3, 0xbd, 0x3, 0xc4, 0x3, 0xcb, 0x3, 0xd0, 0x3, 0xd4, + 0x3, 0xde, 0x3, 0xe8, 0x3, 0xf2, 0x3, 0xfc, 0x4, 0x0, 0x4, 0x9, + 0x4, 0x12, 0x4, 0x19, 0x4, 0x1f, 0x4, 0x24, 0x4, 0x28, 0x30, 0xa, + 0x33, 0xa, 0x1e, 0xb, 0x15, 0x20, 0xa, 0xb, 0xae, 0xf7, 0xee, 0x21, + 0xa, 0xb, 0xae, 0xf7, 0xee, 0x15, 0x2c, 0xa, 0xb, 0xf7, 0x5b, 0x25, + 0xa, 0xfb, 0x5b, 0xb, 0xf7, 0x35, 0xf7, 0x35, 0xf7, 0x5b, 0xf7, 0x5a, + 0xfb, 0x35, 0xf7, 0x35, 0xb, 0x3, 0x23, 0xa, 0xb, 0xfb, 0x5a, 0xfb, + 0x35, 0xfb, 0x35, 0xfb, 0x5a, 0xb, 0xf7, 0x48, 0x2d, 0xa, 0xb, 0x2e, + 0xa, 0xf7, 0x5a, 0xb, 0xfb, 0x35, 0xfb, 0x35, 0xfb, 0x5a, 0x1e, 0xb, + 0xfb, 0x5b, 0xf7, 0x35, 0xfb, 0x35, 0xb, 0x46, 0xa, 0x24, 0xa, 0x27, + 0xa, 0x1e, 0xb, 0xf7, 0x25, 0x31, 0xa, 0xb, 0x3b, 0xa, 0x2b, 0xa, + 0xb, 0x2d, 0xa, 0xfb, 0x25, 0xb, 0x2c, 0xa, 0xae, 0x16, 0x40, 0xa, + 0x41, 0xa, 0xf7, 0x48, 0x2f, 0xa, 0xfb, 0x48, 0xb, 0x3e, 0xa, 0xfb, + 0x48, 0xfb, 0x25, 0xb, 0xf7, 0x7e, 0xf7, 0x3e, 0x5, 0xfb, 0xb5, 0x6, + 0x32, 0xf7, 0xa7, 0x32, 0xfb, 0xa7, 0x5, 0xfb, 0xb5, 0x6, 0xf7, 0x7e, + 0xfb, 0x3e, 0x5, 0x68, 0xfb, 0x5b, 0x15, 0xe1, 0xf7, 0x6c, 0xfb, 0x58, + 0xf7, 0x10, 0xf7, 0x7c, 0x7c, 0xc4, 0xf7, 0x75, 0xc4, 0xfb, 0x75, 0xf7, + 0x7c, 0x9a, 0xfb, 0x58, 0xfb, 0x10, 0xe1, 0xfb, 0x6c, 0xfb, 0x47, 0xf7, + 0x29, 0x5, 0xb, 0xfb, 0x47, 0x36, 0xa, 0xb, 0xf8, 0xaa, 0xf8, 0x8d, + 0x15, 0xaf, 0xae, 0x5, 0xa2, 0x98, 0xa9, 0xa6, 0xac, 0x1b, 0xba, 0xc5, + 0x5f, 0x4d, 0x71, 0x75, 0x6b, 0x70, 0x7a, 0x1f, 0x6e, 0x65, 0xc1, 0x8e, + 0xb3, 0xbe, 0x93, 0xb6, 0x19, 0xf7, 0x12, 0xe9, 0x71, 0xf7, 0x2e, 0xfb, + 0x23, 0xfb, 0x1b, 0x7d, 0x98, 0x7a, 0x95, 0x77, 0x92, 0x19, 0xf7, 0x5, + 0xf7, 0x16, 0x5, 0x7a, 0x65, 0x87, 0x83, 0x7d, 0x1f, 0x2f, 0xfb, 0x4, + 0x5, 0x52, 0x84, 0x61, 0x50, 0x68, 0x87, 0x8b, 0x88, 0x87, 0x1a, 0xb, + 0x4f, 0xa, 0x32, 0xa, 0x30, 0xb, 0xfb, 0x25, 0xf7, 0x25, 0xf7, 0x48, + 0xb, 0x15, 0x30, 0xa, 0x1e, 0xb, 0xa0, 0x76, 0xf9, 0x48, 0x77, 0x1, + 0xb, 0x95, 0x8, 0xb2, 0x9c, 0xda, 0xc4, 0xba, 0x1a, 0xbd, 0x26, 0xa7, + 0x64, 0x90, 0x1e, 0x8a, 0x8e, 0x97, 0x9b, 0x97, 0x9c, 0x95, 0x9c, 0x19, + 0x87, 0x8e, 0xb, 0x3f, 0xa, 0x1, 0xb, 0xae, 0x4d, 0xa, 0xb, 0x97, + 0x6b, 0x4a, 0xa, 0x9e, 0x7d, 0xa0, 0x81, 0x8, 0x64, 0x7a, 0x3c, 0x45, + 0xa, 0xb, 0x38, 0xa, 0xae, 0xb, 0xfb, 0x25, 0xfb, 0x47, 0xb, 0x92, + 0x76, 0xf9, 0x63, 0x77, 0xb, 0xf7, 0x47, 0xf7, 0x25, 0xb, 0xf7, 0x25, + 0xf7, 0x47, 0xb, 0x15, 0xa6, 0x9f, 0xa0, 0xa6, 0xa6, 0xa0, 0x76, 0x4b, + 0xa, 0xfb, 0xb4, 0x4, 0xa6, 0x9f, 0x9f, 0xa6, 0xa6, 0xa0, 0x77, 0x4b, + 0xa, 0xb, 0x5c, 0xa, 0x78, 0x99, 0x76, 0x39, 0xa, 0xb, 0x50, 0xa, + 0x51, 0xa, 0xb, 0x52, 0x5c, 0x1a, 0x59, 0xf0, 0x6f, 0xb2, 0x86, 0x1e, + 0x8c, 0x88, 0x7f, 0x7b, 0x7f, 0x7a, 0x81, 0x7a, 0x19, 0xb, 0x2b, 0xa, + 0xf7, 0x5a, 0xb, 0xa1, 0x6e, 0xa1, 0x6d, 0x65, 0x1a, 0x7f, 0x88, 0x73, + 0x7b, 0x72, 0x82, 0xc3, 0x9e, 0x9f, 0x90, 0x9e, 0x8f, 0x9e, 0x1e, 0x6a, + 0xa, 0x89, 0x7c, 0x7b, 0x89, 0x7c, 0x1b, 0xb, 0x6a, 0xa, 0x75, 0xa8, + 0x75, 0xa9, 0xb1, 0x1a, 0x97, 0x8e, 0xa3, 0x9b, 0xa4, 0x94, 0x53, 0x78, + 0x77, 0x86, 0x78, 0x87, 0x78, 0x1e, 0xfb, 0x2d, 0xc2, 0x15, 0xb, 0xe0, + 0xf7, 0xb, 0x76, 0xf7, 0x8c, 0x77, 0xf7, 0xa0, 0x54, 0xa, 0xf9, 0xea, + 0x3, 0xae, 0xed, 0x15, 0xf9, 0xea, 0xf7, 0x8c, 0xfd, 0xea, 0xf7, 0x8c, + 0xb, 0x1f, 0x89, 0x89, 0x5, 0x8e, 0x77, 0x76, 0x8c, 0x77, 0x1b, 0x86, + 0x7, 0x9c, 0x7c, 0xb, 0x70, 0x70, 0x76, 0x77, 0x70, 0x70, 0x77, 0x9f, + 0xa6, 0x1e, 0xb, 0xae, 0x12, 0xae, 0xae, 0xb, 0xf7, 0xee, 0x15, 0xb, + 0xb4, 0x8f, 0x7f, 0xf7, 0x12, 0x62, 0xa, 0x52, 0xa, 0xb, 0x9d, 0x15, + 0xf7, 0x7e, 0xf7, 0x3e, 0xf7, 0x7e, 0xfb, 0x3e, 0x31, 0xf7, 0xa7, 0xb, + 0x15, 0x7d, 0x96, 0x80, 0x99, 0x99, 0x96, 0x96, 0x99, 0xb, 0x99, 0x80, + 0x96, 0x7d, 0x7d, 0x80, 0x80, 0x7d, 0x1e, 0xb, 0x88, 0x8c, 0x84, 0x9e, + 0x81, 0x9d, 0x81, 0x9c, 0x19, 0x87, 0x89, 0x5, 0xb, 0x8e, 0x8a, 0x92, + 0x78, 0x95, 0x79, 0x95, 0x7a, 0x19, 0x8f, 0x8d, 0x5, 0xb, 0x77, 0x1, + 0xae, 0xb, 0x83, 0x83, 0x90, 0x94, 0x91, 0x8d, 0x90, 0x8e, 0x90, 0x1f, + 0xa2, 0xb3, 0xaf, 0x97, 0xb4, 0x98, 0x8, 0xfb, 0x2d, 0xc2, 0x15, 0xb, + 0xcc, 0x77, 0xc8, 0x92, 0xc1, 0xc4, 0xb8, 0x5e, 0xf7, 0x2e, 0xfb, 0x1, + 0xb0, 0x70, 0xae, 0x8f, 0xf7, 0x2e, 0xfb, 0x1b, 0x9d, 0xb, 0x87, 0x79, + 0x89, 0x79, 0x64, 0xa, 0x55, 0xa1, 0x5e, 0x1b, 0x60, 0x81, 0x6c, 0x66, + 0xb, 0xc3, 0x1b, 0xb7, 0xc1, 0xbe, 0xac, 0xa4, 0x1f, 0x53, 0xa, 0xb, + 0x8f, 0x9d, 0x8d, 0x9d, 0x63, 0xa, 0xc1, 0x75, 0xb8, 0x1b, 0xb6, 0x95, + 0xaa, 0xb0, 0xb, 0x3d, 0xa, 0xf7, 0x63, 0x3, 0xb, 0xf7, 0x27, 0x15, + 0xa1, 0x92, 0xa0, 0x95, 0x9e, 0x98, 0x8, 0xb, 0x88, 0x9f, 0xa0, 0x8a, + 0x9f, 0x1b, 0x90, 0x7, 0x7a, 0x9a, 0xb, 0x93, 0x93, 0x86, 0x82, 0x85, + 0x89, 0x86, 0x88, 0x86, 0x1f, 0x74, 0x63, 0x67, 0x7f, 0x62, 0x7e, 0x8, + 0xb, 0xae, 0x70, 0xb0, 0x8b, 0xb8, 0x62, 0xb8, 0xc0, 0xc1, 0x59, 0xc1, + 0x8e, 0xc8, 0x52, 0xc8, 0x77, 0xcc, 0xb, 0x7a, 0xfb, 0x1b, 0x4b, 0xfb, + 0x5b, 0x1a, 0x36, 0xc3, 0x21, 0xec, 0xe5, 0xc2, 0xd4, 0xd2, 0xc3, 0xb, + 0xa7, 0xd8, 0xcf, 0xaf, 0xb8, 0x5e, 0xf7, 0xa, 0xfb, 0xa, 0xf7, 0x22, + 0x38, 0xc6, 0x83, 0x92, 0xb, 0x74, 0x4e, 0x99, 0xa8, 0x98, 0x99, 0x8d, + 0x95, 0xbb, 0xa3, 0x72, 0x6e, 0xad, 0x1f, 0xb, 0x52, 0x1b, 0x5f, 0x55, + 0x58, 0x6a, 0x72, 0x1f, 0xb, 0x9d, 0x90, 0x8a, 0x90, 0x90, 0x1a, 0x71, + 0xaf, 0xb, 0x79, 0x86, 0x8c, 0x86, 0x86, 0x1a, 0xa5, 0x67, 0xb, 0x13, + 0xb2, 0x5a, 0x96, 0x56, 0xa0, 0xb, 0xfb, 0xde, 0x6c, 0x76, 0xf9, 0xa2, + 0x77, 0x1, 0xaf, 0xf8, 0x49, 0x3, 0xb, 0xf7, 0x22, 0xfb, 0xb, 0xc6, + 0x51, 0xf7, 0xa, 0x5d, 0xb8, 0x5f, 0xb8, 0xb, 0x9c, 0xf7, 0x1b, 0xcb, + 0xf7, 0x5b, 0x1a, 0xe0, 0x53, 0xf5, 0x2a, 0xb, 0xa5, 0xa5, 0xa1, 0x76, + 0x71, 0x71, 0x75, 0x75, 0x71, 0x71, 0x75, 0xb, 0xf7, 0x4a, 0xfb, 0x6b, + 0x15, 0xb, 0xfb, 0x7f, 0x15, 0xb, 0xf7, 0x4a, 0x72, 0xa4, 0xf7, 0x84, + 0xa4, 0x72, 0xf7, 0x4a, 0xb, 0x15, 0xf8, 0xad, 0xf8, 0xa8, 0xfc, 0xad, + 0x7, 0xe, 0x13, 0xe4, 0x82, 0xb9, 0x55, 0x40, 0xb, 0x13, 0xb2, 0x96, + 0x96, 0x56, 0xa0, 0xb, 0x13, 0xb2, 0x9a, 0x96, 0x55, 0xa0, 0xb, 0x75, + 0x84, 0x76, 0x81, 0x78, 0x7e, 0xb, 0xf7, 0x11, 0xf8, 0x78, 0xf7, 0x2, + 0xb, 0xf7, 0x78, 0xf8, 0x6b, 0x12, 0xb0, 0xb, 0xae, 0x1, 0xae, 0xae, + 0xb, 0x5, 0x8d, 0x7, 0xb, 0xf7, 0xf3, 0xf7, 0x7c, 0xfb, 0xf3, 0xf7, + 0x7c, 0x5, 0xb, 0x7e, 0x7d, 0x89, 0x81, 0x5b, 0x73, 0xa4, 0xa8, 0x69, + 0xb, 0x15, 0x9b, 0x7b, 0x9d, 0x82, 0x90, 0x90, 0x90, 0x90, 0xb, 0x15, + 0x90, 0x86, 0x9d, 0x94, 0x9b, 0x9b, 0x9b, 0x9b, 0xb, 0x3, 0xae, 0x16, + 0xb, 0x9a, 0x85, 0x97, 0x1e, 0x82, 0x9d, 0x80, 0x98, 0xb, 0x99, 0x8b, + 0xf7, 0x2, 0x3e, 0xb7, 0xac, 0x99, 0xb, 0xfb, 0xad, 0x5, 0xf7, 0x35, + 0x7, 0xe, 0x13, 0x94, 0x54, 0xec, 0x1b, 0xb, 0x1f, 0x8d, 0x8d, 0x5, + 0xb, 0x5, 0x89, 0x7, 0xb}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixed.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixed.cpp new file mode 100644 index 000000000000..61c085759339 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixed.cpp @@ -0,0 +1,1476 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitFixedFontData[17597] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xe, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x46, 0x69, 0x78, 0x65, 0x64, 0x4f, 0x54, 0x46, 0x0, 0x1, + 0x1, 0x1, 0x23, 0xf8, 0x10, 0x0, 0xf8, 0x2a, 0x1, 0xf8, 0x2b, 0x2, + 0xf8, 0x2b, 0x3, 0xf8, 0x18, 0x4, 0x6f, 0xfb, 0x8d, 0xf9, 0x8, 0xf9, + 0xb7, 0x5, 0xf7, 0x85, 0xf, 0xf9, 0x6c, 0x11, 0xaa, 0x1c, 0x3e, 0x6b, + 0x12, 0x0, 0x11, 0x1, 0x1, 0x5, 0xb, 0xd, 0x11, 0x19, 0x22, 0x2b, + 0x34, 0x3e, 0x45, 0x4b, 0x4d, 0x51, 0x5d, 0x65, 0x8f, 0x9e, 0x45, 0x75, + 0x72, 0x6f, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x49, 0x4a, 0x49, 0x64, + 0x6f, 0x74, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x61, 0x72, + 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68, 0x61, 0x72, 0x72, 0x6f, 0x77, + 0x64, 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66, + 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69, 0x67, 0x68, 0x74, 0x61, + 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x67, 0x63, 0x61, 0x72, 0x6f, 0x6e, + 0x69, 0x6a, 0x6c, 0x69, 0x72, 0x61, 0x70, 0x72, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x65, 0x64, 0x69, 0x6c, + 0x6c, 0x61, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, + 0x6d, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x0, + 0x0, 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, + 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1, + 0x0, 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, + 0x0, 0x9a, 0x1, 0x87, 0x0, 0x27, 0x0, 0x28, 0x1, 0x88, 0x0, 0x29, + 0x0, 0x2a, 0x1, 0x89, 0x0, 0xb6, 0x0, 0xb7, 0x0, 0xb8, 0x1, 0x8a, + 0x0, 0xb9, 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x8c, 0x0, 0x2e, + 0x0, 0x2f, 0x0, 0xba, 0x0, 0x30, 0x0, 0x8e, 0x0, 0xbb, 0x0, 0xbc, + 0x0, 0xbd, 0x0, 0xbe, 0x0, 0x8d, 0x0, 0xbf, 0x0, 0x31, 0x0, 0x32, + 0x0, 0x33, 0x0, 0x34, 0x0, 0xc0, 0x1, 0x8b, 0x0, 0x35, 0x0, 0x9d, + 0x0, 0x36, 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37, + 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0x3b, + 0x0, 0xc7, 0x0, 0x42, 0x0, 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca, + 0x0, 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc, 0x1, 0x8c, 0x1, 0x8d, + 0x1, 0x8e, 0x1, 0x8f, 0x1, 0x90, 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, + 0x0, 0x21, 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0, 0x5d, 0x0, 0x5c, + 0x0, 0x5e, 0x0, 0x3c, 0x0, 0x3e, 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, + 0x0, 0x44, 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0, 0x61, 0x0, 0x7e, + 0x0, 0x1b, 0x0, 0xd, 0x0, 0xaa, 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, + 0x0, 0x71, 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0, 0x5, 0x0, 0x82, + 0x0, 0x91, 0x0, 0x46, 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, + 0x0, 0x19, 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0, 0x1e, 0x0, 0xa7, + 0x0, 0x2, 0x0, 0x60, 0x0, 0x47, 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, + 0x0, 0x65, 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x1, 0x91, 0x0, 0x95, + 0x0, 0x7c, 0x0, 0x1f, 0x0, 0x6a, 0x0, 0x78, 0x0, 0x6b, 0x0, 0x6c, + 0x0, 0x49, 0x0, 0x86, 0x0, 0xe, 0x0, 0x4a, 0x0, 0xd3, 0x0, 0xd4, + 0x0, 0xd5, 0x0, 0xd6, 0x1, 0x92, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, + 0x0, 0x1d, 0x1, 0x93, 0x0, 0x97, 0x0, 0x92, 0x0, 0x4e, 0x0, 0x80, + 0x0, 0xa6, 0x0, 0x98, 0x0, 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7, + 0x0, 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0xda, 0x0, 0x94, + 0x0, 0x87, 0x0, 0xdb, 0x0, 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96, + 0x0, 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc, 0x0, 0x51, 0x0, 0x73, + 0x0, 0x9, 0x0, 0xa, 0x0, 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a, + 0x0, 0xc, 0x0, 0x9c, 0x1, 0x94, 0x0, 0x52, 0x0, 0x20, 0x0, 0x7b, + 0x0, 0x3, 0x0, 0x76, 0x0, 0x69, 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, + 0x0, 0x75, 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0, 0x84, 0x0, 0x54, + 0x0, 0xdd, 0x1, 0x95, 0x0, 0x66, 0x0, 0x1c, 0x0, 0x18, 0x0, 0x17, + 0x0, 0x10, 0x0, 0x1, 0x0, 0x62, 0x0, 0x55, 0x0, 0xa2, 0x0, 0x14, + 0x0, 0xa3, 0x0, 0xa9, 0x0, 0x7f, 0x0, 0x99, 0x0, 0x13, 0x0, 0xa4, + 0x0, 0x56, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0x40, + 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, 0xe2, 0x0, 0xe3, + 0x0, 0x64, 0x0, 0x5b, 0x0, 0xe4, 0x0, 0x11, 0x0, 0xf4, 0x2, 0x0, + 0x1, 0x0, 0x2, 0x0, 0x4e, 0x0, 0xa8, 0x0, 0xc5, 0x0, 0xf1, 0x1, + 0x22, 0x1, 0x41, 0x1, 0x8a, 0x1, 0xd7, 0x2, 0x3b, 0x2, 0x86, 0x3, + 0x4, 0x3, 0x3e, 0x3, 0x79, 0x3, 0x92, 0x3, 0xbf, 0x3, 0xf5, 0x4, + 0xa, 0x4, 0x57, 0x4, 0xd4, 0x5, 0xb, 0x5, 0x3c, 0x5, 0x71, 0x5, + 0xac, 0x5, 0xc9, 0x6, 0x15, 0x6, 0x32, 0x6, 0x5b, 0x6, 0x78, 0x6, + 0xa1, 0x6, 0xbd, 0x6, 0xef, 0x7, 0x39, 0x7, 0x5b, 0x7, 0x95, 0x7, + 0xd5, 0x8, 0x7, 0x8, 0x7a, 0x8, 0xc3, 0x9, 0x1c, 0x9, 0x39, 0x9, + 0x4b, 0x9, 0x6d, 0x9, 0x88, 0xa, 0x1, 0xa, 0x47, 0xa, 0x8b, 0xb, + 0x27, 0xb, 0x83, 0xb, 0xfa, 0xc, 0x80, 0xd, 0x26, 0xd, 0x5f, 0xd, + 0xb9, 0xd, 0xf8, 0xe, 0x15, 0xe, 0x25, 0xe, 0x46, 0xe, 0x61, 0xe, + 0x92, 0xe, 0xd8, 0xf, 0x1d, 0xf, 0x5a, 0xf, 0x78, 0xf, 0x9e, 0xf, + 0xc9, 0x10, 0x10, 0x10, 0x73, 0x10, 0x89, 0x10, 0xab, 0x10, 0xbd, 0x10, + 0xf4, 0x11, 0x88, 0x11, 0x9e, 0x12, 0x1d, 0x12, 0x5b, 0x12, 0x79, 0x12, + 0xa1, 0x12, 0xae, 0x12, 0xc6, 0x12, 0xec, 0x13, 0x1b, 0x13, 0x5f, 0x13, + 0x95, 0x14, 0x31, 0x14, 0x84, 0x14, 0xe3, 0x14, 0xfb, 0x15, 0x10, 0x15, + 0x61, 0x15, 0xb3, 0x15, 0xd1, 0x15, 0xed, 0x16, 0x11, 0x16, 0x2e, 0x16, + 0x4f, 0x16, 0x96, 0x16, 0xb8, 0x17, 0x37, 0x17, 0x77, 0x17, 0xd2, 0x17, + 0xf7, 0x18, 0xb, 0x18, 0x1e, 0x18, 0xa6, 0x19, 0x15, 0x19, 0x73, 0x19, + 0x96, 0x19, 0xda, 0x1a, 0x13, 0x1a, 0x35, 0x1a, 0x58, 0x1a, 0xdf, 0x1a, + 0xf1, 0x1b, 0x7, 0x1b, 0x5b, 0x1b, 0x71, 0x1b, 0x93, 0x1b, 0xa5, 0x1b, + 0xc1, 0x1c, 0x36, 0x1c, 0x82, 0x1c, 0x94, 0x1c, 0xa7, 0x1c, 0xc6, 0x1d, + 0x38, 0x1d, 0x70, 0x1d, 0x9f, 0x1d, 0xe4, 0x1e, 0x17, 0x1e, 0x6b, 0x1e, + 0x98, 0x1e, 0xf6, 0x1f, 0x2c, 0x1f, 0x41, 0x1f, 0x7b, 0x1f, 0xc1, 0x20, + 0x4a, 0x20, 0x5b, 0x20, 0x82, 0x20, 0xb1, 0x20, 0xe2, 0x21, 0x2, 0x21, + 0x23, 0x21, 0x67, 0x21, 0x7d, 0x21, 0x90, 0x21, 0xb5, 0x21, 0xcd, 0x21, + 0xf6, 0x22, 0x15, 0x22, 0x2d, 0x22, 0x85, 0x22, 0xc6, 0x23, 0xc, 0x23, + 0x25, 0x23, 0x4a, 0x23, 0xeb, 0x24, 0x2, 0x24, 0x36, 0x24, 0x91, 0x24, + 0xa6, 0x24, 0xb9, 0x25, 0xa, 0x25, 0x36, 0x25, 0x76, 0x25, 0xc8, 0x26, + 0x55, 0x26, 0xb1, 0x26, 0xf3, 0x27, 0xc, 0x27, 0x33, 0x27, 0x53, 0x27, + 0xd5, 0x28, 0x4, 0x28, 0x1d, 0x28, 0x41, 0x28, 0xac, 0x29, 0xf, 0x29, + 0x33, 0x29, 0x8f, 0x29, 0xca, 0x2a, 0x3f, 0x2a, 0x92, 0x2a, 0xe1, 0x2b, + 0xb, 0x2b, 0x3e, 0x2b, 0x71, 0x2b, 0xb3, 0x2b, 0xcc, 0x2b, 0xed, 0x2c, + 0x52, 0x2c, 0x77, 0x2c, 0xa7, 0x2d, 0x19, 0x2d, 0x66, 0x2d, 0xab, 0x2e, + 0x7, 0x2e, 0x1e, 0x2e, 0x26, 0x2e, 0x48, 0x2e, 0x50, 0x2e, 0x5e, 0x2e, + 0x6c, 0x2e, 0x7a, 0x2e, 0x90, 0x2e, 0xda, 0x2f, 0x66, 0x2f, 0x9f, 0x30, + 0xc, 0x30, 0x94, 0x31, 0x3a, 0x31, 0xe9, 0x32, 0x9, 0x32, 0x27, 0x32, + 0x79, 0x32, 0x90, 0x32, 0x91, 0x33, 0x25, 0x33, 0x63, 0x33, 0xbd, 0x34, + 0x1f, 0x34, 0xb8, 0x35, 0x15, 0x35, 0x56, 0x35, 0x9a, 0x35, 0xe0, 0x36, + 0x1f, 0x36, 0x64, 0x36, 0x7b, 0x36, 0x9b, 0x36, 0xcd, 0x36, 0xe4, 0x36, + 0xf4, 0x37, 0x25, 0x37, 0x65, 0x37, 0xb2, 0x37, 0xec, 0x38, 0x36, 0x38, + 0x8f, 0x38, 0xe7, 0x39, 0x10, 0x39, 0x5a, 0x39, 0xa7, 0xe, 0x8b, 0xc1, + 0xf7, 0x4, 0xc1, 0xf7, 0xb4, 0xc1, 0x1, 0x8e, 0xf7, 0x63, 0xab, 0xee, + 0xbf, 0xf7, 0x60, 0x3, 0x8e, 0x16, 0xf7, 0x63, 0xc1, 0x33, 0x6, 0xb6, + 0xf7, 0x4, 0x5, 0xf7, 0xaa, 0x6, 0xb7, 0xfb, 0x4, 0x5, 0x2d, 0x55, + 0xf7, 0x60, 0xc1, 0x56, 0x6, 0xfb, 0x5f, 0xf8, 0x90, 0x5, 0xfb, 0x81, + 0x55, 0xf7, 0x1e, 0x6, 0xfb, 0x46, 0xfc, 0x5a, 0x5, 0x4e, 0x6, 0xf7, + 0x4a, 0xf7, 0x3a, 0x15, 0xf7, 0x7, 0xf7, 0xba, 0xf7, 0xf, 0xfb, 0xba, + 0x5, 0xe, 0x8b, 0xc2, 0xf7, 0x3, 0xc2, 0xac, 0xc2, 0xf7, 0x5b, 0xc1, + 0x1, 0xdc, 0xc4, 0xf7, 0xa, 0xc3, 0x8b, 0xc2, 0xdc, 0xc1, 0x9c, 0xc2, + 0x3, 0xa5, 0x16, 0xf7, 0x5a, 0xc2, 0x35, 0x6, 0xb7, 0xf7, 0x3, 0x5, + 0xf7, 0x16, 0xfb, 0x3a, 0xf7, 0x9a, 0xf7, 0x2e, 0x54, 0x28, 0xfb, 0x2c, + 0xf7, 0x5b, 0xdc, 0x53, 0xc1, 0xf7, 0x3a, 0x55, 0x54, 0x3a, 0xf7, 0x5b, + 0xf7, 0x2c, 0x25, 0xc2, 0xf7, 0x30, 0xfc, 0x2c, 0x55, 0xe5, 0x6, 0xfb, + 0x43, 0xfc, 0x59, 0x5, 0x54, 0x6, 0xf7, 0x44, 0xf7, 0x3a, 0x15, 0xf7, + 0x2, 0xf7, 0xb2, 0x5, 0xfb, 0xb2, 0x7, 0xe, 0x4d, 0xa, 0xf7, 0x78, + 0x77, 0x1, 0x54, 0xa, 0x3, 0x8e, 0x16, 0x24, 0xa, 0xfb, 0x95, 0xf8, + 0x18, 0x15, 0xf7, 0xac, 0xf0, 0x6a, 0xd4, 0xfb, 0x96, 0xfb, 0x24, 0x5, + 0xe, 0x4d, 0xa, 0xf7, 0x2f, 0xc2, 0x1, 0x54, 0xa, 0x3, 0xf7, 0x2d, + 0xf8, 0xf1, 0x15, 0xf7, 0x26, 0xf7, 0x7, 0xf7, 0x22, 0xfb, 0x7, 0xb3, + 0x9d, 0xfb, 0x24, 0xf7, 0x2c, 0x5, 0x3d, 0x6, 0xfb, 0x25, 0xfb, 0x2c, + 0x5, 0xfb, 0x3, 0xfd, 0x3, 0x15, 0x24, 0xa, 0xe, 0x8b, 0xc1, 0xf7, + 0x11, 0xc1, 0xf7, 0xaa, 0xc1, 0xda, 0xf7, 0x9, 0x12, 0x8e, 0xf7, 0x63, + 0x73, 0xdc, 0xca, 0xdc, 0x79, 0xf7, 0x60, 0x13, 0xf6, 0xf7, 0xde, 0xf9, + 0x18, 0x72, 0xa, 0xfb, 0x24, 0xfb, 0x9, 0x72, 0xa, 0xfb, 0x4b, 0xfd, + 0x8d, 0x15, 0x2d, 0xa, 0x6, 0x13, 0xe9, 0x39, 0xa, 0xe, 0x4d, 0xa, + 0x12, 0x54, 0xa, 0x17, 0x8e, 0x16, 0x25, 0xa, 0x13, 0x40, 0xf7, 0x3, + 0xf7, 0xbb, 0xf7, 0xb, 0xfb, 0xbb, 0x5, 0xfb, 0x9f, 0xf8, 0x7d, 0x79, + 0xa, 0xf7, 0x24, 0x5, 0xe, 0x4d, 0xa, 0xb0, 0xbd, 0xdb, 0xbe, 0x12, + 0x8e, 0xf7, 0x63, 0x83, 0xbe, 0xdb, 0xc0, 0x92, 0xf7, 0x60, 0x13, 0xfb, + 0x80, 0xf7, 0x5e, 0xf9, 0x47, 0x15, 0x58, 0xb4, 0x65, 0xbe, 0xbe, 0xb4, + 0xb1, 0xbe, 0xbe, 0x62, 0xb4, 0x58, 0x58, 0x62, 0x62, 0x58, 0x1e, 0xbe, + 0x8c, 0x15, 0xa1, 0x9d, 0x9d, 0xa1, 0xa1, 0x9d, 0x79, 0x75, 0x75, 0x79, + 0x79, 0x75, 0x75, 0x79, 0x9d, 0xa1, 0x1e, 0x13, 0xfd, 0x80, 0xfb, 0x8e, + 0xfd, 0x48, 0x15, 0x24, 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0xb, 0xc1, 0xf7, + 0xa7, 0xc1, 0xdd, 0xbc, 0x1, 0x54, 0xa, 0x3, 0xf7, 0x31, 0xf9, 0x17, + 0x15, 0x9e, 0x93, 0x9e, 0xb4, 0xbc, 0x1b, 0xa1, 0x9d, 0x7e, 0x7c, 0xa0, + 0x1f, 0x79, 0xa4, 0xa7, 0x78, 0xb2, 0x1b, 0xcf, 0xad, 0xca, 0xb1, 0x96, + 0x1f, 0x58, 0x94, 0x5, 0x73, 0x83, 0x72, 0x66, 0x65, 0x1b, 0x75, 0x7a, + 0x9d, 0x9c, 0x75, 0x1f, 0x9a, 0x77, 0x72, 0x9a, 0x63, 0x1b, 0x52, 0x5b, + 0x5d, 0x56, 0x78, 0x1f, 0x23, 0xfd, 0x21, 0x15, 0x24, 0xa, 0xe, 0x8b, + 0xc1, 0xf7, 0x5b, 0xc2, 0xf7, 0x5c, 0xc1, 0x12, 0xf7, 0xb, 0xc2, 0xf7, + 0xb0, 0xc9, 0x74, 0xc8, 0x13, 0xf4, 0xb5, 0x16, 0xf7, 0xbd, 0x6, 0xf7, + 0x17, 0xe3, 0xb6, 0xf7, 0x0, 0xd8, 0x4b, 0xb5, 0x4b, 0x97, 0x1f, 0x13, + 0xf8, 0xc0, 0x9b, 0xb0, 0xc7, 0xc1, 0x1a, 0xf7, 0xb, 0x34, 0xaa, 0xfb, + 0xc, 0x1e, 0xfb, 0xa3, 0x55, 0xd8, 0xfc, 0x5a, 0x3e, 0x6, 0xf7, 0x18, + 0xf7, 0x8f, 0x15, 0xf7, 0x5f, 0x7, 0xf7, 0x2d, 0xf7, 0x17, 0x92, 0x24, + 0x32, 0x34, 0x79, 0x55, 0x1f, 0xfb, 0x23, 0xfb, 0x8f, 0x15, 0xf7, 0x58, + 0x7, 0x13, 0xf4, 0xf7, 0x5d, 0xf7, 0xe, 0x7c, 0x36, 0x37, 0x2e, 0x7f, + 0x4a, 0x1f, 0xe, 0x79, 0xc1, 0xf8, 0x7e, 0xc1, 0x1, 0xb9, 0xc3, 0xf8, + 0x13, 0xc1, 0x3, 0xf8, 0x9b, 0xf5, 0x15, 0x64, 0x56, 0x39, 0x6c, 0x47, + 0x1b, 0xfb, 0x9, 0x2a, 0xe9, 0xf7, 0x32, 0xf7, 0x3f, 0xf7, 0x1f, 0xce, + 0xd6, 0xcb, 0xd5, 0x64, 0x59, 0xaa, 0x1f, 0x31, 0xc1, 0xf7, 0x7d, 0x55, + 0x4e, 0x7, 0xbd, 0x56, 0x4c, 0x96, 0x56, 0x1b, 0xfb, 0x31, 0xfb, 0x5, + 0xfb, 0x1f, 0xfb, 0x2d, 0xfb, 0x39, 0xec, 0xfb, 0x21, 0xf7, 0x41, 0xda, + 0xe8, 0xa9, 0xb8, 0xc8, 0x1f, 0xe, 0xfb, 0x16, 0x76, 0xf7, 0x3f, 0xbf, + 0xf8, 0x5d, 0xbe, 0x1, 0xbd, 0xc4, 0xf8, 0x15, 0xc4, 0x3, 0xf7, 0x7c, + 0xfb, 0xb, 0x15, 0x83, 0x92, 0xa2, 0x73, 0xa7, 0x1b, 0xad, 0xb0, 0xa0, + 0xc5, 0xab, 0x7a, 0xa8, 0x6f, 0x94, 0x1f, 0x8d, 0xa1, 0x5, 0xe6, 0xd9, + 0xa3, 0xb5, 0xc9, 0x1f, 0x73, 0xbb, 0x5, 0x66, 0x55, 0x47, 0x72, 0x46, + 0x1b, 0xfb, 0x15, 0x29, 0xe1, 0xf7, 0x28, 0xf7, 0x43, 0xf7, 0x1f, 0xbb, + 0xd7, 0xcc, 0xc7, 0x6e, 0x5f, 0xb8, 0x1f, 0x35, 0xc4, 0xf7, 0x66, 0x52, + 0x52, 0x7, 0xbd, 0x43, 0x59, 0x92, 0x54, 0x1b, 0xfb, 0x33, 0x21, 0xfb, + 0x11, 0xfb, 0x24, 0xfb, 0x1e, 0xd4, 0xfb, 0xe, 0xf7, 0x28, 0x70, 0x1f, + 0x82, 0x42, 0x5, 0x8f, 0x94, 0x94, 0x8b, 0x94, 0x1b, 0x9a, 0x97, 0x7d, + 0x7f, 0x76, 0x7d, 0x81, 0x7c, 0x7d, 0x7b, 0x90, 0x9a, 0x82, 0x1f, 0xe, + 0x46, 0xa, 0xf7, 0x3, 0xc4, 0xf7, 0xe6, 0xc6, 0x3, 0xad, 0x16, 0xf7, + 0x7a, 0x6, 0xf7, 0x21, 0xf7, 0x34, 0xc4, 0xf7, 0x7b, 0xf7, 0x62, 0xfb, + 0x1c, 0xcf, 0xfb, 0x39, 0x1f, 0xfb, 0x7a, 0x54, 0xd8, 0xfc, 0x58, 0x3e, + 0x6, 0xf7, 0x1a, 0x16, 0xf8, 0x58, 0xeb, 0x7, 0xf7, 0x31, 0xe0, 0x47, + 0xfb, 0x2b, 0xfb, 0x35, 0x31, 0x43, 0xfb, 0x2c, 0x1f, 0xe, 0x8b, 0xc0, + 0xf7, 0x5c, 0xc1, 0xf7, 0x5d, 0xc1, 0x1, 0xf7, 0x1a, 0xc3, 0xf7, 0x7, + 0xc4, 0xef, 0xc3, 0x3, 0xbf, 0x16, 0xf8, 0x66, 0xf7, 0x4f, 0x53, 0xfb, + 0x1a, 0xfb, 0xa4, 0xf7, 0x5c, 0xf7, 0x7, 0x39, 0xc4, 0xf7, 0x6f, 0x52, + 0x38, 0xfb, 0x7, 0xf7, 0x5d, 0xf7, 0xa4, 0xfb, 0x1a, 0xc3, 0xf7, 0x50, + 0xfc, 0x66, 0x55, 0xdd, 0xfc, 0x5b, 0x39, 0x6, 0xe, 0x47, 0xa, 0xf7, + 0x58, 0xf8, 0xfe, 0x15, 0xf7, 0xb8, 0xf0, 0x69, 0xd5, 0xfb, 0xa3, 0xfb, + 0x25, 0x5, 0xfb, 0x18, 0xfd, 0x1c, 0x15, 0x2f, 0xa, 0xe, 0x4e, 0xa, + 0xf7, 0x7a, 0x77, 0x12, 0x61, 0xa, 0x17, 0xf7, 0x36, 0xf9, 0x5, 0x15, + 0x13, 0xfe, 0xf7, 0x2d, 0xf7, 0x7, 0xf7, 0x29, 0xfb, 0x7, 0xb5, 0x9d, + 0xfb, 0x2b, 0xf7, 0x2c, 0x5, 0x39, 0x6, 0xfb, 0x2b, 0xfb, 0x2b, 0x5, + 0x44, 0xfd, 0x18, 0x15, 0x2f, 0xa, 0xe, 0x4e, 0xa, 0xe5, 0xf7, 0x8, + 0x12, 0xf7, 0x1a, 0xc2, 0x93, 0xe0, 0xcb, 0xe1, 0x3c, 0xc4, 0xdd, 0xc3, + 0x13, 0xfe, 0x80, 0xf7, 0xee, 0xf9, 0x23, 0x15, 0xe1, 0xf7, 0x8, 0x35, + 0x6, 0xfb, 0x29, 0xfb, 0x8, 0x15, 0xe0, 0xf7, 0x8, 0x36, 0x6, 0xfb, + 0x26, 0xfd, 0x97, 0x15, 0x40, 0xa, 0x6, 0x13, 0xfd, 0x80, 0x2e, 0xa, + 0xe, 0x47, 0xa, 0xbe, 0x16, 0x2f, 0xa, 0xf8, 0x27, 0xf8, 0xc9, 0x15, + 0x96, 0xa9, 0xfb, 0xa4, 0xf7, 0x24, 0x69, 0x42, 0x5, 0xe, 0x8b, 0xc1, + 0xf7, 0x56, 0xc0, 0xf7, 0x63, 0xc1, 0x1, 0xf7, 0x1, 0xc3, 0xf7, 0xeb, + 0xcb, 0x3, 0xa7, 0x16, 0xf7, 0x8d, 0x6, 0xf7, 0x35, 0xf7, 0x1a, 0xc4, + 0xf7, 0x7f, 0xf7, 0x68, 0xfb, 0x33, 0xc5, 0xfb, 0x37, 0x1f, 0xfb, 0x72, + 0x55, 0xdc, 0xfb, 0x63, 0x3d, 0x56, 0xd9, 0xfb, 0x56, 0x3a, 0x6, 0xf7, + 0x1d, 0x16, 0xf7, 0x56, 0xf7, 0x4d, 0xc0, 0xfb, 0x4d, 0xf7, 0x63, 0xe0, + 0x7, 0xf7, 0x37, 0xea, 0x4c, 0xfb, 0x2d, 0xfb, 0x3b, 0x41, 0x44, 0xfb, + 0x31, 0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0x27, 0xbf, 0xc3, 0xc0, 0xf7, 0x2b, + 0xbe, 0x1, 0xd8, 0xc7, 0xf8, 0x25, 0xc6, 0x3, 0x8e, 0xf7, 0x57, 0x15, + 0xe0, 0x6, 0xfb, 0x9, 0xaa, 0xe8, 0x3d, 0xf7, 0x30, 0x1b, 0xde, 0xdc, + 0xa6, 0xb6, 0xcc, 0x1f, 0x71, 0xb8, 0x5, 0x65, 0x53, 0x44, 0x72, 0x44, + 0x1b, 0x20, 0x35, 0xb8, 0xed, 0x6b, 0x1f, 0xf7, 0x83, 0x6, 0xa1, 0xbf, + 0x5, 0xfb, 0xa4, 0x6, 0x9b, 0x89, 0xa7, 0x8d, 0x9b, 0x1e, 0xf7, 0xb7, + 0x6, 0x9f, 0xc0, 0x5, 0xfb, 0xc1, 0x6, 0xe4, 0xa4, 0xd8, 0xc9, 0xf0, + 0x1b, 0xd5, 0xd5, 0x73, 0x64, 0xb3, 0x1f, 0x3e, 0xc6, 0xf7, 0x53, 0x50, + 0x5a, 0x7, 0xac, 0x56, 0x54, 0x9b, 0x3e, 0x1b, 0xfb, 0x1f, 0x28, 0x33, + 0xfb, 0x6, 0x6e, 0x1f, 0x4e, 0x6, 0x75, 0x56, 0x5, 0xd5, 0x6, 0x70, + 0x8c, 0x75, 0x8c, 0x80, 0x1e, 0x55, 0x6, 0xe, 0x8b, 0xc2, 0xf7, 0x5f, + 0xc2, 0xf7, 0x56, 0xc2, 0x1, 0xf7, 0x18, 0xc2, 0xf7, 0x35, 0xc2, 0xe3, + 0xc2, 0x3, 0xc1, 0x16, 0xf7, 0x9c, 0xc2, 0xfb, 0x17, 0xf7, 0x5f, 0xf7, + 0x35, 0x38, 0xc2, 0xf7, 0x72, 0x54, 0x37, 0xfb, 0x35, 0xf7, 0x56, 0xf7, + 0xc4, 0xfb, 0x11, 0xc2, 0xf7, 0x48, 0xfc, 0x80, 0x54, 0xd9, 0xfc, 0x58, + 0x3d, 0x6, 0xe, 0x79, 0xc2, 0xf7, 0x39, 0xc2, 0xf7, 0xa0, 0xc2, 0x1, + 0xad, 0xc5, 0xf8, 0x12, 0xc2, 0x3, 0xf7, 0xcc, 0x7c, 0xa, 0x7b, 0x6a, + 0x48, 0x79, 0x54, 0x1b, 0xfb, 0x23, 0x37, 0xf7, 0x8, 0xf7, 0x12, 0xf7, + 0x44, 0xf7, 0x2, 0x43, 0xa, 0x23, 0xfb, 0x1d, 0xfb, 0x37, 0xfb, 0x21, + 0xdd, 0x53, 0xa, 0xe, 0x79, 0xc2, 0xf7, 0x3b, 0xc2, 0xf7, 0x9e, 0xc2, + 0x1, 0xa7, 0xc5, 0xf8, 0x11, 0xc2, 0x3, 0xf7, 0xc5, 0x7c, 0xa, 0x76, + 0x4b, 0x67, 0x7e, 0x54, 0x1b, 0xfb, 0x23, 0x38, 0xf7, 0x8, 0xf7, 0x12, + 0xf7, 0x44, 0xf7, 0x1, 0x43, 0xa, 0x24, 0xfb, 0x1d, 0xfb, 0x37, 0xfb, + 0x21, 0xdc, 0x53, 0xa, 0x68, 0xf8, 0x6, 0x37, 0xa, 0x8b, 0xc2, 0xf7, + 0x5a, 0xc2, 0xf7, 0x5b, 0xc2, 0x1, 0xf7, 0x1, 0xc1, 0xf7, 0xa6, 0xc1, + 0x3, 0xab, 0x16, 0xf7, 0x70, 0xc2, 0x32, 0xf7, 0x5a, 0xf7, 0xa6, 0xfb, + 0x5a, 0x33, 0x54, 0xf7, 0x6f, 0xc2, 0x3e, 0xf8, 0x58, 0xd8, 0xc2, 0xfb, + 0x65, 0x54, 0xd9, 0xfb, 0x5b, 0xfb, 0xa6, 0xf7, 0x5b, 0xda, 0xc2, 0xfb, + 0x66, 0x54, 0xd8, 0xfc, 0x58, 0x3e, 0x6, 0xe, 0x46, 0xa, 0xf7, 0xa3, + 0xc2, 0x3, 0xeb, 0x16, 0xf8, 0x2c, 0xc2, 0xfb, 0x46, 0xf8, 0x58, 0xf7, + 0x38, 0xc2, 0xfc, 0x11, 0x54, 0xf7, 0x36, 0xfc, 0x58, 0xfb, 0x43, 0x6, + 0xe, 0x79, 0xc3, 0xf8, 0x68, 0xc3, 0x1, 0xec, 0xc5, 0xf7, 0xd, 0xc2, + 0xf7, 0x22, 0xc4, 0x3, 0xa3, 0x79, 0x15, 0xf7, 0x62, 0xc3, 0x40, 0xf8, + 0x68, 0xd1, 0xc3, 0xfb, 0x5c, 0x53, 0xd3, 0xfc, 0x68, 0x42, 0x6, 0xf7, + 0x90, 0xa0, 0x15, 0x85, 0x8c, 0xaa, 0x44, 0xf1, 0x1b, 0xf7, 0xb, 0x8c, + 0xf7, 0x24, 0xc2, 0x1f, 0x8c, 0xf7, 0xda, 0x5, 0xb7, 0xc2, 0xfb, 0x4c, + 0x54, 0xde, 0x6, 0x8a, 0xfb, 0xd9, 0x5, 0x6f, 0x8e, 0xfb, 0xc, 0x45, + 0x71, 0x5a, 0x95, 0x7f, 0xa, 0x6c, 0xa, 0x1, 0xf7, 0xa3, 0xc5, 0x3, + 0xf7, 0x48, 0xf8, 0xfe, 0x15, 0xf7, 0xc7, 0xf2, 0x68, 0xd3, 0xfb, 0xb1, + 0xfb, 0x25, 0x5, 0x44, 0xfd, 0x1c, 0x15, 0x32, 0xa, 0xe, 0x6c, 0xa, + 0x1, 0xf7, 0xa3, 0xc5, 0x3, 0xf7, 0x25, 0xf8, 0xfb, 0x15, 0xf7, 0x2e, + 0xf7, 0x7, 0xf7, 0x30, 0xfb, 0x7, 0xb7, 0x9d, 0xfb, 0x31, 0xf7, 0x2c, + 0x5, 0x35, 0x6, 0xfb, 0x2f, 0xfb, 0x2c, 0x5, 0x86, 0xfd, 0xd, 0x15, + 0x32, 0xa, 0xe, 0x6c, 0xa, 0xe3, 0xf7, 0x8, 0x1, 0xf7, 0xa3, 0xc5, + 0x3, 0xf7, 0xe6, 0xf9, 0x20, 0x76, 0xa, 0xfb, 0x31, 0xfb, 0x8, 0x76, + 0xa, 0x36, 0xfd, 0x94, 0x15, 0x32, 0xa, 0xe, 0x8b, 0xc1, 0xf8, 0x5e, + 0xc1, 0xcd, 0xf7, 0x8, 0x12, 0xf7, 0x95, 0xe5, 0x3f, 0xc5, 0x13, 0xe8, + 0xeb, 0x16, 0xf8, 0x2c, 0xc1, 0xfb, 0x43, 0xf8, 0x5e, 0x42, 0xa, 0xfc, + 0x5e, 0xfb, 0x43, 0x6, 0x13, 0xf0, 0xf7, 0x35, 0xf8, 0xd6, 0x76, 0xa, + 0xe, 0x6c, 0xa, 0x1, 0x8b, 0xa0, 0xf7, 0x8e, 0xc5, 0x3, 0xeb, 0x16, + 0x32, 0xa, 0xb9, 0xf9, 0x2d, 0x15, 0xf7, 0xc8, 0x26, 0x97, 0xa9, 0xfb, + 0xaf, 0xf7, 0x25, 0x5, 0xe, 0x79, 0xba, 0xf8, 0x72, 0xc2, 0x1, 0xb7, + 0xc2, 0xf7, 0xa2, 0xc0, 0x3, 0xb7, 0xca, 0x15, 0x4c, 0xc8, 0xd7, 0x79, + 0xd0, 0x1b, 0xf7, 0x31, 0x9a, 0xf4, 0xe9, 0x1f, 0xf7, 0xda, 0xf7, 0x1a, + 0xc2, 0xfc, 0x15, 0x54, 0xf7, 0x5a, 0xfb, 0xd9, 0x7, 0x36, 0x80, 0x47, + 0xfb, 0x6, 0x50, 0x35, 0x9a, 0x7f, 0xa, 0x8b, 0xc1, 0xf8, 0x59, 0xc2, + 0x1, 0xf6, 0xc0, 0xf7, 0x47, 0xf7, 0x59, 0x3, 0xa7, 0x16, 0xf7, 0x71, + 0xc1, 0x32, 0xf7, 0x38, 0x6, 0xdd, 0xdd, 0xe6, 0xfb, 0xa, 0xbd, 0x2d, + 0xb6, 0x33, 0x19, 0xf7, 0x26, 0xc1, 0xfb, 0x6, 0x6, 0x5e, 0xea, 0x4c, + 0xf0, 0x44, 0xde, 0xf7, 0x4d, 0xf7, 0x42, 0x18, 0xd3, 0xc2, 0xfb, 0x59, + 0x54, 0xc5, 0x6, 0xfb, 0x81, 0xfb, 0x73, 0x5, 0xf7, 0x73, 0xd9, 0xc2, + 0xfb, 0x66, 0x54, 0xda, 0xfc, 0x59, 0x3c, 0x7, 0xe, 0x46, 0xa, 0xf7, + 0x2c, 0xc2, 0xf7, 0xb7, 0xc2, 0x3, 0xb9, 0x16, 0xf8, 0x8f, 0xf7, 0x8b, + 0x54, 0xfb, 0x54, 0xfb, 0xb7, 0xf8, 0x58, 0xf7, 0x11, 0xc2, 0xfb, 0xb2, + 0x54, 0xf5, 0xfc, 0x58, 0x21, 0x6, 0xe, 0x75, 0xa, 0xf7, 0x2d, 0xc3, + 0xf7, 0xb4, 0xc3, 0x3, 0xb9, 0x16, 0xf8, 0x8f, 0xf7, 0x91, 0x53, 0xfb, + 0x5b, 0xfb, 0xb4, 0xf7, 0x4e, 0x6, 0xf7, 0x43, 0xd1, 0x5, 0xc2, 0x7, + 0xfb, 0x43, 0x44, 0x5, 0xf7, 0x6a, 0xf7, 0x12, 0xc1, 0xfb, 0xb5, 0x55, + 0xf6, 0xfb, 0x80, 0x7, 0x37, 0x69, 0x5, 0x55, 0x7, 0xdf, 0xad, 0x5, + 0xfb, 0x38, 0x20, 0x7, 0xe, 0x46, 0xa, 0xd1, 0xc3, 0xf7, 0xf2, 0xc3, + 0x3, 0xa0, 0x16, 0xf7, 0x3a, 0xc2, 0x4e, 0xf8, 0x58, 0x93, 0x6, 0xf7, + 0x26, 0xfc, 0xe, 0x5, 0xb6, 0x6, 0xf7, 0x23, 0xf8, 0xe, 0x5, 0x95, + 0xfc, 0x58, 0x52, 0x54, 0xf7, 0x34, 0xc2, 0x5c, 0xf8, 0x58, 0xb9, 0xc2, + 0xfb, 0x25, 0x6, 0xfb, 0x16, 0xfb, 0xeb, 0xfb, 0x19, 0xf7, 0xeb, 0x5, + 0xfb, 0x29, 0x54, 0xbc, 0xfc, 0x58, 0x5a, 0x6, 0xe, 0x46, 0xa, 0xe4, + 0xc4, 0xf7, 0xcd, 0xc3, 0x3, 0x92, 0x16, 0xf7, 0x8d, 0xc2, 0xfb, 0x2, + 0xf8, 0x41, 0x6, 0xf7, 0xba, 0xfc, 0x78, 0x5, 0xd6, 0xf8, 0x8f, 0xd9, + 0xc2, 0xfb, 0x93, 0x54, 0xf7, 0xd, 0xfc, 0x44, 0x6, 0xfb, 0xb9, 0xf8, + 0x7b, 0x5, 0xfb, 0x33, 0x54, 0xdd, 0xfc, 0x58, 0x39, 0x6, 0xe, 0x8c, + 0xbf, 0xf8, 0x5b, 0xc0, 0xd7, 0xbf, 0x99, 0xbc, 0x1, 0xe4, 0xc4, 0xf7, + 0xcd, 0xc3, 0x3, 0x92, 0x8c, 0x15, 0xf7, 0x8d, 0xbf, 0xfb, 0x2, 0xf8, + 0x45, 0x6, 0xf7, 0xba, 0xfc, 0x79, 0x5, 0xd6, 0xf8, 0x8f, 0xd9, 0xc0, + 0xfb, 0x88, 0x56, 0xf7, 0x2, 0xfc, 0x47, 0x6, 0xfb, 0xb9, 0xf8, 0x7c, + 0x5, 0xfb, 0x33, 0x56, 0xdd, 0xfc, 0x5b, 0x39, 0x6, 0xf7, 0x2e, 0xf8, + 0xe0, 0x15, 0x9f, 0x93, 0x9f, 0xb5, 0xbd, 0x1b, 0xa5, 0xa1, 0x78, 0x79, + 0xa4, 0x1f, 0x7a, 0xa3, 0xa5, 0x7f, 0xaf, 0x1b, 0xd2, 0xae, 0xca, 0xb3, + 0x96, 0x1f, 0x57, 0x94, 0x5, 0x72, 0x81, 0x72, 0x68, 0x64, 0x1b, 0x71, + 0x7b, 0x9c, 0x9e, 0x71, 0x1f, 0x99, 0x77, 0x72, 0x98, 0x64, 0x1b, 0x50, + 0x59, 0x5d, 0x55, 0x78, 0x1f, 0xe, 0x79, 0xc2, 0xf8, 0x7c, 0xc2, 0x1, + 0xb6, 0xc2, 0xf8, 0x22, 0xc8, 0x3, 0xb6, 0xf7, 0xa7, 0x15, 0xfb, 0x38, + 0xeb, 0xfb, 0x15, 0xf7, 0x32, 0xf7, 0x36, 0xed, 0xf7, 0x12, 0xf7, 0x3b, + 0xf7, 0x16, 0x4b, 0xf7, 0x43, 0xfb, 0x57, 0xfb, 0x45, 0x3d, 0xfb, 0x38, + 0xfb, 0x21, 0x1e, 0xc2, 0x16, 0xee, 0xb9, 0xf7, 0x2b, 0xf7, 0x2d, 0xf7, + 0x2d, 0xb9, 0xfb, 0x2e, 0x2b, 0xfb, 0x1e, 0x3d, 0x27, 0xfb, 0xd, 0xfb, + 0x9, 0x39, 0xec, 0xf7, 0x21, 0x1e, 0xe, 0x87, 0xc1, 0xf7, 0x4f, 0xc2, + 0xf7, 0x6c, 0xc1, 0x12, 0x9f, 0xc3, 0xf7, 0x81, 0xc3, 0xd2, 0xc2, 0xa8, + 0xc3, 0x17, 0xf8, 0x5, 0xbd, 0x15, 0xf7, 0x60, 0xd2, 0x4a, 0xc2, 0xf7, + 0x4c, 0x54, 0x4b, 0x44, 0xf7, 0x5b, 0x7, 0x13, 0xfa, 0xf7, 0x2f, 0x27, + 0xc3, 0xf7, 0x2e, 0xfb, 0xac, 0x6, 0xfb, 0x64, 0x43, 0xfb, 0x1a, 0xfb, + 0x2b, 0xfb, 0x1d, 0xd3, 0xfb, 0x24, 0xf7, 0x56, 0x1f, 0xf7, 0xba, 0xf7, + 0x32, 0x53, 0x23, 0x6, 0xfb, 0x67, 0x16, 0xfb, 0x1a, 0x87, 0x24, 0xd3, + 0xf7, 0x34, 0x1a, 0xf7, 0x3e, 0xf2, 0xcd, 0xf7, 0x1a, 0x85, 0x1e, 0xe, + 0x64, 0xa, 0xf7, 0x6d, 0x77, 0x57, 0xa, 0xf7, 0x51, 0xf8, 0xfe, 0x15, + 0xf7, 0xb0, 0xf0, 0x6a, 0xd5, 0xfb, 0x9b, 0xfb, 0x25, 0x5, 0xfb, 0x1a, + 0xfc, 0x5, 0x20, 0xa, 0xe, 0x64, 0xa, 0xd1, 0x76, 0x57, 0xa, 0xf7, + 0x32, 0xf9, 0x5, 0x49, 0xa, 0x41, 0xfb, 0xff, 0x20, 0xa, 0xe, 0x64, + 0xa, 0xcf, 0xf7, 0x9, 0x1, 0xb6, 0xc1, 0xe9, 0xde, 0xca, 0xde, 0xdc, + 0xc3, 0x3, 0xf7, 0xe5, 0xf9, 0x18, 0x62, 0xa, 0xfb, 0x26, 0xfb, 0x9, + 0x62, 0xa, 0xfb, 0x28, 0xfc, 0x76, 0x20, 0xa, 0xe, 0x64, 0xa, 0xf7, + 0x49, 0x77, 0x57, 0xa, 0xb6, 0xf7, 0xab, 0x20, 0xa, 0xc6, 0xf8, 0x2f, + 0x15, 0xf7, 0xb0, 0x45, 0x96, 0xa9, 0xfb, 0x9a, 0xf7, 0x1, 0x5, 0xe, + 0x7a, 0x76, 0xa5, 0xc2, 0xf8, 0x7b, 0xc2, 0x9c, 0x77, 0x12, 0xb2, 0xc2, + 0xf8, 0x2d, 0xc4, 0x13, 0xdc, 0xc1, 0x85, 0x15, 0xb6, 0x6b, 0xc2, 0xd6, + 0x5, 0x6c, 0xb4, 0xbe, 0x79, 0xc5, 0x1b, 0xf7, 0x36, 0xeb, 0xf7, 0x1b, + 0xf7, 0x38, 0xbf, 0x7c, 0xe1, 0x5a, 0xcd, 0x1f, 0xc5, 0xd9, 0x60, 0xac, + 0x56, 0x44, 0x5, 0x13, 0xec, 0xab, 0x65, 0x59, 0xa1, 0x48, 0x1b, 0xfb, + 0x45, 0x34, 0xfb, 0x31, 0xfb, 0x21, 0x38, 0xa5, 0x3f, 0xba, 0x55, 0x1f, + 0xd4, 0x93, 0x15, 0xf7, 0xa8, 0xf7, 0xff, 0x5, 0xad, 0x56, 0x93, 0x49, + 0x62, 0x1a, 0xfb, 0x13, 0x46, 0xfb, 0x7, 0xfb, 0x17, 0x5d, 0x63, 0x9a, + 0xa3, 0x6b, 0x1e, 0x65, 0xb1, 0x15, 0x69, 0xb7, 0x78, 0xc6, 0xc9, 0x1a, + 0xe4, 0xc0, 0xf7, 0x30, 0xf7, 0x2e, 0xc0, 0xb3, 0x7a, 0x71, 0xa9, 0x1e, + 0xe, 0x64, 0xa, 0xcc, 0xbc, 0x98, 0xbc, 0x57, 0xa, 0xf7, 0x3c, 0xf9, + 0x15, 0x15, 0x9f, 0x92, 0x9e, 0xb5, 0xbc, 0x1b, 0xa9, 0x9f, 0x7c, 0x79, + 0xa1, 0x1f, 0x7b, 0xa0, 0xa2, 0x7e, 0xb0, 0x1b, 0xcf, 0xad, 0xc6, 0xb2, + 0x96, 0x1f, 0x58, 0x94, 0x5, 0x73, 0x82, 0x75, 0x69, 0x65, 0x1b, 0x73, + 0x7b, 0x9a, 0x9d, 0x75, 0x1f, 0x9a, 0x78, 0x72, 0x99, 0x61, 0x1b, 0x52, + 0x5b, 0x52, 0x55, 0x78, 0x1f, 0x41, 0xfb, 0xfe, 0x20, 0xa, 0xe, 0x8b, + 0xc2, 0xf7, 0x1c, 0xc1, 0xf7, 0x9b, 0xc1, 0x1, 0xf7, 0x1e, 0xc2, 0xf7, + 0xb7, 0xc2, 0x3, 0xc7, 0x16, 0xf7, 0xb2, 0xc2, 0xfb, 0x2d, 0xf7, 0x1c, + 0xf7, 0x1a, 0x6, 0xf7, 0x5, 0xee, 0xca, 0xf7, 0xe, 0xe1, 0x50, 0xef, + 0xfb, 0x2c, 0x1f, 0xfb, 0xa0, 0x55, 0xd9, 0xfc, 0x59, 0x3d, 0x6, 0xf7, + 0x19, 0xf7, 0x52, 0x15, 0xf7, 0x9b, 0xf7, 0x18, 0x7, 0xdb, 0xda, 0x6a, + 0x28, 0x27, 0x37, 0x6c, 0x42, 0x1f, 0xe, 0xfb, 0x9, 0x76, 0xb6, 0xf7, + 0x11, 0x56, 0xc0, 0xf8, 0x86, 0xbf, 0x12, 0xb6, 0xc2, 0xf8, 0x26, 0xc4, + 0x13, 0xdc, 0xf7, 0x16, 0x31, 0x15, 0xa0, 0x5e, 0x5, 0xa3, 0xb8, 0xaf, + 0x9b, 0xb9, 0x1b, 0xaa, 0xa6, 0x7f, 0x80, 0xa4, 0x1f, 0x81, 0xa2, 0xa5, + 0x81, 0xb0, 0x1b, 0xae, 0xae, 0x98, 0xa1, 0xa5, 0x1f, 0x76, 0xb8, 0x5, + 0x7d, 0x76, 0x71, 0x81, 0x72, 0x1b, 0x72, 0x74, 0x95, 0x95, 0x73, 0x1f, + 0x96, 0x72, 0x71, 0x95, 0x6e, 0x1b, 0x7c, 0x7c, 0x86, 0x89, 0x7c, 0x1f, + 0x13, 0xbc, 0x99, 0x92, 0x97, 0x92, 0x97, 0x96, 0x8, 0xf7, 0x2a, 0xf7, + 0x8, 0xf7, 0xc, 0xf7, 0x42, 0xf7, 0x32, 0x3f, 0xf7, 0x2b, 0xfb, 0x4a, + 0xfb, 0x33, 0x2a, 0xfb, 0x2a, 0xfb, 0x33, 0xfb, 0x24, 0xcf, 0xfb, 0x0, + 0xf7, 0x10, 0x66, 0x1f, 0x70, 0x70, 0x5f, 0x70, 0x69, 0x79, 0x8, 0x6b, + 0xf7, 0xfd, 0x15, 0xf7, 0x16, 0xe0, 0xf7, 0x13, 0xf7, 0x7, 0xf7, 0x13, + 0xd6, 0xfb, 0xf, 0xfb, 0x1a, 0xfb, 0x4a, 0xfb, 0x1d, 0x50, 0x49, 0x48, + 0xfb, 0x18, 0xc1, 0xf7, 0x4f, 0x1e, 0xe, 0x8b, 0xc2, 0xf7, 0x55, 0xc2, + 0xf7, 0x60, 0xc2, 0x1, 0xf5, 0xc2, 0xf7, 0xac, 0xc2, 0x3, 0xa4, 0x16, + 0xf7, 0x6e, 0xc2, 0x39, 0xf7, 0x55, 0xf7, 0x8, 0x6, 0xb2, 0x5c, 0xe4, + 0xfb, 0x19, 0xb2, 0x47, 0x8, 0xf7, 0x17, 0xc2, 0x24, 0x6, 0x6a, 0xc1, + 0x4f, 0xe8, 0x63, 0xbb, 0x8, 0xce, 0x90, 0xe5, 0xab, 0xf7, 0xc, 0x1a, + 0xdf, 0x5b, 0xd2, 0xfb, 0xe, 0x1e, 0xfb, 0xc1, 0x54, 0xdc, 0xfc, 0x58, + 0x3a, 0x6, 0xf7, 0x1c, 0xf7, 0x8c, 0x15, 0xf7, 0x60, 0xf7, 0x26, 0x7, + 0xd2, 0xca, 0x74, 0x3c, 0x20, 0x24, 0x90, 0x41, 0x1f, 0x69, 0x68, 0x8b, + 0x69, 0x1b, 0xe, 0x77, 0xbf, 0x76, 0x76, 0xf8, 0xae, 0xbf, 0x7e, 0x77, + 0x12, 0xd3, 0xc2, 0x6e, 0xc1, 0xf7, 0xc2, 0xc1, 0x67, 0xc2, 0x13, 0x6a, + 0xd3, 0x81, 0x15, 0xc2, 0xb3, 0x6, 0x13, 0xa5, 0x60, 0xc9, 0xd8, 0x84, + 0xb9, 0x1b, 0xf7, 0x4, 0xf2, 0xc1, 0xf7, 0x9, 0xf7, 0xd, 0xfb, 0x2, + 0x9a, 0x28, 0x9a, 0x1f, 0x42, 0x97, 0x2e, 0xaa, 0xd8, 0x1a, 0xcb, 0xcc, + 0xb5, 0xe5, 0x1e, 0x13, 0x9a, 0xbf, 0xc6, 0x75, 0x68, 0xaf, 0x1f, 0x32, + 0xc1, 0xf7, 0x4d, 0x55, 0x6d, 0x7, 0x13, 0xa5, 0xa7, 0x64, 0x50, 0x9a, + 0x57, 0x1b, 0xfb, 0x23, 0x4c, 0x3a, 0x37, 0xfb, 0xe, 0xf7, 0x14, 0x67, + 0xdf, 0x80, 0x1f, 0xdd, 0x80, 0xdb, 0x80, 0x3a, 0x1a, 0x4a, 0x4a, 0x5d, + 0x23, 0x1e, 0x13, 0x6a, 0x4c, 0x4b, 0x9f, 0xb3, 0x5a, 0x1f, 0xd9, 0x54, + 0x7, 0xe, 0x77, 0xc3, 0x73, 0x76, 0xf8, 0xac, 0xc3, 0x7f, 0x77, 0xab, + 0xb7, 0xf7, 0x46, 0x77, 0x12, 0xd2, 0xc3, 0x6d, 0xc2, 0xf7, 0xc1, 0xc2, + 0x62, 0xc8, 0x13, 0x6e, 0x80, 0xd2, 0x82, 0x15, 0xc3, 0xbe, 0x6, 0x13, + 0xad, 0x40, 0x5f, 0xca, 0xd9, 0x79, 0xba, 0x1b, 0xf7, 0x5, 0xef, 0xc2, + 0xf7, 0xa, 0xf7, 0x9, 0xfb, 0xe, 0x9b, 0x2e, 0x95, 0x1f, 0x44, 0x93, + 0x31, 0x9e, 0xe4, 0x1a, 0xcc, 0xcd, 0xbd, 0xe7, 0x1e, 0x13, 0x9e, 0x80, + 0xbf, 0xc1, 0x6f, 0x67, 0xb0, 0x1f, 0x3b, 0xc2, 0xf7, 0x50, 0x54, 0x62, + 0x7, 0x13, 0xad, 0x40, 0xa8, 0x63, 0x55, 0xa3, 0x57, 0x1b, 0xfb, 0x26, + 0x4b, 0x28, 0x36, 0xfb, 0x11, 0xf7, 0x1c, 0x73, 0xe2, 0x82, 0x1f, 0xd8, + 0x83, 0xd1, 0x7e, 0x3f, 0x1a, 0x49, 0x53, 0x61, 0x22, 0x1e, 0x13, 0x6e, + 0x80, 0x4b, 0x4a, 0xa7, 0xb4, 0x59, 0x1f, 0xd0, 0x53, 0x7, 0xf7, 0x5d, + 0xf8, 0x59, 0x37, 0xa, 0xfb, 0x16, 0x76, 0xf7, 0x47, 0xca, 0xf7, 0x48, + 0xc9, 0xf7, 0x49, 0xcd, 0x12, 0xd2, 0xc6, 0x57, 0xc5, 0xf7, 0x1e, 0xef, + 0xd1, 0xc6, 0x63, 0xcc, 0x13, 0xfa, 0x80, 0xd2, 0xa7, 0x15, 0xc6, 0xcd, + 0x6, 0xb6, 0x73, 0xb5, 0x6e, 0xc8, 0x81, 0x88, 0x3f, 0x18, 0x8e, 0x92, + 0x95, 0x8c, 0x94, 0x1b, 0x99, 0x98, 0x7f, 0x7a, 0x77, 0x7a, 0x80, 0x78, + 0x7e, 0x7d, 0x90, 0x95, 0x81, 0x1f, 0x7c, 0x60, 0x5, 0x7c, 0x9c, 0xa2, + 0x84, 0x9e, 0x1b, 0xb4, 0xaf, 0xb2, 0xbd, 0xb5, 0x72, 0xa2, 0x77, 0x8d, + 0x1f, 0xa2, 0x7, 0xf7, 0x9, 0x8d, 0xdd, 0xce, 0xf2, 0x1a, 0xe5, 0x3f, + 0xb1, 0x3f, 0x90, 0x1e, 0x13, 0xf7, 0x0, 0x40, 0x92, 0xfb, 0x39, 0x7a, + 0xf2, 0x1a, 0xd6, 0xec, 0x98, 0xba, 0xc7, 0xc5, 0x6b, 0x6a, 0xb9, 0x1e, + 0x51, 0xc6, 0xf7, 0x51, 0x50, 0x4f, 0x7, 0xac, 0x5a, 0x52, 0xa6, 0x4d, + 0x1b, 0xfb, 0xb, 0x3c, 0x4d, 0x24, 0xfb, 0x22, 0xf7, 0x42, 0x8d, 0xe3, + 0x87, 0x1f, 0x13, 0xfa, 0x80, 0xbf, 0x89, 0xd2, 0x86, 0x43, 0x1a, 0x33, + 0xfb, 0x5, 0x7e, 0x63, 0x46, 0x50, 0xb1, 0xb7, 0x57, 0x1e, 0xc6, 0x50, + 0x7, 0xe, 0x8b, 0xc2, 0xf7, 0xd3, 0xf7, 0x50, 0x54, 0xc2, 0x12, 0xb0, + 0xc3, 0xf7, 0x46, 0xc3, 0xf7, 0x47, 0xc3, 0x13, 0xbc, 0xf7, 0x26, 0x16, + 0xf7, 0xc6, 0xc2, 0xfb, 0x11, 0xf8, 0x58, 0xf7, 0x47, 0x6, 0x13, 0xdc, + 0xfb, 0x19, 0xc3, 0xf7, 0x50, 0xfc, 0xa1, 0xfb, 0x50, 0xc3, 0x7, 0x13, + 0xbc, 0xf7, 0x19, 0xf7, 0x46, 0xfc, 0x58, 0xfb, 0x11, 0x7, 0xe, 0x8b, + 0xc1, 0xf5, 0xc1, 0xf7, 0x42, 0xc1, 0xf7, 0x12, 0xc1, 0x1, 0xf7, 0x40, + 0xbc, 0xf7, 0x95, 0xbe, 0x3, 0xf7, 0xf9, 0x16, 0xc1, 0xfb, 0x1c, 0xf5, + 0xf7, 0x1a, 0x7, 0xf7, 0x15, 0xb8, 0xc5, 0xde, 0xe6, 0x5f, 0xbd, 0xfb, + 0x18, 0x1f, 0xfb, 0x18, 0xf7, 0x12, 0xee, 0xc1, 0xfb, 0x8e, 0x55, 0xf1, + 0xfc, 0x96, 0x25, 0x55, 0x6, 0xf7, 0x2b, 0xf8, 0x18, 0x15, 0xf7, 0x18, + 0x6, 0xaf, 0xa9, 0x85, 0x80, 0xa2, 0x1f, 0xa3, 0x80, 0x97, 0x73, 0x66, + 0x1a, 0x68, 0x7f, 0x74, 0x73, 0x80, 0x1e, 0x80, 0x74, 0x6e, 0x86, 0x68, + 0x1b, 0xfb, 0x1a, 0x6, 0xe, 0x79, 0xbe, 0xf8, 0x6e, 0xc2, 0x1, 0xec, + 0xbf, 0xf7, 0xc5, 0xbf, 0x3, 0x9c, 0xf8, 0x8f, 0x15, 0xdb, 0xfb, 0xd1, + 0x6, 0xfb, 0x17, 0xc1, 0x3e, 0xf7, 0x2c, 0xf7, 0x12, 0xd8, 0xd4, 0xf7, + 0x1b, 0x1e, 0xf7, 0xd1, 0xd8, 0xc2, 0xfb, 0x7c, 0x54, 0xf2, 0xfb, 0xd1, + 0x7, 0xfb, 0xf, 0x42, 0x69, 0x3c, 0x21, 0x5c, 0xb8, 0xf7, 0x4, 0x1e, + 0xf7, 0xd1, 0xf5, 0xc2, 0xfb, 0x82, 0x7, 0xe, 0x6b, 0xa, 0xf7, 0x7a, + 0x77, 0x55, 0xa, 0xf7, 0x52, 0xf8, 0xfe, 0x15, 0xf7, 0xab, 0xf0, 0x6b, + 0xd5, 0xfb, 0x97, 0xfb, 0x25, 0x5, 0xfb, 0x35, 0xfb, 0x20, 0x34, 0xa, + 0xe, 0x6b, 0xa, 0x5b, 0xa, 0xfb, 0x14, 0xd5, 0x2a, 0x30, 0xa, 0xf7, + 0x21, 0xc9, 0x49, 0xa, 0xe, 0x6b, 0xa, 0xf7, 0x10, 0xf7, 0x9, 0x5b, + 0xa, 0xfb, 0x1b, 0xcf, 0x31, 0xf7, 0x1f, 0x31, 0xa, 0xbf, 0xf7, 0xc, + 0x4f, 0xa, 0xf7, 0xd0, 0xdc, 0x62, 0xa, 0xfb, 0x22, 0xfb, 0x9, 0x62, + 0xa, 0xe, 0x6b, 0xa, 0xf7, 0x7a, 0x77, 0x1, 0xeb, 0xbf, 0xf7, 0xc6, + 0xbf, 0x3, 0x9c, 0xf8, 0x90, 0x34, 0xa, 0xf7, 0x1e, 0xf7, 0x30, 0x79, + 0xa, 0xf7, 0x25, 0x5, 0xe, 0x93, 0x76, 0xf8, 0x9c, 0xc2, 0x1, 0x87, + 0xf7, 0x77, 0xf7, 0x31, 0xf7, 0x74, 0x3, 0xf7, 0x9b, 0x7e, 0x15, 0xd4, + 0x6, 0xf7, 0x5c, 0xf8, 0x9c, 0x5, 0xcf, 0xc2, 0xfb, 0x74, 0x54, 0xeb, + 0x6, 0xfb, 0x45, 0xfc, 0x61, 0xfb, 0x43, 0xf8, 0x61, 0x5, 0xee, 0xc2, + 0xfb, 0x77, 0x54, 0xcb, 0x6, 0xe, 0x96, 0x76, 0xf8, 0x63, 0x77, 0xd5, + 0xc2, 0x1, 0x9f, 0xf7, 0x5a, 0xf7, 0x37, 0xf7, 0x5b, 0x3, 0xf7, 0x10, + 0x81, 0x15, 0xca, 0x6, 0xf7, 0x5, 0xf7, 0xfd, 0xf7, 0xa, 0xfb, 0xfd, + 0x5, 0xc8, 0x6, 0xc4, 0xf8, 0x99, 0x5, 0xb7, 0xc2, 0xfb, 0x5b, 0x54, + 0xee, 0x6, 0x63, 0xfc, 0x36, 0xfb, 0xa, 0xf8, 0x0, 0x5, 0x62, 0x6, + 0xfb, 0x8, 0xfc, 0x2, 0x5e, 0xf8, 0x38, 0x5, 0xed, 0xc2, 0xfb, 0x5a, + 0x54, 0xb9, 0x6, 0xe, 0x46, 0xa, 0xa2, 0x16, 0xf7, 0x7e, 0xc2, 0x22, + 0x6, 0xf7, 0x2a, 0xf7, 0x58, 0xf7, 0x26, 0xfb, 0x58, 0x5, 0x2d, 0x54, + 0xf7, 0x73, 0xc2, 0x4a, 0x6, 0xfb, 0x46, 0xf7, 0x84, 0xf7, 0x32, 0xf7, + 0x68, 0x5, 0xcd, 0xc2, 0xfb, 0x53, 0x54, 0xc8, 0x6, 0xfb, 0x13, 0xfb, + 0x3f, 0xfb, 0x14, 0xf7, 0x3f, 0x5, 0xcf, 0xc2, 0xfb, 0x5a, 0x54, 0xce, + 0x6, 0xf7, 0x32, 0xfb, 0x68, 0xfb, 0x48, 0xfb, 0x84, 0x5, 0x4a, 0x6, + 0xe, 0x75, 0xa, 0xa3, 0xf7, 0x5f, 0xbb, 0xc3, 0xb9, 0xf7, 0x5b, 0x3, + 0xf7, 0x27, 0x16, 0xf7, 0xcb, 0xc1, 0xfb, 0x13, 0xf7, 0x43, 0x6, 0xf7, + 0x46, 0xf7, 0xab, 0x5, 0xce, 0xc1, 0xfb, 0x5b, 0x55, 0xd2, 0x6, 0xfb, + 0x25, 0xfb, 0x76, 0xfb, 0x28, 0xf7, 0x76, 0x5, 0xd3, 0xc1, 0xfb, 0x5f, + 0x55, 0xd0, 0x6, 0xf7, 0x4a, 0xfb, 0xab, 0x5, 0xfb, 0x43, 0xfb, 0x14, + 0x7, 0xe, 0x8b, 0xc1, 0xf8, 0x5d, 0xc1, 0xf7, 0x78, 0x77, 0x81, 0xa, + 0xf7, 0x27, 0x16, 0x36, 0xa, 0xb0, 0xf8, 0xc9, 0x15, 0xf7, 0xba, 0xf0, + 0x69, 0xd4, 0xfb, 0xa4, 0xfb, 0x24, 0x5, 0xe, 0x8b, 0xc1, 0xf8, 0x5d, + 0xc1, 0xf7, 0xe, 0xf7, 0x15, 0x81, 0xa, 0xf7, 0xe5, 0xf9, 0x43, 0x15, + 0xe1, 0xf7, 0x15, 0x35, 0x6, 0xfb, 0x2b, 0xfb, 0x15, 0x15, 0xe0, 0xf7, + 0x15, 0x36, 0x6, 0x64, 0xfd, 0xc4, 0x15, 0x36, 0xa, 0xe, 0x75, 0xa, + 0xf7, 0xa, 0xbf, 0xf7, 0xb5, 0xc2, 0x3, 0xe1, 0x16, 0xf8, 0x40, 0xf7, + 0x5f, 0x54, 0xfb, 0x29, 0xfb, 0xc1, 0x6, 0xf7, 0xf8, 0xf8, 0x5d, 0x5, + 0xbe, 0xfc, 0x20, 0xfb, 0x51, 0xbf, 0xf7, 0x1b, 0xf7, 0xa3, 0x7, 0xfb, + 0xf7, 0xfc, 0x5b, 0x5, 0xe, 0x8b, 0xc2, 0xf8, 0x63, 0xc2, 0x1, 0xf7, + 0xa, 0xbf, 0xf7, 0xb7, 0xc0, 0x3, 0xe1, 0x16, 0xf8, 0x40, 0xf7, 0x78, + 0x56, 0xfb, 0x41, 0xfb, 0xc2, 0x6, 0xf7, 0xf7, 0xf8, 0x66, 0x5, 0xbf, + 0xfc, 0x20, 0xfb, 0x68, 0xbf, 0xf7, 0x31, 0xf7, 0xa4, 0x7, 0xfb, 0xf8, + 0xfc, 0x64, 0x5, 0xf7, 0x52, 0xf8, 0xd2, 0x15, 0xd9, 0x6, 0xf7, 0x21, + 0xf7, 0x33, 0x63, 0x9d, 0xfb, 0x20, 0xfb, 0xb, 0xfb, 0x23, 0xf7, 0xb, + 0x64, 0x78, 0x5, 0xe, 0x88, 0xc2, 0xf7, 0x33, 0xc1, 0xf7, 0xb, 0xc4, + 0x1, 0xba, 0xc4, 0xf7, 0xca, 0xc2, 0x3, 0xf1, 0xf7, 0xe1, 0x15, 0xd2, + 0xa9, 0xcf, 0xa1, 0xbc, 0x8a, 0xdf, 0x8a, 0xbb, 0x6b, 0x83, 0x28, 0x8, + 0x95, 0x5e, 0x5b, 0x8e, 0x5d, 0x1b, 0xfb, 0xd, 0x20, 0x5c, 0x29, 0x4a, + 0xc0, 0x45, 0xf7, 0x8, 0xea, 0xd7, 0xc2, 0xb4, 0xa7, 0x1f, 0x37, 0xf7, + 0x1e, 0xc2, 0x37, 0xf7, 0x85, 0x7, 0xf4, 0x49, 0xb6, 0xfb, 0x7, 0x40, + 0x3b, 0x6e, 0x71, 0x5c, 0x1e, 0xf7, 0xdc, 0xfb, 0x83, 0x15, 0x4f, 0x58, + 0x46, 0x55, 0x39, 0x1b, 0x4c, 0x5e, 0xbb, 0xb1, 0xd2, 0xdd, 0xa0, 0xe3, + 0xbc, 0xc0, 0x88, 0x80, 0xb1, 0x1f, 0xe, 0x3e, 0xa, 0xf7, 0x30, 0xf8, + 0x83, 0x15, 0xf7, 0xbb, 0xf2, 0x69, 0xd5, 0xfb, 0xa5, 0xfb, 0x26, 0x5, + 0x5a, 0xfb, 0x44, 0x23, 0xa, 0x3e, 0xa, 0xf7, 0x16, 0xf8, 0x74, 0x15, + 0xf7, 0x2d, 0xf7, 0xa, 0xf7, 0x2a, 0xfb, 0xa, 0xb6, 0x9c, 0xfb, 0x2c, + 0xf7, 0x31, 0x5, 0x38, 0x6, 0xfb, 0x2d, 0xfb, 0x31, 0x5, 0x92, 0xfb, + 0x27, 0x23, 0xa, 0x6e, 0xa, 0xf7, 0x61, 0xf8, 0x85, 0x15, 0xf7, 0x64, + 0xf1, 0x5e, 0xd4, 0xfb, 0x4a, 0xfb, 0x24, 0x5, 0xe, 0x7c, 0xc3, 0x6a, + 0xc3, 0xf7, 0x2b, 0xc3, 0xf7, 0x7, 0xc3, 0xe3, 0xf7, 0x7, 0x12, 0xba, + 0xc5, 0xbf, 0xe2, 0xcc, 0xe1, 0x9e, 0xc3, 0x13, 0x7f, 0x80, 0xf7, 0xc9, + 0xf8, 0xa6, 0x15, 0xe1, 0xf7, 0x7, 0x35, 0x6, 0xfb, 0x2c, 0x60, 0xa, + 0x4d, 0xfb, 0xbb, 0x28, 0xa, 0x1f, 0x13, 0xbf, 0x80, 0x3d, 0xa, 0x1e, + 0x29, 0xa, 0x2a, 0xa, 0x7c, 0xc1, 0xf7, 0x42, 0xc2, 0xf7, 0xa, 0xc2, + 0x1, 0xa3, 0xc4, 0xf7, 0x4e, 0xc3, 0x3, 0xf7, 0xba, 0xd7, 0x15, 0x58, + 0x9f, 0xbf, 0x63, 0xda, 0x1b, 0xb8, 0xb9, 0x96, 0x96, 0xb2, 0x1f, 0x7f, + 0xc1, 0x5, 0x82, 0x6b, 0x65, 0x7e, 0x67, 0x1b, 0x2e, 0x62, 0xda, 0xde, + 0x1f, 0x97, 0xf7, 0x8f, 0x7, 0xf4, 0x8c, 0x76, 0xf7, 0xf, 0xfb, 0x13, + 0x1b, 0x53, 0x6a, 0x71, 0x62, 0x70, 0x1f, 0x99, 0x85, 0x7d, 0xc0, 0x2b, + 0x1b, 0x54, 0x58, 0x7e, 0x7b, 0x5f, 0x1f, 0x96, 0x56, 0x5, 0x98, 0xad, + 0xbe, 0x99, 0xb4, 0x1b, 0xd2, 0x99, 0x68, 0x53, 0x1f, 0x70, 0x7, 0xfb, + 0x7, 0x8c, 0xfb, 0x14, 0x75, 0xfb, 0x1e, 0x1a, 0x34, 0xcd, 0x66, 0xc9, + 0xa5, 0xc4, 0x90, 0xe1, 0xc6, 0x1e, 0xaa, 0xf7, 0x54, 0x15, 0xcb, 0x8f, + 0xb3, 0xc1, 0xc9, 0x1b, 0xd6, 0x91, 0x49, 0x57, 0x92, 0x1f, 0xfb, 0x90, + 0xfb, 0x21, 0x15, 0x75, 0x7f, 0x64, 0x49, 0x4b, 0x1b, 0x63, 0x6c, 0xa6, + 0xb9, 0xf0, 0xf7, 0x0, 0x8b, 0xd9, 0x1f, 0xe, 0x3e, 0xa, 0xf7, 0x1a, + 0xf8, 0xe8, 0x15, 0xf7, 0xbd, 0x24, 0x96, 0xaa, 0xfb, 0xa5, 0xf7, 0x28, + 0x5, 0x41, 0xfb, 0xd6, 0x23, 0xa, 0x86, 0xc0, 0x64, 0xc2, 0xf7, 0x3e, + 0xc1, 0xf7, 0x5f, 0xbf, 0x1, 0xc9, 0xc2, 0x91, 0xbf, 0x3, 0xf7, 0xf4, + 0xbb, 0x15, 0xae, 0x59, 0x5, 0xf7, 0x2a, 0xc2, 0xfb, 0x11, 0x6, 0x72, + 0xb0, 0xa6, 0xb0, 0xa1, 0xc0, 0x91, 0xc2, 0x19, 0xd8, 0xc1, 0xfb, 0xd, + 0x6, 0x60, 0x7b, 0x43, 0x71, 0x63, 0x1e, 0xfb, 0x22, 0xf7, 0x5e, 0x87, + 0x8f, 0x69, 0xb8, 0x8a, 0xb2, 0x19, 0xc0, 0x89, 0xc2, 0x99, 0xb5, 0x1b, + 0xb9, 0xa9, 0x74, 0x7a, 0x9a, 0x1f, 0xa9, 0xb7, 0x5, 0xa7, 0x6e, 0x5d, + 0x9f, 0x5e, 0x1b, 0x40, 0x42, 0x68, 0x42, 0x5f, 0xa4, 0x5c, 0xa6, 0x64, + 0x1f, 0x20, 0x50, 0x85, 0x38, 0x6b, 0x1a, 0x50, 0xb0, 0x34, 0xf6, 0xc3, + 0xc0, 0xa2, 0xb3, 0xb0, 0x1e, 0x6e, 0xb7, 0x15, 0x75, 0x73, 0x6e, 0x6b, + 0x54, 0x1b, 0x59, 0x5b, 0xa7, 0xd8, 0xc3, 0xbb, 0xbd, 0xb0, 0x9b, 0x1f, + 0xe, 0x41, 0xa, 0xc8, 0xf7, 0x38, 0x12, 0xba, 0xc5, 0xe6, 0xf7, 0x46, + 0xb3, 0xc3, 0x13, 0xbf, 0xf7, 0x58, 0xf8, 0xe4, 0x15, 0x5d, 0xb2, 0x67, + 0xbd, 0xbd, 0xb2, 0xaf, 0xb9, 0xb9, 0x64, 0xaf, 0x59, 0x59, 0x64, 0x67, + 0x5d, 0x1e, 0xc1, 0x16, 0x9d, 0x9b, 0x99, 0x9e, 0x9e, 0x9b, 0x7d, 0x79, + 0x7a, 0x7b, 0x7c, 0x78, 0x78, 0x7b, 0x9a, 0x9c, 0x1e, 0xfb, 0x2f, 0xfb, + 0x86, 0x2c, 0xa, 0xf7, 0xa4, 0xbe, 0x1, 0x6f, 0xf9, 0x24, 0x3, 0xf7, + 0x5d, 0x70, 0xa, 0xf8, 0x55, 0x80, 0xa, 0xa7, 0x5e, 0xf7, 0x7a, 0xf7, + 0x4b, 0xfb, 0x7a, 0x78, 0xa, 0xfc, 0x59, 0x5d, 0xa, 0x7c, 0xf9, 0x3, + 0x1, 0xf7, 0xa8, 0xbe, 0x3, 0xf7, 0x8, 0xf7, 0x66, 0x15, 0xf7, 0x4d, + 0xfb, 0x75, 0xf7, 0x4b, 0xf7, 0x7b, 0x5e, 0xa7, 0xfb, 0x4, 0xfb, 0x2e, + 0x5, 0xf8, 0x9a, 0x58, 0xfc, 0x9c, 0x7, 0xfb, 0xf, 0xf7, 0x2f, 0x5, + 0xe, 0x7d, 0xa, 0xf7, 0x61, 0x70, 0xa, 0xf8, 0xb5, 0xbe, 0xfc, 0xb7, + 0x5d, 0xa, 0x7d, 0xa, 0x73, 0xf7, 0xa4, 0x15, 0xf8, 0xb5, 0x80, 0xa, + 0xa7, 0x5e, 0xf7, 0x79, 0xf7, 0x4b, 0xfb, 0x79, 0x78, 0xa, 0xfc, 0xb7, + 0x6, 0xe, 0xf8, 0x1c, 0xf7, 0x14, 0x1, 0xf7, 0xa8, 0xbe, 0x3, 0xf7, + 0xa8, 0x16, 0xbe, 0xf8, 0x9a, 0x6, 0xf7, 0x4, 0xfb, 0x2e, 0xb8, 0xa7, + 0xfb, 0x4b, 0xf7, 0x75, 0xfb, 0x4d, 0xfb, 0x75, 0xb0, 0x6f, 0xf7, 0xf, + 0xf7, 0x30, 0x5, 0xe, 0xf8, 0xb, 0x76, 0xf7, 0xa0, 0x77, 0x1, 0xe9, + 0xf8, 0x30, 0x3, 0xe9, 0xf7, 0xf6, 0x15, 0xd8, 0xa6, 0xd2, 0xc6, 0xc5, + 0xc5, 0xc7, 0x4e, 0xd0, 0x53, 0xd8, 0x71, 0x8, 0xba, 0x7, 0x2a, 0xd6, + 0x5e, 0xb9, 0x63, 0xee, 0x8, 0x58, 0x6, 0x68, 0x2d, 0x5a, 0x53, 0x2c, + 0x44, 0x8, 0xe, 0xf7, 0x5b, 0xbe, 0x9e, 0xbe, 0x12, 0xc8, 0xf8, 0x71, + 0x17, 0xf6, 0xf7, 0x59, 0x15, 0xaa, 0xa1, 0xa6, 0xb4, 0xb2, 0x1b, 0xb1, + 0xaa, 0x77, 0x78, 0xac, 0x1f, 0x7a, 0xa9, 0xaa, 0x7b, 0xb1, 0x1b, 0xcd, + 0xb6, 0xba, 0xb8, 0xac, 0x1f, 0x5f, 0xaa, 0x5, 0x77, 0x7d, 0x5e, 0x57, + 0x65, 0x1b, 0x71, 0x73, 0x9b, 0x9b, 0x6f, 0x1f, 0x13, 0xe0, 0x9e, 0x6a, + 0x64, 0xa0, 0x53, 0x1b, 0x4c, 0x6b, 0x5e, 0x62, 0x68, 0x1f, 0xe, 0xf7, + 0x95, 0xf7, 0xf2, 0x1, 0xf7, 0xa0, 0xcb, 0x3, 0xf7, 0x37, 0xf7, 0xc0, + 0x15, 0xcc, 0x60, 0xd5, 0xf7, 0x16, 0xd5, 0xfb, 0x16, 0xc8, 0xb5, 0x2a, + 0xf7, 0x9, 0xf7, 0x24, 0xa6, 0x79, 0xcf, 0xfb, 0x20, 0x57, 0x98, 0xf7, + 0x28, 0x5, 0x40, 0x6, 0x94, 0xfb, 0x29, 0xfb, 0x1d, 0xc0, 0x77, 0x47, + 0xf7, 0x26, 0x6f, 0x5, 0xe, 0x7c, 0xb1, 0xde, 0xb1, 0xf7, 0x68, 0xb5, + 0xf7, 0x1, 0xb2, 0x1, 0xb0, 0xb6, 0xe5, 0xb3, 0xf7, 0x24, 0xb7, 0xf7, + 0xd, 0xb7, 0x3, 0xf7, 0xf6, 0xf7, 0x40, 0x15, 0x6e, 0x93, 0xa0, 0x66, + 0xb9, 0x1b, 0xdc, 0xc0, 0xe9, 0xf7, 0x0, 0xf7, 0x23, 0xfb, 0x1, 0xea, + 0xfb, 0x24, 0xfb, 0x47, 0x2d, 0xfb, 0x15, 0xfb, 0x31, 0xfb, 0x3a, 0xf7, + 0x0, 0xfb, 0x1, 0xf7, 0x44, 0xdf, 0xd0, 0xa7, 0xb3, 0xcc, 0x1f, 0x77, + 0xb3, 0x5, 0x76, 0x6e, 0x2c, 0x5a, 0x41, 0x1b, 0xfb, 0x11, 0xfb, 0x8, + 0xdd, 0xf7, 0x2f, 0xf7, 0xe, 0xd2, 0xf7, 0x11, 0xf7, 0x33, 0xf7, 0xb, + 0xe5, 0x36, 0xfb, 0x5, 0x3e, 0x67, 0x33, 0x58, 0x59, 0x91, 0xd9, 0xb6, + 0x95, 0x1f, 0xac, 0xf7, 0x1c, 0x5, 0x5f, 0x6, 0x7f, 0x5a, 0x5, 0xb6, + 0x76, 0x72, 0x8e, 0x6c, 0x1b, 0x3d, 0x59, 0x2a, 0x2a, 0x5e, 0x99, 0x56, + 0xce, 0xb4, 0xb6, 0xac, 0xac, 0x9e, 0x1f, 0xfb, 0x24, 0xa9, 0x15, 0xc1, + 0xa6, 0xef, 0xc8, 0xbd, 0x91, 0x67, 0x79, 0x4a, 0x64, 0x30, 0x51, 0x69, + 0x7e, 0xad, 0xa1, 0x1e, 0xe, 0x7c, 0xc3, 0x5f, 0xc3, 0xf7, 0x34, 0xc3, + 0xf7, 0x1c, 0xc3, 0xc7, 0xbd, 0x9b, 0xbc, 0x12, 0xba, 0xc5, 0xf7, 0xc9, + 0xc3, 0x13, 0xbf, 0xf7, 0x15, 0xf8, 0xa1, 0x15, 0x99, 0x8f, 0x9f, 0xbb, + 0xaf, 0x1b, 0xa7, 0x9d, 0x7d, 0x7c, 0x9f, 0x1f, 0x79, 0xa2, 0xa6, 0x78, + 0xb9, 0x1b, 0xcb, 0xbc, 0xb9, 0xc3, 0x9e, 0x1f, 0x58, 0x94, 0x5, 0x72, + 0x82, 0x6e, 0x67, 0x66, 0x1b, 0x70, 0x78, 0x9b, 0x9d, 0x74, 0x1f, 0x9b, + 0x76, 0x73, 0x9a, 0x65, 0x1b, 0x57, 0x55, 0x67, 0x4a, 0x75, 0x1f, 0x9d, + 0xfb, 0x4d, 0x2c, 0xa, 0x7c, 0xc2, 0x60, 0xc3, 0xf7, 0xea, 0xc3, 0x12, + 0xf5, 0xc4, 0xf7, 0xf9, 0xc7, 0x13, 0x78, 0x9e, 0x88, 0x15, 0xf7, 0x24, + 0xd1, 0x6, 0x13, 0xb8, 0x7b, 0x99, 0xb5, 0x49, 0xf7, 0x18, 0x1b, 0xf7, + 0x1e, 0xe6, 0xf7, 0xa, 0xf7, 0x2, 0xf7, 0x2b, 0x27, 0xe2, 0xfb, 0x13, + 0xfb, 0x4, 0x4f, 0x4c, 0x72, 0x79, 0x1f, 0xf7, 0x9e, 0xfb, 0x24, 0x54, + 0xe2, 0x7, 0x13, 0x78, 0xfc, 0x9d, 0x34, 0x7, 0xf7, 0x25, 0xf7, 0x3d, + 0x15, 0xf5, 0xe4, 0xce, 0xe4, 0xf7, 0xc, 0xc6, 0x36, 0x2a, 0x8a, 0x1e, + 0x13, 0xb8, 0x24, 0x8a, 0x34, 0x45, 0x31, 0x1b, 0x38, 0x2c, 0xc5, 0xf7, + 0x10, 0x1f, 0xe, 0xfb, 0x1d, 0xf9, 0xce, 0x1, 0xcf, 0xf8, 0x64, 0x3, + 0xf8, 0x7b, 0xfb, 0x1d, 0x15, 0xb8, 0xa3, 0xfc, 0x37, 0xf9, 0xb6, 0x5e, + 0x70, 0x5, 0xe, 0xfb, 0x79, 0x76, 0xfa, 0x7c, 0x77, 0x68, 0xa, 0xbe, + 0x3, 0xf7, 0xa6, 0xfb, 0x8e, 0x15, 0xbe, 0xfa, 0x7c, 0x58, 0x6, 0xe, + 0xfb, 0x78, 0xbf, 0xf9, 0xf1, 0xc4, 0x1, 0xf7, 0x9f, 0xc5, 0x3, 0xf7, + 0x40, 0xf7, 0x82, 0x15, 0xd9, 0x72, 0x9c, 0x75, 0x2b, 0x1a, 0xfb, 0x50, + 0x7, 0x49, 0xae, 0x46, 0xf7, 0x11, 0x1e, 0xbf, 0x7, 0x4e, 0x8e, 0x62, + 0xae, 0xbb, 0x1a, 0xf7, 0x4d, 0x7, 0xcc, 0x8a, 0xc7, 0x3a, 0xb0, 0x1e, + 0xdc, 0xb4, 0x8c, 0xbe, 0xd1, 0x1a, 0xf7, 0x5c, 0x7, 0xbb, 0xb4, 0x9a, + 0xc8, 0x8e, 0x1e, 0xc4, 0x7, 0xfb, 0x17, 0x6e, 0x4e, 0x41, 0x1f, 0xfb, + 0x50, 0x7, 0x2b, 0x77, 0x75, 0x40, 0x72, 0x1e, 0xe, 0xfb, 0x78, 0xbf, + 0xf9, 0xf5, 0xc0, 0x68, 0xa, 0xc5, 0x3, 0xf7, 0x40, 0xfb, 0x44, 0x15, + 0x57, 0x7, 0xf7, 0x11, 0xae, 0xd0, 0xcd, 0x1f, 0xf7, 0x50, 0x7, 0xeb, + 0x9c, 0xa1, 0xd9, 0xa4, 0x1e, 0xb1, 0x7, 0x40, 0xa4, 0x77, 0xa1, 0xeb, + 0x1a, 0xf7, 0x50, 0x7, 0xd5, 0x6e, 0xc8, 0xfb, 0x17, 0x1e, 0x56, 0x7, + 0xc8, 0x88, 0xb4, 0x78, 0x5b, 0x1a, 0xfb, 0x5c, 0x7, 0x45, 0x8c, 0x58, + 0xdc, 0x62, 0x1e, 0x3a, 0x66, 0x8a, 0x4f, 0x4a, 0x1a, 0xfb, 0x4d, 0x7, + 0x5b, 0x62, 0x68, 0x4e, 0x88, 0x1e, 0xe, 0x3d, 0x77, 0x9f, 0xc1, 0xf9, + 0x2, 0xc1, 0x1, 0xf7, 0x69, 0xc2, 0x3, 0xf7, 0x69, 0x3d, 0x15, 0xf7, + 0x41, 0xc1, 0xfb, 0xa, 0xf9, 0x2, 0xf7, 0xa, 0xc1, 0xfb, 0x41, 0x6, + 0xe, 0x3d, 0xc1, 0xf9, 0x2, 0xc1, 0x1, 0xf7, 0xdf, 0xc2, 0x3, 0xf7, + 0x69, 0x73, 0x15, 0x55, 0xf7, 0x41, 0xf9, 0x6e, 0xfb, 0x41, 0x55, 0xf7, + 0xa, 0xfd, 0x2, 0x7, 0xe, 0xf8, 0x89, 0xb2, 0x1, 0xf7, 0x2d, 0xf8, + 0xf5, 0x15, 0x3b, 0xaf, 0xc3, 0x6f, 0xc4, 0x1b, 0xd5, 0xc0, 0xbc, 0xc6, + 0x9d, 0x1f, 0x61, 0x6, 0x6d, 0x80, 0x64, 0x64, 0x55, 0x1b, 0x60, 0x63, + 0xa5, 0xb6, 0x78, 0x1f, 0xe, 0xfb, 0x2e, 0x76, 0xf9, 0xe6, 0x77, 0x68, + 0xa, 0xbe, 0x3, 0xf7, 0xa6, 0xf7, 0xaf, 0x15, 0xbe, 0xf8, 0x1c, 0x58, + 0x6, 0xfd, 0xe6, 0x4, 0xbe, 0xf8, 0x1c, 0x58, 0x6, 0xe, 0xf7, 0x16, + 0xf7, 0x91, 0x1, 0xf7, 0x40, 0xf7, 0x94, 0x3, 0xf7, 0x40, 0xf7, 0x95, + 0x15, 0x45, 0xc4, 0x52, 0xd2, 0xd3, 0xc3, 0xc4, 0xd1, 0xd1, 0x53, 0xc3, + 0x43, 0x44, 0x52, 0x53, 0x45, 0x1e, 0xe, 0x7c, 0xc0, 0xf7, 0xef, 0xc3, + 0x1, 0xcf, 0xc1, 0xf7, 0xe4, 0xc1, 0x3, 0xf8, 0x89, 0xf7, 0x8, 0x15, + 0x76, 0x74, 0x34, 0x52, 0x3b, 0x1b, 0xfb, 0x19, 0x53, 0xe7, 0xdf, 0xe4, + 0xd4, 0xdd, 0xf7, 0x4, 0xc4, 0xbf, 0x73, 0x67, 0xb5, 0x1f, 0x46, 0xc1, + 0xf7, 0x4d, 0x55, 0x5b, 0x7, 0xaa, 0x5e, 0x5c, 0x9c, 0x51, 0x1b, 0xfb, + 0x3e, 0x45, 0xfb, 0x19, 0x30, 0xfb, 0x28, 0xec, 0x37, 0xf7, 0x24, 0xeb, + 0xcb, 0xab, 0xbb, 0xc9, 0x1f, 0xe, 0xf8, 0x80, 0xc3, 0x1, 0xf7, 0x10, + 0xf7, 0xf4, 0x3, 0xf7, 0x9c, 0xf8, 0x80, 0x15, 0xd6, 0x6, 0xf7, 0x1d, + 0xf7, 0x31, 0x64, 0x9f, 0xfb, 0x1c, 0xfb, 0xd, 0xfb, 0x1f, 0xf7, 0xc, + 0x65, 0x77, 0x5, 0xe, 0xfb, 0x21, 0x76, 0xf7, 0x40, 0xbd, 0xf7, 0xdc, + 0xc0, 0x12, 0xcf, 0xc2, 0xf7, 0x2d, 0xe9, 0x5d, 0xb9, 0xea, 0xc2, 0x13, + 0xfa, 0xf7, 0xab, 0x95, 0x15, 0x86, 0x44, 0x5, 0x9c, 0x92, 0xac, 0x8b, + 0x71, 0x1a, 0x13, 0x72, 0x6d, 0x5d, 0x85, 0x74, 0xa1, 0x1e, 0x7d, 0x65, + 0x5, 0x13, 0x76, 0x79, 0xa9, 0x9d, 0x8a, 0x93, 0x1b, 0xb2, 0xad, 0xad, + 0xb7, 0xb0, 0x73, 0x9f, 0x78, 0x8d, 0x1f, 0xa3, 0x7, 0xde, 0x8f, 0xcd, + 0xa8, 0xc2, 0xb4, 0x75, 0xbf, 0x18, 0x76, 0x72, 0x3c, 0x54, 0x3a, 0x1b, + 0xfb, 0x31, 0x56, 0xf5, 0xc8, 0xdf, 0xdd, 0xd8, 0xf7, 0x7, 0xc4, 0xc0, + 0x7e, 0x69, 0xb7, 0x1f, 0x41, 0xc2, 0xf7, 0x42, 0x54, 0x7, 0x13, 0x4, + 0x5e, 0x7, 0xa8, 0x5c, 0x5b, 0x9b, 0x51, 0x1b, 0xfb, 0x43, 0x46, 0xfb, + 0x11, 0x35, 0xfb, 0x14, 0xec, 0x3a, 0xf7, 0x6, 0x80, 0x1f, 0xe, 0xfb, + 0x2b, 0xb3, 0xbb, 0xb3, 0x12, 0xf7, 0xa5, 0xbd, 0x87, 0xbd, 0x13, 0xd0, + 0xf7, 0x7b, 0xfb, 0x1b, 0x15, 0x80, 0x9c, 0x9d, 0x86, 0x9e, 0x1b, 0xb6, + 0xb4, 0xa7, 0xb8, 0x1f, 0x13, 0xe0, 0xae, 0x71, 0x9d, 0x77, 0x8d, 0x1e, + 0xac, 0x59, 0x7, 0x83, 0x3d, 0x5, 0x8f, 0x98, 0x94, 0x8c, 0x93, 0x1b, + 0x9e, 0x90, 0x7e, 0x80, 0x7a, 0x7c, 0x84, 0x7a, 0x7c, 0x7b, 0x90, 0x93, + 0x81, 0x1f, 0xe, 0x6f, 0x76, 0xf7, 0x22, 0xc2, 0xf7, 0x94, 0xc2, 0x1, + 0xed, 0xc1, 0xf7, 0x8, 0xc3, 0xf7, 0x1, 0xc1, 0x3, 0xf7, 0xa0, 0x5a, + 0x15, 0xc3, 0xf7, 0x22, 0x6, 0xd0, 0x8d, 0xd3, 0xa7, 0xaf, 0xaa, 0x75, + 0xbd, 0x18, 0x6b, 0x57, 0x56, 0x73, 0x4b, 0x1b, 0xfb, 0xb, 0x64, 0xd2, + 0xbe, 0xd3, 0xc3, 0xc9, 0xed, 0xb8, 0xb3, 0x82, 0x71, 0xb5, 0x1f, 0x55, + 0xc1, 0xf7, 0x3c, 0x55, 0x56, 0x7, 0x61, 0xa1, 0x6e, 0x8e, 0x65, 0x8f, + 0x8, 0xf7, 0x32, 0x53, 0xfb, 0x32, 0x7, 0x42, 0x84, 0x2a, 0x52, 0xfb, + 0xf, 0x1a, 0xfb, 0x8, 0xe1, 0x51, 0xdf, 0x86, 0x1e, 0xe, 0xf8, 0xe9, + 0xc4, 0x1, 0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7, 0x36, 0xf8, 0x71, 0x15, + 0xf7, 0x1e, 0xf7, 0xc, 0xf7, 0x1d, 0xfb, 0xc, 0xb2, 0x9d, 0xfb, 0x1e, + 0xf7, 0x33, 0x5, 0x40, 0x6, 0xfb, 0x1f, 0xfb, 0x33, 0x5, 0xe, 0xf4, + 0xf7, 0xe, 0xf7, 0x30, 0xf7, 0xe, 0x7a, 0xa, 0xf8, 0x50, 0x15, 0x52, + 0xa, 0xfb, 0xaa, 0x4, 0x52, 0xa, 0xe, 0xf7, 0x6e, 0xf7, 0x37, 0x3, + 0xf7, 0x6e, 0xfb, 0x4, 0x15, 0xca, 0x6, 0xef, 0xf7, 0x7e, 0x5, 0x2e, + 0x6, 0xe, 0x79, 0xb9, 0xe2, 0xc0, 0xf7, 0x84, 0xbb, 0xdb, 0xb7, 0x1, + 0x8b, 0xb9, 0xf2, 0xba, 0xf7, 0xfb, 0xb8, 0x3, 0xf7, 0xab, 0x4, 0xfb, + 0x38, 0xf7, 0x1a, 0xfb, 0x19, 0xf7, 0x3b, 0xf7, 0x35, 0xf7, 0x1e, 0xf7, + 0xe, 0xf7, 0x43, 0xf7, 0x4b, 0xfb, 0x21, 0xf7, 0xa, 0xfb, 0x32, 0xfb, + 0x2f, 0xfb, 0x26, 0xfb, 0xb, 0xfb, 0x4a, 0x1e, 0xb9, 0x16, 0xf7, 0x18, + 0xee, 0xf7, 0x11, 0xf7, 0x30, 0xf7, 0x21, 0xf7, 0x5, 0xfb, 0xc, 0xfb, + 0x1d, 0xfb, 0x22, 0xfb, 0x4, 0xfb, 0x1, 0xfb, 0x22, 0xfb, 0x1b, 0xfb, + 0xc, 0xf7, 0x1, 0xf7, 0x22, 0x1e, 0xf8, 0x7, 0x43, 0x15, 0x6f, 0x71, + 0x64, 0x80, 0x65, 0x1b, 0x4f, 0x51, 0xb6, 0xd2, 0xda, 0xc3, 0xba, 0xc9, + 0xa6, 0xb2, 0x81, 0x75, 0x9e, 0x1f, 0xac, 0xac, 0x5, 0xad, 0x6a, 0x5d, + 0x98, 0x64, 0x1b, 0x33, 0x3e, 0x3f, 0x29, 0x20, 0xdc, 0x4f, 0xdf, 0xbc, + 0xbe, 0x9e, 0xb2, 0xae, 0x1f, 0xe, 0xd7, 0xba, 0xf7, 0xd2, 0xba, 0x1, + 0xe9, 0xba, 0xf7, 0xd2, 0xbb, 0x3, 0xd4, 0xe1, 0x15, 0xab, 0x6f, 0xcc, + 0xca, 0x5, 0x63, 0xc0, 0xb9, 0x86, 0xaa, 0x1b, 0xbd, 0xba, 0x9b, 0xa8, + 0xb1, 0x1f, 0xc9, 0x4c, 0xa9, 0xa8, 0x4b, 0xcb, 0x5, 0xa8, 0xb1, 0x9a, + 0xba, 0xbb, 0x1a, 0xba, 0x7d, 0xba, 0x6d, 0xae, 0x1e, 0xcb, 0xcb, 0x6c, + 0xa8, 0x4d, 0x4c, 0x5, 0xaa, 0x66, 0x5d, 0x99, 0x5b, 0x1b, 0x59, 0x59, + 0x7b, 0x6d, 0x67, 0x1f, 0x4c, 0xcb, 0x6c, 0x6c, 0xcd, 0x4c, 0x5, 0x68, + 0x5f, 0x81, 0x5f, 0x63, 0x1a, 0x5b, 0x9a, 0x5b, 0xaa, 0x67, 0x1e, 0x8c, + 0xf7, 0x16, 0x15, 0xda, 0xc9, 0xdb, 0xee, 0xe9, 0xca, 0x3e, 0x39, 0x2a, + 0x40, 0x4d, 0x38, 0x33, 0x43, 0xd1, 0xe4, 0x1e, 0xe, 0x7c, 0xc2, 0x61, + 0xc2, 0xf7, 0xe1, 0xc7, 0xf7, 0x14, 0xc2, 0x12, 0xa6, 0xc4, 0xf7, 0xf3, + 0xc3, 0x13, 0x7c, 0xf8, 0x47, 0x89, 0x15, 0xf7, 0x1e, 0xc2, 0x39, 0xf8, + 0xd4, 0xfb, 0x4d, 0x54, 0xf7, 0x15, 0xfb, 0x70, 0x6, 0xd7, 0x5e, 0x40, + 0x9b, 0x54, 0x1b, 0xfb, 0x1f, 0x2d, 0x27, 0xfb, 0x15, 0x1f, 0x13, 0xbc, + 0xfb, 0x8, 0xda, 0xfb, 0x8, 0xf7, 0x2a, 0xd3, 0xce, 0xa8, 0xc5, 0xb3, + 0x1e, 0x13, 0x7c, 0xfb, 0xf3, 0xf7, 0x25, 0x15, 0xe7, 0xd1, 0xd8, 0xf2, + 0xf7, 0xf, 0xbd, 0x2b, 0x46, 0x1e, 0x13, 0xbc, 0x21, 0x45, 0x40, 0x24, + 0xfb, 0x5, 0x4f, 0xe5, 0xe2, 0x1e, 0xe, 0xf7, 0xfc, 0xc2, 0xf7, 0x39, + 0x77, 0x1, 0xf7, 0xa5, 0xc2, 0x3, 0xf7, 0xa5, 0x3c, 0x15, 0xc2, 0xf8, + 0x4b, 0xf7, 0x17, 0xc2, 0xfb, 0x17, 0xf7, 0x39, 0x54, 0xfb, 0x39, 0xfb, + 0x18, 0x54, 0xf7, 0x18, 0x6, 0xe, 0xd0, 0xf7, 0xc9, 0xfb, 0x8e, 0xf7, + 0xca, 0x12, 0xf7, 0x21, 0xf7, 0x52, 0x13, 0xa0, 0xf7, 0x21, 0xd0, 0x15, + 0xf7, 0x15, 0xfb, 0x27, 0xc8, 0xf7, 0x27, 0xf7, 0x14, 0x6, 0x13, 0x60, + 0xc6, 0xfb, 0x14, 0x7, 0x13, 0xa0, 0xf7, 0x8e, 0xf7, 0x14, 0x7, 0x13, + 0x60, 0xc7, 0xfb, 0x14, 0xf7, 0x22, 0x4e, 0xfb, 0x22, 0xfb, 0x15, 0x7, + 0x13, 0xa0, 0x4f, 0xf7, 0x15, 0x7, 0x13, 0x60, 0xfb, 0x8e, 0xfb, 0x15, + 0x7, 0xe, 0xf7, 0xa4, 0xc9, 0xf7, 0x76, 0xc9, 0x1, 0xf7, 0xf, 0xc9, + 0xf7, 0x77, 0xcc, 0x3, 0xf7, 0xf, 0xf8, 0x51, 0x15, 0x2c, 0xd6, 0x3a, + 0xf1, 0xeb, 0xdc, 0xd3, 0xf6, 0xd8, 0x58, 0xec, 0xfb, 0x10, 0x25, 0x3e, + 0x3b, 0x2a, 0x1e, 0xc9, 0x16, 0xbc, 0xb0, 0xcd, 0xdb, 0xe0, 0xa4, 0x3d, + 0x66, 0x49, 0x59, 0x5b, 0x4d, 0x46, 0x5d, 0xc5, 0xc3, 0x1e, 0xe, 0xf8, + 0x80, 0xf2, 0x1, 0xf7, 0x27, 0xf7, 0x4, 0xdc, 0xf7, 0x4, 0x3, 0xf7, + 0x27, 0xf8, 0x80, 0x15, 0xf7, 0x4, 0xf2, 0xfb, 0x4, 0x6, 0xf7, 0x55, + 0x24, 0x15, 0xf7, 0x4, 0xf2, 0xfb, 0x4, 0x6, 0xe, 0xbb, 0xf3, 0xd5, + 0xca, 0xd5, 0xf3, 0x1, 0xf7, 0x8a, 0xf3, 0x14, 0xe0, 0xe2, 0xf7, 0x76, + 0x15, 0xf8, 0x3e, 0xca, 0xfc, 0x3e, 0x6, 0xf7, 0x33, 0xf7, 0x12, 0x15, + 0x51, 0xa, 0xfb, 0xcf, 0x4, 0x51, 0xa, 0xe, 0x22, 0x76, 0xf7, 0x20, + 0xbb, 0xf8, 0x4b, 0xbf, 0x9a, 0x77, 0xf7, 0x4, 0x77, 0x12, 0xf7, 0x0, + 0xc0, 0xf7, 0x2, 0xc2, 0xec, 0xc1, 0x62, 0xc3, 0x13, 0xee, 0x80, 0xf6, + 0x99, 0x15, 0xc1, 0xbb, 0x6, 0xab, 0x73, 0xa0, 0x7b, 0xc4, 0x83, 0x8, + 0xfb, 0x20, 0xc2, 0xf7, 0x20, 0x7, 0xf7, 0x4, 0x94, 0xc1, 0xd3, 0xd8, + 0x1a, 0xf7, 0x0, 0xfb, 0x20, 0xa2, 0x48, 0x9f, 0x1e, 0x66, 0x96, 0x34, + 0xa9, 0xbf, 0x1a, 0xc7, 0xcb, 0xa4, 0xce, 0x1e, 0x13, 0xdf, 0x0, 0xc0, + 0xc1, 0x7c, 0x70, 0xa3, 0x1f, 0x58, 0xc1, 0xf7, 0x34, 0x55, 0x5b, 0x7, + 0x13, 0xee, 0x80, 0x74, 0xa0, 0x60, 0x94, 0x6b, 0x8e, 0x8, 0xf6, 0x54, + 0x20, 0x7, 0x4b, 0x29, 0x64, 0x24, 0x1f, 0x8b, 0x7, 0x43, 0xcf, 0x62, + 0xee, 0x70, 0x1e, 0xd5, 0x76, 0xe2, 0x74, 0x50, 0x1a, 0x47, 0x51, 0x65, + 0x45, 0x4f, 0x53, 0xa5, 0xb0, 0x6c, 0x1e, 0xc3, 0x55, 0x7, 0xe, 0xf8, + 0x71, 0xf2, 0x1, 0xf7, 0x8c, 0xf2, 0x3, 0xf7, 0x8c, 0xf8, 0x71, 0x15, + 0xf2, 0xf2, 0x24, 0x6, 0xe, 0x74, 0xa, 0xf7, 0xa6, 0x73, 0xa, 0xc1, + 0xfb, 0x44, 0xf8, 0x8, 0xfb, 0x5b, 0x55, 0xf7, 0x24, 0xfb, 0xd2, 0xfb, + 0x47, 0x6, 0xe, 0x7f, 0xc1, 0xf7, 0x3c, 0xc2, 0xf7, 0x12, 0xc3, 0x1, + 0xca, 0xc4, 0x3, 0xf7, 0xc, 0xf7, 0x66, 0x15, 0xf8, 0x2e, 0x6, 0xf7, + 0x12, 0x48, 0xf7, 0x3, 0xfb, 0x35, 0xfb, 0x19, 0x21, 0x2f, 0xfb, 0x1e, + 0xfb, 0xa, 0xd0, 0xfb, 0x3, 0xf7, 0x43, 0xdc, 0xdf, 0x99, 0xac, 0xcb, + 0x1e, 0x7a, 0xc0, 0x5, 0x64, 0x41, 0x39, 0x84, 0x5c, 0x1b, 0x5c, 0x5e, + 0x91, 0xa3, 0x65, 0x1f, 0x67, 0xa2, 0x6d, 0xc1, 0xc0, 0x1a, 0x8d, 0xca, + 0x15, 0xc6, 0x93, 0xc6, 0xce, 0xf7, 0x5, 0x1b, 0xf7, 0x1e, 0xaa, 0x26, + 0x72, 0x1f, 0xe, 0x5a, 0xa, 0xf7, 0x46, 0xf8, 0x81, 0x15, 0xf7, 0xb9, + 0xf2, 0x69, 0xd7, 0xfb, 0xa3, 0xfb, 0x28, 0x5, 0x5a, 0xfb, 0xd9, 0x22, + 0xa, 0x5a, 0xa, 0xf7, 0x2c, 0xf8, 0x7d, 0x15, 0xf7, 0x2c, 0xf7, 0xa, + 0xf7, 0x29, 0xfb, 0xa, 0xb6, 0x9d, 0xfb, 0x2c, 0xf7, 0x31, 0x5, 0x3a, + 0x6, 0xfb, 0x2d, 0xfb, 0x31, 0x5, 0x92, 0xfb, 0xc8, 0x22, 0xa, 0x5e, + 0xa, 0xdc, 0xf7, 0x7, 0x56, 0xa, 0xf7, 0xde, 0xf8, 0xa6, 0x59, 0xa, + 0x4d, 0xfc, 0x52, 0x22, 0xa, 0x7c, 0x82, 0xa, 0xf7, 0x1f, 0xc3, 0x56, + 0xa, 0xf7, 0x31, 0xf8, 0xe8, 0x15, 0xf7, 0xb9, 0x24, 0x97, 0xaa, 0xfb, + 0xa3, 0xf7, 0x28, 0x5, 0x41, 0xfc, 0x6d, 0x22, 0xa, 0x7c, 0xbd, 0xf7, + 0x8a, 0xc2, 0xf7, 0x7e, 0xbf, 0x12, 0xf1, 0xc4, 0x61, 0xc5, 0xf7, 0x8c, + 0xc6, 0x61, 0xc5, 0x13, 0xf2, 0xf7, 0x56, 0xf7, 0xcc, 0x15, 0x75, 0x7e, + 0x45, 0x5c, 0x2b, 0x1a, 0x30, 0xc7, 0x3b, 0xf7, 0x1c, 0xf7, 0x15, 0xd2, + 0xd5, 0xee, 0xea, 0x4b, 0xb7, 0x67, 0x9a, 0x1e, 0x13, 0xec, 0xaa, 0x96, + 0xc0, 0xb9, 0xe2, 0x1a, 0xc9, 0x5e, 0xf3, 0xfb, 0x1b, 0x22, 0x3b, 0x49, + 0x27, 0x4a, 0xb8, 0x50, 0xab, 0x77, 0x1e, 0x13, 0xf2, 0x68, 0xfb, 0x2e, + 0x15, 0xcf, 0xc9, 0xc2, 0xd9, 0xd9, 0xca, 0x54, 0x47, 0x47, 0x4c, 0x54, + 0x3d, 0x3d, 0x4d, 0xc2, 0xcf, 0x1e, 0x13, 0xec, 0x9b, 0xf7, 0xbe, 0x15, + 0xcd, 0xc3, 0xbb, 0xcf, 0xcf, 0xc3, 0x5b, 0x49, 0x49, 0x53, 0x55, 0x47, + 0x47, 0x53, 0xc1, 0xcd, 0x1e, 0xe, 0x7c, 0xf7, 0x12, 0x1, 0xb0, 0xf7, + 0x11, 0xd4, 0xf7, 0x14, 0xd4, 0xf7, 0x13, 0x3, 0xf8, 0x48, 0xba, 0x15, + 0x6c, 0xa4, 0x6c, 0xb3, 0xa9, 0xab, 0xa5, 0xae, 0xac, 0x72, 0xab, 0x65, + 0x67, 0x6f, 0x6e, 0x68, 0x1e, 0xfb, 0x5d, 0x16, 0x6c, 0xa4, 0x6c, 0xb4, + 0xaa, 0xaa, 0xa5, 0xae, 0xac, 0x73, 0xab, 0x65, 0x65, 0x6f, 0x6e, 0x68, + 0x1e, 0xfb, 0x5a, 0x16, 0x6c, 0xa3, 0x6c, 0xb3, 0xaa, 0xa9, 0xa5, 0xae, + 0xac, 0x73, 0xab, 0x65, 0x67, 0x70, 0x6e, 0x68, 0x1e, 0xe, 0xf7, 0x7b, + 0xc1, 0x1, 0x8b, 0xf8, 0xec, 0x3, 0xf7, 0x7b, 0x4, 0xf8, 0xec, 0xc1, + 0xfc, 0xec, 0x6, 0xe, 0xf7, 0x7b, 0xc1, 0x1, 0xd6, 0xf8, 0x56, 0x3, + 0xd6, 0xf7, 0x7b, 0x15, 0xf8, 0x56, 0xc1, 0xfc, 0x56, 0x6, 0xe, 0xf7, + 0x1e, 0xc7, 0xf7, 0x8, 0xc8, 0x1, 0xe5, 0xf8, 0x37, 0x3, 0xe5, 0xf7, + 0xcf, 0x15, 0xf8, 0x37, 0xc8, 0xfc, 0x37, 0x6, 0xfb, 0x82, 0x4, 0xf8, + 0x37, 0xc7, 0xfc, 0x37, 0x6, 0xe, 0x7c, 0xbf, 0xf7, 0xe3, 0xbf, 0x1, + 0xc9, 0xc0, 0xf8, 0x0, 0xc6, 0x3, 0xf7, 0x6f, 0xf8, 0x59, 0x15, 0xf4, + 0xd1, 0xd5, 0x5c, 0xb1, 0x3a, 0x91, 0x7e, 0x19, 0xa9, 0x67, 0x4f, 0x97, + 0x58, 0x1b, 0xfb, 0x36, 0x44, 0xfb, 0xd, 0x28, 0xfb, 0x1b, 0xf1, 0x37, + 0xf7, 0x1a, 0xf7, 0x3a, 0xd3, 0xf7, 0x7, 0xf7, 0xd, 0x8d, 0x1f, 0x8e, + 0x7, 0xe5, 0x65, 0xf7, 0x2c, 0xfb, 0x11, 0xe6, 0x1e, 0xe1, 0xc5, 0x71, + 0xb9, 0xfb, 0x2, 0x42, 0x66, 0x9e, 0x53, 0x96, 0x61, 0x91, 0x19, 0x79, + 0x5c, 0xaa, 0x88, 0xb3, 0x82, 0xa9, 0x7e, 0x19, 0x3b, 0x51, 0x5, 0x3d, + 0xfb, 0xb6, 0x15, 0xea, 0xcc, 0xd4, 0xf7, 0x2, 0xf7, 0x2c, 0xb0, 0x22, + 0x4d, 0x26, 0x3f, 0x48, 0x23, 0xfb, 0x2, 0x41, 0xd6, 0xe7, 0x1e, 0xe, + 0x7c, 0xf7, 0x14, 0xf8, 0x64, 0x77, 0x12, 0xf7, 0x80, 0xf7, 0x14, 0x2c, + 0xcd, 0x13, 0xd0, 0xf7, 0xaa, 0xf7, 0x49, 0x15, 0xbb, 0x6, 0x9d, 0xf8, + 0x18, 0x5, 0x37, 0x6, 0x13, 0xe0, 0x73, 0xfc, 0x9d, 0x15, 0x6c, 0xa4, + 0x6b, 0xb2, 0x1e, 0xb3, 0xa3, 0xaa, 0xac, 0xab, 0x6d, 0xab, 0x6b, 0x1f, + 0x13, 0x60, 0x60, 0x74, 0x69, 0x6c, 0x1f, 0xe, 0xfb, 0x1c, 0x76, 0xf8, + 0x67, 0xf7, 0xc, 0x1, 0xf7, 0xa2, 0xc8, 0x3, 0xf7, 0x80, 0xf8, 0x5, + 0x15, 0x6b, 0xa7, 0x70, 0xaf, 0xb5, 0xa1, 0xa9, 0xa9, 0xa9, 0x71, 0xa9, + 0x64, 0x63, 0x74, 0x6f, 0x6a, 0x1e, 0xa4, 0xfc, 0xa2, 0x15, 0xd9, 0x6, + 0x7b, 0xf8, 0x21, 0x5, 0x5f, 0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xd8, 0xc2, + 0xf7, 0x1f, 0xc2, 0x1, 0xf7, 0x58, 0xc3, 0x3, 0xe6, 0x16, 0xf8, 0xd, + 0xc2, 0xfb, 0x6c, 0xf7, 0xd8, 0xf7, 0x62, 0xc2, 0xfb, 0x62, 0x6, 0x8c, + 0xf7, 0x11, 0x8a, 0x98, 0xf7, 0x7, 0x8c, 0x8, 0xb1, 0xc9, 0x81, 0x85, + 0xaf, 0x1f, 0x90, 0xc3, 0x5, 0x90, 0x6a, 0x45, 0x95, 0x63, 0x1b, 0xfb, + 0x20, 0x8c, 0x6f, 0x6a, 0x8a, 0xfb, 0x36, 0x8, 0x22, 0x54, 0xf4, 0xfb, + 0xd8, 0x22, 0x6, 0xe, 0x8b, 0xc0, 0xf7, 0xd5, 0xc0, 0xde, 0xf7, 0xd, + 0x1, 0xf7, 0x1, 0xc2, 0xf7, 0xa3, 0xc2, 0x3, 0xf8, 0x37, 0xf8, 0x92, + 0x15, 0xd2, 0xf7, 0xb, 0x44, 0x6, 0x33, 0xfd, 0x9, 0x15, 0xf7, 0x9e, + 0xc0, 0x20, 0xf8, 0xa, 0xfb, 0x1c, 0x56, 0xdc, 0xfb, 0xd5, 0x23, 0x6, + 0xfb, 0xdc, 0x56, 0x48, 0xa, 0x4a, 0xa, 0x7c, 0xc3, 0xf7, 0xa5, 0xc9, + 0xf7, 0x40, 0xc6, 0x1, 0xf7, 0x14, 0xc9, 0xf7, 0x8d, 0xc9, 0x3, 0xec, + 0xa7, 0x15, 0x6c, 0xd2, 0xc5, 0x7f, 0xc2, 0x1b, 0xf7, 0x1c, 0xe0, 0xdc, + 0xf7, 0x9, 0x8a, 0x1f, 0xf7, 0xc, 0x8a, 0x38, 0xd4, 0xfb, 0x5, 0x1b, + 0x63, 0x6b, 0x80, 0x76, 0x61, 0x1f, 0xf7, 0x60, 0xf7, 0xa8, 0xc6, 0xfb, + 0xe6, 0xfb, 0xd5, 0x7, 0xb5, 0x73, 0x5, 0xaf, 0xb6, 0xbb, 0x9b, 0xb6, + 0x1b, 0xd6, 0xc7, 0x5b, 0x35, 0x2b, 0x42, 0x61, 0x36, 0x8a, 0x1f, 0x55, + 0x8a, 0x51, 0x9a, 0x58, 0xaa, 0x8, 0xe, 0x8b, 0xc2, 0xf7, 0xd3, 0xc0, + 0xf7, 0x26, 0xc3, 0x8d, 0x77, 0x12, 0xf7, 0x1, 0xc2, 0xf7, 0xa5, 0xc1, + 0x13, 0xec, 0xf7, 0xdf, 0x16, 0xf7, 0x9e, 0xc2, 0x21, 0xf8, 0xd2, 0xfb, + 0x25, 0x53, 0xe6, 0xfc, 0x9a, 0x21, 0x6, 0xfb, 0xdc, 0x54, 0x48, 0xa, + 0x13, 0xdc, 0x4a, 0xa, 0xfb, 0x23, 0xc6, 0xf8, 0x4b, 0xc4, 0xf7, 0x2d, + 0xc4, 0x1, 0xab, 0xf8, 0xab, 0x3, 0xbf, 0x37, 0x15, 0x77, 0x50, 0x5, + 0xd0, 0x6, 0xf7, 0x2c, 0x9c, 0xc7, 0xf7, 0x2, 0x9f, 0x1f, 0xc6, 0xf7, + 0xdc, 0x5, 0xf6, 0x6, 0x92, 0xc4, 0x5, 0x23, 0x6, 0xf7, 0x7, 0xa2, + 0x84, 0xb1, 0xf7, 0x5, 0x1b, 0x9d, 0xa8, 0x88, 0x8a, 0x9d, 0x1f, 0x99, + 0xc5, 0x4f, 0x8e, 0x5, 0x54, 0x52, 0x86, 0x64, 0x66, 0x1f, 0x62, 0x61, + 0x88, 0x4b, 0x80, 0x4f, 0x8, 0xfb, 0x0, 0x6, 0x85, 0x52, 0x5, 0xf3, + 0x6, 0x51, 0xfb, 0xd5, 0x77, 0xfb, 0x6, 0x59, 0x78, 0xfb, 0x5, 0x9a, + 0x19, 0xe, 0x95, 0xc3, 0xf7, 0x16, 0xc7, 0xf8, 0x2, 0x77, 0x1, 0xf7, + 0xfe, 0xc9, 0x3, 0xe4, 0xf7, 0x4f, 0x15, 0xf7, 0xa5, 0xfb, 0x17, 0xfb, + 0x2, 0x53, 0xf7, 0x97, 0xc3, 0x34, 0xf7, 0x17, 0xe2, 0xc7, 0x34, 0xf8, + 0xb, 0x34, 0x6, 0xfb, 0x8c, 0xfc, 0x11, 0x5, 0xcc, 0x91, 0x15, 0xf7, + 0x64, 0xf7, 0xd1, 0x5, 0xfb, 0xd1, 0x7, 0xe, 0x52, 0xf9, 0x66, 0x1, + 0xe6, 0xf8, 0x35, 0x3, 0xe6, 0x66, 0x15, 0xb3, 0x77, 0xf8, 0xd, 0xf9, + 0x50, 0x64, 0xa1, 0x5, 0xe, 0xfb, 0x31, 0xbe, 0xf7, 0x37, 0xbf, 0xf7, + 0xac, 0xbf, 0x7f, 0x77, 0x12, 0xb2, 0xc0, 0xf7, 0xf5, 0xc0, 0x13, 0xdc, + 0xde, 0x3c, 0x15, 0x80, 0x59, 0x50, 0xa, 0x41, 0x7, 0x13, 0xec, 0xbc, + 0x70, 0x43, 0xb0, 0x44, 0xa, 0x70, 0x31, 0x48, 0x2c, 0x9b, 0x96, 0x57, + 0x1e, 0x94, 0xf7, 0xda, 0x15, 0xe0, 0xde, 0xc4, 0xe9, 0xf7, 0x8, 0xc4, + 0x69, 0xa, 0xe, 0xfb, 0x31, 0xbe, 0x8b, 0xf7, 0x37, 0x8b, 0xbf, 0xf7, + 0xac, 0xbf, 0x7f, 0x77, 0xab, 0xbd, 0x12, 0xb2, 0xc0, 0xf7, 0xf5, 0xc0, + 0x13, 0xef, 0xde, 0x43, 0x15, 0x80, 0x52, 0x50, 0xa, 0x55, 0x7, 0x13, + 0xf7, 0xae, 0x6a, 0x49, 0xaa, 0x44, 0xa, 0x6f, 0x31, 0x8c, 0x1e, 0x48, + 0x8c, 0x2c, 0x9f, 0x57, 0x96, 0x8, 0x94, 0xf7, 0xd5, 0x15, 0xe0, 0xde, + 0xc4, 0xe9, 0xf7, 0x1e, 0xae, 0x69, 0xa, 0xf7, 0x43, 0xf7, 0x88, 0x37, + 0xa, 0x7c, 0xc0, 0x63, 0xc3, 0xf7, 0xdf, 0xc2, 0xf7, 0x1a, 0xc2, 0x12, + 0xf7, 0x3, 0xc2, 0xd9, 0xc4, 0xf7, 0x17, 0xc2, 0xa7, 0xc2, 0x13, 0x7f, + 0xa9, 0x89, 0x15, 0xf7, 0x1c, 0xf8, 0x77, 0x6, 0xde, 0xa1, 0x95, 0xf2, + 0xd8, 0xcb, 0x88, 0x56, 0x59, 0x5e, 0x88, 0x55, 0x72, 0x1e, 0x5e, 0x77, + 0x5f, 0x72, 0x58, 0x1a, 0x4d, 0xc1, 0x6f, 0xbb, 0x78, 0x1e, 0xf7, 0x17, + 0x59, 0xb1, 0x80, 0x5d, 0x1a, 0x13, 0xbf, 0x4f, 0x4f, 0x70, 0x48, 0x88, + 0x1e, 0x45, 0x88, 0x41, 0xa7, 0x74, 0xa4, 0x75, 0x54, 0x18, 0x6d, 0xb2, + 0xd2, 0x79, 0xd0, 0x1b, 0xec, 0xea, 0xb8, 0xf4, 0xd7, 0x38, 0xaa, 0x40, + 0xa4, 0x1f, 0x4f, 0x9f, 0x58, 0x9a, 0xb4, 0x1a, 0xb3, 0xbb, 0x97, 0xbd, + 0x9f, 0x1e, 0xc4, 0xa2, 0xaa, 0x9a, 0xce, 0x1a, 0xdf, 0x35, 0xa4, 0x2b, + 0xfb, 0x3a, 0x6f, 0x6b, 0xfb, 0x31, 0x1e, 0x3a, 0x54, 0xdc, 0x6, 0x13, + 0x7f, 0xfb, 0xdf, 0x3a, 0x7, 0xe, 0x6e, 0xa, 0xf8, 0x20, 0xf8, 0x85, + 0x15, 0x9c, 0xa8, 0xfb, 0x49, 0xf7, 0x26, 0x5d, 0x46, 0x5, 0xe, 0xb5, + 0xd0, 0xf7, 0xbf, 0xc9, 0x1, 0xf8, 0x44, 0xce, 0x3, 0xf8, 0x87, 0xf7, + 0xbd, 0x15, 0xfc, 0x22, 0xf7, 0x43, 0x5, 0x4d, 0x7, 0xf7, 0xdf, 0xfb, + 0x2b, 0xfb, 0xdf, 0xfb, 0x28, 0x5, 0x46, 0x7, 0xf8, 0x22, 0xf7, 0x46, + 0x5, 0xe, 0x7b, 0xa, 0xf7, 0x95, 0xf7, 0x96, 0x15, 0xf7, 0x7e, 0xfb, + 0x50, 0x9c, 0xba, 0xfb, 0x3d, 0xf7, 0x21, 0xf7, 0x3d, 0xf7, 0x21, 0x78, + 0xba, 0x5, 0xfc, 0x21, 0xfb, 0x50, 0x15, 0xf7, 0x79, 0xfb, 0x50, 0xa0, + 0xba, 0xfb, 0x40, 0xf7, 0x21, 0xf7, 0x3d, 0xf7, 0x1f, 0x75, 0xbc, 0x5, + 0xe, 0x7b, 0xa, 0xf7, 0x2, 0xd1, 0x15, 0xf7, 0x7d, 0xf7, 0x50, 0xfb, + 0x7d, 0xf7, 0x50, 0x79, 0x5c, 0xf7, 0x3d, 0xfb, 0x21, 0xfb, 0x3d, 0xfb, + 0x21, 0x5, 0xf7, 0x51, 0x5c, 0x15, 0xf7, 0x77, 0xf7, 0x50, 0xfb, 0x73, + 0xf7, 0x50, 0x73, 0x5a, 0xf7, 0x3d, 0xfb, 0x1f, 0xfb, 0x40, 0xfb, 0x21, + 0x5, 0xe, 0xd1, 0xf8, 0xc, 0x1, 0xf7, 0x2b, 0xf7, 0xbd, 0x3, 0xf7, + 0x2b, 0xf7, 0x96, 0x15, 0xf7, 0xa3, 0xfb, 0x50, 0xa5, 0xb3, 0xfb, 0x66, + 0xf7, 0x28, 0xf7, 0x66, 0xf7, 0x27, 0x71, 0xb4, 0x5, 0xe, 0xd1, 0xf8, + 0xc, 0x1, 0xf7, 0x2f, 0xf7, 0xba, 0x3, 0xf7, 0x46, 0xd1, 0x15, 0xf7, + 0xa3, 0xf7, 0x50, 0xfb, 0xa3, 0xf7, 0x50, 0x70, 0x62, 0xf7, 0x67, 0xfb, + 0x27, 0xfb, 0x63, 0xfb, 0x28, 0x5, 0xe, 0x8b, 0xc2, 0xf7, 0xf0, 0xc2, + 0xf7, 0x8, 0xc2, 0x1, 0xf5, 0xc3, 0xf7, 0xab, 0xc3, 0x3, 0x9e, 0x16, + 0xf7, 0x83, 0xc2, 0x2b, 0xf7, 0x99, 0x6, 0xb6, 0xbb, 0xcb, 0xb7, 0xce, + 0x1b, 0xe0, 0x9a, 0x59, 0x54, 0x1f, 0xfb, 0x87, 0x36, 0x54, 0xf7, 0x76, + 0xc2, 0x36, 0xf7, 0x9d, 0x7, 0xca, 0x6e, 0xd6, 0xfb, 0x13, 0x4a, 0x4e, + 0x66, 0x5e, 0x56, 0x1e, 0xf7, 0x91, 0xfb, 0x24, 0x54, 0xe3, 0xfc, 0x9b, + 0x34, 0x7, 0xe, 0xf8, 0x85, 0xf7, 0x43, 0x1, 0xf7, 0x17, 0xf7, 0xe6, + 0x3, 0xf7, 0x17, 0xf8, 0x9d, 0x71, 0xa, 0x7d, 0xfb, 0x2b, 0x71, 0xa, + 0xe, 0xf7, 0x7b, 0xc1, 0x1, 0xf2, 0xf8, 0x1e, 0x3, 0xf2, 0xf7, 0x7b, + 0x15, 0xf8, 0x1e, 0xc1, 0xfc, 0x1e, 0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xd9, + 0xc2, 0xed, 0xf7, 0x10, 0x81, 0xa, 0xf7, 0x95, 0x7e, 0xa, 0xfb, 0x36, + 0xfd, 0x25, 0x15, 0xf8, 0x2e, 0xc2, 0xfb, 0x43, 0xf8, 0x10, 0xfb, 0x5d, + 0x54, 0xf7, 0x24, 0xfb, 0xd9, 0xfb, 0x46, 0x6, 0xe, 0x6f, 0xa, 0xf7, + 0x31, 0xf8, 0x82, 0x15, 0xf7, 0xb7, 0xf1, 0x69, 0xd7, 0xfb, 0xa1, 0xfb, + 0x27, 0x5, 0x59, 0xfc, 0xa1, 0x15, 0x35, 0xa, 0xe, 0x8b, 0xc2, 0xf7, + 0xdd, 0x82, 0xa, 0x68, 0xa, 0xc3, 0x3, 0xe9, 0xf8, 0x86, 0x15, 0xb4, + 0x79, 0xf7, 0x29, 0xf7, 0xa, 0xf7, 0x27, 0xfb, 0xa, 0xb6, 0x9d, 0xfb, + 0x29, 0xf7, 0x30, 0x5, 0x3a, 0x6, 0xfb, 0x29, 0xfd, 0x22, 0x15, 0x35, + 0xa, 0xe, 0x8b, 0xc2, 0xf7, 0xdb, 0xc2, 0xe8, 0xf7, 0x7, 0x12, 0xf7, + 0x3a, 0xe2, 0xa0, 0xc3, 0x7e, 0xe0, 0x13, 0xf8, 0xea, 0x16, 0x35, 0xa, + 0x13, 0xf4, 0xf7, 0x72, 0xf8, 0x6f, 0x59, 0xa, 0xe, 0x6f, 0xa, 0xf7, + 0x1c, 0xf8, 0xe8, 0x15, 0xf7, 0xb9, 0x25, 0x96, 0xaa, 0xfb, 0xa2, 0xf7, + 0x27, 0x5, 0x40, 0xfd, 0x34, 0x15, 0x35, 0xa, 0xe, 0xfb, 0x31, 0xc1, + 0xf8, 0x76, 0xc5, 0xee, 0xf7, 0x10, 0x1, 0xf7, 0x18, 0xc4, 0xf7, 0xa9, + 0xc7, 0x3, 0xf7, 0x8, 0x7e, 0xa, 0x60, 0xfd, 0x8c, 0x15, 0x55, 0xf7, + 0x3f, 0xc1, 0x54, 0xf8, 0xae, 0x25, 0x54, 0xb8, 0xfc, 0x77, 0x7, 0xf7, + 0xbc, 0xf9, 0x17, 0x15, 0xd5, 0xf7, 0x9, 0x41, 0x6, 0xfb, 0x2, 0xfd, + 0x7a, 0x15, 0x7c, 0x55, 0x5, 0x85, 0x91, 0xb6, 0x7f, 0xbf, 0x1b, 0xef, + 0xa1, 0xbd, 0xf7, 0xc, 0x1f, 0xf8, 0x3c, 0xfb, 0x32, 0x51, 0xed, 0xfb, + 0xf4, 0x7, 0x32, 0x88, 0x62, 0x50, 0x56, 0x89, 0x93, 0x95, 0x6c, 0x1e, + 0xe, 0xfb, 0x31, 0xc1, 0xf8, 0x7b, 0xc0, 0xf2, 0xf7, 0x9, 0x1, 0xf8, + 0x28, 0xc7, 0x3, 0xf8, 0x2, 0xf8, 0xb0, 0x15, 0xd5, 0xf7, 0x9, 0x41, + 0x6, 0xfb, 0x70, 0xfd, 0x7a, 0x15, 0x81, 0x53, 0x5, 0x82, 0xb5, 0xbf, + 0x84, 0xbf, 0x1b, 0xef, 0xdd, 0xbd, 0xf7, 0xc, 0x1f, 0xf8, 0x3c, 0xfb, + 0xd2, 0x56, 0xf7, 0x96, 0xfb, 0xf9, 0x7, 0x32, 0x53, 0x62, 0x49, 0x56, + 0x5b, 0x96, 0x92, 0x68, 0x1e, 0xe, 0x8b, 0xc2, 0xf7, 0xda, 0xc2, 0xf7, + 0x1e, 0xc2, 0x1, 0xf7, 0xa, 0xc3, 0x3, 0xaa, 0x16, 0xf7, 0x23, 0xf7, + 0x5a, 0x6, 0xc5, 0xb5, 0xb4, 0x6a, 0xe0, 0x32, 0xbd, 0x4c, 0x19, 0x52, + 0x54, 0xf7, 0x6d, 0xc2, 0x2c, 0x6, 0x4d, 0xda, 0x4b, 0xd3, 0x3f, 0xc9, + 0xf7, 0x33, 0xf7, 0x5, 0x18, 0xee, 0xc2, 0xfb, 0x72, 0x54, 0xba, 0x6, + 0xfb, 0x48, 0xfb, 0x14, 0x5, 0xf8, 0xc, 0xfb, 0x23, 0x54, 0xe2, 0xfc, + 0x9b, 0x34, 0x7, 0xe, 0x8b, 0xc2, 0xf8, 0x9b, 0xc2, 0x68, 0xa, 0x73, + 0xa, 0xc2, 0xfb, 0x44, 0xf8, 0xd2, 0xfb, 0x6b, 0x54, 0xf7, 0x34, 0xfc, + 0x9b, 0xfb, 0x47, 0x6, 0xe, 0xb5, 0xc9, 0xf7, 0xbf, 0xd0, 0x1, 0xf0, + 0xce, 0x3, 0xf0, 0xf7, 0x6d, 0x15, 0xf8, 0x22, 0xfb, 0x43, 0x5, 0xc9, + 0x7, 0xfb, 0xdf, 0xf7, 0x2b, 0xf7, 0xdf, 0xf7, 0x28, 0x5, 0xd0, 0x7, + 0xfc, 0x22, 0xfb, 0x46, 0x5, 0xe, 0x76, 0xbe, 0xf7, 0x37, 0xc3, 0xd7, + 0xc5, 0xf7, 0x3e, 0xc5, 0x1, 0xf7, 0x39, 0xc2, 0x3, 0xd6, 0xaa, 0x15, + 0xa5, 0x57, 0xa8, 0x94, 0xd8, 0xac, 0xb0, 0x8a, 0x19, 0xaf, 0x8a, 0x90, + 0x8c, 0xad, 0x7a, 0x8, 0x81, 0x9f, 0x9f, 0x7d, 0xbc, 0x1b, 0xb6, 0xb6, + 0x9d, 0xa7, 0xaa, 0x1f, 0x76, 0xb8, 0x5, 0x7f, 0x7a, 0x61, 0x6f, 0x68, + 0x1b, 0x69, 0x81, 0x93, 0x9f, 0x6c, 0x1f, 0x99, 0x75, 0x73, 0x90, 0x7c, + 0x1b, 0x6a, 0x6f, 0x84, 0x7a, 0x67, 0x1f, 0xc3, 0xb7, 0x9b, 0xa9, 0x86, + 0xcd, 0x8, 0xf7, 0x19, 0xc3, 0xfb, 0x1d, 0x6, 0x87, 0x97, 0x88, 0xaf, + 0x88, 0xa7, 0x8, 0xf7, 0x27, 0xc5, 0x6, 0xfb, 0x2d, 0x8c, 0x5, 0x89, + 0xa3, 0x89, 0x97, 0x97, 0x1a, 0xe8, 0xc6, 0xa7, 0xbe, 0xbe, 0xbd, 0x72, + 0x59, 0xa4, 0x1e, 0xc0, 0x9e, 0x5, 0xc4, 0x70, 0x50, 0xc4, 0x2f, 0x1b, + 0x22, 0x4e, 0x3f, 0x36, 0x7b, 0x8d, 0x78, 0x8e, 0x6c, 0x1f, 0x2e, 0x4f, + 0xef, 0x6, 0x8f, 0x6f, 0x8b, 0x69, 0x8f, 0x7e, 0x8, 0xfb, 0x0, 0x53, + 0xf7, 0x4, 0x6, 0x96, 0x4c, 0x53, 0x5a, 0x46, 0x59, 0x8, 0xe, 0xf7, + 0xc7, 0xc9, 0x1, 0xf8, 0x54, 0xc2, 0x3, 0xf8, 0x54, 0xf7, 0xc7, 0x15, + 0xfb, 0x5b, 0xc2, 0xf7, 0x99, 0xfc, 0x3e, 0x4d, 0x7, 0xe, 0x8b, 0xc3, + 0xf8, 0x99, 0xc3, 0x1, 0xf7, 0xa5, 0x73, 0xa, 0xc3, 0xfb, 0x45, 0xf7, + 0x88, 0x6, 0xf7, 0x18, 0xc0, 0x5, 0xc3, 0x7, 0xfb, 0x18, 0x55, 0x5, + 0xf7, 0xa6, 0xfb, 0x78, 0x53, 0xf7, 0x41, 0xfb, 0x84, 0x7, 0xfb, 0x19, + 0x55, 0x5, 0x54, 0x7, 0xf7, 0x19, 0xc1, 0x5, 0xfb, 0x72, 0xfb, 0x46, + 0x7, 0xe, 0x8b, 0xc2, 0xf7, 0xdf, 0xc2, 0x1, 0xc2, 0xc4, 0xf7, 0x3c, + 0xc3, 0xf7, 0x2c, 0xc4, 0x3, 0xc2, 0x16, 0xf7, 0xd, 0xc1, 0x4b, 0xf7, + 0xa2, 0x6, 0xa7, 0x9f, 0xa1, 0xad, 0xba, 0x1b, 0xd0, 0x95, 0x40, 0x81, + 0x1f, 0xfb, 0xc1, 0xf7, 0xd, 0xc2, 0x4a, 0xf7, 0x96, 0x7, 0x96, 0xa7, + 0xca, 0xc4, 0xc9, 0x90, 0x54, 0x75, 0x1e, 0xfb, 0xca, 0xf7, 0x4, 0xc2, + 0x54, 0xf7, 0x96, 0x7, 0xcd, 0x6a, 0xc9, 0x3d, 0x56, 0x6e, 0x68, 0x68, + 0x6f, 0x1e, 0xaf, 0x7c, 0x62, 0xad, 0x55, 0x1b, 0x5e, 0x6f, 0x6f, 0x6e, + 0x6e, 0x1f, 0xb7, 0xfb, 0x4, 0x55, 0xc2, 0x7, 0xe, 0xf8, 0xa1, 0xb3, + 0x1, 0xf7, 0xc, 0xf7, 0xfc, 0x3, 0xf7, 0xc, 0xf8, 0xa1, 0x15, 0xf7, + 0xfc, 0xb3, 0xfb, 0xfc, 0x6, 0xe, 0xf7, 0x7c, 0xbe, 0x1, 0xdb, 0xf8, + 0x4c, 0x3, 0xdb, 0xf7, 0x7c, 0x15, 0xf8, 0x4c, 0xbe, 0xfc, 0x4c, 0x6, + 0xe, 0xfb, 0x1c, 0x76, 0xf7, 0x2c, 0xbf, 0x62, 0xb4, 0x62, 0xc1, 0xf7, + 0xcd, 0xc0, 0x12, 0xf7, 0x3, 0xc2, 0xf7, 0x9f, 0xc2, 0x13, 0xce, 0xf7, + 0x3a, 0xae, 0x15, 0x6f, 0xa7, 0xb1, 0x7f, 0xb3, 0x1b, 0xc8, 0xcb, 0xae, + 0xc5, 0xaf, 0x1f, 0x13, 0xae, 0x39, 0xf7, 0x1d, 0x7, 0x13, 0x9e, 0xc1, + 0x39, 0xf8, 0x2, 0xfb, 0x1d, 0x56, 0xdd, 0xfb, 0x18, 0x7, 0x13, 0xce, + 0x5a, 0x68, 0xfb, 0x25, 0xfb, 0x11, 0x49, 0x62, 0xb8, 0xc6, 0x1e, 0xf7, + 0xa7, 0xfb, 0x1d, 0x56, 0xdd, 0xfc, 0xa6, 0xc2, 0x7, 0xe, 0xc9, 0x76, + 0x1, 0xe1, 0xdb, 0x15, 0xaf, 0x65, 0xf7, 0x45, 0xf7, 0x43, 0xf7, 0x44, + 0xfb, 0x42, 0xb2, 0xb2, 0xfb, 0x44, 0xf7, 0x43, 0xf7, 0x44, 0xf7, 0x44, + 0x69, 0xb4, 0xfb, 0x49, 0xfb, 0x46, 0xfb, 0x43, 0xf7, 0x42, 0x65, 0x64, + 0xf7, 0x43, 0xfb, 0x43, 0x5, 0xe, 0x8b, 0xc2, 0xf7, 0xe0, 0xc2, 0x1, + 0xf7, 0x1, 0xc2, 0xf7, 0xa5, 0xc2, 0x3, 0xa4, 0x16, 0xf7, 0x73, 0xc2, + 0x37, 0xf7, 0x85, 0x6, 0xb8, 0xb5, 0xd0, 0xb9, 0xc9, 0x1b, 0xb7, 0xc3, + 0x7e, 0x47, 0x1f, 0xfb, 0x8f, 0x38, 0x54, 0xf7, 0x70, 0xc2, 0x39, 0xf7, + 0x90, 0x7, 0xe1, 0x5a, 0xbc, 0x21, 0x45, 0x45, 0x5e, 0x62, 0x6a, 0x1e, + 0xe1, 0xfb, 0x1f, 0x54, 0xdf, 0xfb, 0xe0, 0x37, 0x7, 0xe, 0x7c, 0xc4, + 0xf7, 0x4a, 0xc9, 0xf7, 0xa9, 0xc6, 0x1, 0xf5, 0xc7, 0xf7, 0xa2, 0xc5, + 0x3, 0xf5, 0x7c, 0x15, 0xf7, 0x8d, 0xf7, 0x1f, 0xf7, 0x5, 0xf7, 0x7c, + 0xf7, 0x62, 0x2d, 0xe1, 0xfb, 0x6, 0x23, 0x3f, 0x27, 0x20, 0x28, 0xcb, + 0x2f, 0xf7, 0x2, 0xd9, 0xbc, 0xb9, 0xb3, 0xa8, 0x1f, 0xfb, 0x5a, 0xfb, + 0x34, 0x3d, 0xfb, 0x3e, 0x93, 0x1e, 0xf7, 0xd9, 0xf7, 0xf2, 0x15, 0x54, + 0x70, 0x59, 0x58, 0x4a, 0x1b, 0x43, 0x58, 0xc0, 0xd9, 0xc5, 0xab, 0xe3, + 0xe3, 0xe2, 0xc1, 0x2d, 0x3e, 0x8f, 0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0xed, + 0xc0, 0x5b, 0xc0, 0xc7, 0xbb, 0x8c, 0xbc, 0x12, 0xa4, 0xf7, 0x20, 0x54, + 0xc2, 0xf7, 0xa5, 0xc1, 0x13, 0xbd, 0xeb, 0xf8, 0xa1, 0x15, 0xbe, 0x81, + 0x5, 0x99, 0x8f, 0x9f, 0xae, 0xaf, 0x1b, 0xad, 0xaa, 0x85, 0x7c, 0xa1, + 0x1f, 0x7c, 0xa1, 0x9b, 0x7e, 0xb4, 0x1b, 0xc9, 0xb6, 0xb6, 0xc2, 0x9e, + 0x1f, 0x59, 0x94, 0x5, 0x72, 0x82, 0x6e, 0x69, 0x67, 0x1b, 0x76, 0x7a, + 0x97, 0x98, 0x78, 0x1f, 0x9c, 0x73, 0x71, 0x93, 0x5f, 0x1b, 0x58, 0x56, + 0x74, 0x4a, 0x75, 0x1f, 0x44, 0xfc, 0xa1, 0x15, 0xf7, 0x73, 0xbf, 0x38, + 0xf7, 0x93, 0x6, 0xb7, 0xb5, 0xd0, 0xbe, 0xc8, 0x1b, 0xb7, 0xc4, 0x7f, + 0x49, 0x1f, 0xfb, 0xa4, 0x38, 0x57, 0xf7, 0x6f, 0xbf, 0x39, 0xf7, 0xa5, + 0x7, 0xdd, 0x62, 0xbb, 0x2a, 0x45, 0x47, 0x65, 0x5f, 0x58, 0x1e, 0x13, + 0xdd, 0xd0, 0xfb, 0x20, 0x56, 0x7, 0x13, 0xdb, 0xe0, 0xfb, 0xe5, 0x6, + 0x13, 0xdd, 0x36, 0x6, 0xe, 0xf7, 0x1f, 0xc1, 0xf7, 0x35, 0xc1, 0x1, + 0xf7, 0x3b, 0x3d, 0x15, 0xbd, 0x6, 0x95, 0xf7, 0x6d, 0x5, 0xf7, 0x23, + 0x6, 0x86, 0xfb, 0x6d, 0x5, 0xbd, 0x6, 0x91, 0xf7, 0x6d, 0x5, 0xef, + 0xc1, 0x2b, 0x6, 0x8f, 0xf7, 0x35, 0x5, 0xe7, 0xc1, 0x32, 0x6, 0x90, + 0xf7, 0x6f, 0x5, 0x58, 0x6, 0x87, 0xfb, 0x6f, 0x5, 0xfb, 0x25, 0x6, + 0x8e, 0xf7, 0x6f, 0x5, 0x57, 0x6, 0x88, 0xfb, 0x6f, 0x5, 0x20, 0x55, + 0xf4, 0x6, 0x86, 0xfb, 0x35, 0x5, 0x27, 0x55, 0xec, 0x6, 0xc1, 0xc1, + 0x15, 0x90, 0xf7, 0x35, 0x5, 0xf7, 0x24, 0x6, 0x86, 0xfb, 0x35, 0x5, + 0xe, 0x7a, 0xc2, 0xf7, 0xf2, 0xc2, 0x1, 0xc7, 0xc1, 0xf8, 0x2, 0xc6, + 0x3, 0xc7, 0xf7, 0x67, 0x15, 0xfb, 0x1f, 0xf6, 0x32, 0xf7, 0x18, 0xf7, + 0x1e, 0xf1, 0xe6, 0xf7, 0x1e, 0xf7, 0x22, 0x24, 0xe4, 0xfb, 0x1d, 0xfb, + 0x1f, 0x27, 0x34, 0xfb, 0x25, 0x1e, 0xc1, 0x16, 0xf7, 0x6, 0xd8, 0xca, + 0xf5, 0xf5, 0xd8, 0x4d, 0xfb, 0x6, 0xfb, 0xa, 0x43, 0x53, 0xfb, 0x3, + 0x22, 0x3d, 0xc5, 0xf7, 0x7, 0x1e, 0xe, 0x63, 0xa, 0x58, 0xa, 0xf7, + 0x4c, 0xf8, 0x95, 0x15, 0xf7, 0xa6, 0xde, 0x6b, 0xd7, 0xfb, 0x92, 0xfb, + 0x13, 0x5, 0xfb, 0x2, 0xfb, 0xdd, 0x21, 0xa, 0x63, 0xa, 0xf7, 0x62, + 0x77, 0x58, 0xa, 0xf7, 0x32, 0xf8, 0x7d, 0x15, 0xf7, 0x22, 0xf7, 0x3, + 0xf7, 0x20, 0xfb, 0x3, 0xb3, 0x9d, 0xfb, 0x22, 0xf7, 0x27, 0x5, 0x3f, + 0x6, 0xfb, 0x23, 0xfb, 0x27, 0x5, 0x52, 0xfb, 0xb7, 0x21, 0xa, 0x63, + 0xa, 0xd2, 0xf7, 0x8, 0x58, 0xa, 0xf7, 0xf6, 0xf8, 0x9b, 0x15, 0xda, + 0xf7, 0x8, 0x3c, 0x6, 0xfb, 0x54, 0xfb, 0x8, 0x15, 0xdd, 0xf7, 0x8, + 0x39, 0x6, 0x27, 0xfc, 0x37, 0x21, 0xa, 0x7c, 0xc2, 0xf7, 0x2c, 0xc6, + 0xf7, 0x1b, 0xc2, 0x1, 0xa9, 0xc1, 0xf7, 0x59, 0xc0, 0xf7, 0x4b, 0xbf, + 0x3, 0xf7, 0xc8, 0xd3, 0x15, 0x58, 0xa4, 0xb2, 0x67, 0xe0, 0x1b, 0xb6, + 0xac, 0x96, 0x97, 0xaf, 0x1f, 0x81, 0xc1, 0x5, 0x81, 0x6f, 0x65, 0x7f, + 0x68, 0x1b, 0x3f, 0x55, 0xbb, 0xf3, 0x91, 0x1f, 0xf7, 0x7f, 0x6, 0xec, + 0x8c, 0x82, 0xf7, 0x2c, 0xfb, 0x14, 0x1b, 0x48, 0x66, 0x5a, 0x6d, 0x7d, + 0x1f, 0xb9, 0x76, 0x63, 0xac, 0x4b, 0x1b, 0xfb, 0x1d, 0x74, 0xfb, 0x21, + 0xfb, 0x3, 0xfb, 0x51, 0xf7, 0x9, 0x7b, 0xad, 0xe3, 0xa9, 0xcb, 0xa3, + 0x94, 0x1f, 0xa6, 0xf7, 0x47, 0x15, 0xcb, 0x81, 0xba, 0xcf, 0xc5, 0x1b, + 0xd1, 0x9c, 0x3b, 0x57, 0x1f, 0xfc, 0x45, 0x52, 0x15, 0xe3, 0x9d, 0xf3, + 0xdf, 0xd9, 0x9c, 0x35, 0x49, 0x47, 0x90, 0xfb, 0x12, 0x24, 0x31, 0x82, + 0xf7, 0x12, 0xa7, 0x1e, 0xe, 0xfb, 0x2b, 0xc1, 0x1, 0xf7, 0x78, 0xcd, + 0x3, 0xf7, 0xb9, 0x16, 0x67, 0x7b, 0x6e, 0x6a, 0x67, 0x1a, 0x61, 0xaf, + 0x73, 0xb1, 0xa1, 0xa1, 0x93, 0x9a, 0x9c, 0x1e, 0x93, 0xc3, 0x5, 0x7c, + 0x82, 0x75, 0x81, 0x79, 0x1b, 0x7b, 0x7f, 0x95, 0x9f, 0xb1, 0xba, 0x9d, + 0xa4, 0x96, 0x1f, 0xe, 0x63, 0xa, 0x58, 0xa, 0xf7, 0x36, 0xf8, 0xe7, + 0x15, 0xf7, 0xa8, 0x24, 0x96, 0xaa, 0xfb, 0x93, 0xf7, 0x29, 0x5, 0xfb, + 0x18, 0xfc, 0x5c, 0x21, 0xa, 0x8b, 0xc2, 0xf8, 0xcb, 0x77, 0x1, 0xf7, + 0xa9, 0xc2, 0x3, 0xea, 0x16, 0xf8, 0x2d, 0xc2, 0xfb, 0x40, 0xf8, 0xcb, + 0x6, 0xfb, 0x71, 0x58, 0x5, 0x54, 0x7, 0xf7, 0x3a, 0xaf, 0x5, 0xfc, + 0x85, 0xfb, 0x4a, 0x7, 0xe, 0x5d, 0xc1, 0x5f, 0x76, 0xf7, 0xd4, 0xc0, + 0x7c, 0xc1, 0xf7, 0xca, 0x77, 0x12, 0xf0, 0xc0, 0xf8, 0x3, 0xbe, 0x13, + 0x5e, 0xb9, 0x6e, 0x15, 0xb0, 0x6f, 0xf8, 0x9a, 0xf9, 0x46, 0x66, 0xab, + 0x5, 0xfc, 0xc8, 0xfc, 0x0, 0x15, 0xf7, 0x94, 0xc1, 0x25, 0xf7, 0xc6, + 0x6, 0xfb, 0x25, 0x73, 0x5, 0x55, 0x7, 0xe7, 0x99, 0x5, 0xfb, 0x86, + 0x26, 0x7, 0xf7, 0xfa, 0xfb, 0xf2, 0x15, 0x13, 0xae, 0x58, 0xf7, 0x6a, + 0xc1, 0xfb, 0x22, 0x7, 0xf1, 0xe5, 0xb3, 0xb0, 0xd2, 0x1a, 0xc3, 0x69, + 0xc1, 0x46, 0x65, 0x67, 0x78, 0x69, 0x73, 0x1e, 0x4c, 0xb8, 0x7, 0xb0, + 0x84, 0xa9, 0xa5, 0xa9, 0x1b, 0xae, 0x9c, 0x6c, 0x69, 0x59, 0x24, 0x39, + 0x4f, 0x4e, 0x1f, 0xe, 0x5e, 0xc1, 0x5e, 0x76, 0xf7, 0xf, 0xc3, 0xf7, + 0x47, 0xc1, 0xf7, 0xc6, 0x77, 0x12, 0xef, 0xbc, 0xf7, 0xcc, 0xbd, 0x13, + 0xbe, 0xf7, 0xd6, 0xc8, 0x15, 0xf7, 0x1f, 0x57, 0x54, 0x55, 0xf7, 0x2b, + 0xc1, 0x5d, 0xbf, 0xb9, 0xc3, 0x5d, 0xf7, 0x55, 0x51, 0x6, 0xfb, 0x17, + 0xfb, 0x66, 0x5, 0xca, 0x9c, 0x15, 0xd7, 0xf7, 0x8, 0x5, 0xfb, 0x8, + 0x7, 0xfc, 0x14, 0xfb, 0x24, 0x15, 0x13, 0x7e, 0xb3, 0x6d, 0xf8, 0x77, + 0xf9, 0x47, 0x63, 0x9f, 0x5, 0xfc, 0xc4, 0xfb, 0xf5, 0x15, 0xf7, 0x87, + 0xc1, 0x2d, 0xf7, 0xc6, 0x6, 0xfb, 0x19, 0x73, 0x5, 0x55, 0x7, 0xdf, + 0x99, 0x5, 0xfb, 0x86, 0x27, 0x7, 0xe, 0xf7, 0x8d, 0xc3, 0xf7, 0xd1, + 0x77, 0x68, 0xa, 0xc1, 0x3, 0xf7, 0x40, 0xf7, 0x8d, 0x15, 0xf7, 0x94, + 0xc3, 0x27, 0xf7, 0xd1, 0x6, 0xfb, 0x25, 0x71, 0x5, 0x53, 0x7, 0xe6, + 0x9a, 0x5, 0xfb, 0x8e, 0x25, 0x7, 0xe, 0xf7, 0x8d, 0xbf, 0xe7, 0xbe, + 0xe4, 0xba, 0x1, 0xf7, 0xf1, 0xb7, 0x3, 0xf7, 0xf2, 0xf7, 0x95, 0x15, + 0xe8, 0xc2, 0x59, 0xf7, 0x27, 0x6, 0xd6, 0x75, 0xb9, 0x3e, 0x5f, 0x5b, + 0x7a, 0x7c, 0x69, 0x1e, 0x96, 0x5b, 0x5, 0xa8, 0xc0, 0xb0, 0x8f, 0xa8, + 0x1b, 0xac, 0x9d, 0x6a, 0x58, 0x1f, 0x7e, 0x7, 0x8f, 0x75, 0x73, 0x8f, + 0x73, 0x1b, 0x26, 0x76, 0x4a, 0x69, 0x5c, 0xac, 0x5a, 0xc2, 0xb3, 0xaf, + 0xa6, 0xad, 0xa8, 0x1f, 0x8a, 0xcf, 0x15, 0x5f, 0x72, 0x66, 0x6a, 0x64, + 0x1b, 0x70, 0x76, 0x9e, 0xa4, 0xa4, 0xa4, 0xa2, 0xba, 0xb1, 0xb2, 0x7c, + 0x8b, 0x1f, 0xe, 0xf7, 0x8d, 0xc1, 0xf7, 0x75, 0xbf, 0x1, 0xf7, 0x31, + 0xc2, 0xf7, 0x44, 0xc2, 0x3, 0xf7, 0x31, 0xf8, 0x34, 0x15, 0xfb, 0x13, + 0xed, 0x63, 0xb8, 0xc3, 0xe2, 0xba, 0xf7, 0xa, 0xe5, 0x55, 0xd7, 0x34, + 0x4b, 0x3a, 0x59, 0xfb, 0x6, 0x1e, 0xc2, 0x16, 0xc5, 0xad, 0xc1, 0xc4, + 0xd1, 0x9a, 0x3b, 0x6b, 0x45, 0x63, 0x60, 0x5d, 0x5f, 0x5d, 0xb7, 0xd0, + 0x1e, 0xe, 0x7f, 0xbd, 0x69, 0x76, 0xf8, 0x33, 0xbd, 0x8e, 0x77, 0x12, + 0xc8, 0xbf, 0xf8, 0x0, 0xc2, 0x13, 0x6c, 0xc8, 0xa3, 0x15, 0xaf, 0x62, + 0xc0, 0xbe, 0x5, 0x13, 0x9c, 0x69, 0xb7, 0xc1, 0x7f, 0xbe, 0x1b, 0xf7, + 0x12, 0xf6, 0xdd, 0xf7, 0x29, 0xbf, 0x7e, 0xbf, 0x6c, 0xb1, 0x1f, 0xbd, + 0xbc, 0x67, 0xb4, 0x57, 0x58, 0x5, 0x13, 0xac, 0xac, 0x60, 0x57, 0x9a, + 0x54, 0x1b, 0xfb, 0x2d, 0x35, 0x22, 0xfb, 0x11, 0x55, 0x9c, 0x54, 0xac, + 0x65, 0x1f, 0xda, 0x8d, 0x15, 0xf7, 0x96, 0xf7, 0x8d, 0x5, 0x98, 0x77, + 0x9b, 0x69, 0x4b, 0x1a, 0x50, 0x5a, 0x20, 0xfb, 0x16, 0x64, 0x65, 0x99, + 0xa0, 0x6c, 0x1e, 0x63, 0xb0, 0x15, 0x73, 0xa7, 0x7e, 0xb3, 0xb3, 0x1a, + 0xf6, 0xdd, 0xd4, 0xf3, 0xa9, 0xb7, 0x7f, 0x72, 0xb0, 0x1e, 0xe, 0x63, + 0xa, 0xc9, 0xbd, 0x9c, 0xbc, 0x12, 0xc9, 0xc5, 0xf7, 0xfa, 0xc7, 0x17, + 0xf7, 0x0, 0xf8, 0xa1, 0x15, 0xbb, 0x80, 0x5, 0x9a, 0x8f, 0x9e, 0xbb, + 0xad, 0x1b, 0xad, 0x9e, 0x76, 0x79, 0xa3, 0x1f, 0x13, 0xfc, 0x7c, 0x9e, + 0xa0, 0x7e, 0xad, 0x1b, 0x13, 0xec, 0xc6, 0xb9, 0xbb, 0xc2, 0x9d, 0x1f, + 0x5c, 0x94, 0x5, 0x73, 0x82, 0x70, 0x65, 0x69, 0x1b, 0x77, 0x7c, 0x94, + 0x96, 0x7c, 0x1f, 0x13, 0xdc, 0x9e, 0x71, 0x72, 0xa6, 0x61, 0x1b, 0x5b, + 0x59, 0x67, 0x4a, 0x76, 0x1f, 0x5d, 0xfb, 0xc9, 0x21, 0xa, 0x66, 0xa, + 0xe7, 0xc2, 0xf7, 0xf1, 0xc4, 0x13, 0xdc, 0x92, 0x21, 0x15, 0x58, 0xf7, + 0xbd, 0xbe, 0xfb, 0x31, 0xf7, 0x5f, 0x7, 0x67, 0xac, 0xc3, 0x62, 0xea, + 0x1b, 0xf7, 0x11, 0xec, 0xe8, 0xf7, 0x12, 0xf7, 0x4, 0x2b, 0xde, 0xfb, + 0xe, 0x33, 0x4d, 0x70, 0x60, 0x65, 0x1f, 0x13, 0xec, 0xcc, 0xfb, 0x20, + 0x58, 0xe0, 0xfc, 0x78, 0x7, 0xc6, 0xf7, 0xe4, 0x15, 0x13, 0xdc, 0xe4, + 0xd8, 0xca, 0xeb, 0xeb, 0xd7, 0x4c, 0x32, 0x32, 0x3f, 0x43, 0x2b, 0x2b, + 0x3e, 0xd3, 0xe4, 0x1e, 0xe, 0xf8, 0xa8, 0xa9, 0x1, 0xf7, 0xd1, 0xb7, + 0xd9, 0xb6, 0x3, 0xf7, 0xd1, 0x3d, 0x15, 0xb7, 0xf8, 0xf6, 0xd9, 0xfc, + 0xf6, 0xb6, 0xf8, 0xf6, 0xbb, 0xa9, 0xfb, 0x6e, 0x6, 0xfb, 0x38, 0x3c, + 0x4f, 0xfb, 0xa, 0x4d, 0xc2, 0x2a, 0xf7, 0x55, 0x8a, 0x1f, 0xe, 0xfb, + 0x0, 0xf9, 0x6e, 0x1, 0xf7, 0x6a, 0xc2, 0x3, 0xf8, 0x16, 0xf9, 0x2, + 0x15, 0x56, 0x6, 0x51, 0x31, 0x4e, 0xfb, 0x29, 0xfb, 0x27, 0x1a, 0x26, + 0xbb, 0xfb, 0x1a, 0xd1, 0xfb, 0x1, 0x1e, 0xc1, 0x6, 0x4e, 0xf7, 0x7, + 0x53, 0xe5, 0xf7, 0x1f, 0x1a, 0xf7, 0x3a, 0xd1, 0xf7, 0x1c, 0xba, 0xdf, + 0x1e, 0xe, 0xfb, 0x0, 0xf9, 0x6e, 0x1, 0xf7, 0xdf, 0xc2, 0x3, 0xf7, + 0x6a, 0xfb, 0x0, 0x15, 0xc0, 0x6, 0xc5, 0xe5, 0xc8, 0xf7, 0x29, 0xf7, + 0x27, 0x1a, 0xf0, 0x5b, 0xf7, 0x1a, 0x45, 0xf7, 0x1, 0x1e, 0x55, 0x6, + 0xc8, 0xfb, 0x7, 0xc3, 0x31, 0xfb, 0x1f, 0x1a, 0xfb, 0x3a, 0x45, 0xfb, + 0x1c, 0x5c, 0x37, 0x1e, 0xe, 0x7c, 0xc1, 0xf7, 0x22, 0xc4, 0xf7, 0x20, + 0xc1, 0xf7, 0x19, 0xc4, 0x12, 0xf7, 0x1, 0xc3, 0xc3, 0xc3, 0xa9, 0xc2, + 0xc4, 0xc2, 0x17, 0xf0, 0xf7, 0x5d, 0x15, 0xf8, 0x35, 0xf7, 0x3c, 0x78, + 0xba, 0xfc, 0x36, 0xfb, 0x38, 0x5, 0xf7, 0x58, 0xfb, 0x22, 0x65, 0xa, + 0x64, 0x6b, 0xab, 0xb2, 0x1e, 0x4b, 0xa, 0x53, 0xf8, 0x13, 0x65, 0xa, + 0x1e, 0x13, 0x3a, 0x64, 0x6b, 0xab, 0xb2, 0x1f, 0x4b, 0xa, 0xe, 0x7c, + 0xf7, 0x10, 0x7a, 0xa, 0xb7, 0x15, 0x65, 0xab, 0x76, 0xb1, 0xab, 0xb3, + 0xa0, 0xb1, 0xb2, 0x6b, 0xa5, 0x63, 0x65, 0x6b, 0x73, 0x62, 0x1e, 0xe, + 0xf7, 0x51, 0xf7, 0x1e, 0x1, 0xf7, 0x72, 0xf7, 0x30, 0x3, 0xf7, 0x72, + 0xf7, 0x95, 0x15, 0x69, 0xaa, 0x69, 0xbc, 0xb1, 0xb1, 0xa7, 0xb2, 0xaf, + 0x6d, 0xae, 0x5c, 0x5f, 0x68, 0x6c, 0x64, 0x1e, 0xe, 0x7c, 0xc2, 0xf7, + 0x21, 0xc1, 0xf7, 0x1d, 0xc2, 0xf7, 0x21, 0xc1, 0x12, 0xa4, 0xc3, 0x7d, + 0xc3, 0xf2, 0xc1, 0x7f, 0xc1, 0xa0, 0xc3, 0xf7, 0x25, 0xc1, 0x13, 0xfa, + 0xc0, 0xa4, 0xf8, 0x84, 0x15, 0x49, 0xbd, 0x51, 0xd9, 0xd4, 0xc1, 0xc4, + 0xcf, 0xcd, 0x62, 0xc6, 0x33, 0x3e, 0x5a, 0x4f, 0x49, 0x1e, 0xc3, 0x8a, + 0x15, 0xb6, 0xa7, 0xa9, 0xb9, 0xb8, 0xa5, 0x6a, 0x64, 0x69, 0x72, 0x68, + 0x5d, 0x61, 0x6b, 0xa5, 0xb5, 0x1e, 0xf7, 0x9a, 0xfc, 0x15, 0x3a, 0xa, + 0x13, 0xf5, 0xc0, 0xfb, 0xe0, 0x8c, 0x3a, 0xa, 0x27, 0xf2, 0x15, 0x13, + 0x0, 0x0, 0xf8, 0x46, 0xf7, 0x47, 0x75, 0xbe, 0xfc, 0x46, 0xfb, 0x47, + 0x5, 0xe, 0xcc, 0x76, 0xf7, 0x5a, 0xc1, 0xf7, 0x42, 0x77, 0x68, 0xa, + 0xc1, 0x3, 0xdb, 0xf7, 0x86, 0x15, 0xf7, 0x56, 0xfb, 0x5a, 0xc1, 0xf7, + 0x5a, 0xf7, 0x54, 0xc1, 0xfb, 0x54, 0xf7, 0x42, 0x55, 0xfb, 0x42, 0xfb, + 0x56, 0x6, 0xe, 0xb7, 0xc2, 0xf7, 0x76, 0xc2, 0xf7, 0x46, 0x77, 0x68, + 0xa, 0xc2, 0x3, 0xf7, 0xa6, 0xf7, 0x1e, 0x15, 0xc2, 0xf7, 0x4f, 0xf7, + 0x4c, 0xc2, 0xfb, 0x4c, 0xf7, 0x46, 0x54, 0xfb, 0x46, 0xfb, 0x4f, 0x54, + 0xf7, 0x4f, 0x6, 0xfb, 0x4f, 0xfb, 0xad, 0x15, 0xf8, 0x3e, 0xc2, 0xfc, + 0x3e, 0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x5c, 0xc2, 0xf7, 0x68, 0xc2, 0x1, + 0xf5, 0xc2, 0xf7, 0xab, 0xc2, 0x3, 0xa4, 0x7c, 0x15, 0xf7, 0x6d, 0xc2, + 0x3a, 0xf7, 0x5c, 0xf7, 0x8, 0x6, 0xa2, 0x6d, 0xb5, 0x4e, 0xb1, 0x4f, + 0x47, 0x47, 0x18, 0xaf, 0x67, 0xc7, 0xc7, 0x98, 0x74, 0x98, 0x77, 0x94, + 0x7a, 0x19, 0xf7, 0x18, 0xc2, 0x23, 0x6, 0x83, 0x97, 0x83, 0x9a, 0x81, + 0x9a, 0xd5, 0xd5, 0x18, 0x67, 0xaf, 0x4a, 0x4a, 0x70, 0xb5, 0x6d, 0xb7, + 0x74, 0xa8, 0x19, 0xcf, 0x90, 0xe4, 0xac, 0xf7, 0xf, 0x1a, 0xe1, 0x5b, + 0xd4, 0xfb, 0xe, 0x1e, 0xfb, 0xc0, 0x54, 0xdc, 0xfc, 0x67, 0x3a, 0x6, + 0xf7, 0x1c, 0xf7, 0x93, 0x15, 0xf7, 0x68, 0xf7, 0x26, 0x7, 0xd1, 0xca, + 0x72, 0x3a, 0xfb, 0x2, 0x24, 0x8f, 0x42, 0x1f, 0xe, 0x66, 0xa, 0xba, + 0xc4, 0xf7, 0xf1, 0xc2, 0x13, 0xec, 0xf7, 0xbc, 0x21, 0x15, 0x58, 0xf7, + 0xbd, 0xbe, 0x36, 0xf8, 0x78, 0xe0, 0xbe, 0xfb, 0x20, 0x4a, 0x7, 0x13, + 0xdc, 0xb6, 0x65, 0x4d, 0xa6, 0x33, 0x1b, 0xfb, 0xe, 0x2b, 0x38, 0xfb, + 0x4, 0xfb, 0x12, 0xec, 0x2e, 0xf7, 0x11, 0xea, 0xc3, 0xb4, 0xaf, 0xac, + 0x1f, 0xfb, 0x5f, 0x7, 0x87, 0xf7, 0xe4, 0x15, 0x32, 0x3e, 0x43, 0x2b, + 0x2b, 0x3f, 0xd3, 0xe4, 0xe4, 0xd7, 0xca, 0xeb, 0xeb, 0xd8, 0x4c, 0x32, + 0x1e, 0xe, 0x7c, 0xf7, 0xb, 0xf8, 0x34, 0xbf, 0x1, 0xf7, 0xa, 0xc1, + 0xaa, 0xf7, 0x19, 0xe7, 0xc0, 0x3, 0xf7, 0x86, 0xf7, 0x44, 0x15, 0xc2, + 0xcd, 0x6, 0xcc, 0x8f, 0xf7, 0xb, 0xb3, 0xf7, 0xc, 0x1a, 0xf7, 0x6, + 0x2c, 0xbf, 0x27, 0x4f, 0x4d, 0x79, 0x69, 0x5d, 0x1e, 0x27, 0xc1, 0xc9, + 0x7, 0xa7, 0xb0, 0xb4, 0x95, 0xb1, 0x1b, 0xd7, 0xcb, 0x5c, 0x4a, 0x29, + 0xfb, 0x5, 0x7c, 0x42, 0x7d, 0x1f, 0x64, 0xfb, 0x81, 0x4c, 0xa, 0xfb, + 0x31, 0xc1, 0xf7, 0xb, 0x76, 0xf7, 0xd2, 0xf7, 0x9, 0x1, 0xf7, 0xa, + 0xc0, 0xe6, 0xf7, 0x1b, 0xa9, 0xc1, 0x3, 0xf7, 0x9a, 0xf8, 0x9, 0x15, + 0x6c, 0xa5, 0x6e, 0xb4, 0xb1, 0xa9, 0xa5, 0xac, 0xa8, 0x70, 0xa8, 0x61, + 0x6a, 0x6a, 0x73, 0x6a, 0x1e, 0xb4, 0xfb, 0x52, 0x15, 0x40, 0x77, 0xfb, + 0x2, 0x67, 0xfb, 0xb, 0x1a, 0x21, 0xea, 0x50, 0xf1, 0xc6, 0xc7, 0x9b, + 0x9c, 0xba, 0x1e, 0xf7, 0xb, 0x55, 0x44, 0x7, 0x7b, 0x68, 0x63, 0x80, + 0x63, 0x1b, 0xfb, 0x5, 0x6f, 0xd3, 0xb0, 0xec, 0xf7, 0x6, 0xa0, 0xd4, + 0x98, 0x1f, 0xf7, 0x6, 0x54, 0x7, 0xe, 0xf8, 0xc2, 0x77, 0x1, 0xf7, + 0x58, 0xca, 0xdc, 0xca, 0x3, 0xf7, 0x62, 0xf7, 0xc7, 0x77, 0xa, 0xf7, + 0x37, 0xfb, 0x8f, 0x77, 0xa, 0xe, 0xfb, 0x1a, 0x6d, 0xa, 0xfb, 0x1a, + 0x45, 0xa, 0xf7, 0xdc, 0xf7, 0x7e, 0x8b, 0x77, 0x1, 0xf7, 0x1c, 0xf7, + 0xdc, 0x3, 0xf8, 0x29, 0xf7, 0xdc, 0x15, 0xc6, 0x6, 0x46, 0xf7, 0x7e, + 0x5, 0x2e, 0x6, 0x4a, 0xfb, 0x7e, 0x15, 0xc8, 0x6, 0x45, 0x5c, 0xa, + 0xf7, 0xdc, 0x6d, 0xa, 0xf7, 0xdc, 0x45, 0xa, 0xf7, 0xdc, 0x5f, 0xa, + 0xf7, 0xd6, 0xf7, 0xdc, 0x15, 0xc6, 0x6, 0x44, 0x5c, 0xa, 0xf7, 0xdc, + 0x5f, 0xa, 0xf7, 0x6e, 0xf7, 0xdc, 0x15, 0xc6, 0x6, 0xf3, 0x5c, 0xa, + 0xfb, 0x1a, 0x5f, 0xa, 0xf7, 0x6e, 0xfb, 0x1a, 0x15, 0xc6, 0x6, 0xf3, + 0x5c, 0xa, 0xf8, 0xc6, 0x77, 0x1, 0xf7, 0x97, 0xdd, 0x3, 0xf7, 0xae, + 0xf7, 0xc7, 0x15, 0xae, 0x6, 0xa3, 0xf7, 0x93, 0x5, 0x39, 0x6, 0xe, + 0x8b, 0xc1, 0xf7, 0xd4, 0xc1, 0x63, 0xc0, 0x12, 0xbd, 0xf7, 0x4a, 0x54, + 0xc2, 0x13, 0xb0, 0xbd, 0x16, 0xf8, 0xf, 0xc1, 0xfb, 0x59, 0xf7, 0x51, + 0x6, 0xf1, 0xf7, 0x2, 0xc2, 0xb6, 0xb6, 0x1b, 0xa4, 0x9e, 0x85, 0x69, + 0x92, 0x1f, 0xc5, 0x90, 0x5, 0xbf, 0x88, 0x6a, 0xaf, 0x54, 0x1b, 0x2c, + 0x3f, 0x36, 0x57, 0x54, 0x1f, 0x13, 0xd0, 0xf7, 0x10, 0xfb, 0x4a, 0x55, + 0x7, 0x13, 0xc8, 0xf7, 0x13, 0xfb, 0xd4, 0x6, 0x13, 0xd0, 0xfb, 0x13, + 0x6, 0xe, 0x79, 0xb9, 0xf8, 0x7, 0xba, 0xe4, 0xb8, 0x1, 0x8b, 0xb9, + 0xf7, 0x2f, 0xbb, 0xf7, 0xd, 0xbe, 0xf7, 0x17, 0xbb, 0x3, 0xf7, 0xaa, + 0x4, 0xfb, 0x37, 0xf7, 0x1c, 0xfb, 0x19, 0xf7, 0x3b, 0xf7, 0x36, 0xf7, + 0x1b, 0xf7, 0x14, 0xf7, 0x43, 0xf7, 0x3b, 0xfb, 0x1e, 0xf7, 0x14, 0xfb, + 0x33, 0xfb, 0x2f, 0xfb, 0x28, 0xfb, 0xc, 0xfb, 0x4a, 0x1e, 0xb9, 0x8d, + 0x15, 0xf7, 0x16, 0xf1, 0xf7, 0x11, 0xf7, 0x30, 0xf7, 0x22, 0xf5, 0xfb, + 0x8, 0xfb, 0x1d, 0xfb, 0x22, 0xfb, 0x1, 0xfb, 0x4, 0xfb, 0x21, 0xfb, + 0x1b, 0xfb, 0xd, 0xf7, 0x2, 0xf7, 0x22, 0x1e, 0xf7, 0x2f, 0xfb, 0x30, + 0x15, 0xbb, 0xf7, 0xe, 0xc0, 0x6, 0xd4, 0xfb, 0xe, 0x5, 0xc6, 0x6, + 0x3d, 0xf7, 0x1a, 0x5, 0xb1, 0x99, 0xa6, 0xba, 0xae, 0x1a, 0xd1, 0x4f, + 0xa1, 0x52, 0x1e, 0x24, 0x6, 0xbb, 0xfb, 0x2d, 0x15, 0xf5, 0xc1, 0x7, + 0xb8, 0xa1, 0x71, 0x74, 0x65, 0x67, 0x78, 0x6d, 0x1f, 0xe, 0xf8, 0x63, + 0xbd, 0xab, 0x8b, 0xab, 0xbd, 0x1, 0xf7, 0x6e, 0xbd, 0xcb, 0xbd, 0x14, + 0xe0, 0xf7, 0x6e, 0xf8, 0xb5, 0x15, 0x5d, 0xaf, 0x67, 0xb9, 0xb9, 0xaf, + 0xaf, 0xb9, 0xb9, 0x67, 0xaf, 0x5d, 0x5d, 0x67, 0x67, 0x5d, 0x1e, 0xbd, + 0x16, 0x9d, 0x99, 0x99, 0x9d, 0x9d, 0x99, 0x7d, 0x79, 0x79, 0x7d, 0x7d, + 0x79, 0x79, 0x7d, 0x99, 0x9d, 0x1e, 0xe, 0x7e, 0xc2, 0xf7, 0x2b, 0xc0, + 0xf7, 0x20, 0xc2, 0x12, 0xdf, 0xc2, 0x5a, 0xc1, 0xf7, 0xba, 0xc1, 0x69, + 0xc5, 0x13, 0xf4, 0xdf, 0x7f, 0x15, 0xc2, 0xb8, 0x6, 0x74, 0xbc, 0xc5, + 0x75, 0xdb, 0x1b, 0x13, 0xea, 0xf7, 0x3, 0xda, 0xc4, 0xe1, 0xf7, 0xb, + 0xfb, 0x28, 0x80, 0x32, 0x92, 0x1f, 0x5f, 0x8e, 0x30, 0x99, 0xc1, 0x1a, + 0xc9, 0xee, 0x92, 0xb6, 0xc2, 0xc2, 0x7a, 0x70, 0xb5, 0x1e, 0x50, 0xc1, + 0xf7, 0x32, 0x55, 0x63, 0x7, 0xa6, 0x5e, 0x55, 0x98, 0x53, 0x1b, 0xfb, + 0x2, 0x38, 0x5c, 0x35, 0x33, 0xf7, 0xc, 0x72, 0xce, 0x89, 0x1f, 0xc1, + 0x89, 0xf7, 0x13, 0x85, 0x4f, 0x1a, 0x45, 0x20, 0x7f, 0x66, 0x4c, 0x4b, + 0x9e, 0xb0, 0x5b, 0x1e, 0xc6, 0x54, 0x7, 0xe, 0x7c, 0xc2, 0x8b, 0xf7, + 0x27, 0x8b, 0xc1, 0x8b, 0xf7, 0x2b, 0x8b, 0xc2, 0x8b, 0xb7, 0x12, 0xde, + 0xc3, 0xf7, 0xbd, 0xc2, 0x17, 0xf7, 0x96, 0xf8, 0x7f, 0x15, 0xdd, 0x6, + 0xf7, 0x2a, 0xf7, 0x32, 0x60, 0x9f, 0xfb, 0x28, 0xfb, 0xe, 0xfb, 0x2d, + 0xf7, 0xd, 0x61, 0x77, 0x5, 0x76, 0xfd, 0x2b, 0x15, 0xc3, 0xc2, 0x6, + 0x74, 0xbd, 0xbe, 0x6b, 0xdd, 0x1b, 0xf7, 0x5, 0xdc, 0xc4, 0xe2, 0xdf, + 0x3f, 0xa2, 0x44, 0x90, 0x1f, 0x44, 0x90, 0xfb, 0x2c, 0x7b, 0xe1, 0x1a, + 0xca, 0xe6, 0x98, 0xb7, 0x1e, 0x13, 0xef, 0xc3, 0xc3, 0x70, 0x70, 0xb6, + 0x1f, 0x59, 0xc2, 0xf7, 0x33, 0x54, 0x59, 0x7, 0xa6, 0x5d, 0x54, 0xa2, + 0x51, 0x1b, 0xfb, 0x4, 0x41, 0x56, 0x34, 0xfb, 0xa, 0xf7, 0x2a, 0x8c, + 0xdd, 0x88, 0x1f, 0xbc, 0x89, 0xdf, 0x91, 0x47, 0x1a, 0x40, 0xfb, 0x1, + 0x83, 0x65, 0x4b, 0x52, 0xa9, 0xb0, 0x5a, 0x1e, 0xbc, 0x53, 0x7, 0xe, + 0xfb, 0x2b, 0xf7, 0x5a, 0x56, 0xc0, 0xf7, 0x22, 0xbd, 0xf7, 0x29, 0xc0, + 0x12, 0xde, 0xc3, 0x5a, 0xc2, 0xf7, 0xb6, 0xc3, 0x6c, 0xc3, 0x13, 0x7a, + 0xde, 0x85, 0x15, 0xc3, 0xc0, 0x6, 0xb3, 0x78, 0xb3, 0x73, 0xc4, 0x83, + 0x89, 0x4a, 0x18, 0x8e, 0x92, 0x95, 0x8c, 0x95, 0x1b, 0x98, 0x96, 0x84, + 0x7e, 0x7b, 0x7c, 0x82, 0x7a, 0x7d, 0x7d, 0x8e, 0x94, 0x81, 0x1f, 0x7d, + 0x68, 0x5, 0x13, 0xba, 0x7f, 0x9b, 0xa0, 0x85, 0x9e, 0x1b, 0xb1, 0xae, + 0xab, 0xb3, 0xad, 0x73, 0x9e, 0x77, 0x8c, 0x1f, 0x13, 0x75, 0x9e, 0x7, + 0xf7, 0x3, 0x8c, 0xda, 0xb4, 0xde, 0x1a, 0xdc, 0x4f, 0xae, 0x43, 0x8f, + 0x1e, 0x45, 0x90, 0xfb, 0x3d, 0x85, 0xde, 0x1a, 0xc8, 0xe6, 0x91, 0xb7, + 0x1e, 0x13, 0xb6, 0xc4, 0xc2, 0x70, 0x70, 0xb6, 0x1f, 0x5c, 0xc3, 0xf7, + 0x2e, 0x53, 0x5b, 0x7, 0xa5, 0x5d, 0x55, 0xa1, 0x50, 0x1b, 0xfb, 0x4, + 0x41, 0x5d, 0x38, 0xfb, 0x7, 0xf7, 0x2e, 0x86, 0xdd, 0x88, 0x1f, 0x13, + 0xb9, 0xbd, 0x89, 0xdf, 0x83, 0x48, 0x1a, 0x44, 0xfb, 0x5, 0x91, 0x65, + 0x4a, 0x53, 0xa7, 0xaf, 0x5a, 0x1e, 0xb1, 0x53, 0x7, 0xe, 0x3e, 0xc0, + 0xf8, 0xa3, 0xc0, 0x1, 0xf7, 0x16, 0xc0, 0xf7, 0x74, 0xc0, 0x3, 0xf7, + 0x16, 0xdd, 0x15, 0xfb, 0x33, 0xf7, 0x53, 0x7, 0xa5, 0xa7, 0x8c, 0x8f, + 0xa0, 0x1f, 0xa5, 0x91, 0xac, 0x9e, 0xb7, 0x1a, 0xa7, 0x7a, 0xa7, 0x74, + 0x9e, 0x1e, 0x8b, 0x7c, 0x96, 0x84, 0x92, 0x1e, 0xe3, 0x9e, 0x8c, 0xc6, + 0xa2, 0x1a, 0x8c, 0x7, 0xad, 0x72, 0xa6, 0x71, 0x9f, 0x1e, 0xfb, 0x67, + 0xf7, 0x33, 0x5, 0x74, 0x9d, 0x84, 0x93, 0x96, 0x1a, 0xa9, 0xae, 0x8f, + 0x9f, 0x1e, 0xf7, 0x36, 0x21, 0xc0, 0xf7, 0x33, 0xfb, 0x47, 0x6, 0x69, + 0x68, 0x8a, 0x81, 0x6e, 0x1f, 0x6e, 0x82, 0x7a, 0x70, 0x6d, 0x1a, 0x6c, + 0x9f, 0x76, 0xa1, 0x77, 0x1e, 0x9e, 0x7a, 0x5, 0x6d, 0x83, 0x59, 0x6b, + 0x52, 0x1a, 0x69, 0x9e, 0x6d, 0xa3, 0x79, 0x1e, 0xf7, 0x65, 0xfb, 0x32, + 0x5, 0xa8, 0x76, 0x8e, 0x7d, 0x80, 0x1a, 0x81, 0x86, 0x76, 0x6a, 0x1e, + 0xfb, 0x49, 0xf5, 0x6, 0xf7, 0x3f, 0xbb, 0x15, 0xfb, 0x2c, 0xf7, 0x6, + 0x5, 0x7d, 0x96, 0x7a, 0x9b, 0xa0, 0x1a, 0xb0, 0xb5, 0xa2, 0xa5, 0x1e, + 0xf7, 0x31, 0xfb, 0x5, 0x5, 0x9b, 0x7e, 0x9f, 0x7a, 0x75, 0x1a, 0x7c, + 0x80, 0x61, 0x48, 0x1e, 0xe, 0xa8, 0x76, 0xf7, 0x8e, 0xf7, 0x15, 0x8b, + 0xf7, 0xb, 0x1, 0xf7, 0x99, 0xf7, 0x19, 0x3, 0xf7, 0x61, 0x93, 0x15, + 0xcb, 0x6, 0xf1, 0xf7, 0x8e, 0x5, 0x2b, 0x6, 0x7d, 0xf7, 0x50, 0x4c, + 0xa, 0xa0, 0x76, 0xf8, 0xbb, 0xc3, 0x1, 0xee, 0xc3, 0x3, 0xf7, 0x8a, + 0x16, 0xc8, 0x6, 0xf7, 0x55, 0xf8, 0xb8, 0x5, 0xc6, 0xfc, 0x25, 0xfb, + 0x28, 0xc3, 0xe7, 0xf7, 0xb3, 0x7, 0xe, 0x7c, 0xc6, 0xf7, 0xa9, 0xc9, + 0xf7, 0x4a, 0xc4, 0x1, 0xf1, 0xc5, 0xf7, 0xaa, 0xc7, 0x3, 0xf7, 0x34, + 0xf7, 0xbd, 0x15, 0xf7, 0x72, 0xf7, 0x39, 0xb9, 0xf7, 0x37, 0x1e, 0xc4, + 0x7, 0xfb, 0x8d, 0xfb, 0x1d, 0x38, 0xfb, 0x9a, 0xfb, 0x62, 0xe8, 0x35, + 0xf7, 0x6, 0xf3, 0xe0, 0xef, 0xf6, 0xee, 0x42, 0xe7, 0xfb, 0x2, 0x3d, + 0x5b, 0x5d, 0x63, 0x6e, 0x1f, 0x8e, 0x39, 0x15, 0xc2, 0xa6, 0xbe, 0xbe, + 0xcc, 0x1b, 0xd3, 0xc7, 0x56, 0x3d, 0x51, 0x62, 0x33, 0x2c, 0x34, 0x5b, + 0xe9, 0xd8, 0x87, 0x1f, 0xe, 0x3b, 0xf9, 0x59, 0x1, 0xf7, 0x11, 0xf7, + 0xf2, 0x3, 0xf7, 0x11, 0x4d, 0x15, 0xb3, 0x79, 0xf7, 0xca, 0xf9, 0x46, + 0x63, 0x9e, 0x5, 0xe, 0xe, 0x76, 0xc5, 0x70, 0xc4, 0xf7, 0x64, 0xc5, + 0xf7, 0x71, 0xc4, 0x12, 0xf7, 0x25, 0xc1, 0x89, 0xc0, 0x13, 0xb8, 0xf7, + 0xa, 0xaa, 0x15, 0xa3, 0x57, 0x5, 0x13, 0x78, 0xa4, 0xc3, 0xb5, 0x91, + 0xad, 0x1b, 0x13, 0xb8, 0xc8, 0xae, 0x6c, 0xae, 0x1b, 0xb6, 0xb2, 0x9d, + 0xa6, 0xaa, 0x1f, 0x76, 0xb9, 0x5, 0x7f, 0x7a, 0x6e, 0x76, 0x68, 0x1b, + 0x13, 0x74, 0x6e, 0x8a, 0x5f, 0xa9, 0x50, 0x8c, 0x8, 0x6e, 0x69, 0x86, + 0x77, 0x66, 0x1f, 0x88, 0x6, 0xb6, 0xc1, 0xa3, 0xb7, 0x8d, 0xb8, 0x8c, + 0xa8, 0x88, 0xa8, 0x81, 0xab, 0x8, 0xf7, 0x61, 0xc5, 0xfb, 0x73, 0x6, + 0x13, 0xb8, 0x80, 0xa3, 0x81, 0xbb, 0xa2, 0x1a, 0xdd, 0xbf, 0xb7, 0xd8, + 0xbe, 0xb9, 0x67, 0x5a, 0xa4, 0x1e, 0xc0, 0xa9, 0x5, 0xc3, 0x70, 0x52, + 0xc3, 0x31, 0x1b, 0xfb, 0xb, 0x4a, 0x38, 0x2f, 0x69, 0x93, 0x67, 0x9c, + 0x6a, 0x1f, 0x32, 0x51, 0xf4, 0x6, 0x13, 0xb4, 0x93, 0x73, 0x8e, 0x73, + 0x74, 0x1a, 0x48, 0x6d, 0x51, 0x5a, 0x5b, 0x1e, 0xe, 0x7c, 0xc2, 0xf7, + 0xe4, 0xc2, 0xf7, 0x16, 0x77, 0x1, 0xf7, 0x2a, 0xc1, 0x3, 0xd9, 0xf8, + 0xc, 0x15, 0xd3, 0xfb, 0x98, 0x6, 0xfb, 0x5, 0xf7, 0x0, 0x79, 0xbf, + 0xd5, 0xd5, 0xa8, 0xa6, 0xca, 0x1e, 0x85, 0xc1, 0x5, 0x77, 0x57, 0x41, + 0x68, 0x47, 0x1b, 0x3f, 0x62, 0x9d, 0xdd, 0x1f, 0xf7, 0x80, 0xf7, 0x8c, + 0xc2, 0xfb, 0x8c, 0xf7, 0x16, 0x55, 0xfb, 0x16, 0x43, 0x7, 0xe, 0xfb, + 0x31, 0xc0, 0xf7, 0x16, 0xc1, 0xf7, 0xe1, 0xc1, 0xf7, 0x1, 0xc0, 0x1, + 0xf6, 0xc3, 0xf7, 0xfb, 0xc5, 0x3, 0x9e, 0x23, 0x15, 0x56, 0xf7, 0xc5, + 0xc0, 0xfb, 0x35, 0xf7, 0x65, 0x7, 0x64, 0xab, 0xc6, 0x63, 0xea, 0x1b, + 0xf7, 0x14, 0xf2, 0xea, 0xf7, 0x15, 0xf7, 0x14, 0xfb, 0x2, 0xe4, 0xfb, + 0x8, 0x31, 0x4b, 0x67, 0x5e, 0x66, 0x1f, 0xf7, 0x87, 0xfb, 0x24, 0x56, + 0xe3, 0xfd, 0x3c, 0x7, 0xc6, 0xf7, 0xf4, 0x15, 0xe2, 0xd0, 0xd9, 0xf7, + 0x4, 0xf7, 0x1e, 0xb0, 0xfb, 0x1, 0x54, 0x21, 0x45, 0x4c, 0x20, 0x2a, + 0x39, 0xcf, 0xef, 0x1e, 0xe, 0x7c, 0xbf, 0xf7, 0x7e, 0xc6, 0xf7, 0x7c, + 0xc7, 0x12, 0xf8, 0x2b, 0xc9, 0x6b, 0xc5, 0x13, 0xe8, 0xf3, 0xa6, 0x15, + 0x70, 0xbc, 0xcd, 0x7c, 0xca, 0x1b, 0xf7, 0x2, 0xf2, 0xbb, 0xf7, 0x11, + 0xf7, 0x1, 0x33, 0xae, 0x65, 0x91, 0x1f, 0x13, 0xf0, 0xb6, 0x9e, 0xc4, + 0xc8, 0xd6, 0x1a, 0xf7, 0x3, 0x31, 0xbb, 0x32, 0x4d, 0x4a, 0x70, 0x67, + 0x5a, 0x1e, 0xa8, 0x58, 0x5, 0xae, 0xb4, 0xc0, 0x9e, 0xba, 0x1b, 0xcd, + 0xc4, 0x74, 0x3d, 0x55, 0x49, 0x3e, 0x30, 0x1f, 0x88, 0x50, 0x6, 0x13, + 0xe8, 0xd2, 0x8a, 0xf7, 0xb, 0x79, 0x2f, 0x1a, 0x35, 0x42, 0x66, 0x3a, + 0x53, 0x4f, 0x9c, 0xa9, 0x61, 0x1e, 0xe, 0x62, 0xc2, 0x5a, 0x76, 0xf7, + 0xd, 0xc1, 0xf7, 0x47, 0xc2, 0xf7, 0x99, 0xbf, 0x12, 0xf7, 0x44, 0xc1, + 0x6a, 0xbf, 0xf7, 0x64, 0xbf, 0x13, 0xbd, 0xf7, 0xca, 0xcc, 0x15, 0xf7, + 0x27, 0x58, 0x50, 0x54, 0xf7, 0x34, 0xc2, 0x5a, 0xbe, 0xbc, 0xc1, 0x5a, + 0xf7, 0x56, 0x4e, 0x6, 0xfb, 0x1e, 0xfb, 0x65, 0x5, 0xce, 0x9a, 0x15, + 0xdb, 0xf7, 0x8, 0x5, 0xfb, 0x8, 0x7, 0xfc, 0x32, 0xfb, 0x24, 0x15, + 0x13, 0x7b, 0xb6, 0x6c, 0xf8, 0x8e, 0xf9, 0x47, 0x60, 0xaa, 0x5, 0xfc, + 0xb2, 0xfb, 0xe7, 0x15, 0x7c, 0xa8, 0xbb, 0x7d, 0xb3, 0x1b, 0xca, 0xc9, + 0xb3, 0xce, 0xc0, 0x74, 0x9d, 0x6f, 0x99, 0x1f, 0x13, 0xbd, 0xa0, 0x9d, + 0x96, 0x9f, 0xad, 0x1a, 0xcb, 0x5d, 0xb3, 0x4e, 0x63, 0x61, 0x7b, 0x75, + 0x6d, 0x1e, 0x9f, 0x57, 0x5, 0xa2, 0x9b, 0xb5, 0x9a, 0xae, 0x1b, 0xa7, + 0xa3, 0x7b, 0x68, 0x69, 0x72, 0x74, 0x47, 0x8d, 0x1f, 0x56, 0x7, 0x13, + 0xbb, 0xbb, 0xcd, 0x8b, 0x59, 0x68, 0x67, 0x7a, 0x63, 0x65, 0x61, 0x94, + 0xa0, 0x77, 0x1f, 0xe, 0xf7, 0x84, 0xc2, 0xf7, 0xa3, 0xc3, 0x12, 0xf7, + 0xf3, 0xc3, 0x63, 0xc5, 0x13, 0xd0, 0xf7, 0x42, 0xf7, 0xa2, 0x15, 0x7c, + 0xaa, 0xbd, 0x7c, 0xb4, 0x1b, 0xcc, 0xcb, 0xb3, 0xd2, 0xc2, 0x73, 0x9d, + 0x6f, 0x99, 0x1f, 0x13, 0xe0, 0xa5, 0xa2, 0x93, 0xab, 0xaa, 0x1a, 0xbe, + 0x60, 0xba, 0x48, 0x60, 0x5e, 0x7a, 0x73, 0x6b, 0x1e, 0xa2, 0x5d, 0x5, + 0xa0, 0xa4, 0xb4, 0x95, 0xa7, 0x1b, 0xaa, 0xa5, 0x7b, 0x67, 0x69, 0x6f, + 0x72, 0x45, 0x8d, 0x1f, 0x55, 0x7, 0x13, 0xd0, 0xbd, 0x8c, 0xcb, 0x88, + 0x59, 0x1a, 0x63, 0x67, 0x7b, 0x61, 0x66, 0x62, 0x97, 0x9f, 0x75, 0x1e, + 0xe, 0xf8, 0x7d, 0xbc, 0x9d, 0xbd, 0x1, 0xf0, 0xf8, 0x8c, 0x15, 0xbe, + 0x80, 0x5, 0x99, 0x8f, 0xa4, 0xbc, 0xaf, 0x1b, 0xa9, 0x9d, 0x77, 0x79, + 0xa3, 0x1f, 0x7c, 0x9f, 0xa2, 0x7d, 0xb1, 0x1b, 0xc9, 0xbb, 0xba, 0xc3, + 0x9e, 0x1f, 0x59, 0x95, 0x82, 0x72, 0x6e, 0x65, 0x62, 0x8a, 0x19, 0x73, + 0x7a, 0x97, 0x99, 0x7a, 0x1f, 0x9e, 0x74, 0x74, 0xa2, 0x63, 0x1b, 0x58, + 0x57, 0x66, 0x4a, 0x75, 0x1f, 0xe, 0xf7, 0xb0, 0x76, 0xf7, 0x93, 0xb7, + 0x1, 0xf7, 0x10, 0xb8, 0xf7, 0x3, 0xb7, 0xf7, 0x4a, 0xb7, 0x3, 0xf7, + 0xac, 0xf7, 0x9b, 0x15, 0xb7, 0xf7, 0x98, 0x6, 0xcb, 0xfb, 0x98, 0x5, + 0xc4, 0x6, 0xc8, 0xf7, 0x97, 0x5, 0xfb, 0x97, 0xb7, 0xf7, 0xbf, 0x39, + 0x7, 0x56, 0xfb, 0x7c, 0x55, 0xf7, 0x7c, 0x5, 0x3a, 0x6, 0xfb, 0x30, + 0xfb, 0xbf, 0x15, 0xb8, 0xf7, 0x93, 0xd7, 0xb7, 0xfb, 0x58, 0x5f, 0xd6, + 0x6, 0xe, 0x8b, 0xc2, 0xf8, 0x1f, 0x77, 0xf7, 0x1a, 0xc5, 0x1, 0xf8, + 0x4c, 0xc7, 0x3, 0xee, 0x16, 0xf8, 0x25, 0xf7, 0x24, 0x51, 0x32, 0xfb, + 0x9d, 0x6, 0xf7, 0x6d, 0xf7, 0x44, 0xf5, 0xde, 0xf7, 0x4, 0x1a, 0xf7, + 0x17, 0x3b, 0xcc, 0xfb, 0x1, 0x37, 0x4b, 0x66, 0x3f, 0x61, 0x1e, 0x50, + 0xc1, 0x7, 0xd2, 0xc4, 0xb6, 0xd9, 0xdd, 0xbb, 0x5d, 0x2f, 0x3f, 0x2f, + 0x3f, 0x6e, 0x72, 0x1e, 0x42, 0x4c, 0x41, 0x46, 0x42, 0x4d, 0x8, 0xe, + 0xf7, 0x8d, 0xc2, 0xf7, 0x9c, 0xc1, 0x1, 0xf7, 0x53, 0xbf, 0xf7, 0x14, + 0xbf, 0x3, 0xf7, 0x44, 0xf7, 0x8d, 0x15, 0xf7, 0x8b, 0xc2, 0xfb, 0x38, + 0x6, 0xf7, 0x9, 0xe8, 0xba, 0xb3, 0xd3, 0x1a, 0xc5, 0x64, 0xc2, 0x3b, + 0x60, 0x5c, 0x80, 0x4a, 0x74, 0x1e, 0x55, 0xbf, 0x7, 0xc3, 0x83, 0xb0, + 0x9f, 0xab, 0x1b, 0xb5, 0xa4, 0x6b, 0x68, 0x55, 0xfb, 0x1f, 0x26, 0x53, + 0x5e, 0x1f, 0xe, 0x7c, 0xc0, 0x62, 0xc1, 0xf7, 0xd5, 0xc1, 0x12, 0xf7, + 0x4, 0xc0, 0xf7, 0xa2, 0xc0, 0x13, 0xb8, 0xa8, 0xf8, 0x8, 0x15, 0xde, + 0xfb, 0x8b, 0x6, 0x31, 0xcf, 0x59, 0xe3, 0xb2, 0xbf, 0x9b, 0xd3, 0xd7, + 0x1e, 0x13, 0x78, 0x3f, 0xf7, 0x1b, 0xc1, 0x39, 0xf8, 0xb, 0xfb, 0x1c, + 0x55, 0xde, 0xfb, 0x71, 0x7, 0x13, 0xb8, 0x5a, 0x62, 0x54, 0x4b, 0x4f, + 0x1b, 0x42, 0x62, 0xb5, 0xd3, 0x1f, 0xf7, 0xa6, 0xfb, 0x1c, 0x7, 0xe, + 0x3f, 0xa, 0xf7, 0x41, 0xf8, 0x82, 0x15, 0xf7, 0xb3, 0xf3, 0x6a, 0xd5, + 0xfb, 0x9e, 0xfb, 0x26, 0x5, 0xfb, 0x18, 0xfb, 0x25, 0x2b, 0xa, 0x3f, + 0xa, 0xf7, 0x0, 0xf8, 0x8f, 0x15, 0xb3, 0x79, 0xf7, 0x27, 0xf7, 0xb, + 0xf7, 0x26, 0xfb, 0xb, 0xb4, 0x9d, 0xfb, 0x27, 0xf7, 0x31, 0x5, 0x3c, + 0x6, 0xfb, 0x77, 0xfb, 0xaf, 0x2b, 0xa, 0x7c, 0xc1, 0x61, 0x67, 0xa, + 0xe7, 0xf7, 0x9, 0x12, 0xf7, 0x4, 0xc0, 0x94, 0xe0, 0xca, 0xdc, 0xaa, + 0xc0, 0x13, 0xbf, 0xf7, 0xd6, 0xf8, 0xa4, 0x72, 0xa, 0xfb, 0x28, 0xfb, + 0x9, 0x15, 0xe0, 0xf7, 0x9, 0x36, 0x6, 0xfb, 0x25, 0xfb, 0x9c, 0x38, + 0xa, 0x13, 0x7f, 0x3b, 0xa, 0x13, 0xbf, 0x33, 0xa, 0x3f, 0xa, 0xf7, + 0x2c, 0xf8, 0xe8, 0x15, 0xf7, 0xb3, 0x24, 0x96, 0xaa, 0xfb, 0x9c, 0xf7, + 0x28, 0x5, 0xfb, 0x31, 0xfb, 0xb7, 0x2b, 0xa, 0xfb, 0x11, 0xbd, 0x1, + 0x8b, 0xf8, 0xec, 0x3, 0x40, 0x4, 0x59, 0xf8, 0xec, 0xbd, 0x7, 0xe, + 0x96, 0x76, 0xf8, 0x11, 0xc2, 0x1, 0x9a, 0xf7, 0x68, 0xf7, 0x25, 0xf7, + 0x69, 0x3, 0xf7, 0x9e, 0x81, 0x15, 0xcc, 0x6, 0xf7, 0x45, 0xf8, 0x11, + 0x5, 0xd8, 0xc2, 0xfb, 0x69, 0x54, 0xd5, 0x6, 0xfb, 0x27, 0xfb, 0xd1, + 0xfb, 0x28, 0xf7, 0xd1, 0x5, 0xd7, 0xc2, 0xfb, 0x68, 0x54, 0xd4, 0x6, + 0xe, 0x96, 0x76, 0xf8, 0x11, 0xc2, 0x1, 0x98, 0xf7, 0x39, 0xf7, 0x8c, + 0xf7, 0x34, 0x3, 0xf7, 0x31, 0x81, 0x15, 0xca, 0x6, 0xdc, 0xf7, 0x9b, + 0xdb, 0xfb, 0x9b, 0x5, 0xc9, 0x6, 0xf6, 0xf8, 0x11, 0x5, 0xaf, 0xc2, + 0xfb, 0x34, 0x54, 0xce, 0x6, 0x39, 0xfb, 0xc4, 0x34, 0xf7, 0xb0, 0x5, + 0x5c, 0x6, 0x35, 0xfb, 0xae, 0x33, 0xf7, 0xc2, 0x5, 0xd6, 0xc2, 0xfb, + 0x39, 0x54, 0xad, 0x6, 0xe, 0x74, 0xa, 0xb0, 0xf7, 0x5b, 0xf7, 0x18, + 0xf7, 0x50, 0x3, 0x9f, 0x16, 0xf7, 0x6d, 0xc1, 0x43, 0x6, 0xf7, 0x1a, + 0xf7, 0x1b, 0xf7, 0x1a, 0xfb, 0x1b, 0x5, 0x43, 0x55, 0xf7, 0x6f, 0xc1, + 0x3f, 0x6, 0xfb, 0x40, 0xf7, 0x3e, 0xf7, 0x28, 0xf7, 0x28, 0x5, 0xd7, + 0xc1, 0xfb, 0x50, 0x55, 0xb6, 0x6, 0xfb, 0x5, 0xfb, 0x5, 0xfb, 0x4, + 0xf7, 0x5, 0x5, 0xbd, 0xc1, 0xfb, 0x5b, 0x55, 0xdb, 0x6, 0xf7, 0x28, + 0xfb, 0x27, 0xfb, 0x40, 0xfb, 0x3f, 0x5, 0x42, 0x6, 0xe, 0xfb, 0x31, + 0xbe, 0xf8, 0x75, 0xbe, 0x6a, 0xa, 0x13, 0xe8, 0x13, 0xd8, 0xc0, 0x21, + 0x15, 0x58, 0xf7, 0x9a, 0xbe, 0x32, 0x7, 0xf7, 0xc1, 0xf8, 0x75, 0x5, + 0xcc, 0xbe, 0xfb, 0x4b, 0x58, 0xc4, 0x6, 0xfb, 0x3d, 0xfb, 0xa1, 0xfb, + 0x34, 0xf7, 0xa1, 0x5, 0xcd, 0xbe, 0xfb, 0x58, 0x58, 0xd0, 0x6, 0xf7, + 0x53, 0xfb, 0xd3, 0x25, 0xfb, 0x36, 0x5, 0xe, 0xfb, 0x31, 0xc0, 0xf8, + 0x87, 0xc0, 0x6a, 0xa, 0x13, 0xd8, 0xf7, 0x3e, 0xf8, 0x89, 0x15, 0xf7, + 0xbc, 0xee, 0x69, 0xd3, 0xfb, 0xa6, 0xfb, 0x21, 0x5, 0x22, 0xfd, 0xf, + 0x15, 0x56, 0xf7, 0x9a, 0xc0, 0x32, 0x7, 0xf7, 0xc1, 0xf8, 0x87, 0x5, + 0xcc, 0xc0, 0xfb, 0x4b, 0x56, 0xc4, 0x6, 0xfb, 0x3c, 0xfb, 0xab, 0xfb, + 0x35, 0xf7, 0xab, 0x5, 0x13, 0xe8, 0xcd, 0xc0, 0xfb, 0x58, 0x56, 0xd0, + 0x6, 0xf7, 0x54, 0xfb, 0xe0, 0x24, 0xfb, 0x3b, 0x5, 0xe, 0xfb, 0x31, + 0xbd, 0xf8, 0x66, 0xbc, 0xd6, 0xf7, 0x4, 0x12, 0x92, 0xf7, 0x58, 0x6b, + 0xe2, 0xce, 0xe0, 0x8a, 0xf7, 0x4b, 0x13, 0xec, 0xf7, 0xd9, 0xf8, 0x77, + 0x15, 0xe0, 0xf7, 0x4, 0x36, 0x80, 0xa, 0x15, 0xe2, 0xf7, 0x4, 0x34, + 0x6, 0x13, 0xd2, 0xfb, 0xa, 0xfd, 0x52, 0x15, 0x59, 0xf7, 0x9a, 0xbd, + 0x32, 0x7, 0xf7, 0xc1, 0xf8, 0x66, 0x5, 0xcc, 0xbc, 0xfb, 0x4b, 0x5a, + 0xc4, 0x6, 0xfb, 0x3c, 0xfb, 0x99, 0xfb, 0x35, 0xf7, 0x99, 0x5, 0xcd, + 0xbc, 0xfb, 0x58, 0x5a, 0xd0, 0x6, 0xf7, 0x54, 0xfb, 0xc9, 0x24, 0xfb, + 0x31, 0x5, 0xe, 0x8b, 0xc1, 0xd8, 0xc1, 0xd1, 0xc2, 0xf7, 0x5a, 0xc1, + 0x1, 0xa5, 0xf7, 0x60, 0xb9, 0xc1, 0xb4, 0xf7, 0x5f, 0x3, 0xf7, 0x3c, + 0x16, 0xf7, 0xa1, 0xc1, 0x20, 0xd8, 0xf7, 0x15, 0xc1, 0xfb, 0x15, 0xd1, + 0xf7, 0x15, 0xc2, 0xfb, 0xd, 0x6, 0xf7, 0x47, 0xf7, 0x5a, 0x5, 0xc4, + 0xc1, 0xfb, 0x5f, 0x55, 0xce, 0x6, 0xfb, 0x1d, 0xfb, 0x2b, 0xfb, 0x1d, + 0xf7, 0x2b, 0x5, 0xcd, 0xc1, 0xfb, 0x60, 0x55, 0xca, 0x6, 0xf7, 0x43, + 0xfb, 0x5a, 0x5, 0xfb, 0x9, 0x54, 0xf7, 0x15, 0x45, 0xfb, 0x15, 0x55, + 0xf7, 0x15, 0x3e, 0xfb, 0x0, 0x6, 0xe, 0x74, 0xa, 0xf7, 0x4, 0xc1, + 0xf7, 0xad, 0xc1, 0x3, 0xed, 0x16, 0xf8, 0x27, 0xf7, 0x2e, 0x55, 0x27, + 0xfb, 0xa3, 0x6, 0xf7, 0xd9, 0xf7, 0xd6, 0x5, 0xbd, 0xfc, 0x19, 0xfb, + 0x2b, 0xc1, 0xec, 0xf7, 0x94, 0x7, 0xfb, 0xd8, 0xfb, 0xd5, 0x5, 0xe, + 0x8b, 0x67, 0xa, 0xbf, 0xc4, 0x1, 0xf7, 0x3, 0xc1, 0xf7, 0xad, 0xc2, + 0x3, 0xf7, 0x9e, 0xf8, 0x7f, 0x15, 0xda, 0x6, 0xf7, 0x27, 0xf7, 0x32, + 0x62, 0x9f, 0xfb, 0x26, 0xfb, 0xd, 0xfb, 0x28, 0xf7, 0xc, 0x62, 0x77, + 0x5, 0x79, 0xfd, 0x1c, 0x15, 0xf8, 0x27, 0xf7, 0x31, 0x54, 0x25, 0xfb, + 0xa3, 0x6, 0xf7, 0xda, 0xf7, 0xdd, 0x5, 0xc2, 0xfc, 0x1a, 0xfb, 0x32, + 0xc1, 0x7, 0x8c, 0xf2, 0x5, 0xf7, 0x98, 0x6, 0xfb, 0xdc, 0xfb, 0xe0, + 0x5, 0xe, 0x7d, 0xc1, 0xf8, 0xa3, 0xc2, 0x1, 0xf5, 0xc4, 0xf7, 0xa5, + 0xc5, 0x3, 0xf5, 0xf7, 0xc4, 0x15, 0xfb, 0x29, 0xa2, 0xfb, 0x3d, 0xf7, + 0x40, 0xf7, 0x45, 0x9b, 0xf7, 0x40, 0xf7, 0x26, 0xf7, 0x1b, 0x78, 0xf7, + 0x4b, 0xfb, 0x41, 0xfb, 0x41, 0x74, 0xfb, 0x49, 0xfb, 0x1d, 0x1e, 0xc4, + 0x16, 0xf7, 0xf, 0x9e, 0xf7, 0x20, 0xf7, 0xc, 0xf7, 0x3, 0xa2, 0xfb, + 0x1f, 0xfb, 0x10, 0xfb, 0x17, 0x78, 0xfb, 0x19, 0xfb, 0xa, 0xfb, 0x6, + 0x75, 0xf7, 0x17, 0xf7, 0x19, 0x1e, 0xe, 0x79, 0x9d, 0xf8, 0x3e, 0x9a, + 0xf7, 0xd, 0x9d, 0xa9, 0x97, 0x6, 0xfb, 0x31, 0x8b, 0x7, 0x1e, 0xa0, + 0x39, 0x63, 0xff, 0xc, 0x9, 0xc2, 0xa, 0xc2, 0xb, 0xf8, 0xec, 0x14, + 0xaa, 0x13, 0x0, 0x63, 0x2, 0x0, 0x1, 0x0, 0x3d, 0x0, 0x70, 0x0, + 0xae, 0x0, 0xb8, 0x0, 0xbd, 0x0, 0xc2, 0x0, 0xc8, 0x0, 0xe5, 0x0, + 0xff, 0x1, 0x18, 0x1, 0x2e, 0x1, 0x38, 0x1, 0x42, 0x1, 0x55, 0x1, + 0x71, 0x1, 0x76, 0x1, 0x80, 0x1, 0x9a, 0x1, 0xa9, 0x1, 0xba, 0x1, + 0xc6, 0x1, 0xd8, 0x2, 0x7, 0x2, 0x1c, 0x2, 0x2c, 0x2, 0x33, 0x2, + 0x5a, 0x2, 0x69, 0x2, 0x73, 0x2, 0x7d, 0x2, 0x88, 0x2, 0x97, 0x2, + 0xa3, 0x2, 0xae, 0x2, 0xb7, 0x2, 0xcf, 0x2, 0xe7, 0x2, 0xfd, 0x3, + 0x4, 0x3, 0xe, 0x3, 0x24, 0x3, 0x3a, 0x3, 0x4e, 0x3, 0x63, 0x3, + 0x76, 0x3, 0x7f, 0x3, 0x88, 0x3, 0x91, 0x3, 0xa5, 0x3, 0xb7, 0x3, + 0xc9, 0x3, 0xdb, 0x3, 0xe3, 0x3, 0xeb, 0x3, 0xf3, 0x3, 0xfb, 0x4, + 0x3, 0x4, 0xe, 0x4, 0x13, 0x4, 0x1e, 0x4, 0x24, 0x4, 0x31, 0x4, + 0x38, 0x4, 0x41, 0x4, 0x4a, 0x4, 0x53, 0x4, 0x5a, 0x4, 0x60, 0x4, + 0x66, 0x4, 0x74, 0x4, 0x81, 0x4, 0x86, 0x4, 0x8a, 0x4, 0x96, 0x4, + 0xa2, 0x4, 0xa8, 0x4, 0xae, 0x4, 0xb9, 0x4, 0xc4, 0x4, 0xce, 0x4, + 0xd9, 0x4, 0xe4, 0x4, 0xeb, 0x4, 0xf2, 0x4, 0xf9, 0x5, 0x0, 0x5, + 0x7, 0x5, 0x11, 0x5, 0x1b, 0x5, 0x24, 0x5, 0x2d, 0x5, 0x36, 0x5, + 0x3f, 0x5, 0x48, 0x5, 0x51, 0x5, 0x58, 0x5, 0x5e, 0x5, 0x64, 0x5, + 0x69, 0x15, 0xfb, 0x37, 0xf3, 0xfb, 0x1a, 0xf7, 0x30, 0xf7, 0x34, 0xe9, + 0xf7, 0x1a, 0xf7, 0x37, 0xe9, 0x5a, 0xf7, 0x5f, 0xfb, 0x60, 0xfb, 0x43, + 0x35, 0xfb, 0x31, 0xfb, 0x20, 0x1e, 0xc1, 0x89, 0x15, 0xe4, 0xc1, 0xf7, + 0x31, 0xf7, 0x2b, 0xf7, 0x2c, 0xba, 0xfb, 0x3d, 0x3e, 0xfb, 0x13, 0x47, + 0xfb, 0x7, 0xfb, 0x15, 0xfb, 0x15, 0x3d, 0xf7, 0x7, 0xf7, 0x13, 0x1e, + 0xb, 0x15, 0xfb, 0x1b, 0xe2, 0x2b, 0xf7, 0x2a, 0xf7, 0x25, 0xe9, 0xed, + 0xf7, 0x19, 0xf7, 0x20, 0x2f, 0xe7, 0xfb, 0x25, 0xfb, 0x1b, 0x23, 0x33, + 0xfb, 0x24, 0x1e, 0xc5, 0x8a, 0x15, 0xe9, 0xc9, 0xdd, 0xf7, 0xb, 0xf7, + 0xe, 0xc2, 0x38, 0x2e, 0x39, 0x4b, 0x2f, 0xfb, 0x8, 0xfb, 0xa, 0x4f, + 0xe7, 0xdd, 0x1e, 0xe, 0x15, 0xf8, 0x36, 0x6, 0xf7, 0x14, 0x45, 0xf7, + 0xe, 0xfb, 0x3b, 0xfb, 0x1c, 0x24, 0x24, 0xfb, 0x1f, 0xfb, 0xc, 0xd1, + 0x25, 0xf7, 0x47, 0xdd, 0xe0, 0xa6, 0xb0, 0xcd, 0x1e, 0x7a, 0xc0, 0x5, + 0x5f, 0x3b, 0x3c, 0x79, 0x5b, 0x1b, 0x2a, 0x24, 0xb8, 0xf7, 0x6, 0x1f, + 0x8d, 0xc3, 0x15, 0xc7, 0x93, 0xc2, 0xd9, 0xf7, 0x8, 0x1b, 0xf7, 0x19, + 0xa9, 0x2e, 0x5e, 0x96, 0x1f, 0xe, 0x26, 0xa, 0x13, 0x7c, 0x29, 0xa, + 0x13, 0xbc, 0x2a, 0xa, 0x25, 0xa, 0x3c, 0xa, 0xb, 0x2d, 0xa, 0x27, + 0xa, 0xb, 0x28, 0xa, 0x3d, 0xa, 0x1f, 0xb, 0xf7, 0x60, 0xc1, 0x57, + 0x6, 0xfb, 0x60, 0xf8, 0x93, 0x5, 0xfb, 0x82, 0x55, 0xf7, 0x20, 0x6, + 0xfb, 0x48, 0xfc, 0x5d, 0x5, 0x4f, 0x6, 0xf7, 0x4e, 0xf7, 0x45, 0x15, + 0xb, 0x15, 0x9a, 0xab, 0xe0, 0xa7, 0xd1, 0x1b, 0xd7, 0xc3, 0x8b, 0x21, + 0x1f, 0x6b, 0x7, 0x92, 0x5e, 0x59, 0x92, 0x59, 0x1b, 0xfb, 0x3c, 0x55, + 0x33, 0x50, 0xb, 0x36, 0xf7, 0x1e, 0xc3, 0x38, 0xf7, 0x88, 0x7, 0xeb, + 0x59, 0xc3, 0xfb, 0x14, 0x45, 0x3a, 0x77, 0x73, 0x4f, 0x1e, 0xf7, 0xe1, + 0xfb, 0x94, 0x15, 0xb, 0x4e, 0x58, 0x46, 0x5c, 0x38, 0x1b, 0x4c, 0x60, + 0xb4, 0xb2, 0xe1, 0xf7, 0x6, 0x91, 0xcb, 0xb8, 0xb6, 0x85, 0x83, 0xb6, + 0x1f, 0xe, 0x38, 0xa, 0x13, 0x78, 0x3b, 0xa, 0x13, 0xb8, 0x33, 0xa, + 0x26, 0xa, 0x13, 0x7f, 0x29, 0xa, 0x13, 0xbf, 0x2a, 0xa, 0xf7, 0x63, + 0xc1, 0x32, 0x6, 0xb9, 0xf7, 0xf, 0x5, 0xf7, 0xa6, 0x6, 0xba, 0xfb, + 0xf, 0x5, 0x2c, 0x55, 0xb, 0xf7, 0x38, 0x39, 0xc4, 0xf7, 0x6f, 0x52, + 0x38, 0xfb, 0x38, 0xf7, 0x5e, 0xf7, 0xc2, 0xfb, 0x1b, 0xc4, 0xf7, 0x51, + 0xfc, 0x85, 0x55, 0xde, 0xfc, 0x5d, 0x38, 0x6, 0xb, 0x40, 0xa, 0x2e, + 0xa, 0xb, 0xf7, 0x19, 0x31, 0xa, 0xb7, 0xf7, 0x14, 0x4f, 0xa, 0xb, + 0xf7, 0x11, 0xd9, 0xd6, 0xf7, 0x27, 0x1e, 0xf7, 0xc4, 0xd8, 0xc2, 0xfb, + 0x7c, 0x54, 0xf2, 0xfb, 0xc3, 0x7, 0xfb, 0xe, 0x42, 0x5d, 0x3c, 0x31, + 0x4b, 0xb, 0xf8, 0x2c, 0xc1, 0xfb, 0x43, 0xf8, 0x5c, 0x42, 0xa, 0xfc, + 0x5c, 0xfb, 0x43, 0x6, 0xb, 0x58, 0x63, 0x57, 0x54, 0x4b, 0x1b, 0x42, + 0x63, 0xb6, 0xd5, 0x1f, 0xf7, 0xac, 0xfb, 0x1c, 0x7, 0xe, 0x15, 0xda, + 0xfb, 0xc1, 0x6, 0xfb, 0x1a, 0xd5, 0x30, 0x30, 0xa, 0xb, 0xf8, 0x2e, + 0xc2, 0xfb, 0x43, 0xf8, 0x12, 0xfb, 0x5c, 0x54, 0xf7, 0x24, 0xfb, 0xdb, + 0xfb, 0x47, 0x6, 0xb, 0xf7, 0xc8, 0xc1, 0xfb, 0x11, 0xf7, 0x43, 0x6, + 0xf7, 0x45, 0xf7, 0xae, 0x5, 0xd0, 0xc1, 0xfb, 0x5c, 0x55, 0xd1, 0x6, + 0xfb, 0x25, 0xfb, 0x78, 0xfb, 0x27, 0xf7, 0x78, 0x5, 0xd2, 0xc1, 0xfb, + 0x5d, 0x55, 0xcf, 0x6, 0xf7, 0x49, 0xfb, 0xae, 0x5, 0xfb, 0x43, 0xfb, + 0x12, 0x7, 0xb, 0x15, 0xdd, 0x6, 0xf7, 0x2a, 0xf7, 0x34, 0x60, 0x9d, + 0xfb, 0x27, 0xfb, 0xd, 0xfb, 0x2c, 0xf7, 0xd, 0x62, 0x78, 0x5, 0xe, + 0x15, 0xde, 0xfb, 0x90, 0x6, 0x2e, 0xcf, 0x58, 0xe2, 0xb3, 0xbe, 0x9b, + 0xd5, 0xd7, 0x1e, 0xb, 0x27, 0xa, 0x13, 0x40, 0x3c, 0xa, 0xb, 0x15, + 0x48, 0xbd, 0x51, 0xd9, 0xd4, 0xc1, 0xc4, 0xd0, 0xcc, 0x62, 0xc6, 0x33, + 0x3e, 0x5a, 0x4f, 0x4a, 0x1e, 0xc3, 0x8a, 0x15, 0xb5, 0xa6, 0xa9, 0xb9, + 0xb8, 0xa6, 0x6a, 0x65, 0x68, 0x71, 0x68, 0x5d, 0x61, 0x6c, 0xa5, 0xb6, + 0x1e, 0xb, 0x3d, 0xf7, 0x1c, 0xc2, 0x38, 0xf8, 0x14, 0xfb, 0x1c, 0x54, + 0xde, 0xfb, 0x80, 0x7, 0xb, 0xf7, 0x3, 0xf7, 0xbb, 0xf7, 0xb, 0xfb, + 0xbb, 0x5, 0xb, 0x49, 0xc5, 0x44, 0xf4, 0xd9, 0xd2, 0xb7, 0xc0, 0xc3, + 0xb, 0x41, 0xa, 0x12, 0xba, 0xc5, 0xf7, 0xc9, 0xc3, 0x13, 0xbc, 0xb, + 0x7c, 0xc1, 0x61, 0x67, 0xa, 0x12, 0xf7, 0x4, 0xc0, 0xf7, 0xa1, 0xc0, + 0x13, 0xb8, 0xb, 0xf8, 0x85, 0xf7, 0x51, 0x53, 0xfb, 0x1b, 0xfb, 0xc3, + 0xf7, 0x5d, 0xb, 0x7c, 0xc3, 0x5f, 0xc3, 0xf7, 0x34, 0xc3, 0xf7, 0x10, + 0xc3, 0xb, 0xf7, 0x3e, 0xc1, 0xfc, 0x24, 0x55, 0xf7, 0x40, 0xb, 0xd1, + 0xee, 0xcf, 0xc8, 0x67, 0x5b, 0xb7, 0x1f, 0x40, 0xc2, 0xf7, 0x6a, 0x54, + 0x49, 0x7, 0xae, 0x65, 0x4f, 0xaa, 0x40, 0x1b, 0xfb, 0x37, 0xb, 0x3c, + 0x1b, 0xfb, 0x2a, 0x3d, 0x22, 0x32, 0x30, 0xd3, 0x28, 0xf7, 0x2f, 0xcc, + 0xd5, 0xa1, 0xba, 0xb3, 0x1f, 0xfb, 0x9, 0x7, 0x33, 0x51, 0xb, 0x15, + 0xc3, 0x6, 0xef, 0xf7, 0x7e, 0x5, 0x31, 0x6, 0xe7, 0xfb, 0x7e, 0x15, + 0xc6, 0x6, 0xec, 0xf7, 0x7e, 0x5, 0x32, 0x6, 0xe, 0x8b, 0xc2, 0xf8, + 0x58, 0xc2, 0x1, 0xb, 0x4e, 0xa, 0xf7, 0x78, 0x77, 0x1, 0x61, 0xa, + 0x3, 0xb, 0x15, 0xf7, 0x9f, 0xc0, 0x21, 0xf7, 0xd5, 0xf5, 0xc0, 0x21, + 0xcd, 0x6, 0xdb, 0xce, 0x9e, 0xde, 0x74, 0x1e, 0x94, 0xbe, 0x5, 0xb, + 0x15, 0xf7, 0x27, 0xe9, 0xf7, 0x24, 0x2d, 0xb4, 0x9c, 0xfb, 0x26, 0xf7, + 0x19, 0x5, 0x3b, 0x6, 0xfb, 0x27, 0xfb, 0x19, 0x5, 0xb, 0x92, 0x72, + 0x71, 0x8f, 0x74, 0x1b, 0x3c, 0x4e, 0x62, 0x30, 0x1f, 0x43, 0x21, 0x56, + 0xf5, 0xfb, 0xd5, 0x21, 0x7, 0xe, 0x53, 0x8c, 0x15, 0x46, 0xc4, 0x52, + 0xd0, 0xd0, 0xc5, 0xc4, 0xd0, 0xd0, 0x51, 0xc5, 0x46, 0x46, 0x52, 0x51, + 0x46, 0x1e, 0xb, 0x15, 0x6d, 0xa6, 0x6e, 0xb5, 0xab, 0xab, 0xa3, 0xad, + 0xaa, 0x72, 0xa9, 0x63, 0x65, 0x6d, 0x70, 0x6a, 0x1e, 0xe, 0x8b, 0xc1, + 0xf7, 0xf, 0xc1, 0xf7, 0xac, 0xc1, 0xb, 0x8b, 0xc1, 0xf7, 0x5d, 0xc1, + 0xf7, 0x5e, 0xc1, 0xb, 0x1e, 0xf7, 0xbf, 0xf5, 0xc2, 0xfb, 0x81, 0x7, + 0xb, 0x5, 0x80, 0xbf, 0xe8, 0x7a, 0xdd, 0x1b, 0xf7, 0xe, 0xd8, 0xc0, + 0xf0, 0x1f, 0xf8, 0x11, 0xc9, 0xbe, 0xfb, 0x7, 0xb, 0x6e, 0xa2, 0x74, + 0xa8, 0xa8, 0xa2, 0xa2, 0xa8, 0xa8, 0x74, 0xa2, 0x6e, 0x6e, 0x74, 0x74, + 0x6e, 0x1e, 0xb, 0x64, 0xab, 0x75, 0xb2, 0xb2, 0xab, 0xa1, 0xb2, 0xb2, + 0x6b, 0xa1, 0x64, 0x64, 0x6b, 0x75, 0x64, 0x1e, 0xb, 0xfb, 0x31, 0xf7, + 0x60, 0xd4, 0xd4, 0xa0, 0xa5, 0xca, 0x1f, 0xf7, 0x41, 0xbd, 0xc2, 0xfb, + 0x9f, 0x7, 0xb, 0x8e, 0xf7, 0x63, 0xf7, 0x4b, 0xf7, 0x60, 0xb, 0x1, + 0xeb, 0xbf, 0xf7, 0xc6, 0xbf, 0x3, 0xb, 0x1, 0xc6, 0xc5, 0xf7, 0xf7, + 0xca, 0x3, 0xb, 0x1, 0xb6, 0xc1, 0xf8, 0x28, 0xc3, 0x3, 0xb, 0x1, + 0xc9, 0xc5, 0xf7, 0xfa, 0xc7, 0x3, 0xb, 0x15, 0xe0, 0xf7, 0x7, 0x36, + 0x6, 0xfb, 0x2b, 0x60, 0xa, 0xb, 0x5e, 0xa, 0x56, 0xa, 0xb, 0x55, + 0xa, 0x9c, 0xf8, 0x90, 0x15, 0xda, 0xfb, 0xc1, 0x6, 0xb, 0xf7, 0x7e, + 0x5, 0x2f, 0x6, 0xe, 0x6, 0xf7, 0x30, 0xf7, 0xf, 0x6f, 0xb0, 0xfb, + 0x79, 0xfb, 0x4d, 0x5, 0xe, 0x7c, 0x82, 0xa, 0xf7, 0x1e, 0xc3, 0xb, + 0xf7, 0x7e, 0x1, 0xf7, 0x6e, 0xf7, 0x37, 0x3, 0xb, 0xfb, 0x7, 0x15, + 0xe2, 0xf7, 0x7, 0x34, 0x6, 0xb, 0xf7, 0x1a, 0xc2, 0xf7, 0x38, 0xc4, + 0xdd, 0xc3, 0xb, 0x15, 0xde, 0xf7, 0x9, 0x38, 0x6, 0xb, 0x7c, 0xc3, + 0xf7, 0xf2, 0xc4, 0xb, 0x79, 0xc0, 0xf8, 0x7c, 0xc0, 0xb, 0x15, 0xb2, + 0xab, 0xab, 0xb2, 0xb2, 0xab, 0x6b, 0x64, 0x64, 0x6b, 0x6b, 0x64, 0xb, + 0xfb, 0x31, 0xbe, 0xf7, 0x12, 0xbc, 0xf7, 0xc9, 0xbe, 0x5c, 0xbf, 0x12, + 0xb, 0xc2, 0xf7, 0xdd, 0xc2, 0xb, 0x1, 0xf7, 0xa6, 0xb, 0x32, 0x58, + 0x3a, 0x3e, 0x50, 0x29, 0x27, 0x40, 0xc9, 0xd7, 0x1e, 0xb, 0x12, 0x92, + 0xf7, 0x58, 0xfb, 0x2a, 0xf7, 0x9a, 0xe9, 0xf7, 0x4b, 0xb, 0x79, 0xc2, + 0xf8, 0x6b, 0xc2, 0xb, 0x8b, 0xc1, 0xf8, 0x5c, 0xc1, 0xb, 0xf7, 0x7e, + 0x1, 0xf7, 0x23, 0xf7, 0xce, 0x3, 0xf7, 0x23, 0xb, 0xf8, 0x85, 0xf7, + 0x43, 0x1, 0xf7, 0x4e, 0xf7, 0x77, 0x3, 0xb, 0x8b, 0xc2, 0xf7, 0xdb, + 0xc2, 0x68, 0xa, 0xc3, 0x3, 0xb, 0xf7, 0x7, 0x15, 0xa7, 0xb8, 0xfb, + 0x2e, 0xf7, 0x4, 0x5, 0xb, 0x15, 0xa7, 0x73, 0xf7, 0x3e, 0xf7, 0x10, + 0x5f, 0xbe, 0x5, 0xb, 0x15, 0xdc, 0xf7, 0x9, 0x3a, 0x6, 0xb, 0xc2, + 0x3, 0xea, 0x16, 0xf8, 0x2e, 0xb, 0x8b, 0xc1, 0xf7, 0xd2, 0xc1, 0x1, + 0xb, 0x8b, 0xc1, 0xf8, 0x5a, 0xc1, 0x1, 0xb, 0x15, 0xe5, 0xf7, 0x8, + 0x31, 0x6, 0xb, 0x15, 0xb7, 0x6, 0x9d, 0xf7, 0x8f, 0x5, 0x3a, 0x6, + 0xb, 0xf7, 0x4d, 0x6f, 0x66, 0xf7, 0x30, 0xfb, 0xf, 0x5, 0xb, 0x15, + 0xf7, 0xac, 0x26, 0x96, 0xa9, 0xfb, 0x96, 0xb, 0x1, 0xf7, 0x79, 0xf7, + 0x22, 0x3, 0xf7, 0x79, 0xb, 0xd1, 0xf8, 0xc, 0x1, 0xe7, 0xf8, 0x34, + 0x3, 0xb, 0xf7, 0x5e, 0x15, 0xf7, 0x36, 0xfb, 0x17, 0x6, 0xb, 0xf7, + 0xa4, 0xbe, 0x1, 0x73, 0xf9, 0x1c, 0x3, 0xb, 0xf8, 0xa9, 0x15, 0xd4, + 0xf7, 0x10, 0x42, 0x6, 0xb, 0xf7, 0xf, 0x1e, 0xf0, 0x54, 0x7, 0xe, + 0x6, 0xfb, 0x2e, 0xfb, 0x4, 0xb, 0x1, 0xf7, 0xa5, 0xc4, 0x3, 0xb, + 0xc2, 0xf7, 0x33, 0xc3, 0xb}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixedBold.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixedBold.cpp new file mode 100644 index 000000000000..c1494f51aabc --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixedBold.cpp @@ -0,0 +1,1514 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitFixedBoldFontData[18055] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x13, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x46, 0x69, 0x78, 0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x42, + 0x6f, 0x6c, 0x64, 0x0, 0x1, 0x1, 0x1, 0x24, 0xf8, 0x10, 0x0, 0xf8, + 0x2a, 0x1, 0xf8, 0x2b, 0x2, 0xf8, 0x2c, 0x3, 0xf8, 0x14, 0x4, 0xfb, + 0x5, 0xfb, 0x8d, 0xf9, 0x5d, 0xf9, 0xbf, 0x5, 0xf7, 0xa0, 0xf, 0xf9, + 0x6, 0x11, 0xae, 0x1c, 0x40, 0xc8, 0x12, 0x0, 0x12, 0x1, 0x1, 0x5, + 0x7, 0x9, 0x11, 0x19, 0x1f, 0x25, 0x29, 0x2d, 0x39, 0x42, 0x49, 0x53, + 0x5c, 0x65, 0x8f, 0xa3, 0xb2, 0x49, 0x64, 0x6f, 0x74, 0x49, 0x4a, 0x69, + 0x6a, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x73, 0x63, 0x65, + 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x67, + 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x6c, 0x69, 0x72, 0x61, 0x45, 0x75, 0x72, + 0x6f, 0x70, 0x72, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66, 0x74, 0x61, 0x72, + 0x72, 0x6f, 0x77, 0x75, 0x70, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, + 0x61, 0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78, + 0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x43, + 0x68, 0x72, 0x6F, 0x6D, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64, 0x20, 0x4f, + 0x54, 0x46, 0x0, 0x0, 0x1, 0x0, 0x1, 0x6, 0x0, 0x68, 0x0, 0x0, + 0x9, 0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67, 0x0, 0x0, + 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, + 0xaa, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97, 0x0, 0x0, + 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, + 0xa4, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98, 0x0, 0x0, + 0x73, 0x0, 0x0, 0x72, 0x0, 0x0, 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, + 0x8f, 0x0, 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b, 0x0, 0x0, + 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0, 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, + 0xb0, 0x0, 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a, 0x0, 0x0, + 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, + 0xb6, 0x2, 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe, 0x0, 0x0, + 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5, 0x0, 0x0, + 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0, 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, + 0xcd, 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90, 0x0, 0x0, + 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, + 0xd3, 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb, 0x0, 0x0, + 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x93, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2, 0x0, 0x0, + 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x1, 0x87, 0x0, 0x0, 0x91, 0x0, 0x1, + 0x88, 0x1, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x94, 0x0, 0x1, 0x8a, 0x1, 0x0, 0xc0, 0x0, 0x0, 0xdd, 0x0, 0x0, + 0xc6, 0x1, 0x0, 0xe4, 0x0, 0x0, 0x65, 0x0, 0x1, 0x8c, 0x1, 0x0, + 0x7e, 0x0, 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75, 0x0, 0x0, + 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, + 0x74, 0x0, 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63, 0x0, 0x1, + 0x8e, 0x2, 0x0, 0x99, 0x0, 0x1, 0x91, 0x4, 0x0, 0xa6, 0x0, 0x0, + 0x6d, 0x1, 0x0, 0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, + 0x34, 0x0, 0x60, 0x0, 0xc1, 0x1, 0x42, 0x1, 0xcc, 0x2, 0x52, 0x2, + 0x68, 0x2, 0x9d, 0x2, 0xd2, 0x3, 0x2, 0x3, 0x26, 0x3, 0x39, 0x3, + 0x4e, 0x3, 0x67, 0x3, 0x7e, 0x3, 0xc4, 0x3, 0xe8, 0x4, 0x2f, 0x4, + 0x8e, 0x4, 0xc1, 0x5, 0xf, 0x5, 0x77, 0x5, 0x96, 0x6, 0xc, 0x6, + 0x73, 0x6, 0x86, 0x6, 0xa9, 0x6, 0xc6, 0x6, 0xe4, 0x7, 0x1, 0x7, + 0x5f, 0x7, 0xff, 0x8, 0x3d, 0x8, 0xa0, 0x8, 0xee, 0x9, 0x22, 0x9, + 0x69, 0x9, 0xb0, 0x9, 0xd8, 0xa, 0x12, 0xa, 0x26, 0xa, 0x57, 0xa, + 0x94, 0xa, 0xb6, 0xa, 0xf8, 0xb, 0x2d, 0xb, 0x76, 0xb, 0xb7, 0xc, + 0x32, 0xc, 0x86, 0xc, 0xfa, 0xd, 0x26, 0xd, 0x64, 0xd, 0x94, 0xd, + 0xcc, 0xe, 0xf, 0xe, 0x45, 0xe, 0x6f, 0xe, 0x8b, 0xe, 0x9f, 0xe, + 0xbb, 0xe, 0xea, 0xe, 0xf6, 0xf, 0xc, 0xf, 0x73, 0xf, 0xd4, 0x10, + 0x1d, 0x10, 0x7c, 0x10, 0xc8, 0x11, 0x6, 0x11, 0x43, 0x11, 0x90, 0x11, + 0xc3, 0x12, 0x7, 0x12, 0x43, 0x12, 0x56, 0x12, 0xb6, 0x12, 0xfd, 0x13, + 0x39, 0x13, 0x97, 0x13, 0xdd, 0x14, 0x1d, 0x14, 0x95, 0x14, 0xd4, 0x15, + 0x29, 0x15, 0x51, 0x15, 0x91, 0x15, 0xd0, 0x16, 0x7, 0x16, 0x3f, 0x16, + 0xa5, 0x16, 0xb5, 0x17, 0x1b, 0x17, 0x62, 0x17, 0x94, 0x17, 0xe6, 0x18, + 0x64, 0x18, 0xd4, 0x19, 0x29, 0x19, 0x41, 0x19, 0xe1, 0x1a, 0x7, 0x1a, + 0x90, 0x1a, 0xf6, 0x1b, 0x29, 0x1b, 0x44, 0x1b, 0xd1, 0x1b, 0xe4, 0x1c, + 0x1e, 0x1c, 0x4b, 0x1c, 0x95, 0x1c, 0xfe, 0x1d, 0x14, 0x1d, 0x76, 0x1d, + 0xa3, 0x1d, 0xbf, 0x1d, 0xf9, 0x1e, 0x25, 0x1e, 0x5f, 0x1e, 0x93, 0x1e, + 0xf6, 0x1f, 0x64, 0x1f, 0xff, 0x20, 0x60, 0x20, 0x81, 0x20, 0xa0, 0x20, + 0xca, 0x21, 0x23, 0x21, 0x4c, 0x21, 0x8d, 0x21, 0xf8, 0x22, 0x7b, 0x22, + 0x8e, 0x22, 0xc1, 0x22, 0xf5, 0x23, 0x31, 0x23, 0x49, 0x23, 0x68, 0x23, + 0x93, 0x23, 0xc1, 0x24, 0xc, 0x24, 0x7f, 0x24, 0xa0, 0x24, 0xba, 0x24, + 0xdf, 0x25, 0x33, 0x25, 0x5a, 0x25, 0x89, 0x26, 0x6, 0x26, 0x1e, 0x26, + 0x35, 0x26, 0x5d, 0x26, 0x92, 0x26, 0xdd, 0x27, 0x26, 0x27, 0xb4, 0x27, + 0xd5, 0x27, 0xf6, 0x28, 0x26, 0x28, 0x8b, 0x28, 0xcc, 0x29, 0x8, 0x29, + 0xb0, 0x2a, 0x2c, 0x2a, 0x46, 0x2a, 0x5f, 0x2a, 0x83, 0x2a, 0xa2, 0x2a, + 0xb8, 0x2a, 0xcd, 0x2a, 0xf5, 0x2b, 0x3a, 0x2b, 0xab, 0x2c, 0x35, 0x2c, + 0x54, 0x2c, 0x70, 0x2c, 0x95, 0x2c, 0xe7, 0x2d, 0xa, 0x2d, 0x29, 0x2d, + 0xbd, 0x2d, 0xd4, 0x2d, 0xea, 0x2e, 0xe, 0x2e, 0x5a, 0x2e, 0x86, 0x2e, + 0xe6, 0x2f, 0x21, 0x2f, 0x4b, 0x2f, 0x5c, 0x2f, 0xa1, 0x30, 0x14, 0x30, + 0x4e, 0x30, 0x7b, 0x30, 0xe8, 0x31, 0x65, 0x32, 0x14, 0x32, 0xc5, 0x33, + 0x60, 0x33, 0xf4, 0x34, 0x57, 0x34, 0xa2, 0x34, 0xf2, 0x35, 0x4f, 0x35, + 0x9b, 0x35, 0xeb, 0x36, 0xe, 0x36, 0x1b, 0x36, 0x4a, 0x36, 0x61, 0x36, + 0x96, 0x36, 0xca, 0x37, 0x9, 0x37, 0x31, 0x37, 0x44, 0x37, 0x57, 0x37, + 0x6e, 0x37, 0x80, 0x37, 0x94, 0x37, 0xa2, 0x37, 0xb7, 0x37, 0xce, 0x37, + 0xee, 0x38, 0x22, 0x38, 0x43, 0x38, 0x90, 0x39, 0x34, 0x39, 0x4d, 0x39, + 0x6b, 0x39, 0x82, 0x3a, 0x8, 0x3a, 0x89, 0x3a, 0xf0, 0x3b, 0x34, 0x3b, + 0x41, 0x3b, 0x63, 0x3b, 0x71, 0x3b, 0x94, 0x3b, 0xa8, 0x3b, 0xb4, 0x3c, + 0x11, 0x3c, 0x6a, 0xe, 0xe, 0x7c, 0xf7, 0x31, 0xf8, 0x44, 0x77, 0x1, + 0xf7, 0x7e, 0xf7, 0x17, 0x3, 0xf7, 0x89, 0xf7, 0x4b, 0x15, 0xf7, 0x2, + 0x6, 0x9f, 0xf8, 0x19, 0x5, 0xfb, 0x2b, 0x6, 0x75, 0xfc, 0x90, 0x15, + 0x5f, 0xb7, 0x68, 0xc1, 0xc1, 0xb7, 0xae, 0xb7, 0xb7, 0x5f, 0xad, 0x55, + 0x55, 0x5f, 0x69, 0x5f, 0x1e, 0xe, 0xf7, 0xb8, 0x76, 0xf7, 0xb7, 0x77, + 0x1, 0xf7, 0x28, 0xf7, 0x6, 0xd6, 0xf7, 0x5, 0x3, 0xf7, 0xe5, 0xf7, + 0xa9, 0x15, 0xf7, 0x5, 0x6, 0x9a, 0x59, 0xa, 0xfb, 0x22, 0x6, 0xfb, + 0x43, 0xfb, 0xb1, 0x15, 0xf7, 0x6, 0x6, 0x9b, 0x59, 0xa, 0xfb, 0x23, + 0x6, 0xe, 0x5e, 0x76, 0xf7, 0x75, 0xe6, 0xf3, 0xe6, 0xf7, 0x54, 0x77, + 0x1, 0xf7, 0x24, 0xe3, 0xf3, 0xe7, 0x3, 0xf7, 0x1d, 0x5e, 0x15, 0xe4, + 0x6, 0x98, 0xf7, 0x60, 0x5, 0xf4, 0x6, 0x7c, 0xfb, 0x60, 0x5, 0xe8, + 0x6, 0x98, 0xf7, 0x60, 0x5, 0xf7, 0x1, 0xe6, 0x24, 0x6, 0x91, 0xf3, + 0x5, 0xec, 0xe6, 0x30, 0x6, 0x92, 0xf7, 0x62, 0x5, 0x31, 0x6, 0x83, + 0xfb, 0x62, 0x5, 0x24, 0x6, 0x92, 0xf7, 0x62, 0x5, 0x32, 0x6, 0x82, + 0xfb, 0x62, 0x5, 0xfb, 0x4, 0x30, 0xf6, 0x6, 0x84, 0x23, 0x5, 0x27, + 0x30, 0xea, 0x6, 0xe9, 0xe6, 0x15, 0x93, 0xf3, 0x5, 0xf1, 0x6, 0x85, + 0x23, 0x5, 0xe, 0x22, 0x76, 0xf7, 0x13, 0xf7, 0x54, 0xf7, 0x56, 0xf7, + 0x53, 0x20, 0xf7, 0x57, 0x12, 0xe0, 0xef, 0xcb, 0xef, 0xbf, 0xee, 0x3a, + 0xee, 0x13, 0xdd, 0xdc, 0x8c, 0x15, 0xef, 0xa9, 0x6, 0x84, 0x9f, 0xa6, + 0x86, 0xa0, 0x1b, 0xfb, 0x25, 0xef, 0xf7, 0x24, 0x7, 0xb1, 0x92, 0xf7, + 0x17, 0xa1, 0xf7, 0x13, 0x1a, 0xf3, 0x37, 0x9e, 0x20, 0xa7, 0x1e, 0x62, + 0x97, 0x26, 0x9d, 0xc1, 0x1a, 0xc0, 0xd9, 0x94, 0xaa, 0x1e, 0x13, 0xee, + 0xb0, 0xb0, 0x81, 0x7c, 0xac, 0x1f, 0x50, 0xee, 0xf7, 0x53, 0x28, 0x6c, + 0x7, 0x7b, 0x93, 0x7a, 0x91, 0x78, 0x8e, 0x8, 0x13, 0xdd, 0xf1, 0x27, + 0x26, 0x7, 0x46, 0x82, 0x2c, 0x67, 0xfb, 0x7, 0x1a, 0x21, 0xde, 0x76, + 0xf7, 0xe, 0x69, 0x1e, 0xb6, 0x80, 0xe1, 0x83, 0x56, 0x1a, 0x55, 0x25, + 0x87, 0x6f, 0x66, 0x67, 0x91, 0x9a, 0x68, 0x1e, 0xc5, 0x27, 0x7, 0xe, + 0x91, 0x76, 0xf7, 0x5f, 0xd1, 0xdd, 0xd0, 0xf7, 0x1c, 0xd2, 0x12, 0xc7, + 0xd2, 0xf7, 0x9, 0xd2, 0x64, 0xd1, 0xf7, 0xa, 0xd2, 0x13, 0xfb, 0xc7, + 0xf8, 0x71, 0x15, 0x42, 0xc3, 0x4c, 0xe3, 0x8a, 0x1e, 0xdb, 0xcd, 0xc5, + 0xdb, 0xd1, 0x52, 0xcf, 0x34, 0x36, 0x4e, 0x48, 0x43, 0x1f, 0xd2, 0x8c, + 0x15, 0xae, 0xa5, 0xab, 0xba, 0x1e, 0x13, 0xeb, 0xba, 0xa8, 0x6c, 0x67, + 0x5d, 0x64, 0x74, 0x65, 0x5e, 0x70, 0xac, 0xaf, 0x1f, 0x13, 0xfd, 0xf7, + 0x9, 0xfb, 0xf7, 0x15, 0x43, 0xc5, 0x4a, 0xe3, 0x8a, 0x1e, 0x13, 0x45, + 0xda, 0xcd, 0xc5, 0xdc, 0xd2, 0x52, 0xce, 0x35, 0x36, 0x4c, 0x49, 0x42, + 0x1f, 0xd2, 0x8c, 0x15, 0xad, 0xa6, 0xad, 0xbb, 0x1e, 0x13, 0x5, 0xb9, + 0xa7, 0x6a, 0x68, 0x5c, 0x66, 0x76, 0x65, 0x5d, 0x6f, 0xab, 0xaf, 0x1f, + 0xfb, 0x6b, 0xb3, 0x15, 0x13, 0x0, 0xf8, 0x46, 0xf7, 0x63, 0x6f, 0xcf, + 0xfc, 0x47, 0xfb, 0x6a, 0x5, 0xe, 0x7c, 0xe7, 0x3b, 0xe8, 0xf7, 0xa, + 0xe8, 0xf7, 0x28, 0xe9, 0x12, 0xb8, 0xec, 0x68, 0xec, 0x13, 0xb8, 0xf7, + 0x2f, 0xf7, 0xc4, 0x15, 0x4d, 0x6d, 0x5b, 0x4f, 0x45, 0x1a, 0x46, 0xbd, + 0x31, 0xf7, 0xb, 0xdb, 0xad, 0xad, 0x9d, 0xa3, 0x1e, 0x13, 0x74, 0xb3, + 0x63, 0x5, 0xf7, 0x37, 0xe8, 0xfb, 0xc, 0x6, 0x6f, 0xa4, 0x9f, 0xa8, + 0x97, 0xac, 0x98, 0xaa, 0x19, 0xde, 0xe8, 0xfb, 0x27, 0x6, 0x86, 0x73, + 0x77, 0x52, 0x7c, 0x71, 0x30, 0xf7, 0xd, 0x18, 0x7c, 0x9f, 0x65, 0xbd, + 0xa2, 0x1a, 0xaa, 0xa8, 0x95, 0xae, 0xb5, 0xbe, 0x73, 0x79, 0x98, 0x1e, + 0xc2, 0xd0, 0x5, 0xb3, 0x66, 0x4b, 0xa6, 0x4f, 0x1b, 0x38, 0x3d, 0x63, + 0x2e, 0x5a, 0xb2, 0x64, 0x93, 0x7b, 0x1f, 0xbe, 0x43, 0x15, 0xe7, 0x6a, + 0xa, 0x13, 0xb8, 0x74, 0x77, 0x6d, 0x7d, 0x6c, 0x1b, 0x54, 0x78, 0xb5, + 0xa9, 0xb8, 0xb1, 0xa4, 0xa4, 0x9a, 0x1f, 0xe, 0x4c, 0xa, 0xf7, 0x7d, + 0xf7, 0x19, 0x3, 0xf7, 0x84, 0xf7, 0xa9, 0x15, 0xf7, 0xb, 0x6, 0x99, + 0x59, 0xa, 0xfb, 0x26, 0x6, 0xe, 0x3a, 0x76, 0xf9, 0x62, 0x77, 0x1, + 0xf7, 0x47, 0xf7, 0x1, 0x3, 0xf7, 0xd3, 0x25, 0x15, 0xf1, 0x6, 0x53, + 0xe2, 0x3e, 0xf7, 0xf, 0xf7, 0x52, 0x1a, 0xf7, 0x2b, 0xc4, 0xc0, 0xd7, + 0xf7, 0x6, 0x1e, 0x29, 0x6, 0x32, 0x27, 0x54, 0x27, 0xfb, 0xb, 0x1a, + 0xfb, 0x17, 0xa0, 0xfb, 0x0, 0xf7, 0xb, 0xfb, 0x34, 0x1e, 0xe, 0x3a, + 0x76, 0xf9, 0x62, 0x77, 0x1, 0xf7, 0xcc, 0xf7, 0x1, 0x3, 0xf7, 0x47, + 0x25, 0x15, 0xf1, 0x6, 0xf7, 0xb, 0xf7, 0x34, 0xa0, 0xf7, 0x0, 0xf7, + 0x17, 0x1a, 0xf7, 0xb, 0x54, 0xef, 0x32, 0xef, 0x1e, 0x29, 0x6, 0xd7, + 0xfb, 0x6, 0xc4, 0x56, 0xfb, 0x2b, 0x1a, 0xfb, 0x52, 0x3e, 0xfb, 0xf, + 0x53, 0x34, 0x1e, 0xe, 0xf7, 0x8e, 0xf1, 0x3, 0xf7, 0x22, 0xf7, 0xac, + 0x15, 0xdf, 0x4e, 0xd6, 0xf7, 0xc, 0xd6, 0xfb, 0xb, 0xdf, 0xc8, 0x33, + 0xf2, 0xf7, 0x1d, 0xad, 0x69, 0xed, 0xfb, 0x14, 0x59, 0x95, 0xf7, 0x1b, + 0x5, 0x6b, 0xa, 0x93, 0xfb, 0x19, 0xfb, 0x13, 0xbb, 0x67, 0x28, 0xf7, + 0x20, 0x6a, 0x5, 0xe, 0xc7, 0x76, 0xf7, 0x41, 0xe9, 0xf7, 0x40, 0x67, + 0xa, 0xed, 0x3, 0xd2, 0xf7, 0x68, 0x15, 0xf7, 0x48, 0xfb, 0x41, 0xed, + 0xf7, 0x41, 0xf7, 0x48, 0xe9, 0xfb, 0x48, 0xf7, 0x40, 0x29, 0xfb, 0x40, + 0xfb, 0x48, 0x6, 0xe, 0x31, 0x45, 0xa, 0xf7, 0x39, 0xfb, 0x3, 0x15, + 0xf7, 0x14, 0x6, 0xf7, 0x22, 0x59, 0xa, 0xfb, 0x3d, 0x6, 0xe, 0xf7, + 0x5f, 0xf7, 0x2, 0x1, 0xef, 0xf8, 0x24, 0x3, 0xef, 0xf7, 0x5f, 0x15, + 0xf8, 0x24, 0xf7, 0x2, 0xfc, 0x24, 0x6, 0xe, 0x7c, 0xf7, 0x4e, 0x6d, + 0xa, 0xd9, 0x15, 0x58, 0xbc, 0x61, 0xc6, 0xc6, 0xbc, 0xb5, 0xbe, 0xbe, + 0x5a, 0xb5, 0x50, 0x50, 0x5a, 0x61, 0x58, 0x1e, 0xe, 0x53, 0x76, 0xf9, + 0x53, 0x77, 0x1, 0xed, 0xf8, 0x28, 0x3, 0xed, 0x5d, 0x15, 0xd0, 0x6c, + 0xf7, 0xe3, 0xf9, 0x34, 0x45, 0xaa, 0x5, 0xe, 0x7c, 0xe8, 0xf8, 0x51, + 0xe8, 0x1, 0xe2, 0xed, 0xf7, 0x7c, 0xeb, 0x3, 0xe2, 0xf7, 0xbe, 0x15, + 0x42, 0x99, 0xfb, 0x84, 0xf7, 0x5c, 0xf7, 0x60, 0x93, 0xf7, 0x84, 0xd5, + 0xd4, 0x78, 0xf7, 0x88, 0xfb, 0x53, 0xfb, 0x66, 0x85, 0xfb, 0x86, 0x3f, + 0x1e, 0xed, 0x8c, 0x15, 0xc6, 0x8d, 0x90, 0xf7, 0x39, 0xf7, 0x1, 0x1b, + 0xf7, 0x3, 0x90, 0xfb, 0x3c, 0x50, 0x3b, 0x7c, 0xfb, 0x1e, 0x28, 0x20, + 0x80, 0xf7, 0x1f, 0xdd, 0x1f, 0xe, 0x8b, 0xe8, 0xf8, 0x9f, 0x77, 0x1, + 0xf7, 0x91, 0xec, 0x3, 0xd2, 0x16, 0xf8, 0x5e, 0xe8, 0xfb, 0x47, 0xf8, + 0x9f, 0x6, 0xfb, 0x9e, 0x56, 0x5, 0x30, 0x7, 0xf7, 0x3d, 0xad, 0x5, + 0xfc, 0x31, 0xfb, 0x4a, 0x7, 0xe, 0x8b, 0xea, 0x2c, 0xf7, 0x34, 0xf7, + 0xfe, 0xe9, 0x12, 0xf2, 0xed, 0xf7, 0x6f, 0xee, 0x13, 0x78, 0xdc, 0x16, + 0xf8, 0x4a, 0xf7, 0x34, 0x2c, 0x6, 0x13, 0xb8, 0x4a, 0xfb, 0x4c, 0x7, + 0xf7, 0x1, 0xe8, 0xf7, 0x3e, 0xf7, 0x17, 0xef, 0x1a, 0xef, 0x42, 0xec, + 0xfb, 0x1d, 0x39, 0x43, 0x69, 0x4d, 0x57, 0x1e, 0x34, 0xed, 0x7, 0xdf, + 0xe1, 0x90, 0xa6, 0xca, 0xb6, 0x68, 0x48, 0x58, 0xfb, 0xb, 0x28, 0xfb, + 0x70, 0xfb, 0x45, 0x1e, 0xe, 0x7c, 0xe8, 0xf7, 0x50, 0xe8, 0xf7, 0x37, + 0xe9, 0x12, 0xf8, 0x1b, 0xf2, 0x44, 0xeb, 0x13, 0xe8, 0xdc, 0xb3, 0x15, + 0x79, 0xbe, 0xcc, 0x66, 0xed, 0x1b, 0xdb, 0xf7, 0x24, 0xb7, 0xf7, 0x23, + 0xe1, 0x5e, 0xaa, 0x5b, 0xac, 0x1f, 0x13, 0xf0, 0xba, 0xa1, 0xa1, 0xc4, + 0xc1, 0x1a, 0xf7, 0x6, 0x8a, 0x2a, 0xba, 0x23, 0x1b, 0x40, 0x6a, 0x6f, + 0x66, 0x4f, 0x1f, 0xad, 0x42, 0x5, 0xb2, 0xd3, 0x9f, 0x90, 0xb6, 0x1b, + 0xc8, 0xb0, 0x77, 0x50, 0x3e, 0x33, 0x84, 0x4e, 0x1f, 0x2e, 0x7, 0x13, + 0xe8, 0xe6, 0xe4, 0x7f, 0x39, 0x4d, 0x4f, 0x6b, 0x46, 0x57, 0x56, 0x9b, + 0xaf, 0x40, 0x1f, 0xe, 0x8b, 0xe9, 0xdf, 0xe9, 0xf7, 0xec, 0x77, 0x1, + 0xf7, 0xe3, 0xeb, 0x3, 0xd4, 0xf7, 0x46, 0x15, 0xf7, 0x9a, 0x37, 0x23, + 0x2d, 0xf7, 0xbc, 0xe9, 0x2b, 0xdf, 0xe8, 0xe9, 0x2e, 0xf7, 0xec, 0x24, + 0x6, 0xfb, 0x93, 0xfb, 0xf9, 0x5, 0xf7, 0x2, 0x98, 0x15, 0xf7, 0x2c, + 0xf7, 0x73, 0x5, 0xfb, 0x73, 0x7, 0xe, 0x7c, 0xe7, 0xf7, 0x75, 0xe5, + 0xf7, 0x8, 0xe8, 0x1, 0xf7, 0x9, 0xeb, 0xf7, 0x6c, 0xeb, 0x3, 0xd5, + 0xaf, 0x15, 0x7b, 0xb1, 0xeb, 0x68, 0xe1, 0x1b, 0xf7, 0x31, 0xd5, 0xee, + 0xf6, 0xf7, 0x7, 0x3f, 0xe1, 0xfb, 0xa, 0x67, 0x63, 0x89, 0x7e, 0x61, + 0x1f, 0xf7, 0x17, 0xf7, 0xb2, 0xe8, 0xfc, 0x12, 0xfb, 0xaf, 0x7, 0xbc, + 0x52, 0xb3, 0xa8, 0xbd, 0x98, 0xb8, 0x8a, 0x19, 0xd0, 0x8a, 0xc6, 0x64, + 0x41, 0x1a, 0x4c, 0x5b, 0x5b, 0x36, 0x48, 0x4d, 0xa3, 0xa1, 0x51, 0x1e, + 0xe, 0x7c, 0xe4, 0xf7, 0x69, 0xe9, 0xf7, 0x1c, 0xe6, 0x1, 0xdf, 0xf7, + 0x2, 0xf7, 0x6a, 0xec, 0x3, 0xf7, 0x51, 0xf7, 0xee, 0x15, 0xf7, 0x19, + 0xa5, 0xf7, 0x1, 0xb1, 0xf7, 0xd, 0x1b, 0xa0, 0xa0, 0x8f, 0x87, 0xa0, + 0x1f, 0x92, 0xe9, 0x5, 0x8e, 0x73, 0x73, 0x85, 0x75, 0x1b, 0xfb, 0xf, + 0x31, 0x6c, 0x40, 0x46, 0x1f, 0x5f, 0x59, 0x68, 0x32, 0x30, 0x1a, 0xfb, + 0x21, 0xce, 0xfb, 0x26, 0xf7, 0x30, 0xf6, 0xe6, 0xde, 0xf7, 0x3, 0xf7, + 0x12, 0x45, 0xd7, 0xfb, 0x16, 0x56, 0x75, 0x7f, 0x74, 0x62, 0x1e, 0x90, + 0xfb, 0x17, 0x15, 0x8b, 0xa2, 0xd3, 0xdf, 0xdc, 0xa5, 0x5a, 0x53, 0x48, + 0x5e, 0x62, 0x51, 0x43, 0x64, 0xd6, 0xcd, 0x1e, 0xe, 0xa0, 0x76, 0xf8, + 0x90, 0xe8, 0x1, 0xe5, 0xed, 0x3, 0xf7, 0x5d, 0x16, 0xf6, 0x6, 0xf7, + 0x5c, 0xf8, 0x8e, 0x8c, 0xea, 0x5, 0xfc, 0x37, 0xfb, 0x48, 0xed, 0xe2, + 0xf7, 0x6e, 0x6, 0xe, 0x7c, 0xe8, 0xf7, 0x53, 0xe9, 0xf7, 0x22, 0xe9, + 0x12, 0xde, 0xee, 0x32, 0xee, 0xf7, 0x6c, 0xec, 0x36, 0xec, 0x13, 0xf2, + 0xf7, 0x3d, 0xf7, 0xd5, 0x15, 0x58, 0x69, 0x68, 0x57, 0x4d, 0x1a, 0xfb, + 0x13, 0xf7, 0x9, 0x4e, 0xef, 0xf7, 0x10, 0xe8, 0xc7, 0xf7, 0x12, 0xcc, + 0x6c, 0xbc, 0x55, 0xb0, 0x1e, 0x13, 0xec, 0xb7, 0xac, 0xa8, 0xb8, 0xc9, + 0x1a, 0xf0, 0x34, 0xc5, 0xfb, 0xa, 0xfb, 0x16, 0x3e, 0x43, 0x31, 0x54, + 0xa7, 0x5c, 0xbb, 0x67, 0x1e, 0xa2, 0xf7, 0x19, 0x15, 0xbb, 0xb7, 0xaa, + 0xcb, 0xe0, 0xa2, 0x6b, 0x5d, 0x51, 0x54, 0x6c, 0x56, 0x50, 0x5a, 0xae, + 0xc0, 0x1e, 0x13, 0xf2, 0x81, 0xfb, 0xaf, 0x15, 0xc0, 0xc2, 0xb8, 0xca, + 0xde, 0xb0, 0x57, 0x5d, 0x4f, 0x69, 0x6d, 0x37, 0x3e, 0x60, 0xb6, 0xba, + 0x1e, 0xe, 0x7c, 0xe8, 0xf7, 0x1a, 0xed, 0xf7, 0x68, 0xe9, 0x1, 0xe5, + 0xf1, 0xf7, 0x6d, 0xf5, 0x3, 0xdf, 0x81, 0x15, 0x88, 0xa6, 0xa5, 0x89, + 0xa4, 0x1b, 0xf7, 0x3c, 0xf7, 0xf, 0xcd, 0xf7, 0x28, 0xb7, 0x1f, 0x97, + 0xb3, 0x91, 0xb8, 0xbf, 0x1a, 0xf7, 0x3, 0x6d, 0xf7, 0x42, 0xfb, 0x4e, + 0xfb, 0xb, 0x31, 0x2d, 0x26, 0xfb, 0x0, 0xd8, 0x23, 0xf7, 0x13, 0xb6, + 0xac, 0x9c, 0x9a, 0xa4, 0x1e, 0xfb, 0xd, 0x6f, 0x3b, 0x5c, 0xfb, 0x14, + 0x1b, 0x75, 0x74, 0x8d, 0x8d, 0x73, 0x1f, 0xf7, 0xd3, 0xf7, 0xcd, 0x15, + 0x87, 0x8c, 0x6f, 0x3c, 0x37, 0x1b, 0x50, 0x5c, 0xb8, 0xd1, 0xd4, 0xca, + 0xa6, 0xb9, 0xe1, 0x97, 0x42, 0x50, 0x95, 0x1f, 0xe, 0x7c, 0xf7, 0x44, + 0xe1, 0xf7, 0x44, 0x6d, 0xa, 0xf7, 0xe5, 0x15, 0x37, 0xa, 0xfb, 0x9c, + 0x4, 0x37, 0xa, 0xe, 0x31, 0x76, 0xf8, 0x7, 0xf7, 0x44, 0x1, 0xf7, + 0x76, 0xf7, 0x6c, 0x3, 0xf7, 0x31, 0xfb, 0x3, 0x15, 0xf7, 0x1c, 0x6, + 0xf7, 0x29, 0xf7, 0xad, 0x5, 0xfb, 0x46, 0x6, 0x65, 0xf7, 0x3b, 0x15, + 0x37, 0xa, 0xe, 0x5e, 0xa, 0xf7, 0x5c, 0x15, 0xf8, 0x5d, 0xfb, 0x4d, + 0x5, 0xe9, 0x7, 0xfb, 0xf6, 0xf7, 0x2a, 0xf7, 0xf6, 0xf7, 0x28, 0x5, + 0xe9, 0x7, 0xfc, 0x5d, 0xfb, 0x4c, 0x5, 0xe, 0xf7, 0xa, 0xf1, 0xd7, + 0xf1, 0x1, 0xd2, 0xf8, 0x5e, 0x3, 0xd2, 0xf7, 0xbc, 0x15, 0xf8, 0x5e, + 0xf1, 0xfc, 0x5e, 0x6, 0xfb, 0xac, 0x4, 0xf8, 0x5e, 0xf1, 0xfc, 0x5e, + 0x6, 0xe, 0x5e, 0xa, 0x9a, 0x15, 0xf8, 0x5d, 0xf7, 0x4d, 0x5, 0xf7, + 0x9, 0x7, 0xfc, 0x5d, 0xf7, 0x4c, 0x5, 0x2d, 0x7, 0xf7, 0xf9, 0xfb, + 0x28, 0xfb, 0xf9, 0xfb, 0x2a, 0x5, 0xe, 0x80, 0xf7, 0x2a, 0xf7, 0xf1, + 0xe7, 0x12, 0xed, 0xec, 0x7e, 0xf7, 0x41, 0xbd, 0xeb, 0x13, 0xe8, 0xf7, + 0x70, 0xf7, 0x45, 0x15, 0xec, 0xc8, 0x6, 0xc0, 0x97, 0xf7, 0x17, 0xb0, + 0xf7, 0x10, 0x1a, 0xf7, 0x1, 0x2b, 0xc7, 0xfb, 0xd, 0x53, 0x3e, 0x7d, + 0x77, 0x56, 0x1e, 0xfb, 0x23, 0xec, 0xd6, 0x7, 0xa8, 0x92, 0xae, 0x8f, + 0xad, 0x8a, 0x8, 0xc6, 0x8a, 0xc0, 0x76, 0x54, 0x1a, 0x13, 0x90, 0x40, + 0x2b, 0x7a, 0x32, 0x7d, 0x1e, 0x13, 0xd8, 0x65, 0xfb, 0x88, 0x15, 0x62, + 0xb1, 0x69, 0xbb, 0xbb, 0xb2, 0xad, 0xb4, 0xb4, 0x64, 0xad, 0x5b, 0x5b, + 0x65, 0x69, 0x62, 0x1e, 0xe, 0x79, 0xd3, 0xd2, 0xd4, 0xf7, 0x85, 0x77, + 0xe6, 0xd0, 0x1, 0x9e, 0xdf, 0xcc, 0xd0, 0xf7, 0x9b, 0xdb, 0x3, 0xf7, + 0xea, 0xf7, 0x3b, 0x15, 0x6a, 0xa1, 0xaf, 0x82, 0x9d, 0x1b, 0xc8, 0xf0, + 0xc0, 0xf7, 0x26, 0xbd, 0x81, 0xbc, 0x72, 0xb3, 0x1f, 0xde, 0x57, 0x2f, + 0xac, 0x30, 0x1b, 0xfb, 0x2d, 0xfb, 0x1e, 0x23, 0xfb, 0x5d, 0xfb, 0x1, + 0xbf, 0xfb, 0x4b, 0xf7, 0x78, 0xf7, 0x13, 0xd4, 0xc4, 0xa4, 0xb1, 0x1f, + 0x6f, 0xcf, 0x5, 0x54, 0x3d, 0x4c, 0x74, 0x3f, 0x1b, 0xfb, 0x2d, 0x67, + 0xf7, 0x1b, 0xe3, 0xc9, 0xa2, 0xf7, 0x3f, 0xf7, 0x4c, 0xf7, 0xb, 0xd2, + 0x44, 0x23, 0x3c, 0x69, 0x51, 0x63, 0x7d, 0x77, 0x91, 0xa3, 0x90, 0x8b, + 0x8f, 0x8d, 0x91, 0x1f, 0xbe, 0xf7, 0x52, 0x5, 0x46, 0x6, 0x85, 0x79, + 0x5, 0xa3, 0x74, 0x7e, 0x8b, 0x7d, 0x1b, 0xfb, 0x4, 0x63, 0xfb, 0xe, + 0x3a, 0x35, 0xbe, 0x72, 0xad, 0xac, 0xab, 0x9c, 0xa4, 0xa3, 0x1f, 0x22, + 0xd0, 0x15, 0xc3, 0xa5, 0xd4, 0xbc, 0xa3, 0x8d, 0x74, 0x82, 0x70, 0x77, + 0xfb, 0x0, 0x4f, 0x7b, 0x86, 0x9d, 0x9f, 0x1e, 0xe, 0x8b, 0xe6, 0xd8, + 0xe6, 0xf7, 0x68, 0xe6, 0x1, 0x82, 0x16, 0xf7, 0x8d, 0xe6, 0x31, 0x6, + 0xab, 0xd8, 0x5, 0xf7, 0x80, 0x6, 0xae, 0x3e, 0x5, 0x35, 0x30, 0xf7, + 0x86, 0xe6, 0x52, 0x6, 0xfb, 0x62, 0xf8, 0x6b, 0x5, 0xfb, 0x90, 0x30, + 0xf7, 0x15, 0x6, 0xfb, 0x3f, 0xfc, 0x10, 0x5, 0x4e, 0x6, 0xf7, 0x7c, + 0xf7, 0x3c, 0x15, 0xdb, 0xf7, 0x40, 0xd7, 0xfb, 0x40, 0x5, 0xe, 0x8b, + 0xe6, 0xf7, 0x2e, 0xe6, 0xf7, 0x1b, 0xe6, 0x12, 0xf7, 0x2, 0xeb, 0xf7, + 0x7f, 0xea, 0x4e, 0xeb, 0x13, 0xf4, 0xa7, 0x16, 0xf7, 0xc4, 0x6, 0xf7, + 0x49, 0xc5, 0xcf, 0xeb, 0xb8, 0x78, 0xb5, 0x3f, 0xb7, 0x1f, 0x13, 0xf8, + 0xb2, 0xa8, 0xa0, 0xb4, 0xb7, 0x1a, 0xcd, 0x5a, 0xe2, 0xfb, 0x2d, 0x1e, + 0xfb, 0xc6, 0x30, 0xdd, 0xfc, 0x10, 0x39, 0x6, 0xf7, 0x46, 0xf7, 0x89, + 0x15, 0xf7, 0x1b, 0xf7, 0x12, 0x7, 0xe6, 0x9d, 0x67, 0x6e, 0x4d, 0x3e, + 0x83, 0x6b, 0x1f, 0xfb, 0x12, 0xfb, 0x89, 0x15, 0xf7, 0x2e, 0xf7, 0x12, + 0x7, 0x13, 0xf4, 0xa4, 0xf7, 0xa, 0x8a, 0x3b, 0x4a, 0x55, 0x83, 0x32, + 0x1f, 0xe, 0x79, 0xe7, 0xf8, 0x33, 0xe6, 0x1, 0xaa, 0xec, 0xf7, 0xed, + 0xeb, 0x3, 0xf8, 0x95, 0xf7, 0x20, 0x15, 0x74, 0x6a, 0x40, 0x60, 0x37, + 0x1b, 0xfb, 0x1c, 0x52, 0xf3, 0xf5, 0xf7, 0x2e, 0xf7, 0x8, 0xbe, 0xd6, + 0xc1, 0xc1, 0x77, 0x70, 0xb9, 0x1f, 0x22, 0xeb, 0xf7, 0x87, 0x2b, 0x61, + 0x7, 0x95, 0x7d, 0x55, 0xab, 0x34, 0x1b, 0xfb, 0x3a, 0xfb, 0xd, 0xfb, + 0x10, 0xfb, 0x3f, 0xfb, 0x8, 0xcf, 0xfb, 0x4f, 0xf7, 0x75, 0xda, 0xe0, + 0x90, 0xd1, 0xdb, 0x1f, 0x8c, 0x8a, 0x5, 0xe, 0x32, 0xa, 0xf0, 0xeb, + 0xf7, 0xaf, 0xf1, 0x3, 0x9d, 0x16, 0xf7, 0x87, 0x6, 0xf7, 0x30, 0xf7, + 0x39, 0xce, 0xf7, 0x75, 0xf7, 0x47, 0xfb, 0x9, 0xe6, 0xfb, 0x45, 0x1f, + 0xfb, 0xa2, 0x7a, 0xa, 0x6, 0xf7, 0x47, 0x16, 0xf8, 0x10, 0x7, 0xf7, + 0x90, 0xaa, 0x39, 0x26, 0xfb, 0x1d, 0x41, 0x4f, 0xfb, 0x65, 0x1f, 0xe, + 0x8b, 0xe6, 0x30, 0xf7, 0x58, 0xb8, 0xe5, 0xac, 0xf7, 0x5a, 0x30, 0xe6, + 0x12, 0xf7, 0x7, 0xef, 0xf7, 0x3, 0xee, 0xb6, 0xee, 0x13, 0x77, 0xb1, + 0x16, 0xf8, 0xa5, 0xf7, 0x58, 0x28, 0x6, 0x13, 0xaf, 0x22, 0xfb, 0x91, + 0xf7, 0x2a, 0xf7, 0x3, 0x4a, 0xee, 0xf7, 0x70, 0x28, 0x4a, 0xfb, 0x3, + 0xf7, 0x20, 0xf7, 0x91, 0x7, 0x13, 0xb7, 0x20, 0xee, 0xf7, 0x5a, 0xfc, + 0xa5, 0x7, 0x13, 0xaf, 0x30, 0xd8, 0xfc, 0x10, 0x3e, 0x7, 0xe, 0x8b, + 0xe6, 0xf7, 0x28, 0xe6, 0xae, 0xf7, 0x58, 0x31, 0xe5, 0x90, 0x77, 0x12, + 0xf7, 0x6, 0xed, 0xf7, 0x8, 0xed, 0xb2, 0xef, 0x13, 0xd7, 0xad, 0x16, + 0xf7, 0xd5, 0xe6, 0xfb, 0x23, 0xf7, 0x28, 0xf7, 0x8, 0x4b, 0xed, 0xf7, + 0x70, 0x29, 0x4a, 0xfb, 0x8, 0xf7, 0x21, 0xf7, 0x91, 0x6, 0x13, 0xe7, + 0x21, 0xef, 0x7, 0x13, 0xcf, 0xf7, 0x5d, 0x7, 0x13, 0xd7, 0xfc, 0xa7, + 0x2b, 0x6, 0xdb, 0x8c, 0x5, 0xfc, 0x10, 0x3b, 0x7, 0xe, 0x79, 0xe9, + 0xf1, 0xea, 0xf7, 0x6c, 0xe6, 0x1, 0x99, 0xed, 0xf7, 0xc7, 0xed, 0x3, + 0x46, 0xa, 0xda, 0xf7, 0x17, 0xf7, 0x21, 0xe6, 0xc9, 0xed, 0x41, 0xa, + 0xfb, 0x5, 0xfb, 0x4d, 0xfb, 0x62, 0xf7, 0x33, 0x2d, 0xf7, 0x36, 0x58, + 0xa, 0xe, 0x8b, 0xe6, 0xf7, 0x23, 0xe6, 0xf7, 0x26, 0xe6, 0x1, 0xec, + 0xe8, 0xf7, 0x70, 0xe8, 0x3, 0x9f, 0x16, 0xf7, 0x8c, 0xe6, 0x3d, 0xf7, + 0x23, 0xf7, 0x70, 0xfb, 0x23, 0x3e, 0x30, 0xf7, 0x8b, 0xe6, 0x3e, 0xf8, + 0x10, 0xd8, 0xe6, 0xfb, 0x88, 0x30, 0xd5, 0xfb, 0x26, 0xfb, 0x70, 0xf7, + 0x26, 0xd7, 0xe6, 0xfb, 0x8a, 0x30, 0xd8, 0xfc, 0x10, 0x3e, 0x6, 0xe, + 0x32, 0xa, 0xf7, 0x8f, 0xf0, 0x60, 0xa, 0xe6, 0xfb, 0x3f, 0xf8, 0x10, + 0x74, 0xa, 0xfc, 0x10, 0xfb, 0x42, 0x6, 0xe, 0x79, 0xe5, 0xf8, 0x22, + 0xe7, 0x1, 0x9d, 0xed, 0xf7, 0x85, 0xeb, 0x3, 0x9d, 0xbd, 0x15, 0x7a, + 0xab, 0xef, 0x58, 0xf5, 0x1b, 0xf7, 0x12, 0xd2, 0xd5, 0xf7, 0x1f, 0x1f, + 0xf7, 0xa7, 0xf7, 0x15, 0xe7, 0xfc, 0x24, 0x2f, 0xf7, 0x43, 0xfb, 0xa8, + 0x7, 0x49, 0x80, 0x53, 0x2e, 0x3d, 0x50, 0x78, 0xa, 0x32, 0xa, 0xe9, + 0xee, 0x3, 0x96, 0x16, 0xf7, 0x9c, 0xe6, 0x39, 0xf7, 0x2, 0x6, 0xc6, + 0xc0, 0xcf, 0x34, 0xc5, 0x2a, 0xbe, 0x45, 0x19, 0xf7, 0x34, 0xe6, 0x20, + 0x6, 0x5d, 0xce, 0x4c, 0xe1, 0x54, 0xcf, 0xf7, 0x44, 0xf7, 0x33, 0x18, + 0xcf, 0xe6, 0xfb, 0x86, 0x30, 0xb6, 0x6, 0xfb, 0x3e, 0xfb, 0x2d, 0x5, + 0xf7, 0x2d, 0xda, 0xe6, 0xfb, 0x99, 0x7a, 0xa, 0x7, 0xe, 0x32, 0xa, + 0xf7, 0x17, 0xec, 0xf7, 0x86, 0xee, 0x3, 0xa9, 0x16, 0xf8, 0xaf, 0xf7, + 0x92, 0x28, 0xfb, 0x37, 0xfb, 0x86, 0xf8, 0x10, 0xf7, 0x14, 0xe6, 0xfb, + 0xda, 0x30, 0xf0, 0xfc, 0x10, 0x26, 0x6, 0xe, 0x32, 0xa, 0xd2, 0xe7, + 0xf7, 0xab, 0xe7, 0x3, 0x89, 0x16, 0xf7, 0x90, 0xe6, 0x2c, 0x6, 0x9b, + 0xf7, 0xce, 0xf1, 0xfb, 0xa2, 0x5, 0xc6, 0x6, 0xf4, 0xf7, 0x9f, 0x96, + 0xfb, 0xcb, 0x5, 0x32, 0x30, 0xf7, 0x86, 0xe6, 0x4d, 0x6, 0x81, 0xf8, + 0x10, 0x5, 0xd4, 0xe6, 0xfb, 0x52, 0x6, 0x20, 0xfb, 0xac, 0x25, 0xf7, + 0xac, 0x5, 0xfb, 0x5f, 0x30, 0xda, 0x6, 0x7b, 0xfc, 0x10, 0x5, 0x4a, + 0x6, 0xe, 0x7f, 0xe8, 0xf8, 0x18, 0xe8, 0x1, 0xd8, 0xe8, 0xf7, 0x9a, + 0xe5, 0x3, 0x8a, 0x7f, 0x15, 0xf7, 0x8e, 0xe8, 0x3c, 0xf7, 0xd1, 0x6, + 0xf7, 0x9a, 0xfc, 0x2e, 0x5, 0xe5, 0xf8, 0x75, 0xda, 0xe8, 0xfb, 0x96, + 0x2e, 0xe0, 0xfb, 0xc5, 0x6, 0xfb, 0x8b, 0xf8, 0x22, 0x5, 0xfb, 0x4a, + 0x2e, 0xd9, 0xfc, 0x18, 0x3d, 0x6, 0xe, 0x79, 0xe7, 0xf8, 0x30, 0xe9, + 0x1, 0xa1, 0xee, 0xf7, 0xfd, 0xeb, 0x3, 0xa1, 0xf7, 0xab, 0x15, 0xfb, + 0x5c, 0xf7, 0x25, 0x2a, 0xf7, 0x1a, 0xf2, 0xf7, 0x42, 0xd5, 0xf7, 0x76, + 0xf7, 0x21, 0x2f, 0xf7, 0x31, 0xfb, 0x4d, 0xfb, 0x42, 0x22, 0xfb, 0x25, + 0xfb, 0x30, 0x1e, 0xeb, 0x8e, 0x15, 0xe9, 0xca, 0xf7, 0x2, 0xf7, 0xc, + 0xf7, 0x1d, 0xb9, 0xfb, 0x16, 0x44, 0x38, 0x5a, 0xfb, 0x14, 0xfb, 0x1a, + 0xfb, 0xd, 0x4d, 0xf7, 0x0, 0xef, 0x1e, 0xe, 0x8b, 0xe6, 0xef, 0xe7, + 0xf7, 0x50, 0xe6, 0x1, 0xf7, 0x13, 0xed, 0xf7, 0x7d, 0xec, 0x3, 0xb7, + 0x16, 0xf7, 0xca, 0xe6, 0xfb, 0x15, 0xef, 0x6, 0xf7, 0x8d, 0xdc, 0xbd, + 0xf7, 0x17, 0xf7, 0x5f, 0xfb, 0x36, 0x78, 0xfb, 0xf1, 0x91, 0x1f, 0x7a, + 0xa, 0x7, 0xf7, 0x49, 0xf7, 0x54, 0x15, 0xf7, 0x50, 0x7, 0xf7, 0x20, + 0x84, 0xe8, 0x99, 0x24, 0x1a, 0x26, 0x25, 0x9b, 0xfb, 0x17, 0x84, 0x1e, + 0xe, 0xfb, 0x9, 0x76, 0xb8, 0xf7, 0x49, 0xf8, 0x24, 0xe7, 0x12, 0xa6, + 0xeb, 0xf7, 0xf7, 0xea, 0x17, 0xf7, 0xa, 0x46, 0x15, 0xb6, 0x46, 0x5, + 0xab, 0xc7, 0xa5, 0x98, 0xaf, 0x1b, 0xa9, 0xa4, 0x80, 0x81, 0xa4, 0x1f, + 0x81, 0xa3, 0xa4, 0x82, 0xa8, 0x1b, 0xc2, 0xaa, 0xa6, 0xb8, 0xb9, 0x1f, + 0x51, 0xca, 0x5, 0x68, 0x66, 0x7e, 0x83, 0x79, 0x1b, 0x73, 0x70, 0x9b, + 0xa1, 0x6b, 0x1f, 0xf7, 0x26, 0xb1, 0xca, 0xf7, 0xf, 0xf7, 0x10, 0x1a, + 0xde, 0x5a, 0xf7, 0x6b, 0xfb, 0x75, 0xfb, 0x1f, 0xfb, 0x19, 0x27, 0xfb, + 0x56, 0xfb, 0x20, 0xd1, 0x2f, 0xf0, 0x62, 0x1e, 0x40, 0xf7, 0xa6, 0x15, + 0xf7, 0x2e, 0xf6, 0xba, 0xd0, 0x1e, 0x13, 0x58, 0xf7, 0xb, 0xc7, 0x24, + 0x25, 0x1f, 0x13, 0x50, 0xfb, 0x2c, 0x21, 0x60, 0x41, 0x3b, 0x2c, 0xbc, + 0xf7, 0x2a, 0x1e, 0xe, 0x8b, 0xe6, 0xf7, 0x18, 0xe6, 0xf7, 0x31, 0xe6, + 0x1, 0xec, 0xef, 0xf7, 0x7a, 0xee, 0x3, 0x97, 0x16, 0xf7, 0x9d, 0xe6, + 0x3b, 0xf7, 0x18, 0xde, 0x6, 0xe4, 0xfb, 0x9, 0xb6, 0x4d, 0xa9, 0x5f, + 0x8, 0xf7, 0x25, 0xe6, 0x33, 0x6, 0xfb, 0x4, 0xf7, 0x2a, 0x5, 0xf6, + 0x9d, 0xab, 0xcf, 0xd1, 0x1a, 0xf7, 0x8, 0x27, 0xbc, 0xfb, 0x8, 0x1e, + 0xfb, 0xba, 0x30, 0xdc, 0xfc, 0x10, 0x36, 0x6, 0xf7, 0x4d, 0xf7, 0x73, + 0x15, 0xf7, 0x31, 0x7, 0xf7, 0x49, 0xbc, 0x92, 0x39, 0x31, 0x39, 0x93, + 0xfb, 0x28, 0x1f, 0xe, 0x8b, 0xe3, 0xf8, 0x17, 0xe3, 0x94, 0x77, 0x12, + 0xd3, 0xe6, 0x41, 0xe7, 0xf7, 0x80, 0xe6, 0x45, 0xe5, 0x13, 0xd2, 0xd3, + 0x16, 0xe6, 0xae, 0x6, 0x81, 0x9f, 0xb9, 0x72, 0xd5, 0x1b, 0xf7, 0xe, + 0xf2, 0xcc, 0xf5, 0xf7, 0x24, 0xfb, 0x2a, 0x87, 0x21, 0x9a, 0x1f, 0x13, + 0xcc, 0x72, 0x8f, 0x49, 0x95, 0xc5, 0x1a, 0xb5, 0xb9, 0xae, 0xdc, 0xb2, + 0xb0, 0x88, 0x7d, 0xac, 0x1e, 0x2e, 0xe6, 0x7, 0x13, 0xb4, 0xf7, 0x63, + 0x30, 0x76, 0x7, 0x13, 0xca, 0x99, 0x6a, 0x64, 0x89, 0x62, 0x1b, 0xfb, + 0x22, 0x42, 0x32, 0x3d, 0xfb, 0x22, 0xf7, 0x1d, 0x81, 0xf7, 0x6, 0x82, + 0x1f, 0xbd, 0x87, 0xbb, 0x78, 0x62, 0x1a, 0x5b, 0x64, 0x68, 0x2b, 0x1e, + 0x13, 0xd4, 0x58, 0x5c, 0x9b, 0xa3, 0x61, 0x1f, 0xd3, 0x30, 0x7, 0xe, + 0x32, 0xa, 0xb4, 0xee, 0xf7, 0x3, 0xed, 0xf7, 0x3, 0xee, 0x14, 0x38, + 0xf7, 0xe, 0x16, 0xf7, 0xe6, 0xe6, 0xfb, 0x3, 0xf8, 0x10, 0xf7, 0x3, + 0xfb, 0x5, 0xee, 0xf7, 0x60, 0xfc, 0x9a, 0xfb, 0x60, 0xee, 0xf7, 0x5, + 0xf7, 0x3, 0xfc, 0x10, 0xfb, 0x15, 0x6, 0xe, 0x79, 0xe7, 0xf8, 0x20, + 0xe7, 0x1, 0xde, 0xe9, 0xf7, 0x8b, 0xe9, 0x3, 0x8f, 0xf8, 0x6a, 0x15, + 0xda, 0xfb, 0xa2, 0x6, 0xfb, 0x28, 0xd2, 0x45, 0xf7, 0x25, 0xf7, 0x13, + 0xe7, 0xc4, 0xf7, 0x21, 0x1e, 0xf7, 0xb6, 0xd9, 0xe7, 0xfb, 0x96, 0x2f, + 0xe1, 0xfb, 0x9a, 0x7, 0x35, 0x73, 0x5b, 0x24, 0xfb, 0x4, 0x83, 0xcb, + 0xc0, 0x1e, 0xf7, 0xab, 0xdf, 0xe7, 0xfb, 0x95, 0x7, 0xe, 0xa0, 0x76, + 0xf8, 0x6b, 0xe6, 0x1, 0x7e, 0xf7, 0x8a, 0xf7, 0x1a, 0xf7, 0x8a, 0x3, + 0xf7, 0x90, 0x16, 0xeb, 0x6, 0xf7, 0x58, 0xf8, 0x6b, 0x5, 0xd0, 0xe6, + 0xfb, 0x8a, 0x30, 0xde, 0x6, 0xfb, 0x28, 0xfb, 0xf4, 0xfb, 0x1f, 0xf7, + 0xf4, 0x5, 0xd1, 0xe6, 0xfb, 0x8a, 0x30, 0xd8, 0x6, 0xe, 0xa0, 0x76, + 0xf8, 0x6b, 0xe6, 0x1, 0xed, 0x16, 0xde, 0x6, 0xf7, 0xa, 0xf7, 0xbc, + 0xf7, 0xc, 0xfb, 0xbc, 0x5, 0xdd, 0x6, 0xcf, 0xf8, 0x6b, 0x5, 0xbc, + 0xe6, 0xfb, 0x78, 0x30, 0xe1, 0x6, 0x69, 0xfb, 0xab, 0x21, 0xf7, 0x94, + 0x5, 0x45, 0x6, 0x23, 0xfb, 0x96, 0x67, 0xf7, 0xad, 0x5, 0xe0, 0xe6, + 0xfb, 0x79, 0x30, 0xbc, 0x6, 0xe, 0x32, 0xa, 0x97, 0x16, 0xf7, 0x8c, + 0xe6, 0x45, 0x6, 0xf7, 0x1, 0xf7, 0x1b, 0xf7, 0x1, 0xfb, 0x1b, 0x5, + 0x4d, 0x30, 0xf7, 0x86, 0xe6, 0x47, 0x6, 0xfb, 0x37, 0xf7, 0x5f, 0xf7, + 0x23, 0xf7, 0x45, 0x5, 0xd1, 0xe6, 0xfb, 0x77, 0x30, 0xbb, 0x6, 0x34, + 0xfb, 0x0, 0x32, 0xf7, 0x0, 0x5, 0xb7, 0xe6, 0xfb, 0x7a, 0x30, 0xd2, + 0x6, 0xf7, 0x25, 0xfb, 0x45, 0xfb, 0x39, 0xfb, 0x5f, 0x5, 0x47, 0x6, + 0xe, 0x32, 0xa, 0xf7, 0x8e, 0xec, 0x3, 0xf7, 0x12, 0x16, 0xf7, 0xec, + 0xe6, 0xfb, 0xf, 0xf7, 0x1c, 0x6, 0xf7, 0x35, 0xf7, 0x88, 0x5, 0xdb, + 0xe6, 0xfb, 0x81, 0x30, 0xc2, 0x6, 0x22, 0xfb, 0x31, 0x22, 0xf7, 0x31, + 0x5, 0xc0, 0xe6, 0xfb, 0x82, 0x30, 0xda, 0x6, 0xf7, 0x34, 0xfb, 0x88, + 0x5, 0xfb, 0x1c, 0xfb, 0x10, 0x7, 0xe, 0x32, 0xa, 0xcc, 0xed, 0xf7, + 0xaa, 0xec, 0x3, 0xc8, 0x16, 0xf8, 0x71, 0xf7, 0x70, 0x2a, 0xfb, 0x15, + 0xfb, 0x8d, 0x6, 0xf7, 0xd6, 0xf8, 0x2a, 0x5, 0xcc, 0xfc, 0x55, 0xfb, + 0x61, 0xed, 0xf7, 0x6, 0xf7, 0x6c, 0x7, 0xfb, 0xd2, 0xfc, 0x25, 0x5, + 0xe, 0x25, 0xe7, 0xf8, 0xaa, 0xe7, 0x1, 0xf7, 0x4d, 0xed, 0x3, 0xf7, + 0x4d, 0x25, 0x15, 0xf7, 0x7a, 0xe7, 0xfb, 0x18, 0xf8, 0xaa, 0xf7, 0x18, + 0xe7, 0xfb, 0x7a, 0x6, 0xe, 0x53, 0x76, 0xf9, 0x53, 0x77, 0x1, 0xf8, + 0x43, 0x3e, 0x15, 0xd2, 0xa8, 0xfb, 0xe1, 0xf9, 0x36, 0x44, 0x6e, 0x5, + 0xe, 0x25, 0xe7, 0xf8, 0xaa, 0xe7, 0x1, 0xf7, 0xd2, 0xec, 0x3, 0xf7, + 0x4d, 0x81, 0x15, 0x2f, 0xf7, 0x7a, 0xf9, 0x62, 0xfb, 0x7a, 0x2f, 0xf7, + 0x19, 0xfc, 0xaa, 0x7, 0xe, 0xf7, 0xa3, 0x76, 0xf8, 0x2, 0x77, 0x1, + 0xf7, 0x0, 0xf7, 0x8e, 0x15, 0xd3, 0xb1, 0xce, 0xcc, 0xc1, 0xd8, 0xc2, + 0x3a, 0xcb, 0x4e, 0xd3, 0x66, 0x8, 0xcb, 0x7, 0x30, 0xf7, 0x2, 0x6c, + 0xc2, 0x66, 0xf7, 0x1c, 0x8, 0x47, 0x6, 0x6b, 0xfb, 0x14, 0x68, 0x45, + 0x31, 0x23, 0x8, 0xe, 0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8, + 0xec, 0xbd, 0x7, 0xe, 0xf8, 0xa5, 0x76, 0xf7, 0x2d, 0x77, 0x1, 0xf7, + 0x3c, 0xf8, 0xcd, 0x15, 0xf7, 0x89, 0x4e, 0x9d, 0xbb, 0xfb, 0x7b, 0xf4, + 0x5, 0xe, 0x7c, 0xe9, 0x3a, 0xe9, 0xf1, 0xed, 0xd0, 0xe8, 0x34, 0xa, + 0x13, 0xbc, 0xf4, 0xf7, 0xcf, 0x15, 0x9a, 0xa8, 0xe6, 0xaa, 0xd3, 0x1b, + 0xbe, 0xb4, 0x75, 0x5c, 0x1f, 0x7f, 0x7, 0x92, 0x67, 0x68, 0x90, 0x6c, + 0x1b, 0xfb, 0x33, 0x2b, 0x48, 0x2d, 0x2d, 0xeb, 0x57, 0xed, 0xc8, 0xc9, + 0x9e, 0xb4, 0xb3, 0x1f, 0x13, 0x7a, 0x5c, 0xf7, 0x46, 0xe9, 0x7, 0x13, + 0x7c, 0x38, 0xf7, 0x3a, 0x6, 0xf7, 0x11, 0x6e, 0xd2, 0xfb, 0x29, 0x31, + 0x28, 0x67, 0x75, 0x58, 0x1e, 0xf7, 0xd7, 0xfb, 0x83, 0x15, 0x13, 0xbc, + 0x60, 0x5b, 0x4f, 0x68, 0x47, 0x1b, 0x60, 0x62, 0x9e, 0xab, 0xb8, 0xd7, + 0x9e, 0xc6, 0xc6, 0xb6, 0x86, 0x89, 0xa2, 0x1f, 0xe, 0x7c, 0xe8, 0x3b, + 0xe9, 0xf7, 0x9d, 0xe7, 0xde, 0xe9, 0x12, 0x93, 0xf7, 0x4c, 0x28, 0xee, + 0xf7, 0xbf, 0xf0, 0x13, 0x7a, 0x94, 0x89, 0x15, 0xf7, 0x4b, 0xb1, 0x6, + 0x13, 0xba, 0x68, 0xbb, 0xc2, 0x7b, 0xc0, 0x1b, 0xf7, 0x12, 0xf7, 0xa, + 0xea, 0xf7, 0x1f, 0xf7, 0x1b, 0xfb, 0x7, 0xea, 0xfb, 0x12, 0x55, 0x53, + 0x7d, 0x67, 0x5a, 0x1f, 0xf7, 0x77, 0xfb, 0x4c, 0x2d, 0x7, 0x13, 0x76, + 0xe0, 0xfc, 0x4c, 0x37, 0x6, 0xf7, 0x48, 0xf7, 0x10, 0x15, 0xd6, 0xb8, + 0xcd, 0xf7, 0x0, 0xf7, 0x0, 0xb4, 0x34, 0x59, 0x1e, 0x13, 0xba, 0x3e, + 0x4b, 0x4a, 0x34, 0x5d, 0x22, 0xa6, 0xf7, 0x3, 0x1e, 0xe, 0x7c, 0xe9, + 0xf7, 0xb2, 0xe9, 0x1, 0xba, 0xeb, 0xf7, 0xab, 0xeb, 0x3, 0xf8, 0x3a, + 0xf7, 0x8b, 0x15, 0xeb, 0xf7, 0x68, 0x2b, 0x78, 0x6, 0x98, 0x68, 0x65, + 0x91, 0x65, 0x1b, 0xfb, 0x49, 0x38, 0xfb, 0x11, 0xfb, 0x4, 0xfb, 0x2b, + 0xf7, 0x11, 0x35, 0xf7, 0x12, 0xeb, 0xe4, 0xb4, 0xc2, 0xd0, 0x1f, 0x55, + 0xd5, 0x5, 0x62, 0x52, 0x54, 0x68, 0x3c, 0x1b, 0x39, 0x39, 0xbb, 0xe9, + 0xdc, 0xcb, 0xca, 0xf3, 0xb2, 0xb3, 0x81, 0x7a, 0xab, 0x1f, 0xe, 0x7c, + 0xe9, 0x3a, 0xe9, 0xf7, 0x9d, 0xe9, 0xdc, 0xe9, 0x12, 0x99, 0xec, 0xf7, + 0xbe, 0xec, 0x2a, 0xf7, 0x44, 0x13, 0x7a, 0xf8, 0x2f, 0x89, 0x15, 0xf7, + 0x42, 0xe9, 0x3c, 0x6, 0x13, 0x7c, 0xf8, 0xaa, 0xfb, 0x72, 0x2d, 0xf7, + 0x11, 0xfb, 0x17, 0x7, 0xad, 0x65, 0x52, 0x9b, 0x53, 0x1b, 0xfb, 0x24, + 0x27, 0xfb, 0x3, 0xfb, 0xe, 0xfb, 0x11, 0xf4, 0xfb, 0x0, 0xf7, 0x23, + 0x1f, 0x13, 0xbc, 0xc2, 0xc1, 0x9c, 0xab, 0xb3, 0x1f, 0xfb, 0xc0, 0xf7, + 0x4e, 0x15, 0xd9, 0xcd, 0xc6, 0xe2, 0xe6, 0xc1, 0x4c, 0x3e, 0xfb, 0xd, + 0xfb, 0x7, 0x7a, 0x69, 0x3a, 0x47, 0xc8, 0xdb, 0x1e, 0xe, 0x7c, 0xe8, + 0xee, 0xea, 0xe3, 0xe9, 0x1, 0xf7, 0x22, 0xf7, 0x45, 0x15, 0xf8, 0x22, + 0x6, 0xf7, 0x3a, 0x9f, 0x29, 0xf7, 0x3, 0xfb, 0x37, 0x1b, 0xfb, 0xe, + 0xfb, 0x1f, 0x3c, 0xfb, 0x32, 0xfb, 0xe, 0xe4, 0xfb, 0x2, 0xf7, 0x41, + 0xe8, 0xe7, 0xaa, 0xb6, 0xd7, 0x1f, 0x5f, 0xda, 0x5, 0x6c, 0x4a, 0x44, + 0x6e, 0x3d, 0x1b, 0xfb, 0x10, 0x6b, 0xcc, 0xad, 0x86, 0x1f, 0x8d, 0xea, + 0x15, 0xc5, 0xa0, 0xce, 0xa9, 0xc9, 0x1b, 0xc9, 0xc9, 0x78, 0x46, 0x9e, + 0x1f, 0xe, 0x7c, 0xa, 0xe8, 0xeb, 0xe7, 0x1, 0xf7, 0x44, 0xf5, 0x3, + 0xcf, 0x16, 0xf8, 0x50, 0xe9, 0xfb, 0x7a, 0xf7, 0x8f, 0xf7, 0x7a, 0xe8, + 0xfb, 0x7a, 0xae, 0x6, 0xb1, 0x8d, 0xa2, 0xdb, 0xbd, 0xa9, 0x84, 0x80, + 0xb9, 0x1e, 0xb5, 0xe7, 0x5, 0x96, 0x35, 0x4d, 0x92, 0x5a, 0x1b, 0x24, + 0x53, 0x51, 0x24, 0x1f, 0x70, 0xfb, 0x0, 0x2e, 0xf7, 0x0, 0xfb, 0x8f, + 0xfb, 0x0, 0x7, 0xe, 0xfb, 0x26, 0xe4, 0xf1, 0xe3, 0xf7, 0x71, 0xe4, + 0x3e, 0xe3, 0x69, 0xa, 0x13, 0xec, 0x50, 0xa, 0xe9, 0xf2, 0x1f, 0xf7, + 0xc3, 0x7, 0x13, 0xea, 0xd7, 0xe4, 0xfb, 0x3c, 0x6e, 0x6, 0x13, 0xdc, + 0x5a, 0xa, 0xfb, 0x9, 0xee, 0x36, 0xf7, 0x21, 0xc0, 0xbe, 0x94, 0xa7, + 0xb1, 0x1f, 0x67, 0x7, 0x51, 0x88, 0x5e, 0x42, 0xa, 0x63, 0x33, 0x43, + 0x44, 0xb7, 0xd2, 0x1e, 0xe, 0x8b, 0xe9, 0xf7, 0x8b, 0xe8, 0xed, 0xe9, + 0x12, 0x91, 0xf7, 0x48, 0x2a, 0xec, 0xf7, 0x77, 0xec, 0x13, 0xf4, 0x91, + 0x16, 0xf7, 0x96, 0xe9, 0x3d, 0xf7, 0x61, 0x6, 0xbd, 0xd5, 0xc2, 0x94, + 0xa8, 0x1b, 0xc3, 0x98, 0x6a, 0x69, 0x1f, 0xfb, 0x59, 0x3d, 0x2d, 0xf7, + 0x96, 0xe9, 0x38, 0xf7, 0x52, 0x7, 0xd8, 0x71, 0xe5, 0xfb, 0x1f, 0x4e, + 0x5b, 0x75, 0x71, 0x59, 0x1e, 0xf7, 0x73, 0xfb, 0x48, 0x2d, 0x7, 0x13, + 0xec, 0xde, 0xfc, 0x4a, 0x6, 0x13, 0xf4, 0x38, 0x6, 0xe, 0x8b, 0xea, + 0xf7, 0x92, 0xeb, 0xd1, 0xf7, 0x23, 0x12, 0xf7, 0x83, 0xf7, 0x3, 0x29, + 0xed, 0x13, 0xf0, 0xf7, 0x83, 0xf8, 0x97, 0x79, 0xa, 0x6b, 0xa, 0xfb, + 0x36, 0xfd, 0x26, 0x15, 0xf8, 0x52, 0xea, 0xfb, 0x41, 0xf7, 0xf2, 0xfb, + 0x7f, 0x2b, 0x6, 0x13, 0xe8, 0xf7, 0x1d, 0xfb, 0x92, 0xfb, 0x43, 0x6, + 0xe, 0xfb, 0x26, 0xe7, 0xf8, 0x37, 0xe6, 0xc5, 0xf7, 0x24, 0x12, 0xf7, + 0xf4, 0xf7, 0xa, 0x35, 0xf3, 0x13, 0xf0, 0xf7, 0xf4, 0xf8, 0x96, 0x73, + 0xa, 0xfb, 0x6d, 0xfd, 0x49, 0x15, 0x73, 0x30, 0x5, 0x81, 0xc2, 0xc4, + 0x81, 0xc4, 0x1b, 0x13, 0xe8, 0xf7, 0x63, 0x8c, 0xf7, 0x1b, 0xc6, 0x1f, + 0xf8, 0x2c, 0xfc, 0x2, 0x30, 0xf7, 0x9a, 0xfb, 0xcd, 0x7, 0x46, 0x81, + 0x66, 0x31, 0x55, 0x4d, 0x98, 0x91, 0x6a, 0x1e, 0xe, 0x7c, 0xa, 0xe9, + 0xe8, 0xe9, 0x1, 0xec, 0xed, 0x3, 0x9c, 0x16, 0xf7, 0x46, 0xf7, 0x3e, + 0x6, 0xaf, 0xa2, 0xf7, 0xe, 0x28, 0x5, 0x70, 0x2d, 0xf7, 0x94, 0xe9, + 0xfb, 0x0, 0x6, 0xfb, 0x41, 0xf7, 0x25, 0xf7, 0x37, 0xf5, 0x5, 0xda, + 0xe9, 0xfb, 0xb1, 0x2d, 0xd2, 0x6, 0xfb, 0x1a, 0x39, 0x5, 0xf7, 0xff, + 0xfb, 0x46, 0x2d, 0xdb, 0xfc, 0x4a, 0x3b, 0x7, 0xe, 0x8b, 0xe9, 0xf8, + 0x4a, 0x40, 0xa, 0xf8, 0xa8, 0xfb, 0x92, 0x2d, 0xf7, 0x2f, 0xfc, 0x4a, + 0xfb, 0x41, 0x6, 0xe, 0x90, 0xe9, 0xf7, 0x99, 0xe9, 0x1, 0xc1, 0xe9, + 0xf7, 0x3, 0xe6, 0xf7, 0x5, 0xe7, 0x3, 0x73, 0x16, 0xf7, 0x8e, 0xe9, + 0x3d, 0xf7, 0x7b, 0x6, 0x9e, 0x9d, 0xa2, 0x9b, 0xa3, 0x1b, 0xb1, 0x93, + 0x6a, 0x77, 0x1f, 0xfb, 0xc7, 0xf7, 0x38, 0xe9, 0x42, 0xf7, 0x73, 0x7, + 0xad, 0xa4, 0xa6, 0x94, 0x9c, 0x1b, 0xac, 0x96, 0x6d, 0x81, 0x1f, 0xfb, + 0xd4, 0xf7, 0x35, 0xe9, 0x46, 0xf7, 0x72, 0x7, 0xd7, 0x5a, 0xc9, 0x38, + 0x62, 0x61, 0x79, 0x6c, 0x71, 0x1e, 0xb5, 0x72, 0x66, 0x92, 0x73, 0x1b, + 0x6c, 0x6d, 0x7f, 0x74, 0x78, 0x1f, 0xa1, 0xfb, 0x40, 0x2d, 0xd9, 0xfb, + 0x91, 0x3d, 0x7, 0xe, 0x8b, 0xe9, 0xf7, 0x91, 0xe9, 0x3b, 0xe8, 0x12, + 0x98, 0xf7, 0x48, 0xf7, 0x75, 0xea, 0x13, 0xb8, 0x9a, 0x16, 0xf7, 0x97, + 0xe9, 0x3a, 0xf7, 0x67, 0x6, 0xb7, 0xbd, 0xcf, 0x97, 0xa9, 0x1b, 0xd1, + 0x92, 0x55, 0x64, 0x1f, 0xfb, 0x42, 0x46, 0x2d, 0xf7, 0x82, 0xe9, 0x41, + 0xf7, 0x42, 0x7, 0xf7, 0x12, 0x60, 0xc7, 0xfb, 0xc, 0x52, 0x51, 0x79, + 0x6f, 0x61, 0x1e, 0x13, 0xd0, 0xac, 0xfb, 0x48, 0x2d, 0xde, 0xfb, 0x91, + 0x3a, 0x7, 0xe, 0x7c, 0xe9, 0xf7, 0xad, 0xe9, 0x4b, 0xa, 0xa9, 0xf7, + 0x6d, 0x15, 0xfb, 0x40, 0xf7, 0x2f, 0x4f, 0xf7, 0x6, 0xf7, 0xe, 0xf7, + 0x29, 0xce, 0xf7, 0x39, 0xf7, 0x31, 0xfb, 0x18, 0xdb, 0xfb, 0x1f, 0xfb, + 0x1d, 0xfb, 0x18, 0x3b, 0xfb, 0x31, 0x1e, 0xef, 0x16, 0xe2, 0xd6, 0xc3, + 0xe9, 0xe7, 0xdb, 0x50, 0x37, 0x28, 0x36, 0x64, 0x34, 0x3c, 0x31, 0xb2, + 0xee, 0x1e, 0xe, 0xfb, 0x22, 0xe3, 0xd6, 0xe2, 0xf7, 0x89, 0xe3, 0x40, + 0xe3, 0x12, 0x9c, 0xf7, 0x43, 0x2c, 0xea, 0xf7, 0xbd, 0xeb, 0x13, 0xda, + 0x9c, 0x55, 0x15, 0x33, 0xf7, 0xcc, 0xe3, 0xfb, 0x1d, 0xf7, 0xe, 0x7, + 0x7d, 0xa1, 0xc1, 0x6a, 0xd9, 0x1b, 0xf7, 0x1f, 0xef, 0xed, 0xf7, 0xd, + 0xf7, 0x28, 0xfb, 0x21, 0xcd, 0x25, 0x56, 0x52, 0x7b, 0x6d, 0x63, 0x1f, + 0x13, 0xe6, 0xac, 0xfb, 0x46, 0x33, 0xde, 0xfc, 0x2b, 0x7, 0x13, 0xda, + 0xe6, 0xf7, 0xb8, 0x15, 0xf7, 0x1, 0xf7, 0x4, 0x9e, 0xb4, 0xd9, 0xd1, + 0x5e, 0x38, 0x3c, 0x43, 0x58, 0x3e, 0x5f, 0xfb, 0x0, 0xa4, 0xf4, 0x1e, + 0xe, 0xf8, 0xda, 0x55, 0x15, 0x33, 0xfb, 0xcc, 0xe3, 0xf7, 0x1d, 0xf7, + 0xe, 0x7, 0x7d, 0x75, 0x55, 0x6a, 0x3d, 0x1b, 0xfb, 0x1f, 0x27, 0xed, + 0xf7, 0xd, 0xf7, 0x28, 0xf7, 0x21, 0xcd, 0xf1, 0xc0, 0xc4, 0x7b, 0x6d, + 0xb3, 0x1f, 0xac, 0xf7, 0x46, 0x33, 0x38, 0xfc, 0x2b, 0x7, 0x30, 0xf7, + 0xb8, 0x15, 0xf7, 0x1, 0xfb, 0x4, 0x9e, 0x62, 0x3d, 0x45, 0x5e, 0x38, + 0x3c, 0xd3, 0x58, 0xd8, 0xb7, 0xf7, 0x0, 0xa4, 0xf4, 0x1e, 0xe, 0x8b, + 0xe9, 0xf7, 0x90, 0xe9, 0x3b, 0xe9, 0x12, 0xf7, 0x28, 0xee, 0x13, 0xb0, + 0xac, 0x16, 0xf8, 0x21, 0xe9, 0xfb, 0x4b, 0xf7, 0x35, 0x6, 0xae, 0xba, + 0xd1, 0xd1, 0xd6, 0x1b, 0xa5, 0x8f, 0x81, 0x71, 0x8e, 0x1f, 0xe9, 0x99, + 0x5, 0xb3, 0x89, 0x77, 0xd7, 0x22, 0x1b, 0x41, 0x4b, 0x5e, 0x63, 0x55, + 0x1f, 0x13, 0xd0, 0xd2, 0xfb, 0x6a, 0x2d, 0xf7, 0x7, 0xfb, 0x90, 0xfb, + 0x7, 0x7, 0xe, 0x7a, 0xeb, 0xeb, 0xe3, 0x9b, 0xf7, 0x48, 0x2b, 0xeb, + 0x12, 0xcd, 0xed, 0x36, 0xe0, 0x36, 0xea, 0xf7, 0x84, 0xee, 0x40, 0xea, + 0x13, 0xe8, 0x80, 0xcd, 0x7a, 0x15, 0xed, 0xad, 0x6, 0x72, 0xb9, 0xc1, + 0x82, 0xc2, 0x1b, 0xf7, 0xb, 0xea, 0xc4, 0xe6, 0xf5, 0x21, 0x9f, 0x35, + 0x91, 0x1f, 0x13, 0xd3, 0x0, 0x2b, 0x93, 0x44, 0x91, 0xb2, 0x1a, 0xb5, + 0xe5, 0x90, 0xa2, 0xb7, 0xc2, 0x80, 0x72, 0xa7, 0x1e, 0x13, 0xe5, 0x0, + 0x5b, 0xee, 0xf7, 0x48, 0x28, 0x69, 0x7, 0xa0, 0x6e, 0x50, 0x98, 0x5c, + 0x1b, 0x2e, 0x20, 0x64, 0x25, 0xfb, 0x12, 0xf7, 0x2a, 0x81, 0xd6, 0x84, + 0x1f, 0x13, 0xe8, 0x80, 0xaf, 0x88, 0xed, 0x8a, 0x63, 0x1a, 0x69, 0x47, + 0x79, 0x53, 0x44, 0x54, 0x96, 0x9e, 0x73, 0x1e, 0x13, 0xe9, 0x0, 0xd0, + 0x29, 0x7, 0xe, 0x7c, 0xe6, 0xf7, 0x99, 0xe8, 0xf7, 0x18, 0x77, 0x1, + 0xf7, 0x11, 0xee, 0x3, 0xc4, 0xf7, 0xe5, 0x15, 0xcf, 0xfb, 0x57, 0x6, + 0xfb, 0x1d, 0xf7, 0x0, 0x77, 0xd7, 0xdc, 0xdd, 0xab, 0xa6, 0xd1, 0x1e, + 0x7a, 0xe8, 0x5, 0x7a, 0x65, 0xfb, 0x0, 0x5f, 0x47, 0x1b, 0x39, 0x86, + 0xb7, 0xb6, 0x1f, 0xf7, 0x42, 0xf7, 0x9e, 0xe8, 0xfb, 0x9e, 0xf7, 0x18, + 0x28, 0xfb, 0x18, 0x47, 0x7, 0xe, 0x7c, 0xe7, 0x3c, 0xe9, 0xf7, 0x91, + 0xe9, 0x12, 0x9a, 0xf7, 0x43, 0x2c, 0xea, 0xf7, 0x22, 0xf7, 0x42, 0x2b, + 0xeb, 0x2b, 0xf7, 0x43, 0x13, 0xb4, 0x9a, 0xf7, 0xed, 0x15, 0x13, 0xaa, + 0xdb, 0xfb, 0x4e, 0x6, 0xfb, 0x5, 0xd0, 0x4e, 0xf7, 0x1, 0xc0, 0xc2, + 0xa6, 0xa7, 0xa8, 0x1e, 0x13, 0x71, 0x61, 0xf7, 0x43, 0xe9, 0x7, 0x13, + 0x74, 0x3c, 0xf7, 0xef, 0xfb, 0x42, 0x2d, 0x6, 0x13, 0xb2, 0xd9, 0xfb, + 0x56, 0x6, 0x6c, 0x69, 0x65, 0x60, 0x4d, 0x1b, 0x38, 0x88, 0xc4, 0xa2, + 0x1f, 0xf7, 0xae, 0xfb, 0x43, 0x7, 0xe, 0xa0, 0x76, 0xf7, 0xed, 0xe9, + 0x1, 0xf7, 0x98, 0x16, 0xe3, 0x6, 0xf7, 0x3c, 0xf7, 0xed, 0x5, 0xe0, + 0xe9, 0xfb, 0x86, 0x2d, 0xc8, 0x6, 0xfb, 0x7, 0xfb, 0x82, 0xfb, 0x8, + 0xf7, 0x82, 0x5, 0xcf, 0xe9, 0xfb, 0x96, 0x2d, 0xe0, 0x6, 0xe, 0xa0, + 0x76, 0xf7, 0xed, 0xe9, 0x1, 0x79, 0xf7, 0x6d, 0xf7, 0x64, 0xf7, 0x67, + 0x3, 0xf7, 0x24, 0x16, 0xda, 0x6, 0xd5, 0xf7, 0x68, 0xe1, 0xfb, 0x68, + 0x5, 0xd7, 0x6, 0xf7, 0x2, 0xf7, 0xed, 0x5, 0xbc, 0xe9, 0xfb, 0x67, + 0x2d, 0xd3, 0x6, 0x4f, 0xfb, 0x57, 0x36, 0xf7, 0x6f, 0x5, 0x49, 0x6, + 0x3d, 0xfb, 0x6f, 0x4e, 0xf7, 0x57, 0x5, 0xd1, 0xe9, 0xfb, 0x6d, 0x2d, + 0xbc, 0x6, 0xe, 0x7c, 0xa, 0xe9, 0x1, 0x91, 0x16, 0xf7, 0x91, 0xe9, + 0x62, 0x6, 0xda, 0xd8, 0xdd, 0x3e, 0x5, 0x64, 0x2d, 0xf7, 0x92, 0xe9, + 0x37, 0x6, 0xfb, 0x28, 0xf7, 0x1c, 0xf7, 0x10, 0xf7, 0x7, 0x5, 0xdc, + 0xe9, 0xfb, 0x75, 0x2d, 0x9e, 0x6, 0x4f, 0x52, 0x49, 0xc4, 0x5, 0xa1, + 0xe9, 0xfb, 0x82, 0x2d, 0xe1, 0x6, 0xf7, 0x14, 0xfb, 0x9, 0xfb, 0x22, + 0xfb, 0x1a, 0x5, 0x36, 0x6, 0xe, 0xfb, 0x22, 0xe3, 0xf8, 0x29, 0xe3, + 0x12, 0x13, 0xc0, 0xb4, 0x55, 0x15, 0x33, 0xf7, 0xb4, 0xe3, 0x48, 0x7, + 0xf7, 0x9e, 0xf8, 0x29, 0x5, 0xd6, 0xe3, 0xfb, 0x80, 0x33, 0xc3, 0x6, + 0xfb, 0x14, 0xfb, 0x55, 0xfb, 0x6, 0xf7, 0x55, 0x5, 0xc6, 0xe3, 0xfb, + 0x86, 0x33, 0xd7, 0x6, 0xf7, 0x3b, 0xfb, 0xa8, 0x35, 0xfb, 0x15, 0x5, + 0xe, 0x8b, 0xe9, 0x2d, 0xf7, 0x51, 0xd4, 0xf7, 0x45, 0x2e, 0xe8, 0x12, + 0xea, 0xec, 0xf7, 0x7a, 0xec, 0x13, 0x6c, 0xdb, 0x16, 0xf8, 0x4b, 0xf7, + 0x51, 0x2a, 0x6, 0x13, 0xac, 0x2c, 0xfb, 0x51, 0x7, 0xf7, 0xb2, 0xf7, + 0xa9, 0x5, 0xcf, 0xfc, 0x3c, 0xfb, 0x45, 0xec, 0x7, 0x13, 0x9c, 0xdf, + 0xf7, 0x41, 0x7, 0xfb, 0xb1, 0xfb, 0xa6, 0x5, 0xe, 0xf7, 0x86, 0xe4, + 0x3, 0xf8, 0x6b, 0xfb, 0x88, 0x15, 0xe8, 0x7, 0x65, 0x64, 0x8b, 0x95, + 0x69, 0x1f, 0x75, 0x92, 0x84, 0xa5, 0xa1, 0x1a, 0xf7, 0x28, 0x7, 0xd4, + 0x6a, 0xde, 0x4d, 0xae, 0x1e, 0xc9, 0xae, 0xac, 0xdc, 0xd4, 0x1a, 0xf7, + 0x28, 0x7, 0xa1, 0x92, 0xa5, 0xa1, 0x92, 0x1e, 0x95, 0xad, 0xb2, 0x8b, + 0xb1, 0x1b, 0xe8, 0x7, 0x5b, 0x4f, 0x8b, 0x79, 0x5d, 0x1f, 0x56, 0x76, + 0x75, 0x52, 0x5c, 0x1a, 0xfb, 0x9, 0x7, 0xfb, 0x0, 0x82, 0x49, 0x22, + 0x7c, 0x1e, 0x2d, 0x7, 0xf4, 0x7c, 0x94, 0x49, 0xfb, 0x0, 0x1a, 0xfb, + 0x9, 0x7, 0x5c, 0xa1, 0x52, 0xc0, 0x76, 0x1e, 0x79, 0xb9, 0xc7, 0x8b, + 0xbb, 0x1b, 0xe, 0xfb, 0x79, 0x76, 0xfa, 0x7c, 0x6e, 0xa, 0xfb, 0x8e, + 0x15, 0xe5, 0xfa, 0x7c, 0x31, 0x6, 0xe, 0xf7, 0xa0, 0xe4, 0x3, 0xf7, + 0x14, 0xfb, 0x2c, 0x15, 0x2f, 0x7, 0xbb, 0xc6, 0x8b, 0x9d, 0xba, 0x1f, + 0xbf, 0x9f, 0xa2, 0xc5, 0xba, 0x1a, 0xf7, 0x9, 0x7, 0xf7, 0x0, 0x94, + 0xcc, 0xf4, 0x9b, 0x1e, 0xe9, 0x7, 0x22, 0x9b, 0x82, 0xcc, 0xf7, 0x0, + 0x1a, 0xf7, 0x9, 0x7, 0xba, 0x75, 0xc5, 0x56, 0x9f, 0x1e, 0x9d, 0x5c, + 0x50, 0x8b, 0x5b, 0x1b, 0x2e, 0x7, 0xb2, 0xb0, 0x8b, 0x81, 0xae, 0x1f, + 0xa2, 0x84, 0x91, 0x72, 0x74, 0x1a, 0xfb, 0x28, 0x7, 0x43, 0xac, 0x39, + 0xc9, 0x68, 0x1e, 0x4d, 0x68, 0x6a, 0x38, 0x42, 0x1a, 0xfb, 0x28, 0x7, + 0x74, 0x85, 0x72, 0x74, 0x84, 0x1e, 0x80, 0x67, 0x67, 0x8b, 0x64, 0x1b, + 0xe, 0xf7, 0x45, 0xef, 0x62, 0xf0, 0x12, 0x13, 0x40, 0xd1, 0xf7, 0x67, + 0x15, 0xcc, 0x51, 0x5, 0xab, 0xa0, 0x9d, 0xbe, 0xb3, 0x1b, 0xa8, 0xb2, + 0x75, 0x7a, 0xb2, 0x1f, 0x13, 0x80, 0x80, 0xa4, 0xa5, 0x82, 0xa3, 0x1b, + 0xb4, 0xc3, 0xaf, 0xe0, 0xaf, 0x1f, 0x4e, 0xc5, 0x5, 0x75, 0x7d, 0x6b, + 0x52, 0x71, 0x1b, 0x73, 0x74, 0x97, 0x99, 0x71, 0x1f, 0x13, 0x40, 0x9b, + 0x6b, 0x67, 0x9d, 0x5d, 0x1b, 0x47, 0x65, 0x45, 0x53, 0x6a, 0x1f, 0xe, + 0xfb, 0x11, 0x76, 0xf8, 0x4a, 0xf7, 0x31, 0x1, 0xf7, 0x7e, 0xf7, 0x17, + 0x3, 0xf7, 0x74, 0xfb, 0x26, 0x15, 0xf7, 0x2b, 0x6, 0x77, 0xf8, 0x22, + 0x5, 0xfb, 0x2, 0x6, 0x60, 0xf7, 0xa, 0x15, 0x5f, 0xb7, 0x69, 0xc1, + 0xc1, 0xb7, 0xad, 0xb7, 0xb7, 0x5f, 0xae, 0x55, 0x55, 0x5f, 0x68, 0x5f, + 0x1e, 0xe, 0x6f, 0x76, 0x1, 0xd5, 0xec, 0xd9, 0xec, 0xc8, 0xe9, 0x3, + 0xf7, 0x8d, 0x5a, 0x15, 0xec, 0xf7, 0x14, 0x6, 0xce, 0x95, 0xc5, 0xaf, + 0xc2, 0xb2, 0x5e, 0xd2, 0x18, 0x61, 0x41, 0x60, 0x73, 0x4a, 0x1b, 0xfb, + 0x6, 0x7d, 0xe7, 0xa2, 0xc9, 0xc0, 0xca, 0xda, 0xaf, 0xb1, 0x7c, 0x7a, + 0xa9, 0x1f, 0x54, 0xe9, 0xf7, 0x44, 0x2d, 0x6c, 0x7, 0x7b, 0x97, 0x72, + 0x94, 0x77, 0x8e, 0x8, 0xf2, 0x2a, 0x25, 0x7, 0xfb, 0xb, 0x72, 0x53, + 0x2e, 0x31, 0x1a, 0xfb, 0x24, 0xf7, 0x12, 0x5c, 0xbc, 0x7e, 0x1e, 0xe, + 0x84, 0x76, 0xf7, 0xb9, 0xe8, 0xf7, 0x34, 0xe8, 0x12, 0xf7, 0xf, 0xe9, + 0x5d, 0xec, 0x13, 0xe8, 0xdf, 0xaf, 0x15, 0xbe, 0x4b, 0x5, 0x93, 0x97, + 0xce, 0xb0, 0xbb, 0x1b, 0xa1, 0xac, 0x82, 0x83, 0xa6, 0x1f, 0x84, 0xa2, + 0xa3, 0x85, 0x9f, 0x1b, 0xd3, 0xb2, 0xb6, 0x71, 0xa, 0x70, 0x79, 0x64, + 0xa, 0x75, 0x94, 0x7c, 0x1b, 0x78, 0x61, 0x84, 0x85, 0x7f, 0x1f, 0x9f, + 0xac, 0x9b, 0xab, 0xae, 0x1a, 0xa1, 0x8b, 0xa3, 0x84, 0xa5, 0x1e, 0xf7, + 0x5f, 0xd8, 0xfb, 0x74, 0x6, 0x13, 0xf0, 0x7f, 0xa4, 0x86, 0xb4, 0xa2, + 0x6c, 0xa, 0xbd, 0x7c, 0x5e, 0xa0, 0x1f, 0xd5, 0xb9, 0x5, 0xb9, 0x70, + 0x5d, 0xc8, 0x63, 0xa, 0x76, 0x8f, 0x66, 0x93, 0x77, 0x1e, 0x3d, 0x3e, + 0xef, 0x6, 0x13, 0xe8, 0x92, 0x76, 0x8c, 0x76, 0x75, 0x1a, 0x8a, 0x49, + 0x66, 0x49, 0x60, 0x6a, 0x8, 0xe, 0xcf, 0xe3, 0xf7, 0x92, 0xe3, 0x1, + 0xdc, 0xe5, 0xf7, 0x97, 0xe5, 0x3, 0xc1, 0xf5, 0x15, 0xc8, 0x52, 0xc8, + 0xc4, 0x5, 0x71, 0xae, 0xb8, 0x7f, 0xb9, 0x1b, 0xb8, 0xb7, 0x98, 0xa5, + 0xad, 0x1f, 0xc9, 0x51, 0xc6, 0xc6, 0x4c, 0xc5, 0x5, 0xa3, 0xaa, 0x98, + 0xb5, 0xb5, 0x1a, 0xb7, 0x7f, 0xb7, 0x72, 0xac, 0x1e, 0xca, 0xc5, 0x51, + 0xc4, 0x4e, 0x50, 0x68, 0xa7, 0x5a, 0x98, 0x5b, 0x8a, 0x19, 0x5f, 0x8a, + 0x60, 0x7f, 0x6a, 0x72, 0x4e, 0xc4, 0x18, 0x4f, 0x50, 0xca, 0x51, 0x5, + 0x73, 0x6a, 0x7f, 0x60, 0x61, 0x1a, 0x61, 0x97, 0x60, 0xa4, 0x6b, 0x1e, + 0xc0, 0xf7, 0xa, 0x15, 0xd0, 0xc4, 0xc5, 0xd3, 0xd3, 0xc5, 0x51, 0x46, + 0x45, 0x51, 0x52, 0x43, 0x43, 0x52, 0xc4, 0xd1, 0x1e, 0xe, 0x8b, 0xe2, + 0xc4, 0xc1, 0xb5, 0xc0, 0xf7, 0x4a, 0xe2, 0x1, 0x95, 0xf7, 0x84, 0xf3, + 0xf7, 0x80, 0x3, 0xf7, 0x22, 0x16, 0xf7, 0xd3, 0xe2, 0xfb, 0x5, 0xc3, + 0xf7, 0x25, 0xc1, 0xfb, 0x25, 0xb6, 0xf7, 0x25, 0xc0, 0xfb, 0x20, 0x6, + 0xf7, 0x34, 0xf7, 0x4a, 0x5, 0xd8, 0xe2, 0xfb, 0x80, 0x34, 0xb7, 0x6, + 0x2b, 0xfb, 0x7, 0x2a, 0xf7, 0x7, 0x5, 0xb8, 0xe2, 0xfb, 0x84, 0x34, + 0xdc, 0x6, 0xf7, 0x36, 0xfb, 0x4a, 0x5, 0xfb, 0x24, 0x56, 0xf7, 0x26, + 0x60, 0xfb, 0x26, 0x55, 0xf7, 0x26, 0x53, 0xfb, 0x5, 0x6, 0xe, 0xfb, + 0x2e, 0x76, 0xf9, 0xe6, 0x6e, 0xa, 0xf7, 0xb1, 0x15, 0xe5, 0xf8, 0x1a, + 0x31, 0x6, 0xfd, 0xe6, 0x4, 0xe5, 0xf8, 0x1b, 0x31, 0x6, 0xe, 0x45, + 0xe8, 0x2e, 0xf7, 0x40, 0xf7, 0xd5, 0xf7, 0x40, 0xfb, 0x1, 0xe9, 0x12, + 0xe3, 0xf1, 0xf7, 0x60, 0xf1, 0x13, 0x9c, 0xe3, 0x45, 0x15, 0xf7, 0x84, + 0x6, 0xe8, 0xcd, 0xa4, 0xd4, 0xb1, 0x7d, 0x9f, 0x75, 0x9f, 0x1f, 0xa5, + 0x96, 0xb3, 0xaa, 0xc1, 0x1a, 0xaf, 0x74, 0xab, 0x6b, 0xa2, 0x1e, 0xfb, + 0x91, 0xf7, 0x41, 0x5, 0x8b, 0x86, 0x8e, 0x90, 0x1a, 0x96, 0x98, 0x8c, + 0xa2, 0x1e, 0xf7, 0x2e, 0x4c, 0x6, 0x13, 0xac, 0xf1, 0xf7, 0x40, 0xfb, + 0x88, 0x6, 0x49, 0x36, 0x78, 0x26, 0x6e, 0xa0, 0x74, 0xa1, 0x78, 0x1f, + 0x73, 0x7b, 0x66, 0x72, 0x50, 0x1a, 0x59, 0xa7, 0x71, 0xbb, 0x6b, 0x1e, + 0xf7, 0x5e, 0xfb, 0x1d, 0x5, 0xa1, 0x7d, 0x8e, 0x88, 0x82, 0x1a, 0x82, + 0x7e, 0x8a, 0x7a, 0x1e, 0xfb, 0x3a, 0xda, 0x6, 0x13, 0x6c, 0x25, 0x6, + 0xf7, 0xac, 0xcc, 0x15, 0xfb, 0x37, 0xf7, 0x1, 0x5, 0x80, 0x92, 0x82, + 0x97, 0x97, 0x1a, 0xa0, 0xa5, 0x95, 0x98, 0x92, 0x1e, 0xf7, 0x48, 0xfb, + 0xd, 0x5, 0x94, 0x86, 0x92, 0x83, 0x82, 0x1a, 0x71, 0x68, 0x84, 0x7a, + 0x89, 0x1e, 0xe, 0xf8, 0x79, 0xf7, 0x20, 0x1, 0xf7, 0x14, 0xf7, 0x17, + 0xde, 0xf7, 0x16, 0x3, 0xf7, 0xea, 0xf8, 0x79, 0x15, 0xf7, 0x16, 0xf7, + 0x20, 0xfb, 0x16, 0x6, 0xfb, 0x6a, 0xfb, 0x20, 0x15, 0xf7, 0x17, 0xf7, + 0x20, 0xfb, 0x17, 0x6, 0xe, 0x79, 0xb8, 0xe7, 0xb9, 0xf7, 0x8d, 0xba, + 0xd5, 0xb8, 0x1, 0x8b, 0xb8, 0xf3, 0xb9, 0xf7, 0xfc, 0xb8, 0x3, 0xf7, + 0xad, 0x4, 0xfb, 0x39, 0xf7, 0x1a, 0xfb, 0x1a, 0xf7, 0x39, 0xf7, 0x3a, + 0xf7, 0x1b, 0xf7, 0x1a, 0xf7, 0x39, 0xf7, 0x39, 0xfb, 0x1b, 0xf7, 0x1a, + 0xfb, 0x3a, 0xfb, 0x39, 0xfb, 0x1a, 0xfb, 0x1a, 0xfb, 0x39, 0x1e, 0xb8, + 0x16, 0xf7, 0x21, 0xf7, 0x5, 0xf7, 0x5, 0xf7, 0x21, 0xf7, 0x21, 0xf7, + 0x7, 0xfb, 0x5, 0xfb, 0x21, 0xfb, 0x21, 0xfb, 0x7, 0xfb, 0x5, 0xfb, + 0x21, 0xfb, 0x21, 0xfb, 0x5, 0xf7, 0x5, 0xf7, 0x21, 0x1e, 0xf8, 0x9, + 0x49, 0x15, 0x71, 0x73, 0x61, 0x73, 0x64, 0x1b, 0x46, 0x5a, 0xc7, 0xcc, + 0xcd, 0xc0, 0xc5, 0xcb, 0xae, 0xa7, 0x79, 0x75, 0xa1, 0x1f, 0xb1, 0xb2, + 0x5, 0xa8, 0x6a, 0x5f, 0x9e, 0x5e, 0x1b, 0x37, 0x3b, 0x43, 0x29, 0x35, + 0xcd, 0x35, 0xf2, 0xc4, 0xc9, 0xb7, 0xa0, 0x9b, 0x1f, 0xe, 0xf7, 0x58, + 0xde, 0xf7, 0x71, 0xdb, 0x12, 0xf7, 0x27, 0xcf, 0xf7, 0xd, 0xce, 0x48, + 0xf7, 0x9, 0x13, 0xe8, 0xf7, 0xe4, 0xf7, 0x60, 0x15, 0xf7, 0x9, 0xdd, + 0x59, 0x6, 0x13, 0xf0, 0xf7, 0x23, 0x7, 0xde, 0x86, 0xcf, 0xfb, 0x8, + 0x5c, 0x59, 0x7c, 0x77, 0x6d, 0x1e, 0x9f, 0x47, 0x5, 0x99, 0xa5, 0xc6, + 0x94, 0xa2, 0x1b, 0xad, 0x9e, 0x7e, 0x62, 0x1f, 0x94, 0x77, 0x75, 0x8e, + 0x76, 0x1b, 0x24, 0x74, 0x3d, 0x5b, 0x44, 0xb8, 0x4a, 0xce, 0xa7, 0xa7, + 0xa0, 0xa8, 0xa0, 0x1f, 0xf7, 0x12, 0x4, 0x63, 0x80, 0x6b, 0x56, 0x67, + 0x1b, 0x6d, 0x7f, 0xa4, 0x9d, 0xb8, 0xb6, 0x95, 0xb1, 0x9a, 0x9a, 0x88, + 0x89, 0x95, 0x1f, 0xe, 0x7b, 0xa, 0xba, 0xf8, 0x8b, 0x3, 0xf7, 0xa3, + 0xf7, 0x98, 0x15, 0xf7, 0x77, 0xfb, 0x52, 0xc1, 0xc9, 0xfb, 0x2d, 0xf7, + 0x13, 0xf7, 0x2b, 0xf7, 0x10, 0x54, 0xca, 0x5, 0xfc, 0x54, 0xfb, 0x4e, + 0x15, 0xf7, 0x6c, 0xfb, 0x52, 0xc2, 0xc9, 0xfb, 0x28, 0xf7, 0x13, 0xf7, + 0x26, 0xf7, 0x10, 0x53, 0xca, 0x5, 0xe, 0xf7, 0x10, 0x76, 0xf7, 0x5d, + 0xf7, 0x1, 0x1, 0xf8, 0x45, 0xeb, 0x3, 0xd2, 0xf7, 0xc4, 0x15, 0xf7, + 0xfe, 0xfb, 0x5d, 0xeb, 0xf7, 0xca, 0xfc, 0x5e, 0x6, 0xe, 0x79, 0xb8, + 0xf7, 0xf6, 0xb9, 0xf7, 0x0, 0xb8, 0x1, 0x8b, 0xb8, 0xf7, 0x2f, 0xbb, + 0xf7, 0x5, 0xbd, 0xf7, 0x24, 0xb8, 0x3, 0xf7, 0xad, 0x4, 0xfb, 0x39, + 0xf7, 0x1b, 0xfb, 0x1a, 0xf7, 0x39, 0xf7, 0x3a, 0xf7, 0x1a, 0xf7, 0x1a, + 0xf7, 0x39, 0xf7, 0x39, 0xfb, 0x1a, 0xf7, 0x1a, 0xfb, 0x3a, 0xfb, 0x39, + 0xfb, 0x1b, 0xfb, 0x1a, 0xfb, 0x39, 0x1e, 0xb8, 0x16, 0xf7, 0x20, 0xf7, + 0x7, 0xf7, 0x6, 0xf7, 0x20, 0xf7, 0x22, 0xf7, 0x5, 0xfb, 0x6, 0xfb, + 0x20, 0xfb, 0x20, 0xfb, 0x5, 0xfb, 0x6, 0xfb, 0x22, 0xfb, 0x20, 0xfb, + 0x7, 0xf7, 0x6, 0xf7, 0x20, 0x1e, 0xf7, 0x2f, 0xfb, 0x27, 0x15, 0xbb, + 0xf7, 0x8, 0xc1, 0x6, 0xbe, 0xfb, 0x8, 0x5, 0xc5, 0x6, 0x54, 0xf7, + 0x13, 0x5, 0x9e, 0x91, 0xaf, 0xa4, 0xc7, 0x1a, 0xed, 0x42, 0x86, 0xfb, + 0x1e, 0x8d, 0x1e, 0xbb, 0xfb, 0x29, 0x15, 0xf2, 0x7, 0xde, 0xa9, 0x83, + 0x5f, 0x5f, 0x64, 0x84, 0x41, 0x1f, 0xe, 0xf8, 0x8d, 0xdb, 0x1, 0xe3, + 0xf8, 0x3c, 0x3, 0xe3, 0xf8, 0x8d, 0x15, 0xf8, 0x3c, 0xdb, 0xfc, 0x3c, + 0x6, 0xe, 0xf7, 0x87, 0xe6, 0xf7, 0x53, 0xe6, 0x1, 0xf5, 0xea, 0xf7, + 0x5b, 0xe9, 0x3, 0xf5, 0xf8, 0x41, 0x15, 0x24, 0xe1, 0x38, 0xf7, 0x0, + 0xf7, 0x1, 0xe0, 0xde, 0xf2, 0xf3, 0x36, 0xde, 0xfb, 0x1, 0xfb, 0x0, + 0x35, 0x38, 0x23, 0x1e, 0xea, 0x16, 0xc1, 0xb6, 0xb5, 0xc3, 0xc4, 0xb6, + 0x61, 0x55, 0x56, 0x60, 0x61, 0x52, 0x53, 0x60, 0xb5, 0xc0, 0x1e, 0xe, + 0xa3, 0xdc, 0xf7, 0x4a, 0xe3, 0xf7, 0x20, 0x67, 0xa, 0xeb, 0x3, 0xd2, + 0xf7, 0xb3, 0x15, 0xf7, 0x48, 0xfb, 0x27, 0xeb, 0xf7, 0x27, 0xf7, 0x4a, + 0xe3, 0xfb, 0x4a, 0xf7, 0x20, 0x2b, 0xfb, 0x20, 0xfb, 0x48, 0x6, 0xfb, + 0xf3, 0x4, 0xf8, 0x5e, 0xdc, 0xfc, 0x5e, 0x6, 0xe, 0xf7, 0x7a, 0xd6, + 0xf7, 0x39, 0xf7, 0x26, 0x3e, 0xd8, 0x12, 0xf8, 0x0, 0xdd, 0x13, 0xb0, + 0xf7, 0x2d, 0xf7, 0x7a, 0x15, 0xf7, 0xb9, 0xd6, 0xfb, 0x38, 0x6, 0xf7, + 0x1, 0xe0, 0x5, 0xa7, 0xa0, 0xa5, 0xb0, 0xb7, 0x1a, 0xae, 0x6e, 0xe4, + 0xfb, 0x5, 0x54, 0x57, 0x73, 0x56, 0x6c, 0x1e, 0x13, 0xd0, 0x46, 0xde, + 0x7, 0x13, 0xb0, 0xa1, 0x87, 0xba, 0xc6, 0xa4, 0xaf, 0x82, 0x64, 0x78, + 0x82, 0x7c, 0x79, 0x7c, 0x1e, 0xfb, 0x4c, 0xfb, 0x27, 0x5, 0xe, 0xf7, + 0x72, 0xd6, 0xee, 0xd4, 0xf7, 0x27, 0x77, 0x12, 0xf7, 0x83, 0xf7, 0x50, + 0x3b, 0xdb, 0x4e, 0xdc, 0x13, 0xe4, 0xf7, 0x2c, 0xf7, 0x96, 0x15, 0x71, + 0xcb, 0xb2, 0x81, 0xb3, 0x1b, 0xe9, 0xc5, 0xc6, 0xce, 0xae, 0x7a, 0xae, + 0x6d, 0xa2, 0x1f, 0x13, 0xe8, 0x97, 0x97, 0x9a, 0xa1, 0xab, 0x1a, 0xd7, + 0x50, 0xac, 0x4a, 0x57, 0x54, 0x78, 0x6a, 0x69, 0x1e, 0xb5, 0x4b, 0x5, + 0x9d, 0xaa, 0xaf, 0xa1, 0xaf, 0x1b, 0x9c, 0xa2, 0x84, 0x70, 0x70, 0x75, + 0x80, 0x70, 0x1f, 0x13, 0xf0, 0x88, 0x7b, 0x8c, 0x63, 0x1b, 0x42, 0xce, + 0x7, 0x13, 0xe4, 0xb6, 0x9c, 0x74, 0x72, 0x6e, 0x73, 0x75, 0x64, 0x1f, + 0x5e, 0x8c, 0x66, 0x99, 0x67, 0x9d, 0x8, 0xe, 0xf8, 0xa5, 0x76, 0xf7, + 0x2d, 0x77, 0x1, 0xf7, 0x4e, 0xf8, 0x90, 0x15, 0xf7, 0x89, 0xcc, 0x6b, + 0xe3, 0xfb, 0x7b, 0x24, 0x5, 0xe, 0xfb, 0xd, 0x76, 0xf7, 0x36, 0xd9, + 0x3d, 0xe5, 0xf7, 0x83, 0xe5, 0x12, 0x9a, 0xf7, 0x45, 0x2a, 0xec, 0xf7, + 0x1c, 0xf7, 0x46, 0x2a, 0xec, 0x2a, 0xf7, 0x44, 0x13, 0xd9, 0x0, 0xea, + 0xfb, 0x22, 0x15, 0xec, 0xf7, 0x51, 0x6, 0x77, 0x9e, 0xaa, 0x83, 0xab, + 0x1b, 0xc0, 0xc6, 0xa1, 0xa9, 0xa2, 0x1f, 0x58, 0x7, 0x13, 0xb8, 0x80, + 0xf7, 0x44, 0xe5, 0x6, 0x13, 0xba, 0x0, 0x3c, 0xf7, 0xdd, 0xfb, 0x46, + 0x31, 0x6, 0x13, 0xd9, 0x0, 0xdc, 0xfb, 0x56, 0x6, 0x6b, 0x71, 0x55, + 0x72, 0x5c, 0x1b, 0x5b, 0x61, 0xa0, 0xca, 0x1f, 0xf7, 0x95, 0xfb, 0x45, + 0x31, 0x7, 0x13, 0xd6, 0x0, 0xdb, 0x6, 0xe, 0x5a, 0x76, 0xf9, 0x0, + 0xa9, 0x1, 0xf7, 0xd4, 0xc2, 0xeb, 0xc0, 0x3, 0xf7, 0xd4, 0x45, 0x15, + 0xc2, 0xf9, 0x0, 0xeb, 0xfd, 0x0, 0xc0, 0xf9, 0x0, 0xc8, 0xa9, 0xfb, + 0x98, 0x6, 0xfb, 0x60, 0x21, 0x4f, 0xfb, 0xc, 0xfb, 0x2, 0xf5, 0x57, + 0xf7, 0x5b, 0x8a, 0x1f, 0xe, 0xf7, 0x39, 0xf7, 0x4e, 0x1, 0xf7, 0x58, + 0xf7, 0x96, 0x15, 0x58, 0xba, 0x61, 0xc4, 0xc4, 0xba, 0xb5, 0xbe, 0xbe, + 0x5c, 0xb5, 0x52, 0x52, 0x5c, 0x61, 0x58, 0x1e, 0xe, 0xfb, 0x4d, 0x76, + 0xf7, 0x62, 0x77, 0x12, 0xf7, 0x91, 0x16, 0x80, 0x2d, 0x5, 0x8f, 0x92, + 0x9a, 0x8d, 0x99, 0x1b, 0x9d, 0x9b, 0x85, 0x77, 0x7d, 0x7e, 0x83, 0x7b, + 0x1f, 0x13, 0xc0, 0x7c, 0x74, 0x90, 0x94, 0x82, 0x1f, 0x70, 0x53, 0x5, + 0x79, 0xa4, 0xa6, 0x81, 0xa9, 0x1b, 0xc9, 0xb1, 0xb8, 0xc2, 0xc8, 0x60, + 0x9a, 0x7b, 0x8f, 0x1f, 0xa5, 0x7, 0xe, 0xf7, 0x7a, 0xd8, 0xf7, 0xc9, + 0x77, 0x12, 0xf7, 0x3a, 0xf7, 0x45, 0x3b, 0xdb, 0x13, 0xe0, 0xf7, 0x2d, + 0xf7, 0x7a, 0x15, 0xf7, 0xba, 0xd8, 0x23, 0xf7, 0xc9, 0x6, 0xfb, 0x45, + 0x75, 0x5, 0x3f, 0x7, 0x13, 0xd0, 0xec, 0x91, 0x5, 0xfb, 0x6d, 0xfb, + 0x2, 0x7, 0xe, 0xf7, 0x58, 0xde, 0xf7, 0x6e, 0xde, 0x1, 0xf7, 0x27, + 0xcf, 0xf7, 0x3f, 0xce, 0x3, 0xf7, 0x27, 0xf8, 0x18, 0x15, 0x21, 0xca, + 0x35, 0xe7, 0xda, 0xd3, 0xd6, 0xf7, 0x9, 0xe9, 0x53, 0xed, 0x29, 0x2a, + 0x54, 0x24, 0x32, 0x1e, 0xcf, 0x89, 0x15, 0xbe, 0xa7, 0xc7, 0xc5, 0xc5, + 0xa6, 0x4c, 0x5d, 0x49, 0x66, 0x60, 0x5b, 0x53, 0x6d, 0xbe, 0xc3, 0x1e, + 0xe, 0x7b, 0xa, 0xbc, 0xf8, 0x8b, 0x3, 0xf0, 0xd1, 0x15, 0xf7, 0x77, + 0xf7, 0x52, 0xfb, 0x74, 0xf7, 0x4e, 0x54, 0x4c, 0xf7, 0x2b, 0xfb, 0x10, + 0xfb, 0x2d, 0xfb, 0x13, 0x5, 0xf7, 0xb5, 0x4d, 0x15, 0xf7, 0x6c, 0xf7, + 0x52, 0xfb, 0x69, 0xf7, 0x4e, 0x53, 0x4c, 0xf7, 0x26, 0xfb, 0x10, 0xfb, + 0x28, 0xfb, 0x13, 0x5, 0xe, 0x64, 0x76, 0xa2, 0xc4, 0x5a, 0x76, 0xf7, + 0x6, 0xca, 0xf7, 0x43, 0xd0, 0x8b, 0xf7, 0x4f, 0xe1, 0x77, 0x12, 0xbf, + 0xd5, 0xf8, 0x8, 0xd7, 0x13, 0xdf, 0x80, 0xf7, 0xf0, 0xcb, 0x15, 0xf7, + 0x2a, 0x5f, 0x3f, 0x52, 0xf7, 0x59, 0xc4, 0x5e, 0xb7, 0xb8, 0xca, 0x5e, + 0xf7, 0x41, 0x42, 0x6, 0xfb, 0x2d, 0xfb, 0x52, 0x5, 0xe3, 0x9c, 0x15, + 0xc9, 0xd7, 0x5, 0x3f, 0x7, 0xfc, 0x71, 0xfb, 0x10, 0x15, 0x13, 0x3f, + 0x80, 0x65, 0xa, 0x50, 0xc6, 0x5, 0xfd, 0x12, 0xfb, 0xea, 0x15, 0xf7, + 0xa0, 0xd0, 0x2d, 0xf7, 0xa4, 0x6, 0xfb, 0x37, 0x78, 0x5, 0x47, 0x7, + 0xe4, 0x90, 0x5, 0xfb, 0x52, 0x27, 0x7, 0xe, 0x51, 0xce, 0xf7, 0x33, + 0xf7, 0x16, 0x47, 0xcf, 0x8a, 0xd1, 0x8b, 0xf7, 0x52, 0xe2, 0x77, 0xb0, + 0x77, 0x12, 0xbc, 0xd1, 0x13, 0xcb, 0xf8, 0x20, 0x97, 0x15, 0x51, 0xf7, + 0x90, 0xce, 0xfb, 0x22, 0x7, 0xf7, 0xa, 0xeb, 0xa2, 0xaa, 0xb3, 0x1a, + 0xa9, 0x71, 0xdb, 0x29, 0x5d, 0x62, 0x75, 0x67, 0x6d, 0x1e, 0x43, 0xd2, + 0x7, 0x13, 0xab, 0x9e, 0x87, 0xb6, 0xbd, 0xa1, 0xac, 0x82, 0x69, 0x79, + 0x82, 0x7e, 0xfb, 0x41, 0xfb, 0x24, 0x1e, 0x13, 0x9b, 0xfc, 0x4f, 0xf7, + 0xb1, 0x15, 0xf7, 0x91, 0xd1, 0x34, 0xf7, 0xa8, 0x6, 0x13, 0x9d, 0xfb, + 0x2e, 0x78, 0x5, 0x46, 0x7, 0xdf, 0x90, 0x5, 0xfb, 0x55, 0x2b, 0x7, + 0xc7, 0xfc, 0x0, 0x15, 0x65, 0xa, 0x50, 0xc6, 0x5, 0xe, 0x5e, 0xc4, + 0x58, 0x76, 0xaa, 0x76, 0xf5, 0xcb, 0xf7, 0x3c, 0xd0, 0xe5, 0xcb, 0xc8, + 0xcd, 0x91, 0x77, 0xb0, 0x77, 0x12, 0x13, 0x5e, 0x80, 0xf7, 0xe7, 0xc3, + 0x15, 0xf7, 0x29, 0x6, 0x13, 0x9e, 0x80, 0x5f, 0x41, 0x52, 0xf7, 0x56, + 0xc4, 0x5d, 0xb7, 0xb9, 0xcb, 0x5d, 0xf7, 0x46, 0x45, 0x7, 0xfb, 0x2d, + 0xfb, 0x56, 0x5, 0xe3, 0x9b, 0x15, 0xc8, 0xd9, 0x5, 0x3d, 0x7, 0xfc, + 0xa8, 0xf7, 0x5f, 0x15, 0x71, 0xc7, 0xaf, 0x82, 0xb3, 0x1b, 0xe1, 0xbe, + 0xc1, 0xc9, 0xaa, 0x7c, 0xaa, 0x70, 0x9f, 0x1f, 0x96, 0x95, 0x98, 0xa0, + 0xa9, 0x1a, 0xc9, 0x56, 0xa8, 0x4f, 0x5b, 0x57, 0x7b, 0x6d, 0x6b, 0x1e, + 0xb4, 0x56, 0x5, 0x9d, 0x99, 0xad, 0x9a, 0xb0, 0x1b, 0xa4, 0x9f, 0x83, + 0x79, 0x71, 0x76, 0x82, 0x73, 0x1f, 0x55, 0x4b, 0xca, 0x6, 0xb2, 0x9a, + 0x76, 0x75, 0x71, 0x75, 0x76, 0x69, 0x1f, 0x89, 0x6, 0x61, 0x8c, 0x69, + 0x98, 0x69, 0x9a, 0x8, 0xa8, 0xfc, 0x13, 0x15, 0x13, 0x3e, 0x80, 0x65, + 0xa, 0x5, 0x13, 0x5d, 0x0, 0x50, 0xc6, 0x5, 0xe, 0xfb, 0x26, 0xe7, + 0xf7, 0xf1, 0xf7, 0x2e, 0x12, 0xed, 0xec, 0xba, 0xf7, 0x44, 0x7c, 0xed, + 0x13, 0xe8, 0xf7, 0xad, 0xf7, 0x59, 0x15, 0x57, 0x7f, 0xfb, 0x17, 0x66, + 0xfb, 0xf, 0x1a, 0xfb, 0x2, 0xeb, 0x4e, 0xf7, 0xd, 0xc2, 0xd9, 0x9a, + 0x9f, 0xc0, 0x1e, 0xf7, 0x24, 0x29, 0x3f, 0x7, 0x85, 0x6f, 0x6d, 0x86, + 0x6e, 0x1b, 0x48, 0x55, 0xa3, 0xc2, 0xd5, 0xe9, 0x9c, 0xe4, 0x99, 0x1f, + 0xf7, 0x13, 0x7, 0x13, 0x50, 0x2a, 0x6, 0x13, 0xf0, 0x64, 0xf7, 0x7, + 0x15, 0x60, 0xb2, 0x69, 0xbc, 0x1e, 0x13, 0x50, 0xbc, 0xb2, 0xad, 0xb6, + 0xb6, 0x64, 0xad, 0x5a, 0x5a, 0x64, 0x69, 0x60, 0x1f, 0xe, 0x8b, 0xe5, + 0xcc, 0xe5, 0xf7, 0x7a, 0xe5, 0xf7, 0x6f, 0x77, 0x44, 0xa, 0xf7, 0x19, + 0xf9, 0x3c, 0x15, 0xf7, 0xcf, 0x40, 0xa5, 0xc5, 0xfb, 0xbe, 0xf7, 0xd, + 0x5, 0xfb, 0x4d, 0xfd, 0xa4, 0x22, 0xa, 0x8b, 0xe5, 0xcc, 0xe5, 0xf7, + 0x6d, 0xe5, 0xf7, 0x7c, 0x77, 0x44, 0xa, 0x82, 0x16, 0x20, 0xa, 0xfb, + 0x60, 0xf7, 0xfc, 0x15, 0xf7, 0xd2, 0xd5, 0x62, 0xf4, 0xfb, 0xbd, 0x6a, + 0xa, 0xe, 0x8b, 0xe4, 0xcd, 0xe4, 0xf7, 0x6d, 0xe4, 0xf7, 0x7a, 0x77, + 0x44, 0xa, 0xf7, 0x20, 0xf8, 0xef, 0x15, 0xf7, 0x2c, 0xf1, 0xf7, 0x2b, + 0x25, 0xc7, 0xaf, 0xfb, 0x36, 0xf7, 0x21, 0x5, 0x2a, 0x6, 0xfb, 0x39, + 0xfb, 0x20, 0x5, 0x33, 0xfd, 0x14, 0x22, 0xa, 0x8b, 0xe5, 0xcc, 0xe5, + 0xf7, 0x6d, 0xe5, 0xc7, 0xde, 0x74, 0xde, 0x8f, 0x77, 0x12, 0x82, 0xf7, + 0x97, 0xf4, 0xf7, 0x92, 0x13, 0xeb, 0xde, 0xf9, 0x10, 0x15, 0xe3, 0x71, + 0x5, 0xaf, 0x99, 0x98, 0xa5, 0xa7, 0x1b, 0xaf, 0x9f, 0x78, 0x7b, 0xa4, + 0x1f, 0x13, 0xf7, 0x7e, 0x9f, 0xa1, 0x7f, 0xae, 0x1b, 0xd9, 0xbd, 0xc6, + 0xca, 0x9a, 0x1f, 0x35, 0xa4, 0x5, 0x75, 0x84, 0x7d, 0x61, 0x66, 0x1b, + 0x6d, 0x76, 0x99, 0x9a, 0x75, 0x1f, 0x13, 0xeb, 0x9a, 0x74, 0x73, 0x9b, + 0x66, 0x1b, 0x38, 0x5e, 0x49, 0x56, 0x7c, 0x1f, 0x2f, 0xfd, 0x10, 0x22, + 0xa, 0x8b, 0xe3, 0xcc, 0xe3, 0xf7, 0x69, 0xe3, 0xdf, 0xf7, 0xe, 0x44, + 0xa, 0xf7, 0xda, 0xf9, 0x10, 0x15, 0xf7, 0x3, 0xf7, 0xe, 0x6b, 0xa, + 0xfb, 0x4b, 0xfb, 0xe, 0x15, 0xf7, 0x5, 0xf7, 0xe, 0xfb, 0x5, 0x6, + 0xfb, 0x2c, 0xfd, 0x8a, 0x22, 0xa, 0x8b, 0xe8, 0xcf, 0xe9, 0xf7, 0x7e, + 0xe8, 0x9e, 0xc9, 0xd7, 0xc9, 0x1, 0xf7, 0x4d, 0xcc, 0xdb, 0xcb, 0x3, + 0xf7, 0x4d, 0xf9, 0x51, 0x15, 0x54, 0xba, 0x5e, 0xc5, 0xc4, 0xba, 0xb8, + 0xc2, 0xc2, 0x5c, 0xb8, 0x52, 0x51, 0x5c, 0x5e, 0x54, 0x1e, 0xcd, 0x16, + 0xa0, 0x9c, 0x9c, 0xa1, 0xa1, 0x9d, 0x7a, 0x76, 0x76, 0x79, 0x7a, 0x75, + 0x75, 0x7a, 0x9c, 0xa0, 0x1e, 0xfb, 0x98, 0xfd, 0x51, 0x22, 0xa, 0x8b, + 0xe5, 0x31, 0xf7, 0x40, 0x7e, 0xe6, 0x48, 0xf7, 0x50, 0x9d, 0xf7, 0x41, + 0x31, 0xe5, 0x12, 0xf7, 0xbe, 0xed, 0xb5, 0xda, 0x9d, 0xdc, 0x13, 0xab, + 0x80, 0x7c, 0x16, 0xf7, 0x89, 0xe5, 0x3e, 0x6, 0xa9, 0xd0, 0x5, 0xf7, + 0x7, 0xfb, 0x33, 0xf7, 0xd2, 0x6, 0x13, 0x5b, 0x80, 0xf7, 0x40, 0x3a, + 0x7, 0x13, 0x97, 0x80, 0x39, 0xfb, 0x1f, 0xf7, 0x22, 0xb5, 0x5a, 0xda, + 0xf7, 0x50, 0x3c, 0x5a, 0x61, 0xf7, 0x2a, 0xf7, 0x1f, 0x7, 0x13, 0xab, + 0x80, 0x38, 0xdc, 0xf7, 0x41, 0xfc, 0x7b, 0x7, 0x13, 0xa7, 0x80, 0x31, + 0xea, 0x7, 0xfb, 0x40, 0xfc, 0x12, 0x5, 0x48, 0x6, 0xf7, 0x83, 0xf7, + 0x34, 0x15, 0xd5, 0xf7, 0x39, 0x5, 0xfb, 0x39, 0x7, 0xe, 0xfb, 0x4d, + 0x76, 0xf7, 0x54, 0xe7, 0xf8, 0x2e, 0xe7, 0x1, 0xaa, 0xec, 0xf7, 0x16, + 0xf7, 0x22, 0xcb, 0xec, 0x3, 0xf7, 0x9b, 0x82, 0x15, 0x82, 0x2e, 0x5, + 0x8e, 0x98, 0x9f, 0x8e, 0x97, 0x1b, 0x94, 0x99, 0x84, 0x7f, 0x7c, 0x80, + 0x84, 0x7d, 0x7d, 0x79, 0x91, 0x95, 0x7d, 0x1f, 0x6f, 0x52, 0x5, 0x71, + 0xac, 0xa0, 0x89, 0xa1, 0x1b, 0xc2, 0xb9, 0xac, 0xca, 0x98, 0x8b, 0xc3, + 0x4f, 0x99, 0x1f, 0x8c, 0x98, 0xe3, 0x8f, 0xcf, 0xb2, 0xd3, 0xb9, 0x19, + 0x52, 0xcf, 0x5, 0x72, 0x60, 0x4a, 0x63, 0x36, 0x1b, 0xfb, 0x21, 0x59, + 0xf7, 0x15, 0xd7, 0xf7, 0x2f, 0xf7, 0x6, 0xbd, 0xd7, 0xc1, 0xbd, 0x78, + 0x71, 0xb5, 0x1f, 0x21, 0xec, 0xf7, 0x87, 0x2a, 0x60, 0x7, 0xa4, 0x6a, + 0x55, 0x9d, 0x4e, 0x1b, 0xfb, 0x1e, 0xfb, 0x27, 0x2a, 0xfb, 0x5e, 0xfb, + 0x21, 0xea, 0xfb, 0x13, 0xf7, 0x1d, 0x75, 0x1f, 0xe, 0x48, 0xa, 0xc1, + 0xed, 0x3, 0xb1, 0x16, 0x35, 0xa, 0xf6, 0xf8, 0xe2, 0x15, 0xf7, 0xd2, + 0x40, 0xa6, 0x77, 0xa, 0x48, 0xa, 0xbf, 0xee, 0x3, 0xb1, 0x16, 0xf8, + 0xa5, 0x6, 0x8a, 0xf7, 0x5e, 0x5, 0x28, 0xfb, 0x4, 0xfb, 0x91, 0x38, + 0xa, 0xf7, 0x91, 0xfb, 0x6, 0xee, 0xf7, 0x60, 0xfc, 0xa1, 0x31, 0xd7, + 0xfc, 0x8, 0x3c, 0x6, 0xf7, 0x2b, 0xf8, 0x97, 0x15, 0xf7, 0xd8, 0xd5, + 0x61, 0xf4, 0xfb, 0xc3, 0x6a, 0xa, 0xe, 0x8b, 0xe4, 0xf7, 0x26, 0xe4, + 0xf7, 0x1d, 0xe4, 0xf7, 0x7a, 0x77, 0x1, 0xf7, 0x9, 0xec, 0xf1, 0xee, + 0xc0, 0xee, 0x3, 0xf7, 0x2b, 0xf8, 0xef, 0x15, 0xf7, 0x2d, 0xf1, 0xf7, + 0x2d, 0x25, 0xc8, 0xaf, 0xfb, 0x37, 0xf7, 0x21, 0x5, 0x27, 0x6, 0xfb, + 0x3b, 0xfb, 0x20, 0x5, 0x59, 0xfd, 0x14, 0x15, 0x35, 0xa, 0xe, 0x8b, + 0xe3, 0xf7, 0x24, 0xe2, 0xf7, 0x1b, 0xe3, 0xdf, 0xf7, 0xe, 0x12, 0xf7, + 0x9, 0xec, 0x4f, 0xf7, 0x6, 0xbb, 0xee, 0x40, 0xf7, 0x4, 0x9c, 0xed, + 0x13, 0xf5, 0x80, 0xf7, 0xe8, 0xf9, 0x10, 0x15, 0xf7, 0x4, 0xf7, 0xe, + 0xfb, 0x4, 0x56, 0xa, 0xfb, 0x8, 0xfd, 0x8a, 0x15, 0xf8, 0xa5, 0xf7, + 0x5e, 0x29, 0xfb, 0x4, 0x6, 0x13, 0xfa, 0x80, 0x2d, 0xa, 0xe, 0x8b, + 0xe5, 0xf8, 0x8, 0x5f, 0xa, 0xf7, 0x90, 0xef, 0x3, 0xd8, 0x16, 0x31, + 0xa, 0xcd, 0xf8, 0xe2, 0x15, 0xf7, 0xd4, 0x40, 0xa5, 0x77, 0xa, 0x8b, + 0xe5, 0xf8, 0x8, 0x5f, 0xa, 0xf7, 0x90, 0xef, 0x3, 0xf7, 0x50, 0xf8, + 0xf1, 0x15, 0xf7, 0xd9, 0xd5, 0x60, 0xf4, 0xfb, 0xc2, 0x6a, 0xa, 0x30, + 0xfd, 0x2c, 0x15, 0x31, 0xa, 0xe, 0x8b, 0xe4, 0xf8, 0x8, 0xe4, 0xf7, + 0x7a, 0x67, 0xa, 0xef, 0x3, 0xf7, 0x29, 0xf8, 0xef, 0x15, 0xf7, 0x2e, + 0xf1, 0xf7, 0x2d, 0x25, 0xc8, 0xaf, 0xfb, 0x38, 0xf7, 0x21, 0x5, 0x28, + 0x6, 0xfb, 0x3c, 0xfb, 0x20, 0x5, 0x82, 0xfd, 0x14, 0x15, 0x31, 0xa, + 0xe, 0x8b, 0xe3, 0xf8, 0x2, 0xe3, 0xdf, 0xf7, 0xe, 0x12, 0xf7, 0x2d, + 0xf7, 0x6, 0x7c, 0xef, 0x7e, 0xf7, 0x5, 0x13, 0xf4, 0xf7, 0xe7, 0xf9, + 0x10, 0x15, 0xf7, 0x5, 0xf7, 0xe, 0xfb, 0x5, 0x56, 0xa, 0x3f, 0xfd, + 0x8a, 0x15, 0xf8, 0x52, 0xe5, 0x6, 0x13, 0xe8, 0x30, 0xa, 0xe, 0x8b, + 0xe6, 0xf7, 0x30, 0xce, 0xf7, 0x31, 0xe6, 0x1, 0xf0, 0xeb, 0xf7, 0xb5, + 0xeb, 0x3, 0x9d, 0x16, 0xf7, 0xa1, 0x6, 0xf7, 0x2f, 0xf7, 0x20, 0xce, + 0xf7, 0x75, 0xf7, 0x39, 0x39, 0xf4, 0xfb, 0x4e, 0x1f, 0xfb, 0xbc, 0x30, + 0xde, 0xfb, 0x31, 0x43, 0x48, 0xd3, 0xfb, 0x30, 0x38, 0x6, 0xf7, 0x47, + 0x16, 0xf7, 0x30, 0xf7, 0x12, 0xce, 0xfb, 0x12, 0xf7, 0x31, 0xf7, 0xb, + 0x7, 0xf7, 0xf, 0xba, 0x38, 0x27, 0xfb, 0x12, 0x46, 0x44, 0xfb, 0x1a, + 0x1f, 0xe, 0x7f, 0xe7, 0xf8, 0x13, 0xe7, 0xc1, 0xdf, 0x12, 0xd9, 0xe8, + 0xf7, 0x97, 0xe8, 0x17, 0x8a, 0x7f, 0x15, 0xf7, 0x99, 0xe7, 0x32, 0xf7, + 0xd6, 0x6, 0xf7, 0x9b, 0xfc, 0x32, 0x5, 0xe4, 0xf8, 0x79, 0xd9, 0xe7, + 0xfb, 0x9e, 0x2f, 0xea, 0xfb, 0xcb, 0x6, 0xfb, 0x8b, 0xf8, 0x27, 0x5, + 0xfb, 0x4c, 0x2f, 0xda, 0xfc, 0x1d, 0x3c, 0x6, 0xe8, 0xf8, 0xc7, 0x15, + 0xe0, 0x71, 0x5, 0xaf, 0x9a, 0x97, 0xa6, 0xa7, 0x1b, 0xb2, 0x9f, 0x79, + 0x7a, 0xa2, 0x1f, 0x13, 0x60, 0x7d, 0x9e, 0x9f, 0x7f, 0xac, 0x1b, 0xd7, + 0xbb, 0xc7, 0xcb, 0x9a, 0x1f, 0x38, 0xa5, 0x5, 0x75, 0x84, 0x7c, 0x5f, + 0x68, 0x1b, 0x6f, 0x7b, 0x99, 0x99, 0x79, 0x1f, 0x9b, 0x77, 0x73, 0x9c, + 0x5c, 0x1b, 0x3a, 0x5f, 0x48, 0x55, 0x7c, 0x1f, 0xe, 0x61, 0xa, 0xf7, + 0x72, 0x54, 0xa, 0xa1, 0xf7, 0xa2, 0x2f, 0xa, 0xf7, 0x2b, 0x2e, 0xf7, + 0x1f, 0x26, 0xa, 0xa3, 0xf8, 0x2a, 0x15, 0xf7, 0xd0, 0x40, 0xa5, 0xc5, + 0xfb, 0xbf, 0xf7, 0xe, 0x5, 0xe, 0x61, 0xa, 0xf7, 0x72, 0x54, 0xa, + 0xa1, 0xf7, 0xa2, 0x25, 0xa, 0xd0, 0xf7, 0xdf, 0x15, 0xf7, 0xd4, 0xd5, + 0x61, 0xf5, 0xfb, 0xbe, 0xfb, 0xd, 0x5, 0xe, 0x61, 0xa, 0xf7, 0x6e, + 0x54, 0xa, 0xf7, 0x2b, 0xf8, 0xee, 0x15, 0xf7, 0x2c, 0xf2, 0xf7, 0x2c, + 0x24, 0xc6, 0xaf, 0xfb, 0x35, 0xf7, 0x22, 0x5, 0x29, 0x6, 0xfb, 0x3a, + 0xfb, 0x21, 0x5, 0x48, 0xfc, 0x5, 0x25, 0xa, 0xe, 0x61, 0xa, 0xbb, + 0xdf, 0x73, 0xdf, 0x90, 0x77, 0x12, 0xa1, 0xed, 0xf7, 0xff, 0xea, 0x13, + 0xd6, 0xe7, 0xf9, 0xe, 0x15, 0xe3, 0x71, 0x5, 0xae, 0x99, 0x99, 0xa6, + 0xa6, 0x1b, 0xac, 0x9e, 0x7d, 0x7d, 0xa0, 0x1f, 0x13, 0xee, 0x7d, 0xa0, + 0xa2, 0x79, 0xb6, 0x1b, 0xd9, 0xbe, 0xc6, 0xcb, 0x9a, 0x1f, 0x36, 0xa5, + 0x5, 0x75, 0x83, 0x7c, 0x60, 0x66, 0x1b, 0x6a, 0x7c, 0x9d, 0x9b, 0x74, + 0x1f, 0x13, 0xd6, 0x98, 0x78, 0x72, 0x98, 0x5f, 0x1b, 0x39, 0x5e, 0x49, + 0x55, 0x7b, 0x1f, 0x45, 0xfc, 0x0, 0x25, 0xa, 0xe, 0x79, 0xe4, 0xf8, + 0x15, 0xe6, 0xd8, 0xf7, 0x10, 0x1, 0xa1, 0xed, 0xae, 0xf7, 0x5, 0xd1, + 0xf7, 0x5, 0xab, 0xea, 0x3, 0xf7, 0xe6, 0xf9, 0xe, 0x53, 0xa, 0xfb, + 0x4b, 0xfb, 0x10, 0x53, 0xa, 0xfb, 0x19, 0xfc, 0x7c, 0x25, 0xa, 0xe, + 0xc7, 0x76, 0xf8, 0x4b, 0x77, 0x1, 0xdc, 0xef, 0x15, 0xc8, 0x4e, 0xf7, + 0x32, 0xf7, 0x33, 0xf7, 0x32, 0xfb, 0x33, 0xc8, 0xc8, 0xfb, 0x31, 0xf7, + 0x32, 0xf7, 0x30, 0xf7, 0x30, 0x4f, 0xc8, 0xfb, 0x33, 0xfb, 0x30, 0xfb, + 0x32, 0xf7, 0x33, 0x4e, 0x4f, 0xf7, 0x33, 0xfb, 0x33, 0x5, 0xe, 0x7c, + 0xe6, 0x3e, 0x76, 0xf8, 0x93, 0xe8, 0x8d, 0x77, 0x12, 0xa1, 0xee, 0xf8, + 0x2, 0xe6, 0x13, 0x6c, 0xad, 0xa3, 0x15, 0xcc, 0x5d, 0xba, 0xbf, 0x5, + 0x13, 0x9c, 0x6d, 0xbb, 0xc1, 0x7c, 0xc2, 0x1b, 0xf2, 0xf7, 0x40, 0xd1, + 0xf7, 0x76, 0xce, 0x78, 0xd3, 0x61, 0xc4, 0x1f, 0xbc, 0xc6, 0x4b, 0xbb, + 0x62, 0x58, 0x5, 0x13, 0xac, 0xa9, 0x61, 0x56, 0x9e, 0x4c, 0x1b, 0xfb, + 0x44, 0x8a, 0x22, 0xfb, 0x24, 0xfb, 0x30, 0x1a, 0x38, 0xa3, 0x4b, 0xb2, + 0x5a, 0x1e, 0xcd, 0xda, 0x15, 0x77, 0xa9, 0x81, 0xb9, 0xb4, 0x1a, 0xe9, + 0xc7, 0xf7, 0x6, 0xf7, 0xe, 0xb2, 0xab, 0x80, 0x7a, 0xa4, 0x1e, 0xfb, + 0x54, 0xfb, 0xfa, 0x15, 0xf7, 0x8a, 0xf7, 0xbd, 0x5, 0xa1, 0x6a, 0x97, + 0x54, 0x6c, 0x1a, 0x38, 0x58, 0xfb, 0xe, 0xfb, 0x19, 0x65, 0x6a, 0x95, + 0x9c, 0x72, 0x1e, 0xe, 0x4f, 0xa, 0xf7, 0x20, 0xf9, 0x3b, 0x15, 0xf7, + 0xca, 0x41, 0xa5, 0xc5, 0xfb, 0xb9, 0xf7, 0xd, 0x5, 0xfb, 0x47, 0xfb, + 0xd8, 0x15, 0x27, 0xa, 0x4f, 0xa, 0xf7, 0x4d, 0xf8, 0xf1, 0x15, 0xf7, + 0xcd, 0xd4, 0x62, 0xf5, 0xfb, 0xb9, 0x6a, 0xa, 0xfb, 0x34, 0xfb, 0x60, + 0x15, 0x27, 0xa, 0x79, 0xe6, 0xf8, 0x16, 0xe5, 0xf7, 0x7b, 0x52, 0xa, + 0xf7, 0x26, 0xf8, 0xef, 0x15, 0xf7, 0x2a, 0xf1, 0xf7, 0x28, 0x25, 0xc5, + 0xae, 0xfb, 0x32, 0xf7, 0x22, 0x5, 0x2c, 0x6, 0xfb, 0x37, 0xfb, 0x21, + 0x5, 0x39, 0xfb, 0x47, 0x15, 0x27, 0xa, 0x79, 0xe4, 0xf8, 0x11, 0xe3, + 0xe1, 0xf7, 0xe, 0x12, 0xdf, 0xea, 0x6d, 0xf7, 0x3, 0xd0, 0xf7, 0x2, + 0x7c, 0xea, 0x13, 0xec, 0xf7, 0xdd, 0xf9, 0x10, 0x15, 0xf7, 0x2, 0xf7, + 0xe, 0xfb, 0x2, 0x6, 0xfb, 0x48, 0xfb, 0xe, 0x15, 0xf7, 0x3, 0xf7, + 0xe, 0x6b, 0xa, 0xfb, 0x25, 0xfb, 0xbe, 0x15, 0x13, 0xf2, 0x27, 0xa, + 0x8b, 0xe5, 0xf8, 0x9, 0xe5, 0xf7, 0x7b, 0x77, 0x1, 0xf7, 0x8e, 0xec, + 0x3, 0xf7, 0x12, 0x16, 0xf7, 0xeb, 0xe5, 0xfb, 0xe, 0xf7, 0x6, 0x6, + 0xf7, 0x34, 0xf7, 0x97, 0x5, 0xdc, 0xe5, 0xfb, 0x82, 0x31, 0xc2, 0x6, + 0x21, 0xfb, 0x41, 0x24, 0xf7, 0x41, 0x5, 0xc0, 0xe5, 0xfb, 0x82, 0x31, + 0xda, 0x6, 0xf7, 0x34, 0xfb, 0x97, 0x5, 0xfb, 0x6, 0xfb, 0x10, 0x7, + 0xc9, 0xf8, 0x98, 0x15, 0xf7, 0xce, 0xd4, 0x62, 0xf4, 0xfb, 0xbb, 0xfb, + 0xb, 0x5, 0xe, 0x8b, 0xe6, 0xbe, 0xdb, 0xf7, 0x9, 0xdb, 0xbf, 0xe6, + 0x1, 0xf7, 0x2a, 0xde, 0xf7, 0x81, 0xdf, 0x3, 0xb8, 0x16, 0xf7, 0xc5, + 0xe6, 0xfb, 0x9, 0xbe, 0xf7, 0xf, 0x6, 0xee, 0xee, 0x9c, 0xf7, 0x13, + 0xf7, 0x29, 0xfb, 0x1d, 0x7b, 0x28, 0x1f, 0x36, 0xbf, 0xf7, 0xb, 0xe6, + 0xfb, 0xc5, 0x30, 0xf2, 0xfc, 0x10, 0x22, 0x6, 0xf7, 0x50, 0xf7, 0x17, + 0x15, 0xf7, 0x9, 0xf7, 0x16, 0x7, 0xb1, 0xd0, 0x8c, 0x50, 0x48, 0x47, + 0x93, 0x6a, 0x1f, 0xe, 0x7c, 0xe9, 0x39, 0xe9, 0xf7, 0x90, 0xe9, 0xea, + 0xe9, 0x12, 0x98, 0xf7, 0x46, 0x2b, 0xeb, 0xf7, 0x78, 0xeb, 0x72, 0xec, + 0x13, 0x7a, 0x98, 0x88, 0x15, 0xf7, 0x46, 0xf8, 0x56, 0x6, 0xdc, 0xab, + 0x8f, 0xcf, 0xd7, 0xbf, 0x87, 0x70, 0x6e, 0x55, 0x7d, 0x62, 0x75, 0x1e, + 0x66, 0x77, 0x63, 0x6e, 0x5a, 0x1a, 0x38, 0xd4, 0x71, 0xd9, 0x6f, 0x1e, + 0x13, 0xb9, 0xab, 0x80, 0xc7, 0x7f, 0x62, 0x1a, 0x69, 0x5a, 0x73, 0x4e, + 0x66, 0x42, 0x97, 0xa5, 0x73, 0x1e, 0x6e, 0x34, 0x5, 0x67, 0xc8, 0xb3, + 0x82, 0xc1, 0x1b, 0xf7, 0x18, 0xde, 0xd4, 0xe0, 0xe5, 0x3d, 0xa2, 0x42, + 0xa3, 0x1f, 0x5b, 0x9b, 0x5f, 0x9b, 0xa4, 0x1a, 0xa1, 0xaf, 0x9b, 0xb0, + 0x9c, 0x1e, 0x13, 0xb6, 0xc6, 0xa6, 0xb2, 0x9f, 0xcb, 0x1a, 0xd5, 0x51, + 0xbc, 0xfb, 0x40, 0xfb, 0x3a, 0x73, 0x4a, 0xfb, 0x10, 0x1e, 0x13, 0xba, + 0x39, 0x2d, 0x6, 0x13, 0x76, 0xdd, 0xfb, 0x90, 0x6, 0x13, 0x7a, 0x39, + 0x6, 0xe, 0x39, 0xa, 0xf7, 0x78, 0x77, 0x3b, 0xa, 0xf7, 0x13, 0xf8, + 0xc1, 0x15, 0xf7, 0xd5, 0x3f, 0xa2, 0xc5, 0xfb, 0xc2, 0xf7, 0xe, 0x5, + 0x42, 0xfb, 0xf8, 0x51, 0xa, 0xaa, 0x70, 0x5b, 0x8a, 0x21, 0xa, 0x39, + 0xa, 0xf7, 0x78, 0x77, 0x3b, 0xa, 0xf7, 0x42, 0xf8, 0x75, 0x15, 0xf7, + 0xd5, 0xd7, 0x61, 0xf3, 0xfb, 0xc2, 0xfb, 0xe, 0x5, 0x54, 0xfb, 0x7e, + 0x51, 0xa, 0xab, 0x70, 0x5b, 0x89, 0x21, 0xa, 0x39, 0xa, 0xf7, 0x74, + 0x77, 0x3b, 0xa, 0xf7, 0x1a, 0xf8, 0x72, 0x15, 0xf7, 0x2c, 0xf3, 0xf7, + 0x2d, 0x23, 0xc7, 0xae, 0xfb, 0x36, 0xf7, 0x24, 0x5, 0x27, 0x6, 0xfb, + 0x3a, 0xfb, 0x23, 0x5, 0xa4, 0xfb, 0x65, 0x15, 0x9b, 0xa9, 0xf4, 0xa4, + 0xd7, 0x1b, 0xbf, 0xa9, 0x70, 0x5b, 0x21, 0xa, 0x39, 0xa, 0xf7, 0x7, + 0xe0, 0x8e, 0x77, 0x34, 0xa, 0x13, 0xbb, 0x0, 0xf7, 0x32, 0xf8, 0x7a, + 0x15, 0xa3, 0x98, 0x94, 0xb1, 0xb1, 0x1b, 0xa0, 0xa8, 0x7a, 0x7b, 0xa9, + 0x1f, 0x7d, 0xa5, 0xa6, 0x7f, 0xa4, 0x1b, 0xf2, 0xac, 0xe3, 0xad, 0x96, + 0x1f, 0x13, 0xb7, 0x0, 0x35, 0xa4, 0x5, 0x61, 0x78, 0x80, 0x76, 0x6e, + 0x1b, 0x77, 0x74, 0x96, 0x98, 0x74, 0x1f, 0x13, 0xbb, 0x0, 0x9c, 0x6d, + 0x6b, 0x9e, 0x6c, 0x1b, 0x28, 0x6c, 0x3d, 0x5f, 0x79, 0x1f, 0xa4, 0xfb, + 0x62, 0x15, 0x9b, 0xa9, 0xf4, 0xa4, 0xd7, 0x1b, 0x3d, 0xa, 0x13, 0x7a, + 0x80, 0x4d, 0xa, 0x13, 0x7b, 0x0, 0x2b, 0xa, 0x13, 0xbb, 0x0, 0x29, + 0xa, 0x39, 0xa, 0xcf, 0xf7, 0x10, 0x12, 0xab, 0xec, 0x90, 0xf7, 0x5, + 0xd4, 0xf7, 0x4, 0x60, 0xea, 0x2c, 0xf7, 0x46, 0x13, 0xbf, 0x0, 0xf7, + 0xd4, 0xf8, 0x89, 0x15, 0xf7, 0x4, 0xf7, 0x10, 0xfb, 0x4, 0x6, 0xfb, + 0x4e, 0xfb, 0x10, 0x53, 0xa, 0x65, 0xfb, 0xd4, 0x3f, 0xa, 0x13, 0xbe, + 0x80, 0x3d, 0xa, 0x13, 0x7e, 0x40, 0x4d, 0xa, 0x13, 0x7e, 0x80, 0x2b, + 0xa, 0x13, 0xbe, 0x80, 0x29, 0xa, 0x39, 0xa, 0xba, 0xf7, 0x5a, 0x3b, + 0xa, 0xf7, 0x46, 0xf8, 0xe0, 0x15, 0x55, 0xbc, 0x62, 0xc8, 0xc8, 0xbc, + 0xb4, 0xc1, 0xc1, 0x5a, 0xaf, 0x4e, 0x4e, 0x5a, 0x67, 0x55, 0x1e, 0xcc, + 0x16, 0xa0, 0xa0, 0x95, 0xa3, 0xa4, 0x9e, 0x81, 0x76, 0x75, 0x78, 0x7e, + 0x72, 0x73, 0x76, 0x98, 0xa1, 0x1e, 0xfb, 0x27, 0xfb, 0xaf, 0x51, 0xa, + 0xa6, 0x70, 0x5b, 0x8e, 0x21, 0xa, 0x7c, 0xed, 0x3f, 0x76, 0xf7, 0x53, + 0xe8, 0x40, 0xe6, 0xd5, 0xe9, 0x12, 0x89, 0xec, 0xf7, 0x29, 0xee, 0x13, + 0xae, 0xf7, 0xb9, 0xc5, 0x15, 0x52, 0xa6, 0xc6, 0x7b, 0xcc, 0x1b, 0xc0, + 0xc6, 0x99, 0xa0, 0xba, 0x1f, 0x6b, 0xe7, 0x5, 0x73, 0x4d, 0x62, 0x86, + 0x74, 0x1b, 0x37, 0x7d, 0xd1, 0xa0, 0x1f, 0x8e, 0xf7, 0x89, 0x7, 0x8d, + 0x9f, 0x8c, 0x9e, 0x9e, 0x1a, 0xf7, 0x11, 0x5d, 0xe9, 0xfb, 0xa, 0x5f, + 0x5b, 0x78, 0x68, 0x6e, 0x1e, 0x7f, 0xb0, 0x5b, 0x9a, 0x54, 0x8c, 0x48, + 0x8c, 0x3e, 0x78, 0x6e, 0x74, 0xa5, 0x39, 0x18, 0x9b, 0xb5, 0xc0, 0x99, + 0xb6, 0x1b, 0xbb, 0x97, 0x7a, 0x4d, 0x89, 0x1f, 0x13, 0x5e, 0x8d, 0x73, + 0x78, 0x8e, 0x66, 0x1b, 0xfb, 0xb, 0x5c, 0x31, 0x44, 0x3d, 0xc4, 0x4e, + 0xe1, 0xd3, 0xbb, 0xb9, 0xa5, 0xab, 0x1f, 0x13, 0xae, 0xbd, 0xf7, 0x68, + 0x15, 0xc8, 0x8f, 0xb3, 0xa8, 0xb5, 0x1b, 0xc4, 0x96, 0x47, 0x75, 0x8d, + 0x1f, 0xfb, 0x93, 0xfb, 0x1d, 0x15, 0x6e, 0x6f, 0x69, 0x73, 0x62, 0x1b, + 0x79, 0x6f, 0x98, 0xad, 0x1f, 0x13, 0x9e, 0xb0, 0xa3, 0xaa, 0xc3, 0x9e, + 0xa2, 0x88, 0x84, 0xa6, 0x1e, 0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x5b, 0xe7, + 0xf7, 0xa2, 0xe9, 0x12, 0xba, 0xec, 0xf7, 0x13, 0xf7, 0x21, 0x95, 0xeb, + 0x17, 0xf7, 0x80, 0xfb, 0x45, 0x15, 0x7a, 0xa0, 0xa6, 0x7f, 0xaa, 0x1b, + 0xcc, 0xab, 0xbe, 0xbd, 0xa6, 0x82, 0xb7, 0x5a, 0x97, 0x1f, 0x9d, 0x7, + 0xd5, 0x97, 0xd0, 0xad, 0xc2, 0xb7, 0x55, 0xd4, 0x18, 0x62, 0x51, 0x55, + 0x6a, 0x3c, 0x1b, 0x39, 0x3a, 0xb8, 0xe9, 0xdb, 0xca, 0xbe, 0xf3, 0xb2, + 0xb3, 0x8b, 0x7c, 0xab, 0x1f, 0x30, 0xeb, 0xf7, 0x5c, 0x2b, 0x82, 0x7, + 0x95, 0x68, 0x65, 0x8a, 0x65, 0x1b, 0xfb, 0x49, 0x38, 0xfb, 0x4, 0xfb, + 0x3, 0xfb, 0x21, 0xf7, 0x3, 0x39, 0xf7, 0x9, 0x81, 0x1f, 0x84, 0x2e, + 0x5, 0x8c, 0x95, 0xa0, 0x91, 0x9b, 0x1b, 0x97, 0x94, 0x85, 0x7c, 0x7d, + 0x80, 0x84, 0x7d, 0x7a, 0x77, 0x8f, 0x94, 0x82, 0x1f, 0xe, 0x55, 0xa, + 0xf7, 0x77, 0x77, 0x1, 0xf7, 0x1e, 0xf8, 0xc3, 0x15, 0xf7, 0xd2, 0x3f, + 0xa1, 0xc6, 0xfb, 0xbd, 0xf7, 0xb, 0x5, 0x5e, 0xfc, 0x7f, 0x24, 0xa, + 0x55, 0xa, 0xf7, 0x77, 0x77, 0x1, 0xf7, 0x4d, 0xf8, 0x76, 0x15, 0xf7, + 0xd3, 0xd7, 0x60, 0xf2, 0xfb, 0xbf, 0x6a, 0xa, 0x71, 0xfc, 0x7, 0x24, + 0xa, 0x55, 0xa, 0xf7, 0x73, 0x77, 0x1, 0xf7, 0x23, 0xf8, 0x73, 0x15, + 0xf7, 0x2c, 0xf2, 0xf7, 0x2c, 0x24, 0xc7, 0xad, 0xfb, 0x36, 0xf7, 0x24, + 0x5, 0x28, 0x6, 0xfb, 0x39, 0xfb, 0x23, 0x5, 0xc2, 0xfb, 0xec, 0x24, + 0xa, 0x55, 0xa, 0xcc, 0xf7, 0x12, 0x1, 0xf7, 0x24, 0xf7, 0x4, 0xd2, + 0xf7, 0x4, 0x3, 0xf7, 0xdb, 0xf8, 0x87, 0x72, 0xa, 0xfb, 0x4b, 0xfb, + 0x12, 0x72, 0xa, 0x83, 0xfc, 0x5b, 0x24, 0xa, 0x57, 0xa, 0xf7, 0x17, + 0xf8, 0xc2, 0x15, 0xf7, 0xd4, 0x40, 0xa3, 0xc5, 0xfb, 0xc1, 0xf7, 0xc, + 0x5, 0x2a, 0xfd, 0x29, 0x33, 0xa, 0x57, 0xa, 0xf7, 0x48, 0xf8, 0x77, + 0x15, 0xf7, 0xd2, 0xd6, 0x61, 0xf2, 0xfb, 0xc0, 0x6a, 0xa, 0x3c, 0xfc, + 0xb1, 0x33, 0xa, 0x8b, 0xe5, 0xf7, 0x84, 0xe6, 0xf7, 0x80, 0x77, 0x1, + 0xf7, 0x8d, 0xf1, 0x3, 0xd1, 0xf8, 0x98, 0x15, 0xcb, 0x67, 0xf7, 0x31, + 0xf1, 0xf7, 0x31, 0x25, 0xc9, 0xae, 0xfb, 0x3b, 0xf7, 0x22, 0x5, 0x24, + 0x6, 0xfb, 0x30, 0xfd, 0x25, 0x33, 0xa, 0x8b, 0xe6, 0xf7, 0x86, 0xe6, + 0xd7, 0xf7, 0x11, 0x12, 0xf7, 0x20, 0xf7, 0x4, 0x8a, 0xec, 0x72, 0xf7, + 0x5, 0x13, 0xf4, 0xf7, 0xd7, 0xf8, 0x88, 0x15, 0xf7, 0x5, 0xf7, 0x11, + 0xfb, 0x5, 0x6, 0xfb, 0x4b, 0xfb, 0x11, 0x15, 0xf7, 0x4, 0xf7, 0x11, + 0xfb, 0x4, 0x6, 0x4c, 0xfd, 0x5, 0x15, 0xf8, 0x52, 0xe6, 0x6, 0x13, + 0xe8, 0xfb, 0x43, 0xf7, 0xe1, 0xfb, 0x7e, 0x30, 0xf7, 0x1d, 0xfb, 0x86, + 0xfb, 0x42, 0x6, 0xe, 0x70, 0xe3, 0xf7, 0x96, 0xe4, 0xf7, 0x6e, 0x77, + 0x1, 0xc4, 0xe8, 0xf7, 0xc1, 0xe6, 0x3, 0xf7, 0x51, 0xf8, 0x48, 0x15, + 0xf7, 0x5, 0xc2, 0xd1, 0x62, 0xb7, 0x47, 0x8c, 0x87, 0x19, 0x9d, 0x6d, + 0x77, 0x97, 0x4c, 0x1b, 0xfb, 0x39, 0x39, 0xfb, 0x0, 0xfb, 0x3, 0xfb, + 0x0, 0xdd, 0xfb, 0x0, 0xf7, 0x37, 0xf7, 0x3a, 0xd5, 0xf7, 0x3, 0xf7, + 0x17, 0xf7, 0x44, 0xfb, 0xa, 0xf6, 0x59, 0xaa, 0x1f, 0xea, 0xb5, 0x6c, + 0xc1, 0xfb, 0x15, 0x4e, 0x6f, 0x9d, 0x3c, 0xb0, 0x63, 0x92, 0x19, 0x70, + 0x4f, 0xad, 0x83, 0xad, 0x7b, 0xab, 0x7d, 0x19, 0x3b, 0x65, 0x5, 0x86, + 0xfb, 0xc2, 0x15, 0xe7, 0xdb, 0xb2, 0xd1, 0xf5, 0xb8, 0x49, 0x4c, 0x30, + 0x3d, 0x65, 0x45, 0x40, 0x3d, 0xb0, 0xe5, 0x1e, 0xe, 0x8b, 0xe7, 0xf7, + 0x97, 0xe5, 0x31, 0xe7, 0xf7, 0x55, 0x77, 0x12, 0x98, 0xf7, 0x46, 0x2b, + 0xeb, 0xf7, 0x72, 0xeb, 0x13, 0xda, 0xe8, 0xf8, 0x95, 0x15, 0xe1, 0x71, + 0x96, 0x9f, 0x93, 0xad, 0xa1, 0x8d, 0x19, 0xa1, 0x8d, 0xa4, 0x82, 0xb1, + 0x77, 0x8, 0x7e, 0xa4, 0xa8, 0x7e, 0xac, 0x1b, 0xf0, 0xab, 0xe3, 0xad, + 0x97, 0x1f, 0x35, 0xa3, 0x5, 0x62, 0x79, 0x81, 0x76, 0x6e, 0x1b, 0x79, + 0x77, 0x94, 0x96, 0x77, 0x1f, 0x9c, 0x6b, 0x6a, 0xa2, 0x6a, 0x1b, 0x2a, + 0x6d, 0x3d, 0x60, 0x79, 0x1f, 0x3c, 0xfc, 0x95, 0x15, 0xf7, 0x95, 0xe7, + 0x3b, 0xf7, 0x56, 0x6, 0xb6, 0xbd, 0xce, 0xa1, 0xa9, 0x1b, 0xd0, 0x91, + 0x6c, 0x64, 0x1f, 0xfb, 0x51, 0x3d, 0x2f, 0xf7, 0x90, 0xe7, 0x3d, 0xf7, + 0x66, 0x7, 0xe6, 0x43, 0xbb, 0x31, 0x53, 0x51, 0x70, 0x70, 0x61, 0x1e, + 0x13, 0xba, 0xc3, 0xfb, 0x46, 0x2f, 0x7, 0x13, 0xb6, 0xdd, 0xfb, 0x97, + 0x3a, 0x6, 0xe, 0x7b, 0xe7, 0xf7, 0xa0, 0xe7, 0xf7, 0x75, 0x77, 0x4b, + 0xa, 0xf7, 0x24, 0xf8, 0xc1, 0x15, 0xf7, 0xda, 0x40, 0xa2, 0xc5, 0xfb, + 0xc7, 0xf7, 0xd, 0x5, 0xfb, 0x30, 0xfc, 0x5a, 0x23, 0xa, 0x62, 0xa, + 0xf7, 0x75, 0x77, 0x4b, 0xa, 0xf7, 0x53, 0xf8, 0x76, 0x15, 0xf7, 0xda, + 0xd6, 0x61, 0xf3, 0xfb, 0xc7, 0xfb, 0xd, 0x5, 0xfb, 0x1e, 0xfb, 0xe1, + 0x23, 0xa, 0x62, 0xa, 0xf7, 0x71, 0x77, 0x4b, 0xa, 0xf7, 0x2a, 0xf8, + 0x72, 0x15, 0xf7, 0x30, 0xf3, 0xf7, 0x2f, 0x23, 0xc7, 0xad, 0xfb, 0x38, + 0xf7, 0x25, 0x5, 0x24, 0x6, 0xfb, 0x3b, 0xfb, 0x23, 0x5, 0x52, 0xfb, + 0xc7, 0x23, 0xa, 0x62, 0xa, 0xf7, 0x5, 0xe0, 0x8d, 0x77, 0x12, 0xa9, + 0xef, 0xf7, 0xe9, 0xee, 0x13, 0xec, 0xe3, 0xf8, 0x94, 0x15, 0xe4, 0x71, + 0x5, 0xa5, 0x96, 0x98, 0xb0, 0xae, 0x1b, 0x9f, 0xa0, 0x7e, 0x7d, 0xa3, + 0x1f, 0x7b, 0xa7, 0xa9, 0x7a, 0xb0, 0x1b, 0xf5, 0xac, 0xe4, 0xad, 0x95, + 0x1f, 0x13, 0xdc, 0x33, 0xa3, 0x5, 0x62, 0x79, 0x81, 0x76, 0x6d, 0x1b, + 0x74, 0x71, 0x99, 0x9a, 0x70, 0x1f, 0x13, 0xec, 0x9a, 0x6f, 0x6e, 0x9b, + 0x6f, 0x1b, 0x26, 0x6b, 0x3d, 0x5f, 0x7a, 0x1f, 0x51, 0xfb, 0xc5, 0x23, + 0xa, 0x62, 0xa, 0xca, 0xf7, 0x12, 0x1, 0xa9, 0xef, 0xa0, 0xf7, 0x6, + 0xd5, 0xf7, 0x6, 0x9d, 0xee, 0x3, 0xf7, 0xe7, 0xf8, 0x87, 0x70, 0xa, + 0xfb, 0x50, 0xfb, 0x12, 0x70, 0xa, 0xfb, 0xd, 0xfc, 0x36, 0x23, 0xa, + 0x9b, 0xf7, 0x1d, 0xbd, 0xf7, 0x2, 0xbd, 0xf7, 0x1d, 0x1, 0xf7, 0x79, + 0xf7, 0x28, 0x14, 0xe0, 0x5c, 0xa, 0xf7, 0x32, 0xf7, 0xa, 0x15, 0x49, + 0xa, 0xfb, 0xef, 0x4, 0x49, 0xa, 0xe, 0x7a, 0xe9, 0x3b, 0x76, 0xf8, + 0x1c, 0xea, 0x12, 0xa9, 0xed, 0xf7, 0xed, 0xec, 0x13, 0x78, 0xb2, 0xa9, + 0x15, 0x8d, 0xc1, 0x56, 0x8a, 0x8d, 0x1f, 0x8b, 0xa1, 0x9e, 0xaa, 0xa7, + 0x1e, 0x13, 0xb8, 0x72, 0xb6, 0xbe, 0x7c, 0xc3, 0x1b, 0xf7, 0x29, 0xf7, + 0xd, 0xf6, 0xf7, 0x18, 0xc0, 0x77, 0xbd, 0x69, 0xb3, 0x1f, 0xa7, 0xa6, + 0x9b, 0x9c, 0x8b, 0x8b, 0x53, 0xbf, 0x8a, 0x1a, 0x8b, 0x77, 0x7f, 0x6c, + 0x6e, 0x1e, 0xa6, 0x60, 0x56, 0x9c, 0x52, 0x1b, 0xfb, 0x29, 0xfb, 0xd, + 0xfb, 0x1, 0xfb, 0x18, 0x53, 0xa0, 0x59, 0xaf, 0x62, 0x1f, 0x6d, 0x6f, + 0x79, 0x7a, 0x8b, 0x1a, 0xf7, 0xa, 0xf7, 0x3, 0x15, 0x78, 0xa2, 0x81, + 0xa6, 0xa9, 0x1a, 0xdb, 0xd8, 0xce, 0xea, 0xa7, 0xa7, 0x83, 0x81, 0xa3, + 0x1e, 0x45, 0x4a, 0x36, 0x3b, 0x47, 0x4b, 0x8, 0xcd, 0x5a, 0x15, 0xd0, + 0xcb, 0xe1, 0xdb, 0xce, 0xca, 0x8, 0x9d, 0x75, 0x95, 0x70, 0x6e, 0x1a, + 0x3b, 0x3d, 0x4b, 0x2c, 0x6f, 0x71, 0x90, 0x95, 0x74, 0x1e, 0xe, 0x3c, + 0xa, 0xf7, 0x17, 0xf8, 0xc3, 0x15, 0xf7, 0xcc, 0x3d, 0xa2, 0xc7, 0xfb, + 0xbc, 0xf7, 0xc, 0x5, 0xfb, 0x2f, 0xfb, 0xde, 0x28, 0xa, 0x3c, 0xa, + 0xf7, 0x43, 0xf8, 0x76, 0x15, 0xf7, 0xcf, 0xd7, 0x62, 0xf2, 0xfb, 0xbd, + 0x6a, 0xa, 0xfb, 0x1d, 0xfb, 0x66, 0x28, 0xa, 0x4a, 0xa, 0xf7, 0x7f, + 0x36, 0xa, 0xf7, 0x1d, 0xf8, 0x71, 0x15, 0xf7, 0x2a, 0xf4, 0xf7, 0x29, + 0x22, 0xc6, 0xae, 0xfb, 0x34, 0xf7, 0x25, 0x5, 0x2b, 0x6, 0xfb, 0x37, + 0xfb, 0x24, 0x5, 0x4e, 0xfb, 0x4a, 0x28, 0xa, 0x4a, 0xa, 0xd9, 0xf7, + 0x11, 0x12, 0x9a, 0xf7, 0x42, 0x2e, 0xe8, 0x5a, 0xf7, 0x2, 0xd0, 0xf7, + 0x2, 0x29, 0xf7, 0x41, 0x2d, 0xe9, 0x2d, 0xf7, 0x43, 0x13, 0xb3, 0x0, + 0xf7, 0xd3, 0xf8, 0x88, 0x6f, 0xa, 0xfb, 0x47, 0xfb, 0x11, 0x6f, 0xa, + 0x13, 0xb9, 0x0, 0xfb, 0x11, 0xfb, 0xba, 0x15, 0x13, 0xb4, 0x40, 0x2e, + 0xa, 0x13, 0x78, 0x20, 0x64, 0xf7, 0x43, 0xe6, 0x7, 0x13, 0x78, 0x80, + 0x3a, 0xf7, 0xe1, 0xfb, 0x41, 0x30, 0x6, 0x13, 0xb8, 0x40, 0x2c, 0xa, + 0xfb, 0x22, 0xe2, 0xf8, 0x26, 0xe2, 0xf7, 0x77, 0x77, 0x1, 0xf7, 0x59, + 0xf8, 0x7f, 0x15, 0xf7, 0xcf, 0xd2, 0x62, 0xee, 0xfb, 0xbe, 0xfb, 0x7, + 0x5, 0xfb, 0x19, 0xfc, 0xed, 0x15, 0x34, 0xf7, 0xc9, 0xe2, 0x33, 0x3a, + 0xa, 0xfb, 0xa7, 0x35, 0xfb, 0x13, 0x5, 0xe, 0xfb, 0x22, 0xe4, 0xe0, + 0xe3, 0xf7, 0x9a, 0xe4, 0xcd, 0xe4, 0x12, 0x93, 0xf7, 0x49, 0x29, 0xed, + 0xf7, 0xc4, 0xee, 0x13, 0xfa, 0x93, 0x56, 0x15, 0x32, 0xf7, 0xe1, 0xe4, + 0xfb, 0x2c, 0xf7, 0x18, 0x7, 0x7d, 0xa1, 0xc3, 0x6a, 0xde, 0x1b, 0xf7, + 0x21, 0xf0, 0xee, 0xf7, 0x10, 0xf7, 0x2b, 0xfb, 0x23, 0xcc, 0x24, 0x51, + 0x51, 0x7b, 0x6d, 0x62, 0x1f, 0xf7, 0x5d, 0xfb, 0x49, 0x32, 0x7, 0x13, + 0xf6, 0xde, 0xfc, 0xe2, 0x6, 0x13, 0xfa, 0xe9, 0xf7, 0xc6, 0x15, 0xf7, + 0x2, 0xf7, 0x9, 0x9e, 0xb4, 0xdb, 0xd1, 0x5d, 0x38, 0x3b, 0x43, 0x56, + 0x3c, 0x5c, 0xfb, 0x2, 0xa5, 0xf6, 0x1e, 0xe, 0xfb, 0x22, 0xe1, 0xf8, + 0x26, 0xe2, 0xd3, 0xf7, 0xc, 0x1, 0xf7, 0x31, 0xf7, 0x3, 0xd2, 0xf7, + 0x3, 0x3, 0xf7, 0xe7, 0xf8, 0x8d, 0x15, 0xf7, 0x3, 0xf7, 0xc, 0x6b, + 0xa, 0xfb, 0x4a, 0xfb, 0xc, 0x15, 0xf7, 0x3, 0xf7, 0xc, 0x6b, 0xa, + 0xfb, 0x9, 0xfd, 0x3d, 0x15, 0x35, 0xf7, 0xbf, 0xe1, 0x3d, 0x3a, 0xa, + 0xfb, 0xa5, 0x35, 0xfb, 0x15, 0x5, 0xe, 0x8b, 0xe6, 0xf7, 0xf2, 0xe6, + 0x4e, 0xe6, 0xb6, 0xf7, 0x23, 0x12, 0xf7, 0x8f, 0xf0, 0x13, 0xb8, 0x66, + 0xa, 0xe6, 0xfb, 0x3f, 0x6, 0x13, 0xd8, 0xf7, 0xf2, 0x74, 0xa, 0xfb, + 0xf2, 0xfb, 0x42, 0x7, 0xf7, 0x3d, 0xf8, 0x96, 0x79, 0xa, 0x6b, 0xa, + 0xe, 0x7c, 0xa, 0x40, 0xa, 0xf7, 0xed, 0xfb, 0x7f, 0x2d, 0xf7, 0x1c, + 0xfb, 0x8f, 0xfb, 0x41, 0x6, 0xe, 0x79, 0xe6, 0xf8, 0x22, 0xe6, 0x1, + 0xcb, 0xf0, 0xf3, 0xed, 0xf0, 0xeb, 0x3, 0x7c, 0x79, 0x15, 0xf7, 0x99, + 0xe6, 0x3a, 0xf8, 0x22, 0xd9, 0xe6, 0xfb, 0x95, 0x30, 0xd9, 0xfc, 0x22, + 0x3c, 0x6, 0xf7, 0xb0, 0x74, 0x15, 0x78, 0x9e, 0xa2, 0x5a, 0xf5, 0x1b, + 0xf7, 0x12, 0xa0, 0xd5, 0xf7, 0x1f, 0x1f, 0xf7, 0xa7, 0xbe, 0xe7, 0xfb, + 0x9a, 0x2f, 0xf7, 0x7, 0xfb, 0xa8, 0x7, 0x49, 0x8a, 0x53, 0x56, 0x5b, + 0x8c, 0x78, 0xa, 0xfb, 0x23, 0xe4, 0x32, 0xea, 0xf8, 0x31, 0xe6, 0x80, + 0x77, 0xe4, 0xf7, 0x24, 0x12, 0xae, 0xf7, 0x25, 0xfb, 0x3, 0xf7, 0x3, + 0x29, 0xed, 0xf7, 0x9f, 0xf7, 0xa, 0x13, 0xac, 0x80, 0xd0, 0xf8, 0x97, + 0x79, 0xa, 0x6, 0x13, 0x5a, 0x80, 0x6b, 0xa, 0x56, 0xfd, 0x56, 0x15, + 0x2c, 0xf7, 0x77, 0xea, 0x4c, 0xf8, 0x81, 0x7, 0x13, 0x9c, 0x80, 0xfb, + 0x25, 0x2b, 0x6, 0x13, 0x69, 0x80, 0xba, 0xfc, 0x21, 0x6, 0xf8, 0x1, + 0xf8, 0xc6, 0x73, 0xa, 0xfb, 0x24, 0xfd, 0x49, 0x15, 0x73, 0x30, 0x5, + 0x87, 0xa9, 0x9a, 0x7b, 0xc8, 0x1b, 0xf7, 0x63, 0x82, 0xf7, 0x1b, 0xc6, + 0x1f, 0xf8, 0x2c, 0xfb, 0x80, 0x30, 0xf7, 0x18, 0xfb, 0xcd, 0x7, 0x46, + 0x81, 0x66, 0x3b, 0x64, 0x7d, 0x94, 0x95, 0x6a, 0x1e, 0xe, 0x32, 0xa, + 0xf7, 0x17, 0xed, 0xf7, 0x85, 0xee, 0x3, 0xa9, 0x16, 0xf8, 0xaf, 0xf7, + 0x9c, 0x28, 0xfb, 0x41, 0xfb, 0x85, 0xf7, 0x2e, 0x6, 0xf7, 0x36, 0xbb, + 0x5, 0xc9, 0x7, 0xfb, 0x36, 0x5d, 0x5, 0xf7, 0x36, 0xf7, 0x13, 0xe6, + 0xfb, 0xda, 0x30, 0xf0, 0xfb, 0x50, 0x7, 0x36, 0x73, 0x5, 0x4c, 0x7, + 0xe0, 0xa1, 0x5, 0xfb, 0x13, 0x26, 0x7, 0xe, 0x8b, 0xe9, 0xf8, 0x4a, + 0x40, 0xa, 0xf7, 0x68, 0x6, 0xf7, 0x12, 0xaf, 0x5, 0xcd, 0x7, 0xfb, + 0x12, 0x67, 0x5, 0xf7, 0x92, 0xfb, 0x9e, 0x2d, 0xf7, 0x3b, 0xfb, 0x4f, + 0x7, 0xfb, 0x9, 0x69, 0x5, 0x4b, 0x7, 0xf7, 0x9, 0xab, 0x5, 0xfb, + 0x4d, 0xfb, 0x41, 0x7, 0xe, 0x8b, 0xe6, 0x30, 0xf7, 0x3e, 0xa0, 0xf7, + 0x4f, 0x94, 0xf7, 0x43, 0x30, 0xe6, 0x12, 0x81, 0xe9, 0xf7, 0x6f, 0xea, + 0xaf, 0xd6, 0xa5, 0xd6, 0x13, 0xaf, 0x80, 0xf8, 0x22, 0xe6, 0x15, 0xf7, + 0x2b, 0xaf, 0x58, 0xd6, 0xf7, 0x4f, 0x40, 0x5d, 0x67, 0xf7, 0x1f, 0xf7, + 0x1d, 0x7, 0x13, 0xb7, 0x80, 0x37, 0xd6, 0xf7, 0x43, 0xfc, 0x16, 0x7, + 0xfb, 0xe, 0xfb, 0x4, 0xfb, 0x7, 0xfb, 0x43, 0xfb, 0x43, 0xf7, 0x5, + 0x2a, 0xf2, 0x1f, 0xf8, 0x28, 0x6, 0x13, 0x77, 0x80, 0xf7, 0x3e, 0x40, + 0x7, 0x13, 0xaf, 0x80, 0x3c, 0x7, 0xfb, 0x7c, 0xbc, 0x15, 0x5c, 0x5d, + 0x89, 0x79, 0x23, 0x58, 0xd3, 0xf7, 0x1, 0xf7, 0xf, 0xd2, 0xd7, 0xe8, + 0x9b, 0xb2, 0x8a, 0x66, 0x1e, 0xe, 0x7c, 0xe9, 0xec, 0xea, 0xe3, 0xea, + 0x1, 0x7d, 0xed, 0xf7, 0x3a, 0xed, 0x3, 0xf7, 0xf5, 0xf7, 0x44, 0x15, + 0xf7, 0x8f, 0x6, 0xf7, 0xf, 0x9d, 0x61, 0xf7, 0x2f, 0xfb, 0x23, 0x1b, + 0x5c, 0x60, 0x78, 0x68, 0x6a, 0x1f, 0xb1, 0x6a, 0x58, 0x9b, 0x57, 0x1b, + 0xfb, 0x18, 0x4f, 0x22, 0xfb, 0x1c, 0x49, 0x9b, 0xfb, 0x36, 0xf7, 0x39, + 0xd1, 0xba, 0xb8, 0xa2, 0x9d, 0x1f, 0x6a, 0xaa, 0xa8, 0x68, 0xe5, 0x1b, + 0xc4, 0xbe, 0x9a, 0xa0, 0xc2, 0x1f, 0x73, 0xe6, 0x5, 0x73, 0x4d, 0x53, + 0x82, 0x74, 0x1b, 0x38, 0x7d, 0xd6, 0x9f, 0x1f, 0x86, 0xec, 0x15, 0xb3, + 0x8f, 0xa7, 0xbb, 0xc1, 0x1b, 0xcf, 0x93, 0x48, 0x76, 0x8c, 0x1f, 0xfc, + 0x3f, 0x51, 0x15, 0xab, 0x8b, 0xf7, 0x6, 0xe6, 0xd3, 0x8e, 0xfb, 0x2, + 0x67, 0x67, 0x87, 0x29, 0x3a, 0x47, 0x7e, 0xef, 0xad, 0x1e, 0xe, 0xfb, + 0x4d, 0x76, 0xf7, 0x7d, 0xf4, 0xf7, 0xc, 0xf1, 0xf7, 0xa, 0xf7, 0x2, + 0x12, 0xba, 0xf7, 0x0, 0x30, 0xf1, 0xd9, 0xf7, 0x2e, 0xa5, 0xf6, 0x39, + 0xf3, 0x13, 0xfa, 0x80, 0xba, 0xa6, 0x15, 0xf7, 0x0, 0xb9, 0x6, 0xa6, + 0x80, 0xa9, 0x7e, 0xab, 0x82, 0x8, 0xfb, 0x13, 0x7, 0x8d, 0x95, 0x9c, + 0x92, 0x9d, 0x1b, 0x9d, 0x95, 0x81, 0x78, 0x7c, 0x7e, 0x7e, 0x7d, 0x8a, + 0x1f, 0x74, 0x89, 0x78, 0x93, 0x81, 0x94, 0x6e, 0x55, 0x18, 0x79, 0xa1, + 0xa9, 0x7e, 0xac, 0x1b, 0xd0, 0xae, 0xc2, 0xc0, 0xa8, 0x81, 0xbb, 0x57, + 0x97, 0x1f, 0x8c, 0xaf, 0x5, 0xf7, 0xc, 0x90, 0xeb, 0xcd, 0xf2, 0x1a, + 0xf7, 0x11, 0xfb, 0xc, 0xaa, 0x2f, 0x88, 0x1e, 0x13, 0xf7, 0x0, 0x28, + 0x92, 0x3f, 0x93, 0xb7, 0x1a, 0xbf, 0xed, 0x92, 0xa3, 0xb9, 0xbf, 0x73, + 0x75, 0xb1, 0x1e, 0x54, 0xf6, 0xf7, 0x67, 0x20, 0x63, 0x7, 0x9b, 0x62, + 0x55, 0xa3, 0x59, 0x1b, 0x27, 0xfb, 0x7, 0x5d, 0xfb, 0xd, 0xfb, 0x25, + 0xf7, 0x35, 0x7f, 0xdb, 0x85, 0x1f, 0x13, 0xfa, 0x80, 0xb3, 0x88, 0xf3, + 0x98, 0x4e, 0x1a, 0x62, 0x43, 0x6f, 0x4f, 0x3e, 0x52, 0xb3, 0x96, 0x6f, + 0x1e, 0xd2, 0xfb, 0x0, 0x7, 0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x59, 0xe3, + 0xf1, 0xe1, 0x99, 0xf7, 0x46, 0x2e, 0xe8, 0x12, 0xcd, 0xef, 0x35, 0xe1, + 0x35, 0xea, 0xd3, 0xf7, 0x23, 0xa3, 0xee, 0x3f, 0xeb, 0x13, 0xf4, 0xa0, + 0xcd, 0x82, 0x15, 0xef, 0xb1, 0x6, 0xa4, 0x82, 0xa6, 0x80, 0xa8, 0x84, + 0x8, 0xfb, 0x0, 0x7, 0x8d, 0x95, 0x9a, 0x91, 0x9b, 0x1b, 0x9d, 0x93, + 0x82, 0x7c, 0x7e, 0x80, 0x80, 0x7d, 0x8a, 0x1f, 0x76, 0x89, 0x7a, 0x92, + 0x81, 0x93, 0x71, 0x5d, 0x18, 0x7c, 0x9f, 0xa7, 0x80, 0xa9, 0x1b, 0xcc, + 0xab, 0xb9, 0xb8, 0xa3, 0x82, 0xb4, 0x5b, 0x95, 0x1f, 0x8c, 0xaa, 0x5, + 0xf7, 0x2, 0x90, 0xe4, 0xc2, 0xe1, 0x1a, 0xf5, 0xfb, 0x3, 0xa6, 0x36, + 0x88, 0x1e, 0x13, 0xe9, 0xc0, 0x2f, 0x91, 0x45, 0x92, 0xaf, 0x1a, 0xb8, + 0xe5, 0x90, 0xa2, 0xb6, 0xbb, 0x77, 0x79, 0xae, 0x1e, 0x13, 0xf2, 0xc0, + 0x5c, 0xee, 0xf7, 0x46, 0x28, 0x69, 0x7, 0x99, 0x65, 0x59, 0x9f, 0x5d, + 0x1b, 0x2e, 0x20, 0x64, 0x24, 0xfb, 0xe, 0xf7, 0x2a, 0x82, 0xd5, 0x86, + 0x1f, 0x13, 0xf4, 0xa0, 0xaf, 0x88, 0xec, 0x95, 0x58, 0x1a, 0x69, 0x48, + 0x73, 0x53, 0x44, 0x58, 0xae, 0x94, 0x71, 0x1e, 0x13, 0xf4, 0xc0, 0xc7, + 0x27, 0x7, 0xe, 0x75, 0xe6, 0x8b, 0xf7, 0x27, 0xf7, 0x97, 0xe6, 0x8b, + 0xb6, 0x6d, 0xb6, 0xf7, 0x3c, 0x77, 0x12, 0xba, 0xf1, 0x36, 0xe0, 0x36, + 0xf2, 0xf7, 0x99, 0xf1, 0x3d, 0xf0, 0x13, 0xed, 0x20, 0xba, 0x75, 0x15, + 0xf1, 0xae, 0x6, 0x82, 0xa1, 0xbc, 0x71, 0xdc, 0x1b, 0xf7, 0x1d, 0xf7, + 0x7, 0xcc, 0xf7, 0x0, 0xe7, 0x3e, 0xb5, 0x3a, 0x98, 0x1f, 0x13, 0xf4, + 0xc0, 0x53, 0x93, 0xfb, 0x40, 0x7e, 0xe7, 0x1a, 0xb5, 0xbc, 0xbb, 0xe6, + 0xb6, 0xb5, 0x7f, 0x7c, 0xaf, 0x1e, 0x22, 0xf1, 0xf7, 0x73, 0x25, 0x73, + 0x7, 0x9a, 0x67, 0x5f, 0x94, 0x5e, 0x1b, 0xfb, 0x32, 0x3a, 0x26, 0x3b, + 0xfb, 0x2e, 0xf7, 0x48, 0x85, 0xf7, 0xa, 0x82, 0x1f, 0x13, 0xed, 0x20, + 0xc3, 0x87, 0xad, 0x79, 0x60, 0x1a, 0x5b, 0x60, 0x69, 0xfb, 0x0, 0x54, + 0x57, 0x9a, 0xa4, 0x5e, 0x1e, 0xde, 0x7, 0x13, 0xee, 0x40, 0x25, 0x6, + 0x13, 0xf5, 0x40, 0xf7, 0x62, 0xf8, 0x35, 0x15, 0xf5, 0x6, 0xf7, 0x3e, + 0xf7, 0x24, 0x4c, 0xaf, 0xfb, 0x35, 0x24, 0xfb, 0x31, 0xf3, 0x49, 0x69, + 0x5, 0xe, 0x7a, 0xe1, 0xed, 0xdf, 0x8b, 0xeb, 0x3a, 0xf7, 0x41, 0x2f, + 0xe7, 0x7d, 0xb9, 0x12, 0xcd, 0xed, 0x37, 0xdf, 0x37, 0xea, 0xf7, 0x83, + 0xee, 0x40, 0xea, 0x13, 0xe6, 0x20, 0xf7, 0x99, 0xf8, 0x79, 0x15, 0xf0, + 0x6, 0xf7, 0x38, 0xf7, 0x25, 0x4d, 0xb0, 0xfb, 0x2e, 0x22, 0xfb, 0x2e, + 0xf4, 0x4c, 0x67, 0x5, 0x70, 0xfd, 0x1c, 0x15, 0xed, 0xb1, 0x6, 0x7b, + 0xb9, 0xc3, 0x75, 0xc0, 0x1b, 0xf7, 0xb, 0xea, 0xc2, 0xe2, 0xf2, 0xfb, + 0x3, 0xa5, 0x36, 0x88, 0x1f, 0x13, 0xe4, 0xc0, 0x30, 0x92, 0x44, 0x91, + 0xaf, 0x1a, 0x13, 0xea, 0x40, 0xb5, 0xe6, 0x90, 0xa1, 0xb6, 0xba, 0x78, + 0x7a, 0xaf, 0x1e, 0x13, 0xd1, 0x40, 0x5e, 0xee, 0xf7, 0x41, 0x28, 0x6a, + 0x7, 0x99, 0x64, 0x5a, 0x9e, 0x5d, 0x1b, 0x2e, 0x20, 0x65, 0x28, 0xfb, + 0xc, 0xf7, 0x2a, 0x82, 0xd5, 0x85, 0x1f, 0x13, 0xe6, 0x20, 0xaf, 0x88, + 0xed, 0x96, 0x59, 0x1a, 0x6a, 0x47, 0x74, 0x53, 0x45, 0x56, 0xab, 0x94, + 0x70, 0x1e, 0xc6, 0x29, 0x7, 0xe, 0x8b, 0xe3, 0xf8, 0x1b, 0xe8, 0xe3, + 0xf7, 0x15, 0x12, 0x99, 0xf7, 0x80, 0x2b, 0xf7, 0x4, 0xd1, 0xf7, 0x4, + 0x28, 0xf7, 0x80, 0x13, 0xec, 0xf7, 0x13, 0x16, 0xf7, 0xe9, 0xe8, 0xfb, + 0xe, 0xf7, 0x14, 0x6, 0xf7, 0x34, 0xf7, 0x96, 0x5, 0x13, 0xea, 0xda, + 0xe8, 0xfb, 0x80, 0x2e, 0xc3, 0x6, 0x22, 0xfb, 0x3d, 0x23, 0xf7, 0x3d, + 0x5, 0x13, 0xf4, 0xc1, 0xe8, 0xfb, 0x80, 0x2e, 0xd8, 0x6, 0xf7, 0x34, + 0xfb, 0x96, 0x5, 0xfb, 0x14, 0xfb, 0x10, 0x7, 0xf7, 0x62, 0xf8, 0xcb, + 0x15, 0xf7, 0x1, 0xf7, 0x15, 0xfb, 0x1, 0x6, 0xfb, 0x48, 0xfb, 0x15, + 0x15, 0xf7, 0x2, 0xf7, 0x15, 0xfb, 0x2, 0x6, 0xe, 0x8b, 0xe6, 0xf8, + 0xc, 0xe5, 0x8b, 0xc1, 0xf7, 0x47, 0x77, 0x12, 0xcd, 0xed, 0xf7, 0xa8, + 0xed, 0x17, 0xc8, 0x16, 0xf8, 0x71, 0xf7, 0x6e, 0x29, 0xfb, 0x13, 0xfb, + 0x8a, 0x6, 0xf7, 0xd5, 0xf8, 0x26, 0x5, 0x13, 0x78, 0xcb, 0xfc, 0x55, + 0xfb, 0x5f, 0xed, 0xf7, 0x5, 0xf7, 0x6d, 0x7, 0xfb, 0xd4, 0xfc, 0x22, + 0x5, 0xf7, 0x4f, 0xf8, 0xb2, 0x15, 0xf0, 0x6, 0xf7, 0x36, 0xf7, 0x22, + 0x51, 0xaf, 0xfb, 0x30, 0x25, 0xfb, 0x2b, 0xf2, 0x4d, 0x69, 0x5, 0xe, + 0x8b, 0xe7, 0xf7, 0x2f, 0xf7, 0x43, 0x30, 0xe6, 0x8b, 0xc8, 0xf7, 0x4c, + 0x77, 0x12, 0xe9, 0xee, 0xf7, 0x79, 0xec, 0x13, 0xde, 0xf7, 0x94, 0xf8, + 0x77, 0x15, 0xf0, 0x6, 0xf7, 0x36, 0xf7, 0x26, 0x4e, 0xb1, 0xfb, 0x2c, + 0x21, 0xfb, 0x2e, 0xf5, 0x4c, 0x66, 0x5, 0x82, 0xfd, 0xa, 0x15, 0xf8, + 0x4b, 0xf7, 0x4e, 0x2a, 0x2d, 0xfb, 0x51, 0x6, 0xf7, 0xb2, 0xf7, 0x9c, + 0x5, 0xcd, 0xfc, 0x3d, 0xfb, 0x43, 0xee, 0x7, 0x13, 0xbe, 0xdf, 0xf7, + 0x40, 0x7, 0xfb, 0xb1, 0xfb, 0x98, 0x5, 0xe, 0xfb, 0x17, 0xe9, 0xf8, + 0x9, 0xe8, 0xeb, 0xe6, 0x1, 0xa4, 0x6c, 0x15, 0x71, 0x2f, 0x5, 0x87, + 0xb1, 0xab, 0x87, 0xb7, 0x1b, 0xdd, 0xde, 0xa9, 0xf2, 0x9f, 0x1f, 0xd1, + 0xf7, 0xe2, 0x5, 0xf6, 0x6, 0x9d, 0xe8, 0x5, 0xfb, 0x1, 0x6, 0xe5, + 0x93, 0xad, 0x91, 0xd7, 0x1b, 0xab, 0xaa, 0x87, 0x89, 0x9f, 0x1f, 0x9b, + 0xe5, 0x5, 0x8d, 0x68, 0x67, 0x90, 0x66, 0x1b, 0xfb, 0x10, 0x8a, 0x4b, + 0x5f, 0x7b, 0xfb, 0x22, 0x8, 0x25, 0x6, 0x78, 0x2e, 0x5, 0xf3, 0x6, + 0x4f, 0xfb, 0xae, 0x5, 0x3d, 0x7d, 0x79, 0x7e, 0x51, 0x1b, 0x73, 0x5a, + 0x8f, 0x8d, 0x73, 0x1f, 0xe, 0x79, 0xe9, 0x8b, 0xf1, 0x8b, 0xea, 0x8b, + 0xd1, 0xf7, 0x26, 0xe6, 0x8b, 0xaf, 0xf7, 0x42, 0x77, 0x12, 0x99, 0xed, + 0xf7, 0xdd, 0xea, 0x35, 0xed, 0x13, 0xff, 0x80, 0x46, 0xa, 0xd0, 0xf7, + 0x17, 0xf7, 0x21, 0xe6, 0xd3, 0xed, 0x1f, 0x13, 0xff, 0x40, 0x41, 0xa, + 0xfb, 0xf, 0xfb, 0x4d, 0xfb, 0x62, 0xf7, 0x33, 0x37, 0xf7, 0x36, 0x1f, + 0x13, 0xff, 0x80, 0x58, 0xa, 0x64, 0xf7, 0xeb, 0x15, 0xe7, 0x6, 0xf7, + 0x29, 0xf7, 0x1e, 0x5, 0x13, 0xff, 0x40, 0x3e, 0xa, 0xfb, 0x26, 0xe4, + 0xed, 0xe3, 0x3d, 0xe3, 0xf7, 0x6b, 0xe4, 0x3e, 0xe3, 0x8b, 0xb2, 0xf7, + 0x42, 0x77, 0x69, 0xa, 0x13, 0xd7, 0x80, 0x50, 0xa, 0xf3, 0xf2, 0x1f, + 0xf7, 0xb9, 0x7, 0x13, 0xd7, 0x40, 0xd7, 0xe4, 0xfb, 0x3c, 0x6e, 0x6, + 0x13, 0xcf, 0x80, 0x5a, 0xa, 0x1f, 0x13, 0xaf, 0x80, 0xfb, 0x9, 0xee, + 0x3c, 0xf7, 0x21, 0xc0, 0xbe, 0x98, 0xa7, 0xb1, 0x1e, 0x67, 0x7, 0x51, + 0x88, 0x54, 0x42, 0xa, 0x69, 0x33, 0x43, 0x44, 0xb1, 0xd2, 0x1e, 0xf7, + 0x1d, 0xf7, 0x89, 0x43, 0xa, 0xf8, 0x8c, 0x76, 0xf7, 0x42, 0x77, 0x1, + 0xf7, 0x35, 0xf8, 0x77, 0x15, 0xf7, 0x20, 0xf7, 0x2, 0xf7, 0x20, 0xfb, + 0x2, 0xc3, 0xac, 0xfb, 0x29, 0xf7, 0x21, 0x5, 0x2e, 0x6, 0xfb, 0x2c, + 0xfb, 0x20, 0x5, 0xe, 0xf8, 0x96, 0x76, 0xf7, 0x42, 0x77, 0x1, 0xf7, + 0x94, 0xf8, 0x81, 0x43, 0xa, 0xf8, 0x68, 0xde, 0x38, 0xf7, 0x37, 0x12, + 0x13, 0x40, 0xde, 0xf9, 0xb, 0x15, 0x43, 0x98, 0xcb, 0x30, 0xf7, 0x21, + 0x1b, 0xf7, 0x32, 0xbd, 0xf7, 0x4, 0xbe, 0x93, 0x1f, 0x2e, 0x6, 0x13, + 0x80, 0x63, 0x7a, 0x70, 0x63, 0x3c, 0x1b, 0x13, 0x40, 0x3d, 0x66, 0xb6, + 0xb0, 0x83, 0x1f, 0xe, 0xf8, 0x79, 0xf7, 0x20, 0x1, 0xf7, 0x7a, 0xf7, + 0x20, 0x3, 0xf7, 0x7a, 0xf8, 0x79, 0x15, 0xf7, 0x20, 0xf7, 0x20, 0xfb, + 0x20, 0x6, 0xe, 0xf8, 0x75, 0xf7, 0x59, 0x1, 0xf7, 0x5a, 0xc8, 0xdd, + 0xc8, 0x3, 0xf7, 0x5a, 0xf8, 0xd7, 0x15, 0x56, 0xb9, 0x5e, 0xc2, 0xc4, + 0xb9, 0xb8, 0xc0, 0xc1, 0x5d, 0xb8, 0x52, 0x54, 0x5d, 0x5e, 0x55, 0x1e, + 0xc8, 0x16, 0xa2, 0x9d, 0x9d, 0xa1, 0xa3, 0x9d, 0x79, 0x74, 0x75, 0x79, + 0x79, 0x73, 0x75, 0x79, 0x9d, 0xa1, 0x1e, 0xe, 0xfb, 0x5b, 0xf7, 0x5b, + 0x12, 0xf7, 0x5d, 0xe4, 0x32, 0xf7, 0x51, 0x13, 0xc0, 0xf7, 0xbe, 0x16, + 0x7d, 0x88, 0x38, 0x68, 0x42, 0x1a, 0x5d, 0xaf, 0x61, 0xc0, 0x1e, 0x13, + 0xa0, 0xab, 0xb9, 0x9e, 0xa0, 0xa1, 0x1f, 0xd7, 0x7, 0x13, 0xc0, 0x79, + 0x73, 0x39, 0x60, 0xc5, 0x1a, 0xb6, 0xde, 0xad, 0xa5, 0x9a, 0x1e, 0xe, + 0xe3, 0xf8, 0x3b, 0x3, 0xe3, 0xf8, 0x9a, 0x15, 0xdc, 0x72, 0x5, 0xa3, + 0x98, 0x95, 0xae, 0xac, 0x1b, 0x9e, 0xa0, 0x7e, 0x7d, 0xa2, 0x1f, 0x7d, + 0xa4, 0xa7, 0x7c, 0xab, 0x1b, 0xec, 0xaa, 0xdf, 0xab, 0x95, 0x1f, 0x3a, + 0xa3, 0x5, 0x64, 0x78, 0x83, 0x76, 0x6e, 0x1b, 0x78, 0x76, 0x96, 0x97, + 0x75, 0x1f, 0x9b, 0x6f, 0x6e, 0x9d, 0x6e, 0x1b, 0x2d, 0x6f, 0x41, 0x62, + 0x7b, 0x1f, 0xe, 0xf8, 0x8f, 0x76, 0xf7, 0x43, 0x77, 0x1, 0xb3, 0xf8, + 0x9c, 0x3, 0xf7, 0x93, 0xf8, 0x8f, 0x15, 0xc8, 0x76, 0xf7, 0x88, 0xf7, + 0x25, 0x28, 0xa9, 0x5, 0xfc, 0x39, 0xfb, 0x2e, 0x15, 0xc8, 0x76, 0xf7, + 0x8a, 0xf7, 0x25, 0x28, 0xa9, 0x5, 0xe, 0xf7, 0x5f, 0xef, 0x1, 0xcc, + 0xf8, 0x6a, 0x3, 0xcc, 0xf7, 0x5f, 0x15, 0xf8, 0x6a, 0xef, 0xfc, 0x6a, + 0x6, 0xe, 0xf7, 0x5f, 0xef, 0x1, 0x81, 0xf9, 0x0, 0x3, 0x81, 0xf7, + 0x5f, 0x15, 0xf9, 0x0, 0xef, 0xfd, 0x0, 0x6, 0xe, 0xf7, 0xbe, 0x76, + 0xf7, 0xb5, 0x77, 0x1, 0xf7, 0xc7, 0xf7, 0xa9, 0x15, 0xf7, 0xa, 0x6, + 0x2b, 0xf7, 0xb5, 0x5, 0xfb, 0x2e, 0x6, 0xe, 0x4c, 0xa, 0xf7, 0x42, + 0xf7, 0xa9, 0x15, 0xf7, 0xa, 0x6, 0xf7, 0x1a, 0x59, 0xa, 0xfb, 0x30, + 0x6, 0xe, 0xfb, 0xd, 0x45, 0xa, 0xf7, 0x42, 0xfb, 0x22, 0x15, 0xf7, + 0xd, 0x6, 0xf7, 0x17, 0x59, 0xa, 0xfb, 0x2f, 0x6, 0xe, 0x4c, 0xa, + 0xf8, 0x33, 0xf7, 0xa9, 0x5d, 0xa, 0x36, 0xfb, 0xb1, 0x5d, 0xa, 0xe, + 0x4c, 0xa, 0xf7, 0xad, 0xf7, 0xa9, 0x15, 0xf7, 0xb, 0x6, 0xf7, 0x18, + 0x59, 0xa, 0xfb, 0x2d, 0x6, 0xfb, 0xcb, 0x4e, 0xa, 0xfb, 0xd, 0x45, + 0xa, 0xf7, 0xad, 0xfb, 0x22, 0x15, 0xf7, 0xa, 0x6, 0xf7, 0x19, 0x59, + 0xa, 0xfb, 0x2e, 0x6, 0xfb, 0xca, 0x4e, 0xa, 0xf7, 0xdc, 0xed, 0x1, + 0xf7, 0x8e, 0xef, 0x3, 0xf7, 0x8e, 0x45, 0x15, 0xef, 0xf8, 0x29, 0xf7, + 0x24, 0xed, 0xfb, 0x24, 0xf7, 0x1d, 0x27, 0xfb, 0x1d, 0xfb, 0x24, 0x29, + 0xf7, 0x24, 0x6, 0xe, 0x5a, 0x76, 0xf7, 0x53, 0xed, 0xf6, 0xed, 0xf7, + 0x30, 0x77, 0x1, 0xf7, 0x90, 0xee, 0x3, 0xf5, 0xf7, 0xd, 0x15, 0xf7, + 0x26, 0xfb, 0x53, 0xee, 0xf7, 0x53, 0xf7, 0x23, 0xed, 0xfb, 0x23, 0xf6, + 0xf7, 0x23, 0xed, 0xfb, 0x23, 0xf7, 0x30, 0x28, 0xfb, 0x30, 0xfb, 0x26, + 0x29, 0xf7, 0x26, 0x20, 0xfb, 0x26, 0x6, 0xe, 0xf7, 0xc, 0xf7, 0xfe, + 0x1, 0xf7, 0xc, 0xf7, 0xfc, 0x3, 0xf8, 0x74, 0xf7, 0xc1, 0x15, 0xef, + 0x3b, 0xdc, 0x27, 0x27, 0x3b, 0x3a, 0x27, 0x27, 0xdb, 0x3a, 0xef, 0xef, + 0xdb, 0xdc, 0xef, 0x1e, 0xe, 0x7c, 0xf7, 0x17, 0x1, 0xa5, 0xf7, 0x1c, + 0xd1, 0xf7, 0x1c, 0xd1, 0xf7, 0x1c, 0x14, 0x70, 0xf8, 0x4a, 0xbd, 0x15, + 0x6c, 0xa3, 0x69, 0xb9, 0xb6, 0xa2, 0xad, 0xab, 0xad, 0x75, 0xaa, 0x5e, + 0x5a, 0x77, 0x66, 0x6e, 0x1e, 0xfb, 0x62, 0x16, 0x6c, 0xa3, 0x69, 0xb9, + 0xb7, 0xa1, 0xad, 0xab, 0xad, 0x75, 0xaa, 0x5e, 0x5b, 0x76, 0x66, 0x6e, + 0x1e, 0xfb, 0x62, 0x16, 0x6c, 0xa4, 0x69, 0xb8, 0xb7, 0xa1, 0xad, 0xab, + 0xad, 0x76, 0xaa, 0x5d, 0x5b, 0x76, 0x66, 0x6e, 0x1e, 0xe, 0x7c, 0xd1, + 0xf7, 0x1d, 0xd1, 0xd9, 0xd1, 0xf7, 0x1c, 0xd1, 0x12, 0xfb, 0x5, 0xd8, + 0xf3, 0xd7, 0x74, 0xd7, 0xf3, 0xd8, 0xa3, 0xd7, 0xf7, 0x32, 0xd8, 0x13, + 0xfb, 0xc0, 0xf8, 0x26, 0xf7, 0xf, 0x15, 0x43, 0xc6, 0x4a, 0xeb, 0x8a, + 0x1e, 0xe1, 0xd1, 0xc6, 0xdb, 0xd2, 0x4f, 0xce, 0x2d, 0x2f, 0x4a, 0x68, + 0xa, 0xc0, 0xbd, 0xa8, 0x6b, 0x67, 0x5c, 0x63, 0x75, 0x63, 0x58, 0x70, + 0xac, 0xaf, 0x1e, 0xfc, 0xe3, 0xf7, 0xf5, 0x15, 0x43, 0xc6, 0x4b, 0xea, + 0x8a, 0x1e, 0xe2, 0xd0, 0xc6, 0xda, 0xd2, 0x50, 0xce, 0x2c, 0x2f, 0x4b, + 0x49, 0x42, 0x1f, 0xd8, 0x8c, 0x15, 0xae, 0xa4, 0xac, 0xbf, 0xbe, 0xa8, + 0x6b, 0x67, 0x5d, 0x64, 0x75, 0x61, 0x5a, 0x70, 0xab, 0xaf, 0x1e, 0x13, + 0xfd, 0xc0, 0xf3, 0xfb, 0xf7, 0x15, 0x43, 0xc5, 0x4a, 0xea, 0x8a, 0x1e, + 0xe2, 0xd1, 0xc6, 0xdb, 0xd2, 0x4f, 0xce, 0x2c, 0x2f, 0x4c, 0x68, 0xa, + 0xbe, 0xbe, 0xa8, 0x6b, 0x67, 0x5c, 0x64, 0x75, 0x61, 0x5a, 0x70, 0xac, + 0xaf, 0x1e, 0xfb, 0x5b, 0xc0, 0x15, 0xf8, 0x55, 0xf7, 0x52, 0x6c, 0xca, + 0xfc, 0x56, 0xfb, 0x51, 0x5, 0xe, 0x7b, 0xa, 0xf7, 0x21, 0xf7, 0x96, + 0x15, 0xf7, 0x9f, 0xfb, 0x50, 0xbc, 0xca, 0xfb, 0x4b, 0xf7, 0x15, 0xf7, + 0x4b, 0xf7, 0xd, 0x5a, 0xca, 0x5, 0xe, 0x7b, 0xa, 0xf7, 0x21, 0xf7, + 0xd0, 0x3, 0xf7, 0x52, 0xf8, 0x52, 0x15, 0x5a, 0x4c, 0xf7, 0x4b, 0xfb, + 0xd, 0xfb, 0x4b, 0xfb, 0x15, 0xbc, 0x4c, 0xf7, 0x9f, 0xf7, 0x50, 0x5, + 0xe, 0x64, 0x76, 0xf9, 0x65, 0x77, 0x1, 0xa3, 0xf8, 0xbb, 0x3, 0xa3, + 0x83, 0x15, 0xd1, 0x57, 0xf8, 0x75, 0xf9, 0x34, 0x44, 0xbc, 0x5, 0xe, + 0x84, 0x76, 0xf7, 0x5f, 0xd4, 0xba, 0xd4, 0xf7, 0x2b, 0xe8, 0x1, 0xf7, + 0xf, 0xe9, 0x3, 0xc7, 0xaf, 0x15, 0xbe, 0x4b, 0x5, 0x93, 0x97, 0xec, + 0xb0, 0xbb, 0x1b, 0xa1, 0xa6, 0x82, 0x83, 0xa6, 0x1f, 0x84, 0xa2, 0xad, + 0x85, 0x9f, 0x1b, 0xd3, 0xa8, 0xbd, 0x71, 0xa, 0x7a, 0x72, 0x64, 0xa, + 0x6b, 0x94, 0x7c, 0x1b, 0x7a, 0x50, 0x86, 0x85, 0x7c, 0x1f, 0xa6, 0x9a, + 0x93, 0xb7, 0x89, 0xa0, 0x8, 0xf7, 0x45, 0xd4, 0xfb, 0x50, 0x6, 0x88, + 0x93, 0x87, 0xa3, 0x8a, 0x9a, 0x8, 0xf7, 0x58, 0xd4, 0xfb, 0x5a, 0x6, + 0x89, 0xa8, 0x8a, 0xa4, 0x94, 0x6c, 0xa, 0xba, 0x72, 0x5e, 0xa0, 0x1f, + 0xde, 0xaf, 0x5, 0xb9, 0x70, 0x57, 0xdc, 0x63, 0xa, 0x83, 0x8b, 0x77, + 0x8d, 0x73, 0x1e, 0x47, 0x42, 0xd0, 0x6, 0x8e, 0x75, 0x8b, 0x79, 0x8d, + 0x84, 0x8, 0x41, 0x42, 0xe1, 0x6, 0x91, 0x59, 0x63, 0x4d, 0x5a, 0x70, + 0x8, 0xe, 0x8b, 0xde, 0xe5, 0xd5, 0xc1, 0xd4, 0xf4, 0xde, 0x1, 0xd8, + 0xee, 0xf7, 0xdd, 0xed, 0x3, 0x82, 0xf7, 0x4c, 0x15, 0xef, 0x6, 0xfb, + 0xe, 0xae, 0xf7, 0x8, 0x4d, 0xf7, 0xd, 0x1b, 0xe3, 0xe1, 0xaa, 0xbc, + 0xd3, 0x1f, 0x53, 0xc3, 0x5, 0x63, 0x65, 0x3a, 0x79, 0x48, 0x1b, 0x46, + 0x8c, 0x44, 0xb3, 0x6d, 0xcc, 0x8, 0xf7, 0x40, 0x6, 0xa5, 0xd5, 0x5, + 0xfb, 0x6e, 0x6, 0x8a, 0x91, 0x8b, 0x94, 0x91, 0x92, 0x8c, 0x93, 0x92, + 0x1a, 0xf7, 0x7b, 0x6, 0xa6, 0xd4, 0x5, 0xfb, 0x83, 0x6, 0xd5, 0xa3, + 0xd5, 0xaa, 0xd3, 0x1b, 0xbf, 0x8a, 0xbf, 0x79, 0xae, 0x63, 0x8, 0x47, + 0xed, 0xf7, 0x66, 0x29, 0x5c, 0x7, 0xaa, 0x5e, 0x56, 0x9b, 0x54, 0x1b, + 0xfb, 0xa, 0xfb, 0x3, 0x43, 0xfb, 0x8, 0x6a, 0x1f, 0x43, 0x6, 0x70, + 0x42, 0x5, 0xe1, 0x79, 0x6, 0x8c, 0x72, 0x5, 0x4f, 0x6, 0xe, 0x7c, + 0xe8, 0xf7, 0x1c, 0xe8, 0xf7, 0x36, 0xe8, 0x1, 0xec, 0xee, 0xf7, 0x7b, + 0xed, 0x3, 0x97, 0x7c, 0x15, 0xf7, 0x9c, 0xe8, 0x3b, 0xf7, 0x1c, 0xde, + 0x6, 0xad, 0x5d, 0xb0, 0x5d, 0xa1, 0x6b, 0x5b, 0x55, 0x18, 0xd1, 0x58, + 0xaa, 0xa9, 0x95, 0x7c, 0x8d, 0x88, 0x93, 0x7f, 0x19, 0xf7, 0x22, 0xe8, + 0x32, 0x6, 0x7f, 0x9f, 0xcc, 0xe4, 0x44, 0xbc, 0x5c, 0x4a, 0x5d, 0xc8, + 0x5, 0xf5, 0x9e, 0xab, 0xd1, 0xd3, 0x1a, 0xf7, 0xb, 0x28, 0xbd, 0xfb, + 0x8, 0x1e, 0xfb, 0xba, 0x2e, 0xdc, 0xfc, 0x1b, 0x36, 0x6, 0xf7, 0x4c, + 0xf7, 0x79, 0x15, 0xf7, 0x36, 0x7, 0xf7, 0x4a, 0xbc, 0x92, 0x37, 0x2e, + 0x39, 0x93, 0xfb, 0x29, 0x1f, 0xe, 0xf7, 0x8f, 0x76, 0xf7, 0xae, 0xbc, + 0x1, 0xf7, 0x4, 0xbb, 0xf7, 0xb, 0xba, 0xf7, 0x58, 0xbb, 0x3, 0xf7, + 0xab, 0xf7, 0x7a, 0x15, 0xba, 0xf7, 0xb5, 0x6, 0xd1, 0xfb, 0xb5, 0x5, + 0xc7, 0x6, 0xcd, 0xf7, 0xb4, 0x5, 0xfb, 0xb4, 0xbb, 0xf7, 0xe0, 0x32, + 0x7, 0x52, 0xfb, 0x97, 0x51, 0xf7, 0x97, 0x5, 0x34, 0x6, 0xfb, 0x3b, + 0xfb, 0xe0, 0x15, 0xbb, 0xf7, 0xae, 0xdd, 0xbc, 0xfb, 0x69, 0x5a, 0xde, + 0x6, 0xe, 0x75, 0xa, 0xf7, 0x33, 0x76, 0xa, 0xf8, 0x7e, 0xe1, 0xfc, + 0x79, 0x5b, 0xa, 0x8e, 0xf9, 0x3, 0x1, 0xf7, 0x92, 0xe1, 0x3, 0xf7, + 0x92, 0x8e, 0x15, 0xe1, 0xf8, 0x5b, 0x6, 0xbf, 0x45, 0xcb, 0xbd, 0xfb, + 0x31, 0xf7, 0x50, 0xfb, 0x2f, 0xfb, 0x4d, 0xca, 0x58, 0xba, 0xca, 0x5, + 0xe, 0x75, 0xa, 0x6e, 0xf7, 0x96, 0x15, 0xf8, 0x7e, 0x47, 0xa, 0xfc, + 0x79, 0x6, 0xe, 0x91, 0x76, 0x1, 0xf7, 0x92, 0xe1, 0x3, 0xf7, 0x24, + 0xf7, 0x3e, 0x15, 0xf7, 0x2f, 0xfb, 0x4d, 0xf7, 0x31, 0xf7, 0x50, 0x4b, + 0xbd, 0x57, 0x45, 0x5, 0xf8, 0x5b, 0x35, 0xfc, 0x56, 0x7, 0x5c, 0xca, + 0x5, 0xe, 0xf7, 0x96, 0xe1, 0x1, 0x73, 0xf9, 0x1c, 0x3, 0xf7, 0x38, + 0x76, 0xa, 0xf7, 0xcc, 0x47, 0xa, 0xfb, 0xc2, 0x5b, 0xa, 0xf7, 0x5f, + 0xf7, 0x2, 0x1, 0xd2, 0xf8, 0x5e, 0x3, 0x5c, 0xa, 0xe, 0x8b, 0xe5, + 0xf7, 0x87, 0xe5, 0xd7, 0xf7, 0x13, 0x73, 0x77, 0x12, 0xf4, 0xe5, 0xf7, + 0x12, 0xf7, 0x42, 0x2f, 0xe7, 0x13, 0xea, 0xf8, 0x27, 0xf8, 0x87, 0x15, + 0xe7, 0xf7, 0x13, 0x2f, 0x6, 0x2f, 0xfd, 0x6, 0x15, 0xf7, 0xab, 0xe5, + 0x2c, 0xf7, 0xe1, 0x6, 0x13, 0xec, 0xfb, 0x42, 0x31, 0x6, 0x13, 0xda, + 0xdd, 0xfb, 0x87, 0x2f, 0x6, 0xfb, 0xc2, 0x31, 0x15, 0xf7, 0xae, 0xe5, + 0x2b, 0xf7, 0x87, 0xeb, 0xe5, 0x2b, 0xbf, 0x6, 0xb4, 0xdf, 0x87, 0xa4, + 0x1e, 0x8e, 0xe5, 0x5, 0x21, 0x2b, 0x8c, 0xfb, 0x1d, 0x1f, 0x60, 0x2b, + 0x31, 0xeb, 0xfb, 0x87, 0x2b, 0x7, 0xe, 0x8b, 0xe8, 0xf7, 0x90, 0xe8, + 0xea, 0xe5, 0x8e, 0x77, 0x12, 0xf4, 0xe5, 0xf7, 0x3d, 0xf7, 0x17, 0x31, + 0xe5, 0x13, 0xdc, 0xf7, 0xcc, 0x16, 0xf7, 0xaa, 0xe8, 0x2c, 0xf8, 0xa9, + 0xfb, 0x17, 0x6, 0x13, 0xec, 0x2e, 0x7, 0x13, 0xea, 0xb4, 0xfc, 0x4c, + 0x2e, 0x6, 0xfb, 0xc3, 0x2e, 0x15, 0xf7, 0xac, 0xe8, 0x2d, 0xf7, 0x90, + 0xe9, 0xe8, 0x2d, 0xbe, 0x6, 0xab, 0xb6, 0x96, 0xb1, 0x8c, 0x1e, 0xa5, + 0x8c, 0xa3, 0x8b, 0x91, 0x89, 0x8c, 0xe6, 0x18, 0x20, 0xfb, 0xd, 0x8b, + 0xfb, 0x20, 0x1f, 0x5e, 0x2b, 0x2e, 0xeb, 0xfb, 0x90, 0x2b, 0x7, 0xe, + 0x79, 0x9d, 0xf8, 0x4b, 0x9f, 0xf2, 0x9d, 0x9f, 0x95, 0x95, 0x95, 0x6, + 0xfb, 0x26, 0x8f, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xe8, + 0xa, 0xe8, 0xb, 0x8c, 0xc, 0xe, 0xf8, 0xec, 0x14, 0xae, 0x13, 0x0, + 0x5d, 0x2, 0x0, 0x1, 0x0, 0x35, 0x0, 0x43, 0x0, 0x47, 0x0, 0x7a, + 0x0, 0xba, 0x0, 0xc4, 0x0, 0xe9, 0x1, 0x17, 0x1, 0x34, 0x1, 0x4c, + 0x1, 0x65, 0x1, 0x7d, 0x1, 0x94, 0x1, 0xa8, 0x1, 0xbb, 0x1, 0xca, + 0x1, 0xdc, 0x1, 0xe2, 0x1, 0xe9, 0x1, 0xfc, 0x2, 0x6, 0x2, 0x10, + 0x2, 0x24, 0x2, 0x36, 0x2, 0x43, 0x2, 0x4c, 0x2, 0x6c, 0x2, 0x71, + 0x2, 0x78, 0x2, 0x7f, 0x2, 0x8d, 0x2, 0x95, 0x2, 0xa0, 0x2, 0xb8, + 0x2, 0xcf, 0x2, 0xd8, 0x2, 0xe1, 0x2, 0xe7, 0x2, 0xfa, 0x3, 0xd, + 0x3, 0x1c, 0x3, 0x2e, 0x3, 0x36, 0x3, 0x3e, 0x3, 0x43, 0x3, 0x49, + 0x3, 0x57, 0x3, 0x61, 0x3, 0x71, 0x3, 0x75, 0x3, 0x7e, 0x3, 0x87, + 0x3, 0x90, 0x3, 0x97, 0x3, 0xa5, 0x3, 0xb1, 0x3, 0xbf, 0x3, 0xc3, + 0x3, 0xd0, 0x3, 0xdb, 0x3, 0xe7, 0x3, 0xf2, 0x3, 0xfe, 0x4, 0x4, + 0x4, 0x8, 0x4, 0xe, 0x4, 0x14, 0x4, 0x1f, 0x4, 0x2a, 0x4, 0x31, + 0x4, 0x36, 0x4, 0x3b, 0x4, 0x45, 0x4, 0x4f, 0x4, 0x53, 0x4, 0x57, + 0x4, 0x60, 0x4, 0x69, 0x4, 0x72, 0x4, 0x7b, 0x4, 0x84, 0x4, 0x8d, + 0x4, 0x96, 0x4, 0x9f, 0x4, 0xa8, 0x4, 0xb1, 0x4, 0xba, 0x4, 0xc1, + 0x4, 0xc8, 0x4, 0xce, 0x4, 0xd4, 0x4, 0xd9, 0x4, 0xde, 0xf7, 0x97, + 0xe5, 0x27, 0x6, 0xa9, 0xcc, 0x5, 0xf7, 0x86, 0x6, 0xa9, 0x4a, 0x5, + 0x2a, 0x31, 0xf7, 0x92, 0xe5, 0x51, 0x6, 0xfb, 0x62, 0xf8, 0x62, 0x5, + 0xfb, 0x8f, 0x31, 0xf7, 0x15, 0x6, 0xfb, 0x3f, 0xfc, 0x8, 0x5, 0x4e, + 0x6, 0xf7, 0x7a, 0xf7, 0x2f, 0x15, 0xdc, 0xf7, 0x47, 0xdc, 0xfb, 0x47, + 0x5, 0xb, 0x2a, 0xa, 0x13, 0x7d, 0x4d, 0xa, 0x13, 0x7e, 0x2b, 0xa, + 0x13, 0xbe, 0x29, 0xa, 0x15, 0x20, 0xa, 0xe, 0x15, 0xfb, 0x39, 0xf7, + 0x2a, 0x51, 0xf7, 0xa, 0xf7, 0xf, 0xf7, 0x29, 0xcb, 0xf7, 0x33, 0xf7, + 0x24, 0xfb, 0x6, 0xe0, 0xfb, 0x32, 0xfb, 0x21, 0xfb, 0x13, 0x3d, 0xfb, + 0x2b, 0x1e, 0xef, 0x16, 0xdf, 0xd4, 0xc0, 0xea, 0xf7, 0x7, 0xc5, 0x52, + 0x3b, 0x34, 0x28, 0x5b, 0x41, 0x47, 0x27, 0xb7, 0xe6, 0x1e, 0xe, 0x15, + 0xf8, 0x23, 0x6, 0xf7, 0x1c, 0xa5, 0x32, 0xf7, 0x14, 0xfb, 0x43, 0x1b, + 0xfb, 0xc, 0xfb, 0x1f, 0x3f, 0xfb, 0x2b, 0xfb, 0x8, 0xe3, 0x21, 0xf7, + 0x41, 0xe5, 0xeb, 0xa9, 0xb4, 0xd7, 0x1f, 0x5f, 0xda, 0x5, 0x6d, 0x4b, + 0x3b, 0x6d, 0x41, 0x1b, 0xfb, 0x10, 0x69, 0xc7, 0xae, 0x86, 0x1f, 0x92, + 0xe6, 0x15, 0xc3, 0xa0, 0xce, 0xa4, 0xc8, 0x1b, 0xc7, 0xca, 0x7a, 0x4b, + 0x9e, 0x1f, 0xe, 0x2f, 0xa, 0xf7, 0x2e, 0x2e, 0xf7, 0x1c, 0x26, 0xa, + 0xb, 0xfb, 0x4c, 0xfb, 0x42, 0x22, 0xfb, 0x21, 0xfb, 0x2b, 0x1e, 0xed, + 0x8e, 0x15, 0xe6, 0xc8, 0xf6, 0xf7, 0xc, 0xf7, 0x1c, 0xb9, 0xfb, 0x13, + 0x47, 0x3a, 0x5a, 0xfb, 0x10, 0xfb, 0x19, 0xfb, 0xd, 0x4f, 0xf3, 0xed, + 0x1e, 0xb, 0xdb, 0xfb, 0xa2, 0x6, 0xfb, 0x11, 0xd3, 0x38, 0xf7, 0x25, + 0xf7, 0x11, 0xe8, 0xdc, 0xf7, 0x12, 0x1e, 0xf7, 0xa3, 0xd8, 0xe6, 0xfb, + 0x96, 0x30, 0xe1, 0xfb, 0x8d, 0x7, 0x35, 0x74, 0x57, 0x25, 0xfb, 0x4, + 0x83, 0xe2, 0xc0, 0x1e, 0xf7, 0x8b, 0xdf, 0xe6, 0xfb, 0x97, 0x7, 0xe, + 0x15, 0x13, 0xb5, 0x0, 0x2e, 0xa, 0x13, 0x78, 0x80, 0x64, 0xf7, 0x43, + 0xe6, 0x7, 0x13, 0x7a, 0x0, 0x3a, 0xf7, 0xe1, 0xfb, 0x41, 0x30, 0x6, + 0x13, 0xb9, 0x0, 0x2c, 0xa, 0x61, 0x5b, 0x4f, 0x69, 0x47, 0x1b, 0x60, + 0x62, 0x9c, 0xab, 0xb7, 0xbf, 0x9d, 0xc6, 0x8c, 0x1f, 0xc7, 0x8c, 0xcd, + 0x85, 0xa2, 0x89, 0x8, 0xe, 0x1f, 0x8f, 0x67, 0x63, 0x8e, 0x66, 0x1b, + 0xfb, 0x7f, 0x82, 0xfb, 0x19, 0x78, 0x4b, 0xcb, 0x3e, 0xf7, 0xa, 0xda, + 0xb0, 0xa1, 0xae, 0xc6, 0x1f, 0xb, 0x38, 0xf7, 0x37, 0x6, 0xf7, 0xe, + 0x5d, 0xc8, 0xfb, 0x10, 0xfb, 0x0, 0xfb, 0xe, 0x66, 0x7f, 0x7a, 0x1e, + 0xf7, 0xd6, 0xfb, 0x7c, 0x15, 0xb, 0xda, 0xfb, 0x4f, 0x6, 0x75, 0x63, + 0x52, 0x71, 0x59, 0x8a, 0x8, 0x5a, 0x8a, 0x60, 0xa0, 0xbf, 0x1a, 0xf7, + 0xa5, 0xfb, 0x42, 0x7, 0xe, 0xfb, 0x93, 0x38, 0xa, 0xf7, 0x93, 0xfb, + 0x6, 0xed, 0xf7, 0x60, 0xfc, 0xa2, 0x31, 0xd7, 0xfc, 0x8, 0x3c, 0x6, + 0xb, 0xdc, 0xfb, 0x48, 0x6, 0xfb, 0x2, 0xc7, 0x54, 0xf7, 0xa, 0x8a, + 0x1e, 0xbf, 0xbe, 0xa1, 0xa9, 0xac, 0x1f, 0xb, 0x15, 0xfb, 0x56, 0xf7, + 0x25, 0x2d, 0xf7, 0x1a, 0xf3, 0xf7, 0x41, 0xd2, 0xf7, 0x6f, 0xb, 0xfb, + 0x3f, 0xf8, 0x8, 0xf7, 0x36, 0xe5, 0xfc, 0x3f, 0x31, 0xf7, 0x39, 0xfc, + 0x8, 0xfb, 0x43, 0x6, 0xb, 0xf8, 0x52, 0xe5, 0x30, 0xa, 0xb, 0x8b, + 0xe6, 0xf8, 0x10, 0xe6, 0x1, 0xb, 0x15, 0xf8, 0x52, 0xe6, 0xfb, 0x43, + 0xf7, 0xe0, 0xfb, 0x7e, 0x30, 0xf7, 0x1d, 0xfb, 0x85, 0xfb, 0x42, 0x6, + 0xe, 0x12, 0xab, 0xec, 0xf7, 0x98, 0xea, 0x2c, 0xf7, 0x46, 0xb, 0xf8, + 0xa5, 0xf7, 0x5e, 0x29, 0xfb, 0x4, 0x2d, 0xa, 0xb, 0x77, 0x12, 0x9a, + 0xf7, 0x42, 0x2e, 0xe8, 0xf7, 0x22, 0xf7, 0x41, 0x2d, 0xe9, 0x2d, 0xf7, + 0x43, 0x13, 0xba, 0x0, 0xb, 0x5a, 0xbb, 0x64, 0xc7, 0xc7, 0xbb, 0xb2, + 0xbc, 0xbc, 0x5b, 0xb2, 0x4f, 0x4f, 0x5b, 0x64, 0x5a, 0x1e, 0xb, 0xf7, + 0x27, 0xf1, 0x4b, 0xee, 0xf7, 0x6c, 0x28, 0x4b, 0x25, 0xf7, 0x1d, 0xb, + 0x7c, 0xe6, 0x3c, 0xe5, 0xf0, 0xe5, 0xcf, 0xe2, 0xb, 0x7, 0xf7, 0x9e, + 0xf8, 0x26, 0x5, 0xd7, 0xe2, 0xfb, 0x76, 0x34, 0xb8, 0x6, 0xfb, 0x14, + 0xfb, 0x54, 0xfb, 0x6, 0xf7, 0x54, 0x5, 0xbc, 0xe2, 0xfb, 0x7b, 0x34, + 0xd7, 0x6, 0xf7, 0x3a, 0xb, 0x34, 0xa, 0x13, 0xbe, 0xb, 0x4a, 0xa, + 0xf7, 0x83, 0x36, 0xa, 0xb, 0xbf, 0xa9, 0x70, 0x5b, 0x2a, 0xa, 0xb, + 0x53, 0xaf, 0xfb, 0x20, 0xfb, 0x1, 0xfb, 0x20, 0xf7, 0x1, 0x51, 0x68, + 0x5, 0xe, 0x15, 0x9b, 0xa9, 0xf4, 0xa4, 0xd7, 0x1b, 0xb, 0xe9, 0x1, + 0xf7, 0x8e, 0xee, 0x60, 0xa, 0xe9, 0xfb, 0x42, 0xb, 0xc9, 0xaf, 0x75, + 0x6d, 0xbe, 0x1f, 0x2d, 0xed, 0xf7, 0x81, 0x29, 0x5c, 0x7, 0xa5, 0x62, + 0x66, 0xa0, 0x41, 0x1b, 0xfb, 0x32, 0xfb, 0x12, 0xb, 0xfb, 0xa, 0x42, + 0x39, 0xa3, 0x95, 0x64, 0x1e, 0xa7, 0xf7, 0xa3, 0x15, 0xd2, 0xcd, 0xba, + 0xd9, 0xdf, 0xc6, 0x5f, 0x3f, 0x42, 0x53, 0xb, 0x15, 0xe7, 0x6, 0xf7, + 0x29, 0xf7, 0x1e, 0x3e, 0xa, 0x1, 0x82, 0xf7, 0x97, 0xf4, 0xf7, 0x92, + 0x3, 0xb, 0x76, 0xf7, 0xb1, 0x77, 0x1, 0xb, 0xf7, 0xc4, 0xf7, 0x46, + 0x15, 0xf7, 0x1d, 0x32, 0x6, 0x81, 0x62, 0x64, 0x88, 0x67, 0x1b, 0xfb, + 0x14, 0x36, 0xb, 0x6, 0x45, 0x57, 0xbd, 0x4c, 0xf7, 0x50, 0xf7, 0x30, + 0xfb, 0x4d, 0xf7, 0x30, 0x58, 0x4c, 0xca, 0x5b, 0x5, 0xb, 0x8b, 0xe5, + 0xf7, 0x27, 0xe3, 0xf7, 0x1d, 0x5f, 0xa, 0xf7, 0x9, 0xec, 0xf1, 0xee, + 0xb, 0x66, 0xac, 0x6c, 0xb4, 0xb4, 0xac, 0xaa, 0xb0, 0xb2, 0x6a, 0xa9, + 0x62, 0x62, 0x6a, 0x6d, 0x64, 0x1e, 0xb, 0x7c, 0xe7, 0x3c, 0xe6, 0xf7, + 0x86, 0xe6, 0xb, 0x1, 0xa9, 0xef, 0xf7, 0xe9, 0xee, 0x3, 0xb, 0xf7, + 0xbe, 0x45, 0xa, 0xb, 0x5e, 0xf7, 0x46, 0xe5, 0x7, 0xb, 0xfb, 0xb1, + 0x15, 0xf7, 0x9, 0x6, 0xf7, 0x1a, 0x59, 0xa, 0xfb, 0x2e, 0x6, 0xe, + 0x79, 0xe6, 0xf8, 0x17, 0xe6, 0xf7, 0x7d, 0x52, 0xa, 0xb, 0xe7, 0x74, + 0x15, 0x75, 0x32, 0x5, 0x79, 0xdf, 0xc8, 0x7b, 0xd5, 0x1b, 0xf7, 0x50, + 0xa1, 0xb, 0x3f, 0xa, 0xbf, 0xb, 0x77, 0x1, 0xdf, 0xea, 0xf7, 0x89, + 0xea, 0x3, 0xb, 0x15, 0xf7, 0x5, 0xf7, 0x10, 0xfb, 0x5, 0x6, 0xb, + 0x77, 0x1, 0xa1, 0xed, 0xf7, 0xff, 0xea, 0x3, 0xb, 0x7c, 0xe5, 0xea, + 0xe6, 0xdc, 0xe7, 0xb, 0x6, 0xfb, 0x4e, 0xfb, 0xe, 0x15, 0xf7, 0x6, + 0xf7, 0xe, 0xfb, 0x6, 0x6, 0xb, 0x8b, 0xe6, 0xf7, 0x85, 0xe6, 0xf7, + 0x82, 0x67, 0xa, 0xec, 0x3, 0xb, 0xd2, 0xd2, 0x9c, 0xaa, 0xc6, 0x1f, + 0xf7, 0x28, 0xbd, 0xea, 0xfb, 0xae, 0x7, 0xb, 0xf7, 0xb1, 0x5, 0xb, + 0xa7, 0x66, 0x5a, 0x97, 0x56, 0x1b, 0xfb, 0x23, 0x27, 0x30, 0xfb, 0x8, + 0xb, 0x6, 0xca, 0xbb, 0x58, 0xca, 0xfb, 0x4d, 0xfb, 0x30, 0x5, 0xe, + 0xd2, 0xf7, 0x5f, 0x15, 0xf8, 0x5e, 0xf7, 0x2, 0xfc, 0x5e, 0x6, 0xb, + 0x15, 0xf7, 0x9, 0x6, 0x2b, 0x59, 0xa, 0xfb, 0x2c, 0x6, 0xb, 0xaf, + 0x76, 0xf8, 0x7a, 0x77, 0x1, 0xd2, 0xf8, 0x5d, 0x3, 0xd2, 0xb, 0xe5, + 0xf7, 0x7c, 0x77, 0x1, 0xb, 0x3, 0x66, 0xa, 0xb, 0x79, 0xe4, 0xf8, + 0x24, 0xe6, 0xb, 0x7c, 0xe7, 0xf7, 0x9f, 0xe7, 0xb, 0xfb, 0x12, 0x1b, + 0xfb, 0x1b, 0x45, 0x2b, 0x2c, 0x8c, 0x1f, 0xb, 0x67, 0x1b, 0x81, 0x7c, + 0x8f, 0x91, 0x7b, 0x1f, 0x92, 0x76, 0xb, 0xc3, 0x56, 0xf8, 0xd0, 0xf9, + 0xf, 0xb, 0xd8, 0x16, 0xf8, 0x52, 0xb, 0x77, 0x1, 0xf7, 0x8f, 0xb, + 0x49, 0x42, 0x1f, 0xd7, 0x8c, 0x15, 0xae, 0xa5, 0xac, 0xb, 0x12, 0xa4, + 0xea, 0xf7, 0xb3, 0xe7, 0x2f, 0xf7, 0x3c, 0xb, 0xfb, 0xc, 0x5, 0xb, + 0xfb, 0x3, 0x6, 0xb, 0x1a, 0xbc, 0x8a, 0xb2, 0xb1, 0xd5, 0x1b, 0xbf, + 0xb, 0x1, 0xf7, 0x54, 0xf7, 0x6c, 0x3, 0xf7, 0x54, 0xb, 0x77, 0x1, + 0xf7, 0x93, 0xe5, 0x3, 0xf7, 0x93, 0xb, 0x15, 0xf7, 0x2, 0xf7, 0x11, + 0xfb, 0x2, 0x6, 0xb, 0x15, 0xf7, 0x6, 0xf7, 0x12, 0xfb, 0x6, 0x6, + 0xb, 0xa4, 0xa0, 0x1f, 0x53, 0xca, 0x5, 0x77, 0x71, 0xb, 0x15, 0xf7, + 0x4, 0xf7, 0x12, 0xfb, 0x4, 0x6, 0xb, 0x15, 0xf7, 0xa, 0xf7, 0x24, + 0xfb, 0xa, 0x6, 0xb, 0xf7, 0x3c, 0xe6, 0xfc, 0x4c, 0x30, 0xf7, 0x3f, + 0xb, 0xf7, 0x96, 0xe1, 0x1, 0x6e, 0xf9, 0x26, 0x3, 0xb, 0xf7, 0x23, + 0x15, 0xbd, 0xca, 0x45, 0xbf, 0x5, 0xb, 0xc5, 0xfb, 0xc3, 0xf7, 0xd, + 0x5, 0xe, 0xa1, 0xd8, 0x1e, 0xf6, 0x29, 0x7, 0xe, 0x15, 0xf7, 0x3, + 0xf7, 0x23, 0xb, 0x30, 0xde, 0xfc, 0x10, 0x38, 0xb, 0xd1, 0xf8, 0xc, + 0x1, 0xb, 0x8b, 0xe9, 0xf7, 0x8f, 0xb}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.cpp new file mode 100644 index 000000000000..c9509e6c6b41 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.cpp @@ -0,0 +1,1605 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitFixedBoldItalicFontData[19151] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x19, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x46, 0x69, 0x78, 0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x42, + 0x6f, 0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, + 0x1, 0x24, 0xf8, 0x10, 0x0, 0xf8, 0x2a, 0x1, 0xf8, 0x2b, 0x2, 0xf8, + 0x2c, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0xa, 0xfb, 0x8d, 0xf9, 0x49, 0xf9, + 0xbf, 0x5, 0xf7, 0xad, 0xf, 0xf9, 0x94, 0x11, 0xac, 0x1c, 0x44, 0x2e, + 0x12, 0x0, 0x12, 0x1, 0x1, 0x5, 0xb, 0xd, 0x11, 0x19, 0x22, 0x2b, + 0x34, 0x3e, 0x45, 0x4b, 0x4d, 0x51, 0x5d, 0x65, 0x8f, 0xaa, 0xb9, 0x45, + 0x75, 0x72, 0x6f, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x49, 0x4a, 0x49, + 0x64, 0x6f, 0x74, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x61, + 0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68, 0x61, 0x72, 0x72, 0x6f, + 0x77, 0x64, 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, + 0x66, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x67, 0x63, 0x61, 0x72, 0x6f, + 0x6e, 0x69, 0x6a, 0x6c, 0x69, 0x72, 0x61, 0x70, 0x72, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x65, 0x64, 0x69, + 0x6c, 0x6c, 0x61, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, + 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, + 0x43, 0x68, 0x72, 0x6F, 0x68, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64, 0x20, + 0x4f, 0x54, 0x46, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab, + 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb0, 0x0, 0x23, + 0x0, 0x24, 0x0, 0xb1, 0x0, 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3, + 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87, 0x0, 0x27, 0x0, 0x28, + 0x1, 0x88, 0x0, 0x29, 0x0, 0x2a, 0x1, 0x89, 0x0, 0xb6, 0x0, 0xb7, + 0x0, 0xb8, 0x1, 0x8a, 0x0, 0xb9, 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, + 0x0, 0x8c, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0xba, 0x0, 0x30, 0x0, 0x8e, + 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0x8d, 0x0, 0xbf, + 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0xc0, 0x1, 0x8b, + 0x0, 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3, + 0x0, 0xc4, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5, + 0x0, 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42, 0x0, 0xc8, 0x0, 0xc9, + 0x0, 0x7d, 0x0, 0xca, 0x0, 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc, + 0x1, 0x8c, 0x1, 0x8d, 0x1, 0x8e, 0x1, 0x8f, 0x1, 0x90, 0x0, 0x3f, + 0x0, 0x5f, 0x0, 0xb, 0x0, 0x21, 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, + 0x0, 0x5d, 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0, 0x3e, 0x0, 0x81, + 0x0, 0xa0, 0x0, 0x74, 0x0, 0x44, 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, + 0x0, 0x61, 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0, 0xaa, 0x0, 0x67, + 0x0, 0x45, 0x0, 0x70, 0x0, 0x71, 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, + 0x0, 0x5, 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0, 0xcf, 0x0, 0xd0, + 0x0, 0xd1, 0x0, 0xd2, 0x0, 0x19, 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, + 0x0, 0x1e, 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0, 0x47, 0x0, 0x6d, + 0x0, 0x16, 0x0, 0x6e, 0x0, 0x65, 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, + 0x1, 0x91, 0x0, 0x95, 0x0, 0x7c, 0x0, 0x1f, 0x0, 0x6a, 0x0, 0x78, + 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x86, 0x0, 0xe, 0x0, 0x4a, + 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x1, 0x92, 0x0, 0x4b, + 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x1d, 0x1, 0x93, 0x0, 0x97, 0x0, 0x92, + 0x0, 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98, 0x0, 0xa8, 0x0, 0x4f, + 0x0, 0x1a, 0x0, 0xd7, 0x0, 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9, + 0x0, 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb, 0x0, 0x12, 0x0, 0x9b, + 0x0, 0x9e, 0x0, 0x96, 0x0, 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc, + 0x0, 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa, 0x0, 0x6, 0x0, 0xf, + 0x0, 0x72, 0x0, 0x7a, 0x0, 0xc, 0x0, 0x9c, 0x1, 0x94, 0x0, 0x52, + 0x0, 0x20, 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0, 0x69, 0x0, 0x77, + 0x0, 0x41, 0x0, 0x8, 0x0, 0x75, 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, + 0x0, 0x84, 0x0, 0x54, 0x0, 0xdd, 0x1, 0x95, 0x0, 0x66, 0x0, 0x1c, + 0x0, 0x18, 0x0, 0x17, 0x0, 0x10, 0x0, 0x1, 0x0, 0x62, 0x0, 0x55, + 0x0, 0xa2, 0x0, 0x14, 0x0, 0xa3, 0x0, 0xa9, 0x0, 0x7f, 0x0, 0x99, + 0x0, 0x13, 0x0, 0xa4, 0x0, 0x56, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, + 0x0, 0xe1, 0x0, 0x40, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, + 0x0, 0xe2, 0x0, 0xe3, 0x0, 0x64, 0x0, 0x5b, 0x0, 0xe4, 0x0, 0x11, + 0x0, 0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x44, 0x0, 0xc1, 0x0, + 0xdc, 0x1, 0x2, 0x1, 0x26, 0x1, 0x40, 0x1, 0x76, 0x1, 0xbf, 0x2, + 0x29, 0x2, 0x78, 0x2, 0xfe, 0x3, 0x37, 0x3, 0x84, 0x3, 0xa1, 0x3, + 0xc9, 0x3, 0xed, 0x4, 0x13, 0x4, 0x6e, 0x4, 0xf0, 0x5, 0x3a, 0x5, + 0x9a, 0x6, 0x8, 0x6, 0x5e, 0x6, 0x83, 0x6, 0xdb, 0x6, 0xf4, 0x7, + 0x1d, 0x7, 0x38, 0x7, 0x6e, 0x7, 0x84, 0x7, 0xc1, 0x8, 0x19, 0x8, + 0x45, 0x8, 0x85, 0x8, 0xc9, 0x8, 0xf8, 0x9, 0x6e, 0x9, 0xb6, 0xa, + 0x36, 0xa, 0x52, 0xa, 0x75, 0xa, 0x9a, 0xa, 0xbb, 0xb, 0x3c, 0xb, + 0x86, 0xb, 0xd0, 0xc, 0x48, 0xc, 0xa7, 0xd, 0x1b, 0xd, 0x8b, 0xe, + 0x2b, 0xe, 0x5c, 0xe, 0xba, 0xf, 0x17, 0xf, 0x33, 0xf, 0x59, 0xf, + 0x81, 0xf, 0x9a, 0xf, 0xcb, 0x10, 0xd, 0x10, 0x56, 0x10, 0x8f, 0x10, + 0xe0, 0x11, 0x4b, 0x11, 0x7d, 0x11, 0xce, 0x12, 0x48, 0x12, 0x67, 0x12, + 0x9b, 0x12, 0xaf, 0x12, 0xdd, 0x13, 0x88, 0x13, 0xa6, 0x14, 0x29, 0x14, + 0x62, 0x14, 0x83, 0x14, 0xa5, 0x14, 0xc3, 0x14, 0xdc, 0x15, 0x0, 0x15, + 0x32, 0x15, 0x7e, 0x15, 0xad, 0x16, 0x4c, 0x16, 0xaa, 0x17, 0x8, 0x17, + 0x21, 0x17, 0x3b, 0x17, 0xb4, 0x18, 0x2c, 0x18, 0x4c, 0x18, 0x70, 0x18, + 0x94, 0x18, 0xbd, 0x18, 0xde, 0x19, 0x29, 0x19, 0x44, 0x19, 0xc2, 0x19, + 0xfe, 0x1a, 0x5d, 0x1a, 0x7a, 0x1a, 0xb5, 0x1a, 0xd3, 0x1b, 0x5a, 0x1b, + 0xd7, 0x1c, 0x39, 0x1c, 0x6a, 0x1c, 0xaf, 0x1c, 0xeb, 0x1d, 0x15, 0x1d, + 0x3f, 0x1d, 0xd5, 0x1d, 0xee, 0x1e, 0xd, 0x1e, 0x5d, 0x1e, 0x73, 0x1e, + 0x9e, 0x1e, 0xc0, 0x1e, 0xe9, 0x1f, 0x63, 0x1f, 0x88, 0x1f, 0x9e, 0x1f, + 0xb4, 0x1f, 0xd9, 0x20, 0x4c, 0x20, 0x7d, 0x20, 0xad, 0x20, 0xff, 0x21, + 0x5c, 0x21, 0xa9, 0x22, 0x9, 0x22, 0x6d, 0x22, 0xae, 0x22, 0xbf, 0x23, + 0x2f, 0x23, 0xa9, 0x24, 0x38, 0x24, 0x4c, 0x24, 0x6c, 0x24, 0x85, 0x24, + 0xbe, 0x24, 0xde, 0x24, 0xf9, 0x25, 0x4d, 0x25, 0x75, 0x25, 0x8d, 0x25, + 0xc1, 0x25, 0xda, 0x25, 0xff, 0x26, 0x27, 0x26, 0x40, 0x26, 0xb0, 0x26, + 0xf8, 0x27, 0x45, 0x27, 0x67, 0x27, 0x87, 0x27, 0xec, 0x28, 0xa, 0x28, + 0x44, 0x28, 0xc6, 0x28, 0xdc, 0x28, 0xeb, 0x29, 0x3d, 0x29, 0x6a, 0x29, + 0xc9, 0x2a, 0x25, 0x2a, 0xc0, 0x2b, 0x2d, 0x2b, 0x6f, 0x2b, 0x86, 0x2b, + 0xb0, 0x2b, 0xc9, 0x2c, 0x4a, 0x2c, 0x78, 0x2c, 0x8f, 0x2c, 0xb2, 0x2d, + 0x2e, 0x2d, 0x9e, 0x2d, 0xc6, 0x2e, 0x2f, 0x2e, 0x6d, 0x2e, 0xe8, 0x2f, + 0x32, 0x2f, 0x92, 0x2f, 0xcc, 0x2f, 0xff, 0x30, 0x32, 0x30, 0x60, 0x30, + 0x7f, 0x30, 0xa0, 0x30, 0xed, 0x31, 0x1c, 0x31, 0x5e, 0x31, 0xca, 0x32, + 0x26, 0x32, 0x81, 0x32, 0xdd, 0x33, 0x4, 0x33, 0x25, 0x33, 0x46, 0x33, + 0x70, 0x33, 0x82, 0x33, 0x9e, 0x33, 0xb7, 0x33, 0xd1, 0x34, 0xd, 0x34, + 0x97, 0x34, 0xce, 0x35, 0x41, 0x35, 0xca, 0x36, 0x73, 0x37, 0xe, 0x37, + 0x41, 0x37, 0x65, 0x37, 0xc8, 0x37, 0xdd, 0x37, 0xde, 0x38, 0x2f, 0x38, + 0x7d, 0x38, 0xe4, 0x39, 0x44, 0x39, 0xf0, 0x3a, 0x51, 0x3a, 0x94, 0x3a, + 0xe9, 0x3b, 0x3a, 0x3b, 0x88, 0x3b, 0xde, 0x3b, 0xff, 0x3c, 0x26, 0x3c, + 0x4a, 0x3c, 0x61, 0x3c, 0x72, 0x3c, 0xa1, 0x3c, 0xe1, 0x3d, 0x2c, 0x3d, + 0x78, 0x3d, 0xba, 0x3e, 0xe, 0x3e, 0x76, 0x3e, 0xac, 0x3f, 0x0, 0x3f, + 0x42, 0xe, 0x8b, 0xe6, 0xd8, 0xe6, 0xf7, 0x68, 0xe6, 0x1, 0x63, 0x16, + 0xf7, 0x8d, 0x34, 0xa, 0x31, 0x6, 0xba, 0xd8, 0x5, 0xf7, 0x82, 0x6, + 0x9e, 0x3e, 0x5, 0x34, 0x36, 0xa, 0xf7, 0x8a, 0x42, 0xa, 0x50, 0x6, + 0xfb, 0x0, 0xf8, 0x6b, 0x5, 0xfb, 0x92, 0x4b, 0xa, 0xf7, 0x15, 0x6, + 0xfb, 0x8d, 0x7d, 0xa, 0x4c, 0x6, 0xf7, 0x9e, 0xf7, 0x3c, 0x15, 0xf7, + 0x9, 0xf7, 0x41, 0xb5, 0xfb, 0x41, 0x5, 0xe, 0x8b, 0xe5, 0x31, 0xf7, + 0x40, 0x7e, 0xe6, 0x52, 0xf7, 0x50, 0x93, 0xf7, 0x41, 0x31, 0xe5, 0x12, + 0x13, 0xa8, 0xfb, 0xa, 0x16, 0xf7, 0x85, 0x6, 0x9f, 0xe5, 0x5, 0x3d, + 0x6, 0xb8, 0xd0, 0x5, 0xf7, 0x4, 0x6, 0x6a, 0xfb, 0x33, 0x5, 0xf7, + 0xcc, 0x6, 0x13, 0x58, 0xaf, 0xf7, 0x40, 0x5, 0x3c, 0x6, 0x13, 0x94, + 0x7a, 0x39, 0x5, 0xfb, 0x1e, 0x6, 0xab, 0xf7, 0x2c, 0x5, 0xb1, 0x6, + 0x81, 0x5a, 0x5c, 0xa, 0xb3, 0xf7, 0x50, 0x5, 0x3c, 0x6, 0x82, 0x5a, + 0x5, 0x64, 0x6, 0xa8, 0x97, 0xa, 0xf7, 0x1e, 0x6, 0x13, 0xa8, 0x7a, + 0x38, 0x5c, 0xa, 0xaf, 0xf7, 0x41, 0x5, 0xfc, 0x6f, 0x6, 0x13, 0xa4, + 0x77, 0x31, 0x5, 0xe8, 0x6, 0xfb, 0x8e, 0xfc, 0x12, 0x5, 0x4a, 0x6, + 0xf7, 0xa0, 0xf7, 0x34, 0x15, 0xf5, 0xf7, 0x39, 0x69, 0xfb, 0x39, 0x5, + 0xe, 0x40, 0xa, 0xf7, 0x7a, 0x77, 0x1, 0xf7, 0xb6, 0xf8, 0xf3, 0x15, + 0xf7, 0xef, 0xd5, 0x77, 0xf2, 0xfb, 0xe4, 0xfb, 0xa, 0x5, 0xfb, 0xc2, + 0xfd, 0x2e, 0x23, 0xa, 0x40, 0xa, 0xf7, 0x76, 0x77, 0x1, 0xf7, 0x91, + 0xf8, 0xee, 0x15, 0xf7, 0x42, 0xf7, 0x4, 0xf7, 0x13, 0xfb, 0x4, 0xcd, + 0xae, 0xfb, 0x16, 0xf7, 0x23, 0x66, 0xa, 0xfb, 0x55, 0xfb, 0x22, 0x5, + 0xfb, 0x71, 0xfd, 0x12, 0x23, 0xa, 0x40, 0xa, 0xd3, 0xf7, 0xe, 0x1, + 0xf8, 0x57, 0xf9, 0x6, 0x6d, 0xa, 0xa5, 0xf7, 0xe, 0x5, 0xfb, 0x4, + 0x6, 0xfb, 0x66, 0xfb, 0xe, 0x5a, 0xa, 0xa5, 0xf7, 0xe, 0x4c, 0xa, + 0xfb, 0xd0, 0xfd, 0x80, 0x23, 0xa, 0x40, 0xa, 0xf7, 0x7a, 0x77, 0x1, + 0x76, 0x16, 0x20, 0xa, 0xfb, 0x31, 0xf8, 0x44, 0x15, 0xf7, 0xc2, 0x3a, + 0xb2, 0xc5, 0xfb, 0xa7, 0xf7, 0xb, 0x5, 0xe, 0x40, 0xa, 0xba, 0xf7, + 0x5c, 0x1, 0xf7, 0xd1, 0xf9, 0x3f, 0x15, 0x5d, 0xae, 0x67, 0xbf, 0xce, + 0xc7, 0xc1, 0xc9, 0xba, 0x69, 0xb0, 0x57, 0x4d, 0x49, 0x58, 0x48, 0x1e, + 0xce, 0x95, 0x15, 0xa5, 0x9e, 0x9f, 0xa8, 0x9e, 0x9a, 0x7d, 0x79, 0x73, + 0x70, 0x77, 0x75, 0x79, 0x7c, 0x99, 0x9b, 0x1e, 0xfc, 0x29, 0xfd, 0x49, + 0x23, 0xa, 0x40, 0xa, 0xc5, 0x77, 0xf7, 0x3b, 0x77, 0x1, 0xf7, 0x50, + 0xf9, 0x10, 0x15, 0xd6, 0x72, 0x5, 0xae, 0xa1, 0x9c, 0xa5, 0xa6, 0x1b, + 0xa2, 0x9d, 0x7d, 0x7d, 0x9f, 0x1f, 0x7b, 0xa1, 0xa2, 0x7b, 0xaa, 0x1b, + 0xd3, 0xc6, 0xc6, 0xca, 0xa6, 0x1f, 0x3f, 0xa4, 0x5, 0x76, 0x80, 0x75, + 0x61, 0x69, 0x1b, 0x7a, 0x7b, 0x93, 0x96, 0x7b, 0x1f, 0x9c, 0x70, 0x70, + 0xa2, 0x69, 0x1b, 0x3d, 0x55, 0x49, 0x56, 0x73, 0x1f, 0xfb, 0x65, 0xfd, + 0x10, 0x23, 0xa, 0x8b, 0xe6, 0xf7, 0x36, 0xe6, 0xf7, 0x13, 0xe6, 0x12, + 0xf8, 0x64, 0xed, 0x3c, 0xeb, 0x13, 0xf0, 0x77, 0x16, 0xf7, 0xee, 0x6, + 0xf7, 0x17, 0xf4, 0xdc, 0xed, 0x1f, 0x8c, 0xb1, 0x77, 0xaf, 0x6a, 0xa1, + 0x6e, 0x9e, 0x18, 0x13, 0xe8, 0xc8, 0xab, 0xb0, 0xb1, 0xce, 0x1a, 0xc9, + 0x66, 0xd0, 0xfb, 0x1f, 0x1e, 0xfb, 0xc6, 0x36, 0xa, 0xdd, 0x74, 0xa, + 0x39, 0x6, 0xf7, 0x79, 0xf7, 0x91, 0x15, 0xa8, 0xf7, 0x13, 0x5, 0xf7, + 0x20, 0x6, 0xc8, 0xa3, 0x70, 0x71, 0x8c, 0x1f, 0x44, 0x23, 0x88, 0x71, + 0x1e, 0xfb, 0x43, 0xfb, 0x91, 0x15, 0xaa, 0xf7, 0x36, 0x5, 0xf6, 0x6, + 0x13, 0xf0, 0xb3, 0xf7, 0x0, 0x80, 0x4d, 0x4f, 0x38, 0x6e, 0x6d, 0x1f, + 0xe, 0x79, 0xe8, 0xf8, 0x1d, 0xe7, 0x1, 0xa9, 0xec, 0x3, 0xf8, 0x7a, + 0xf7, 0x1e, 0x15, 0x76, 0x65, 0x38, 0x61, 0x39, 0x1b, 0xfb, 0x0, 0x5b, + 0xcb, 0xdb, 0xf7, 0x41, 0xf7, 0x24, 0xd7, 0xe7, 0xc2, 0xbc, 0x77, 0x6f, + 0xb2, 0x1f, 0x76, 0x22, 0x5, 0xea, 0x6, 0xbc, 0xf7, 0x89, 0x7a, 0xa, + 0x83, 0x60, 0x5, 0x96, 0x80, 0x5c, 0xab, 0x34, 0x1b, 0xfb, 0x4d, 0xfb, + 0x39, 0xfb, 0x25, 0xfb, 0x59, 0xfb, 0x2, 0xc0, 0xfb, 0x12, 0xf7, 0x4c, + 0xb4, 0xf7, 0x16, 0x9d, 0xd1, 0xe7, 0x1f, 0xe, 0xfb, 0x4d, 0x76, 0xf7, + 0x56, 0xe5, 0xf8, 0x19, 0xe7, 0x8c, 0x77, 0x12, 0x8b, 0xee, 0x13, 0xe8, + 0xf7, 0x0, 0xfb, 0x46, 0x15, 0x71, 0xa7, 0xa0, 0x89, 0xa0, 0x1b, 0xc9, + 0xca, 0xb5, 0xd5, 0xa1, 0x84, 0xad, 0x64, 0x94, 0x1f, 0x8f, 0x98, 0x5, + 0xe8, 0xd7, 0xba, 0xb3, 0xd7, 0x1f, 0x60, 0xcf, 0x5, 0x72, 0x5b, 0x42, + 0x63, 0x37, 0x1b, 0xfb, 0x1d, 0x75, 0xed, 0xd7, 0xf7, 0x2b, 0xf7, 0x2e, + 0xcb, 0xe0, 0xc1, 0xba, 0x79, 0x70, 0xb0, 0x1f, 0x76, 0x24, 0x5, 0xeb, + 0x6, 0x13, 0xd8, 0xbc, 0xf7, 0x85, 0x7a, 0xa, 0x83, 0x60, 0x5, 0x13, + 0xe8, 0xa4, 0x6f, 0x58, 0x9c, 0x4e, 0x1b, 0xfb, 0x42, 0xfb, 0x4a, 0x25, + 0xfb, 0x84, 0xfb, 0x8, 0xd6, 0x2e, 0xf7, 0x1, 0x7a, 0x1f, 0x70, 0x2e, + 0x5, 0x8e, 0x95, 0x9e, 0x8e, 0x9b, 0x1b, 0x94, 0x95, 0x85, 0x80, 0x7f, + 0x7e, 0x81, 0x7c, 0x80, 0x7d, 0x8f, 0x95, 0x7c, 0x1f, 0xe, 0x3a, 0xa, + 0xf8, 0x78, 0xeb, 0x3, 0x55, 0x16, 0xf7, 0xa2, 0x6, 0xf7, 0x57, 0xf7, + 0x3d, 0xf4, 0xf7, 0x91, 0xf7, 0xc, 0x40, 0xdf, 0xfb, 0x27, 0x1f, 0xfb, + 0xbc, 0x36, 0xa, 0xdf, 0x74, 0xa, 0x38, 0x6, 0xf7, 0x48, 0x16, 0xda, + 0xf8, 0x10, 0x5, 0xf7, 0xb, 0x6, 0xea, 0xb9, 0x59, 0x46, 0xfb, 0x28, + 0x2d, 0xfb, 0x5, 0xfb, 0x1d, 0x1f, 0xe, 0x8b, 0xe6, 0xd6, 0xf7, 0x39, + 0x31, 0xe5, 0xf7, 0x20, 0xe6, 0x12, 0x13, 0xb0, 0x75, 0x16, 0xf8, 0xa4, + 0x6, 0xb5, 0xf7, 0x59, 0x66, 0xa, 0x73, 0x21, 0x5, 0xfb, 0x9a, 0x6, + 0xa9, 0xf7, 0x2a, 0x5, 0xf7, 0x10, 0x6, 0x13, 0xd0, 0x7b, 0x40, 0x56, + 0xa, 0xbc, 0xf7, 0x84, 0x4e, 0xa, 0x7c, 0x40, 0x5, 0xfb, 0xe, 0x6, + 0xa8, 0x97, 0xa, 0xf7, 0x9a, 0x6, 0x76, 0x25, 0x96, 0xa, 0xb3, 0xf7, + 0x55, 0x5, 0xfc, 0xa2, 0x4b, 0xa, 0xd1, 0x74, 0xa, 0x43, 0x6, 0xe, + 0x54, 0xa, 0xf7, 0x7a, 0x77, 0x12, 0x13, 0xb8, 0xf7, 0x99, 0xf8, 0xf3, + 0x15, 0xf7, 0xe4, 0xd5, 0x77, 0xf2, 0xfb, 0xd9, 0xfb, 0xa, 0x5, 0xfb, + 0xa6, 0xfd, 0x2e, 0x28, 0xa, 0x54, 0xa, 0xf7, 0x76, 0x77, 0x12, 0x13, + 0xb8, 0xf7, 0x73, 0xf8, 0xee, 0x15, 0xf7, 0x44, 0xf7, 0x4, 0xf7, 0x13, + 0xfb, 0x4, 0xcf, 0xae, 0xfb, 0x18, 0xf7, 0x23, 0x4e, 0xa, 0xfb, 0x58, + 0xfb, 0x22, 0x5, 0xfb, 0x52, 0xfd, 0x12, 0x28, 0xa, 0x54, 0xa, 0xd4, + 0xf7, 0xd, 0x12, 0x13, 0xb8, 0xf8, 0x34, 0xf9, 0x7, 0x92, 0xa, 0xa5, + 0xf7, 0xd, 0x4c, 0xa, 0xfb, 0x66, 0xfb, 0xd, 0x6d, 0xa, 0xa5, 0xf7, + 0xd, 0x65, 0xa, 0xfb, 0xac, 0xfd, 0x80, 0x28, 0xa, 0x8b, 0xe5, 0xf7, + 0x27, 0xe4, 0xa1, 0x8b, 0x1, 0xdc, 0xea, 0xf7, 0x14, 0xed, 0xbd, 0xeb, + 0x3, 0x75, 0x16, 0x33, 0xa, 0x2a, 0xa, 0xf7, 0x7f, 0xf8, 0xe4, 0x15, + 0xf7, 0xc0, 0x40, 0xb1, 0xc5, 0xfb, 0xa5, 0xf7, 0xb, 0x5, 0xe, 0x8b, + 0xe6, 0xf7, 0x30, 0xce, 0xf7, 0x31, 0xe6, 0x1, 0xf8, 0x86, 0xee, 0x3, + 0x70, 0x16, 0xf7, 0xa2, 0x6, 0xf7, 0x36, 0xf7, 0x54, 0xf3, 0xf7, 0x8f, + 0xf7, 0xd, 0x4c, 0xe1, 0xfb, 0x28, 0x1f, 0xfb, 0xbc, 0x36, 0xa, 0xde, + 0x6, 0x6a, 0xfb, 0x31, 0x5, 0x4d, 0x6, 0x7e, 0x48, 0x5, 0xc8, 0x6, + 0x6b, 0xfb, 0x30, 0x5, 0x38, 0x6, 0xf7, 0x48, 0x16, 0xac, 0xf7, 0x30, + 0x5, 0xf7, 0x12, 0x6, 0x99, 0xce, 0x5, 0xfb, 0x12, 0x6, 0xaa, 0xf7, + 0x31, 0x5, 0xf7, 0xc, 0x6, 0xec, 0xaa, 0x57, 0x44, 0xfb, 0x28, 0x39, + 0xfb, 0x1, 0xfb, 0x33, 0x1f, 0xe, 0x8b, 0xdd, 0xe9, 0xd3, 0xc1, 0xd3, + 0xf5, 0xdd, 0x1, 0xf8, 0x7b, 0xe4, 0x3, 0x77, 0xf7, 0x44, 0x15, 0xe7, + 0x6, 0x23, 0x91, 0xca, 0x43, 0xf7, 0x25, 0x1b, 0xb2, 0xf7, 0x5, 0x9e, + 0xc9, 0xe2, 0x1f, 0x61, 0xc8, 0x5, 0x77, 0x68, 0x47, 0x63, 0x3d, 0x1b, + 0x45, 0x5a, 0xa9, 0xcb, 0x7d, 0x1f, 0xf7, 0x32, 0x6, 0xb2, 0xd3, 0x5, + 0xfb, 0x5d, 0x6, 0x8c, 0x9b, 0x8f, 0xa3, 0x90, 0x99, 0x8, 0xf7, 0x6a, + 0x6, 0xb3, 0xd3, 0x5, 0xfb, 0x71, 0x6, 0xcd, 0xae, 0xc7, 0xb3, 0xdd, + 0x1b, 0xbe, 0xbe, 0x6f, 0x6a, 0x98, 0x1f, 0x7e, 0x48, 0x5, 0xe4, 0x6, + 0xb7, 0xf7, 0x66, 0x5, 0x31, 0x6, 0x81, 0x5c, 0x5, 0xaa, 0x6c, 0x59, + 0x9b, 0x5e, 0x1b, 0xfb, 0x10, 0x22, 0x40, 0xfb, 0x5, 0x55, 0x1f, 0x48, + 0x6, 0x63, 0x43, 0x5, 0xda, 0x6, 0x85, 0x71, 0x89, 0x79, 0x8a, 0x81, + 0x8, 0x54, 0x6, 0xe, 0x8b, 0xe6, 0xdf, 0xf7, 0x2f, 0xf7, 0x21, 0xe6, + 0x1, 0xd8, 0xec, 0xf7, 0x18, 0xed, 0xd5, 0xed, 0x3, 0x75, 0x16, 0xf7, + 0xc7, 0x6, 0x9f, 0xe6, 0x5, 0xfb, 0x17, 0x6, 0xaa, 0xf7, 0x28, 0x5, + 0xf7, 0x6, 0x6, 0x7e, 0x4b, 0x56, 0xa, 0xb9, 0xf7, 0x70, 0x4e, 0xa, + 0x7c, 0x4a, 0x65, 0xa, 0xa9, 0xf7, 0x21, 0x88, 0xa, 0x70, 0xfb, 0x12, + 0x56, 0xa, 0xb9, 0xf7, 0x6d, 0x5, 0xfc, 0xa2, 0x4b, 0xa, 0xda, 0x6, + 0x3b, 0x7d, 0xa, 0x3b, 0x6, 0xe, 0x79, 0xe8, 0xf5, 0xe9, 0xf7, 0x56, + 0xe5, 0x1, 0x9f, 0xee, 0x3, 0xf7, 0xa7, 0xf7, 0x49, 0x15, 0xf7, 0x32, + 0x6, 0x7c, 0x3f, 0x5, 0x78, 0x65, 0x56, 0x80, 0x58, 0x1b, 0x3a, 0x3f, + 0xb1, 0xeb, 0xf7, 0x33, 0xf7, 0xc, 0xf4, 0xf7, 0x9, 0xc9, 0xaa, 0x87, + 0x6d, 0xb9, 0x1f, 0x77, 0x2d, 0x96, 0xa, 0xba, 0xf7, 0x6e, 0x66, 0xa, + 0x82, 0x65, 0x5, 0xa1, 0x71, 0x62, 0x9b, 0x41, 0x1b, 0xfb, 0x38, 0xfb, + 0x50, 0xfb, 0x23, 0xfb, 0x64, 0xfb, 0x2b, 0xf7, 0x1, 0x3c, 0xf7, 0x1f, + 0xeb, 0xf7, 0x5, 0xb6, 0x94, 0xa3, 0x1f, 0xa7, 0xf7, 0x27, 0x5, 0xba, + 0x55, 0xa, 0xfb, 0xc1, 0x6, 0xe, 0x79, 0xe2, 0x8b, 0xee, 0xa6, 0xe3, + 0x70, 0xcd, 0xf7, 0x70, 0xcd, 0x12, 0x8b, 0xee, 0x13, 0xec, 0xf7, 0x93, + 0xf7, 0x3c, 0x15, 0xf7, 0x32, 0x6, 0x7c, 0x44, 0x5, 0x7a, 0x67, 0x59, + 0x80, 0x5a, 0x1b, 0x37, 0x3b, 0xac, 0xe8, 0xf7, 0x29, 0xf7, 0xc, 0xf7, + 0x4, 0xf7, 0x9, 0xc9, 0xaa, 0x78, 0x6f, 0xb9, 0x1f, 0x13, 0xdc, 0x77, + 0x34, 0x96, 0xa, 0xba, 0xf7, 0x70, 0x66, 0xa, 0x82, 0x60, 0x5, 0xa2, + 0x67, 0x6c, 0x9f, 0x41, 0x1b, 0xfb, 0x42, 0xfb, 0x46, 0xfb, 0x2a, 0xfb, + 0x57, 0xfb, 0x21, 0xf7, 0x1, 0x41, 0xf7, 0x1f, 0xeb, 0xf7, 0x5, 0xb3, + 0x94, 0xa3, 0x1f, 0xa7, 0xf7, 0x1d, 0x5, 0xba, 0x6, 0x9f, 0xe3, 0x5, + 0xfb, 0xc1, 0x6, 0xab, 0xf7, 0xf4, 0x48, 0xa, 0x8b, 0xe6, 0xf7, 0x23, + 0xe6, 0xf7, 0x26, 0xe6, 0x1, 0xc4, 0xe9, 0xf7, 0x72, 0xea, 0x3, 0x64, + 0x16, 0xf7, 0x90, 0x34, 0xa, 0x3a, 0x6, 0xa8, 0xf7, 0x23, 0x5, 0xf7, + 0x72, 0x6, 0x6e, 0xfb, 0x23, 0x5, 0x3b, 0x6, 0x79, 0x30, 0x5, 0xf7, + 0x8f, 0x34, 0xa, 0x3e, 0x6, 0xd7, 0xf8, 0x10, 0x5, 0xd9, 0x42, 0xa, + 0xfb, 0x8f, 0x36, 0xa, 0xdb, 0x6, 0x6d, 0xfb, 0x26, 0x5, 0xfb, 0x72, + 0x6, 0xa9, 0xf7, 0x26, 0x5, 0xdc, 0x6, 0x9d, 0xe6, 0x5, 0xfb, 0x90, + 0x36, 0xa, 0xd8, 0x6, 0x3f, 0x7d, 0xa, 0x3d, 0x6, 0xe, 0x3a, 0xa, + 0xf7, 0x67, 0xf0, 0x3, 0x9c, 0x16, 0xf8, 0x54, 0x6, 0x9f, 0xe6, 0x5, + 0xfb, 0x41, 0x6, 0xdb, 0xf8, 0x10, 0x5, 0xf7, 0x3f, 0x34, 0xa, 0xfc, + 0x51, 0x36, 0xa, 0xf7, 0x41, 0x6, 0x3b, 0xfc, 0x10, 0x43, 0xa, 0x79, + 0xe6, 0xf8, 0x22, 0xe6, 0x1, 0x41, 0x79, 0x15, 0xf7, 0xaa, 0x6, 0x9f, + 0xe6, 0x5, 0x2e, 0x6, 0xdb, 0xf8, 0x22, 0x5, 0xe6, 0x34, 0xa, 0xfb, + 0xa7, 0x36, 0xa, 0xde, 0x6, 0x3b, 0xfc, 0x22, 0x5, 0x36, 0x6, 0xf7, + 0xd3, 0x72, 0x15, 0x76, 0xa2, 0xa4, 0x5e, 0xe9, 0x1b, 0xf7, 0x1e, 0x87, + 0x8c, 0xa, 0xac, 0x5b, 0xa, 0xfb, 0xa6, 0x6, 0x79, 0x2f, 0x5, 0xf7, + 0x25, 0x6, 0x53, 0xfb, 0xa8, 0x5, 0x40, 0x7c, 0x84, 0x5c, 0x5e, 0x1b, + 0x73, 0x83, 0x97, 0x9e, 0x9d, 0x91, 0xa3, 0x91, 0xa4, 0x1f, 0xa1, 0xec, + 0x4e, 0xa, 0xe, 0x68, 0xa, 0xf7, 0x90, 0xf8, 0xf3, 0x15, 0xf7, 0xde, + 0xd5, 0x78, 0xf2, 0xfb, 0xd3, 0xfb, 0xa, 0x5, 0xfb, 0x77, 0xfd, 0x2e, + 0x15, 0x2b, 0xa, 0xe, 0x75, 0xa, 0xf7, 0x76, 0x77, 0x62, 0xa, 0xf7, + 0x6b, 0xf8, 0xf0, 0x15, 0xf7, 0x49, 0xf7, 0x2, 0xf7, 0xa, 0xfb, 0x2, + 0xcf, 0xae, 0xfb, 0x16, 0xf7, 0x21, 0x66, 0xa, 0xfb, 0x56, 0xfb, 0x20, + 0x5, 0xfb, 0x24, 0xfd, 0x14, 0x15, 0x2b, 0xa, 0xe, 0x75, 0xa, 0xd2, + 0xf7, 0xf, 0x62, 0xa, 0xf8, 0x34, 0xf9, 0x5, 0x4a, 0xa, 0xfb, 0x69, + 0xfb, 0xf, 0x4a, 0xa, 0xfb, 0x84, 0xfd, 0x80, 0x15, 0x2b, 0xa, 0xe, + 0x8b, 0xe3, 0xf8, 0x2, 0xe3, 0xde, 0xf7, 0xf, 0x62, 0xa, 0xf7, 0xca, + 0xf9, 0x5, 0x4a, 0xa, 0xfb, 0xd4, 0xfd, 0x80, 0x15, 0xf8, 0x55, 0x6, + 0x9e, 0xe3, 0x5, 0xfb, 0x40, 0x6, 0xdb, 0xf8, 0x2, 0x5, 0xf7, 0x3e, + 0x6, 0x9e, 0xe3, 0x5, 0xfc, 0x51, 0x6, 0x78, 0x33, 0x5, 0xf7, 0x41, + 0x6, 0x3b, 0xfc, 0x2, 0x43, 0xa, 0x68, 0xa, 0x9c, 0x16, 0x2b, 0xa, + 0xf7, 0x56, 0xf8, 0xe6, 0x15, 0xf7, 0xc5, 0x3e, 0xb3, 0xc5, 0xfb, 0xac, + 0xf7, 0xb, 0x5, 0xe, 0x79, 0xe5, 0xf8, 0x22, 0xe7, 0x1, 0x9a, 0xed, + 0xf7, 0x73, 0xe8, 0x3, 0x6d, 0xbb, 0x15, 0x76, 0xa2, 0xf7, 0xa, 0x5e, + 0xe9, 0x1b, 0xf7, 0x1e, 0xc8, 0x8c, 0xa, 0xf7, 0x11, 0x5b, 0xa, 0xfc, + 0x29, 0x6, 0x79, 0x2f, 0x5, 0xf7, 0x4c, 0x6, 0x53, 0xfb, 0xa8, 0x5, + 0x40, 0x7c, 0x67, 0x5c, 0x3a, 0x1b, 0x45, 0x50, 0xa1, 0xd7, 0x9b, 0x1f, + 0xa1, 0xec, 0x4e, 0xa, 0xe, 0x3a, 0xa, 0xcf, 0xed, 0xf7, 0x8e, 0xf7, + 0x17, 0x3, 0x68, 0x16, 0xf7, 0x9d, 0x34, 0xa, 0x38, 0x6, 0xa0, 0xf0, + 0xd1, 0xc0, 0x9f, 0x70, 0xa1, 0x66, 0x9a, 0x71, 0x19, 0xa6, 0x56, 0xa6, + 0x58, 0x9b, 0x58, 0x8, 0xf7, 0x34, 0x34, 0xa, 0x20, 0x6, 0x7b, 0xb7, + 0x76, 0xa6, 0x75, 0xb5, 0x7e, 0xa8, 0x66, 0xc0, 0x80, 0x9c, 0xf7, 0x67, + 0xf7, 0x3c, 0x18, 0xd0, 0x34, 0xa, 0xfb, 0x87, 0x6e, 0xa, 0xb7, 0x6, + 0xfb, 0x61, 0xfb, 0x36, 0xae, 0xf7, 0x36, 0x5, 0xdd, 0x34, 0xa, 0xfb, + 0x9c, 0x6e, 0xa, 0xdf, 0x74, 0xa, 0x37, 0x6, 0xe, 0x3a, 0xa, 0xf7, + 0xf, 0xed, 0x3, 0x8d, 0x16, 0xf8, 0xb4, 0x6, 0xbf, 0xf7, 0x92, 0x5, + 0x27, 0x6, 0x6b, 0xfb, 0x37, 0x5, 0xfb, 0x89, 0x6, 0xdd, 0xf8, 0x10, + 0x5, 0xf7, 0x14, 0x34, 0xa, 0xfb, 0xdd, 0x36, 0xa, 0xf0, 0x6, 0x3b, + 0x7d, 0xa, 0x26, 0x6, 0xe, 0x3a, 0xa, 0xf7, 0xe, 0xed, 0x3, 0x8d, + 0x16, 0xf8, 0xb1, 0x6, 0xc2, 0xf7, 0x9c, 0x7b, 0xa, 0x66, 0xfb, 0x41, + 0x5, 0xfb, 0x86, 0x6, 0xae, 0xf7, 0x37, 0xf7, 0x34, 0xb4, 0x9a, 0xc9, + 0xfb, 0x36, 0x63, 0xac, 0xf7, 0x2e, 0x5, 0xf7, 0x14, 0x34, 0xa, 0xfb, + 0xdc, 0x36, 0xa, 0xf0, 0x6, 0x66, 0xfb, 0x47, 0x30, 0x74, 0x7f, 0x4b, + 0xe4, 0xa2, 0x6e, 0xfb, 0x1d, 0x5, 0x26, 0x6, 0xe, 0x3a, 0xa, 0x4e, + 0x16, 0xf7, 0x77, 0x34, 0xa, 0x3e, 0x6, 0xda, 0xf7, 0xce, 0xc5, 0xfb, + 0xac, 0x5, 0xc7, 0x6, 0xf7, 0x2b, 0xf7, 0xa4, 0x5b, 0xfb, 0xc6, 0x5, + 0x41, 0x6, 0x7a, 0x30, 0x5, 0xf7, 0x71, 0x42, 0xa, 0x55, 0x6, 0xc9, + 0xf8, 0x10, 0x5, 0xdb, 0x42, 0xa, 0xfb, 0x61, 0x6, 0xfb, 0x32, 0xfb, + 0xb6, 0x5b, 0xf7, 0xb6, 0x5, 0xfb, 0x5f, 0x4b, 0xa, 0xd7, 0x6, 0x2e, + 0x7d, 0xa, 0x53, 0x6, 0xe, 0x7f, 0xe8, 0xf8, 0x18, 0xe8, 0x1, 0x4f, + 0x7f, 0x15, 0xf7, 0xa4, 0x94, 0xa, 0x28, 0x6, 0xc9, 0xf7, 0xd1, 0xf7, + 0x4a, 0xfc, 0x2e, 0x5, 0xe7, 0x6, 0xeb, 0xf8, 0x75, 0x6c, 0xa, 0xea, + 0x6, 0x4e, 0xfb, 0xd0, 0xfb, 0x3e, 0xf8, 0x2d, 0x7e, 0xa, 0xfc, 0x18, + 0x5, 0x3c, 0x6, 0xe, 0x7f, 0xe7, 0xf8, 0x13, 0xe8, 0xc1, 0xe0, 0x73, + 0xdf, 0x8f, 0x77, 0x12, 0x13, 0xd0, 0x4f, 0x7f, 0x15, 0xf7, 0xa5, 0x5b, + 0xa, 0x27, 0x6, 0xca, 0xf7, 0xcd, 0xf7, 0x4c, 0xfc, 0x29, 0x5, 0xe5, + 0x6, 0xea, 0xf8, 0x6f, 0x6c, 0xa, 0xeb, 0x6, 0x4e, 0xfb, 0xc6, 0xfb, + 0x3e, 0xf8, 0x23, 0x7e, 0xa, 0xfc, 0x13, 0x5, 0x3b, 0x6, 0xf7, 0x62, + 0xf8, 0xbe, 0x15, 0xdb, 0x72, 0x5, 0xae, 0xa0, 0x9e, 0xa6, 0xa7, 0x1b, + 0xa6, 0xa0, 0x79, 0x7b, 0xa3, 0x1f, 0x13, 0xe8, 0x7d, 0xa0, 0xa1, 0x7e, + 0xa8, 0x1b, 0xd6, 0xca, 0xc7, 0xcb, 0xa6, 0x1f, 0x3c, 0xa4, 0x5, 0x76, + 0x7f, 0x74, 0x60, 0x67, 0x1b, 0x77, 0x79, 0x95, 0x98, 0x78, 0x1f, 0x13, + 0xd0, 0x9c, 0x72, 0x70, 0x9f, 0x6a, 0x1b, 0x39, 0x52, 0x48, 0x55, 0x71, + 0x1f, 0xe, 0x79, 0xe7, 0xf8, 0x1f, 0xe9, 0x1, 0xa2, 0xf1, 0xf7, 0xff, + 0xec, 0x3, 0xa2, 0xf7, 0x57, 0x15, 0xfb, 0x24, 0xf3, 0x46, 0xf7, 0x6, + 0xf7, 0x4f, 0xf7, 0x31, 0xf7, 0xe, 0xf7, 0x8d, 0xf7, 0xb, 0x45, 0xe6, + 0xfb, 0x2d, 0xfb, 0x5d, 0xfb, 0x1e, 0xfb, 0x49, 0xfb, 0x4f, 0x1e, 0xf1, + 0x9a, 0x15, 0xf7, 0xc, 0xd4, 0xf7, 0x1f, 0xf7, 0x24, 0xf7, 0x0, 0xb1, + 0x4d, 0x46, 0x23, 0x3e, 0xfb, 0x34, 0xfb, 0x2c, 0x2f, 0x61, 0xc9, 0xd5, + 0x1e, 0xe, 0x8b, 0xe6, 0x30, 0xf7, 0x3d, 0xa4, 0xf7, 0x4f, 0x92, 0xf7, + 0x42, 0x30, 0xe6, 0x12, 0x66, 0xea, 0x13, 0xac, 0xf7, 0xe2, 0xe6, 0x15, + 0xaa, 0xf7, 0x2b, 0x5, 0xaf, 0x6, 0x81, 0x58, 0x5, 0xd4, 0x6, 0xb1, + 0xf7, 0x4f, 0x5, 0x41, 0x6, 0x83, 0x5d, 0x5, 0x65, 0x6, 0xa7, 0xf7, + 0x1f, 0x5, 0xf7, 0x1a, 0x6, 0x13, 0xb4, 0x7b, 0x38, 0x5, 0xd5, 0x6, + 0xae, 0xf7, 0x42, 0x5, 0xfc, 0x10, 0x6, 0xfb, 0x1e, 0xfb, 0x30, 0xfb, + 0xf, 0xfb, 0x7a, 0xfb, 0x1c, 0xe2, 0x42, 0xe4, 0x1f, 0xf8, 0x16, 0x6, + 0x13, 0x74, 0xae, 0xf7, 0x3d, 0x5, 0x40, 0x6, 0x13, 0xac, 0x7a, 0x3d, + 0x5, 0xfc, 0x2e, 0xf7, 0x25, 0x15, 0xf7, 0x8, 0xed, 0xf7, 0xb, 0xf6, + 0x99, 0xb2, 0x8a, 0x66, 0x84, 0x1e, 0x50, 0xfb, 0xb9, 0x5, 0x5c, 0x82, + 0x67, 0x89, 0x7a, 0x1b, 0x30, 0x64, 0xc3, 0xe4, 0x1f, 0xe, 0x77, 0xa, + 0xf7, 0x71, 0x77, 0x58, 0xa, 0xf7, 0x8d, 0xf8, 0xf0, 0x15, 0xf7, 0xe4, + 0xd8, 0x76, 0xf2, 0xfb, 0xd7, 0xfb, 0xd, 0x5, 0xfb, 0x72, 0xfc, 0x61, + 0x24, 0xa, 0x77, 0xa, 0xf7, 0x6d, 0x77, 0x58, 0xa, 0xf7, 0x3f, 0xf9, + 0x13, 0x15, 0xc0, 0x66, 0xf7, 0x46, 0xf3, 0xf7, 0xa, 0x22, 0xcc, 0xaf, + 0xfb, 0x14, 0xf7, 0x23, 0x5, 0x2c, 0x6, 0xfb, 0xeb, 0xfc, 0xd6, 0x24, + 0xa, 0x77, 0xa, 0xc9, 0xf7, 0xf, 0x58, 0xa, 0xf8, 0x38, 0xf9, 0x5, + 0x5a, 0xa, 0xa4, 0xf7, 0xf, 0x4c, 0xa, 0xfb, 0x65, 0xfb, 0xf, 0x5a, + 0xa, 0xa5, 0xf7, 0xf, 0x5, 0xfb, 0x4, 0x6, 0xfb, 0x88, 0xfc, 0xb6, + 0x24, 0xa, 0x79, 0xe4, 0xf8, 0x21, 0xe6, 0x1, 0x9e, 0xf1, 0xf7, 0xee, + 0xed, 0x3, 0xf7, 0x81, 0xf9, 0x3d, 0x15, 0xf7, 0xc2, 0x40, 0xb2, 0xc5, + 0xfb, 0xa7, 0xf7, 0xc, 0x5, 0xfb, 0xb0, 0xfc, 0xda, 0x24, 0xa, 0x7c, + 0xe6, 0x3e, 0x76, 0xf8, 0x93, 0xe6, 0x8f, 0x77, 0x12, 0x97, 0xf2, 0xf8, + 0x5, 0xeb, 0x13, 0x6c, 0x7f, 0xa7, 0x15, 0xbf, 0x59, 0xc1, 0xbf, 0x5, + 0x13, 0x9c, 0x6d, 0xb5, 0xbe, 0x7c, 0xbf, 0x1b, 0xf7, 0x62, 0xf7, 0x1c, + 0xf7, 0x2c, 0xf7, 0x7b, 0x8a, 0x1f, 0xb2, 0x81, 0xb0, 0x7a, 0xac, 0x1e, + 0xc6, 0xc6, 0x57, 0xbb, 0x56, 0x58, 0x5, 0x13, 0xac, 0xa9, 0x68, 0x59, + 0x9c, 0x4c, 0x1b, 0xfb, 0x92, 0x2e, 0xfb, 0x6e, 0xfb, 0x2f, 0x5b, 0x97, + 0x62, 0x9e, 0x6a, 0x1f, 0xdd, 0xda, 0x15, 0x83, 0x9e, 0x88, 0xa5, 0x8c, + 0xa5, 0x8, 0xf7, 0x3, 0xe4, 0xf7, 0x23, 0xf7, 0x1b, 0xb3, 0xaa, 0x80, + 0x7a, 0xa1, 0x1e, 0xfb, 0x9b, 0xfb, 0xfa, 0x15, 0xf7, 0xc4, 0xf7, 0xbd, + 0x5, 0x93, 0x78, 0x8e, 0x74, 0x74, 0x1a, 0x27, 0x41, 0xfb, 0x33, 0xfb, + 0x2d, 0x67, 0x6c, 0x95, 0x9c, 0x76, 0x1e, 0xe, 0x77, 0xa, 0xbb, 0xdf, + 0xcb, 0x77, 0x58, 0xa, 0xf7, 0x2c, 0xf9, 0xf, 0x15, 0xd9, 0x71, 0xa0, + 0xaf, 0x9d, 0xa6, 0xa6, 0x8a, 0x19, 0xa4, 0x8a, 0x9e, 0x80, 0x9b, 0x80, + 0x8, 0x7a, 0xa3, 0xa0, 0x77, 0xaf, 0x1b, 0xd5, 0xc6, 0xc6, 0xcb, 0xa6, + 0x1f, 0x3f, 0xa4, 0x5, 0x76, 0x80, 0x73, 0x60, 0x69, 0x1b, 0x74, 0x7a, + 0x9a, 0x9a, 0x76, 0x1f, 0x9a, 0x77, 0x73, 0x9a, 0x68, 0x1b, 0x3c, 0x53, + 0x48, 0x56, 0x72, 0x1f, 0xfb, 0x19, 0xfc, 0x45, 0x24, 0xa, 0x8b, 0xe7, + 0xe5, 0xe6, 0xf7, 0x59, 0xe7, 0x1, 0xf8, 0x7d, 0xed, 0x3, 0x84, 0x16, + 0xf7, 0xca, 0x5b, 0xa, 0xfb, 0x15, 0x46, 0xa, 0xf7, 0x11, 0x6, 0xf7, + 0x3b, 0xdf, 0xe6, 0xf7, 0x16, 0x1f, 0xf3, 0x8a, 0x3a, 0xc2, 0xfb, 0xa, + 0x1b, 0xfb, 0xa8, 0x6, 0x78, 0x2f, 0x5, 0xde, 0x6, 0x3b, 0xfc, 0xe, + 0x5, 0x38, 0x6, 0xf7, 0x6f, 0xf7, 0x49, 0x15, 0xb3, 0xf7, 0x59, 0x5, + 0xeb, 0x6, 0xc5, 0xcb, 0x73, 0x51, 0x20, 0x2b, 0x83, 0x3d, 0x1f, 0xe, + 0xfb, 0x9, 0x76, 0xc1, 0xf7, 0x40, 0xf8, 0x11, 0xe6, 0x1, 0xba, 0xec, + 0xf7, 0xfd, 0xe9, 0x3, 0xd7, 0x45, 0x15, 0xa8, 0x47, 0x5, 0xab, 0xcb, + 0xa8, 0xa1, 0xaf, 0x1b, 0xa7, 0xa1, 0x7e, 0x7e, 0xa2, 0x1f, 0x7f, 0xa1, + 0xa1, 0x80, 0xa7, 0x1b, 0xc3, 0xac, 0xa6, 0xb8, 0xc3, 0x1f, 0x5f, 0xca, + 0x5, 0x67, 0x60, 0x7c, 0x83, 0x78, 0x1b, 0x73, 0x76, 0x9b, 0xa2, 0x6f, + 0x1f, 0xf7, 0x3f, 0xb5, 0xed, 0xf7, 0x28, 0xf7, 0x27, 0x1a, 0xeb, 0x5e, + 0xf7, 0x16, 0xfb, 0x3d, 0xfb, 0x37, 0xfb, 0x43, 0xfb, 0x11, 0xfb, 0x6c, + 0xfb, 0x7, 0xbd, 0x48, 0xd4, 0x73, 0x1e, 0x69, 0x62, 0x5, 0x93, 0xf7, + 0x95, 0x15, 0xf7, 0x3b, 0xf7, 0x22, 0xd4, 0xdb, 0xec, 0xb5, 0x40, 0x3a, + 0xfb, 0x13, 0xfb, 0x1c, 0x29, 0x37, 0x47, 0x42, 0xb0, 0xf3, 0x1e, 0xe, + 0x8b, 0xe7, 0xf7, 0xe, 0xe7, 0xf7, 0x38, 0xe7, 0x1, 0xf5, 0xed, 0xf7, + 0xb8, 0xee, 0x3, 0x8e, 0x16, 0xf7, 0x98, 0x5b, 0xa, 0x3d, 0x6, 0xa4, + 0xf7, 0xe, 0x5, 0xdd, 0x6, 0xd2, 0xfb, 0x2, 0x9d, 0x6a, 0x9b, 0x67, + 0x95, 0x68, 0x19, 0xf7, 0x22, 0x5b, 0xa, 0x3c, 0x6, 0x2e, 0x97, 0xa, + 0xf7, 0xa, 0x9d, 0xc9, 0xdf, 0xe6, 0x1a, 0xe9, 0x3b, 0xb6, 0x26, 0x1e, + 0xfb, 0xb5, 0x6, 0x78, 0x2f, 0x8a, 0xa, 0x3b, 0xfc, 0xe, 0x5, 0x37, + 0x6, 0xf7, 0x77, 0xf7, 0x6a, 0x15, 0xad, 0xf7, 0x38, 0x5, 0xf7, 0x18, + 0x6, 0xa2, 0xc5, 0x83, 0x5b, 0x2c, 0x25, 0x7e, 0x59, 0x1f, 0xe, 0x75, + 0xe9, 0xf8, 0x34, 0xe9, 0x12, 0xeb, 0xf6, 0xf7, 0x81, 0xf4, 0x13, 0xe0, + 0x82, 0x75, 0x15, 0xf2, 0x6, 0x95, 0xba, 0x5, 0x80, 0x9a, 0xdb, 0x67, + 0xd2, 0x1b, 0x13, 0x70, 0xf7, 0x41, 0xf1, 0xc3, 0xf7, 0x1e, 0xf7, 0x3, + 0xfb, 0x1c, 0x99, 0x33, 0x9d, 0x1f, 0x4c, 0x98, 0x54, 0xac, 0xb4, 0x1a, + 0xc7, 0xca, 0xa5, 0xee, 0xb6, 0xb1, 0x76, 0x7b, 0xac, 0x1e, 0x13, 0xe0, + 0x79, 0x33, 0x5, 0xf2, 0x6, 0xb8, 0xf7, 0x6f, 0x5, 0x24, 0x6, 0x85, + 0x69, 0x5, 0x9b, 0x69, 0x55, 0x9d, 0x5f, 0x1b, 0xfb, 0x45, 0x2c, 0x41, + 0xfb, 0xc, 0x34, 0xf0, 0x4d, 0xea, 0x81, 0x1f, 0xc1, 0x84, 0xe9, 0x81, + 0x55, 0x1a, 0x58, 0x4c, 0x68, 0xfb, 0x0, 0x54, 0x5b, 0xa5, 0xa4, 0x61, + 0x1e, 0x9a, 0xcf, 0x5, 0x24, 0x6, 0xe, 0x75, 0xe6, 0xf8, 0x2b, 0xe6, + 0x1, 0xe4, 0xef, 0xf7, 0x6e, 0xee, 0x3, 0x82, 0x75, 0x15, 0xec, 0x6, + 0x95, 0xb9, 0x5, 0x79, 0x9f, 0xbc, 0x6f, 0xd8, 0x1b, 0xf7, 0x3a, 0xeb, + 0xcb, 0xf7, 0x3, 0xf7, 0x2, 0x41, 0xa5, 0x31, 0x98, 0x1f, 0x62, 0x90, + 0xfb, 0x4, 0x95, 0xcd, 0x1a, 0xb5, 0xcd, 0xbe, 0xe1, 0xb2, 0xae, 0x75, + 0x7c, 0xaa, 0x1e, 0x7c, 0x36, 0x96, 0xa, 0xb5, 0xf7, 0x69, 0x7a, 0xa, + 0x84, 0x69, 0x5, 0x9a, 0x6b, 0x66, 0x9e, 0x61, 0x1b, 0xfb, 0x36, 0x22, + 0x3c, 0xfb, 0x13, 0x31, 0xdb, 0x65, 0xdb, 0x82, 0x1f, 0xbf, 0x86, 0xf5, + 0x83, 0x51, 0x1a, 0x59, 0x45, 0x69, 0x35, 0x56, 0x64, 0x99, 0xb0, 0x62, + 0x1e, 0x97, 0xcb, 0x7a, 0xa, 0xf7, 0xb1, 0xf8, 0x3c, 0x48, 0xa, 0xa1, + 0xf7, 0x57, 0xf7, 0xaa, 0xe2, 0x1, 0xea, 0xf6, 0xf7, 0x7d, 0xf4, 0x3, + 0xf7, 0x42, 0x2f, 0x15, 0x8e, 0x96, 0xa0, 0x8f, 0x9e, 0x1b, 0x94, 0x96, + 0x84, 0x7f, 0x7e, 0x7c, 0x80, 0x7b, 0x7f, 0x7b, 0x8f, 0x96, 0x7a, 0x1f, + 0x59, 0x4c, 0x5, 0x6f, 0xab, 0xa2, 0x89, 0xa2, 0x1b, 0xd1, 0xd1, 0xb9, + 0xdc, 0xa4, 0x83, 0xb0, 0x60, 0x95, 0x1f, 0x95, 0xa8, 0x5, 0xf7, 0x30, + 0x93, 0xe3, 0xc6, 0xee, 0x1a, 0xf4, 0x3c, 0xa4, 0x2b, 0x97, 0x1e, 0x5f, + 0x90, 0xfb, 0xb, 0x94, 0xca, 0x1a, 0xb4, 0xd3, 0xba, 0xe6, 0xb4, 0xb1, + 0x76, 0x7d, 0xac, 0x1e, 0x7a, 0x3b, 0x5, 0xf2, 0x6, 0xb9, 0xf7, 0x5e, + 0x5, 0x25, 0x6, 0x84, 0x6b, 0x5, 0x99, 0x68, 0x64, 0x9d, 0x5e, 0x1b, + 0xfb, 0x40, 0xfb, 0x6, 0x40, 0xfb, 0xc, 0x35, 0xe0, 0x67, 0xe1, 0x82, + 0x1f, 0xc2, 0x86, 0xf7, 0x6, 0x83, 0x54, 0x1a, 0x5b, 0x40, 0x6b, 0x2f, + 0x53, 0x61, 0x98, 0xae, 0x60, 0x1e, 0x97, 0xc8, 0x5, 0x25, 0x6, 0x5d, + 0xfb, 0x58, 0x5, 0xf2, 0x6, 0x96, 0xb6, 0x9c, 0x7e, 0xad, 0x78, 0xc0, + 0x83, 0x19, 0xe, 0x3a, 0xa, 0xc6, 0x16, 0xf7, 0xf3, 0x34, 0xa, 0xfb, + 0x12, 0x6, 0xd9, 0xf8, 0x10, 0x5, 0xf7, 0x14, 0x6, 0x75, 0xfb, 0x5, + 0x56, 0xa, 0xb4, 0xf7, 0x60, 0x5, 0xfc, 0xbb, 0x6, 0x62, 0xfb, 0x60, + 0x96, 0xa, 0xa3, 0xf7, 0x5, 0x5, 0xf7, 0x15, 0x6, 0x3d, 0x7d, 0xa, + 0xfb, 0x15, 0x6, 0xe, 0x8b, 0xe6, 0xb4, 0xe5, 0xf7, 0x9, 0xe5, 0xb5, + 0xe6, 0x1, 0xf7, 0x26, 0xe0, 0xf7, 0xa0, 0xe1, 0x3, 0x99, 0x16, 0xf7, + 0xd4, 0x6, 0x9c, 0xe6, 0x5, 0xfb, 0xc, 0x6, 0x92, 0xb4, 0x5, 0xf7, + 0x9, 0x6, 0xf7, 0x14, 0xf1, 0xaf, 0xf7, 0x28, 0xe6, 0x45, 0xa1, 0x36, + 0x1f, 0xfb, 0x1e, 0x6, 0x92, 0xb5, 0x5, 0xf7, 0xf, 0x6, 0x9b, 0xe6, + 0x5, 0xfb, 0xd4, 0x6, 0x7a, 0x30, 0x5, 0xf7, 0x6, 0x6, 0x46, 0x7d, + 0xa, 0xfb, 0x7, 0x6, 0xf7, 0x73, 0xf7, 0x17, 0x15, 0xa1, 0xf7, 0x9, + 0x5, 0xf7, 0x10, 0x6, 0xaa, 0xcf, 0x8a, 0x60, 0x3c, 0x38, 0x91, 0x6c, + 0x1f, 0xe, 0x79, 0xe7, 0xf8, 0x20, 0xe7, 0x1, 0xd6, 0xea, 0xf7, 0x8a, + 0xea, 0x3, 0x84, 0xf8, 0x6a, 0x15, 0xdd, 0x6, 0x54, 0xfb, 0xa3, 0x5, + 0x87, 0x77, 0x88, 0x79, 0x7a, 0x1a, 0xfb, 0x1, 0x8c, 0xc2, 0x56, 0xf7, + 0x12, 0x1b, 0xf7, 0x15, 0xf1, 0xc3, 0xf7, 0x2e, 0xab, 0x1f, 0xc0, 0xf7, + 0xaa, 0x5c, 0xa, 0x9d, 0xe7, 0x5, 0xfb, 0xa0, 0x6, 0x78, 0x2f, 0x5, + 0xeb, 0x6, 0x57, 0xfb, 0x9b, 0x5, 0x35, 0x7a, 0x6a, 0x5c, 0x25, 0x1b, + 0x35, 0x7a, 0xaf, 0xb4, 0x8a, 0x1f, 0x98, 0x8e, 0x98, 0x8d, 0x98, 0x1e, + 0xc4, 0xf7, 0xac, 0x5, 0xe9, 0x5b, 0xa, 0xfb, 0xa4, 0x6, 0xe, 0x79, + 0xa, 0xf7, 0x7e, 0x77, 0x59, 0xa, 0xf7, 0x61, 0xf8, 0xf0, 0x15, 0xf7, + 0xdc, 0xd7, 0x77, 0xf3, 0xfb, 0xd0, 0xfb, 0xd, 0x8f, 0xa, 0xfb, 0x5f, + 0x25, 0xa, 0xe, 0x79, 0xa, 0xf7, 0x7a, 0x77, 0x59, 0xa, 0xf7, 0x3a, + 0xf8, 0xed, 0x15, 0xf7, 0x41, 0xf5, 0xf7, 0x11, 0x21, 0xcd, 0xaf, 0xfb, + 0x15, 0xf7, 0x23, 0x5, 0x2c, 0x6, 0xfb, 0x55, 0xfb, 0x22, 0x5, 0x31, + 0xfb, 0x46, 0x25, 0xa, 0xe, 0x79, 0xa, 0xd6, 0xf7, 0xf, 0x59, 0xa, + 0xf7, 0xf8, 0xf9, 0x5, 0x15, 0xf7, 0x1, 0x6, 0xa5, 0xf7, 0xf, 0x86, + 0xa, 0xfb, 0x62, 0xfb, 0xf, 0x15, 0xf7, 0x2, 0x6, 0xa6, 0xf7, 0xf, + 0x86, 0xa, 0xfb, 0x47, 0xfb, 0xb4, 0x25, 0xa, 0xe, 0x79, 0xa, 0x59, + 0xa, 0xa2, 0xf8, 0x60, 0x25, 0xa, 0xf7, 0x1a, 0xf7, 0x17, 0x15, 0xf7, + 0xbb, 0x3e, 0xb0, 0xc5, 0xfb, 0xa0, 0xf7, 0xe, 0x5, 0xe, 0xf8, 0x6b, + 0xe6, 0x1, 0xf7, 0x2b, 0xec, 0xf7, 0x55, 0xe9, 0x3, 0xf7, 0x2b, 0x89, + 0x15, 0xec, 0x6, 0xf7, 0xb3, 0xf8, 0x6d, 0x5, 0xd1, 0x34, 0xa, 0xfb, + 0x96, 0x36, 0xa, 0xe9, 0x6, 0xfb, 0x6a, 0xfc, 0x0, 0x40, 0xf8, 0x0, + 0x5, 0xdc, 0x34, 0xa, 0xfb, 0x95, 0x36, 0xa, 0xd8, 0x6, 0xe, 0xa0, + 0x76, 0xf8, 0x5e, 0x77, 0xac, 0xe6, 0x1, 0x93, 0xed, 0x3, 0x84, 0x16, + 0xdd, 0x6, 0xf7, 0x49, 0xf7, 0xc6, 0xc3, 0xfb, 0xc6, 0x5, 0xdd, 0x6, + 0xf7, 0x39, 0xf8, 0x6b, 0x5, 0xbc, 0x34, 0xa, 0xfb, 0x82, 0x36, 0xa, + 0xec, 0x6, 0x2e, 0xfb, 0xab, 0x59, 0xf7, 0x9e, 0x5, 0x47, 0x6, 0xfb, + 0x34, 0xfb, 0xa0, 0xa0, 0xf7, 0xad, 0x5, 0xeb, 0x34, 0xa, 0xfb, 0x83, + 0x36, 0xa, 0xbd, 0x6, 0xe, 0x3a, 0xa, 0x65, 0x16, 0xf7, 0x97, 0x34, + 0xa, 0x3b, 0x6, 0xf7, 0x1b, 0xf7, 0x11, 0xdf, 0xfb, 0x11, 0x5, 0x4c, + 0x6e, 0xa, 0xf7, 0x89, 0x34, 0xa, 0x47, 0x6, 0xfb, 0x11, 0xf7, 0x55, + 0xf7, 0x4b, 0xf7, 0x4f, 0x5, 0xd1, 0x34, 0xa, 0xfb, 0x76, 0x6e, 0xa, + 0xba, 0x6, 0xfb, 0x5, 0xfb, 0xa, 0x4b, 0xf7, 0xa, 0x5, 0xc2, 0x34, + 0xa, 0xfb, 0x84, 0x36, 0xa, 0xd2, 0x6, 0xf5, 0xfb, 0x4f, 0xfb, 0x62, + 0xfb, 0x55, 0x5, 0x47, 0x6, 0xe, 0x3a, 0xa, 0x9d, 0x16, 0xf7, 0xf0, + 0x42, 0xa, 0xfb, 0x10, 0x6, 0xa7, 0xf7, 0x1c, 0xf7, 0x68, 0xf7, 0x88, + 0x5, 0xdc, 0x42, 0xa, 0xfb, 0x83, 0x36, 0xa, 0xc3, 0x6, 0xfb, 0x1e, + 0xfb, 0x31, 0x41, 0xf7, 0x31, 0x5, 0xc2, 0x34, 0xa, 0xfb, 0x85, 0x4b, + 0xa, 0xda, 0x6, 0xf7, 0x3, 0xfb, 0x88, 0x70, 0xfb, 0x1c, 0x5, 0xfb, + 0x11, 0x6, 0xe, 0x8b, 0xe5, 0xf8, 0x8, 0xe5, 0x1, 0x9c, 0x16, 0xf7, + 0xef, 0x6, 0x9f, 0xe5, 0x5, 0xfb, 0x11, 0x6, 0xa7, 0xf7, 0x19, 0xf7, + 0x69, 0xf7, 0x83, 0x5, 0xdc, 0x46, 0xa, 0xfb, 0x84, 0x6, 0x79, 0x31, + 0x5, 0xc2, 0x6, 0xfb, 0x1f, 0xfb, 0x2d, 0x43, 0xf7, 0x2d, 0x5, 0xc1, + 0x46, 0xa, 0xfb, 0x83, 0x6, 0x79, 0x31, 0x5c, 0xa, 0xf7, 0x5, 0xfb, + 0x83, 0x6d, 0xfb, 0x19, 0x5, 0xfb, 0x10, 0x6, 0xf7, 0x3e, 0xf8, 0x97, + 0x15, 0xf7, 0xe1, 0xd8, 0x77, 0xf1, 0xfb, 0xd5, 0xfb, 0xc, 0x5, 0xe, + 0x8b, 0xe3, 0xf8, 0x1b, 0xe8, 0xe3, 0xf7, 0x15, 0x12, 0xf7, 0x38, 0xeb, + 0x3b, 0xf7, 0x2, 0xd1, 0xf7, 0x3, 0x13, 0xf4, 0xa0, 0x16, 0xf7, 0xec, + 0x6, 0x9d, 0xe8, 0x5, 0xfb, 0xf, 0x6, 0xa5, 0xf7, 0x14, 0xf7, 0x69, + 0xf7, 0x96, 0x5, 0xda, 0x94, 0xa, 0xfb, 0x82, 0x6, 0x79, 0x2e, 0x5, + 0xc3, 0x6, 0xfb, 0x20, 0xfb, 0x3d, 0x45, 0xf7, 0x3d, 0x5, 0xc1, 0x6, + 0x9d, 0xe8, 0x5, 0xfb, 0x81, 0x82, 0xa, 0xd9, 0x6, 0xf7, 0x1, 0xfb, + 0x96, 0x71, 0xfb, 0x14, 0x5, 0xfb, 0x11, 0x6, 0xf7, 0xd5, 0xf8, 0xcb, + 0x92, 0xa, 0xa5, 0xf7, 0x15, 0x4c, 0xa, 0x13, 0xec, 0xfb, 0x62, 0xfb, + 0x15, 0x15, 0xf7, 0x2, 0x6, 0xa5, 0xf7, 0x15, 0x86, 0xa, 0xe, 0x3a, + 0xa, 0xe4, 0xec, 0x3, 0x98, 0x16, 0xf8, 0x74, 0x6, 0xbc, 0xf7, 0x70, + 0x66, 0xa, 0x6c, 0xfb, 0x15, 0x5, 0xfb, 0x8e, 0x6, 0xf8, 0x2e, 0xf8, + 0x2a, 0x98, 0xcc, 0x5, 0xfc, 0x58, 0x6, 0x5d, 0xfb, 0x61, 0x96, 0xa, + 0xa7, 0xf7, 0x6, 0x5, 0xf7, 0x6e, 0x6, 0xfc, 0x28, 0xfc, 0x25, 0x5, + 0xe, 0x8b, 0xe4, 0xf8, 0xd, 0xe5, 0x1, 0xd7, 0xea, 0xf7, 0x8d, 0xea, + 0x3, 0x8c, 0x16, 0xf8, 0x68, 0x6, 0xb9, 0xf7, 0x6d, 0x5, 0x2c, 0x6, + 0x71, 0xfb, 0x14, 0x5, 0xfb, 0x89, 0x6, 0xf8, 0x23, 0xf8, 0x27, 0x99, + 0xcb, 0x5, 0xfc, 0x4d, 0x6, 0x5e, 0xfb, 0x5f, 0x5, 0xea, 0x6, 0xa5, + 0xf7, 0x5, 0x5, 0xf7, 0x6a, 0x6, 0xfc, 0x20, 0xfc, 0x23, 0x5, 0xf7, + 0xbd, 0xf8, 0xb3, 0x15, 0xed, 0x6, 0xf7, 0x50, 0xf7, 0x23, 0x58, 0xaf, + 0xfb, 0x42, 0x21, 0xfb, 0x11, 0xf6, 0x46, 0x69, 0x5, 0xe, 0x7c, 0xea, + 0x35, 0xea, 0xf5, 0xe9, 0xd0, 0xeb, 0x12, 0xaf, 0xed, 0xf7, 0xbd, 0xed, + 0x13, 0x7c, 0xf8, 0x6, 0x85, 0x15, 0xf7, 0x44, 0x6, 0x9e, 0xea, 0x5, + 0x3a, 0x6, 0xad, 0xf7, 0x3f, 0x92, 0xa7, 0x90, 0xaa, 0x8a, 0xa7, 0x19, + 0xee, 0xfb, 0x1e, 0x93, 0x6f, 0x3d, 0x2c, 0x71, 0x6e, 0x42, 0x1e, 0xa0, + 0x3a, 0x5, 0xa2, 0xcb, 0xd6, 0x9c, 0xc9, 0x1b, 0xa2, 0xd0, 0x8a, 0x61, + 0x80, 0x89, 0x80, 0x8a, 0x80, 0x1f, 0x8f, 0x67, 0x64, 0x8e, 0x65, 0x1b, + 0xfb, 0x8c, 0x6c, 0xfb, 0x25, 0x68, 0x1f, 0x13, 0xbc, 0x4e, 0xbc, 0x4c, + 0xf5, 0xdc, 0xb5, 0xa2, 0xae, 0xcc, 0x1e, 0x13, 0x7c, 0xa3, 0xf7, 0x5, + 0x15, 0x13, 0xbc, 0x5f, 0x51, 0x48, 0x6b, 0x47, 0x1b, 0x66, 0x64, 0x96, + 0xa4, 0xc7, 0xed, 0x9e, 0xbc, 0xc6, 0xb1, 0x85, 0x89, 0xab, 0x1f, 0xe, + 0x41, 0xa, 0xf7, 0x75, 0x77, 0x12, 0xa6, 0xeb, 0x13, 0x7c, 0xf7, 0x87, + 0xf8, 0x77, 0x15, 0xf7, 0xde, 0xd7, 0x77, 0xf1, 0xfb, 0xd4, 0xfb, 0xd, + 0x5, 0xf7, 0xe, 0xfc, 0xb3, 0x21, 0xa, 0x8b, 0xe5, 0xee, 0xe4, 0xcc, + 0xe6, 0x1, 0xae, 0xe9, 0xf7, 0x7e, 0xef, 0x3, 0xf7, 0x61, 0xf8, 0x73, + 0x15, 0xf7, 0x3f, 0xf4, 0xf7, 0x10, 0x22, 0xcc, 0xae, 0xfb, 0x14, 0xf7, + 0x23, 0x66, 0xa, 0xfb, 0x50, 0xfb, 0x22, 0x5, 0xf7, 0x67, 0xfc, 0x9a, + 0x22, 0xa, 0x3b, 0xa, 0x1f, 0xa1, 0xf7, 0x1, 0x15, 0x2c, 0xa, 0xf7, + 0x35, 0xf7, 0xb2, 0x3, 0xf7, 0x35, 0xf8, 0x90, 0x15, 0xf7, 0xb2, 0xca, + 0x7a, 0xe5, 0xfb, 0xaa, 0x23, 0x5, 0xe, 0x41, 0xa, 0xca, 0xf7, 0x12, + 0x12, 0xb3, 0xeb, 0x13, 0x7c, 0xf8, 0x35, 0xf8, 0x87, 0x15, 0xf7, 0x8, + 0x6, 0xa4, 0xf7, 0x12, 0x5, 0xfb, 0x8, 0x6, 0xfb, 0x6a, 0xfb, 0x12, + 0x15, 0xf7, 0x6, 0x6, 0xa6, 0xf7, 0x12, 0x5, 0xfb, 0x9, 0x6, 0xf7, + 0x8, 0xfd, 0x8, 0x21, 0xa, 0x7c, 0xea, 0xe0, 0xeb, 0x39, 0xec, 0xde, + 0xea, 0x12, 0x13, 0xd0, 0xf7, 0xa4, 0xc5, 0x15, 0x71, 0x97, 0xad, 0x5c, + 0xe6, 0x1b, 0xc3, 0xbc, 0x99, 0xa0, 0xc7, 0x1f, 0x7d, 0xe7, 0x5, 0x74, + 0x47, 0x64, 0x82, 0x73, 0x1b, 0x36, 0x8b, 0xcb, 0x9e, 0x8e, 0x1f, 0x8c, + 0x8d, 0x5, 0xf7, 0x89, 0x6, 0x98, 0xb2, 0x94, 0xb3, 0xb4, 0x1a, 0xde, + 0x6c, 0xe1, 0x2b, 0x60, 0x56, 0x78, 0x68, 0x67, 0x1e, 0xb1, 0x77, 0x72, + 0x9b, 0x47, 0x1b, 0x42, 0x2d, 0x66, 0x89, 0x86, 0x1f, 0x94, 0x2d, 0x5, + 0x9c, 0xba, 0xc0, 0xa0, 0xb7, 0x1b, 0xac, 0x9b, 0x7f, 0x6c, 0x81, 0x8a, + 0x80, 0x88, 0x7d, 0x1f, 0x89, 0x81, 0x5, 0x13, 0xb0, 0x8d, 0x72, 0x79, + 0x8e, 0x67, 0x1b, 0xfb, 0x14, 0x40, 0x2c, 0x34, 0x1f, 0x4d, 0x8c, 0xb7, + 0x5c, 0xd6, 0x1b, 0xd3, 0xc4, 0xba, 0xa5, 0xb1, 0x1f, 0x13, 0xd0, 0xe7, + 0xf7, 0x5f, 0x15, 0xc6, 0x9a, 0xba, 0xb2, 0xb4, 0x1b, 0xc5, 0x87, 0x3e, + 0x76, 0x89, 0x1f, 0xfb, 0xae, 0xfb, 0x1e, 0x15, 0x6e, 0x6a, 0x63, 0x7d, + 0x63, 0x1b, 0x79, 0x78, 0x95, 0xae, 0x1f, 0x13, 0xb0, 0x95, 0x9a, 0xb7, + 0xe3, 0x96, 0xab, 0x8a, 0x87, 0x9a, 0x1e, 0xe, 0x41, 0xa, 0xf7, 0x75, + 0x77, 0x12, 0xae, 0xeb, 0x13, 0x7c, 0xf7, 0x74, 0xf8, 0xc6, 0x15, 0xf7, + 0xc4, 0x3b, 0xb0, 0xc5, 0xfb, 0xa9, 0xf7, 0xd, 0x5, 0xd6, 0xfd, 0x2c, + 0x21, 0xa, 0x7c, 0xe9, 0x39, 0xe9, 0xf7, 0x17, 0xe9, 0xf7, 0x18, 0xea, + 0x12, 0xad, 0xf2, 0x9b, 0xed, 0x13, 0x7c, 0xf7, 0xda, 0xb0, 0x15, 0xa0, + 0x63, 0x5, 0xf7, 0x45, 0x3f, 0xa, 0xfb, 0x19, 0x6, 0x7f, 0xa1, 0xa5, + 0xa8, 0x9d, 0xbc, 0xa0, 0xaa, 0x19, 0xdf, 0x3f, 0xa, 0xfb, 0x2a, 0x6, + 0x81, 0x74, 0x6c, 0x44, 0x76, 0x71, 0x8, 0x3c, 0xf7, 0x22, 0x73, 0xb3, + 0xab, 0x1a, 0xa7, 0xab, 0x94, 0xa9, 0x8c, 0x1e, 0xb9, 0x8c, 0xc3, 0x74, + 0x9c, 0x76, 0xd2, 0xd0, 0x18, 0xb1, 0x64, 0x4b, 0xaa, 0x4d, 0x1b, 0x2c, + 0x31, 0x4c, 0x34, 0x64, 0xa3, 0x6c, 0x8f, 0x7d, 0x1f, 0x89, 0x7, 0x39, + 0x69, 0x4a, 0x3e, 0x34, 0x1a, 0x13, 0xbc, 0x4e, 0xb4, 0x4c, 0xf1, 0xda, + 0xb5, 0xad, 0x9d, 0xa7, 0x1e, 0x62, 0xd9, 0x15, 0x74, 0x72, 0x6b, 0x7e, + 0x6c, 0x1b, 0x5f, 0x7b, 0xa5, 0xa4, 0xbf, 0xbd, 0xb2, 0xaa, 0x9a, 0x1f, + 0xe, 0x41, 0xa, 0xf7, 0x4b, 0x77, 0x12, 0xb3, 0xeb, 0x13, 0x7c, 0xf7, + 0xb1, 0xf8, 0xc4, 0x15, 0x5e, 0xb0, 0x68, 0xc0, 0xcd, 0xd0, 0xc0, 0xca, + 0xb9, 0x65, 0xaf, 0x55, 0x49, 0x48, 0x54, 0x4c, 0x1e, 0xcf, 0x91, 0x15, + 0xa7, 0xa6, 0xa4, 0xa5, 0xa0, 0x9b, 0x7d, 0x79, 0x72, 0x70, 0x75, 0x70, + 0x77, 0x7b, 0x96, 0x9a, 0x1e, 0x9a, 0xfc, 0xcd, 0x21, 0xa, 0xf7, 0xa2, + 0xcf, 0x1, 0x73, 0xf9, 0x1c, 0x3, 0xf7, 0x3, 0xf7, 0x23, 0x15, 0xc9, + 0xbf, 0x48, 0xd7, 0xf8, 0x1, 0x8a, 0x2c, 0x4b, 0x6a, 0xa, 0x4a, 0x5, + 0xfb, 0xeb, 0x6, 0xdd, 0xc1, 0x8e, 0xa, 0x9b, 0x76, 0xf8, 0xef, 0x77, + 0x1, 0xf7, 0x95, 0x86, 0x15, 0xf7, 0x5f, 0xf7, 0x36, 0x58, 0xc0, 0x38, + 0x40, 0xf7, 0xe, 0xf8, 0x5a, 0x44, 0x94, 0xfb, 0xe, 0xfc, 0x5f, 0x5a, + 0xd4, 0x49, 0x5c, 0x5, 0xe, 0xf7, 0x99, 0xd1, 0x1, 0x69, 0xf9, 0x26, + 0x3, 0xf0, 0xf7, 0x23, 0x15, 0xc9, 0xbf, 0x51, 0xcd, 0x5, 0xf8, 0x9b, + 0x6, 0x95, 0xd1, 0x5, 0xfc, 0x96, 0x6, 0xe9, 0xc8, 0x8e, 0xa, 0xf7, + 0x9f, 0xd1, 0x1, 0x69, 0xf9, 0x30, 0x3, 0x69, 0xf7, 0x9f, 0x15, 0xf8, + 0x96, 0x6, 0x2d, 0x4e, 0x6a, 0xa, 0x49, 0x5, 0xfc, 0x9b, 0x6, 0xe, + 0xa1, 0xf8, 0x3b, 0x1, 0xf7, 0x2d, 0xd1, 0x3, 0xf7, 0x2d, 0xa1, 0x15, + 0xd1, 0x82, 0xf7, 0xe, 0xf8, 0x5e, 0xbc, 0x42, 0xcd, 0xba, 0xfb, 0x9, + 0xf7, 0x3f, 0xfb, 0x5f, 0xfb, 0x37, 0xbe, 0x56, 0xde, 0xd6, 0x5, 0xe, + 0xf7, 0x8f, 0xf8, 0x1, 0x1, 0xf7, 0x0, 0xf8, 0xc, 0x3, 0xf7, 0x0, + 0xf7, 0x8e, 0x15, 0xd7, 0xb1, 0xd9, 0xdb, 0xca, 0xd8, 0xb5, 0x3a, 0xbf, + 0x3f, 0xcc, 0x66, 0x93, 0xcb, 0x18, 0x41, 0xf7, 0x2, 0x6a, 0xc2, 0x78, + 0xf7, 0x1c, 0x8, 0x5c, 0x6, 0x5b, 0xfb, 0x15, 0x56, 0x46, 0x25, 0x23, + 0x8, 0xe, 0xf7, 0x3a, 0xf2, 0x2c, 0x76, 0xde, 0xf3, 0x9b, 0x77, 0x12, + 0xcc, 0xf8, 0x69, 0x13, 0x68, 0xf7, 0xc, 0xf7, 0x2d, 0x15, 0xab, 0xa3, + 0xa7, 0xbe, 0xb4, 0x1b, 0x9a, 0xaa, 0x76, 0x7a, 0xae, 0x1f, 0x7f, 0xa3, + 0xa5, 0x81, 0xa4, 0x1b, 0xb6, 0xd2, 0xad, 0xdf, 0xbe, 0x1f, 0x13, 0x98, + 0x58, 0xc9, 0x5, 0x75, 0x7c, 0x65, 0x54, 0x61, 0x1b, 0x74, 0x73, 0x96, + 0x98, 0x73, 0x1f, 0x13, 0x68, 0x9c, 0x6b, 0x6c, 0x9f, 0x71, 0x1b, 0x44, + 0x59, 0x48, 0x55, 0x61, 0x1f, 0xe, 0xf7, 0x4e, 0xf0, 0x3, 0xf7, 0x4e, + 0xf7, 0x6f, 0x15, 0xf0, 0xf7, 0x7, 0xbd, 0xfb, 0x6, 0xec, 0xc7, 0x52, + 0xf3, 0xf7, 0x18, 0xad, 0x7c, 0xee, 0xfb, 0x1d, 0x56, 0xb0, 0xf7, 0x1d, + 0x4c, 0xa, 0x78, 0xfb, 0x19, 0xfb, 0xb, 0xbc, 0x55, 0x27, 0xf7, 0x16, + 0x6a, 0x20, 0x22, 0x5, 0xe, 0x79, 0xd3, 0xd2, 0xd4, 0xf7, 0x3b, 0xd5, + 0xd2, 0xd0, 0x1, 0x91, 0xe1, 0xc6, 0xd2, 0xf7, 0xb4, 0xdb, 0x3, 0xf7, + 0xcf, 0xf7, 0x3b, 0x15, 0x6a, 0x9b, 0xad, 0x82, 0x9d, 0x1b, 0xf7, 0x0, + 0xee, 0xf7, 0x1c, 0xf7, 0xe, 0xf7, 0x16, 0x25, 0xcd, 0xfb, 0x10, 0xfb, + 0x3b, 0xfb, 0x53, 0xfb, 0x22, 0xfb, 0x75, 0x22, 0xb6, 0xfb, 0x11, 0xf7, + 0x50, 0xf7, 0x13, 0xdf, 0xc4, 0xa4, 0xb5, 0x1f, 0x7d, 0xcf, 0x5, 0x54, + 0x32, 0x47, 0x74, 0x3f, 0x1b, 0xfb, 0xb, 0x6b, 0xdd, 0xd8, 0xe5, 0xd6, + 0xf7, 0x63, 0xf7, 0x4b, 0xf2, 0xc4, 0x55, 0x39, 0x3a, 0x54, 0x2c, 0x59, + 0x7d, 0x79, 0x91, 0xa3, 0x8f, 0x1f, 0x8c, 0x90, 0x8c, 0x8f, 0x8e, 0x91, + 0xe2, 0xf7, 0x48, 0x18, 0x46, 0x6, 0x82, 0x79, 0x5, 0xa3, 0x78, 0x7e, + 0x8b, 0x7d, 0x1b, 0x25, 0x2f, 0xfb, 0x1d, 0x30, 0x51, 0xb1, 0x79, 0xa8, + 0xac, 0xaf, 0x9c, 0xa4, 0xa7, 0x1f, 0xa8, 0xf7, 0x3a, 0x15, 0x70, 0x85, + 0x62, 0xfb, 0x0, 0x4f, 0x1b, 0x80, 0x87, 0x93, 0x97, 0xc5, 0xd1, 0xe4, + 0xab, 0xa3, 0x88, 0x74, 0x82, 0x8a, 0x1f, 0xe, 0x41, 0xa, 0xf7, 0x1e, + 0x77, 0xdd, 0x77, 0x12, 0x95, 0xeb, 0x13, 0x7e, 0xf7, 0x12, 0xf8, 0x95, + 0x15, 0xdb, 0x71, 0x9a, 0x9f, 0x94, 0xa2, 0xa3, 0x98, 0x19, 0xa3, 0x98, + 0xa9, 0x7a, 0xaa, 0x79, 0x8, 0x7c, 0xa6, 0xa7, 0x7b, 0xa4, 0x1b, 0xf0, + 0xbf, 0xe3, 0xad, 0x9d, 0x1f, 0x39, 0xa3, 0x5, 0x62, 0x70, 0x7d, 0x76, + 0x6f, 0x1b, 0x79, 0x79, 0x94, 0x97, 0x78, 0x1f, 0x9c, 0x6f, 0x6f, 0xa1, + 0x6b, 0x1b, 0x29, 0x5c, 0x3d, 0x60, 0x72, 0x1f, 0xf7, 0x68, 0xfc, 0x98, + 0x22, 0xa, 0x1f, 0x13, 0xbe, 0x3b, 0xa, 0x1e, 0x13, 0x7e, 0xa1, 0xf7, + 0x1, 0x15, 0x13, 0xbe, 0x2c, 0xa, 0x7c, 0xe8, 0x3a, 0xe9, 0xf7, 0x9d, + 0xe9, 0xdd, 0xe9, 0x12, 0xf8, 0x94, 0xef, 0x13, 0x78, 0x80, 0x88, 0x15, + 0xf7, 0x47, 0x6, 0x94, 0xbb, 0x5, 0x13, 0xb8, 0x70, 0xad, 0xb2, 0x6a, + 0xd7, 0x1b, 0xf7, 0x5a, 0xe3, 0xf7, 0x18, 0xf7, 0x1e, 0xf3, 0x42, 0xe6, + 0xfb, 0x14, 0x53, 0x54, 0x84, 0x69, 0x5b, 0x1f, 0xb8, 0xf7, 0x6d, 0x5, + 0xfb, 0x49, 0x44, 0xa, 0xdd, 0x6, 0x13, 0x78, 0x32, 0xfc, 0x4d, 0x5, + 0x3a, 0x6, 0xf7, 0x5b, 0xef, 0x15, 0xe6, 0xc7, 0xd5, 0xf7, 0xd, 0xe8, + 0xa9, 0x48, 0x58, 0x1e, 0x13, 0xb8, 0x35, 0x2d, 0x41, 0x34, 0x63, 0x38, + 0xa5, 0xe2, 0x1e, 0xe, 0xfb, 0x1d, 0xf9, 0x8f, 0x1, 0xf7, 0x37, 0xf7, + 0xa5, 0x3, 0xf7, 0xfe, 0xfb, 0x1d, 0x15, 0xd5, 0xa8, 0xfb, 0x5b, 0xf9, + 0x72, 0x41, 0x6e, 0x5, 0xe, 0xfb, 0x73, 0x76, 0xfa, 0x7c, 0x77, 0x1, + 0xf7, 0x1a, 0xe3, 0x3, 0xf7, 0x1a, 0xfb, 0x88, 0x15, 0xe3, 0x6, 0xf7, + 0x88, 0xfa, 0x7c, 0x5, 0x33, 0x6, 0xe, 0xf7, 0x34, 0xdc, 0x3, 0xd5, + 0xf7, 0x71, 0x15, 0xdc, 0x7f, 0x95, 0x60, 0x61, 0x1a, 0x85, 0x80, 0x45, + 0x74, 0xfb, 0x19, 0x1e, 0x83, 0x5c, 0x97, 0x52, 0xbd, 0x76, 0x8, 0x79, + 0xb6, 0xc7, 0x8b, 0xbc, 0x1b, 0x9d, 0xe8, 0x5, 0x64, 0x63, 0x8b, 0x95, + 0x6b, 0x1f, 0x76, 0x92, 0x89, 0xa4, 0x8f, 0xa2, 0x9e, 0xf7, 0x9, 0x95, + 0xcb, 0x8c, 0x96, 0x8, 0x8c, 0x97, 0x8b, 0x93, 0x90, 0x1a, 0xb3, 0x74, + 0xc3, 0x63, 0xa5, 0x1e, 0xd0, 0xae, 0xbd, 0xdd, 0x98, 0xd3, 0xa7, 0xf7, + 0x28, 0x18, 0x8f, 0xa2, 0x96, 0xa5, 0xa3, 0x91, 0x8, 0x95, 0xb2, 0xaf, + 0x8b, 0xb2, 0x1b, 0x9e, 0xe8, 0x5, 0x5a, 0x51, 0x8b, 0x79, 0x57, 0x1f, + 0x52, 0x77, 0x67, 0x51, 0x83, 0x5c, 0x75, 0xfb, 0x9, 0x18, 0x76, 0xfb, + 0x0, 0x77, 0x4a, 0xfb, 0x3, 0x7b, 0x8, 0xe, 0xf8, 0x2, 0xda, 0x3, + 0xd5, 0xfb, 0x78, 0x15, 0xbc, 0xc5, 0x8b, 0x9d, 0xbf, 0x1f, 0xc4, 0x9f, + 0xaf, 0xc5, 0x93, 0xba, 0xa1, 0xf7, 0x9, 0x18, 0xa0, 0xf7, 0x0, 0x9f, + 0xcc, 0xf7, 0x3, 0x9b, 0x9c, 0xe9, 0x18, 0x3a, 0x97, 0x81, 0xb6, 0xb5, + 0x1a, 0x91, 0x96, 0xd1, 0xa2, 0xf7, 0x19, 0x1e, 0x93, 0xba, 0x7f, 0xc4, + 0x59, 0xa0, 0x8, 0x9d, 0x60, 0x4f, 0x8b, 0x5a, 0x1b, 0x79, 0x2e, 0x5, + 0xb2, 0xb3, 0x8b, 0x81, 0xab, 0x1f, 0xa0, 0x84, 0x8d, 0x72, 0x87, 0x74, + 0x78, 0xfb, 0x9, 0x81, 0x4b, 0x8a, 0x7f, 0x8, 0x8a, 0x80, 0x8b, 0x83, + 0x86, 0x1a, 0x63, 0xa2, 0x53, 0xb3, 0x71, 0x1e, 0x46, 0x68, 0x59, 0x39, + 0x7e, 0x43, 0x6f, 0xfb, 0x28, 0x18, 0x87, 0x74, 0x80, 0x71, 0x73, 0x85, + 0x8, 0x81, 0x64, 0x67, 0x8b, 0x64, 0x1b, 0xe, 0x25, 0xe7, 0xf8, 0xaa, + 0xe7, 0x1, 0xf7, 0x0, 0x25, 0x15, 0xf7, 0x7c, 0x6, 0x9f, 0xe7, 0x5, + 0xfb, 0x1b, 0x6, 0xf7, 0x5, 0xf8, 0xaa, 0x5, 0xf7, 0x1a, 0x5b, 0xa, + 0xfb, 0x7c, 0x6, 0xe, 0x25, 0xe7, 0xf8, 0xaa, 0xe7, 0x1, 0xf7, 0x13, + 0x81, 0x15, 0x78, 0x2f, 0x5, 0xf7, 0x7b, 0x6, 0xf7, 0x2c, 0xf9, 0x62, + 0x5, 0xfb, 0x7c, 0x6, 0x77, 0x2f, 0x5, 0xf7, 0x1b, 0x6, 0xfb, 0x6, + 0xfc, 0xaa, 0x5, 0xe, 0xf8, 0x68, 0xd5, 0x1, 0xdf, 0xf9, 0xb, 0x15, + 0x44, 0xb7, 0x2f, 0xf7, 0x22, 0xf7, 0x31, 0xd3, 0xf7, 0x5, 0xbd, 0x9d, + 0x1e, 0x2f, 0x6, 0x3d, 0x64, 0x41, 0x80, 0x70, 0x1b, 0x3c, 0x71, 0xc0, + 0xaf, 0x8a, 0x1f, 0xe, 0xfb, 0x2e, 0x76, 0xf9, 0xe6, 0x77, 0x1, 0xf7, + 0x39, 0xc6, 0xf7, 0x2c, 0xc6, 0x3, 0xf7, 0xac, 0xf7, 0xb0, 0x15, 0xc6, + 0x6, 0xeb, 0xf8, 0x1b, 0x5, 0x50, 0x6, 0xfb, 0x67, 0xfd, 0xe6, 0x15, + 0xc6, 0x6, 0xed, 0xf8, 0x1a, 0x5, 0x50, 0x6, 0xe, 0xf7, 0x18, 0xf7, + 0xbe, 0x1, 0xf7, 0x1d, 0xf7, 0xd9, 0x3, 0xf7, 0x1d, 0xf7, 0x8c, 0x15, + 0x48, 0xbf, 0x5a, 0xd8, 0xed, 0xed, 0xdb, 0xeb, 0xd1, 0x57, 0xbf, 0x3c, + 0x23, 0x31, 0x38, 0x28, 0x1e, 0xe, 0x7c, 0xea, 0xf7, 0xb0, 0xea, 0x1, + 0xae, 0xf2, 0x3, 0xf8, 0x89, 0xf7, 0x2e, 0x15, 0x62, 0x46, 0x4c, 0x6a, + 0x38, 0x1b, 0x3e, 0x44, 0xb0, 0xd5, 0xee, 0xe5, 0xd5, 0xf7, 0xd, 0xb3, + 0xb3, 0x80, 0x7c, 0xab, 0x1f, 0x77, 0x30, 0x5, 0xef, 0x6, 0xb7, 0xf7, + 0x68, 0x7b, 0xa, 0x86, 0x78, 0x5, 0x98, 0x69, 0x65, 0x91, 0x62, 0x1b, + 0xfb, 0x64, 0xfb, 0x11, 0xfb, 0x27, 0xfb, 0x20, 0xfb, 0xc, 0xf4, 0x48, + 0xf7, 0xa, 0xf0, 0xf0, 0xb3, 0xc3, 0xdf, 0x1f, 0xe, 0xf7, 0x79, 0xe6, + 0x3, 0xf7, 0x79, 0xf8, 0x81, 0x15, 0xe6, 0x6, 0xf7, 0x45, 0xf7, 0x1e, + 0x5b, 0xaf, 0xfb, 0x36, 0x25, 0xfb, 0xc, 0xf1, 0x4b, 0x68, 0x5, 0xe, + 0xfb, 0x4d, 0x76, 0xf7, 0x58, 0xe8, 0xf7, 0xae, 0xe9, 0x1, 0xa4, 0xf1, + 0x3, 0xf7, 0x23, 0xfb, 0x46, 0x15, 0x7b, 0x9e, 0xa6, 0x7f, 0xac, 0x1b, + 0xd3, 0xc0, 0xc2, 0xc5, 0xa5, 0x85, 0xac, 0x62, 0x95, 0x1f, 0x8f, 0x9c, + 0xdd, 0x98, 0xda, 0xad, 0xcf, 0xb7, 0x19, 0x60, 0xd4, 0x5, 0x61, 0x46, + 0x4c, 0x6b, 0x38, 0x1b, 0x3f, 0x43, 0xaf, 0xd2, 0xee, 0xe4, 0xd7, 0xf7, + 0xe, 0xb5, 0xb2, 0x81, 0x7b, 0xaa, 0x1f, 0x77, 0x31, 0x5, 0xef, 0x6, + 0xb8, 0xf7, 0x66, 0x5, 0x27, 0x6, 0x87, 0x78, 0x5, 0x98, 0x69, 0x64, + 0x91, 0x62, 0x1b, 0xfb, 0x62, 0xfb, 0x12, 0xfb, 0x26, 0xfb, 0x1d, 0xfb, + 0x4, 0xe4, 0x4a, 0xf6, 0x82, 0x1f, 0x70, 0x31, 0x5, 0x8c, 0x95, 0x9f, + 0x91, 0x9c, 0x1b, 0x96, 0x95, 0x87, 0x7d, 0x7c, 0x79, 0x83, 0x79, 0x7b, + 0x7b, 0x91, 0x93, 0x83, 0x1f, 0xe, 0xfb, 0x62, 0xd1, 0xb4, 0xea, 0x1, + 0xf7, 0xae, 0xd9, 0x3, 0xf7, 0x5d, 0xfb, 0x46, 0x15, 0x79, 0xa1, 0xa3, + 0x81, 0xa9, 0x1b, 0xce, 0xc2, 0xc0, 0xca, 0xb8, 0x6b, 0x9a, 0x80, 0x8f, + 0x1f, 0x8f, 0xa5, 0x5, 0x3d, 0x6, 0x6b, 0x24, 0x5, 0x8d, 0x94, 0xa4, + 0x91, 0x9c, 0x1b, 0x95, 0x92, 0x86, 0x81, 0x78, 0x78, 0x84, 0x75, 0x7e, + 0x7f, 0x91, 0x93, 0x84, 0x1f, 0xe, 0x6f, 0x76, 0xf7, 0xfd, 0xf7, 0x4e, + 0xf7, 0x8, 0x77, 0x1, 0xc5, 0xf0, 0x3, 0xf7, 0x43, 0x5a, 0x15, 0xed, + 0x6, 0xa5, 0xf7, 0x1d, 0xd1, 0x95, 0xcc, 0xa4, 0xca, 0xb2, 0x19, 0x6c, + 0xd3, 0x5, 0x60, 0x37, 0x5b, 0x72, 0x49, 0x1b, 0x33, 0x76, 0xc1, 0xb0, + 0xd6, 0xd2, 0xd3, 0xe6, 0xaf, 0xae, 0x80, 0x7c, 0xa8, 0x1f, 0x7c, 0x49, + 0x96, 0xa, 0xb1, 0xf7, 0x4e, 0x7a, 0xa, 0x85, 0x6c, 0x78, 0x91, 0x76, + 0x90, 0x78, 0x8e, 0x19, 0xa6, 0xf7, 0x19, 0x66, 0xa, 0x70, 0xfb, 0x18, + 0x5, 0xfb, 0x23, 0x6c, 0x39, 0x2b, 0xfb, 0x9, 0x1a, 0xfb, 0x0, 0xf2, + 0x6e, 0xb5, 0x7f, 0x1e, 0xe, 0xf7, 0xaf, 0xe7, 0x3, 0xf7, 0x2d, 0xf8, + 0x77, 0x15, 0xf7, 0x37, 0xf2, 0xf7, 0xa, 0x24, 0xca, 0xad, 0xfb, 0xe, + 0x97, 0xa, 0x2f, 0x6, 0xfb, 0x48, 0xfb, 0x1f, 0x5, 0xe, 0x7c, 0xf7, + 0x41, 0xe9, 0xf7, 0x41, 0x1, 0xf7, 0x6f, 0xf7, 0xd4, 0x15, 0x6e, 0xa3, + 0x64, 0xd0, 0xcf, 0xc3, 0xbc, 0xc8, 0xac, 0x6c, 0xa9, 0x51, 0x48, 0x4e, + 0x56, 0x57, 0x1e, 0x53, 0xfb, 0x9e, 0x15, 0x6e, 0xa4, 0x63, 0xd0, 0xc8, + 0xbf, 0xb3, 0xb9, 0x96, 0x1e, 0x8c, 0x90, 0x8b, 0x91, 0x90, 0x1a, 0xaf, + 0x70, 0xae, 0x4c, 0x4a, 0x4b, 0x58, 0x56, 0x1e, 0xe, 0xfb, 0x3, 0xf7, + 0xb5, 0x1, 0xf7, 0x1a, 0xf7, 0x13, 0xac, 0xf7, 0x3f, 0x3, 0xf7, 0x1a, + 0xfb, 0x3, 0x15, 0xf7, 0x13, 0x6, 0xf7, 0x60, 0xf7, 0xb5, 0x5, 0xfb, + 0x3f, 0x6, 0xe, 0x79, 0xb8, 0xe9, 0xb9, 0xf7, 0x8c, 0xb9, 0xd5, 0xb8, + 0x1, 0x84, 0xb9, 0xf7, 0x2, 0xb9, 0xf8, 0x1, 0xba, 0x3, 0x84, 0xf7, + 0x6d, 0x15, 0xfb, 0x18, 0xf6, 0x24, 0xf7, 0x21, 0xf7, 0x78, 0xf7, 0x1e, + 0xf7, 0x44, 0xf7, 0x48, 0xf7, 0x1d, 0x25, 0xf4, 0xfb, 0x24, 0xfb, 0x4d, + 0xfb, 0x4b, 0xfb, 0x1c, 0xfb, 0x77, 0x1e, 0xb9, 0x9c, 0x15, 0xf7, 0x35, + 0xf7, 0x2f, 0xf7, 0x20, 0xf7, 0x30, 0xf7, 0x13, 0xde, 0x30, 0xfb, 0xc, + 0xfb, 0x32, 0xfb, 0x28, 0xfb, 0x1f, 0xfb, 0x35, 0xfb, 0x11, 0x34, 0xe5, + 0xf7, 0x9, 0x1e, 0xf7, 0xfd, 0x77, 0x15, 0x72, 0x6f, 0x62, 0x75, 0x63, + 0x1b, 0x4e, 0x69, 0xb8, 0xc3, 0x8a, 0x1f, 0xd6, 0xd4, 0xd3, 0xd2, 0xae, + 0xaf, 0x7a, 0x76, 0x9d, 0x1e, 0xae, 0xab, 0x5, 0xa9, 0x72, 0x61, 0xa1, + 0x5d, 0x1b, 0x2b, 0x22, 0x36, 0xfb, 0x9, 0x42, 0xbb, 0x4a, 0xe4, 0xcc, + 0xc7, 0xaf, 0x9e, 0x9f, 0x1f, 0xe, 0xce, 0xe4, 0x35, 0x76, 0xf7, 0xfd, + 0xe3, 0x9e, 0x77, 0x12, 0xd7, 0xe7, 0xf7, 0x9e, 0xe7, 0x13, 0x6c, 0x9c, + 0xf5, 0x15, 0xbe, 0x52, 0xd2, 0xc4, 0x5, 0x13, 0xac, 0x6f, 0xac, 0xb7, + 0x80, 0xb9, 0x1b, 0xb8, 0xba, 0x9a, 0xa4, 0xaf, 0x1f, 0x13, 0x5c, 0xbe, + 0x51, 0xd2, 0xc6, 0x58, 0xc5, 0x5, 0xb2, 0xb2, 0xa5, 0xc7, 0xc4, 0x1a, + 0xa7, 0x86, 0xa7, 0x7f, 0xa3, 0x1e, 0xd5, 0xc5, 0x5e, 0xc4, 0x40, 0x50, + 0x5, 0x13, 0xac, 0xa7, 0x6b, 0x5f, 0x97, 0x5e, 0x1b, 0x5c, 0x5a, 0x7d, + 0x73, 0x67, 0x1f, 0x13, 0x9c, 0x5a, 0xc4, 0x43, 0x50, 0xbd, 0x51, 0x5, + 0x67, 0x63, 0x70, 0x51, 0x53, 0x1a, 0x6e, 0x8f, 0x70, 0x98, 0x72, 0x1e, + 0xd6, 0xec, 0x15, 0x13, 0xac, 0xda, 0xdc, 0xd0, 0xd8, 0xcb, 0xb7, 0x5d, + 0x50, 0x3b, 0x3a, 0x46, 0x3d, 0x4b, 0x60, 0xb9, 0xc7, 0x1e, 0xe, 0x7c, + 0xe9, 0x39, 0xe9, 0xf7, 0x7f, 0xe9, 0xf7, 0x4, 0xe9, 0x12, 0x9d, 0xef, + 0x13, 0x78, 0xf8, 0xe, 0x88, 0x15, 0xf7, 0x46, 0x3f, 0xa, 0x3c, 0x6, + 0xf4, 0xf8, 0xab, 0x5, 0xfb, 0x73, 0x87, 0xa, 0xf7, 0x11, 0x6, 0x70, + 0xfb, 0x1c, 0x5, 0xac, 0x6a, 0x53, 0x91, 0x53, 0x1b, 0xfb, 0x32, 0xfb, + 0x1d, 0xfb, 0x16, 0xfb, 0x24, 0x1f, 0x13, 0xb8, 0x24, 0xde, 0x42, 0xf7, + 0x13, 0xc1, 0xc6, 0xa5, 0xab, 0xba, 0x1e, 0x13, 0x78, 0xfb, 0xa2, 0xf7, + 0x20, 0x15, 0xe6, 0xe3, 0xce, 0xea, 0xd9, 0xba, 0x68, 0x52, 0x1e, 0x13, + 0xb8, 0xfb, 0x18, 0xfb, 0x1e, 0x65, 0x5f, 0x44, 0x54, 0xb1, 0xcd, 0x1e, + 0xe, 0xf7, 0xcf, 0xed, 0xf7, 0x3b, 0x77, 0x1, 0xf7, 0x3a, 0xee, 0x3, + 0xf7, 0x3a, 0x45, 0x15, 0xee, 0x6, 0xd6, 0xf8, 0x15, 0x5, 0xf7, 0x26, + 0x6, 0x9e, 0xed, 0x5, 0xfb, 0x26, 0x6, 0xad, 0xf7, 0x3b, 0x7b, 0xa, + 0x69, 0xfb, 0x3b, 0x5, 0xfb, 0x26, 0x6, 0x78, 0x29, 0x5, 0xf7, 0x25, + 0x6, 0xe, 0xf7, 0x4, 0xee, 0xf7, 0x9, 0xec, 0xf7, 0x2f, 0x77, 0x1, + 0xf7, 0x4b, 0xf0, 0x3, 0xcf, 0xf7, 0xe, 0x15, 0xf7, 0x2e, 0x6, 0x64, + 0xfb, 0x54, 0x5, 0xf0, 0x6, 0xaf, 0xf7, 0x54, 0x70, 0xa, 0x9f, 0xee, + 0x85, 0xa, 0xa3, 0xf6, 0x70, 0xa, 0x9f, 0xec, 0x85, 0xa, 0xa9, 0xf7, + 0x2f, 0x66, 0xa, 0x68, 0xfb, 0x2f, 0x5, 0xfb, 0x2a, 0x6, 0x77, 0x2a, + 0x5, 0xf7, 0x2a, 0x6, 0x77, 0x20, 0x5, 0xfb, 0x2e, 0x6, 0xe, 0xf7, + 0x87, 0xe6, 0xf7, 0x53, 0xe6, 0x1, 0xf1, 0xed, 0xf7, 0x5e, 0xeb, 0x3, + 0xf1, 0xf8, 0x15, 0x15, 0x39, 0xcf, 0x4f, 0xe8, 0xf7, 0x21, 0xe9, 0xf4, + 0xf7, 0xd, 0xe2, 0x4a, 0xc7, 0x2d, 0xfb, 0xa, 0xfb, 0xb, 0x2d, 0xfb, + 0x1d, 0x1e, 0xed, 0xa1, 0x15, 0xcc, 0xc1, 0xc0, 0xcd, 0xbf, 0xa9, 0x6a, + 0x5e, 0x4e, 0x51, 0x57, 0x4d, 0x5a, 0x6a, 0xab, 0xb4, 0x1e, 0xe, 0xf8, + 0x79, 0xf7, 0x20, 0x1, 0xf7, 0x12, 0xf7, 0xe, 0xd8, 0xf7, 0xf, 0x3, + 0xf7, 0xd9, 0xf8, 0x79, 0x15, 0xf7, 0xf, 0x6, 0xa5, 0x97, 0xa, 0xfb, + 0xe, 0x6, 0xfb, 0x76, 0xfb, 0x20, 0x15, 0xf7, 0xe, 0x6, 0xa6, 0x97, + 0xa, 0xfb, 0xf, 0x6, 0xe, 0x9b, 0xf7, 0x2b, 0xaf, 0xf7, 0x2, 0xaf, + 0xf7, 0x2b, 0x12, 0xf7, 0x57, 0xf7, 0x23, 0x4d, 0xf7, 0x23, 0x14, 0xe0, + 0x13, 0xe8, 0xf7, 0xa8, 0xf8, 0x29, 0x4f, 0xa, 0xfb, 0x6d, 0xfb, 0x5e, + 0x73, 0xa, 0x13, 0xf0, 0xf7, 0x9, 0xfb, 0x85, 0x4f, 0xa, 0xe, 0x22, + 0x76, 0xf7, 0x8, 0xf7, 0x4a, 0xf7, 0x75, 0xf7, 0x49, 0x20, 0xe9, 0x2d, + 0xf7, 0x57, 0x12, 0xf7, 0x4, 0xf5, 0xf7, 0x4e, 0xf0, 0x13, 0xce, 0xa8, + 0x81, 0x15, 0xf0, 0x6, 0x93, 0xbe, 0x5, 0x7b, 0x9c, 0xa4, 0x85, 0xa0, + 0x1b, 0x6e, 0xfb, 0x25, 0x5, 0xf0, 0x6, 0xa9, 0xf7, 0x24, 0x5, 0xd5, + 0x8c, 0xf7, 0x14, 0xbb, 0xf7, 0x1f, 0x1a, 0xda, 0x31, 0xa1, 0x31, 0xa5, + 0x1e, 0x68, 0x94, 0x43, 0x9f, 0xb1, 0x1a, 0xcf, 0xe0, 0x8e, 0xb1, 0xb0, + 0xa5, 0x82, 0x71, 0xb1, 0x1e, 0x13, 0xe6, 0x83, 0x64, 0x5, 0xee, 0x6, + 0xb1, 0xf7, 0x49, 0x5, 0x27, 0x6, 0x83, 0x62, 0x80, 0x9e, 0x79, 0x90, + 0x79, 0x8e, 0x19, 0x13, 0xce, 0xa1, 0xf1, 0x5, 0x24, 0x6, 0x13, 0xd6, + 0x77, 0x26, 0x5, 0x3c, 0x8a, 0xfb, 0x10, 0x54, 0xfb, 0x11, 0x1a, 0x8a, + 0x3c, 0xd7, 0x6c, 0xf3, 0x6d, 0x8, 0xb1, 0x81, 0xd6, 0x82, 0x56, 0x1a, + 0x56, 0xfb, 0x6, 0x86, 0x6f, 0x65, 0x69, 0x93, 0xa2, 0x6c, 0x1e, 0x93, + 0xa6, 0x5, 0x26, 0x6, 0xe, 0xf8, 0x79, 0xf7, 0x20, 0x1, 0xf7, 0x78, + 0xf7, 0x9, 0x3, 0xf7, 0x78, 0xf8, 0x79, 0x15, 0xf7, 0x9, 0x6, 0xa6, + 0x97, 0xa, 0xfb, 0x9, 0x6, 0xe, 0x7f, 0xa, 0xcd, 0xf8, 0x55, 0x3, + 0xcd, 0x16, 0xf8, 0x55, 0x6, 0x9e, 0xe9, 0x3e, 0xa, 0xd1, 0xf7, 0xed, + 0x5, 0xfb, 0x80, 0x6f, 0xa, 0xf7, 0x1e, 0x6, 0x58, 0xfb, 0x8f, 0x43, + 0xa, 0x7c, 0xea, 0xe0, 0xeb, 0xec, 0xeb, 0x1, 0xf8, 0x65, 0xea, 0x3, + 0xf7, 0x26, 0xf7, 0x48, 0x15, 0xf8, 0x23, 0x6, 0x91, 0xa0, 0x94, 0xb5, + 0xa8, 0x1a, 0xf4, 0x34, 0xd8, 0xfb, 0xc, 0xfb, 0x1a, 0xfb, 0x49, 0x35, + 0xfb, 0x5c, 0x26, 0xdb, 0x39, 0xf7, 0x30, 0xe7, 0xe7, 0xab, 0xb2, 0xda, + 0x1e, 0x6d, 0xda, 0x5, 0x66, 0x44, 0x49, 0x79, 0x3e, 0x1b, 0xfb, 0x11, + 0x74, 0xbd, 0xae, 0x8c, 0x1f, 0xa7, 0xeb, 0x15, 0xd1, 0xaa, 0xd9, 0xa6, + 0xc7, 0x1b, 0xcb, 0xc4, 0x6c, 0x49, 0x8c, 0x1f, 0xe, 0x5f, 0xa, 0xf7, + 0x82, 0xf8, 0x76, 0x15, 0xf7, 0xd9, 0xd9, 0x77, 0xf0, 0xfb, 0xcf, 0xfb, + 0xc, 0x5, 0x34, 0xfc, 0x13, 0x32, 0xa, 0x61, 0xa, 0xf7, 0x73, 0x77, + 0x76, 0xa, 0xf7, 0x5c, 0xf8, 0x73, 0x15, 0xf7, 0x40, 0xf4, 0xf7, 0x11, + 0x22, 0xcc, 0xad, 0xfb, 0x14, 0xf7, 0x24, 0x66, 0xa, 0xfb, 0x52, 0xfb, + 0x23, 0x5, 0x85, 0xfb, 0xf8, 0x35, 0xa, 0xfb, 0x49, 0x93, 0xa, 0xd2, + 0x31, 0xa, 0x61, 0xa, 0xce, 0xf7, 0x10, 0x76, 0xa, 0xf8, 0x25, 0xf8, + 0x89, 0x6d, 0xa, 0xa5, 0xf7, 0x10, 0x83, 0xa, 0xfb, 0x66, 0xfb, 0x10, + 0x5a, 0xa, 0xa4, 0xf7, 0x10, 0x65, 0xa, 0x28, 0xfc, 0x67, 0x32, 0xa, + 0x5f, 0xa, 0xf7, 0x6e, 0xf8, 0xc3, 0x15, 0xf7, 0xc3, 0x3e, 0xaf, 0xc5, + 0xfb, 0xa7, 0xf7, 0xd, 0x5, 0xfb, 0x21, 0xfc, 0x8b, 0x35, 0xa, 0xfb, + 0x4a, 0x93, 0xa, 0xd3, 0x3c, 0xf7, 0x2a, 0xea, 0xd9, 0xa0, 0xb5, 0xdd, + 0x1f, 0x81, 0xdc, 0x2f, 0xa, 0x7c, 0xe7, 0xf7, 0x49, 0xea, 0xf7, 0x3e, + 0xe8, 0x12, 0xc2, 0xf0, 0x6e, 0xed, 0xf7, 0x45, 0xeb, 0x56, 0xee, 0x13, + 0xf4, 0xf7, 0x47, 0xf7, 0xc9, 0x15, 0x46, 0x62, 0x54, 0x49, 0x3d, 0x1a, + 0x2c, 0xf0, 0x5f, 0xe3, 0xf7, 0x3d, 0xdf, 0xf7, 0x6, 0xe3, 0x8c, 0x1e, + 0x8c, 0xbe, 0x7b, 0xb3, 0x60, 0xab, 0x8, 0x13, 0xea, 0xc9, 0xb0, 0xb5, + 0xc7, 0xd4, 0x1a, 0xdb, 0x45, 0xc3, 0x23, 0xfb, 0x1c, 0x20, 0x29, 0x25, + 0x61, 0x9c, 0x67, 0xae, 0x6e, 0x1e, 0xb9, 0xf7, 0x0, 0x15, 0xc5, 0xc1, + 0xbb, 0xd2, 0xd5, 0xa1, 0x67, 0x6a, 0x8a, 0x1e, 0x4b, 0x47, 0x66, 0x51, + 0x58, 0x60, 0xa3, 0xb3, 0x1e, 0x13, 0xf4, 0x46, 0xfb, 0x9b, 0x15, 0xc8, + 0xd4, 0xb6, 0xcf, 0xd2, 0xaa, 0x6c, 0x67, 0x8e, 0x1e, 0x46, 0x42, 0x5e, + 0x4e, 0x48, 0x5e, 0xaf, 0xb4, 0x1e, 0xe, 0x7c, 0xf7, 0x17, 0x1, 0xa3, + 0xf7, 0x21, 0xca, 0xf7, 0x21, 0xcc, 0xf7, 0x21, 0x3, 0xa3, 0xaf, 0x15, + 0x60, 0xa, 0xa7, 0x7a, 0xa5, 0x63, 0x54, 0x6e, 0x5f, 0x67, 0x1e, 0xf8, + 0x2e, 0x50, 0xa, 0xfb, 0x62, 0x50, 0xa, 0xe, 0xf7, 0x5f, 0xef, 0x1, + 0x75, 0xf9, 0x5, 0x3, 0x75, 0xf7, 0x5f, 0x15, 0xf9, 0x5, 0x6, 0x9e, + 0xef, 0x5, 0xfd, 0x5, 0x6, 0xe, 0xf7, 0x5f, 0xef, 0x1, 0xc0, 0xf8, + 0x6f, 0x3, 0xc0, 0xf7, 0x5f, 0x15, 0xf8, 0x6f, 0x6, 0x9e, 0xef, 0x5, + 0xfc, 0x6f, 0x6, 0xe, 0xf7, 0xa, 0xf2, 0xd5, 0xf2, 0x1, 0xb4, 0xf8, + 0x64, 0x3, 0xd6, 0xf7, 0xbb, 0x15, 0xf8, 0x65, 0x6, 0x9e, 0xf2, 0x5, + 0xfc, 0x64, 0x6, 0x55, 0xfb, 0xac, 0x15, 0xf8, 0x64, 0x6, 0x9f, 0xf2, + 0x5, 0xfc, 0x65, 0x6, 0xe, 0x70, 0xe2, 0xf7, 0x95, 0xe1, 0x91, 0xa, + 0x9b, 0xf7, 0x0, 0xf7, 0xed, 0xf7, 0x7, 0x3, 0xf7, 0x80, 0xf8, 0x42, + 0x15, 0xf7, 0x1d, 0xc1, 0xd0, 0x62, 0xa8, 0x4a, 0x8c, 0x87, 0x19, 0x9d, + 0x6d, 0x78, 0x96, 0x44, 0x1b, 0xfb, 0x5c, 0xfb, 0x1c, 0xfb, 0x1, 0xfb, + 0x2c, 0x31, 0xd5, 0x3c, 0xf7, 0x35, 0xf7, 0x80, 0xec, 0xf7, 0x2c, 0xf7, + 0x41, 0xf7, 0x10, 0x39, 0xd4, 0x63, 0xa5, 0x1f, 0xf7, 0xb, 0xbf, 0x74, + 0xc0, 0xfb, 0x2d, 0x46, 0x6c, 0x9d, 0x3f, 0xa7, 0x60, 0x93, 0x19, 0x4f, + 0x58, 0xb1, 0x84, 0xbc, 0x77, 0xac, 0x7d, 0x19, 0x22, 0x5d, 0x5, 0x35, + 0xfb, 0xd0, 0x15, 0xf7, 0x0, 0xf7, 0x7, 0xbf, 0xe4, 0xf2, 0xb1, 0x58, + 0x55, 0x23, 0xfb, 0x7, 0x5b, 0x39, 0x3e, 0x44, 0xa8, 0xcf, 0x1e, 0xe, + 0x7c, 0xf7, 0x2e, 0xf8, 0x45, 0x77, 0x1, 0xf7, 0x34, 0xf7, 0x5d, 0x3, + 0xf7, 0x80, 0xf7, 0x48, 0x15, 0xee, 0x6, 0xf3, 0xf8, 0x1c, 0x5, 0xfb, + 0x1e, 0x6, 0xfb, 0x21, 0xfc, 0xa1, 0x15, 0x5f, 0xbf, 0x79, 0xac, 0xc9, + 0xc1, 0xb2, 0xc3, 0xab, 0x6b, 0xa6, 0x56, 0x43, 0x5f, 0x5b, 0x5f, 0x1e, + 0xe, 0xfb, 0x11, 0x76, 0xf8, 0x4b, 0xf7, 0x30, 0x1, 0xf7, 0x83, 0xf7, + 0x5d, 0x3, 0xf7, 0x83, 0xf7, 0xf9, 0x15, 0x69, 0xa9, 0x6d, 0xc0, 0xd4, + 0xb8, 0xb1, 0xc0, 0xbb, 0x57, 0x9c, 0x6a, 0x4e, 0x54, 0x66, 0x54, 0x1e, + 0x3c, 0xfc, 0x8b, 0x15, 0xf7, 0x1f, 0x6, 0xcb, 0xf8, 0x22, 0x7b, 0xa, + 0xe, 0x8b, 0xe9, 0xf7, 0x90, 0xe8, 0xea, 0xe6, 0x1, 0xf7, 0x87, 0xf3, + 0x3, 0xb6, 0x16, 0xf8, 0x49, 0x55, 0xa, 0xfb, 0x77, 0x6, 0xc0, 0xf7, + 0x90, 0x5, 0xf7, 0x78, 0x89, 0xa, 0xfb, 0x77, 0x6, 0xd5, 0x9c, 0x93, + 0xa0, 0xdb, 0x1b, 0xbc, 0xc0, 0x82, 0x83, 0xb8, 0x1f, 0xb1, 0xe8, 0x3e, + 0x95, 0x52, 0x91, 0x5c, 0x8a, 0x19, 0x58, 0x8a, 0x65, 0x83, 0x66, 0x78, + 0x55, 0x6d, 0x7c, 0x5a, 0x80, 0x58, 0x84, 0x6f, 0x18, 0x21, 0x6, 0x77, + 0x2e, 0x5, 0xf5, 0x6, 0x55, 0xfb, 0x90, 0x5, 0x21, 0x6, 0xe, 0xf8, + 0x75, 0xf8, 0x74, 0x15, 0xf5, 0x6, 0xa8, 0xf7, 0x26, 0x5, 0x21, 0x6, + 0xfb, 0x68, 0xfd, 0x6, 0x15, 0xf7, 0xb4, 0x37, 0xa, 0x29, 0x6, 0xcc, + 0xf7, 0xd8, 0x5, 0xfb, 0x48, 0x3c, 0xa, 0xe1, 0x6, 0x5e, 0xfb, 0x7e, + 0x66, 0xa, 0xfb, 0xe0, 0x31, 0x15, 0xf7, 0xb6, 0x37, 0xa, 0x28, 0x6, + 0xb9, 0xf7, 0x7e, 0x5, 0xee, 0x37, 0xa, 0x28, 0x6, 0x99, 0xc9, 0x99, + 0xc2, 0xe1, 0x7c, 0xad, 0x88, 0x19, 0xab, 0xe5, 0xfb, 0x2, 0x90, 0xfb, + 0xe, 0x88, 0x6d, 0xfb, 0x1e, 0x19, 0x7f, 0x56, 0x5, 0x29, 0x3c, 0xa, + 0xed, 0x6, 0x5e, 0xfb, 0x7e, 0x4e, 0xa, 0xe, 0x7c, 0xe7, 0xf7, 0x7e, + 0xe7, 0xf4, 0xe8, 0x1, 0xf8, 0x37, 0xef, 0x3, 0xa7, 0xaf, 0x15, 0x7d, + 0xad, 0xe6, 0x66, 0xe3, 0x1b, 0xf7, 0x43, 0xf2, 0xf7, 0xe, 0xf7, 0x17, + 0xde, 0x55, 0xdd, 0xfb, 0x10, 0x6a, 0x5c, 0x85, 0x77, 0x75, 0x1f, 0xa6, + 0xf7, 0x17, 0x5, 0xf7, 0xb3, 0x94, 0xa, 0xfc, 0x15, 0x6, 0x4b, 0xfb, + 0xd8, 0xcd, 0x71, 0x5, 0xc7, 0xbb, 0xb4, 0x8b, 0xa6, 0x1b, 0xcb, 0xbd, + 0x61, 0x52, 0x3f, 0x4b, 0x50, 0x2d, 0x49, 0x4f, 0x9d, 0xa1, 0x53, 0x1f, + 0xe, 0x8b, 0xe8, 0xf7, 0x86, 0xe9, 0xef, 0xe8, 0x8f, 0x77, 0x12, 0x13, + 0xd0, 0xf7, 0xbf, 0x16, 0xf7, 0xb8, 0x94, 0xa, 0x27, 0x6, 0xf5, 0xf8, + 0xa9, 0x5, 0xfb, 0x1b, 0x82, 0xa, 0xb5, 0x6, 0x34, 0xfc, 0x4c, 0x7b, + 0xa, 0xfb, 0xe1, 0x2e, 0x15, 0xf7, 0xb9, 0x6, 0x9d, 0xe8, 0x5, 0x27, + 0x6, 0xbc, 0xf7, 0x86, 0x5, 0xee, 0x6, 0x9d, 0xe9, 0x5, 0x27, 0x6, + 0x9a, 0xc2, 0x5, 0x13, 0xe0, 0x97, 0xc3, 0xe9, 0x7e, 0xad, 0x8d, 0xaa, + 0xe8, 0x18, 0xfb, 0x16, 0x8e, 0xfb, 0x0, 0x8a, 0x6e, 0xfb, 0x22, 0x80, + 0x56, 0x18, 0x27, 0x44, 0xa, 0xef, 0x6, 0x5b, 0xfb, 0x86, 0x7b, 0xa, + 0xe, 0xfb, 0x17, 0xea, 0xf8, 0x6, 0xea, 0xe8, 0xe9, 0x1, 0xf7, 0xc3, + 0xee, 0x3, 0x8d, 0x6d, 0x15, 0x3b, 0x2e, 0x5, 0x88, 0xa7, 0xc0, 0x86, + 0xbd, 0x1b, 0xdc, 0xe8, 0xa8, 0xf1, 0xb3, 0x1f, 0xf7, 0x1b, 0xf7, 0xe2, + 0x5, 0xf7, 0x3, 0x6, 0xb1, 0xea, 0x65, 0xa, 0xd0, 0xaa, 0xa3, 0xa3, + 0xc2, 0x1b, 0xa4, 0xaa, 0x87, 0x88, 0xa0, 0x1f, 0xc1, 0xe9, 0x5, 0x90, + 0x5e, 0x8b, 0x8d, 0x65, 0x1b, 0xfb, 0x10, 0x43, 0x5c, 0x22, 0x5f, 0x1f, + 0x7b, 0x68, 0x5, 0x20, 0x6, 0x64, 0x2c, 0x5, 0xf7, 0x1, 0x6, 0xfb, + 0x5, 0xfb, 0xae, 0x5, 0x3e, 0x6d, 0x74, 0x80, 0x50, 0x1b, 0x71, 0x70, + 0x8f, 0x8d, 0x74, 0x1f, 0xe, 0x8b, 0xe8, 0xd6, 0xe8, 0xf7, 0xf7, 0x77, + 0x1, 0xf7, 0xd0, 0xef, 0x3, 0xc9, 0xf7, 0x3c, 0x15, 0xf7, 0xa4, 0x6, + 0x79, 0x40, 0x5, 0xfb, 0x0, 0x82, 0xa, 0xf7, 0xbd, 0x89, 0xa, 0x31, + 0x6, 0x9c, 0xd6, 0x5, 0xe0, 0x89, 0xa, 0x35, 0x6, 0xd4, 0xf7, 0xf7, + 0x5, 0xfb, 0x0, 0x6, 0xfb, 0xe5, 0xfc, 0x4, 0x5, 0xf7, 0x6, 0x98, + 0x15, 0xf7, 0x62, 0xf7, 0x7d, 0x5b, 0xfb, 0x7d, 0x5, 0xe, 0x61, 0xf9, + 0x41, 0x3, 0x61, 0x83, 0x15, 0xc8, 0x57, 0xf9, 0x4, 0xf9, 0x34, 0x4b, + 0xbc, 0x5, 0xe, 0xfb, 0x26, 0xe5, 0xea, 0xe3, 0xf7, 0x6f, 0xe4, 0x45, + 0xe4, 0x12, 0xb1, 0xed, 0x13, 0xe8, 0xb8, 0x73, 0x15, 0x62, 0x31, 0x5, + 0x79, 0xdb, 0xd0, 0x7d, 0xd5, 0x1b, 0xf7, 0x50, 0xb4, 0xe7, 0xf2, 0xa0, + 0x1f, 0xc9, 0xf7, 0xbd, 0x5c, 0xa, 0x9e, 0xe4, 0x5, 0xfb, 0x3d, 0x6, + 0x83, 0x6b, 0x5, 0x13, 0xd8, 0xa8, 0x6a, 0x5f, 0xa1, 0x58, 0x1b, 0xfb, + 0x2e, 0xfb, 0x1f, 0xfb, 0x0, 0xfb, 0x1b, 0x27, 0xd6, 0x43, 0xf7, 0x14, + 0xbe, 0xc0, 0x8e, 0xa9, 0xb8, 0x1f, 0x2c, 0x77, 0x81, 0x6a, 0xfb, 0x9, + 0x1b, 0x41, 0x33, 0xa0, 0x96, 0x67, 0x1f, 0xe6, 0xf7, 0x8e, 0x15, 0xdb, + 0xe1, 0xc6, 0xe1, 0xd4, 0xb9, 0x60, 0x4e, 0x8a, 0x1e, 0x33, 0x41, 0x5d, + 0x2c, 0x4a, 0x53, 0xb2, 0xc7, 0x1e, 0xe, 0xfb, 0x26, 0xde, 0xe3, 0xdc, + 0xf7, 0x70, 0xdd, 0x1, 0x9d, 0xed, 0x3, 0xa4, 0x6a, 0x15, 0x62, 0x38, + 0x5, 0x7a, 0xdb, 0xd0, 0x7e, 0xd5, 0x1b, 0xf7, 0x50, 0xb4, 0xe0, 0xea, + 0xa0, 0x1f, 0xc9, 0xf7, 0xae, 0x5c, 0xa, 0x9e, 0xdd, 0x5, 0xfb, 0x3d, + 0x6, 0x83, 0x66, 0x5, 0xa6, 0x6a, 0x5f, 0x9f, 0x58, 0x1b, 0xfb, 0x2e, + 0xfb, 0x1f, 0x27, 0xfb, 0x10, 0x2e, 0xd6, 0x49, 0xf7, 0x14, 0xbe, 0xc0, + 0x8e, 0xa6, 0xb8, 0x1f, 0x34, 0x77, 0x81, 0x6c, 0xfb, 0x9, 0x1b, 0x41, + 0x33, 0x9e, 0x96, 0x67, 0x1f, 0xe6, 0xf7, 0x7a, 0x15, 0xd5, 0xe1, 0xc2, + 0xe1, 0xd4, 0xb9, 0x63, 0x53, 0x8a, 0x1e, 0x39, 0x41, 0x61, 0x2c, 0x4a, + 0x53, 0xaf, 0xc2, 0x1e, 0xf7, 0x65, 0xf7, 0xb5, 0x15, 0xee, 0x6, 0xf7, + 0x54, 0xf7, 0x24, 0x57, 0xaf, 0xfb, 0x46, 0x5e, 0xa, 0x7c, 0xe9, 0x39, + 0xe9, 0xf7, 0x90, 0xe9, 0xf5, 0xde, 0x12, 0xf7, 0xb1, 0xed, 0xf7, 0xe, + 0xed, 0x13, 0x7c, 0x88, 0x88, 0x15, 0xf7, 0x45, 0x6, 0xe6, 0xf8, 0x56, + 0x5, 0xdf, 0x9b, 0xad, 0x97, 0xdd, 0x1b, 0xbe, 0xb7, 0x82, 0x6a, 0x6b, + 0x40, 0x77, 0x74, 0x86, 0x1f, 0x4d, 0x7d, 0x5c, 0x56, 0x46, 0x1a, 0x4f, + 0xc9, 0x74, 0xcb, 0x73, 0x1e, 0xaa, 0x80, 0xca, 0x81, 0x6f, 0x1a, 0x13, + 0xbc, 0x69, 0x4d, 0x64, 0x4d, 0x66, 0x62, 0x9d, 0x97, 0x70, 0x1e, 0x46, + 0x46, 0x5, 0x67, 0xc2, 0xb0, 0x78, 0xc2, 0x1b, 0xf7, 0x1f, 0xf7, 0x2, + 0xda, 0xf6, 0xca, 0x46, 0xa4, 0x4c, 0xa0, 0x1f, 0x71, 0x93, 0x4d, 0x99, + 0xad, 0x1a, 0xa3, 0xbc, 0x9e, 0xa7, 0x94, 0x1e, 0xcd, 0xa0, 0xc9, 0xa1, + 0xd3, 0x1a, 0xd6, 0x77, 0xbb, 0xfb, 0x3f, 0xfb, 0x2f, 0x5c, 0x55, 0xfb, + 0x5, 0x74, 0x1e, 0x86, 0x75, 0x5, 0x3b, 0x6f, 0xa, 0xdd, 0x6, 0x13, + 0x7c, 0x59, 0xfb, 0x90, 0x5, 0x38, 0x6, 0xe, 0xf7, 0x4c, 0xf7, 0x7b, + 0x3, 0xf7, 0x4c, 0xf8, 0xcf, 0x15, 0xf7, 0x63, 0x4c, 0xa3, 0xbc, 0xfb, + 0x50, 0xf3, 0x5, 0xe, 0xaf, 0x76, 0xf8, 0x7a, 0x77, 0x1, 0xc1, 0x9a, + 0x15, 0xf8, 0x6b, 0xf7, 0x4b, 0xa0, 0xf7, 0xa, 0xfc, 0x25, 0xf7, 0x4d, + 0x7a, 0x2d, 0xf7, 0xd1, 0xfb, 0x2a, 0xfc, 0xa, 0xfb, 0x28, 0x5, 0xe, + 0xd1, 0xc5, 0xf7, 0x96, 0xc7, 0x1, 0xc5, 0xf7, 0x5, 0xf7, 0x2, 0xf7, + 0x5, 0x3, 0xc5, 0xf7, 0x9b, 0x51, 0xa, 0x9c, 0xfb, 0x4b, 0x51, 0xa, + 0xe, 0xe6, 0x76, 0xf8, 0xc, 0x77, 0x1, 0xf7, 0x86, 0xf7, 0xa, 0xd0, + 0xf7, 0x5, 0x3, 0xc5, 0xf7, 0x19, 0x15, 0xaf, 0x4c, 0xf7, 0x9e, 0xf7, + 0x4e, 0xfb, 0x5e, 0xf7, 0x52, 0x53, 0x4d, 0xf7, 0x20, 0xfb, 0x13, 0x5, + 0x9a, 0xfb, 0x10, 0x15, 0xae, 0x4c, 0xf7, 0x8e, 0xf7, 0x4e, 0xfb, 0x4c, + 0xf7, 0x52, 0x53, 0x4d, 0xf7, 0x13, 0xfb, 0x13, 0x5, 0xe, 0xd1, 0xf8, + 0xc, 0x1, 0xf7, 0x12, 0xf7, 0xbd, 0x3, 0xf7, 0x12, 0xf7, 0x97, 0x15, + 0xf7, 0x7f, 0xfb, 0x51, 0xc9, 0xbf, 0xfb, 0x3f, 0xf7, 0x1c, 0xf7, 0x72, + 0xf7, 0x11, 0x65, 0xca, 0x5, 0xe, 0xd1, 0xf8, 0xc, 0x1, 0xf7, 0x12, + 0xf7, 0x18, 0x15, 0xb2, 0x4d, 0xf7, 0xc9, 0xf7, 0x51, 0xfb, 0x7a, 0xf7, + 0x4f, 0x4b, 0x56, 0xf7, 0x3d, 0xfb, 0x12, 0x5, 0xe, 0x81, 0xa, 0xf1, + 0xec, 0x3, 0x8d, 0x16, 0xf7, 0x94, 0x55, 0xa, 0x3c, 0x6, 0xb2, 0xf7, + 0x57, 0x5, 0xbc, 0xdc, 0xc4, 0x94, 0xa7, 0x1b, 0xb1, 0x9f, 0x7b, 0x76, + 0x82, 0x89, 0x81, 0x89, 0x81, 0x1f, 0x66, 0xfb, 0x4f, 0x5, 0x3b, 0x6f, + 0xa, 0xf7, 0x96, 0x3f, 0xa, 0x3a, 0x6, 0xaf, 0xf7, 0x48, 0x5, 0x8f, + 0x9c, 0x8f, 0x9d, 0x9d, 0x1a, 0xc5, 0x77, 0xc2, 0xfb, 0x8, 0x4f, 0x57, + 0x76, 0x71, 0x55, 0x1e, 0xbb, 0xf7, 0x7d, 0x5, 0xfb, 0x46, 0x44, 0xa, + 0xdd, 0x6, 0x31, 0xfc, 0x4a, 0x5, 0x3a, 0x6, 0xe, 0xf8, 0x7c, 0xf7, + 0x41, 0x1, 0xba, 0xc2, 0xf7, 0x34, 0xc2, 0x3, 0xf7, 0x9a, 0xf8, 0x8f, + 0x15, 0xc2, 0x78, 0xf7, 0x80, 0xf7, 0x23, 0x31, 0xa9, 0x5, 0xfc, 0x34, + 0xfb, 0x2e, 0x15, 0xc2, 0x78, 0xf7, 0x82, 0xf7, 0x23, 0x31, 0xa9, 0x5, + 0xe, 0xf7, 0x5f, 0xf7, 0x2, 0x1, 0xe3, 0xf8, 0x25, 0x3, 0xe3, 0xf7, + 0x5f, 0x15, 0xf8, 0x25, 0x6, 0xa2, 0xf7, 0x2, 0x5, 0xfc, 0x25, 0x6, + 0xe, 0x8b, 0xea, 0xf7, 0x93, 0xea, 0xc9, 0xf7, 0x2b, 0x1, 0xf7, 0xf3, + 0xf7, 0x4, 0x3, 0xf7, 0xd4, 0x69, 0xa, 0xfb, 0xbb, 0xfd, 0x26, 0x15, + 0xf8, 0x54, 0x6, 0x9f, 0xea, 0x8f, 0xa, 0x6, 0xd1, 0xf7, 0xf2, 0x5, + 0xfb, 0x7f, 0x6, 0x77, 0x2c, 0x5, 0xf7, 0x1d, 0x6, 0x59, 0xfb, 0x93, + 0x5, 0xfb, 0x44, 0x6, 0xe, 0x78, 0xa, 0x91, 0xa, 0xf7, 0x7e, 0xf8, + 0x77, 0x15, 0xf7, 0xdf, 0xd8, 0x78, 0xf0, 0xfb, 0xd6, 0xfb, 0xc, 0x5, + 0xfb, 0x48, 0xfc, 0xb1, 0x2e, 0xa, 0x78, 0xa, 0xf7, 0x6f, 0x77, 0x1, + 0xf7, 0x5f, 0xf8, 0x74, 0x15, 0xf7, 0x37, 0xf3, 0xf7, 0x9, 0x23, 0xc8, + 0xae, 0xfb, 0xc, 0xf7, 0x22, 0x5, 0x30, 0x6, 0xfb, 0x48, 0xfb, 0x21, + 0x5, 0xfb, 0x1, 0xfc, 0x98, 0x2e, 0xa, 0x78, 0xa, 0xc9, 0xf7, 0x11, + 0x1, 0xf8, 0x27, 0xf8, 0x89, 0x15, 0xf7, 0x1, 0x89, 0xa4, 0xf7, 0x12, + 0x86, 0xa, 0xfb, 0x5e, 0xfb, 0x10, 0x15, 0xf7, 0x0, 0x6, 0xa4, 0xf7, + 0x10, 0x5, 0xfb, 0x1, 0x6, 0xfb, 0x61, 0xfd, 0x5, 0x2e, 0xa, 0x78, + 0xa, 0x91, 0xa, 0xf7, 0x73, 0xf8, 0xc4, 0x15, 0xf7, 0xaa, 0x3e, 0xac, + 0xc5, 0xfb, 0x90, 0xf7, 0xc, 0x5, 0xfb, 0x82, 0xfd, 0x29, 0x2e, 0xa, + 0xfb, 0x26, 0xea, 0xf8, 0x35, 0xe6, 0xbd, 0xf7, 0x2b, 0xfb, 0x25, 0xf7, + 0x25, 0x12, 0x13, 0xe0, 0xf7, 0x20, 0x69, 0xa, 0xfb, 0x61, 0xfd, 0x59, + 0x15, 0x77, 0x2c, 0x5, 0xf7, 0x82, 0x6, 0x9f, 0xea, 0x5, 0x41, 0x6, + 0xf7, 0x2, 0xf8, 0x84, 0x5, 0xfb, 0x39, 0x6, 0x77, 0x2c, 0x5, 0xce, + 0x6, 0x31, 0xfc, 0x25, 0x5, 0x13, 0xd0, 0xf8, 0x69, 0xf8, 0xc8, 0x15, + 0xf7, 0xc, 0x6, 0xac, 0xf7, 0x25, 0x5, 0xfb, 0xd, 0x6, 0xfb, 0xa1, + 0xfd, 0x4a, 0x15, 0x5e, 0x30, 0x5, 0x86, 0x9a, 0xa4, 0x7d, 0xc5, 0x1b, + 0xf7, 0x4b, 0x9e, 0x8b, 0xa, 0xfb, 0x67, 0x6e, 0xa, 0xf4, 0x6, 0x44, + 0xfb, 0xce, 0x5, 0x45, 0x7b, 0x6c, 0x66, 0x61, 0x1b, 0x57, 0x7f, 0x9a, + 0x8f, 0x81, 0x1f, 0xe, 0xfb, 0x26, 0xe6, 0xf8, 0x39, 0xe6, 0xc3, 0xf7, + 0x25, 0x1, 0xf7, 0xc5, 0xf4, 0x3, 0xf8, 0xf, 0xf8, 0x95, 0x15, 0xf7, + 0xb, 0x6, 0xac, 0xf7, 0x25, 0x5, 0xfb, 0xc, 0x6, 0xfc, 0xe, 0xfd, + 0x4a, 0x15, 0x5e, 0x30, 0x5, 0x82, 0xc1, 0xc2, 0x81, 0xc5, 0x1b, 0xf7, + 0x66, 0xab, 0x8b, 0xa, 0xfc, 0x7, 0x6e, 0xa, 0xf7, 0x9d, 0x6, 0x44, + 0xfb, 0xce, 0x5, 0x45, 0x7b, 0x6a, 0x66, 0x3b, 0x1b, 0x57, 0x5d, 0x93, + 0x96, 0x5e, 0x1f, 0xe, 0x8b, 0xe9, 0x1, 0xe9, 0xd9, 0xf7, 0x15, 0xf7, + 0x91, 0x3, 0x87, 0x16, 0xf7, 0x44, 0x6, 0xae, 0xf7, 0x3d, 0xb2, 0xa3, + 0xb1, 0x72, 0xae, 0x68, 0xa7, 0x64, 0x19, 0x6f, 0x87, 0xa, 0xf7, 0x91, + 0x6, 0x9d, 0xe9, 0x5, 0x21, 0x6, 0x6a, 0xbd, 0x44, 0xcc, 0x68, 0xac, + 0xf7, 0x2a, 0xf2, 0x18, 0xf7, 0x0, 0x55, 0xa, 0xfb, 0xa3, 0x6f, 0xa, + 0x9f, 0x6, 0x20, 0x43, 0xd3, 0xf7, 0xf5, 0x5, 0xfb, 0x44, 0x6f, 0xa, + 0xdb, 0x6, 0x32, 0xfc, 0x4a, 0x5, 0x3c, 0x6, 0xe, 0x81, 0xa, 0xf7, + 0x98, 0xee, 0x3, 0xcd, 0x16, 0xf8, 0x54, 0x6, 0x9f, 0xe9, 0x3e, 0xa, + 0xf7, 0x1, 0xf8, 0xa8, 0x5, 0xfb, 0x94, 0x87, 0xa, 0xf7, 0x30, 0x6, + 0x31, 0xfc, 0x4a, 0x8f, 0xa, 0x6, 0xe, 0xaf, 0x76, 0xf8, 0x7a, 0x77, + 0x1, 0xc1, 0xf7, 0x5c, 0x15, 0xf8, 0x25, 0xfb, 0x4d, 0x9c, 0xe9, 0xfb, + 0xd1, 0xf7, 0x2a, 0xf8, 0x9, 0xf7, 0x28, 0x9c, 0xe9, 0xfc, 0x6a, 0xfb, + 0x4b, 0x5, 0xe, 0x84, 0x76, 0xb0, 0x76, 0xf7, 0x46, 0xde, 0xce, 0xde, + 0xf7, 0xb, 0xe8, 0x12, 0xf7, 0x3f, 0xea, 0x13, 0xbc, 0x52, 0xa, 0x13, + 0x7c, 0x3d, 0xa, 0x7c, 0x7f, 0x88, 0x83, 0x7f, 0x1f, 0x9c, 0x9a, 0xa8, + 0xbe, 0x89, 0x8e, 0x8, 0xf7, 0x47, 0x6, 0x9f, 0xde, 0x5, 0xfb, 0x3e, + 0x6, 0x89, 0x92, 0x91, 0xa8, 0x8a, 0xaa, 0x8, 0xf7, 0x27, 0x6, 0x9f, + 0xde, 0x5, 0xfb, 0x3a, 0x92, 0x6, 0xcb, 0xab, 0x47, 0xa, 0x3f, 0x3e, + 0xfb, 0x10, 0x1f, 0x80, 0x3b, 0x7, 0x78, 0x38, 0x5, 0xeb, 0x6, 0x6c, + 0x83, 0x6e, 0x8c, 0x84, 0x1e, 0x27, 0x6, 0x78, 0x38, 0x5, 0xe8, 0x6, + 0x8c, 0x6f, 0x67, 0x56, 0x43, 0x5a, 0x8, 0xe, 0xf7, 0xc0, 0xf7, 0x5, + 0x1, 0xf8, 0x18, 0xee, 0x3, 0xc6, 0xf7, 0xc0, 0x15, 0xf7, 0xff, 0x6, + 0x69, 0xfb, 0x59, 0x5, 0xee, 0x6, 0xc1, 0xf7, 0xca, 0x5, 0xfc, 0x63, + 0x6, 0xe, 0x81, 0xa, 0xf7, 0x91, 0xf4, 0x3, 0xbc, 0x16, 0xf8, 0x6d, + 0x55, 0xa, 0xfb, 0x4c, 0x6, 0xbb, 0xf7, 0x73, 0xf7, 0x16, 0xaa, 0x99, + 0xcd, 0xfb, 0x15, 0x6b, 0xc0, 0xf7, 0x88, 0x5, 0xfb, 0xae, 0x6, 0x76, + 0x2d, 0x5, 0xf7, 0x46, 0x6, 0x64, 0xfb, 0x45, 0xfb, 0x18, 0x6a, 0x7e, + 0x4a, 0xf7, 0x17, 0xab, 0x60, 0xfb, 0x57, 0x5, 0xfb, 0x4b, 0x6, 0xe, + 0x8b, 0xea, 0xf7, 0x90, 0xea, 0x1, 0xd4, 0xdd, 0xf5, 0xee, 0x3, 0x76, + 0x16, 0xf7, 0x8a, 0x6, 0x9c, 0xea, 0x5, 0x34, 0x6, 0xb6, 0xf7, 0x7b, + 0x5, 0x9c, 0xa0, 0xb0, 0x9b, 0xa1, 0x1b, 0xaa, 0x96, 0x77, 0x78, 0x86, + 0x8b, 0x87, 0x8a, 0x87, 0x1f, 0x51, 0xfb, 0xc7, 0x5, 0xf7, 0x35, 0x6, + 0x9b, 0xea, 0x5, 0x3d, 0x6, 0xb6, 0xf7, 0x73, 0x5, 0xab, 0xa7, 0xae, + 0x94, 0x9b, 0x1b, 0xad, 0x97, 0x6f, 0x81, 0x89, 0x1f, 0x4f, 0xfb, 0xd5, + 0x5, 0xf7, 0x1f, 0x6, 0x9b, 0xea, 0x5, 0x53, 0x6, 0xb7, 0xf7, 0x72, + 0x5, 0x8d, 0x95, 0x8c, 0x96, 0x94, 0x1a, 0xc9, 0x65, 0xb8, 0x46, 0x62, + 0x5f, 0x79, 0x6c, 0x6a, 0x1e, 0xb5, 0x7b, 0x66, 0x92, 0x75, 0x1b, 0x6c, + 0x6c, 0x7f, 0x73, 0x73, 0x1f, 0x8e, 0xa3, 0x5, 0xfb, 0x3b, 0x6, 0x79, + 0x2c, 0x5c, 0xa, 0x5a, 0xfb, 0x90, 0x5, 0x3d, 0x6, 0xe, 0xf8, 0x8d, + 0xdb, 0x1, 0xda, 0xf8, 0x3b, 0x3, 0xda, 0xf8, 0x8d, 0x15, 0xf8, 0x3b, + 0x6, 0x9d, 0xdb, 0x5, 0xfc, 0x3b, 0x6, 0xe, 0xf7, 0x5f, 0xf7, 0x2, + 0x1, 0xc6, 0xf8, 0x63, 0x3, 0xc6, 0xf7, 0x5f, 0x73, 0xa, 0xe, 0xfb, + 0xd, 0x76, 0xf7, 0x2a, 0xe0, 0x42, 0xe4, 0xf7, 0x85, 0xe4, 0x12, 0x13, + 0xd0, 0xa8, 0xfb, 0x22, 0x15, 0xeb, 0x6, 0xb1, 0xf7, 0x48, 0x5, 0x7d, + 0x98, 0x9d, 0x7b, 0xb2, 0x1b, 0xcc, 0xb8, 0xab, 0xab, 0xb7, 0x1f, 0x13, + 0xb0, 0x7f, 0x57, 0x5, 0xf7, 0x44, 0x6, 0x9e, 0xe4, 0x5, 0x3b, 0x6, + 0xcf, 0xf7, 0xde, 0x8d, 0xa, 0x63, 0xfb, 0x57, 0x5, 0x13, 0xd0, 0x68, + 0x5c, 0x62, 0x70, 0x50, 0x1b, 0x5f, 0x74, 0xa1, 0xad, 0x92, 0x8b, 0x94, + 0x8d, 0x93, 0x1f, 0xc1, 0xf7, 0x9e, 0x8d, 0xa, 0xe, 0xbc, 0xf8, 0x4e, + 0x3, 0xbc, 0xef, 0x15, 0xbc, 0x4e, 0xf7, 0x52, 0xf7, 0x35, 0xf7, 0x15, + 0xfb, 0x35, 0xd5, 0xc8, 0xfb, 0x15, 0xf7, 0x33, 0xf7, 0x50, 0xf7, 0x30, + 0x5b, 0xc7, 0xfb, 0x53, 0xfb, 0x31, 0xfb, 0x13, 0xf7, 0x34, 0x41, 0x4f, + 0xf7, 0x16, 0xfb, 0x33, 0x5, 0xe, 0x8b, 0xe9, 0xf7, 0x90, 0xea, 0x3b, + 0xe8, 0x12, 0x13, 0xa0, 0x8d, 0x16, 0xf7, 0x96, 0x3f, 0xa, 0x39, 0x6, + 0xb4, 0xf7, 0x5d, 0x5, 0xb6, 0xc6, 0xd3, 0xa2, 0xaa, 0x1b, 0xbd, 0x9a, + 0x7a, 0x72, 0x82, 0x89, 0x81, 0x89, 0x80, 0x1f, 0x64, 0xfb, 0x57, 0x5, + 0x3c, 0x44, 0xa, 0xf7, 0x93, 0x3f, 0xa, 0x3b, 0x6, 0xb7, 0xf7, 0x6d, + 0x5, 0x13, 0xc0, 0x8e, 0x98, 0x8d, 0x96, 0x96, 0x1a, 0x13, 0xa0, 0xd0, + 0x4d, 0xb2, 0x3e, 0x52, 0x4b, 0x6f, 0x6f, 0x5a, 0x1e, 0x13, 0xc0, 0x93, + 0xb6, 0x5, 0xfb, 0x46, 0x6, 0x78, 0x2c, 0x5, 0xde, 0x6, 0x58, 0xfb, + 0x90, 0x5, 0x3b, 0x6, 0xe, 0x7c, 0xe4, 0xf7, 0x1b, 0xe8, 0xf7, 0x70, + 0xe9, 0x1, 0xf7, 0x1d, 0xf1, 0xf7, 0x77, 0xe7, 0x3, 0xb5, 0x82, 0x15, + 0x87, 0xaa, 0xb5, 0x89, 0xbd, 0x1b, 0xf7, 0x5a, 0xf7, 0x57, 0xf7, 0x28, + 0xf7, 0xb0, 0xf2, 0x62, 0xeb, 0xfb, 0x1a, 0xfb, 0x15, 0xfb, 0x9, 0xfb, + 0x5, 0xfb, 0xa, 0x1f, 0x2e, 0x89, 0xce, 0x38, 0xf1, 0x1b, 0xb6, 0xb5, + 0x9d, 0x9b, 0xa8, 0x1f, 0xfb, 0xc, 0x6a, 0xfb, 0x1e, 0x5a, 0xfb, 0x48, + 0x1b, 0xf8, 0x23, 0xf7, 0xc6, 0x15, 0x86, 0x53, 0x42, 0x37, 0x56, 0x69, + 0xb1, 0xc4, 0xdf, 0xdb, 0xb4, 0xbe, 0xe3, 0x97, 0x3d, 0x4b, 0x87, 0x1e, + 0xe, 0x8b, 0xe7, 0xf7, 0x89, 0xe7, 0xf7, 0xc, 0xe0, 0x1, 0xf7, 0x38, + 0xf8, 0x95, 0x15, 0xda, 0x71, 0x5, 0xa4, 0x9a, 0x9c, 0xb0, 0xaf, 0x1b, + 0xa1, 0xa1, 0x7a, 0x7b, 0xa3, 0x1f, 0x7d, 0xa1, 0xa1, 0x7e, 0xa4, 0x1b, + 0xed, 0xbc, 0xe3, 0xaf, 0x9c, 0x1f, 0x3d, 0xa2, 0x5, 0x62, 0x71, 0x7e, + 0x75, 0x6e, 0x1b, 0x78, 0x77, 0x98, 0x98, 0x77, 0x1f, 0x9c, 0x72, 0x72, + 0x9d, 0x6f, 0x1b, 0x2d, 0x5d, 0x3d, 0x60, 0x72, 0x1f, 0xfb, 0x44, 0xfc, + 0x95, 0x15, 0xf7, 0x8c, 0x6, 0x9c, 0xe7, 0x5, 0x3d, 0x6, 0xb1, 0xf7, + 0x56, 0x5, 0xb6, 0xc4, 0xd1, 0xa1, 0xa7, 0x1b, 0xba, 0x9b, 0x7c, 0x75, + 0x81, 0x8a, 0x80, 0x89, 0x7f, 0x1f, 0x66, 0xfb, 0x51, 0x5, 0x3f, 0x6, + 0x78, 0x2f, 0x5, 0xf7, 0x88, 0x6, 0x9d, 0xe7, 0x5, 0x40, 0x6, 0xb4, + 0xf7, 0x66, 0x5, 0x8e, 0x98, 0x8c, 0x97, 0x97, 0x1a, 0xcd, 0x50, 0xb0, + 0x42, 0x55, 0x4b, 0x6f, 0x70, 0x5e, 0x1e, 0x94, 0xb5, 0x5, 0xfb, 0x40, + 0x6, 0x79, 0x2f, 0x8a, 0xa, 0x5a, 0xfb, 0x89, 0x5, 0x3e, 0x6, 0xe, + 0xf7, 0x29, 0xe6, 0xf7, 0x6, 0xe6, 0x12, 0xf7, 0x4, 0xe9, 0x84, 0xe5, + 0x9f, 0xe7, 0x81, 0xe9, 0x13, 0xe8, 0xce, 0x5e, 0x15, 0xe2, 0x6, 0xbf, + 0xf7, 0x56, 0x5, 0xf2, 0x6, 0x56, 0x98, 0xa, 0xea, 0x6, 0xbd, 0xf7, + 0x56, 0x5, 0xf7, 0x5, 0x34, 0xa, 0x21, 0x6, 0xab, 0xf7, 0x6, 0x5, + 0xed, 0x34, 0xa, 0x13, 0xd4, 0x30, 0x6, 0xc1, 0xf7, 0x62, 0x5, 0x30, + 0x6, 0x52, 0xfb, 0x62, 0x5, 0x25, 0x6, 0xc2, 0xf7, 0x62, 0x5, 0x32, + 0x6, 0x53, 0xfb, 0x62, 0x5, 0xfb, 0x5, 0x36, 0xa, 0xf6, 0x6, 0x6b, + 0xfb, 0x6, 0x5, 0x28, 0x36, 0xa, 0x13, 0xe8, 0xe3, 0x6, 0xf7, 0xb, + 0xe6, 0x15, 0xab, 0xf7, 0x6, 0x5, 0xf3, 0x6, 0x6b, 0xfb, 0x6, 0x5, + 0xe, 0x7c, 0xeb, 0xf7, 0xa9, 0xeb, 0x1, 0xa4, 0xf1, 0xf7, 0xef, 0xf0, + 0x3, 0xa4, 0xf7, 0x3c, 0x15, 0xfb, 0x1b, 0xf7, 0x17, 0x5b, 0xf4, 0xf7, + 0x31, 0xf7, 0x31, 0xe5, 0xf7, 0x4d, 0xee, 0x4b, 0xea, 0xfb, 0x35, 0xfb, + 0x2e, 0xfb, 0x3f, 0x22, 0xfb, 0x49, 0x1e, 0xf1, 0x9b, 0x15, 0xf3, 0xe8, + 0xd1, 0xf6, 0xf7, 0x3, 0xaf, 0x51, 0x54, 0xfb, 0x5, 0xfb, 0x1, 0x58, + 0x33, 0x54, 0x2c, 0x9e, 0xdf, 0x1e, 0xe, 0x5d, 0xa, 0xf7, 0x88, 0xf8, + 0x77, 0x15, 0xf7, 0xdf, 0xd8, 0x77, 0xf0, 0xfb, 0xd6, 0xfb, 0xc, 0x5, + 0xfb, 0x65, 0xfc, 0x12, 0x29, 0xa, 0x63, 0xa, 0xf7, 0x71, 0x77, 0x45, + 0xa, 0xf7, 0x2b, 0xf8, 0x95, 0x15, 0xc0, 0x67, 0xf7, 0x45, 0xf7, 0x0, + 0xf7, 0x13, 0xfb, 0x0, 0xce, 0xae, 0xfb, 0x18, 0xf7, 0x25, 0x4e, 0xa, + 0xfb, 0xd5, 0xfc, 0x86, 0x30, 0xa, 0xfb, 0x3, 0xfb, 0x3a, 0x2d, 0xa, + 0x63, 0xa, 0xcc, 0xf7, 0x10, 0x45, 0xa, 0xf8, 0x21, 0xf8, 0x89, 0x72, + 0xa, 0xfb, 0x68, 0xfb, 0x10, 0x72, 0xa, 0xfb, 0x69, 0xfc, 0x66, 0x29, + 0xa, 0x7c, 0xea, 0xe0, 0xea, 0xed, 0xeb, 0x1, 0x76, 0xef, 0x3, 0xf7, + 0xab, 0xc1, 0x15, 0x69, 0xa3, 0xa1, 0x68, 0xe7, 0x1b, 0xc3, 0xbc, 0x99, + 0xa0, 0xc6, 0x1f, 0x7e, 0xe7, 0x5, 0x74, 0x46, 0x62, 0x82, 0x73, 0x1b, + 0x4a, 0x77, 0xb0, 0xa6, 0x94, 0x8c, 0x92, 0x8e, 0x90, 0x1f, 0xf7, 0x8a, + 0x6, 0x97, 0xad, 0x95, 0xb9, 0xb8, 0x1a, 0xde, 0x6c, 0xdc, 0x2c, 0x5c, + 0x5a, 0x78, 0x68, 0x63, 0x1e, 0xb1, 0x71, 0x5c, 0x9b, 0x58, 0x1b, 0xfb, + 0x32, 0x29, 0xfb, 0x32, 0xfb, 0x32, 0x44, 0xa8, 0x39, 0xf7, 0xe, 0xd2, + 0xc1, 0xb8, 0xa3, 0xa3, 0x1f, 0xe1, 0xf7, 0x62, 0x15, 0xb3, 0x97, 0xb6, + 0xc5, 0xbf, 0x1b, 0xd0, 0x7d, 0x3f, 0x75, 0x88, 0x1f, 0xfc, 0x51, 0xfb, + 0xc, 0x15, 0xc2, 0xb1, 0xf7, 0x37, 0xea, 0xbb, 0x96, 0x66, 0x6b, 0x41, + 0x60, 0xfb, 0x1b, 0x38, 0x60, 0x74, 0xa1, 0xb1, 0x1e, 0xe, 0xfb, 0x5b, + 0xd4, 0x1, 0xf7, 0x59, 0xe2, 0x3, 0xf7, 0xc9, 0x8a, 0x15, 0x78, 0x2e, + 0x56, 0x40, 0x64, 0xa5, 0x6c, 0xb7, 0xa9, 0xa9, 0x97, 0xa0, 0xa5, 0x1f, + 0xa7, 0xdd, 0x5, 0x7b, 0x80, 0x64, 0x71, 0x72, 0x1b, 0x7e, 0x82, 0x91, + 0x9e, 0xb1, 0xe7, 0xba, 0xa6, 0x9a, 0x1f, 0xe, 0x5d, 0xa, 0xf7, 0x6d, + 0xf8, 0xc3, 0x15, 0xf7, 0xc9, 0x3e, 0xae, 0xc6, 0xfb, 0xab, 0xf7, 0xc, + 0x5, 0xfb, 0x96, 0xfc, 0x8a, 0x29, 0xa, 0x8b, 0xe8, 0x1, 0xf7, 0x9c, + 0xeb, 0x3, 0xcd, 0x16, 0xf8, 0x55, 0x94, 0xa, 0xfb, 0x42, 0x6, 0xf5, + 0xf8, 0x9f, 0xfb, 0xa3, 0x56, 0x78, 0x30, 0xf7, 0x3f, 0xad, 0x38, 0xfc, + 0x31, 0x5, 0xfb, 0x47, 0x6, 0xe, 0x5d, 0xce, 0x4f, 0x76, 0xf7, 0xb7, + 0xcf, 0x8a, 0xd0, 0xf7, 0xba, 0x77, 0x12, 0xc4, 0xcf, 0xf7, 0x7d, 0xce, + 0xeb, 0xcf, 0x13, 0xaf, 0xf7, 0xc6, 0x5d, 0x15, 0xf7, 0x82, 0x6, 0x98, + 0xce, 0x5, 0xfb, 0x1a, 0x6, 0xf1, 0xd8, 0x5, 0xac, 0xa0, 0xaa, 0xb4, + 0xb9, 0x1a, 0xaf, 0x7b, 0xc4, 0x3b, 0x5f, 0x5e, 0x75, 0x68, 0x68, 0x1e, + 0x80, 0x4c, 0x5, 0xce, 0x6, 0xa4, 0x90, 0x91, 0xa6, 0xb6, 0x1b, 0x9f, + 0xa1, 0x81, 0x75, 0x79, 0x7e, 0x73, 0x79, 0x7e, 0x1f, 0xfb, 0x41, 0xfb, + 0x19, 0x5, 0xfb, 0xfe, 0x77, 0x15, 0x13, 0x5f, 0xc5, 0x58, 0xf9, 0xd, + 0xf9, 0x35, 0x4d, 0xbb, 0x5, 0xfd, 0xa, 0xfb, 0xff, 0x15, 0xf7, 0x83, + 0x6, 0x99, 0xd0, 0x5, 0x39, 0x6, 0xbf, 0xf7, 0xa9, 0xfb, 0x22, 0x6e, + 0x7e, 0x46, 0xd4, 0x9a, 0x65, 0x98, 0xa, 0x32, 0x6, 0xe, 0x5c, 0xc4, + 0x5a, 0x76, 0xf7, 0x6, 0xca, 0xf7, 0x48, 0xd0, 0xf7, 0xbb, 0x77, 0x12, + 0x13, 0xb8, 0xf7, 0x96, 0xc1, 0x15, 0xf7, 0x19, 0x6, 0x84, 0x5f, 0x5, + 0x52, 0x6, 0x80, 0x52, 0x5, 0xf7, 0x37, 0x6, 0x96, 0xc4, 0x5, 0x63, + 0x6, 0x93, 0xb7, 0x5, 0xb3, 0x6, 0x98, 0xca, 0x5, 0x63, 0x6, 0xac, + 0xf7, 0x46, 0x5, 0x4c, 0x6, 0xfb, 0x41, 0x98, 0xa, 0xdd, 0x9b, 0x15, + 0xd0, 0xdc, 0x7c, 0x3a, 0x5, 0xfc, 0x52, 0xfb, 0x12, 0x15, 0x13, 0x78, + 0xc6, 0x58, 0xf9, 0x9, 0xf9, 0x34, 0x4c, 0xbc, 0x5, 0xfd, 0x9, 0xfc, + 0x0, 0x15, 0xf7, 0x82, 0x6, 0x99, 0xd0, 0x5, 0x38, 0x6, 0xbf, 0xf7, + 0xa8, 0xfb, 0x1f, 0x6e, 0x7e, 0x47, 0xd2, 0x9a, 0x66, 0x98, 0xa, 0x32, + 0x6, 0xe, 0xf7, 0x70, 0xd7, 0xf7, 0xd4, 0x77, 0x1, 0xf7, 0xa4, 0xda, + 0x3, 0xf7, 0x29, 0xf7, 0x70, 0x15, 0xf7, 0xb0, 0x6, 0x9c, 0xd7, 0x7b, + 0xa, 0xc9, 0xf7, 0xd4, 0xfb, 0x3b, 0x6a, 0x7b, 0x3f, 0xe0, 0x9c, 0x60, + 0xfb, 0x78, 0x5, 0x21, 0x6, 0xe, 0xf7, 0x58, 0xde, 0xed, 0xda, 0xb4, + 0xde, 0x1, 0xf7, 0x17, 0xd8, 0x3, 0xf7, 0xd6, 0xf7, 0x60, 0x15, 0xf7, + 0x17, 0x6, 0x9a, 0xdd, 0x5, 0x53, 0x6, 0xa4, 0xf7, 0x22, 0x5, 0x8f, + 0xa1, 0x8d, 0xa5, 0xa1, 0x1a, 0xc9, 0x51, 0x9f, 0x53, 0x55, 0x4e, 0x7b, + 0x7d, 0x67, 0x1e, 0x9a, 0x3c, 0x5, 0x99, 0xb2, 0xc3, 0x97, 0xb1, 0x1b, + 0xaa, 0x98, 0x77, 0x6c, 0x87, 0x1f, 0x92, 0x75, 0x74, 0x8e, 0x73, 0x1b, + 0xfb, 0x13, 0x64, 0x32, 0x4b, 0x51, 0xb2, 0x5a, 0xcb, 0xab, 0xae, 0xa0, + 0xa7, 0xa7, 0x1f, 0xa2, 0xf7, 0x12, 0x15, 0x63, 0x76, 0x60, 0x57, 0x63, + 0x1b, 0x69, 0x85, 0xa0, 0x9e, 0xb3, 0xbd, 0x9d, 0xb2, 0xa1, 0xac, 0x85, + 0x8b, 0x1f, 0xe, 0xf7, 0x58, 0xde, 0xf7, 0x6e, 0xde, 0x1, 0xf7, 0x10, + 0xd9, 0xf7, 0x58, 0xd9, 0x3, 0xf7, 0x10, 0xf8, 0x3, 0x15, 0x35, 0xbf, + 0x36, 0xe6, 0xf7, 0x3, 0xed, 0xf7, 0xa, 0xf7, 0x14, 0xdc, 0x5e, 0xe9, + 0x2b, 0xfb, 0x16, 0x3a, 0xfb, 0x26, 0x23, 0x1e, 0xd9, 0x99, 0x15, 0xc5, + 0xb3, 0xea, 0xd7, 0xc4, 0xa2, 0x4b, 0x61, 0x41, 0x54, 0x40, 0x4c, 0x56, + 0x72, 0xc4, 0xb8, 0x1e, 0xe, 0x7d, 0xea, 0x37, 0x76, 0xf8, 0x18, 0xea, + 0x8f, 0x77, 0x12, 0xac, 0xf0, 0xf7, 0xe4, 0xec, 0x13, 0x6c, 0x94, 0xa7, + 0x15, 0xba, 0x57, 0xc6, 0xbb, 0x5, 0x13, 0x9c, 0x70, 0xb7, 0xc1, 0x80, + 0xbb, 0x1b, 0xf7, 0x14, 0xf7, 0x46, 0xea, 0xf7, 0x4e, 0x1f, 0x8c, 0xaf, + 0x83, 0xae, 0x78, 0xaa, 0xbd, 0xb4, 0x18, 0x5d, 0xc0, 0x56, 0x60, 0x5, + 0x13, 0xac, 0xa3, 0x68, 0x5c, 0x9a, 0x4d, 0x1b, 0xfb, 0x29, 0xfb, 0x3a, + 0x20, 0xfb, 0x48, 0x63, 0x96, 0x6a, 0x9d, 0x70, 0x1f, 0xf7, 0x20, 0xa1, + 0x15, 0xf7, 0x93, 0xf7, 0x64, 0x5, 0x93, 0x7d, 0x90, 0x7b, 0x7b, 0x1a, + 0xfb, 0x5, 0xfb, 0x3, 0x4d, 0x39, 0x76, 0x6e, 0x8e, 0x95, 0x72, 0x1e, + 0x53, 0xb8, 0x15, 0x7e, 0xa0, 0x8c, 0xa5, 0x9f, 0x1a, 0xe9, 0xf0, 0xcb, + 0xe7, 0xab, 0xa4, 0x86, 0x82, 0x9f, 0x1e, 0xe, 0x63, 0xa, 0xf7, 0x1e, + 0x77, 0xdd, 0x77, 0x45, 0xa, 0xf7, 0x1b, 0xf8, 0x95, 0x15, 0xd9, 0x71, + 0x5, 0xa0, 0x9c, 0x99, 0xb4, 0xad, 0x1b, 0x9e, 0x9f, 0x81, 0x7e, 0x9f, + 0x1f, 0x7a, 0xa5, 0xa6, 0x78, 0xa9, 0x1b, 0xee, 0xbc, 0xe3, 0xad, 0x9c, + 0x1f, 0x3d, 0xa3, 0x5, 0x62, 0x70, 0x7e, 0x76, 0x6e, 0x1b, 0x76, 0x77, + 0x98, 0x99, 0x76, 0x1f, 0x9b, 0x73, 0x72, 0x9c, 0x70, 0x1b, 0x2c, 0x5d, + 0x3d, 0x60, 0x73, 0x1f, 0xfb, 0x3, 0xfb, 0xf6, 0x29, 0xa, 0xfb, 0x22, + 0xe3, 0xea, 0x76, 0xf7, 0xe1, 0xe3, 0x40, 0xe3, 0x12, 0xb7, 0xe9, 0xf7, + 0xf6, 0xee, 0x13, 0xdc, 0x67, 0x90, 0xa, 0x9e, 0xe3, 0x85, 0xa, 0xa2, + 0xf7, 0x3, 0x5, 0x7d, 0x9d, 0xbd, 0x74, 0xdb, 0x1b, 0xf7, 0x39, 0xf7, + 0xf, 0xf7, 0x7, 0xf7, 0x24, 0xf7, 0x7, 0x3b, 0xc7, 0xfb, 0x1, 0x54, + 0x44, 0x72, 0x6c, 0x5b, 0x1f, 0x13, 0xec, 0x94, 0xb6, 0x3e, 0xa, 0x79, + 0x33, 0x8a, 0xa, 0x35, 0xfc, 0x2b, 0x5, 0xf7, 0x29, 0xf7, 0x8f, 0x15, + 0x13, 0xdc, 0xf7, 0xe, 0xf7, 0x18, 0xae, 0xc0, 0xce, 0xba, 0x6a, 0x56, + 0x39, 0x2f, 0x3a, 0x3d, 0x63, 0x32, 0x99, 0xd9, 0x1e, 0xe, 0xf8, 0xba, + 0xa9, 0x1, 0xf7, 0xb, 0xbf, 0xea, 0xc0, 0x3, 0xf7, 0xb, 0x45, 0x15, + 0xbf, 0x6, 0xf7, 0x7a, 0xf9, 0x0, 0x5, 0xea, 0x6, 0xfb, 0x7a, 0xfd, + 0x0, 0x5, 0xc0, 0x6, 0xf7, 0x78, 0xf9, 0x0, 0x5, 0xc8, 0x6, 0x96, + 0xa9, 0x5, 0xfb, 0x97, 0x6, 0xfb, 0x4e, 0xfb, 0x55, 0x59, 0xfb, 0x2a, + 0x47, 0xce, 0x49, 0xf7, 0x4a, 0x81, 0x1f, 0xe, 0x3a, 0x76, 0xf9, 0x62, + 0x77, 0x1, 0xf7, 0x1d, 0xf2, 0x3, 0xf7, 0x5b, 0x25, 0x15, 0xec, 0x6, + 0x6e, 0xd1, 0x70, 0xec, 0xf6, 0x1a, 0xf7, 0x46, 0xf7, 0xe, 0xf7, 0x23, + 0xf0, 0xf7, 0xf, 0x1e, 0x2b, 0x6, 0xfb, 0x1a, 0xfb, 0x23, 0x2b, 0xfb, + 0x26, 0xfb, 0x46, 0x1a, 0x48, 0x98, 0x32, 0xbc, 0x2c, 0x1e, 0xe, 0x3a, + 0x76, 0xf9, 0x62, 0x77, 0x1, 0xf7, 0xfc, 0xf2, 0x3, 0xf7, 0x1c, 0x25, + 0x15, 0xeb, 0x6, 0xf7, 0x1a, 0xf7, 0x23, 0xec, 0xf7, 0x26, 0xf7, 0x46, + 0x1a, 0xce, 0x7e, 0xe4, 0x5a, 0xea, 0x1e, 0x2a, 0x6, 0xa8, 0x45, 0xa6, + 0x2a, 0x20, 0x1a, 0xfb, 0x46, 0xfb, 0xf, 0xfb, 0x23, 0x26, 0xfb, 0xf, + 0x1e, 0xe, 0x7c, 0xd1, 0xf7, 0x1c, 0xd1, 0xda, 0xd1, 0xf7, 0x1c, 0xd1, + 0x1, 0xc3, 0xdc, 0xd5, 0xdc, 0x9b, 0xdc, 0xd5, 0xdc, 0x3, 0xc3, 0xf8, + 0x5a, 0x39, 0xa, 0xd5, 0xfb, 0xfd, 0x39, 0xa, 0xfb, 0x69, 0xce, 0x15, + 0xf8, 0x5e, 0xf7, 0x4a, 0x7a, 0xcb, 0xfc, 0x5f, 0xfb, 0x4c, 0x5, 0xe, + 0x7c, 0xf7, 0x4e, 0x1, 0xf7, 0x52, 0xf7, 0x6f, 0x3, 0xf7, 0x52, 0xcb, + 0x15, 0x68, 0xa3, 0x5f, 0xd1, 0xc7, 0xcc, 0xb2, 0xcf, 0xb3, 0x6d, 0xb2, + 0x4d, 0x4b, 0x4c, 0x60, 0x4b, 0x1e, 0xe, 0xf7, 0x39, 0xf7, 0x4e, 0x1, + 0xf7, 0x56, 0xf7, 0x68, 0x3, 0xf7, 0x56, 0xf7, 0x87, 0x15, 0x6c, 0x9f, + 0x5c, 0xd3, 0xc9, 0xc5, 0xbc, 0xc5, 0xb3, 0x72, 0xb2, 0x4c, 0x49, 0x51, + 0x55, 0x55, 0x1e, 0xe, 0x7c, 0xd1, 0xf7, 0x1b, 0xd1, 0xdb, 0xd1, 0xf7, + 0x1c, 0xd1, 0x1, 0x3f, 0xd9, 0xab, 0xd9, 0xc2, 0xd7, 0xad, 0xd7, 0xa0, + 0xd9, 0xf7, 0x39, 0xd7, 0x3, 0x3f, 0xf8, 0x57, 0x49, 0xa, 0xc0, 0x3a, + 0xfb, 0xa, 0x42, 0x3c, 0x35, 0x1e, 0xd9, 0x95, 0x15, 0xb7, 0xaf, 0xb4, + 0xc8, 0xb5, 0xa5, 0x72, 0x53, 0xa, 0x3f, 0xfb, 0xaa, 0x15, 0xf8, 0x77, + 0xf7, 0x4f, 0x7a, 0xc9, 0xfc, 0x79, 0xfb, 0x50, 0x5, 0xf8, 0x67, 0xfb, + 0x28, 0x38, 0xa, 0xfc, 0x36, 0x81, 0x38, 0xa, 0xe, 0xf7, 0x68, 0xe9, + 0xf7, 0x40, 0x77, 0x1, 0xf7, 0x62, 0xed, 0x3, 0xc6, 0xf7, 0x68, 0x15, + 0xf7, 0x4a, 0x6, 0x68, 0xfb, 0x3d, 0x56, 0xa, 0xae, 0xf7, 0x3d, 0x5, + 0xf7, 0x4b, 0x3f, 0xa, 0xfb, 0x4a, 0x6, 0xae, 0xf7, 0x40, 0x4e, 0xa, + 0x68, 0xfb, 0x40, 0x5, 0xfb, 0x4b, 0x6, 0xe, 0xa9, 0xdc, 0xf7, 0x43, + 0xdc, 0xf7, 0x28, 0x77, 0x1, 0xf7, 0x82, 0xed, 0x3, 0xf7, 0x82, 0xf7, + 0x1e, 0x15, 0xed, 0x6, 0xad, 0xf7, 0x28, 0x5, 0xf7, 0x48, 0x6, 0x9e, + 0xdc, 0x5, 0xfb, 0x48, 0x6, 0xae, 0xf7, 0x28, 0x4e, 0xa, 0x69, 0xfb, + 0x28, 0x5, 0xfb, 0x47, 0x6, 0x78, 0x3a, 0x5, 0xf7, 0x47, 0x6, 0xfb, + 0x86, 0xfb, 0x9a, 0x15, 0xf8, 0x5c, 0x6, 0x9e, 0xdc, 0x5, 0xfc, 0x5c, + 0x6, 0xe, 0x7c, 0xe9, 0xf7, 0x12, 0xe9, 0xf7, 0x3d, 0xe9, 0x1, 0xf8, + 0x89, 0xf1, 0x3, 0xf7, 0xdc, 0xb0, 0x15, 0xc8, 0x57, 0xb5, 0xb7, 0x96, + 0x7c, 0x95, 0x7d, 0x90, 0x7c, 0x19, 0xf7, 0xa, 0x55, 0xa, 0x3a, 0x6, + 0x7d, 0xa0, 0xdb, 0xdd, 0x54, 0xbf, 0x46, 0x46, 0x65, 0xc5, 0x5, 0xf7, + 0xd, 0x9e, 0xcb, 0xe1, 0xe8, 0x1a, 0xec, 0x39, 0xb7, 0x23, 0x1e, 0xfb, + 0xbc, 0x44, 0xa, 0xdd, 0x6, 0x39, 0xfc, 0x19, 0x5, 0x34, 0x44, 0xa, + 0xf7, 0x9f, 0x3f, 0xa, 0x3b, 0x6, 0xa5, 0xf7, 0x12, 0x5, 0xdf, 0x6, + 0xd3, 0xfb, 0x4, 0x5, 0xfb, 0x1c, 0xf7, 0x62, 0x15, 0xae, 0xf7, 0x3d, + 0x5, 0xf7, 0x1b, 0x6, 0xa3, 0xc6, 0x82, 0x5a, 0x2a, 0x23, 0x7d, 0x58, + 0x1f, 0xe, 0xfb, 0x22, 0xe3, 0xd6, 0xe1, 0xf7, 0x8c, 0xe3, 0x3f, 0xe2, + 0x12, 0x81, 0xf1, 0x13, 0xe8, 0xf7, 0x4a, 0x90, 0xa, 0xa0, 0xe3, 0x5, + 0x3b, 0x6, 0xe3, 0xf8, 0x2d, 0x5c, 0xa, 0x9f, 0xe3, 0x3e, 0xa, 0x7f, + 0x5e, 0x5, 0x13, 0xd8, 0xad, 0x69, 0x5c, 0xa1, 0x53, 0x1b, 0xfb, 0x31, + 0xfb, 0x21, 0xfb, 0xf, 0xfb, 0x18, 0x29, 0xd7, 0x3b, 0xf7, 0x14, 0xc1, + 0xc2, 0x90, 0xa9, 0xbb, 0x1f, 0x75, 0xfb, 0x2, 0x5, 0xfb, 0x81, 0xf7, + 0x9c, 0x15, 0xe1, 0xdc, 0xd2, 0xf0, 0xed, 0xa0, 0x49, 0x56, 0xfb, 0x11, + 0xfb, 0x1a, 0x7b, 0x5e, 0x46, 0x56, 0xb4, 0xc9, 0x1e, 0xe, 0x7d, 0xf7, + 0x2c, 0xf7, 0xf2, 0xe7, 0x1, 0xeb, 0xf7, 0x54, 0xf7, 0x8, 0xef, 0x3, + 0xf7, 0x3d, 0xf7, 0x4a, 0x15, 0xed, 0x6, 0x98, 0xc5, 0x5, 0xe3, 0x9a, + 0xf7, 0x1c, 0xc2, 0xf7, 0x1a, 0x1a, 0xe4, 0x3c, 0xba, 0xfb, 0x0, 0x53, + 0x3c, 0x7d, 0x77, 0x52, 0x1e, 0x6e, 0xfb, 0x24, 0x5, 0xee, 0x6, 0x99, + 0xd7, 0x5, 0x91, 0xa7, 0xa9, 0x8f, 0xa7, 0x1b, 0xc6, 0xbd, 0x7a, 0x62, + 0x30, 0xfb, 0x2, 0x79, 0x28, 0x7c, 0x1f, 0x28, 0xfb, 0x9e, 0x15, 0x6a, + 0xae, 0x76, 0xba, 0xd8, 0xac, 0xbd, 0xb6, 0xa2, 0x7b, 0xaf, 0x4c, 0x4a, + 0x5b, 0x5c, 0x58, 0x1e, 0xe, 0xfb, 0x26, 0xe8, 0xf7, 0xf2, 0xf7, 0x2c, + 0x1, 0xeb, 0xed, 0xf7, 0xc, 0xf7, 0x52, 0x3, 0xf7, 0xce, 0xf8, 0x2, + 0x15, 0x78, 0x8a, 0x90, 0x59, 0xd6, 0x1b, 0xce, 0xb7, 0xb8, 0xbb, 0xaf, + 0x6a, 0xa2, 0x5b, 0x44, 0x65, 0x5d, 0x66, 0x1f, 0x8e, 0xfb, 0x3e, 0x15, + 0x4b, 0x85, 0xfb, 0x31, 0x4a, 0xfb, 0x1b, 0x1a, 0x33, 0xd9, 0x5b, 0xf6, + 0xc1, 0xdf, 0x99, 0x9f, 0xc4, 0x1e, 0xa7, 0xf7, 0x1a, 0x66, 0xa, 0x7d, + 0x49, 0x5, 0x86, 0x6e, 0x68, 0x87, 0x6e, 0x1b, 0x51, 0x5b, 0x9c, 0xb4, + 0xe7, 0xf7, 0x2, 0x9d, 0xec, 0x9a, 0x1f, 0xa4, 0xf7, 0x13, 0x66, 0xa, + 0xe, 0xf8, 0xc6, 0x77, 0x1, 0xf7, 0x6, 0xf7, 0x4, 0xd5, 0xf7, 0x2, + 0x3, 0xf7, 0xc0, 0xf7, 0xa9, 0x15, 0xf7, 0x2, 0x6, 0xd7, 0x71, 0xa, + 0xfb, 0x20, 0x6, 0xfb, 0x7c, 0xfb, 0xb1, 0x5a, 0xa, 0xd7, 0x71, 0xa, + 0xfb, 0x20, 0x6, 0xe, 0xfb, 0x22, 0xf7, 0xb1, 0x1, 0xf7, 0x90, 0xfb, + 0x22, 0x15, 0xf7, 0x9, 0x80, 0xa, 0xfb, 0x31, 0x6, 0xfc, 0x3, 0xfb, + 0xb1, 0x15, 0xf7, 0x7, 0x6, 0xf7, 0x57, 0x71, 0xa, 0xfb, 0x32, 0x6, + 0xe, 0xf7, 0x46, 0xf7, 0x5, 0xed, 0xf7, 0x5, 0x3, 0xf8, 0x19, 0xf7, + 0xa9, 0x6d, 0xa, 0x63, 0x71, 0xa, 0xfb, 0x2d, 0x6, 0xfb, 0x17, 0xfb, + 0xb1, 0x6d, 0xa, 0x64, 0x71, 0xa, 0xfb, 0x2e, 0x6, 0xe, 0xf7, 0xbe, + 0x76, 0xf7, 0xb1, 0x77, 0x1, 0xb1, 0xf7, 0x8, 0xee, 0xf7, 0xa, 0x3, + 0xf7, 0x91, 0xf7, 0xa9, 0x15, 0xf7, 0xa, 0x6, 0xf7, 0x53, 0x71, 0xa, + 0xfb, 0x32, 0x6, 0xfc, 0x2, 0xfb, 0xb1, 0x15, 0xf7, 0x8, 0x80, 0xa, + 0xfb, 0x33, 0x6, 0xe, 0xf7, 0xa9, 0xf7, 0xb1, 0x1, 0xf7, 0xaf, 0xf7, + 0xa9, 0x5a, 0xa, 0x65, 0x71, 0xa, 0xfb, 0x2c, 0x6, 0xe, 0xf7, 0xbe, + 0x76, 0xf7, 0xb1, 0x77, 0x1, 0xf7, 0x24, 0xf7, 0xa, 0x3, 0xf7, 0x24, + 0xf7, 0xa9, 0x15, 0xf7, 0xa, 0x6, 0xf7, 0x56, 0x71, 0xa, 0xfb, 0x35, + 0x6, 0xe, 0xfb, 0xd, 0x76, 0xf7, 0xae, 0x77, 0x1, 0xf7, 0x24, 0xf7, + 0xb, 0x3, 0xf7, 0x24, 0xfb, 0x22, 0x15, 0xf7, 0xb, 0x80, 0xa, 0xfb, + 0x34, 0x6, 0xe, 0xf7, 0xbb, 0x76, 0xf7, 0xb4, 0x77, 0x1, 0xf7, 0x62, + 0xf7, 0x5, 0x3, 0xf7, 0x62, 0xf7, 0xa6, 0x6d, 0xa, 0xd6, 0xf7, 0xb4, + 0x5, 0xfb, 0x20, 0x6, 0xe, 0x7f, 0xa, 0xf7, 0x2b, 0xee, 0x3, 0x9c, + 0x16, 0xf8, 0x2c, 0x3f, 0xa, 0xfb, 0x56, 0x6, 0xac, 0xf7, 0x2b, 0x5, + 0xc2, 0xcd, 0xcc, 0xc7, 0xdf, 0x1b, 0xa4, 0x8d, 0x81, 0x72, 0x8a, 0x1f, + 0xed, 0x99, 0x5, 0xcb, 0x8b, 0xbe, 0x22, 0x41, 0x40, 0x53, 0x63, 0x4e, + 0x1e, 0x98, 0xdc, 0x5, 0xfb, 0x6b, 0x87, 0xa, 0xf7, 0x7, 0x6, 0x58, + 0xfb, 0x8f, 0x83, 0xa, 0xe, 0x79, 0xb8, 0xf6, 0xf7, 0x37, 0xf2, 0xba, + 0xe3, 0xb8, 0x1, 0x84, 0xba, 0xf7, 0xe5, 0xba, 0xf7, 0x1d, 0xb9, 0x3, + 0x84, 0xf7, 0x6e, 0x15, 0xfb, 0x1a, 0xf5, 0x25, 0xf7, 0x24, 0xf7, 0x4c, + 0xf7, 0x48, 0xf7, 0x3b, 0xf7, 0x51, 0xf7, 0x1d, 0x25, 0xf4, 0xfb, 0x25, + 0xfb, 0x4f, 0xfb, 0x48, 0xfb, 0x3f, 0xfb, 0x53, 0x1e, 0xba, 0x9e, 0x15, + 0xf7, 0x32, 0xf7, 0x34, 0xf7, 0x20, 0xf7, 0x2b, 0xf7, 0x13, 0xde, 0x2e, + 0xfb, 0xc, 0xfb, 0x31, 0xfb, 0x34, 0xfb, 0x1e, 0xfb, 0x2a, 0xfb, 0x12, + 0x36, 0xe6, 0xf7, 0xb, 0x1e, 0xf7, 0x18, 0x24, 0x15, 0xbb, 0x6, 0xa5, + 0xf7, 0x8, 0x5, 0xbf, 0x6, 0xa6, 0xfb, 0x8, 0x5, 0xc5, 0x6, 0x6e, + 0xf7, 0x13, 0x5, 0xb6, 0x95, 0xa6, 0xb4, 0xc4, 0x1a, 0xcf, 0x53, 0x95, + 0x4e, 0x1e, 0x41, 0x6, 0xa1, 0xfb, 0x2a, 0x15, 0x9b, 0xf2, 0x5, 0xbb, + 0x6, 0xa8, 0xa8, 0x83, 0x6f, 0x55, 0x61, 0x7e, 0x6c, 0x1f, 0xe, 0xf8, + 0x75, 0xc6, 0xda, 0xc6, 0x1, 0xf7, 0x57, 0xc9, 0xdf, 0xca, 0x3, 0xf7, + 0x57, 0xf8, 0xc5, 0x15, 0x5e, 0xad, 0x68, 0xbd, 0xcf, 0xc4, 0xc4, 0xcb, + 0xb6, 0x69, 0xac, 0x5a, 0x49, 0x4f, 0x54, 0x4d, 0x1e, 0xc9, 0x96, 0x15, + 0xa5, 0xa3, 0xa0, 0xa6, 0x9f, 0x98, 0x7f, 0x7a, 0x71, 0x76, 0x73, 0x6f, + 0x76, 0x7d, 0x99, 0x9d, 0x1e, 0xe, 0x7a, 0xe6, 0xf4, 0xd9, 0xa0, 0xf7, + 0x49, 0x2b, 0xeb, 0x12, 0xf7, 0x2, 0xe9, 0xf7, 0x76, 0xed, 0x13, 0xdc, + 0xa9, 0x7a, 0x15, 0xed, 0x6, 0x93, 0xb2, 0x5, 0x76, 0xb5, 0xbe, 0x79, + 0xc0, 0x1b, 0xf7, 0x1e, 0xf7, 0x0, 0xab, 0xf7, 0x1, 0xe8, 0x33, 0xab, + 0x40, 0x93, 0x1f, 0xfb, 0x5, 0x96, 0x5b, 0x97, 0xac, 0x1a, 0xb6, 0xef, + 0x92, 0xa2, 0xb6, 0xb7, 0x7c, 0x75, 0xab, 0x1e, 0x13, 0xec, 0x81, 0x5b, + 0x56, 0xa, 0xaf, 0xf7, 0x49, 0x4e, 0xa, 0x85, 0x69, 0x5, 0x9a, 0x66, + 0x5f, 0x9e, 0x5c, 0x1b, 0xfb, 0x13, 0x26, 0x5b, 0x24, 0x2b, 0xf7, 0xf, + 0x70, 0xd4, 0x85, 0x1f, 0xad, 0x88, 0xe5, 0x83, 0x57, 0x1a, 0x67, 0x3e, + 0x85, 0x52, 0x45, 0x5d, 0xa3, 0x9c, 0x71, 0x1e, 0x98, 0xc8, 0x7b, 0xa, + 0xe, 0x7a, 0xe0, 0xf7, 0x57, 0xf7, 0x40, 0x1, 0xe8, 0xe4, 0xf7, 0x6c, + 0xe6, 0x3, 0xf7, 0xc1, 0xf8, 0x79, 0x15, 0xeb, 0x6, 0xf7, 0x4d, 0xf7, + 0x25, 0x58, 0xb0, 0xfb, 0x3d, 0xfb, 0x0, 0xfb, 0x10, 0xf7, 0x0, 0x48, + 0x67, 0x5, 0xfb, 0x2e, 0xfd, 0x1c, 0x15, 0xe8, 0x6, 0x93, 0xb1, 0x5, + 0x7b, 0xb4, 0xc2, 0x75, 0xbf, 0x1b, 0xf7, 0x24, 0xda, 0xc1, 0xe3, 0xdd, + 0x4c, 0xaf, 0x38, 0x92, 0x1f, 0x26, 0x93, 0x4f, 0x91, 0xaf, 0x1a, 0xbf, + 0xe5, 0x8b, 0xa2, 0xb4, 0xb9, 0x73, 0x7a, 0xa9, 0x1e, 0x82, 0x5e, 0x5, + 0xe9, 0x6, 0xad, 0xf7, 0x40, 0x5, 0x2e, 0x6, 0x84, 0x6b, 0x5, 0x98, + 0x68, 0x5d, 0x9e, 0x5e, 0x1b, 0x28, 0xfb, 0x4, 0x72, 0xfb, 0x3, 0x8a, + 0x1f, 0x2a, 0xf7, 0x9, 0x6b, 0xd0, 0x85, 0x1e, 0xac, 0x88, 0xe1, 0x8f, + 0x60, 0x1a, 0x6a, 0x4a, 0x73, 0x55, 0x48, 0x57, 0xac, 0x94, 0x74, 0x1e, + 0x95, 0xc6, 0x5, 0x2d, 0x6, 0xe, 0xfb, 0x62, 0xce, 0xf7, 0xe, 0xf7, + 0x57, 0x81, 0xe2, 0xa4, 0xf7, 0x47, 0x12, 0xf7, 0x2, 0xe8, 0x9f, 0xcd, + 0xf7, 0x26, 0xed, 0x13, 0xde, 0xa9, 0x7a, 0x15, 0xed, 0x6, 0x93, 0xb3, + 0xa4, 0x81, 0xa9, 0x7e, 0xab, 0x84, 0x19, 0x6b, 0x26, 0x5, 0x8e, 0x94, + 0x9d, 0x8e, 0x9a, 0x1b, 0x93, 0x94, 0x85, 0x81, 0x80, 0x7e, 0x81, 0x7e, + 0x81, 0x7e, 0x8f, 0x94, 0x7c, 0x1f, 0x62, 0x55, 0x5, 0x73, 0xa6, 0x9e, + 0x89, 0x9d, 0x1b, 0xc6, 0xc5, 0xb3, 0xd0, 0xa1, 0x85, 0xab, 0x67, 0x93, + 0x1f, 0x90, 0x9d, 0x5, 0xf7, 0x2b, 0x8a, 0xe0, 0xc4, 0xe8, 0x1a, 0x13, + 0xbe, 0xe1, 0x49, 0xb1, 0x34, 0x92, 0x1e, 0x21, 0x93, 0x4c, 0x92, 0xb0, + 0x1a, 0xc2, 0xea, 0x8a, 0xa3, 0xb6, 0xbb, 0x73, 0x79, 0xaa, 0x1e, 0x82, + 0x5c, 0x56, 0xa, 0xb0, 0xf7, 0x47, 0x4e, 0xa, 0x84, 0x69, 0x5, 0x99, + 0x66, 0x5b, 0x9f, 0x5c, 0x1b, 0x23, 0xfb, 0xa, 0x72, 0xfb, 0x9, 0x8a, + 0x1f, 0x26, 0xf7, 0xe, 0x69, 0xd4, 0x85, 0x1e, 0xad, 0x88, 0xe5, 0x8f, + 0x5e, 0x1a, 0x68, 0x47, 0x72, 0x53, 0x44, 0x55, 0xae, 0x94, 0x73, 0x1e, + 0x13, 0xde, 0x95, 0xc9, 0x4e, 0xa, 0xe, 0x45, 0xe9, 0xf8, 0x62, 0xe8, + 0x1, 0xcc, 0xf2, 0xf7, 0x9b, 0xf1, 0x3, 0xa6, 0x45, 0x15, 0xf7, 0x82, + 0x6, 0xe6, 0xe7, 0xa7, 0xdf, 0xa8, 0x85, 0x9d, 0x7c, 0x9c, 0x1f, 0xad, + 0x95, 0xc1, 0xbe, 0xc5, 0x1a, 0x8a, 0xa6, 0x7d, 0xa3, 0x74, 0x9d, 0xfb, + 0x6c, 0xf7, 0x41, 0x18, 0x8b, 0x88, 0x8e, 0x8f, 0x1a, 0x96, 0x9c, 0x8c, + 0x91, 0x1e, 0xf7, 0x3c, 0x6, 0x79, 0x35, 0x5, 0xf1, 0x6, 0xb2, 0xf7, + 0x48, 0xfb, 0x88, 0x8a, 0x5, 0x32, 0x37, 0x76, 0x38, 0x6f, 0x96, 0x75, + 0x9d, 0x78, 0x1f, 0x56, 0x76, 0x68, 0x60, 0x5c, 0x1a, 0x6b, 0x9d, 0x68, + 0xb2, 0x6c, 0x1e, 0xf7, 0x42, 0xfb, 0x1e, 0x5, 0x9c, 0x7d, 0x8d, 0x88, + 0x83, 0x1a, 0x82, 0x7b, 0x8a, 0x87, 0x1e, 0xfb, 0x45, 0x6, 0x9e, 0xe3, + 0x5, 0x24, 0x6, 0xf7, 0xb7, 0xc3, 0x15, 0xfb, 0x1f, 0xf7, 0x1, 0x5, + 0x82, 0x92, 0x87, 0x97, 0x97, 0x1a, 0xa0, 0xab, 0x95, 0x99, 0x92, 0x1e, + 0xf7, 0x30, 0xfb, 0xd, 0x5, 0x92, 0x86, 0x8d, 0x83, 0x82, 0x1a, 0x71, + 0x61, 0x84, 0x7a, 0x89, 0x1e, 0xe, 0x31, 0x76, 0xf7, 0xfc, 0xf7, 0x44, + 0x1, 0xf7, 0xa5, 0xf7, 0x6d, 0x3, 0xf7, 0xa5, 0xf7, 0xd6, 0x15, 0x6e, + 0x9f, 0x5f, 0xd3, 0xce, 0xc5, 0xbc, 0xc6, 0xae, 0x6e, 0xac, 0x4e, 0x45, + 0x52, 0x58, 0x57, 0x1e, 0xfb, 0x38, 0xfc, 0x45, 0x15, 0xf7, 0x12, 0x6, + 0xf7, 0x5d, 0xf7, 0xac, 0x5, 0xfb, 0x3b, 0x6, 0xe, 0xa0, 0x76, 0xf8, + 0x39, 0xf7, 0x48, 0x1, 0xf4, 0xf5, 0x3, 0xf4, 0x16, 0xf5, 0x6, 0xf7, + 0xcc, 0xf8, 0xa9, 0x99, 0xcf, 0x5, 0xfc, 0x4a, 0x6, 0x66, 0xfb, 0x48, + 0x56, 0xa, 0x9d, 0xe2, 0x5, 0xf7, 0x80, 0x6, 0xe, 0x7c, 0xe6, 0xf7, + 0x74, 0xe8, 0xf7, 0x1e, 0xdf, 0x8a, 0x77, 0x12, 0xf8, 0x3, 0xed, 0x13, + 0xe8, 0xf7, 0x48, 0xf7, 0xfb, 0x15, 0xf7, 0x19, 0xda, 0xf7, 0x6, 0xb2, + 0xf7, 0x33, 0x1b, 0x13, 0xd8, 0xa5, 0xde, 0x5, 0x13, 0xe8, 0x75, 0x69, + 0x8c, 0x5b, 0x1b, 0xfb, 0x5d, 0x8c, 0xfb, 0x67, 0xfb, 0x50, 0xfb, 0x89, + 0x1a, 0x20, 0xd3, 0x30, 0xf7, 0xc, 0xf7, 0x7, 0xf7, 0x8, 0xf7, 0x7, + 0xf7, 0x8, 0xe3, 0x5b, 0xe4, 0xfb, 0x6, 0x56, 0x73, 0x7f, 0x75, 0x5d, + 0x1e, 0x65, 0xfb, 0x1c, 0x15, 0x8b, 0xc0, 0xd8, 0xdf, 0xd3, 0x9b, 0x53, + 0x60, 0x40, 0x46, 0x59, 0x51, 0x41, 0x65, 0xe0, 0xc9, 0x99, 0x1e, 0xe, + 0xf9, 0x6, 0x77, 0x1, 0xab, 0xf8, 0x69, 0x3, 0xab, 0x5d, 0x15, 0xcb, + 0x6c, 0xf8, 0x6b, 0xf9, 0x32, 0x49, 0xac, 0x5, 0xe, 0xe, 0x84, 0x76, + 0xb0, 0x76, 0xf7, 0xaa, 0xe8, 0xf7, 0x33, 0xe8, 0x12, 0xf7, 0x21, 0xea, + 0x36, 0xed, 0x13, 0xb8, 0x52, 0xa, 0x13, 0x74, 0x3d, 0xa, 0x7b, 0x7d, + 0x87, 0x81, 0x7e, 0x1f, 0xb6, 0xc1, 0xa0, 0xbb, 0xd1, 0x1a, 0xf7, 0x69, + 0x89, 0xa, 0xfb, 0x84, 0x6, 0x13, 0xb8, 0x86, 0x9b, 0x8a, 0x9b, 0x9a, + 0x1a, 0xcb, 0xc9, 0x47, 0xa, 0x21, 0x3e, 0xfb, 0x10, 0x7a, 0x89, 0x7a, + 0x8d, 0x7a, 0x1f, 0x3b, 0x82, 0xa, 0x13, 0xb4, 0xf7, 0x1, 0x6, 0x8a, + 0x2e, 0x59, 0x33, 0x43, 0x5a, 0x8, 0xe, 0x7c, 0xe7, 0xf7, 0x96, 0xe8, + 0xf7, 0x1a, 0x77, 0x1, 0xf4, 0xf7, 0xe3, 0x15, 0xd1, 0x6, 0x62, 0x98, + 0xa, 0x88, 0x7b, 0x89, 0x7e, 0x7e, 0x1a, 0x29, 0xe9, 0x7b, 0xcf, 0xe0, + 0xe6, 0xab, 0xa6, 0xda, 0x1e, 0x8e, 0xe7, 0x5, 0x7c, 0x5f, 0xfb, 0xc, + 0x5f, 0x43, 0x1b, 0x53, 0x76, 0x9f, 0xa4, 0x98, 0x8d, 0x99, 0x8e, 0x99, + 0x1f, 0xb2, 0xf7, 0x40, 0x5, 0xf7, 0x91, 0x89, 0xa, 0xfb, 0x93, 0x6, + 0xa9, 0xf7, 0x1a, 0x5, 0x23, 0x6, 0x6f, 0xfb, 0x1a, 0x5, 0x44, 0x6, + 0xe, 0xfb, 0x22, 0xe4, 0xd5, 0xe4, 0xf7, 0xa6, 0xe5, 0xca, 0xe4, 0x1, + 0xd5, 0xe9, 0xf7, 0xfd, 0xed, 0x3, 0x85, 0x56, 0x15, 0x77, 0x32, 0x5, + 0xf7, 0xd7, 0x6, 0x9e, 0xe4, 0x85, 0xa, 0xa9, 0xf7, 0x18, 0x5, 0x7c, + 0x9c, 0xb7, 0x60, 0xdb, 0x1b, 0xf7, 0x2d, 0xf7, 0x1b, 0xf7, 0x13, 0xf7, + 0x24, 0xf7, 0xa, 0xfb, 0x1, 0xbf, 0x30, 0x55, 0x52, 0x84, 0x6c, 0x5c, + 0x1f, 0xb6, 0xf7, 0x5e, 0x5, 0xfb, 0x45, 0x6, 0x78, 0x32, 0x5, 0xdd, + 0x6, 0xfb, 0x10, 0xfc, 0xe2, 0x5, 0xf7, 0x2e, 0xf7, 0xa3, 0x15, 0xf7, + 0x13, 0xf7, 0x10, 0xa6, 0xc3, 0xce, 0xc1, 0x67, 0x49, 0x2f, 0x2e, 0x47, + 0x36, 0x64, 0x38, 0xa6, 0xdc, 0x8a, 0x1e, 0xe, 0x7c, 0xe8, 0xf7, 0x2b, + 0xe9, 0xf7, 0x5b, 0xe9, 0x12, 0xf8, 0x3c, 0xef, 0x3f, 0xf0, 0x13, 0xf0, + 0xbd, 0xb3, 0x15, 0x79, 0xba, 0xd0, 0x66, 0xee, 0x1b, 0xf7, 0x0, 0xf7, + 0x2b, 0xc6, 0xf7, 0x31, 0xcb, 0x6b, 0xa7, 0x66, 0xa9, 0x1f, 0x13, 0xe8, + 0xb2, 0x9f, 0xc2, 0xc8, 0xd4, 0x1a, 0xe0, 0x44, 0xc1, 0x2b, 0x3f, 0x47, + 0x68, 0x65, 0x47, 0x1e, 0xac, 0x42, 0x5, 0xb2, 0xdb, 0xb1, 0x98, 0xb6, + 0x1b, 0xaf, 0xbb, 0x7c, 0x60, 0x29, 0xfb, 0xc, 0x5f, 0x50, 0x8c, 0x1f, + 0x78, 0x2d, 0x5, 0x13, 0xf0, 0xdd, 0xe7, 0xaa, 0x50, 0x3f, 0x3b, 0x5c, + 0x44, 0x57, 0x6d, 0x95, 0xab, 0x34, 0x1f, 0xe, 0x5e, 0xc4, 0x58, 0x76, + 0xf7, 0x9, 0xca, 0xf7, 0x3d, 0xce, 0xe6, 0xcb, 0x4b, 0xf7, 0x57, 0x49, + 0x77, 0xf4, 0x77, 0x12, 0x13, 0xbb, 0xf7, 0x98, 0xc4, 0x15, 0xf7, 0x19, + 0x6, 0x82, 0x5e, 0x5, 0x52, 0x6, 0x80, 0x52, 0x5, 0xf7, 0x39, 0x6, + 0x96, 0xc4, 0x5, 0x62, 0x6, 0x93, 0xb8, 0x5, 0xb5, 0x6, 0x97, 0xca, + 0x5, 0x62, 0x6, 0xae, 0xf7, 0x46, 0x5, 0x4a, 0x6, 0xfb, 0x41, 0x98, + 0xa, 0xdc, 0x9b, 0x15, 0xd0, 0xda, 0x7d, 0x3c, 0x5, 0xfc, 0x56, 0xfb, + 0x12, 0x15, 0x13, 0x7b, 0xc6, 0x55, 0xf9, 0xb, 0xf9, 0x34, 0x4d, 0xbc, + 0x5, 0xfc, 0xfd, 0xfb, 0xe6, 0x15, 0x71, 0xbc, 0xaa, 0x83, 0xad, 0x1b, + 0xdf, 0xce, 0xc7, 0xd2, 0x1f, 0x8c, 0xa4, 0x82, 0xa3, 0x79, 0x9c, 0x8, + 0x9b, 0x95, 0xa0, 0xaf, 0xa9, 0x1a, 0x13, 0xb4, 0xba, 0x6b, 0xac, 0x51, + 0x5f, 0x61, 0x77, 0x72, 0x64, 0x1e, 0xa5, 0x51, 0x5, 0x13, 0xbb, 0x9b, + 0xa7, 0xad, 0xa0, 0xa9, 0x1b, 0x98, 0x9a, 0x86, 0x78, 0x6e, 0x71, 0x7f, + 0x73, 0x1f, 0x5c, 0x8c, 0x7e, 0x4a, 0x5, 0xc3, 0x6, 0xac, 0x96, 0x7a, + 0x78, 0x6d, 0x70, 0x72, 0x67, 0x65, 0x70, 0x9a, 0x9a, 0x6e, 0x1f, 0xe, + 0xf7, 0x72, 0xd6, 0xf0, 0xd4, 0xf7, 0x25, 0x77, 0x1, 0xf8, 0x5, 0xdd, + 0x3, 0xf7, 0x1a, 0xf7, 0x98, 0x15, 0x6f, 0xc5, 0xb0, 0x81, 0xb4, 0x1b, + 0xe8, 0xe3, 0xcc, 0xd8, 0x1f, 0x8d, 0xa9, 0x81, 0xa7, 0x74, 0x9e, 0x8, + 0x9f, 0x97, 0xa5, 0xb3, 0xae, 0x1a, 0xbe, 0x62, 0xb0, 0x46, 0x57, 0x5a, + 0x74, 0x6f, 0x5a, 0x1e, 0xaa, 0x4b, 0x5, 0x9d, 0xad, 0xb3, 0xa2, 0xb0, + 0x1b, 0x99, 0x9e, 0x84, 0x79, 0x8c, 0x1f, 0x69, 0x69, 0x7f, 0x6b, 0x1e, + 0x58, 0x6, 0x7c, 0x42, 0x5, 0xcd, 0x6, 0xb2, 0x99, 0x79, 0x76, 0x68, + 0x69, 0x70, 0x62, 0x1f, 0x89, 0x6, 0x60, 0x69, 0x9c, 0x9b, 0x69, 0x1f, + 0xe, 0xf8, 0x84, 0xdb, 0x1, 0xda, 0xf8, 0x4e, 0x3, 0xda, 0xf8, 0x99, + 0x15, 0xd8, 0x73, 0x5, 0xa1, 0x9d, 0x9e, 0xb5, 0xae, 0x1b, 0xa0, 0x9f, + 0x7d, 0x7b, 0xa0, 0x1f, 0x7c, 0xa0, 0xa2, 0x7b, 0xa4, 0x1b, 0xec, 0xbb, + 0xdf, 0xad, 0x9c, 0x1f, 0x3e, 0xa1, 0x5, 0x63, 0x71, 0x7f, 0x77, 0x6f, + 0x1b, 0x78, 0x78, 0x96, 0x98, 0x77, 0x1f, 0x9b, 0x72, 0x71, 0x9d, 0x6f, + 0x1b, 0x2e, 0x5f, 0x40, 0x61, 0x72, 0x1f, 0xe, 0xf8, 0x95, 0xbc, 0x12, + 0xad, 0xbf, 0xf7, 0x14, 0xbe, 0xf7, 0x43, 0xcb, 0x6e, 0xbe, 0x13, 0xf0, + 0xf7, 0x6a, 0xf7, 0x7a, 0x15, 0xbe, 0x6, 0xc8, 0xf7, 0xc0, 0x98, 0xfb, + 0xc0, 0x5, 0xcd, 0x6, 0xf7, 0x16, 0xf7, 0xbf, 0x5, 0x13, 0xe8, 0x4f, + 0xfb, 0xbf, 0x5, 0xbe, 0x6, 0xcf, 0xf7, 0xe0, 0x7a, 0xa, 0xfb, 0x5, + 0xfb, 0xa1, 0x82, 0xf7, 0xa1, 0x5, 0x2e, 0x6, 0xfb, 0x8d, 0xfb, 0xe0, + 0x15, 0xbf, 0x6, 0xc4, 0xf7, 0xaf, 0x5, 0xe3, 0x6, 0x96, 0xbc, 0x5, + 0xfb, 0x77, 0x6, 0x81, 0x5a, 0x5, 0xe2, 0x6, 0xe, 0xe9, 0x77, 0xf8, + 0x55, 0xe8, 0x1, 0xf7, 0x1e, 0xee, 0xf7, 0x7a, 0xee, 0x3, 0xad, 0x16, + 0xf8, 0x49, 0x6, 0xad, 0xf7, 0x35, 0x5, 0x2d, 0x6, 0x7d, 0x48, 0x5, + 0xfb, 0x4e, 0x6, 0xf7, 0x2e, 0xf7, 0x5, 0x5, 0xf7, 0x0, 0xda, 0xe8, + 0xc9, 0xf7, 0xe, 0x1a, 0xdb, 0x51, 0xcd, 0xfb, 0xd, 0x39, 0x45, 0x77, + 0x36, 0x3c, 0x1e, 0x79, 0x33, 0x5, 0xee, 0x6, 0xf1, 0x9b, 0xf6, 0x89, + 0x91, 0x1b, 0xc1, 0xba, 0x6f, 0x57, 0x53, 0x6c, 0x6a, 0x45, 0x57, 0x1f, + 0xfb, 0xd1, 0xfb, 0x74, 0x5, 0xe, 0xf7, 0x70, 0xd6, 0xf7, 0x88, 0xd8, + 0x1, 0xf7, 0x50, 0xde, 0xf7, 0xc, 0xde, 0x3, 0xf7, 0x11, 0xf7, 0x70, + 0x15, 0xf7, 0xb8, 0x6, 0x9b, 0xd6, 0x5, 0xfb, 0x38, 0x6, 0xf7, 0x14, + 0xea, 0x5, 0xae, 0xa3, 0xb5, 0xba, 0xbe, 0x1a, 0xb4, 0x75, 0xca, 0x2b, + 0x55, 0x55, 0x72, 0x62, 0x5f, 0x1e, 0x7b, 0x3b, 0x5, 0xde, 0x6, 0x8e, + 0x96, 0x5, 0x9c, 0x8f, 0x94, 0xb4, 0xc0, 0x1b, 0xa1, 0xa8, 0x85, 0x6f, + 0x71, 0x80, 0x78, 0x71, 0x79, 0x1f, 0xfb, 0x6c, 0xfb, 0x27, 0x5, 0xe, + 0x7c, 0xe8, 0x3a, 0xea, 0xf7, 0x90, 0xea, 0x12, 0x13, 0xa0, 0xb2, 0xf7, + 0xec, 0x15, 0xdc, 0x6, 0x67, 0xfb, 0x4d, 0x5, 0x85, 0x74, 0x89, 0x76, + 0x79, 0x1a, 0x37, 0xd0, 0x6f, 0xde, 0xbe, 0xc0, 0xa7, 0xa5, 0xb7, 0x1e, + 0x13, 0x60, 0x81, 0x61, 0x5, 0xf7, 0x43, 0x6, 0x9e, 0xea, 0x5, 0x3b, + 0x6, 0xd0, 0xf7, 0xef, 0x8f, 0xa, 0x6, 0x78, 0x2c, 0x5, 0xda, 0x6, + 0x65, 0x98, 0xa, 0x13, 0xa0, 0x6b, 0x63, 0x5b, 0x63, 0x4d, 0x1b, 0x54, + 0x7a, 0xa4, 0xa2, 0x97, 0x8c, 0x96, 0x8c, 0x93, 0x1f, 0xc3, 0xf7, 0xae, + 0x43, 0xa, 0x67, 0xa, 0xf7, 0x78, 0xf8, 0x75, 0x15, 0xf7, 0xe9, 0xd9, + 0x76, 0xf1, 0xfb, 0xde, 0xfb, 0xb, 0x5, 0xfb, 0x47, 0xfb, 0x53, 0x15, + 0xdc, 0x6, 0x67, 0xfb, 0x5b, 0x5, 0x8a, 0x78, 0x84, 0x26, 0xa, 0x57, + 0xa, 0xf7, 0x6b, 0x77, 0x12, 0x13, 0xb0, 0xf7, 0x52, 0xf8, 0x70, 0x15, + 0xf7, 0x44, 0xf7, 0x0, 0xf7, 0x14, 0xfb, 0x0, 0xcc, 0xb0, 0xfb, 0x16, + 0xf7, 0x24, 0x4e, 0xa, 0xfb, 0x57, 0xfb, 0x23, 0x5, 0x2a, 0xfb, 0x37, + 0x27, 0xa, 0x57, 0xa, 0xc6, 0xf7, 0x10, 0x12, 0x13, 0xb0, 0xf8, 0xe, + 0xf8, 0x89, 0x92, 0xa, 0xa3, 0xf7, 0x10, 0x86, 0xa, 0xfb, 0x62, 0xfb, + 0x10, 0x92, 0xa, 0xa4, 0xf7, 0x10, 0x4c, 0xa, 0xfb, 0x4b, 0xfb, 0xa6, + 0x27, 0xa, 0x67, 0xa, 0xf7, 0x5d, 0xf8, 0xc6, 0x15, 0xf7, 0xbf, 0x3b, + 0xae, 0xc6, 0xfb, 0xa3, 0xf7, 0xc, 0x5, 0xfb, 0x75, 0xfb, 0xca, 0x27, + 0xa, 0xfb, 0x11, 0xbd, 0x1, 0x90, 0x40, 0x15, 0x81, 0x59, 0x5, 0xf8, + 0xed, 0x6, 0x95, 0xbd, 0x5, 0xe, 0xa0, 0x76, 0xf7, 0xed, 0xe9, 0x1, + 0xf7, 0x4d, 0xdb, 0x3, 0xf7, 0x4d, 0x16, 0xdb, 0x6, 0xf7, 0x87, 0xf7, + 0xed, 0x5, 0xe0, 0x3f, 0xa, 0xfb, 0x87, 0x87, 0xa, 0xc7, 0x6, 0xfb, + 0x34, 0xfb, 0x82, 0x44, 0xf7, 0x82, 0x5, 0xce, 0x55, 0xa, 0xfb, 0x98, + 0x44, 0xa, 0xe1, 0x6, 0xe, 0xa0, 0x76, 0xf7, 0xed, 0xe9, 0x1, 0xf7, + 0x24, 0x16, 0xf7, 0x9, 0xf7, 0x67, 0xb8, 0xfb, 0x67, 0x5, 0xd7, 0x6, + 0xf7, 0x47, 0xf7, 0xed, 0x5, 0xbc, 0x3f, 0xa, 0xfb, 0x67, 0x44, 0xa, + 0xd2, 0x6, 0x2b, 0xfb, 0x4d, 0x5f, 0xf7, 0x65, 0x5, 0x48, 0x6, 0xfb, + 0xc, 0xfb, 0x65, 0x72, 0xf7, 0x4d, 0x5, 0xd1, 0x55, 0xa, 0xfb, 0x6e, + 0x44, 0xa, 0xbc, 0x6, 0xb8, 0xfb, 0xed, 0x5, 0xe, 0x7f, 0xa, 0xd6, + 0xf7, 0x15, 0xf7, 0x39, 0xf7, 0x1a, 0x3, 0x6b, 0x16, 0xf7, 0x8b, 0x55, + 0xa, 0x6c, 0x6, 0xe7, 0xce, 0xd4, 0x48, 0x5, 0x6f, 0x6f, 0xa, 0xf7, + 0x8c, 0x3f, 0xa, 0x36, 0x6, 0xfb, 0x17, 0xf7, 0x11, 0xf7, 0x30, 0xf7, + 0x12, 0x5, 0xe0, 0x3f, 0xa, 0xfb, 0x79, 0x44, 0xa, 0x9d, 0x6, 0x3a, + 0x48, 0x5c, 0xce, 0x5, 0xa0, 0x3f, 0xa, 0xfb, 0x85, 0x44, 0xa, 0xe2, + 0x6, 0xef, 0xfb, 0x14, 0xfb, 0x3a, 0xfb, 0xf, 0x5, 0x33, 0x6, 0xe, + 0xfb, 0x22, 0xe3, 0xf8, 0x29, 0xe3, 0x1, 0xe3, 0xf7, 0x3, 0xf7, 0x8f, + 0xf7, 0x1, 0x3, 0x67, 0x55, 0x15, 0x76, 0x33, 0x5, 0xf7, 0xc0, 0x6, + 0xa0, 0xe3, 0x5, 0x45, 0x6, 0xf8, 0x1, 0xf8, 0x29, 0x5c, 0xa, 0x9f, + 0xe3, 0x5, 0xfb, 0x7f, 0x6, 0x77, 0x33, 0x5, 0xbb, 0x6, 0xfb, 0x3c, + 0xfb, 0x4d, 0x38, 0xf7, 0x4d, 0x5, 0xbd, 0x6, 0x9f, 0xe3, 0x5, 0xfb, + 0x83, 0x6, 0x77, 0x33, 0x5c, 0xa, 0xf7, 0xb, 0xfb, 0xa0, 0xfb, 0x11, + 0xfb, 0x1d, 0x5, 0xe, 0xfb, 0x22, 0xe2, 0xf8, 0x25, 0xe3, 0x1, 0xe2, + 0xf7, 0x4, 0xf7, 0x8e, 0xf7, 0x2, 0x3, 0xf7, 0x8c, 0xf8, 0x7f, 0x15, + 0xf7, 0xec, 0xd4, 0x76, 0xec, 0xfb, 0xe2, 0xfb, 0x6, 0x5, 0xfb, 0xa5, + 0xfc, 0xee, 0x6b, 0xa, 0xf8, 0x1, 0xf8, 0x25, 0x5, 0xd9, 0x84, 0xa, + 0xfb, 0x80, 0x6, 0x77, 0x34, 0x5, 0xbb, 0x6, 0xfb, 0x40, 0xfb, 0x4a, + 0x4d, 0xa, 0xfb, 0x9d, 0xfb, 0xe, 0xfb, 0x1d, 0x5, 0xe, 0xfb, 0x22, + 0xe2, 0xf8, 0x26, 0xe2, 0xd4, 0xf7, 0xa, 0x1, 0xe2, 0xf7, 0x4, 0xf7, + 0x8f, 0xf7, 0x2, 0x3, 0xf8, 0x24, 0xf8, 0x8f, 0x15, 0xf7, 0x9, 0x6, + 0xa4, 0xf7, 0xa, 0x5, 0xfb, 0x8, 0x6, 0xfb, 0x6b, 0xfb, 0xa, 0x15, + 0xf7, 0x8, 0x6, 0xa5, 0xf7, 0xa, 0x5, 0xfb, 0x8, 0x6, 0xfb, 0xa5, + 0xfd, 0x3c, 0x6b, 0xa, 0xf8, 0x2, 0xf8, 0x26, 0x5, 0xd8, 0x84, 0xa, + 0xfb, 0x7f, 0x6, 0x77, 0x34, 0x5, 0xbb, 0x6, 0xfb, 0x41, 0xfb, 0x4b, + 0x4d, 0xa, 0xfb, 0x9e, 0xfb, 0xe, 0xfb, 0x1c, 0x5, 0xe, 0x8b, 0xe2, + 0xbe, 0xbd, 0xc3, 0xbc, 0xf7, 0x4a, 0xe2, 0x1, 0xa3, 0x16, 0xf7, 0xdb, + 0x6, 0x9e, 0xe2, 0x5, 0xfb, 0xa, 0x6, 0x97, 0xbe, 0x70, 0xa, 0x95, + 0xbd, 0x5, 0xfb, 0x29, 0x6, 0x9a, 0xc3, 0x70, 0xa, 0x97, 0xbc, 0x5, + 0xfb, 0x22, 0x6, 0xf7, 0x5f, 0xf7, 0x4a, 0x5c, 0xa, 0x9e, 0xe2, 0x5, + 0xfb, 0x83, 0x6, 0x77, 0x34, 0x5, 0xb8, 0x6, 0xfb, 0x11, 0xfb, 0x8, + 0x41, 0xf7, 0x8, 0x5, 0xb9, 0x6, 0x9e, 0xe2, 0x5, 0xfb, 0x88, 0x6, + 0x78, 0x34, 0x5, 0xdd, 0x6, 0xf7, 0x10, 0xfb, 0x4a, 0x5, 0xfb, 0x26, + 0x6, 0x81, 0x5a, 0x70, 0xa, 0x7c, 0x53, 0x85, 0xa, 0x82, 0x59, 0x70, + 0xa, 0x7f, 0x58, 0x83, 0xa, 0xe, 0x8b, 0xe9, 0xf7, 0x90, 0xe8, 0x1, + 0xf2, 0xed, 0xf7, 0x6c, 0xed, 0x3, 0xad, 0x16, 0xf8, 0x4e, 0x6, 0xb2, + 0xf7, 0x50, 0x5, 0x29, 0x44, 0xa, 0xfb, 0x55, 0x6, 0xf7, 0xef, 0xf7, + 0xa9, 0x99, 0xcf, 0x5, 0xfc, 0x3f, 0x6, 0x67, 0xfb, 0x46, 0x56, 0xa, + 0x9c, 0xe0, 0x5, 0xf7, 0x43, 0x6, 0xfb, 0xec, 0xfb, 0xa6, 0x5, 0xe, + 0x8b, 0xe6, 0xf7, 0x89, 0xe5, 0xc7, 0xd5, 0x1, 0xe8, 0xea, 0xf7, 0x5d, + 0xe9, 0x3, 0xf7, 0xb9, 0xf8, 0x7a, 0x15, 0xec, 0x6, 0xf7, 0x4d, 0xf7, + 0x24, 0x58, 0xb0, 0xfb, 0x3f, 0x20, 0xfb, 0xf, 0xf6, 0x46, 0x67, 0x5, + 0xfb, 0x1d, 0xfd, 0xb, 0x15, 0xf8, 0x3d, 0x6, 0xad, 0xf7, 0x3c, 0x5, + 0x2d, 0x6, 0x7a, 0x3e, 0x5, 0xfb, 0x49, 0x6, 0xf7, 0xde, 0xf7, 0xa2, + 0x98, 0xcc, 0x5, 0xfc, 0x2d, 0x6, 0x6b, 0xfb, 0x2d, 0x5, 0xea, 0x6, + 0x98, 0xca, 0x5, 0xf7, 0x3a, 0x6, 0xfb, 0xdd, 0xfb, 0x9e, 0x5, 0xe, + 0x7c, 0xe9, 0xf8, 0x4f, 0xe9, 0x1, 0xd3, 0xec, 0xf7, 0x9b, 0xeb, 0x3, + 0xd3, 0xf7, 0x50, 0x15, 0x2b, 0xa9, 0x20, 0xf7, 0x1b, 0xf7, 0x91, 0xb1, + 0xf7, 0xe3, 0xf7, 0xd, 0xe5, 0x61, 0xe0, 0xfb, 0xc, 0xfb, 0x88, 0x59, + 0xfb, 0xd2, 0xfb, 0x2, 0x1e, 0xec, 0x9d, 0x15, 0xf7, 0x10, 0xd1, 0xf7, + 0x54, 0xf5, 0xee, 0x7f, 0x31, 0x56, 0x3e, 0x58, 0xfb, 0x73, 0xfb, 0xe, + 0x3b, 0x81, 0xca, 0xcb, 0x1e, 0xe, 0x79, 0x9d, 0xf8, 0x4b, 0x9f, 0xf6, + 0x99, 0x9f, 0x9f, 0x6, 0xfb, 0x26, 0x8f, 0x7, 0x1e, 0xa0, 0x39, 0x63, + 0xff, 0xc, 0x9, 0xe8, 0xa, 0xe8, 0xb, 0x8c, 0xc, 0xe, 0xf8, 0xec, + 0x14, 0xac, 0x13, 0x0, 0x79, 0x2, 0x0, 0x1, 0x0, 0x3b, 0x0, 0x4d, + 0x0, 0x89, 0x0, 0x8d, 0x0, 0xcb, 0x1, 0x15, 0x1, 0x51, 0x1, 0x5d, + 0x1, 0x65, 0x1, 0x6c, 0x1, 0x94, 0x1, 0xb0, 0x1, 0xc5, 0x1, 0xdd, + 0x1, 0xf8, 0x2, 0x16, 0x2, 0x2e, 0x2, 0x3b, 0x2, 0x44, 0x2, 0x59, + 0x2, 0x5e, 0x2, 0x72, 0x2, 0x77, 0x2, 0x7c, 0x2, 0x93, 0x2, 0xba, + 0x2, 0xc1, 0x2, 0xcb, 0x2, 0xd0, 0x2, 0xf2, 0x2, 0xf7, 0x2, 0xfc, + 0x3, 0x4, 0x3, 0xd, 0x3, 0x12, 0x3, 0x15, 0x3, 0x1a, 0x3, 0x22, + 0x3, 0x27, 0x3, 0x3c, 0x3, 0x49, 0x3, 0x55, 0x3, 0x5c, 0x3, 0x61, + 0x3, 0x66, 0x3, 0x77, 0x3, 0x7b, 0x3, 0x8e, 0x3, 0x9b, 0x3, 0xae, + 0x3, 0xc1, 0x3, 0xcc, 0x3, 0xd7, 0x3, 0xdc, 0x3, 0xe0, 0x3, 0xe8, + 0x3, 0xf0, 0x3, 0xf8, 0x3, 0xfd, 0x4, 0x2, 0x4, 0x6, 0x4, 0xe, + 0x4, 0x16, 0x4, 0x1e, 0x4, 0x27, 0x4, 0x2e, 0x4, 0x34, 0x4, 0x3a, + 0x4, 0x40, 0x4, 0x45, 0x4, 0x49, 0x4, 0x52, 0x4, 0x5a, 0x4, 0x66, + 0x4, 0x74, 0x4, 0x7f, 0x4, 0x8a, 0x4, 0x8f, 0x4, 0x94, 0x4, 0x99, + 0x4, 0x9e, 0x4, 0xa2, 0x4, 0xa9, 0x4, 0xb5, 0x4, 0xba, 0x4, 0xc0, + 0x4, 0xc6, 0x4, 0xcc, 0x4, 0xd2, 0x4, 0xd8, 0x4, 0xdc, 0x4, 0xe0, + 0x4, 0xe4, 0x4, 0xe8, 0x4, 0xf3, 0x4, 0xfa, 0x5, 0x0, 0x5, 0x7, + 0x5, 0xc, 0x5, 0x11, 0x5, 0x16, 0x5, 0x1b, 0x5, 0x20, 0x5, 0x25, + 0x5, 0x2a, 0x5, 0x2f, 0x5, 0x33, 0x5, 0x3d, 0x5, 0x47, 0x5, 0x50, + 0x5, 0x58, 0x5, 0x5c, 0x5, 0x65, 0x5, 0x6a, 0x5, 0x6f, 0x5, 0x74, + 0x5, 0x79, 0x5, 0x7e, 0x5, 0x82, 0x5, 0x86, 0x5, 0x8a, 0xf7, 0x8d, + 0x6, 0x9f, 0xe5, 0x5, 0x30, 0x6, 0xb9, 0xd7, 0x5, 0xf7, 0x84, 0x6, + 0x9f, 0x3f, 0x5, 0x33, 0x3c, 0xa, 0xf7, 0x88, 0x37, 0xa, 0x51, 0x6, + 0xfb, 0x1, 0xf8, 0x64, 0x5, 0xfb, 0x91, 0x3c, 0xa, 0xf7, 0x15, 0x6, + 0xfb, 0x8e, 0x7c, 0xa, 0x4e, 0x6, 0xf7, 0x9d, 0xf7, 0x3a, 0x15, 0xf7, + 0xa, 0xf7, 0x3d, 0xb6, 0xfb, 0x3d, 0x5, 0xb, 0x22, 0xa, 0x1f, 0x13, + 0xbc, 0x3b, 0xa, 0x1e, 0x13, 0x7c, 0xa1, 0xf7, 0x1, 0x15, 0x13, 0xbc, + 0x2c, 0xa, 0x15, 0xf7, 0x41, 0x42, 0xa, 0x3c, 0x6, 0xac, 0xf7, 0x36, + 0x5, 0x91, 0xa8, 0x90, 0xaa, 0xa7, 0x1a, 0xcf, 0x46, 0xa9, 0x46, 0x2e, + 0xfb, 0x6, 0x6f, 0x74, 0x51, 0x1e, 0x9f, 0x3c, 0x5, 0x9c, 0xa6, 0xef, + 0xa1, 0xd6, 0x1b, 0xbc, 0xb0, 0x7b, 0x69, 0x84, 0x8a, 0x83, 0x88, 0x83, + 0x1f, 0x8f, 0x68, 0x64, 0x8e, 0x67, 0x1b, 0xfb, 0x8a, 0x6e, 0xfb, 0x20, + 0x64, 0xb, 0x15, 0x20, 0xa, 0xe, 0x15, 0xfb, 0x28, 0xf7, 0x1, 0x43, + 0xf7, 0x8, 0xf7, 0x44, 0xf7, 0x34, 0xf7, 0x9, 0xf7, 0x89, 0xf7, 0x6, + 0x48, 0xf4, 0xfb, 0x29, 0xfb, 0x57, 0xfb, 0x2a, 0xfb, 0x2f, 0xfb, 0x62, + 0x1e, 0xef, 0x9e, 0x15, 0xf7, 0x4, 0x8a, 0xe4, 0xf7, 0x1f, 0xf7, 0x1e, + 0x1b, 0xf7, 0x5, 0xa6, 0x33, 0x46, 0x8a, 0x1f, 0x2a, 0x3d, 0xfb, 0x27, + 0xfb, 0x23, 0x29, 0x5d, 0xd2, 0xda, 0x1e, 0xe, 0x15, 0xdc, 0x6, 0x54, + 0xfb, 0x9c, 0x5, 0x86, 0x73, 0x89, 0x75, 0x77, 0x1a, 0x2d, 0xc8, 0x55, + 0xf7, 0xd, 0xf7, 0x15, 0xe9, 0xac, 0xf7, 0x48, 0xb0, 0x1e, 0xc2, 0xf7, + 0x9d, 0x5, 0xdb, 0x46, 0xa, 0xfb, 0xa2, 0x6, 0x79, 0x31, 0x5, 0xeb, + 0x6, 0x57, 0xfb, 0x95, 0x5, 0x36, 0x79, 0x6b, 0x5e, 0x24, 0x1b, 0x3b, + 0x75, 0xab, 0xb0, 0x8a, 0x1f, 0x9a, 0x8d, 0x9a, 0x8e, 0x9a, 0x1e, 0xc3, + 0xf7, 0xa5, 0x5, 0xea, 0x46, 0xa, 0xfb, 0xa2, 0x6, 0xb, 0x7a, 0x7b, + 0x1a, 0x43, 0xd0, 0x60, 0xdd, 0xbf, 0xc0, 0xa6, 0xa5, 0xb7, 0x1e, 0x13, + 0x70, 0x81, 0x62, 0x5, 0xf7, 0x43, 0x37, 0xa, 0x3b, 0x6, 0xd0, 0xf7, + 0xf7, 0x8f, 0xa, 0x36, 0xa, 0xda, 0x6, 0x65, 0xfb, 0x63, 0x5, 0x13, + 0xb0, 0x6c, 0x63, 0x5b, 0x64, 0x4d, 0x1b, 0x54, 0x7a, 0xa2, 0xa1, 0x97, + 0x8c, 0x96, 0x8c, 0x93, 0x1f, 0xc3, 0xf7, 0xb8, 0x43, 0xa, 0x15, 0xdc, + 0x6, 0x67, 0xfb, 0x5b, 0x5, 0x85, 0x78, 0x89, 0x26, 0xa, 0x15, 0x33, + 0xa, 0x13, 0xd8, 0x2a, 0xa, 0xe, 0x30, 0xa, 0x26, 0xfb, 0x44, 0x2d, + 0xa, 0x7b, 0x42, 0x56, 0xa, 0xbc, 0xf7, 0x80, 0x4e, 0xa, 0x7c, 0x41, + 0x4c, 0xa, 0xa7, 0xf7, 0x1e, 0x88, 0xa, 0x72, 0xfb, 0x8, 0x56, 0xa, + 0xb6, 0xf7, 0x62, 0x5, 0xfc, 0xa1, 0x6, 0x79, 0x31, 0x8a, 0xa, 0x3d, + 0x7c, 0xa, 0x37, 0x6, 0xb, 0xf8, 0x55, 0x37, 0xa, 0xfb, 0x40, 0x6, + 0xdb, 0xf8, 0xa, 0x5, 0xf7, 0x3e, 0x37, 0xa, 0xfc, 0x51, 0x3c, 0xa, + 0xf7, 0x41, 0x6, 0x3b, 0xfc, 0xa, 0x3e, 0xa, 0xb, 0x61, 0x53, 0x49, + 0x6a, 0x48, 0x1b, 0x66, 0x65, 0x98, 0xa4, 0xc3, 0xe4, 0x9d, 0xc3, 0xc5, + 0xb1, 0x84, 0x89, 0xa8, 0x1f, 0xe, 0x1e, 0xf1, 0xa2, 0x15, 0xef, 0xea, + 0xca, 0xf5, 0xf7, 0x3, 0xb0, 0x54, 0x56, 0x20, 0xfb, 0x5, 0x55, 0x35, + 0x53, 0x2d, 0xa3, 0xdd, 0x1e, 0xe, 0x15, 0x9d, 0xe6, 0x5, 0xf7, 0x33, + 0x6, 0xdb, 0xf7, 0x94, 0x5, 0xfb, 0x35, 0x34, 0xa, 0xf7, 0x98, 0x6, + 0x25, 0xfb, 0xef, 0x5, 0xf7, 0x4d, 0x4b, 0xa, 0xe, 0x5, 0x6d, 0x44, + 0x3c, 0x74, 0x3f, 0x1b, 0xfb, 0xf, 0x82, 0xb9, 0xaf, 0x87, 0x1f, 0x9b, + 0xe6, 0x15, 0xc4, 0xac, 0xd5, 0xb0, 0xc8, 0x1b, 0xca, 0xd8, 0x6e, 0x4a, + 0x8c, 0x1f, 0xe, 0x15, 0xfb, 0x12, 0xf7, 0x18, 0x5b, 0xf3, 0xf7, 0x1a, + 0xf7, 0x49, 0xe6, 0xf7, 0x49, 0xe9, 0x48, 0xe0, 0xfb, 0x32, 0xfb, 0x32, + 0xfb, 0x3c, 0xb, 0x3c, 0xf7, 0x2a, 0xea, 0xe0, 0xa1, 0xb5, 0xdd, 0x1f, + 0x7a, 0xdb, 0x2f, 0xa, 0x35, 0xa, 0xfb, 0x4a, 0x93, 0xa, 0xd3, 0x31, + 0xa, 0xf8, 0xa4, 0x6, 0xb5, 0xf7, 0x5e, 0x7a, 0xa, 0x73, 0xfb, 0x4, + 0x95, 0xa, 0xab, 0xf7, 0x27, 0x5, 0xf7, 0x4, 0x6, 0xb, 0x6, 0x9e, + 0xe6, 0x5, 0xb, 0x15, 0xf8, 0x21, 0x6, 0x94, 0xa3, 0x97, 0xc0, 0xa9, + 0x1a, 0xee, 0x89, 0x30, 0xd1, 0xfb, 0x9, 0x1b, 0xfb, 0x17, 0xb, 0x6, + 0x78, 0x30, 0x5, 0xb, 0x6, 0x9e, 0xe5, 0x5, 0xb, 0x49, 0xa, 0xbf, + 0x3a, 0xfb, 0xa, 0x42, 0x3d, 0x35, 0x1e, 0xd9, 0x95, 0x15, 0xb7, 0xaf, + 0xb3, 0xc8, 0xb5, 0xa5, 0x73, 0x53, 0xa, 0xb, 0x15, 0x4d, 0xba, 0x57, + 0xe3, 0xed, 0xef, 0xd2, 0xe9, 0xc7, 0x58, 0xbe, 0x37, 0x27, 0x29, 0x3f, + 0x35, 0x1e, 0xdc, 0x91, 0x15, 0xba, 0xb2, 0xb2, 0xc7, 0xba, 0xa4, 0x72, + 0x6c, 0x56, 0x52, 0x70, 0x5e, 0x62, 0x6f, 0xa3, 0xa5, 0x1e, 0xb, 0x8b, + 0xe6, 0xf8, 0x10, 0xe6, 0x1, 0xb, 0x52, 0xbf, 0x51, 0xf0, 0xda, 0xb6, + 0xa2, 0xae, 0xca, 0xb, 0x6, 0x78, 0x31, 0x5, 0xb, 0x84, 0xa3, 0xa3, + 0x83, 0xa1, 0x1b, 0xd5, 0xc5, 0xbd, 0xa4, 0xa6, 0x1f, 0x5f, 0xca, 0x5, + 0x77, 0x6e, 0x69, 0x72, 0x67, 0x1b, 0x7a, 0x76, 0x91, 0x92, 0x76, 0x1f, + 0x92, 0x75, 0x75, 0x92, 0x76, 0x1b, 0xb, 0x5, 0xfb, 0x43, 0x6, 0xb, + 0x6, 0x9e, 0xe9, 0x5, 0xb, 0x8b, 0xe5, 0xd7, 0xe5, 0xf7, 0x64, 0xe5, + 0xb, 0x7c, 0xe7, 0x3b, 0xe6, 0xf0, 0xe5, 0xcd, 0xe6, 0xb, 0x6, 0x9d, + 0xe6, 0x5, 0xb, 0x3e, 0xa, 0xe, 0x6, 0x78, 0x2d, 0x5, 0xb, 0x1, + 0xa3, 0xf1, 0xf7, 0xf1, 0xef, 0x3, 0xb, 0x6, 0x9d, 0xe5, 0x5, 0xb, + 0xbb, 0xd5, 0xbf, 0xb5, 0x73, 0x5c, 0x99, 0x1e, 0xe6, 0xb0, 0x5, 0xb9, + 0x78, 0x69, 0xdc, 0xfb, 0x15, 0x1b, 0xfb, 0x22, 0xb, 0x15, 0xee, 0x6, + 0xf7, 0x53, 0xf7, 0x25, 0x57, 0xaf, 0xfb, 0x45, 0x5e, 0xa, 0x15, 0x4f, + 0xbb, 0x58, 0xde, 0xf1, 0xe1, 0xd2, 0xe7, 0xc7, 0x5c, 0xb, 0x64, 0xa, + 0xf7, 0xf, 0x65, 0xa, 0xb, 0x6, 0x79, 0x30, 0x5, 0xb, 0x5, 0xfb, + 0x3, 0x6, 0xb, 0x3d, 0xf7, 0x4b, 0x5, 0xbd, 0x84, 0xa, 0xfb, 0x84, + 0x6, 0x77, 0x34, 0x5c, 0xa, 0xf7, 0x8, 0xb, 0x5, 0x29, 0x6, 0xb, + 0x15, 0x6b, 0xa2, 0x73, 0xad, 0xb7, 0xb5, 0xb5, 0xba, 0xbb, 0x72, 0x99, + 0x6a, 0x5a, 0x67, 0x5e, 0x59, 0x1e, 0xb, 0x16, 0x60, 0xa, 0xa8, 0x7a, + 0xa4, 0x63, 0x54, 0x6e, 0x5f, 0x67, 0x1e, 0xb, 0x15, 0xf7, 0x62, 0xfb, + 0x55, 0xc0, 0xc5, 0xfb, 0x26, 0xf7, 0x1b, 0xf7, 0x26, 0xf7, 0xf, 0x56, + 0xc7, 0x5, 0xb, 0xa7, 0xaf, 0x15, 0xb2, 0x4b, 0x5, 0x93, 0x99, 0xcd, + 0xb1, 0xbc, 0x1b, 0xa0, 0xa3, 0x84, 0x83, 0xa4, 0x1f, 0xb, 0x6d, 0x55, + 0x56, 0x70, 0x5d, 0x61, 0x73, 0xa2, 0xa7, 0x1e, 0xb, 0x8b, 0xe5, 0xd5, + 0xf7, 0x36, 0x32, 0xe4, 0xf7, 0x1e, 0xe5, 0xb, 0x6, 0x9f, 0xe9, 0x5, + 0xb, 0x5, 0xed, 0x6, 0xb, 0x7c, 0xe4, 0x3e, 0xe5, 0xf7, 0x9c, 0xe6, + 0xb, 0x1, 0x9e, 0xef, 0xf8, 0x1, 0xeb, 0x3, 0xb, 0x1, 0xf3, 0xe9, + 0xf7, 0x8b, 0xe9, 0x3, 0xb, 0x15, 0xf7, 0x4, 0x6, 0xb, 0x6, 0x9e, + 0xe7, 0x5, 0xb, 0x5, 0xd9, 0x6, 0xb, 0x63, 0xa, 0xf7, 0x75, 0x77, + 0x45, 0xa, 0xb, 0x22, 0xfb, 0x10, 0xf5, 0x45, 0x69, 0x5, 0xe, 0x61, + 0xa, 0xf7, 0x77, 0x77, 0x76, 0xa, 0xb, 0x71, 0xa2, 0x72, 0xb1, 0xba, + 0xac, 0xb3, 0xb0, 0xb, 0x7c, 0xe6, 0xdd, 0xe6, 0xe9, 0xe6, 0xb, 0x1, + 0xf7, 0x67, 0xf1, 0x3, 0xb, 0x7c, 0xe6, 0xf7, 0xa1, 0xe6, 0xb, 0x15, + 0xf7, 0x6, 0x6, 0xa5, 0xb, 0x5, 0xfb, 0x5, 0x6, 0xb, 0x5, 0x2a, + 0x6, 0xb, 0x57, 0xa, 0xf7, 0x6f, 0x77, 0x12, 0x13, 0xb0, 0xb, 0x75, + 0xa, 0xf7, 0x7a, 0x77, 0x62, 0xa, 0xb, 0xf8, 0x8f, 0x5a, 0xa, 0xaa, + 0xf7, 0x2b, 0x5, 0xfb, 0x4, 0x6, 0xb, 0xb1, 0x4c, 0xf7, 0x66, 0xf7, + 0x2e, 0xfb, 0x1b, 0xf7, 0x32, 0x4d, 0x57, 0xc5, 0xb, 0x15, 0x76, 0x34, + 0x5, 0xf7, 0xc0, 0x84, 0xa, 0x46, 0x6, 0xb, 0x5, 0xda, 0x6, 0x9d, + 0xe8, 0x5, 0xfb, 0xa0, 0x82, 0xa, 0xb, 0x15, 0xf7, 0x5, 0x6, 0xb, + 0x6, 0x77, 0x30, 0x5, 0xb, 0x6, 0x77, 0x2d, 0x5, 0xb, 0x5, 0xf7, + 0x28, 0x6, 0xb, 0xf7, 0xb1, 0x5, 0xb, 0x64, 0xa, 0xf7, 0x10, 0x83, + 0xa, 0xb, 0x15, 0xf8, 0x63, 0x6, 0x9e, 0xf7, 0x2, 0x5, 0xfc, 0x63, + 0x6, 0xb, 0x6, 0x3c, 0x7d, 0xa, 0xb, 0x8b, 0xe5, 0xf8, 0xa, 0xe5, + 0xb, 0x1, 0xf8, 0x66, 0xe8, 0x3, 0xb, 0x79, 0xe4, 0xf8, 0x25, 0xe6, + 0xb, 0x8b, 0xe6, 0xf7, 0x94, 0xe6, 0xb, 0x79, 0xe6, 0xf8, 0x17, 0xe5, + 0xb, 0x5, 0x2b, 0x6, 0xb, 0x5, 0x28, 0x6, 0xb, 0xfc, 0xa, 0x5, + 0xb, 0xfc, 0x10, 0x5, 0xb, 0x5, 0xfb, 0x4c, 0x6, 0x79, 0x2e, 0x5, + 0xd8, 0x6, 0x3f, 0xb, 0x8b, 0xe9, 0xf7, 0x8f, 0xe9, 0x1, 0xb, 0x6, + 0xf7, 0x55, 0x71, 0xa, 0xb, 0x8b, 0xe9, 0xf8, 0x4a, 0xe9, 0x1, 0xb, + 0x6, 0x78, 0x2e, 0x5, 0xb, 0x5, 0xfb, 0x6, 0x6, 0xb, 0x6, 0x9f, + 0xe2, 0x5, 0xb, 0x5, 0xfb, 0x28, 0x6, 0xb, 0x5, 0xfb, 0x2, 0x6, + 0xb, 0x6, 0x79, 0x2d, 0x5, 0xb, 0x5, 0xf7, 0x8f, 0x6, 0xb, 0x6, + 0x9f, 0xe8, 0x5, 0xb, 0x5, 0xdb, 0x6, 0xb, 0xf7, 0x1b, 0xc5, 0x98, + 0x1f, 0xe7, 0xf8, 0x2e, 0x5, 0xb, 0xda, 0xf7, 0xb, 0xa4, 0x1f, 0xc5, + 0xf7, 0xb6, 0x5, 0xb, 0x5, 0xfb, 0x45, 0x6, 0x79, 0x32, 0x8a, 0xa, + 0xb, 0x65, 0xca, 0xfb, 0x66, 0xfb, 0x2e, 0x5, 0xe, 0x5, 0xfb, 0x42, + 0xb, 0x55, 0x15, 0x77, 0x33, 0x5, 0xf7, 0xd7, 0x6, 0xb, 0xf7, 0x73, + 0x77, 0x1, 0xb, 0x15, 0xf7, 0x3, 0x6, 0xb, 0x28, 0xfb, 0x42, 0x2a, + 0xb, 0x6, 0x9e, 0xe8, 0x5, 0xb, 0x5, 0xfb, 0x90, 0x6, 0xb, 0x5, + 0xec, 0x6, 0xb, 0xf7, 0x20, 0x5, 0xb, 0xfb, 0x56, 0x5, 0xb}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixedItalic.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixedItalic.cpp new file mode 100644 index 000000000000..7fe9f63c0e76 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitFixedItalic.cpp @@ -0,0 +1,1572 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitFixedItalicFontData[18746] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x15, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x46, 0x69, 0x78, 0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x49, + 0x74, 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1, 0x23, 0xf8, 0x10, + 0x0, 0xf8, 0x2a, 0x1, 0xf8, 0x2b, 0x2, 0xf8, 0x2c, 0x3, 0xf8, 0x18, + 0x4, 0x5b, 0xfb, 0x8d, 0xf9, 0x2b, 0xf9, 0xb7, 0x5, 0xf7, 0xa3, 0xf, + 0xf9, 0xc, 0x11, 0xaa, 0x1c, 0x42, 0x78, 0x12, 0x0, 0x12, 0x1, 0x1, + 0x5, 0x7, 0x9, 0x11, 0x19, 0x1f, 0x25, 0x29, 0x2d, 0x39, 0x42, 0x49, + 0x53, 0x5c, 0x65, 0x8f, 0xa5, 0xb4, 0x49, 0x64, 0x6f, 0x74, 0x49, 0x4a, + 0x69, 0x6a, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x73, 0x63, + 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, + 0x67, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x6c, 0x69, 0x72, 0x61, 0x45, 0x75, + 0x72, 0x6f, 0x70, 0x72, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66, 0x74, 0x61, + 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, + 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, + 0x78, 0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x49, 0x74, 0x61, 0x6c, + 0x69, 0x63, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20, 0x46, 0x69, 0x78, 0x65, + 0x64, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0, 0x1, 0x0, 0x1, 0x6, 0x0, + 0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, + 0x67, 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x66, 0x0, 0x0, + 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, + 0x97, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0, 0xa1, 0x0, 0x0, + 0x9c, 0x0, 0x0, 0xa4, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, + 0x98, 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0, 0x85, 0x0, 0x0, + 0x96, 0x0, 0x0, 0x8f, 0x0, 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, + 0x9b, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0, 0xae, 0x0, 0x0, + 0xab, 0x1, 0x0, 0xb0, 0x0, 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, + 0x8a, 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0, + 0xb9, 0x0, 0x0, 0xb6, 0x2, 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, + 0xbe, 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0, + 0xa8, 0x0, 0x0, 0x8d, 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, + 0xc5, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0, 0xcb, 0x0, 0x0, + 0xc9, 0x0, 0x0, 0xc8, 0x0, 0x0, 0xcd, 0x0, 0x0, 0xca, 0x0, 0x0, + 0xcc, 0x0, 0x0, 0x90, 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0, 0x0, + 0xd7, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0, + 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0xde, 0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x1, + 0x87, 0x0, 0x0, 0x91, 0x0, 0x1, 0x88, 0x1, 0x0, 0x8c, 0x0, 0x0, + 0x92, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x1, 0x8a, 0x1, 0x0, + 0xc0, 0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0, 0xe4, 0x0, 0x0, + 0x65, 0x0, 0x1, 0x8c, 0x1, 0x0, 0x7e, 0x0, 0x0, 0x88, 0x0, 0x0, + 0x81, 0x1, 0x0, 0x84, 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0, + 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0, 0x41, 0x0, 0x0, + 0x8, 0x0, 0x0, 0x75, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, + 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0, 0x0, 0x79, 0x1, 0x0, + 0x6b, 0x1, 0x0, 0x63, 0x0, 0x1, 0x8e, 0x2, 0x0, 0x99, 0x0, 0x1, + 0x91, 0x4, 0x0, 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xf4, 0x2, 0x0, + 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x2f, 0x0, 0x62, 0x0, 0xd0, 0x1, + 0x55, 0x1, 0xb1, 0x2, 0x3c, 0x2, 0x50, 0x2, 0x87, 0x2, 0xbe, 0x2, + 0xf5, 0x3, 0x21, 0x3, 0x2f, 0x3, 0x43, 0x3, 0x52, 0x3, 0x67, 0x3, + 0xab, 0x3, 0xd2, 0x4, 0x22, 0x4, 0x80, 0x4, 0xc1, 0x5, 0x11, 0x5, + 0x67, 0x5, 0x8f, 0x6, 0x0, 0x6, 0x57, 0x6, 0x6f, 0x6, 0x8f, 0x6, + 0xb2, 0x6, 0xd4, 0x6, 0xf7, 0x7, 0x5b, 0x7, 0xf8, 0x8, 0x32, 0x8, + 0x9f, 0x8, 0xf3, 0x9, 0x2e, 0x9, 0x77, 0x9, 0xc3, 0x9, 0xd7, 0xa, + 0x28, 0xa, 0x48, 0xa, 0x84, 0xa, 0xd7, 0xb, 0x1, 0xb, 0x48, 0xb, + 0x83, 0xb, 0xcd, 0xc, 0x1a, 0xc, 0xb7, 0xd, 0x19, 0xd, 0x88, 0xd, + 0xbc, 0xe, 0x12, 0xe, 0x3d, 0xe, 0x7f, 0xe, 0xd2, 0xf, 0x7, 0xf, + 0x3e, 0xf, 0x5e, 0xf, 0x81, 0xf, 0xa4, 0xf, 0xd4, 0xf, 0xe5, 0xf, + 0xf5, 0x10, 0x45, 0x10, 0xaa, 0x10, 0xfe, 0x11, 0x65, 0x11, 0xb9, 0x12, + 0xa, 0x12, 0x1f, 0x12, 0x6b, 0x12, 0xa0, 0x12, 0xe2, 0x13, 0x30, 0x13, + 0x53, 0x13, 0xca, 0x14, 0x29, 0x14, 0x70, 0x14, 0xd7, 0x15, 0x3f, 0x15, + 0x84, 0x15, 0xed, 0x16, 0x39, 0x16, 0x8f, 0x16, 0xbb, 0x16, 0xff, 0x17, + 0x52, 0x17, 0x92, 0x17, 0xc4, 0x18, 0x2b, 0x18, 0x45, 0x18, 0xac, 0x18, + 0xea, 0x19, 0x19, 0x19, 0x77, 0x19, 0xe6, 0x1a, 0x67, 0x1a, 0xca, 0x1a, + 0xe9, 0x1b, 0x82, 0x1b, 0x9e, 0x1c, 0x23, 0x1c, 0x8a, 0x1c, 0xbd, 0x1c, + 0xd8, 0x1d, 0x60, 0x1d, 0x73, 0x1d, 0xb0, 0x1d, 0xee, 0x1e, 0x31, 0x1e, + 0x97, 0x1e, 0xa9, 0x1e, 0xee, 0x1f, 0x27, 0x1f, 0x48, 0x1f, 0x84, 0x1f, + 0xa8, 0x1f, 0xe7, 0x20, 0x1c, 0x20, 0x89, 0x20, 0xfc, 0x21, 0xaa, 0x22, + 0x9, 0x22, 0x27, 0x22, 0x4e, 0x22, 0x7b, 0x22, 0xc6, 0x22, 0xe9, 0x23, + 0x2f, 0x23, 0x9f, 0x24, 0x22, 0x24, 0x40, 0x24, 0x63, 0x24, 0x89, 0x24, + 0xb7, 0x24, 0xd4, 0x25, 0x14, 0x25, 0x3e, 0x25, 0x6d, 0x25, 0xc8, 0x26, + 0x49, 0x26, 0x67, 0x26, 0x88, 0x26, 0xae, 0x26, 0xff, 0x27, 0x31, 0x27, + 0x60, 0x27, 0xe8, 0x27, 0xfd, 0x28, 0x16, 0x28, 0x3f, 0x28, 0x61, 0x28, + 0x80, 0x28, 0xd1, 0x29, 0x5b, 0x29, 0x71, 0x29, 0x97, 0x29, 0xad, 0x2a, + 0x13, 0x2a, 0x36, 0x2a, 0x7f, 0x2b, 0x2d, 0x2b, 0xaf, 0x2b, 0xcd, 0x2b, + 0xea, 0x2c, 0x19, 0x2c, 0x4a, 0x2c, 0x65, 0x2c, 0x96, 0x2c, 0xba, 0x2c, + 0xda, 0x2d, 0x51, 0x2d, 0xf4, 0x2e, 0xc, 0x2e, 0x23, 0x2e, 0x49, 0x2e, + 0x92, 0x2e, 0xb9, 0x2e, 0xeb, 0x2f, 0x6a, 0x2f, 0x89, 0x2f, 0xa8, 0x2f, + 0xd0, 0x2f, 0xf8, 0x30, 0x4b, 0x30, 0xb6, 0x31, 0x1b, 0x31, 0x40, 0x31, + 0x66, 0x31, 0xc3, 0x32, 0x29, 0x32, 0x65, 0x32, 0x9f, 0x33, 0x0, 0x33, + 0x8c, 0x34, 0x39, 0x34, 0xe5, 0x35, 0x70, 0x36, 0x2, 0x36, 0x2d, 0x36, + 0x71, 0x36, 0xb3, 0x37, 0xa, 0x37, 0x28, 0x37, 0x49, 0x37, 0x6b, 0x37, + 0x8d, 0x37, 0xb6, 0x37, 0xc6, 0x37, 0xfd, 0x38, 0x2e, 0x38, 0x6f, 0x38, + 0x8e, 0x38, 0x9e, 0x38, 0xae, 0x38, 0xbf, 0x38, 0xd5, 0x38, 0xe4, 0x39, + 0x7, 0x39, 0x24, 0x39, 0x40, 0x39, 0x70, 0x39, 0xb6, 0x39, 0xd4, 0x39, + 0xf4, 0x3a, 0x2f, 0x3a, 0x4e, 0x3a, 0x6e, 0x3a, 0x81, 0x3b, 0x1, 0x3b, + 0x88, 0x3c, 0x0, 0x3c, 0x53, 0x3c, 0x74, 0x3c, 0x9e, 0x3c, 0xbe, 0x3c, + 0xe3, 0x3d, 0x1d, 0x3d, 0x2c, 0x3d, 0xa7, 0x3e, 0x14, 0xe, 0xe, 0x7c, + 0xf7, 0xc, 0x1, 0xf7, 0x9f, 0xb7, 0x3, 0xf7, 0x9f, 0xf7, 0x49, 0x15, + 0xb7, 0x6, 0xee, 0xf8, 0x1b, 0x5, 0x3d, 0x6, 0xfb, 0x22, 0xfc, 0xab, + 0x15, 0x6e, 0x9d, 0x74, 0xb0, 0xb3, 0xb3, 0xa8, 0xb3, 0xaa, 0x72, 0x9f, + 0x68, 0x66, 0x65, 0x69, 0x69, 0x1e, 0xe, 0xf7, 0xdc, 0xf7, 0x7e, 0x12, + 0xf7, 0x3e, 0xb6, 0x7d, 0xdb, 0xb5, 0xb5, 0x7e, 0xda, 0x13, 0xd0, 0xf7, + 0xd5, 0xf7, 0xdc, 0x15, 0x13, 0xc8, 0xa8, 0x64, 0xa, 0xda, 0x6, 0x13, + 0xd0, 0x49, 0xfb, 0x7e, 0x5, 0xfb, 0x55, 0x16, 0x13, 0xb0, 0xa8, 0x64, + 0xa, 0xdb, 0x6, 0x13, 0xd0, 0x49, 0xfb, 0x7e, 0x5, 0xe, 0xf7, 0x5e, + 0xf7, 0x34, 0xbf, 0xf7, 0x75, 0x1, 0xf7, 0x2a, 0xf7, 0x1a, 0xbb, 0xf7, + 0x39, 0x3, 0xf2, 0x4c, 0x15, 0xba, 0x6, 0xc1, 0xf7, 0x69, 0x5, 0xf7, + 0x16, 0x6, 0x59, 0xfb, 0x69, 0x5, 0xbb, 0x6, 0xbf, 0xf7, 0x69, 0x5, + 0xf2, 0x6, 0x95, 0xbf, 0x5, 0x27, 0x6, 0xb4, 0xf7, 0x34, 0x5, 0xe3, + 0x6, 0x95, 0xbf, 0x5, 0x33, 0x6, 0xc1, 0xf7, 0x75, 0x5, 0x5b, 0x6, + 0x54, 0xfb, 0x75, 0x83, 0xa, 0xc1, 0xf7, 0x75, 0x5, 0x5b, 0x6, 0x51, + 0xfb, 0x75, 0x5, 0x25, 0x6, 0x81, 0x57, 0x5, 0xf1, 0x6, 0x64, 0xfb, + 0x34, 0x5, 0x2f, 0x6, 0x81, 0x57, 0x5, 0xe5, 0x6, 0xca, 0xbf, 0x15, + 0xb1, 0xf7, 0x34, 0x5, 0xf7, 0x17, 0x6, 0x66, 0xfb, 0x34, 0x5, 0xe, + 0x22, 0x76, 0xf7, 0x2b, 0xc0, 0xf8, 0x40, 0xbf, 0x1, 0xc3, 0xc0, 0xf7, + 0xb, 0xc3, 0xf7, 0x28, 0xc5, 0x3, 0xc3, 0x9c, 0x15, 0xc0, 0x6, 0x96, + 0xbe, 0xab, 0x77, 0xa9, 0x7d, 0xb9, 0x81, 0x19, 0x6d, 0xfb, 0x2a, 0x51, + 0xa, 0xa9, 0xf7, 0x2b, 0x5, 0xf7, 0x0, 0xec, 0xbd, 0xee, 0x8c, 0x1f, + 0xd4, 0x45, 0xb1, 0x47, 0xa6, 0x1e, 0x52, 0xa0, 0x2f, 0xa4, 0x89, 0xbc, + 0x8, 0xcd, 0xd9, 0xac, 0xcc, 0xba, 0xb6, 0x72, 0x75, 0xad, 0x1e, 0x83, + 0x66, 0x6a, 0xa, 0xa8, 0xf7, 0x29, 0x5, 0x55, 0x6, 0x80, 0x54, 0x70, + 0x9a, 0x6e, 0x9d, 0x69, 0x8f, 0x19, 0x9f, 0xf7, 0x1, 0x71, 0xa, 0x77, + 0x23, 0x5, 0x57, 0x8a, 0xfb, 0x21, 0x71, 0xfb, 0x1d, 0x1a, 0x45, 0xe6, + 0x6c, 0xd1, 0x72, 0x1e, 0xcb, 0x74, 0xce, 0x6c, 0x59, 0x1a, 0x51, 0x3e, + 0x6f, 0x29, 0x59, 0x5e, 0xa0, 0xaa, 0x6d, 0x1e, 0x94, 0xb9, 0x52, 0xa, + 0xe, 0x7c, 0xc4, 0xf7, 0x28, 0xc2, 0xf7, 0x12, 0xc4, 0xf7, 0x1f, 0xc2, + 0x12, 0xf7, 0x13, 0xc4, 0xac, 0xc4, 0xc3, 0xc5, 0xab, 0xc5, 0x17, 0xf7, + 0x13, 0xf8, 0x6b, 0x6d, 0xa, 0xba, 0x42, 0x35, 0x47, 0x44, 0x3b, 0x1e, + 0xc4, 0x94, 0x15, 0xbc, 0xae, 0xb1, 0xc1, 0xad, 0xa2, 0x70, 0x72, 0xa, + 0xfb, 0x5, 0xfb, 0xb3, 0x15, 0xf8, 0x61, 0xf7, 0x43, 0x5, 0x13, 0xc5, + 0x86, 0xc1, 0xfc, 0x60, 0xfb, 0x45, 0x5, 0xf7, 0x2a, 0xfb, 0x34, 0x6d, + 0xa, 0xc3, 0x42, 0x35, 0x47, 0x3b, 0x3b, 0x1e, 0xc4, 0x94, 0x15, 0xbc, + 0xae, 0xba, 0xc1, 0xad, 0xa2, 0x67, 0x72, 0xa, 0xe, 0x7c, 0xbd, 0x67, + 0xc3, 0xf7, 0x38, 0xc3, 0xf7, 0x6d, 0xbe, 0x12, 0xc0, 0xc0, 0xce, 0xc1, + 0x13, 0x7c, 0xf7, 0xe1, 0xbd, 0x15, 0xa6, 0x58, 0x5, 0xf7, 0x2b, 0x6, + 0x95, 0xc3, 0x5, 0xfb, 0x11, 0x6, 0x78, 0xae, 0xaf, 0xaf, 0xa5, 0xbd, + 0x9b, 0xb6, 0x19, 0xdc, 0x6, 0x95, 0xc3, 0x5, 0xfb, 0xf, 0x6, 0x83, + 0x60, 0x72, 0x54, 0x67, 0x63, 0x21, 0xf7, 0x62, 0x18, 0x88, 0x8f, 0x7a, + 0xac, 0x8a, 0xab, 0x8, 0xc0, 0xc1, 0xa6, 0xcf, 0xaf, 0xb2, 0x7d, 0x72, + 0x9d, 0x1e, 0xa7, 0xbb, 0x5, 0xab, 0x6d, 0x5d, 0x95, 0x5d, 0x1b, 0x39, + 0x2e, 0x60, 0x3d, 0x1f, 0x88, 0x65, 0x9c, 0x67, 0x9b, 0x67, 0x8, 0xfb, + 0x18, 0x39, 0x79, 0x4b, 0x45, 0x1a, 0x13, 0xbc, 0x57, 0xab, 0x50, 0xe2, + 0xc2, 0xc7, 0xa3, 0xb4, 0xb9, 0x1e, 0x76, 0xb9, 0x15, 0x75, 0x6e, 0x60, + 0x64, 0x54, 0x1b, 0x60, 0x68, 0xa2, 0xbe, 0x8a, 0x1f, 0xd8, 0xd4, 0xc2, + 0xbb, 0xa3, 0x1e, 0xe, 0xf7, 0xee, 0x76, 0xf7, 0x81, 0x77, 0x1, 0xf7, + 0x86, 0xf7, 0xd9, 0x15, 0xb9, 0x6, 0xd0, 0xf7, 0x81, 0x7b, 0xa, 0xe, + 0x34, 0x76, 0xf9, 0x6e, 0x77, 0x1, 0xf7, 0x3e, 0xbe, 0x3, 0xf7, 0x6e, + 0xfb, 0x0, 0x15, 0xbe, 0x6, 0x75, 0xc6, 0x71, 0xe2, 0xeb, 0x1a, 0xf7, + 0x4f, 0xee, 0xf7, 0x33, 0xf7, 0x1, 0xf7, 0x22, 0x1e, 0x7a, 0x79, 0x8b, + 0x7a, 0x1b, 0xfb, 0x18, 0xfb, 0x37, 0x40, 0xfb, 0x29, 0xfb, 0x46, 0x1a, + 0x2c, 0xa1, 0x36, 0xa5, 0x4f, 0x1e, 0xe, 0x34, 0x76, 0xf9, 0x6e, 0x77, + 0x1, 0xf8, 0xd, 0xbf, 0x3, 0xf7, 0x3e, 0xfb, 0x0, 0x15, 0x9c, 0x9d, + 0x8b, 0x9c, 0x1b, 0xf7, 0x18, 0xf7, 0x37, 0xd6, 0xf7, 0x29, 0xf7, 0x46, + 0x1a, 0xea, 0x74, 0xe0, 0x71, 0xc7, 0x1e, 0x58, 0x6, 0xa1, 0x50, 0xa5, + 0x34, 0x2b, 0x1a, 0xfb, 0x4f, 0x29, 0xfb, 0x33, 0xfb, 0x1, 0xfb, 0x22, + 0x1e, 0xe, 0xf7, 0x95, 0xf7, 0xf2, 0x1, 0xf7, 0x8, 0xf8, 0x4, 0x3, + 0xf7, 0x1d, 0xf7, 0xb5, 0x15, 0xc0, 0x6b, 0xee, 0xf7, 0xe, 0xbb, 0xfb, + 0xe, 0xca, 0xab, 0x4a, 0xf7, 0x12, 0xf7, 0x29, 0xa7, 0x82, 0xcd, 0xfb, + 0x24, 0x5e, 0xae, 0xf7, 0x23, 0x5, 0x46, 0x6, 0x74, 0xfb, 0x1d, 0xfb, + 0x16, 0xb2, 0x6f, 0x49, 0xf7, 0x17, 0x6e, 0x5, 0xe, 0xf7, 0x79, 0xc1, + 0x1, 0xf7, 0x79, 0xc3, 0x3, 0xd5, 0xf7, 0x79, 0x15, 0xf7, 0x55, 0x6, + 0x65, 0xfb, 0x4d, 0x51, 0xa, 0xb1, 0xf7, 0x4d, 0x5, 0xf7, 0x54, 0x4d, + 0xa, 0xfb, 0x54, 0x6, 0xb1, 0xf7, 0x4f, 0x71, 0xa, 0x65, 0xfb, 0x4f, + 0x5, 0xfb, 0x55, 0x6, 0xe, 0x30, 0x76, 0xf7, 0x7e, 0x77, 0x1, 0xf7, + 0x55, 0xfb, 0x4, 0x15, 0xcb, 0x75, 0xa, 0xf7, 0x7b, 0xc1, 0x1, 0xec, + 0xf8, 0x2a, 0x3, 0xec, 0xf7, 0x7b, 0x15, 0xf8, 0x1e, 0x47, 0xa, 0xfc, + 0x1e, 0x6, 0xe, 0x7c, 0xf7, 0x10, 0x1, 0xf7, 0x78, 0xf7, 0x24, 0x3, + 0xf7, 0x78, 0xae, 0x35, 0xa, 0xe, 0x3b, 0xf9, 0x59, 0x1, 0xc1, 0xf8, + 0x80, 0x3, 0xc1, 0x4f, 0x15, 0xb6, 0x77, 0xf8, 0x55, 0xf9, 0x44, 0x63, + 0xa0, 0x5, 0xe, 0x7c, 0xc5, 0xf8, 0x77, 0xc1, 0x1, 0xe5, 0xc0, 0xf7, + 0xc8, 0xc6, 0x3, 0xe5, 0xf7, 0x46, 0x15, 0x2f, 0xa8, 0x26, 0xf7, 0xe, + 0xf7, 0x78, 0xb4, 0xf7, 0xbe, 0xf7, 0xb, 0xe4, 0x67, 0xe4, 0xfb, 0x3, + 0xfb, 0x5a, 0x40, 0xfb, 0x8f, 0xfb, 0x2b, 0x1e, 0xc0, 0x8e, 0x15, 0xf7, + 0x13, 0xd0, 0xf7, 0x6e, 0xf7, 0x1d, 0xdf, 0x9d, 0x41, 0x4f, 0xfb, 0x46, + 0x3b, 0xfb, 0x43, 0xfb, 0xd, 0x39, 0x72, 0xd3, 0xd1, 0x1e, 0xe, 0x8b, + 0xc2, 0x54, 0xc6, 0xf8, 0x9f, 0x77, 0x1, 0xf7, 0xad, 0xc2, 0x3, 0xe6, + 0x16, 0xf8, 0x2a, 0x36, 0xa, 0xfb, 0x40, 0x6, 0xf2, 0xf8, 0xa3, 0xfb, + 0x7c, 0x58, 0x80, 0x53, 0xf7, 0x42, 0xb0, 0x32, 0x7a, 0xa, 0xfb, 0x47, + 0x6, 0xe, 0x8b, 0xc2, 0x54, 0xc6, 0xf8, 0x6b, 0xc0, 0x12, 0xf7, 0x34, + 0xc3, 0xf7, 0xaa, 0xc2, 0x13, 0xb8, 0xbe, 0x16, 0xf8, 0x31, 0x6, 0xa3, + 0xf7, 0x13, 0x52, 0xa, 0x7e, 0x43, 0x5, 0xfb, 0xa9, 0x6, 0xf7, 0xff, + 0xf7, 0x7a, 0xb6, 0xb8, 0xf7, 0x9, 0x1a, 0xd3, 0x39, 0xc8, 0x37, 0x3e, + 0x4a, 0x7f, 0x43, 0x49, 0x1e, 0x7c, 0x43, 0x51, 0xa, 0xe5, 0x99, 0xdb, + 0x98, 0xc4, 0x1b, 0xd3, 0xc2, 0x65, 0x53, 0x1f, 0x13, 0x78, 0xfb, 0x7, + 0xfb, 0x8b, 0xfb, 0xd, 0xfb, 0x4d, 0xfb, 0x1e, 0x1e, 0xe, 0x7c, 0xc2, + 0xf7, 0x63, 0xc7, 0xf7, 0x96, 0xc4, 0x1, 0xf8, 0x31, 0xc3, 0x3, 0xd3, + 0xa2, 0x15, 0x71, 0xcc, 0xd0, 0x7f, 0xce, 0x1b, 0xf7, 0x10, 0xf7, 0x0, + 0xd0, 0xf7, 0x17, 0xd5, 0x4d, 0xa3, 0x6d, 0x92, 0x1f, 0xbd, 0xa4, 0xcc, + 0xbb, 0xec, 0x1a, 0xda, 0x38, 0xb3, 0x33, 0x8c, 0x1e, 0x4b, 0x49, 0x79, + 0x6a, 0x61, 0x1f, 0x9a, 0x58, 0x5, 0xa4, 0xa8, 0xcb, 0xa3, 0xc9, 0x1b, + 0xc6, 0xc2, 0x76, 0x53, 0x4a, 0x39, 0x41, 0x20, 0x1f, 0x88, 0x6, 0x80, + 0x4b, 0x5, 0xc8, 0x8e, 0xf7, 0xb, 0x88, 0x43, 0x1a, 0x32, 0x32, 0x59, + 0x26, 0x50, 0x57, 0x97, 0xa3, 0x5a, 0x1e, 0xe, 0x8b, 0xc7, 0xf3, 0xc6, + 0xf7, 0xa8, 0xcc, 0x1, 0xf7, 0xe8, 0xcd, 0x3, 0xde, 0xf7, 0x38, 0x15, + 0xf7, 0xa9, 0x6, 0x77, 0xfb, 0x0, 0x5, 0x20, 0x60, 0xa, 0xf7, 0x91, + 0x3c, 0xa, 0x3b, 0x6, 0x9e, 0xf7, 0x0, 0x5, 0xdb, 0x6, 0x96, 0xc6, + 0x89, 0xa, 0xcf, 0xf7, 0xe9, 0x5, 0x30, 0x6, 0xfb, 0xd4, 0xfb, 0xf0, + 0x5, 0xd8, 0x92, 0x15, 0xf7, 0x96, 0xf7, 0xa8, 0x51, 0xfb, 0xa8, 0x5, + 0xe, 0x7c, 0xc6, 0xf7, 0x9f, 0xc6, 0xf7, 0x1e, 0xc3, 0x1, 0xf7, 0x1e, + 0xcb, 0xf7, 0x5d, 0xca, 0x3, 0xc2, 0xa5, 0x15, 0x6f, 0xc4, 0xc7, 0x7e, + 0xc3, 0x1b, 0xf7, 0x27, 0xf7, 0x12, 0xd6, 0xf7, 0x22, 0xde, 0x45, 0xc8, + 0x3a, 0x5c, 0x54, 0x87, 0x72, 0x5d, 0x1f, 0xb2, 0xf7, 0x53, 0x5, 0xf7, + 0xb9, 0x3c, 0xa, 0xfb, 0xf1, 0x6, 0x51, 0xfb, 0xc1, 0xb0, 0x81, 0x5, + 0x9e, 0xb5, 0xcb, 0x9d, 0xba, 0x1b, 0xd0, 0xb4, 0x63, 0x54, 0x2d, 0x23, + 0x50, 0x20, 0x55, 0x54, 0x96, 0xa8, 0x62, 0x1f, 0xe, 0x7c, 0xc6, 0xf7, + 0x99, 0x76, 0xf7, 0x84, 0xc3, 0x1, 0xca, 0xc6, 0xf7, 0x9f, 0xc9, 0x3, + 0xf7, 0x16, 0xf7, 0x9c, 0x15, 0xf7, 0x25, 0xa5, 0xf7, 0x4e, 0xf7, 0x7, + 0xf7, 0x4a, 0x1b, 0x98, 0xc3, 0x5, 0xfb, 0xa5, 0xfb, 0x5d, 0xfb, 0x2f, + 0xfb, 0x7c, 0xfb, 0x28, 0xd8, 0x4f, 0xe8, 0xf7, 0x1d, 0xdc, 0xec, 0xf7, + 0xc, 0xe6, 0x34, 0xbb, 0x38, 0x4e, 0x50, 0x67, 0x62, 0x6c, 0x1f, 0x83, + 0x46, 0x15, 0xbc, 0xa0, 0xc9, 0xb3, 0xca, 0x1b, 0xce, 0xc1, 0x6e, 0x44, + 0x45, 0x4e, 0x41, 0x2f, 0x36, 0x63, 0xd9, 0xd8, 0x96, 0x1f, 0xe, 0xa0, + 0x76, 0xf8, 0x91, 0xc2, 0x1, 0xe0, 0xc0, 0xf7, 0xc8, 0xc5, 0x3, 0xf7, + 0x32, 0x16, 0xc6, 0x6, 0xf7, 0xb3, 0xf8, 0x8d, 0x96, 0xc6, 0x5, 0xfc, + 0x1d, 0x6, 0x66, 0xfb, 0x29, 0x5, 0xc0, 0x6, 0xa6, 0xe9, 0x5, 0xf7, + 0xad, 0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x6d, 0xc8, 0xf7, 0x5f, 0xc6, 0x1, + 0xd3, 0xcb, 0xf7, 0x9b, 0xc9, 0x3, 0xf7, 0x60, 0xf7, 0xb9, 0x15, 0x64, + 0x85, 0x2e, 0x4a, 0x31, 0x1a, 0x2b, 0xcf, 0x58, 0xf6, 0xf7, 0x25, 0xea, + 0xd8, 0xf7, 0xb, 0xd0, 0x5a, 0xa8, 0x6d, 0x99, 0x1e, 0xc0, 0x93, 0xce, + 0xc9, 0xea, 0x1a, 0xc3, 0x54, 0xcd, 0x23, 0xfb, 0x8, 0xfb, 0x3, 0x44, + 0xfb, 0xc, 0x1e, 0x8c, 0x5f, 0xa4, 0x6b, 0xaf, 0x77, 0x8, 0x89, 0xec, + 0x15, 0xf7, 0x5, 0xf7, 0x6, 0xa1, 0xb0, 0xcf, 0xb9, 0x63, 0x62, 0x41, + 0x42, 0x57, 0x39, 0x6d, 0x3b, 0x95, 0xc9, 0x1e, 0x49, 0xfb, 0xa1, 0x15, + 0xf7, 0x6, 0xf7, 0xa, 0xa5, 0xba, 0xcb, 0xc7, 0x61, 0x5b, 0x2e, 0x28, + 0x62, 0x47, 0x62, 0x3a, 0xa4, 0xc6, 0x1e, 0xe, 0x7d, 0xc7, 0xf7, 0x41, + 0xc4, 0xf7, 0x8e, 0xc1, 0x1, 0xf7, 0x25, 0xc4, 0xf7, 0xab, 0xc6, 0x3, + 0xc6, 0x7d, 0x15, 0xf8, 0x9, 0xf7, 0x0, 0xf7, 0x55, 0xf7, 0x78, 0xe9, + 0x58, 0xda, 0xfb, 0x5, 0xfb, 0x18, 0x28, 0x20, 0xfb, 0x4, 0x1f, 0x42, + 0x8c, 0xbf, 0x46, 0xf3, 0x1b, 0xc6, 0xca, 0x93, 0xb6, 0xb4, 0x1f, 0x66, + 0xfb, 0xe, 0x26, 0xfb, 0x0, 0xfb, 0x94, 0x8d, 0x8, 0xf8, 0x2e, 0xf7, + 0xce, 0x15, 0x64, 0x71, 0x4c, 0x62, 0x42, 0x1b, 0x43, 0x5e, 0xb4, 0xbf, + 0xe2, 0xd9, 0xd1, 0xe7, 0xe9, 0xa5, 0x30, 0x3c, 0x80, 0x1f, 0xe, 0x7c, + 0xf7, 0x10, 0xf7, 0x2c, 0xf7, 0x10, 0x1, 0xf7, 0x5a, 0xf7, 0x24, 0x3, + 0xf7, 0x5a, 0xae, 0x35, 0xa, 0xc6, 0xf7, 0xa8, 0x35, 0xa, 0xe, 0xf7, + 0x99, 0xf7, 0x10, 0x1, 0xf7, 0x32, 0xcb, 0xd7, 0xf7, 0x24, 0x3, 0xf7, + 0x32, 0xfb, 0x4, 0x15, 0xcb, 0x6, 0xf7, 0x2a, 0xf7, 0x8f, 0x5, 0x2e, + 0x6, 0x9e, 0xf7, 0x40, 0x35, 0xa, 0xe, 0xca, 0x76, 0xf7, 0xfe, 0xcf, + 0x1, 0xd4, 0xd5, 0x3, 0xd4, 0xf7, 0x6c, 0x15, 0xf7, 0xfa, 0xfb, 0x42, + 0x9c, 0xc9, 0xfb, 0xc1, 0xf7, 0x2d, 0xf8, 0x3, 0xf7, 0x27, 0x98, 0xcf, + 0xfc, 0x48, 0xfb, 0x42, 0x5, 0xe, 0xf7, 0x1e, 0xc8, 0xf7, 0x7, 0xc9, + 0x1, 0xe0, 0xf7, 0xce, 0x15, 0xf8, 0x56, 0x6, 0x95, 0xc9, 0x5, 0xfc, + 0x55, 0x6, 0x61, 0xfb, 0x82, 0x15, 0xf8, 0x54, 0x6, 0x97, 0xc8, 0x5, + 0xfc, 0x55, 0x6, 0xe, 0xb5, 0xcf, 0xf7, 0xc0, 0xc9, 0x1, 0xf8, 0x59, + 0xd5, 0x3, 0xd4, 0xb5, 0x15, 0xf8, 0x48, 0xf7, 0x42, 0x9d, 0xdd, 0xfb, + 0xfa, 0xf7, 0x42, 0x7a, 0x4d, 0xf7, 0xc1, 0xfb, 0x2d, 0xfc, 0x3, 0xfb, + 0x27, 0x5, 0xe, 0x7c, 0xf7, 0xa, 0xf7, 0x44, 0xf7, 0x23, 0xeb, 0xc1, + 0x12, 0xf7, 0xb, 0xc1, 0x9c, 0xc3, 0xf7, 0x48, 0xc1, 0x17, 0xf7, 0x52, + 0xf7, 0x44, 0x15, 0xc3, 0x6, 0x96, 0xc5, 0x5, 0xda, 0x9b, 0xf7, 0x24, + 0xc6, 0xf7, 0x17, 0x1a, 0xe0, 0x43, 0xba, 0x2c, 0x50, 0x4b, 0x73, 0x7a, + 0x59, 0x1e, 0x13, 0xf4, 0x76, 0xfb, 0x1, 0x5, 0xc1, 0x6, 0x97, 0xc9, + 0x5, 0x9a, 0xb1, 0xb5, 0x9e, 0xb3, 0x1b, 0xe7, 0xa8, 0x5e, 0x65, 0x2d, + 0xfb, 0x17, 0x5a, 0x36, 0x7e, 0x1f, 0x36, 0xfb, 0x8f, 0x15, 0x70, 0x8c, + 0x9f, 0x7b, 0xad, 0x1b, 0xae, 0xb9, 0xa9, 0xb3, 0xa3, 0x75, 0xa3, 0x69, + 0x62, 0x63, 0x67, 0x64, 0x8c, 0x1f, 0xe, 0x7d, 0xb0, 0xdf, 0xaf, 0xf7, + 0x6e, 0xb0, 0xf7, 0x0, 0xb0, 0x1, 0xb1, 0xb0, 0xeb, 0xb0, 0xf7, 0xe6, + 0xb1, 0x3, 0xf7, 0xe4, 0xf7, 0x3e, 0x15, 0x6e, 0x8a, 0xa3, 0x69, 0xba, + 0x1b, 0xf0, 0xd8, 0xf7, 0x18, 0xf7, 0xb, 0xf7, 0xb, 0x2c, 0xcd, 0xfb, + 0x6, 0xfb, 0x58, 0xfb, 0x21, 0xfb, 0x34, 0xfb, 0x4d, 0x21, 0xbd, 0x21, + 0xf7, 0x32, 0xdf, 0xe7, 0xa9, 0xb2, 0xd4, 0x1f, 0x83, 0xaf, 0x5, 0x58, + 0x29, 0x42, 0x7a, 0x49, 0x1b, 0x20, 0x47, 0xd1, 0xf5, 0xf7, 0x1c, 0xe4, + 0xf7, 0x3f, 0xf7, 0x5a, 0xf0, 0xde, 0x5a, 0x20, 0x2d, 0x4b, 0xfb, 0x5, + 0x49, 0x71, 0x74, 0x9f, 0xae, 0x91, 0x1f, 0x90, 0xa2, 0x99, 0xa3, 0x95, + 0xa0, 0xc6, 0xf7, 0x12, 0x18, 0x66, 0x6, 0x73, 0x59, 0x5, 0xc2, 0x85, + 0x6b, 0x8c, 0x7e, 0x1b, 0x2d, 0x37, 0x23, 0xfb, 0x11, 0x6a, 0x9e, 0x6e, + 0xb1, 0xb4, 0xb5, 0xa9, 0xac, 0xa4, 0x1f, 0xad, 0xf7, 0x19, 0x15, 0x4a, + 0x7e, 0x50, 0x2c, 0x51, 0x1b, 0x71, 0x85, 0xa1, 0x9f, 0xd8, 0xcd, 0xee, + 0xca, 0xb0, 0x8a, 0x62, 0x7a, 0x88, 0x1f, 0xe, 0x8b, 0xc1, 0xf6, 0xc1, + 0xf7, 0xb4, 0xc1, 0x1, 0x89, 0xf7, 0x65, 0xf7, 0x48, 0xf7, 0x60, 0x3, + 0x89, 0x16, 0xf7, 0x65, 0x2a, 0xa, 0x32, 0x6, 0xca, 0xf7, 0x4, 0x5, + 0xf7, 0xab, 0x6, 0xa2, 0xfb, 0x4, 0x2c, 0xa, 0xf8, 0x90, 0x32, 0xa, + 0x58, 0xa, 0x4f, 0x6, 0xf7, 0x6c, 0xf7, 0x3a, 0x15, 0xf7, 0x3f, 0xf7, + 0xba, 0xcb, 0xfb, 0xba, 0x5, 0xe, 0x8b, 0xc1, 0xf7, 0x50, 0xc2, 0xf7, + 0x67, 0xc1, 0x12, 0xf5, 0xc3, 0xf7, 0xec, 0xc8, 0x62, 0xc7, 0x13, 0xe8, + 0x13, 0xe4, 0x98, 0x16, 0xf7, 0xc8, 0x6, 0xf7, 0x1a, 0xf7, 0x5, 0xbd, + 0xf7, 0x18, 0x8a, 0x1f, 0xbe, 0x58, 0xae, 0x58, 0x95, 0x1e, 0x13, 0xe8, + 0xd2, 0x9e, 0xbd, 0xbb, 0xe9, 0x1a, 0xe8, 0x2c, 0xa9, 0x2a, 0x1e, 0xfb, + 0x9e, 0x45, 0xa, 0xdd, 0x6, 0x2f, 0xfc, 0x5a, 0x6b, 0xa, 0xf7, 0x51, + 0xf7, 0x87, 0x15, 0xb5, 0xf7, 0x67, 0x5, 0xf7, 0x1d, 0xf7, 0x1a, 0x89, + 0x40, 0x2e, 0x24, 0x62, 0x37, 0x1f, 0xfb, 0x45, 0xfb, 0x87, 0x15, 0xb3, + 0xf7, 0x50, 0x5, 0xf7, 0x1e, 0x6, 0x13, 0xf8, 0xc7, 0xf5, 0x83, 0x4c, + 0x30, 0xfb, 0x3, 0x71, 0x41, 0x1f, 0xe, 0x79, 0xc2, 0xf8, 0x7d, 0xc1, + 0x8a, 0x77, 0x12, 0xbc, 0xc5, 0x13, 0xd0, 0xf8, 0x6e, 0xf2, 0x15, 0x64, + 0x4d, 0x42, 0x70, 0x46, 0x1b, 0x22, 0x51, 0xc9, 0xf7, 0x2, 0xf7, 0x5a, + 0xf7, 0x12, 0xf7, 0xb, 0xf7, 0xe, 0xcc, 0xc1, 0x6b, 0x5c, 0xaf, 0x1f, + 0x78, 0x30, 0x6a, 0xa, 0x13, 0xb0, 0xb8, 0xf7, 0x73, 0x52, 0xa, 0x7f, + 0x4e, 0x5, 0x13, 0xd0, 0xb9, 0x4a, 0x5d, 0x9b, 0x55, 0x1b, 0xfb, 0x54, + 0xfb, 0xa, 0xfb, 0x38, 0xfb, 0x61, 0xfb, 0x15, 0xbd, 0x27, 0xf7, 0x2f, + 0xdb, 0xdf, 0xa8, 0xb8, 0xd2, 0x1f, 0xe, 0x3e, 0xa, 0xf8, 0xab, 0xc3, + 0x3, 0x80, 0x16, 0xf7, 0x87, 0x6, 0xf7, 0x48, 0xf7, 0x47, 0xd7, 0xf7, + 0xb6, 0xf7, 0x37, 0xfb, 0x0, 0xac, 0xfb, 0x18, 0x1f, 0xfb, 0x8b, 0x45, + 0xa, 0xdb, 0x5e, 0xa, 0x3a, 0x6, 0xf7, 0x1c, 0x16, 0xe6, 0x87, 0xa, + 0xf7, 0x5a, 0x85, 0xf7, 0x2, 0x9f, 0xfb, 0x3e, 0x1a, 0xfb, 0x42, 0x23, + 0xfb, 0x10, 0xfb, 0x4a, 0x1e, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0x61, 0xa, + 0x1, 0x88, 0x16, 0xf8, 0x87, 0x6, 0xb1, 0xf7, 0x4f, 0x62, 0xa, 0x70, + 0xfb, 0x19, 0x5, 0xfb, 0xc4, 0x6, 0xb3, 0xf7, 0x5b, 0x5, 0xf7, 0x39, + 0x6, 0x7a, 0x3a, 0x51, 0xa, 0xba, 0xf7, 0x6d, 0x62, 0xa, 0x79, 0x39, + 0x5, 0xfb, 0x39, 0x6, 0xb4, 0xf7, 0x5d, 0x81, 0xa, 0x70, 0xfb, 0x1a, + 0x5, 0xc4, 0x6, 0xb1, 0xf7, 0x50, 0x5, 0xfc, 0x82, 0x45, 0xa, 0xdf, + 0x6, 0x2f, 0xfc, 0x5a, 0x6b, 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0x61, + 0xa, 0x1, 0xe3, 0xc4, 0xf7, 0x54, 0xc3, 0xf7, 0x6, 0xc4, 0x3, 0x88, + 0x16, 0xf7, 0xa3, 0x6, 0x97, 0xc1, 0x55, 0xa, 0xb3, 0xf7, 0x5b, 0x5, + 0xf7, 0x3a, 0x6, 0x7d, 0x43, 0x51, 0xa, 0xb4, 0xf7, 0x5b, 0x62, 0xa, + 0x7c, 0x42, 0x5, 0xfb, 0x3a, 0x6, 0xb3, 0xf7, 0x5d, 0x5, 0xf7, 0xc0, + 0x6, 0x6e, 0xfb, 0x23, 0x5, 0xc4, 0x6, 0xb3, 0xf7, 0x59, 0x5, 0xfc, + 0x80, 0x45, 0xa, 0xdb, 0x6, 0x2f, 0xfc, 0x5a, 0x89, 0xa, 0xe, 0x79, + 0xc2, 0xf7, 0x39, 0xc2, 0xf7, 0xa0, 0xc2, 0x1, 0x9e, 0xc4, 0xf8, 0x2b, + 0xc3, 0x3, 0x34, 0xa, 0x3d, 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x60, 0xc1, + 0xf7, 0x58, 0xc1, 0x1, 0xcb, 0xc1, 0xf7, 0xa8, 0xc1, 0x3, 0x70, 0x16, + 0xf7, 0x6a, 0x2a, 0xa, 0x3b, 0x6, 0xb4, 0xf7, 0x60, 0x5, 0xf7, 0xa7, + 0x6, 0x63, 0xfb, 0x60, 0x5, 0x3c, 0x2d, 0xa, 0xf7, 0x68, 0x2a, 0xa, + 0x3c, 0x6, 0xe5, 0x87, 0xa, 0xda, 0x2a, 0xa, 0xfb, 0x68, 0x2d, 0xa, + 0xda, 0x6, 0x64, 0xfb, 0x58, 0x5, 0xfb, 0xa7, 0x6, 0xb1, 0xf7, 0x58, + 0x5, 0xdb, 0x2a, 0xa, 0xfb, 0x6a, 0x2d, 0xa, 0xdb, 0x6, 0x31, 0xfc, + 0x5a, 0x89, 0xa, 0xe, 0x3e, 0xa, 0xaf, 0x16, 0xf8, 0x2e, 0x47, 0xa, + 0xfb, 0x44, 0x6, 0xec, 0x87, 0xa, 0xf7, 0x40, 0x47, 0xa, 0xfc, 0x2a, + 0x45, 0xa, 0xf7, 0x43, 0x6, 0x2a, 0x58, 0xa, 0xfb, 0x43, 0x6, 0xe, + 0x79, 0xc1, 0xf8, 0x6b, 0xc2, 0x1, 0xa2, 0xc3, 0xf7, 0xec, 0xc1, 0x3, + 0x7b, 0xb4, 0x15, 0x65, 0xe2, 0xca, 0x76, 0xce, 0x1b, 0xf7, 0x22, 0xbb, + 0x7c, 0xa, 0xf7, 0x15, 0x36, 0xa, 0xfc, 0x12, 0x38, 0xa, 0xf7, 0x5b, + 0x6, 0x4b, 0xfb, 0xdc, 0x5, 0x3a, 0x7b, 0x5f, 0x4d, 0x2d, 0x1b, 0x71, + 0xfb, 0x1f, 0x91, 0xf7, 0xe, 0xa3, 0x1f, 0x9a, 0xe6, 0x71, 0xa, 0xe, + 0x3e, 0xa, 0xd7, 0xc1, 0xf7, 0xec, 0xcf, 0x3, 0x7b, 0x16, 0xf7, 0x6d, + 0x2a, 0xa, 0x39, 0x6, 0xab, 0xf7, 0x2d, 0xef, 0xdd, 0xa5, 0x5f, 0xb6, + 0x41, 0xae, 0x38, 0xa4, 0x33, 0x19, 0xf7, 0x2a, 0x2a, 0xa, 0xfb, 0x9, + 0x6, 0x76, 0xd2, 0x65, 0xdd, 0x62, 0xcc, 0x8, 0x8b, 0x76, 0xad, 0x82, + 0x9a, 0x1e, 0xf7, 0x81, 0xf7, 0x4f, 0x5, 0xcb, 0x43, 0xa, 0xd2, 0x6, + 0xfb, 0xbf, 0xfb, 0x7f, 0xc3, 0xf7, 0x7f, 0x5, 0xd0, 0x2a, 0xa, 0xfb, + 0x6b, 0x2d, 0xa, 0xe7, 0x6, 0x26, 0x58, 0xa, 0x3a, 0x6, 0xe, 0x3e, + 0xa, 0xf7, 0xb, 0xc3, 0x3, 0x8b, 0x4, 0xf8, 0x96, 0x6, 0xb9, 0xf7, + 0x87, 0x71, 0xa, 0x68, 0xfb, 0x51, 0x5, 0xfb, 0xba, 0x6, 0xe7, 0x87, + 0xa, 0xf7, 0x14, 0x2a, 0xa, 0xfb, 0xb9, 0x2d, 0xa, 0xf7, 0x0, 0x5e, + 0xa, 0xfb, 0x0, 0x6, 0xe, 0x3e, 0xa, 0x9f, 0xc3, 0xf7, 0xfc, 0xc3, + 0x3, 0x63, 0x16, 0xf7, 0x3c, 0x47, 0xa, 0x4b, 0x6, 0xe6, 0x87, 0xa, + 0x94, 0x6, 0xd4, 0xfc, 0xf, 0x5, 0xb7, 0x6, 0xf7, 0x73, 0xf8, 0xf, + 0x5, 0x96, 0x5e, 0xa, 0x4f, 0x5f, 0xa, 0xf7, 0x36, 0x2a, 0xa, 0x5c, + 0x6, 0xe6, 0x87, 0xa, 0xb9, 0x47, 0xa, 0xfb, 0x28, 0x6, 0xfb, 0x5e, + 0xfb, 0xec, 0x48, 0xf7, 0xec, 0x5, 0xfb, 0x2b, 0x5f, 0xa, 0xbb, 0x5e, + 0xa, 0x5b, 0x6, 0xe, 0x8a, 0xc2, 0xf8, 0x59, 0xc2, 0x1, 0x5e, 0x8a, + 0x15, 0xf7, 0x80, 0x36, 0xa, 0x28, 0x6, 0xe1, 0xf8, 0x41, 0xf7, 0x54, + 0xfc, 0x78, 0x5, 0xd6, 0x6, 0xf0, 0xf8, 0x90, 0x5, 0xd8, 0x36, 0xa, + 0xfb, 0x7b, 0x38, 0xa, 0xed, 0x6, 0x35, 0xfc, 0x44, 0xfb, 0x53, 0xf8, + 0x7b, 0x5, 0xfb, 0x31, 0x56, 0xa, 0xdd, 0x6, 0x31, 0xfc, 0x59, 0x5, + 0x3a, 0x6, 0xe, 0x79, 0xc2, 0xf8, 0x7c, 0xc2, 0x1, 0xad, 0xc2, 0xf8, + 0x38, 0xc3, 0x3, 0xad, 0xf7, 0x6c, 0x15, 0xfb, 0x19, 0xd5, 0x26, 0xf7, + 0x1c, 0xf7, 0x4b, 0xf7, 0x1e, 0xf7, 0x4f, 0xf7, 0x50, 0xee, 0x5c, 0xf7, + 0x10, 0xfb, 0x33, 0xfb, 0x5a, 0xfb, 0x13, 0xfb, 0x5c, 0xfb, 0x38, 0x1e, + 0xc2, 0x89, 0x15, 0xf7, 0x3, 0xdd, 0xf7, 0x5c, 0xf7, 0x43, 0xf7, 0x10, + 0xb2, 0x2e, 0x3c, 0xfb, 0x24, 0xfb, 0xb, 0xfb, 0x40, 0xfb, 0x1b, 0x20, + 0x50, 0xd9, 0xee, 0x1e, 0xe, 0x8b, 0xc1, 0xf7, 0x31, 0xc1, 0xf7, 0x87, + 0xc1, 0x1, 0xf6, 0xc5, 0xf7, 0xfa, 0xc6, 0x3, 0x9c, 0x16, 0xf7, 0xba, + 0x2a, 0xa, 0xfb, 0x31, 0x6, 0xab, 0xf7, 0x31, 0x5, 0xf7, 0x1a, 0x6, + 0xf7, 0x31, 0xe9, 0xcf, 0xf7, 0x27, 0xd2, 0x5c, 0xcc, 0xfb, 0x15, 0x1f, + 0xfb, 0xa7, 0x2d, 0xa, 0xdb, 0x6, 0x2e, 0x58, 0xa, 0x3c, 0x6, 0xf7, + 0x47, 0xf7, 0x67, 0x15, 0xbc, 0xf7, 0x87, 0x5, 0xf7, 0x1b, 0x6, 0xd0, + 0xca, 0x6b, 0x52, 0xfb, 0x11, 0x20, 0x6e, 0x4a, 0x1f, 0xe, 0xfb, 0x1e, + 0xf7, 0x41, 0xfb, 0x15, 0xf7, 0x15, 0x54, 0xc2, 0xf8, 0x7e, 0xc2, 0x12, + 0xae, 0xc7, 0xf8, 0x2f, 0xc6, 0x13, 0x5c, 0xd9, 0x3f, 0x15, 0x91, 0x54, + 0x5, 0xaa, 0xb4, 0xb2, 0x91, 0xb2, 0x1b, 0xaa, 0xaa, 0x7c, 0x80, 0xab, + 0x1f, 0x13, 0x9c, 0x82, 0xa6, 0xa6, 0x82, 0xa6, 0x1b, 0xae, 0xaf, 0x9b, + 0x9f, 0xa7, 0x1f, 0x7b, 0xba, 0x5, 0x7f, 0x73, 0x6f, 0x7d, 0x70, 0x1b, + 0x75, 0x75, 0x94, 0x94, 0x75, 0x1f, 0x94, 0x74, 0x74, 0x98, 0x70, 0x1b, + 0x7c, 0x7a, 0x8c, 0x86, 0x7a, 0x1f, 0x13, 0x3c, 0xa9, 0x9a, 0x8d, 0x8b, + 0x95, 0x95, 0x8, 0xf7, 0x5f, 0x8a, 0xf7, 0x12, 0xf7, 0x4a, 0xf7, 0x64, + 0x1a, 0xf7, 0x1, 0x5e, 0xf1, 0xfb, 0x33, 0xfb, 0x4f, 0xfb, 0x1f, 0xfb, + 0x5d, 0xfb, 0x4c, 0x23, 0xbd, 0x3e, 0xeb, 0x6e, 0x1e, 0x6a, 0x70, 0x6a, + 0x7a, 0x66, 0x7a, 0x8, 0x9c, 0xf7, 0xa3, 0x15, 0xf7, 0x2b, 0xf7, 0x1, + 0xf7, 0x47, 0xf7, 0x25, 0xf1, 0xc2, 0x4c, 0x36, 0xfb, 0x60, 0xfb, 0x26, + 0xfb, 0x1e, 0xfb, 0x0, 0x40, 0x39, 0xb0, 0xf7, 0xf, 0x1e, 0xe, 0x8b, + 0xc1, 0xf7, 0x45, 0xbf, 0xf7, 0x75, 0xc1, 0x1, 0xf7, 0x4, 0xc2, 0xf7, + 0xf9, 0xc3, 0x3, 0x9f, 0x16, 0xf7, 0x6c, 0x2a, 0xa, 0x3b, 0x6, 0xae, + 0xf7, 0x43, 0x5, 0xf7, 0x7, 0x6, 0xa8, 0x5c, 0xcc, 0xfb, 0x6, 0xa4, + 0x47, 0x8, 0xf7, 0x18, 0x2a, 0xa, 0x24, 0x6, 0x73, 0xc1, 0x60, 0xd6, + 0x6d, 0xbb, 0x8, 0xe5, 0x8e, 0xf7, 0x3, 0xb6, 0xf7, 0x33, 0x1a, 0xcb, + 0x59, 0xc9, 0x29, 0x1e, 0xfb, 0xbf, 0x2d, 0xa, 0xdc, 0x5e, 0xa, 0x3a, + 0x6, 0xf7, 0x4a, 0xf7, 0x79, 0x15, 0xb8, 0xf7, 0x75, 0x5, 0xf7, 0x24, + 0x6, 0xd6, 0xba, 0x6c, 0x60, 0xfb, 0x26, 0xfb, 0x1c, 0x86, 0x42, 0x1f, + 0xe, 0x77, 0xc5, 0xf8, 0x7b, 0xc2, 0x1, 0xf7, 0xc, 0xc7, 0xf7, 0xbc, + 0xc7, 0x3, 0x98, 0x7f, 0x15, 0xc5, 0x6, 0x95, 0xbf, 0x5, 0x65, 0xc1, + 0xd6, 0x75, 0xd5, 0x1b, 0xf7, 0x8, 0xf7, 0x1c, 0xbe, 0xf7, 0x5, 0xf7, + 0x5, 0x2d, 0x9f, 0x31, 0x95, 0x1f, 0x3d, 0x93, 0x2d, 0xaa, 0xcf, 0x1a, + 0xdf, 0xe3, 0xba, 0xf2, 0xc3, 0xbc, 0x6f, 0x68, 0xab, 0x1e, 0x7a, 0x3b, + 0x5, 0xc5, 0x6, 0xb1, 0xf7, 0x4f, 0x62, 0xa, 0x82, 0x63, 0x5, 0xa6, + 0x68, 0x58, 0xa3, 0x54, 0x1b, 0xfb, 0x3a, 0x2d, 0x3a, 0x20, 0xfb, 0x6, + 0xf7, 0xd, 0x6d, 0xe5, 0x7d, 0x1f, 0xc8, 0x80, 0xdf, 0x82, 0x43, 0x1a, + 0x47, 0x24, 0x67, 0x2f, 0x42, 0x41, 0xa1, 0xb5, 0x63, 0x1e, 0x9a, 0xd0, + 0x5, 0x50, 0x6, 0xe, 0x3e, 0xa, 0xf7, 0x54, 0xc2, 0x3, 0xc5, 0x16, + 0xf7, 0xc2, 0x2a, 0xa, 0xfb, 0x10, 0x6, 0xe5, 0x87, 0xa, 0xf7, 0x43, + 0x6, 0x6d, 0xfb, 0x2d, 0x6a, 0xa, 0xb4, 0xf7, 0x63, 0x5, 0xfc, 0x98, + 0x6, 0x62, 0xfb, 0x63, 0x6a, 0xa, 0xa9, 0xf7, 0x2d, 0x5, 0xf7, 0x43, + 0x6, 0x32, 0x58, 0xa, 0xfb, 0xf, 0x6, 0xe, 0x79, 0xbf, 0xf8, 0x6d, + 0xc2, 0x1, 0xd2, 0xc0, 0x3, 0xbf, 0xf8, 0x8f, 0x85, 0xa, 0x56, 0xfb, + 0x8c, 0x81, 0x46, 0x68, 0x1a, 0x22, 0xb3, 0x47, 0xf7, 0x16, 0xf7, 0x11, + 0xe2, 0xc4, 0xf7, 0x2d, 0xa8, 0x1e, 0x9f, 0xf4, 0x9e, 0xf4, 0x9f, 0xf4, + 0x8, 0xd8, 0x36, 0xa, 0xfb, 0x7c, 0x67, 0xa, 0xad, 0xae, 0x8b, 0xad, + 0x1b, 0x77, 0x22, 0x78, 0x23, 0x77, 0x22, 0x8, 0xfb, 0xe, 0x73, 0x3c, + 0x66, 0x3d, 0x1b, 0x32, 0x66, 0xb7, 0xdb, 0xbf, 0xb4, 0xf7, 0x49, 0x9f, + 0xf7, 0x8, 0x1f, 0xf5, 0x36, 0xa, 0xfb, 0x83, 0x6, 0xe, 0x93, 0x76, + 0xf8, 0x9c, 0xc2, 0x1, 0xf7, 0x31, 0x7e, 0x85, 0xa, 0xf7, 0xbb, 0xf8, + 0x9c, 0x5, 0xcb, 0x36, 0xa, 0xfb, 0x70, 0x38, 0xa, 0xe5, 0x6, 0xfb, + 0x99, 0xfc, 0x64, 0x3a, 0xf8, 0x64, 0x5, 0xe6, 0x46, 0xa, 0xfb, 0x77, + 0x38, 0xa, 0xd3, 0x6, 0xe, 0x93, 0x76, 0xf8, 0x9c, 0xc2, 0x1, 0xb1, + 0xc5, 0x3, 0x9c, 0x7e, 0x15, 0xcb, 0x6, 0xf7, 0x4b, 0xf8, 0x0, 0xbe, + 0xfc, 0x0, 0x5, 0xc6, 0x6, 0xf7, 0x32, 0xf8, 0x9c, 0x5, 0xb7, 0x46, + 0xa, 0xfb, 0x5d, 0x56, 0xa, 0xf2, 0x6, 0xfb, 0xe, 0xfc, 0x36, 0x58, + 0xf8, 0x0, 0x5, 0x63, 0x6, 0xfb, 0x4f, 0xfc, 0x2, 0xaf, 0xf8, 0x38, + 0x5, 0xef, 0x36, 0xa, 0xfb, 0x5d, 0x56, 0xa, 0xba, 0x6, 0xe, 0x3e, + 0xa, 0x71, 0xf7, 0x76, 0xf7, 0x9, 0xf7, 0x6a, 0x3, 0x71, 0x16, 0xf7, + 0x76, 0x2a, 0xa, 0x2b, 0x6, 0xf7, 0x53, 0xf7, 0x50, 0xf7, 0x0, 0xfb, + 0x50, 0x5, 0x35, 0x2d, 0xa, 0xf7, 0x6a, 0x2a, 0xa, 0x4a, 0x6, 0xfb, + 0x18, 0xf7, 0x7b, 0xf7, 0x5f, 0xf7, 0x73, 0x5, 0xce, 0x2a, 0xa, 0xfb, + 0x55, 0x2d, 0xa, 0xca, 0x6, 0xfb, 0x37, 0xfb, 0x49, 0x2c, 0xf7, 0x49, + 0x5, 0xd8, 0x2a, 0xa, 0xfb, 0x64, 0x45, 0xa, 0xcf, 0x6, 0xf7, 0x9, + 0xfb, 0x73, 0xfb, 0x79, 0xfb, 0x7b, 0x5, 0x49, 0x6, 0xe, 0x3e, 0xa, + 0xb4, 0x16, 0xf7, 0xc8, 0x2a, 0xa, 0xfb, 0x11, 0x6, 0xab, 0xf7, 0x42, + 0xf7, 0x7f, 0xf7, 0xac, 0x5, 0xcf, 0x2a, 0xa, 0xfb, 0x5b, 0x2d, 0xa, + 0xd2, 0x6, 0xfb, 0x54, 0xfb, 0x77, 0x27, 0xf7, 0x77, 0x5, 0xd3, 0x43, + 0xa, 0xd1, 0x6, 0xf7, 0xe, 0xfb, 0xac, 0x6b, 0xfb, 0x42, 0x5, 0xfb, + 0x12, 0x6, 0xe, 0x3e, 0xa, 0xba, 0xd3, 0xf7, 0xda, 0xc0, 0x3, 0xb1, + 0x16, 0xf8, 0x38, 0x6, 0xb3, 0xf7, 0x5f, 0x5, 0x56, 0x6, 0x6e, 0xfb, + 0x29, 0x5, 0xfb, 0xbd, 0x6, 0xf8, 0x46, 0xf8, 0x5d, 0x94, 0xbe, 0x5, + 0xfc, 0x19, 0x6, 0x66, 0xfb, 0x50, 0x5, 0xbe, 0x6, 0xa5, 0xf7, 0x1a, + 0x5, 0xf7, 0xa0, 0x6, 0xfc, 0x46, 0xfc, 0x5b, 0x5, 0xe, 0xfb, 0x0, + 0xc1, 0xf9, 0x2, 0xc1, 0x1, 0xf7, 0x1c, 0xfb, 0x0, 0x15, 0xf7, 0x4e, + 0x2a, 0xa, 0xfb, 0x19, 0x6, 0xf7, 0xc, 0xf9, 0x2, 0x5, 0xf7, 0x19, + 0x2a, 0xa, 0xfb, 0x4e, 0x6, 0xe, 0x23, 0xf9, 0x60, 0xfd, 0x33, 0x76, + 0xf9, 0x59, 0x77, 0x12, 0x13, 0x60, 0xf8, 0xb, 0xfb, 0xd, 0x15, 0x13, + 0x80, 0xba, 0x9c, 0x5, 0x13, 0x60, 0xfb, 0x5a, 0xf9, 0x71, 0x5, 0x13, + 0x80, 0x5c, 0x7a, 0x5, 0xe, 0xfb, 0x0, 0xc1, 0xf9, 0x2, 0xc1, 0x1, + 0xf7, 0x27, 0x55, 0x15, 0x80, 0x55, 0x5, 0xf7, 0x4e, 0x6, 0xf7, 0x22, + 0xf9, 0x6e, 0x5, 0xfb, 0x4e, 0x2d, 0xa, 0xf7, 0x19, 0x6, 0xfb, 0xc, + 0xfd, 0x2, 0x5, 0xe, 0xf7, 0xf7, 0xf7, 0x9f, 0x12, 0xf2, 0xf8, 0x27, + 0x17, 0xe9, 0xf7, 0xf6, 0x15, 0xdc, 0xa6, 0xe1, 0xc6, 0xce, 0xc4, 0xb9, + 0x4f, 0xc1, 0x53, 0xd0, 0x71, 0x94, 0xba, 0x18, 0x3b, 0xd7, 0x7c, 0xb8, + 0x78, 0xee, 0x8, 0x58, 0x6, 0x13, 0x40, 0x58, 0x2d, 0x3c, 0x54, 0xfb, + 0x0, 0x43, 0x8, 0xe, 0xfb, 0x11, 0xbd, 0x1, 0x90, 0x40, 0x15, 0x81, + 0x59, 0x5, 0xf8, 0xed, 0x6, 0x95, 0xbd, 0x5, 0xe, 0x65, 0xa, 0xf7, + 0x61, 0xf8, 0xeb, 0x15, 0xf7, 0x46, 0x25, 0x97, 0xaa, 0xfb, 0x31, 0x79, + 0xa, 0xf8, 0x20, 0x87, 0x15, 0xf7, 0x1f, 0x36, 0xa, 0x36, 0x6, 0xbf, + 0xf7, 0x97, 0x8b, 0x9e, 0x9b, 0x1a, 0xc7, 0x5a, 0xaf, 0x25, 0x46, 0x36, + 0x77, 0x73, 0x4b, 0x1e, 0x39, 0xa, 0xc8, 0xc1, 0x8c, 0x54, 0x77, 0x87, + 0x5c, 0x85, 0x73, 0x1f, 0x92, 0x5f, 0x5a, 0x92, 0x5a, 0x1b, 0xfb, 0x45, + 0x41, 0x38, 0x3f, 0x52, 0xb9, 0x56, 0xe6, 0xd8, 0xda, 0xaf, 0xc0, 0xcd, + 0x1f, 0x98, 0xd2, 0x15, 0x50, 0x4b, 0x3e, 0x5d, 0x38, 0x1b, 0x56, 0x66, + 0xa8, 0xab, 0xdb, 0xf7, 0x7, 0x9c, 0xdb, 0x40, 0xa, 0x7c, 0xc2, 0x5f, + 0xc3, 0xf7, 0xe8, 0xc3, 0xf7, 0x12, 0xc2, 0x12, 0xf8, 0xb0, 0xc5, 0x13, + 0x78, 0x8d, 0x87, 0x15, 0xf7, 0x21, 0x6, 0x9a, 0xdb, 0x5, 0x13, 0xb8, + 0x7b, 0x96, 0xa8, 0x40, 0xf7, 0x14, 0x1b, 0xf7, 0x33, 0xf7, 0x5, 0xf7, + 0x18, 0xf7, 0x2f, 0xf7, 0x7, 0x32, 0xc8, 0x30, 0xfb, 0x1, 0x46, 0x56, + 0x72, 0x75, 0x1f, 0xbe, 0xf7, 0x97, 0x66, 0xa, 0xe0, 0x6, 0x13, 0x78, + 0x24, 0xfc, 0x9e, 0x5, 0x35, 0x6, 0xf7, 0x48, 0xf7, 0x45, 0x15, 0xf5, + 0xa0, 0xed, 0xc4, 0xe4, 0x1b, 0xea, 0xb7, 0x4c, 0x48, 0x1f, 0x13, 0xb8, + 0xfb, 0xe, 0xfb, 0x1, 0x27, 0x26, 0x3a, 0x3a, 0xcb, 0xf7, 0x11, 0xa4, + 0x1e, 0xe, 0x7c, 0xc0, 0xf7, 0xf0, 0xc2, 0x12, 0xbc, 0xc5, 0xf7, 0xf5, + 0xc2, 0x17, 0xf8, 0x71, 0xf7, 0x9, 0x15, 0x76, 0x6d, 0x31, 0x51, 0x3a, + 0x1b, 0xfb, 0xe, 0x5c, 0xcd, 0xc8, 0x1f, 0x13, 0x50, 0xf7, 0x5, 0xe8, + 0xf7, 0x0, 0xf7, 0x17, 0xc4, 0xbe, 0x7c, 0x67, 0xaf, 0x1e, 0x7c, 0x3c, + 0x6a, 0xa, 0x13, 0xe0, 0xaf, 0xf7, 0x4d, 0x52, 0xa, 0x82, 0x5c, 0x5, + 0xa9, 0x63, 0x5d, 0x9c, 0x51, 0x1b, 0xfb, 0x5b, 0x2c, 0xfb, 0x29, 0xfb, + 0x15, 0xfb, 0x5, 0xe5, 0x4a, 0xf7, 0x2, 0xe8, 0xd8, 0xab, 0xb9, 0xd0, + 0x1f, 0xe, 0x7c, 0xc2, 0x61, 0xc2, 0xf7, 0xe7, 0xc2, 0xf7, 0x13, 0xc2, + 0x12, 0xa1, 0xc5, 0x13, 0x78, 0xf8, 0x1f, 0x89, 0x15, 0xf7, 0x1f, 0x36, + 0xa, 0x39, 0x6, 0xf7, 0x6, 0xf8, 0xd4, 0x5, 0xfb, 0x58, 0x38, 0xa, + 0xf7, 0x20, 0x6, 0x65, 0xfb, 0x57, 0x5, 0xc9, 0x64, 0x46, 0x91, 0x54, + 0x1b, 0xfb, 0x33, 0xfb, 0x14, 0xfb, 0x16, 0xfb, 0x2c, 0x1f, 0x13, 0xb8, + 0x2a, 0xca, 0x38, 0xf7, 0x14, 0xd4, 0xd8, 0xac, 0xc9, 0xbb, 0x1e, 0x13, + 0x78, 0xfb, 0xdf, 0xf7, 0x0, 0x15, 0xf4, 0xf3, 0xee, 0xf7, 0x3, 0xf7, + 0x0, 0xb2, 0x53, 0x52, 0x1e, 0x13, 0xb8, 0xfb, 0xd, 0xfb, 0x1, 0xfb, + 0xa, 0xfb, 0x0, 0x26, 0x5f, 0xd1, 0xd9, 0x1e, 0xe, 0x7c, 0xc0, 0xf7, + 0x31, 0xc2, 0xf7, 0x21, 0xbd, 0x1, 0xe4, 0xf7, 0x57, 0x15, 0xf8, 0x3b, + 0x6, 0x90, 0xa4, 0x8d, 0xa4, 0x8a, 0xa3, 0x8, 0xea, 0x88, 0x51, 0xd8, + 0xfb, 0x17, 0x1b, 0xfb, 0x35, 0xfb, 0x1e, 0xfb, 0x19, 0xfb, 0x3d, 0x35, + 0xd3, 0x47, 0xf7, 0x21, 0xde, 0xe5, 0xa5, 0xaf, 0xd4, 0x1f, 0x84, 0xbf, + 0x5, 0x60, 0x32, 0x38, 0x79, 0x5c, 0x1b, 0xfb, 0x7, 0x30, 0xc0, 0xf3, + 0xae, 0x1f, 0x9c, 0xc3, 0x15, 0xc6, 0x9f, 0xda, 0xdc, 0xf7, 0x7, 0x1b, + 0xf7, 0x21, 0x92, 0xfb, 0x8, 0x72, 0x86, 0x1f, 0xe, 0x8b, 0xc2, 0xf7, + 0xd9, 0xc3, 0xf7, 0x1e, 0xc2, 0x1, 0xf7, 0x26, 0xc5, 0x3, 0xa5, 0x16, + 0xf8, 0x18, 0x36, 0xa, 0xfb, 0x71, 0x6, 0xcb, 0xf7, 0xd9, 0x5, 0xf7, + 0x71, 0x3c, 0xa, 0xfb, 0x71, 0x6, 0xf7, 0x11, 0xab, 0x87, 0x98, 0xf7, + 0x9, 0x1b, 0xb2, 0xc3, 0x85, 0x85, 0xaf, 0x1f, 0x9e, 0xc1, 0x5, 0x90, + 0x6a, 0x49, 0x93, 0x61, 0x1b, 0x3d, 0x31, 0x82, 0x3f, 0x79, 0x1f, 0x71, + 0xfb, 0x0, 0x5, 0xfb, 0x1, 0x6, 0x81, 0x53, 0x5, 0xf7, 0x1, 0x6, + 0x4a, 0xfb, 0xd9, 0x57, 0xa, 0xe, 0xfb, 0x31, 0xbd, 0xf7, 0x38, 0xbe, + 0xf7, 0xae, 0xbe, 0x1, 0xab, 0xc3, 0xf7, 0xca, 0xbf, 0x3, 0x3f, 0xa, + 0x30, 0xa, 0xe, 0x8b, 0xc2, 0xf7, 0xca, 0xc2, 0xf7, 0x2e, 0xc2, 0x1, + 0x9f, 0x16, 0xf7, 0x72, 0x36, 0xa, 0x38, 0x6, 0xbf, 0xf7, 0x99, 0x5, + 0xb6, 0xc3, 0xd2, 0xb7, 0xcc, 0x1b, 0xdf, 0x90, 0x59, 0x54, 0x81, 0x1f, + 0x5a, 0xfb, 0x87, 0x5, 0x37, 0x38, 0xa, 0xf7, 0x6f, 0x36, 0xa, 0x3a, + 0x6, 0xc0, 0xf7, 0x9d, 0x5, 0xca, 0x97, 0x85, 0xd6, 0xfb, 0xa, 0x1b, + 0x45, 0x40, 0x66, 0x5e, 0x4f, 0x1f, 0xba, 0xf7, 0x91, 0x66, 0xa, 0xe2, + 0x6, 0x25, 0xfc, 0x9b, 0x7b, 0xa, 0xe, 0x8b, 0xc2, 0xf7, 0xda, 0xc2, + 0xed, 0xf7, 0xf, 0x1, 0xf7, 0xe6, 0xf8, 0xaa, 0x15, 0xd1, 0x6, 0xa4, + 0xf7, 0xf, 0x5, 0x44, 0x6, 0xfb, 0xb8, 0xfd, 0x25, 0x15, 0xf8, 0x2d, + 0x36, 0xa, 0xfb, 0x42, 0x6, 0xd4, 0xf8, 0x11, 0x5, 0xfb, 0x5b, 0x38, + 0xa, 0xf7, 0x25, 0x6, 0x4b, 0xfb, 0xda, 0x5, 0xfb, 0x47, 0x6, 0xe, + 0xfb, 0x31, 0xc1, 0xf8, 0x84, 0xbf, 0xe9, 0xf7, 0xa, 0x1, 0xf8, 0x50, + 0xf8, 0xaf, 0x54, 0xa, 0xfc, 0x23, 0xfd, 0x80, 0x15, 0x76, 0x59, 0x5, + 0x82, 0xbe, 0xbe, 0x84, 0xbb, 0x1b, 0xf6, 0xe0, 0xb6, 0xf7, 0x12, 0xaf, + 0x1f, 0xea, 0xf8, 0x45, 0x5, 0xfb, 0xe2, 0x82, 0xa, 0xf7, 0xa5, 0x6, + 0x39, 0xfc, 0x3, 0x5, 0xfb, 0x9, 0x61, 0x46, 0x7f, 0x5c, 0x1b, 0x51, + 0x5c, 0x91, 0x91, 0x68, 0x1f, 0xe, 0x8b, 0xc2, 0xf7, 0xd9, 0xc2, 0xf7, + 0x1f, 0xc2, 0x1, 0x97, 0x16, 0xf7, 0x20, 0x6, 0xb1, 0xf7, 0x5a, 0xcd, + 0xb5, 0xad, 0x6a, 0xcd, 0x31, 0xb0, 0x4d, 0x19, 0x53, 0x38, 0xa, 0xf7, + 0x6a, 0x46, 0xa, 0x2b, 0x6, 0x6d, 0xba, 0x6d, 0xc5, 0x67, 0xb3, 0x4f, + 0xcf, 0x18, 0xf7, 0x47, 0xf7, 0x4, 0x5, 0xed, 0x77, 0xa, 0xfb, 0x70, + 0x6, 0x82, 0x54, 0x5, 0xb9, 0x6, 0xfb, 0x5f, 0xfb, 0x13, 0xd5, 0xf8, + 0xc, 0x66, 0xa, 0xe1, 0x6, 0x26, 0xfc, 0x9b, 0x5, 0x36, 0x6, 0xe, + 0x8b, 0xc2, 0xf8, 0x9b, 0xc2, 0x1, 0xe5, 0x16, 0xf8, 0x2d, 0x36, 0xa, + 0xfb, 0x43, 0x6, 0xf7, 0x1, 0xf8, 0xd2, 0x5, 0xfb, 0x6b, 0x38, 0xa, + 0xf7, 0x34, 0x6, 0x29, 0xfc, 0x9b, 0x5, 0xfb, 0x47, 0x6, 0xe, 0x8b, + 0xc1, 0xf7, 0xe0, 0xc2, 0x7e, 0x77, 0x12, 0x13, 0xc0, 0x91, 0x16, 0xf7, + 0x11, 0x47, 0xa, 0x49, 0x6, 0xc5, 0xf7, 0xa2, 0x5, 0xa7, 0xa6, 0xac, + 0xad, 0xbb, 0x1b, 0xbc, 0x96, 0x6d, 0x72, 0x7d, 0x88, 0x7f, 0x8a, 0x87, + 0x1f, 0x4c, 0xfb, 0xc1, 0x5, 0xf7, 0x12, 0x2a, 0xa, 0x49, 0x6, 0xc2, + 0xf7, 0x97, 0x5, 0x96, 0x8d, 0xca, 0xcb, 0xc0, 0x1b, 0xb3, 0x97, 0x77, + 0x72, 0x78, 0x86, 0x74, 0x87, 0x78, 0x1f, 0x50, 0xfb, 0xae, 0x5, 0xf7, + 0x7, 0x2a, 0xa, 0x53, 0x6, 0xc5, 0xf7, 0xa5, 0x8d, 0x9b, 0x99, 0x1a, + 0xba, 0x6d, 0xb0, 0x4c, 0x55, 0x5a, 0x69, 0x67, 0x66, 0x1e, 0xb0, 0x83, + 0x6e, 0xac, 0x55, 0x1b, 0x5b, 0x64, 0x69, 0x74, 0x68, 0x1f, 0x13, 0xa0, + 0x93, 0xb7, 0x5, 0xfb, 0x7, 0x5f, 0xa, 0xc3, 0x6, 0xe, 0x8b, 0xc1, + 0xf7, 0xc8, 0xc2, 0x6d, 0xc1, 0x12, 0xf7, 0x7, 0xc1, 0xf7, 0xa5, 0xc1, + 0x13, 0xd8, 0x9f, 0x16, 0xf7, 0x72, 0x2a, 0xa, 0x37, 0x6, 0xbb, 0xf7, + 0x86, 0x5, 0x13, 0xb8, 0xbf, 0xc9, 0xe1, 0xb2, 0xd6, 0x1b, 0xb5, 0x97, + 0x79, 0x6a, 0x82, 0x8a, 0x81, 0x89, 0x80, 0x1f, 0x5a, 0xfb, 0x90, 0x5, + 0x38, 0x2d, 0xa, 0xf7, 0x70, 0x2a, 0xa, 0x38, 0x6, 0xbd, 0xf7, 0x91, + 0x5, 0x8f, 0x9e, 0x8c, 0x9c, 0x9b, 0x1a, 0xbf, 0x62, 0xa9, 0x40, 0x45, + 0x3f, 0x63, 0x5e, 0x4f, 0x1e, 0x99, 0xd3, 0x5, 0xfb, 0x1e, 0x38, 0xa, + 0xde, 0x6, 0x4d, 0xfb, 0xd3, 0x5, 0x37, 0x6, 0xe, 0x7c, 0xc1, 0xf7, + 0xf0, 0xc1, 0x1, 0xc4, 0xc2, 0xf8, 0xb, 0xc3, 0x3, 0xc4, 0xf7, 0x3b, + 0x15, 0xfb, 0x0, 0xd5, 0x41, 0xf7, 0x17, 0xf7, 0x39, 0xf7, 0x8, 0xf7, + 0x13, 0xf7, 0x2c, 0xde, 0x5d, 0xe9, 0xfb, 0x2b, 0xfb, 0x28, 0xfb, 0x21, + 0xfb, 0x2, 0xfb, 0x38, 0x1e, 0xc2, 0x92, 0x15, 0xf7, 0x1, 0xea, 0xf3, + 0xf7, 0x14, 0xf7, 0xd, 0xaa, 0x40, 0x51, 0xfb, 0x9, 0x2b, 0x29, 0xfb, + 0xc, 0xfb, 0x1, 0x59, 0xcd, 0xd0, 0x1e, 0xe, 0xfb, 0x31, 0xbe, 0xf7, + 0xa, 0xbf, 0xf7, 0xc5, 0xbf, 0x6a, 0xc0, 0x12, 0xf8, 0x90, 0xc4, 0x13, + 0xd8, 0x6a, 0x21, 0x15, 0x80, 0x58, 0x5, 0xf7, 0xbb, 0x78, 0xa, 0xfb, + 0x30, 0x6, 0xb2, 0xf7, 0x4d, 0x5, 0x65, 0xa3, 0xbd, 0x6e, 0xe7, 0x1b, + 0xf7, 0x20, 0xf7, 0x6, 0xf7, 0xa, 0xf7, 0x27, 0xe7, 0x4d, 0xd3, 0x21, + 0x33, 0x50, 0x60, 0x5f, 0x5d, 0x1f, 0x13, 0xe8, 0x9a, 0xce, 0x5, 0xfb, + 0x1f, 0x6, 0x81, 0x57, 0x5, 0xdf, 0x6, 0x25, 0xfc, 0x6f, 0x5, 0xf7, + 0xb, 0xf7, 0xb2, 0x15, 0x13, 0xd8, 0xed, 0xe5, 0xf7, 0x2, 0xf7, 0xe, + 0xf3, 0xa0, 0x4d, 0x55, 0xfb, 0xe, 0x2b, 0x35, 0x2d, 0x37, 0x4c, 0xb2, + 0xd8, 0x1e, 0xe, 0xfb, 0x31, 0xbf, 0xf7, 0xb, 0xbe, 0xf7, 0xcd, 0xbe, + 0x63, 0xbf, 0x12, 0xb4, 0xc4, 0x13, 0xe8, 0xf7, 0x6b, 0x22, 0x15, 0x80, + 0x57, 0x5, 0xf7, 0xbf, 0x6, 0x96, 0xbf, 0x5, 0x35, 0x6, 0xf4, 0xf8, + 0x77, 0x5, 0xe0, 0x6, 0x95, 0xbe, 0x5, 0xfb, 0x20, 0x6, 0x78, 0x42, + 0x5, 0x13, 0xd8, 0xb2, 0x75, 0x53, 0xb9, 0x36, 0x1b, 0xfb, 0x1b, 0xfb, + 0x16, 0xfb, 0x6, 0xfb, 0x24, 0x27, 0xcc, 0x46, 0xf7, 0x2, 0xcb, 0xd2, + 0x98, 0xc1, 0xc7, 0x1f, 0x65, 0xfb, 0x4e, 0x5, 0xfb, 0xa7, 0xf7, 0xbf, + 0x15, 0xd3, 0xbc, 0xf7, 0xf, 0xf7, 0x2a, 0xef, 0xba, 0x49, 0x3f, 0xfb, + 0xb, 0xfb, 0x12, 0x4c, 0x32, 0x40, 0x53, 0xbb, 0xdc, 0x1e, 0xe, 0x8b, + 0xc1, 0xf7, 0xe2, 0xc1, 0x1, 0xf7, 0x32, 0xc4, 0x3, 0x9f, 0x16, 0xf7, + 0xfe, 0x2a, 0xa, 0xfb, 0x46, 0x6, 0xb4, 0xf7, 0x64, 0x5, 0xf2, 0xf7, + 0x18, 0xbc, 0xa2, 0xc1, 0x1b, 0xa4, 0xa0, 0x85, 0x69, 0x8c, 0x1f, 0xc4, + 0x90, 0x5, 0xbe, 0x8c, 0x79, 0xb0, 0x51, 0x1b, 0x2a, 0x3e, 0x4c, 0x54, + 0x3f, 0x1f, 0x9f, 0xf4, 0x5, 0xfb, 0x4c, 0x5f, 0xa, 0xf7, 0x13, 0x6, + 0x4a, 0xfb, 0xd4, 0x5, 0xfb, 0x13, 0x6, 0xe, 0x7c, 0xc1, 0xf7, 0xf0, + 0xc1, 0x1, 0xf7, 0xa, 0xca, 0xf7, 0xaa, 0xc5, 0x3, 0xba, 0x7c, 0x15, + 0xc4, 0x3c, 0xa, 0x72, 0xb2, 0xbe, 0x6c, 0xdd, 0x1b, 0xf7, 0x10, 0xf5, + 0xba, 0xf3, 0xcc, 0x52, 0xa5, 0x53, 0x94, 0x1f, 0x54, 0x94, 0xfb, 0x3c, + 0x9c, 0xbf, 0x1a, 0xd8, 0xea, 0x87, 0xbf, 0xc4, 0xbf, 0x71, 0x70, 0xb1, + 0x1e, 0x81, 0x5a, 0x51, 0xa, 0xab, 0xf7, 0x30, 0x71, 0xa, 0x80, 0x5b, + 0x5, 0xa5, 0x62, 0x58, 0xa1, 0x51, 0x1b, 0xfb, 0x19, 0x36, 0x67, 0x2a, + 0x42, 0xf7, 0x21, 0x60, 0xd6, 0x85, 0x1f, 0xb9, 0x87, 0xda, 0x83, 0x5b, + 0x1a, 0x30, 0xfb, 0x19, 0x8f, 0x62, 0x4a, 0x50, 0xa8, 0xb2, 0x6a, 0x1e, + 0x95, 0xbb, 0x62, 0xa, 0xe, 0x7c, 0xc2, 0xf7, 0xe4, 0xc2, 0xf7, 0x16, + 0x77, 0x1, 0xf7, 0x17, 0xc6, 0x3, 0xf7, 0x5, 0xf8, 0xc, 0x15, 0xd4, + 0x6, 0x54, 0xfb, 0xa7, 0x8b, 0x7f, 0x7f, 0x1a, 0x3d, 0x8c, 0xe9, 0x7d, + 0xb9, 0x1b, 0xd8, 0xdd, 0xa8, 0xa6, 0xd2, 0x1f, 0x8f, 0xc1, 0x5, 0x77, + 0x51, 0x37, 0x68, 0x45, 0x1b, 0x51, 0x5d, 0x92, 0xc7, 0x1f, 0xbf, 0xf7, + 0xa1, 0x5, 0xf7, 0x93, 0x77, 0xa, 0xfb, 0x93, 0x6, 0xa5, 0xf7, 0x16, + 0x71, 0xa, 0x71, 0xfb, 0x16, 0x5, 0x42, 0x6, 0xe, 0x7c, 0xc0, 0x63, + 0xc1, 0xf7, 0xd4, 0xc1, 0x12, 0x13, 0xa0, 0xcb, 0xf8, 0x8, 0x85, 0xa, + 0x58, 0xfb, 0x96, 0x8a, 0x80, 0x81, 0x1a, 0x45, 0xc2, 0x65, 0xd7, 0xb2, + 0xc0, 0x9c, 0xd2, 0xe3, 0x1e, 0x13, 0x60, 0x7c, 0x40, 0x5, 0xf7, 0x1a, + 0x2a, 0xa, 0x3a, 0x6, 0xd3, 0xf8, 0xa, 0x55, 0xa, 0x82, 0x55, 0x5, + 0xdc, 0x6, 0x5e, 0xfb, 0x7a, 0x5, 0x13, 0xa0, 0x59, 0x5b, 0x4d, 0x55, + 0x4d, 0x1b, 0x56, 0x62, 0xa1, 0xb2, 0x90, 0x8b, 0x90, 0x8c, 0x90, 0x1f, + 0x9e, 0xf3, 0x9d, 0xf3, 0x9e, 0xf3, 0x8, 0xfb, 0x1b, 0x6, 0xe, 0x96, + 0x76, 0xf8, 0x11, 0xc2, 0x1, 0xf7, 0x52, 0x81, 0x15, 0xcc, 0x6, 0xf7, + 0x8d, 0xf8, 0x11, 0x5, 0xdc, 0x77, 0xa, 0xfb, 0x6a, 0x67, 0xa, 0xd5, + 0x6, 0xfb, 0x68, 0xfb, 0xd7, 0x38, 0xf7, 0xd7, 0x5, 0xd7, 0x77, 0xa, + 0xfb, 0x72, 0x67, 0xa, 0xe2, 0x6, 0xe, 0x96, 0x76, 0xf8, 0x11, 0xc2, + 0x1, 0xcb, 0xc0, 0x3, 0xdc, 0x81, 0x15, 0xcb, 0x6, 0xf7, 0x11, 0xf7, + 0x9b, 0xaa, 0xfb, 0x9b, 0x5, 0xc8, 0x6, 0xf7, 0x44, 0xf8, 0x11, 0x5, + 0xb0, 0x77, 0xa, 0xfb, 0x32, 0x38, 0xa, 0xd3, 0x6, 0xfb, 0x23, 0xfb, + 0xc5, 0x6b, 0xf7, 0xb2, 0x5, 0x5b, 0x6, 0xfb, 0x1b, 0xfb, 0xb0, 0x71, + 0xf7, 0xc3, 0x5, 0xd4, 0x6, 0x94, 0xc2, 0x5, 0xfb, 0x36, 0x67, 0xa, + 0xac, 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd3, 0xc0, 0x1, 0x7a, 0x16, 0xf7, + 0x68, 0x47, 0xa, 0x48, 0x6, 0xf7, 0x3b, 0xf7, 0x16, 0xf7, 0x2, 0xfb, + 0x16, 0x5, 0x4c, 0x2d, 0xa, 0xf7, 0x69, 0x47, 0xa, 0x3b, 0x6, 0xfb, + 0x21, 0xf7, 0x38, 0xf7, 0x48, 0xf7, 0x2f, 0x5, 0xdc, 0x6, 0x95, 0xc0, + 0x5, 0xfb, 0x55, 0x68, 0xa, 0xb6, 0x6, 0xfb, 0x1f, 0xfb, 0xc, 0x30, + 0xf7, 0xc, 0x5, 0xbf, 0x6, 0x95, 0xc0, 0x5, 0xfb, 0x5e, 0x68, 0xa, + 0xdb, 0x6, 0xf7, 0xd, 0xfb, 0x2e, 0xfb, 0x64, 0xfb, 0x39, 0x5, 0x3e, + 0x6, 0xe, 0xfb, 0x31, 0xbe, 0xf8, 0x75, 0xbe, 0x1, 0x6c, 0x21, 0x15, + 0x7f, 0x58, 0x5, 0xf7, 0xa2, 0x78, 0xa, 0x32, 0x6, 0xf8, 0x35, 0xf8, + 0x75, 0x5, 0xce, 0x78, 0xa, 0xfb, 0x53, 0x6, 0x80, 0x58, 0x5, 0xc7, + 0x6, 0xfb, 0x7c, 0xfb, 0xa1, 0x21, 0xf7, 0xa1, 0x5, 0xce, 0x78, 0xa, + 0xfb, 0x5f, 0x6, 0x80, 0x58, 0x5, 0xd3, 0x6, 0xf7, 0x13, 0xfb, 0xd2, + 0xfb, 0x22, 0xfb, 0x37, 0x5, 0xe, 0x8b, 0xc1, 0xf7, 0xd2, 0xc1, 0x1, + 0xc0, 0x16, 0xf8, 0x2d, 0x6, 0xaa, 0xf7, 0x1a, 0x52, 0xa, 0x76, 0x3b, + 0x5, 0xfb, 0xa7, 0x6, 0xf8, 0x1f, 0xf7, 0xd6, 0x95, 0xbd, 0x5, 0xfc, + 0x1f, 0x6, 0x6b, 0xfb, 0x18, 0x5, 0xc1, 0x6, 0xa2, 0xd9, 0x5, 0xf7, + 0x98, 0x6, 0xfc, 0x1e, 0xfb, 0xd5, 0x5, 0xe, 0xfb, 0x70, 0xc0, 0xf9, + 0xf1, 0xc0, 0x1, 0xf7, 0x53, 0xba, 0x3, 0xf7, 0xa, 0xf7, 0x81, 0x15, + 0xbe, 0x73, 0x9e, 0x78, 0x8a, 0x53, 0x8, 0x74, 0x86, 0x6d, 0x82, 0x65, + 0x1e, 0x7a, 0x3b, 0x84, 0x55, 0x65, 0x1a, 0x4c, 0xb1, 0x7b, 0xe4, 0x7b, + 0x1e, 0x95, 0xc0, 0x5, 0x59, 0x93, 0x67, 0x96, 0xad, 0x1a, 0xa9, 0x92, + 0xbb, 0xa0, 0xde, 0x1e, 0x91, 0xa4, 0x8f, 0xb9, 0xb5, 0x1a, 0xb5, 0x7e, + 0xb4, 0x6e, 0xa1, 0x1e, 0xe6, 0xc2, 0xa1, 0xf7, 0x0, 0x92, 0xb9, 0x8, + 0xf7, 0x5f, 0xb0, 0xab, 0x9c, 0xdf, 0x1b, 0x97, 0xc0, 0x5, 0xfb, 0x23, + 0x74, 0x5d, 0xfb, 0x71, 0x59, 0x1f, 0x6f, 0xfb, 0x14, 0x72, 0x6e, 0x38, + 0x6a, 0x8, 0xe, 0xfb, 0x79, 0x76, 0xfa, 0x7c, 0x77, 0x1, 0xf7, 0x3c, + 0xbe, 0x3, 0xf7, 0x3c, 0xfb, 0x8e, 0x15, 0xbe, 0x6, 0xf7, 0x68, 0xfa, + 0x7c, 0x5, 0x58, 0x6, 0xe, 0xfb, 0x71, 0xc0, 0xf9, 0xf1, 0xc0, 0x1, + 0xf7, 0xaf, 0xbe, 0x3, 0xf8, 0x75, 0xf7, 0xb5, 0x15, 0x58, 0xa3, 0x78, + 0x9e, 0x8c, 0xc3, 0x8, 0xa2, 0x8f, 0xa9, 0x94, 0xb1, 0x1e, 0x9c, 0xdb, + 0x93, 0xc1, 0xb1, 0x1a, 0xca, 0x65, 0x9b, 0x32, 0x9b, 0x1e, 0x81, 0x56, + 0x5, 0xbd, 0x83, 0xaf, 0x80, 0x69, 0x1a, 0x6d, 0x81, 0x59, 0x7c, 0x3a, + 0x1e, 0x86, 0x72, 0x83, 0x5d, 0x61, 0x1a, 0x61, 0x98, 0x62, 0xa8, 0x75, + 0x1e, 0x30, 0x54, 0x75, 0xfb, 0x0, 0x84, 0x5d, 0x8, 0xfb, 0x5f, 0x66, + 0x6b, 0x7a, 0x37, 0x1b, 0x7f, 0x56, 0x5, 0xf7, 0x23, 0xa2, 0xb9, 0xf7, + 0x71, 0xbd, 0x1f, 0xa7, 0xf7, 0x14, 0xa4, 0xa8, 0xde, 0xac, 0x8, 0xe, + 0xf7, 0x59, 0xc8, 0x91, 0xc3, 0x12, 0xf0, 0xf7, 0x59, 0x15, 0xaa, 0xa7, + 0xaf, 0xaf, 0xb1, 0x1b, 0xb0, 0xa6, 0x78, 0x7a, 0xa7, 0x1f, 0x7b, 0xa4, + 0xa5, 0x7c, 0xae, 0x1b, 0xcd, 0xbf, 0xaf, 0xb7, 0xb6, 0x1f, 0x64, 0xb6, + 0x5, 0x77, 0x78, 0x4f, 0x61, 0x66, 0x1b, 0x6e, 0x77, 0x97, 0x99, 0x75, + 0x1f, 0x9c, 0x70, 0x6e, 0x9e, 0x53, 0x1b, 0x4b, 0x62, 0x5e, 0x67, 0x62, + 0x1f, 0xe, 0xfb, 0x1c, 0x76, 0xf8, 0x67, 0xf7, 0xc, 0x1, 0xf7, 0x9f, + 0xf7, 0x23, 0x3, 0xf7, 0x9f, 0xf7, 0xf8, 0x15, 0x71, 0xa7, 0x77, 0xa8, + 0xba, 0xb2, 0xae, 0xaf, 0xa5, 0x74, 0xa2, 0x66, 0x5b, 0x68, 0x69, 0x63, + 0x1e, 0x3e, 0xfc, 0x95, 0x85, 0xa, 0xc9, 0xf8, 0x1e, 0x5, 0x5d, 0x6, + 0xe, 0xe9, 0xc2, 0xf7, 0xa1, 0xc2, 0x1, 0xdc, 0xc4, 0xf7, 0x4f, 0xc2, + 0x3, 0xf7, 0x56, 0x5a, 0x15, 0xc2, 0x6, 0xa6, 0xf7, 0x23, 0xd3, 0x8f, + 0xc7, 0xa7, 0xc7, 0xad, 0x19, 0x85, 0xb9, 0x5, 0x6b, 0x50, 0x4b, 0x72, + 0x49, 0x1b, 0x29, 0x66, 0xc2, 0xbb, 0xe1, 0xdd, 0xdb, 0xf3, 0xb8, 0xc1, + 0x7b, 0x6c, 0x9d, 0x1f, 0x81, 0x59, 0x6a, 0xa, 0xab, 0xf7, 0x36, 0x5, + 0x55, 0x6, 0x81, 0x58, 0x6c, 0xa3, 0x6a, 0x99, 0x66, 0x8f, 0x19, 0xa6, + 0xf7, 0x20, 0x52, 0xa, 0x70, 0xfb, 0x21, 0x5, 0x34, 0x8a, 0xfb, 0x16, + 0x2c, 0xfb, 0x18, 0x1a, 0x2e, 0xcf, 0x58, 0xd3, 0x84, 0x1e, 0xe, 0x76, + 0xc5, 0xf7, 0x82, 0xc4, 0xf7, 0x71, 0xc5, 0x12, 0xf7, 0x33, 0xc1, 0x61, + 0xbf, 0x13, 0xe8, 0xbe, 0xaa, 0x15, 0x9b, 0x57, 0x5, 0xa1, 0xc0, 0xe0, + 0x93, 0x9b, 0x1b, 0xa1, 0x9d, 0x82, 0x83, 0xa0, 0x1f, 0x84, 0x9d, 0x9f, + 0x85, 0xa4, 0x53, 0xa, 0x74, 0x7b, 0x91, 0x92, 0x7b, 0x1f, 0x94, 0x77, + 0x79, 0x94, 0x70, 0x1b, 0x69, 0x67, 0x81, 0x7c, 0x69, 0x1f, 0x8e, 0x6, + 0xea, 0xe0, 0x8c, 0xc8, 0x8c, 0xe1, 0x8, 0xf7, 0x6e, 0x6, 0x96, 0xc4, + 0x5, 0xfb, 0x7f, 0x6, 0x13, 0xf0, 0x89, 0xa3, 0x88, 0xa5, 0x8c, 0xa5, + 0x8, 0x42, 0xa, 0x6c, 0x8f, 0x6d, 0x8d, 0x6e, 0x8, 0x2c, 0x6, 0x80, + 0x52, 0x5, 0x13, 0xe8, 0xf7, 0x5, 0x6, 0x23, 0x64, 0x3f, 0x3a, 0x4b, + 0x1e, 0xe, 0xd7, 0xb9, 0x60, 0x76, 0xf8, 0x14, 0xb9, 0x9d, 0x77, 0x12, + 0xe1, 0xbb, 0xf7, 0xdf, 0xbc, 0x13, 0x6c, 0xac, 0xeb, 0x15, 0xa9, 0x65, + 0xda, 0xc5, 0x5, 0x13, 0xac, 0x64, 0xb9, 0xb0, 0x8a, 0xac, 0x1b, 0xbd, + 0xbe, 0x9b, 0xa7, 0xb7, 0x1f, 0x13, 0x5c, 0xbe, 0x4d, 0xae, 0xa8, 0x58, + 0xcb, 0x5, 0xbe, 0xb3, 0xa4, 0xd6, 0xc1, 0x1a, 0x8c, 0xaf, 0x86, 0xa4, + 0x7a, 0xa5, 0xd5, 0xc9, 0x18, 0x6c, 0xb0, 0x42, 0x50, 0x5, 0x13, 0xac, + 0xa9, 0x6c, 0x62, 0x96, 0x5a, 0x1b, 0x59, 0x55, 0x7b, 0x6e, 0x61, 0x1f, + 0x13, 0x9c, 0x57, 0xca, 0x66, 0x6c, 0xc0, 0x4c, 0x5, 0x57, 0x51, 0x75, + 0x5d, 0x4c, 0x1a, 0x8a, 0x68, 0x92, 0x6e, 0x9c, 0x71, 0x8, 0xa4, 0xe4, + 0x15, 0x13, 0xac, 0xea, 0xe2, 0xf2, 0xf7, 0x3, 0xdb, 0xc0, 0x52, 0x48, + 0xfb, 0x4, 0x21, 0x37, 0x30, 0x3f, 0x51, 0xbe, 0xd2, 0x1e, 0xe, 0x8b, + 0xc1, 0xd9, 0xc1, 0xcf, 0xc2, 0xf7, 0x5b, 0xc1, 0x1, 0xc3, 0x16, 0xf7, + 0xa9, 0x2a, 0xa, 0xfb, 0x2, 0x6, 0x9a, 0xd9, 0x5, 0xf7, 0x18, 0x47, + 0xa, 0xfb, 0x19, 0x6, 0x98, 0xcf, 0x5, 0xf7, 0x19, 0x46, 0xa, 0xfb, + 0x12, 0x6, 0xf7, 0x5f, 0xf7, 0x5b, 0x5, 0xdb, 0x2a, 0xa, 0xfb, 0x64, + 0x2d, 0xa, 0xd0, 0x6, 0xfb, 0x45, 0xfb, 0x40, 0x22, 0xf7, 0x40, 0x5, + 0xcf, 0x2a, 0xa, 0xfb, 0x65, 0x2d, 0xa, 0xdc, 0x6, 0xf7, 0xe, 0xfb, + 0x5b, 0x5, 0xfb, 0xb, 0x38, 0xa, 0xf7, 0x17, 0x6, 0x7e, 0x47, 0x5, + 0xfb, 0x17, 0x45, 0xa, 0xf7, 0x18, 0x6, 0x7b, 0x3d, 0x5, 0xfb, 0x2, + 0x6, 0xe, 0xf7, 0x4c, 0xbc, 0x3, 0xf7, 0xad, 0xf7, 0xaf, 0x15, 0xbd, + 0x6, 0xdf, 0xf8, 0x1c, 0x5, 0x59, 0x6, 0xfb, 0x49, 0xfd, 0xe6, 0x15, + 0xbc, 0x6, 0xe0, 0xf8, 0x1d, 0x5, 0x59, 0x6, 0xe, 0x3d, 0xc2, 0xf7, + 0xb, 0xb4, 0xf8, 0x18, 0xc2, 0x1, 0xe3, 0xc4, 0xf7, 0x71, 0xc4, 0x3, + 0xc4, 0x3d, 0x15, 0xf7, 0x87, 0x6, 0xcd, 0xc4, 0xac, 0xbc, 0xa6, 0x7e, + 0xaa, 0x68, 0xad, 0x1f, 0xe3, 0x8a, 0xa7, 0xde, 0xb0, 0x1a, 0xa8, 0x7a, + 0xa3, 0x75, 0x9d, 0x1e, 0xfb, 0x65, 0xf7, 0x4c, 0x87, 0x93, 0x96, 0x1a, + 0xaf, 0x8c, 0xb7, 0x8b, 0xa0, 0x1b, 0xf7, 0x3f, 0x6, 0x75, 0x26, 0x5, + 0xc4, 0x6, 0xab, 0xf7, 0x30, 0x5, 0xfb, 0x50, 0x6, 0x48, 0x24, 0x85, + 0x35, 0x70, 0x9a, 0x76, 0xab, 0x6a, 0x1f, 0x5a, 0x4a, 0x56, 0x52, 0x73, + 0x9d, 0x6a, 0xa0, 0x79, 0x1f, 0xf7, 0x4e, 0xfb, 0x39, 0x5, 0x99, 0x7f, + 0x94, 0x77, 0x7b, 0x1a, 0x79, 0x7d, 0x7d, 0x6d, 0x1e, 0xfb, 0x5a, 0x6, + 0xa0, 0xf0, 0x62, 0xa, 0xf7, 0x93, 0xc6, 0x15, 0xfb, 0x1d, 0xf7, 0xb, + 0x5, 0x7c, 0x99, 0x85, 0x9a, 0x9a, 0x1a, 0xaf, 0xb6, 0xab, 0xb2, 0x8c, + 0x1e, 0xf7, 0x22, 0xfb, 0x9, 0x5, 0x9a, 0x7d, 0x96, 0x7f, 0x74, 0x1a, + 0x7c, 0x75, 0x58, 0x45, 0x1e, 0xe, 0xf8, 0x80, 0xf2, 0x1, 0xf7, 0xd9, + 0xf8, 0x80, 0x15, 0xef, 0x6, 0xa8, 0xf2, 0x5, 0x27, 0x6, 0xfb, 0x64, + 0x24, 0x15, 0xf2, 0x6, 0xa8, 0xf2, 0x5, 0x24, 0x6, 0xe, 0x79, 0xb9, + 0xe6, 0xb8, 0xf7, 0x8f, 0xb8, 0xd7, 0xb7, 0x1, 0x84, 0xb9, 0xf7, 0x0, + 0xba, 0xf8, 0x3, 0xb9, 0x3, 0x84, 0xf7, 0x66, 0x15, 0xfb, 0x18, 0xf5, + 0x2b, 0xf7, 0x23, 0xf7, 0x59, 0xf7, 0x3c, 0xf7, 0x38, 0xf7, 0x5d, 0xf7, + 0x1d, 0x20, 0xeb, 0xfb, 0x1f, 0xfb, 0x41, 0xfb, 0x57, 0xfb, 0x35, 0xfb, + 0x65, 0x1e, 0xb9, 0x9c, 0x15, 0xf7, 0x2f, 0xf7, 0x20, 0xf7, 0x2e, 0xf7, + 0x43, 0xf7, 0x11, 0xdd, 0x39, 0xfb, 0x8, 0xfb, 0x37, 0xfb, 0x2e, 0xfb, + 0x27, 0xfb, 0x31, 0xfb, 0xa, 0x2e, 0xde, 0xf7, 0x8, 0x1e, 0xf7, 0xfc, + 0x7d, 0x15, 0x6b, 0x69, 0x63, 0x7a, 0x68, 0x1b, 0x51, 0x65, 0xb5, 0xc0, + 0xe3, 0xd7, 0xcf, 0xd3, 0xaa, 0xb1, 0x7c, 0x77, 0x9f, 0x1f, 0xad, 0xae, + 0x5, 0xab, 0x66, 0x6e, 0x98, 0x5d, 0x1b, 0xfb, 0x7, 0x30, 0x27, 0x20, + 0x39, 0xca, 0x57, 0xd2, 0xbd, 0xc5, 0xa3, 0xab, 0xb2, 0x1f, 0xe, 0xf7, + 0x8d, 0xc7, 0xda, 0xc5, 0xda, 0xc2, 0x1, 0xf7, 0xeb, 0xf7, 0x95, 0x15, + 0xee, 0x6, 0x94, 0xc6, 0x5, 0x56, 0x6, 0xa0, 0xf7, 0x25, 0x5, 0x8d, + 0x9a, 0x8d, 0x99, 0x95, 0x1a, 0xc8, 0x5c, 0x9e, 0x58, 0x5b, 0x54, 0x7a, + 0x7c, 0x6d, 0x1e, 0x8e, 0x50, 0x5, 0x9d, 0xa6, 0xc1, 0x9d, 0xb4, 0x1b, + 0xac, 0xa2, 0x84, 0x61, 0x80, 0x89, 0x7f, 0x87, 0x7b, 0x1f, 0x90, 0x75, + 0x71, 0x8f, 0x71, 0x1b, 0xfb, 0x8, 0x6e, 0x43, 0x5d, 0x62, 0xa8, 0x65, + 0xbd, 0xb6, 0xb9, 0xa7, 0xac, 0xae, 0x1f, 0x93, 0xd1, 0x15, 0x5f, 0x6a, + 0x5e, 0x70, 0x62, 0x1b, 0x71, 0x78, 0x94, 0x9f, 0xab, 0xa7, 0x9d, 0xc1, + 0xb4, 0xb4, 0x83, 0x8b, 0x1f, 0xe, 0xda, 0x76, 0xf8, 0x18, 0x77, 0x1, + 0xf7, 0x86, 0xf7, 0x93, 0x15, 0xf7, 0x4b, 0xfb, 0x4d, 0xab, 0xba, 0xfb, + 0x15, 0xf7, 0x1e, 0xf7, 0x59, 0xf7, 0x24, 0x6e, 0xba, 0x5, 0xfc, 0x39, + 0xfb, 0x53, 0x15, 0xf7, 0x3e, 0xfb, 0x4d, 0xb1, 0xbc, 0xfb, 0x14, 0xf7, + 0x1c, 0xf7, 0x52, 0xf7, 0x24, 0x6c, 0xba, 0x5, 0xe, 0xf7, 0x15, 0x76, + 0xf7, 0x5b, 0xc9, 0x1, 0xdd, 0xf7, 0xc7, 0x15, 0xf8, 0x7, 0x6, 0x68, + 0xfb, 0x5b, 0x6a, 0xa, 0xb8, 0xf7, 0x99, 0x5, 0xfc, 0x3e, 0x6, 0xe, + 0x79, 0xb9, 0xf7, 0x7, 0xf7, 0x37, 0xe8, 0xbb, 0xe4, 0xb7, 0x1, 0x84, + 0xbb, 0xf7, 0xde, 0xbd, 0xf7, 0x1f, 0xba, 0x3, 0x84, 0xf7, 0x74, 0x15, + 0xfb, 0x1e, 0xf1, 0x23, 0xf7, 0x27, 0xf7, 0x48, 0xf7, 0x4d, 0xf7, 0x35, + 0xf7, 0x5d, 0xf7, 0x1e, 0x21, 0xed, 0xfb, 0x20, 0xfb, 0x3a, 0xfb, 0x5e, + 0xfb, 0x2a, 0xfb, 0x62, 0x1e, 0xbb, 0x93, 0x15, 0xf7, 0x1d, 0xf7, 0x22, + 0xf7, 0x3b, 0xf7, 0x3f, 0xf7, 0xe, 0xdf, 0x33, 0xfb, 0x4, 0xfb, 0x30, + 0xfb, 0x33, 0xfb, 0x2c, 0xfb, 0x2b, 0xfb, 0xc, 0x32, 0xe0, 0xf7, 0xb, + 0x1e, 0xf7, 0x17, 0x32, 0x15, 0xba, 0x6, 0xa1, 0xf5, 0x5, 0xbf, 0x6, + 0xa9, 0x21, 0x5, 0xc6, 0x6, 0x6d, 0xf7, 0x9, 0x5, 0xbf, 0x9d, 0x9c, + 0xba, 0xbc, 0x1a, 0xb8, 0x63, 0xa7, 0x5e, 0x1e, 0x23, 0x6, 0x9d, 0xfb, + 0x21, 0x15, 0x9f, 0xe8, 0x6a, 0xa, 0xa8, 0x9c, 0x79, 0x7b, 0x59, 0x71, + 0x82, 0x65, 0x1f, 0xe, 0xf8, 0xa1, 0xb3, 0x1, 0xf7, 0x8, 0xf8, 0xa1, + 0x15, 0xf7, 0xfc, 0x6, 0x93, 0xb3, 0x5, 0xfb, 0xfc, 0x6, 0xe, 0xf7, + 0x9e, 0xc9, 0xf7, 0x7c, 0xc9, 0x1, 0xf7, 0xb, 0xca, 0xf7, 0x80, 0xca, + 0x3, 0xf7, 0xb, 0xf8, 0x28, 0x15, 0x3f, 0xc6, 0x4d, 0xe2, 0xf7, 0x1, + 0xf6, 0xf2, 0xf7, 0x11, 0xca, 0x5f, 0xcc, 0x28, 0xfb, 0xb, 0x27, 0x23, + 0xfb, 0x6, 0x1e, 0xca, 0x9a, 0x15, 0xbf, 0xc1, 0xe4, 0xe4, 0xd0, 0xa3, + 0x5d, 0x67, 0x4f, 0x46, 0x31, 0x43, 0x4f, 0x68, 0xb6, 0xbb, 0x1e, 0xe, + 0xb7, 0xc0, 0xf7, 0x79, 0xc0, 0xf7, 0x47, 0x77, 0x1, 0xf7, 0x97, 0xc2, + 0x3, 0xf7, 0x97, 0xf7, 0x26, 0x15, 0xc2, 0x6, 0xb0, 0xf7, 0x48, 0x5, + 0xf7, 0x4f, 0x80, 0xa, 0xfb, 0x4f, 0x6, 0xaf, 0xf7, 0x47, 0x52, 0xa, + 0x67, 0xfb, 0x47, 0x5, 0xfb, 0x4f, 0x6, 0x80, 0x56, 0x5, 0xf7, 0x4f, + 0x6, 0xfb, 0x89, 0xfb, 0xae, 0x15, 0xf8, 0x41, 0x80, 0xa, 0xfc, 0x41, + 0x6, 0xe, 0xf7, 0x8d, 0xc3, 0xf7, 0x9b, 0xc1, 0x1, 0xf8, 0x1f, 0xc4, + 0x3, 0xf7, 0x27, 0xf7, 0x8d, 0x15, 0xf7, 0x91, 0x3c, 0xa, 0xfb, 0x3d, + 0x6, 0xf7, 0x17, 0xdf, 0xda, 0xbb, 0xef, 0x1a, 0xb9, 0x68, 0xb2, 0x48, + 0x5f, 0x4a, 0x74, 0x58, 0x73, 0x1e, 0x82, 0x52, 0x5, 0xc0, 0x6, 0xb2, + 0x8a, 0xba, 0xb1, 0xaa, 0x1b, 0xae, 0xa1, 0x75, 0x71, 0x5c, 0x62, 0x63, + 0x68, 0x74, 0x1f, 0xfb, 0x36, 0xfb, 0x1, 0x5, 0xe, 0xf7, 0x84, 0xc3, + 0xf5, 0xc2, 0xf7, 0x2, 0xc2, 0x12, 0xf8, 0xa, 0xc5, 0x5e, 0xc4, 0x13, + 0xf0, 0xf7, 0x30, 0xf7, 0xa3, 0x15, 0x7c, 0xa8, 0xbb, 0x7b, 0xb6, 0x1b, + 0xd7, 0xdb, 0xc0, 0xde, 0xae, 0x79, 0x9a, 0x75, 0x97, 0x1f, 0x13, 0xe8, + 0xae, 0xa1, 0x9c, 0xb2, 0xb4, 0x1a, 0xbc, 0x65, 0xac, 0x54, 0x60, 0x5c, + 0x77, 0x75, 0x64, 0x1e, 0x96, 0x57, 0x5, 0x9d, 0xab, 0xac, 0xa0, 0xad, + 0x1b, 0xa6, 0xa7, 0x7d, 0x71, 0x5e, 0x5a, 0x72, 0x4b, 0x1f, 0x87, 0x79, + 0x87, 0x78, 0x87, 0x79, 0x8, 0x99, 0x9f, 0x8b, 0x9f, 0x1b, 0x13, 0xf0, + 0xa9, 0xa7, 0x81, 0x6e, 0x6a, 0x71, 0x69, 0x4b, 0x66, 0x67, 0x99, 0x9d, + 0x6f, 0x1f, 0xe, 0x65, 0xa, 0xf7, 0x42, 0xf8, 0x85, 0x15, 0xf7, 0x96, + 0xf0, 0x7b, 0xd5, 0xfb, 0x8c, 0xfb, 0x24, 0x5, 0xe, 0xf7, 0x22, 0xac, + 0x15, 0x75, 0x9a, 0xa9, 0x78, 0xbb, 0x1b, 0xbe, 0xdf, 0xab, 0xca, 0xbc, + 0x1f, 0x7b, 0x39, 0x5, 0xf7, 0x1c, 0x2a, 0xa, 0x39, 0x6, 0xd3, 0xf8, + 0x3, 0x5, 0xfb, 0x1c, 0x68, 0xa, 0xdd, 0x6, 0x70, 0xfb, 0x18, 0x5, + 0x35, 0x7b, 0x51, 0xfb, 0x2, 0xfb, 0x11, 0x1b, 0x4b, 0x6a, 0xb9, 0xc6, + 0x96, 0x1f, 0xc2, 0xf7, 0xa8, 0x5, 0xfb, 0x1d, 0x68, 0xa, 0xdd, 0x6, + 0x23, 0xfc, 0xa6, 0x6a, 0xa, 0xe, 0xf8, 0xa9, 0xa8, 0x1, 0xf7, 0x28, + 0xba, 0xda, 0xb6, 0x3, 0xf7, 0x28, 0x3d, 0x15, 0xba, 0x6, 0xf7, 0x52, + 0xf8, 0xf7, 0x5, 0xda, 0x6, 0xfb, 0x52, 0xfc, 0xf7, 0x5, 0xb6, 0x6, + 0xf7, 0x52, 0xf8, 0xf7, 0x5, 0xbc, 0x6, 0x94, 0xa8, 0x5, 0xfb, 0x6f, + 0x6, 0xfb, 0x34, 0xfb, 0x2b, 0x4c, 0xfb, 0x21, 0x53, 0xb9, 0x3e, 0xf7, + 0x35, 0x1f, 0xe, 0xf7, 0x51, 0xf7, 0x1e, 0x1, 0xf7, 0x70, 0xf7, 0x33, + 0x3, 0xf7, 0x70, 0xf7, 0x87, 0x15, 0x6e, 0xa6, 0x72, 0xb4, 0xb7, 0xba, + 0xaf, 0xb9, 0xa9, 0x73, 0xa5, 0x63, 0x58, 0x5f, 0x65, 0x5d, 0x1e, 0xe, + 0xfb, 0x2, 0xb9, 0x1, 0xf7, 0xbf, 0xba, 0x3, 0xf7, 0x76, 0xfb, 0x1a, + 0x15, 0x88, 0x90, 0xa3, 0x7d, 0xa4, 0x1b, 0xbc, 0xb7, 0xb0, 0xba, 0xa4, + 0x78, 0x9c, 0x7c, 0x8d, 0x1f, 0x92, 0xac, 0x5, 0x5c, 0x6, 0x73, 0x41, + 0x5, 0x8c, 0x93, 0x91, 0x8b, 0x91, 0x1b, 0x9d, 0x93, 0x83, 0x83, 0x8c, + 0x1f, 0x78, 0x79, 0x7f, 0x7b, 0x7d, 0x7c, 0x8e, 0x94, 0x81, 0x1e, 0xe, + 0xf7, 0x8d, 0xc3, 0x1, 0xf7, 0xab, 0xc0, 0x3, 0xf7, 0x3e, 0xf7, 0x8d, + 0x15, 0xf7, 0x8d, 0x3c, 0xa, 0x29, 0x6, 0xc5, 0xf7, 0xd1, 0xfb, 0x26, + 0x72, 0x80, 0x53, 0xe6, 0x9a, 0x5e, 0xfb, 0x8f, 0x5, 0x29, 0x6, 0xe, + 0xf7, 0x8d, 0xc6, 0xf7, 0x69, 0xc6, 0x1, 0xf7, 0x1d, 0xc1, 0xf7, 0x6d, + 0xc1, 0x3, 0xf7, 0x1d, 0xf8, 0xc, 0x15, 0x2c, 0xe5, 0x6b, 0xb6, 0xd4, + 0xf7, 0xb, 0xd2, 0xf7, 0x17, 0xd4, 0x5a, 0xc3, 0x39, 0x36, 0xfb, 0x1, + 0x40, 0xfb, 0x15, 0x1e, 0xc1, 0x9a, 0x15, 0xd1, 0xbf, 0xc7, 0xd9, 0xcf, + 0x9d, 0x5d, 0x68, 0x8c, 0x1e, 0x3c, 0x4a, 0x56, 0x4e, 0x5c, 0x5f, 0xa9, + 0xc0, 0x1e, 0xe, 0xe6, 0x76, 0xf8, 0xc, 0x77, 0x1, 0x8c, 0xf8, 0xc4, + 0x3, 0xf3, 0xd1, 0x15, 0xf7, 0x92, 0xf7, 0x53, 0xfb, 0x4b, 0xf7, 0x4d, + 0x6b, 0x5c, 0xf7, 0x15, 0xfb, 0x1e, 0xfb, 0x59, 0xfb, 0x24, 0x5, 0xf7, + 0x48, 0x16, 0xaa, 0x5c, 0xf7, 0x83, 0xf7, 0x53, 0xfb, 0x3e, 0xf7, 0x4d, + 0x65, 0x5a, 0xf7, 0x14, 0xfb, 0x1c, 0x5, 0xe, 0x60, 0xc1, 0x5c, 0x76, + 0xf3, 0xc2, 0xf7, 0x5d, 0xc0, 0xf7, 0xc9, 0x77, 0x12, 0x13, 0xb8, 0xf7, + 0x8d, 0xba, 0x15, 0xf7, 0x14, 0x6, 0x82, 0x67, 0x5, 0x5a, 0x5f, 0xa, + 0xf7, 0x20, 0x76, 0xa, 0x61, 0x6, 0x93, 0xaf, 0x5, 0xb6, 0x6, 0x94, + 0xc2, 0x5, 0x60, 0x6, 0xac, 0xf7, 0x65, 0x52, 0xa, 0xfb, 0x30, 0xfb, + 0x65, 0x5, 0xc9, 0x16, 0xe4, 0xf7, 0x19, 0x76, 0xfb, 0x19, 0x5, 0xfc, + 0x19, 0xfb, 0x14, 0x15, 0x13, 0x78, 0xac, 0x6c, 0xf8, 0xd4, 0xf9, 0x47, + 0x69, 0xaa, 0x5, 0xfc, 0xd3, 0xfb, 0xfe, 0x15, 0xf7, 0x6e, 0x6, 0x94, + 0xc0, 0x5, 0x36, 0x6, 0xbe, 0xf7, 0xc6, 0xfb, 0x14, 0x73, 0x82, 0x55, + 0xdb, 0x99, 0x62, 0xfb, 0x86, 0x5, 0x35, 0x6, 0xe, 0x5f, 0xc1, 0x5d, + 0x76, 0xf7, 0xd5, 0xc0, 0x7c, 0xc1, 0xf7, 0xc9, 0x77, 0x12, 0xf8, 0x65, + 0xbb, 0x13, 0x5c, 0x89, 0x71, 0x15, 0xad, 0x6c, 0xf8, 0xce, 0xf9, 0x47, + 0x67, 0xaa, 0x5, 0xfc, 0xb5, 0xfb, 0xff, 0x15, 0xf7, 0x70, 0x76, 0xa, + 0x34, 0x6, 0xbe, 0xf7, 0xc4, 0xfb, 0x13, 0x74, 0x82, 0x55, 0xda, 0x99, + 0x64, 0xfb, 0x85, 0x5, 0x34, 0x6, 0x13, 0xac, 0xf7, 0x73, 0xfc, 0x24, + 0x15, 0xf7, 0x6b, 0x76, 0xa, 0xfb, 0x23, 0x6, 0xf7, 0xb, 0xee, 0xc6, + 0xa8, 0xe1, 0x1a, 0xbc, 0x72, 0xb7, 0x4d, 0x65, 0x63, 0x78, 0x69, 0x6c, + 0x1e, 0x81, 0x4c, 0x5, 0xb9, 0x6, 0xb0, 0x89, 0xae, 0xa5, 0xaa, 0x1b, + 0xaa, 0x9c, 0x73, 0x6e, 0x62, 0x68, 0x6a, 0x6d, 0x74, 0x1f, 0xfb, 0x1e, + 0xfb, 0x0, 0x5, 0xe, 0x61, 0xc1, 0x5c, 0x76, 0xf7, 0xb, 0xc2, 0xf7, + 0x42, 0xc2, 0xf7, 0xb3, 0x76, 0xc0, 0x77, 0x12, 0xf7, 0x67, 0xba, 0x65, + 0xbb, 0x13, 0xbe, 0xf7, 0x90, 0xca, 0x15, 0xf7, 0x11, 0x6, 0x83, 0x58, + 0x5, 0x59, 0x6, 0x82, 0x55, 0x5, 0xf7, 0x1c, 0x76, 0xa, 0x62, 0x6, + 0x92, 0xbe, 0x5, 0xb6, 0x6, 0x94, 0xc2, 0x5, 0x61, 0x6, 0xab, 0xf7, + 0x57, 0x5, 0x56, 0x6, 0xfb, 0x2c, 0xfb, 0x66, 0x5, 0xc7, 0x9a, 0x15, + 0xe3, 0xf7, 0x8, 0x78, 0xfb, 0x8, 0x5, 0xfc, 0x10, 0xfb, 0x25, 0x15, + 0x13, 0x7e, 0xab, 0x6e, 0xf8, 0xbe, 0xf9, 0x47, 0x6a, 0xaa, 0x5, 0xfc, + 0xa1, 0xfb, 0xe8, 0x15, 0x7d, 0xa2, 0xb1, 0x77, 0xae, 0x1b, 0xc4, 0xd1, + 0xc2, 0xd5, 0x1f, 0x8e, 0xb3, 0x7a, 0x9a, 0x78, 0x97, 0x8, 0x13, 0xbd, + 0xa6, 0xa0, 0x9b, 0xb1, 0xb1, 0x1a, 0xbc, 0x6c, 0xab, 0x5d, 0x69, 0x66, + 0x79, 0x75, 0x6b, 0x1e, 0x94, 0x58, 0x5, 0x9d, 0xa5, 0xa5, 0x9f, 0xa7, + 0x1b, 0xa0, 0x9f, 0x7d, 0x72, 0x8d, 0x1f, 0x64, 0x69, 0x6f, 0x57, 0x1e, + 0x85, 0x6, 0x82, 0x56, 0x5, 0x13, 0xbe, 0xb2, 0xc0, 0x87, 0x6a, 0x6d, + 0x73, 0x63, 0x59, 0x6d, 0x6e, 0x9c, 0x9c, 0x76, 0x1f, 0xe, 0xfb, 0x31, + 0xc1, 0xf8, 0x33, 0xf7, 0xa, 0x12, 0xf7, 0xc, 0xc2, 0xf7, 0x45, 0xc2, + 0x9e, 0xc1, 0x17, 0xf7, 0xe5, 0xf7, 0xf7, 0x15, 0x73, 0xa1, 0x78, 0xac, + 0xb8, 0xad, 0xad, 0xb3, 0xa2, 0x75, 0xa0, 0x68, 0x68, 0x61, 0x69, 0x62, + 0x1e, 0x8e, 0xfb, 0x41, 0x15, 0x38, 0x7a, 0xfb, 0x1d, 0x5e, 0xfb, 0x22, + 0x1a, 0x31, 0xd6, 0x5e, 0xe5, 0xc6, 0xc9, 0x9a, 0x9c, 0xbe, 0x1e, 0x13, + 0xb8, 0xa2, 0xf7, 0xb, 0x5, 0x55, 0x6, 0x7d, 0x44, 0x5, 0x7b, 0x66, + 0x61, 0x81, 0x63, 0x1b, 0x2f, 0x71, 0xba, 0xb1, 0xf7, 0x2, 0xf7, 0x1f, + 0xac, 0xd3, 0x96, 0x1f, 0xa0, 0xf3, 0x52, 0xa, 0xe, 0x8b, 0xc1, 0xf7, + 0x10, 0xc1, 0xf7, 0xb1, 0xc1, 0x1, 0x89, 0x4f, 0xa, 0x89, 0x16, 0x20, + 0xa, 0xfb, 0x43, 0xf8, 0x7d, 0x15, 0xf7, 0x9a, 0x26, 0x9b, 0xa9, 0xfb, + 0x7b, 0x79, 0xa, 0x8b, 0xc1, 0xf7, 0xf, 0xc2, 0xf7, 0xab, 0xc1, 0x84, + 0xa, 0x72, 0xf7, 0x74, 0xf7, 0x5a, 0xf7, 0x71, 0x3, 0xf7, 0xc2, 0xf8, + 0xff, 0x15, 0xf7, 0xd7, 0xf0, 0x77, 0xd4, 0xfb, 0xc9, 0xfb, 0x24, 0x5, + 0xfb, 0xd5, 0xfd, 0x1d, 0x23, 0xa, 0x8b, 0xc0, 0xf7, 0xc, 0xc0, 0xf7, + 0xb1, 0xc1, 0xf7, 0x66, 0x77, 0x1, 0x89, 0x4f, 0xa, 0xf7, 0x7a, 0xf9, + 0x3, 0x15, 0xb0, 0x79, 0xf7, 0x3b, 0xf7, 0x7, 0xf7, 0xd, 0xfb, 0x7, + 0xb5, 0x9d, 0xfb, 0x5, 0xf7, 0x2c, 0x5, 0x3c, 0x6, 0xfc, 0x2b, 0xfd, + 0x9b, 0x23, 0xa, 0x7e, 0xa, 0xd3, 0xbc, 0x9c, 0xbc, 0x1, 0x71, 0x4f, + 0xa, 0xf7, 0x6c, 0xf9, 0x20, 0x15, 0xbc, 0x81, 0x5, 0x9e, 0x97, 0xa6, + 0xb5, 0xbc, 0x1b, 0xa4, 0x9b, 0x7b, 0x7b, 0x9e, 0x1f, 0x7a, 0x9f, 0xa1, + 0x7a, 0xb1, 0x1b, 0xd0, 0xb9, 0xca, 0xb1, 0x9e, 0x1f, 0x5b, 0x94, 0x5, + 0x73, 0x7d, 0x69, 0x66, 0x66, 0x1b, 0x76, 0x7e, 0x99, 0x9b, 0x7a, 0x1f, + 0x9c, 0x79, 0x75, 0x9e, 0x61, 0x1b, 0x52, 0x51, 0x5c, 0x56, 0x6d, 0x1f, + 0xfb, 0x86, 0xfd, 0x20, 0x23, 0xa, 0x7e, 0xa, 0xdb, 0xf7, 0x8, 0x1, + 0x89, 0x4f, 0xa, 0xf8, 0x55, 0xf9, 0x19, 0x15, 0xdd, 0x5c, 0xa, 0x38, + 0x6, 0xfb, 0x3c, 0xfb, 0x8, 0x15, 0xdd, 0x5c, 0xa, 0x39, 0x6, 0xfb, + 0xe0, 0xfd, 0x8d, 0x23, 0xa, 0x8b, 0xbf, 0xf7, 0x20, 0xc1, 0xf7, 0xaa, + 0xc1, 0xaa, 0xc4, 0xd2, 0xc3, 0x1, 0x89, 0xf7, 0x63, 0xf7, 0x11, 0xc6, + 0xd4, 0xc7, 0x3, 0xf7, 0xde, 0xf9, 0x3d, 0x15, 0x5d, 0xb1, 0x71, 0xb7, + 0xc8, 0xbc, 0xbf, 0xc5, 0xab, 0x7f, 0xb5, 0x4a, 0x4c, 0x57, 0x58, 0x4e, + 0x1e, 0xc6, 0x93, 0x15, 0xa3, 0x97, 0xa3, 0xac, 0xad, 0x85, 0x6f, 0x86, + 0x75, 0x77, 0x7b, 0x76, 0x85, 0x71, 0x8b, 0xa2, 0x1e, 0xfc, 0x1b, 0xfd, + 0x45, 0x23, 0xa, 0x8b, 0xc1, 0xeb, 0xc1, 0xbc, 0x61, 0xa, 0x1, 0x71, + 0xf7, 0x56, 0xe2, 0xcd, 0xf6, 0xc1, 0x93, 0xc2, 0x3, 0x71, 0x16, 0xf7, + 0x56, 0x2a, 0xa, 0x35, 0x6, 0xc8, 0xf7, 0x3, 0x5, 0xf7, 0x19, 0x6, + 0x6b, 0xfb, 0x39, 0x5, 0xf7, 0x97, 0x6, 0xaa, 0xf7, 0x2d, 0x52, 0xa, + 0x78, 0x28, 0x5, 0xfb, 0x2a, 0x6, 0xb1, 0xf7, 0x5c, 0x5, 0xdb, 0x6, + 0x80, 0x52, 0x5, 0xc1, 0x6, 0xab, 0xf7, 0x3b, 0x5, 0x57, 0x60, 0xa, + 0x39, 0x6, 0xb3, 0xf7, 0x5c, 0x5, 0xf7, 0x2b, 0x6, 0x78, 0x26, 0x6a, + 0xa, 0xa9, 0xf7, 0x2f, 0x5, 0xfc, 0x2a, 0x2d, 0xa, 0xe4, 0x6, 0xfb, + 0x99, 0x58, 0xa, 0x57, 0x6, 0xf7, 0x5b, 0xf7, 0x39, 0x15, 0xf7, 0x3e, + 0xf7, 0xb4, 0x52, 0xfb, 0xb4, 0x5, 0xe, 0xfb, 0x2b, 0xc2, 0xe7, 0xbe, + 0xf8, 0x76, 0xbe, 0x1, 0x9c, 0xc5, 0xf7, 0x3, 0xbb, 0xf7, 0x8b, 0xc3, + 0x3, 0xf7, 0x5, 0xfb, 0x13, 0x15, 0x84, 0x90, 0xa3, 0x7a, 0xa7, 0x1b, + 0xb3, 0xc2, 0xa2, 0xcb, 0xab, 0x7c, 0xa2, 0x77, 0x93, 0x1f, 0x8f, 0x88, + 0x5, 0xe7, 0xdc, 0xbe, 0xb5, 0xd3, 0x1f, 0x7b, 0xb7, 0x5, 0x66, 0x4d, + 0x45, 0x5a, 0x44, 0x1b, 0xfb, 0x5, 0x43, 0xe5, 0xf7, 0x9, 0xf7, 0x43, + 0xf7, 0x44, 0xef, 0xeb, 0xcc, 0xc5, 0x6d, 0x60, 0xaa, 0x1f, 0x77, 0x36, + 0x51, 0xa, 0xb8, 0xf7, 0x65, 0x52, 0xa, 0x7e, 0x51, 0x5, 0xb7, 0x49, + 0x60, 0x99, 0x55, 0x1b, 0xfb, 0x54, 0xfb, 0x22, 0xfb, 0x3d, 0xfb, 0x44, + 0x22, 0xd1, 0x30, 0xee, 0x7c, 0x1f, 0x78, 0x42, 0x5, 0x8f, 0x92, 0x94, + 0x8b, 0x92, 0x1b, 0x98, 0x96, 0x83, 0x81, 0x80, 0x85, 0x75, 0x6e, 0x7d, + 0x7e, 0x93, 0x92, 0x81, 0x1f, 0xe, 0x5b, 0xa, 0x1, 0xe4, 0xc2, 0xf7, + 0x52, 0xc3, 0xc6, 0xb8, 0x3, 0x88, 0x16, 0x28, 0xa, 0xf8, 0x9d, 0xf8, + 0xc9, 0x15, 0x9a, 0xa9, 0xfb, 0xc9, 0xf7, 0x24, 0x6f, 0x42, 0x5, 0xe, + 0x5b, 0xa, 0x84, 0xa, 0xe5, 0xc3, 0xf7, 0x55, 0xc4, 0xc7, 0xb9, 0x3, + 0xf7, 0xa0, 0xf8, 0xff, 0x15, 0xf7, 0xd5, 0xf0, 0x78, 0xd4, 0xfb, 0xc9, + 0xfb, 0x24, 0x5, 0xfb, 0x9c, 0xfd, 0x1d, 0x15, 0x28, 0xa, 0xe, 0x5b, + 0xa, 0x1, 0xe4, 0xc2, 0x3, 0xf7, 0x54, 0xf9, 0xd, 0x15, 0xb2, 0x79, + 0xf7, 0x45, 0xf7, 0x7, 0xf7, 0x14, 0xfb, 0x7, 0xb9, 0x9d, 0xfb, 0xb, + 0xf7, 0x2c, 0x5, 0x36, 0x6, 0xfc, 0x11, 0xfd, 0xa5, 0x15, 0x28, 0xa, + 0xe, 0x8b, 0xbe, 0xf7, 0x75, 0x76, 0xf7, 0xca, 0x77, 0xf7, 0x2, 0xf7, + 0x8, 0x1, 0xe4, 0xc2, 0x3, 0xf8, 0x3d, 0xf9, 0x23, 0x15, 0xe2, 0x5c, + 0xa, 0x34, 0x6, 0xfb, 0x46, 0xfb, 0x8, 0x15, 0xe2, 0x6, 0xa5, 0x88, + 0xa, 0x34, 0x6, 0xfb, 0xc1, 0xfd, 0x97, 0x15, 0x28, 0xa, 0xe, 0x8b, + 0xc1, 0xf8, 0x5c, 0xc2, 0x84, 0xa, 0xf7, 0x74, 0xc6, 0x3, 0xaf, 0x16, + 0x2f, 0xa, 0xf7, 0x50, 0xf9, 0x2e, 0x15, 0xf7, 0xb5, 0x26, 0x9e, 0xa9, + 0xfb, 0x94, 0x79, 0xa, 0x8b, 0xc1, 0xf8, 0x5d, 0xc2, 0xf7, 0x77, 0x77, + 0x1, 0xf7, 0x6c, 0xc5, 0x3, 0xf7, 0x88, 0xf9, 0x0, 0x15, 0xf7, 0xdb, + 0xef, 0x78, 0xd4, 0xfb, 0xcf, 0xfb, 0x23, 0x5, 0xfb, 0x64, 0xfd, 0x1e, + 0x15, 0xf8, 0x2d, 0x2a, 0xa, 0xfb, 0x43, 0x6, 0xeb, 0xf8, 0x5d, 0x5, + 0xf7, 0x40, 0x46, 0xa, 0xfc, 0x29, 0x6, 0x7e, 0x54, 0x5, 0xf7, 0x42, + 0x6, 0x2d, 0x7a, 0xa, 0xfb, 0x44, 0x6, 0xe, 0x8b, 0xc0, 0xf8, 0x5d, + 0xc2, 0x1, 0xf7, 0x74, 0xc6, 0x3, 0xf7, 0x3f, 0xf9, 0xb, 0x15, 0xb2, + 0x7a, 0xf7, 0x47, 0xf7, 0x8, 0xf7, 0x14, 0xfb, 0x8, 0xb9, 0x9c, 0xfb, + 0xd, 0xf7, 0x2e, 0x5, 0x36, 0x6, 0xfb, 0xd5, 0xfd, 0xa5, 0x15, 0x2f, + 0xa, 0xe, 0x8b, 0xbe, 0xf8, 0x5f, 0xc2, 0xf7, 0x62, 0x77, 0x1, 0xf7, + 0x74, 0xc6, 0x3, 0xf8, 0x35, 0xf9, 0x22, 0x15, 0xe7, 0x6, 0xa5, 0xf7, + 0x9, 0x5, 0x31, 0x6, 0xfb, 0x4e, 0xfb, 0x9, 0x15, 0xe5, 0x6, 0xa6, + 0xf7, 0x9, 0x5, 0x31, 0x6, 0xfb, 0x8e, 0xfd, 0x97, 0x15, 0x2f, 0xa, + 0xe, 0x8b, 0xc1, 0xf7, 0x57, 0xbf, 0xf7, 0x63, 0xc1, 0x1, 0xf8, 0xad, + 0xcb, 0x3, 0x8a, 0x16, 0xf7, 0x6f, 0x6, 0xf7, 0x56, 0xf7, 0x49, 0xe1, + 0xf7, 0xaf, 0xf7, 0x22, 0x28, 0xbe, 0xfb, 0x1a, 0x1f, 0xfb, 0x8c, 0x2d, + 0xa, 0xda, 0x6, 0x63, 0xfb, 0x63, 0x5, 0x3f, 0x6, 0x7f, 0x57, 0x5, + 0xd8, 0x6, 0x64, 0xfb, 0x57, 0x89, 0xa, 0xf7, 0x1b, 0x16, 0xb1, 0xf7, + 0x57, 0x5, 0xf7, 0x55, 0x6, 0x96, 0xbf, 0x5, 0xfb, 0x54, 0x6, 0xb4, + 0xf7, 0x63, 0x5, 0xf0, 0x6, 0xf7, 0x2a, 0xb5, 0x60, 0xfb, 0x16, 0xfb, + 0x1a, 0x21, 0xfb, 0x27, 0xfb, 0x3a, 0x1f, 0xe, 0x7e, 0xbf, 0xf8, 0x4e, + 0xbf, 0xdf, 0xbc, 0x9b, 0xbd, 0x1, 0x61, 0x7e, 0x15, 0xf7, 0x8f, 0x6, + 0x96, 0xbf, 0x5, 0xfb, 0x3, 0x6, 0xe2, 0xf8, 0x37, 0xf7, 0x5a, 0xfc, + 0x6b, 0x5, 0xd7, 0x6, 0xf1, 0xf8, 0x82, 0x5, 0xdb, 0x6, 0x96, 0xbf, + 0x5, 0xfb, 0x8b, 0x82, 0xa, 0xf7, 0x2, 0x6, 0x34, 0xfc, 0x3b, 0xfb, + 0x58, 0xf8, 0x6f, 0x5, 0xfb, 0x34, 0x6, 0x7f, 0x57, 0x5, 0xde, 0x6, + 0x30, 0xfc, 0x4e, 0x7b, 0xa, 0xf7, 0x6c, 0xf8, 0xe5, 0x15, 0xbe, 0x80, + 0x5, 0x9f, 0x97, 0xa8, 0xb4, 0xbe, 0x1b, 0xac, 0x9e, 0x78, 0x7a, 0xa1, + 0x1f, 0x7c, 0x9e, 0x9f, 0x7d, 0xac, 0x1b, 0xd2, 0xbb, 0xcb, 0xb2, 0x9f, + 0x1f, 0x58, 0x94, 0x5, 0x73, 0x7d, 0x6d, 0x64, 0x64, 0x1b, 0x70, 0x7c, + 0x99, 0x9a, 0x7b, 0x1f, 0x9d, 0x78, 0x76, 0x9e, 0x5e, 0x1b, 0x50, 0x4e, + 0x5d, 0x55, 0x6c, 0x1f, 0xe, 0x79, 0xc1, 0xf8, 0x7b, 0xc1, 0xf7, 0x6c, + 0x7d, 0xa, 0xf7, 0x82, 0xf9, 0x64, 0x15, 0xf7, 0xa0, 0x27, 0x9b, 0xa9, + 0xfb, 0x7f, 0xf7, 0x23, 0x5, 0xfb, 0x91, 0xfc, 0xd9, 0x25, 0xa, 0x79, + 0xc1, 0xf8, 0x7a, 0xc1, 0x1, 0xaa, 0xc2, 0xf8, 0x45, 0xc3, 0x3, 0xf7, + 0x97, 0xf8, 0xff, 0x15, 0xf7, 0xbb, 0xef, 0x78, 0xd5, 0xfb, 0xb5, 0xfb, + 0x25, 0x5, 0xfb, 0x68, 0xfc, 0x48, 0x25, 0xa, 0x79, 0xc1, 0xf8, 0x7b, + 0xc1, 0xf7, 0x5a, 0x7d, 0xa, 0xf7, 0x4b, 0xf9, 0x2, 0x15, 0xb1, 0x7a, + 0xf7, 0x40, 0xf7, 0x7, 0xf7, 0xf, 0xfb, 0x7, 0xb6, 0x9c, 0xfb, 0x8, + 0xf7, 0x2d, 0x89, 0xa, 0xfb, 0xdd, 0xfc, 0xc7, 0x25, 0xa, 0x79, 0xbf, + 0xf8, 0x7d, 0xc1, 0xd1, 0xbc, 0x9c, 0xbc, 0x1, 0x9e, 0xc6, 0xf8, 0x36, + 0xc1, 0x3, 0xf7, 0x2e, 0xf9, 0x2a, 0x15, 0xbd, 0x80, 0x5, 0x9f, 0x97, + 0xa7, 0xb5, 0xbb, 0x1b, 0xae, 0x9c, 0x7a, 0x7a, 0x9d, 0x1f, 0x7b, 0x9c, + 0x9e, 0x7b, 0xb0, 0x1b, 0xd1, 0xbb, 0xca, 0xb2, 0x9e, 0x1f, 0x58, 0x94, + 0x5, 0x73, 0x7e, 0x6b, 0x65, 0x66, 0x1b, 0x73, 0x7e, 0x97, 0x99, 0x7d, + 0x1f, 0x9d, 0x79, 0x76, 0xa1, 0x5b, 0x1b, 0x52, 0x4f, 0x5d, 0x55, 0x6d, + 0x1f, 0xfb, 0xc, 0xfc, 0x56, 0x25, 0xa, 0x79, 0xbe, 0xf8, 0x7e, 0xc1, + 0xce, 0xf7, 0x9, 0x1, 0xad, 0xc2, 0xf7, 0x40, 0xdf, 0xc9, 0xde, 0x9e, + 0xc3, 0x3, 0xf8, 0x2b, 0xf9, 0x18, 0x15, 0xde, 0x6, 0xa5, 0xf7, 0x9, + 0x5, 0x37, 0x6, 0xfb, 0x3f, 0xfb, 0x9, 0x15, 0xdf, 0x6, 0xa4, 0xf7, + 0x9, 0x7b, 0xa, 0xfb, 0x91, 0xfc, 0xb9, 0x25, 0xa, 0xcb, 0x76, 0xf8, + 0x3f, 0x77, 0x1, 0xbb, 0xe4, 0x15, 0xb9, 0x5d, 0xf7, 0x5b, 0xf7, 0x3d, + 0xf7, 0x1e, 0xfb, 0x3d, 0xbb, 0xb2, 0xfb, 0x20, 0xf7, 0x3e, 0xf7, 0x69, + 0xf7, 0x41, 0x63, 0xb8, 0xfb, 0x67, 0xfb, 0x41, 0xfb, 0x1f, 0xf7, 0x40, + 0x5d, 0x64, 0xf7, 0x1e, 0xfb, 0x3d, 0x5, 0xe, 0x82, 0xbf, 0x5d, 0x76, + 0xf8, 0xae, 0xc0, 0x12, 0x13, 0x60, 0xf8, 0xbd, 0xf7, 0xab, 0x15, 0x95, + 0xbe, 0x8d, 0xde, 0x67, 0xca, 0xc3, 0xc6, 0x18, 0x68, 0xab, 0x59, 0x57, + 0x5, 0xaa, 0x6c, 0x5f, 0xa0, 0x4a, 0x1b, 0xfb, 0x3f, 0xfb, 0x7, 0xfb, + 0x2b, 0xfb, 0x1d, 0x71, 0x1f, 0x7b, 0x3b, 0x96, 0x41, 0xae, 0x58, 0x4c, + 0x48, 0x18, 0xaf, 0x6c, 0xc6, 0xc9, 0x5, 0x13, 0xa0, 0x6d, 0xad, 0xb9, + 0x7a, 0xc4, 0x1b, 0xf7, 0x31, 0xf7, 0xa, 0xf7, 0x16, 0xf7, 0x32, 0xaa, + 0x1f, 0x55, 0x89, 0x15, 0xfb, 0xe, 0x73, 0x30, 0xfb, 0x4, 0xfb, 0x13, + 0x1b, 0x5f, 0x67, 0x9a, 0xa3, 0x71, 0x1f, 0xf7, 0xe3, 0xf7, 0xf2, 0xa2, + 0x57, 0x88, 0x4c, 0x84, 0x63, 0x19, 0x63, 0xf7, 0x57, 0x15, 0xfb, 0xe6, + 0xfb, 0xf6, 0x72, 0xb6, 0x84, 0xc3, 0x96, 0xc7, 0x19, 0xe1, 0x9d, 0xdb, + 0xf7, 0x2b, 0xf7, 0x29, 0x1b, 0xbf, 0xaf, 0x7b, 0x71, 0xa3, 0x1f, 0xe, + 0x59, 0xa, 0x96, 0xf8, 0x91, 0x26, 0xa, 0xf7, 0x3c, 0xf7, 0x2f, 0x15, + 0xf7, 0x99, 0x26, 0x9c, 0xa9, 0xfb, 0x7b, 0x79, 0xa, 0x59, 0xa, 0xf7, + 0x6c, 0xf8, 0xfa, 0x15, 0xf7, 0xb3, 0xf7, 0x0, 0x7a, 0xd2, 0xfb, 0xb2, + 0xfb, 0x25, 0x5, 0xfb, 0x51, 0xfb, 0x1f, 0x26, 0xa, 0xe, 0x70, 0xa, + 0xf7, 0x4d, 0xc2, 0x50, 0xa, 0xf7, 0x42, 0xf9, 0xe, 0x15, 0xf7, 0x3d, + 0xf7, 0x8, 0xf7, 0xa, 0xfb, 0x8, 0xb5, 0x9c, 0xfb, 0x4, 0xf7, 0x2e, + 0x5, 0x3c, 0x6, 0xfb, 0x43, 0xfb, 0x2e, 0x5, 0xfb, 0x12, 0xfb, 0x22, + 0x26, 0xa, 0xe, 0x70, 0xa, 0x50, 0xa, 0xf7, 0xf8, 0xf9, 0x21, 0x15, + 0xdc, 0x6, 0xa4, 0xf7, 0xa, 0x6b, 0xa, 0xfb, 0x3b, 0xfb, 0xa, 0x85, + 0xa, 0xa3, 0xf7, 0xa, 0x6b, 0xa, 0xfb, 0x76, 0xfb, 0x9a, 0x26, 0xa, + 0xe, 0x8b, 0xc1, 0xf8, 0x5d, 0xc1, 0x84, 0xa, 0xf7, 0x47, 0xc3, 0x3, + 0xb4, 0x16, 0x31, 0xa, 0xf7, 0x34, 0xf8, 0xc7, 0x15, 0xf7, 0xc3, 0xf1, + 0x79, 0xd5, 0xfb, 0xc1, 0xfb, 0x24, 0x5, 0xe, 0x8b, 0xc1, 0xd1, 0x61, + 0xa, 0xd6, 0xc1, 0x1, 0xf8, 0x92, 0xc0, 0x3, 0xaf, 0x16, 0xf7, 0xba, + 0x4d, 0xa, 0xfb, 0x21, 0x6, 0x98, 0xd1, 0x5, 0xf7, 0x15, 0x6, 0xf7, + 0x1, 0xf7, 0x5, 0xb5, 0xf7, 0x32, 0xd3, 0x46, 0xb0, 0x37, 0x1f, 0xfb, + 0x24, 0x6, 0x99, 0xd6, 0x5, 0xf3, 0x76, 0xa, 0xfb, 0x95, 0x5f, 0xa, + 0xf4, 0x6, 0x3a, 0x58, 0xa, 0x23, 0x6, 0xf7, 0x44, 0xf7, 0x10, 0x15, + 0xae, 0xf7, 0x5d, 0x5, 0xf7, 0x1a, 0x6, 0xc0, 0xcd, 0x7d, 0x5a, 0x28, + 0x41, 0x64, 0x38, 0x1f, 0xe, 0x7c, 0xc2, 0x60, 0xc3, 0xf7, 0xda, 0xc3, + 0xf7, 0x1f, 0xc2, 0x12, 0xf7, 0xc4, 0xc0, 0xf7, 0x34, 0xc1, 0x5f, 0xc4, + 0x13, 0x7c, 0x9a, 0x88, 0x15, 0xf7, 0x1c, 0x6, 0xe8, 0xf8, 0x76, 0x5, + 0xd1, 0x99, 0xa5, 0xa4, 0xf2, 0x1b, 0xd8, 0xc0, 0x8a, 0x54, 0x1f, 0x28, + 0xfb, 0x69, 0xb9, 0xfb, 0x23, 0x1a, 0x41, 0xf7, 0x17, 0x73, 0xad, 0x7c, + 0x1e, 0x13, 0xba, 0xb8, 0x76, 0x98, 0x74, 0x74, 0x1a, 0x43, 0xfb, 0x26, + 0x6d, 0x6d, 0x59, 0x5f, 0xa4, 0xab, 0x69, 0x1e, 0x6b, 0x53, 0x5, 0x6d, + 0xb4, 0xc0, 0x71, 0xc4, 0x1b, 0xde, 0xf7, 0x33, 0xb3, 0xf7, 0x1a, 0xb9, + 0x5c, 0xac, 0x5c, 0x9f, 0x1f, 0x53, 0xa5, 0x3e, 0x95, 0xae, 0x1a, 0x13, + 0x7c, 0xe2, 0xf7, 0x6a, 0x5d, 0xf7, 0x25, 0x1a, 0xe8, 0x48, 0xa0, 0xfb, + 0x9, 0x2b, 0x35, 0x6f, 0xfb, 0x1f, 0x79, 0x1e, 0x85, 0x70, 0x7b, 0xa, + 0x81, 0x53, 0x5, 0xde, 0x6, 0x4c, 0xfb, 0xda, 0x6b, 0xa, 0xe, 0x4b, + 0xa, 0xf7, 0x80, 0xf8, 0xe7, 0x15, 0xf7, 0xa5, 0x24, 0x9d, 0xaa, 0xfb, + 0x85, 0xf7, 0x29, 0x5, 0xf4, 0xfd, 0x37, 0x21, 0xa, 0x3b, 0xa, 0xf7, + 0x61, 0x77, 0x4a, 0xa, 0x13, 0x7e, 0xf7, 0x3c, 0xf8, 0x85, 0x15, 0xb1, + 0x79, 0xf7, 0x43, 0xf7, 0xb, 0xf7, 0x10, 0xfb, 0xb, 0xba, 0x9d, 0xfb, + 0xc, 0xf7, 0x31, 0x5, 0x3a, 0x6, 0xb3, 0xfd, 0x25, 0x21, 0xa, 0x4b, + 0xa, 0xf8, 0xa0, 0xf8, 0xe7, 0x15, 0x72, 0xd8, 0xfb, 0x9e, 0xfb, 0x29, + 0x9d, 0x6c, 0x5, 0xf7, 0x20, 0xfc, 0x83, 0x21, 0xa, 0x3b, 0xa, 0xc6, + 0xbd, 0x9e, 0xbc, 0x90, 0x76, 0x4a, 0xa, 0x13, 0xbd, 0x80, 0xf7, 0x21, + 0xf8, 0x9e, 0x15, 0xbd, 0x81, 0x5, 0x9a, 0x92, 0xba, 0xbd, 0xb0, 0x1b, + 0xb1, 0x9e, 0x71, 0x77, 0xa5, 0x1f, 0x7e, 0x9b, 0x9e, 0x81, 0xa7, 0x1b, + 0x13, 0xbb, 0x80, 0xcc, 0xbe, 0xba, 0xc2, 0xab, 0x1f, 0x8a, 0x6, 0x5a, + 0x94, 0x5, 0x73, 0x7c, 0x68, 0x66, 0x65, 0x1b, 0x72, 0x7d, 0x94, 0x97, + 0x7e, 0x1f, 0x13, 0x7d, 0x80, 0x9f, 0x75, 0x7a, 0xa6, 0x55, 0x1b, 0x56, + 0x4c, 0x64, 0x4a, 0x67, 0x1f, 0xf7, 0x8e, 0xfc, 0xa1, 0x22, 0xa, 0x13, + 0xbd, 0x80, 0x3a, 0xa, 0x13, 0x7d, 0x80, 0x98, 0xce, 0x15, 0x13, 0xbd, + 0x80, 0x2b, 0xa, 0x3b, 0xa, 0xd1, 0xf7, 0x8, 0x4a, 0xa, 0x13, 0x7e, + 0xf8, 0x1f, 0xf8, 0x9b, 0x15, 0xdf, 0x5c, 0xa, 0x36, 0x6, 0xfb, 0x42, + 0xfb, 0x8, 0x15, 0xe0, 0x5c, 0xa, 0x36, 0x6, 0xf7, 0xd, 0xfd, 0x12, + 0x21, 0xa, 0x3b, 0xa, 0xb1, 0xf7, 0x48, 0x6a, 0x76, 0x4a, 0xa, 0x13, + 0xbb, 0xf7, 0xb2, 0xf8, 0xc1, 0x15, 0x63, 0xae, 0x6d, 0xba, 0xc6, 0xc7, + 0xbc, 0xc5, 0xb5, 0x6a, 0xaa, 0x5b, 0x4d, 0x51, 0x59, 0x4f, 0x1e, 0xc9, + 0x95, 0x15, 0x13, 0x77, 0xa4, 0xa1, 0xa0, 0xa3, 0x9c, 0x9a, 0x81, 0x7d, + 0x72, 0x74, 0x75, 0x73, 0x7b, 0x7c, 0x97, 0x98, 0x1e, 0xb6, 0xfc, 0xce, + 0x22, 0xa, 0x13, 0xbb, 0x3a, 0xa, 0x13, 0x7b, 0x98, 0xce, 0x15, 0x13, + 0xbb, 0x2b, 0xa, 0x7c, 0xc1, 0xf7, 0x39, 0xc2, 0xf7, 0x13, 0xc2, 0x1, + 0x93, 0xc6, 0x3, 0xf7, 0xa5, 0xd7, 0x15, 0x58, 0x93, 0xb7, 0x63, 0xda, + 0x1b, 0xb8, 0xbb, 0x96, 0x96, 0xb3, 0x1f, 0x8a, 0xc1, 0x5, 0x82, 0x6a, + 0x62, 0x7e, 0x67, 0x1b, 0x3e, 0x6c, 0xbc, 0xcc, 0x8d, 0x1f, 0x97, 0x8f, + 0x98, 0x8c, 0x98, 0x1e, 0x8c, 0x98, 0x5, 0xf7, 0x91, 0x6, 0x93, 0xad, + 0x90, 0xa4, 0xaf, 0x1a, 0xd4, 0x6f, 0xd0, 0x33, 0x54, 0x65, 0x71, 0x62, + 0x68, 0x1e, 0x99, 0x88, 0x88, 0xc0, 0x2b, 0x1b, 0x55, 0x5f, 0x7e, 0x7b, + 0x5c, 0x1f, 0x56, 0x7, 0x98, 0xb0, 0xb6, 0x99, 0xb4, 0x1b, 0xbf, 0x9c, + 0x78, 0x6a, 0x8c, 0x1f, 0x80, 0x8b, 0x73, 0x87, 0x7c, 0x1e, 0x85, 0x72, + 0x5, 0x8f, 0x76, 0x75, 0x83, 0x76, 0x1b, 0x2c, 0x8a, 0xfb, 0x7, 0x59, + 0xfb, 0xe, 0x1a, 0x48, 0xbe, 0x6d, 0xc1, 0xa5, 0xe0, 0x90, 0xe1, 0xbc, + 0x1e, 0xce, 0xf7, 0x4b, 0x15, 0xcb, 0x9b, 0xbe, 0xca, 0xc9, 0x1b, 0xd5, + 0x87, 0x3e, 0x59, 0x87, 0x1f, 0xfb, 0xad, 0xfb, 0x18, 0x15, 0x75, 0x7b, + 0x58, 0x49, 0x4b, 0x1b, 0x68, 0x76, 0xa0, 0xaf, 0xd7, 0xd7, 0xa7, 0xc5, + 0x8c, 0x1f, 0xa7, 0xaa, 0x92, 0x87, 0x96, 0x1f, 0xe, 0xfb, 0x1c, 0x76, + 0xf7, 0x3a, 0xbe, 0xf7, 0xdc, 0xc0, 0x8a, 0x77, 0x12, 0xb9, 0xc5, 0x13, + 0xe8, 0xf7, 0x26, 0xfb, 0x1e, 0x15, 0x7c, 0xa1, 0x9f, 0x87, 0x9d, 0x1b, + 0xbe, 0xb3, 0xaa, 0xbf, 0xa3, 0x78, 0xa9, 0x7d, 0x90, 0x1f, 0x90, 0xa3, + 0xe1, 0x8f, 0xd3, 0xa9, 0xcb, 0xb3, 0x19, 0x80, 0xbf, 0x5, 0x76, 0x6c, + 0x31, 0x55, 0x38, 0x1b, 0xfb, 0x1c, 0x67, 0xda, 0xc8, 0xe3, 0xf2, 0xef, + 0xf7, 0x10, 0xc5, 0xbe, 0x7f, 0x69, 0xb0, 0x1f, 0x7b, 0x40, 0x51, 0xa, + 0x13, 0xd8, 0xb0, 0xf7, 0x41, 0x71, 0xa, 0x82, 0x60, 0x5, 0x13, 0xe8, + 0xa8, 0x62, 0x5d, 0x9a, 0x50, 0x1b, 0xfb, 0x58, 0x26, 0xfb, 0x1b, 0xfb, + 0x10, 0x26, 0xd7, 0x4d, 0xee, 0x81, 0x1f, 0x77, 0x44, 0x5, 0x8d, 0x90, + 0x92, 0x8c, 0x93, 0x1b, 0x98, 0x98, 0x7e, 0x80, 0x77, 0x79, 0x7d, 0x77, + 0x7f, 0x77, 0x91, 0x96, 0x82, 0x1f, 0xe, 0x7c, 0xc2, 0xf7, 0x34, 0xc4, + 0x7f, 0xa, 0xc5, 0x3, 0xf7, 0x7d, 0xf8, 0xe9, 0x15, 0xf7, 0xa8, 0x25, + 0x9d, 0xa9, 0xfb, 0x88, 0xf7, 0x27, 0x5, 0xfb, 0x39, 0xfc, 0x6b, 0x27, + 0xa, 0x7c, 0xc2, 0xf7, 0x33, 0xc5, 0x7f, 0xa, 0xc7, 0x3, 0xf7, 0x78, + 0xf8, 0x82, 0x15, 0xf7, 0xd0, 0xf2, 0x77, 0xd6, 0xfb, 0xc2, 0xfb, 0x26, + 0x5, 0x23, 0xfb, 0xd9, 0x27, 0xa, 0x7c, 0xc2, 0xf7, 0x34, 0xc4, 0xf7, + 0x2c, 0xc4, 0xf7, 0x18, 0xc3, 0x1, 0xc1, 0xc5, 0xf8, 0xb, 0xc6, 0x3, + 0xf7, 0x3b, 0xf8, 0x86, 0x15, 0xb1, 0x79, 0xf7, 0x41, 0xf7, 0xa, 0xf7, + 0xf, 0xfb, 0xa, 0xb8, 0x9d, 0xfb, 0x9, 0xf7, 0x30, 0x89, 0xa, 0xfb, + 0x7b, 0xfc, 0x59, 0x27, 0xa, 0x7c, 0xbd, 0xf7, 0x38, 0xc5, 0xf7, 0x32, + 0x76, 0xf7, 0x1c, 0xf7, 0x7, 0x1, 0xc1, 0xc5, 0xf7, 0x16, 0xe3, 0xcc, + 0xe2, 0x90, 0xc6, 0x3, 0xf8, 0x1f, 0xf8, 0xa6, 0x15, 0xe2, 0x6e, 0xa, + 0x33, 0x6, 0xfb, 0x45, 0xfb, 0x7, 0x15, 0xe3, 0x6e, 0xa, 0x33, 0x6, + 0xfb, 0x29, 0xfc, 0x50, 0x27, 0xa, 0x6f, 0xa, 0xf7, 0x7f, 0x77, 0x1, + 0xf7, 0x82, 0xf8, 0xe8, 0x15, 0xf7, 0x93, 0x25, 0x9c, 0xab, 0xfb, 0x75, + 0xf7, 0x26, 0x5, 0xfb, 0x61, 0xfd, 0x34, 0x33, 0xa, 0x6f, 0xa, 0xf7, + 0x7f, 0x77, 0x1, 0xdb, 0x16, 0xf8, 0x13, 0x46, 0xa, 0xfb, 0x3a, 0x6, + 0xd2, 0xf8, 0x12, 0x5, 0xfb, 0x4f, 0x67, 0xa, 0xf7, 0x1b, 0x6, 0x4e, + 0xfb, 0xdb, 0x5, 0xfb, 0x3b, 0x6, 0xf7, 0x2f, 0xf8, 0x4b, 0x15, 0xf7, + 0xa7, 0xf1, 0x70, 0xd7, 0xfb, 0x9d, 0xfb, 0x26, 0x5, 0xe, 0x6f, 0xa, + 0xf7, 0x6d, 0x77, 0x1, 0xf7, 0x36, 0xf8, 0x86, 0x15, 0xaf, 0x79, 0xf7, + 0x3c, 0xf7, 0xa, 0xf7, 0x9, 0xfb, 0xa, 0xb8, 0x9d, 0xfb, 0x5, 0xf7, + 0x30, 0x5, 0x3e, 0x6, 0xfb, 0x96, 0xfd, 0x22, 0x33, 0xa, 0x6f, 0xa, + 0xde, 0xf7, 0x7, 0x1, 0xf8, 0x2c, 0xf8, 0x9c, 0x15, 0xe4, 0x6e, 0xa, + 0x32, 0x6, 0xfb, 0x4b, 0xfb, 0x7, 0x15, 0xe6, 0x6e, 0xa, 0x31, 0x6, + 0xfb, 0x58, 0xfd, 0xf, 0x33, 0xa, 0x7c, 0xbe, 0xf7, 0xc6, 0xbf, 0xf7, + 0x7f, 0x77, 0x1, 0xaa, 0xc6, 0xf8, 0x2f, 0xce, 0x3, 0xf7, 0x9b, 0xf8, + 0x50, 0x15, 0xf7, 0x13, 0xc6, 0xd2, 0x5d, 0xad, 0x28, 0x8e, 0x7d, 0x19, + 0xaa, 0x69, 0x4c, 0x9e, 0x53, 0x1b, 0xfb, 0x66, 0x23, 0xfb, 0x11, 0xfb, + 0x11, 0x22, 0xe5, 0x55, 0xf7, 0x15, 0xf7, 0x6e, 0xef, 0xf7, 0x26, 0xf7, + 0x35, 0xd9, 0x6c, 0xef, 0x37, 0xcb, 0x1f, 0xf2, 0xbd, 0x78, 0xb8, 0xfb, + 0x18, 0x4b, 0x66, 0x9d, 0x62, 0xa2, 0x5d, 0x90, 0x19, 0x5e, 0x5d, 0xac, + 0x88, 0xaf, 0x79, 0xa9, 0x7f, 0x19, 0x31, 0x5f, 0x5, 0xfb, 0x2f, 0xfb, + 0xe7, 0x15, 0xf7, 0x7, 0xf7, 0x1, 0xd9, 0xf7, 0x11, 0x1e, 0x92, 0x6, + 0xf7, 0x18, 0xb1, 0x5c, 0x52, 0x22, 0xfb, 0xa, 0x2a, 0xfb, 0xe, 0x27, + 0x44, 0xb6, 0xd1, 0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0xc5, 0xc0, 0xdb, 0xbb, + 0x9b, 0xbf, 0x1, 0xea, 0xc3, 0xf7, 0xa9, 0xc3, 0x3, 0xf7, 0x45, 0xf8, + 0x96, 0x15, 0xbb, 0x7d, 0x5, 0x9a, 0x92, 0xb9, 0xbc, 0xaf, 0x1b, 0xaa, + 0x9b, 0x79, 0x7a, 0x9d, 0x1f, 0x7c, 0x9b, 0x9e, 0x7d, 0xae, 0x1b, 0xcb, + 0xc6, 0xb9, 0xc2, 0xa9, 0x1f, 0x59, 0x97, 0x5, 0x73, 0x7d, 0x5e, 0x62, + 0x65, 0x1b, 0x73, 0x7e, 0x9a, 0x9a, 0x7c, 0x1f, 0x9d, 0x7a, 0x78, 0x9f, + 0x62, 0x1b, 0x56, 0x4e, 0x65, 0x4b, 0x68, 0x1f, 0xfb, 0x46, 0xfc, 0x96, + 0x15, 0xf7, 0x76, 0x6, 0x97, 0xbf, 0x5, 0x35, 0x6, 0xbb, 0xf7, 0x7c, + 0x5, 0xb6, 0xc0, 0xda, 0xb7, 0xca, 0x1b, 0xb1, 0xbc, 0x82, 0x5f, 0x84, + 0x8b, 0x82, 0x89, 0x82, 0x1f, 0x58, 0xfb, 0x85, 0x5, 0x37, 0x82, 0xa, + 0xf7, 0x73, 0x6, 0x97, 0xbf, 0x5, 0x37, 0x6, 0xbd, 0xf7, 0x86, 0x5, + 0x8e, 0x98, 0x8d, 0x97, 0x96, 0x1a, 0xc5, 0x8c, 0x67, 0xae, 0x38, 0x1b, + 0x44, 0x3e, 0x65, 0x5f, 0x4d, 0x1f, 0x9a, 0xd0, 0x5, 0xfb, 0x21, 0x6, + 0x80, 0x56, 0x5, 0xe0, 0x6, 0x4b, 0xfb, 0xc5, 0x5, 0x36, 0x6, 0xe, + 0x5a, 0xa, 0xf7, 0x7d, 0xf8, 0xe7, 0x15, 0xf7, 0x93, 0x23, 0x9a, 0xaa, + 0xfb, 0x73, 0xf7, 0x2a, 0x5, 0xfb, 0x73, 0xfc, 0x90, 0x29, 0xa, 0xe, + 0x5a, 0xa, 0xc4, 0xf7, 0x38, 0x29, 0xa, 0xf7, 0x15, 0xf7, 0xcc, 0x15, + 0xf7, 0xba, 0xea, 0x7b, 0xe1, 0xfb, 0xb9, 0xfb, 0x2a, 0x5, 0xe, 0x5d, + 0xa, 0xf7, 0x62, 0x77, 0x49, 0xa, 0xf7, 0x43, 0xf8, 0x85, 0x15, 0xae, + 0x79, 0xf7, 0x38, 0xf7, 0xb, 0xf7, 0x8, 0xfb, 0xb, 0xb7, 0x9d, 0xfb, + 0x4, 0xf7, 0x31, 0x5, 0x3f, 0x6, 0xfb, 0xb5, 0xfc, 0x7e, 0x29, 0xa, + 0xe, 0x5d, 0xa, 0xc9, 0xbd, 0x9c, 0xbc, 0x49, 0xa, 0xf7, 0x2c, 0xf8, + 0xa1, 0x15, 0xbb, 0x80, 0x5, 0x9a, 0x91, 0xb6, 0xbb, 0xaf, 0x1b, 0xa3, + 0x9c, 0x7c, 0x7b, 0x9d, 0x1f, 0x7a, 0x9f, 0x9f, 0x78, 0xaa, 0x1b, 0xc8, + 0xc5, 0xbb, 0xc2, 0xa8, 0x1f, 0x5b, 0x94, 0x5, 0x73, 0x7d, 0x63, 0x65, + 0x67, 0x1b, 0x75, 0x7b, 0x99, 0x98, 0x7c, 0x1f, 0x9e, 0x75, 0x76, 0x9f, + 0x69, 0x1b, 0x59, 0x50, 0x67, 0x4a, 0x69, 0x1f, 0x2c, 0xfb, 0xfd, 0x29, + 0xa, 0xe, 0x5d, 0xa, 0xd3, 0xf7, 0x7, 0x49, 0xa, 0xf8, 0x11, 0xf8, + 0x9c, 0x15, 0xda, 0x6, 0xa3, 0xf7, 0x7, 0x89, 0xa, 0xfb, 0x38, 0xfb, + 0x7, 0x15, 0xdc, 0x6, 0xa2, 0xf7, 0x7, 0x5, 0x3a, 0x6, 0xfb, 0x62, + 0xfc, 0x6b, 0x29, 0xa, 0xe, 0xc6, 0x76, 0xf7, 0x55, 0xc6, 0xf7, 0x45, + 0x77, 0x1, 0xf7, 0xad, 0xf8, 0x2e, 0x6c, 0xa, 0x9f, 0x75, 0x71, 0x6f, + 0x70, 0x6d, 0x1e, 0xfb, 0x5c, 0xfb, 0x47, 0x15, 0xf8, 0x3e, 0x6, 0x96, + 0xc6, 0x5, 0xfc, 0x3e, 0x6, 0xf7, 0x1b, 0xfb, 0x64, 0x6c, 0xa, 0x9d, + 0x75, 0x71, 0x6f, 0x72, 0x6d, 0x1e, 0xe, 0x7f, 0xc3, 0x63, 0x76, 0xf8, + 0x2e, 0xc2, 0x8e, 0x77, 0x12, 0x13, 0x60, 0xa3, 0xa3, 0x15, 0xa7, 0x62, + 0xcb, 0xbe, 0x5, 0x13, 0x90, 0x69, 0xb1, 0xc0, 0x7f, 0xbd, 0x1b, 0xf7, + 0x14, 0xf7, 0xf, 0xdd, 0xf7, 0x29, 0xa6, 0x1f, 0x95, 0xbf, 0x86, 0xbf, + 0x72, 0xb1, 0xc8, 0xbc, 0x18, 0x6f, 0xb4, 0x4c, 0x58, 0x5, 0x13, 0xa0, + 0xac, 0x65, 0x5a, 0x9a, 0x53, 0x1b, 0xfb, 0x2d, 0x21, 0x22, 0xfb, 0x11, + 0x73, 0x1f, 0x82, 0x55, 0x91, 0x54, 0xa6, 0x65, 0x8, 0xdb, 0x8d, 0x15, + 0xf7, 0xc6, 0xf7, 0x8d, 0x9c, 0x6e, 0x8f, 0x66, 0x83, 0x65, 0x19, 0x7e, + 0x5d, 0x5, 0x68, 0x7d, 0x52, 0x2e, 0xfb, 0x18, 0x1b, 0x65, 0x66, 0x93, + 0xa0, 0x6f, 0x1f, 0x69, 0xb0, 0x15, 0x78, 0xa7, 0x86, 0xb3, 0x92, 0xb3, + 0x8, 0xf6, 0x9f, 0xea, 0xcf, 0xf3, 0x1b, 0xaa, 0xb6, 0x84, 0x72, 0xab, + 0x1f, 0xe, 0x4e, 0xa, 0xf7, 0x80, 0x77, 0x12, 0xe8, 0xc6, 0x13, 0xb8, + 0xf7, 0x75, 0xf8, 0xea, 0x15, 0xf7, 0x9c, 0x21, 0x9b, 0xad, 0xfb, 0x7c, + 0xf7, 0x26, 0x5, 0xfb, 0x65, 0xfb, 0xb8, 0x24, 0xa, 0x4e, 0xa, 0xf7, + 0x80, 0x77, 0x12, 0xdd, 0xc6, 0x13, 0xb8, 0xf7, 0x77, 0xf8, 0x81, 0x15, + 0xf7, 0xd4, 0xf3, 0x77, 0xd6, 0xfb, 0xc7, 0xfb, 0x20, 0x5, 0xfb, 0x3b, + 0xfb, 0x2c, 0x24, 0xa, 0x4e, 0xa, 0xf7, 0x82, 0x77, 0x12, 0xe8, 0xc6, + 0x13, 0xb8, 0xf7, 0x39, 0xf8, 0x98, 0x15, 0xaf, 0x7a, 0xf7, 0x3d, 0xf7, + 0xb, 0xf7, 0xc, 0xfb, 0xb, 0xb8, 0x9c, 0xfb, 0x7, 0xf7, 0x32, 0x5, + 0x3d, 0x6, 0xfb, 0xaa, 0xfb, 0xba, 0x24, 0xa, 0x4e, 0xa, 0xe8, 0xf7, + 0x8, 0x12, 0xe8, 0xc6, 0x13, 0xb8, 0xf8, 0x10, 0xf8, 0xa5, 0x15, 0xdc, + 0x6, 0xa3, 0xf7, 0x8, 0x6b, 0xa, 0xfb, 0x3d, 0xfb, 0x8, 0x15, 0xdf, + 0x6, 0xa2, 0xf7, 0x8, 0x7b, 0xa, 0xfb, 0x56, 0xfb, 0x9d, 0x24, 0xa, + 0xfb, 0x31, 0xc1, 0xf8, 0x72, 0xc1, 0x1, 0xe0, 0xcb, 0xf7, 0xf6, 0xcb, + 0x3, 0xf7, 0x70, 0xf8, 0x89, 0x15, 0xf7, 0xdb, 0xef, 0x76, 0xd2, 0xfb, + 0xcc, 0xfb, 0x20, 0x5, 0xfb, 0x89, 0xfd, 0xf, 0x15, 0x7f, 0x55, 0x5, + 0xf7, 0xa3, 0x2a, 0xa, 0x31, 0x6, 0xf8, 0x36, 0xf8, 0x72, 0x5, 0xce, + 0x4d, 0xa, 0xfb, 0x52, 0x5f, 0xa, 0xc6, 0x6, 0xfb, 0x82, 0xfb, 0xa1, + 0x26, 0xf7, 0xa1, 0x5, 0xcf, 0x4d, 0xa, 0xfb, 0x5f, 0x2d, 0xa, 0xd3, + 0x6, 0xf7, 0xf, 0xfb, 0xd6, 0xfb, 0x1e, 0xfb, 0x30, 0x5, 0xe, 0xfb, + 0x31, 0xc0, 0xf7, 0xc, 0xc1, 0xf7, 0xe1, 0xc1, 0xf7, 0xb, 0xc0, 0x1, + 0xdc, 0xc2, 0xf8, 0x3a, 0xc4, 0x3, 0x88, 0x23, 0x15, 0x80, 0x56, 0x5, + 0xf7, 0xba, 0x80, 0xa, 0xfb, 0x2f, 0x6, 0xb6, 0xf7, 0x64, 0x5, 0x65, + 0xa3, 0xb9, 0x59, 0xe7, 0x1b, 0xf7, 0x22, 0xf7, 0x18, 0xf7, 0x11, 0xf7, + 0x2a, 0xf3, 0x37, 0xc9, 0x2c, 0x34, 0x49, 0x71, 0x5e, 0x5e, 0x1f, 0xbc, + 0xf7, 0x87, 0x5, 0xfb, 0x1e, 0x6, 0x7f, 0x56, 0x5, 0xdf, 0x6, 0xfb, + 0x20, 0xfd, 0x3c, 0x5, 0xf7, 0x17, 0xf7, 0xf3, 0x15, 0xe2, 0x9d, 0xdb, + 0xd0, 0xf7, 0x1, 0x1b, 0xf7, 0x5, 0xa5, 0x3c, 0x52, 0xfb, 0xa, 0xfb, + 0xf, 0x3c, 0x34, 0x2d, 0x4c, 0xd8, 0xef, 0xa0, 0x1f, 0xe, 0xfb, 0x31, + 0xbd, 0xf8, 0x64, 0xbc, 0xd8, 0xf7, 0x4, 0x1, 0xf8, 0x15, 0xf8, 0x81, + 0x15, 0xe3, 0x6, 0xa4, 0xf7, 0x4, 0x5, 0x33, 0x6, 0xfb, 0x4b, 0xfb, + 0x4, 0x15, 0xe6, 0x6, 0xa4, 0xf7, 0x4, 0x5, 0x31, 0x6, 0xfb, 0xb0, + 0xfd, 0x5c, 0x15, 0x7f, 0x59, 0x5, 0xf7, 0xa2, 0x6, 0x97, 0xbd, 0x5, + 0x30, 0x6, 0xf8, 0x36, 0xf8, 0x64, 0x5, 0xce, 0x6, 0x96, 0xbc, 0x5, + 0xfb, 0x51, 0x6, 0x7f, 0x5a, 0x5, 0xc6, 0x6, 0xfb, 0x80, 0xfb, 0x97, + 0x24, 0xf7, 0x97, 0x5, 0xd0, 0x6, 0x95, 0xbc, 0x5, 0xfb, 0x5f, 0x6, + 0x81, 0x5a, 0x5, 0xd2, 0x6, 0xf7, 0xf, 0xfb, 0xc8, 0xfb, 0x1e, 0xfb, + 0x30, 0x5, 0xe, 0x8b, 0xc1, 0xf8, 0x3e, 0xc2, 0xcf, 0xf7, 0x5, 0x1, + 0xaf, 0x16, 0x44, 0xa, 0xf8, 0x3e, 0x37, 0xa, 0xfc, 0x3e, 0x5, 0xfb, + 0x45, 0x6, 0xf7, 0xa8, 0xf8, 0xb9, 0x15, 0xe6, 0x6, 0xa4, 0xf7, 0x5, + 0x5, 0x31, 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd2, 0xc1, 0x1, 0xf7, 0xab, + 0xc3, 0x3, 0xe5, 0x16, 0xf8, 0x2d, 0x2a, 0xa, 0xfb, 0x43, 0x6, 0xd4, + 0xf8, 0x8, 0x5, 0xfb, 0x5b, 0x5f, 0xa, 0xf7, 0x24, 0x6, 0x4b, 0xfb, + 0xd2, 0x5, 0xfb, 0x46, 0x6, 0xe, 0x7a, 0xc1, 0x69, 0x76, 0xf8, 0xa2, + 0xc1, 0x12, 0xf7, 0x23, 0xc6, 0xf7, 0xd5, 0xc1, 0x13, 0xb8, 0x68, 0x7a, + 0x15, 0xf7, 0x56, 0x47, 0xa, 0x49, 0x6, 0xec, 0xf8, 0x6b, 0x5, 0xc9, + 0x47, 0xa, 0xfb, 0x4e, 0x45, 0xa, 0xcc, 0x6, 0x2a, 0xfc, 0x6b, 0x5, + 0x46, 0x6, 0xf7, 0x92, 0xa0, 0x15, 0x13, 0x78, 0x67, 0xa3, 0xa8, 0x63, + 0xce, 0x1b, 0xf7, 0x13, 0x98, 0x7c, 0xa, 0xba, 0x36, 0xa, 0xfb, 0x66, + 0x38, 0xa, 0xf7, 0x1, 0x6, 0x4b, 0xfb, 0xdc, 0x5, 0x3a, 0x7b, 0x88, + 0x4d, 0x36, 0x1b, 0x71, 0x5b, 0x91, 0xf7, 0xe, 0xa2, 0x1f, 0x9a, 0xe6, + 0x71, 0xa, 0xe, 0xfb, 0x31, 0xc1, 0xf8, 0x84, 0xc4, 0xe4, 0xf7, 0xa, + 0x1, 0xf8, 0x7f, 0xf8, 0xaf, 0x54, 0xa, 0xfb, 0xa2, 0xfd, 0xb2, 0x15, + 0x81, 0xa8, 0xa1, 0x85, 0xa8, 0x1b, 0xf6, 0x92, 0xb6, 0xf7, 0x12, 0xad, + 0x1f, 0xea, 0xf8, 0x45, 0x5, 0xfb, 0x25, 0x82, 0xa, 0xdf, 0x6, 0x39, + 0xfc, 0x3, 0x74, 0x2e, 0x83, 0x69, 0x5c, 0x89, 0x19, 0x6c, 0x8a, 0x7c, + 0x91, 0x73, 0x92, 0x8, 0xfb, 0x93, 0x81, 0x15, 0x80, 0x55, 0x5, 0xf7, + 0x3c, 0x6, 0x98, 0xc1, 0x5, 0x4e, 0x6, 0xf7, 0x1, 0xf8, 0x84, 0x5, + 0xc3, 0x46, 0xa, 0xfb, 0x3e, 0x38, 0xa, 0xc1, 0x6, 0xfb, 0x1, 0xfc, + 0x84, 0x5, 0xf7, 0x17, 0xf9, 0x14, 0x54, 0xa, 0xe, 0x3e, 0xa, 0x9f, + 0x16, 0xf8, 0x91, 0x6, 0xbe, 0xf7, 0x91, 0x71, 0xa, 0x5f, 0xfb, 0x5b, + 0x5, 0xfb, 0xb2, 0x6, 0xb0, 0xf7, 0x4e, 0xf7, 0x53, 0xd1, 0x96, 0xc2, + 0xfb, 0x53, 0x44, 0xb6, 0xf7, 0x6a, 0x5, 0xf7, 0x13, 0x2a, 0xa, 0xfb, + 0xb6, 0x45, 0xa, 0xf7, 0x0, 0x6, 0x5c, 0xfb, 0x80, 0x30, 0x69, 0x80, + 0x55, 0xe6, 0xad, 0x6b, 0xfb, 0x38, 0x57, 0xa, 0xe, 0x8b, 0xc2, 0xf8, + 0x9b, 0xc2, 0x1, 0xc3, 0x16, 0xf8, 0x57, 0x6, 0x98, 0xc2, 0x5, 0xfb, + 0x56, 0x6, 0xbf, 0xf7, 0x89, 0xf7, 0x2e, 0xc0, 0x97, 0xc2, 0xfb, 0x2d, + 0x56, 0xc5, 0xf7, 0xa6, 0x5, 0xfb, 0x90, 0x56, 0xa, 0xf7, 0x53, 0x6, + 0x58, 0xfb, 0x85, 0xfb, 0x33, 0x55, 0x80, 0x55, 0xf7, 0x32, 0xc0, 0x59, + 0xfb, 0x73, 0x5, 0xfb, 0x57, 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0xc2, + 0xf7, 0x5c, 0xc1, 0x1, 0x85, 0xc3, 0x3, 0xf7, 0xc2, 0xc1, 0x15, 0xb2, + 0xf7, 0x5b, 0x5, 0xda, 0x60, 0xa, 0xc1, 0x6, 0xac, 0xf7, 0x3a, 0x5, + 0x55, 0x38, 0xa, 0x3c, 0x6, 0xb2, 0xf7, 0x5c, 0x5, 0xf7, 0x2a, 0x6, + 0x78, 0x27, 0x6a, 0xa, 0xa9, 0xf7, 0x2e, 0x5, 0xfb, 0xa5, 0x6, 0xfb, + 0x3f, 0xfb, 0x3d, 0xfb, 0x21, 0xfb, 0x6a, 0xfb, 0x3, 0xc3, 0x2b, 0xf7, + 0x32, 0x1f, 0xf7, 0xb5, 0x6, 0xaa, 0xf7, 0x2c, 0x52, 0xa, 0x77, 0x29, + 0x5, 0xfb, 0x62, 0x16, 0xfb, 0x25, 0x57, 0xc9, 0xf2, 0xf7, 0x3e, 0xf7, + 0x2c, 0xf7, 0xc, 0xf7, 0x1a, 0x8a, 0x1f, 0xe, 0x7c, 0xc2, 0xf7, 0x38, + 0xc1, 0xf7, 0x14, 0xc2, 0x1, 0x9e, 0xc2, 0xf7, 0x65, 0xba, 0xf7, 0x57, + 0xc2, 0x3, 0xf7, 0xad, 0xd3, 0x15, 0x57, 0x9b, 0xaa, 0x68, 0xd5, 0x1b, + 0xb6, 0xba, 0x97, 0x96, 0xb2, 0x1f, 0xc2, 0x7, 0x82, 0x6d, 0x62, 0x7d, + 0x68, 0x1b, 0x4c, 0x64, 0xad, 0xd6, 0x99, 0x8e, 0xa5, 0x8f, 0x9a, 0x1f, + 0xf7, 0x80, 0x6, 0x94, 0xaa, 0x90, 0xa2, 0xae, 0x1a, 0xd6, 0x78, 0xd4, + 0x36, 0x46, 0x5f, 0x5a, 0x6d, 0x76, 0x1e, 0xba, 0x80, 0x69, 0xab, 0x4b, + 0x1b, 0xfb, 0x2f, 0x50, 0xfb, 0x5c, 0xfb, 0x11, 0xfb, 0xc, 0xe3, 0x80, + 0xa8, 0xe3, 0xb7, 0xcb, 0xa2, 0x98, 0x1f, 0xc7, 0xf7, 0x4e, 0x15, 0xcb, + 0x9b, 0xbe, 0xcb, 0xc7, 0x1b, 0xd1, 0x82, 0x3d, 0x59, 0x87, 0x1f, 0xfc, + 0x57, 0xfb, 0xf, 0x15, 0xe9, 0xbe, 0xf7, 0x31, 0xec, 0xe2, 0x7e, 0x29, + 0x4c, 0x7e, 0x1e, 0x47, 0x7f, 0x75, 0xfb, 0x9, 0x23, 0x1b, 0x4d, 0x82, + 0xbc, 0xb9, 0x1f, 0xe, 0xfb, 0x16, 0x76, 0xf7, 0x70, 0xc6, 0xf7, 0x36, + 0xc4, 0xf7, 0x3a, 0xc8, 0x91, 0x77, 0x12, 0xeb, 0xce, 0xf7, 0xd0, 0xcf, + 0x13, 0xf6, 0x98, 0xcf, 0x15, 0xcc, 0x6, 0x97, 0xc7, 0xba, 0x75, 0xb8, + 0x6c, 0xd8, 0x85, 0x19, 0x78, 0x38, 0x5, 0x90, 0x94, 0x95, 0x8c, 0x94, + 0x1b, 0x9b, 0x98, 0x80, 0x7d, 0x7d, 0x84, 0x6d, 0x68, 0x7a, 0x79, 0x8f, + 0x94, 0x7f, 0x1f, 0x6c, 0x50, 0x5, 0x82, 0x91, 0xa6, 0x78, 0xad, 0x1b, + 0xbb, 0xc9, 0xb5, 0xe1, 0xa6, 0x7e, 0xaf, 0x73, 0x96, 0x1f, 0x8e, 0x9d, + 0x5, 0xf7, 0x20, 0x91, 0xe2, 0xba, 0xf6, 0x1a, 0xcf, 0x3c, 0xb8, 0x34, + 0x90, 0x1e, 0x3c, 0x8f, 0xfb, 0x1f, 0x7f, 0xe5, 0x1a, 0xc7, 0xf7, 0xc, + 0xa3, 0xbc, 0xcc, 0xc8, 0x73, 0x6e, 0xb7, 0x1e, 0x7e, 0x52, 0x5, 0xc9, + 0x6, 0x13, 0xee, 0xaf, 0xf7, 0x45, 0x5, 0x4d, 0x6, 0x82, 0x54, 0x5, + 0x13, 0xf6, 0xa8, 0x5b, 0x4e, 0x9f, 0x4a, 0x1b, 0xfb, 0x16, 0xfb, 0x8, + 0x50, 0x30, 0xfb, 0x16, 0xf7, 0x1f, 0x8b, 0xf3, 0x87, 0x1f, 0xdf, 0x88, + 0xc3, 0x75, 0x5a, 0x1a, 0x35, 0xfb, 0x22, 0x89, 0x56, 0x40, 0x53, 0xad, + 0xb4, 0x5b, 0x1e, 0x96, 0xc0, 0x5, 0x4b, 0x6, 0xe, 0xfb, 0x16, 0x76, + 0xf7, 0x47, 0xba, 0xf7, 0x17, 0xb9, 0xf7, 0x1b, 0xbd, 0x8f, 0x77, 0x12, + 0xf7, 0xa, 0xc8, 0xf7, 0xac, 0xc7, 0x13, 0xf6, 0xba, 0xa6, 0x15, 0xc2, + 0x6, 0x96, 0xbb, 0xb5, 0x7a, 0xb5, 0x76, 0xcd, 0x82, 0x19, 0x7b, 0x47, + 0x5, 0x8e, 0x92, 0x92, 0x8d, 0x92, 0x1b, 0x9a, 0x99, 0x82, 0x7f, 0x80, + 0x85, 0x73, 0x6c, 0x7c, 0x7b, 0x8e, 0x92, 0x80, 0x1f, 0x70, 0x5c, 0x5, + 0x83, 0x90, 0xa3, 0x7c, 0xa9, 0x1b, 0xb5, 0xc2, 0xac, 0xd0, 0x1f, 0x8a, + 0xa1, 0x81, 0xaa, 0x76, 0x94, 0x8d, 0x9a, 0x18, 0xf7, 0x11, 0x90, 0xd8, + 0xb0, 0xe2, 0x1a, 0x8c, 0xc2, 0x44, 0xaf, 0x3d, 0x8f, 0x8, 0x45, 0x8e, + 0xfb, 0xe, 0x82, 0xd4, 0x1a, 0xbc, 0xf5, 0x9e, 0xb6, 0xc4, 0xc2, 0x78, + 0x73, 0xb2, 0x1e, 0x80, 0x5d, 0x5, 0xc1, 0x6, 0x13, 0xee, 0xaa, 0xf7, + 0x23, 0x5, 0x55, 0x6, 0x83, 0x5f, 0x5, 0x13, 0xf6, 0xa2, 0x61, 0x54, + 0x9c, 0x52, 0x1b, 0xfb, 0x7, 0x23, 0x5b, 0x41, 0x21, 0xf7, 0x10, 0x8b, + 0xe7, 0x88, 0x1f, 0xd5, 0x89, 0xbe, 0x79, 0x63, 0x1a, 0x46, 0xfb, 0x13, + 0x89, 0x5c, 0x49, 0x59, 0xa7, 0xac, 0x60, 0x1e, 0x95, 0xb6, 0x62, 0xa, + 0xe, 0x77, 0xc2, 0xf8, 0x7d, 0xc2, 0x8b, 0xb9, 0xf7, 0x48, 0x77, 0x12, + 0xf4, 0xc7, 0xf7, 0xa7, 0xc8, 0x17, 0x8c, 0x81, 0x15, 0xc4, 0x78, 0xa, + 0x5f, 0xc1, 0xe9, 0x7a, 0xb9, 0x1b, 0xf7, 0x9, 0xf7, 0xd, 0xae, 0xf7, + 0x21, 0xe6, 0x38, 0xa8, 0x3a, 0x9f, 0x1f, 0x45, 0x9c, 0x25, 0x98, 0xde, + 0x1a, 0xd7, 0xcd, 0xb2, 0xee, 0xc1, 0xcf, 0x71, 0x68, 0xab, 0x1e, 0x7a, + 0x3a, 0x5, 0xc6, 0x6, 0xad, 0xf7, 0x50, 0x71, 0xa, 0x83, 0x63, 0x5, + 0x13, 0xfc, 0xa7, 0x69, 0x45, 0xa0, 0x56, 0x1b, 0xfb, 0x33, 0x40, 0x4c, + 0xfb, 0x3, 0xfb, 0xf, 0xf7, 0x10, 0x74, 0xdc, 0x79, 0x1f, 0xce, 0x7d, + 0xca, 0x6c, 0x61, 0x1a, 0x49, 0x4e, 0x56, 0xfb, 0x6, 0x4a, 0x3e, 0xa7, + 0xb3, 0x60, 0x1e, 0x99, 0xd1, 0x62, 0xa, 0xf7, 0xbb, 0xf8, 0x58, 0x15, + 0xde, 0x6, 0xf7, 0x4b, 0xf7, 0x36, 0x62, 0x9d, 0xfb, 0x3c, 0xfb, 0xd, + 0xfb, 0x1b, 0xf7, 0xd, 0x5d, 0x78, 0x5, 0xe, 0x7c, 0xc2, 0x8b, 0xf7, + 0x25, 0x8b, 0xbf, 0x8b, 0xf7, 0x2a, 0x8b, 0xc2, 0x8b, 0xbc, 0xf7, 0x46, + 0x77, 0x1, 0xf3, 0xc4, 0xf7, 0xa5, 0xc6, 0x3, 0xf7, 0xc5, 0xf8, 0x7f, + 0x85, 0xa, 0xf7, 0x49, 0xf7, 0x32, 0x64, 0x9f, 0xfb, 0x3d, 0xfb, 0x4, + 0xfb, 0x17, 0xf7, 0x3, 0x5e, 0x77, 0x5, 0xfb, 0x2c, 0xfd, 0x2b, 0x15, + 0xc3, 0x36, 0xa, 0x74, 0xb8, 0xb5, 0x6b, 0xdd, 0x1b, 0xf7, 0x1e, 0xe2, + 0xb5, 0xf2, 0x1f, 0x8c, 0xc8, 0x46, 0xb5, 0x40, 0x8f, 0x8, 0x47, 0x8f, + 0xfb, 0xd, 0x80, 0xdc, 0x1a, 0xc1, 0xf3, 0xa1, 0xb6, 0xc3, 0xbf, 0x75, + 0x70, 0xb1, 0x1e, 0x80, 0x58, 0x5, 0xc1, 0x6, 0xab, 0xf7, 0x34, 0x5, + 0x55, 0x6, 0x82, 0x59, 0x5, 0xa6, 0x62, 0x57, 0x9d, 0x52, 0x1b, 0xfb, + 0x4, 0x27, 0x56, 0x38, 0xfb, 0x9, 0xf7, 0xc, 0x8b, 0xe5, 0x87, 0x1f, + 0xd4, 0x88, 0xba, 0x78, 0x5f, 0x1a, 0x3e, 0xfb, 0xe, 0x89, 0x5d, 0x4a, + 0x5b, 0xa8, 0xb1, 0x62, 0x1e, 0x94, 0xbc, 0x52, 0xa, 0xe, 0x8b, 0xc1, + 0xf8, 0x5d, 0xc1, 0xee, 0xf7, 0x9, 0x1, 0xf7, 0xfb, 0xf9, 0x2c, 0x15, + 0xe2, 0x6, 0xa4, 0xf7, 0x9, 0x5, 0x35, 0x6, 0xfb, 0x44, 0xfb, 0x9, + 0x15, 0xe0, 0x6, 0xa6, 0xf7, 0x9, 0x5, 0x34, 0x6, 0xfb, 0x55, 0xfd, + 0xa1, 0x15, 0x31, 0xa, 0xe, 0x8b, 0xc2, 0xf8, 0x63, 0xc2, 0x8b, 0xc1, + 0x8b, 0xc5, 0x1, 0xf7, 0x6, 0xc3, 0xf7, 0xa1, 0xc0, 0x3, 0xa0, 0x16, + 0xf8, 0x41, 0x6, 0xb5, 0xf7, 0x63, 0x5, 0x56, 0x6, 0x6b, 0xfb, 0x2c, + 0x5, 0xfb, 0xc4, 0x6, 0xf8, 0x4f, 0xf8, 0x66, 0x95, 0xbf, 0x5, 0xfc, + 0x26, 0x6, 0x63, 0xfb, 0x55, 0x51, 0xa, 0xa9, 0xf7, 0x1e, 0x5, 0xf7, + 0xa5, 0x6, 0xfc, 0x4e, 0xfc, 0x64, 0x5, 0xf7, 0xbd, 0xf8, 0xd1, 0x48, + 0xa, 0x8b, 0xc2, 0xf7, 0xd8, 0xc2, 0x8b, 0xc3, 0xf7, 0x47, 0x77, 0x12, + 0xf7, 0xc4, 0xf8, 0x7e, 0x4c, 0xa, 0xfb, 0x28, 0xfd, 0x1c, 0x15, 0xf8, + 0x2b, 0x6, 0xaa, 0xf7, 0x31, 0x52, 0xa, 0x77, 0x25, 0x5, 0xfb, 0xa7, + 0x6, 0xf8, 0x1d, 0xf7, 0xdc, 0x95, 0xbe, 0x5, 0x13, 0x60, 0xfc, 0x1a, + 0x6, 0x6d, 0xfb, 0x2e, 0x5, 0xc1, 0x6, 0x9f, 0xee, 0x5, 0xf7, 0x95, + 0x6, 0xfc, 0x1c, 0xfb, 0xdb, 0x5, 0xe, 0xfb, 0x23, 0xc6, 0xf8, 0x4f, + 0xc5, 0xf7, 0x2d, 0xbf, 0x1, 0x7f, 0x37, 0x15, 0x67, 0x50, 0x5, 0xf7, + 0x75, 0x9f, 0xb3, 0xf7, 0x19, 0xbd, 0x1f, 0xf7, 0x11, 0xf7, 0xdd, 0x5, + 0xf7, 0x2, 0x6, 0x9e, 0xc5, 0x57, 0xa, 0xf7, 0x8, 0xba, 0x97, 0xb0, + 0xf2, 0x1b, 0x9e, 0x9f, 0x88, 0x8a, 0x9e, 0x1f, 0xaf, 0xc3, 0x5, 0x61, + 0x65, 0x8b, 0x6e, 0x1b, 0xfb, 0x1f, 0x80, 0x4b, 0xfb, 0x21, 0x55, 0x1f, + 0xfb, 0x5, 0x6, 0x7a, 0x51, 0x5, 0xf7, 0x0, 0x6, 0xfb, 0xf, 0xfb, + 0xd7, 0x5, 0x20, 0x63, 0x55, 0x7e, 0xfb, 0x1, 0x1b, 0xe, 0x79, 0xc2, + 0x8b, 0xf7, 0x39, 0x8b, 0xc2, 0xf7, 0xa0, 0xc2, 0x8b, 0xba, 0xf7, 0x46, + 0x77, 0x12, 0x9e, 0xc4, 0x17, 0x34, 0xa, 0x13, 0xfe, 0x3d, 0xa, 0xa8, + 0xf8, 0x6, 0x48, 0xa, 0xfb, 0x31, 0xbd, 0x8b, 0xf7, 0x38, 0x8b, 0xbe, + 0xf7, 0xae, 0xbe, 0x8b, 0xbc, 0xf7, 0x47, 0x77, 0x12, 0xab, 0xc3, 0x17, + 0x3f, 0xa, 0x13, 0xfe, 0x30, 0xa, 0xf7, 0x6f, 0xf7, 0xa0, 0x4c, 0xa, + 0xe, 0xf8, 0xe2, 0xcb, 0x1, 0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7, 0x10, + 0xf8, 0x83, 0x15, 0xad, 0x79, 0xf7, 0x36, 0xf7, 0x5, 0xf7, 0x5, 0xfb, + 0x5, 0xb6, 0x9d, 0xfb, 0x1, 0xf7, 0x33, 0x5, 0x40, 0x6, 0xe, 0xf8, + 0x80, 0xc9, 0x1, 0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7, 0x7f, 0xf8, 0x80, + 0x15, 0xd5, 0x6, 0xf7, 0x3b, 0xf7, 0x31, 0x67, 0x9f, 0xfb, 0x32, 0xfb, + 0x7, 0xfb, 0x9, 0xf7, 0x6, 0x62, 0x77, 0x5, 0xe, 0xf8, 0x89, 0xb2, + 0x1, 0xf7, 0x2b, 0xf7, 0xbd, 0x3, 0xf7, 0x2b, 0xf8, 0xf5, 0x15, 0x3c, + 0xa1, 0xbf, 0x6e, 0xc4, 0x1b, 0xd7, 0xc8, 0xbc, 0xc6, 0xa8, 0x1f, 0x60, + 0x6, 0x6d, 0x7b, 0x5c, 0x64, 0x55, 0x1b, 0x60, 0x64, 0xa5, 0xb6, 0x80, + 0x1f, 0xe, 0xf8, 0x71, 0xf2, 0x1, 0xf7, 0x8b, 0xf8, 0x71, 0x15, 0xde, + 0x6, 0xa2, 0xf2, 0x7b, 0xa, 0xe, 0xf8, 0x63, 0xbe, 0xca, 0xbd, 0x1, + 0xf7, 0x6c, 0xbe, 0xcd, 0xbe, 0x3, 0xf7, 0x6c, 0xf8, 0xa3, 0x15, 0x67, + 0xa6, 0x6f, 0xb4, 0xbf, 0xbb, 0xb9, 0xbf, 0xb1, 0x6f, 0xa7, 0x62, 0x57, + 0x5c, 0x5c, 0x56, 0x1e, 0xbe, 0x96, 0x15, 0xa0, 0x9d, 0x9d, 0x9f, 0x9b, + 0x97, 0x81, 0x7d, 0x77, 0x79, 0x78, 0x76, 0x7b, 0x80, 0x96, 0x98, 0x1e, + 0xe, 0xfb, 0x28, 0xbf, 0xeb, 0x77, 0x1, 0xf7, 0x79, 0xcc, 0x3, 0xf7, + 0xc4, 0x16, 0x64, 0x78, 0x67, 0x65, 0x61, 0x1a, 0x6f, 0x9d, 0x76, 0xae, + 0xa0, 0xa1, 0x92, 0x99, 0x9f, 0x1e, 0x9b, 0xc2, 0x5, 0x7d, 0x83, 0x73, + 0x81, 0x7a, 0x1b, 0x81, 0x83, 0x90, 0x96, 0xb2, 0xbd, 0xa5, 0xa5, 0x9a, + 0x1f, 0xe, 0xf8, 0x7d, 0xbd, 0x9d, 0xbc, 0x1, 0xe6, 0xf8, 0x8c, 0x15, + 0xbc, 0x80, 0x5, 0x9a, 0x92, 0xae, 0xbc, 0xae, 0x1b, 0xa5, 0x9f, 0x78, + 0x79, 0xa2, 0x1f, 0x7b, 0x9f, 0xa1, 0x7c, 0xa9, 0x1b, 0xc9, 0xc5, 0xbb, + 0xc3, 0xa9, 0x1f, 0x5a, 0x95, 0x5, 0x71, 0x7d, 0x5d, 0x65, 0x67, 0x1b, + 0x75, 0x7b, 0x99, 0x9b, 0x78, 0x1f, 0x9d, 0x76, 0x73, 0x9e, 0x6a, 0x1b, + 0x58, 0x58, 0x67, 0x49, 0x68, 0x1f, 0xe, 0x65, 0xa, 0xf7, 0xa5, 0xf8, + 0x99, 0x15, 0xad, 0x77, 0xf7, 0x52, 0xf7, 0x22, 0x55, 0xac, 0x5, 0xfb, + 0xe8, 0xfb, 0x2f, 0x15, 0xad, 0x77, 0xf7, 0x56, 0xf7, 0x22, 0x52, 0xac, + 0x5, 0xe, 0xf7, 0x7b, 0xc1, 0x1, 0xd0, 0xf7, 0x7b, 0x15, 0xf8, 0x57, + 0x2a, 0xa, 0xfc, 0x57, 0x6, 0xe, 0xf7, 0x7b, 0xc1, 0x1, 0x85, 0xf7, + 0x7b, 0x15, 0xf8, 0xed, 0x2a, 0xa, 0xfc, 0xed, 0x6, 0xe, 0xf7, 0xbb, + 0xc9, 0x3, 0xf7, 0xbb, 0xf7, 0xdc, 0x15, 0xc9, 0x6, 0x72, 0x64, 0xa, + 0x32, 0x6, 0xe, 0xf8, 0xc6, 0x77, 0x1, 0xf7, 0x56, 0xc9, 0x3, 0xf7, + 0x56, 0xf7, 0xdc, 0x15, 0xc9, 0x6, 0xf7, 0x2a, 0x64, 0xa, 0x30, 0x6, + 0xe, 0xef, 0x77, 0x1, 0xf7, 0x56, 0xca, 0x3, 0xf7, 0x56, 0xfb, 0x1a, + 0x15, 0xca, 0x75, 0xa, 0xf8, 0xc6, 0x77, 0x1, 0xf7, 0x68, 0xc9, 0xf4, + 0xc7, 0x3, 0xf8, 0xf, 0xf7, 0xdc, 0x15, 0xc7, 0x6, 0x72, 0x64, 0xa, + 0x32, 0x6, 0xfb, 0x5, 0xfb, 0x7e, 0x15, 0xc9, 0x6, 0x73, 0x64, 0xa, + 0x31, 0x6, 0xe, 0xf8, 0xc6, 0x74, 0xa, 0xf7, 0xdc, 0x15, 0xc7, 0x6, + 0xf7, 0x21, 0x64, 0xa, 0x35, 0x6, 0xfb, 0xa9, 0xfb, 0x7e, 0x15, 0xc6, + 0x6, 0xf7, 0x23, 0x64, 0xa, 0x35, 0x6, 0xe, 0xef, 0x74, 0xa, 0xfb, + 0x1a, 0x15, 0xc7, 0x6, 0xf7, 0x21, 0x64, 0xa, 0x34, 0x6, 0xfb, 0xa8, + 0xfb, 0x7e, 0x15, 0xc6, 0x6, 0xf7, 0x22, 0x64, 0xa, 0x34, 0x6, 0xe, + 0xf7, 0xfb, 0xc6, 0xf7, 0x36, 0x77, 0x1, 0xf7, 0x40, 0xc6, 0x3, 0xf7, + 0x40, 0x3d, 0x15, 0xc6, 0x6, 0xe5, 0xf8, 0x4f, 0x5, 0xf7, 0x17, 0x6, + 0x97, 0xc0, 0x83, 0xa, 0xae, 0xf7, 0x36, 0x5, 0x50, 0x6, 0x69, 0xfb, + 0x36, 0x5, 0xfb, 0x14, 0x6, 0x80, 0x56, 0x5, 0xf7, 0x14, 0x6, 0xe, + 0xf2, 0xc6, 0xf7, 0x64, 0xc5, 0xf7, 0x2c, 0x77, 0x1, 0xec, 0xf2, 0x15, + 0xf7, 0x18, 0x6, 0x64, 0xfb, 0x49, 0x5, 0xcb, 0x6, 0xb2, 0xf7, 0x49, + 0x5, 0xf7, 0x18, 0x6, 0x97, 0xc6, 0x5, 0xfb, 0x17, 0x6, 0xb6, 0xf7, + 0x64, 0x5, 0xf7, 0x16, 0x6, 0x97, 0xc5, 0x5, 0xfb, 0x16, 0x6, 0xab, + 0xf7, 0x2c, 0x5, 0x4b, 0x6, 0x6b, 0xfb, 0x2c, 0x83, 0xa, 0x81, 0x51, + 0x5, 0xf7, 0x17, 0x6, 0x5f, 0xfb, 0x64, 0x83, 0xa, 0xe, 0xf7, 0x2b, + 0x76, 0xf7, 0x91, 0x77, 0x1, 0xf7, 0x3d, 0xf7, 0x7c, 0x15, 0x52, 0xb5, + 0x5e, 0xc9, 0xd7, 0xdc, 0xd2, 0xd9, 0xc6, 0x5f, 0xb8, 0x4c, 0x3c, 0x40, + 0x45, 0x3a, 0x1e, 0xe, 0x7c, 0xf7, 0x12, 0x1, 0xae, 0xf7, 0x15, 0xd2, + 0xf7, 0x15, 0xd2, 0xf7, 0x15, 0x14, 0x70, 0xf7, 0x7f, 0xb1, 0x15, 0x41, + 0xa, 0xfb, 0x5c, 0x16, 0x41, 0xa, 0xf8, 0x24, 0x16, 0x41, 0xa, 0xe, + 0x7c, 0xc2, 0xf7, 0x21, 0xc1, 0xf7, 0x1d, 0xc2, 0xf7, 0x21, 0xc1, 0x12, + 0xaa, 0xc4, 0xf7, 0x57, 0xc4, 0x77, 0xc4, 0xf7, 0x2a, 0xc4, 0x13, 0xfd, + 0xd7, 0xf8, 0x6e, 0x2e, 0xa, 0xfb, 0x5, 0xfb, 0x94, 0x15, 0xf8, 0x6c, + 0xf7, 0x38, 0x87, 0xc0, 0xfc, 0x6c, 0xfb, 0x3a, 0x5, 0x13, 0xfb, 0xf7, + 0xc4, 0xfb, 0x51, 0x2e, 0xa, 0xfb, 0xee, 0x84, 0x2e, 0xa, 0xe, 0xf8, + 0x52, 0x77, 0x1, 0xf7, 0x18, 0xe8, 0x3, 0xf7, 0x18, 0xf7, 0x95, 0x15, + 0xf7, 0x84, 0xfb, 0x4f, 0xa9, 0xba, 0xfb, 0x45, 0xf7, 0x1d, 0xf7, 0x87, + 0xf7, 0x1c, 0x82, 0xc3, 0x5, 0xe, 0xf8, 0x52, 0x77, 0x1, 0xf8, 0x6, + 0xed, 0x3, 0xf7, 0x21, 0xd1, 0x15, 0xf7, 0xdb, 0xf7, 0x4f, 0xfb, 0x84, + 0xf7, 0x51, 0x6c, 0x5c, 0xf7, 0x41, 0xfb, 0x1a, 0xfb, 0x82, 0xfb, 0x20, + 0x5, 0xe, 0x67, 0x76, 0xf9, 0x66, 0x77, 0x1, 0x9e, 0x6e, 0x15, 0xab, + 0x6f, 0xf8, 0xa6, 0xf9, 0x4a, 0x6b, 0xa7, 0x5, 0xe, 0x76, 0xc5, 0xf7, + 0x28, 0xc4, 0xdb, 0xc3, 0xf7, 0x43, 0xc5, 0x1, 0xf7, 0x36, 0xc1, 0x3, + 0xbb, 0xaa, 0x15, 0x9b, 0x57, 0x5, 0xa1, 0xc0, 0xe6, 0x93, 0x9b, 0x1b, + 0x9f, 0x9d, 0x87, 0x84, 0x9e, 0x1f, 0x83, 0x9e, 0xa0, 0x80, 0xa6, 0x53, + 0xa, 0x71, 0x79, 0x97, 0x93, 0x79, 0x1f, 0x93, 0x7a, 0x7a, 0x8e, 0x73, + 0x1b, 0x6e, 0x6d, 0x84, 0x80, 0x6e, 0x1f, 0xc8, 0xb0, 0x9f, 0xc2, 0x8e, + 0xb6, 0x8, 0xf7, 0x48, 0x6, 0x99, 0xc4, 0x5, 0xfb, 0x5c, 0x6, 0x8a, + 0x96, 0x8a, 0xae, 0x8a, 0xad, 0x8, 0xf7, 0x66, 0x6, 0x9b, 0xc3, 0x5, + 0xfb, 0x77, 0xa9, 0x6, 0x42, 0xa, 0x82, 0x8b, 0x7b, 0x8c, 0x78, 0x8, + 0x4a, 0x6, 0x7d, 0x53, 0x5, 0xdb, 0x6, 0x8c, 0x6a, 0x8d, 0x69, 0x8c, + 0x7e, 0x8, 0x29, 0x6, 0x7b, 0x52, 0x5, 0xf7, 0x8, 0x6, 0x55, 0x63, + 0x67, 0x3a, 0x4b, 0x1e, 0xe, 0x8b, 0xbf, 0xf7, 0x22, 0xbf, 0xc8, 0xbf, + 0xf7, 0x2b, 0xbf, 0x1, 0xe0, 0xc2, 0xf8, 0x8, 0xbe, 0x3, 0x89, 0xf7, + 0x56, 0x15, 0xd7, 0x6, 0xfb, 0x7, 0x90, 0xcf, 0x3c, 0xf7, 0x1f, 0x1b, + 0xd6, 0xda, 0xa7, 0xb5, 0xcd, 0x1f, 0x7d, 0xb7, 0x5, 0x67, 0x52, 0x45, + 0x71, 0x4a, 0x1b, 0x2c, 0x49, 0xb9, 0xeb, 0x81, 0x1f, 0xf7, 0x6b, 0x6, + 0xa7, 0xbf, 0x5, 0xfb, 0x87, 0x6, 0x8e, 0x9f, 0x8e, 0xa2, 0x90, 0x9d, + 0x8, 0xf7, 0x98, 0x6, 0xa9, 0xbf, 0x5, 0xfb, 0xa4, 0x6, 0xe5, 0xb4, + 0xdc, 0xc8, 0xe5, 0x1b, 0xcf, 0xc8, 0x73, 0x66, 0xa8, 0x1f, 0x7b, 0x3d, + 0x5, 0xbe, 0x6, 0xb2, 0xf7, 0x53, 0x5, 0x58, 0x6, 0x80, 0x59, 0x5, + 0xac, 0x63, 0x5b, 0x9c, 0x47, 0x1b, 0xfb, 0x12, 0xfb, 0x0, 0x32, 0xfb, + 0x6, 0x5c, 0x1f, 0x54, 0x6, 0x6d, 0x57, 0x5, 0xce, 0x6, 0x86, 0x73, + 0x89, 0x76, 0x89, 0x7b, 0x8, 0x5a, 0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x49, + 0xc1, 0xf7, 0x7c, 0xc2, 0x1, 0xf8, 0xac, 0xc6, 0x3, 0x90, 0x7c, 0x15, + 0xf7, 0x79, 0x36, 0xa, 0x37, 0x6, 0xb1, 0xf7, 0x48, 0x5, 0xf7, 0xc, + 0x6, 0x9d, 0x6e, 0xaa, 0x57, 0xa7, 0x56, 0x40, 0x44, 0x18, 0xba, 0x6d, + 0xc1, 0xbd, 0x94, 0x79, 0x92, 0x7a, 0x91, 0x7c, 0x19, 0xf7, 0x1f, 0x6, + 0x96, 0xc2, 0x57, 0xa, 0x78, 0xb1, 0xda, 0xd5, 0x5c, 0xa9, 0x51, 0x54, + 0x77, 0xae, 0x77, 0xac, 0x7a, 0xa5, 0x19, 0xea, 0x8e, 0xf7, 0x8, 0xb8, + 0xf7, 0x37, 0x1a, 0xcd, 0x57, 0xcb, 0x23, 0x1e, 0xfb, 0xce, 0x38, 0xa, + 0xe1, 0x6, 0x2a, 0xfc, 0x67, 0x5, 0x34, 0x6, 0xf7, 0x56, 0xf7, 0x7f, + 0x15, 0xba, 0xf7, 0x7c, 0x5, 0xf7, 0x2c, 0x6, 0xd9, 0xbc, 0x6b, 0x5f, + 0xfb, 0x2b, 0xfb, 0x23, 0x86, 0x3f, 0x1f, 0xe, 0xf7, 0xb0, 0x76, 0xf7, + 0x93, 0xb7, 0x1, 0xb6, 0xbe, 0xf7, 0x10, 0xbb, 0xf7, 0x60, 0xbd, 0x3, + 0xf7, 0x6e, 0xf7, 0x9b, 0x15, 0xbb, 0x6, 0xc7, 0xf7, 0xa2, 0x97, 0xfb, + 0xa2, 0x5, 0xcb, 0x6, 0xf7, 0x14, 0xf7, 0xa1, 0x4f, 0xfb, 0xa1, 0x5, + 0xbd, 0x6, 0xcd, 0xf7, 0xbf, 0x5, 0x30, 0x6, 0xfb, 0x6, 0xfb, 0x87, + 0x84, 0xf7, 0x87, 0x5, 0x31, 0x6, 0xfb, 0x85, 0xfb, 0xbf, 0x15, 0xbe, + 0x6, 0xc2, 0xf7, 0x93, 0x5, 0xe1, 0x6, 0x95, 0xb7, 0x5, 0xfb, 0x71, + 0x6, 0x81, 0x5f, 0x5, 0xe0, 0x6, 0xe, 0x73, 0xa, 0xf7, 0x11, 0xf7, + 0x7, 0x15, 0xa9, 0xba, 0x2f, 0xf7, 0x3, 0x5, 0xf8, 0xbd, 0x6, 0x96, + 0xbd, 0x5, 0xfc, 0xae, 0x6, 0xf7, 0x18, 0xf3, 0x82, 0xc3, 0xfb, 0x82, + 0xfb, 0x4e, 0x5, 0xe, 0xa0, 0x76, 0xf9, 0x3, 0x77, 0x1, 0xf7, 0x88, + 0xbd, 0x3, 0xf7, 0x38, 0x9c, 0x15, 0xf7, 0x18, 0xf8, 0x80, 0xfb, 0x1a, + 0x26, 0x58, 0xa2, 0xf7, 0x84, 0xf7, 0x49, 0xf7, 0x1e, 0xfb, 0x54, 0x55, + 0x7a, 0x37, 0xf7, 0xa, 0xfb, 0x1b, 0xfc, 0x8e, 0x5, 0xe, 0x73, 0xa, + 0x70, 0xf7, 0xa7, 0x15, 0x96, 0xbd, 0x5, 0xf8, 0xbf, 0x6, 0x2f, 0xf7, + 0x3, 0xa9, 0xba, 0xf7, 0x2a, 0xfb, 0x4a, 0xfb, 0x81, 0xfb, 0x4e, 0x82, + 0xc3, 0xf7, 0x18, 0xf3, 0x5, 0xe, 0x9a, 0x76, 0xf8, 0xea, 0x77, 0x1, + 0xf7, 0x3, 0xf7, 0x4f, 0x15, 0xc0, 0x9c, 0xdd, 0xfb, 0x9, 0xf7, 0x1c, + 0xf8, 0x8d, 0xbe, 0x88, 0xfb, 0x18, 0xfc, 0x7e, 0xf7, 0x1c, 0xef, 0xbf, + 0x74, 0xfb, 0x86, 0xfb, 0x4a, 0x5, 0xe, 0xf7, 0x1c, 0x76, 0xf7, 0x32, + 0xbf, 0xf7, 0x32, 0x77, 0x1, 0xf7, 0x10, 0xf7, 0x7, 0x15, 0xfb, 0x2c, + 0xf7, 0x4a, 0xf7, 0x83, 0xf7, 0x4e, 0x94, 0x53, 0xfb, 0x18, 0x25, 0x5, + 0xf8, 0x58, 0x6, 0x31, 0xf7, 0x3, 0xa9, 0xba, 0xf7, 0x28, 0xfb, 0x4a, + 0xfb, 0x7f, 0xfb, 0x4e, 0x82, 0xc3, 0xf7, 0x16, 0xf2, 0xfc, 0x58, 0x8a, + 0xe7, 0xfb, 0x3, 0x5, 0xe, 0xf7, 0x7c, 0xbe, 0x1, 0xd5, 0xf7, 0x7c, + 0x15, 0xf8, 0x57, 0xbe, 0xfc, 0x57, 0x6, 0xe, 0x8b, 0xc0, 0xf7, 0xc1, + 0xc0, 0xf1, 0xf7, 0xc, 0x1, 0xf7, 0x0, 0xc1, 0xf7, 0xa7, 0xc1, 0x3, + 0xf8, 0x96, 0xf8, 0x91, 0x15, 0xd2, 0x6, 0xa2, 0xf7, 0xc, 0x5, 0x44, + 0x6, 0xfb, 0x6d, 0xfd, 0x9, 0x15, 0xf7, 0xa1, 0x80, 0xa, 0xfb, 0x1, + 0x6, 0xd3, 0xf7, 0xf6, 0x5, 0xfb, 0x1c, 0x68, 0xa, 0xdd, 0x6, 0x4d, + 0xfb, 0xc1, 0x5, 0x21, 0x6, 0xfb, 0xe7, 0x56, 0x15, 0xf7, 0x9e, 0x6, + 0x97, 0xc0, 0x57, 0xa, 0xc9, 0xf7, 0xc1, 0x5, 0xf6, 0x6, 0x96, 0xc0, + 0x57, 0xa, 0xa6, 0xed, 0x5, 0x9f, 0x90, 0x96, 0xa2, 0xd4, 0x1b, 0xa1, + 0xa1, 0x87, 0x87, 0x9e, 0x1f, 0xa0, 0xbf, 0x5, 0x8f, 0x71, 0x5e, 0x90, + 0x78, 0x1b, 0x5a, 0x43, 0x7e, 0x38, 0x77, 0x1f, 0x73, 0x29, 0x5, 0x20, + 0x68, 0xa, 0xf6, 0x6, 0x4e, 0xfb, 0xc1, 0x5, 0x22, 0x6, 0xe, 0x8b, + 0xc2, 0xf7, 0xcf, 0xc2, 0xf7, 0x29, 0xc2, 0x1, 0xf7, 0x2, 0xc1, 0xf7, + 0xa8, 0xc3, 0x3, 0xf7, 0xd5, 0x16, 0xf7, 0xa2, 0x36, 0xa, 0x21, 0x6, + 0xf7, 0x4, 0xf8, 0xd2, 0x5, 0xfb, 0x27, 0x56, 0xa, 0xe8, 0x6, 0x25, + 0xfc, 0x9b, 0x57, 0xa, 0xfb, 0xe8, 0x54, 0x15, 0xf7, 0xa0, 0x6, 0x97, + 0xc2, 0x57, 0xa, 0xc9, 0xf7, 0xcf, 0x5, 0xf6, 0x6, 0x96, 0xc2, 0x57, + 0xa, 0x9c, 0xe0, 0x5, 0xa1, 0x8f, 0x97, 0xb5, 0xde, 0x1b, 0xa2, 0xa0, + 0x86, 0x86, 0xa0, 0x1f, 0x9f, 0xc1, 0x5, 0x90, 0x71, 0x6f, 0x91, 0x6f, + 0x1b, 0x30, 0x58, 0x5a, 0x45, 0x7e, 0x1f, 0x79, 0x36, 0x5, 0xfb, 0x1, + 0x67, 0xa, 0xf7, 0x1, 0x6, 0x4d, 0xfb, 0xcf, 0x5, 0x20, 0x6, 0xe, + 0x79, 0x9d, 0xf8, 0x3e, 0x9a, 0xf7, 0xd, 0x9d, 0xa9, 0x97, 0x6, 0xfb, + 0x31, 0x8b, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xc2, 0xa, + 0xc2, 0xb, 0xf8, 0xec, 0x14, 0xaa, 0x13, 0x0, 0x6a, 0x2, 0x0, 0x1, + 0x0, 0x29, 0x0, 0x38, 0x0, 0x69, 0x0, 0x6d, 0x0, 0xb9, 0x0, 0xf5, + 0x1, 0x3b, 0x1, 0x83, 0x1, 0xc3, 0x1, 0xf8, 0x1, 0xfd, 0x2, 0xe, + 0x2, 0x1a, 0x2, 0x1f, 0x2, 0x46, 0x2, 0x53, 0x2, 0x93, 0x2, 0xc4, + 0x2, 0xce, 0x2, 0xe8, 0x3, 0x19, 0x3, 0x2c, 0x3, 0x31, 0x3, 0x3f, + 0x3, 0x44, 0x3, 0x4e, 0x3, 0x59, 0x3, 0x64, 0x3, 0x69, 0x3, 0x8e, + 0x3, 0x95, 0x3, 0xb8, 0x3, 0xbf, 0x3, 0xd1, 0x3, 0xed, 0x3, 0xf4, + 0x3, 0xff, 0x4, 0x4, 0x4, 0x9, 0x4, 0xe, 0x4, 0x23, 0x4, 0x2b, + 0x4, 0x32, 0x4, 0x3c, 0x4, 0x51, 0x4, 0x56, 0x4, 0x5e, 0x4, 0x66, + 0x4, 0x6e, 0x4, 0x72, 0x4, 0x76, 0x4, 0x87, 0x4, 0x91, 0x4, 0x96, + 0x4, 0x9b, 0x4, 0x9f, 0x4, 0xa3, 0x4, 0xab, 0x4, 0xb3, 0x4, 0xba, + 0x4, 0xbf, 0x4, 0xc5, 0x4, 0xca, 0x4, 0xcf, 0x4, 0xd4, 0x4, 0xd9, + 0x4, 0xdd, 0x4, 0xe1, 0x4, 0xe5, 0x4, 0xed, 0x4, 0xf3, 0x4, 0xf8, + 0x4, 0xfd, 0x5, 0x1, 0x5, 0x5, 0x5, 0x9, 0x5, 0x15, 0x5, 0x21, + 0x5, 0x27, 0x5, 0x2d, 0x5, 0x33, 0x5, 0x37, 0x5, 0x42, 0x5, 0x4d, + 0x5, 0x58, 0x5, 0x60, 0x5, 0x65, 0x5, 0x69, 0x5, 0x6e, 0x5, 0x72, + 0x5, 0x76, 0x5, 0x7a, 0x5, 0x83, 0x5, 0x8c, 0x5, 0x95, 0x5, 0x9e, + 0x5, 0xa3, 0x5, 0xa8, 0x5, 0xad, 0x5, 0xb2, 0x5, 0xb7, 0x5, 0xbb, + 0x5, 0xbf, 0x5, 0xc3, 0x5, 0xc7, 0x5, 0xcb, 0xf7, 0x63, 0x4d, 0xa, + 0x33, 0x6, 0xcc, 0xf7, 0xf, 0x5, 0xf7, 0xaa, 0x6, 0xa3, 0xfb, 0xf, + 0x2c, 0xa, 0xf8, 0x93, 0x32, 0xa, 0x7a, 0xa, 0x4f, 0x6, 0xf7, 0x6b, + 0xf7, 0x45, 0x15, 0xf7, 0x40, 0xf7, 0xbb, 0xca, 0xfb, 0xbb, 0x5, 0xb, + 0x22, 0xa, 0x13, 0xbe, 0x3a, 0xa, 0x13, 0x7e, 0x98, 0xce, 0x15, 0x13, + 0xbe, 0x2b, 0xa, 0x15, 0xf7, 0x1e, 0x3c, 0xa, 0x37, 0x6, 0xbe, 0xf7, + 0x9a, 0x8c, 0x9b, 0x9a, 0x1a, 0xcb, 0x8a, 0x5e, 0xb2, 0x22, 0x1b, 0x46, + 0x36, 0x77, 0x72, 0x4b, 0x1f, 0x39, 0xa, 0xa8, 0xe1, 0x9c, 0x33, 0x1f, + 0x81, 0x49, 0x5, 0x92, 0x5f, 0x5a, 0x92, 0x5a, 0x1b, 0xfb, 0x51, 0x4c, + 0x2c, 0x3f, 0x1f, 0xb, 0x15, 0x20, 0xa, 0xe, 0x15, 0xdb, 0x6, 0x5a, + 0xfb, 0x91, 0x5, 0x88, 0x7e, 0x8c, 0x7f, 0x80, 0x1a, 0x45, 0xc3, 0x67, + 0xd6, 0xb2, 0xc1, 0x9a, 0xd5, 0xe3, 0x1e, 0x13, 0x78, 0x7c, 0x3d, 0x5, + 0xf7, 0x1a, 0x36, 0xa, 0x3a, 0x6, 0xd3, 0xf8, 0x15, 0x55, 0xa, 0x82, + 0x53, 0x5, 0xdc, 0x6, 0x5e, 0xfb, 0x77, 0x5, 0x13, 0xb8, 0x59, 0x5b, + 0x4d, 0x4b, 0x4c, 0x1b, 0x4e, 0x6c, 0xa8, 0xbe, 0x8a, 0x1f, 0x96, 0x8c, + 0x96, 0x8d, 0x98, 0x1e, 0xc0, 0xf7, 0xae, 0x5, 0xfb, 0x1a, 0x6, 0xe, + 0x15, 0xfb, 0x15, 0xd7, 0x26, 0xf7, 0x1a, 0xf7, 0x4d, 0xf7, 0x1c, 0xf7, + 0x4d, 0xf7, 0x4f, 0xed, 0x5f, 0xf7, 0x11, 0xfb, 0x35, 0xfb, 0x60, 0xfb, + 0xe, 0xfb, 0x5c, 0xfb, 0x39, 0x1e, 0xc2, 0x93, 0x15, 0xf7, 0x2, 0xea, + 0xf7, 0x55, 0xf7, 0x3c, 0xf7, 0x1a, 0xa4, 0x20, 0x3a, 0xfb, 0x13, 0xfb, + 0xf, 0xfb, 0x40, 0xfb, 0x19, 0xfb, 0x1, 0x52, 0xdf, 0xef, 0x1e, 0xe, + 0x15, 0xdc, 0x6, 0x55, 0xfb, 0xb5, 0x5, 0x85, 0x6b, 0x88, 0x6d, 0x70, + 0x1a, 0x30, 0xbd, 0x51, 0xf7, 0xc, 0xf7, 0x12, 0xe2, 0xc1, 0xf7, 0x30, + 0xa7, 0x1e, 0xc7, 0xf7, 0xd1, 0x5, 0xd8, 0x3c, 0xa, 0xfb, 0x7b, 0x60, + 0xa, 0xf1, 0x6, 0x50, 0xfb, 0xca, 0x63, 0xa, 0x76, 0x53, 0x54, 0x23, + 0x1b, 0x32, 0x65, 0xb4, 0xdc, 0x9d, 0x8e, 0x9e, 0x8f, 0xa0, 0x1f, 0xc3, + 0xf7, 0xb9, 0x5, 0xf4, 0x3c, 0xa, 0xfb, 0x82, 0x6, 0xb, 0x15, 0xf8, + 0x38, 0x89, 0x5, 0x8f, 0xa1, 0x8f, 0xaa, 0xa0, 0x1a, 0xe8, 0x51, 0xe0, + 0xfb, 0x1c, 0xfb, 0x34, 0xfb, 0x1e, 0xfb, 0x9, 0xfb, 0x48, 0x2c, 0xc5, + 0x41, 0xf7, 0x2c, 0xe0, 0xe5, 0xa8, 0xb0, 0xd5, 0x1e, 0x84, 0xc1, 0x5, + 0x5e, 0x32, 0x37, 0x77, 0x5a, 0x1b, 0x44, 0x26, 0xa1, 0xe3, 0x9b, 0x8b, + 0x9c, 0x91, 0x9d, 0x1f, 0x9b, 0xc3, 0x15, 0xc6, 0xa0, 0xd0, 0xd9, 0xf7, + 0x9, 0x1b, 0xf7, 0x22, 0x8f, 0xfb, 0x4, 0x72, 0x1f, 0xe, 0xf8, 0x85, + 0x6, 0xb1, 0xf7, 0x51, 0x71, 0xa, 0x70, 0xfb, 0x1b, 0x5, 0xfb, 0xc5, + 0x6, 0xb4, 0xf7, 0x5d, 0x5, 0xf7, 0x39, 0x6, 0x7b, 0x39, 0x51, 0xa, + 0xb8, 0xf7, 0x6f, 0x62, 0xa, 0x7a, 0x38, 0x5, 0xfb, 0x38, 0x6, 0xb3, + 0xf7, 0x5e, 0x81, 0xa, 0x71, 0xfb, 0x1b, 0x5, 0xc4, 0x6, 0xb1, 0xf7, + 0x51, 0x5, 0xfc, 0x83, 0x45, 0xa, 0xdf, 0x6, 0x2f, 0xfc, 0x5d, 0x6b, + 0xa, 0xb, 0x15, 0x20, 0xd7, 0x43, 0xf7, 0x15, 0xf7, 0x38, 0xf7, 0x9, + 0xf7, 0x14, 0xf7, 0x2e, 0xdf, 0x5b, 0xec, 0xfb, 0x2a, 0xfb, 0x2b, 0xfb, + 0x1d, 0xfb, 0x9, 0xfb, 0x3b, 0x1e, 0xc9, 0x9a, 0x15, 0xf5, 0xe8, 0xf6, + 0xf7, 0xe, 0xf7, 0x16, 0x9d, 0x34, 0x4f, 0x28, 0x2c, 0x21, 0xfb, 0x9, + 0xfb, 0x7, 0x67, 0xcc, 0xd5, 0x1e, 0xb, 0x6, 0x96, 0xc1, 0x5, 0xb, + 0x4e, 0x4b, 0x3e, 0x5c, 0x38, 0x1b, 0x57, 0x64, 0xa8, 0xab, 0xed, 0xf7, + 0x1d, 0x97, 0xc6, 0x40, 0xa, 0x5, 0x2b, 0x2d, 0xa, 0xf7, 0x60, 0x2a, + 0xa, 0x57, 0x6, 0x21, 0xb, 0x6, 0x80, 0x55, 0x5, 0xb, 0x15, 0x52, + 0xb2, 0x5e, 0xcf, 0xdf, 0xd4, 0xd3, 0xdb, 0xc1, 0x6c, 0xb7, 0x3d, 0x38, + 0x43, 0x42, 0x40, 0x1e, 0xc4, 0x92, 0x15, 0xbc, 0xb3, 0xb1, 0xbe, 0xb3, + 0x9e, 0x73, 0x6c, 0x61, 0x6a, 0x5f, 0x55, 0x66, 0x71, 0x9f, 0xad, 0x1e, + 0xb, 0x44, 0xa, 0xf8, 0x5c, 0x37, 0xa, 0xfc, 0x5c, 0x5, 0xfb, 0x45, + 0x6, 0xb, 0xad, 0x71, 0x53, 0xb4, 0x3c, 0x1b, 0xfb, 0x33, 0xfb, 0x9, + 0xfb, 0x9, 0x22, 0x39, 0xc1, 0x3b, 0xf7, 0x21, 0xcc, 0xd6, 0x98, 0xb8, + 0xbd, 0x1f, 0x78, 0x20, 0x5, 0x34, 0x79, 0x52, 0x6f, 0xfb, 0xb, 0x1b, + 0x48, 0x4b, 0x9c, 0x96, 0x59, 0x1f, 0xcc, 0xf7, 0xc1, 0x15, 0xee, 0xf7, + 0x1, 0xd0, 0xf0, 0xf7, 0x6, 0xab, 0x4c, 0x4b, 0x2c, 0x25, 0x4f, 0x23, + 0x31, 0x4f, 0xbd, 0xcb, 0x1e, 0xb, 0xf7, 0xc9, 0x2a, 0xa, 0xfb, 0x12, + 0x6, 0xad, 0xf7, 0x43, 0xf7, 0x7e, 0xf7, 0xae, 0x5, 0xce, 0x2a, 0xa, + 0xfb, 0x5a, 0x2d, 0xa, 0xd1, 0x6, 0xfb, 0x52, 0xfb, 0x78, 0x26, 0xf7, + 0x78, 0x5, 0xd2, 0x43, 0xa, 0xd1, 0x6, 0xf7, 0x10, 0xfb, 0xae, 0x69, + 0xfb, 0x43, 0x5, 0xfb, 0x12, 0x6, 0xb, 0x5, 0xfb, 0x82, 0x2d, 0xa, + 0x86, 0xa, 0xfb, 0x9d, 0xb, 0x15, 0x69, 0xa, 0xf7, 0x3b, 0x6, 0xc8, + 0xf7, 0xdb, 0x5, 0xfb, 0x1b, 0x77, 0xa, 0xf7, 0x4f, 0x6, 0x44, 0xfc, + 0x12, 0x5, 0xf7, 0x3a, 0x56, 0xa, 0xe, 0xf7, 0xb5, 0xf7, 0x5e, 0x15, + 0xf7, 0x37, 0x6, 0x72, 0xfb, 0x18, 0x5, 0x76, 0x46, 0x64, 0x7f, 0x54, + 0x1b, 0xfb, 0x18, 0x53, 0xd8, 0xeb, 0xf7, 0x74, 0xf7, 0x2a, 0xe6, 0xf7, + 0x7, 0xd0, 0xc0, 0x68, 0x5b, 0xae, 0x1f, 0x7c, 0x3f, 0x51, 0xa, 0xb5, + 0xf7, 0x6a, 0x52, 0xa, 0x7e, 0x49, 0x5, 0xb, 0x15, 0x71, 0xa3, 0x73, + 0xb1, 0xb2, 0xb6, 0xa9, 0xb3, 0xa8, 0x75, 0xa4, 0x67, 0x60, 0x60, 0x69, + 0x63, 0x1e, 0xb, 0x6, 0x96, 0xc2, 0x5, 0xb, 0x5, 0xf7, 0x41, 0x46, + 0xa, 0xfc, 0x2b, 0x38, 0xa, 0xf7, 0x42, 0x6, 0x2c, 0xb, 0x6, 0x80, + 0x54, 0x5, 0xb, 0x8f, 0x55, 0x5, 0x9a, 0xae, 0xe4, 0xa6, 0xd0, 0x1b, + 0xb, 0x51, 0xb9, 0x54, 0xe7, 0xd8, 0xda, 0xb6, 0xc1, 0xcd, 0x1e, 0xb, + 0x7c, 0xc3, 0x5f, 0xc3, 0xf7, 0x33, 0xc4, 0xf7, 0xf, 0xc4, 0xb, 0x6, + 0x96, 0xc3, 0x5, 0xb, 0xb4, 0x62, 0x4d, 0xa4, 0x46, 0x1b, 0xfb, 0x3f, + 0xfb, 0x2b, 0xfb, 0x24, 0xfb, 0x7c, 0xfb, 0x8, 0xce, 0x21, 0xf7, 0x3d, + 0xd4, 0xd9, 0x9f, 0xa5, 0xcf, 0x1f, 0xac, 0xf7, 0x42, 0x5, 0xbf, 0x36, + 0xa, 0xfb, 0xa2, 0x6, 0xb, 0x8b, 0xc1, 0xf8, 0x5a, 0xc1, 0x1, 0xb, + 0xa2, 0x3c, 0x15, 0x76, 0x59, 0x5, 0x80, 0xbd, 0xdc, 0x7a, 0xdd, 0x1b, + 0xf7, 0x10, 0xe3, 0xbf, 0xf0, 0xa2, 0x1f, 0xd9, 0xf8, 0x12, 0x5, 0xc7, + 0x6, 0x95, 0xbe, 0x5, 0xfb, 0x6, 0x6, 0x7c, 0x4c, 0x5, 0xb, 0xb8, + 0xb5, 0x85, 0x84, 0xb5, 0x1f, 0xe, 0x70, 0xa0, 0x71, 0xae, 0xb0, 0xaf, + 0xab, 0xb4, 0xaa, 0x73, 0xa1, 0x6c, 0x65, 0x67, 0x68, 0x65, 0x1e, 0xb, + 0xf3, 0xef, 0xb4, 0xc8, 0xc0, 0xbd, 0x75, 0x59, 0x9b, 0x1e, 0xc2, 0x9c, + 0x5, 0xc3, 0x79, 0x6d, 0xc4, 0xfb, 0x9, 0x1b, 0xfb, 0xc, 0x23, 0x32, + 0x27, 0x1f, 0x8a, 0xb, 0x2a, 0xa, 0xfb, 0x5f, 0x2d, 0xa, 0xb, 0xf8, + 0x2f, 0x6, 0x98, 0xc1, 0x5, 0xfb, 0x45, 0x6, 0xea, 0xb, 0x6, 0x7f, + 0x55, 0x5, 0xb, 0x6, 0x97, 0xc2, 0x5, 0xb, 0x6, 0x97, 0xc1, 0x5, + 0xb, 0x15, 0xd9, 0x6, 0xf7, 0x40, 0xf7, 0x33, 0x65, 0x9d, 0xfb, 0x33, + 0xfb, 0xb, 0xfb, 0x11, 0xf7, 0xc, 0x5f, 0x78, 0x5, 0xe, 0x1, 0xc4, + 0xc9, 0xf7, 0xff, 0xc8, 0x3, 0xb, 0x12, 0xba, 0xc5, 0xf7, 0xee, 0xc4, + 0xb, 0x3b, 0xa, 0xf7, 0x73, 0x77, 0x4a, 0xa, 0x13, 0x7e, 0xb, 0x15, + 0xdb, 0x6, 0xf7, 0x46, 0xf7, 0x33, 0x65, 0x9f, 0xfb, 0x3d, 0xfb, 0xf, + 0xfb, 0x12, 0xf7, 0xe, 0x5f, 0x77, 0x5, 0xb, 0x6, 0x95, 0xc1, 0x5, + 0xb, 0x7c, 0xc1, 0x60, 0xc2, 0xf7, 0xdd, 0xc3, 0xb, 0xf7, 0x63, 0xf7, + 0x4a, 0xf7, 0x60, 0x3, 0xb, 0x1, 0xe7, 0xbf, 0xf7, 0xc4, 0xbf, 0x3, + 0xb, 0x5, 0xc3, 0x6, 0xb, 0x5, 0x54, 0x6, 0xb, 0x1b, 0xb7, 0xb9, + 0x9d, 0xa7, 0xb1, 0x1f, 0x7d, 0xb8, 0x5, 0x7f, 0x77, 0x53, 0x76, 0x67, + 0x1b, 0xb, 0x15, 0xda, 0x6, 0xa5, 0xf7, 0xa, 0x5, 0x3d, 0x6, 0xb, + 0x5, 0xfb, 0x1b, 0x6, 0xb, 0x6, 0x7f, 0x54, 0x5, 0xb, 0x63, 0xa, + 0x6, 0xb, 0xfc, 0x5a, 0x5, 0xb, 0x70, 0xa, 0xf7, 0x78, 0x77, 0x50, + 0xa, 0xb, 0x5d, 0xa, 0xf7, 0x74, 0x77, 0x49, 0xa, 0xb, 0x8b, 0x61, + 0xa, 0xf7, 0x5e, 0xc1, 0xb, 0x6, 0xa4, 0x88, 0xa, 0xb, 0x7c, 0xc2, + 0xf7, 0xf4, 0xc3, 0xb, 0x6, 0x30, 0x58, 0xa, 0xb, 0x6, 0x81, 0x55, + 0x5, 0xb, 0x6, 0x80, 0x53, 0x5, 0xb, 0xc1, 0xf7, 0x5d, 0xc1, 0xb, + 0x5, 0x52, 0x6, 0xb, 0x5, 0xfb, 0x0, 0xb, 0xf7, 0x7e, 0x5, 0xb, + 0xf8, 0x9a, 0x76, 0xf7, 0x43, 0x77, 0x1, 0xb, 0x5, 0xfb, 0x21, 0x38, + 0xa, 0xb, 0x6, 0x81, 0x54, 0x5, 0xb, 0x6, 0x81, 0x56, 0x5, 0xb, + 0x95, 0xc2, 0x5, 0xb, 0x5, 0xc2, 0x6, 0xb, 0x5, 0x39, 0x6, 0xb, + 0x15, 0x74, 0x97, 0x76, 0xa4, 0xa6, 0xa5, 0xa8, 0xa9, 0xa1, 0x7d, 0xb, + 0x15, 0x57, 0xb4, 0x5b, 0xcd, 0xdf, 0xd1, 0xd3, 0xdd, 0xbd, 0x69, 0xb, + 0x6, 0xa4, 0xf7, 0x7, 0x5, 0xb, 0x8b, 0xc2, 0xf7, 0xdb, 0xc2, 0xb, + 0x79, 0xc1, 0xf8, 0x6d, 0xc3, 0xb, 0x5, 0x53, 0x6, 0xb, 0x71, 0x5f, + 0x6c, 0x61, 0x55, 0x68, 0x71, 0xa1, 0xa9, 0x1e, 0xb, 0xf7, 0x1c, 0x76, + 0xf7, 0x32, 0xbd, 0xf7, 0x34, 0x77, 0x1, 0xb, 0x77, 0x1, 0xf7, 0xa, + 0xc6, 0xf2, 0xc7, 0x3, 0xf7, 0xac, 0xb, 0x6, 0xf7, 0x29, 0x64, 0xa, + 0x2f, 0x6, 0xe, 0x6, 0x94, 0xc1, 0x5, 0xb, 0x6, 0x69, 0xa, 0xb, + 0x6, 0x96, 0xbe, 0x5, 0xb, 0xf7, 0x24, 0x5, 0xe, 0xfc, 0x5d, 0x5, + 0xb, 0x5, 0x38, 0x6, 0xb, 0xe2, 0xdd, 0x9b, 0x1f, 0xd1, 0xf7, 0xf8, + 0x5, 0xb, 0x77, 0x1, 0xad, 0xc1, 0xf8, 0x3a, 0xc2, 0x3, 0xb, 0x8b, + 0xbe, 0xf7, 0x12, 0xc1, 0xf7, 0xac, 0xc1, 0xb, 0xf7, 0x1d, 0xc4, 0xf7, + 0x71, 0x77, 0x1, 0xc1, 0xb, 0x6, 0x96, 0xc0, 0x5, 0xb, 0x5, 0xf7, + 0xbe, 0x6, 0xb, 0x6, 0x80, 0x57, 0x5, 0xb, 0x5, 0xfb, 0x18, 0x6, + 0xb, 0xf7, 0x78, 0x77, 0x1, 0xb, 0x15, 0xdd, 0x6, 0xb, 0xf7, 0x1f, + 0x6, 0xb, 0xf8, 0x5a, 0x5, 0xb, 0xf7, 0x8, 0x5, 0xb, 0x5, 0x3b, + 0x6, 0xb}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSans.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSans.cpp new file mode 100644 index 000000000000..16da03e54e24 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSans.cpp @@ -0,0 +1,1262 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitSansFontData[15025] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xd, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x53, 0x61, 0x6e, 0x73, 0x4f, 0x54, 0x46, 0x0, 0x1, 0x1, + 0x1, 0x24, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8, + 0x1d, 0x3, 0xf8, 0x18, 0x4, 0xfb, 0x3a, 0xfb, 0x75, 0xfa, 0x7c, 0xfa, + 0x45, 0x5, 0xf7, 0x16, 0xf, 0xf8, 0xe1, 0x11, 0xab, 0x1c, 0x34, 0xa2, + 0x12, 0x0, 0x3, 0x1, 0x1, 0x5, 0x2f, 0x3d, 0x45, 0x75, 0x72, 0x6f, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, + 0x53, 0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x0, 0x8a, 0x0, 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, + 0xaf, 0x0, 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1, 0x0, 0x25, 0x0, + 0x26, 0x0, 0xb2, 0x0, 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, + 0x87, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0xb6, 0x0, + 0xb7, 0x0, 0xb8, 0x0, 0xb9, 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, + 0x8c, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0xba, 0x0, 0x30, 0x0, 0x8e, 0x0, + 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0x8d, 0x0, 0xbf, 0x0, + 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0xc0, 0x0, 0x35, 0x0, + 0x9d, 0x0, 0x36, 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, + 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5, 0x0, 0xc6, 0x0, + 0x3b, 0x0, 0xc7, 0x0, 0x42, 0x0, 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, + 0xca, 0x0, 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc, 0x0, 0x3f, 0x0, + 0x5f, 0x0, 0xb, 0x0, 0x21, 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0, + 0x5d, 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0, 0x3e, 0x0, 0x81, 0x0, + 0xa0, 0x0, 0x74, 0x0, 0x44, 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0, + 0x61, 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0, 0xaa, 0x0, 0x67, 0x0, + 0x45, 0x0, 0x70, 0x0, 0x71, 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0, + 0x5, 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0, 0xcf, 0x0, 0xd0, 0x0, + 0xd1, 0x0, 0xd2, 0x0, 0x19, 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0, + 0x1e, 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0, 0x47, 0x0, 0x6d, 0x0, + 0x16, 0x0, 0x6e, 0x0, 0x65, 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x0, + 0x95, 0x0, 0x7c, 0x0, 0x1f, 0x0, 0x6a, 0x0, 0x78, 0x0, 0x6b, 0x0, + 0x6c, 0x0, 0x49, 0x0, 0x86, 0x0, 0xe, 0x0, 0x4a, 0x0, 0xd3, 0x0, + 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0, + 0x1d, 0x0, 0x97, 0x0, 0x92, 0x0, 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, + 0x98, 0x0, 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7, 0x0, 0x4, 0x0, + 0x50, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, + 0xdb, 0x0, 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96, 0x0, 0x8b, 0x0, + 0x8f, 0x0, 0x93, 0x0, 0xdc, 0x0, 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, + 0xa, 0x0, 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a, 0x0, 0xc, 0x0, + 0x9c, 0x0, 0x52, 0x0, 0x20, 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0, + 0x69, 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0, 0x75, 0x0, 0x68, 0x0, + 0x53, 0x0, 0xa5, 0x0, 0x84, 0x0, 0x54, 0x0, 0xdd, 0x0, 0x66, 0x0, + 0x1c, 0x0, 0x18, 0x0, 0x17, 0x0, 0x10, 0x0, 0x1, 0x0, 0x62, 0x0, + 0x55, 0x0, 0xa2, 0x0, 0x14, 0x0, 0xa3, 0x0, 0xa9, 0x0, 0x7f, 0x0, + 0x99, 0x0, 0x13, 0x0, 0xa4, 0x0, 0x56, 0x0, 0xde, 0x0, 0xdf, 0x0, + 0xe0, 0x0, 0xe1, 0x0, 0x40, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, + 0x5a, 0x0, 0xe2, 0x0, 0xe3, 0x0, 0x64, 0x0, 0x5b, 0x0, 0xe4, 0x0, + 0x11, 0x0, 0xe6, 0x2, 0x0, 0x1, 0x0, 0x4, 0x0, 0x36, 0x0, 0x75, + 0x0, 0x8a, 0x0, 0xa2, 0x0, 0xc2, 0x0, 0xd3, 0x1, 0x4, 0x1, 0x32, + 0x1, 0x92, 0x1, 0xe1, 0x2, 0x5b, 0x2, 0x9d, 0x2, 0xc0, 0x2, 0xcd, + 0x2, 0xd9, 0x2, 0xeb, 0x2, 0xfc, 0x3, 0x47, 0x3, 0xc2, 0x3, 0xe1, + 0x4, 0x42, 0x4, 0x68, 0x4, 0x77, 0x4, 0x87, 0x4, 0xa4, 0x4, 0xbf, + 0x4, 0xd0, 0x5, 0x1, 0x5, 0x2f, 0x5, 0x44, 0x5, 0x71, 0x5, 0xa7, + 0x5, 0xcc, 0x6, 0x16, 0x6, 0x68, 0x6, 0xd7, 0x6, 0xe8, 0x6, 0xf9, + 0x7, 0x8, 0x7, 0x21, 0x7, 0xa4, 0x7, 0xdf, 0x8, 0x1c, 0x8, 0x98, + 0x8, 0xf0, 0x9, 0x58, 0x9, 0xc6, 0x9, 0xe1, 0xa, 0x25, 0xa, 0x58, + 0xa, 0x60, 0xa, 0x67, 0xa, 0x74, 0xa, 0x7b, 0xa, 0x96, 0xa, 0xcf, + 0xb, 0x3, 0xb, 0x2a, 0xb, 0x4e, 0xb, 0x76, 0xb, 0x90, 0xb, 0xb2, + 0xc, 0x31, 0xc, 0x40, 0xc, 0x4e, 0xc, 0x5c, 0xc, 0x6a, 0xd, 0x12, + 0xd, 0x37, 0xd, 0xcd, 0xe, 0xa, 0xe, 0x2c, 0xe, 0x74, 0xe, 0xc8, + 0xf, 0x7c, 0xf, 0xb4, 0x10, 0xb, 0x10, 0x21, 0x10, 0x37, 0x10, 0x85, + 0x10, 0xd3, 0x10, 0xf1, 0x11, 0xe, 0x11, 0x32, 0x11, 0x4f, 0x11, 0x70, + 0x11, 0xba, 0x11, 0xd1, 0x12, 0x42, 0x12, 0x76, 0x12, 0xed, 0x13, 0x3, + 0x13, 0x1c, 0x13, 0x40, 0x13, 0xd1, 0x14, 0x41, 0x14, 0x90, 0x14, 0xb4, + 0x14, 0xe5, 0x15, 0x1d, 0x15, 0x39, 0x15, 0x62, 0x15, 0xe9, 0x15, 0xfd, + 0x16, 0xb, 0x16, 0x5c, 0x16, 0x6f, 0x16, 0x81, 0x16, 0xcb, 0x16, 0xe6, + 0x17, 0x5a, 0x17, 0x81, 0x17, 0x91, 0x17, 0x9f, 0x17, 0xbb, 0x18, 0x2e, + 0x18, 0x56, 0x18, 0x7e, 0x18, 0xae, 0x18, 0xc2, 0x19, 0x15, 0x19, 0x25, + 0x19, 0x87, 0x19, 0xb7, 0x19, 0xcf, 0x1a, 0x40, 0x1a, 0xa3, 0x1a, 0xba, + 0x1a, 0xd6, 0x1b, 0x8, 0x1b, 0x3a, 0x1b, 0x54, 0x1b, 0x6e, 0x1b, 0xa4, + 0x1b, 0xb8, 0x1b, 0xc9, 0x1b, 0xe0, 0x1b, 0xf1, 0x1c, 0xe, 0x1c, 0x29, + 0x1c, 0x3a, 0x1c, 0x6b, 0x1c, 0x92, 0x1c, 0x9a, 0x1c, 0xb7, 0x1c, 0xcb, + 0x1c, 0xe9, 0x1d, 0x3b, 0x1d, 0x4c, 0x1d, 0x58, 0x1d, 0x9b, 0x1d, 0xd1, + 0x1e, 0x1, 0x1e, 0x62, 0x1e, 0xd1, 0x1f, 0x38, 0x1f, 0x7d, 0x1f, 0x8f, + 0x1f, 0xa1, 0x1f, 0xb5, 0x20, 0x40, 0x20, 0x73, 0x20, 0x8c, 0x20, 0xb0, + 0x21, 0x2d, 0x21, 0x85, 0x21, 0xad, 0x22, 0x24, 0x22, 0x66, 0x22, 0xdf, + 0x23, 0x25, 0x23, 0x6e, 0x23, 0x9e, 0x23, 0xd2, 0x24, 0x8, 0x24, 0x9d, + 0x24, 0xac, 0x24, 0xc3, 0x25, 0x37, 0x25, 0x59, 0x25, 0x89, 0x25, 0xd3, + 0x26, 0x29, 0x26, 0x7f, 0x26, 0x9a, 0x26, 0xb5, 0x26, 0xd1, 0x26, 0xf2, + 0x27, 0x16, 0x27, 0x38, 0x27, 0x5a, 0x27, 0x77, 0x27, 0xa8, 0x28, 0x45, + 0x28, 0x7d, 0x28, 0xd4, 0x29, 0x32, 0x29, 0xcd, 0x29, 0xf8, 0x2a, 0x24, + 0x2a, 0x87, 0x2a, 0x9d, 0x2a, 0xa0, 0x2b, 0x31, 0x2b, 0x6b, 0x2b, 0xc2, + 0x2c, 0x21, 0x2c, 0xba, 0x2d, 0x14, 0x2d, 0x50, 0x2d, 0x9d, 0x2d, 0xeb, + 0x2e, 0x36, 0x2e, 0x6b, 0x2e, 0x7a, 0x2e, 0x88, 0x2e, 0xbc, 0x2e, 0xd8, + 0x2e, 0xe4, 0x2f, 0x0, 0x2f, 0x33, 0x2f, 0x62, 0x2f, 0xa0, 0x2f, 0xb3, + 0x2f, 0xcb, 0x30, 0x12, 0x30, 0x23, 0x30, 0x3c, 0x30, 0x85, 0xfc, 0x31, + 0xe, 0x5f, 0xa, 0xf7, 0x70, 0xd6, 0xf8, 0x3b, 0x77, 0x1, 0x99, 0x16, + 0xea, 0x6, 0xd8, 0xf7, 0x70, 0x5, 0xf7, 0xb2, 0x6, 0xdb, 0xfb, 0x70, + 0x5, 0xf1, 0x6, 0xfb, 0xaa, 0xf9, 0x62, 0x5, 0x28, 0x6, 0x49, 0xfc, + 0x3b, 0x15, 0xf7, 0x4, 0xf7, 0xef, 0x5, 0x8d, 0x6, 0xf7, 0xb, 0xfb, + 0xef, 0x5, 0xe, 0xf7, 0xc9, 0x8b, 0xdf, 0xf7, 0xf, 0xdf, 0xaf, 0xdf, + 0xf7, 0x72, 0xe0, 0x1, 0xf8, 0x78, 0xea, 0x3, 0x93, 0x16, 0xf2, 0x6, + 0xec, 0xf7, 0x63, 0x5, 0xf7, 0xa8, 0xfb, 0x63, 0xf8, 0x67, 0xdf, 0xfc, + 0x8, 0xf7, 0x87, 0xf7, 0xdf, 0xdf, 0xfb, 0xdf, 0xf7, 0x72, 0xf8, 0x7, + 0xe0, 0xfc, 0xea, 0x6, 0x23, 0xfc, 0x3f, 0x15, 0xf7, 0x39, 0xf7, 0xea, + 0x5, 0xd2, 0xfb, 0xea, 0x6, 0xe, 0x46, 0xa, 0xf8, 0x7f, 0xf7, 0x19, + 0x1, 0x27, 0xa, 0xfb, 0x44, 0xf8, 0x7f, 0x4c, 0xa, 0xf7, 0x0, 0xf7, + 0x19, 0x59, 0xa, 0x35, 0xa, 0xfb, 0x9d, 0xf8, 0x7f, 0x15, 0xef, 0x6, + 0xc3, 0xda, 0xc0, 0x3c, 0x5, 0xef, 0x6, 0xfb, 0x2, 0xf7, 0x19, 0x5, + 0x2e, 0x6, 0xe, 0x46, 0xa, 0xf8, 0x86, 0xed, 0x1, 0xf7, 0x5a, 0xe5, + 0xe6, 0xe5, 0x3, 0x27, 0xa, 0xfb, 0x8a, 0xf8, 0x86, 0x15, 0xe5, 0xed, + 0x31, 0x6, 0xf7, 0x49, 0x29, 0x15, 0xe5, 0xed, 0x31, 0x6, 0xe, 0x35, + 0xa, 0xfb, 0x11, 0xf8, 0x7a, 0x15, 0xd0, 0x6, 0x4c, 0xf7, 0x1e, 0x5, + 0xfb, 0x1, 0x6, 0xe, 0x46, 0xa, 0xf8, 0x65, 0xaf, 0xf2, 0xaf, 0x1, + 0xf7, 0x85, 0xaf, 0xf3, 0xaf, 0x3, 0x27, 0xa, 0xfb, 0x5f, 0xf8, 0xbe, + 0x64, 0xa, 0xaf, 0x5a, 0x5a, 0x65, 0x67, 0x5a, 0x1e, 0xaf, 0x16, 0xa5, + 0xa1, 0xa3, 0xa9, 0xa9, 0xa1, 0x75, 0x6f, 0x6e, 0x74, 0x73, 0x6e, 0x70, + 0x72, 0xa0, 0xab, 0x1e, 0xe, 0x46, 0xa, 0xf8, 0x87, 0x75, 0xa, 0x13, + 0xe0, 0x27, 0xa, 0xfb, 0xa6, 0xf8, 0x87, 0x6b, 0xa, 0xa3, 0xa2, 0x80, + 0x7f, 0xa1, 0x1f, 0x80, 0xa0, 0x9f, 0x7f, 0x53, 0xa, 0x7e, 0x7b, 0x92, + 0x93, 0x79, 0x1f, 0x13, 0xd0, 0x97, 0x72, 0x70, 0x99, 0x6d, 0x1b, 0x13, + 0xe0, 0x73, 0xa, 0x73, 0x8b, 0xe0, 0xf7, 0x8a, 0xe0, 0xf7, 0x6d, 0xe0, + 0x1, 0xd5, 0xea, 0xf7, 0xd2, 0xe8, 0x3, 0xd5, 0x16, 0xf7, 0x82, 0x6, + 0xf7, 0x18, 0xf7, 0x4b, 0xa5, 0xf7, 0x4a, 0xc3, 0x67, 0xdf, 0xfb, 0x2, + 0xac, 0x1f, 0xe8, 0xba, 0x91, 0xce, 0xa5, 0x1a, 0xf7, 0x32, 0xfb, 0x26, + 0xb2, 0xfb, 0xe, 0x1e, 0xfb, 0x82, 0x6, 0xea, 0xfd, 0xd, 0x15, 0xf7, + 0x8a, 0xf7, 0x23, 0x7, 0xc5, 0xf7, 0x33, 0x8b, 0xfb, 0xf, 0xfb, 0x10, + 0xfb, 0x3b, 0x8c, 0x59, 0x1f, 0xfb, 0x23, 0xf7, 0xdf, 0x15, 0xf7, 0x6d, + 0xf7, 0x23, 0x7, 0xda, 0xeb, 0x89, 0xfb, 0x2, 0x21, 0xfb, 0x4, 0x8c, + 0x4c, 0x1f, 0xe, 0xaa, 0x78, 0xde, 0xf8, 0xe2, 0xde, 0x1, 0xc3, 0xee, + 0x3, 0xf8, 0xde, 0xf7, 0x8d, 0x15, 0x32, 0x78, 0x53, 0x2b, 0xfb, 0x1d, + 0x1b, 0xfb, 0x40, 0x50, 0xf7, 0x47, 0xf7, 0xc, 0xf7, 0xa, 0xab, 0xf7, + 0x41, 0xf7, 0x5b, 0xf7, 0x19, 0xbc, 0x2c, 0x50, 0x9e, 0x1f, 0xe9, 0xa1, + 0x5, 0xf7, 0x2b, 0x60, 0xfb, 0xf, 0xcb, 0xfb, 0x15, 0x1b, 0xfb, 0x45, + 0xfb, 0x2d, 0xfb, 0x8, 0xfb, 0x96, 0xfb, 0x57, 0xe1, 0xfb, 0x4f, 0xf7, + 0x88, 0xd9, 0xf7, 0x41, 0xa2, 0xf7, 0x70, 0xc3, 0x1f, 0xe, 0xaa, 0xfb, + 0x60, 0x76, 0xf7, 0x67, 0xda, 0xf8, 0xe1, 0xde, 0x1, 0xb7, 0xee, 0xf7, + 0x85, 0xe1, 0x3, 0xf7, 0xda, 0x7d, 0x15, 0x72, 0x3f, 0x5, 0xbf, 0x8a, + 0xaa, 0x80, 0x70, 0x1a, 0x65, 0xfb, 0x7, 0x91, 0x78, 0x8a, 0x1e, 0x87, + 0x4c, 0x5, 0xf7, 0x2d, 0xd2, 0x9e, 0xd8, 0xae, 0x75, 0xb0, 0x4e, 0x92, + 0x1f, 0x91, 0xac, 0x5, 0xf7, 0x1e, 0xf7, 0x0, 0xd8, 0xf7, 0x3a, 0xb5, + 0x1f, 0x2b, 0xa4, 0x5, 0x2f, 0x75, 0x59, 0x2d, 0xfb, 0x1e, 0x1b, 0xfb, + 0x42, 0x51, 0xf7, 0x2d, 0xf7, 0x21, 0xf7, 0x1a, 0xbc, 0xf7, 0x35, 0xf7, + 0x52, 0xf7, 0x19, 0xb4, 0x2e, 0x50, 0x9d, 0x1f, 0xe9, 0xa1, 0x5, 0xf7, + 0x2c, 0x60, 0xfb, 0x7, 0xc8, 0xfb, 0x13, 0x1b, 0xfb, 0x31, 0xfb, 0x4a, + 0x28, 0xfb, 0xab, 0xfb, 0x38, 0xd0, 0xfb, 0x65, 0xf7, 0x69, 0x1f, 0xe, + 0xaa, 0x8b, 0xe0, 0xf8, 0xb8, 0xe0, 0x12, 0xdc, 0xea, 0xf8, 0x24, 0xed, + 0x17, 0xdc, 0x16, 0xf7, 0x8a, 0x6, 0xf7, 0x6e, 0xf7, 0x15, 0xf7, 0x10, + 0xf7, 0x82, 0x1f, 0x13, 0xe0, 0xf7, 0x9a, 0xfb, 0x24, 0xe9, 0xfb, 0x5f, + 0x1e, 0xfb, 0x8a, 0x6, 0xea, 0xfd, 0xd, 0x15, 0xf8, 0xb8, 0x7, 0x13, + 0xd0, 0xf7, 0x2b, 0x6, 0xf7, 0x2e, 0xea, 0x21, 0xfb, 0x39, 0xfb, 0xac, + 0xfb, 0x39, 0x8e, 0x37, 0x1f, 0xe, 0x73, 0x8b, 0xe0, 0xf7, 0x86, 0xe0, + 0xf7, 0x71, 0xe0, 0x6e, 0xa, 0x3, 0xe1, 0x16, 0xf9, 0x62, 0xf8, 0x85, + 0x36, 0xfc, 0x26, 0xfb, 0x71, 0xf8, 0x15, 0x36, 0xfc, 0x15, 0xfb, 0x86, + 0xf8, 0x26, 0x36, 0x7, 0xe, 0x43, 0xa, 0xc3, 0xf7, 0x1d, 0x36, 0xa, + 0xf7, 0x54, 0xc3, 0x2f, 0xa, 0xe, 0x43, 0xa, 0xf7, 0x55, 0x77, 0x36, + 0xa, 0xf2, 0xc3, 0x2c, 0xa, 0xe, 0x43, 0xa, 0xcc, 0xef, 0x6e, 0xa, + 0xa6, 0xe5, 0xe6, 0xe5, 0x30, 0xa, 0xf7, 0xe, 0xcc, 0x2e, 0xa, 0xe, + 0x43, 0xa, 0xc7, 0xf7, 0x19, 0x36, 0xa, 0xf7, 0x8f, 0xc7, 0x4c, 0xa, + 0x4a, 0xf7, 0x19, 0x59, 0xa, 0xaa, 0x8b, 0xe0, 0xf7, 0x7b, 0xe0, 0xf7, + 0x7c, 0xe0, 0x1, 0xdb, 0xea, 0xf8, 0x25, 0xed, 0x3, 0xdb, 0x16, 0xf7, + 0x89, 0x6, 0xf7, 0x5a, 0xf7, 0x2b, 0xf7, 0xc, 0xf7, 0x86, 0xf7, 0x9a, + 0xfb, 0x26, 0xe9, 0xfb, 0x5f, 0x1f, 0xfb, 0x89, 0xfb, 0xd1, 0x3b, 0x36, + 0xdb, 0x6, 0xea, 0xfb, 0x7b, 0x15, 0xf7, 0x7b, 0xf7, 0x57, 0xe0, 0xfb, + 0x57, 0xf7, 0x7c, 0xf7, 0x2a, 0x7, 0xf7, 0x34, 0xe6, 0x46, 0xfb, 0x5e, + 0xfb, 0xab, 0xfb, 0x3b, 0x8d, 0x37, 0x1f, 0xe, 0x73, 0x8b, 0xda, 0xf7, + 0x43, 0xcb, 0xdf, 0xcb, 0xf7, 0x41, 0xda, 0x1, 0x99, 0xf7, 0x93, 0x15, + 0xf4, 0x6, 0xfb, 0x40, 0xb7, 0xe4, 0x38, 0xf7, 0x6b, 0x1b, 0xc1, 0xc9, + 0x94, 0x9d, 0xbb, 0x1f, 0xed, 0x7, 0x68, 0x5e, 0x50, 0x80, 0x4f, 0x1b, + 0xfb, 0x20, 0x31, 0xcb, 0xf7, 0x4, 0x73, 0x1f, 0xf7, 0xe4, 0x6, 0x9a, + 0xcb, 0x5, 0xfb, 0xff, 0x6, 0x8a, 0x99, 0x8b, 0xae, 0x8c, 0xac, 0x8, + 0xf8, 0xf, 0x6, 0x9a, 0xcb, 0x5, 0xfc, 0x15, 0x6, 0xf7, 0x6, 0xa2, + 0xf7, 0x2, 0xc7, 0xf7, 0x19, 0x1b, 0xc5, 0xbf, 0x7b, 0x6c, 0xb8, 0x1f, + 0xa2, 0xe2, 0x5, 0xa7, 0x56, 0x4b, 0x96, 0x4e, 0x1b, 0xfb, 0x5b, 0xfb, + 0x12, 0x32, 0xfb, 0x38, 0x66, 0x1f, 0x37, 0x6, 0x7b, 0x4b, 0x5, 0xe7, + 0x6, 0x8a, 0x77, 0x8c, 0x61, 0x8c, 0x77, 0x8, 0x3e, 0x6, 0xe, 0x3b, + 0xa0, 0x76, 0xf7, 0xd8, 0xe0, 0xf7, 0x74, 0xe0, 0x6e, 0xa, 0x3, 0xe1, + 0x16, 0xea, 0xf7, 0xd8, 0xf7, 0xdb, 0xe0, 0xfb, 0xdb, 0xf7, 0x74, 0xf8, + 0x26, 0xe0, 0xfc, 0x85, 0x6, 0xe, 0xe2, 0x78, 0xe2, 0xf7, 0x66, 0xe2, + 0xf7, 0xb5, 0xde, 0x12, 0xbb, 0xea, 0xf8, 0x6a, 0xe6, 0x17, 0xf8, 0x29, + 0xf7, 0xaa, 0x15, 0xf7, 0x64, 0xfb, 0x1c, 0x6, 0x7d, 0x7a, 0x39, 0x4f, + 0x20, 0x1b, 0x13, 0x30, 0xfb, 0x3c, 0x2b, 0xf7, 0xc, 0xf7, 0x3b, 0xd2, + 0xa2, 0xf7, 0x78, 0xf7, 0x83, 0x1f, 0x13, 0xf8, 0xf7, 0x35, 0xa9, 0xfb, + 0x5, 0x5d, 0x98, 0x1f, 0xdf, 0xa3, 0x5, 0xc0, 0x7e, 0x64, 0xf7, 0x39, + 0xfb, 0x80, 0x1b, 0xfb, 0xb4, 0x46, 0xfb, 0x82, 0xfb, 0x24, 0xfb, 0x7b, + 0xf7, 0x24, 0xfb, 0x23, 0xf7, 0x6b, 0xf7, 0x2d, 0xf5, 0xdd, 0xaa, 0xb1, + 0x1f, 0xf7, 0xa3, 0xfb, 0xbf, 0x7, 0xe, 0xaa, 0xa0, 0x76, 0xf7, 0xe5, + 0xe0, 0xf7, 0xbc, 0x77, 0x1, 0xd8, 0xea, 0xf8, 0xf, 0xea, 0x3, 0xd8, + 0x16, 0xea, 0xf7, 0xe5, 0xf8, 0xf, 0xfb, 0xe5, 0xea, 0xf9, 0x62, 0x2c, + 0xfb, 0xbc, 0xfc, 0xf, 0xf7, 0xbc, 0x2c, 0x6, 0xe, 0xfc, 0x31, 0x39, + 0xa, 0xe6, 0xec, 0x3, 0xe6, 0x16, 0xec, 0xf9, 0x62, 0x2a, 0x6, 0xe, + 0x61, 0xa, 0xd2, 0xf9, 0xab, 0x4c, 0xa, 0xf7, 0x15, 0xf7, 0x1e, 0x38, + 0xa, 0x48, 0x51, 0xa, 0x4b, 0xa, 0xf9, 0xac, 0xf7, 0x1d, 0x1, 0xe5, + 0xea, 0x3, 0x85, 0xf9, 0xac, 0x15, 0xef, 0x6, 0xba, 0xde, 0xb8, 0x38, + 0x5, 0xee, 0x6, 0x26, 0x42, 0xa, 0x8a, 0x51, 0xa, 0x4b, 0xa, 0xf9, + 0xb5, 0xef, 0x12, 0x98, 0xe5, 0x7e, 0xea, 0x82, 0xe5, 0x13, 0xd0, 0xe5, + 0x16, 0xea, 0xf9, 0x60, 0x2c, 0x6, 0x13, 0xe8, 0x3e, 0xe0, 0x58, 0xa, + 0x61, 0xa, 0xf7, 0x1e, 0xf9, 0xaa, 0x15, 0xd1, 0x6, 0x35, 0xf7, 0x1f, + 0x38, 0xa, 0xde, 0x51, 0xa, 0xfb, 0x53, 0x78, 0xe0, 0xf9, 0x20, 0x77, + 0x1, 0x9c, 0xe1, 0xf7, 0x7a, 0xea, 0x3, 0x9c, 0xf7, 0x5b, 0x15, 0xfb, + 0x4c, 0xf7, 0x19, 0x69, 0xd2, 0xf7, 0x49, 0xa5, 0xf7, 0x13, 0xf7, 0x3, + 0x1e, 0xf8, 0x87, 0x2c, 0xfc, 0x87, 0x7, 0x50, 0x86, 0x2d, 0x20, 0x27, + 0x7b, 0xeb, 0xbc, 0x89, 0x1e, 0xe, 0x73, 0x39, 0xa, 0xd7, 0xea, 0x3, + 0xd7, 0x16, 0xea, 0xf7, 0x8c, 0x6, 0xf7, 0xa, 0xf7, 0x6, 0xf7, 0x8d, + 0xfb, 0xfe, 0x5, 0xf7, 0x11, 0x6, 0xfb, 0xc8, 0xf8, 0x3e, 0xf7, 0xbf, + 0xf7, 0xb8, 0x5, 0xfb, 0x14, 0x6, 0xfb, 0xf7, 0xfb, 0xf9, 0x5, 0xf7, + 0xf9, 0x2c, 0x7, 0xe, 0x8b, 0xe0, 0xf9, 0xd, 0x77, 0x1, 0xd7, 0xea, + 0x3, 0xd7, 0x16, 0xf8, 0x61, 0xe0, 0xfc, 0x2, 0xf9, 0xd, 0x2c, 0x6, + 0xe, 0x8b, 0xe0, 0xf9, 0xd, 0x77, 0x1, 0xd6, 0xea, 0x3, 0xd6, 0x16, + 0xf8, 0x62, 0xe0, 0xfc, 0x3, 0xf7, 0xa4, 0x6, 0xf7, 0x35, 0x5a, 0xa, + 0xdd, 0x7, 0xfb, 0x35, 0xfb, 0x1e, 0x5, 0xf7, 0xac, 0x2c, 0xfb, 0xfc, + 0x7, 0x2c, 0x38, 0x5, 0x3a, 0x7, 0xea, 0xdd, 0x5, 0xe, 0xf7, 0x22, + 0x39, 0xa, 0xd4, 0xe5, 0xf8, 0x90, 0xe5, 0x3, 0xd4, 0x16, 0xe5, 0xf8, + 0xf7, 0x8e, 0x6, 0xf7, 0x64, 0xfc, 0xf7, 0x5, 0xe0, 0x6, 0xf7, 0x66, + 0xf8, 0xed, 0x5, 0x8d, 0xfc, 0xed, 0xe5, 0xf9, 0x62, 0xfb, 0x16, 0x6, + 0xfb, 0x65, 0xfc, 0xfb, 0x5, 0x89, 0x6, 0xfb, 0x5e, 0xf8, 0xfb, 0x5, + 0xfb, 0x25, 0x6, 0xe, 0xaa, 0x39, 0xa, 0xd7, 0xe5, 0xf8, 0x1a, 0xe5, + 0x3, 0xd7, 0x16, 0xe5, 0xf8, 0xc8, 0x8d, 0x6, 0xf8, 0x11, 0xfc, 0xc8, + 0x5, 0xec, 0xf9, 0x62, 0x31, 0xfc, 0xc8, 0x89, 0x6, 0xfc, 0x11, 0xf8, + 0xc8, 0x5, 0x2a, 0x6, 0xe, 0xaa, 0xa0, 0x76, 0xf8, 0xd7, 0xf7, 0x2e, + 0xf7, 0x22, 0xb5, 0x1, 0xd7, 0xe5, 0xf8, 0x1a, 0xe5, 0x3, 0xd7, 0x16, + 0xe5, 0xf8, 0xc6, 0x8d, 0x6, 0xf8, 0x11, 0xfc, 0xc6, 0x5, 0xec, 0xf9, + 0x60, 0x31, 0xfc, 0xc6, 0x6, 0xfc, 0x13, 0xf8, 0xc6, 0x5, 0x2a, 0x6, + 0xf7, 0x18, 0xe3, 0x6b, 0xa, 0xa1, 0xa1, 0x7f, 0x80, 0xa1, 0x1f, 0x7f, + 0xa1, 0xa1, 0x80, 0x53, 0xa, 0x87, 0x78, 0x94, 0x95, 0x73, 0x1f, 0x96, + 0x72, 0x6c, 0x96, 0x71, 0x1b, 0x73, 0xa, 0xe2, 0x78, 0xde, 0xf8, 0xe2, + 0xde, 0x1, 0xc7, 0xef, 0xf8, 0x5f, 0xef, 0x3, 0xb2, 0xf7, 0xf8, 0x15, + 0xfb, 0x4f, 0xf7, 0xd, 0xfb, 0x50, 0xf7, 0x78, 0xf7, 0x57, 0xf7, 0x30, + 0xf7, 0x1f, 0xf7, 0x80, 0xf7, 0x7f, 0xfb, 0x2c, 0xf7, 0x26, 0xfb, 0x5b, + 0xfb, 0x4c, 0xfb, 0x39, 0xfb, 0xe, 0xfb, 0x97, 0x1e, 0xef, 0x16, 0xf7, + 0x18, 0xcf, 0xf7, 0x3a, 0xf7, 0x49, 0xf7, 0x10, 0xf7, 0x13, 0x32, 0xfb, + 0x65, 0xfb, 0x5c, 0xfb, 0xa, 0x2f, 0xfb, 0x19, 0xfb, 0x28, 0x26, 0xf7, + 0xd, 0xf7, 0x3f, 0x1e, 0xe, 0xf7, 0xc9, 0x78, 0xd7, 0x4c, 0xe0, 0xf7, + 0x8d, 0xe0, 0xf7, 0x79, 0xe0, 0x49, 0xd7, 0x12, 0xcd, 0xed, 0xf8, 0x2, + 0xe3, 0x13, 0x76, 0xf8, 0xa6, 0x85, 0x15, 0xf8, 0x47, 0xe0, 0xfb, 0xef, + 0xf7, 0x8d, 0xf7, 0xc7, 0xe0, 0xfb, 0xc7, 0xf7, 0x79, 0xf7, 0xe0, 0xe0, + 0xfc, 0x39, 0x2a, 0x89, 0x6, 0x13, 0x8e, 0xe2, 0x59, 0x39, 0x9f, 0x43, + 0x1b, 0xfb, 0x66, 0x3e, 0xfb, 0x48, 0xfb, 0x57, 0xfb, 0x3b, 0xca, 0xfb, + 0x6a, 0xf7, 0x74, 0xb5, 0xf1, 0x92, 0xf7, 0x1, 0xc8, 0x1f, 0x8d, 0x6, + 0xfc, 0x20, 0xf7, 0x9d, 0x15, 0xf7, 0xf, 0xac, 0xf7, 0x44, 0xf7, 0x30, + 0xf7, 0x2f, 0xb9, 0xfb, 0x5d, 0x29, 0xfb, 0xe, 0x58, 0xfb, 0x4b, 0xfb, + 0x2a, 0x25, 0x34, 0xf2, 0xf7, 0x5e, 0x1e, 0xe, 0x4f, 0xa, 0xbd, 0xf7, + 0x1d, 0x45, 0xa, 0xf7, 0xe2, 0xf9, 0xac, 0x2f, 0xa, 0xfb, 0xf2, 0x26, + 0xa, 0x4f, 0xa, 0xf7, 0x4f, 0x77, 0x45, 0xa, 0xf7, 0x7f, 0xf9, 0xac, + 0x2c, 0xa, 0xfb, 0xb8, 0x26, 0xa, 0x4f, 0xa, 0x45, 0xa, 0xbc, 0xf7, + 0xf9, 0x21, 0xa, 0xf4, 0xf8, 0x50, 0x2e, 0xa, 0xe, 0x4f, 0xa, 0xb9, + 0xf7, 0x21, 0x45, 0xa, 0xf8, 0x12, 0xf9, 0xa8, 0x15, 0xd5, 0x6, 0x49, + 0xf7, 0x21, 0x5, 0xfb, 0xa, 0x6, 0xfb, 0x73, 0x26, 0xa, 0xe2, 0x87, + 0xda, 0x42, 0x76, 0xf9, 0x28, 0xda, 0x9c, 0x77, 0x12, 0xb8, 0xed, 0xf8, + 0x7c, 0xed, 0x13, 0x6c, 0xb2, 0xa0, 0x15, 0xbc, 0x63, 0xdc, 0xe5, 0x5, + 0x13, 0x9c, 0x6c, 0xb6, 0xc4, 0x5f, 0xf7, 0xb, 0x1b, 0xf7, 0x48, 0xf7, + 0x35, 0xf7, 0x10, 0xf7, 0x80, 0xf7, 0x17, 0x60, 0xcd, 0x6a, 0xbb, 0x1f, + 0xe2, 0xeb, 0x5a, 0xb3, 0x39, 0x30, 0x5, 0x13, 0xac, 0xab, 0x60, 0x4e, + 0xb5, 0xfb, 0x9, 0x1b, 0xfb, 0x65, 0xfb, 0x1a, 0xfb, 0x25, 0xfb, 0x6d, + 0xfb, 0xf, 0xb2, 0x52, 0xb4, 0x4d, 0x1f, 0xc8, 0xce, 0x15, 0x76, 0xb3, + 0x75, 0xb3, 0xea, 0x1a, 0xf7, 0x75, 0xf7, 0x21, 0xc5, 0xf3, 0xdd, 0xb3, + 0x6f, 0x6c, 0xb3, 0x1e, 0xfb, 0xd7, 0xfc, 0x53, 0x15, 0xf8, 0x0, 0xf8, + 0x21, 0x5, 0xa4, 0x5d, 0x9a, 0x52, 0x42, 0x1a, 0xfb, 0x48, 0x24, 0x26, + 0xfb, 0x20, 0x34, 0x5c, 0xb2, 0xa0, 0x70, 0x1e, 0xe, 0x4f, 0xa, 0x45, + 0xa, 0xf7, 0x76, 0xf9, 0xb8, 0x15, 0xcc, 0x6, 0xbb, 0xab, 0x8a, 0x90, + 0x9e, 0xa2, 0x82, 0x80, 0xa3, 0x1e, 0x7f, 0xa7, 0xa3, 0x7d, 0x96, 0x1b, + 0xa0, 0xd6, 0x86, 0xf7, 0x9, 0x56, 0xa, 0x87, 0x78, 0x94, 0x96, 0x73, + 0x1f, 0x72, 0x96, 0x6d, 0x96, 0x70, 0x8a, 0x8, 0x5a, 0x59, 0x67, 0x3f, + 0x1f, 0xfb, 0x45, 0xfc, 0x53, 0x21, 0xa, 0xe, 0x5f, 0xa, 0xf7, 0xb6, + 0xe0, 0xf7, 0x96, 0xe0, 0x6e, 0xa, 0xf7, 0xda, 0xed, 0x3, 0xe1, 0x16, + 0xea, 0xf7, 0xb6, 0xf7, 0x44, 0x6, 0xf7, 0x18, 0xf7, 0x19, 0xbb, 0xf7, + 0x3c, 0xf7, 0x39, 0xfb, 0x15, 0xba, 0xfb, 0x1c, 0x1f, 0xfb, 0xa3, 0x6, + 0xea, 0xfb, 0xeb, 0x15, 0xf7, 0x96, 0xf7, 0x44, 0x7, 0xeb, 0xd2, 0x71, + 0x26, 0xfb, 0x12, 0xfb, 0x7, 0x86, 0x57, 0x1f, 0xe, 0xe2, 0x68, 0x76, + 0xb7, 0xdd, 0xf8, 0xdd, 0xdd, 0x1, 0xc3, 0xed, 0xf8, 0x6f, 0xed, 0x3, + 0xf8, 0xc2, 0xab, 0x15, 0x6c, 0x53, 0x50, 0x7e, 0x4e, 0x1b, 0xfb, 0x5c, + 0xfb, 0x23, 0xf7, 0x2e, 0xf7, 0x70, 0xf7, 0x68, 0xf7, 0x13, 0xf7, 0x37, + 0xf7, 0x6c, 0xf7, 0x5a, 0xf7, 0x27, 0xfb, 0x27, 0xfb, 0x78, 0x37, 0x77, + 0xfb, 0x7, 0x33, 0x36, 0x1f, 0xb0, 0x70, 0xb3, 0x74, 0xb6, 0x7a, 0x70, + 0x48, 0x18, 0x58, 0x9e, 0x58, 0xa8, 0x57, 0xb3, 0x8, 0xfb, 0x29, 0xf7, + 0x3c, 0x15, 0xd7, 0x76, 0xae, 0x71, 0xa3, 0x74, 0x8, 0xd3, 0xcb, 0x98, + 0xef, 0xcf, 0x1a, 0xf7, 0x60, 0xfb, 0xe, 0xe4, 0xfb, 0x11, 0x26, 0xfb, + 0x24, 0x50, 0xfb, 0x7e, 0xfb, 0x6b, 0xf7, 0x13, 0x3e, 0xf7, 0xa, 0xbe, + 0xaf, 0x99, 0x90, 0x96, 0x1e, 0x6c, 0x9e, 0x6f, 0x99, 0x68, 0x93, 0x8, + 0xe, 0xaa, 0xa0, 0x76, 0xf7, 0xd0, 0xe0, 0xf7, 0x82, 0xda, 0x1, 0xe3, + 0xea, 0xf7, 0xec, 0xed, 0x3, 0xe3, 0x16, 0xea, 0xf7, 0xd0, 0xcb, 0x6, + 0xda, 0xb6, 0x84, 0xfb, 0x35, 0xf1, 0x1f, 0xe9, 0xfb, 0x28, 0x5, 0xf7, + 0xb, 0x6, 0xfb, 0xd, 0xf7, 0x43, 0x53, 0xe2, 0x5c, 0xb9, 0x67, 0x9c, + 0x19, 0x8d, 0x7, 0xf7, 0xe, 0x9b, 0xda, 0xcb, 0xf7, 0x7, 0x1a, 0xf7, + 0x2c, 0xfb, 0x25, 0xb7, 0xfb, 0x15, 0x1e, 0xfb, 0x9b, 0x6, 0xea, 0xfb, + 0xd1, 0x15, 0xf7, 0x82, 0xf7, 0x3c, 0x7, 0xd5, 0xf1, 0x72, 0x2f, 0x24, + 0x2a, 0x79, 0x3c, 0x1f, 0xe, 0x73, 0x78, 0xe2, 0xf8, 0xda, 0xe2, 0x1, + 0xd7, 0xe6, 0xf7, 0xf5, 0xe6, 0x3, 0xbc, 0xf7, 0x79, 0x15, 0xfb, 0x27, + 0x9b, 0xd2, 0x26, 0xf7, 0x6b, 0x1b, 0xf7, 0x37, 0xf5, 0xe6, 0xf7, 0xd, + 0xf7, 0x35, 0xfb, 0x2a, 0xb5, 0xfb, 0x17, 0xa8, 0x1f, 0xfb, 0x18, 0xa9, + 0x63, 0x9c, 0xcb, 0x1a, 0xe6, 0xee, 0xa2, 0xc9, 0xf7, 0x29, 0xa4, 0x35, + 0x56, 0x90, 0x1e, 0xe7, 0x92, 0x5, 0xf7, 0x24, 0x86, 0xfb, 0x3, 0xd6, + 0xfb, 0x2f, 0x1b, 0xfb, 0x33, 0x2e, 0x33, 0xfb, 0x5, 0xfb, 0x26, 0xf7, + 0x22, 0x69, 0xe8, 0x74, 0x1f, 0xf7, 0x26, 0x68, 0xd3, 0x78, 0x35, 0x1a, + 0x3a, 0x3c, 0x5f, 0x28, 0x41, 0xfb, 0xe, 0xab, 0xf7, 0x1d, 0x7b, 0x1e, + 0xe, 0x73, 0x78, 0xe0, 0xf8, 0xcc, 0xe0, 0x1, 0xd9, 0xe5, 0xf7, 0xef, + 0xe6, 0x3, 0xbc, 0xf7, 0x74, 0x15, 0xfb, 0x10, 0xa1, 0xcd, 0xfb, 0xb, + 0xf7, 0x6a, 0x1b, 0xf7, 0x37, 0xf5, 0xe4, 0xf7, 0xb, 0xf7, 0x31, 0xfb, + 0x2a, 0xb4, 0xfb, 0x17, 0xa8, 0x1f, 0xfb, 0x17, 0xa8, 0x63, 0x9c, 0xc9, + 0x1a, 0xe4, 0xee, 0xa3, 0xc9, 0xf7, 0x28, 0xa4, 0x36, 0x57, 0x90, 0x1e, + 0xe6, 0x92, 0x5, 0xf7, 0x21, 0x86, 0xfb, 0x2, 0xd5, 0xfb, 0x2e, 0x1b, + 0xfb, 0x33, 0x2f, 0x34, 0xfb, 0x3, 0xfb, 0x23, 0xf7, 0x21, 0x6a, 0xe8, + 0x75, 0x1f, 0xf7, 0x25, 0x68, 0xd3, 0x79, 0x37, 0x1a, 0x3b, 0x3c, 0x60, + 0x28, 0x42, 0xfb, 0x6, 0xad, 0xf7, 0x18, 0x72, 0x1e, 0xf7, 0x2a, 0xf8, + 0xc4, 0x37, 0xa, 0x3b, 0xa0, 0x76, 0xf9, 0xd, 0xe0, 0x1, 0xf7, 0x95, + 0xea, 0x3, 0xf7, 0x95, 0x16, 0xea, 0xf9, 0xd, 0xf7, 0x89, 0xe0, 0xfc, + 0xdb, 0x36, 0xf7, 0x87, 0x6, 0xe, 0x5f, 0xa, 0xf7, 0x25, 0xe0, 0xf7, + 0x94, 0xe0, 0xf7, 0x27, 0x77, 0x6e, 0xa, 0xf7, 0xeb, 0xed, 0x3, 0xe1, + 0x16, 0xea, 0xf7, 0x25, 0xf7, 0x39, 0x6, 0xf7, 0x18, 0xf7, 0x24, 0xb9, + 0xf7, 0x3d, 0xf7, 0x35, 0xfb, 0x1b, 0xbd, 0xfb, 0x21, 0x1f, 0xfb, 0x39, + 0xf7, 0x27, 0x2c, 0x6, 0xea, 0xfc, 0x7c, 0x15, 0xf7, 0x94, 0xf7, 0x39, + 0x7, 0xe5, 0xe3, 0x79, 0xfb, 0x0, 0xfb, 0x13, 0xfb, 0x15, 0x88, 0x5a, + 0x1f, 0xe, 0xaa, 0x78, 0xe0, 0xf9, 0x20, 0x77, 0x41, 0xa, 0xf9, 0x62, + 0x15, 0xfc, 0x3a, 0x7, 0xfb, 0x13, 0x91, 0xfb, 0x50, 0xf7, 0xa3, 0xf7, + 0xac, 0x93, 0xf7, 0x70, 0xea, 0x1e, 0xf8, 0x3a, 0x2c, 0xfc, 0x3a, 0x7, + 0xfb, 0x15, 0x7a, 0x26, 0xfb, 0x44, 0xfb, 0x48, 0x89, 0xf7, 0x23, 0xe2, + 0x1e, 0xf8, 0x3a, 0x7, 0xe, 0x2b, 0xa, 0xf7, 0x18, 0xda, 0x2f, 0xa, + 0xe, 0x2b, 0xa, 0xac, 0xda, 0x2c, 0xa, 0xe, 0xaa, 0x78, 0xe0, 0xf9, + 0x6e, 0xef, 0x2a, 0xa, 0xbf, 0xe3, 0x2e, 0xa, 0xe, 0x2b, 0xa, 0xf7, + 0x3f, 0xda, 0x5e, 0xa, 0x73, 0x39, 0xa, 0xf7, 0xb5, 0x16, 0xe8, 0x6, + 0xf7, 0x9d, 0xf9, 0x62, 0x5, 0x30, 0x6, 0xfb, 0x71, 0xfd, 0x13, 0xfb, + 0x6e, 0xf9, 0x13, 0x5, 0x2a, 0x6, 0xe, 0xf7, 0x91, 0x39, 0xa, 0xf7, + 0x62, 0x16, 0xea, 0x6, 0xf7, 0x3c, 0xf9, 0xc, 0x5, 0x8c, 0x6, 0xf7, + 0x40, 0xfd, 0xc, 0x5, 0xe5, 0x6, 0xf7, 0x58, 0xf9, 0x62, 0x5, 0x2d, + 0x6, 0xfb, 0x27, 0xfc, 0xfe, 0xfb, 0x32, 0xf8, 0xfe, 0x5, 0xfb, 0x2, + 0x6, 0xfb, 0x3a, 0xfc, 0xfe, 0x5, 0x89, 0x6, 0xfb, 0x1f, 0xf8, 0xfe, + 0x5, 0x2b, 0x6, 0xe, 0x73, 0x39, 0xa, 0x9e, 0x16, 0xf7, 0x1, 0x6, + 0xf7, 0x61, 0xf7, 0xc4, 0x5, 0x8c, 0x6, 0xf7, 0x5e, 0xfb, 0xc4, 0x5, + 0xf7, 0x4, 0x6, 0xfb, 0x98, 0xf8, 0x10, 0xf7, 0x85, 0xf7, 0xe6, 0x5, + 0x32, 0x6, 0xfb, 0x5f, 0xfb, 0xa5, 0xfb, 0x47, 0xf7, 0xa5, 0x5, 0xfb, + 0x0, 0x6, 0xf7, 0x7f, 0xfb, 0xec, 0x5, 0xe, 0x73, 0x39, 0xa, 0xf7, + 0xaf, 0xe8, 0x3, 0xf7, 0xaf, 0x16, 0xe8, 0xf7, 0xc3, 0x6, 0xf7, 0xa9, + 0xf8, 0x33, 0x5, 0x20, 0x6, 0xfb, 0x67, 0xfb, 0xe7, 0xfb, 0x65, 0xf7, + 0xe7, 0x5, 0xfb, 0x4, 0x6, 0xf7, 0xa1, 0xfc, 0x33, 0x5, 0xe, 0x5f, + 0xa, 0xf9, 0xac, 0xf7, 0x1d, 0x1, 0xf7, 0xad, 0xea, 0x3, 0x57, 0xa, + 0xfb, 0x65, 0xfb, 0xe2, 0xfb, 0x60, 0xf7, 0xe2, 0x5, 0xfb, 0x8, 0x6, + 0xf7, 0x9f, 0xfc, 0x2e, 0x5, 0x88, 0xf8, 0x7d, 0x2f, 0xa, 0xe, 0x5f, + 0xa, 0xf9, 0xb5, 0xef, 0x12, 0xf7, 0x5a, 0xe5, 0x84, 0xea, 0x8e, 0xe5, + 0x13, 0xd8, 0x57, 0xa, 0xfb, 0x6a, 0xfb, 0xe2, 0xfb, 0x5c, 0xf7, 0xe2, + 0x38, 0xa, 0xf7, 0x9f, 0xfc, 0x2e, 0x5, 0x13, 0xe8, 0x38, 0xf8, 0x86, + 0x2e, 0xa, 0xe, 0x3b, 0x8b, 0xe0, 0xf8, 0xb8, 0xe0, 0x6a, 0xa, 0xf8, + 0x4f, 0xf8, 0xb8, 0x5, 0xe0, 0xfc, 0x93, 0x36, 0xf8, 0x22, 0x7, 0xfc, + 0x4b, 0xfc, 0xb4, 0x5, 0xe, 0x3b, 0x8b, 0xe0, 0xf8, 0xb3, 0xe0, 0xf7, + 0x6c, 0x77, 0x6a, 0xa, 0xf8, 0x51, 0xf8, 0xb3, 0x5, 0xe0, 0xfc, 0x95, + 0x36, 0xf8, 0x24, 0x7, 0xfc, 0x4d, 0xfc, 0xaf, 0x5, 0xf7, 0x82, 0xf9, + 0x53, 0x37, 0xa, 0x7c, 0xd0, 0xf8, 0x30, 0xd3, 0x1, 0xaf, 0xe9, 0xf7, + 0xa0, 0xe3, 0x3, 0xbe, 0xf8, 0xd, 0x15, 0xe1, 0x80, 0x5, 0xb6, 0x96, + 0x9b, 0xc4, 0xf7, 0x2, 0x1b, 0xf7, 0x15, 0x88, 0x3a, 0x53, 0x89, 0x1f, + 0x59, 0x79, 0x2e, 0x81, 0x7e, 0x89, 0x8, 0x52, 0x84, 0xfb, 0x29, 0x7a, + 0xfb, 0x1e, 0x1a, 0x35, 0xcc, 0x49, 0xf7, 0x6, 0xc3, 0xc6, 0x98, 0xca, + 0xd5, 0x1e, 0x8d, 0x7e, 0x9d, 0x73, 0x99, 0x70, 0x8, 0xe7, 0x6, 0x6f, + 0xbd, 0x7b, 0x92, 0xf7, 0x19, 0x1a, 0xf7, 0x28, 0x7, 0xe5, 0x80, 0xf7, + 0x5, 0xfb, 0x5d, 0xfb, 0x5c, 0x7e, 0xfb, 0x7, 0x5d, 0x81, 0x1e, 0xf7, + 0xef, 0xfb, 0x9, 0x15, 0x40, 0x87, 0x5f, 0x68, 0x65, 0x1e, 0x5f, 0x62, + 0x3d, 0x86, 0x72, 0x1b, 0x3c, 0x85, 0xbb, 0xb0, 0xd1, 0xc5, 0x95, 0xc1, + 0x93, 0x1f, 0xb9, 0x92, 0xd7, 0x98, 0xad, 0x98, 0x8, 0xe, 0x40, 0xa, + 0xce, 0xf7, 0x1d, 0x49, 0xa, 0x3f, 0xa, 0xfb, 0x1f, 0xfc, 0xb, 0x20, + 0xa, 0x40, 0xa, 0xf7, 0x60, 0x77, 0x49, 0xa, 0x3a, 0xa, 0x3a, 0xfc, + 0xb, 0x20, 0xa, 0x54, 0xa, 0xf7, 0xe, 0xf8, 0xe5, 0x4c, 0xa, 0xf7, + 0x11, 0xf7, 0x21, 0x59, 0xa, 0x40, 0xa, 0xd7, 0xef, 0x49, 0xa, 0x3e, + 0xa, 0xfb, 0x43, 0xfb, 0xef, 0x20, 0xa, 0xf7, 0x5a, 0x7c, 0xd4, 0xf7, + 0x47, 0xd3, 0xf7, 0x31, 0xd3, 0x1, 0xaf, 0xe9, 0xf7, 0x94, 0xe4, 0x3, + 0xbc, 0xf8, 0x4, 0x15, 0xe1, 0x81, 0x5, 0xba, 0x95, 0xb0, 0xc8, 0xe6, + 0x1b, 0xf6, 0x95, 0x50, 0x3b, 0x87, 0x1f, 0x64, 0x7f, 0x58, 0x88, 0x50, + 0x83, 0x8, 0x25, 0x7d, 0x28, 0x3f, 0x3e, 0x1a, 0x63, 0xa4, 0xfb, 0x4, + 0xf7, 0x2d, 0xed, 0xcc, 0xbd, 0xbd, 0xbd, 0x1e, 0x3d, 0xc7, 0xcc, 0x75, + 0xce, 0x1b, 0xf7, 0x1e, 0xcb, 0xe2, 0xe2, 0xa4, 0x1f, 0x30, 0x97, 0x5, + 0x65, 0x82, 0x69, 0x40, 0x2e, 0x1b, 0x2b, 0x50, 0xdd, 0xec, 0x96, 0x1f, + 0xf8, 0x8, 0x6, 0xf7, 0x38, 0x51, 0xf7, 0x1d, 0xfb, 0x3e, 0x25, 0x5f, + 0x5a, 0x76, 0x77, 0x1e, 0xa1, 0x7e, 0x6d, 0xbb, 0xfb, 0x1d, 0x1b, 0xfb, + 0x4e, 0x71, 0xfb, 0xc, 0x59, 0x7f, 0x1f, 0xf7, 0xe7, 0xfb, 0x0, 0x15, + 0xfb, 0x12, 0xa2, 0x3e, 0x3c, 0xfb, 0xc, 0x1b, 0x33, 0x8f, 0xc8, 0xa3, + 0xb6, 0xd2, 0xb0, 0xaf, 0x91, 0x1f, 0xbf, 0x93, 0xc8, 0x94, 0xb1, 0x9c, + 0x8, 0xe2, 0xbc, 0x15, 0xd5, 0x90, 0xb4, 0xde, 0xed, 0x1b, 0xf7, 0x14, + 0x93, 0xfb, 0x11, 0x6b, 0x8e, 0x1f, 0xe, 0x40, 0xa, 0xcf, 0xf7, 0x1c, + 0x12, 0xba, 0xe9, 0xf7, 0x8d, 0xe3, 0x13, 0xbc, 0xf7, 0x9a, 0xf8, 0xea, + 0x4c, 0xa, 0x4a, 0xf7, 0x1c, 0x38, 0xa, 0x86, 0xfc, 0xb, 0x24, 0xa, + 0x13, 0x7c, 0x25, 0xa, 0x13, 0xbc, 0x28, 0xa, 0x73, 0x7c, 0xda, 0xf8, + 0xda, 0xd3, 0x12, 0xb7, 0xe8, 0x87, 0xe5, 0xf7, 0x38, 0xe5, 0x13, 0xe8, + 0xf7, 0x69, 0xf8, 0x2b, 0x15, 0xfb, 0x12, 0x4e, 0x60, 0x42, 0x3b, 0x1a, + 0x2f, 0xd4, 0xfb, 0x8, 0xf7, 0x2d, 0xde, 0xcd, 0xab, 0xca, 0xc3, 0x1e, + 0x99, 0x7c, 0xb7, 0x5f, 0xc0, 0x68, 0xc6, 0xce, 0x18, 0x64, 0xa7, 0x62, + 0xaf, 0x6a, 0xb5, 0xa8, 0xb7, 0x9e, 0xbb, 0x9b, 0xca, 0x30, 0x9e, 0x18, + 0x88, 0x7f, 0x81, 0x5e, 0x76, 0x60, 0xfb, 0x15, 0xf7, 0x38, 0x18, 0xea, + 0xbd, 0xb3, 0xbe, 0xcd, 0x1a, 0xdd, 0x44, 0xd3, 0x27, 0x1e, 0x13, 0xd8, + 0x22, 0x47, 0x45, 0x37, 0x5f, 0x9d, 0x62, 0xc9, 0x43, 0x1f, 0xb9, 0x52, + 0x15, 0xf7, 0x35, 0xfb, 0x5c, 0x5, 0x5c, 0x6c, 0x4f, 0x64, 0x51, 0x1b, + 0x13, 0xe8, 0x2d, 0x63, 0xe1, 0xba, 0xcf, 0xc7, 0xba, 0xc9, 0xb1, 0x1f, + 0xb1, 0xf2, 0x15, 0x13, 0xd8, 0x47, 0xdb, 0x85, 0x97, 0x9e, 0x1a, 0xbe, + 0xb7, 0xaa, 0xb2, 0xb2, 0xb5, 0x70, 0x54, 0x4d, 0x5d, 0x74, 0x5f, 0x71, + 0x1e, 0xe, 0x40, 0xa, 0xbb, 0xaf, 0xf5, 0xaf, 0x12, 0xba, 0xe9, 0xbd, + 0xaf, 0xf3, 0xaf, 0xa2, 0xe3, 0x13, 0x7f, 0x80, 0xf7, 0x53, 0xf9, 0x2f, + 0x64, 0xa, 0xb3, 0x5a, 0x5a, 0x65, 0x63, 0x5a, 0x1e, 0xaf, 0x8c, 0x15, + 0xa6, 0xa0, 0xa4, 0xaa, 0xaa, 0xa0, 0x72, 0x6f, 0x6e, 0x74, 0x73, 0x6e, + 0x70, 0x72, 0xa1, 0xab, 0x1e, 0x3d, 0xfb, 0xc9, 0x22, 0xa, 0x13, 0xbf, + 0x80, 0x28, 0xa, 0xfb, 0x72, 0xf7, 0xb1, 0x76, 0xf8, 0x3c, 0x77, 0x1, + 0x7d, 0xf7, 0x9c, 0x15, 0xe5, 0x6, 0xf7, 0x32, 0xf7, 0xd9, 0xf7, 0x34, + 0xfb, 0xd9, 0x5, 0xe4, 0x6, 0xfb, 0x69, 0xf8, 0x3c, 0x5, 0x44, 0x6, + 0xe, 0x20, 0xf7, 0x49, 0xe1, 0x49, 0x76, 0xc6, 0xe1, 0x8c, 0x77, 0x12, + 0x13, 0x60, 0xc8, 0xf7, 0x48, 0x15, 0xa6, 0xa8, 0xae, 0xab, 0xc1, 0x1b, + 0xbc, 0xaf, 0x7a, 0x7b, 0xb0, 0x1f, 0x13, 0x90, 0x7e, 0xa9, 0xa9, 0x7f, + 0xb1, 0x1b, 0xc9, 0xae, 0xa5, 0xa3, 0xa6, 0x1f, 0xea, 0x7, 0x82, 0x83, + 0x59, 0x59, 0x51, 0x1b, 0x6e, 0x69, 0x96, 0x97, 0x69, 0x1f, 0x13, 0x60, + 0x9b, 0x5e, 0x5e, 0x9e, 0x69, 0x1b, 0x64, 0x59, 0x7f, 0x63, 0x67, 0x1f, + 0xe, 0xfb, 0xc2, 0xf8, 0x58, 0x76, 0xf7, 0xb3, 0x77, 0x1, 0xf7, 0x16, + 0xf8, 0x43, 0x15, 0x9f, 0xa5, 0x99, 0xa0, 0xa7, 0xbf, 0xa3, 0x63, 0x98, + 0x74, 0xa6, 0x67, 0xc4, 0xb3, 0x18, 0x86, 0x8f, 0x54, 0xcb, 0x75, 0x9e, + 0xaf, 0x8f, 0xbf, 0x97, 0xa9, 0x94, 0x75, 0xcd, 0x18, 0x72, 0x83, 0x59, + 0x79, 0x67, 0x79, 0x8, 0x93, 0xbf, 0x8d, 0xb3, 0xa0, 0x1a, 0x48, 0x6, + 0x6c, 0x8d, 0x79, 0x93, 0x4a, 0x1e, 0x83, 0x84, 0x3d, 0xb7, 0x75, 0x93, + 0x75, 0x49, 0x18, 0xb3, 0x81, 0xaf, 0x83, 0xb1, 0x84, 0x3d, 0x34, 0x18, + 0xe, 0xf7, 0xd8, 0x5c, 0xc8, 0x4e, 0xf7, 0x4e, 0x82, 0xcc, 0xf7, 0xdb, + 0xca, 0xf7, 0x1, 0xc7, 0x12, 0xf7, 0x1c, 0xc6, 0xe8, 0xd6, 0xf8, 0x5e, + 0xc6, 0x13, 0xbf, 0xf8, 0xc3, 0xf7, 0x5c, 0x15, 0x71, 0x8e, 0x90, 0x5f, + 0xd1, 0x1b, 0xf7, 0xc, 0xf7, 0xf, 0xf7, 0x1c, 0xf7, 0x38, 0xf7, 0x33, + 0xfb, 0xb, 0xf7, 0x39, 0xfb, 0x7a, 0xfb, 0xc5, 0x31, 0xfb, 0x99, 0xfb, + 0x3a, 0xfb, 0x5a, 0xf7, 0x7, 0xfb, 0x44, 0xf7, 0xb8, 0x1f, 0x13, 0x5f, + 0xf7, 0x97, 0xe3, 0xf7, 0x39, 0xa0, 0x95, 0x1f, 0x42, 0x6, 0x13, 0xbf, + 0x62, 0x6d, 0x3e, 0x37, 0xfb, 0x45, 0x1b, 0xfb, 0x3d, 0xfb, 0x47, 0xd0, + 0xf7, 0x88, 0xf7, 0x54, 0xf7, 0x15, 0xf7, 0x43, 0xf7, 0x63, 0xf7, 0x35, + 0xf7, 0x15, 0x20, 0xfb, 0x31, 0xfb, 0x24, 0xfb, 0x4, 0x34, 0x5f, 0x7f, + 0x7a, 0x94, 0x9e, 0x1f, 0xd1, 0xf7, 0xed, 0x5, 0x43, 0x6, 0x7d, 0x4a, + 0x5, 0xd3, 0x60, 0x53, 0x91, 0x74, 0x1b, 0xfb, 0x4, 0x29, 0xfb, 0x28, + 0xfb, 0x10, 0x22, 0xcb, 0x3e, 0xde, 0xc7, 0xb6, 0xb8, 0xa3, 0xa0, 0x1f, + 0xfb, 0x58, 0xf7, 0x5, 0x15, 0xd4, 0xb3, 0xf7, 0x1c, 0xea, 0xbc, 0xba, + 0x64, 0x3b, 0xfb, 0x6, 0x32, 0x2d, 0x45, 0x63, 0x6b, 0xad, 0xdf, 0x1e, + 0xe, 0x40, 0xa, 0xda, 0xf7, 0x5, 0x49, 0xa, 0xf7, 0x48, 0xf8, 0xf5, + 0x15, 0xbb, 0xab, 0x8a, 0x90, 0xa7, 0xa0, 0x80, 0x80, 0x9e, 0x1e, 0x7f, + 0x9f, 0x9d, 0x7f, 0xa2, 0x1b, 0xa0, 0xd6, 0x92, 0xf4, 0x56, 0xa, 0x8f, + 0x79, 0x94, 0x96, 0x70, 0x1f, 0x96, 0x6f, 0x66, 0x96, 0x74, 0x1b, 0x5a, + 0x59, 0x66, 0x3f, 0x1f, 0xad, 0xfb, 0x8e, 0x20, 0xa, 0x7c, 0xd3, 0xf8, + 0x25, 0xd3, 0xf7, 0x50, 0x77, 0x12, 0xc5, 0xdc, 0x3a, 0xe3, 0xf7, 0xa5, + 0xe5, 0x13, 0xec, 0xc5, 0x16, 0xdd, 0xcc, 0x8d, 0x6, 0x41, 0xbb, 0xd5, + 0x85, 0xa1, 0x1b, 0xde, 0xf7, 0x28, 0xc3, 0xf7, 0x6f, 0xf7, 0x29, 0x30, + 0xf7, 0xd, 0xfb, 0x20, 0x35, 0x63, 0x57, 0x79, 0x7f, 0x1f, 0x89, 0xf7, + 0x96, 0x33, 0x6, 0x13, 0xf4, 0xdc, 0xfc, 0x5e, 0x15, 0xf4, 0xc3, 0xe8, + 0xe6, 0xe6, 0xbd, 0x37, 0xfb, 0x6, 0xfb, 0x22, 0x44, 0x4e, 0x45, 0x5a, + 0x5e, 0xaa, 0xb3, 0x70, 0x1e, 0x7f, 0x9d, 0x7d, 0xa5, 0xe3, 0x1a, 0xe, + 0xfc, 0x31, 0x8d, 0x76, 0xf9, 0x88, 0x77, 0x1, 0xf7, 0x74, 0x78, 0x15, + 0xd2, 0x6, 0xfb, 0x85, 0xf9, 0x88, 0x5, 0x44, 0x6, 0xe, 0xfc, 0x43, + 0xfb, 0x50, 0x76, 0xfa, 0x46, 0x77, 0x1, 0xe9, 0xd4, 0x3, 0xe9, 0xfb, + 0x65, 0x15, 0xd4, 0xfa, 0x46, 0x42, 0x6, 0xe, 0xfb, 0xf9, 0xfb, 0x58, + 0xd5, 0xf7, 0xee, 0xda, 0xf7, 0xed, 0xd5, 0x1, 0xf7, 0x18, 0xd3, 0x3, + 0xb5, 0xf7, 0x74, 0x15, 0xe4, 0x89, 0x8b, 0x33, 0x8c, 0x2d, 0x8, 0xfb, + 0x4c, 0x8a, 0x9e, 0x57, 0xf7, 0x22, 0x1b, 0xd5, 0x7, 0x33, 0x8d, 0x93, + 0xf7, 0x2e, 0xf7, 0x6, 0x7a, 0xd5, 0x40, 0xae, 0x1f, 0xe5, 0xbb, 0x8d, + 0x8b, 0xf7, 0x44, 0x1a, 0xe2, 0x89, 0xd5, 0xe3, 0x1e, 0xd5, 0x7, 0xfb, + 0x22, 0x79, 0x31, 0xfb, 0x25, 0x1f, 0x8a, 0x2c, 0x8b, 0x34, 0x32, 0x89, + 0x8, 0xe, 0xfb, 0xf9, 0xfb, 0x58, 0xd5, 0xf7, 0xed, 0xda, 0xf7, 0xee, + 0xd5, 0x1, 0xf7, 0x15, 0xd3, 0x3, 0xb5, 0xfb, 0xe, 0x15, 0x41, 0x7, + 0xde, 0xd7, 0x99, 0xf7, 0x33, 0x1f, 0x8c, 0xeb, 0x8d, 0xf7, 0x28, 0xe3, + 0x8d, 0x8, 0xda, 0x7, 0x33, 0x8d, 0x88, 0xdb, 0xea, 0x1a, 0xf7, 0x29, + 0x86, 0xe9, 0xfb, 0x2e, 0x1e, 0x41, 0x7, 0xe2, 0x8b, 0x73, 0xfb, 0x25, + 0xfb, 0x7, 0x9a, 0x49, 0xd6, 0x68, 0x1f, 0x31, 0x5b, 0x8b, 0x4d, 0xfb, + 0x44, 0x1a, 0x34, 0x79, 0x7f, 0x46, 0x1e, 0xe, 0x69, 0xa, 0xca, 0xe3, + 0x33, 0xf7, 0x4f, 0x13, 0xe0, 0xf7, 0x2b, 0xfb, 0xf, 0x15, 0xf9, 0x98, + 0x7, 0x13, 0xd0, 0xee, 0xd4, 0xfb, 0x4f, 0xfe, 0x2a, 0xf7, 0x4f, 0xd4, + 0x6, 0xe, 0x69, 0xa, 0xa7, 0xf7, 0x4f, 0x33, 0xe3, 0x13, 0xe0, 0xa7, + 0xfb, 0xf, 0x15, 0x42, 0xf7, 0x4f, 0xfa, 0x2a, 0xfb, 0x4f, 0x42, 0x7, + 0x13, 0xd0, 0xee, 0xfd, 0x98, 0x6, 0xe, 0xfb, 0xfa, 0xf8, 0xe7, 0xcc, + 0xd2, 0x77, 0x1, 0x98, 0xf9, 0x6f, 0x15, 0x2c, 0xe3, 0x62, 0xcd, 0xce, + 0xe2, 0xb6, 0xe8, 0x1e, 0x4b, 0x6, 0x6a, 0x84, 0x7e, 0x65, 0x45, 0x1b, + 0x43, 0x7d, 0xbf, 0x9e, 0x87, 0x1f, 0xe, 0xfc, 0x43, 0x8d, 0x76, 0xf9, + 0x88, 0x77, 0x1, 0xe9, 0xd4, 0x3, 0xe9, 0xf8, 0x3f, 0x15, 0xd4, 0xf7, + 0xca, 0x42, 0x6, 0xfd, 0x88, 0x4, 0xd4, 0xf7, 0xc9, 0x42, 0x6, 0xe, + 0xfb, 0xe9, 0xf7, 0x5e, 0xf7, 0xcf, 0x1, 0x9d, 0xf7, 0xcf, 0x3, 0x9d, + 0xf7, 0xfb, 0x15, 0x33, 0xd2, 0x46, 0xe1, 0xe1, 0xd3, 0xd0, 0xe3, 0xe4, + 0x43, 0xd0, 0x35, 0x35, 0x44, 0x46, 0x32, 0x1e, 0xe, 0xfb, 0x53, 0x7c, + 0xd3, 0xf8, 0x29, 0xd7, 0x1, 0xbb, 0xe5, 0xf7, 0x9b, 0xe0, 0x3, 0xf8, + 0x24, 0xf7, 0x52, 0x15, 0x71, 0x88, 0x7a, 0x20, 0xfb, 0x4, 0x1b, 0xfb, + 0xf, 0x7c, 0xf7, 0x18, 0xd0, 0xc8, 0x93, 0xf7, 0x23, 0xf7, 0x1d, 0xc1, + 0xc1, 0x6f, 0x40, 0x9d, 0x1f, 0xe0, 0x98, 0x5, 0xf4, 0xfb, 0x8, 0xc8, + 0x2c, 0x24, 0xfb, 0x18, 0x4b, 0xfb, 0x6c, 0xfb, 0x1e, 0xc4, 0xfb, 0x1b, + 0xf7, 0x3f, 0xb7, 0xf7, 0x27, 0x9e, 0xf7, 0x43, 0xa7, 0x1e, 0xe, 0x54, + 0xa, 0xf7, 0xc, 0xf8, 0xe5, 0x15, 0xeb, 0x6, 0xeb, 0xf7, 0x21, 0x5, + 0x31, 0x6, 0x57, 0x34, 0x50, 0xe2, 0x5, 0x31, 0x6, 0xe, 0xfb, 0x53, + 0xfb, 0x60, 0x76, 0xf7, 0x5b, 0xd6, 0xf8, 0x32, 0xd6, 0x1, 0xa9, 0xe4, + 0x3, 0xf7, 0x67, 0x76, 0x15, 0x7b, 0x3d, 0x5, 0x9b, 0xc0, 0x86, 0x69, + 0x8d, 0x1f, 0x78, 0x8c, 0x48, 0x84, 0x60, 0x1b, 0x89, 0x4e, 0x5, 0xf7, + 0x13, 0xcb, 0xb2, 0xbb, 0xc2, 0x5d, 0xa0, 0x6a, 0x1f, 0x91, 0xaf, 0xda, + 0x91, 0xf1, 0xb6, 0xa2, 0xf7, 0x2a, 0x19, 0x36, 0x96, 0x5, 0x71, 0x87, + 0x7a, 0xfb, 0x1, 0xfb, 0x2, 0x1b, 0xfb, 0x23, 0x8c, 0xf7, 0x3d, 0xad, + 0xd9, 0x9c, 0xf7, 0x19, 0xf7, 0x13, 0xc2, 0xba, 0x6d, 0x3c, 0x9c, 0x1f, + 0xe0, 0x9a, 0x5, 0xf7, 0x7, 0x7c, 0x3a, 0xc1, 0xfb, 0x0, 0x1b, 0xfb, + 0x43, 0x51, 0xfb, 0x21, 0xfb, 0x25, 0xfb, 0x2c, 0xd0, 0x27, 0xf7, 0x4, + 0x76, 0x1f, 0xe, 0xfb, 0xfa, 0xfb, 0x60, 0x76, 0xf7, 0x75, 0x77, 0x1, + 0xeb, 0xf2, 0x3, 0xf7, 0x1a, 0x16, 0x6a, 0x2c, 0x5, 0xa5, 0xbe, 0x85, + 0x6b, 0x58, 0x2c, 0x9a, 0x6a, 0x91, 0x1f, 0x86, 0x52, 0x5, 0x87, 0xa1, + 0x92, 0x8a, 0xa1, 0x1b, 0xf7, 0x5, 0xbd, 0xb8, 0xba, 0xb6, 0x64, 0xa3, + 0x5f, 0x90, 0x1f, 0xa2, 0xc8, 0x5, 0xe, 0x2d, 0x76, 0xf1, 0xd2, 0xf8, + 0x25, 0xd3, 0xe7, 0x77, 0x1, 0xbe, 0xe5, 0x3, 0xf7, 0x4a, 0x95, 0x15, + 0x69, 0xfb, 0x1, 0xc2, 0x7b, 0xae, 0xf7, 0x0, 0x5, 0x88, 0x98, 0x98, + 0x88, 0xa2, 0x1b, 0xcd, 0xf7, 0x18, 0xad, 0xf7, 0x33, 0xa7, 0x1f, 0x37, + 0x95, 0x5, 0x2f, 0x7e, 0x45, 0x63, 0x50, 0x1b, 0x7d, 0x84, 0x8d, 0x8d, + 0x82, 0x1f, 0xf7, 0x1, 0xf8, 0xa, 0xad, 0x6f, 0x93, 0x68, 0x8f, 0x77, + 0x19, 0xe1, 0x98, 0x84, 0xac, 0x7d, 0xd4, 0x32, 0xb2, 0x19, 0xa5, 0xeb, + 0x56, 0x9b, 0x6f, 0x2b, 0x5, 0x8f, 0x6c, 0x7f, 0x8b, 0x85, 0x1b, 0x52, + 0xfb, 0x44, 0x6f, 0xfb, 0x8b, 0xfb, 0x12, 0xc3, 0x37, 0xd6, 0x67, 0x1f, + 0xa2, 0xd7, 0x15, 0x56, 0xac, 0x80, 0xea, 0xb5, 0x1a, 0xd5, 0xa1, 0xf7, + 0x22, 0xf7, 0x2b, 0x7e, 0x1e, 0xe, 0x54, 0xa, 0xa0, 0xf8, 0xe5, 0x15, + 0xe9, 0x6, 0xc1, 0xe2, 0xbc, 0x34, 0x5, 0xe9, 0x6, 0x24, 0xf7, 0x21, + 0x5, 0x34, 0x6, 0xe, 0xfc, 0x31, 0x8b, 0xee, 0xf7, 0xd2, 0xee, 0x1, + 0xe2, 0xf3, 0x3, 0xe2, 0x16, 0xf3, 0xee, 0x23, 0x6, 0xf7, 0xd2, 0x4, + 0xf3, 0xee, 0x23, 0x6, 0xe, 0xfc, 0x31, 0xfb, 0x12, 0x76, 0xf7, 0x91, + 0x77, 0x1, 0xe3, 0xf1, 0x3, 0xe3, 0x8d, 0x15, 0xbe, 0x6, 0x61, 0x85, + 0x5a, 0x5d, 0x76, 0x1e, 0xa2, 0x66, 0x5, 0xce, 0xa1, 0x98, 0xe8, 0xad, + 0x1a, 0xf3, 0x25, 0x7, 0xe, 0xb9, 0x78, 0xca, 0xed, 0xc7, 0xf7, 0xce, + 0xc3, 0xf1, 0xca, 0x1, 0x7d, 0xcb, 0xf7, 0xa, 0xd1, 0xf8, 0x57, 0xca, + 0x3, 0xf8, 0x80, 0xf7, 0xbe, 0x15, 0x35, 0x75, 0x3e, 0x81, 0x70, 0x1b, + 0x46, 0x50, 0xbb, 0xf5, 0xd7, 0xa9, 0xdf, 0xed, 0x9c, 0xd4, 0x8a, 0x40, + 0xa9, 0x1f, 0xc8, 0x99, 0x5, 0xdd, 0x72, 0x3e, 0xaf, 0x3c, 0x1b, 0xfb, + 0x14, 0x45, 0x37, 0xfb, 0x18, 0xfb, 0x1c, 0xdc, 0x3d, 0xf7, 0x9, 0xdb, + 0xe0, 0xb6, 0xea, 0xa2, 0x1f, 0xfc, 0xcc, 0xd7, 0x15, 0xfb, 0x65, 0xf7, + 0x3c, 0xfb, 0x3a, 0xf7, 0x68, 0xf7, 0x68, 0xf7, 0x42, 0xf7, 0x3b, 0xf7, + 0x64, 0xf7, 0x67, 0xfb, 0x44, 0xf7, 0x3e, 0xfb, 0x66, 0xfb, 0x66, 0xfb, + 0x3e, 0xfb, 0x3d, 0xfb, 0x68, 0x1e, 0xcb, 0x16, 0xf7, 0x44, 0xf7, 0x1f, + 0xf7, 0x22, 0xf7, 0x45, 0xf7, 0x45, 0xf7, 0x26, 0xfb, 0x22, 0xfb, 0x44, + 0xfb, 0x42, 0xfb, 0x26, 0xfb, 0x1e, 0xfb, 0x45, 0xfb, 0x45, 0xfb, 0x1f, + 0xf7, 0x1e, 0xf7, 0x42, 0x1e, 0xe, 0xf7, 0xc, 0x76, 0xae, 0xdf, 0xf7, + 0x9e, 0xdf, 0xae, 0x77, 0x1, 0xe1, 0xee, 0x15, 0xd2, 0xd2, 0x5, 0x71, + 0xb2, 0xb6, 0x81, 0xb2, 0x1b, 0xb1, 0xb7, 0x95, 0xa5, 0xb2, 0x1f, 0xd2, + 0x44, 0xc5, 0xc8, 0x44, 0xd0, 0x5, 0xaa, 0xbd, 0x91, 0xb9, 0xa5, 0x1a, + 0xa6, 0x85, 0xb8, 0x6c, 0xbc, 0x1e, 0xd2, 0xd1, 0x51, 0xc8, 0x44, 0x44, + 0x5, 0xa5, 0x64, 0x5f, 0x95, 0x65, 0x1b, 0x64, 0x60, 0x81, 0x71, 0x64, + 0x1f, 0x44, 0xd2, 0x51, 0x4e, 0xd2, 0x45, 0x5, 0x6c, 0x5a, 0x85, 0x5e, + 0x70, 0x1a, 0x71, 0x91, 0x5d, 0xaa, 0x59, 0x1e, 0x44, 0x46, 0x5, 0xf7, + 0xa, 0xf7, 0x53, 0x15, 0xd4, 0xc5, 0xc7, 0xd5, 0xce, 0xcc, 0x52, 0x3f, + 0x41, 0x50, 0x50, 0x42, 0x41, 0x51, 0xc6, 0xd5, 0x1e, 0xe, 0x7c, 0xd3, + 0xf8, 0x23, 0xd5, 0xf7, 0x50, 0x77, 0x1, 0xae, 0xe5, 0xf7, 0xa7, 0xe3, + 0x3, 0xf8, 0x35, 0x16, 0xdd, 0xf9, 0x62, 0x33, 0xfb, 0x97, 0x89, 0x6, + 0xb4, 0x70, 0x4d, 0xa9, 0x4a, 0x1b, 0xfb, 0x16, 0x31, 0xfb, 0x2, 0xfb, + 0x3d, 0xfb, 0x3a, 0xec, 0x27, 0xf7, 0xf, 0x9e, 0xe9, 0x8e, 0xd9, 0xbc, + 0x1f, 0xfb, 0xb8, 0xf7, 0x4d, 0x15, 0xb1, 0x89, 0xf7, 0x3b, 0xf7, 0x18, + 0xf6, 0xc4, 0x23, 0x26, 0xfb, 0x46, 0xfb, 0x1c, 0x7b, 0x6f, 0x58, 0x3c, + 0xaa, 0xf7, 0x37, 0x1e, 0xe, 0xfb, 0x1e, 0x76, 0xf8, 0xe0, 0xd9, 0xf7, + 0x67, 0x77, 0x1, 0xf7, 0x7e, 0xe3, 0x3, 0xf7, 0x7e, 0xfb, 0x33, 0x15, + 0xe3, 0xf8, 0xe0, 0x78, 0xa, 0xf7, 0x67, 0x33, 0xfb, 0x67, 0xfb, 0x53, + 0x3d, 0xf7, 0x53, 0x6, 0xe, 0xfb, 0x1e, 0x76, 0xf7, 0x4c, 0xd9, 0xf7, + 0xf5, 0xd9, 0xf7, 0x4c, 0x77, 0x1, 0xf7, 0x7e, 0xe3, 0x3, 0xb6, 0xa4, + 0x15, 0xf7, 0x53, 0xfb, 0x4c, 0xe3, 0xf7, 0x4c, 0x78, 0xa, 0xf7, 0xf5, + 0x78, 0xa, 0xf7, 0x4c, 0x33, 0xfb, 0x4c, 0xfb, 0x53, 0x3d, 0xf7, 0x53, + 0xfb, 0xf5, 0xfb, 0x53, 0x6, 0xe, 0xfb, 0xb7, 0xf8, 0x2f, 0xc4, 0xf7, + 0x46, 0xc4, 0x1, 0xc1, 0xc5, 0xf7, 0x44, 0xc5, 0x3, 0xc1, 0xf8, 0xc2, + 0x15, 0x39, 0xcc, 0x4a, 0xdb, 0xdc, 0xcd, 0xcc, 0xdd, 0xda, 0x4a, 0xcd, + 0x39, 0x3a, 0x4b, 0x4a, 0x3b, 0x1e, 0xc5, 0x16, 0xbb, 0xb1, 0xb3, 0xbc, + 0xbd, 0xb2, 0x63, 0x5b, 0x59, 0x63, 0x63, 0x5a, 0x5b, 0x64, 0xb3, 0xbd, + 0x1e, 0xe, 0xfb, 0xfa, 0xf8, 0xf0, 0xf1, 0x1, 0xb3, 0xe5, 0xd4, 0xe5, + 0x3, 0xb3, 0xf8, 0xf0, 0x15, 0xe5, 0xf1, 0x31, 0x6, 0xf7, 0x37, 0x25, + 0x15, 0xe5, 0xf1, 0x31, 0x6, 0xe, 0x20, 0x78, 0xed, 0xf7, 0x1e, 0xdd, + 0xf7, 0x14, 0xec, 0x1, 0xf7, 0x86, 0xef, 0x3, 0xb2, 0xf7, 0x6c, 0x15, + 0xf8, 0x8e, 0xdd, 0xfc, 0x8e, 0x6, 0xf7, 0x5f, 0xf7, 0x15, 0x15, 0xef, + 0xec, 0x27, 0x6, 0xfc, 0xb3, 0x4, 0xef, 0xed, 0x27, 0x6, 0xe, 0x2d, + 0x76, 0xfa, 0xe, 0x77, 0x1, 0xbb, 0xe6, 0xf7, 0x5, 0xc0, 0xf7, 0xf, + 0xe7, 0x3, 0xab, 0xf7, 0x52, 0x15, 0x98, 0xfb, 0x52, 0xf7, 0x2b, 0x7a, + 0xc3, 0x83, 0x8, 0x31, 0xc0, 0xe6, 0x7, 0xf7, 0x22, 0x90, 0xd4, 0xee, + 0xf5, 0x1a, 0xf7, 0x39, 0xfb, 0x23, 0xb0, 0x43, 0x9b, 0x1e, 0xf7, 0x93, + 0x7, 0xa7, 0x85, 0xc6, 0x7e, 0x9b, 0x2a, 0xe9, 0x98, 0x18, 0x78, 0xf7, + 0x8, 0x3d, 0xc1, 0x27, 0x93, 0x8, 0xb4, 0x56, 0x62, 0x7, 0x22, 0x86, + 0x2d, 0x4f, 0x86, 0xfb, 0x17, 0x88, 0x42, 0xda, 0xfb, 0x13, 0xf7, 0x14, + 0x83, 0x8, 0xfb, 0xad, 0x7, 0x20, 0x96, 0x71, 0xf7, 0x9, 0x88, 0xa8, + 0x8, 0xf7, 0x1c, 0xf7, 0x65, 0x15, 0x26, 0xa8, 0x7f, 0xc1, 0xb5, 0x1a, + 0xbf, 0xac, 0xc2, 0xdb, 0x98, 0x1e, 0xc0, 0xfc, 0xf7, 0x15, 0xf7, 0xa1, + 0x7, 0xcd, 0x76, 0xc4, 0x73, 0x36, 0x1a, 0x2d, 0x40, 0x63, 0x5b, 0x86, + 0x1e, 0xe, 0xfb, 0xfa, 0xf8, 0xf0, 0xf1, 0x1, 0xf7, 0xd, 0xe6, 0x3, + 0xf7, 0xd, 0xf8, 0xf0, 0x15, 0xe6, 0xf1, 0x30, 0x6, 0xe, 0xfc, 0x31, + 0x68, 0xa, 0xea, 0xe3, 0x3, 0xea, 0x16, 0xe3, 0xf8, 0x9f, 0x7a, 0xa, + 0x7c, 0xd3, 0xf7, 0x48, 0xd3, 0xf7, 0x2e, 0xd6, 0x1, 0xc3, 0xe5, 0xf7, + 0x91, 0xe5, 0x3, 0xf7, 0x16, 0xf7, 0x81, 0x15, 0xf8, 0x16, 0x6, 0xf7, + 0x9c, 0xfb, 0x34, 0xb0, 0x41, 0xfb, 0x32, 0x37, 0xfb, 0x11, 0xfb, 0x32, + 0xfb, 0x34, 0xdc, 0xfb, 0x2, 0xf7, 0x35, 0xf7, 0x14, 0xd8, 0xd4, 0xed, + 0xa5, 0x1e, 0x31, 0x96, 0x5, 0x6d, 0x80, 0x6c, 0x3b, 0x28, 0x1b, 0x3d, + 0x48, 0xc3, 0xf7, 0x10, 0x84, 0x1f, 0x90, 0xd3, 0x15, 0xcf, 0x90, 0xb7, + 0xe1, 0xed, 0x1b, 0xe7, 0xbf, 0x3d, 0x3f, 0x1f, 0xe, 0x4a, 0xa, 0xce, + 0xf7, 0x1d, 0x1, 0xf8, 0x34, 0xe5, 0x3, 0x3f, 0xa, 0xfb, 0x28, 0xfc, + 0x85, 0x29, 0xa, 0xe, 0x4a, 0xa, 0xf7, 0x60, 0x77, 0x1, 0xf8, 0x34, + 0xe5, 0x3, 0x3a, 0xa, 0x31, 0xfc, 0x85, 0x29, 0xa, 0xe, 0x4a, 0xa, + 0xd7, 0xef, 0x1, 0xf7, 0xae, 0x8b, 0xf7, 0x1a, 0xe5, 0x3, 0x3e, 0xa, + 0xfb, 0x4c, 0xfc, 0x69, 0x15, 0xf8, 0x2, 0x6, 0xf7, 0x1c, 0x65, 0xd8, + 0x56, 0xb0, 0x1e, 0xb0, 0x56, 0x52, 0x91, 0x74, 0x1b, 0xfb, 0x38, 0x4c, + 0xfb, 0xa, 0xfb, 0x31, 0x86, 0x1f, 0x2d, 0xa, 0x7b, 0x7c, 0x3a, 0x23, + 0x1b, 0x37, 0x5e, 0xc2, 0xf7, 0x11, 0x7e, 0x1f, 0x90, 0xd3, 0x15, 0xcf, + 0x96, 0xa2, 0xdc, 0xf2, 0x1b, 0xec, 0xab, 0x42, 0x3f, 0x90, 0x1f, 0xe, + 0x4a, 0xa, 0xcf, 0xf7, 0x1c, 0x1, 0xf8, 0x34, 0xe5, 0x3, 0xf7, 0x20, + 0xf7, 0x81, 0x29, 0xa, 0xfb, 0x2e, 0xf7, 0xb5, 0x4c, 0xa, 0x4a, 0xf7, + 0x1c, 0x59, 0xa, 0x78, 0xd2, 0xf7, 0xb2, 0xaf, 0x67, 0xd1, 0xf7, 0x74, + 0xd2, 0x12, 0xc1, 0xe7, 0xf7, 0x9d, 0xe7, 0x13, 0xdc, 0xf7, 0x45, 0xf8, + 0xa, 0x15, 0x31, 0x5a, 0xfb, 0x10, 0x56, 0xfb, 0xc, 0xe6, 0x2b, 0xf7, + 0x28, 0xf7, 0x27, 0xe8, 0xeb, 0xf7, 0x9, 0xed, 0x52, 0xc5, 0x3b, 0xa3, + 0x1f, 0x8d, 0x7, 0xab, 0x96, 0xd6, 0xb0, 0xec, 0x1a, 0xe9, 0x3f, 0xe3, + 0xfb, 0x1c, 0xfb, 0x18, 0x40, 0x39, 0x29, 0x21, 0xd9, 0x6c, 0xaa, 0x81, + 0x1e, 0x7a, 0xf7, 0x2a, 0x15, 0xc2, 0xb6, 0xbe, 0xd4, 0xcf, 0xbe, 0x5c, + 0x4b, 0x1e, 0x13, 0xbc, 0x4c, 0x58, 0x59, 0x48, 0x51, 0x50, 0xb3, 0xd9, + 0x1e, 0x6d, 0xfb, 0xde, 0x15, 0xd3, 0xbe, 0xd1, 0xe9, 0xdb, 0xd1, 0x53, + 0x33, 0x33, 0x48, 0x55, 0x3a, 0x31, 0x52, 0xcc, 0xda, 0x1e, 0xe, 0xf7, + 0xc9, 0x8b, 0xf5, 0x1, 0xf7, 0x7, 0xef, 0xf7, 0x7d, 0xef, 0xf7, 0x81, + 0xef, 0x3, 0xf7, 0x7, 0x16, 0xef, 0xf5, 0x27, 0x6, 0xf7, 0xe1, 0x21, + 0x15, 0xef, 0xf5, 0x27, 0x6, 0xf7, 0xe5, 0x21, 0x15, 0xef, 0xf5, 0x27, + 0x6, 0xe, 0xf7, 0xc9, 0xf7, 0x84, 0xd4, 0x1, 0xf7, 0x84, 0x4, 0xfa, + 0x7c, 0xd4, 0xfe, 0x7c, 0x6, 0xe, 0xf7, 0x84, 0xd4, 0x1, 0xf7, 0x84, + 0x4, 0xf8, 0xc0, 0xd4, 0xfc, 0xc0, 0x6, 0xe, 0x20, 0xf7, 0x7, 0xdb, + 0xf7, 0x7, 0xdb, 0x1, 0xb2, 0xf7, 0xca, 0x15, 0xf8, 0x8e, 0xdb, 0xfc, + 0x8e, 0x6, 0xfb, 0xa7, 0x4, 0xf8, 0x8e, 0xdb, 0xfc, 0x8e, 0x6, 0xe, + 0x7c, 0xd5, 0xf8, 0x1d, 0xda, 0xf7, 0x62, 0x77, 0x1, 0xae, 0xe6, 0xf7, + 0xc5, 0xe6, 0x3, 0xf7, 0x41, 0xf8, 0xc0, 0x15, 0xf7, 0xc, 0xc4, 0xb0, + 0x61, 0x97, 0x76, 0xa1, 0x5f, 0x19, 0x98, 0x6f, 0x6b, 0x97, 0x59, 0x1b, + 0x30, 0xfb, 0x14, 0x50, 0xfb, 0x6c, 0xfb, 0x71, 0xf7, 0x15, 0x59, 0xea, + 0xf7, 0x27, 0xf7, 0x8, 0xf4, 0xf7, 0x3a, 0xf7, 0x27, 0x4e, 0xf7, 0x12, + 0x29, 0xf7, 0x8, 0x1f, 0xe4, 0xb6, 0x72, 0xbc, 0x21, 0x58, 0x75, 0xa0, + 0x83, 0x90, 0x6b, 0xa4, 0x19, 0xfb, 0x0, 0x6, 0xb6, 0x6d, 0x9d, 0x7f, + 0xb5, 0x62, 0x20, 0x5a, 0x18, 0x76, 0xfb, 0xf1, 0x15, 0xf7, 0x21, 0xd3, + 0xc2, 0xc9, 0xea, 0xd7, 0x64, 0xfb, 0x31, 0xfb, 0x30, 0x22, 0x62, 0x48, + 0x6b, 0x26, 0x99, 0xf7, 0x4b, 0x1e, 0xe, 0xfc, 0x31, 0x8b, 0xef, 0xf7, + 0x88, 0xef, 0xf7, 0xa6, 0x77, 0xb7, 0x77, 0x1, 0xe5, 0xec, 0x35, 0xd7, + 0x3, 0xe5, 0x16, 0xec, 0xef, 0x2a, 0x6, 0xa2, 0xdb, 0x15, 0xc1, 0x6, + 0x9f, 0xf8, 0xf, 0x5, 0xf7, 0x33, 0x2a, 0xfb, 0x33, 0x7, 0xe, 0xfb, + 0xfa, 0xfb, 0x42, 0x76, 0xf8, 0xfe, 0xef, 0x1, 0xf7, 0xa, 0xec, 0x33, + 0xd8, 0x3, 0xf7, 0xa, 0xf8, 0x3b, 0x15, 0xec, 0xef, 0x2a, 0x6, 0xfc, + 0xc6, 0x4, 0xfb, 0x30, 0xec, 0xf7, 0x30, 0x7, 0x75, 0xf8, 0xf, 0x5, + 0x53, 0x6, 0xe, 0x4b, 0xa, 0xf8, 0x56, 0xcf, 0xf7, 0x66, 0x77, 0x1, + 0xd7, 0xe3, 0x3, 0xd7, 0x16, 0xe3, 0xf8, 0x56, 0xed, 0xcf, 0x29, 0xbc, + 0x6, 0xc2, 0xa7, 0xb4, 0xc3, 0x76, 0x1e, 0x98, 0xd8, 0x5, 0x8b, 0x72, + 0x94, 0x7a, 0xfb, 0x23, 0x8b, 0xfb, 0x3, 0x59, 0x1e, 0x5a, 0x4d, 0x47, + 0xc9, 0x7, 0xe, 0x5b, 0xa, 0xf7, 0x3d, 0x3b, 0xa, 0xf7, 0x95, 0xfc, + 0x56, 0x15, 0xe3, 0xf8, 0x9a, 0x33, 0x6, 0xed, 0x4, 0x6d, 0xa, 0x78, + 0xd2, 0xf7, 0xe0, 0xd8, 0xf7, 0x3f, 0xdf, 0x12, 0xf8, 0x2a, 0xeb, 0x17, + 0xab, 0xf7, 0x46, 0x15, 0xfb, 0x2e, 0x99, 0xf7, 0x16, 0x60, 0xe5, 0x1b, + 0xf7, 0x36, 0xe1, 0xf7, 0x9, 0xf7, 0x13, 0xf7, 0x2f, 0xfb, 0x25, 0xdc, + 0x23, 0x59, 0x61, 0x78, 0x72, 0x74, 0x1f, 0xb3, 0xf7, 0x4f, 0x5, 0xf7, + 0xb6, 0xdf, 0xfb, 0xfd, 0x6, 0x43, 0xfb, 0xfe, 0xe0, 0x81, 0x5, 0xb1, + 0xa3, 0xba, 0xa9, 0xc8, 0x1b, 0xdf, 0xd1, 0x56, 0x21, 0x30, 0x54, 0x39, + 0x2a, 0x1f, 0x6f, 0x2f, 0x92, 0xf7, 0x12, 0x77, 0x1f, 0xe, 0x5b, 0xa, + 0xf7, 0x3b, 0x3b, 0xa, 0xf7, 0x93, 0xfc, 0x56, 0x15, 0xe3, 0xf9, 0x58, + 0x7a, 0xa, 0xfb, 0x4e, 0x76, 0xf9, 0x22, 0xcf, 0xf7, 0x20, 0xdd, 0x1, + 0x90, 0xfb, 0xb, 0x15, 0x7b, 0x3f, 0x5, 0x7f, 0xca, 0xa0, 0x8b, 0x92, + 0x1b, 0xda, 0xbe, 0xb3, 0xe2, 0x9a, 0x1f, 0xe9, 0xf8, 0xa3, 0x5, 0xef, + 0x6, 0x97, 0xcf, 0x5, 0x27, 0x6, 0x98, 0xc8, 0x5, 0xbf, 0x95, 0x94, + 0xa6, 0xba, 0x1b, 0xa0, 0x9c, 0x87, 0x83, 0xaf, 0x1f, 0x9c, 0xd6, 0x5, + 0x95, 0x68, 0x7a, 0x94, 0x64, 0x1b, 0xfb, 0x4, 0x6c, 0x27, 0x4e, 0x7e, + 0x1f, 0x7f, 0x4e, 0x5, 0x28, 0x6, 0x80, 0x47, 0x5, 0xed, 0x6, 0x33, + 0xfc, 0x8a, 0x5, 0x5f, 0x84, 0x73, 0x6c, 0x6c, 0x1b, 0x7b, 0x76, 0x8e, + 0x93, 0x65, 0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x3d, 0xda, 0xf8, 0x5b, 0x77, + 0x1, 0xf7, 0xb3, 0xe3, 0x3, 0xa4, 0xf7, 0x3d, 0x15, 0xf7, 0xcd, 0xfb, + 0x3d, 0xe3, 0xf7, 0x3d, 0xec, 0xda, 0x2a, 0xf8, 0x5b, 0x43, 0x6, 0xfb, + 0xdd, 0xfc, 0x5b, 0x5, 0xe2, 0x16, 0xf7, 0x73, 0xf7, 0xd3, 0x5, 0x8e, + 0xfb, 0xd3, 0x6, 0xe, 0xfc, 0xa0, 0x8d, 0x76, 0xf9, 0x66, 0x77, 0x1, + 0x32, 0x78, 0x15, 0xf8, 0x3a, 0xf9, 0x66, 0x5, 0x3f, 0x6, 0xfc, 0x3b, + 0xfd, 0x66, 0x5, 0xe, 0xfb, 0x70, 0xd4, 0xf7, 0x1c, 0xd3, 0xf8, 0x29, + 0xd3, 0x12, 0xcb, 0xe5, 0xf7, 0x94, 0xe4, 0x39, 0xdd, 0x13, 0xf8, 0xc9, + 0x55, 0x15, 0xfb, 0x28, 0x87, 0xf7, 0x23, 0x79, 0xcc, 0x1b, 0xf7, 0x47, + 0xc1, 0xf7, 0x2, 0xf7, 0x3d, 0x1f, 0xf8, 0x66, 0x3a, 0x4d, 0x89, 0x7, + 0xd2, 0x54, 0x49, 0x8f, 0x6e, 0x1b, 0xfb, 0x36, 0x4b, 0xfb, 0x34, 0xfb, + 0x12, 0xfb, 0x20, 0xdc, 0xfb, 0xf, 0xf7, 0x25, 0x1f, 0x13, 0xb8, 0xb4, + 0xc1, 0x95, 0xc5, 0xbc, 0x1f, 0x24, 0x8e, 0x26, 0xfb, 0x27, 0x24, 0x7f, + 0xc0, 0xa6, 0x87, 0x1e, 0x7a, 0xf7, 0xd3, 0x15, 0xf7, 0x11, 0xc5, 0xe4, + 0xd9, 0x1e, 0x13, 0xf4, 0xc8, 0xe5, 0x49, 0xfb, 0x28, 0x2c, 0x67, 0x2b, + 0xfb, 0x7, 0x26, 0x68, 0xf7, 0x15, 0xc9, 0x1f, 0xe, 0x3b, 0x7c, 0xd3, + 0xf8, 0xeb, 0xd3, 0x12, 0xce, 0xe3, 0xf7, 0x22, 0xe5, 0x80, 0xe0, 0x9f, + 0xe5, 0x13, 0xec, 0xce, 0x16, 0xe3, 0xf8, 0x7e, 0x6, 0xce, 0x93, 0xee, + 0xf7, 0x7, 0xc3, 0xb5, 0x6a, 0x5f, 0x1e, 0x13, 0xf4, 0x57, 0x3c, 0x30, + 0x4e, 0x44, 0xf7, 0x4c, 0x38, 0x3c, 0x1a, 0x5d, 0x62, 0x64, 0x5a, 0x6e, + 0x69, 0x97, 0xd0, 0x66, 0x1e, 0x3f, 0x67, 0x5, 0x67, 0x9c, 0xbf, 0x3a, + 0xf7, 0x1, 0x1b, 0xf7, 0x0, 0xd1, 0xd2, 0xe1, 0x1f, 0xf7, 0x14, 0xfb, + 0x4c, 0xc0, 0xbf, 0x1a, 0x13, 0xec, 0xc2, 0xd5, 0xe9, 0xc2, 0x1a, 0xd2, + 0x4b, 0xd9, 0xfb, 0x9, 0xfb, 0x21, 0x43, 0x35, 0xfb, 0x2c, 0x1e, 0xe, + 0xfb, 0xfa, 0xf8, 0xf8, 0x76, 0xf7, 0x25, 0x77, 0x1, 0xf7, 0x29, 0xf8, + 0xe5, 0x15, 0xc9, 0x6, 0x2f, 0xf7, 0x21, 0x5, 0x22, 0x6, 0xe, 0x71, + 0xa, 0x96, 0x15, 0xf8, 0x7c, 0xf7, 0x5c, 0x5, 0xdd, 0x7, 0xfc, 0x7c, + 0xf7, 0x5e, 0x5, 0x34, 0x7, 0xf8, 0x1a, 0xfb, 0x30, 0xfc, 0x1a, 0xfb, + 0x2e, 0x5, 0xe, 0x3c, 0x52, 0xa, 0xf7, 0x93, 0xf7, 0x16, 0x15, 0xd9, + 0x6, 0xfb, 0xc, 0xf7, 0x5e, 0xf7, 0xc, 0xf7, 0x5f, 0x5, 0x3d, 0x6, + 0xfb, 0x27, 0xfb, 0x5f, 0x5, 0xf7, 0xd1, 0xfb, 0x5e, 0x15, 0xdb, 0x6, + 0xfb, 0xe, 0xf7, 0x5e, 0xf7, 0xe, 0xf7, 0x5f, 0x5, 0x3b, 0x6, 0xfb, + 0x27, 0xfb, 0x5f, 0x5, 0xe, 0x3c, 0x52, 0xa, 0xf7, 0xa9, 0xf7, 0x16, + 0x15, 0xdc, 0x6, 0xf7, 0x27, 0xf7, 0x5e, 0xfb, 0x27, 0xf7, 0x5f, 0x5, + 0x3a, 0x6, 0xf7, 0xd, 0xfb, 0x5f, 0x5, 0xfb, 0xb7, 0xfb, 0x5e, 0x15, + 0xda, 0x6, 0xf7, 0x28, 0xf7, 0x5e, 0xfb, 0x28, 0xf7, 0x5f, 0x5, 0x3c, + 0x6, 0xf7, 0xd, 0xfb, 0x5f, 0x5, 0xe, 0xfb, 0xfa, 0x52, 0xa, 0xf7, + 0x6b, 0xf7, 0x16, 0x15, 0xc1, 0x6, 0x36, 0xf7, 0x5e, 0xe0, 0xf7, 0x5f, + 0x5, 0x55, 0x6, 0xfb, 0xa, 0xfb, 0x5f, 0x5, 0xe, 0xfb, 0xd9, 0x52, + 0xa, 0xec, 0xf7, 0x16, 0x15, 0xc3, 0x6, 0xf7, 0x8, 0xf7, 0x60, 0xfb, + 0x8, 0xf7, 0x5d, 0x5, 0x53, 0x6, 0xe2, 0xfb, 0x5d, 0x5, 0xe, 0xa0, + 0x76, 0xf8, 0x5a, 0xd7, 0xf7, 0x50, 0x77, 0x1, 0xcc, 0xe3, 0xf7, 0x8e, + 0xe3, 0x3, 0xcc, 0x16, 0xe3, 0xf7, 0xaf, 0x6, 0xdd, 0xb2, 0xe4, 0xf4, + 0xf7, 0x1, 0x88, 0x2a, 0x6d, 0x1e, 0xfb, 0xdb, 0xe3, 0xf7, 0xdb, 0x7, + 0xf7, 0x8, 0x49, 0xe2, 0xfb, 0x14, 0x66, 0x59, 0x85, 0x4a, 0x52, 0x1e, + 0xf7, 0x97, 0x33, 0x7, 0xe, 0xfb, 0xfa, 0xf8, 0xe5, 0xf7, 0x21, 0x1, + 0xf7, 0x58, 0xf8, 0xe5, 0x60, 0xa, 0xfb, 0x9b, 0xfb, 0x21, 0x60, 0xa, + 0xe, 0xfb, 0xfa, 0xf7, 0x7c, 0xe5, 0x1, 0xb7, 0xf7, 0x7c, 0x15, 0xf7, + 0x89, 0xe5, 0xfb, 0x89, 0x6, 0xe, 0xfc, 0x69, 0xa0, 0x76, 0xf9, 0x1, + 0xec, 0x1, 0xf7, 0x24, 0xe3, 0x3, 0xce, 0x16, 0xe3, 0xf8, 0x98, 0x33, + 0x6, 0xf4, 0x4, 0x6d, 0xa, 0x62, 0xa, 0xcc, 0xf8, 0xe3, 0x15, 0xd2, + 0x6, 0xf7, 0x12, 0xf7, 0x23, 0x38, 0xa, 0x57, 0x50, 0xa, 0x4b, 0xa, + 0xf8, 0xe9, 0xf7, 0x1d, 0x1, 0xea, 0xe3, 0x3, 0x85, 0xf8, 0xe9, 0x15, + 0xee, 0x6, 0xbb, 0xde, 0xb6, 0x38, 0x5, 0xf0, 0x6, 0x26, 0x42, 0xa, + 0x8f, 0x50, 0xa, 0x4b, 0xa, 0xf8, 0xf2, 0xef, 0x12, 0x98, 0xe5, 0x83, + 0xe3, 0x84, 0xe5, 0x13, 0xd0, 0xea, 0x16, 0xe3, 0xf8, 0x99, 0x33, 0x6, + 0x13, 0xe8, 0x39, 0xe4, 0x58, 0xa, 0x62, 0xa, 0xf7, 0x17, 0xf8, 0xea, + 0x15, 0xd4, 0x6, 0x39, 0xf7, 0x1c, 0x38, 0xa, 0xe3, 0x50, 0xa, 0xfc, + 0x69, 0xfb, 0x51, 0x76, 0xf9, 0xd3, 0xec, 0x1, 0xce, 0xe3, 0x3, 0x8c, + 0xfb, 0x12, 0x15, 0x7a, 0x40, 0x5, 0x85, 0xa2, 0x9e, 0x88, 0x9c, 0x1b, + 0xdc, 0xaa, 0xc7, 0xf7, 0xe, 0x1f, 0xf8, 0xb5, 0x33, 0xfc, 0xb5, 0x7, + 0x2d, 0x72, 0x7d, 0x62, 0x95, 0x1e, 0xcd, 0xf9, 0x7f, 0x15, 0x6d, 0xa, + 0xfb, 0x53, 0x44, 0xa, 0xf7, 0x62, 0x6, 0xca, 0xc6, 0xf7, 0x43, 0xfb, + 0x9d, 0x5, 0xf7, 0x0, 0x6, 0xfb, 0x71, 0xf7, 0xda, 0xf7, 0x5a, 0xf7, + 0x54, 0x5, 0xfb, 0x6, 0x6, 0xfb, 0x65, 0xfb, 0x66, 0x5, 0xf8, 0x2e, + 0x33, 0x7, 0xe, 0xfc, 0x69, 0x44, 0xa, 0xf9, 0x62, 0x7a, 0xa, 0x71, + 0xa, 0xf7, 0x69, 0x15, 0xf8, 0x7c, 0xfb, 0x5e, 0x5, 0xe2, 0x7, 0xfc, + 0x1a, 0xf7, 0x30, 0xf8, 0x1a, 0xf7, 0x2e, 0x5, 0xe2, 0x7, 0xfc, 0x7c, + 0xfb, 0x5c, 0x5, 0xe, 0x20, 0xf7, 0x15, 0x76, 0x1, 0xb2, 0xf7, 0xc8, + 0x15, 0xf8, 0x27, 0xfb, 0x5c, 0xde, 0xf7, 0xae, 0xfc, 0x7a, 0x6, 0xe, + 0xfc, 0x69, 0x44, 0xa, 0xf7, 0xf9, 0x6, 0xe2, 0xd6, 0x5, 0xd8, 0x7, + 0x34, 0x40, 0x5, 0xf7, 0xb0, 0x33, 0xfb, 0xfb, 0x7, 0x34, 0x43, 0x5, + 0x3e, 0x7, 0xe2, 0xd3, 0x5, 0xe, 0xf7, 0x22, 0x6f, 0xa, 0xf7, 0x70, + 0xe3, 0xf7, 0x70, 0xe3, 0x17, 0xcc, 0x16, 0xe3, 0xf7, 0xa1, 0x6, 0xcc, + 0x9c, 0xf7, 0x14, 0xf7, 0x2, 0xe1, 0x92, 0x3f, 0x5a, 0x1e, 0xfb, 0xe5, + 0xe3, 0xf7, 0xc1, 0x7, 0xdc, 0xb2, 0xdb, 0xe3, 0xe8, 0x8b, 0x36, 0x59, + 0x1e, 0xfb, 0xdb, 0xe3, 0xf7, 0xf3, 0x7, 0xb0, 0x76, 0xf7, 0x2a, 0xfb, + 0x34, 0x2a, 0x72, 0x4c, 0x6f, 0x79, 0x1e, 0xc7, 0x76, 0x42, 0xaa, 0x41, + 0x1b, 0x40, 0x6c, 0x5e, 0x5d, 0x6f, 0x1f, 0x13, 0xf8, 0x89, 0x8a, 0x5, + 0xd3, 0x3c, 0x7, 0xe, 0xfb, 0xfa, 0xf9, 0x7, 0xc4, 0x1, 0x95, 0xf9, + 0x7, 0x15, 0xf7, 0xcd, 0xc4, 0xfb, 0xcd, 0x6, 0xe, 0x20, 0xb2, 0xf7, + 0x6c, 0x15, 0xf8, 0x8e, 0xd4, 0xfc, 0x8e, 0x6, 0xe, 0xfb, 0x4e, 0x76, + 0xf7, 0x57, 0xda, 0x48, 0xce, 0xf8, 0x5c, 0x77, 0x4e, 0xa, 0x13, 0xdc, + 0xf7, 0x33, 0xbf, 0x15, 0x6f, 0x9f, 0xa8, 0x67, 0xd4, 0x1b, 0xdd, 0xa9, + 0xb9, 0xa6, 0x9b, 0x1f, 0x8d, 0x6, 0x13, 0xbc, 0x4e, 0xd9, 0xf8, 0x9f, + 0x33, 0xfb, 0x75, 0x7, 0xfb, 0x10, 0x8a, 0x20, 0xfb, 0xb, 0xfb, 0x11, + 0x8b, 0xf7, 0xf, 0xf7, 0x1, 0x1e, 0xf7, 0x74, 0x33, 0xfd, 0x6e, 0xe4, + 0xf7, 0x97, 0x7, 0xe, 0x20, 0xa0, 0x76, 0xf8, 0x8e, 0x77, 0x1, 0xb3, + 0xd1, 0xf8, 0x1, 0xd0, 0x3, 0xb2, 0xd1, 0x15, 0xd1, 0x45, 0xf7, 0x4c, + 0xf7, 0x4b, 0xf7, 0x4a, 0xfb, 0x4b, 0xd1, 0xd2, 0xfb, 0x49, 0xf7, 0x4a, + 0xf7, 0x48, 0xf7, 0x49, 0x46, 0xd2, 0xfb, 0x49, 0xfb, 0x4c, 0xfb, 0x4c, + 0xf7, 0x4d, 0x45, 0x43, 0xf7, 0x4a, 0xfb, 0x4a, 0x5, 0xe, 0x6f, 0xa, + 0xf7, 0x8e, 0xe3, 0x17, 0xcc, 0x16, 0xe3, 0xf7, 0xaf, 0x6, 0xe0, 0xac, + 0xe9, 0xf7, 0x0, 0xf7, 0x0, 0x8c, 0x25, 0x5e, 0x1e, 0xfb, 0xcf, 0xe3, + 0xf7, 0xcf, 0x7, 0xf7, 0xe, 0x4a, 0xf0, 0xfb, 0x18, 0x68, 0x4d, 0x7c, + 0x3d, 0x58, 0x1e, 0x13, 0xf0, 0x89, 0xd4, 0x3c, 0x6, 0xe, 0x78, 0xd2, + 0xf7, 0x47, 0xd7, 0xf7, 0xdd, 0xd4, 0x1, 0xc6, 0xe5, 0xf7, 0x9d, 0xec, + 0x3, 0xc2, 0xf7, 0x30, 0x15, 0xfb, 0x3b, 0xa0, 0xf7, 0x30, 0x83, 0xb2, + 0x1b, 0xf7, 0x86, 0x8c, 0xf7, 0xc0, 0xd9, 0xf7, 0x61, 0x4e, 0xf7, 0x1f, + 0xfb, 0x4a, 0xfb, 0x18, 0x2a, 0x23, 0xfb, 0x20, 0xfb, 0x27, 0xf7, 0xb, + 0x3a, 0xf7, 0x2, 0xe0, 0xb8, 0xc0, 0xb3, 0xa3, 0x1f, 0x8d, 0x6, 0x47, + 0x8c, 0x88, 0xfb, 0x60, 0xfb, 0x2e, 0x1b, 0x29, 0x6e, 0xdf, 0xa6, 0x86, + 0x1f, 0x84, 0xf7, 0xbc, 0x15, 0xe7, 0xc2, 0xda, 0xdf, 0xde, 0xca, 0x39, + 0x32, 0x38, 0x56, 0x46, 0x2e, 0x3d, 0x4e, 0xc6, 0xe8, 0x1e, 0xe, 0xa0, + 0x76, 0xf8, 0x5a, 0xd7, 0xdc, 0x75, 0xa, 0xcc, 0xe3, 0xf7, 0x8e, 0xe3, + 0x13, 0xec, 0xcc, 0x16, 0xe3, 0xf7, 0xc2, 0x6, 0xdf, 0xac, 0xcf, 0xf7, + 0x0, 0xf7, 0x0, 0x8c, 0x20, 0x5e, 0x1e, 0xfb, 0xc2, 0xe3, 0xf7, 0xc2, + 0x7, 0xf7, 0x19, 0x52, 0xea, 0xfb, 0x20, 0x68, 0x4d, 0x83, 0x3e, 0x58, + 0x1e, 0x89, 0xd4, 0x3c, 0x6, 0xbd, 0xe8, 0x15, 0xcc, 0x6, 0xbb, 0xab, + 0x8a, 0x90, 0x9f, 0xa4, 0x7f, 0x7f, 0xa3, 0x1e, 0x80, 0xa2, 0x9f, 0x80, + 0x9c, 0x1b, 0xa1, 0xd0, 0x90, 0xf6, 0x90, 0x1f, 0x4b, 0x6, 0x13, 0xdc, + 0x68, 0x87, 0x80, 0x84, 0x77, 0x1b, 0x86, 0x78, 0x95, 0x96, 0x70, 0x1f, + 0x13, 0xec, 0x96, 0x72, 0x6d, 0x94, 0x74, 0x1b, 0x5a, 0x59, 0x68, 0x3e, + 0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x55, 0xcb, 0xf7, 0x3a, 0xce, 0xf7, 0x5a, + 0x77, 0x1, 0xa7, 0xf8, 0x89, 0x3, 0xcb, 0x16, 0xd0, 0x6, 0xb3, 0xf7, + 0x55, 0x5, 0xf7, 0x25, 0x6, 0x62, 0xfb, 0x55, 0x5, 0xd1, 0x6, 0xb3, + 0xf7, 0x55, 0x5, 0xf7, 0x22, 0xcb, 0xfb, 0x14, 0x6, 0xad, 0xf7, 0x3a, + 0x5, 0xe9, 0xce, 0x3b, 0x6, 0xb2, 0xf7, 0x5a, 0x5, 0x47, 0x6, 0x62, + 0xfb, 0x5a, 0x5, 0xfb, 0x24, 0x6, 0xb3, 0xf7, 0x5a, 0x5, 0x46, 0x6, + 0x62, 0xfb, 0x5a, 0x5, 0xfb, 0x1d, 0x48, 0xf7, 0x10, 0x6, 0x68, 0xfb, + 0x3a, 0x5, 0x32, 0x4b, 0xd7, 0x6, 0xd9, 0xcb, 0x15, 0xae, 0xf7, 0x3b, + 0x5, 0xf7, 0x2e, 0x6, 0x67, 0xfb, 0x3b, 0x5, 0xe, 0x7d, 0xd3, 0xf8, + 0x2c, 0xd3, 0x1, 0xbb, 0xe5, 0xf7, 0xa8, 0xe5, 0x3, 0xae, 0xf7, 0xa0, + 0x15, 0xfb, 0x2e, 0xd1, 0xfb, 0x14, 0xf7, 0x41, 0xf7, 0x30, 0xe2, 0xf1, + 0xf7, 0x48, 0xf7, 0x5a, 0xfb, 0x1a, 0xd3, 0xfb, 0x1, 0xfb, 0x3c, 0x40, + 0xfb, 0x13, 0xfb, 0x23, 0x1e, 0xe5, 0x16, 0xf7, 0x3c, 0xed, 0xa9, 0xc2, + 0xda, 0xd5, 0x4f, 0xfb, 0x1e, 0x39, 0x6f, 0xfb, 0x14, 0xfb, 0x11, 0x57, + 0x26, 0xb4, 0xf7, 0x3d, 0x1e, 0xe, 0x76, 0xa, 0xc8, 0xf7, 0x1d, 0x1, + 0x77, 0xa, 0x3, 0x3f, 0xa, 0xfb, 0x87, 0xfc, 0x6a, 0x23, 0xa, 0xe, + 0x76, 0xa, 0xf7, 0x5a, 0x77, 0x1, 0x77, 0xa, 0x3, 0x3a, 0xa, 0xfb, + 0x4d, 0xfc, 0x6a, 0x23, 0xa, 0xe, 0x7d, 0xd3, 0xf8, 0x34, 0xd3, 0xc7, + 0xef, 0x1, 0x77, 0xa, 0x3, 0x3e, 0xa, 0xfb, 0xab, 0xfc, 0x4e, 0x23, + 0xa, 0xe, 0xf7, 0x91, 0x7c, 0xd4, 0xf7, 0x46, 0xd3, 0xf7, 0x32, 0xd3, + 0x1, 0xae, 0xe5, 0xf7, 0xc8, 0xe7, 0xf7, 0xb1, 0xe7, 0x3, 0xf8, 0x6f, + 0xde, 0x15, 0x3d, 0xbf, 0xd4, 0x77, 0xca, 0x1b, 0xc8, 0xf7, 0x18, 0x9f, + 0xf7, 0x2b, 0xb3, 0x1f, 0x3c, 0x98, 0x5, 0x77, 0x85, 0x5e, 0x30, 0x24, + 0x1b, 0x2e, 0x5c, 0xd8, 0xf0, 0x8a, 0x1f, 0xf8, 0x10, 0x6, 0xf7, 0xaa, + 0xfb, 0x41, 0xa3, 0x49, 0x3d, 0x49, 0x68, 0x4b, 0x5f, 0x1e, 0xc8, 0x61, + 0x5a, 0xb1, 0x21, 0x1b, 0xfb, 0xd, 0xfb, 0xe, 0x2c, 0xfb, 0x49, 0xfb, + 0x47, 0xf7, 0x1, 0x29, 0xf7, 0x1a, 0xa9, 0xea, 0x8e, 0xea, 0xd3, 0x1f, + 0xfb, 0xf2, 0xf7, 0x47, 0x15, 0xf6, 0xc7, 0xec, 0xe8, 0xe0, 0xd1, 0x3c, + 0xfb, 0x11, 0xfb, 0x1d, 0x3e, 0x48, 0x3d, 0x63, 0xfb, 0x5, 0xa2, 0xf7, + 0x49, 0x1e, 0xf8, 0x24, 0xb9, 0x15, 0xf7, 0x4, 0x94, 0xcf, 0xb5, 0xc8, + 0x1b, 0xd7, 0xc8, 0x61, 0xfb, 0x4, 0x95, 0x1f, 0xe, 0xfb, 0xfa, 0xfb, + 0x75, 0xc7, 0xf7, 0x39, 0x77, 0x1, 0xd4, 0xc9, 0xc9, 0xe5, 0x3, 0xe8, + 0x16, 0x7a, 0x4f, 0x88, 0x6e, 0x76, 0x1a, 0x3d, 0xc1, 0x66, 0xc6, 0xae, + 0xb0, 0x97, 0x9d, 0xa8, 0x1e, 0xc2, 0x7, 0x78, 0x6d, 0x6a, 0x85, 0x70, + 0x1b, 0x67, 0x71, 0xa1, 0xba, 0x91, 0x88, 0xb9, 0x9e, 0xb7, 0x1f, 0xe, + 0x76, 0xa, 0xca, 0xf7, 0x1b, 0x1, 0x77, 0xa, 0x3, 0xb8, 0xf7, 0x9c, + 0x23, 0xa, 0xf7, 0x13, 0xf7, 0xe3, 0x4c, 0xa, 0x4a, 0xf7, 0x1b, 0x59, + 0xa, 0xa0, 0x76, 0xf8, 0xbe, 0xf7, 0x33, 0x1, 0xf7, 0xa3, 0xe3, 0x3, + 0xf7, 0xa3, 0x16, 0xe3, 0xf9, 0x53, 0x48, 0x6, 0x67, 0x42, 0x44, 0x47, + 0x37, 0x64, 0x8, 0x36, 0x7, 0xab, 0x97, 0xdd, 0xb3, 0xc3, 0xc1, 0x8, + 0xe, 0xf7, 0x23, 0x81, 0xc3, 0x5f, 0x76, 0xf7, 0xc6, 0xc3, 0xf7, 0xfb, + 0x77, 0xa0, 0x77, 0x12, 0xf7, 0x2a, 0xd1, 0xf8, 0x6f, 0xd7, 0x13, 0x76, + 0xf7, 0x2a, 0xf7, 0xf1, 0x15, 0xd1, 0xf7, 0xf5, 0x57, 0x6, 0x68, 0x60, + 0x53, 0x69, 0x69, 0x80, 0x8, 0x51, 0x7, 0xb0, 0x94, 0xb4, 0xa0, 0xa8, + 0xa3, 0x8, 0x50, 0xfd, 0x9, 0x15, 0xd7, 0x6, 0x13, 0x6e, 0xf8, 0xa3, + 0xf9, 0x66, 0x5, 0x40, 0x6, 0x13, 0xb6, 0xfb, 0x24, 0xfd, 0x5d, 0x15, + 0xf7, 0xbe, 0xc3, 0xfb, 0x4d, 0x6, 0xd3, 0xc3, 0x5, 0xcf, 0xba, 0xb6, + 0xa4, 0xc8, 0x1a, 0xe9, 0xfb, 0xc, 0x99, 0x76, 0xfb, 0xb, 0x79, 0x46, + 0x6a, 0x83, 0x1e, 0xd3, 0x84, 0x5, 0xa6, 0x94, 0x95, 0xa5, 0xc1, 0x1b, + 0xb3, 0xa4, 0x79, 0x69, 0x6b, 0x74, 0x7a, 0x41, 0x57, 0x1f, 0x4c, 0x5e, + 0x55, 0x5c, 0x85, 0x57, 0x8, 0xe, 0xf7, 0x23, 0x8d, 0x76, 0xdc, 0xbe, + 0xf8, 0xe2, 0x77, 0x1, 0xf7, 0x43, 0xce, 0xf8, 0x24, 0xcd, 0x3, 0xf8, + 0x67, 0xc9, 0x15, 0xf7, 0x43, 0x44, 0xcd, 0xd2, 0xbb, 0xbe, 0x5b, 0xf7, + 0x78, 0x53, 0x6, 0xfb, 0x4d, 0xfb, 0x71, 0x5, 0xd1, 0x84, 0x15, 0xf4, + 0xf7, 0xf, 0x5, 0xfb, 0xf, 0x7, 0xfc, 0x67, 0xf7, 0x83, 0x15, 0xce, + 0xf7, 0xf3, 0x59, 0x6, 0x6a, 0x60, 0x56, 0x69, 0x6a, 0x81, 0x8, 0x51, + 0x7, 0xaf, 0x94, 0xb1, 0x9f, 0xa7, 0xa3, 0x8, 0x5d, 0xfd, 0xa, 0x15, + 0xd4, 0x6, 0xf8, 0x8d, 0xf9, 0x63, 0x5, 0x44, 0x6, 0xe, 0xfb, 0xfa, + 0xf7, 0xe0, 0x76, 0xf8, 0x3a, 0x77, 0x1, 0xf7, 0x2b, 0xd2, 0x3, 0xf7, + 0x2b, 0xf7, 0xcb, 0x15, 0xd2, 0xf8, 0x3a, 0x56, 0x6, 0x68, 0x5e, 0x53, + 0x68, 0x68, 0x80, 0x8, 0x4e, 0x7, 0xb1, 0x95, 0xb3, 0xa0, 0xa9, 0xa4, + 0x8, 0xe, 0xfb, 0xd5, 0xf7, 0xc4, 0xd1, 0xf7, 0xbe, 0xcc, 0x1, 0xa3, + 0xd3, 0xf7, 0x38, 0xce, 0x3, 0xf7, 0xa6, 0xf7, 0xcf, 0x4c, 0xa, 0x78, + 0xa7, 0x8b, 0xb3, 0xd6, 0x1a, 0xf7, 0x1e, 0x7, 0xf7, 0x11, 0x3d, 0x9b, + 0x48, 0xfb, 0x9, 0x74, 0x3b, 0x62, 0x86, 0x1e, 0xcc, 0x77, 0x5, 0xc9, + 0x93, 0xb1, 0x99, 0xad, 0x1b, 0xd6, 0x8e, 0x56, 0x64, 0x1f, 0x82, 0x85, + 0x3b, 0x7f, 0x7b, 0x87, 0x8, 0x5a, 0x84, 0x39, 0x7d, 0x22, 0x1a, 0x27, + 0xd2, 0x6f, 0xb8, 0xbe, 0xb7, 0xab, 0xa9, 0xa8, 0x1e, 0x75, 0x8f, 0x7d, + 0x91, 0x7c, 0x1e, 0x7c, 0xf7, 0x5b, 0x15, 0x5b, 0x8a, 0x7d, 0x81, 0x77, + 0x1e, 0x65, 0x79, 0x64, 0x77, 0x68, 0x1b, 0x6a, 0x70, 0x9f, 0xb1, 0xb9, + 0xa6, 0x93, 0xcb, 0x97, 0x1f, 0xb7, 0x94, 0x96, 0x8c, 0x9c, 0x91, 0x8, + 0xe, 0xfb, 0xda, 0xf7, 0xc4, 0xd0, 0xf7, 0xbb, 0xd0, 0x1, 0xa4, 0xcb, + 0xf7, 0x50, 0xcb, 0x3, 0xa4, 0xf8, 0x9e, 0x15, 0xfb, 0x9, 0xc0, 0x26, + 0xf4, 0xf7, 0xe, 0xaf, 0xf7, 0x15, 0xe4, 0xe2, 0x68, 0xf7, 0x14, 0xfb, + 0xf, 0xfb, 0xd, 0x66, 0xfb, 0xc, 0x2c, 0x1e, 0xcb, 0x16, 0xb2, 0x97, + 0xf6, 0xdd, 0xe1, 0x93, 0xfb, 0x12, 0x77, 0x68, 0x83, 0xfb, 0x6, 0x35, + 0x35, 0x83, 0xf7, 0x13, 0xa1, 0x1e, 0xe, 0x3b, 0x8a, 0x76, 0xa6, 0xd0, + 0xf8, 0x10, 0xd0, 0xa1, 0x77, 0x1, 0xa7, 0xd3, 0xf7, 0xf8, 0xdc, 0x3, + 0xb0, 0x97, 0x15, 0xbb, 0x69, 0xc1, 0xcc, 0x5, 0x7d, 0xa3, 0xaf, 0x73, + 0xdc, 0x1b, 0xf7, 0x39, 0xe7, 0xf7, 0x3, 0xf7, 0x27, 0xf7, 0x1, 0x69, + 0xb7, 0x71, 0xab, 0x1f, 0xc2, 0xcb, 0x5a, 0xac, 0x58, 0x4f, 0x5, 0x9b, + 0x6e, 0x5c, 0xa1, 0x3f, 0x1b, 0xfb, 0x3a, 0x35, 0xfb, 0x8, 0xfb, 0x24, + 0x2e, 0xaa, 0x53, 0xad, 0x68, 0x1f, 0xba, 0xc6, 0x15, 0x6e, 0xa6, 0x80, + 0xb8, 0xbe, 0x1a, 0xf7, 0x3a, 0xf7, 0x17, 0xa6, 0xbc, 0xbe, 0xad, 0x78, + 0x7e, 0x9e, 0x1e, 0xfb, 0x60, 0xfb, 0xdc, 0x15, 0xf7, 0x86, 0xf7, 0xaf, + 0x5, 0xa1, 0x6f, 0x97, 0x72, 0x4e, 0x1a, 0xfb, 0x34, 0xfb, 0x8, 0x6e, + 0x4f, 0x59, 0x6c, 0x91, 0x99, 0x78, 0x1e, 0xe, 0x7d, 0xd3, 0xf8, 0x34, + 0xd3, 0xca, 0x75, 0xa, 0x77, 0xa, 0x13, 0xec, 0xf7, 0x7, 0xf8, 0xf5, + 0x15, 0xcc, 0x6, 0xbb, 0xac, 0x8a, 0x8f, 0xa2, 0xa4, 0x7f, 0x7f, 0xa2, + 0x1e, 0x80, 0xa2, 0x9f, 0x80, 0x9a, 0x1b, 0xa0, 0xd6, 0x8d, 0xf7, 0x2, + 0x56, 0xa, 0x87, 0x79, 0x92, 0x96, 0x74, 0x1f, 0x13, 0xdc, 0x70, 0x96, + 0x6b, 0x98, 0x72, 0x8a, 0x8, 0x13, 0xec, 0x5a, 0x59, 0x66, 0x40, 0x1f, + 0x45, 0xfb, 0xed, 0x23, 0xa, 0xe, 0x66, 0xa, 0xc7, 0xe3, 0xf7, 0x98, + 0xe5, 0x3, 0xf7, 0x28, 0xc8, 0x15, 0x68, 0xa5, 0xb3, 0x6c, 0xc9, 0x1b, + 0xf7, 0x6, 0xf7, 0x13, 0xe0, 0xf7, 0x4c, 0xf7, 0x25, 0x2d, 0xf7, 0x15, + 0xfb, 0x27, 0x2d, 0x70, 0x54, 0x73, 0x7c, 0x1f, 0x89, 0xce, 0x3b, 0xfd, + 0x71, 0xe3, 0xf7, 0xa0, 0x6, 0x82, 0xf7, 0x5e, 0x15, 0xf7, 0xd, 0xc2, + 0xe0, 0xdf, 0xcd, 0xe0, 0x50, 0xfb, 0x26, 0xfb, 0x3e, 0x28, 0x70, 0x57, + 0x4f, 0x3c, 0xb3, 0xf7, 0x30, 0x1e, 0xe, 0xfb, 0x2e, 0xfb, 0x2c, 0x76, + 0xf9, 0xba, 0xe0, 0x1, 0x9d, 0xf7, 0xa2, 0xdd, 0xd0, 0x3, 0xf7, 0x6c, + 0xfb, 0x41, 0x15, 0xd3, 0xf9, 0xba, 0xdd, 0xfd, 0xba, 0xd0, 0xf9, 0xba, + 0xc5, 0xe0, 0xfb, 0x8b, 0x6, 0xfb, 0xf, 0xfb, 0x1, 0x48, 0xfb, 0x1d, + 0x27, 0xca, 0x2d, 0xf7, 0x1b, 0x1f, 0xe, 0x70, 0xa, 0x1, 0xcf, 0xe6, + 0x3, 0xf7, 0x88, 0xfb, 0x63, 0x15, 0xc2, 0x6, 0x21, 0xf7, 0x3e, 0x69, + 0xf7, 0x30, 0xf7, 0x23, 0x1a, 0xf7, 0x6d, 0xd4, 0xf7, 0x1f, 0xce, 0xf7, + 0x7, 0x1e, 0x4a, 0x6, 0x21, 0xfb, 0x1f, 0x4f, 0xfb, 0x37, 0xfb, 0x3d, + 0x1a, 0xfb, 0x7f, 0xf7, 0x1d, 0xfb, 0x4d, 0xb2, 0x5a, 0x1e, 0xe, 0x70, + 0xa, 0x12, 0xf7, 0x42, 0xe6, 0x17, 0xad, 0xfb, 0x61, 0x15, 0xc6, 0x89, + 0x5, 0xf5, 0xf7, 0x1f, 0xcd, 0xf7, 0x35, 0xf7, 0x3d, 0x1a, 0xf7, 0x7f, + 0xfb, 0x16, 0xf7, 0x4f, 0x64, 0xbc, 0x1e, 0x4d, 0x6, 0x13, 0x20, 0xf5, + 0xfb, 0x3e, 0xad, 0xfb, 0x32, 0xfb, 0x23, 0x1a, 0xfb, 0x6d, 0x3d, 0xfb, + 0x26, 0x4d, 0x23, 0x1e, 0xe, 0xf7, 0x5a, 0x79, 0xc5, 0x65, 0x76, 0xf7, + 0xc5, 0xc4, 0x89, 0xc5, 0xf7, 0x8a, 0xc4, 0x8c, 0x77, 0x12, 0xb2, 0xde, + 0xf7, 0x3a, 0xdd, 0xf7, 0x29, 0xdd, 0xf7, 0x3b, 0xdd, 0x13, 0x9b, 0xc0, + 0xb2, 0xf8, 0x9d, 0x15, 0xfb, 0x37, 0xf7, 0x2, 0x7a, 0xc0, 0xce, 0xf0, + 0xb2, 0xf7, 0x21, 0xf7, 0x27, 0x26, 0xad, 0x48, 0x1e, 0xfb, 0xa, 0x5e, + 0x29, 0x38, 0x1f, 0xde, 0x16, 0xae, 0x89, 0xe4, 0xdd, 0xdf, 0x8d, 0x28, + 0x72, 0x68, 0x89, 0x34, 0x37, 0x1e, 0x13, 0xa6, 0xc0, 0x39, 0x8d, 0xed, + 0xa3, 0x1f, 0xf8, 0x21, 0xfb, 0xfa, 0x15, 0xfb, 0x37, 0xf7, 0x2, 0x79, + 0xc0, 0xce, 0xf0, 0xb3, 0xf7, 0x21, 0x1e, 0x13, 0xab, 0xc0, 0xf7, 0x26, + 0x26, 0xad, 0x48, 0xfb, 0xb, 0x5f, 0x2a, 0x38, 0x1e, 0xdd, 0x16, 0xae, + 0x89, 0xe3, 0xde, 0xdf, 0x8d, 0x29, 0x72, 0x68, 0x89, 0x33, 0x37, 0x38, + 0x8d, 0xee, 0xa3, 0x1e, 0x13, 0x67, 0xc0, 0xfc, 0x2b, 0xfb, 0x4a, 0x15, + 0xda, 0x6, 0xf8, 0x3b, 0xf9, 0x66, 0x5, 0x3e, 0x6, 0xe, 0xfc, 0x31, + 0x8b, 0xf5, 0x1, 0xe2, 0xf3, 0x3, 0xe2, 0x16, 0xf3, 0xf5, 0x23, 0x6, + 0xe, 0xfc, 0x31, 0xf7, 0x52, 0xf7, 0x11, 0x1, 0xd8, 0xf7, 0x11, 0x3, + 0xd8, 0xf7, 0x52, 0x15, 0xf7, 0x11, 0xf7, 0x11, 0xfb, 0x11, 0x6, 0xe, + 0xf7, 0xc9, 0x78, 0xc5, 0xf7, 0x86, 0xc5, 0x88, 0xc6, 0xf7, 0x85, 0xc4, + 0x95, 0x77, 0x12, 0x92, 0xd5, 0xf7, 0x1f, 0xd4, 0xd9, 0xd4, 0xf7, 0x1f, + 0xd5, 0xbe, 0xd4, 0xf7, 0x1f, 0xd5, 0x13, 0xb7, 0xe0, 0x92, 0xf8, 0x98, + 0x15, 0x52, 0x97, 0xfb, 0xf, 0xf7, 0x16, 0xf7, 0x23, 0x8c, 0xf7, 0x1b, + 0xb8, 0xb2, 0x86, 0xf7, 0x1e, 0xfb, 0x1f, 0xfb, 0x1a, 0x83, 0xfb, 0x16, + 0x5c, 0x1e, 0xd5, 0x16, 0xb1, 0x8a, 0xdd, 0xd0, 0xc4, 0x99, 0x53, 0x4b, + 0x5d, 0x83, 0x40, 0x4c, 0x48, 0x8a, 0xd7, 0xb8, 0x1e, 0xf7, 0xb6, 0xfb, + 0xf8, 0x15, 0x5d, 0xa, 0x1e, 0x13, 0xcf, 0xe0, 0x3c, 0xa, 0xf7, 0x9c, + 0x16, 0x5d, 0xa, 0x3c, 0xa, 0xfd, 0xb, 0xfb, 0x45, 0x15, 0xcd, 0x6, + 0xf7, 0xbf, 0xf9, 0x64, 0x5, 0x49, 0x6, 0xe, 0x20, 0xf7, 0x82, 0xe4, + 0x1, 0xf7, 0x8d, 0xe4, 0x3, 0xb2, 0xf7, 0x82, 0x15, 0xf7, 0x66, 0xfb, + 0x64, 0xe4, 0xf7, 0x64, 0xf7, 0x63, 0xe4, 0xfb, 0x63, 0xf7, 0x64, 0x32, + 0xfb, 0x64, 0xfb, 0x66, 0x6, 0xe, 0x20, 0x8b, 0xd9, 0xf7, 0x57, 0xd8, + 0xf7, 0x30, 0x77, 0x1, 0xf7, 0x8b, 0xe4, 0x3, 0xb2, 0xf7, 0xa5, 0x15, + 0xf7, 0x64, 0xfb, 0x2e, 0xe4, 0xf7, 0x2e, 0xf7, 0x65, 0xd8, 0xfb, 0x65, + 0xf7, 0x30, 0x32, 0xfb, 0x30, 0xfb, 0x64, 0x6, 0xfb, 0xf2, 0x4, 0xf8, + 0x8e, 0xd9, 0xfc, 0x8e, 0x6, 0xe, 0x66, 0xa, 0xbe, 0xe5, 0xf7, 0xa6, + 0xda, 0x3, 0xf8, 0x28, 0xc8, 0x15, 0x8d, 0xfb, 0xa0, 0xe3, 0xf9, 0x71, + 0x3b, 0x48, 0x89, 0x6, 0xa3, 0x7c, 0x5b, 0xc2, 0x2d, 0x1b, 0xfb, 0x27, + 0x42, 0xfb, 0x10, 0xfb, 0x25, 0xfb, 0x4c, 0xf5, 0x31, 0xf7, 0x6, 0xc9, + 0xc8, 0xaa, 0xae, 0xa5, 0x1f, 0xfb, 0xab, 0xf7, 0x64, 0x15, 0xf7, 0x26, + 0xcb, 0xc1, 0xcd, 0xdf, 0xd7, 0x3c, 0xfb, 0xd, 0xfb, 0x30, 0x27, 0x5d, + 0x4f, 0x57, 0x3d, 0xab, 0xf7, 0x3e, 0x1e, 0xe, 0x8b, 0xef, 0xf8, 0xbf, + 0xd3, 0x12, 0xf7, 0x71, 0xeb, 0x31, 0xdc, 0xec, 0xe2, 0x13, 0xd8, 0xf7, + 0x77, 0xf7, 0x44, 0x15, 0xdc, 0x6, 0x8d, 0xed, 0x97, 0x9a, 0xce, 0xc8, + 0x8, 0xc6, 0xc2, 0xb7, 0xb4, 0xdc, 0x1a, 0xf7, 0x4, 0x30, 0xe3, 0xfb, + 0x16, 0x26, 0xfb, 0x6, 0x33, 0xfb, 0xa, 0x1e, 0xd8, 0x81, 0x5, 0xe0, + 0x99, 0xb4, 0xc6, 0xdf, 0x1b, 0xd8, 0xc3, 0x4d, 0x49, 0x59, 0x6f, 0x6e, + 0x62, 0x66, 0x1f, 0x38, 0x40, 0x6c, 0x67, 0x90, 0xfb, 0x10, 0x8, 0x13, + 0xe8, 0x85, 0xfb, 0x44, 0x15, 0xeb, 0xef, 0x2b, 0x6, 0xe, 0x3b, 0xfb, + 0x5d, 0xd3, 0xf8, 0xbf, 0xee, 0x12, 0xe6, 0xe5, 0xe0, 0xef, 0x31, 0xdf, + 0xe0, 0xdd, 0x13, 0xec, 0xf7, 0xa8, 0xf7, 0xea, 0x15, 0x89, 0x29, 0x85, + 0x86, 0x46, 0x4e, 0x8, 0x4d, 0x54, 0x5d, 0x5c, 0x3a, 0x1a, 0xfb, 0x4, + 0xea, 0x37, 0xf7, 0x1b, 0xcc, 0xf7, 0x21, 0xb8, 0xf7, 0x37, 0x1e, 0x39, + 0x95, 0x5, 0x3f, 0x8c, 0x63, 0x45, 0x35, 0x1b, 0x3b, 0x50, 0xc5, 0xcd, + 0xbd, 0xa9, 0xae, 0xb5, 0xb0, 0x1f, 0xe1, 0xd6, 0xa5, 0xa5, 0x86, 0xf7, + 0x10, 0x8, 0x13, 0xf4, 0x2d, 0xdf, 0x15, 0xef, 0xee, 0x27, 0x6, 0xe, + 0xfb, 0xe4, 0xf8, 0x78, 0x76, 0xf7, 0x93, 0x77, 0x1, 0xd1, 0xd8, 0xc8, + 0xd8, 0x3, 0xf7, 0x74, 0xf8, 0x63, 0x5c, 0xa, 0xfb, 0xe, 0xfb, 0x1e, + 0x5c, 0xa, 0xe, 0xfb, 0xfa, 0xfb, 0x14, 0x76, 0xf7, 0x22, 0xf7, 0x5, + 0x1, 0xdb, 0xbb, 0xf7, 0xb, 0xbb, 0x3, 0xad, 0x84, 0x48, 0xa, 0xf7, + 0x3b, 0xfb, 0x5, 0x48, 0xa, 0xe, 0xfb, 0xfa, 0xf8, 0x6a, 0xf7, 0x6, + 0xf7, 0x21, 0x77, 0x1, 0xb1, 0xbb, 0xf7, 0xb, 0xbb, 0x3, 0xf7, 0x61, + 0xf8, 0x6a, 0x47, 0xa, 0xfb, 0x3b, 0x2f, 0x47, 0xa, 0xe, 0xfb, 0xfa, + 0xf8, 0x78, 0x76, 0xf7, 0x21, 0xf7, 0x6, 0x12, 0xdb, 0xbb, 0xf7, 0xb, + 0xbb, 0x17, 0xbb, 0xf8, 0x63, 0x15, 0x13, 0xf0, 0x4d, 0xa, 0xf7, 0x51, + 0x69, 0x15, 0x13, 0x50, 0x4d, 0xa, 0xe, 0xfc, 0x69, 0xf8, 0x6a, 0xef, + 0xf7, 0x2f, 0x77, 0x1, 0xcc, 0xba, 0x3, 0xcc, 0xf8, 0x6a, 0x15, 0xe8, + 0xef, 0x5d, 0x6, 0x8c, 0xa7, 0x90, 0xd3, 0xbe, 0xa0, 0x75, 0xad, 0x18, + 0x3b, 0x67, 0x89, 0x2f, 0x5a, 0x1a, 0xe, 0xfc, 0x69, 0xf8, 0x78, 0x76, + 0x1, 0xf7, 0x2, 0xba, 0x3, 0xd6, 0xf8, 0x63, 0x15, 0xdb, 0xaf, 0x8d, + 0xd6, 0xbc, 0x1a, 0xea, 0x2e, 0xfb, 0x9, 0xb9, 0x7, 0x8a, 0x6f, 0x86, + 0x54, 0x58, 0x76, 0x8, 0xe, 0xfc, 0x69, 0x85, 0xf7, 0x4, 0x1, 0xf7, + 0x1, 0xbb, 0x3, 0xca, 0x85, 0x15, 0xb9, 0x6, 0x8a, 0x6f, 0x87, 0x4f, + 0x58, 0x76, 0xa1, 0x69, 0x18, 0xdb, 0xaf, 0x8d, 0xdb, 0xbc, 0x1a, 0xe5, + 0x2d, 0x7, 0xe, 0xfc, 0x88, 0xf8, 0x78, 0x76, 0xf7, 0x93, 0x77, 0x1, + 0xc6, 0xd4, 0x3, 0xdb, 0xf8, 0x63, 0x15, 0xa9, 0x6, 0xa1, 0xf7, 0x1e, + 0x5, 0xf7, 0x9, 0x42, 0xfb, 0x9, 0x7, 0xe, 0xfb, 0xfa, 0xa0, 0x76, + 0xf8, 0x55, 0xe4, 0x12, 0x85, 0xe3, 0x17, 0xd8, 0x16, 0xe3, 0xf7, 0xac, + 0x6, 0xd7, 0x9b, 0xe8, 0xc3, 0xa2, 0xa0, 0x8a, 0x78, 0xa0, 0x1e, 0xa9, + 0xdd, 0x5, 0x92, 0x82, 0x78, 0x9f, 0x5e, 0x1b, 0x4c, 0x7a, 0x5f, 0x63, + 0x77, 0x1f, 0x13, 0xe0, 0x89, 0xd4, 0x3b, 0x6, 0xe, 0xb9, 0x78, 0xca, + 0xf7, 0xab, 0xc3, 0xf7, 0xe, 0xc2, 0xf7, 0xa, 0xca, 0x1, 0x7d, 0xca, + 0xf7, 0x2e, 0xcd, 0xf7, 0x49, 0xd2, 0xf7, 0x3c, 0xca, 0x3, 0xf7, 0x5f, + 0xf7, 0x2a, 0x15, 0xcd, 0xf7, 0x41, 0xb3, 0x6, 0xc0, 0x9e, 0x76, 0x33, + 0xbd, 0x1f, 0xb0, 0x4b, 0x5, 0xdc, 0x6, 0x59, 0xda, 0x58, 0xdc, 0x7a, + 0x97, 0x73, 0x95, 0x19, 0x9d, 0xeb, 0x94, 0xef, 0xec, 0x2a, 0x9d, 0x3c, + 0x1f, 0xfb, 0x22, 0x6, 0xcd, 0xfb, 0x45, 0x15, 0xf7, 0xe, 0xd7, 0x7, + 0xb4, 0xcb, 0x8b, 0x4f, 0x4d, 0x41, 0x8b, 0x6c, 0x1f, 0xfb, 0xfb, 0x78, + 0x15, 0xfb, 0x66, 0xf7, 0x41, 0xfb, 0x3d, 0xf7, 0x68, 0xf7, 0x68, 0xf7, + 0x3d, 0xf7, 0x3e, 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x3f, 0xf7, 0x3c, 0xfb, + 0x66, 0xfb, 0x66, 0xfb, 0x43, 0xfb, 0x3b, 0xfb, 0x66, 0x1e, 0xca, 0x16, + 0xf7, 0x42, 0xf7, 0x25, 0xf7, 0x20, 0xf7, 0x44, 0xf7, 0x44, 0xf7, 0x23, + 0xfb, 0x20, 0xfb, 0x42, 0xfb, 0x43, 0xfb, 0x23, 0xfb, 0x21, 0xfb, 0x44, + 0xfb, 0x44, 0xfb, 0x25, 0xf7, 0x21, 0xf7, 0x43, 0x1e, 0xe, 0xfb, 0xfa, + 0xf8, 0xd0, 0xb1, 0xf7, 0x0, 0xb1, 0x1, 0xd6, 0xb1, 0xf7, 0x0, 0xb1, + 0x3, 0xd6, 0xf9, 0x2e, 0x15, 0x57, 0xb3, 0x61, 0xbe, 0xbf, 0xb4, 0xb5, + 0xbf, 0xbe, 0x62, 0xb2, 0x57, 0x58, 0x63, 0x64, 0x58, 0x1e, 0xb1, 0x16, + 0xa6, 0xa1, 0xa4, 0xaa, 0xab, 0xa2, 0x74, 0x6e, 0x6c, 0x73, 0x72, 0x6c, + 0x6f, 0x72, 0xa1, 0xad, 0x1e, 0xe, 0xfb, 0x53, 0x7c, 0xd3, 0xf8, 0x2d, + 0xd3, 0x1, 0xc8, 0xe0, 0xf7, 0x78, 0xe5, 0x3, 0xab, 0xf7, 0x2f, 0x15, + 0x57, 0x94, 0xa3, 0xfb, 0xa, 0xf7, 0x50, 0x1b, 0xf7, 0x1b, 0xd7, 0xd3, + 0xe1, 0xf6, 0x3f, 0xa9, 0xfb, 0x1c, 0xae, 0x1f, 0x36, 0xa1, 0x66, 0x91, + 0xb7, 0x1a, 0xc6, 0xd2, 0x9f, 0xae, 0xae, 0xd5, 0x83, 0x6c, 0xa, 0xf6, + 0xfb, 0x4a, 0x1b, 0xfb, 0x11, 0x49, 0x44, 0x3b, 0xfb, 0x0, 0xf1, 0x73, + 0xda, 0x78, 0x1f, 0xf7, 0x2, 0x70, 0xb1, 0x73, 0x61, 0x1a, 0x68, 0x6c, + 0x58, 0x30, 0x38, 0x62, 0xb5, 0xd0, 0x82, 0x1e, 0xe, 0xfb, 0x53, 0x7c, + 0xd3, 0xf8, 0x22, 0xd3, 0xf7, 0x63, 0x77, 0x1, 0xb9, 0xe0, 0xf7, 0x87, + 0xe5, 0x3, 0xab, 0xf7, 0x2c, 0x15, 0x57, 0x94, 0xa3, 0xfb, 0x7, 0xf7, + 0x50, 0x1b, 0xf7, 0x1b, 0xd7, 0xd0, 0xe1, 0xf6, 0x40, 0x9c, 0xfb, 0x1c, + 0xae, 0x1f, 0x36, 0xa1, 0x66, 0xa2, 0xb7, 0x1a, 0xc6, 0xd2, 0x93, 0xae, + 0xae, 0xd5, 0x85, 0x6c, 0xa, 0xf4, 0xfb, 0x4a, 0x1b, 0xfb, 0x11, 0x49, + 0x46, 0x3b, 0xfb, 0x0, 0xf1, 0x70, 0xda, 0x78, 0x1f, 0xf7, 0x2, 0x70, + 0xb0, 0x7c, 0x61, 0x1a, 0x68, 0x6d, 0x5b, 0x30, 0x38, 0x61, 0xb2, 0xd0, + 0x82, 0x1e, 0xe2, 0xf8, 0x44, 0x37, 0xa, 0xfb, 0x53, 0xd4, 0xf9, 0xa4, + 0xd2, 0x1, 0xd4, 0x7a, 0x15, 0xfb, 0x10, 0x9b, 0xe6, 0x59, 0xf4, 0x1b, + 0xf7, 0x9, 0xd7, 0xd0, 0xe4, 0xd8, 0x4f, 0xb8, 0x79, 0x99, 0x1f, 0xb5, + 0x9c, 0xd1, 0x98, 0xe7, 0x1a, 0xe7, 0x3f, 0xc6, 0x27, 0xc6, 0x1e, 0x49, + 0xb3, 0x2d, 0xbf, 0xc4, 0x1a, 0xb2, 0xaa, 0xb6, 0xc8, 0xe0, 0x9e, 0x46, + 0x66, 0x92, 0x1e, 0xe6, 0x95, 0x5, 0xf7, 0x8, 0xfb, 0x15, 0xbe, 0x47, + 0xfb, 0x14, 0x52, 0x32, 0x4b, 0x50, 0xb0, 0x68, 0xa7, 0x73, 0x1e, 0x3f, + 0x74, 0x69, 0x4f, 0x54, 0x1a, 0x2a, 0xe2, 0x55, 0xda, 0x5c, 0x1e, 0xda, + 0x5a, 0xb0, 0x6f, 0xa2, 0x79, 0x8, 0xaf, 0x6f, 0x91, 0x76, 0x77, 0x1a, + 0x6d, 0x73, 0x55, 0x3a, 0x28, 0x7b, 0xd5, 0xb2, 0x82, 0x1e, 0xf7, 0x57, + 0xf7, 0x20, 0x15, 0x78, 0x99, 0x6f, 0x9c, 0x4b, 0xb0, 0x8, 0x3b, 0xba, + 0x60, 0xa5, 0xbf, 0x1a, 0xbf, 0xba, 0xb0, 0xa6, 0x9a, 0x1e, 0xa3, 0x77, + 0xab, 0x76, 0xb5, 0x71, 0x8, 0xd9, 0x5b, 0xc3, 0x62, 0x58, 0x1a, 0x70, + 0x79, 0x67, 0x55, 0x70, 0x1e, 0xe, 0xfc, 0x31, 0xfb, 0x12, 0x76, 0xf8, + 0xc8, 0xee, 0x1, 0xe3, 0xf2, 0x3, 0xe3, 0x85, 0x15, 0xc8, 0x6, 0x8a, + 0x61, 0x7d, 0x62, 0x5c, 0x76, 0xa3, 0x66, 0x18, 0xd2, 0xa4, 0x94, 0xdd, + 0xad, 0x1a, 0xee, 0x24, 0x7, 0xf7, 0xd8, 0x4, 0xf2, 0xee, 0x24, 0x6, + 0xe, 0xa0, 0x76, 0xf9, 0xa, 0xdc, 0x1, 0xf7, 0x23, 0xe9, 0x3, 0xf7, + 0x23, 0x16, 0xe9, 0x6, 0xa2, 0xf7, 0xcc, 0xf7, 0x54, 0xf7, 0x85, 0xd2, + 0xd2, 0x8, 0xcb, 0xfc, 0x7a, 0x3a, 0xf8, 0x3, 0x7, 0xfb, 0x3b, 0xfb, + 0x46, 0x2f, 0xfb, 0x9e, 0x89, 0xfb, 0x37, 0x8, 0xe, 0x78, 0xd2, 0xf7, + 0xd8, 0xd7, 0xf7, 0x48, 0xd2, 0x1, 0xc4, 0xf3, 0xf7, 0x9d, 0xe7, 0x3, + 0xf7, 0x14, 0xf7, 0xfa, 0x15, 0xf7, 0x4, 0xb3, 0xf7, 0x36, 0xf7, 0xd, + 0xed, 0xa3, 0x36, 0x70, 0x91, 0x1e, 0xe5, 0x93, 0x5, 0xf7, 0x1b, 0x78, + 0xfb, 0x6, 0xb3, 0x36, 0x1b, 0xfb, 0x88, 0x84, 0xfb, 0xb4, 0x30, 0xfb, + 0x43, 0xb6, 0xfb, 0x3c, 0xf7, 0x64, 0xf7, 0x2d, 0xd7, 0xf7, 0xa, 0xf7, + 0xa, 0xf7, 0x20, 0xfb, 0x6, 0xea, 0xfb, 0x7, 0x40, 0x5d, 0x69, 0x4f, + 0x65, 0x1f, 0x97, 0xfb, 0x1c, 0x15, 0xf1, 0xd8, 0xbf, 0xd1, 0xe3, 0xbc, + 0x45, 0x32, 0x38, 0x5b, 0x39, 0x32, 0x31, 0x52, 0xdc, 0xe4, 0x1e, 0xe, + 0xfc, 0x31, 0x8d, 0x76, 0x1, 0x7a, 0xf7, 0xcc, 0x3, 0x7a, 0x78, 0x15, + 0xd2, 0x6, 0xf7, 0x85, 0xf9, 0x88, 0x5, 0x4c, 0x6, 0xe, 0xfc, 0x31, + 0xe, 0x7b, 0xda, 0x6a, 0xd3, 0xf7, 0x6c, 0xd2, 0xf7, 0x96, 0xd2, 0x12, + 0xe8, 0xe3, 0x67, 0xe7, 0x13, 0x78, 0xac, 0xd0, 0x15, 0xac, 0x37, 0x5, + 0xa7, 0xb5, 0xc4, 0x9c, 0xbb, 0x1b, 0x13, 0xb8, 0xca, 0xe3, 0x5d, 0xc7, + 0x1b, 0xb5, 0xab, 0x98, 0x9c, 0xb4, 0x1f, 0x6f, 0xdb, 0x5, 0x83, 0x7a, + 0x64, 0x74, 0x68, 0x1b, 0x13, 0x74, 0x43, 0x54, 0xb2, 0x41, 0x1b, 0x6d, + 0x73, 0x85, 0x86, 0x7e, 0x1f, 0x89, 0x8d, 0x5, 0xbb, 0xbc, 0xb2, 0xca, + 0xd1, 0x1a, 0xa0, 0x86, 0x95, 0x86, 0x97, 0x1e, 0xf7, 0x1b, 0xd2, 0xfb, + 0x2a, 0x6, 0x13, 0xb8, 0x7e, 0xb1, 0x79, 0xbf, 0xb0, 0x1a, 0xc6, 0xbd, + 0xd3, 0xd8, 0xc9, 0xc2, 0x60, 0x39, 0x95, 0x1e, 0xe1, 0x98, 0x5, 0xf7, + 0x4, 0x84, 0x26, 0xd2, 0x22, 0x1b, 0x20, 0xfb, 0x0, 0x4c, 0xfb, 0x1f, + 0x67, 0x92, 0x6d, 0x9c, 0x4e, 0x1f, 0x42, 0x44, 0xe8, 0x6, 0x13, 0xb4, + 0x8f, 0x7b, 0x8f, 0x7c, 0x6e, 0x1a, 0xfb, 0xc, 0x34, 0x54, 0x72, 0x7d, + 0x1e, 0xe, 0xfc, 0x31, 0x99, 0x76, 0xf8, 0x52, 0xcf, 0xf7, 0x36, 0x77, + 0x1, 0xdc, 0xe3, 0x3, 0xf7, 0x95, 0x8c, 0x15, 0x7f, 0xd9, 0x5, 0x54, + 0x7e, 0x76, 0x93, 0xd4, 0x1a, 0xf7, 0xb8, 0xe3, 0xcf, 0x33, 0xf7, 0x36, + 0x7, 0x33, 0x56, 0x5, 0xfb, 0x1, 0x48, 0x47, 0xce, 0xfb, 0xb8, 0x7, + 0x35, 0x90, 0x47, 0xf7, 0x6, 0xa8, 0x98, 0x90, 0x8e, 0x9a, 0x1e, 0xe, + 0xfb, 0x4e, 0x76, 0xf7, 0x57, 0xd4, 0xf8, 0x20, 0xd4, 0xf7, 0x50, 0x77, + 0x12, 0xc5, 0xda, 0x3c, 0xe3, 0xf7, 0xad, 0xe5, 0x13, 0xf6, 0xf7, 0x26, + 0xc1, 0x15, 0x6c, 0xa8, 0xaf, 0x68, 0xd6, 0x1b, 0xf7, 0x2, 0xf7, 0xd, + 0xdd, 0xf7, 0x4e, 0xf7, 0x25, 0x37, 0xf7, 0x15, 0xfb, 0x27, 0x3c, 0x6d, + 0x6a, 0x6a, 0x6c, 0x1f, 0xf7, 0x92, 0x33, 0xfe, 0x31, 0xe3, 0x7, 0x13, + 0xfa, 0x82, 0xf8, 0x63, 0x15, 0xf7, 0xd, 0xcc, 0xdb, 0xdf, 0xcd, 0xd6, + 0x53, 0xfb, 0x25, 0xfb, 0x3e, 0x32, 0x72, 0x57, 0x4f, 0x32, 0xb2, 0xf7, + 0x30, 0x1e, 0xe, 0x78, 0xd2, 0xf8, 0xd8, 0xd2, 0x1, 0xf8, 0x29, 0xe9, + 0x3, 0xad, 0xf7, 0x47, 0x15, 0x28, 0x95, 0xd8, 0x28, 0xf7, 0x2b, 0x1b, + 0xf7, 0x13, 0xf7, 0xf, 0xdd, 0xf7, 0x1e, 0xd2, 0x4f, 0xf0, 0x3b, 0x1f, + 0x8d, 0x7, 0xe4, 0xb0, 0x99, 0xd2, 0xb0, 0x1a, 0xf1, 0x30, 0xdc, 0xfb, + 0x12, 0x3d, 0xfb, 0xa, 0x6a, 0xfb, 0x2a, 0x6e, 0x1e, 0xe7, 0x7b, 0x5, + 0xd1, 0x96, 0xb3, 0xc5, 0xdf, 0x1b, 0xc5, 0xca, 0x66, 0x40, 0x24, 0xfb, + 0x6, 0x77, 0x57, 0x90, 0x1f, 0x80, 0x3f, 0x5, 0xf4, 0xad, 0xf4, 0x51, + 0x24, 0x1a, 0x38, 0x48, 0x4b, 0x36, 0xfb, 0x9, 0x75, 0xf3, 0xae, 0x84, + 0x1e, 0xe, 0xf7, 0x23, 0x8d, 0x76, 0xdc, 0xbe, 0xf7, 0x77, 0xc2, 0xf7, + 0x6, 0xf7, 0x56, 0x56, 0xc0, 0x12, 0xf7, 0x8f, 0xd7, 0x50, 0xd7, 0xf7, + 0xec, 0xd1, 0x13, 0xf3, 0xf8, 0x89, 0xc9, 0x15, 0xf7, 0x4f, 0x43, 0xd1, + 0xd3, 0xbf, 0xbe, 0x57, 0xf7, 0x78, 0x4f, 0x6, 0xfb, 0x59, 0xfb, 0x71, + 0x5, 0xd6, 0x84, 0x15, 0xf7, 0x4, 0xf7, 0x10, 0x5, 0xfb, 0x10, 0x7, + 0xfd, 0x17, 0xf7, 0xdc, 0x15, 0x51, 0x97, 0xae, 0x60, 0xee, 0x1b, 0xef, + 0xc0, 0xc1, 0xc2, 0xbd, 0x68, 0xa7, 0x5a, 0x96, 0x1f, 0x8d, 0x7, 0x13, + 0xed, 0xbb, 0x97, 0x9e, 0xa3, 0xab, 0x1a, 0xe3, 0xfb, 0x8, 0x92, 0x78, + 0x31, 0x70, 0x68, 0x54, 0x75, 0x1e, 0xd1, 0x80, 0x5, 0xa7, 0x96, 0x99, + 0x9f, 0xb7, 0x1b, 0xb5, 0x9c, 0x77, 0x75, 0x63, 0x59, 0x83, 0x70, 0x1f, + 0x13, 0xf3, 0x81, 0x58, 0x5, 0xc1, 0x8d, 0xbd, 0x7d, 0x5b, 0x1a, 0x65, + 0x69, 0x7b, 0x60, 0x53, 0x7e, 0xae, 0x9d, 0x85, 0x1e, 0xa5, 0xfc, 0x67, + 0x15, 0xd8, 0x6, 0xf8, 0xaf, 0xf9, 0x66, 0x5, 0x3f, 0x6, 0xe, 0xfb, + 0xfa, 0xf7, 0xa2, 0xcd, 0xf7, 0xc4, 0xca, 0x1, 0xf7, 0x76, 0xdc, 0x3, + 0x90, 0xf8, 0x1c, 0x15, 0x46, 0x98, 0xb1, 0x56, 0xf5, 0x1b, 0xf5, 0xc4, + 0xcc, 0xcd, 0xc7, 0x66, 0xac, 0x56, 0x98, 0x1f, 0x8d, 0x7, 0xbf, 0x9a, + 0x9f, 0xa8, 0xb0, 0x1a, 0xf4, 0xfb, 0x11, 0x93, 0x77, 0x2b, 0x6f, 0x62, + 0x49, 0x74, 0x1e, 0xd5, 0x7f, 0x5, 0xab, 0x97, 0x99, 0xa3, 0xba, 0x1b, + 0xb8, 0x9e, 0x73, 0x71, 0x5b, 0x55, 0x82, 0x6f, 0x1f, 0x80, 0x4e, 0x5, + 0xc5, 0x8c, 0xc0, 0x7c, 0x52, 0x1a, 0x5e, 0x67, 0x77, 0x5d, 0x4f, 0x7c, + 0xb6, 0xa0, 0x85, 0x1e, 0xe, 0xfb, 0xfa, 0xf9, 0x37, 0xba, 0x1, 0x87, + 0xf8, 0xf2, 0x15, 0xce, 0x6, 0xbb, 0xad, 0x8b, 0x8f, 0xa0, 0x9f, 0x81, + 0x80, 0x9f, 0x1e, 0x7f, 0xa2, 0xa2, 0x7d, 0xa2, 0x1b, 0xa1, 0xdf, 0x91, + 0xf7, 0x1, 0x1f, 0x49, 0x6, 0x68, 0x87, 0x7c, 0x7f, 0x76, 0x1b, 0x78, + 0x7b, 0x92, 0x94, 0x7c, 0x1f, 0x98, 0x73, 0x74, 0x9c, 0x6a, 0x1b, 0x59, + 0x54, 0x66, 0x3d, 0x1f, 0xe, 0xf7, 0xc9, 0xf7, 0xdb, 0x76, 0xf7, 0xf5, + 0xc6, 0x1, 0xf7, 0x5b, 0xcd, 0xf7, 0x8b, 0xc8, 0xf7, 0xa1, 0xc8, 0x3, + 0xf7, 0x5b, 0xf7, 0xc6, 0x15, 0xcd, 0xf7, 0xf5, 0xf7, 0x2f, 0xc6, 0xfc, + 0xa, 0x50, 0xf7, 0x2d, 0x6, 0xf7, 0xcd, 0xfb, 0xf5, 0x15, 0xc8, 0xf7, + 0xf5, 0x8d, 0x6, 0xf4, 0xfb, 0xf5, 0x5, 0xc7, 0x6, 0xef, 0xf7, 0xf0, + 0x5, 0x8d, 0xfb, 0xf0, 0xc8, 0xf8, 0x30, 0x2b, 0x6, 0x2b, 0xfb, 0xe0, + 0x5, 0x89, 0x6, 0x28, 0xf7, 0xe0, 0x5, 0x29, 0x6, 0xe, 0x8b, 0xde, + 0xf8, 0xbc, 0xd4, 0x1, 0xf8, 0x32, 0xe6, 0x3, 0xa5, 0x16, 0xf8, 0x75, + 0xde, 0xfb, 0xfa, 0x6, 0x97, 0x9e, 0x97, 0xa3, 0xdb, 0xc9, 0x8, 0xf7, + 0x25, 0xf7, 0x4, 0xf6, 0xf5, 0xf1, 0x1a, 0xe1, 0x4c, 0xf7, 0x1, 0xfb, + 0x38, 0xfb, 0xe, 0x2b, 0x49, 0xfb, 0x1c, 0x7d, 0x1e, 0xe6, 0x81, 0x5, + 0xf7, 0x20, 0x8c, 0xf7, 0x11, 0x8a, 0x9a, 0x1b, 0xda, 0xc4, 0x5a, 0x44, + 0x37, 0xfb, 0x0, 0x2d, 0x3d, 0x4f, 0x1f, 0x38, 0x4a, 0xfb, 0xb, 0x2d, + 0xfb, 0x5, 0x1a, 0xe, 0xfb, 0xfa, 0xf7, 0xa0, 0xcd, 0xf7, 0xc7, 0xc9, + 0x1, 0xf7, 0x84, 0xdb, 0x3, 0x8f, 0xf7, 0xad, 0x15, 0xf7, 0xd3, 0xcd, + 0xfb, 0x5d, 0x6, 0x95, 0x96, 0x95, 0x95, 0xc5, 0xbb, 0x8, 0xd3, 0xc4, + 0xbb, 0xa8, 0xd3, 0x1a, 0xf7, 0x4, 0x2b, 0x9c, 0x54, 0xfb, 0x11, 0x77, + 0x38, 0x64, 0x81, 0x1e, 0xd5, 0x83, 0x5, 0xab, 0x95, 0x95, 0xaf, 0xc4, + 0x1b, 0xb6, 0xab, 0x70, 0x63, 0x65, 0x72, 0x78, 0x3d, 0x4b, 0x1f, 0x47, + 0x55, 0x50, 0x53, 0x85, 0x4d, 0x8, 0xe, 0x7c, 0xd7, 0x63, 0x76, 0xf8, + 0x9f, 0x77, 0x4e, 0xa, 0x13, 0x78, 0xf8, 0x2e, 0x16, 0xda, 0xf8, 0x9f, + 0x33, 0xfb, 0xb8, 0x6, 0x13, 0xb8, 0x33, 0x5b, 0x39, 0x30, 0x36, 0x76, + 0xd9, 0xe3, 0x1e, 0xf7, 0xbc, 0x33, 0xfb, 0xda, 0x7, 0xfb, 0x8, 0xca, + 0x2b, 0xf7, 0x17, 0xa4, 0xcc, 0x91, 0xe0, 0xc3, 0x1e, 0x8d, 0x6, 0xe, + 0x79, 0xa, 0xf8, 0xec, 0xf7, 0x1d, 0x34, 0xa, 0xfb, 0x4f, 0xf8, 0xa0, + 0x2f, 0xa, 0xe, 0x79, 0xa, 0xf9, 0x75, 0x77, 0x34, 0xa, 0xfb, 0xb2, + 0xf8, 0xa0, 0x2c, 0xa, 0xe, 0x79, 0xa, 0xf8, 0xf5, 0xef, 0x12, 0xcf, + 0xe3, 0x7e, 0xe5, 0xe6, 0xe5, 0x7e, 0xe3, 0x3c, 0xda, 0x13, 0x71, 0xf8, + 0x2e, 0x88, 0x15, 0xda, 0xf8, 0x9c, 0x6, 0x13, 0xb2, 0x33, 0xfb, 0xa8, + 0x6, 0x32, 0xa, 0x1e, 0x13, 0x69, 0x65, 0xa, 0x1f, 0xfb, 0x9f, 0xf8, + 0xa9, 0x31, 0xa, 0x13, 0xb4, 0xf7, 0x49, 0x72, 0xa, 0x79, 0xa, 0xf8, + 0xec, 0xf7, 0x1d, 0x3d, 0xa, 0x33, 0x6, 0x13, 0xb8, 0xfb, 0xa8, 0x7, + 0x32, 0xa, 0x65, 0xa, 0x1e, 0x13, 0xb4, 0xfb, 0x28, 0xf8, 0xa0, 0x5e, + 0xa, 0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8, 0xc0, 0xbd, 0x7, + 0xe, 0xfb, 0x53, 0x68, 0xa, 0xf7, 0x64, 0x16, 0xdd, 0x6, 0xf7, 0x5e, + 0xf8, 0x9f, 0x5, 0x31, 0x6, 0xfb, 0x2d, 0xfc, 0x38, 0xfb, 0x28, 0xf8, + 0x38, 0x5, 0x2e, 0x6, 0xe, 0xaa, 0x68, 0xa, 0xf7, 0x41, 0x16, 0xe7, + 0x6, 0xe9, 0xf8, 0x28, 0x5, 0x8d, 0x6, 0xf1, 0xfc, 0x28, 0x5, 0xe6, + 0x6, 0xf7, 0x2f, 0xf8, 0x9f, 0x5, 0x35, 0x6, 0xfb, 0x2, 0xfc, 0x28, + 0x5, 0x89, 0x6, 0x25, 0xf8, 0x28, 0x5, 0x31, 0x6, 0x26, 0xfc, 0x33, + 0xfb, 0x5, 0xf8, 0x33, 0x5, 0x30, 0x6, 0xe, 0xfb, 0x53, 0x68, 0xa, + 0x96, 0x16, 0xf4, 0x6, 0xf7, 0x1b, 0xf7, 0x60, 0xf7, 0x18, 0xfb, 0x60, + 0x5, 0xf6, 0x6, 0xfb, 0x52, 0xf7, 0xa6, 0xf7, 0x44, 0xf7, 0x8d, 0x5, + 0x23, 0x6, 0xfb, 0x10, 0xfb, 0x4d, 0xfb, 0x7, 0xf7, 0x4d, 0x5, 0x20, + 0x6, 0xf7, 0x3f, 0xfb, 0x92, 0x5, 0xe, 0xfb, 0x53, 0xfb, 0x6a, 0xdd, + 0xf9, 0x23, 0x77, 0x1, 0xba, 0xfb, 0x10, 0x15, 0x94, 0x3b, 0x55, 0xa, + 0xa4, 0xf7, 0x0, 0xf2, 0xbe, 0x1f, 0xf7, 0x5d, 0xf8, 0xa2, 0x5, 0x32, + 0x6, 0xfb, 0x28, 0xfc, 0x37, 0x5, 0x89, 0x6, 0xfb, 0x24, 0xf8, 0x37, + 0x5, 0x2c, 0x6, 0xf7, 0x58, 0xfc, 0x9a, 0x5, 0x43, 0x71, 0x81, 0x4a, + 0x41, 0x1b, 0x76, 0x7b, 0x8f, 0x8f, 0x7e, 0x1f, 0xe, 0xfb, 0x53, 0xfb, + 0x6a, 0xda, 0xf9, 0x70, 0xf7, 0x1d, 0x1, 0x33, 0xa, 0xf7, 0x27, 0xf9, + 0x62, 0x2f, 0xa, 0xe, 0xfb, 0x53, 0xfb, 0x6a, 0xda, 0xf9, 0x79, 0xef, + 0x1, 0x96, 0xea, 0x94, 0xe5, 0xe6, 0xe5, 0x3, 0x33, 0xa, 0xce, 0xf9, + 0x6b, 0x2e, 0xa, 0xe, 0xa0, 0x76, 0xf7, 0x39, 0xcf, 0xe3, 0xcf, 0xf7, + 0xbf, 0x77, 0x1, 0xf7, 0x7f, 0xe3, 0x3, 0xab, 0xf7, 0x39, 0x15, 0xf7, + 0x5f, 0xfb, 0x39, 0xe3, 0xf7, 0x39, 0xf7, 0x5d, 0xcf, 0xfb, 0x5d, 0xe3, + 0xf7, 0x5d, 0xcf, 0xfb, 0x2f, 0x6, 0xf7, 0x4c, 0xf7, 0xbf, 0x5, 0x23, + 0x6, 0xfb, 0x40, 0xfb, 0xbf, 0xfb, 0x44, 0xf7, 0xbf, 0x5, 0x29, 0x6, + 0xf7, 0x4d, 0xfb, 0xbf, 0x5, 0xfb, 0x30, 0x47, 0xf7, 0x5f, 0x33, 0xfb, + 0x5f, 0x6, 0xe, 0xfb, 0x53, 0x8b, 0xd7, 0xf8, 0xb, 0xd3, 0x63, 0xa, + 0xf8, 0x1a, 0x67, 0xa, 0xfc, 0x10, 0x5, 0xe, 0xfb, 0x53, 0x8b, 0xd7, + 0xf8, 0x6, 0xd3, 0xf7, 0x6c, 0x77, 0x63, 0xa, 0xf8, 0x15, 0x67, 0xa, + 0xfc, 0xb, 0x5, 0xf7, 0x43, 0xf8, 0xa2, 0x37, 0xa, 0x78, 0xd2, 0xf8, + 0xd8, 0xd2, 0x1, 0xbe, 0xe8, 0xf7, 0xa6, 0xe8, 0x3, 0xb1, 0xf7, 0xec, + 0x15, 0x37, 0x92, 0xfb, 0xab, 0xf7, 0x7e, 0xf7, 0x7d, 0x91, 0xf7, 0xb3, + 0xd7, 0xd9, 0x88, 0xf7, 0xad, 0xfb, 0x81, 0xfb, 0x71, 0x78, 0xfb, 0xaf, + 0x3f, 0x1e, 0xe7, 0x16, 0xf7, 0x21, 0xa1, 0xf7, 0x27, 0xf7, 0x12, 0xf7, + 0x1c, 0x96, 0xfb, 0x38, 0xfb, 0x10, 0xfb, 0xd, 0x7e, 0xfb, 0x3f, 0xfb, + 0x19, 0xfb, 0x1c, 0x7e, 0xf7, 0x42, 0xf7, 0xa, 0x1e, 0xe, 0x76, 0xa0, + 0xf8, 0x9f, 0x9a, 0xf7, 0x48, 0x9e, 0x6, 0xfb, 0x70, 0x98, 0x7, 0x1e, + 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xd2, 0xa, 0xe2, 0xb, 0xf8, 0xc0, + 0x14, 0xf9, 0x47, 0x15, 0xab, 0x13, 0x0, 0x5b, 0x2, 0x0, 0x1, 0x0, + 0x7, 0x0, 0x68, 0x0, 0x6d, 0x0, 0xbc, 0x0, 0xf0, 0x1, 0x1e, 0x1, + 0x23, 0x1, 0x4c, 0x1, 0x72, 0x1, 0xac, 0x1, 0xd9, 0x1, 0xdf, 0x1, + 0xee, 0x2, 0xb, 0x2, 0x13, 0x2, 0x1c, 0x2, 0x34, 0x2, 0x3a, 0x2, + 0x50, 0x2, 0x84, 0x2, 0x96, 0x2, 0x9f, 0x2, 0xa4, 0x2, 0xb4, 0x2, + 0xb9, 0x2, 0xc0, 0x2, 0xc7, 0x2, 0xee, 0x3, 0xf, 0x3, 0x1d, 0x3, + 0x24, 0x3, 0x2b, 0x3, 0x33, 0x3, 0x3c, 0x3, 0x41, 0x3, 0x4b, 0x3, + 0x54, 0x3, 0x5c, 0x3, 0x62, 0x3, 0x78, 0x3, 0x8e, 0x3, 0x97, 0x3, + 0xa0, 0x3, 0xa5, 0x3, 0xa9, 0x3, 0xbd, 0x3, 0xc4, 0x3, 0xcb, 0x3, + 0xd3, 0x3, 0xdc, 0x3, 0xe4, 0x3, 0xf5, 0x3, 0xff, 0x4, 0x9, 0x4, + 0x13, 0x4, 0x23, 0x4, 0x29, 0x4, 0x2c, 0x4, 0x30, 0x4, 0x3e, 0x4, + 0x4c, 0x4, 0x59, 0x4, 0x5e, 0x4, 0x62, 0x4, 0x6c, 0x4, 0x76, 0x4, + 0x80, 0x4, 0x8c, 0x4, 0x98, 0x4, 0x9e, 0x4, 0xa9, 0x4, 0xb4, 0x4, + 0xbb, 0x4, 0xc5, 0x4, 0xcf, 0x4, 0xd9, 0x4, 0xe3, 0x4, 0xe7, 0x4, + 0xeb, 0x4, 0xf4, 0x4, 0xfd, 0x5, 0x6, 0x5, 0xa, 0x5, 0x11, 0x5, + 0x15, 0x5, 0x1b, 0x5, 0x21, 0x5, 0x27, 0x5, 0x2d, 0x5, 0x32, 0x5, + 0x35, 0x22, 0xa, 0x13, 0xbc, 0x28, 0xa, 0x15, 0x2b, 0xa9, 0x2e, 0xc6, + 0x44, 0x1e, 0x46, 0xc6, 0xd7, 0x5c, 0xf7, 0x7, 0x1b, 0xf7, 0x4f, 0xf7, + 0x2b, 0xf7, 0x1a, 0xf7, 0x86, 0x8e, 0x1f, 0xf6, 0x64, 0xf1, 0x52, 0xcf, + 0x1e, 0xd0, 0x53, 0x32, 0xb2, 0x27, 0x1b, 0x2c, 0x32, 0x6a, 0x4a, 0x52, + 0x1f, 0x53, 0x4a, 0x61, 0x24, 0xfb, 0xb, 0x1a, 0xef, 0x16, 0xc0, 0x9c, + 0xdd, 0xb3, 0xc7, 0x1e, 0xc8, 0xb3, 0xbe, 0xb7, 0xe6, 0x1b, 0xca, 0xcb, + 0x73, 0x58, 0xb3, 0x1f, 0xb4, 0x58, 0xac, 0x3a, 0x2e, 0x1a, 0x85, 0xfb, + 0x61, 0x2b, 0x35, 0xfb, 0x1f, 0x8a, 0x8, 0x40, 0x58, 0xa9, 0xbe, 0x5f, + 0x1f, 0x5f, 0xbf, 0x72, 0xd3, 0xe2, 0x1a, 0xb, 0x24, 0xa, 0x25, 0xa, + 0xb, 0x15, 0x47, 0x9c, 0x45, 0xb2, 0x57, 0x1e, 0x57, 0xb2, 0xbb, 0x67, + 0xde, 0x1b, 0xf7, 0x24, 0xeb, 0xec, 0xf7, 0x49, 0xee, 0x68, 0xcd, 0x5a, + 0xb3, 0x1f, 0xb4, 0x5a, 0x57, 0x9c, 0x54, 0x1b, 0x3c, 0x5b, 0x6d, 0x5b, + 0x63, 0x1f, 0x64, 0x5b, 0x77, 0x4a, 0x43, 0x1a, 0xe5, 0x16, 0xf7, 0x27, + 0x90, 0xd2, 0xb7, 0xc7, 0x1b, 0xd2, 0xd7, 0x56, 0xfb, 0x1e, 0x8e, 0x1f, + 0x62, 0x82, 0x57, 0x73, 0x62, 0x1e, 0x62, 0x73, 0x6d, 0x6c, 0x4c, 0x1b, + 0x51, 0x43, 0xc2, 0xf7, 0x2b, 0x85, 0x1f, 0xb, 0x15, 0x90, 0xa0, 0x91, + 0xa4, 0x9e, 0x9e, 0x8, 0x9f, 0x9e, 0xa0, 0x99, 0xc2, 0x1b, 0xcb, 0xa1, + 0x78, 0x72, 0x9b, 0x1f, 0x9b, 0x73, 0x8a, 0x6a, 0x8a, 0x6f, 0x54, 0x77, + 0x40, 0x85, 0x79, 0x87, 0x8, 0x60, 0x85, 0xfb, 0x2d, 0x78, 0xfb, 0x1d, + 0x1a, 0x33, 0xd9, 0x4b, 0xe8, 0xc3, 0xbb, 0x9b, 0xca, 0xd6, 0x1e, 0xb, + 0x8e, 0x7e, 0x99, 0x73, 0x9a, 0x70, 0x8, 0xe7, 0x6, 0x6e, 0xbd, 0x7e, + 0xad, 0xf7, 0x19, 0x1a, 0xf7, 0xa, 0x7, 0x90, 0xe5, 0x6e, 0xf3, 0xfb, + 0x48, 0x8c, 0x8, 0x2b, 0x60, 0x6f, 0x68, 0x6a, 0x1f, 0x6e, 0x68, 0x87, + 0x64, 0x85, 0x74, 0x8, 0xf7, 0xdb, 0xfb, 0x22, 0x15, 0xb, 0xfc, 0xd0, + 0x21, 0xa, 0xe, 0x99, 0x16, 0xeb, 0x6, 0xd7, 0xf7, 0x77, 0x5, 0xf7, + 0xb2, 0x6, 0xdb, 0xfb, 0x77, 0x5, 0xf1, 0x6, 0xfb, 0xab, 0xf9, 0x7c, + 0x5, 0x2a, 0x6, 0x49, 0xfc, 0x4b, 0x15, 0xf7, 0x4, 0xf7, 0xfd, 0x5, + 0x8c, 0x6, 0xf7, 0xb, 0xfb, 0xfd, 0x5, 0xb, 0x27, 0x85, 0x45, 0x4c, + 0x2a, 0x1b, 0x78, 0x7a, 0x92, 0x9a, 0x7a, 0x1f, 0x7b, 0x9b, 0x84, 0x9c, + 0x9e, 0x1a, 0xae, 0x99, 0x9f, 0xa0, 0x97, 0x1e, 0xa0, 0x97, 0x9d, 0x90, + 0xa6, 0x8f, 0xbd, 0x94, 0xc7, 0x94, 0xb1, 0x9a, 0x8, 0xe, 0x15, 0xf8, + 0x2, 0x6, 0xf7, 0x1c, 0x66, 0xd8, 0x55, 0xb0, 0x1e, 0xb1, 0x55, 0x53, + 0x90, 0x74, 0x1b, 0xfb, 0x38, 0x8a, 0x4c, 0xfb, 0x8, 0x86, 0xfb, 0x32, + 0x8, 0x2d, 0xa, 0x7a, 0x7e, 0x3a, 0x22, 0x1b, 0x38, 0x5d, 0xc3, 0xf7, + 0x10, 0x7e, 0x1f, 0x90, 0xd3, 0x15, 0x96, 0xce, 0xa2, 0xde, 0xf2, 0x8a, + 0xec, 0x8c, 0xab, 0x40, 0x90, 0x40, 0x8, 0xb, 0x41, 0xa, 0xf9, 0x5d, + 0x15, 0xfc, 0x2f, 0x7, 0xfb, 0x13, 0x8f, 0xfb, 0x56, 0xf7, 0xa3, 0xf7, + 0xac, 0x95, 0xf7, 0x76, 0xea, 0x1e, 0xf8, 0x2f, 0x2c, 0xfc, 0x2f, 0x7, + 0xfb, 0x15, 0x78, 0x20, 0xfb, 0x44, 0xfb, 0x48, 0x8b, 0xf7, 0x29, 0xe2, + 0x1e, 0xf8, 0x2f, 0x7, 0xb, 0xaa, 0x78, 0xe0, 0x2a, 0xa, 0xb, 0x15, + 0xef, 0x6, 0xc3, 0xde, 0xc0, 0x38, 0x5, 0xef, 0x6, 0xfb, 0x2, 0x42, + 0xa, 0xb, 0x3b, 0x9f, 0x48, 0xb3, 0x5b, 0x1e, 0x5b, 0xb4, 0xbe, 0x70, + 0xdb, 0x1b, 0xcb, 0xb5, 0x9d, 0xaa, 0xb0, 0x1f, 0xb2, 0xaa, 0xa4, 0xb5, + 0x98, 0xbc, 0x36, 0x96, 0x18, 0x6e, 0xb, 0x31, 0xa, 0xf7, 0x49, 0x27, + 0x31, 0xa, 0xb, 0x4c, 0xa, 0xf7, 0x0, 0xf7, 0x1d, 0x38, 0xa, 0xb, + 0x3, 0xe1, 0x16, 0xf8, 0xa6, 0xe0, 0xfc, 0x47, 0xf7, 0x90, 0xf8, 0x13, + 0xe0, 0xfc, 0x13, 0xf7, 0x79, 0xf8, 0x38, 0xe0, 0xfc, 0x97, 0x6, 0xb, + 0x15, 0xe5, 0xef, 0x31, 0x6, 0xb, 0x33, 0x6d, 0x2f, 0x20, 0x24, 0x86, + 0xdd, 0xe3, 0x1e, 0xf7, 0xb2, 0x33, 0xfb, 0xd4, 0x7, 0xfb, 0x8, 0xcc, + 0x2b, 0xf7, 0x17, 0xb, 0xbb, 0xfb, 0xd, 0x15, 0x94, 0x38, 0x55, 0xa, + 0xa5, 0xec, 0xf2, 0xbe, 0x1f, 0xf7, 0x5b, 0xf8, 0xa2, 0x5, 0x32, 0x6, + 0xfb, 0x27, 0xfc, 0x37, 0x5, 0x89, 0x6, 0xfb, 0x25, 0xf8, 0x37, 0x5, + 0x2c, 0x6, 0xf7, 0x59, 0xfc, 0x9a, 0x5, 0x43, 0x71, 0x80, 0x52, 0x41, + 0x1b, 0x76, 0x7c, 0x95, 0x8f, 0x7e, 0x1f, 0xb, 0x3d, 0xa, 0x6, 0x13, + 0xb8, 0x33, 0xfb, 0xa8, 0x6, 0x32, 0xa, 0x1e, 0x13, 0x74, 0x65, 0xa, + 0x1f, 0xb, 0x46, 0xa, 0xf9, 0x4, 0x77, 0x1, 0x27, 0xa, 0xb, 0x6e, + 0xa, 0x30, 0xa, 0xb, 0x15, 0xe8, 0x6, 0xf5, 0x5a, 0xa, 0x27, 0x6, + 0x53, 0x38, 0x56, 0xde, 0x5, 0x27, 0x6, 0xe, 0x5, 0xfb, 0x7, 0x6, + 0xb, 0xa0, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xb, 0xf7, 0x10, 0xf8, 0xe9, + 0x2c, 0xa, 0xb, 0xe3, 0x3, 0xe4, 0x16, 0xe3, 0xf8, 0x56, 0xf0, 0xcf, + 0x26, 0xc0, 0x6, 0xc7, 0xb4, 0xa5, 0xe0, 0x7c, 0x1e, 0x99, 0xd5, 0x5, + 0x94, 0x6f, 0x74, 0x8d, 0x74, 0x1b, 0xfb, 0x3, 0x60, 0x2a, 0x4e, 0x1f, + 0x58, 0x40, 0x47, 0xd6, 0x7, 0xb, 0xb2, 0x86, 0xf7, 0x20, 0xfb, 0x1f, + 0xfb, 0x1a, 0x83, 0xfb, 0x19, 0x5d, 0x1e, 0xd4, 0x16, 0xb1, 0x8a, 0xde, + 0xd1, 0xc4, 0x98, 0x52, 0x4b, 0x5d, 0x84, 0x40, 0x4c, 0x47, 0x8a, 0xd7, + 0xb8, 0x1e, 0xb, 0x4e, 0xa, 0x3c, 0xda, 0x13, 0x74, 0xf8, 0x2e, 0x88, + 0x15, 0xda, 0xf8, 0x9c, 0xb, 0xf7, 0x23, 0xf8, 0xf2, 0x2e, 0xa, 0xb, + 0xf7, 0x73, 0xf8, 0xe9, 0x2f, 0xa, 0xb, 0x7d, 0xda, 0x5f, 0x76, 0xf8, + 0x5e, 0xd3, 0xb, 0x1, 0xda, 0xea, 0xf8, 0xb, 0xea, 0x3, 0xda, 0xb, + 0x5a, 0xa, 0x2e, 0x6, 0xb, 0x73, 0x8b, 0xe0, 0xf7, 0x90, 0xe0, 0xf7, + 0x79, 0xe0, 0xb, 0x39, 0xa, 0xce, 0xe3, 0x3, 0xce, 0x16, 0xe3, 0xb, + 0x1, 0xbc, 0xef, 0xf8, 0x74, 0xef, 0x3, 0xb, 0x5f, 0xa, 0xf7, 0x77, + 0xd9, 0xb, 0x15, 0xe9, 0xf7, 0x6, 0x5d, 0x6, 0x8c, 0xa7, 0x8d, 0xc5, + 0xbe, 0xa0, 0x75, 0xad, 0x18, 0x3b, 0x67, 0x8b, 0x3d, 0x5a, 0x1a, 0xb, + 0x15, 0xb9, 0x6, 0x8a, 0x6f, 0x89, 0x50, 0x58, 0x76, 0xa1, 0x69, 0x18, + 0xdb, 0xaf, 0x8b, 0xda, 0xbc, 0x1a, 0xe6, 0x2d, 0x7, 0xb, 0x12, 0xba, + 0xe9, 0xf7, 0x8d, 0xe3, 0x13, 0x7c, 0xb, 0x7c, 0xd3, 0xf7, 0x48, 0xd3, + 0xf7, 0x29, 0xd3, 0xb, 0xfc, 0x31, 0xa0, 0x76, 0xb, 0x15, 0xd3, 0x6, + 0xb, 0xdb, 0xaf, 0x8b, 0xd9, 0xbc, 0x1a, 0xe7, 0x2d, 0xfb, 0x6, 0xb9, + 0x7, 0x8a, 0x6f, 0x89, 0x51, 0x58, 0x76, 0x8, 0xb, 0x12, 0xcf, 0xe3, + 0xf7, 0x89, 0xe3, 0xb, 0xe2, 0x78, 0xdf, 0xf8, 0xe4, 0xe0, 0xb, 0xfd, + 0x72, 0x15, 0xe3, 0xf8, 0x99, 0x7a, 0xa, 0xfe, 0x35, 0x15, 0xea, 0xf9, + 0x60, 0x2c, 0x6, 0xe, 0xf7, 0x2b, 0x76, 0xf8, 0x29, 0x77, 0x1, 0xb, + 0x9e, 0x1b, 0xa0, 0xd2, 0x91, 0xf5, 0x8f, 0x1f, 0x4b, 0x6, 0x69, 0x87, + 0x80, 0x83, 0x77, 0x1b, 0xb, 0xfb, 0xfa, 0xf8, 0xfa, 0x76, 0xf7, 0x21, + 0x77, 0x1, 0xb, 0x5, 0x87, 0x99, 0x8d, 0x85, 0xa4, 0x1b, 0xf7, 0x7, + 0xb, 0x1f, 0x4b, 0x6, 0x68, 0x87, 0x80, 0x84, 0x77, 0x1b, 0xb, 0xf7, + 0xad, 0x16, 0xea, 0xf7, 0xc3, 0x6, 0xf7, 0xa9, 0xf8, 0x2e, 0x5, 0xfb, + 0x2, 0x6, 0xb, 0x31, 0xa, 0xf7, 0x37, 0x72, 0xa, 0x38, 0xa, 0xe, + 0xf7, 0x1d, 0x5, 0xb, 0xfb, 0x53, 0xa0, 0x76, 0xf8, 0x56, 0xcf, 0xf7, + 0x10, 0xd5, 0x1, 0xe4, 0xe3, 0xb, 0x15, 0xb7, 0x6, 0x9c, 0xf7, 0x1e, + 0x5, 0xf7, 0x9, 0x3e, 0xfb, 0x9, 0x7, 0xb, 0x69, 0x8a, 0xfb, 0x25, + 0xf7, 0x23, 0xf7, 0x23, 0x8c, 0xf7, 0x1a, 0xb8, 0xb, 0x4c, 0xa, 0x4a, + 0x74, 0xa, 0x73, 0xa0, 0x76, 0xb, 0x15, 0xc9, 0x6, 0xf7, 0x2b, 0xf7, + 0x21, 0x38, 0xa, 0xb, 0x4b, 0xa, 0xfa, 0x35, 0x77, 0x1, 0xe5, 0xea, + 0x3, 0xb, 0x4b, 0xa, 0xf9, 0x72, 0x77, 0x1, 0xea, 0xe3, 0x3, 0xb, + 0x1, 0xaa, 0x16, 0xf8, 0x4a, 0xd7, 0xfb, 0xde, 0x6, 0xf7, 0xce, 0xb, + 0x15, 0x5a, 0xb1, 0x63, 0xbc, 0xbc, 0xb3, 0xb3, 0xbc, 0xbc, 0x63, 0xb, + 0xa6, 0xc7, 0x8e, 0xe0, 0xc6, 0xb, 0xfb, 0x4e, 0x76, 0xf7, 0x5e, 0xd3, + 0xf8, 0x26, 0xd0, 0x1, 0xb, 0x5, 0xc4, 0xfc, 0x28, 0x43, 0xf7, 0xb7, + 0x7, 0xfb, 0xc9, 0xb, 0xa0, 0x76, 0xf8, 0x9f, 0x77, 0x1, 0xb, 0xfc, + 0x31, 0xfb, 0x58, 0xd4, 0xf9, 0x98, 0xd4, 0x12, 0xb, 0x1, 0xa2, 0x16, + 0xf8, 0xc9, 0xe0, 0xfc, 0x5c, 0x6, 0xb, 0x15, 0xcc, 0x6, 0xba, 0x8a, + 0xad, 0x8b, 0x8f, 0x1b, 0xb, 0x3c, 0x96, 0x1e, 0xe1, 0x97, 0x5, 0xb3, + 0x84, 0x7a, 0xb, 0xe3, 0xec, 0x7a, 0xa, 0x1, 0xe1, 0xea, 0xb, 0xa0, + 0x76, 0xf8, 0x62, 0xd7, 0x12, 0xcc, 0xe3, 0xb, 0xfb, 0xfa, 0xfb, 0x4e, + 0x76, 0xfa, 0x40, 0x77, 0xb, 0x20, 0xab, 0x76, 0xf8, 0x78, 0x77, 0x1, + 0xbb, 0xb, 0x27, 0x31, 0xa, 0xe, 0x5a, 0x58, 0x68, 0x3e, 0x8c, 0x1f, + 0xe, 0xf7, 0x1d, 0x59, 0xa, 0xf7, 0x5, 0x8a, 0x77, 0x12, 0xb, 0x7d, + 0xd3, 0xf8, 0x2a, 0xd3, 0xb, 0xb8, 0xe5, 0xf7, 0xb2, 0xe5, 0xb, 0xf7, + 0x54, 0xd9, 0xfb, 0x54, 0xb, 0x7c, 0xd7, 0x60, 0x76, 0xb, 0x33, 0x6, + 0xe}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansBold.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansBold.cpp new file mode 100644 index 000000000000..10a63a53c6da --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansBold.cpp @@ -0,0 +1,1371 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitSansBoldFontData[16344] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x12, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x53, 0x61, 0x6e, 0x73, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f, + 0x6c, 0x64, 0x0, 0x1, 0x1, 0x1, 0x24, 0xf8, 0x10, 0x0, 0xf8, 0x1c, + 0x1, 0xf8, 0x1d, 0x2, 0xf8, 0x1e, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0x3e, + 0xfb, 0x78, 0xfa, 0x7e, 0xfa, 0x56, 0x5, 0xf7, 0x2f, 0xf, 0xf8, 0x8f, + 0x11, 0xb5, 0x1c, 0x39, 0x77, 0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f, + 0x42, 0x50, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x4f, + 0x54, 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x43, 0x68, 0x72, 0x6F, 0x6D, + 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0, 0x1, + 0x0, 0x1, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84, 0x0, 0x0, 0x86, 0x2, + 0x0, 0x91, 0x0, 0x0, 0x63, 0x0, 0x0, 0x6d, 0x1, 0x0, 0x8c, 0x0, + 0x0, 0x92, 0x0, 0x0, 0xc7, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x2, 0x5, + 0x0, 0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, 0x1d, + 0x1, 0x87, 0x0, 0x0, 0x75, 0x0, 0x0, 0x65, 0x0, 0x0, 0x76, 0x0, + 0x0, 0x79, 0x0, 0x0, 0x70, 0x1, 0x0, 0x7e, 0x0, 0x0, 0x7a, 0x0, + 0x0, 0xc0, 0x0, 0x0, 0x6b, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x41, 0x0, + 0x0, 0x8, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x74, 0x0, + 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x99, 0x0, + 0x0, 0xdd, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc6, 0x0, + 0x0, 0x60, 0x2, 0x0, 0x67, 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, + 0x0, 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, 0x0, + 0x0, 0x6a, 0x0, 0x0, 0x97, 0x0, 0x0, 0xa6, 0x0, 0x0, 0xa5, 0x0, + 0x0, 0x80, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0, + 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98, 0x0, 0x0, 0x73, 0x0, + 0x0, 0x72, 0x0, 0x0, 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0, + 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b, 0x0, 0x0, 0xa3, 0x0, + 0x0, 0x7b, 0x0, 0x0, 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0, + 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a, 0x0, 0x0, 0xb1, 0x0, + 0x0, 0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2, + 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe, 0x0, 0x0, 0xbb, 0x1, + 0x0, 0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0, + 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5, 0x0, 0x0, 0x9d, 0x0, + 0x0, 0x95, 0x0, 0x0, 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0, + 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90, 0x0, 0x0, 0xce, 0x0, + 0x0, 0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2, + 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8, 0x1, + 0x0, 0xdc, 0x0, 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0, + 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2, 0x0, + 0x0, 0xe3, 0x0, 0x0, 0xe6, 0x2, 0x0, 0x1, 0x0, 0x4, 0x0, 0x7, + 0x0, 0x2c, 0x0, 0x41, 0x0, 0x75, 0x0, 0x84, 0x0, 0xb3, 0x0, 0xce, + 0x0, 0xd9, 0x0, 0xf1, 0x1, 0x30, 0x1, 0x6b, 0x1, 0x9a, 0x1, 0xc3, + 0x1, 0xf1, 0x2, 0x32, 0x2, 0x5e, 0x2, 0x8a, 0x2, 0xed, 0x3, 0x76, + 0x4, 0x7, 0x4, 0xa5, 0x4, 0xc4, 0x4, 0xfb, 0x5, 0x33, 0x5, 0x66, + 0x5, 0x8c, 0x5, 0xbb, 0x5, 0xcc, 0x5, 0xdf, 0x5, 0xf5, 0x6, 0x3f, + 0x6, 0x69, 0x6, 0xbc, 0x7, 0x1e, 0x7, 0x55, 0x7, 0xa7, 0x8, 0xa, + 0x8, 0x3e, 0x8, 0xaf, 0x9, 0x14, 0x9, 0x34, 0x9, 0x6d, 0x9, 0x8c, + 0x9, 0xab, 0x9, 0xc9, 0xa, 0x2e, 0xa, 0xda, 0xb, 0xd, 0xb, 0x6c, + 0xb, 0xbc, 0xb, 0xfb, 0xc, 0x24, 0xc, 0x48, 0xc, 0xc3, 0xc, 0xef, + 0xd, 0x2, 0xd, 0x33, 0xd, 0x64, 0xd, 0x78, 0xd, 0xb8, 0xd, 0xdb, + 0xe, 0x52, 0xe, 0x88, 0xf, 0x1a, 0xf, 0x73, 0xf, 0xdc, 0xf, 0xfb, + 0x10, 0x32, 0x10, 0x50, 0x10, 0x93, 0x10, 0xc5, 0x10, 0xdf, 0x10, 0xf9, + 0x11, 0x13, 0x11, 0x2a, 0x11, 0x44, 0x11, 0x65, 0x11, 0x72, 0x11, 0x88, + 0x11, 0xed, 0x12, 0x48, 0x12, 0x92, 0x12, 0xed, 0x13, 0x43, 0x13, 0x79, + 0x13, 0xe7, 0x14, 0x23, 0x14, 0x3c, 0x14, 0x80, 0x14, 0xaf, 0x14, 0xba, + 0x15, 0x19, 0x15, 0x58, 0x15, 0xa2, 0x15, 0xef, 0x16, 0x43, 0x16, 0x82, + 0x16, 0xe4, 0x17, 0x1e, 0x17, 0x60, 0x17, 0x85, 0x17, 0xc1, 0x17, 0xf3, + 0x18, 0x22, 0x18, 0x48, 0x18, 0x8c, 0x18, 0xa4, 0x18, 0xea, 0x19, 0x2c, + 0x19, 0xa7, 0x19, 0xcf, 0x1a, 0x33, 0x1a, 0x70, 0x1a, 0xa3, 0x1a, 0xcd, + 0x1b, 0x5, 0x1b, 0x19, 0x1b, 0xcf, 0x1c, 0x49, 0x1c, 0x5f, 0x1c, 0xda, + 0x1d, 0x5, 0x1d, 0x2e, 0x1d, 0x7f, 0x1d, 0xb8, 0x1d, 0xdb, 0x1d, 0xea, + 0x1d, 0xfa, 0x1e, 0x3e, 0x1e, 0x8c, 0x1f, 0x4, 0x1f, 0x19, 0x1f, 0xaf, + 0x1f, 0xda, 0x20, 0xa, 0x20, 0x88, 0x21, 0x14, 0x21, 0x8e, 0x21, 0xd3, + 0x21, 0xf2, 0x22, 0x9b, 0x22, 0xab, 0x23, 0x1b, 0x23, 0x95, 0x23, 0xa3, + 0x23, 0xbd, 0x23, 0xcf, 0x24, 0x4d, 0x24, 0x60, 0x24, 0x99, 0x24, 0xc7, + 0x25, 0x9, 0x25, 0x61, 0x25, 0x74, 0x25, 0xba, 0x25, 0xec, 0x26, 0x4, + 0x26, 0x3b, 0x26, 0x61, 0x26, 0xa4, 0x26, 0xb1, 0x27, 0x19, 0x27, 0x96, + 0x28, 0x2f, 0x28, 0x85, 0x28, 0x9d, 0x28, 0xb6, 0x28, 0xd5, 0x29, 0x1b, + 0x29, 0x3d, 0x29, 0x71, 0x29, 0xb8, 0x2a, 0x49, 0x2a, 0x59, 0x2a, 0x6a, + 0x2a, 0x91, 0x2a, 0xb8, 0x2a, 0xcd, 0x2a, 0xe1, 0x2a, 0xfc, 0x2b, 0x15, + 0x2b, 0x63, 0x2b, 0xbb, 0x2b, 0xe9, 0x2c, 0xd, 0x2c, 0x3a, 0x2c, 0x87, + 0x2c, 0xaf, 0x2c, 0xdf, 0x2d, 0x5f, 0x2d, 0x7c, 0x2d, 0x98, 0x2d, 0xbf, + 0x2d, 0xea, 0x2e, 0x1a, 0x2e, 0x5d, 0x2e, 0xcc, 0x2e, 0xe3, 0x2e, 0xfa, + 0x2f, 0x1b, 0x2f, 0x77, 0x2f, 0x9f, 0x2f, 0xe5, 0x30, 0x8f, 0x31, 0x1c, + 0x31, 0x36, 0x31, 0x51, 0x31, 0x73, 0x31, 0x97, 0x31, 0xae, 0x31, 0xc5, + 0x31, 0xe4, 0x32, 0x3, 0x32, 0x7c, 0x32, 0xf4, 0x33, 0x11, 0x33, 0x24, + 0x33, 0x42, 0x33, 0x80, 0x33, 0xa8, 0x33, 0xd7, 0x34, 0x55, 0x34, 0x6b, + 0x34, 0x81, 0x34, 0xa8, 0x34, 0xd6, 0x35, 0x13, 0x35, 0x67, 0x35, 0xac, + 0xfc, 0x15, 0xe, 0xfc, 0x15, 0xe, 0xf8, 0xf0, 0xcb, 0xdd, 0x77, 0x1, + 0x89, 0xf9, 0x82, 0x15, 0x22, 0x95, 0xd9, 0x62, 0xdb, 0x1b, 0xda, 0xdb, + 0xb3, 0xf5, 0x95, 0x1f, 0x4b, 0x6, 0x78, 0x8a, 0x7b, 0x4c, 0x33, 0x1b, + 0x4a, 0x6a, 0xb2, 0xb6, 0x85, 0x1f, 0xe, 0xf8, 0xfa, 0xf7, 0x7, 0x1, + 0xf3, 0xf7, 0x12, 0x3, 0xf3, 0xf8, 0xfa, 0x15, 0xf7, 0x12, 0xf7, 0x7, + 0xfb, 0x12, 0x6, 0xe, 0xf8, 0xcc, 0xc4, 0xe9, 0xc4, 0x1, 0xc6, 0xc6, + 0xed, 0xc6, 0x3, 0xc6, 0xf9, 0x35, 0x15, 0x51, 0xbc, 0x5c, 0xc7, 0xc4, + 0xbd, 0xb8, 0xc7, 0xc6, 0x5a, 0xb7, 0x51, 0x4d, 0x5c, 0x5e, 0x51, 0x1e, + 0xc6, 0x16, 0xa5, 0xa0, 0x9f, 0xa8, 0xa5, 0xa1, 0x78, 0x70, 0x70, 0x75, + 0x76, 0x71, 0x6f, 0x75, 0xa0, 0xa6, 0x1e, 0xe, 0xf8, 0xf0, 0x84, 0xa, + 0x94, 0xf8, 0xf0, 0x6b, 0xa, 0xef, 0xfb, 0x26, 0x6b, 0xa, 0xe, 0xfb, + 0x78, 0xd8, 0xf7, 0x2b, 0x77, 0x1, 0xd2, 0xe2, 0x3, 0xe5, 0x16, 0x80, + 0x61, 0x83, 0x6a, 0x67, 0x1a, 0x35, 0xdd, 0x6c, 0xcc, 0x9c, 0xa5, 0x8e, + 0x9c, 0xb6, 0x1e, 0xd0, 0x7, 0x87, 0x80, 0x61, 0x83, 0x6a, 0x1b, 0x53, + 0x87, 0xac, 0xb8, 0xa3, 0x8e, 0xa7, 0x93, 0xa0, 0x1f, 0xe, 0xf8, 0xf0, + 0xd1, 0x1, 0xed, 0xf8, 0xf0, 0x15, 0xf7, 0x1b, 0x6, 0xf7, 0x2, 0x83, + 0xa, 0xfb, 0xa, 0x6, 0x52, 0x3f, 0x4e, 0xd7, 0x5, 0xfb, 0x9, 0x6, + 0xe, 0xfc, 0x15, 0x73, 0xa, 0xd3, 0x63, 0xa, 0xf8, 0xa8, 0x6d, 0xa, + 0xfc, 0x84, 0x8d, 0x76, 0xf9, 0x6d, 0x77, 0x1, 0x2f, 0x78, 0x15, 0xf8, + 0x40, 0xf9, 0x6d, 0x5, 0x3d, 0x6, 0xfc, 0x40, 0xfd, 0x6d, 0x5, 0xe, + 0x57, 0x76, 0xa, 0xd2, 0xf7, 0x13, 0x1, 0xe2, 0xf7, 0x20, 0xf7, 0x43, + 0x7d, 0xa, 0xe2, 0x16, 0xf7, 0x20, 0xf8, 0x2c, 0xf4, 0xf7, 0x1, 0x22, + 0x6, 0xf4, 0xc5, 0x96, 0xca, 0x78, 0x1e, 0x9f, 0xeb, 0x5, 0x98, 0x5f, + 0x73, 0x8f, 0x6f, 0x1b, 0xfb, 0x37, 0x6f, 0xa, 0xf7, 0xcf, 0xfc, 0x2c, + 0x15, 0xf7, 0x20, 0xf8, 0x99, 0x68, 0xa, 0xd2, 0x4, 0xf7, 0x20, 0xf7, + 0x13, 0x6d, 0xa, 0x57, 0x76, 0xa, 0xf7, 0x66, 0x77, 0x1, 0xe2, 0xf7, + 0x20, 0xf7, 0x44, 0xf7, 0x1f, 0x3, 0xf8, 0x27, 0x16, 0xf7, 0x1f, 0xf9, + 0x5f, 0xfb, 0x1f, 0x6, 0xfb, 0xd0, 0xfd, 0x5f, 0x15, 0xf7, 0x20, 0xf8, + 0x2c, 0xf3, 0xf7, 0x1, 0x23, 0x6, 0xdf, 0xb1, 0xab, 0xde, 0x78, 0x1e, + 0x9e, 0xeb, 0x5, 0x98, 0x5f, 0x74, 0x8f, 0x6e, 0x1b, 0xfb, 0x36, 0x6f, + 0xa, 0xe, 0x86, 0xa, 0xa7, 0xf7, 0x16, 0x3, 0xc6, 0x16, 0xf8, 0xa0, + 0xf7, 0xe, 0xfc, 0x1e, 0xf7, 0x7c, 0x6, 0xf7, 0x3b, 0xf7, 0x1a, 0x5, + 0xf7, 0xc, 0x7, 0xfb, 0x3b, 0xfb, 0x1c, 0x5, 0xf7, 0x8a, 0xfb, 0x16, + 0xfb, 0xf9, 0x7, 0x3c, 0x4a, 0x5, 0xfb, 0x9, 0x7, 0xda, 0xcb, 0x5, + 0xe, 0xfc, 0x15, 0x3f, 0xa, 0xd1, 0xf7, 0xa, 0x3, 0xd1, 0x16, 0xf7, + 0xa, 0xf7, 0xfa, 0x6, 0xf7, 0x0, 0xd8, 0x5, 0xe9, 0x7, 0xfb, 0x0, + 0x3d, 0x5, 0xf7, 0x9f, 0xfb, 0xa, 0xfb, 0xf6, 0x7, 0x33, 0x48, 0x5, + 0x2d, 0x7, 0xe3, 0xcf, 0x5, 0xe, 0x57, 0x8b, 0xf7, 0xd, 0xf8, 0x6e, + 0x82, 0xa, 0xa4, 0x16, 0xf8, 0xc5, 0xf7, 0xd, 0x87, 0xa, 0xf7, 0x5, + 0xfc, 0x8e, 0xfb, 0xd, 0x8c, 0xa, 0xf7, 0x6e, 0xf9, 0x2d, 0x15, 0xf7, + 0xf, 0x6, 0xee, 0xf7, 0x21, 0x5, 0x20, 0x6, 0x58, 0x42, 0x54, 0xd4, + 0x5, 0x21, 0x6, 0xe, 0xfb, 0x37, 0x8b, 0xf7, 0xd, 0xf7, 0xaf, 0xf7, + 0x6, 0xe5, 0xf7, 0x22, 0x1, 0x9f, 0x16, 0xf8, 0x60, 0xf7, 0xd, 0xfb, + 0xad, 0x6, 0xf7, 0x9d, 0xf7, 0xc0, 0x5, 0xec, 0xfc, 0x3d, 0xfb, 0x6, + 0x7, 0xf7, 0x88, 0x8c, 0xfb, 0x9b, 0xfb, 0xbe, 0x5, 0xf7, 0x3b, 0xf8, + 0x89, 0x15, 0xf7, 0x12, 0x6, 0xf1, 0xf7, 0x22, 0x5, 0xfb, 0x2, 0x6, + 0x56, 0x42, 0x53, 0xd4, 0x5, 0xfb, 0x1, 0x6, 0xe, 0x8b, 0xf7, 0x1d, + 0xf8, 0xd9, 0x77, 0x12, 0xe5, 0xf7, 0x28, 0xfb, 0x28, 0xf7, 0x2e, 0x13, + 0xe0, 0xe8, 0x16, 0xf7, 0x25, 0xf7, 0x1d, 0xfb, 0x25, 0x6, 0xab, 0xbc, + 0x15, 0xdd, 0x6, 0x13, 0xd0, 0xb0, 0xf8, 0x0, 0x5, 0xf7, 0x3c, 0xfb, + 0x2e, 0xfb, 0x3c, 0x7, 0xe, 0xfb, 0x51, 0xf8, 0x68, 0x76, 0xf7, 0xa3, + 0x77, 0x1, 0xf7, 0xb3, 0xf8, 0x53, 0x15, 0xd3, 0x6, 0x9c, 0x67, 0xa, + 0xf7, 0x14, 0xfb, 0x1, 0xfb, 0x14, 0x7, 0xfb, 0x2a, 0xfb, 0x23, 0x15, + 0xd4, 0x6, 0x9b, 0x67, 0xa, 0xf7, 0x14, 0xfb, 0x0, 0xfb, 0x14, 0x7, + 0xe, 0x20, 0xa0, 0x76, 0xf7, 0x47, 0xf2, 0xf7, 0x1c, 0xf2, 0xf7, 0x45, + 0x77, 0x1, 0xb8, 0x16, 0xf6, 0x6, 0xb0, 0xf7, 0x47, 0x5, 0xf4, 0x6, + 0x67, 0xfb, 0x47, 0x5, 0xf4, 0x6, 0xb1, 0xf7, 0x47, 0x5, 0xf7, 0x1d, + 0xf2, 0xfb, 0x7, 0x6, 0xa7, 0xf7, 0x1c, 0x5, 0xe2, 0xf2, 0x49, 0x6, + 0xb1, 0xf7, 0x45, 0x5, 0xfb, 0x2, 0x6, 0x66, 0xfb, 0x45, 0x5, 0x24, + 0x6, 0xaf, 0xf7, 0x45, 0x5, 0x22, 0x6, 0x65, 0xfb, 0x45, 0x5, 0xfb, + 0x1b, 0x24, 0xf7, 0x6, 0x6, 0x6e, 0xfb, 0x1c, 0x5, 0x36, 0x24, 0xcb, + 0x6, 0xf7, 0x14, 0xf2, 0x15, 0xa7, 0xf7, 0x1c, 0x5, 0xf4, 0x6, 0x6f, + 0xfb, 0x1c, 0x5, 0xe, 0x20, 0x2d, 0x76, 0xfa, 0xe, 0x77, 0x12, 0xf7, + 0x85, 0xd4, 0xdf, 0xf7, 0x11, 0x17, 0xa9, 0xf7, 0x54, 0x15, 0x9b, 0x24, + 0xc2, 0x2a, 0xf7, 0x20, 0x7b, 0x8, 0x30, 0xd4, 0xe8, 0x7, 0xf7, 0x44, + 0xa4, 0xac, 0xf7, 0x7, 0xd0, 0x1a, 0xf7, 0x34, 0xfb, 0x19, 0xc0, 0x3f, + 0xa0, 0x1e, 0xf7, 0x56, 0x7, 0xbb, 0x77, 0x94, 0x62, 0x8e, 0x79, 0xf7, + 0x13, 0x9b, 0x18, 0x71, 0xf7, 0x2e, 0xfb, 0x13, 0x9a, 0x69, 0x8f, 0x8, + 0x13, 0x70, 0xbd, 0x7, 0x42, 0x59, 0x6, 0x24, 0x81, 0x34, 0x46, 0xfb, + 0xe, 0x1a, 0xfb, 0x32, 0xf7, 0x17, 0x5c, 0xc6, 0x7b, 0x1e, 0xfb, 0x64, + 0x7, 0x74, 0x96, 0x60, 0xab, 0x7e, 0xcf, 0x8, 0xf7, 0x2c, 0xfb, 0xa, + 0x15, 0xf7, 0x56, 0x7, 0xa1, 0x85, 0xc9, 0x79, 0x44, 0x1a, 0x60, 0x6f, + 0x5d, 0x53, 0x81, 0x1e, 0x42, 0xf7, 0xf9, 0x15, 0x4a, 0xa7, 0x8a, 0xb5, + 0x94, 0x1a, 0xad, 0xa1, 0xb7, 0xb7, 0x99, 0x1e, 0xe, 0xf7, 0x76, 0x78, + 0xd5, 0xf7, 0x69, 0xd5, 0x90, 0xd5, 0xf7, 0x69, 0xd5, 0x8d, 0x77, 0x12, + 0xa7, 0xf7, 0x4, 0xf3, 0xf7, 0x4, 0xf7, 0x45, 0xf7, 0x4, 0xf3, 0xf7, + 0x4, 0x13, 0xf7, 0x80, 0xf7, 0x20, 0xf8, 0xa4, 0x15, 0xd2, 0x98, 0xae, + 0xb2, 0xb3, 0x97, 0x67, 0x45, 0x42, 0x7f, 0x69, 0x63, 0x63, 0x7f, 0xaf, + 0xd2, 0x1e, 0xfb, 0x4, 0x16, 0x2d, 0xaf, 0x34, 0xf7, 0x14, 0xf7, 0x29, + 0x9a, 0xf7, 0xd, 0xc7, 0xf6, 0x5e, 0xd4, 0xfb, 0xb, 0xfb, 0x28, 0x7b, + 0xfb, 0xd, 0x50, 0x1e, 0xf7, 0x3b, 0xfc, 0xb7, 0x15, 0xf6, 0x6, 0x13, + 0xef, 0x80, 0xf8, 0x1f, 0xf9, 0x6d, 0x5, 0x24, 0x6, 0x4e, 0xfc, 0xba, + 0x15, 0x2d, 0xb0, 0x36, 0xf7, 0x15, 0xf7, 0x27, 0x9a, 0xf7, 0xb, 0xc9, + 0xf6, 0x5e, 0xd4, 0xfb, 0xa, 0xfb, 0x2a, 0x7c, 0xfb, 0xd, 0x4e, 0x1e, + 0xf7, 0x4, 0x8e, 0x15, 0xd3, 0x97, 0xac, 0xb3, 0xb3, 0x97, 0x68, 0x45, + 0x43, 0x7f, 0x67, 0x63, 0x63, 0x7f, 0xb0, 0xd2, 0x1e, 0xe, 0xc6, 0x7e, + 0xf7, 0x4, 0x2a, 0x76, 0xf9, 0x15, 0xeb, 0x12, 0xc1, 0xf7, 0x1e, 0x59, + 0xf7, 0x17, 0x13, 0x68, 0xf8, 0x8e, 0xca, 0x15, 0xa5, 0x72, 0xb5, 0x69, + 0xb9, 0x74, 0xdc, 0xf5, 0x18, 0x75, 0x94, 0x52, 0xb3, 0x6c, 0xa9, 0x9c, + 0xa1, 0x9c, 0xa7, 0xa5, 0xeb, 0xfb, 0xd, 0xa6, 0x18, 0x87, 0x7a, 0x81, + 0x69, 0x7c, 0x6d, 0x29, 0xf7, 0x16, 0x18, 0xda, 0xbe, 0xbc, 0xb8, 0xd4, + 0x1a, 0xe5, 0x42, 0xd2, 0xfb, 0xd, 0xfb, 0xe, 0x42, 0x40, 0x35, 0x57, + 0xa7, 0x5e, 0xb7, 0x59, 0x1e, 0x13, 0xb0, 0x68, 0x79, 0xfb, 0x11, 0x4c, + 0xfb, 0x1c, 0x1a, 0x54, 0xa6, 0xfb, 0x2b, 0xf7, 0x6b, 0xf7, 0x4, 0xc7, + 0xb4, 0xae, 0xb1, 0x1e, 0x36, 0xe5, 0x15, 0x76, 0x71, 0x64, 0x6a, 0x4f, + 0x1b, 0x43, 0x6b, 0xb8, 0xbc, 0xb5, 0xa3, 0xc0, 0xcf, 0xae, 0x1f, 0xbd, + 0xf7, 0x29, 0x15, 0x6c, 0xaf, 0x5, 0x13, 0xa8, 0x89, 0x8e, 0x6f, 0x8f, + 0xb5, 0x1a, 0xa5, 0x9e, 0xb2, 0xb8, 0xbf, 0xa3, 0x66, 0x6f, 0x74, 0x7c, + 0x7e, 0x7a, 0x7d, 0x1e, 0x7a, 0x7c, 0x77, 0x7e, 0x81, 0x84, 0x8, 0xe, + 0xfc, 0x3d, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77, 0x1, 0x7e, 0x85, 0xa, + 0xc3, 0xf8, 0x53, 0x15, 0xf7, 0x8, 0x6, 0x9b, 0xf7, 0x22, 0x5, 0xf7, + 0x15, 0xfb, 0x28, 0xfb, 0x15, 0x7, 0xe, 0xfb, 0x4f, 0x76, 0xfa, 0x42, + 0x77, 0x1, 0xae, 0x85, 0xa, 0xf7, 0x63, 0xfb, 0x64, 0x15, 0xf5, 0x6, + 0x61, 0xdb, 0x33, 0xf7, 0x39, 0xf7, 0x73, 0x1a, 0xf7, 0x52, 0xc0, 0xf7, + 0x16, 0xd9, 0xf7, 0x2e, 0x1e, 0x22, 0x6, 0x34, 0xfb, 0x4, 0x34, 0xfb, + 0x39, 0xfb, 0x59, 0x1a, 0xfb, 0x3b, 0xd0, 0xfb, 0x35, 0xf2, 0xfb, 0x20, + 0x1e, 0xe, 0xfb, 0x4f, 0x76, 0xfa, 0x42, 0x77, 0x1, 0xf7, 0x29, 0xf7, + 0x29, 0x3, 0x9e, 0xfb, 0x64, 0x15, 0xf4, 0x6, 0xe2, 0xf7, 0x4, 0xe2, + 0xf7, 0x35, 0xf7, 0x59, 0x1a, 0xf7, 0x3b, 0x46, 0xf7, 0x39, 0x24, 0xf7, + 0x20, 0x1e, 0x21, 0x6, 0xb5, 0x3b, 0xe2, 0xfb, 0x3d, 0xfb, 0x73, 0x1a, + 0xfb, 0x52, 0x57, 0xfb, 0x12, 0x3d, 0xfb, 0x2e, 0x1e, 0xe, 0xfb, 0xa6, + 0x4d, 0xa, 0xf7, 0x30, 0xd2, 0x3, 0xf7, 0x13, 0xf8, 0x17, 0x15, 0xcc, + 0xf7, 0x1, 0xc9, 0x21, 0xd1, 0xbb, 0x3a, 0xeb, 0xf7, 0xb, 0xa2, 0x72, + 0xe1, 0xfb, 0x8, 0x57, 0x97, 0xf7, 0x13, 0x5, 0x39, 0x6, 0x96, 0xfb, + 0x12, 0xfb, 0x1, 0xc2, 0x71, 0x38, 0xf7, 0x9, 0x6d, 0x34, 0x2f, 0x5, + 0xe, 0x3c, 0xa0, 0x76, 0xf7, 0x52, 0xf7, 0x15, 0xf7, 0x4f, 0x90, 0xa, + 0xf7, 0x52, 0x15, 0xf7, 0x50, 0xfb, 0x52, 0xf7, 0x13, 0xf7, 0x52, 0xf7, + 0x51, 0xf7, 0x15, 0xfb, 0x51, 0xf7, 0x4f, 0xfb, 0x13, 0xfb, 0x4f, 0xfb, + 0x50, 0x6, 0xe, 0xfc, 0x15, 0xfb, 0x27, 0x76, 0xf7, 0x51, 0x76, 0xf7, + 0x26, 0x77, 0x12, 0xd7, 0xf7, 0x1e, 0x44, 0xd2, 0x13, 0xf0, 0xd7, 0x16, + 0x13, 0xe8, 0xce, 0x6, 0x89, 0x38, 0x58, 0x7c, 0x71, 0x82, 0xa6, 0x4e, + 0x18, 0xf7, 0xf, 0xba, 0x8b, 0xec, 0xcd, 0x1a, 0xf3, 0x7, 0x13, 0xf0, + 0x81, 0xa, 0xf7, 0x6b, 0xf7, 0x16, 0x1, 0xa6, 0xf7, 0x6b, 0x15, 0xf7, + 0xab, 0xf7, 0x16, 0xfb, 0xab, 0x6, 0xe, 0xfc, 0x15, 0x8b, 0x84, 0xa, + 0xcb, 0xf7, 0x2a, 0x3, 0xcb, 0x16, 0xf7, 0x2a, 0xf7, 0x26, 0xfb, 0x2a, + 0x6, 0xe, 0xfc, 0x15, 0x86, 0x76, 0xf9, 0x8f, 0x77, 0x1, 0x76, 0xf7, + 0x11, 0x3, 0x6a, 0x78, 0x15, 0xf7, 0x11, 0x6, 0xf7, 0x6f, 0x93, 0xa, + 0x79, 0xa, 0xf8, 0x89, 0xf7, 0x6, 0x1, 0xab, 0xf7, 0x2c, 0xf7, 0x50, + 0xf7, 0x2c, 0x3, 0xab, 0xf7, 0xf5, 0x15, 0xfb, 0x21, 0xa2, 0xfb, 0x7b, + 0xf7, 0x74, 0xf7, 0x6d, 0xa7, 0xf7, 0x7d, 0xf7, 0x1d, 0xf7, 0x20, 0x72, + 0xf7, 0x6f, 0xfb, 0x72, 0xfb, 0x70, 0x72, 0xfb, 0x6f, 0xfb, 0x1e, 0x1e, + 0xf7, 0x2c, 0x89, 0x15, 0xf7, 0x53, 0xa4, 0xc1, 0xcf, 0xd1, 0xa4, 0x54, + 0xfb, 0x52, 0xfb, 0x52, 0x72, 0x49, 0x45, 0x47, 0x72, 0xcc, 0xf7, 0x53, + 0x1e, 0xe, 0x20, 0xa0, 0x76, 0xf9, 0x5a, 0x77, 0x1, 0xf7, 0x87, 0xf7, + 0x1b, 0x3, 0xf7, 0x87, 0x16, 0xf7, 0x1b, 0xf9, 0x5a, 0xfb, 0x2, 0x6, + 0x61, 0xfb, 0xc, 0xfb, 0x23, 0x56, 0x7d, 0x86, 0x8, 0xfb, 0xe, 0x7, + 0xe1, 0xa7, 0xc5, 0xba, 0xa9, 0xa7, 0x8, 0xe, 0x20, 0x8b, 0xf7, 0x12, + 0xf8, 0x6b, 0xf7, 0x5, 0x1, 0xb5, 0xf7, 0x1e, 0xf7, 0x55, 0xf7, 0x1e, + 0x3, 0xa5, 0x16, 0xf8, 0x79, 0xf7, 0x12, 0xfb, 0xa7, 0x6, 0x9e, 0xab, + 0xa2, 0xa0, 0xd2, 0xcb, 0x8, 0xd1, 0xca, 0xe7, 0xd5, 0xf7, 0x10, 0x1a, + 0xe3, 0x4a, 0xf7, 0xa, 0xfb, 0x3b, 0xfb, 0x17, 0x21, 0x2d, 0xfb, 0x7, + 0x1e, 0xf7, 0x1e, 0x7d, 0x5, 0xd3, 0x90, 0xa9, 0xb1, 0xcb, 0x1b, 0xc8, + 0xac, 0x63, 0x56, 0x43, 0x5b, 0x64, 0x2b, 0x33, 0x1f, 0xfb, 0x1e, 0xfb, + 0x12, 0x55, 0x41, 0x80, 0x22, 0x8, 0xe, 0x79, 0xa, 0xf8, 0x83, 0xf7, + 0x6, 0x1, 0xf7, 0xe6, 0xf7, 0x25, 0x3, 0xa6, 0xf7, 0x4a, 0x15, 0x25, + 0x97, 0xda, 0x28, 0xf7, 0x2a, 0x1b, 0xf7, 0x1d, 0xf7, 0x3, 0xeb, 0xf7, + 0x16, 0xe1, 0x56, 0xcd, 0x35, 0x9c, 0x1f, 0x8d, 0x7, 0xa5, 0x97, 0xda, + 0xae, 0xe9, 0x1a, 0xdf, 0x3b, 0xf6, 0xfb, 0x22, 0xfb, 0x4f, 0x72, 0xfb, + 0x22, 0x5f, 0x80, 0x1e, 0xf7, 0x17, 0x75, 0x5, 0xd4, 0x94, 0xb9, 0xa0, + 0xb0, 0x1b, 0xbd, 0xaa, 0x6c, 0x5d, 0x43, 0x4c, 0x75, 0x55, 0x8c, 0x1f, + 0x7c, 0xfb, 0x3, 0x5, 0xdd, 0xad, 0xdb, 0x56, 0x32, 0x1a, 0x55, 0x6c, + 0x51, 0x43, 0x48, 0x6c, 0xc0, 0xbd, 0x85, 0x1e, 0xe, 0x20, 0xa0, 0x76, + 0xf7, 0x23, 0xf7, 0xc, 0xf8, 0x53, 0x77, 0x1, 0xf7, 0xcc, 0xf7, 0x14, + 0x3, 0xa6, 0xf7, 0x23, 0x15, 0xf7, 0xb1, 0xfb, 0x23, 0xf7, 0x14, 0xf7, + 0x23, 0xe1, 0xf7, 0xc, 0x35, 0xf8, 0x53, 0x7c, 0xa, 0xfb, 0xc1, 0xfc, + 0x54, 0x5, 0xf7, 0x11, 0x8c, 0x15, 0xf7, 0x32, 0xf7, 0x86, 0x5, 0x8d, + 0xfb, 0x86, 0x6, 0xe, 0x79, 0xa, 0xf8, 0x7f, 0xf7, 0x11, 0x1, 0xf8, + 0x3f, 0xf7, 0x23, 0x3, 0xa6, 0xf7, 0x48, 0x15, 0xfb, 0x11, 0x9b, 0xec, + 0x41, 0xf7, 0x13, 0x1b, 0xf7, 0x3e, 0xda, 0xf7, 0x1e, 0xf7, 0x7, 0x1f, + 0x8a, 0xf7, 0x5e, 0xfb, 0x38, 0xe8, 0xfb, 0x2c, 0x46, 0xa1, 0xf7, 0x19, + 0x18, 0xf7, 0x9b, 0xf7, 0x11, 0xfc, 0x5, 0x6, 0x44, 0xfc, 0x11, 0xf7, + 0x5, 0x7b, 0xbb, 0xbf, 0xc1, 0x96, 0xb4, 0x7a, 0x19, 0xb6, 0x7a, 0xa9, + 0x53, 0x4f, 0x1a, 0x23, 0x54, 0x68, 0x58, 0x5c, 0x60, 0xa6, 0xd3, 0x80, + 0x1e, 0xe, 0x79, 0xa, 0xf7, 0x99, 0xef, 0xf7, 0x20, 0xf7, 0x6, 0x1, + 0xaa, 0xf7, 0x31, 0x3, 0xf7, 0x44, 0xf8, 0x23, 0x15, 0xd5, 0x90, 0x96, + 0xf7, 0xf, 0xee, 0x1b, 0xd2, 0x92, 0x4d, 0x7b, 0x8d, 0x1f, 0xf7, 0x1b, + 0x99, 0x5, 0xf6, 0x77, 0x3f, 0xd2, 0xfb, 0xb, 0x1b, 0xfb, 0x8a, 0x7d, + 0xfb, 0xc4, 0x4a, 0xfb, 0x4d, 0xe6, 0xfb, 0x43, 0xf7, 0x3d, 0xf7, 0x20, + 0xe4, 0xee, 0xf7, 0x22, 0xf7, 0x22, 0xfb, 0x6, 0xe7, 0xfb, 0x7, 0x52, + 0x5e, 0x6f, 0x6e, 0x7e, 0x1f, 0x97, 0xfb, 0x45, 0x15, 0xf7, 0x7, 0xdf, + 0x9e, 0x9e, 0xec, 0x85, 0xfb, 0x9, 0x7a, 0x77, 0x8a, 0x20, 0x31, 0x48, + 0x67, 0xc4, 0xd1, 0x1e, 0xe, 0x20, 0xa0, 0x76, 0xf8, 0xe1, 0xf7, 0x10, + 0x12, 0xf7, 0x14, 0xf7, 0x22, 0x17, 0xf7, 0x14, 0x16, 0xf7, 0x22, 0x6, + 0x13, 0xe0, 0xf7, 0x6e, 0xf7, 0x12, 0xf7, 0x9c, 0xf7, 0x18, 0xf7, 0xd, + 0x1e, 0xea, 0xfc, 0x8b, 0xfb, 0x10, 0xf7, 0xe3, 0x7, 0xfb, 0xb, 0xfb, + 0x1d, 0xfb, 0x5, 0xfb, 0x6f, 0xfb, 0x6e, 0x1a, 0xe, 0x20, 0x78, 0xf7, + 0x2, 0xf8, 0x8d, 0xf7, 0x2, 0x1, 0xab, 0xf7, 0x23, 0xf7, 0x62, 0xf7, + 0x23, 0x3, 0xf7, 0x31, 0xf8, 0xe, 0x15, 0x3b, 0x6a, 0x5e, 0x57, 0x36, + 0x1a, 0xfb, 0x21, 0xf7, 0x4, 0x35, 0xf7, 0x18, 0xf7, 0x1e, 0xf7, 0x2, + 0xe3, 0xf7, 0x1f, 0xc7, 0x72, 0xd1, 0x25, 0xb3, 0x1e, 0xd1, 0xa9, 0xab, + 0xc0, 0xc9, 0x1a, 0xe6, 0x4a, 0xeb, 0xfb, 0x32, 0xfb, 0x34, 0x4c, 0x2b, + 0x30, 0x36, 0xc0, 0x64, 0xbe, 0x76, 0x1e, 0xa8, 0xf7, 0x25, 0x15, 0xb3, + 0xa4, 0xb0, 0xcc, 0xbc, 0xb4, 0x74, 0x55, 0x3c, 0x47, 0x7c, 0x75, 0x77, + 0x45, 0x99, 0xdb, 0x1e, 0x80, 0xfb, 0xcf, 0x15, 0xa9, 0x9a, 0xdc, 0xe1, + 0xd4, 0xab, 0x51, 0x56, 0x2c, 0x48, 0x75, 0x65, 0x59, 0x58, 0xac, 0xdf, + 0x1e, 0xe, 0x79, 0xa, 0xf7, 0x20, 0xef, 0xf7, 0x99, 0xf7, 0x6, 0x1, + 0xa9, 0xf7, 0x1f, 0xf7, 0x41, 0xf7, 0x33, 0x3, 0xb7, 0xf7, 0x33, 0x15, + 0x25, 0x8e, 0xdd, 0x3f, 0xf7, 0x10, 0x1b, 0xf7, 0xa1, 0x8b, 0xf7, 0xc4, + 0xcc, 0xf7, 0x4e, 0x46, 0xf7, 0x42, 0xfb, 0x55, 0xfb, 0x21, 0x32, 0x28, + 0xfb, 0x22, 0xfb, 0x22, 0xf7, 0x2, 0x2f, 0xf7, 0x8, 0xa6, 0xb8, 0x90, + 0xc1, 0xb9, 0x1f, 0x8d, 0x89, 0x5, 0x41, 0x86, 0x78, 0xfb, 0xf, 0x28, + 0x1b, 0x44, 0x8b, 0xc9, 0x9b, 0x89, 0x1f, 0x80, 0xf7, 0xbc, 0x15, 0x9f, + 0x8b, 0xf6, 0xe6, 0xce, 0xaf, 0x47, 0x44, 0xfb, 0x7, 0x33, 0x84, 0x78, + 0x2a, 0x95, 0xf7, 0x9, 0x9c, 0x1e, 0xe, 0x8b, 0xf7, 0x19, 0xf7, 0x89, + 0xf7, 0x1a, 0x1, 0xe7, 0xf7, 0x2a, 0x3, 0xe7, 0x16, 0xf7, 0x2a, 0xf7, + 0x19, 0xfb, 0x2a, 0x6, 0xf7, 0x89, 0x4, 0xf7, 0x2a, 0xf7, 0x1a, 0xfb, + 0x2a, 0x6, 0xe, 0xfb, 0x27, 0x76, 0xf7, 0x4a, 0x76, 0xf8, 0x12, 0xf7, + 0x1d, 0x12, 0xf3, 0xf7, 0x1e, 0x44, 0xd2, 0x13, 0xf0, 0xf3, 0x84, 0x15, + 0x13, 0xe8, 0xce, 0x6, 0x2c, 0x56, 0x8b, 0x71, 0x82, 0x1e, 0xa6, 0x52, + 0x5, 0xf7, 0xf, 0xb7, 0x8b, 0xe9, 0xc9, 0x1a, 0xed, 0x7, 0x13, 0xf0, + 0xfb, 0x1e, 0x6, 0xf7, 0x89, 0x4, 0xf7, 0x1e, 0xf7, 0x1d, 0x81, 0xa, + 0x91, 0xa, 0xf7, 0x58, 0x15, 0xf8, 0x90, 0xfb, 0x60, 0x5, 0xf7, 0x18, + 0x7, 0xfb, 0xf6, 0xf7, 0x14, 0xf7, 0xf6, 0xf7, 0x15, 0x5, 0xf7, 0x19, + 0x7, 0xfc, 0x90, 0xfb, 0x62, 0x5, 0xe, 0x3c, 0xe2, 0xf7, 0xe, 0xe4, + 0x82, 0xa, 0xb3, 0xf8, 0x8c, 0x3, 0xb3, 0xe2, 0x15, 0xf8, 0x8c, 0xf7, + 0xe, 0xfc, 0x8c, 0x6, 0xe4, 0x4, 0xf8, 0x8c, 0xf7, 0xd, 0xfc, 0x8c, + 0x6, 0xe, 0x91, 0xa, 0x83, 0x15, 0xf8, 0x90, 0xf7, 0x62, 0x5, 0xf7, + 0x4, 0x7, 0xfc, 0x90, 0xf7, 0x60, 0x5, 0xfb, 0x18, 0x7, 0xf7, 0xf5, + 0xfb, 0x14, 0xfb, 0xf5, 0xfb, 0x15, 0x5, 0xe, 0x57, 0x8b, 0xf7, 0x1e, + 0xf8, 0x77, 0xf5, 0x12, 0xf7, 0x87, 0xf7, 0xc, 0xfb, 0xc, 0xf7, 0x19, + 0xbe, 0xf7, 0x15, 0x13, 0xe8, 0xf7, 0x87, 0xf7, 0x4e, 0x15, 0xf7, 0xd, + 0x6, 0x8a, 0x92, 0x8b, 0x93, 0x8f, 0x1a, 0xbf, 0x91, 0x9e, 0xc3, 0xba, + 0x1e, 0xe8, 0xdb, 0xb1, 0xba, 0xd2, 0x1a, 0xf7, 0x5, 0x25, 0xe8, 0xfb, + 0x27, 0xfb, 0x37, 0x3d, 0xfb, 0x4, 0x29, 0x85, 0x1e, 0xf7, 0xe, 0x7b, + 0x5, 0xd7, 0x9a, 0xb1, 0xb7, 0xd3, 0x1b, 0xc4, 0xca, 0x6b, 0x4a, 0x60, + 0x75, 0x79, 0x49, 0x52, 0x1f, 0x2d, 0x3d, 0x87, 0x5e, 0x8d, 0x2a, 0x8, + 0xfb, 0x4e, 0x4, 0x13, 0xd8, 0xf7, 0x19, 0xf7, 0x1e, 0xfb, 0x19, 0x6, + 0xe, 0xf8, 0x2d, 0x46, 0xda, 0xf7, 0x0, 0xda, 0xf7, 0xca, 0xdb, 0xec, + 0xda, 0x1, 0xf7, 0x16, 0xd8, 0xdc, 0xf7, 0x1, 0xf8, 0x53, 0xd7, 0x3, + 0xf8, 0xc8, 0xf7, 0x3b, 0x15, 0x79, 0x90, 0x93, 0x6c, 0xcb, 0x1b, 0xf7, + 0x40, 0xf6, 0xf7, 0x37, 0xf7, 0x28, 0xf7, 0x4c, 0xfb, 0x17, 0xf7, 0x2a, + 0xfb, 0x79, 0xfb, 0xc8, 0xfb, 0xe, 0xfb, 0x89, 0xfb, 0x5b, 0xfb, 0x9e, + 0xf7, 0x7d, 0xfb, 0xe, 0xf7, 0x5c, 0xf7, 0x18, 0xf7, 0x41, 0xb4, 0xf7, + 0x2e, 0xd5, 0x1f, 0x32, 0x6, 0x66, 0x6f, 0x47, 0x3c, 0xfb, 0x56, 0x1b, + 0xfb, 0xa9, 0x3c, 0xf7, 0x41, 0xf7, 0x1c, 0xf7, 0x11, 0xc7, 0xf7, 0x84, + 0xf7, 0xb9, 0xf7, 0x72, 0xc9, 0xfb, 0x30, 0x28, 0xfb, 0x1d, 0x20, 0x35, + 0x62, 0x75, 0x91, 0xa9, 0xa8, 0x90, 0x1f, 0xca, 0xf7, 0xcb, 0x5, 0xfb, + 0x2, 0x6, 0x81, 0x5b, 0x5, 0xc0, 0x6a, 0x56, 0x91, 0x72, 0x1b, 0xfb, + 0x2b, 0x3d, 0xfb, 0x3a, 0xfb, 0xd, 0x27, 0xc8, 0x39, 0xf0, 0xcd, 0xb0, + 0xb1, 0x96, 0x96, 0x1f, 0xfb, 0x3b, 0xf7, 0x19, 0x15, 0xc8, 0xa0, 0xf7, + 0x26, 0xee, 0xd0, 0x9d, 0x43, 0x6f, 0x51, 0x6b, 0xfb, 0x2c, 0x28, 0x50, + 0x7a, 0xc0, 0xbd, 0x1e, 0xe, 0x69, 0xa, 0xf7, 0x37, 0xf7, 0xe, 0xf8, + 0x45, 0x77, 0x1, 0x9f, 0xf9, 0x3e, 0x3, 0x9f, 0x16, 0xf7, 0x26, 0x6, + 0xc3, 0xf7, 0x37, 0x5, 0xf7, 0xa3, 0x6, 0xc6, 0xfb, 0x37, 0x5, 0xf7, + 0x2a, 0x6, 0xfb, 0xa4, 0xf9, 0x62, 0x40, 0xa, 0x76, 0xfc, 0x45, 0x15, + 0xe7, 0xf7, 0x9e, 0xe9, 0xfb, 0x9e, 0x5, 0xe, 0xc6, 0x8c, 0xf7, 0xd, + 0xf7, 0x51, 0xf7, 0xe, 0xf7, 0x38, 0x7b, 0xa, 0xf7, 0x22, 0xf7, 0xa9, + 0xf7, 0x1f, 0x3, 0xd7, 0x8d, 0x15, 0xf7, 0xa7, 0x6, 0xf7, 0x30, 0xf7, + 0x36, 0x89, 0xf7, 0x5f, 0xb4, 0x7e, 0xf0, 0xfb, 0xd, 0xb1, 0x1f, 0xcd, + 0xa8, 0xac, 0xba, 0xca, 0x1a, 0xf7, 0x33, 0xfb, 0x22, 0xb0, 0xfb, 0x21, + 0x1e, 0xfb, 0xa7, 0x6, 0xf7, 0x22, 0xfb, 0xb1, 0x15, 0xf7, 0x38, 0xf7, + 0x19, 0x7, 0xc8, 0xde, 0x8c, 0x3f, 0x3f, 0x2a, 0x7e, 0x5c, 0x1f, 0xfb, + 0x19, 0xfb, 0xcb, 0x15, 0xf7, 0x51, 0xf7, 0x19, 0x7, 0xef, 0xd2, 0x82, + 0x28, 0x47, 0x3d, 0x7e, 0x2e, 0x1f, 0xe, 0xc6, 0x78, 0xf7, 0x13, 0xf8, + 0x8a, 0xf7, 0x13, 0x1, 0xb7, 0xf7, 0x2d, 0x3, 0xf8, 0xb0, 0xf7, 0x9a, + 0x15, 0x3b, 0x79, 0x5d, 0x41, 0x29, 0x1b, 0xfb, 0x2b, 0x6d, 0xf7, 0xc, + 0xf7, 0x11, 0xba, 0x89, 0xf7, 0x66, 0xf7, 0x4b, 0xd7, 0xca, 0x60, 0x3c, + 0x9d, 0x1f, 0xf7, 0x27, 0xad, 0x5, 0xf7, 0xa, 0x71, 0xfb, 0x17, 0xec, + 0xfb, 0x27, 0x1b, 0xfb, 0x83, 0x2c, 0xfb, 0x49, 0xfb, 0x5f, 0xfb, 0x78, + 0xf7, 0x1b, 0xfb, 0x24, 0xf7, 0x5b, 0xf7, 0x84, 0xbe, 0xf7, 0x47, 0xc4, + 0x9a, 0x1f, 0xe, 0xc6, 0x8b, 0xf7, 0xd, 0xf8, 0x70, 0x7b, 0xa, 0xf7, + 0x26, 0xf7, 0xcc, 0xf7, 0x2b, 0x3, 0xd7, 0x16, 0xf7, 0x7c, 0x6, 0xf7, + 0x9e, 0xf7, 0x3, 0xf7, 0x23, 0xf7, 0x65, 0xf7, 0xb0, 0xfb, 0x36, 0xdd, + 0xfb, 0x6b, 0x1f, 0xfb, 0x7c, 0x6, 0xf7, 0x26, 0xfc, 0xe9, 0x15, 0xf8, + 0x70, 0xe1, 0x7, 0xf7, 0xe, 0xf3, 0x85, 0xfb, 0x83, 0xfb, 0x7b, 0xfb, + 0x5, 0x8b, 0xfb, 0x5, 0x1f, 0xe, 0x8f, 0x8b, 0xf7, 0xd, 0xf7, 0x57, + 0xf7, 0xd, 0xf7, 0x34, 0x7b, 0xa, 0xf7, 0x24, 0x3, 0xd7, 0x16, 0xf8, + 0xb5, 0xf7, 0xd, 0xfc, 0x25, 0xf7, 0x57, 0xf7, 0xf3, 0xf7, 0xd, 0xfb, + 0xf3, 0xf7, 0x34, 0xf8, 0x18, 0xf7, 0xd, 0xfc, 0xa8, 0x6, 0xe, 0x57, + 0xa0, 0x76, 0xf7, 0xc5, 0xf7, 0xd, 0xf7, 0x3f, 0x7b, 0xa, 0xf7, 0x2a, + 0x3, 0xd7, 0x16, 0xf7, 0x2a, 0xf7, 0xc5, 0xf7, 0xc2, 0xf7, 0xd, 0xfb, + 0xc2, 0xf7, 0x3f, 0xf7, 0xfd, 0xf7, 0xd, 0xfc, 0x93, 0x6, 0xe, 0xf7, + 0x7, 0x78, 0xf7, 0x13, 0xf7, 0x2e, 0xf7, 0x10, 0xf7, 0x60, 0xf7, 0x13, + 0x1, 0xc5, 0xf7, 0x29, 0xf7, 0xfc, 0xf7, 0x26, 0x3, 0xf8, 0x22, 0xf7, + 0x9a, 0x15, 0xf7, 0x3d, 0x2f, 0x6, 0x7d, 0x78, 0x49, 0x5b, 0x37, 0x1b, + 0xfb, 0x3c, 0x66, 0xf7, 0x25, 0xf7, 0x0, 0xa0, 0x8f, 0xa4, 0x94, 0xa9, + 0x1f, 0x94, 0xaa, 0x97, 0xa5, 0x9c, 0xa1, 0x8, 0xb8, 0xae, 0xbe, 0xa8, + 0xcf, 0x1b, 0xb6, 0xe5, 0x7c, 0x27, 0xa8, 0x1f, 0xf7, 0x24, 0xa6, 0x5, + 0xf7, 0x48, 0x63, 0xfb, 0x29, 0xae, 0xfb, 0x9, 0x1b, 0xfb, 0x15, 0x32, + 0x5a, 0x43, 0x53, 0x1f, 0x6f, 0x67, 0x77, 0x63, 0x7e, 0x5e, 0x8, 0x7e, + 0x5e, 0x85, 0x65, 0x6c, 0x1a, 0xfb, 0x54, 0xea, 0xfb, 0x50, 0xf7, 0x97, + 0xf7, 0x26, 0xf7, 0x12, 0xd4, 0xb3, 0xb6, 0x1e, 0xf7, 0xb8, 0xfb, 0xcf, + 0x7, 0xe, 0x69, 0xa, 0xf7, 0xcf, 0xf7, 0xe, 0xf7, 0xad, 0x77, 0x1, + 0xd2, 0xf7, 0x26, 0xf7, 0xb4, 0xf7, 0x26, 0x3, 0xd2, 0x16, 0xf7, 0x26, + 0xf7, 0xcf, 0xf7, 0xb4, 0xfb, 0xcf, 0xf7, 0x26, 0xf9, 0x62, 0xfb, 0x26, + 0xfb, 0xad, 0xfb, 0xb4, 0xf7, 0xad, 0xfb, 0x26, 0x6, 0xe, 0xfc, 0x15, + 0x3f, 0xa, 0xf7, 0x10, 0xf7, 0x2a, 0x3, 0xcb, 0x16, 0xf7, 0x2a, 0xf9, + 0x62, 0xfb, 0x2a, 0x6, 0xe, 0x20, 0x79, 0xf7, 0x12, 0xf8, 0xf6, 0x77, + 0x1, 0xf7, 0xe7, 0xf7, 0x25, 0x3, 0xa1, 0xf7, 0x70, 0x15, 0xfb, 0x38, + 0xdb, 0x41, 0xf7, 0x23, 0xf7, 0x41, 0xcd, 0xf7, 0xb, 0xf7, 0x2b, 0x1e, + 0xf8, 0x66, 0xfb, 0x25, 0xfc, 0x66, 0x7, 0x44, 0x86, 0x42, 0x32, 0x36, + 0x8f, 0xdf, 0xb9, 0x87, 0x1e, 0xe, 0xc6, 0x3f, 0xa, 0xe2, 0xf7, 0x22, + 0x3, 0xe2, 0x16, 0xf7, 0x22, 0xf7, 0x6e, 0x6, 0xf7, 0x8, 0xf7, 0xc, + 0xf7, 0x55, 0xfb, 0xe6, 0x5, 0xf7, 0x4c, 0x6, 0xfb, 0xab, 0xf8, 0x4c, + 0xf7, 0x9c, 0xf7, 0xaa, 0x5, 0xfb, 0x52, 0x6, 0xfb, 0xb4, 0xfb, 0xd1, + 0x5, 0xf7, 0xd1, 0xfb, 0x22, 0x7, 0xe, 0x86, 0xa, 0xd7, 0xf7, 0x25, + 0x3, 0xd7, 0x16, 0xf8, 0x8f, 0xf7, 0xe, 0xfb, 0xfe, 0xf8, 0xe8, 0xfb, + 0x25, 0x6, 0xe, 0xf7, 0x3e, 0xa0, 0x76, 0xf8, 0xc9, 0xf7, 0x2d, 0x1, + 0xd0, 0xf7, 0x1b, 0xf8, 0x3e, 0xf7, 0x1b, 0x3, 0xd0, 0x16, 0xf7, 0x1b, + 0xf8, 0xc9, 0x8d, 0x6, 0xf7, 0x22, 0xfc, 0xc9, 0x5, 0xf7, 0x20, 0x6, + 0xf7, 0x20, 0xf8, 0xc9, 0x5, 0x8d, 0xfc, 0xc9, 0xf7, 0x1b, 0xf9, 0x62, + 0xfb, 0x6f, 0x6, 0xfb, 0x13, 0xfc, 0x7c, 0x5, 0x88, 0x6, 0xfb, 0x15, + 0xf8, 0x7c, 0x5, 0xfb, 0x6e, 0x6, 0xe, 0xc6, 0xa0, 0x76, 0xf9, 0x62, + 0x5c, 0xa, 0xf8, 0x67, 0x8d, 0x6, 0xf7, 0xbb, 0xfc, 0x67, 0x5, 0xf7, + 0x2a, 0xf9, 0x62, 0xfb, 0x1e, 0xfc, 0x72, 0x89, 0x6, 0xfb, 0xc1, 0xf8, + 0x72, 0x5, 0xfb, 0x24, 0x6, 0xe, 0xf7, 0x7, 0x78, 0xf7, 0x13, 0xf8, + 0x76, 0xf7, 0x13, 0x1, 0xd0, 0xf7, 0x28, 0xf7, 0xf8, 0x85, 0xa, 0xb7, + 0xf7, 0xea, 0x15, 0x7c, 0x8d, 0x75, 0x90, 0x6d, 0x1e, 0x94, 0x4f, 0xa0, + 0x53, 0xae, 0x58, 0x8, 0x40, 0xbe, 0xe5, 0x57, 0xf7, 0x18, 0x1b, 0xf7, + 0x10, 0xe2, 0xba, 0xd2, 0xc2, 0x1f, 0xa6, 0xaf, 0x9f, 0xb4, 0x98, 0xb8, + 0x8, 0x98, 0xb9, 0x91, 0xb3, 0xae, 0x1a, 0xf7, 0x69, 0x3d, 0xa, 0xfb, + 0x20, 0xfb, 0x7f, 0x1e, 0xf7, 0x28, 0x16, 0xf7, 0x0, 0xac, 0xf7, 0x20, + 0xf7, 0x38, 0xf7, 0x44, 0xa0, 0xfb, 0x39, 0x38, 0x76, 0x87, 0x72, 0x84, + 0x6c, 0x1e, 0x84, 0x6c, 0x80, 0x70, 0x7c, 0x74, 0x8, 0x5c, 0x6c, 0x59, + 0x6e, 0x43, 0x1b, 0x3f, 0x5a, 0xa9, 0x89, 0xa, 0xaa, 0x8, 0x85, 0xaa, + 0x88, 0xa5, 0xa0, 0x1a, 0xe, 0x8f, 0xa0, 0x76, 0xf7, 0xac, 0xf7, 0xd, + 0xf7, 0x58, 0xf7, 0xd, 0x60, 0xa, 0xf7, 0xac, 0xdb, 0x6, 0xf7, 0x31, + 0xf7, 0x3d, 0x7e, 0xf7, 0x7a, 0xf7, 0x6c, 0xfb, 0x26, 0x90, 0xfb, 0x48, + 0x1f, 0xfb, 0x75, 0x6, 0xf7, 0x25, 0xfb, 0xd1, 0x15, 0xf7, 0x58, 0xdb, + 0x7, 0xf4, 0xd2, 0x89, 0x27, 0x24, 0x26, 0x94, 0x40, 0x1f, 0xe, 0xf7, + 0x7, 0x6c, 0x76, 0xc6, 0xf7, 0xf, 0xf8, 0x6f, 0xf7, 0xe, 0x1, 0xd1, + 0xf7, 0x23, 0xf7, 0xe7, 0xf7, 0x23, 0x3, 0xf8, 0xa8, 0xb0, 0x15, 0xc4, + 0x64, 0xb5, 0x68, 0xc2, 0x7c, 0xbe, 0xf0, 0x18, 0x4f, 0xa2, 0x68, 0xa5, + 0x7b, 0x96, 0x8, 0xa6, 0xa7, 0xc5, 0xe2, 0xf7, 0x20, 0x1a, 0xf7, 0x67, + 0xfb, 0x3, 0xf7, 0x2c, 0xfb, 0x73, 0xfb, 0x6b, 0xfb, 0xa, 0xfb, 0x20, + 0xfb, 0x73, 0x38, 0xa0, 0x2c, 0xbf, 0x47, 0x1e, 0x48, 0xc0, 0xde, 0x5f, + 0xf7, 0x10, 0x1b, 0xd3, 0xc7, 0x9e, 0x96, 0xa2, 0x1f, 0xfb, 0x50, 0xf7, + 0x23, 0x15, 0xab, 0x7f, 0xb2, 0x76, 0x9a, 0x80, 0x8, 0x88, 0x80, 0x80, + 0x88, 0x6c, 0x1b, 0x44, 0x5c, 0xa8, 0x89, 0xa, 0xac, 0x8, 0x85, 0xac, + 0x88, 0xa4, 0x9e, 0x1a, 0xf7, 0x7, 0xac, 0xf7, 0x12, 0xf7, 0x31, 0xf7, + 0x32, 0xac, 0xfb, 0x21, 0x27, 0x6a, 0x81, 0x50, 0x7f, 0x6e, 0x1e, 0x80, + 0x6f, 0x7e, 0x7a, 0x84, 0x82, 0x6a, 0xa4, 0x5d, 0xa8, 0x56, 0x9e, 0x8, + 0xe, 0x69, 0xa, 0xf7, 0xc0, 0xf7, 0x6, 0xf7, 0x4b, 0x7b, 0xa, 0xf7, + 0x1b, 0xf7, 0xa5, 0xf7, 0x1f, 0x3, 0xd7, 0x16, 0xf7, 0x1b, 0xf7, 0xc0, + 0xa6, 0x6, 0xe5, 0xa1, 0x81, 0xfb, 0x16, 0xdc, 0x1f, 0xdf, 0xfb, 0x34, + 0x5, 0xf7, 0x36, 0x6, 0x3a, 0xf7, 0x20, 0x47, 0xf7, 0x8, 0x71, 0xa5, + 0x53, 0xad, 0x19, 0x8d, 0x7, 0xf0, 0x92, 0xd7, 0xdb, 0xf7, 0x3, 0x1a, + 0xf7, 0x52, 0xfb, 0x1b, 0x97, 0xfb, 0x45, 0x1e, 0xfb, 0x7f, 0x6, 0xf7, + 0x1b, 0xfb, 0xc4, 0x15, 0xf7, 0x4b, 0xef, 0x7, 0xf5, 0xce, 0x94, 0x28, + 0x2c, 0x30, 0x8d, 0x39, 0x1f, 0xe, 0x8f, 0x78, 0xf7, 0x10, 0xf7, 0x64, + 0xf7, 0x1b, 0xf7, 0x3b, 0xf7, 0xe, 0x1, 0xcc, 0xf7, 0x21, 0xf7, 0x96, + 0xf7, 0x26, 0x3, 0xb2, 0xf7, 0x7b, 0x15, 0xfb, 0x87, 0x72, 0xa, 0xbe, + 0xf7, 0x42, 0xf7, 0x48, 0xfb, 0x2a, 0xae, 0xfb, 0x3, 0xa6, 0x1f, 0xfb, + 0x9, 0xa6, 0x5e, 0x96, 0xba, 0x1a, 0xc6, 0xda, 0xa2, 0xb6, 0xf7, 0x8, + 0x96, 0x47, 0x65, 0x91, 0x1e, 0xf7, 0x28, 0x91, 0x5, 0xf7, 0x3a, 0x85, + 0xfb, 0x18, 0xc3, 0xfb, 0x23, 0x1b, 0xfb, 0x69, 0x59, 0xfb, 0x11, 0x3c, + 0xfb, 0x36, 0xf7, 0x35, 0x63, 0xd3, 0x79, 0x1f, 0xf7, 0x1a, 0x6a, 0xbe, + 0x7e, 0x4e, 0x1a, 0x5c, 0x61, 0x55, 0x25, 0xfb, 0x18, 0x78, 0xf1, 0xb1, + 0x84, 0x1e, 0xe, 0x57, 0xa0, 0x76, 0xf8, 0xe8, 0xf7, 0xe, 0x1, 0xf7, + 0x7c, 0x85, 0xa, 0xf7, 0x7c, 0x16, 0xf7, 0x28, 0xf8, 0xe8, 0xf7, 0x6e, + 0xf7, 0xe, 0xfc, 0xdc, 0xfb, 0xe, 0xf7, 0x6e, 0x6, 0xe, 0xc6, 0x78, + 0xf7, 0x12, 0xf8, 0xf7, 0x77, 0x42, 0xa, 0xd3, 0xf9, 0x62, 0x15, 0xfc, + 0x22, 0x7, 0xfb, 0x3c, 0xb7, 0xfb, 0x3f, 0xf7, 0x8d, 0xf7, 0x6d, 0xd0, + 0xf7, 0x1, 0xf7, 0x7a, 0x1e, 0xf8, 0x22, 0xfb, 0x26, 0xfc, 0x22, 0x7, + 0xfb, 0x11, 0x8b, 0x33, 0xfb, 0x20, 0xfb, 0x16, 0x7a, 0xdc, 0xf7, 0x18, + 0x1e, 0xf8, 0x22, 0x7, 0xe, 0x8f, 0x3f, 0xa, 0xf7, 0x98, 0x16, 0xf7, + 0x26, 0x6, 0xf7, 0x86, 0xf9, 0x62, 0x40, 0xa, 0xfb, 0x39, 0xfc, 0xa7, + 0x6e, 0xa, 0xfb, 0x3d, 0xf8, 0xa7, 0x5, 0xfb, 0x28, 0x6, 0xe, 0xf7, + 0xad, 0xa0, 0x76, 0xf8, 0xaf, 0x77, 0xf7, 0x5b, 0x77, 0x1, 0xf7, 0x4a, + 0x16, 0xf7, 0x2d, 0x6, 0xf7, 0x1d, 0xf8, 0xaf, 0x5, 0x8c, 0x6, 0xf7, + 0x1d, 0xfc, 0xaf, 0x5, 0xf7, 0x2a, 0x6, 0xf7, 0x3d, 0xf9, 0x62, 0x5, + 0xfb, 0x22, 0x6, 0x22, 0xfc, 0x88, 0x6e, 0xa, 0xfb, 0xd, 0xf8, 0x88, + 0x5, 0xfb, 0x3b, 0x6, 0xfb, 0x12, 0xfc, 0x80, 0x6e, 0xa, 0x23, 0xf8, + 0x80, 0x5, 0xfb, 0x24, 0x6, 0xe, 0x8f, 0x3f, 0xa, 0x99, 0x16, 0xf7, + 0x3b, 0x6, 0xf7, 0x2c, 0xf7, 0x8d, 0xf7, 0x2d, 0xfb, 0x8d, 0x5, 0xf7, + 0x3b, 0x6, 0xfb, 0x7f, 0xf8, 0x7, 0xf7, 0x6a, 0xf7, 0xef, 0x5, 0xfb, + 0x35, 0x6, 0xfb, 0x1b, 0xfb, 0x7c, 0xfb, 0x1e, 0xf7, 0x7c, 0x5, 0xfb, + 0x36, 0x6, 0xf7, 0x69, 0xfb, 0xe9, 0x5, 0xe, 0x8f, 0x3f, 0xa, 0xf7, + 0x9d, 0xf7, 0x1d, 0x3, 0xf7, 0x9d, 0x16, 0xf7, 0x1d, 0xf7, 0xc2, 0x6, + 0xf7, 0x8f, 0xf8, 0x34, 0x4f, 0xa, 0xfc, 0x33, 0x5, 0xe, 0x57, 0x8b, + 0xf7, 0xe, 0xf8, 0x6e, 0xf7, 0xe, 0x1, 0xa4, 0x16, 0xf8, 0xc5, 0xf7, + 0xe, 0x87, 0xa, 0xf7, 0x6, 0xfc, 0x8e, 0xfb, 0xe, 0x8c, 0xa, 0xe, + 0x7f, 0xa, 0xca, 0xf7, 0x19, 0x3, 0xf7, 0x58, 0x33, 0x15, 0xf9, 0x52, + 0xf7, 0x5, 0xf7, 0x0, 0xfb, 0x8a, 0xfe, 0x2a, 0xf7, 0x8a, 0xf7, 0x0, + 0x7, 0xe, 0xfc, 0x15, 0x8d, 0x76, 0xf9, 0x88, 0x77, 0x1, 0x4e, 0xf7, + 0xec, 0x3, 0xf7, 0x4e, 0x78, 0x15, 0xf7, 0x11, 0x6, 0xfb, 0x6d, 0x93, + 0xa, 0x7f, 0xa, 0xf7, 0x1d, 0xf7, 0x19, 0x3, 0xa3, 0x33, 0x15, 0xfb, + 0x0, 0xf7, 0x8a, 0xfa, 0x2a, 0xfb, 0x8a, 0xfb, 0x0, 0xf7, 0x5, 0xfd, + 0x52, 0x7, 0xe, 0x3c, 0xf7, 0xec, 0x76, 0xf7, 0x79, 0x84, 0xa, 0xc9, + 0xf7, 0xd7, 0x15, 0xf7, 0x1c, 0x6, 0xe9, 0xf7, 0x79, 0xea, 0xfb, 0x79, + 0x5, 0xf7, 0x1b, 0x6, 0xfb, 0x42, 0xf8, 0xb, 0x5, 0x20, 0x6, 0xe, + 0x20, 0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8, 0xc0, 0xbd, 0x7, + 0xe, 0xf8, 0xf0, 0x84, 0xa, 0x74, 0xf7, 0x8c, 0x3, 0xf7, 0x13, 0xf8, + 0xf0, 0x15, 0xed, 0x6, 0x3f, 0x83, 0xa, 0xfb, 0x40, 0x6, 0xe, 0x20, + 0x7d, 0xef, 0x48, 0x76, 0xf8, 0x4c, 0xf7, 0x0, 0x12, 0xa8, 0xf7, 0x1a, + 0xf7, 0x58, 0xf7, 0x1d, 0x13, 0x78, 0xf8, 0x6, 0xc4, 0x30, 0xa, 0x77, + 0xb8, 0x83, 0xa3, 0x38, 0xa, 0xad, 0x1a, 0xeb, 0x8a, 0xf4, 0xfb, 0x73, + 0xfb, 0x32, 0x5b, 0x49, 0x35, 0x73, 0x1e, 0xf7, 0x13, 0x73, 0x5, 0xa6, + 0x2d, 0xa, 0x7f, 0x6e, 0x83, 0x3c, 0x7d, 0x8, 0x41, 0x7c, 0xfb, 0xc, + 0x73, 0xfb, 0x17, 0x1a, 0x13, 0xb8, 0x2e, 0xd1, 0x4a, 0x37, 0xa, 0xf7, + 0x5b, 0x15, 0x6f, 0x7, 0x3c, 0x97, 0x5d, 0x4c, 0x3d, 0x1b, 0x55, 0x6d, + 0xa7, 0xa9, 0xbd, 0xca, 0xa9, 0xa4, 0x90, 0x1f, 0xa9, 0x92, 0xc8, 0x95, + 0x9c, 0x95, 0x8, 0xe, 0x57, 0x7d, 0xf7, 0x2, 0x3e, 0x76, 0xf8, 0x41, + 0xf5, 0xf7, 0x4d, 0x77, 0x12, 0xde, 0xf7, 0x20, 0xf7, 0x5a, 0xf7, 0x24, + 0x13, 0x7c, 0xc8, 0x89, 0x15, 0xf7, 0x17, 0xd8, 0x8d, 0x6, 0x13, 0xbc, + 0x3d, 0xc1, 0xd8, 0x80, 0xaa, 0x1b, 0xf7, 0x7, 0xf6, 0xe0, 0xf7, 0x50, + 0xf7, 0x4c, 0x22, 0xe5, 0xfb, 0xa, 0x35, 0x5b, 0x5a, 0x74, 0x77, 0x1f, + 0xf7, 0x95, 0xfb, 0x20, 0x7, 0x13, 0x7c, 0xf7, 0x1f, 0xfc, 0x52, 0x15, + 0xf5, 0xbf, 0xbc, 0xcc, 0xf3, 0x98, 0xfb, 0x2, 0x51, 0x1e, 0x13, 0xbc, + 0xfb, 0x16, 0x4c, 0x6a, 0x5b, 0x31, 0x6a, 0xda, 0xec, 0x1e, 0xe, 0x20, + 0x7d, 0xf7, 0x8, 0xf7, 0xe1, 0xf7, 0x3, 0x1, 0xb9, 0xf7, 0x21, 0x3, + 0xf8, 0x1a, 0xf7, 0x5e, 0x15, 0x6c, 0x85, 0x76, 0x46, 0x3b, 0x1b, 0x3c, + 0x6e, 0xc6, 0xf7, 0x5, 0xac, 0x86, 0xf7, 0x14, 0xf7, 0x5, 0xce, 0xa4, + 0x5c, 0x66, 0x92, 0x1f, 0xf7, 0x1b, 0xa4, 0x5, 0xd2, 0x77, 0x5a, 0xee, + 0xfb, 0x39, 0x1b, 0xfb, 0x59, 0x57, 0xfb, 0x28, 0xfb, 0x10, 0x31, 0xae, + 0xfb, 0x5a, 0xf7, 0x6a, 0xf7, 0x17, 0xdc, 0xc9, 0xf7, 0x18, 0xa8, 0x1f, + 0xe, 0x57, 0x7d, 0xf7, 0x2, 0x3e, 0x76, 0xf8, 0x3f, 0xf5, 0xf7, 0x4f, + 0x77, 0x12, 0xad, 0xf7, 0x24, 0xf7, 0x6d, 0xf7, 0x20, 0x13, 0x7c, 0xf8, + 0x38, 0x89, 0x15, 0xf7, 0x17, 0xf9, 0x64, 0xfb, 0x20, 0xfb, 0x97, 0x6, + 0xa2, 0x77, 0x5b, 0xbc, 0x35, 0x1b, 0xfb, 0xa, 0x22, 0x36, 0xfb, 0x4c, + 0x1f, 0x13, 0xbc, 0xfb, 0x50, 0xf6, 0x33, 0xf7, 0x7, 0xe9, 0xae, 0xb7, + 0xb7, 0xae, 0x1e, 0x13, 0x7c, 0xfb, 0x86, 0xf7, 0x50, 0x15, 0xc5, 0x98, + 0xf4, 0xf3, 0xcc, 0xbf, 0x51, 0x22, 0x1e, 0x13, 0xbc, 0x2a, 0x6a, 0x46, + 0x31, 0x5b, 0x4c, 0xb0, 0xf7, 0x15, 0x1e, 0xe, 0x20, 0x7d, 0xf7, 0x0, + 0xf7, 0x17, 0xe1, 0xf7, 0x2b, 0xf7, 0x0, 0x1, 0xa9, 0xf7, 0x28, 0xf7, + 0x64, 0xf7, 0x22, 0x3, 0xf7, 0x3c, 0xf7, 0x76, 0x15, 0xf7, 0xfc, 0x6, + 0xf7, 0x33, 0x57, 0xf7, 0x35, 0xfb, 0x5e, 0xfb, 0x3e, 0x3a, 0xfb, 0x1e, + 0xfb, 0x25, 0xfb, 0x3b, 0xf1, 0xfb, 0x2, 0xf7, 0x29, 0xf7, 0x46, 0xc3, + 0xf7, 0x12, 0xac, 0x97, 0x1e, 0xfb, 0x22, 0xa3, 0x5, 0x72, 0x83, 0x6d, + 0x59, 0x49, 0x1b, 0x3a, 0x74, 0xcf, 0xcb, 0x89, 0x1f, 0x8e, 0xe1, 0x15, + 0xce, 0xaf, 0xc6, 0xce, 0xd3, 0xb3, 0x4d, 0x4b, 0x1e, 0xe, 0x76, 0xa, + 0xf4, 0xf4, 0x1, 0xd8, 0xf7, 0x14, 0x3, 0xd8, 0x16, 0xf7, 0x14, 0xf8, + 0x2c, 0xde, 0xf7, 0x1, 0x38, 0xb0, 0x6, 0xa9, 0x8b, 0xb1, 0xbd, 0x93, + 0x9c, 0x89, 0x85, 0xa1, 0x1e, 0x9b, 0xeb, 0x5, 0x98, 0x65, 0x76, 0x8f, + 0x73, 0x1b, 0xfb, 0x21, 0x7a, 0xfb, 0x1, 0x4e, 0x1f, 0x63, 0x48, 0xfb, + 0x1, 0xce, 0x7, 0xe, 0x57, 0xfb, 0x6d, 0xf7, 0x0, 0xf7, 0x1, 0xf7, + 0x7, 0xf7, 0xd7, 0xf7, 0x0, 0x1, 0xb3, 0xf7, 0x23, 0xf7, 0x7b, 0xf7, + 0x1f, 0x3, 0xc5, 0x67, 0x15, 0xfb, 0x40, 0xf7, 0x10, 0x82, 0xf7, 0xe, + 0xf7, 0x79, 0x9f, 0xf7, 0xf, 0xf7, 0x28, 0x1e, 0xf8, 0x74, 0xfb, 0x16, + 0x40, 0x89, 0x7, 0xa3, 0x7c, 0x5c, 0xca, 0x2a, 0x1b, 0x35, 0xfb, 0x1c, + 0x55, 0xfb, 0x70, 0xfb, 0x2c, 0xde, 0xfb, 0xc, 0xf7, 0x1a, 0xca, 0xc4, + 0xae, 0xbe, 0xae, 0x1f, 0x8d, 0x3d, 0x6, 0x4d, 0x8b, 0x54, 0xfb, 0x7, + 0x50, 0x7d, 0x9c, 0xb0, 0x82, 0x1e, 0x69, 0xf7, 0xdb, 0x15, 0xb3, 0x94, + 0xf7, 0x12, 0xf5, 0xea, 0xa1, 0x29, 0x47, 0xfb, 0x1f, 0x38, 0x79, 0x66, + 0x32, 0x74, 0xdf, 0xd4, 0x1e, 0xe, 0x57, 0xa0, 0x76, 0xf8, 0x3e, 0xf4, + 0xf7, 0x4f, 0x77, 0x1, 0xcc, 0xf7, 0x20, 0xf7, 0x5d, 0x7d, 0xa, 0xcc, + 0x16, 0xf7, 0x20, 0xf7, 0x99, 0x6, 0xc4, 0x8b, 0xf7, 0x0, 0xf7, 0x6, + 0xe2, 0x8b, 0x3e, 0x33, 0x1e, 0xfb, 0x99, 0xf7, 0x20, 0xf7, 0x99, 0x7, + 0xf7, 0x44, 0x4f, 0xe9, 0xfb, 0xc, 0x6e, 0x47, 0x88, 0x40, 0x4b, 0x1e, + 0xf7, 0x9d, 0xfb, 0x20, 0x7, 0xe, 0x4c, 0xa, 0xf8, 0xa1, 0x77, 0xe9, + 0xf7, 0x12, 0x1, 0xf7, 0x22, 0x63, 0xa, 0xf8, 0xa1, 0x68, 0xa, 0xd5, + 0x4, 0xf7, 0x20, 0xf7, 0x12, 0x6d, 0xa, 0xfc, 0x15, 0xfb, 0x6a, 0xf7, + 0x16, 0xf8, 0xf5, 0x77, 0xe9, 0xf7, 0x12, 0x1, 0xf7, 0x8, 0xf7, 0x1b, + 0x3, 0xa7, 0x3b, 0x15, 0x73, 0xfb, 0xb, 0x5, 0x88, 0x97, 0xb4, 0x7f, + 0xb3, 0x1b, 0xf7, 0x22, 0x97, 0xf7, 0x9, 0xf7, 0x5, 0x1f, 0xf8, 0x91, + 0xfb, 0x1b, 0xfc, 0x89, 0x7, 0x42, 0x8c, 0x68, 0x52, 0x7c, 0x7f, 0x8e, + 0x8c, 0x86, 0x1e, 0xe3, 0xf9, 0x3b, 0x15, 0xf7, 0x1b, 0xf7, 0x12, 0xfb, + 0x1b, 0x6, 0xe, 0x20, 0x3f, 0xa, 0xd0, 0xf7, 0x21, 0x3, 0xd0, 0x16, + 0xf7, 0x21, 0xf7, 0x3b, 0x6, 0xcd, 0xcf, 0xf7, 0x1a, 0xfb, 0x7f, 0x5, + 0xf7, 0x2c, 0x6, 0xfb, 0x57, 0xf7, 0xdf, 0xf7, 0x4b, 0xf7, 0x53, 0x5, + 0xfb, 0x42, 0x6, 0xfb, 0x3a, 0xfb, 0x4c, 0x5, 0xf8, 0x10, 0xfb, 0x21, + 0x7, 0xe, 0xfc, 0x15, 0x3f, 0xa, 0xd0, 0x63, 0xa, 0xf9, 0x62, 0x6d, + 0xa, 0xf7, 0x76, 0xa0, 0x76, 0xf8, 0x4a, 0xf7, 0x0, 0x7f, 0x77, 0x12, + 0xdc, 0xf7, 0x1d, 0xf7, 0x33, 0xf7, 0x1c, 0xf7, 0x44, 0xf7, 0x1d, 0x13, + 0xdc, 0xcb, 0x16, 0xf7, 0x1d, 0xf7, 0xb1, 0x6, 0xe6, 0x9f, 0xc9, 0xe0, + 0xd3, 0x8a, 0x4f, 0x30, 0x1e, 0xfb, 0xb3, 0xf7, 0x1c, 0xf7, 0xb3, 0x7, + 0xd8, 0xa3, 0xd5, 0xda, 0xd4, 0x8b, 0x33, 0x4c, 0x1e, 0xfb, 0xb3, 0xf7, + 0x1d, 0xf7, 0xb7, 0x7, 0xc5, 0x8b, 0xf7, 0x59, 0xfb, 0x3e, 0x36, 0x59, + 0x53, 0x6f, 0x74, 0x1e, 0xa1, 0x7e, 0x69, 0xc9, 0x28, 0x1b, 0x66, 0x4d, + 0x85, 0x3d, 0x4f, 0x1f, 0x13, 0xbc, 0x89, 0xd3, 0xfb, 0x13, 0x6, 0xe, + 0x57, 0xa0, 0x76, 0xf8, 0x4a, 0xeb, 0x2b, 0xf7, 0x0, 0x12, 0x7a, 0xf7, + 0x20, 0xf7, 0xaf, 0xf7, 0x20, 0x13, 0xb8, 0xcc, 0x16, 0xf7, 0x20, 0xf7, + 0x8f, 0x6, 0xe3, 0x94, 0xee, 0xf6, 0xe0, 0x8b, 0x28, 0x33, 0x1e, 0xfb, + 0x8f, 0xf7, 0x20, 0xf7, 0x8f, 0x7, 0xf7, 0x18, 0x72, 0xf7, 0x37, 0xfb, + 0x2b, 0x55, 0x48, 0x78, 0x43, 0x57, 0x1e, 0x13, 0xd8, 0x89, 0xda, 0xfb, + 0x16, 0x6, 0xe, 0x57, 0x7d, 0xf7, 0x8, 0xf7, 0xdc, 0xf7, 0x8, 0x1, + 0xac, 0xf7, 0x23, 0xf7, 0x95, 0xf7, 0x23, 0x3, 0xad, 0xf7, 0xa1, 0x15, + 0xfb, 0x8e, 0xf7, 0x50, 0x6a, 0xde, 0xf7, 0x3e, 0xf2, 0xf7, 0x1a, 0xf7, + 0x29, 0xf7, 0x1c, 0x32, 0xf7, 0x21, 0xfb, 0x4c, 0xfb, 0x4f, 0x37, 0xfb, + 0x2a, 0xfb, 0x13, 0x1e, 0xf7, 0x23, 0x16, 0xf7, 0x5, 0xc8, 0xbb, 0xce, + 0xd3, 0xc5, 0x56, 0xfb, 0x0, 0xfb, 0xc, 0x49, 0x5c, 0x4b, 0x49, 0x4d, + 0xbf, 0xf7, 0x7, 0x1e, 0xe, 0x5a, 0xa, 0xe5, 0xf7, 0x17, 0xf7, 0x60, + 0xf7, 0x24, 0x13, 0xec, 0xf7, 0x5e, 0xc6, 0x15, 0x73, 0x9f, 0xbb, 0x59, + 0xe1, 0x1b, 0xf7, 0x9, 0xf4, 0xdf, 0xf7, 0x51, 0xf7, 0x55, 0x20, 0xea, + 0xfb, 0x6, 0x6b, 0x3f, 0x80, 0x3b, 0x55, 0x1f, 0x89, 0x6, 0x13, 0xdc, + 0xda, 0xfb, 0x17, 0xfd, 0x79, 0xf7, 0x20, 0x7, 0x8a, 0xf8, 0x65, 0x15, + 0x13, 0xec, 0xee, 0xab, 0xd7, 0xe5, 0xbb, 0xca, 0x61, 0xfb, 0x19, 0x4f, + 0x7e, 0x22, 0x24, 0x4a, 0x57, 0xc3, 0xf7, 0x1, 0x1e, 0xe, 0x5a, 0xa, + 0xad, 0xf7, 0x24, 0xf7, 0x7e, 0xf7, 0x20, 0xfb, 0x17, 0xf7, 0x17, 0x13, + 0xdc, 0xf8, 0x30, 0xc6, 0x15, 0xfb, 0x9e, 0xf7, 0x20, 0xf9, 0x79, 0x7, + 0x13, 0xda, 0xfb, 0x17, 0x3c, 0x89, 0x6, 0x13, 0xec, 0xdb, 0x55, 0x3e, + 0x96, 0x6b, 0x1b, 0xfb, 0x7, 0x20, 0x2c, 0xfb, 0x55, 0xfb, 0x51, 0xf4, + 0x37, 0xf7, 0xa, 0xe1, 0xbb, 0xbd, 0xa3, 0xa0, 0x1f, 0xfb, 0x7e, 0xf7, + 0x5b, 0x15, 0xf7, 0x19, 0xcb, 0xb5, 0xbb, 0xe5, 0xac, 0x3f, 0x28, 0xfb, + 0x1, 0x57, 0x53, 0x49, 0x24, 0x7d, 0xf4, 0xc7, 0x1e, 0xe, 0xfb, 0xa6, + 0xa0, 0x76, 0xf8, 0x37, 0xf7, 0x7, 0xfb, 0x7, 0xf7, 0x13, 0x12, 0xb9, + 0xf7, 0x12, 0xf7, 0x35, 0xb3, 0x13, 0xb8, 0xcb, 0x16, 0xf7, 0x12, 0xf7, + 0x39, 0x6, 0xf7, 0x28, 0x96, 0xf5, 0xdd, 0xa3, 0x9b, 0x7c, 0x84, 0x95, + 0x1e, 0xb3, 0xf7, 0xc, 0x5, 0x9a, 0x75, 0x62, 0x99, 0x70, 0x1b, 0x55, + 0x64, 0x66, 0x58, 0x84, 0x1f, 0x13, 0xd0, 0x89, 0xd7, 0xfb, 0x9, 0x6, + 0xe, 0x20, 0x7d, 0xf0, 0xf7, 0xfa, 0xf0, 0x1, 0xcb, 0xf7, 0x14, 0xf7, + 0x51, 0xf7, 0x1e, 0x3, 0xa9, 0xf7, 0x2b, 0x15, 0xfb, 0x2a, 0x9e, 0xf7, + 0x32, 0x7c, 0xd4, 0x1b, 0xf7, 0x40, 0xce, 0xd7, 0xdf, 0xf7, 0xa, 0x20, + 0xba, 0x2f, 0xa2, 0x1f, 0x66, 0x94, 0x21, 0x99, 0xb6, 0x1a, 0xb7, 0xcf, + 0x8c, 0xa2, 0xa4, 0xc6, 0x89, 0x4c, 0x9c, 0x1e, 0xf7, 0x17, 0xa3, 0x5, + 0xf6, 0x6d, 0x3d, 0xae, 0xfb, 0x10, 0x1b, 0xfb, 0x1, 0xfb, 0x2, 0x62, + 0xfb, 0xf, 0xfb, 0x13, 0xf6, 0x77, 0xf7, 0x32, 0x68, 0x1f, 0xab, 0x84, + 0xae, 0x7b, 0x6c, 0x1a, 0x51, 0x32, 0x8a, 0x7f, 0x5e, 0x58, 0x9a, 0xd2, + 0x7b, 0x1e, 0xe, 0x9a, 0x76, 0xf8, 0x26, 0xf3, 0xf7, 0x44, 0x77, 0x1, + 0xe4, 0xf7, 0x1a, 0x3, 0xf7, 0xc9, 0x99, 0x15, 0x7f, 0xf0, 0x5, 0x46, + 0x71, 0x75, 0x8c, 0xe5, 0x1a, 0xf7, 0x6c, 0xe6, 0xf3, 0x30, 0xf7, 0x44, + 0x7, 0xfb, 0x1a, 0x3e, 0x5, 0x28, 0x4d, 0x23, 0xc9, 0xfb, 0x6c, 0x7, + 0xfb, 0x7, 0x95, 0x44, 0xf7, 0xd, 0x99, 0xbb, 0x8d, 0x9d, 0xb7, 0x1e, + 0xe, 0x57, 0x7d, 0xf7, 0x0, 0x2b, 0xeb, 0xf8, 0x4a, 0x77, 0x12, 0xd5, + 0xf7, 0x1f, 0xf7, 0x55, 0xf7, 0x1f, 0x13, 0x78, 0xf8, 0x34, 0x89, 0x15, + 0xf7, 0x15, 0xf8, 0xaa, 0xfb, 0x1f, 0xfb, 0xbb, 0x6, 0x5c, 0x8d, 0x2b, + 0xfb, 0x7, 0x2f, 0x8f, 0xde, 0xc7, 0x1e, 0xf7, 0xbb, 0xfb, 0x1f, 0xfb, + 0xbb, 0x7, 0x13, 0xb8, 0xfb, 0x37, 0xba, 0x33, 0xf7, 0x14, 0xcf, 0xce, + 0xad, 0xc6, 0xb1, 0x1e, 0x8d, 0x6, 0xe, 0x20, 0x73, 0xa, 0x98, 0xf8, + 0xa6, 0x3, 0xf7, 0x6f, 0x16, 0xf7, 0xd, 0x6, 0xf7, 0x5f, 0xf8, 0xa8, + 0x5, 0xfb, 0x1f, 0x6, 0xfb, 0x11, 0xfb, 0xfd, 0x5, 0x8a, 0x6, 0xfb, + 0xf, 0xf7, 0xfd, 0x5, 0xfb, 0x22, 0x6, 0xe, 0xf7, 0x7, 0x73, 0xa, + 0x95, 0xf9, 0x8b, 0x3, 0xf7, 0x40, 0x16, 0xf7, 0x17, 0x6, 0xe0, 0xf7, + 0xec, 0x5, 0x8d, 0x6, 0xe1, 0xfb, 0xec, 0x5, 0xf7, 0x16, 0x6, 0xf7, + 0x37, 0xf8, 0xa8, 0x5, 0xfb, 0x19, 0x6, 0x2b, 0xfb, 0xf0, 0x6e, 0xa, + 0x38, 0xf7, 0xf0, 0x5, 0xfb, 0x17, 0x6, 0x35, 0xfb, 0xf0, 0x6e, 0xa, + 0x2d, 0xf7, 0xf0, 0x5, 0xfb, 0x18, 0x6, 0xe, 0x20, 0x73, 0xa, 0x9a, + 0xf8, 0xa2, 0x3, 0x9a, 0x16, 0xf7, 0x30, 0x6, 0xf3, 0xf7, 0x3a, 0xf2, + 0xfb, 0x3a, 0x5, 0xf7, 0x37, 0x6, 0xfb, 0x4f, 0xf7, 0xad, 0xf7, 0x3f, + 0xf7, 0x8f, 0x5, 0xfb, 0x30, 0x6, 0x2d, 0xfb, 0x25, 0x32, 0xf7, 0x25, + 0x5, 0xfb, 0x37, 0x6, 0xf7, 0x42, 0xfb, 0x95, 0x5, 0xe, 0x20, 0xfb, + 0x55, 0x76, 0xf9, 0x7e, 0x77, 0x1, 0xb6, 0x2b, 0x15, 0x97, 0xfb, 0x2, + 0x52, 0xa, 0xf7, 0x1, 0xf7, 0x12, 0xc8, 0x1f, 0xf7, 0x4a, 0xf8, 0x93, + 0x78, 0xa, 0xfc, 0xd, 0x6e, 0xa, 0xfb, 0xe, 0xf8, 0xd, 0x40, 0xa, + 0xf7, 0x58, 0xfc, 0xa8, 0x5, 0x29, 0x48, 0xa, 0xe, 0xfb, 0x37, 0x8b, + 0xf7, 0x10, 0xf7, 0xb7, 0xf7, 0x9, 0x1, 0x9f, 0x16, 0xf8, 0x60, 0xf7, + 0x10, 0xfb, 0xae, 0x6, 0xf7, 0x9e, 0xf7, 0xc8, 0x5, 0xef, 0xfc, 0x3d, + 0xfb, 0x9, 0xf7, 0x88, 0x7, 0xfb, 0x9b, 0xfb, 0xc5, 0x5, 0xe, 0x5b, + 0xa, 0xf7, 0x2a, 0xf7, 0xc, 0x14, 0xe0, 0xbb, 0xf7, 0x61, 0x15, 0xe8, + 0x94, 0x3f, 0xfb, 0x4, 0xfb, 0x2f, 0xbd, 0x51, 0xf7, 0x20, 0x1f, 0xa4, + 0xf7, 0x7, 0x6, 0x47, 0x70, 0x8e, 0xcc, 0xf7, 0x4f, 0x78, 0xbc, 0x48, + 0xb3, 0x1f, 0xca, 0xb5, 0xa2, 0xab, 0xf7, 0x5d, 0x1a, 0xcb, 0x9e, 0x90, + 0xd7, 0x1e, 0xf7, 0x7, 0x72, 0x7, 0xfb, 0x52, 0x8b, 0x32, 0xfb, 0x23, + 0xfb, 0x8, 0x7d, 0x56, 0x33, 0x1f, 0xe, 0xfc, 0x13, 0xfb, 0x5a, 0x76, + 0xfa, 0x50, 0x77, 0x1, 0xdf, 0xf7, 0x4, 0x3, 0xdf, 0xfb, 0x6f, 0x15, + 0xf7, 0x4, 0xfa, 0x50, 0x7c, 0xa, 0xe, 0x5b, 0xa, 0xf7, 0xb, 0xf7, + 0xc, 0x14, 0xe0, 0xa3, 0x3a, 0x15, 0xfb, 0x7, 0xa4, 0x7, 0xf7, 0x52, + 0x8b, 0xe4, 0xf7, 0x23, 0xf7, 0x8, 0x92, 0xc0, 0xea, 0x1f, 0xf7, 0x8, + 0x7, 0x29, 0x87, 0xd7, 0xf7, 0x4, 0xf7, 0x2f, 0x59, 0xc5, 0xfb, 0x20, + 0x1f, 0x72, 0xfb, 0x7, 0x6, 0xcf, 0xa6, 0x88, 0x4a, 0xfb, 0x4f, 0x9e, + 0x5a, 0xce, 0x63, 0x1f, 0x4c, 0x61, 0x74, 0x6b, 0xfb, 0x5d, 0x1a, 0x4b, + 0x78, 0x86, 0x3f, 0x1e, 0xe, 0x3c, 0xf7, 0x73, 0xf7, 0xc, 0x1, 0xce, + 0xf8, 0x62, 0x3, 0xc8, 0xf7, 0x37, 0x15, 0xc2, 0xbf, 0xb3, 0x91, 0xa6, + 0x1b, 0xb4, 0xae, 0x7b, 0x7b, 0xae, 0x1f, 0x7d, 0xac, 0xab, 0x7d, 0xb0, + 0x1b, 0xd0, 0xbf, 0xbc, 0x95, 0x94, 0x1f, 0xf7, 0xc, 0x7, 0x4d, 0x53, + 0x56, 0x89, 0x81, 0x1b, 0x72, 0x6b, 0x99, 0x98, 0x69, 0x1f, 0x9b, 0x64, + 0x61, 0x9c, 0x60, 0x1b, 0x76, 0x56, 0x8b, 0x4e, 0x55, 0x1f, 0xe, 0xc6, + 0x8b, 0xf7, 0xb, 0xf7, 0xa4, 0xd5, 0xf7, 0x19, 0xf7, 0xc, 0x1, 0x9f, + 0xf7, 0x93, 0x15, 0xf7, 0x1, 0x6, 0xfb, 0x2e, 0xae, 0xf7, 0x2b, 0x26, + 0xf7, 0x53, 0x1b, 0xcd, 0xc6, 0x95, 0xa0, 0xbc, 0x1f, 0xf7, 0x25, 0x7, + 0x66, 0x5f, 0x51, 0x77, 0x40, 0x1b, 0x28, 0xfb, 0xa, 0xc2, 0xdc, 0x7a, + 0x1f, 0xf8, 0xf, 0x6, 0x9e, 0xd5, 0x5, 0xfc, 0x30, 0x6, 0x9e, 0x89, + 0xa5, 0x8d, 0x9c, 0x1e, 0xf8, 0x3f, 0x6, 0x9f, 0xd5, 0x5, 0xfc, 0x46, + 0x6, 0xdb, 0x9f, 0xf7, 0xb, 0xc0, 0xef, 0x1b, 0xca, 0xba, 0x7e, 0x70, + 0xac, 0x1f, 0xae, 0xf7, 0x17, 0x5, 0x9e, 0x5b, 0x4a, 0x95, 0x4a, 0x1b, + 0xfb, 0x58, 0xfb, 0x21, 0x29, 0xfb, 0x2f, 0x64, 0x1f, 0x2e, 0x6, 0x79, + 0x41, 0x5, 0xee, 0x6, 0x8a, 0x7b, 0x8a, 0x6e, 0x8d, 0x7a, 0x8, 0x3a, + 0x6, 0xe, 0xfc, 0x15, 0xfb, 0x11, 0x76, 0x12, 0xdb, 0xf7, 0x15, 0x48, + 0xce, 0x13, 0xc0, 0xdb, 0x8a, 0x15, 0x13, 0xa0, 0xc9, 0x6, 0x89, 0x43, + 0x5c, 0x7f, 0x73, 0x83, 0xa4, 0x56, 0x18, 0xf7, 0x7, 0x45, 0xa, 0x7, + 0x13, 0xc0, 0xfb, 0x15, 0x6, 0xe, 0x20, 0xfb, 0x66, 0xf7, 0xa, 0xf8, + 0x91, 0xf4, 0xdc, 0xf7, 0x5, 0x1, 0x9b, 0x3b, 0x15, 0x71, 0xfb, 0x3, + 0x5, 0x7d, 0xb5, 0xa8, 0x86, 0xa9, 0x1b, 0xf7, 0xb, 0xb6, 0xd4, 0xd9, + 0x98, 0x1f, 0xd9, 0xf8, 0x70, 0x5, 0xe7, 0x6, 0x9c, 0xf4, 0x5, 0x2d, + 0x6, 0x90, 0xa7, 0x5, 0xb1, 0x92, 0x90, 0xa8, 0xb7, 0x1b, 0xa7, 0xa9, + 0x81, 0x87, 0x98, 0x1f, 0xa4, 0xf7, 0x5, 0x5, 0x9e, 0x52, 0x6f, 0x8d, + 0x80, 0x1b, 0xfb, 0x14, 0x67, 0x48, 0xfb, 0x28, 0x73, 0x1f, 0x30, 0x6, + 0x7a, 0x22, 0x5, 0xe6, 0x6, 0x47, 0xfc, 0x3c, 0x5, 0x4f, 0x82, 0x87, + 0x72, 0x60, 0x1b, 0x77, 0x7b, 0x8d, 0x95, 0x64, 0x1f, 0xe, 0xfb, 0x37, + 0xfb, 0x11, 0x76, 0xf7, 0x26, 0xf7, 0x13, 0x12, 0xd7, 0xf7, 0x1a, 0x46, + 0xd0, 0xe7, 0xf7, 0x1a, 0x45, 0xd1, 0x13, 0xe8, 0xf7, 0xc2, 0x16, 0x13, + 0xe4, 0xcb, 0x6, 0x98, 0xa, 0x72, 0x83, 0xa5, 0x56, 0x18, 0xf7, 0xc, + 0x61, 0xa, 0xfb, 0x76, 0xfb, 0x13, 0x15, 0x13, 0xd8, 0xcc, 0x6, 0x98, + 0xa, 0x71, 0x83, 0xa6, 0x56, 0x18, 0xf7, 0xb, 0x61, 0xa, 0xe, 0xf7, + 0xe5, 0x8b, 0x84, 0xa, 0xe7, 0xf7, 0x1f, 0xf7, 0x5b, 0xf7, 0x20, 0xf7, + 0x5b, 0xf7, 0x1f, 0x14, 0x70, 0xf9, 0x95, 0x16, 0xf7, 0x1f, 0xf7, 0x26, + 0xfb, 0x1f, 0x6, 0xfd, 0x39, 0xfb, 0x26, 0x15, 0xf7, 0x1f, 0xf7, 0x26, + 0xfb, 0x1f, 0x6, 0xf7, 0xe6, 0xfb, 0x26, 0x15, 0xf7, 0x20, 0xf7, 0x26, + 0x6d, 0xa, 0x20, 0xfb, 0x2a, 0x76, 0xf8, 0xda, 0xf7, 0x7, 0xf7, 0x54, + 0x77, 0x1, 0xf7, 0x6b, 0xf7, 0x15, 0x3, 0xf7, 0x6b, 0xfb, 0x3f, 0x15, + 0xf7, 0x15, 0xf8, 0xda, 0x74, 0xa, 0xf7, 0x54, 0xfb, 0x15, 0xfb, 0x54, + 0xfb, 0x47, 0xfb, 0x7, 0xf7, 0x47, 0x6, 0xe, 0x20, 0xfb, 0x2a, 0x76, + 0xf7, 0x3e, 0xf7, 0x7, 0xf7, 0xd3, 0xf7, 0x7, 0xf7, 0x3e, 0x77, 0x1, + 0xf7, 0x6b, 0xf7, 0x15, 0x3, 0xaf, 0x8a, 0x15, 0xf7, 0x47, 0xfb, 0x3e, + 0xf7, 0x15, 0xf7, 0x3e, 0x74, 0xa, 0xf7, 0xd3, 0x74, 0xa, 0xf7, 0x3e, + 0xfb, 0x15, 0xfb, 0x3e, 0xfb, 0x47, 0xfb, 0x7, 0xf7, 0x47, 0xfb, 0xd3, + 0xfb, 0x47, 0x6, 0xe, 0xf9, 0x39, 0xd4, 0x1, 0x81, 0xf8, 0xf0, 0x95, + 0xa, 0xd4, 0xc8, 0x42, 0x77, 0xa, 0x83, 0xa, 0xfb, 0x1b, 0x6, 0xe, + 0xf7, 0xe5, 0x78, 0xd4, 0x5a, 0x76, 0xf7, 0xab, 0xd4, 0x99, 0xd4, 0xf7, + 0x64, 0xd4, 0x91, 0x77, 0x12, 0x88, 0xeb, 0xe6, 0xeb, 0xf7, 0x1, 0xeb, + 0xe7, 0xea, 0xba, 0xeb, 0xe6, 0xeb, 0x13, 0x7b, 0xf0, 0xe8, 0xf8, 0xa8, + 0x15, 0xcc, 0x93, 0xad, 0xb0, 0xaf, 0x96, 0x6b, 0x48, 0x8a, 0x1e, 0x48, + 0x8a, 0x82, 0x61, 0x67, 0x1b, 0x66, 0x83, 0xb7, 0xcc, 0x1f, 0x2b, 0x16, + 0x51, 0x92, 0xfb, 0x10, 0xf7, 0x1a, 0xf7, 0x18, 0x95, 0xf7, 0x10, 0xc5, + 0xd1, 0x72, 0xf1, 0xfb, 0x9, 0xfb, 0x10, 0x7a, 0xfb, 0x5, 0x50, 0x1e, + 0xf7, 0x1d, 0xfc, 0xb8, 0x15, 0xec, 0x6, 0x13, 0x77, 0xf0, 0xf7, 0xc1, + 0xf9, 0x6a, 0x5, 0x2a, 0x6, 0x5d, 0xfc, 0xb2, 0x15, 0x13, 0xbb, 0xf0, + 0x50, 0x91, 0xfb, 0x14, 0xf7, 0x1b, 0xf7, 0x1c, 0x91, 0xf7, 0x1f, 0xbb, + 0xd0, 0x72, 0xee, 0xfb, 0x9, 0x71, 0xa, 0x94, 0xa9, 0xaf, 0xb2, 0x93, + 0x6d, 0x4a, 0x48, 0x83, 0x5d, 0x64, 0x67, 0x82, 0xb9, 0xce, 0x1e, 0xf7, + 0x7e, 0x16, 0x50, 0x92, 0xfb, 0x14, 0xf7, 0x1a, 0xf7, 0x1b, 0x92, 0xf7, + 0x1f, 0xbb, 0xd0, 0x73, 0xee, 0xfb, 0xa, 0x71, 0xa, 0x93, 0xa9, 0xb0, + 0xaf, 0x95, 0x6d, 0x4a, 0x4e, 0x85, 0x56, 0x63, 0x5e, 0x8b, 0xc9, 0xbf, + 0x1e, 0xe, 0x8f, 0x78, 0xf7, 0xe, 0xf8, 0x8c, 0xf7, 0xb, 0x1, 0xcc, + 0xf7, 0x21, 0xf7, 0xa9, 0xf7, 0x26, 0x3, 0xb2, 0xf7, 0x78, 0x15, 0xfb, + 0x84, 0x72, 0xa, 0xbd, 0xf7, 0x40, 0xf7, 0x45, 0xfb, 0x2a, 0xae, 0xfb, + 0x3, 0xa5, 0x1f, 0xfb, 0x9, 0xa7, 0x5e, 0x95, 0xb9, 0x1a, 0xc5, 0xda, + 0xa3, 0xb6, 0xf7, 0x8, 0x96, 0x47, 0x66, 0x91, 0x1e, 0xf7, 0x28, 0x91, + 0x5, 0xf7, 0x37, 0x85, 0xfb, 0x18, 0xc2, 0xfb, 0x23, 0x1b, 0xfb, 0x69, + 0x59, 0xfb, 0xe, 0x3c, 0xfb, 0x33, 0xf7, 0x35, 0x64, 0xd3, 0x78, 0x1f, + 0xf7, 0x1a, 0x6b, 0xbe, 0x7e, 0x4f, 0x1a, 0x5c, 0x61, 0x56, 0x25, 0xfb, + 0x18, 0x78, 0xf0, 0xb0, 0x84, 0x1e, 0xe3, 0xf8, 0xbd, 0x15, 0xf7, 0x14, + 0x6, 0xf4, 0xf7, 0x22, 0x5, 0xfb, 0x5, 0x6, 0x56, 0x41, 0x51, 0xd5, + 0x5, 0x7c, 0xa, 0xe, 0x5d, 0xa, 0xf7, 0x49, 0xd7, 0x15, 0xd0, 0x6, + 0x39, 0xf7, 0x64, 0xdd, 0xf7, 0x5c, 0x5, 0x46, 0x6, 0x29, 0xfb, 0x5c, + 0x5, 0xe, 0xf7, 0xe5, 0x78, 0xf7, 0x13, 0xfb, 0x7, 0xf7, 0x10, 0xf7, + 0x59, 0xf7, 0x10, 0xf7, 0x37, 0xf7, 0x10, 0xfb, 0x7, 0xf7, 0x13, 0x12, + 0xb0, 0xf7, 0x27, 0xf7, 0xcd, 0xf7, 0x19, 0x13, 0x76, 0xf8, 0x8e, 0x84, + 0x15, 0xf8, 0x5b, 0xf7, 0x10, 0xfb, 0xdf, 0xf7, 0x59, 0xf7, 0xad, 0xf7, + 0x10, 0xfb, 0xad, 0xf7, 0x37, 0xf7, 0xd1, 0xf7, 0x10, 0xfc, 0x4d, 0x3a, + 0x89, 0x6, 0x13, 0xae, 0xc2, 0x64, 0x5e, 0xb1, 0x37, 0x1b, 0xfb, 0x48, + 0xfb, 0xb, 0xfb, 0x26, 0xfb, 0x71, 0xfb, 0x7c, 0xeb, 0xfb, 0x31, 0xf7, + 0x55, 0xc0, 0xdb, 0x99, 0xdf, 0xba, 0x1f, 0x13, 0x6e, 0xfb, 0xd6, 0xf7, + 0xb7, 0x15, 0xf7, 0x21, 0xaf, 0xee, 0xf7, 0x8, 0xf7, 0x0, 0xc0, 0x3c, + 0xfb, 0x35, 0x1e, 0x13, 0xb6, 0xfb, 0x5b, 0x3d, 0x4c, 0x2e, 0x29, 0x5f, + 0xcf, 0xf7, 0x56, 0x1e, 0xe, 0xfc, 0x15, 0xf8, 0x6f, 0x76, 0xf7, 0xa5, + 0x77, 0x12, 0xd0, 0xf7, 0x15, 0x17, 0xd0, 0xf8, 0x5a, 0x15, 0xf7, 0x15, + 0xf7, 0x10, 0x6, 0x13, 0xe0, 0x4d, 0x6, 0x8d, 0xd4, 0xba, 0x9a, 0xa3, + 0x93, 0x72, 0xc0, 0x18, 0xfb, 0x7, 0x62, 0x8b, 0x35, 0x51, 0x1a, 0xe, + 0xfc, 0x15, 0xf8, 0x66, 0x76, 0xf7, 0xa5, 0x77, 0x12, 0xdb, 0xf7, 0x15, + 0x48, 0xce, 0x13, 0xe0, 0xe9, 0xf8, 0x51, 0x15, 0xf7, 0x7, 0x45, 0xa, + 0xfb, 0x15, 0xfb, 0x13, 0x7, 0x13, 0xd0, 0xc9, 0x6, 0x89, 0x42, 0x5c, + 0x7f, 0x73, 0x83, 0x8, 0xe, 0xfb, 0x37, 0xf8, 0x5a, 0xf7, 0x10, 0xf7, + 0x29, 0x77, 0x12, 0xcb, 0xd1, 0x45, 0xf7, 0x1a, 0xe7, 0xd0, 0x46, 0xf7, + 0x1a, 0x13, 0xd8, 0xcb, 0xf8, 0x5a, 0x15, 0xf7, 0x1a, 0xf7, 0x10, 0x6, + 0x13, 0xd4, 0x4b, 0x6, 0x8d, 0xd4, 0xbc, 0x9a, 0xa4, 0x93, 0x71, 0xc0, + 0x18, 0xfb, 0xc, 0x62, 0x8b, 0x34, 0x52, 0x1a, 0xf7, 0x76, 0x33, 0x15, + 0xf7, 0x1a, 0xf7, 0x10, 0x6, 0x13, 0xe4, 0x4a, 0x6, 0x8d, 0xd4, 0xbc, + 0x9a, 0xa5, 0x93, 0x70, 0xc0, 0x18, 0xfb, 0xb, 0x62, 0x8b, 0x34, 0x52, + 0x1a, 0xe, 0xfb, 0x37, 0xf8, 0x66, 0x76, 0xf7, 0x26, 0xf7, 0x13, 0x1, + 0xd7, 0xf7, 0x1a, 0xe7, 0xf7, 0x1a, 0x3, 0xf7, 0xd0, 0xf8, 0x51, 0x15, + 0xf7, 0xc, 0x45, 0xa, 0xfb, 0x1a, 0xfb, 0x13, 0xcb, 0x7, 0x98, 0xa, + 0x72, 0x83, 0x8, 0xfb, 0x5b, 0x56, 0x15, 0xf7, 0xb, 0x45, 0xa, 0xfb, + 0x1a, 0xfb, 0x13, 0xcc, 0x7, 0x98, 0xa, 0x71, 0x83, 0x8, 0xe, 0xfb, + 0xcd, 0xf7, 0x6b, 0x76, 0xf7, 0xde, 0x77, 0x1, 0x95, 0xf7, 0xde, 0x3, + 0x95, 0xf7, 0xfb, 0x15, 0x30, 0xd5, 0x41, 0xe5, 0xe6, 0xd6, 0xd4, 0xe7, + 0xe8, 0x40, 0xd3, 0x30, 0x30, 0x42, 0x42, 0x2f, 0x1e, 0xe, 0x20, 0xf7, + 0x77, 0xf5, 0x1, 0xf7, 0x77, 0x4, 0xf8, 0xc0, 0xf5, 0xfc, 0xc0, 0x6, + 0xe, 0xf7, 0xe5, 0xf7, 0x77, 0xf5, 0x1, 0xf7, 0x77, 0x4, 0xfa, 0x7c, + 0xf5, 0xfe, 0x7c, 0x6, 0xe, 0xf8, 0xf8, 0xf7, 0x11, 0x21, 0x76, 0xb7, + 0xde, 0x8a, 0x77, 0x12, 0x13, 0x60, 0x7a, 0xf8, 0xf6, 0x15, 0xcf, 0x65, + 0xa, 0xab, 0xaf, 0x1b, 0xab, 0xa6, 0x81, 0x80, 0xa6, 0x1f, 0x13, 0x80, + 0x81, 0xa6, 0xa5, 0x80, 0xa8, 0x1b, 0xe9, 0x8b, 0xee, 0xa5, 0x1f, 0x46, + 0x7a, 0xa, 0x6d, 0x66, 0x1b, 0x7f, 0x71, 0x95, 0x96, 0x6d, 0x1f, 0x13, + 0x50, 0x96, 0x6d, 0x69, 0x96, 0x71, 0x1b, 0x44, 0x71, 0x59, 0x3f, 0x1f, + 0xe, 0xf7, 0xe5, 0xf7, 0xdb, 0x76, 0xf7, 0xe7, 0xd4, 0x1, 0xf7, 0x5b, + 0xe3, 0xf7, 0x54, 0xdf, 0xf7, 0xca, 0xde, 0x3, 0xf7, 0x5b, 0xf7, 0xc6, + 0x15, 0xe3, 0xf7, 0xe7, 0xf7, 0x2b, 0xd4, 0xfc, 0x1e, 0x42, 0xf7, 0x2f, + 0x6, 0xf7, 0xac, 0xfb, 0xe7, 0x15, 0xdf, 0xf7, 0xdc, 0x8d, 0x6, 0xf7, + 0x5, 0xfb, 0xdc, 0x5, 0xda, 0x6, 0xf7, 0x5, 0xf7, 0xdc, 0x5, 0x8e, + 0xfb, 0xdc, 0xde, 0xf8, 0x30, 0xfb, 0x1e, 0x6, 0x28, 0xfb, 0xaf, 0x6e, + 0xa, 0x27, 0xf7, 0xaf, 0x5, 0x81, 0xa, 0x20, 0x7d, 0xed, 0xf8, 0xa1, + 0xf7, 0x21, 0x1, 0xbc, 0xf7, 0x15, 0xf7, 0x5f, 0xf7, 0x1e, 0x3, 0xa9, + 0xf7, 0x26, 0x15, 0xfb, 0x1c, 0x9e, 0xf7, 0x33, 0x73, 0xd4, 0x1b, 0xf7, + 0x40, 0xcd, 0xe8, 0xdc, 0xf7, 0x6, 0x22, 0xa6, 0x2e, 0xa1, 0x1f, 0x66, + 0x94, 0x21, 0x98, 0xb5, 0x1a, 0xb5, 0xd2, 0x8c, 0xa2, 0xa4, 0xc3, 0x89, + 0x4e, 0x9c, 0x1e, 0xf7, 0x18, 0xa3, 0x5, 0xf2, 0x6d, 0x3d, 0xad, 0xfb, + 0x11, 0x1b, 0xfb, 0x2, 0xfb, 0x2, 0x63, 0xfb, 0xb, 0xfb, 0xf, 0xf2, + 0x75, 0xf7, 0x33, 0x69, 0x1f, 0xab, 0x84, 0xb1, 0x7f, 0x6d, 0x1a, 0x53, + 0x33, 0x8a, 0x7f, 0x5e, 0x58, 0x99, 0xd0, 0x7a, 0x1e, 0xb5, 0xf8, 0x4e, + 0x15, 0xf7, 0x14, 0x6, 0xf3, 0xf7, 0x21, 0x5, 0x7c, 0xa, 0x56, 0x42, + 0x51, 0xd4, 0x5, 0xfb, 0x3, 0x6, 0xe, 0x5d, 0xa, 0xde, 0xd7, 0x15, + 0xcf, 0x6, 0xee, 0xf7, 0x5f, 0x28, 0xf7, 0x61, 0x5, 0x47, 0x6, 0xdc, + 0xfb, 0x61, 0x5, 0xe, 0xf7, 0xad, 0x7d, 0xf7, 0x0, 0xfb, 0x0, 0xf7, + 0x8, 0xf7, 0xf, 0xe4, 0xf7, 0x8, 0xf7, 0x8, 0x24, 0xf2, 0x12, 0xad, + 0xf7, 0x24, 0xf7, 0x8b, 0xf7, 0x1f, 0x13, 0xb6, 0xf8, 0x7c, 0xc7, 0x15, + 0x41, 0xd4, 0xe3, 0x8b, 0x9c, 0x1b, 0xe4, 0xf7, 0x3, 0xb1, 0xf7, 0x10, + 0xb2, 0x1f, 0xfb, 0x1c, 0xa2, 0x5, 0x6f, 0x81, 0x70, 0x5a, 0x49, 0x1b, + 0x4b, 0x6a, 0xbb, 0xde, 0x86, 0x1f, 0xf7, 0xf0, 0x6, 0xf7, 0x82, 0x29, + 0xde, 0xfb, 0x28, 0xfb, 0x0, 0x57, 0x52, 0x7a, 0x7a, 0x1e, 0xd0, 0x46, + 0x35, 0x90, 0x6c, 0x1b, 0xfb, 0x4c, 0x36, 0xfb, 0x18, 0xfb, 0x24, 0xfb, + 0x20, 0xe7, 0xfb, 0x24, 0xf7, 0x45, 0xef, 0xc5, 0xbc, 0xa4, 0xa6, 0x1f, + 0xfb, 0xca, 0xf7, 0x66, 0x15, 0xf7, 0xc, 0xc0, 0xb3, 0xd3, 0xce, 0xc2, + 0x53, 0x23, 0x1e, 0x13, 0x6e, 0xfb, 0x2c, 0x2e, 0x7b, 0x6e, 0x2c, 0x6d, + 0xf7, 0x8, 0xbf, 0x1e, 0xf8, 0x17, 0xb7, 0x15, 0xa6, 0x8d, 0x91, 0xf1, + 0xe8, 0x1b, 0xf0, 0x94, 0xfb, 0x0, 0x76, 0x8c, 0x1f, 0xe, 0x8f, 0xa0, + 0x76, 0xf9, 0xb2, 0xf7, 0x9, 0x12, 0xf7, 0x45, 0xf7, 0x5, 0x72, 0xf7, + 0x1d, 0x73, 0xf7, 0x5, 0x13, 0xd0, 0x70, 0xa, 0xf8, 0x33, 0x4f, 0xa, + 0xfc, 0x32, 0x5, 0x13, 0xe8, 0x33, 0xf8, 0x85, 0x8b, 0xa, 0xf7, 0x5d, + 0xfb, 0x9, 0x8b, 0xa, 0xe, 0xfb, 0x39, 0x76, 0xf8, 0xd9, 0xf7, 0x1d, + 0x12, 0xe5, 0xf7, 0x2e, 0xfb, 0x28, 0xf7, 0x22, 0x13, 0xd0, 0xeb, 0xf8, + 0x1f, 0x15, 0xf7, 0x22, 0xf7, 0x1d, 0xfb, 0x22, 0x6, 0x13, 0xe0, 0x85, + 0xfc, 0xba, 0x15, 0xfb, 0x3c, 0xf7, 0x2e, 0xf7, 0x3c, 0x7, 0x65, 0xf8, + 0x0, 0x5, 0x38, 0x6, 0xe, 0x20, 0x2a, 0x76, 0xf3, 0xf7, 0x1, 0xf7, + 0xcf, 0xf5, 0xf7, 0x4, 0x77, 0x1, 0xad, 0xf7, 0x1a, 0x3, 0xf7, 0x42, + 0x90, 0x15, 0x6c, 0x21, 0xc6, 0x7a, 0xab, 0xf7, 0x0, 0x5, 0x89, 0x94, + 0x9b, 0x89, 0xa4, 0x1b, 0xf7, 0x18, 0xdb, 0xc8, 0xf7, 0xe, 0xa7, 0x1f, + 0xfb, 0x1b, 0xa2, 0x5, 0x6e, 0x86, 0x77, 0x47, 0x3b, 0x1b, 0x7f, 0x8a, + 0x8c, 0x8c, 0x87, 0x1f, 0xe5, 0xf7, 0xb4, 0x9d, 0x78, 0x90, 0x74, 0x8d, + 0x7f, 0x19, 0xf7, 0x1b, 0xa2, 0x70, 0xe8, 0x58, 0xad, 0x5c, 0x9d, 0x19, + 0xb2, 0xf7, 0x4, 0x4f, 0x9c, 0x64, 0xfb, 0x7, 0x5, 0x8c, 0x81, 0x7d, + 0x8d, 0x75, 0x1b, 0xfb, 0x62, 0x5d, 0xfb, 0x35, 0x25, 0x3a, 0xb7, 0xfb, + 0x25, 0xeb, 0x75, 0x1f, 0xb1, 0xf7, 0xc, 0x15, 0x67, 0xb4, 0x83, 0xce, + 0x9f, 0x1a, 0xab, 0x92, 0xf7, 0x1c, 0xf7, 0x11, 0x80, 0x1e, 0xe, 0x20, + 0x7b, 0xf7, 0xf, 0xf7, 0x50, 0xf7, 0x1, 0xf7, 0x62, 0xf7, 0x0, 0x1, + 0xdd, 0xf7, 0x14, 0x3, 0xd9, 0x7b, 0x15, 0x9b, 0xa2, 0xb0, 0xa5, 0xc3, + 0x1b, 0xab, 0xb8, 0x82, 0x81, 0xb4, 0x1f, 0x80, 0xb9, 0xb4, 0x7f, 0x97, + 0x1b, 0xbc, 0xbd, 0x9d, 0x9c, 0xaa, 0x1f, 0x58, 0xf7, 0x7, 0x5, 0x81, + 0x74, 0x67, 0x7a, 0x66, 0x1b, 0x72, 0x79, 0x92, 0x92, 0x75, 0x1f, 0x91, + 0x77, 0x73, 0x91, 0x67, 0x1b, 0x83, 0x6c, 0x8b, 0x7d, 0x73, 0x1f, 0x89, + 0x8d, 0xb1, 0xb4, 0xb4, 0xbd, 0x83, 0xde, 0x19, 0xf7, 0x11, 0xf7, 0x1, + 0xfb, 0x27, 0x6, 0x82, 0xa4, 0x7d, 0xc2, 0xae, 0x1a, 0xb2, 0xa5, 0xbf, + 0xc8, 0xd4, 0x98, 0x42, 0x73, 0x90, 0x1e, 0xf7, 0x13, 0x9e, 0x5, 0xf7, + 0x3f, 0x73, 0xfb, 0x1b, 0x9a, 0x50, 0x1b, 0xfb, 0x1c, 0x3c, 0x2e, 0x22, + 0x7e, 0x8c, 0x5a, 0x9d, 0x55, 0x1f, 0x42, 0xfb, 0x1, 0xec, 0x6, 0x98, + 0x3d, 0x5b, 0x45, 0x4d, 0x5d, 0x8, 0xe, 0x20, 0xec, 0x76, 0xb5, 0xf7, + 0x16, 0xf7, 0x6c, 0xf7, 0x16, 0xb5, 0x77, 0x1, 0xb2, 0xf7, 0x17, 0xf7, + 0x6e, 0xf7, 0x16, 0x3, 0xe6, 0xd8, 0x15, 0xd2, 0xd2, 0x5, 0x78, 0xae, + 0xb3, 0x80, 0xb4, 0x1b, 0xb7, 0xb5, 0x97, 0x9e, 0xaa, 0x1f, 0xd5, 0x42, + 0xe5, 0xe6, 0x43, 0xd3, 0x5, 0x9e, 0xae, 0x97, 0xb3, 0xb5, 0x1a, 0xab, + 0x83, 0xb5, 0x74, 0xb6, 0x1e, 0xd3, 0xd3, 0x30, 0xe6, 0x42, 0x42, 0x5, + 0x95, 0x78, 0x66, 0xa0, 0x4e, 0x1b, 0x4e, 0x63, 0x76, 0x81, 0x7a, 0x1f, + 0x42, 0xd4, 0x31, 0x2b, 0xd2, 0x46, 0x5, 0x78, 0x68, 0x81, 0x64, 0x62, + 0x1a, 0x71, 0x8f, 0x60, 0xa6, 0x5b, 0x1e, 0x44, 0x45, 0x5, 0xf7, 0x3f, + 0xf7, 0x4f, 0x15, 0xc7, 0xbb, 0xbb, 0xc7, 0xc7, 0xbd, 0x5b, 0x4f, 0x4f, + 0x59, 0x5b, 0x4f, 0x4f, 0x5b, 0xbb, 0xc7, 0x1e, 0xe, 0x20, 0xa0, 0x76, + 0xf9, 0x4e, 0x77, 0x1, 0xf7, 0x61, 0xf7, 0x23, 0x3, 0x9b, 0xf7, 0x2a, + 0x15, 0xf7, 0x51, 0xfb, 0x2a, 0xf7, 0x23, 0xf7, 0x2a, 0xf7, 0x54, 0xf5, + 0xfb, 0x54, 0xd0, 0xf7, 0x54, 0xf5, 0xfb, 0xa, 0x6, 0xf7, 0x23, 0xf7, + 0x9f, 0x96, 0xa, 0xfb, 0x16, 0xfb, 0xa0, 0x6e, 0xa, 0xfb, 0x14, 0xf7, + 0xa0, 0x96, 0xa, 0xf7, 0x22, 0xfb, 0x9f, 0x5, 0xfb, 0x9, 0x21, 0xf7, + 0x51, 0x46, 0xfb, 0x51, 0x6, 0xe, 0xfc, 0x13, 0x8d, 0x76, 0xf9, 0x88, + 0x77, 0x1, 0xdf, 0xf7, 0x4, 0x3, 0xdf, 0x78, 0x15, 0xf7, 0x4, 0xf7, + 0xcb, 0x7c, 0xa, 0xf7, 0x1b, 0x4, 0xf7, 0x4, 0xf7, 0xca, 0x7c, 0xa, + 0xe, 0x20, 0xfb, 0x4c, 0xf1, 0xf9, 0x57, 0xf1, 0x12, 0xad, 0xf7, 0x10, + 0x38, 0xf7, 0x1c, 0xf7, 0x27, 0xf7, 0x1a, 0x32, 0xf7, 0xb, 0x13, 0xe8, + 0xc8, 0x7f, 0x15, 0xfb, 0x7, 0x9b, 0xe6, 0x52, 0xf7, 0x8, 0x1b, 0xf7, + 0x2d, 0xc2, 0xe3, 0xd7, 0xaf, 0x7e, 0xb7, 0x5e, 0xb5, 0x1f, 0x13, 0xd4, + 0xa9, 0x9e, 0xc5, 0xb7, 0xe0, 0x1a, 0xd0, 0x67, 0xc0, 0x23, 0xcd, 0x1e, + 0x57, 0xab, 0xfb, 0xb, 0xcb, 0xba, 0x1a, 0x9f, 0x95, 0xa3, 0xbb, 0xba, + 0xaa, 0x71, 0x5d, 0x8d, 0x1e, 0xf7, 0x19, 0x9a, 0x5, 0xc5, 0x83, 0x60, + 0xf0, 0xfb, 0x36, 0x1b, 0xfb, 0xe, 0x43, 0x49, 0x35, 0x53, 0xad, 0x67, + 0x99, 0x7c, 0x1f, 0x13, 0xe8, 0x44, 0x61, 0x79, 0x48, 0x60, 0x1a, 0x24, + 0xb6, 0x6d, 0xf7, 0x1e, 0x36, 0x1e, 0xbd, 0x6c, 0xe8, 0x5f, 0x59, 0x1a, + 0x65, 0x63, 0x7a, 0x69, 0x4c, 0x77, 0xb8, 0xb3, 0x83, 0x1e, 0xf7, 0x3c, + 0xf7, 0x30, 0x15, 0xfb, 0x1f, 0xe7, 0x5, 0x61, 0xa8, 0x75, 0xa8, 0xac, + 0x1a, 0xaf, 0xa9, 0xa3, 0x96, 0x90, 0x1e, 0xf7, 0x18, 0x2d, 0x5, 0x13, + 0xe4, 0xb8, 0x6a, 0xa6, 0x78, 0x6b, 0x1a, 0x72, 0x7a, 0x75, 0x72, 0x74, + 0x1e, 0xe, 0xf8, 0xfa, 0xf7, 0x7, 0x1, 0x91, 0xf7, 0x7, 0xe6, 0xf7, + 0x7, 0x3, 0x91, 0x44, 0xa, 0xe, 0xd5, 0x78, 0xd6, 0xe7, 0xd2, 0xf7, + 0xab, 0xd2, 0xe8, 0xd6, 0x1, 0x80, 0xd6, 0xf7, 0xb, 0xe2, 0xf8, 0x28, + 0xd6, 0x3, 0xcb, 0xf7, 0xfb, 0x15, 0xf7, 0x3c, 0xf7, 0x1d, 0xf7, 0x1b, + 0xf7, 0x3d, 0x58, 0xa, 0xfb, 0x3d, 0xfb, 0x1d, 0xf7, 0x1b, 0xf7, 0x3c, + 0x1e, 0xf8, 0x22, 0x53, 0x15, 0x76, 0x84, 0x78, 0x4c, 0x45, 0x1b, 0x5e, + 0x58, 0xad, 0xf5, 0xbd, 0x99, 0xe4, 0xe4, 0xc9, 0x9e, 0x5b, 0x77, 0x92, + 0x1f, 0xdb, 0x9e, 0x5, 0xaf, 0x7e, 0x66, 0xdf, 0xfb, 0xa, 0x1b, 0xfb, + 0x10, 0x49, 0x36, 0xfb, 0x11, 0xfb, 0x2f, 0xeb, 0x53, 0xe2, 0xcc, 0xdc, + 0xa9, 0xed, 0xa8, 0x1f, 0xfc, 0xbc, 0xde, 0x15, 0xfb, 0x65, 0xf7, 0x3e, + 0xfb, 0x3d, 0xf7, 0x67, 0x57, 0xa, 0xfb, 0x67, 0x80, 0xa, 0xfb, 0xb9, + 0xf7, 0xa8, 0xe7, 0xf7, 0xa5, 0xeb, 0x1, 0xa1, 0xef, 0xf7, 0x4, 0xed, + 0x3, 0xf7, 0x93, 0xf7, 0xb3, 0x15, 0xe7, 0x6, 0x7c, 0xaf, 0x8b, 0xa0, + 0xd3, 0x1a, 0xf7, 0x27, 0x7, 0xf0, 0x8b, 0xd4, 0xfb, 0x29, 0x3a, 0x5a, + 0x6b, 0x2f, 0x7a, 0x1e, 0xe6, 0x73, 0x5, 0x8c, 0x8d, 0x8f, 0x8c, 0x8e, + 0x1e, 0xa5, 0x93, 0x93, 0x9d, 0xb1, 0x1b, 0xba, 0x8c, 0x79, 0x5a, 0x8d, + 0x1f, 0x78, 0x83, 0x73, 0x85, 0x79, 0x86, 0x8, 0x35, 0x74, 0x4a, 0x7f, + 0xfb, 0x0, 0x1a, 0x41, 0xb5, 0x4d, 0xd6, 0xc1, 0xaf, 0xae, 0x9e, 0x9a, + 0x1e, 0x8d, 0x80, 0x8e, 0x7b, 0x91, 0x7b, 0x8, 0x76, 0xf7, 0x62, 0x15, + 0x72, 0x7, 0x30, 0x5a, 0x82, 0x7c, 0x69, 0x7d, 0xa4, 0x9e, 0xb3, 0xaa, + 0x9a, 0xbd, 0x97, 0x1e, 0x9f, 0x90, 0x8f, 0x8f, 0x92, 0x90, 0x8, 0xe, + 0x20, 0x5d, 0xa, 0xf8, 0x10, 0xd7, 0x53, 0xa, 0x61, 0xfb, 0x64, 0x53, + 0xa, 0xe, 0x3c, 0xf7, 0x15, 0x76, 0x1, 0xf8, 0x20, 0xf7, 0x13, 0x3, + 0xb3, 0xf7, 0xc6, 0x15, 0xf7, 0xf9, 0xfb, 0x5a, 0xf7, 0x13, 0xf7, 0xcb, + 0xfc, 0x78, 0x6, 0xe, 0x3c, 0xf7, 0x59, 0xf7, 0x4, 0x1, 0xb3, 0xf7, + 0x59, 0x15, 0xf8, 0x8c, 0xf7, 0x4, 0xfc, 0x8c, 0x6, 0xe, 0xd5, 0x78, + 0xd6, 0xf7, 0x9e, 0xca, 0xf7, 0x1, 0xcb, 0xf3, 0xd6, 0x1, 0x80, 0xd6, + 0xf7, 0x19, 0xdc, 0xf7, 0x32, 0xe2, 0xf7, 0x2a, 0xd6, 0x3, 0xf7, 0x59, + 0xf7, 0x31, 0x15, 0xdc, 0xf7, 0x39, 0xab, 0x6, 0xb4, 0x9e, 0x85, 0x2e, + 0xbb, 0x1f, 0xa7, 0x49, 0x5, 0xf0, 0x6, 0x5c, 0xdc, 0x67, 0xc7, 0x7f, + 0x9f, 0x66, 0x99, 0x19, 0x8d, 0x7, 0xdd, 0x96, 0xa5, 0xc3, 0xb8, 0x1a, + 0xf0, 0x34, 0x96, 0xfb, 0x13, 0x1e, 0x7c, 0xa, 0xdc, 0xfb, 0x41, 0x15, + 0xf7, 0x1, 0xac, 0x7, 0xd2, 0xc1, 0x8b, 0x56, 0x53, 0x57, 0x8b, 0x42, + 0x1f, 0xfb, 0x8b, 0x71, 0x15, 0xf7, 0x3c, 0xf7, 0x1d, 0xf7, 0x1b, 0xf7, + 0x3c, 0x58, 0xa, 0xfb, 0x3c, 0xfb, 0x1d, 0xf7, 0x1b, 0xf7, 0x3c, 0x1e, + 0x40, 0x16, 0xfb, 0x65, 0xf7, 0x3e, 0xfb, 0x3d, 0xf7, 0x66, 0x57, 0xa, + 0xfb, 0x66, 0x80, 0xa, 0xf8, 0xf0, 0xd5, 0x1, 0x85, 0xf7, 0xed, 0x3, + 0x85, 0xf8, 0xf0, 0x15, 0xf7, 0xed, 0xd5, 0xfb, 0xed, 0x6, 0xe, 0xfb, + 0x9b, 0xf8, 0x3e, 0xd6, 0xf7, 0x1c, 0xd6, 0x1, 0xc4, 0xd5, 0xf7, 0x1e, + 0xd5, 0x3, 0xc4, 0xf8, 0xcf, 0x15, 0x3b, 0xca, 0x4a, 0xda, 0xda, 0xcc, + 0xcc, 0xdb, 0xdb, 0x4a, 0xc8, 0x3c, 0x3c, 0x4c, 0x4e, 0x3b, 0x1e, 0xd5, + 0x8a, 0x15, 0xb1, 0xaa, 0xa8, 0xb1, 0xb1, 0xaa, 0x6f, 0x64, 0x65, 0x6c, + 0x6c, 0x65, 0x65, 0x6c, 0xaa, 0xb1, 0x1e, 0xe, 0x3c, 0x8b, 0xe6, 0xf7, + 0x42, 0xf7, 0x6, 0xf7, 0x13, 0x90, 0xa, 0x16, 0xf8, 0x8c, 0xe6, 0xfc, + 0x8c, 0x6, 0xf7, 0x50, 0xb7, 0x15, 0xf7, 0x13, 0xf7, 0x16, 0xf7, 0x51, + 0xf7, 0x6, 0xfb, 0x51, 0xf7, 0x13, 0xfb, 0x13, 0xfb, 0x13, 0xfb, 0x50, + 0xfb, 0x6, 0xf7, 0x50, 0x6, 0xe, 0xf7, 0xaf, 0xdc, 0xf7, 0x9d, 0xdc, + 0x1, 0xf7, 0x76, 0xed, 0x3, 0x94, 0xf7, 0xaf, 0x15, 0xf7, 0xcf, 0xdc, + 0xfb, 0x46, 0x6, 0xf7, 0x9, 0xe4, 0xc8, 0xbc, 0xdc, 0x1a, 0xbd, 0x64, + 0xd8, 0xfb, 0x4, 0xfb, 0x21, 0x83, 0x27, 0x67, 0x87, 0x1e, 0xed, 0x82, + 0x5, 0xa7, 0x8d, 0x90, 0xaf, 0xbb, 0x1b, 0x92, 0xb9, 0x8b, 0x5d, 0x67, + 0x73, 0x78, 0x4b, 0x54, 0x1f, 0x28, 0x36, 0x6d, 0x69, 0x44, 0x1a, 0xe, + 0xf7, 0xa3, 0xdd, 0xf7, 0xa7, 0xdd, 0x1, 0xf7, 0x61, 0xee, 0x3, 0x93, + 0xf8, 0x27, 0x15, 0xfb, 0xf, 0x9a, 0xf7, 0x2, 0x82, 0xab, 0x1b, 0xe9, + 0xce, 0xca, 0xd6, 0xbd, 0x70, 0xae, 0x5e, 0x9d, 0x1f, 0xad, 0xa1, 0x9b, + 0xa6, 0xa9, 0x1a, 0xc8, 0x53, 0xc5, 0x34, 0xfb, 0xe, 0x7b, 0x37, 0x63, + 0x82, 0x1e, 0xea, 0x7d, 0x5, 0xa0, 0x8d, 0x8f, 0xae, 0xb9, 0x1b, 0x9e, + 0xa4, 0x83, 0x6e, 0x5c, 0x50, 0x8c, 0x7d, 0x1f, 0x7f, 0x38, 0x5, 0xb8, + 0x9f, 0xc5, 0x79, 0x54, 0x1a, 0x6f, 0x7a, 0x6f, 0x62, 0x57, 0x87, 0xb5, + 0x9d, 0x87, 0x1e, 0xe, 0xf8, 0xf0, 0x84, 0xa, 0xf7, 0x0, 0xf8, 0xf0, + 0x15, 0xed, 0x6, 0xf7, 0x2a, 0x83, 0xa, 0xfb, 0x40, 0x6, 0xe, 0x57, + 0xfb, 0x4e, 0x76, 0xf7, 0x53, 0xf7, 0x5, 0x27, 0xef, 0xf8, 0x47, 0x77, + 0x49, 0xa, 0x13, 0xdc, 0xf7, 0x61, 0xc9, 0x15, 0x8d, 0x6, 0x68, 0x9c, + 0x9e, 0x60, 0xcb, 0x1b, 0xbc, 0xb1, 0xaf, 0xb5, 0xa0, 0x1f, 0x8d, 0x6, + 0x13, 0xbc, 0x4a, 0xf7, 0x14, 0xf8, 0xab, 0xfb, 0x1f, 0xfb, 0x87, 0x7, + 0x3e, 0x87, 0xfb, 0x7, 0x2c, 0x2c, 0x84, 0xf7, 0x8, 0xd9, 0x1e, 0xf7, + 0x85, 0xfb, 0x1f, 0xfd, 0x77, 0xf7, 0x1f, 0x7, 0xe, 0x20, 0xfb, 0x3e, + 0x76, 0xf9, 0x92, 0xf7, 0x11, 0x1, 0xf8, 0x6, 0xf7, 0x6, 0x3, 0xf7, + 0x4a, 0xfb, 0x53, 0x15, 0xf7, 0x7, 0xf9, 0x92, 0xd4, 0xfd, 0x92, 0xf7, + 0x6, 0xf9, 0x92, 0xc2, 0xf7, 0x11, 0xfb, 0xb4, 0x6, 0xfb, 0x2e, 0x22, + 0x5f, 0xfb, 0x2d, 0x5a, 0xa1, 0xfb, 0x27, 0xf7, 0x3c, 0x1f, 0xe, 0xfc, + 0x15, 0xf7, 0x40, 0xf7, 0x36, 0x1, 0xf7, 0x8, 0xf7, 0x36, 0x3, 0xc5, + 0xf7, 0x40, 0x15, 0xf7, 0x36, 0xf7, 0x36, 0xfb, 0x36, 0x6, 0xe, 0xfb, + 0x78, 0xd0, 0xee, 0xc7, 0x1, 0xc6, 0x7c, 0x15, 0x7f, 0x54, 0x5, 0x90, + 0x99, 0xa3, 0x90, 0x9f, 0x1b, 0xba, 0x94, 0x6e, 0x79, 0x69, 0x6e, 0x79, + 0x60, 0x67, 0x71, 0x8e, 0x8f, 0x76, 0x1f, 0x48, 0x7, 0x84, 0xa1, 0xb7, + 0x89, 0x9e, 0x1b, 0xd5, 0xdb, 0xac, 0xe5, 0xd2, 0x57, 0xad, 0x4f, 0x7a, + 0x69, 0x86, 0x81, 0x74, 0x1f, 0xe, 0xf7, 0xc4, 0x76, 0xf8, 0x3f, 0x77, + 0x1, 0xf7, 0x1e, 0xee, 0x3, 0xf7, 0x1e, 0xf7, 0xaf, 0x15, 0xee, 0xf8, + 0x3f, 0x3b, 0x6, 0x6f, 0x42, 0x31, 0x6f, 0x7e, 0x88, 0x8, 0x34, 0x7, + 0xa5, 0x92, 0xa5, 0x90, 0xc7, 0xb5, 0x8, 0xe, 0xfb, 0xbe, 0xf7, 0xa8, + 0xf4, 0xf7, 0x92, 0xf1, 0x1, 0x91, 0xf7, 0x0, 0xf7, 0x1e, 0xf7, 0x0, + 0x3, 0x91, 0xf8, 0x94, 0x15, 0xfb, 0x1a, 0xc7, 0x25, 0xf7, 0x7, 0xf7, + 0x8, 0xca, 0xf0, 0xf7, 0x1b, 0xf7, 0x12, 0x51, 0xee, 0xfb, 0xd, 0xfb, + 0x6, 0x4e, 0x30, 0xfb, 0x1a, 0x1e, 0xf7, 0x0, 0x16, 0xbb, 0x93, 0xd6, + 0xc6, 0xc6, 0x97, 0x4f, 0x4c, 0x54, 0x80, 0x3f, 0x4f, 0x51, 0x82, 0xda, + 0xbf, 0x1e, 0xe, 0x20, 0x5d, 0xa, 0xe3, 0xd7, 0x50, 0xa, 0xcb, 0xfb, + 0x5f, 0x50, 0xa, 0xe, 0xf7, 0x3f, 0x8d, 0x76, 0xa7, 0x76, 0xd0, 0xcf, + 0xf8, 0xdc, 0x77, 0xa0, 0x77, 0x12, 0xa5, 0xf7, 0x57, 0xf8, 0x2c, 0xe1, + 0x13, 0x6e, 0xf8, 0x5b, 0xc4, 0x15, 0xf7, 0x42, 0x46, 0xe1, 0xd0, 0xbe, + 0xcf, 0x58, 0xf7, 0x71, 0x3f, 0x6, 0xfb, 0x4c, 0xfb, 0x72, 0x5, 0xe1, + 0x8c, 0x15, 0xe1, 0xf6, 0x5, 0x8d, 0x20, 0x6, 0x13, 0xae, 0xfc, 0x77, + 0xfb, 0x24, 0x15, 0xd7, 0x6, 0xf8, 0x38, 0xf9, 0x6d, 0x5, 0x3f, 0x6, + 0xfc, 0x48, 0xfb, 0xfa, 0x15, 0xe6, 0x6, 0x13, 0x76, 0xf7, 0xf9, 0x41, + 0x7, 0x72, 0x4e, 0x37, 0x74, 0x7f, 0x88, 0x8, 0x42, 0x7, 0x8f, 0x8c, + 0x91, 0x8c, 0x8d, 0x8c, 0x96, 0x8e, 0xae, 0x94, 0xb9, 0xa9, 0x8, 0xe, + 0xf7, 0x3f, 0x7d, 0xd6, 0x50, 0x76, 0xf7, 0x8a, 0xf7, 0xb, 0xf8, 0x0, + 0x77, 0x12, 0xa5, 0xf7, 0x5b, 0xf8, 0x71, 0xe7, 0x13, 0x7c, 0xf7, 0x29, + 0x78, 0x15, 0xd8, 0x6, 0xf8, 0x3f, 0xf9, 0x6d, 0x5, 0x3e, 0x6, 0xfc, + 0x50, 0xfb, 0xfb, 0x15, 0xe8, 0xf7, 0xf8, 0x40, 0x6, 0x71, 0x4e, 0x35, + 0x76, 0x7f, 0x88, 0x8, 0x42, 0x7, 0xa3, 0x91, 0xa4, 0x90, 0xc4, 0xae, + 0x8, 0x13, 0xbc, 0xf8, 0x0, 0xfc, 0xf5, 0x15, 0xf7, 0xbe, 0xd6, 0xfb, + 0x2e, 0x6, 0x94, 0x94, 0x91, 0x91, 0x94, 0x90, 0x8, 0xf5, 0xd4, 0xa3, + 0xb0, 0xba, 0x1a, 0xb5, 0x69, 0xcd, 0x21, 0xfb, 0x18, 0x80, 0x37, 0x6c, + 0x87, 0x1e, 0xe7, 0x84, 0x5, 0xa3, 0x8d, 0x90, 0xa9, 0xb8, 0x1b, 0x92, + 0xb7, 0x8a, 0x64, 0x6d, 0x73, 0x7b, 0x4f, 0x5e, 0x1f, 0x2f, 0x41, 0x75, + 0x6c, 0x83, 0x53, 0x8, 0xe, 0xf7, 0x3f, 0x8d, 0x76, 0xa5, 0x76, 0xd0, + 0xcf, 0xf7, 0x71, 0xcf, 0xf7, 0x79, 0xcf, 0x8c, 0x77, 0x12, 0xf7, 0x5c, + 0xe8, 0xf8, 0x2, 0xe2, 0x13, 0x7b, 0xf8, 0x75, 0xc2, 0x15, 0xf7, 0x46, + 0x46, 0xe2, 0xd0, 0xc0, 0xcf, 0x56, 0xf7, 0x71, 0x3e, 0x6, 0xfb, 0x50, + 0xfb, 0x72, 0x5, 0xe3, 0x8c, 0x15, 0xe3, 0xf6, 0x5, 0x8d, 0x20, 0x6, + 0x13, 0xb7, 0xfc, 0x77, 0xfb, 0x22, 0x15, 0xd9, 0x6, 0xf8, 0x42, 0xf9, + 0x6d, 0x5, 0x3d, 0x6, 0xfc, 0xe2, 0xfb, 0x94, 0x15, 0x25, 0x99, 0xf2, + 0x83, 0xa8, 0x1b, 0xe3, 0xca, 0xbf, 0xca, 0xb4, 0x72, 0xa8, 0x60, 0x9a, + 0x1f, 0xac, 0x9d, 0x9a, 0xa4, 0xa4, 0x1a, 0x13, 0x7b, 0xbd, 0x56, 0xba, + 0x39, 0xfb, 0x5, 0x7c, 0x45, 0x6a, 0x83, 0x1e, 0xe3, 0x7f, 0x5, 0x9d, + 0x8d, 0x8f, 0xa8, 0xb5, 0x1b, 0x9e, 0xa2, 0x86, 0x73, 0x64, 0x54, 0x8a, + 0x7e, 0x1f, 0x80, 0x46, 0x5, 0x90, 0x9e, 0x96, 0x8d, 0x9a, 0x1b, 0xac, + 0x9d, 0x71, 0x72, 0x73, 0x7b, 0x74, 0x64, 0x5b, 0x87, 0xae, 0x9a, 0x88, + 0x1f, 0xe, 0x57, 0xfb, 0x57, 0xf5, 0xf8, 0x48, 0x77, 0x1, 0xc2, 0xf7, + 0x15, 0xbe, 0xf7, 0x19, 0x3, 0xf7, 0x8b, 0xf7, 0xef, 0x15, 0x8e, 0x4b, + 0x8a, 0x76, 0x4c, 0x57, 0x8, 0x2e, 0x3a, 0x65, 0x5c, 0x44, 0x1a, 0xfb, + 0x5, 0xec, 0x2e, 0xf7, 0x27, 0xf7, 0x37, 0xde, 0xf7, 0x4, 0xed, 0x91, + 0x1e, 0xfb, 0xc, 0x9c, 0x5, 0x3e, 0x7c, 0x5f, 0x5f, 0x42, 0x1b, 0x52, + 0x51, 0xab, 0xcc, 0xb7, 0xa1, 0x9d, 0xcd, 0xc3, 0x1f, 0xe9, 0xda, 0x8f, + 0xb8, 0x89, 0xec, 0x8, 0xfb, 0x19, 0xbb, 0x15, 0xf7, 0x19, 0xf7, 0x1d, + 0xfb, 0x19, 0x6, 0xe, 0x35, 0xa, 0xd3, 0xf7, 0x28, 0x1, 0xf7, 0xf2, + 0xf9, 0xa8, 0x15, 0xde, 0x6, 0x4a, 0xf7, 0x28, 0x40, 0xa, 0xfb, 0x5f, + 0xfe, 0x3c, 0x28, 0xa, 0x35, 0xa, 0xd3, 0xf7, 0x28, 0x1, 0xf7, 0xb7, + 0xf9, 0xa8, 0x15, 0xde, 0x6, 0xf7, 0x13, 0xf7, 0x28, 0x40, 0xa, 0xfb, + 0xe4, 0xfe, 0x3c, 0x28, 0xa, 0x35, 0xa, 0xd5, 0x84, 0xa, 0xf7, 0x61, + 0xf9, 0xaa, 0x15, 0xf4, 0x6, 0xbe, 0xd4, 0xc1, 0x42, 0x5, 0xf3, 0x6, + 0x2b, 0x83, 0xa, 0xfb, 0xc, 0x6, 0xfb, 0xaf, 0xfe, 0x3c, 0x28, 0xa, + 0x35, 0xa, 0xf7, 0xf, 0xdf, 0x8a, 0x77, 0x12, 0x13, 0xf0, 0xf7, 0x5e, + 0xf9, 0xaf, 0x15, 0xc6, 0x65, 0xa, 0xab, 0xaa, 0x1b, 0xa6, 0xa1, 0x82, + 0x82, 0x9f, 0x1f, 0x80, 0xa6, 0xa3, 0x7e, 0xa6, 0x1b, 0xdd, 0x8b, 0xef, + 0xa5, 0x1f, 0x4f, 0x7a, 0xa, 0x6d, 0x6b, 0x1b, 0x81, 0x78, 0x95, 0x95, + 0x73, 0x1f, 0x13, 0xe8, 0x97, 0x72, 0x6d, 0x96, 0x6e, 0x1b, 0x4d, 0x71, + 0x5a, 0x3d, 0x8e, 0x1f, 0xfb, 0x4a, 0xfd, 0xaf, 0x28, 0xa, 0x35, 0xa, + 0xda, 0xf7, 0xc, 0x1, 0xf7, 0x62, 0xf9, 0xaf, 0x15, 0xf7, 0x4, 0xf7, + 0xc, 0x7c, 0xa, 0xf7, 0x5c, 0xfb, 0xc, 0x15, 0xf7, 0x4, 0xf7, 0xc, + 0x7c, 0xa, 0xfc, 0x16, 0xfe, 0x27, 0x28, 0xa, 0x35, 0xa, 0xc0, 0xf7, + 0x55, 0x1, 0x9f, 0x16, 0x27, 0xa, 0xfb, 0x47, 0xf8, 0xd3, 0x15, 0x56, + 0xb4, 0x5f, 0xbd, 0xbc, 0xb5, 0xb5, 0xc2, 0xc3, 0x62, 0xb3, 0x59, 0x58, + 0x63, 0x62, 0x54, 0x1e, 0xbd, 0x16, 0xa4, 0x9d, 0x9d, 0xa2, 0xa1, 0x9e, + 0x7a, 0x71, 0x73, 0x78, 0x77, 0x75, 0x75, 0x78, 0x9f, 0xa3, 0x1e, 0xe, + 0xf7, 0xe5, 0x8b, 0xf7, 0xe, 0xba, 0xf7, 0x12, 0xa0, 0xf7, 0xe, 0xf7, + 0x35, 0xf7, 0xb, 0x1, 0xf8, 0x66, 0xf7, 0x1d, 0x3, 0x90, 0x16, 0xf7, + 0x2d, 0x6, 0xd1, 0xf7, 0x3d, 0x5, 0xf7, 0x81, 0xfb, 0x3d, 0xf8, 0x7d, + 0xf7, 0xe, 0xfb, 0xf3, 0xf7, 0x56, 0xf7, 0xc2, 0xf7, 0xe, 0xfb, 0xc2, + 0xf7, 0x35, 0xf7, 0xe7, 0xf7, 0xb, 0xfc, 0xfe, 0x6, 0x5e, 0xfc, 0x3b, + 0x15, 0xf7, 0x1a, 0xf7, 0xd0, 0x5, 0xc0, 0xfb, 0xd0, 0x6, 0xe, 0xc6, + 0xfb, 0x78, 0xc9, 0xe4, 0xbe, 0x8d, 0xf7, 0x13, 0xf8, 0x8e, 0xf7, 0x14, + 0x1, 0xb7, 0xf7, 0x2d, 0xf7, 0x68, 0xea, 0x3, 0xf7, 0x7c, 0xfb, 0x35, + 0x15, 0x4f, 0x7, 0x85, 0xa7, 0xbd, 0x8a, 0x8f, 0x1b, 0xf6, 0xde, 0xb1, + 0xd2, 0xb0, 0x78, 0xba, 0x30, 0x94, 0x1f, 0x8d, 0x7, 0xf7, 0x65, 0xca, + 0xf7, 0x40, 0xcc, 0x9d, 0x1f, 0xfb, 0x24, 0xb9, 0x5, 0x3a, 0x79, 0x5d, + 0x40, 0x29, 0x1b, 0xfb, 0x26, 0x68, 0xf7, 0x11, 0xf7, 0xe, 0xbb, 0x8b, + 0xf7, 0x67, 0xf7, 0x4b, 0xd7, 0xc8, 0x60, 0x3b, 0x9d, 0x1f, 0xf7, 0x27, + 0xae, 0x5, 0xf7, 0x40, 0x4d, 0xfb, 0x1b, 0xb7, 0x22, 0x1b, 0xfb, 0x83, + 0x2a, 0xfb, 0x4a, 0xfb, 0x61, 0xfb, 0x7a, 0xf7, 0x20, 0xfb, 0x24, 0xf7, + 0x45, 0x1f, 0x89, 0x7, 0x8c, 0x7, 0x75, 0x8a, 0x76, 0x88, 0x72, 0x82, + 0x7d, 0x5a, 0x18, 0x8f, 0x9b, 0xa6, 0x91, 0xa2, 0x1b, 0xc0, 0x96, 0x6f, + 0x7d, 0x61, 0x54, 0x86, 0x63, 0x6d, 0x86, 0x8b, 0x90, 0x5c, 0x1f, 0xe, + 0x33, 0xa, 0xf7, 0x8a, 0xbb, 0x15, 0xe3, 0x6, 0x46, 0xf7, 0x28, 0x5, + 0xfb, 0x2d, 0x6, 0xe, 0x33, 0xa, 0xf7, 0x4c, 0xbb, 0x15, 0xe2, 0x6, + 0xf7, 0x1b, 0xf7, 0x28, 0x5, 0xfb, 0x2e, 0x6, 0xe, 0x3a, 0xa, 0xbd, + 0x84, 0xa, 0xd7, 0xf7, 0x24, 0x3, 0xf7, 0x3d, 0xf9, 0xaa, 0x15, 0xf7, + 0x3, 0x6, 0xc0, 0xd4, 0xc5, 0x42, 0x5, 0xf7, 0x2, 0x6, 0x26, 0x83, + 0xa, 0xfb, 0x14, 0x6, 0xfb, 0x58, 0xfe, 0x3c, 0x15, 0x2e, 0xa, 0xe, + 0x3a, 0xa, 0xc3, 0xf7, 0xb, 0x12, 0xd7, 0xf7, 0x24, 0x59, 0xf7, 0xa, + 0xe9, 0xf7, 0xa, 0x13, 0xf6, 0xf7, 0x3e, 0xf9, 0xb0, 0x8e, 0xa, 0xf7, + 0x68, 0xfb, 0xb, 0x8e, 0xa, 0x13, 0xfa, 0xfb, 0xc6, 0xfe, 0x27, 0x15, + 0x2e, 0xa, 0xe, 0x4c, 0xa, 0xf9, 0xad, 0xf7, 0x23, 0x94, 0xa, 0xe9, + 0xf9, 0xad, 0x15, 0xe2, 0x6, 0x3d, 0x75, 0xa, 0xf7, 0xb, 0x46, 0xa, + 0x4c, 0xa, 0xfa, 0x3c, 0x77, 0x94, 0xa, 0xcb, 0xf9, 0xad, 0x15, 0xe2, + 0x6, 0xf7, 0x46, 0x75, 0xa, 0x20, 0x46, 0xa, 0x4c, 0xa, 0xf9, 0xaf, + 0xf7, 0x21, 0x94, 0xa, 0x66, 0xf9, 0xaf, 0x95, 0xa, 0xd1, 0xc8, 0x45, + 0x77, 0xa, 0xf7, 0x21, 0x5, 0xfb, 0x1b, 0x6, 0x87, 0x46, 0xa, 0x4c, + 0xa, 0xf9, 0xb3, 0xf7, 0x8, 0x1, 0xd0, 0x63, 0xa, 0xf9, 0x60, 0x68, + 0xa, 0x31, 0xde, 0x92, 0xa, 0xf7, 0x62, 0xfb, 0x8, 0x92, 0xa, 0xe, + 0xc6, 0x8b, 0xf7, 0xd, 0xf8, 0x70, 0x82, 0xa, 0xd2, 0xf7, 0x27, 0xf7, + 0xcc, 0xf7, 0x2f, 0x3, 0xf7, 0x6e, 0xf7, 0xd, 0x15, 0xf7, 0x4f, 0xf7, + 0x31, 0xef, 0xfb, 0x31, 0xf7, 0x51, 0xf7, 0x0, 0x7, 0xf7, 0x24, 0xc7, + 0x8b, 0xfb, 0x86, 0xfb, 0x7a, 0x2e, 0x87, 0xfb, 0x0, 0x1f, 0xfb, 0x96, + 0xfb, 0xd, 0x15, 0xf7, 0x96, 0x6, 0xf7, 0x8e, 0xf5, 0xf7, 0x46, 0xf7, + 0x42, 0xf7, 0x9d, 0xfb, 0x1, 0xf0, 0xfb, 0x8e, 0x1f, 0xfb, 0x93, 0xfb, + 0xca, 0x3f, 0x27, 0xd7, 0x6, 0xe, 0x69, 0xa, 0xf9, 0x74, 0x77, 0xf7, + 0x62, 0x5c, 0xa, 0xf8, 0x74, 0x8d, 0x6, 0xf7, 0xbb, 0xfc, 0x74, 0x5, + 0xf7, 0x2a, 0xf9, 0x74, 0xfb, 0x1e, 0xfc, 0x7f, 0x89, 0x6, 0xfb, 0xc1, + 0xf8, 0x7f, 0x5, 0xfb, 0x24, 0x6, 0xf7, 0xb, 0xc6, 0x15, 0xcb, 0x65, + 0xa, 0xab, 0xad, 0x1b, 0xaa, 0xa2, 0x80, 0x81, 0xa3, 0x1f, 0x81, 0xa4, + 0xa4, 0x80, 0xab, 0x1b, 0xe3, 0x8b, 0xef, 0xa5, 0x1f, 0x4a, 0x7a, 0xa, + 0x6d, 0x68, 0x1b, 0x80, 0x77, 0x95, 0x95, 0x71, 0x1f, 0x97, 0x71, 0x69, + 0x96, 0x6a, 0x1b, 0x48, 0x70, 0x5a, 0x3d, 0x8e, 0x1f, 0xe, 0x59, 0xa, + 0xd1, 0xf7, 0x23, 0x1, 0xc6, 0xf7, 0x28, 0xf8, 0x0, 0x85, 0xa, 0xb7, + 0xf7, 0xf4, 0x29, 0xa, 0xfb, 0x22, 0x51, 0x22, 0xfb, 0x1f, 0xfb, 0x2c, + 0x5e, 0xf7, 0x4, 0xf7, 0x1b, 0x1e, 0xf7, 0x4d, 0xf8, 0x4d, 0x15, 0xe1, + 0x6, 0x47, 0x67, 0xa, 0xfb, 0x2c, 0x6, 0xe, 0x5f, 0xa, 0xf8, 0x82, + 0xf7, 0x10, 0xd1, 0xf7, 0x23, 0x7e, 0xa, 0xf7, 0xcf, 0xf9, 0xad, 0x15, + 0xe1, 0x6, 0xf7, 0x1a, 0x67, 0xa, 0xfb, 0x2c, 0x6, 0xfb, 0xe7, 0x31, + 0xa, 0x54, 0xfb, 0xb, 0xfb, 0x22, 0x41, 0xa, 0x5f, 0xa, 0xf8, 0x82, + 0xf7, 0x10, 0xd3, 0xf7, 0x21, 0x7e, 0xa, 0xf7, 0x74, 0xf9, 0xaf, 0x15, + 0xf7, 0x3, 0x6, 0xc0, 0xd1, 0xc3, 0x45, 0x5, 0xf7, 0x2, 0x6, 0x26, + 0xf7, 0x21, 0x5, 0xfb, 0x12, 0x6, 0xfb, 0xaf, 0x31, 0xa, 0x4f, 0xfb, + 0xb, 0xfb, 0x1d, 0x41, 0xa, 0x59, 0xa, 0xd8, 0x64, 0xa, 0xd1, 0xf7, + 0x28, 0xf7, 0xf1, 0xf7, 0x28, 0x13, 0xd6, 0xf7, 0x71, 0xf9, 0xb2, 0x15, + 0xc9, 0x6a, 0xa, 0x9f, 0x1f, 0x13, 0xe6, 0x80, 0xa3, 0xa1, 0x80, 0xad, + 0x1b, 0xe1, 0x8b, 0xed, 0xa4, 0x1f, 0x4c, 0x7a, 0xa, 0x6e, 0x69, 0x1b, + 0x81, 0x79, 0x93, 0x94, 0x75, 0x1f, 0x13, 0xce, 0x97, 0x70, 0x67, 0x98, + 0x6c, 0x1b, 0x4a, 0x70, 0x5b, 0x3f, 0x8e, 0x1f, 0xfb, 0x45, 0xfc, 0x52, + 0x29, 0xa, 0xfb, 0x2c, 0x4f, 0x2c, 0xfb, 0x1d, 0x41, 0xa, 0x59, 0xa, + 0xd6, 0xf7, 0x9, 0x1, 0xc6, 0xf7, 0x28, 0xf8, 0x1, 0x85, 0xa, 0xf7, + 0x75, 0xf9, 0xb2, 0x8d, 0xa, 0xf7, 0x66, 0xfb, 0x9, 0x8d, 0xa, 0xfc, + 0x1b, 0xfc, 0xc7, 0x29, 0xa, 0xfb, 0x11, 0x54, 0xfb, 0xe, 0xfb, 0x22, + 0x41, 0xa, 0x3c, 0xa1, 0x76, 0xf8, 0x8c, 0x77, 0x1, 0xb4, 0xec, 0x15, + 0xe9, 0x2c, 0xf7, 0x30, 0xf7, 0x31, 0xf7, 0x32, 0xfb, 0x32, 0xeb, 0xec, + 0xfb, 0x32, 0xf7, 0x31, 0xf7, 0x30, 0xf7, 0x2f, 0x2e, 0xea, 0xfb, 0x31, + 0xfb, 0x31, 0xfb, 0x31, 0xf7, 0x31, 0x2b, 0x2b, 0xf7, 0x32, 0xfb, 0x30, + 0x5, 0xe, 0xf7, 0x7, 0x85, 0x76, 0xa6, 0xf7, 0xe, 0xf8, 0x74, 0xf7, + 0xe, 0xa0, 0x77, 0x1, 0xbc, 0xf7, 0x27, 0xf8, 0x7, 0xf7, 0x27, 0x3, + 0xac, 0xab, 0x15, 0xcf, 0x50, 0xd9, 0xe2, 0x5, 0x5a, 0xce, 0xd5, 0x80, + 0xcd, 0x1b, 0xf7, 0x8a, 0xed, 0xf7, 0x56, 0xf7, 0x43, 0xab, 0x89, 0xf7, + 0x2, 0x4a, 0xe1, 0x1f, 0xdc, 0xe4, 0x48, 0xc6, 0x3f, 0x36, 0x5, 0x9f, + 0x71, 0x4c, 0xb7, 0xfb, 0x12, 0x1b, 0xfb, 0x88, 0x2a, 0xfb, 0x40, 0xfb, + 0x4b, 0xfb, 0x18, 0xb1, 0x44, 0xab, 0x60, 0x1f, 0xee, 0xf7, 0x2, 0x15, + 0x7d, 0xad, 0x83, 0xbc, 0xc0, 0x1a, 0xf7, 0x12, 0xc6, 0xf6, 0xf7, 0x1b, + 0xb8, 0xba, 0x80, 0x6e, 0xad, 0x1e, 0xfb, 0x87, 0xfc, 0x25, 0x15, 0xf7, + 0xbb, 0xf7, 0xda, 0x5, 0x95, 0x72, 0x94, 0x64, 0x55, 0x1a, 0xfb, 0x47, + 0x2a, 0x47, 0x27, 0x6e, 0x63, 0x8e, 0xaf, 0x5b, 0x1e, 0xe, 0x54, 0xa, + 0xd3, 0xf9, 0x5e, 0x5e, 0xa, 0xb5, 0xfb, 0x48, 0xf7, 0x8f, 0xf7, 0x7a, + 0xc3, 0x2b, 0xa, 0xf7, 0x18, 0xd9, 0x15, 0xe4, 0x6, 0x45, 0xf7, 0x24, + 0x97, 0xa, 0xe, 0x54, 0xa, 0xf7, 0xb3, 0xf9, 0xac, 0x15, 0xe3, 0x6, + 0xf7, 0x1c, 0xf7, 0x24, 0x97, 0xa, 0xfb, 0xb0, 0xfb, 0x72, 0x5e, 0xa, + 0xa1, 0xfb, 0x48, 0xf7, 0xa3, 0x2f, 0xa, 0xc6, 0x78, 0xf7, 0x11, 0xf9, + 0x44, 0xf7, 0x22, 0x42, 0xa, 0xf7, 0x57, 0xf9, 0xae, 0x15, 0xf7, 0x4, + 0x6, 0xc1, 0xd1, 0xc5, 0x45, 0x5, 0xf7, 0x3, 0x6, 0x25, 0xf7, 0x22, + 0x5, 0xfb, 0x15, 0x6, 0xfb, 0x77, 0xfb, 0x72, 0x34, 0xa, 0xc6, 0x78, + 0xf7, 0x11, 0xf9, 0x48, 0xf7, 0x9, 0x12, 0xd3, 0xf7, 0x26, 0x75, 0xf7, + 0xb, 0xea, 0xf7, 0xb, 0x73, 0xf7, 0x26, 0x13, 0xd8, 0xf7, 0x58, 0xf9, + 0xb2, 0x8f, 0xa, 0xf7, 0x6a, 0xfb, 0x9, 0x8f, 0xa, 0x13, 0xe4, 0xfb, + 0xe6, 0xfb, 0x5d, 0x34, 0xa, 0x8f, 0xa0, 0x76, 0x1, 0xf7, 0x9d, 0xf7, + 0x1d, 0x3, 0x70, 0xa, 0xf8, 0x34, 0x5, 0xfb, 0x32, 0x6, 0xfb, 0x33, + 0xfb, 0xaf, 0xfb, 0x34, 0xf7, 0xaf, 0x5, 0xfb, 0x35, 0x6, 0xf7, 0x8e, + 0xfc, 0x33, 0x5, 0x89, 0xf8, 0x80, 0x15, 0xde, 0x6, 0xf7, 0x14, 0x67, + 0xa, 0xfb, 0x26, 0x6, 0xe, 0x8f, 0xa0, 0x76, 0xf7, 0x1b, 0xf7, 0xe, + 0xf7, 0x60, 0xf7, 0xe, 0xf7, 0x1b, 0x77, 0x60, 0xa, 0xf7, 0x1b, 0xd1, + 0x6, 0xcc, 0xf1, 0x8c, 0xa3, 0xbe, 0x1f, 0xb9, 0xa1, 0xd3, 0xbf, 0xf7, + 0x12, 0x1a, 0xf7, 0x73, 0xfb, 0x2f, 0x8b, 0xfb, 0x49, 0x1e, 0x45, 0xf7, + 0x1b, 0xfb, 0x25, 0x6, 0xf7, 0x25, 0xfc, 0x61, 0x15, 0xf7, 0x60, 0xd1, + 0x7, 0xf4, 0xdc, 0x88, 0x29, 0x24, 0xfb, 0x3, 0x8b, 0x40, 0x1f, 0xe, + 0x57, 0x92, 0x76, 0xf9, 0x11, 0xf7, 0x0, 0x1, 0xd0, 0xf7, 0x1e, 0xf7, + 0x7e, 0xf7, 0x1e, 0x3, 0xd0, 0x84, 0x15, 0xf7, 0x1e, 0xf8, 0x6b, 0x6, + 0xe3, 0x8b, 0xd2, 0xd6, 0xe6, 0x68, 0x36, 0x4c, 0x6d, 0x1e, 0x75, 0x5e, + 0x81, 0x6d, 0x72, 0x1a, 0x64, 0xa6, 0x6e, 0xc3, 0x56, 0x1e, 0xcf, 0x49, + 0x99, 0x7d, 0x6d, 0x1a, 0x6a, 0x73, 0x79, 0x72, 0x76, 0x76, 0x97, 0xa6, + 0x83, 0x1e, 0x2b, 0x53, 0x5, 0x4e, 0xa8, 0xcd, 0x6e, 0xcc, 0x1b, 0xe3, + 0xe0, 0xc3, 0xf7, 0x0, 0xc0, 0x76, 0xb5, 0x4a, 0xcd, 0x1f, 0x57, 0xc0, + 0x75, 0x9c, 0xa3, 0x1a, 0x9c, 0x97, 0x9f, 0xa1, 0xb4, 0x1e, 0xf7, 0x2, + 0xc6, 0x7a, 0xf7, 0x1e, 0xfb, 0x67, 0x1b, 0xfb, 0x59, 0x79, 0xfb, 0x3d, + 0x29, 0x1f, 0xe, 0x39, 0xa, 0xc4, 0xf7, 0x29, 0x51, 0xa, 0xf7, 0x9b, + 0xf8, 0xed, 0x15, 0xe4, 0x6, 0x45, 0xf7, 0x29, 0x96, 0xa, 0xf7, 0x89, + 0x22, 0xa, 0x39, 0xa, 0xc5, 0xf7, 0x28, 0x51, 0xa, 0xf7, 0x5b, 0xf8, + 0xee, 0x15, 0xe4, 0x6, 0xf7, 0x1e, 0xf7, 0x28, 0x96, 0xa, 0xf0, 0x22, + 0xa, 0x39, 0xa, 0xc6, 0xf7, 0x27, 0x51, 0xa, 0xf5, 0xf8, 0xef, 0x15, + 0xf7, 0x6, 0x6, 0xc1, 0xd4, 0xc5, 0x42, 0x5, 0xf7, 0x5, 0x6, 0x24, + 0xf7, 0x27, 0x5, 0xfb, 0x17, 0x6, 0xf7, 0x33, 0x22, 0xa, 0x39, 0xa, + 0xcd, 0xf7, 0x13, 0x37, 0xdf, 0x8a, 0x77, 0x66, 0xa, 0x49, 0xcd, 0xf7, + 0x52, 0xf7, 0x1d, 0x13, 0xa9, 0x80, 0xf2, 0xf8, 0xf4, 0x15, 0xca, 0x6, + 0x98, 0x8c, 0x8b, 0xab, 0xad, 0x1b, 0xb0, 0xa4, 0x7e, 0x80, 0xa3, 0x1f, + 0x13, 0xb2, 0x80, 0x82, 0xa1, 0xa0, 0x81, 0xa9, 0x1b, 0xe3, 0x8b, 0xf0, + 0xa5, 0x1f, 0x4b, 0x6, 0x7d, 0x88, 0x87, 0x6d, 0x69, 0x1b, 0x80, 0x78, + 0x94, 0x95, 0x73, 0x1f, 0x13, 0x65, 0x80, 0x97, 0x70, 0x68, 0x97, 0x6a, + 0x1b, 0x48, 0x70, 0x5a, 0x3c, 0x8e, 0x1f, 0xf7, 0x9f, 0xfc, 0xbb, 0x21, + 0xa, 0x13, 0xb2, 0x80, 0x32, 0xa, 0x39, 0xa, 0xce, 0xf7, 0xa, 0x66, + 0xa, 0x4d, 0xf7, 0xd, 0xea, 0xf7, 0xd, 0x36, 0xf7, 0x1d, 0x13, 0x76, + 0xf6, 0xf8, 0xf7, 0x8a, 0xa, 0xf7, 0x6c, 0xfb, 0xa, 0x8a, 0xa, 0xba, + 0xfd, 0x34, 0x30, 0xa, 0x13, 0xb9, 0x20, 0xa, 0x32, 0xa, 0x39, 0xa, + 0xb1, 0xf7, 0x56, 0x56, 0x77, 0x66, 0xa, 0x9e, 0xf7, 0x58, 0x72, 0xf7, + 0x1d, 0x13, 0xb6, 0xf7, 0x50, 0xf9, 0x3b, 0x15, 0x56, 0xb7, 0x5f, 0xc1, + 0xbf, 0xb9, 0xb5, 0xc2, 0xc3, 0x5e, 0xb4, 0x56, 0x54, 0x60, 0x61, 0x54, + 0x1e, 0xc0, 0x16, 0x13, 0x6d, 0xa4, 0x9f, 0x9e, 0xa4, 0xa3, 0x9f, 0x79, + 0x71, 0x73, 0x77, 0x77, 0x73, 0x73, 0x76, 0x9f, 0xa3, 0x1e, 0xf7, 0x15, + 0xfd, 0x2, 0x24, 0xa, 0x13, 0xb5, 0x26, 0xa, 0xf7, 0x76, 0x7d, 0xf7, + 0x0, 0xf7, 0x17, 0xe4, 0xf7, 0x10, 0xf7, 0x0, 0x1, 0xa8, 0xf7, 0x22, + 0xf7, 0x50, 0xf7, 0x21, 0xf7, 0x6c, 0xf7, 0x22, 0x3, 0xf8, 0x39, 0xc7, + 0x15, 0x52, 0xc8, 0xca, 0x7a, 0xc8, 0x1b, 0xf7, 0x47, 0xbf, 0xf7, 0xc, + 0xb2, 0x99, 0x1f, 0xfb, 0x1f, 0xa3, 0x5, 0x7a, 0x84, 0x72, 0x51, 0x41, + 0x1b, 0x2b, 0x84, 0xf2, 0xa7, 0x88, 0x1f, 0xf7, 0xfa, 0x6, 0xf4, 0x77, + 0xf7, 0x6c, 0xfb, 0x7c, 0x4c, 0x5a, 0x78, 0x6c, 0x63, 0x1e, 0x9a, 0x7b, + 0x4f, 0xae, 0x21, 0x1b, 0xfb, 0x2d, 0x61, 0x59, 0x26, 0x6a, 0x1f, 0xf7, + 0x15, 0x73, 0x5, 0x9d, 0x90, 0x9a, 0xbc, 0xda, 0x1b, 0xe3, 0x8b, 0x53, + 0x75, 0x1f, 0x7e, 0x7, 0x7a, 0x85, 0x78, 0x89, 0x59, 0x7d, 0x8, 0x24, + 0x6e, 0xfb, 0x22, 0x88, 0xfb, 0x29, 0x1a, 0x43, 0xbb, 0x35, 0xf7, 0x1a, + 0xf0, 0xd9, 0xb9, 0xa7, 0xaa, 0x1e, 0x4d, 0xf7, 0x57, 0x15, 0x42, 0x8b, + 0x63, 0x6c, 0x71, 0x1e, 0x56, 0x5f, 0x23, 0x93, 0xd7, 0x1a, 0xb9, 0xb5, + 0x99, 0xb8, 0x97, 0x1e, 0xf7, 0x88, 0xe1, 0x15, 0x9b, 0x8a, 0x92, 0xf7, + 0x0, 0xed, 0x1b, 0xf0, 0x92, 0x2f, 0x6b, 0x8d, 0x1f, 0xe, 0x20, 0xfb, + 0x78, 0xc2, 0xe4, 0xf7, 0x40, 0xfb, 0xa, 0xf7, 0xa, 0xf7, 0xec, 0xf7, + 0x6, 0x12, 0xad, 0xf7, 0x21, 0xf7, 0x23, 0xdd, 0x13, 0xdc, 0xf7, 0x5a, + 0x2f, 0x15, 0x92, 0xaa, 0x9c, 0x8c, 0x92, 0x1b, 0xc4, 0x93, 0x6d, 0x7e, + 0x5d, 0x45, 0x8b, 0x6c, 0x6a, 0x79, 0x8e, 0x8c, 0x83, 0x1f, 0x56, 0x7, + 0x85, 0xb2, 0x9d, 0x8b, 0x8d, 0x1b, 0xf7, 0x11, 0xc5, 0xc7, 0xb9, 0xc1, + 0x5b, 0xaa, 0x5f, 0x90, 0x1f, 0x13, 0xbc, 0x8d, 0x7, 0xf7, 0x3f, 0x91, + 0xaf, 0xf7, 0x2b, 0x94, 0xb5, 0xfb, 0x1b, 0xa3, 0x18, 0x69, 0x85, 0x7e, + 0x44, 0x3a, 0x1b, 0x36, 0x6e, 0xcd, 0xf3, 0xad, 0x89, 0xf7, 0x20, 0xf7, + 0x5, 0xda, 0x99, 0x47, 0x78, 0x8e, 0x1f, 0xf7, 0x1b, 0xa4, 0x5, 0xd4, + 0x77, 0x5e, 0xf2, 0xfb, 0x3a, 0x1b, 0xfb, 0x5e, 0x59, 0xfb, 0x3b, 0xfb, + 0xd, 0x3a, 0xa5, 0xfb, 0x56, 0xf7, 0x5f, 0x7e, 0x1f, 0x89, 0x7, 0x7c, + 0x8a, 0x7e, 0x8a, 0x75, 0x85, 0x8, 0xe, 0x3c, 0xa, 0xc8, 0xf7, 0x28, + 0x43, 0xa, 0xf7, 0x9d, 0xf8, 0xee, 0x15, 0xe6, 0x6, 0x44, 0xf7, 0x28, + 0x5, 0xfb, 0x33, 0x6, 0xb6, 0xfc, 0xa2, 0x25, 0xa, 0x3c, 0xa, 0xc7, + 0xf7, 0x29, 0x43, 0xa, 0xf7, 0x5c, 0xf8, 0xed, 0x15, 0xe6, 0x6, 0xf7, + 0x20, 0xf7, 0x29, 0x5, 0xfb, 0x34, 0x6, 0x25, 0xfc, 0xa2, 0x25, 0xa, + 0x3c, 0xa, 0xc9, 0xf7, 0x27, 0x43, 0xa, 0xf4, 0xf8, 0xef, 0x15, 0xf7, + 0x8, 0x6, 0xc3, 0xd4, 0xc6, 0x42, 0x5, 0xf7, 0x7, 0x6, 0x21, 0xf7, + 0x27, 0x5, 0xfb, 0x18, 0x6, 0x5f, 0xfc, 0xa2, 0x25, 0xa, 0x3c, 0xa, + 0xd1, 0xf7, 0xa, 0x43, 0xa, 0xf5, 0xf8, 0xf7, 0x15, 0xf7, 0x10, 0xf7, + 0xa, 0xfb, 0x10, 0x6, 0xf7, 0x71, 0xfb, 0xa, 0x15, 0xf7, 0xf, 0xf7, + 0xa, 0xfb, 0xf, 0x6, 0xfb, 0x32, 0xfc, 0x8d, 0x25, 0xa, 0x62, 0xa, + 0xf7, 0x23, 0xf8, 0xf2, 0x15, 0xe1, 0x6, 0x20, 0xf7, 0x24, 0x5, 0xfb, + 0x2c, 0x6, 0xf5, 0xfd, 0x82, 0x15, 0x55, 0xa, 0xe, 0x62, 0xa, 0xbc, + 0xf8, 0xf1, 0x15, 0xe2, 0x6, 0xf7, 0x41, 0xf7, 0x25, 0x5, 0xfb, 0x2c, + 0x6, 0x3a, 0xfd, 0x82, 0x15, 0x55, 0xa, 0xe, 0x4c, 0xa, 0xf8, 0xf3, + 0xf7, 0x23, 0x1, 0xd7, 0xf7, 0x13, 0x3, 0xd7, 0x16, 0x55, 0xa, 0xfb, + 0x5, 0xe1, 0x95, 0xa, 0xd3, 0xc8, 0x43, 0x77, 0xa, 0x67, 0xa, 0xfb, + 0x1b, 0x6, 0xe, 0x4c, 0xa, 0xf8, 0xfa, 0xf7, 0x7, 0x12, 0x76, 0xf7, + 0x7, 0x79, 0xf7, 0x13, 0x79, 0xf7, 0x7, 0x13, 0xe8, 0x76, 0x44, 0xa, + 0x13, 0xd0, 0xfb, 0x1, 0xfd, 0x6d, 0x15, 0x55, 0xa, 0xe, 0x57, 0x7d, + 0xf7, 0x8, 0xf7, 0xd4, 0xf7, 0x3, 0xf7, 0x60, 0x77, 0x1, 0xad, 0xf7, + 0x26, 0xf7, 0x90, 0xf7, 0x26, 0x3, 0xf7, 0x65, 0xf8, 0xc7, 0x15, 0xeb, + 0xb8, 0xb0, 0x5b, 0x95, 0x7b, 0xa4, 0x60, 0x19, 0x89, 0x89, 0x5, 0x9b, + 0x70, 0x6b, 0x9d, 0x5a, 0x1b, 0xfb, 0x1, 0xfb, 0x10, 0x22, 0xfb, 0x3b, + 0xfb, 0x26, 0xec, 0xfb, 0x15, 0xf7, 0x40, 0xf7, 0x31, 0xf7, 0xa, 0xea, + 0xf7, 0x48, 0xf7, 0x26, 0x3e, 0xf7, 0x23, 0x26, 0xf2, 0x1f, 0xd2, 0xad, + 0x75, 0xbd, 0x30, 0x60, 0x75, 0x9d, 0x85, 0x8f, 0x72, 0xa0, 0x19, 0xfb, + 0x26, 0x6, 0xbe, 0x66, 0x9a, 0x81, 0xb5, 0x63, 0x3a, 0x65, 0x18, 0x85, + 0xfb, 0xf3, 0x15, 0xf7, 0x4, 0xcc, 0xbc, 0xc5, 0xce, 0xc9, 0x54, 0x21, + 0x27, 0x52, 0x50, 0x44, 0x52, 0x48, 0xb2, 0xf7, 0xc, 0x1e, 0xe, 0x57, + 0xa0, 0x76, 0xf8, 0xfa, 0x64, 0xa, 0xcc, 0xf7, 0x16, 0x58, 0xc8, 0xf7, + 0x5d, 0xf7, 0x20, 0x13, 0xca, 0xcc, 0x16, 0x13, 0xc6, 0xf7, 0x20, 0xf7, + 0x7f, 0x6, 0xe2, 0x90, 0xf2, 0xf7, 0x3, 0xe0, 0x8b, 0x22, 0x36, 0x1e, + 0xfb, 0x7f, 0xf7, 0x20, 0xf7, 0xd6, 0x7, 0xf7, 0x6, 0x3e, 0xe9, 0x28, + 0x55, 0x48, 0x79, 0x45, 0x57, 0x1e, 0x13, 0xca, 0x89, 0xd7, 0xfb, 0x16, + 0x6, 0x13, 0xa6, 0xda, 0xe9, 0x15, 0xca, 0x65, 0xa, 0xaa, 0xad, 0x1b, + 0xa9, 0xa1, 0x82, 0x82, 0xa0, 0x1f, 0x13, 0xca, 0x80, 0xa5, 0xa3, 0x7f, + 0xae, 0x1b, 0xdf, 0x8f, 0xed, 0xa4, 0x1f, 0x4b, 0x6, 0x7d, 0x88, 0x87, + 0x6e, 0x69, 0x1b, 0x13, 0x96, 0x80, 0x73, 0x96, 0x96, 0x70, 0x1f, 0x95, + 0x71, 0x6e, 0x95, 0x6c, 0x1b, 0x49, 0x72, 0x6a, 0x30, 0x1f, 0xe, 0x3e, + 0xa, 0xd7, 0xf7, 0x25, 0x1, 0x56, 0xa, 0x3, 0xf7, 0xb9, 0xf8, 0xf1, + 0x15, 0xe4, 0x6, 0x46, 0xf7, 0x25, 0x5, 0xfb, 0x30, 0x6, 0xfb, 0xf, + 0xfc, 0x7a, 0x23, 0xa, 0x47, 0xa, 0xf7, 0x77, 0xf8, 0xf3, 0x15, 0xe2, + 0x6, 0xf7, 0x1a, 0x75, 0xa, 0xfb, 0x99, 0xfc, 0x7a, 0x23, 0xa, 0x47, + 0xa, 0xf7, 0x1e, 0xf8, 0xf3, 0x15, 0xf7, 0x5, 0x6, 0xc0, 0xd2, 0xc5, + 0x44, 0x5, 0xf7, 0x4, 0x6, 0x25, 0x67, 0xa, 0xfb, 0x16, 0x6, 0xfb, + 0x64, 0xfc, 0x7a, 0x23, 0xa, 0x3e, 0xa, 0xe0, 0x64, 0xa, 0x56, 0xa, + 0x13, 0xd6, 0xf7, 0x1b, 0xf8, 0xf8, 0x15, 0xca, 0x6a, 0xa, 0xa3, 0x1f, + 0x13, 0xe6, 0x80, 0xa4, 0xa3, 0x80, 0xaa, 0x1b, 0xe2, 0x8b, 0xed, 0xa4, + 0x1f, 0x4b, 0x7a, 0xa, 0x6e, 0x69, 0x1b, 0x13, 0xce, 0x7f, 0x75, 0x96, + 0x96, 0x71, 0x1f, 0x95, 0x71, 0x6d, 0x95, 0x6b, 0x1b, 0x49, 0x73, 0x5a, + 0x40, 0x1f, 0x26, 0xfb, 0xf0, 0x23, 0xa, 0x3e, 0xa, 0xe0, 0xf7, 0x7, + 0x12, 0xad, 0xf7, 0x23, 0x65, 0xf7, 0xc, 0xe9, 0xf7, 0xc, 0x65, 0xf7, + 0x23, 0x13, 0xec, 0xf7, 0x1f, 0xf8, 0xfa, 0x4a, 0xa, 0xf7, 0x6a, 0xfb, + 0x7, 0x4a, 0xa, 0x13, 0xf2, 0xfb, 0xd3, 0xfc, 0x65, 0x23, 0xa, 0x3c, + 0x61, 0xf7, 0x1f, 0xe9, 0xf7, 0x13, 0xe9, 0xf7, 0x1c, 0x1, 0xf7, 0x73, + 0xf7, 0x1e, 0x3, 0xb3, 0xf7, 0x53, 0x15, 0xf8, 0x8c, 0xf7, 0x13, 0xfc, + 0x8c, 0x6, 0xf7, 0x4b, 0xe9, 0x15, 0xf7, 0x1e, 0xf7, 0x1c, 0xfb, 0x1e, + 0x6, 0xfc, 0xe2, 0x4, 0xf7, 0x1e, 0xf7, 0x1f, 0x81, 0xa, 0x57, 0x83, + 0x76, 0xa3, 0xf7, 0x6, 0xf7, 0xd5, 0xf7, 0x6, 0x9b, 0x77, 0x12, 0xb2, + 0xf7, 0x26, 0xf7, 0x89, 0xf7, 0x24, 0x13, 0xdc, 0xab, 0x9e, 0x15, 0xc4, + 0x5b, 0xc4, 0xcb, 0x5, 0x71, 0xbb, 0xc8, 0x7d, 0xbd, 0x1b, 0xf7, 0x41, + 0xf7, 0x3, 0xf7, 0x13, 0xf7, 0x28, 0xd4, 0x6d, 0xd0, 0x68, 0xb4, 0x1f, + 0xc5, 0xc9, 0x50, 0xb8, 0x54, 0x4f, 0x5, 0x13, 0xec, 0x95, 0x7a, 0x55, + 0xad, 0x2f, 0x1b, 0xfb, 0x47, 0x23, 0xfb, 0x15, 0xfb, 0x25, 0x41, 0x9e, + 0x4e, 0xbc, 0x56, 0x1f, 0xeb, 0xf7, 0x0, 0x15, 0x7b, 0xb1, 0x89, 0xac, + 0x94, 0x1a, 0xf7, 0x7, 0xd2, 0xb8, 0xcd, 0xb6, 0xa2, 0x7c, 0x82, 0x96, + 0x1e, 0xfb, 0x29, 0xfb, 0xa7, 0x15, 0xf7, 0x56, 0xf7, 0x69, 0x5, 0x91, + 0x7b, 0x97, 0x6c, 0x70, 0x1a, 0x37, 0x5d, 0x3e, 0x2d, 0x60, 0x7b, 0x99, + 0x93, 0x7e, 0x1e, 0xe, 0x4e, 0xa, 0xf8, 0x34, 0x89, 0x2a, 0xa, 0x13, + 0x78, 0xfb, 0xf, 0xf8, 0xa4, 0x15, 0xe3, 0x6, 0x46, 0xf7, 0x25, 0x97, + 0xa, 0xe, 0x4e, 0xa, 0xf7, 0x7a, 0xf8, 0xf1, 0x15, 0xe3, 0x6, 0xf7, + 0x1c, 0xf7, 0x25, 0x97, 0xa, 0xf7, 0x9, 0xfd, 0x84, 0x2a, 0xa, 0xe, + 0x6c, 0xa, 0xf8, 0x97, 0xf7, 0x23, 0x49, 0xa, 0x13, 0x78, 0xf7, 0x1d, + 0xf8, 0xf3, 0x15, 0xf7, 0x5, 0x6, 0xc1, 0xd2, 0xc5, 0x44, 0x5, 0xf7, + 0x4, 0x6, 0x24, 0x67, 0xa, 0xfb, 0x15, 0x6, 0xf7, 0x42, 0xfd, 0x84, + 0x2a, 0xa, 0xe, 0x6c, 0xa, 0xf8, 0x9e, 0xf7, 0x7, 0x12, 0xcd, 0xf7, + 0x1f, 0x48, 0xf7, 0xc, 0xea, 0xf7, 0xc, 0x48, 0xf7, 0x1f, 0x13, 0x6c, + 0xf7, 0x1e, 0xf8, 0xfa, 0x4a, 0xa, 0xf7, 0x6b, 0xfb, 0x7, 0x4a, 0xa, + 0xca, 0xfd, 0x6f, 0x15, 0x13, 0x72, 0x2c, 0xa, 0x13, 0xac, 0x36, 0xa, + 0xe, 0x20, 0xfb, 0x55, 0x76, 0xf9, 0xc8, 0xf7, 0x24, 0x1, 0xb6, 0x28, + 0x15, 0x97, 0x20, 0x52, 0xa, 0xf5, 0xf7, 0xf, 0xc8, 0x1f, 0xf7, 0x4a, + 0xf8, 0x89, 0x78, 0xa, 0xfc, 0x5, 0x6e, 0xa, 0xfb, 0xe, 0xf8, 0x5, + 0x40, 0xa, 0xf7, 0x58, 0xfc, 0x9d, 0x5, 0x2b, 0x48, 0xa, 0xf7, 0x35, + 0xf9, 0x55, 0x15, 0xe1, 0x6, 0xf7, 0x19, 0xf7, 0x24, 0x5, 0xfb, 0x2c, + 0x6, 0xe, 0x57, 0xfb, 0x4f, 0x76, 0xf7, 0x50, 0xf7, 0x3, 0xf7, 0xe2, + 0xf6, 0xf7, 0x4e, 0x77, 0x1, 0xc9, 0xf7, 0x20, 0xf7, 0x7c, 0xf7, 0x24, + 0x3, 0xf7, 0x5e, 0xc5, 0x15, 0x6c, 0xa7, 0xb8, 0x5c, 0xdd, 0x1b, 0xf7, + 0x10, 0xec, 0xef, 0xf7, 0x43, 0xf7, 0x49, 0x21, 0xeb, 0xfb, 0x7, 0x39, + 0x64, 0x64, 0x69, 0x69, 0x1f, 0xf7, 0x97, 0xfb, 0x20, 0xfe, 0x32, 0xf7, + 0x20, 0x7, 0x8a, 0xf8, 0x63, 0x15, 0xf6, 0xbf, 0xca, 0xcc, 0xf2, 0x98, + 0xfb, 0x3, 0x50, 0xfb, 0x16, 0x4c, 0x69, 0x5b, 0x36, 0x66, 0xd1, 0xe9, + 0x1e, 0xe, 0x20, 0xfb, 0x55, 0x76, 0xf9, 0xcf, 0xf7, 0x8, 0x1, 0xf7, + 0x6, 0xf7, 0x9, 0xe8, 0xf7, 0x9, 0x3, 0xf7, 0x6, 0xf8, 0xf9, 0x88, + 0xa, 0xf7, 0x66, 0xfb, 0x8, 0x88, 0xa, 0xfb, 0xad, 0xfd, 0xcf, 0x15, + 0x97, 0xfb, 0x0, 0x52, 0xa, 0xf6, 0xf7, 0x10, 0xc8, 0x1f, 0xf7, 0x4a, + 0xf8, 0x8d, 0x78, 0xa, 0xfc, 0x8, 0x6e, 0xa, 0xfb, 0xe, 0xf8, 0x8, + 0x40, 0xa, 0xf7, 0x58, 0xfc, 0xa1, 0x5, 0x2a, 0x48, 0xa, 0xe, 0x76, + 0xa0, 0xf8, 0x9f, 0x9a, 0xf7, 0x48, 0x9e, 0x6, 0xfb, 0x70, 0x98, 0x7, + 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xf7, 0x11, 0xa, 0xf7, 0x20, + 0xb, 0xf7, 0x0, 0x9c, 0xc, 0xc, 0x8c, 0xc, 0xe, 0xf7, 0xe1, 0x14, + 0xf9, 0x2b, 0x15, 0xb5, 0x13, 0x0, 0x79, 0x2, 0x0, 0x1, 0x0, 0x23, + 0x0, 0x28, 0x0, 0x30, 0x0, 0x65, 0x0, 0x6a, 0x0, 0xaa, 0x0, 0xca, + 0x0, 0xed, 0x0, 0xf1, 0x1, 0x19, 0x1, 0x21, 0x1, 0x3e, 0x1, 0x5b, + 0x1, 0x69, 0x1, 0x81, 0x1, 0x87, 0x1, 0x93, 0x1, 0xc7, 0x1, 0xcb, + 0x1, 0xda, 0x1, 0xe3, 0x1, 0xed, 0x1, 0xfc, 0x2, 0x5, 0x2, 0xe, + 0x2, 0x18, 0x2, 0x25, 0x2, 0x2e, 0x2, 0x39, 0x2, 0x44, 0x2, 0x4d, + 0x2, 0x52, 0x2, 0x57, 0x2, 0x60, 0x2, 0x6a, 0x2, 0x74, 0x2, 0x7f, + 0x2, 0x86, 0x2, 0x8f, 0x2, 0x99, 0x2, 0xa5, 0x2, 0xae, 0x2, 0xb7, + 0x2, 0xc0, 0x2, 0xc5, 0x2, 0xca, 0x2, 0xd5, 0x2, 0xe8, 0x2, 0xfb, + 0x3, 0x4, 0x3, 0xf, 0x3, 0x21, 0x3, 0x2c, 0x3, 0x34, 0x3, 0x3c, + 0x3, 0x4d, 0x3, 0x5e, 0x3, 0x65, 0x3, 0x75, 0x3, 0x85, 0x3, 0x94, + 0x3, 0x9b, 0x3, 0xa2, 0x3, 0xa8, 0x3, 0xb6, 0x3, 0xbf, 0x3, 0xca, + 0x3, 0xd1, 0x3, 0xd9, 0x3, 0xde, 0x3, 0xe3, 0x3, 0xe7, 0x3, 0xeb, + 0x3, 0xef, 0x3, 0xf9, 0x4, 0x4, 0x4, 0xa, 0x4, 0xd, 0x4, 0x11, + 0x4, 0x1c, 0x4, 0x27, 0x4, 0x32, 0x4, 0x3d, 0x4, 0x44, 0x4, 0x4b, + 0x4, 0x51, 0x4, 0x58, 0x4, 0x5f, 0x4, 0x66, 0x4, 0x6b, 0x4, 0x70, + 0x4, 0x74, 0x4, 0x78, 0x4, 0x7c, 0x4, 0x85, 0x4, 0x8f, 0x4, 0x97, + 0x4, 0x9b, 0x4, 0x9f, 0x4, 0xa3, 0x4, 0xa7, 0x4, 0xab, 0x4, 0xb4, + 0x4, 0xbd, 0x4, 0xc6, 0x4, 0xcf, 0x4, 0xd8, 0x4, 0xe1, 0x4, 0xea, + 0x4, 0xf3, 0x4, 0xfc, 0x5, 0x5, 0x5, 0xe, 0x5, 0x17, 0x5, 0x20, + 0x5, 0x27, 0x5, 0x2c, 0x5, 0x32, 0x5, 0x37, 0x5, 0x3c, 0x5, 0x41, + 0x77, 0xb8, 0x83, 0xa2, 0x38, 0xa, 0xac, 0x1a, 0xeb, 0x80, 0xf4, 0xfb, + 0x73, 0xfb, 0x32, 0x65, 0x49, 0x35, 0x73, 0x1e, 0xf7, 0x13, 0x74, 0x5, + 0xa5, 0x2d, 0xa, 0x80, 0x6e, 0x82, 0x3c, 0x7d, 0x8, 0xb, 0x30, 0xa, + 0x20, 0xa, 0xb, 0xfd, 0x49, 0x24, 0xa, 0x13, 0xbc, 0x26, 0xa, 0x15, + 0xfb, 0x84, 0xf7, 0x50, 0x65, 0xde, 0xf7, 0x3e, 0xf2, 0xf7, 0x1b, 0xf7, + 0x23, 0xf7, 0x18, 0x32, 0xf7, 0x19, 0xfb, 0x4c, 0xfb, 0x4f, 0x37, 0xfb, + 0x21, 0xfb, 0x10, 0x1e, 0xf7, 0x23, 0x16, 0xf7, 0x2, 0xc8, 0xb6, 0xce, + 0xd3, 0xc5, 0x5b, 0x22, 0xfb, 0x7, 0x49, 0x58, 0x4b, 0x49, 0x4d, 0xc3, + 0xf7, 0x2, 0x1e, 0xe, 0x21, 0xa, 0x3b, 0xa, 0xb, 0x15, 0xf7, 0xfb, + 0x6, 0xf7, 0x34, 0x5a, 0xf7, 0x31, 0xfb, 0x60, 0xfb, 0x3f, 0x3a, 0xfb, + 0x1d, 0xfb, 0x23, 0xfb, 0x42, 0xf7, 0x20, 0x26, 0xf7, 0xe, 0xf7, 0x47, + 0xb8, 0xf7, 0x11, 0xac, 0x97, 0x1e, 0xfb, 0x23, 0xa2, 0x5, 0x73, 0x83, + 0x79, 0x5a, 0x48, 0x1b, 0x3a, 0x6a, 0xcd, 0xcb, 0x89, 0x1f, 0x8e, 0xe1, + 0x15, 0xd1, 0x8a, 0xb0, 0xc1, 0xce, 0x1b, 0xda, 0xab, 0x55, 0x45, 0x1f, + 0xe, 0x2e, 0xd1, 0x45, 0x37, 0xa, 0xf7, 0x59, 0x15, 0x70, 0x7, 0x3d, + 0x72, 0x4c, 0x34, 0x55, 0x73, 0xac, 0xa9, 0xbc, 0xc4, 0xa4, 0xa4, 0x90, + 0x1e, 0xa9, 0x92, 0xc8, 0x95, 0x9c, 0x94, 0x8, 0xe, 0xf7, 0x26, 0x6, + 0xc3, 0xf7, 0x3b, 0x5, 0xf7, 0xa3, 0x6, 0xc6, 0xfb, 0x3b, 0x5, 0xf7, + 0x2a, 0x6, 0xfb, 0xa4, 0xf9, 0x74, 0x40, 0xa, 0x76, 0xfc, 0x51, 0x15, + 0xe7, 0xf7, 0xa5, 0xe9, 0xfb, 0xa5, 0x5, 0xb, 0x15, 0x27, 0xa, 0xe, + 0x15, 0xfb, 0x3a, 0xd8, 0xfb, 0x61, 0xf7, 0xa0, 0xf7, 0x8d, 0xeb, 0xf7, + 0x4b, 0xf7, 0x50, 0xf7, 0x65, 0x3d, 0xa, 0xfb, 0x22, 0xfb, 0x79, 0x1e, + 0xf7, 0x28, 0x16, 0xf4, 0xac, 0xf7, 0x21, 0xf7, 0x38, 0xf7, 0x43, 0xa1, + 0xfb, 0x39, 0x3a, 0xb, 0x15, 0x2c, 0xa, 0x13, 0xb8, 0x36, 0xa, 0xb, + 0xf7, 0x3, 0xf7, 0x80, 0x1e, 0xf8, 0x16, 0xfb, 0x26, 0xfc, 0x16, 0x7, + 0xfb, 0xf, 0x8b, 0x28, 0xfb, 0x20, 0xfb, 0x1a, 0x7e, 0xe4, 0xf7, 0x19, + 0x1e, 0xf8, 0x16, 0x7, 0xb, 0xf7, 0x15, 0xf8, 0x9e, 0xfb, 0x1f, 0xfb, + 0x67, 0x6, 0xfb, 0x15, 0x8d, 0x33, 0xfb, 0x7, 0x2a, 0x94, 0xe1, 0xf7, + 0x17, 0x1e, 0xf7, 0x67, 0xfb, 0x1f, 0xfb, 0xdd, 0x7, 0xb, 0x95, 0x99, + 0xb4, 0xd0, 0x1b, 0xeb, 0x8b, 0x5d, 0x68, 0x1f, 0x82, 0x7, 0x6f, 0xb, + 0xf8, 0xb5, 0xf7, 0x11, 0xfc, 0x25, 0xf7, 0x5c, 0xf7, 0xfd, 0xf7, 0x11, + 0xfb, 0xfd, 0xf7, 0x39, 0xf8, 0x18, 0xf7, 0x11, 0xfc, 0xa8, 0x6, 0xb, + 0xf7, 0x79, 0xc4, 0x2b, 0xa, 0xe, 0x15, 0x98, 0x5f, 0x8e, 0x84, 0x8e, + 0x83, 0x8, 0xf7, 0x1e, 0x6, 0xb, 0xfc, 0xdc, 0x15, 0xfb, 0x39, 0xd8, + 0xfb, 0x62, 0xf7, 0xa0, 0xf7, 0x8d, 0xeb, 0xf7, 0x4c, 0xf7, 0x4f, 0xf7, + 0x66, 0xfb, 0x5, 0xf7, 0x35, 0xfb, 0x7c, 0xfb, 0x72, 0xfb, 0xf, 0xfb, + 0x21, 0xfb, 0x7a, 0x1e, 0xf7, 0x28, 0x16, 0xf4, 0xac, 0xf7, 0x22, 0xf7, + 0x38, 0xf7, 0x43, 0xa1, 0xfb, 0x3a, 0x3a, 0xfb, 0x14, 0xb, 0x3b, 0xa, + 0x26, 0xa, 0x3a, 0xa, 0xbb, 0xf7, 0x28, 0x1, 0xd7, 0xf7, 0x24, 0x3, + 0xd7, 0x16, 0x2e, 0xa, 0xb, 0x5e, 0xa, 0xa4, 0xfb, 0x48, 0xf7, 0xa0, + 0x2f, 0xa, 0x69, 0xa, 0xf7, 0x3b, 0xf7, 0x10, 0xf8, 0x51, 0x77, 0xb, + 0xfb, 0x8, 0xba, 0x32, 0xf7, 0x14, 0xcf, 0xce, 0xac, 0xc5, 0xb1, 0x1e, + 0x8d, 0x6, 0xb, 0xf5, 0xe1, 0xbf, 0xb6, 0xa7, 0xa6, 0x1e, 0x80, 0xb, + 0x88, 0xd1, 0x8, 0x8a, 0xa9, 0x8d, 0xf7, 0x24, 0xb, 0x20, 0x7d, 0xef, + 0x48, 0x76, 0xf8, 0x4a, 0xf7, 0x0, 0xb, 0x8f, 0x8b, 0xf7, 0x11, 0xf7, + 0x5c, 0xf7, 0x11, 0xf7, 0x39, 0xf7, 0x11, 0xb, 0x41, 0x7d, 0xfb, 0xc, + 0x78, 0xfb, 0x16, 0x1a, 0xb, 0x20, 0x7d, 0xf7, 0x0, 0xf7, 0x16, 0xe1, + 0xf7, 0x10, 0xf6, 0xb, 0xfb, 0x5, 0xf7, 0x36, 0xfb, 0x7c, 0xfb, 0x72, + 0xfb, 0xf, 0xb, 0x57, 0x7d, 0xf7, 0x4, 0xf7, 0xd3, 0xf7, 0x4, 0xb, + 0xa0, 0x76, 0x4d, 0xa, 0xb, 0x5, 0xfb, 0x25, 0x6, 0xb, 0xfb, 0x2c, + 0x5e, 0xf7, 0x5, 0xf7, 0x1a, 0x1e, 0xe, 0x1, 0xd3, 0xf7, 0x26, 0xf7, + 0xb3, 0xf7, 0x26, 0x3, 0xb, 0x1, 0xa2, 0xf7, 0x29, 0xf7, 0x6a, 0xf7, + 0x22, 0x3, 0xb, 0xf8, 0xfa, 0x4b, 0xa, 0xf7, 0x62, 0xfb, 0x7, 0x4b, + 0xa, 0xb, 0xb4, 0x8b, 0xde, 0xc5, 0x1a, 0xe6, 0xb, 0xfe, 0x3c, 0x15, + 0xf7, 0x20, 0xf9, 0x60, 0x6d, 0xa, 0x3e, 0xa, 0xd9, 0xf7, 0x23, 0x1, + 0x56, 0xa, 0x3, 0xb, 0x70, 0x5b, 0x87, 0x6c, 0x1b, 0x76, 0x7f, 0x8c, + 0x90, 0x73, 0x1f, 0xb, 0x12, 0xcd, 0xf7, 0x1f, 0xf7, 0x5d, 0xf7, 0x1f, + 0xb, 0x15, 0xf7, 0xc, 0xf7, 0x7, 0xfb, 0xc, 0x6, 0xb, 0x15, 0xf7, + 0x7, 0xf7, 0x7, 0xfb, 0x7, 0x6, 0xb, 0xfc, 0x15, 0xa0, 0x76, 0xb, + 0xf9, 0x62, 0x77, 0x1, 0xb, 0x6c, 0xa, 0xf8, 0x95, 0xf7, 0x25, 0x49, + 0xa, 0x13, 0x78, 0xb, 0x5, 0xfb, 0x32, 0x6, 0xfb, 0x33, 0xfb, 0xae, + 0xfb, 0x34, 0xf7, 0xae, 0x5, 0xfb, 0x35, 0x6, 0xf7, 0x8e, 0xb, 0x15, + 0xe3, 0x6, 0xf7, 0x11, 0xf7, 0x5f, 0xfb, 0x11, 0xf7, 0x61, 0x5, 0x33, + 0x6, 0xf2, 0xfb, 0x61, 0x5, 0xb, 0x66, 0xa, 0xf7, 0x52, 0xf7, 0x1d, + 0x13, 0x7c, 0xb, 0x5, 0x87, 0x9e, 0x82, 0x87, 0xae, 0x1b, 0xf7, 0x41, + 0xa2, 0xb, 0x15, 0xe3, 0x6, 0x24, 0xf7, 0x64, 0xf2, 0xf7, 0x5c, 0x5, + 0x33, 0x6, 0xfb, 0x11, 0xfb, 0x5c, 0x5, 0xb, 0xc6, 0x78, 0xf7, 0x11, + 0xf9, 0x42, 0xf7, 0x24, 0x42, 0xa, 0xb, 0xf7, 0x13, 0xf8, 0x9d, 0xfb, + 0x13, 0x6, 0xb, 0xad, 0xf7, 0x23, 0xf7, 0x96, 0xf7, 0x23, 0xb, 0xf7, + 0x66, 0xf7, 0x3d, 0xf7, 0x3d, 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x3d, 0xf7, + 0x3d, 0xfb, 0x66, 0xb, 0xf7, 0x3c, 0xf7, 0x1c, 0xfb, 0x1b, 0xfb, 0x3c, + 0xfb, 0x3c, 0xfb, 0x1c, 0xfb, 0x1b, 0xfb, 0x3c, 0xb, 0x5f, 0xa, 0xf8, + 0x81, 0xf7, 0x11, 0xb, 0x57, 0xfb, 0x4e, 0x76, 0xf7, 0x54, 0xf7, 0x0, + 0xf7, 0xe8, 0xf7, 0x5, 0x7f, 0x77, 0x12, 0xb, 0xfb, 0xa6, 0xfb, 0x58, + 0xf7, 0x7, 0xf7, 0xb2, 0xf7, 0x8, 0xf7, 0xb2, 0xf7, 0x7, 0x1, 0xb, + 0x77, 0x1, 0xd0, 0xf7, 0x1e, 0xf7, 0xc9, 0xf7, 0x1e, 0x3, 0xd0, 0x16, + 0xf7, 0x1e, 0xb, 0xec, 0x76, 0xf8, 0x2c, 0x77, 0x1, 0xb, 0x15, 0xfc, + 0x16, 0x7, 0xfb, 0x3b, 0xb, 0xf7, 0x7, 0x78, 0xf7, 0x10, 0xb, 0x1, + 0xd7, 0xf7, 0x25, 0xf7, 0x94, 0xf7, 0x2a, 0x3, 0xd7, 0x16, 0xf7, 0x25, + 0xb, 0x45, 0xa, 0x7, 0x13, 0xe8, 0xfb, 0x1a, 0x6, 0xb, 0x4c, 0xa, + 0xf9, 0x82, 0x77, 0x1, 0xd7, 0xf7, 0x13, 0x3, 0xb, 0x7d, 0xa, 0xd0, + 0x16, 0xf7, 0x20, 0xb, 0xf7, 0xf, 0x39, 0xdd, 0x8a, 0x77, 0x12, 0xb, + 0x6, 0x97, 0x8c, 0x8b, 0xb, 0x12, 0xa8, 0xf7, 0x20, 0xb, 0xf7, 0x23, + 0x5, 0xb, 0xfb, 0x20, 0x6, 0xb, 0xc6, 0xa0, 0x76, 0xb, 0x65, 0xa, + 0xaa, 0xac, 0x1b, 0xaa, 0xa2, 0x82, 0x81, 0xb, 0x15, 0xe9, 0x6, 0xf7, + 0x45, 0x83, 0xa, 0xfb, 0x39, 0x6, 0xb, 0x57, 0x7d, 0xf5, 0x2d, 0xe9, + 0xb, 0x68, 0xa, 0xe, 0x5, 0x89, 0x6, 0xb, 0x75, 0xfb, 0x1, 0x26, + 0x1f, 0x3e, 0xfb, 0x1, 0xd8, 0x6, 0xb, 0xf7, 0x9d, 0x16, 0xf7, 0x1d, + 0xf7, 0xc0, 0x6, 0xf7, 0x8f, 0xb, 0xfb, 0x10, 0x7a, 0xfb, 0x3, 0x52, + 0x1e, 0xeb, 0x16, 0xcc, 0xb, 0xa7, 0xf7, 0x55, 0x84, 0xda, 0x1b, 0xf7, + 0xd, 0xf7, 0x3d, 0xb, 0xa0, 0x76, 0xf8, 0xa8, 0x77, 0x1, 0xb, 0xf7, + 0x44, 0xf7, 0x7, 0xfb, 0x44, 0xb, 0x67, 0xa, 0xfb, 0x2d, 0x6, 0xb, + 0xa0, 0x76, 0xf8, 0x2c, 0xf7, 0x1, 0xb, 0x5, 0xf7, 0x9, 0x6, 0xfb, + 0x0, 0xb, 0x5, 0xfb, 0x21, 0x6, 0xfb, 0xb, 0xb, 0x20, 0x78, 0xf7, + 0x6, 0xb, 0x6, 0x7d, 0x89, 0x87, 0xb, 0x82, 0xa, 0xd7, 0xb, 0xfb, + 0x4, 0x6, 0xb, 0xf7, 0x20, 0x3, 0xb, 0x1, 0xcb, 0xf7, 0x28, 0xf7, + 0xfc, 0x85, 0xa, 0xb, 0xfb, 0x58, 0xf7, 0x0, 0xf9, 0x52, 0xf7, 0x0, + 0x1, 0xb, 0xfb, 0x3e, 0xfb, 0x3d, 0xfb, 0x65, 0x1e, 0xe, 0xfb, 0x1e, + 0x6, 0xe, 0xf7, 0xd, 0x1, 0xb, 0xf7, 0x26, 0x5, 0xb, 0xf7, 0x26, + 0x1, 0xb, 0xf7, 0x28, 0x3, 0xb, 0x57, 0x8b, 0xf7, 0xe, 0xf8, 0xe8, + 0x77, 0x1, 0xb, 0xfc, 0x1d, 0x6, 0xf8, 0xf, 0xf8, 0x76, 0x5, 0xb, + 0x15, 0xf7, 0x9, 0xf7, 0x8, 0xfb, 0x9, 0x6, 0xb, 0xb8, 0x6c, 0x1f, + 0x7c, 0xa2, 0x81, 0xa6, 0x84, 0xb, 0x15, 0xf7, 0xd, 0xf7, 0xa, 0xfb, + 0xd, 0x6, 0xb, 0x15, 0xf7, 0x5, 0xf7, 0x9, 0xfb, 0x5, 0x6, 0xb, + 0xf7, 0xd6, 0x7, 0xfb, 0xff, 0xfc, 0x65, 0x5, 0xb, 0x15, 0xf7, 0xa, + 0xf7, 0x9, 0xfb, 0xa, 0x6, 0xb, 0x15, 0xf7, 0xa, 0xf7, 0xb, 0xfb, + 0xa, 0x6, 0xb, 0x15, 0xf7, 0xb, 0xf7, 0x9, 0xfb, 0xb, 0x6, 0xb, + 0x77, 0x1, 0xf7, 0x78, 0xf7, 0x13, 0x3, 0xb3, 0xb, 0x3c, 0x98, 0x76, + 0xf8, 0x9e, 0x77, 0x1, 0xb1, 0xb, 0x15, 0xf7, 0x7, 0xf7, 0x8, 0xfb, + 0x7, 0x6, 0xb, 0xf9, 0x88, 0x5, 0xfb, 0x13, 0x6, 0xe, 0x1, 0xd0, + 0x7d, 0xa, 0xb, 0x15, 0xf7, 0xa, 0x6, 0xc4, 0xb, 0x5, 0xfb, 0x31, + 0x6, 0xb, 0x5, 0xfb, 0x2f, 0x6, 0xb, 0x89, 0x42, 0x5a, 0x7f, 0xb}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.cpp new file mode 100644 index 000000000000..054976cced04 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.cpp @@ -0,0 +1,1378 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitSansBoldItalicFontData[16418] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x17, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x53, 0x61, 0x6e, 0x73, 0x50, 0x53, 0x2d, 0x42, 0x6f, 0x6c, + 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1, 0x27, + 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8, 0x1e, 0x3, + 0xf8, 0x14, 0x4, 0x7f, 0xc, 0x2, 0xfb, 0x42, 0xfb, 0x78, 0xfa, 0xee, + 0xfa, 0x56, 0x5, 0xf7, 0x3c, 0xf, 0xf8, 0x9c, 0x11, 0xb1, 0x1c, 0x39, + 0xfc, 0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f, 0x48, 0x55, 0x45, 0x75, + 0x72, 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, + 0x6d, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x50, 0x53, 0x20, 0x42, 0x6f, + 0x6c, 0x64, 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68, 0x72, + 0x6F, 0x6D, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x50, 0x53, 0x0, 0x0, + 0x1, 0x0, 0x1, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84, 0x0, 0x0, 0x86, + 0x2, 0x0, 0x91, 0x0, 0x0, 0x63, 0x0, 0x0, 0x6d, 0x1, 0x0, 0x8c, + 0x0, 0x0, 0x92, 0x0, 0x0, 0xc7, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x2, + 0x5, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, + 0x1d, 0x1, 0x87, 0x0, 0x0, 0x75, 0x0, 0x0, 0x65, 0x0, 0x0, 0x76, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x70, 0x1, 0x0, 0x7e, 0x0, 0x0, 0x7a, + 0x0, 0x0, 0xc0, 0x0, 0x0, 0x6b, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x41, + 0x0, 0x0, 0x8, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x74, + 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x99, + 0x0, 0x0, 0xdd, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc6, + 0x0, 0x0, 0x60, 0x2, 0x0, 0x67, 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, + 0x0, 0x0, 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, + 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97, 0x0, 0x0, 0xa6, 0x0, 0x0, 0xa5, + 0x0, 0x0, 0x80, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, + 0x0, 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98, 0x0, 0x0, 0x73, + 0x0, 0x0, 0x72, 0x0, 0x0, 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, + 0x0, 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b, 0x0, 0x0, 0xa3, + 0x0, 0x0, 0x7b, 0x0, 0x0, 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, + 0x0, 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a, 0x0, 0x0, 0xb1, + 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, + 0x2, 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe, 0x0, 0x0, 0xbb, + 0x1, 0x0, 0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, + 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5, 0x0, 0x0, 0x9d, + 0x0, 0x0, 0x95, 0x0, 0x0, 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, + 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90, 0x0, 0x0, 0xce, + 0x0, 0x0, 0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, + 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8, + 0x1, 0x0, 0xdc, 0x0, 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, + 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2, + 0x0, 0x0, 0xe3, 0x0, 0x0, 0xe6, 0x2, 0x0, 0x1, 0x0, 0x4, 0x0, + 0x7, 0x0, 0x37, 0x0, 0x4c, 0x0, 0x76, 0x0, 0x89, 0x0, 0xb9, 0x0, + 0xcf, 0x0, 0xde, 0x0, 0xf6, 0x1, 0x48, 0x1, 0x94, 0x1, 0xbc, 0x1, + 0xe0, 0x2, 0x2b, 0x2, 0x70, 0x2, 0x99, 0x2, 0xd3, 0x3, 0x39, 0x3, + 0xc9, 0x4, 0x5a, 0x5, 0x4, 0x5, 0x21, 0x5, 0x5f, 0x5, 0x97, 0x5, + 0xcc, 0x5, 0xf3, 0x6, 0x1a, 0x6, 0x2e, 0x6, 0x40, 0x6, 0x55, 0x6, + 0x9e, 0x6, 0xca, 0x7, 0x1f, 0x7, 0x83, 0x7, 0xc5, 0x8, 0x25, 0x8, + 0x90, 0x8, 0xc1, 0x9, 0x35, 0x9, 0x9f, 0x9, 0xc2, 0x9, 0xfa, 0xa, + 0x1f, 0xa, 0x3f, 0xa, 0x62, 0xa, 0xb7, 0xb, 0x65, 0xb, 0x96, 0xb, + 0xef, 0xc, 0x39, 0xc, 0x6b, 0xc, 0x97, 0xc, 0xba, 0xd, 0x1a, 0xd, + 0x48, 0xd, 0x58, 0xd, 0x89, 0xd, 0xb7, 0xd, 0xc9, 0xe, 0x7, 0xe, + 0x2d, 0xe, 0x7c, 0xe, 0xb8, 0xf, 0x2d, 0xf, 0x8a, 0xf, 0xe6, 0x10, + 0xa, 0x10, 0x59, 0x10, 0x74, 0x10, 0xb2, 0x10, 0xe1, 0x11, 0x3, 0x11, + 0x31, 0x11, 0x53, 0x11, 0x6c, 0x11, 0x8d, 0x11, 0xae, 0x11, 0xbc, 0x11, + 0xcb, 0x12, 0x1d, 0x12, 0x7d, 0x12, 0xc7, 0x13, 0x21, 0x13, 0x73, 0x13, + 0xb1, 0x14, 0x1c, 0x14, 0x64, 0x14, 0x82, 0x14, 0xc6, 0x14, 0xf2, 0x14, + 0xfe, 0x15, 0x65, 0x15, 0xaf, 0x15, 0xc9, 0x16, 0x24, 0x16, 0x80, 0x16, + 0xbf, 0x17, 0x16, 0x17, 0x5a, 0x17, 0xa8, 0x17, 0xc5, 0x18, 0x1, 0x18, + 0x2f, 0x18, 0x6b, 0x18, 0x98, 0x18, 0xeb, 0x19, 0x4, 0x19, 0x5b, 0x19, + 0xa1, 0x1a, 0x1c, 0x1a, 0x3e, 0x1a, 0x9e, 0x1a, 0xbd, 0x1a, 0xd7, 0x1b, + 0xe, 0x1b, 0x58, 0x1b, 0x6c, 0x1c, 0xa, 0x1c, 0x8f, 0x1c, 0xa7, 0x1d, + 0x32, 0x1d, 0x5a, 0x1d, 0x7d, 0x1d, 0xc5, 0x1d, 0xe8, 0x1e, 0x7, 0x1e, + 0x11, 0x1e, 0x1c, 0x1e, 0x68, 0x1e, 0xb8, 0x1f, 0x2e, 0x1f, 0x44, 0x1f, + 0xdc, 0x20, 0x1b, 0x20, 0x48, 0x20, 0xbc, 0x21, 0x52, 0x21, 0xd7, 0x22, + 0x2d, 0x22, 0x4d, 0x22, 0xf6, 0x23, 0x8, 0x23, 0x98, 0x24, 0x2, 0x24, + 0x10, 0x24, 0x25, 0x24, 0x37, 0x24, 0xd9, 0x24, 0xf1, 0x25, 0x25, 0x25, + 0x56, 0x25, 0x9c, 0x25, 0xf2, 0x26, 0x2, 0x26, 0x4a, 0x26, 0x78, 0x26, + 0x8a, 0x26, 0xbd, 0x26, 0xe2, 0x27, 0x26, 0x27, 0x33, 0x27, 0x93, 0x28, + 0x10, 0x28, 0xaa, 0x29, 0x0, 0x29, 0x18, 0x29, 0x33, 0x29, 0x53, 0x29, + 0x9e, 0x29, 0xc2, 0x29, 0xf9, 0x2a, 0x49, 0x2a, 0xd8, 0x2a, 0xed, 0x2b, + 0x4, 0x2b, 0x24, 0x2b, 0x49, 0x2b, 0x6d, 0x2b, 0x84, 0x2b, 0xa5, 0x2b, + 0xbf, 0x2c, 0xc, 0x2c, 0x66, 0x2c, 0x72, 0x2c, 0x8e, 0x2c, 0xa8, 0x2c, + 0xed, 0x2d, 0x13, 0x2d, 0x46, 0x2d, 0xbd, 0x2d, 0xca, 0x2d, 0xd0, 0x2d, + 0xde, 0x2d, 0xee, 0x2e, 0x1e, 0x2e, 0x6a, 0x2e, 0xe8, 0x2f, 0x5, 0x2f, + 0x2a, 0x2f, 0x4f, 0x2f, 0xa2, 0x2f, 0xc2, 0x30, 0x5b, 0x31, 0x8, 0x31, + 0x8e, 0x31, 0xb1, 0x31, 0xd6, 0x31, 0xfb, 0x32, 0x29, 0x32, 0x3f, 0x32, + 0x5b, 0x32, 0x7d, 0x32, 0x9e, 0x33, 0x1a, 0x33, 0xac, 0x33, 0xbf, 0x33, + 0xe4, 0x34, 0x1, 0x34, 0x52, 0x34, 0x77, 0x34, 0xa3, 0x35, 0x1d, 0x35, + 0x2b, 0x35, 0x37, 0x35, 0x45, 0x35, 0x58, 0x35, 0x94, 0x35, 0xed, 0x36, + 0x24, 0xfb, 0xf9, 0xe, 0xfb, 0xf9, 0xe, 0xf8, 0xf0, 0xd4, 0x42, 0xf7, + 0x26, 0x12, 0x13, 0x40, 0xf7, 0x30, 0xf9, 0x82, 0x15, 0x49, 0x94, 0xae, + 0x3b, 0xf7, 0x4, 0x1b, 0xf7, 0x11, 0xb9, 0xf7, 0x4, 0xad, 0x96, 0x1f, + 0x43, 0x6, 0x13, 0x80, 0x75, 0x80, 0x6c, 0x58, 0x4b, 0x1b, 0x13, 0x40, + 0x55, 0x76, 0xad, 0xb2, 0x81, 0x1f, 0xe, 0xf8, 0xfa, 0xf7, 0x7, 0x1, + 0xf7, 0x7f, 0xf8, 0xfa, 0x15, 0xf7, 0x10, 0x6, 0xa5, 0xf7, 0x7, 0x5, + 0xfb, 0x10, 0x6, 0xe, 0xf7, 0x5c, 0xf9, 0x36, 0x15, 0x51, 0xbd, 0x5b, + 0xc8, 0xc5, 0xbe, 0xb9, 0xc7, 0xc7, 0x59, 0xb5, 0x50, 0x4c, 0x5b, 0x60, + 0x50, 0x1e, 0xc7, 0x16, 0xa5, 0xa1, 0x9d, 0xa8, 0xa5, 0xa2, 0x7a, 0x70, + 0x70, 0x74, 0x76, 0x71, 0x6f, 0x74, 0xa0, 0xa6, 0x1e, 0xe, 0x72, 0xa, + 0xf7, 0x1d, 0xf8, 0xf0, 0x15, 0xf3, 0x52, 0xa, 0xf7, 0x6, 0xfb, 0x26, + 0x15, 0xf3, 0x52, 0xa, 0xe, 0xfb, 0x78, 0xd9, 0xf7, 0x2a, 0x77, 0x1, + 0xb4, 0xdc, 0x3, 0xd6, 0x16, 0x83, 0x7a, 0x71, 0x4f, 0x54, 0x1a, 0x46, + 0xb1, 0x70, 0xc3, 0xaf, 0xbe, 0x9b, 0x9b, 0xa6, 0x1e, 0x9a, 0xcd, 0x5, + 0x89, 0x86, 0x55, 0x79, 0x6a, 0x1b, 0x76, 0x6e, 0x95, 0xb2, 0x9b, 0x8f, + 0xaa, 0xa2, 0xc1, 0x1f, 0xe, 0x72, 0xa, 0xf7, 0x68, 0xf8, 0xf0, 0x8e, + 0xa, 0xf7, 0x2c, 0xf7, 0x26, 0x7a, 0xa, 0x32, 0x34, 0x63, 0xe2, 0x5, + 0x25, 0x6, 0xe, 0x48, 0xa, 0x1, 0xd0, 0x16, 0xf7, 0x23, 0x6, 0xf7, + 0x2, 0xf8, 0xa8, 0x47, 0xa, 0xe, 0xfc, 0x68, 0x8d, 0x76, 0xf9, 0x6d, + 0x77, 0x1, 0x29, 0x78, 0x15, 0xf8, 0xdd, 0xf9, 0x6d, 0x5, 0x3f, 0x6, + 0xfc, 0xdd, 0xfd, 0x6d, 0x5, 0xe, 0x84, 0xa, 0xf9, 0x6b, 0x77, 0x1, + 0xe2, 0x16, 0xf7, 0x21, 0x6, 0xe3, 0xf8, 0x33, 0x5, 0xef, 0x6, 0xa1, + 0xf1, 0x5, 0x27, 0x6, 0xda, 0x9a, 0x9d, 0xa4, 0xb2, 0x1b, 0x99, 0x9d, + 0x87, 0x7d, 0xb1, 0x1f, 0xa6, 0xf0, 0x5, 0x9c, 0x55, 0x59, 0x91, 0x6b, + 0x1b, 0xfb, 0x17, 0x81, 0x28, 0xfb, 0x3, 0x6a, 0x1f, 0x3b, 0x6, 0x76, + 0x25, 0x5, 0xda, 0x6, 0xf7, 0x79, 0xfc, 0x33, 0x15, 0x9b, 0xa, 0xf7, + 0x1, 0xf8, 0x99, 0x3d, 0xa, 0x9a, 0xd2, 0x15, 0xf7, 0x21, 0x6, 0xa5, + 0xf7, 0x13, 0x65, 0xa, 0x84, 0xa, 0xf8, 0x33, 0xf1, 0xf7, 0x66, 0x77, + 0x1, 0xf8, 0x28, 0x16, 0xf7, 0x20, 0x6, 0xf7, 0x2b, 0xf9, 0x5f, 0x3d, + 0xa, 0xfc, 0x67, 0xfd, 0x5f, 0x15, 0x9b, 0xa, 0xe2, 0xf8, 0x33, 0x5, + 0xef, 0x6, 0xa0, 0xf1, 0x5, 0x27, 0x6, 0xda, 0x9c, 0x9a, 0xa4, 0xb2, + 0x1b, 0x99, 0x9f, 0x86, 0x7e, 0xb0, 0x1f, 0xa6, 0xf0, 0x5, 0x9c, 0x55, + 0x5a, 0x91, 0x6a, 0x1b, 0xfb, 0x15, 0x80, 0x28, 0xfb, 0x3, 0x6a, 0x1f, + 0x3c, 0x6, 0x75, 0x25, 0x5, 0xda, 0x6, 0xe, 0x87, 0xa, 0xcf, 0x16, + 0xf8, 0x9a, 0x50, 0xa, 0xfc, 0x4, 0x6, 0xbe, 0xf7, 0x84, 0xf7, 0x4c, + 0xee, 0xa3, 0xf7, 0x7, 0xfb, 0x4c, 0x28, 0xbd, 0xf7, 0x86, 0x94, 0xa, + 0x44, 0xfb, 0xe0, 0x30, 0x59, 0x73, 0xfb, 0x8, 0xe6, 0xbd, 0x5, 0xe, + 0xfb, 0xf9, 0x37, 0xa, 0xdc, 0x16, 0xf7, 0x20, 0x6, 0xd6, 0xf8, 0x0, + 0xe7, 0xcc, 0x9e, 0xe9, 0x2e, 0x4a, 0xc2, 0xf7, 0x98, 0x5, 0xfb, 0x20, + 0x6, 0x44, 0xfb, 0xe8, 0x29, 0x48, 0x77, 0x2d, 0xef, 0xcd, 0x5, 0xe, + 0x73, 0x8b, 0xf7, 0xd, 0xf8, 0x7f, 0xf7, 0x10, 0xbe, 0x95, 0xa, 0xa4, + 0x16, 0xf8, 0xcb, 0x40, 0xa, 0x8c, 0x8a, 0x2c, 0x8b, 0x2b, 0x1b, 0x52, + 0x4c, 0x8b, 0x8a, 0x44, 0x1f, 0xf8, 0x3e, 0xf8, 0x88, 0xa0, 0xf7, 0x8, + 0x5, 0xfc, 0xa2, 0x6, 0x71, 0xfb, 0x10, 0x5, 0xf7, 0xe8, 0x6, 0xfc, + 0x37, 0xfc, 0x84, 0x5, 0xf7, 0xc7, 0xf9, 0x33, 0x15, 0xf7, 0x19, 0x6, + 0xf7, 0x28, 0x67, 0xa, 0xfb, 0xa, 0x6, 0x34, 0x31, 0x65, 0xe5, 0x5, + 0x27, 0x6, 0xe, 0xfb, 0x1b, 0x8b, 0xf7, 0x9, 0xf7, 0xc0, 0xf7, 0x5, + 0xd0, 0x95, 0xa, 0x9f, 0x16, 0xf8, 0x69, 0x6, 0xa5, 0xf7, 0x9, 0x5, + 0xfb, 0xa8, 0x6, 0xf7, 0xd1, 0xf7, 0xdb, 0x9e, 0xe1, 0x5, 0xfc, 0x56, + 0x6, 0x72, 0xfb, 0x5, 0x5, 0xf7, 0x94, 0x6, 0xfb, 0xce, 0xfb, 0xd3, + 0x5, 0xf7, 0x83, 0xf8, 0x89, 0x15, 0xf7, 0x25, 0x6, 0xf7, 0x34, 0x67, + 0xa, 0xfb, 0x14, 0x6, 0x2d, 0x31, 0x61, 0xe5, 0x5, 0x20, 0x6, 0xe, + 0x8b, 0xf7, 0x1b, 0xf8, 0xdb, 0x77, 0x1, 0xe9, 0xf7, 0xc3, 0x3, 0xe9, + 0x16, 0x7c, 0xa, 0xa8, 0xf7, 0x1b, 0x47, 0xa, 0xb1, 0xbb, 0x15, 0xdb, + 0x6, 0xf7, 0x8, 0xf7, 0xf5, 0xb2, 0xf7, 0x4a, 0x5, 0xfb, 0x2d, 0x6, + 0x67, 0xfb, 0x4a, 0x5, 0xe, 0xfb, 0x35, 0xf8, 0x68, 0x76, 0xf7, 0xa3, + 0x77, 0x1, 0xf7, 0x55, 0xf7, 0x25, 0xb9, 0xf7, 0x25, 0x3, 0xf8, 0x14, + 0xf8, 0x53, 0x15, 0xdd, 0x6, 0xb5, 0xf7, 0x22, 0xa0, 0xf7, 0x15, 0x7a, + 0xa, 0x78, 0xfb, 0x15, 0x5, 0xfb, 0x57, 0xfb, 0x22, 0x15, 0xdd, 0x6, + 0xb7, 0xf7, 0x22, 0x9e, 0xf7, 0x15, 0x5, 0xfb, 0xd, 0x6, 0x77, 0xfb, + 0x15, 0x5, 0xe, 0x3c, 0xa0, 0x76, 0xf8, 0x35, 0xf2, 0xf7, 0x46, 0x77, + 0x1, 0xe6, 0x16, 0xf7, 0xb, 0x6, 0xb5, 0xf7, 0x47, 0x5, 0xf7, 0xb, + 0x6, 0x61, 0xfb, 0x47, 0x5, 0xf7, 0xb, 0x6, 0xb5, 0xf7, 0x47, 0x5, + 0xf7, 0x2e, 0xf1, 0xfb, 0x16, 0x6, 0xab, 0xf7, 0x1c, 0x5, 0xed, 0xf2, + 0x41, 0x6, 0xb5, 0xf7, 0x46, 0x5, 0xfb, 0xf, 0x6, 0x62, 0xfb, 0x46, + 0x5, 0xfb, 0x9, 0x6, 0xb5, 0xf7, 0x46, 0x5, 0xfb, 0xb, 0x6, 0x60, + 0xfb, 0x46, 0x5, 0xfb, 0x2b, 0x24, 0xf7, 0x13, 0x6, 0x6c, 0xfb, 0x1c, + 0x5, 0x2b, 0x25, 0xd3, 0x6, 0xf7, 0x24, 0xf1, 0x15, 0xaa, 0xf7, 0x1c, + 0x5, 0xf7, 0xa, 0x6, 0x6b, 0xfb, 0x1c, 0x5, 0xe, 0x3c, 0x2d, 0x76, + 0xe3, 0xf7, 0x3, 0xf9, 0x47, 0x77, 0x1, 0xf7, 0x2e, 0xf7, 0xe, 0xf7, + 0x46, 0xf7, 0xc, 0x3, 0xce, 0xf7, 0x5b, 0x15, 0x93, 0xfb, 0x7, 0xcf, + 0x3c, 0xec, 0x73, 0x76, 0x2b, 0x18, 0xd4, 0x6, 0x9e, 0xe3, 0x5, 0xf7, + 0x41, 0xe5, 0xf4, 0xf7, 0x5, 0xf7, 0x26, 0xfb, 0x12, 0xc9, 0x5f, 0x9c, + 0x1f, 0xb6, 0xf7, 0x5b, 0x97, 0x85, 0xa7, 0x7b, 0x94, 0x53, 0x19, 0xf7, + 0x12, 0x93, 0x80, 0xf7, 0x6, 0x42, 0xba, 0x47, 0x9d, 0x19, 0x95, 0xbe, + 0x5, 0x44, 0x6, 0x81, 0x61, 0x5, 0xfb, 0xb, 0xfb, 0x12, 0x4e, 0xfb, + 0x1d, 0x5b, 0x9f, 0xfb, 0x5, 0xf7, 0x1d, 0x50, 0x1f, 0x5c, 0xfb, 0x71, + 0x50, 0xa5, 0x84, 0xcd, 0x89, 0xa0, 0x19, 0xf7, 0x22, 0xf7, 0x82, 0x15, + 0x66, 0xa0, 0x72, 0xa7, 0xb4, 0x1a, 0xba, 0xb2, 0xb9, 0xc8, 0x89, 0x1e, + 0x61, 0xfc, 0xb2, 0x15, 0xb5, 0xf7, 0x5c, 0x5, 0xb4, 0x77, 0xb0, 0x76, + 0x57, 0x1a, 0x63, 0x70, 0x4f, 0x2e, 0x84, 0x1e, 0xe, 0xf7, 0x92, 0x7a, + 0xdb, 0x4e, 0x76, 0xf7, 0xaf, 0xdc, 0x8f, 0xdb, 0xf7, 0x5d, 0xdb, 0x8a, + 0x77, 0x12, 0xf7, 0xfa, 0xf0, 0xf7, 0xe9, 0xf0, 0x13, 0x7b, 0xf7, 0x81, + 0xf8, 0x6e, 0x15, 0x90, 0x99, 0xf7, 0x2b, 0xce, 0x9d, 0xa1, 0x82, 0x68, + 0x76, 0x7e, 0xfb, 0x1c, 0x47, 0x63, 0x8b, 0xaa, 0x99, 0x1e, 0x47, 0xfc, + 0x81, 0x15, 0xf7, 0x2, 0x6, 0x13, 0x77, 0xf8, 0xe2, 0xf9, 0x6c, 0x5, + 0xfb, 0x3, 0x6, 0xfd, 0x2, 0xfb, 0x75, 0x15, 0x4b, 0xb0, 0x44, 0xeb, + 0xf7, 0x30, 0xad, 0xf7, 0x2f, 0xcb, 0x1e, 0x13, 0xbb, 0xc4, 0x71, 0xe0, + 0xfb, 0x1, 0xfb, 0x1f, 0x5a, 0xfb, 0x1a, 0x2f, 0x1e, 0xf8, 0x4e, 0xfc, + 0x1, 0x15, 0x4a, 0xb0, 0x44, 0xeb, 0xf7, 0x2f, 0xae, 0xf7, 0x30, 0xcb, + 0xc4, 0x70, 0xe0, 0x20, 0xfb, 0x20, 0x5a, 0xfb, 0x1b, 0x30, 0x1e, 0xf0, + 0x81, 0x15, 0x91, 0x98, 0xf7, 0x29, 0xd0, 0x9b, 0xa2, 0x83, 0x68, 0x76, + 0x7d, 0xfb, 0x1d, 0x48, 0x63, 0x8b, 0xab, 0x99, 0x1e, 0xe, 0xe2, 0x7d, + 0xf7, 0x5, 0x2a, 0x76, 0xf9, 0x19, 0xe5, 0x12, 0xe4, 0xf7, 0x23, 0x9a, + 0xf7, 0x19, 0x13, 0x98, 0xf7, 0xac, 0xf8, 0x3b, 0x15, 0x4b, 0x6b, 0xfb, + 0x13, 0x4e, 0xfb, 0x1f, 0x1a, 0x32, 0xcd, 0xfb, 0x8, 0xf7, 0x49, 0xec, + 0xd4, 0xad, 0xa9, 0xb2, 0x1e, 0x13, 0x58, 0x9f, 0x77, 0xb4, 0x69, 0xa6, + 0x7c, 0xe7, 0xe6, 0x18, 0x8a, 0x8c, 0x86, 0x8f, 0x8c, 0x1a, 0x6d, 0xa2, + 0x7d, 0x98, 0x72, 0xa2, 0xa7, 0xa5, 0xae, 0xbb, 0x9e, 0xae, 0x23, 0xc6, + 0x18, 0x68, 0x56, 0x7b, 0x7c, 0x81, 0x81, 0x76, 0xa1, 0x58, 0xd1, 0x62, + 0xcf, 0x8, 0x13, 0x8, 0xf7, 0x2f, 0xd6, 0x9c, 0xe3, 0xab, 0x1a, 0x13, + 0x28, 0xc7, 0x56, 0xd7, 0xfb, 0xc, 0x23, 0x25, 0x54, 0xfb, 0x9, 0x5e, + 0x99, 0x62, 0x9e, 0x66, 0x1e, 0xbf, 0x2a, 0x15, 0xac, 0x52, 0xbf, 0x40, + 0xbb, 0x53, 0x8, 0x13, 0x98, 0x7c, 0x73, 0x63, 0x73, 0x4f, 0x1b, 0x3e, + 0x6b, 0xb7, 0xbb, 0xd9, 0xd5, 0xb7, 0xa5, 0x98, 0x1f, 0xd1, 0xf7, 0x2f, + 0x15, 0x84, 0x98, 0x7c, 0x9f, 0xab, 0x1a, 0x13, 0x0, 0xb6, 0xaa, 0xb2, + 0xb2, 0xac, 0x9f, 0x77, 0x71, 0x5f, 0x50, 0x66, 0x61, 0x77, 0x1e, 0xe, + 0xfc, 0x21, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77, 0x1, 0xf7, 0x39, 0xf8, + 0x53, 0x15, 0xe4, 0x6, 0xb7, 0xf7, 0x22, 0xa2, 0xf7, 0x15, 0x66, 0xa, + 0x77, 0xfb, 0x15, 0x5, 0xe, 0xfb, 0x4f, 0x76, 0xfa, 0x42, 0x77, 0x1, + 0xd7, 0xf7, 0x19, 0x3, 0xf7, 0x33, 0xfb, 0x64, 0x15, 0xf1, 0x6, 0x8c, + 0x89, 0x92, 0x8a, 0x8d, 0x1e, 0x6d, 0xed, 0x78, 0xf7, 0x2c, 0xf4, 0x1a, + 0xf7, 0x9a, 0xf7, 0x2a, 0xf7, 0x76, 0xf7, 0x3, 0xe4, 0x1e, 0xfb, 0x5, + 0x6, 0x32, 0x2d, 0xfb, 0x54, 0xfb, 0x62, 0xfb, 0xa9, 0x1a, 0x50, 0x94, + 0xfb, 0x22, 0xd5, 0xfb, 0x38, 0x1e, 0xe, 0xfb, 0x4f, 0x76, 0xfa, 0x42, + 0x77, 0x1, 0xf7, 0x80, 0xf7, 0x19, 0x3, 0x72, 0xfb, 0x64, 0x15, 0xf7, + 0x5, 0x6, 0xe4, 0xe9, 0xf7, 0x54, 0xf7, 0x62, 0xf7, 0xa9, 0x1a, 0xc6, + 0x82, 0xf7, 0x22, 0x41, 0xf7, 0x38, 0x1e, 0x25, 0x6, 0xab, 0x26, 0x9f, + 0xfb, 0x2d, 0xfb, 0x1, 0x1a, 0xfb, 0xd1, 0xfb, 0x5e, 0xfb, 0x6e, 0x50, + 0x5f, 0x1e, 0xe, 0xfb, 0x8a, 0xf8, 0x2c, 0x76, 0xf7, 0xdf, 0x77, 0x1, + 0xf7, 0x8c, 0xf8, 0x17, 0x15, 0xcc, 0xf7, 0x2, 0xca, 0xfb, 0x2, 0xd0, + 0xc1, 0x39, 0xe8, 0xf7, 0xa, 0xa4, 0x71, 0xe0, 0xfb, 0x6, 0x57, 0x97, + 0xf7, 0x12, 0x5, 0x37, 0x6, 0x98, 0xfb, 0x12, 0xfb, 0x0, 0xc2, 0x6f, + 0x36, 0xf7, 0xa, 0x6f, 0x32, 0x2d, 0x5, 0xe, 0x58, 0xf7, 0x52, 0xf7, + 0x14, 0x1, 0xf7, 0xab, 0xf7, 0x19, 0x3, 0xdd, 0xf7, 0x52, 0x15, 0xf7, + 0x59, 0xfb, 0x52, 0xf7, 0x19, 0xf7, 0x52, 0xf7, 0x5a, 0xf7, 0x14, 0xfb, + 0x5a, 0xf7, 0x50, 0xfb, 0x19, 0xfb, 0x50, 0xfb, 0x59, 0x6, 0xe, 0xfb, + 0xf9, 0xfb, 0x27, 0x76, 0xf7, 0xce, 0x77, 0x1, 0xc9, 0x8d, 0x15, 0xd0, + 0x6, 0x7d, 0x4a, 0x70, 0x74, 0x5b, 0x80, 0x7d, 0x44, 0x18, 0xf7, 0x2d, + 0x8e, 0xa4, 0xf7, 0x16, 0x98, 0xca, 0xa5, 0xf7, 0xa, 0x18, 0xfb, 0x2d, + 0x6, 0xe, 0xf7, 0x6b, 0xf7, 0x16, 0x1, 0xd4, 0xf7, 0x6b, 0x15, 0xf7, + 0xa9, 0x6, 0xa8, 0xf7, 0x16, 0x5, 0xfb, 0xa9, 0x6, 0xe, 0xfb, 0xf9, + 0x8b, 0xf7, 0x26, 0x1, 0xcb, 0x16, 0xf7, 0x2b, 0x6, 0xa9, 0xf7, 0x26, + 0x5, 0x97, 0xa, 0xe, 0xfb, 0xf9, 0x78, 0xa, 0x76, 0xf8, 0x8d, 0x3, + 0x66, 0x78, 0x15, 0xef, 0x6, 0xf8, 0x29, 0xf9, 0x88, 0x5, 0x25, 0x6, + 0xe, 0x3c, 0x78, 0xf7, 0x4, 0xf8, 0x8d, 0xf7, 0x4, 0x1, 0xe1, 0xf7, + 0xf, 0xf7, 0xb0, 0xf7, 0x10, 0x3, 0xe1, 0xf7, 0x63, 0x15, 0xfb, 0x3b, + 0xea, 0x50, 0xf7, 0x6, 0xf7, 0x81, 0xe0, 0xf7, 0xe6, 0xf7, 0x30, 0xf7, + 0x3e, 0x2d, 0xcc, 0xfb, 0x5, 0xfb, 0x7a, 0x2d, 0xfb, 0xe3, 0xfb, 0x3c, + 0x1e, 0xf7, 0xf, 0x16, 0xb6, 0xc6, 0xf7, 0xf0, 0xf7, 0x1b, 0xc5, 0xab, + 0x3c, 0x5f, 0x44, 0x52, 0xfb, 0xcb, 0xfb, 0x1b, 0x45, 0x75, 0xe6, 0xa2, + 0x1e, 0xe, 0x3c, 0xa0, 0x76, 0xf9, 0x5a, 0x77, 0x1, 0xf7, 0x41, 0xf7, + 0xf8, 0x3, 0xf7, 0x9c, 0x16, 0xf7, 0x14, 0x6, 0xf7, 0x1d, 0xf9, 0x5a, + 0x5, 0x3e, 0x6, 0x39, 0x2c, 0xfb, 0x1, 0x56, 0x4b, 0x6c, 0x73, 0xfb, + 0x10, 0x18, 0xb3, 0x95, 0xdb, 0xa7, 0xcd, 0xba, 0x8, 0xe, 0x3c, 0x8b, + 0xf7, 0x12, 0xf8, 0x6f, 0xf7, 0x1, 0x1, 0xf8, 0x54, 0xf7, 0x20, 0x3, + 0xa4, 0x16, 0xf8, 0x74, 0x6, 0xa9, 0xf7, 0x12, 0x5, 0xfb, 0xa6, 0x6, + 0xb0, 0xb5, 0x9b, 0x99, 0xf7, 0x10, 0xf2, 0x8, 0xf7, 0x0, 0xe4, 0xb5, + 0xd1, 0xd7, 0x1a, 0xdf, 0x4f, 0xf5, 0xfb, 0x45, 0xfb, 0x15, 0x28, 0x45, + 0xfb, 0x19, 0x73, 0x1e, 0xf7, 0x21, 0x77, 0x5, 0xbf, 0x96, 0xae, 0xc9, + 0xd1, 0x1b, 0xc3, 0xaf, 0x61, 0x65, 0x38, 0xfb, 0x14, 0x35, 0x40, 0x48, + 0x1f, 0xfb, 0x2, 0x2f, 0x2d, 0x3f, 0x7b, 0xfb, 0x9, 0x8, 0xe, 0x3c, + 0x78, 0xf7, 0x6, 0xf7, 0x63, 0xf7, 0x9, 0xf7, 0x46, 0xf7, 0x5, 0x1, + 0xf8, 0x60, 0xf7, 0x28, 0x3, 0xcc, 0xf7, 0x47, 0x15, 0xfb, 0x2b, 0xa0, + 0xf7, 0x4, 0x5c, 0xf2, 0x1b, 0xf7, 0x3b, 0xf3, 0xf7, 0xb, 0xf7, 0x1, + 0xc9, 0x68, 0xc5, 0x50, 0xa8, 0x1f, 0xcc, 0xa1, 0xcc, 0xc3, 0xe3, 0x1a, + 0xe0, 0x45, 0xf0, 0xfb, 0x2f, 0xfb, 0x4c, 0x65, 0xfb, 0x25, 0x64, 0x7e, + 0x1e, 0xf7, 0x1d, 0x71, 0x5, 0xc1, 0x9a, 0xa7, 0xb6, 0xc2, 0x1b, 0xaa, + 0xb9, 0x7c, 0x51, 0x49, 0x4f, 0x64, 0x3d, 0x1f, 0x71, 0xfb, 0x9, 0x5, + 0xd0, 0xc2, 0x72, 0x47, 0x4e, 0x5e, 0x56, 0x42, 0x4b, 0x77, 0xb5, 0xc5, + 0x81, 0x1f, 0xe, 0x3c, 0xa0, 0x76, 0xf7, 0x25, 0xf7, 0xa, 0xf8, 0x38, + 0x77, 0x1, 0xc7, 0xf8, 0xae, 0x3, 0xc7, 0xf7, 0x25, 0x15, 0xf7, 0xb1, + 0x6, 0x6b, 0xfb, 0x25, 0x5, 0xf7, 0x1a, 0x6, 0xaa, 0xf7, 0x25, 0x5, + 0xe3, 0x6, 0xa4, 0xf7, 0xa, 0x5, 0x33, 0x6, 0xea, 0xf8, 0x53, 0x7a, + 0xa, 0xfc, 0x1b, 0xfc, 0x55, 0x5, 0xf7, 0x22, 0x8d, 0x15, 0xf7, 0x50, + 0xf7, 0x72, 0x8d, 0x89, 0x5c, 0xfb, 0x70, 0x5, 0xe, 0x20, 0x78, 0xf7, + 0x7, 0xf7, 0xab, 0xf2, 0xf7, 0x2, 0xf7, 0x14, 0x1, 0xc8, 0xf7, 0x24, + 0xf7, 0x73, 0xf7, 0x27, 0x3, 0xc8, 0xf7, 0x5a, 0x15, 0xfb, 0x22, 0x8d, + 0xf1, 0x40, 0xf7, 0x9, 0x1b, 0xf7, 0x44, 0xf7, 0x9, 0xf7, 0x27, 0xf7, + 0x28, 0xf7, 0x9, 0x3d, 0xe0, 0xfb, 0xd, 0x60, 0x73, 0x81, 0x83, 0x78, + 0x1f, 0xae, 0xf7, 0x2, 0x5, 0xf7, 0x8f, 0x6, 0xa7, 0xf7, 0x14, 0x5, + 0xfc, 0x11, 0x6, 0xfb, 0x6, 0xfc, 0x1, 0xf7, 0xe, 0x82, 0x5, 0xbe, + 0xbc, 0xbd, 0x8b, 0x94, 0x1b, 0xb7, 0xb8, 0x73, 0x3f, 0xfb, 0x9, 0x42, + 0x4d, 0x49, 0x4a, 0x75, 0xbc, 0xcc, 0x8e, 0x1f, 0xe, 0x3c, 0x78, 0xf7, + 0x4, 0xf7, 0xb0, 0xe7, 0xf7, 0x15, 0xf7, 0x4, 0x1, 0xe0, 0xf7, 0x26, + 0xf7, 0x5e, 0xf7, 0x27, 0x3, 0xf7, 0xa3, 0xf8, 0x4c, 0x15, 0xb7, 0x98, + 0xaf, 0xf7, 0x6, 0xe3, 0x1b, 0xc9, 0x90, 0x59, 0x72, 0x8d, 0x1f, 0xf7, + 0x22, 0x94, 0x5, 0xf7, 0xd, 0x7c, 0x45, 0xc4, 0xfb, 0x7, 0x1b, 0xfb, + 0x6b, 0xfb, 0xb, 0xfb, 0x8f, 0xfb, 0x81, 0xfb, 0x10, 0xd7, 0xfb, 0x9, + 0xf7, 0x2a, 0xf7, 0x43, 0xe9, 0xf7, 0x2a, 0xf7, 0x14, 0xf7, 0x11, 0x3a, + 0xe0, 0xfb, 0x10, 0x64, 0x6a, 0x82, 0x77, 0x6b, 0x1f, 0x63, 0xfb, 0x6e, + 0x15, 0xe3, 0xb8, 0xce, 0xd7, 0xb0, 0xb7, 0x6d, 0x33, 0xfb, 0x0, 0x54, + 0x51, 0x4c, 0x47, 0x7b, 0xde, 0xb9, 0x1e, 0xe, 0x3c, 0xa0, 0x76, 0xf8, + 0xdd, 0xf7, 0x11, 0x1, 0xf7, 0x27, 0x16, 0xf7, 0x27, 0x6, 0xa7, 0xf7, + 0x1c, 0xf7, 0x2d, 0xf7, 0xe7, 0xf7, 0x47, 0xf7, 0x13, 0xa1, 0xeb, 0x18, + 0xfc, 0x9c, 0x6, 0x6c, 0xfb, 0x11, 0x5, 0xf7, 0xe7, 0x6, 0xfb, 0x8e, + 0xfb, 0x9c, 0x4b, 0xfb, 0xb3, 0x88, 0x75, 0x8, 0xe, 0x3c, 0x78, 0xf6, + 0xf7, 0x80, 0xf6, 0xf7, 0x38, 0xf6, 0x1, 0xd0, 0xf7, 0x2d, 0xf7, 0x65, + 0xf7, 0x29, 0x3, 0xf7, 0x7c, 0xf8, 0x16, 0x15, 0xfb, 0x21, 0x5f, 0x75, + 0xfb, 0xd, 0x5d, 0x1a, 0x22, 0xdc, 0x32, 0xf7, 0x28, 0xf7, 0x48, 0xf1, + 0xf7, 0x13, 0xf7, 0x6, 0xee, 0x47, 0xb1, 0x6f, 0x9b, 0x1e, 0xac, 0x98, + 0xee, 0xa9, 0xf7, 0x0, 0x1a, 0xf0, 0x37, 0xde, 0xfb, 0x1e, 0xfb, 0x3e, + 0x41, 0xfb, 0xd, 0x38, 0x3b, 0xc6, 0x71, 0xa2, 0x7d, 0x1e, 0x81, 0xfb, + 0x67, 0x15, 0xcf, 0xb3, 0xdc, 0xdd, 0xbe, 0xaf, 0x55, 0x5b, 0x60, 0x72, + 0x30, 0x29, 0x62, 0x5e, 0xa4, 0xc9, 0x1e, 0xcf, 0xf7, 0xdf, 0x15, 0xc4, + 0xbd, 0xb3, 0xbf, 0xc1, 0xa7, 0x65, 0x64, 0x59, 0x5b, 0x5e, 0x53, 0x5b, + 0x6b, 0xab, 0xb6, 0x1e, 0xe, 0x3c, 0x78, 0xf7, 0x4, 0xfb, 0x4, 0xf7, + 0x4a, 0xc6, 0xe7, 0xf7, 0xb0, 0xf7, 0x4, 0x1, 0xf7, 0x9, 0xf7, 0x28, + 0xf7, 0x5e, 0xf7, 0x28, 0x3, 0xd9, 0xf7, 0x33, 0x15, 0xfb, 0xd, 0x9a, + 0xd2, 0x52, 0xf7, 0x7, 0x1b, 0xf7, 0x6c, 0xf7, 0xc, 0xf7, 0x90, 0xf7, + 0x81, 0xf7, 0x10, 0x3f, 0xf7, 0x8, 0xfb, 0x2b, 0xfb, 0x44, 0x2c, 0xfb, + 0x2f, 0xfb, 0x14, 0xfb, 0x11, 0xdd, 0x3b, 0xf7, 0x11, 0xb2, 0xab, 0x94, + 0x9f, 0xac, 0x1f, 0x5f, 0x7e, 0x67, 0xfb, 0x6, 0x32, 0x1b, 0x4d, 0x86, + 0xbd, 0xa4, 0x88, 0x1f, 0xb8, 0xf7, 0x97, 0x15, 0xf7, 0x0, 0xc2, 0xca, + 0xca, 0xd0, 0x9a, 0x3a, 0x5d, 0x33, 0x5f, 0x46, 0x3e, 0x67, 0x5e, 0xa4, + 0xe3, 0x1e, 0xe, 0x8b, 0xf7, 0x17, 0xf7, 0x8f, 0xf7, 0x16, 0x1, 0xf7, + 0x44, 0xf8, 0x12, 0x15, 0xf7, 0x26, 0x6, 0xa8, 0xf7, 0x16, 0x93, 0xa, + 0xfb, 0x5, 0xfc, 0x94, 0x15, 0xf7, 0x26, 0x6, 0xa8, 0xf7, 0x17, 0x93, + 0xa, 0xe, 0xfb, 0x27, 0x76, 0xf7, 0x47, 0x76, 0xf8, 0x19, 0xf7, 0x19, + 0x1, 0xc3, 0xf7, 0xbb, 0x3, 0xe5, 0x81, 0x15, 0xcf, 0x6, 0x7d, 0x4f, + 0x70, 0x75, 0x5c, 0x81, 0x7d, 0x49, 0x18, 0xf7, 0x2a, 0x8e, 0xa5, 0xf7, + 0xd, 0x97, 0xc5, 0xa5, 0xf7, 0x2, 0x18, 0x97, 0xa, 0xc2, 0xf7, 0x93, + 0x15, 0xf7, 0x27, 0x6, 0xa9, 0xf7, 0x19, 0x7b, 0xa, 0xe, 0x58, 0x98, + 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xdd, 0xf7, 0x58, 0x15, 0xf8, 0x8b, 0xfb, + 0x60, 0x5, 0xf7, 0x17, 0x7, 0xfb, 0xdd, 0xf7, 0x17, 0xf7, 0xdd, 0xf7, + 0x13, 0x5, 0xf7, 0x19, 0x7, 0xfc, 0x8b, 0xfb, 0x60, 0x5, 0xe, 0x58, + 0xe2, 0xf7, 0xb, 0xe9, 0xf7, 0xb, 0x1, 0xc5, 0xf8, 0xd3, 0x3, 0xc5, + 0xe2, 0x15, 0xf8, 0xd3, 0xf7, 0xb, 0xfc, 0xd3, 0x6, 0xe9, 0x4, 0xf8, + 0xd3, 0xf7, 0xb, 0xfc, 0xd3, 0x6, 0xe, 0x58, 0x98, 0x76, 0xf8, 0x9e, + 0x77, 0x1, 0xf5, 0x83, 0x15, 0xf8, 0x8b, 0xf7, 0x60, 0x5, 0xf7, 0x6, + 0x7, 0xfc, 0x8b, 0xf7, 0x60, 0x98, 0xa, 0x7, 0xf7, 0xdc, 0xfb, 0x17, + 0xfb, 0xdc, 0xfb, 0x13, 0x5, 0xe, 0x73, 0x8b, 0xf7, 0x1b, 0xf8, 0x7d, + 0xf2, 0x1, 0xf7, 0x98, 0xf7, 0x47, 0x15, 0xf7, 0x15, 0x6, 0x96, 0xca, + 0x9f, 0x9b, 0xdd, 0xce, 0x8, 0xf7, 0xa, 0xea, 0xbe, 0xbc, 0xda, 0x1a, + 0xdf, 0x45, 0xea, 0xfb, 0x35, 0xfb, 0x50, 0x46, 0xfb, 0x1b, 0x45, 0x79, + 0x1e, 0xf7, 0x17, 0x74, 0x5, 0xf7, 0x9, 0xa6, 0xd3, 0x93, 0xb6, 0x1b, + 0xd8, 0xa1, 0x5f, 0x6b, 0x66, 0x75, 0x79, 0x35, 0x42, 0x1f, 0xfb, 0x4, + 0x2d, 0x61, 0x5b, 0x7c, 0x28, 0x8, 0x5f, 0xfb, 0x47, 0x15, 0xf7, 0x21, + 0x6, 0xa9, 0xf7, 0x1b, 0x92, 0xa, 0xe, 0xf8, 0x49, 0x4d, 0xda, 0xf7, + 0x0, 0xda, 0xf7, 0xca, 0xda, 0xed, 0xda, 0x1, 0xf7, 0x61, 0xdb, 0xe0, + 0xf7, 0x5, 0xf8, 0x64, 0xdb, 0x3, 0xf9, 0x25, 0xf7, 0x42, 0x15, 0x79, + 0x8f, 0x94, 0x6c, 0xce, 0x1b, 0xf7, 0x46, 0xf7, 0x4, 0xf7, 0x37, 0xf7, + 0x28, 0xf7, 0x4c, 0xfb, 0x1b, 0xf7, 0x2a, 0xfb, 0x83, 0xfb, 0xd4, 0xfb, + 0x14, 0xfb, 0x87, 0xfb, 0x5b, 0xfb, 0xa5, 0xf7, 0x7f, 0xfb, 0x9, 0xf7, + 0x6c, 0xf7, 0x1d, 0xf7, 0x47, 0xb4, 0xf7, 0x2e, 0xd8, 0x1f, 0x2f, 0x6, + 0x68, 0x6d, 0x46, 0x3a, 0xfb, 0x5e, 0x1b, 0xfb, 0xb5, 0x39, 0xf7, 0x41, + 0xf7, 0x1e, 0xf7, 0xf, 0xca, 0xf7, 0x84, 0xf7, 0xc4, 0xf7, 0x7a, 0xcc, + 0xfb, 0x2b, 0x28, 0xfb, 0x1d, 0xfb, 0x3, 0x30, 0x61, 0x73, 0x91, 0xa9, + 0xa8, 0x92, 0x1f, 0xcc, 0xf7, 0xcb, 0x5, 0xfb, 0x6, 0x6, 0x80, 0x5b, + 0x5, 0xc0, 0x67, 0x56, 0x90, 0x6f, 0x1b, 0xfb, 0x30, 0x3b, 0xfb, 0x39, + 0xfb, 0xd, 0x28, 0xc8, 0x38, 0xf5, 0xd0, 0xb3, 0xb1, 0x96, 0x96, 0x1f, + 0xfb, 0x42, 0xf7, 0x19, 0x15, 0xc8, 0xab, 0xf7, 0x26, 0xf0, 0xd2, 0x95, + 0x42, 0x70, 0x51, 0x6a, 0xfb, 0x2c, 0x24, 0x4f, 0x79, 0xbf, 0xbe, 0x1e, + 0xe, 0x68, 0xa, 0xf7, 0x33, 0xf7, 0xc, 0xf8, 0x4b, 0x77, 0x1, 0x9f, + 0x16, 0x5e, 0xa, 0xe1, 0xf7, 0x33, 0x5, 0xf7, 0xaf, 0x6, 0xa3, 0xfb, + 0x33, 0x5, 0xf7, 0x1f, 0x6, 0xfb, 0x8, 0xf9, 0x62, 0x43, 0xa, 0x27, + 0xfc, 0x4b, 0x15, 0xf7, 0x30, 0xf7, 0xb5, 0x5c, 0xa, 0xb3, 0xfb, 0xb5, + 0x5, 0xe, 0xe2, 0x8b, 0xf7, 0xc, 0xf7, 0x50, 0xf7, 0xc, 0xf7, 0x3e, + 0x8b, 0xa, 0xf7, 0xef, 0x6, 0xf7, 0x27, 0xf7, 0x42, 0xb5, 0xf7, 0x4c, + 0xc0, 0x6c, 0xd1, 0x32, 0xa3, 0x1f, 0x8d, 0x7, 0xa9, 0x93, 0xf7, 0x2, + 0x9c, 0xf7, 0x12, 0x1a, 0xf7, 0x23, 0x24, 0xbc, 0xfb, 0x47, 0x1e, 0xfb, + 0x90, 0x6, 0xa2, 0xfc, 0xea, 0x15, 0xb3, 0xf7, 0x50, 0x5, 0xf7, 0x48, + 0x6, 0xa2, 0xe9, 0x8b, 0x39, 0x25, 0x24, 0x87, 0x32, 0x1f, 0x3c, 0xf7, + 0xc8, 0x15, 0xaf, 0xf7, 0x3e, 0x5, 0xf7, 0x9, 0x6, 0xd5, 0xcf, 0x8b, + 0x43, 0x2d, 0x2b, 0x87, 0x37, 0x1f, 0xe, 0xe2, 0x78, 0xf7, 0x12, 0xf8, + 0x8c, 0xf7, 0x12, 0x1, 0xf6, 0xf7, 0x2c, 0x3, 0xf8, 0xe6, 0xf7, 0x95, + 0x15, 0xfb, 0xb, 0x64, 0x34, 0x6c, 0x51, 0x1b, 0x27, 0x58, 0xe3, 0xef, + 0xf7, 0xa, 0x80, 0xa, 0x69, 0x92, 0x1f, 0xf7, 0x28, 0x99, 0x5, 0xf7, + 0x3d, 0x77, 0xfb, 0x16, 0xcd, 0xfb, 0x1c, 0x1b, 0xfb, 0x7f, 0xfb, 0x35, + 0xfb, 0x54, 0xfb, 0x8e, 0xfb, 0x31, 0xce, 0xfb, 0x31, 0xf7, 0x75, 0xf7, + 0x62, 0xf0, 0xf7, 0x1b, 0xf7, 0x9, 0xb6, 0x1f, 0xe, 0x57, 0xa, 0xd7, + 0x16, 0xf7, 0x98, 0x6, 0xf7, 0x7c, 0xf7, 0x65, 0xf7, 0x24, 0xf7, 0xa7, + 0xf7, 0x71, 0xfb, 0x3, 0xd9, 0xfb, 0x81, 0x1f, 0xfb, 0x58, 0x6, 0xa0, + 0xfc, 0xec, 0x15, 0xf3, 0xf8, 0x76, 0x5, 0xe1, 0x6, 0xd8, 0xf4, 0x86, + 0xfb, 0x44, 0xfb, 0x8a, 0xfb, 0x38, 0x54, 0xfb, 0x17, 0x1f, 0xe, 0xab, + 0x8b, 0xf7, 0xc, 0xf7, 0x56, 0xf7, 0xc, 0xf7, 0x38, 0x8b, 0xa, 0xf8, + 0xc4, 0x6, 0xa5, 0x83, 0xa, 0xfc, 0x31, 0x6, 0xb3, 0xf7, 0x56, 0x5, + 0xf7, 0xfe, 0x40, 0xa, 0xfb, 0xfe, 0x6, 0xad, 0xf7, 0x38, 0x5, 0xf8, + 0x14, 0x40, 0xa, 0xfc, 0xa7, 0x6, 0xe, 0x84, 0xa, 0xf7, 0xc5, 0xf7, + 0xc, 0xf7, 0x41, 0x8b, 0xa, 0x5e, 0xa, 0xcc, 0xf7, 0xc5, 0x5, 0xf7, + 0xeb, 0x40, 0xa, 0xfb, 0xea, 0x6, 0xaf, 0xf7, 0x41, 0x5, 0xf7, 0xfe, + 0x40, 0xa, 0xfc, 0x93, 0x6, 0xe, 0x8c, 0xa, 0xf7, 0x2e, 0xf7, 0xf, + 0xf7, 0x77, 0xf7, 0x12, 0x1, 0xf7, 0x0, 0xf7, 0x25, 0x3, 0xf8, 0x4c, + 0xf7, 0x99, 0x15, 0xf7, 0x4e, 0x6, 0x74, 0xfb, 0x0, 0x5, 0x81, 0x78, + 0x3d, 0x67, 0x32, 0x1b, 0x4d, 0x25, 0x98, 0xf7, 0x3b, 0xf7, 0x28, 0xd1, + 0xf7, 0x44, 0xf7, 0x55, 0xd3, 0xc9, 0x6d, 0x2f, 0xa7, 0x1f, 0xf7, 0x1f, + 0x9a, 0x5, 0xf7, 0x3a, 0x71, 0xfb, 0x15, 0xce, 0xfb, 0x28, 0x1b, 0xfb, + 0xb2, 0xfb, 0xc, 0xfb, 0x97, 0xfb, 0x55, 0xfb, 0x49, 0xee, 0xfb, 0xf, + 0xf7, 0x63, 0xf7, 0x26, 0xf7, 0x9, 0xc4, 0xab, 0xbb, 0x1f, 0xcd, 0xf7, + 0xce, 0x5, 0xfb, 0xda, 0x6, 0xe, 0x68, 0xa, 0xf7, 0xd4, 0xf7, 0xd, + 0xf7, 0xa9, 0x77, 0x1, 0xd2, 0x16, 0x5e, 0xa, 0xcf, 0xf7, 0xd4, 0x5, + 0xf7, 0xad, 0x6, 0x47, 0xfb, 0xd4, 0x5, 0x5e, 0xa, 0xf7, 0x2c, 0xf9, + 0x62, 0x53, 0xa, 0x50, 0xfb, 0xa9, 0x5, 0xfb, 0xad, 0x6, 0xc5, 0xf7, + 0xa9, 0x5a, 0xa, 0xe, 0xfb, 0xf9, 0x37, 0xa, 0xcb, 0x16, 0x5e, 0xa, + 0xf7, 0x2d, 0xf9, 0x62, 0x5, 0x97, 0xa, 0xe, 0x3c, 0x79, 0xf7, 0x11, + 0xf8, 0xf7, 0x77, 0x1, 0xc7, 0xf7, 0x5b, 0x15, 0xfb, 0x20, 0xbb, 0x3e, + 0xf7, 0x32, 0xf7, 0x5b, 0xb7, 0xf7, 0xd, 0xf7, 0x45, 0xb0, 0x1e, 0xe6, + 0xf8, 0x4a, 0x7b, 0xa, 0x30, 0xfc, 0x4a, 0x85, 0xa, 0x6f, 0x6a, 0x66, + 0x4c, 0x1b, 0x2f, 0x98, 0xcf, 0xb1, 0x8d, 0x1f, 0xe, 0xe2, 0x37, 0xa, + 0xe2, 0x16, 0x5e, 0xa, 0xb9, 0xf7, 0x70, 0xf7, 0x20, 0xf7, 0xe, 0xf7, + 0x48, 0xfb, 0xea, 0x5, 0xf7, 0x3d, 0x6, 0xfb, 0x83, 0xf8, 0x49, 0xf7, + 0xd9, 0xf7, 0xad, 0x5, 0xfb, 0x5c, 0x6, 0xfb, 0xe1, 0xfb, 0xc4, 0x89, + 0x8d, 0xcb, 0xf7, 0xc2, 0x53, 0xa, 0xe, 0x87, 0xa, 0xd7, 0x16, 0xf8, + 0x92, 0x50, 0xa, 0xfb, 0xff, 0x6, 0xf7, 0x10, 0xf8, 0xe9, 0x7b, 0xa, + 0xe, 0xf7, 0x5a, 0x37, 0xa, 0xf7, 0xe1, 0xf7, 0x3, 0x3, 0xd0, 0x16, + 0x82, 0xa, 0xf7, 0x6, 0xf8, 0xec, 0x5c, 0xa, 0xa6, 0xfc, 0xec, 0x5, + 0xf7, 0x20, 0x6, 0xf7, 0xb0, 0xf8, 0xe7, 0x8d, 0x89, 0xfb, 0x23, 0xfc, + 0xe5, 0x5, 0xf7, 0x1c, 0x6, 0xf7, 0x2c, 0xf9, 0x62, 0x5, 0xfb, 0x6b, + 0x6, 0xfb, 0x8a, 0xfc, 0x8b, 0x51, 0xa, 0x76, 0xf8, 0x8b, 0x5, 0xfb, + 0x69, 0x6, 0xe, 0xe2, 0x37, 0xa, 0xd0, 0xf9, 0x76, 0x3, 0x8a, 0xa, + 0xf2, 0xf8, 0x77, 0x5c, 0xa, 0xf7, 0x59, 0xfc, 0x77, 0x5, 0x9b, 0xa, + 0xf7, 0x2d, 0xf9, 0x62, 0x3d, 0xa, 0x25, 0xfc, 0x74, 0x51, 0xa, 0xfb, + 0x5a, 0xf8, 0x74, 0x65, 0xa, 0x8c, 0xa, 0xf8, 0x8c, 0xf7, 0x12, 0x1, + 0xf7, 0x17, 0xf7, 0x2a, 0xf8, 0xf, 0xf7, 0x2a, 0x3, 0xf6, 0xf7, 0xb1, + 0x15, 0xfb, 0x22, 0xe3, 0xfb, 0x36, 0xf7, 0x69, 0xf7, 0xb1, 0xf7, 0x16, + 0xf7, 0x93, 0xf7, 0x55, 0xf7, 0x48, 0xfb, 0x6, 0xf7, 0x14, 0xfb, 0x53, + 0xfb, 0xc9, 0x25, 0xfb, 0xaf, 0xfb, 0x3d, 0x1e, 0xf7, 0x2a, 0x16, 0xf7, + 0x37, 0xf0, 0xf7, 0x37, 0xf7, 0x29, 0xf7, 0x3, 0xc2, 0x33, 0x2b, 0xfb, + 0x9, 0x3b, 0xfb, 0x5f, 0xfb, 0x3c, 0x2a, 0x44, 0xd5, 0xf3, 0x1e, 0xe, + 0xab, 0xa0, 0x76, 0xf7, 0xa6, 0xf7, 0xc, 0xf7, 0x60, 0x8b, 0xa, 0xf7, + 0x27, 0x6, 0xc4, 0xf7, 0xa6, 0x5, 0xea, 0x6, 0xf7, 0x51, 0xf7, 0x42, + 0xba, 0xf7, 0x60, 0xf7, 0x49, 0xfb, 0x3c, 0x97, 0x57, 0x1f, 0xfb, 0xb9, + 0x6, 0xdb, 0xfb, 0xd8, 0x15, 0xb6, 0xf7, 0x60, 0x5, 0xf6, 0x6, 0xd6, + 0xc9, 0x8d, 0x40, 0xfb, 0xb, 0xfb, 0x19, 0x7f, 0xfb, 0x1, 0x1f, 0xe, + 0xf7, 0x23, 0x6c, 0x76, 0xdb, 0xf7, 0xa, 0xf8, 0x6d, 0xf7, 0xa, 0x36, + 0xa, 0xf8, 0xc4, 0xc0, 0x15, 0xa4, 0x6b, 0xb3, 0x5e, 0xca, 0x6f, 0xd3, + 0xe3, 0x18, 0x67, 0x9e, 0x67, 0xa5, 0x6d, 0xa6, 0x8, 0xf7, 0x4, 0xe1, + 0xc0, 0xf7, 0x1b, 0xf7, 0xb, 0x1a, 0xf7, 0x3f, 0xfb, 0x7, 0xf7, 0xa, + 0xfb, 0x50, 0xfb, 0xd0, 0x2a, 0xfb, 0xa8, 0xfb, 0x29, 0xfb, 0x1f, 0xe6, + 0xfb, 0x25, 0xf7, 0x66, 0xc1, 0xba, 0x92, 0x9d, 0xbe, 0x1e, 0xfb, 0x35, + 0xf7, 0x35, 0x15, 0xb8, 0x7b, 0xb0, 0x67, 0x85, 0x1a, 0x81, 0x5a, 0x8b, + 0x86, 0x32, 0x3a, 0xbd, 0xf7, 0x8, 0xf7, 0x15, 0xe6, 0xf7, 0x46, 0xf7, + 0x33, 0xf7, 0x2, 0xc3, 0x3d, 0x2e, 0x5a, 0x75, 0xfb, 0x9, 0x3c, 0x3f, + 0x1e, 0x62, 0xb8, 0x65, 0xa3, 0x65, 0x9d, 0x8, 0xe, 0x68, 0xa, 0xf7, + 0xbb, 0xf7, 0x4, 0xf7, 0x53, 0x96, 0xa, 0xf9, 0x25, 0xf7, 0x27, 0x3, + 0xd7, 0x16, 0xf7, 0x29, 0x6, 0xca, 0xf7, 0xbb, 0x5, 0xc7, 0x6, 0xb7, + 0xa8, 0x8b, 0x5d, 0xab, 0x1f, 0xb5, 0x50, 0xce, 0xfb, 0x50, 0x89, 0x1a, + 0xf7, 0x34, 0x6, 0x60, 0xf7, 0x1, 0x51, 0xf7, 0x1f, 0x4b, 0xc4, 0x8, + 0xf7, 0x0, 0x9a, 0xf7, 0x5, 0xbe, 0xf7, 0x32, 0x1a, 0xf7, 0x51, 0xfb, + 0x36, 0x8b, 0x47, 0x1e, 0xfb, 0xd5, 0x6, 0xde, 0xfb, 0xcb, 0x15, 0xb3, + 0xf7, 0x53, 0x5, 0xf7, 0x38, 0x6, 0xbc, 0xcf, 0x8b, 0x44, 0xfb, 0x4, + 0xfb, 0x1c, 0x83, 0x21, 0x1f, 0xe, 0xab, 0x78, 0xf7, 0x12, 0xf8, 0x92, + 0x96, 0xa, 0xdc, 0xf7, 0x7a, 0x15, 0xfb, 0x53, 0xf7, 0x28, 0x51, 0xf7, + 0x24, 0xf7, 0x67, 0xdf, 0xf7, 0x0, 0xf7, 0x0, 0xf7, 0x10, 0x34, 0xc3, + 0xfb, 0x14, 0xc2, 0x1e, 0x35, 0xae, 0x59, 0x8e, 0xbf, 0x1a, 0xd8, 0xe7, + 0x9d, 0xa5, 0xd1, 0xcd, 0x70, 0x3a, 0x1e, 0xf7, 0x27, 0x92, 0x5, 0xf7, + 0x2d, 0xfb, 0x1f, 0xcf, 0xfb, 0x23, 0xfb, 0x65, 0x53, 0xfb, 0x13, 0x33, + 0xfb, 0x12, 0xe5, 0x64, 0xf7, 0x15, 0x54, 0x1e, 0xdc, 0x68, 0xb8, 0x79, + 0x57, 0x1a, 0x3e, 0x32, 0x7e, 0x57, 0xfb, 0x23, 0x88, 0xce, 0xca, 0x89, + 0x1e, 0xe, 0x84, 0xa, 0xf8, 0xe9, 0xf7, 0xd, 0x1, 0xf7, 0x77, 0x16, + 0xf7, 0x2d, 0x6, 0xf7, 0x15, 0xf8, 0xe9, 0x5, 0xf7, 0x6c, 0x6, 0xa5, + 0xf7, 0xd, 0x5, 0xfc, 0xdd, 0x6, 0x71, 0xfb, 0xd, 0x5, 0xf7, 0x6c, + 0x6, 0xe, 0xe2, 0x78, 0xf7, 0x11, 0xf8, 0xf8, 0x77, 0x1, 0xf7, 0x8, + 0xf7, 0x2b, 0x3, 0xf7, 0x66, 0xf9, 0x62, 0x15, 0x39, 0xfc, 0x20, 0x5, + 0x84, 0x67, 0x86, 0x67, 0x65, 0x1a, 0xfb, 0xd, 0x8c, 0xc1, 0xfb, 0x2, + 0xf7, 0x5f, 0x1b, 0xf7, 0xa5, 0xb6, 0xf7, 0x60, 0xf7, 0x1d, 0xa8, 0x1f, + 0xe0, 0xf8, 0x20, 0x5, 0xfb, 0x2c, 0x6, 0x36, 0xfc, 0x20, 0x5, 0xfb, + 0x11, 0x71, 0x49, 0x30, 0x2d, 0x1b, 0x36, 0x6e, 0xba, 0xc8, 0xb0, 0x8f, + 0xb1, 0x92, 0xac, 0x1f, 0xdf, 0xf8, 0x20, 0x5, 0xe, 0xab, 0x37, 0xa, + 0xf7, 0xb6, 0x16, 0xf7, 0x26, 0x6, 0xf8, 0x1, 0xf9, 0x62, 0x91, 0xa, + 0xfb, 0xa6, 0xfc, 0xb3, 0x51, 0xa, 0x39, 0xf8, 0xb3, 0x5b, 0xa, 0xe, + 0xf7, 0xc9, 0x37, 0xa, 0xf7, 0x4a, 0xf7, 0x14, 0xf7, 0xb5, 0xf7, 0x3, + 0x3, 0xf7, 0x57, 0x16, 0xf7, 0x26, 0x6, 0xf7, 0x8d, 0xf8, 0xa0, 0x5c, + 0xa, 0x9a, 0xfc, 0xa0, 0x8d, 0xa, 0xf7, 0xe0, 0xf9, 0x62, 0x5, 0xfb, + 0x1d, 0x6, 0xfb, 0x75, 0xfc, 0x85, 0x51, 0xa, 0x7c, 0xf8, 0x85, 0x5, + 0xfb, 0x2e, 0x6, 0xfb, 0x7e, 0xfc, 0x8a, 0x51, 0xa, 0x85, 0xf8, 0x8a, + 0x81, 0xa, 0xab, 0x37, 0xa, 0x99, 0x16, 0xf7, 0x49, 0x6, 0xf7, 0x50, + 0xf7, 0x7b, 0xf3, 0xfb, 0x7b, 0x5, 0xf7, 0x33, 0x6, 0xfb, 0x3b, 0xf7, + 0xe8, 0xf7, 0xcc, 0xf8, 0xe, 0x5, 0xfb, 0x45, 0x6, 0xfb, 0x5f, 0xfb, + 0x8b, 0xfb, 0xa, 0xf7, 0x8b, 0x7b, 0xa, 0xf7, 0x3e, 0xfb, 0xf6, 0x5, + 0xe, 0xab, 0x37, 0xa, 0xf7, 0x3c, 0xf9, 0x12, 0x3, 0x64, 0xa, 0xf7, + 0x9e, 0xf7, 0xcc, 0xf8, 0x58, 0x43, 0xa, 0xfb, 0x5d, 0xfb, 0xc7, 0xfb, + 0x10, 0xf7, 0xc7, 0x5a, 0xa, 0xf7, 0x51, 0xfc, 0x4a, 0x5, 0xe, 0x84, + 0xa, 0xf8, 0xe9, 0xf7, 0xd, 0x1, 0xa4, 0x16, 0xf8, 0xfb, 0x6, 0xa6, + 0xf7, 0x9, 0x5, 0x8a, 0xfc, 0x33, 0x8c, 0x8b, 0x1e, 0xf8, 0x62, 0xf8, + 0x7d, 0xa2, 0xf7, 0x4, 0x5, 0xfc, 0xcf, 0x6, 0x6f, 0xfb, 0xd, 0x5, + 0xf8, 0x5, 0x6, 0xfc, 0x5b, 0xfc, 0x78, 0x5, 0xe, 0x7f, 0xa, 0xf7, + 0x48, 0x35, 0x15, 0xf7, 0x29, 0xf9, 0x4e, 0x5, 0xf7, 0x1, 0x6, 0xa3, + 0xf7, 0x2, 0x5, 0xfb, 0x89, 0x6, 0xfb, 0x58, 0xfe, 0x2a, 0x5, 0xf7, + 0x89, 0x6, 0xa3, 0xf7, 0x2, 0x5, 0xe, 0xfb, 0xf9, 0x78, 0xa, 0xf7, + 0x10, 0xf7, 0x87, 0x3, 0xf7, 0x85, 0x78, 0x15, 0xf7, 0x12, 0x6, 0xfb, + 0x7, 0xf9, 0x88, 0x5, 0xfb, 0x14, 0x6, 0xe, 0x7f, 0xa, 0x91, 0x35, + 0x15, 0x73, 0xfb, 0x2, 0x5, 0xf7, 0x89, 0x6, 0xf7, 0x58, 0xfa, 0x2a, + 0x5, 0xfb, 0x89, 0x6, 0x73, 0xfb, 0x2, 0x5, 0xf7, 0x2, 0x6, 0xfb, + 0x29, 0xfd, 0x4e, 0x5, 0xe, 0x58, 0xf7, 0xec, 0x76, 0xf8, 0xb, 0x77, + 0x1, 0xf7, 0x17, 0xf7, 0xd7, 0x15, 0xf7, 0x1c, 0x6, 0xe9, 0xf7, 0x79, + 0xea, 0xfb, 0x79, 0x5, 0x82, 0xa, 0xfb, 0x42, 0xf8, 0xb, 0x5, 0x20, + 0x6, 0xe, 0x3c, 0xfb, 0x11, 0xbd, 0x1, 0x70, 0x40, 0x15, 0x59, 0xf8, + 0xcb, 0xbd, 0x7, 0xe, 0x72, 0xa, 0xf7, 0x8c, 0xf8, 0xf0, 0x15, 0xf4, + 0x6, 0x47, 0xf7, 0x26, 0x53, 0xa, 0xe, 0x42, 0xa, 0xf7, 0xf1, 0xf2, + 0x76, 0xa, 0xf8, 0x1a, 0x89, 0x2f, 0xa, 0x13, 0xb0, 0x99, 0xa, 0xaa, + 0xb2, 0x1a, 0xab, 0x7c, 0xf7, 0x3, 0x33, 0xa, 0x80, 0x5, 0xb8, 0x98, + 0xb1, 0x9b, 0xb8, 0x1b, 0xce, 0xa8, 0x5a, 0x55, 0x70, 0x1f, 0x6c, 0x80, + 0x54, 0x86, 0x50, 0x86, 0x8, 0x42, 0x86, 0xfb, 0x2f, 0x81, 0xfb, 0x34, + 0x1a, 0x28, 0xd6, 0x50, 0xe1, 0x1e, 0x30, 0xa, 0x99, 0xf7, 0x8a, 0x15, + 0x60, 0x81, 0x77, 0x20, 0x20, 0x1b, 0x5a, 0x77, 0xa1, 0xa7, 0xca, 0xdc, + 0xa2, 0xe7, 0x97, 0x1f, 0xe, 0x73, 0x7d, 0xf6, 0x41, 0x76, 0xf8, 0x45, + 0xf0, 0xf7, 0x4e, 0x77, 0x12, 0xf7, 0x67, 0xf7, 0x18, 0xf7, 0x36, 0xf7, + 0x20, 0x13, 0x7c, 0xc8, 0x89, 0x15, 0xf7, 0x18, 0x6, 0x9d, 0xe1, 0x5c, + 0xa, 0x13, 0xb4, 0x73, 0x96, 0xb4, 0x41, 0xf7, 0x7, 0x1b, 0xf7, 0x25, + 0xf7, 0xc, 0xf7, 0x23, 0xf7, 0x4f, 0xf7, 0x5, 0x57, 0xf2, 0xfb, 0x1b, + 0x42, 0x5f, 0x6c, 0x73, 0x6b, 0x1f, 0xbe, 0xf7, 0x85, 0x44, 0xa, 0x13, + 0x74, 0xb3, 0xfc, 0x90, 0x15, 0xf7, 0x3, 0xc4, 0xf7, 0x2, 0xe6, 0xc1, + 0xba, 0x60, 0x3f, 0x1e, 0x13, 0xb4, 0x38, 0x5e, 0xfb, 0x1c, 0x25, 0x4c, + 0x64, 0xc5, 0xc6, 0x1e, 0xe, 0x3c, 0x7d, 0xf7, 0x5, 0xf7, 0xe8, 0xf6, + 0x1, 0xda, 0xf7, 0x23, 0x3, 0xf8, 0x38, 0xf7, 0x5b, 0x15, 0x36, 0x6d, + 0x4f, 0x7c, 0x70, 0x1b, 0x63, 0x62, 0xb2, 0xd0, 0xe0, 0xb3, 0xf7, 0x27, + 0xf7, 0x5, 0xd7, 0x93, 0x48, 0x77, 0x8d, 0x1f, 0xf7, 0x1e, 0x9a, 0x5, + 0xe3, 0x83, 0x4d, 0xe6, 0xfb, 0x25, 0x1b, 0xfb, 0x4b, 0xfb, 0xe, 0xfb, + 0x2f, 0xfb, 0x4c, 0xfb, 0x4, 0xc6, 0xfb, 0x1, 0xf7, 0x36, 0xf7, 0x16, + 0xe3, 0xd6, 0xf7, 0x8, 0xb6, 0x1f, 0xe, 0x73, 0x7d, 0xf6, 0x2c, 0xea, + 0xf7, 0xde, 0xf7, 0x1, 0xf7, 0x4e, 0x77, 0x12, 0x13, 0x70, 0xf8, 0x38, + 0x89, 0x15, 0xf7, 0x17, 0x6, 0xf7, 0x2d, 0xf9, 0x64, 0x47, 0xa, 0x52, + 0xfb, 0xa1, 0x5, 0x9e, 0x7e, 0x62, 0xcb, 0x20, 0x1b, 0xfb, 0x32, 0x24, + 0xfb, 0x34, 0xfb, 0x3c, 0x1f, 0x13, 0xb0, 0xfb, 0x20, 0xd1, 0x3d, 0xf7, + 0x6, 0xe1, 0xbe, 0xb3, 0xa7, 0xa6, 0x1e, 0x8d, 0x89, 0x5, 0x13, 0x70, + 0xfb, 0x67, 0xf7, 0x2c, 0x15, 0xe7, 0xbe, 0xf7, 0x13, 0xe7, 0xc8, 0xb4, + 0x54, 0x49, 0x3f, 0x62, 0xfb, 0x19, 0x22, 0x4b, 0x68, 0xba, 0xcb, 0x1e, + 0xe, 0x3c, 0xf7, 0x71, 0xe3, 0xf7, 0x1a, 0xf2, 0x7d, 0xa, 0xf7, 0x68, + 0xf7, 0x71, 0x15, 0xf8, 0x8, 0x6, 0x93, 0xae, 0x8c, 0xb8, 0x99, 0x1a, + 0xf0, 0x5e, 0xf7, 0x16, 0xfb, 0x41, 0xfb, 0x6d, 0x33, 0xfb, 0x53, 0xfb, + 0x1a, 0xfb, 0x24, 0xeb, 0x30, 0xf7, 0x2c, 0xd7, 0xf7, 0x0, 0xa6, 0xf7, + 0x15, 0xcc, 0x1e, 0xfb, 0x19, 0xa0, 0x5, 0x7b, 0x82, 0x6b, 0x51, 0x41, + 0x1b, 0x4e, 0x59, 0xbc, 0xde, 0x8f, 0x1f, 0x9a, 0xe3, 0x15, 0xbd, 0x96, + 0xaf, 0xdf, 0xe0, 0x1b, 0xd8, 0xa5, 0x4c, 0x44, 0x88, 0x1f, 0xe, 0xa0, + 0x76, 0xf8, 0x33, 0xf1, 0xf7, 0x66, 0x77, 0x1, 0xe2, 0x16, 0xf7, 0x15, + 0x6, 0xda, 0xf8, 0x33, 0x5, 0xe6, 0x6, 0x9f, 0xf1, 0x5, 0x30, 0x6, + 0xda, 0x99, 0x91, 0xa4, 0xae, 0x1b, 0x98, 0xa6, 0x86, 0x7e, 0xad, 0x1f, + 0xa4, 0xf0, 0x5, 0x9c, 0x5a, 0x5e, 0x91, 0x6d, 0x1b, 0xfb, 0xa, 0x80, + 0x28, 0xfb, 0x3, 0x6d, 0x1f, 0x44, 0x6, 0x76, 0x25, 0x5, 0xd4, 0x6, + 0xe, 0x73, 0xfb, 0x6d, 0xf2, 0xf7, 0x3, 0xf6, 0xf7, 0xe7, 0xf2, 0x7e, + 0x77, 0x12, 0x13, 0xd0, 0xb1, 0x6e, 0x15, 0xfb, 0x46, 0xf7, 0x40, 0x81, + 0xca, 0xf7, 0x7b, 0xa3, 0xf6, 0xf7, 0x5a, 0xb5, 0x1e, 0xeb, 0xf8, 0x51, + 0x3d, 0xa, 0x78, 0x2d, 0x51, 0xa, 0x13, 0xe0, 0xd3, 0x68, 0x48, 0xae, + 0x46, 0x1b, 0xfb, 0x1d, 0xfb, 0x14, 0x20, 0xfb, 0x65, 0xfb, 0x3d, 0xf2, + 0x4b, 0xdd, 0xde, 0xc2, 0xb7, 0x9e, 0x9f, 0x1f, 0x8d, 0x89, 0x5, 0xfb, + 0x8, 0x74, 0x80, 0x53, 0x24, 0x1b, 0x44, 0x80, 0xae, 0xa7, 0x8d, 0x1f, + 0x9d, 0xf7, 0xac, 0x15, 0xc5, 0xb3, 0xf7, 0x30, 0xf4, 0xcb, 0xb4, 0x4d, + 0x4a, 0x2b, 0x53, 0xfb, 0x8, 0x2c, 0x51, 0x62, 0xb9, 0xda, 0x1e, 0xe, + 0x84, 0xa, 0xf8, 0x44, 0xef, 0xf7, 0x4e, 0x77, 0x1, 0xf8, 0x76, 0xf7, + 0x27, 0x3, 0xcc, 0x16, 0x7c, 0xa, 0xb7, 0xf7, 0x62, 0x5, 0xf4, 0xa2, + 0xb2, 0xf7, 0xd, 0xf6, 0x1b, 0xba, 0x98, 0x6f, 0x69, 0x76, 0x87, 0x74, + 0x86, 0x75, 0x1f, 0x49, 0xfb, 0xc4, 0x5, 0x7c, 0xa, 0xcc, 0xf7, 0xc4, + 0x5, 0x91, 0xa7, 0x92, 0xaf, 0xae, 0x1a, 0xcd, 0x6f, 0xca, 0xfb, 0x3, + 0x30, 0x51, 0x5d, 0x73, 0x6b, 0x1e, 0xc1, 0xf7, 0x94, 0x44, 0xa, 0xe, + 0x48, 0xa, 0xf8, 0xa1, 0x77, 0xe7, 0xf7, 0x14, 0x1, 0xd0, 0x16, 0x9b, + 0xa, 0xf7, 0x1, 0xf8, 0xa1, 0x92, 0xa, 0x9b, 0xd3, 0x15, 0x9b, 0xa, + 0xa6, 0xf7, 0x14, 0x92, 0xa, 0xe, 0xfb, 0xf9, 0xfb, 0x55, 0x76, 0x1, + 0x75, 0x3a, 0x15, 0x77, 0xfb, 0xa, 0x5, 0x7c, 0xb6, 0xb8, 0x8b, 0x94, + 0x1b, 0xf7, 0xe, 0xb1, 0xf7, 0x31, 0xf7, 0x1d, 0xa5, 0x1f, 0xdf, 0xf8, + 0x51, 0x5, 0xfb, 0x16, 0x6, 0x3a, 0xfc, 0x51, 0x5, 0xfb, 0x30, 0x6c, + 0x7e, 0x7e, 0x63, 0x1b, 0x80, 0x7a, 0x8c, 0x92, 0x73, 0x1f, 0xf7, 0x7b, + 0xf9, 0x3a, 0x15, 0xf7, 0x16, 0x6, 0xa3, 0xf7, 0x14, 0x5, 0xfb, 0x16, + 0x6, 0xe, 0x3c, 0x37, 0xa, 0xd0, 0x16, 0xf7, 0x26, 0x6, 0xae, 0xf7, + 0x31, 0xed, 0xdf, 0xd6, 0xfb, 0x85, 0x5, 0xf7, 0x26, 0x6, 0xfb, 0x8, + 0xf7, 0xdf, 0xf7, 0x6d, 0xf7, 0x51, 0x5, 0xfb, 0x52, 0x6, 0xfb, 0x50, + 0xfb, 0x44, 0x89, 0x8d, 0xdd, 0xf8, 0x8, 0x93, 0xa, 0xe, 0xfb, 0xf9, + 0x37, 0xa, 0x8a, 0xa, 0xf7, 0x2c, 0xf9, 0x62, 0x65, 0xa, 0xf7, 0x92, + 0xa0, 0x76, 0xf8, 0x4f, 0xf2, 0x1, 0xcb, 0x16, 0xf7, 0x23, 0x6, 0xbe, + 0xf7, 0x89, 0x5, 0xdf, 0x9d, 0xa1, 0xf7, 0x6, 0xf2, 0x1b, 0xb5, 0x96, + 0x75, 0x6e, 0x78, 0x87, 0x75, 0x87, 0x77, 0x1f, 0x45, 0xfb, 0xdf, 0x5, + 0x7c, 0xa, 0xbe, 0xf7, 0x86, 0x5, 0xd2, 0x98, 0xaf, 0xf7, 0x16, 0xed, + 0x1b, 0xae, 0x94, 0x68, 0x68, 0x7a, 0x89, 0x7a, 0x88, 0x7e, 0x1f, 0x47, + 0xfb, 0xda, 0x8d, 0xa, 0xd0, 0xf7, 0xda, 0x5, 0x8f, 0xa5, 0x8f, 0xa6, + 0xa5, 0x1a, 0xd5, 0x72, 0xce, 0x23, 0x3a, 0x44, 0x5e, 0x59, 0x6a, 0x1e, + 0xe1, 0x7b, 0x40, 0x94, 0x60, 0x1b, 0x38, 0x61, 0x77, 0x54, 0x63, 0x1f, + 0x99, 0xc9, 0x91, 0xa, 0xe, 0x84, 0xa, 0xf8, 0x4f, 0xe5, 0x31, 0xf2, + 0x12, 0x13, 0xa0, 0xcc, 0x16, 0x7c, 0xa, 0xba, 0xf7, 0x6f, 0x5, 0xf3, + 0xa1, 0xa7, 0xf7, 0xc, 0xf7, 0x9, 0x1b, 0xb7, 0x9b, 0x6a, 0x76, 0x6d, + 0x84, 0x6d, 0x86, 0x71, 0x1f, 0x4b, 0xfb, 0xc3, 0x5, 0xf7, 0x25, 0x6, + 0xcb, 0xf7, 0xc2, 0x5, 0x92, 0xad, 0x91, 0xb3, 0xb0, 0x1a, 0xd2, 0x6c, + 0xc9, 0xfb, 0x0, 0x34, 0x4f, 0x5f, 0x65, 0x61, 0x1e, 0x89, 0x8d, 0x5, + 0x13, 0xc0, 0x99, 0xce, 0x5b, 0xa, 0xe, 0x73, 0x7d, 0xf7, 0x2, 0xf7, + 0xe8, 0xf7, 0x2, 0x3f, 0xa, 0xdd, 0xf7, 0x71, 0x15, 0xfb, 0x11, 0xde, + 0xfb, 0x2, 0x38, 0xa, 0xf7, 0x37, 0x26, 0xa, 0xe, 0x73, 0xfb, 0x4e, + 0x76, 0xf7, 0x54, 0xf7, 0x4, 0xf7, 0xe8, 0xeb, 0x2b, 0xf7, 0x1, 0x12, + 0xf8, 0x8d, 0xf7, 0x20, 0x13, 0xd8, 0x9d, 0xfb, 0x63, 0x15, 0x7c, 0xa, + 0xc5, 0xf7, 0xaa, 0x5, 0x77, 0x98, 0xb4, 0x49, 0xf6, 0x1b, 0xf7, 0x34, + 0xf3, 0xf7, 0x32, 0xf7, 0x41, 0xf7, 0x23, 0x44, 0xe2, 0xfb, 0x6, 0x34, + 0x58, 0x62, 0x6e, 0x6f, 0x1f, 0x89, 0x8d, 0x5, 0x13, 0xe8, 0x96, 0xc2, + 0x5, 0xfb, 0x18, 0x6, 0xe2, 0xfb, 0xcb, 0x15, 0xd8, 0xb4, 0xf7, 0x1e, + 0xf5, 0xcc, 0xae, 0x54, 0x49, 0x2d, 0x58, 0xfb, 0x11, 0x2e, 0x4d, 0x62, + 0xc3, 0xd0, 0x1e, 0xe, 0x73, 0xfb, 0x4e, 0x76, 0xf7, 0x54, 0xf2, 0xf7, + 0xf1, 0xf7, 0x1, 0x7e, 0x77, 0x12, 0xdb, 0xf7, 0x21, 0x13, 0xd8, 0xf8, + 0x2, 0xfb, 0x63, 0x15, 0xf7, 0x25, 0x6, 0xf7, 0x2e, 0xf9, 0x78, 0x66, + 0xa, 0x79, 0x34, 0x51, 0xa, 0x13, 0xe8, 0xa3, 0x7f, 0x62, 0xd7, 0xfb, + 0x7, 0x1b, 0xfb, 0x26, 0xfb, 0xc, 0xfb, 0x27, 0xfb, 0x54, 0xfb, 0x9, + 0xbf, 0x22, 0xf7, 0x1b, 0xd5, 0xb7, 0xab, 0xa4, 0xac, 0x1f, 0xfb, 0x59, + 0xf7, 0x39, 0x15, 0xe0, 0xb7, 0xf7, 0x25, 0xf2, 0xca, 0xb2, 0x4f, 0x4e, + 0xfb, 0x6, 0x52, 0xfb, 0x6, 0x30, 0x54, 0x5d, 0xb4, 0xd9, 0x1e, 0xe, + 0xfb, 0x8a, 0xa0, 0x76, 0xf8, 0x30, 0xf7, 0xd, 0xfb, 0xd, 0xf7, 0x1a, + 0x12, 0xd7, 0xf8, 0x3d, 0x13, 0xb0, 0xcb, 0x16, 0x82, 0xa, 0xab, 0xf7, + 0x3c, 0xa6, 0xf7, 0x17, 0xa2, 0xf7, 0x13, 0xf7, 0x30, 0x7d, 0x19, 0xbf, + 0xf7, 0xb, 0x5, 0x91, 0x7e, 0x76, 0x94, 0x6e, 0x1b, 0x49, 0x59, 0x51, + 0x51, 0x69, 0x1f, 0x89, 0x8d, 0x5, 0x13, 0xc0, 0x9f, 0xf0, 0x5, 0xfb, + 0x12, 0x6, 0xe, 0x3c, 0x7d, 0xef, 0xf7, 0xfc, 0xef, 0x1, 0xca, 0xf7, + 0x28, 0x15, 0xfb, 0x7, 0xab, 0xe5, 0x5c, 0xf7, 0x17, 0x1b, 0xf7, 0x48, + 0xc0, 0xf7, 0x8, 0xd3, 0xf4, 0x20, 0xab, 0x3f, 0xa3, 0x1f, 0x44, 0xa0, + 0x71, 0x93, 0xab, 0x1a, 0xa5, 0xa3, 0xa3, 0xc4, 0x9b, 0xd0, 0x8b, 0x4b, + 0xa0, 0x1e, 0xf7, 0x14, 0xa3, 0x5, 0xf7, 0x11, 0x70, 0xfb, 0x6, 0x9a, + 0x44, 0x1b, 0xfb, 0x32, 0x42, 0x46, 0x38, 0x35, 0xd7, 0x4f, 0xe2, 0x6c, + 0x1f, 0xe9, 0x69, 0x95, 0x85, 0x6e, 0x1a, 0x67, 0x5d, 0x71, 0x5a, 0x41, + 0x71, 0xb3, 0xb8, 0x7b, 0x1e, 0xe, 0x9a, 0x76, 0xf8, 0x2c, 0xee, 0xf7, + 0x43, 0x77, 0x1, 0xf7, 0xda, 0x85, 0x15, 0xa2, 0xf1, 0x5, 0x87, 0x25, + 0x76, 0x9b, 0xc7, 0x1f, 0x70, 0x6f, 0x91, 0xa8, 0x91, 0x1f, 0xc5, 0xf7, + 0xa8, 0x5, 0xe3, 0x6, 0xa1, 0xee, 0x5, 0x33, 0x6, 0xb1, 0xf7, 0x43, + 0xfb, 0x37, 0x2c, 0x7a, 0x3b, 0x5, 0x45, 0x6, 0x75, 0x28, 0x5, 0xd0, + 0x6, 0x8b, 0x4c, 0xfb, 0xb2, 0x73, 0x1a, 0x2e, 0xf7, 0x1b, 0x86, 0xe0, + 0x1e, 0xe, 0x59, 0xa, 0xf8, 0x4f, 0x77, 0x12, 0xed, 0xf7, 0x27, 0x13, + 0x70, 0xf8, 0x31, 0x89, 0x15, 0xf7, 0x1a, 0x6, 0xf7, 0x3, 0xf8, 0xaa, + 0x44, 0xa, 0x57, 0xfb, 0x91, 0x5, 0x46, 0x72, 0x82, 0xfb, 0xd, 0xfb, + 0xe, 0x1b, 0x5d, 0x7c, 0xb0, 0xb4, 0x9c, 0x8f, 0x9c, 0x8f, 0x9a, 0x1f, + 0xcd, 0xf7, 0xd0, 0x47, 0xa, 0x4a, 0xfb, 0xd0, 0x5, 0x85, 0x6f, 0x84, + 0x67, 0x67, 0x1a, 0x13, 0xb0, 0x47, 0xa5, 0x4d, 0xf7, 0x5, 0xcf, 0xce, + 0xa9, 0xc1, 0xc2, 0x1e, 0x8c, 0x89, 0x5, 0xe, 0x3c, 0x79, 0xa, 0xf7, + 0x78, 0x16, 0xf7, 0x9, 0x6, 0xf7, 0xcb, 0xf8, 0xa8, 0x7b, 0xa, 0xfb, + 0x57, 0xfb, 0xf8, 0x51, 0xa, 0x57, 0xf7, 0xf8, 0x5, 0xfb, 0x1a, 0x6, + 0xe, 0xf7, 0x23, 0x79, 0xa, 0xf8, 0x79, 0xe5, 0x3, 0xf7, 0x4f, 0x16, + 0xf7, 0x15, 0x6, 0xf7, 0x2f, 0xf7, 0xea, 0x5c, 0xa, 0xa3, 0xfb, 0xea, + 0x5, 0xf7, 0x16, 0x6, 0xf7, 0x93, 0xf8, 0xa8, 0x54, 0xa, 0xfb, 0x32, + 0xfb, 0xf7, 0x51, 0xa, 0x7a, 0xf7, 0xf7, 0x5, 0xfb, 0x12, 0x6, 0xfb, + 0x33, 0xfb, 0xf7, 0x51, 0xa, 0x69, 0xf7, 0xf7, 0x5, 0xfb, 0xf, 0x6, + 0xe, 0x3c, 0x79, 0xa, 0x9a, 0x16, 0xf7, 0x3f, 0x6, 0xf7, 0x16, 0xf7, + 0x2b, 0xd4, 0xfb, 0x2b, 0x5, 0xf7, 0x29, 0x6, 0xfb, 0x17, 0xf7, 0x97, + 0xf7, 0x85, 0xf7, 0xa5, 0x5, 0xfb, 0x3e, 0x6, 0xfb, 0x18, 0xfb, 0x28, + 0x41, 0xf7, 0x28, 0x53, 0xa, 0xf7, 0x18, 0xfb, 0x96, 0x5, 0xe, 0x3c, + 0xfb, 0x6a, 0xf7, 0x9, 0xf9, 0x9, 0x77, 0x1, 0xc2, 0x34, 0x15, 0x7e, + 0xfb, 0x0, 0x5, 0x7e, 0xad, 0xaa, 0x85, 0xa6, 0x1b, 0xe2, 0xc5, 0xcd, + 0xf0, 0xc3, 0x1f, 0xf7, 0xd1, 0xf8, 0xd7, 0x77, 0xa, 0xfc, 0x27, 0x51, + 0xa, 0x59, 0xf8, 0x27, 0x54, 0xa, 0xe5, 0xfc, 0xa3, 0x5, 0x4c, 0x6f, + 0x6c, 0x64, 0x5c, 0x1b, 0x7d, 0x7b, 0x8e, 0x92, 0x79, 0x1f, 0xe, 0xfb, + 0x1b, 0x8b, 0xf7, 0xa, 0xf7, 0xc1, 0xf7, 0x5, 0x1, 0x9f, 0x16, 0xf8, + 0x70, 0x6, 0xa5, 0xf7, 0xa, 0x5, 0xfb, 0xac, 0x6, 0xf7, 0xd6, 0xf7, + 0xdc, 0x9e, 0xe1, 0x5, 0xfc, 0x5c, 0x6, 0x71, 0xfb, 0x5, 0x5, 0xf7, + 0x98, 0x6, 0xfb, 0xd3, 0xfb, 0xd5, 0x5, 0xe, 0x73, 0xa, 0xf7, 0xb2, + 0xf7, 0x7, 0x1, 0x14, 0xe0, 0xe9, 0xf7, 0x61, 0x15, 0xef, 0x79, 0x3f, + 0xfb, 0x4, 0x74, 0x1f, 0xfb, 0x2f, 0x69, 0xb1, 0x51, 0xf7, 0x1e, 0x1b, + 0xa3, 0x6, 0xa3, 0xf7, 0x7, 0x5, 0x49, 0x72, 0x8e, 0xcc, 0x98, 0x1f, + 0xb4, 0xf7, 0x4e, 0x82, 0xbd, 0x52, 0xb3, 0xd3, 0xb5, 0xa8, 0xac, 0xb7, + 0xf7, 0x5c, 0x8, 0xcb, 0x98, 0xa0, 0x90, 0xd6, 0x1b, 0xa3, 0xf7, 0x7, + 0x5, 0x73, 0x6, 0xfb, 0x50, 0x77, 0x32, 0xfb, 0x23, 0x6c, 0x1f, 0xfb, + 0x9, 0x72, 0x7f, 0x57, 0x27, 0x1b, 0xe, 0xfb, 0xf7, 0xfb, 0x50, 0x76, + 0xfa, 0x46, 0x77, 0x1, 0xbd, 0xfb, 0x65, 0x15, 0xf7, 0x3, 0x6, 0xf7, + 0x5e, 0xfa, 0x46, 0x5, 0xfb, 0x3, 0x6, 0xe, 0x73, 0xa, 0xf8, 0x25, + 0x77, 0x1, 0x93, 0x3a, 0x15, 0x71, 0xfb, 0x7, 0x5, 0xf7, 0x66, 0x9f, + 0xe4, 0xf7, 0x23, 0xac, 0x1f, 0xf7, 0x9, 0xa5, 0xa8, 0xbf, 0xdd, 0x1b, + 0xa4, 0xf7, 0x8, 0x5, 0x29, 0x9c, 0xd7, 0xf7, 0x4, 0xa4, 0x1f, 0x94, + 0xae, 0x8e, 0xa9, 0xa5, 0x1a, 0xe3, 0x59, 0xad, 0xfb, 0x10, 0x1e, 0x71, + 0xfb, 0x7, 0x5, 0xc0, 0xa6, 0x89, 0x67, 0x83, 0x8a, 0x82, 0x88, 0x7e, + 0x1f, 0x61, 0xfb, 0x4e, 0x94, 0x59, 0xc4, 0x63, 0x41, 0x61, 0x6e, 0x6a, + 0x5f, 0xfb, 0x5c, 0x8, 0x4b, 0x7c, 0x77, 0x86, 0x42, 0x1b, 0xe, 0x58, + 0xf7, 0x4d, 0x76, 0xf7, 0x47, 0x77, 0x1, 0xf7, 0x7, 0xf8, 0x62, 0x3, + 0xf7, 0x7, 0xf7, 0x37, 0x15, 0xc2, 0xbf, 0xb3, 0x91, 0xa6, 0x1b, 0xbc, + 0xab, 0x7d, 0x7c, 0xa9, 0x1f, 0x7b, 0xaa, 0xa9, 0x7c, 0xb4, 0x1b, 0xd0, + 0xbf, 0xbc, 0x95, 0x94, 0x1f, 0xf7, 0xc, 0x7, 0x4d, 0x53, 0x56, 0x89, + 0x81, 0x1b, 0x69, 0x6d, 0x97, 0x98, 0x6e, 0x1f, 0x9b, 0x64, 0x66, 0x9e, + 0x5d, 0x1b, 0x75, 0x57, 0x8b, 0x4e, 0x55, 0x1f, 0xe, 0xe2, 0x8b, 0xf7, + 0xc, 0xf8, 0x6f, 0xf7, 0xf, 0x1, 0xf7, 0x8, 0xf7, 0x1f, 0x3, 0x9f, + 0xf7, 0x94, 0x15, 0xeb, 0x6, 0xfb, 0x32, 0x9a, 0xec, 0x29, 0xf7, 0x4b, + 0x1b, 0xbb, 0xba, 0x93, 0x9a, 0xb9, 0x1f, 0xaf, 0xf7, 0x25, 0x5, 0x6b, + 0x5c, 0x53, 0x7b, 0x4c, 0x1b, 0x38, 0x3a, 0xca, 0xd4, 0x88, 0x1f, 0xf7, + 0xda, 0x6, 0x9b, 0xd4, 0x5, 0xfb, 0xe7, 0x6, 0x8f, 0xaa, 0x90, 0xa1, + 0x8d, 0x94, 0x8, 0xf7, 0xe9, 0x6, 0x9b, 0xd4, 0x5, 0xfb, 0xdf, 0x6, + 0xe2, 0xb9, 0xdb, 0xb7, 0xeb, 0x1b, 0xc4, 0xb5, 0x81, 0x6a, 0xa6, 0x1f, + 0xc6, 0x55, 0xa, 0xa8, 0x5a, 0x4e, 0x9a, 0x43, 0x1b, 0xfb, 0x49, 0xfb, + 0x20, 0x23, 0xfb, 0x2a, 0x54, 0x1f, 0xfb, 0x0, 0x6, 0x7b, 0x42, 0x5, + 0xf4, 0x6, 0x87, 0x71, 0x89, 0x76, 0x8a, 0x7c, 0x8, 0x39, 0x6, 0xe, + 0xfb, 0xf9, 0xfb, 0x11, 0x76, 0xf7, 0x3a, 0x76, 0xf7, 0x14, 0x77, 0x1, + 0xd3, 0x8a, 0x15, 0xc9, 0x6, 0x7e, 0x52, 0x73, 0x7a, 0x60, 0x82, 0x7e, + 0x4d, 0x18, 0xf7, 0x1d, 0x3e, 0xa, 0xfb, 0x1d, 0x6, 0xe, 0x3c, 0xfb, + 0x51, 0x76, 0xf9, 0xcf, 0x96, 0xa, 0x88, 0x3b, 0x15, 0x5c, 0xfb, 0x3, + 0x5, 0x7d, 0xb6, 0xc5, 0x86, 0xaa, 0x1b, 0xf7, 0x15, 0xbb, 0xf7, 0xf, + 0xd9, 0xa6, 0x1f, 0xf7, 0x27, 0xf8, 0x3e, 0x5, 0xef, 0x6, 0xae, 0xf4, + 0x5, 0x27, 0x6, 0xcd, 0xa2, 0x96, 0xa8, 0xba, 0x1b, 0xa9, 0xa9, 0x81, + 0x87, 0x98, 0x1f, 0xba, 0xf7, 0x5, 0x5, 0x9e, 0x50, 0x52, 0x8d, 0x80, + 0x1b, 0xfb, 0x1e, 0x7b, 0x35, 0xfb, 0x15, 0x51, 0x1f, 0x2a, 0x6, 0x67, + 0x22, 0x5, 0xed, 0x6, 0xfb, 0x26, 0xfc, 0x3c, 0x5, 0x4f, 0x77, 0x75, + 0x72, 0x6b, 0x1b, 0x77, 0x78, 0x8d, 0x95, 0x64, 0x1f, 0xe, 0xfb, 0x1b, + 0xfb, 0x11, 0x76, 0xf7, 0x25, 0xf7, 0x14, 0x1, 0xf7, 0xbd, 0x8a, 0x61, + 0xa, 0xf7, 0x1f, 0x3e, 0xa, 0xfb, 0x1e, 0x6, 0xfb, 0x96, 0xfb, 0x14, + 0x61, 0xa, 0x56, 0xa, 0xe, 0xf8, 0x1, 0x8b, 0xf7, 0x26, 0x1, 0xf9, + 0x92, 0x16, 0x4b, 0xa, 0xfd, 0x53, 0xfb, 0x26, 0x15, 0x4b, 0xa, 0xf7, + 0xc8, 0xfb, 0x26, 0x15, 0x4b, 0xa, 0xe, 0x3c, 0xfb, 0x2a, 0x76, 0xf8, + 0xdb, 0xf7, 0x3, 0xf7, 0x57, 0x77, 0x1, 0xf7, 0x45, 0xfb, 0x3f, 0x15, + 0xf7, 0x18, 0x6, 0xf7, 0xc, 0xf8, 0xdb, 0x5, 0xf7, 0x42, 0x6, 0xa2, + 0xf7, 0x3, 0x5, 0xfb, 0x43, 0x6, 0xb4, 0xf7, 0x57, 0x66, 0xa, 0x62, + 0xfb, 0x57, 0x5, 0xfb, 0x48, 0x6, 0x75, 0xfb, 0x3, 0x5, 0xf7, 0x48, + 0x6, 0xe, 0x3c, 0xfb, 0x2a, 0x76, 0xf7, 0x42, 0xf7, 0x3, 0xf7, 0xd7, + 0xf7, 0x3, 0xf7, 0x3e, 0x77, 0x1, 0xb9, 0x8e, 0x15, 0xf7, 0x43, 0x6, + 0x69, 0xfb, 0x42, 0x5, 0xf7, 0x14, 0x6, 0xad, 0xf7, 0x42, 0x5, 0xf7, + 0x3d, 0x89, 0xa, 0xcc, 0xf7, 0xd7, 0x5, 0xf7, 0x3e, 0x89, 0xa, 0xac, + 0xf7, 0x3e, 0x5, 0xfb, 0x13, 0x6, 0x69, 0xfb, 0x3e, 0x5, 0xfb, 0x44, + 0x6, 0x75, 0xfb, 0x3, 0x5, 0xf7, 0x43, 0x6, 0x4b, 0xfb, 0xd7, 0x5, + 0xfb, 0x44, 0x6, 0xe, 0x72, 0xa, 0xf7, 0xa, 0xf8, 0xf0, 0x8f, 0xa, + 0xe4, 0xe1, 0xb3, 0x35, 0x5, 0xf1, 0x6, 0x4c, 0xf7, 0x26, 0x81, 0xa, + 0xf8, 0x1, 0x7a, 0xdb, 0x4e, 0x76, 0xf9, 0x1d, 0xdb, 0x12, 0x13, 0x60, + 0xf7, 0x3e, 0xf8, 0x6f, 0x15, 0x9b, 0xa1, 0xf7, 0x1f, 0xc3, 0x9b, 0x9e, + 0x76, 0x6e, 0x75, 0x77, 0xfb, 0x17, 0x4f, 0x6a, 0x8b, 0xaa, 0x9c, 0x1e, + 0x47, 0xfc, 0x82, 0x15, 0xed, 0x6, 0xf8, 0x6a, 0xf9, 0x6d, 0x5, 0x26, + 0x6, 0xfc, 0x81, 0xfb, 0x7f, 0x15, 0xfb, 0x1, 0xd3, 0x79, 0xba, 0xf7, + 0x1c, 0xb8, 0xf7, 0x36, 0xd1, 0xb5, 0x79, 0xe3, 0x21, 0xfb, 0x2f, 0x76, + 0xfb, 0x6b, 0x77, 0x1e, 0xf7, 0xd7, 0xfc, 0x1, 0x15, 0x13, 0xa0, 0xfb, + 0x1, 0xd1, 0x79, 0xbb, 0xf7, 0x1c, 0xb8, 0xf7, 0x3e, 0xd0, 0xb5, 0x79, + 0xdc, 0x21, 0x74, 0xa, 0xa1, 0xf7, 0x1f, 0xc3, 0x9a, 0x9e, 0x7e, 0x6d, + 0x76, 0x77, 0xfb, 0x1e, 0x51, 0x69, 0x8b, 0xaa, 0x9b, 0x1e, 0xf7, 0x8b, + 0x16, 0xfb, 0x1, 0xd1, 0x79, 0xba, 0xf7, 0x1e, 0xb7, 0xf7, 0x3d, 0xcf, + 0xb2, 0x7b, 0xe1, 0xfb, 0x0, 0x74, 0xa, 0xa0, 0xf7, 0x1f, 0xc4, 0x9a, + 0x9e, 0x7c, 0x6d, 0x76, 0x77, 0xfb, 0x1c, 0x50, 0x6a, 0x8b, 0xaa, 0x9b, + 0x1e, 0xe, 0xab, 0x78, 0xf7, 0x14, 0x12, 0xdc, 0xf7, 0x26, 0x53, 0xf7, + 0x26, 0xf7, 0x5b, 0xf7, 0x2c, 0x2a, 0xf7, 0x27, 0x13, 0xd0, 0xdc, 0xf7, + 0x7e, 0x15, 0xfb, 0x46, 0xf7, 0x28, 0x40, 0xf7, 0x24, 0xf7, 0x67, 0xdf, + 0xf7, 0x2, 0xf7, 0x1, 0xf7, 0x12, 0x34, 0xc4, 0xfb, 0x14, 0xc2, 0x1e, + 0x13, 0xa8, 0x35, 0xb0, 0x59, 0x8e, 0xc0, 0x1a, 0xd8, 0xe7, 0x9e, 0xa5, + 0xd1, 0xc5, 0x73, 0x35, 0x93, 0x1e, 0xf7, 0x27, 0x92, 0x5, 0xf7, 0x37, + 0x80, 0xfb, 0x14, 0xc8, 0xfb, 0x23, 0x1b, 0xfb, 0x65, 0x53, 0xfb, 0x14, + 0x32, 0xfb, 0x15, 0xe5, 0x6e, 0xf7, 0x15, 0x53, 0x1f, 0x13, 0xd0, 0xdc, + 0x68, 0xb8, 0x6e, 0x56, 0x1a, 0x3d, 0x32, 0x7e, 0x57, 0xfb, 0x23, 0x88, + 0xcf, 0xcb, 0x89, 0x1e, 0xf7, 0x3e, 0xf8, 0xb3, 0x15, 0xf7, 0x1d, 0x6, + 0xf7, 0x2b, 0x5d, 0xa, 0xfb, 0xd, 0x6, 0x32, 0x31, 0x64, 0xe5, 0x5, + 0x26, 0x6, 0xe, 0x58, 0xa, 0xf7, 0x62, 0xd7, 0x15, 0xd0, 0x6, 0x5e, + 0xf7, 0x65, 0xf7, 0xf, 0xf7, 0x5b, 0x5, 0x39, 0x6, 0xfb, 0x21, 0xfb, + 0x5b, 0x5, 0xe, 0xf8, 0x1, 0x78, 0xf7, 0xd, 0xfb, 0x1, 0xf7, 0x1, + 0xfb, 0x1, 0xf7, 0xf, 0xf7, 0x5c, 0xf7, 0xf, 0xf7, 0x37, 0xf7, 0xf, + 0xfb, 0x1, 0xf7, 0xd, 0x12, 0xee, 0xf7, 0x19, 0x13, 0x3a, 0xf8, 0x84, + 0x84, 0x15, 0xf8, 0x88, 0x71, 0xa, 0xfb, 0xfc, 0x6, 0xb4, 0xf7, 0x5c, + 0x5, 0xf7, 0xc7, 0x71, 0xa, 0xfb, 0xc8, 0x6, 0xac, 0xf7, 0x37, 0x5, + 0xf7, 0xdc, 0x6, 0xa4, 0xf7, 0xf, 0x5, 0xfc, 0x68, 0x6, 0x7a, 0x39, + 0x5, 0x13, 0x96, 0xd6, 0x62, 0x3c, 0x9e, 0x57, 0x1b, 0xfb, 0x52, 0xfb, + 0x3c, 0xfb, 0x57, 0xfb, 0xab, 0xfb, 0x61, 0xf7, 0x12, 0x3e, 0xf7, 0x12, + 0xe3, 0xb4, 0xb1, 0xad, 0xa5, 0x1f, 0x8d, 0x88, 0x5, 0x13, 0x56, 0xfb, + 0xa8, 0xf7, 0x69, 0x15, 0xf7, 0x12, 0xc5, 0xf7, 0x77, 0xf7, 0x38, 0xe1, + 0xb7, 0x4a, 0x3e, 0x4e, 0x76, 0xfb, 0x9, 0x6f, 0x42, 0x1e, 0x6f, 0x80, + 0x63, 0x2e, 0x20, 0x1b, 0x38, 0x4d, 0xc5, 0xf2, 0x1f, 0xe, 0xfb, 0xf9, + 0xf8, 0x6f, 0x76, 0xf7, 0xa5, 0x77, 0x1, 0xf7, 0x39, 0xf8, 0x5a, 0x8e, + 0xa, 0xa6, 0xf7, 0x15, 0x5, 0x4d, 0x6, 0x97, 0xc4, 0xa4, 0x9a, 0xb6, + 0x95, 0x98, 0xc9, 0x18, 0xfb, 0x1e, 0x88, 0x74, 0xfb, 0x1, 0x7f, 0x54, + 0x8, 0xe, 0xfb, 0xf9, 0xf8, 0x66, 0x76, 0xf7, 0xa5, 0x77, 0x1, 0xf7, + 0x3b, 0xf8, 0x51, 0x15, 0xf7, 0x1d, 0x3e, 0xa, 0xfb, 0x1d, 0x6, 0x70, + 0xfb, 0x15, 0x5, 0xc9, 0x6, 0x7e, 0x53, 0x73, 0x7b, 0x60, 0x81, 0x8, + 0xe, 0xfb, 0x1b, 0xf8, 0x5a, 0xf7, 0x14, 0xf7, 0x25, 0x77, 0x1, 0xf7, + 0x34, 0xf8, 0x5a, 0x15, 0xf7, 0x1f, 0x6, 0xa6, 0xf7, 0x14, 0x5, 0x4d, + 0x6, 0x97, 0xc3, 0xa4, 0x9d, 0xb7, 0x94, 0x97, 0xc9, 0x18, 0xfb, 0x1e, + 0x88, 0x73, 0xfb, 0x3, 0x7f, 0x55, 0x8, 0xf7, 0x64, 0x22, 0x8e, 0xa, + 0xa7, 0xf7, 0x14, 0x5, 0x4c, 0x6, 0x98, 0xc3, 0xa3, 0x9d, 0xb7, 0x94, + 0x98, 0xc9, 0x18, 0xfb, 0x1f, 0x88, 0x74, 0xfb, 0x3, 0x7f, 0x55, 0x8, + 0xe, 0xfb, 0x1b, 0xf8, 0x66, 0x76, 0xf7, 0x24, 0xf7, 0x15, 0x1, 0xf8, + 0x1c, 0xf8, 0x51, 0x15, 0xf7, 0x1f, 0x3e, 0xa, 0xfb, 0x1e, 0x6, 0x6f, + 0x62, 0xa, 0xfb, 0x87, 0x4d, 0x15, 0x56, 0xa, 0x70, 0x62, 0xa, 0xe, + 0xfb, 0xb1, 0xf7, 0x6b, 0x76, 0xf7, 0xde, 0x77, 0x1, 0xde, 0xf7, 0xfd, + 0x15, 0x2f, 0xd7, 0x40, 0xe7, 0xe7, 0xd8, 0xd5, 0xe8, 0xe9, 0x3e, 0xd0, + 0x2f, 0x2e, 0x40, 0x44, 0x2f, 0x1e, 0xe, 0x3c, 0x88, 0xa, 0xf8, 0xd7, + 0xf5, 0xfc, 0xd7, 0x6, 0xe, 0xf8, 0x1, 0x88, 0xa, 0xfa, 0x93, 0xf5, + 0xfe, 0x93, 0x6, 0xe, 0xf8, 0xf6, 0xf7, 0x13, 0x38, 0xde, 0x89, 0x77, + 0x12, 0x13, 0x80, 0xf7, 0x5, 0xf8, 0xf6, 0x15, 0xd4, 0x6, 0x13, 0x40, + 0x8f, 0x9a, 0x96, 0xa7, 0xae, 0x8c, 0x8, 0xaa, 0xa2, 0x81, 0x81, 0xa3, + 0x1f, 0x81, 0xa2, 0xa2, 0x80, 0xaa, 0x1b, 0xc1, 0xbb, 0xb5, 0xdd, 0x99, + 0x1f, 0x41, 0x6, 0x72, 0x83, 0x83, 0x7a, 0x74, 0x1b, 0x75, 0x75, 0x93, + 0x93, 0x72, 0x1f, 0x13, 0x20, 0x96, 0x6c, 0x6a, 0x98, 0x69, 0x1b, 0x13, + 0x80, 0x3d, 0x72, 0x42, 0x57, 0x80, 0x1f, 0xe, 0xf8, 0x1, 0xf7, 0xdb, + 0x76, 0xf7, 0xe7, 0xd4, 0x1, 0xf7, 0x68, 0xe5, 0xf7, 0x58, 0xe0, 0xf7, + 0xd0, 0xe0, 0x3, 0xf7, 0x68, 0xf7, 0xc6, 0x15, 0xe5, 0xf7, 0xe7, 0xf7, + 0x2e, 0xd4, 0xfc, 0x26, 0x42, 0xf7, 0x32, 0x6, 0xf7, 0xb2, 0xfb, 0xe7, + 0x15, 0xe0, 0xf7, 0xdc, 0x8d, 0x6, 0xf7, 0x8, 0xfb, 0xdc, 0x5, 0xdb, + 0x6, 0xf7, 0x7, 0xf7, 0xdc, 0x5, 0x8e, 0xfb, 0xdc, 0xe0, 0xf8, 0x30, + 0xfb, 0x21, 0x6, 0x26, 0xfb, 0xaf, 0x51, 0xa, 0x25, 0xf7, 0xaf, 0x5, + 0xfb, 0x20, 0x6, 0xe, 0x3c, 0x7d, 0xef, 0xf8, 0x94, 0xf7, 0x2c, 0x1, + 0xf7, 0x24, 0xf7, 0x1c, 0xf7, 0x26, 0xf7, 0x28, 0x3, 0xca, 0xf7, 0x28, + 0x15, 0xfb, 0x7, 0xad, 0xe9, 0x5c, 0xf7, 0x1e, 0x1b, 0xf7, 0x51, 0xc3, + 0xe5, 0xd3, 0xf4, 0xfb, 0x4, 0xc5, 0x3a, 0xa3, 0x1f, 0x41, 0xa1, 0x70, + 0x8b, 0xab, 0x1a, 0xa4, 0xa4, 0xab, 0xc7, 0x9b, 0xd4, 0x8b, 0x4b, 0xa2, + 0x1e, 0xf7, 0x1a, 0xa3, 0x5, 0xf7, 0x11, 0x6f, 0xfb, 0xc, 0x9b, 0x40, + 0x1b, 0xfb, 0x3a, 0x3d, 0x46, 0x32, 0x27, 0xdc, 0x69, 0xe6, 0x6c, 0x1f, + 0xef, 0x69, 0x95, 0x7e, 0x6e, 0x1a, 0x67, 0x5a, 0x71, 0x58, 0x3d, 0x70, + 0xb3, 0xb8, 0x7a, 0x1e, 0xf7, 0x11, 0xf8, 0x3f, 0x15, 0x82, 0xa, 0xf7, + 0x2a, 0x5d, 0xa, 0xfb, 0xc, 0x6, 0x33, 0x31, 0x64, 0xe5, 0x5, 0x27, + 0x6, 0xe, 0x58, 0xa, 0xee, 0xd7, 0x15, 0xdd, 0x6, 0xf7, 0x21, 0xf7, + 0x55, 0x3f, 0xf7, 0x6b, 0x5, 0x46, 0x6, 0xb8, 0xfb, 0x6b, 0x5, 0xe, + 0xf7, 0xc9, 0x7d, 0xf1, 0x25, 0xf7, 0x2, 0xf7, 0x10, 0xe3, 0xf7, 0x15, + 0xf7, 0x1, 0x24, 0xf2, 0x12, 0xdd, 0xf7, 0x21, 0xf7, 0x98, 0xf7, 0x15, + 0x13, 0xb6, 0xf8, 0xa5, 0xcc, 0x15, 0x56, 0xb8, 0xd0, 0x71, 0xd0, 0x1b, + 0xf7, 0x2a, 0xca, 0xf7, 0x1, 0xb9, 0xa5, 0x1f, 0xfb, 0x13, 0xa2, 0x5, + 0x69, 0x7b, 0x6a, 0x61, 0x4d, 0x1b, 0x68, 0x47, 0xa4, 0xf6, 0x8d, 0x1f, + 0xf7, 0xf6, 0x6, 0x94, 0xae, 0x8d, 0xb0, 0xaf, 0x1a, 0xec, 0x4c, 0xf7, + 0xd, 0xfb, 0x2b, 0x74, 0x33, 0x89, 0x42, 0x39, 0x1e, 0xca, 0x51, 0x45, + 0x97, 0x53, 0x1b, 0xfb, 0xaa, 0x71, 0xfb, 0xa5, 0x4a, 0xfb, 0xa, 0xcf, + 0x23, 0xf7, 0x45, 0xd6, 0xd5, 0xa5, 0xc0, 0xc0, 0x1f, 0xec, 0xf7, 0x87, + 0x15, 0x13, 0xae, 0xa8, 0x92, 0xa4, 0xf5, 0xe9, 0x1b, 0xf0, 0x86, 0xfb, + 0x4, 0x74, 0x8a, 0x1f, 0xfd, 0x4, 0x27, 0x15, 0x13, 0x76, 0xf7, 0x5, + 0xc0, 0xf7, 0x8, 0xf0, 0xb7, 0xc9, 0x6f, 0x29, 0x43, 0x65, 0xfb, 0x23, + 0xfb, 0x9, 0x47, 0x66, 0xc1, 0xc5, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf9, + 0x6d, 0x77, 0xdf, 0xf7, 0xe, 0x1, 0x64, 0xa, 0xf7, 0xa2, 0xf7, 0xcc, + 0xf8, 0x5f, 0x43, 0xa, 0xfb, 0x5d, 0xfb, 0xcc, 0xfb, 0x10, 0xf7, 0xcc, + 0x5a, 0xa, 0xf7, 0x51, 0xfc, 0x50, 0x5, 0x8a, 0xf8, 0x90, 0x15, 0xf7, + 0x6, 0x6, 0xa3, 0x55, 0xa, 0xfb, 0x7, 0x6, 0xf7, 0x40, 0xfb, 0xe, + 0x15, 0xf7, 0x6, 0x6, 0xa3, 0x55, 0xa, 0xfb, 0x6, 0x6, 0xe, 0xfb, + 0x39, 0x76, 0xf8, 0xab, 0x77, 0xcf, 0xf7, 0x1b, 0x1, 0xf7, 0x46, 0xf8, + 0x21, 0x15, 0xf7, 0x25, 0x6, 0xa9, 0xf7, 0x1b, 0x93, 0xa, 0xfb, 0xb, + 0xfc, 0xb9, 0x15, 0x65, 0xfb, 0x3d, 0x5, 0xf7, 0x2b, 0x6, 0xb0, 0xf7, + 0x3d, 0xb9, 0xf8, 0x2, 0x5, 0x3a, 0x6, 0xe, 0x3c, 0x2a, 0x76, 0xf6, + 0xf5, 0xf7, 0xed, 0xe9, 0xe9, 0x77, 0x1, 0xda, 0xf7, 0x1b, 0x3, 0xf7, + 0x24, 0x2c, 0x15, 0xc9, 0x74, 0xbe, 0xf7, 0x3, 0x5, 0x89, 0x95, 0x9b, + 0x89, 0xa1, 0x1b, 0xf7, 0x2f, 0xd5, 0xf7, 0x3, 0xd8, 0xa6, 0x1f, 0xfb, + 0x19, 0x9f, 0x73, 0x50, 0x64, 0x5c, 0x4b, 0x8f, 0x19, 0xf7, 0x1c, 0xf7, + 0xd8, 0xa0, 0x79, 0x96, 0x72, 0x8d, 0x6d, 0x19, 0xf7, 0x14, 0x99, 0x85, + 0xe3, 0x4f, 0xbb, 0x54, 0xa0, 0x19, 0xb0, 0xe2, 0x4f, 0xa3, 0x61, 0x2b, + 0x5, 0x8c, 0x85, 0x81, 0x8c, 0x7b, 0x1b, 0xfb, 0x39, 0xfb, 0x1d, 0xfb, + 0x20, 0xfb, 0x57, 0x2a, 0xb6, 0x4f, 0xd3, 0x6b, 0x1f, 0xb9, 0xf7, 0x2, + 0x15, 0x82, 0x93, 0x7a, 0x9e, 0xbf, 0x1a, 0xd2, 0xab, 0xf7, 0x35, 0xf7, + 0x14, 0x94, 0x1e, 0xe, 0x3c, 0x90, 0x76, 0xa6, 0x76, 0xf7, 0xc8, 0xf7, + 0x0, 0xf7, 0x61, 0xf6, 0x12, 0xf7, 0x4b, 0xf7, 0x14, 0x13, 0xb8, 0xcb, + 0x7b, 0x15, 0x9c, 0xaa, 0xc2, 0xa3, 0xc4, 0x1b, 0xbb, 0xa9, 0x82, 0x82, + 0xaa, 0x1f, 0x13, 0x78, 0x82, 0xa9, 0xab, 0x83, 0xbc, 0x1b, 0xc5, 0xaf, + 0x9a, 0x98, 0xaf, 0x1f, 0x61, 0xf7, 0xb, 0x5, 0x71, 0x53, 0x68, 0x8b, + 0x78, 0x1b, 0x7e, 0x41, 0x97, 0x84, 0xad, 0x1f, 0x86, 0xa4, 0x3e, 0x97, + 0x74, 0x1b, 0x75, 0x78, 0x87, 0x81, 0x7e, 0x1f, 0x89, 0x8d, 0xca, 0xc2, + 0xad, 0xbd, 0x90, 0xdd, 0x19, 0xe9, 0x6, 0xa2, 0xf7, 0x0, 0x7a, 0xa, + 0x87, 0xa1, 0x88, 0xa1, 0xa3, 0x1a, 0xe9, 0xc2, 0xb6, 0xc0, 0xd7, 0x96, + 0x44, 0x72, 0x8f, 0x1e, 0xf7, 0x11, 0x98, 0x5, 0xea, 0x84, 0x4f, 0xea, + 0xfb, 0x23, 0x1b, 0xfb, 0x28, 0x2d, 0xfb, 0x8, 0xfb, 0x14, 0x85, 0x8b, + 0x75, 0x93, 0x63, 0x1f, 0x3d, 0x6, 0x75, 0xfb, 0x0, 0x5, 0xf7, 0x3, + 0x6, 0x7e, 0xfb, 0x9, 0x23, 0x52, 0x68, 0x7c, 0x8, 0xe, 0x3c, 0xec, + 0x76, 0xb5, 0xf7, 0x16, 0xf7, 0x69, 0xf7, 0x16, 0xb8, 0x77, 0x1, 0xdc, + 0xd8, 0x15, 0xe6, 0xd2, 0x5, 0x78, 0xa6, 0xad, 0x80, 0xb1, 0x1b, 0xb5, + 0xb7, 0x97, 0x9e, 0xae, 0x1f, 0xb8, 0x42, 0xf7, 0x7, 0xe6, 0x5f, 0xd3, + 0xaa, 0xae, 0xa4, 0xb4, 0x99, 0xb5, 0x19, 0x92, 0xa0, 0x91, 0xa6, 0xa7, + 0x1a, 0x98, 0x8b, 0x98, 0x88, 0x99, 0x1e, 0xe7, 0xd3, 0x55, 0xe6, 0x2e, + 0x42, 0x5, 0x95, 0x7d, 0x6e, 0x9d, 0x52, 0x1b, 0x51, 0x60, 0x79, 0x81, + 0x77, 0x1f, 0x5e, 0xd4, 0xfb, 0x8, 0x2b, 0xb5, 0x46, 0x6e, 0x69, 0x74, + 0x62, 0x7e, 0x62, 0x19, 0x82, 0x71, 0x80, 0x60, 0x93, 0x5c, 0x32, 0x44, + 0x18, 0xf7, 0x74, 0xf7, 0x51, 0x15, 0xc6, 0x9e, 0xc9, 0xb8, 0xc3, 0x1b, + 0xb7, 0xa8, 0x6f, 0x62, 0x80, 0x89, 0x7f, 0x87, 0x7f, 0x1f, 0x4f, 0x77, + 0x4b, 0x5a, 0x53, 0x1b, 0x53, 0x6e, 0xbc, 0xc7, 0xa0, 0x1f, 0xe, 0x3c, + 0xa0, 0x76, 0xf7, 0x21, 0xe6, 0xf8, 0x66, 0x77, 0x1, 0xc7, 0xf7, 0x21, + 0x15, 0xf7, 0x4d, 0x6, 0x6d, 0xfb, 0x21, 0x5, 0xf7, 0x20, 0x6, 0xab, + 0xf7, 0x21, 0x5, 0xf7, 0x4b, 0x6, 0x9f, 0xe6, 0x5, 0xfb, 0x4c, 0x6, + 0x9c, 0xd7, 0x5, 0xf7, 0x4b, 0x6, 0x9f, 0xe7, 0x5, 0xfb, 0x13, 0x6, + 0xf7, 0x6a, 0xf7, 0xbe, 0x43, 0xa, 0xfb, 0x4b, 0xfb, 0xbe, 0x51, 0xa, + 0x40, 0xf7, 0xbe, 0x44, 0xa, 0xe8, 0xfb, 0xbe, 0x5, 0xfb, 0xf, 0x6, + 0x78, 0x2f, 0x5, 0xf7, 0x4d, 0x6, 0x7b, 0x3f, 0x5, 0xfb, 0x4e, 0x6, + 0xe, 0xfb, 0xf7, 0x78, 0xa, 0xdb, 0x78, 0x15, 0xf7, 0x0, 0x6, 0xce, + 0xf7, 0xc9, 0x5, 0xfb, 0x0, 0x6, 0xaa, 0xf7, 0x1d, 0x15, 0xf7, 0x0, + 0x6, 0xce, 0xf7, 0xca, 0x5, 0xfb, 0x0, 0x6, 0xe, 0x3c, 0xfb, 0x4c, + 0xe9, 0xf9, 0x1e, 0xf7, 0x3b, 0x12, 0xf6, 0xf7, 0xd, 0x78, 0xf7, 0x11, + 0xa1, 0xf7, 0x16, 0x6b, 0xf7, 0xa, 0x13, 0xe8, 0xc8, 0x77, 0x15, 0x35, + 0x9c, 0xd6, 0x3d, 0xf7, 0x1a, 0x1b, 0xf7, 0x1b, 0xcb, 0xd6, 0xd5, 0xbd, + 0x6f, 0xb7, 0x7d, 0x9e, 0x1f, 0x13, 0xd4, 0xd5, 0xae, 0xc1, 0xc6, 0xd3, + 0x1a, 0xc6, 0x6e, 0xbe, 0x2f, 0xdb, 0x1e, 0x27, 0xe3, 0x7a, 0x92, 0xb1, + 0x1a, 0xa5, 0x9c, 0xb3, 0xba, 0xcf, 0x8f, 0x4f, 0x78, 0x8d, 0x1e, 0xf7, + 0x12, 0x97, 0x5, 0xc4, 0x84, 0x72, 0xf3, 0xfb, 0x36, 0x1b, 0xfb, 0x28, + 0x5c, 0x30, 0x46, 0x75, 0x90, 0x6d, 0xa3, 0x65, 0x1f, 0x13, 0xe8, 0x67, + 0x79, 0x2c, 0x63, 0x22, 0x1a, 0x76, 0x89, 0x4a, 0xe1, 0x3e, 0x1e, 0xc8, + 0x55, 0xf3, 0x48, 0x4a, 0x1a, 0x83, 0x87, 0x5c, 0x4d, 0x60, 0x64, 0x9f, + 0xd9, 0x77, 0x1e, 0xf7, 0x57, 0xf7, 0x1c, 0x15, 0xfb, 0x9, 0xf7, 0x2, + 0x5, 0x65, 0xaf, 0x8b, 0x98, 0x96, 0x1a, 0xb9, 0xad, 0xaa, 0xab, 0x9d, + 0x1e, 0x86, 0xe2, 0x40, 0x82, 0x8f, 0x1f, 0x13, 0xe4, 0xb6, 0x64, 0xaa, + 0x6e, 0x66, 0x1a, 0x5d, 0x51, 0x71, 0x7e, 0x87, 0x1e, 0xe, 0xf8, 0xfa, + 0xf7, 0x7, 0x1, 0xf7, 0x1d, 0xf8, 0xfa, 0x69, 0xa, 0xf7, 0x45, 0xfb, + 0x7, 0x69, 0xa, 0xe, 0xf1, 0x78, 0xd6, 0xe7, 0xd2, 0xf7, 0xab, 0xd2, + 0xe8, 0xd6, 0x1, 0xc3, 0xd8, 0xf9, 0x5, 0xd8, 0x3, 0xf7, 0x19, 0xf7, + 0xf8, 0x15, 0xf7, 0x3c, 0xf7, 0x1d, 0xf7, 0x1e, 0xf7, 0x41, 0xf7, 0x41, + 0xf7, 0x22, 0xfb, 0x1e, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x22, 0xfb, 0x18, + 0xfb, 0x41, 0xfb, 0x41, 0xfb, 0x1d, 0xf7, 0x18, 0xf7, 0x3c, 0x1e, 0xf8, + 0x2c, 0x56, 0x15, 0x76, 0x83, 0x79, 0x4c, 0x43, 0x1b, 0x5c, 0x57, 0xaa, + 0xf5, 0xbc, 0x93, 0xe8, 0xe6, 0xcb, 0xa4, 0x5b, 0x77, 0x93, 0x1f, 0xdd, + 0x9e, 0x5, 0xaf, 0x7d, 0x60, 0xdf, 0xfb, 0xe, 0x1b, 0xfb, 0x13, 0x4e, + 0x33, 0xfb, 0x11, 0xfb, 0x2f, 0xed, 0x56, 0xe5, 0xcd, 0xde, 0xa9, 0xed, + 0xa9, 0x1f, 0xfc, 0xca, 0xdb, 0x15, 0xfb, 0x65, 0xf7, 0x40, 0xfb, 0x3a, + 0xf7, 0x6b, 0xf7, 0x6b, 0xf7, 0x45, 0xf7, 0x3a, 0xf7, 0x65, 0xf7, 0x65, + 0xfb, 0x45, 0xf7, 0x40, 0xfb, 0x6b, 0xfb, 0x6b, 0xfb, 0x40, 0xfb, 0x40, + 0xfb, 0x65, 0x1e, 0xe, 0xfb, 0x9d, 0xf7, 0xa8, 0xe3, 0xf8, 0x9, 0x77, + 0x1, 0xf7, 0xd9, 0xf7, 0xb2, 0x15, 0xf5, 0x6, 0x81, 0xa6, 0x89, 0xa1, + 0x9b, 0xe9, 0xb9, 0xe0, 0xdf, 0x1a, 0xf7, 0xf, 0xfb, 0x15, 0x8b, 0x76, + 0x6b, 0x21, 0x8a, 0xfb, 0x16, 0x5b, 0x1e, 0xf4, 0x7b, 0x5, 0xbe, 0xa4, + 0xb3, 0x8b, 0x95, 0x1b, 0xaf, 0xab, 0x6d, 0x53, 0x70, 0x1f, 0xfb, 0x3, + 0x7e, 0x78, 0x89, 0x65, 0x80, 0x8, 0x54, 0x7a, 0x68, 0x4a, 0x4f, 0x1a, + 0x51, 0xad, 0x56, 0xe0, 0xaf, 0xb2, 0x98, 0xa4, 0xac, 0x1e, 0x8c, 0x7d, + 0x8c, 0x87, 0x8f, 0x81, 0x8, 0x8c, 0xf7, 0x4a, 0x15, 0x61, 0x82, 0x7e, + 0x4d, 0x4e, 0x1b, 0x73, 0x6d, 0x9c, 0xa4, 0xb5, 0xbf, 0x94, 0xe0, 0x96, + 0x1f, 0xe, 0x3c, 0x58, 0xa, 0xf8, 0x23, 0xd7, 0x4a, 0xa, 0x35, 0xfb, + 0x6d, 0x4a, 0xa, 0xe, 0x58, 0xf7, 0x15, 0x76, 0x1, 0xf4, 0xf7, 0xc6, + 0x15, 0xf8, 0x1, 0xfb, 0x5a, 0xf7, 0x19, 0xf7, 0xcb, 0xfc, 0x86, 0x6, + 0xe, 0x58, 0xf7, 0x59, 0xf7, 0x4, 0x1, 0xdd, 0xf7, 0x59, 0x15, 0xf7, + 0x4, 0xf8, 0xa4, 0xfb, 0x4, 0x7, 0xe, 0xf1, 0x78, 0xd6, 0xf7, 0xa0, + 0xca, 0xf7, 0xa7, 0xd6, 0x1, 0xc2, 0xd8, 0xf8, 0x32, 0xe4, 0xf7, 0xe, + 0xd8, 0x3, 0xf7, 0x94, 0xf7, 0x33, 0x15, 0xde, 0x6, 0xa4, 0xf7, 0x39, + 0x5, 0xa1, 0x6, 0xb5, 0xa4, 0x85, 0x2e, 0xae, 0x1f, 0xa3, 0x49, 0x5, + 0xf3, 0x6, 0x66, 0xdc, 0x71, 0xc7, 0x81, 0x9f, 0x67, 0x99, 0x19, 0x8d, + 0x7, 0xe1, 0x96, 0xb5, 0xbd, 0xb9, 0x1a, 0xf7, 0x15, 0xfb, 0x6, 0x7f, + 0xfb, 0xc, 0x1e, 0x38, 0x6, 0xc3, 0xfb, 0x41, 0x15, 0x9c, 0xf7, 0x1, + 0x5, 0xae, 0x6, 0xd4, 0xba, 0x8f, 0x52, 0x52, 0x4d, 0x8c, 0x40, 0x1f, + 0xfb, 0xa9, 0x6f, 0x15, 0xf7, 0x3c, 0xf7, 0x20, 0xf7, 0x1b, 0xf7, 0x41, + 0xf7, 0x41, 0xf7, 0x1f, 0xfb, 0x1b, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x1f, + 0xfb, 0x1b, 0xfb, 0x41, 0xfb, 0x41, 0xfb, 0x20, 0xf7, 0x1b, 0xf7, 0x3c, + 0x1e, 0x3e, 0x16, 0xfb, 0x65, 0xf7, 0x43, 0xfb, 0x3d, 0xf7, 0x6b, 0xf7, + 0x6b, 0xf7, 0x42, 0xf7, 0x3d, 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x42, 0xf7, + 0x3d, 0xfb, 0x6b, 0xfb, 0x6b, 0xfb, 0x43, 0xfb, 0x3d, 0xfb, 0x65, 0x1e, + 0xe, 0xf8, 0xf0, 0xd5, 0x1, 0xf7, 0xe, 0xf7, 0xfd, 0x3, 0xf7, 0xe, + 0xf8, 0xf0, 0x15, 0xf7, 0xe7, 0x6, 0xa1, 0xd5, 0x5, 0xfb, 0xe8, 0x6, + 0xe, 0xfb, 0x7f, 0xf7, 0x43, 0xd7, 0xf7, 0x20, 0xd7, 0x3, 0xf7, 0x43, + 0xf8, 0xcf, 0x15, 0x3b, 0xcc, 0x4a, 0xdb, 0xdc, 0xcd, 0xcc, 0xdb, 0xdb, + 0x49, 0xc8, 0x3a, 0x3b, 0x4a, 0x4e, 0x3b, 0x1e, 0xd7, 0x8a, 0x15, 0xb2, + 0xab, 0xa7, 0xb1, 0xb1, 0xab, 0x70, 0x63, 0x65, 0x6b, 0x6c, 0x65, 0x65, + 0x6b, 0xaa, 0xb1, 0x1e, 0xe, 0x58, 0x8b, 0xe7, 0xf7, 0x4c, 0xe9, 0xf7, + 0x1c, 0x77, 0x1, 0xf7, 0xaa, 0xf7, 0x0, 0x3, 0xb3, 0x16, 0xf8, 0xdd, + 0xe7, 0xfc, 0xdd, 0x6, 0xf7, 0x4c, 0x4, 0xf7, 0x82, 0xfb, 0x1f, 0xf7, + 0x0, 0xf7, 0x1f, 0xf7, 0x83, 0xe9, 0xfb, 0x83, 0xf7, 0x1c, 0xfb, 0x0, + 0xfb, 0x1c, 0xfb, 0x82, 0x6, 0xe, 0xf7, 0xaf, 0xe4, 0xf7, 0x95, 0xdc, + 0x1, 0xd0, 0xf7, 0xaf, 0x15, 0xf7, 0xd8, 0x6, 0xa2, 0xe4, 0x5, 0xfb, + 0x3c, 0x6, 0xa0, 0x9c, 0xc4, 0xb1, 0x97, 0x96, 0x8, 0xdc, 0xd3, 0xa9, + 0xb3, 0xb5, 0x1a, 0xc5, 0x5d, 0xc7, 0xfb, 0x7, 0xfb, 0x25, 0x75, 0x22, + 0x6f, 0x86, 0x1e, 0xf7, 0x4, 0x7d, 0x5, 0xa7, 0x92, 0x94, 0xb1, 0xb9, + 0x1b, 0xef, 0x30, 0xfb, 0x1, 0x52, 0x30, 0x1f, 0x2a, 0x4e, 0x6c, 0x5d, + 0x80, 0x42, 0x8, 0xe, 0xf7, 0xa3, 0xdd, 0x39, 0xf7, 0x1c, 0xf7, 0xc3, + 0x77, 0x1, 0xe6, 0xf8, 0x26, 0x15, 0x71, 0x8e, 0x9b, 0x22, 0xf7, 0x1b, + 0x1b, 0xf7, 0x2, 0xca, 0xda, 0xc8, 0x1f, 0xb9, 0x61, 0x9e, 0x9f, 0x9c, + 0xcc, 0xa6, 0xc0, 0x1a, 0xb8, 0x6a, 0xd3, 0x21, 0xfb, 0xa, 0x6c, 0x33, + 0x6a, 0x7f, 0x1e, 0xed, 0x79, 0x5, 0xb0, 0x95, 0x9c, 0x9f, 0xa8, 0x1b, + 0x92, 0xad, 0x8a, 0x69, 0x4f, 0x46, 0x92, 0x7d, 0x8d, 0x1f, 0x77, 0x34, + 0x5, 0xab, 0x95, 0xba, 0x83, 0x5d, 0x1a, 0x6d, 0x72, 0x6f, 0x61, 0x60, + 0x86, 0xaa, 0xa7, 0x86, 0x1e, 0xe, 0xf9, 0x5, 0x76, 0xf7, 0x26, 0x77, + 0x1, 0xf7, 0x80, 0xf8, 0xf0, 0x15, 0xf2, 0x52, 0xa, 0xe, 0x73, 0xfb, + 0x4e, 0x76, 0xf7, 0x62, 0xeb, 0x33, 0x76, 0xf8, 0xb6, 0x77, 0x12, 0x13, + 0xb0, 0xf7, 0x70, 0xc3, 0x15, 0x70, 0x9a, 0xa4, 0x60, 0xc8, 0x1b, 0xb7, + 0xa3, 0xa0, 0xb4, 0xb1, 0x1f, 0x13, 0xd0, 0x82, 0x5a, 0x5, 0xf7, 0x14, + 0x6, 0xf7, 0x4, 0xf8, 0xa9, 0x3d, 0xa, 0x4f, 0xfb, 0xa9, 0x5, 0x54, + 0x80, 0x74, 0x22, 0x33, 0x1b, 0x68, 0x5c, 0xa6, 0xcb, 0x1f, 0xce, 0xf7, + 0xee, 0x92, 0xa, 0xfb, 0x30, 0xfd, 0x77, 0x8d, 0xa, 0xe, 0x3c, 0xfb, + 0x3e, 0x76, 0xf9, 0x92, 0xf7, 0x11, 0x1, 0xf7, 0xc3, 0xfb, 0x53, 0x15, + 0xf7, 0x10, 0xf9, 0x92, 0xd9, 0xfd, 0x92, 0xf7, 0xc, 0xf9, 0x92, 0xca, + 0xf7, 0x11, 0xfb, 0xcb, 0x6, 0xfb, 0x29, 0xfb, 0x16, 0x5f, 0xfb, 0x2d, + 0x5a, 0xa4, 0xfb, 0x26, 0xf7, 0x48, 0x1f, 0xe, 0xfb, 0xf9, 0xf7, 0x40, + 0xf7, 0x36, 0x1, 0xf7, 0x2, 0xf7, 0x40, 0x8e, 0xa, 0xa7, 0xf7, 0x36, + 0x81, 0xa, 0xfb, 0x78, 0xce, 0xf7, 0x35, 0x77, 0x1, 0xf7, 0x18, 0xe3, + 0x3, 0xbc, 0x80, 0x15, 0x7b, 0x53, 0x5, 0x8e, 0x9d, 0x9b, 0x8e, 0x95, + 0x1b, 0x99, 0xb4, 0x87, 0x66, 0x5c, 0x48, 0x7f, 0x3c, 0x1f, 0x74, 0x48, + 0x5, 0xf7, 0x2f, 0xf1, 0xae, 0xe6, 0xbc, 0x69, 0xc0, 0x41, 0x70, 0x76, + 0x86, 0x85, 0x7c, 0x1f, 0xe, 0xf7, 0xc4, 0x76, 0xf8, 0x3f, 0x77, 0x1, + 0xf7, 0x62, 0xf7, 0xaf, 0x15, 0xe7, 0x6, 0xe5, 0xf8, 0x3f, 0x5, 0x51, + 0x6, 0x71, 0x6f, 0x55, 0x5f, 0x3f, 0x6b, 0x71, 0x31, 0x18, 0xaf, 0x93, + 0xb2, 0x98, 0xb4, 0xa2, 0x8, 0xe, 0xfb, 0xa2, 0xf7, 0xa8, 0xf2, 0xf7, + 0x93, 0xf2, 0x1, 0xe7, 0xf7, 0x6, 0xf7, 0x39, 0xf7, 0x6, 0x3, 0xe7, + 0xf8, 0x57, 0x15, 0x30, 0xbe, 0x37, 0xf7, 0xf, 0xf7, 0x3f, 0xbb, 0xf7, + 0x60, 0xd8, 0xe9, 0x50, 0xe1, 0xfb, 0xa, 0xfb, 0x2b, 0x4a, 0xfb, 0x43, + 0xfb, 0x3, 0x1e, 0xf7, 0x6, 0x16, 0xc2, 0xa6, 0xf7, 0x14, 0xd8, 0xa8, + 0xab, 0x74, 0x55, 0x5a, 0x6f, 0xfb, 0x15, 0x3f, 0x62, 0x77, 0xad, 0xb1, + 0x1e, 0xe, 0x3c, 0x58, 0xa, 0xf3, 0xd7, 0x4d, 0xa, 0xaa, 0xfb, 0x59, + 0x4d, 0xa, 0xe, 0xf7, 0x5b, 0x92, 0x76, 0xf9, 0x68, 0x77, 0x1, 0xf8, + 0x69, 0xc3, 0x15, 0xf7, 0x31, 0x6, 0x7b, 0x45, 0x5, 0xd7, 0x6, 0x9c, + 0xd1, 0x5, 0xba, 0x6, 0x9b, 0xcd, 0x5, 0x5d, 0x6, 0xbd, 0xf7, 0x70, + 0x5, 0x41, 0x6, 0xfb, 0x67, 0xfb, 0x70, 0x5, 0xdf, 0x16, 0xee, 0xf6, + 0x8d, 0x89, 0x70, 0x22, 0x5, 0xfc, 0x93, 0xfb, 0x21, 0x15, 0xd8, 0x6, + 0xf8, 0xe9, 0xf9, 0x6d, 0x5, 0x3e, 0x6, 0xfc, 0xa5, 0xfb, 0xfd, 0x15, + 0xe2, 0x6, 0xdf, 0xf7, 0xfb, 0x5, 0x55, 0x6, 0x72, 0x74, 0x58, 0x66, + 0x44, 0x70, 0x84, 0x89, 0x18, 0x7a, 0x41, 0xac, 0x92, 0xb0, 0x96, 0xb2, + 0x9e, 0x19, 0xe, 0xf7, 0x5b, 0x7d, 0xd5, 0x51, 0x76, 0xf7, 0xbe, 0xcd, + 0xf8, 0x1, 0x77, 0x12, 0x13, 0x70, 0xf7, 0x18, 0x78, 0x15, 0xdd, 0x6, + 0xf9, 0xe, 0xf9, 0x6d, 0x5, 0x39, 0x6, 0xfc, 0xb8, 0xfb, 0xfd, 0x15, + 0xe7, 0x6, 0xe5, 0xf7, 0xfb, 0x5, 0x51, 0x6, 0x71, 0x74, 0x55, 0x66, + 0x3f, 0x70, 0x83, 0x89, 0x18, 0x79, 0x41, 0xaf, 0x92, 0xb2, 0x96, 0xb4, + 0x9e, 0x19, 0x13, 0xb0, 0xf7, 0xaa, 0xfc, 0xe8, 0x15, 0xf7, 0x97, 0x6, + 0x9e, 0xd5, 0x91, 0xa, 0x9c, 0x9a, 0x94, 0x95, 0x96, 0x92, 0x8, 0xf7, + 0x1, 0xd9, 0x9a, 0xb3, 0xaf, 0x1a, 0xbb, 0x66, 0xbe, 0x2f, 0xfb, 0x8, + 0x7a, 0x32, 0x74, 0x87, 0x1e, 0xe4, 0x7f, 0x5, 0xa3, 0x91, 0x92, 0xad, + 0xb0, 0x1b, 0xa5, 0x97, 0x79, 0x7c, 0x70, 0x70, 0x76, 0x3e, 0x4e, 0x1f, + 0x43, 0x51, 0x6d, 0x6b, 0x82, 0x4e, 0x8, 0xe, 0xf7, 0x5b, 0x92, 0x76, + 0xf7, 0xfa, 0xce, 0xf7, 0xbf, 0x77, 0x12, 0xf7, 0xb4, 0xe6, 0x45, 0xe5, + 0x13, 0xf0, 0xf8, 0x6f, 0xc3, 0x15, 0xf7, 0x38, 0x6, 0x7a, 0x45, 0x5, + 0xdb, 0x6, 0x9e, 0xd1, 0x5, 0xbb, 0x6, 0x9c, 0xcd, 0x5, 0x5b, 0x6, + 0xbf, 0xf7, 0x70, 0x5, 0x3e, 0x6, 0xfb, 0x72, 0xfb, 0x70, 0x5, 0xe3, + 0x16, 0xf3, 0xf6, 0x8d, 0x89, 0x70, 0x22, 0x5, 0xfc, 0xa2, 0xfb, 0x21, + 0x15, 0xdd, 0x6, 0xf9, 0x5, 0xf9, 0x6d, 0x5, 0x3b, 0x6, 0xfd, 0x28, + 0xfb, 0x96, 0x15, 0x76, 0x8e, 0x98, 0x34, 0xf7, 0x8, 0x1b, 0xe9, 0xc1, + 0xcc, 0xbe, 0x1f, 0xb3, 0x67, 0x99, 0x9c, 0x1a, 0x13, 0xe8, 0x98, 0xc3, + 0x93, 0xc8, 0x1a, 0xb0, 0x6e, 0xc5, 0x30, 0x26, 0x71, 0x42, 0x6f, 0x81, + 0x1e, 0xdf, 0x7d, 0x5, 0xaa, 0x94, 0x99, 0x9b, 0xa4, 0x1b, 0x90, 0xa9, + 0x8a, 0x6f, 0x59, 0x50, 0x91, 0x7e, 0x8c, 0x1f, 0x7a, 0x44, 0x5, 0x13, + 0xf0, 0xa7, 0x92, 0xb3, 0x85, 0x65, 0x1a, 0x72, 0x76, 0x73, 0x67, 0x66, + 0x87, 0xa6, 0xa2, 0x87, 0x1e, 0xe, 0x73, 0xfb, 0x57, 0xf2, 0xf8, 0x54, + 0x77, 0xcb, 0xf7, 0x18, 0x1, 0xc0, 0xf7, 0x1a, 0x3, 0xf8, 0x40, 0xad, + 0x15, 0xfb, 0xa, 0x70, 0x43, 0x83, 0x60, 0x1b, 0x3e, 0x75, 0xb3, 0xab, + 0xb0, 0xa1, 0xa2, 0xe1, 0xd4, 0x1f, 0xf7, 0x4, 0xeb, 0xb5, 0xbb, 0x9a, + 0xee, 0x8, 0xfb, 0x15, 0x6, 0x80, 0x4c, 0x77, 0x7b, 0x39, 0x48, 0x8, + 0xfb, 0xa, 0x2a, 0x58, 0x55, 0x3c, 0x1a, 0x36, 0xd1, 0x31, 0xf7, 0x35, + 0xf7, 0x50, 0xd0, 0xf7, 0x1c, 0xd1, 0x9d, 0x1e, 0xfb, 0x72, 0xf8, 0x19, + 0x15, 0x9b, 0xa, 0xa8, 0xf7, 0x18, 0x65, 0xa, 0x34, 0xa, 0xd7, 0xf7, + 0x27, 0x1, 0xf8, 0x7d, 0xf9, 0xa9, 0x15, 0xea, 0x6, 0x4d, 0xf7, 0x27, + 0x91, 0xa, 0xfc, 0x3, 0xfe, 0x3c, 0x27, 0xa, 0x34, 0xa, 0xf7, 0x73, + 0x77, 0x1, 0xf8, 0x51, 0xf9, 0xa8, 0x15, 0xee, 0x6, 0xf7, 0x3d, 0xf7, + 0x28, 0x5, 0xfb, 0x33, 0x6, 0xfc, 0xaa, 0xfe, 0x3c, 0x27, 0xa, 0x34, + 0xa, 0xd6, 0xf7, 0x28, 0x1, 0xf7, 0xd5, 0xf9, 0xa8, 0x15, 0xf7, 0x9, + 0x6, 0xe0, 0xe1, 0xb1, 0x35, 0x5, 0xec, 0x6, 0x4f, 0xf7, 0x28, 0x66, + 0xa, 0xfc, 0x53, 0xfe, 0x3c, 0x27, 0xa, 0x34, 0xa, 0xe3, 0xf7, 0xe, + 0x39, 0xdd, 0x12, 0x13, 0xe8, 0xf7, 0xed, 0xf9, 0xb2, 0x15, 0xcc, 0x6, + 0x98, 0x90, 0x94, 0xa9, 0xab, 0x1b, 0xaa, 0xa0, 0x82, 0x80, 0x9e, 0x1f, + 0x13, 0xf0, 0x80, 0xa0, 0x9e, 0x82, 0xa7, 0x1b, 0xbb, 0xb6, 0xb4, 0xdc, + 0x98, 0x1f, 0x49, 0x6, 0x72, 0x83, 0x84, 0x7b, 0x77, 0x1b, 0x74, 0x78, + 0x94, 0x94, 0x74, 0x1f, 0x96, 0x73, 0x71, 0x95, 0x67, 0x1b, 0x46, 0x75, + 0x43, 0x58, 0x80, 0x1f, 0xfb, 0xd9, 0xfd, 0xb2, 0x27, 0xa, 0x34, 0xa, + 0xde, 0xf7, 0xb, 0x1, 0xf7, 0xed, 0xf9, 0xb0, 0x8f, 0xa, 0xa4, 0xf7, + 0xb, 0x5, 0xfb, 0xd, 0x6, 0xf7, 0x4a, 0xfb, 0xb, 0x8f, 0xa, 0xa5, + 0xf7, 0xb, 0x7a, 0xa, 0xfc, 0xc3, 0xfe, 0x27, 0x27, 0xa, 0x34, 0xa, + 0xf7, 0x58, 0xc0, 0x1, 0x9f, 0xf9, 0x3e, 0x3, 0x9f, 0x16, 0x25, 0xa, + 0x29, 0xf8, 0xdb, 0x15, 0x56, 0xb6, 0x5f, 0xc0, 0xbe, 0xb6, 0xb5, 0xc2, + 0xc3, 0x61, 0xb1, 0x57, 0x54, 0x62, 0x64, 0x54, 0x1e, 0xbf, 0x16, 0xa3, + 0x9e, 0x9c, 0xa4, 0xa2, 0x9f, 0x7b, 0x72, 0x72, 0x77, 0x78, 0x74, 0x73, + 0x77, 0x9e, 0xa4, 0x1e, 0xe, 0xf8, 0x1, 0x8b, 0xf7, 0xd, 0xc6, 0xf7, + 0xc, 0x98, 0xf7, 0xd, 0xf7, 0x39, 0xf7, 0xb, 0x1, 0x90, 0x16, 0xf7, + 0x2c, 0x6, 0xf1, 0xf7, 0x48, 0x5, 0xf7, 0x83, 0x6, 0x66, 0xfb, 0x48, + 0x5, 0xf8, 0x99, 0x50, 0xa, 0xfc, 0x10, 0x6, 0xb3, 0xf7, 0x54, 0x5, + 0xf7, 0xdd, 0x50, 0xa, 0xfb, 0xdd, 0x6, 0xaf, 0xf7, 0x39, 0x5, 0xf7, + 0xf3, 0x6, 0xa4, 0xf7, 0xb, 0x5, 0xfd, 0x39, 0x6, 0x2c, 0xfc, 0x36, + 0x15, 0xf7, 0x3e, 0xf7, 0xbf, 0x5, 0xe2, 0x6, 0x4d, 0xfb, 0xbf, 0x5, + 0xe, 0xe2, 0xfb, 0x63, 0x76, 0xf7, 0x27, 0xf7, 0x4b, 0xfb, 0x11, 0xf7, + 0x11, 0xf8, 0x90, 0xf7, 0x13, 0x12, 0xf6, 0xf7, 0x2c, 0xf7, 0x38, 0xed, + 0x13, 0xbc, 0xf7, 0x88, 0xfb, 0x36, 0x15, 0x70, 0x51, 0x5, 0x83, 0xbe, + 0xc7, 0x8b, 0x93, 0x1b, 0xf1, 0xde, 0xaa, 0xd9, 0xc6, 0x5b, 0xa7, 0x51, + 0x91, 0x1f, 0x8d, 0x7, 0xf7, 0x61, 0x92, 0xe6, 0xf7, 0x23, 0xb1, 0xf3, + 0xfb, 0x2f, 0xa2, 0x18, 0xfb, 0x9, 0x64, 0x37, 0x69, 0x4e, 0x1b, 0x27, + 0x58, 0xe6, 0xef, 0xf7, 0xb, 0x80, 0xa, 0x68, 0x92, 0x1f, 0xf7, 0x28, + 0x99, 0x5, 0xf7, 0x3e, 0x76, 0xfb, 0x15, 0xce, 0xfb, 0x1c, 0x1b, 0xfb, + 0x84, 0xfb, 0x30, 0xfb, 0x5e, 0xfb, 0x86, 0xfb, 0x31, 0xcd, 0xfb, 0x33, + 0xf7, 0x67, 0x1f, 0x8c, 0x87, 0x89, 0x87, 0x1b, 0x5b, 0x82, 0x73, 0x56, + 0x5, 0x13, 0xdc, 0x8e, 0x99, 0x9d, 0x8e, 0xa0, 0x1b, 0xbd, 0x9a, 0x77, + 0x79, 0x5c, 0x2e, 0x8b, 0x7c, 0x7e, 0x5c, 0x8e, 0x8c, 0x80, 0x1f, 0xe, + 0x41, 0xa, 0xbb, 0x95, 0xa, 0xd7, 0x16, 0x2c, 0xa, 0xf7, 0xa2, 0xbb, + 0x15, 0xea, 0x6, 0x4d, 0xf7, 0x2b, 0x5b, 0xa, 0xe, 0x41, 0xa, 0xf7, + 0x5b, 0x77, 0x1, 0xd7, 0x16, 0x2c, 0xa, 0xf7, 0x4f, 0xbb, 0x15, 0xe9, + 0x6, 0xf7, 0x32, 0xf7, 0x2b, 0x53, 0xa, 0xe, 0x41, 0xa, 0xbb, 0x95, + 0xa, 0xd7, 0xf9, 0x3d, 0x3, 0xd7, 0x16, 0x2c, 0xa, 0xe4, 0xbb, 0x15, + 0xf7, 0x9, 0x6, 0xe0, 0xe4, 0xb1, 0x32, 0x5, 0xec, 0x6, 0x4f, 0xf7, + 0x2b, 0x66, 0xa, 0xe, 0xab, 0x8b, 0xf7, 0xe, 0xf7, 0x5c, 0xf7, 0x10, + 0xf7, 0x3c, 0xf7, 0xf, 0x1, 0xf7, 0xec, 0xf9, 0xad, 0x15, 0xf7, 0xd, + 0x5f, 0xa, 0xf7, 0xc, 0x4f, 0xa, 0xfb, 0xc, 0x6, 0xfc, 0x87, 0xfe, + 0x27, 0x15, 0x2c, 0xa, 0xe, 0x4e, 0xa, 0xd0, 0x95, 0xa, 0xf7, 0xbd, + 0xf9, 0xa5, 0x15, 0xe5, 0x6, 0x50, 0x67, 0xa, 0xfb, 0x14, 0x6, 0xfb, + 0x1c, 0xfe, 0x3c, 0x15, 0xf7, 0x3f, 0xf9, 0x74, 0x5, 0x5e, 0xa, 0xfb, + 0x40, 0xfd, 0x74, 0x5, 0xe, 0x4e, 0xa, 0xf7, 0x70, 0x77, 0x1, 0xcb, + 0x16, 0x46, 0xa, 0x90, 0xbc, 0x15, 0xf6, 0x6, 0xf7, 0x49, 0x67, 0xa, + 0xfb, 0x3f, 0x6, 0xe, 0x4e, 0xa, 0xd0, 0x95, 0xa, 0xf7, 0xf, 0xf9, + 0xa5, 0x15, 0xf7, 0x11, 0x6, 0xe6, 0xe4, 0xb4, 0x32, 0x5, 0xf3, 0x6, + 0x4b, 0xf7, 0x2b, 0x3d, 0xa, 0xfb, 0x6b, 0xfe, 0x3c, 0x15, 0x46, 0xa, + 0xe, 0x4e, 0xa, 0xd8, 0xf7, 0xe, 0x1, 0xf7, 0x1f, 0xf9, 0xad, 0x6a, + 0xa, 0xf7, 0x4b, 0xfb, 0xe, 0x6a, 0xa, 0xfb, 0xc8, 0xfe, 0x27, 0x15, + 0x46, 0xa, 0xe, 0x57, 0xa, 0xd3, 0x16, 0xf7, 0x99, 0x6, 0xf7, 0x7e, + 0xf7, 0x66, 0xf7, 0x22, 0xf7, 0xa7, 0xf7, 0x71, 0xfb, 0x1a, 0xdb, 0xfb, + 0x6c, 0x1f, 0xfb, 0x59, 0x6, 0x49, 0xfb, 0xc3, 0x5, 0x3d, 0x6, 0x73, + 0xfb, 0x4, 0x5, 0xd8, 0x6, 0xf7, 0x5, 0xfb, 0x4d, 0x15, 0xb2, 0xf7, + 0x4d, 0x5, 0xf7, 0x32, 0x6, 0xa3, 0xf7, 0x4, 0x5, 0xfb, 0x31, 0x6, + 0xb3, 0xf7, 0x4d, 0x5, 0xe1, 0x6, 0xd9, 0xf5, 0x84, 0xfb, 0x44, 0xfb, + 0x8a, 0xfb, 0x15, 0x56, 0xfb, 0x3d, 0x1f, 0xe, 0x68, 0xa, 0xf9, 0x73, + 0x77, 0x1, 0x8a, 0xa, 0xf2, 0xf8, 0x82, 0x5c, 0xa, 0xf7, 0x59, 0xfc, + 0x82, 0x5, 0x9b, 0xa, 0xf7, 0x2d, 0xf9, 0x73, 0x3d, 0xa, 0x25, 0xfc, + 0x80, 0x51, 0xa, 0xfb, 0x5a, 0xf8, 0x80, 0x3d, 0xa, 0xf7, 0x12, 0xca, + 0x15, 0xca, 0x6, 0x8f, 0x99, 0x95, 0xaa, 0xaa, 0x89, 0xab, 0x89, 0x9e, + 0x81, 0x9c, 0x81, 0x9e, 0x81, 0x9b, 0x81, 0xab, 0x8d, 0xba, 0x8d, 0xb6, + 0xb2, 0x97, 0xdc, 0x8, 0x4a, 0x63, 0xa, 0x77, 0x78, 0x93, 0x94, 0x76, + 0x1f, 0x96, 0x73, 0x70, 0x96, 0x67, 0x1b, 0x47, 0x75, 0x43, 0x58, 0x82, + 0x1f, 0xe, 0x49, 0xa, 0xf8, 0x9e, 0xf9, 0xa4, 0x75, 0xa, 0xfb, 0xca, + 0x2b, 0xa, 0xf7, 0x23, 0x78, 0xf7, 0x14, 0xf9, 0xcf, 0x77, 0x36, 0xa, + 0xf8, 0x54, 0xf9, 0xa4, 0x15, 0xea, 0x6, 0xf7, 0x37, 0x5d, 0xa, 0xfb, + 0x2e, 0x6, 0xfc, 0x51, 0x2b, 0xa, 0x49, 0xa, 0xf7, 0xef, 0xf9, 0xa4, + 0x15, 0xf7, 0xb, 0x6, 0xe2, 0xe5, 0xb3, 0x31, 0x5, 0xee, 0x6, 0x4e, + 0xf7, 0x2c, 0x91, 0xa, 0xfc, 0x19, 0x2b, 0xa, 0xf7, 0x23, 0x78, 0xf7, + 0x13, 0xf9, 0x70, 0xde, 0x36, 0xa, 0xf8, 0xa, 0xf9, 0xb1, 0x15, 0xcb, + 0x6, 0x99, 0x8f, 0x95, 0xa8, 0xa9, 0x1b, 0xac, 0xa0, 0x82, 0x81, 0x9f, + 0x1f, 0x80, 0x9e, 0x9d, 0x81, 0xa4, 0x1b, 0xbb, 0xb5, 0xb4, 0xdd, 0x97, + 0x1f, 0x4a, 0x63, 0xa, 0x76, 0x79, 0x94, 0x94, 0x76, 0x1f, 0x96, 0x74, + 0x70, 0x95, 0x66, 0x1b, 0x47, 0x75, 0x43, 0x57, 0x81, 0x1f, 0xfb, 0x9f, + 0xfc, 0x97, 0x21, 0xa, 0xe, 0x8c, 0xa, 0xf8, 0x8f, 0xf7, 0x12, 0x36, + 0xa, 0xf6, 0xf7, 0xae, 0x21, 0xa, 0xf7, 0xc, 0xf8, 0x92, 0x15, 0xf7, + 0xf, 0x71, 0xa, 0xfb, 0x10, 0x6, 0xf7, 0x4d, 0xfb, 0xf, 0x15, 0xf7, + 0x10, 0x71, 0xa, 0xfb, 0x10, 0x6, 0xe, 0x58, 0xa1, 0x76, 0xf8, 0x8c, + 0x77, 0x1, 0xc5, 0xec, 0x15, 0xf7, 0x0, 0x2c, 0xf7, 0x46, 0xf7, 0x31, + 0xf7, 0x49, 0xfb, 0x32, 0xf7, 0x2, 0xec, 0xfb, 0x49, 0xf7, 0x31, 0xf7, + 0x47, 0xf7, 0x2f, 0x20, 0xea, 0xfb, 0x47, 0xfb, 0x31, 0xfb, 0x48, 0xf7, + 0x31, 0xfb, 0x2, 0x2b, 0xf7, 0x49, 0xfb, 0x30, 0x5, 0xe, 0xf7, 0x23, + 0x85, 0x76, 0xf9, 0x98, 0x77, 0x1, 0xe0, 0xf7, 0xb, 0xf8, 0x21, 0xf7, + 0x3, 0x3, 0xf8, 0xea, 0xf8, 0x9c, 0x15, 0x98, 0x76, 0x94, 0x55, 0x65, + 0x1a, 0xfb, 0xf, 0x23, 0xfb, 0x2b, 0xfb, 0x32, 0x5a, 0x65, 0x8b, 0x94, + 0x7b, 0x1e, 0x4f, 0xca, 0x15, 0x80, 0x97, 0x82, 0xb2, 0xb6, 0x1a, 0xf7, + 0x14, 0xf3, 0xf7, 0x3b, 0xf7, 0x31, 0xc3, 0xb4, 0x89, 0x84, 0x93, 0x1e, + 0xfc, 0x93, 0xfc, 0xc4, 0x15, 0xd1, 0x57, 0xd7, 0xde, 0x5, 0x6c, 0xc0, + 0xc5, 0x84, 0xc0, 0x1b, 0xf7, 0xac, 0xf7, 0x3, 0xf7, 0x62, 0xf7, 0x4b, + 0xc4, 0x87, 0xe7, 0x64, 0xc7, 0x1f, 0xd3, 0xd8, 0x46, 0xbf, 0x44, 0x3e, + 0x5, 0xa8, 0x58, 0x4e, 0x97, 0x4e, 0x1b, 0xfb, 0xc1, 0x31, 0xfb, 0x8c, + 0xfb, 0x36, 0x59, 0x95, 0x3b, 0xb4, 0x4f, 0x1f, 0xe, 0x2d, 0xa, 0xf7, + 0x30, 0xbc, 0x15, 0xed, 0x6, 0x4a, 0xf7, 0x2c, 0x81, 0xa, 0x2d, 0xa, + 0xb6, 0xc1, 0x60, 0xa, 0xe2, 0x78, 0xf7, 0x14, 0xf9, 0x3c, 0xf7, 0x27, + 0x24, 0xa, 0x68, 0xc1, 0x45, 0xa, 0xe2, 0x78, 0xf7, 0x14, 0xf9, 0x6, + 0x77, 0xdb, 0xf7, 0xc, 0x24, 0xa, 0x85, 0xc7, 0x3a, 0xa, 0xab, 0xa0, + 0x76, 0xf9, 0x74, 0x77, 0xf7, 0x70, 0x77, 0x1, 0x64, 0xa, 0xf7, 0xa5, + 0xf7, 0xcc, 0xf8, 0x63, 0x43, 0xa, 0xfb, 0x5d, 0xfb, 0xcf, 0xfb, 0x10, + 0xf7, 0xcf, 0x5a, 0xa, 0xf7, 0x51, 0xfc, 0x55, 0x5, 0xcb, 0xf8, 0x86, + 0x15, 0xe4, 0x6, 0xf7, 0x2a, 0xf7, 0x2b, 0x92, 0xa, 0xe, 0xab, 0xa0, + 0x76, 0xf7, 0x1d, 0xf7, 0xc, 0xf7, 0x60, 0xf7, 0xc, 0xf7, 0x1d, 0x77, + 0x1, 0xf8, 0xcc, 0xf7, 0x28, 0x3, 0xd7, 0x16, 0xf7, 0x29, 0x6, 0xa8, + 0xf7, 0x1d, 0x5, 0xeb, 0x6, 0xf7, 0x52, 0xf7, 0x44, 0xba, 0xf7, 0x61, + 0xf7, 0x48, 0xfb, 0x3e, 0x97, 0x57, 0x1f, 0xfb, 0x27, 0x6, 0xa8, 0xf7, + 0x1d, 0x53, 0xa, 0xbf, 0xfc, 0x61, 0x15, 0xb7, 0xf7, 0x60, 0x5, 0xf6, + 0x6, 0xd7, 0xc9, 0x8d, 0x41, 0xfb, 0xc, 0xfb, 0x1a, 0x7f, 0xfb, 0x1, + 0x1f, 0xe, 0x73, 0x7d, 0xf7, 0x8, 0x38, 0x76, 0xf9, 0x7, 0xf5, 0x12, + 0xf8, 0x94, 0xf7, 0x25, 0x13, 0x70, 0xd0, 0x89, 0x15, 0xf7, 0x2e, 0x6, + 0xf2, 0xf8, 0x56, 0x5, 0xe1, 0x9e, 0xa0, 0xe6, 0xe2, 0x1b, 0xb4, 0x97, + 0x7b, 0x74, 0x73, 0x77, 0x6d, 0x79, 0x77, 0x1f, 0x61, 0x5b, 0x79, 0x61, + 0x63, 0x1a, 0x5e, 0xa4, 0x5e, 0xb2, 0x55, 0x1e, 0x9c, 0x72, 0xa2, 0x65, + 0x6e, 0x1a, 0x13, 0xb0, 0x72, 0x7c, 0x78, 0x5c, 0x65, 0x7c, 0x9f, 0x9b, + 0x7e, 0x1e, 0xfb, 0x1, 0x53, 0x5, 0x66, 0xa7, 0xcf, 0x50, 0xef, 0x1b, + 0xf7, 0x1c, 0xbd, 0xd1, 0xdc, 0xc1, 0x73, 0xc7, 0x68, 0xb6, 0x1f, 0x6a, + 0xb2, 0x7b, 0xa0, 0xa3, 0x1a, 0xa2, 0x98, 0x9b, 0xa0, 0xaa, 0x1e, 0xac, + 0xbb, 0xaf, 0xcf, 0xc4, 0x1a, 0xc4, 0x5c, 0xc0, 0xfb, 0x1a, 0xfb, 0x63, + 0x5a, 0xfb, 0x0, 0xfb, 0x43, 0x61, 0x1e, 0xe, 0x42, 0xa, 0xf8, 0x8c, + 0xf7, 0x2c, 0x76, 0xa, 0xf8, 0x1a, 0x89, 0x20, 0xa, 0x13, 0xb0, 0x2a, + 0xa, 0x70, 0xf7, 0xf2, 0x15, 0xf2, 0x6, 0x48, 0xf7, 0x2c, 0x93, 0xa, + 0xe, 0x42, 0xa, 0xf7, 0xf1, 0xf3, 0xf7, 0x5f, 0x77, 0x12, 0xc2, 0xf7, + 0x2b, 0x13, 0x78, 0xf7, 0xe8, 0xf8, 0xea, 0x15, 0xf5, 0x6, 0xf7, 0x49, + 0x5d, 0xa, 0xfb, 0x3e, 0x6, 0x48, 0xfd, 0x84, 0x20, 0xa, 0x13, 0xb8, + 0x2e, 0xa, 0x42, 0xa, 0xf8, 0x8c, 0xf7, 0x2c, 0x76, 0xa, 0xf7, 0x62, + 0xf8, 0xea, 0x15, 0xf7, 0x11, 0x6, 0xe7, 0xe5, 0xb4, 0x31, 0x5, 0xf3, + 0x6, 0x4b, 0xf7, 0x2c, 0x92, 0xa, 0xa7, 0xfd, 0x84, 0x20, 0xa, 0x13, + 0xb0, 0x2e, 0xa, 0x42, 0xa, 0xf8, 0xc5, 0xdd, 0x89, 0x77, 0x12, 0xc2, + 0xf7, 0x2b, 0x13, 0xa8, 0xf7, 0x7f, 0xf8, 0xf7, 0x15, 0xd2, 0x6, 0x90, + 0x9a, 0x95, 0xa7, 0xad, 0x8c, 0xaa, 0x8c, 0xa6, 0x7f, 0xa6, 0x80, 0x8, + 0x82, 0xa2, 0xa0, 0x82, 0xa1, 0x1b, 0xbf, 0xba, 0xb4, 0xdc, 0x99, 0x1f, + 0x43, 0x6, 0x72, 0x83, 0x83, 0x7b, 0x75, 0x1b, 0x77, 0x79, 0x91, 0x93, + 0x76, 0x1f, 0x13, 0x58, 0x97, 0x70, 0x6b, 0x98, 0x5e, 0x1b, 0x40, 0x72, + 0x43, 0x57, 0x80, 0x1f, 0xf7, 0x2f, 0xfc, 0xf9, 0x20, 0xa, 0x13, 0xa8, + 0x2e, 0xa, 0x3c, 0x7d, 0xf6, 0x2c, 0xea, 0x12, 0xc2, 0xf7, 0x22, 0x13, + 0x60, 0xf7, 0x6d, 0xf8, 0xf3, 0x6d, 0xa, 0xf7, 0x56, 0xfb, 0xe, 0x6d, + 0xa, 0x40, 0xfd, 0x6f, 0x20, 0xa, 0x13, 0xa0, 0x2e, 0xa, 0x42, 0xa, + 0xf7, 0xba, 0xf7, 0x33, 0x23, 0xf3, 0xad, 0xf7, 0x57, 0x56, 0x77, 0x12, + 0xc2, 0xf7, 0x23, 0x13, 0xaa, 0xf7, 0xb3, 0xf9, 0x3a, 0x15, 0x56, 0xba, + 0x5f, 0xc4, 0xc3, 0xb9, 0xb5, 0xc2, 0xc2, 0x5d, 0xb6, 0x53, 0x4f, 0x5f, + 0x60, 0x54, 0x1e, 0xc3, 0x16, 0x13, 0x56, 0xa4, 0xa0, 0x9f, 0xa6, 0xa4, + 0xa0, 0x79, 0x70, 0x73, 0x76, 0x77, 0x72, 0x70, 0x76, 0x9f, 0xa3, 0x1e, + 0xba, 0xfd, 0x3c, 0x32, 0xa, 0x99, 0xca, 0x9a, 0xc0, 0x1e, 0x99, 0xa, + 0xab, 0xb1, 0x1a, 0xab, 0x7b, 0xf7, 0x4, 0xfb, 0x59, 0x27, 0xfb, 0x4, + 0x6b, 0xfb, 0xd, 0x60, 0x1e, 0xf7, 0x28, 0x7f, 0x5, 0xba, 0x98, 0xb1, + 0x99, 0xb8, 0x1b, 0xcf, 0xa6, 0x5b, 0x54, 0x71, 0x1f, 0x6c, 0x80, 0x55, + 0x88, 0x4f, 0x84, 0x8, 0x42, 0x87, 0xfb, 0x2f, 0x7d, 0xfb, 0x33, 0x1a, + 0x28, 0xd6, 0x52, 0xe1, 0x1e, 0x13, 0xaa, 0xba, 0xcb, 0x9d, 0xc2, 0xbf, + 0x1f, 0x8e, 0x70, 0x8b, 0x82, 0x93, 0x72, 0x8, 0x99, 0xf7, 0x7b, 0x15, + 0x31, 0xa, 0x91, 0xe6, 0x98, 0x1f, 0xe, 0xf7, 0x92, 0x7d, 0xf7, 0x1, + 0xf7, 0x11, 0xe3, 0xf7, 0x1b, 0xf2, 0x1, 0xc3, 0xf7, 0x17, 0xf8, 0xef, + 0xf7, 0x19, 0x3, 0xf7, 0x7, 0xf8, 0x1e, 0x15, 0xf7, 0x1f, 0x7d, 0x5, + 0xa4, 0x94, 0x99, 0xb1, 0xd0, 0x1b, 0xce, 0xa2, 0x60, 0x50, 0x7f, 0x1f, + 0x7b, 0x86, 0x7c, 0x84, 0xfb, 0x0, 0x82, 0x8, 0x35, 0x83, 0xfb, 0x23, + 0x86, 0xfb, 0x31, 0x1a, 0x28, 0xd3, 0x4a, 0xec, 0xf7, 0x15, 0xd0, 0xe7, + 0xac, 0xa3, 0x1e, 0x6e, 0x99, 0xb8, 0x2b, 0xf7, 0x22, 0x1b, 0xf7, 0x36, + 0xcf, 0xf7, 0x11, 0xab, 0x9e, 0x1f, 0xfb, 0x17, 0x9f, 0x5, 0x46, 0x64, + 0x50, 0x8b, 0x7d, 0x1b, 0x4f, 0x5a, 0xbb, 0xd9, 0x88, 0x1f, 0xf8, 0x7, + 0x6, 0x94, 0xb4, 0x8c, 0xb0, 0x9a, 0x1a, 0xf7, 0x1f, 0x37, 0xe9, 0xfb, + 0x1b, 0x64, 0x3f, 0x85, 0x4e, 0x4b, 0x1e, 0x9f, 0x7f, 0x6d, 0xba, 0xfb, + 0x12, 0x1b, 0xfb, 0x1b, 0x39, 0x4d, 0x31, 0x72, 0x1f, 0xf8, 0x4a, 0x35, + 0x15, 0xf7, 0x5, 0xa4, 0xd7, 0xa1, 0xb1, 0x1b, 0xcb, 0xb3, 0x5b, 0x34, + 0x85, 0x1f, 0xfc, 0x15, 0x52, 0x15, 0x43, 0x7c, 0x56, 0x37, 0x3a, 0x1b, + 0x55, 0x7c, 0xab, 0xa2, 0xbb, 0xbf, 0xad, 0xf7, 0x3a, 0x9e, 0x1f, 0xe, + 0x3c, 0xfb, 0x63, 0x76, 0xf9, 0x2c, 0xf7, 0x2, 0x1, 0xda, 0xf7, 0x23, + 0xe4, 0xe2, 0x3, 0xf7, 0x8a, 0x67, 0x15, 0x72, 0x55, 0x5, 0xa0, 0x8e, + 0xd0, 0x9b, 0x5d, 0x1a, 0x56, 0x2c, 0x8d, 0x61, 0x8c, 0x1e, 0x71, 0x52, + 0x5, 0x88, 0x9e, 0xa4, 0x8a, 0x9e, 0x1b, 0xa6, 0xf7, 0x34, 0x8b, 0xf7, + 0x3, 0x97, 0x89, 0xc7, 0x3c, 0x98, 0x1f, 0x8d, 0x7, 0xa7, 0x8c, 0xbc, + 0x90, 0xbd, 0xad, 0xa3, 0x9a, 0xc5, 0xb6, 0xae, 0xed, 0xfb, 0x20, 0xa3, + 0x18, 0x33, 0x6c, 0x50, 0x7c, 0x6f, 0x1b, 0x64, 0x61, 0xb1, 0xd2, 0xe3, + 0xb4, 0xf7, 0x2c, 0xf7, 0x4, 0xd7, 0x93, 0x46, 0x77, 0x8e, 0x1f, 0xf7, + 0x1d, 0x9a, 0x5, 0xe3, 0x84, 0x4f, 0xeb, 0xfb, 0x28, 0x1b, 0xfb, 0x3f, + 0xfb, 0x1a, 0xfb, 0x1e, 0xfb, 0x68, 0x22, 0xc9, 0x2d, 0xdd, 0x7a, 0x1f, + 0x89, 0x96, 0xb2, 0x83, 0x88, 0x1b, 0x89, 0x8a, 0x7f, 0x89, 0x81, 0x88, + 0x8, 0xe, 0x3c, 0xf7, 0x71, 0xe3, 0xf7, 0xb5, 0xf7, 0x2c, 0x1, 0xd1, + 0xf7, 0x21, 0xf7, 0x8c, 0xf7, 0x1a, 0x3, 0xf7, 0x67, 0xf7, 0x71, 0x23, + 0xa, 0x35, 0xf7, 0xb5, 0x15, 0xef, 0x6, 0x4a, 0xf7, 0x2c, 0x47, 0xa, + 0xe, 0x3c, 0xf7, 0x71, 0xe3, 0xf8, 0x4d, 0x77, 0x1, 0xce, 0xf7, 0x2c, + 0xf7, 0x7e, 0xf7, 0x23, 0x3, 0xf7, 0xd8, 0xf8, 0xea, 0x15, 0xf3, 0x6, + 0xf7, 0x46, 0x5d, 0xa, 0xfb, 0x3c, 0x6, 0xfb, 0x77, 0xfc, 0xa5, 0x23, + 0xa, 0xe, 0x3c, 0x7d, 0xf2, 0xf7, 0x18, 0xe3, 0xf7, 0xb5, 0xf7, 0x2c, + 0x7d, 0xa, 0xf7, 0x4c, 0xf8, 0xea, 0x8f, 0xa, 0xe5, 0xe5, 0xb3, 0x31, + 0x5, 0xf1, 0x6, 0x4c, 0xf7, 0x2c, 0x54, 0xa, 0xfb, 0x12, 0xfc, 0xa5, + 0x23, 0xa, 0xe, 0x3c, 0x7d, 0xf1, 0xf7, 0x17, 0xe1, 0x1, 0xd1, 0xf7, + 0x23, 0xf7, 0x8b, 0xf7, 0x1a, 0x3, 0xf7, 0x6b, 0xf8, 0xf3, 0x15, 0xf7, + 0x13, 0x6e, 0xa, 0xfb, 0x13, 0x6, 0xf7, 0x52, 0xfb, 0xe, 0x15, 0xf7, + 0x13, 0x6e, 0xa, 0xfb, 0x12, 0x6, 0xfb, 0x8b, 0xfc, 0x90, 0x23, 0xa, + 0xe, 0x48, 0xa, 0xf8, 0xeb, 0x95, 0xa, 0xd0, 0x16, 0x3c, 0xa, 0xc7, + 0xd0, 0x15, 0xe7, 0x6, 0x4f, 0x67, 0xa, 0xfb, 0x18, 0x6, 0xe, 0x48, + 0xa, 0xf9, 0x82, 0x77, 0x1, 0xf7, 0x4a, 0xf8, 0xeb, 0x15, 0xf5, 0x6, + 0xf7, 0x48, 0x67, 0xa, 0xfb, 0x3e, 0x6, 0xfb, 0x79, 0xfd, 0x82, 0x15, + 0x3c, 0xa, 0xe, 0x48, 0xa, 0xf8, 0xeb, 0x95, 0xa, 0xc9, 0xf8, 0xeb, + 0x15, 0xf7, 0x15, 0x6, 0xe9, 0xe4, 0xb5, 0x32, 0x5, 0xf6, 0x6, 0x49, + 0x67, 0xa, 0xfb, 0x25, 0x6, 0xfb, 0x2e, 0xfd, 0x82, 0x15, 0x3c, 0xa, + 0xe, 0x48, 0xa, 0xf8, 0xf3, 0xf7, 0xe, 0x1, 0xe6, 0xf8, 0xf3, 0x15, + 0xf7, 0xe, 0x5f, 0xa, 0xf7, 0xe, 0x6, 0xa4, 0xf7, 0xe, 0x5, 0xfb, + 0xd, 0x6, 0xfb, 0x93, 0xfd, 0x6d, 0x15, 0x3c, 0xa, 0xe, 0x73, 0x7d, + 0xf7, 0x3, 0xf7, 0xd8, 0xf7, 0x4, 0xf7, 0x60, 0x77, 0x1, 0xdd, 0xf7, + 0x28, 0xf7, 0xae, 0xf7, 0x2f, 0x3, 0xf7, 0xe7, 0xf8, 0xcf, 0x15, 0xf7, + 0x13, 0xb6, 0xac, 0x52, 0x98, 0x5a, 0x93, 0x68, 0x19, 0x88, 0x89, 0x5, + 0xa4, 0x76, 0x67, 0xb0, 0x32, 0x1b, 0xfb, 0x42, 0xfb, 0x7, 0xfb, 0x26, + 0xfb, 0x36, 0x26, 0xc2, 0xfb, 0x1e, 0xf7, 0x68, 0xf7, 0x87, 0xd6, 0xf7, + 0x4e, 0xf7, 0x18, 0xf7, 0x1e, 0x68, 0xf7, 0x6, 0x53, 0xed, 0x1f, 0xe9, + 0xad, 0x7a, 0xbc, 0x20, 0x65, 0x81, 0x9b, 0x87, 0x91, 0x7f, 0x9b, 0x19, + 0x9a, 0xa, 0xae, 0x64, 0x93, 0x82, 0x9c, 0x6f, 0xfb, 0x9, 0x63, 0x18, + 0x30, 0xfc, 0x20, 0x15, 0xdd, 0xc2, 0xf7, 0x6, 0xf7, 0x6, 0xbe, 0xc9, + 0x6c, 0x35, 0x57, 0x5f, 0xfb, 0x2f, 0xfb, 0x10, 0x3c, 0x68, 0xd1, 0xc5, + 0x1e, 0xe, 0x84, 0xa, 0xf8, 0xf8, 0xf7, 0x11, 0x39, 0xdd, 0x89, 0x77, + 0x12, 0xf8, 0x84, 0xf7, 0x2a, 0x13, 0xc8, 0xcc, 0x16, 0xf7, 0x29, 0x6, + 0xbb, 0xf7, 0x6f, 0x9d, 0xdc, 0x91, 0xad, 0xa7, 0xb0, 0x19, 0xad, 0xa7, + 0xb9, 0xb0, 0xb9, 0x1b, 0xba, 0x9a, 0x71, 0x6a, 0x70, 0x85, 0x6c, 0x85, + 0x75, 0x1f, 0x49, 0xfb, 0xc3, 0x5, 0xf7, 0x29, 0x6, 0xcd, 0xf7, 0xc2, + 0x5, 0x94, 0xb2, 0x8f, 0xb8, 0xb4, 0x1a, 0xc1, 0x65, 0xcb, 0x22, 0x32, + 0x4d, 0x5f, 0x65, 0x60, 0x1e, 0x89, 0x8d, 0x99, 0xce, 0x5, 0xfb, 0x20, + 0x6, 0xe3, 0xdb, 0x15, 0xcd, 0x6, 0x13, 0xa8, 0x90, 0x99, 0x94, 0xa7, + 0xab, 0x8c, 0xa6, 0x8c, 0xa0, 0x80, 0xa1, 0x7f, 0xa1, 0x81, 0xa0, 0x82, + 0xa6, 0x8c, 0xbc, 0x8e, 0xb7, 0xb1, 0x98, 0xdc, 0x8, 0x48, 0x6, 0x72, + 0x83, 0x84, 0x7b, 0x77, 0x1b, 0x78, 0x78, 0x91, 0x93, 0x78, 0x1f, 0x13, + 0x98, 0x97, 0x70, 0x6d, 0x98, 0x65, 0x1b, 0x13, 0xc8, 0x44, 0x74, 0x43, + 0x58, 0x81, 0x1f, 0xe, 0x4c, 0xa, 0xdd, 0xf7, 0x70, 0x22, 0xa, 0xf7, + 0x4c, 0xf8, 0xe, 0x15, 0xee, 0x6, 0x4b, 0xf7, 0x2c, 0x65, 0xa, 0x73, + 0x7d, 0xf7, 0x1, 0xf9, 0x23, 0x77, 0x1, 0xdd, 0xf7, 0x28, 0xf7, 0x9d, + 0xf7, 0x28, 0x3, 0xf7, 0xfe, 0xf8, 0xea, 0x15, 0xee, 0x6, 0xf7, 0x3d, + 0x5d, 0xa, 0xfb, 0x33, 0x6, 0xfc, 0x19, 0xfc, 0xa6, 0x22, 0xa, 0xe, + 0x4c, 0xa, 0xf7, 0x73, 0xf8, 0xea, 0x15, 0xf7, 0xd, 0x6, 0xe4, 0xe5, + 0xb3, 0x31, 0x5, 0xf0, 0x6, 0x4c, 0xf7, 0x2c, 0x5b, 0xa, 0xfb, 0xb9, + 0xfc, 0xa6, 0x22, 0xa, 0xe, 0x73, 0x7d, 0xf7, 0x1, 0xf8, 0xc4, 0xdd, + 0x89, 0x77, 0x12, 0xdd, 0xf7, 0x26, 0xf7, 0xa4, 0xf7, 0x26, 0x13, 0xd8, + 0xf7, 0x9b, 0xf8, 0xf7, 0x15, 0xcc, 0x6, 0x8f, 0x9a, 0x94, 0xa7, 0xab, + 0x8c, 0xa4, 0x8c, 0xa5, 0x7c, 0xa7, 0x80, 0x9f, 0x82, 0xa0, 0x84, 0x9e, + 0x8c, 0xbb, 0x8e, 0xb6, 0xb1, 0x98, 0xdc, 0x8, 0x48, 0x63, 0xa, 0x77, + 0x78, 0x92, 0x93, 0x76, 0x1f, 0x13, 0xb8, 0x97, 0x70, 0x6d, 0x97, 0x6a, + 0x1b, 0x45, 0x74, 0x43, 0x57, 0x82, 0x1f, 0xfb, 0x49, 0xfc, 0x1b, 0x22, + 0xa, 0xe, 0x73, 0x7d, 0xf7, 0x0, 0x3f, 0xa, 0xf7, 0x91, 0xf8, 0xf3, + 0x15, 0xf7, 0x12, 0x6e, 0xa, 0xfb, 0x12, 0x6, 0xf7, 0x50, 0xfb, 0xe, + 0x15, 0xf7, 0x12, 0x6e, 0xa, 0xfb, 0x11, 0x6, 0xfc, 0x30, 0xfc, 0x91, + 0x22, 0xa, 0xe, 0x58, 0xf7, 0x4d, 0xf7, 0x1d, 0x1, 0xf7, 0xa6, 0xf7, + 0x24, 0x3, 0xdd, 0xf7, 0x4d, 0x15, 0xf8, 0xa4, 0xf7, 0x1d, 0xfc, 0xa4, + 0x6, 0xf7, 0x54, 0xda, 0x15, 0xf7, 0x24, 0xf7, 0x27, 0xfb, 0x24, 0x6, + 0xfc, 0xe2, 0x4, 0xf7, 0x24, 0xf7, 0x25, 0xfb, 0x24, 0x6, 0xe, 0xfb, + 0x8, 0x83, 0x76, 0xb1, 0xeb, 0xf7, 0xd5, 0xeb, 0xb1, 0x77, 0x1, 0xd3, + 0xf7, 0xb, 0xf7, 0x68, 0xf7, 0xc, 0x3, 0x9e, 0x9a, 0x15, 0xc2, 0x5f, + 0xcb, 0xce, 0x5, 0x70, 0xc3, 0xc0, 0x89, 0xac, 0x1b, 0xf7, 0x59, 0xeb, + 0xf7, 0x24, 0xf7, 0x28, 0xbf, 0x7b, 0xd0, 0x73, 0xa8, 0x1f, 0xca, 0xcd, + 0x52, 0xb6, 0x4b, 0x49, 0x5, 0xa6, 0x56, 0x4d, 0x8c, 0x72, 0x1b, 0xfb, + 0x97, 0x69, 0xfb, 0x6c, 0x32, 0x48, 0x9b, 0x59, 0xa2, 0x78, 0x1f, 0xe3, + 0xe7, 0x15, 0x88, 0x93, 0x86, 0x98, 0xa2, 0x1a, 0xd7, 0xc2, 0xf7, 0x19, + 0xf7, 0x7, 0xb0, 0x9e, 0x80, 0x87, 0x94, 0x1e, 0xfb, 0x47, 0xfb, 0xb8, + 0x15, 0xf7, 0x76, 0xf7, 0x82, 0x5, 0x8e, 0x80, 0x92, 0x73, 0x76, 0x1a, + 0x49, 0x5d, 0xfb, 0x16, 0xfb, 0x13, 0x67, 0x7b, 0x94, 0x90, 0x80, 0x1e, + 0xe, 0x59, 0xa, 0xf8, 0x91, 0xf7, 0x2c, 0x29, 0xa, 0x79, 0xf8, 0xa5, + 0x75, 0xa, 0xe, 0x59, 0xa, 0xf9, 0x29, 0x77, 0x29, 0xa, 0x21, 0xf8, + 0xaa, 0x60, 0xa, 0x59, 0xa, 0xf8, 0x96, 0xf7, 0x27, 0x29, 0xa, 0xfb, + 0x74, 0xf8, 0xaa, 0x45, 0xa, 0x59, 0xa, 0x12, 0x13, 0x40, 0x28, 0xa, + 0x13, 0x80, 0x35, 0xa, 0x13, 0x40, 0xfb, 0x2f, 0xf8, 0xb0, 0x3a, 0xa, + 0x3c, 0xfb, 0x55, 0x76, 0xfa, 0x58, 0x77, 0x1, 0xcb, 0xf8, 0xf6, 0x3, + 0xc2, 0x30, 0x15, 0x7e, 0xfb, 0x0, 0x7e, 0xa, 0xcb, 0xee, 0xc2, 0x1f, + 0xf7, 0xd1, 0xf8, 0xd9, 0x77, 0xa, 0xfc, 0x28, 0x51, 0xa, 0x59, 0xf8, + 0x28, 0x54, 0xa, 0xe5, 0xfc, 0xa4, 0x5, 0x4e, 0x6c, 0xa, 0xf7, 0xa5, + 0xf9, 0x46, 0x15, 0xe7, 0x6, 0xf7, 0x31, 0xf7, 0x2b, 0x94, 0xa, 0xe, + 0x73, 0xfb, 0x4f, 0x76, 0xf7, 0x51, 0xf6, 0xf7, 0xea, 0xf0, 0xf7, 0x4f, + 0x77, 0x1, 0x9d, 0xf7, 0x23, 0xf7, 0xec, 0xf7, 0x20, 0x3, 0xf7, 0x70, + 0xcc, 0x15, 0x3d, 0xbd, 0xd8, 0x85, 0xac, 0x1b, 0xf7, 0x2d, 0xf7, 0x4, + 0xf7, 0x2d, 0xf7, 0x3e, 0xe9, 0x69, 0xf7, 0x19, 0xfb, 0x2b, 0x40, 0x58, + 0x66, 0x79, 0x73, 0x1f, 0xbd, 0xf7, 0x86, 0x47, 0xa, 0xfb, 0x5b, 0xfe, + 0x32, 0x8d, 0xa, 0xed, 0xf8, 0x3d, 0x15, 0xc0, 0xab, 0xf7, 0x34, 0xf7, + 0x5, 0xc1, 0xba, 0x60, 0x38, 0x4a, 0x67, 0xfb, 0x2b, 0xfb, 0x1, 0x6a, + 0x47, 0xa2, 0xf5, 0x1e, 0xe, 0x3c, 0xfb, 0x55, 0x76, 0xf9, 0xca, 0xf7, + 0xd, 0x1, 0xc2, 0x2f, 0x15, 0x7e, 0x20, 0x7e, 0xa, 0xca, 0xee, 0xc2, + 0x1f, 0xf7, 0xd1, 0xf8, 0xd8, 0x77, 0xa, 0xfc, 0x29, 0x51, 0xa, 0x59, + 0xf8, 0x29, 0x54, 0xa, 0xe5, 0xfc, 0xa4, 0x5, 0x4f, 0x6c, 0xa, 0xf7, + 0x42, 0xf9, 0x50, 0x6b, 0xa, 0xf7, 0x47, 0xfb, 0xd, 0x6b, 0xa, 0xe, + 0x78, 0x9e, 0xf8, 0xa8, 0x99, 0xf7, 0x40, 0x9e, 0x6, 0xfb, 0x6d, 0x95, + 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xf2, 0xa, 0xf7, 0x2a, + 0xb, 0xf2, 0x9c, 0x93, 0xc, 0xc, 0xf7, 0xe1, 0x14, 0xf9, 0xf, 0x15, + 0xb1, 0x13, 0x0, 0x7c, 0x2, 0x0, 0x1, 0x0, 0x31, 0x0, 0x6d, 0x0, + 0x7a, 0x0, 0xc0, 0x1, 0x5, 0x1, 0x2a, 0x1, 0x51, 0x1, 0x55, 0x1, + 0x87, 0x1, 0x93, 0x1, 0xa3, 0x1, 0xa8, 0x1, 0xc7, 0x1, 0xd1, 0x1, + 0xd4, 0x1, 0xdc, 0x1, 0xea, 0x1, 0xf8, 0x2, 0x4, 0x2, 0x11, 0x2, + 0x1b, 0x2, 0x2a, 0x2, 0x34, 0x2, 0x3b, 0x2, 0x44, 0x2, 0x4d, 0x2, + 0x56, 0x2, 0x5e, 0x2, 0x67, 0x2, 0x6c, 0x2, 0x71, 0x2, 0x7b, 0x2, + 0x80, 0x2, 0x8d, 0x2, 0x94, 0x2, 0x99, 0x2, 0x9e, 0x2, 0xaf, 0x2, + 0xb9, 0x2, 0xbe, 0x2, 0xc3, 0x2, 0xcf, 0x2, 0xe2, 0x2, 0xea, 0x2, + 0xf5, 0x3, 0x7, 0x3, 0xd, 0x3, 0x12, 0x3, 0x18, 0x3, 0x1c, 0x3, + 0x26, 0x3, 0x2b, 0x3, 0x30, 0x3, 0x34, 0x3, 0x3e, 0x3, 0x4d, 0x3, + 0x54, 0x3, 0x5a, 0x3, 0x5f, 0x3, 0x63, 0x3, 0x67, 0x3, 0x6b, 0x3, + 0x6f, 0x3, 0x7a, 0x3, 0x84, 0x3, 0x91, 0x3, 0x9e, 0x3, 0xa6, 0x3, + 0xae, 0x3, 0xb1, 0x3, 0xb5, 0x3, 0xb9, 0x3, 0xbd, 0x3, 0xc9, 0x3, + 0xcf, 0x3, 0xd8, 0x3, 0xe4, 0x3, 0xef, 0x3, 0xf4, 0x3, 0xfa, 0x4, + 0x0, 0x4, 0x6, 0x4, 0xc, 0x4, 0x17, 0x4, 0x22, 0x4, 0x2c, 0x4, + 0x33, 0x4, 0x38, 0x4, 0x3f, 0x4, 0x46, 0x4, 0x4b, 0x4, 0x50, 0x4, + 0x54, 0x4, 0x5e, 0x4, 0x68, 0x4, 0x72, 0x4, 0x7c, 0x4, 0x7f, 0x4, + 0x83, 0x4, 0x87, 0x4, 0x8b, 0x4, 0x8f, 0x4, 0x95, 0x4, 0x9e, 0x4, + 0xa7, 0x4, 0xb0, 0x4, 0xb6, 0x4, 0xbb, 0x4, 0xc1, 0x4, 0xc6, 0x4, + 0xcb, 0x4, 0xd0, 0x4, 0xd5, 0x4, 0xda, 0x4, 0xde, 0x4, 0xe3, 0x4, + 0xe8, 0x4, 0xec, 0x4, 0xf0, 0x4, 0xf4, 0x4, 0xf8, 0x4, 0xfc, 0x5, + 0x0, 0x5, 0x4, 0x2f, 0xa, 0x99, 0xa, 0xab, 0xb1, 0x1a, 0xab, 0x7c, + 0xf7, 0x4, 0x33, 0xa, 0x7f, 0x5, 0xb9, 0x98, 0xb1, 0x9a, 0xb8, 0x1b, + 0xce, 0xa8, 0x5b, 0x54, 0x70, 0x1f, 0x6c, 0x81, 0x54, 0x86, 0x50, 0x85, + 0x8, 0x42, 0x86, 0xfb, 0x2f, 0x7f, 0xfb, 0x34, 0x1a, 0x28, 0xd6, 0x52, + 0xe1, 0x1e, 0xb, 0x15, 0xfb, 0x23, 0xe3, 0xfb, 0x32, 0xf7, 0x69, 0xf7, + 0xb1, 0xf7, 0x16, 0xf7, 0x95, 0xf7, 0x56, 0xf7, 0x49, 0xfb, 0x6, 0xf7, + 0x13, 0xfb, 0x53, 0xfb, 0xc9, 0x25, 0xfb, 0xb4, 0xfb, 0x3e, 0x1e, 0xf7, + 0x2a, 0x16, 0xf7, 0x37, 0xf0, 0xf7, 0x3d, 0xf7, 0x29, 0xf7, 0x3, 0xc2, + 0x34, 0x2a, 0xfb, 0xa, 0x3b, 0xfb, 0x61, 0xfb, 0x3c, 0x2a, 0x44, 0xd1, + 0xf4, 0x1e, 0xb, 0x15, 0xfb, 0x11, 0xde, 0xfb, 0x1, 0x38, 0xa, 0xf7, + 0x36, 0x26, 0xa, 0xb, 0x15, 0xf8, 0x8, 0x6, 0x94, 0xae, 0x8c, 0xb3, + 0x99, 0x1a, 0xf0, 0x5d, 0xf7, 0x1c, 0xfb, 0x41, 0xfb, 0x6e, 0x35, 0xfb, + 0x33, 0xfb, 0x1b, 0xfb, 0x24, 0xe9, 0xfb, 0xf, 0xf7, 0x2d, 0xd7, 0xf7, + 0x1, 0xa6, 0xf7, 0x15, 0xcc, 0x1e, 0xfb, 0x1a, 0xa1, 0x5, 0x7a, 0x83, + 0x6a, 0x51, 0x41, 0x1b, 0x4d, 0x5a, 0xbc, 0xde, 0x8f, 0x1f, 0x9a, 0xe3, + 0x15, 0xbe, 0x95, 0xaf, 0xde, 0xe1, 0x1b, 0xd8, 0xa6, 0x4c, 0x44, 0x88, + 0x1f, 0xb, 0x1, 0xf7, 0x8, 0xf7, 0x28, 0x3, 0xf7, 0x6b, 0xf9, 0x73, + 0x15, 0x3a, 0xfc, 0x2a, 0x5, 0x81, 0x5f, 0x83, 0x59, 0x5b, 0x1a, 0xfb, + 0x1, 0xc2, 0x2a, 0xf7, 0x62, 0xf7, 0xa3, 0xb6, 0xf7, 0x64, 0xf7, 0x20, + 0xa8, 0x1e, 0xdf, 0xf8, 0x2a, 0x5, 0x97, 0xa, 0x37, 0xfc, 0x2a, 0x5, + 0xfb, 0x13, 0x71, 0x78, 0x2e, 0xfb, 0x20, 0x1b, 0x2b, 0x73, 0xb4, 0xc5, + 0xaf, 0x94, 0xb5, 0x94, 0xb6, 0x1f, 0xdf, 0xf8, 0x2a, 0x5, 0xb, 0x5e, + 0xa, 0xe1, 0xf7, 0x36, 0x5, 0xf7, 0xaf, 0x6, 0xa3, 0xfb, 0x36, 0x5, + 0xf7, 0x1f, 0x6, 0xfb, 0x8, 0xf9, 0x71, 0x43, 0xa, 0x27, 0xfc, 0x54, + 0x15, 0xf7, 0x30, 0xf7, 0xba, 0x5c, 0xa, 0xb3, 0xfb, 0xba, 0x5, 0xb, + 0xf7, 0xe, 0x48, 0xf7, 0xa, 0xfb, 0x4f, 0xfb, 0x7d, 0x41, 0xfb, 0x4c, + 0xfb, 0x21, 0x1e, 0xf7, 0x25, 0x16, 0xcb, 0xb0, 0xf7, 0x2b, 0xf7, 0x11, + 0xdb, 0xa8, 0x3d, 0x57, 0x29, 0x56, 0xfb, 0x4, 0x21, 0x3f, 0x67, 0xcb, + 0xc8, 0x1e, 0xb, 0x15, 0x25, 0xa, 0xe, 0xf8, 0x31, 0x89, 0x15, 0x82, + 0xa, 0xf7, 0x2, 0xf8, 0xa7, 0x47, 0xa, 0x57, 0xfb, 0x8e, 0x5, 0x46, + 0x71, 0x7f, 0xfb, 0xd, 0xfb, 0xe, 0x1b, 0x5e, 0x7d, 0xa4, 0xad, 0xa1, + 0x90, 0xa4, 0x91, 0xa0, 0x1f, 0xcc, 0xf7, 0xcd, 0x44, 0xa, 0x4d, 0xfb, + 0xba, 0x5, 0x85, 0x6a, 0x81, 0x60, 0x62, 0x1a, 0xb, 0x12, 0x13, 0x60, + 0x28, 0xa, 0x13, 0xa0, 0x35, 0xa, 0x13, 0x60, 0xb, 0x30, 0xa, 0x9c, + 0xf7, 0x8e, 0x15, 0x88, 0x78, 0x5, 0x31, 0xa, 0x90, 0xe6, 0x99, 0x1f, + 0xb, 0xfd, 0x22, 0x21, 0xa, 0xe, 0xf8, 0xc4, 0x6, 0xa5, 0xf7, 0x10, + 0x5, 0xfc, 0x31, 0x6, 0xb3, 0xf7, 0x5a, 0x70, 0xa, 0xf7, 0x10, 0x5, + 0xfb, 0xfe, 0x6, 0xad, 0xf7, 0x3c, 0x6f, 0xa, 0xf7, 0xf, 0x90, 0xa, + 0xb, 0xe2, 0x78, 0xf7, 0x14, 0xf9, 0x6, 0x77, 0x24, 0xa, 0xb, 0x2a, + 0xa, 0xe, 0x32, 0xa, 0x9a, 0xca, 0x99, 0xc0, 0x1e, 0xb, 0xba, 0xcb, + 0x9d, 0xc2, 0xbf, 0x1f, 0x8d, 0x70, 0x8c, 0x82, 0x93, 0x72, 0x8, 0xb, + 0x5f, 0x81, 0x77, 0x30, 0x20, 0x1b, 0x5a, 0x77, 0xab, 0xa7, 0xd6, 0xf7, + 0xa, 0xb, 0x15, 0xf7, 0x27, 0x6, 0x83, 0xa6, 0x87, 0x9e, 0xaa, 0x1a, + 0xbc, 0xb, 0xfb, 0x5a, 0x27, 0xfb, 0x3, 0x6b, 0xfb, 0xd, 0x5f, 0x1e, + 0xf7, 0x28, 0xb, 0x68, 0xa, 0xf7, 0x36, 0xf7, 0xf, 0xf8, 0x54, 0x77, + 0xb, 0x46, 0xa6, 0x4c, 0xf7, 0x6, 0xcd, 0xce, 0xa9, 0xc2, 0xc2, 0x1e, + 0x8d, 0x89, 0x5, 0xb, 0x1, 0xf6, 0xf7, 0x2a, 0xf8, 0x34, 0xf7, 0x2a, + 0x3, 0xb, 0xa0, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xb, 0xf7, 0x3d, 0xf7, + 0x59, 0xf7, 0x4, 0xf7, 0x31, 0xb, 0x15, 0xf7, 0xc, 0x40, 0xa, 0xfb, + 0xc, 0x6, 0xb, 0x39, 0xa, 0xf7, 0x48, 0xfb, 0xc, 0x39, 0xa, 0xe, + 0xf7, 0x2, 0x97, 0xc1, 0xa2, 0xf5, 0x18, 0xb, 0xf7, 0x1c, 0x6, 0xf4, + 0xf8, 0xa6, 0x5b, 0xa, 0xb, 0x5, 0xfb, 0x21, 0x6, 0xb, 0x8e, 0xa2, + 0x3b, 0xa, 0xb, 0x1, 0xdd, 0xf7, 0x25, 0xf7, 0xa3, 0xf7, 0x25, 0x3, + 0xb, 0x6, 0xa4, 0x83, 0xa, 0xb, 0xab, 0x8b, 0xf7, 0x10, 0xf7, 0x5a, + 0xf7, 0x10, 0xf7, 0x3c, 0xf7, 0xf, 0xb, 0x3c, 0x7d, 0xf7, 0x0, 0x2b, + 0xeb, 0xb, 0x5, 0xfb, 0x37, 0x6, 0xb, 0x5, 0xfb, 0x24, 0x6, 0xb, + 0x15, 0xf7, 0x8, 0x6, 0xe0, 0xe2, 0xb1, 0x34, 0x5, 0xec, 0x6, 0x4f, + 0xf7, 0x27, 0x66, 0xa, 0xe, 0xf7, 0x29, 0x6, 0xf7, 0x40, 0xf9, 0x74, + 0x5a, 0xa, 0xb, 0x5, 0xfb, 0x23, 0x6, 0xb, 0xfb, 0xf9, 0xa0, 0x76, + 0xb, 0xf7, 0x23, 0x78, 0xf7, 0x14, 0xf9, 0x37, 0xf7, 0x2c, 0x36, 0xa, + 0xb, 0x15, 0xdb, 0x6, 0x57, 0xf7, 0x65, 0xf7, 0x24, 0xf7, 0x5b, 0x5, + 0x2b, 0x6, 0xfb, 0x39, 0xfb, 0x53, 0x5, 0xb, 0x7c, 0xa, 0xa8, 0xf7, + 0x26, 0x44, 0xa, 0xb, 0x73, 0x7d, 0xf7, 0x1, 0xf8, 0x8b, 0xf7, 0x2c, + 0x3f, 0xa, 0xb, 0x15, 0xeb, 0x6, 0xf7, 0x39, 0xf7, 0x59, 0x32, 0xf7, + 0x67, 0x5, 0x3b, 0x6, 0xbf, 0xfb, 0x67, 0x5, 0xb, 0x48, 0xa, 0xf9, + 0x74, 0x77, 0xb, 0x6, 0xa4, 0x55, 0xa, 0xb, 0x6, 0xa4, 0xf7, 0xd, + 0x5, 0xb, 0x5, 0x89, 0x6, 0xb, 0x6, 0xf7, 0x44, 0xf7, 0x26, 0x5, + 0xfb, 0x3a, 0x6, 0xb, 0x5, 0xfb, 0x29, 0x6, 0xb, 0x5, 0xfb, 0x1e, + 0x6, 0xb, 0xf7, 0xe, 0x5, 0xb, 0xf7, 0x1e, 0x8e, 0xa3, 0x3b, 0xa, + 0xfb, 0x1f, 0x6, 0xb, 0xe2, 0x8b, 0xf7, 0xa, 0xf8, 0x76, 0xf7, 0xa, + 0x1, 0xf9, 0x6, 0xf7, 0x2b, 0x3, 0xb, 0xec, 0x76, 0xf8, 0x2c, 0x77, + 0x1, 0xb, 0x73, 0x7d, 0xf2, 0x30, 0xe6, 0xb, 0x5, 0xfb, 0x2a, 0x6, + 0xb, 0x85, 0xa, 0x6, 0xb, 0x5, 0x8d, 0x6, 0xb, 0xf7, 0x2c, 0x5, + 0xb, 0xf7, 0x2a, 0x6, 0xb, 0x4f, 0xa, 0xfb, 0xd, 0x6, 0xf7, 0x49, + 0xfb, 0xe, 0x15, 0xb, 0x15, 0xe8, 0x6, 0xf7, 0x32, 0xf7, 0x27, 0x53, + 0xa, 0xe, 0x15, 0xca, 0x6, 0x7e, 0x52, 0x73, 0x7a, 0x5f, 0x82, 0x7e, + 0x4d, 0x18, 0xb, 0xfb, 0x15, 0x5, 0xca, 0x6, 0x7e, 0x53, 0x73, 0x7b, + 0x5f, 0x81, 0x8, 0xb, 0x6, 0x72, 0x84, 0x84, 0x7b, 0x77, 0x1b, 0xb, + 0xf7, 0xc0, 0x16, 0xf7, 0x20, 0x6, 0xc1, 0xb, 0x3d, 0xa, 0xe, 0x98, + 0xa, 0x6, 0xb, 0xf7, 0x2b, 0x5, 0xb, 0xe2, 0xa0, 0x76, 0xb, 0x15, + 0xf7, 0xa, 0x6, 0xa4, 0xf7, 0x7, 0x5, 0xfb, 0xa, 0x6, 0xb, 0x86, + 0xa, 0xfb, 0xe, 0x6, 0xb, 0x15, 0xf7, 0xb, 0x50, 0xa, 0xfb, 0xb, + 0x6, 0xb, 0x72, 0x69, 0x63, 0x5c, 0x1b, 0x86, 0x79, 0x8b, 0x93, 0x72, + 0x1f, 0xb, 0x15, 0xf7, 0x15, 0x6, 0xa6, 0x55, 0xa, 0xfb, 0x15, 0x6, + 0xb, 0x6, 0xa5, 0x55, 0xa, 0xb, 0x5, 0xf8, 0x14, 0x6, 0xa4, 0xb, + 0x5, 0xf7, 0xfe, 0x6, 0xa4, 0xb, 0x6, 0xa5, 0xf7, 0xf, 0x5, 0xb, + 0xf8, 0xf0, 0xf7, 0x26, 0x1, 0xb, 0xfb, 0x8a, 0xfb, 0x58, 0xf7, 0x7, + 0xf7, 0xb2, 0xf7, 0x8, 0xb, 0xfb, 0x11, 0x59, 0xfb, 0x2f, 0x3b, 0x1e, + 0xe8, 0x16, 0x9b, 0xb, 0x15, 0xec, 0x6, 0x4c, 0x5d, 0xa, 0xfb, 0x1f, + 0x6, 0xb, 0x12, 0xc2, 0xf7, 0x23, 0x13, 0x70, 0xb, 0x94, 0xa, 0xfb, + 0x57, 0xb, 0x8d, 0x76, 0xf9, 0x88, 0x77, 0x1, 0xb, 0xa0, 0x76, 0xf8, + 0xa8, 0x77, 0x1, 0xb, 0x5, 0xfb, 0xe, 0x6, 0xb, 0x5, 0xfb, 0x27, + 0x6, 0xb, 0xf7, 0x24, 0x6, 0xb, 0x1, 0xd1, 0xf7, 0x22, 0xf7, 0x8b, + 0xf7, 0x1a, 0x3, 0xb, 0x5, 0x87, 0x9b, 0xb8, 0x80, 0xb2, 0x1b, 0xf2, + 0xae, 0xb, 0xfb, 0x58, 0xf7, 0x2, 0xf9, 0x4e, 0xf7, 0x2, 0x1, 0xb, + 0xcc, 0xf7, 0x5a, 0xf7, 0x44, 0xf7, 0x9, 0x9c, 0x32, 0xb, 0x54, 0xa, + 0xe, 0xf7, 0x1b, 0x6, 0xb, 0xf7, 0xc, 0x5, 0xb, 0x73, 0xa0, 0x76, + 0xb, 0x5, 0xfb, 0x1c, 0xb, 0x15, 0xf7, 0xe, 0x4f, 0xa, 0xb, 0x73, + 0x8b, 0xf7, 0xd, 0xf8, 0xe9, 0x77, 0x1, 0xb, 0xf7, 0x77, 0xf5, 0x1, + 0xbb, 0xf7, 0x77, 0x15, 0xb, 0x6, 0xa1, 0xf7, 0x3, 0x5, 0xfb, 0x3d, + 0x6, 0xb, 0xd0, 0x16, 0xf7, 0x21, 0x6, 0xb, 0x96, 0xa, 0xd7, 0x16, + 0xb, 0xf7, 0x23, 0x78, 0xf7, 0x12, 0xb, 0x5, 0xf7, 0x23, 0x6, 0xb, + 0x15, 0xf7, 0x1e, 0x6, 0xb, 0x15, 0xf7, 0xe, 0x6, 0xb, 0x5, 0xfc, + 0xa7, 0x6, 0xb, 0x5, 0xfb, 0x1b, 0x6, 0xb, 0x5, 0x9a, 0xa, 0xb, + 0x5, 0xfb, 0x26, 0x6, 0xb, 0x5, 0xfb, 0x28, 0x6, 0xb, 0xf7, 0x2b, + 0x1, 0xb, 0xf7, 0xc, 0x1, 0xb, 0xfb, 0x2b, 0x6, 0xb, 0x5, 0xfb, + 0x17, 0xb, 0xa0, 0xe8, 0x93, 0xb, 0xfb, 0x22, 0x6, 0xb, 0xf7, 0x22, + 0x6, 0xb}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansItalic.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansItalic.cpp new file mode 100644 index 000000000000..2912e1688ece --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansItalic.cpp @@ -0,0 +1,1371 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitSansItalicFontData[16339] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x14, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x53, 0x61, 0x6e, 0x73, 0x4f, 0x54, 0x46, 0x2d, 0x49, 0x74, + 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1, 0x27, 0xf8, 0x10, 0x0, + 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8, 0x1e, 0x3, 0xf8, 0x18, 0x4, + 0x7f, 0xc, 0x2, 0xfb, 0x3e, 0xfb, 0x75, 0xfa, 0xf0, 0xfa, 0x4b, 0x5, + 0xf7, 0x36, 0xf, 0xf9, 0x1, 0x11, 0xc3, 0x1c, 0x3a, 0xfc, 0x12, 0x0, + 0x4, 0x1, 0x1, 0x5, 0x2f, 0x44, 0x52, 0x45, 0x75, 0x72, 0x6f, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, + 0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x49, 0x74, 0x61, 0x6c, + 0x69, 0x63, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20, 0x53, 0x61, 0x6e, 0x73, + 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, + 0xab, 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0, 0xb0, 0x0, + 0x23, 0x0, 0x24, 0x0, 0xb1, 0x0, 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, + 0xb3, 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87, 0x0, 0x27, 0x0, + 0x28, 0x0, 0x29, 0x0, 0x2a, 0x0, 0xb6, 0x0, 0xb7, 0x0, 0xb8, 0x0, + 0xb9, 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x8c, 0x0, 0x2e, 0x0, + 0x2f, 0x0, 0xba, 0x0, 0x30, 0x0, 0x8e, 0x0, 0xbb, 0x0, 0xbc, 0x0, + 0xbd, 0x0, 0xbe, 0x0, 0x8d, 0x0, 0xbf, 0x0, 0x31, 0x0, 0x32, 0x0, + 0x33, 0x0, 0x34, 0x0, 0xc0, 0x0, 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, + 0xc1, 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37, 0x0, 0x38, 0x0, + 0x39, 0x0, 0x3a, 0x0, 0xc5, 0x0, 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, + 0x42, 0x0, 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca, 0x0, 0x90, 0x0, + 0xcb, 0x0, 0x7, 0x0, 0xcc, 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0, + 0x21, 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0, 0x5d, 0x0, 0x5c, 0x0, + 0x5e, 0x0, 0x3c, 0x0, 0x3e, 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0, + 0x44, 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0, 0x61, 0x0, 0x7e, 0x0, + 0x1b, 0x0, 0xd, 0x0, 0xaa, 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0, + 0x71, 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0, 0x5, 0x0, 0x82, 0x0, + 0x91, 0x0, 0x46, 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, + 0x19, 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0, 0x1e, 0x0, 0xa7, 0x0, + 0x2, 0x0, 0x60, 0x0, 0x47, 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0, + 0x65, 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x0, 0x95, 0x0, 0x7c, 0x0, + 0x1f, 0x0, 0x6a, 0x0, 0x78, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, + 0x86, 0x0, 0xe, 0x0, 0x4a, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, + 0xd6, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0, 0x1d, 0x0, 0x97, 0x0, + 0x92, 0x0, 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98, 0x0, 0xa8, 0x0, + 0x4f, 0x0, 0x1a, 0x0, 0xd7, 0x0, 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, + 0xd9, 0x0, 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb, 0x0, 0x12, 0x0, + 0x9b, 0x0, 0x9e, 0x0, 0x96, 0x0, 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, + 0xdc, 0x0, 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa, 0x0, 0x6, 0x0, + 0xf, 0x0, 0x72, 0x0, 0x7a, 0x0, 0xc, 0x0, 0x9c, 0x0, 0x52, 0x0, + 0x20, 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0, 0x69, 0x0, 0x77, 0x0, + 0x41, 0x0, 0x8, 0x0, 0x75, 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0, + 0x84, 0x0, 0x54, 0x0, 0xdd, 0x0, 0x66, 0x0, 0x1c, 0x0, 0x18, 0x0, + 0x17, 0x0, 0x10, 0x0, 0x1, 0x0, 0x62, 0x0, 0x55, 0x0, 0xa2, 0x0, + 0x14, 0x0, 0xa3, 0x0, 0xa9, 0x0, 0x7f, 0x0, 0x99, 0x0, 0x13, 0x0, + 0xa4, 0x0, 0x56, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, + 0x40, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, 0xe2, 0x0, + 0xe3, 0x0, 0x64, 0x0, 0x5b, 0x0, 0xe4, 0x0, 0x11, 0x0, 0xe6, 0x2, + 0x0, 0x1, 0x0, 0x3, 0x0, 0x36, 0x0, 0x82, 0x0, 0x94, 0x0, 0xa7, + 0x0, 0xb9, 0x0, 0xd1, 0x1, 0x10, 0x1, 0x54, 0x1, 0xb3, 0x2, 0x5, + 0x2, 0x89, 0x2, 0xc9, 0x2, 0xf6, 0x3, 0x3, 0x3, 0x10, 0x3, 0x1c, + 0x3, 0x2f, 0x3, 0x87, 0x4, 0x6, 0x4, 0x2e, 0x4, 0x8d, 0x4, 0xbc, + 0x4, 0xca, 0x4, 0xe6, 0x5, 0x6, 0x5, 0x29, 0x5, 0x3e, 0x5, 0x72, + 0x5, 0xa5, 0x5, 0xbb, 0x5, 0xe6, 0x6, 0x17, 0x6, 0x3f, 0x6, 0xa1, + 0x6, 0xf1, 0x7, 0x77, 0x7, 0x9a, 0x7, 0xc3, 0x7, 0xe8, 0x8, 0x5, + 0x8, 0x84, 0x8, 0xd2, 0x9, 0x12, 0x9, 0x91, 0x9, 0xec, 0xa, 0x59, + 0xa, 0xdf, 0xa, 0xff, 0xb, 0x47, 0xb, 0x84, 0xb, 0xd6, 0xb, 0xf7, + 0xc, 0x1f, 0xc, 0x71, 0xc, 0x8c, 0xc, 0xc9, 0xc, 0xfa, 0xd, 0x22, + 0xd, 0x51, 0xd, 0x89, 0xd, 0xb1, 0xd, 0xee, 0xe, 0x7c, 0xe, 0x9e, + 0xe, 0xc3, 0xe, 0xda, 0xf, 0x9, 0xf, 0xbb, 0xf, 0xda, 0x10, 0x79, + 0x10, 0xc2, 0x10, 0xe4, 0x11, 0x2e, 0x11, 0x63, 0x12, 0x19, 0x12, 0x70, + 0x12, 0xca, 0x12, 0xe2, 0x12, 0xfc, 0x13, 0x4f, 0x13, 0xa6, 0x13, 0xca, + 0x13, 0xec, 0x14, 0x16, 0x14, 0x38, 0x14, 0x56, 0x14, 0xa0, 0x14, 0xb7, + 0x15, 0x2a, 0x15, 0x63, 0x15, 0xce, 0x15, 0xee, 0x16, 0x6, 0x16, 0x26, + 0x16, 0xbd, 0x17, 0x35, 0x17, 0x90, 0x17, 0xc8, 0x18, 0x16, 0x18, 0x50, + 0x18, 0x61, 0x18, 0x92, 0x19, 0x1f, 0x19, 0x31, 0x19, 0x42, 0x19, 0x99, + 0x19, 0xbc, 0x19, 0xe6, 0x1a, 0x4, 0x1a, 0x25, 0x1a, 0x96, 0x1a, 0xad, + 0x1a, 0xb8, 0x1a, 0xc1, 0x1a, 0xe2, 0x1b, 0x51, 0x1b, 0x75, 0x1b, 0xa3, + 0x1b, 0xde, 0x1c, 0x22, 0x1c, 0x7a, 0x1c, 0xb7, 0x1d, 0x16, 0x1d, 0x53, + 0x1d, 0x70, 0x1d, 0xdd, 0x1e, 0x52, 0x1e, 0x60, 0x1e, 0x89, 0x1e, 0xb7, + 0x1e, 0xe3, 0x1e, 0xfd, 0x1f, 0x1b, 0x1f, 0x5d, 0x1f, 0x6b, 0x1f, 0x82, + 0x1f, 0x9f, 0x1f, 0xbb, 0x1f, 0xdd, 0x1f, 0xfd, 0x20, 0x13, 0x20, 0x51, + 0x20, 0x7c, 0x20, 0x8b, 0x20, 0xaf, 0x20, 0xcd, 0x20, 0xee, 0x21, 0x52, + 0x21, 0x66, 0x21, 0x7a, 0x21, 0xcc, 0x21, 0xfd, 0x22, 0x3c, 0x22, 0xa1, + 0x23, 0x1b, 0x23, 0x72, 0x23, 0xb9, 0x23, 0xd7, 0x23, 0xfb, 0x24, 0x23, + 0x24, 0xba, 0x24, 0xeb, 0x25, 0x3, 0x25, 0x2f, 0x25, 0xb0, 0x26, 0x16, + 0x26, 0x3c, 0x26, 0xc6, 0x27, 0x6, 0x27, 0x7c, 0x27, 0xd3, 0x28, 0x29, + 0x28, 0x52, 0x28, 0x88, 0x28, 0xbd, 0x29, 0x5d, 0x29, 0x6b, 0x29, 0x7f, + 0x2a, 0x39, 0x2a, 0x5c, 0x2a, 0x9d, 0x2a, 0xf8, 0x2b, 0x4b, 0x2b, 0xa1, + 0x2b, 0xd2, 0x2b, 0xfa, 0x2c, 0x12, 0x2c, 0x3e, 0x2c, 0x54, 0x2c, 0x6b, + 0x2c, 0x86, 0x2c, 0x9f, 0x2c, 0xd7, 0x2d, 0x7d, 0x2d, 0xb7, 0x2e, 0x17, + 0x2e, 0x8e, 0x2f, 0x26, 0x2f, 0x55, 0x2f, 0x84, 0x2f, 0xe7, 0x2f, 0xfc, + 0x2f, 0xfe, 0x30, 0x8c, 0x30, 0xde, 0x31, 0x35, 0x31, 0x95, 0x32, 0x30, + 0x32, 0x8e, 0x32, 0xe2, 0x33, 0x3e, 0x33, 0x8c, 0x33, 0xdc, 0x34, 0x27, + 0x34, 0x34, 0x34, 0x42, 0x34, 0x4e, 0x34, 0x62, 0x34, 0x6f, 0x34, 0x8b, + 0x34, 0xc1, 0x34, 0xf0, 0x35, 0x27, 0x35, 0x75, 0x35, 0xc2, 0x36, 0x1b, + 0x36, 0x41, 0x36, 0x7a, 0x36, 0xbf, 0x77, 0xe, 0x35, 0xa, 0xf7, 0x62, + 0xd5, 0xf8, 0x4a, 0x77, 0x1, 0x99, 0x16, 0xf4, 0x6, 0xf7, 0x7, 0xf7, + 0x62, 0x5, 0xf7, 0xb8, 0x6, 0xae, 0xfb, 0x62, 0x5, 0xe8, 0x6, 0xfb, + 0xa, 0xf9, 0x62, 0x5, 0xfb, 0x5, 0x6, 0xfb, 0x28, 0xfc, 0x4a, 0x15, + 0xf7, 0x53, 0xf7, 0xfc, 0x48, 0xa, 0xb9, 0xfb, 0xfc, 0x5, 0xe, 0xf9, + 0x52, 0x8b, 0xdc, 0xf7, 0x10, 0xdc, 0xb9, 0xdc, 0xf7, 0x74, 0xdc, 0x1, + 0x93, 0x16, 0xf7, 0x0, 0x6, 0xf7, 0x10, 0xf7, 0x61, 0x5, 0xf7, 0xaa, + 0x6, 0x60, 0xfb, 0x61, 0x5, 0xf8, 0x98, 0x55, 0xa, 0xfc, 0x33, 0x6, + 0xbf, 0xf7, 0x8f, 0x5, 0xf8, 0x3, 0x55, 0xa, 0xfc, 0x3, 0x6, 0xba, + 0xf7, 0x74, 0x5, 0xf8, 0x7, 0x55, 0xa, 0xfd, 0x1a, 0x6, 0xfb, 0x35, + 0xfc, 0x44, 0x15, 0xf7, 0x6b, 0xf7, 0xf3, 0x5, 0xf2, 0x6, 0x42, 0xfb, + 0xf3, 0x5, 0xe, 0x31, 0xa, 0xf9, 0x13, 0x77, 0x1, 0xf8, 0x74, 0xf9, + 0xae, 0x36, 0xa, 0xfc, 0xc1, 0xfe, 0x35, 0x26, 0xa, 0x31, 0xa, 0xf8, + 0x8c, 0xf7, 0x1b, 0x1, 0xf7, 0xc7, 0xf9, 0xae, 0x30, 0xa, 0xfc, 0x3b, + 0xfe, 0x35, 0x26, 0xa, 0x31, 0xa, 0xf8, 0x93, 0xef, 0x1, 0xf8, 0xb1, + 0xf9, 0xb5, 0x2e, 0xa, 0xfc, 0x4, 0xfe, 0x19, 0x26, 0xa, 0x31, 0xa, + 0xf8, 0x87, 0xf7, 0x20, 0x1, 0xf8, 0x78, 0xf9, 0xa9, 0x56, 0xa, 0xf7, + 0x20, 0x5, 0x20, 0x6, 0xfc, 0xb, 0xfe, 0x35, 0x26, 0xa, 0x31, 0xa, + 0xf8, 0x77, 0xb0, 0xf7, 0x36, 0x76, 0x1, 0xf8, 0x28, 0xb0, 0xf3, 0xb0, + 0x3, 0xf8, 0x28, 0xf9, 0xf2, 0x15, 0x59, 0xb4, 0x64, 0xbb, 0xbb, 0xb4, + 0xb2, 0xbd, 0xbd, 0x63, 0xb2, 0x5a, 0x5a, 0x63, 0x64, 0x59, 0x1e, 0xb0, + 0x8a, 0x15, 0xa8, 0xa2, 0xa3, 0xa8, 0xa8, 0xa2, 0x74, 0x6d, 0x6e, 0x74, + 0x75, 0x6e, 0x6f, 0x73, 0xa1, 0xa8, 0x1e, 0xfc, 0x3f, 0xfd, 0xf1, 0x26, + 0xa, 0x31, 0xa, 0xf8, 0x9a, 0xf5, 0x8e, 0x77, 0x12, 0x13, 0xe0, 0xf8, + 0x5, 0xf9, 0xbc, 0x15, 0xc8, 0x66, 0xa, 0xa3, 0x1b, 0xa7, 0xa1, 0x82, + 0x82, 0x9e, 0x1f, 0x80, 0xa2, 0x9f, 0x7e, 0xa0, 0x1b, 0xc5, 0xac, 0xc1, + 0xc0, 0x90, 0x1f, 0x50, 0x6, 0x7d, 0x87, 0x85, 0x73, 0x5e, 0xa, 0x13, + 0xd0, 0x95, 0x73, 0x70, 0x96, 0x6e, 0x1b, 0x13, 0xe0, 0x48, 0x7a, 0x58, + 0x51, 0x7c, 0x1f, 0xfb, 0xf7, 0xfd, 0xbc, 0x26, 0xa, 0xf8, 0x5, 0x8b, + 0xdc, 0xf7, 0x8d, 0xdd, 0xf7, 0x75, 0xdc, 0x1, 0xf8, 0xd4, 0xf1, 0x3, + 0xd5, 0x16, 0xf7, 0xfd, 0x6, 0xf7, 0x37, 0xec, 0xf7, 0xd, 0xf5, 0xe5, + 0x4b, 0xb3, 0x52, 0x9e, 0x1f, 0xb6, 0x99, 0xea, 0xac, 0xf7, 0xa, 0x1a, + 0xf7, 0x22, 0xfb, 0x18, 0xae, 0xfb, 0xb, 0x1e, 0xfb, 0x7b, 0x6, 0x64, + 0xfd, 0x11, 0x15, 0xc1, 0xf7, 0x8d, 0x5, 0xf7, 0x52, 0x6, 0xc9, 0xeb, + 0x8a, 0x25, 0xfb, 0x11, 0xfb, 0x13, 0x76, 0x22, 0x1f, 0x29, 0xf7, 0xdf, + 0x15, 0xbc, 0xf7, 0x75, 0x5, 0xf7, 0x29, 0x6, 0xc7, 0xec, 0x8a, 0x2c, + 0xfb, 0x3, 0xfb, 0x6, 0x79, 0x31, 0x1f, 0xe, 0xf8, 0x3c, 0x78, 0xdc, + 0xf8, 0xe6, 0xdc, 0x1, 0xf7, 0x14, 0xef, 0x3, 0xf9, 0x1b, 0xf7, 0x8f, + 0x15, 0x51, 0x79, 0x4a, 0xfb, 0x17, 0xfb, 0x2b, 0x1b, 0x3c, 0xfb, 0x12, + 0xb4, 0xf7, 0x53, 0xf7, 0x47, 0xf2, 0xf7, 0x4b, 0xf7, 0x52, 0xf7, 0x28, + 0xaa, 0xfb, 0x8, 0x62, 0x92, 0x1f, 0xea, 0x93, 0x5, 0xf7, 0x52, 0x75, + 0xfb, 0x3a, 0xb3, 0x2e, 0x1b, 0xfb, 0x7e, 0xfb, 0x33, 0xfb, 0x5d, 0xfb, + 0x86, 0xfb, 0x74, 0xf7, 0x1c, 0x32, 0xf7, 0x36, 0xf7, 0x3b, 0xf7, 0x8, + 0xf2, 0xf7, 0x2d, 0xc5, 0x1f, 0xe, 0xf8, 0x3c, 0xfb, 0x75, 0xc6, 0xf7, + 0x24, 0xdc, 0xf8, 0xe9, 0xdc, 0x1, 0xf7, 0x0, 0xf0, 0x3, 0xf7, 0x79, + 0xfb, 0x37, 0x15, 0x72, 0x52, 0x5, 0x87, 0xa6, 0xad, 0x8a, 0xa6, 0x1b, + 0xf7, 0x46, 0x9e, 0xd5, 0xa8, 0xc6, 0x53, 0x93, 0x77, 0x8e, 0x1f, 0x99, + 0xa9, 0xc8, 0x8e, 0xf7, 0x43, 0xa6, 0xe0, 0xf7, 0x78, 0x19, 0x27, 0x98, + 0x5, 0x50, 0x78, 0x4c, 0xfb, 0x17, 0xfb, 0x2c, 0x1b, 0x38, 0xfb, 0xe, + 0xbe, 0xf7, 0x54, 0xf7, 0x48, 0xf0, 0xf7, 0x42, 0xf7, 0x54, 0xf7, 0x28, + 0xa8, 0xfb, 0x9, 0x62, 0x93, 0x1f, 0xea, 0x93, 0x5, 0xf7, 0x54, 0x76, + 0xfb, 0x3b, 0xb2, 0x2f, 0x1b, 0xfb, 0x7f, 0xfb, 0x33, 0xfb, 0x53, 0xfb, + 0x88, 0xfb, 0x35, 0xd0, 0xfb, 0x1c, 0xf7, 0x48, 0x73, 0x1f, 0x6a, 0x47, + 0x5, 0xc4, 0x8a, 0x9d, 0x7b, 0x78, 0x1a, 0x5f, 0x43, 0x8c, 0x57, 0x82, + 0x87, 0x8d, 0x8c, 0x6a, 0x1e, 0xe, 0xf8, 0x3c, 0x8b, 0xdc, 0xf8, 0xc0, + 0xdc, 0x1, 0xf9, 0x2c, 0xef, 0x3, 0xdc, 0x16, 0xf7, 0x9b, 0x6, 0xf7, + 0x6a, 0xf7, 0x62, 0xf7, 0x12, 0xf7, 0xc0, 0xf7, 0x42, 0xfb, 0xb, 0xf7, + 0xa, 0xfb, 0x52, 0x1f, 0xfb, 0x72, 0x6, 0x66, 0xfd, 0x11, 0x15, 0xf7, + 0xa, 0xf8, 0xc0, 0x5, 0xf7, 0x17, 0x6, 0xe0, 0xf7, 0x1a, 0x87, 0xfb, + 0x63, 0xfb, 0x9b, 0xfb, 0x30, 0x39, 0xfb, 0x58, 0x1f, 0xe, 0xf8, 0x5, + 0x8b, 0xdc, 0xf7, 0x8e, 0xdd, 0xf7, 0x74, 0xdc, 0x1, 0xe1, 0x16, 0xf8, + 0xbe, 0x6b, 0xa, 0xfc, 0x5d, 0x6, 0xc2, 0xf7, 0x8e, 0x5, 0xf8, 0x2a, + 0x6, 0x9c, 0xdd, 0x5, 0xfc, 0x29, 0x6, 0xb7, 0xf7, 0x74, 0x5, 0xf8, + 0x3e, 0x6b, 0xa, 0xfc, 0xa0, 0x6, 0xe, 0x32, 0xa, 0xf7, 0x53, 0x77, + 0x2a, 0xa, 0xf7, 0x1e, 0xc3, 0x36, 0xa, 0xe, 0x32, 0xa, 0xc3, 0xf7, + 0x1b, 0x2a, 0xa, 0xf7, 0x1, 0xc3, 0x30, 0xa, 0xe, 0x32, 0xa, 0xca, + 0xef, 0x2a, 0xa, 0xf7, 0xa7, 0xca, 0x2e, 0xa, 0xe, 0x32, 0xa, 0xbe, + 0xf7, 0x20, 0x2a, 0xa, 0xf7, 0x95, 0xbe, 0x56, 0xa, 0xf7, 0x20, 0x5, + 0xfb, 0x0, 0x6, 0xe, 0xf8, 0x3c, 0x8b, 0xdc, 0xf7, 0x8e, 0xdc, 0xf7, + 0x75, 0xdc, 0x1, 0xf9, 0x2c, 0xef, 0x3, 0xd8, 0x16, 0xf7, 0x9c, 0x6, + 0xf7, 0x6a, 0xf7, 0x65, 0xf7, 0x12, 0xf7, 0xbf, 0xf7, 0x44, 0xfb, 0xb, + 0xf7, 0x9, 0xfb, 0x55, 0x1f, 0xfb, 0x6f, 0x6, 0x49, 0xfb, 0xc6, 0x5, + 0x3a, 0x6, 0x7a, 0x3a, 0x5, 0xdb, 0x6, 0xb6, 0xfb, 0x8e, 0x15, 0xc2, + 0xf7, 0x8e, 0x5, 0xf7, 0x64, 0x6b, 0xa, 0xfb, 0x65, 0x6, 0xbd, 0xf7, + 0x75, 0x5, 0xf7, 0x14, 0x6, 0xe1, 0xf7, 0x1c, 0x86, 0xfb, 0x63, 0xfb, + 0x9b, 0xfb, 0x33, 0x3a, 0xfb, 0x58, 0x1f, 0xe, 0xf8, 0x5, 0x8b, 0xd8, + 0xf7, 0x50, 0xcb, 0xc9, 0xcb, 0xf7, 0x4e, 0xd8, 0x1, 0xd0, 0xf0, 0x3, + 0x99, 0xf7, 0x9d, 0x15, 0xc2, 0x6, 0xfb, 0x38, 0x97, 0xf2, 0x26, 0xf7, + 0x4b, 0x1b, 0xb8, 0xb6, 0x92, 0x9a, 0xb2, 0x1f, 0xa3, 0xf0, 0x5, 0x6c, + 0x62, 0x5b, 0x7c, 0x55, 0x1b, 0xfb, 0x12, 0x44, 0xda, 0xf7, 0x1, 0x83, + 0x1f, 0xf7, 0xcb, 0x6, 0x9a, 0xcb, 0x5, 0xfb, 0xda, 0x6, 0x8e, 0x9f, + 0x8c, 0xa1, 0x90, 0x9f, 0x8, 0xf7, 0xdf, 0x6, 0x9a, 0xcb, 0x5, 0xfb, + 0xd9, 0x6, 0xf6, 0xb8, 0xdf, 0xda, 0xf7, 0x17, 0x1b, 0xc6, 0xc4, 0x7b, + 0x5f, 0xae, 0x1f, 0xb6, 0xdc, 0x5, 0xb3, 0x54, 0x45, 0x9b, 0x46, 0x1b, + 0xfb, 0x46, 0xfb, 0x1c, 0xfb, 0x3, 0xfb, 0x2c, 0x56, 0x1f, 0x4a, 0x6, + 0x7d, 0x4b, 0x5, 0xc9, 0x6, 0x87, 0x77, 0x89, 0x75, 0x8a, 0x77, 0x8, + 0x62, 0x6, 0xe, 0xf7, 0xcd, 0xa0, 0x76, 0xf7, 0xd9, 0xdd, 0xf7, 0x7a, + 0xdc, 0x1, 0xe1, 0x16, 0xf0, 0x6, 0xd3, 0xf7, 0xd9, 0x5, 0xf8, 0x19, + 0x6, 0x9d, 0xdd, 0x5, 0xfc, 0x19, 0x6, 0xbd, 0xf7, 0x7a, 0x5, 0xf8, + 0x1b, 0x6b, 0xa, 0xfc, 0x81, 0x6, 0xe, 0x6c, 0xa, 0xf7, 0x70, 0xdd, + 0xf7, 0xb8, 0xdc, 0x1, 0xf7, 0x3, 0xef, 0x3, 0xf8, 0x43, 0xf7, 0xae, + 0x15, 0xf7, 0x75, 0x6, 0x6a, 0xfb, 0x31, 0x5, 0x78, 0x67, 0x37, 0x5f, + 0x33, 0x1b, 0xfb, 0x15, 0x40, 0xf7, 0x1, 0xf7, 0x6, 0xf7, 0x69, 0xf7, + 0xc, 0xf7, 0x32, 0xf7, 0x49, 0xe5, 0xd8, 0x5f, 0xfb, 0x4, 0xa2, 0x1f, + 0xec, 0x95, 0x5, 0xf7, 0x26, 0x81, 0xfb, 0x20, 0xdc, 0xfb, 0x1a, 0x1b, + 0xfb, 0xa6, 0xfb, 0x16, 0xfb, 0x87, 0xfb, 0x65, 0x26, 0xb0, 0xfb, 0x5f, + 0xf7, 0xa0, 0xf7, 0xe, 0xf7, 0x2, 0xbc, 0xb2, 0xc9, 0x1f, 0xc9, 0xf7, + 0xbb, 0x5, 0xfb, 0xd8, 0x6, 0xe, 0xf8, 0x3c, 0xa0, 0x76, 0xf7, 0xe5, + 0xdc, 0xf7, 0xc0, 0x77, 0x1, 0xd8, 0x16, 0xed, 0x6, 0xd1, 0xf7, 0xe5, + 0x5, 0xf8, 0xb, 0x6, 0x45, 0xfb, 0xe5, 0x5, 0xeb, 0x6, 0xf7, 0x2d, + 0xf9, 0x62, 0x57, 0xa, 0x4b, 0xfb, 0xc0, 0x5, 0xfc, 0xc, 0x6, 0xcb, + 0xf7, 0xc0, 0x4d, 0xa, 0xe, 0x77, 0x2d, 0xa, 0xe6, 0x16, 0xeb, 0x6, + 0xf7, 0x2e, 0xf9, 0x62, 0x4d, 0xa, 0xe, 0x54, 0xa, 0xf7, 0x6a, 0x77, + 0x1, 0xf7, 0x85, 0xf9, 0xa8, 0x15, 0xd6, 0x6, 0xf7, 0x23, 0x6d, 0xa, + 0xfb, 0x8, 0x6, 0xfb, 0x90, 0xfe, 0x35, 0x15, 0x34, 0xa, 0xe, 0x54, + 0xa, 0xd6, 0xf7, 0x1f, 0x1, 0xf7, 0x2f, 0xf9, 0xaa, 0x6e, 0xa, 0xda, + 0xe4, 0xb2, 0x32, 0x5, 0xd9, 0x6, 0x4e, 0x6f, 0xa, 0x2a, 0x6, 0xfb, + 0x55, 0xfe, 0x35, 0x15, 0x34, 0xa, 0xe, 0x5c, 0xa, 0xf9, 0x6d, 0x77, + 0x1, 0xf7, 0xed, 0xf9, 0xb4, 0x15, 0xe7, 0x6, 0xa0, 0xf0, 0x3d, 0xa, + 0xfb, 0x5e, 0x26, 0x15, 0xe7, 0x6, 0xa1, 0xf0, 0x5, 0x2e, 0x6, 0x2d, + 0xfe, 0x19, 0x15, 0x34, 0xa, 0xe, 0x54, 0xa, 0xf7, 0x6a, 0x77, 0x1, + 0xe6, 0x16, 0x34, 0xa, 0xb9, 0xc0, 0x15, 0xce, 0x6, 0x54, 0x6d, 0xa, + 0x23, 0x6, 0xe, 0xf7, 0x5e, 0x78, 0xdb, 0xf9, 0x25, 0x77, 0x1, 0xba, + 0xea, 0x3, 0xba, 0xf7, 0x60, 0x15, 0xfb, 0x2c, 0xc3, 0x44, 0xf7, 0x15, + 0xf7, 0x31, 0xbe, 0xf5, 0xf1, 0xa2, 0x1e, 0xf7, 0xa, 0xf8, 0xa5, 0x5, + 0x24, 0x6, 0xfb, 0x8, 0xfc, 0xa5, 0x5, 0x49, 0x7d, 0x61, 0x4d, 0x42, + 0x1b, 0x5b, 0x60, 0xbe, 0xee, 0x1f, 0xe, 0xf8, 0x5, 0x2d, 0xa, 0xf9, + 0x1f, 0xf7, 0x21, 0x3, 0xd7, 0x16, 0xf0, 0x6, 0xbe, 0xf7, 0x7e, 0xf7, + 0x31, 0xf7, 0x17, 0xf7, 0x6d, 0xfc, 0x1, 0x5, 0xf7, 0x4, 0x6, 0xfb, + 0x93, 0xf8, 0x3f, 0xf7, 0xf1, 0xf7, 0xb7, 0x5, 0xfb, 0x21, 0x6, 0xfc, + 0x30, 0xfb, 0xf1, 0xdb, 0xf7, 0xf1, 0x5, 0x26, 0x6, 0xe, 0x8b, 0xdc, + 0xf9, 0x11, 0x77, 0x1, 0xd7, 0x16, 0xf8, 0x62, 0x55, 0xa, 0xfc, 0x2, + 0x6, 0xf7, 0x19, 0xf9, 0x11, 0x50, 0xa, 0xe, 0x8b, 0xdc, 0xf9, 0x11, + 0x77, 0x1, 0xd1, 0x16, 0xf8, 0x68, 0x55, 0xa, 0xfc, 0x7, 0x6, 0xc4, + 0xf7, 0xa7, 0xf7, 0x54, 0xf7, 0x0, 0x9c, 0xdc, 0xfb, 0x54, 0x21, 0xc6, + 0xf7, 0xab, 0x50, 0xa, 0x43, 0xfb, 0xe8, 0x30, 0x59, 0x7a, 0x37, 0xe6, + 0xbf, 0x5, 0xe, 0xf8, 0xab, 0x2d, 0xa, 0xd4, 0x16, 0xe9, 0x6, 0xf7, + 0xd, 0xf8, 0xf4, 0xe2, 0xfc, 0xf4, 0x5, 0xe8, 0x6, 0xf7, 0xf0, 0xf8, + 0xf9, 0xfb, 0x28, 0xfc, 0xf9, 0x5, 0xea, 0x6, 0xf7, 0x2b, 0xf9, 0x62, + 0x5, 0xfb, 0xc, 0x6, 0xfb, 0xfc, 0xfd, 0x15, 0x30, 0xf9, 0x15, 0x5, + 0xfb, 0xa, 0x6, 0xe, 0xf8, 0x3c, 0x2d, 0xa, 0xcb, 0xf9, 0x67, 0x3, + 0xd7, 0x16, 0xea, 0x6, 0xf7, 0xb, 0xf8, 0xf4, 0xf7, 0x99, 0xfc, 0xf4, + 0x5, 0xeb, 0x6, 0xf7, 0x2c, 0xf9, 0x62, 0x4d, 0xa, 0xfb, 0xf, 0xfc, + 0xf5, 0xfb, 0x97, 0xf8, 0xf5, 0x4d, 0xa, 0xe, 0xf8, 0x3c, 0xa0, 0x76, + 0xf9, 0x6d, 0x77, 0xf7, 0xa, 0x76, 0xf7, 0x3, 0x77, 0x12, 0xd7, 0x16, + 0xea, 0x6, 0xf7, 0xd, 0xf8, 0xfc, 0x48, 0xa, 0xf7, 0x95, 0xfc, 0xfc, + 0x5, 0xeb, 0x6, 0xf7, 0x2c, 0xf9, 0x6d, 0x4d, 0xa, 0xfb, 0xf, 0xfc, + 0xfe, 0x4e, 0xa, 0xfb, 0x94, 0xf8, 0xfe, 0x4d, 0xa, 0xf7, 0x19, 0xd8, + 0x15, 0xca, 0x66, 0xa, 0xa4, 0x1b, 0x13, 0x10, 0xa5, 0xa0, 0x83, 0x82, + 0x9e, 0x1f, 0x7f, 0xa3, 0xa0, 0x7e, 0xa4, 0x1b, 0xc6, 0xad, 0xc2, 0xc1, + 0x90, 0x1f, 0x4e, 0x69, 0xa, 0x5e, 0xa, 0x13, 0x30, 0x96, 0x72, 0x6f, + 0x96, 0x6d, 0x1b, 0x46, 0x7a, 0x57, 0x50, 0x7b, 0x1f, 0xe, 0x6c, 0xa, + 0xf8, 0xe6, 0xdc, 0x1, 0xf7, 0x18, 0xef, 0xf8, 0x59, 0xef, 0x3, 0xf7, + 0x21, 0xf7, 0xbb, 0x15, 0xfb, 0x40, 0xf5, 0xfb, 0x22, 0xf7, 0x47, 0xf7, + 0x60, 0xf7, 0x34, 0xf7, 0x54, 0xf7, 0x80, 0xf7, 0x52, 0xfb, 0x1, 0xf7, + 0x1e, 0xfb, 0x47, 0xfb, 0x55, 0xfb, 0x3c, 0xfb, 0x3f, 0xfb, 0xa3, 0x1e, + 0xe5, 0x16, 0xf7, 0x89, 0xf7, 0x28, 0xf7, 0x8, 0xf7, 0xf, 0xf0, 0xec, + 0x30, 0xfb, 0x30, 0xfb, 0x46, 0xfb, 0x2, 0xfb, 0x3d, 0xfb, 0x31, 0x27, + 0x25, 0xdc, 0xf7, 0x2c, 0x1e, 0xe, 0xf9, 0x52, 0x78, 0xdc, 0x46, 0xd0, + 0x46, 0xde, 0xf7, 0x8f, 0xde, 0xf7, 0x7b, 0xdf, 0x46, 0xdc, 0x12, 0xed, + 0xe8, 0x13, 0x3a, 0xf8, 0xa6, 0x84, 0x15, 0xf8, 0x67, 0x6, 0x9d, 0xde, + 0x5, 0xfc, 0x3, 0x6, 0xc2, 0xf7, 0x8f, 0x5, 0xf7, 0xd4, 0x6, 0x9d, + 0xde, 0x5, 0xfb, 0xd4, 0x6, 0xbd, 0xf7, 0x7b, 0x5, 0xf7, 0xdb, 0x6, + 0x9d, 0xdf, 0x5, 0xfc, 0x41, 0x6, 0x78, 0x34, 0x5, 0x13, 0x96, 0xdb, + 0x51, 0x3c, 0x9e, 0x52, 0x1b, 0xfb, 0x66, 0xfb, 0x3a, 0xfb, 0x4b, 0xfb, + 0x93, 0xfb, 0x69, 0xf7, 0xe, 0x22, 0xf7, 0x26, 0xf2, 0xba, 0xb6, 0xa0, + 0xa5, 0x1f, 0x13, 0x56, 0xfb, 0xf3, 0xf7, 0x92, 0x15, 0xf7, 0x2c, 0xf7, + 0x3, 0xf7, 0x61, 0xf7, 0x39, 0xde, 0xdc, 0x4f, 0x25, 0x59, 0x6c, 0xfb, + 0x32, 0x74, 0x50, 0x1e, 0x6d, 0x80, 0x59, 0xfb, 0x1b, 0xfb, 0x21, 0x1b, + 0xfb, 0x23, 0x62, 0xef, 0xf7, 0x1d, 0x1f, 0xe, 0xf8, 0x74, 0x78, 0xdd, + 0xf9, 0x7e, 0x76, 0xf7, 0x21, 0x77, 0x1, 0xf4, 0xf0, 0xf8, 0x9b, 0xf0, + 0x3, 0xf8, 0x51, 0xf9, 0xa8, 0x15, 0xda, 0x6, 0xf7, 0x1d, 0x6d, 0xa, + 0xfb, 0xa, 0x6, 0xfc, 0x4a, 0x28, 0xa, 0xf8, 0x74, 0x78, 0xdd, 0xf9, + 0xc4, 0xbd, 0x1, 0xf4, 0xf0, 0xf7, 0xc4, 0xf2, 0xf7, 0x4, 0xf0, 0x3, + 0xf8, 0x8, 0xf9, 0xa9, 0x15, 0xec, 0x6, 0xe0, 0xe5, 0xb4, 0x31, 0x5, + 0xdd, 0x6, 0x4b, 0xf7, 0x20, 0x5, 0x24, 0x6, 0xfc, 0x29, 0x28, 0xa, + 0x6c, 0xa, 0xf9, 0x74, 0xf2, 0x1, 0x68, 0xa, 0x3, 0xf4, 0xf7, 0xc1, + 0x21, 0xa, 0xf8, 0x1, 0xf8, 0x8a, 0x15, 0xec, 0x6, 0xa2, 0xf2, 0x57, + 0xa, 0xfb, 0x68, 0x24, 0x15, 0xec, 0x6, 0xa1, 0xf2, 0x5, 0x2a, 0x6, + 0xe, 0xf8, 0x74, 0x78, 0xdd, 0xf8, 0xef, 0xdd, 0x1, 0x68, 0xa, 0x3, + 0xf8, 0x94, 0xf9, 0xa9, 0x15, 0xd4, 0x6, 0x4f, 0xf7, 0x20, 0x5, 0xfb, + 0x5, 0x6, 0xfb, 0xc7, 0x28, 0xa, 0xf8, 0x74, 0x8d, 0x76, 0xae, 0xdf, + 0xf8, 0x9b, 0xdf, 0xad, 0x77, 0x1, 0xbb, 0xe0, 0xf8, 0x97, 0xe5, 0x3, + 0xa6, 0x9b, 0x15, 0xba, 0x68, 0xdd, 0xe3, 0x5, 0x67, 0xc3, 0xcd, 0x7a, + 0xcf, 0x1b, 0xf7, 0x77, 0xf7, 0x39, 0xf7, 0x43, 0xf7, 0x65, 0xce, 0x81, + 0xdd, 0x4e, 0xcb, 0x1f, 0xdf, 0xe3, 0x5c, 0xaf, 0x3a, 0x34, 0x5, 0xbe, + 0x3b, 0x33, 0x8d, 0x6f, 0x1b, 0xfb, 0x84, 0xfb, 0x1f, 0xfb, 0x54, 0xfb, + 0x5c, 0x4e, 0x92, 0x3e, 0xc3, 0x49, 0x1f, 0xc8, 0xc8, 0x15, 0x6c, 0xb2, + 0x83, 0xc6, 0xba, 0x1a, 0xf7, 0x3b, 0xf7, 0x1a, 0xf7, 0x1f, 0xf7, 0x35, + 0xc0, 0xc3, 0x81, 0x74, 0xa6, 0x1e, 0xfb, 0xf3, 0xfc, 0x5c, 0x15, 0xf8, + 0x1b, 0xf8, 0x35, 0x5, 0x9e, 0x6e, 0xa4, 0x55, 0x49, 0x1a, 0xfb, 0x2c, + 0xfb, 0x13, 0xfb, 0x26, 0xfb, 0x39, 0x5a, 0x52, 0x8e, 0xa6, 0x66, 0x1e, + 0xe, 0x6c, 0xa, 0xf9, 0x7b, 0xf7, 0x1, 0x8e, 0x77, 0x12, 0x68, 0xa, + 0x13, 0xd8, 0xf7, 0xf9, 0xf9, 0xb9, 0x15, 0xcb, 0x6, 0xa4, 0x90, 0x97, + 0x9c, 0xa4, 0x1b, 0xa7, 0xa0, 0x83, 0x82, 0x9e, 0x1f, 0x7f, 0xa4, 0xa0, + 0x7d, 0xa6, 0x1b, 0xc8, 0xae, 0xc2, 0xc2, 0x90, 0x1f, 0x4d, 0x69, 0xa, + 0x70, 0x1b, 0x13, 0xb8, 0x7b, 0x75, 0x96, 0x96, 0x71, 0x1f, 0x95, 0x73, + 0x6f, 0x95, 0x6e, 0x1b, 0x13, 0xd8, 0x44, 0x79, 0x57, 0x4f, 0x7c, 0x1f, + 0xfb, 0x90, 0xfc, 0x8c, 0x21, 0xa, 0xe, 0x35, 0xa, 0xf7, 0xb6, 0xdc, + 0xf7, 0xa0, 0xda, 0x1, 0xf9, 0x16, 0xea, 0x3, 0xe1, 0x16, 0xeb, 0x6, + 0xc7, 0xf7, 0xb6, 0x5, 0xf7, 0x47, 0x6, 0xf7, 0x32, 0xf7, 0x32, 0xd7, + 0xf7, 0x40, 0xf7, 0x1b, 0x33, 0xb8, 0xfb, 0x7, 0x1f, 0xfb, 0xbf, 0x6, + 0xa3, 0xfb, 0xef, 0x15, 0xc2, 0xf7, 0xa0, 0x5, 0xf7, 0x4c, 0x6, 0xd1, + 0xd5, 0x8a, 0x27, 0xfb, 0x1c, 0xfb, 0x18, 0x6c, 0x2d, 0x1f, 0xe, 0xf8, + 0x74, 0x68, 0x76, 0xcf, 0xd8, 0xf8, 0xcf, 0xd8, 0x1, 0xf7, 0x1c, 0xf0, + 0xf8, 0x7c, 0xf0, 0x3, 0xf8, 0xcd, 0xb7, 0x15, 0xb0, 0x5f, 0xb0, 0x6c, + 0xb1, 0x72, 0xb3, 0xc3, 0x18, 0x7d, 0x95, 0x5e, 0xa6, 0x69, 0xb5, 0x8, + 0xef, 0xd8, 0xc9, 0xf7, 0xf, 0xf7, 0x23, 0x1a, 0xf7, 0x4a, 0xfb, 0x1, + 0xf7, 0x19, 0xfb, 0x49, 0xfb, 0x75, 0xfb, 0x1a, 0xfb, 0x67, 0xfb, 0x60, + 0xfb, 0xb9, 0xf7, 0x7b, 0x7a, 0xcb, 0xb6, 0xb9, 0x95, 0xa1, 0xb7, 0x1e, + 0xfb, 0x24, 0xf7, 0x10, 0x15, 0xac, 0x7a, 0x9f, 0x7c, 0xad, 0x6c, 0x8, + 0x80, 0x6d, 0x6c, 0x86, 0x6c, 0x1b, 0x53, 0xfb, 0x18, 0xbb, 0xf7, 0x4d, + 0xf7, 0x52, 0xf7, 0xa, 0xf7, 0x28, 0xf7, 0x2d, 0xe5, 0xf5, 0x3d, 0xfb, + 0x34, 0x26, 0x60, 0xfb, 0x7, 0x37, 0x49, 0x1f, 0x83, 0x94, 0x76, 0x9f, + 0x6c, 0xad, 0x55, 0xa3, 0x19, 0xe, 0xf8, 0x3c, 0xa0, 0x76, 0xf7, 0xd2, + 0xd8, 0xf7, 0x88, 0xda, 0x1, 0xf9, 0x3d, 0xe7, 0x3, 0xe3, 0x16, 0xeb, + 0x6, 0xcd, 0xf7, 0xd2, 0x5, 0xf7, 0x2, 0x6, 0xf7, 0x10, 0xaf, 0x2f, + 0x2e, 0xaf, 0x1f, 0xbf, 0xfb, 0x19, 0x5, 0xf6, 0x6, 0x54, 0xf7, 0x19, + 0x6d, 0xd3, 0x64, 0xd2, 0x4d, 0xb9, 0x19, 0xbe, 0x92, 0xf7, 0x55, 0xa4, + 0xf7, 0x4f, 0x1a, 0xf7, 0x43, 0xfb, 0x25, 0x8d, 0x30, 0x1e, 0xfb, 0xbf, + 0x6, 0xa8, 0xfb, 0xd7, 0x15, 0xbd, 0xf7, 0x88, 0x5, 0xf7, 0x70, 0x6, + 0xbe, 0xe8, 0x87, 0x2d, 0xfb, 0x27, 0xfb, 0x2a, 0x8c, 0xfb, 0x19, 0x1f, + 0xe, 0xf8, 0x5, 0x78, 0xdb, 0xf8, 0xe8, 0xdb, 0x12, 0xe5, 0xeb, 0x86, + 0xea, 0xf7, 0xaf, 0xee, 0x62, 0xeb, 0x13, 0xe8, 0xe5, 0xf7, 0x7a, 0x15, + 0xfb, 0x48, 0xf7, 0x1c, 0x46, 0xf7, 0x28, 0xf7, 0x43, 0xf7, 0x1, 0xe6, + 0xf7, 0x9, 0xf7, 0xb, 0x36, 0xb7, 0xfb, 0x21, 0xc8, 0x1e, 0x13, 0xd4, + 0xfb, 0x0, 0xba, 0x5b, 0x9d, 0xca, 0x1a, 0xe8, 0xf7, 0x4, 0xa2, 0xba, + 0xe1, 0xeb, 0x53, 0x2f, 0x1e, 0xeb, 0x92, 0x5, 0xe0, 0x49, 0xf7, 0x1c, + 0xfb, 0x64, 0xfb, 0x2a, 0xfb, 0x0, 0x41, 0xfb, 0xe, 0xfb, 0xe, 0xf7, + 0x0, 0x5e, 0xf7, 0x0, 0x5c, 0x1e, 0x13, 0xe8, 0xf5, 0x5d, 0xc3, 0x70, + 0x4a, 0x1a, 0x4a, 0x4e, 0x4c, 0xfb, 0xd, 0xfb, 0x40, 0x78, 0xe6, 0xe1, + 0x1e, 0xe, 0xf8, 0x5, 0x78, 0xdd, 0xf8, 0xf1, 0xdd, 0xb2, 0xf7, 0x20, + 0x12, 0xe5, 0xec, 0x86, 0xeb, 0xf7, 0xb1, 0xef, 0x13, 0xf4, 0xe5, 0xf7, + 0x7f, 0x15, 0xfb, 0x4c, 0xf7, 0x1d, 0x45, 0xf7, 0x29, 0xf7, 0x45, 0xf7, + 0x2, 0xe6, 0xf7, 0xc, 0xf7, 0xf, 0x35, 0xb6, 0xfb, 0x22, 0xcb, 0x1e, + 0x13, 0xec, 0xfb, 0x1, 0xbb, 0x5b, 0x9c, 0xcc, 0x1a, 0xea, 0xf7, 0x3, + 0xa0, 0xbc, 0xe1, 0xe7, 0x62, 0xfb, 0x0, 0x1e, 0xec, 0x93, 0x5, 0xeb, + 0x4e, 0xf7, 0x13, 0xfb, 0x66, 0xfb, 0x2b, 0xfb, 0x1, 0x41, 0xfb, 0x10, + 0xfb, 0x11, 0xf7, 0x1, 0x5d, 0xf7, 0x0, 0x5b, 0x1e, 0xf6, 0x5e, 0xc4, + 0x6e, 0x48, 0x1a, 0x4a, 0x4e, 0x4b, 0xfb, 0xf, 0x1e, 0x13, 0xf4, 0xfb, + 0x20, 0x5a, 0xe0, 0xea, 0x88, 0x1f, 0xf7, 0x70, 0xf8, 0xb6, 0x15, 0xef, + 0x6, 0xf7, 0x1b, 0xf7, 0x20, 0x5, 0x2d, 0x6, 0x38, 0x31, 0x63, 0xe5, + 0x5, 0x39, 0x6, 0xe, 0xf7, 0xcd, 0xa0, 0x76, 0xf9, 0x11, 0xdc, 0x1, + 0xf7, 0x94, 0x16, 0xee, 0x6, 0xf7, 0x1c, 0xf9, 0x11, 0x5, 0xf7, 0x85, + 0x6b, 0xa, 0xfc, 0xdc, 0x6, 0x79, 0x3a, 0x5, 0xf7, 0x89, 0x6, 0xe, + 0x35, 0xa, 0xf7, 0x26, 0xdc, 0xf7, 0xa0, 0xda, 0xf7, 0x24, 0x77, 0x1, + 0xf8, 0xfd, 0xea, 0x3, 0xe1, 0x16, 0xeb, 0x6, 0xaa, 0xf7, 0x26, 0x5, + 0xf7, 0x47, 0x6, 0xf7, 0x33, 0xf7, 0x35, 0xcd, 0xf7, 0x41, 0xf7, 0x1c, + 0x30, 0xc0, 0xfb, 0x7, 0x1f, 0xfb, 0x61, 0x6, 0xaa, 0xf7, 0x24, 0x50, + 0xa, 0x85, 0xfc, 0x7f, 0x15, 0xc2, 0xf7, 0xa0, 0x5, 0xf7, 0x4d, 0x6, + 0xd1, 0xd8, 0x82, 0x26, 0xfb, 0x1d, 0xfb, 0x1b, 0x76, 0x2c, 0x1f, 0xe, + 0xf8, 0x3c, 0x78, 0xdd, 0xf9, 0x23, 0x42, 0xa, 0xf7, 0x77, 0xf9, 0x62, + 0x15, 0x8f, 0xfb, 0x0, 0xfc, 0x7b, 0x65, 0xfb, 0x22, 0xf7, 0x9, 0x45, + 0xf7, 0x27, 0xf7, 0x91, 0xbb, 0xf7, 0x7a, 0xde, 0x9d, 0x1f, 0xe6, 0xf8, + 0x3c, 0x57, 0xa, 0x30, 0xfc, 0x3c, 0x5, 0xfb, 0x10, 0x72, 0x5c, 0x20, + 0xfb, 0x2e, 0x1b, 0x39, 0x3b, 0xb7, 0xe1, 0x1f, 0xf4, 0xf8, 0xa1, 0x5, + 0xe, 0xf8, 0x3c, 0x78, 0xdf, 0xf9, 0x31, 0x77, 0xe9, 0x76, 0xf7, 0x22, + 0x42, 0xa, 0xf8, 0x49, 0xf9, 0xa7, 0x15, 0xd5, 0x6, 0xf7, 0x19, 0xf7, + 0x22, 0x5, 0xfb, 0x7, 0x6, 0xfb, 0xc1, 0xfb, 0x57, 0x15, 0x8b, 0x22, + 0xfc, 0x85, 0x64, 0x1a, 0xfb, 0x25, 0xf7, 0xa, 0x43, 0xf7, 0x28, 0xf7, + 0x90, 0xbb, 0xf7, 0x7f, 0xe1, 0x9c, 0x1e, 0xe6, 0xf8, 0x44, 0x57, 0xa, + 0x32, 0xfc, 0x44, 0x5, 0xfb, 0xb, 0x75, 0x48, 0xfb, 0xa, 0xfb, 0x1e, + 0x1b, 0x3a, 0x39, 0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xac, 0x5, 0xe, 0xf8, + 0x3c, 0x78, 0xdf, 0xf9, 0x32, 0x42, 0xa, 0xf8, 0x2, 0xf9, 0xa8, 0x15, + 0xe8, 0x6, 0xdd, 0xe5, 0xb3, 0x31, 0x5, 0xdb, 0x6, 0x4d, 0xf7, 0x21, + 0x47, 0xa, 0xfb, 0xa3, 0xfb, 0x56, 0x2c, 0xa, 0xf8, 0x3c, 0x78, 0xde, + 0xf9, 0x2b, 0x77, 0xf7, 0x56, 0x42, 0xa, 0xf8, 0xcb, 0xf9, 0xb2, 0x15, + 0xe9, 0x6, 0xa0, 0xf2, 0x5, 0x2d, 0x6, 0xfb, 0x62, 0x24, 0x15, 0xe9, + 0x6, 0xa1, 0xf2, 0x5, 0x2d, 0x6, 0xfb, 0x44, 0xfb, 0x3a, 0x2c, 0xa, + 0xf8, 0x3c, 0x78, 0xdf, 0xf9, 0x33, 0x77, 0xd4, 0xf7, 0x20, 0x1, 0xf7, + 0xf, 0xeb, 0x3, 0xf7, 0x77, 0xf9, 0x74, 0x15, 0x8b, 0x23, 0xfc, 0x87, + 0x64, 0x1a, 0xfb, 0x25, 0xf7, 0x9, 0x43, 0xf7, 0x27, 0xf7, 0x92, 0xbb, + 0xf7, 0x80, 0xe0, 0x9d, 0x1e, 0xe5, 0xf8, 0x46, 0x57, 0xa, 0x33, 0xfc, + 0x46, 0x5, 0xfb, 0xb, 0x74, 0x48, 0xfb, 0xa, 0xfb, 0x1f, 0x1b, 0x39, + 0x3a, 0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xae, 0x5, 0xf7, 0x4e, 0xc0, 0x15, + 0xd2, 0x6, 0x50, 0xf7, 0x20, 0x5, 0xfb, 0x2, 0x6, 0xe, 0xf8, 0x5, + 0x2d, 0xa, 0xf7, 0xcc, 0x16, 0xf1, 0x6, 0xf8, 0x16, 0xf9, 0x62, 0x5, + 0x28, 0x6, 0xfb, 0xd5, 0xfc, 0xfd, 0xfb, 0x7, 0xf8, 0xfd, 0x3d, 0xa, + 0xe, 0xf9, 0x1a, 0x2d, 0xa, 0xf7, 0x52, 0xdf, 0xf7, 0xe6, 0xd9, 0xf7, + 0xbc, 0xea, 0x3, 0xf7, 0x68, 0x16, 0xec, 0x6, 0xf7, 0xb3, 0xf8, 0xd0, + 0x48, 0xa, 0xa7, 0xfc, 0xd0, 0x5, 0xf0, 0x6, 0xf7, 0xf6, 0xf9, 0x62, + 0x4d, 0xa, 0xfb, 0xac, 0xfc, 0xe5, 0x4e, 0xa, 0x70, 0xf8, 0xe5, 0x5, + 0x2a, 0x6, 0xfb, 0xb9, 0xfc, 0xde, 0x89, 0x8d, 0x76, 0xf8, 0xdc, 0x4d, + 0xa, 0xe, 0xf8, 0x5, 0x2d, 0xa, 0x9e, 0x16, 0xf7, 0xe, 0x6, 0xf7, + 0x92, 0xf7, 0xb4, 0xf7, 0x2b, 0xfb, 0xb4, 0x5, 0xef, 0x6, 0xfb, 0x51, + 0xf7, 0xee, 0xf7, 0xe1, 0xf8, 0x8, 0x5, 0xfb, 0xc, 0x6, 0xfb, 0x98, + 0xfb, 0xbc, 0xfb, 0x30, 0xf7, 0xbc, 0x5, 0x26, 0x6, 0xf7, 0x57, 0xfb, + 0xf8, 0x5, 0xe, 0xf8, 0x5, 0x2d, 0xa, 0xf7, 0x3b, 0xef, 0xf8, 0x40, + 0xf7, 0x3, 0x3, 0xf7, 0xda, 0x16, 0xe8, 0x6, 0xc2, 0xf7, 0xa1, 0xf7, + 0xe0, 0xf8, 0x55, 0x51, 0xa, 0xfb, 0xf9, 0xfb, 0x3d, 0xf7, 0xf9, 0x47, + 0xa, 0xf7, 0x6b, 0xfc, 0x4d, 0x5, 0xe, 0x35, 0xa, 0xfa, 0x35, 0x77, + 0x1, 0xf7, 0xda, 0x16, 0xe7, 0x6, 0xc3, 0xf7, 0xaa, 0xf7, 0xe0, 0xf8, + 0x5f, 0x51, 0xa, 0xfc, 0x0, 0xfb, 0x3d, 0xf8, 0x0, 0x47, 0xa, 0xf7, + 0x6a, 0xfc, 0x57, 0x5, 0xb1, 0xf8, 0x8c, 0x15, 0xd2, 0x6, 0xf7, 0x13, + 0x6f, 0xa, 0xfb, 0x1, 0x6, 0xe, 0x35, 0xa, 0xf9, 0x6d, 0x77, 0xe5, + 0xf1, 0x1, 0xf7, 0xda, 0x16, 0xe7, 0x6, 0xc3, 0xf7, 0xa6, 0xf7, 0xe0, + 0xf8, 0x5b, 0x51, 0xa, 0xfb, 0xfd, 0xfb, 0x3d, 0xf7, 0xfd, 0x47, 0xa, + 0xf7, 0x6a, 0xfc, 0x5b, 0x5, 0xf7, 0x36, 0xf8, 0xa1, 0x15, 0xe5, 0x6, + 0x9f, 0xf1, 0x3f, 0xa, 0xfb, 0x57, 0x25, 0x15, 0xe4, 0x6, 0xa0, 0xf1, + 0x3e, 0xa, 0xf7, 0xcd, 0x8b, 0xdc, 0xf8, 0xc0, 0xdc, 0x1, 0x84, 0x16, + 0xf9, 0x2, 0x6, 0x9f, 0xdc, 0x5, 0xfc, 0x7f, 0x6, 0xf8, 0xe0, 0xf8, + 0xc6, 0x94, 0xd6, 0x5, 0xfc, 0xd8, 0x6, 0x77, 0x3a, 0xf8, 0x5d, 0x8c, + 0xfc, 0xe6, 0xfc, 0xca, 0x5, 0xe, 0xf7, 0xcd, 0x8b, 0xdf, 0xf9, 0x56, + 0xf7, 0x1f, 0x1, 0x84, 0x16, 0xf8, 0xf8, 0x6, 0x9f, 0xdf, 0x5, 0xfc, + 0x75, 0x6, 0xf8, 0xe0, 0xf8, 0xd6, 0x94, 0xd8, 0x5, 0xfc, 0xd8, 0x6, + 0x77, 0x37, 0xf8, 0x57, 0x8a, 0xfc, 0xe0, 0xfc, 0xd8, 0x5, 0xf8, 0x24, + 0xf9, 0x60, 0x15, 0xf7, 0x6, 0x6, 0xf7, 0x2d, 0x6f, 0xa, 0x20, 0x6, + 0x2d, 0x31, 0x5d, 0xe5, 0x45, 0xa, 0xe, 0x7c, 0xd1, 0x66, 0x76, 0xf7, + 0x8b, 0xcd, 0xf7, 0x2e, 0xd5, 0x12, 0xc8, 0xe7, 0x13, 0x78, 0xf8, 0x3c, + 0x88, 0x15, 0xe8, 0x6, 0x85, 0xa7, 0x87, 0x9f, 0xa3, 0x1a, 0xae, 0x91, + 0xad, 0x92, 0xad, 0x1e, 0xaa, 0xf7, 0x17, 0x5, 0x91, 0xa4, 0x8d, 0xa4, + 0xa2, 0x1a, 0xe7, 0x51, 0xd1, 0xfb, 0x25, 0x40, 0xfb, 0x25, 0x60, 0xfb, + 0xb, 0x73, 0x1e, 0xe9, 0x83, 0x5, 0xd8, 0xa7, 0xc6, 0x9e, 0xc6, 0x1b, + 0x13, 0xb8, 0xc1, 0xe3, 0x7b, 0xfb, 0xb, 0x6a, 0x1f, 0x65, 0x7d, 0x64, + 0x89, 0x3d, 0x88, 0x8, 0x4d, 0x89, 0xfb, 0x4b, 0x83, 0xfb, 0x36, 0x1a, + 0x29, 0xd6, 0x54, 0xe6, 0x1e, 0xe8, 0xca, 0xc0, 0xa5, 0xa9, 0x1f, 0x8c, + 0x7f, 0x8d, 0x6e, 0x93, 0x71, 0x8, 0xa2, 0xf7, 0xa1, 0x15, 0x82, 0x56, + 0x80, 0x5f, 0x71, 0x66, 0x8, 0x5a, 0x69, 0x53, 0x6f, 0x53, 0x1b, 0x3c, + 0x74, 0xb7, 0xb2, 0xe0, 0xe8, 0x9a, 0xc7, 0x91, 0x1f, 0xdd, 0x92, 0xa4, + 0x8d, 0xad, 0x98, 0x8, 0xe, 0x4a, 0xa, 0xf8, 0x39, 0x77, 0x12, 0xc8, + 0xea, 0xf7, 0xe1, 0xed, 0x13, 0x7c, 0xf7, 0xcf, 0xf8, 0xe9, 0x15, 0xda, + 0x6, 0xf7, 0x21, 0xf7, 0x1d, 0x5, 0xfb, 0xd, 0x6, 0x90, 0xfd, 0x75, + 0x22, 0xa, 0xe, 0x4a, 0xa, 0xf7, 0xb0, 0xf7, 0x1d, 0x12, 0x13, 0x70, + 0xf7, 0x7b, 0xf8, 0xe9, 0x15, 0xe8, 0x6, 0xdd, 0xe2, 0xb3, 0x34, 0x5, + 0xdb, 0x6, 0x4d, 0xf7, 0x1d, 0x47, 0xa, 0xc2, 0xfd, 0x75, 0x20, 0xa, + 0x13, 0xb0, 0x2b, 0xa, 0xae, 0xf8, 0xfa, 0x76, 0xf7, 0x21, 0x77, 0x1, + 0xf7, 0x8c, 0xf8, 0xe5, 0x15, 0xdd, 0x6, 0xf7, 0x25, 0x6d, 0xa, 0xfb, + 0x11, 0x6, 0xe, 0x7c, 0xd0, 0x67, 0x76, 0xf7, 0x8a, 0xcd, 0xf7, 0xbe, + 0xee, 0x12, 0xc8, 0xe5, 0xf7, 0xcf, 0xe8, 0x13, 0x7c, 0xf8, 0x44, 0xf8, + 0xf3, 0x15, 0xe9, 0x6, 0xa1, 0xee, 0x4d, 0xa, 0xfb, 0x62, 0x28, 0x15, + 0xea, 0x6, 0xa0, 0xee, 0x5, 0x2d, 0x6, 0xf7, 0x2a, 0xfd, 0x59, 0x22, + 0xa, 0xe, 0xf8, 0xe3, 0x7c, 0xd1, 0xf7, 0x4c, 0xcf, 0xf7, 0x35, 0xd0, + 0x8c, 0x77, 0x12, 0xc8, 0xe6, 0x13, 0xe8, 0xf8, 0x47, 0xf1, 0x15, 0x44, + 0xa8, 0xe3, 0x5d, 0xd6, 0x1b, 0xf7, 0x39, 0xcc, 0xf7, 0x1b, 0xbb, 0xa2, + 0x1f, 0x2f, 0x93, 0x5, 0x33, 0x5f, 0x4c, 0x6e, 0x57, 0x1b, 0x44, 0x50, + 0xcd, 0xf7, 0x6, 0x99, 0x1f, 0xf8, 0x19, 0x6, 0x8d, 0x9a, 0x90, 0xad, + 0xa9, 0x1a, 0xf7, 0x7, 0x46, 0xf3, 0xfb, 0x20, 0x49, 0x4b, 0x72, 0x5c, + 0x5d, 0x1e, 0x13, 0xd8, 0x9f, 0x7c, 0x5f, 0xc0, 0xfb, 0x0, 0x1b, 0xfb, + 0x2, 0x2c, 0x5c, 0xfb, 0x7, 0x65, 0x1f, 0xe4, 0x84, 0x5, 0x13, 0xe8, + 0xa6, 0x97, 0xa7, 0xd3, 0xf7, 0x4, 0x1b, 0xd7, 0xb9, 0x51, 0x38, 0x65, + 0x1f, 0x30, 0x76, 0xfb, 0xe, 0x89, 0x58, 0x7c, 0x8, 0x2f, 0x6f, 0x75, + 0x45, 0x57, 0x1a, 0x48, 0xb2, 0x34, 0xf7, 0x16, 0xf6, 0xc0, 0xc4, 0xc7, + 0xb8, 0x1e, 0x81, 0xf7, 0x30, 0x15, 0x54, 0x82, 0x67, 0xfb, 0x28, 0xfb, + 0x14, 0x1b, 0x42, 0x70, 0xb6, 0xb4, 0xde, 0xdc, 0x96, 0xc9, 0x91, 0x1f, + 0xd8, 0x92, 0xa3, 0x91, 0xa8, 0x91, 0x8, 0xf4, 0xbc, 0x15, 0xec, 0xa6, + 0xc8, 0xcb, 0xe1, 0x1b, 0xc8, 0xd8, 0x60, 0xfb, 0xa, 0x78, 0x1f, 0xe, + 0x4a, 0xa, 0xf7, 0xb0, 0xf7, 0x1d, 0x12, 0xc8, 0xe5, 0xf7, 0xcf, 0xe8, + 0x13, 0x7c, 0xf8, 0x37, 0x88, 0x22, 0xa, 0x4a, 0xf7, 0xdc, 0x56, 0xa, + 0xf7, 0x1d, 0x5, 0xfb, 0x2, 0x6, 0xe, 0xf8, 0x5, 0x7e, 0xd9, 0x50, + 0x76, 0xf9, 0x2b, 0xd1, 0x12, 0xd8, 0xe2, 0xcb, 0xe3, 0xf7, 0x30, 0xe4, + 0x13, 0xbc, 0xf7, 0x9e, 0xf8, 0x34, 0x15, 0x47, 0x6e, 0xfb, 0xd, 0x52, + 0xfb, 0x26, 0x1a, 0xfb, 0x7, 0xe3, 0x39, 0xf7, 0x14, 0xea, 0xbf, 0xb4, + 0xb6, 0xbf, 0x1e, 0x13, 0x7c, 0xa9, 0x63, 0xaf, 0x6b, 0x9c, 0x7d, 0xcd, + 0xbf, 0x18, 0x74, 0xa5, 0x6c, 0xac, 0x6f, 0xb0, 0xa6, 0xaa, 0xaf, 0xbb, + 0xa4, 0xbf, 0x40, 0xae, 0x18, 0x6a, 0x51, 0x76, 0x76, 0x7b, 0x79, 0x57, + 0xcc, 0x56, 0xea, 0x7c, 0xa6, 0x8, 0xdc, 0xb5, 0xed, 0xc3, 0xeb, 0x1a, + 0xca, 0x58, 0xd3, 0x23, 0xfb, 0x6, 0x4b, 0x2d, 0x3e, 0x58, 0x9b, 0x6d, + 0x9b, 0x67, 0x1e, 0xf7, 0x4a, 0xfb, 0xb9, 0x15, 0x13, 0xbc, 0x55, 0x57, + 0x59, 0x79, 0x60, 0x1b, 0x46, 0x4b, 0xb6, 0xd7, 0xe7, 0xe1, 0xbb, 0xbe, + 0xa3, 0x1f, 0xb1, 0x44, 0xcc, 0x31, 0xb1, 0x59, 0x8, 0x2e, 0xf7, 0xd2, + 0x15, 0x6d, 0xc4, 0x88, 0xa6, 0x93, 0x1a, 0xb9, 0xb2, 0xc2, 0xbd, 0xb1, + 0xa8, 0x6d, 0x66, 0x4a, 0x2d, 0x5c, 0x6e, 0x7d, 0x1e, 0xe, 0x7c, 0xd0, + 0x67, 0x76, 0xf7, 0x88, 0xcc, 0xf7, 0xa3, 0xb1, 0xf3, 0xb0, 0x12, 0xc8, + 0xe5, 0xf7, 0x22, 0xb0, 0xf6, 0xb1, 0x13, 0x7f, 0xf7, 0xb9, 0xf9, 0x2f, + 0x15, 0x59, 0xb5, 0x63, 0xbc, 0xbc, 0xb5, 0xb3, 0xbd, 0xbe, 0x62, 0xb1, + 0x59, 0x59, 0x62, 0x65, 0x58, 0x1e, 0xb0, 0x8a, 0x15, 0xa8, 0xa3, 0xa3, + 0xa9, 0xa8, 0xa3, 0x74, 0x6d, 0x6e, 0x73, 0x75, 0x6e, 0x6e, 0x72, 0xa1, + 0xa8, 0x1e, 0xe4, 0xfd, 0x31, 0x20, 0xa, 0x13, 0xbf, 0x2b, 0xa, 0xf7, + 0x3f, 0xf7, 0xb1, 0x76, 0xf8, 0x3c, 0x77, 0x1, 0xb5, 0xf7, 0x9c, 0x15, + 0xec, 0x6, 0xf7, 0x2a, 0xf7, 0xda, 0xf7, 0x2e, 0xfb, 0xda, 0x5, 0xeb, + 0x6, 0xfb, 0x63, 0xf8, 0x3c, 0x5, 0x37, 0x6, 0xe, 0xf7, 0xb2, 0xf7, + 0x49, 0xdf, 0x4b, 0x76, 0xc7, 0xe0, 0x8c, 0x77, 0x12, 0x13, 0x60, 0xf7, + 0x3, 0xf7, 0x48, 0x15, 0xa6, 0xa8, 0xaf, 0xac, 0xc2, 0x1b, 0xb6, 0xac, + 0x80, 0x7f, 0xa9, 0x1f, 0x13, 0x90, 0x7a, 0xb3, 0xae, 0x78, 0xb4, 0x1b, + 0xca, 0xb0, 0xa5, 0xa4, 0xa6, 0x1f, 0xe9, 0x7, 0x82, 0x82, 0x59, 0x57, + 0x4f, 0x1b, 0x60, 0x65, 0x9d, 0x9c, 0x63, 0x1f, 0x13, 0x60, 0x98, 0x6b, + 0x6a, 0x97, 0x66, 0x1b, 0x64, 0x58, 0x7e, 0x62, 0x66, 0x1f, 0xe, 0xe6, + 0xf8, 0x58, 0x76, 0xf7, 0xb3, 0x77, 0x1, 0xf7, 0xb6, 0xc5, 0x3, 0xf7, + 0x96, 0xf8, 0x43, 0x15, 0xc8, 0xee, 0xcb, 0x28, 0xc3, 0xb3, 0x3a, 0xe2, + 0xf7, 0x9, 0xa4, 0x75, 0xcd, 0xfb, 0x2, 0x5f, 0x95, 0xf7, 0x5, 0x47, + 0x8a, 0x95, 0xfb, 0x5, 0xfb, 0x1, 0xb7, 0x76, 0x49, 0xf7, 0x7, 0x73, + 0x3d, 0x33, 0x5, 0xe, 0xf9, 0xc6, 0x61, 0xcb, 0x4b, 0xf7, 0x56, 0x81, + 0xcc, 0xf7, 0xe9, 0xca, 0xeb, 0xcb, 0x12, 0xf7, 0x81, 0xca, 0xf2, 0xdb, + 0xf8, 0x7f, 0xcb, 0x13, 0xbf, 0xf9, 0x49, 0xf7, 0x6a, 0x15, 0x70, 0x8e, + 0x90, 0x5e, 0xd8, 0x1b, 0xf7, 0x12, 0xf7, 0x1a, 0xf7, 0x23, 0xf7, 0x3a, + 0xf7, 0x3c, 0xfb, 0x12, 0xf7, 0x3f, 0xfb, 0x87, 0xfb, 0xdf, 0x26, 0xfb, + 0xa6, 0xfb, 0x3e, 0xfb, 0x66, 0xf7, 0x19, 0xfb, 0x46, 0xf7, 0xc6, 0x1f, + 0x13, 0x5f, 0xf7, 0xaa, 0xea, 0xf7, 0x3d, 0xa4, 0x97, 0x1f, 0x3d, 0x6, + 0x13, 0xbf, 0x5f, 0x6d, 0x30, 0x35, 0xfb, 0x4c, 0x1b, 0xfb, 0x5e, 0xfb, + 0x44, 0xe0, 0xf7, 0x83, 0xf7, 0x63, 0xf7, 0x27, 0xf7, 0x41, 0xf7, 0x6d, + 0xf7, 0x3e, 0xf7, 0x20, 0xfb, 0x4, 0xfb, 0x37, 0xfb, 0x2a, 0xfb, 0xd, + 0x33, 0x5d, 0x1f, 0x67, 0x83, 0x94, 0xca, 0x94, 0xb4, 0xc9, 0xf7, 0xb6, + 0x18, 0x3e, 0x6, 0x7c, 0x48, 0x5, 0xd5, 0x5e, 0x4c, 0x90, 0x73, 0x1b, + 0xfb, 0xc, 0x23, 0xfb, 0x26, 0xfb, 0x1a, 0x26, 0xca, 0x33, 0xe9, 0xc8, + 0xbe, 0xbb, 0xa3, 0xa0, 0x1f, 0xfb, 0x66, 0xf7, 0x9, 0x15, 0xd9, 0xbf, + 0xf7, 0x1f, 0xec, 0xbb, 0xc1, 0x6b, 0x2d, 0xfb, 0x6, 0x39, 0x26, 0x40, + 0x5d, 0x5b, 0xb3, 0xdf, 0x1e, 0xe, 0x7c, 0xd0, 0x67, 0x76, 0xf7, 0x89, + 0xcd, 0xf0, 0xd5, 0xf7, 0x83, 0x77, 0x12, 0xc8, 0xea, 0xf7, 0xe1, 0xee, + 0x13, 0x7e, 0xf7, 0x7e, 0xf8, 0xf7, 0x15, 0xcd, 0x6, 0xa4, 0x91, 0x97, + 0x9c, 0xa5, 0x1b, 0xa5, 0xa4, 0x82, 0x81, 0xa2, 0x1f, 0x7f, 0xa6, 0xa3, + 0x7f, 0x9e, 0x1b, 0xca, 0xaf, 0xc2, 0xc1, 0x90, 0x1f, 0x4b, 0x6, 0x7d, + 0x87, 0x84, 0x72, 0x70, 0x1b, 0x7c, 0x77, 0x95, 0x95, 0x74, 0x1f, 0x96, + 0x72, 0x6e, 0x96, 0x67, 0x1b, 0x42, 0x79, 0x57, 0x50, 0x7a, 0x1f, 0xf7, + 0x4d, 0xfc, 0xfa, 0x20, 0xa, 0x13, 0xae, 0x2b, 0xa, 0x7c, 0xd3, 0x64, + 0x76, 0xf8, 0x61, 0xd4, 0xf7, 0x4f, 0x77, 0x12, 0xf8, 0x80, 0xe7, 0x13, + 0x78, 0xc5, 0x88, 0x15, 0xdd, 0x6, 0x9f, 0xee, 0x48, 0xa, 0x13, 0xb8, + 0x4a, 0x9e, 0xce, 0x5d, 0xd3, 0x1b, 0xf7, 0x13, 0xf7, 0x1d, 0xf7, 0x19, + 0xf7, 0x5a, 0xf7, 0x5a, 0xfb, 0x20, 0x9c, 0x66, 0x4c, 0x5d, 0x6e, 0x63, + 0x5d, 0x1f, 0xc2, 0xf7, 0x94, 0x3d, 0xa, 0x13, 0x78, 0x77, 0xfc, 0x8e, + 0x15, 0xdd, 0xcd, 0xf7, 0x38, 0xf7, 0xa, 0xea, 0x9d, 0x29, 0x5f, 0x1e, + 0x13, 0xb8, 0x42, 0x60, 0xfb, 0x4e, 0xfb, 0x1d, 0x6a, 0x37, 0x98, 0xf7, + 0x22, 0x1e, 0xe, 0x77, 0x8d, 0x76, 0xf9, 0x88, 0x77, 0x1, 0xf7, 0x20, + 0xf7, 0x5e, 0x3, 0xf7, 0x90, 0x78, 0x15, 0xe5, 0x6, 0xfb, 0x4, 0xf9, + 0x88, 0x3e, 0xa, 0x65, 0xfb, 0x64, 0x76, 0xfa, 0x5a, 0x77, 0x1, 0xd5, + 0xf7, 0x74, 0x3, 0xd5, 0xfb, 0x79, 0x15, 0xd7, 0x6, 0xf7, 0x28, 0xfa, + 0x5a, 0x5, 0x3f, 0x6, 0xe, 0xaf, 0xfb, 0x58, 0xd5, 0xf7, 0xee, 0xd9, + 0xf7, 0xed, 0xd5, 0x1, 0xe7, 0xf7, 0xf5, 0x3, 0xe7, 0xf7, 0x74, 0x15, + 0xeb, 0x82, 0x31, 0x2c, 0x7e, 0x1f, 0xfb, 0x26, 0x76, 0x89, 0x32, 0xf7, + 0x3c, 0x1b, 0x96, 0xd5, 0x5, 0x29, 0x8b, 0x94, 0xf7, 0x2c, 0xa3, 0x1f, + 0x9b, 0xf7, 0x6, 0x85, 0xd7, 0x3c, 0xad, 0xf6, 0xbb, 0x90, 0x9f, 0xa3, + 0xf7, 0x44, 0x8, 0xe3, 0x98, 0xa3, 0xbf, 0xdd, 0x1b, 0x96, 0xd5, 0x5, + 0xfb, 0x36, 0x72, 0x45, 0xfb, 0x24, 0x73, 0x1f, 0x2b, 0x7b, 0x79, 0xfb, + 0x1, 0x2a, 0x1b, 0xe, 0xaf, 0xfb, 0x58, 0xd5, 0xf7, 0xee, 0xd9, 0xf8, + 0x7, 0xd5, 0x1, 0x8b, 0xf7, 0xf6, 0x3, 0x96, 0xfb, 0xe, 0x15, 0x80, + 0x41, 0x5, 0xf7, 0x24, 0xb9, 0xd7, 0xf7, 0x13, 0x9f, 0x1f, 0xea, 0x9a, + 0xa2, 0xf7, 0xe, 0xe9, 0x1b, 0x97, 0xd9, 0x5, 0x2d, 0x91, 0xdd, 0xea, + 0x99, 0x1f, 0xf7, 0x28, 0xa1, 0x89, 0xea, 0xfb, 0x38, 0x1b, 0x80, 0x41, + 0x5, 0xee, 0x89, 0x7c, 0xfb, 0x2e, 0x74, 0x1f, 0x7a, 0xfb, 0x6, 0x92, + 0x48, 0xd9, 0x68, 0xfb, 0x0, 0x5b, 0x86, 0x6b, 0x71, 0xfb, 0x44, 0x8, + 0x33, 0x7e, 0x71, 0x62, 0x3d, 0x1b, 0xe, 0x5f, 0xa, 0xa0, 0xf8, 0x12, + 0x3, 0xf7, 0xf, 0xfb, 0x14, 0x15, 0xf7, 0x33, 0xf9, 0xa2, 0x5, 0xf6, + 0x6, 0x99, 0xcf, 0x5, 0xfb, 0x59, 0x6, 0xfb, 0x4d, 0xfe, 0x2a, 0x5, + 0xf7, 0x57, 0x6, 0x9a, 0xcf, 0x5, 0xe, 0x5f, 0xa, 0x7d, 0xf8, 0x12, + 0x3, 0xfb, 0x14, 0x4, 0x7d, 0x47, 0x5, 0xf7, 0x56, 0x6, 0xf7, 0x50, + 0xfa, 0x2a, 0x5, 0xfb, 0x54, 0x6, 0x7c, 0x47, 0x5, 0xf5, 0x6, 0xfb, + 0x36, 0xfd, 0xa2, 0x5, 0xe, 0xae, 0xf8, 0xe7, 0xca, 0x1, 0xf7, 0x3b, + 0xc8, 0x3, 0xf7, 0x3b, 0xf9, 0x6f, 0x15, 0x42, 0x8e, 0xb9, 0x4c, 0xe5, + 0x1b, 0xf7, 0x2, 0xb9, 0xe2, 0xbc, 0x99, 0x1f, 0x4e, 0x6, 0x73, 0x81, + 0x6f, 0x5a, 0x47, 0x1b, 0x53, 0x78, 0xa9, 0xb6, 0x85, 0x1f, 0xe, 0x65, + 0x8d, 0x76, 0xf9, 0x88, 0x77, 0x1, 0xf7, 0x4b, 0xf8, 0x3f, 0x15, 0xd8, + 0x6, 0xcb, 0xf7, 0xca, 0x5, 0x3e, 0x6, 0xfb, 0x31, 0xfd, 0x88, 0x15, + 0xd8, 0x6, 0xcb, 0xf7, 0xc9, 0x5, 0x3e, 0x6, 0xe, 0xbf, 0xf7, 0x73, + 0x76, 0xf7, 0xcf, 0x77, 0x1, 0xe6, 0xf7, 0xfd, 0x15, 0x34, 0xd3, 0x43, + 0xe4, 0xe3, 0xd4, 0xd3, 0xe2, 0xe1, 0x42, 0xd1, 0x33, 0x32, 0x43, 0x45, + 0x35, 0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd1, 0xf7, 0xc5, 0xf7, 0x46, 0x41, + 0xd5, 0x1, 0xd5, 0xea, 0xf7, 0xb8, 0xe7, 0x3, 0xf8, 0x3e, 0xf7, 0x52, + 0x15, 0x54, 0x78, 0x5c, 0x3b, 0x36, 0x1b, 0x72, 0x3a, 0x98, 0xf7, 0x12, + 0xbf, 0xa0, 0xf7, 0x6e, 0xf7, 0x36, 0xa6, 0xdd, 0x84, 0x28, 0x1f, 0xe7, + 0x90, 0x5, 0xf7, 0x1d, 0xfb, 0x4, 0xb1, 0x3b, 0xfb, 0x6d, 0x45, 0xfb, + 0x66, 0xfb, 0x1a, 0xfb, 0x26, 0xe7, 0x4c, 0xf7, 0x0, 0xf3, 0xe8, 0xc6, + 0xf7, 0x1d, 0xbb, 0x1e, 0xe, 0x53, 0xa, 0xf7, 0x83, 0xf8, 0xe5, 0x15, + 0xed, 0x6, 0xf7, 0x17, 0xf7, 0x21, 0x3d, 0xa, 0x3a, 0x31, 0x64, 0xe5, + 0x5, 0x3c, 0x6, 0xe, 0xf7, 0x5e, 0xfb, 0x60, 0x76, 0xf7, 0x58, 0xd1, + 0xf7, 0xce, 0xf7, 0x4b, 0x40, 0xd6, 0x1, 0xd5, 0xea, 0xf7, 0x3, 0xdd, + 0xee, 0xe6, 0x3, 0xf7, 0x63, 0x2d, 0x15, 0xa7, 0xb8, 0x8e, 0x68, 0x5c, + 0x3c, 0x91, 0x5b, 0x1f, 0x78, 0x53, 0x5, 0x8a, 0x9e, 0xa1, 0x8a, 0x9e, + 0x1b, 0xb2, 0xf7, 0x15, 0x98, 0xe3, 0x9d, 0x83, 0xbb, 0x41, 0x1f, 0x97, + 0xa8, 0x5, 0xf7, 0x1, 0xd9, 0xe1, 0xf7, 0x6, 0xb3, 0x1f, 0x2f, 0x95, + 0x5, 0x53, 0x78, 0x5b, 0x37, 0x36, 0x1b, 0x63, 0x49, 0xb3, 0xf5, 0xdc, + 0xa8, 0xf7, 0x57, 0xf7, 0x2f, 0xa6, 0xdc, 0x74, 0x33, 0x1f, 0xe6, 0x91, + 0x5, 0xf7, 0x20, 0xfb, 0x3, 0xb3, 0x3b, 0xfb, 0x68, 0x40, 0xfb, 0x61, + 0xfb, 0x26, 0xfb, 0x44, 0xf7, 0x11, 0x62, 0xae, 0x8e, 0x1e, 0xe, 0xae, + 0xfb, 0x60, 0x76, 0xf7, 0x75, 0x77, 0x12, 0xf7, 0x2e, 0xd9, 0x17, 0xee, + 0x16, 0x78, 0x38, 0x5, 0xb8, 0xa8, 0x79, 0x6f, 0x67, 0x4b, 0x8d, 0x7d, + 0x66, 0x7f, 0x8d, 0x8c, 0x7b, 0x1f, 0x13, 0xe0, 0x82, 0x4f, 0x5, 0x87, + 0xa2, 0xa9, 0x8a, 0xa2, 0x1b, 0xa7, 0xf7, 0x12, 0x90, 0xe6, 0x96, 0x88, + 0xc6, 0x3d, 0x98, 0x1f, 0x95, 0xb9, 0x5, 0xe, 0xad, 0xc1, 0xf7, 0xd8, + 0xc5, 0x1, 0xf6, 0x2a, 0x15, 0xc4, 0x79, 0xe0, 0xf7, 0x2d, 0x5, 0x89, + 0x94, 0x9b, 0x89, 0xa4, 0x1b, 0xf2, 0xed, 0xb7, 0xf7, 0x1, 0xbd, 0x1f, + 0x40, 0x92, 0x5, 0x61, 0x78, 0x46, 0x4b, 0x34, 0x1b, 0x82, 0x83, 0x8d, + 0x8c, 0x87, 0x1f, 0xf7, 0x40, 0xf7, 0xca, 0xb4, 0x75, 0x9e, 0x68, 0x8c, + 0x78, 0x19, 0xd3, 0x8f, 0x5, 0x9f, 0x7d, 0xd7, 0x32, 0xa7, 0x1e, 0xdf, + 0xf7, 0x2c, 0x53, 0x9d, 0x34, 0xfb, 0x33, 0x5, 0x8c, 0x83, 0x82, 0x8c, + 0x7a, 0x1b, 0xfb, 0x71, 0x43, 0xfb, 0x3a, 0x23, 0x5d, 0x9a, 0x4e, 0xdd, + 0x68, 0x1f, 0xac, 0xc7, 0x15, 0x79, 0x95, 0x66, 0x9d, 0xc1, 0x1a, 0xb7, + 0xa9, 0xf7, 0x3c, 0xf7, 0x51, 0x1e, 0xe, 0xae, 0xf8, 0xe5, 0xe5, 0x31, + 0xf7, 0x21, 0x12, 0x13, 0x80, 0xf7, 0x27, 0xf8, 0xe5, 0x15, 0xe7, 0x6, + 0xdc, 0xe5, 0xb2, 0x31, 0x5, 0xda, 0x6, 0x13, 0x40, 0x4d, 0xf7, 0x21, + 0x57, 0xa, 0xe, 0x77, 0x8b, 0xeb, 0xf7, 0xd8, 0xeb, 0x1, 0xe2, 0xf7, + 0x6a, 0x3, 0xf7, 0x43, 0xf8, 0x38, 0x40, 0xa, 0xfb, 0x2, 0xfc, 0x98, + 0x40, 0xa, 0xe, 0x77, 0xfb, 0x12, 0x76, 0xf7, 0x91, 0x77, 0x1, 0xe2, + 0x8e, 0x15, 0xc4, 0x6, 0x78, 0x2d, 0x5f, 0x81, 0x7a, 0x87, 0x83, 0x61, + 0x18, 0x67, 0xa, 0x92, 0xaf, 0x9e, 0xe5, 0x18, 0x22, 0x6, 0xe, 0xf8, + 0x4b, 0x78, 0xc9, 0xee, 0xc6, 0xf7, 0xce, 0xc2, 0xf4, 0xc9, 0x1, 0xc1, + 0xcc, 0xf9, 0x21, 0xcc, 0x3, 0xf8, 0xcb, 0xf7, 0xbe, 0x15, 0x34, 0x6b, + 0x41, 0x81, 0x6f, 0x1b, 0x44, 0x4f, 0xbb, 0xf6, 0x98, 0x1f, 0xd6, 0x94, + 0xb9, 0xdf, 0xef, 0x1b, 0x9d, 0xd0, 0x8a, 0x3f, 0xa1, 0x1f, 0xcb, 0x99, + 0x5, 0xdd, 0x7b, 0x46, 0xaf, 0x3a, 0x1b, 0xfb, 0x17, 0x35, 0x37, 0xfb, + 0x16, 0x7b, 0x1f, 0xfb, 0x1c, 0x7b, 0xd9, 0x3d, 0xf7, 0xc, 0x1b, 0xdd, + 0xe2, 0xb6, 0xe9, 0xad, 0x1f, 0xfc, 0xd3, 0xd8, 0x15, 0xfb, 0x65, 0xf7, + 0x45, 0xfb, 0x3a, 0xf7, 0x6d, 0xf7, 0x6d, 0xf7, 0x40, 0xf7, 0x3b, 0xf7, + 0x64, 0xf7, 0x65, 0xfb, 0x42, 0xf7, 0x40, 0xfb, 0x6b, 0xfb, 0x6a, 0xfb, + 0x48, 0xfb, 0x3f, 0xfb, 0x66, 0x1e, 0xcc, 0x16, 0xf7, 0x42, 0xf7, 0x29, + 0xf7, 0x25, 0xf7, 0x48, 0xf7, 0x49, 0xf7, 0x23, 0xfb, 0x25, 0xfb, 0x42, + 0xfb, 0x42, 0xfb, 0x23, 0xfb, 0x1f, 0xfb, 0x49, 0xfb, 0x48, 0xfb, 0x29, + 0xf7, 0x1f, 0xf7, 0x42, 0x1e, 0xe, 0xf7, 0xc, 0x76, 0xae, 0xdf, 0xf7, + 0x9e, 0xdf, 0xae, 0x77, 0x1, 0xee, 0xee, 0x15, 0xe3, 0xd3, 0x5, 0x70, + 0xa9, 0xb0, 0x81, 0xb0, 0x1b, 0xb0, 0xbb, 0x95, 0xa6, 0xb7, 0x1f, 0xbb, + 0x43, 0xd4, 0xc8, 0x5a, 0xd0, 0xb6, 0xbd, 0x9c, 0xb8, 0x92, 0xa5, 0x19, + 0x92, 0xa7, 0x94, 0xb8, 0x7a, 0xbb, 0xe3, 0xd2, 0x18, 0x63, 0xc8, 0x33, + 0x43, 0x5, 0xa6, 0x6e, 0x63, 0x95, 0x66, 0x1b, 0x66, 0x5e, 0x81, 0x70, + 0x5e, 0x1f, 0x5b, 0xd3, 0x43, 0x4e, 0xbb, 0x44, 0x60, 0x5b, 0x79, 0x5e, + 0x84, 0x6f, 0x19, 0x84, 0x71, 0x83, 0x5e, 0x9c, 0x59, 0x34, 0x46, 0x18, + 0xf7, 0x39, 0xf7, 0x52, 0x15, 0xd6, 0xa0, 0xd3, 0xc6, 0xd1, 0x1b, 0xd1, + 0xb5, 0x4f, 0x41, 0x76, 0x1f, 0x42, 0x77, 0x42, 0x50, 0x44, 0x1b, 0x46, + 0x62, 0xc6, 0xd4, 0x9f, 0x1f, 0xe, 0x7c, 0xd3, 0x4f, 0xc7, 0xf8, 0x25, + 0xd4, 0xf7, 0x4f, 0x77, 0x12, 0xdf, 0xe7, 0x13, 0x78, 0xf8, 0x30, 0x88, + 0x15, 0xe0, 0x6, 0xf7, 0x2f, 0xf9, 0x65, 0x3d, 0xa, 0x50, 0xfb, 0xad, + 0x4e, 0xa, 0xd5, 0x64, 0x51, 0x9f, 0x55, 0x1b, 0xfb, 0x20, 0xfb, 0x10, + 0xfb, 0x1c, 0xfb, 0x4a, 0x1f, 0x13, 0xb8, 0xfb, 0x3c, 0xf3, 0x4f, 0xd6, + 0xd0, 0xc0, 0xb2, 0xba, 0xb6, 0x1e, 0x13, 0x78, 0xfb, 0x90, 0xf7, 0x22, + 0x15, 0xc4, 0xb5, 0xf7, 0x50, 0xf7, 0x16, 0xc2, 0xcf, 0x67, 0x2a, 0xfb, + 0x1e, 0x3a, 0xfb, 0x16, 0x27, 0xfb, 0x6, 0x8b, 0xf7, 0x11, 0xaa, 0x1e, + 0xe, 0xfb, 0x1e, 0x76, 0xf8, 0xe6, 0xd5, 0xf7, 0x65, 0x77, 0x1, 0xf7, + 0x1b, 0xf8, 0x7b, 0x3, 0xf7, 0x61, 0xfb, 0x33, 0x15, 0xe2, 0x6, 0xf7, + 0xf, 0xf8, 0xe6, 0x5, 0xf7, 0x54, 0x6, 0x9a, 0xd5, 0x5, 0xfb, 0x53, + 0x6, 0xb6, 0xf7, 0x65, 0x5, 0x33, 0x6, 0x60, 0xfb, 0x65, 0x5, 0xfb, + 0x55, 0x6, 0x7c, 0x41, 0x5, 0xf7, 0x55, 0x6, 0xe, 0xfb, 0x1e, 0x76, + 0xf7, 0x50, 0xd5, 0xf7, 0xf6, 0xd8, 0xf7, 0x4c, 0x77, 0x1, 0xbf, 0xa8, + 0x15, 0xf7, 0x53, 0x6, 0x66, 0xfb, 0x50, 0x5, 0xe1, 0x6, 0xb0, 0xf7, + 0x50, 0x5, 0xf7, 0x50, 0x6, 0x9b, 0xd5, 0x5, 0xfb, 0x51, 0x6, 0xd5, + 0xf7, 0xf6, 0x5, 0xf7, 0x4f, 0x6, 0x9d, 0xd8, 0x5, 0xfb, 0x52, 0x6, + 0xb0, 0xf7, 0x4c, 0x5, 0x35, 0x6, 0x65, 0xfb, 0x4c, 0x5, 0xfb, 0x52, + 0x6, 0x7b, 0x3e, 0x5, 0xf7, 0x53, 0x6, 0x42, 0xfb, 0xf6, 0x5, 0xfb, + 0x52, 0x6, 0xe, 0xf1, 0xf8, 0x2f, 0xc2, 0xf7, 0x4c, 0xc0, 0x1, 0xf7, + 0x3d, 0xc1, 0xf7, 0x51, 0xc3, 0x3, 0xf7, 0x3d, 0xf8, 0xc3, 0x15, 0x38, + 0xcf, 0x4a, 0xdc, 0xdd, 0xcf, 0xcc, 0xde, 0xdc, 0x49, 0xca, 0x37, 0x38, + 0x49, 0x4d, 0x39, 0x1e, 0xc1, 0x8c, 0x15, 0xbe, 0xb5, 0xb2, 0xbf, 0xc0, + 0xb5, 0x64, 0x58, 0x57, 0x60, 0x61, 0x57, 0x58, 0x60, 0xb5, 0xbf, 0x1e, + 0xe, 0xae, 0xf8, 0xf0, 0xf1, 0x1, 0xf7, 0xf9, 0xf9, 0x56, 0x5d, 0xa, + 0xfb, 0x27, 0xf1, 0x5d, 0xa, 0xe, 0xf7, 0xb2, 0x78, 0xec, 0xf7, 0x18, + 0xdd, 0xf7, 0x1a, 0xed, 0x1, 0xe0, 0xf7, 0x66, 0x15, 0xf8, 0x76, 0x6, + 0xb2, 0xdd, 0x5, 0xfc, 0x76, 0x6, 0xf7, 0x7c, 0xf7, 0x1a, 0x15, 0xf0, + 0x6, 0xb9, 0xed, 0x5, 0x25, 0x6, 0xfb, 0x61, 0xfc, 0xb3, 0x15, 0xf1, + 0x6, 0xb8, 0xec, 0x5, 0x26, 0x6, 0xe, 0x2d, 0x76, 0xf7, 0x12, 0x76, + 0xf9, 0x35, 0xd4, 0xb2, 0x77, 0x1, 0xf7, 0x1a, 0xe6, 0xf7, 0xc3, 0xde, + 0x3, 0xf7, 0x8c, 0x81, 0x15, 0x74, 0x22, 0x5, 0xbf, 0x6, 0xa0, 0xee, + 0x5, 0xf7, 0x5e, 0xd0, 0xf7, 0xb, 0xe5, 0xf7, 0x12, 0xfb, 0xe, 0xc9, + 0x50, 0xa3, 0x1f, 0xc1, 0xf7, 0x8e, 0x5, 0xc6, 0xa8, 0x38, 0x6f, 0x8f, + 0x1f, 0xde, 0x91, 0x5, 0xb2, 0x4e, 0xf7, 0x1f, 0x29, 0x1e, 0x95, 0xba, + 0x5, 0x59, 0x6, 0x81, 0x64, 0x5, 0xfb, 0x55, 0x52, 0xfb, 0x8, 0x3a, + 0xfb, 0x13, 0xf7, 0x5, 0x58, 0xbf, 0x76, 0x1f, 0x50, 0xfb, 0xa9, 0x5, + 0x65, 0x53, 0xb6, 0xf4, 0x83, 0x1f, 0x2e, 0x86, 0x5, 0x25, 0x91, 0xca, + 0xfb, 0x6, 0xf7, 0x2, 0x1b, 0xe9, 0xf8, 0x46, 0x15, 0x62, 0x9e, 0x57, + 0xa1, 0xd5, 0x1a, 0xda, 0xd9, 0xb8, 0xcd, 0x1e, 0x3c, 0xfc, 0xf5, 0x15, + 0xc2, 0xf7, 0x9d, 0x5, 0xba, 0x77, 0xc8, 0x6e, 0x3e, 0x1a, 0x44, 0x4a, + 0x47, 0x29, 0x1e, 0xe, 0xae, 0xf8, 0xf0, 0xf1, 0x1, 0xf7, 0x8d, 0xf8, + 0xf0, 0x15, 0xe7, 0x6, 0xa0, 0xf1, 0x5, 0x2e, 0x6, 0xe, 0x77, 0x43, + 0xa, 0xea, 0xf7, 0x5b, 0x3, 0xea, 0x16, 0xe4, 0x6, 0xf7, 0x2, 0xf8, + 0x9f, 0x3e, 0xa, 0x7c, 0xd5, 0xf7, 0x49, 0xd0, 0xf7, 0x33, 0xd1, 0x1, + 0xdf, 0xe7, 0xf7, 0xcf, 0xe2, 0x3, 0xf7, 0x44, 0xf7, 0x84, 0x15, 0xf8, + 0x1f, 0x6, 0x8e, 0x9f, 0x8f, 0x9f, 0xb3, 0x1a, 0xe6, 0x5c, 0xf7, 0x13, + 0xfb, 0x38, 0xfb, 0x5a, 0x36, 0xfb, 0x55, 0xfb, 0x1b, 0xfb, 0x27, 0xe8, + 0x3d, 0xf7, 0x8, 0xf7, 0x1f, 0xe6, 0xf7, 0x2, 0xd4, 0xa1, 0x1e, 0x32, + 0x94, 0x5, 0x2a, 0x61, 0x39, 0x76, 0x64, 0x1b, 0x43, 0x4f, 0xd5, 0xf6, + 0x9a, 0x1f, 0x99, 0xd0, 0x15, 0xce, 0xa0, 0xc0, 0xe7, 0xf4, 0x1b, 0xd3, + 0xc6, 0x4c, 0x2b, 0x82, 0x1f, 0xe, 0x7c, 0xd5, 0x41, 0xf7, 0x50, 0xcf, + 0xd1, 0xf8, 0x3b, 0x77, 0x1, 0xdf, 0xe7, 0x3, 0xf7, 0xd7, 0xf8, 0xe7, + 0x15, 0xd8, 0x6, 0xf7, 0x1d, 0x6f, 0xa, 0xfb, 0xa, 0x6, 0xfb, 0x86, + 0xfc, 0x81, 0x25, 0xa, 0xe, 0x7c, 0xd5, 0xf7, 0x4a, 0xd1, 0xf7, 0xb0, + 0xf7, 0x1f, 0x1, 0xdf, 0xe6, 0xf7, 0xd0, 0xe2, 0x3, 0xf7, 0x8c, 0xf8, + 0xe7, 0x15, 0xe9, 0x6, 0xdd, 0xe5, 0xb4, 0x31, 0x5, 0xdb, 0x6, 0x4c, + 0xf7, 0x1f, 0x47, 0xa, 0xfb, 0x61, 0xfc, 0x81, 0x25, 0xa, 0xe, 0x7c, + 0xd4, 0xf7, 0x48, 0xcf, 0xf7, 0xbf, 0xf0, 0x1, 0xdf, 0xe6, 0x3, 0xf8, + 0x56, 0xf8, 0xf1, 0x63, 0xa, 0xfb, 0x64, 0x26, 0x63, 0xa, 0xfb, 0x1, + 0xfc, 0x65, 0x25, 0xa, 0xe, 0x7c, 0xd5, 0xf7, 0x4a, 0xd1, 0xf7, 0xb1, + 0xf7, 0x1e, 0x1, 0xdf, 0xe6, 0x3, 0xf7, 0x45, 0xf7, 0x85, 0x25, 0xa, + 0x29, 0xf7, 0xb1, 0x15, 0xd3, 0x6, 0x50, 0xf7, 0x1e, 0x5, 0xfb, 0x3, + 0x6, 0xe, 0x78, 0xd0, 0xf7, 0xbb, 0xcb, 0xf7, 0x75, 0xd0, 0x1, 0xd5, + 0xeb, 0xf7, 0xee, 0xe6, 0x3, 0xf7, 0x83, 0xf8, 0x15, 0x15, 0xfb, 0x31, + 0x63, 0x83, 0xfb, 0x2a, 0x6c, 0x1a, 0x23, 0xe0, 0x3c, 0xf7, 0x1f, 0xf7, + 0x3e, 0xf2, 0xf7, 0xb, 0xf7, 0xe, 0xe9, 0x4d, 0xb4, 0x6b, 0x9d, 0x1e, + 0xd0, 0x9c, 0xc8, 0xcc, 0xd3, 0x1a, 0xca, 0x5c, 0xf7, 0x3, 0xfb, 0x3f, + 0xfb, 0x39, 0x44, 0xfb, 0xb, 0x40, 0x78, 0x8d, 0x4c, 0xdf, 0x61, 0x1e, + 0x46, 0xfb, 0x71, 0x15, 0xe7, 0xcf, 0xe4, 0xf6, 0xd3, 0xc5, 0x55, 0x46, + 0x40, 0x4f, 0x2a, 0x20, 0x39, 0x53, 0xbc, 0xcc, 0x1e, 0xd8, 0xf7, 0xed, + 0x15, 0xc2, 0xb2, 0xd1, 0xf2, 0xd4, 0xc1, 0x5d, 0x50, 0x54, 0x5f, 0x4a, + 0x23, 0x43, 0x5a, 0xb0, 0xca, 0x1e, 0xe, 0xf9, 0x52, 0x8b, 0xf5, 0x1, + 0xf8, 0x57, 0x16, 0x4b, 0xa, 0xf7, 0xcf, 0x21, 0x15, 0x4b, 0xa, 0xfd, + 0x49, 0x21, 0x15, 0x4b, 0xa, 0xe, 0xf9, 0x52, 0x64, 0xa, 0xfa, 0x8c, + 0xd4, 0xfe, 0x8c, 0x6, 0xe, 0x64, 0xa, 0xf8, 0xd0, 0xd4, 0xfc, 0xd0, + 0x6, 0xe, 0xf7, 0xb2, 0xf7, 0x7, 0xdc, 0xf7, 0x8, 0xd9, 0x1, 0xb5, + 0xf8, 0xc9, 0x3, 0xca, 0xf7, 0xce, 0x15, 0xf8, 0xc9, 0xd7, 0xfc, 0xc9, + 0x6, 0xfb, 0xa7, 0x4, 0xf8, 0xc9, 0xda, 0xfc, 0xc9, 0x6, 0xe, 0x81, + 0xd5, 0x1, 0xf8, 0x8e, 0xf0, 0x3, 0xf7, 0xf0, 0xf8, 0xd1, 0x15, 0xf7, + 0x0, 0xb9, 0xa5, 0x5e, 0xa0, 0x5b, 0x94, 0x59, 0x19, 0x89, 0x89, 0x5, + 0xa2, 0x72, 0x61, 0xae, 0x36, 0x1b, 0xfb, 0x2a, 0xfb, 0x13, 0xfb, 0x29, + 0xfb, 0x47, 0xfb, 0x7, 0xd2, 0x23, 0xf7, 0x32, 0xf7, 0x8c, 0xc6, 0xf7, + 0x90, 0xf7, 0x8, 0xf7, 0x38, 0x53, 0xe4, 0x6d, 0xb9, 0x1f, 0xdd, 0xae, + 0x73, 0xbd, 0x2e, 0x65, 0x88, 0x90, 0x78, 0x9e, 0x7a, 0x99, 0x19, 0x28, + 0x6, 0xa5, 0x73, 0x90, 0x85, 0xad, 0x62, 0x28, 0x60, 0x18, 0xfb, 0x26, + 0xfc, 0x37, 0x15, 0xea, 0xc3, 0xf7, 0x33, 0xf7, 0x26, 0xcb, 0xd3, 0x68, + 0x21, 0x34, 0x4f, 0xfb, 0x3f, 0xfb, 0x24, 0xfb, 0x3, 0x74, 0xdf, 0xc8, + 0x1e, 0xe, 0x77, 0x8b, 0xef, 0xe0, 0x77, 0xf8, 0xbd, 0x77, 0x1, 0xe5, + 0x16, 0xef, 0x6, 0xa0, 0xef, 0x47, 0xa, 0xb0, 0xe0, 0x15, 0xc2, 0x6, + 0xf3, 0xf8, 0x4, 0xac, 0xf7, 0x39, 0x5, 0x20, 0x6, 0x6c, 0xfb, 0x39, + 0x5, 0xe, 0xae, 0xfb, 0x42, 0x76, 0xf8, 0xaf, 0x77, 0xf0, 0xed, 0x1, + 0xd8, 0xf7, 0x8d, 0x3, 0xf7, 0x61, 0xf8, 0x3d, 0x15, 0xef, 0x6, 0xa0, + 0xed, 0x47, 0xa, 0xfb, 0x8, 0xfc, 0xc0, 0x15, 0x6a, 0xfb, 0x36, 0x5, + 0xf6, 0x6, 0xab, 0xf7, 0x36, 0xc1, 0xf8, 0xd, 0x5, 0x54, 0x6, 0xe, + 0x77, 0x3a, 0xa, 0xf5, 0xf7, 0xde, 0x3, 0xe1, 0x16, 0xdb, 0x6, 0xe0, + 0xf8, 0x56, 0x5, 0xe5, 0x6, 0x98, 0xcf, 0x3f, 0xa, 0xf0, 0x9f, 0x91, + 0xa9, 0xb5, 0x1b, 0xa7, 0xa8, 0x82, 0x88, 0x98, 0x1f, 0x99, 0xd8, 0x5, + 0x8f, 0x79, 0x62, 0x95, 0x6c, 0x1b, 0x25, 0x80, 0x36, 0x46, 0x7a, 0x1f, + 0x7f, 0x53, 0x5, 0x43, 0x6, 0x7f, 0x47, 0x5, 0xd2, 0x6, 0xe, 0xf7, + 0x5e, 0x3a, 0xa, 0xe1, 0x16, 0xe5, 0x46, 0xa, 0xa1, 0x8f, 0xa9, 0xba, + 0x1b, 0xaa, 0xae, 0x82, 0x88, 0x99, 0x1f, 0x9b, 0xd8, 0x5, 0x8f, 0x77, + 0x62, 0x95, 0x68, 0x1b, 0xfb, 0x6, 0x7a, 0x36, 0x46, 0x78, 0x1f, 0x7e, + 0x53, 0x5, 0x3b, 0x6, 0x7c, 0x47, 0x5, 0xdc, 0x6, 0xf7, 0x36, 0xfc, + 0x56, 0x15, 0xe5, 0x6, 0xf7, 0x3, 0xf8, 0x9a, 0x3f, 0xa, 0x9f, 0xe9, + 0x15, 0xe5, 0x6, 0xa1, 0xf3, 0x3e, 0xa, 0x78, 0xd0, 0xf7, 0xef, 0xd9, + 0xf7, 0x2d, 0xdb, 0x1, 0xcf, 0xee, 0xf7, 0xb7, 0xeb, 0x3, 0xce, 0xf7, + 0x57, 0x15, 0x23, 0xd4, 0xfb, 0x2, 0xf7, 0x2e, 0xf7, 0x41, 0xf7, 0x10, + 0xf7, 0xd, 0xf7, 0x37, 0xf7, 0x2c, 0xfb, 0xa, 0xc5, 0x34, 0x41, 0x61, + 0x6e, 0x7e, 0x73, 0x1e, 0xc6, 0xf7, 0x47, 0x5, 0xf7, 0xbd, 0x6, 0x9e, + 0xdb, 0x5, 0xfc, 0x12, 0x6, 0xfb, 0x9, 0xfb, 0xfe, 0xdf, 0x84, 0x5, + 0x9e, 0x9b, 0xbc, 0xc2, 0xdf, 0x1b, 0xe7, 0xbb, 0x4c, 0x46, 0x23, 0x34, + 0xfb, 0x3, 0x20, 0x50, 0x38, 0xb8, 0xf7, 0x1, 0x93, 0x1f, 0xe, 0xf7, + 0x5e, 0x3a, 0xa, 0xe1, 0x16, 0xe4, 0x46, 0xa, 0xa2, 0x8f, 0xa9, 0xba, + 0x1b, 0xaa, 0xac, 0x82, 0x88, 0x9a, 0x1f, 0x9b, 0xd8, 0x5, 0x8f, 0x77, + 0x63, 0x95, 0x68, 0x1b, 0xfb, 0x5, 0x78, 0x37, 0x46, 0x79, 0x1f, 0x7e, + 0x52, 0x5, 0x3a, 0x6, 0x7d, 0x47, 0x5, 0xdc, 0x6, 0xf7, 0x35, 0xfc, + 0x56, 0x15, 0xe5, 0x6, 0xf7, 0x2c, 0xf9, 0x60, 0x5, 0x32, 0x6, 0xe, + 0xfb, 0x63, 0xd9, 0xf8, 0xda, 0xd1, 0xf7, 0x17, 0xde, 0x1, 0x77, 0xfb, + 0xa, 0x15, 0x6b, 0x3e, 0x5, 0x7f, 0xc7, 0xb2, 0x8b, 0x92, 0x1b, 0xdb, + 0xca, 0xdc, 0xe4, 0xae, 0x1f, 0xf7, 0x4d, 0xf8, 0x7e, 0x5, 0xf0, 0x6, + 0xa7, 0xd1, 0x5, 0x25, 0x6, 0xf3, 0xb6, 0x98, 0xa6, 0xbb, 0x1b, 0xa0, + 0x9c, 0x87, 0x82, 0xae, 0x1f, 0xac, 0xd8, 0x5, 0x95, 0x6a, 0x6d, 0x94, + 0x64, 0x1b, 0xfb, 0x6, 0x67, 0x27, 0xfb, 0x6, 0x5b, 0x1f, 0x27, 0x6, + 0x71, 0x45, 0x5, 0xee, 0x6, 0xfb, 0x48, 0xfc, 0x7d, 0x5, 0x64, 0x7b, + 0x68, 0x55, 0x60, 0x1b, 0x7b, 0x76, 0x8e, 0x93, 0x67, 0x1f, 0xe, 0xa0, + 0x76, 0xf7, 0x48, 0xd9, 0xf7, 0xc0, 0xf7, 0x2e, 0x1, 0xcb, 0xf7, 0x48, + 0x15, 0xf7, 0xd0, 0x6, 0x62, 0xfb, 0x48, 0x5, 0xeb, 0x6, 0xb5, 0xf7, + 0x48, 0x5, 0xf7, 0x1, 0x6, 0x9e, 0xd9, 0x5, 0xfb, 0x2, 0x6, 0xf1, + 0xf8, 0x51, 0x5, 0x3d, 0x6, 0xfc, 0x46, 0xfc, 0x49, 0x5, 0xe8, 0x83, + 0x15, 0xf7, 0xb2, 0xf7, 0xb9, 0x8d, 0x89, 0x48, 0xfb, 0xb7, 0x5, 0xe, + 0xfb, 0x17, 0x8d, 0x76, 0xf9, 0x66, 0x77, 0x1, 0xfb, 0x3b, 0xf9, 0x20, + 0x3, 0x23, 0x78, 0x15, 0xf8, 0xde, 0xf9, 0x66, 0x5, 0x43, 0x6, 0xfc, + 0xd8, 0xfd, 0x66, 0x5, 0xe, 0xfb, 0x70, 0xd5, 0xf7, 0x1f, 0xd5, 0xf8, + 0x21, 0xd5, 0x7f, 0x77, 0x12, 0x13, 0xd0, 0xb5, 0x54, 0x15, 0xfb, 0x30, + 0xf7, 0x36, 0x82, 0xc0, 0xf7, 0x57, 0xac, 0xf7, 0x2f, 0xd6, 0x9b, 0x1e, + 0xf7, 0x1, 0xf8, 0x98, 0x5, 0x37, 0x6, 0x7b, 0x33, 0x4e, 0xa, 0x13, + 0xe0, 0xe0, 0x5c, 0x47, 0x9a, 0x5c, 0x1b, 0xfb, 0x28, 0xfb, 0xe, 0xfb, + 0x26, 0xfb, 0x33, 0xfb, 0x2b, 0xe2, 0x32, 0xf4, 0xb5, 0xbf, 0x98, 0xc4, + 0xc5, 0x1f, 0x82, 0x56, 0x5, 0x2e, 0x7a, 0x61, 0x4c, 0x22, 0x1b, 0x25, + 0x81, 0xb9, 0xaf, 0x1f, 0xae, 0xf7, 0xbd, 0x15, 0xd2, 0xc2, 0xf7, 0x34, + 0xf7, 0xf, 0xd9, 0xbd, 0x4b, 0x3d, 0x27, 0x4b, 0xfb, 0x2f, 0xfb, 0x12, + 0x31, 0x71, 0xe6, 0xd6, 0x1e, 0xe, 0xf7, 0xcd, 0x7c, 0xd3, 0x64, 0x76, + 0xf9, 0x2b, 0xcf, 0x12, 0xf8, 0xb8, 0xef, 0x13, 0x70, 0xce, 0x88, 0x15, + 0xee, 0x6, 0xf7, 0x6, 0xf8, 0x84, 0x5, 0xe5, 0xa0, 0xbb, 0xd8, 0xf6, + 0x1b, 0xe0, 0x81, 0x2a, 0x5a, 0x61, 0x1f, 0x53, 0x4b, 0x6b, 0x62, 0x65, + 0x1a, 0x66, 0xa7, 0x68, 0xc6, 0x59, 0x1e, 0xc0, 0x5c, 0x9c, 0x79, 0x6f, + 0x1a, 0x13, 0xb0, 0x5d, 0x56, 0x56, 0x4b, 0x4e, 0x6b, 0xc4, 0xa6, 0x7c, + 0x1e, 0x38, 0x62, 0x5, 0x23, 0xd0, 0xd7, 0x80, 0xba, 0x1b, 0xf7, 0x8, + 0xef, 0xda, 0xe7, 0xc1, 0x6e, 0xa5, 0x4a, 0xc8, 0x1f, 0x5f, 0xb4, 0x79, + 0xa2, 0xa2, 0x1a, 0xa2, 0xa2, 0xa5, 0xb3, 0xb9, 0x1e, 0xec, 0xdf, 0x7f, + 0xf7, 0x2c, 0xfb, 0x46, 0x1b, 0xfb, 0x3d, 0x3b, 0xfb, 0x1, 0xfb, 0x12, + 0x6d, 0x1f, 0xe, 0x53, 0xa, 0xf7, 0x9f, 0xf8, 0xe5, 0x56, 0xa, 0x6d, + 0xa, 0xfb, 0x1, 0x6, 0xe, 0xf7, 0xb2, 0xbc, 0x76, 0xf8, 0x60, 0x77, + 0x1, 0xf7, 0x16, 0xf8, 0x71, 0x3, 0xf7, 0xc, 0x96, 0x15, 0xf8, 0x71, + 0xf7, 0x5c, 0x5, 0xde, 0x7, 0xfc, 0x71, 0xf7, 0x5d, 0x5, 0x34, 0x7, + 0xf8, 0x0, 0xfb, 0x2f, 0xfc, 0x0, 0xfb, 0x2f, 0x5, 0xe, 0x49, 0xa, + 0xf8, 0x2c, 0xf7, 0x17, 0x15, 0xc6, 0x6, 0x45, 0xf7, 0x64, 0xf7, 0x31, + 0xf7, 0x5d, 0x5, 0x4a, 0x6, 0xfb, 0x3f, 0xfb, 0x5d, 0x5, 0x39, 0xfb, + 0x64, 0x15, 0xc7, 0x6, 0x45, 0xf7, 0x64, 0xf7, 0x30, 0xf7, 0x5d, 0x5, + 0x4b, 0x6, 0xfb, 0x40, 0xfb, 0x5d, 0x5, 0xe, 0x49, 0xa, 0xf7, 0xc, + 0xf7, 0x17, 0x15, 0xcc, 0x6, 0xf7, 0x3f, 0xf7, 0x5d, 0x31, 0xf7, 0x64, + 0x5, 0x51, 0x6, 0xd0, 0xfb, 0x64, 0x5, 0x9a, 0xfb, 0x5d, 0x15, 0xcb, + 0x6, 0xf7, 0x40, 0xf7, 0x5d, 0x31, 0xf7, 0x64, 0x5, 0x50, 0x6, 0xd0, + 0xfb, 0x64, 0x5, 0xe, 0xbf, 0x49, 0xa, 0xf7, 0x75, 0xf7, 0x17, 0x15, + 0xc0, 0x6, 0x4c, 0xf7, 0x60, 0xf7, 0x22, 0xf7, 0x61, 0x5, 0x51, 0x6, + 0xfb, 0x2f, 0xfb, 0x61, 0x5, 0xe, 0xae, 0xf7, 0x2b, 0x76, 0xf8, 0x29, + 0x77, 0x1, 0xf7, 0x9, 0xf7, 0x16, 0x15, 0xc5, 0x6, 0xf7, 0x2f, 0xf7, + 0x55, 0x39, 0xf7, 0x68, 0x5, 0x57, 0x6, 0xc8, 0xfb, 0x68, 0x5, 0xe, + 0xa0, 0x76, 0xf8, 0x5f, 0xd3, 0xf7, 0x4f, 0x77, 0x1, 0xcc, 0x16, 0xe7, + 0x6, 0xba, 0xf7, 0x73, 0x94, 0xb5, 0x9c, 0xd6, 0xad, 0xb8, 0x19, 0xb4, + 0xac, 0xc0, 0xac, 0xcc, 0x1b, 0xeb, 0x71, 0x2f, 0x4f, 0x7d, 0x1f, 0x47, + 0xfb, 0xc7, 0x5, 0xe7, 0x6, 0xcd, 0xf7, 0xc7, 0x5, 0x91, 0xac, 0x91, + 0xaf, 0xad, 0x1a, 0xcc, 0x6c, 0xc3, 0x22, 0x34, 0x4f, 0x56, 0x69, 0x65, + 0x1e, 0xc5, 0xf7, 0xa6, 0x3e, 0xa, 0x53, 0xa, 0xf7, 0x31, 0xf8, 0xe5, + 0x4f, 0xa, 0xdd, 0xfb, 0x21, 0x4f, 0xa, 0xe, 0xae, 0xf7, 0x7c, 0xe5, + 0x1, 0xe8, 0xf7, 0x9c, 0x3, 0xe8, 0xf7, 0x7c, 0x15, 0xf7, 0x8b, 0x6, + 0x9c, 0xe5, 0x5, 0xfb, 0x8b, 0x6, 0xe, 0x3f, 0xa0, 0x76, 0xf8, 0x99, + 0x77, 0xf7, 0xe, 0xee, 0x1, 0xce, 0x16, 0xe4, 0x6, 0xf7, 0x2, 0xf8, + 0x99, 0x3f, 0xa, 0xa0, 0xf1, 0x15, 0xe5, 0x6, 0xa0, 0xee, 0x3e, 0xa, + 0x52, 0xa, 0xf7, 0x77, 0x77, 0x1, 0xf7, 0x45, 0xf8, 0xe8, 0x6e, 0xa, + 0xf7, 0x34, 0xf7, 0x1e, 0x5, 0xfb, 0x1e, 0x6, 0xfb, 0x57, 0xfd, 0x72, + 0x15, 0x38, 0xa, 0xe, 0x52, 0xa, 0xe4, 0xf7, 0x1e, 0x1, 0xf7, 0x2, + 0xf8, 0xe8, 0x15, 0xea, 0x6, 0xdf, 0xe4, 0xb3, 0x32, 0x5, 0xdd, 0x6, + 0x4b, 0xf7, 0x1e, 0x5, 0x26, 0x6, 0xfb, 0x2b, 0xfd, 0x72, 0x15, 0x38, + 0xa, 0xe, 0x5c, 0xa, 0xf8, 0xf1, 0xf0, 0x1, 0xf7, 0xc4, 0xf8, 0xf1, + 0x6e, 0xa, 0xa0, 0xf0, 0x45, 0xa, 0xfb, 0x5c, 0x26, 0x6e, 0xa, 0xa0, + 0xf0, 0x45, 0xa, 0x58, 0xfd, 0x56, 0x15, 0x38, 0xa, 0xe, 0x52, 0xa, + 0xf7, 0x77, 0x77, 0x1, 0xea, 0x16, 0x38, 0xa, 0xb8, 0xd0, 0x15, 0xcd, + 0x6, 0x54, 0xf7, 0x1e, 0x5, 0x25, 0x6, 0xe, 0x3f, 0xfb, 0x51, 0x76, + 0xf9, 0x6b, 0x77, 0xf7, 0xe, 0xee, 0x1, 0x5d, 0xfb, 0xd, 0x15, 0x7d, + 0x3f, 0x5, 0x7e, 0xba, 0xa5, 0x8b, 0x92, 0x1b, 0xe7, 0xab, 0xf7, 0x10, + 0xdf, 0x9c, 0x1f, 0xf7, 0x0, 0xf8, 0x9b, 0x5, 0x36, 0x6, 0x24, 0xfc, + 0x9b, 0x72, 0xfb, 0x11, 0x78, 0x7a, 0x38, 0xa2, 0x19, 0xf7, 0x8d, 0xf9, + 0x78, 0x15, 0xe0, 0x6, 0x9f, 0xee, 0x5, 0x36, 0x6, 0xe, 0xf7, 0x5e, + 0x2d, 0xa, 0xce, 0x16, 0xe5, 0x6, 0xb1, 0xf7, 0x42, 0xf7, 0x2, 0xe9, + 0xf4, 0xfb, 0xa0, 0x5, 0xef, 0x6, 0xfb, 0x1e, 0xf7, 0xdb, 0xf7, 0x78, + 0xf7, 0x57, 0x5, 0xfb, 0xc, 0x6, 0xfb, 0x9a, 0xfb, 0x8c, 0x89, 0x8d, + 0xea, 0xf8, 0x4e, 0x3e, 0xa, 0x3f, 0x2d, 0xa, 0xce, 0x16, 0xe5, 0x6, + 0xf7, 0x2b, 0xf9, 0x62, 0x5, 0x32, 0x6, 0xe, 0xf7, 0xb2, 0xab, 0x76, + 0xf8, 0x78, 0x77, 0x1, 0xe9, 0xf7, 0x68, 0x15, 0xf8, 0x71, 0xfb, 0x5d, + 0x5, 0xe2, 0x7, 0xfc, 0x0, 0xf7, 0x2f, 0xf8, 0x0, 0xf7, 0x2f, 0x5, + 0xe2, 0x7, 0xfc, 0x71, 0xfb, 0x5d, 0x5, 0xe, 0xf7, 0xb2, 0xf7, 0x15, + 0x76, 0xf7, 0x60, 0xd9, 0x1, 0xf5, 0xf7, 0xcc, 0x15, 0xf8, 0x3b, 0x6, + 0x5b, 0xfb, 0x60, 0x5, 0xdd, 0x6, 0xcc, 0xf7, 0xae, 0x5, 0xfc, 0x8d, + 0x6, 0xe, 0x3f, 0x2d, 0xa, 0xc0, 0x16, 0xf1, 0x6, 0xe0, 0xf7, 0xfb, + 0xe4, 0xb4, 0x9d, 0xd8, 0x32, 0x61, 0xcf, 0xf7, 0xaf, 0x5, 0x26, 0x6, + 0x3b, 0xfb, 0xe4, 0x34, 0x64, 0x7a, 0x3e, 0xe0, 0xb3, 0x5, 0xe, 0xf8, + 0xab, 0x60, 0xa, 0x13, 0xc0, 0xcc, 0x16, 0xe5, 0x6, 0xbf, 0xf7, 0x8d, + 0x5, 0xe1, 0x9e, 0xbc, 0xf7, 0x16, 0xf7, 0xe, 0x1b, 0xd2, 0x83, 0x42, + 0x56, 0x7f, 0x1f, 0x41, 0xfb, 0xe7, 0x5, 0xe4, 0x6, 0xc1, 0xf7, 0x94, + 0x5, 0xc9, 0x98, 0xb6, 0xf7, 0x27, 0xf7, 0x16, 0x1b, 0xca, 0x91, 0x52, + 0x46, 0x7d, 0x1f, 0x41, 0xfb, 0xe7, 0x5, 0xe4, 0x6, 0xd3, 0xf7, 0xe7, + 0x5, 0x90, 0xa3, 0x8d, 0xa0, 0x9f, 0x1a, 0x13, 0xa0, 0xdb, 0x5d, 0xc1, + 0x38, 0x6c, 0x42, 0x83, 0x31, 0x42, 0x1e, 0xdf, 0x78, 0x49, 0x99, 0x62, + 0x1b, 0x37, 0x59, 0x55, 0x61, 0x63, 0x1f, 0x13, 0xc0, 0x9d, 0xdf, 0x5, + 0x32, 0x6, 0xe, 0xae, 0xf9, 0x7, 0xc4, 0x1, 0xf7, 0x23, 0xf9, 0x7, + 0x15, 0xf7, 0xca, 0x6, 0x9a, 0xc4, 0x5, 0xfb, 0xcb, 0x6, 0xe, 0xf7, + 0xb2, 0xf7, 0x6c, 0xd4, 0x1, 0xe0, 0xf7, 0x6c, 0x15, 0xf8, 0x6e, 0x6, + 0xba, 0xd4, 0x5, 0xfc, 0x6e, 0x6, 0xe, 0xfb, 0x4e, 0x76, 0xf7, 0x5f, + 0xcb, 0x54, 0x76, 0xf8, 0xaf, 0x77, 0x12, 0x13, 0xb0, 0xf7, 0x39, 0xb9, + 0x15, 0x76, 0x9d, 0xac, 0x62, 0xce, 0x1b, 0xcc, 0xb5, 0xac, 0xa0, 0xa2, + 0x1f, 0x8d, 0x89, 0x5, 0x13, 0xd0, 0x83, 0x63, 0x5, 0xde, 0x6, 0xf7, + 0x2, 0xf8, 0xa3, 0x5, 0x32, 0x6, 0x4f, 0xfb, 0xae, 0x5, 0x37, 0x78, + 0x68, 0x2a, 0x23, 0x1b, 0xfb, 0x0, 0x8d, 0xe3, 0xe8, 0xa0, 0x1f, 0x8c, + 0x91, 0x90, 0xa4, 0xc0, 0xf7, 0x8f, 0x8, 0x31, 0x6, 0xfb, 0x2d, 0xfd, + 0x6e, 0x5, 0xe2, 0x6, 0xe, 0xf7, 0xb2, 0xa0, 0x76, 0xf8, 0x8e, 0x77, + 0x1, 0xbd, 0xd2, 0x15, 0xc2, 0x44, 0xf7, 0x81, 0xf7, 0x52, 0xf7, 0x22, + 0xfb, 0x52, 0xd8, 0xce, 0xfb, 0x22, 0xf7, 0x51, 0xf7, 0x73, 0xf7, 0x47, + 0x55, 0xd1, 0xfb, 0x74, 0xfb, 0x46, 0xfb, 0x23, 0xf7, 0x47, 0x3e, 0x4e, + 0xf7, 0x23, 0xfb, 0x48, 0x5, 0xe, 0x60, 0xa, 0x13, 0xa0, 0xcc, 0x16, + 0xe7, 0x6, 0xbf, 0xf7, 0x89, 0x5, 0xd5, 0x9a, 0xc6, 0xf7, 0x26, 0xf7, + 0x18, 0x1b, 0xd9, 0x8b, 0x3d, 0x47, 0x7b, 0x1f, 0x43, 0xfb, 0xd3, 0x5, + 0xe7, 0x6, 0xcf, 0xf7, 0xd3, 0x5, 0x90, 0xa1, 0x8e, 0xa0, 0x9e, 0x1a, + 0xe4, 0x5e, 0xcf, 0x31, 0x2e, 0x44, 0x44, 0x6a, 0x6c, 0x1e, 0x89, 0x8d, + 0x5, 0x13, 0xc0, 0x9f, 0xe5, 0x5, 0x38, 0x6, 0xe, 0x78, 0xd4, 0x42, + 0xf7, 0x47, 0xf8, 0x6e, 0xd0, 0x1, 0xf7, 0x9, 0xe6, 0xf7, 0xa9, 0xec, + 0x3, 0xdd, 0xf7, 0x30, 0x15, 0x35, 0x93, 0xbc, 0x32, 0xf7, 0x17, 0x1b, + 0xf7, 0x97, 0xdb, 0xf7, 0xf3, 0xf7, 0x24, 0xf7, 0x4e, 0xfb, 0x12, 0xb4, + 0x26, 0xfb, 0x30, 0xfb, 0x1, 0xfb, 0x1a, 0xfb, 0x25, 0xfb, 0x1b, 0xeb, + 0x48, 0xf7, 0x0, 0xd9, 0xc2, 0xb3, 0x9f, 0xa3, 0x1f, 0x8d, 0x89, 0x5, + 0x69, 0x82, 0x4c, 0xfb, 0x54, 0xfb, 0x18, 0x1b, 0x46, 0x70, 0xbc, 0xc8, + 0x82, 0x1f, 0xb0, 0xf7, 0x98, 0x15, 0xee, 0xdf, 0xf7, 0x3, 0xe3, 0xf4, + 0xa6, 0x34, 0x45, 0xfb, 0xe, 0x33, 0x4b, 0x37, 0x3d, 0x55, 0xc0, 0xdb, + 0x1e, 0xe, 0xa0, 0x76, 0xf9, 0x21, 0xcd, 0x8e, 0x77, 0x12, 0xcc, 0xf8, + 0xa3, 0x13, 0xd0, 0xcc, 0x16, 0xe8, 0x6, 0xbf, 0xf7, 0x88, 0x5, 0xf7, + 0xf, 0xa7, 0xe3, 0xeb, 0xe8, 0x1b, 0xd3, 0x90, 0x3d, 0x48, 0x7c, 0x1f, + 0x42, 0xfb, 0xd2, 0x5, 0xe9, 0x6, 0xcf, 0xf7, 0xd2, 0x5, 0x91, 0xa5, + 0x8d, 0xa4, 0xa2, 0x1a, 0xe0, 0x5a, 0xc6, 0x34, 0x2d, 0x44, 0x44, 0x6b, + 0x6b, 0x1e, 0x89, 0x8d, 0x9f, 0xe4, 0x5, 0x37, 0x6, 0xce, 0xe3, 0x15, + 0xcb, 0x66, 0xa, 0xa5, 0x1b, 0xa8, 0xa2, 0x80, 0x80, 0xa1, 0x1f, 0x81, + 0xa0, 0x9f, 0x81, 0xa3, 0x1b, 0xc8, 0xae, 0xc1, 0xc1, 0x90, 0x1f, 0x4d, + 0x6, 0x7d, 0x86, 0x85, 0x73, 0x71, 0x1b, 0x7d, 0x75, 0x94, 0x95, 0x73, + 0x1f, 0x13, 0xa0, 0x96, 0x70, 0x6e, 0x96, 0x70, 0x1b, 0x45, 0x79, 0x57, + 0x51, 0x7b, 0x1f, 0xe, 0x8c, 0x76, 0xf7, 0x69, 0xd5, 0xf7, 0x55, 0xd4, + 0xf7, 0x60, 0x77, 0x1, 0xf7, 0x7, 0x66, 0x15, 0xd8, 0x6, 0xb7, 0xf7, + 0x69, 0x5, 0xf7, 0x34, 0x6, 0x5f, 0xfb, 0x69, 0x5, 0xd8, 0x6, 0xb7, + 0xf7, 0x69, 0x5, 0xf7, 0x32, 0xd5, 0xfb, 0x23, 0x6, 0xb1, 0xf7, 0x55, + 0x5, 0xf4, 0xd4, 0x31, 0x6, 0xb7, 0x58, 0xa, 0xfb, 0x33, 0x6, 0xb6, + 0x58, 0xa, 0xfb, 0x2e, 0x42, 0xf7, 0x20, 0x6, 0x64, 0xfb, 0x55, 0x5, + 0x26, 0x41, 0xe2, 0x6, 0xe6, 0xd5, 0x15, 0xb1, 0xf7, 0x55, 0x5, 0xf7, + 0x35, 0x6, 0x64, 0xfb, 0x55, 0x5, 0xe, 0x7d, 0xd1, 0xf8, 0x30, 0xd1, + 0x1, 0xed, 0xe5, 0xf7, 0xb6, 0xe5, 0x3, 0xde, 0xf7, 0x67, 0x15, 0xfb, + 0x24, 0xf1, 0x3a, 0xf7, 0x6, 0xf7, 0x30, 0xf7, 0x16, 0xf7, 0x1b, 0xf7, + 0x5a, 0xf7, 0x1f, 0x33, 0xdb, 0xfb, 0x12, 0xfb, 0x4c, 0x23, 0xfb, 0x26, + 0xfb, 0x49, 0x1e, 0xe5, 0x16, 0xf7, 0x5, 0xcb, 0xf7, 0x24, 0xf7, 0x17, + 0xe1, 0xb4, 0x48, 0x3a, 0xfb, 0x5, 0x43, 0xfb, 0x2b, 0xfb, 0xf, 0x6e, + 0x29, 0x98, 0xf7, 0x22, 0x1e, 0xe, 0x7d, 0xd1, 0xf9, 0x3a, 0x77, 0x1, + 0xe8, 0xe5, 0xf7, 0xc2, 0xe5, 0x3, 0xf7, 0xd3, 0xf8, 0xe7, 0x15, 0xd6, + 0x6, 0xf7, 0x19, 0x6f, 0xa, 0xfb, 0x7, 0x6, 0xfb, 0xdd, 0x29, 0xa, + 0x7d, 0xd1, 0xf8, 0xaf, 0xf7, 0x1f, 0x1, 0xe8, 0xe5, 0xf7, 0xbd, 0xe5, + 0x3, 0xf7, 0x8c, 0xf8, 0xe7, 0x15, 0xe8, 0x6, 0xdc, 0xe5, 0xb3, 0x31, + 0x5, 0xdb, 0x6, 0x4d, 0x6f, 0xa, 0x28, 0x6, 0xfb, 0xbe, 0x29, 0xa, + 0x7d, 0xd0, 0xf8, 0xba, 0xf0, 0x1, 0xe8, 0xe5, 0xf7, 0xb8, 0xe5, 0x3, + 0xde, 0xf7, 0x64, 0x24, 0xa, 0xf7, 0xa7, 0xf8, 0x21, 0x15, 0xe9, 0x6, + 0xa1, 0xf0, 0x4d, 0xa, 0xfb, 0x61, 0x26, 0x15, 0xe9, 0x6, 0xa0, 0xf0, + 0x5, 0x2d, 0x6, 0xe, 0xf9, 0x1a, 0x7c, 0xd4, 0x42, 0xf7, 0x4f, 0xcd, + 0xd0, 0xf7, 0x36, 0xd0, 0x1, 0xde, 0xe4, 0xf9, 0x53, 0xe4, 0x3, 0xf8, + 0x8b, 0xe3, 0x15, 0x40, 0xb3, 0xd0, 0x6f, 0xd3, 0x1b, 0xf7, 0x11, 0xe1, + 0xed, 0xe0, 0xb0, 0x1f, 0x2d, 0x94, 0x5, 0x61, 0x79, 0x54, 0x3e, 0x3b, + 0x1b, 0xfb, 0x2, 0x7d, 0xf7, 0xe, 0xc5, 0x93, 0x1f, 0xf8, 0x16, 0x6, + 0x8f, 0x9e, 0x90, 0xb1, 0xa4, 0x1a, 0xf7, 0x13, 0x3a, 0xe6, 0xfb, 0x14, + 0xfb, 0x0, 0x53, 0x52, 0x61, 0x63, 0x1e, 0xee, 0x53, 0xfb, 0x0, 0x8b, + 0x75, 0x1b, 0xfb, 0x52, 0x2f, 0xfb, 0x43, 0xfb, 0x32, 0xfb, 0x32, 0xf1, + 0x4d, 0xf7, 0x0, 0xf7, 0xc, 0xc8, 0xd1, 0xac, 0xa8, 0x1f, 0xfb, 0xdf, + 0xf7, 0x9, 0x15, 0xdd, 0xbb, 0xf7, 0x4a, 0xf7, 0x26, 0xea, 0xa7, 0x32, + 0x56, 0xfb, 0x1, 0x4b, 0xfb, 0x38, 0xfb, 0x17, 0xfb, 0xe, 0x8b, 0xf7, + 0xf, 0xa7, 0x1e, 0xf8, 0x2f, 0xf1, 0x15, 0xf7, 0x17, 0xb7, 0xdb, 0xaa, + 0xbc, 0x1b, 0xa0, 0xf7, 0x4, 0x87, 0xfb, 0x32, 0x7d, 0x1f, 0xe, 0xae, + 0xfb, 0x60, 0x76, 0xf7, 0x75, 0x77, 0x1, 0xb6, 0xc9, 0x3, 0xda, 0x16, + 0x75, 0x5d, 0x7d, 0x5a, 0x64, 0x1a, 0x6e, 0x93, 0x4d, 0xdb, 0xbb, 0xb2, + 0x9c, 0x96, 0x9e, 0x1e, 0x97, 0xc7, 0x5, 0x7c, 0x66, 0x70, 0x83, 0x74, + 0x1b, 0x81, 0x5c, 0x91, 0xc1, 0xae, 0xa1, 0xbd, 0x91, 0x9a, 0x1f, 0xe, + 0x7d, 0xd1, 0x1, 0xf2, 0xe5, 0xf7, 0xb8, 0xe5, 0x3, 0xf8, 0x1c, 0xf8, + 0xe7, 0x56, 0xa, 0x6f, 0xa, 0xfb, 0x1, 0x6, 0xfb, 0x68, 0x29, 0xa, + 0xa0, 0x76, 0xf8, 0xa4, 0xf7, 0x43, 0x1, 0xf7, 0x63, 0xf7, 0xc1, 0x3, + 0xf7, 0xb7, 0x16, 0xdb, 0x6, 0xf7, 0x1d, 0xf9, 0x53, 0x5, 0x5c, 0x6, + 0x5a, 0x35, 0xfb, 0x18, 0x40, 0x51, 0x72, 0x7c, 0x3d, 0x18, 0xbd, 0x99, + 0xdd, 0xa9, 0xbf, 0xba, 0x8d, 0x89, 0x18, 0xe, 0xf8, 0xac, 0x80, 0xc4, + 0x5f, 0x76, 0xf7, 0xc5, 0xc3, 0xf7, 0xfc, 0x77, 0xa0, 0x77, 0x12, 0xf9, + 0x92, 0xd1, 0x13, 0x6c, 0xf7, 0x6, 0x78, 0x15, 0xd5, 0x6, 0xf9, 0x1f, + 0xf9, 0x66, 0x5, 0x3a, 0x6, 0x13, 0xb4, 0xfb, 0x7d, 0xfd, 0x5e, 0x15, + 0xf7, 0xa7, 0x6, 0x96, 0xc4, 0x5, 0xfb, 0x43, 0x6, 0x9d, 0xa2, 0xa0, + 0x97, 0xca, 0xb2, 0x8, 0xc1, 0xac, 0xb7, 0xa9, 0xc5, 0x1a, 0xba, 0x6b, + 0xc1, 0x2a, 0x3c, 0x5a, 0x6a, 0x44, 0x78, 0x1e, 0xd1, 0x85, 0x5, 0xb3, + 0x98, 0xa4, 0x99, 0xb4, 0x1b, 0xb3, 0x9c, 0x74, 0x75, 0x6b, 0x72, 0x7d, + 0x5a, 0x6e, 0x1f, 0xfb, 0xf, 0x44, 0x6f, 0x55, 0x7b, 0x57, 0x8, 0xfb, + 0xaa, 0xf7, 0xfd, 0x15, 0xd1, 0x6, 0xd4, 0xf7, 0xf4, 0x5, 0x57, 0x6, + 0x5d, 0x53, 0x3c, 0x6f, 0x79, 0x85, 0x7e, 0x50, 0x18, 0xa8, 0x90, 0xb7, + 0x96, 0xb7, 0xab, 0x8, 0xe, 0x65, 0xa, 0xf8, 0xe0, 0x77, 0xa0, 0x77, + 0x12, 0x13, 0x68, 0xf8, 0x6a, 0xc7, 0x15, 0xf7, 0x36, 0x6, 0x7e, 0x44, + 0x5, 0xc6, 0x6, 0x99, 0xd2, 0x5, 0xb4, 0x6, 0x13, 0xa8, 0x96, 0xc1, + 0x5, 0x61, 0x6, 0xb5, 0xf7, 0x77, 0x5, 0x59, 0x6, 0xfb, 0x6a, 0xfb, + 0x74, 0x5, 0xd0, 0x88, 0x15, 0xf7, 0xb, 0xf7, 0xf, 0x70, 0xfb, 0xf, + 0x5, 0xfc, 0x7f, 0xfb, 0x19, 0x15, 0xce, 0x6, 0xf8, 0xdd, 0xf9, 0x66, + 0x5, 0x42, 0x6, 0xfc, 0x74, 0xfb, 0xf5, 0x15, 0xcb, 0x6, 0x13, 0x70, + 0xcc, 0xf7, 0xf4, 0x5, 0x5c, 0x6, 0x64, 0x55, 0x41, 0x6c, 0x7b, 0x86, + 0x80, 0x4f, 0x18, 0xa5, 0x91, 0xb2, 0x95, 0xb3, 0xab, 0x8, 0xe, 0xae, + 0xf7, 0xc2, 0x76, 0xf8, 0x3a, 0x77, 0x1, 0xf7, 0x7a, 0xf7, 0xad, 0x15, + 0xd1, 0x6, 0xd2, 0xf8, 0x3a, 0x5, 0x58, 0x6, 0x5d, 0x48, 0x3d, 0x6b, + 0x79, 0x84, 0x7f, 0x43, 0x18, 0xa7, 0x92, 0xb6, 0x98, 0xb8, 0xb1, 0x8, + 0xe, 0xd3, 0xf7, 0xd1, 0x77, 0xa7, 0x76, 0xf7, 0x4d, 0xd0, 0xf7, 0x47, + 0x77, 0x12, 0xef, 0xd6, 0x13, 0xb8, 0xf7, 0xee, 0xf7, 0xd1, 0x15, 0xd3, + 0x6, 0x84, 0x97, 0x88, 0x95, 0xac, 0x1a, 0x99, 0x89, 0x9d, 0xa0, 0xda, + 0x1e, 0x96, 0xb4, 0x95, 0xb5, 0xb2, 0x1a, 0xd6, 0x6d, 0xc4, 0xfb, 0x4, + 0xfb, 0xa, 0x63, 0x30, 0x69, 0x7e, 0x1e, 0xd6, 0x7d, 0x5, 0xd0, 0xa6, + 0xc4, 0x8c, 0x96, 0x1b, 0xad, 0xb1, 0x76, 0x63, 0x81, 0x89, 0x7f, 0x86, + 0x7c, 0x1f, 0x6b, 0x84, 0x7b, 0x87, 0x5f, 0x8a, 0x8, 0x53, 0x88, 0xfb, + 0xe, 0x82, 0xfb, 0x11, 0x1a, 0x13, 0x78, 0x63, 0xa4, 0x3e, 0xe7, 0xc2, + 0xbc, 0xab, 0x9d, 0x9d, 0x1e, 0x13, 0xb8, 0x8f, 0x74, 0x8b, 0x88, 0x8e, + 0x80, 0x8, 0x95, 0xf7, 0x50, 0x15, 0xfb, 0x16, 0x71, 0x3a, 0x89, 0x7a, + 0x1b, 0x79, 0x64, 0x97, 0xb6, 0xb9, 0xbb, 0x95, 0xab, 0x90, 0x1f, 0xc9, + 0x90, 0x94, 0x8e, 0xa9, 0x93, 0x8, 0xe, 0xce, 0xf7, 0xc4, 0xd7, 0xf7, + 0xad, 0xd7, 0x1, 0xef, 0xd8, 0xf7, 0x6a, 0xd8, 0x3, 0xef, 0xf8, 0x84, + 0x15, 0x27, 0xa9, 0x2f, 0xf7, 0x18, 0xf7, 0x10, 0xdd, 0xf7, 0x22, 0xf7, + 0x6, 0xe7, 0x53, 0xe0, 0xfb, 0x1, 0xfb, 0x23, 0x4f, 0xfb, 0x2f, 0x35, + 0x1e, 0xd8, 0x8d, 0x15, 0xbe, 0xb4, 0xf7, 0x4, 0xe0, 0xbe, 0xb0, 0x61, + 0x50, 0x3c, 0x5b, 0x26, 0x3a, 0x4e, 0x73, 0xbe, 0xce, 0x1e, 0xe, 0xf7, + 0xcd, 0x9b, 0xca, 0xf8, 0x2, 0xca, 0x1, 0xbc, 0xd6, 0xf7, 0xf0, 0xd8, + 0x3, 0xb8, 0x94, 0x15, 0xb8, 0x6c, 0xc4, 0xcb, 0x5, 0x80, 0x9f, 0xb5, + 0x79, 0xca, 0x1b, 0xf7, 0x37, 0xf7, 0xb, 0xf7, 0x13, 0xf7, 0x3d, 0xc4, + 0x80, 0xb9, 0x6e, 0xae, 0x1f, 0xc6, 0xcd, 0x5e, 0xab, 0x51, 0x4b, 0x5, + 0x93, 0x7e, 0x63, 0xa2, 0x43, 0x1b, 0xfb, 0x63, 0x41, 0xfb, 0x3d, 0xfb, + 0x18, 0x40, 0xa2, 0x67, 0x9b, 0x71, 0x1f, 0xc5, 0xca, 0x15, 0x7e, 0xa2, + 0x82, 0xa2, 0xa8, 0x1a, 0xec, 0xcc, 0xf7, 0x20, 0xf7, 0x1d, 0xba, 0xa2, + 0x7a, 0x84, 0x93, 0x1e, 0xfb, 0x72, 0xfb, 0xdc, 0x15, 0xf7, 0x97, 0xf7, + 0xb1, 0x5, 0x90, 0x7c, 0x9b, 0x78, 0x64, 0x1a, 0x24, 0x3b, 0xfb, 0x16, + 0xfb, 0x11, 0x6e, 0x72, 0x93, 0x98, 0x76, 0x1e, 0xe, 0x7d, 0xd0, 0xf8, + 0x15, 0xcf, 0xf2, 0xf7, 0x0, 0x49, 0xcd, 0x8e, 0x77, 0x12, 0xe5, 0xe8, + 0xf7, 0xb8, 0xe8, 0x13, 0xe6, 0xf7, 0x8b, 0xf8, 0xf7, 0x15, 0xcb, 0x6, + 0x13, 0xd6, 0xa4, 0x91, 0x96, 0x9c, 0xa5, 0x1b, 0xad, 0xa1, 0x7d, 0x7f, + 0xa3, 0x1f, 0x82, 0x9d, 0x9e, 0x83, 0xa2, 0x1b, 0xc8, 0xae, 0xc2, 0xc1, + 0x91, 0x1f, 0x4c, 0x69, 0xa, 0x70, 0x1b, 0x7c, 0x78, 0x96, 0x95, 0x73, + 0x1f, 0x13, 0xce, 0x96, 0x73, 0x6e, 0x95, 0x69, 0x1b, 0x13, 0xe6, 0x45, + 0x79, 0x57, 0x50, 0x7b, 0x1f, 0xfb, 0x38, 0xfc, 0x27, 0x24, 0xa, 0xe, + 0xfb, 0x4e, 0x76, 0xf7, 0x53, 0xd5, 0xf8, 0x2a, 0xc9, 0x4d, 0xd5, 0x12, + 0xf8, 0x80, 0xe7, 0x13, 0xd8, 0xf7, 0x3b, 0xdd, 0x15, 0x4b, 0xad, 0xbb, + 0x69, 0xd0, 0x1b, 0xf7, 0x1c, 0xf7, 0x16, 0xf7, 0x25, 0xf7, 0x53, 0xf7, + 0x21, 0x3c, 0xd8, 0x26, 0x45, 0x5c, 0x65, 0x5d, 0x5c, 0x1f, 0x13, 0xe8, + 0x9b, 0xd3, 0x5, 0x35, 0x6, 0xfb, 0x30, 0xfd, 0x71, 0x5, 0xe7, 0x6, + 0xe5, 0xf8, 0x38, 0x15, 0xe0, 0xcb, 0xf7, 0x3a, 0xf7, 0x9, 0xda, 0xaf, + 0x43, 0x43, 0x3e, 0x5c, 0xfb, 0x4d, 0xfb, 0x17, 0x31, 0x6f, 0xda, 0xd7, + 0x1e, 0xe, 0xf7, 0x83, 0xfb, 0x2c, 0x76, 0xf9, 0xc0, 0xda, 0x1, 0xf7, + 0xd2, 0xfb, 0x41, 0x15, 0xd9, 0xf9, 0xc0, 0xf6, 0xfd, 0xc0, 0xda, 0xf9, + 0xc0, 0xcf, 0xda, 0xfb, 0xc0, 0x6, 0xfb, 0xb, 0x22, 0x47, 0xfb, 0x19, + 0x29, 0xd5, 0x2d, 0xf7, 0xa, 0x1f, 0xe, 0x61, 0xa, 0xf7, 0x0, 0xe2, + 0x3, 0xf7, 0x4d, 0xfb, 0x63, 0x15, 0xcd, 0x6, 0x68, 0xf7, 0x0, 0x76, + 0xf7, 0x6, 0xf7, 0x5, 0x1a, 0xf7, 0xda, 0xf7, 0x74, 0xf7, 0x85, 0xae, + 0xb1, 0x1e, 0x46, 0x6, 0xfb, 0x0, 0xfb, 0x12, 0xfb, 0x3d, 0xfb, 0x4b, + 0xfb, 0xbc, 0x1a, 0xfb, 0x5, 0xa6, 0xfb, 0x5, 0xbd, 0xfb, 0x1, 0x1e, + 0xe, 0x61, 0xa, 0xf7, 0x8e, 0xe2, 0x3, 0x82, 0xfb, 0x63, 0x15, 0xd0, + 0x6, 0xf7, 0x0, 0xf7, 0x12, 0xf7, 0x3d, 0xf7, 0x42, 0xf7, 0xbc, 0x1a, + 0xf7, 0x5, 0x70, 0xf7, 0xe, 0x59, 0xf7, 0x1, 0x1e, 0x49, 0x6, 0xae, + 0xfb, 0x0, 0xa0, 0xfb, 0xf, 0xfb, 0x5, 0x1a, 0xfb, 0xda, 0xfb, 0x74, + 0xfb, 0x7c, 0x68, 0x65, 0x1e, 0xe, 0xf8, 0xe3, 0x78, 0xc3, 0xf7, 0x89, + 0xc7, 0x86, 0xc4, 0xf7, 0x8a, 0xc4, 0x91, 0x77, 0x12, 0xf7, 0x27, 0xd8, + 0xf7, 0x3d, 0xd7, 0xee, 0xd7, 0xf7, 0x3c, 0xd8, 0x13, 0xd7, 0x80, 0xf8, + 0xcc, 0xf7, 0x2, 0x15, 0x68, 0x8b, 0x2d, 0xf7, 0x18, 0xf7, 0x4f, 0x8d, + 0xf7, 0x74, 0x91, 0xf7, 0x1, 0x3f, 0xa1, 0x4b, 0x1e, 0xfb, 0x18, 0x5a, + 0xfb, 0x3c, 0x4b, 0x1f, 0xd7, 0x16, 0xae, 0x9f, 0xf7, 0x1d, 0xe3, 0x96, + 0xbc, 0x84, 0x4b, 0x7c, 0x80, 0xfb, 0x33, 0x28, 0x1e, 0x13, 0x37, 0x0, + 0x53, 0x89, 0xbe, 0xa1, 0x1f, 0xfc, 0x85, 0xf7, 0xfd, 0x15, 0x13, 0xb7, + 0x80, 0x68, 0x8b, 0x28, 0xf7, 0x18, 0xf7, 0x4f, 0x8e, 0xf7, 0x72, 0x92, + 0xf7, 0x1, 0x3f, 0xa1, 0x49, 0x1e, 0x13, 0x36, 0x0, 0xfb, 0x16, 0x59, + 0xfb, 0x36, 0x4b, 0x1f, 0xd8, 0x16, 0xad, 0x9f, 0xf7, 0x1b, 0xe2, 0x9f, + 0xb5, 0x7a, 0x52, 0x7d, 0x80, 0xfb, 0x32, 0x26, 0x1e, 0x13, 0x8c, 0x0, + 0x54, 0x89, 0xc3, 0xa0, 0x1f, 0x5f, 0xfc, 0x7e, 0x15, 0xde, 0x6, 0x13, + 0xcf, 0x80, 0xf8, 0xe7, 0xf9, 0x66, 0x5, 0x3a, 0x6, 0xe, 0x77, 0x8b, + 0xf5, 0x1, 0xe2, 0x16, 0xf4, 0x6, 0xa1, 0xf5, 0x5, 0x22, 0x6, 0xe, + 0x77, 0xf7, 0x52, 0xf7, 0x11, 0x1, 0xf7, 0x15, 0xf7, 0x52, 0x15, 0xf5, + 0x6, 0xa1, 0xf7, 0x11, 0x5, 0x21, 0x6, 0xe, 0xf9, 0x52, 0x78, 0xc3, + 0xf7, 0x8c, 0xc4, 0x8b, 0xc3, 0xf7, 0x8b, 0xc3, 0x8d, 0x77, 0x12, 0xe3, + 0xd3, 0xf7, 0x31, 0xd3, 0x8e, 0xd3, 0x13, 0xf7, 0xf7, 0x34, 0xf8, 0x6b, + 0x15, 0x95, 0x9a, 0xf7, 0x38, 0xe4, 0xc0, 0x8b, 0x52, 0x82, 0x67, 0x75, + 0xfb, 0x25, 0x39, 0x56, 0x8b, 0xbd, 0xa2, 0x1e, 0x64, 0xfc, 0x7e, 0x15, + 0xd4, 0x6, 0x13, 0xe8, 0xf8, 0x67, 0xf9, 0x66, 0x5, 0x41, 0x6, 0xfc, + 0x87, 0xfb, 0x7c, 0x5b, 0xa, 0xf7, 0x53, 0xb9, 0x1e, 0x13, 0xf0, 0xd5, + 0x5e, 0xbb, 0x3d, 0xfb, 0x1a, 0x5f, 0xfb, 0x26, 0x37, 0x1e, 0xf7, 0xc4, + 0xfb, 0xfd, 0x5b, 0xa, 0xf7, 0x51, 0xb9, 0xd6, 0x5e, 0xbb, 0x3d, 0xfb, + 0x1a, 0x5f, 0xfb, 0x25, 0x37, 0x1e, 0xd3, 0x16, 0x96, 0x9a, 0xf7, 0x35, + 0xe4, 0xc0, 0x8b, 0x53, 0x81, 0x68, 0x75, 0xfb, 0x24, 0x39, 0x1e, 0x13, + 0x81, 0x56, 0x8b, 0xbd, 0xa2, 0x1f, 0xf7, 0x9d, 0x16, 0x74, 0x8b, 0x21, + 0xf7, 0x10, 0x1e, 0x13, 0x0, 0xf7, 0x2e, 0xa1, 0xf7, 0x53, 0xb7, 0xd7, + 0x5d, 0xba, 0x3f, 0x1f, 0x13, 0x80, 0xfb, 0xe, 0x53, 0xfb, 0x2b, 0x3d, + 0x1f, 0xd3, 0x16, 0x96, 0x9a, 0xf7, 0x35, 0xe4, 0xbf, 0x8b, 0x53, 0x81, + 0x68, 0x75, 0xfb, 0x24, 0x3a, 0x1e, 0x13, 0x0, 0x56, 0x8b, 0xbd, 0xa2, + 0x1f, 0xe, 0xf7, 0xb2, 0xf7, 0x64, 0xe2, 0x1, 0xf7, 0xc0, 0xe6, 0x3, + 0xe0, 0xf7, 0x64, 0x15, 0xf7, 0x6b, 0xfb, 0x64, 0xe6, 0xf7, 0x64, 0xf7, + 0x6b, 0xe2, 0xfb, 0x6b, 0xf7, 0x66, 0x30, 0xfb, 0x66, 0xfb, 0x6b, 0x6, + 0xe, 0xf7, 0xb2, 0x8b, 0xcf, 0xf7, 0x64, 0xcf, 0xf7, 0x36, 0x77, 0x1, + 0xf7, 0xa0, 0xf7, 0x6, 0x15, 0xdd, 0x6, 0xbf, 0xf7, 0x36, 0x5, 0xf7, + 0x55, 0x6, 0xa2, 0xcf, 0x5, 0xfb, 0x55, 0x6, 0xbf, 0xf7, 0x36, 0x5, + 0x3a, 0x6, 0x57, 0xfb, 0x36, 0x5, 0xfb, 0x56, 0x6, 0x75, 0x47, 0x5, + 0xf7, 0x55, 0x6, 0xfb, 0xae, 0xfb, 0xa8, 0x15, 0xf8, 0x67, 0x6, 0xa1, + 0xcf, 0x5, 0xfc, 0x66, 0x6, 0xe, 0xfb, 0x4e, 0x76, 0xf7, 0x53, 0xd4, + 0xf8, 0x2c, 0xd4, 0x7f, 0x77, 0x12, 0xdf, 0xe7, 0x13, 0xd8, 0xf8, 0x31, + 0xc1, 0x15, 0x52, 0xfb, 0x99, 0x5, 0xe8, 0x6, 0xf7, 0x30, 0xf9, 0x71, + 0x5, 0x3b, 0x6, 0x77, 0x2a, 0x5, 0x13, 0xe8, 0xf5, 0x5b, 0x37, 0x8e, + 0x74, 0x1b, 0xfb, 0x26, 0xfb, 0xc, 0xfb, 0x1d, 0xfb, 0x52, 0xfb, 0x3c, + 0xf4, 0x50, 0xd4, 0xb3, 0xba, 0x99, 0xc3, 0xcb, 0x1f, 0xfb, 0x81, 0xf7, + 0x31, 0x15, 0xd1, 0xb7, 0xf7, 0x4c, 0xf7, 0x16, 0xd2, 0xbd, 0x4f, 0x3c, + 0xfb, 0x4, 0x44, 0xfb, 0x31, 0xfb, 0x3, 0x43, 0x62, 0xc1, 0xef, 0x1e, + 0xe, 0x8b, 0xef, 0xf8, 0xbf, 0xd3, 0x1, 0xf7, 0x86, 0xf3, 0x3, 0xf7, + 0x89, 0xf7, 0x47, 0x15, 0xe1, 0x6, 0x96, 0xc7, 0x95, 0xa4, 0xea, 0xd4, + 0x8, 0xe7, 0xd3, 0xd2, 0xc1, 0xe5, 0x1a, 0xeb, 0x35, 0xd9, 0xfb, 0x14, + 0xfb, 0x28, 0x34, 0xfb, 0x9, 0x31, 0x1e, 0xe8, 0x7c, 0x5, 0xb0, 0x90, + 0x9a, 0xf7, 0x5, 0xf7, 0x10, 0x1b, 0xd1, 0xbe, 0x5a, 0x56, 0x4c, 0x49, + 0x5c, 0x56, 0x61, 0x1f, 0x39, 0x4b, 0x4f, 0x5b, 0x7e, 0xfb, 0x2, 0x8, + 0x5d, 0xfb, 0x47, 0x15, 0xf3, 0x6, 0xa1, 0xef, 0x5, 0x23, 0x6, 0xe, + 0xf7, 0xcd, 0xfb, 0x5d, 0xd3, 0xf8, 0x73, 0x77, 0xee, 0xeb, 0x1, 0xe0, + 0xe8, 0x3, 0xf8, 0x56, 0xa2, 0x15, 0x86, 0x66, 0x61, 0xfb, 0x6, 0x24, + 0x8a, 0x8, 0x44, 0x8a, 0x58, 0xb8, 0xc0, 0x1a, 0xcb, 0xcd, 0xc0, 0xc0, + 0xb5, 0x1e, 0xde, 0xcb, 0xc8, 0xbb, 0x98, 0xf7, 0x3, 0x8, 0x34, 0x6, + 0x80, 0x4e, 0x81, 0x72, 0x2b, 0x42, 0x8, 0x2e, 0x43, 0x43, 0x4f, 0x30, + 0x1a, 0x2b, 0xe2, 0x42, 0xf7, 0x16, 0xf7, 0xd, 0xf7, 0x3, 0xf5, 0xf2, + 0x1e, 0xfb, 0x35, 0xf8, 0x39, 0x15, 0xf4, 0x6, 0xa1, 0xeb, 0x5, 0x22, + 0x6, 0xe, 0xc4, 0xf8, 0x78, 0x44, 0xa, 0xf7, 0x3c, 0xf7, 0xa2, 0x3, + 0xf7, 0xd5, 0xf8, 0x63, 0x15, 0xbc, 0x6, 0xb8, 0xf7, 0x1f, 0xa2, 0xf7, + 0x8, 0x3f, 0xa, 0x74, 0xfb, 0x8, 0x5, 0xfb, 0x31, 0xfb, 0x1f, 0x15, + 0xbc, 0x6, 0xb9, 0xf7, 0x1f, 0xa1, 0xf7, 0x8, 0x3f, 0xa, 0x75, 0xfb, + 0x8, 0x5, 0xe, 0xae, 0xfb, 0x14, 0x76, 0xf7, 0x2a, 0xf4, 0x1, 0xa4, + 0x8c, 0x15, 0x37, 0xa, 0x83, 0x62, 0x18, 0x67, 0xa, 0x93, 0xb0, 0x9d, + 0xe6, 0x18, 0x22, 0x6, 0xf7, 0x24, 0x22, 0x15, 0x62, 0xa, 0x83, 0x62, + 0x18, 0xf6, 0x3c, 0xa, 0x22, 0x6, 0xe, 0xae, 0xf8, 0x6a, 0xf4, 0xf7, + 0x2a, 0x77, 0x1, 0xf7, 0x1e, 0xf4, 0x3, 0xf7, 0xc3, 0xf8, 0x6a, 0x33, + 0xa, 0xfb, 0x4c, 0x30, 0x33, 0xa, 0xe, 0xae, 0xf8, 0x78, 0x76, 0xf7, + 0x2a, 0xf4, 0x1, 0xf7, 0x10, 0xf8, 0x63, 0x15, 0x67, 0xa, 0x93, 0xb0, + 0x9d, 0xe6, 0x18, 0x22, 0x6, 0x75, 0x22, 0x5, 0x37, 0xa, 0x8, 0xf7, + 0x32, 0x62, 0x15, 0xf6, 0x3c, 0xa, 0x22, 0x6, 0x75, 0x22, 0x5, 0x62, + 0xa, 0x8, 0xe, 0x3f, 0xf8, 0x7f, 0x44, 0xa, 0xf7, 0x39, 0xf8, 0x6a, + 0x3b, 0xa, 0xea, 0xb7, 0x95, 0x41, 0xa, 0xfb, 0x4, 0x84, 0x66, 0x8, + 0xe, 0x3f, 0xf8, 0x78, 0x44, 0xa, 0xf7, 0x2b, 0xf8, 0x63, 0x15, 0xf7, + 0x0, 0x3c, 0xa, 0x21, 0x6, 0x75, 0x22, 0x5, 0x37, 0xa, 0x8, 0xe, + 0x3f, 0xfb, 0x14, 0x44, 0xa, 0xbf, 0x8c, 0x15, 0x37, 0xa, 0x83, 0x62, + 0x18, 0xf7, 0x0, 0x99, 0xa3, 0xf7, 0x5, 0x93, 0xb0, 0x9e, 0xe6, 0x18, + 0x21, 0x6, 0xe, 0x20, 0xf8, 0x78, 0x44, 0xa, 0xf7, 0x31, 0xf8, 0x63, + 0x15, 0xc1, 0x6, 0xbc, 0xf7, 0x1f, 0xa4, 0xf7, 0x8, 0x57, 0xa, 0x72, + 0xfb, 0x8, 0x5, 0xe, 0xae, 0xa0, 0x76, 0xf8, 0x59, 0xd4, 0x42, 0xe0, + 0x12, 0x13, 0xa0, 0xd8, 0x16, 0xdb, 0x6, 0xb5, 0xf7, 0x67, 0x5, 0xf7, + 0x3, 0xa1, 0xc0, 0xf7, 0x17, 0xe4, 0x1b, 0x9c, 0x9b, 0x86, 0x7e, 0x9a, + 0x1f, 0xae, 0xdf, 0x5, 0x96, 0x76, 0x78, 0x93, 0x74, 0x1b, 0x41, 0x56, + 0x37, 0x68, 0x77, 0x1f, 0x13, 0xc0, 0x9e, 0xf6, 0x5, 0x41, 0x6, 0xe, + 0xf8, 0x4b, 0x78, 0xca, 0xf7, 0xab, 0xc3, 0xf7, 0xe, 0xc2, 0xf7, 0xa, + 0xca, 0x1, 0xc1, 0xcc, 0xf9, 0x21, 0xcc, 0x3, 0xf7, 0x93, 0xf7, 0x2a, + 0x15, 0xd0, 0x6, 0xad, 0xf7, 0x41, 0x5, 0xb3, 0x6, 0xc1, 0x9c, 0x76, + 0x33, 0xad, 0x1f, 0xa3, 0x4b, 0x5, 0xde, 0x6, 0x68, 0xda, 0x65, 0xdc, + 0x7a, 0x98, 0x73, 0x93, 0x19, 0x8c, 0x8d, 0xe3, 0x90, 0xb8, 0xc4, 0x94, + 0xb9, 0x19, 0xec, 0x9d, 0x2d, 0x9d, 0x3a, 0x1b, 0xfb, 0x27, 0x6, 0xad, + 0xfb, 0x45, 0x15, 0xa4, 0xf7, 0xe, 0x5, 0xd9, 0x6, 0xb4, 0xcd, 0x8b, + 0x4f, 0x7f, 0x1f, 0x4d, 0x7e, 0x45, 0x8b, 0x6b, 0x1b, 0xfc, 0x22, 0x78, + 0x15, 0xfb, 0x66, 0xf7, 0x44, 0xfb, 0x3d, 0xf7, 0x6c, 0xf7, 0x6d, 0xf7, + 0x42, 0xf7, 0x3e, 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x45, 0xf7, 0x3c, 0xfb, + 0x6a, 0xfb, 0x6a, 0xfb, 0x46, 0xfb, 0x3b, 0xfb, 0x66, 0x1e, 0xcc, 0x16, + 0xf7, 0x42, 0xf7, 0x25, 0xf7, 0x20, 0xf7, 0x48, 0xf7, 0x4a, 0xf7, 0x26, + 0xfb, 0x20, 0xfb, 0x42, 0xfb, 0x43, 0xfb, 0x26, 0xfb, 0x21, 0xfb, 0x4a, + 0xfb, 0x48, 0xfb, 0x25, 0xf7, 0x21, 0xf7, 0x43, 0x1e, 0xe, 0xae, 0xf8, + 0xd0, 0xb1, 0xf7, 0x0, 0xb1, 0x1, 0xf7, 0x6a, 0xb2, 0xf7, 0x2, 0xb2, + 0x3, 0xf7, 0x6a, 0xf9, 0x2d, 0x15, 0x57, 0xb6, 0x62, 0xbe, 0xbe, 0xb6, + 0xb4, 0xbf, 0xbe, 0x61, 0xb3, 0x57, 0x57, 0x61, 0x63, 0x58, 0x1e, 0xb2, + 0x89, 0x15, 0xaa, 0xa3, 0xa3, 0xaa, 0xaa, 0xa3, 0x74, 0x6b, 0x6d, 0x73, + 0x74, 0x6c, 0x6d, 0x72, 0xa2, 0xa9, 0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd0, + 0xf8, 0x33, 0xd0, 0x12, 0xf7, 0x1d, 0xde, 0xf7, 0x49, 0xe6, 0x57, 0xe4, + 0x13, 0xf0, 0xca, 0xf7, 0x46, 0x15, 0xfb, 0x49, 0xf7, 0x39, 0x7f, 0xbd, + 0xf7, 0x27, 0xce, 0xd4, 0xd8, 0xeb, 0x3f, 0xb7, 0x2a, 0xb5, 0x1e, 0x49, + 0xa7, 0x6a, 0x94, 0xb5, 0x1a, 0xaa, 0xac, 0xb5, 0xcc, 0x1e, 0x13, 0xe8, + 0x9b, 0xf5, 0x81, 0x2e, 0x1f, 0xe4, 0x90, 0x5, 0xf7, 0x1c, 0xfb, 0x14, + 0xaa, 0x3e, 0xfb, 0x1f, 0x5b, 0x3c, 0x4c, 0x34, 0xcd, 0x66, 0xe5, 0x63, + 0x1e, 0x13, 0xf0, 0xca, 0x6f, 0xb8, 0x75, 0x5c, 0x1a, 0x58, 0x56, 0x6d, + 0x4a, 0xfb, 0x14, 0x89, 0xf0, 0xa8, 0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd1, + 0xf8, 0x36, 0xd1, 0x12, 0xf7, 0x20, 0xe2, 0x9f, 0xde, 0xe2, 0xe9, 0x55, + 0xe8, 0x13, 0xf8, 0xca, 0xf7, 0x47, 0x15, 0xfb, 0x4b, 0xf7, 0x40, 0x80, + 0xbf, 0xf7, 0x2e, 0xd1, 0xd6, 0xd7, 0xec, 0x3b, 0xb6, 0x27, 0xb6, 0x1e, + 0x46, 0xa8, 0x68, 0x8a, 0xb5, 0x1a, 0xaa, 0xae, 0xc0, 0xcf, 0x1e, 0x13, + 0xf4, 0x9b, 0xf7, 0x3, 0x8f, 0xfb, 0x0, 0x1f, 0xe8, 0x90, 0x5, 0xf7, + 0x1e, 0xfb, 0x19, 0xaa, 0x3a, 0xfb, 0x27, 0x5a, 0x31, 0x4b, 0x34, 0xd0, + 0x6f, 0xe9, 0x63, 0x1e, 0x13, 0xf8, 0xce, 0x6e, 0xba, 0x77, 0x5a, 0x1a, + 0x58, 0x52, 0x6d, 0x48, 0xfb, 0x19, 0x88, 0xf1, 0xa8, 0x1e, 0xf7, 0x2f, + 0xf8, 0x2d, 0x15, 0xf1, 0x6, 0xf7, 0x1e, 0xf7, 0x1f, 0x50, 0xa, 0x36, + 0x31, 0x62, 0xe5, 0x5, 0x38, 0x6, 0xe, 0xfb, 0x53, 0xce, 0xf9, 0xaa, + 0xd2, 0x1, 0xd7, 0x71, 0x15, 0xfb, 0xb, 0xa4, 0xe7, 0x5d, 0xe8, 0x1b, + 0xf7, 0xb, 0xd0, 0xdc, 0xd9, 0xae, 0x7d, 0xae, 0x6a, 0xb1, 0x1f, 0xed, + 0xbb, 0xad, 0xbe, 0xc2, 0x1a, 0xc9, 0x68, 0xba, 0x29, 0xdb, 0x1e, 0x3b, + 0xcd, 0x5a, 0xb4, 0xc2, 0x1a, 0xb9, 0xb3, 0xb2, 0xc5, 0x9d, 0xe0, 0x88, + 0x27, 0x1e, 0xe1, 0x96, 0x5, 0xbd, 0x83, 0x7a, 0xf7, 0x5, 0xfb, 0x34, + 0x1b, 0xfb, 0xd, 0x4e, 0x40, 0x38, 0x66, 0x99, 0x69, 0xa2, 0x70, 0x1f, + 0x53, 0x6f, 0x3c, 0x5f, 0x29, 0x1a, 0x41, 0xbc, 0x63, 0xc8, 0x57, 0x1e, + 0xf7, 0x1f, 0xfb, 0x7, 0xa3, 0x7a, 0x5e, 0x1a, 0x5d, 0x5f, 0x5d, 0x4d, + 0x73, 0x39, 0x90, 0xf7, 0x5, 0x73, 0x1e, 0xf7, 0x78, 0xf7, 0x14, 0x15, + 0x75, 0xa0, 0x5f, 0xae, 0x64, 0xaa, 0x8, 0x55, 0xb7, 0x6e, 0x9d, 0xb3, + 0x1a, 0xcb, 0xcd, 0xbb, 0xa5, 0x9a, 0x1e, 0xac, 0x67, 0xbd, 0x5f, 0xbf, + 0x60, 0x8, 0xb6, 0x66, 0x98, 0x79, 0x6d, 0x1a, 0x73, 0x7c, 0x5d, 0x3b, + 0x65, 0x1e, 0xe, 0x77, 0xfb, 0x12, 0x76, 0xf7, 0x3b, 0x76, 0xf8, 0x39, + 0xeb, 0x1, 0xc3, 0xf7, 0x89, 0x3, 0xe2, 0x8a, 0x15, 0xc5, 0x6, 0x77, + 0x30, 0x5f, 0x7f, 0x7b, 0x87, 0x82, 0x64, 0x18, 0xf6, 0x98, 0xa4, 0xf7, + 0x3, 0x92, 0xae, 0x9d, 0xe2, 0x18, 0x23, 0x6, 0xcd, 0xf7, 0xd5, 0x40, + 0xa, 0xe, 0xa0, 0x76, 0xf9, 0x9, 0xda, 0x1, 0xf7, 0x3a, 0x16, 0xf1, + 0x6, 0xb9, 0xf7, 0x52, 0xf7, 0x1b, 0xf7, 0x94, 0xf7, 0x5d, 0xf7, 0x3b, + 0x9e, 0xda, 0x18, 0xfc, 0x95, 0x6, 0x78, 0x3c, 0x5, 0xf8, 0x24, 0x6, + 0xfb, 0x63, 0xfb, 0x51, 0xfb, 0x1d, 0xfb, 0xa1, 0x70, 0xfb, 0x2f, 0x8, + 0xe, 0x78, 0xd0, 0xf7, 0xec, 0xd0, 0xf7, 0x44, 0xd4, 0x1, 0xe6, 0xe9, + 0xf7, 0xb8, 0xe5, 0x3, 0xf7, 0x6f, 0xf8, 0x29, 0x15, 0xac, 0x93, 0xcb, + 0xf7, 0x54, 0xf7, 0x17, 0x1b, 0xd0, 0xa7, 0x58, 0x50, 0x93, 0x1f, 0xe3, + 0x93, 0x5, 0xe0, 0x83, 0x5a, 0xe5, 0xfb, 0x16, 0x1b, 0xfb, 0x95, 0x3b, + 0xfb, 0xf2, 0xfb, 0x24, 0xfb, 0x4d, 0xf7, 0x11, 0x60, 0xef, 0xf7, 0x30, + 0xf7, 0x0, 0xf7, 0x13, 0xf7, 0x25, 0xf7, 0x19, 0x2c, 0xd8, 0x20, 0x3d, + 0x52, 0x64, 0x78, 0x73, 0x1f, 0x69, 0xfb, 0x58, 0x15, 0xf7, 0xd, 0xe5, + 0xcb, 0xde, 0xd9, 0xc1, 0x4d, 0x3c, 0x28, 0x37, 0x23, 0x33, 0x3e, 0x53, + 0xe4, 0xd1, 0x1e, 0xe, 0x77, 0x8d, 0x76, 0x1, 0x88, 0xf8, 0x6d, 0x3, + 0x76, 0x78, 0x15, 0xd2, 0x6, 0xf8, 0x26, 0xf9, 0x88, 0x5, 0x44, 0x6, + 0xe, 0x77, 0xe, 0x90, 0x76, 0xf7, 0xdc, 0xd3, 0xf7, 0x9c, 0xd1, 0x1, + 0xf7, 0x4c, 0xe6, 0x3, 0xc6, 0x7b, 0x15, 0xaf, 0xae, 0xb5, 0x95, 0xb8, + 0x8a, 0xb6, 0x8a, 0xb8, 0x7f, 0xb6, 0x80, 0x8, 0x81, 0xb3, 0xb0, 0x81, + 0xab, 0x1b, 0x95, 0xb9, 0x8b, 0xaf, 0xd7, 0x1f, 0x6f, 0xd9, 0x5, 0x6d, + 0x57, 0x5d, 0x8b, 0x81, 0x1b, 0x6b, 0x69, 0x96, 0x94, 0x65, 0x1f, 0x65, + 0x94, 0x61, 0x93, 0x5c, 0x84, 0x88, 0x8c, 0x18, 0xc0, 0xb1, 0xc2, 0xc4, + 0x88, 0xf7, 0xa, 0x8, 0xf7, 0x11, 0x6, 0x9a, 0xd3, 0x5, 0xfb, 0x23, + 0x6, 0x81, 0xbe, 0x8a, 0xb0, 0x98, 0x1a, 0xf7, 0x18, 0xea, 0xaa, 0xc0, + 0x9e, 0xeb, 0x88, 0xfb, 0x10, 0x9a, 0x1e, 0xdc, 0x93, 0x5, 0xf7, 0x30, + 0x7a, 0xfb, 0xd, 0xac, 0x43, 0x1b, 0xfb, 0x14, 0xfb, 0x4, 0x28, 0xfb, + 0x1a, 0x5f, 0x8d, 0x7e, 0x92, 0x5f, 0x1f, 0x35, 0x6, 0x7c, 0x43, 0x5, + 0xf7, 0x1, 0x6, 0x9f, 0xfb, 0xa, 0xfb, 0x11, 0x29, 0x5c, 0x70, 0x8, + 0xe, 0x77, 0x84, 0xd2, 0xf7, 0xfd, 0xcb, 0xf7, 0x48, 0x77, 0x1, 0xf7, + 0x3, 0xf7, 0x9d, 0x3, 0xf7, 0xa2, 0x8d, 0x15, 0x9a, 0xcf, 0x5, 0x87, + 0x79, 0x79, 0x89, 0x79, 0x1b, 0x65, 0x8b, 0xb2, 0xbd, 0x96, 0x1f, 0xc7, + 0xf7, 0xa4, 0x5, 0xe4, 0x6, 0x9a, 0xcb, 0x5, 0x32, 0x6, 0xb4, 0xf7, + 0x48, 0x23, 0x51, 0x70, 0xfb, 0xe, 0x5, 0x43, 0x6, 0x7d, 0x4b, 0x5, + 0xd2, 0x6, 0x4b, 0xfb, 0xa4, 0x5, 0x86, 0x72, 0x88, 0x75, 0x77, 0x1a, + 0x51, 0xa8, 0x68, 0xd6, 0x93, 0xa7, 0x8c, 0x93, 0xa7, 0x1e, 0xe, 0xfb, + 0x4e, 0x76, 0xf7, 0x51, 0xd4, 0xf8, 0x26, 0xd4, 0xf7, 0x50, 0x77, 0x1, + 0xb1, 0xe7, 0xf7, 0xfe, 0xe7, 0x3, 0xf7, 0x3c, 0xd9, 0x15, 0x4d, 0xad, + 0xb9, 0x69, 0xd1, 0x1b, 0xf7, 0x1c, 0xf7, 0x16, 0xf7, 0x23, 0xf7, 0x52, + 0xf7, 0x1e, 0x3d, 0xd8, 0x25, 0x57, 0x5d, 0x77, 0x56, 0x52, 0x1f, 0xc5, + 0xf7, 0x99, 0x5, 0x2e, 0x6, 0xfb, 0x5c, 0xfe, 0x31, 0x5, 0xe7, 0x6, + 0xe5, 0xf8, 0x32, 0x15, 0xdf, 0xca, 0xf7, 0x3a, 0xf7, 0xa, 0xd9, 0xb0, + 0x45, 0x43, 0x3e, 0x5b, 0xfb, 0x4b, 0xfb, 0x16, 0x31, 0x6f, 0xd9, 0xd5, + 0x1e, 0xe, 0x78, 0xd0, 0xf7, 0xa3, 0xd4, 0xf7, 0x84, 0xd0, 0x1, 0xf8, + 0x71, 0xeb, 0x3, 0xd6, 0xf7, 0x45, 0x15, 0xfb, 0x20, 0x96, 0xf7, 0x8, + 0x53, 0xf7, 0x3, 0x1b, 0xf7, 0x20, 0xf7, 0xc, 0xe6, 0xf7, 0x15, 0xe5, + 0x48, 0xbf, 0x75, 0x97, 0x1f, 0xe6, 0xb2, 0xae, 0xc3, 0xcf, 0x1a, 0xeb, + 0x38, 0xe4, 0xfb, 0x19, 0x6f, 0xfb, 0x34, 0x87, 0xfb, 0x46, 0x5b, 0x1e, + 0xe8, 0x79, 0x5, 0xe8, 0x9d, 0xce, 0xb1, 0xc5, 0x1b, 0xd0, 0xc0, 0x58, + 0x4a, 0x52, 0x46, 0x48, 0xfb, 0x10, 0x1f, 0x7b, 0x42, 0x5, 0xe8, 0xd8, + 0x61, 0x3d, 0x43, 0x44, 0x3c, 0x27, 0xfb, 0xc, 0x7d, 0xf0, 0xb0, 0x86, + 0x1f, 0xe, 0x65, 0xa, 0xf7, 0x77, 0xc4, 0xf7, 0x92, 0xbe, 0x12, 0xf7, + 0xe7, 0xd3, 0x55, 0xd1, 0x13, 0x7c, 0xf8, 0x79, 0xc7, 0x15, 0xf7, 0x45, + 0x6, 0x7d, 0x44, 0x5, 0xcb, 0x6, 0x9a, 0xd2, 0x5, 0xb8, 0x6, 0x97, + 0xc1, 0x5, 0x5e, 0x6, 0xb8, 0xf7, 0x77, 0x5, 0x55, 0x6, 0xfb, 0x7e, + 0xfb, 0x74, 0x5, 0xd6, 0x88, 0x15, 0xf7, 0x14, 0xf7, 0x11, 0x8d, 0x89, + 0x6e, 0xfb, 0xf, 0x5, 0xfc, 0xb2, 0xf7, 0xdc, 0x15, 0x50, 0x9b, 0xbe, + 0x61, 0xd6, 0x1b, 0xde, 0xc3, 0xbd, 0xc4, 0xc1, 0x66, 0x9a, 0x74, 0x95, + 0x1f, 0x8d, 0x7, 0x13, 0x7a, 0xb7, 0x94, 0xab, 0xa1, 0xbb, 0x1a, 0xc7, + 0x51, 0xae, 0x47, 0x48, 0x57, 0x6c, 0x50, 0x7b, 0x1e, 0xce, 0x82, 0x5, + 0x9e, 0x92, 0x97, 0xa8, 0xbc, 0x1b, 0xa8, 0xa6, 0x7d, 0x6d, 0x5d, 0x5c, + 0x85, 0x60, 0x8a, 0x1f, 0x81, 0x58, 0x5, 0x13, 0xbc, 0xae, 0xba, 0x82, + 0x5c, 0x79, 0x80, 0x6b, 0x51, 0x55, 0x7c, 0xb0, 0x9a, 0x85, 0x1f, 0x5d, + 0xfc, 0x69, 0x15, 0xd4, 0x6, 0xf9, 0x13, 0xf9, 0x66, 0x5, 0x3c, 0x6, + 0xe, 0xae, 0xf7, 0xa2, 0xcf, 0xf7, 0xc4, 0xc8, 0x12, 0xf7, 0xe2, 0xdf, + 0x4b, 0xdd, 0x13, 0xe0, 0xe5, 0xf8, 0x1b, 0x15, 0x45, 0x9d, 0xc5, 0x58, + 0xe2, 0x1b, 0xec, 0xcf, 0xc7, 0xcf, 0xcb, 0x5f, 0x9d, 0x70, 0x98, 0x1f, + 0x8d, 0x7, 0x13, 0xd0, 0xbe, 0x97, 0xb1, 0xa7, 0xc5, 0x1a, 0xd3, 0x48, + 0xb1, 0x3b, 0x3d, 0x4f, 0x66, 0x44, 0x77, 0x1e, 0xda, 0x81, 0x5, 0xa2, + 0x93, 0x98, 0xad, 0xc5, 0x1b, 0xad, 0xaa, 0x7a, 0x67, 0x55, 0x55, 0x83, + 0x59, 0x8a, 0x1f, 0x7f, 0x4d, 0x5, 0x13, 0xe0, 0xb3, 0xc3, 0x8b, 0x53, + 0x75, 0x7e, 0x5b, 0x47, 0x4c, 0x7a, 0xb8, 0x9c, 0x84, 0x1f, 0xe, 0xae, + 0xf8, 0xf3, 0xf7, 0x4, 0x2f, 0x76, 0xb7, 0xd0, 0x8e, 0x77, 0x12, 0xf7, + 0x11, 0xce, 0xf7, 0x7d, 0xcc, 0x13, 0x8c, 0xf7, 0x11, 0xf8, 0xf3, 0x15, + 0xce, 0x6, 0x13, 0x6c, 0xa4, 0x91, 0x97, 0x9d, 0xa6, 0x1b, 0xae, 0xa6, + 0x7e, 0x7f, 0xa3, 0x1f, 0x81, 0x9f, 0x9e, 0x82, 0xa1, 0x1b, 0xcb, 0xaf, + 0xc4, 0xc3, 0x91, 0x1f, 0x4a, 0x6, 0x7c, 0x86, 0x85, 0x72, 0x6f, 0x1b, + 0x7a, 0x78, 0x91, 0x92, 0x78, 0x1f, 0x13, 0x5c, 0x98, 0x6a, 0x69, 0x9c, + 0x6d, 0x1b, 0x13, 0x8c, 0x41, 0x79, 0x55, 0x4e, 0x7a, 0x1f, 0xe, 0xf9, + 0x52, 0xf7, 0xdb, 0x76, 0xf7, 0xf3, 0xc8, 0x1, 0xf9, 0x33, 0xc8, 0x3, + 0xf7, 0x5c, 0xf7, 0xc6, 0x15, 0xd2, 0x6, 0xf7, 0x13, 0xf7, 0xf3, 0x5, + 0xf7, 0x21, 0x6, 0xa0, 0xc8, 0x5, 0xfb, 0xf4, 0x6, 0x75, 0x4e, 0x5, + 0xf7, 0x21, 0x6, 0xf7, 0x31, 0xfb, 0xf3, 0x15, 0xcd, 0x6, 0xf7, 0x12, + 0xf7, 0xf3, 0x48, 0xa, 0x7e, 0xfb, 0xf3, 0x5, 0xcd, 0x6, 0xf7, 0x7d, + 0xf7, 0xed, 0x48, 0xa, 0xfb, 0x10, 0xfb, 0xed, 0x5, 0xcd, 0x6, 0xf7, + 0x28, 0xf8, 0x30, 0x5, 0x23, 0x6, 0xfb, 0x73, 0xfb, 0xdd, 0x4e, 0xa, + 0x96, 0xf7, 0xdd, 0x5, 0x21, 0x6, 0xe, 0x8b, 0xda, 0xf8, 0xbd, 0xd7, + 0x1, 0xf8, 0x63, 0xe9, 0x3, 0xa2, 0x16, 0xf8, 0x58, 0x6, 0x9d, 0xda, + 0x5, 0xfb, 0xe8, 0x6, 0xe1, 0xf7, 0xa, 0xf7, 0x11, 0xc2, 0xcf, 0xc7, + 0x8, 0xa9, 0xa3, 0xea, 0xe1, 0xe8, 0x1a, 0xee, 0x3d, 0xe4, 0xfb, 0x26, + 0xfb, 0x31, 0x49, 0x23, 0x29, 0x7b, 0x1e, 0xe6, 0x80, 0x5, 0xce, 0x98, + 0xb6, 0xd1, 0xe7, 0x1b, 0xd3, 0xc5, 0x5e, 0x48, 0x38, 0x37, 0x53, 0x36, + 0x4b, 0x1f, 0xfb, 0x4a, 0xfb, 0x1b, 0x4d, 0x5f, 0x70, 0xfb, 0x19, 0x8, + 0xe, 0xae, 0xf7, 0xad, 0xcf, 0xf7, 0x76, 0xf7, 0x14, 0x47, 0xcf, 0x1, + 0xf7, 0xfe, 0xe2, 0x3, 0xcb, 0xf7, 0xad, 0x15, 0xf7, 0xe8, 0x6, 0x99, + 0xcf, 0x5, 0xfb, 0x6d, 0x6, 0xa2, 0xa6, 0xa4, 0x9a, 0xda, 0xb9, 0x8, + 0xce, 0xb2, 0xc1, 0xb1, 0xd0, 0x1a, 0xc2, 0x63, 0xcc, 0xfb, 0xc, 0x2a, + 0x4e, 0x63, 0x37, 0x73, 0x1e, 0xe2, 0x83, 0x5, 0xbb, 0x9c, 0xa7, 0x9b, + 0xbd, 0x1b, 0xbd, 0xa2, 0x71, 0x71, 0x64, 0x6d, 0x78, 0x4e, 0x6a, 0x1f, + 0xfb, 0x2c, 0x36, 0x67, 0x4b, 0x78, 0x4d, 0x8, 0xe, 0x7c, 0xd5, 0x62, + 0x76, 0xf8, 0xa2, 0x77, 0x12, 0x13, 0x60, 0xf8, 0x2e, 0x88, 0x15, 0xdd, + 0x6, 0xf7, 0x0, 0xf8, 0xa2, 0x5, 0x33, 0x6, 0x5c, 0xfb, 0x75, 0x7d, + 0x44, 0x7d, 0x4c, 0x55, 0x57, 0x19, 0x13, 0xa0, 0x62, 0x60, 0x62, 0x7f, + 0x69, 0x1b, 0x4e, 0x5d, 0x97, 0xf7, 0xa, 0xa9, 0x1f, 0xcc, 0xf7, 0xe2, + 0x5, 0x38, 0x6, 0x49, 0xfb, 0xe2, 0x5, 0x85, 0x6b, 0x87, 0x6b, 0x70, + 0x1a, 0x4c, 0xb5, 0x59, 0xf2, 0xd9, 0xca, 0xbd, 0xc3, 0xbd, 0x1e, 0xe, + 0x39, 0xa, 0xf7, 0x78, 0x77, 0x27, 0xa, 0x31, 0xf8, 0x8f, 0x36, 0xa, + 0xe, 0x39, 0xa, 0xe8, 0xf7, 0x1b, 0x27, 0xa, 0xfb, 0x40, 0xf8, 0x8f, + 0x30, 0xa, 0xe, 0x39, 0xa, 0xef, 0xef, 0x27, 0xa, 0x8d, 0xf8, 0x96, + 0x2e, 0xa, 0xe, 0x39, 0xa, 0xe4, 0xf7, 0x1f, 0x27, 0xa, 0x65, 0xf8, + 0x8b, 0x15, 0xd3, 0x6, 0x50, 0x6f, 0xa, 0xfb, 0x3, 0x6, 0xe, 0xfb, + 0x11, 0xbd, 0x1, 0x70, 0x40, 0x15, 0x59, 0xf8, 0xcb, 0xbd, 0x7, 0xe, + 0xf7, 0x5e, 0x43, 0xa, 0xf7, 0x61, 0x16, 0xee, 0x6, 0xf7, 0xbf, 0xf8, + 0x9f, 0x4d, 0xa, 0xfb, 0x83, 0xfc, 0x4e, 0x4e, 0xa, 0x4e, 0xf8, 0x4e, + 0x5, 0x34, 0x6, 0xe, 0xf8, 0x3c, 0x43, 0xa, 0xf8, 0x65, 0xcd, 0x3, + 0xf7, 0x47, 0x16, 0xe7, 0x6, 0xf7, 0x4a, 0xf8, 0x36, 0xa3, 0xfc, 0x36, + 0x5, 0xe6, 0x6, 0xf7, 0x90, 0xf8, 0x9f, 0x5, 0x34, 0x6, 0xfb, 0x51, + 0xfc, 0x38, 0x4e, 0xa, 0x76, 0xf8, 0x38, 0x50, 0xa, 0xfb, 0x48, 0xfc, + 0x3d, 0x4e, 0xa, 0x6a, 0xf8, 0x3d, 0x5, 0x36, 0x6, 0xe, 0xf7, 0x5e, + 0x43, 0xa, 0x96, 0x16, 0xf7, 0xc, 0x6, 0xf7, 0x3a, 0xf7, 0x54, 0xec, + 0xfb, 0x54, 0x5, 0xf4, 0x6, 0xfb, 0x20, 0xf7, 0x98, 0xf7, 0x7f, 0xf7, + 0x9b, 0x5, 0xfb, 0x9, 0x6, 0xfb, 0x36, 0xfb, 0x52, 0x2c, 0xf7, 0x52, + 0x5, 0x22, 0x6, 0xf7, 0x20, 0xfb, 0x93, 0x5, 0xe, 0xf7, 0x5e, 0xfb, + 0x55, 0x76, 0xf9, 0x75, 0x77, 0x1, 0x9f, 0xfb, 0xe, 0x15, 0x86, 0x36, + 0x5, 0x86, 0x9f, 0x9d, 0x89, 0x9c, 0x1b, 0xe8, 0xc0, 0xd1, 0xd3, 0xb3, + 0x1f, 0xf7, 0xec, 0xf8, 0xe7, 0x50, 0xa, 0xfb, 0x86, 0xfc, 0x3a, 0x4e, + 0xf8, 0x3a, 0x3f, 0xa, 0xe4, 0xfc, 0xa3, 0x41, 0xfb, 0x15, 0x74, 0x7e, + 0x38, 0xa3, 0x19, 0xe, 0xf7, 0x5e, 0xfb, 0x55, 0x76, 0xf9, 0x7d, 0x77, + 0xf7, 0x73, 0x77, 0x1, 0xf8, 0x74, 0xeb, 0x3, 0x9f, 0xfb, 0xb, 0x15, + 0x86, 0x36, 0x59, 0xa, 0xd8, 0xce, 0xb2, 0x1f, 0xf7, 0xec, 0xf8, 0xed, + 0x50, 0xa, 0xfb, 0x85, 0xfc, 0x3f, 0x4e, 0xa, 0x4f, 0xf8, 0x3f, 0x45, + 0xa, 0xe5, 0xfc, 0xa8, 0x5, 0xfb, 0x15, 0x53, 0x59, 0x8e, 0x78, 0x1b, + 0x71, 0x7b, 0x8f, 0x8f, 0x7e, 0x1f, 0xf7, 0x97, 0xf9, 0x5f, 0x15, 0xd7, + 0x6, 0xf7, 0x1c, 0xf7, 0x1e, 0x5, 0xfb, 0x9, 0x6, 0xe, 0xf7, 0x5e, + 0xfb, 0x6a, 0xe1, 0xf9, 0x71, 0xf0, 0x1, 0x9f, 0xfb, 0xc, 0x15, 0x86, + 0x37, 0x59, 0xa, 0xd7, 0xce, 0xb2, 0x1f, 0xf7, 0xec, 0xf8, 0xe6, 0x50, + 0xa, 0xfb, 0x85, 0xfc, 0x3a, 0x4e, 0xa, 0x4f, 0xf8, 0x3a, 0x45, 0xa, + 0xe5, 0xfc, 0xa2, 0x5, 0xfb, 0x16, 0x3f, 0x7f, 0x90, 0x66, 0x1b, 0x71, + 0x7b, 0x8f, 0x8f, 0x7e, 0x1f, 0xf8, 0x1b, 0xf9, 0x69, 0x15, 0xeb, 0x6, + 0xa1, 0xf0, 0x50, 0xa, 0xfb, 0x65, 0x26, 0x15, 0xea, 0x6, 0xa1, 0xf0, + 0x50, 0xa, 0xe, 0xa0, 0x76, 0xf7, 0xbf, 0xcb, 0xf7, 0xd9, 0x77, 0x1, + 0xdc, 0xf7, 0x2e, 0x15, 0xf7, 0x58, 0x6, 0x6b, 0xfb, 0x2e, 0x5, 0xe1, + 0x6, 0xac, 0xf7, 0x2e, 0x5, 0xf7, 0x56, 0x6, 0x99, 0xcc, 0x5, 0xfb, + 0x56, 0x6, 0x9b, 0xdb, 0x5, 0xf7, 0x54, 0x6, 0x99, 0xcb, 0x5, 0xfb, + 0x2c, 0x6, 0xf7, 0x8f, 0xf7, 0xd9, 0x5, 0xfb, 0x0, 0x6, 0xfb, 0x77, + 0xfb, 0xd9, 0x4e, 0xa, 0xfb, 0x9, 0xf7, 0xd9, 0x5, 0x33, 0x6, 0xf7, + 0x13, 0xfb, 0xd9, 0x5, 0xfb, 0x35, 0x6, 0x7e, 0x4b, 0x5, 0xf7, 0x59, + 0x6, 0x7b, 0x3b, 0x5, 0xfb, 0x58, 0x6, 0xe, 0xf7, 0x5e, 0x8b, 0xda, + 0xf8, 0x6, 0xd5, 0x1, 0xaa, 0xf8, 0xb0, 0x3, 0xaa, 0x16, 0xf8, 0x5e, + 0x6, 0x9c, 0xda, 0x5, 0xfb, 0xe3, 0x6, 0xf8, 0x18, 0xf8, 0x18, 0x5a, + 0xa, 0xf7, 0xca, 0x6, 0xfc, 0xe, 0xfc, 0x10, 0x5, 0xe, 0xf7, 0x5e, + 0x8b, 0xdb, 0xf8, 0x98, 0xf7, 0x1e, 0x1, 0xaa, 0x16, 0xf8, 0x5e, 0x6, + 0x9c, 0xdb, 0x5, 0xfb, 0xe3, 0x6, 0xf8, 0x18, 0xf8, 0x1c, 0x5a, 0xa, + 0xf7, 0xc8, 0x6, 0x8d, 0x89, 0xfc, 0xe, 0xfc, 0x12, 0x5, 0xf7, 0x9b, + 0xf8, 0xa2, 0x15, 0xf5, 0x6, 0xf7, 0x23, 0xf7, 0x1e, 0x47, 0xa, 0x33, + 0x32, 0x60, 0xe4, 0x5, 0x36, 0x6, 0xe, 0x78, 0xd0, 0xf8, 0xdc, 0xd0, + 0x1, 0xf7, 0x2, 0xe3, 0xf7, 0xd0, 0xe3, 0x3, 0xe8, 0xf7, 0x63, 0x15, + 0xfb, 0x44, 0xf0, 0x59, 0xec, 0xf7, 0x73, 0xe9, 0xf7, 0xbc, 0xf7, 0x50, + 0xf7, 0x4f, 0xfb, 0xd, 0xbe, 0x3b, 0xfb, 0x6c, 0x29, 0xfb, 0xd7, 0xfb, + 0x41, 0x1e, 0xe3, 0x16, 0xa2, 0xac, 0xf8, 0x28, 0xf7, 0x56, 0xf7, 0x3, + 0x8c, 0xfb, 0x1d, 0x6b, 0x38, 0x5a, 0xfb, 0xe0, 0xfb, 0x43, 0x49, 0x5a, + 0xbd, 0xf6, 0x1e, 0xe, 0x78, 0x9e, 0xf8, 0x9f, 0x9a, 0xf7, 0x48, 0x9e, + 0x6, 0xfb, 0x70, 0x98, 0xf8, 0xc0, 0x94, 0x7, 0x78, 0x9e, 0xf8, 0x9f, + 0x9a, 0xf7, 0x48, 0x9e, 0x8, 0xfb, 0x70, 0x98, 0x9, 0x1e, 0xa0, 0x39, + 0x63, 0xff, 0xc, 0x9, 0xdc, 0xa, 0xe5, 0xb, 0xd5, 0x92, 0xc, 0xc, + 0xe5, 0x95, 0xc, 0xd, 0xf8, 0xc0, 0x14, 0xf7, 0xbe, 0x15, 0xc3, 0x13, + 0x0, 0x50, 0x2, 0x0, 0x1, 0x0, 0x4e, 0x0, 0x92, 0x0, 0x99, 0x0, + 0xc9, 0x1, 0x1, 0x1, 0x49, 0x1, 0x72, 0x1, 0xb1, 0x1, 0xb6, 0x1, + 0xbb, 0x1, 0xde, 0x1, 0xe1, 0x2, 0x13, 0x2, 0x1a, 0x2, 0x22, 0x2, + 0x2a, 0x2, 0x3a, 0x2, 0x40, 0x2, 0x4b, 0x2, 0x58, 0x2, 0x61, 0x2, + 0x66, 0x2, 0x72, 0x2, 0x7b, 0x2, 0x84, 0x2, 0x8c, 0x2, 0x96, 0x2, + 0xa0, 0x2, 0xa8, 0x2, 0xac, 0x2, 0xaf, 0x2, 0xb3, 0x2, 0xbc, 0x2, + 0xc5, 0x2, 0xcc, 0x2, 0xd3, 0x2, 0xd9, 0x2, 0xdd, 0x2, 0xeb, 0x2, + 0xef, 0x2, 0xf3, 0x2, 0xfb, 0x3, 0x3, 0x3, 0xa, 0x3, 0xf, 0x3, + 0x13, 0x3, 0x17, 0x3, 0x22, 0x3, 0x26, 0x3, 0x2d, 0x3, 0x33, 0x3, + 0x3a, 0x3, 0x40, 0x3, 0x45, 0x3, 0x4a, 0x3, 0x4e, 0x3, 0x58, 0x3, + 0x62, 0x3, 0x6c, 0x3, 0x76, 0x3, 0x7a, 0x3, 0x83, 0x3, 0x8c, 0x3, + 0x95, 0x3, 0x9e, 0x3, 0xa7, 0x3, 0xb0, 0x3, 0xb8, 0x3, 0xc1, 0x3, + 0xca, 0x3, 0xd0, 0x3, 0xd4, 0x3, 0xda, 0x3, 0xe0, 0x3, 0xe5, 0x3, + 0xea, 0x3, 0xef, 0x3, 0xf3, 0x3, 0xf7, 0x3, 0xfb, 0x6e, 0xa, 0x85, + 0xa7, 0x87, 0x9f, 0xa4, 0x1a, 0xae, 0x91, 0xae, 0x92, 0xad, 0x1e, 0xa9, + 0xf7, 0x18, 0x5, 0x97, 0xc4, 0x8f, 0xa5, 0x91, 0x1a, 0xe3, 0x2d, 0xc8, + 0xfb, 0x2, 0x30, 0xfb, 0x11, 0x5f, 0xfb, 0xc, 0x73, 0x1e, 0xe1, 0x83, + 0x5, 0xd8, 0xa6, 0xcc, 0xa0, 0xc5, 0x1b, 0xa4, 0xe5, 0x87, 0x44, 0x80, + 0x87, 0x6f, 0x83, 0x74, 0x1f, 0x67, 0x7c, 0x65, 0x89, 0x3d, 0x88, 0x8, + 0x4e, 0x89, 0xfb, 0x48, 0x83, 0xfb, 0x37, 0x1a, 0x28, 0xd6, 0x53, 0xe4, + 0x1e, 0xb, 0x15, 0xfb, 0x41, 0xf7, 0xb, 0xfb, 0x27, 0xf7, 0x5b, 0xf7, + 0x76, 0xf7, 0x45, 0xf7, 0x54, 0xf7, 0x82, 0xf7, 0x54, 0xfb, 0xb, 0xf7, + 0x1c, 0xfb, 0x5c, 0xfb, 0x6a, 0xfb, 0x50, 0xfb, 0x38, 0xfb, 0xa6, 0x1e, + 0xef, 0x86, 0x15, 0xf7, 0x8b, 0xf7, 0x39, 0xf7, 0x7, 0xf7, 0x1d, 0xf7, + 0x4, 0xf6, 0x32, 0xfb, 0x32, 0xfb, 0x47, 0xfb, 0xd, 0xfb, 0x3e, 0xfb, + 0x42, 0xfb, 0x4, 0xfb, 0x6, 0xdd, 0xf7, 0x2c, 0x1e, 0xb, 0x20, 0xa, + 0x13, 0xbc, 0x23, 0xa, 0xb, 0xe7, 0xc9, 0xc1, 0xa4, 0xa7, 0x1f, 0x8c, + 0x80, 0x8d, 0x6d, 0x94, 0x71, 0x8, 0xa1, 0xf7, 0xa4, 0x15, 0x82, 0x55, + 0x81, 0x5f, 0x71, 0x66, 0x8, 0x59, 0x69, 0x54, 0x6e, 0x54, 0x1b, 0x3e, + 0x73, 0xbd, 0xb2, 0xe1, 0xe7, 0x96, 0xc6, 0x90, 0x1f, 0xdd, 0x92, 0xa2, + 0x8d, 0xad, 0x99, 0x8, 0xb, 0x15, 0xfb, 0x22, 0xf1, 0x3b, 0xf7, 0x7, + 0xf7, 0x30, 0xf7, 0x15, 0xf7, 0x1a, 0xf7, 0x57, 0xf7, 0x1d, 0x34, 0xde, + 0xfb, 0x13, 0xfb, 0x4c, 0x23, 0xfb, 0x28, 0xfb, 0x47, 0x1e, 0xe5, 0x16, + 0xf7, 0x3, 0xcb, 0xf7, 0x27, 0xf7, 0x17, 0xe2, 0xb3, 0x43, 0x3c, 0xfb, + 0x4, 0x43, 0xfb, 0x28, 0xfb, 0xe, 0x6d, 0x29, 0x98, 0xf7, 0x20, 0x1e, + 0xb, 0x15, 0xf8, 0x1e, 0x6, 0x8e, 0x9f, 0x8f, 0xa0, 0xb3, 0x1a, 0xe7, + 0x5d, 0xf7, 0x15, 0xfb, 0x38, 0xfb, 0x5a, 0x35, 0xfb, 0x58, 0xfb, 0x1c, + 0xfb, 0x29, 0xe9, 0x3e, 0xf7, 0x7, 0xf7, 0x20, 0xe5, 0xf7, 0x2, 0xd5, + 0xa1, 0x1e, 0x32, 0x94, 0x5, 0x29, 0x61, 0x3a, 0x76, 0x63, 0x1b, 0x4c, + 0x54, 0xbe, 0xf2, 0x96, 0x8c, 0x92, 0x8c, 0x95, 0x1f, 0x99, 0xd1, 0x15, + 0xcf, 0xa0, 0xbf, 0xe9, 0xf5, 0x1b, 0xd2, 0xcd, 0x4b, 0x29, 0x7b, 0x1f, + 0xb, 0x15, 0xf4, 0x6, 0xf7, 0x8, 0xf7, 0x69, 0x5, 0xf7, 0xb6, 0x6, + 0xaf, 0xfb, 0x69, 0x5, 0xe8, 0x6, 0xfb, 0xb, 0xf9, 0x76, 0x5, 0xfb, + 0x5, 0x6, 0xfb, 0x26, 0xfc, 0x54, 0x15, 0xf7, 0x51, 0xf8, 0x4, 0x48, + 0xa, 0xb9, 0xfc, 0x4, 0x5, 0xe, 0x12, 0x13, 0x70, 0xf8, 0x27, 0x88, + 0x15, 0xe0, 0x6, 0xf7, 0x4, 0xf8, 0xa5, 0x45, 0xa, 0x5a, 0xfb, 0x76, + 0x5, 0x21, 0x75, 0x50, 0xfb, 0x1b, 0xfb, 0x12, 0x1b, 0x4b, 0x7a, 0xc5, + 0xd4, 0x9a, 0x1f, 0xd4, 0xf7, 0xe4, 0x45, 0xa, 0x46, 0xfb, 0xe2, 0x5, + 0x87, 0x74, 0x89, 0x76, 0x76, 0x1a, 0x13, 0xb0, 0x3a, 0xae, 0x4e, 0xec, + 0xdc, 0xcc, 0xbd, 0xc4, 0xbf, 0x1e, 0x13, 0x70, 0xb, 0xfd, 0x8, 0x21, + 0xa, 0xe, 0xfc, 0xa2, 0x24, 0xa, 0xe, 0x1, 0xe1, 0x16, 0xf8, 0xbe, + 0x6a, 0xa, 0xfc, 0x5c, 0x6, 0xbf, 0xf7, 0x94, 0x5, 0xf8, 0x29, 0x6, + 0x9d, 0xde, 0x5, 0xfc, 0x29, 0x6, 0xb9, 0xf7, 0x7b, 0x5, 0xf8, 0x40, + 0x6a, 0xa, 0xfc, 0xa0, 0x6, 0xb, 0x23, 0xa, 0xe, 0x15, 0x8b, 0x22, + 0xfc, 0x86, 0x64, 0x1a, 0xfb, 0x25, 0xf7, 0xb, 0x43, 0xf7, 0x27, 0xf7, + 0x91, 0xbb, 0xf7, 0x80, 0xe0, 0x9c, 0x1e, 0xe5, 0xf8, 0x45, 0x57, 0xa, + 0x33, 0xfc, 0x45, 0x5, 0xfb, 0xb, 0x74, 0x49, 0xfb, 0xa, 0xfb, 0x1e, + 0x1b, 0x39, 0x39, 0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xad, 0x5, 0xe, 0xa0, + 0x76, 0xf9, 0x62, 0x77, 0x1, 0xb, 0x2f, 0xa, 0xfb, 0x5d, 0x27, 0x2f, + 0xa, 0xb, 0x15, 0xe7, 0x6, 0xa0, 0xef, 0x3d, 0xa, 0xb, 0x6e, 0xa, + 0xdb, 0xe2, 0xb2, 0x34, 0x5, 0xd9, 0x6, 0x4e, 0xf7, 0x1b, 0x5, 0x2a, + 0x6, 0xb, 0x35, 0xa, 0xf7, 0x69, 0xd8, 0xb, 0xf8, 0x5, 0x8b, 0xdf, + 0xf7, 0x94, 0xde, 0xf7, 0x7b, 0xdf, 0xb, 0x3b, 0xa, 0xe9, 0xb7, 0x96, + 0x41, 0xa, 0xfb, 0x5, 0x84, 0x66, 0x8, 0xb, 0xe9, 0x6, 0xf7, 0x25, + 0xf9, 0x73, 0x3d, 0xa, 0xb, 0xf8, 0x5, 0xa0, 0x76, 0xb, 0x15, 0xd4, + 0x6, 0xf7, 0x16, 0xf7, 0x1b, 0x5, 0xfb, 0x4, 0x6, 0xb, 0xc5, 0x6, + 0x77, 0x2d, 0x5f, 0x80, 0x7a, 0x87, 0xb, 0xdf, 0x6, 0xf4, 0xf8, 0xa3, + 0x5, 0x36, 0x6, 0xb, 0x7c, 0xd5, 0x4d, 0xc9, 0xf8, 0x67, 0x77, 0xb, + 0xa0, 0x76, 0xf8, 0x56, 0xcf, 0xf7, 0x17, 0xda, 0x1, 0xb, 0x15, 0xf4, + 0x6, 0xa1, 0xf4, 0x5, 0x52, 0x6, 0x9e, 0xb, 0x4c, 0xa, 0x92, 0xb0, + 0x9e, 0xe6, 0x18, 0xb, 0x5, 0x2f, 0x6, 0xb, 0x3f, 0xa, 0xe, 0x5, + 0x31, 0x6, 0xb, 0x15, 0xf3, 0x6, 0xa1, 0xeb, 0x5, 0x23, 0x6, 0xb, + 0x9c, 0x8f, 0x93, 0xb4, 0x18, 0x20, 0x7d, 0x72, 0xb, 0x77, 0x1, 0xf7, + 0xf, 0xec, 0x3, 0xb, 0xa0, 0x76, 0xf8, 0x9f, 0x77, 0x1, 0xb, 0x76, + 0xf7, 0x93, 0x77, 0x1, 0xb, 0x5, 0x30, 0x6, 0xb, 0x6, 0xeb, 0xf8, + 0x56, 0x5, 0xf0, 0x6, 0x99, 0xcf, 0x5, 0x26, 0x6, 0xf0, 0xb, 0x5, + 0x27, 0x6, 0xb, 0x5, 0x8d, 0x6, 0xb, 0xf7, 0x2c, 0x76, 0xf8, 0x2d, + 0x77, 0x1, 0xb, 0x7c, 0xd1, 0x66, 0x76, 0xf7, 0x8d, 0xce, 0xb, 0xef, + 0x6, 0xa0, 0xf5, 0x47, 0xa, 0xb, 0x99, 0xa4, 0xf7, 0x5, 0xb, 0x5, + 0x2c, 0x6, 0xb, 0x5, 0x89, 0x6, 0xb, 0x15, 0xdc, 0x6, 0xf7, 0x24, + 0x6d, 0xa, 0xfb, 0x10, 0x6, 0xb, 0x5, 0x2b, 0x6, 0xb, 0x5, 0xfb, + 0x3, 0x6, 0xfb, 0x97, 0xb, 0x5c, 0xa, 0xf8, 0xa3, 0x77, 0xb, 0xae, + 0xf8, 0xe5, 0xf7, 0x21, 0x1, 0xb, 0x5c, 0xa, 0xf9, 0x73, 0x77, 0xb, + 0x6, 0x9c, 0xdc, 0x5, 0xb, 0x15, 0xd1, 0x6, 0x51, 0xb, 0x5, 0x29, + 0x6, 0xb, 0xf7, 0x60, 0x5, 0x3f, 0x6, 0x5e, 0xfb, 0x60, 0x5, 0xb, + 0x5, 0x82, 0xa5, 0xa1, 0x8a, 0x9a, 0x1b, 0xe9, 0xb8, 0xb, 0x97, 0xc3, + 0x5, 0xfc, 0x4c, 0x6, 0x7a, 0x41, 0x5, 0xb, 0x15, 0x74, 0x8b, 0x21, + 0xf7, 0x10, 0xf7, 0x2d, 0xa3, 0xb, 0x77, 0xa0, 0x76, 0xb, 0x15, 0xe1, + 0x6, 0x76, 0x25, 0x5, 0x35, 0x6, 0xb, 0x72, 0x1b, 0x7c, 0x78, 0x95, + 0x95, 0x74, 0x1f, 0xb, 0x77, 0xfb, 0x58, 0xcf, 0xf9, 0xa2, 0xcf, 0x1, + 0xb, 0xa0, 0x76, 0xf8, 0x65, 0xc8, 0x4e, 0xd4, 0x12, 0xb, 0xae, 0xfb, + 0x4e, 0x76, 0xfa, 0x40, 0x77, 0x1, 0xb, 0xc4, 0x6, 0x77, 0x2d, 0x60, + 0x80, 0x7a, 0x87, 0xb, 0x15, 0xea, 0x6, 0xa1, 0xf0, 0x4d, 0xa, 0xb, + 0xf7, 0x84, 0xd4, 0x1, 0xbe, 0xf7, 0x84, 0x15, 0xb, 0xf8, 0xac, 0x8d, + 0x76, 0xa8, 0x76, 0xd2, 0xc1, 0xb, 0x6, 0xa3, 0x90, 0x96, 0x9c, 0xb, + 0xf6, 0x4c, 0xa, 0xb, 0xf4, 0xef, 0xf8, 0x9d, 0xef, 0xb, 0x6, 0x7d, + 0x87, 0x85, 0x72, 0xb, 0x6, 0x9c, 0xdf, 0x5, 0xb, 0x6, 0x9d, 0xdc, + 0x5, 0xb, 0xf8, 0x74, 0x78, 0xdc, 0xb, 0xf7, 0x21, 0x5, 0xb, 0x15, + 0xe6, 0x6, 0xb, 0xf7, 0x1f, 0x5, 0xb}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansMM.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansMM.cpp new file mode 100644 index 000000000000..7f540aef1fc1 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSansMM.cpp @@ -0,0 +1,5587 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitSansMMFontData[66919] = { + 0x80, 0x01, 0xD2, 0x29, 0x00, 0x00, 0x25, 0x21, 0x50, 0x53, 0x2D, 0x41, + 0x64, 0x6F, 0x62, 0x65, 0x46, 0x6F, 0x6E, 0x74, 0x2D, 0x31, 0x2E, 0x30, + 0x3A, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53, 0x61, 0x6E, 0x73, + 0x4D, 0x4D, 0x20, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x0D, 0x25, + 0x25, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, + 0x65, 0x3A, 0x20, 0x46, 0x72, 0x69, 0x20, 0x53, 0x65, 0x70, 0x20, 0x32, + 0x39, 0x20, 0x31, 0x36, 0x3A, 0x30, 0x32, 0x3A, 0x35, 0x33, 0x20, 0x32, + 0x30, 0x30, 0x36, 0x0D, 0x25, 0x25, 0x56, 0x4D, 0x75, 0x73, 0x61, 0x67, + 0x65, 0x3A, 0x20, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x35, + 0x30, 0x30, 0x30, 0x30, 0x0D, 0x31, 0x37, 0x20, 0x64, 0x69, 0x63, 0x74, + 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, + 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, + 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x28, 0x30, 0x30, 0x31, + 0x2E, 0x30, 0x30, 0x30, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, + 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x4E, 0x6F, 0x74, 0x69, + 0x63, 0x65, 0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, + 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x75, 0x6C, 0x6C, + 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, + 0x20, 0x53, 0x61, 0x6E, 0x73, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, + 0x46, 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, + 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x73, 0x20, + 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, + 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x49, 0x74, 0x61, 0x6C, 0x69, 0x63, + 0x41, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, + 0x2F, 0x69, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x69, 0x74, 0x63, + 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x65, 0x66, 0x0D, + 0x2F, 0x55, 0x6E, 0x64, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x65, 0x50, 0x6F, + 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x2D, 0x31, 0x30, 0x30, 0x20, + 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E, 0x64, 0x65, 0x72, 0x6C, 0x69, + 0x6E, 0x65, 0x54, 0x68, 0x69, 0x63, 0x6B, 0x6E, 0x65, 0x73, 0x73, 0x20, + 0x35, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x20, 0x28, 0x41, 0x6C, 0x6C, 0x29, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, + 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x50, 0x6F, + 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x5B, 0x5B, 0x30, 0x20, + 0x30, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x30, 0x20, + 0x31, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x20, 0x64, + 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, + 0x69, 0x67, 0x6E, 0x4D, 0x61, 0x70, 0x20, 0x5B, 0x5B, 0x5B, 0x35, 0x30, + 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31, 0x34, 0x35, 0x30, 0x20, 0x31, 0x20, + 0x5D, 0x5D, 0x5B, 0x5B, 0x35, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31, + 0x34, 0x35, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5D, 0x20, 0x64, 0x65, + 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x20, 0x5B, 0x2F, 0x57, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x20, 0x2F, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x5D, 0x20, + 0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x5B, + 0x30, 0x2E, 0x33, 0x31, 0x35, 0x38, 0x20, 0x30, 0x2E, 0x31, 0x33, 0x34, + 0x39, 0x20, 0x30, 0x2E, 0x33, 0x38, 0x34, 0x39, 0x20, 0x30, 0x2E, 0x31, + 0x36, 0x34, 0x34, 0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, + 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x2F, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x65, 0x53, 0x61, 0x6E, 0x73, 0x4D, 0x4D, 0x20, 0x64, 0x65, + 0x66, 0x0D, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, + 0x32, 0x35, 0x36, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x0D, 0x30, 0x20, + 0x31, 0x20, 0x32, 0x35, 0x35, 0x20, 0x7B, 0x31, 0x20, 0x69, 0x6E, 0x64, + 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x2E, 0x6E, 0x6F, + 0x74, 0x64, 0x65, 0x66, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x66, + 0x6F, 0x72, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x32, 0x20, 0x2F, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x34, 0x20, 0x2F, + 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x35, 0x20, 0x2F, 0x6E, 0x75, 0x6D, + 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x33, 0x36, 0x20, 0x2F, 0x64, 0x6F, 0x6C, 0x6C, + 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, + 0x37, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6E, 0x74, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x38, 0x20, 0x2F, 0x61, + 0x6D, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x39, 0x20, 0x2F, 0x71, 0x75, 0x6F, + 0x74, 0x65, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x30, 0x20, 0x2F, 0x70, 0x61, 0x72, + 0x65, 0x6E, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x34, 0x31, 0x20, 0x2F, 0x70, 0x61, 0x72, 0x65, 0x6E, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x34, 0x32, 0x20, 0x2F, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, + 0x73, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, + 0x33, 0x20, 0x2F, 0x70, 0x6C, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x34, 0x34, 0x20, 0x2F, 0x63, 0x6F, 0x6D, 0x6D, + 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x35, + 0x20, 0x2F, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x36, 0x20, 0x2F, 0x70, 0x65, 0x72, + 0x69, 0x6F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x34, 0x37, 0x20, 0x2F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x38, 0x20, 0x2F, 0x7A, 0x65, + 0x72, 0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, + 0x39, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x35, 0x30, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x31, 0x20, 0x2F, 0x74, + 0x68, 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x35, 0x32, 0x20, 0x2F, 0x66, 0x6F, 0x75, 0x72, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x33, 0x20, 0x2F, 0x66, 0x69, + 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, + 0x34, 0x20, 0x2F, 0x73, 0x69, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x35, 0x35, 0x20, 0x2F, 0x73, 0x65, 0x76, 0x65, 0x6E, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x36, 0x20, + 0x2F, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x35, 0x37, 0x20, 0x2F, 0x6E, 0x69, 0x6E, 0x65, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x38, 0x20, 0x2F, + 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x35, 0x39, 0x20, 0x2F, 0x73, 0x65, 0x6D, 0x69, 0x63, 0x6F, + 0x6C, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x36, 0x30, 0x20, 0x2F, 0x6C, 0x65, 0x73, 0x73, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x71, 0x75, + 0x61, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, + 0x32, 0x20, 0x2F, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x33, 0x20, 0x2F, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x36, 0x34, 0x20, 0x2F, 0x61, 0x74, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x35, 0x20, 0x2F, 0x41, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x36, 0x20, + 0x2F, 0x42, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, + 0x37, 0x20, 0x2F, 0x43, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x36, 0x38, 0x20, 0x2F, 0x44, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x36, 0x39, 0x20, 0x2F, 0x45, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x30, 0x20, 0x2F, 0x46, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x31, 0x20, 0x2F, 0x47, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x32, 0x20, + 0x2F, 0x48, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, + 0x33, 0x20, 0x2F, 0x49, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x37, 0x34, 0x20, 0x2F, 0x4A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x37, 0x35, 0x20, 0x2F, 0x4B, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x36, 0x20, 0x2F, 0x4C, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x37, 0x20, 0x2F, 0x4D, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x38, 0x20, + 0x2F, 0x4E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, + 0x39, 0x20, 0x2F, 0x4F, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x38, 0x30, 0x20, 0x2F, 0x50, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x38, 0x31, 0x20, 0x2F, 0x51, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x32, 0x20, 0x2F, 0x52, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x33, 0x20, 0x2F, 0x53, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x34, 0x20, + 0x2F, 0x54, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, + 0x35, 0x20, 0x2F, 0x55, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x38, 0x36, 0x20, 0x2F, 0x56, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x38, 0x37, 0x20, 0x2F, 0x57, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x38, 0x20, 0x2F, 0x58, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x39, 0x20, 0x2F, 0x59, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x30, 0x20, + 0x2F, 0x5A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, + 0x31, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x6C, 0x65, + 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, + 0x32, 0x20, 0x2F, 0x62, 0x61, 0x63, 0x6B, 0x73, 0x6C, 0x61, 0x73, 0x68, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x33, 0x20, + 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x34, + 0x20, 0x2F, 0x61, 0x73, 0x63, 0x69, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, + 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x35, + 0x20, 0x2F, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6F, 0x72, 0x65, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x36, 0x20, + 0x2F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x39, 0x37, 0x20, 0x2F, 0x61, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x38, 0x20, 0x2F, 0x62, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x39, 0x20, 0x2F, 0x63, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x30, + 0x20, 0x2F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x30, 0x31, 0x20, 0x2F, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x30, 0x32, 0x20, 0x2F, 0x66, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x33, 0x20, 0x2F, 0x67, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x34, + 0x20, 0x2F, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x30, 0x35, 0x20, 0x2F, 0x69, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x30, 0x36, 0x20, 0x2F, 0x6A, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x37, 0x20, 0x2F, 0x6B, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x38, + 0x20, 0x2F, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x30, 0x39, 0x20, 0x2F, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x31, 0x30, 0x20, 0x2F, 0x6E, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x31, 0x20, 0x2F, 0x6F, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x32, + 0x20, 0x2F, 0x70, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x31, 0x33, 0x20, 0x2F, 0x71, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x31, 0x34, 0x20, 0x2F, 0x72, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x35, 0x20, 0x2F, 0x73, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x36, + 0x20, 0x2F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x31, 0x37, 0x20, 0x2F, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x31, 0x38, 0x20, 0x2F, 0x76, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x39, 0x20, 0x2F, 0x77, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x30, + 0x20, 0x2F, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x32, 0x31, 0x20, 0x2F, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x32, 0x32, 0x20, 0x2F, 0x7A, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x33, 0x20, 0x2F, 0x62, + 0x72, 0x61, 0x63, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x34, 0x20, 0x2F, 0x62, 0x61, + 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, + 0x35, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, + 0x36, 0x20, 0x2F, 0x61, 0x73, 0x63, 0x69, 0x69, 0x74, 0x69, 0x6C, 0x64, + 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, + 0x38, 0x20, 0x2F, 0x45, 0x75, 0x72, 0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x30, 0x20, 0x2F, 0x71, 0x75, 0x6F, + 0x74, 0x65, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x31, 0x20, + 0x2F, 0x66, 0x6C, 0x6F, 0x72, 0x69, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x32, 0x20, 0x2F, 0x71, 0x75, 0x6F, + 0x74, 0x65, 0x64, 0x62, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x33, 0x20, 0x2F, 0x65, + 0x6C, 0x6C, 0x69, 0x70, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x34, 0x20, 0x2F, 0x64, 0x61, 0x67, + 0x67, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x33, 0x35, 0x20, 0x2F, 0x64, 0x61, 0x67, 0x67, 0x65, 0x72, 0x64, + 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x33, 0x36, 0x20, 0x2F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, + 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x74, 0x68, 0x6F, 0x75, 0x73, + 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x33, 0x38, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x39, 0x20, + 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x6C, 0x65, + 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x34, 0x30, 0x20, 0x2F, 0x4F, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x34, 0x35, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, + 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x31, 0x34, 0x36, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x31, 0x34, 0x37, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, + 0x64, 0x62, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x38, 0x20, 0x2F, 0x71, 0x75, 0x6F, + 0x74, 0x65, 0x64, 0x62, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x39, 0x20, 0x2F, + 0x62, 0x75, 0x6C, 0x6C, 0x65, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x35, 0x30, 0x20, 0x2F, 0x65, 0x6E, 0x64, 0x61, + 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x35, 0x31, 0x20, 0x2F, 0x65, 0x6D, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x32, 0x20, 0x2F, + 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x31, 0x35, 0x33, 0x20, 0x2F, 0x74, 0x72, 0x61, 0x64, 0x65, + 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x31, 0x35, 0x34, 0x20, 0x2F, 0x73, 0x63, 0x61, 0x72, 0x6F, 0x6E, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x35, + 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x31, 0x35, 0x36, 0x20, 0x2F, 0x6F, 0x65, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x39, 0x20, 0x2F, 0x59, 0x64, + 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x78, 0x63, + 0x6C, 0x61, 0x6D, 0x64, 0x6F, 0x77, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x32, 0x20, 0x2F, 0x63, 0x65, 0x6E, + 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, + 0x33, 0x20, 0x2F, 0x73, 0x74, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x67, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x34, 0x20, + 0x2F, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x35, 0x20, 0x2F, 0x79, + 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x36, 0x36, 0x20, 0x2F, 0x62, 0x72, 0x6F, 0x6B, 0x65, 0x6E, 0x62, 0x61, + 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, + 0x37, 0x20, 0x2F, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x38, 0x20, 0x2F, + 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x39, 0x20, 0x2F, 0x63, 0x6F, + 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x30, 0x20, 0x2F, 0x6F, 0x72, 0x64, + 0x66, 0x65, 0x6D, 0x69, 0x6E, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x31, 0x20, 0x2F, 0x67, 0x75, + 0x69, 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x32, 0x20, + 0x2F, 0x6C, 0x6F, 0x67, 0x69, 0x63, 0x61, 0x6C, 0x6E, 0x6F, 0x74, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x34, 0x20, + 0x2F, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x35, 0x20, + 0x2F, 0x6D, 0x61, 0x63, 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x36, 0x20, 0x2F, 0x64, 0x65, 0x67, + 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x37, 0x37, 0x20, 0x2F, 0x70, 0x6C, 0x75, 0x73, 0x6D, 0x69, 0x6E, + 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x37, 0x38, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x73, 0x75, 0x70, 0x65, 0x72, + 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x37, 0x39, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x38, 0x30, 0x20, 0x2F, 0x61, 0x63, 0x75, 0x74, + 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, + 0x31, 0x20, 0x2F, 0x6D, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x31, 0x38, 0x32, 0x20, 0x2F, 0x70, 0x61, 0x72, 0x61, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x31, 0x38, 0x33, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, + 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x34, 0x20, 0x2F, 0x63, 0x65, + 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x31, 0x38, 0x35, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x38, 0x36, 0x20, 0x2F, 0x6F, 0x72, 0x64, 0x6D, + 0x61, 0x73, 0x63, 0x75, 0x6C, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x37, 0x20, 0x2F, 0x67, 0x75, + 0x69, 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x38, + 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x39, + 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x68, 0x61, 0x6C, 0x66, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x30, 0x20, 0x2F, 0x74, + 0x68, 0x72, 0x65, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x73, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x31, + 0x20, 0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x64, 0x6F, + 0x77, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x39, 0x32, 0x20, 0x2F, 0x41, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x33, 0x20, 0x2F, + 0x41, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x39, 0x34, 0x20, 0x2F, 0x41, 0x63, 0x69, 0x72, + 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x35, 0x20, 0x2F, 0x41, 0x74, 0x69, + 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x39, 0x36, 0x20, 0x2F, 0x41, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, + 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x39, 0x37, 0x20, 0x2F, 0x41, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x38, 0x20, 0x2F, 0x41, + 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, + 0x39, 0x20, 0x2F, 0x43, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x30, 0x20, + 0x2F, 0x45, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x31, 0x20, 0x2F, 0x45, 0x61, 0x63, + 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x32, 0x30, 0x32, 0x20, 0x2F, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, + 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x32, 0x30, 0x33, 0x20, 0x2F, 0x45, 0x64, 0x69, 0x65, 0x72, 0x65, + 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x32, 0x30, 0x34, 0x20, 0x2F, 0x49, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x35, 0x20, + 0x2F, 0x49, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x36, 0x20, 0x2F, 0x49, 0x63, 0x69, + 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x37, 0x20, 0x2F, 0x49, 0x64, + 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x38, 0x20, 0x2F, 0x45, 0x74, 0x68, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x39, + 0x20, 0x2F, 0x4E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x30, 0x20, 0x2F, 0x4F, 0x67, + 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x32, 0x31, 0x31, 0x20, 0x2F, 0x4F, 0x61, 0x63, 0x75, 0x74, 0x65, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x32, + 0x20, 0x2F, 0x4F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, + 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, + 0x33, 0x20, 0x2F, 0x4F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x34, 0x20, 0x2F, 0x4F, + 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x35, 0x20, 0x2F, 0x6D, 0x75, + 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x32, 0x31, 0x36, 0x20, 0x2F, 0x4F, 0x73, 0x6C, 0x61, + 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x31, 0x37, 0x20, 0x2F, 0x55, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x38, 0x20, 0x2F, + 0x55, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x32, 0x31, 0x39, 0x20, 0x2F, 0x55, 0x63, 0x69, 0x72, + 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x30, 0x20, 0x2F, 0x55, 0x64, 0x69, + 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x32, 0x32, 0x31, 0x20, 0x2F, 0x59, 0x61, 0x63, 0x75, + 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x32, 0x32, 0x20, 0x2F, 0x54, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x33, 0x20, 0x2F, 0x67, + 0x65, 0x72, 0x6D, 0x61, 0x6E, 0x64, 0x62, 0x6C, 0x73, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x34, 0x20, 0x2F, 0x61, + 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x32, 0x32, 0x35, 0x20, 0x2F, 0x61, 0x61, 0x63, 0x75, 0x74, + 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, + 0x36, 0x20, 0x2F, 0x61, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, + 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x32, 0x37, 0x20, 0x2F, 0x61, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x38, 0x20, 0x2F, + 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x39, 0x20, 0x2F, 0x61, + 0x72, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x32, 0x33, 0x30, 0x20, 0x2F, 0x61, 0x65, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x31, 0x20, 0x2F, 0x63, 0x63, + 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x32, 0x33, 0x32, 0x20, 0x2F, 0x65, 0x67, 0x72, 0x61, + 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x33, 0x33, 0x20, 0x2F, 0x65, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x34, 0x20, 0x2F, + 0x65, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x35, 0x20, + 0x2F, 0x65, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x36, 0x20, 0x2F, + 0x69, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x32, 0x33, 0x37, 0x20, 0x2F, 0x69, 0x61, 0x63, 0x75, + 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x33, 0x38, 0x20, 0x2F, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, + 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x32, 0x33, 0x39, 0x20, 0x2F, 0x69, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, + 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x34, 0x30, 0x20, 0x2F, 0x65, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x31, 0x20, 0x2F, 0x6E, 0x74, 0x69, + 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x32, 0x34, 0x32, 0x20, 0x2F, 0x6F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x33, 0x20, + 0x2F, 0x6F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x34, 0x20, 0x2F, 0x6F, 0x63, 0x69, + 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x35, 0x20, 0x2F, 0x6F, 0x74, + 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x32, 0x34, 0x36, 0x20, 0x2F, 0x6F, 0x64, 0x69, 0x65, 0x72, 0x65, + 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x32, 0x34, 0x37, 0x20, 0x2F, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x38, 0x20, + 0x2F, 0x6F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x39, 0x20, 0x2F, 0x75, 0x67, 0x72, + 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x32, 0x35, 0x30, 0x20, 0x2F, 0x75, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x31, 0x20, + 0x2F, 0x75, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x32, + 0x20, 0x2F, 0x75, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x33, 0x20, + 0x2F, 0x79, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x34, 0x20, 0x2F, 0x74, 0x68, 0x6F, + 0x72, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x35, 0x35, 0x20, 0x2F, 0x79, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, + 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, + 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x61, 0x69, 0x6E, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, + 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x31, 0x20, + 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20, + 0x7B, 0x20, 0x30, 0x2E, 0x31, 0x33, 0x34, 0x39, 0x20, 0x6D, 0x75, 0x6C, + 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x33, 0x38, 0x34, 0x39, + 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x20, 0x65, 0x78, 0x63, + 0x68, 0x20, 0x30, 0x2E, 0x31, 0x36, 0x34, 0x34, 0x20, 0x6D, 0x75, 0x6C, + 0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x62, + 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, + 0x74, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x5B, 0x20, 0x30, 0x2E, + 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, + 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, + 0x30, 0x20, 0x5D, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, + 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, + 0x6F, 0x78, 0x20, 0x7B, 0x2D, 0x31, 0x31, 0x39, 0x20, 0x2D, 0x32, 0x35, + 0x37, 0x20, 0x31, 0x31, 0x35, 0x30, 0x20, 0x38, 0x37, 0x32, 0x7D, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, + 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20, 0x33, 0x20, 0x64, 0x69, + 0x63, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, + 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, + 0x7B, 0x20, 0x2D, 0x35, 0x35, 0x20, 0x2D, 0x31, 0x31, 0x32, 0x20, 0x2D, + 0x31, 0x36, 0x32, 0x20, 0x2D, 0x31, 0x34, 0x35, 0x20, 0x7D, 0x20, 0x7B, + 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, + 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x7D, 0x20, 0x7B, + 0x20, 0x34, 0x32, 0x34, 0x20, 0x31, 0x31, 0x35, 0x36, 0x20, 0x31, 0x33, + 0x38, 0x39, 0x20, 0x31, 0x39, 0x38, 0x31, 0x20, 0x7D, 0x20, 0x7B, 0x20, + 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20, + 0x38, 0x37, 0x32, 0x20, 0x7D, 0x7D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, + 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x31, 0x34, 0x20, 0x64, + 0x69, 0x63, 0x74, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, + 0x64, 0x65, 0x66, 0x0D, 0x25, 0x20, 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x30, + 0x2D, 0x31, 0x39, 0x39, 0x34, 0x20, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x73, 0x20, 0x49, 0x6E, 0x63, 0x6F, + 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x65, 0x64, 0x0D, 0x25, 0x20, 0x41, + 0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2E, 0x0D, 0x2F, 0x73, 0x68, 0x61, + 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, + 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, + 0x65, 0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, + 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, + 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, + 0x6C, 0x73, 0x65, 0x20, 0x64, 0x75, 0x70, 0x0D, 0x2F, 0x6D, 0x61, 0x6B, + 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61, + 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, + 0x74, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x2F, 0x6F, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6F, 0x72, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, + 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, + 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x6E, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x31, + 0x31, 0x20, 0x6C, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, + 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, + 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, + 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, + 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, + 0x7B, 0x0D, 0x31, 0x31, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x63, + 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, + 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, + 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x71, 0x0D, 0x7B, 0x20, 0x64, 0x75, + 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x61, + 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, + 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x61, 0x62, 0x73, 0x20, 0x2E, 0x30, + 0x30, 0x31, 0x20, 0x67, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, + 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, + 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, + 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x72, 0x61, + 0x6E, 0x67, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, + 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x64, 0x69, + 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, + 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x46, 0x49, 0x44, 0x20, + 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F, 0x58, + 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, 0x6E, + 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, 0x20, + 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, + 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, + 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x2F, 0x58, 0x55, 0x49, 0x44, + 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, 0x77, + 0x6E, 0x20, 0x7B, 0x0D, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, + 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, + 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x75, + 0x62, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20, 0x7B, + 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, + 0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x63, + 0x6F, 0x70, 0x79, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, + 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x63, 0x76, 0x69, 0x20, 0x33, 0x20, 0x63, + 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20, 0x70, 0x6F, 0x70, 0x20, + 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, + 0x6C, 0x6C, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, + 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, + 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, + 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, + 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, + 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x50, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, + 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x6F, 0x61, + 0x64, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, + 0x67, 0x74, 0x68, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, + 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7B, + 0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F, + 0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, + 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F, + 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, + 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, + 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, 0x64, 0x20, + 0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, + 0x64, 0x65, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x24, 0x42, 0x6C, + 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x5B, 0x0D, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, + 0x63, 0x68, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, + 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x2D, 0x31, 0x20, 0x31, + 0x20, 0x7B, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, + 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x33, 0x20, + 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x73, 0x75, 0x62, 0x20, + 0x67, 0x65, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x71, + 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, + 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, + 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, + 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x2F, 0x70, 0x6F, 0x70, 0x20, 0x6C, + 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, + 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x65, + 0x71, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7B, 0x20, + 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x34, 0x20, 0x31, + 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x33, + 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x2F, 0x6D, 0x75, 0x6C, + 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, + 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, + 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x61, + 0x64, 0x64, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, + 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, 0x78, + 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, + 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, + 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D, 0x70, 0x6F, 0x70, 0x20, + 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, + 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x5D, 0x20, 0x63, 0x76, 0x78, 0x20, 0x64, + 0x65, 0x66, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, + 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, + 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E, 0x65, 0x20, 0x7B, 0x20, + 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, + 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, + 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, + 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x30, 0x20, 0x30, 0x20, + 0x31, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, + 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7B, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, + 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, + 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x6D, 0x75, 0x6C, 0x20, + 0x61, 0x64, 0x64, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D, 0x65, 0x78, + 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, + 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x64, 0x75, + 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, + 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70, + 0x61, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x70, + 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x2F, + 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x20, 0x65, 0x71, + 0x20, 0x7B, 0x0D, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x30, + 0x20, 0x30, 0x20, 0x31, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, + 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, + 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E, + 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, + 0x20, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x20, + 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, + 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, + 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, + 0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64, 0x20, 0x67, 0x65, 0x74, + 0x20, 0x67, 0x74, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x7D, + 0x20, 0x7B, 0x0D, 0x7B, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, + 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, + 0x74, 0x68, 0x20, 0x6E, 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, + 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x74, 0x72, + 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x2F, 0x72, 0x65, 0x61, 0x6C, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6F, 0x72, + 0x20, 0x61, 0x6E, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, + 0x6C, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, + 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x38, 0x20, 0x69, 0x6E, + 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x35, 0x20, 0x69, 0x6E, + 0x64, 0x65, 0x78, 0x20, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x65, 0x78, 0x63, + 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, + 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, + 0x65, 0x78, 0x20, 0x78, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7B, 0x20, + 0x63, 0x76, 0x78, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, + 0x62, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x20, + 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, + 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, + 0x70, 0x61, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, + 0x20, 0x36, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x20, 0x7B, 0x0D, 0x39, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, + 0x65, 0x78, 0x63, 0x68, 0x20, 0x39, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, + 0x20, 0x69, 0x66, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, + 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, + 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, + 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x33, 0x20, + 0x63, 0x6F, 0x70, 0x79, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, + 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x53, 0x74, 0x65, 0x6D, 0x53, 0x6E, + 0x61, 0x70, 0x48, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, + 0x2F, 0x53, 0x74, 0x65, 0x6D, 0x53, 0x6E, 0x61, 0x70, 0x56, 0x20, 0x65, + 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, + 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, + 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B, + 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, + 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, + 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, + 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, + 0x67, 0x65, 0x74, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, + 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E, + 0x64, 0x65, 0x78, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, + 0x30, 0x20, 0x70, 0x75, 0x74, 0x20, 0x30, 0x20, 0x7D, 0x20, 0x69, 0x66, + 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, + 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, + 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, + 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x33, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, + 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, + 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x33, 0x20, 0x63, + 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20, 0x70, 0x6F, 0x70, 0x0D, + 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, + 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, + 0x20, 0x6C, 0x74, 0x20, 0x7B, 0x20, 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, + 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, + 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x30, + 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, + 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20, + 0x7B, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, + 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, + 0x6C, 0x6C, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, + 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x78, + 0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x69, 0x6E, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, + 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, + 0x65, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x64, + 0x69, 0x63, 0x74, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, + 0x20, 0x36, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x33, 0x20, 0x31, 0x20, + 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, + 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, + 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, + 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, + 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, + 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, + 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, + 0x6C, 0x73, 0x65, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, + 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x7D, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, + 0x63, 0x74, 0x20, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20, 0x32, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, + 0x64, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x2F, 0x24, 0x66, 0x62, 0x66, 0x20, 0x7B, 0x20, 0x46, 0x6F, 0x6E, + 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x63, + 0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x33, + 0x20, 0x61, 0x64, 0x64, 0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, + 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x63, 0x6C, 0x65, + 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, + 0x7B, 0x0D, 0x5D, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6E, + 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6D, + 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, + 0x6E, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F, + 0x64, 0x69, 0x6E, 0x67, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, + 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, + 0x6E, 0x67, 0x20, 0x67, 0x65, 0x74, 0x20, 0x70, 0x75, 0x74, 0x20, 0x64, + 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20, + 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x6C, + 0x65, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x67, 0x65, 0x74, 0x20, + 0x6D, 0x61, 0x6B, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x65, 0x74, + 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, + 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, + 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x4E, 0x6F, 0x72, 0x6D, 0x61, + 0x6C, 0x69, 0x7A, 0x65, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, + 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, + 0x35, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x34, 0x30, 0x30, 0x20, + 0x64, 0x69, 0x76, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x35, 0x30, 0x20, + 0x73, 0x75, 0x62, 0x20, 0x31, 0x34, 0x30, 0x30, 0x20, 0x64, 0x69, 0x76, + 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, + 0x2F, 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69, + 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x31, + 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, + 0x20, 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, + 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, + 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, + 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, + 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, + 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, + 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, + 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, + 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, + 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, + 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, + 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, + 0x66, 0x0D, 0x2F, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, + 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x73, 0x61, + 0x76, 0x65, 0x20, 0x7B, 0x20, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, + 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x7D, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7B, + 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, + 0x6C, 0x73, 0x65, 0x0D, 0x2F, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, + 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70, + 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, + 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, + 0x73, 0x65, 0x0D, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x64, + 0x75, 0x70, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x64, 0x69, 0x63, + 0x74, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x7B, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, + 0x65, 0x64, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, + 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, + 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, + 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x73, 0x68, 0x61, + 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x0D, 0x7D, 0x20, 0x7B, 0x20, + 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, + 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x62, 0x65, + 0x67, 0x69, 0x6E, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x62, 0x65, 0x67, 0x69, + 0x6E, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, + 0x69, 0x63, 0x74, 0x20, 0x73, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7D, + 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, + 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, + 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, + 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, + 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, + 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, + 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, + 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x2F, 0x24, 0x6D, 0x6D, 0x66, 0x66, + 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, + 0x74, 0x20, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, + 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, + 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F, + 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, + 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, + 0x20, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, + 0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, + 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, + 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, + 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, + 0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, + 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, + 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67, + 0x65, 0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, + 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, + 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, + 0x7B, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, + 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, + 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, + 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x63, + 0x76, 0x73, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x20, 0x7B, 0x0D, 0x63, 0x76, 0x6E, 0x20, 0x64, 0x75, 0x70, 0x20, + 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, + 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x53, 0x68, + 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, + 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x74, 0x72, + 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, + 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x37, 0x20, 0x61, 0x64, 0x64, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, + 0x20, 0x28, 0x25, 0x66, 0x6F, 0x6E, 0x74, 0x25, 0x29, 0x20, 0x70, 0x75, + 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, + 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, + 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x63, + 0x76, 0x73, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6C, 0x0D, 0x7B, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, + 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B, 0x20, + 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, + 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, + 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, + 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D, 0x24, 0x6D, 0x6D, 0x66, + 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, + 0x6E, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x70, 0x6F, 0x70, + 0x0D, 0x5B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x28, 0x5F, + 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x7B, + 0x20, 0x63, 0x76, 0x72, 0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, + 0x65, 0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, + 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, + 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, + 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, + 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, + 0x73, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, + 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x2F, 0x42, + 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, + 0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, 0x6E, + 0x67, 0x74, 0x68, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, + 0x61, 0x72, 0x6B, 0x20, 0x32, 0x20, 0x73, 0x75, 0x62, 0x20, 0x65, 0x71, + 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20, + 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, + 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, + 0x7B, 0x0D, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x65, 0x44, + 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D, + 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69, 0x67, + 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D, 0x5D, 0x20, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x78, + 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, + 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, + 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, + 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, + 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, + 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, + 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, + 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x6E, 0x64, + 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, + 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, + 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, + 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, + 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, + 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, + 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x0D, 0x2F, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, + 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x64, + 0x75, 0x70, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70, + 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, + 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, + 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, + 0x6C, 0x73, 0x65, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, + 0x64, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x69, 0x6C, + 0x65, 0x20, 0x65, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x80, 0x02, 0x6D, 0xD9, + 0x00, 0x00, 0xE8, 0xDC, 0x61, 0x72, 0x80, 0x71, 0xAB, 0xD4, 0xD5, 0xBC, + 0xD2, 0x30, 0xC4, 0xE1, 0x86, 0xDC, 0xE0, 0x96, 0x54, 0x1C, 0x9C, 0x1F, + 0x2E, 0x58, 0x69, 0x40, 0x4E, 0x33, 0xF9, 0xCE, 0xFF, 0x7D, 0x2F, 0xBF, + 0xEF, 0x5F, 0x26, 0xC7, 0xE1, 0x84, 0x89, 0x54, 0xC7, 0x07, 0x55, 0x24, + 0x4E, 0x73, 0x41, 0xB8, 0x26, 0x97, 0xE2, 0xE8, 0xEA, 0x9C, 0xE9, 0x13, + 0x1D, 0x00, 0x55, 0x78, 0xAB, 0x3D, 0xE1, 0x9F, 0xA9, 0xF2, 0xFA, 0xFF, + 0x3B, 0xEB, 0x53, 0x17, 0x4A, 0x8E, 0x2F, 0x33, 0xE9, 0xDB, 0xE0, 0x38, + 0x63, 0x42, 0xF4, 0x0E, 0x5D, 0xF2, 0x5B, 0x7A, 0x88, 0x22, 0xEE, 0x2B, + 0x6C, 0xDC, 0xAC, 0x58, 0xA9, 0x8F, 0x9B, 0x04, 0x71, 0x44, 0xE3, 0xF6, + 0xE7, 0x4A, 0xB6, 0x0C, 0x00, 0xE4, 0x42, 0xE8, 0x30, 0xB1, 0x30, 0x30, + 0x8A, 0x3F, 0x0E, 0xDF, 0x2C, 0xE6, 0x62, 0x35, 0xF9, 0x21, 0x6D, 0x42, + 0x0F, 0x23, 0xAC, 0xED, 0xEC, 0x60, 0xA8, 0x8A, 0x73, 0x77, 0x14, 0x62, + 0xE1, 0xB2, 0x04, 0x04, 0x29, 0x5D, 0x49, 0xBA, 0x8A, 0x8B, 0xCB, 0xF2, + 0x04, 0x2A, 0x8D, 0xEB, 0x9A, 0x65, 0xBA, 0xF1, 0xC8, 0x24, 0x2F, 0x7E, + 0x90, 0xD9, 0x49, 0x63, 0x23, 0x73, 0xF8, 0x43, 0x8F, 0xC1, 0xE7, 0x37, + 0x37, 0x0B, 0x91, 0x15, 0x08, 0x9D, 0xA7, 0x90, 0xA8, 0x28, 0x50, 0xB6, + 0x91, 0xE6, 0xE9, 0xE2, 0x79, 0x11, 0x12, 0x36, 0xFF, 0xD7, 0xC7, 0x69, + 0xE2, 0x5A, 0x86, 0xDA, 0xFA, 0x47, 0x58, 0x69, 0x73, 0xB5, 0x49, 0xF3, + 0xB4, 0x9B, 0x15, 0x16, 0x9C, 0x35, 0xF5, 0xDD, 0x2F, 0xD1, 0x4A, 0x95, + 0x2A, 0x95, 0x04, 0x43, 0x8B, 0xF2, 0x75, 0x99, 0xA4, 0x90, 0xA6, 0xA1, + 0x0A, 0x87, 0x35, 0x71, 0xEB, 0x17, 0x1A, 0x46, 0x59, 0x3E, 0xC6, 0xF8, + 0x99, 0xF7, 0x60, 0x2C, 0x66, 0x27, 0x4A, 0x48, 0x63, 0x35, 0xAD, 0xC1, + 0xDF, 0x19, 0x26, 0x81, 0x68, 0x9C, 0x17, 0xD4, 0x71, 0x79, 0xEF, 0x5B, + 0xE3, 0xB5, 0xBE, 0xA9, 0xE5, 0xD2, 0x6C, 0xA2, 0x64, 0x0A, 0x14, 0x44, + 0xFE, 0x73, 0x6B, 0x69, 0xEF, 0x3D, 0xF3, 0x0A, 0x79, 0x68, 0x5B, 0x61, + 0x86, 0xAE, 0x9B, 0x42, 0x80, 0x6E, 0xBF, 0x24, 0x85, 0xA9, 0x87, 0x98, + 0x59, 0xBB, 0x30, 0x36, 0x38, 0x81, 0x2A, 0x82, 0xB6, 0x05, 0x19, 0x94, + 0x0A, 0x88, 0x24, 0x8A, 0x57, 0x0C, 0x51, 0x58, 0xE4, 0xAE, 0x1B, 0xE4, + 0xDF, 0xD3, 0x2F, 0x92, 0xBE, 0xB5, 0xDB, 0x51, 0x5E, 0xA2, 0xC4, 0x58, + 0xF0, 0x64, 0xF7, 0x57, 0xFB, 0x61, 0x3E, 0xAA, 0x46, 0xE6, 0x33, 0x46, + 0x6E, 0x45, 0x4D, 0x33, 0x17, 0x66, 0xE7, 0xD7, 0xCE, 0x92, 0xF0, 0xF6, + 0xB2, 0xFB, 0x62, 0x7B, 0xAD, 0x7C, 0x68, 0x0A, 0x8E, 0x14, 0x8F, 0xB7, + 0x48, 0x3D, 0x84, 0xEF, 0x49, 0xDC, 0x52, 0xE3, 0xAA, 0x04, 0xC9, 0xF3, + 0x0B, 0x21, 0x41, 0x96, 0x4D, 0x36, 0xC3, 0x3D, 0x54, 0xE8, 0x82, 0x69, + 0xFF, 0xB1, 0xA8, 0xE3, 0x8A, 0x39, 0xDC, 0xC8, 0x14, 0x0A, 0x49, 0xAC, + 0x96, 0x33, 0x1E, 0x09, 0xE8, 0x62, 0x64, 0x57, 0x82, 0x68, 0x46, 0xAB, + 0xE0, 0xBB, 0xCF, 0xCF, 0x8F, 0xCF, 0x9E, 0x08, 0xB0, 0xAD, 0x98, 0x71, + 0x33, 0x08, 0xE4, 0x5C, 0xCC, 0x7F, 0x17, 0x09, 0x98, 0x65, 0xEE, 0xED, + 0x93, 0x84, 0xC9, 0xFD, 0x46, 0x57, 0xB4, 0xF1, 0x98, 0x3A, 0xB5, 0xC2, + 0x7F, 0xF8, 0xFB, 0x60, 0x78, 0xD7, 0x47, 0xD7, 0x63, 0x58, 0x51, 0xE9, + 0xDC, 0xF1, 0x0E, 0xB8, 0x59, 0x3B, 0x72, 0x81, 0x31, 0xAF, 0xC8, 0x5B, + 0x35, 0x47, 0xF1, 0xBC, 0xCD, 0xED, 0x45, 0xF1, 0xFC, 0x6D, 0xFF, 0x2E, + 0xAA, 0x6C, 0xC2, 0x65, 0x5F, 0x8F, 0x8F, 0x95, 0x20, 0xBA, 0xCA, 0xF9, + 0x68, 0xA5, 0x47, 0x7F, 0xCC, 0xD0, 0xA6, 0x3B, 0xAE, 0xA2, 0xE5, 0x11, + 0x0D, 0x4E, 0x20, 0x44, 0x6B, 0x64, 0xDB, 0x75, 0x68, 0x9D, 0xA4, 0xEC, + 0xB2, 0x1D, 0xDF, 0x66, 0xC5, 0x89, 0x4F, 0x94, 0x0B, 0x06, 0xD9, 0x11, + 0x9C, 0x83, 0x3F, 0x55, 0x21, 0xA0, 0x65, 0x2E, 0x6D, 0x39, 0x6F, 0xCA, + 0x08, 0xDE, 0x60, 0x7F, 0x47, 0xE8, 0x9D, 0xC2, 0x9E, 0x5F, 0x81, 0x9C, + 0xAA, 0xB7, 0x46, 0x0A, 0xAC, 0xA0, 0xFD, 0x22, 0x59, 0xE6, 0xCB, 0x78, + 0xF6, 0x37, 0x7A, 0xD8, 0x6C, 0x8D, 0x61, 0xF1, 0x10, 0xE9, 0x60, 0x74, + 0x4C, 0x43, 0xB0, 0x4B, 0x3C, 0x0A, 0x77, 0x6A, 0xF3, 0xF5, 0xAE, 0x16, + 0x1C, 0xBB, 0x75, 0xDB, 0x81, 0x97, 0xA2, 0xDA, 0x6A, 0x8C, 0xE4, 0xBA, + 0xB4, 0xBE, 0x6C, 0xAD, 0x24, 0x18, 0x37, 0x3F, 0x05, 0x8A, 0x96, 0x9C, + 0x75, 0xD0, 0x97, 0xC5, 0x3B, 0xDB, 0x23, 0xBF, 0x62, 0x76, 0xC8, 0xD3, + 0xFD, 0x09, 0x57, 0xD7, 0x8B, 0x85, 0x1B, 0x9F, 0x65, 0x79, 0x83, 0x16, + 0x10, 0x92, 0xE4, 0x10, 0xB3, 0x65, 0xED, 0x7B, 0x42, 0x3B, 0xC6, 0x05, + 0x03, 0xF7, 0xFE, 0xEE, 0x4B, 0x1E, 0x87, 0x05, 0x65, 0x4E, 0x00, 0xE2, + 0x30, 0x67, 0x0A, 0xDB, 0xAB, 0x57, 0x04, 0xB6, 0x19, 0x39, 0x24, 0xFA, + 0x7F, 0xB8, 0xD9, 0x08, 0x64, 0x38, 0xFA, 0x16, 0xE1, 0xF2, 0x19, 0xB2, + 0x12, 0xBB, 0x5F, 0xDB, 0xEE, 0x81, 0xDA, 0x96, 0x41, 0x88, 0xE0, 0x9B, + 0x41, 0x27, 0x2C, 0x9B, 0xB8, 0x27, 0x41, 0x72, 0xC1, 0xE5, 0xD9, 0xE7, + 0x8D, 0x1F, 0x94, 0xF9, 0xCD, 0x0F, 0x68, 0x0D, 0xD3, 0x24, 0x6B, 0xBB, + 0xD5, 0x65, 0x71, 0x8B, 0xE9, 0x10, 0x4F, 0xED, 0x59, 0xCD, 0xEF, 0x1D, + 0x0E, 0xA7, 0x70, 0xB5, 0x1C, 0x62, 0xE5, 0x05, 0x88, 0x0C, 0xF3, 0x26, + 0x5D, 0xD8, 0x78, 0xA1, 0xF9, 0x79, 0x06, 0x9C, 0x7A, 0x5A, 0xEA, 0x30, + 0xCA, 0x16, 0x0F, 0x4E, 0xBE, 0x5F, 0x97, 0x58, 0xAA, 0x3F, 0x9B, 0xB0, + 0x32, 0xBE, 0xC8, 0x2C, 0x32, 0x70, 0xA1, 0xC3, 0xD9, 0x4A, 0xEB, 0x00, + 0xAF, 0xB2, 0x4E, 0x57, 0x7A, 0x2E, 0xE9, 0x68, 0xBD, 0x27, 0x09, 0x91, + 0xD6, 0xDC, 0xB5, 0x01, 0x5C, 0x6D, 0x1F, 0x98, 0x7C, 0x2E, 0x73, 0x41, + 0x8A, 0x09, 0x1D, 0x00, 0xE6, 0x5A, 0x9C, 0x4A, 0x6C, 0xEF, 0x59, 0x75, + 0x30, 0x70, 0x4C, 0xCF, 0xF1, 0x7F, 0x7B, 0x3F, 0xFA, 0x01, 0x0F, 0xED, + 0x29, 0x31, 0x5A, 0x5E, 0x62, 0x0D, 0x37, 0x52, 0xAB, 0x92, 0x04, 0x28, + 0xA6, 0xA8, 0x88, 0x63, 0x24, 0x0A, 0x38, 0x7F, 0x32, 0xCF, 0xC5, 0xC6, + 0xC0, 0x7C, 0x00, 0x77, 0x6C, 0x4F, 0x36, 0x82, 0xEF, 0x69, 0xF0, 0xEB, + 0xCC, 0x8C, 0x6D, 0x08, 0xFF, 0xCB, 0x03, 0x29, 0x8B, 0xEF, 0x0F, 0x45, + 0x81, 0xA3, 0xDF, 0x22, 0xEE, 0xB4, 0x72, 0x53, 0x20, 0xDC, 0x19, 0x6F, + 0x21, 0xEA, 0xF1, 0xF1, 0x51, 0x98, 0x3C, 0xA8, 0x48, 0x2E, 0x4C, 0xF9, + 0xEB, 0x10, 0x71, 0xFA, 0xF8, 0x87, 0x64, 0xE1, 0xBB, 0xAD, 0xD8, 0x12, + 0xE2, 0x8A, 0x1E, 0xFE, 0x48, 0x1C, 0x0C, 0xA6, 0x3D, 0xBD, 0x33, 0x54, + 0x8E, 0xD9, 0x88, 0x53, 0x55, 0x0D, 0x55, 0x62, 0x4F, 0x2D, 0x36, 0xE6, + 0xDF, 0x7C, 0x0F, 0xAE, 0x0E, 0x78, 0x11, 0xA3, 0x70, 0x65, 0x41, 0xE8, + 0x91, 0x36, 0xEE, 0xB6, 0xDD, 0xAB, 0xBA, 0x1F, 0x0D, 0x06, 0x48, 0x1F, + 0xE0, 0x4C, 0x12, 0xF6, 0xD2, 0x37, 0xC0, 0xBD, 0x5D, 0x34, 0x25, 0xE2, + 0xAB, 0x93, 0x4B, 0xD6, 0x17, 0x7B, 0x95, 0xD9, 0x2B, 0xFE, 0x60, 0xB0, + 0x32, 0xCD, 0x5F, 0x0F, 0x0B, 0x81, 0x58, 0xBC, 0x95, 0x9C, 0x4B, 0x81, + 0xBF, 0xD2, 0xA0, 0x64, 0xDB, 0xE8, 0xE0, 0x6A, 0x49, 0xFB, 0xC4, 0x99, + 0x59, 0x2F, 0x2B, 0xED, 0x21, 0x8D, 0xD7, 0xA7, 0x56, 0x04, 0x67, 0xC6, + 0x0C, 0x89, 0x58, 0x12, 0x5A, 0x5C, 0x27, 0x62, 0x79, 0x0C, 0x5E, 0xC3, + 0xCC, 0x99, 0x5A, 0xCF, 0x71, 0x99, 0x75, 0x2E, 0xBA, 0x1C, 0x28, 0xAA, + 0x64, 0x62, 0x17, 0xF9, 0xCD, 0x38, 0x1A, 0x0B, 0xE3, 0xF7, 0xF7, 0x98, + 0x4F, 0x0D, 0xB5, 0xF0, 0x03, 0x37, 0x68, 0x5F, 0x3D, 0xE8, 0x13, 0x01, + 0xE2, 0x36, 0xF9, 0xB6, 0x25, 0x41, 0xDE, 0x4C, 0x53, 0xD2, 0xD5, 0xB1, + 0xA1, 0x77, 0x1B, 0x9D, 0x3A, 0x67, 0x93, 0xCB, 0x00, 0xB9, 0xA0, 0x50, + 0x56, 0x00, 0xFF, 0xA6, 0xCC, 0x17, 0x5A, 0x4A, 0x5C, 0x98, 0xFA, 0x98, + 0x1E, 0x12, 0x60, 0x50, 0x4B, 0xA9, 0x91, 0x7E, 0x25, 0x9C, 0x30, 0x91, + 0xA9, 0x39, 0x22, 0xC3, 0xF8, 0x6D, 0xDC, 0xC7, 0xE7, 0x09, 0x4A, 0x56, + 0xCA, 0xD8, 0x3B, 0x4F, 0x4D, 0x2F, 0xC2, 0x2B, 0x93, 0x32, 0xE5, 0x47, + 0xEC, 0x14, 0x03, 0xC8, 0xB7, 0xE2, 0xA0, 0x84, 0xF7, 0x99, 0x51, 0x86, + 0x68, 0x08, 0x98, 0x02, 0x41, 0x29, 0x07, 0x56, 0x55, 0xE6, 0x6C, 0x74, + 0xC5, 0x61, 0x7B, 0xDB, 0x33, 0x01, 0xF8, 0xF0, 0xA9, 0x18, 0xFE, 0xC5, + 0x35, 0x8C, 0xB2, 0x80, 0xDA, 0xD0, 0x84, 0x8A, 0xFC, 0x4C, 0x3C, 0x3A, + 0x1F, 0x71, 0xF4, 0x46, 0x63, 0x60, 0x13, 0xF4, 0x1D, 0x82, 0xD7, 0xB0, + 0x48, 0x4F, 0x2E, 0x79, 0xF7, 0xEC, 0x06, 0x12, 0x7A, 0xD2, 0x94, 0x74, + 0x91, 0xC9, 0x68, 0x8A, 0xF0, 0x63, 0xD9, 0x18, 0x3C, 0x8B, 0x54, 0x94, + 0x12, 0x4F, 0xFE, 0x9F, 0x9D, 0x12, 0xFA, 0xAD, 0xEE, 0xD1, 0xFD, 0x56, + 0x31, 0x17, 0x5A, 0xC3, 0x09, 0xC1, 0x35, 0x53, 0x41, 0xEF, 0xF9, 0x9B, + 0x7E, 0xBE, 0xFC, 0xA8, 0x96, 0x6E, 0x8D, 0xFD, 0xB8, 0x42, 0xC3, 0xA7, + 0x78, 0xCB, 0xF9, 0x9B, 0xFB, 0x01, 0xCB, 0x9F, 0xA4, 0xA2, 0x0C, 0x80, + 0xB7, 0x4D, 0x01, 0x50, 0x2F, 0xD3, 0xC1, 0xD5, 0x4B, 0x01, 0xEE, 0xDF, + 0x08, 0x6A, 0xB2, 0xC6, 0x08, 0x49, 0x71, 0x89, 0xB3, 0xF0, 0xC1, 0x50, + 0x74, 0xAC, 0xFE, 0x7E, 0x82, 0xE7, 0xA6, 0x10, 0xF2, 0x0C, 0x5A, 0xEC, + 0xC2, 0xE8, 0x55, 0x40, 0xB0, 0x1E, 0x7F, 0x95, 0xF7, 0x39, 0x1C, 0xA7, + 0xEC, 0xEB, 0x81, 0xF4, 0xCB, 0x82, 0x1D, 0x94, 0x8C, 0xBF, 0xDA, 0xB7, + 0x65, 0x51, 0x05, 0x22, 0x92, 0x3C, 0x7A, 0x38, 0xB1, 0xBB, 0x14, 0xAF, + 0xB1, 0xFF, 0x8A, 0x98, 0x24, 0x1B, 0xE0, 0x51, 0x0B, 0x72, 0xD1, 0x2E, + 0x97, 0xE0, 0x4D, 0xA2, 0xFF, 0x0F, 0x30, 0xAC, 0x7A, 0xD2, 0x88, 0x6C, + 0xB4, 0xCE, 0x67, 0xC2, 0xF7, 0x18, 0x91, 0x1E, 0x1C, 0xF4, 0xFA, 0x0D, + 0xDC, 0x42, 0x3B, 0xA4, 0xB8, 0x48, 0xF3, 0x98, 0x94, 0x5C, 0x57, 0x98, + 0xA9, 0x71, 0x14, 0x5B, 0x79, 0xCF, 0x33, 0xAA, 0xE1, 0x19, 0x49, 0xFC, + 0x2E, 0x66, 0x2C, 0x6C, 0xEB, 0xB8, 0x71, 0x3B, 0x9C, 0x19, 0x14, 0x5C, + 0x95, 0xDB, 0x7D, 0x47, 0xB8, 0x54, 0x14, 0xC9, 0xA8, 0x38, 0xA3, 0x3A, + 0xF8, 0x40, 0xD6, 0x4F, 0x3E, 0x52, 0x48, 0x66, 0xED, 0xE9, 0xB8, 0xB7, + 0x03, 0x0E, 0x4B, 0x8F, 0x84, 0xDF, 0xA3, 0xE4, 0x7A, 0x97, 0xA6, 0xB8, + 0x9C, 0x97, 0xBF, 0x70, 0xDA, 0xAC, 0x71, 0x01, 0xAA, 0xDE, 0x0E, 0xFB, + 0xFA, 0xF1, 0xCF, 0x0D, 0x9C, 0x93, 0xEB, 0xE4, 0xF4, 0xAF, 0xB6, 0x1D, + 0x10, 0xB0, 0x0C, 0xDB, 0x80, 0xF2, 0x9A, 0x8C, 0xB5, 0x5F, 0x2C, 0xB1, + 0x67, 0xE9, 0x3A, 0xD7, 0xE4, 0xCF, 0x20, 0xE7, 0x06, 0x86, 0xFA, 0x23, + 0x8E, 0xBF, 0x85, 0x45, 0x2A, 0x4B, 0x53, 0x45, 0xF1, 0xA2, 0x6C, 0x2A, + 0x4F, 0x4D, 0x67, 0xED, 0x78, 0x15, 0x06, 0x43, 0x94, 0x44, 0xFB, 0x1C, + 0xD5, 0xDB, 0x88, 0x95, 0xD5, 0x53, 0x90, 0xBD, 0xF8, 0x7A, 0xD8, 0xED, + 0xE0, 0x3E, 0x86, 0xC9, 0x9D, 0xFC, 0xA7, 0x29, 0x94, 0x82, 0xC3, 0x71, + 0xB4, 0xE7, 0x77, 0x35, 0x48, 0x7A, 0xA0, 0x79, 0x8A, 0x68, 0x7F, 0xA2, + 0xDF, 0xDA, 0x34, 0x4D, 0x72, 0xD2, 0xB3, 0x51, 0xA6, 0x64, 0x84, 0xF5, + 0x01, 0x74, 0x87, 0x57, 0xA3, 0x3F, 0x25, 0x28, 0xAA, 0x88, 0x75, 0xFC, + 0xE6, 0x79, 0x62, 0xBF, 0xF8, 0xD7, 0xBE, 0x22, 0x13, 0xD2, 0xAD, 0x08, + 0x7D, 0x15, 0xF3, 0x9D, 0x74, 0xB6, 0x49, 0x53, 0xE7, 0x4C, 0xE9, 0x57, + 0x80, 0x5A, 0x8F, 0x5D, 0x75, 0xDE, 0x04, 0x59, 0x0B, 0x8C, 0xC6, 0x1B, + 0x7A, 0xFC, 0xF0, 0x42, 0xC2, 0x6A, 0x17, 0x3A, 0x19, 0x92, 0x66, 0xE3, + 0x04, 0x28, 0x85, 0x02, 0xA3, 0x2F, 0xA8, 0x3D, 0x92, 0x9F, 0xD4, 0xDF, + 0x24, 0x57, 0xF9, 0x61, 0x10, 0xD6, 0x6B, 0x32, 0x5F, 0x7F, 0xC6, 0xDD, + 0x58, 0x4D, 0x83, 0xF9, 0x27, 0x0E, 0xF9, 0x6D, 0x4F, 0x30, 0x32, 0x12, + 0x5A, 0xC5, 0xEA, 0x83, 0x35, 0x14, 0x23, 0x58, 0x66, 0x79, 0x5B, 0x44, + 0x44, 0x9E, 0xBE, 0xBF, 0x2D, 0x02, 0x76, 0x4A, 0x59, 0x2A, 0x1F, 0xC8, + 0xF6, 0x84, 0xD1, 0x87, 0x55, 0xE5, 0x3D, 0xF2, 0xCC, 0x63, 0xE0, 0x47, + 0x1F, 0x14, 0x00, 0x56, 0xF1, 0xF1, 0x7B, 0x45, 0xD2, 0xE6, 0xC9, 0x38, + 0x1C, 0xE1, 0x29, 0x3D, 0xF4, 0x1D, 0x2B, 0x3E, 0x67, 0x9C, 0x67, 0xE4, + 0x82, 0x40, 0x29, 0x55, 0xC4, 0x46, 0xBE, 0x6B, 0xA5, 0x2A, 0xDD, 0xFF, + 0xCA, 0xD0, 0xC9, 0x05, 0x03, 0xA0, 0x4F, 0x0D, 0xA0, 0xA5, 0x04, 0x26, + 0x02, 0x92, 0x16, 0x5C, 0x2D, 0x68, 0xDF, 0x06, 0x87, 0x79, 0x71, 0xA3, + 0x40, 0xB5, 0xCC, 0x1E, 0x71, 0x3C, 0x7F, 0x16, 0xFA, 0xA0, 0xA5, 0x58, + 0xD9, 0x53, 0x93, 0x31, 0x03, 0x28, 0x0A, 0x94, 0x41, 0xC1, 0xEE, 0x61, + 0x47, 0xE0, 0x02, 0x8E, 0x39, 0xEF, 0x6D, 0xA9, 0xD3, 0x00, 0xA0, 0x30, + 0x95, 0xF5, 0xFC, 0xBF, 0xC7, 0x6B, 0x8A, 0x32, 0x16, 0x9E, 0x50, 0xB0, + 0xEF, 0x0C, 0xF3, 0x55, 0x61, 0xD0, 0x21, 0xF7, 0x6B, 0xA0, 0xB9, 0xC9, + 0x69, 0xE7, 0x85, 0xF8, 0xE7, 0x69, 0xC4, 0xB5, 0x27, 0x01, 0x1B, 0xB1, + 0xAD, 0x09, 0x5A, 0xD0, 0x40, 0xC0, 0x1C, 0x34, 0x51, 0x23, 0x3F, 0xD2, + 0xD4, 0x94, 0xBA, 0x42, 0xA8, 0xC9, 0x4B, 0x84, 0x2B, 0x82, 0xDD, 0xDA, + 0x22, 0x14, 0xE0, 0x24, 0x53, 0x12, 0xD0, 0x67, 0x62, 0xC2, 0x4E, 0xF6, + 0x7A, 0xBA, 0xCB, 0xF1, 0xF0, 0xE4, 0x51, 0x2A, 0xA5, 0x48, 0x4C, 0xC6, + 0xC2, 0x30, 0x00, 0xEC, 0xEE, 0xEB, 0xBC, 0xE9, 0x76, 0x4E, 0x23, 0xB1, + 0xCE, 0x05, 0x40, 0x1F, 0x2D, 0x0E, 0xEB, 0x84, 0x96, 0x38, 0x16, 0x5B, + 0xCF, 0x4D, 0xFB, 0x1A, 0xB4, 0x74, 0x61, 0x7C, 0x4D, 0x67, 0x95, 0x79, + 0xB5, 0x81, 0x88, 0x32, 0xDA, 0x84, 0x9D, 0xC1, 0x53, 0x21, 0xDD, 0x0A, + 0xDE, 0x3C, 0xB3, 0xB5, 0xB8, 0x1A, 0xFC, 0x72, 0x7A, 0xB8, 0xEB, 0xC8, + 0xF6, 0x7A, 0x00, 0xDD, 0x2E, 0x7E, 0x52, 0x06, 0x66, 0x0C, 0xFF, 0x3F, + 0x8B, 0x16, 0x4B, 0x1A, 0x9B, 0x3C, 0x17, 0x5B, 0xD8, 0xCB, 0xA0, 0xCA, + 0xF9, 0x41, 0x36, 0xD6, 0xA6, 0x08, 0x6D, 0xFC, 0xD3, 0x77, 0x14, 0x58, + 0xF1, 0xB5, 0x3E, 0x54, 0xDB, 0xAC, 0x03, 0xAC, 0x11, 0x5C, 0x4D, 0xC6, + 0xB5, 0x03, 0x5A, 0xFF, 0x52, 0xA8, 0xDF, 0xDC, 0x39, 0xF3, 0x6A, 0xC8, + 0xB4, 0x23, 0x0B, 0x0B, 0x67, 0x1B, 0x02, 0xBA, 0x79, 0x03, 0x16, 0xB2, + 0xA9, 0xC3, 0xA1, 0x62, 0x6B, 0x96, 0x23, 0x14, 0x6D, 0x8F, 0x94, 0xF1, + 0xD2, 0xEA, 0x5B, 0x3A, 0x48, 0x79, 0x1E, 0x02, 0xCE, 0xE8, 0xF5, 0x2C, + 0x6A, 0xB2, 0x08, 0x62, 0xC6, 0x85, 0x09, 0x9E, 0x5A, 0xD0, 0xE5, 0x34, + 0x75, 0x81, 0xF5, 0xA7, 0x55, 0x6A, 0x31, 0x6E, 0x30, 0x08, 0x1B, 0xF9, + 0xF1, 0x5A, 0x33, 0x36, 0x3C, 0x7D, 0xA9, 0xB5, 0x91, 0x80, 0x06, 0x34, + 0x57, 0xD7, 0xC5, 0xA8, 0x74, 0x0F, 0x01, 0x27, 0x4C, 0x82, 0x98, 0xC6, + 0x6B, 0x4F, 0xC5, 0x7F, 0xFF, 0xAC, 0x13, 0x4A, 0xDA, 0x73, 0x97, 0xBF, + 0xEA, 0xA3, 0xF2, 0xBB, 0xE9, 0x51, 0x7D, 0x7E, 0xE6, 0xE9, 0x15, 0x85, + 0x1D, 0x72, 0x4A, 0xB8, 0xB7, 0x99, 0x3E, 0x9F, 0x71, 0x8F, 0x18, 0x56, + 0x9C, 0xBF, 0x45, 0x54, 0xB8, 0x14, 0x5C, 0x39, 0x7B, 0x93, 0xD8, 0x41, + 0xA7, 0x00, 0x1B, 0x74, 0x47, 0x29, 0x29, 0xB4, 0x42, 0xCF, 0x17, 0x69, + 0x43, 0xB2, 0x2E, 0x38, 0x1E, 0x11, 0xA7, 0x97, 0x6A, 0xB4, 0xB5, 0xDF, + 0x40, 0xE6, 0x75, 0x5B, 0xC0, 0xF0, 0x80, 0xC6, 0xFF, 0x73, 0xD5, 0x45, + 0x03, 0x04, 0x83, 0x17, 0xF4, 0x62, 0xBE, 0xF6, 0x4D, 0x25, 0x84, 0xD6, + 0xB2, 0xE3, 0x34, 0x49, 0xDE, 0x3D, 0x67, 0xF8, 0x7A, 0x7F, 0xFB, 0xF9, + 0xE5, 0x5E, 0xD1, 0x39, 0x8B, 0x9D, 0xFE, 0x7F, 0xE3, 0x0B, 0x8B, 0x48, + 0xA0, 0x9E, 0x15, 0x82, 0x57, 0xAF, 0xBA, 0xFE, 0x65, 0xFE, 0x07, 0x7A, + 0x3B, 0x46, 0xDE, 0x94, 0x7B, 0x69, 0x9C, 0xB0, 0x48, 0x68, 0x14, 0x45, + 0xF6, 0x85, 0xBB, 0x95, 0x94, 0x5E, 0x2D, 0x6C, 0x38, 0x2C, 0xF8, 0x65, + 0x13, 0x88, 0xA7, 0xEA, 0x05, 0xE7, 0x25, 0xAF, 0x13, 0xC8, 0x0F, 0xA3, + 0xDB, 0x1E, 0x58, 0x28, 0x95, 0xBD, 0x34, 0x50, 0x06, 0xEF, 0xBB, 0xC9, + 0x93, 0xA3, 0xD4, 0x2D, 0x4F, 0x07, 0x4F, 0x1D, 0xB8, 0xAF, 0x42, 0x59, + 0x34, 0x8A, 0x33, 0xB0, 0xD5, 0x4E, 0x55, 0x79, 0x0E, 0x53, 0xCD, 0xA4, + 0xE0, 0x96, 0x23, 0x8B, 0x1A, 0x04, 0xB0, 0x48, 0x82, 0xE8, 0xEC, 0xA8, + 0xB8, 0x52, 0xAF, 0xD0, 0xFB, 0xD1, 0xF1, 0xD0, 0x50, 0xFC, 0x7B, 0x27, + 0x38, 0xFC, 0x7A, 0xDE, 0x83, 0x50, 0x7E, 0xD3, 0xE6, 0xF5, 0x45, 0x76, + 0xC5, 0x2D, 0x50, 0xB4, 0x69, 0xF5, 0x10, 0x91, 0xBD, 0x18, 0xB1, 0x49, + 0xE4, 0x6A, 0x17, 0x45, 0xB1, 0xF1, 0x20, 0xC7, 0xE0, 0xC2, 0x02, 0x2D, + 0x3C, 0x91, 0x16, 0x26, 0x25, 0xDE, 0x49, 0x88, 0xB3, 0xD7, 0x91, 0x7D, + 0x21, 0xC1, 0x08, 0xDC, 0xEF, 0x52, 0x15, 0xD8, 0xE5, 0x3B, 0x58, 0xC6, + 0xD9, 0x97, 0x0E, 0x7E, 0xD8, 0x94, 0x4F, 0xCE, 0xCA, 0xD7, 0xC7, 0x3C, + 0xEF, 0xD1, 0x34, 0x3D, 0x78, 0xB6, 0x67, 0xA7, 0x6A, 0x13, 0x9D, 0x1E, + 0x0A, 0x50, 0x67, 0xA0, 0xBF, 0x88, 0xAA, 0x34, 0xB4, 0xAA, 0x47, 0x71, + 0x48, 0x78, 0x34, 0x42, 0xC8, 0x13, 0x1A, 0x96, 0x3E, 0x29, 0xF9, 0x9B, + 0xD3, 0x87, 0xC0, 0x64, 0xD6, 0x5C, 0x76, 0xBF, 0xD4, 0xF2, 0x85, 0xE7, + 0xB6, 0x64, 0x68, 0x47, 0x54, 0xE8, 0x1C, 0x3A, 0x06, 0x06, 0x83, 0xE6, + 0xF2, 0x43, 0x53, 0x2A, 0x8F, 0xFE, 0x8C, 0x04, 0xB0, 0xAB, 0x70, 0xE0, + 0xC7, 0xE3, 0x72, 0x4E, 0xB8, 0x2E, 0xA5, 0x8F, 0x1E, 0xDB, 0x80, 0xE6, + 0x46, 0xDD, 0xE5, 0x55, 0xAB, 0xBB, 0x1C, 0xB4, 0x98, 0xD3, 0x79, 0xAF, + 0xBE, 0x10, 0x9E, 0xB1, 0x33, 0x47, 0xDE, 0xF3, 0x46, 0x10, 0xAB, 0xBB, + 0xF1, 0xDD, 0x24, 0x4E, 0x91, 0xBF, 0x6E, 0xDD, 0xE5, 0x88, 0x46, 0xDB, + 0x44, 0x07, 0x69, 0x38, 0x2A, 0x8D, 0x48, 0xEE, 0xF3, 0xF0, 0xBE, 0xEE, + 0xA4, 0x67, 0x07, 0x25, 0x4D, 0x39, 0x76, 0x74, 0x17, 0xBB, 0x59, 0xA7, + 0x99, 0x49, 0xE7, 0x22, 0x73, 0xCD, 0x83, 0x4E, 0xA5, 0xDD, 0x65, 0xB7, + 0x36, 0x3D, 0xDF, 0x77, 0xF9, 0xB2, 0x5C, 0xD8, 0xC7, 0x0C, 0xCF, 0x7C, + 0x33, 0x7E, 0x28, 0x32, 0xDD, 0xAB, 0x5C, 0x27, 0x80, 0x54, 0x4C, 0xCF, + 0xF4, 0x92, 0xD5, 0xFC, 0x28, 0x15, 0x91, 0x7B, 0x77, 0x28, 0x0E, 0x85, + 0x63, 0xE2, 0x38, 0x6C, 0x10, 0xAE, 0x55, 0xB1, 0x76, 0x69, 0xCA, 0x0E, + 0x1E, 0x86, 0x76, 0x6B, 0x40, 0xC3, 0xA9, 0xD5, 0xDC, 0xB3, 0x2E, 0xBE, + 0x1F, 0xE9, 0x3A, 0x2C, 0xB8, 0x0B, 0xEC, 0xB4, 0xCA, 0x9E, 0x47, 0xCD, + 0x0D, 0x49, 0xC3, 0xB9, 0x28, 0xD9, 0xBF, 0xCD, 0xB9, 0xFA, 0x66, 0xC5, + 0x89, 0xD3, 0xDF, 0x04, 0xC1, 0x06, 0x31, 0xAF, 0xA4, 0xBC, 0xEE, 0xEB, + 0x33, 0xF6, 0x2B, 0x8B, 0xCB, 0xC4, 0x51, 0x84, 0x8D, 0x94, 0xFD, 0xDC, + 0xA8, 0xBC, 0x23, 0xDE, 0x48, 0xF1, 0xE6, 0x20, 0x20, 0x6E, 0x88, 0x6C, + 0x69, 0xA0, 0x3D, 0x3B, 0x7F, 0xE1, 0x35, 0x16, 0x79, 0x23, 0x8E, 0x23, + 0xED, 0x54, 0x7A, 0x1C, 0x90, 0x6C, 0x35, 0xD9, 0x31, 0xD6, 0x9B, 0xE6, + 0x18, 0x41, 0x07, 0x4C, 0x0A, 0xDC, 0x57, 0x8F, 0xEB, 0x04, 0xA2, 0xB9, + 0xDD, 0xC1, 0xBD, 0xEF, 0xD2, 0x51, 0x3D, 0x9D, 0x8B, 0x3F, 0xEC, 0x34, + 0xF3, 0x0D, 0xB3, 0xAD, 0xBC, 0xAD, 0x62, 0xAA, 0x02, 0xF8, 0x7C, 0x21, + 0xD9, 0x8F, 0x65, 0x08, 0xA1, 0x0E, 0x5F, 0x5D, 0xA5, 0x24, 0x5E, 0xF4, + 0x9C, 0x8A, 0x24, 0xA8, 0xF7, 0xF6, 0x0A, 0xAD, 0x28, 0xAE, 0x21, 0x50, + 0xA2, 0x2B, 0x1B, 0x6C, 0xAF, 0xDC, 0x63, 0xC4, 0x88, 0x54, 0xB6, 0x77, + 0xE0, 0xC5, 0x27, 0xD6, 0xF3, 0x92, 0xE1, 0x81, 0x19, 0x99, 0x0E, 0x83, + 0x3A, 0x17, 0x10, 0xF2, 0xB5, 0x74, 0x95, 0xB2, 0x87, 0x98, 0xBC, 0x75, + 0xFA, 0x54, 0x2C, 0x8B, 0x26, 0xAD, 0xE9, 0xA7, 0xCA, 0x28, 0x89, 0xB9, + 0x77, 0x5B, 0xF7, 0xC2, 0x75, 0x42, 0x73, 0x76, 0x83, 0xCA, 0x26, 0xF5, + 0xB9, 0x70, 0x23, 0x6F, 0x5F, 0x35, 0x91, 0xCE, 0x6A, 0x5D, 0x57, 0xB8, + 0xE0, 0x3C, 0x91, 0x6F, 0xC4, 0xB7, 0x30, 0x6F, 0xDD, 0xBD, 0xD7, 0x5F, + 0x1A, 0xD2, 0xE4, 0xE7, 0x0D, 0x2B, 0x02, 0x2F, 0x61, 0x9E, 0x22, 0x4C, + 0xFE, 0xBD, 0x1A, 0xDD, 0xE5, 0x67, 0xA2, 0x6F, 0x90, 0x4C, 0x31, 0x5E, + 0x6A, 0x9F, 0x8E, 0xE8, 0xC1, 0xB2, 0x4E, 0xE4, 0xCA, 0x2B, 0xB8, 0x4A, + 0xE8, 0xFF, 0x06, 0x91, 0x76, 0x2E, 0x51, 0x3F, 0x1B, 0xA5, 0x2A, 0x1C, + 0xEB, 0xD4, 0x07, 0x00, 0x03, 0x40, 0x33, 0x6A, 0xD8, 0xB7, 0x5A, 0xF0, + 0xF8, 0xF7, 0xCD, 0xCB, 0x3D, 0xB8, 0x98, 0xB4, 0x56, 0xE9, 0x20, 0xCC, + 0x45, 0x0F, 0xA3, 0x76, 0xB1, 0x2D, 0x41, 0x9A, 0x89, 0x24, 0x7C, 0xAC, + 0x62, 0xCC, 0xCF, 0xE5, 0xA1, 0xEB, 0x7E, 0x41, 0x64, 0x7D, 0x6D, 0xF1, + 0x05, 0xC2, 0x65, 0xE9, 0xF8, 0xE8, 0xDB, 0xA0, 0xB8, 0x1A, 0x87, 0x32, + 0x9C, 0xF7, 0x48, 0xA4, 0x83, 0x66, 0x12, 0xAC, 0x9D, 0x9D, 0xE4, 0x7B, + 0xF4, 0x7A, 0x2B, 0x28, 0xB7, 0x12, 0x3B, 0xAC, 0x7D, 0xF4, 0xB6, 0x72, + 0x87, 0x4C, 0xFC, 0x5F, 0x75, 0x4C, 0xE5, 0xE1, 0x6D, 0x10, 0xF8, 0xD5, + 0xA2, 0x3F, 0x04, 0xB2, 0x33, 0x6A, 0x0A, 0x3C, 0x45, 0x95, 0x77, 0x5F, + 0x20, 0x9E, 0x78, 0x91, 0xEB, 0x72, 0x6B, 0x90, 0x78, 0x9C, 0x5D, 0x47, + 0xE4, 0x9A, 0xC5, 0x10, 0xB8, 0xE1, 0x1D, 0x5A, 0x7D, 0xF3, 0x55, 0x8F, + 0x66, 0x54, 0x1D, 0x97, 0x05, 0x3F, 0xFC, 0xDA, 0x29, 0x04, 0x57, 0x3F, + 0xD0, 0x52, 0x12, 0x3C, 0xBA, 0xF5, 0x52, 0x02, 0xE6, 0x37, 0x3A, 0xF9, + 0xAD, 0xB7, 0x2F, 0x81, 0x8D, 0x14, 0xCC, 0x1C, 0x8C, 0x3A, 0x9D, 0x54, + 0x5D, 0x75, 0xEC, 0x15, 0x29, 0xB4, 0xCE, 0x44, 0xDA, 0x71, 0x8B, 0xD1, + 0xB6, 0x77, 0x08, 0x2E, 0x80, 0x43, 0x57, 0xF5, 0x94, 0x37, 0xFC, 0x11, + 0x1C, 0x75, 0x62, 0xA1, 0x17, 0xB2, 0x5E, 0x54, 0xA6, 0xBD, 0xAF, 0x0B, + 0xB4, 0x38, 0x77, 0xE8, 0x08, 0xC7, 0x93, 0xDD, 0x96, 0x83, 0x91, 0x1D, + 0x4B, 0x5F, 0xE5, 0xB3, 0xC8, 0x28, 0xA9, 0x51, 0x5D, 0xCB, 0xCE, 0x6F, + 0x7E, 0xCF, 0xBE, 0x4D, 0x5D, 0x46, 0xB0, 0x02, 0xFA, 0xAF, 0x6E, 0x0A, + 0x5B, 0xA4, 0x6D, 0x35, 0xEB, 0x78, 0x31, 0xB3, 0x36, 0x05, 0xD2, 0x84, + 0xBD, 0xB7, 0x38, 0x47, 0xCA, 0x47, 0x07, 0xA5, 0x9B, 0x67, 0x45, 0x3E, + 0x10, 0x82, 0x05, 0xE7, 0x7B, 0x80, 0xA9, 0x55, 0x34, 0x44, 0x6A, 0xC7, + 0x84, 0x24, 0x4F, 0xAA, 0xD5, 0x7D, 0x78, 0xF7, 0x16, 0x43, 0xC1, 0xD5, + 0x20, 0x83, 0xD7, 0xB0, 0x51, 0x14, 0xC6, 0xF4, 0xD5, 0xCB, 0x62, 0xDE, + 0xE4, 0xAD, 0x47, 0xB5, 0xE5, 0x57, 0xCA, 0x9D, 0x76, 0x10, 0x35, 0xDE, + 0x8F, 0xDA, 0x2B, 0x0A, 0xF8, 0x65, 0x90, 0xDB, 0xF5, 0x3D, 0x2E, 0xDE, + 0x1F, 0xF5, 0x6C, 0xF4, 0x2B, 0x2E, 0x18, 0x1C, 0xD5, 0x97, 0xC2, 0xDE, + 0xC2, 0xD8, 0xE1, 0x79, 0x43, 0xC8, 0xFC, 0x9A, 0x2A, 0xF3, 0x14, 0x28, + 0x0E, 0xB6, 0x08, 0xE1, 0xE8, 0xF1, 0x76, 0xB9, 0xA5, 0x57, 0x5C, 0x81, + 0x19, 0x27, 0xA5, 0x80, 0x16, 0x0A, 0x5E, 0xDC, 0xCC, 0xE1, 0xBD, 0x8B, + 0xC5, 0xEC, 0x07, 0xFF, 0x53, 0x3B, 0xB1, 0x1D, 0xAD, 0x02, 0xAB, 0xB6, + 0x04, 0x7B, 0xA1, 0x2E, 0x3F, 0x07, 0x19, 0xD5, 0x82, 0xDA, 0x77, 0x22, + 0x80, 0x31, 0x20, 0xDA, 0x83, 0xDB, 0x56, 0x22, 0x88, 0x89, 0x44, 0x53, + 0x87, 0x67, 0xAE, 0x30, 0x50, 0x4C, 0xD0, 0x90, 0x8B, 0x45, 0x23, 0xCE, + 0x41, 0x39, 0x03, 0xDE, 0xE6, 0xD3, 0xFC, 0x28, 0x19, 0x3E, 0x0B, 0xD2, + 0x2E, 0x96, 0xAC, 0x8D, 0xD0, 0x8E, 0x29, 0x48, 0x58, 0xA2, 0xD4, 0x17, + 0x65, 0x4B, 0x75, 0x4C, 0x48, 0x43, 0x34, 0x43, 0x3A, 0xDD, 0xCE, 0xC5, + 0xF0, 0xF4, 0x6C, 0xB8, 0xDD, 0xF3, 0x3E, 0x34, 0x50, 0x2A, 0x8C, 0x6C, + 0x90, 0x96, 0x1E, 0x21, 0x61, 0x13, 0x42, 0xA5, 0x12, 0x0F, 0x73, 0x02, + 0xBA, 0x9E, 0xFF, 0x47, 0x83, 0xDB, 0xE4, 0x16, 0x90, 0xD9, 0x0A, 0x40, + 0x84, 0xCA, 0xD2, 0x03, 0x05, 0xD8, 0x64, 0xB2, 0x3D, 0x8A, 0x42, 0x02, + 0x8C, 0x88, 0xDF, 0xEE, 0x5A, 0x47, 0xF1, 0xF4, 0x82, 0x6E, 0x61, 0xD5, + 0xF5, 0xA3, 0x58, 0x21, 0x6B, 0xEE, 0x8F, 0xE2, 0xEB, 0x07, 0x39, 0xA9, + 0x71, 0xFC, 0x55, 0x39, 0x37, 0x4D, 0xD2, 0x41, 0xC5, 0x33, 0xF7, 0xF5, + 0xED, 0x67, 0xA7, 0x42, 0xAD, 0x61, 0xEC, 0xE2, 0x9D, 0xB9, 0x13, 0x4B, + 0xF5, 0x14, 0xB0, 0xE1, 0x47, 0x06, 0x2B, 0x65, 0xCD, 0x09, 0x31, 0x46, + 0x47, 0xFE, 0x1B, 0xB5, 0xD8, 0x53, 0x04, 0x28, 0x5C, 0x3F, 0x46, 0x28, + 0xCD, 0xB9, 0x87, 0x9A, 0xB0, 0xE2, 0x49, 0xA6, 0xCF, 0x56, 0x8D, 0x52, + 0xD5, 0x05, 0xCD, 0x0C, 0x3D, 0x45, 0x11, 0x18, 0x84, 0x38, 0x98, 0xD4, + 0xD3, 0x2D, 0xD0, 0x2A, 0xAD, 0xF4, 0x7A, 0xAB, 0xBF, 0xF4, 0xA8, 0x9F, + 0x7A, 0xB7, 0x73, 0xC0, 0xEC, 0xF5, 0x3E, 0x87, 0x9F, 0x12, 0xEF, 0xB8, + 0xAC, 0x19, 0x34, 0xB9, 0x72, 0xB9, 0x6B, 0xF3, 0xBB, 0x08, 0x8E, 0x7F, + 0xEC, 0x24, 0x1A, 0xF4, 0x00, 0xC0, 0xD4, 0x27, 0xB1, 0x3B, 0x05, 0x68, + 0xD4, 0x30, 0xD2, 0x21, 0x63, 0xD8, 0x33, 0x6C, 0xDC, 0xA9, 0x3E, 0x7C, + 0xA4, 0xE0, 0x43, 0xC9, 0x80, 0xA3, 0xCA, 0x35, 0x72, 0x10, 0xF1, 0xEA, + 0xCD, 0xA2, 0xDB, 0x02, 0x5A, 0xEE, 0x52, 0x5E, 0x31, 0x33, 0x2C, 0x68, + 0x3A, 0xBE, 0x34, 0x5E, 0xCE, 0xF2, 0x23, 0xE7, 0x4D, 0xCF, 0x71, 0xD4, + 0x3E, 0x8C, 0x4E, 0x08, 0x82, 0xF5, 0x01, 0xE9, 0xF8, 0x35, 0xFC, 0x88, + 0xFE, 0xC1, 0x1E, 0x67, 0x95, 0x44, 0x45, 0xF8, 0x67, 0xB8, 0x91, 0xF0, + 0x8E, 0x6C, 0xE4, 0x57, 0xA6, 0xDB, 0x56, 0xE3, 0x6C, 0x18, 0x37, 0x0C, + 0x48, 0x49, 0xB5, 0x7E, 0x51, 0x7A, 0x46, 0x0E, 0xD4, 0x8E, 0x2B, 0x93, + 0x63, 0x6B, 0xEC, 0xE5, 0x5B, 0x72, 0x49, 0xB2, 0x3D, 0x24, 0xAA, 0x59, + 0xAF, 0x1B, 0x0A, 0x82, 0xE8, 0x56, 0xC1, 0x56, 0x46, 0x9F, 0xB2, 0x5B, + 0x8D, 0x4E, 0x45, 0x34, 0x49, 0xE6, 0xDA, 0xEF, 0x43, 0x53, 0x11, 0x41, + 0x12, 0x82, 0xB9, 0xA8, 0xCC, 0x95, 0x8E, 0x5F, 0xD3, 0xB9, 0xA0, 0x53, + 0xC5, 0x6E, 0x75, 0xC0, 0x50, 0xF8, 0xC8, 0xA8, 0x19, 0xEE, 0x17, 0x6F, + 0xD0, 0xB1, 0xA6, 0xD3, 0xC5, 0x39, 0x5E, 0x68, 0xCA, 0x7D, 0x17, 0x17, + 0x46, 0x83, 0xF3, 0x84, 0x05, 0x36, 0xB8, 0xE2, 0xD4, 0x20, 0xC0, 0x86, + 0xCE, 0xB3, 0xC2, 0x4D, 0xE8, 0xE8, 0x1A, 0x7E, 0x06, 0x1C, 0xE1, 0xA9, + 0x55, 0xCB, 0x2A, 0x88, 0xC5, 0x5A, 0xE1, 0x15, 0x74, 0x1E, 0x31, 0x0E, + 0xCE, 0xA9, 0x7D, 0xA4, 0xCB, 0xF1, 0x7B, 0xCD, 0x56, 0x54, 0xF2, 0xDC, + 0xD7, 0xE8, 0x59, 0x5C, 0xC1, 0x47, 0x6D, 0xB5, 0x3A, 0xB7, 0x4F, 0x30, + 0x90, 0x10, 0x7F, 0xD7, 0x16, 0xC2, 0xD5, 0xA2, 0x36, 0x10, 0x1A, 0x71, + 0x19, 0x4A, 0x6F, 0xFF, 0x5E, 0x4E, 0xC1, 0x2B, 0xC1, 0x96, 0xE4, 0x2A, + 0x2A, 0xEB, 0x60, 0x9C, 0x4B, 0x11, 0x97, 0xED, 0xEA, 0x6E, 0x83, 0xA3, + 0x8B, 0x17, 0xEB, 0x42, 0xC8, 0x18, 0x40, 0x61, 0xB0, 0x26, 0x72, 0xAC, + 0xA2, 0x49, 0xA4, 0x9C, 0xD1, 0x32, 0x8E, 0xCF, 0x80, 0x71, 0xF1, 0x20, + 0x47, 0xA5, 0x28, 0xD4, 0xC8, 0x1E, 0xF1, 0xB0, 0xD2, 0x15, 0x21, 0xBF, + 0x9C, 0x57, 0x88, 0xED, 0x30, 0x6F, 0x69, 0x3A, 0xB4, 0x14, 0x16, 0x98, + 0x17, 0xC1, 0xC2, 0x36, 0x16, 0x54, 0x02, 0xB7, 0x42, 0x0C, 0x88, 0x45, + 0x5E, 0x90, 0x89, 0xD6, 0xE3, 0xDB, 0x0F, 0xF6, 0x07, 0xC8, 0x5B, 0x89, + 0x8E, 0x24, 0xA0, 0x9D, 0xB7, 0xC6, 0xEC, 0x7E, 0xDB, 0xC1, 0xAC, 0x38, + 0xB3, 0x26, 0xD9, 0xFE, 0x8A, 0xC2, 0x76, 0xDD, 0x01, 0x41, 0x30, 0x2D, + 0x75, 0xDC, 0xE8, 0x60, 0x0B, 0xEF, 0xCC, 0xBA, 0x41, 0x85, 0xFC, 0x34, + 0x59, 0x4C, 0xA4, 0x13, 0x10, 0x7D, 0xF6, 0xE0, 0x00, 0x14, 0x86, 0x95, + 0xF0, 0x00, 0x41, 0xDF, 0xBD, 0xB5, 0x00, 0xDB, 0xDC, 0x8F, 0x5B, 0x75, + 0xDE, 0x5F, 0x75, 0xFC, 0x11, 0x7A, 0xC0, 0x0D, 0xA2, 0xDB, 0xB8, 0x53, + 0x59, 0x0B, 0xFE, 0xAF, 0x45, 0xDD, 0xB7, 0x72, 0x87, 0x2C, 0x4B, 0x04, + 0xCE, 0xC3, 0x37, 0x54, 0x9D, 0x62, 0xC3, 0x6A, 0x4D, 0x71, 0xAB, 0xF4, + 0x85, 0xA5, 0x89, 0xD1, 0xC9, 0xFB, 0x8C, 0x23, 0x70, 0x36, 0x75, 0x74, + 0x5A, 0x6C, 0xD4, 0x50, 0x5C, 0xD0, 0x49, 0xCC, 0x9B, 0x27, 0x8C, 0x99, + 0xC9, 0x55, 0x9C, 0x48, 0xD1, 0x40, 0x91, 0xD9, 0x1F, 0xA2, 0x4F, 0xBB, + 0x87, 0x42, 0xA5, 0xDA, 0xC5, 0xCB, 0x13, 0xA4, 0x9C, 0xFB, 0xD1, 0xD7, + 0xB9, 0x90, 0xEF, 0xF5, 0x03, 0x92, 0xCD, 0x7B, 0xF9, 0x76, 0xF4, 0xF8, + 0x76, 0x2E, 0x99, 0x13, 0x33, 0x61, 0xE1, 0x72, 0x92, 0x4A, 0x9E, 0x8F, + 0x20, 0xCE, 0x37, 0xC7, 0x17, 0x0F, 0xFF, 0x25, 0xDF, 0x16, 0xD4, 0xAF, + 0xD2, 0x47, 0x65, 0x4E, 0x2B, 0x0E, 0xBE, 0x45, 0x58, 0x8D, 0xFA, 0x7D, + 0x59, 0x9D, 0xAE, 0x4E, 0x7D, 0x9F, 0x8B, 0x40, 0x5E, 0x1D, 0x0C, 0x23, + 0xAE, 0xC9, 0xFD, 0x9E, 0x61, 0x38, 0xF8, 0x81, 0xC5, 0x71, 0xD4, 0x6B, + 0x24, 0xB6, 0x96, 0xDC, 0xC9, 0x1B, 0xD1, 0x7C, 0x84, 0xFD, 0x79, 0xEE, + 0x7B, 0x34, 0x82, 0xA9, 0x01, 0xB1, 0x76, 0x61, 0x65, 0xDA, 0x74, 0x94, + 0x93, 0x38, 0x1D, 0x23, 0x3E, 0x69, 0x24, 0x4C, 0xA4, 0x9F, 0x4D, 0x04, + 0xDA, 0x99, 0x32, 0x56, 0x81, 0x8D, 0x75, 0xDE, 0x53, 0x09, 0x51, 0x6E, + 0x31, 0x81, 0x0B, 0x1B, 0x18, 0xA3, 0xFF, 0xDF, 0x76, 0x7D, 0x57, 0x97, + 0x62, 0x8C, 0x48, 0x3B, 0x99, 0x1C, 0xA2, 0x8A, 0x16, 0xDA, 0x2D, 0x07, + 0xEB, 0xE8, 0x2F, 0xAE, 0x4E, 0xCF, 0xB4, 0xA1, 0xAD, 0xB2, 0xC5, 0xEB, + 0x2C, 0x69, 0x8B, 0x3F, 0x02, 0xD8, 0x8E, 0x17, 0x5E, 0xED, 0x51, 0xD9, + 0x2A, 0x95, 0xAA, 0x3C, 0x61, 0x18, 0x67, 0x69, 0x8B, 0x1B, 0x5D, 0x60, + 0x88, 0xCF, 0x6C, 0x61, 0x96, 0xD5, 0x2C, 0xCD, 0xF2, 0x8A, 0xA5, 0x8E, + 0x66, 0xC2, 0x18, 0x27, 0x51, 0xA6, 0x4E, 0xDE, 0x95, 0x18, 0xBD, 0xC7, + 0xDC, 0x52, 0x9F, 0xC0, 0x74, 0xBA, 0xD8, 0xF2, 0x1C, 0x2B, 0x5C, 0x01, + 0x29, 0xE4, 0x9D, 0xEE, 0xD5, 0xF6, 0xFF, 0x0E, 0x7C, 0x0D, 0x9E, 0x07, + 0x29, 0xF5, 0xED, 0xD7, 0x37, 0xA0, 0x57, 0x1A, 0x54, 0x3E, 0x15, 0xB6, + 0xEC, 0x97, 0x27, 0x32, 0xEA, 0x32, 0xC6, 0xB6, 0xBB, 0xF6, 0x2F, 0x0C, + 0x12, 0x74, 0x0E, 0xFA, 0x75, 0x94, 0xD0, 0x11, 0x79, 0xEE, 0xE4, 0xBD, + 0x9C, 0x0E, 0x34, 0xFA, 0xA9, 0x66, 0x14, 0x89, 0xDA, 0x0E, 0x20, 0x65, + 0x4A, 0x68, 0x5B, 0xE8, 0xAE, 0x51, 0x4F, 0x9E, 0x18, 0x5D, 0x6F, 0x7C, + 0x16, 0xD3, 0x76, 0x6C, 0xBE, 0x5E, 0x2D, 0x95, 0x95, 0x0B, 0x08, 0x07, + 0x35, 0xD3, 0x09, 0xCB, 0x68, 0x31, 0x13, 0x0C, 0x5B, 0xED, 0x4A, 0xE2, + 0x0F, 0x8B, 0x5B, 0x68, 0xDC, 0x33, 0xA6, 0x83, 0x98, 0x6B, 0x85, 0x06, + 0x16, 0xF3, 0xFE, 0xED, 0x60, 0x4E, 0x52, 0x6D, 0x71, 0x91, 0x88, 0x43, + 0xBE, 0xEF, 0xC4, 0xAD, 0x13, 0x42, 0x18, 0x50, 0x71, 0x34, 0x1A, 0x18, + 0xE0, 0x83, 0x5F, 0xD0, 0xE3, 0x68, 0xAD, 0x85, 0xFB, 0x81, 0x9A, 0xCE, + 0x38, 0x25, 0xFE, 0xDF, 0xE8, 0xE9, 0xE4, 0x89, 0xE9, 0x38, 0x6D, 0x99, + 0xA4, 0x7C, 0x05, 0xB6, 0xB6, 0x5C, 0x96, 0x70, 0xDE, 0x62, 0xE5, 0x6F, + 0x91, 0x19, 0xFF, 0x84, 0x14, 0x5E, 0xD4, 0xCC, 0xE9, 0x99, 0x89, 0xF5, + 0x72, 0x72, 0x83, 0x9D, 0xEF, 0x8B, 0xA3, 0x63, 0xEA, 0x76, 0x7A, 0xF2, + 0xD5, 0x1D, 0x50, 0xC9, 0x1B, 0xBC, 0x4D, 0x77, 0xB3, 0xDA, 0x1E, 0x8B, + 0x1B, 0x39, 0x04, 0xB5, 0x1A, 0x42, 0xDD, 0x18, 0xE5, 0xE3, 0x5F, 0xFD, + 0x05, 0x9B, 0xBE, 0x01, 0xA5, 0xAD, 0x0A, 0x9A, 0x62, 0xBB, 0xE2, 0x43, + 0xAB, 0x14, 0x96, 0xD2, 0xCC, 0xBE, 0xA9, 0x0C, 0xE8, 0xBF, 0x40, 0x04, + 0x01, 0xD5, 0x34, 0x5F, 0x25, 0x25, 0x2B, 0xD2, 0x76, 0xA4, 0x60, 0x6F, + 0xF2, 0xE6, 0x5C, 0x35, 0x44, 0x06, 0x36, 0x8D, 0xBA, 0xD5, 0xD7, 0x9F, + 0x13, 0xC8, 0xF1, 0x0B, 0x0A, 0x40, 0xED, 0xD2, 0x40, 0x93, 0xCE, 0x4E, + 0x15, 0x78, 0xF1, 0x92, 0x59, 0xDB, 0xE9, 0x1B, 0x1E, 0x91, 0xF3, 0xCA, + 0x22, 0x00, 0x28, 0xE6, 0xCE, 0xF1, 0x4E, 0x77, 0x2B, 0xF5, 0xFC, 0x2E, + 0x90, 0xAA, 0xFA, 0x47, 0x00, 0xEC, 0x42, 0x45, 0x8B, 0xD0, 0xD8, 0xAA, + 0x06, 0x0A, 0x79, 0xD3, 0xBB, 0xAE, 0xDA, 0xE6, 0xF2, 0x7E, 0x15, 0x34, + 0xA7, 0x10, 0xB9, 0xAD, 0xC7, 0x24, 0x25, 0xFF, 0xF1, 0xDD, 0x12, 0x68, + 0xFA, 0x93, 0xAF, 0x55, 0xEB, 0xEC, 0xA0, 0xAB, 0x48, 0x66, 0xBB, 0x2C, + 0x15, 0x9A, 0x36, 0xD9, 0xC4, 0x6C, 0x6B, 0x9E, 0x8B, 0x55, 0x67, 0x03, + 0xE4, 0xAE, 0x23, 0xB0, 0x89, 0x92, 0xDD, 0x04, 0x3A, 0xEB, 0xFA, 0x43, + 0x00, 0xA5, 0x03, 0x32, 0x25, 0x86, 0x02, 0x37, 0xCD, 0xCA, 0xF2, 0x88, + 0x22, 0x41, 0x93, 0x31, 0x75, 0x6C, 0xA1, 0x66, 0xD5, 0xC8, 0x26, 0x2C, + 0x30, 0x4F, 0xED, 0xF2, 0x07, 0xA6, 0x4F, 0x85, 0x0C, 0xBC, 0xEC, 0xA6, + 0xE5, 0x8A, 0xBA, 0x1C, 0xCA, 0xF6, 0x22, 0x65, 0xDD, 0x7A, 0x65, 0x85, + 0x2C, 0x5A, 0xF3, 0xDC, 0xAD, 0xB6, 0xC3, 0xF8, 0x03, 0x2A, 0x0B, 0x01, + 0xB2, 0x38, 0x96, 0xF7, 0x2F, 0xFA, 0xD6, 0x6B, 0xD9, 0x5C, 0x0C, 0xCD, + 0x3F, 0xE4, 0xB9, 0x8B, 0xA7, 0x51, 0x23, 0x8A, 0xCE, 0x08, 0xD5, 0xDB, + 0x19, 0xF6, 0xF4, 0x92, 0xF8, 0xE2, 0x6B, 0xB0, 0xC6, 0x3D, 0x2E, 0xE7, + 0xF1, 0x84, 0xA1, 0x12, 0x07, 0x14, 0x50, 0xBB, 0x86, 0x8D, 0x59, 0xBD, + 0x6C, 0xE3, 0x3B, 0xA6, 0xEF, 0xF9, 0xD4, 0x3B, 0x1F, 0x1D, 0x39, 0xBF, + 0xB6, 0xFD, 0xF2, 0x22, 0x00, 0xBC, 0xF5, 0xA8, 0x48, 0xFF, 0x65, 0xF4, + 0xD0, 0xD5, 0x5E, 0x47, 0x47, 0x82, 0xF6, 0xC5, 0x88, 0x95, 0xE7, 0x65, + 0xA7, 0x89, 0x2D, 0x6C, 0x1C, 0xCA, 0x2D, 0x30, 0xE7, 0xD5, 0x77, 0xBA, + 0xA4, 0x08, 0x03, 0x8B, 0x2D, 0x2D, 0x5A, 0xA3, 0xA5, 0x1D, 0x00, 0x62, + 0x61, 0xC8, 0x6D, 0x9B, 0xF9, 0x61, 0xF1, 0x0A, 0x8C, 0x2B, 0x48, 0x10, + 0x66, 0x9D, 0x41, 0xC8, 0x5A, 0xE3, 0x7C, 0xC1, 0x24, 0x09, 0x93, 0xE3, + 0x71, 0x53, 0x2D, 0x44, 0xA5, 0x9A, 0xE1, 0xCF, 0xBE, 0x89, 0x35, 0x1E, + 0x7A, 0x22, 0x71, 0xD4, 0x68, 0x4D, 0x7F, 0xBD, 0x4D, 0x67, 0x76, 0x03, + 0xA8, 0x56, 0x12, 0xC7, 0x6B, 0x84, 0x81, 0xBB, 0x0B, 0x3A, 0x6A, 0xE2, + 0x0F, 0x9D, 0xA0, 0xD6, 0x2E, 0x88, 0xA9, 0x64, 0xE7, 0xF0, 0x28, 0x78, + 0xCD, 0x26, 0xBB, 0x4B, 0xE5, 0xFB, 0xB8, 0xD1, 0x63, 0xA2, 0x99, 0x76, + 0x50, 0xCE, 0xF6, 0xC1, 0x96, 0xE0, 0x1A, 0x4E, 0x1B, 0xC6, 0x09, 0x58, + 0x3B, 0xE6, 0xFF, 0x75, 0x96, 0x80, 0x8D, 0x85, 0x2B, 0x90, 0x01, 0x06, + 0x8D, 0xB0, 0x42, 0x7E, 0xF5, 0x25, 0xAD, 0x24, 0xB1, 0x88, 0x9C, 0x1A, + 0x24, 0x8A, 0x68, 0x5A, 0xD5, 0x24, 0x94, 0x78, 0xB2, 0x1A, 0xB9, 0xC3, + 0xA2, 0x19, 0x92, 0x91, 0x1A, 0x77, 0x66, 0xD6, 0x6B, 0xF5, 0x5A, 0x49, + 0xC7, 0xAA, 0x44, 0x41, 0x43, 0xF3, 0xE9, 0xC3, 0x5F, 0x16, 0x43, 0x7D, + 0x15, 0xF5, 0x0A, 0xC2, 0x8A, 0x50, 0x64, 0x01, 0x7B, 0x8C, 0x09, 0x85, + 0xDD, 0x22, 0xE3, 0x9E, 0xA9, 0x46, 0x1E, 0x02, 0xE4, 0x01, 0xB0, 0x5D, + 0xB8, 0xE8, 0x14, 0xEB, 0x4E, 0x29, 0x23, 0xDE, 0xAE, 0x62, 0x45, 0x01, + 0xC8, 0x25, 0x87, 0x18, 0xB3, 0xF9, 0xAD, 0x03, 0x3E, 0x59, 0x49, 0x71, + 0xA9, 0xC7, 0x27, 0xD7, 0xBA, 0x65, 0xCD, 0x27, 0x1E, 0x50, 0xE0, 0xD8, + 0x8F, 0x84, 0x6B, 0x0F, 0x6C, 0x12, 0x36, 0x04, 0x6B, 0x5D, 0xE3, 0x7D, + 0xD5, 0x53, 0xAF, 0xBC, 0xB0, 0x82, 0x21, 0x58, 0xC9, 0xFF, 0xDF, 0x87, + 0x18, 0x09, 0x4B, 0x79, 0x50, 0xB4, 0x5F, 0x9B, 0xF7, 0x94, 0xAA, 0x7F, + 0xB5, 0x03, 0x29, 0x58, 0x60, 0xD4, 0xC9, 0x39, 0xC1, 0x58, 0x21, 0xE8, + 0xF5, 0x2D, 0x49, 0x58, 0xB1, 0x25, 0xE9, 0x82, 0x15, 0xB7, 0xDD, 0x8E, + 0x3D, 0x28, 0x1F, 0x97, 0xE5, 0xDA, 0x2B, 0x33, 0xB9, 0x2F, 0x08, 0x29, + 0x80, 0x87, 0xA2, 0xB7, 0x80, 0x33, 0x2A, 0xE5, 0xD5, 0x49, 0x7B, 0x84, + 0x13, 0x66, 0x7D, 0xE3, 0x1B, 0x92, 0x9F, 0x90, 0xCE, 0x74, 0x67, 0x4C, + 0xC3, 0x74, 0xC0, 0x75, 0x86, 0x63, 0x4C, 0x5E, 0xA1, 0x42, 0xAC, 0xC7, + 0x9B, 0x65, 0x17, 0x23, 0x6D, 0x50, 0x19, 0xF9, 0x99, 0x15, 0xA8, 0x73, + 0x0E, 0x28, 0xBA, 0x2C, 0x9A, 0xC0, 0x35, 0x13, 0x16, 0xBC, 0x12, 0x09, + 0x0F, 0xF3, 0x0C, 0xE3, 0xE1, 0x27, 0x63, 0x75, 0x60, 0xD3, 0xA8, 0xB9, + 0xAD, 0x10, 0x18, 0xC3, 0x52, 0x36, 0xED, 0xF4, 0xA4, 0x22, 0x4C, 0xC0, + 0x24, 0x36, 0xD5, 0xBC, 0xDF, 0xD5, 0x5A, 0xC2, 0xA1, 0x23, 0x6F, 0x2F, + 0x1A, 0xA2, 0x31, 0x97, 0x24, 0xB8, 0x67, 0xD7, 0x4B, 0x53, 0x50, 0x19, + 0x6A, 0xDF, 0x40, 0x21, 0xCB, 0x2F, 0x43, 0xD1, 0xD2, 0x68, 0x6B, 0x76, + 0x07, 0x8B, 0xA4, 0xC8, 0xD0, 0x5E, 0xAF, 0x22, 0x51, 0x13, 0x34, 0x1F, + 0x26, 0xAC, 0x7D, 0xC2, 0x6E, 0x6D, 0x21, 0x98, 0xFC, 0x3B, 0xC2, 0x95, + 0xAD, 0x74, 0xCB, 0xF0, 0xC0, 0xB7, 0xD0, 0xAE, 0x86, 0x46, 0x5D, 0x84, + 0xED, 0xEB, 0xB8, 0x64, 0x66, 0x2A, 0xA7, 0xA1, 0xE3, 0xCB, 0x48, 0x7D, + 0xD8, 0x2E, 0xCE, 0x7B, 0x37, 0xD2, 0x24, 0xB5, 0x80, 0x31, 0x0C, 0x77, + 0x24, 0x4E, 0x96, 0x59, 0x99, 0x05, 0x80, 0xCF, 0x13, 0x15, 0x4A, 0x97, + 0x43, 0x6F, 0x45, 0xB9, 0xE8, 0x45, 0x46, 0x90, 0x98, 0x49, 0xC1, 0x83, + 0x85, 0x4B, 0x67, 0x7E, 0x58, 0x78, 0x9E, 0x69, 0x9C, 0xDF, 0x1F, 0xEC, + 0xC5, 0x01, 0xB3, 0x5D, 0x51, 0xF9, 0xCE, 0x84, 0x19, 0x5C, 0x67, 0xC1, + 0xCE, 0x26, 0x4A, 0xAD, 0xBF, 0x23, 0x00, 0x43, 0x78, 0x3C, 0x2A, 0x0C, + 0xAE, 0xFC, 0x0A, 0x9A, 0x46, 0x2D, 0x37, 0x80, 0xCB, 0xB2, 0xBE, 0x8B, + 0x5D, 0xAE, 0x21, 0x11, 0xAC, 0xDE, 0x6F, 0xC1, 0x8D, 0xFB, 0xA1, 0xCF, + 0xBA, 0x72, 0xCF, 0x81, 0xD7, 0x74, 0x1A, 0x10, 0x82, 0x2A, 0x5F, 0xFB, + 0xE0, 0x22, 0xD5, 0x7B, 0x5A, 0x62, 0xB3, 0x4B, 0x5D, 0x94, 0x9C, 0xFE, + 0xFE, 0x7E, 0xFE, 0xC9, 0x1F, 0xA7, 0x9B, 0xBB, 0x8F, 0x42, 0x26, 0x8E, + 0x96, 0x70, 0x2C, 0xD0, 0x20, 0xE3, 0xC7, 0xC0, 0x29, 0x4C, 0xCE, 0x37, + 0x67, 0x77, 0x51, 0x22, 0x43, 0x83, 0xEA, 0x36, 0x85, 0xEA, 0xCD, 0x08, + 0x28, 0xC7, 0x36, 0x8E, 0xF6, 0x5F, 0x34, 0x65, 0x02, 0x61, 0xAC, 0xB5, + 0x42, 0xE3, 0xD6, 0x8D, 0x9B, 0xFC, 0x2F, 0x5A, 0xBA, 0xC4, 0x84, 0x10, + 0x42, 0xCE, 0xBB, 0x8C, 0x48, 0xF6, 0xD1, 0x0A, 0xDA, 0x45, 0x8D, 0x47, + 0x6C, 0x18, 0xBB, 0x87, 0xB6, 0x35, 0xDB, 0xDE, 0x01, 0x79, 0x5E, 0x0C, + 0x94, 0xFC, 0xF0, 0x9B, 0x61, 0x77, 0xEF, 0x6C, 0x36, 0xE9, 0x85, 0x54, + 0xC8, 0x37, 0x1F, 0x35, 0x85, 0x8B, 0x22, 0x53, 0x02, 0xF4, 0xBA, 0x09, + 0x5E, 0xD9, 0x4A, 0x74, 0xE5, 0x62, 0x7C, 0xE0, 0x41, 0xC9, 0x02, 0xA2, + 0xAB, 0x9E, 0x0B, 0x53, 0xB7, 0x04, 0xAF, 0xBF, 0x4A, 0xC3, 0x88, 0x53, + 0x13, 0xE5, 0xED, 0xC7, 0x2D, 0x35, 0x4E, 0x7F, 0xA5, 0x34, 0xA7, 0xB3, + 0x3B, 0xEB, 0x7B, 0x60, 0xB1, 0x0B, 0xB3, 0xA0, 0x32, 0x02, 0xBB, 0x31, + 0x34, 0x7B, 0xE5, 0x91, 0x1F, 0x48, 0xE0, 0x7F, 0x94, 0x95, 0x3C, 0xA4, + 0x36, 0x86, 0x31, 0x3A, 0x77, 0xA0, 0xDA, 0x50, 0x15, 0xB9, 0x13, 0xA0, + 0x35, 0x27, 0x70, 0xCC, 0x19, 0xF3, 0x89, 0x22, 0x7C, 0x35, 0xF1, 0xF0, + 0xCE, 0xCF, 0x3B, 0x15, 0x39, 0xB7, 0xE1, 0x11, 0xB4, 0xFC, 0x4E, 0x02, + 0x60, 0x05, 0xBB, 0x7E, 0x08, 0x01, 0x8B, 0xB5, 0x77, 0x87, 0x70, 0x60, + 0xDB, 0x38, 0x52, 0x31, 0x6B, 0x11, 0x41, 0xBF, 0x1B, 0xCB, 0x67, 0x84, + 0xC9, 0x7B, 0xA1, 0xBA, 0xA3, 0x2F, 0x21, 0xEC, 0x0D, 0x89, 0x5A, 0x75, + 0x36, 0x20, 0x82, 0xC6, 0xC1, 0x93, 0x12, 0xD6, 0x11, 0x22, 0xBF, 0x9F, + 0x0E, 0x59, 0xFC, 0xFB, 0xA0, 0x20, 0x47, 0xC7, 0x9A, 0x98, 0xB8, 0x1F, + 0x95, 0x1D, 0x4C, 0x5B, 0x97, 0xEF, 0x92, 0x40, 0xAB, 0xB7, 0x21, 0x60, + 0xE4, 0x65, 0xCF, 0xAC, 0xD8, 0x34, 0x91, 0x83, 0xD2, 0x71, 0xAA, 0xFC, + 0xAB, 0xA8, 0xF5, 0x6A, 0x05, 0x86, 0x01, 0x56, 0x72, 0x8F, 0x5B, 0xAA, + 0x51, 0x6B, 0x3F, 0xA3, 0x32, 0xA3, 0xE4, 0x99, 0xED, 0x38, 0x43, 0x46, + 0x8D, 0x61, 0x80, 0x88, 0xC3, 0xEF, 0xAA, 0xF6, 0xAA, 0x6F, 0x34, 0xA1, + 0xD7, 0x81, 0x4C, 0x9C, 0xD7, 0xEC, 0xE0, 0x9E, 0x26, 0x6B, 0x2C, 0xF8, + 0xC0, 0xD5, 0x0B, 0xA1, 0x73, 0xA7, 0xBD, 0x4B, 0x68, 0xD0, 0xFB, 0x75, + 0xF3, 0x1C, 0x9C, 0x26, 0xC3, 0x60, 0xB2, 0x11, 0x81, 0xFE, 0x12, 0x13, + 0xC4, 0x6B, 0xE5, 0x52, 0x72, 0x00, 0x26, 0x4E, 0x7A, 0xFF, 0x2C, 0x20, + 0xCB, 0x32, 0xAA, 0xE4, 0xEE, 0x6B, 0x89, 0x52, 0xC5, 0x2B, 0xDC, 0xFA, + 0x1B, 0x52, 0x4D, 0x8E, 0x02, 0xDB, 0x84, 0x4E, 0x7C, 0x37, 0xBA, 0xFF, + 0xDC, 0x8D, 0x3F, 0xC6, 0xBE, 0x5C, 0x1D, 0x85, 0xF3, 0xE3, 0x4A, 0x83, + 0x28, 0x61, 0xB3, 0xC0, 0xF6, 0x05, 0x8B, 0x8A, 0xE8, 0xED, 0x3E, 0x92, + 0x70, 0x9A, 0xFB, 0xF3, 0x5B, 0x39, 0x3A, 0x3B, 0x3E, 0x33, 0x25, 0x01, + 0x15, 0x86, 0x5B, 0x17, 0x14, 0x42, 0xBD, 0x83, 0xD5, 0x8B, 0x7E, 0xA8, + 0xFC, 0xF9, 0x26, 0x1D, 0xEC, 0xD9, 0xE4, 0x25, 0xCC, 0x3A, 0x3A, 0xD7, + 0x07, 0x7C, 0x59, 0x87, 0xC2, 0x4F, 0x7C, 0x7E, 0xDD, 0x4F, 0x02, 0x4B, + 0x46, 0xBA, 0xFD, 0x1A, 0x26, 0x46, 0x01, 0x3C, 0x26, 0xDF, 0x38, 0x03, + 0xA5, 0x0E, 0xF0, 0x8B, 0xC8, 0xDD, 0xE1, 0x37, 0xD5, 0xDB, 0x51, 0x1B, + 0x9C, 0x7B, 0x81, 0x12, 0x15, 0xCA, 0x6D, 0x85, 0xDB, 0x02, 0x2A, 0xA3, + 0x2B, 0x52, 0xAA, 0x05, 0xE9, 0xCA, 0x42, 0xCA, 0x01, 0x4B, 0xBF, 0x2C, + 0x82, 0x5F, 0x4E, 0x9E, 0xE2, 0xCB, 0x2D, 0xAD, 0x64, 0xC4, 0xA6, 0xC1, + 0xFB, 0xA8, 0xA7, 0x7F, 0x46, 0xC3, 0xA9, 0xF5, 0xC1, 0x68, 0x5F, 0x54, + 0x18, 0x2F, 0xD4, 0x5A, 0xD1, 0x94, 0x71, 0x52, 0x90, 0x33, 0xD0, 0xD9, + 0xF2, 0x05, 0x83, 0x08, 0x42, 0x77, 0xE5, 0x57, 0x6D, 0x78, 0xB9, 0x20, + 0x92, 0x1C, 0xB0, 0x64, 0x39, 0xE1, 0xC8, 0x27, 0x33, 0xB6, 0x24, 0x3D, + 0x8E, 0xE3, 0x6D, 0x41, 0x9A, 0x4C, 0x36, 0x11, 0xB2, 0x7D, 0x5C, 0xD3, + 0x4B, 0x56, 0x42, 0x1E, 0xB3, 0xD4, 0x1E, 0x55, 0xFE, 0x0C, 0x1B, 0x91, + 0x30, 0x74, 0x3C, 0x2C, 0x98, 0x58, 0xD7, 0x0D, 0xA3, 0xCD, 0x17, 0x07, + 0xBD, 0xDC, 0x31, 0x7C, 0xCE, 0x89, 0x9E, 0xDB, 0xDF, 0x39, 0x52, 0x9B, + 0x8B, 0x02, 0x78, 0xAD, 0xD8, 0xA7, 0xB3, 0xE4, 0x81, 0xE4, 0xFB, 0x41, + 0xE6, 0x64, 0x56, 0x8F, 0x86, 0x80, 0xF4, 0x67, 0x20, 0x40, 0x72, 0xFD, + 0xCC, 0x36, 0x15, 0xDA, 0xB7, 0x2E, 0xD8, 0x4F, 0x25, 0x54, 0x50, 0xA9, + 0xD0, 0x5B, 0x1A, 0x7D, 0xB0, 0xA6, 0xDF, 0x5D, 0xB4, 0x1B, 0x13, 0x3A, + 0xA2, 0x46, 0xEF, 0xE7, 0x53, 0x60, 0xF4, 0x20, 0xF1, 0x51, 0x31, 0x5A, + 0x36, 0xB1, 0xA6, 0xA7, 0xDA, 0x9E, 0x26, 0x73, 0xEC, 0x8B, 0x65, 0xD8, + 0x64, 0x85, 0x27, 0x51, 0x27, 0xB1, 0xEB, 0x4B, 0xBB, 0x78, 0x0C, 0xD0, + 0xF5, 0xE4, 0xEC, 0x52, 0xEB, 0x0E, 0xEB, 0x13, 0x3C, 0x1E, 0xD7, 0x35, + 0x88, 0x5D, 0x98, 0x11, 0x9D, 0x0B, 0x75, 0xEC, 0xEC, 0x67, 0x42, 0xB5, + 0x4C, 0xF6, 0xF0, 0x4C, 0xA2, 0xE1, 0x38, 0xF4, 0x55, 0x95, 0xCB, 0x54, + 0x0F, 0xD3, 0xE8, 0x3C, 0xF2, 0x39, 0x9E, 0xD6, 0x34, 0x46, 0x21, 0x85, + 0xD5, 0x63, 0xE8, 0x4B, 0x34, 0xAA, 0x31, 0x6E, 0xA7, 0xD0, 0xA9, 0xC7, + 0x54, 0x54, 0x62, 0x00, 0x9B, 0xB5, 0x89, 0x94, 0x8F, 0x6C, 0x0C, 0xD5, + 0x6C, 0x23, 0x13, 0xCD, 0x58, 0x6E, 0xCA, 0x9A, 0xF1, 0x08, 0x24, 0x94, + 0xA3, 0x80, 0xD9, 0x2F, 0xA9, 0x32, 0x1D, 0x3A, 0x3F, 0x67, 0xCB, 0xD5, + 0x7D, 0x4D, 0x89, 0x56, 0x5C, 0xE5, 0xDC, 0x37, 0x99, 0x27, 0x3E, 0x66, + 0x82, 0x59, 0x3F, 0xF2, 0x68, 0xE2, 0xC4, 0xA9, 0xE9, 0xD8, 0xFB, 0x5E, + 0x8E, 0x22, 0x0E, 0x77, 0x5F, 0x65, 0x9B, 0x91, 0xDC, 0x59, 0xC4, 0x91, + 0x30, 0x44, 0x24, 0x7A, 0x74, 0x49, 0xA3, 0xA1, 0x4C, 0x2A, 0xBF, 0xC3, + 0xD7, 0x21, 0x21, 0x2A, 0xA9, 0x8C, 0x5F, 0x45, 0xDA, 0x78, 0x5E, 0x55, + 0x7F, 0x7C, 0x41, 0xD3, 0x6D, 0x0B, 0xBE, 0x83, 0xA8, 0x5E, 0x08, 0xF5, + 0xEC, 0xCC, 0xFD, 0x21, 0xB3, 0x1D, 0x6A, 0xCC, 0xF9, 0x52, 0xF3, 0x89, + 0x96, 0x2A, 0x70, 0xAB, 0x63, 0x62, 0xA3, 0xB4, 0xE7, 0x70, 0xE9, 0xDF, + 0x4C, 0xED, 0x52, 0xA0, 0x24, 0x38, 0x58, 0xF1, 0xC6, 0x5B, 0x28, 0xA0, + 0x8F, 0x84, 0x36, 0x60, 0xFB, 0x17, 0xAA, 0x27, 0xB1, 0xA5, 0x71, 0xE8, + 0x1E, 0xDF, 0xB9, 0x0A, 0x0D, 0x15, 0x83, 0xF6, 0xE1, 0xF2, 0x51, 0x8F, + 0x92, 0x67, 0x63, 0xAB, 0xD1, 0x2A, 0x29, 0x77, 0x2D, 0xF0, 0x1E, 0x0E, + 0x19, 0xCC, 0x4E, 0x9D, 0x8F, 0xAA, 0xDE, 0xC1, 0x15, 0x1A, 0xBD, 0x19, + 0x79, 0xD0, 0x61, 0x51, 0x2D, 0x23, 0x82, 0x8E, 0x2C, 0xA3, 0x00, 0x9E, + 0x91, 0x83, 0xD4, 0x61, 0x6E, 0x53, 0x1B, 0x81, 0xBD, 0x07, 0x69, 0x24, + 0xE7, 0xF7, 0xD4, 0x5B, 0x65, 0x72, 0xE2, 0x0F, 0x05, 0x41, 0xD5, 0xD6, + 0x5E, 0x9D, 0xF3, 0xF0, 0xA0, 0xF5, 0x7C, 0xC9, 0x2F, 0x0C, 0x87, 0xEC, + 0x13, 0xDB, 0x79, 0x70, 0x89, 0x0C, 0x67, 0x40, 0xC9, 0xCA, 0xF3, 0xE0, + 0xEA, 0x12, 0xF1, 0x92, 0xD4, 0x02, 0x71, 0x79, 0xE6, 0xF7, 0xC6, 0xC5, + 0x27, 0x4A, 0x9D, 0xAC, 0x32, 0x6A, 0x44, 0xD9, 0x01, 0x8D, 0x01, 0x1F, + 0x2A, 0xD7, 0xE5, 0x7F, 0x32, 0x51, 0x9F, 0xB6, 0x36, 0x8A, 0x98, 0x4E, + 0xA1, 0x0D, 0xA3, 0xCD, 0x3C, 0xF7, 0xDF, 0x30, 0x0A, 0xD9, 0x2A, 0x6A, + 0xD6, 0x97, 0x14, 0x34, 0x0C, 0xA1, 0xC5, 0x87, 0x1B, 0x63, 0x4D, 0xBA, + 0x23, 0x9E, 0x3D, 0x6E, 0x4F, 0x80, 0x3D, 0x32, 0x28, 0x1D, 0x51, 0x8F, + 0x63, 0xCA, 0xA6, 0x5A, 0x77, 0xB8, 0xB9, 0xA2, 0xE5, 0x05, 0x8C, 0xE9, + 0xE3, 0xC7, 0xC8, 0xF0, 0x43, 0x14, 0x29, 0x7E, 0x70, 0x23, 0x77, 0x18, + 0x2D, 0x3A, 0x20, 0x14, 0x1F, 0x26, 0x0F, 0x46, 0x33, 0x0A, 0x6A, 0x6B, + 0xCA, 0x62, 0xB0, 0xF0, 0xCB, 0xB4, 0x48, 0xFA, 0xB2, 0x84, 0x55, 0x0B, + 0x45, 0x35, 0xC2, 0x47, 0x65, 0x72, 0x4B, 0x78, 0x54, 0x29, 0xD3, 0xD6, + 0x44, 0xF9, 0xA5, 0x83, 0xA7, 0xA7, 0x04, 0x31, 0x34, 0xA8, 0x3B, 0x8B, + 0xCD, 0x13, 0xA2, 0x00, 0xCB, 0x61, 0x9D, 0x9E, 0x40, 0xE1, 0xDB, 0x75, + 0x47, 0x12, 0xE8, 0x89, 0x4C, 0x31, 0xA5, 0x4D, 0xDC, 0xA5, 0x6D, 0x79, + 0x47, 0x3E, 0x58, 0xB5, 0x91, 0x9B, 0x02, 0xEC, 0x82, 0x28, 0xCF, 0x11, + 0x5C, 0x12, 0xFA, 0x88, 0xDE, 0x9C, 0x15, 0x4D, 0xCF, 0xD4, 0x24, 0xAD, + 0x5F, 0x16, 0xF0, 0xD0, 0x88, 0xC0, 0xF9, 0x77, 0x97, 0xE0, 0xC5, 0x69, + 0x20, 0x18, 0x4E, 0x9C, 0x2A, 0x19, 0x66, 0x42, 0xD5, 0x5C, 0xD3, 0x87, + 0x6B, 0xB2, 0xB0, 0xDE, 0x78, 0xB3, 0x8C, 0x5D, 0x90, 0xC3, 0x25, 0x3D, + 0xA3, 0xCC, 0xB0, 0x4C, 0x97, 0x0F, 0x6D, 0x29, 0x11, 0x42, 0xB3, 0x86, + 0x99, 0x87, 0x37, 0x5A, 0x45, 0x93, 0xE0, 0x88, 0xC9, 0x35, 0x05, 0x48, + 0xCA, 0x84, 0xAB, 0x13, 0xF8, 0x06, 0xA4, 0x0B, 0x72, 0x2A, 0x8D, 0xEB, + 0xA0, 0x89, 0x3D, 0x0B, 0x00, 0x1A, 0x17, 0x87, 0xCD, 0x95, 0x30, 0x2E, + 0xC5, 0xF3, 0xA6, 0x42, 0x5C, 0x63, 0x7A, 0xF6, 0xD0, 0xE3, 0x6D, 0x9C, + 0xC8, 0xF7, 0x83, 0xC3, 0xED, 0x9F, 0xFA, 0xF0, 0xC6, 0xE0, 0xFE, 0xCD, + 0xFB, 0xC8, 0x18, 0x83, 0x77, 0xAA, 0xDA, 0x58, 0x17, 0xD2, 0x7B, 0x73, + 0x62, 0x2D, 0xC0, 0xE1, 0xF8, 0xA9, 0x3E, 0x06, 0x97, 0x3F, 0x9B, 0xF4, + 0xBB, 0x16, 0x25, 0x31, 0x69, 0x7C, 0xD6, 0xD6, 0xB3, 0x01, 0x35, 0x41, + 0x77, 0x25, 0x71, 0xDE, 0x2D, 0x2C, 0xEF, 0x9E, 0x9A, 0xD6, 0x4C, 0xD9, + 0x8C, 0x0C, 0xD1, 0xD8, 0xA2, 0x48, 0x59, 0x6D, 0x41, 0x15, 0xED, 0xAC, + 0x98, 0xA8, 0x47, 0x3D, 0x4B, 0x7D, 0xE7, 0x14, 0xB7, 0xAB, 0x7F, 0xA9, + 0xCD, 0xAA, 0x49, 0x65, 0x48, 0x34, 0x8C, 0x65, 0xD6, 0x38, 0x5D, 0xE1, + 0x14, 0xFC, 0x4F, 0xE6, 0xE4, 0x87, 0x21, 0xE2, 0x54, 0x08, 0x91, 0x22, + 0xED, 0x3E, 0x87, 0xEE, 0x31, 0x9A, 0xC4, 0x40, 0x78, 0x46, 0x2E, 0xF9, + 0xDB, 0xED, 0x64, 0xD7, 0x10, 0xA4, 0x99, 0x3E, 0x43, 0x43, 0xB2, 0x54, + 0x20, 0x20, 0x7D, 0x93, 0x34, 0x0D, 0x0C, 0x86, 0x52, 0x1A, 0x9D, 0x19, + 0x12, 0x88, 0xDD, 0x14, 0xAE, 0x57, 0x72, 0x75, 0x26, 0xDF, 0xC4, 0xA1, + 0x90, 0x49, 0xC7, 0x0C, 0xE1, 0xA6, 0x11, 0x2C, 0x00, 0xBF, 0xB6, 0xF5, + 0xF2, 0x21, 0x4B, 0x14, 0xB4, 0x07, 0xBE, 0x04, 0x72, 0xCB, 0xBE, 0xB6, + 0x24, 0x27, 0xCF, 0x7D, 0x75, 0x2B, 0x31, 0xD6, 0xA6, 0x84, 0x55, 0x11, + 0xD7, 0x91, 0x5A, 0x15, 0x9C, 0xB0, 0x9D, 0x7E, 0xB1, 0xC6, 0xB7, 0xA5, + 0xE0, 0xB2, 0x88, 0x98, 0x9C, 0x2F, 0x67, 0x29, 0xDA, 0x88, 0xC9, 0xA5, + 0x27, 0x53, 0x4D, 0x8F, 0x0B, 0xF8, 0x08, 0x2C, 0xE7, 0x88, 0x26, 0x9C, + 0xD9, 0x10, 0xD9, 0xE4, 0xDB, 0xA4, 0xF7, 0xAD, 0x9F, 0x4E, 0x65, 0x3E, + 0xF4, 0xA4, 0x57, 0x18, 0x2C, 0xDD, 0x0E, 0x6D, 0x26, 0xA3, 0xC2, 0x66, + 0x0D, 0x71, 0x79, 0x22, 0x8E, 0xD5, 0x6A, 0xFC, 0xF4, 0x71, 0x83, 0x27, + 0xEF, 0x24, 0x50, 0xBA, 0x54, 0x1A, 0xE4, 0x98, 0x84, 0x3F, 0x27, 0xE3, + 0x29, 0x3E, 0x45, 0xC1, 0xB1, 0x00, 0x88, 0x54, 0x4D, 0xF0, 0x87, 0x7B, + 0x30, 0x7B, 0xA1, 0xC7, 0x6C, 0xD7, 0x48, 0xA0, 0xFF, 0xCB, 0x89, 0x92, + 0x6D, 0x0E, 0x05, 0x3A, 0xCE, 0x95, 0x30, 0x23, 0xD7, 0x42, 0x77, 0xA9, + 0x5E, 0xF5, 0xD9, 0xEB, 0x5A, 0xB7, 0x83, 0xB9, 0x91, 0x14, 0x51, 0x13, + 0x96, 0x1E, 0x13, 0x5B, 0x28, 0x56, 0xFB, 0x4C, 0x6C, 0x7B, 0x87, 0x4A, + 0xF5, 0x44, 0xD3, 0xC6, 0xC0, 0x17, 0x77, 0x45, 0x61, 0x60, 0x5E, 0x1D, + 0xA6, 0x0C, 0x19, 0x70, 0x95, 0x46, 0x7D, 0xD2, 0x3B, 0x94, 0xD5, 0x9E, + 0xD9, 0xB9, 0x1C, 0x02, 0x2D, 0xF5, 0x52, 0xEF, 0x77, 0x84, 0x1A, 0xA0, + 0x65, 0x7A, 0x61, 0xFF, 0x5A, 0xDD, 0x1E, 0xB6, 0xD5, 0xE7, 0xEC, 0xF6, + 0x33, 0x54, 0xB7, 0xE7, 0x33, 0x30, 0xB0, 0xB4, 0x61, 0x0F, 0xAA, 0xFE, + 0xAC, 0xDB, 0x9D, 0x3A, 0x2B, 0x78, 0x82, 0x93, 0x8B, 0x74, 0x86, 0x6A, + 0x07, 0xDF, 0x82, 0x1F, 0x35, 0xFA, 0xFD, 0x65, 0x39, 0x52, 0x87, 0xD9, + 0x20, 0x05, 0xF5, 0x56, 0x85, 0x70, 0xFA, 0x46, 0x54, 0x59, 0xE5, 0xA0, + 0xF3, 0x14, 0x09, 0x95, 0x5F, 0x9B, 0x56, 0x45, 0xA5, 0x32, 0x64, 0x88, + 0x98, 0x4A, 0x1D, 0x91, 0xDF, 0x32, 0x22, 0xAF, 0xCD, 0x3D, 0x8B, 0x5E, + 0x77, 0x59, 0x41, 0x25, 0xA0, 0xCC, 0x7F, 0xC6, 0x6B, 0x61, 0x60, 0x0F, + 0xCD, 0x0A, 0xC9, 0x55, 0x6E, 0x0E, 0xB7, 0x6B, 0x85, 0xC8, 0xD9, 0xD6, + 0x26, 0x93, 0x0C, 0x3D, 0x1C, 0xEE, 0xEB, 0x19, 0x8F, 0x98, 0xF0, 0x90, + 0x88, 0x06, 0x05, 0xF0, 0x0D, 0xE7, 0xC9, 0x5B, 0x86, 0xE2, 0x7E, 0x2C, + 0x4A, 0xD3, 0x80, 0xB6, 0x74, 0x54, 0x7F, 0x03, 0x12, 0x38, 0xB3, 0xA2, + 0xBB, 0x43, 0x24, 0xDA, 0x41, 0x6D, 0xEE, 0x99, 0x4D, 0xD1, 0xEC, 0x69, + 0x37, 0xE7, 0x41, 0xF3, 0x9D, 0xAA, 0xD8, 0xC1, 0xA5, 0xE0, 0x11, 0x3F, + 0x47, 0xB4, 0x2E, 0xAD, 0x09, 0x84, 0x56, 0x0F, 0x4E, 0x0C, 0xB1, 0x78, + 0xE6, 0xE0, 0x33, 0xA0, 0x32, 0xDA, 0xF6, 0x67, 0x80, 0xF0, 0xB3, 0xE9, + 0x2F, 0x41, 0x23, 0xF2, 0x79, 0xE3, 0xD2, 0x59, 0x7A, 0x0D, 0x4A, 0x58, + 0x29, 0x90, 0x92, 0xCA, 0x6C, 0x70, 0x15, 0x41, 0xCB, 0x72, 0xF4, 0x09, + 0x47, 0xB9, 0xE2, 0x98, 0xAB, 0x15, 0xCE, 0x3D, 0xA9, 0x9D, 0x0E, 0x44, + 0xDD, 0xA9, 0x23, 0x8E, 0x0E, 0x1D, 0x78, 0xBC, 0xEC, 0x5F, 0x48, 0x92, + 0x22, 0xEC, 0x2A, 0xED, 0x9A, 0x41, 0x8D, 0x14, 0xC8, 0x77, 0x44, 0x36, + 0xCE, 0xE6, 0xF5, 0x70, 0xF4, 0xC1, 0x50, 0x41, 0xAB, 0x7B, 0x28, 0xFD, + 0xB9, 0x00, 0x39, 0x63, 0x8D, 0x20, 0x73, 0x8E, 0x42, 0x7E, 0xB8, 0x40, + 0x7A, 0xAD, 0x8D, 0x8D, 0x6E, 0xFA, 0x93, 0x24, 0xA5, 0xF6, 0xF7, 0x61, + 0x72, 0x75, 0xFC, 0xBB, 0xF5, 0xD1, 0xBE, 0xA0, 0x36, 0x91, 0x61, 0x87, + 0x7F, 0x7F, 0xFD, 0x2A, 0x9B, 0xC8, 0x12, 0xE9, 0xB2, 0xE9, 0xFC, 0xBB, + 0x05, 0xA3, 0xA8, 0x21, 0x97, 0x9B, 0x96, 0x3C, 0x40, 0x64, 0x7F, 0xA3, + 0x51, 0x27, 0x3D, 0x6A, 0xB7, 0x67, 0x15, 0x57, 0x68, 0x4E, 0x87, 0x7D, + 0xB5, 0x2F, 0x45, 0x8F, 0x77, 0x3E, 0x92, 0x98, 0x10, 0xB7, 0x77, 0xA3, + 0x27, 0x20, 0x3C, 0x82, 0x42, 0x37, 0xF2, 0xD7, 0xD6, 0xE7, 0xBF, 0x8D, + 0xD6, 0xEF, 0x4B, 0x53, 0xEC, 0x0F, 0xCC, 0xA7, 0xB0, 0x91, 0x03, 0x27, + 0xAC, 0xE1, 0x9A, 0xA6, 0x38, 0x6E, 0x64, 0xF6, 0x4E, 0xE9, 0xD1, 0x78, + 0x7C, 0x7A, 0xD6, 0xF9, 0x0E, 0xEB, 0x24, 0x2C, 0x01, 0xF3, 0xB1, 0x38, + 0x22, 0x22, 0xBF, 0x91, 0x19, 0x44, 0xCB, 0xEC, 0x8B, 0xEF, 0x59, 0xF0, + 0xA8, 0x3D, 0x5D, 0x66, 0x43, 0xEF, 0x56, 0x6C, 0x1A, 0x88, 0x0A, 0xA7, + 0x74, 0x48, 0x0B, 0x1A, 0x9E, 0x2D, 0xD5, 0x0B, 0xCC, 0x43, 0xA3, 0x09, + 0xB9, 0xCD, 0xD7, 0x82, 0x0C, 0x73, 0x29, 0x4F, 0xE7, 0x0B, 0x69, 0x68, + 0x82, 0x00, 0x65, 0x4D, 0x5F, 0xF8, 0xE6, 0xD7, 0x02, 0x2A, 0x8F, 0x22, + 0x99, 0x5E, 0xAA, 0x08, 0x4D, 0xBD, 0x9A, 0xC4, 0xEC, 0x32, 0x0E, 0x15, + 0x3F, 0xB4, 0x94, 0xBF, 0x01, 0x3A, 0xB1, 0x0C, 0x78, 0x77, 0xDF, 0x72, + 0x5B, 0x77, 0x0D, 0x33, 0x7A, 0x0B, 0xC1, 0x1E, 0xED, 0x9A, 0xE8, 0x72, + 0x68, 0x8D, 0x24, 0xEE, 0x97, 0x24, 0xF6, 0xCA, 0x6D, 0xE8, 0x3B, 0x9D, + 0xDA, 0x93, 0x40, 0x85, 0xA1, 0x9D, 0x1F, 0xB8, 0xC9, 0xE5, 0xEA, 0x59, + 0xA0, 0xD4, 0x6D, 0xCB, 0x71, 0x52, 0x75, 0x9D, 0xA2, 0xAF, 0x91, 0x6A, + 0x4E, 0x0A, 0x6B, 0xB5, 0x67, 0x7B, 0x6C, 0xAC, 0x5E, 0x9B, 0x02, 0x27, + 0x4B, 0x3E, 0xCF, 0x19, 0x57, 0xCC, 0x74, 0x4B, 0x33, 0xA4, 0x6B, 0x1E, + 0x56, 0x6D, 0x0B, 0xA4, 0x84, 0xA3, 0x81, 0xC9, 0x89, 0xF7, 0x9E, 0x3F, + 0xFE, 0x57, 0x60, 0x4F, 0x79, 0x84, 0x53, 0xEB, 0x80, 0x8F, 0xB9, 0x63, + 0x29, 0x4F, 0xBD, 0xA0, 0x0C, 0xF0, 0x7F, 0x35, 0xEC, 0x18, 0xC1, 0x22, + 0xA3, 0x6D, 0x7F, 0x2E, 0xCC, 0x4D, 0x51, 0xFD, 0x76, 0x74, 0x18, 0x19, + 0x67, 0x6B, 0x81, 0x07, 0x07, 0x5B, 0x5D, 0xB3, 0x98, 0x4D, 0x23, 0xB8, + 0x77, 0xD1, 0xEC, 0x3C, 0x0E, 0x10, 0xD0, 0x65, 0x99, 0x29, 0xF1, 0x42, + 0x83, 0x51, 0x26, 0x18, 0x8C, 0x8E, 0x4F, 0x8D, 0x2A, 0x14, 0x34, 0x6A, + 0xC5, 0x71, 0x2F, 0x4C, 0xFF, 0xBA, 0x11, 0xD7, 0x76, 0x16, 0x00, 0xEE, + 0xBA, 0x26, 0xD9, 0xC2, 0x51, 0xBD, 0xC6, 0x67, 0x85, 0x56, 0x98, 0x36, + 0x12, 0xC3, 0xF1, 0xCC, 0xFA, 0xFB, 0xF6, 0x5A, 0xD2, 0x7A, 0xFF, 0x1B, + 0x33, 0xD3, 0x72, 0x05, 0x01, 0x67, 0xA2, 0x42, 0x45, 0x0C, 0x5E, 0x46, + 0xAD, 0x26, 0xA7, 0xCE, 0x38, 0x30, 0xFB, 0x9B, 0x39, 0x8D, 0x40, 0x61, + 0xDF, 0xE5, 0xC5, 0x8A, 0x26, 0xA6, 0x31, 0xFC, 0x8B, 0x0B, 0x2E, 0xAD, + 0xD8, 0xA5, 0x12, 0x92, 0xD2, 0xCA, 0x86, 0x73, 0x52, 0xA6, 0x19, 0xE7, + 0x70, 0xD2, 0x31, 0x14, 0x1C, 0xDA, 0x27, 0xC9, 0xB7, 0x6C, 0x98, 0xE9, + 0xD9, 0x59, 0x8B, 0x5F, 0x27, 0xA6, 0xB3, 0xAC, 0x89, 0xFC, 0x99, 0xF5, + 0x6A, 0x56, 0xC1, 0x99, 0xFE, 0x05, 0x3A, 0x0A, 0x27, 0x1E, 0xE4, 0xD2, + 0x75, 0x98, 0x7C, 0x00, 0x23, 0xD0, 0x19, 0x0B, 0x49, 0xC6, 0x52, 0x48, + 0x03, 0xB5, 0x24, 0x40, 0x03, 0xA2, 0x18, 0xA2, 0x0A, 0x5D, 0x84, 0xF2, + 0xDA, 0xF2, 0x01, 0xF5, 0xE7, 0xDD, 0x54, 0x1F, 0x6C, 0x04, 0xBA, 0x74, + 0x46, 0x29, 0xA3, 0x08, 0x18, 0xA1, 0xA9, 0x80, 0xA3, 0x85, 0x42, 0x49, + 0x33, 0x30, 0x79, 0x08, 0x7B, 0x72, 0x32, 0xB7, 0x59, 0x85, 0xA1, 0xB5, + 0x29, 0xDF, 0x69, 0xDF, 0x2C, 0xC3, 0x5F, 0xD7, 0xA7, 0xE9, 0x97, 0x6A, + 0xA4, 0x38, 0x8B, 0x8C, 0xDE, 0xB2, 0xA8, 0x27, 0xFE, 0x6E, 0xD5, 0xFF, + 0xF6, 0x00, 0x64, 0xB7, 0xBD, 0x14, 0x3C, 0xEC, 0x0E, 0x86, 0x83, 0x7A, + 0x16, 0xEF, 0x50, 0xBB, 0x3D, 0xBA, 0xA2, 0x43, 0x14, 0x61, 0x06, 0x8B, + 0x85, 0xCF, 0x86, 0xE6, 0xC9, 0x77, 0xC6, 0x9F, 0x84, 0xF2, 0x1E, 0xD8, + 0x51, 0x9F, 0xB6, 0xC8, 0x11, 0x56, 0x9A, 0x4B, 0x8B, 0xEA, 0x58, 0x68, + 0x18, 0x78, 0x44, 0x8C, 0x36, 0x0B, 0xA0, 0x4C, 0x74, 0x2E, 0x14, 0xBD, + 0xE8, 0x57, 0xA9, 0x1D, 0x4A, 0x9F, 0xD5, 0x44, 0xB3, 0x15, 0xD6, 0xED, + 0xAE, 0x7A, 0x4E, 0x7D, 0xA7, 0x3C, 0x30, 0xFF, 0x6F, 0x0C, 0x23, 0xCC, + 0x1B, 0x92, 0xC1, 0x48, 0xF9, 0x8C, 0x97, 0x47, 0x3E, 0x5E, 0x66, 0x83, + 0xE8, 0xB9, 0xF0, 0xD0, 0x1B, 0x79, 0x68, 0x1D, 0xA2, 0x35, 0xC7, 0x34, + 0x07, 0x8A, 0xCE, 0x68, 0xBD, 0x9B, 0x7C, 0x76, 0x38, 0x7A, 0x23, 0x9B, + 0x39, 0xD7, 0x04, 0x4A, 0x82, 0xB9, 0x4B, 0xCF, 0xB1, 0x9A, 0xBA, 0x75, + 0x6B, 0x04, 0xF5, 0x23, 0x8D, 0x36, 0x4F, 0x9A, 0x3E, 0x60, 0xD3, 0xAA, + 0xF9, 0x0F, 0x05, 0x5C, 0xA7, 0x28, 0x7E, 0xB4, 0xCA, 0x77, 0x92, 0x9B, + 0x21, 0x0C, 0x99, 0x84, 0xB0, 0xB1, 0xD2, 0x1C, 0xF7, 0x9A, 0x24, 0x0A, + 0xD7, 0x8A, 0xE3, 0x08, 0x3F, 0xE1, 0x5A, 0xC6, 0x32, 0xCF, 0xD8, 0xBB, + 0x6F, 0x86, 0x62, 0x28, 0xDC, 0xC6, 0xF5, 0x00, 0x8C, 0xBE, 0x15, 0x25, + 0x53, 0x87, 0x81, 0xAF, 0xDE, 0xAC, 0x6D, 0x59, 0x0D, 0x51, 0x1F, 0xF9, + 0x76, 0xEA, 0x44, 0x95, 0xFB, 0x1C, 0xC5, 0xB0, 0x0A, 0x29, 0xF2, 0xAE, + 0x8F, 0x03, 0xE7, 0x41, 0xD1, 0x54, 0x9D, 0xD3, 0xD2, 0xB4, 0x7D, 0x9A, + 0xC1, 0x09, 0xDA, 0xC5, 0xD8, 0x26, 0x59, 0xC4, 0x35, 0x66, 0xD7, 0xD1, + 0xE5, 0xA6, 0xED, 0xBB, 0x82, 0xAD, 0x50, 0x4C, 0xE0, 0x01, 0xC9, 0x57, + 0x78, 0x66, 0x8E, 0x0E, 0x69, 0xFD, 0x8C, 0xE9, 0x63, 0xA3, 0x21, 0xDA, + 0xC8, 0x58, 0x1D, 0x6B, 0x76, 0x6F, 0xA4, 0x8F, 0x46, 0xC8, 0x00, 0xB2, + 0x1E, 0xEF, 0x93, 0x54, 0x89, 0xAB, 0xD9, 0x18, 0x23, 0x95, 0xE6, 0x2A, + 0xF8, 0xCC, 0xF2, 0x74, 0xE5, 0x71, 0x60, 0x8C, 0xA1, 0x0E, 0x67, 0x14, + 0xBA, 0xEF, 0x69, 0xC4, 0x01, 0xFE, 0x93, 0x54, 0x26, 0x0A, 0xE1, 0xC2, + 0xC1, 0x47, 0xC9, 0x6A, 0xF6, 0x6A, 0xD8, 0xB6, 0xDD, 0xEE, 0x67, 0xB5, + 0xA0, 0xD8, 0x5F, 0x58, 0x7B, 0x42, 0xFE, 0xD3, 0xD0, 0xCB, 0xFD, 0x5E, + 0x22, 0x4F, 0x31, 0xF7, 0xBA, 0x12, 0x6C, 0xEF, 0x4A, 0x78, 0x23, 0x85, + 0xA3, 0xB1, 0x35, 0x59, 0x13, 0x5D, 0x35, 0xA2, 0x32, 0xF4, 0x6C, 0x07, + 0x33, 0x56, 0x53, 0xD9, 0xB5, 0x4B, 0x6F, 0xC7, 0x73, 0x01, 0x69, 0x54, + 0x7F, 0x95, 0x8C, 0x10, 0xD7, 0x11, 0xF1, 0xF5, 0x0C, 0x21, 0x17, 0xE5, + 0x23, 0x34, 0xDB, 0x4D, 0xC5, 0xA9, 0x18, 0x54, 0xD0, 0x76, 0xB2, 0x74, + 0x68, 0x61, 0x00, 0x8D, 0xCA, 0x3A, 0x70, 0xE4, 0x36, 0xDE, 0x2D, 0x9B, + 0x5F, 0xB0, 0x4E, 0x66, 0x15, 0x7B, 0x92, 0x04, 0x38, 0xBD, 0xC1, 0x61, + 0xF2, 0x19, 0xB9, 0xD9, 0x71, 0xCF, 0xFB, 0x4D, 0x19, 0x99, 0xE5, 0x2A, + 0x50, 0x27, 0x20, 0xC2, 0x18, 0x7B, 0xE9, 0xFA, 0x02, 0x13, 0x66, 0x89, + 0xE7, 0x72, 0x2A, 0xDC, 0x27, 0x72, 0x91, 0xE7, 0xCF, 0x3A, 0x76, 0x6B, + 0xFD, 0xAF, 0x6C, 0x68, 0x57, 0x38, 0xEE, 0x97, 0x55, 0x0C, 0xBF, 0xA6, + 0xBA, 0xDD, 0xC3, 0x2F, 0xDE, 0xD5, 0x39, 0x91, 0x8E, 0xFA, 0xE8, 0xFC, + 0x52, 0x87, 0x94, 0x85, 0x24, 0x3A, 0xDE, 0x03, 0xBE, 0x02, 0x1B, 0x81, + 0xE8, 0x1F, 0xE6, 0x96, 0xAA, 0x38, 0x42, 0x42, 0x2F, 0xDF, 0x4F, 0x13, + 0x50, 0xD3, 0x77, 0xE4, 0x2C, 0x8E, 0x96, 0x3C, 0x4A, 0x6E, 0x37, 0xAF, + 0xE5, 0x03, 0x27, 0x5F, 0x71, 0xE1, 0x79, 0xEA, 0xF7, 0xC5, 0x71, 0x4F, + 0xAC, 0xFE, 0x36, 0x45, 0x0A, 0x96, 0x60, 0x59, 0xD9, 0x52, 0x9F, 0x31, + 0xDF, 0x20, 0x6F, 0x33, 0x03, 0x3D, 0x51, 0x57, 0x18, 0xC1, 0xD0, 0xA4, + 0x7C, 0x33, 0x2E, 0x59, 0x04, 0xF8, 0x3C, 0xF3, 0x58, 0xBB, 0x2F, 0x12, + 0xB1, 0x35, 0xC4, 0xF6, 0xC4, 0x95, 0x3D, 0xDF, 0x13, 0x09, 0xFC, 0xFB, + 0x30, 0xA2, 0xF6, 0x9B, 0xAE, 0xC4, 0xA3, 0xB3, 0x2E, 0xFE, 0x29, 0x8D, + 0x56, 0x24, 0x37, 0xA4, 0xA4, 0x1E, 0xC3, 0x13, 0x6F, 0x99, 0x3D, 0x35, + 0xF8, 0xA0, 0x08, 0x7E, 0x4C, 0x7C, 0x59, 0x81, 0xC0, 0xD8, 0x8F, 0xF7, + 0x33, 0x8E, 0x67, 0x2F, 0xD2, 0x04, 0xE7, 0x4D, 0xB4, 0x90, 0x07, 0xD3, + 0xF7, 0x73, 0x18, 0x1D, 0x69, 0x89, 0x49, 0x13, 0x08, 0x65, 0x6F, 0xCA, + 0xDC, 0x8A, 0x32, 0xBC, 0xCF, 0x5C, 0x6E, 0xDE, 0x23, 0x83, 0x22, 0x94, + 0xEE, 0x02, 0xC6, 0x44, 0xE8, 0xDE, 0xBD, 0xB4, 0x79, 0xD2, 0xF0, 0x9E, + 0x46, 0xCB, 0xF6, 0x5B, 0x2B, 0xA3, 0x97, 0x98, 0x05, 0x60, 0x83, 0xE3, + 0x74, 0xFA, 0xA5, 0x0A, 0x04, 0xE0, 0x76, 0xB5, 0x2B, 0x16, 0xA2, 0x00, + 0xE1, 0x0D, 0xAF, 0x5C, 0x8E, 0xB3, 0x5E, 0x24, 0xC4, 0xA3, 0xB5, 0x8B, + 0xAC, 0x56, 0x13, 0x09, 0x8D, 0xDE, 0xE5, 0xA1, 0x85, 0x49, 0x65, 0xB2, + 0xFF, 0xE4, 0xF2, 0x61, 0x12, 0xE2, 0x45, 0x48, 0x8D, 0x8A, 0x02, 0x60, + 0xBB, 0x2F, 0xF3, 0xFF, 0x10, 0xCD, 0xE3, 0xA7, 0xE8, 0xF0, 0xC1, 0x14, + 0xB5, 0x0D, 0x65, 0xDE, 0x37, 0x33, 0xFC, 0x2F, 0x22, 0xB9, 0xBF, 0xE0, + 0x56, 0x0C, 0x44, 0x18, 0xFC, 0xAA, 0xBA, 0xBE, 0x24, 0x0E, 0xA1, 0x31, + 0x17, 0x7D, 0x2C, 0x2A, 0xA2, 0xAA, 0xF4, 0x65, 0x81, 0x12, 0xB4, 0x7E, + 0x0D, 0x13, 0xE3, 0x9B, 0x3F, 0xAD, 0xA1, 0x20, 0x19, 0x91, 0x34, 0x92, + 0xAD, 0x15, 0x5A, 0x93, 0x65, 0xC1, 0xDD, 0x10, 0xCD, 0x6D, 0xAD, 0x94, + 0x15, 0xA4, 0x88, 0x30, 0x4A, 0x8B, 0x8C, 0xB0, 0xEB, 0xA9, 0x04, 0x8E, + 0xEA, 0x4A, 0xBA, 0x28, 0x1F, 0x28, 0xD4, 0x65, 0x85, 0x49, 0xF4, 0x7C, + 0x69, 0x13, 0xB4, 0x3E, 0x84, 0x36, 0x77, 0x9E, 0x70, 0x36, 0x12, 0x53, + 0x1B, 0xD4, 0xD0, 0x2A, 0x17, 0xDC, 0x84, 0x93, 0xC1, 0xDF, 0xB9, 0x44, + 0x68, 0x0B, 0xF5, 0xEE, 0x3B, 0xB2, 0xA2, 0x8C, 0xCB, 0xB6, 0xA6, 0xD8, + 0x97, 0xA8, 0x2C, 0x61, 0x7C, 0xB7, 0x21, 0x58, 0x07, 0xC9, 0xD4, 0x5D, + 0x54, 0x3A, 0x70, 0xC9, 0xF4, 0x51, 0x00, 0xC6, 0x25, 0xFF, 0x1E, 0x1D, + 0x94, 0xBA, 0x48, 0xDE, 0x5E, 0x69, 0xB4, 0x87, 0x4F, 0x87, 0x83, 0x64, + 0x9A, 0xDF, 0x83, 0x93, 0x59, 0x2A, 0x43, 0xD7, 0xCE, 0x35, 0xE7, 0xD5, + 0x77, 0x72, 0x23, 0xB5, 0xFF, 0x52, 0xA6, 0x11, 0x2A, 0x29, 0x0A, 0xCA, + 0x3B, 0xB8, 0xBC, 0xF3, 0xFE, 0x3A, 0x6B, 0x1B, 0x13, 0xC9, 0x5D, 0xD1, + 0xF5, 0xEE, 0x6A, 0xC4, 0x05, 0x03, 0xAE, 0x04, 0xC5, 0x36, 0x03, 0x56, + 0x3C, 0x5D, 0xE1, 0x3E, 0x32, 0x45, 0x18, 0x3C, 0x90, 0x46, 0xF3, 0xB0, + 0xDA, 0xD4, 0xCC, 0xE0, 0xE1, 0xCD, 0x40, 0xAD, 0xC3, 0xFA, 0x6B, 0x2B, + 0x74, 0xC5, 0x20, 0xCA, 0xF6, 0xA2, 0xA7, 0xC6, 0xD3, 0xA2, 0x38, 0x1E, + 0x5C, 0x03, 0xE5, 0xCC, 0x3F, 0x21, 0xED, 0x8E, 0xAE, 0x6B, 0xDE, 0x75, + 0xF9, 0x67, 0x63, 0xEA, 0x8B, 0x18, 0x06, 0x7A, 0xBD, 0x67, 0x32, 0xA3, + 0x89, 0x6D, 0x71, 0x0A, 0x43, 0x00, 0x74, 0x6B, 0x19, 0x42, 0x8D, 0x0C, + 0x93, 0xAC, 0x4F, 0x69, 0x3B, 0x5C, 0xB0, 0x35, 0xAE, 0x7F, 0x54, 0x48, + 0x1A, 0x48, 0x36, 0x4A, 0xD4, 0x60, 0x32, 0x16, 0x21, 0x75, 0xF6, 0xAA, + 0x3A, 0x34, 0x14, 0xC3, 0xC7, 0x0D, 0xB6, 0x3E, 0xF8, 0x7D, 0xDE, 0x17, + 0x46, 0xBD, 0xA7, 0x87, 0x08, 0xF5, 0x1B, 0x6B, 0x13, 0x0B, 0xCD, 0xA9, + 0x4D, 0x9A, 0xD2, 0x39, 0x83, 0xCA, 0xE9, 0x47, 0xE1, 0xCF, 0xD6, 0x73, + 0xF1, 0x15, 0xCC, 0x50, 0x87, 0xE2, 0xB2, 0x56, 0x04, 0xCC, 0x20, 0x06, + 0x87, 0x3F, 0x19, 0x8D, 0xE6, 0x45, 0x70, 0xF1, 0x13, 0xB1, 0x32, 0x1C, + 0xC2, 0xFF, 0xB9, 0x2F, 0xC9, 0x76, 0x2C, 0x0E, 0x81, 0x18, 0xEF, 0x34, + 0xA7, 0xD0, 0x85, 0xD1, 0x37, 0xC3, 0x83, 0x44, 0xFB, 0x35, 0x2B, 0xB8, + 0x38, 0x4A, 0xB8, 0x44, 0x61, 0xE0, 0x65, 0x97, 0x90, 0x2A, 0xFB, 0x09, + 0x68, 0x1A, 0x8A, 0xF0, 0x56, 0xF7, 0xF7, 0xE4, 0xF5, 0x01, 0x35, 0xD2, + 0x92, 0xB5, 0xE0, 0x82, 0x2D, 0x39, 0x03, 0x1B, 0x0C, 0xDC, 0x30, 0x8D, + 0x7E, 0x55, 0xB4, 0x38, 0x29, 0x93, 0xA0, 0x99, 0x85, 0x6E, 0x8B, 0x6B, + 0x82, 0x6F, 0x5A, 0x57, 0xC0, 0x04, 0x68, 0xE3, 0x41, 0xB6, 0xF9, 0x5B, + 0xC7, 0xE9, 0xCF, 0x96, 0x06, 0x86, 0x63, 0x93, 0x12, 0xC1, 0xEC, 0xF3, + 0xBB, 0x25, 0x39, 0x8F, 0x1F, 0x06, 0x70, 0x08, 0xC6, 0x60, 0x4C, 0xD1, + 0x67, 0x89, 0x8A, 0x13, 0x97, 0x67, 0x13, 0x6E, 0x08, 0x2B, 0xE5, 0x59, + 0x5C, 0xAA, 0xFF, 0x4B, 0xE7, 0x49, 0x81, 0x6E, 0x46, 0x5E, 0x9E, 0x13, + 0x5C, 0x69, 0xEB, 0x95, 0x36, 0x2A, 0x77, 0xBF, 0xD2, 0xB5, 0xDC, 0x49, + 0x33, 0x5F, 0x17, 0x5D, 0x1F, 0x1C, 0x78, 0x8B, 0x38, 0x4D, 0x5D, 0xC4, + 0x03, 0xF2, 0x58, 0xF4, 0x0A, 0xFD, 0xE4, 0xEF, 0x18, 0xF0, 0x8F, 0x31, + 0x29, 0x5D, 0x69, 0xEE, 0xA1, 0x31, 0x37, 0xE2, 0x31, 0x5F, 0xF6, 0x92, + 0x33, 0xDC, 0x70, 0x28, 0xD2, 0x6D, 0xC7, 0x88, 0xC5, 0x86, 0x61, 0x0D, + 0xA9, 0x7B, 0x15, 0xA4, 0xE5, 0x35, 0x7C, 0xF3, 0xBD, 0xE1, 0x80, 0xDE, + 0x9D, 0x7A, 0x7D, 0x98, 0x06, 0xFF, 0x20, 0x6A, 0xF4, 0xCD, 0xC8, 0x99, + 0x25, 0x64, 0x81, 0xEA, 0xC8, 0x7E, 0x3C, 0x5B, 0x28, 0x06, 0xBD, 0xA5, + 0xA8, 0xF8, 0x9C, 0xF3, 0x3D, 0x4F, 0xB1, 0xB5, 0x15, 0x1D, 0x50, 0x0C, + 0x45, 0x55, 0x48, 0xEA, 0x4C, 0x62, 0x5C, 0x11, 0xF3, 0xAE, 0x7E, 0x13, + 0xA0, 0x9E, 0x6A, 0xB4, 0x99, 0x88, 0x03, 0x8F, 0xC7, 0xAE, 0x20, 0x67, + 0x2D, 0x4D, 0x88, 0x11, 0xB5, 0x41, 0x0D, 0x37, 0xA3, 0xAB, 0xD8, 0xE4, + 0x7C, 0x59, 0xC5, 0x71, 0x74, 0x5E, 0x95, 0xB8, 0x38, 0x95, 0x40, 0xAC, + 0x15, 0xD3, 0x7D, 0x21, 0xD0, 0xB3, 0x82, 0x40, 0x55, 0x92, 0x43, 0x90, + 0xDE, 0x83, 0x62, 0xE7, 0xD4, 0x56, 0x32, 0x72, 0x52, 0x0B, 0x2E, 0x09, + 0x30, 0x64, 0x4A, 0xAC, 0x5A, 0x67, 0x01, 0x0A, 0xBD, 0x22, 0xF4, 0x58, + 0xB0, 0xE5, 0x6B, 0x92, 0x69, 0x89, 0x72, 0xE2, 0x91, 0x50, 0x3E, 0x47, + 0xBB, 0xE0, 0x23, 0x57, 0xBC, 0xA5, 0x5D, 0xEF, 0xA7, 0x39, 0x96, 0x00, + 0x99, 0xE4, 0x30, 0x89, 0xCF, 0x0C, 0xA5, 0x22, 0x8F, 0x78, 0x5F, 0xAA, + 0x69, 0x50, 0xF6, 0xB9, 0x61, 0xA1, 0x3E, 0x1C, 0x65, 0x15, 0xD1, 0x50, + 0x4B, 0xDF, 0xD0, 0xA0, 0x87, 0xC2, 0xF8, 0xB2, 0xAA, 0x00, 0xB6, 0xFD, + 0x7A, 0x4E, 0xA6, 0xEA, 0xD8, 0xCE, 0x22, 0x3C, 0x41, 0xFA, 0x6A, 0x05, + 0xCA, 0x5F, 0xEC, 0x98, 0x4E, 0xFC, 0xF1, 0x06, 0x5E, 0x07, 0xF3, 0x98, + 0x73, 0xCF, 0xBD, 0x17, 0xF5, 0xB5, 0x5B, 0x52, 0x29, 0xEF, 0xCC, 0xAE, + 0x8C, 0x8F, 0x6C, 0xB0, 0x82, 0x9D, 0x1C, 0x15, 0x62, 0x4C, 0xFC, 0x99, + 0xFD, 0x3D, 0xD1, 0x7F, 0x13, 0xFD, 0x8A, 0xD1, 0x96, 0x50, 0x98, 0x2D, + 0x30, 0xE8, 0x57, 0x07, 0xFC, 0xD0, 0x06, 0x24, 0xB5, 0x7A, 0xC6, 0xBE, + 0xAA, 0x1E, 0xBF, 0xFF, 0xC6, 0x6C, 0x24, 0x70, 0xB7, 0x59, 0xC3, 0xDB, + 0xC1, 0x3A, 0x79, 0x6F, 0x83, 0xCB, 0x55, 0x84, 0x7E, 0x04, 0xF8, 0xDB, + 0x7D, 0x41, 0xAF, 0x5D, 0xDB, 0x5A, 0xE6, 0xCE, 0x9B, 0x66, 0x6F, 0x38, + 0xF4, 0xEA, 0x20, 0x09, 0x75, 0x75, 0xCD, 0xF8, 0x62, 0x74, 0x7E, 0x4A, + 0x3E, 0x2E, 0xAE, 0xCC, 0x8D, 0x49, 0xBC, 0xCC, 0x34, 0xE9, 0x9B, 0xC7, + 0x05, 0x81, 0x9C, 0xBA, 0x00, 0xF2, 0x83, 0xC5, 0xE4, 0x78, 0x85, 0xD0, + 0xC5, 0xF3, 0x0F, 0xB0, 0x18, 0x30, 0x9B, 0xA3, 0x62, 0x92, 0x72, 0xD5, + 0xEA, 0xE1, 0xC0, 0x5B, 0xDA, 0x0C, 0xBC, 0x19, 0x46, 0x7F, 0x03, 0xC8, + 0x7B, 0x31, 0x13, 0x1B, 0xA0, 0x91, 0xB4, 0x99, 0xC1, 0x9D, 0xB8, 0xE5, + 0x33, 0xD9, 0x41, 0x53, 0x19, 0x97, 0x99, 0x27, 0x8C, 0x8E, 0x5B, 0xAA, + 0x17, 0x85, 0x42, 0xA9, 0x47, 0x1C, 0x19, 0x33, 0xCB, 0x88, 0xBE, 0xF4, + 0x48, 0x43, 0x66, 0xEB, 0x9F, 0xF6, 0x94, 0x2C, 0xC2, 0x74, 0xF8, 0xD7, + 0x9B, 0xEB, 0x2F, 0x2F, 0xF3, 0x52, 0x1F, 0x45, 0x9D, 0x9E, 0xB4, 0x86, + 0x76, 0xAB, 0x43, 0xB9, 0x52, 0x0C, 0x0A, 0x06, 0xD7, 0xF2, 0xA5, 0xFE, + 0x9C, 0x0D, 0x8A, 0xE0, 0xA4, 0xEA, 0x65, 0x3F, 0x2B, 0x7C, 0x03, 0x31, + 0x3A, 0x40, 0x97, 0xA8, 0x56, 0xA2, 0xAD, 0x63, 0x7A, 0xE5, 0xDC, 0xFD, + 0x8D, 0xA9, 0xF3, 0x55, 0xB5, 0x14, 0xB7, 0x51, 0xBA, 0x00, 0x32, 0x43, + 0x25, 0xEB, 0x61, 0x78, 0xA6, 0x2A, 0xEA, 0x9D, 0x15, 0x72, 0x5D, 0xD0, + 0x0E, 0x0C, 0xB4, 0xC1, 0x4B, 0x10, 0x9A, 0xFB, 0x1B, 0x54, 0x33, 0x8D, + 0x3A, 0x0B, 0x43, 0x51, 0x6C, 0x22, 0xB8, 0x29, 0xC5, 0x11, 0x1F, 0x28, + 0xF5, 0x82, 0x5F, 0xCF, 0x0A, 0xB0, 0xBF, 0xDA, 0x90, 0x13, 0xCE, 0x69, + 0xFF, 0x05, 0x85, 0x9D, 0x80, 0xF3, 0x3D, 0x4B, 0x21, 0xAB, 0xED, 0x73, + 0xB9, 0xC4, 0xAD, 0x70, 0xEA, 0x17, 0x20, 0x78, 0xCA, 0xCC, 0x4E, 0x47, + 0xCA, 0x30, 0xA8, 0xDB, 0x1C, 0x7B, 0x46, 0x3C, 0xC0, 0xE2, 0x96, 0xF8, + 0x60, 0xDD, 0x43, 0xFE, 0x41, 0x7C, 0xD2, 0x7B, 0xB9, 0x90, 0x97, 0xF6, + 0x86, 0x62, 0xD5, 0xF3, 0x49, 0x78, 0x81, 0xCF, 0x0C, 0xF1, 0x30, 0xC7, + 0x37, 0x16, 0xDE, 0xB4, 0x93, 0x6A, 0xE0, 0x9F, 0x5B, 0x17, 0x43, 0x69, + 0x7E, 0x54, 0xBB, 0x83, 0x4F, 0x1B, 0xA9, 0x70, 0x41, 0x97, 0x5A, 0x5D, + 0x6E, 0x51, 0x1F, 0xEA, 0xDF, 0x44, 0xFB, 0x2D, 0x1E, 0xB9, 0xF9, 0xA4, + 0xCE, 0x11, 0xD5, 0x6C, 0x43, 0xF5, 0xD1, 0x23, 0x7B, 0x7E, 0x30, 0x4B, + 0x82, 0xF4, 0x3F, 0x9C, 0x53, 0xF5, 0xC8, 0xF6, 0xA1, 0xAB, 0x39, 0xD2, + 0x01, 0xD5, 0xEA, 0x01, 0xFF, 0x75, 0xFD, 0x23, 0x63, 0xBE, 0x4C, 0x70, + 0xC0, 0xF6, 0x78, 0xED, 0x83, 0x79, 0x19, 0x33, 0x58, 0xEA, 0x73, 0xC4, + 0xE9, 0x0E, 0xF6, 0x89, 0x3C, 0xD4, 0x0C, 0xF6, 0xBE, 0xAC, 0x81, 0x32, + 0x70, 0x24, 0x7D, 0xEA, 0x70, 0xBF, 0xC4, 0x45, 0x56, 0x8C, 0x49, 0x91, + 0xA4, 0x04, 0x76, 0x84, 0x5B, 0x43, 0x11, 0x72, 0x74, 0x1C, 0xF5, 0xEB, + 0x93, 0x42, 0x87, 0x1D, 0x6B, 0x16, 0x9F, 0xAD, 0xCA, 0x9B, 0xD3, 0x1F, + 0x78, 0x1A, 0x0A, 0xC5, 0x7D, 0x44, 0xD2, 0xDE, 0x91, 0x0C, 0x3E, 0x12, + 0x74, 0xDF, 0x92, 0xF7, 0x96, 0xD3, 0x6E, 0x76, 0xD6, 0x98, 0x48, 0x78, + 0x77, 0x92, 0xC9, 0x45, 0xD8, 0x75, 0xB3, 0x84, 0xDC, 0x1A, 0x2A, 0x0E, + 0xAF, 0xD8, 0xB2, 0x6D, 0x88, 0x60, 0xEE, 0x77, 0x4A, 0xFE, 0x4B, 0xC1, + 0x2E, 0x27, 0x4C, 0x4F, 0x31, 0x51, 0x5B, 0x92, 0x75, 0xC2, 0x41, 0x7F, + 0xB0, 0x43, 0x09, 0xC7, 0xBA, 0xB0, 0xB3, 0x9B, 0x27, 0x3D, 0xD4, 0x10, + 0x59, 0xD3, 0x4F, 0xB8, 0x7C, 0xFF, 0xC8, 0x4C, 0x06, 0xCA, 0xB4, 0x5C, + 0x37, 0xA4, 0xCD, 0x12, 0x60, 0x5C, 0x15, 0xB2, 0xA2, 0xAA, 0x81, 0x1A, + 0x17, 0x7D, 0xD9, 0xF6, 0x31, 0xD6, 0xEB, 0xE7, 0xE7, 0x16, 0x85, 0x36, + 0x3C, 0xE3, 0x57, 0x76, 0xAC, 0x35, 0xE3, 0xEC, 0x0F, 0xB7, 0x9B, 0xD5, + 0xD1, 0x8E, 0x63, 0x7F, 0x1A, 0xB8, 0x23, 0x02, 0x50, 0x62, 0x06, 0xBF, + 0xE5, 0x14, 0x2D, 0xED, 0xF0, 0x68, 0xEF, 0x8B, 0x82, 0x35, 0x29, 0x8A, + 0xE1, 0x64, 0x14, 0xFB, 0xAA, 0x4B, 0xE3, 0x2B, 0x91, 0x6A, 0x1D, 0x8E, + 0xB2, 0x60, 0xC1, 0xC4, 0x5A, 0x0B, 0xA5, 0xD6, 0xA1, 0xE8, 0x91, 0x97, + 0xA1, 0x51, 0xBD, 0x81, 0xD0, 0xB5, 0x7F, 0x69, 0x4A, 0xA8, 0x5D, 0xB5, + 0x36, 0x55, 0x22, 0xE2, 0x7E, 0x1C, 0x53, 0xE2, 0x5B, 0x57, 0x17, 0x62, + 0x96, 0xC8, 0x7E, 0x31, 0xCB, 0xE0, 0xC6, 0x71, 0x5E, 0xC1, 0xB9, 0xD6, + 0x54, 0x22, 0x49, 0xEF, 0xDD, 0x50, 0xB0, 0x88, 0xC0, 0x0F, 0x16, 0xE7, + 0xD6, 0xBA, 0x9A, 0x08, 0xAC, 0xD6, 0x78, 0xDA, 0x80, 0xDF, 0x7D, 0x69, + 0x97, 0xD4, 0xA7, 0x97, 0xFA, 0xDF, 0x76, 0x54, 0xE4, 0x3B, 0x1D, 0xF1, + 0x98, 0xC4, 0x68, 0xA6, 0xE8, 0x0B, 0x27, 0xE1, 0x0C, 0x2C, 0xC2, 0x8F, + 0x88, 0xB3, 0x31, 0xFF, 0x3A, 0xDB, 0x90, 0x1C, 0x59, 0x2A, 0x88, 0x54, + 0x26, 0x7E, 0xCB, 0xFF, 0x73, 0x99, 0xE5, 0xCF, 0x31, 0x8B, 0x69, 0xDB, + 0x8F, 0x28, 0x4D, 0x3B, 0x2F, 0x63, 0xC8, 0xEB, 0x61, 0x3E, 0x95, 0xBC, + 0x8B, 0x5C, 0x1C, 0xCA, 0xED, 0x43, 0xDF, 0x1A, 0x94, 0xF4, 0xF1, 0xF2, + 0x7D, 0x37, 0x71, 0xC2, 0x28, 0xE7, 0xFE, 0x69, 0x69, 0x3B, 0x6D, 0x31, + 0x3A, 0xE7, 0x0F, 0x26, 0xCE, 0xCD, 0x19, 0xA5, 0xE0, 0x66, 0x29, 0x54, + 0x65, 0x43, 0x43, 0xB9, 0x22, 0x86, 0x0E, 0x2E, 0xD5, 0x63, 0x55, 0xA8, + 0x78, 0x05, 0x54, 0xE3, 0x1E, 0xEC, 0x01, 0x67, 0xB4, 0x22, 0xFC, 0x18, + 0xDB, 0x53, 0x6F, 0x97, 0xC0, 0xEB, 0x58, 0x57, 0x49, 0xDC, 0xBD, 0x76, + 0xCA, 0x00, 0x46, 0xE3, 0x7F, 0x4D, 0x53, 0xAC, 0xDC, 0x77, 0xF3, 0xAF, + 0x4F, 0x5A, 0x85, 0xC8, 0x37, 0x2B, 0x41, 0x63, 0x6F, 0xD7, 0x25, 0x61, + 0x6D, 0x09, 0x9C, 0xEB, 0x43, 0xE2, 0xE8, 0x49, 0x72, 0xCD, 0x8E, 0x1C, + 0xD0, 0x8E, 0xD3, 0x96, 0x1F, 0x98, 0xAA, 0x2B, 0xF6, 0x47, 0x4D, 0x92, + 0x2A, 0xAA, 0x41, 0xA5, 0xA9, 0x71, 0xFE, 0x6C, 0x43, 0x7E, 0xB8, 0x21, + 0x4A, 0x58, 0xA4, 0xF7, 0x5D, 0xF8, 0x44, 0xC4, 0xE8, 0x9A, 0xA7, 0xB9, + 0xAC, 0x97, 0xD4, 0x8D, 0xA6, 0xC4, 0x04, 0x43, 0x30, 0x21, 0x54, 0x16, + 0x92, 0x49, 0x77, 0x7D, 0xEA, 0xD1, 0x1F, 0xB4, 0x75, 0xF4, 0x1F, 0x73, + 0xD0, 0xEA, 0x0F, 0xA6, 0x60, 0x4B, 0xE9, 0xDE, 0x79, 0x4C, 0xFF, 0xD9, + 0xAB, 0x9D, 0xA6, 0x92, 0xE8, 0x64, 0x25, 0x2F, 0x75, 0x97, 0x5C, 0x7A, + 0x7E, 0xF1, 0x5A, 0xE1, 0x6D, 0xD7, 0x16, 0x5A, 0x42, 0x83, 0x43, 0xDD, + 0x8D, 0x22, 0xEB, 0xEE, 0x63, 0xB0, 0x73, 0x67, 0x83, 0x1E, 0xF8, 0x7C, + 0xB6, 0x5B, 0xA5, 0xF9, 0xD1, 0xFF, 0x8A, 0xAD, 0x9A, 0x75, 0x4A, 0x3D, + 0x37, 0x67, 0x40, 0x78, 0xD5, 0x2A, 0xB3, 0xBE, 0xF3, 0x66, 0x3F, 0x51, + 0x94, 0x79, 0x2D, 0x98, 0xB7, 0x29, 0x81, 0x9B, 0xC3, 0xC4, 0x28, 0x38, + 0xB3, 0x99, 0x84, 0xBA, 0x50, 0x15, 0x66, 0x68, 0x40, 0x3D, 0xCD, 0xAF, + 0x3B, 0xF3, 0x1F, 0xD1, 0xE4, 0x17, 0x80, 0x74, 0xE3, 0x14, 0xBF, 0xB3, + 0x3D, 0xC3, 0xC2, 0x07, 0x1E, 0x74, 0x57, 0x96, 0xDF, 0xE4, 0x62, 0xBA, + 0x4C, 0x57, 0x47, 0x0A, 0x09, 0xC2, 0x46, 0x81, 0xF5, 0xBB, 0x77, 0x34, + 0x49, 0x3B, 0xBB, 0x02, 0xDC, 0xF1, 0x15, 0x99, 0x15, 0xB8, 0xF0, 0xD2, + 0x28, 0xD5, 0xC8, 0x79, 0xAB, 0xAF, 0xF8, 0x83, 0xE3, 0x57, 0x9A, 0x5E, + 0xC0, 0x0C, 0x72, 0x2E, 0xD8, 0xB7, 0xDE, 0xAB, 0x27, 0x49, 0xEC, 0x4E, + 0x8E, 0xB0, 0x49, 0x65, 0xDD, 0x2F, 0x56, 0xA4, 0xBE, 0x04, 0x90, 0x9C, + 0xCA, 0x76, 0x5F, 0x59, 0x94, 0x99, 0x5F, 0x97, 0xFD, 0xA7, 0x38, 0xD2, + 0x7F, 0x53, 0xBC, 0x7B, 0x0F, 0x6F, 0xC9, 0xE5, 0x3A, 0x0F, 0x94, 0x2C, + 0xBA, 0x85, 0x6D, 0xAE, 0xF7, 0x21, 0x6A, 0x64, 0xFD, 0xAA, 0x65, 0xD8, + 0x30, 0xB3, 0x0A, 0x6C, 0x91, 0xC6, 0xB6, 0x29, 0x8D, 0x68, 0xC7, 0x1A, + 0x06, 0x9C, 0x58, 0x30, 0x3C, 0xF2, 0xC6, 0x15, 0xD3, 0x8A, 0xC9, 0xA0, + 0x4D, 0x56, 0x88, 0xC7, 0xC2, 0x4E, 0x47, 0x87, 0x9F, 0x20, 0x13, 0x6C, + 0xEF, 0xC4, 0x6D, 0x31, 0x47, 0xB3, 0xEB, 0xBC, 0x61, 0x11, 0xE1, 0xA1, + 0xD8, 0x6E, 0x2B, 0x5C, 0xC1, 0xFD, 0xC3, 0x75, 0xBF, 0x70, 0xBC, 0x77, + 0x4E, 0x47, 0x65, 0xE5, 0xEC, 0xDD, 0x70, 0x24, 0x63, 0xA9, 0xD6, 0x9C, + 0xA9, 0x0C, 0x86, 0xDB, 0xC0, 0x3D, 0x96, 0x65, 0xA4, 0x9D, 0x89, 0xF1, + 0xB1, 0x65, 0x16, 0x29, 0x3E, 0x8C, 0x97, 0xC0, 0x73, 0xED, 0xD1, 0x96, + 0x84, 0x17, 0x8D, 0x66, 0x8E, 0x7F, 0x47, 0xD1, 0x64, 0x7F, 0x83, 0x54, + 0xE6, 0xD3, 0xA0, 0x6E, 0xB7, 0xB0, 0xA5, 0x7E, 0x8E, 0xFE, 0xBD, 0xA9, + 0xDE, 0x0B, 0x7E, 0xE9, 0x68, 0x82, 0x2B, 0x59, 0xF2, 0xA2, 0x45, 0x86, + 0x84, 0xEF, 0x04, 0x18, 0x6E, 0x5F, 0x5D, 0x21, 0xED, 0x8B, 0xAE, 0x65, + 0x0A, 0xC4, 0xD0, 0xD8, 0x2A, 0x9E, 0x81, 0x85, 0x78, 0x2B, 0x4E, 0x11, + 0x47, 0xC6, 0x60, 0x31, 0x63, 0xB1, 0x9A, 0xEB, 0x55, 0x34, 0x98, 0x27, + 0x9E, 0xCC, 0x7D, 0x28, 0x1B, 0xF9, 0xFF, 0x4D, 0x14, 0xF1, 0x48, 0x88, + 0x8C, 0x26, 0xDE, 0x1F, 0xF3, 0xE0, 0xCB, 0xD1, 0x4A, 0x06, 0x0C, 0xE0, + 0x79, 0x07, 0x6F, 0x01, 0xF6, 0x0F, 0x7B, 0x6E, 0x9E, 0x21, 0x0A, 0x7C, + 0x8D, 0xDC, 0xAB, 0xE9, 0xDB, 0xCB, 0xC8, 0x68, 0x4F, 0x20, 0xBB, 0xDB, + 0xF6, 0x3A, 0xEC, 0xD4, 0x52, 0x6F, 0xDF, 0xFF, 0x39, 0xAB, 0x30, 0xF9, + 0xBF, 0xCB, 0xC6, 0xC6, 0x63, 0x6B, 0xFE, 0x38, 0xF8, 0x50, 0x56, 0x00, + 0x23, 0xF9, 0xB7, 0x33, 0xE2, 0x93, 0x0A, 0x4A, 0xA1, 0x20, 0x85, 0xEC, + 0x88, 0x0E, 0x83, 0x57, 0x25, 0x38, 0x91, 0x48, 0x99, 0x0D, 0xAA, 0x28, + 0xEA, 0xBF, 0x66, 0x01, 0xC5, 0x08, 0xFF, 0xC6, 0x78, 0x37, 0x36, 0x51, + 0x0B, 0xF0, 0x63, 0x74, 0xC5, 0x3E, 0x14, 0x9C, 0xE4, 0x4B, 0x3A, 0x71, + 0x02, 0x96, 0x3F, 0x56, 0xF0, 0x9C, 0xCA, 0x9C, 0xAB, 0xA7, 0x86, 0x7E, + 0xB0, 0x9E, 0xFB, 0x58, 0xDE, 0xE5, 0x6E, 0x47, 0xEE, 0x80, 0x39, 0x52, + 0xD9, 0xCA, 0xE6, 0xC9, 0xA7, 0x9C, 0x89, 0xB0, 0x52, 0x68, 0xAB, 0x4B, + 0x3F, 0x86, 0xD3, 0x11, 0xE6, 0xFC, 0x2C, 0x77, 0x8C, 0x5C, 0x6E, 0x19, + 0xD8, 0x53, 0x95, 0xA4, 0x46, 0x08, 0xAC, 0x7D, 0x5D, 0xFB, 0xDE, 0x6C, + 0x4D, 0x45, 0xA3, 0x41, 0x9D, 0xCE, 0xC5, 0xB1, 0x49, 0xBD, 0x06, 0xF6, + 0x74, 0x2F, 0x82, 0xF6, 0x91, 0x4D, 0xDE, 0x8A, 0x2D, 0xD8, 0xAF, 0x17, + 0xFB, 0xC8, 0x85, 0xE2, 0x19, 0x39, 0xDD, 0x1B, 0x58, 0x2B, 0x4F, 0xB6, + 0xED, 0x32, 0x35, 0xF6, 0xEB, 0x12, 0xCE, 0x7F, 0xD1, 0x3C, 0xF1, 0x6E, + 0xC4, 0xE5, 0xBA, 0x6E, 0x92, 0xF7, 0x36, 0xF0, 0x84, 0xB3, 0x36, 0xFE, + 0x89, 0x4C, 0xFE, 0xA7, 0x9D, 0x73, 0x98, 0x28, 0xBB, 0x01, 0x5A, 0x9B, + 0x76, 0x6C, 0x82, 0x81, 0x55, 0x3B, 0xA9, 0x42, 0xD7, 0x7A, 0x37, 0x0C, + 0x3E, 0x1D, 0x6D, 0xB6, 0xF8, 0xD7, 0xA5, 0xAC, 0x5A, 0xBF, 0x83, 0x16, + 0x10, 0x2B, 0x2F, 0x25, 0x2D, 0x28, 0x7F, 0xD3, 0xB4, 0xC3, 0x54, 0x1D, + 0x7E, 0x36, 0xF1, 0x00, 0x80, 0xD5, 0x50, 0xA0, 0xB7, 0x81, 0xAB, 0x6E, + 0xA9, 0xEF, 0x7F, 0xB2, 0x1E, 0xA5, 0xE4, 0x62, 0x06, 0x49, 0xB3, 0xA8, + 0x61, 0xD2, 0x6C, 0xED, 0x4B, 0xF7, 0xAD, 0xD3, 0x4C, 0x1F, 0x23, 0xB1, + 0x5B, 0x54, 0x1B, 0xA5, 0xAA, 0x5F, 0x92, 0x6D, 0x6D, 0x23, 0xB2, 0x5F, + 0x73, 0xC5, 0x1A, 0x1E, 0xD9, 0x17, 0xE5, 0x19, 0xAF, 0x30, 0x9B, 0x77, + 0x0D, 0xF5, 0xC4, 0xAF, 0xDF, 0x57, 0x72, 0x25, 0xAE, 0xA6, 0x63, 0xFD, + 0xB3, 0xAF, 0x73, 0x1B, 0x37, 0x12, 0x1F, 0x4C, 0x62, 0x93, 0xC3, 0x3B, + 0x07, 0x59, 0xEA, 0x82, 0xB5, 0x4D, 0xCF, 0x90, 0xC7, 0x36, 0x08, 0xA4, + 0xE7, 0x69, 0xE5, 0xF9, 0x6E, 0x84, 0x68, 0x6D, 0x2A, 0x00, 0x27, 0x3B, + 0x7E, 0xD4, 0x34, 0x6B, 0x1B, 0xFB, 0x0C, 0x8F, 0xF4, 0x03, 0x31, 0x39, + 0x79, 0x07, 0x53, 0x04, 0x54, 0xFA, 0x6E, 0x23, 0x0D, 0x95, 0x6D, 0xF9, + 0x7D, 0xCA, 0x1B, 0x08, 0xDE, 0xD9, 0xC0, 0xFE, 0x99, 0x76, 0x8A, 0xE4, + 0x41, 0x33, 0x6F, 0x83, 0xC1, 0x55, 0xDA, 0xE7, 0x23, 0xA4, 0x56, 0x0A, + 0xC5, 0x06, 0x1E, 0x0D, 0xB1, 0x7F, 0x5B, 0xDB, 0x9A, 0xE5, 0x39, 0x28, + 0x3B, 0x41, 0xC6, 0x22, 0xAC, 0x23, 0x09, 0x43, 0x3B, 0x16, 0xFF, 0x02, + 0xC9, 0x3D, 0xC3, 0x53, 0x0E, 0xF9, 0xDB, 0x8A, 0x3B, 0xA0, 0xF5, 0xCC, + 0x89, 0x2D, 0x59, 0xFF, 0xB1, 0x39, 0xB1, 0xB4, 0x0E, 0x9C, 0x98, 0x8F, + 0x27, 0xF7, 0x6F, 0x91, 0x8B, 0x53, 0x67, 0x8B, 0xA2, 0x5E, 0xC0, 0x17, + 0x84, 0x3C, 0x76, 0xD2, 0xB8, 0x9A, 0x10, 0x8D, 0x0B, 0xAE, 0x3E, 0xA9, + 0x51, 0x50, 0xC1, 0x94, 0x05, 0xB2, 0x8B, 0x88, 0x67, 0xFE, 0x76, 0x0F, + 0xAF, 0xD6, 0x88, 0xFD, 0x38, 0x9F, 0xF8, 0xA9, 0x27, 0xB8, 0xB3, 0x99, + 0x97, 0x1A, 0xD6, 0x82, 0x8E, 0x92, 0x8E, 0x85, 0x7B, 0x85, 0xD4, 0x94, + 0xF8, 0x4F, 0x9A, 0xF1, 0xC8, 0xE6, 0x9A, 0x1F, 0xC8, 0xA3, 0xD7, 0x87, + 0xAD, 0x0C, 0xF8, 0x34, 0x00, 0x7E, 0x30, 0xCC, 0xBE, 0x8E, 0xD9, 0x44, + 0xF3, 0xBF, 0x98, 0xCF, 0xBF, 0x0F, 0x78, 0xBA, 0x39, 0xD7, 0x20, 0x94, + 0x46, 0x4A, 0xE2, 0x8A, 0xB0, 0x22, 0x5C, 0x8E, 0x43, 0xF8, 0xC3, 0x1D, + 0x4F, 0x6B, 0x4A, 0x14, 0x26, 0x9A, 0xD3, 0x10, 0xD4, 0xD3, 0x99, 0xB6, + 0xD4, 0xC8, 0x6A, 0x8E, 0x5D, 0x45, 0x09, 0x14, 0x30, 0x28, 0xE6, 0x75, + 0xCB, 0x4C, 0x28, 0xB7, 0x27, 0x36, 0x6D, 0x4F, 0xFE, 0x25, 0xCB, 0xD5, + 0xAF, 0x0B, 0xA1, 0x61, 0x77, 0x7C, 0x64, 0x28, 0xDB, 0x74, 0x65, 0x2C, + 0xA7, 0x88, 0x3F, 0xF8, 0xA0, 0xFC, 0xD3, 0xCF, 0x99, 0x4B, 0xE8, 0xDE, + 0xB7, 0x16, 0xA2, 0x80, 0x16, 0x8F, 0xBB, 0x53, 0x27, 0x72, 0x6B, 0x53, + 0xAB, 0x80, 0xAB, 0x37, 0xE8, 0x7C, 0x16, 0x31, 0xA9, 0x81, 0xDF, 0x36, + 0xD3, 0x69, 0xD9, 0xA1, 0xA9, 0x4B, 0x8F, 0x1F, 0x85, 0x64, 0x6E, 0x4D, + 0x39, 0x79, 0x47, 0x87, 0xF3, 0x0B, 0xB9, 0xF9, 0xE1, 0xF7, 0x6E, 0x5F, + 0x29, 0x0B, 0x32, 0xEE, 0xBA, 0x79, 0x01, 0x34, 0x1F, 0x1C, 0xF0, 0x03, + 0xEE, 0x96, 0x2F, 0x76, 0x4E, 0x2E, 0x0F, 0xD1, 0x8B, 0x94, 0x61, 0x9B, + 0x33, 0x16, 0xFD, 0xA7, 0x37, 0x6F, 0x6D, 0x6C, 0x5B, 0xCA, 0xA4, 0x9F, + 0x19, 0x69, 0x4E, 0x17, 0xEC, 0x02, 0xE6, 0x49, 0xAA, 0x7E, 0x8E, 0xC0, + 0xE9, 0x15, 0x54, 0x2F, 0xA6, 0x01, 0xE9, 0x27, 0x9F, 0x2E, 0x9D, 0x85, + 0x4D, 0xFF, 0x3E, 0x78, 0x0B, 0x14, 0xAC, 0x19, 0x78, 0x30, 0xCF, 0xA0, + 0x24, 0x01, 0x7B, 0x1D, 0x82, 0x43, 0x02, 0xAC, 0xF7, 0x6C, 0x0C, 0xA9, + 0xC7, 0x74, 0xE3, 0x8E, 0x15, 0xC1, 0xF2, 0xAD, 0x9D, 0x58, 0xDA, 0x50, + 0x93, 0x69, 0x4F, 0x74, 0x5A, 0xD2, 0xB5, 0xA0, 0x06, 0x08, 0x9D, 0xC0, + 0x0F, 0x27, 0x2B, 0x19, 0x82, 0x41, 0x27, 0x32, 0x66, 0xBC, 0xAA, 0x4E, + 0x90, 0x44, 0x88, 0x33, 0x6E, 0x60, 0xBC, 0x7C, 0xDA, 0x29, 0x04, 0x94, + 0x19, 0xF7, 0xD8, 0x5E, 0x99, 0x7F, 0xEF, 0xA8, 0xBD, 0x3A, 0xE0, 0x6A, + 0xB6, 0xA8, 0x00, 0x15, 0x29, 0x04, 0xF1, 0x41, 0x3F, 0x2B, 0xF7, 0x59, + 0x3E, 0x8E, 0xAB, 0x8D, 0x84, 0x26, 0x2D, 0xC2, 0xAD, 0xA7, 0x33, 0x6C, + 0x08, 0xCA, 0xB4, 0x8A, 0xF8, 0x5E, 0xD7, 0x6A, 0x5B, 0x92, 0xCE, 0x70, + 0x23, 0x01, 0x54, 0x88, 0xDB, 0xD7, 0xF5, 0x24, 0xED, 0xA8, 0x49, 0xDB, + 0x5C, 0x4C, 0x25, 0xE1, 0xBB, 0xC7, 0x5E, 0x0D, 0x05, 0x0B, 0xD0, 0x26, + 0x4F, 0x1D, 0xE4, 0xD6, 0xEB, 0x38, 0x30, 0xC5, 0x3F, 0x50, 0xB1, 0x46, + 0x91, 0x01, 0x7A, 0xE3, 0x01, 0xD1, 0x17, 0x29, 0x4B, 0x56, 0x34, 0xAC, + 0x72, 0xA0, 0xA5, 0x0C, 0xBB, 0x69, 0x93, 0x3D, 0x39, 0xE4, 0x8A, 0x94, + 0x2C, 0xD9, 0xD0, 0x24, 0x24, 0x1C, 0x60, 0xA9, 0x79, 0xD6, 0xF2, 0x33, + 0xBD, 0xB3, 0x7A, 0x61, 0x55, 0x7F, 0x66, 0xEF, 0xC5, 0xC8, 0xE7, 0x60, + 0xFC, 0xA5, 0xAF, 0x44, 0x34, 0x7E, 0x30, 0x17, 0xC5, 0xB1, 0xC4, 0x35, + 0xC7, 0x62, 0xBF, 0xA4, 0x6C, 0xD9, 0xD2, 0x86, 0xD7, 0xD7, 0x48, 0x5C, + 0x8A, 0x67, 0x76, 0xFF, 0xBE, 0x34, 0x5B, 0x4E, 0x20, 0xD9, 0x9F, 0xB9, + 0xD4, 0x94, 0x30, 0x22, 0x6B, 0xA9, 0x01, 0xBC, 0x7B, 0xEF, 0x35, 0xBD, + 0x7D, 0x18, 0x68, 0x5B, 0x1D, 0x4A, 0xF5, 0x11, 0x57, 0x1D, 0xE3, 0x66, + 0x8C, 0xA8, 0x40, 0xD9, 0xFA, 0x55, 0xB8, 0x83, 0xE9, 0x2C, 0xDE, 0x0E, + 0xBA, 0xE2, 0x16, 0xEF, 0xA6, 0xE3, 0x5E, 0xA6, 0xD9, 0x1F, 0x17, 0x97, + 0xCE, 0x78, 0xAC, 0x8A, 0xA0, 0x5C, 0x51, 0x2D, 0xF4, 0xDE, 0xCE, 0x14, + 0x57, 0xA0, 0x3A, 0x36, 0x0C, 0xAB, 0xF9, 0xEB, 0xC0, 0x91, 0x57, 0xED, + 0x21, 0x3D, 0x39, 0x87, 0x61, 0x93, 0x8E, 0x3E, 0x55, 0x3A, 0x7A, 0x2F, + 0x1B, 0xA1, 0x00, 0x89, 0xB5, 0xF7, 0x1C, 0xE0, 0x08, 0x74, 0x00, 0xD8, + 0x9B, 0x4A, 0x74, 0x37, 0xE6, 0x24, 0xDB, 0x7B, 0xAE, 0xA9, 0xF8, 0x92, + 0x35, 0x44, 0x3A, 0x0B, 0xDB, 0xB7, 0xED, 0x65, 0xAA, 0x5F, 0x7F, 0xE3, + 0x35, 0xD5, 0x2D, 0x24, 0x74, 0x53, 0xA6, 0x1D, 0x55, 0x60, 0x1F, 0xB6, + 0x22, 0x9C, 0x14, 0xBA, 0x63, 0x52, 0x7F, 0x88, 0xF9, 0x90, 0xBC, 0xE9, + 0xDB, 0x80, 0xB5, 0x00, 0x2B, 0x12, 0x50, 0xE4, 0x10, 0xC9, 0xBB, 0x18, + 0x76, 0x06, 0x8A, 0x93, 0xD3, 0x0B, 0xE4, 0xCB, 0x2E, 0x5C, 0xA3, 0x42, + 0xC5, 0xFF, 0xCF, 0x9D, 0x53, 0xD1, 0x6B, 0xE7, 0x10, 0x7D, 0x9F, 0x3C, + 0xC3, 0xF9, 0xB1, 0x5B, 0x8A, 0x15, 0x56, 0x63, 0xD5, 0x27, 0x40, 0x1E, + 0x01, 0x1A, 0xDC, 0x0C, 0x6B, 0x7D, 0x42, 0x91, 0xDD, 0x63, 0x9D, 0x1A, + 0xA9, 0xA8, 0xB0, 0xC5, 0xE4, 0x4A, 0x79, 0x4B, 0x04, 0x29, 0xDF, 0x22, + 0x59, 0xC1, 0xF3, 0xAB, 0x09, 0x00, 0x51, 0xEE, 0x3A, 0x96, 0xE1, 0x7B, + 0xDB, 0xC2, 0x36, 0x41, 0x60, 0xB1, 0x84, 0x74, 0x76, 0xB4, 0xA0, 0xD2, + 0x2F, 0x95, 0x5A, 0x89, 0x42, 0xB7, 0x57, 0xCD, 0xFB, 0x3E, 0x5B, 0x33, + 0xDC, 0x0A, 0x62, 0x18, 0x0F, 0x98, 0x71, 0x9B, 0xE6, 0x74, 0x19, 0x39, + 0xF6, 0xFF, 0x69, 0x4B, 0x5C, 0x24, 0x18, 0xF9, 0x3A, 0xD5, 0x70, 0x1F, + 0x7B, 0x5D, 0xAC, 0x01, 0xE9, 0xFE, 0xC2, 0x9E, 0xB5, 0x28, 0xB2, 0xFF, + 0x5A, 0xCB, 0xA2, 0x1A, 0xF2, 0xEA, 0x7D, 0xA0, 0x7A, 0xCC, 0x89, 0xEB, + 0x0A, 0x1C, 0x81, 0x2B, 0x8F, 0xF3, 0x2D, 0xF5, 0x67, 0x58, 0xF9, 0x10, + 0x3A, 0x8F, 0x9E, 0x0A, 0x04, 0xAD, 0x7F, 0xB2, 0x2D, 0xCB, 0xCC, 0x3D, + 0x84, 0x38, 0x46, 0x1B, 0x9A, 0xE1, 0xAA, 0xB2, 0x7E, 0xA7, 0xF3, 0x5E, + 0x43, 0x7B, 0x67, 0x7F, 0xC8, 0x0F, 0x45, 0xC0, 0xB8, 0xEE, 0xE6, 0x68, + 0x16, 0x1E, 0xBF, 0x14, 0xA5, 0xD1, 0xDA, 0x12, 0x7F, 0x42, 0x3B, 0x18, + 0xD3, 0x85, 0x8A, 0xEB, 0x2A, 0x47, 0xCF, 0xEB, 0x85, 0xFB, 0xA5, 0x10, + 0x98, 0x4C, 0x56, 0x4B, 0x63, 0x8A, 0x86, 0xD9, 0x98, 0x36, 0xB5, 0x2B, + 0x4A, 0xA1, 0xC9, 0x2B, 0x7F, 0xF9, 0xC9, 0x29, 0x9C, 0x90, 0xFE, 0x58, + 0x2B, 0x85, 0xD8, 0x01, 0x93, 0x0E, 0x2A, 0x5B, 0x0E, 0xCA, 0xD6, 0xB6, + 0x8F, 0xE1, 0x49, 0x9C, 0x49, 0xEE, 0x83, 0xAD, 0x28, 0x33, 0x94, 0xFB, + 0xA9, 0x2B, 0x47, 0x35, 0xCF, 0xBD, 0x1F, 0x06, 0xFB, 0x9E, 0x70, 0xA4, + 0xEC, 0x26, 0x79, 0x36, 0x3F, 0x67, 0xCF, 0x71, 0x61, 0x00, 0x35, 0xD8, + 0xB2, 0x3B, 0x03, 0x02, 0xD7, 0x80, 0x69, 0xE3, 0x22, 0x5F, 0x57, 0xD6, + 0x0A, 0x12, 0x77, 0xBB, 0x51, 0x93, 0xAC, 0xBF, 0x8A, 0xDC, 0x88, 0x48, + 0x77, 0x5F, 0xD9, 0x40, 0x01, 0x93, 0x83, 0xAD, 0x71, 0x32, 0xFA, 0xF8, + 0xF7, 0x1D, 0x81, 0xE2, 0x6B, 0xB9, 0x39, 0xE3, 0xB7, 0x4C, 0x22, 0xEA, + 0x38, 0x1B, 0xF5, 0x03, 0x9D, 0xBC, 0x5A, 0x81, 0xA5, 0x87, 0xB8, 0x8D, + 0x91, 0x59, 0xA8, 0xBE, 0xB0, 0x47, 0x68, 0x14, 0x70, 0xC2, 0xE0, 0x65, + 0xBA, 0x4B, 0xF4, 0x18, 0x7E, 0xDD, 0xDD, 0x6B, 0xE2, 0xE1, 0x95, 0x14, + 0xA0, 0x3E, 0x26, 0xA5, 0x43, 0x54, 0x51, 0xFE, 0x26, 0x24, 0x90, 0xA3, + 0x32, 0xB3, 0xE6, 0xB4, 0x8D, 0xF0, 0x7A, 0x77, 0x76, 0x2E, 0xE1, 0x0B, + 0x32, 0x44, 0x7B, 0x5F, 0x6B, 0x3F, 0x3C, 0x1E, 0x03, 0x0C, 0x49, 0x6E, + 0x22, 0x5B, 0x18, 0x5F, 0x49, 0x72, 0xDA, 0x3E, 0xB4, 0xB8, 0xA4, 0xE4, + 0xB9, 0xED, 0xAA, 0xC6, 0xAB, 0xB1, 0x69, 0x80, 0x55, 0xCD, 0x9C, 0xDF, + 0x03, 0xC1, 0x24, 0xEC, 0xA7, 0xA1, 0x8C, 0x15, 0x6C, 0x1B, 0x3B, 0xBA, + 0xA5, 0xCF, 0xDF, 0x7B, 0x38, 0x81, 0xDF, 0x40, 0xF1, 0xA4, 0x03, 0x7B, + 0x57, 0xAD, 0x75, 0x96, 0xE9, 0xC2, 0xEE, 0x76, 0x90, 0x81, 0x3E, 0xE8, + 0xD3, 0x23, 0x9B, 0x96, 0x3E, 0xF6, 0xF8, 0xFE, 0xC5, 0x52, 0xA3, 0xBB, + 0x68, 0x98, 0xFF, 0x92, 0xE7, 0xED, 0xC1, 0xDD, 0xF8, 0x6C, 0xC5, 0xBC, + 0xC4, 0x6A, 0x50, 0x53, 0x95, 0x28, 0x1D, 0x8D, 0x84, 0x90, 0xEE, 0xB0, + 0x27, 0x4C, 0xE9, 0x7C, 0x2E, 0x46, 0x94, 0xF5, 0xE3, 0xBB, 0xEB, 0x9F, + 0x6E, 0xD1, 0x6B, 0x6F, 0x83, 0xCB, 0x2A, 0x5A, 0x22, 0xAC, 0x67, 0xE4, + 0x5C, 0xF9, 0x57, 0x20, 0x42, 0xA7, 0xA6, 0x89, 0x22, 0x08, 0x68, 0x92, + 0x64, 0x1B, 0x4B, 0x82, 0xD3, 0x62, 0xE6, 0x80, 0xAC, 0x84, 0x36, 0x19, + 0x24, 0x55, 0x02, 0x4C, 0x79, 0x32, 0xAD, 0x22, 0xF4, 0xE0, 0x46, 0x7B, + 0x8B, 0x96, 0x9A, 0xEC, 0xC7, 0x67, 0xA1, 0x21, 0x8F, 0x5C, 0x48, 0xFC, + 0x52, 0xC7, 0x33, 0xA8, 0x22, 0xA0, 0x3D, 0x72, 0x44, 0x7E, 0xEB, 0x8F, + 0x19, 0xBE, 0x54, 0x98, 0x96, 0x91, 0xA2, 0xCA, 0x72, 0xA6, 0xAE, 0x5E, + 0xA8, 0xA6, 0xC9, 0x14, 0xB3, 0x09, 0xA4, 0x2B, 0x3B, 0xF8, 0x13, 0x13, + 0x1D, 0x51, 0xDC, 0x93, 0x37, 0x1B, 0xFC, 0x18, 0xF9, 0xA4, 0xFA, 0x57, + 0x3E, 0x8D, 0xF7, 0xF0, 0xD8, 0xBF, 0x8D, 0x83, 0x3F, 0x9B, 0x5A, 0x73, + 0x63, 0x82, 0x56, 0x94, 0x2E, 0x02, 0x62, 0x61, 0x01, 0x3C, 0x20, 0x86, + 0x44, 0xCA, 0xF8, 0xB7, 0x2D, 0xDA, 0x99, 0x25, 0xD7, 0x16, 0xE1, 0xEB, + 0x71, 0xEB, 0x16, 0xBC, 0xEB, 0x2F, 0x93, 0x6D, 0x9F, 0xD2, 0xD0, 0xE8, + 0xD4, 0xDD, 0x70, 0x8A, 0x2E, 0x82, 0xF6, 0x23, 0xF3, 0x11, 0x53, 0xC5, + 0xE3, 0x87, 0x06, 0xF9, 0xE6, 0x0A, 0xEE, 0xBA, 0x7B, 0x2C, 0x03, 0xBB, + 0x59, 0x60, 0x1E, 0xD2, 0x55, 0x43, 0xE6, 0xC1, 0x0C, 0x9E, 0x8A, 0x3A, + 0x69, 0xEB, 0x0F, 0x9E, 0x34, 0x3D, 0x48, 0x5D, 0xB4, 0xC1, 0xC0, 0xEF, + 0x50, 0x0E, 0xC6, 0x4A, 0xFB, 0xAC, 0x5F, 0x05, 0x03, 0x39, 0xDE, 0x3C, + 0x09, 0xF4, 0x29, 0xC9, 0x62, 0x90, 0xFB, 0x0F, 0x78, 0x66, 0x31, 0x06, + 0x2D, 0xE4, 0x1D, 0x4A, 0x80, 0xF0, 0x9E, 0x33, 0xBE, 0x89, 0x35, 0x8F, + 0x5D, 0xC0, 0x86, 0x0B, 0xCF, 0x4B, 0xE0, 0xF8, 0xEF, 0x43, 0x69, 0x3D, + 0x0D, 0xF7, 0x74, 0xC0, 0x42, 0x3A, 0x87, 0x44, 0x1D, 0xE4, 0x15, 0x82, + 0x54, 0x13, 0xCB, 0x05, 0xFD, 0x1D, 0xE1, 0x34, 0x97, 0x91, 0xFB, 0x4B, + 0x9F, 0xB8, 0x42, 0xAC, 0x9C, 0x97, 0x01, 0x26, 0x38, 0x76, 0xC5, 0x94, + 0xCF, 0xA0, 0xA3, 0x18, 0x1D, 0x4C, 0x10, 0x63, 0xEE, 0x20, 0x6A, 0xAD, + 0xFD, 0x85, 0xCF, 0x00, 0x9E, 0x3D, 0x63, 0xE9, 0x7F, 0x73, 0x30, 0x65, + 0x39, 0xF4, 0x5C, 0x25, 0xE5, 0x64, 0x80, 0xE3, 0x42, 0x04, 0xCE, 0x25, + 0xCB, 0x4B, 0x7C, 0x47, 0x09, 0x76, 0x1B, 0x92, 0xFA, 0x1E, 0x50, 0x66, + 0x87, 0x24, 0x9B, 0x12, 0x77, 0x9B, 0xC0, 0x6E, 0x26, 0xC8, 0x29, 0x11, + 0x29, 0x6E, 0xEC, 0x13, 0x83, 0x7B, 0xD4, 0x73, 0xDE, 0x86, 0x00, 0x08, + 0xD0, 0xD5, 0xA1, 0xD0, 0xCB, 0xBF, 0x05, 0x1C, 0xBC, 0xBD, 0x6F, 0x65, + 0x69, 0x45, 0x22, 0xFF, 0xBD, 0x0F, 0x02, 0xC0, 0xFC, 0x9B, 0x68, 0x4A, + 0xC0, 0x60, 0xA4, 0x9E, 0x40, 0x50, 0xC5, 0xD2, 0x76, 0x08, 0x7E, 0x58, + 0xB7, 0xE2, 0x4F, 0xA2, 0xCB, 0x0B, 0xA2, 0x56, 0x10, 0xAF, 0x40, 0xA9, + 0xF1, 0x89, 0x77, 0xD6, 0xE8, 0xD5, 0x07, 0x9A, 0x77, 0x4D, 0x44, 0xFE, + 0x18, 0x71, 0xCC, 0x4D, 0x1A, 0x20, 0x5C, 0x1B, 0x44, 0x7B, 0x1E, 0xB4, + 0x25, 0x2C, 0xDF, 0xE5, 0x47, 0xD4, 0xA0, 0xC7, 0xB1, 0x2E, 0xDA, 0xFA, + 0xB1, 0x76, 0xBB, 0xFD, 0xA0, 0x02, 0xEB, 0x4D, 0x04, 0x00, 0xCA, 0xAF, + 0x45, 0x83, 0x58, 0xC6, 0x52, 0x71, 0x5A, 0x3D, 0x3C, 0xF7, 0xF2, 0x29, + 0xA6, 0xA2, 0xA4, 0xF3, 0xC0, 0x30, 0xE0, 0x61, 0xB2, 0x55, 0x78, 0x2C, + 0x57, 0x84, 0xB4, 0x33, 0xB3, 0xF8, 0xD9, 0x57, 0x81, 0x37, 0xA7, 0xC1, + 0x14, 0x3F, 0x1C, 0x9B, 0x0B, 0x44, 0x99, 0xDB, 0x7C, 0x0E, 0x87, 0xF2, + 0xAC, 0xA6, 0x71, 0xFD, 0xC9, 0x29, 0x2E, 0x3C, 0x67, 0x2C, 0x7F, 0xB2, + 0xF7, 0xCB, 0x07, 0x82, 0x54, 0xC8, 0x92, 0x1A, 0x94, 0xEB, 0x46, 0x96, + 0x7D, 0xBB, 0x08, 0x70, 0x8C, 0x8E, 0x5F, 0x7F, 0x2F, 0xAF, 0xAA, 0xF3, + 0x6A, 0x2B, 0xA9, 0xF8, 0xDC, 0x92, 0x20, 0x9F, 0xC5, 0xFC, 0x18, 0xED, + 0x03, 0x85, 0xB1, 0x86, 0xF2, 0x74, 0x93, 0x81, 0x5D, 0x07, 0x48, 0xE4, + 0xED, 0xDC, 0x67, 0x4F, 0x12, 0xA0, 0x3B, 0x2A, 0x85, 0x4C, 0x04, 0xC7, + 0xFA, 0x87, 0xC1, 0x25, 0x20, 0x96, 0x17, 0x5D, 0x89, 0xC4, 0x0E, 0x36, + 0x9B, 0xA6, 0x92, 0x70, 0xFC, 0xF5, 0x1A, 0x5C, 0xAD, 0xED, 0xD8, 0xFD, + 0xDD, 0x67, 0xC6, 0x3A, 0xF0, 0x5B, 0x16, 0xDF, 0x4E, 0x3F, 0xBF, 0xF9, + 0x47, 0x9F, 0x01, 0x47, 0x73, 0xE1, 0x5A, 0x38, 0x7E, 0xC0, 0xA9, 0x18, + 0x70, 0x00, 0x88, 0xFF, 0x21, 0x2B, 0x12, 0xF4, 0xC5, 0x4E, 0xC6, 0x80, + 0x7D, 0xC4, 0x11, 0xB9, 0xC3, 0xF9, 0x5C, 0x69, 0x2A, 0x60, 0x6F, 0xE0, + 0xC6, 0x79, 0x3D, 0x15, 0xC2, 0xE7, 0x23, 0xDA, 0xFB, 0x9B, 0xAB, 0x13, + 0x1D, 0x6D, 0xBD, 0xC2, 0x6F, 0x3D, 0xF7, 0x44, 0xBD, 0x51, 0xF8, 0xA6, + 0xD1, 0x47, 0x7D, 0x8C, 0xA8, 0x52, 0x56, 0xF7, 0x01, 0x04, 0xD5, 0x22, + 0xE8, 0x16, 0x21, 0x61, 0x27, 0xC8, 0xE2, 0xF9, 0xA1, 0x55, 0x44, 0x5F, + 0x8F, 0xC3, 0x22, 0x22, 0x3A, 0xCA, 0x2B, 0x05, 0x31, 0xCF, 0x88, 0x8E, + 0x3B, 0xB0, 0x99, 0x1C, 0xAA, 0x96, 0xF9, 0xDB, 0x41, 0x91, 0x64, 0x0E, + 0xE1, 0xF1, 0xE0, 0xB0, 0x50, 0x62, 0x5D, 0x6B, 0x36, 0xA7, 0x59, 0xD9, + 0x2B, 0x77, 0x36, 0xA2, 0x18, 0xF4, 0x67, 0x74, 0xB8, 0x09, 0x88, 0x91, + 0x38, 0x9A, 0x01, 0x7D, 0xDE, 0xDF, 0xC3, 0xBB, 0x08, 0x59, 0xE9, 0xAD, + 0xA0, 0xEE, 0xC0, 0x4B, 0xC2, 0xBC, 0xB0, 0xAB, 0x4C, 0x32, 0xCB, 0x92, + 0xC9, 0x97, 0x0D, 0xCF, 0x43, 0x83, 0x9D, 0xED, 0x40, 0x98, 0x8E, 0x1B, + 0x2D, 0x67, 0x68, 0x7C, 0x68, 0x8A, 0x38, 0x71, 0xC8, 0xCB, 0x81, 0x32, + 0x95, 0x86, 0x9E, 0x77, 0x5F, 0x9E, 0x85, 0xEE, 0x63, 0xC6, 0x41, 0x49, + 0xD2, 0x98, 0xB0, 0x52, 0x41, 0xDE, 0x59, 0x54, 0x41, 0x64, 0x6F, 0xE5, + 0x1E, 0x73, 0x15, 0xA6, 0x21, 0x51, 0x4A, 0x66, 0xAC, 0xB3, 0x0B, 0x69, + 0x4C, 0xA3, 0xE5, 0xFA, 0xE5, 0xE3, 0xA9, 0xF5, 0x9A, 0x3A, 0x54, 0x04, + 0x82, 0x89, 0xF0, 0x33, 0x8F, 0x5C, 0x0E, 0x1E, 0x80, 0x17, 0x8A, 0x0E, + 0x2F, 0xF8, 0x2D, 0xF3, 0x84, 0xDE, 0xA7, 0x76, 0x1F, 0x4A, 0x39, 0xCA, + 0x6C, 0x8E, 0xA6, 0x27, 0x4B, 0x8C, 0xC8, 0xE3, 0xFF, 0x60, 0xD9, 0xE0, + 0xC2, 0x90, 0xD7, 0x8E, 0x28, 0xA4, 0xD4, 0xC9, 0xA9, 0x05, 0x27, 0xD1, + 0x7D, 0x0C, 0xEA, 0x9F, 0x4B, 0x45, 0xC5, 0x34, 0xDA, 0xE4, 0xAC, 0x51, + 0x23, 0xCC, 0xB0, 0x76, 0x41, 0x91, 0x92, 0x6B, 0x7E, 0x19, 0xDD, 0x7C, + 0x8D, 0x3D, 0xB9, 0xA1, 0xB3, 0x77, 0xEB, 0xD5, 0x62, 0xAF, 0x45, 0x9C, + 0xBD, 0x3B, 0xD4, 0x84, 0xAE, 0xA7, 0x8D, 0x3E, 0x47, 0xE1, 0xFB, 0x6C, + 0xD5, 0x27, 0xC6, 0x39, 0x1F, 0x74, 0x5C, 0x4D, 0x95, 0xE4, 0x7A, 0x79, + 0xA9, 0x9D, 0x29, 0x02, 0xC0, 0xC8, 0xA1, 0x33, 0xB8, 0xDF, 0x2A, 0x2E, + 0xDC, 0x6F, 0x99, 0x9C, 0x49, 0xA3, 0x4C, 0x2A, 0x2A, 0xFA, 0x4B, 0x56, + 0xE8, 0x84, 0x21, 0xBE, 0x6A, 0xDA, 0x6B, 0x71, 0x98, 0x20, 0x52, 0x32, + 0xF3, 0xA9, 0xFA, 0x36, 0xC1, 0x42, 0x58, 0x3B, 0xDD, 0x5F, 0x05, 0x73, + 0x5F, 0x3A, 0xEB, 0xC9, 0x7A, 0x8A, 0x84, 0xC1, 0xDE, 0x50, 0x67, 0x1C, + 0x7B, 0x98, 0xCE, 0xD9, 0x9C, 0x12, 0x81, 0x99, 0xA5, 0x6B, 0x27, 0x8E, + 0x32, 0x43, 0x12, 0xC9, 0xE1, 0x7A, 0x9A, 0x4D, 0xF6, 0x36, 0xAE, 0xF8, + 0x99, 0x4A, 0xC2, 0x90, 0x77, 0x79, 0xEF, 0x10, 0x1A, 0x4D, 0xD6, 0x71, + 0x6F, 0xFB, 0xB8, 0x83, 0x4E, 0x3F, 0xF3, 0xF9, 0xE5, 0xEB, 0xEB, 0xF9, + 0x6E, 0x1C, 0x89, 0x47, 0x52, 0xED, 0x3F, 0x4D, 0xEF, 0x26, 0xA7, 0x3C, + 0x4B, 0x46, 0x9A, 0x32, 0x1E, 0x80, 0x70, 0xBC, 0x5C, 0xF2, 0x80, 0x6E, + 0x62, 0x7C, 0xAE, 0x80, 0xBB, 0x81, 0x82, 0x27, 0xCD, 0xA0, 0x86, 0x34, + 0xD0, 0x80, 0x1E, 0x42, 0xFE, 0x1B, 0xA4, 0x42, 0xC0, 0x67, 0x4D, 0xBB, + 0xFC, 0x08, 0x20, 0x03, 0x6D, 0x62, 0x2F, 0xF2, 0x0C, 0x57, 0x77, 0x6A, + 0xC1, 0x51, 0x66, 0x74, 0x8D, 0x94, 0xE1, 0xF9, 0xF6, 0xC5, 0x78, 0xCD, + 0xCC, 0x68, 0xC6, 0x59, 0x2E, 0x3C, 0x94, 0x49, 0x76, 0x74, 0xD8, 0x67, + 0x41, 0xF6, 0x30, 0xF2, 0x83, 0xF1, 0xA8, 0x31, 0x7B, 0x86, 0x65, 0xED, + 0x5F, 0xD3, 0xF3, 0x9A, 0xF3, 0x7C, 0x57, 0x13, 0x57, 0x2C, 0x00, 0x49, + 0xB6, 0x96, 0xB5, 0x0B, 0x13, 0xE6, 0x2B, 0x17, 0xFA, 0x66, 0xFF, 0x40, + 0xF9, 0x55, 0xF3, 0x61, 0xB2, 0x85, 0xA6, 0xA7, 0xC3, 0x95, 0xFC, 0x69, + 0x48, 0x16, 0x8E, 0x61, 0x84, 0x61, 0xCB, 0xF5, 0x5C, 0x51, 0x8E, 0x22, + 0xC1, 0x26, 0x3F, 0x65, 0x59, 0xD2, 0x05, 0x23, 0xAB, 0xFB, 0x18, 0x09, + 0xFF, 0x91, 0x15, 0x21, 0x3E, 0xFD, 0xA3, 0x74, 0x33, 0xB4, 0x32, 0x49, + 0xA9, 0x3D, 0x73, 0x46, 0xA6, 0xF2, 0x20, 0x4F, 0x93, 0xD8, 0x83, 0xC0, + 0xA1, 0x90, 0x28, 0xBD, 0x58, 0x94, 0x53, 0x5A, 0xF1, 0x1F, 0xC7, 0x74, + 0x9E, 0x6A, 0x6A, 0xD3, 0x11, 0x7A, 0x02, 0x06, 0x1F, 0x9C, 0x84, 0x43, + 0xAE, 0xE0, 0x92, 0x36, 0xD1, 0x93, 0x81, 0x26, 0xDC, 0x31, 0x6C, 0x0A, + 0xD7, 0x5B, 0x39, 0xF2, 0x8B, 0xD3, 0xAF, 0xD9, 0x9D, 0xB2, 0xBB, 0x2B, + 0xFC, 0x0D, 0x0B, 0x7A, 0x71, 0xEA, 0x5E, 0xC9, 0xC5, 0x78, 0xDF, 0xB4, + 0x66, 0xAA, 0xB8, 0x49, 0x3E, 0x3C, 0x9D, 0x69, 0xA1, 0xC2, 0xED, 0x24, + 0xCE, 0xCB, 0x1D, 0x66, 0x05, 0x6B, 0xAF, 0x38, 0x0E, 0xE2, 0x52, 0x26, + 0x36, 0x9A, 0x78, 0xCC, 0xB1, 0xF5, 0x67, 0xC9, 0xA0, 0x4C, 0x47, 0x82, + 0xC0, 0x94, 0xD5, 0x57, 0x63, 0xD5, 0xA6, 0x7E, 0x7A, 0x68, 0xCA, 0x62, + 0xA1, 0x5D, 0xD5, 0x21, 0x7D, 0x84, 0x1E, 0xA1, 0xB5, 0x3A, 0xE3, 0xD4, + 0x06, 0x9B, 0xEC, 0xED, 0x19, 0xE3, 0xD3, 0xCA, 0x90, 0x8C, 0xB7, 0x6E, + 0xDC, 0x1B, 0x58, 0xED, 0x3B, 0x1B, 0x55, 0xE9, 0xAA, 0xED, 0xB9, 0x36, + 0x74, 0x46, 0x24, 0xA8, 0x30, 0x32, 0xE9, 0x1C, 0x56, 0xFE, 0x80, 0xF6, + 0x62, 0x44, 0x99, 0x22, 0x8C, 0xEB, 0x33, 0x8D, 0x6F, 0xB2, 0xF9, 0xAA, + 0x4D, 0x85, 0x64, 0x9F, 0xCE, 0x9A, 0x02, 0x98, 0x30, 0x94, 0x5F, 0x95, + 0xD4, 0xD9, 0xDE, 0xC1, 0x3B, 0xC2, 0x74, 0x84, 0xE4, 0x0C, 0x3F, 0xB6, + 0xFC, 0x5E, 0xCA, 0x22, 0xFE, 0xED, 0xAC, 0x59, 0x08, 0xCD, 0x90, 0x5A, + 0xCB, 0x12, 0x8E, 0xE4, 0xD6, 0x87, 0x3B, 0x75, 0xB8, 0xB8, 0x8F, 0xFC, + 0x20, 0x5F, 0x1B, 0x90, 0xCF, 0x60, 0xF3, 0xF2, 0xBE, 0x86, 0xF4, 0x47, + 0x50, 0x13, 0xCE, 0xF7, 0xBD, 0x1B, 0x51, 0xE5, 0x75, 0x2A, 0xDB, 0x27, + 0xA4, 0x30, 0xF4, 0xE5, 0x75, 0xC2, 0x2F, 0x65, 0xC8, 0xAF, 0x65, 0xFE, + 0x83, 0x82, 0x1D, 0x3B, 0xA6, 0xA3, 0x62, 0xE7, 0x76, 0xD1, 0x03, 0x82, + 0x60, 0xB6, 0x50, 0xE5, 0xE0, 0xF1, 0xB6, 0x1F, 0x1C, 0xFE, 0x03, 0x5F, + 0x33, 0x13, 0xFA, 0x01, 0xF4, 0x56, 0x45, 0xB1, 0xD9, 0x58, 0x8D, 0xC4, + 0xE4, 0xAE, 0x68, 0xD1, 0x5D, 0xA0, 0x47, 0x4B, 0x3B, 0xCF, 0x60, 0x94, + 0xBE, 0x8B, 0xFC, 0xC8, 0x8E, 0x2A, 0x1C, 0xDF, 0x09, 0x10, 0x26, 0x92, + 0x30, 0x9D, 0x15, 0x67, 0x35, 0xD1, 0xD9, 0xAD, 0x09, 0x50, 0x02, 0xA9, + 0xC7, 0xD5, 0xCA, 0x8E, 0x88, 0xD7, 0x17, 0x50, 0x0B, 0x76, 0xA4, 0x21, + 0xCD, 0xE2, 0x6C, 0xBA, 0x36, 0x39, 0x6D, 0xB4, 0xD0, 0xFA, 0x8A, 0x67, + 0x68, 0x3D, 0xF1, 0x8D, 0x3A, 0xB7, 0x61, 0x06, 0x2A, 0x9D, 0x3B, 0xB0, + 0x9B, 0xD1, 0xA1, 0x0A, 0x5A, 0xBD, 0x45, 0xD9, 0x06, 0x17, 0xFD, 0x24, + 0x63, 0x7E, 0x21, 0x76, 0x85, 0x9B, 0x56, 0x4E, 0x5A, 0xDA, 0x98, 0x2C, + 0x63, 0x4C, 0x01, 0xC3, 0x1E, 0xE9, 0xA7, 0xEB, 0xB8, 0x8E, 0xE2, 0x2B, + 0xB4, 0xFF, 0x6B, 0x09, 0x61, 0xFB, 0xE9, 0xCC, 0xDA, 0xE9, 0xEC, 0xA5, + 0xFF, 0x43, 0x68, 0x7E, 0xFE, 0x4D, 0x69, 0x49, 0xF7, 0xF2, 0x99, 0xBD, + 0x56, 0x18, 0xB6, 0x79, 0x98, 0x40, 0x6D, 0xC1, 0x60, 0xF8, 0x09, 0x14, + 0x4C, 0xBD, 0xD3, 0xB8, 0xF3, 0x0A, 0x7C, 0xF2, 0x98, 0x58, 0x61, 0xA6, + 0x30, 0x95, 0xEA, 0xB8, 0x91, 0xF2, 0xD0, 0x30, 0x68, 0x62, 0x25, 0xEF, + 0xFC, 0x4F, 0xC3, 0x5A, 0x40, 0x3C, 0xC9, 0xCE, 0xD9, 0x31, 0xA4, 0xBB, + 0x27, 0x59, 0xAA, 0x30, 0xD8, 0x71, 0xD2, 0x95, 0xDC, 0x76, 0x57, 0xCE, + 0x35, 0x1B, 0x51, 0x04, 0x7F, 0x42, 0x3C, 0xF5, 0x3A, 0xC8, 0xE7, 0x15, + 0x36, 0x8E, 0x69, 0x1F, 0x5E, 0x08, 0x40, 0x0E, 0x63, 0x12, 0x92, 0x1E, + 0x78, 0xF4, 0x49, 0xD0, 0x0A, 0x90, 0xBE, 0x41, 0x3B, 0xBC, 0x8B, 0x50, + 0x89, 0xFC, 0x88, 0x6C, 0x3C, 0x00, 0xFC, 0xC0, 0x3A, 0x52, 0x59, 0x42, + 0xA9, 0xC4, 0x35, 0x71, 0x7E, 0x5D, 0x73, 0x53, 0x28, 0xD7, 0xA4, 0x58, + 0x09, 0x52, 0x0F, 0xF1, 0xD5, 0xCB, 0xD6, 0x3C, 0x6C, 0x5E, 0xF6, 0xF3, + 0x0F, 0xE6, 0x07, 0xF0, 0x25, 0xB0, 0x76, 0x5A, 0xF0, 0x53, 0x70, 0xFB, + 0xF3, 0x3A, 0xDE, 0x52, 0x97, 0x4C, 0x1F, 0x34, 0x7B, 0xEE, 0xD9, 0x4C, + 0xFF, 0xAD, 0x53, 0xC6, 0xBA, 0x74, 0x82, 0x21, 0x81, 0x2E, 0x00, 0x19, + 0x32, 0xAA, 0x3E, 0x52, 0x0E, 0x53, 0x40, 0x1A, 0x63, 0xC4, 0x74, 0xF5, + 0xA2, 0x33, 0x2D, 0xAB, 0x3F, 0xE4, 0x56, 0xFE, 0x1D, 0x91, 0xF3, 0x8F, + 0x46, 0x21, 0x10, 0x1D, 0x38, 0x3D, 0x71, 0x85, 0x6C, 0xD3, 0x44, 0xDA, + 0x3D, 0x7C, 0x69, 0xEB, 0x92, 0xDF, 0xE1, 0x6C, 0x82, 0x88, 0xF5, 0x15, + 0x2D, 0xB2, 0x0F, 0x2D, 0xBF, 0x56, 0x6E, 0x8A, 0xC8, 0x87, 0x20, 0xA2, + 0xA7, 0xBC, 0xFF, 0x2A, 0x4A, 0x1F, 0x2C, 0x5B, 0x0A, 0x84, 0x41, 0x82, + 0xDE, 0xE2, 0x64, 0x0B, 0x42, 0xA6, 0x76, 0x44, 0x93, 0xDC, 0xD6, 0xDF, + 0x26, 0x95, 0x89, 0xEF, 0x76, 0x74, 0x34, 0x93, 0x45, 0x49, 0xB1, 0xB4, + 0x0B, 0x2F, 0xF6, 0x6F, 0xE0, 0xC9, 0x99, 0x47, 0xB1, 0x76, 0x1A, 0xBD, + 0x7E, 0xCD, 0x04, 0x7E, 0xBA, 0x50, 0xA6, 0xB7, 0xC8, 0x31, 0x2C, 0x16, + 0x0E, 0xB9, 0x8A, 0x96, 0xC4, 0x45, 0xB4, 0x06, 0xCE, 0xFF, 0x73, 0x80, + 0xED, 0x24, 0xD0, 0x9E, 0xA9, 0x24, 0x1B, 0x79, 0x25, 0xA9, 0x3D, 0x86, + 0x19, 0x68, 0xBF, 0x31, 0x83, 0x3C, 0x12, 0xB0, 0x5B, 0x23, 0x3B, 0x07, + 0x23, 0x81, 0xAF, 0xDD, 0x62, 0xE8, 0x55, 0x2D, 0x36, 0xA5, 0x16, 0xB1, + 0xA4, 0xFB, 0x20, 0x1A, 0x10, 0x3A, 0x0E, 0x7E, 0x97, 0xFC, 0x29, 0x06, + 0x78, 0xC1, 0x63, 0xB3, 0x6F, 0x64, 0xBE, 0x70, 0x8B, 0x43, 0x70, 0xEB, + 0xEB, 0xE9, 0xEF, 0x7C, 0xC3, 0x59, 0x1B, 0xCC, 0xAB, 0x5B, 0xE0, 0xBF, + 0xF4, 0xC6, 0xD4, 0xE5, 0x07, 0xCF, 0xAB, 0x5E, 0xE8, 0x2F, 0x68, 0xD9, + 0xF6, 0x3A, 0x36, 0x08, 0xE3, 0xF6, 0xAE, 0x7B, 0xC5, 0x7A, 0xF1, 0x16, + 0xC8, 0x46, 0x59, 0xEA, 0xD9, 0xAD, 0x65, 0x74, 0xE7, 0x63, 0xA8, 0xF4, + 0x5E, 0x01, 0x91, 0xE7, 0xEB, 0xA2, 0x0B, 0x92, 0x3C, 0x28, 0x50, 0x9A, + 0x54, 0x76, 0x4A, 0xEC, 0x38, 0x0E, 0x52, 0x02, 0xF4, 0xC8, 0x82, 0xC5, + 0x7D, 0x2D, 0x39, 0x6B, 0x30, 0xB3, 0x68, 0x87, 0x7B, 0x0A, 0x5C, 0x14, + 0xDF, 0x5D, 0xF9, 0xF8, 0x7E, 0x81, 0x6D, 0x76, 0x27, 0x78, 0x33, 0xBC, + 0x9B, 0x9E, 0xEE, 0xDD, 0xFB, 0x24, 0x1B, 0xBD, 0x49, 0x4B, 0x5E, 0xEA, + 0xC9, 0xDD, 0x2A, 0x04, 0x2D, 0xEB, 0xB3, 0xBD, 0x22, 0xDC, 0x61, 0xC3, + 0x95, 0xB7, 0x95, 0x92, 0xDC, 0x32, 0x39, 0xC0, 0x18, 0xC1, 0x43, 0x3B, + 0x20, 0x20, 0x32, 0x0A, 0xB0, 0x51, 0x70, 0x21, 0x59, 0x64, 0x8E, 0x35, + 0xFA, 0xD6, 0xF8, 0x75, 0x56, 0x59, 0x96, 0xA8, 0xEE, 0x3F, 0xF1, 0x49, + 0x64, 0xF1, 0x8F, 0x7C, 0x2B, 0xB9, 0x74, 0xC0, 0x03, 0x55, 0xBF, 0x95, + 0x9C, 0x31, 0x80, 0xDA, 0x37, 0x61, 0x99, 0x28, 0x8A, 0x45, 0x38, 0xF4, + 0x23, 0xC7, 0x55, 0x13, 0x79, 0x01, 0xE2, 0x1D, 0xFC, 0x76, 0x64, 0x20, + 0x4B, 0x63, 0x74, 0x0B, 0x40, 0x8C, 0x11, 0x52, 0xBF, 0xD1, 0x1C, 0xAF, + 0x32, 0xAD, 0x92, 0x11, 0x50, 0x61, 0x57, 0x1A, 0xDD, 0x7A, 0x4B, 0x54, + 0xC3, 0x57, 0x2A, 0xC3, 0xF6, 0x4C, 0xDF, 0x82, 0x6B, 0x5E, 0xD9, 0x7F, + 0x06, 0x52, 0x1D, 0xE3, 0x78, 0x4E, 0x6C, 0xC3, 0x14, 0x73, 0xF1, 0x10, + 0x7D, 0xDC, 0xBE, 0xE0, 0x30, 0x75, 0xCF, 0x24, 0x18, 0x44, 0xA2, 0x61, + 0xC5, 0x36, 0xD8, 0x44, 0x5E, 0x57, 0x3A, 0x2C, 0xFA, 0xDF, 0x6F, 0x0B, + 0x75, 0x69, 0xB7, 0x82, 0x53, 0x78, 0x23, 0x8A, 0x46, 0x65, 0xFF, 0x04, + 0xC8, 0xBF, 0x7D, 0xF0, 0x79, 0xDE, 0x36, 0x78, 0x2B, 0xDF, 0x30, 0x16, + 0x25, 0x71, 0xDC, 0xE3, 0x02, 0xD7, 0x49, 0xF7, 0x08, 0xB4, 0x9B, 0xC1, + 0xEE, 0x73, 0xA5, 0x35, 0x43, 0x9E, 0xB0, 0xEA, 0x11, 0x82, 0xC4, 0xC0, + 0x14, 0x1D, 0x00, 0xDC, 0xB4, 0x43, 0x41, 0xC2, 0x22, 0xA3, 0xBD, 0x1B, + 0x41, 0xEF, 0x9E, 0x3F, 0x3A, 0x50, 0x8E, 0x0E, 0xEB, 0x08, 0x5C, 0xAC, + 0x66, 0x05, 0x19, 0xF0, 0xCD, 0x3D, 0x84, 0xB8, 0x04, 0x0A, 0x22, 0x69, + 0xD2, 0xE1, 0x41, 0x9A, 0x9B, 0xFA, 0xAD, 0xB9, 0x84, 0x08, 0xFF, 0xEC, + 0x50, 0x9B, 0xD2, 0x55, 0xF6, 0x21, 0xA8, 0x4A, 0xF7, 0x19, 0xC4, 0xE9, + 0x1B, 0xE7, 0xD6, 0x97, 0x0F, 0xCB, 0xA3, 0xE1, 0xF5, 0xEB, 0x48, 0x38, + 0x8D, 0xCD, 0x6C, 0x14, 0xC8, 0x30, 0xDD, 0xC6, 0x3D, 0xA0, 0xDB, 0x46, + 0xB1, 0x07, 0x89, 0x38, 0xF7, 0x2E, 0x30, 0x7F, 0xD8, 0x93, 0x92, 0x32, + 0x0B, 0xD8, 0x8B, 0xC8, 0x5A, 0x1A, 0x60, 0xAC, 0xD1, 0x41, 0xEC, 0xB5, + 0xB5, 0xE3, 0x7B, 0xDE, 0x3A, 0x33, 0x24, 0x5E, 0x06, 0x85, 0x2B, 0x65, + 0x74, 0xBA, 0x40, 0x7D, 0x60, 0x87, 0xD3, 0xBE, 0xD9, 0x88, 0xF8, 0x36, + 0xA5, 0x83, 0xB8, 0x83, 0x62, 0x44, 0x20, 0x2F, 0xCB, 0xC7, 0xA1, 0x57, + 0xA8, 0x32, 0x60, 0xAB, 0x97, 0x6F, 0x70, 0x07, 0x2B, 0x41, 0x71, 0xF8, + 0xCE, 0xCD, 0x73, 0x4C, 0xB9, 0x04, 0x14, 0x9E, 0xC2, 0x5A, 0x6F, 0x14, + 0xD0, 0x83, 0x10, 0xAE, 0x2F, 0x67, 0x10, 0x46, 0x5F, 0x6D, 0x40, 0xF5, + 0x2F, 0x77, 0x50, 0x82, 0x65, 0x16, 0xAB, 0x82, 0x3F, 0xBA, 0xF1, 0xBC, + 0x53, 0x2D, 0x86, 0xAA, 0x96, 0x40, 0x14, 0x6D, 0x38, 0x4D, 0x37, 0xD0, + 0x0E, 0xFF, 0x2D, 0xBE, 0x31, 0x04, 0xC3, 0x78, 0x56, 0x28, 0x7A, 0x92, + 0xB6, 0xFD, 0x9D, 0x2D, 0x65, 0x1E, 0x90, 0xFE, 0x30, 0x0E, 0xC6, 0x7B, + 0x08, 0x27, 0x2E, 0xDC, 0x3A, 0xED, 0x07, 0x74, 0xF0, 0xF2, 0x09, 0xE9, + 0x1D, 0x96, 0x5B, 0xB2, 0x4D, 0x37, 0x41, 0xA9, 0xB4, 0xA3, 0x71, 0x2A, + 0xAB, 0x15, 0x4F, 0x31, 0x85, 0xC2, 0xD9, 0x10, 0x22, 0x10, 0xFF, 0xAF, + 0xD1, 0x08, 0x36, 0x0F, 0x05, 0x2A, 0xA9, 0xE2, 0xBA, 0x0E, 0x07, 0xAB, + 0xAC, 0x01, 0xCF, 0xC6, 0xB8, 0xE9, 0x61, 0x45, 0xFB, 0x3F, 0x94, 0x5A, + 0x0C, 0x6D, 0x7B, 0x0E, 0x57, 0x5D, 0x9D, 0xEB, 0x96, 0x0C, 0x1D, 0xC1, + 0x13, 0x24, 0x49, 0xB8, 0xA7, 0xE9, 0x5C, 0x9E, 0xED, 0xAD, 0xF3, 0x56, + 0xED, 0x91, 0xA0, 0xA1, 0x72, 0x51, 0xDE, 0xCD, 0xCC, 0x05, 0x89, 0xD4, + 0x01, 0xA4, 0x80, 0x0D, 0x4E, 0x5A, 0xA9, 0x5F, 0xEA, 0x71, 0x27, 0x84, + 0xE6, 0x70, 0x1D, 0xA2, 0xC9, 0x4C, 0x4C, 0x08, 0xAB, 0xD1, 0x73, 0x9B, + 0x5D, 0xE0, 0xB7, 0x5D, 0xDE, 0x1F, 0x49, 0x75, 0xD1, 0x92, 0x5B, 0x52, + 0x58, 0x3A, 0xCE, 0xA0, 0x25, 0x1F, 0xA7, 0xB1, 0xF7, 0xDD, 0x68, 0xD5, + 0xA7, 0xB6, 0xAA, 0xEC, 0x57, 0x93, 0x61, 0xF5, 0x67, 0x9E, 0x5B, 0x9C, + 0xB8, 0xE0, 0x0A, 0xC5, 0x34, 0x35, 0x25, 0xDC, 0x4B, 0xC5, 0xCF, 0x20, + 0x47, 0x84, 0x53, 0xDD, 0x0B, 0x83, 0x70, 0xD6, 0xF7, 0x2C, 0xF3, 0x55, + 0x3A, 0x52, 0xBC, 0x48, 0x0F, 0xCA, 0xFD, 0x4F, 0x91, 0x79, 0x57, 0xDD, + 0x46, 0xB5, 0xF2, 0xA8, 0x16, 0xC0, 0x06, 0x9B, 0xAF, 0x02, 0x12, 0x15, + 0xB6, 0xB0, 0x48, 0x1E, 0x95, 0xA4, 0x36, 0xBB, 0xD6, 0xF8, 0xBA, 0x1D, + 0x70, 0x50, 0x23, 0xA8, 0xF6, 0xBB, 0x61, 0x46, 0x91, 0x24, 0x16, 0x4E, + 0x02, 0xD8, 0x73, 0x01, 0x78, 0xDD, 0x42, 0x7A, 0xA6, 0x4F, 0xFE, 0x94, + 0xF6, 0xEA, 0x1E, 0x62, 0xB0, 0xAC, 0xE4, 0x94, 0x09, 0x0D, 0x43, 0xF4, + 0xA0, 0xA8, 0x7A, 0xAA, 0x1C, 0x28, 0x49, 0xD7, 0xCC, 0x8B, 0x55, 0xF3, + 0xD3, 0x99, 0x9B, 0xEC, 0x41, 0x6B, 0x86, 0x85, 0x65, 0x1B, 0xC2, 0x2E, + 0xD2, 0xF6, 0x46, 0x9F, 0x46, 0xFF, 0x9A, 0x5F, 0xAF, 0x6F, 0x22, 0x29, + 0x59, 0x40, 0xE4, 0x2D, 0xBE, 0x4A, 0x8E, 0xF0, 0x2B, 0x48, 0x5F, 0xC1, + 0x76, 0xA5, 0x2F, 0xEE, 0x03, 0xEB, 0xCF, 0xA7, 0x2E, 0xB0, 0x27, 0xD7, + 0x49, 0xB1, 0xB4, 0x01, 0x46, 0x00, 0x72, 0xCC, 0x98, 0xD7, 0xA3, 0xBC, + 0x4E, 0xF1, 0x32, 0x3D, 0xF1, 0x29, 0x98, 0xA4, 0x39, 0xD0, 0xD9, 0xD9, + 0x2A, 0x99, 0x14, 0x69, 0xE1, 0x99, 0x70, 0xC8, 0xEE, 0x5D, 0xC9, 0xC3, + 0x92, 0xF3, 0xB6, 0xE7, 0xA7, 0x14, 0xC3, 0xC4, 0xBB, 0x05, 0x44, 0xDD, + 0xDC, 0x77, 0xDB, 0x00, 0x73, 0xC9, 0x0B, 0x17, 0x38, 0xAF, 0xCB, 0x7E, + 0x5F, 0x4D, 0x3F, 0x79, 0x16, 0x10, 0x75, 0x79, 0x69, 0x16, 0xAC, 0x7E, + 0xAA, 0x73, 0xC7, 0x71, 0xF6, 0x01, 0x45, 0xC2, 0xA9, 0xB8, 0xC2, 0x77, + 0x88, 0x45, 0x3A, 0xCC, 0x9E, 0x02, 0xF5, 0xCC, 0x58, 0x4B, 0x98, 0x9B, + 0xA4, 0x7F, 0x9F, 0xB2, 0xE9, 0x8F, 0x0F, 0x21, 0xA2, 0xA3, 0x30, 0x24, + 0x96, 0x8E, 0x45, 0xCA, 0x7E, 0x88, 0x92, 0x8A, 0x81, 0xC5, 0xB5, 0x84, + 0x99, 0x98, 0x2D, 0x97, 0xAF, 0x75, 0x7D, 0x0E, 0xCB, 0x28, 0x96, 0xD5, + 0x4D, 0xFE, 0xDD, 0x30, 0xE1, 0xC3, 0x19, 0x3D, 0x04, 0x5A, 0xEA, 0x09, + 0x82, 0x66, 0x51, 0xE2, 0xE9, 0x03, 0xA3, 0xC2, 0xF7, 0x72, 0x7F, 0xE0, + 0x13, 0xF6, 0x29, 0x15, 0xE9, 0x51, 0xF3, 0x12, 0xE1, 0xB1, 0xC8, 0xC9, + 0x4F, 0xE0, 0x44, 0xA7, 0xE8, 0x80, 0x42, 0x82, 0x98, 0x1D, 0xA9, 0x0F, + 0x17, 0x29, 0xEF, 0xD6, 0xAB, 0x6D, 0x5F, 0x9D, 0xD3, 0x63, 0x61, 0xF3, + 0x63, 0x02, 0xC0, 0xF5, 0xB5, 0x75, 0x52, 0x9F, 0x0B, 0xED, 0x8E, 0x37, + 0x1C, 0xC4, 0x33, 0x02, 0xD8, 0xF5, 0xE4, 0x57, 0x0F, 0xD4, 0x7F, 0x07, + 0xFB, 0x7B, 0x98, 0x92, 0x71, 0x17, 0x45, 0xB0, 0x03, 0xD3, 0x62, 0xFF, + 0x65, 0xDC, 0x5B, 0xA4, 0xA1, 0x8A, 0x3F, 0xF8, 0x0F, 0x34, 0xF8, 0xDF, + 0x59, 0x60, 0xE4, 0xC1, 0x16, 0xC7, 0xAE, 0x46, 0x88, 0x33, 0x9E, 0xE0, + 0xD0, 0xB6, 0x21, 0xB6, 0x4B, 0x77, 0xB0, 0x12, 0x3A, 0x15, 0x15, 0x21, + 0x5E, 0xC7, 0xC5, 0xE3, 0x90, 0x4E, 0x79, 0x96, 0x1C, 0xCA, 0xEA, 0xC3, + 0x2D, 0x0B, 0x8C, 0xCE, 0x3E, 0x54, 0x7A, 0x44, 0xBA, 0xE4, 0xCC, 0x23, + 0x14, 0xEA, 0x73, 0x96, 0x88, 0x54, 0x99, 0xD8, 0x7B, 0x10, 0xB8, 0xB9, + 0xD2, 0xA4, 0x57, 0x63, 0x35, 0xDB, 0x8A, 0xFB, 0xBE, 0x57, 0xA3, 0x9B, + 0x0B, 0x39, 0x35, 0x08, 0x03, 0x9A, 0x22, 0x55, 0x04, 0xE2, 0x14, 0xBF, + 0xA1, 0xCA, 0x15, 0xAC, 0xA6, 0x6E, 0xF7, 0xEC, 0x7B, 0xE4, 0xE7, 0x9C, + 0x22, 0x4C, 0x25, 0x77, 0x77, 0x23, 0xEF, 0xF8, 0xB3, 0x52, 0x88, 0xB2, + 0x85, 0x65, 0xFC, 0xAE, 0xCA, 0xAB, 0x44, 0x77, 0x5B, 0x09, 0xC0, 0xC3, + 0xB1, 0x46, 0xAF, 0xEB, 0xEF, 0x50, 0xC4, 0x47, 0x0E, 0xAC, 0xEF, 0x22, + 0xAF, 0x24, 0x53, 0x51, 0x52, 0xB9, 0x55, 0xD7, 0xA8, 0x1A, 0x1A, 0xC5, + 0xDC, 0x64, 0xD4, 0x0C, 0x15, 0x37, 0x23, 0xC5, 0xD9, 0x2C, 0x02, 0xC5, + 0x53, 0x9D, 0xB4, 0x0C, 0x27, 0xB8, 0x00, 0xA3, 0x2E, 0x38, 0xAD, 0xE8, + 0xD0, 0x52, 0xB0, 0x37, 0x9A, 0xC8, 0x81, 0x33, 0x87, 0x37, 0x0C, 0xB8, + 0x17, 0x45, 0x8A, 0xAC, 0xB1, 0xEF, 0xA4, 0xA1, 0x10, 0x4E, 0x88, 0x13, + 0x10, 0x28, 0xF0, 0x22, 0x55, 0x18, 0x96, 0xB1, 0xDC, 0x54, 0x7B, 0xC3, + 0x7A, 0xA1, 0x8C, 0x58, 0x14, 0x9D, 0xB4, 0xC5, 0x98, 0xA9, 0xBF, 0xB6, + 0x27, 0x4F, 0x7A, 0x1C, 0xF4, 0x03, 0x6B, 0x60, 0x91, 0xB0, 0x1E, 0x9A, + 0x3B, 0x2B, 0x40, 0x30, 0x22, 0x3F, 0x61, 0x16, 0x8E, 0x4D, 0xC0, 0x8F, + 0xED, 0xA5, 0x4F, 0x73, 0x10, 0x4A, 0xD2, 0x73, 0xC5, 0xF8, 0x95, 0x25, + 0xB0, 0xBC, 0x01, 0x14, 0x37, 0x0D, 0x74, 0x45, 0xAA, 0xD6, 0x21, 0x4B, + 0x7D, 0x55, 0x93, 0x16, 0x02, 0xBB, 0xBD, 0x77, 0x4F, 0xEE, 0xEA, 0x29, + 0x3C, 0xDF, 0x45, 0x9A, 0x9B, 0x73, 0xBC, 0x01, 0xF7, 0x18, 0x53, 0x1A, + 0x73, 0x2B, 0x3F, 0x78, 0x69, 0xB8, 0x45, 0x16, 0x9F, 0x76, 0x09, 0x91, + 0x04, 0x21, 0x6B, 0x82, 0xCF, 0xFB, 0x0C, 0xF2, 0x15, 0x6A, 0xDD, 0x67, + 0x2C, 0x21, 0x39, 0x06, 0x13, 0x6C, 0xD7, 0x58, 0x54, 0xBA, 0xAC, 0x8D, + 0x1A, 0x13, 0x8F, 0x4F, 0xC3, 0xE8, 0x0A, 0xCC, 0xA0, 0x25, 0xC5, 0xBD, + 0x49, 0x95, 0x6D, 0x95, 0xA8, 0x6F, 0xCA, 0x85, 0x4F, 0xA1, 0x94, 0x45, + 0x86, 0xE2, 0xBA, 0xD6, 0xE3, 0xFA, 0x91, 0xF5, 0x03, 0xA2, 0x2C, 0xCD, + 0x54, 0x37, 0x61, 0xA6, 0x34, 0xE0, 0x8D, 0x1C, 0xD4, 0xC9, 0x31, 0x4B, + 0x13, 0x04, 0xA6, 0x52, 0xFC, 0x8F, 0x4F, 0x81, 0x0A, 0x15, 0xB0, 0xB0, + 0x33, 0x2F, 0x2A, 0xFC, 0xFF, 0x95, 0x87, 0x66, 0xFD, 0x19, 0xDE, 0x77, + 0x4C, 0xF9, 0x3A, 0x5D, 0x34, 0x5D, 0x47, 0x0B, 0x33, 0x55, 0x9B, 0x90, + 0x13, 0x2C, 0xE3, 0xD8, 0xA9, 0xDB, 0xAA, 0xA0, 0x4F, 0x7F, 0x20, 0xF6, + 0x8C, 0x5A, 0x48, 0x8F, 0x88, 0x95, 0x51, 0x11, 0x95, 0x88, 0x13, 0x31, + 0x4D, 0x6F, 0xA2, 0x5A, 0x1B, 0xE5, 0x16, 0x6E, 0x9C, 0x24, 0xA2, 0x82, + 0x69, 0xAC, 0x0A, 0x54, 0x8B, 0x12, 0x64, 0x4D, 0xC4, 0x51, 0x7F, 0xEA, + 0x4C, 0x44, 0x58, 0xF2, 0xA1, 0x1E, 0xBF, 0x02, 0x15, 0x75, 0x4C, 0x4A, + 0xEB, 0x4F, 0x77, 0xE5, 0xB1, 0x3C, 0x26, 0x4F, 0x21, 0xB9, 0xAD, 0x70, + 0x36, 0x4C, 0x02, 0x10, 0x55, 0x29, 0x7C, 0xA1, 0x01, 0x9F, 0xD9, 0x67, + 0xAB, 0xEE, 0x93, 0xD5, 0x91, 0xDF, 0xC5, 0x18, 0x48, 0x9B, 0x9D, 0x3C, + 0xCB, 0xCF, 0x06, 0x21, 0xA7, 0x5B, 0xE5, 0x83, 0x3B, 0x54, 0xCC, 0x04, + 0x43, 0x63, 0x60, 0x66, 0x60, 0x0F, 0xA2, 0x23, 0xAE, 0xE1, 0x55, 0x78, + 0x09, 0x62, 0x51, 0x0F, 0xAE, 0xF1, 0xE5, 0xBE, 0xCB, 0x4E, 0x83, 0xB1, + 0xB8, 0x45, 0x0E, 0x85, 0x54, 0x69, 0xCC, 0xFD, 0x7C, 0x5C, 0x95, 0xBB, + 0x46, 0xF5, 0x21, 0xB9, 0x86, 0x8C, 0x71, 0x10, 0xF3, 0x6C, 0x1E, 0xE5, + 0xBB, 0x5B, 0xCA, 0x38, 0xAE, 0xF1, 0xB8, 0x73, 0xDB, 0x16, 0x30, 0x28, + 0xB6, 0x18, 0xB4, 0xF4, 0x01, 0x0A, 0x99, 0xCC, 0x01, 0x14, 0x80, 0xC1, + 0xC1, 0xED, 0xC4, 0xE3, 0xE6, 0x92, 0x61, 0x7E, 0x18, 0x44, 0xB2, 0x41, + 0xE6, 0x41, 0xC5, 0xFB, 0x07, 0x75, 0xD3, 0xFB, 0xA7, 0xA9, 0xE7, 0x3B, + 0xAA, 0xFE, 0xB8, 0x16, 0x34, 0x9B, 0xA9, 0xEB, 0x75, 0xBA, 0xE6, 0x19, + 0x21, 0x4B, 0x3E, 0xF9, 0xFF, 0xC7, 0x03, 0x22, 0x42, 0xC4, 0x03, 0x38, + 0x83, 0xA9, 0xB0, 0xCE, 0xB7, 0x32, 0x8E, 0x99, 0x18, 0x8A, 0x3E, 0xC9, + 0x38, 0x23, 0x7E, 0x21, 0x0A, 0xBD, 0x2A, 0x07, 0x3C, 0x05, 0xA6, 0x1E, + 0x5A, 0x56, 0xD8, 0xC8, 0xE7, 0x5F, 0x5D, 0x6D, 0x4F, 0xA6, 0x6F, 0xB6, + 0xE1, 0xEE, 0x65, 0x6A, 0x9F, 0xA1, 0xD8, 0x69, 0xC0, 0x9E, 0x6D, 0x4F, + 0x64, 0x78, 0x34, 0x21, 0x56, 0x46, 0x98, 0xC4, 0x23, 0xE7, 0x4D, 0x25, + 0x24, 0x50, 0x86, 0xFC, 0xED, 0xB9, 0x32, 0x1D, 0x81, 0x0E, 0xE1, 0xFD, + 0x01, 0x67, 0x07, 0xD8, 0xF0, 0x15, 0xFC, 0x67, 0x62, 0x24, 0xD7, 0xB3, + 0xAE, 0x48, 0x26, 0xE2, 0xBD, 0x98, 0x51, 0xE2, 0x28, 0xC7, 0x54, 0x30, + 0xC0, 0x7C, 0xFF, 0xA7, 0x8A, 0x43, 0x19, 0xE0, 0xEF, 0x17, 0x1D, 0xF2, + 0x15, 0xD5, 0x8E, 0x55, 0xAA, 0x8B, 0x98, 0x13, 0xF8, 0xAA, 0xCB, 0xB8, + 0x44, 0x74, 0x8E, 0x54, 0x38, 0xA9, 0xB7, 0x2E, 0xCE, 0x69, 0xEE, 0x12, + 0x13, 0xEB, 0xA4, 0x73, 0xE0, 0x22, 0x0D, 0x1D, 0x38, 0xA5, 0x51, 0x68, + 0xFC, 0x8D, 0x1F, 0xF8, 0x97, 0xE9, 0xD9, 0xF6, 0xC4, 0x0E, 0x19, 0x8C, + 0xB8, 0xB4, 0xE0, 0xB7, 0x9C, 0x88, 0x97, 0x45, 0xA5, 0x09, 0xEC, 0x28, + 0x6C, 0x84, 0xE6, 0xA2, 0x79, 0xD2, 0x82, 0x08, 0x3E, 0xA4, 0xD5, 0x27, + 0x6E, 0x2C, 0x00, 0x3B, 0x2C, 0x69, 0x5C, 0x9F, 0x23, 0x98, 0x14, 0x44, + 0x73, 0x1C, 0x2B, 0x42, 0x69, 0xAE, 0x77, 0xF3, 0xA8, 0x8D, 0xC5, 0xA0, + 0x75, 0xD6, 0xDF, 0xDA, 0xC1, 0x72, 0x77, 0x5F, 0x25, 0x7A, 0x76, 0x80, + 0x8C, 0x78, 0x5D, 0xD4, 0x13, 0xA7, 0x4C, 0x72, 0xB8, 0x8C, 0x0F, 0xE1, + 0x10, 0xE2, 0x00, 0xBA, 0xE9, 0x7A, 0x50, 0x81, 0xDB, 0x60, 0x98, 0x39, + 0x90, 0x58, 0x5B, 0x8E, 0xA7, 0x96, 0x56, 0xB5, 0x0A, 0xC7, 0x72, 0x5A, + 0x26, 0x53, 0x23, 0x99, 0x52, 0xCB, 0xD5, 0xFE, 0xC9, 0xF8, 0xE3, 0x78, + 0x16, 0x80, 0xFE, 0xCC, 0x6A, 0x4F, 0x4B, 0x0C, 0xCA, 0x72, 0xCC, 0xF7, + 0x23, 0xCA, 0x0E, 0x0E, 0x5C, 0xD7, 0xA2, 0xA5, 0xA9, 0x8D, 0xC1, 0xE9, + 0x73, 0x7B, 0x84, 0xD6, 0x86, 0x49, 0x45, 0xD2, 0xD4, 0x05, 0xEB, 0xA8, + 0xD2, 0x5A, 0x69, 0x0F, 0xCB, 0x99, 0x39, 0x26, 0xDD, 0x4F, 0xDC, 0x42, + 0xFD, 0x8F, 0xC8, 0x0B, 0x29, 0xB8, 0x83, 0x3D, 0xB8, 0x96, 0x6C, 0x8A, + 0x5E, 0xC5, 0x28, 0x60, 0xE3, 0xC8, 0x9F, 0xFA, 0x0C, 0xC7, 0xAB, 0x67, + 0x8D, 0x23, 0x0F, 0x35, 0xAB, 0xCF, 0xBF, 0x7D, 0xC2, 0xF6, 0x33, 0xC8, + 0xED, 0x53, 0x86, 0x77, 0x28, 0x0B, 0xD5, 0x47, 0x3E, 0x17, 0x54, 0x9F, + 0x49, 0xD7, 0x29, 0x69, 0x57, 0xC0, 0x70, 0xC9, 0x0E, 0xC1, 0x3A, 0x77, + 0x4A, 0x91, 0x2E, 0x23, 0xF1, 0x13, 0xD0, 0x61, 0x8F, 0xA3, 0x6A, 0xDE, + 0x01, 0x6A, 0xC2, 0x4B, 0x8F, 0xCD, 0x5D, 0x98, 0x70, 0x6D, 0xAC, 0xE3, + 0xFD, 0x17, 0x77, 0x37, 0x81, 0x4C, 0x31, 0xC0, 0x93, 0x74, 0x27, 0x79, + 0xA3, 0x65, 0x7F, 0x35, 0x31, 0x9F, 0x4E, 0x21, 0x13, 0xCE, 0x7E, 0xAB, + 0x01, 0x85, 0x1D, 0x66, 0x95, 0xF5, 0x0C, 0x19, 0x8B, 0x06, 0x3D, 0xB3, + 0x14, 0xD9, 0x64, 0x2B, 0x46, 0xB5, 0x8A, 0x47, 0x0A, 0x98, 0x6D, 0x4E, + 0x7C, 0xE6, 0x26, 0xC8, 0xFA, 0xAB, 0x90, 0xFB, 0x4F, 0x04, 0xCC, 0xB2, + 0x0C, 0x9D, 0x62, 0x45, 0x55, 0x89, 0x4A, 0x55, 0x9B, 0x76, 0x71, 0x1D, + 0x90, 0xE4, 0xCF, 0x46, 0xFC, 0x2F, 0x92, 0x88, 0x9B, 0xFA, 0xF0, 0xCE, + 0xB1, 0x56, 0xB5, 0xD7, 0x65, 0xBF, 0x8A, 0x63, 0x5E, 0x0E, 0x05, 0xDA, + 0xD9, 0xFF, 0x26, 0xFD, 0x2A, 0xA0, 0x98, 0x70, 0x32, 0xBC, 0xBC, 0x93, + 0x22, 0x8C, 0x6E, 0xB1, 0x36, 0xE8, 0x9D, 0x7F, 0xBC, 0xDE, 0xDD, 0x0A, + 0x3F, 0x6D, 0xEA, 0xA2, 0xDA, 0xAC, 0x7B, 0x77, 0x4E, 0x6D, 0x7A, 0x71, + 0xEF, 0x49, 0x6E, 0x31, 0xD1, 0xD6, 0xC9, 0x15, 0xBA, 0x1E, 0x18, 0x98, + 0x92, 0xF1, 0x21, 0x23, 0xC0, 0xB5, 0x9C, 0x37, 0x15, 0x97, 0xA6, 0x48, + 0x09, 0x6D, 0x46, 0x6C, 0x45, 0x06, 0xC5, 0x27, 0x64, 0x54, 0x78, 0xF5, + 0xFF, 0xD3, 0xD3, 0xAE, 0xC8, 0x6E, 0xFC, 0x59, 0xB1, 0xD9, 0x26, 0xE8, + 0xEE, 0x3C, 0x1D, 0xC7, 0xCF, 0xC0, 0xE0, 0xAB, 0xDC, 0x10, 0x74, 0x48, + 0xBA, 0xC2, 0xCA, 0xA1, 0x9C, 0xFB, 0x87, 0x99, 0x7A, 0x6B, 0x37, 0x5C, + 0x6F, 0x9F, 0x97, 0xCB, 0x90, 0x4F, 0xBC, 0x26, 0x15, 0xAC, 0x0D, 0xC6, + 0x72, 0xF6, 0x29, 0xF8, 0xDD, 0x57, 0x68, 0x46, 0x35, 0x60, 0xD8, 0x16, + 0xE7, 0x3F, 0xC7, 0xEC, 0xDE, 0x6B, 0x8C, 0xF0, 0x3D, 0x4A, 0x17, 0x58, + 0x55, 0xD5, 0xE8, 0xA8, 0x4A, 0x62, 0x48, 0x8B, 0x52, 0xBD, 0x13, 0x00, + 0xF7, 0x44, 0xD1, 0x78, 0x3C, 0x1D, 0xAC, 0x34, 0xEE, 0xA5, 0x9B, 0xCC, + 0x6D, 0xAD, 0x30, 0x31, 0xFC, 0x81, 0x91, 0x50, 0x26, 0x2A, 0x48, 0x30, + 0x20, 0xB7, 0xAA, 0x87, 0x02, 0x99, 0xB2, 0xE4, 0xAC, 0x83, 0x71, 0x59, + 0xDC, 0xD9, 0x5D, 0x6C, 0xB1, 0x03, 0x32, 0x97, 0x97, 0xEE, 0xFD, 0xCC, + 0xC4, 0xF3, 0xDD, 0x94, 0xC6, 0x43, 0xB9, 0xB7, 0x1D, 0x2F, 0x9C, 0x9D, + 0x7F, 0x91, 0x51, 0x1A, 0x35, 0xAF, 0xD8, 0x50, 0xFB, 0xBF, 0xD0, 0xA0, + 0x28, 0x39, 0x6F, 0x47, 0x96, 0x57, 0x7D, 0x52, 0x5C, 0xCD, 0xC9, 0x7F, + 0xBB, 0x2C, 0x15, 0xFE, 0x2A, 0x3A, 0xFD, 0x23, 0xB2, 0x91, 0x6F, 0xC7, + 0x3C, 0xB2, 0x91, 0xB9, 0x59, 0xAA, 0x2E, 0x96, 0x45, 0xC5, 0x30, 0xAC, + 0x03, 0x42, 0x78, 0xFD, 0x46, 0xD2, 0x2F, 0x7A, 0x46, 0x55, 0x26, 0x49, + 0x38, 0x4C, 0xA1, 0xD2, 0x78, 0x17, 0xD6, 0x3D, 0x00, 0xCB, 0xF7, 0xB2, + 0x68, 0x7D, 0x4A, 0xDA, 0x2E, 0x54, 0xF6, 0x6C, 0xCF, 0xDE, 0x8F, 0xF7, + 0xFA, 0xF8, 0x87, 0x38, 0xCA, 0xEA, 0xD2, 0x1F, 0xED, 0x04, 0xD0, 0xE9, + 0x12, 0xCF, 0x11, 0x18, 0xAF, 0xF3, 0x4E, 0x13, 0x3D, 0xBC, 0x30, 0xB4, + 0x15, 0x71, 0x8B, 0x2D, 0x63, 0xCA, 0x53, 0x8C, 0x20, 0x6D, 0x0C, 0x4E, + 0xF8, 0x10, 0xD2, 0x1A, 0xC1, 0x0C, 0xE8, 0xCF, 0xE1, 0xA8, 0x93, 0x7E, + 0x8B, 0x32, 0x9D, 0x47, 0x03, 0x2B, 0x92, 0x27, 0x73, 0xE9, 0x39, 0xBD, + 0x9F, 0x7B, 0x76, 0x8B, 0x3C, 0x66, 0xA1, 0x3E, 0x4B, 0x69, 0x36, 0x71, + 0x93, 0x02, 0x47, 0x5E, 0x3D, 0x8F, 0x28, 0x72, 0x15, 0x85, 0x64, 0x1C, + 0x8F, 0x2F, 0x58, 0x8F, 0xDD, 0x25, 0x84, 0x70, 0x0A, 0xD4, 0x8A, 0x3A, + 0x02, 0x08, 0xC6, 0x91, 0xBD, 0xE9, 0xA9, 0x66, 0xD0, 0x9F, 0xE5, 0x2F, + 0xCF, 0xA2, 0x94, 0x7E, 0xB8, 0x91, 0x31, 0x90, 0xC8, 0x06, 0x9B, 0x91, + 0xCD, 0xE7, 0xDD, 0x1D, 0x6F, 0x57, 0x40, 0x59, 0x64, 0x95, 0x49, 0xAA, + 0xA6, 0x48, 0x2F, 0x09, 0x78, 0xE8, 0xA5, 0xCF, 0x41, 0x8C, 0x23, 0x38, + 0xEB, 0xA6, 0x93, 0x7F, 0x33, 0xE1, 0x38, 0x02, 0x64, 0x8C, 0x6A, 0x40, + 0x93, 0xD0, 0x4D, 0xA9, 0x9A, 0x4C, 0xE4, 0x2F, 0x8C, 0xC4, 0xFE, 0x00, + 0xB6, 0x6C, 0xD2, 0x55, 0xA8, 0xB6, 0xF1, 0x44, 0x43, 0x07, 0x53, 0x38, + 0x12, 0xD3, 0xA3, 0x25, 0x76, 0x13, 0x7E, 0x81, 0x39, 0xAB, 0x87, 0x90, + 0x15, 0xEC, 0x81, 0xC4, 0x37, 0x08, 0x18, 0xDC, 0xED, 0xE5, 0xF0, 0xA5, + 0x68, 0x41, 0x52, 0x92, 0xFA, 0x53, 0x70, 0xF6, 0xA0, 0xDC, 0xEF, 0xCF, + 0x6C, 0x3F, 0xDE, 0x72, 0x33, 0x3F, 0x43, 0x84, 0xB0, 0xA0, 0xC5, 0xEF, + 0x1B, 0x45, 0x63, 0x00, 0x6B, 0xDA, 0x3E, 0xCD, 0x84, 0x19, 0xD4, 0xD9, + 0x0D, 0x8C, 0x27, 0xF0, 0x6E, 0xA2, 0x03, 0xD5, 0xFD, 0xD7, 0x8F, 0x43, + 0x46, 0x5E, 0x38, 0x91, 0x7B, 0x2E, 0xB8, 0x65, 0xCD, 0x16, 0xC2, 0xB9, + 0x50, 0x97, 0x1C, 0xAF, 0x3A, 0xE0, 0xA9, 0x44, 0xE7, 0xF6, 0x5E, 0x40, + 0x41, 0x55, 0xDD, 0x05, 0xD9, 0xFC, 0x50, 0xB1, 0x1D, 0x51, 0xEE, 0xB0, + 0x8A, 0x52, 0x38, 0x77, 0x59, 0x36, 0xDE, 0xB2, 0xB9, 0x28, 0x07, 0xE0, + 0xC8, 0x44, 0x80, 0x6D, 0x91, 0x72, 0x65, 0xD8, 0xC6, 0xA2, 0xFF, 0xF6, + 0x61, 0x37, 0x22, 0x1B, 0x98, 0x65, 0xF9, 0x96, 0xDB, 0xF9, 0x33, 0xE7, + 0xAE, 0x25, 0x07, 0xC2, 0x01, 0x54, 0xF3, 0xA3, 0xFD, 0xC8, 0x25, 0x8E, + 0x7B, 0x7F, 0x49, 0xD1, 0x55, 0xA3, 0x17, 0x58, 0x53, 0xF0, 0x0F, 0xCA, + 0x1F, 0x6D, 0xEF, 0x28, 0x46, 0x0B, 0x35, 0x21, 0x66, 0x6C, 0x4F, 0x01, + 0x79, 0x92, 0xD2, 0x16, 0x3C, 0x2C, 0xBE, 0x88, 0x2E, 0x09, 0xC3, 0x8E, + 0x8E, 0x62, 0x0F, 0x5E, 0x4D, 0x3C, 0x0C, 0xFE, 0x02, 0x1A, 0x02, 0xB1, + 0xF4, 0x86, 0xCA, 0x17, 0x0E, 0x57, 0x00, 0x35, 0x6C, 0xA6, 0xBF, 0x29, + 0x35, 0x24, 0x78, 0x30, 0x90, 0xF3, 0xBE, 0x0B, 0x9D, 0x88, 0x79, 0x14, + 0x92, 0x32, 0x8F, 0xA0, 0xC1, 0xF7, 0x98, 0xFA, 0x9B, 0x62, 0x70, 0x84, + 0xA6, 0x5A, 0xA6, 0x03, 0xD0, 0x9F, 0xE9, 0x6A, 0x9F, 0x3A, 0xD4, 0xB7, + 0xE2, 0x83, 0x6A, 0x5B, 0x94, 0x44, 0x01, 0x99, 0x2F, 0x7F, 0x59, 0xA9, + 0xF2, 0xAD, 0x74, 0x15, 0xC7, 0x31, 0x22, 0x13, 0x76, 0xF4, 0x3D, 0x4A, + 0x07, 0xA7, 0xC0, 0x89, 0xFC, 0x7A, 0x83, 0x6D, 0xB1, 0xF8, 0xA3, 0x1F, + 0xB9, 0x3B, 0xCC, 0x81, 0x32, 0x37, 0x65, 0x46, 0x2D, 0xAF, 0x9A, 0x4E, + 0x96, 0x14, 0x3D, 0x57, 0x9C, 0xF1, 0x92, 0xB3, 0x0E, 0x54, 0x4F, 0xF0, + 0xA0, 0x70, 0x66, 0x65, 0x36, 0x8D, 0x11, 0xD0, 0xBD, 0xD6, 0xEB, 0x49, + 0x76, 0x79, 0xB4, 0xB7, 0x91, 0xAA, 0x21, 0x2D, 0xBA, 0x19, 0x1C, 0xDC, + 0x90, 0x16, 0xEC, 0xB7, 0x09, 0xFF, 0x1F, 0xC8, 0xE5, 0x75, 0xDB, 0x42, + 0x35, 0x53, 0x07, 0x77, 0x1F, 0x0C, 0xA3, 0x77, 0xD0, 0xCA, 0xDE, 0xC5, + 0xB8, 0x15, 0xA6, 0xAB, 0x5E, 0x2B, 0xC9, 0x3A, 0x1B, 0xDC, 0xDB, 0x4F, + 0x1C, 0xA7, 0xF7, 0xD7, 0xBF, 0x27, 0x07, 0x0C, 0xF7, 0xFD, 0x64, 0xF1, + 0xA1, 0x89, 0x50, 0xE8, 0xA5, 0x94, 0x12, 0xBC, 0x0B, 0x82, 0x3A, 0xDB, + 0xE4, 0xCC, 0x8C, 0x61, 0x5D, 0xB6, 0xD0, 0x38, 0xC6, 0xF2, 0xE3, 0xE8, + 0x6E, 0xDE, 0xA8, 0x5E, 0x13, 0x05, 0x08, 0x17, 0x1F, 0xE5, 0x04, 0x51, + 0x7E, 0xB8, 0x67, 0x55, 0xEA, 0x3F, 0x09, 0x53, 0xE0, 0x02, 0xD4, 0xD7, + 0xE5, 0x4B, 0x71, 0x0C, 0x28, 0xF0, 0x84, 0x9A, 0x3C, 0x5E, 0x3D, 0xA2, + 0x79, 0xDE, 0x75, 0x8B, 0xCF, 0xA6, 0x69, 0xDC, 0xAB, 0x13, 0x92, 0xFE, + 0xDA, 0xEC, 0x89, 0x7C, 0x88, 0x66, 0x94, 0x14, 0xD2, 0xDB, 0xCC, 0x5E, + 0x5D, 0x5D, 0xD6, 0x64, 0x85, 0x17, 0x9A, 0x48, 0xD3, 0xCC, 0xD7, 0x4C, + 0x43, 0x40, 0x13, 0x56, 0x3C, 0x27, 0x28, 0xDB, 0xDF, 0xF9, 0x7D, 0x10, + 0xE5, 0xB4, 0xAB, 0x62, 0x79, 0x08, 0xFA, 0x9E, 0xCE, 0xB2, 0x92, 0x27, + 0x05, 0x8F, 0x6C, 0x7B, 0xCD, 0xC6, 0xAD, 0x7A, 0xBD, 0x89, 0x04, 0x21, + 0x32, 0x52, 0xF8, 0x5B, 0xB1, 0x53, 0x5C, 0x0B, 0x43, 0x0E, 0xD2, 0x2D, + 0x13, 0xC9, 0xFD, 0x33, 0xB7, 0x5D, 0x91, 0xC5, 0xC8, 0x33, 0xB8, 0xDD, + 0x29, 0x9D, 0x5D, 0xC4, 0x5A, 0xF9, 0x4A, 0x1A, 0xAF, 0x3F, 0x40, 0x0D, + 0x53, 0x64, 0x85, 0x51, 0xC4, 0xCD, 0xA3, 0x2E, 0x68, 0x57, 0xFD, 0x4E, + 0xF6, 0x43, 0x8F, 0x7D, 0x2E, 0x3D, 0x44, 0x14, 0xB0, 0xF1, 0xB3, 0x65, + 0x95, 0x3E, 0x20, 0xE1, 0x19, 0xCC, 0xFB, 0x54, 0xA7, 0x89, 0x7F, 0xF4, + 0xD7, 0x4D, 0x61, 0x00, 0xA0, 0x9C, 0x97, 0x03, 0xA0, 0x0E, 0x95, 0xCD, + 0xF4, 0xF5, 0xF9, 0xCA, 0x2E, 0x3F, 0x23, 0x86, 0xFE, 0xCF, 0xAA, 0x70, + 0x26, 0x8E, 0x80, 0x7F, 0xBC, 0x71, 0x16, 0x40, 0x92, 0x4D, 0xB3, 0xF7, + 0x82, 0x55, 0x60, 0x20, 0xA2, 0x79, 0x88, 0x55, 0x52, 0xD2, 0xD8, 0x62, + 0x1B, 0x4B, 0xBD, 0x3D, 0x95, 0x35, 0x3B, 0x90, 0x98, 0xE5, 0x90, 0x83, + 0xB9, 0x68, 0xF0, 0xD3, 0xFF, 0x20, 0xB9, 0x19, 0xCB, 0xE1, 0xD6, 0x30, + 0x69, 0xDF, 0xEB, 0x59, 0xDF, 0x89, 0x77, 0xD1, 0x49, 0x8C, 0x5A, 0x4E, + 0x8D, 0xD9, 0x63, 0xAF, 0xAA, 0x2E, 0xF1, 0x93, 0x9C, 0xAA, 0xB2, 0x7D, + 0x6C, 0x2C, 0x69, 0x1E, 0xDA, 0x9C, 0x24, 0xAA, 0x56, 0x66, 0x19, 0x03, + 0xBE, 0x21, 0x9D, 0xF4, 0x36, 0x65, 0x5A, 0x02, 0x6B, 0x91, 0x41, 0xF7, + 0x07, 0x68, 0x26, 0xEA, 0x33, 0x1A, 0x79, 0x9D, 0xEF, 0x7A, 0xAF, 0x9B, + 0x66, 0x8B, 0xA2, 0xA7, 0x8C, 0x17, 0x33, 0xA0, 0x64, 0x2D, 0x3E, 0x84, + 0xBC, 0x13, 0x74, 0x52, 0xF9, 0x25, 0x22, 0x67, 0x9A, 0xC3, 0x8C, 0x04, + 0x56, 0x66, 0xD6, 0x55, 0xB7, 0xF5, 0x50, 0xDC, 0x22, 0xB6, 0x0D, 0x80, + 0x49, 0xD9, 0xC8, 0x48, 0x3C, 0xEB, 0x37, 0x42, 0x9E, 0x2F, 0xE4, 0xD5, + 0xA3, 0xD5, 0xBF, 0xD9, 0xBC, 0x3D, 0x99, 0x03, 0xBE, 0x0C, 0x53, 0x18, + 0x93, 0x0D, 0xCE, 0x59, 0xB4, 0x08, 0xFA, 0x93, 0x93, 0xAD, 0xEC, 0x24, + 0xC1, 0x76, 0x07, 0x06, 0xFB, 0x78, 0x93, 0x40, 0xB0, 0x40, 0x7C, 0xBA, + 0x4E, 0xBE, 0x93, 0x04, 0xD5, 0xF6, 0x6D, 0x72, 0x84, 0x09, 0x2D, 0x8A, + 0x5C, 0x86, 0xF3, 0xC0, 0x6B, 0x53, 0xE6, 0xDD, 0xA0, 0x34, 0x41, 0x2B, + 0x46, 0x7C, 0xE3, 0x76, 0x32, 0xD3, 0x3A, 0x8C, 0x46, 0x9C, 0x98, 0xFF, + 0x3D, 0x5F, 0xD5, 0xB0, 0xA1, 0xF2, 0x0A, 0xAE, 0x52, 0x3D, 0xD1, 0x71, + 0xBA, 0x5B, 0x09, 0xB4, 0x52, 0x65, 0xE8, 0x15, 0x80, 0xD5, 0x59, 0x68, + 0x68, 0xEC, 0x2B, 0x80, 0x72, 0xDA, 0xCB, 0xEB, 0x68, 0xBC, 0x68, 0xD0, + 0x19, 0xBC, 0x5E, 0xED, 0x1F, 0x80, 0x8F, 0xD1, 0x76, 0x44, 0x46, 0x6E, + 0xD9, 0x78, 0x91, 0xED, 0x71, 0x9B, 0x4A, 0xCF, 0x1B, 0x1D, 0xDE, 0xC2, + 0x4A, 0xEC, 0xF1, 0x2E, 0xC0, 0xC3, 0xEA, 0x7E, 0x76, 0x1F, 0x74, 0xCE, + 0x9D, 0xF1, 0x6B, 0x94, 0x21, 0x06, 0x00, 0x58, 0x1E, 0x37, 0x6B, 0xFB, + 0xB6, 0x45, 0xB4, 0x71, 0x35, 0x74, 0x20, 0x83, 0xA1, 0xD8, 0x3A, 0x1F, + 0xA4, 0x17, 0x71, 0xEB, 0x10, 0x93, 0xD0, 0xD7, 0x6C, 0xD2, 0x43, 0xF2, + 0xF3, 0x66, 0xC1, 0x55, 0x07, 0x00, 0x54, 0xA1, 0x4A, 0x4E, 0x55, 0xD9, + 0x9D, 0x1D, 0xB0, 0x3F, 0x2E, 0x60, 0xF1, 0x5F, 0x30, 0x1E, 0x66, 0xD8, + 0xE9, 0xCD, 0x99, 0x0B, 0x72, 0x35, 0x99, 0x55, 0x1E, 0x4A, 0xD7, 0xA3, + 0x02, 0x87, 0x27, 0x76, 0x5A, 0x8D, 0xBC, 0x3D, 0xAA, 0xD6, 0xDA, 0xFA, + 0x43, 0xE7, 0xD4, 0xCD, 0x92, 0xF0, 0xAB, 0xEB, 0x9F, 0xD2, 0xC8, 0xA4, + 0x3A, 0xF6, 0x1F, 0xAE, 0xBC, 0x79, 0xDD, 0xDD, 0x98, 0xE6, 0xA5, 0x11, + 0x53, 0x35, 0x24, 0xEE, 0x55, 0xC6, 0x86, 0x17, 0x55, 0x57, 0x8A, 0xCB, + 0xAC, 0x9B, 0xA3, 0xBA, 0x25, 0x24, 0xB6, 0x14, 0xC2, 0x42, 0xB2, 0xDE, + 0x42, 0x0A, 0x23, 0x58, 0xCE, 0xBF, 0x21, 0x2A, 0xDB, 0xF1, 0xBD, 0x78, + 0xD4, 0x18, 0xCC, 0xFE, 0x49, 0xAE, 0x04, 0xD7, 0x94, 0x58, 0x71, 0x6E, + 0x8F, 0x3B, 0xE1, 0xBF, 0x6A, 0x9C, 0x73, 0x88, 0x9D, 0xD7, 0xAB, 0x7C, + 0xE6, 0xAC, 0x31, 0xFB, 0xB0, 0x80, 0xD7, 0x47, 0x8E, 0x32, 0x81, 0x61, + 0xCF, 0xCF, 0x41, 0x2B, 0xA8, 0x84, 0x2D, 0x4F, 0x64, 0x89, 0xC3, 0xC8, + 0xEE, 0xFA, 0xF5, 0x6E, 0xB9, 0x62, 0x38, 0xBC, 0xBA, 0xFF, 0x26, 0x75, + 0xB4, 0xF3, 0x34, 0xB4, 0x94, 0xD1, 0x31, 0x57, 0x87, 0xDF, 0x93, 0xBC, + 0x27, 0xE5, 0x34, 0xEF, 0xF5, 0x50, 0xD1, 0x52, 0x53, 0x36, 0xAD, 0x7F, + 0xF1, 0x7A, 0x0C, 0xAB, 0x29, 0x17, 0x0A, 0xD4, 0xD1, 0x18, 0xA0, 0xC5, + 0xD9, 0xC9, 0xFB, 0xC6, 0x08, 0x47, 0xD8, 0x2D, 0x8B, 0xA6, 0x06, 0xA0, + 0xC1, 0xF3, 0xF4, 0x50, 0x65, 0x0F, 0xF2, 0x1B, 0x04, 0x48, 0x3E, 0x9B, + 0xC4, 0x70, 0x6A, 0xCC, 0xE6, 0x7C, 0x6D, 0x1F, 0x3F, 0x3B, 0x5B, 0xBE, + 0x87, 0x60, 0x31, 0x09, 0x3F, 0xF6, 0x37, 0xF3, 0xD9, 0xB8, 0x13, 0x20, + 0x38, 0x41, 0xF1, 0xF5, 0xE1, 0x2A, 0xDB, 0x33, 0xE4, 0xFA, 0xCE, 0x15, + 0xA0, 0x9D, 0x59, 0x2C, 0x05, 0x92, 0xC0, 0x87, 0xBE, 0x3C, 0x21, 0x53, + 0xEF, 0xF8, 0x63, 0xB5, 0x7F, 0x67, 0x7A, 0xA3, 0x5E, 0x76, 0x75, 0x79, + 0x90, 0x15, 0xA8, 0x8B, 0x06, 0xB4, 0x91, 0x6B, 0xDE, 0x37, 0x0D, 0x31, + 0x40, 0xE1, 0x7E, 0xC4, 0x1F, 0x00, 0xDD, 0xBA, 0x62, 0x00, 0xEA, 0x90, + 0xE5, 0xF2, 0xEE, 0x71, 0x2E, 0x1C, 0xA3, 0xFA, 0xBA, 0x9C, 0x64, 0xFF, + 0x11, 0x07, 0xD2, 0xE7, 0x00, 0xF1, 0x08, 0xAA, 0x8E, 0x1A, 0x55, 0x29, + 0xFB, 0xFB, 0x17, 0x11, 0xC7, 0xA3, 0xA0, 0x7D, 0x10, 0x4E, 0x02, 0xFA, + 0xBB, 0x12, 0x3D, 0x74, 0xA2, 0x84, 0xE7, 0xBD, 0x78, 0x77, 0x1E, 0x97, + 0xC9, 0x33, 0x2B, 0x19, 0x5B, 0x5D, 0xDD, 0xF2, 0xE1, 0xD6, 0xB3, 0x08, + 0x0D, 0xE0, 0x56, 0x71, 0x9D, 0xE2, 0x0C, 0xB9, 0x60, 0xC4, 0x0C, 0x90, + 0x54, 0x07, 0xDC, 0x03, 0x92, 0xC6, 0x20, 0x38, 0x3D, 0x3D, 0xC5, 0xC9, + 0xF6, 0x02, 0x84, 0x7D, 0x84, 0x5C, 0x6A, 0x60, 0xE5, 0xEF, 0xBC, 0x54, + 0x71, 0x0C, 0xD3, 0xF7, 0xED, 0x3D, 0x76, 0x0F, 0x19, 0x15, 0x50, 0x53, + 0xB4, 0x81, 0x8D, 0x0E, 0xCF, 0xA1, 0x59, 0x8D, 0xEF, 0xF2, 0x29, 0x21, + 0xF2, 0x64, 0xCE, 0x9C, 0xE2, 0x96, 0x4A, 0x0C, 0x1B, 0x71, 0x7A, 0x72, + 0x45, 0x24, 0x68, 0xC7, 0xD0, 0x6B, 0xD2, 0x3B, 0x5B, 0x16, 0xEC, 0xFE, + 0x40, 0x84, 0x72, 0xD7, 0x35, 0x7C, 0xA8, 0x80, 0x8C, 0xBA, 0xDA, 0x56, + 0xA3, 0xA9, 0xC1, 0xCC, 0x98, 0x6C, 0x20, 0x42, 0xBB, 0xB7, 0x1B, 0x0C, + 0xCF, 0x98, 0x77, 0x71, 0x07, 0x1D, 0xDA, 0x66, 0xA3, 0xD7, 0xE1, 0x2F, + 0xB0, 0x70, 0x7B, 0x53, 0xA9, 0x80, 0x76, 0x16, 0x4E, 0xB3, 0x82, 0x0A, + 0x33, 0xD0, 0x30, 0x2F, 0x76, 0x89, 0x80, 0x76, 0x25, 0x85, 0xA1, 0x29, + 0x97, 0xFA, 0xE3, 0xAE, 0x6E, 0x44, 0xBD, 0xA2, 0x6A, 0xA5, 0xCA, 0x9C, + 0x13, 0x7A, 0xAE, 0x51, 0x8D, 0x7C, 0xC8, 0xE1, 0xE6, 0xA8, 0x36, 0x01, + 0x34, 0x1D, 0xA6, 0x40, 0x93, 0xF2, 0x2F, 0x7F, 0xCD, 0x29, 0xB5, 0x5B, + 0x15, 0xEE, 0x59, 0x63, 0xE6, 0xD7, 0x77, 0xBB, 0x77, 0x0A, 0x25, 0x4D, + 0xF3, 0x9D, 0x23, 0x0C, 0xD4, 0x6D, 0xBB, 0x11, 0x96, 0x4E, 0x96, 0x15, + 0xDE, 0xFE, 0xE6, 0x1A, 0xD2, 0x10, 0xE2, 0xA4, 0x6B, 0x2F, 0x99, 0xB5, + 0xFA, 0xAC, 0xC5, 0xB6, 0x90, 0xFA, 0x6C, 0x90, 0x16, 0x45, 0xB6, 0x93, + 0x71, 0x6B, 0x80, 0xE1, 0x9C, 0x65, 0x0D, 0x05, 0x84, 0xB0, 0x1B, 0xAC, + 0x4E, 0xAE, 0x6A, 0x42, 0x80, 0xF5, 0xD7, 0xAA, 0x43, 0x93, 0xE1, 0x3E, + 0x51, 0x71, 0x5B, 0x6E, 0xA7, 0x9F, 0x56, 0x9A, 0xFC, 0xFD, 0x3B, 0xA5, + 0x07, 0x7C, 0xF6, 0x65, 0x22, 0xEA, 0x8E, 0x52, 0xAA, 0x51, 0x5A, 0x41, + 0x4A, 0x19, 0x7F, 0x92, 0x18, 0x0C, 0x04, 0x6A, 0xFB, 0x23, 0x30, 0xEC, + 0xF5, 0x5B, 0x4E, 0xEA, 0xE8, 0x4D, 0x3D, 0x87, 0xAE, 0xE7, 0x7C, 0x9A, + 0x9F, 0xC0, 0xAC, 0xB8, 0x28, 0xC2, 0xC8, 0x9D, 0xB9, 0x45, 0x9E, 0x4C, + 0xC6, 0x7F, 0x34, 0x15, 0x2F, 0x58, 0xE5, 0x10, 0x75, 0x5A, 0x44, 0xB2, + 0xB6, 0x2B, 0xF5, 0x1D, 0x8F, 0xF7, 0xD8, 0xF5, 0xB2, 0xF5, 0xAA, 0x88, + 0x16, 0xD0, 0x26, 0xF4, 0x32, 0xFC, 0x8E, 0x60, 0xE7, 0x41, 0x6F, 0x9A, + 0xCA, 0x51, 0x8E, 0x45, 0xF6, 0x39, 0xFF, 0x8C, 0x48, 0x61, 0x40, 0xE1, + 0xC9, 0x45, 0x82, 0x04, 0xEF, 0xB2, 0x59, 0x30, 0xA4, 0x2C, 0x62, 0xD9, + 0x2D, 0xDD, 0xAB, 0xAD, 0x18, 0x81, 0x19, 0x81, 0xCA, 0xCA, 0x75, 0xB3, + 0xD0, 0x37, 0x0F, 0xE9, 0x5D, 0x54, 0x8E, 0x0B, 0xB2, 0x55, 0x2A, 0x98, + 0xC0, 0x75, 0x5A, 0xEB, 0x9D, 0x11, 0x3F, 0x20, 0xE2, 0x3E, 0xB0, 0xB7, + 0xCA, 0xB1, 0xD8, 0x30, 0x66, 0x4C, 0xBC, 0xEA, 0x8F, 0x76, 0x30, 0xC4, + 0x9D, 0x03, 0x21, 0x93, 0xEF, 0x54, 0x06, 0xEC, 0x93, 0xFA, 0x89, 0x48, + 0xC7, 0x9C, 0x06, 0x22, 0x77, 0xBD, 0xD1, 0x5E, 0xCF, 0x60, 0xD6, 0xA5, + 0x17, 0x9A, 0x75, 0x50, 0xF3, 0x97, 0xD4, 0x8E, 0xE3, 0x17, 0x41, 0xFD, + 0xC0, 0x3B, 0xBB, 0x8A, 0xA7, 0x2B, 0x98, 0xF6, 0xBD, 0xE7, 0x14, 0x2D, + 0xE9, 0xEF, 0xC9, 0x0B, 0x6E, 0xCC, 0xE3, 0x17, 0xF3, 0xB8, 0xDF, 0x06, + 0x3A, 0xE1, 0xB3, 0x58, 0x22, 0x3D, 0xEF, 0xEA, 0xBA, 0xF1, 0x9D, 0x4F, + 0xDB, 0xCC, 0x0C, 0xED, 0x57, 0x39, 0x80, 0x3A, 0x3B, 0xBC, 0xEE, 0x29, + 0x04, 0x34, 0xA5, 0x08, 0xE9, 0xDF, 0x96, 0xD3, 0x53, 0xC5, 0x4E, 0xF6, + 0x38, 0xAD, 0xCA, 0x53, 0x77, 0x59, 0xF1, 0x80, 0x9F, 0xA8, 0xB6, 0xDA, + 0x5A, 0x56, 0xAA, 0x84, 0x6C, 0x0E, 0xA8, 0xB2, 0x10, 0x37, 0xC8, 0x6A, + 0xD8, 0x4D, 0x78, 0xAE, 0x36, 0xD0, 0xDC, 0xE7, 0x1D, 0x8E, 0x57, 0xAC, + 0xDD, 0x15, 0xAB, 0xB5, 0x30, 0x3C, 0xE7, 0xE6, 0x51, 0xD3, 0x26, 0xF6, + 0x13, 0x1D, 0xC8, 0xFC, 0x28, 0x83, 0x5E, 0x64, 0xA6, 0xCA, 0xA7, 0x67, + 0xE6, 0x34, 0x19, 0x66, 0xC8, 0x07, 0xB6, 0x74, 0xB2, 0x59, 0xAE, 0xDA, + 0x36, 0x3F, 0x1F, 0xF6, 0x81, 0xEB, 0xC7, 0xB3, 0x6D, 0x1F, 0x87, 0xA8, + 0x90, 0x37, 0xD5, 0x85, 0xC3, 0x17, 0xC5, 0xE5, 0xE8, 0xCE, 0x83, 0xB5, + 0x73, 0x49, 0xA7, 0x2B, 0x91, 0x28, 0x2D, 0x2A, 0xC2, 0x22, 0xA7, 0x31, + 0x18, 0xA6, 0xA4, 0x8C, 0x45, 0x68, 0xA5, 0x95, 0xA4, 0x91, 0xA3, 0xEE, + 0x4E, 0x2D, 0xE7, 0xEB, 0x20, 0x8E, 0xE5, 0xF6, 0x9E, 0x53, 0x15, 0xCE, + 0xA9, 0x21, 0x18, 0xE3, 0x9B, 0x75, 0x32, 0x02, 0x3D, 0xFC, 0x2C, 0x9D, + 0x85, 0x6A, 0xB2, 0xB9, 0x5D, 0x3A, 0xD1, 0x85, 0xFB, 0xD8, 0xB8, 0x8B, + 0x48, 0x09, 0xD3, 0xFD, 0xED, 0x11, 0xAA, 0x90, 0xB5, 0x25, 0xC8, 0xB9, + 0xA5, 0x49, 0xE9, 0x1E, 0xD0, 0x43, 0xBA, 0x7A, 0x49, 0xB7, 0xE3, 0x87, + 0xBE, 0xE0, 0xF4, 0x83, 0xDA, 0x82, 0x4F, 0x9E, 0xC1, 0x55, 0x57, 0xF2, + 0x58, 0x20, 0x63, 0xCF, 0x2C, 0x34, 0x61, 0x6C, 0x15, 0xEF, 0x11, 0xB3, + 0x7E, 0xA6, 0x13, 0xD9, 0x2F, 0xD1, 0xAD, 0x61, 0xDE, 0x69, 0xB9, 0x9D, + 0x1A, 0x24, 0x72, 0x5D, 0x4E, 0xA0, 0xB4, 0x7E, 0xE9, 0x14, 0x77, 0x4C, + 0xD6, 0xAE, 0xF6, 0x35, 0x69, 0x2D, 0x28, 0x98, 0x29, 0x73, 0xDE, 0x1D, + 0x3D, 0x10, 0x50, 0x8C, 0x55, 0x3D, 0x27, 0x89, 0x57, 0x1F, 0x7B, 0x62, + 0xD9, 0x12, 0xF7, 0x8D, 0xD3, 0x0F, 0x6B, 0x98, 0x6A, 0x64, 0xF7, 0x62, + 0xFB, 0x69, 0x6D, 0x14, 0xF1, 0xF5, 0x6D, 0x5E, 0xC1, 0x79, 0x3C, 0x1D, + 0xDE, 0x45, 0x95, 0xE4, 0x10, 0x70, 0x68, 0x78, 0x0F, 0x70, 0xBE, 0xAC, + 0xFE, 0xD3, 0x6E, 0x5B, 0x9F, 0x7E, 0x2C, 0xD3, 0x0E, 0xC2, 0x6A, 0x96, + 0x4D, 0x11, 0xEA, 0x62, 0x6F, 0xAC, 0xAB, 0xE7, 0x8E, 0x0F, 0xC4, 0xFB, + 0x23, 0x06, 0x7E, 0x0A, 0x87, 0x8E, 0x8D, 0xA8, 0xE9, 0x90, 0x2D, 0xA2, + 0xBF, 0x0B, 0x4C, 0x4C, 0x91, 0xE1, 0x7F, 0x55, 0x7C, 0x01, 0x94, 0xE3, + 0xA1, 0x08, 0xA0, 0x52, 0x8A, 0x2B, 0x0F, 0x5D, 0xD5, 0x70, 0x5F, 0x65, + 0x1C, 0xB9, 0x9B, 0x0C, 0x2B, 0xD6, 0x8E, 0x95, 0x29, 0x6C, 0x69, 0x63, + 0xEA, 0x50, 0xB1, 0x2F, 0xAE, 0x06, 0x14, 0xDD, 0x44, 0x38, 0x59, 0xF4, + 0x35, 0xC6, 0x5B, 0xE9, 0xA8, 0x42, 0x10, 0xB1, 0x3C, 0x56, 0x76, 0x33, + 0x81, 0x88, 0x9D, 0x5B, 0x71, 0xEB, 0xA8, 0x78, 0xA2, 0xC6, 0x37, 0x3E, + 0x75, 0xDB, 0x4F, 0xB5, 0xE6, 0x9E, 0x53, 0x6C, 0x66, 0x65, 0x4C, 0x9F, + 0xF7, 0x52, 0x7A, 0x24, 0x5B, 0x1C, 0xD1, 0x6B, 0xFE, 0xD4, 0x05, 0x22, + 0x5D, 0x4A, 0x85, 0x88, 0x82, 0xF6, 0xF7, 0x25, 0xF5, 0xED, 0xF0, 0xCC, + 0x47, 0xDE, 0x79, 0x9A, 0x88, 0xBE, 0xA1, 0x94, 0xF1, 0x4E, 0x2C, 0xFA, + 0x8C, 0xE5, 0xE0, 0x8C, 0xA1, 0x86, 0xFF, 0x2B, 0x0A, 0x84, 0x1C, 0xBB, + 0x38, 0x49, 0x94, 0x33, 0xBD, 0xBA, 0xAB, 0x8B, 0x66, 0x6D, 0x2C, 0x08, + 0x78, 0x21, 0xB7, 0xDF, 0xAD, 0x17, 0x23, 0xCF, 0x42, 0x4E, 0xBD, 0x4F, + 0x1B, 0x50, 0x9A, 0x55, 0x60, 0x1D, 0x1D, 0x52, 0xAC, 0x3A, 0x70, 0x8E, + 0x20, 0x4C, 0x74, 0x7F, 0xBE, 0xC1, 0xFB, 0xF7, 0x0E, 0x03, 0x90, 0x36, + 0x25, 0x08, 0x10, 0xAD, 0x02, 0xAB, 0x0E, 0xD0, 0x3E, 0xA3, 0xF8, 0x8D, + 0x06, 0x73, 0x09, 0x07, 0x81, 0x1B, 0x07, 0x15, 0x56, 0x13, 0xB4, 0x5A, + 0xBD, 0x88, 0xB5, 0xA8, 0x64, 0xC2, 0x8C, 0x20, 0xDD, 0xA5, 0xD1, 0x3F, + 0x43, 0xEA, 0xD1, 0x64, 0x70, 0x78, 0x66, 0x0F, 0x14, 0xC8, 0x13, 0x30, + 0x74, 0xEE, 0x2D, 0x8C, 0xD3, 0x39, 0x3B, 0xDA, 0x21, 0x64, 0x66, 0x0E, + 0xC0, 0xC2, 0xCF, 0xF9, 0x27, 0xDD, 0x95, 0xDC, 0xA7, 0x2A, 0x72, 0xE2, + 0x2C, 0x60, 0x6F, 0x93, 0x45, 0x36, 0x58, 0x7B, 0xD2, 0x47, 0x88, 0xDF, + 0xCD, 0xD7, 0x76, 0xEC, 0xA6, 0x2C, 0xE4, 0x5E, 0xD9, 0x74, 0xBD, 0x06, + 0xC7, 0xBD, 0xBB, 0x09, 0x87, 0x97, 0x2E, 0x2B, 0x55, 0x48, 0xC1, 0xCD, + 0x58, 0xB0, 0x33, 0x31, 0xD8, 0x19, 0x56, 0x4A, 0x57, 0x33, 0xEA, 0x86, + 0xA7, 0x68, 0x2A, 0xBB, 0x15, 0xC9, 0xB5, 0x9C, 0xCE, 0x77, 0x82, 0xD5, + 0x56, 0xE2, 0x8C, 0xA0, 0xC3, 0x86, 0x0A, 0x61, 0xE4, 0xF8, 0xF6, 0x1F, + 0xA6, 0xE1, 0xD7, 0x96, 0xC9, 0xD7, 0xD7, 0x12, 0xB8, 0x2E, 0xFB, 0x31, + 0x8D, 0xFA, 0x13, 0x4C, 0xE7, 0x82, 0x90, 0xBC, 0x41, 0xA5, 0x9B, 0x55, + 0x24, 0xF5, 0xCE, 0xA6, 0x3D, 0x24, 0xCF, 0xB1, 0x66, 0xF9, 0x51, 0x2C, + 0x86, 0xCD, 0x67, 0x82, 0x3F, 0xA9, 0x29, 0x6B, 0x33, 0x00, 0xD2, 0xBB, + 0x75, 0x12, 0xEC, 0x8F, 0x0E, 0x45, 0x2A, 0x5C, 0x2D, 0x79, 0xC8, 0xFD, + 0x84, 0xE8, 0x29, 0x61, 0x73, 0xFF, 0x9F, 0xB3, 0x23, 0x9C, 0xD5, 0x56, + 0x47, 0x72, 0x71, 0xF3, 0x69, 0xC5, 0xD5, 0x48, 0x6B, 0x12, 0xBF, 0x93, + 0xB0, 0x2F, 0x6F, 0x31, 0xF6, 0xCD, 0x53, 0xAB, 0x9F, 0xA3, 0x61, 0x60, + 0x09, 0x44, 0x27, 0x18, 0x75, 0x90, 0xFA, 0x72, 0x77, 0xC9, 0xC7, 0xFC, + 0x2F, 0x37, 0x9A, 0xC2, 0x94, 0xE9, 0xE0, 0x55, 0x44, 0x15, 0x8A, 0xFC, + 0xE2, 0x68, 0x93, 0x69, 0x68, 0x79, 0xC3, 0x49, 0xF7, 0x6B, 0xCA, 0xE3, + 0xF4, 0x51, 0xDB, 0x05, 0x66, 0xBF, 0x95, 0x80, 0x9B, 0xEA, 0xED, 0xE7, + 0x9A, 0xB6, 0xFF, 0xA1, 0xBB, 0x2D, 0x4B, 0xF9, 0xD1, 0xAC, 0x8C, 0x1B, + 0x8A, 0xF5, 0xEE, 0x37, 0xDF, 0xC8, 0xEA, 0x73, 0x23, 0x74, 0xAE, 0xCE, + 0x5F, 0x9B, 0x08, 0x3D, 0xD9, 0x40, 0xF2, 0x0B, 0x0D, 0x0D, 0x8D, 0x6D, + 0x5C, 0xAB, 0x7B, 0xB3, 0x12, 0x7E, 0xA1, 0xD5, 0xEA, 0xD5, 0xA8, 0x13, + 0xF9, 0x71, 0xE2, 0x3A, 0x5B, 0x35, 0x8C, 0x7A, 0x6F, 0x52, 0xB0, 0xB8, + 0x0F, 0x78, 0x30, 0xF3, 0xD5, 0x8A, 0x93, 0xF6, 0x24, 0x75, 0xBE, 0x18, + 0xB1, 0x81, 0x6A, 0xC3, 0xCC, 0x5B, 0x23, 0x55, 0x9D, 0xEB, 0x5F, 0x25, + 0x76, 0x5C, 0xCD, 0x9E, 0x58, 0x12, 0xFD, 0x49, 0xC5, 0x46, 0xD3, 0x5D, + 0x45, 0xAD, 0xCD, 0xC1, 0x4A, 0xA2, 0x7B, 0xF7, 0x5D, 0x13, 0x97, 0xCF, + 0xB4, 0x94, 0xAA, 0xCD, 0xC9, 0xDC, 0x9C, 0xE4, 0xB1, 0x67, 0xE1, 0x7D, + 0x11, 0x64, 0x2E, 0x13, 0x59, 0x70, 0xB9, 0x27, 0x33, 0x77, 0xB7, 0xC1, + 0xA6, 0x54, 0xAA, 0x43, 0x94, 0xA1, 0x06, 0xA4, 0xDE, 0x8F, 0x0A, 0x9B, + 0xD5, 0x40, 0xBF, 0x7E, 0x69, 0xAA, 0x5C, 0x0A, 0xDC, 0x93, 0xFD, 0x05, + 0x04, 0x6F, 0x9D, 0x1F, 0x42, 0x7D, 0x2A, 0x60, 0x77, 0x87, 0xF4, 0x52, + 0xAB, 0xC3, 0xD5, 0x88, 0xF5, 0x89, 0xA0, 0xC7, 0x6A, 0x48, 0xB9, 0x75, + 0xE5, 0x39, 0x7A, 0x39, 0xC1, 0x25, 0xC6, 0xF8, 0xF6, 0x96, 0x7B, 0x0F, + 0x4B, 0xBC, 0x37, 0x46, 0x9D, 0xA7, 0xA5, 0xDD, 0x71, 0x99, 0xDA, 0x12, + 0x88, 0x18, 0x80, 0x04, 0xF9, 0x5B, 0xDE, 0x01, 0x2C, 0xA2, 0x97, 0xDF, + 0xC9, 0xC3, 0xC8, 0xAB, 0x18, 0x80, 0x3D, 0xDA, 0xD0, 0xD6, 0x9C, 0xDC, + 0xE6, 0xA1, 0x08, 0xD8, 0x63, 0xC0, 0x28, 0x6E, 0x61, 0x33, 0x3F, 0x44, + 0xD0, 0x8B, 0xB9, 0x4D, 0xB5, 0x99, 0x53, 0xE9, 0x20, 0x02, 0x2F, 0x40, + 0xD6, 0x16, 0x32, 0x1E, 0xE7, 0x6D, 0x20, 0xCA, 0x73, 0xC7, 0xCA, 0x3A, + 0x3C, 0x0C, 0xFE, 0xBB, 0xE8, 0xB4, 0x5F, 0x85, 0xA6, 0x33, 0x9C, 0x3D, + 0x4B, 0xD9, 0x94, 0xAA, 0x5D, 0x23, 0xDE, 0xC7, 0x8F, 0xDE, 0xF3, 0x94, + 0x54, 0x56, 0x36, 0x9A, 0x52, 0x18, 0x6A, 0x91, 0x0E, 0x00, 0xD4, 0x2F, + 0xBB, 0x2A, 0x2E, 0xEB, 0x11, 0x05, 0xA5, 0xB3, 0xA9, 0x9A, 0xB1, 0x96, + 0xAB, 0xBB, 0x5F, 0x55, 0x9F, 0x9E, 0xDB, 0x44, 0x44, 0xE7, 0x19, 0x2F, + 0x42, 0xAA, 0x66, 0xA1, 0x8E, 0xFC, 0x4F, 0xD5, 0xBC, 0x6C, 0x70, 0x65, + 0x05, 0x4F, 0x0A, 0xD4, 0xD1, 0x11, 0xA8, 0x24, 0x4A, 0xDD, 0x6C, 0x70, + 0xA4, 0x62, 0xC6, 0x17, 0xB1, 0x55, 0xF1, 0x2D, 0x7B, 0x3D, 0x8F, 0xF9, + 0xB6, 0x86, 0xEF, 0xD7, 0xF2, 0x70, 0x2C, 0xF0, 0x82, 0x3F, 0x2E, 0x05, + 0xC6, 0xFE, 0xD6, 0x14, 0xFA, 0x43, 0xCE, 0x3A, 0xD9, 0xC3, 0x18, 0x42, + 0xF8, 0xE3, 0x92, 0x59, 0x90, 0x5C, 0xE1, 0xBE, 0x30, 0x36, 0xEF, 0x15, + 0x9E, 0xFB, 0x1F, 0xD0, 0x82, 0xCF, 0x34, 0xB8, 0x44, 0xF3, 0x6C, 0x98, + 0x13, 0x9A, 0x25, 0xEC, 0xD7, 0x8C, 0x1B, 0x7D, 0x92, 0x91, 0xBB, 0x39, + 0xD9, 0x5C, 0x76, 0xBA, 0x5D, 0x8B, 0xA3, 0xF3, 0x48, 0x72, 0x7D, 0xAE, + 0x6E, 0x2B, 0x41, 0x6D, 0xCA, 0xDC, 0xBA, 0xD4, 0x01, 0x47, 0x5E, 0x92, + 0xDA, 0x8F, 0x06, 0xAF, 0xB5, 0x76, 0xDE, 0xA2, 0xC0, 0x64, 0x1A, 0xB3, + 0x5F, 0xA1, 0x16, 0xCF, 0x77, 0x48, 0x1E, 0x5C, 0x7F, 0xCD, 0x03, 0xA1, + 0x2F, 0x83, 0x8C, 0x1B, 0x6B, 0xFD, 0x9B, 0x67, 0x32, 0x7E, 0xBE, 0x9E, + 0xE0, 0x82, 0x75, 0x7E, 0xAC, 0xD7, 0x3F, 0x26, 0x53, 0xB8, 0x83, 0x15, + 0x16, 0x49, 0x70, 0x01, 0x6F, 0x22, 0x3D, 0x9B, 0x56, 0x61, 0x96, 0x59, + 0x05, 0x98, 0x0F, 0xA5, 0x76, 0x26, 0x5D, 0xFE, 0x92, 0x0E, 0xF4, 0xAC, + 0x73, 0x40, 0xEF, 0xEB, 0x56, 0x14, 0xCD, 0x8D, 0x94, 0x8E, 0x34, 0xBF, + 0x5B, 0xA0, 0xD0, 0xE3, 0xBA, 0xF3, 0x1F, 0x0D, 0x40, 0xD0, 0xE4, 0x53, + 0x00, 0xCB, 0x30, 0x4A, 0x8C, 0xA2, 0x95, 0xCC, 0xB0, 0x36, 0xE3, 0x51, + 0x19, 0x00, 0xBE, 0x86, 0x91, 0x7F, 0x15, 0x1B, 0xF1, 0x9D, 0x37, 0x9C, + 0x24, 0xCB, 0x7F, 0xFB, 0x96, 0x22, 0x49, 0xC0, 0x5F, 0x12, 0xE8, 0x97, + 0x00, 0xCB, 0x09, 0x2B, 0x10, 0x82, 0x88, 0xEA, 0x83, 0x79, 0x50, 0xA5, + 0x78, 0x40, 0x61, 0xD3, 0xB7, 0x28, 0x55, 0xC9, 0x16, 0xFA, 0x31, 0xA0, + 0x38, 0xCE, 0x89, 0x36, 0xA3, 0x75, 0xC0, 0x13, 0xF0, 0xB1, 0xD9, 0x0B, + 0x83, 0x92, 0x84, 0xEC, 0xF8, 0x42, 0x26, 0xF8, 0xA1, 0xDE, 0x4F, 0xC1, + 0xE9, 0x22, 0x74, 0xA1, 0x11, 0x93, 0x3F, 0x98, 0x5C, 0x7D, 0x84, 0xC1, + 0x66, 0xD0, 0xDC, 0x7E, 0x5A, 0x9B, 0xF1, 0xBD, 0x46, 0xBA, 0x2B, 0xD9, + 0xCA, 0x80, 0xDA, 0x3D, 0x04, 0xE1, 0xBE, 0x74, 0x1F, 0x83, 0x6C, 0xD1, + 0x1C, 0xC5, 0x6F, 0x1D, 0x1E, 0xF3, 0x29, 0x93, 0x12, 0xFB, 0x19, 0xCF, + 0xB7, 0xA0, 0xF6, 0x21, 0x24, 0x5E, 0x1D, 0xD9, 0x1C, 0x66, 0x21, 0xE9, + 0xC8, 0x54, 0xDB, 0x5B, 0x81, 0x4B, 0xDB, 0xE0, 0x36, 0x88, 0xC5, 0x5F, + 0x0B, 0xA2, 0xBD, 0x8D, 0x6B, 0x14, 0x46, 0xA0, 0xE0, 0x37, 0x1D, 0x11, + 0xB0, 0x15, 0x53, 0xF5, 0xBF, 0xF8, 0x0F, 0x6E, 0xCB, 0x42, 0xE2, 0xFC, + 0xE5, 0xBB, 0xFB, 0x8F, 0x98, 0x23, 0x21, 0xC2, 0x69, 0x6D, 0x13, 0x2A, + 0x55, 0xEF, 0x32, 0xBF, 0x9E, 0xC3, 0x74, 0x55, 0x0D, 0xA3, 0xF8, 0x56, + 0xC0, 0xE1, 0x25, 0x91, 0x78, 0x79, 0x6D, 0xEA, 0xEB, 0xCF, 0x48, 0x82, + 0xB0, 0xEB, 0x44, 0x0C, 0xB6, 0xF6, 0x21, 0x9D, 0xD2, 0xF4, 0x67, 0xC1, + 0x93, 0x55, 0x48, 0x35, 0xB3, 0xE0, 0x62, 0x86, 0x9C, 0x5C, 0xF1, 0x4C, + 0xB5, 0x2A, 0xAF, 0x3D, 0x42, 0xFD, 0x6F, 0x95, 0x4F, 0x00, 0xE9, 0x42, + 0x20, 0x6E, 0x8B, 0x51, 0xFF, 0xD4, 0xD8, 0xCE, 0x76, 0xE4, 0xE8, 0x9F, + 0x2B, 0x0E, 0x47, 0x12, 0xC4, 0xEF, 0xAB, 0x91, 0xCF, 0x37, 0x4F, 0x52, + 0x29, 0x75, 0xC3, 0xC0, 0xB8, 0xF4, 0x04, 0x9E, 0xA9, 0x86, 0x6B, 0x93, + 0x21, 0x7A, 0x11, 0x26, 0x33, 0xC0, 0x0A, 0x7B, 0xED, 0x0F, 0x2B, 0x9F, + 0x91, 0xE3, 0x19, 0x47, 0xD8, 0xD8, 0x0D, 0xCB, 0x6D, 0xC0, 0xAC, 0xEB, + 0xEB, 0x59, 0xA6, 0x44, 0x56, 0xE3, 0x95, 0xB6, 0x2A, 0xBA, 0xBC, 0x65, + 0x5B, 0x0C, 0x9E, 0x04, 0xDE, 0x65, 0x8E, 0x29, 0x73, 0x18, 0x0B, 0xC7, + 0xA3, 0x76, 0x43, 0xD4, 0x07, 0xF0, 0x3B, 0x09, 0xCC, 0xF7, 0x10, 0x57, + 0x9C, 0x05, 0x2A, 0xC5, 0x8C, 0x53, 0xE3, 0xA9, 0xA6, 0x20, 0x0B, 0x71, + 0xAF, 0x4B, 0x95, 0x8F, 0xB1, 0xA6, 0x96, 0xDC, 0xFC, 0x85, 0xC5, 0x94, + 0xBF, 0x86, 0xA6, 0x88, 0xC9, 0xEB, 0x04, 0x2A, 0x3B, 0xF8, 0x17, 0x07, + 0x7D, 0x0F, 0x89, 0x44, 0x3D, 0x97, 0xA1, 0x8A, 0x4E, 0x2E, 0x8F, 0x9C, + 0xB8, 0x6C, 0xA0, 0x50, 0x5D, 0xC4, 0x22, 0xDF, 0xF0, 0x5A, 0xD2, 0xF4, + 0x3F, 0x20, 0xFD, 0xAA, 0x6E, 0x04, 0xF3, 0xFA, 0x2E, 0x5D, 0x6F, 0x6B, + 0x2A, 0xE9, 0x77, 0x16, 0x65, 0xB7, 0x1B, 0xDC, 0x8F, 0x58, 0x2F, 0x32, + 0x9D, 0x57, 0xB7, 0x64, 0xD0, 0x77, 0x6E, 0xE7, 0x03, 0x39, 0xB0, 0xDF, + 0x19, 0x97, 0x29, 0xCA, 0xFE, 0xFC, 0xB6, 0x21, 0xD0, 0x2C, 0x07, 0x36, + 0x1D, 0x72, 0x07, 0x9B, 0xEB, 0xED, 0x1B, 0xB9, 0xD3, 0x87, 0xF8, 0x33, + 0x94, 0x42, 0xAF, 0x91, 0x7C, 0x43, 0x91, 0xAF, 0x33, 0x22, 0x5E, 0x48, + 0xE6, 0x73, 0xF6, 0xB6, 0x00, 0xAC, 0x29, 0x88, 0xCB, 0x45, 0x31, 0x3D, + 0xF8, 0x24, 0x98, 0x3F, 0xD9, 0x21, 0xAA, 0x6D, 0xCA, 0x49, 0x53, 0xC5, + 0x20, 0x48, 0xA7, 0xCE, 0x5B, 0x9C, 0x23, 0x54, 0x51, 0xFC, 0xB6, 0x7A, + 0x61, 0x4E, 0xDE, 0xE2, 0x82, 0xE8, 0xE0, 0xEC, 0xE3, 0x65, 0xA6, 0xB5, + 0x5E, 0x0F, 0x5A, 0xDC, 0xB2, 0x9D, 0x4B, 0x5D, 0x35, 0x71, 0xDB, 0x9F, + 0x9D, 0x5F, 0xB6, 0x56, 0x17, 0x02, 0x69, 0x65, 0x1C, 0x5E, 0xC2, 0x81, + 0x0D, 0x5D, 0x4A, 0x0F, 0x25, 0x89, 0x60, 0x06, 0xEB, 0xEB, 0x1C, 0x8D, + 0x8C, 0x2F, 0xBD, 0xD2, 0x68, 0xB6, 0xE5, 0x86, 0xCA, 0xEC, 0x85, 0x3F, + 0x69, 0x90, 0x45, 0xC3, 0x70, 0x57, 0x72, 0x3E, 0xCD, 0xAA, 0xAE, 0xA2, + 0x46, 0xEE, 0x70, 0xBE, 0x30, 0xEC, 0x6F, 0xA5, 0xC2, 0xCD, 0x5B, 0x1C, + 0x9A, 0x4D, 0xAA, 0x23, 0xE4, 0xC7, 0x4F, 0x9B, 0xF2, 0x19, 0x67, 0x14, + 0x32, 0x66, 0xD8, 0xF2, 0x0D, 0xD6, 0x62, 0xEC, 0x95, 0xF5, 0x50, 0xF3, + 0x98, 0x75, 0xFA, 0xE2, 0xCA, 0x5D, 0x3F, 0x28, 0x7D, 0xD0, 0xE2, 0x34, + 0x40, 0x7B, 0xB5, 0x07, 0x1F, 0x52, 0xEF, 0x2C, 0x3D, 0xAB, 0x3A, 0x72, + 0x45, 0xC5, 0x47, 0x83, 0xFA, 0x5C, 0xE3, 0x66, 0x77, 0x4F, 0x89, 0x7C, + 0xFE, 0x9C, 0xDB, 0x4E, 0xA4, 0xB9, 0xE6, 0xE8, 0x78, 0x50, 0x43, 0x20, + 0x8B, 0x8C, 0x78, 0x27, 0x88, 0x9A, 0x40, 0x89, 0x36, 0x4B, 0x08, 0x2E, + 0xC2, 0x60, 0x51, 0x9C, 0xE8, 0x96, 0x93, 0x8B, 0x69, 0xF7, 0x2A, 0x7E, + 0x9E, 0xF7, 0x4C, 0xFC, 0xD2, 0xF5, 0x97, 0xC2, 0x49, 0x9D, 0x1B, 0xB0, + 0xAA, 0x61, 0x50, 0xD9, 0x06, 0xE7, 0x9E, 0x61, 0x06, 0xB7, 0xD6, 0xDE, + 0x64, 0x2A, 0x9D, 0x1E, 0xF3, 0xFB, 0xD4, 0xC1, 0x49, 0x13, 0x4C, 0xC8, + 0x1C, 0x84, 0x0C, 0xD9, 0xF8, 0x70, 0x7A, 0x57, 0x7B, 0xE5, 0xAA, 0xD7, + 0x0C, 0xD8, 0x90, 0xBB, 0x10, 0x7D, 0x68, 0x76, 0xD9, 0x70, 0xBE, 0x89, + 0x75, 0xF9, 0xE6, 0x67, 0x06, 0x1E, 0x43, 0xAF, 0x44, 0xB0, 0x0C, 0xC8, + 0x69, 0x9B, 0x07, 0x42, 0xAF, 0xB2, 0x87, 0xCE, 0x39, 0xC6, 0xFE, 0xCF, + 0xF9, 0x3F, 0xD0, 0xB6, 0xC5, 0x3C, 0xC4, 0xC9, 0x15, 0x04, 0xA7, 0x4B, + 0xB2, 0xC2, 0x1F, 0x52, 0x08, 0x5E, 0xBB, 0x1C, 0x87, 0x0C, 0xF3, 0xF2, + 0x3D, 0xE2, 0xC3, 0xEC, 0xFD, 0xA6, 0x99, 0x6B, 0x6D, 0x2F, 0xC6, 0xE0, + 0x24, 0xE5, 0xCD, 0xF5, 0x0C, 0x43, 0xDD, 0xDA, 0x85, 0xEF, 0xDD, 0x47, + 0xDD, 0xB0, 0xE5, 0x56, 0x8E, 0xC7, 0x3E, 0x20, 0x29, 0x0F, 0x36, 0x6C, + 0x5C, 0x39, 0x9C, 0x60, 0x9B, 0x42, 0xDE, 0x40, 0x6E, 0xC0, 0x27, 0x76, + 0x68, 0x5C, 0x35, 0xE5, 0x57, 0x1E, 0x27, 0x38, 0x3C, 0x59, 0x17, 0x3E, + 0xC1, 0x77, 0x06, 0x45, 0xBD, 0x5E, 0xFD, 0x13, 0x72, 0x2E, 0xCD, 0x62, + 0x28, 0x63, 0xAF, 0x61, 0x26, 0x67, 0x07, 0x0F, 0xC3, 0xFE, 0xBB, 0x99, + 0x17, 0x6F, 0xBB, 0x82, 0xCC, 0x6E, 0x99, 0xF1, 0x70, 0xAD, 0x4B, 0x78, + 0x1C, 0x44, 0x78, 0x36, 0x05, 0x01, 0x38, 0x1E, 0x8E, 0xB1, 0xCE, 0x2F, + 0xD2, 0x9F, 0x09, 0x4F, 0x01, 0xB1, 0x12, 0xDD, 0x8E, 0x94, 0x51, 0x43, + 0xCD, 0x48, 0xE4, 0x62, 0x71, 0xA5, 0x64, 0xDD, 0xB5, 0x25, 0x2B, 0x67, + 0x97, 0x17, 0xC8, 0xE5, 0xD1, 0x52, 0x0E, 0x2E, 0xD1, 0x7D, 0xA1, 0x0C, + 0x2E, 0x16, 0x91, 0xC2, 0x5D, 0xE0, 0x16, 0x41, 0x91, 0xA9, 0x27, 0x84, + 0x36, 0x1C, 0xC2, 0xAC, 0x10, 0x69, 0x1E, 0x5E, 0x83, 0xE4, 0xA2, 0x9B, + 0xEE, 0x4F, 0xAE, 0xE5, 0xAF, 0x83, 0x6C, 0xD7, 0xF8, 0x24, 0x41, 0x33, + 0x2B, 0x02, 0xD8, 0xBE, 0x77, 0x8D, 0xC4, 0x86, 0xBA, 0x2F, 0xE6, 0x0F, + 0x46, 0xE8, 0x83, 0x38, 0x8E, 0x17, 0x02, 0x98, 0xF7, 0x3B, 0xA0, 0x0C, + 0xDD, 0x34, 0x25, 0x0C, 0x19, 0x94, 0x18, 0xF9, 0xA7, 0xCD, 0x33, 0xED, + 0xD1, 0xA9, 0x8B, 0xB7, 0xEF, 0x6B, 0xF0, 0x1D, 0x71, 0x22, 0x6D, 0xC5, + 0x5B, 0xF0, 0xCA, 0x08, 0xE0, 0xBE, 0x75, 0x76, 0x5E, 0x50, 0x68, 0xA3, + 0xC1, 0x39, 0x08, 0x18, 0x85, 0xA8, 0xC6, 0xDE, 0x50, 0x0E, 0xF0, 0x38, + 0x8B, 0xA9, 0x16, 0xFB, 0x2D, 0x69, 0x16, 0xA2, 0x55, 0x3D, 0x48, 0x82, + 0xD3, 0x14, 0xCA, 0x76, 0x26, 0xA3, 0x61, 0x56, 0xC1, 0x0E, 0xF7, 0xAE, + 0x61, 0xC4, 0xEC, 0xB8, 0x1D, 0x7C, 0x8E, 0x4A, 0x9F, 0xC4, 0x62, 0xB8, + 0x5A, 0x42, 0x5E, 0xA9, 0x5E, 0x20, 0x06, 0x66, 0xBD, 0x53, 0x49, 0x84, + 0x8C, 0xE7, 0xA4, 0xB3, 0xF8, 0x25, 0xA3, 0xF8, 0x49, 0x8B, 0x8F, 0x66, + 0xEF, 0xC9, 0xBF, 0x88, 0x5A, 0xE9, 0x22, 0xDD, 0x38, 0xEE, 0xED, 0x7B, + 0xB7, 0x0C, 0x0A, 0xEC, 0x26, 0x72, 0x5A, 0xE8, 0xAF, 0x62, 0xAE, 0x01, + 0xFA, 0xA0, 0x91, 0x52, 0x55, 0x49, 0x09, 0x5A, 0x4E, 0xC4, 0xB4, 0x78, + 0x8C, 0xAE, 0x4F, 0xED, 0x32, 0x88, 0x55, 0xE1, 0x40, 0xDA, 0x77, 0x1A, + 0x17, 0x00, 0x9C, 0x14, 0xB9, 0x52, 0x94, 0xB3, 0x02, 0x91, 0x03, 0x90, + 0xF4, 0xF1, 0x4C, 0x52, 0x6C, 0x52, 0x39, 0xC5, 0x92, 0xCE, 0x91, 0x42, + 0x27, 0xAE, 0x16, 0x44, 0xCF, 0xE4, 0xB8, 0x51, 0x39, 0x03, 0xC0, 0xEE, + 0xCE, 0xAB, 0x9F, 0x76, 0x75, 0x53, 0xCD, 0x5E, 0x88, 0x54, 0x9F, 0x61, + 0x70, 0xFA, 0xDD, 0x36, 0xFA, 0x37, 0x35, 0x6D, 0xF4, 0x0F, 0x29, 0xC2, + 0x22, 0x40, 0x7B, 0x86, 0x7E, 0xCE, 0x9A, 0xED, 0x1A, 0xDC, 0x49, 0xDE, + 0x7A, 0xCD, 0xCB, 0x0F, 0xAB, 0xFC, 0x97, 0xC8, 0x8B, 0x3A, 0x0A, 0xAB, + 0x23, 0x6D, 0xFC, 0xE9, 0xC4, 0x30, 0x46, 0x30, 0x82, 0x14, 0xFB, 0xBA, + 0x77, 0x6F, 0x16, 0x32, 0xD7, 0xE8, 0xAA, 0x79, 0x3D, 0x0B, 0x91, 0x11, + 0x45, 0x57, 0x05, 0x79, 0x99, 0x12, 0x55, 0x36, 0x5B, 0x06, 0xCA, 0xAA, + 0x82, 0x51, 0x84, 0x8B, 0x20, 0xE9, 0x6A, 0x3A, 0x17, 0x30, 0x30, 0xFD, + 0x99, 0xEC, 0xBD, 0x54, 0xCC, 0x3A, 0xC0, 0xFF, 0x5C, 0x49, 0xE0, 0x6C, + 0x99, 0x0F, 0x48, 0xCD, 0x70, 0x62, 0x7B, 0x69, 0x92, 0x34, 0x2D, 0x44, + 0x63, 0x23, 0x9E, 0x1F, 0x17, 0x7B, 0x2A, 0xF5, 0x06, 0x02, 0x24, 0x21, + 0x51, 0x2E, 0x02, 0x2D, 0x23, 0x51, 0x7C, 0x8E, 0xD3, 0x32, 0xE2, 0x28, + 0x3B, 0x6B, 0x0E, 0x5B, 0x4B, 0xD5, 0x2B, 0x38, 0x1E, 0x5C, 0xC9, 0x31, + 0x88, 0x85, 0xB9, 0xD3, 0x6F, 0x37, 0xAF, 0x93, 0x80, 0xD6, 0x19, 0x31, + 0x9A, 0x98, 0x45, 0xF9, 0x74, 0x30, 0x99, 0x56, 0x29, 0xF3, 0xFA, 0x33, + 0x6A, 0xBB, 0x70, 0x58, 0x53, 0x0E, 0x17, 0x27, 0xDD, 0x3D, 0xE8, 0x07, + 0x85, 0x2A, 0xCB, 0x33, 0x60, 0x23, 0xB0, 0xE9, 0x60, 0x7C, 0xF1, 0x47, + 0x69, 0xE1, 0x69, 0x57, 0x3E, 0x8C, 0x49, 0x30, 0xA3, 0x7A, 0xD6, 0x79, + 0x1F, 0xF9, 0xCF, 0x1C, 0xE1, 0x56, 0xF1, 0x92, 0xC0, 0x66, 0xC7, 0x67, + 0xF0, 0xC6, 0x78, 0x6A, 0x48, 0x26, 0xD4, 0xE9, 0xFA, 0x50, 0x8B, 0xC4, + 0xB1, 0x19, 0x96, 0x1F, 0x0C, 0x67, 0x0A, 0xB0, 0x4B, 0x75, 0x1C, 0xBA, + 0x86, 0x42, 0xE3, 0x2E, 0x0C, 0xF8, 0xFC, 0x19, 0x66, 0x7B, 0x51, 0xDB, + 0x3E, 0xBB, 0xA2, 0xC0, 0xBF, 0x31, 0x9A, 0x8A, 0x3E, 0x4F, 0x24, 0xA0, + 0xD3, 0xDA, 0x15, 0x35, 0x91, 0x10, 0x3F, 0x1B, 0x40, 0x9A, 0x79, 0xB7, + 0xE4, 0x8B, 0x9E, 0xBB, 0xD8, 0x98, 0x31, 0x8C, 0x69, 0xDE, 0x25, 0xFD, + 0x0E, 0x87, 0xC3, 0xD9, 0x8C, 0xAD, 0xC0, 0x95, 0x19, 0x15, 0x18, 0xE1, + 0xBD, 0xB1, 0x4F, 0xD4, 0x94, 0x09, 0x3B, 0xD5, 0x07, 0xC1, 0x72, 0xEE, + 0x33, 0xA2, 0x9E, 0xAA, 0x05, 0x4E, 0xD3, 0xD3, 0x43, 0x43, 0xB9, 0xE6, + 0xBE, 0xCF, 0xE8, 0xE4, 0x00, 0x11, 0x5D, 0xA2, 0x97, 0xAE, 0x1F, 0x3C, + 0x3C, 0x0F, 0xA5, 0x06, 0xE5, 0xF8, 0xDE, 0x94, 0x00, 0xA0, 0x99, 0xD2, + 0x4C, 0x13, 0x05, 0x09, 0xB8, 0x08, 0x61, 0x3A, 0x67, 0xBB, 0x77, 0xA8, + 0x69, 0xA3, 0x8F, 0xF4, 0xF2, 0x2A, 0x6A, 0x88, 0x9E, 0xFD, 0x81, 0xF1, + 0x7B, 0xA7, 0xFA, 0x15, 0xCF, 0x32, 0x04, 0x22, 0xD3, 0x62, 0x4C, 0xF4, + 0x65, 0x76, 0x5C, 0x85, 0x5E, 0x98, 0x18, 0x6A, 0xF8, 0x95, 0xC1, 0x2A, + 0x8E, 0xFF, 0xCD, 0x48, 0x8E, 0x58, 0xE6, 0xCA, 0x8A, 0x8E, 0xA2, 0x0D, + 0x33, 0x35, 0xA0, 0xD3, 0xC6, 0x28, 0x72, 0x63, 0xB4, 0xCB, 0x0A, 0xB1, + 0x47, 0xF8, 0xFC, 0xF1, 0xC3, 0x7A, 0xAD, 0x56, 0x51, 0x4D, 0xE5, 0x53, + 0xB1, 0x3F, 0xC4, 0x2C, 0x7E, 0x93, 0xEB, 0x71, 0x91, 0x06, 0x7C, 0xC7, + 0x4E, 0x1F, 0xC0, 0x3C, 0x70, 0x7C, 0x54, 0x7A, 0xA7, 0x46, 0x92, 0x33, + 0x3C, 0x99, 0x32, 0x07, 0xAE, 0x7F, 0xD9, 0xF0, 0xEE, 0x4E, 0x26, 0xEE, + 0xD7, 0x67, 0xCD, 0xE6, 0x47, 0xD1, 0x1C, 0x17, 0x71, 0x68, 0xAA, 0x07, + 0xA4, 0xF4, 0xD0, 0x87, 0xA3, 0x65, 0x2D, 0xA8, 0x3A, 0x06, 0x7B, 0x23, + 0x6C, 0xA7, 0xD3, 0x4B, 0xE3, 0x46, 0x6C, 0x31, 0x5B, 0x4F, 0x8F, 0xBF, + 0xEB, 0x17, 0x68, 0x05, 0xF3, 0x3D, 0xD9, 0xA1, 0x7B, 0x05, 0x7E, 0x05, + 0x14, 0xEF, 0x00, 0xE2, 0xF6, 0xD3, 0xF1, 0x4C, 0x60, 0xC9, 0x71, 0xBD, + 0x8B, 0x47, 0x84, 0x24, 0x99, 0x94, 0x99, 0x03, 0xB7, 0xE7, 0x1E, 0x8A, + 0x56, 0xE0, 0xCB, 0xD8, 0x12, 0x73, 0x08, 0x3D, 0x31, 0xCF, 0xE2, 0x46, + 0xBF, 0x16, 0x62, 0x13, 0xA3, 0x3B, 0x62, 0x2A, 0x6C, 0xF4, 0x77, 0x90, + 0x04, 0x7A, 0x95, 0x2C, 0x61, 0xD0, 0xA4, 0x84, 0x3F, 0x32, 0x48, 0xBA, + 0xE5, 0xCD, 0x39, 0xF5, 0x5D, 0x5A, 0x3E, 0x0A, 0x4C, 0xBF, 0x0A, 0xEC, + 0xCF, 0x0B, 0xF2, 0xEA, 0x38, 0x17, 0x36, 0xDB, 0xD6, 0x2D, 0x48, 0x78, + 0xBB, 0x20, 0x5F, 0x5F, 0xDF, 0x63, 0x6D, 0xF5, 0x3D, 0x74, 0xA8, 0xE1, + 0xE4, 0x4C, 0x87, 0x65, 0x78, 0x1B, 0x5B, 0xC6, 0xEE, 0x37, 0x69, 0x39, + 0x8C, 0xD6, 0x3C, 0x24, 0x6B, 0xFE, 0x4A, 0xC9, 0x13, 0xF8, 0x33, 0x2C, + 0xDB, 0xA3, 0x7A, 0xE3, 0x6C, 0x76, 0x18, 0x01, 0x62, 0x95, 0x67, 0x4A, + 0xB5, 0xE7, 0xF4, 0xD7, 0x63, 0x74, 0x2F, 0xE0, 0x57, 0x3B, 0x3C, 0x33, + 0xC6, 0x06, 0x03, 0xD7, 0x93, 0x0F, 0x8D, 0xDD, 0x57, 0xC3, 0x0C, 0x50, + 0xBC, 0x08, 0xF6, 0x98, 0xA1, 0x04, 0x1D, 0xC8, 0x46, 0x02, 0x2E, 0x2D, + 0x3D, 0xF1, 0xCD, 0x4B, 0x9B, 0x3F, 0x0C, 0xBC, 0xD3, 0x2F, 0x87, 0xE7, + 0x50, 0xA1, 0x7B, 0x94, 0xC5, 0xCD, 0xEC, 0xE9, 0x29, 0xE7, 0x6C, 0xD4, + 0xC1, 0x18, 0xA4, 0xCA, 0x4F, 0x00, 0x4E, 0xF9, 0x36, 0x89, 0xFD, 0x07, + 0x47, 0xE6, 0xD5, 0xB7, 0xAA, 0x34, 0x7C, 0x16, 0x7B, 0xCB, 0x49, 0x92, + 0xF2, 0x03, 0x66, 0x8E, 0xEF, 0x11, 0xFC, 0x8F, 0x26, 0xA5, 0x78, 0x9A, + 0x4B, 0x29, 0xC7, 0x98, 0x15, 0xA1, 0x35, 0x58, 0x0C, 0xD5, 0xF8, 0x6F, + 0x50, 0x1C, 0xDC, 0x41, 0x20, 0xCC, 0x2A, 0x42, 0xE1, 0xEF, 0x28, 0x22, + 0x67, 0x89, 0x71, 0x5B, 0x9B, 0xBA, 0x92, 0xED, 0x1C, 0xB6, 0x9C, 0x89, + 0xD4, 0x00, 0x21, 0xD3, 0xF1, 0xD9, 0x3E, 0x9B, 0x55, 0x71, 0xF7, 0x75, + 0x26, 0x5A, 0x13, 0x65, 0xBF, 0x6E, 0x46, 0x90, 0x85, 0x7B, 0xD7, 0xD4, + 0xDC, 0x90, 0x23, 0x4C, 0x83, 0x12, 0x87, 0x7D, 0x8D, 0xF2, 0x39, 0x4E, + 0x9A, 0xA0, 0x4A, 0xDE, 0xAB, 0xCA, 0xA7, 0xCB, 0xBD, 0x1A, 0xA5, 0x3F, + 0x54, 0x12, 0x92, 0x6F, 0xEF, 0x37, 0x88, 0xDD, 0x52, 0xDB, 0xD0, 0x8F, + 0xEA, 0xCD, 0x88, 0x69, 0x8C, 0x44, 0x6A, 0xF3, 0xD0, 0x61, 0x8B, 0x20, + 0x91, 0x17, 0x32, 0x32, 0xBE, 0x39, 0x42, 0xE7, 0x1C, 0x3E, 0x8A, 0x02, + 0x58, 0x95, 0x76, 0x45, 0x3A, 0x06, 0x28, 0xE0, 0x7A, 0x47, 0x23, 0x87, + 0xB1, 0x5F, 0xF0, 0xE1, 0x2D, 0x18, 0xA4, 0x9B, 0xE7, 0x90, 0xB3, 0xFC, + 0x96, 0x2D, 0xAA, 0x04, 0x72, 0x39, 0xCA, 0xF6, 0x8B, 0xFE, 0x5D, 0xF8, + 0xAA, 0xFF, 0xBE, 0x94, 0xE3, 0xEF, 0xF2, 0x74, 0x22, 0xD4, 0x8C, 0x82, + 0x2C, 0x73, 0x8B, 0xB8, 0x39, 0x35, 0xCF, 0xCB, 0x48, 0xE8, 0xAC, 0x05, + 0x49, 0xEE, 0x08, 0x30, 0xFF, 0x99, 0x48, 0xE1, 0x66, 0xDD, 0x01, 0xD9, + 0x39, 0x22, 0xDE, 0x2C, 0x1C, 0x47, 0x08, 0xA3, 0x97, 0xFE, 0x02, 0x8C, + 0x6B, 0x9E, 0xBF, 0xC4, 0x46, 0xAB, 0x94, 0x6D, 0x86, 0xC2, 0x45, 0x95, + 0xB9, 0x1D, 0x15, 0x89, 0xA9, 0x76, 0x7A, 0xDD, 0x11, 0xDC, 0x54, 0x4E, + 0x37, 0x96, 0x1E, 0x37, 0xE2, 0xB4, 0xE0, 0xD8, 0xB6, 0xBC, 0xF8, 0xA4, + 0x47, 0xC5, 0x6E, 0x33, 0x8F, 0xC2, 0x5C, 0x3B, 0x8E, 0x51, 0x01, 0x10, + 0xF1, 0x08, 0x10, 0xD8, 0x47, 0x38, 0xF4, 0x28, 0x22, 0x0E, 0x21, 0x96, + 0x8B, 0x89, 0xA6, 0x43, 0x6B, 0xDA, 0xBC, 0xD5, 0xDC, 0x74, 0x74, 0xC6, + 0x64, 0xCA, 0x6A, 0x42, 0x7C, 0x24, 0x80, 0x40, 0x1F, 0x82, 0x19, 0x25, + 0xB7, 0x97, 0x40, 0x78, 0x16, 0x18, 0x71, 0x5C, 0x44, 0xCD, 0x1B, 0x9F, + 0xC9, 0xE0, 0xA6, 0x3F, 0xF4, 0xAA, 0x2B, 0x4E, 0xC2, 0x12, 0x24, 0x3F, + 0x98, 0xAD, 0x54, 0x84, 0xAF, 0x72, 0xA9, 0xBF, 0x61, 0x85, 0xA1, 0x95, + 0xD8, 0xC1, 0x72, 0x4B, 0x02, 0x21, 0x38, 0x7E, 0x29, 0xA8, 0x90, 0xBA, + 0x9A, 0xF9, 0x4D, 0xB4, 0xFC, 0xAC, 0xB8, 0x27, 0x77, 0xA0, 0xBE, 0x1E, + 0x45, 0xFE, 0x2B, 0x49, 0x8E, 0x48, 0x66, 0xD5, 0x97, 0x1B, 0x21, 0x65, + 0x4F, 0xA5, 0x7E, 0xF8, 0x7E, 0x89, 0xB6, 0x1B, 0x4F, 0xB1, 0x2E, 0xC2, + 0x84, 0x50, 0xB6, 0xC7, 0xD5, 0xBC, 0xEE, 0x86, 0xBE, 0xB7, 0x27, 0xDB, + 0xE8, 0xF3, 0x49, 0x02, 0xBF, 0xB1, 0x33, 0x71, 0x5D, 0xA3, 0x3D, 0x28, + 0x7E, 0x24, 0x76, 0x0E, 0x29, 0xAA, 0x65, 0xC8, 0x0B, 0xD2, 0xE1, 0xF1, + 0x36, 0x03, 0x2C, 0x28, 0x92, 0x3A, 0x42, 0x5A, 0xF8, 0x20, 0xEE, 0x43, + 0xB6, 0x56, 0x12, 0xA9, 0x2B, 0x8A, 0xC5, 0x5D, 0x7B, 0x77, 0x76, 0xC3, + 0x9B, 0x80, 0xD9, 0x30, 0x7F, 0xE5, 0x0F, 0x2B, 0x6A, 0x87, 0x29, 0xEF, + 0x51, 0xED, 0x8C, 0x27, 0x2D, 0xD3, 0x9E, 0xEC, 0x4D, 0x3A, 0xDA, 0x65, + 0xB6, 0x17, 0xD1, 0x73, 0xEE, 0xE7, 0x94, 0x07, 0x12, 0x79, 0x9F, 0xF4, + 0xA0, 0x0C, 0x7F, 0x95, 0xBB, 0x28, 0xF9, 0xE3, 0x5F, 0x46, 0xB5, 0xC6, + 0x0C, 0x4A, 0x18, 0xCB, 0x79, 0xA6, 0x90, 0x36, 0xC5, 0xF7, 0x08, 0x36, + 0xD2, 0xE7, 0x73, 0x21, 0x59, 0x8F, 0xF5, 0xC8, 0x89, 0xB1, 0x09, 0x11, + 0x03, 0xCD, 0xA4, 0xB7, 0x64, 0x04, 0x4A, 0xF4, 0x69, 0x06, 0x89, 0x66, + 0x9E, 0xB1, 0x96, 0x1C, 0x55, 0x22, 0x3F, 0x70, 0xBE, 0x72, 0x3D, 0x7C, + 0xBC, 0x18, 0x8F, 0xEF, 0x69, 0x91, 0x76, 0x75, 0x21, 0x20, 0x01, 0xAB, + 0x44, 0x60, 0x13, 0x6A, 0xBC, 0xB5, 0x0B, 0x95, 0x3E, 0xE4, 0xA3, 0x4E, + 0x18, 0xD6, 0xBC, 0x51, 0x3C, 0xE2, 0x3D, 0x71, 0x70, 0xFB, 0xBF, 0xAD, + 0x5F, 0x57, 0xB6, 0x6E, 0x9F, 0xBE, 0x70, 0x69, 0x53, 0xEE, 0x34, 0x53, + 0x9D, 0xE5, 0xBD, 0x51, 0x9D, 0x1D, 0xEA, 0xBC, 0xD8, 0x89, 0x98, 0xC1, + 0x26, 0xCF, 0x0F, 0x65, 0x71, 0xFE, 0x3B, 0x89, 0x9B, 0x5E, 0xAF, 0x6C, + 0xFD, 0xB2, 0x53, 0x88, 0x42, 0x7C, 0xFB, 0x87, 0x49, 0x69, 0x4D, 0x7D, + 0xC9, 0x76, 0xA7, 0x84, 0x10, 0xFF, 0xF8, 0x63, 0x64, 0xB1, 0xF2, 0x7D, + 0x72, 0x79, 0xD8, 0xF1, 0x8B, 0xB6, 0xA3, 0x80, 0xEF, 0x15, 0x92, 0x40, + 0xBE, 0x01, 0x05, 0xCB, 0xA8, 0x07, 0x0C, 0xE0, 0xEE, 0x8F, 0xEA, 0xF6, + 0x62, 0x9B, 0x4C, 0x89, 0xC4, 0x0D, 0xBC, 0x55, 0x32, 0x91, 0xCC, 0x68, + 0xD7, 0x40, 0x54, 0x13, 0x1D, 0xD9, 0x96, 0x49, 0xB6, 0x63, 0xCB, 0xF3, + 0x3E, 0x4C, 0xA1, 0xE3, 0xDA, 0xD1, 0x7C, 0x88, 0x2D, 0xB5, 0xED, 0x6F, + 0x9D, 0x85, 0x91, 0x3A, 0x5B, 0x80, 0xBB, 0xB8, 0x3B, 0x7E, 0xD2, 0x4B, + 0xE1, 0xDF, 0x2A, 0x32, 0x5B, 0x2C, 0xED, 0xB4, 0x39, 0xD2, 0x46, 0xB9, + 0x3F, 0x4F, 0x98, 0xB5, 0xB7, 0xB7, 0x16, 0xE9, 0xB1, 0x2A, 0xD5, 0x3A, + 0x1B, 0xC1, 0xC4, 0xA4, 0xEB, 0x15, 0x86, 0x86, 0x2E, 0x51, 0xA6, 0xCE, + 0x9D, 0xEB, 0x47, 0x15, 0x7F, 0x37, 0x1B, 0x3E, 0x26, 0xED, 0x17, 0xE4, + 0x23, 0xE2, 0x7E, 0xDA, 0x03, 0xC8, 0x94, 0xE0, 0x50, 0x6C, 0x8C, 0x68, + 0xCE, 0x04, 0x24, 0x7F, 0x67, 0x0D, 0x2F, 0x77, 0xF7, 0x07, 0x75, 0x33, + 0xFE, 0x4C, 0x1B, 0x2C, 0x53, 0x19, 0x47, 0xFA, 0x4E, 0x1F, 0x5D, 0x2E, + 0x80, 0x2E, 0x9E, 0xE5, 0xA6, 0x4E, 0x41, 0x45, 0x8C, 0x63, 0xA4, 0x4C, + 0x5E, 0x19, 0x04, 0x51, 0x6A, 0xAF, 0x6E, 0x4F, 0xBB, 0xA8, 0xAB, 0x87, + 0xD4, 0xD7, 0x99, 0x59, 0x77, 0x54, 0x0E, 0x10, 0xE8, 0x7B, 0xC5, 0x7B, + 0x6D, 0x13, 0xA8, 0x58, 0xB7, 0x67, 0xD6, 0x23, 0xF1, 0x97, 0xC6, 0xB1, + 0xFE, 0x83, 0xE8, 0xBB, 0xC1, 0xD2, 0x26, 0x83, 0xDD, 0x8E, 0x86, 0x4F, + 0x69, 0xE5, 0xC4, 0x72, 0x56, 0x98, 0x0A, 0xB1, 0x58, 0x03, 0x4E, 0x14, + 0xCD, 0x25, 0x65, 0xEF, 0x31, 0xD0, 0x68, 0x45, 0x9C, 0x42, 0x84, 0xB8, + 0xC9, 0x8F, 0xB0, 0xF8, 0xF1, 0xD2, 0x45, 0x75, 0xD3, 0x4F, 0x13, 0x52, + 0xD3, 0x8F, 0xF3, 0x8A, 0x3F, 0x73, 0xF0, 0x56, 0x24, 0x1B, 0x77, 0xFC, + 0xE4, 0xCC, 0x42, 0x57, 0x8F, 0xF8, 0xE8, 0x4C, 0x53, 0x5F, 0x22, 0x35, + 0xDD, 0x6E, 0x33, 0x11, 0xC8, 0xB2, 0xEB, 0xFF, 0x9B, 0x0F, 0xC7, 0x20, + 0xED, 0x6F, 0x70, 0xC8, 0x8D, 0x1E, 0xDE, 0x2F, 0x0E, 0x19, 0x50, 0xA2, + 0xF1, 0x4F, 0x90, 0x56, 0x07, 0x63, 0x0A, 0x8D, 0xE2, 0x6E, 0xAE, 0x95, + 0x68, 0xCA, 0xEA, 0x78, 0x0C, 0xB1, 0xA4, 0x30, 0x14, 0x77, 0x48, 0x0C, + 0x51, 0xD9, 0xE5, 0x30, 0x7C, 0xCE, 0x77, 0xBA, 0xC7, 0x34, 0x9D, 0x25, + 0x4D, 0xCF, 0x21, 0xE2, 0xCF, 0x50, 0xBA, 0x2A, 0x32, 0xC7, 0x66, 0x07, + 0xBA, 0x46, 0xE6, 0x69, 0xDE, 0x46, 0xDF, 0x03, 0x28, 0x51, 0xFE, 0x11, + 0x1C, 0x33, 0xBC, 0x4F, 0xD4, 0x2E, 0xC3, 0x7A, 0xED, 0x2A, 0xCE, 0xCA, + 0x34, 0xE8, 0x4F, 0x65, 0x8E, 0xF3, 0x77, 0x05, 0x67, 0xFB, 0xD5, 0x1D, + 0x5C, 0x94, 0xB5, 0x27, 0xA9, 0x61, 0xF7, 0x99, 0x15, 0x77, 0x2B, 0xA0, + 0xB1, 0xB4, 0x3B, 0x72, 0x33, 0x67, 0xA7, 0x70, 0xFB, 0x60, 0x72, 0x04, + 0xC4, 0x88, 0x4C, 0xA5, 0x1C, 0xEF, 0x17, 0x66, 0x74, 0xAE, 0xBC, 0x01, + 0xC3, 0x2F, 0x0D, 0xD6, 0x12, 0xDF, 0x4F, 0x2C, 0x63, 0xC1, 0x79, 0xF8, + 0x50, 0xC9, 0x52, 0x34, 0xA0, 0x6E, 0x73, 0xBA, 0x5A, 0x31, 0x22, 0xF3, + 0xC5, 0x98, 0xB0, 0x18, 0xD8, 0x7B, 0x2B, 0x06, 0x47, 0x9D, 0x50, 0xE6, + 0x16, 0xBF, 0x59, 0xC9, 0x34, 0xF0, 0x51, 0x58, 0x60, 0xD8, 0xEE, 0x83, + 0xC8, 0x8B, 0x1E, 0x92, 0x8F, 0xF0, 0xDF, 0x12, 0x61, 0xCC, 0x69, 0x21, + 0x68, 0xE8, 0x78, 0xB8, 0xF2, 0xF0, 0xDE, 0xE7, 0xAB, 0x8A, 0xA4, 0x38, + 0x32, 0x06, 0xAE, 0xCD, 0x53, 0x92, 0xE4, 0x9B, 0x2C, 0xC1, 0x63, 0x30, + 0x29, 0xB5, 0x12, 0x21, 0x99, 0xCA, 0x99, 0x94, 0x92, 0x71, 0xFB, 0x0A, + 0x31, 0xEF, 0xBF, 0xE2, 0x52, 0x2B, 0xA5, 0xCE, 0x16, 0x5D, 0x15, 0x4A, + 0x25, 0xCF, 0x74, 0x96, 0x9A, 0x95, 0x21, 0x2C, 0xEA, 0xB7, 0xA1, 0xAE, + 0xD4, 0x15, 0x29, 0x38, 0xF9, 0x7B, 0x6C, 0xD7, 0x3A, 0x52, 0xFD, 0x60, + 0xA2, 0xD0, 0xEE, 0xA5, 0xDF, 0x4C, 0xC6, 0xBF, 0x30, 0x82, 0x20, 0xB6, + 0x73, 0x58, 0xC8, 0x7B, 0xA8, 0xEA, 0x01, 0x9B, 0xEA, 0x02, 0x89, 0xD0, + 0x83, 0x71, 0x14, 0x98, 0xB0, 0x6E, 0x5B, 0x80, 0xB4, 0xBA, 0x4D, 0xC5, + 0x95, 0x77, 0x5A, 0x44, 0x56, 0x74, 0x12, 0x48, 0xBC, 0xAE, 0x92, 0xCF, + 0x5A, 0xF9, 0x62, 0xE8, 0x72, 0xA5, 0x72, 0x5B, 0x58, 0xC6, 0x14, 0x29, + 0xF1, 0xC4, 0xD6, 0xC6, 0x75, 0x71, 0x9C, 0xC4, 0x7D, 0xC5, 0x93, 0x26, + 0xA2, 0x9B, 0x1C, 0x30, 0xE8, 0x41, 0xC7, 0x03, 0x66, 0x98, 0x2C, 0x10, + 0x34, 0x6A, 0x0E, 0xC2, 0x35, 0x53, 0xAA, 0x17, 0x3E, 0xF4, 0xCB, 0x9C, + 0xC4, 0x1E, 0xB4, 0x79, 0x0B, 0xA0, 0x41, 0x4B, 0xC6, 0xB4, 0xAC, 0x5F, + 0xDA, 0x48, 0x01, 0x0D, 0xBF, 0xDF, 0x6A, 0x0E, 0x42, 0x16, 0xFC, 0x97, + 0x58, 0x98, 0x04, 0xDA, 0x46, 0x1E, 0x37, 0x55, 0x77, 0x2A, 0xB8, 0x58, + 0x6B, 0x9E, 0x55, 0x2E, 0xF6, 0x52, 0x17, 0x38, 0xE1, 0xA7, 0xD9, 0xA0, + 0x08, 0xF3, 0x3E, 0x0B, 0xE4, 0x10, 0x37, 0x2A, 0x16, 0x54, 0x63, 0x1E, + 0x5A, 0x43, 0xC7, 0xDE, 0xA3, 0xE9, 0x3B, 0x85, 0x3A, 0xFB, 0x03, 0xE9, + 0xDE, 0xD9, 0x1C, 0xDD, 0x9B, 0x56, 0x4F, 0x70, 0x77, 0xDD, 0xF3, 0xBA, + 0x0F, 0xA4, 0x0F, 0x12, 0x5A, 0x1C, 0xF4, 0x32, 0xE8, 0x58, 0x6C, 0x23, + 0xC5, 0x46, 0x2E, 0x1C, 0xCA, 0xE0, 0x99, 0x27, 0x77, 0xC8, 0x14, 0xD3, + 0x34, 0xA4, 0xEA, 0xDD, 0x76, 0x3C, 0x91, 0x39, 0x96, 0x2A, 0xEE, 0x63, + 0x05, 0x6A, 0x2D, 0x65, 0x48, 0x88, 0xE6, 0x9D, 0x26, 0xE3, 0x95, 0xD6, + 0xFC, 0x86, 0xC8, 0x41, 0xB5, 0x14, 0x99, 0x2C, 0x35, 0x8C, 0xBD, 0xA8, + 0x28, 0x1D, 0xF7, 0x74, 0x00, 0x36, 0xCA, 0xE8, 0xBB, 0x28, 0x35, 0x03, + 0x10, 0x23, 0xEC, 0x82, 0x4C, 0x32, 0x59, 0xAB, 0x6B, 0x01, 0x2B, 0x42, + 0xEB, 0x67, 0x4D, 0x49, 0x80, 0x47, 0x7C, 0xD0, 0xFE, 0x48, 0xB5, 0xC8, + 0xB3, 0xF3, 0x06, 0x37, 0x13, 0x65, 0xF1, 0x53, 0x9C, 0x24, 0x00, 0x29, + 0x41, 0x8E, 0x97, 0xE7, 0x47, 0x21, 0xF8, 0xB6, 0xEF, 0xC1, 0x08, 0xAC, + 0x8B, 0xF3, 0xDF, 0xD1, 0x9B, 0xED, 0x16, 0xEA, 0x5C, 0x3C, 0x39, 0xF6, + 0xB9, 0x0F, 0x0D, 0xC1, 0x0C, 0x79, 0xB4, 0xFA, 0xEC, 0x7F, 0xD2, 0xE0, + 0x80, 0xEC, 0xF1, 0x88, 0xBE, 0x68, 0xA8, 0xD1, 0x38, 0xB5, 0xFE, 0xB5, + 0xED, 0x1A, 0xB1, 0x8D, 0xBC, 0x50, 0x9B, 0xA5, 0x40, 0x45, 0xB4, 0x94, + 0x25, 0xF8, 0xA5, 0xEB, 0x88, 0x00, 0xC8, 0xCA, 0xBA, 0x86, 0xF6, 0xB6, + 0xDA, 0xC0, 0xF3, 0x42, 0xDA, 0xE4, 0x16, 0xB1, 0x3A, 0xC1, 0xAB, 0x29, + 0xF8, 0xD2, 0xCF, 0xB6, 0x24, 0xBD, 0xE9, 0xA7, 0x18, 0xA7, 0xED, 0x80, + 0x0B, 0x0A, 0x91, 0xD7, 0x8C, 0xC9, 0x60, 0x5F, 0x73, 0xBE, 0x7C, 0x12, + 0x26, 0xED, 0xC5, 0xA4, 0x55, 0x83, 0x55, 0x93, 0x74, 0xF7, 0x1B, 0x05, + 0x8B, 0xBA, 0x88, 0x1D, 0x42, 0x9A, 0x15, 0x78, 0x9F, 0xE9, 0x62, 0x95, + 0x65, 0xD5, 0x16, 0x02, 0x1F, 0xCA, 0x13, 0xA8, 0x52, 0x84, 0xBF, 0xAD, + 0xE5, 0xDD, 0xDB, 0x18, 0xB5, 0x37, 0x8D, 0x70, 0x5E, 0xF9, 0xE3, 0xC2, + 0x33, 0x1F, 0xCC, 0x97, 0x52, 0x35, 0x13, 0xD9, 0xD0, 0x29, 0x44, 0x0B, + 0xD8, 0xBD, 0xB2, 0x93, 0x6C, 0x2C, 0xAC, 0x7B, 0x14, 0x94, 0x67, 0xCC, + 0x65, 0x5E, 0x78, 0x53, 0x82, 0x72, 0xFE, 0xFB, 0xD9, 0x04, 0x5F, 0x90, + 0x6C, 0xB0, 0xFB, 0x80, 0x6C, 0x7D, 0x0B, 0x62, 0x8B, 0x7B, 0x73, 0x7D, + 0x1F, 0x6B, 0x93, 0x7D, 0x07, 0x66, 0x98, 0xBB, 0xB2, 0x49, 0xB3, 0x34, + 0x10, 0xBB, 0x23, 0x2B, 0x14, 0xA0, 0xB4, 0x4A, 0xC1, 0x56, 0x7B, 0x47, + 0xD4, 0x49, 0x97, 0x4D, 0x69, 0x9C, 0xFC, 0x7C, 0xF2, 0x87, 0xF4, 0x8B, + 0xA4, 0xD6, 0xF8, 0xAE, 0x3B, 0x8F, 0x9A, 0x5B, 0x90, 0x29, 0x9C, 0xD9, + 0xE2, 0xA9, 0xA2, 0x60, 0x52, 0x4A, 0x1F, 0xE5, 0x6E, 0x7C, 0x49, 0xEC, + 0x83, 0xA8, 0x0E, 0x79, 0x5B, 0x0A, 0x1F, 0x53, 0xDB, 0x6C, 0xEF, 0x78, + 0x2D, 0x52, 0xBA, 0x00, 0x3A, 0x49, 0xB2, 0xB1, 0x56, 0x1C, 0x3B, 0x7E, + 0x99, 0x9C, 0x20, 0xB7, 0xC7, 0x9E, 0x8B, 0x8C, 0x88, 0xF2, 0x15, 0xFF, + 0x4F, 0x06, 0xF4, 0x1B, 0x6F, 0x02, 0x1E, 0x3A, 0x29, 0xA0, 0x7B, 0xFA, + 0x2C, 0x26, 0x58, 0xE3, 0x75, 0x5F, 0xB8, 0x94, 0x27, 0x70, 0xF6, 0xA5, + 0x79, 0x51, 0x0F, 0x72, 0x52, 0x81, 0xDC, 0xDC, 0x74, 0x93, 0xAF, 0xB4, + 0xB5, 0x9F, 0xF2, 0x03, 0x4F, 0x79, 0x0A, 0xC5, 0xB9, 0xC7, 0x3E, 0x12, + 0x53, 0x3A, 0x63, 0x6A, 0x8A, 0x27, 0xB6, 0x9D, 0x4C, 0x84, 0x87, 0x92, + 0xBF, 0x7D, 0x49, 0x52, 0xAF, 0x10, 0xCD, 0x6C, 0x58, 0xC5, 0xF0, 0xFE, + 0x59, 0x5C, 0xA8, 0x5A, 0xDE, 0x0E, 0x19, 0x23, 0x3F, 0x01, 0x87, 0xFD, + 0x95, 0xA8, 0x61, 0x90, 0x06, 0x49, 0x77, 0xD8, 0xAD, 0xC4, 0x5D, 0x72, + 0x65, 0x5D, 0x2A, 0x48, 0x70, 0xE1, 0x37, 0x2C, 0x20, 0x50, 0x24, 0xC4, + 0xE7, 0x74, 0x91, 0x30, 0x91, 0x0E, 0xA3, 0x8B, 0x73, 0x6C, 0x31, 0xE1, + 0xAF, 0xC7, 0x8C, 0x37, 0xF8, 0x22, 0x71, 0x36, 0xCA, 0xE0, 0xE1, 0x41, + 0xF6, 0x74, 0x26, 0x17, 0x08, 0xC2, 0xD9, 0xB5, 0xCE, 0x4A, 0x67, 0x17, + 0xC2, 0x54, 0xA0, 0x1F, 0x22, 0xFF, 0x8D, 0xB6, 0x60, 0x26, 0x7B, 0x7B, + 0x05, 0x0D, 0x69, 0xAE, 0x6F, 0x09, 0x78, 0x9D, 0xD0, 0x2C, 0x59, 0xB1, + 0xE7, 0xAB, 0x9F, 0x5F, 0x0C, 0xB7, 0xB4, 0x98, 0x47, 0x85, 0x28, 0x24, + 0x74, 0x05, 0x79, 0xC8, 0x37, 0xDB, 0x2D, 0x71, 0xBA, 0x70, 0x24, 0x1D, + 0xC6, 0x4C, 0x23, 0xF6, 0xFE, 0xE5, 0x47, 0x33, 0xA2, 0xAE, 0x44, 0xB1, + 0x64, 0x5D, 0xAB, 0xA3, 0xD5, 0xF1, 0x91, 0x12, 0xA1, 0x12, 0x42, 0xFC, + 0xF5, 0xE7, 0x15, 0x57, 0x1F, 0x3F, 0x08, 0x7F, 0xD4, 0x5D, 0x0B, 0x97, + 0x43, 0x0B, 0xF3, 0x36, 0x54, 0xF6, 0x0A, 0x54, 0xE4, 0x77, 0xBE, 0xDF, + 0x8A, 0xCA, 0xC2, 0x43, 0x5F, 0x4A, 0x32, 0xBC, 0x9A, 0x20, 0x27, 0xB3, + 0xB9, 0x2F, 0xA7, 0x92, 0x8E, 0xDD, 0x12, 0x15, 0x27, 0x5A, 0x0D, 0xD6, + 0x5E, 0xC7, 0xDE, 0xFB, 0x78, 0xE6, 0x63, 0x5E, 0x07, 0x35, 0xC7, 0xAE, + 0x04, 0xC0, 0x14, 0xDB, 0x26, 0x45, 0x4D, 0x57, 0x91, 0x4A, 0xB5, 0xDE, + 0xF8, 0x40, 0xE1, 0xE4, 0x6C, 0x32, 0xCC, 0x37, 0x44, 0x34, 0x05, 0xC8, + 0xC3, 0x49, 0x28, 0xFA, 0xED, 0x93, 0x08, 0x10, 0xA8, 0x8B, 0x00, 0x8C, + 0x4D, 0xF5, 0x23, 0xB1, 0x47, 0x2E, 0x2E, 0x6B, 0xC8, 0x18, 0x89, 0x86, + 0x59, 0xBA, 0xC7, 0x3F, 0x1C, 0xD5, 0x24, 0x35, 0xBC, 0x37, 0x46, 0x7F, + 0xB3, 0x7E, 0xEF, 0x35, 0xA9, 0x1C, 0x2D, 0x8F, 0x10, 0x11, 0x07, 0x8B, + 0x5C, 0x1C, 0x4C, 0x42, 0xC6, 0xE6, 0x17, 0x32, 0xF1, 0xBF, 0x61, 0x7A, + 0x75, 0x3E, 0x02, 0x58, 0xE1, 0x6B, 0x59, 0x1E, 0xFF, 0x16, 0xC8, 0x65, + 0xAF, 0xF1, 0xB1, 0x14, 0x86, 0x84, 0xC1, 0x03, 0x7A, 0x75, 0x7B, 0x9E, + 0x6B, 0xD2, 0x4C, 0x39, 0xD0, 0x01, 0x71, 0xB7, 0xFA, 0x36, 0x78, 0x59, + 0xB5, 0xF0, 0x63, 0xF1, 0x24, 0xD1, 0x10, 0x37, 0x92, 0xF6, 0x0F, 0x58, + 0x7A, 0xC7, 0xCE, 0xB5, 0xC9, 0x79, 0x1C, 0x38, 0x36, 0x07, 0x34, 0x99, + 0xCE, 0xC4, 0x97, 0x98, 0x7C, 0xA0, 0xA7, 0xD0, 0x04, 0x2B, 0x5F, 0x10, + 0xC9, 0xE8, 0x7A, 0xF6, 0x5C, 0xFC, 0xAC, 0xF4, 0x6F, 0x2E, 0x6B, 0xB7, + 0xE8, 0xC5, 0x26, 0xC5, 0xB1, 0x38, 0x8E, 0x5B, 0x81, 0x90, 0x1C, 0x38, + 0xB8, 0x8F, 0xD0, 0x82, 0x1B, 0xF0, 0x4A, 0x0C, 0x46, 0x8B, 0xED, 0x49, + 0x21, 0xD9, 0x6D, 0x17, 0x29, 0xA1, 0xBB, 0x59, 0xDE, 0x98, 0x24, 0xDF, + 0xAE, 0x07, 0xC5, 0x92, 0xD2, 0xC9, 0x92, 0x00, 0x8F, 0xB0, 0xB0, 0x36, + 0x58, 0xFA, 0xB8, 0xB0, 0x43, 0x17, 0xB0, 0xA3, 0x3B, 0xAF, 0x39, 0xB8, + 0x31, 0x8A, 0x38, 0xBF, 0xD2, 0xEE, 0x06, 0x0B, 0xB6, 0x99, 0x00, 0x41, + 0xF5, 0x72, 0x9A, 0x9C, 0x1F, 0xBA, 0xFB, 0x22, 0xB3, 0xA5, 0x8A, 0x11, + 0x7B, 0xF2, 0x53, 0xEB, 0x90, 0x60, 0x72, 0x3C, 0xC3, 0x56, 0xAC, 0xBD, + 0xE2, 0xFA, 0xBF, 0x37, 0xB8, 0x9F, 0xDD, 0x4E, 0xF1, 0x05, 0x9E, 0x65, + 0x3B, 0x45, 0x89, 0xA5, 0xD3, 0xA3, 0xBA, 0xD4, 0x1C, 0xCA, 0x0C, 0xCE, + 0xDC, 0x5C, 0x66, 0xFE, 0x4B, 0x44, 0x1A, 0xC9, 0xB0, 0x52, 0x02, 0xCD, + 0x47, 0x89, 0x90, 0x2E, 0xA4, 0x3F, 0xEC, 0x90, 0xCD, 0x84, 0xF3, 0x58, + 0x6B, 0x24, 0xBA, 0x03, 0xBC, 0x57, 0x1B, 0xA2, 0xAC, 0xF2, 0x80, 0x0F, + 0x26, 0x04, 0x59, 0xA2, 0x74, 0x07, 0x03, 0xFD, 0xC4, 0x57, 0x29, 0xCF, + 0x90, 0xF7, 0xD3, 0x58, 0x4A, 0x71, 0x69, 0x7C, 0x7F, 0x52, 0x77, 0x1B, + 0x0D, 0xFF, 0x0A, 0x59, 0x80, 0x4E, 0x3F, 0xE8, 0x82, 0xB6, 0xA5, 0x68, + 0x9C, 0x62, 0x3A, 0x6C, 0x71, 0x3A, 0xCA, 0x23, 0x6E, 0x03, 0xB1, 0x50, + 0x32, 0x13, 0x27, 0x81, 0xCB, 0x68, 0x42, 0x7D, 0x32, 0x23, 0x4F, 0x85, + 0x39, 0x76, 0x8C, 0x8F, 0xB0, 0x73, 0xD3, 0xED, 0x56, 0xF0, 0xC6, 0x66, + 0x01, 0x13, 0xB4, 0x13, 0x95, 0x8E, 0x49, 0x22, 0x4F, 0x5D, 0xFF, 0xDB, + 0xAE, 0x50, 0x71, 0x6E, 0xC2, 0xA2, 0xA7, 0x70, 0xEE, 0xDB, 0xB5, 0x18, + 0x1E, 0x4C, 0x0F, 0x57, 0xC7, 0x4E, 0x46, 0xDD, 0x78, 0x5F, 0x1A, 0xEE, + 0x02, 0xAC, 0x80, 0xE4, 0xA8, 0x38, 0x67, 0xAD, 0x5C, 0xF7, 0x00, 0xC5, + 0xCA, 0x0B, 0x52, 0x49, 0x94, 0x43, 0x97, 0x90, 0x46, 0xF5, 0x1A, 0xA5, + 0x21, 0x7E, 0x05, 0xAC, 0xF1, 0x97, 0x66, 0x42, 0xFB, 0x5D, 0x4F, 0x71, + 0x4B, 0x8E, 0x3E, 0xC3, 0x9E, 0x14, 0xF7, 0xAD, 0xDE, 0x34, 0xEB, 0x9C, + 0x06, 0xB1, 0x8A, 0xE2, 0x9D, 0xA6, 0x25, 0xFD, 0x1B, 0x69, 0xDF, 0x41, + 0x60, 0xBF, 0xA4, 0x04, 0x5C, 0xF7, 0x76, 0xFD, 0x22, 0x30, 0x0C, 0x63, + 0xDB, 0xAD, 0x42, 0xA8, 0x0A, 0x97, 0xE7, 0xF0, 0x57, 0x9D, 0x17, 0x6B, + 0x37, 0x5D, 0x35, 0xC9, 0x5F, 0xAC, 0xF6, 0xB8, 0x89, 0x41, 0xB0, 0x6F, + 0x49, 0xA8, 0x47, 0x61, 0xB1, 0x63, 0x65, 0x40, 0x07, 0xD8, 0xC5, 0x5A, + 0x5D, 0x1D, 0x82, 0x7F, 0xCC, 0x6A, 0xF2, 0xA1, 0x36, 0x3C, 0xC0, 0x51, + 0x6E, 0xD3, 0x4B, 0x36, 0xE0, 0x07, 0xCE, 0xA3, 0x9B, 0xB1, 0x13, 0x04, + 0x32, 0x87, 0x75, 0x4A, 0x16, 0x34, 0xB4, 0x75, 0x0F, 0x75, 0x33, 0x7C, + 0xEC, 0x02, 0x35, 0xA9, 0x49, 0x39, 0xF6, 0x24, 0x03, 0x73, 0xCE, 0x54, + 0x45, 0x02, 0x6C, 0x0A, 0x53, 0x2B, 0x73, 0x38, 0x3C, 0x81, 0x56, 0xA7, + 0xBB, 0xF2, 0x73, 0x0F, 0xC7, 0xB7, 0x0E, 0xAA, 0x45, 0x62, 0xA6, 0x29, + 0x8C, 0xC9, 0x0D, 0x45, 0x0E, 0xBD, 0xDB, 0xD8, 0x71, 0x5C, 0xD7, 0x18, + 0xFC, 0xB0, 0x61, 0x89, 0xA2, 0x22, 0xF4, 0xF5, 0x48, 0x38, 0xE8, 0x7F, + 0x17, 0x5C, 0x82, 0xF6, 0x2D, 0x1F, 0x28, 0x85, 0xD9, 0xB7, 0x16, 0xA4, + 0x52, 0x6F, 0x3A, 0xF1, 0xEE, 0xA7, 0x2D, 0x99, 0x71, 0xAD, 0xAA, 0x15, + 0x24, 0xD8, 0x86, 0x1D, 0x78, 0x90, 0x0B, 0x4C, 0x4E, 0x78, 0xC1, 0xC2, + 0xD7, 0xED, 0xE6, 0xB4, 0xF0, 0xAC, 0x2A, 0xFD, 0xE6, 0x75, 0xBA, 0xCA, + 0x0C, 0xAD, 0xD6, 0x3D, 0x38, 0x4D, 0x1F, 0xE9, 0x7D, 0x87, 0xA8, 0xCA, + 0x13, 0x1A, 0xFA, 0x72, 0x53, 0x8E, 0xB2, 0x2F, 0xE3, 0xAD, 0xAA, 0x8E, + 0x7A, 0xBA, 0x6A, 0xBC, 0x2C, 0x8E, 0xBA, 0xD5, 0x0B, 0x3E, 0x2F, 0x4D, + 0xB3, 0xC4, 0xF6, 0x6F, 0x01, 0xEF, 0x90, 0x60, 0xC9, 0x3D, 0xD2, 0x93, + 0x45, 0x03, 0xCB, 0x65, 0x11, 0xE1, 0xAD, 0x7A, 0x90, 0xCE, 0xFA, 0x41, + 0x05, 0x45, 0x55, 0x10, 0xE9, 0x44, 0xBF, 0x59, 0x58, 0xC2, 0x71, 0xDB, + 0x00, 0xBA, 0x0C, 0x32, 0x08, 0xF9, 0xB1, 0x58, 0xFA, 0xE6, 0x45, 0xFD, + 0x0B, 0xBC, 0x23, 0xB7, 0x82, 0xE1, 0x89, 0x3A, 0x1F, 0xA1, 0xDA, 0xD2, + 0x27, 0x7A, 0x0C, 0x18, 0xA1, 0x1D, 0x02, 0xD0, 0x59, 0xEE, 0xA8, 0x42, + 0xF4, 0x67, 0x02, 0x0A, 0xC1, 0xB0, 0xC2, 0x3E, 0x8E, 0x86, 0xAD, 0xB5, + 0x3B, 0x78, 0x05, 0xBE, 0x51, 0x12, 0xBF, 0x50, 0x58, 0xBD, 0xF3, 0x94, + 0xFB, 0x02, 0x04, 0x38, 0x5F, 0xFD, 0xDC, 0x7D, 0xCB, 0xDA, 0x26, 0x36, + 0x79, 0x5C, 0x89, 0x52, 0xB8, 0xF8, 0x96, 0x4B, 0xA9, 0x49, 0x43, 0xB5, + 0x32, 0x22, 0x40, 0x27, 0x67, 0xFE, 0x46, 0xB9, 0x0B, 0x17, 0x75, 0x4B, + 0xEB, 0x08, 0xA1, 0xDE, 0xC6, 0x7E, 0xD5, 0xAF, 0x4A, 0x69, 0xAA, 0x8C, + 0xA1, 0x74, 0x33, 0x54, 0x33, 0x47, 0x62, 0x00, 0xE8, 0x63, 0x76, 0x4C, + 0xE7, 0x76, 0xEE, 0x78, 0x5A, 0xB8, 0x44, 0x4A, 0x8F, 0x0D, 0xD7, 0x32, + 0xC4, 0xB9, 0xB0, 0x1A, 0xF9, 0x58, 0x8F, 0x9E, 0x06, 0x9F, 0x87, 0x9D, + 0x29, 0x1E, 0xBF, 0xA5, 0xFD, 0xA6, 0xCD, 0xF9, 0xD8, 0x6D, 0x01, 0xCC, + 0x0F, 0xF6, 0x52, 0xCB, 0xFA, 0xE0, 0xA5, 0x2D, 0xCC, 0xB9, 0xA0, 0xB1, + 0x9D, 0xD3, 0x09, 0x24, 0x34, 0xD7, 0x01, 0x15, 0x3D, 0xEB, 0x0F, 0x07, + 0xAC, 0x3A, 0x94, 0xCC, 0xAA, 0x52, 0x1E, 0xBD, 0x4C, 0x49, 0xCD, 0x22, + 0x85, 0x89, 0x47, 0x27, 0x21, 0x4E, 0x96, 0x41, 0x94, 0x6F, 0xFF, 0x2E, + 0x69, 0x3A, 0x6B, 0xA7, 0x74, 0xBA, 0x9B, 0xEB, 0x25, 0x5E, 0xA9, 0x5A, + 0xE0, 0x66, 0x59, 0xF6, 0x18, 0x5B, 0x77, 0xDF, 0x8E, 0x56, 0x67, 0x52, + 0x2C, 0xDA, 0x0C, 0xB0, 0xF2, 0xF8, 0xB9, 0xE2, 0x80, 0xB4, 0x2A, 0x6E, + 0xFF, 0x81, 0xC2, 0x72, 0x7C, 0xEE, 0x71, 0xC7, 0x06, 0xF5, 0x61, 0xAC, + 0xFC, 0x77, 0x84, 0xD4, 0xEB, 0x41, 0x95, 0x7F, 0xEE, 0xD0, 0xDD, 0x91, + 0x20, 0xAE, 0xF9, 0xBE, 0xF8, 0x30, 0xF3, 0x25, 0x57, 0xA4, 0x1D, 0xDB, + 0x0F, 0xD3, 0x5A, 0xA7, 0x93, 0x1B, 0x83, 0x4B, 0x62, 0xD4, 0x4C, 0xA1, + 0xD6, 0x34, 0x0D, 0xBC, 0x36, 0x00, 0x35, 0x65, 0x61, 0x14, 0x48, 0x03, + 0x4B, 0xB5, 0xBB, 0xFA, 0x5D, 0xB0, 0x2D, 0xCA, 0x8E, 0x54, 0x2A, 0xBA, + 0x77, 0xA4, 0xE4, 0x94, 0x31, 0x21, 0x0B, 0xDB, 0x04, 0xA2, 0x6B, 0xEB, + 0x80, 0xF2, 0x71, 0xD9, 0x2E, 0xDA, 0x8C, 0x61, 0xA5, 0x79, 0x48, 0x7F, + 0x70, 0xFB, 0x04, 0xF5, 0xB8, 0xA0, 0xCD, 0x1D, 0xB0, 0xBF, 0x62, 0x29, + 0xC1, 0xAB, 0xB1, 0xA1, 0xD8, 0x6E, 0x48, 0xC7, 0x0B, 0x20, 0x1A, 0xF6, + 0xD6, 0xB2, 0x37, 0xD2, 0xA3, 0xCC, 0x84, 0x33, 0xBD, 0x90, 0xFE, 0x23, + 0x10, 0x9A, 0x41, 0x0A, 0xBA, 0xB3, 0xE6, 0x75, 0x62, 0x7D, 0x91, 0x82, + 0x1C, 0x45, 0xBB, 0x24, 0xD3, 0x67, 0xDA, 0xB2, 0xA5, 0xE5, 0x0F, 0xDF, + 0x0B, 0x58, 0xDA, 0x25, 0xEB, 0x02, 0x66, 0xE1, 0x5C, 0xEA, 0x3E, 0x6B, + 0x32, 0xFF, 0xFA, 0x8A, 0x6F, 0x91, 0x23, 0x3E, 0x52, 0xD5, 0x84, 0x30, + 0xA4, 0x15, 0xB5, 0x04, 0xCC, 0xCE, 0x10, 0x9F, 0x04, 0xD2, 0x53, 0x94, + 0xB9, 0x01, 0x71, 0x0D, 0xA2, 0xA0, 0xCB, 0x8F, 0x9C, 0xA3, 0x49, 0x6C, + 0x2A, 0x3E, 0x88, 0xC3, 0x39, 0x05, 0x99, 0x57, 0xAE, 0xEA, 0x38, 0x78, + 0xF9, 0x4C, 0x49, 0x1D, 0xCE, 0x32, 0x10, 0x4A, 0x10, 0x24, 0x5D, 0x16, + 0xBE, 0x82, 0x40, 0x28, 0xC5, 0xC4, 0xC9, 0x4E, 0xE0, 0xF9, 0x68, 0xB8, + 0x83, 0x68, 0xAC, 0x2F, 0x74, 0xB1, 0x9B, 0x52, 0xFC, 0x0D, 0x31, 0xBB, + 0xF2, 0xB0, 0x24, 0x94, 0x78, 0x8C, 0x39, 0xEC, 0xA7, 0xDE, 0x3F, 0xF4, + 0xC7, 0xC8, 0x4A, 0x3B, 0x37, 0x42, 0x41, 0x46, 0x4B, 0x5D, 0x53, 0x6C, + 0x45, 0xB2, 0x2A, 0x6E, 0x6A, 0x4A, 0x8F, 0xDD, 0x56, 0x1E, 0xAA, 0xB2, + 0x41, 0x60, 0xDC, 0xE7, 0x45, 0x86, 0xFD, 0xE2, 0xCE, 0xD9, 0x9B, 0x98, + 0x39, 0x4E, 0xBE, 0x2B, 0x89, 0x2E, 0xEF, 0xCB, 0xE4, 0x4D, 0xCD, 0x00, + 0x0A, 0x8E, 0x69, 0xAD, 0x36, 0x0A, 0xBB, 0xCC, 0x5E, 0x8F, 0x5D, 0x12, + 0x30, 0x6E, 0xEF, 0xAE, 0x4E, 0xAD, 0xFE, 0xF8, 0x3D, 0x71, 0x61, 0x75, + 0x37, 0x5B, 0x61, 0xC7, 0x1B, 0x38, 0xFB, 0x16, 0x19, 0xD7, 0x82, 0x5F, + 0x98, 0x4E, 0xDF, 0x7E, 0xAD, 0x24, 0x38, 0x6E, 0xCF, 0xA6, 0xD0, 0x93, + 0xBE, 0x70, 0x16, 0x1C, 0x01, 0x29, 0xA9, 0x67, 0xD9, 0x08, 0x22, 0x48, + 0xDD, 0x1E, 0x82, 0x13, 0xB7, 0xA7, 0xFD, 0x74, 0xAE, 0xA2, 0xE4, 0xEA, + 0x60, 0xB8, 0xD1, 0x43, 0xDA, 0x35, 0xFF, 0x76, 0xF8, 0xF5, 0x91, 0x5F, + 0xB7, 0xEF, 0x21, 0x81, 0xA1, 0x8B, 0x88, 0xE7, 0x4E, 0xA4, 0x12, 0xDC, + 0x3C, 0x35, 0xA8, 0x9D, 0x27, 0x78, 0x1F, 0x48, 0xE7, 0x54, 0x4C, 0x98, + 0x7B, 0x13, 0x1F, 0x42, 0xD4, 0x36, 0x55, 0xDB, 0x96, 0x74, 0xE4, 0xDA, + 0xF2, 0xE3, 0xCC, 0xC1, 0xC8, 0x23, 0x4D, 0x90, 0x51, 0x77, 0x0B, 0xA3, + 0x4D, 0x0C, 0xDD, 0x19, 0x87, 0x13, 0x15, 0xDB, 0x4F, 0x39, 0x8B, 0x48, + 0x25, 0x85, 0x3B, 0x02, 0x1E, 0x73, 0x83, 0xEF, 0xBD, 0x5A, 0x13, 0x06, + 0xAD, 0xAB, 0x90, 0xD9, 0x9F, 0xBC, 0x59, 0xE7, 0x0A, 0xA8, 0xB6, 0xEF, + 0xAD, 0xB5, 0x37, 0x7B, 0x9D, 0xAA, 0xAC, 0x9C, 0xC7, 0x0F, 0x7B, 0x34, + 0x78, 0x83, 0x51, 0xCB, 0x5B, 0xD3, 0xFE, 0x14, 0x0E, 0xB1, 0x31, 0xAB, + 0x78, 0x9F, 0xDE, 0x3F, 0xDF, 0x05, 0x96, 0xA4, 0xA3, 0x44, 0x3B, 0x5F, + 0x20, 0x80, 0x5C, 0xE5, 0x02, 0xFF, 0xD2, 0xD3, 0xB9, 0x0A, 0xFD, 0x39, + 0x97, 0x39, 0x68, 0x43, 0x2E, 0x73, 0x18, 0x29, 0xFC, 0x9B, 0x2D, 0x03, + 0x4B, 0x93, 0xD0, 0x57, 0x82, 0x82, 0x14, 0x4C, 0xD3, 0x87, 0x21, 0x39, + 0x9E, 0x2B, 0x15, 0x6C, 0xCE, 0xB6, 0xB4, 0x69, 0x17, 0xE9, 0xD5, 0xA0, + 0x67, 0xED, 0x47, 0xAF, 0xAE, 0xFD, 0xBC, 0xA6, 0xAA, 0xC3, 0xEA, 0x86, + 0xF5, 0x5E, 0x2A, 0xA9, 0x41, 0xF9, 0x4D, 0x70, 0x77, 0x43, 0xBF, 0x31, + 0xCC, 0x02, 0x06, 0x31, 0xCB, 0x9C, 0x47, 0xD6, 0xAF, 0x79, 0x5B, 0xE3, + 0x0B, 0xA9, 0xCB, 0xBF, 0x42, 0xC4, 0x3E, 0xC2, 0x13, 0x3D, 0x5B, 0x5C, + 0x23, 0x82, 0xF3, 0x57, 0x08, 0xA7, 0x0A, 0x06, 0x73, 0xC3, 0x13, 0x86, + 0xE0, 0x24, 0xAC, 0x45, 0xA6, 0x93, 0x2D, 0x69, 0xA4, 0x13, 0x28, 0x18, + 0x7D, 0x92, 0xFB, 0x51, 0x3F, 0x9B, 0x62, 0xFD, 0x51, 0xA9, 0xDA, 0xFC, + 0x4A, 0xA0, 0x9D, 0xFC, 0x15, 0xE1, 0xFA, 0x19, 0x08, 0xD3, 0xB7, 0xE3, + 0x1F, 0xA5, 0x53, 0xA1, 0xFE, 0xFF, 0xA5, 0xF3, 0x28, 0x9D, 0x26, 0x12, + 0xED, 0xD2, 0x3C, 0xFA, 0x7E, 0x7C, 0x20, 0x8D, 0x9D, 0x4E, 0xD8, 0x6A, + 0xBD, 0xEE, 0xF8, 0x31, 0x29, 0xDF, 0x36, 0xC7, 0x2B, 0x5F, 0x45, 0xB7, + 0x9B, 0xAE, 0x33, 0x95, 0xE3, 0xE3, 0x9F, 0x0C, 0x9C, 0xEB, 0xCE, 0xD3, + 0xF2, 0x05, 0x3D, 0xDC, 0x0A, 0xD5, 0x7C, 0xF8, 0x4A, 0xDA, 0xEB, 0xA9, + 0x47, 0x90, 0xA1, 0x2B, 0x3E, 0xE3, 0x46, 0xFE, 0x44, 0xE4, 0x90, 0x55, + 0xD7, 0x3C, 0x36, 0xAF, 0xCE, 0x42, 0x1C, 0xC8, 0xD7, 0xF2, 0xAB, 0x02, + 0x4E, 0x6F, 0x3F, 0xA5, 0x71, 0x9B, 0xB4, 0x67, 0x65, 0x17, 0x06, 0x4C, + 0x7A, 0x0E, 0xF5, 0x22, 0x46, 0x11, 0x55, 0x21, 0xD8, 0x27, 0x16, 0x1D, + 0xB4, 0xF1, 0xA8, 0x5B, 0x9D, 0xA4, 0x4B, 0xD6, 0xEC, 0xC7, 0x20, 0x37, + 0x93, 0x20, 0x40, 0x12, 0x88, 0x9A, 0xE9, 0xDA, 0x63, 0x1A, 0xA4, 0xA6, + 0xE1, 0x3E, 0x04, 0xE2, 0x9C, 0x74, 0xDF, 0x7C, 0x4C, 0x34, 0xED, 0x58, + 0xAC, 0x6B, 0x55, 0x85, 0x9A, 0xC6, 0x9E, 0x3F, 0x00, 0x2F, 0x2E, 0x03, + 0xED, 0x48, 0xDD, 0xC2, 0x49, 0xF5, 0x2B, 0x64, 0x76, 0xD7, 0xF5, 0x2F, + 0xC3, 0xE0, 0xE8, 0x56, 0x4D, 0xD4, 0x64, 0x1B, 0xBB, 0xD3, 0x1B, 0x21, + 0x1F, 0x01, 0x4C, 0x32, 0xD2, 0xCC, 0xFD, 0xF5, 0x38, 0x99, 0xBC, 0x40, + 0x05, 0xE2, 0x02, 0xCB, 0x28, 0x92, 0xE5, 0x5D, 0xFF, 0x2A, 0xBC, 0xFF, + 0x98, 0x01, 0x7C, 0xEF, 0x04, 0x36, 0x50, 0xFC, 0x61, 0x35, 0xC6, 0xC1, + 0xB2, 0x1B, 0xCD, 0x8C, 0x38, 0x42, 0xBD, 0x8F, 0x84, 0x06, 0xBE, 0x4C, + 0x3F, 0xBE, 0xF0, 0xA2, 0x0A, 0x92, 0x4E, 0xD4, 0x87, 0x7E, 0x8A, 0x11, + 0x0B, 0x75, 0xF6, 0x5A, 0xBD, 0x3B, 0xB5, 0x9B, 0xFF, 0x39, 0x5E, 0x7E, + 0x3C, 0xA1, 0xBD, 0x76, 0xAF, 0xCB, 0x1B, 0xA5, 0x48, 0x35, 0x83, 0x89, + 0xCF, 0xB4, 0x18, 0x37, 0xFB, 0x95, 0x34, 0x4F, 0x39, 0x29, 0x17, 0x9C, + 0xBB, 0xDC, 0xF7, 0x68, 0x1B, 0xFB, 0x95, 0x42, 0xED, 0xA6, 0xFE, 0xE2, + 0xBE, 0x06, 0xDB, 0xE1, 0x6B, 0xC9, 0x54, 0x2F, 0xA3, 0x75, 0x91, 0xBE, + 0xE0, 0x55, 0x6B, 0xA5, 0xD8, 0x0E, 0xD0, 0xD0, 0x08, 0x64, 0xEE, 0xFC, + 0xEE, 0x7E, 0x39, 0xAC, 0x94, 0x9C, 0x3F, 0x77, 0xF2, 0xDA, 0xF5, 0xBE, + 0x9F, 0x91, 0x63, 0x68, 0xB6, 0xE2, 0x06, 0xAD, 0x8B, 0x1B, 0xDB, 0xE9, + 0x0D, 0x87, 0x6F, 0x78, 0x6B, 0x51, 0x86, 0xE1, 0x44, 0x91, 0xD7, 0x62, + 0x1D, 0x7F, 0x88, 0xE8, 0x2A, 0xAD, 0x19, 0x01, 0x02, 0x76, 0x05, 0x43, + 0xBE, 0x1A, 0xB8, 0x36, 0xC2, 0x0D, 0x24, 0x90, 0x2E, 0x13, 0xCF, 0xFC, + 0x0C, 0x3E, 0x18, 0x9D, 0xBF, 0x16, 0x1E, 0xAB, 0x22, 0x5B, 0xF8, 0x72, + 0xE0, 0xDF, 0xF9, 0x51, 0x73, 0xB2, 0x54, 0x99, 0x32, 0x00, 0x4E, 0x06, + 0x3F, 0xAA, 0x1F, 0xE5, 0x6C, 0xF0, 0x1D, 0xF5, 0xA0, 0x10, 0x2B, 0x63, + 0x1C, 0x65, 0xAA, 0xC6, 0x8C, 0x8D, 0x7D, 0xE5, 0xA8, 0x98, 0xBD, 0x0E, + 0xE4, 0xCF, 0x06, 0x28, 0x8A, 0xC3, 0xFB, 0x16, 0x2A, 0x29, 0xE7, 0xCA, + 0xDC, 0xCC, 0xAB, 0xB3, 0xF1, 0x7B, 0x87, 0x76, 0xBA, 0xB3, 0xA2, 0x70, + 0x47, 0x08, 0x52, 0x2F, 0x3A, 0xA6, 0x30, 0x0F, 0xA8, 0x66, 0x32, 0xC3, + 0x0B, 0x7F, 0x19, 0x24, 0x0A, 0xE3, 0x69, 0x09, 0xD4, 0x90, 0x14, 0xE8, + 0xF5, 0xD3, 0xAB, 0x7C, 0xB4, 0xB4, 0x2B, 0x4C, 0xB8, 0x44, 0x90, 0xCF, + 0xE4, 0xB1, 0x5C, 0xEE, 0x0E, 0xC1, 0x19, 0xFF, 0x10, 0xC6, 0x9A, 0xD5, + 0x32, 0x90, 0x69, 0x9D, 0xCF, 0xD4, 0x7B, 0x65, 0x39, 0x59, 0x19, 0x97, + 0x30, 0xB8, 0x00, 0xD1, 0xE2, 0x82, 0x61, 0xBF, 0x9C, 0x6E, 0x05, 0x6A, + 0xB4, 0x36, 0x42, 0xC2, 0x7A, 0xB9, 0x96, 0x6E, 0x62, 0x9C, 0x68, 0x11, + 0x71, 0x87, 0x64, 0x87, 0x96, 0x80, 0x56, 0x67, 0xFC, 0xDB, 0x71, 0x51, + 0x87, 0x4C, 0x5C, 0xFD, 0xA2, 0x90, 0xD2, 0x0E, 0x9C, 0x52, 0xD2, 0xE7, + 0x49, 0x07, 0x56, 0x12, 0xA6, 0xD8, 0x8A, 0x1C, 0xAD, 0xAF, 0xA7, 0x20, + 0x56, 0x1F, 0xD0, 0xCD, 0x93, 0xBE, 0x4F, 0xFB, 0x60, 0xA3, 0x10, 0xB5, + 0x79, 0xB5, 0x7E, 0x79, 0xF5, 0x2F, 0x57, 0xC2, 0xDD, 0x23, 0x23, 0x4E, + 0x91, 0xC2, 0xBD, 0x81, 0xDA, 0x48, 0x88, 0xA3, 0xDC, 0x2A, 0xF0, 0xBE, + 0x08, 0x00, 0xE7, 0xC6, 0xA4, 0x66, 0x16, 0x30, 0x40, 0xA5, 0xF1, 0x40, + 0x1C, 0x57, 0x5F, 0x1D, 0x96, 0x76, 0xF2, 0xE3, 0x71, 0xD4, 0x2E, 0x76, + 0x90, 0x32, 0x4F, 0x2F, 0xF5, 0xED, 0x59, 0x2F, 0x20, 0x97, 0x7A, 0x1F, + 0xE1, 0xE0, 0xE4, 0x1E, 0x93, 0xF3, 0x79, 0x8B, 0xCD, 0x0B, 0x84, 0x91, + 0xDF, 0x35, 0x7C, 0x7F, 0xEE, 0xC9, 0x61, 0xF1, 0xFD, 0xBF, 0xFB, 0xA0, + 0x09, 0x7A, 0xA1, 0xFF, 0xD6, 0x13, 0x14, 0xD7, 0xEB, 0x37, 0x26, 0x31, + 0x98, 0x16, 0xD8, 0xA7, 0xCE, 0x6C, 0x64, 0x71, 0xE0, 0xE3, 0x5C, 0x33, + 0x97, 0x9E, 0x1A, 0x25, 0x13, 0xBF, 0x05, 0x04, 0x0D, 0x11, 0xF3, 0x19, + 0x20, 0x43, 0x7B, 0x7D, 0x8A, 0x5F, 0x89, 0x05, 0xAC, 0x59, 0xBC, 0xDA, + 0x45, 0x57, 0x30, 0xA3, 0x68, 0x9F, 0x18, 0x0B, 0x9A, 0x41, 0x7E, 0x7B, + 0x85, 0x8E, 0x37, 0xAE, 0x2D, 0xDE, 0x7C, 0xE8, 0xB5, 0x37, 0xA7, 0xB9, + 0xF0, 0xA9, 0xA4, 0x55, 0x83, 0x3F, 0x8F, 0x1E, 0x01, 0x0C, 0xF9, 0x9E, + 0x43, 0x5C, 0x60, 0x3F, 0x26, 0xE4, 0xBB, 0x8B, 0xAC, 0x61, 0xFF, 0x2F, + 0x43, 0x1E, 0x6B, 0x0B, 0xFB, 0xC9, 0x6A, 0x8C, 0x22, 0x36, 0xC1, 0x21, + 0x77, 0x44, 0xFF, 0x2C, 0xF8, 0xCF, 0x29, 0x9F, 0x6F, 0x3E, 0x43, 0x2B, + 0xE2, 0x3F, 0x8E, 0x0F, 0xC1, 0x38, 0x2E, 0x7D, 0x25, 0x76, 0x1A, 0x10, + 0x19, 0xEE, 0x37, 0x05, 0xEB, 0x7A, 0x4F, 0x07, 0xD8, 0x1D, 0x0F, 0xF3, + 0x50, 0x43, 0x4E, 0x67, 0x85, 0x26, 0x16, 0xE5, 0x38, 0x3D, 0x3F, 0xEB, + 0x4C, 0x87, 0x5E, 0xDE, 0x9E, 0xD2, 0x82, 0x04, 0x5B, 0x69, 0x12, 0xEA, + 0xB4, 0x8D, 0x73, 0xE0, 0xA9, 0x1A, 0xEB, 0x19, 0x89, 0xEA, 0xBF, 0x6E, + 0xBA, 0x6D, 0x9D, 0x2B, 0x0B, 0x6A, 0x64, 0x50, 0x9B, 0x79, 0x30, 0xB3, + 0x12, 0x30, 0x89, 0x92, 0x0B, 0xF8, 0x88, 0x31, 0x7E, 0xB7, 0xD0, 0x2D, + 0x84, 0xFD, 0x7D, 0xE0, 0x08, 0x39, 0x84, 0x45, 0xD2, 0x5E, 0x1F, 0x42, + 0xEE, 0x2C, 0xF3, 0xE5, 0xBA, 0xB5, 0xA5, 0x50, 0xAB, 0xD2, 0xEB, 0xEB, + 0x72, 0x9A, 0xE7, 0x18, 0x7A, 0x41, 0xFE, 0x8A, 0xBB, 0x4F, 0x0B, 0x2B, + 0xB7, 0xF0, 0x12, 0x12, 0x58, 0xCC, 0xC1, 0x88, 0x9E, 0x20, 0xF2, 0xFA, + 0x0F, 0xE5, 0x36, 0xAD, 0x64, 0x05, 0xB4, 0x1C, 0xA4, 0xD8, 0x60, 0x36, + 0x7C, 0xD8, 0x1F, 0xED, 0xAA, 0x51, 0x60, 0x2F, 0x1F, 0x76, 0x80, 0xB9, + 0x02, 0xAA, 0x2C, 0x14, 0x17, 0xE6, 0xD2, 0xFE, 0x26, 0xBA, 0xD2, 0xE5, + 0xCB, 0x0B, 0x7D, 0xBE, 0xCC, 0x09, 0xD9, 0xEE, 0x8D, 0x23, 0x52, 0xFB, + 0x54, 0xF4, 0x9E, 0x3B, 0x2A, 0xEA, 0x91, 0x40, 0x6E, 0x3B, 0x03, 0xC0, + 0x82, 0x3D, 0x35, 0x72, 0xAD, 0xC5, 0xB9, 0x53, 0xA1, 0x82, 0x4E, 0xE9, + 0xB6, 0x99, 0x16, 0xF7, 0xE4, 0x98, 0x93, 0x70, 0xAB, 0xEB, 0x91, 0xC6, + 0x7E, 0x70, 0x5D, 0x47, 0xCF, 0x71, 0x5C, 0xCB, 0x61, 0x90, 0xDA, 0xD8, + 0xF1, 0x41, 0xA5, 0x85, 0xA2, 0x4A, 0x9A, 0x15, 0xA3, 0x9D, 0x4A, 0xC9, + 0x42, 0x9A, 0x41, 0x67, 0x68, 0x02, 0xC1, 0x8D, 0x5F, 0xD5, 0x7F, 0xDF, + 0x8F, 0x08, 0xE9, 0x96, 0xF9, 0x8A, 0x43, 0x30, 0xA6, 0x2F, 0x46, 0x31, + 0xCC, 0x73, 0x16, 0x31, 0xF5, 0x56, 0x19, 0x7B, 0x99, 0xC1, 0xF0, 0xA3, + 0x54, 0x90, 0xFF, 0x1E, 0x81, 0xCB, 0x88, 0x50, 0x64, 0x9F, 0x23, 0xFC, + 0xB5, 0x12, 0x24, 0xDC, 0xD2, 0x6B, 0x22, 0x5C, 0xED, 0xA3, 0xF2, 0x8B, + 0x0E, 0xE9, 0xD4, 0x8B, 0xAF, 0x94, 0x0B, 0xA4, 0x7B, 0x25, 0x88, 0xD8, + 0x4A, 0x5E, 0x33, 0x85, 0x5B, 0xD0, 0xD4, 0x50, 0xA4, 0xB2, 0xE5, 0x18, + 0x7B, 0x7B, 0xEE, 0xCB, 0xF0, 0xDA, 0xF5, 0x18, 0xD8, 0x5C, 0x22, 0x0B, + 0x11, 0xDE, 0x02, 0x1F, 0xF8, 0xC6, 0x0D, 0x75, 0x36, 0xCA, 0x82, 0xCE, + 0x46, 0x31, 0x8C, 0x5E, 0x6A, 0x28, 0x3E, 0xD5, 0x3F, 0xB7, 0x16, 0x31, + 0x13, 0x6A, 0x14, 0x59, 0x88, 0x6A, 0x55, 0x65, 0x8A, 0x21, 0xD5, 0x48, + 0xD3, 0x4A, 0xD1, 0x70, 0xF4, 0x3B, 0x72, 0xC2, 0x8D, 0x1E, 0x28, 0xAF, + 0x41, 0x7B, 0xC2, 0x0C, 0x82, 0x6C, 0x3D, 0xD9, 0x25, 0x48, 0x6C, 0xD9, + 0x49, 0x0F, 0x8A, 0xDF, 0x27, 0x6E, 0x1E, 0x21, 0xB7, 0x65, 0x5A, 0x8F, + 0x89, 0x4E, 0x3F, 0x82, 0x47, 0xBF, 0x7C, 0x21, 0x91, 0x75, 0x10, 0x55, + 0x54, 0x21, 0x95, 0xE3, 0xDC, 0x4F, 0x12, 0x0C, 0x1B, 0x55, 0xC2, 0xBE, + 0x85, 0x60, 0x57, 0xB3, 0x70, 0x31, 0x54, 0xD3, 0x53, 0x84, 0xB6, 0x93, + 0xB5, 0x68, 0xC2, 0x14, 0x80, 0xC9, 0x91, 0x32, 0x87, 0x96, 0xFA, 0x20, + 0x03, 0xC2, 0xBE, 0xC2, 0x42, 0xDC, 0x4D, 0x28, 0xC4, 0xC1, 0x95, 0x5D, + 0xCF, 0x4D, 0xFE, 0xFA, 0x09, 0x43, 0x4F, 0xC2, 0x30, 0x65, 0xC4, 0x55, + 0xDE, 0x05, 0x6C, 0x29, 0xFA, 0xDD, 0x9C, 0x17, 0x9F, 0x05, 0x89, 0xD9, + 0xA8, 0x97, 0x46, 0x8C, 0x85, 0x81, 0xFC, 0x99, 0x72, 0x4F, 0x0A, 0xA0, + 0x8F, 0xF3, 0x25, 0x89, 0xBA, 0xDD, 0x63, 0x53, 0x6B, 0xA7, 0x15, 0x20, + 0x14, 0x92, 0x88, 0x51, 0x23, 0x82, 0xA3, 0x9D, 0x0D, 0xC2, 0x79, 0xB7, + 0xA3, 0x18, 0x88, 0xC9, 0xE0, 0xB0, 0x56, 0x8F, 0x16, 0x16, 0x36, 0xAA, + 0x40, 0xC9, 0x61, 0x41, 0x30, 0x82, 0x65, 0x2F, 0x81, 0x57, 0xD3, 0x86, + 0x90, 0x05, 0xC4, 0x44, 0x04, 0x12, 0xC8, 0x1B, 0xB8, 0x4D, 0x6A, 0x06, + 0x1B, 0x9F, 0xEF, 0xC0, 0xA3, 0xE9, 0x9B, 0xEA, 0x70, 0xC0, 0xCE, 0x73, + 0x89, 0x5F, 0x6D, 0x0C, 0x9B, 0x4C, 0x3B, 0x96, 0xB2, 0x8B, 0x6B, 0xF5, + 0x07, 0x00, 0xE4, 0x30, 0xED, 0xE0, 0xB6, 0xF0, 0xB5, 0xF8, 0x1D, 0xFB, + 0xCC, 0xC9, 0x10, 0x66, 0x5B, 0xE0, 0x15, 0xFB, 0x1D, 0xB7, 0x5C, 0x67, + 0x7F, 0x52, 0xD5, 0xA0, 0xF0, 0x9A, 0x6D, 0x37, 0xA7, 0x1B, 0xBD, 0x1F, + 0x7B, 0xF9, 0x82, 0x11, 0x98, 0x7D, 0x27, 0x0B, 0xF5, 0x31, 0x5F, 0x20, + 0x8D, 0x47, 0xA0, 0xB4, 0xD3, 0x59, 0x4B, 0x17, 0xF9, 0xA2, 0x38, 0x66, + 0x31, 0x3F, 0x02, 0xCD, 0x5D, 0xBE, 0x5B, 0x06, 0x17, 0xD7, 0xEC, 0xC4, + 0xD1, 0x67, 0x97, 0x49, 0xBA, 0x1D, 0xE5, 0xCD, 0x8E, 0xCF, 0x0D, 0xCD, + 0x6B, 0xAB, 0x9A, 0xDA, 0x2F, 0x3F, 0x62, 0xDF, 0xFA, 0xE5, 0xEC, 0x50, + 0x6D, 0x62, 0xCB, 0x0F, 0x53, 0xC7, 0x8A, 0x33, 0xF5, 0xB2, 0x8D, 0xFD, + 0x85, 0x31, 0x06, 0xE3, 0xCE, 0x77, 0xB6, 0x8B, 0x2A, 0xC7, 0xC2, 0x72, + 0xD5, 0xA9, 0x06, 0xBF, 0xAF, 0x76, 0x6F, 0xC2, 0x62, 0x31, 0x9A, 0x89, + 0x87, 0xE7, 0x54, 0xD4, 0x8F, 0x32, 0x31, 0x40, 0xE8, 0xAF, 0x82, 0x6C, + 0x69, 0x18, 0x19, 0x25, 0x74, 0xF0, 0xD1, 0xEB, 0x43, 0x71, 0x50, 0x20, + 0xCD, 0x84, 0xE9, 0x94, 0x86, 0x17, 0xA0, 0xF9, 0xB8, 0x65, 0xFE, 0x48, + 0x81, 0x57, 0xCE, 0x0F, 0xA7, 0xF3, 0x28, 0x3F, 0x02, 0x0D, 0xD9, 0x78, + 0x7A, 0x2F, 0x9F, 0x36, 0xAD, 0x8D, 0x47, 0x76, 0x51, 0xA7, 0x95, 0xF2, + 0xE3, 0x20, 0xDB, 0x57, 0x7F, 0xA9, 0x26, 0x29, 0xF1, 0x0F, 0xF7, 0xAB, + 0x2F, 0x7B, 0x2F, 0xEB, 0x96, 0x6C, 0xFD, 0xAA, 0x25, 0x21, 0x35, 0x38, + 0x89, 0xFF, 0xAE, 0xCD, 0x5F, 0xA0, 0xFE, 0x0F, 0x57, 0x70, 0xC0, 0x65, + 0x49, 0xA6, 0x5E, 0x3F, 0xB5, 0x24, 0x8A, 0x46, 0x32, 0xA1, 0x12, 0xC0, + 0x79, 0x0B, 0xD6, 0xE4, 0x26, 0x21, 0x90, 0x25, 0xB6, 0x81, 0xE5, 0x84, + 0xB9, 0x4E, 0x78, 0xFF, 0x44, 0xB7, 0xDB, 0xD5, 0xE2, 0x9B, 0x46, 0xBF, + 0xB9, 0x5F, 0xC5, 0x70, 0xCC, 0xD3, 0xA2, 0x77, 0xAE, 0xAC, 0xCE, 0x52, + 0x08, 0x52, 0x34, 0x6C, 0x41, 0xDA, 0xD6, 0x03, 0x87, 0x71, 0xFB, 0xD6, + 0x2B, 0xFC, 0x64, 0x89, 0x9F, 0x5D, 0x1C, 0x4E, 0xEE, 0x2F, 0xE5, 0xAC, + 0x01, 0x31, 0x46, 0x63, 0x12, 0x45, 0x79, 0x41, 0x93, 0x0C, 0x1A, 0x6B, + 0x3E, 0x73, 0x25, 0xCE, 0xD9, 0x35, 0x87, 0xBD, 0x9F, 0x30, 0xBC, 0x82, + 0xA8, 0x47, 0xCE, 0x8F, 0x48, 0x77, 0x26, 0x71, 0xCB, 0x9B, 0xD3, 0x1A, + 0x79, 0x2A, 0x29, 0x78, 0x7C, 0x6D, 0x5A, 0x72, 0x01, 0x0B, 0xE1, 0x46, + 0x32, 0x65, 0x9D, 0x2B, 0xD4, 0xD6, 0x28, 0x1F, 0xB2, 0x23, 0xA9, 0xF6, + 0x62, 0x2F, 0xCD, 0x99, 0x6C, 0x5D, 0x03, 0x5D, 0xA0, 0x7A, 0xC4, 0x05, + 0x82, 0x71, 0xB3, 0xC3, 0x2B, 0x9B, 0xC5, 0x47, 0x22, 0x84, 0x29, 0x23, + 0xB7, 0x7D, 0xAF, 0xFA, 0xB7, 0x00, 0x10, 0xC9, 0xAB, 0xCF, 0xD6, 0xEA, + 0x24, 0xE3, 0x4A, 0x29, 0xDE, 0xD4, 0x93, 0x95, 0x44, 0xC5, 0xD7, 0xEC, + 0xA9, 0x2C, 0x31, 0x82, 0x12, 0x7E, 0x21, 0x47, 0x1C, 0x5A, 0xD5, 0xA1, + 0x19, 0x9A, 0x57, 0x42, 0x46, 0x70, 0x94, 0x6A, 0xC0, 0xC6, 0x66, 0xA9, + 0x88, 0xB6, 0x52, 0x5E, 0xB8, 0xB3, 0x09, 0x84, 0xF5, 0x0B, 0xF1, 0x2E, + 0x89, 0x0B, 0x01, 0xD0, 0x40, 0xFC, 0x97, 0xC4, 0xE4, 0xF0, 0x99, 0x1E, + 0x48, 0xA5, 0x20, 0x0B, 0x4F, 0xF4, 0xA7, 0x6E, 0xB5, 0x78, 0xB8, 0x80, + 0xFB, 0x5C, 0x51, 0x6B, 0xE3, 0x4E, 0x94, 0xF3, 0x94, 0xAC, 0xCC, 0xBB, + 0xA4, 0x39, 0x78, 0x67, 0xF9, 0x43, 0x73, 0x63, 0x6E, 0xC0, 0x51, 0xFB, + 0xEA, 0xEE, 0x85, 0x57, 0xD4, 0x16, 0xEB, 0xB0, 0x36, 0x1E, 0x2A, 0x80, + 0x8A, 0x63, 0x7B, 0x91, 0xB0, 0x6A, 0xA7, 0xC5, 0x59, 0x93, 0x04, 0x1E, + 0x44, 0x52, 0x02, 0xB2, 0xBB, 0xEF, 0x23, 0x07, 0x2F, 0x41, 0x93, 0x80, + 0x4A, 0x3E, 0x2B, 0x4A, 0x83, 0x79, 0x65, 0x1E, 0x02, 0x58, 0xD5, 0x3E, + 0x51, 0xFF, 0x5F, 0x8A, 0x3E, 0x09, 0x90, 0x02, 0xAF, 0x57, 0xCF, 0x0F, + 0x30, 0x78, 0x2F, 0x0D, 0x50, 0x51, 0xA9, 0x24, 0xD2, 0x10, 0xB5, 0xE2, + 0x3E, 0xD5, 0x53, 0xA2, 0xD9, 0xC6, 0x9C, 0xBC, 0xEB, 0x26, 0xAB, 0xEE, + 0x3B, 0x0E, 0x26, 0x03, 0x54, 0x73, 0x0E, 0x58, 0xDA, 0x92, 0x00, 0xA7, + 0x2A, 0xDC, 0xA7, 0xD2, 0x4B, 0x78, 0x20, 0x88, 0x5D, 0x11, 0x43, 0x15, + 0x67, 0xB5, 0xC2, 0x31, 0x78, 0xD7, 0xCB, 0x5A, 0x1A, 0x04, 0x38, 0xAF, + 0x1A, 0xDB, 0x24, 0x90, 0x5F, 0xF0, 0xB3, 0x11, 0xB9, 0x68, 0x9A, 0x8B, + 0x1B, 0x28, 0xCA, 0x51, 0x63, 0x8C, 0xD2, 0x70, 0xA9, 0x8B, 0x42, 0x69, + 0x86, 0x2E, 0x46, 0x5F, 0x85, 0xA7, 0x80, 0x4D, 0x70, 0x1E, 0xAE, 0x08, + 0xD2, 0xFC, 0xCF, 0x5E, 0xDB, 0x41, 0x9F, 0x21, 0xEF, 0xA6, 0x64, 0x38, + 0xE7, 0x73, 0xEF, 0xEA, 0xF9, 0x31, 0x61, 0x67, 0xEF, 0xD5, 0x21, 0x44, + 0xD9, 0x28, 0xB0, 0x6D, 0xD6, 0x11, 0xF9, 0x28, 0x02, 0x99, 0x84, 0x11, + 0x8A, 0xFB, 0x56, 0xF8, 0x37, 0x98, 0xDC, 0x90, 0x22, 0x13, 0xE3, 0x37, + 0xBF, 0x9A, 0xD4, 0x05, 0xBF, 0x69, 0x76, 0xE1, 0x70, 0x90, 0x81, 0x72, + 0xA5, 0x7A, 0x19, 0x6B, 0x68, 0x13, 0xF1, 0x05, 0xA4, 0xFB, 0xBA, 0x6F, + 0x13, 0xCB, 0x15, 0xA4, 0x5D, 0x09, 0x47, 0x4A, 0xD0, 0x50, 0x34, 0x00, + 0x45, 0xB8, 0xDF, 0x5E, 0x89, 0x02, 0x50, 0x42, 0x65, 0xDF, 0xB7, 0x46, + 0x59, 0x35, 0x81, 0xD9, 0x7D, 0xB6, 0x1E, 0x84, 0x41, 0x08, 0xBA, 0xFA, + 0x2B, 0xBB, 0x85, 0x92, 0x0A, 0x9C, 0x9F, 0x9E, 0x8F, 0xE2, 0x7A, 0xF7, + 0x6F, 0x5D, 0x8D, 0x0B, 0xA8, 0xE1, 0x02, 0x94, 0x54, 0x76, 0xFB, 0xD0, + 0x80, 0xEA, 0x66, 0x17, 0xE5, 0x76, 0x96, 0xF9, 0xC1, 0xB1, 0xA6, 0x7B, + 0x3C, 0x7C, 0xA8, 0x0B, 0x4E, 0x28, 0x8B, 0x46, 0xFE, 0x0B, 0xCC, 0x57, + 0x41, 0x54, 0x37, 0x49, 0x28, 0x19, 0xD8, 0x43, 0xBF, 0x59, 0x76, 0x59, + 0x37, 0x71, 0xD5, 0x19, 0x99, 0xD2, 0xA3, 0xD8, 0x0A, 0x09, 0x58, 0xF4, + 0xEE, 0xC6, 0xF4, 0x47, 0xD7, 0xB3, 0xB4, 0x42, 0x74, 0x71, 0x23, 0xF8, + 0xE0, 0x76, 0xA1, 0x91, 0x28, 0xE8, 0xE6, 0xFD, 0x38, 0x13, 0x02, 0xD0, + 0x07, 0x4C, 0x06, 0x1B, 0xB8, 0x18, 0xA5, 0xB3, 0x0F, 0xBF, 0x06, 0xBB, + 0x40, 0xD7, 0xE2, 0xE1, 0x54, 0xAC, 0x3F, 0x40, 0x5E, 0x68, 0x08, 0xA6, + 0xF2, 0x7B, 0xA7, 0x97, 0xFE, 0x05, 0x75, 0x41, 0x99, 0xBB, 0xCB, 0x2D, + 0xC9, 0xE9, 0x41, 0x69, 0xA5, 0x69, 0x51, 0xC0, 0x85, 0xD9, 0x3D, 0x82, + 0x09, 0xF8, 0x91, 0xCB, 0xE1, 0x89, 0xA6, 0xD1, 0x30, 0xBF, 0xF7, 0xFC, + 0x5E, 0x23, 0xBB, 0x66, 0x65, 0x17, 0x2B, 0x96, 0xF2, 0xA0, 0xF3, 0xA0, + 0xDA, 0xF2, 0x5B, 0x2A, 0xDA, 0x20, 0x25, 0x1C, 0x7B, 0x3E, 0x42, 0xEC, + 0xFC, 0xA0, 0x75, 0x1C, 0xDA, 0x96, 0x37, 0x40, 0xF9, 0xD7, 0x6C, 0xA5, + 0x2D, 0xE1, 0x9C, 0x69, 0x7D, 0xB3, 0x07, 0x8E, 0xC7, 0xE8, 0x8A, 0x24, + 0xDF, 0x77, 0x18, 0x4C, 0xCC, 0xAE, 0x1A, 0x5F, 0xF9, 0xC4, 0x21, 0x77, + 0xFA, 0x2B, 0xA7, 0x2C, 0xC3, 0xB4, 0x85, 0x3B, 0x2D, 0x34, 0xF7, 0x2D, + 0xFA, 0xE8, 0x42, 0xDA, 0x7D, 0x4B, 0x18, 0x40, 0xC6, 0xC6, 0x4B, 0xE4, + 0xCE, 0x64, 0x97, 0x46, 0xC1, 0xA0, 0x32, 0x1C, 0xA4, 0xBB, 0xA0, 0x6C, + 0x49, 0xE9, 0x80, 0x46, 0x08, 0xA8, 0x1B, 0x30, 0x5E, 0x79, 0x54, 0x74, + 0xE2, 0x0C, 0xC3, 0xD5, 0x5C, 0x27, 0xD0, 0x0C, 0x30, 0xDC, 0x24, 0x47, + 0x51, 0x78, 0xF5, 0x42, 0x37, 0xE2, 0x13, 0x4D, 0x6B, 0x1C, 0x3B, 0x92, + 0xF6, 0x70, 0xEE, 0x29, 0x04, 0xDF, 0x61, 0x68, 0x7E, 0xC9, 0xF2, 0xA8, + 0x9B, 0x0A, 0xD3, 0xC8, 0x2E, 0x34, 0x9B, 0x35, 0xE1, 0xD4, 0x7F, 0x15, + 0x1B, 0x77, 0xDE, 0xF6, 0x17, 0x44, 0xE8, 0xDA, 0xDF, 0x5D, 0xE1, 0xEE, + 0xA2, 0x4B, 0xBE, 0x7E, 0x69, 0xFA, 0x01, 0x27, 0x3F, 0x2C, 0xA6, 0x59, + 0x4C, 0x63, 0x68, 0x48, 0x66, 0xC9, 0x43, 0xAB, 0x2A, 0x44, 0x20, 0xC7, + 0x04, 0x29, 0x0A, 0xA5, 0x83, 0x8C, 0xD7, 0x84, 0xE0, 0x87, 0xBB, 0x16, + 0xBF, 0xC3, 0xBD, 0xC9, 0x84, 0x41, 0x15, 0x9A, 0xDC, 0x67, 0xD8, 0x08, + 0xB1, 0x89, 0xE1, 0xDC, 0x4C, 0x66, 0xFA, 0x64, 0x1E, 0x21, 0xC8, 0x89, + 0x1F, 0xC3, 0x74, 0x82, 0xB9, 0x88, 0x2B, 0x05, 0xA4, 0x95, 0xB2, 0x50, + 0xE6, 0xC2, 0x85, 0xC6, 0x4B, 0xE1, 0x7E, 0xB0, 0x63, 0x29, 0x9C, 0x2E, + 0x51, 0x52, 0xB8, 0xB9, 0xC6, 0x00, 0xE1, 0x7C, 0xA8, 0xFD, 0x41, 0x6D, + 0xF0, 0x6E, 0x20, 0x53, 0xB6, 0x2E, 0x2A, 0x42, 0xD7, 0xDF, 0x0F, 0xA5, + 0x4E, 0x77, 0xC9, 0xEF, 0xBA, 0x71, 0xA7, 0x51, 0x39, 0xB1, 0xDB, 0xF6, + 0x81, 0x67, 0x0E, 0x87, 0x87, 0xE6, 0x47, 0x89, 0xC7, 0xF3, 0xDD, 0xB4, + 0x6C, 0xA5, 0x53, 0x83, 0xBF, 0xD7, 0xEC, 0xBE, 0xED, 0x8A, 0xAD, 0xE2, + 0x31, 0x43, 0x9E, 0x2C, 0xBE, 0xAD, 0x0F, 0x60, 0xA9, 0xEA, 0xB2, 0x95, + 0x0B, 0xBE, 0x13, 0x3C, 0x98, 0x9C, 0xED, 0x0A, 0x04, 0x36, 0xBD, 0x7A, + 0x9F, 0x21, 0x41, 0x17, 0xA4, 0x89, 0x01, 0x62, 0xD5, 0x3C, 0xCF, 0xF9, + 0xD7, 0x68, 0x4B, 0x3A, 0xF4, 0x89, 0x10, 0x08, 0x10, 0x0C, 0xC5, 0x7C, + 0xAD, 0x97, 0x24, 0x7C, 0xF5, 0x52, 0xB6, 0x65, 0xEE, 0x3F, 0x76, 0x81, + 0x41, 0xDF, 0x19, 0x8C, 0x75, 0x1D, 0x8E, 0x09, 0xCA, 0x60, 0xBD, 0x29, + 0x91, 0x68, 0x2C, 0x4C, 0x23, 0x90, 0x75, 0x27, 0x7F, 0xA5, 0x40, 0xB8, + 0xAC, 0xE8, 0xFC, 0xDB, 0xCB, 0xDD, 0x2A, 0xFA, 0x8A, 0x76, 0x3D, 0x9D, + 0xF7, 0x74, 0x16, 0x7C, 0x31, 0x6A, 0x88, 0x93, 0x95, 0xD6, 0x5F, 0xE8, + 0xBE, 0x1B, 0x0C, 0x4D, 0x65, 0xC1, 0xF6, 0x0D, 0x8E, 0xC9, 0x71, 0x13, + 0x61, 0x26, 0xBD, 0xB5, 0xFD, 0x16, 0xDF, 0xE1, 0x2E, 0x36, 0x8C, 0xA8, + 0x51, 0xB7, 0x9B, 0xB1, 0x69, 0x35, 0xD1, 0xF6, 0x09, 0x3D, 0x09, 0xB7, + 0xDD, 0xAC, 0x39, 0xBD, 0x3F, 0x1D, 0xA6, 0xB8, 0xA2, 0xE8, 0x70, 0x17, + 0x9F, 0x49, 0xF9, 0x29, 0x48, 0xDF, 0xA3, 0xBF, 0x95, 0x8C, 0xD2, 0x8E, + 0x32, 0xD1, 0xDD, 0x98, 0x49, 0xC8, 0xBC, 0xA2, 0xAD, 0x99, 0x5A, 0xB4, + 0x33, 0x51, 0x3D, 0xB8, 0x6E, 0xA3, 0x72, 0xDD, 0xEF, 0x45, 0x51, 0xEC, + 0x06, 0x8D, 0xFE, 0x15, 0xA9, 0x76, 0x69, 0xA1, 0xAF, 0x75, 0x1B, 0xE7, + 0x8E, 0xDE, 0x4B, 0xF7, 0x49, 0xDC, 0x66, 0xAA, 0xBE, 0xDA, 0x01, 0x18, + 0xA7, 0x2A, 0x11, 0xA3, 0x16, 0xF7, 0x29, 0x2C, 0x97, 0xCC, 0x2B, 0x54, + 0xBC, 0xEF, 0x9F, 0x94, 0xC8, 0xA4, 0xB8, 0x87, 0x01, 0x3F, 0x0C, 0x69, + 0xD5, 0xE9, 0xB9, 0x71, 0x30, 0x9B, 0xAC, 0x1B, 0x1F, 0xB2, 0xC0, 0x67, + 0x52, 0x78, 0x91, 0xBA, 0x3F, 0x2F, 0xC3, 0x5C, 0x80, 0x39, 0x70, 0x1C, + 0x7E, 0x07, 0x71, 0x70, 0x9D, 0x95, 0x6D, 0xE2, 0x0A, 0x5D, 0x1E, 0x19, + 0x06, 0x9A, 0x85, 0xE1, 0x2E, 0xD5, 0xFA, 0x02, 0x2E, 0x32, 0x53, 0xAD, + 0x05, 0x2F, 0xEC, 0x08, 0x7E, 0xDD, 0x71, 0x9D, 0x34, 0xFC, 0x9D, 0x0D, + 0x44, 0x4E, 0x3E, 0x20, 0x00, 0xA8, 0x76, 0x02, 0xF8, 0xBF, 0x6B, 0x9F, + 0x4A, 0x60, 0x99, 0xA1, 0x74, 0x4B, 0xB9, 0x91, 0x16, 0x4D, 0x41, 0xC5, + 0xA1, 0x33, 0xD3, 0x90, 0x8A, 0x2F, 0x83, 0x92, 0x8B, 0x53, 0x1D, 0x29, + 0x8F, 0x97, 0xD8, 0xA0, 0x48, 0x63, 0xB4, 0x43, 0x20, 0x82, 0xC7, 0xC2, + 0x0A, 0x7F, 0xFB, 0x07, 0x74, 0x31, 0x54, 0x2A, 0xCB, 0xCA, 0x7E, 0xD6, + 0x91, 0x6B, 0x82, 0x73, 0x51, 0x66, 0x7B, 0xDF, 0x63, 0x53, 0x08, 0xFC, + 0x17, 0x20, 0xA9, 0x87, 0x1D, 0x24, 0xD0, 0x44, 0x45, 0xBC, 0x80, 0x80, + 0x4B, 0x52, 0x90, 0x4E, 0xA5, 0xDF, 0xD1, 0x3F, 0xA9, 0xCC, 0xD7, 0xD9, + 0xAD, 0x1F, 0x65, 0x63, 0xA6, 0x57, 0x85, 0x39, 0x98, 0x33, 0xE8, 0xBC, + 0xF5, 0xE2, 0xD2, 0x4B, 0xF7, 0xEA, 0x61, 0xE3, 0xFA, 0xF3, 0x73, 0x6C, + 0xA2, 0x0A, 0x26, 0xCB, 0x09, 0x2E, 0xC4, 0x03, 0x38, 0x97, 0x7A, 0x3A, + 0xC7, 0xB0, 0x0C, 0x35, 0x6D, 0x73, 0x14, 0x70, 0x01, 0xF6, 0x8F, 0x67, + 0xBA, 0xD9, 0x4E, 0xAF, 0xEA, 0x96, 0x3D, 0xC6, 0x7E, 0xE7, 0x2B, 0x29, + 0x27, 0xAB, 0xFA, 0xA8, 0x08, 0xB1, 0x01, 0x20, 0xF3, 0xD1, 0x45, 0x35, + 0x33, 0x56, 0x26, 0x81, 0x00, 0xB2, 0x41, 0x01, 0x1A, 0x71, 0x28, 0x35, + 0xF4, 0x43, 0x2F, 0x48, 0x59, 0x69, 0x22, 0x5A, 0x89, 0x8D, 0xC7, 0x38, + 0x5F, 0x12, 0x40, 0x65, 0x7B, 0x89, 0x06, 0x76, 0x74, 0x08, 0xE5, 0xFC, + 0x83, 0x61, 0x2B, 0xAF, 0xB4, 0xE0, 0xE4, 0x51, 0x4D, 0xF7, 0x31, 0x09, + 0x0A, 0xC0, 0xB9, 0x47, 0x23, 0xCB, 0xF7, 0x90, 0x86, 0x65, 0x27, 0xF3, + 0x65, 0xBF, 0x52, 0xAF, 0x4A, 0x3E, 0xBF, 0x0C, 0x9E, 0xC9, 0x6D, 0x4D, + 0xD6, 0x64, 0x77, 0x59, 0x2B, 0x88, 0x6B, 0xD7, 0x7E, 0xBF, 0x8F, 0x53, + 0x48, 0xD8, 0x9E, 0x6E, 0x7E, 0x16, 0x60, 0x4C, 0xE9, 0x33, 0x83, 0x01, + 0x74, 0xCD, 0x1F, 0x8B, 0x4F, 0x3A, 0xEA, 0xCC, 0x45, 0xEE, 0x8F, 0xEA, + 0x0C, 0x40, 0x76, 0xA7, 0xDF, 0x69, 0xFE, 0xD4, 0xD3, 0x23, 0x93, 0x07, + 0x77, 0x8D, 0xCD, 0x20, 0xE9, 0x71, 0xB7, 0xFA, 0xFB, 0x27, 0x6D, 0x0A, + 0xBC, 0x1E, 0xFE, 0x49, 0x2B, 0x15, 0x68, 0x9B, 0x58, 0x3A, 0xA7, 0xC5, + 0xB8, 0x17, 0xA3, 0xAA, 0xCF, 0xF7, 0x91, 0x2E, 0xF2, 0xFC, 0xA4, 0xDC, + 0x50, 0xB3, 0x19, 0x5C, 0x85, 0xA2, 0x89, 0x8C, 0xBB, 0x9A, 0x12, 0x45, + 0xC9, 0x06, 0x36, 0xA3, 0x10, 0x3F, 0x4A, 0x0E, 0x08, 0x7F, 0xF9, 0x45, + 0x09, 0xBC, 0xD5, 0xAC, 0x56, 0x6F, 0xB4, 0xC1, 0x15, 0x4E, 0xD4, 0x55, + 0xD1, 0xF4, 0x97, 0x19, 0x7E, 0x88, 0x4E, 0xA7, 0x95, 0x5B, 0x89, 0xF9, + 0x4A, 0x7A, 0xDD, 0x69, 0xB9, 0xEF, 0xB6, 0x1D, 0x68, 0x98, 0xAB, 0xBE, + 0xF9, 0x10, 0x12, 0x79, 0xC0, 0x2E, 0x08, 0x8B, 0xD4, 0xFE, 0xFB, 0x33, + 0xF5, 0x17, 0x6F, 0x71, 0x71, 0xD9, 0x95, 0x08, 0xBC, 0x05, 0x71, 0x6A, + 0x54, 0x99, 0x80, 0x94, 0x8A, 0x92, 0x2B, 0x1A, 0x52, 0x60, 0x53, 0xAC, + 0xB0, 0x58, 0xE1, 0x97, 0xC6, 0xAB, 0x1A, 0x81, 0x89, 0xBE, 0x60, 0xB1, + 0x16, 0x79, 0xED, 0x3D, 0xE5, 0x31, 0xA2, 0x35, 0x74, 0x26, 0xAE, 0xFF, + 0xEB, 0x7D, 0x62, 0xD0, 0x08, 0x00, 0x44, 0x9C, 0xBA, 0x22, 0x1F, 0x4D, + 0x12, 0x1C, 0xF6, 0xEF, 0x43, 0x31, 0xBA, 0x80, 0xB7, 0x21, 0x2C, 0xAA, + 0x0C, 0x47, 0xAA, 0x50, 0xC9, 0xE5, 0x9B, 0x6F, 0xAF, 0x69, 0x92, 0xD6, + 0x72, 0x73, 0xAE, 0x2D, 0x7B, 0x60, 0x91, 0x0B, 0xC5, 0x48, 0x4D, 0xE4, + 0x1B, 0x92, 0xC5, 0x60, 0x81, 0xF5, 0x96, 0xD5, 0x19, 0x72, 0x39, 0xF6, + 0xC7, 0x47, 0x81, 0x3C, 0x2E, 0x5D, 0xDA, 0xBE, 0xAE, 0xF0, 0x04, 0x40, + 0x2C, 0x0F, 0x98, 0x91, 0x2A, 0xB3, 0x2B, 0x90, 0xCD, 0x31, 0x92, 0x75, + 0x9A, 0x93, 0x51, 0x83, 0x74, 0xCD, 0xFE, 0x53, 0x00, 0x99, 0xAE, 0x49, + 0x47, 0x4B, 0x4F, 0x04, 0x70, 0xEE, 0x58, 0x4D, 0x84, 0x97, 0x7C, 0x75, + 0x46, 0xBC, 0x64, 0xC7, 0x85, 0xA9, 0x0A, 0x7D, 0x5C, 0x6C, 0x9A, 0x21, + 0x0B, 0x2A, 0x16, 0xF6, 0x96, 0xE6, 0x35, 0x6B, 0x59, 0xB1, 0xBB, 0xF7, + 0xC2, 0x24, 0x33, 0x52, 0x79, 0x55, 0x33, 0x8D, 0xE6, 0xD0, 0xD8, 0xA7, + 0xE5, 0x18, 0x5F, 0xF3, 0xE1, 0xE4, 0x23, 0xFF, 0xBF, 0x16, 0xDC, 0xFE, + 0x5F, 0x32, 0x99, 0x2B, 0x22, 0x1A, 0x77, 0x2A, 0xAD, 0x04, 0x07, 0x3C, + 0x15, 0xBF, 0x99, 0x53, 0x9C, 0x29, 0x2B, 0x67, 0xAF, 0xDD, 0x51, 0x89, + 0x03, 0x85, 0xFF, 0x64, 0x2E, 0x1D, 0x0B, 0x03, 0x32, 0xB9, 0x51, 0xB8, + 0xE4, 0x9F, 0x54, 0x49, 0xC4, 0x32, 0x0F, 0x99, 0x34, 0xB3, 0x51, 0xE9, + 0x2D, 0x75, 0xF3, 0xF8, 0x04, 0x86, 0x6B, 0x84, 0xB0, 0x97, 0x95, 0xF4, + 0x38, 0x4C, 0x8C, 0x88, 0x49, 0x48, 0x9E, 0x59, 0x0E, 0x8B, 0xB1, 0xE1, + 0x41, 0x66, 0x10, 0x94, 0x59, 0xF9, 0x6E, 0x78, 0xCC, 0x11, 0x80, 0x92, + 0x33, 0x7E, 0x6A, 0xB8, 0xC9, 0x33, 0xE8, 0xDD, 0x1B, 0x3F, 0x74, 0x79, + 0x42, 0x5C, 0x93, 0x00, 0x4B, 0x68, 0xDA, 0x70, 0x8A, 0xB5, 0x24, 0xFD, + 0x6B, 0x14, 0xF8, 0x1A, 0x26, 0x6A, 0x21, 0x36, 0x7C, 0xF6, 0x49, 0x44, + 0xB4, 0xA6, 0x59, 0xF3, 0x00, 0x76, 0xC5, 0x8A, 0x30, 0xF4, 0x9C, 0x13, + 0xC9, 0xB2, 0xCE, 0xF1, 0x3F, 0xAB, 0x75, 0xD6, 0x4F, 0x36, 0xEA, 0x86, + 0x12, 0x7A, 0x9A, 0x54, 0x68, 0xEA, 0x13, 0xF4, 0x39, 0xC1, 0xC5, 0x70, + 0x22, 0x79, 0x21, 0x0D, 0x7B, 0x47, 0x02, 0x97, 0x14, 0xFF, 0xD2, 0xBE, + 0x99, 0x84, 0x0F, 0x3E, 0xDF, 0xA5, 0x64, 0x98, 0xDF, 0xF8, 0xAA, 0xA2, + 0xD2, 0xED, 0xE8, 0x6E, 0x41, 0xF4, 0x04, 0x3C, 0xE8, 0x39, 0x80, 0x07, + 0xBA, 0x7A, 0xCF, 0x69, 0x32, 0xDB, 0x7B, 0x72, 0x56, 0xE4, 0x1A, 0xA9, + 0x87, 0xB2, 0x32, 0x3F, 0xD9, 0xF4, 0x3F, 0x4B, 0x04, 0xF2, 0xE1, 0x55, + 0xD0, 0xED, 0x5D, 0xD9, 0x57, 0x7A, 0x04, 0x08, 0x05, 0x68, 0x15, 0x7B, + 0x41, 0x61, 0x73, 0x52, 0x7C, 0xC9, 0x23, 0x30, 0x7A, 0x2F, 0xA4, 0xDF, + 0x53, 0xEB, 0x99, 0xAF, 0x28, 0x89, 0x47, 0x10, 0xC5, 0xFD, 0xE0, 0x72, + 0xA3, 0x5D, 0xE1, 0x02, 0x22, 0x49, 0x25, 0xDF, 0x00, 0x71, 0x26, 0xE7, + 0xC5, 0x16, 0x6C, 0x5F, 0x24, 0x7F, 0xBF, 0x12, 0x2E, 0x71, 0xF1, 0x54, + 0x15, 0xE3, 0x76, 0xDA, 0x27, 0x41, 0x8E, 0xF8, 0xA0, 0xC0, 0xF9, 0x5F, + 0x6D, 0x4F, 0xC5, 0x4B, 0x58, 0xB5, 0xAB, 0xC4, 0x40, 0xA4, 0x89, 0x32, + 0x08, 0x63, 0x5F, 0x68, 0x93, 0x56, 0x1C, 0x1F, 0x6F, 0xDE, 0xF1, 0x63, + 0x28, 0x2E, 0x88, 0x52, 0x10, 0x3C, 0xFC, 0xEF, 0x03, 0x87, 0x91, 0xA5, + 0x22, 0x06, 0x58, 0x88, 0x4F, 0x2C, 0x0B, 0x11, 0xFC, 0x21, 0x23, 0xB8, + 0x6A, 0xBD, 0x21, 0x5B, 0x0C, 0x59, 0x2D, 0x6C, 0x83, 0x6F, 0x7C, 0xF8, + 0x4D, 0x7F, 0x62, 0xBC, 0xD1, 0x7D, 0x39, 0x6E, 0x78, 0xCB, 0x88, 0xF2, + 0x98, 0xDC, 0xBE, 0xCE, 0x38, 0x45, 0xF5, 0xE9, 0x3F, 0x58, 0x54, 0x62, + 0xB4, 0x15, 0xE6, 0xF7, 0xE3, 0xCA, 0x91, 0x05, 0x35, 0x8C, 0x6A, 0xE6, + 0x08, 0xFC, 0x05, 0x6D, 0x64, 0x31, 0x4B, 0xA4, 0x61, 0x21, 0x99, 0x4D, + 0x51, 0xF5, 0x98, 0x07, 0x65, 0x3F, 0xD0, 0x6A, 0x8F, 0xDB, 0x8B, 0xB2, + 0x0E, 0x43, 0x75, 0x49, 0x5D, 0x57, 0xAF, 0x98, 0x51, 0xA8, 0x28, 0x62, + 0x8B, 0xBA, 0x47, 0x60, 0x90, 0xCC, 0xC8, 0xC2, 0x8D, 0xA7, 0xC0, 0xD5, + 0x80, 0x6D, 0x54, 0x7F, 0xCD, 0xC6, 0xE6, 0x08, 0x23, 0x84, 0x69, 0x79, + 0x29, 0x8F, 0x47, 0xB7, 0x85, 0x78, 0x8F, 0x29, 0xE1, 0x53, 0x50, 0xE4, + 0x1B, 0x77, 0x66, 0x10, 0x63, 0xBF, 0xA4, 0xC2, 0xDF, 0xB3, 0x2C, 0x87, + 0x21, 0x34, 0xE4, 0xE6, 0xE4, 0x6F, 0x2F, 0x5D, 0x5E, 0x45, 0xCF, 0x31, + 0x7C, 0x4A, 0x5E, 0x99, 0xB9, 0x81, 0xAF, 0x9C, 0xCD, 0x24, 0x6B, 0x33, + 0xE6, 0x8D, 0xB8, 0xB8, 0xA0, 0xDE, 0x15, 0x41, 0xFA, 0xBA, 0x21, 0xFC, + 0x5D, 0xD0, 0x85, 0x3E, 0xD2, 0x06, 0x43, 0x3E, 0x93, 0xD6, 0x83, 0x58, + 0x74, 0x57, 0xE0, 0xBD, 0x11, 0x4E, 0xF4, 0x17, 0xEA, 0x1C, 0x8B, 0x22, + 0xB7, 0x6E, 0x89, 0x92, 0xC8, 0x48, 0xF9, 0x88, 0xEA, 0x46, 0x83, 0x54, + 0x76, 0x94, 0xFD, 0x58, 0xD3, 0xA7, 0xD3, 0x24, 0xAF, 0xC9, 0x05, 0x64, + 0x76, 0xC9, 0xC5, 0xA6, 0x41, 0x2E, 0xD7, 0xAA, 0x37, 0x72, 0x7A, 0x7C, + 0x1B, 0x69, 0xBD, 0xA4, 0xD2, 0x43, 0x9D, 0xC6, 0xE4, 0x20, 0x8F, 0x08, + 0x31, 0xE7, 0x6E, 0xD4, 0xFB, 0x2D, 0x85, 0x3D, 0x5A, 0x21, 0xEC, 0x03, + 0xB5, 0x66, 0xFE, 0xF0, 0x24, 0x2A, 0xBF, 0x32, 0x6D, 0x5C, 0x4D, 0x9C, + 0x4B, 0x22, 0x49, 0xEC, 0x72, 0x9B, 0x9A, 0x36, 0x03, 0x91, 0x8C, 0x7C, + 0xB9, 0xE9, 0x8D, 0x72, 0xE0, 0xB0, 0x52, 0x63, 0x2E, 0xDB, 0x9C, 0x0D, + 0x55, 0x33, 0xA5, 0x17, 0x7A, 0x2D, 0xAF, 0x75, 0x69, 0x50, 0x7D, 0xDC, + 0xEE, 0x26, 0xC6, 0xE3, 0x26, 0xF9, 0x59, 0xF9, 0x10, 0x42, 0x1E, 0xC7, + 0x3E, 0x11, 0xCB, 0xFA, 0x4E, 0xE6, 0xAB, 0x6E, 0xA9, 0x1C, 0xD1, 0x76, + 0x20, 0xB6, 0xD6, 0xBD, 0xD3, 0xCA, 0x9C, 0x82, 0x33, 0xB8, 0x5E, 0xED, + 0xCA, 0x2C, 0x50, 0xC3, 0x58, 0x13, 0x7A, 0xA7, 0xF0, 0x92, 0x89, 0x04, + 0xF8, 0x27, 0x98, 0xE2, 0x1C, 0xF2, 0xDA, 0xF6, 0x4D, 0xC0, 0x6A, 0x1C, + 0xC5, 0xA5, 0x79, 0x6B, 0x84, 0x37, 0x05, 0x90, 0x6A, 0x0E, 0x2B, 0xAF, + 0x96, 0x9E, 0x45, 0xDB, 0x79, 0xDA, 0x2F, 0x46, 0x5F, 0xE2, 0xE8, 0xA6, + 0xC6, 0x00, 0xF2, 0x8F, 0xC2, 0xA0, 0xF9, 0x32, 0x53, 0x63, 0xF9, 0xED, + 0x9C, 0x0F, 0x29, 0x8F, 0x5D, 0x6C, 0x56, 0xE9, 0xBF, 0x52, 0xB1, 0xB5, + 0xD3, 0x8A, 0xE4, 0xE6, 0x1D, 0xB2, 0xC9, 0x0E, 0x8F, 0x28, 0xB0, 0xBF, + 0x68, 0x91, 0x87, 0x8E, 0x30, 0x6A, 0xF6, 0x5E, 0x44, 0x81, 0x3E, 0xAA, + 0xC2, 0x93, 0x9D, 0x41, 0xAE, 0x54, 0xF1, 0x96, 0x40, 0x30, 0x5F, 0xAD, + 0x44, 0xCF, 0xB4, 0x34, 0x86, 0xE2, 0xF4, 0x97, 0x14, 0x21, 0x1D, 0xA5, + 0x58, 0xAF, 0x7B, 0x32, 0x5D, 0x63, 0x9A, 0x9D, 0x2A, 0x7C, 0xDA, 0xAD, + 0xD5, 0xB2, 0xA8, 0x0D, 0x8F, 0xDA, 0x44, 0xCE, 0xB6, 0xA0, 0xC3, 0x3C, + 0x73, 0xC5, 0x8C, 0x9B, 0x62, 0x0C, 0xF2, 0x79, 0x3C, 0x78, 0xF8, 0xC3, + 0xC4, 0x4B, 0xAE, 0x29, 0x5A, 0x30, 0xC9, 0xB9, 0x6A, 0xE4, 0x52, 0x09, + 0xE1, 0x09, 0x60, 0x8B, 0x56, 0x90, 0x84, 0xE2, 0x5A, 0x07, 0x88, 0x25, + 0x03, 0xB7, 0x5B, 0x86, 0x1E, 0x68, 0x2C, 0x25, 0x5D, 0xFE, 0xB9, 0x5A, + 0xF0, 0xDC, 0x81, 0x1F, 0xEE, 0xF7, 0x11, 0x94, 0x67, 0x85, 0x13, 0xEC, + 0x65, 0xEC, 0x83, 0x53, 0x81, 0x57, 0xEB, 0x95, 0xF5, 0xCE, 0xFF, 0x26, + 0xDE, 0x85, 0xDD, 0x7D, 0xA3, 0xFB, 0xA2, 0xB9, 0xD9, 0x33, 0x82, 0x0D, + 0x43, 0xC9, 0x1B, 0x72, 0x14, 0x39, 0x24, 0x57, 0x2A, 0x8E, 0x36, 0xA6, + 0x86, 0xCC, 0xE8, 0x1F, 0x6B, 0xAD, 0x7B, 0x0E, 0x89, 0xF9, 0x1C, 0xBB, + 0x6E, 0x43, 0x99, 0xD5, 0xAA, 0x59, 0xDF, 0x63, 0x12, 0x29, 0x56, 0xCD, + 0x55, 0x56, 0xFC, 0x3E, 0xC2, 0x38, 0xD4, 0x65, 0x59, 0xE8, 0x6E, 0x31, + 0xFE, 0xA8, 0x18, 0xAA, 0xB4, 0x4C, 0x72, 0x3C, 0xB2, 0xBD, 0xA7, 0x54, + 0x8B, 0x53, 0xF8, 0xF7, 0xB8, 0x80, 0xCE, 0x06, 0x89, 0x5E, 0x9D, 0x19, + 0x29, 0xDE, 0x73, 0x01, 0xCF, 0x0C, 0xD2, 0xF8, 0xE3, 0x2B, 0x3D, 0x7C, + 0x84, 0xFF, 0x4D, 0xE3, 0x2E, 0x33, 0x6F, 0x47, 0x1E, 0x97, 0xB3, 0x55, + 0x0B, 0x5C, 0xE3, 0xAB, 0x9C, 0xCB, 0x40, 0x82, 0xD6, 0xA3, 0x47, 0x8B, + 0xFF, 0xB1, 0x26, 0x44, 0xE3, 0x7E, 0x39, 0xDB, 0xDD, 0x1B, 0x35, 0xE6, + 0x6E, 0xF2, 0x48, 0x57, 0x09, 0x02, 0xB6, 0xA4, 0xD4, 0xB9, 0x7E, 0x20, + 0x93, 0x8F, 0x59, 0xE7, 0x2D, 0x0D, 0xB8, 0x82, 0x9A, 0xA4, 0xC7, 0xB2, + 0x2A, 0x31, 0x88, 0x52, 0x98, 0xDF, 0x4C, 0xF6, 0xD4, 0xB4, 0xD2, 0x71, + 0x41, 0xAA, 0x37, 0x52, 0x34, 0x70, 0x51, 0x9B, 0x33, 0x2D, 0xA3, 0x71, + 0x3E, 0xB4, 0xC2, 0x5B, 0xEC, 0xC4, 0xD4, 0x51, 0xF5, 0x8A, 0xD8, 0xB2, + 0x87, 0xAE, 0x41, 0xC2, 0xBA, 0x0B, 0x43, 0xEA, 0x83, 0xD8, 0x32, 0x97, + 0x5C, 0xCA, 0xF6, 0xBD, 0x65, 0x89, 0xF7, 0x92, 0x8E, 0xF9, 0x97, 0x7F, + 0xF7, 0x17, 0x28, 0x47, 0x45, 0xB3, 0xEB, 0x71, 0x86, 0x16, 0x40, 0x86, + 0x28, 0x43, 0x33, 0x92, 0x11, 0x06, 0xED, 0x26, 0x5D, 0x8F, 0x35, 0xAB, + 0xA7, 0xF6, 0x6C, 0xCE, 0x29, 0x62, 0xD6, 0xBE, 0x16, 0xA3, 0x6B, 0x34, + 0xAE, 0x40, 0xED, 0x25, 0x2A, 0xA7, 0x84, 0x1A, 0x7F, 0xB0, 0xBE, 0x2E, + 0x09, 0x8A, 0x06, 0x90, 0x11, 0x2D, 0x54, 0x88, 0x2C, 0x23, 0x78, 0x4A, + 0x79, 0x13, 0x39, 0xEA, 0xC5, 0x4F, 0x05, 0x30, 0x46, 0xBB, 0x38, 0xF1, + 0x47, 0x36, 0xBF, 0xAF, 0xD1, 0x7E, 0x3A, 0x7B, 0x31, 0x54, 0x22, 0x2F, + 0x3D, 0xA6, 0xAB, 0x10, 0x1A, 0x3B, 0x76, 0x9A, 0xED, 0xCC, 0xD2, 0xD3, + 0x29, 0xA5, 0x90, 0xEB, 0x57, 0x15, 0x1D, 0xC8, 0xB6, 0xCD, 0xD0, 0x11, + 0x44, 0x2C, 0x7B, 0xCF, 0x42, 0xA0, 0x76, 0xE2, 0x14, 0x43, 0xC0, 0xBD, + 0x53, 0x22, 0x37, 0x4E, 0x83, 0xD2, 0x91, 0x47, 0xDD, 0xCB, 0x8E, 0x5A, + 0xB0, 0xA6, 0xB0, 0x13, 0x84, 0x81, 0x6A, 0x59, 0xC4, 0xC9, 0x58, 0x1A, + 0x3B, 0x41, 0x09, 0x2B, 0xC1, 0xCB, 0x39, 0x98, 0xE8, 0xDD, 0x1B, 0x45, + 0x5F, 0xB6, 0x86, 0x6B, 0x41, 0x7C, 0x32, 0xDC, 0x0E, 0x03, 0xE7, 0xF3, + 0xB9, 0x65, 0x8E, 0x3A, 0x69, 0x67, 0x8E, 0xE2, 0x6D, 0x6F, 0xB7, 0xA7, + 0x2A, 0x93, 0x9D, 0xEA, 0xA7, 0x2E, 0x82, 0x88, 0x67, 0xC6, 0x91, 0x36, + 0xDC, 0x93, 0x47, 0x9A, 0xCD, 0xF9, 0xF6, 0xFA, 0x2A, 0x3A, 0x85, 0xD1, + 0x66, 0x48, 0xFC, 0x1A, 0x9E, 0x64, 0x6C, 0x20, 0xD4, 0x19, 0x07, 0xDA, + 0xE3, 0xC3, 0x54, 0xD2, 0x45, 0xB5, 0x47, 0x10, 0x2A, 0xB4, 0x00, 0xDF, + 0x06, 0xF6, 0xE4, 0xBF, 0x47, 0x6C, 0x61, 0xDD, 0xD7, 0x3C, 0xE2, 0x27, + 0x3A, 0x4E, 0xEE, 0xCA, 0x07, 0x03, 0x7E, 0xFC, 0x41, 0x94, 0x3B, 0xA8, + 0xD5, 0x28, 0x65, 0xBE, 0x55, 0x28, 0x69, 0x10, 0xF3, 0x91, 0xCE, 0xF8, + 0x84, 0x65, 0x45, 0xDC, 0xB0, 0x54, 0x79, 0x1A, 0x17, 0x60, 0x61, 0xBD, + 0xB6, 0x2C, 0x93, 0x21, 0x8E, 0x19, 0x35, 0x27, 0x9B, 0x5E, 0xFE, 0x8D, + 0xB4, 0x1A, 0xD6, 0xD1, 0xB2, 0xCE, 0xC6, 0x20, 0x6B, 0x92, 0xEC, 0x78, + 0xF8, 0x7D, 0x93, 0x22, 0xF0, 0xD5, 0xD4, 0x5B, 0x41, 0xF3, 0xC2, 0x32, + 0xB7, 0x58, 0x5E, 0x40, 0x9E, 0x0F, 0x93, 0x2A, 0xBC, 0xBC, 0xD5, 0x33, + 0x27, 0x13, 0x0E, 0x4B, 0x9B, 0x8F, 0x3D, 0x77, 0x02, 0x24, 0xA4, 0x72, + 0xAE, 0x77, 0xE4, 0x1A, 0xE8, 0xA3, 0x88, 0x7C, 0xDC, 0x15, 0x23, 0x62, + 0xD1, 0x53, 0xF8, 0x2F, 0x42, 0xAB, 0xC1, 0xF9, 0x43, 0x4F, 0x5E, 0xAD, + 0x44, 0xD3, 0x8B, 0x36, 0x39, 0x5C, 0xAB, 0x52, 0x3D, 0xEB, 0x86, 0x00, + 0x49, 0x18, 0x3C, 0x3C, 0x5A, 0x2B, 0xD0, 0xD4, 0xEF, 0xD9, 0xEA, 0xC5, + 0x51, 0x53, 0xBD, 0xBD, 0xBE, 0x42, 0x37, 0x37, 0x74, 0x89, 0xBB, 0x1D, + 0x6E, 0x2D, 0x42, 0xD3, 0x73, 0x28, 0x47, 0x2F, 0xFD, 0x2C, 0xC0, 0xE0, + 0xBE, 0xFD, 0x7D, 0x4E, 0x8A, 0xD8, 0xC6, 0xE0, 0xFE, 0xF5, 0xE0, 0x33, + 0x2D, 0xB2, 0x38, 0xAC, 0x83, 0xDF, 0x6D, 0x7F, 0x29, 0xAA, 0x0C, 0x12, + 0x74, 0xC0, 0x5B, 0xB6, 0x7E, 0x7F, 0x07, 0x83, 0xC9, 0x70, 0x2E, 0x89, + 0x86, 0x13, 0xE6, 0xBA, 0x83, 0xE6, 0x41, 0xA2, 0xC2, 0xFF, 0xE4, 0x33, + 0x77, 0xD8, 0x42, 0x80, 0x46, 0xDB, 0x0C, 0x02, 0xF1, 0x4D, 0xAD, 0x82, + 0x0E, 0x6F, 0xE2, 0x76, 0x3F, 0x5E, 0x16, 0x23, 0xF8, 0xC9, 0x8D, 0x55, + 0x91, 0xBA, 0x52, 0xEF, 0x8A, 0x49, 0x0E, 0x33, 0x7A, 0xF6, 0xB5, 0x62, + 0xD3, 0x79, 0xC4, 0x99, 0x49, 0xE9, 0x81, 0xC1, 0xF9, 0x3F, 0x75, 0x9E, + 0x24, 0x14, 0x9A, 0x9D, 0x70, 0x62, 0x04, 0x6A, 0xB4, 0x3C, 0xA9, 0xDB, + 0x46, 0x5C, 0x3C, 0xDE, 0xA3, 0xF4, 0xCE, 0x9D, 0x4C, 0x84, 0x69, 0xDA, + 0x0E, 0x29, 0x86, 0x8F, 0xF0, 0xD1, 0x3A, 0x33, 0xE4, 0xEE, 0xFC, 0x8D, + 0xA9, 0x51, 0x3C, 0x60, 0x27, 0x61, 0x3F, 0x90, 0xE4, 0xC9, 0x71, 0xE1, + 0xEB, 0xF9, 0x04, 0xEB, 0xA3, 0xB8, 0xAD, 0x04, 0x82, 0x2B, 0x40, 0x13, + 0x46, 0xC0, 0x47, 0x72, 0xC7, 0x37, 0xD5, 0xCF, 0x0E, 0x93, 0x58, 0x2C, + 0xED, 0x03, 0x68, 0xE2, 0x78, 0xFD, 0x70, 0xE8, 0x53, 0x27, 0x06, 0x70, + 0x7A, 0x7F, 0x85, 0xEF, 0x2B, 0x98, 0x7F, 0xFD, 0x34, 0x2B, 0xAC, 0xA0, + 0x46, 0x35, 0x56, 0x75, 0x96, 0x0B, 0xF9, 0xEC, 0xE4, 0x9B, 0xBD, 0x1E, + 0xE0, 0x94, 0x67, 0x86, 0xD3, 0xBB, 0xE4, 0x53, 0x82, 0x28, 0x29, 0xC2, + 0x1B, 0x3F, 0x79, 0x86, 0x44, 0x6A, 0x50, 0x1E, 0xCE, 0x1B, 0xCC, 0x8C, + 0x13, 0x49, 0x32, 0xE3, 0xE6, 0xD1, 0x5B, 0xDD, 0x59, 0x33, 0x75, 0x95, + 0xF2, 0xC1, 0xC5, 0x77, 0x08, 0x81, 0x47, 0x39, 0xCD, 0xBA, 0x78, 0xA1, + 0x47, 0xD4, 0x2C, 0xDE, 0x9F, 0xB0, 0x20, 0x55, 0xA1, 0x4B, 0xD9, 0x0A, + 0xA8, 0x9C, 0xFE, 0x8C, 0x5F, 0x80, 0x2B, 0x90, 0x5D, 0x86, 0xB5, 0x91, + 0x31, 0x5C, 0x34, 0x4A, 0xC8, 0x27, 0xFF, 0x2D, 0xDA, 0xA8, 0xA3, 0xBE, + 0x9A, 0xB3, 0x24, 0x8A, 0xB4, 0x1C, 0xCC, 0xC1, 0x80, 0x75, 0xEB, 0x88, + 0x79, 0xA2, 0x20, 0xD9, 0x7E, 0x13, 0xCC, 0x6E, 0xE9, 0x2E, 0xA0, 0x3A, + 0x46, 0x2F, 0xA1, 0x99, 0xDE, 0x57, 0xE4, 0x33, 0x10, 0xB2, 0xC8, 0xE5, + 0xCF, 0xC0, 0x75, 0x9E, 0xF7, 0xB9, 0x74, 0xA8, 0xD0, 0x56, 0xFF, 0x86, + 0x95, 0x73, 0xE1, 0x36, 0xF5, 0xED, 0x89, 0x0C, 0x35, 0x25, 0xDF, 0x05, + 0xDB, 0xAA, 0x09, 0x54, 0x29, 0xF4, 0x96, 0xD1, 0x82, 0x50, 0xC2, 0x60, + 0x2C, 0xE4, 0xCB, 0x86, 0xBE, 0xAB, 0xB1, 0x05, 0x1D, 0x85, 0xA6, 0x76, + 0xA3, 0xE2, 0x4E, 0x74, 0x71, 0xEB, 0x65, 0xA1, 0x53, 0xF6, 0x32, 0x67, + 0x3A, 0x56, 0x2A, 0xE3, 0xE1, 0x8E, 0x75, 0xCF, 0xE0, 0xB2, 0xBB, 0x40, + 0x0A, 0xD1, 0x93, 0x83, 0xA0, 0x21, 0x29, 0x77, 0xC1, 0x8D, 0x67, 0x67, + 0x27, 0xF0, 0xB1, 0x9B, 0x1C, 0xD2, 0x3F, 0x93, 0x63, 0x86, 0x38, 0x12, + 0xB6, 0x33, 0x6D, 0xAB, 0x5B, 0x16, 0xF2, 0xB5, 0xAD, 0x30, 0xD6, 0xDD, + 0xA7, 0xA1, 0x9F, 0xDD, 0x52, 0xEE, 0xEA, 0x50, 0xD4, 0x36, 0x1E, 0x9C, + 0x2B, 0xD0, 0x45, 0xEF, 0x7E, 0x43, 0xC7, 0x72, 0xBB, 0x55, 0xF7, 0xF6, + 0x32, 0xE8, 0xC4, 0xAE, 0x48, 0x1A, 0x6A, 0x8D, 0xE1, 0xA0, 0xBC, 0x83, + 0x0F, 0x4A, 0xAC, 0x9C, 0x6F, 0x98, 0x56, 0x8A, 0x66, 0x73, 0x15, 0x07, + 0xA6, 0x46, 0xD1, 0x6B, 0x07, 0x1C, 0x36, 0x1E, 0xC9, 0x48, 0x8A, 0x05, + 0xC2, 0x1D, 0x9D, 0x54, 0x37, 0x34, 0x8F, 0x4B, 0xD7, 0x63, 0x1F, 0xC3, + 0x02, 0xC2, 0x11, 0x70, 0x40, 0x61, 0x4F, 0xE1, 0x17, 0x63, 0xDF, 0x21, + 0x50, 0x7D, 0x08, 0x02, 0xB6, 0x97, 0x11, 0x2E, 0xF5, 0xE6, 0x0C, 0x94, + 0x10, 0x31, 0x5A, 0x51, 0x5D, 0x00, 0x84, 0xC2, 0x86, 0x90, 0xD4, 0xAE, + 0x34, 0xB7, 0x1E, 0x97, 0x80, 0x3F, 0x85, 0x52, 0x2D, 0x7A, 0xBD, 0x32, + 0x03, 0x2B, 0x9F, 0xF5, 0xCA, 0x85, 0x6D, 0x9A, 0xF3, 0x65, 0xAF, 0xE2, + 0x60, 0xDF, 0x8C, 0x4F, 0x18, 0xD1, 0x85, 0xD3, 0x01, 0x6B, 0x07, 0xA0, + 0x54, 0xB6, 0xCB, 0x25, 0xB3, 0x92, 0x96, 0xC5, 0x0B, 0xE8, 0xB4, 0xA4, + 0x60, 0x23, 0x81, 0x47, 0xBA, 0xAD, 0x31, 0x05, 0x58, 0x3D, 0xC4, 0xA9, + 0xF7, 0xAB, 0x9E, 0x9F, 0xAF, 0x7E, 0xAA, 0x20, 0xB5, 0xA4, 0xA5, 0x9A, + 0x46, 0xF7, 0xCC, 0xE8, 0xFE, 0x6B, 0x93, 0x07, 0x7B, 0x43, 0x9F, 0x79, + 0x55, 0x4E, 0xAB, 0xCD, 0xEF, 0x3A, 0xA1, 0x8E, 0xC4, 0xDE, 0x62, 0x5F, + 0x0A, 0xFF, 0xC7, 0x1B, 0x4E, 0x53, 0x50, 0x36, 0x93, 0x1C, 0x47, 0xF2, + 0x6A, 0x58, 0xD0, 0xBF, 0x70, 0x8B, 0x45, 0x34, 0x34, 0x33, 0x9E, 0x44, + 0xB9, 0x64, 0xED, 0x9B, 0x6D, 0x07, 0x5F, 0x8C, 0x12, 0xEF, 0xDC, 0x26, + 0xFF, 0x4C, 0xCE, 0xCE, 0x8D, 0xB9, 0x91, 0xC7, 0x82, 0xBF, 0x08, 0x23, + 0xA8, 0x9A, 0x8E, 0x21, 0x8C, 0xDE, 0x1C, 0x92, 0x5B, 0xB0, 0x70, 0x69, + 0x42, 0xD6, 0xB9, 0x94, 0x1A, 0xA2, 0x12, 0x91, 0xF1, 0x54, 0x80, 0x02, + 0x0C, 0xD2, 0x54, 0x17, 0x4C, 0x29, 0xEA, 0x31, 0xC1, 0x60, 0x94, 0x9F, + 0x44, 0xDF, 0x7B, 0x38, 0xFE, 0xD4, 0x32, 0x36, 0x6C, 0xD4, 0x6A, 0xD1, + 0x3D, 0x6C, 0x73, 0x77, 0x81, 0xDC, 0xE2, 0x9D, 0x48, 0x5A, 0xB2, 0x95, + 0x28, 0x40, 0x5F, 0xF5, 0x6C, 0x9A, 0x63, 0x4B, 0x24, 0xD5, 0xE3, 0x25, + 0x75, 0xD4, 0xAC, 0x87, 0xA4, 0x55, 0x97, 0xA7, 0xB0, 0xD7, 0x06, 0x10, + 0xD5, 0x0F, 0xC9, 0x8F, 0xC7, 0x6C, 0x63, 0x49, 0x81, 0x14, 0x24, 0xB0, + 0x2C, 0xAA, 0xDE, 0x01, 0xB0, 0x4E, 0x2C, 0xD8, 0xB7, 0xDF, 0x24, 0x21, + 0xF8, 0x07, 0xF6, 0x36, 0x93, 0x09, 0x66, 0x1D, 0xBF, 0x6D, 0x76, 0xA7, + 0xDC, 0xA2, 0x67, 0xAA, 0x9E, 0x04, 0xB4, 0x9C, 0xE9, 0xBC, 0x78, 0xDC, + 0xEC, 0x1D, 0x4D, 0xED, 0x5F, 0x9F, 0xAA, 0xFF, 0x75, 0x24, 0x3A, 0x95, + 0xF8, 0xA2, 0xC0, 0x38, 0x73, 0xEF, 0xFF, 0x11, 0x71, 0xDE, 0xBB, 0x76, + 0x19, 0xBA, 0xB9, 0xB0, 0xA6, 0x1B, 0x0F, 0x33, 0xFA, 0x3B, 0xB5, 0x4D, + 0x32, 0x9F, 0x15, 0x09, 0xC3, 0x22, 0xCE, 0x73, 0x31, 0xDD, 0x23, 0xBF, + 0x1E, 0x99, 0x57, 0x6D, 0x0B, 0xDF, 0xF8, 0xFD, 0xAC, 0x41, 0xA7, 0x91, + 0x8B, 0x70, 0x5C, 0x41, 0x02, 0x77, 0x52, 0x1D, 0xAC, 0xBF, 0xBD, 0x03, + 0xA3, 0x5A, 0xC4, 0x61, 0xA8, 0xE1, 0x00, 0xE1, 0x77, 0x14, 0x7E, 0x5F, + 0xDF, 0x11, 0x80, 0x40, 0xBA, 0xA1, 0x07, 0x9F, 0xC7, 0xED, 0xC6, 0x77, + 0xF4, 0x14, 0x55, 0x99, 0x56, 0x15, 0x6C, 0xF9, 0x34, 0x02, 0x28, 0x69, + 0x81, 0xDD, 0x0D, 0x9E, 0x5B, 0x35, 0xEA, 0x1D, 0x9C, 0xA9, 0xBB, 0x82, + 0x79, 0x1B, 0xE7, 0xF5, 0xF8, 0xFD, 0x14, 0xC8, 0xDC, 0xE8, 0x7A, 0x6D, + 0x7B, 0xA1, 0x35, 0x7C, 0x0B, 0x13, 0x1B, 0x08, 0x2E, 0x8B, 0x04, 0x27, + 0x16, 0x04, 0xFC, 0x6C, 0xE4, 0x1E, 0x29, 0x06, 0xF1, 0x05, 0xCD, 0x6C, + 0x10, 0xB1, 0xBA, 0xB9, 0x7F, 0x97, 0xDD, 0x8C, 0xA5, 0x51, 0xB8, 0xD5, + 0xE8, 0xE9, 0xEA, 0x23, 0x5D, 0x2C, 0x6A, 0xC2, 0x74, 0x7F, 0x81, 0xB6, + 0x47, 0xF9, 0xA5, 0x94, 0x57, 0x31, 0x3B, 0xCE, 0xCB, 0x13, 0xA7, 0xED, + 0x9A, 0x29, 0x33, 0x4F, 0xE2, 0xB5, 0xAA, 0x41, 0x37, 0x6F, 0xF4, 0x82, + 0x65, 0x5F, 0x5D, 0xAE, 0x4D, 0x92, 0xD9, 0x03, 0xCC, 0x71, 0xA7, 0x6D, + 0x68, 0x46, 0x87, 0xA0, 0x79, 0x28, 0x9C, 0x4A, 0x39, 0x7F, 0x5E, 0xA2, + 0xD5, 0xB4, 0x8B, 0x35, 0x07, 0x49, 0x66, 0x47, 0x08, 0xFB, 0xFF, 0xE4, + 0x44, 0x06, 0x3B, 0x7D, 0x99, 0xED, 0xE6, 0x9D, 0xDD, 0x9B, 0x86, 0x27, + 0x4D, 0x3A, 0x46, 0x42, 0xDA, 0xEC, 0xCD, 0xEA, 0x1E, 0x4F, 0xDA, 0x5F, + 0x5F, 0x0E, 0x0C, 0xCF, 0x65, 0x64, 0x34, 0x29, 0x4E, 0x14, 0x4B, 0x8A, + 0x9A, 0x2C, 0xF6, 0x80, 0xBC, 0x4B, 0xAD, 0xB9, 0x24, 0xC3, 0x56, 0x2E, + 0x5E, 0x3D, 0xBD, 0xE0, 0x48, 0x96, 0x30, 0x01, 0xD7, 0x4A, 0xEA, 0x0B, + 0xCD, 0xF2, 0xFA, 0x99, 0x67, 0xA3, 0x98, 0x01, 0xD5, 0x19, 0x0D, 0xD5, + 0x6E, 0xB3, 0x18, 0x05, 0x62, 0x5C, 0x75, 0xB3, 0xC2, 0x60, 0xCF, 0xF5, + 0x22, 0x42, 0x32, 0x73, 0x99, 0x1D, 0x31, 0x94, 0xE6, 0x37, 0xC8, 0x74, + 0x41, 0xF1, 0xBD, 0x46, 0xBA, 0x0B, 0x2A, 0xA7, 0x4A, 0x28, 0xB8, 0x25, + 0x48, 0x99, 0xEF, 0xE1, 0xE7, 0x4D, 0xEB, 0x53, 0xBA, 0x76, 0xA2, 0x15, + 0x1B, 0xFE, 0x80, 0x6F, 0x66, 0x81, 0x15, 0x99, 0x6B, 0x1C, 0x12, 0xB6, + 0x61, 0x52, 0xCD, 0xBA, 0x47, 0x79, 0x0D, 0x9A, 0xEE, 0xA9, 0x3E, 0xFB, + 0xBD, 0x56, 0xA7, 0xBC, 0x41, 0xF1, 0x17, 0x00, 0xC5, 0x0E, 0x58, 0xA7, + 0x71, 0x42, 0x7D, 0x4A, 0xAF, 0x3C, 0x8E, 0xA6, 0x77, 0x6F, 0x35, 0xEC, + 0x92, 0x8A, 0xC9, 0xCC, 0xB0, 0x58, 0x74, 0xCE, 0xD3, 0xBB, 0xA0, 0xC1, + 0xCD, 0x12, 0xF2, 0x81, 0x1C, 0xA4, 0x26, 0x7C, 0x92, 0x8A, 0x27, 0x19, + 0x3C, 0x44, 0x2A, 0x7D, 0x0E, 0xD3, 0xEA, 0x15, 0x3A, 0xF9, 0x4B, 0xBF, + 0x99, 0x8A, 0x7F, 0xAB, 0x13, 0x24, 0x65, 0x46, 0x94, 0x29, 0xBD, 0xB7, + 0x2A, 0xEE, 0x65, 0xEF, 0x02, 0x34, 0x20, 0xF4, 0xD2, 0xAF, 0xC4, 0x10, + 0x93, 0x05, 0xD5, 0x82, 0x71, 0x7C, 0xF8, 0x9D, 0x43, 0x72, 0x09, 0xBB, + 0x8C, 0xC3, 0x60, 0x21, 0x40, 0xCB, 0x97, 0xA3, 0x47, 0xE1, 0xDF, 0x18, + 0x5E, 0x22, 0x2F, 0x95, 0x49, 0x3F, 0x89, 0x50, 0xFD, 0x08, 0x3D, 0xC2, + 0xE2, 0x5D, 0x5A, 0xA3, 0xF2, 0x09, 0x4F, 0x0C, 0x55, 0x38, 0x69, 0xF8, + 0x39, 0xC3, 0x94, 0xF7, 0x55, 0x71, 0xA9, 0xC7, 0x0F, 0x2C, 0x8E, 0x3C, + 0x70, 0x86, 0x57, 0x6F, 0xCF, 0x5D, 0xE9, 0x4B, 0x4F, 0x80, 0x7E, 0x15, + 0x42, 0x43, 0x7B, 0xEC, 0xCD, 0x4E, 0x92, 0x8D, 0x5C, 0x89, 0xD2, 0x08, + 0x5A, 0x32, 0x0F, 0x6E, 0x0D, 0x09, 0x29, 0x02, 0x6F, 0xA0, 0x2E, 0x8E, + 0x5C, 0x10, 0x16, 0x1E, 0x82, 0xDF, 0xD3, 0xCD, 0xB5, 0x93, 0xD6, 0x21, + 0x7B, 0x96, 0xC5, 0xFC, 0x79, 0x21, 0x88, 0x99, 0xC9, 0x3C, 0x75, 0x98, + 0x13, 0x67, 0x62, 0xFD, 0x70, 0xB0, 0x58, 0xDA, 0xCF, 0xDC, 0x9E, 0x92, + 0x5F, 0x84, 0x3B, 0x0E, 0xD8, 0xE0, 0xCF, 0xF3, 0x90, 0x9E, 0xFC, 0x40, + 0xC7, 0x58, 0x2F, 0x11, 0x55, 0x9D, 0x7A, 0xE9, 0x9D, 0x5C, 0xD7, 0xDF, + 0xEF, 0xC5, 0x87, 0x7E, 0xC5, 0x14, 0xA7, 0xCE, 0xE6, 0xDB, 0x83, 0xD4, + 0x3A, 0xF7, 0x86, 0xD0, 0xE6, 0x2B, 0xFF, 0x8B, 0x80, 0xF8, 0xD6, 0xFE, + 0x55, 0x82, 0xD7, 0x5B, 0xEB, 0x29, 0x9C, 0x1D, 0xCD, 0x69, 0x1D, 0xF2, + 0xB5, 0x44, 0x09, 0xAD, 0x1D, 0x40, 0xDD, 0xC1, 0xFB, 0xDF, 0x79, 0xCA, + 0xA4, 0x61, 0xAC, 0x39, 0x80, 0x66, 0xB8, 0x37, 0x91, 0xF6, 0x23, 0xEB, + 0x82, 0x49, 0x05, 0x41, 0x72, 0x98, 0xA6, 0x1C, 0x21, 0xB1, 0x64, 0x90, + 0xDC, 0x68, 0x00, 0x2E, 0x61, 0x2A, 0x80, 0x91, 0xEB, 0xCA, 0x04, 0x3D, + 0x8E, 0x70, 0x21, 0x60, 0x1E, 0x11, 0x69, 0x4A, 0x3B, 0x09, 0x84, 0x90, + 0x98, 0x78, 0xF0, 0x9D, 0x5A, 0x92, 0x71, 0xC3, 0xB7, 0x4B, 0x42, 0x98, + 0x8E, 0xB6, 0x2B, 0x39, 0x59, 0x5F, 0xC1, 0x04, 0xC6, 0x8F, 0x6B, 0x33, + 0xF7, 0x9E, 0x0B, 0x32, 0x35, 0x60, 0x57, 0x23, 0xA1, 0xCB, 0x73, 0x82, + 0xEA, 0x05, 0x3D, 0xDC, 0xF5, 0x36, 0x1B, 0x5E, 0x18, 0x1F, 0x37, 0x14, + 0xD7, 0x06, 0xAE, 0xDD, 0x46, 0x15, 0x82, 0xA2, 0x9C, 0xAA, 0x41, 0xFE, + 0x28, 0xB8, 0x3E, 0x2A, 0x7D, 0x78, 0xB8, 0x27, 0xE7, 0x65, 0x52, 0x7D, + 0x93, 0x9F, 0x13, 0x9A, 0x22, 0xF1, 0xF5, 0xB3, 0x2A, 0x37, 0xB6, 0x81, + 0xF7, 0x5D, 0x4C, 0xA3, 0x65, 0x28, 0x13, 0x9E, 0x41, 0xD8, 0xC4, 0xA8, + 0x10, 0xD5, 0x5D, 0xB0, 0xBA, 0xE5, 0xDF, 0xF3, 0xFF, 0x49, 0xD1, 0xED, + 0x9D, 0x9E, 0xFA, 0x19, 0xF7, 0x41, 0xDB, 0xC1, 0xBE, 0x8E, 0x72, 0xAD, + 0xB2, 0xD5, 0x7A, 0x93, 0x6F, 0xF7, 0x25, 0xB9, 0x62, 0xB5, 0xA9, 0x3B, + 0x79, 0xF6, 0xA8, 0x56, 0x4A, 0x8F, 0x98, 0x9E, 0xC7, 0x4F, 0x42, 0x49, + 0xB3, 0x75, 0xFA, 0x73, 0xDD, 0x37, 0xCA, 0xCE, 0xEA, 0x5E, 0xF0, 0x84, + 0x88, 0x6F, 0x54, 0x54, 0xA5, 0xA0, 0x1D, 0xF9, 0xE7, 0x4E, 0xCB, 0xD6, + 0x0A, 0xB4, 0x84, 0xBF, 0xD0, 0x2E, 0x2C, 0xF9, 0x12, 0x33, 0x28, 0x91, + 0x40, 0x3E, 0xC9, 0x18, 0x9E, 0x84, 0x76, 0xDB, 0xEB, 0x21, 0x62, 0x35, + 0xAE, 0x98, 0x20, 0x97, 0x2B, 0x8D, 0x6B, 0x86, 0x73, 0x91, 0x00, 0x0C, + 0xA0, 0xF1, 0xAB, 0xB7, 0x65, 0x94, 0x7A, 0x80, 0x09, 0x28, 0x90, 0x0B, + 0xAF, 0x1C, 0x72, 0xCD, 0x93, 0x7C, 0xDA, 0xC7, 0xE0, 0x85, 0x72, 0x3F, + 0x0A, 0xAA, 0x1E, 0xE7, 0xBF, 0xEA, 0x84, 0xE1, 0xF9, 0xB8, 0x2B, 0x41, + 0x4E, 0x30, 0x23, 0x99, 0x47, 0xE4, 0x6C, 0x45, 0x86, 0x51, 0xB2, 0xB1, + 0x2A, 0x11, 0x1B, 0x3E, 0xD1, 0x5A, 0xC4, 0x6C, 0xEF, 0x37, 0xBC, 0xAE, + 0x10, 0x0C, 0x28, 0xB0, 0x14, 0x6B, 0xB7, 0x34, 0x12, 0x21, 0x12, 0x5D, + 0xFC, 0x19, 0x80, 0x72, 0x0B, 0xF3, 0x27, 0x8B, 0x3F, 0x14, 0x7B, 0xD5, + 0x66, 0xF2, 0x0F, 0xEF, 0x2E, 0xC6, 0x87, 0x49, 0x61, 0xD1, 0xE6, 0xA5, + 0x00, 0xF9, 0x1A, 0x11, 0xB2, 0x3B, 0xAC, 0x77, 0xBF, 0xFB, 0x6B, 0xB1, + 0x9C, 0x25, 0x0D, 0x68, 0x2C, 0x2C, 0xA8, 0xE8, 0x67, 0xE7, 0xAF, 0x32, + 0x03, 0x6C, 0xAB, 0xF2, 0x27, 0x55, 0xD6, 0xCA, 0x36, 0xC4, 0x2A, 0xD7, + 0x74, 0x7F, 0xD5, 0xE5, 0x4E, 0x2F, 0x97, 0xA8, 0x21, 0x71, 0xE0, 0xD7, + 0x96, 0xD3, 0x14, 0xA2, 0x3D, 0x6C, 0xC0, 0x86, 0x17, 0x80, 0xA0, 0x9B, + 0x96, 0x3F, 0x42, 0x45, 0xCF, 0x34, 0x24, 0x9C, 0xEF, 0x8A, 0xA2, 0x33, + 0xB7, 0xEB, 0xF7, 0xB1, 0xE1, 0xE9, 0x9F, 0xDB, 0xA9, 0x80, 0xD0, 0xA8, + 0xBC, 0x6A, 0x49, 0x86, 0x69, 0xAF, 0x21, 0x82, 0x9B, 0xF1, 0x90, 0x12, + 0x92, 0x7C, 0xCE, 0x56, 0xB7, 0x31, 0xFF, 0x68, 0xE1, 0x5D, 0x54, 0x17, + 0xBC, 0x06, 0x46, 0x56, 0xE3, 0x4A, 0x36, 0xAB, 0x7D, 0xBC, 0xE8, 0x34, + 0x32, 0x79, 0xEB, 0x96, 0xFC, 0xA5, 0x17, 0x72, 0x50, 0x63, 0xCB, 0x6C, + 0x4D, 0x0D, 0xBD, 0xEC, 0x78, 0xC7, 0x73, 0x97, 0x7F, 0xA6, 0xF5, 0xCE, + 0xFC, 0xC7, 0x28, 0x59, 0x62, 0xAF, 0xCC, 0x9F, 0xFB, 0x4F, 0x8D, 0xBE, + 0xC6, 0xEF, 0xCF, 0x92, 0xDE, 0x56, 0x06, 0xF0, 0xB6, 0xEE, 0x7F, 0xFE, + 0x90, 0x59, 0xFF, 0xF1, 0xB2, 0x7A, 0x67, 0xA9, 0x16, 0x0B, 0xB9, 0xDB, + 0xF8, 0x5B, 0xAB, 0x6C, 0xD0, 0x4F, 0x6A, 0xB1, 0x42, 0x39, 0x2D, 0x71, + 0x31, 0x30, 0x83, 0xC4, 0x3D, 0x5D, 0xB7, 0x6A, 0xE5, 0xE0, 0x1A, 0x07, + 0xC8, 0xA1, 0xCC, 0x5C, 0x8B, 0x0E, 0xDA, 0xBA, 0xC5, 0x0E, 0x1D, 0x6D, + 0x8C, 0x25, 0x56, 0xAA, 0xA2, 0xC3, 0x1C, 0xB1, 0xDE, 0x5E, 0xAA, 0xCA, + 0x53, 0xF8, 0x78, 0x69, 0x51, 0x69, 0x03, 0xA4, 0x0F, 0xB7, 0xA7, 0xAA, + 0xB6, 0x44, 0x59, 0x9F, 0xB8, 0x45, 0x48, 0x19, 0x5F, 0x29, 0x64, 0x66, + 0xA7, 0x7B, 0x7F, 0x79, 0xF8, 0x9D, 0x15, 0x48, 0x34, 0x57, 0xA1, 0x25, + 0x27, 0xCE, 0xBF, 0xD1, 0xC8, 0x5E, 0x96, 0xBF, 0xC9, 0xD2, 0xC7, 0x08, + 0x75, 0xDB, 0x8D, 0x55, 0x26, 0x92, 0x2C, 0xB2, 0x87, 0xB1, 0x15, 0x37, + 0x22, 0x9B, 0x61, 0xBC, 0xA8, 0xC7, 0x7E, 0xC3, 0x98, 0x89, 0xBC, 0x44, + 0x6B, 0x13, 0x93, 0x30, 0xCD, 0x5B, 0x35, 0xB4, 0x9F, 0x5C, 0xB5, 0x2E, + 0xB1, 0x23, 0x20, 0xA8, 0xF3, 0xA3, 0x5A, 0x01, 0x29, 0x24, 0x54, 0x20, + 0xEF, 0x27, 0xCD, 0xF3, 0x56, 0xE0, 0x6B, 0x02, 0x23, 0x0A, 0xD9, 0x6A, + 0xA6, 0x23, 0xE1, 0xC3, 0x96, 0xEE, 0x06, 0x11, 0x53, 0x9E, 0xD6, 0x80, + 0xC1, 0x68, 0x15, 0xA4, 0x24, 0x8F, 0xBF, 0xB2, 0x49, 0xC1, 0x2E, 0xE2, + 0x6B, 0xD2, 0x48, 0x45, 0x3C, 0xA6, 0xF8, 0x6C, 0xC0, 0x55, 0x51, 0xC4, + 0xAC, 0x52, 0x8D, 0x44, 0xEF, 0xBC, 0x04, 0x05, 0x69, 0x5C, 0x87, 0x99, + 0x0C, 0x27, 0xFB, 0x02, 0x6E, 0xD1, 0xF7, 0x5E, 0x07, 0x11, 0x26, 0x5A, + 0x59, 0x5A, 0xF8, 0x54, 0x12, 0x88, 0x20, 0xBB, 0x38, 0x92, 0x49, 0xF0, + 0xE5, 0x82, 0xA3, 0xF6, 0xEE, 0xBD, 0xD7, 0xCC, 0x58, 0xDC, 0x3B, 0x8A, + 0x13, 0xE8, 0x5F, 0x58, 0x0C, 0x12, 0x64, 0x3C, 0xAF, 0x92, 0xC0, 0xC9, + 0x11, 0xE9, 0xC1, 0xB8, 0xE7, 0xFA, 0x09, 0xAE, 0x61, 0xA3, 0x70, 0x4C, + 0x07, 0x45, 0x7C, 0x61, 0x82, 0x1B, 0x64, 0x4C, 0x0F, 0x7D, 0xC2, 0xC5, + 0xD9, 0x92, 0x00, 0x35, 0xCC, 0x34, 0x07, 0xBA, 0xDD, 0x52, 0xE3, 0x67, + 0x76, 0xC6, 0x8B, 0xD5, 0x51, 0xE7, 0xB3, 0x57, 0x7D, 0xF6, 0xA3, 0x82, + 0xEA, 0x7D, 0x88, 0x09, 0x67, 0x49, 0x2B, 0x37, 0x04, 0x1E, 0xBF, 0x83, + 0x76, 0xBA, 0x7F, 0xB4, 0xC1, 0x8F, 0xCD, 0xD3, 0x04, 0xD2, 0x89, 0x5F, + 0x0E, 0xA7, 0x43, 0x4F, 0x8A, 0x4A, 0x98, 0x48, 0x74, 0x83, 0x0B, 0x2E, + 0x6E, 0xC4, 0xAF, 0x29, 0x38, 0xBA, 0xD1, 0x67, 0xEA, 0x96, 0x10, 0x35, + 0x69, 0xFF, 0xD2, 0x43, 0x00, 0x2E, 0x9D, 0x60, 0x08, 0x04, 0xDF, 0xFB, + 0xCD, 0x6C, 0x98, 0xCE, 0x73, 0x9A, 0xF4, 0x46, 0x23, 0x22, 0x58, 0x0C, + 0x1F, 0xE1, 0x5A, 0x43, 0x76, 0x18, 0x81, 0xE3, 0xF4, 0xBE, 0x95, 0xBF, + 0x61, 0x88, 0x16, 0xF4, 0x7B, 0x01, 0xEB, 0xD4, 0x85, 0xB9, 0xC2, 0x0C, + 0x22, 0x02, 0x27, 0x8D, 0xB5, 0x7F, 0xC8, 0xA9, 0xAA, 0x8A, 0xF7, 0x91, + 0x7A, 0x4A, 0x20, 0x37, 0xB7, 0xBE, 0x15, 0x6E, 0x48, 0x2C, 0x50, 0xE3, + 0xAE, 0x2B, 0xAE, 0x1E, 0x5C, 0x59, 0x9A, 0x36, 0x46, 0x85, 0x04, 0xE8, + 0x51, 0xED, 0x1F, 0xB0, 0x38, 0xE3, 0xC7, 0x5D, 0x9A, 0xD1, 0x07, 0x85, + 0xED, 0xDC, 0x3C, 0x99, 0x35, 0x03, 0x57, 0x85, 0xE2, 0x83, 0xFB, 0x06, + 0x81, 0x08, 0xDA, 0xF2, 0xFA, 0xF4, 0x9E, 0x5F, 0x2F, 0x82, 0xC2, 0xBA, + 0xE3, 0x04, 0x42, 0x59, 0x4B, 0xBD, 0xEB, 0xFD, 0x8F, 0x5D, 0x34, 0x37, + 0x86, 0x06, 0x6B, 0xCC, 0x8C, 0x48, 0x7C, 0x14, 0xE9, 0x48, 0xF5, 0x28, + 0x51, 0xF3, 0x7E, 0xC9, 0xC8, 0x73, 0x88, 0x8B, 0x03, 0xAD, 0xEA, 0x37, + 0x3F, 0x02, 0x95, 0xB8, 0x6A, 0x28, 0xFC, 0x42, 0xD9, 0xAD, 0xFC, 0x4C, + 0xE8, 0xEA, 0xDC, 0x4B, 0xD3, 0x9C, 0x74, 0x09, 0x44, 0x74, 0x81, 0xB6, + 0x36, 0x96, 0x07, 0xFB, 0x48, 0xF5, 0xBA, 0x21, 0xA5, 0xD4, 0xCA, 0x48, + 0x1E, 0x63, 0xF4, 0x8C, 0x16, 0x4C, 0xDF, 0xC2, 0xAA, 0x11, 0x02, 0xCF, + 0xE8, 0x28, 0xEF, 0xB9, 0x57, 0x70, 0x6C, 0x2C, 0x43, 0x18, 0x6D, 0xBD, + 0x2D, 0xF4, 0x20, 0x54, 0x2A, 0xF3, 0xAE, 0x57, 0x46, 0xA4, 0x0E, 0xC8, + 0x18, 0xB3, 0x37, 0x6E, 0xFF, 0x99, 0x6A, 0x26, 0xF8, 0x7E, 0xCF, 0x8B, + 0xDB, 0x43, 0xF3, 0x10, 0x30, 0xA7, 0x27, 0x96, 0x07, 0x8F, 0x50, 0xE0, + 0x45, 0x41, 0x16, 0xA6, 0xC1, 0x1B, 0xCB, 0x97, 0x00, 0x81, 0x9D, 0x3A, + 0x1A, 0x1E, 0xA0, 0x11, 0xFA, 0xBC, 0x89, 0xF5, 0x07, 0x66, 0x93, 0x4E, + 0xC4, 0x90, 0xF7, 0xA1, 0x65, 0x00, 0xDE, 0x39, 0x9A, 0xED, 0xCC, 0xEA, + 0x70, 0x57, 0x83, 0x62, 0x68, 0xE0, 0x9C, 0x0A, 0xC5, 0x2F, 0x6E, 0x75, + 0xB9, 0x93, 0x15, 0x62, 0xAC, 0x7C, 0x8B, 0x23, 0x32, 0xF4, 0xC9, 0x97, + 0xBA, 0x7D, 0x7D, 0x9D, 0x19, 0x13, 0x4B, 0x6E, 0xEF, 0xDE, 0x2B, 0x9B, + 0x30, 0x9B, 0x30, 0xA8, 0x22, 0xBC, 0x7B, 0x63, 0xC8, 0x08, 0x84, 0xA6, + 0x66, 0xE0, 0x87, 0x0C, 0x4A, 0x1B, 0xC3, 0xE2, 0xE4, 0x3B, 0x45, 0x21, + 0x45, 0x36, 0x05, 0x98, 0x41, 0xE1, 0x03, 0x82, 0x95, 0x69, 0x0C, 0x6D, + 0x4A, 0x13, 0x94, 0x15, 0x66, 0x9C, 0x2F, 0xA5, 0x93, 0x3F, 0x59, 0xE0, + 0x86, 0xED, 0x13, 0xD5, 0x9A, 0x0A, 0xEB, 0x0C, 0x58, 0xD1, 0xBB, 0x9C, + 0xD9, 0x16, 0x3C, 0xC7, 0x47, 0x7A, 0x2B, 0x62, 0xC5, 0x29, 0x08, 0x03, + 0xC6, 0xCE, 0x7B, 0xAB, 0x9B, 0x96, 0x69, 0x42, 0x9A, 0x27, 0x23, 0x0E, + 0xAC, 0x69, 0xDA, 0x84, 0xD3, 0xCC, 0xFF, 0x55, 0x58, 0x30, 0x45, 0xFD, + 0xBE, 0xA2, 0x25, 0xE1, 0x66, 0xF9, 0x70, 0xAE, 0x1E, 0xC3, 0x3E, 0xC6, + 0xF8, 0xF2, 0x0D, 0xA6, 0x49, 0x1F, 0x73, 0x82, 0xBE, 0x74, 0x8C, 0x3B, + 0xD7, 0xF1, 0xDA, 0x94, 0x41, 0x20, 0xD4, 0x45, 0xD8, 0xB4, 0x44, 0x97, + 0x85, 0x12, 0xE9, 0xB4, 0x4A, 0xDF, 0xD4, 0xED, 0xA5, 0x7D, 0xCD, 0x15, + 0x08, 0xD2, 0x7C, 0x46, 0xF4, 0x34, 0x0C, 0x0C, 0x56, 0x4A, 0xFA, 0xDB, + 0x8B, 0xC2, 0xB3, 0x0F, 0xB4, 0xEB, 0x26, 0xB6, 0xA7, 0x0A, 0x0C, 0xB7, + 0x19, 0x0A, 0x2C, 0x27, 0xC9, 0x1B, 0x83, 0x4B, 0x32, 0xAE, 0xBE, 0x11, + 0xA3, 0xBC, 0x3D, 0x94, 0x2B, 0xC8, 0xCB, 0x5D, 0x1F, 0xA6, 0x7C, 0xB6, + 0x4C, 0x5E, 0xCF, 0xA4, 0x51, 0x90, 0xDB, 0xE2, 0xBA, 0x4D, 0x14, 0x9D, + 0x22, 0x1E, 0x82, 0x2E, 0x28, 0xB9, 0x94, 0x83, 0x46, 0x63, 0xD6, 0xEA, + 0x14, 0x03, 0xDE, 0x74, 0x09, 0xD4, 0x21, 0x07, 0xFA, 0xEB, 0x36, 0xB5, + 0x76, 0x7D, 0x98, 0xBC, 0x3A, 0x9E, 0xD4, 0xB3, 0x24, 0x35, 0x87, 0x0C, + 0x70, 0x09, 0x7C, 0xE4, 0x70, 0x46, 0x6C, 0x8C, 0x19, 0xD0, 0x42, 0xE9, + 0x24, 0x2F, 0xCA, 0x16, 0xAD, 0x21, 0xD1, 0x16, 0xDF, 0x01, 0xEC, 0x23, + 0xCA, 0xE3, 0x81, 0xD2, 0x53, 0x20, 0x7E, 0xA1, 0x99, 0x8E, 0x88, 0x5D, + 0x73, 0xF8, 0xD9, 0x0E, 0x37, 0xB4, 0xF3, 0xE9, 0x66, 0x7B, 0x2D, 0xA0, + 0x5B, 0x4B, 0x28, 0xE5, 0xE3, 0x6C, 0xA2, 0x82, 0x6C, 0xA9, 0xE7, 0x1C, + 0xD3, 0x33, 0x2C, 0xB4, 0x7D, 0x95, 0xEA, 0x9F, 0x20, 0xEF, 0x02, 0x38, + 0x26, 0x3C, 0x5F, 0x39, 0xBB, 0xFA, 0x75, 0x10, 0xBE, 0x00, 0x1A, 0x4B, + 0xE8, 0xBC, 0x1B, 0xCE, 0x02, 0x59, 0x97, 0x36, 0xD9, 0xE9, 0x03, 0x2B, + 0x1A, 0x54, 0x35, 0x31, 0x9E, 0x59, 0xDE, 0x46, 0x56, 0x5D, 0xF6, 0xB5, + 0x91, 0xBC, 0x52, 0xB6, 0xB5, 0x9A, 0xF6, 0x8B, 0x5B, 0xE4, 0x7D, 0x4F, + 0xD6, 0x74, 0x2A, 0x7D, 0xC3, 0x85, 0x50, 0xF4, 0xCD, 0x3A, 0x81, 0x3C, + 0x2C, 0xA5, 0xF5, 0xAF, 0xE2, 0xA9, 0x9F, 0x97, 0xE5, 0x7B, 0x67, 0x64, + 0x46, 0xD4, 0x7C, 0x1A, 0x41, 0xD4, 0x2D, 0x7C, 0xE3, 0xD9, 0xFA, 0x2A, + 0xDE, 0x83, 0x17, 0xEC, 0x78, 0x02, 0x7D, 0xAF, 0x4A, 0x06, 0x53, 0xE3, + 0x44, 0x0B, 0x06, 0xEC, 0xD4, 0xA7, 0xA5, 0x87, 0x09, 0x23, 0x44, 0x76, + 0x3D, 0xD4, 0xA5, 0xEF, 0x5C, 0x75, 0x3A, 0xF7, 0x99, 0xC8, 0x21, 0x6A, + 0xFB, 0xBF, 0x0D, 0x08, 0xF0, 0xEE, 0xD6, 0x7E, 0xF8, 0x67, 0x02, 0x87, + 0xCA, 0x94, 0x27, 0x4D, 0x0C, 0x5F, 0xA1, 0x94, 0xC9, 0x1F, 0xE1, 0x4B, + 0x93, 0x2D, 0x40, 0xE0, 0x25, 0x5A, 0xDB, 0x28, 0xBE, 0x7F, 0xFD, 0x0D, + 0x6D, 0x22, 0xF4, 0x31, 0xE5, 0x1C, 0x84, 0x71, 0x09, 0x5F, 0x1D, 0x78, + 0xE9, 0x64, 0xD9, 0xB9, 0x82, 0x7D, 0xF5, 0x9B, 0x73, 0x4F, 0x74, 0x8B, + 0xA1, 0xB3, 0xC2, 0x01, 0x30, 0x1E, 0x20, 0x72, 0xB9, 0xB8, 0x92, 0x1A, + 0xFE, 0x34, 0xF8, 0x5F, 0x69, 0xEC, 0x09, 0x41, 0x50, 0x77, 0x44, 0xF9, + 0x68, 0xE4, 0xEC, 0xC7, 0xB5, 0xA3, 0x45, 0x6B, 0x03, 0xC4, 0xE8, 0xA0, + 0x53, 0xF2, 0x94, 0xB9, 0x49, 0xA0, 0x6D, 0x11, 0xBA, 0x1C, 0x89, 0x87, + 0x08, 0x72, 0xC0, 0xE3, 0x7B, 0x0C, 0x8D, 0x18, 0xDD, 0xB0, 0x3B, 0x0E, + 0xC2, 0x0E, 0xBB, 0x4B, 0x61, 0x22, 0x48, 0x64, 0x69, 0x54, 0xE8, 0x29, + 0x94, 0x84, 0xE5, 0xD7, 0x1A, 0x5F, 0x4B, 0xBC, 0xAD, 0x35, 0x82, 0xF1, + 0xFD, 0x40, 0x14, 0xAE, 0xD0, 0x28, 0x0E, 0xE9, 0xEE, 0x2E, 0x88, 0xFF, + 0xD1, 0xC9, 0xC5, 0x36, 0x39, 0xFB, 0x9F, 0xC9, 0x85, 0x97, 0x2A, 0x58, + 0x07, 0xD9, 0x6E, 0x6E, 0x83, 0x09, 0x6D, 0xC6, 0x92, 0x1C, 0xBF, 0x50, + 0xE3, 0xCB, 0xAD, 0x50, 0x3C, 0xDB, 0xF9, 0xE3, 0x32, 0x51, 0x58, 0x20, + 0xE6, 0xD8, 0xCA, 0x50, 0xF7, 0x50, 0x05, 0xAF, 0xB6, 0xF7, 0xAB, 0x3E, + 0x48, 0xB7, 0xA4, 0xB1, 0x52, 0x32, 0x2A, 0xD6, 0xC2, 0x78, 0x62, 0x05, + 0x34, 0x96, 0x61, 0xF1, 0x21, 0x14, 0x69, 0x6F, 0x10, 0x96, 0xDD, 0xE2, + 0x1D, 0xEB, 0xE5, 0x4F, 0xA0, 0x67, 0xA8, 0x46, 0x52, 0xBD, 0x2F, 0xA5, + 0x59, 0xF8, 0xCB, 0xB2, 0x51, 0x09, 0xD3, 0x13, 0x9C, 0x37, 0xD3, 0x9B, + 0xD4, 0x5C, 0x8E, 0xF9, 0xF2, 0xE4, 0xBF, 0x69, 0xA2, 0xB2, 0x06, 0xC1, + 0xF5, 0x65, 0xB9, 0x0A, 0xC6, 0x73, 0x77, 0xEF, 0x4E, 0x50, 0x2D, 0x2C, + 0xEE, 0xFF, 0xE9, 0x61, 0x8A, 0x07, 0xC9, 0x64, 0x48, 0x27, 0x4B, 0xCE, + 0xE1, 0x80, 0xCC, 0x14, 0x8F, 0x42, 0x92, 0x4D, 0x6F, 0x87, 0x48, 0x90, + 0x29, 0xF4, 0x4E, 0x72, 0x2C, 0xCC, 0x1A, 0xDD, 0x96, 0xDA, 0xFE, 0xD7, + 0xCB, 0xEE, 0x6F, 0xA4, 0xA0, 0xCB, 0xEE, 0x7F, 0xB3, 0x21, 0x54, 0xBA, + 0x6F, 0xC9, 0x53, 0x66, 0x7B, 0x38, 0xEC, 0xF4, 0x5F, 0xA0, 0x99, 0x23, + 0x5F, 0x79, 0xD7, 0x08, 0xCC, 0x74, 0xDA, 0x02, 0xA1, 0xFC, 0x01, 0xF0, + 0xF6, 0xA9, 0x9C, 0xA5, 0x85, 0xC6, 0x7E, 0xF6, 0x0F, 0x53, 0x11, 0x91, + 0x92, 0x6D, 0x60, 0xC7, 0x63, 0xD5, 0x1C, 0x84, 0x7E, 0x91, 0xDA, 0x97, + 0x5B, 0xD8, 0x3D, 0xBF, 0x83, 0xC3, 0x42, 0xC1, 0xDB, 0xB6, 0xE3, 0xFB, + 0x9F, 0x40, 0x36, 0x6E, 0xB9, 0x8F, 0x44, 0xB8, 0x73, 0x2C, 0x14, 0xBD, + 0x6C, 0x5E, 0x71, 0x76, 0xD2, 0xB9, 0xA2, 0x0B, 0xEC, 0xD4, 0x97, 0x9A, + 0x1F, 0xCF, 0x0C, 0x3D, 0x5F, 0x49, 0x24, 0x08, 0x3C, 0xEC, 0xCE, 0xA3, + 0x16, 0xFC, 0x7B, 0xD9, 0x98, 0x73, 0xEF, 0x74, 0x76, 0x0E, 0x51, 0x94, + 0xBC, 0x18, 0x71, 0xAB, 0x43, 0xA8, 0x27, 0xA1, 0x5D, 0x69, 0x23, 0xB5, + 0x5C, 0xFB, 0xFB, 0xD1, 0xBE, 0x59, 0x9C, 0x35, 0x1B, 0x5D, 0x49, 0x58, + 0xEB, 0x06, 0xFB, 0x0E, 0xFC, 0x3B, 0x4B, 0x47, 0xF9, 0x80, 0xD2, 0x50, + 0x97, 0xA1, 0xFB, 0x2F, 0x0D, 0x65, 0x7A, 0x30, 0xA3, 0x33, 0x04, 0x44, + 0x0B, 0x4A, 0x88, 0xEB, 0x59, 0x1A, 0xA5, 0x96, 0x8C, 0x09, 0x1E, 0x26, + 0x6A, 0x89, 0x74, 0x0C, 0x97, 0xDE, 0x51, 0x1C, 0x49, 0x16, 0x99, 0xDE, + 0x80, 0x95, 0xDA, 0x0B, 0xD6, 0x0B, 0x85, 0x83, 0x13, 0x70, 0xCC, 0x60, + 0xE3, 0x24, 0xDA, 0xB1, 0xE9, 0x8E, 0x29, 0x04, 0x68, 0xE7, 0x85, 0x0F, + 0x78, 0x9D, 0x69, 0x9A, 0x3A, 0xFC, 0x1B, 0x34, 0x65, 0x9D, 0x0D, 0x84, + 0xF5, 0x21, 0x30, 0xF6, 0xDF, 0x4E, 0xC5, 0xEB, 0x8C, 0x9A, 0x5F, 0x00, + 0xDE, 0x19, 0x2B, 0x1F, 0x7C, 0x86, 0x7D, 0x43, 0xA2, 0x43, 0xC5, 0xA9, + 0xDD, 0x84, 0x18, 0x90, 0xAB, 0x4C, 0xD3, 0x0B, 0x01, 0xA6, 0xCC, 0x04, + 0x24, 0xF0, 0x0C, 0x3A, 0x8B, 0x20, 0x36, 0x1C, 0xBF, 0x40, 0x5E, 0x1F, + 0x70, 0x7D, 0x69, 0xAA, 0xF6, 0xA8, 0x7B, 0x0F, 0x55, 0x4C, 0x63, 0xB8, + 0x28, 0x8B, 0x9F, 0xB1, 0xF9, 0x84, 0x20, 0x7C, 0xFD, 0x41, 0x94, 0xAA, + 0x92, 0xE0, 0x4E, 0x66, 0x7B, 0x4D, 0xBF, 0x96, 0xA3, 0xE9, 0x9B, 0xEC, + 0xD5, 0x75, 0x8B, 0x08, 0x8A, 0x1A, 0xFF, 0x0C, 0xF3, 0x9D, 0xFC, 0x92, + 0x61, 0x19, 0x41, 0x5A, 0x52, 0x5E, 0xC2, 0x91, 0xFE, 0xD8, 0x8F, 0xF2, + 0xD6, 0x0B, 0x73, 0x4B, 0x1F, 0x63, 0x30, 0xC5, 0x8E, 0x85, 0x8C, 0xE2, + 0xEA, 0xE1, 0xDC, 0xBC, 0xDA, 0xF7, 0xA1, 0xBA, 0x3F, 0xCC, 0xD7, 0xAC, + 0xF8, 0xAD, 0xB8, 0x53, 0x82, 0x3B, 0xD3, 0x69, 0xC1, 0xDD, 0xB7, 0xD5, + 0x89, 0x89, 0x50, 0xF7, 0x73, 0x56, 0xA7, 0xC5, 0x05, 0xB5, 0xEE, 0xE6, + 0x4A, 0x22, 0xF8, 0x33, 0xEB, 0xED, 0xF2, 0xDE, 0x73, 0x02, 0x95, 0x3C, + 0x0E, 0x4E, 0x5B, 0x0B, 0xE7, 0x6C, 0xF7, 0xE1, 0xF8, 0x67, 0x8A, 0xDF, + 0x41, 0x3F, 0xCC, 0x5E, 0x0C, 0xD6, 0x6E, 0x96, 0xBF, 0x95, 0x71, 0x4C, + 0x79, 0x7C, 0x3B, 0x88, 0x46, 0x73, 0x96, 0xA2, 0xDA, 0x6C, 0x71, 0xEC, + 0x54, 0x14, 0x79, 0x1E, 0x47, 0xF8, 0x94, 0x63, 0x28, 0x4A, 0xFB, 0xBB, + 0x82, 0x66, 0x91, 0x99, 0x0E, 0xBE, 0xBB, 0x33, 0x4D, 0x55, 0xE2, 0x08, + 0xCA, 0xE7, 0x52, 0x4A, 0xED, 0x64, 0xFF, 0xDD, 0xF7, 0xF9, 0xEA, 0x7D, + 0xD0, 0xBD, 0xB9, 0xAC, 0x62, 0x3B, 0xBC, 0xC6, 0x47, 0xEF, 0xEC, 0xA0, + 0x6D, 0x7D, 0x0F, 0xD8, 0xC6, 0x10, 0x90, 0x29, 0xCB, 0xF3, 0xA1, 0xC2, + 0x2B, 0x1D, 0xDD, 0x43, 0x6A, 0x49, 0xCB, 0x1F, 0x8C, 0x29, 0xC4, 0x4A, + 0xAB, 0xCB, 0xD3, 0x89, 0xF6, 0x24, 0x73, 0xA3, 0xA0, 0x5C, 0x9E, 0xE2, + 0x93, 0x2C, 0x18, 0x6A, 0xA1, 0x07, 0x5A, 0x77, 0xAA, 0x26, 0x38, 0x2C, + 0xF0, 0xA9, 0xFC, 0x6C, 0x94, 0xBE, 0xAF, 0x20, 0xCA, 0x8B, 0xB1, 0x7B, + 0x9A, 0x3A, 0xBD, 0x0B, 0xF5, 0x03, 0x73, 0x6D, 0x6F, 0x15, 0xB1, 0x8F, + 0x85, 0xDE, 0x24, 0x47, 0x94, 0x1B, 0x94, 0x25, 0xA5, 0x85, 0x31, 0x33, + 0x75, 0xA9, 0x0E, 0x16, 0x90, 0x12, 0x91, 0x72, 0x0F, 0x1E, 0x47, 0x7B, + 0x42, 0xB4, 0x99, 0x9E, 0xDA, 0xD8, 0xD9, 0xB4, 0x2C, 0xA4, 0x06, 0x05, + 0x2F, 0x83, 0xF6, 0xE7, 0x6D, 0x7A, 0x9E, 0x40, 0xCE, 0x91, 0x37, 0x6C, + 0x2A, 0x90, 0x87, 0x5D, 0x3E, 0xAA, 0xDB, 0x45, 0x55, 0xEC, 0x79, 0x03, + 0x03, 0x22, 0x3B, 0x61, 0x73, 0xBD, 0x53, 0xF3, 0x5A, 0x9B, 0xD4, 0xB4, + 0x0E, 0x2C, 0x68, 0x5F, 0x5D, 0x1B, 0xCC, 0xD6, 0x11, 0x7B, 0xA0, 0x4A, + 0xB6, 0xD0, 0x56, 0xD0, 0x26, 0xC1, 0xFE, 0x3B, 0x05, 0x20, 0x05, 0xC0, + 0xBA, 0xF4, 0xB7, 0x2B, 0x55, 0xE7, 0x69, 0x67, 0xB2, 0x7A, 0xB5, 0x59, + 0x78, 0xB4, 0x3E, 0x80, 0x08, 0x20, 0xD8, 0x75, 0x28, 0xF1, 0x21, 0xFE, + 0xA3, 0x86, 0xD1, 0x21, 0x76, 0x1F, 0xA6, 0x95, 0x60, 0xA7, 0x5E, 0xB5, + 0x68, 0x25, 0xB7, 0x02, 0x56, 0xDA, 0xF8, 0x6D, 0xE3, 0x79, 0x31, 0x63, + 0x76, 0xC4, 0x9B, 0x16, 0x08, 0xCA, 0xA8, 0xBA, 0xA0, 0x5A, 0x9A, 0x76, + 0x3D, 0x09, 0x80, 0x54, 0x89, 0x50, 0xFC, 0x4F, 0x04, 0x52, 0x2C, 0xAB, + 0x01, 0x3B, 0x52, 0xA7, 0x7E, 0x4F, 0x0C, 0x08, 0xE2, 0x18, 0x6F, 0xC6, + 0xDF, 0x77, 0x09, 0xE4, 0x21, 0x5E, 0xD7, 0xE2, 0x4A, 0x15, 0x1C, 0xB5, + 0xFD, 0x6F, 0x4D, 0xC6, 0xC8, 0x97, 0x26, 0x9F, 0x7C, 0x97, 0xE8, 0x05, + 0x4C, 0x89, 0xC3, 0xA6, 0x89, 0x38, 0x11, 0xAB, 0xEC, 0x7E, 0xF4, 0x4C, + 0xE1, 0x3A, 0x37, 0x24, 0x57, 0xD9, 0x93, 0xCE, 0x9E, 0xC8, 0x22, 0x78, + 0xBB, 0xDB, 0x35, 0x99, 0xFB, 0x82, 0xF4, 0x56, 0x3B, 0x4B, 0x72, 0xE3, + 0xF1, 0x48, 0xF3, 0xFE, 0x4B, 0x08, 0xAB, 0x33, 0xF7, 0x30, 0x57, 0xB1, + 0x9E, 0xF0, 0xE1, 0xCD, 0x11, 0x7D, 0xD2, 0x1B, 0x33, 0xE8, 0x22, 0xF2, + 0xA4, 0x90, 0xB7, 0xD1, 0xFA, 0xA9, 0xB3, 0x23, 0x0F, 0x0F, 0xF4, 0x56, + 0x9C, 0x15, 0x31, 0x59, 0x2C, 0x6F, 0xE4, 0xD6, 0x3A, 0xB4, 0x06, 0xCF, + 0x80, 0xDD, 0xAE, 0x6F, 0x9B, 0x54, 0x74, 0x31, 0x66, 0xF5, 0x1F, 0x41, + 0x0B, 0x4B, 0x19, 0x11, 0xA7, 0x7B, 0x58, 0x29, 0x96, 0x83, 0x44, 0x54, + 0x63, 0xAF, 0x09, 0x6B, 0xA4, 0xFE, 0x03, 0xCC, 0xA8, 0xCA, 0x4A, 0xDC, + 0xD9, 0x95, 0x56, 0xEB, 0x2E, 0x79, 0x7C, 0xCE, 0xDC, 0x14, 0x26, 0xF5, + 0x94, 0x9D, 0x9D, 0xD1, 0x95, 0x09, 0x8B, 0x2E, 0x21, 0xA0, 0x96, 0xC5, + 0x4E, 0x09, 0xA0, 0x35, 0x92, 0xAA, 0x95, 0x3C, 0x30, 0xE7, 0xC7, 0x6A, + 0x7B, 0xB1, 0x62, 0x01, 0x7D, 0x62, 0x78, 0x77, 0x62, 0xE6, 0x08, 0x63, + 0x77, 0x5E, 0xE1, 0x0A, 0xFD, 0xB5, 0x08, 0xE1, 0xED, 0x79, 0x27, 0xD9, + 0xB8, 0x1D, 0xB6, 0xBA, 0x3D, 0x6C, 0xA0, 0xB5, 0xA6, 0xE1, 0x92, 0x18, + 0x15, 0xC9, 0x25, 0x25, 0xF6, 0x21, 0x7A, 0x4E, 0x2E, 0x18, 0x08, 0x8D, + 0x54, 0x79, 0x35, 0xED, 0x76, 0x2F, 0x39, 0xB1, 0x38, 0x38, 0x9F, 0xB6, + 0xF4, 0x2D, 0xBF, 0x55, 0x64, 0x3F, 0xEB, 0x49, 0x17, 0x5D, 0xEC, 0x07, + 0xC1, 0x08, 0x4E, 0x75, 0xE7, 0xE8, 0xF7, 0xA3, 0xB5, 0x63, 0x01, 0x27, + 0xCF, 0xF5, 0x39, 0xDD, 0x65, 0x38, 0x4C, 0xD4, 0xE3, 0xAA, 0xAD, 0x55, + 0xD3, 0x3C, 0x6E, 0xC4, 0x99, 0x09, 0x3E, 0xD1, 0xA5, 0x0B, 0xEF, 0xF2, + 0x08, 0xA1, 0xBE, 0xD8, 0xE0, 0x7C, 0x58, 0xB9, 0x9E, 0x2E, 0x95, 0x4A, + 0xAA, 0x1D, 0xEE, 0xE3, 0x2F, 0x6A, 0xE2, 0x94, 0x70, 0xC4, 0x1C, 0x07, + 0xCC, 0x76, 0xE0, 0x40, 0xEA, 0x6D, 0xB4, 0x83, 0xA0, 0x6A, 0x97, 0x76, + 0x84, 0x11, 0x40, 0x9F, 0xCA, 0x18, 0x00, 0x6F, 0x7D, 0x07, 0xBE, 0xC9, + 0xFC, 0x2D, 0xD7, 0xAF, 0x60, 0x76, 0xC9, 0xD8, 0x28, 0xC2, 0xC8, 0xA8, + 0xD7, 0x60, 0x90, 0x64, 0x6C, 0xED, 0xEE, 0xFD, 0x2C, 0xD1, 0x3F, 0x35, + 0xD4, 0xCB, 0xA0, 0x34, 0xAA, 0xB0, 0x3A, 0x91, 0x07, 0x1B, 0xD4, 0xB5, + 0x33, 0xD2, 0xD3, 0x9D, 0x08, 0xCD, 0x45, 0x01, 0x83, 0x04, 0xB1, 0xE7, + 0x0C, 0x1A, 0x57, 0x9F, 0xBB, 0xED, 0x37, 0x46, 0xB1, 0x16, 0x87, 0x3C, + 0x20, 0xDE, 0x63, 0x10, 0xAF, 0x2D, 0x77, 0x71, 0x56, 0xEF, 0x7C, 0x14, + 0xD0, 0xE3, 0x1E, 0xFB, 0x1F, 0x77, 0x18, 0x1E, 0xA8, 0xD3, 0x40, 0xA7, + 0xD7, 0x1F, 0x36, 0x7D, 0x87, 0x1C, 0x42, 0xF6, 0x2F, 0x51, 0xAF, 0x69, + 0x2C, 0xCF, 0x79, 0x11, 0xD1, 0x17, 0x47, 0xD3, 0x44, 0x86, 0x9D, 0x2B, + 0x44, 0xA3, 0x74, 0x1C, 0x83, 0x75, 0xAB, 0xD1, 0xA5, 0xFE, 0x14, 0x0A, + 0x41, 0x76, 0x89, 0x1B, 0x08, 0x4F, 0x29, 0x30, 0x82, 0xD1, 0xFE, 0xD6, + 0x0B, 0x71, 0xCD, 0x2C, 0x8E, 0x31, 0x69, 0xAF, 0xD8, 0x67, 0xA6, 0x1A, + 0x8E, 0x2A, 0xD4, 0xF1, 0x83, 0xC3, 0xEC, 0x08, 0x76, 0x27, 0xA3, 0xB5, + 0xF6, 0x7B, 0xC2, 0x6F, 0xEA, 0xD0, 0x52, 0x6C, 0x6E, 0x2F, 0x18, 0xBB, + 0x23, 0x10, 0x3E, 0x7F, 0x37, 0x90, 0x89, 0x7E, 0xF4, 0xBA, 0x47, 0x09, + 0xCE, 0x80, 0x34, 0x5D, 0x20, 0x87, 0x1F, 0x76, 0x30, 0xBF, 0xC3, 0xFC, + 0x3C, 0xB3, 0x88, 0x89, 0xC9, 0x3D, 0xA4, 0xF4, 0xCE, 0x7E, 0x93, 0xA6, + 0x88, 0xFA, 0xAC, 0x32, 0x64, 0x19, 0x76, 0xE7, 0xE0, 0xAE, 0x4B, 0x4F, + 0xC3, 0xAC, 0x82, 0xD9, 0xDB, 0x3D, 0xBE, 0x3E, 0x58, 0x4B, 0xBF, 0xD0, + 0x17, 0x43, 0xEC, 0x17, 0xEA, 0xFA, 0xA9, 0x6F, 0x9A, 0x33, 0xC2, 0xB9, + 0xDC, 0xFF, 0x80, 0x14, 0x9D, 0xD6, 0xA1, 0x41, 0x7F, 0xFE, 0x08, 0x57, + 0x21, 0xD6, 0xEB, 0xED, 0xEF, 0xA2, 0xAD, 0x5D, 0x9E, 0xC5, 0x31, 0xC6, + 0xBE, 0x73, 0xB9, 0x7D, 0x58, 0x12, 0x28, 0x35, 0x0A, 0xB7, 0x56, 0x9A, + 0x23, 0x61, 0x0B, 0x3B, 0x8D, 0x20, 0x35, 0xC7, 0xBF, 0xB1, 0xCE, 0x33, + 0x28, 0xEC, 0x2F, 0x71, 0x49, 0xE1, 0x90, 0x36, 0x53, 0x9D, 0x19, 0xB1, + 0xBB, 0xFF, 0xF4, 0x50, 0x89, 0xE8, 0x69, 0x88, 0xAF, 0xB6, 0x58, 0x46, + 0xDF, 0x73, 0xEC, 0x5B, 0x82, 0xA6, 0xDC, 0x18, 0x71, 0x81, 0xE3, 0x03, + 0x25, 0x71, 0x0E, 0x0B, 0xB5, 0x63, 0x67, 0x1A, 0xD1, 0x13, 0x0A, 0xE5, + 0xFF, 0x4B, 0x97, 0xEA, 0xBB, 0x75, 0xD7, 0x31, 0xCD, 0x4B, 0x06, 0xBD, + 0x6E, 0xB1, 0xA1, 0xD9, 0x30, 0x52, 0x8F, 0xF4, 0x4C, 0x51, 0x16, 0x72, + 0x73, 0x81, 0x48, 0x88, 0x3F, 0x9B, 0x80, 0x40, 0xDD, 0xE7, 0xA4, 0x98, + 0xC3, 0xB6, 0x7A, 0xF9, 0x91, 0xA1, 0xB1, 0xBB, 0x1D, 0x16, 0x3D, 0x13, + 0xF9, 0x7D, 0xD9, 0x31, 0xE6, 0x19, 0x83, 0xCF, 0xA6, 0x59, 0xC9, 0x8F, + 0xF7, 0x1E, 0xA3, 0x9C, 0x2B, 0x65, 0x9D, 0x21, 0x5B, 0x7C, 0xA4, 0x4D, + 0x07, 0x24, 0x99, 0xA2, 0x51, 0xDF, 0x4D, 0x5F, 0xB6, 0xB0, 0x17, 0xAA, + 0xEF, 0x16, 0xAB, 0x45, 0xAA, 0xD2, 0xA0, 0xBC, 0x09, 0x1B, 0x9A, 0x3C, + 0x27, 0x86, 0xE0, 0xAD, 0x9E, 0xE4, 0x4D, 0x73, 0x09, 0x88, 0xCC, 0x55, + 0x2A, 0x8A, 0x33, 0x29, 0x84, 0xD1, 0x8D, 0xF6, 0xE6, 0xDF, 0x27, 0x70, + 0xA0, 0xD6, 0x5B, 0x31, 0xEE, 0x7E, 0x7A, 0x31, 0x87, 0xF2, 0xCC, 0x4C, + 0xBE, 0x63, 0xC1, 0x41, 0xC6, 0x39, 0xFA, 0x3B, 0x9A, 0x60, 0x05, 0x29, + 0xDF, 0x91, 0x9E, 0x3B, 0x7B, 0xDB, 0x8F, 0x6E, 0xFB, 0x0F, 0xF1, 0x20, + 0xC7, 0x08, 0x47, 0x2A, 0x14, 0xB4, 0x7C, 0x93, 0xEB, 0x63, 0xE3, 0x03, + 0xC7, 0x4D, 0x9F, 0x7D, 0x29, 0x7F, 0xC3, 0x03, 0x44, 0x89, 0x22, 0x8D, + 0x2D, 0xF1, 0x86, 0xCB, 0x28, 0xBE, 0x39, 0xAC, 0x16, 0xBB, 0x73, 0xB2, + 0x44, 0xC6, 0xA5, 0x63, 0x06, 0xE2, 0xED, 0x76, 0x95, 0x73, 0x02, 0xCE, + 0x6A, 0x7E, 0x55, 0x2D, 0x2A, 0x1D, 0x78, 0x30, 0x3B, 0x0A, 0xAB, 0x3A, + 0xDB, 0x21, 0xD8, 0x6D, 0xA4, 0xBE, 0xAD, 0x07, 0xD1, 0x08, 0xAC, 0x26, + 0xBC, 0x4F, 0x50, 0x31, 0xA2, 0xDA, 0x18, 0x75, 0xA2, 0xE9, 0x1D, 0x93, + 0xB6, 0x34, 0x01, 0xA5, 0xE9, 0xBE, 0x94, 0x7B, 0x33, 0x61, 0x7C, 0x71, + 0xE3, 0x72, 0x78, 0x45, 0x3D, 0x2A, 0x7A, 0x87, 0x5B, 0x8D, 0x4E, 0xF8, + 0x79, 0x01, 0xF6, 0x49, 0x5B, 0x9B, 0xBD, 0xB8, 0xC8, 0xAE, 0xBD, 0xC2, + 0x5D, 0x14, 0x8B, 0x51, 0x4F, 0x86, 0x56, 0xB2, 0xD8, 0xF5, 0x5C, 0x0F, + 0x38, 0xDC, 0x30, 0x15, 0x2B, 0x6A, 0x15, 0x98, 0x08, 0x23, 0x5A, 0xEA, + 0x1E, 0xCA, 0xC7, 0xAC, 0x74, 0x26, 0xD0, 0x7C, 0xC6, 0x75, 0x1A, 0x67, + 0x1E, 0xD3, 0xD3, 0x26, 0x9F, 0x82, 0x2E, 0x90, 0x5D, 0x50, 0xD1, 0x4F, + 0x2B, 0x79, 0x5C, 0xCE, 0x4A, 0x8F, 0x9F, 0xBB, 0x60, 0xD4, 0x21, 0x92, + 0x63, 0x3E, 0xBC, 0x77, 0x57, 0x0E, 0xC0, 0x56, 0x62, 0x6F, 0x47, 0x75, + 0x88, 0xF0, 0x87, 0xA3, 0xCC, 0x1F, 0x12, 0xCC, 0xA2, 0x0B, 0x74, 0x19, + 0xEE, 0xD6, 0x2F, 0x5C, 0x34, 0x06, 0x50, 0x7D, 0xBB, 0xB6, 0x21, 0xDB, + 0xB4, 0xB1, 0x8C, 0x88, 0x42, 0x8E, 0x3B, 0xBF, 0x89, 0x5F, 0x89, 0x77, + 0x5A, 0x46, 0xE4, 0x02, 0xE4, 0x48, 0xBB, 0xA9, 0x3F, 0x09, 0xAA, 0x1F, + 0x62, 0x98, 0xF8, 0xE6, 0xCD, 0x62, 0xCB, 0xF7, 0xD0, 0x1D, 0xA4, 0x7A, + 0x18, 0x0A, 0x0D, 0x44, 0x6C, 0x14, 0xDB, 0x97, 0x94, 0xCA, 0x98, 0x7F, + 0x60, 0x36, 0x1E, 0x13, 0x52, 0xE8, 0x7F, 0x18, 0xEE, 0x99, 0xFA, 0xCB, + 0x23, 0x5D, 0xB1, 0x2B, 0xA1, 0xFE, 0xD6, 0xB0, 0x77, 0x13, 0xE4, 0x55, + 0xCC, 0x56, 0xFA, 0x8E, 0x29, 0x25, 0xA9, 0xDF, 0x81, 0x58, 0xEE, 0xB6, + 0x3B, 0xC2, 0x29, 0xB4, 0x1E, 0x72, 0xCA, 0x55, 0xD3, 0x7B, 0xA6, 0xDD, + 0x48, 0x96, 0x3B, 0x76, 0x3A, 0x41, 0xF3, 0x2A, 0x94, 0x13, 0xF3, 0x51, + 0xC3, 0x00, 0x09, 0x4F, 0x88, 0xBA, 0x24, 0xD1, 0x14, 0x12, 0x14, 0x2D, + 0xC1, 0xAB, 0x3B, 0x21, 0x54, 0x8B, 0x4C, 0xDC, 0x17, 0x08, 0x1E, 0xE8, + 0x83, 0x4A, 0x3E, 0x25, 0x0E, 0x7B, 0xBC, 0xD5, 0xC7, 0xCA, 0x13, 0x31, + 0x1B, 0xD8, 0x8F, 0xE2, 0x4A, 0x23, 0x24, 0xA9, 0x69, 0xF4, 0x8E, 0x65, + 0xB2, 0xEF, 0xA1, 0x83, 0xFF, 0xBF, 0x01, 0xE7, 0x8B, 0xFC, 0xD1, 0x92, + 0x91, 0xCF, 0x3D, 0xB7, 0x49, 0x3B, 0xF5, 0x81, 0x54, 0xB1, 0xFF, 0xB6, + 0xD9, 0x2C, 0x31, 0xA1, 0xC0, 0x8F, 0x56, 0x54, 0x52, 0x5B, 0x7D, 0x80, + 0x61, 0x44, 0x44, 0x8C, 0xC4, 0xFA, 0x8E, 0x59, 0xDE, 0xA1, 0xC5, 0xFB, + 0xF7, 0x40, 0xE7, 0xD6, 0x06, 0x55, 0xC3, 0x19, 0x73, 0x21, 0xFD, 0x86, + 0x8C, 0x68, 0x1B, 0x37, 0x7A, 0xC9, 0xC4, 0x70, 0x07, 0x38, 0x15, 0x03, + 0xA7, 0x2A, 0xBD, 0x37, 0x8A, 0xD0, 0x63, 0x13, 0x66, 0xEA, 0x9D, 0x65, + 0x67, 0x87, 0x78, 0xE8, 0xD2, 0x7E, 0xDB, 0x90, 0xA2, 0xAC, 0x9F, 0xAC, + 0x7A, 0x81, 0xF1, 0x5F, 0x4C, 0x6C, 0x53, 0x0C, 0xD5, 0x9E, 0x64, 0x1D, + 0xD1, 0x85, 0x5D, 0x65, 0x54, 0x9C, 0xE5, 0x20, 0xF7, 0xE5, 0x9C, 0x03, + 0x29, 0x71, 0x9A, 0xE4, 0xC7, 0xD1, 0x91, 0x07, 0x66, 0x60, 0x89, 0x37, + 0xF9, 0x3F, 0x58, 0x7D, 0x07, 0x06, 0xCC, 0xEE, 0x05, 0x49, 0xEA, 0x50, + 0xD7, 0x4A, 0x76, 0x63, 0x16, 0x66, 0xE3, 0x1D, 0xDC, 0xCA, 0x3B, 0x0B, + 0x89, 0x4C, 0xF8, 0x04, 0xD2, 0x50, 0x62, 0x2C, 0x1B, 0x7E, 0x62, 0x8B, + 0x7B, 0x55, 0x68, 0x3F, 0xAC, 0xD0, 0x5E, 0xB4, 0xF8, 0x25, 0xE5, 0xEA, + 0x40, 0xA4, 0x06, 0x7B, 0xA3, 0xC6, 0x8B, 0xE1, 0x4A, 0x83, 0x4B, 0xCC, + 0x9C, 0xDA, 0x7C, 0x9F, 0xF6, 0xE7, 0x7A, 0xC2, 0xDD, 0x9E, 0x2F, 0xB4, + 0x3A, 0x07, 0xBA, 0x47, 0x83, 0x43, 0x79, 0xBE, 0x69, 0x19, 0x02, 0x48, + 0x03, 0x22, 0x10, 0xAE, 0x99, 0x80, 0xEE, 0xB0, 0xDE, 0xBA, 0xC1, 0x51, + 0x4B, 0xF4, 0x2E, 0x61, 0xB0, 0xF9, 0x1B, 0x88, 0x6D, 0x92, 0x8B, 0x36, + 0x30, 0x92, 0x32, 0x0A, 0xE8, 0xA5, 0x79, 0xAC, 0x27, 0x18, 0xE9, 0x67, + 0x4B, 0xBC, 0x12, 0xE5, 0xB3, 0x66, 0x19, 0xD8, 0xFC, 0x62, 0x55, 0xF0, + 0x59, 0xFB, 0x58, 0x57, 0x15, 0xB9, 0x15, 0x89, 0x32, 0xAA, 0xA1, 0x0F, + 0xC7, 0xD8, 0xFB, 0xD5, 0x6E, 0x94, 0xB8, 0xE3, 0xC7, 0x7B, 0x76, 0x25, + 0x0D, 0xB1, 0xD7, 0x2D, 0x26, 0x5E, 0xCA, 0x88, 0xA3, 0x96, 0xD8, 0x1C, + 0xBC, 0x31, 0x34, 0x6A, 0xBA, 0x99, 0x64, 0x51, 0xEF, 0x4C, 0xB4, 0x6A, + 0x06, 0xEB, 0x4F, 0x98, 0x95, 0x56, 0x75, 0x6F, 0x74, 0x86, 0x22, 0x53, + 0x9C, 0x0A, 0x1E, 0x4D, 0xF0, 0xB0, 0xD5, 0x1B, 0x85, 0x8F, 0xD6, 0x37, + 0xE1, 0x25, 0x66, 0x5E, 0xE9, 0x89, 0x8F, 0x51, 0x51, 0x8D, 0x76, 0x99, + 0xD7, 0xBC, 0x17, 0xEE, 0xF6, 0x6B, 0x3F, 0xCF, 0x56, 0x31, 0x50, 0x77, + 0x84, 0x1E, 0xFB, 0x4D, 0x5A, 0x35, 0xBE, 0xE3, 0xAF, 0x88, 0xC3, 0xAC, + 0x22, 0xDF, 0x56, 0x58, 0x34, 0x52, 0x8A, 0xCA, 0xE7, 0x9D, 0x76, 0xD4, + 0xB8, 0x86, 0xFB, 0xD9, 0xBD, 0x59, 0xEC, 0x84, 0x29, 0x06, 0x0E, 0x65, + 0x65, 0x18, 0x50, 0x57, 0xE5, 0xCC, 0xA2, 0xBB, 0x1A, 0x85, 0xF6, 0xFD, + 0xBA, 0x40, 0xA8, 0x1E, 0x52, 0xAD, 0x36, 0x12, 0xC7, 0xF1, 0x9B, 0xEA, + 0x50, 0xA0, 0xFA, 0x99, 0x54, 0xF5, 0xD0, 0xFA, 0xDA, 0xEC, 0x70, 0xC8, + 0x21, 0xA0, 0xEA, 0xEF, 0xC0, 0x51, 0x26, 0x3A, 0x13, 0xD6, 0x4C, 0x95, + 0xC5, 0x07, 0xA1, 0xA8, 0x3B, 0x63, 0x8A, 0x4E, 0xAE, 0xE8, 0xA4, 0x68, + 0x8E, 0xA3, 0x13, 0xD9, 0x13, 0xDF, 0xA2, 0xB3, 0xEF, 0x9F, 0x4E, 0x0D, + 0x00, 0xB2, 0xC2, 0x40, 0xBE, 0x0D, 0xD1, 0x59, 0x20, 0x1F, 0x27, 0x2D, + 0x99, 0xEE, 0x1D, 0x05, 0xD7, 0x7D, 0x2A, 0xA3, 0x86, 0x44, 0x54, 0x28, + 0x8A, 0x31, 0x1C, 0x66, 0xFB, 0x9F, 0x68, 0xE8, 0xCA, 0xEB, 0x74, 0x9A, + 0xAC, 0x77, 0x2F, 0xF4, 0xCF, 0x9D, 0x48, 0xA9, 0x8F, 0xB2, 0x9F, 0x74, + 0x9F, 0x75, 0xE3, 0x88, 0x42, 0xB1, 0x5F, 0x7C, 0xEE, 0xED, 0x7E, 0x5A, + 0xB0, 0x62, 0xCD, 0x2F, 0x95, 0x68, 0x2F, 0xF2, 0x58, 0x29, 0x8A, 0x22, + 0x31, 0xC8, 0x82, 0x75, 0x51, 0x9B, 0xF7, 0xE3, 0x59, 0x52, 0xD9, 0x5B, + 0xDE, 0x49, 0x54, 0x22, 0xD1, 0xF2, 0xF6, 0xB0, 0x0B, 0xB8, 0x4E, 0x08, + 0x43, 0xF9, 0xEA, 0x98, 0xB4, 0xE3, 0x10, 0xB7, 0x8B, 0x79, 0x2C, 0x86, + 0xAC, 0x75, 0x80, 0x6A, 0xC2, 0x18, 0x43, 0x06, 0x5E, 0xB9, 0x80, 0xA9, + 0x87, 0x02, 0x9A, 0xF5, 0x57, 0x73, 0xA2, 0x68, 0x49, 0x4E, 0xEF, 0x2D, + 0x48, 0x7F, 0x0B, 0x0C, 0x91, 0x35, 0x8A, 0x20, 0x7F, 0xB2, 0xD8, 0x7A, + 0x88, 0x70, 0xC3, 0xA7, 0x37, 0xC4, 0x68, 0x21, 0x3E, 0x55, 0x91, 0x88, + 0x07, 0x2C, 0x0F, 0xC6, 0xB3, 0x49, 0x7F, 0x85, 0xFB, 0xFF, 0x2D, 0x7E, + 0x78, 0x13, 0xB7, 0xD5, 0x69, 0x21, 0xB7, 0x7C, 0xAF, 0x20, 0x14, 0xFD, + 0xD9, 0x9C, 0xA8, 0xB2, 0x2F, 0xFE, 0x28, 0x8B, 0xF3, 0x66, 0xF0, 0xA5, + 0xED, 0x8E, 0x1B, 0x1C, 0xF8, 0x24, 0x67, 0xB7, 0xE6, 0x06, 0x33, 0xC6, + 0x60, 0x28, 0x6A, 0xE6, 0xB8, 0xA1, 0xCF, 0x9B, 0x15, 0x41, 0xA4, 0x7A, + 0x7F, 0xAD, 0xF4, 0x8A, 0x1F, 0xE1, 0x77, 0x07, 0x51, 0x66, 0x8C, 0x6B, + 0x35, 0x81, 0x60, 0x66, 0x8D, 0x58, 0xA1, 0xDF, 0xAA, 0x0C, 0x3B, 0x9A, + 0x70, 0x0F, 0x1F, 0x06, 0x67, 0xC2, 0x0C, 0x6E, 0xD1, 0xFC, 0x93, 0x5C, + 0xC7, 0x1F, 0x19, 0x59, 0x70, 0x6C, 0x5C, 0xC8, 0xFA, 0x9C, 0xFB, 0xB2, + 0x46, 0x98, 0x5F, 0x1F, 0x80, 0x7B, 0x8D, 0x16, 0x2D, 0x2A, 0x03, 0xF6, + 0x27, 0xCB, 0x11, 0xAE, 0x9D, 0xE5, 0x36, 0xDD, 0x20, 0x52, 0x53, 0xD7, + 0x66, 0x22, 0x4F, 0x51, 0xE1, 0x2B, 0x7E, 0xF1, 0x9A, 0xAC, 0xBC, 0x8A, + 0x6D, 0x78, 0x60, 0x62, 0x20, 0xB3, 0xA2, 0x1E, 0xA5, 0x68, 0x1A, 0x29, + 0x45, 0x25, 0x7E, 0xF8, 0x50, 0x62, 0xED, 0x4E, 0x06, 0x44, 0x2A, 0x79, + 0xF4, 0x52, 0xD0, 0x4F, 0x2C, 0x2F, 0xC6, 0xFF, 0x74, 0xE2, 0x5B, 0x13, + 0x4C, 0x99, 0xB5, 0x7D, 0x0D, 0x01, 0x66, 0x77, 0x3C, 0x74, 0x38, 0x11, + 0xFE, 0x1F, 0x31, 0xAA, 0xF4, 0xAF, 0x42, 0x7D, 0xC7, 0x62, 0xA1, 0xA2, + 0xBB, 0xFE, 0xE9, 0x89, 0x8F, 0x3D, 0x0B, 0xE4, 0xA0, 0x5B, 0xA1, 0x18, + 0x87, 0x36, 0xA0, 0x75, 0x06, 0xA8, 0x83, 0x00, 0xF3, 0x5B, 0x83, 0x3E, + 0x42, 0xFA, 0x09, 0x4C, 0x35, 0x27, 0xA7, 0xB0, 0x00, 0xDA, 0x8C, 0x8E, + 0x1A, 0x51, 0x9B, 0x5A, 0x8F, 0x05, 0x9A, 0xBD, 0xCB, 0x10, 0x12, 0x4D, + 0x17, 0xE5, 0x78, 0xDF, 0xE7, 0x49, 0x5D, 0xB0, 0x78, 0x5F, 0x44, 0xE1, + 0xDB, 0xE9, 0x84, 0xD9, 0x90, 0xAD, 0xBE, 0x86, 0x95, 0x81, 0xC1, 0xCD, + 0x1B, 0xD4, 0xCE, 0x6D, 0x5E, 0xB3, 0x52, 0xB1, 0x67, 0x5E, 0xF2, 0xE4, + 0xC5, 0xCB, 0x5C, 0xC6, 0x57, 0xBE, 0x1C, 0x0E, 0xDE, 0x7B, 0xD3, 0xB3, + 0x01, 0xDC, 0x1F, 0x11, 0x12, 0xFC, 0x62, 0x9B, 0xFD, 0xF8, 0x8C, 0xDC, + 0xE4, 0x35, 0x22, 0x61, 0x0E, 0xA0, 0x80, 0xF9, 0x48, 0xFC, 0x1C, 0x36, + 0x2A, 0x02, 0x4A, 0xDC, 0x55, 0xE2, 0x35, 0xC8, 0xB4, 0x2E, 0xED, 0x43, + 0x11, 0x31, 0x6C, 0xFB, 0x77, 0x68, 0x5E, 0xC6, 0x72, 0x37, 0x08, 0x5A, + 0xC4, 0x98, 0x23, 0x9E, 0x0A, 0xE3, 0x82, 0x1B, 0xCA, 0xDE, 0x3F, 0xBE, + 0xF0, 0x74, 0x6C, 0x9E, 0x16, 0x9B, 0x41, 0xC9, 0x79, 0xB9, 0x82, 0x9D, + 0x66, 0x60, 0x09, 0xBD, 0x46, 0x2F, 0xDC, 0xF8, 0xC9, 0xB8, 0x0B, 0xB6, + 0xEB, 0x30, 0xD1, 0xAD, 0x93, 0xB4, 0xE3, 0xD1, 0xE6, 0x35, 0xE1, 0x6B, + 0xC7, 0x49, 0x47, 0xAE, 0xF1, 0x7A, 0x7A, 0x2E, 0xAE, 0xF8, 0xEC, 0x5D, + 0x62, 0x67, 0xFD, 0x9D, 0x18, 0x74, 0xBA, 0xA6, 0xA8, 0xA8, 0x6E, 0xD8, + 0xBF, 0x24, 0xCA, 0x74, 0x51, 0xE1, 0x6A, 0x8B, 0xAC, 0x96, 0x43, 0xC5, + 0x75, 0x60, 0xAE, 0xA9, 0xCC, 0x89, 0x06, 0xA9, 0x6C, 0xEA, 0x47, 0x53, + 0x60, 0x21, 0x7A, 0x38, 0xD4, 0xE4, 0x8A, 0xE6, 0x86, 0xAB, 0x36, 0x39, + 0x2F, 0xEA, 0x08, 0xC1, 0x32, 0xDA, 0xA2, 0xC4, 0xD5, 0xB2, 0xC0, 0x12, + 0x37, 0x9E, 0xDC, 0xBA, 0xC4, 0xF6, 0x8D, 0xDF, 0xA1, 0x9A, 0x3B, 0x70, + 0xE9, 0x9F, 0x4E, 0xD1, 0xE1, 0x27, 0x52, 0x27, 0x69, 0x57, 0xFF, 0x63, + 0xF6, 0x68, 0xF5, 0xF1, 0x42, 0x31, 0xE5, 0x05, 0xD2, 0xB7, 0xB5, 0x21, + 0xB9, 0xCE, 0x5D, 0xD4, 0xBB, 0xFE, 0xC5, 0x09, 0x8E, 0x98, 0xAA, 0xE7, + 0x9D, 0xE4, 0x92, 0x42, 0x7C, 0x2F, 0xC2, 0xC8, 0x05, 0xE0, 0xF7, 0xC5, + 0xD5, 0xFA, 0xC7, 0x9E, 0x75, 0x32, 0x7A, 0x7C, 0x18, 0x08, 0xB8, 0x90, + 0xDE, 0x09, 0xF1, 0x15, 0xA5, 0x6F, 0xFC, 0xE2, 0xAD, 0x97, 0x9A, 0x63, + 0x55, 0xDB, 0x2E, 0x0A, 0xFC, 0x2C, 0x3B, 0xD0, 0x47, 0xC4, 0xF1, 0x06, + 0x32, 0xF0, 0x5D, 0xC9, 0xC9, 0x87, 0x13, 0xC0, 0x67, 0xC4, 0x8B, 0x76, + 0x80, 0x62, 0x60, 0xC9, 0x3B, 0x0C, 0x81, 0x51, 0x00, 0xFD, 0xF6, 0x9B, + 0xE4, 0xF9, 0xC1, 0x03, 0xBB, 0x0F, 0x5D, 0xE3, 0xAC, 0xE6, 0x1F, 0x49, + 0xB5, 0x3C, 0x3E, 0x60, 0xC7, 0xC5, 0xD3, 0xB8, 0xAF, 0x07, 0xDF, 0x60, + 0x4B, 0x19, 0xB5, 0x90, 0x33, 0x41, 0x61, 0x75, 0xDB, 0x50, 0xD4, 0xB6, + 0x63, 0xFA, 0xF9, 0x83, 0x06, 0xBC, 0x4E, 0xF2, 0x53, 0xF0, 0xDC, 0xB8, + 0xD5, 0x9B, 0x63, 0xEE, 0xF3, 0x92, 0x68, 0xBB, 0xCB, 0xC3, 0x08, 0x7E, + 0x12, 0x4A, 0x8A, 0x48, 0xF9, 0xED, 0xA7, 0x6A, 0xCE, 0xDE, 0x0D, 0x7A, + 0xED, 0x2E, 0xA4, 0x75, 0x6C, 0x94, 0xB3, 0x0A, 0xF1, 0x3E, 0xA4, 0xE6, + 0x8F, 0x34, 0x13, 0x0E, 0xC7, 0xCE, 0x6B, 0x82, 0x5D, 0xD3, 0xD2, 0x79, + 0x7B, 0x6F, 0xB5, 0x00, 0x8B, 0xD6, 0x47, 0x95, 0x98, 0xDD, 0x56, 0xBC, + 0x8C, 0x40, 0x3B, 0x5A, 0x65, 0x88, 0x9F, 0xF5, 0x6F, 0x96, 0x32, 0x40, + 0x31, 0xAC, 0x3F, 0x18, 0x22, 0xE2, 0xDB, 0xD1, 0xF7, 0xAD, 0x48, 0x20, + 0x31, 0x8D, 0x3F, 0xD0, 0xC9, 0x88, 0x7F, 0x94, 0x34, 0x69, 0xBC, 0xEE, + 0xB2, 0x5B, 0x42, 0x82, 0x31, 0xBC, 0x83, 0xBD, 0x2C, 0x5A, 0x57, 0x74, + 0x94, 0x29, 0xC4, 0xD0, 0x18, 0x8B, 0x2C, 0xAA, 0x09, 0x14, 0x99, 0x33, + 0xD0, 0xDA, 0xD8, 0xCD, 0xED, 0x75, 0xBD, 0x69, 0xAA, 0x34, 0xD8, 0x4B, + 0x3D, 0xC2, 0xC0, 0x69, 0x7F, 0x2F, 0x0B, 0xDE, 0x23, 0xEE, 0xB1, 0x7C, + 0xD8, 0x5A, 0x7C, 0x0C, 0x45, 0x89, 0x08, 0x21, 0xE4, 0x23, 0x99, 0x75, + 0xFC, 0x0C, 0xF1, 0x59, 0x19, 0x07, 0xA9, 0xA9, 0x5E, 0x48, 0xEB, 0xCD, + 0x10, 0x61, 0xC2, 0xEB, 0x60, 0x74, 0x34, 0x80, 0xC2, 0xAA, 0xEF, 0x35, + 0x55, 0x19, 0x8A, 0x95, 0xE4, 0x4A, 0x88, 0x9E, 0x70, 0x73, 0x17, 0xA5, + 0x75, 0xB6, 0xBC, 0x5E, 0x5E, 0xAC, 0x88, 0xA8, 0x4E, 0x54, 0x71, 0x4F, + 0xB8, 0x84, 0xC2, 0xA3, 0xB5, 0x9D, 0x6C, 0xA2, 0x9B, 0x6C, 0x6F, 0xA6, + 0xD8, 0xE6, 0x83, 0x5D, 0xC3, 0x01, 0x2F, 0xB5, 0xE0, 0xFF, 0x62, 0x52, + 0xD4, 0x71, 0x8D, 0x2D, 0x72, 0x57, 0xF9, 0x90, 0xA7, 0x76, 0x3D, 0x47, + 0x76, 0xDE, 0x7E, 0x1B, 0xFB, 0xA4, 0x44, 0x7A, 0xE1, 0xBC, 0xB9, 0x72, + 0x3C, 0x42, 0xC6, 0x26, 0x0F, 0x70, 0xF1, 0xA6, 0x58, 0x91, 0xB1, 0xE7, + 0xA1, 0x70, 0x13, 0x75, 0xFE, 0x2C, 0xC2, 0x11, 0x48, 0x19, 0x72, 0xDF, + 0xD2, 0x1E, 0x5A, 0x35, 0xC9, 0x2B, 0xE6, 0x8E, 0xC6, 0x10, 0x9E, 0x6F, + 0x67, 0xCF, 0x40, 0xB8, 0x7D, 0x60, 0x8A, 0xD9, 0x09, 0x59, 0xFD, 0x04, + 0x51, 0xEB, 0xE7, 0x18, 0x8A, 0x77, 0x2C, 0x94, 0xA3, 0xA2, 0x82, 0xF2, + 0x50, 0xA6, 0xD9, 0x9C, 0x55, 0x65, 0x94, 0xE9, 0x67, 0xC4, 0xE1, 0x34, + 0x04, 0x22, 0x3F, 0x50, 0xAB, 0x1F, 0x0B, 0x94, 0xCC, 0x51, 0x35, 0x28, + 0xF9, 0x88, 0xA0, 0xA0, 0xA3, 0xF1, 0x97, 0x00, 0xC2, 0x9C, 0x35, 0x01, + 0xC1, 0x1B, 0x01, 0x49, 0x44, 0x4C, 0x06, 0xC9, 0x35, 0xA2, 0xEA, 0x93, + 0x26, 0xF0, 0xCA, 0x07, 0x7E, 0x1E, 0xBB, 0xCB, 0x03, 0x27, 0x35, 0x2D, + 0xF1, 0xE0, 0x15, 0x1D, 0xBE, 0xCE, 0x89, 0x3A, 0x65, 0xDA, 0x5B, 0xB8, + 0x3C, 0xF7, 0xF1, 0x3C, 0xDC, 0xFA, 0xAA, 0xD0, 0x43, 0x72, 0x73, 0x94, + 0x72, 0xD2, 0x10, 0x82, 0x32, 0x10, 0xB6, 0x05, 0x25, 0x16, 0x25, 0xD2, + 0x10, 0x73, 0xFD, 0x97, 0x7B, 0x7D, 0x31, 0x25, 0x89, 0x26, 0x83, 0xF8, + 0x78, 0x1B, 0x32, 0xFF, 0x35, 0x19, 0x91, 0x68, 0x3F, 0x1F, 0x78, 0x38, + 0x83, 0xA0, 0x49, 0x63, 0x4F, 0x70, 0x04, 0xAD, 0x57, 0xBC, 0x9D, 0x6F, + 0xBE, 0xDA, 0x56, 0xD1, 0xFF, 0xC2, 0x25, 0xA1, 0xF5, 0x39, 0xB3, 0xA8, + 0x69, 0x0A, 0xD2, 0xB1, 0xA0, 0x4F, 0x16, 0xB3, 0x15, 0xF4, 0xDD, 0x59, + 0x8C, 0xD3, 0x56, 0xDF, 0x11, 0x50, 0x33, 0x6D, 0x15, 0xB9, 0xCC, 0x89, + 0xC9, 0x81, 0xC2, 0x7A, 0xCD, 0x1F, 0x04, 0x17, 0xDB, 0x2B, 0x80, 0xFA, + 0xC8, 0x00, 0x94, 0xB1, 0x41, 0x42, 0xA8, 0x0F, 0x6D, 0x72, 0xCB, 0xA9, + 0xBA, 0xBC, 0x19, 0x5E, 0x42, 0x70, 0x94, 0x1B, 0xA4, 0x16, 0x86, 0x04, + 0xF7, 0x06, 0x6E, 0xC2, 0x4A, 0xBE, 0xD5, 0x27, 0x2A, 0x61, 0x1F, 0x56, + 0x34, 0x31, 0x8D, 0x59, 0x57, 0x2B, 0x86, 0x01, 0xC3, 0x94, 0x62, 0x8A, + 0x9C, 0x18, 0xB5, 0xDD, 0x52, 0xBC, 0x85, 0xB5, 0x09, 0x25, 0xBC, 0x36, + 0x05, 0x3F, 0xE4, 0xA8, 0xC9, 0x4A, 0xA1, 0x7C, 0xEB, 0xC1, 0x12, 0x64, + 0x05, 0xD4, 0x6A, 0x2D, 0x41, 0xBC, 0xC3, 0xF5, 0x57, 0x00, 0x4A, 0xB0, + 0xFF, 0xD3, 0xD2, 0x51, 0x76, 0x71, 0x0E, 0xC4, 0x78, 0x01, 0xD8, 0xC1, + 0xCA, 0xA4, 0x1B, 0xBB, 0xB5, 0x99, 0x50, 0xC7, 0xB9, 0xCD, 0x74, 0xAB, + 0x09, 0x89, 0x07, 0x54, 0x3A, 0xEA, 0x76, 0xA5, 0xA7, 0xE9, 0x96, 0x3D, + 0x8A, 0xFE, 0x24, 0x46, 0x7A, 0x4F, 0x57, 0x8B, 0x6D, 0x5B, 0xB2, 0x12, + 0xCA, 0x09, 0x7B, 0x45, 0x4D, 0xC1, 0x03, 0x7A, 0x27, 0xFB, 0x2C, 0xE2, + 0x95, 0xC6, 0x17, 0x46, 0x7B, 0x48, 0xFB, 0x8F, 0x78, 0x5B, 0xC8, 0x3E, + 0x54, 0x51, 0x99, 0x71, 0xE3, 0xC7, 0x92, 0xED, 0x99, 0xB4, 0x8A, 0x98, + 0x86, 0xA8, 0x91, 0x1D, 0x36, 0xB6, 0xB2, 0xC7, 0x9C, 0xD6, 0x68, 0x4D, + 0x45, 0x9B, 0x4D, 0x37, 0xB5, 0xA0, 0xCE, 0x30, 0x00, 0x13, 0x5A, 0x49, + 0xE4, 0x52, 0x45, 0x7D, 0x30, 0xEA, 0x74, 0xBE, 0xEE, 0x41, 0x43, 0xBC, + 0xB5, 0xC9, 0x0C, 0x40, 0x7F, 0x75, 0xC6, 0x57, 0x56, 0x9A, 0x90, 0xF6, + 0x56, 0x35, 0x83, 0x99, 0x80, 0x08, 0x69, 0x08, 0xB2, 0x59, 0x9F, 0x79, + 0x51, 0x5D, 0x9A, 0xE1, 0xCA, 0x16, 0x17, 0x28, 0xFE, 0x2B, 0xD1, 0x9F, + 0x1B, 0x25, 0x62, 0xC0, 0x5A, 0xF6, 0x26, 0x11, 0x6E, 0xD7, 0xE1, 0xBA, + 0x5C, 0xB8, 0x04, 0x7A, 0x55, 0xD3, 0x16, 0x59, 0x5C, 0x37, 0x26, 0xD0, + 0xB6, 0x09, 0xED, 0x57, 0x88, 0x56, 0x21, 0x5C, 0x91, 0xB6, 0xEB, 0xE4, + 0xC2, 0x70, 0x8D, 0x2F, 0x5A, 0x9F, 0x07, 0x5B, 0x57, 0x38, 0x9E, 0x3A, + 0x49, 0xDF, 0x67, 0x18, 0xA5, 0x50, 0x90, 0xDC, 0xBD, 0xA1, 0xA6, 0xE5, + 0x33, 0x25, 0xD7, 0xA0, 0x25, 0x71, 0x63, 0xD3, 0x8B, 0x89, 0xE2, 0xC0, + 0xC5, 0xC8, 0x51, 0xF1, 0x9B, 0x23, 0xD7, 0x35, 0xAC, 0x04, 0xD6, 0x8B, + 0x5A, 0xDF, 0x9A, 0x9D, 0x98, 0x5E, 0x5B, 0xD0, 0x2B, 0x28, 0xDF, 0x89, + 0x1B, 0x85, 0xC5, 0xB2, 0xDD, 0x43, 0xEF, 0x14, 0x99, 0x74, 0x8B, 0xAB, + 0x49, 0x45, 0xA7, 0x57, 0xBF, 0xCD, 0x7E, 0x80, 0xDF, 0x0C, 0x1B, 0x05, + 0xB2, 0x1E, 0xD0, 0xFD, 0x72, 0x3E, 0x25, 0xD2, 0xE1, 0x0B, 0x1C, 0x17, + 0x6C, 0x5B, 0x61, 0xC0, 0x84, 0xCD, 0xFA, 0xB6, 0x07, 0x0A, 0xBE, 0x2B, + 0xF7, 0x3E, 0xEA, 0x2B, 0x0B, 0x52, 0x33, 0x0A, 0x37, 0xC3, 0x48, 0x0A, + 0x93, 0x9C, 0xF7, 0x52, 0x45, 0x9B, 0xE5, 0x04, 0xED, 0x3B, 0x5A, 0xFF, + 0x8E, 0x4A, 0xFE, 0xD5, 0x76, 0x04, 0xED, 0xA2, 0xAE, 0x36, 0x6A, 0xCC, + 0x62, 0x7F, 0xB2, 0xBE, 0x3A, 0x30, 0x02, 0x59, 0xF3, 0x2F, 0xDF, 0x94, + 0x0D, 0x03, 0x22, 0xB6, 0x65, 0xDF, 0x26, 0x8A, 0xCE, 0x9F, 0x32, 0x4B, + 0x8D, 0x4E, 0x3B, 0x37, 0x24, 0x00, 0x0F, 0xB7, 0xF4, 0x4B, 0x2F, 0x0B, + 0xF9, 0x94, 0x14, 0x41, 0x94, 0xD0, 0x66, 0x80, 0x66, 0x9F, 0x04, 0x74, + 0xB8, 0x90, 0x35, 0xEE, 0xCC, 0x4B, 0xA7, 0xD4, 0x42, 0x7D, 0xD6, 0x23, + 0x3C, 0x2A, 0x8A, 0xB6, 0xAC, 0x19, 0x92, 0x37, 0xD9, 0x46, 0xDF, 0xE1, + 0x75, 0x2D, 0x05, 0x02, 0xB1, 0xCA, 0x34, 0x34, 0x1B, 0xB4, 0x67, 0x1F, + 0x56, 0xBD, 0x55, 0xCD, 0xEC, 0x9E, 0x3D, 0x4E, 0x83, 0x90, 0x5D, 0x66, + 0xBA, 0xA6, 0x76, 0x7E, 0x2E, 0xAA, 0x92, 0xD2, 0x80, 0xC5, 0x25, 0x0D, + 0x91, 0xF5, 0x9B, 0x54, 0x6F, 0x05, 0xCE, 0xE3, 0x4A, 0x55, 0xCB, 0xA6, + 0xDD, 0x4C, 0x91, 0x92, 0xA0, 0x1C, 0x83, 0xBD, 0x28, 0x05, 0xB9, 0xFC, + 0x75, 0x42, 0xEF, 0xB1, 0x7D, 0x2A, 0x17, 0x3E, 0x7A, 0xB3, 0xB5, 0xCB, + 0xD9, 0x43, 0x0F, 0xAD, 0x4D, 0x36, 0x70, 0x4E, 0x39, 0x3C, 0x91, 0xF6, + 0x05, 0xDB, 0x0A, 0x43, 0xDC, 0x5B, 0xAF, 0x4C, 0x34, 0x72, 0x9B, 0xF1, + 0x2D, 0x89, 0x0F, 0x85, 0x1C, 0x90, 0x8B, 0x90, 0x84, 0xCC, 0x1D, 0xD0, + 0xAE, 0xF6, 0x58, 0x20, 0x38, 0xE9, 0x44, 0x16, 0xB6, 0xCB, 0x90, 0x5C, + 0x76, 0x91, 0xB7, 0x1B, 0x15, 0xB6, 0xEF, 0xB1, 0x31, 0xAE, 0xD0, 0x9E, + 0x78, 0x37, 0xBC, 0x69, 0x3B, 0x2C, 0x22, 0x89, 0x10, 0xE5, 0xBF, 0xA5, + 0xAA, 0x32, 0x0F, 0x5F, 0xED, 0x7A, 0x85, 0xC2, 0x25, 0x0E, 0x8C, 0x8D, + 0xEB, 0x8D, 0xE7, 0x33, 0x84, 0x9B, 0x47, 0xC5, 0xD6, 0x49, 0xAB, 0x1D, + 0xA1, 0x0A, 0x84, 0x14, 0x1A, 0x90, 0xD8, 0x11, 0x78, 0x4A, 0x1A, 0x01, + 0xE2, 0x27, 0xC9, 0x49, 0x61, 0x82, 0x62, 0xA2, 0xE0, 0xE4, 0xDF, 0x99, + 0xC5, 0x5A, 0x7B, 0x54, 0x7B, 0x77, 0xC9, 0xF8, 0xA4, 0xB5, 0xA2, 0xA0, + 0x09, 0x42, 0x9F, 0x47, 0x82, 0x6C, 0x79, 0xED, 0x5F, 0x79, 0xBD, 0x0C, + 0x73, 0x84, 0x88, 0x05, 0x16, 0x17, 0x08, 0x9D, 0x3C, 0xCA, 0xCB, 0x55, + 0xD4, 0x14, 0x16, 0xD3, 0x83, 0xAE, 0x39, 0x1D, 0x3D, 0x19, 0x51, 0x1A, + 0x45, 0x32, 0x19, 0xA0, 0xF0, 0xC0, 0xB0, 0x27, 0x4D, 0xC6, 0x6F, 0x75, + 0x52, 0x59, 0x14, 0x50, 0xF7, 0xDF, 0x6A, 0x51, 0xE5, 0xB0, 0xDC, 0xE8, + 0x27, 0x2E, 0x49, 0x7A, 0x53, 0x96, 0x2C, 0x28, 0x9A, 0x65, 0x75, 0x65, + 0xBE, 0x35, 0x1B, 0x6D, 0x1C, 0x90, 0xCA, 0x80, 0x42, 0xBF, 0xA4, 0x45, + 0xA2, 0x5C, 0x93, 0xFC, 0xB5, 0x63, 0x30, 0xB2, 0xA7, 0x7B, 0x20, 0x3F, + 0x0F, 0x5E, 0xE1, 0x41, 0x61, 0x79, 0xBC, 0xB1, 0x07, 0x69, 0x2F, 0xA9, + 0x48, 0x99, 0xEE, 0xD3, 0x46, 0xFF, 0x51, 0x54, 0x31, 0xB5, 0xC1, 0xCE, + 0x87, 0x20, 0xB9, 0x0F, 0x47, 0x77, 0x46, 0xB3, 0x57, 0xAD, 0x3C, 0x1E, + 0x03, 0xD0, 0xA5, 0x3D, 0x66, 0xB3, 0xC5, 0x28, 0x2E, 0x06, 0xF6, 0x02, + 0x49, 0x9D, 0xF9, 0xF5, 0x29, 0x69, 0xF8, 0x16, 0x0A, 0x2F, 0xB7, 0xCD, + 0xE8, 0xDB, 0x5F, 0xA2, 0x12, 0xAB, 0x7C, 0x09, 0x24, 0x81, 0x9C, 0x04, + 0x27, 0x51, 0x66, 0x4D, 0xDC, 0xE5, 0x24, 0xE9, 0xE4, 0x53, 0xA9, 0x8B, + 0x41, 0x25, 0x47, 0x2B, 0x2B, 0xC6, 0xA0, 0x41, 0x81, 0xEB, 0xD1, 0xC6, + 0xB3, 0x77, 0x97, 0x90, 0x25, 0x15, 0xFA, 0xB2, 0x37, 0x9F, 0xE4, 0xE3, + 0xB2, 0x11, 0xEB, 0xF2, 0x72, 0x62, 0xC6, 0x8A, 0x00, 0xF3, 0x99, 0x83, + 0x11, 0x26, 0x64, 0x82, 0xA6, 0xA2, 0x8B, 0xF2, 0xB0, 0xCE, 0xAE, 0x49, + 0xE1, 0x16, 0xC1, 0x6F, 0x81, 0x89, 0x61, 0x6F, 0x9E, 0x0A, 0x07, 0xB3, + 0xDB, 0x62, 0x45, 0xEF, 0x54, 0x6C, 0x9F, 0x95, 0xC5, 0x50, 0xEF, 0xD7, + 0x81, 0x0B, 0x8F, 0x67, 0x15, 0xE4, 0xDF, 0xC6, 0xFB, 0xD5, 0x17, 0x8F, + 0x90, 0x27, 0xE5, 0x3B, 0x86, 0xF4, 0xBC, 0xF1, 0x9D, 0x1D, 0x07, 0xB1, + 0x3D, 0x45, 0xE4, 0x62, 0x76, 0x6B, 0xFC, 0x2C, 0xE5, 0x31, 0x7E, 0x1D, + 0x66, 0x0B, 0x85, 0x27, 0x80, 0xF8, 0xCB, 0xB8, 0x2A, 0xA4, 0x23, 0x4B, + 0x3D, 0xB7, 0xE3, 0x10, 0x4D, 0xB8, 0xD1, 0xA9, 0x10, 0x33, 0x84, 0xF1, + 0x07, 0x28, 0xE0, 0x89, 0x4D, 0x9C, 0x4F, 0xA3, 0x84, 0xFA, 0x30, 0xBC, + 0x38, 0x72, 0x91, 0x59, 0xD5, 0x66, 0x49, 0x2E, 0x62, 0x69, 0x7A, 0x6E, + 0xCB, 0x3F, 0x18, 0x9A, 0x24, 0x8A, 0x8A, 0x72, 0x1E, 0x2F, 0xF5, 0xD5, + 0x23, 0x5D, 0x85, 0x58, 0x22, 0x1D, 0x23, 0x44, 0x82, 0x94, 0x85, 0x66, + 0x07, 0x4C, 0x1C, 0x85, 0xF8, 0x1C, 0x28, 0x0A, 0x09, 0x39, 0x79, 0xFF, + 0xCC, 0xF0, 0x20, 0x84, 0xCA, 0x88, 0x77, 0x8F, 0xC3, 0x58, 0x56, 0xDD, + 0xB9, 0x06, 0x1C, 0x0D, 0xFB, 0x9B, 0x10, 0xE1, 0xDB, 0x23, 0x84, 0xF0, + 0xB0, 0x76, 0xC0, 0x0C, 0xF8, 0x28, 0x13, 0xE7, 0x4E, 0xDD, 0xC3, 0x1A, + 0xBD, 0x9F, 0x5B, 0x47, 0xEC, 0x22, 0x01, 0x0A, 0x8E, 0xFC, 0x4A, 0x36, + 0xF7, 0xC6, 0xFC, 0x33, 0x1E, 0x29, 0xBB, 0x34, 0xD0, 0xA9, 0x9A, 0x57, + 0x17, 0x8E, 0x02, 0x1C, 0x44, 0xB8, 0x33, 0x24, 0xD6, 0x8D, 0xB6, 0x3F, + 0xDB, 0x1B, 0xAD, 0xC5, 0x5A, 0x98, 0x88, 0xE6, 0x7D, 0x9C, 0x2F, 0xE7, + 0x0E, 0x14, 0xD3, 0xA1, 0x9A, 0x98, 0xB8, 0x54, 0xE2, 0x90, 0x97, 0x5E, + 0x48, 0xDE, 0xCF, 0x3B, 0x4F, 0x57, 0x92, 0x66, 0x2D, 0xB4, 0xA7, 0x71, + 0x4D, 0x08, 0xB7, 0xA3, 0xF1, 0x5A, 0xAA, 0x7E, 0xAD, 0xAD, 0xAC, 0xD2, + 0xBD, 0x27, 0x41, 0x51, 0xC1, 0xEA, 0x4F, 0xE0, 0x0D, 0xC7, 0x3B, 0x20, + 0x84, 0x18, 0x7B, 0xBB, 0x78, 0xB7, 0xCB, 0x6E, 0x5B, 0x83, 0xBF, 0x59, + 0x72, 0x2F, 0x74, 0x32, 0xA6, 0x55, 0x81, 0x6B, 0xFA, 0xE0, 0xA7, 0x68, + 0x0D, 0xB5, 0xCF, 0x02, 0xCB, 0xDD, 0xF0, 0x69, 0xB1, 0x74, 0x4A, 0x53, + 0x77, 0xF7, 0xD1, 0xC2, 0xCE, 0x2A, 0x59, 0xFD, 0x01, 0xBD, 0xD9, 0x50, + 0x3E, 0xC4, 0xE6, 0xE0, 0x0C, 0x62, 0x44, 0x64, 0xEE, 0x70, 0x9F, 0x69, + 0x81, 0x0D, 0xCE, 0x42, 0x87, 0x3A, 0xF2, 0x3A, 0x6B, 0x78, 0xDA, 0x42, + 0x99, 0x33, 0xC9, 0xEB, 0x3B, 0x9C, 0xED, 0x3B, 0xC7, 0xF2, 0x65, 0xD1, + 0x32, 0xB2, 0x3F, 0x9D, 0x80, 0xEC, 0xAC, 0x7D, 0x04, 0xF1, 0xE9, 0xBA, + 0x52, 0x4A, 0x74, 0x70, 0x8C, 0xCF, 0xB1, 0xB9, 0x91, 0x8C, 0x4F, 0x12, + 0x0D, 0xC2, 0x7A, 0x2F, 0xB8, 0x86, 0xF2, 0x9B, 0x4D, 0x58, 0xE0, 0xA0, + 0x2E, 0xEA, 0x82, 0x17, 0xC1, 0x7E, 0x48, 0xBE, 0x56, 0xA5, 0xC7, 0xB9, + 0x88, 0xF5, 0x26, 0xA6, 0xC1, 0x60, 0x83, 0xBC, 0x40, 0x7C, 0x36, 0x2B, + 0x32, 0x57, 0x25, 0xBE, 0x88, 0x38, 0x2B, 0x8D, 0xBE, 0xA0, 0xE0, 0x64, + 0x0D, 0x06, 0x2C, 0xD5, 0x88, 0x31, 0xCC, 0x79, 0x49, 0x81, 0x19, 0xE5, + 0x36, 0x43, 0x3D, 0x74, 0xA3, 0x20, 0x59, 0x3C, 0xFD, 0x5B, 0x5C, 0x35, + 0x4D, 0xF1, 0x90, 0x26, 0x8A, 0x06, 0xB5, 0x76, 0x87, 0x1D, 0xC6, 0x7D, + 0x93, 0x8A, 0x35, 0x62, 0x12, 0x23, 0x7E, 0xD7, 0x33, 0x4C, 0x73, 0xEB, + 0x01, 0x6D, 0xCB, 0xAF, 0xE5, 0xF2, 0x5D, 0x6C, 0x48, 0x73, 0x8E, 0x78, + 0xA6, 0xA1, 0x11, 0xAC, 0x91, 0xA1, 0x6D, 0x13, 0xAE, 0x2B, 0xA7, 0x7B, + 0x03, 0xDA, 0x16, 0x7A, 0xE3, 0x6A, 0x53, 0xF1, 0x82, 0x1F, 0xD0, 0x29, + 0xA6, 0x99, 0xB0, 0xC1, 0x1A, 0x28, 0xBC, 0x08, 0xC7, 0x6C, 0x3E, 0xD8, + 0x3B, 0x7D, 0x31, 0x4F, 0xB9, 0xCC, 0x1F, 0x8F, 0x06, 0x85, 0xDE, 0x97, + 0xBD, 0x7A, 0x02, 0xA4, 0x16, 0x0E, 0x8F, 0xF2, 0x61, 0xAE, 0x02, 0xA2, + 0x43, 0x84, 0xE0, 0x9E, 0x1E, 0xA9, 0xDB, 0xF0, 0x7A, 0xC3, 0xA0, 0xDD, + 0x93, 0xE9, 0x84, 0x8D, 0xC3, 0x79, 0x9C, 0xE5, 0x68, 0xBC, 0x63, 0xB8, + 0x82, 0xA0, 0x94, 0x7D, 0x7F, 0x5B, 0x73, 0x13, 0x0B, 0x7A, 0x46, 0xBE, + 0xEF, 0x70, 0x64, 0xB9, 0x26, 0xB0, 0x86, 0xBB, 0x33, 0x8A, 0xCC, 0x81, + 0x04, 0x8E, 0x62, 0x7A, 0x34, 0xFA, 0x25, 0x14, 0x0F, 0x0A, 0xD4, 0x0B, + 0xCF, 0xD6, 0x92, 0x05, 0x88, 0x2C, 0x2D, 0x26, 0xDF, 0x08, 0xD6, 0x19, + 0x6A, 0xAB, 0x74, 0x2C, 0xB0, 0x08, 0x6B, 0xAB, 0x87, 0xEA, 0x6A, 0x48, + 0xB8, 0x73, 0xB6, 0x16, 0x30, 0x33, 0xE7, 0x4B, 0x81, 0xBD, 0xEE, 0x67, + 0x31, 0x83, 0x4B, 0xCF, 0x83, 0x22, 0x05, 0x8A, 0x81, 0xEB, 0xFA, 0x75, + 0xBB, 0x54, 0x8E, 0x78, 0x5B, 0x76, 0x70, 0x3F, 0x7D, 0x3F, 0xAA, 0x6C, + 0x69, 0x7F, 0x19, 0x68, 0xB3, 0x68, 0x51, 0xD1, 0x61, 0xD5, 0x3C, 0x2C, + 0x6B, 0xC5, 0x96, 0xE0, 0xDA, 0x26, 0x63, 0xC5, 0x0E, 0xA1, 0xF5, 0x59, + 0xD5, 0x78, 0x87, 0x81, 0xEF, 0x87, 0x01, 0x88, 0xD4, 0xE1, 0xBD, 0xB8, + 0x96, 0x1D, 0x5D, 0x85, 0x1C, 0x6F, 0x53, 0xED, 0x6A, 0x6A, 0xC0, 0x2A, + 0xB2, 0xF1, 0x6C, 0x7A, 0x92, 0xF5, 0x70, 0x6D, 0x94, 0xD5, 0x87, 0x57, + 0xE3, 0x26, 0xCD, 0xDA, 0x52, 0x5C, 0x22, 0x03, 0xBD, 0xF6, 0x60, 0xA6, + 0xC9, 0x64, 0xF0, 0xC6, 0x11, 0xA4, 0x96, 0xB1, 0x27, 0x8B, 0x8E, 0x99, + 0x3E, 0xC2, 0xC1, 0x43, 0xD4, 0x10, 0x7D, 0xCC, 0x9F, 0xE4, 0x7C, 0xA6, + 0x10, 0x1E, 0xE5, 0x59, 0x37, 0x58, 0xF0, 0xB3, 0xF6, 0x4F, 0x8B, 0x41, + 0xDB, 0x65, 0x01, 0xDD, 0xE3, 0xAB, 0xBD, 0x4C, 0x4C, 0x69, 0x2B, 0x82, + 0xBA, 0x80, 0xDE, 0x9E, 0x4D, 0xAC, 0x86, 0xDF, 0x34, 0xDB, 0xDF, 0x1C, + 0xBA, 0x25, 0x03, 0xD0, 0x5E, 0x29, 0x29, 0x4E, 0xFC, 0xF6, 0xC0, 0x10, + 0x03, 0xCA, 0xB0, 0xA3, 0x22, 0xB0, 0x46, 0xAA, 0xC3, 0xBB, 0xF1, 0xC6, + 0x7C, 0xB1, 0xC2, 0x70, 0xCD, 0xAC, 0xE0, 0x6B, 0xDD, 0x14, 0xEC, 0xAD, + 0x80, 0x09, 0xF9, 0xBD, 0x1F, 0x4A, 0xD7, 0x20, 0xFA, 0x15, 0xCF, 0xDD, + 0xE5, 0x65, 0x2A, 0x06, 0xBD, 0x88, 0xC0, 0x12, 0x74, 0xC4, 0x8B, 0x3C, + 0x50, 0x8D, 0x73, 0xC3, 0xF0, 0x36, 0x40, 0x64, 0x39, 0x4C, 0x78, 0x92, + 0xD8, 0xDC, 0x93, 0x2A, 0xC0, 0x91, 0x16, 0xB0, 0x96, 0x88, 0x70, 0x85, + 0x86, 0xEF, 0x38, 0xF5, 0x8E, 0x70, 0x63, 0x3C, 0xE8, 0xDB, 0x26, 0xDF, + 0x3F, 0xEE, 0x01, 0xB1, 0xF6, 0xF6, 0x8E, 0x1A, 0xEE, 0x6F, 0x42, 0x9B, + 0x76, 0x08, 0xF2, 0xE4, 0xB5, 0xD8, 0x45, 0x55, 0xCE, 0xF3, 0x89, 0xEC, + 0x2D, 0x00, 0xF7, 0xC1, 0xED, 0x4D, 0xD0, 0x04, 0xC1, 0xB2, 0x92, 0xE1, + 0xE5, 0xEE, 0x44, 0xFD, 0x79, 0xC1, 0x45, 0xAD, 0x1F, 0x99, 0x49, 0xB9, + 0xC3, 0x79, 0xAF, 0xFC, 0x09, 0x31, 0x3F, 0xBE, 0x15, 0x37, 0xB7, 0x9B, + 0xA2, 0xD5, 0xD7, 0xDD, 0x1B, 0xBC, 0x69, 0xA3, 0x27, 0x8A, 0x7C, 0xAA, + 0xC6, 0x31, 0x2A, 0xA9, 0x6F, 0xA1, 0x3D, 0xFE, 0xB6, 0x40, 0xD0, 0x96, + 0xBF, 0xEC, 0x37, 0xB1, 0x5C, 0x8E, 0xA8, 0xF7, 0x4B, 0x9D, 0x62, 0x5C, + 0x33, 0x4E, 0x54, 0xDA, 0x66, 0xF2, 0xFF, 0xEE, 0xE2, 0x19, 0xF3, 0x47, + 0x74, 0xD2, 0xC8, 0x8D, 0xDB, 0x67, 0xEC, 0x77, 0xD7, 0xC0, 0x1F, 0xC7, + 0x4D, 0x7D, 0x03, 0xD1, 0xEB, 0xDD, 0x43, 0xD1, 0x25, 0xD8, 0x29, 0x18, + 0xCA, 0xE5, 0xF3, 0x89, 0x86, 0xA0, 0x09, 0xD1, 0x4E, 0x0C, 0x69, 0x47, + 0x1B, 0x89, 0x9B, 0xB2, 0xE9, 0xE3, 0x7E, 0x9C, 0xE4, 0xCD, 0xE8, 0x0A, + 0x70, 0xF0, 0x95, 0x81, 0x70, 0xF5, 0xAD, 0x6E, 0xD9, 0x41, 0x2D, 0xCD, + 0xEC, 0xA3, 0x10, 0x18, 0xF1, 0x34, 0xD3, 0xC1, 0x85, 0x5D, 0x07, 0xE5, + 0x8C, 0x6A, 0xEF, 0xCC, 0xB0, 0xA7, 0x00, 0xE8, 0x53, 0x5D, 0xD5, 0xE5, + 0x47, 0x60, 0x94, 0xAB, 0x43, 0x26, 0xCD, 0x0E, 0x02, 0xD3, 0x8C, 0xF1, + 0x8F, 0xAC, 0x23, 0x0F, 0xDF, 0xB1, 0x3A, 0x8F, 0x99, 0xAF, 0x89, 0xAC, + 0x5B, 0xAE, 0x6C, 0x40, 0x6D, 0xC1, 0x20, 0x2A, 0x01, 0xFB, 0xC6, 0x02, + 0x19, 0xC1, 0x89, 0x98, 0x41, 0x24, 0x9F, 0xCF, 0xA2, 0x43, 0x15, 0x3F, + 0xA7, 0x8F, 0x6F, 0xC6, 0x47, 0x91, 0x0A, 0xBA, 0x7B, 0xD3, 0x5E, 0xD2, + 0xB3, 0x70, 0x00, 0x86, 0xAD, 0xD6, 0xF4, 0xC4, 0x1D, 0x76, 0x90, 0x26, + 0x47, 0xE3, 0x69, 0xA5, 0x8E, 0x2E, 0xBF, 0xA8, 0x9D, 0x72, 0x84, 0x41, + 0xC3, 0x8E, 0x4A, 0x6B, 0xE5, 0xA5, 0xB3, 0x05, 0x67, 0xDC, 0x5F, 0xAF, + 0xF0, 0x06, 0x08, 0x9C, 0x8E, 0x10, 0xDC, 0x73, 0x98, 0x73, 0x9A, 0x9B, + 0xA6, 0x3D, 0xCF, 0xC2, 0x2E, 0x7F, 0x37, 0xF8, 0xC2, 0xC6, 0x45, 0x6D, + 0xD3, 0x01, 0x48, 0x55, 0x4E, 0x62, 0xEF, 0x67, 0xD6, 0xAC, 0x7F, 0x6E, + 0x9C, 0x0A, 0x1F, 0x5D, 0x9F, 0xB4, 0x55, 0x4F, 0xEB, 0x9D, 0xFC, 0xDD, + 0x92, 0x45, 0x1D, 0xAE, 0xBD, 0xCA, 0xCB, 0x04, 0xB9, 0x18, 0x3A, 0xBB, + 0x2B, 0x8C, 0x8A, 0x80, 0x4D, 0x1A, 0x24, 0x39, 0xDA, 0x10, 0x94, 0xDA, + 0xC9, 0x4B, 0x2F, 0x0F, 0x86, 0x24, 0x0B, 0x51, 0xF5, 0x57, 0xBA, 0x57, + 0x23, 0x4D, 0x03, 0xAA, 0xA4, 0xC0, 0x23, 0x7D, 0xF9, 0x13, 0x02, 0x30, + 0x42, 0x4D, 0xDA, 0xE0, 0x5E, 0x11, 0x8E, 0xA7, 0x21, 0x20, 0xEA, 0x1F, + 0x26, 0xF1, 0x5C, 0xCD, 0x9C, 0x6F, 0x1E, 0xCC, 0xE8, 0x23, 0xA4, 0xDD, + 0x40, 0x36, 0xFC, 0x8A, 0x95, 0x80, 0xFD, 0x91, 0xD3, 0x8F, 0x61, 0x75, + 0x6B, 0x09, 0xF8, 0x0A, 0xBE, 0x94, 0x25, 0x9C, 0x02, 0xFD, 0x65, 0x50, + 0x6F, 0x90, 0xA5, 0x9E, 0xDE, 0xD8, 0x98, 0x90, 0xBA, 0x06, 0xEF, 0xF6, + 0xDC, 0x37, 0x4F, 0x46, 0x3F, 0xF4, 0xD1, 0x91, 0xB2, 0x0D, 0xA7, 0x56, + 0x78, 0x76, 0x35, 0xE7, 0x2D, 0x66, 0x2A, 0xF8, 0x5B, 0xC5, 0x1F, 0x41, + 0xB1, 0x89, 0xB6, 0x7C, 0x43, 0x68, 0x8E, 0x19, 0x44, 0x03, 0x8C, 0xD0, + 0xCA, 0xEF, 0x64, 0x34, 0x87, 0xC4, 0xEB, 0xD4, 0xCD, 0x33, 0x07, 0x71, + 0x57, 0xA7, 0xDC, 0xE5, 0x65, 0x2E, 0xD9, 0xE1, 0x7F, 0xAA, 0xCA, 0x11, + 0xEC, 0xDF, 0x83, 0xAB, 0xBD, 0x9C, 0x27, 0xAB, 0x5C, 0x34, 0x6A, 0x49, + 0xDF, 0xAD, 0x68, 0xFA, 0x61, 0x39, 0xDC, 0x49, 0x7D, 0xF5, 0x76, 0xC2, + 0x3F, 0xD4, 0x48, 0xA2, 0x9C, 0x2D, 0x50, 0x94, 0x3E, 0xF7, 0xB3, 0xBA, + 0x71, 0x23, 0x9F, 0x63, 0x5F, 0x6D, 0x4D, 0x89, 0xA5, 0x37, 0x03, 0xDB, + 0x79, 0x87, 0x27, 0x9E, 0x15, 0x65, 0x1C, 0x9F, 0x61, 0x2B, 0x37, 0xFF, + 0x87, 0xF4, 0x18, 0xF8, 0xBE, 0xAA, 0x1D, 0x4E, 0xBC, 0x02, 0x26, 0x1A, + 0xA5, 0x3E, 0x52, 0x97, 0x21, 0xE1, 0xD2, 0xDA, 0xC0, 0x2D, 0x8D, 0x4B, + 0x57, 0xFC, 0x08, 0xAA, 0x7C, 0x59, 0xF9, 0xBF, 0x3A, 0xF1, 0x96, 0x83, + 0xA2, 0x59, 0x70, 0xA4, 0x06, 0x13, 0x6B, 0x15, 0xA8, 0xCB, 0xC8, 0x0B, + 0x85, 0x31, 0x42, 0x3E, 0x3E, 0x83, 0x0C, 0xAF, 0x40, 0xAC, 0xBE, 0x6C, + 0x6E, 0x17, 0x9A, 0xC6, 0x45, 0xCE, 0x1B, 0x1B, 0xBC, 0x94, 0xBF, 0xA2, + 0x53, 0x5B, 0xDF, 0x95, 0xEF, 0x6A, 0x41, 0x93, 0xC4, 0x58, 0xE9, 0x20, + 0x68, 0x28, 0xB1, 0xA3, 0x80, 0x80, 0x48, 0xEF, 0x7A, 0x7C, 0x11, 0x33, + 0x62, 0x18, 0xB7, 0x41, 0x52, 0x36, 0xD5, 0xB6, 0xC0, 0x95, 0xD7, 0x71, + 0x00, 0x0B, 0x0A, 0x86, 0xE7, 0x13, 0x8D, 0xE6, 0x73, 0x33, 0xB5, 0x8B, + 0xEE, 0xC3, 0xCA, 0x24, 0x12, 0x96, 0x89, 0x91, 0x90, 0x95, 0xCA, 0x24, + 0x30, 0xDB, 0x25, 0x9B, 0x1B, 0xF2, 0x13, 0xCA, 0xC3, 0x3A, 0x8A, 0x7E, + 0xEA, 0xF9, 0x7D, 0xB1, 0xF0, 0x69, 0xF8, 0xD9, 0xA0, 0xEE, 0x3C, 0xF8, + 0x02, 0x37, 0x93, 0xB5, 0xE3, 0xD9, 0x7B, 0x54, 0xF1, 0x3A, 0x9D, 0x20, + 0xB0, 0xD2, 0xC6, 0xAE, 0x61, 0x26, 0x90, 0x4C, 0xA5, 0x9D, 0x20, 0xE1, + 0xEF, 0x4A, 0x07, 0xF6, 0xAF, 0xE9, 0x28, 0xF5, 0x9B, 0x47, 0xDE, 0xD1, + 0x65, 0x76, 0x0C, 0x70, 0x40, 0xBC, 0xA6, 0xA4, 0xE1, 0xF2, 0xEE, 0x0B, + 0xAA, 0xF3, 0x3A, 0x8E, 0x4F, 0x7D, 0x9F, 0x97, 0xB6, 0x65, 0x54, 0x16, + 0x88, 0xAF, 0x5C, 0xCD, 0xE3, 0x66, 0xEB, 0xB2, 0xA2, 0xA2, 0x5B, 0xE9, + 0x0A, 0x54, 0x9B, 0x0E, 0x50, 0x4F, 0x89, 0xAD, 0x67, 0x11, 0x48, 0x33, + 0x08, 0x47, 0xA6, 0xE1, 0xB4, 0x03, 0xF5, 0x65, 0x2B, 0xD1, 0xF7, 0xC7, + 0x48, 0x3D, 0x1A, 0x33, 0xA6, 0x1E, 0x71, 0x1C, 0x02, 0x0A, 0x47, 0x9C, + 0xE1, 0x97, 0xB3, 0x14, 0xD4, 0xEA, 0xFA, 0xF9, 0xFF, 0x35, 0x67, 0xAA, + 0xC3, 0x2E, 0x78, 0x33, 0x3D, 0x03, 0x17, 0x78, 0x0B, 0xC7, 0x68, 0xC1, + 0x19, 0x4D, 0x21, 0xFE, 0xD7, 0x84, 0xB8, 0xA0, 0x50, 0x36, 0xE6, 0x98, + 0xE7, 0x5C, 0xF2, 0x0C, 0xAC, 0x8D, 0x9E, 0xB4, 0xC4, 0xFB, 0x29, 0x50, + 0x9F, 0xF7, 0x27, 0xEB, 0x22, 0xDB, 0xD1, 0x19, 0x8E, 0x1C, 0xC4, 0x8C, + 0x84, 0xF8, 0x0D, 0xB4, 0x1F, 0x80, 0x91, 0x70, 0xE1, 0xFC, 0x64, 0xE2, + 0x5B, 0xD8, 0x07, 0x67, 0x87, 0xA2, 0x7E, 0x37, 0xE4, 0x7A, 0xBF, 0x87, + 0xE4, 0x1F, 0x05, 0xAE, 0x25, 0xA5, 0x8C, 0xCE, 0xB5, 0x5F, 0x87, 0x77, + 0xCF, 0x8E, 0x18, 0xA7, 0xAB, 0x4E, 0x16, 0xB1, 0xFC, 0x70, 0x9C, 0x00, + 0x4D, 0xC6, 0x9F, 0x92, 0x3F, 0x42, 0xAF, 0xB4, 0xD0, 0x36, 0x13, 0xF0, + 0xA3, 0xFE, 0x0E, 0x4B, 0xA3, 0xB9, 0xD6, 0xF0, 0x5F, 0xD3, 0x29, 0xDD, + 0xB0, 0x27, 0x49, 0x13, 0x9F, 0x2B, 0xF8, 0xCB, 0x62, 0xC2, 0xBF, 0x80, + 0x1D, 0x62, 0x23, 0x5B, 0xCE, 0x19, 0x6F, 0xE1, 0xAA, 0xD9, 0x99, 0x0F, + 0x48, 0x72, 0xFE, 0xEF, 0x52, 0x58, 0x39, 0xF6, 0x4A, 0x98, 0x4A, 0xEF, + 0xCF, 0xA3, 0x71, 0x92, 0xC6, 0xC6, 0x8F, 0x39, 0xED, 0x7D, 0x0B, 0x6C, + 0x62, 0xE1, 0xA8, 0x0E, 0x62, 0xF7, 0x59, 0xD6, 0xB0, 0x67, 0x82, 0x12, + 0x5C, 0xA9, 0xBC, 0x52, 0x7F, 0xCF, 0xD3, 0x33, 0x7A, 0x98, 0xFE, 0x8E, + 0x70, 0x31, 0xB9, 0x82, 0x37, 0xD2, 0x37, 0xC9, 0xEE, 0x1C, 0xBC, 0x76, + 0x0B, 0xBD, 0x95, 0xD4, 0xD0, 0x9C, 0xEE, 0x9F, 0x8A, 0x9C, 0xA0, 0x34, + 0xFE, 0x8D, 0x64, 0xF0, 0xDA, 0x02, 0x17, 0xA3, 0x26, 0x68, 0x4B, 0xE8, + 0x54, 0xF7, 0xE1, 0x94, 0x6D, 0xA9, 0x5E, 0x8B, 0x86, 0x13, 0xDB, 0x5C, + 0x0C, 0xF0, 0x3C, 0x40, 0x4F, 0x0D, 0x15, 0xD7, 0xE7, 0x48, 0x3F, 0xC6, + 0x33, 0x24, 0x30, 0x83, 0x50, 0x30, 0xBC, 0xD7, 0xE5, 0x25, 0x32, 0x11, + 0xD0, 0xA7, 0xE3, 0x7C, 0x4D, 0xE4, 0x46, 0xE3, 0xCB, 0xF7, 0x04, 0x49, + 0xFF, 0x5F, 0x0C, 0xFE, 0x36, 0xEE, 0x39, 0x46, 0x5B, 0x41, 0x7D, 0x1B, + 0xF0, 0xCF, 0x90, 0xEF, 0x72, 0x6E, 0x61, 0xE5, 0x26, 0xC7, 0xC5, 0x6A, + 0xCA, 0x40, 0x7A, 0x30, 0x8E, 0x0A, 0x2F, 0xDD, 0x64, 0x95, 0xF7, 0x19, + 0x6D, 0x0F, 0xDB, 0x80, 0xFB, 0x9E, 0x6B, 0x36, 0xD6, 0x1E, 0x0A, 0x34, + 0x7A, 0x8B, 0x1B, 0xB9, 0xA8, 0xBB, 0x49, 0x67, 0xCA, 0x7E, 0xD6, 0x27, + 0x6F, 0xAC, 0xED, 0x25, 0x89, 0xFD, 0xB4, 0x11, 0x2F, 0x43, 0x74, 0x40, + 0x2D, 0x73, 0x20, 0xA1, 0x94, 0x9E, 0x79, 0x5D, 0x20, 0x88, 0xD5, 0x1F, + 0x13, 0x10, 0x35, 0x7A, 0x4C, 0xF0, 0x5B, 0x09, 0x96, 0x75, 0x6F, 0x5F, + 0xED, 0x9D, 0x68, 0xBD, 0x0D, 0x77, 0x5C, 0x85, 0x13, 0x3A, 0x11, 0x0D, + 0x0A, 0x90, 0x98, 0x8F, 0xCE, 0x4C, 0xE5, 0x46, 0x40, 0x86, 0x75, 0xA5, + 0x49, 0x5C, 0x12, 0x57, 0xF8, 0x48, 0x86, 0xD4, 0x81, 0xA4, 0x47, 0x39, + 0x19, 0x42, 0x23, 0x44, 0x7F, 0x57, 0x9C, 0x95, 0xA1, 0xFD, 0x3E, 0xA6, + 0x29, 0x84, 0xF6, 0x8F, 0x87, 0x79, 0x8B, 0xF6, 0x45, 0x5A, 0x9B, 0x7E, + 0xBB, 0xC1, 0xD3, 0xB7, 0xE4, 0x18, 0xB0, 0x61, 0x77, 0xB4, 0x12, 0x25, + 0xEE, 0x6C, 0x3D, 0x6C, 0xA9, 0xFE, 0x67, 0xDE, 0xCC, 0x8F, 0x11, 0xC1, + 0x8A, 0xD6, 0x72, 0xAC, 0x45, 0x77, 0xEF, 0xD3, 0x96, 0x41, 0xA7, 0xC1, + 0x92, 0x15, 0x93, 0x44, 0x18, 0x08, 0x14, 0x7C, 0xAB, 0xCE, 0xBF, 0xFA, + 0x89, 0xEF, 0xAD, 0x09, 0x9A, 0xB9, 0x8A, 0x7D, 0xD5, 0xA2, 0x82, 0x90, + 0x10, 0x4E, 0xD6, 0xCC, 0x04, 0x43, 0x21, 0x6B, 0xDF, 0xE4, 0x56, 0xE9, + 0x7D, 0x17, 0xCD, 0xC1, 0x3A, 0xC0, 0xA1, 0x83, 0xCE, 0xC8, 0x90, 0x2E, + 0xA6, 0x73, 0x44, 0x72, 0x10, 0x7B, 0x03, 0xDB, 0x2F, 0xCA, 0x9C, 0x71, + 0x44, 0x06, 0xAC, 0xCB, 0x4A, 0x09, 0xF0, 0x08, 0x1C, 0x99, 0x49, 0x13, + 0x19, 0x6E, 0xEE, 0x4C, 0xA2, 0xE4, 0xB8, 0xA0, 0x36, 0xE2, 0x9C, 0x13, + 0x7E, 0x6C, 0x9B, 0x3C, 0x74, 0x5A, 0x50, 0x90, 0x8C, 0xE1, 0x24, 0x76, + 0x14, 0xF7, 0x2E, 0x77, 0x24, 0x64, 0xFA, 0x37, 0x0C, 0xE1, 0x90, 0xDB, + 0xB4, 0x4C, 0x9E, 0xC5, 0x26, 0xA8, 0xED, 0x02, 0x72, 0x4D, 0xF4, 0x91, + 0x94, 0xDF, 0x77, 0x3B, 0x96, 0xB9, 0x42, 0x34, 0xD2, 0xB7, 0x1E, 0x49, + 0xBD, 0x29, 0xBB, 0x3C, 0xC6, 0x5B, 0x3F, 0x15, 0xE5, 0x8F, 0x0E, 0x23, + 0xA5, 0xD5, 0x73, 0x06, 0x6F, 0xEF, 0x73, 0x51, 0xB2, 0xC8, 0xD4, 0x44, + 0xFC, 0x25, 0x95, 0xA9, 0x44, 0x57, 0xB7, 0x80, 0x07, 0xB0, 0xCE, 0x58, + 0x12, 0xFF, 0xD3, 0xD9, 0x13, 0xDD, 0x11, 0x26, 0x5B, 0xC3, 0x5B, 0xEE, + 0xA9, 0x53, 0x19, 0xE9, 0x31, 0x9C, 0x1B, 0x3A, 0x2A, 0x9F, 0xD9, 0x7C, + 0x7A, 0x55, 0x52, 0x40, 0xE0, 0xEC, 0x11, 0x39, 0x7E, 0x09, 0xD7, 0xE7, + 0xCF, 0xC7, 0x67, 0xDB, 0xDE, 0x02, 0x92, 0xEF, 0x47, 0x2C, 0x54, 0xFD, + 0xE4, 0x37, 0xC6, 0x9F, 0x51, 0x66, 0x96, 0x84, 0x19, 0x94, 0x90, 0xE6, + 0x4E, 0x43, 0x2A, 0xB9, 0x13, 0x40, 0x9C, 0xE9, 0x89, 0xA2, 0x2B, 0x8E, + 0x8C, 0x39, 0x42, 0x42, 0xF8, 0xD9, 0x5A, 0x86, 0x0E, 0xA6, 0x3A, 0x9E, + 0xA8, 0xA5, 0x23, 0x19, 0x58, 0xDB, 0x4C, 0x46, 0xCA, 0x26, 0x50, 0x0B, + 0xD2, 0x6A, 0x9B, 0xBE, 0x63, 0x55, 0xF4, 0x42, 0xD8, 0x20, 0xCD, 0x55, + 0x01, 0xA0, 0x3D, 0xE3, 0x97, 0x23, 0x14, 0xF1, 0x6A, 0x2A, 0x5A, 0xA9, + 0xBD, 0x01, 0x5E, 0x56, 0x8F, 0xC7, 0x31, 0x6F, 0xBB, 0x78, 0x88, 0x01, + 0xF0, 0x00, 0xD2, 0x1B, 0x40, 0x6D, 0x50, 0xD0, 0xCB, 0x44, 0x35, 0x3A, + 0xBC, 0xBB, 0x6F, 0x6C, 0xF4, 0xDB, 0x6F, 0x54, 0x27, 0x8C, 0x0A, 0x5A, + 0xE8, 0x56, 0xC9, 0x28, 0x44, 0xBC, 0xF7, 0x70, 0xF0, 0x95, 0x17, 0xA1, + 0x0B, 0x91, 0xDF, 0x80, 0xF8, 0xF3, 0xF9, 0xB9, 0x1C, 0xEB, 0x81, 0x31, + 0x18, 0xE2, 0xB6, 0xF8, 0x80, 0x64, 0x61, 0x1F, 0xD9, 0x14, 0x6C, 0x64, + 0xE8, 0xDB, 0x45, 0x5E, 0x16, 0xD4, 0xDB, 0xC9, 0x13, 0x70, 0x4B, 0x0E, + 0x40, 0x80, 0xB9, 0xCA, 0x9E, 0xB7, 0x85, 0x88, 0xDA, 0xF8, 0x13, 0xFE, + 0x51, 0x28, 0xB9, 0x6E, 0x65, 0x92, 0xAA, 0x45, 0x68, 0xC6, 0x82, 0xCC, + 0xBA, 0x28, 0x6E, 0xCF, 0x54, 0x7A, 0xB4, 0x8A, 0x8A, 0x92, 0x3C, 0x2F, + 0x55, 0x6A, 0xE3, 0x23, 0x27, 0x4B, 0xFA, 0x13, 0x58, 0xB5, 0xAE, 0x9D, + 0xA3, 0x77, 0x25, 0xFA, 0x70, 0x59, 0x5A, 0x34, 0x4C, 0xF1, 0xA9, 0x9A, + 0x37, 0x2B, 0xEF, 0xA0, 0x85, 0xB7, 0x97, 0x74, 0x04, 0xD0, 0x08, 0xFE, + 0x01, 0x7B, 0x33, 0x44, 0xB8, 0x44, 0x12, 0xE6, 0x1D, 0xCF, 0xE0, 0x8D, + 0xDE, 0x92, 0x93, 0x49, 0xB8, 0x2B, 0x65, 0x0D, 0x38, 0x55, 0x3B, 0x90, + 0x89, 0x01, 0x40, 0xEB, 0xF1, 0x33, 0x5C, 0x36, 0xAA, 0xF7, 0x84, 0x75, + 0x8A, 0xB1, 0xE4, 0x68, 0x6F, 0x3C, 0x7C, 0x84, 0x71, 0x06, 0x57, 0xC4, + 0x83, 0x9F, 0x6A, 0x96, 0x8F, 0xEB, 0xA6, 0x59, 0xBB, 0x2D, 0x68, 0x35, + 0x8F, 0xBF, 0x8D, 0xFE, 0xC8, 0xBC, 0xA7, 0x41, 0x97, 0x17, 0x49, 0x82, + 0x6E, 0x4D, 0xB0, 0xE8, 0xC9, 0x10, 0x57, 0x7B, 0x9C, 0x03, 0xDD, 0x90, + 0xE3, 0x15, 0x30, 0x9A, 0x66, 0xAB, 0xF8, 0x9A, 0x69, 0xBE, 0x6E, 0x74, + 0x3C, 0xF4, 0xDD, 0x0D, 0x77, 0x77, 0x30, 0x2C, 0x3C, 0x2B, 0x7E, 0x01, + 0x90, 0xFD, 0xD7, 0xF1, 0x87, 0x03, 0x61, 0x87, 0x8B, 0x46, 0x5C, 0x02, + 0x20, 0x5C, 0xB0, 0x8C, 0x56, 0x51, 0xA3, 0xFE, 0x15, 0x28, 0x24, 0xC7, + 0x43, 0xE9, 0x15, 0x43, 0xA7, 0xD7, 0x21, 0x12, 0x88, 0xD5, 0x32, 0xAE, + 0x04, 0xC8, 0x3E, 0x28, 0x7E, 0x08, 0xD4, 0x97, 0x5E, 0xCF, 0x60, 0xF1, + 0x42, 0x96, 0x2B, 0xED, 0xAE, 0x71, 0x43, 0xD0, 0x04, 0x48, 0x65, 0x03, + 0x9A, 0xFA, 0x77, 0x45, 0x5A, 0xFC, 0x48, 0x12, 0x16, 0xCF, 0xAF, 0x13, + 0xE4, 0x03, 0xCC, 0x8F, 0xF4, 0xB5, 0x68, 0xB3, 0xF5, 0x53, 0x13, 0x42, + 0x26, 0x8F, 0xB5, 0x71, 0x8E, 0x9B, 0xB3, 0x2E, 0xF6, 0x9F, 0x1E, 0x4A, + 0xBC, 0xB9, 0xD8, 0xA5, 0x77, 0xCE, 0x95, 0x94, 0xE3, 0x9F, 0xD8, 0xAD, + 0x53, 0x79, 0x03, 0xA6, 0x57, 0xF7, 0x13, 0xD5, 0x66, 0x25, 0x66, 0x88, + 0x78, 0xF7, 0xF6, 0x35, 0xF9, 0xCC, 0x7F, 0xC6, 0x36, 0xAD, 0xC2, 0x70, + 0x34, 0x94, 0xAA, 0xED, 0xCA, 0x4A, 0x14, 0x16, 0xF6, 0x6E, 0x46, 0xE8, + 0x32, 0x63, 0xDF, 0x88, 0x66, 0x65, 0x6E, 0xA3, 0xCF, 0xDB, 0x1E, 0x5B, + 0xFD, 0xCB, 0xB1, 0x99, 0x4A, 0x65, 0xD3, 0x24, 0xD8, 0xC9, 0xA1, 0xAA, + 0x06, 0xA9, 0x4C, 0xF5, 0x7C, 0x9E, 0x98, 0x77, 0x12, 0xC2, 0xA9, 0xF9, + 0x8D, 0x5F, 0x43, 0x1B, 0x9D, 0xEB, 0xD2, 0x28, 0x2C, 0x54, 0x60, 0x97, + 0x5A, 0x70, 0x28, 0x78, 0xCA, 0x43, 0xD1, 0xBA, 0xA3, 0x5F, 0x49, 0x6A, + 0x0C, 0x2A, 0x53, 0x09, 0xF8, 0x5E, 0x89, 0x5C, 0x6A, 0x5D, 0x2A, 0x8B, + 0x58, 0x7D, 0x19, 0x1A, 0xF1, 0x1B, 0x5A, 0x12, 0xE7, 0x09, 0x9C, 0x88, + 0xD5, 0xD7, 0x15, 0xFB, 0xDF, 0x62, 0xA9, 0x54, 0xD7, 0xD5, 0x7A, 0x2B, + 0xBF, 0xCA, 0x0B, 0xB9, 0x07, 0xB4, 0xC9, 0x17, 0x81, 0x33, 0x07, 0x25, + 0xE2, 0x0A, 0x6C, 0xF4, 0xD1, 0xF7, 0xF7, 0x65, 0xDE, 0x71, 0x00, 0x72, + 0x9C, 0x2A, 0xBC, 0x31, 0xC0, 0x94, 0x85, 0x93, 0x9C, 0x65, 0xA6, 0xF1, + 0x2F, 0x01, 0x8B, 0xD8, 0x66, 0x3E, 0x96, 0xB6, 0x96, 0xA0, 0x78, 0xA3, + 0x85, 0x35, 0x6C, 0x3A, 0x37, 0x09, 0x76, 0x12, 0xB1, 0xA8, 0xC5, 0xE3, + 0x53, 0xFB, 0x17, 0xB4, 0x10, 0xD1, 0x0F, 0xFA, 0xE7, 0x42, 0x58, 0x20, + 0x72, 0x79, 0xC2, 0x94, 0xAF, 0xF7, 0x7D, 0x35, 0xD3, 0x48, 0x23, 0x67, + 0x0F, 0xD7, 0x65, 0xE0, 0x48, 0x05, 0x7E, 0x09, 0xE6, 0x0A, 0x4B, 0xD2, + 0xB0, 0xB9, 0x84, 0x12, 0xAF, 0x4B, 0x92, 0xDD, 0x30, 0x4B, 0x9F, 0xDC, + 0xD5, 0x5D, 0xD4, 0x5A, 0x13, 0xE6, 0xB7, 0x18, 0x18, 0xC0, 0x52, 0x18, + 0xBF, 0xC2, 0xB8, 0x7D, 0x2B, 0x2A, 0x36, 0x7A, 0x63, 0x6E, 0xF7, 0x59, + 0x61, 0xC3, 0x97, 0x31, 0xDD, 0x61, 0x15, 0x1B, 0x30, 0xC3, 0xDD, 0xF5, + 0x51, 0x2F, 0x77, 0xB4, 0x54, 0x6E, 0x4D, 0x98, 0x13, 0xDB, 0x3E, 0x4C, + 0xA9, 0xCF, 0x77, 0xC8, 0x2D, 0x8E, 0x49, 0xDA, 0x67, 0xBA, 0x6C, 0x37, + 0x54, 0xAB, 0x55, 0x80, 0x15, 0x94, 0x5F, 0xB6, 0x4D, 0x6B, 0xB3, 0xA3, + 0x13, 0xBD, 0x7C, 0x47, 0xE3, 0xA5, 0x70, 0x9B, 0xEC, 0x5C, 0x94, 0x60, + 0xC9, 0xEA, 0xD6, 0x64, 0xEE, 0x3B, 0x8F, 0x4E, 0xE2, 0x07, 0x61, 0xC6, + 0xA4, 0x64, 0x8A, 0xA1, 0xF9, 0x57, 0xC2, 0xEA, 0x89, 0x95, 0x12, 0x67, + 0xE0, 0xC6, 0xCF, 0x44, 0x40, 0x98, 0x8E, 0xB7, 0xDF, 0xFF, 0xCB, 0xAA, + 0xEF, 0xC5, 0x72, 0x8D, 0xD4, 0xC7, 0x58, 0x60, 0x9D, 0xE1, 0xD6, 0x1D, + 0x3A, 0x12, 0xBA, 0x5E, 0xA9, 0xAB, 0x21, 0xB9, 0x2E, 0xE0, 0x04, 0x47, + 0x1B, 0xB2, 0x37, 0x28, 0xED, 0x7F, 0x7D, 0x24, 0x63, 0x2D, 0x98, 0x04, + 0x4D, 0x1E, 0x6B, 0xE7, 0x11, 0x1C, 0xED, 0xB1, 0x02, 0x64, 0x63, 0x51, + 0x71, 0x6E, 0xB1, 0x3D, 0xAD, 0xE1, 0xEB, 0x3B, 0x23, 0x51, 0xE3, 0x45, + 0xA4, 0x83, 0xB2, 0x83, 0xD9, 0x43, 0x5C, 0xF6, 0x99, 0xDE, 0xC8, 0xD2, + 0xB7, 0x11, 0x26, 0xF3, 0xEA, 0x69, 0xFE, 0x54, 0x22, 0x33, 0xCD, 0xDE, + 0xE4, 0x2F, 0x65, 0x19, 0xA0, 0x3E, 0xDB, 0x4E, 0xB0, 0x4A, 0xFA, 0x57, + 0x47, 0x13, 0x84, 0x7B, 0x73, 0x3B, 0x8E, 0xB1, 0x8A, 0x1C, 0x80, 0x0C, + 0x9D, 0x67, 0xF3, 0xD5, 0x00, 0xD7, 0xDA, 0x92, 0xA5, 0xF7, 0xE4, 0x8D, + 0x60, 0x48, 0xD2, 0x5C, 0xF6, 0x9A, 0x0D, 0x94, 0xE4, 0x19, 0x75, 0xCF, + 0xE2, 0xCD, 0x22, 0xD5, 0x87, 0x9C, 0x36, 0x65, 0xC7, 0x36, 0x0D, 0x5B, + 0x5C, 0x7A, 0x08, 0xC7, 0x98, 0xF5, 0xAE, 0x04, 0x45, 0xCE, 0x32, 0x1A, + 0x25, 0xC9, 0x1F, 0x2E, 0x96, 0x95, 0x62, 0x97, 0x4C, 0x27, 0x82, 0xB9, + 0x0A, 0xFA, 0x0D, 0xE3, 0xF1, 0xEA, 0xD6, 0x59, 0x3A, 0x6C, 0x9B, 0x28, + 0xCA, 0x8A, 0x19, 0x79, 0x5C, 0xE9, 0xFF, 0xFD, 0x93, 0x54, 0x26, 0xF4, + 0x09, 0x58, 0xB9, 0x41, 0x90, 0x2C, 0x74, 0x98, 0x45, 0x9A, 0x71, 0x12, + 0x06, 0x52, 0xAA, 0x31, 0xAD, 0xEA, 0x97, 0x81, 0x33, 0xD6, 0xA3, 0x54, + 0xCA, 0x9D, 0x5E, 0xF1, 0x87, 0xDD, 0xAB, 0x1E, 0xF1, 0x1B, 0xA4, 0xFD, + 0x74, 0x60, 0x93, 0xD6, 0x01, 0x9F, 0x5C, 0x2D, 0x7D, 0xE7, 0xB8, 0x76, + 0x36, 0x80, 0xD0, 0x63, 0x27, 0xC8, 0x94, 0x15, 0x4B, 0x1C, 0xC2, 0x6B, + 0x67, 0x23, 0xEC, 0xAC, 0xD2, 0xEB, 0xC5, 0x5D, 0x78, 0x81, 0xD6, 0x30, + 0xDD, 0xA6, 0x2C, 0xEE, 0x16, 0xDA, 0x8B, 0xA0, 0x9D, 0x20, 0xF8, 0x62, + 0x87, 0x6D, 0xC2, 0x9C, 0x80, 0x53, 0x3C, 0x20, 0x06, 0x78, 0x71, 0xD7, + 0xA6, 0x0D, 0xEA, 0xA8, 0x58, 0xA6, 0x21, 0x77, 0xCB, 0xD0, 0x6F, 0x05, + 0x7A, 0x47, 0x1C, 0xFB, 0xA0, 0x4D, 0xD8, 0x22, 0xD1, 0xE3, 0x9B, 0x14, + 0x98, 0xF4, 0xAE, 0x20, 0xEC, 0x64, 0xD9, 0xC6, 0xBF, 0xB1, 0x40, 0x1A, + 0x4C, 0x66, 0xC3, 0x2B, 0xC0, 0xE7, 0xD3, 0x61, 0x4C, 0x6D, 0xF8, 0x5D, + 0xC9, 0x33, 0x92, 0xC4, 0x1D, 0xA3, 0xF5, 0x69, 0x10, 0xF3, 0x4B, 0x31, + 0x1C, 0x1D, 0x11, 0x8E, 0xB0, 0xF8, 0xD9, 0x3A, 0xBF, 0x06, 0xC1, 0xB0, + 0x27, 0x8B, 0xB6, 0x9E, 0x7C, 0x6E, 0x27, 0x15, 0xF1, 0xE0, 0xE7, 0x31, + 0x87, 0x10, 0x94, 0x2C, 0x0D, 0xC6, 0x75, 0x54, 0xD2, 0x5A, 0xE4, 0x25, + 0xA7, 0xB9, 0x16, 0x4A, 0x93, 0x8E, 0x1D, 0x84, 0x06, 0xDC, 0x84, 0xDE, + 0x57, 0x9D, 0xF7, 0xC1, 0x68, 0x08, 0x67, 0xFD, 0x5C, 0x38, 0x2A, 0xC9, + 0x99, 0x28, 0xEC, 0x5D, 0xB4, 0x2A, 0xCA, 0xB3, 0xBC, 0x92, 0x0C, 0xFC, + 0xC9, 0xED, 0x22, 0x52, 0x79, 0xC4, 0x04, 0x3F, 0xD0, 0x7D, 0x4B, 0xE0, + 0x0C, 0x0F, 0x82, 0x00, 0xB8, 0x38, 0x70, 0x06, 0xC5, 0x34, 0x1E, 0x0D, + 0x96, 0x7E, 0xDC, 0x94, 0x7E, 0x64, 0x47, 0xA9, 0x62, 0xAE, 0xA3, 0x8B, + 0x6E, 0x0B, 0x1D, 0xB9, 0x8F, 0xE8, 0xAA, 0x57, 0xD7, 0xE3, 0x65, 0x15, + 0x28, 0x88, 0xF5, 0x21, 0xF3, 0x38, 0xA4, 0xFC, 0xDB, 0x09, 0xC1, 0x7A, + 0x7B, 0xA7, 0xFF, 0x0B, 0xA3, 0x18, 0xA2, 0x42, 0x28, 0x22, 0xB2, 0x95, + 0x25, 0x56, 0x08, 0xFF, 0x3D, 0xB5, 0xF1, 0x41, 0x44, 0x34, 0x64, 0x67, + 0x2C, 0xD5, 0xF0, 0x40, 0x9B, 0x82, 0x18, 0xAE, 0x8E, 0x74, 0xFE, 0x6D, + 0xCC, 0x3E, 0x02, 0x13, 0x41, 0xC3, 0x32, 0x33, 0x76, 0x3A, 0x4A, 0x5B, + 0xED, 0xFC, 0x64, 0xFB, 0x17, 0x2A, 0xB1, 0x9B, 0xF6, 0xB9, 0x45, 0x83, + 0xBC, 0x42, 0x12, 0xAB, 0x91, 0xFD, 0x2A, 0x34, 0xE7, 0x56, 0xBA, 0xB8, + 0x69, 0x81, 0xBA, 0x30, 0x6C, 0x8C, 0x4B, 0xAB, 0x1D, 0x47, 0x57, 0xAA, + 0xE7, 0x3F, 0x25, 0x25, 0x7E, 0x6A, 0x2D, 0x35, 0x61, 0xB0, 0xC1, 0xAC, + 0x81, 0xFE, 0xB5, 0x28, 0x7E, 0xFF, 0x6B, 0x6B, 0x71, 0xBA, 0x60, 0x0C, + 0x56, 0xCC, 0x6D, 0xA2, 0x23, 0xB2, 0x2B, 0xFB, 0xCB, 0x16, 0x25, 0xFE, + 0x6C, 0xAC, 0x81, 0x2E, 0xAC, 0x11, 0xB2, 0x79, 0xC8, 0x7A, 0x44, 0x0B, + 0x82, 0xF8, 0xC6, 0xE0, 0x2D, 0x92, 0x58, 0x73, 0xAF, 0x8A, 0xD7, 0x3D, + 0x2C, 0x05, 0x09, 0x54, 0x2F, 0xDE, 0x12, 0x17, 0xC5, 0xB1, 0x32, 0xFA, + 0x58, 0xE4, 0x0F, 0x74, 0x1E, 0xAA, 0xAC, 0x3B, 0x35, 0xDF, 0x92, 0x9C, + 0xB2, 0xC2, 0xA6, 0x90, 0x6D, 0xD4, 0xEB, 0x13, 0xA8, 0xEA, 0xC2, 0x61, + 0xED, 0x67, 0x65, 0x44, 0xAD, 0x46, 0x28, 0x11, 0x0F, 0x46, 0x04, 0x49, + 0xE6, 0x2E, 0x1A, 0xD6, 0x67, 0x72, 0x7C, 0x0D, 0x6A, 0x8A, 0xFA, 0xDB, + 0x94, 0x66, 0x84, 0xF1, 0x31, 0x3F, 0x38, 0x1C, 0x04, 0xCF, 0x09, 0x52, + 0x2F, 0xDB, 0xF6, 0x6F, 0xEB, 0x69, 0x03, 0x10, 0x92, 0xA0, 0x95, 0x0A, + 0xE5, 0x52, 0x4A, 0x9B, 0xD7, 0x76, 0x05, 0x80, 0x07, 0x09, 0x4A, 0x3A, + 0x37, 0xCD, 0xB3, 0x73, 0x64, 0x1F, 0xAB, 0x14, 0x57, 0xA0, 0xFF, 0x9B, + 0x0D, 0x34, 0x56, 0x0A, 0x79, 0x79, 0x20, 0x7C, 0x4A, 0x52, 0xD8, 0xB4, + 0x22, 0x45, 0x88, 0x90, 0xA0, 0x35, 0x36, 0x71, 0x9B, 0xD8, 0x2E, 0xC5, + 0x89, 0x20, 0x54, 0x36, 0x7A, 0x47, 0x03, 0x45, 0xF8, 0xB2, 0x20, 0xD0, + 0xBC, 0x84, 0x05, 0x40, 0xDB, 0xD4, 0xD0, 0x1C, 0x9E, 0xF0, 0x37, 0x02, + 0x31, 0xD9, 0xDE, 0xBC, 0xBD, 0x87, 0x3E, 0xA7, 0x2A, 0xD9, 0x7E, 0x8B, + 0xBD, 0xEF, 0x67, 0xC4, 0x06, 0x00, 0x43, 0xA7, 0x89, 0xE6, 0xA8, 0x7B, + 0xBD, 0x03, 0xCB, 0xC8, 0x2F, 0x46, 0xEF, 0xA5, 0xEF, 0x16, 0x7D, 0xE3, + 0xE9, 0x63, 0xCC, 0x89, 0xFC, 0xE5, 0x14, 0x40, 0x3A, 0x5A, 0xC8, 0xBC, + 0xF6, 0xD9, 0x3D, 0xAC, 0x82, 0xB5, 0x7F, 0xB7, 0xE4, 0x8F, 0x5C, 0x0A, + 0x5F, 0x6E, 0x0C, 0xF1, 0x7E, 0xAD, 0x12, 0xFA, 0x4E, 0x01, 0xC5, 0x62, + 0xBF, 0x10, 0x27, 0xE7, 0x72, 0xC0, 0xC3, 0xA6, 0x8B, 0xF7, 0xD8, 0xA5, + 0x52, 0x20, 0xA3, 0xEE, 0x70, 0xB0, 0xF6, 0xE2, 0x6A, 0x8D, 0x29, 0x73, + 0x17, 0xBD, 0x68, 0x45, 0x25, 0x53, 0x68, 0xC5, 0x1B, 0xD5, 0xC1, 0xFF, + 0x38, 0x17, 0x25, 0x47, 0x0C, 0x2E, 0xD4, 0x3E, 0xF7, 0x91, 0x36, 0x35, + 0xAD, 0x72, 0xBE, 0x5A, 0x19, 0x04, 0x97, 0x77, 0x51, 0x5D, 0x2E, 0x51, + 0xA7, 0xC3, 0x22, 0xEE, 0xE6, 0xC9, 0x9A, 0x3B, 0x9D, 0xA2, 0x84, 0xDE, + 0x2B, 0x76, 0x62, 0x00, 0x2C, 0x4F, 0xA5, 0x12, 0xC5, 0x43, 0x8B, 0xD0, + 0x13, 0x9E, 0x88, 0x3D, 0x33, 0xC3, 0xF4, 0x41, 0x6D, 0x00, 0x3B, 0xC3, + 0xE1, 0xA1, 0x0A, 0x6A, 0x63, 0xE8, 0x42, 0x89, 0x05, 0xAF, 0xAA, 0x2B, + 0x07, 0x25, 0x5B, 0xE1, 0xAA, 0xC6, 0xA7, 0xBD, 0x72, 0xC5, 0x17, 0x75, + 0x53, 0x61, 0x20, 0x76, 0x14, 0xCC, 0x7A, 0x06, 0xF5, 0x21, 0xD2, 0x8F, + 0x8F, 0x18, 0x5C, 0x50, 0xAA, 0x98, 0xA4, 0xB9, 0x7E, 0xBF, 0xD6, 0xBA, + 0xEA, 0x9D, 0x64, 0xF3, 0x31, 0x4D, 0x48, 0x18, 0x58, 0xF0, 0x07, 0x23, + 0xD6, 0x3E, 0xCA, 0xB4, 0x54, 0xE6, 0x04, 0x19, 0x18, 0xD5, 0xC7, 0x54, + 0x85, 0x75, 0xA6, 0x58, 0x0E, 0xEB, 0x74, 0xD6, 0xF6, 0xAF, 0xB4, 0x9D, + 0x70, 0xF0, 0x7B, 0x88, 0x8B, 0x8B, 0x64, 0x2C, 0x20, 0x40, 0x98, 0x5E, + 0x2C, 0x64, 0xC6, 0x98, 0x26, 0x1D, 0x94, 0x90, 0x01, 0x03, 0x66, 0x5D, + 0x6D, 0xC0, 0xBB, 0x5A, 0xC4, 0xF0, 0x0B, 0x78, 0x4E, 0x2E, 0x89, 0xA2, + 0x86, 0x41, 0x90, 0x7B, 0x1D, 0x2C, 0x76, 0x17, 0xE5, 0x39, 0xE9, 0xF7, + 0x00, 0xC0, 0x6B, 0x1F, 0x7E, 0xC1, 0xC2, 0x15, 0xA8, 0xA3, 0xF6, 0x7C, + 0xF6, 0x19, 0x3F, 0xE0, 0xCE, 0xEF, 0x5C, 0x7B, 0x63, 0x63, 0xBE, 0x64, + 0x33, 0x0E, 0x03, 0xFE, 0xF9, 0x03, 0xD9, 0xF7, 0xDF, 0x99, 0x37, 0x70, + 0xAE, 0x6B, 0x90, 0x2A, 0x99, 0x14, 0x1D, 0x0C, 0x83, 0x6A, 0xC9, 0xEA, + 0x34, 0x8C, 0xAC, 0x51, 0x30, 0x04, 0x4A, 0x71, 0xA8, 0x8E, 0xC6, 0xD8, + 0x19, 0x70, 0xB0, 0xE4, 0x80, 0x55, 0x52, 0x09, 0x5E, 0x58, 0x22, 0xFF, + 0x80, 0xC1, 0xAE, 0x0A, 0x87, 0xC7, 0xBE, 0xC7, 0x95, 0xEA, 0x98, 0x5A, + 0xC0, 0x67, 0xA3, 0xDA, 0x68, 0xEF, 0xBA, 0x48, 0xF1, 0xA0, 0x2C, 0x33, + 0x56, 0x1A, 0x45, 0xB8, 0xA3, 0x70, 0xA8, 0xD3, 0xB2, 0xCF, 0x1C, 0xC0, + 0x02, 0x1E, 0xDA, 0x14, 0x0B, 0x2C, 0x03, 0xEA, 0xEC, 0x2E, 0x2B, 0x21, + 0x1C, 0xE1, 0x99, 0xDF, 0x46, 0xD1, 0xC1, 0xE9, 0x00, 0x90, 0xB6, 0x7D, + 0x79, 0xA2, 0x42, 0xF7, 0x0E, 0x67, 0xE3, 0x8B, 0xE1, 0x42, 0x26, 0x7A, + 0x69, 0x82, 0x9D, 0x5C, 0x26, 0xFE, 0xE2, 0x6D, 0x51, 0x48, 0x74, 0x4A, + 0xE1, 0xA7, 0x77, 0x07, 0x09, 0xA3, 0x30, 0x0B, 0x48, 0x4F, 0x64, 0xB1, + 0x84, 0x91, 0xFF, 0x81, 0xFF, 0x5C, 0x94, 0x08, 0x44, 0xA8, 0xD6, 0x80, + 0x5B, 0x26, 0xF7, 0x5A, 0xDC, 0xF0, 0xC1, 0x6D, 0xED, 0xAF, 0xC3, 0x8D, + 0xFA, 0x54, 0xE4, 0xB1, 0x8F, 0x03, 0x45, 0x01, 0x63, 0x72, 0x17, 0x81, + 0x21, 0x1D, 0x1E, 0xF3, 0x19, 0x2A, 0xD2, 0x43, 0x4C, 0x6E, 0xC8, 0x83, + 0x13, 0x13, 0x4A, 0x00, 0x7E, 0xEF, 0x2D, 0x06, 0x07, 0x40, 0x81, 0x0A, + 0xC3, 0xE8, 0x13, 0xF6, 0xDC, 0xD7, 0x2C, 0xEB, 0xEC, 0x7C, 0xF9, 0x7B, + 0xC9, 0xD1, 0x79, 0x3A, 0x18, 0x74, 0xFF, 0xE8, 0xB3, 0xAC, 0x06, 0xDC, + 0x68, 0x07, 0x35, 0x0A, 0x45, 0x67, 0x5B, 0xC8, 0x1C, 0x3D, 0x4F, 0x77, + 0xCD, 0x1D, 0xEF, 0x2E, 0xBD, 0xA7, 0x2E, 0xD4, 0xD7, 0x2E, 0x32, 0xEC, + 0x89, 0x42, 0x46, 0x4B, 0x68, 0x60, 0x86, 0x72, 0xA9, 0x9B, 0xC3, 0x36, + 0xDE, 0x00, 0xBF, 0xCF, 0x4A, 0xFD, 0x2C, 0x98, 0xEE, 0x98, 0x6F, 0xD7, + 0xA7, 0x7B, 0xE4, 0xDA, 0xF6, 0xE2, 0x6E, 0x33, 0x29, 0x7F, 0x7E, 0xA0, + 0xE9, 0x6A, 0x07, 0x69, 0xA8, 0xF3, 0x65, 0xC6, 0x8F, 0x9D, 0x43, 0x88, + 0xDB, 0xF9, 0x7A, 0x81, 0x7C, 0x8F, 0xF0, 0x99, 0xC7, 0x4A, 0x30, 0xC0, + 0x5C, 0x15, 0x21, 0x00, 0xC7, 0x19, 0x23, 0x48, 0xD7, 0x4E, 0x64, 0x8C, + 0xA4, 0x26, 0x94, 0x80, 0x24, 0xC1, 0xC1, 0x87, 0xC9, 0x55, 0x51, 0x90, + 0x7F, 0x9A, 0xDB, 0x2A, 0x7E, 0x56, 0xCA, 0xE1, 0xDF, 0x81, 0xD9, 0x8B, + 0x78, 0xAB, 0x7C, 0x65, 0x04, 0x69, 0x49, 0x6C, 0x42, 0x8D, 0x48, 0x24, + 0x1C, 0xB7, 0x8A, 0x58, 0xAA, 0x18, 0x8E, 0xF3, 0xD1, 0x73, 0xB2, 0x20, + 0xD9, 0x46, 0x0C, 0x5A, 0xBE, 0x76, 0x2E, 0x86, 0x9F, 0xD5, 0x15, 0xA9, + 0x7C, 0x24, 0x09, 0x05, 0x0F, 0xF0, 0x3E, 0xB9, 0x9A, 0x12, 0x1A, 0xDC, + 0x41, 0x5A, 0x9F, 0x50, 0x3C, 0x76, 0xE5, 0x21, 0x98, 0x33, 0x1A, 0xA1, + 0x90, 0x2C, 0xF0, 0x22, 0x1A, 0x3D, 0x20, 0x24, 0xC4, 0x96, 0xC9, 0x13, + 0xD5, 0x8D, 0x81, 0x89, 0xA1, 0x61, 0x88, 0xAA, 0xEC, 0x8C, 0xDC, 0x31, + 0x7E, 0x3A, 0xFD, 0x6A, 0xBF, 0x8F, 0x97, 0x03, 0x67, 0x58, 0x31, 0xD3, + 0x2D, 0x63, 0xFC, 0x67, 0x8D, 0x14, 0xC3, 0xEB, 0xB7, 0xF8, 0x3E, 0x85, + 0xD3, 0x8F, 0x9E, 0xD7, 0xB4, 0x86, 0x3C, 0xDB, 0xD2, 0x5F, 0x0D, 0xD2, + 0xB2, 0xD1, 0xFC, 0xA5, 0x95, 0x4E, 0x80, 0x9E, 0x4E, 0x8D, 0x93, 0xAD, + 0xB3, 0xCA, 0x8A, 0xE0, 0xBC, 0x54, 0x7F, 0xD6, 0xB1, 0x74, 0xC0, 0xE8, + 0x4A, 0xF5, 0xC7, 0x72, 0xA7, 0xB7, 0x42, 0x4D, 0xD9, 0x60, 0x15, 0xEB, + 0xB6, 0x29, 0x02, 0x1F, 0x83, 0x78, 0x58, 0x09, 0x9E, 0x50, 0xA3, 0x39, + 0xC6, 0x22, 0x1E, 0xD1, 0xE6, 0xB9, 0x5A, 0xA3, 0x6F, 0x80, 0x43, 0xA9, + 0x58, 0x0B, 0x8C, 0x60, 0xF4, 0xC2, 0xD2, 0x0F, 0x9C, 0x78, 0xFE, 0xB1, + 0x33, 0x01, 0x67, 0xFF, 0xEC, 0x93, 0xC1, 0x6C, 0x77, 0x04, 0x1E, 0xD7, + 0xD2, 0x65, 0xDD, 0xF5, 0xAF, 0x6D, 0xC2, 0x04, 0x33, 0xF9, 0x38, 0x8F, + 0xF3, 0xCF, 0x80, 0x7D, 0x46, 0xFA, 0x53, 0x58, 0x30, 0xA6, 0x0B, 0x47, + 0xAE, 0xF0, 0xCB, 0x31, 0xA2, 0xC2, 0xB4, 0xB9, 0xA3, 0x8C, 0xA3, 0xAA, + 0x48, 0xF5, 0x0E, 0x8E, 0x45, 0x92, 0x12, 0xFB, 0x17, 0x8F, 0xC3, 0x2C, + 0x8D, 0xA7, 0x93, 0x2A, 0xB3, 0x76, 0x7B, 0x8D, 0xE6, 0x66, 0xBF, 0x9A, + 0x88, 0x64, 0x91, 0x2C, 0xD5, 0x9D, 0xE6, 0x28, 0xD6, 0x91, 0x48, 0xAC, + 0x5D, 0xCB, 0xE1, 0x9B, 0x1E, 0x9C, 0x73, 0xF4, 0xCB, 0x54, 0x3D, 0x72, + 0xED, 0xA0, 0xFA, 0x97, 0x00, 0xCB, 0x32, 0x69, 0xCC, 0xB7, 0x00, 0x61, + 0xE8, 0x97, 0x78, 0x79, 0xBA, 0x3D, 0x7B, 0x98, 0xA8, 0xBF, 0xA0, 0xF2, + 0x3B, 0x23, 0x22, 0x02, 0x10, 0x16, 0xB2, 0x93, 0xE1, 0x74, 0x95, 0x65, + 0xE5, 0x5F, 0x53, 0xEC, 0x70, 0x9F, 0x9F, 0xB6, 0xDD, 0x0B, 0xFF, 0xB4, + 0x48, 0x34, 0x1F, 0xA1, 0xF6, 0xBF, 0x61, 0x36, 0x4B, 0xF2, 0xCD, 0xE4, + 0xD6, 0x88, 0x08, 0x4A, 0x17, 0xE9, 0x33, 0xC6, 0xCA, 0x44, 0xD6, 0x00, + 0xA1, 0x6D, 0x2C, 0xFD, 0x09, 0x80, 0x51, 0xB8, 0xDC, 0xA1, 0xF9, 0x7D, + 0x55, 0x87, 0xE1, 0x52, 0x66, 0xF3, 0xA5, 0xF7, 0x0E, 0x61, 0xFC, 0x7B, + 0xA5, 0xC0, 0x26, 0x82, 0x37, 0x7A, 0x2D, 0xBF, 0xEA, 0x0E, 0xBD, 0xF3, + 0xCD, 0x50, 0x4C, 0x7E, 0x0F, 0xD2, 0xCC, 0x90, 0x81, 0x25, 0x28, 0xAF, + 0xD5, 0x7E, 0x89, 0xA5, 0xA8, 0x18, 0x2C, 0x6B, 0x53, 0x07, 0x51, 0xE5, + 0x09, 0x07, 0x3E, 0xCF, 0x58, 0xB8, 0x49, 0xCA, 0xE7, 0xA3, 0x36, 0x88, + 0xAD, 0x46, 0xF4, 0x8F, 0xA9, 0x55, 0x53, 0x02, 0xED, 0x8D, 0xFE, 0x50, + 0x20, 0xD6, 0x5E, 0xD4, 0xEB, 0x2B, 0x34, 0x3D, 0x04, 0x84, 0x39, 0x20, + 0x16, 0xCD, 0xDF, 0x40, 0x06, 0x2E, 0xE1, 0xB7, 0x81, 0x13, 0xE3, 0xC2, + 0x94, 0x5A, 0xFF, 0xE4, 0x4D, 0xBC, 0x1A, 0x80, 0x9A, 0x17, 0xBD, 0x1C, + 0xD3, 0x2B, 0x3C, 0xDE, 0xE4, 0x77, 0xA6, 0x59, 0x48, 0x5A, 0x1C, 0xE1, + 0x81, 0x89, 0xAF, 0x34, 0xBC, 0x2F, 0xC2, 0x69, 0x39, 0x9E, 0xE9, 0xEF, + 0x9B, 0x72, 0x56, 0x19, 0x90, 0x5E, 0x54, 0x09, 0xF7, 0x5D, 0xBF, 0x04, + 0x4F, 0x4D, 0x9A, 0x0B, 0x93, 0x55, 0x09, 0xDB, 0x63, 0xB1, 0xF3, 0x7C, + 0xD8, 0xB0, 0x8A, 0x69, 0x43, 0x1E, 0x11, 0x3B, 0x57, 0x6C, 0x0B, 0x04, + 0xC8, 0x38, 0xFF, 0x1F, 0x11, 0x07, 0xF7, 0x05, 0x9E, 0x15, 0x3E, 0xF9, + 0x37, 0x34, 0x66, 0x33, 0x0B, 0x33, 0x01, 0xBE, 0x7B, 0xD6, 0xDA, 0x54, + 0x38, 0xA9, 0x5B, 0x82, 0x83, 0xCC, 0x91, 0xD4, 0x89, 0xA2, 0x3F, 0x88, + 0x46, 0x4A, 0x38, 0xE7, 0x23, 0x03, 0xCB, 0x80, 0x3B, 0xFA, 0xFE, 0xB9, + 0x1E, 0xE9, 0x2D, 0x3C, 0x64, 0x60, 0x2D, 0xB6, 0xAC, 0xBA, 0xAB, 0xD6, + 0x51, 0x15, 0xB2, 0x1A, 0xB6, 0x98, 0xBB, 0x67, 0x2D, 0x04, 0xBB, 0x78, + 0x6D, 0xE5, 0xFB, 0x95, 0x8B, 0xE5, 0xCC, 0xAD, 0xE4, 0x15, 0xBB, 0x5F, + 0xF0, 0x56, 0x41, 0x06, 0x4D, 0x21, 0x10, 0x61, 0x3C, 0x63, 0xAC, 0x59, + 0x83, 0x2D, 0x4F, 0x0E, 0x52, 0xDB, 0x0A, 0x9D, 0x3B, 0xCB, 0x61, 0xAA, + 0x4D, 0x84, 0xB2, 0xC2, 0xFC, 0x7E, 0x67, 0xD3, 0x86, 0x3E, 0x83, 0xF2, + 0x6B, 0x1C, 0x8D, 0xD2, 0x6C, 0x55, 0x80, 0x14, 0x54, 0xC9, 0x14, 0x7E, + 0x14, 0xD9, 0x2A, 0xEE, 0x53, 0xAE, 0xB8, 0x27, 0xB3, 0x34, 0x02, 0xD2, + 0xFE, 0xA3, 0xC8, 0x75, 0x81, 0x6E, 0xC7, 0xCE, 0x83, 0xD5, 0xCB, 0xDF, + 0x5C, 0xED, 0xD2, 0x5A, 0xCC, 0xA9, 0x4E, 0xD1, 0x0A, 0x50, 0x0C, 0x9D, + 0x84, 0x79, 0x84, 0x6D, 0xA4, 0x41, 0x53, 0x69, 0x0E, 0x6C, 0x7D, 0x19, + 0x66, 0x1D, 0x05, 0xCE, 0xF8, 0xBE, 0xCC, 0xF8, 0xC5, 0x22, 0x0B, 0x8A, + 0x12, 0xC1, 0xB6, 0xF1, 0x96, 0xC7, 0xEA, 0xDC, 0xAE, 0x8D, 0xE9, 0x4A, + 0x88, 0x8B, 0xC0, 0xA9, 0xBD, 0xE7, 0xA4, 0x61, 0x3C, 0xE7, 0x8A, 0xB5, + 0x60, 0x5C, 0xA3, 0x02, 0x63, 0x6A, 0x3D, 0xE3, 0xBB, 0x25, 0x62, 0xA6, + 0xC1, 0xFA, 0x37, 0x10, 0x51, 0x24, 0x85, 0x7A, 0x2F, 0x03, 0x07, 0x35, + 0x0E, 0xDF, 0xFE, 0xA1, 0x81, 0x06, 0xCC, 0xC4, 0xBA, 0xFA, 0xE7, 0x92, + 0x1E, 0xCA, 0xB2, 0x2C, 0x69, 0x92, 0xAD, 0x10, 0xDF, 0x14, 0xBA, 0xC0, + 0xD1, 0xE0, 0x80, 0x56, 0x63, 0xF7, 0x02, 0x63, 0x9B, 0x2C, 0xEA, 0xE6, + 0x07, 0x14, 0x77, 0x30, 0xD9, 0x9A, 0xA5, 0xEF, 0xE8, 0xF1, 0x69, 0xA9, + 0x8B, 0x74, 0xD6, 0xCB, 0x4A, 0xAB, 0x3E, 0xD0, 0x05, 0xCF, 0xC7, 0xCB, + 0x5F, 0x77, 0x61, 0x0B, 0xF3, 0xEF, 0x84, 0x42, 0x63, 0x1A, 0x08, 0x90, + 0x38, 0xCC, 0xCC, 0x77, 0x73, 0xF4, 0x10, 0x16, 0x3B, 0x88, 0x6A, 0x36, + 0x7F, 0x3D, 0x1B, 0x47, 0xA8, 0x43, 0x13, 0xDE, 0x0F, 0x3E, 0xF8, 0x32, + 0xEB, 0xE0, 0x13, 0x3F, 0xE9, 0x45, 0x64, 0x17, 0xAD, 0x1D, 0x94, 0x00, + 0x89, 0x5B, 0xDD, 0x1B, 0xD8, 0xCC, 0x3C, 0x2A, 0x48, 0xB3, 0xF8, 0xB8, + 0xF1, 0xC1, 0x3D, 0x36, 0x45, 0xB6, 0xDC, 0x29, 0x47, 0x8F, 0x1D, 0x5B, + 0x3C, 0x11, 0xF1, 0xEC, 0xA0, 0xB6, 0x74, 0xBF, 0xF0, 0x55, 0xC6, 0x52, + 0x65, 0x24, 0x6E, 0x75, 0xE5, 0xC0, 0x3D, 0xE1, 0x34, 0x50, 0xB2, 0xB1, + 0xD2, 0xC4, 0x69, 0xAB, 0x31, 0xB5, 0xFD, 0x10, 0xAD, 0x10, 0x00, 0x18, + 0x87, 0x0B, 0x63, 0xEC, 0x74, 0x72, 0x07, 0xCC, 0x6B, 0xD8, 0x46, 0x69, + 0x4A, 0x3A, 0xD1, 0x2B, 0x25, 0x6C, 0xF7, 0x45, 0x84, 0x1D, 0x97, 0x63, + 0x70, 0x68, 0xF4, 0x8B, 0x33, 0x4A, 0xE5, 0x16, 0x81, 0xD2, 0x50, 0x2B, + 0xD8, 0x51, 0xEC, 0x33, 0xDB, 0xC8, 0xC0, 0x50, 0xE3, 0xF0, 0x1B, 0x57, + 0xFC, 0xC9, 0x7D, 0x7A, 0xC4, 0xA4, 0xF3, 0x39, 0x73, 0xAB, 0xAE, 0x42, + 0x71, 0x4B, 0xF0, 0xD1, 0xAD, 0xF4, 0x67, 0x3A, 0x9E, 0xFD, 0xA9, 0xA7, + 0x22, 0xF9, 0x06, 0x93, 0xEE, 0xBA, 0x96, 0xB4, 0x31, 0x69, 0x41, 0x8A, + 0x6D, 0x8D, 0x7C, 0xBA, 0x03, 0xBB, 0x56, 0x91, 0xAA, 0x63, 0x58, 0xC0, + 0x99, 0x61, 0xF8, 0x83, 0x65, 0x9D, 0x0B, 0x95, 0x64, 0x6D, 0xD6, 0x24, + 0x9D, 0x52, 0x6F, 0x4A, 0x46, 0xDD, 0x77, 0x09, 0x10, 0x4B, 0x4F, 0x94, + 0x82, 0x3E, 0xA6, 0xB4, 0x48, 0xE9, 0x9D, 0x5E, 0x8D, 0x79, 0x36, 0xDD, + 0x4A, 0xF4, 0x23, 0x79, 0x10, 0x38, 0xF4, 0x4D, 0x53, 0xA4, 0xB9, 0xD1, + 0xC3, 0xF3, 0x79, 0x31, 0xC3, 0x63, 0xBD, 0x71, 0x0B, 0x6A, 0x0C, 0x5F, + 0x08, 0x6E, 0xB5, 0x36, 0x89, 0x03, 0x16, 0x5D, 0x26, 0xCE, 0x9C, 0xBF, + 0x8F, 0x7E, 0x8D, 0x9A, 0x0B, 0x01, 0x77, 0xD1, 0x94, 0xA9, 0x39, 0x04, + 0x20, 0x02, 0xF0, 0x90, 0x4A, 0x89, 0xF0, 0x6F, 0x22, 0xD9, 0xC5, 0x05, + 0xDD, 0x2A, 0xB7, 0xDA, 0x78, 0x9A, 0x2C, 0xEB, 0xA0, 0x43, 0xE8, 0xAB, + 0x82, 0xA4, 0xF2, 0x5F, 0xA2, 0xFA, 0xC3, 0x30, 0x3E, 0x75, 0xCE, 0x2A, + 0xFC, 0x5B, 0x46, 0x87, 0x94, 0xC8, 0x6E, 0x3A, 0x97, 0x07, 0x31, 0x1D, + 0x80, 0xE0, 0xD8, 0xC7, 0x80, 0x43, 0x47, 0xC5, 0xA3, 0xBD, 0xFA, 0x47, + 0x6B, 0x09, 0x21, 0xF8, 0x2D, 0xA0, 0xFE, 0x41, 0x78, 0xC1, 0x44, 0x54, + 0xE5, 0xAD, 0x1E, 0xCF, 0x9B, 0x67, 0xED, 0x27, 0x5C, 0x76, 0x1A, 0x16, + 0x08, 0x8A, 0x70, 0x7D, 0x74, 0x93, 0x0B, 0x01, 0x7A, 0x3E, 0x5E, 0x15, + 0xBD, 0x4B, 0xFC, 0x29, 0x34, 0x11, 0x43, 0x95, 0x0F, 0xE7, 0x50, 0xCC, + 0xAD, 0xE3, 0xD4, 0x1F, 0x53, 0x5B, 0x85, 0x52, 0x72, 0x3C, 0x65, 0x2F, + 0xFA, 0x34, 0xD7, 0x1C, 0xAF, 0x81, 0x74, 0x7F, 0xCD, 0x2C, 0x14, 0x08, + 0xD6, 0x72, 0xA6, 0xBF, 0x7F, 0x5B, 0x23, 0x74, 0x55, 0xFD, 0xBF, 0x58, + 0x4C, 0x1F, 0x26, 0x4C, 0x77, 0xDA, 0x0B, 0x11, 0xDD, 0x11, 0x99, 0x10, + 0xB6, 0x9A, 0xE5, 0x77, 0xA5, 0x63, 0x81, 0xF7, 0x2B, 0x9D, 0x8E, 0xD1, + 0xFE, 0xF8, 0x8D, 0x8E, 0x24, 0x12, 0x5B, 0x7D, 0x3A, 0xDD, 0x49, 0xAD, + 0x06, 0xEE, 0x1F, 0x8C, 0x95, 0x9A, 0x8F, 0x2C, 0xEF, 0xF5, 0x85, 0x61, + 0xAF, 0x09, 0xB0, 0x27, 0x16, 0x48, 0xC6, 0x37, 0x2D, 0x0A, 0x17, 0xC4, + 0xDA, 0x53, 0x51, 0xEB, 0x42, 0x95, 0xCA, 0x14, 0x32, 0x93, 0x5B, 0x40, + 0x92, 0x08, 0x6A, 0xE9, 0xB3, 0x66, 0x9D, 0xE0, 0x81, 0x57, 0x9A, 0x38, + 0x4A, 0x23, 0xFE, 0x8F, 0x02, 0x65, 0x33, 0x35, 0x55, 0xB8, 0xB2, 0x34, + 0x9D, 0xD2, 0xDC, 0xD7, 0xF4, 0x19, 0x1D, 0x83, 0x2A, 0x91, 0xF0, 0x84, + 0xD6, 0x7F, 0x45, 0x63, 0x6E, 0x4F, 0x0E, 0x7E, 0x59, 0xBC, 0x22, 0x92, + 0xD4, 0xC5, 0xCF, 0xE8, 0xED, 0x15, 0x8C, 0xB5, 0xAA, 0x43, 0x17, 0xE0, + 0x46, 0x04, 0x7A, 0x80, 0x15, 0x0A, 0x40, 0xE8, 0x6E, 0x4E, 0x53, 0x10, + 0x7E, 0xB1, 0x71, 0x43, 0x20, 0x14, 0xA3, 0xF5, 0xD2, 0x04, 0x37, 0x90, + 0xA8, 0xBF, 0x4C, 0x4E, 0x1E, 0xB7, 0xCE, 0x0F, 0x0C, 0xD1, 0x82, 0x64, + 0x4B, 0x79, 0x47, 0x12, 0xE6, 0x7A, 0x4E, 0xC1, 0xAD, 0xFD, 0xFE, 0x31, + 0x09, 0x36, 0x41, 0x24, 0x0A, 0xCF, 0x20, 0x0C, 0xC3, 0x04, 0x57, 0x39, + 0xDD, 0x9C, 0x3E, 0x2E, 0xED, 0xAD, 0x96, 0x20, 0xBD, 0xC6, 0xB7, 0x18, + 0xEC, 0x03, 0x2E, 0xFC, 0x45, 0x93, 0xD2, 0x09, 0x13, 0xAE, 0xB8, 0x22, + 0xFB, 0x4B, 0xB4, 0x7D, 0x0F, 0x5E, 0x9F, 0xE1, 0xFB, 0x94, 0xA4, 0xC7, + 0x07, 0x9E, 0x72, 0x48, 0x7F, 0xEC, 0xC5, 0x0A, 0x19, 0xD5, 0x54, 0x2B, + 0x77, 0x16, 0x0A, 0xDC, 0x22, 0xC7, 0x03, 0x12, 0x9E, 0x11, 0xAC, 0x70, + 0x44, 0x1D, 0xA4, 0xC5, 0xE2, 0x19, 0x9B, 0xE3, 0xDC, 0x05, 0x36, 0x30, + 0x92, 0xCC, 0xC3, 0xF7, 0xCF, 0xD5, 0x67, 0x3C, 0xF7, 0x99, 0x37, 0x16, + 0xB3, 0x38, 0x38, 0xEE, 0x66, 0x7C, 0x80, 0xFD, 0x02, 0x94, 0xFA, 0x1F, + 0x10, 0xD9, 0xA8, 0x45, 0x58, 0x91, 0x85, 0xDA, 0x1F, 0xF2, 0x6B, 0xE3, + 0x8F, 0x09, 0xB8, 0xA1, 0x17, 0xA2, 0xF0, 0x75, 0x5B, 0x5D, 0xEC, 0x39, + 0x86, 0x0C, 0x88, 0xAE, 0xF6, 0x99, 0x7F, 0x55, 0x70, 0x52, 0xF0, 0x63, + 0x66, 0x75, 0x80, 0xF4, 0x87, 0x13, 0x01, 0x26, 0x82, 0x39, 0xE3, 0x2F, + 0xE2, 0x5F, 0xCF, 0xFC, 0x22, 0x28, 0xE9, 0x75, 0x8F, 0xCD, 0x7A, 0x03, + 0x77, 0xB0, 0x4E, 0x19, 0x03, 0x73, 0x2B, 0xFB, 0x87, 0xF4, 0x94, 0x18, + 0xF8, 0xF7, 0xCB, 0x94, 0x7C, 0xB9, 0x54, 0xD5, 0xED, 0xC5, 0x47, 0x3B, + 0x12, 0xA1, 0x65, 0x05, 0x39, 0x45, 0x5A, 0x51, 0x75, 0x3B, 0xC8, 0x84, + 0x6F, 0x1F, 0x5D, 0x6C, 0x7E, 0xBE, 0xE2, 0x42, 0x1A, 0xD8, 0x74, 0x0D, + 0x17, 0x62, 0x9B, 0xBE, 0xDF, 0x55, 0x15, 0x50, 0xC4, 0xDF, 0x95, 0x92, + 0x9D, 0xCD, 0xA2, 0x3F, 0x38, 0x5C, 0x09, 0x51, 0xBB, 0xF4, 0xD8, 0xE9, + 0xEF, 0xB0, 0x88, 0x0C, 0x92, 0x7F, 0xCB, 0x01, 0x91, 0x13, 0x7A, 0x44, + 0xA1, 0x98, 0x2E, 0x0E, 0x12, 0x63, 0xA7, 0xBC, 0xD3, 0x0C, 0x07, 0xE0, + 0xD4, 0x72, 0xF5, 0x45, 0xCE, 0x44, 0x4D, 0xF8, 0x76, 0xF9, 0x1A, 0x1C, + 0xF5, 0x80, 0xB2, 0x93, 0x23, 0x93, 0x9B, 0xEE, 0x99, 0x35, 0xE4, 0xBB, + 0xE9, 0x4D, 0x72, 0xFC, 0xA0, 0xE6, 0x7B, 0x27, 0x67, 0x11, 0x88, 0x9B, + 0xAA, 0x38, 0x8D, 0x6C, 0x33, 0x52, 0x5D, 0xD6, 0x22, 0xF4, 0xBC, 0xD1, + 0xCD, 0x9C, 0x74, 0x3A, 0xEA, 0x2B, 0xB0, 0x20, 0x2E, 0xAA, 0x75, 0xF2, + 0xD6, 0xDA, 0xFB, 0x93, 0xDB, 0x71, 0xB6, 0x07, 0xD9, 0x85, 0xCA, 0xBB, + 0x45, 0x97, 0x00, 0x42, 0xA8, 0xD1, 0xA3, 0x44, 0x13, 0x66, 0xAF, 0x0A, + 0xA0, 0xEB, 0x2F, 0xA3, 0x27, 0x64, 0x78, 0x46, 0x9C, 0xE4, 0x99, 0xA5, + 0x47, 0x96, 0xC1, 0xD1, 0x99, 0x5C, 0x9A, 0x6A, 0xBA, 0x5E, 0xC6, 0xBA, + 0xEB, 0x63, 0x19, 0x6F, 0xC9, 0xDB, 0x36, 0xD8, 0xAD, 0x58, 0x44, 0x30, + 0x8F, 0x59, 0x19, 0x42, 0xAF, 0x6A, 0x1B, 0x8A, 0xC9, 0xA2, 0xAE, 0x00, + 0x5D, 0x5A, 0x09, 0x33, 0xAC, 0x02, 0xDA, 0x64, 0xAF, 0xDD, 0xDF, 0x15, + 0x2A, 0xA2, 0xD2, 0xA1, 0xA6, 0x93, 0x5C, 0xE1, 0x10, 0xC3, 0x6A, 0x10, + 0xA5, 0x97, 0x2D, 0x6D, 0xD9, 0xA9, 0xB5, 0x36, 0x71, 0x54, 0xC4, 0xEF, + 0xC8, 0xC6, 0x17, 0x30, 0xDD, 0xCF, 0x96, 0x86, 0xC8, 0x63, 0x60, 0x21, + 0xAB, 0x3D, 0xBA, 0x40, 0x8F, 0x30, 0x16, 0xBE, 0xD9, 0xDF, 0x7E, 0x13, + 0xCB, 0xBF, 0xF7, 0x0E, 0x33, 0x31, 0x18, 0xED, 0x1E, 0x47, 0xD8, 0xF2, + 0xCF, 0x42, 0xC8, 0xF3, 0x2C, 0x20, 0x00, 0xB1, 0x8F, 0xB9, 0x1F, 0xEA, + 0x82, 0x11, 0x03, 0x8D, 0xB5, 0x25, 0xB4, 0x84, 0x79, 0x97, 0xDC, 0x56, + 0x3C, 0x8B, 0x41, 0x9A, 0x01, 0x63, 0x7A, 0xF7, 0x66, 0x0F, 0x05, 0xF7, + 0x4A, 0xDC, 0x05, 0x03, 0x29, 0x5C, 0xF1, 0x89, 0x8D, 0x38, 0x19, 0x48, + 0x38, 0xBE, 0x82, 0xCD, 0x04, 0x16, 0xEC, 0xD6, 0x68, 0xB8, 0x00, 0x3D, + 0xC6, 0x6E, 0xDA, 0x10, 0x0F, 0x12, 0x19, 0x18, 0xAE, 0x24, 0x29, 0x2E, + 0xD1, 0x5D, 0xD3, 0xA2, 0x7A, 0x8A, 0x10, 0x20, 0xB5, 0x8A, 0xD4, 0x41, + 0x66, 0x8E, 0x00, 0x9E, 0x29, 0x11, 0x3A, 0xBD, 0xEA, 0x66, 0xA6, 0x18, + 0x87, 0xD3, 0xEE, 0x0F, 0x17, 0xE5, 0x5B, 0xB9, 0x16, 0x56, 0x22, 0xDD, + 0x9C, 0xB6, 0x02, 0xBD, 0x6C, 0x19, 0xBA, 0x85, 0x1F, 0x44, 0xB7, 0x88, + 0x43, 0x45, 0xBE, 0x29, 0x65, 0xA2, 0xBE, 0xC1, 0x4E, 0xCF, 0x25, 0x53, + 0xD6, 0xC2, 0x53, 0x59, 0xF9, 0xA3, 0xC3, 0x52, 0x9C, 0xEE, 0xE0, 0x92, + 0x39, 0x20, 0x97, 0xA0, 0xF7, 0x8C, 0x58, 0x8B, 0x7A, 0xEA, 0x05, 0x7B, + 0x6B, 0x92, 0x65, 0xAC, 0x63, 0x9C, 0x11, 0x06, 0xB5, 0x2F, 0xC2, 0x5D, + 0x97, 0x55, 0x88, 0x25, 0x3C, 0x37, 0xE8, 0x8D, 0xBE, 0xB2, 0x3C, 0xFB, + 0xC5, 0x0D, 0xD9, 0x6B, 0xA6, 0x7F, 0xD4, 0xD7, 0xB9, 0xB8, 0x56, 0xC3, + 0x9B, 0xA0, 0x75, 0x7B, 0x3D, 0x5D, 0xF4, 0x53, 0xED, 0xF7, 0xBF, 0xA7, + 0xD9, 0xD8, 0x0C, 0x14, 0x4F, 0xD6, 0xA4, 0xAC, 0xB3, 0x33, 0x44, 0x62, + 0x04, 0x52, 0xB4, 0xA2, 0xE3, 0x1E, 0x46, 0x73, 0x78, 0x92, 0x66, 0x24, + 0xEB, 0x43, 0x46, 0xEC, 0x6C, 0x1D, 0x7B, 0xA1, 0x0B, 0x55, 0xCB, 0xA1, + 0xF7, 0x7F, 0xCA, 0x78, 0x46, 0x22, 0x8F, 0xD7, 0xB2, 0x42, 0x86, 0x4A, + 0xE9, 0xCC, 0xFC, 0x77, 0x88, 0x84, 0x95, 0x0A, 0x24, 0x8B, 0xB5, 0xC2, + 0x66, 0x6B, 0xA3, 0x91, 0x47, 0xFD, 0x5B, 0x87, 0x9B, 0xE0, 0xBF, 0xB0, + 0x49, 0x38, 0xD9, 0x6D, 0x05, 0x7A, 0x53, 0xFF, 0xDC, 0xE8, 0x9C, 0xB9, + 0xAF, 0x59, 0xFD, 0xE5, 0xD4, 0xE3, 0x3A, 0x58, 0xCD, 0xA7, 0x9C, 0x6F, + 0xE0, 0x19, 0x17, 0xB4, 0x14, 0xFD, 0x16, 0xD5, 0x39, 0x77, 0x8F, 0xCE, + 0x7F, 0xC0, 0xF1, 0x5F, 0xE1, 0x69, 0x26, 0x89, 0x4C, 0x43, 0xCA, 0xD7, + 0x37, 0x51, 0x12, 0x6B, 0x45, 0x3D, 0x8B, 0xD9, 0xD7, 0x8B, 0xDB, 0x22, + 0x33, 0x79, 0x34, 0x56, 0xE7, 0xDC, 0x00, 0xBD, 0xD1, 0x98, 0x52, 0xAC, + 0x1D, 0x47, 0x69, 0xFF, 0x88, 0xBF, 0x15, 0x3F, 0x7D, 0xDF, 0x12, 0x26, + 0xF7, 0x1F, 0xBD, 0xD4, 0x13, 0x52, 0x86, 0xB5, 0x2F, 0x4F, 0x0F, 0xD2, + 0x44, 0x6A, 0xB7, 0x71, 0x67, 0x69, 0x2E, 0x76, 0x56, 0x82, 0xFA, 0x88, + 0x8B, 0xE2, 0x80, 0x45, 0x31, 0x4E, 0xE8, 0xEF, 0xFC, 0x48, 0xEA, 0x2E, + 0x10, 0x9C, 0x73, 0x12, 0x89, 0xA6, 0x17, 0x3A, 0xFE, 0x2E, 0x4C, 0x33, + 0x97, 0x54, 0x3C, 0x8D, 0x0F, 0xAC, 0xA5, 0xD0, 0x71, 0x62, 0x73, 0x97, + 0xF8, 0xED, 0xD5, 0xCF, 0xC5, 0x18, 0x67, 0x1A, 0x1C, 0xE2, 0xA6, 0x2E, + 0xD1, 0x51, 0x74, 0x57, 0xD3, 0xE8, 0x6E, 0x60, 0x00, 0x96, 0x2D, 0x3E, + 0x7F, 0xD3, 0x05, 0xB0, 0x22, 0xC2, 0x0F, 0xF4, 0x69, 0x73, 0xAF, 0xC2, + 0x02, 0x22, 0x40, 0xF9, 0x6F, 0x35, 0x13, 0x04, 0xA4, 0x48, 0xD3, 0xE7, + 0xEE, 0x88, 0xC4, 0x03, 0xD5, 0x0D, 0x90, 0x48, 0x97, 0x8A, 0x9D, 0x12, + 0x02, 0xE9, 0x04, 0xD4, 0x2A, 0xA6, 0x13, 0xF6, 0x04, 0x3C, 0x76, 0x0D, + 0x37, 0xBB, 0xF5, 0x8A, 0x12, 0x04, 0x3A, 0xFE, 0xAC, 0xA7, 0x8D, 0xB8, + 0x6E, 0xC4, 0xA5, 0x26, 0x84, 0xFF, 0xEA, 0x81, 0x8D, 0x33, 0x2D, 0xF0, + 0x9D, 0x0B, 0xFB, 0x04, 0x7B, 0x46, 0x71, 0x57, 0xA0, 0x24, 0xD9, 0xF6, + 0x8A, 0x44, 0x16, 0xE1, 0x7F, 0x28, 0xD2, 0xC5, 0xC2, 0xEF, 0x8D, 0xA9, + 0x63, 0x8B, 0x6B, 0x98, 0x50, 0x1A, 0xB4, 0x66, 0xFB, 0xCD, 0x3D, 0x1E, + 0x79, 0x86, 0x22, 0xA3, 0xB3, 0x78, 0xBF, 0x0D, 0x2E, 0x66, 0x45, 0x0A, + 0xA0, 0x58, 0xE9, 0x4D, 0x52, 0x5E, 0x9E, 0x07, 0xAD, 0x05, 0x3D, 0x35, + 0x17, 0xA2, 0x65, 0x0C, 0xFE, 0x80, 0x56, 0x81, 0x8C, 0x5D, 0x08, 0x0B, + 0x15, 0x75, 0x0E, 0x88, 0x19, 0x34, 0x2D, 0xB7, 0x88, 0x92, 0x6C, 0xC9, + 0xF3, 0xDF, 0x19, 0xB6, 0x6D, 0xAB, 0x58, 0x13, 0x6E, 0xCE, 0xC9, 0x9A, + 0x07, 0xF9, 0x34, 0x9C, 0x5C, 0x9E, 0x33, 0x8F, 0x11, 0xCA, 0xA5, 0x1D, + 0xD4, 0xDA, 0xC7, 0x8C, 0x3B, 0x61, 0xBF, 0x8D, 0xCB, 0x69, 0xFF, 0x36, + 0x8E, 0x0C, 0xAD, 0xF4, 0x32, 0xC3, 0x20, 0x57, 0xCE, 0x19, 0xAD, 0x61, + 0xB0, 0x2C, 0xB0, 0xCD, 0xA4, 0xBD, 0xE0, 0xFC, 0x73, 0x3F, 0xA6, 0xE9, + 0x72, 0x6E, 0xB8, 0x84, 0x2F, 0x6A, 0xE8, 0xAF, 0x58, 0xC6, 0x64, 0xD7, + 0xA0, 0x3F, 0x36, 0x63, 0x95, 0x72, 0x06, 0x8B, 0xA7, 0xE5, 0xB4, 0x25, + 0xC7, 0xB7, 0xB7, 0xBD, 0xFA, 0xF2, 0xCD, 0x28, 0xDD, 0xC2, 0x80, 0x7B, + 0x45, 0xFA, 0x8D, 0xCF, 0xD2, 0x5E, 0xB8, 0x0C, 0xA1, 0x40, 0xC7, 0x40, + 0xCB, 0x0D, 0xF4, 0x61, 0xAC, 0x20, 0x45, 0x58, 0xB7, 0x56, 0x2A, 0xE6, + 0x2E, 0x64, 0xFF, 0xC3, 0xC7, 0xE1, 0xF6, 0xB3, 0xE8, 0x42, 0x3F, 0xB5, + 0x26, 0x4F, 0x49, 0x02, 0x39, 0x91, 0x2C, 0x49, 0x70, 0xDA, 0x87, 0x86, + 0xA4, 0x29, 0x36, 0x62, 0xF8, 0x2F, 0xBD, 0xD0, 0xF1, 0x0B, 0xD3, 0xEB, + 0x8A, 0x68, 0x13, 0xD6, 0x9C, 0xC8, 0x78, 0x28, 0xBD, 0xAA, 0xDF, 0xEA, + 0x72, 0xCD, 0x03, 0x83, 0xE9, 0xBB, 0x3C, 0x6F, 0x75, 0x1F, 0xAF, 0x67, + 0x47, 0x5E, 0x01, 0xC1, 0x88, 0xE9, 0x9B, 0xB0, 0xF9, 0x65, 0xF6, 0x8D, + 0x79, 0x2A, 0xA9, 0xC9, 0x3C, 0xF3, 0x24, 0x19, 0x22, 0x81, 0x32, 0x9E, + 0xBE, 0xFA, 0xB4, 0x53, 0x17, 0x64, 0x02, 0x8C, 0x7C, 0x18, 0x21, 0x01, + 0xF2, 0x14, 0xE8, 0x6E, 0xAE, 0x3E, 0xAE, 0x60, 0xB1, 0x4C, 0x51, 0x9B, + 0xBA, 0x28, 0x24, 0xA0, 0xB9, 0xFC, 0xEA, 0xE5, 0x9C, 0xA7, 0x18, 0xE2, + 0x35, 0x05, 0x07, 0x19, 0xAD, 0xE8, 0x02, 0x71, 0x17, 0x53, 0x20, 0x4A, + 0xCD, 0x33, 0xC6, 0xB3, 0x70, 0x9F, 0x46, 0x24, 0xEB, 0xA8, 0x18, 0x24, + 0x99, 0xD4, 0x87, 0x16, 0x00, 0xBE, 0xF4, 0x41, 0x6C, 0xBF, 0x45, 0xE3, + 0xF7, 0x6F, 0xD1, 0x0A, 0x4A, 0x6A, 0x23, 0x5D, 0x0B, 0xFA, 0xB5, 0x71, + 0x97, 0xE2, 0x6B, 0xD3, 0x81, 0xB9, 0x49, 0xBC, 0xC4, 0x3C, 0xB2, 0x0C, + 0x15, 0x77, 0x8E, 0x5A, 0xC0, 0x89, 0x5F, 0x9A, 0x93, 0x9A, 0x75, 0xB2, + 0xA4, 0xE2, 0x7E, 0x5A, 0x9C, 0x0A, 0x7E, 0x8C, 0xDD, 0x9F, 0x31, 0x10, + 0x95, 0x8D, 0x57, 0x0E, 0xB7, 0xDD, 0x8B, 0xE7, 0x39, 0xAC, 0x79, 0x11, + 0x51, 0x3C, 0xBB, 0x21, 0x58, 0xD7, 0x23, 0xFA, 0x63, 0xFD, 0x21, 0x85, + 0x3F, 0x5F, 0x85, 0xF0, 0x3C, 0xF8, 0xE9, 0x40, 0x72, 0x92, 0x79, 0xCF, + 0x21, 0x14, 0xED, 0xAB, 0xB9, 0xC3, 0xCF, 0x10, 0x85, 0x28, 0x3B, 0x81, + 0xB6, 0x6E, 0x99, 0x18, 0x7C, 0xD9, 0x36, 0x11, 0x22, 0x6C, 0xF8, 0x83, + 0xB2, 0x51, 0xD3, 0xF7, 0x42, 0x37, 0xD4, 0xBA, 0x85, 0xB7, 0x9E, 0x6C, + 0x61, 0xB3, 0xDB, 0x6F, 0x79, 0xF2, 0x34, 0xA7, 0x29, 0x3C, 0xE9, 0x2B, + 0x2B, 0x0B, 0xF4, 0x5F, 0x47, 0x96, 0x14, 0x36, 0xA4, 0x2F, 0x67, 0x54, + 0x77, 0x48, 0x2B, 0x5F, 0x4A, 0x1F, 0xB2, 0xE5, 0xFF, 0x38, 0xE4, 0xE2, + 0xAE, 0x76, 0xB1, 0x66, 0x7F, 0x01, 0xE8, 0x31, 0xA4, 0x24, 0xBA, 0x95, + 0xAB, 0x0A, 0x9B, 0x1F, 0xC4, 0x04, 0x59, 0x9C, 0x0D, 0xD0, 0x3D, 0x2E, + 0x7F, 0xCE, 0xBE, 0xD2, 0x93, 0x2A, 0xB0, 0x95, 0x22, 0xA5, 0xE9, 0xE4, + 0xCA, 0xE2, 0x49, 0x15, 0xDF, 0x64, 0x65, 0xE4, 0xE5, 0xC8, 0x65, 0xA3, + 0x18, 0x53, 0x36, 0xD4, 0x8B, 0xC7, 0x97, 0xE1, 0x4E, 0xD9, 0x92, 0xE7, + 0x4A, 0x01, 0x2F, 0x93, 0xB0, 0x09, 0x40, 0x4E, 0x5A, 0x58, 0x7F, 0x2D, + 0xDB, 0x7E, 0xA5, 0xAB, 0x8A, 0xA1, 0xFD, 0x4C, 0x9C, 0x55, 0x0F, 0x47, + 0x64, 0x02, 0x80, 0xCB, 0x57, 0x50, 0xEC, 0xFE, 0xB7, 0xDC, 0xD2, 0x21, + 0xD7, 0x0B, 0xF5, 0x0F, 0xD3, 0xB2, 0x10, 0xDF, 0x8D, 0x8B, 0x91, 0xE0, + 0x9C, 0x44, 0x59, 0x0E, 0x08, 0xF2, 0xAB, 0x94, 0x75, 0xF3, 0x56, 0x96, + 0xF0, 0x3E, 0x65, 0xA0, 0xBA, 0x4C, 0x10, 0x20, 0xB7, 0xF4, 0x2E, 0xEC, + 0xE2, 0xC4, 0x03, 0x7D, 0xFB, 0xD9, 0x79, 0xCC, 0x88, 0x1F, 0x77, 0xE8, + 0x9D, 0x1B, 0x89, 0xCD, 0xBB, 0x3D, 0x63, 0x3D, 0xCC, 0x95, 0x8C, 0xFA, + 0x5C, 0x79, 0xC2, 0xE1, 0x83, 0x64, 0xE0, 0xB3, 0x52, 0x38, 0x90, 0x49, + 0x2A, 0x02, 0x1A, 0x9F, 0x85, 0xC4, 0x45, 0x59, 0xE2, 0xE1, 0xF6, 0x7B, + 0x61, 0xAF, 0x0A, 0xBA, 0xA3, 0x8F, 0xA0, 0x2D, 0xEE, 0x7C, 0xBE, 0x54, + 0x40, 0x15, 0xB5, 0x87, 0xA1, 0xEF, 0x7E, 0x09, 0x38, 0x51, 0xED, 0x2D, + 0xDE, 0xDB, 0x41, 0xC6, 0xEE, 0x88, 0xAD, 0x1F, 0x9C, 0x1C, 0xEC, 0x70, + 0x39, 0x38, 0x45, 0xB8, 0x01, 0xB6, 0x58, 0x85, 0x61, 0x48, 0x3A, 0xCB, + 0xE9, 0x97, 0xB3, 0x96, 0x8C, 0x0B, 0xD7, 0x33, 0x73, 0x73, 0x7F, 0x1D, + 0x85, 0xFF, 0xE9, 0x9E, 0xCE, 0xD1, 0x1E, 0xFD, 0x1B, 0x7A, 0x63, 0x33, + 0x10, 0x47, 0x96, 0xBA, 0x0A, 0x8E, 0xF6, 0x4C, 0x70, 0xC1, 0xE1, 0xFD, + 0x19, 0x5A, 0xE0, 0x19, 0xE8, 0xD9, 0x0C, 0x31, 0x8E, 0xA7, 0x42, 0x9D, + 0x50, 0xB2, 0xC9, 0x20, 0xE8, 0x62, 0xD2, 0x27, 0x67, 0x8E, 0xB6, 0x33, + 0x8C, 0xD9, 0x38, 0x85, 0xDC, 0x4D, 0xCF, 0x72, 0xF3, 0xCF, 0xAF, 0xB6, + 0x00, 0xF0, 0x54, 0xAE, 0x27, 0xEC, 0x80, 0x28, 0x4B, 0x4B, 0xA8, 0x57, + 0x5C, 0xC3, 0xEE, 0x3A, 0x1F, 0x77, 0xAC, 0x9E, 0xA9, 0x11, 0x71, 0x23, + 0x5B, 0xFB, 0xF6, 0x80, 0x0E, 0x80, 0xCB, 0xC7, 0xE8, 0x1F, 0x8B, 0x09, + 0x45, 0xA0, 0xF6, 0x70, 0xD1, 0x3D, 0x9D, 0x46, 0x00, 0x80, 0x3E, 0x79, + 0x1F, 0x4C, 0xF2, 0x4F, 0xCC, 0x8B, 0x9F, 0x63, 0xCC, 0x01, 0x62, 0xD3, + 0x30, 0x7D, 0xB1, 0x74, 0xB8, 0xF5, 0xB1, 0x0F, 0x13, 0x57, 0xF7, 0x70, + 0x7F, 0x16, 0x6C, 0x27, 0x17, 0x16, 0x49, 0xE6, 0x5F, 0x87, 0xA2, 0x52, + 0x0E, 0x9C, 0xF9, 0xA9, 0xEE, 0x91, 0xF0, 0xB1, 0x9C, 0x32, 0x13, 0x67, + 0x08, 0xFA, 0x0C, 0x62, 0xBF, 0x11, 0xB2, 0x81, 0x9F, 0xFF, 0xC1, 0x0C, + 0xF9, 0x84, 0xBA, 0x85, 0x2E, 0xC2, 0xBC, 0xC0, 0x59, 0x1E, 0x56, 0x62, + 0x58, 0x39, 0x38, 0x6B, 0xFC, 0xC5, 0xC4, 0x9A, 0x97, 0xBC, 0x15, 0xA3, + 0x2E, 0x90, 0xD2, 0x8E, 0x18, 0xDF, 0x51, 0x39, 0x61, 0x99, 0xE4, 0x2D, + 0xA9, 0x50, 0x70, 0x0B, 0x0F, 0x41, 0x20, 0x89, 0x37, 0xFC, 0xE5, 0xD7, + 0x3B, 0x57, 0xF5, 0x94, 0x69, 0x4C, 0xEC, 0x56, 0x1B, 0x9B, 0xA3, 0x73, + 0xC2, 0x6F, 0xA8, 0xFF, 0xF2, 0xEC, 0xD0, 0xD9, 0x79, 0x9F, 0x39, 0x0B, + 0x7C, 0xF2, 0xE2, 0x5E, 0x52, 0x7A, 0xE0, 0x81, 0xE3, 0x54, 0xC6, 0x2D, + 0x86, 0x27, 0x8D, 0x04, 0xC3, 0x63, 0x2E, 0x25, 0x6E, 0x05, 0x8F, 0xFB, + 0xCA, 0x89, 0x18, 0x4D, 0x9B, 0xB9, 0x20, 0xA1, 0x15, 0xA2, 0x33, 0x56, + 0xAB, 0x3F, 0x2D, 0x14, 0x5A, 0x04, 0x5D, 0xBB, 0x7E, 0xE8, 0xF7, 0x4B, + 0xD6, 0x49, 0xE8, 0xAF, 0xE5, 0x10, 0x1F, 0x91, 0x68, 0x7C, 0xA0, 0x55, + 0x24, 0x75, 0x46, 0xAF, 0xE1, 0xCD, 0x75, 0x0D, 0x36, 0xC7, 0xAB, 0x21, + 0xAC, 0xA8, 0x1C, 0xF0, 0x69, 0x6F, 0x38, 0x5E, 0x67, 0x7D, 0x99, 0x72, + 0xB9, 0x39, 0xE9, 0xFB, 0xCF, 0xCC, 0x24, 0x8C, 0x63, 0x6B, 0x6D, 0xBD, + 0x0C, 0xFF, 0x5A, 0x2D, 0xD0, 0x3F, 0x62, 0xE9, 0xFE, 0xC3, 0x50, 0x18, + 0xC1, 0xE9, 0x07, 0xE8, 0xE5, 0x2E, 0xA5, 0x98, 0x53, 0x27, 0x4A, 0x3D, + 0xC9, 0xAF, 0x1B, 0x5E, 0x41, 0x4F, 0x67, 0xFE, 0x84, 0xBB, 0x74, 0x0C, + 0x6C, 0x88, 0x02, 0xFA, 0x37, 0x6A, 0xAD, 0xBC, 0x08, 0xDB, 0xE8, 0xF2, + 0xCD, 0xA4, 0xF0, 0xFC, 0xCC, 0xAD, 0xB5, 0xE7, 0x95, 0x61, 0x93, 0x99, + 0xF1, 0xA3, 0x06, 0xCC, 0x01, 0x8D, 0x45, 0x9E, 0xE1, 0xA6, 0x15, 0xDC, + 0x4A, 0x99, 0x0F, 0x15, 0x34, 0x1E, 0x7E, 0x4F, 0xE5, 0x42, 0xEC, 0xE9, + 0xD3, 0xA3, 0xAD, 0xAB, 0x96, 0x5B, 0x89, 0x94, 0x12, 0xD3, 0xB1, 0x64, + 0x69, 0x5B, 0x55, 0xC6, 0x8C, 0x77, 0xD0, 0x9D, 0x0D, 0xF3, 0x36, 0x79, + 0x49, 0x50, 0xE9, 0xBC, 0x61, 0x62, 0xFA, 0x67, 0xDE, 0x00, 0x87, 0xC5, + 0x95, 0x02, 0xBD, 0xAC, 0x7F, 0x3C, 0x92, 0x49, 0x15, 0xFE, 0xB4, 0x9D, + 0x44, 0xD9, 0x19, 0x10, 0x88, 0xDE, 0xBB, 0xC9, 0xE1, 0xEF, 0xC0, 0xD6, + 0x60, 0xC7, 0x1D, 0x8B, 0xE8, 0xE3, 0xD1, 0xE8, 0x28, 0x5D, 0xEC, 0x49, + 0xEA, 0x79, 0xE4, 0x61, 0x61, 0x7C, 0x81, 0xBF, 0x6D, 0xA1, 0x89, 0x80, + 0x63, 0x83, 0x65, 0xF2, 0x5C, 0xF6, 0xBB, 0xAD, 0xD4, 0x3B, 0x2F, 0xFE, + 0x6F, 0x0A, 0xD6, 0x6E, 0x2D, 0x6E, 0x34, 0xB9, 0x0B, 0xE2, 0x12, 0x8B, + 0x40, 0xFE, 0x0E, 0x24, 0x6C, 0x67, 0xDE, 0x25, 0xCD, 0x48, 0x34, 0x8A, + 0x5B, 0x0D, 0x9B, 0xC4, 0xD3, 0x1C, 0xE6, 0x9D, 0x8C, 0x77, 0xB0, 0x2B, + 0x0C, 0x77, 0x2C, 0x0D, 0xBE, 0xAD, 0xE1, 0x9D, 0x9F, 0x10, 0x84, 0x34, + 0x39, 0x52, 0xB0, 0xB8, 0x1C, 0x02, 0x24, 0x3C, 0xD8, 0x80, 0xD4, 0x40, + 0x63, 0x59, 0xE6, 0x6C, 0x0F, 0xFA, 0xEB, 0xAE, 0xDC, 0x67, 0x47, 0x03, + 0x25, 0x80, 0xCD, 0x4B, 0x21, 0x77, 0x17, 0xBB, 0x19, 0x8C, 0xC1, 0x09, + 0x7E, 0x0F, 0x7D, 0xD7, 0x50, 0xF9, 0xC3, 0xAA, 0x05, 0x10, 0xDD, 0x6B, + 0xD2, 0x96, 0x46, 0x14, 0xC2, 0xA5, 0xD7, 0xF8, 0xED, 0xDA, 0x58, 0x53, + 0xC3, 0x8F, 0xAB, 0x47, 0x91, 0x95, 0x48, 0x0C, 0xDE, 0xED, 0x99, 0x04, + 0x3A, 0xC7, 0xCC, 0xB5, 0x1C, 0xAC, 0x29, 0xAE, 0xFA, 0xA6, 0xA5, 0x57, + 0x65, 0x12, 0x86, 0xBE, 0x72, 0xFB, 0x06, 0x93, 0x49, 0xD0, 0x53, 0x43, + 0xD0, 0xD4, 0xC7, 0x2F, 0x8A, 0x13, 0xEC, 0x95, 0x3B, 0x18, 0xD3, 0x67, + 0x2B, 0xA6, 0xCF, 0x0B, 0xE6, 0x47, 0xF9, 0x3A, 0x32, 0x41, 0x27, 0xC8, + 0xDB, 0xD7, 0xC7, 0xED, 0xB7, 0xCF, 0x75, 0xF1, 0x29, 0xC7, 0x28, 0x97, + 0x07, 0xBA, 0x74, 0x2C, 0x5A, 0xAE, 0x6E, 0x39, 0x51, 0xF3, 0xD2, 0x07, + 0xE2, 0x82, 0xFA, 0xE0, 0xD0, 0x22, 0x6B, 0xC7, 0xDA, 0x90, 0x0D, 0x1B, + 0xB5, 0x17, 0x8A, 0xFA, 0x9E, 0xB5, 0x1A, 0xBD, 0x6F, 0x64, 0x02, 0xF5, + 0x14, 0xB4, 0x63, 0x64, 0xFB, 0x42, 0x99, 0x42, 0xDE, 0x6A, 0x6C, 0xAB, + 0x5B, 0xE5, 0xC4, 0x62, 0x25, 0x66, 0x83, 0xC3, 0x6A, 0x64, 0x4A, 0xD0, + 0xA7, 0x4F, 0x66, 0x21, 0xF9, 0x7C, 0xCC, 0x15, 0x5F, 0x69, 0xB3, 0x2E, + 0x83, 0x26, 0x12, 0xC7, 0xE0, 0xE4, 0xAE, 0x92, 0x44, 0xA4, 0x1F, 0xEE, + 0xBC, 0x06, 0xAF, 0xC4, 0x5A, 0x14, 0x89, 0xCF, 0x46, 0xC2, 0xA8, 0x80, + 0x98, 0xF6, 0xCC, 0xA8, 0x7E, 0xDE, 0x94, 0x31, 0x36, 0xBF, 0x80, 0xA9, + 0x49, 0x62, 0xF9, 0x4B, 0x09, 0xFF, 0x29, 0xCC, 0xB6, 0x5A, 0x84, 0xBC, + 0xCB, 0xF4, 0xBB, 0x19, 0xC1, 0xA7, 0x09, 0x60, 0xF9, 0xD4, 0x0F, 0x84, + 0xE0, 0xDF, 0x9A, 0x0D, 0xCC, 0xCA, 0x14, 0x68, 0x39, 0x74, 0x10, 0x63, + 0x13, 0xC0, 0xAE, 0xD2, 0x2B, 0x3C, 0x6E, 0xC2, 0x29, 0x51, 0xC9, 0xAF, + 0x0E, 0x09, 0x87, 0xAD, 0x82, 0x8A, 0xA6, 0x0F, 0x02, 0x4B, 0xAD, 0x1F, + 0x63, 0xEE, 0xAE, 0x57, 0xE0, 0xE5, 0x51, 0xCC, 0x8C, 0x9A, 0x9E, 0x4F, + 0x67, 0xFB, 0xD4, 0x9F, 0xA5, 0x18, 0x13, 0x9F, 0x24, 0xF4, 0x9E, 0x2B, + 0x52, 0xC0, 0x08, 0xE8, 0x77, 0xEA, 0xBB, 0x01, 0x5A, 0x77, 0x46, 0xEF, + 0x10, 0xAC, 0xA4, 0x70, 0x56, 0x98, 0x5A, 0xBF, 0x4A, 0x82, 0x72, 0x96, + 0xB9, 0xB1, 0x61, 0x78, 0x6D, 0x6E, 0xAD, 0x66, 0x6C, 0x67, 0xB3, 0x45, + 0x8F, 0xF8, 0xFD, 0x1E, 0xAA, 0x7A, 0x13, 0x0C, 0x35, 0x1A, 0x9F, 0x69, + 0x5E, 0x13, 0x8A, 0xB5, 0xE7, 0x17, 0x58, 0x7A, 0xF5, 0xB3, 0x06, 0x48, + 0x16, 0x55, 0xDC, 0xD8, 0xB7, 0x70, 0x3D, 0xB1, 0x04, 0x13, 0xA1, 0x21, + 0x60, 0xF2, 0x15, 0xA8, 0x09, 0x2A, 0xD2, 0xBC, 0x67, 0xAD, 0x23, 0x01, + 0x8E, 0x91, 0xE2, 0x4C, 0x73, 0x41, 0xA4, 0x29, 0x9A, 0x09, 0xFD, 0xC6, + 0x8C, 0xC2, 0x0D, 0x62, 0xFE, 0x70, 0x53, 0x8B, 0x72, 0x07, 0x26, 0x73, + 0xC1, 0xED, 0x07, 0xE0, 0xD3, 0x02, 0x9C, 0x10, 0x30, 0x83, 0x83, 0x50, + 0xDA, 0x11, 0x36, 0x8B, 0x22, 0xE6, 0xF3, 0x90, 0xDE, 0x90, 0x87, 0x6F, + 0x10, 0x41, 0x3B, 0x6E, 0x41, 0x87, 0x0A, 0x56, 0x27, 0x95, 0xCA, 0xFE, + 0xC8, 0xE0, 0x15, 0xD2, 0xEE, 0xB8, 0xBF, 0x35, 0x4F, 0x8B, 0xF3, 0xBA, + 0x37, 0x6F, 0x16, 0x61, 0x80, 0x7E, 0x95, 0x50, 0x27, 0x7A, 0x46, 0x0F, + 0xBF, 0xDC, 0x74, 0xB1, 0x73, 0xE0, 0x50, 0x86, 0x6F, 0x92, 0xB6, 0x41, + 0x5B, 0x2E, 0xE1, 0xCA, 0x8E, 0xDB, 0x8E, 0xEC, 0xD1, 0x8C, 0xF4, 0x74, + 0x7C, 0x9C, 0x1E, 0x24, 0x60, 0xF4, 0xD3, 0x5B, 0xA0, 0x3B, 0xE2, 0x5B, + 0x17, 0xBB, 0x7D, 0x97, 0x57, 0x2A, 0x09, 0x9A, 0x1D, 0x5C, 0x02, 0x63, + 0x4A, 0xC0, 0x0E, 0xA1, 0xA0, 0x96, 0xE5, 0x4D, 0x6D, 0x91, 0x3C, 0x69, + 0x59, 0x80, 0x41, 0x7D, 0xF7, 0x53, 0x93, 0x52, 0x58, 0xF9, 0x11, 0x33, + 0xFF, 0xDB, 0x7F, 0x26, 0x5E, 0x90, 0x5B, 0xB5, 0x42, 0x16, 0xE0, 0x05, + 0x4E, 0x5B, 0x23, 0xAE, 0x35, 0x7D, 0x95, 0x79, 0x4C, 0xD1, 0x77, 0x47, + 0x77, 0x9B, 0x63, 0xED, 0x86, 0x6E, 0x6F, 0x76, 0x54, 0x7C, 0x4A, 0x9D, + 0x0F, 0xAE, 0xE7, 0x41, 0xBD, 0x20, 0x1F, 0x04, 0xF4, 0xA8, 0x90, 0x48, + 0xF7, 0x59, 0xF7, 0x14, 0xCF, 0x1D, 0x18, 0xE5, 0x54, 0x25, 0x4D, 0x87, + 0xE4, 0x61, 0x84, 0x7B, 0xB5, 0xCB, 0xF5, 0x70, 0x78, 0x80, 0xF1, 0x52, + 0x89, 0x2D, 0xEA, 0x72, 0xB3, 0xE7, 0x7D, 0x24, 0x59, 0xB7, 0x22, 0x49, + 0x9F, 0xDA, 0x7D, 0x81, 0x86, 0xAB, 0xD3, 0x80, 0x18, 0x55, 0xF5, 0x21, + 0xC6, 0xE4, 0x9E, 0xE5, 0xBB, 0x12, 0x8D, 0x3E, 0xD1, 0xEE, 0x33, 0x56, + 0xCF, 0x24, 0x37, 0x65, 0x73, 0x41, 0x63, 0xDD, 0x21, 0x4C, 0x85, 0xA3, + 0xB1, 0x74, 0x67, 0xFC, 0x60, 0xC9, 0x14, 0x0D, 0x4F, 0x31, 0x15, 0x87, + 0x70, 0xEA, 0x18, 0x9C, 0xE9, 0x13, 0x09, 0x6A, 0xC5, 0xE2, 0x01, 0x08, + 0xF3, 0x2A, 0xE0, 0x28, 0x42, 0x1B, 0x80, 0x30, 0xC3, 0x87, 0xF8, 0x31, + 0xBC, 0x0C, 0xC7, 0xBA, 0x61, 0x77, 0x85, 0xC7, 0x9B, 0x56, 0x29, 0x48, + 0xCF, 0x65, 0x18, 0x05, 0x2F, 0x8E, 0x23, 0x3D, 0xA3, 0x34, 0xB2, 0x17, + 0xAB, 0x42, 0xE6, 0x88, 0x8C, 0x96, 0xB5, 0x5F, 0x44, 0x20, 0x47, 0xAB, + 0x1F, 0x02, 0xE3, 0xDF, 0xF2, 0xEF, 0xBE, 0x5A, 0xA8, 0x87, 0x98, 0x57, + 0xCE, 0x73, 0x75, 0xAE, 0xA1, 0x51, 0x16, 0xEC, 0x5A, 0x0F, 0xFA, 0xF0, + 0xC6, 0x80, 0xFE, 0x7F, 0xE4, 0x3B, 0x02, 0x27, 0x9D, 0x75, 0xE3, 0x41, + 0x8C, 0x5C, 0x5B, 0x20, 0x40, 0x22, 0xBF, 0x09, 0x79, 0x63, 0xB4, 0xDC, + 0x06, 0x44, 0xE4, 0x5B, 0x09, 0x58, 0xC9, 0x51, 0x38, 0x9D, 0x07, 0x10, + 0x98, 0x75, 0x6A, 0x3B, 0x87, 0x00, 0x76, 0x9D, 0x6C, 0xE9, 0xB0, 0x94, + 0x1E, 0x50, 0x48, 0x26, 0x5E, 0xFB, 0x2D, 0x10, 0x54, 0x8E, 0xA2, 0x50, + 0x03, 0xC6, 0x78, 0x55, 0x86, 0x4E, 0xD4, 0x4B, 0xFC, 0x15, 0x61, 0x4C, + 0x72, 0xFB, 0xCE, 0x21, 0xC5, 0x89, 0x23, 0x00, 0x16, 0x63, 0x73, 0xAD, + 0xB0, 0xE1, 0x94, 0x36, 0x43, 0xFE, 0xA4, 0x37, 0x34, 0x3F, 0xE2, 0xB9, + 0x75, 0x2D, 0x95, 0x72, 0x2C, 0xC8, 0x8A, 0xC5, 0x4B, 0x03, 0x8C, 0xA4, + 0xE8, 0x79, 0x15, 0x38, 0x24, 0x8D, 0x92, 0x0B, 0x91, 0xA4, 0xF3, 0x94, + 0x58, 0x35, 0xD6, 0x6D, 0x14, 0x3E, 0x78, 0x4E, 0x17, 0x21, 0x80, 0x5D, + 0x95, 0xF0, 0x73, 0x7E, 0xA2, 0xDA, 0x3D, 0xD4, 0x33, 0xF4, 0x0A, 0x80, + 0x4A, 0x5C, 0x83, 0x91, 0x6E, 0xE7, 0x13, 0x73, 0x26, 0x94, 0x17, 0xD4, + 0x13, 0xBD, 0x8B, 0x74, 0x25, 0x06, 0x34, 0xA8, 0x98, 0x99, 0x94, 0x1F, + 0xC7, 0xDC, 0x3F, 0x36, 0xF8, 0x24, 0x57, 0x1E, 0xB7, 0x9D, 0x29, 0xA4, + 0xB6, 0x27, 0x1B, 0x31, 0xF3, 0x21, 0x80, 0x60, 0x51, 0xF1, 0x66, 0x10, + 0xBD, 0x15, 0xF5, 0xBB, 0x47, 0x50, 0xCD, 0xC7, 0xEC, 0x05, 0x48, 0xCB, + 0x84, 0x70, 0xB0, 0x58, 0x5F, 0x53, 0x2A, 0x2B, 0x02, 0x42, 0x5C, 0x78, + 0x1C, 0x7C, 0x56, 0xA2, 0xF2, 0x4B, 0xA0, 0x94, 0x8A, 0x84, 0xB0, 0x2D, + 0x9B, 0xF5, 0xA8, 0xC2, 0xE2, 0xE3, 0x20, 0xC5, 0xAE, 0xD6, 0x4F, 0x17, + 0xDF, 0x52, 0x47, 0x8E, 0x6F, 0x6D, 0x41, 0xDB, 0x59, 0xF0, 0xC5, 0x9D, + 0x6D, 0xBD, 0xA0, 0xC9, 0x9D, 0x72, 0x2D, 0x2E, 0x51, 0x10, 0xAC, 0x37, + 0x01, 0xA7, 0xD7, 0x4E, 0xF3, 0x96, 0xD6, 0x79, 0xFD, 0xA0, 0xC4, 0x3F, + 0x38, 0x68, 0xA4, 0x19, 0x01, 0xE6, 0x0B, 0x96, 0x32, 0xA3, 0x48, 0x8B, + 0x4F, 0x77, 0x56, 0x98, 0xB6, 0x85, 0x73, 0xA9, 0x2B, 0x04, 0xED, 0x2F, + 0x13, 0x6A, 0x32, 0x0C, 0xAB, 0x51, 0x54, 0xBE, 0x0B, 0x7F, 0xBD, 0x93, + 0x4E, 0xB1, 0xBB, 0xA9, 0xA8, 0xD4, 0x53, 0x64, 0x83, 0x49, 0x63, 0x64, + 0x5B, 0xD7, 0xB5, 0x02, 0xDD, 0x13, 0x3F, 0xFD, 0x64, 0xF5, 0xC3, 0x18, + 0x97, 0xC7, 0xCF, 0x96, 0x11, 0x63, 0xB3, 0x20, 0x15, 0x81, 0x3D, 0x9A, + 0x52, 0x99, 0xF2, 0xBE, 0x76, 0xD1, 0x1F, 0xF6, 0x0E, 0xD3, 0x7C, 0x55, + 0x42, 0x55, 0x94, 0x5E, 0x10, 0x96, 0x37, 0x4C, 0x2E, 0xAC, 0x9E, 0x30, + 0x40, 0xB9, 0xD0, 0xFC, 0x81, 0xA2, 0x87, 0x34, 0x74, 0x82, 0xA2, 0x88, + 0xDD, 0x30, 0x4D, 0x50, 0xA6, 0x0E, 0x0C, 0x50, 0x0C, 0xB7, 0xB6, 0xC2, + 0x33, 0x7D, 0x73, 0x8C, 0x66, 0x90, 0xC2, 0x42, 0x87, 0x35, 0xD5, 0x4D, + 0xB7, 0xEE, 0x1D, 0x0D, 0xB4, 0xFC, 0xD4, 0x3B, 0xD9, 0xA7, 0xF1, 0x2D, + 0x02, 0x16, 0x89, 0x1B, 0x32, 0xB2, 0x4D, 0x38, 0x61, 0x6C, 0xD3, 0x3B, + 0x53, 0xBF, 0x1E, 0x46, 0xA8, 0x6B, 0x1A, 0x83, 0xB8, 0x3A, 0x2C, 0xCD, + 0x6E, 0xBF, 0xBB, 0xDD, 0x42, 0x71, 0xB9, 0x71, 0x93, 0x4C, 0x3B, 0x24, + 0x3B, 0xBD, 0x6A, 0x78, 0x93, 0x42, 0x6B, 0x5A, 0x24, 0xCF, 0x41, 0x10, + 0xAD, 0x05, 0x3B, 0x7E, 0x90, 0x2C, 0xA7, 0x9C, 0x6B, 0xB5, 0xE0, 0x5E, + 0xB5, 0xA0, 0x3C, 0xCB, 0xD0, 0xCB, 0x48, 0x75, 0xE3, 0x17, 0x86, 0x42, + 0x5A, 0xF7, 0x2E, 0x4C, 0x6C, 0xF2, 0x21, 0x37, 0xEE, 0xB4, 0xE5, 0x30, + 0x6B, 0xA1, 0x4B, 0x31, 0xDB, 0x8C, 0x86, 0xF9, 0x5C, 0xDA, 0xDA, 0x44, + 0x95, 0xEA, 0x26, 0x96, 0xD6, 0x26, 0xAE, 0x23, 0x11, 0xEB, 0x21, 0x34, + 0xFF, 0xB2, 0x8C, 0x9E, 0x9B, 0xBD, 0x27, 0xFB, 0x09, 0x0F, 0xE3, 0x50, + 0x73, 0x8E, 0xAC, 0xE0, 0x05, 0x22, 0x20, 0xD5, 0xF7, 0x4E, 0x72, 0xD0, + 0x4E, 0xF7, 0xC5, 0xC9, 0xE7, 0x25, 0x7F, 0xF9, 0x91, 0x19, 0x68, 0x03, + 0x17, 0x04, 0xD2, 0xBA, 0x4D, 0x94, 0xAF, 0x95, 0xBC, 0x81, 0x57, 0xB6, + 0xD9, 0x56, 0x8F, 0x67, 0x40, 0x24, 0x6D, 0xEC, 0xD5, 0xD1, 0x1E, 0x2E, + 0xFC, 0xE8, 0xBA, 0xAB, 0x80, 0x63, 0x35, 0xC3, 0x38, 0x18, 0x98, 0x71, + 0x55, 0xA7, 0xC8, 0x09, 0xAE, 0xA3, 0xA3, 0x37, 0xA3, 0x96, 0xCE, 0x8F, + 0x0F, 0x12, 0x53, 0xF5, 0x8E, 0x02, 0xB1, 0xBC, 0x56, 0x1E, 0x67, 0x71, + 0xFE, 0xAB, 0xF0, 0x04, 0x5B, 0x87, 0x93, 0x92, 0xB2, 0xAC, 0x47, 0xB6, + 0xEF, 0xBD, 0x55, 0x1D, 0x30, 0xCB, 0xA6, 0x60, 0x13, 0x13, 0xFE, 0x82, + 0x4E, 0x06, 0xA8, 0xAB, 0x2B, 0x40, 0x2E, 0x7C, 0x66, 0x8F, 0xCC, 0x40, + 0x36, 0x20, 0xE9, 0xAF, 0xC6, 0x3A, 0xE2, 0xE2, 0xFE, 0x01, 0x97, 0x7E, + 0xCA, 0x82, 0x20, 0x58, 0x5E, 0xB5, 0x10, 0xE1, 0x99, 0xE3, 0x4F, 0x82, + 0xE3, 0x4D, 0x35, 0xB6, 0x7B, 0x28, 0x37, 0x02, 0x26, 0x00, 0xA1, 0x6C, + 0x7B, 0xA1, 0x48, 0x4F, 0xCB, 0x55, 0x25, 0xB8, 0x6B, 0xDD, 0xB1, 0xAE, + 0xA0, 0xD3, 0xA1, 0x8B, 0x84, 0x9E, 0xF2, 0xB8, 0x53, 0xDC, 0xE0, 0xE4, + 0x6C, 0x5C, 0x63, 0xA8, 0xD7, 0x4F, 0x1C, 0xB6, 0x73, 0xF9, 0x50, 0xA7, + 0x99, 0x30, 0x42, 0x3E, 0x60, 0x49, 0x6A, 0x7F, 0x6F, 0x0A, 0x83, 0xAD, + 0x99, 0x90, 0x00, 0xC3, 0x5A, 0xFD, 0x83, 0xDA, 0xDE, 0x0A, 0x37, 0xC0, + 0x7F, 0xC6, 0x96, 0x61, 0x9A, 0xF8, 0xBF, 0xBF, 0x45, 0x33, 0x3C, 0x17, + 0x48, 0x7B, 0x54, 0xB8, 0x38, 0xAD, 0x88, 0xD7, 0x7C, 0x1B, 0x08, 0x04, + 0xA9, 0x88, 0xDD, 0x1A, 0x7B, 0x53, 0xEF, 0x8F, 0x49, 0xBC, 0xBC, 0x64, + 0x98, 0x17, 0xA0, 0xB2, 0xAE, 0x63, 0x5B, 0x33, 0xE3, 0xED, 0x93, 0x88, + 0x5D, 0xB9, 0x3F, 0xF2, 0x8A, 0xD3, 0x38, 0xD9, 0xD6, 0xC9, 0xFE, 0x13, + 0x92, 0x3B, 0xF0, 0xA5, 0xE4, 0x1A, 0x09, 0x28, 0x70, 0x27, 0x1A, 0xB5, + 0x99, 0xBA, 0x39, 0x2A, 0xBA, 0x8E, 0xAE, 0x79, 0x6A, 0x21, 0xF7, 0xB7, + 0x7D, 0x16, 0x34, 0xA4, 0x5D, 0x0E, 0x97, 0xF5, 0xFC, 0x1A, 0x88, 0xEE, + 0x4A, 0x9E, 0xB9, 0x64, 0x2B, 0xFF, 0x89, 0xC2, 0x45, 0x34, 0xE7, 0xC4, + 0xE0, 0xFC, 0x9E, 0xF8, 0xF6, 0x89, 0x5E, 0x68, 0x53, 0xEC, 0xF0, 0x98, + 0x63, 0x5E, 0x53, 0xA0, 0xBE, 0x42, 0x8E, 0xD9, 0x70, 0x5D, 0x3C, 0xC5, + 0x11, 0x11, 0x20, 0xC1, 0x9B, 0xF4, 0x6E, 0x61, 0x63, 0x4A, 0xB3, 0xE7, + 0x5F, 0x91, 0xC9, 0x2C, 0xFF, 0x1E, 0xCE, 0x25, 0xFE, 0x26, 0x6A, 0xA4, + 0x06, 0xE3, 0x30, 0xCF, 0xFC, 0x9D, 0xE8, 0x0D, 0xFD, 0x41, 0xC6, 0x9F, + 0x20, 0x2E, 0xB0, 0x24, 0x9B, 0xA1, 0xB2, 0x30, 0x75, 0x3F, 0xFC, 0x33, + 0x68, 0x8E, 0x97, 0x33, 0xE5, 0xFE, 0xF8, 0xEC, 0x28, 0xAC, 0xD4, 0x52, + 0xA5, 0x97, 0x23, 0x9B, 0x89, 0xDF, 0x42, 0x38, 0xA2, 0xD9, 0x38, 0x7C, + 0x59, 0x58, 0x78, 0x2D, 0x64, 0x3E, 0xAC, 0xA4, 0x2F, 0x30, 0x55, 0xD2, + 0xE3, 0x4C, 0x4E, 0xA5, 0xEC, 0x4E, 0x5A, 0xF9, 0xAA, 0xB6, 0xB9, 0xBA, + 0xFA, 0x23, 0x41, 0x9D, 0xCA, 0x54, 0xDA, 0x90, 0xDD, 0xC4, 0x68, 0x16, + 0x2E, 0x4F, 0xB5, 0xDC, 0x9A, 0x25, 0xBF, 0x8B, 0xC0, 0x79, 0x0D, 0xCF, + 0xB7, 0xBE, 0xDE, 0x95, 0x59, 0xF0, 0x28, 0x8A, 0x14, 0xD9, 0x90, 0x66, + 0xAA, 0xEB, 0x5F, 0x64, 0x61, 0xD1, 0x7E, 0x4C, 0x45, 0x8E, 0x98, 0x11, + 0x7A, 0x84, 0x81, 0x0A, 0xD2, 0xBA, 0x5D, 0x72, 0x09, 0xA0, 0x05, 0x1E, + 0x16, 0xD4, 0x4A, 0x91, 0xEE, 0xD8, 0x4A, 0x06, 0x4B, 0x5C, 0xEC, 0x79, + 0x28, 0xA3, 0xB3, 0x81, 0x4C, 0x90, 0xF1, 0xB2, 0x29, 0x02, 0x2B, 0xF2, + 0x44, 0x9F, 0xD9, 0x6D, 0x66, 0x33, 0x78, 0x73, 0x23, 0x5D, 0x26, 0x2C, + 0x86, 0x43, 0x9E, 0x69, 0x0A, 0x97, 0x01, 0x8F, 0x64, 0xDA, 0xF9, 0xCC, + 0xC7, 0xA0, 0x59, 0xF0, 0x60, 0xD9, 0x46, 0xAA, 0x77, 0x9F, 0xFC, 0xF3, + 0xBA, 0x66, 0xD4, 0xBE, 0x69, 0x9B, 0xAE, 0x3C, 0xB6, 0x57, 0x8A, 0x30, + 0x53, 0xEC, 0xC6, 0xF8, 0x14, 0x76, 0x84, 0x76, 0x7F, 0x53, 0xA8, 0x14, + 0x8A, 0x55, 0xAE, 0x89, 0xE8, 0x4D, 0x8C, 0x69, 0xC2, 0x56, 0xB7, 0x64, + 0x2A, 0x57, 0x9A, 0x76, 0xC5, 0x77, 0x8A, 0xC8, 0x01, 0x29, 0xB6, 0xB2, + 0xA9, 0x50, 0x43, 0xCD, 0x22, 0xD0, 0xE8, 0xDE, 0x6B, 0xB9, 0x87, 0x18, + 0x70, 0xEF, 0xCB, 0x72, 0xAA, 0x18, 0xB6, 0x42, 0xCE, 0xBD, 0xC4, 0x34, + 0x7C, 0x6E, 0xA7, 0x6F, 0x63, 0x29, 0x16, 0x97, 0x3A, 0x19, 0x11, 0xEF, + 0xB6, 0x47, 0xF0, 0x01, 0xAA, 0x25, 0x4A, 0x50, 0x67, 0xCC, 0x60, 0xF2, + 0x36, 0x06, 0x85, 0x7A, 0x99, 0x50, 0x11, 0x24, 0xDD, 0xA5, 0xC1, 0x1A, + 0xA6, 0x76, 0x62, 0xBB, 0xB6, 0x34, 0xB8, 0x90, 0x37, 0x35, 0xAA, 0x96, + 0xF3, 0xC5, 0xA2, 0x5E, 0x5D, 0x4F, 0x9C, 0x9F, 0x95, 0x99, 0xEF, 0xDE, + 0xCC, 0x89, 0xC5, 0x2E, 0x73, 0xC7, 0xF7, 0xAC, 0xFB, 0x87, 0x95, 0xFE, + 0x20, 0x99, 0x2B, 0x62, 0x5D, 0xDC, 0x61, 0x3B, 0x10, 0x7A, 0x5C, 0xF5, + 0x09, 0xCB, 0xE0, 0xB1, 0x41, 0xB0, 0x7A, 0x90, 0x49, 0x65, 0x2D, 0x3F, + 0x7D, 0x10, 0x6C, 0xDD, 0x5F, 0x04, 0x21, 0x70, 0xCA, 0x13, 0x42, 0x2B, + 0x71, 0x30, 0xE9, 0x40, 0x80, 0xB4, 0xDD, 0xBF, 0xDF, 0x0D, 0x11, 0x21, + 0xC1, 0xE4, 0x51, 0xC8, 0x48, 0xAC, 0x37, 0xD3, 0xDE, 0x32, 0xBE, 0xCF, + 0x61, 0xF6, 0x8A, 0xEB, 0x8C, 0xE1, 0xF7, 0x1D, 0xCD, 0xAA, 0x24, 0x68, + 0x4C, 0xA1, 0x33, 0x8A, 0x0B, 0xA5, 0xA4, 0xC6, 0x94, 0xCD, 0x1E, 0x07, + 0x62, 0xB9, 0x3B, 0x3E, 0xD6, 0x13, 0x6F, 0x54, 0xD9, 0x93, 0x02, 0xD9, + 0x1E, 0x72, 0x9C, 0x6C, 0xC9, 0x97, 0xEF, 0xB6, 0x96, 0xDA, 0x93, 0x7E, + 0x8D, 0x4F, 0x88, 0x0B, 0xA4, 0x7E, 0xF9, 0x0A, 0x7E, 0xD3, 0x2D, 0x8D, + 0x15, 0xCA, 0xC4, 0x14, 0xDC, 0x0E, 0x1B, 0x93, 0x02, 0xC5, 0x7E, 0x31, + 0xC8, 0xCC, 0x59, 0x92, 0x9F, 0x66, 0x43, 0xA5, 0x51, 0xFA, 0x76, 0x92, + 0xDE, 0x20, 0xCF, 0x5D, 0x28, 0xAA, 0x4E, 0x80, 0x61, 0x6D, 0xE2, 0x3C, + 0xD3, 0xAE, 0x55, 0xEC, 0xD1, 0xC2, 0x30, 0xEA, 0xE3, 0xD7, 0x9D, 0xCE, + 0x01, 0x64, 0xD4, 0x85, 0x95, 0xC0, 0x91, 0xBD, 0xB7, 0xAF, 0x78, 0xDB, + 0xAC, 0x3C, 0xCF, 0x18, 0xE3, 0x07, 0x6C, 0xD4, 0x85, 0xD9, 0x04, 0xF5, + 0xFA, 0x43, 0x1C, 0x27, 0x85, 0x1A, 0xF1, 0x86, 0xE5, 0xEE, 0x36, 0x83, + 0x18, 0xE4, 0x40, 0x88, 0x67, 0xA4, 0xF9, 0x0E, 0x2C, 0x6F, 0xA9, 0xB2, + 0xD8, 0x58, 0x89, 0xC1, 0xF5, 0x5C, 0xC0, 0x79, 0xDB, 0xF0, 0xA3, 0x92, + 0xED, 0xBB, 0x7F, 0x76, 0xEE, 0x7D, 0x60, 0x5D, 0x05, 0xB5, 0xBA, 0x4C, + 0x6A, 0x58, 0x8A, 0xBD, 0xF3, 0x69, 0x68, 0x4F, 0xDE, 0xE3, 0x7F, 0xF2, + 0x05, 0x42, 0xC6, 0xDC, 0x7D, 0x04, 0x48, 0x3B, 0x1F, 0x99, 0x7E, 0x6C, + 0x1E, 0x91, 0x86, 0xC8, 0xDF, 0x10, 0x92, 0x3F, 0xBD, 0xC3, 0x43, 0x39, + 0xE3, 0xC1, 0x30, 0x7B, 0xBD, 0x02, 0x1F, 0x16, 0xEF, 0x72, 0x07, 0x99, + 0xB1, 0x3B, 0x6A, 0x2C, 0xBE, 0x41, 0x38, 0xC6, 0xBF, 0xA0, 0xA4, 0xF4, + 0xFF, 0x65, 0x4D, 0xF0, 0x76, 0xF2, 0x2F, 0x02, 0x87, 0x02, 0x13, 0xFD, + 0x19, 0xC6, 0x4F, 0x6B, 0x57, 0x45, 0xCE, 0xDE, 0xEC, 0x24, 0x9E, 0x29, + 0x0D, 0x9C, 0xF4, 0x16, 0x7A, 0x13, 0x33, 0xB9, 0x1C, 0x9E, 0xC1, 0x6B, + 0xE3, 0xAD, 0xFD, 0x06, 0x52, 0xDF, 0x8B, 0xAE, 0x35, 0xA6, 0x1B, 0xE7, + 0x93, 0x24, 0xB5, 0x5F, 0xD1, 0x77, 0xD5, 0x3E, 0xC4, 0x9F, 0x2F, 0x8A, + 0x5C, 0x1C, 0x35, 0xAE, 0x08, 0xBE, 0x22, 0x10, 0x54, 0xDD, 0x6C, 0xC4, + 0x1A, 0xDD, 0xD1, 0x04, 0x16, 0x04, 0x3D, 0x7B, 0x65, 0x92, 0xAC, 0x4B, + 0x51, 0x51, 0x12, 0x96, 0xAB, 0x10, 0x05, 0x78, 0xD8, 0x77, 0x6D, 0x46, + 0x3A, 0x50, 0x3B, 0xB8, 0xB9, 0xF5, 0x64, 0x13, 0xDA, 0xAD, 0x17, 0x2A, + 0xD5, 0xAA, 0x40, 0x56, 0x7F, 0xC5, 0xF4, 0x73, 0xE5, 0xFC, 0x77, 0x96, + 0xFD, 0xC5, 0x96, 0xCE, 0x68, 0x2C, 0x95, 0xDB, 0x0B, 0x98, 0xAC, 0x99, + 0x3F, 0xF9, 0x22, 0x3D, 0xA2, 0xDC, 0x59, 0x30, 0xBF, 0x40, 0x1F, 0x73, + 0xB9, 0xBA, 0xE3, 0x09, 0xF2, 0xDD, 0x51, 0x97, 0x46, 0x2E, 0xB5, 0x1E, + 0xA3, 0x4D, 0x62, 0x9F, 0x20, 0xCA, 0xF5, 0xC3, 0xF5, 0x14, 0xC4, 0xD5, + 0x5C, 0x06, 0x9A, 0xD7, 0x9B, 0x93, 0xD3, 0x0B, 0xA4, 0xDE, 0xCD, 0xAA, + 0xBC, 0xFA, 0x91, 0xD8, 0xF5, 0xA2, 0xC1, 0x31, 0xCD, 0x16, 0xE3, 0x5C, + 0xFB, 0x33, 0x4C, 0x33, 0x02, 0xD1, 0x17, 0x69, 0x29, 0xE1, 0x94, 0x97, + 0xC9, 0x6C, 0x0F, 0x73, 0x5D, 0xCE, 0xBC, 0xF1, 0x76, 0xCE, 0x22, 0xBC, + 0xB5, 0x11, 0xAF, 0x5D, 0x0F, 0x78, 0x54, 0x2E, 0x45, 0xDB, 0x02, 0x58, + 0x7C, 0xE3, 0x39, 0x99, 0x74, 0x9D, 0x11, 0xFD, 0xF6, 0x87, 0x10, 0x47, + 0xA9, 0xF3, 0x3B, 0x08, 0x6E, 0xBC, 0x0C, 0x8E, 0x54, 0x5E, 0x04, 0x58, + 0xF6, 0xD9, 0x66, 0xEC, 0xD9, 0x11, 0x6D, 0x35, 0xAB, 0xB4, 0xE5, 0xDC, + 0xF0, 0xB6, 0x1E, 0x71, 0xAC, 0x5D, 0x92, 0xC1, 0x5C, 0xB1, 0xC7, 0xD0, + 0x0B, 0x10, 0x6E, 0xE2, 0x32, 0xA6, 0x89, 0x42, 0xAD, 0xA6, 0x5C, 0xBA, + 0xAD, 0xB2, 0x0F, 0x47, 0x8C, 0xEF, 0xDD, 0x88, 0xEA, 0x04, 0x70, 0xB5, + 0xFA, 0xD7, 0x22, 0x78, 0xD8, 0xCB, 0x20, 0xDD, 0xE4, 0xFE, 0x84, 0x68, + 0xFD, 0x86, 0x1E, 0xE3, 0x87, 0x7B, 0x74, 0x61, 0xB2, 0x03, 0xC5, 0xA5, + 0x06, 0xED, 0x4E, 0x87, 0x4E, 0x31, 0x0C, 0x0A, 0x2B, 0x49, 0x25, 0xD1, + 0x33, 0xFF, 0xFE, 0xAC, 0x5E, 0x1F, 0xB2, 0x8D, 0xC0, 0x0D, 0x67, 0xAD, + 0x92, 0x64, 0x12, 0xCD, 0x4C, 0x80, 0x68, 0x8B, 0x91, 0xA3, 0xBD, 0x88, + 0xA6, 0x0F, 0xEC, 0x4D, 0x26, 0x1F, 0xD6, 0xB1, 0x8C, 0x5D, 0x6B, 0x25, + 0x7A, 0x98, 0xA7, 0x30, 0x57, 0x7D, 0x9D, 0x31, 0x8B, 0xE0, 0x61, 0xBC, + 0xA1, 0xB5, 0xB6, 0xD3, 0x21, 0xAF, 0x26, 0x7C, 0x53, 0xC2, 0xFB, 0x3E, + 0x82, 0xEC, 0xB3, 0x17, 0x02, 0x82, 0xD7, 0x00, 0x82, 0x0A, 0x28, 0x4B, + 0xDE, 0x55, 0x8E, 0x9E, 0x42, 0xB5, 0x93, 0xA6, 0x0C, 0x54, 0x09, 0x59, + 0xD0, 0x02, 0x68, 0xBE, 0x00, 0x0C, 0x8F, 0x50, 0x73, 0xE9, 0x19, 0x03, + 0xBB, 0x47, 0x65, 0xDE, 0x85, 0x23, 0x8C, 0xDC, 0xBB, 0x5A, 0xB5, 0x59, + 0xC7, 0xA3, 0x1A, 0xDF, 0x10, 0x1E, 0x2C, 0x10, 0xD7, 0x36, 0xAE, 0x1E, + 0x27, 0x78, 0x4D, 0xEE, 0xE6, 0xC0, 0x30, 0xC3, 0x57, 0x0B, 0x5F, 0xFF, + 0x5A, 0xB1, 0x05, 0x73, 0xF6, 0x4D, 0x1C, 0x3E, 0x18, 0x3F, 0x01, 0x43, + 0x47, 0x23, 0xE2, 0x0F, 0xA9, 0x1C, 0xDE, 0xC5, 0xAA, 0x2B, 0x24, 0xAB, + 0x8F, 0xE0, 0xEC, 0x3A, 0x57, 0xBD, 0xBD, 0x47, 0xF4, 0x86, 0x53, 0x7A, + 0xC3, 0x32, 0x20, 0x78, 0x3E, 0x0A, 0xDB, 0xBD, 0x33, 0xA4, 0x62, 0x57, + 0x55, 0x5B, 0xB3, 0x33, 0x48, 0x2E, 0x24, 0xCD, 0x54, 0xB9, 0xD6, 0x7B, + 0x73, 0x51, 0xDB, 0x45, 0xC5, 0x91, 0xDF, 0x49, 0xC0, 0x83, 0x22, 0x2C, + 0x08, 0x9A, 0xE7, 0x24, 0x31, 0xEF, 0xDA, 0x7E, 0x54, 0xE1, 0xAF, 0x43, + 0xB3, 0xBB, 0x57, 0x79, 0x4A, 0x07, 0xCC, 0x50, 0x6D, 0x2F, 0x32, 0x46, + 0x00, 0xE0, 0xCA, 0x4A, 0xE6, 0x2C, 0xE6, 0xCD, 0x41, 0x23, 0xE3, 0xB9, + 0x2F, 0x6A, 0x9B, 0xB7, 0xDE, 0x17, 0x50, 0xEA, 0x38, 0x58, 0x97, 0x40, + 0x34, 0x4A, 0x9A, 0x57, 0x5E, 0x68, 0x1A, 0xA3, 0xF9, 0x53, 0xB3, 0xC3, + 0x5F, 0xC5, 0x20, 0x37, 0xC9, 0x59, 0xFC, 0xE4, 0xFC, 0x3F, 0xD4, 0x5B, + 0xBA, 0xF8, 0xB4, 0xAD, 0x50, 0x65, 0xAE, 0xDC, 0x5D, 0xE6, 0xF9, 0x95, + 0xF2, 0xAC, 0x41, 0xC2, 0x96, 0x0F, 0x3F, 0x1F, 0xE3, 0x33, 0x7A, 0x0B, + 0x13, 0x2D, 0x68, 0x34, 0xAA, 0x23, 0x5B, 0xC9, 0x81, 0x9D, 0xD1, 0x97, + 0x4A, 0x5A, 0x55, 0xD6, 0xF9, 0xCE, 0x7F, 0xA2, 0x05, 0x00, 0x63, 0xF8, + 0xF8, 0xE2, 0xD4, 0x43, 0x2B, 0x92, 0x63, 0x49, 0x3B, 0xE0, 0x05, 0x60, + 0xBA, 0x29, 0x1F, 0x20, 0x09, 0x3E, 0xB9, 0x56, 0xF8, 0x8D, 0xBC, 0x23, + 0xAA, 0xC8, 0xDB, 0xAE, 0xF7, 0xED, 0x15, 0x6E, 0xFE, 0xA8, 0xBA, 0xFC, + 0xD5, 0x5B, 0x85, 0xCC, 0x78, 0xC6, 0x50, 0xA1, 0x96, 0xE8, 0x0D, 0x56, + 0xBD, 0x45, 0x35, 0xFB, 0xF3, 0xF0, 0x1F, 0x87, 0x90, 0xD8, 0x1B, 0x49, + 0x3B, 0x8B, 0xB6, 0x44, 0xF5, 0x08, 0xA7, 0xCB, 0xE6, 0x29, 0x72, 0x01, + 0xC5, 0x73, 0x07, 0xD3, 0x6F, 0x8A, 0x08, 0xBC, 0x35, 0x07, 0x7B, 0xE8, + 0x3F, 0x85, 0xE4, 0x63, 0x23, 0xF2, 0x99, 0x99, 0x52, 0x6D, 0x4F, 0xEC, + 0xAE, 0x92, 0x8A, 0xB1, 0x5D, 0x62, 0x20, 0xFE, 0xC6, 0x8B, 0x5B, 0xA1, + 0xD9, 0x21, 0x1E, 0xB5, 0x26, 0x6C, 0x53, 0x92, 0x9C, 0x82, 0x66, 0xCD, + 0xA0, 0x2E, 0xD2, 0x72, 0xE2, 0xEB, 0xB1, 0x21, 0xCD, 0xC6, 0xC2, 0xB0, + 0xB8, 0x13, 0x96, 0x1B, 0xF3, 0x5E, 0xF8, 0x46, 0xA2, 0xA7, 0x73, 0xFB, + 0x67, 0xCB, 0x5E, 0x24, 0x1E, 0x1A, 0x40, 0xA2, 0x96, 0x9E, 0x72, 0x44, + 0x3F, 0xFA, 0x4C, 0x03, 0x9B, 0x2B, 0x0E, 0x44, 0xDB, 0x0F, 0x2F, 0x55, + 0x82, 0xAF, 0x08, 0x27, 0x85, 0xFB, 0xFE, 0x55, 0x08, 0x28, 0x85, 0x04, + 0x92, 0x0D, 0xC7, 0x25, 0x48, 0x2C, 0x2A, 0x49, 0x31, 0x52, 0x65, 0xB4, + 0xB4, 0xF2, 0xC0, 0xD2, 0x64, 0x0C, 0xB0, 0xEB, 0xC3, 0x6F, 0x11, 0xF6, + 0xB3, 0x8B, 0xB1, 0xA8, 0x1F, 0xB2, 0x69, 0x46, 0x7E, 0x15, 0xFE, 0xCC, + 0xE2, 0x1A, 0xF9, 0x1F, 0x7B, 0x65, 0xDD, 0xA6, 0xD9, 0x10, 0x03, 0xD5, + 0x37, 0x8C, 0x25, 0x41, 0x0B, 0xFF, 0xFF, 0xF8, 0x46, 0xCE, 0x8A, 0x7A, + 0x9F, 0x74, 0x61, 0xD8, 0xD4, 0x64, 0xE6, 0xF1, 0x46, 0xC6, 0x04, 0xC0, + 0xEA, 0xDB, 0x10, 0x40, 0x6B, 0x9B, 0xD0, 0xC1, 0x45, 0x83, 0x1C, 0x74, + 0xA8, 0x3B, 0x5F, 0xC9, 0x45, 0x69, 0x70, 0x90, 0xBD, 0x93, 0x79, 0x82, + 0x71, 0x96, 0x75, 0x23, 0x01, 0x9A, 0x3B, 0x0E, 0xCA, 0x7D, 0xDE, 0x66, + 0x49, 0x57, 0x11, 0xB2, 0xBF, 0xB4, 0x7E, 0x33, 0xEB, 0xA4, 0x4E, 0xE0, + 0x33, 0xCC, 0x44, 0x6F, 0x89, 0xEC, 0xD0, 0x7D, 0x75, 0x79, 0x41, 0x96, + 0x37, 0x9D, 0x5A, 0x82, 0x7A, 0xAA, 0xE8, 0x1A, 0x43, 0xA3, 0xE8, 0x1A, + 0x24, 0x14, 0x29, 0x84, 0xE0, 0x2E, 0xD0, 0x7F, 0xAC, 0x35, 0x52, 0xF2, + 0xE5, 0xD5, 0xA9, 0x7B, 0x9F, 0x55, 0xF3, 0xF1, 0xCB, 0x31, 0x3C, 0xDF, + 0x22, 0x4A, 0x1A, 0x47, 0xB7, 0x5E, 0x3A, 0x8C, 0x1A, 0xF2, 0xE7, 0x0C, + 0x9A, 0xC8, 0xE4, 0xF9, 0xF9, 0x30, 0xC7, 0x00, 0x9F, 0x57, 0xEF, 0x67, + 0xB4, 0x36, 0x0A, 0xF9, 0xB4, 0x3F, 0xE6, 0x20, 0x66, 0x36, 0x88, 0x60, + 0x19, 0x74, 0x8B, 0x29, 0x55, 0x64, 0xF2, 0x6C, 0x9D, 0x3B, 0xF4, 0xE9, + 0xC8, 0x74, 0x48, 0x48, 0xCA, 0x56, 0xFF, 0x74, 0xE7, 0x39, 0x98, 0xD9, + 0x1D, 0xCE, 0x22, 0x98, 0x35, 0xB6, 0xF5, 0xA8, 0x70, 0x51, 0xA8, 0x53, + 0x6C, 0xEB, 0xB7, 0x99, 0xDF, 0x97, 0x34, 0x3C, 0x51, 0x74, 0x4E, 0x1E, + 0xB9, 0xF4, 0x11, 0xB6, 0x3B, 0xAC, 0x5F, 0x32, 0xA3, 0xB8, 0x3E, 0xB3, + 0x78, 0x45, 0xEB, 0x08, 0xB2, 0xAB, 0xA8, 0xD9, 0xBD, 0x32, 0x95, 0xD2, + 0x5C, 0xAE, 0xF2, 0x86, 0x82, 0x1A, 0x53, 0xBB, 0x97, 0xA4, 0x8E, 0x4E, + 0xD4, 0x1B, 0x3D, 0x5B, 0x70, 0x4A, 0xCE, 0x7A, 0x1A, 0xBD, 0xAE, 0xF0, + 0xE4, 0xF2, 0xC0, 0x9D, 0x00, 0xBA, 0xD7, 0xAF, 0xF6, 0x63, 0x7D, 0x7C, + 0xA0, 0x58, 0x29, 0x45, 0xBF, 0x96, 0x8F, 0x5D, 0xE1, 0x79, 0x75, 0x52, + 0x98, 0xBF, 0x8E, 0x2C, 0x9B, 0xAE, 0xA5, 0x1B, 0x2A, 0xB0, 0x8A, 0x89, + 0x25, 0xFE, 0x4D, 0xDA, 0x12, 0xFE, 0xA5, 0x11, 0xC3, 0x72, 0xEB, 0xE5, + 0x91, 0xE0, 0xD8, 0x7E, 0x9B, 0xD1, 0x2D, 0xA5, 0x25, 0x3D, 0x18, 0x53, + 0x68, 0x5C, 0x22, 0x7D, 0x18, 0x0A, 0x12, 0x3D, 0x40, 0x08, 0x40, 0x59, + 0xA6, 0x12, 0x5F, 0x1C, 0x3A, 0xC5, 0xF5, 0xDB, 0xF6, 0x8D, 0x04, 0x90, + 0xF9, 0xB7, 0x43, 0x6D, 0x88, 0x42, 0x0F, 0x5F, 0x97, 0xD0, 0x6E, 0x1B, + 0xA3, 0xED, 0x0E, 0xEA, 0x68, 0xDE, 0x9C, 0x42, 0x91, 0xE3, 0xC2, 0xFC, + 0xB3, 0x06, 0x7F, 0x55, 0x43, 0x07, 0x1B, 0x76, 0xC2, 0x8F, 0xFE, 0x55, + 0xA9, 0x08, 0x83, 0x7F, 0xC5, 0xD9, 0x69, 0xAB, 0x91, 0xCC, 0x68, 0x6C, + 0x7C, 0xCA, 0x45, 0x99, 0x72, 0x15, 0xF1, 0x50, 0x47, 0xC6, 0x10, 0xAD, + 0xB2, 0x91, 0x93, 0xEA, 0x02, 0x57, 0x73, 0x96, 0x91, 0xB3, 0xD1, 0x06, + 0x33, 0x2F, 0x73, 0xB0, 0x9F, 0xB1, 0xC3, 0x44, 0x48, 0x3F, 0xB0, 0x99, + 0xD4, 0xE5, 0x89, 0x03, 0xC6, 0x10, 0x31, 0xBA, 0xD4, 0xD0, 0x93, 0x91, + 0xBC, 0x21, 0xFA, 0xEA, 0x4B, 0xB1, 0x1A, 0x01, 0x88, 0x0C, 0x30, 0x03, + 0x78, 0x8D, 0xF6, 0xF5, 0x99, 0x57, 0x1B, 0x00, 0xBB, 0x08, 0x31, 0x23, + 0xA4, 0xAD, 0x68, 0x59, 0x80, 0xE5, 0x52, 0x59, 0x32, 0xE0, 0xC2, 0x93, + 0x3B, 0x99, 0xC2, 0x0E, 0x03, 0x46, 0x4A, 0x5E, 0x12, 0x24, 0x7F, 0xE8, + 0x35, 0xA5, 0xA3, 0x1A, 0xB6, 0xF6, 0xA5, 0xBE, 0xEA, 0x93, 0x04, 0xFA, + 0x06, 0x0A, 0x9B, 0xEB, 0x0D, 0x9C, 0x52, 0x57, 0xC7, 0x88, 0x59, 0xAF, + 0x2A, 0x72, 0x59, 0x7C, 0xB3, 0xFC, 0x92, 0x1B, 0x6E, 0xE4, 0x76, 0x1F, + 0xD5, 0xFC, 0x4A, 0xF1, 0x2B, 0xEF, 0x64, 0xF8, 0x48, 0x17, 0x43, 0x7E, + 0x1A, 0xC0, 0xAE, 0x3B, 0xC1, 0xC2, 0x37, 0x2E, 0xDC, 0x16, 0xAB, 0x8F, + 0xE7, 0x54, 0x9D, 0x7C, 0xFD, 0x38, 0xC0, 0xE7, 0x7F, 0xF9, 0x5E, 0x54, + 0x56, 0x51, 0xE9, 0x37, 0x95, 0x8A, 0x9E, 0xF0, 0x8F, 0x86, 0x57, 0xE8, + 0x49, 0x1C, 0xCE, 0x26, 0x29, 0x94, 0x8C, 0x31, 0x35, 0xB3, 0xD5, 0x7A, + 0x22, 0x36, 0xFB, 0x8A, 0x65, 0x21, 0xED, 0x02, 0x0D, 0x97, 0x92, 0xD5, + 0x37, 0x6E, 0x25, 0xAC, 0x23, 0xC2, 0x92, 0xCF, 0xF4, 0x11, 0x9B, 0x04, + 0x58, 0x31, 0x9C, 0xB6, 0xFA, 0xF8, 0x60, 0xDF, 0xA1, 0xE0, 0x53, 0x5F, + 0x78, 0x5D, 0x27, 0x02, 0xD7, 0x60, 0xD3, 0x78, 0xF6, 0xF8, 0x0D, 0xA7, + 0x9F, 0x07, 0x91, 0xAB, 0xDC, 0xB6, 0xB4, 0x8E, 0xD3, 0xCE, 0x44, 0x30, + 0xEE, 0xEC, 0x94, 0x32, 0xB0, 0x0C, 0x49, 0x07, 0x88, 0x76, 0x67, 0xC0, + 0xD7, 0x46, 0x84, 0x1F, 0x07, 0xBA, 0x1A, 0xD6, 0xB9, 0x3B, 0xBF, 0xD1, + 0x81, 0xF0, 0xE0, 0xB8, 0xB4, 0xE8, 0x00, 0x20, 0x74, 0xA2, 0x2D, 0x25, + 0x40, 0xE6, 0x97, 0x0C, 0xCA, 0xCF, 0xE6, 0xCD, 0x47, 0x9A, 0xAC, 0xD8, + 0x68, 0x96, 0x80, 0x3F, 0x1C, 0x2E, 0x22, 0x8F, 0x34, 0x37, 0xCC, 0x7A, + 0xC5, 0x30, 0x24, 0xB7, 0x98, 0x25, 0x62, 0x41, 0x6C, 0x9B, 0x38, 0x51, + 0x91, 0x99, 0x98, 0x61, 0x54, 0xE7, 0x56, 0xD0, 0x76, 0x4D, 0xFB, 0xEB, + 0xE3, 0x7A, 0x85, 0xCF, 0x18, 0x31, 0x6D, 0xD8, 0x58, 0x17, 0x40, 0x18, + 0x9F, 0xED, 0x01, 0xBF, 0x68, 0x6D, 0x5E, 0x3D, 0xE7, 0x02, 0x37, 0xF8, + 0x11, 0x71, 0x2D, 0x1A, 0xD4, 0x7E, 0xC6, 0xBD, 0x48, 0xB9, 0xE5, 0xF1, + 0xF5, 0x9C, 0x6B, 0x34, 0xC4, 0xB8, 0xB2, 0x24, 0x04, 0x9E, 0xFC, 0x02, + 0x99, 0x5E, 0xF6, 0x3B, 0x37, 0xAA, 0xA6, 0x54, 0xAB, 0x34, 0x46, 0x26, + 0xF5, 0xC7, 0x5E, 0x06, 0xFA, 0x6E, 0x6E, 0xB1, 0x6E, 0xBC, 0xF1, 0x64, + 0xDB, 0x86, 0x07, 0x69, 0x35, 0x51, 0x72, 0xCE, 0x8B, 0x3C, 0xE5, 0x1D, + 0xB0, 0x54, 0xCD, 0xDE, 0x29, 0x52, 0x72, 0x7F, 0xDF, 0xA0, 0xE7, 0x75, + 0xDA, 0xED, 0x05, 0xE9, 0x5E, 0xFE, 0x7F, 0xE5, 0xEF, 0x3B, 0x21, 0x0E, + 0xD0, 0x08, 0xE7, 0x7F, 0x77, 0x69, 0xF3, 0x5D, 0x00, 0xB1, 0x51, 0xC4, + 0x0C, 0xBA, 0x8D, 0xC2, 0x5E, 0x36, 0xE9, 0xF7, 0xCC, 0x50, 0xEE, 0xD8, + 0xF9, 0x5E, 0x53, 0x26, 0x49, 0x7B, 0xAD, 0xE2, 0x80, 0xDF, 0xBE, 0x0D, + 0xD1, 0x6A, 0x86, 0x35, 0x34, 0x6D, 0x35, 0x6D, 0x2F, 0xA9, 0xAC, 0x14, + 0xE7, 0x06, 0xB5, 0x75, 0xED, 0x5A, 0xF5, 0x5B, 0xE1, 0xA5, 0x64, 0x55, + 0x0F, 0x72, 0x1A, 0x43, 0x70, 0x48, 0x6B, 0x13, 0xC1, 0x18, 0x2C, 0x50, + 0xC7, 0xCF, 0x7D, 0x69, 0x2C, 0x20, 0xD3, 0xEE, 0xE0, 0xB7, 0x29, 0x97, + 0xB2, 0x89, 0xF8, 0xAF, 0x4B, 0x4D, 0xBB, 0x44, 0xFB, 0xC6, 0x28, 0x1D, + 0xD3, 0x05, 0xD2, 0xF5, 0x59, 0x2D, 0x92, 0x7D, 0xEC, 0xB0, 0x81, 0x76, + 0x76, 0x7A, 0xF8, 0x09, 0x8E, 0x67, 0x5A, 0xAC, 0x77, 0x4C, 0x64, 0x4D, + 0x6B, 0x61, 0xE9, 0x27, 0x85, 0x91, 0x57, 0xF9, 0x45, 0xF0, 0xFC, 0xCC, + 0x11, 0x0E, 0x6D, 0x84, 0x8F, 0x21, 0xE4, 0xB2, 0xA7, 0x7B, 0x9B, 0x31, + 0xF9, 0xEF, 0x45, 0xE1, 0x3F, 0x74, 0x10, 0xEA, 0xF5, 0xBF, 0x65, 0x7E, + 0xC8, 0xCF, 0x01, 0xBD, 0x40, 0x41, 0x32, 0x9D, 0x3E, 0xC0, 0x00, 0xC1, + 0x9E, 0x6A, 0xE2, 0x54, 0xA1, 0x0D, 0xB3, 0x84, 0x3A, 0xD4, 0x08, 0xC7, + 0x4D, 0x6A, 0x01, 0xC5, 0xD3, 0xB9, 0x80, 0xB9, 0x3C, 0xD1, 0x81, 0xB7, + 0x5D, 0x8D, 0x37, 0xD4, 0x3C, 0x5A, 0xDC, 0xC9, 0xDD, 0x84, 0x4F, 0x56, + 0xBC, 0xCC, 0xA5, 0x0D, 0x9A, 0x53, 0x9D, 0xCC, 0x7A, 0x52, 0xA7, 0xAE, + 0x3A, 0x7F, 0x4E, 0xE1, 0x63, 0xAE, 0xFF, 0x0E, 0xA7, 0x7A, 0x3B, 0x05, + 0x0A, 0x53, 0xC5, 0xAC, 0xD3, 0x58, 0xB5, 0xB6, 0xE1, 0xC1, 0x8B, 0x1C, + 0xEF, 0x77, 0xEB, 0x2A, 0xAF, 0x41, 0xDA, 0x4D, 0xBC, 0xC5, 0x37, 0x27, + 0xCD, 0x20, 0xBD, 0xA9, 0x83, 0x64, 0xA6, 0x28, 0xDE, 0x1C, 0xD7, 0x7A, + 0x98, 0xEA, 0x55, 0x3D, 0xE2, 0x59, 0x2F, 0x4E, 0x96, 0xEE, 0xB2, 0xAF, + 0xAA, 0xD3, 0xC7, 0x03, 0xEB, 0x47, 0x37, 0xF5, 0x3C, 0x6A, 0x07, 0x88, + 0x20, 0x9D, 0x2A, 0xD8, 0xED, 0x0F, 0x38, 0xB7, 0x55, 0x3E, 0x99, 0x67, + 0x8A, 0x80, 0x0F, 0x20, 0x38, 0xC2, 0x3E, 0x21, 0x65, 0x07, 0x62, 0x7D, + 0x56, 0xE2, 0x61, 0x3E, 0x1F, 0x29, 0x20, 0x06, 0x2E, 0xB4, 0xEA, 0x23, + 0x72, 0x91, 0xB6, 0x2B, 0x78, 0xB1, 0x01, 0xF0, 0x25, 0x0E, 0x6F, 0xD0, + 0x3A, 0x98, 0x14, 0x4B, 0xF7, 0x18, 0x27, 0x70, 0xBF, 0x89, 0x29, 0xF2, + 0x0C, 0xFA, 0xAC, 0x26, 0x73, 0xBC, 0xAA, 0x21, 0x5C, 0x0A, 0xC4, 0xF6, + 0x95, 0x10, 0xA3, 0x90, 0x46, 0x49, 0x5C, 0x53, 0x25, 0x95, 0x93, 0x80, + 0x0F, 0xF3, 0xB5, 0xA1, 0x7F, 0x27, 0xD5, 0xF2, 0x9D, 0x41, 0xA0, 0x34, + 0xAB, 0xDC, 0xD2, 0x8F, 0xA4, 0xBC, 0xE8, 0x54, 0x06, 0x60, 0x13, 0x6D, + 0x9B, 0x74, 0x57, 0x82, 0x1C, 0x0D, 0x1F, 0xDB, 0x54, 0xC3, 0x4F, 0x0C, + 0xC3, 0x99, 0x0F, 0xF6, 0x6B, 0x6A, 0x72, 0x4F, 0x2C, 0x01, 0x0C, 0x91, + 0xDC, 0x06, 0x05, 0xA7, 0xCC, 0xD4, 0x6C, 0xB3, 0x35, 0xAF, 0x10, 0xDE, + 0xEE, 0xE6, 0x42, 0x93, 0x11, 0x41, 0x66, 0x86, 0x2F, 0xD6, 0xCF, 0xC3, + 0xA7, 0x61, 0x24, 0xD0, 0xC8, 0x9D, 0x8B, 0x01, 0x68, 0xF7, 0x54, 0x10, + 0x5C, 0xE7, 0x01, 0x49, 0xA3, 0x4D, 0x5D, 0x97, 0xEA, 0x79, 0xA8, 0xFA, + 0x09, 0x0F, 0xAD, 0x93, 0x16, 0xCD, 0x75, 0x6B, 0x70, 0x79, 0xDB, 0xC3, + 0xC8, 0x04, 0xE1, 0xD6, 0xDA, 0x11, 0x8E, 0x4B, 0xB6, 0x6E, 0x60, 0x5D, + 0x21, 0xAA, 0xB0, 0xC0, 0xA0, 0xCD, 0xC7, 0x81, 0x92, 0x0F, 0xF3, 0xBC, + 0xA3, 0x80, 0x5C, 0x54, 0xCA, 0x05, 0x9C, 0x75, 0x5B, 0x80, 0x3E, 0x66, + 0x76, 0x65, 0xAA, 0x96, 0xE3, 0x6E, 0x9A, 0x6C, 0x09, 0xEC, 0x74, 0xF3, + 0x95, 0x7A, 0xA8, 0x0F, 0x4D, 0x08, 0x1B, 0x39, 0x7F, 0xA3, 0x27, 0xA3, + 0x50, 0x4F, 0xCA, 0x1A, 0xDA, 0x40, 0xFE, 0x6F, 0x63, 0xFB, 0xB6, 0xBC, + 0x03, 0x8F, 0xBD, 0x4A, 0x95, 0xE2, 0xA1, 0xCE, 0x1E, 0xFA, 0xE6, 0xF0, + 0x6D, 0x65, 0x7E, 0x03, 0x6C, 0xEF, 0x10, 0x88, 0x2F, 0xC3, 0x35, 0xFC, + 0x67, 0xDB, 0xEF, 0xF3, 0xA1, 0xBC, 0x5B, 0x12, 0x9C, 0x4C, 0xFF, 0xD9, + 0x5E, 0x53, 0x4E, 0xEC, 0x9C, 0x67, 0x9F, 0xED, 0x24, 0x75, 0x9D, 0xC5, + 0xE0, 0xCB, 0x74, 0x89, 0x0D, 0x0B, 0x3B, 0x85, 0x24, 0x12, 0xAA, 0xF8, + 0x22, 0x32, 0xAC, 0xDD, 0x3B, 0xC6, 0x90, 0x6F, 0xEF, 0xBB, 0x72, 0xEF, + 0xCA, 0x0D, 0xB1, 0x49, 0x30, 0x9B, 0xE3, 0xBC, 0x50, 0x8D, 0x8D, 0xE0, + 0x21, 0x79, 0x64, 0x89, 0x01, 0x59, 0xEF, 0xD6, 0x0C, 0x83, 0xED, 0xA4, + 0x23, 0xCB, 0x41, 0xC5, 0x4D, 0x10, 0xC4, 0xCF, 0xC2, 0x2F, 0xC7, 0xA3, + 0xD9, 0x03, 0xF5, 0x11, 0xD4, 0x2C, 0xC5, 0x31, 0x62, 0xF6, 0xAF, 0x90, + 0x39, 0x3D, 0xC8, 0xCB, 0x9F, 0x98, 0xCD, 0x00, 0xBD, 0x0E, 0x80, 0xE4, + 0xDF, 0xE7, 0x66, 0x00, 0x19, 0xA4, 0x8D, 0x40, 0x1A, 0x1E, 0xED, 0x2B, + 0xD2, 0xAB, 0xDC, 0x6E, 0x0F, 0x0A, 0xD4, 0xD7, 0x44, 0xC7, 0x74, 0x85, + 0xC2, 0xF2, 0x63, 0x96, 0x62, 0x90, 0x56, 0x0D, 0x3B, 0x27, 0x1A, 0xB1, + 0xBF, 0x9F, 0x58, 0x07, 0xF1, 0xF5, 0x3E, 0xAF, 0x07, 0x00, 0x76, 0xA9, + 0xB7, 0x38, 0x7A, 0xBC, 0xF8, 0xD7, 0x83, 0xF7, 0x17, 0x9F, 0xD5, 0xD5, + 0x0A, 0x34, 0xBE, 0x07, 0x28, 0xFB, 0xA9, 0x00, 0xC3, 0x2A, 0xD0, 0x32, + 0xC6, 0xAD, 0x4A, 0x58, 0x5E, 0xD9, 0xAD, 0x4D, 0x86, 0x14, 0x1D, 0x3E, + 0xEB, 0xE9, 0xE5, 0x7D, 0xD0, 0x95, 0x33, 0x54, 0xEC, 0xC1, 0x72, 0x8B, + 0xD1, 0x5A, 0x23, 0xBF, 0xB8, 0xD0, 0x85, 0x6E, 0x38, 0x93, 0xD7, 0xD4, + 0xE9, 0x7C, 0x03, 0xC7, 0x21, 0x3F, 0x38, 0x36, 0xFB, 0xF5, 0xAD, 0xF4, + 0xCA, 0x1A, 0x03, 0x82, 0x9B, 0x3B, 0xEB, 0xB0, 0x0F, 0xE1, 0xEF, 0x98, + 0x6D, 0x76, 0x8C, 0x1E, 0xDC, 0xBA, 0x45, 0xE0, 0xE9, 0xAE, 0xC7, 0xC9, + 0xAC, 0x91, 0xE7, 0xB5, 0xD1, 0x18, 0xFA, 0x56, 0x5A, 0xA1, 0x92, 0xF9, + 0x2C, 0x9C, 0x06, 0x4F, 0x34, 0xDD, 0x80, 0xB5, 0xF4, 0x5F, 0x7E, 0xE0, + 0xAF, 0xAB, 0xDE, 0x95, 0x72, 0x7F, 0xCD, 0x5D, 0x29, 0x54, 0x6A, 0xA8, + 0x13, 0x5B, 0xDB, 0xCB, 0x30, 0xEE, 0x56, 0xD3, 0x45, 0x8E, 0xCB, 0x59, + 0xDA, 0x07, 0xED, 0xEC, 0x43, 0x5E, 0x17, 0x44, 0xAF, 0xBC, 0x81, 0x5C, + 0x4B, 0xDB, 0xAE, 0xA0, 0x46, 0x19, 0xA8, 0x61, 0x35, 0x9F, 0x17, 0xB3, + 0xAF, 0xCC, 0x22, 0xC6, 0x0B, 0x78, 0x58, 0xE9, 0x87, 0xE2, 0x2D, 0x96, + 0xF0, 0xA9, 0x62, 0x12, 0x35, 0xD0, 0x46, 0x6C, 0x61, 0xAE, 0xB9, 0x5D, + 0x5A, 0xDE, 0x8B, 0x7F, 0xAC, 0x9E, 0x29, 0xA1, 0xEA, 0xC7, 0x1B, 0x24, + 0x9E, 0x08, 0x48, 0xBD, 0x23, 0xF6, 0xAB, 0x4E, 0xE9, 0xDE, 0xAF, 0x4C, + 0x79, 0xCC, 0x52, 0xB2, 0xAC, 0xF4, 0x01, 0xA9, 0xA8, 0x02, 0x9B, 0x14, + 0x86, 0x4B, 0xEE, 0x94, 0xA8, 0x34, 0x6C, 0x00, 0x4F, 0x4C, 0xE1, 0x6D, + 0xF9, 0x19, 0x8F, 0x36, 0x5E, 0x22, 0x5D, 0xB7, 0x03, 0x62, 0x7C, 0x4D, + 0xC4, 0xF0, 0x4C, 0x3C, 0x5F, 0xBD, 0x0E, 0xB0, 0x74, 0x14, 0x08, 0xEE, + 0x0E, 0x06, 0x65, 0xAB, 0x69, 0x7A, 0x70, 0x67, 0xC2, 0x12, 0x04, 0x45, + 0xF2, 0xC8, 0xD7, 0x80, 0x7F, 0xDB, 0xB5, 0xD0, 0xF7, 0xAB, 0x62, 0x7A, + 0xFA, 0xD6, 0x1A, 0x9E, 0x14, 0x4C, 0x4A, 0x6C, 0x75, 0x81, 0x37, 0xEF, + 0x68, 0x4A, 0x5D, 0x23, 0xDD, 0x7E, 0xF5, 0xDD, 0x9E, 0xEF, 0xB3, 0xC8, + 0x3F, 0x18, 0x65, 0x42, 0x14, 0x68, 0x77, 0x56, 0x24, 0x8C, 0xAD, 0x7A, + 0xC3, 0x1D, 0xB3, 0xAA, 0x3C, 0x90, 0x38, 0x65, 0xA2, 0x6A, 0x42, 0xD9, + 0x4D, 0xA1, 0xAA, 0x04, 0xA5, 0xE6, 0x36, 0xF4, 0xA3, 0x18, 0xA3, 0x9B, + 0x8C, 0x9A, 0x5E, 0xAF, 0x6D, 0xDC, 0x6A, 0xD3, 0x61, 0xB7, 0x59, 0x2C, + 0xF4, 0xE1, 0x16, 0xFF, 0xFC, 0x3D, 0xBC, 0x2F, 0xD6, 0xC1, 0xEE, 0xBD, + 0x9B, 0x48, 0x11, 0x90, 0x7B, 0xED, 0x58, 0x9B, 0x84, 0x57, 0x85, 0xB3, + 0xB3, 0x65, 0x14, 0x08, 0x14, 0x8F, 0x71, 0xF2, 0x50, 0x38, 0x7C, 0xCE, + 0xEE, 0x47, 0xBD, 0xFD, 0x27, 0x6B, 0x07, 0xB7, 0xB2, 0xBB, 0x05, 0xB0, + 0x4F, 0xB5, 0x94, 0xA0, 0x30, 0x89, 0x97, 0xD2, 0x2E, 0xE1, 0xCC, 0xAC, + 0xDA, 0x95, 0x2F, 0x2E, 0xDD, 0xA9, 0xA9, 0xD0, 0xC6, 0xC3, 0x77, 0xB8, + 0xBA, 0x19, 0xD2, 0x66, 0x91, 0xB6, 0xA8, 0x4D, 0x34, 0xC5, 0xE3, 0xC9, + 0x4B, 0x8C, 0x49, 0x68, 0xD2, 0x47, 0xC5, 0x8C, 0x10, 0xE4, 0xBB, 0x40, + 0x04, 0x7B, 0x26, 0x34, 0x75, 0x53, 0xC5, 0xA5, 0x57, 0x91, 0x11, 0x81, + 0x49, 0x79, 0x0F, 0xE9, 0x95, 0x33, 0x6C, 0xF2, 0x2F, 0x2A, 0x07, 0x43, + 0x71, 0xAD, 0x7B, 0x2C, 0x99, 0xFD, 0x4E, 0xC0, 0x8C, 0xC8, 0x69, 0x12, + 0xF9, 0x1F, 0x11, 0xFA, 0x28, 0x80, 0xC7, 0xEE, 0x50, 0x63, 0x6D, 0x08, + 0x88, 0x9D, 0x6C, 0x2E, 0x05, 0x54, 0xC2, 0x0B, 0x26, 0x69, 0xAB, 0xA5, + 0xAD, 0xC1, 0xFD, 0xD9, 0x1D, 0xE6, 0x85, 0xD5, 0x71, 0xB6, 0xA9, 0xE9, + 0x10, 0xB7, 0x2F, 0x1E, 0x12, 0x9C, 0x41, 0x14, 0xAF, 0xE0, 0x07, 0x8C, + 0xF2, 0xA3, 0x7F, 0xA4, 0x94, 0x91, 0xF9, 0x41, 0x62, 0x8B, 0xE9, 0xA4, + 0x11, 0x78, 0x9D, 0x75, 0x33, 0x01, 0xBD, 0x7F, 0x1E, 0x4F, 0x2F, 0x80, + 0x7A, 0xF9, 0x70, 0x84, 0xE6, 0x45, 0xDE, 0x76, 0xD8, 0x36, 0x5C, 0xC1, + 0xB9, 0x42, 0x59, 0x85, 0x9C, 0x60, 0x5F, 0x29, 0x03, 0x34, 0xE8, 0x65, + 0xEB, 0x99, 0x7B, 0xCD, 0x3A, 0x9C, 0xB6, 0x9E, 0xA9, 0xBA, 0x7D, 0x6D, + 0x9D, 0x27, 0xDD, 0xBE, 0xD4, 0xF9, 0xB5, 0xF8, 0x66, 0xD5, 0xAC, 0x27, + 0x9D, 0x8F, 0x72, 0x04, 0x1D, 0xA3, 0x91, 0x9E, 0x3C, 0xBA, 0x4B, 0xF7, + 0x58, 0x06, 0xBD, 0xE6, 0x8F, 0xB5, 0xA5, 0x8F, 0x7F, 0x1C, 0xF9, 0xD9, + 0x2E, 0xD6, 0xB0, 0x52, 0x2D, 0x23, 0x8B, 0x8E, 0xD7, 0xE8, 0xFF, 0x5E, + 0x04, 0x4A, 0xC4, 0xDA, 0x95, 0xA4, 0x91, 0xFF, 0xCB, 0x36, 0x38, 0xEE, + 0x47, 0xB7, 0x51, 0xCD, 0x80, 0x37, 0x0D, 0x06, 0xB6, 0x56, 0x19, 0xFB, + 0xAF, 0x4E, 0x94, 0x57, 0x12, 0xCC, 0x46, 0xD4, 0x16, 0x59, 0xF4, 0x83, + 0xEF, 0x3C, 0x7C, 0xE3, 0x50, 0x61, 0x69, 0xB3, 0xC7, 0xB5, 0x96, 0xDB, + 0x89, 0x6C, 0x27, 0xA6, 0x48, 0x67, 0x9F, 0xE8, 0x31, 0x01, 0x6D, 0x16, + 0xD4, 0x8A, 0xFF, 0x93, 0x47, 0x9D, 0xC6, 0x2C, 0x53, 0x18, 0x01, 0x09, + 0x09, 0x35, 0xFD, 0xAA, 0x43, 0x1B, 0xC0, 0xD7, 0x9D, 0x84, 0x01, 0x4D, + 0x08, 0x51, 0x76, 0xF0, 0x21, 0x21, 0x74, 0x1D, 0xB6, 0x97, 0x0C, 0xEE, + 0xC8, 0xCA, 0x00, 0x87, 0x52, 0xD9, 0x50, 0xD3, 0x84, 0xC9, 0xF6, 0xB3, + 0x3E, 0x69, 0xB8, 0x7A, 0xDF, 0x10, 0x02, 0xE9, 0xB1, 0x4E, 0xF7, 0x81, + 0x6D, 0x3A, 0x6E, 0x5B, 0x14, 0x78, 0xBF, 0x0E, 0x50, 0xB8, 0x63, 0x8B, + 0x1F, 0x5F, 0xEB, 0xEA, 0x5C, 0xBB, 0xE8, 0x87, 0x07, 0x60, 0x50, 0x13, + 0xE1, 0x36, 0xD9, 0x54, 0xEA, 0xDD, 0x9B, 0x9B, 0x53, 0xEF, 0xFD, 0xD6, + 0x92, 0x88, 0x90, 0x50, 0x18, 0xD2, 0xAA, 0x67, 0xFF, 0xF4, 0x95, 0x06, + 0xC4, 0x36, 0xB1, 0x38, 0x74, 0xAA, 0xFD, 0x05, 0xC8, 0x0E, 0x59, 0xB3, + 0xBA, 0xD3, 0x83, 0x84, 0x3B, 0x96, 0x9E, 0x8D, 0xF4, 0xE2, 0xCA, 0x2A, + 0x77, 0x0B, 0xD6, 0xE1, 0x2E, 0x37, 0x88, 0x0E, 0xD9, 0x13, 0xC8, 0xF8, + 0x6D, 0xFC, 0x70, 0x95, 0xF5, 0x83, 0x02, 0xA2, 0x0F, 0x75, 0xD4, 0xE0, + 0xEC, 0xFD, 0x4A, 0x82, 0xDD, 0x87, 0x1D, 0xC4, 0x57, 0x96, 0x54, 0xDB, + 0x36, 0x07, 0x11, 0x0C, 0x0B, 0x94, 0xD0, 0xF4, 0x97, 0x75, 0xF9, 0x1D, + 0xC4, 0x5D, 0x34, 0x19, 0x38, 0xE1, 0x2A, 0x23, 0xBD, 0x3B, 0xE6, 0x8F, + 0xC2, 0x0A, 0x2B, 0x1D, 0xFD, 0x2E, 0x68, 0xBC, 0x11, 0xA4, 0xA1, 0x87, + 0x98, 0x4E, 0x71, 0x1C, 0xBE, 0x19, 0x3F, 0xFC, 0x17, 0x24, 0x52, 0xA5, + 0xA3, 0x16, 0xD1, 0xAD, 0x0F, 0xF8, 0x57, 0x9F, 0x7B, 0x8E, 0xD0, 0xC2, + 0x3F, 0x78, 0x43, 0xDC, 0x58, 0xEA, 0xE2, 0x5B, 0x71, 0x66, 0x46, 0x20, + 0x28, 0x01, 0xFC, 0x41, 0xAF, 0x19, 0x55, 0xA8, 0x8F, 0xB0, 0x08, 0x91, + 0x9C, 0xA5, 0x4C, 0x10, 0xA1, 0xD5, 0x6C, 0x9E, 0x85, 0x68, 0x55, 0x5E, + 0x07, 0x7B, 0xF6, 0xA3, 0x91, 0xEC, 0x11, 0xA7, 0xE7, 0x2C, 0x6D, 0xF8, + 0x73, 0x26, 0x53, 0xB5, 0x44, 0x2C, 0x7E, 0x9B, 0xDD, 0x78, 0x24, 0xBA, + 0xB9, 0xE5, 0xB2, 0xD1, 0x0E, 0xE6, 0xC8, 0x4D, 0x1F, 0x14, 0x32, 0x76, + 0x1C, 0xBC, 0xE5, 0x1F, 0xC6, 0x81, 0x0E, 0x38, 0xD9, 0xB0, 0xC3, 0x89, + 0xE7, 0x51, 0xE2, 0x6D, 0xB5, 0x4C, 0x10, 0x3B, 0xAE, 0x9F, 0x07, 0x6C, + 0x88, 0x52, 0x09, 0x06, 0xA5, 0x5C, 0x1A, 0x2D, 0x2F, 0x3F, 0x90, 0x2D, + 0xB9, 0xB7, 0x85, 0x2F, 0xC0, 0xE0, 0x60, 0x4A, 0x7D, 0x24, 0xC3, 0xCD, + 0x9C, 0x15, 0x37, 0x5A, 0xF0, 0x56, 0x58, 0x9B, 0xA6, 0xB6, 0x0A, 0xED, + 0x9E, 0x21, 0xF3, 0xA8, 0x53, 0x78, 0x8C, 0xB4, 0x84, 0x41, 0x02, 0xC4, + 0xB7, 0xF5, 0x4B, 0xB2, 0x98, 0x9D, 0x89, 0xB8, 0xAD, 0xE3, 0x5E, 0x84, + 0xB9, 0xDB, 0xC7, 0xA8, 0xC9, 0x20, 0x91, 0x05, 0x8E, 0x4B, 0x6F, 0x74, + 0x1D, 0xC9, 0x6D, 0x2A, 0x4A, 0xF1, 0x5E, 0xD1, 0x6B, 0xFA, 0xF2, 0x4B, + 0xC6, 0x72, 0xB5, 0x99, 0x05, 0xEF, 0xFF, 0xE3, 0x00, 0x97, 0xE1, 0xB6, + 0x07, 0x1F, 0xBC, 0x95, 0xCD, 0x1F, 0xDC, 0xD5, 0x93, 0x62, 0x7C, 0xA0, + 0xEC, 0xCE, 0x9A, 0xC4, 0x55, 0x9C, 0x79, 0x23, 0x2A, 0x61, 0x17, 0x46, + 0x86, 0x9E, 0x81, 0xC5, 0x40, 0x0D, 0x63, 0xBC, 0xAC, 0x52, 0xE8, 0x69, + 0xBE, 0x7C, 0x76, 0xE8, 0x12, 0xB3, 0x66, 0x3F, 0xE7, 0xB9, 0x97, 0xF0, + 0x32, 0xD9, 0xC6, 0xBF, 0xF3, 0x12, 0xC9, 0x9E, 0x93, 0xD8, 0xF4, 0x2E, + 0x17, 0x54, 0xA7, 0x32, 0xE2, 0xF6, 0x6C, 0xBE, 0xCA, 0xBA, 0x8D, 0x76, + 0x11, 0xA2, 0x48, 0xB7, 0x4E, 0x84, 0x42, 0xE5, 0xF4, 0xAF, 0x12, 0x4F, + 0x56, 0x98, 0x7B, 0xF3, 0xE0, 0x22, 0x94, 0x1A, 0x64, 0xA3, 0xDD, 0x26, + 0x13, 0x73, 0x96, 0x84, 0x46, 0xB5, 0x98, 0xE4, 0x91, 0xEC, 0xF3, 0x06, + 0x37, 0x21, 0x79, 0x77, 0x91, 0x02, 0x2E, 0x18, 0xE0, 0x60, 0x75, 0xB8, + 0xC5, 0xAD, 0x9D, 0xB3, 0x56, 0x8B, 0x92, 0x0E, 0x01, 0xAB, 0x91, 0xF2, + 0xDC, 0x41, 0xBC, 0x25, 0xCE, 0x16, 0x31, 0x1B, 0x24, 0x52, 0xD9, 0x02, + 0x25, 0x4E, 0x64, 0x8A, 0x11, 0x15, 0xB9, 0x20, 0x33, 0x01, 0xD0, 0x4F, + 0x6B, 0x04, 0x67, 0x32, 0xB9, 0xEC, 0xD0, 0x77, 0xFC, 0x51, 0x0F, 0x9E, + 0x5C, 0xF5, 0x3C, 0x18, 0x0A, 0xF2, 0xD3, 0x4E, 0x2C, 0x3B, 0xA7, 0xC0, + 0x43, 0x33, 0xE8, 0x59, 0x40, 0xB7, 0xAF, 0x75, 0x38, 0xDC, 0x1D, 0xF3, + 0x77, 0xAD, 0xD9, 0xF7, 0x3A, 0x5D, 0xF4, 0xD4, 0xB5, 0x54, 0x15, 0x73, + 0x7B, 0xE7, 0xA3, 0x2B, 0x22, 0xE9, 0x09, 0x2C, 0xDE, 0x60, 0x2A, 0x5B, + 0xBB, 0xD9, 0xA1, 0xF6, 0x1E, 0x69, 0x38, 0xC2, 0x4B, 0xCD, 0xEC, 0xA2, + 0xA3, 0x1D, 0xBA, 0xBE, 0x0C, 0xA4, 0x42, 0x01, 0xE9, 0x1C, 0x4A, 0xC6, + 0xCF, 0xF8, 0x9A, 0x1B, 0x2B, 0x2B, 0x44, 0x81, 0x50, 0x69, 0x85, 0x08, + 0xDD, 0xE7, 0xBE, 0xF9, 0xBF, 0x65, 0x59, 0xB3, 0x80, 0x5C, 0x85, 0x5D, + 0x68, 0x05, 0xBA, 0xA1, 0xDC, 0x32, 0x9C, 0xA9, 0x98, 0x7D, 0x3B, 0x4E, + 0x03, 0xA4, 0x28, 0x0A, 0x3F, 0xB3, 0x09, 0xA8, 0x0C, 0x5A, 0x92, 0xA3, + 0xDF, 0xAE, 0x69, 0xBE, 0x5D, 0xFA, 0x75, 0x49, 0xA4, 0x5C, 0xE5, 0xBB, + 0xCD, 0x7C, 0xD8, 0x5A, 0xAA, 0x77, 0x7C, 0x81, 0xE3, 0xCA, 0xB9, 0x7C, + 0xC8, 0xF9, 0x83, 0x8B, 0x84, 0xB7, 0xE6, 0xEF, 0x52, 0xF0, 0xC5, 0xB8, + 0xAF, 0x7F, 0xA6, 0xA0, 0x4E, 0xE0, 0x1A, 0x41, 0x93, 0x01, 0xF7, 0xBE, + 0x0E, 0x58, 0x73, 0xFA, 0x43, 0xE7, 0xC0, 0x72, 0x2B, 0x4F, 0x4A, 0x80, + 0xBA, 0xC7, 0x2E, 0x19, 0x4C, 0xB5, 0xF1, 0xFD, 0x97, 0x11, 0x8A, 0xD3, + 0xB7, 0xC9, 0x73, 0x6D, 0x04, 0x9E, 0xAA, 0xC2, 0xD3, 0xEE, 0xB9, 0xC0, + 0x98, 0x06, 0x9D, 0xA5, 0x6B, 0x19, 0x5B, 0x95, 0x13, 0x6C, 0x27, 0x9E, + 0x77, 0xFB, 0x66, 0x7B, 0x7F, 0x1E, 0x9D, 0x5D, 0x38, 0x30, 0xB6, 0x7E, + 0xA9, 0x0D, 0xF6, 0x8B, 0xAE, 0x58, 0x94, 0xA3, 0x3B, 0x67, 0x95, 0xAD, + 0xCD, 0xEE, 0x37, 0xB6, 0x4A, 0xC1, 0x68, 0x2B, 0x69, 0x5F, 0x46, 0x9F, + 0x7D, 0x29, 0x52, 0xEF, 0x7A, 0xCF, 0xB2, 0x28, 0x8C, 0xCE, 0x3D, 0x71, + 0xBC, 0x0F, 0x46, 0x7F, 0xC2, 0xB9, 0x86, 0x84, 0x9B, 0x45, 0x21, 0x96, + 0x01, 0x1D, 0xD7, 0x03, 0x48, 0xC5, 0xBB, 0x55, 0x30, 0x18, 0x8A, 0xDA, + 0xE8, 0xFA, 0x72, 0x94, 0xE0, 0xD8, 0x13, 0xF1, 0x8B, 0x4C, 0xC3, 0xD5, + 0x6D, 0x74, 0x92, 0xD0, 0x21, 0xDE, 0xAF, 0x38, 0x99, 0xB3, 0x7D, 0xCB, + 0xB3, 0xF4, 0x3C, 0xC8, 0xC3, 0xFA, 0xB6, 0x3F, 0xF8, 0x3E, 0x30, 0x82, + 0x55, 0x7F, 0x64, 0x71, 0xEE, 0x62, 0x6B, 0xFA, 0x1D, 0x97, 0x7E, 0xBC, + 0x89, 0xCD, 0x3C, 0x72, 0x6A, 0xEA, 0xE0, 0xDE, 0xB7, 0x10, 0x62, 0x16, + 0x00, 0x2A, 0xD9, 0x02, 0x47, 0x51, 0xAA, 0x56, 0x8D, 0x1F, 0xC9, 0x04, + 0x33, 0x87, 0xE3, 0x1F, 0x0F, 0x19, 0xBC, 0x54, 0x17, 0x9A, 0x3A, 0x88, + 0x48, 0x81, 0xC0, 0x68, 0xC7, 0x96, 0xBB, 0xB7, 0x24, 0x7B, 0xF2, 0xA0, + 0x45, 0x65, 0x30, 0x4A, 0xDA, 0x70, 0x78, 0x77, 0xC8, 0x0E, 0x98, 0x7B, + 0x4E, 0xC3, 0x04, 0x41, 0xDD, 0x9B, 0xA3, 0xED, 0x1A, 0x88, 0x1E, 0x2A, + 0xCF, 0x8A, 0xB7, 0xD7, 0x86, 0x2F, 0xC1, 0xBF, 0x67, 0xC2, 0x65, 0x70, + 0xDC, 0x77, 0x7B, 0xC5, 0xFA, 0x03, 0x57, 0x42, 0xAD, 0x92, 0xCF, 0xCB, + 0xD0, 0x11, 0x11, 0x9E, 0x93, 0x5B, 0xCB, 0x78, 0xC2, 0x55, 0xD6, 0xAD, + 0x95, 0x3A, 0x45, 0x32, 0x42, 0x8F, 0xB1, 0x18, 0x17, 0xAF, 0xF2, 0x94, + 0x21, 0x08, 0x58, 0x13, 0x19, 0x8F, 0x12, 0x51, 0xB7, 0x95, 0x26, 0x8E, + 0xD6, 0x9A, 0x82, 0x78, 0x4D, 0x58, 0xEF, 0xC0, 0x89, 0x0D, 0xF7, 0xB6, + 0xCF, 0x46, 0x28, 0x3C, 0x97, 0x68, 0x32, 0xC5, 0x09, 0x25, 0x18, 0xE5, + 0x9E, 0x74, 0x0E, 0x73, 0xD8, 0x98, 0xC6, 0x2D, 0xCA, 0xE4, 0xDF, 0x2B, + 0x8A, 0xE1, 0x15, 0x8D, 0x9F, 0x70, 0xC0, 0x81, 0xCC, 0x9B, 0x4B, 0x0A, + 0xA5, 0x0A, 0x82, 0x5F, 0xC0, 0x55, 0x73, 0x47, 0x0D, 0xEE, 0x59, 0xFD, + 0xE5, 0xDD, 0x52, 0x74, 0xA2, 0x0F, 0xF1, 0xFC, 0xE9, 0x14, 0x9C, 0xF7, + 0x03, 0x3F, 0xC3, 0xF5, 0xFD, 0x7D, 0x1C, 0xB4, 0x62, 0x8E, 0xDD, 0x01, + 0x77, 0x96, 0x4D, 0x23, 0x5D, 0x37, 0x88, 0x83, 0x33, 0xB0, 0x75, 0x1E, + 0x9D, 0x15, 0xB5, 0x9F, 0x78, 0x04, 0x92, 0x9E, 0x54, 0x40, 0x10, 0x4E, + 0xFF, 0x5B, 0xF3, 0xF8, 0xFC, 0x67, 0xEF, 0x85, 0x1D, 0xFF, 0x0B, 0x2F, + 0x5D, 0x54, 0xE1, 0xEA, 0x8C, 0xB8, 0x41, 0x71, 0x91, 0x2D, 0xEB, 0x14, + 0x78, 0x78, 0x25, 0x95, 0x73, 0x70, 0xED, 0x24, 0x2F, 0x97, 0x51, 0xE0, + 0x8E, 0x6E, 0x43, 0x12, 0x2B, 0xCF, 0x88, 0xDE, 0xA1, 0xB0, 0xDB, 0x7F, + 0x1C, 0xA1, 0x75, 0xD9, 0x54, 0x1D, 0x9E, 0xE1, 0x95, 0x68, 0x7E, 0xD4, + 0x47, 0xD1, 0x42, 0x61, 0x60, 0xD9, 0xDE, 0x25, 0xC0, 0xD1, 0x5A, 0xB6, + 0x72, 0xF5, 0x37, 0xF8, 0x73, 0xC2, 0x05, 0xE3, 0xE1, 0x3B, 0x55, 0x29, + 0xCB, 0xB0, 0x2D, 0xBD, 0x6A, 0xF8, 0x67, 0xF6, 0xCD, 0x8B, 0xE3, 0x80, + 0x49, 0x24, 0x38, 0x22, 0x2E, 0xA6, 0x68, 0x25, 0x41, 0xCA, 0xEF, 0x0F, + 0x33, 0x53, 0xC0, 0xBB, 0x74, 0xEA, 0xC6, 0xC5, 0xA5, 0x5F, 0x07, 0xE6, + 0x3B, 0xB4, 0xA0, 0x43, 0xFC, 0xA9, 0x28, 0x9B, 0xD2, 0x11, 0x57, 0x61, + 0xD9, 0x79, 0x63, 0x5E, 0x7A, 0x7E, 0x9A, 0xDF, 0x77, 0x70, 0x0E, 0x0C, + 0xDA, 0xD6, 0xCE, 0x6B, 0x92, 0x71, 0x94, 0x9B, 0x2B, 0xEE, 0x3B, 0x99, + 0xCB, 0x82, 0x19, 0x55, 0x0E, 0x3E, 0xA3, 0xAF, 0x1D, 0xF4, 0x05, 0x1E, + 0x50, 0x8F, 0x0E, 0x72, 0x6E, 0x16, 0x28, 0xE3, 0xD1, 0xB2, 0x57, 0xBE, + 0x54, 0x9F, 0xE8, 0x7F, 0xBE, 0xC2, 0x07, 0x22, 0xD0, 0x3E, 0xE4, 0x1A, + 0x50, 0xB5, 0x78, 0x48, 0x93, 0xC3, 0x7E, 0xA8, 0x62, 0xD1, 0x92, 0x29, + 0x52, 0x70, 0xC5, 0x62, 0x5F, 0x44, 0xE8, 0xD5, 0x27, 0x5A, 0x07, 0xBE, + 0xE2, 0x01, 0xCB, 0x9F, 0xFF, 0xD4, 0x02, 0x15, 0xD8, 0x9E, 0xB6, 0x19, + 0x5A, 0x94, 0x2C, 0x74, 0xC9, 0xEE, 0x0B, 0x0D, 0x57, 0x32, 0x0E, 0x3C, + 0x75, 0xC3, 0xEE, 0xC4, 0x48, 0x13, 0xB3, 0xD1, 0x5F, 0xB4, 0xAA, 0xE4, + 0x6F, 0xE9, 0x98, 0xD8, 0x02, 0xF4, 0x00, 0xF5, 0xA5, 0x52, 0xED, 0x27, + 0x3E, 0x40, 0xB1, 0x84, 0x81, 0x3E, 0x79, 0xF0, 0xF4, 0x09, 0x34, 0x36, + 0x01, 0xF3, 0xD5, 0x5D, 0x68, 0xE8, 0xE0, 0xEF, 0x36, 0xA6, 0x67, 0xBA, + 0xD7, 0xE2, 0xC7, 0x06, 0x6A, 0x43, 0xCD, 0xC5, 0xD2, 0x78, 0x45, 0x8A, + 0xE8, 0x8D, 0x5F, 0x41, 0x10, 0xCA, 0x38, 0x8B, 0x6D, 0x91, 0xF1, 0x05, + 0x06, 0xDE, 0x51, 0xE8, 0xF9, 0xC3, 0x68, 0xEE, 0x2D, 0x48, 0x09, 0x58, + 0x2E, 0x08, 0x18, 0x0B, 0xD3, 0x64, 0x6B, 0xD3, 0xB3, 0xC4, 0x66, 0xB7, + 0x29, 0x4B, 0xDB, 0x47, 0x40, 0xB2, 0xC7, 0xBD, 0x48, 0x21, 0xA0, 0xCF, + 0xBC, 0x23, 0xA1, 0x31, 0x42, 0x48, 0x3E, 0xB2, 0xAF, 0x6F, 0x25, 0x95, + 0x89, 0xCC, 0x8F, 0xC0, 0x4F, 0xA6, 0x37, 0xCE, 0x0A, 0xF7, 0xF5, 0x93, + 0xBE, 0x98, 0x5E, 0x5C, 0x37, 0x2B, 0xBD, 0x14, 0xD3, 0xF7, 0x1F, 0x38, + 0x27, 0xA8, 0xD1, 0x55, 0x18, 0xDD, 0x16, 0xF1, 0x3B, 0xC1, 0x20, 0x75, + 0x21, 0x30, 0x0B, 0xC3, 0xC1, 0xD9, 0x78, 0x9E, 0x7A, 0xDD, 0xD0, 0x36, + 0xEF, 0x97, 0xFC, 0x61, 0x45, 0x9B, 0x49, 0x8D, 0x73, 0x70, 0xC5, 0xEC, + 0xB0, 0x45, 0x78, 0x09, 0x85, 0x42, 0x68, 0x9F, 0x7F, 0x50, 0x35, 0xE4, + 0x2A, 0x5F, 0xEB, 0x30, 0xB5, 0x01, 0x0F, 0x5B, 0x2B, 0x48, 0xAE, 0xD4, + 0x41, 0x00, 0x69, 0x58, 0x7D, 0xCA, 0x23, 0x0B, 0xC0, 0x32, 0xDC, 0x54, + 0xBA, 0x26, 0x22, 0xB5, 0xB1, 0xDB, 0xF9, 0x5E, 0x81, 0x6E, 0x48, 0xB8, + 0x70, 0x66, 0xAA, 0x7E, 0x6B, 0x42, 0xB4, 0x51, 0x25, 0xB5, 0x0D, 0x1B, + 0x45, 0x4B, 0x6C, 0x31, 0x45, 0xA3, 0x91, 0x56, 0x18, 0x2E, 0x34, 0x1A, + 0x67, 0x87, 0xA8, 0xC9, 0x6B, 0x72, 0xD8, 0xE5, 0x91, 0x2D, 0x71, 0xD8, + 0xC8, 0xA4, 0x95, 0xB1, 0xFD, 0xF8, 0x0F, 0xEA, 0x08, 0x4F, 0x11, 0x2A, + 0x39, 0xE7, 0xF6, 0x50, 0xCC, 0xF7, 0x64, 0xA1, 0x66, 0xE7, 0xA9, 0xDD, + 0x49, 0xAB, 0xBF, 0x5B, 0x99, 0x14, 0xE2, 0xD6, 0x91, 0x3A, 0x70, 0x08, + 0x67, 0x87, 0x7C, 0xB7, 0x76, 0x21, 0xE5, 0x23, 0x32, 0x9F, 0x6F, 0x88, + 0xBB, 0x10, 0xB6, 0xBE, 0xA2, 0xB1, 0x3E, 0xDA, 0x64, 0x5C, 0x25, 0x0B, + 0x0F, 0x94, 0x39, 0x0E, 0x21, 0x91, 0x01, 0x60, 0x8C, 0x9B, 0x3D, 0x9E, + 0xEB, 0x3C, 0x05, 0x28, 0x66, 0x58, 0x9A, 0x7D, 0xA3, 0x2C, 0x42, 0x13, + 0xD7, 0x52, 0x09, 0x0A, 0x12, 0x14, 0xB1, 0x05, 0x4D, 0x7C, 0xE4, 0x04, + 0x2C, 0xC8, 0x93, 0x98, 0xBB, 0x90, 0x7C, 0xDE, 0x31, 0xD1, 0x21, 0x5C, + 0x21, 0x75, 0x94, 0x64, 0x62, 0x33, 0xB9, 0xCF, 0xD1, 0x5C, 0x77, 0xC0, + 0xAB, 0x0A, 0xF8, 0x03, 0x00, 0x35, 0xA1, 0xE9, 0x8D, 0xB5, 0x43, 0x6F, + 0x94, 0x82, 0xAA, 0xCE, 0xB3, 0x5E, 0x6C, 0x13, 0x45, 0x6F, 0xD5, 0xE8, + 0x12, 0xFA, 0x4C, 0x68, 0x3D, 0x04, 0x57, 0x77, 0x87, 0x1D, 0xFC, 0xA6, + 0x19, 0xC2, 0x09, 0x5B, 0x65, 0xD7, 0x86, 0xE2, 0x8E, 0x14, 0x52, 0x92, + 0xA5, 0xC9, 0xCA, 0xFD, 0x42, 0x54, 0x12, 0xF3, 0xB9, 0x87, 0x11, 0x71, + 0x70, 0x8D, 0x98, 0x85, 0xBB, 0x92, 0x36, 0x42, 0x42, 0x4F, 0x2D, 0xDB, + 0x8A, 0x77, 0x2A, 0x93, 0x8D, 0xF6, 0x87, 0x5D, 0x8F, 0x52, 0x91, 0x5A, + 0x50, 0xC2, 0x9D, 0xE3, 0x8C, 0xA6, 0xD2, 0x4C, 0xDF, 0xE6, 0xEC, 0xF7, + 0x6E, 0x4C, 0xAF, 0x80, 0x28, 0xF1, 0x1A, 0x80, 0x25, 0x15, 0x27, 0xFF, + 0xB2, 0x6C, 0x3A, 0x49, 0xC1, 0xF4, 0x8F, 0xCD, 0x82, 0x8A, 0xC7, 0x9F, + 0x3D, 0x32, 0x6D, 0xDD, 0x36, 0xDB, 0x2F, 0x26, 0x60, 0x2F, 0x21, 0x91, + 0xBC, 0x8C, 0x53, 0x7C, 0x76, 0xEF, 0x8F, 0xE7, 0xE6, 0x1D, 0xA9, 0x32, + 0x2C, 0x23, 0x81, 0xF9, 0x07, 0x88, 0xB3, 0xD7, 0xBE, 0x83, 0x1A, 0xE4, + 0x02, 0x5A, 0x29, 0x72, 0x73, 0x2A, 0x6A, 0xBE, 0x57, 0x3A, 0x05, 0x89, + 0xD1, 0xD8, 0x26, 0x9B, 0xCF, 0x01, 0x9F, 0xA4, 0xAB, 0xC1, 0x53, 0x62, + 0x83, 0xE9, 0x3D, 0xE5, 0x7C, 0xA4, 0x2A, 0x98, 0x95, 0x57, 0x19, 0x45, + 0xE3, 0x54, 0x43, 0xD4, 0x39, 0x51, 0x3B, 0x27, 0x8E, 0xB9, 0x33, 0x90, + 0xEF, 0x0E, 0xAD, 0xD2, 0xE6, 0x7A, 0x2A, 0x00, 0xEB, 0x84, 0x3C, 0xE8, + 0x97, 0x1F, 0x0A, 0xAB, 0x56, 0x0F, 0x9D, 0xB7, 0xD1, 0x67, 0x64, 0x24, + 0xF9, 0x89, 0xE1, 0xB6, 0x1B, 0xEE, 0xB7, 0xA8, 0xDD, 0x03, 0x40, 0xB0, + 0xEB, 0x2D, 0x29, 0x53, 0x81, 0x8B, 0x0C, 0x67, 0x53, 0x5E, 0xD3, 0xD5, + 0xC5, 0xE6, 0x7C, 0x12, 0xE6, 0xBB, 0x34, 0x24, 0xF1, 0x5B, 0x05, 0xBA, + 0x6E, 0x16, 0xA7, 0xA9, 0x31, 0xFB, 0x47, 0xE1, 0xFE, 0x67, 0x07, 0xF9, + 0x96, 0x34, 0x5A, 0x3E, 0x95, 0xAD, 0x64, 0x16, 0xE9, 0xD8, 0x72, 0x58, + 0x90, 0x67, 0x52, 0xFE, 0x08, 0x83, 0x35, 0xEB, 0x8A, 0x8C, 0xF2, 0xD0, + 0xAA, 0x79, 0x42, 0x33, 0x13, 0x8D, 0x34, 0x76, 0xFD, 0x39, 0x2C, 0xEC, + 0xCA, 0x74, 0x07, 0xC1, 0xE2, 0x47, 0xF4, 0x5C, 0x65, 0x99, 0xE4, 0xBA, + 0xC9, 0x41, 0xA4, 0x48, 0x51, 0xEF, 0x99, 0x5E, 0x99, 0x4F, 0x74, 0x56, + 0x4C, 0xA6, 0xFA, 0xC7, 0x4C, 0xC2, 0xAD, 0xA4, 0x3C, 0xF6, 0xD4, 0x8C, + 0xB6, 0x91, 0x6B, 0xB4, 0xCE, 0xFB, 0x34, 0xF7, 0xE3, 0xF6, 0x11, 0xE2, + 0x56, 0x3E, 0xA2, 0x60, 0xA3, 0x47, 0x59, 0x3E, 0xDF, 0x6A, 0x13, 0xB8, + 0xED, 0x03, 0x8B, 0x54, 0x12, 0xD1, 0x29, 0xFD, 0x06, 0x26, 0x03, 0xF5, + 0x25, 0x69, 0x05, 0x6D, 0x73, 0xE6, 0x1D, 0x28, 0xC0, 0x6F, 0x75, 0x67, + 0xCE, 0xC4, 0xF7, 0x31, 0xBB, 0x21, 0x61, 0xB1, 0xC4, 0x5D, 0x36, 0x50, + 0xEC, 0xBE, 0x23, 0xEE, 0x47, 0x62, 0x82, 0x6B, 0xE9, 0x79, 0xCE, 0xAF, + 0x76, 0x6A, 0xD1, 0xFC, 0x79, 0x5E, 0xE8, 0x1E, 0xD8, 0x8F, 0xF9, 0x63, + 0x5F, 0x09, 0x1A, 0x21, 0x93, 0x09, 0x90, 0x15, 0x62, 0xDE, 0x69, 0x65, + 0x8D, 0xA3, 0xAC, 0x79, 0x71, 0xA1, 0xBB, 0xA9, 0xCF, 0x45, 0x89, 0x15, + 0x1B, 0x7D, 0x49, 0x37, 0x56, 0x2D, 0x52, 0xF1, 0x66, 0x8F, 0x03, 0xA1, + 0xE3, 0x93, 0x8C, 0xAC, 0xB3, 0x77, 0x89, 0x69, 0x41, 0x23, 0xE4, 0x17, + 0xEE, 0x8E, 0x73, 0x06, 0xE4, 0xDC, 0x95, 0x49, 0xA6, 0x30, 0xCD, 0x1B, + 0x30, 0x42, 0xD9, 0x06, 0xF9, 0x5C, 0x8A, 0x50, 0xBB, 0xA0, 0xA8, 0xEF, + 0xD3, 0xA1, 0x83, 0xF1, 0xC1, 0x77, 0x4C, 0x4B, 0x7B, 0xCC, 0xEF, 0xE4, + 0xB4, 0x4D, 0x50, 0x01, 0x1B, 0x44, 0x33, 0xFD, 0xEF, 0xB5, 0x10, 0x72, + 0x92, 0x3E, 0x96, 0x61, 0xAB, 0x20, 0x7C, 0x38, 0xCB, 0xD7, 0x79, 0xA3, + 0x7A, 0x35, 0x87, 0xFA, 0xC6, 0x5E, 0xB8, 0x9E, 0x2C, 0xE5, 0x96, 0xBA, + 0x6E, 0xF1, 0xC3, 0x63, 0x92, 0x65, 0xEE, 0x05, 0x5B, 0x13, 0xFA, 0xE8, + 0x8B, 0xE7, 0xCB, 0x73, 0xB9, 0xC9, 0x0F, 0x60, 0xC6, 0x36, 0x1D, 0x8F, + 0x9C, 0xC0, 0x83, 0x1A, 0xB4, 0x34, 0xDE, 0xF6, 0x13, 0x4E, 0x58, 0x15, + 0x3D, 0xD6, 0x21, 0x5F, 0xE6, 0x21, 0x25, 0x15, 0x07, 0xEF, 0xD7, 0x06, + 0x5D, 0x9A, 0x59, 0xC2, 0x9F, 0x2D, 0x5A, 0xE4, 0x21, 0x19, 0x02, 0xF2, + 0x01, 0x5E, 0xC2, 0x80, 0xAB, 0x8D, 0x96, 0x38, 0x0F, 0x43, 0x71, 0x61, + 0x17, 0x72, 0x1E, 0x16, 0x3E, 0x4B, 0xE1, 0xA0, 0xB5, 0x22, 0xFB, 0x74, + 0xED, 0x4F, 0xEF, 0x4E, 0x56, 0x8A, 0x52, 0x5D, 0x76, 0x60, 0x9D, 0xE2, + 0x8B, 0xC0, 0xEC, 0xF3, 0x05, 0x2F, 0x59, 0xE5, 0xC0, 0x68, 0x02, 0xE9, + 0x77, 0x17, 0x86, 0x7D, 0xC6, 0x71, 0xA7, 0xF1, 0x44, 0x50, 0xB3, 0xFB, + 0xB6, 0x27, 0x23, 0x57, 0x5E, 0xCA, 0x18, 0xAA, 0xA7, 0x7C, 0xCD, 0xE7, + 0xEA, 0xB9, 0xA9, 0xB8, 0xA0, 0x99, 0xF0, 0xED, 0xF1, 0xF8, 0x4D, 0x11, + 0xFA, 0x04, 0x75, 0xA7, 0x41, 0xC5, 0xB3, 0xFB, 0x37, 0x46, 0x14, 0xBF, + 0x89, 0xAB, 0x33, 0x55, 0x86, 0x92, 0x36, 0x2F, 0xF6, 0xF1, 0x7B, 0x60, + 0x8D, 0xA9, 0x85, 0x48, 0xF5, 0x49, 0x46, 0xD9, 0xB3, 0x18, 0xB9, 0x1E, + 0x3F, 0x09, 0x87, 0x33, 0x23, 0x72, 0xE8, 0x4F, 0x48, 0xC9, 0xD7, 0x30, + 0x1C, 0xF0, 0x7B, 0x88, 0xF9, 0xAE, 0x5C, 0x23, 0x42, 0xC8, 0x3D, 0xD4, + 0xA4, 0xA9, 0x8F, 0xBA, 0x9E, 0xFD, 0x6F, 0xC7, 0x10, 0x4F, 0xFD, 0xA5, + 0xAC, 0xA4, 0xBF, 0xDB, 0x1D, 0xFB, 0x67, 0xAA, 0x47, 0xE1, 0x8E, 0x47, + 0xCC, 0x51, 0xE3, 0xAD, 0x80, 0x63, 0x2A, 0x5A, 0xEF, 0x3B, 0x6B, 0x7E, + 0x5B, 0xC6, 0x6F, 0x84, 0x3E, 0xD9, 0xAE, 0x3A, 0x7B, 0x2F, 0xED, 0x23, + 0x57, 0x56, 0x59, 0x5A, 0x35, 0x11, 0x0D, 0xFD, 0x43, 0x06, 0x6C, 0xB3, + 0x26, 0xDA, 0xB4, 0xEA, 0x84, 0x94, 0xB8, 0x4F, 0x60, 0xAC, 0x3F, 0x2E, + 0x9D, 0xF0, 0x1B, 0xD5, 0xCA, 0xF6, 0x97, 0x82, 0x7A, 0x45, 0x76, 0xCC, + 0xF2, 0x63, 0x3E, 0xED, 0x80, 0x63, 0xB2, 0x1E, 0x18, 0x21, 0x85, 0x84, + 0x89, 0xF8, 0xB0, 0x31, 0x4F, 0x12, 0x76, 0x8E, 0x3B, 0x32, 0x54, 0x57, + 0x95, 0x26, 0x0E, 0xB0, 0x28, 0x65, 0xC3, 0x31, 0x18, 0x5B, 0xD1, 0x8E, + 0x32, 0x53, 0x40, 0x57, 0xD5, 0x90, 0x16, 0xE6, 0x23, 0xAE, 0xAF, 0x59, + 0xD1, 0x8B, 0xDC, 0x3D, 0x34, 0xA5, 0x56, 0xCA, 0x61, 0xF2, 0xEE, 0xF4, + 0xD2, 0x67, 0x82, 0x54, 0x5F, 0x5A, 0x05, 0x94, 0x24, 0xDF, 0xD9, 0xE3, + 0x72, 0x20, 0x30, 0x6C, 0x58, 0x25, 0x66, 0x12, 0x81, 0x75, 0x46, 0x51, + 0xAB, 0xCB, 0x0F, 0xEC, 0x77, 0x84, 0x3D, 0xB1, 0xA7, 0x4A, 0xF5, 0x35, + 0xAF, 0xF2, 0x01, 0x6C, 0x7F, 0x42, 0xA9, 0x28, 0x76, 0xE4, 0x6E, 0xF2, + 0x4B, 0x7E, 0xD0, 0x7D, 0x57, 0x2E, 0x25, 0x4F, 0x90, 0x8A, 0x74, 0xB2, + 0x87, 0x4C, 0x9C, 0x75, 0x5A, 0xBE, 0xEF, 0x46, 0xA1, 0x0D, 0x20, 0xF5, + 0x94, 0x7A, 0xA7, 0x72, 0x0A, 0x6E, 0xBC, 0x80, 0x01, 0x14, 0x02, 0x00, + 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, + 0x6D, 0x61, 0x72, 0x6B, 0x0D, 0x80, 0x03, +}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerif.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerif.cpp new file mode 100644 index 000000000000..5fa276de4e3e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerif.cpp @@ -0,0 +1,1632 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitSerifFontData[19469] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xe, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x69, 0x66, 0x4f, 0x54, 0x46, 0x0, 0x1, + 0x1, 0x1, 0x26, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, + 0xf8, 0x1d, 0x3, 0xf8, 0x18, 0x4, 0xfb, 0x3c, 0xfb, 0x8e, 0xfa, 0x7c, + 0xfa, 0x2, 0x5, 0x1c, 0x7, 0x9f, 0xf, 0x1c, 0x8, 0xf6, 0x11, 0xb6, + 0x1c, 0x44, 0xa3, 0x12, 0x0, 0x3, 0x1, 0x1, 0x5, 0x2f, 0x3e, 0x45, + 0x75, 0x72, 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4f, 0x54, 0x46, + 0x0, 0x7b, 0x2, 0x0, 0x1, 0x0, 0x9, 0x0, 0x11, 0x0, 0x24, 0x0, + 0x2c, 0x0, 0x4a, 0x0, 0x54, 0x0, 0x60, 0x0, 0x68, 0x0, 0x71, 0x0, + 0x86, 0x0, 0x91, 0x0, 0x9e, 0x0, 0xb9, 0x0, 0xc1, 0x0, 0xe2, 0x0, + 0xff, 0x1, 0xb, 0x1, 0x1d, 0x1, 0x25, 0x1, 0x33, 0x1, 0x4e, 0x1, + 0x55, 0x1, 0x68, 0x1, 0x7a, 0x1, 0x7f, 0x1, 0x90, 0x1, 0x94, 0x1, + 0x9d, 0x1, 0xa9, 0x1, 0xb9, 0x1, 0xc6, 0x1, 0xfb, 0x2, 0x14, 0x2, + 0x1a, 0x2, 0x34, 0x2, 0x3c, 0x2, 0x48, 0x2, 0x59, 0x2, 0x63, 0x2, + 0x71, 0x2, 0x84, 0x2, 0x89, 0x2, 0x92, 0x2, 0xac, 0x2, 0xb6, 0x2, + 0xc2, 0x2, 0xe6, 0x2, 0xf0, 0x2, 0xfe, 0x3, 0x11, 0x3, 0x19, 0x3, + 0x20, 0x3, 0x23, 0x3, 0x2a, 0x3, 0x49, 0x3, 0x53, 0x3, 0x71, 0x3, + 0x8e, 0x3, 0x9c, 0x3, 0xa2, 0x3, 0xa8, 0x3, 0xc0, 0x3, 0xd8, 0x3, + 0xef, 0x3, 0xf7, 0x3, 0xfe, 0x4, 0x2, 0x4, 0x17, 0x4, 0x2a, 0x4, + 0x30, 0x4, 0x44, 0x4, 0x57, 0x4, 0x62, 0x4, 0x69, 0x4, 0x7b, 0x4, + 0x87, 0x4, 0x98, 0x4, 0xa3, 0x4, 0xb3, 0x4, 0xb9, 0x4, 0xbf, 0x4, + 0xc5, 0x4, 0xcb, 0x4, 0xd8, 0x4, 0xe7, 0x4, 0xf1, 0x4, 0xfb, 0x5, + 0xa, 0x5, 0x19, 0x5, 0x22, 0x5, 0x28, 0x5, 0x2d, 0x5, 0x3b, 0x5, + 0x3f, 0x5, 0x4c, 0x5, 0x59, 0x5, 0x5e, 0x5, 0x62, 0x5, 0x6e, 0x5, + 0x74, 0x5, 0x77, 0x5, 0x82, 0x5, 0x8d, 0x5, 0x94, 0x5, 0x99, 0x5, + 0x9e, 0x5, 0xa3, 0x5, 0xad, 0x5, 0xb7, 0x5, 0xc1, 0x5, 0xcb, 0x5, + 0xd3, 0x5, 0xdc, 0x5, 0xe5, 0x5, 0xee, 0x5, 0xf7, 0x6, 0x0, 0x6, + 0x5, 0x6, 0xc, 0x6, 0x12, 0x6, 0x18, 0x6, 0x1d, 0x6, 0x21, 0x21, + 0xa, 0x78, 0x5f, 0x6c, 0x2a, 0x1d, 0xb, 0x15, 0xb3, 0x6, 0xf7, 0x2e, + 0x22, 0x1d, 0xb, 0xec, 0x5, 0x95, 0x91, 0x9f, 0x98, 0xa2, 0x1a, 0x8f, + 0x8a, 0xa7, 0x6b, 0x7d, 0x84, 0x8b, 0x74, 0x74, 0x1e, 0xb, 0x36, 0x1d, + 0x26, 0xa, 0x3e, 0x7a, 0xa, 0xb, 0x70, 0x1d, 0x88, 0x7f, 0x6c, 0x7c, + 0x1e, 0x86, 0x82, 0x6c, 0x74, 0x75, 0x1b, 0x66, 0x6e, 0xaa, 0xba, 0x1f, + 0x8d, 0x7, 0xad, 0x96, 0xc3, 0xf7, 0x2b, 0xbd, 0x1e, 0x2a, 0xa, 0xb, + 0x2b, 0x1d, 0xfb, 0x11, 0xf7, 0x3b, 0x5, 0x4d, 0x6, 0xb, 0x37, 0x1d, + 0x4e, 0xfb, 0x4d, 0xfb, 0x22, 0xd7, 0x39, 0x2b, 0xa, 0xb, 0x2d, 0xa, + 0x8a, 0x81, 0x1d, 0x9c, 0x57, 0xa, 0x24, 0x1d, 0x40, 0xa, 0xef, 0xfb, + 0x29, 0x1e, 0xb, 0x70, 0xa, 0xfb, 0x1f, 0x69, 0x1d, 0xf7, 0xf, 0x61, + 0x1d, 0xf7, 0x10, 0x34, 0xa, 0x32, 0x71, 0x1d, 0x3a, 0x5e, 0xa, 0xb, + 0x4c, 0x74, 0x72, 0x19, 0x79, 0x78, 0x7a, 0x7f, 0x2e, 0xa, 0xb, 0x15, + 0xad, 0x6, 0xf7, 0xd, 0xf2, 0xf7, 0xe, 0x24, 0x5, 0xad, 0x6, 0xb, + 0x6d, 0x1b, 0x49, 0x82, 0xc9, 0x99, 0x1f, 0xf7, 0xda, 0xfb, 0x26, 0x7d, + 0x7, 0xa9, 0x89, 0xab, 0x7f, 0x4f, 0x1a, 0xfb, 0x86, 0x7, 0x21, 0xd9, + 0x73, 0xb4, 0xb, 0x2e, 0x1d, 0x9e, 0xfb, 0x7c, 0x50, 0x1d, 0xb, 0x15, + 0xd7, 0x86, 0x99, 0x76, 0x41, 0x1a, 0xfb, 0xc2, 0x7, 0x4f, 0x8b, 0xfb, + 0x57, 0xf7, 0x8c, 0xf7, 0x97, 0x8b, 0xf7, 0x50, 0xdb, 0x1e, 0xf7, 0x8f, + 0x7, 0xf4, 0x9c, 0xa4, 0xd8, 0x93, 0x1e, 0xb, 0xa8, 0xf7, 0x78, 0x15, + 0xfb, 0x1b, 0xe5, 0x24, 0x65, 0x1d, 0xf7, 0x1f, 0xee, 0xf7, 0x25, 0x2d, + 0xe2, 0xfb, 0x17, 0xfb, 0x1a, 0x39, 0xfb, 0x1, 0xfb, 0xf, 0x1e, 0xe5, + 0xb, 0x5b, 0xa, 0xf7, 0x6a, 0x77, 0x85, 0xa, 0xf7, 0xe6, 0x29, 0x1d, + 0xb, 0x9b, 0x16, 0xf7, 0x81, 0x9a, 0x6, 0x46, 0x8f, 0x86, 0xa6, 0xcd, + 0x1a, 0xf7, 0xed, 0x7, 0x87, 0x8e, 0xb, 0x2d, 0x1d, 0x4f, 0x3f, 0xfb, + 0x13, 0x49, 0x1d, 0xa0, 0x1e, 0xf7, 0x1b, 0x4e, 0xa, 0x6, 0x88, 0xf7, + 0x23, 0x5, 0xfc, 0xa7, 0xb, 0x8c, 0xa, 0x86, 0x83, 0x70, 0x75, 0x1e, + 0x7f, 0x7c, 0x70, 0x7e, 0x75, 0x1b, 0x66, 0x6e, 0xaa, 0xba, 0xaf, 0x96, + 0xc3, 0xf7, 0x2b, 0xbd, 0x1f, 0x4d, 0xa, 0xb, 0x7d, 0x1d, 0xa1, 0xa1, + 0x3d, 0xa, 0xb, 0x39, 0x1d, 0x8b, 0xdc, 0x1f, 0xf7, 0x65, 0x7, 0xf7, + 0x24, 0x89, 0xde, 0x8a, 0xa4, 0x7d, 0x97, 0x3b, 0x19, 0xb, 0xe9, 0xf7, + 0x9f, 0x15, 0xf7, 0xcb, 0x6, 0xf7, 0x17, 0x80, 0x44, 0xc9, 0x2d, 0x1b, + 0x3b, 0xfb, 0x10, 0xb, 0x8d, 0x1b, 0x39, 0xa, 0xb, 0xb8, 0xf7, 0x3d, + 0x5, 0x6f, 0x6, 0x26, 0x5f, 0x59, 0x6d, 0xfb, 0x11, 0x1b, 0xfb, 0x29, + 0x8b, 0xb, 0x3b, 0x1d, 0xa2, 0xb, 0x15, 0xb3, 0x6, 0xfb, 0x27, 0xf7, + 0x28, 0x5, 0xb, 0xaa, 0xb1, 0x37, 0xa, 0xbf, 0x89, 0xa, 0xbd, 0xac, + 0xb0, 0x1e, 0xb, 0x8e, 0xab, 0x15, 0xe3, 0x9b, 0xb2, 0xb0, 0xc2, 0x1b, + 0xda, 0x95, 0x3e, 0x5b, 0x92, 0x1f, 0xb, 0xfb, 0x8, 0x5c, 0x44, 0x57, + 0x1d, 0x1f, 0x94, 0x86, 0x9a, 0x9a, 0x1a, 0xb, 0x3, 0x94, 0x16, 0xf8, + 0xc8, 0x6, 0xa3, 0xf7, 0x44, 0x5, 0x74, 0x6, 0x42, 0x75, 0x6e, 0x4a, + 0xfb, 0x17, 0x1b, 0xfb, 0x8b, 0x6, 0xf8, 0x44, 0xf8, 0xf5, 0x5, 0x9a, + 0xfc, 0xa2, 0x7, 0x77, 0xfb, 0x3f, 0x5, 0xa5, 0x6, 0xce, 0x98, 0xa1, + 0xcd, 0xf7, 0x23, 0x1b, 0xf7, 0x67, 0x6, 0xfc, 0x49, 0xfc, 0xf5, 0x5, + 0xb, 0xf7, 0xb3, 0xf7, 0x9, 0x15, 0x3b, 0xa, 0xf7, 0x6, 0xfb, 0x80, + 0x18, 0x99, 0x6c, 0xbb, 0x2f, 0x7c, 0x1a, 0x7b, 0x63, 0xfb, 0x1e, 0x57, + 0x1e, 0xb, 0xa7, 0xa7, 0x76, 0x55, 0x1d, 0xb, 0x15, 0x6d, 0xb9, 0xf7, + 0x2c, 0xfb, 0x38, 0x98, 0x1b, 0x91, 0x90, 0x8f, 0x92, 0x98, 0x6f, 0xb3, + 0x79, 0xa3, 0x1f, 0x75, 0xa9, 0x64, 0xb7, 0x75, 0xa9, 0xb, 0x65, 0xad, + 0x4d, 0x1d, 0x72, 0x99, 0xa, 0xb, 0xfb, 0x7a, 0x1e, 0xf7, 0x6, 0x8c, + 0x15, 0xf7, 0x78, 0xf7, 0x3, 0xb, 0x7a, 0xae, 0x1f, 0x7d, 0xa8, 0xa0, + 0x7c, 0x52, 0x1d, 0x63, 0x7a, 0x7d, 0x81, 0x70, 0x1b, 0x7c, 0xb, 0x3c, + 0xa, 0xae, 0x7e, 0xa5, 0x92, 0x91, 0x88, 0x1d, 0xb, 0xfc, 0x2a, 0x35, + 0xa, 0xfb, 0x87, 0x7, 0x6e, 0x73, 0x7c, 0x6e, 0x89, 0x1e, 0xb, 0x51, + 0xa, 0x6a, 0x98, 0x71, 0x84, 0x83, 0x87, 0x8a, 0x88, 0x1e, 0x8a, 0x87, + 0x88, 0x8a, 0x89, 0x64, 0xa, 0xb, 0x47, 0xa, 0x88, 0xa, 0xe, 0x15, + 0x43, 0xa, 0xf7, 0x5c, 0x16, 0x43, 0xa, 0xe, 0x9e, 0xfb, 0x6f, 0x78, + 0x7, 0xaa, 0xb1, 0x89, 0x75, 0x1d, 0xfb, 0x76, 0xfb, 0x28, 0xf7, 0x72, + 0x75, 0xa, 0x8c, 0xb9, 0x8d, 0x1e, 0x9e, 0xfb, 0xac, 0xb, 0x1, 0xa8, + 0xe5, 0xf7, 0x99, 0xe5, 0x3, 0x2f, 0x1d, 0xb, 0x7b, 0xa0, 0xa0, 0xae, + 0x9c, 0xb0, 0xaa, 0x71, 0xa5, 0x6d, 0x6d, 0xb, 0xb1, 0xa5, 0xa1, 0xa5, + 0xab, 0x1a, 0xa8, 0x6f, 0xbf, 0x37, 0x5f, 0x55, 0x75, 0x42, 0x69, 0x1e, + 0xa4, 0x79, 0x5, 0xa4, 0x9d, 0x9f, 0xab, 0xbb, 0x1b, 0xb5, 0x9a, 0x73, + 0x71, 0x65, 0x5c, 0x72, 0x50, 0x79, 0x1f, 0xe, 0xe2, 0x81, 0xc5, 0xf7, + 0x95, 0xf7, 0x2f, 0x73, 0xa3, 0xb, 0x78, 0x7, 0xd1, 0x87, 0xa3, 0x70, + 0x20, 0x1a, 0xfb, 0x98, 0x7, 0xfb, 0x1f, 0xb, 0x7e, 0x1b, 0x85, 0x86, + 0x87, 0x84, 0x7e, 0xa7, 0x63, 0x9d, 0x73, 0x1f, 0xa1, 0x6d, 0xb2, 0x5f, + 0xa1, 0x6d, 0xb, 0xaa, 0x1b, 0xd9, 0x9d, 0xd3, 0x65, 0xa, 0xb, 0x8d, + 0x99, 0x1b, 0x9b, 0x9e, 0x8a, 0xb, 0x33, 0xa, 0xe, 0xa1, 0x6f, 0x6f, + 0x76, 0x62, 0x1d, 0xb, 0x6, 0xf7, 0xa1, 0xf8, 0x29, 0x5, 0x9a, 0xfb, + 0xef, 0x7, 0x88, 0xfb, 0xa, 0x5, 0x9d, 0x6, 0xc1, 0x92, 0x99, 0xad, + 0xd4, 0x1b, 0xf7, 0x14, 0x6, 0xfb, 0x9e, 0xfc, 0x29, 0x5, 0xb, 0x63, + 0x7b, 0x97, 0x6f, 0xaa, 0xa5, 0x9e, 0xa1, 0xa0, 0xb, 0xf7, 0x1, 0x3, + 0x9b, 0x16, 0xf7, 0xb0, 0x6, 0xf7, 0xc6, 0xda, 0xf7, 0x58, 0xf7, 0x19, + 0xf7, 0x74, 0xfb, 0x33, 0xf7, 0x1, 0xfb, 0x84, 0x1f, 0xfb, 0xa2, 0x78, + 0x6, 0xd8, 0xb, 0x5, 0x76, 0x6, 0x6a, 0x83, 0x60, 0x8b, 0x86, 0x75, + 0x54, 0xac, 0x32, 0x1b, 0xfb, 0x40, 0xfb, 0x3c, 0xfb, 0xd, 0xfb, 0x74, + 0xfb, 0x8d, 0xf7, 0x41, 0x2b, 0xf7, 0x35, 0xb, 0x7b, 0xa, 0xf7, 0x17, + 0x77, 0xdd, 0x77, 0xf7, 0x8, 0xb4, 0xf7, 0x94, 0xb1, 0xb, 0x80, 0x1d, + 0xf7, 0x6c, 0xb4, 0xb, 0x5b, 0x1d, 0xf8, 0x35, 0x77, 0xb, 0xf1, 0x3, + 0x97, 0x16, 0xf8, 0xae, 0x6, 0xbb, 0xf7, 0x42, 0x5, 0x72, 0x6, 0xfb, + 0x17, 0x52, 0x4b, 0x87, 0xfb, 0x2a, 0x1b, 0x38, 0x79, 0xb, 0x78, 0x7, + 0xb8, 0x87, 0x9a, 0x88, 0xf1, 0xfb, 0x2a, 0xf7, 0x17, 0xfb, 0x54, 0x18, + 0xfb, 0x38, 0x7, 0x3f, 0x88, 0x6a, 0x29, 0x89, 0x1e, 0xb, 0x6b, 0xac, + 0xa7, 0x80, 0xb3, 0x1b, 0xf7, 0x1f, 0xd2, 0xf7, 0x20, 0xf7, 0x7, 0xf7, + 0x19, 0x3f, 0xdd, 0x32, 0x3e, 0x5d, 0x5a, 0x6f, 0xb, 0x9f, 0xd9, 0x1a, + 0xf8, 0x3c, 0x7, 0xdb, 0xb, 0xf7, 0x69, 0xf7, 0x7a, 0xfb, 0x37, 0xb, + 0x75, 0x6f, 0x1e, 0xb, 0x7d, 0x94, 0x5, 0x58, 0x69, 0x66, 0x60, 0x43, + 0x1b, 0x37, 0x46, 0xd7, 0xf7, 0x7, 0xf7, 0x27, 0xe7, 0xaa, 0xb0, 0xc0, + 0xb, 0x15, 0x6f, 0xa2, 0x74, 0xa7, 0xa7, 0xa2, 0xa2, 0xa7, 0xa7, 0x74, + 0xa2, 0x6f, 0x6f, 0x74, 0x74, 0x6f, 0x1e, 0xe, 0xf7, 0x15, 0xf7, 0x2c, + 0xd1, 0xb, 0x7, 0x89, 0xa3, 0x9e, 0x8a, 0xa3, 0x1b, 0xf4, 0xcb, 0x9d, + 0xb4, 0xb6, 0x1f, 0x9c, 0x9b, 0xb7, 0xb4, 0xd9, 0x1a, 0xb, 0x7, 0xd2, + 0x97, 0xa2, 0xd7, 0x91, 0x1e, 0x9e, 0xfb, 0xaa, 0x78, 0x7, 0xd5, 0x85, + 0x99, 0x77, 0x41, 0x1a, 0xb, 0x15, 0xbc, 0x6, 0xf8, 0x56, 0xf9, 0x46, + 0x5, 0x5d, 0x6, 0xb, 0xf7, 0x49, 0xf7, 0x49, 0xf7, 0x26, 0xb, 0x70, + 0xa1, 0x75, 0xa6, 0xa6, 0xa2, 0xa1, 0xa6, 0xa6, 0x74, 0xa2, 0x70, 0x70, + 0x75, 0x74, 0x70, 0x1e, 0xb, 0x5b, 0x7a, 0x5a, 0x7d, 0x5b, 0x6f, 0x1d, + 0x91, 0x95, 0x82, 0xa, 0xb, 0x6f, 0xa1, 0x7d, 0x1d, 0xa2, 0xa1, 0xa7, + 0xa7, 0x74, 0xa2, 0x6f, 0x6f, 0x75, 0x74, 0x6f, 0x1e, 0xb, 0x6f, 0xa0, + 0x76, 0x9a, 0x1d, 0x95, 0x1d, 0x74, 0x6f, 0x1e, 0xb, 0x6f, 0xa1, 0x7d, + 0x1d, 0x9f, 0xa1, 0xa7, 0xa7, 0x77, 0xa1, 0x6f, 0x6f, 0x75, 0x62, 0x1d, + 0xb, 0x7e, 0x19, 0x7b, 0x7, 0x8c, 0xb, 0x15, 0xfb, 0x1b, 0x7, 0x6d, + 0xb, 0xfb, 0x78, 0xfb, 0x70, 0x25, 0xb, 0xfb, 0x3, 0xfb, 0x3, 0x25, + 0xb, 0xa4, 0x9c, 0xcf, 0x8f, 0x1e, 0x9e, 0xfb, 0xae, 0x78, 0x7, 0x60, + 0xa, 0xb, 0xfb, 0x23, 0xfb, 0x2c, 0xfb, 0x1a, 0x8b, 0x66, 0x76, 0x77, + 0x8c, 0x8d, 0x78, 0x1e, 0xe, 0x6c, 0x7d, 0x84, 0x7f, 0x84, 0x80, 0x1f, + 0xfb, 0x23, 0xb, 0x81, 0xc7, 0xf8, 0x24, 0x77, 0xf7, 0x8c, 0x90, 0xa, + 0xb, 0x6d, 0x6c, 0x43, 0x44, 0xfb, 0xf, 0x1b, 0xfb, 0x12, 0xfb, 0xb, + 0xe2, 0xf7, 0x68, 0xb, 0xbc, 0xac, 0x69, 0xb7, 0x1b, 0xa6, 0x9e, 0x9c, + 0xa5, 0xa5, 0x78, 0x9c, 0x70, 0x1f, 0xb, 0xc2, 0xb8, 0xb7, 0xc2, 0xc2, + 0x5e, 0xb8, 0x54, 0xb, 0x76, 0xf9, 0x46, 0x77, 0x1, 0xb, 0x1, 0xad, + 0xf7, 0x6, 0xb, 0x8f, 0x78, 0x1b, 0x2a, 0x60, 0x49, 0x53, 0x41, 0xc2, + 0x66, 0xc9, 0x68, 0x1f, 0xb, 0x75, 0xa7, 0xa7, 0xb, 0x7, 0xf7, 0x28, + 0xf7, 0x76, 0xd0, 0xf5, 0xac, 0x8f, 0xaf, 0x8f, 0x19, 0xb, 0xb6, 0x1b, + 0xbd, 0xa1, 0x5c, 0x6d, 0x6d, 0x6c, 0x59, 0x59, 0x53, 0x1f, 0xb, 0xf8, + 0x1, 0xa0, 0x76, 0xb, 0x6e, 0x89, 0x76, 0xb, 0x66, 0x88, 0x1e, 0x7c, + 0xf7, 0x64, 0x9a, 0x7, 0x5a, 0x8f, 0x7f, 0xb, 0x15, 0xa8, 0x6, 0x9c, + 0x91, 0xb, 0x87, 0x1e, 0xe, 0xbb, 0xf7, 0xca, 0xc3, 0x12, 0xf7, 0x51, + 0xd7, 0x54, 0xdc, 0xb, 0xf7, 0x69, 0x5, 0x76, 0x6, 0x80, 0x89, 0x7c, + 0x74, 0x6f, 0xb, 0xe2, 0x81, 0xd0, 0xf7, 0x64, 0xab, 0xb, 0x8f, 0x8c, + 0x8e, 0x1e, 0xb, 0x1a, 0xfc, 0x3c, 0x7, 0xb, 0x76, 0xf9, 0x2a, 0x77, + 0xb, 0x2e, 0x6f, 0x1e, 0xa4, 0x7d, 0x5, 0xb2, 0x9b, 0xa7, 0xb, 0xf7, + 0x63, 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xa7, 0xb, 0xb6, 0x28, 0xee, + 0xef, 0xb6, 0xee, 0xd9, 0xda, 0x60, 0xb, 0xfb, 0x58, 0x76, 0xf7, 0x63, + 0xab, 0xf8, 0xe, 0xc7, 0xb, 0x85, 0x1a, 0x84, 0x8e, 0x87, 0x93, 0x1e, + 0xe, 0x73, 0xfb, 0x30, 0x76, 0xf9, 0xe9, 0x77, 0x1, 0xb, 0x73, 0xf8, + 0x5a, 0x76, 0xf7, 0x87, 0x77, 0x1, 0xb, 0x73, 0xf8, 0xa4, 0x76, 0xf7, + 0x3f, 0x77, 0x1, 0xb, 0x73, 0xfb, 0x30, 0xa4, 0xf9, 0x94, 0xa4, 0x1, + 0xb, 0xa8, 0x73, 0xa3, 0x6e, 0x6e, 0x74, 0x73, 0x6e, 0xb, 0xa1, 0x3d, + 0xa, 0x77, 0xb, 0x1a, 0x92, 0x88, 0x8f, 0x83, 0x1e, 0xe, 0xf7, 0x1f, + 0xe8, 0xf7, 0x1f, 0xb, 0xfb, 0x13, 0xfb, 0x42, 0x8b, 0xb, 0xf7, 0x5b, + 0xa0, 0x76, 0xb, 0xa7, 0xa7, 0xa0, 0xb, 0x1, 0x0, 0x1, 0x6, 0x0, + 0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, + 0x67, 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x66, 0x0, 0x0, + 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, + 0x97, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0, 0xa1, 0x0, 0x0, + 0x9c, 0x0, 0x0, 0xa4, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, + 0x98, 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0, 0x85, 0x0, 0x0, + 0x96, 0x0, 0x0, 0x8f, 0x0, 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, + 0x9b, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0, 0xae, 0x0, 0x0, + 0xab, 0x1, 0x0, 0xb0, 0x0, 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, + 0x8a, 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0, + 0xb9, 0x0, 0x0, 0xb6, 0x2, 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, + 0xbe, 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0, + 0xa8, 0x0, 0x0, 0x8d, 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, + 0xc5, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0, 0xcb, 0x0, 0x0, + 0xc8, 0x1, 0x0, 0xcd, 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, + 0x90, 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0, + 0xd6, 0x0, 0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, + 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0, 0xda, 0x0, 0x0, + 0x9f, 0x0, 0x0, 0x93, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, + 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x91, 0x0, 0x0, + 0x8c, 0x0, 0x0, 0x92, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0, 0xe4, 0x0, 0x0, + 0x65, 0x0, 0x0, 0x7e, 0x0, 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, + 0x84, 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x86, 0x0, 0x0, + 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, + 0x75, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x76, 0x0, 0x0, + 0x70, 0x1, 0x0, 0x74, 0x0, 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, + 0x63, 0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0, 0xa6, 0x0, 0x0, + 0x6d, 0x1, 0x0, 0xe6, 0x2, 0x0, 0x1, 0x0, 0x3, 0x0, 0x5, 0x0, + 0x47, 0x0, 0x61, 0x0, 0xcc, 0x1, 0x51, 0x1, 0xe0, 0x2, 0x97, 0x2, + 0xaa, 0x2, 0xdd, 0x3, 0x14, 0x3, 0xb8, 0x3, 0xdd, 0x4, 0x0, 0x4, + 0x10, 0x4, 0x1f, 0x4, 0x34, 0x4, 0x7e, 0x4, 0xb4, 0x5, 0x3, 0x5, + 0x71, 0x5, 0xa1, 0x6, 0x12, 0x6, 0x72, 0x6, 0x9b, 0x7, 0x10, 0x7, + 0x7d, 0x7, 0x98, 0x7, 0xf6, 0x8, 0x1a, 0x8, 0x3e, 0x8, 0x5d, 0x8, + 0xc5, 0x9, 0x7e, 0x9, 0xc2, 0xa, 0x4a, 0xa, 0x7e, 0xa, 0xb5, 0xa, + 0xfc, 0xb, 0x54, 0xb, 0xc1, 0xc, 0x9, 0xc, 0x11, 0xc, 0x5f, 0xc, + 0xd3, 0xc, 0xf4, 0xd, 0x4c, 0xd, 0x67, 0xd, 0x8f, 0xd, 0xc6, 0xe, + 0x30, 0xe, 0xa4, 0xe, 0xfe, 0xf, 0x44, 0xf, 0x58, 0xf, 0xa3, 0x10, + 0x30, 0x10, 0xb0, 0x10, 0xfa, 0x11, 0x6, 0x11, 0x27, 0x11, 0x3e, 0x11, + 0x60, 0x11, 0x7f, 0x11, 0x8f, 0x11, 0xab, 0x12, 0x4, 0x12, 0x54, 0x12, + 0x94, 0x13, 0x3, 0x13, 0x1c, 0x13, 0x6b, 0x14, 0x1a, 0x14, 0x87, 0x14, + 0xbb, 0x15, 0xd, 0x15, 0x90, 0x15, 0xb2, 0x16, 0x4c, 0x16, 0x6a, 0x16, + 0xa7, 0x16, 0xeb, 0x17, 0x55, 0x17, 0xb0, 0x18, 0x17, 0x18, 0x5f, 0x18, + 0x85, 0x18, 0xdb, 0x19, 0x6e, 0x19, 0xf4, 0x1a, 0x17, 0x1a, 0x28, 0x1a, + 0x79, 0x1a, 0x91, 0x1a, 0xdc, 0x1b, 0x1c, 0x1b, 0x5e, 0x1b, 0xe1, 0x1c, + 0x8e, 0x1d, 0x10, 0x1d, 0x94, 0x1d, 0xae, 0x1e, 0x5f, 0x1e, 0x75, 0x1e, + 0xce, 0x1f, 0x44, 0x1f, 0x5e, 0x1f, 0x81, 0x1f, 0xf9, 0x20, 0x9, 0x20, + 0x40, 0x20, 0x7b, 0x20, 0x99, 0x20, 0xb6, 0x20, 0xbd, 0x21, 0x2f, 0x21, + 0x5e, 0x21, 0x71, 0x21, 0xb4, 0x21, 0xcf, 0x22, 0x8, 0x22, 0x34, 0x22, + 0x59, 0x22, 0x8c, 0x22, 0xba, 0x23, 0x20, 0x23, 0x3d, 0x23, 0x58, 0x23, + 0x6b, 0x23, 0xb7, 0x23, 0xd5, 0x23, 0xff, 0x24, 0xb1, 0x25, 0xe, 0x25, + 0x27, 0x25, 0x3c, 0x25, 0x4f, 0x25, 0x83, 0x25, 0x96, 0x25, 0xc1, 0x25, + 0xf5, 0x26, 0x26, 0x26, 0x66, 0x26, 0x99, 0x26, 0xa1, 0x26, 0xa9, 0x26, + 0xbb, 0x26, 0xf3, 0x27, 0x23, 0x27, 0x5b, 0x27, 0xd6, 0x28, 0x32, 0x28, + 0x44, 0x28, 0x5a, 0x28, 0x93, 0x28, 0xac, 0x28, 0xf0, 0x29, 0x72, 0x29, + 0xab, 0x29, 0xf5, 0x2a, 0x6, 0x2a, 0x31, 0x2a, 0x5c, 0x2a, 0xc0, 0x2b, + 0x65, 0x2b, 0xc1, 0x2b, 0xdf, 0x2b, 0xf6, 0x2c, 0xe, 0x2c, 0x2d, 0x2c, + 0x39, 0x2c, 0x44, 0x2c, 0x50, 0x2c, 0x6a, 0x2c, 0xda, 0x2d, 0x29, 0x2d, + 0x5a, 0x2d, 0x9b, 0x2d, 0xbd, 0x2d, 0xfa, 0x2e, 0x2e, 0x2e, 0x60, 0x2e, + 0xd8, 0x2e, 0xec, 0x2e, 0xfa, 0x2f, 0xf, 0x2f, 0x36, 0x2f, 0x51, 0x2f, + 0x90, 0x2f, 0xae, 0x2f, 0xb5, 0x2f, 0xe8, 0x30, 0x22, 0x30, 0xda, 0x31, + 0x68, 0x31, 0xbd, 0x32, 0x2c, 0x32, 0x68, 0x32, 0x80, 0x32, 0x99, 0x33, + 0xc, 0x33, 0x1b, 0x33, 0x23, 0x33, 0x4a, 0x33, 0x5b, 0x33, 0x91, 0x33, + 0xc3, 0x33, 0xe9, 0x34, 0x4, 0x34, 0xd, 0x34, 0x18, 0x34, 0x37, 0x34, + 0x4e, 0x34, 0x6f, 0x34, 0x89, 0x34, 0xa1, 0x34, 0xdc, 0x35, 0x75, 0x36, + 0x33, 0x36, 0x51, 0x36, 0x85, 0x37, 0x3a, 0x37, 0x50, 0x37, 0x70, 0x37, + 0x8b, 0x38, 0x1a, 0x38, 0xbf, 0x38, 0xd2, 0x39, 0x5c, 0x39, 0xdd, 0x20, + 0xe, 0x20, 0xe, 0x73, 0x82, 0xf5, 0xf8, 0xd7, 0x77, 0x1, 0xf7, 0x16, + 0xf7, 0x0, 0x14, 0x20, 0xf7, 0x44, 0xf7, 0x44, 0x15, 0x9c, 0x6, 0xa1, + 0xf7, 0x50, 0xa2, 0xf7, 0xe, 0xd8, 0x1a, 0xca, 0x82, 0xbd, 0x5d, 0x5f, + 0x82, 0x58, 0x4e, 0x3d, 0xa3, 0xfb, 0x10, 0xa1, 0xfb, 0x4e, 0x1e, 0x5d, + 0xfb, 0x18, 0x15, 0x6e, 0xa3, 0x73, 0xa8, 0xa8, 0xa5, 0xa2, 0xa8, 0xa8, + 0x71, 0xa4, 0x6e, 0x6e, 0x73, 0x73, 0x6e, 0x1e, 0xe, 0xbe, 0xf8, 0x58, + 0x76, 0xf7, 0x89, 0x77, 0x1, 0xd8, 0xe0, 0xdf, 0xe0, 0x3, 0xf7, 0xaa, + 0xf8, 0x43, 0x15, 0x44, 0xa, 0xfb, 0x3d, 0x16, 0x44, 0xa, 0xe, 0xa0, + 0x76, 0xf7, 0x6d, 0xbd, 0xf7, 0x21, 0xbc, 0xf7, 0x61, 0x77, 0x12, 0x8d, + 0xf8, 0x85, 0x17, 0xde, 0x16, 0xbf, 0x6, 0xaf, 0xf7, 0x6d, 0x5, 0xf7, + 0x1b, 0x6, 0x6b, 0xfb, 0x6d, 0x5, 0xc1, 0x6, 0xab, 0xf7, 0x6d, 0x5, + 0xf7, 0x1, 0xbd, 0x26, 0x6, 0x9f, 0xf7, 0x21, 0x5, 0xf7, 0x3, 0xbc, + 0x25, 0x6, 0xab, 0xf7, 0x61, 0x5, 0x55, 0x6, 0x6c, 0xfb, 0x61, 0x5, + 0xfb, 0x1c, 0x6, 0xaa, 0xf7, 0x61, 0x5, 0x54, 0x6, 0x6b, 0xfb, 0x61, + 0x5, 0xfb, 0xc, 0x5a, 0xf7, 0x7, 0x6, 0x75, 0xfb, 0x21, 0x5, 0xfb, + 0xf, 0x59, 0xf7, 0x7, 0x6, 0x13, 0x60, 0xc8, 0xbd, 0x15, 0x9f, 0xf7, + 0x21, 0x5, 0xf7, 0x1c, 0x6, 0x78, 0xfb, 0x21, 0x5, 0xe, 0x49, 0x76, + 0xe3, 0xa7, 0xf8, 0xf4, 0xa6, 0xca, 0x77, 0x12, 0xb7, 0x9a, 0xf7, 0x3f, + 0xad, 0xf7, 0x26, 0x9a, 0x17, 0xb7, 0xbe, 0x15, 0x7a, 0xa6, 0xc7, 0x69, + 0xee, 0x1b, 0x34, 0xad, 0xe2, 0x7, 0xf4, 0x99, 0xe3, 0xb8, 0xf7, 0x7, + 0x1a, 0xf7, 0x0, 0x4b, 0xae, 0xfb, 0x15, 0xd5, 0x1e, 0xf7, 0x8a, 0x7, + 0xbe, 0xd5, 0x70, 0xfb, 0x2, 0xa0, 0x1f, 0x9a, 0xf7, 0x3, 0x6, 0xb2, + 0x5f, 0x45, 0x99, 0x5c, 0x1b, 0xca, 0x69, 0x4c, 0x7, 0xfb, 0x13, 0x58, + 0x39, 0x44, 0x29, 0xe2, 0x57, 0xe6, 0x58, 0x1f, 0xfb, 0xae, 0x7, 0x2d, + 0x54, 0xbf, 0xf0, 0x75, 0x1f, 0x7c, 0x6, 0xf7, 0x4d, 0xf7, 0x76, 0x15, + 0x13, 0x64, 0x4f, 0xb3, 0x60, 0xab, 0xc0, 0x1a, 0xa1, 0x91, 0xde, 0xec, + 0x1e, 0xae, 0xfc, 0xf5, 0x15, 0xf7, 0x9d, 0x7, 0x13, 0x44, 0xca, 0x64, + 0xbe, 0x6b, 0x44, 0x1a, 0x25, 0x3a, 0x7c, 0x6a, 0x85, 0x1e, 0xe, 0xf8, + 0x70, 0x7f, 0xa9, 0x6e, 0x76, 0xf7, 0xc4, 0xa9, 0x9f, 0xa9, 0xf7, 0x91, + 0xa9, 0x9c, 0x77, 0x12, 0xbc, 0xd4, 0xf7, 0x24, 0xd3, 0xde, 0xd4, 0xf7, + 0x23, 0xd4, 0x13, 0x77, 0xc0, 0xf7, 0x34, 0x82, 0x15, 0xa9, 0x74, 0xf8, + 0x28, 0xf9, 0x29, 0x6a, 0xa2, 0x5, 0x13, 0xbb, 0xc0, 0xfc, 0x94, 0xfb, + 0x5b, 0x15, 0x3c, 0xb6, 0x25, 0xf1, 0xf1, 0xb5, 0xf1, 0xdb, 0xdb, 0x60, + 0xf0, 0x27, 0x1e, 0x8a, 0x6, 0x25, 0x60, 0x26, 0x3a, 0x1f, 0xd4, 0x8c, + 0x15, 0xbe, 0x96, 0xef, 0xc8, 0x1e, 0x8c, 0x6, 0xc9, 0x94, 0x26, 0x58, + 0x5b, 0x82, 0x24, 0x4d, 0x4d, 0x80, 0xf0, 0xbe, 0x1f, 0xf7, 0xbf, 0xfb, + 0xb1, 0x15, 0x3c, 0xb6, 0x25, 0xf1, 0xf0, 0xb6, 0xf1, 0xdb, 0xdb, 0x60, + 0xf1, 0x27, 0x1e, 0x8a, 0x6, 0x25, 0x60, 0x25, 0x3a, 0x1f, 0xd4, 0x8c, + 0x15, 0xc0, 0x96, 0xee, 0xc7, 0x1e, 0x8c, 0x6, 0xc9, 0x94, 0x26, 0x58, + 0x5a, 0x82, 0x24, 0x4e, 0x4d, 0x80, 0xf1, 0xbd, 0x1f, 0xe, 0xf8, 0x39, + 0x7e, 0xbf, 0x57, 0xd2, 0xf8, 0x4, 0x77, 0xf7, 0x82, 0xab, 0x12, 0xb5, + 0xe7, 0xcf, 0xda, 0x8b, 0xf7, 0x31, 0x8b, 0xc0, 0x13, 0x7f, 0xf7, 0xd5, + 0xf8, 0x34, 0x15, 0x77, 0xb4, 0x77, 0xbf, 0xbb, 0x1a, 0xc9, 0xb0, 0xa4, + 0xb4, 0xb6, 0xaf, 0x69, 0x59, 0x38, 0x31, 0x5c, 0x70, 0x7d, 0x1e, 0xf7, + 0x0, 0xfb, 0xe6, 0x15, 0x6d, 0xa8, 0xc7, 0x4e, 0xdc, 0x1b, 0xf5, 0xb7, + 0xf7, 0x1, 0x8f, 0x8c, 0x1f, 0x7c, 0x96, 0x5, 0x6d, 0x73, 0x77, 0x74, + 0x57, 0x1b, 0x41, 0x47, 0xdc, 0x99, 0x82, 0x1f, 0xef, 0xf7, 0x2d, 0xaf, + 0xc3, 0xbe, 0xb1, 0xaf, 0x90, 0x19, 0xa0, 0xfb, 0x6c, 0x76, 0x7, 0xb0, + 0x88, 0xa6, 0x7c, 0x65, 0x1a, 0x55, 0x4d, 0x3c, 0x6e, 0x65, 0x1e, 0x58, + 0xc9, 0x5e, 0xd3, 0x67, 0xd3, 0x8, 0xcb, 0xa9, 0xe6, 0xb7, 0xed, 0x1a, + 0xd7, 0x4c, 0xb7, 0x42, 0x26, 0x57, 0x36, 0x43, 0x5b, 0x98, 0x6a, 0xa1, + 0x4e, 0x1e, 0x23, 0x4f, 0x30, 0x46, 0x23, 0x1a, 0xfb, 0x17, 0xf3, 0x71, + 0xc8, 0xf7, 0xb, 0xca, 0xc3, 0xae, 0xb3, 0x1e, 0x72, 0xa5, 0x15, 0x13, + 0xbf, 0x51, 0x46, 0x5a, 0x84, 0x74, 0x1b, 0x44, 0x51, 0xcb, 0xd8, 0xe3, + 0xd4, 0xb9, 0xb8, 0xa8, 0x1f, 0xb5, 0x3b, 0xbf, 0x32, 0xc5, 0x45, 0x8, + 0xe, 0xfb, 0x45, 0xf8, 0x58, 0x76, 0xf7, 0x89, 0x77, 0x1, 0xbb, 0xe0, + 0x3, 0xe5, 0xf8, 0x43, 0x15, 0x44, 0xa, 0xe, 0x90, 0x1d, 0xbb, 0xdc, + 0x3, 0xf7, 0xbb, 0xfb, 0x45, 0x15, 0x97, 0x9b, 0x5, 0xfb, 0x24, 0xf7, + 0x3, 0x69, 0xf7, 0x66, 0xf1, 0x1a, 0xf7, 0x92, 0xf0, 0xe0, 0xd5, 0xc6, + 0x1e, 0x82, 0x9b, 0x5, 0xfb, 0x2f, 0x2f, 0x2f, 0xfb, 0x2a, 0xfb, 0x40, + 0x1a, 0xfb, 0x73, 0xea, 0x27, 0xf7, 0x2c, 0xfb, 0x8, 0x1e, 0xe, 0x90, + 0x1d, 0xf7, 0x5e, 0xde, 0x3, 0xa8, 0xfb, 0x35, 0x15, 0x94, 0x7b, 0x5, + 0xf7, 0x2f, 0xf7, 0x1, 0xe7, 0xf7, 0x19, 0xf7, 0x40, 0x1a, 0xf7, 0x73, + 0x2f, 0xf7, 0x0, 0xfb, 0x2c, 0xf7, 0x0, 0x1e, 0x7f, 0x7b, 0x5, 0xf7, + 0x3e, 0xfb, 0xd, 0x8e, 0xfb, 0x5e, 0x25, 0x1a, 0xfb, 0x71, 0xfb, 0x27, + 0xfb, 0x31, 0x71, 0x79, 0x1e, 0xe, 0xf8, 0x65, 0x90, 0x8b, 0xf7, 0xf, + 0xfb, 0x8, 0x76, 0xa9, 0x77, 0xb7, 0xf7, 0x13, 0x12, 0xf7, 0x73, 0xa9, + 0x13, 0x2c, 0xf7, 0x84, 0xf8, 0x5c, 0x15, 0x8c, 0x84, 0x5, 0x94, 0x4f, + 0x67, 0x55, 0x6c, 0x1a, 0x72, 0x9d, 0x7d, 0x9c, 0xa4, 0x99, 0xa2, 0x9e, + 0x1e, 0xa9, 0x6f, 0x98, 0xee, 0x1a, 0x92, 0x7, 0x92, 0x88, 0x5, 0x71, + 0xc9, 0xa2, 0x3e, 0xb7, 0x1b, 0x9e, 0x9c, 0x97, 0xa3, 0x1f, 0x13, 0xc4, + 0xc6, 0x40, 0x6c, 0x3a, 0xbe, 0x1e, 0x83, 0x90, 0x5, 0xf2, 0xcc, 0xc7, + 0x61, 0xcb, 0x1a, 0xa7, 0x73, 0x93, 0x7f, 0x66, 0x71, 0x47, 0x66, 0x4a, + 0x1e, 0x84, 0x87, 0x5, 0x13, 0x1c, 0xa5, 0x7, 0xbf, 0xa6, 0xbb, 0xa6, + 0x1a, 0x98, 0x83, 0xa5, 0x71, 0x84, 0x6d, 0x8b, 0x64, 0x1e, 0x5f, 0xa4, + 0x7e, 0x3a, 0x1a, 0x7e, 0x7, 0xbe, 0x2c, 0x8c, 0xc1, 0x5e, 0x1b, 0x70, + 0x85, 0x70, 0x84, 0x51, 0xe1, 0xa1, 0xcf, 0x60, 0x1f, 0x96, 0x84, 0x5, + 0x37, 0x51, 0x3a, 0xac, 0x4c, 0x1a, 0x80, 0x93, 0x76, 0xa5, 0xa2, 0x90, + 0x91, 0xb0, 0xac, 0x1e, 0x13, 0x2c, 0xa4, 0xa7, 0x8b, 0x8b, 0xbe, 0xad, + 0x8, 0xe, 0xf7, 0x63, 0xa0, 0x76, 0xf7, 0x89, 0xb3, 0x1, 0xf7, 0x9a, + 0xb5, 0x3, 0xa9, 0xf7, 0x7c, 0x15, 0xf7, 0x7c, 0xfb, 0x7c, 0xb5, 0xf7, + 0x7c, 0xf7, 0x7a, 0xb3, 0xfb, 0x7a, 0xf7, 0x7e, 0x61, 0xfb, 0x7e, 0xfb, + 0x7c, 0x6, 0xe, 0x20, 0x7f, 0xf7, 0x6, 0x38, 0x76, 0x12, 0x13, 0x80, + 0xd5, 0xfb, 0xe, 0x15, 0x94, 0x78, 0x5, 0x3f, 0xa, 0x79, 0x60, 0x5f, + 0xb3, 0x78, 0xaa, 0x95, 0x1e, 0x13, 0x40, 0x8c, 0x8f, 0x94, 0x94, 0x38, + 0x1d, 0xe, 0x73, 0xf7, 0x56, 0xca, 0x1, 0xb2, 0xf7, 0x56, 0x15, 0xf7, + 0x8a, 0xca, 0xfb, 0x8a, 0x6, 0xe, 0x20, 0x80, 0xf7, 0x3, 0x1, 0xd1, + 0xf7, 0x3, 0x3, 0xd1, 0xb6, 0x15, 0x43, 0x1d, 0xe, 0x3c, 0x92, 0x7a, + 0x1d, 0x83, 0xf7, 0xbb, 0x3, 0x83, 0x7d, 0x15, 0xb3, 0x6, 0xf7, 0x93, + 0xf9, 0x46, 0x5, 0x66, 0x6, 0xe, 0x7d, 0xa5, 0xf9, 0x12, 0xa5, 0x1, + 0xa3, 0xeb, 0xf7, 0x98, 0xeb, 0x3, 0xf7, 0xc, 0xf7, 0xdf, 0x15, 0xcf, + 0x8d, 0xf7, 0x8f, 0xf7, 0x14, 0xf7, 0x14, 0x8d, 0xfb, 0x8f, 0x47, 0x3c, + 0x89, 0xfb, 0x84, 0xfb, 0x14, 0xfb, 0x14, 0x89, 0xf7, 0x82, 0xdc, 0x1e, + 0x2b, 0x16, 0xfb, 0xd, 0xb5, 0xfb, 0x74, 0xf7, 0x4c, 0xf7, 0x4c, 0xb5, + 0xf7, 0x74, 0xf7, 0xd, 0xf7, 0xa, 0x61, 0xf7, 0x77, 0xfb, 0x4c, 0xfb, + 0x4c, 0x61, 0xfb, 0x77, 0xfb, 0xa, 0x1e, 0xe, 0xa0, 0x76, 0xf9, 0x38, + 0x77, 0x1, 0xf7, 0x69, 0xe1, 0x3, 0xf7, 0x3, 0x16, 0xf7, 0xaf, 0x9a, + 0x6, 0x40, 0x77, 0x99, 0xd6, 0x1f, 0xf8, 0xce, 0x7, 0x83, 0x8d, 0xfb, + 0x48, 0x30, 0x5, 0x7d, 0x7, 0xa1, 0xc3, 0x8b, 0x8b, 0x97, 0x1b, 0xad, + 0x8b, 0x71, 0x76, 0x1f, 0xfc, 0x4f, 0x7, 0x41, 0x5f, 0x7f, 0x51, 0x89, + 0x1e, 0xe, 0x8b, 0xd7, 0xf8, 0xa2, 0xd5, 0x1, 0xf7, 0xe6, 0xe1, 0x3, + 0xa9, 0x16, 0xf8, 0x1a, 0x6, 0xc2, 0xf7, 0x1d, 0x7e, 0x90, 0x5, 0x4c, + 0x64, 0x6c, 0x88, 0x66, 0x1b, 0xfb, 0x77, 0x6, 0xf7, 0x3c, 0xf7, 0x44, + 0x5, 0xb7, 0xba, 0xdf, 0xe6, 0xf5, 0x1a, 0xf7, 0x4, 0x31, 0xcf, 0x30, + 0x33, 0x2c, 0x5b, 0xfb, 0x2b, 0x6d, 0x1e, 0xa1, 0x86, 0x5, 0xc1, 0xa1, + 0xa9, 0xd7, 0xe6, 0x1b, 0xf7, 0xa, 0xa4, 0x2f, 0x58, 0x40, 0x60, 0x31, + 0x34, 0x2e, 0x1f, 0xfb, 0x46, 0xfb, 0x51, 0x5, 0xe, 0x7d, 0xaf, 0xf8, + 0xe6, 0xc7, 0x12, 0xf7, 0xfb, 0xc5, 0x51, 0xd3, 0x13, 0xd0, 0xf7, 0x2d, + 0xf7, 0xdc, 0x15, 0xd0, 0x8d, 0xa4, 0x88, 0xaf, 0x78, 0x8, 0xcb, 0x6a, + 0x97, 0x2b, 0x72, 0x1a, 0x40, 0x62, 0x52, 0x2e, 0x6e, 0x73, 0x98, 0x99, + 0x75, 0x1e, 0x99, 0x74, 0x75, 0x9a, 0x74, 0x1b, 0x7b, 0x74, 0x84, 0x6f, + 0x57, 0xe2, 0x86, 0xa3, 0xf7, 0x31, 0xf7, 0xc, 0xcd, 0xf7, 0x22, 0xf7, + 0x18, 0x36, 0xc4, 0x61, 0x9d, 0x1f, 0x13, 0x60, 0xcd, 0xb6, 0xba, 0xb6, + 0xc1, 0x1a, 0xb4, 0x70, 0xe9, 0xfb, 0x15, 0x48, 0xfb, 0x3, 0x6c, 0xfb, + 0x17, 0x63, 0x1e, 0x9c, 0x87, 0x5, 0xa7, 0x9a, 0xcb, 0xd9, 0xe6, 0x1b, + 0xd5, 0xad, 0x56, 0x58, 0x2f, 0x2c, 0x63, 0x30, 0x6e, 0x1f, 0xe, 0xa0, + 0x76, 0xf7, 0x31, 0xcb, 0xf8, 0x5b, 0x77, 0x1, 0xf7, 0xb8, 0xd9, 0x3, + 0x97, 0xf7, 0x31, 0x15, 0xf7, 0xad, 0xfb, 0x31, 0xd8, 0xf7, 0x31, 0xf1, + 0xcb, 0x25, 0xf8, 0x5b, 0x5f, 0x6, 0xfb, 0xce, 0xfc, 0x5b, 0x5, 0xb3, + 0x16, 0xf7, 0x82, 0xf7, 0xf2, 0x5, 0x8d, 0xfb, 0xf2, 0x6, 0xe, 0x7d, + 0xb0, 0xf8, 0xcd, 0xda, 0x12, 0xf7, 0xf8, 0xd1, 0x17, 0xf7, 0x1f, 0xf8, + 0x79, 0x15, 0xb5, 0xe3, 0x5, 0xf7, 0x4e, 0x6, 0x96, 0x9e, 0x8b, 0x94, + 0x8e, 0x1f, 0xb1, 0xda, 0x82, 0x9c, 0x5, 0x7c, 0x80, 0x78, 0x80, 0x71, + 0x1b, 0xfb, 0x61, 0x6, 0x24, 0xfb, 0x84, 0x5, 0x84, 0x88, 0x8e, 0x85, + 0x91, 0x1b, 0xf7, 0x0, 0x87, 0xf7, 0x45, 0x69, 0xfb, 0x34, 0x1a, 0xfb, + 0xe, 0x41, 0x53, 0x4a, 0x70, 0x76, 0x9b, 0x9b, 0x75, 0x1e, 0x13, 0xc0, + 0x9a, 0x76, 0x74, 0x9a, 0x6c, 0x1b, 0x63, 0x8b, 0x6e, 0x81, 0x67, 0xba, + 0x73, 0xda, 0x1f, 0x13, 0x60, 0xf7, 0x32, 0xf7, 0x2, 0xf5, 0xf7, 0x19, + 0xe4, 0x80, 0x9e, 0x60, 0xbf, 0x1f, 0x13, 0x40, 0x50, 0xd3, 0x2d, 0x99, + 0x3b, 0x99, 0x8, 0xe, 0x7d, 0xa7, 0xf7, 0xe6, 0xb8, 0xf7, 0xb2, 0x77, + 0x1, 0xbe, 0xe8, 0xf7, 0x77, 0xe5, 0x3, 0xf7, 0x2e, 0xf8, 0xd, 0x15, + 0x9e, 0xf7, 0xe, 0xf6, 0xe6, 0xf7, 0x46, 0xa7, 0x89, 0xaf, 0x18, 0xfb, + 0x86, 0x83, 0xfb, 0x3e, 0xfb, 0x40, 0xfb, 0x5f, 0x1a, 0xfb, 0x66, 0xf1, + 0x40, 0xf7, 0xa, 0xf7, 0x46, 0xa8, 0xf7, 0x33, 0xd4, 0xf7, 0x1a, 0x44, + 0xcd, 0x21, 0x53, 0x64, 0x86, 0x67, 0x5e, 0x1e, 0x75, 0xfb, 0x21, 0x15, + 0xc7, 0x90, 0x9e, 0x97, 0x9c, 0x1e, 0xa7, 0x9f, 0xbc, 0x97, 0xad, 0x1b, + 0xf5, 0xa2, 0x31, 0x24, 0xfb, 0x5, 0x64, 0x57, 0x4c, 0x40, 0x43, 0xc1, + 0xf7, 0x3c, 0x1f, 0xe, 0x98, 0x76, 0xf8, 0xe8, 0xd5, 0x1, 0x9f, 0xf8, + 0x41, 0x3, 0xf7, 0x40, 0x83, 0x15, 0xcc, 0x6, 0xf7, 0x68, 0xf9, 0x22, + 0x5, 0x9b, 0xfc, 0x6, 0x7, 0x50, 0xfb, 0x27, 0x9c, 0x83, 0x5, 0xbf, + 0xac, 0xa7, 0xa8, 0xcc, 0x1b, 0xf7, 0x63, 0x6, 0xe, 0x7d, 0xa7, 0xf9, + 0xe, 0xa7, 0x12, 0xd6, 0xd7, 0x45, 0xd1, 0xf7, 0x60, 0xd0, 0x4c, 0xd7, + 0x13, 0xe4, 0xf7, 0x6c, 0xf7, 0xcc, 0x15, 0xf7, 0x7, 0x39, 0xbb, 0x6d, + 0x41, 0x1a, 0x45, 0x52, 0x61, 0x4c, 0x3a, 0x5d, 0xcc, 0xd8, 0xe6, 0xbf, + 0xb2, 0xab, 0xa5, 0x1e, 0x71, 0x9f, 0x15, 0x32, 0x47, 0x5e, 0x6c, 0x34, + 0x1a, 0x3d, 0xcd, 0x39, 0xf7, 0x10, 0xf7, 0x3a, 0xb6, 0xf7, 0x4, 0xbf, + 0xce, 0x7a, 0xc5, 0xfb, 0x1a, 0xeb, 0x1e, 0x13, 0xd8, 0xc1, 0xa8, 0xd7, + 0xb5, 0xe7, 0x1a, 0xd7, 0x43, 0xcd, 0xfb, 0x5, 0x35, 0x26, 0x55, 0x26, + 0x3a, 0xb7, 0x69, 0xdf, 0x41, 0x1e, 0xd6, 0xc4, 0x15, 0x67, 0xa2, 0x2e, + 0xc4, 0xd9, 0x1a, 0xbb, 0xab, 0xc0, 0xd6, 0xd8, 0xb8, 0x55, 0x54, 0x33, + 0x4d, 0x66, 0x65, 0x72, 0x1e, 0xe, 0x8b, 0x76, 0xf7, 0x74, 0xb6, 0xf8, + 0x19, 0xa7, 0x1, 0xa9, 0xe7, 0xf7, 0x88, 0xe8, 0x3, 0xc6, 0x75, 0x15, + 0xf7, 0x91, 0x9b, 0xf7, 0x27, 0xf7, 0x51, 0xf7, 0x69, 0x1a, 0xdf, 0x73, + 0xc7, 0x63, 0xbb, 0x1e, 0xbc, 0x64, 0x54, 0xa8, 0x4e, 0x1b, 0xfb, 0x17, + 0x89, 0x3c, 0x23, 0xfb, 0x11, 0x1a, 0x38, 0xba, 0x23, 0xf7, 0x19, 0xbe, + 0xbf, 0x92, 0xb0, 0xb7, 0x1e, 0x8c, 0x8a, 0x83, 0x73, 0x58, 0xfb, 0x78, + 0xfb, 0x87, 0x62, 0x19, 0xf7, 0xc7, 0xf7, 0xf9, 0x15, 0x54, 0x4a, 0x82, + 0x5b, 0x20, 0x76, 0xee, 0xd7, 0xa7, 0x93, 0xbb, 0x9c, 0xae, 0x1e, 0xaf, + 0x9e, 0xa6, 0xa4, 0xb6, 0x1b, 0xcd, 0xad, 0x5b, 0x52, 0x9b, 0x1f, 0x9a, + 0x56, 0x8c, 0x59, 0x89, 0x68, 0x8, 0xe, 0x3c, 0x80, 0xf7, 0x3, 0xf7, + 0x8c, 0xf7, 0x3, 0x8b, 0x77, 0x1, 0xdc, 0xf7, 0x3, 0x3, 0xdc, 0xf8, + 0x26, 0x15, 0x43, 0x1d, 0xfb, 0xfb, 0x4, 0x43, 0x1d, 0xe, 0x3c, 0xfb, + 0xc, 0x76, 0xf7, 0x28, 0x76, 0xf7, 0x8, 0x77, 0xf7, 0x9d, 0xf7, 0x4, + 0x12, 0xdb, 0xf7, 0x4, 0xfb, 0x4, 0xf7, 0x1f, 0x13, 0x94, 0xed, 0xfb, + 0xe, 0x15, 0x94, 0x78, 0x5, 0x13, 0x74, 0xac, 0x97, 0xda, 0xcc, 0xd1, + 0x1a, 0xdf, 0x50, 0x97, 0x76, 0x80, 0x5b, 0x85, 0x54, 0x66, 0xa3, 0x79, + 0xab, 0x92, 0x96, 0x94, 0x8c, 0x8e, 0x1e, 0x8c, 0x8f, 0x8e, 0x8c, 0x8d, + 0x1b, 0x13, 0x18, 0x39, 0xa, 0x79, 0xf8, 0xa1, 0x15, 0x13, 0x10, 0x6c, + 0xa4, 0x72, 0xaa, 0x1e, 0x13, 0x98, 0xaa, 0xa4, 0xa4, 0xaa, 0xaa, 0x72, + 0xa4, 0x6c, 0x6c, 0x72, 0x72, 0x6c, 0x1f, 0xe, 0x8c, 0x1d, 0xf8, 0x90, + 0xfc, 0x7e, 0xca, 0x3, 0xa7, 0xf7, 0x81, 0x15, 0xf8, 0x90, 0xfb, 0x89, + 0x5, 0xb8, 0x7, 0xfc, 0x51, 0xf7, 0x6c, 0xf8, 0x51, 0xf7, 0x6b, 0x5, + 0xb9, 0x7, 0xfc, 0x90, 0xfb, 0x8c, 0x5, 0xe, 0xf7, 0x63, 0xf7, 0xc, + 0xcd, 0xf7, 0x1a, 0xcd, 0x63, 0xb3, 0x12, 0x13, 0xa0, 0xa9, 0xf7, 0xee, + 0x15, 0xf8, 0x8c, 0xb3, 0xfc, 0x8c, 0x6, 0xfb, 0x9e, 0x4, 0xf8, 0x8c, + 0x6, 0x13, 0xc0, 0xb6, 0xfc, 0x8c, 0x7, 0xe, 0x8c, 0x1d, 0x8b, 0x3, + 0xa7, 0x83, 0x15, 0xf8, 0x90, 0xf7, 0x89, 0x5, 0xa8, 0x7, 0xfc, 0x90, + 0xf7, 0x8c, 0x5, 0x5d, 0x7, 0xf8, 0x51, 0xfb, 0x6b, 0xfc, 0x51, 0xfb, + 0x6c, 0x5, 0xe, 0xe2, 0x83, 0xf4, 0xf7, 0xfe, 0x77, 0xf7, 0x63, 0xa9, + 0x12, 0xcf, 0xbe, 0xf7, 0x5f, 0xe7, 0x17, 0xf7, 0x77, 0xf7, 0x38, 0x15, + 0x9c, 0x6, 0x99, 0xe1, 0xa5, 0xb3, 0xc2, 0xcb, 0x8, 0xa9, 0xae, 0xb8, + 0xd1, 0xbe, 0x1a, 0xf1, 0x44, 0xcb, 0xfb, 0x4, 0x46, 0x2d, 0x56, 0x26, + 0x69, 0x95, 0x6e, 0xb3, 0xa7, 0x96, 0xa3, 0x9c, 0x9c, 0x83, 0x97, 0x82, + 0x95, 0x1e, 0x81, 0x97, 0x80, 0x95, 0x99, 0x1a, 0xac, 0xbe, 0xb1, 0xb5, + 0xd8, 0xac, 0x48, 0x4f, 0x63, 0x78, 0x46, 0x79, 0x63, 0x1e, 0x69, 0x3d, + 0x73, 0x46, 0x50, 0x1a, 0x61, 0xfb, 0xc, 0x15, 0x6e, 0xa2, 0x74, 0xa8, + 0xa8, 0xa3, 0xa2, 0xa8, 0x1e, 0x13, 0x80, 0x94, 0x1d, 0x1e, 0xe, 0xf8, + 0xc8, 0x7d, 0xb2, 0xf7, 0xa, 0xac, 0x7f, 0xb7, 0xf7, 0x7a, 0xb7, 0xf7, + 0x37, 0xaa, 0x12, 0xf7, 0x8, 0xdf, 0xf7, 0xd, 0xd2, 0xf8, 0xd, 0xb3, + 0x13, 0xbf, 0xf8, 0x1c, 0xf7, 0xa3, 0x15, 0xf7, 0xd, 0xe4, 0xd3, 0xbb, + 0xa9, 0x94, 0x74, 0x61, 0x5a, 0x7d, 0x63, 0x7e, 0x6b, 0x1e, 0x4e, 0x72, + 0x6a, 0x6d, 0x6f, 0x1b, 0x68, 0x6f, 0xa3, 0xc7, 0x1f, 0xf7, 0x22, 0x52, + 0x15, 0x7e, 0x8a, 0xa3, 0x51, 0xcd, 0x1b, 0xf7, 0xb, 0xce, 0xf7, 0x1c, + 0xf1, 0xf7, 0x3d, 0xfb, 0x24, 0xf7, 0x12, 0xfb, 0x4c, 0xfb, 0x5a, 0xfb, + 0x3b, 0xfb, 0x25, 0xfb, 0x6c, 0xfb, 0x1a, 0xf7, 0x6, 0xfb, 0x57, 0xf7, + 0x99, 0xd9, 0xd9, 0xab, 0xa8, 0xca, 0x1f, 0x7f, 0xa9, 0x5, 0x71, 0x52, + 0x4d, 0x71, 0x32, 0x1b, 0xfb, 0x42, 0xfb, 0x8, 0xf7, 0x1d, 0xf7, 0x23, + 0xf7, 0x72, 0xf7, 0x14, 0xf7, 0xa, 0xf7, 0x2d, 0xf7, 0x4b, 0xf4, 0xfb, + 0x2b, 0xfb, 0x6, 0x1f, 0x13, 0xdf, 0x35, 0x5a, 0xfb, 0xa, 0x3a, 0x5e, + 0x91, 0xbc, 0x9a, 0x8e, 0x1e, 0xcd, 0xf7, 0x9c, 0x5, 0x46, 0x6, 0x80, + 0x5b, 0x5, 0x13, 0x32, 0xa3, 0x7e, 0x7f, 0xa7, 0x5d, 0x1b, 0xfb, 0x1b, + 0x4d, 0xfb, 0x3e, 0x45, 0xfb, 0x5, 0xcf, 0x80, 0xa7, 0xc5, 0xb9, 0xbf, + 0x9d, 0x96, 0x1f, 0xe, 0x5c, 0x1d, 0x1, 0x9a, 0x16, 0xf7, 0x5a, 0x9e, + 0x6, 0x76, 0x51, 0xa4, 0xb2, 0x9a, 0x1f, 0xbd, 0xf7, 0x19, 0x5, 0xf7, + 0x9a, 0x6, 0xba, 0x27, 0x93, 0x7d, 0x8f, 0x7b, 0x8, 0x5f, 0x96, 0x60, + 0x74, 0x66, 0x1b, 0x78, 0xf7, 0x93, 0x9e, 0x7, 0x73, 0x68, 0xa1, 0xb8, + 0x77, 0x1f, 0xfb, 0x98, 0xf8, 0xe0, 0x5, 0x77, 0x6, 0xfb, 0x77, 0xfc, + 0xab, 0x78, 0x71, 0x7c, 0x6d, 0x73, 0x5c, 0x6c, 0x7b, 0x2e, 0xa, 0xe, + 0xf7, 0xca, 0x8b, 0xb0, 0xf7, 0xb5, 0xb2, 0xf7, 0x98, 0xb0, 0x12, 0xf7, + 0x5, 0xf1, 0xf7, 0x86, 0xf1, 0x3a, 0xf7, 0x7, 0x13, 0xf4, 0x9c, 0x16, + 0xf7, 0xe2, 0x6, 0xf7, 0x72, 0x9f, 0xf7, 0x1e, 0xb1, 0xf4, 0x3b, 0xbb, + 0x34, 0x9d, 0x1f, 0x8d, 0x7, 0x13, 0xf8, 0xb8, 0x96, 0xe3, 0xa1, 0xf7, + 0x3, 0x1a, 0xf7, 0x2f, 0xfb, 0x43, 0x99, 0x34, 0x1e, 0xfb, 0xac, 0x78, + 0x6, 0xda, 0x9c, 0x66, 0x77, 0x1f, 0xfc, 0x86, 0x7, 0x6c, 0x7f, 0x67, + 0x37, 0x89, 0x1e, 0xf7, 0x5a, 0xf7, 0xc7, 0x15, 0xeb, 0xab, 0x86, 0x81, + 0xad, 0x1f, 0x13, 0xf4, 0xbf, 0x7b, 0xbc, 0x6a, 0x39, 0x1a, 0xfb, 0x1a, + 0xfb, 0xd, 0x82, 0x49, 0x51, 0x79, 0x99, 0xb0, 0x1e, 0xf7, 0xa9, 0x4, + 0xf7, 0x70, 0x7, 0x9a, 0x8d, 0xa3, 0x9f, 0x1e, 0x95, 0x99, 0x8c, 0xa0, + 0x1b, 0x13, 0xf8, 0xd2, 0xf3, 0x78, 0xfb, 0xb, 0xfb, 0xb, 0xfb, 0xb, + 0x89, 0x6f, 0x1f, 0xe, 0xf7, 0xca, 0x7d, 0xb7, 0xf8, 0x39, 0x77, 0xf7, + 0x61, 0xb3, 0x1, 0xa7, 0xf7, 0x8, 0x3, 0xf8, 0xfb, 0xf7, 0x17, 0x15, + 0x77, 0x1d, 0xf7, 0x57, 0xdb, 0xf7, 0x4, 0xf7, 0x2d, 0xf7, 0xf, 0xd3, + 0x3b, 0x22, 0xa4, 0x1f, 0xa2, 0x6, 0x82, 0xf7, 0x75, 0x59, 0x1d, 0xf7, + 0x4c, 0xe1, 0xf7, 0x11, 0x8d, 0x8c, 0x1f, 0xe, 0xf8, 0x1, 0x8b, 0xb0, + 0xf8, 0xe0, 0xb0, 0x1, 0xf3, 0xf1, 0xf7, 0xf3, 0x58, 0x1d, 0x85, 0x96, + 0x72, 0x67, 0x1a, 0xfc, 0x7c, 0x7, 0x6c, 0x7f, 0x69, 0x3f, 0x87, 0x1e, + 0xf7, 0x52, 0xd0, 0x15, 0xf8, 0x7c, 0x7, 0x9f, 0x8b, 0xa8, 0x8b, 0xa, + 0xfb, 0xa8, 0xfb, 0x8a, 0x7b, 0x4b, 0x8c, 0x1e, 0x5b, 0x8c, 0x7f, 0x9b, + 0xad, 0x1a, 0xe, 0x7b, 0xa, 0xf7, 0xb5, 0xb4, 0xf7, 0x9a, 0xb1, 0x12, + 0xee, 0xf1, 0xf7, 0x9c, 0xa2, 0x17, 0x62, 0xa, 0x96, 0xb4, 0x1f, 0xf7, + 0x82, 0x7, 0xf7, 0x2e, 0x89, 0xde, 0x8a, 0x9a, 0x7d, 0x97, 0x3b, 0x19, + 0x6f, 0xa, 0x44, 0x80, 0x81, 0x73, 0x32, 0x1b, 0xfb, 0x2e, 0xf7, 0x68, + 0x6, 0xad, 0x97, 0x95, 0x33, 0x1d, 0x6, 0x13, 0x10, 0x78, 0x7, 0xca, + 0x86, 0xa3, 0x71, 0x6b, 0x1a, 0xfc, 0x7d, 0x7, 0x64, 0x74, 0x6e, 0x4b, + 0x84, 0x1d, 0x99, 0x1d, 0xf7, 0x7b, 0x77, 0xf7, 0x8, 0xb4, 0xf7, 0x9a, + 0xb1, 0x1, 0xee, 0xf1, 0xf7, 0x8a, 0xa2, 0xb4, 0xa4, 0x3, 0x97, 0x16, + 0xf7, 0xac, 0x9e, 0x6, 0x44, 0x8e, 0x77, 0xa1, 0xd6, 0x1a, 0xf7, 0x65, + 0x7, 0xf7, 0x25, 0x89, 0xd6, 0x8a, 0xa3, 0x81, 0x96, 0x37, 0x19, 0x6f, + 0xa, 0x40, 0x81, 0x79, 0x77, 0x39, 0x1b, 0xfb, 0x25, 0xf7, 0x68, 0x6, + 0xa9, 0x92, 0x99, 0xa4, 0x1e, 0xf7, 0x1c, 0x4e, 0xa, 0xf7, 0x23, 0xfc, + 0xaa, 0x78, 0x6, 0xca, 0x86, 0xa3, 0x71, 0x6b, 0x1a, 0xfc, 0x61, 0x7, + 0x45, 0x7f, 0x71, 0x40, 0x84, 0x1d, 0xf8, 0x1, 0x7d, 0xb3, 0xf7, 0xca, + 0x9d, 0xf7, 0xae, 0xb3, 0x1, 0xab, 0xf7, 0x6, 0xf8, 0x17, 0xec, 0x3, + 0xf8, 0x5a, 0xf7, 0xe4, 0x15, 0xcf, 0x86, 0x9f, 0x7b, 0x49, 0x98, 0xa, + 0x67, 0x46, 0x74, 0x47, 0xfb, 0x2f, 0x23, 0xf7, 0x5, 0xf7, 0x49, 0xf7, + 0x91, 0xf7, 0x27, 0xca, 0xea, 0xf7, 0x20, 0xbf, 0x28, 0x43, 0xa6, 0x1e, + 0xa2, 0x6, 0x83, 0xf7, 0x67, 0x5, 0x75, 0x6, 0x6f, 0x85, 0x6a, 0x86, + 0x83, 0x6b, 0x5d, 0xac, 0x26, 0x1b, 0xfb, 0x68, 0xfb, 0x16, 0xfb, 0x3b, + 0xfb, 0x3c, 0xfb, 0x80, 0xf7, 0x2a, 0xfb, 0xb, 0xf7, 0x6a, 0xf7, 0x2, + 0xf7, 0x19, 0xc5, 0x99, 0x1f, 0xf7, 0x53, 0x7, 0xd2, 0xa5, 0x97, 0xb7, + 0x8f, 0x1e, 0x9d, 0xfb, 0x93, 0x7, 0xe, 0x80, 0x1d, 0xf7, 0xcf, 0xb7, + 0xf7, 0xc3, 0x77, 0x1, 0xf6, 0xf1, 0xf7, 0xc3, 0xf1, 0x3, 0x9e, 0x16, + 0xf7, 0xaa, 0x9e, 0x6, 0x3d, 0x90, 0x81, 0xb3, 0xcd, 0x1a, 0xf7, 0x4d, + 0xf7, 0xc3, 0xfb, 0x4d, 0x7, 0x40, 0x87, 0x6b, 0x37, 0x87, 0x1e, 0x78, + 0xf7, 0xaa, 0x9e, 0x7, 0x3d, 0x90, 0x81, 0xae, 0xcd, 0x1a, 0xf8, 0x36, + 0x67, 0x1d, 0xfb, 0x4c, 0xfb, 0xc3, 0xf7, 0x4c, 0x67, 0x1d, 0xfc, 0x31, + 0x7, 0x40, 0x87, 0x6b, 0x37, 0x84, 0x1d, 0x73, 0xa0, 0x76, 0xf9, 0x2a, + 0x42, 0xa, 0xe, 0xab, 0x6a, 0xf7, 0xe, 0xf8, 0xd4, 0x77, 0x1, 0xf7, + 0x44, 0xf1, 0x3, 0xde, 0xf9, 0x17, 0x15, 0xdc, 0x86, 0x97, 0x73, 0x44, + 0x1a, 0xfc, 0x53, 0x7, 0x57, 0x7c, 0x7d, 0x73, 0x75, 0x8a, 0xa8, 0xa3, + 0x81, 0x1e, 0x9c, 0x84, 0x7e, 0x99, 0x6f, 0x1b, 0x6e, 0x7a, 0x6d, 0x78, + 0x7d, 0x91, 0x7b, 0x9b, 0x79, 0x1f, 0x7f, 0x96, 0xa4, 0x7e, 0xb5, 0x1b, + 0xa6, 0xf7, 0x21, 0x8e, 0xf7, 0x56, 0x1f, 0xf7, 0xf6, 0x7, 0xd5, 0x99, + 0xa0, 0xd9, 0x90, 0x1e, 0x9e, 0xfb, 0xb3, 0x7, 0xe, 0xf8, 0x1, 0x83, + 0xa, 0x1, 0xf7, 0x10, 0xf1, 0x3, 0xad, 0x16, 0xf7, 0xae, 0x9e, 0x6, + 0x3d, 0x8f, 0x7f, 0xa5, 0xd1, 0x1a, 0xf7, 0x45, 0x7, 0xa5, 0xa0, 0xf5, + 0x22, 0x5, 0xad, 0x69, 0xeb, 0x24, 0x6c, 0x1a, 0x75, 0x7a, 0x8a, 0x56, + 0x89, 0x1e, 0x78, 0xf7, 0xc5, 0x9e, 0x7, 0x52, 0x89, 0x67, 0xbe, 0x4b, + 0xc6, 0xfb, 0x7d, 0xf7, 0x8e, 0x18, 0xf7, 0x52, 0xf7, 0x50, 0xd2, 0xd1, + 0xa0, 0x8e, 0xc7, 0x90, 0x19, 0x9e, 0xfb, 0x9a, 0x78, 0x7, 0xbc, 0x89, + 0x9e, 0x89, 0x70, 0x1a, 0x69, 0x6e, 0x70, 0xfb, 0x76, 0xfb, 0x5f, 0x1e, + 0xf7, 0x57, 0x7, 0xd5, 0x99, 0xa0, 0xd9, 0x90, 0x1e, 0x9e, 0xfb, 0xb0, + 0x78, 0x7, 0xcf, 0x86, 0xa1, 0x7a, 0x3d, 0x1a, 0xfc, 0x3a, 0x7, 0x43, + 0x7f, 0x71, 0x3d, 0x84, 0x1d, 0xf7, 0x92, 0x8b, 0xb2, 0xf7, 0x1b, 0x77, + 0xf8, 0x90, 0x77, 0x1, 0xf7, 0x13, 0x5d, 0x1d, 0x96, 0xb3, 0x1f, 0xf8, + 0x59, 0x7, 0xda, 0x73, 0x1d, 0xfc, 0x59, 0x7, 0x68, 0x74, 0x6b, 0x4b, + 0x84, 0x1d, 0xf8, 0xa8, 0x83, 0xa, 0x1, 0xf7, 0x1, 0xb7, 0xf8, 0x9d, + 0xf1, 0x3, 0x5f, 0xa, 0xf8, 0x19, 0x8d, 0x7, 0xf7, 0x8d, 0xfc, 0xb6, + 0x5, 0x99, 0x6, 0xf7, 0x92, 0xf8, 0xcd, 0x5, 0x8d, 0xfc, 0x57, 0x6, + 0x4e, 0x7e, 0x69, 0x3d, 0x87, 0x1e, 0x78, 0xf7, 0xac, 0x9e, 0x7, 0x4b, + 0x8f, 0x74, 0x9e, 0xd8, 0x1a, 0xf8, 0x46, 0x7, 0xda, 0xa3, 0x91, 0xca, + 0x90, 0x1e, 0x9e, 0xfb, 0x5b, 0x7, 0xfb, 0x71, 0xfc, 0x8d, 0xfb, 0x7b, + 0xf8, 0x8d, 0x5, 0xfb, 0x5c, 0x78, 0x6, 0xd5, 0x87, 0xa2, 0x83, 0x3d, + 0x1a, 0xfc, 0x20, 0x78, 0xa, 0xe, 0xf8, 0x1, 0x95, 0x76, 0xab, 0x8a, + 0x1d, 0x12, 0xf7, 0x1, 0xb7, 0xf8, 0x33, 0xb7, 0x13, 0x78, 0x5f, 0xa, + 0xf8, 0x10, 0x8d, 0x7, 0x13, 0xb8, 0x3a, 0xa, 0xe, 0x5b, 0xa, 0x85, + 0xa, 0xf7, 0xe4, 0x70, 0xa, 0xfb, 0x1d, 0x69, 0x1d, 0xf7, 0xf, 0x61, + 0x1d, 0xf7, 0x10, 0x61, 0xa, 0xfb, 0x2, 0x44, 0x1d, 0xd6, 0xf1, 0xf1, + 0xf7, 0x3, 0x32, 0x71, 0x1d, 0x3a, 0x72, 0x1d, 0xea, 0xf7, 0x70, 0x1e, + 0xe, 0x99, 0x1d, 0xf7, 0xb4, 0xb3, 0xf7, 0xbd, 0xb0, 0x6d, 0xa, 0xa5, + 0xdc, 0x1a, 0xf7, 0x37, 0x66, 0x1d, 0xf7, 0x13, 0xfb, 0x10, 0xc0, 0xfb, + 0x1e, 0x1e, 0xfb, 0x9c, 0x78, 0x6, 0xd4, 0x84, 0x96, 0x6d, 0x74, 0x1a, + 0xfc, 0x59, 0x8d, 0xa, 0xf7, 0xcc, 0x15, 0xf7, 0x8e, 0x7, 0xac, 0x96, + 0x96, 0xa9, 0xb7, 0xf7, 0x26, 0x89, 0x74, 0x1d, 0xf8, 0x1, 0xfb, 0x46, + 0x9e, 0xf7, 0x32, 0xa2, 0x8b, 0xf8, 0xfe, 0x8b, 0xaf, 0x1, 0xc4, 0xf7, + 0x6, 0xf8, 0x16, 0x9a, 0xa, 0xf7, 0x93, 0x8a, 0x15, 0xfb, 0x33, 0xf7, + 0x21, 0xf7, 0x27, 0x79, 0xf7, 0x32, 0x1b, 0x9e, 0x7, 0xfb, 0x22, 0x99, + 0x53, 0xb9, 0x3e, 0xe7, 0x8, 0xf7, 0x0, 0x98, 0xf7, 0x24, 0xf3, 0xf7, + 0x70, 0x1a, 0xf7, 0x7a, 0xfb, 0x2d, 0xf7, 0x8, 0xfb, 0x38, 0xfb, 0x38, + 0xfb, 0x2d, 0xfb, 0x9, 0xfb, 0x79, 0xfb, 0x69, 0xf7, 0xa, 0x2e, 0xe8, + 0x72, 0x1e, 0x2a, 0xf7, 0xdf, 0x15, 0xf7, 0x79, 0xf0, 0xdc, 0xf1, 0xf1, + 0xf0, 0x3a, 0xfb, 0x79, 0xfb, 0x6f, 0x2f, 0x32, 0xfb, 0x3, 0xfb, 0x3, + 0x2f, 0xe4, 0xf7, 0x6f, 0x1e, 0xe, 0xf7, 0xca, 0x8b, 0x9e, 0xf7, 0xb3, + 0xb0, 0xf7, 0xae, 0xb0, 0x1, 0xf1, 0xf1, 0xf7, 0x7e, 0xf7, 0x1, 0x3, + 0x9c, 0x16, 0xf7, 0xa9, 0x9e, 0x6, 0x3b, 0x8f, 0x81, 0xa8, 0xce, 0x1a, + 0xf7, 0x4f, 0x7, 0xc3, 0x8d, 0xf7, 0x82, 0xfb, 0xc8, 0x5, 0xf7, 0x35, + 0x9e, 0x6, 0x62, 0x8d, 0x73, 0x9d, 0x75, 0xa6, 0xfb, 0x62, 0xf7, 0x91, + 0x18, 0xbe, 0x95, 0xf7, 0x16, 0xa3, 0xf7, 0x1a, 0x1a, 0xf7, 0x2e, 0xfb, + 0x39, 0xa0, 0x32, 0x1e, 0xfb, 0xa8, 0x78, 0x6, 0xd1, 0x84, 0x9a, 0x6f, + 0x6f, 0x1a, 0xfc, 0x63, 0x7, 0x4f, 0x87, 0x6a, 0x3a, 0x86, 0x1e, 0xf7, + 0x4f, 0xf7, 0xd8, 0x15, 0xf7, 0x80, 0x7, 0xa8, 0x94, 0x9c, 0xc0, 0xb4, + 0xf7, 0x17, 0x88, 0xfb, 0x19, 0xfb, 0x23, 0xfb, 0x2a, 0x89, 0x37, 0x8a, + 0x1e, 0xe, 0xf7, 0x5b, 0x7d, 0xaf, 0xf8, 0xf4, 0xb4, 0x12, 0xb5, 0xa1, + 0x96, 0xe1, 0xf7, 0x79, 0xf0, 0x17, 0xb5, 0x7d, 0x15, 0xa1, 0x6, 0x9b, + 0xbd, 0x9d, 0xa0, 0x9c, 0x9f, 0x80, 0x81, 0xa8, 0x1e, 0x13, 0xf8, 0x84, + 0xa0, 0xa5, 0x85, 0xab, 0x1b, 0xf7, 0x23, 0xcf, 0xeb, 0xe0, 0xf1, 0x38, + 0xc4, 0x38, 0xbc, 0x1f, 0x37, 0xbd, 0x37, 0xb5, 0xd6, 0x1a, 0xc9, 0xbe, + 0xaa, 0xbd, 0xf4, 0xb8, 0x31, 0x39, 0x9c, 0x1e, 0xa4, 0x6, 0x88, 0x86, + 0x1d, 0x1b, 0x7d, 0x77, 0x96, 0x94, 0x71, 0x1f, 0x92, 0x77, 0x74, 0x92, + 0x71, 0x55, 0xa, 0x13, 0x70, 0x74, 0x6, 0xe, 0xf7, 0x92, 0xa0, 0x76, + 0xf9, 0x0, 0xb5, 0x1, 0xf7, 0x92, 0xf1, 0x3, 0xf7, 0x34, 0x16, 0xf7, + 0xb8, 0x9e, 0x6, 0x37, 0x8e, 0x7f, 0xa8, 0xcf, 0x1a, 0xf8, 0x89, 0xc1, + 0x7, 0xf7, 0x2, 0xa7, 0x79, 0xfb, 0x2, 0xa0, 0x1f, 0xa3, 0x6, 0x85, + 0xf7, 0x3e, 0x5, 0xfc, 0xc8, 0x6, 0x85, 0xfb, 0x3e, 0x5, 0xa3, 0x6, + 0xf7, 0x1, 0xa1, 0xa6, 0x9e, 0xf7, 0x2, 0x1b, 0xc1, 0xfc, 0x8b, 0x6, + 0x4d, 0x88, 0x6b, 0x30, 0x84, 0x1d, 0x6e, 0xa, 0x1, 0xf3, 0xf1, 0xf7, + 0xfd, 0xb7, 0x3, 0x99, 0xf9, 0x17, 0x2d, 0x1d, 0x63, 0x3f, 0xfb, 0x27, + 0x49, 0x1d, 0xf8, 0x1, 0x95, 0x76, 0xf9, 0x35, 0x77, 0x12, 0x9b, 0xf9, + 0x3d, 0x17, 0xf8, 0x4, 0x80, 0x15, 0x9a, 0x6, 0xf7, 0x86, 0xf8, 0xe9, + 0x5, 0x13, 0x60, 0x97, 0xa9, 0x97, 0xa3, 0xbb, 0x8e, 0x8, 0x9e, 0xfb, + 0x61, 0x78, 0x7, 0xb1, 0x89, 0xae, 0x7e, 0x62, 0x1a, 0xfb, 0x3a, 0xfc, + 0x3e, 0x5, 0xfb, 0x42, 0xf8, 0xf, 0x79, 0xb4, 0x9a, 0x1a, 0xab, 0x9e, + 0x97, 0xc3, 0x8e, 0x1e, 0x9e, 0xfb, 0x9e, 0x78, 0x7, 0xba, 0x89, 0x9f, + 0x77, 0x98, 0x6f, 0x8, 0xe, 0xf8, 0xdf, 0x95, 0x76, 0xf9, 0x35, 0x77, + 0x9f, 0x8b, 0x12, 0x90, 0xfa, 0x33, 0x17, 0xf7, 0xc1, 0x80, 0x15, 0x13, + 0xf0, 0x9a, 0x6, 0xf7, 0x2e, 0xf8, 0x3b, 0xb6, 0xfb, 0x1, 0xdd, 0xfb, + 0x66, 0xae, 0x23, 0x19, 0x9a, 0x6, 0xc6, 0xf7, 0x55, 0xd9, 0xf7, 0x60, + 0xd0, 0xf7, 0x4e, 0x99, 0xb2, 0x9d, 0xa3, 0xbc, 0x93, 0x8, 0x9e, 0xfb, + 0x5a, 0x78, 0x7, 0xad, 0x88, 0xac, 0x7d, 0x64, 0x1a, 0x76, 0x83, 0x6d, + 0x83, 0x76, 0x1e, 0xfb, 0xf, 0xfb, 0xdd, 0x5, 0xfb, 0x27, 0xf8, 0x10, + 0x7d, 0x97, 0x9c, 0x1a, 0xaf, 0xbb, 0x97, 0xaa, 0x1e, 0x9e, 0xfb, 0x9f, + 0x78, 0x7, 0xc0, 0x8a, 0x98, 0x7b, 0xac, 0x38, 0xae, 0x43, 0x18, 0x20, + 0xfb, 0xae, 0x5, 0xfb, 0x29, 0xf8, 0x19, 0x83, 0x92, 0x99, 0x1a, 0xa5, + 0xa1, 0x9b, 0xb8, 0x8d, 0x1e, 0x9e, 0xfb, 0x89, 0x78, 0x7, 0xc4, 0x86, + 0x97, 0x64, 0xab, 0x38, 0xb1, 0x27, 0xf5, 0xfb, 0xa6, 0xbe, 0xfb, 0x2d, + 0x8, 0xe, 0xf8, 0x1, 0x8b, 0x9e, 0xf9, 0x4, 0x9e, 0x1, 0x95, 0x16, + 0xf7, 0x7d, 0x9e, 0x6, 0x64, 0x66, 0x9a, 0xab, 0x9e, 0xaa, 0xb2, 0xa0, + 0xa5, 0x1f, 0xf7, 0xb, 0xf7, 0x1e, 0xea, 0xfb, 0x16, 0x5, 0x9b, 0x74, + 0xae, 0x55, 0x79, 0x1a, 0x6c, 0x70, 0x7e, 0x59, 0x1e, 0x78, 0xf7, 0xbd, + 0x9e, 0x7, 0x57, 0x77, 0xa8, 0xc2, 0x64, 0x1f, 0xfb, 0x54, 0xf7, 0x9c, + 0xf7, 0x26, 0xf7, 0x40, 0x5, 0xe2, 0xd1, 0xa5, 0x9c, 0xc0, 0x1b, 0x9e, + 0xfb, 0x82, 0x78, 0x7, 0xad, 0xaf, 0x7f, 0x6c, 0x78, 0x7a, 0x77, 0x74, + 0x6e, 0x1f, 0xfb, 0x5, 0xfb, 0x14, 0x5, 0xfb, 0x1, 0xf7, 0x24, 0x79, + 0xac, 0x9f, 0x1a, 0xa9, 0xa3, 0x97, 0xbf, 0x1e, 0x9e, 0xfb, 0xc2, 0x78, + 0x7, 0xc5, 0xa0, 0x7a, 0xfb, 0x2a, 0xf1, 0x1f, 0xf7, 0x1, 0xfb, 0x2a, + 0x5, 0xfb, 0xac, 0xfb, 0x80, 0x80, 0x70, 0x54, 0x1b, 0xe, 0xf8, 0x1, + 0xa0, 0x76, 0xf9, 0x2a, 0x72, 0xa, 0xa6, 0xd3, 0x1a, 0xf7, 0x4c, 0x7, + 0xf7, 0x28, 0xf7, 0x6c, 0xd0, 0xf5, 0xac, 0x99, 0xaf, 0x8f, 0x19, 0x9e, + 0xfb, 0x6f, 0x78, 0x7, 0xaa, 0xb1, 0x7f, 0x75, 0x1d, 0xfb, 0x6c, 0xfb, + 0x28, 0xf7, 0x68, 0x75, 0xa, 0x96, 0xb9, 0x8d, 0x1e, 0x9e, 0xfb, 0xac, + 0x78, 0x7, 0xb8, 0x87, 0x9a, 0x7e, 0xf1, 0xfb, 0x2a, 0xf7, 0x17, 0xfb, + 0x4a, 0x18, 0xfb, 0x44, 0x7, 0x46, 0x88, 0x6f, 0x29, 0x89, 0x1e, 0xe, + 0x7b, 0xa, 0xf8, 0xde, 0xb1, 0x1, 0x94, 0xf8, 0xe0, 0x3f, 0x1d, 0xe, + 0x93, 0x1d, 0xe3, 0xd7, 0x3, 0xe3, 0xfb, 0x30, 0x15, 0xf7, 0x67, 0xa4, + 0x3f, 0x6, 0x5a, 0x81, 0xb3, 0x97, 0x1f, 0xf9, 0x34, 0x7, 0x99, 0x95, + 0xa9, 0xb8, 0x1e, 0xdb, 0xa4, 0xfb, 0x67, 0x6, 0xe, 0x3c, 0xfb, 0x23, + 0x76, 0xf7, 0x3f, 0x7a, 0x1d, 0xf7, 0x7e, 0xfb, 0x38, 0x15, 0xb6, 0x6, + 0xfb, 0x7c, 0xf9, 0xdc, 0x5, 0x60, 0x6, 0xe, 0x93, 0x1d, 0xf7, 0x3d, + 0xd7, 0x3, 0xad, 0xfb, 0x17, 0x15, 0x72, 0xf7, 0x67, 0xf9, 0xc6, 0xfb, + 0x67, 0x72, 0xd7, 0x7, 0xbc, 0x95, 0x63, 0x7f, 0x1f, 0xfd, 0x34, 0x7, + 0x7d, 0x81, 0x6d, 0x5e, 0x1e, 0xe, 0xf7, 0x4, 0xf9, 0x2a, 0x77, 0x1, + 0xa3, 0xf7, 0xbd, 0x15, 0xcf, 0x6, 0xf7, 0x23, 0xf7, 0xb5, 0xf7, 0x23, + 0xfb, 0xb5, 0x5, 0xcf, 0x6, 0xfb, 0x48, 0xf8, 0x1, 0x5, 0x4d, 0x6, + 0xe, 0xfb, 0x11, 0xbd, 0x1, 0x8b, 0xf8, 0x88, 0x3, 0x40, 0x4, 0x59, + 0xf8, 0x88, 0xbd, 0x7, 0xe, 0x92, 0x1d, 0x9e, 0xf7, 0x73, 0x3, 0xf7, + 0x5e, 0xf8, 0x8f, 0x15, 0xb3, 0x6, 0xfb, 0x1d, 0xf7, 0x24, 0x5, 0xa2, + 0x72, 0x7e, 0x94, 0xa, 0xa6, 0x79, 0x97, 0x7d, 0xa, 0x4f, 0x1d, 0x12, + 0xb0, 0xe3, 0x4a, 0xe3, 0xf7, 0x1f, 0xdc, 0x13, 0xd4, 0xf7, 0xb3, 0xf7, + 0xaa, 0x15, 0xfb, 0x2f, 0x7, 0x5d, 0x61, 0x6e, 0x55, 0x66, 0x6e, 0xaa, + 0xba, 0x1e, 0x8d, 0x7, 0xad, 0x96, 0xcd, 0xf7, 0x2b, 0xbd, 0x1e, 0x8c, + 0xfb, 0x6b, 0x15, 0x43, 0x90, 0xb5, 0x8a, 0x2f, 0xa, 0x40, 0xa, 0xef, + 0xfb, 0x29, 0x1e, 0x13, 0xcc, 0x3e, 0x1d, 0x13, 0xb4, 0xaa, 0xb1, 0x9d, + 0xac, 0xa9, 0xba, 0x80, 0x43, 0x1e, 0x58, 0x7, 0xfb, 0x37, 0x4b, 0x34, + 0x5f, 0x27, 0x1a, 0x48, 0xbf, 0x66, 0xc1, 0xc2, 0xc0, 0xb3, 0xac, 0xb0, + 0x1e, 0xe, 0x81, 0xab, 0xf8, 0xb, 0xca, 0xf7, 0x73, 0x77, 0x1, 0xd0, + 0xdf, 0xf7, 0x77, 0xe3, 0x3, 0xf7, 0x2d, 0xd1, 0x15, 0xf7, 0x90, 0x7, + 0xc4, 0xcf, 0x9d, 0xab, 0xe6, 0xaf, 0x24, 0x2e, 0x49, 0x7b, 0xfb, 0x5, + 0xfb, 0x7, 0x72, 0x44, 0x98, 0xae, 0x1e, 0xf7, 0xc9, 0x4, 0xf7, 0xc2, + 0x7, 0x86, 0x8d, 0x6b, 0x1d, 0x6c, 0x6d, 0x1f, 0xfc, 0x91, 0x7, 0x66, + 0xf4, 0x70, 0xbd, 0xf7, 0x4d, 0xc6, 0xf7, 0x32, 0xe5, 0xf6, 0x52, 0xf7, + 0x7, 0xfb, 0xd, 0x3f, 0x56, 0x51, 0x74, 0x85, 0x1e, 0xe, 0xe2, 0x81, + 0xd3, 0xf8, 0x5, 0xa8, 0x1, 0xa4, 0xd8, 0x3, 0xf8, 0x30, 0xf7, 0x27, + 0x15, 0x63, 0x1d, 0x93, 0x79, 0x6d, 0x93, 0x1f, 0x5f, 0x97, 0x99, 0x73, + 0xa5, 0x1b, 0xa9, 0x9b, 0xa0, 0xa2, 0x9d, 0x81, 0xaa, 0x6d, 0xa0, 0x1f, + 0x9b, 0x72, 0x5b, 0x9a, 0x67, 0x1b, 0xfb, 0x0, 0xfb, 0x8, 0x38, 0xfb, + 0x38, 0xfb, 0x32, 0xf6, 0x4a, 0xdb, 0xdc, 0xcc, 0xb6, 0xf7, 0x6, 0xc1, + 0x1f, 0xe, 0x81, 0xbf, 0xf8, 0x1a, 0xa7, 0xf7, 0x78, 0x77, 0x1, 0xa6, + 0xe1, 0xf7, 0x77, 0xdf, 0x3, 0xf7, 0xe8, 0xf1, 0x15, 0x67, 0x83, 0x64, + 0x73, 0x61, 0x1b, 0x49, 0x43, 0xc3, 0xf7, 0x29, 0xf7, 0x1c, 0xcf, 0xbc, + 0xc3, 0xba, 0xbc, 0x6b, 0x47, 0x92, 0x1f, 0xfb, 0xe7, 0x4, 0x8f, 0x88, + 0xc0, 0x9e, 0xb9, 0x9b, 0xbb, 0x9c, 0x19, 0x9b, 0x7, 0x48, 0x86, 0x8b, + 0xa9, 0xb4, 0x1a, 0xf8, 0xc1, 0x7, 0x86, 0x8d, 0x5b, 0x7a, 0x5a, 0x7d, + 0x59, 0x6f, 0x1d, 0x93, 0x95, 0x82, 0xa, 0x6c, 0x6d, 0x1f, 0xfb, 0x26, + 0x7, 0xa8, 0x6a, 0x6d, 0x99, 0x60, 0x1b, 0xfb, 0x4, 0x2c, 0xfb, 0x7, + 0xfb, 0x17, 0xfb, 0x60, 0xf7, 0x23, 0x77, 0xb2, 0xd5, 0xb0, 0xb0, 0xa6, + 0x9d, 0x1f, 0x8d, 0x6, 0xe, 0x87, 0x1d, 0xf6, 0xaf, 0x1, 0xae, 0xd0, + 0xf7, 0x5b, 0xf1, 0x3, 0x37, 0x1d, 0x58, 0xfb, 0x4d, 0xfb, 0x22, 0xd7, + 0x2f, 0x2b, 0xa, 0x3d, 0x1d, 0xe, 0x73, 0xa0, 0x76, 0xf8, 0x36, 0xab, + 0xf7, 0x61, 0xa7, 0x1, 0xf2, 0xdf, 0x3, 0x9f, 0x16, 0xf7, 0x98, 0x9a, + 0x6, 0x2f, 0x8d, 0x8a, 0xaf, 0xc8, 0x1a, 0xf7, 0xc4, 0xf7, 0xe, 0xab, + 0xfb, 0xf, 0xf7, 0x8, 0x7, 0xb0, 0x90, 0xbf, 0xc2, 0xa1, 0x98, 0x7a, + 0x79, 0x97, 0x1e, 0x77, 0x98, 0x97, 0x77, 0xa1, 0x1b, 0x9f, 0xa2, 0x98, + 0xa8, 0xad, 0x5f, 0xa6, 0x53, 0xfb, 0x48, 0x8b, 0xfb, 0x45, 0x53, 0x1f, + 0x38, 0x6b, 0xde, 0xfb, 0xc4, 0x6, 0x3e, 0x7a, 0x78, 0x49, 0x88, 0x1e, + 0xe, 0xfb, 0x6e, 0xc4, 0xf7, 0x26, 0xd4, 0xe6, 0xa4, 0xf7, 0x8c, 0xb2, + 0x6e, 0xa7, 0x1, 0xa7, 0xd1, 0x6e, 0xde, 0xf7, 0x45, 0xd8, 0xa6, 0xa7, + 0x3, 0xf7, 0x27, 0x89, 0x15, 0x6c, 0x66, 0x79, 0x77, 0x6c, 0x1a, 0x6b, + 0xa1, 0x64, 0xeb, 0xf7, 0x9, 0xef, 0xb8, 0xbf, 0xb8, 0x5a, 0x8c, 0x41, + 0x8e, 0x1e, 0x2d, 0x8e, 0x76, 0x8a, 0x5b, 0x96, 0x8, 0x90, 0xf7, 0xec, + 0x15, 0x3b, 0xa6, 0x33, 0xd8, 0xcf, 0x90, 0xcf, 0xbe, 0xbe, 0x7a, 0xe3, + 0x36, 0x67, 0x64, 0x75, 0x47, 0x1e, 0x71, 0xfb, 0xe9, 0x15, 0x70, 0x98, + 0x71, 0x97, 0xa7, 0x1a, 0x9d, 0x8b, 0x96, 0xe4, 0xdb, 0x1e, 0x4f, 0xa6, + 0x6a, 0xb7, 0xc6, 0x1a, 0xf7, 0xf, 0xe3, 0xb7, 0xe0, 0xae, 0xad, 0x83, + 0x7c, 0xa6, 0x1e, 0x80, 0x9f, 0x9e, 0x8c, 0x9b, 0x1b, 0xd8, 0x64, 0x38, + 0x6, 0x94, 0x74, 0x95, 0x77, 0x5a, 0x1a, 0xfb, 0x0, 0x24, 0x64, 0x53, + 0x1e, 0x7e, 0x68, 0x90, 0x85, 0x1b, 0x77, 0x88, 0x63, 0x62, 0x78, 0x1a, + 0x74, 0xbc, 0x87, 0xa8, 0x1e, 0xf7, 0x15, 0x85, 0x5, 0xf6, 0x86, 0x99, + 0x41, 0x6f, 0x1a, 0xfb, 0x5, 0xfb, 0x3a, 0x53, 0x31, 0x26, 0x3f, 0xb7, + 0xc0, 0xb9, 0xba, 0xb1, 0xbe, 0xb1, 0x1e, 0xe, 0xa0, 0x76, 0xf8, 0x2a, + 0xc1, 0xf7, 0x73, 0x77, 0x1, 0xd4, 0xdf, 0xf7, 0x4e, 0xdf, 0x3, 0x94, + 0x16, 0xf7, 0x6c, 0x9a, 0x6, 0x5a, 0x90, 0x78, 0x9a, 0xd8, 0x1a, 0xf7, + 0x7b, 0x7, 0xbb, 0xb4, 0xb2, 0x9a, 0xa8, 0x1b, 0xc2, 0xa1, 0x64, 0x48, + 0x1f, 0xfb, 0x50, 0x7, 0x3e, 0x78, 0x7c, 0x5a, 0x86, 0x1e, 0x7c, 0xf7, + 0x68, 0x9a, 0x7, 0x59, 0x94, 0x81, 0x9a, 0xd4, 0x1a, 0xf7, 0x51, 0x7, + 0xb3, 0x8a, 0xf7, 0xb, 0xfb, 0xf, 0x4f, 0x5a, 0x6b, 0x59, 0x68, 0x1e, + 0x89, 0xf7, 0xc2, 0x6, 0x86, 0x8e, 0x5b, 0x7a, 0x59, 0x7d, 0x5e, 0x7e, + 0x19, 0x71, 0x7, 0x8c, 0x8e, 0x96, 0x82, 0xa, 0x76, 0x6d, 0x1f, 0xfc, + 0x57, 0x7, 0x42, 0x81, 0x7a, 0x55, 0x84, 0x1e, 0xe, 0x8f, 0xa, 0xf8, + 0xd9, 0xf1, 0x12, 0xd9, 0xf0, 0x37, 0xdf, 0x13, 0xe0, 0x31, 0x1d, 0x57, + 0x78, 0x54, 0x78, 0x57, 0x7a, 0x19, 0x7c, 0x7, 0x8d, 0x98, 0x9c, 0x8d, + 0x99, 0x1b, 0x13, 0xd0, 0x9b, 0x9e, 0x80, 0x50, 0x1f, 0xfb, 0x68, 0x7, + 0x3d, 0x7a, 0x7b, 0x4d, 0x88, 0x1e, 0x13, 0xe0, 0xc9, 0xf8, 0xfd, 0x64, + 0x1d, 0x3c, 0xfb, 0x6e, 0xad, 0xf9, 0x91, 0xf1, 0x12, 0xf3, 0xf0, 0x2b, + 0xdf, 0x13, 0xd0, 0xab, 0xf8, 0x1a, 0x15, 0x8d, 0x9a, 0x98, 0x8d, 0x99, + 0x1b, 0x9b, 0x9e, 0x80, 0x50, 0x1f, 0xfc, 0x5, 0x7, 0x39, 0x8b, 0x52, + 0x59, 0x78, 0x80, 0x9b, 0x9b, 0x7e, 0x1e, 0x99, 0x7f, 0x7e, 0x99, 0x76, + 0x1b, 0x78, 0x76, 0x7c, 0x74, 0x66, 0xb9, 0x78, 0xba, 0xf7, 0x15, 0xb4, + 0xf0, 0xf7, 0x9, 0x1f, 0x8c, 0xf8, 0x5d, 0x85, 0x8e, 0x57, 0x77, 0x57, + 0x79, 0x57, 0x7b, 0x19, 0x13, 0xe0, 0xc7, 0xf7, 0x76, 0x64, 0x1d, 0xa0, + 0x76, 0xf8, 0x56, 0x77, 0xf7, 0x91, 0x77, 0x1, 0xdd, 0xdf, 0x3, 0x92, + 0x16, 0xf7, 0x7e, 0x9a, 0x6, 0x77, 0x8c, 0x5, 0x6a, 0x8d, 0x75, 0x9d, + 0xb4, 0x1a, 0xf7, 0x3f, 0x8d, 0x7, 0xf7, 0x1e, 0xfb, 0x4c, 0x5, 0x97, + 0x7a, 0x94, 0x82, 0x84, 0x1a, 0x7e, 0x7e, 0x88, 0x83, 0x1e, 0x78, 0x7c, + 0xf7, 0x6e, 0x9a, 0x6, 0x70, 0x8d, 0x64, 0x92, 0x58, 0xcb, 0xfb, 0x2d, + 0xf7, 0x56, 0x18, 0xa8, 0xa6, 0x5, 0xf7, 0x12, 0xf7, 0x1b, 0xa7, 0x8b, + 0xc0, 0x1b, 0x9a, 0xfb, 0x60, 0x7d, 0x7, 0xb5, 0x93, 0x83, 0x80, 0x82, + 0x83, 0x80, 0x7c, 0x7d, 0x1f, 0x63, 0x69, 0x50, 0x54, 0x67, 0x6c, 0x89, + 0x8d, 0x18, 0xf8, 0x34, 0x7, 0x87, 0x8d, 0x56, 0x7a, 0x56, 0x7d, 0x5a, + 0x6f, 0x1d, 0x93, 0x94, 0x8c, 0x98, 0x1b, 0xb2, 0x91, 0x71, 0x5e, 0x1f, + 0xfc, 0x70, 0x7, 0x69, 0x83, 0x79, 0x48, 0x80, 0x1e, 0xe, 0x8f, 0xa, + 0xf9, 0x3f, 0x77, 0x1, 0xed, 0xdf, 0x3, 0x9e, 0x16, 0xf7, 0x82, 0x9a, + 0x6, 0x51, 0x8e, 0x7a, 0x9d, 0xc5, 0x1a, 0xf8, 0xdf, 0x5d, 0xa, 0xfc, + 0x67, 0x7, 0x54, 0x77, 0x74, 0x50, 0x84, 0x1d, 0xf8, 0x39, 0xa0, 0x76, + 0xf8, 0x2c, 0xbf, 0x1, 0xe1, 0xdf, 0xf7, 0x4c, 0xdf, 0xf7, 0x4c, 0xdf, + 0x14, 0x38, 0x9b, 0x16, 0xf7, 0x72, 0x9a, 0x6, 0x68, 0x8c, 0x6a, 0x98, + 0xcb, 0x1a, 0xf7, 0x94, 0x7, 0x90, 0xb9, 0xc1, 0xd0, 0xbf, 0x9c, 0x64, + 0x49, 0x1e, 0xfb, 0x63, 0x7, 0x4a, 0x74, 0x7e, 0x5e, 0x88, 0x1e, 0x7c, + 0xf7, 0x74, 0x9a, 0x7, 0x62, 0x8c, 0x6c, 0x9c, 0xca, 0x1a, 0xf7, 0x8f, + 0x7, 0xad, 0xa1, 0xad, 0xa6, 0xc2, 0x1b, 0xd3, 0x8c, 0x50, 0x58, 0x1f, + 0xfb, 0x5d, 0x7, 0x4b, 0x7b, 0x7f, 0x59, 0x85, 0x1e, 0x7c, 0xf7, 0x6f, + 0x9a, 0x7, 0x71, 0x8d, 0x5, 0x5f, 0x92, 0x8c, 0xac, 0xb3, 0x1a, 0xf7, + 0x4d, 0x7, 0xd5, 0x7d, 0xf3, 0x23, 0x3c, 0x4e, 0x4f, 0x73, 0x76, 0x1e, + 0xb5, 0x80, 0x6c, 0xb5, 0x4a, 0x1b, 0x55, 0x62, 0x6b, 0x5e, 0x50, 0x1f, + 0xd6, 0x7, 0x84, 0x8d, 0x5d, 0x7a, 0x59, 0x7c, 0x5c, 0x7e, 0x19, 0x7a, + 0x7, 0x8d, 0x93, 0x98, 0x53, 0x1d, 0x4c, 0x1f, 0xfb, 0x87, 0x7, 0x48, + 0x6d, 0x7f, 0x63, 0x8a, 0x1e, 0xe, 0xa0, 0x76, 0xf8, 0x2a, 0xc2, 0x73, + 0xa, 0xa5, 0xbe, 0x1a, 0xf7, 0x91, 0x7e, 0xa, 0xfb, 0x6e, 0x7, 0x50, + 0x71, 0x7e, 0x82, 0x1d, 0xa4, 0xba, 0x1a, 0xf7, 0x6f, 0x46, 0xa, 0xe, + 0x7f, 0xa7, 0xf8, 0x35, 0xa7, 0x1, 0xb8, 0xe5, 0xf7, 0x82, 0xe5, 0x3, + 0xa8, 0xf7, 0x7a, 0x15, 0xfb, 0x1b, 0xe5, 0x22, 0x65, 0x1d, 0xf7, 0x1d, + 0xee, 0xf7, 0x25, 0x2d, 0xe4, 0xfb, 0x17, 0xfb, 0x1a, 0x39, 0x20, 0xfb, + 0xf, 0x1e, 0xe5, 0xa0, 0x15, 0xf3, 0xca, 0xd8, 0xca, 0xe7, 0xb6, 0x37, + 0x80, 0xa, 0x39, 0x4c, 0x58, 0xfb, 0xc, 0x83, 0xf7, 0x33, 0xd5, 0x1e, + 0xe, 0x8e, 0x1d, 0x1, 0xd6, 0xdf, 0xf7, 0x75, 0xe1, 0x3, 0xf7, 0x33, + 0xac, 0x15, 0x5f, 0x1d, 0x76, 0x1f, 0x89, 0x8d, 0x5, 0xd4, 0x7, 0x85, + 0x8d, 0x5b, 0x78, 0x5b, 0x7a, 0x5b, 0x7c, 0x19, 0x7b, 0x7, 0x8c, 0x94, + 0x95, 0x8b, 0x94, 0x1b, 0xae, 0x8e, 0x7a, 0x63, 0x1f, 0xfc, 0x5e, 0x7, + 0x60, 0x87, 0x6c, 0x49, 0x86, 0x1e, 0x7a, 0xf7, 0x86, 0x9d, 0x7, 0x43, + 0x7b, 0xa1, 0xc5, 0x1f, 0xf7, 0x63, 0x4, 0x5a, 0xa, 0xfb, 0x58, 0x76, + 0xf7, 0x63, 0xc8, 0xf8, 0x11, 0xa7, 0x1, 0xa3, 0xe1, 0xf7, 0x7b, 0xdf, + 0x3, 0xf7, 0x90, 0xfb, 0x5c, 0x15, 0x7a, 0xf7, 0x80, 0x99, 0x7, 0x5e, + 0x95, 0x79, 0x9b, 0xc7, 0x1a, 0xf8, 0xd1, 0x7, 0x84, 0x8f, 0x51, 0x68, + 0x5, 0xa1, 0x64, 0x74, 0x98, 0x58, 0x1b, 0xfb, 0x11, 0x29, 0xfb, 0x2, + 0xfb, 0x1e, 0xfb, 0x2b, 0xd6, 0x44, 0xe4, 0xc8, 0xd1, 0xb5, 0xa9, 0x9c, + 0x1f, 0x90, 0xfb, 0x44, 0x6, 0x59, 0x7d, 0x6a, 0x40, 0x88, 0x1e, 0xe4, + 0xf7, 0xdb, 0x15, 0x8a, 0x6b, 0x8b, 0x7b, 0x57, 0x78, 0x8, 0x84, 0x79, + 0x7a, 0x89, 0x7c, 0x1b, 0x32, 0x64, 0xea, 0xe7, 0xf7, 0xd, 0xc1, 0xd4, + 0xdc, 0xea, 0x8c, 0x44, 0x6f, 0x1f, 0xe, 0x73, 0xa0, 0x76, 0xf8, 0x21, + 0xca, 0x55, 0xc1, 0x12, 0xd7, 0xdf, 0x13, 0xd0, 0x90, 0x16, 0xf7, 0x84, + 0x9a, 0x6, 0x58, 0x8d, 0x69, 0x99, 0xd0, 0x1a, 0xf7, 0x6b, 0x7, 0xab, + 0xb7, 0xbd, 0xa3, 0x98, 0x94, 0x81, 0x82, 0x95, 0x1e, 0x83, 0x95, 0x95, + 0x83, 0x9c, 0x1b, 0x13, 0xb0, 0xa3, 0x99, 0x9e, 0xa4, 0xac, 0x77, 0xa0, + 0x69, 0x65, 0x69, 0x77, 0x44, 0x5c, 0x1f, 0x89, 0xe4, 0x6, 0x86, 0x8d, + 0x5a, 0x77, 0x59, 0x79, 0x5a, 0x7b, 0x19, 0x7b, 0x7, 0x8d, 0x94, 0x96, + 0x53, 0x1d, 0x50, 0x1f, 0xfb, 0x7e, 0x7, 0x4b, 0x7b, 0x80, 0x54, 0x81, + 0x1e, 0xe, 0xab, 0x7d, 0xa1, 0xf8, 0x3c, 0xa2, 0x87, 0x77, 0x12, 0xc9, + 0xc9, 0xf7, 0x2e, 0xd1, 0x57, 0x9a, 0x13, 0xd8, 0xbe, 0x81, 0x15, 0x99, + 0x91, 0x5, 0x94, 0x91, 0x99, 0x8e, 0x97, 0x1b, 0x9c, 0x8c, 0x9d, 0x84, + 0xa1, 0x86, 0x8, 0x87, 0x9a, 0x9b, 0x88, 0x9d, 0x1b, 0xcb, 0xdc, 0xb5, + 0xe2, 0xc7, 0x68, 0x66, 0xa, 0x1e, 0x13, 0xd4, 0xb7, 0xb4, 0x76, 0x25, + 0xa1, 0x1f, 0x9a, 0x6, 0x13, 0xb4, 0xf7, 0x1d, 0x80, 0x7, 0x87, 0x88, + 0x7c, 0x84, 0x82, 0x1b, 0x81, 0x80, 0x91, 0x91, 0x7b, 0x1f, 0x8f, 0x7f, + 0x7d, 0x7c, 0x1d, 0xc5, 0x6a, 0x5, 0x13, 0xd8, 0xab, 0x79, 0x9f, 0x73, + 0x6b, 0x1a, 0x52, 0x5c, 0x95, 0xa, 0x7a, 0x6, 0xe, 0x3c, 0x81, 0xbf, + 0xf8, 0x2, 0xab, 0x1, 0xd1, 0xdf, 0x3, 0xf7, 0x9e, 0xd8, 0x15, 0x7e, + 0x80, 0x79, 0x75, 0x6b, 0x1b, 0x58, 0x8b, 0xc6, 0xaa, 0x1f, 0xf7, 0xa8, + 0xf0, 0xab, 0x26, 0xf7, 0x12, 0x7, 0x93, 0x8b, 0x90, 0x84, 0x1e, 0x66, + 0x56, 0x7c, 0x6b, 0x65, 0x64, 0x8, 0x75, 0x75, 0x75, 0x85, 0x7f, 0x1a, + 0x88, 0x8d, 0x88, 0x8d, 0x8a, 0x1e, 0xc0, 0xfb, 0xb7, 0x6, 0x27, 0xb4, + 0x70, 0xbe, 0xb9, 0xba, 0xac, 0xb6, 0xa3, 0x1e, 0xe, 0x81, 0xc7, 0xf8, + 0x24, 0x90, 0xa, 0xf7, 0xe6, 0x84, 0x15, 0x8d, 0x89, 0xba, 0x9c, 0xb1, + 0x99, 0xc1, 0x99, 0x19, 0x32, 0xa, 0xfb, 0x75, 0x52, 0xa, 0x7d, 0x2c, + 0x1d, 0x9d, 0xbb, 0x8f, 0xb2, 0xb2, 0x1e, 0xb6, 0xb6, 0x5, 0xe, 0x92, + 0x76, 0xf8, 0x64, 0x77, 0x1, 0x9e, 0xf8, 0x47, 0x15, 0x9f, 0x8a, 0x9f, + 0x7b, 0x9a, 0x6d, 0xaf, 0x44, 0xeb, 0xfb, 0x72, 0xa3, 0x4d, 0x8, 0x60, + 0x9b, 0x8d, 0x87, 0x94, 0x1b, 0x92, 0x94, 0xa2, 0xa6, 0x96, 0x1f, 0xf7, + 0x14, 0xf7, 0xcb, 0xa3, 0xc6, 0x92, 0xa5, 0xad, 0x8e, 0x19, 0x9a, 0xfb, + 0x1f, 0x7c, 0x7, 0xa4, 0x8a, 0xa1, 0x78, 0x74, 0x1a, 0x67, 0x44, 0xfb, + 0x26, 0x69, 0x2b, 0x1e, 0x25, 0xf7, 0x8a, 0x5, 0x88, 0x93, 0x85, 0x9a, + 0x97, 0x1a, 0xa4, 0xa1, 0x98, 0xa3, 0x8d, 0x1e, 0x9a, 0xfb, 0x58, 0x7, + 0xe, 0xf8, 0x1, 0x92, 0x76, 0xf8, 0x64, 0x77, 0x12, 0xa0, 0xf7, 0x48, + 0xf8, 0x6, 0xf7, 0xf, 0x17, 0xa0, 0xf8, 0x47, 0x15, 0xa4, 0x89, 0x93, + 0x74, 0x9f, 0x5b, 0xf7, 0x1b, 0xfb, 0xe0, 0x18, 0x69, 0x99, 0x90, 0x81, + 0x92, 0x1b, 0x91, 0x90, 0x96, 0xa7, 0x99, 0x1f, 0xf7, 0x4, 0xf7, 0x84, + 0xe6, 0xfb, 0x80, 0x5, 0x67, 0x99, 0x8d, 0x84, 0x93, 0x1b, 0x93, 0x8f, + 0x95, 0xb2, 0x9b, 0x1f, 0xf7, 0x1e, 0xf7, 0xe4, 0x9a, 0xb0, 0x90, 0x9f, + 0xa0, 0x92, 0x19, 0x13, 0x70, 0x9a, 0xfb, 0xf, 0x7c, 0x7, 0xa3, 0x86, + 0x9f, 0x7d, 0x73, 0x1a, 0x7f, 0x85, 0x70, 0x80, 0x72, 0x1e, 0x31, 0xfb, + 0x68, 0x3b, 0xf7, 0x6a, 0x5, 0x7c, 0xb2, 0x85, 0x8c, 0x9d, 0x1a, 0xa8, + 0xa4, 0x98, 0xac, 0x90, 0x1e, 0x9a, 0xfb, 0x5f, 0x7c, 0x7, 0xb4, 0x86, + 0x96, 0x84, 0xb0, 0xfb, 0x5, 0x30, 0xfb, 0x5b, 0x18, 0x5d, 0xf7, 0x14, + 0x50, 0xf7, 0x9, 0xae, 0x1a, 0xa7, 0xa2, 0x99, 0xa2, 0x8d, 0x1e, 0x9a, + 0xfb, 0x48, 0x7, 0xe, 0xa0, 0x76, 0xf8, 0x59, 0x77, 0x12, 0x9c, 0xf7, + 0x25, 0xf7, 0x8, 0xf7, 0x5d, 0x17, 0x9c, 0x16, 0xf7, 0x25, 0x9a, 0x6, + 0x7a, 0x76, 0x95, 0x9d, 0x89, 0x1f, 0x96, 0x99, 0xa0, 0x91, 0x94, 0x1e, + 0x13, 0xf0, 0xda, 0xf7, 0x5, 0xdc, 0xfb, 0x6, 0x5, 0x8f, 0x86, 0x97, + 0x7f, 0x7c, 0x1a, 0x76, 0x82, 0x7d, 0x6c, 0x8a, 0x1e, 0x7c, 0xf7, 0x5d, + 0x9a, 0x7, 0x7a, 0x8c, 0x70, 0x96, 0x65, 0xc5, 0xfb, 0x14, 0xf7, 0x4e, + 0x18, 0xde, 0xf7, 0x2, 0x93, 0x98, 0xa9, 0xb3, 0xb6, 0x8c, 0x19, 0x9a, + 0xfb, 0x32, 0x7c, 0x7, 0x9c, 0x8a, 0xa2, 0x80, 0x76, 0x1a, 0x80, 0x85, + 0x82, 0x4e, 0x33, 0x1e, 0x78, 0xa8, 0x62, 0xc8, 0x9d, 0x1a, 0xa0, 0xa4, + 0x97, 0x9d, 0x1e, 0x9a, 0xfb, 0x63, 0x7c, 0x7, 0xac, 0x8c, 0x97, 0x81, + 0xb4, 0x4e, 0xe9, 0xfb, 0x1a, 0x18, 0xfb, 0x6, 0xfb, 0x2f, 0x6b, 0x5d, + 0x7d, 0x7f, 0x70, 0x88, 0x19, 0xe, 0x96, 0xa, 0xf8, 0xca, 0x77, 0x12, + 0x13, 0xa0, 0xf7, 0x86, 0xa1, 0x15, 0x68, 0x85, 0x68, 0xfb, 0xd, 0x57, + 0x1b, 0x13, 0x60, 0x45, 0xa, 0x9b, 0xb4, 0x9e, 0x4a, 0xa, 0x3d, 0xfb, + 0x68, 0x3b, 0xa, 0x8, 0xe, 0xe2, 0x61, 0xa9, 0xf8, 0x46, 0xa9, 0x6a, + 0xa, 0x7b, 0x6c, 0x21, 0x1b, 0xfb, 0x14, 0x56, 0x1d, 0xe, 0x92, 0xa, + 0x12, 0xf7, 0x47, 0xd5, 0x47, 0xd5, 0x13, 0xe0, 0xef, 0xf7, 0x8e, 0x15, + 0x13, 0xd0, 0xd0, 0x78, 0x9b, 0x5f, 0x4b, 0x98, 0xa, 0xfb, 0xc, 0xc9, + 0x77, 0xf2, 0x1e, 0x96, 0x7, 0x44, 0x9b, 0x77, 0xb5, 0xd0, 0x1a, 0xf7, + 0x38, 0x7, 0xd2, 0x7e, 0xb2, 0x3d, 0x9c, 0x1e, 0x8d, 0x7, 0xd9, 0x9d, + 0x98, 0xb2, 0xd2, 0x1a, 0xf7, 0x38, 0x7, 0xd0, 0x9f, 0xb5, 0xd2, 0x9b, + 0x1e, 0x96, 0x7, 0x24, 0x4d, 0x77, 0xfb, 0xb, 0x1f, 0xfb, 0x3b, 0x7, + 0x4b, 0x7b, 0x61, 0x46, 0x79, 0x1e, 0xe, 0xfb, 0x31, 0xfb, 0x2a, 0x76, + 0xf7, 0x46, 0x7a, 0x1d, 0xce, 0xcd, 0x55, 0xb4, 0x3, 0xda, 0xfb, 0x3f, + 0x15, 0xb4, 0xf9, 0xe3, 0x62, 0x6, 0xe, 0x92, 0xa, 0x1, 0xf7, 0x70, + 0xd5, 0x3, 0xf7, 0x16, 0xfb, 0x3e, 0x15, 0x80, 0x7, 0xf2, 0xc8, 0x9f, + 0xf7, 0xc, 0x1f, 0xf7, 0x38, 0x7, 0xcb, 0x9c, 0xb7, 0xd0, 0x9e, 0x1e, + 0x46, 0x9d, 0x7a, 0xb5, 0xcb, 0x1a, 0xf7, 0x3b, 0x7, 0xf7, 0xb, 0x4e, + 0x9f, 0x24, 0x1e, 0x80, 0x7, 0xd2, 0x7b, 0x9e, 0x61, 0x46, 0x98, 0xa, + 0x44, 0x98, 0x64, 0xd9, 0x79, 0x1e, 0x89, 0x7, 0x3d, 0x7a, 0x7e, 0x64, + 0x44, 0x98, 0xa, 0x46, 0x78, 0x61, 0x44, 0x7b, 0x1e, 0xe, 0xf7, 0x4c, + 0xf7, 0x4b, 0xcb, 0x97, 0xcb, 0x1, 0xd7, 0xf7, 0x4b, 0x15, 0xae, 0x9b, + 0xa3, 0xb4, 0xb7, 0x1b, 0xba, 0xa7, 0x79, 0x79, 0xa6, 0x1f, 0x77, 0xa8, + 0xa9, 0x77, 0xc3, 0x1b, 0xc9, 0xac, 0xbb, 0xb5, 0xa9, 0x1f, 0x67, 0xbd, + 0x5, 0x68, 0x74, 0x72, 0x62, 0x63, 0x1b, 0x6d, 0x6e, 0x9e, 0x9e, 0x69, + 0x1f, 0x9e, 0x69, 0x64, 0x9e, 0x5c, 0x1b, 0x48, 0x67, 0x5b, 0x61, 0x75, + 0x1f, 0xe, 0x73, 0xfb, 0x59, 0x76, 0xf8, 0xd5, 0xf7, 0x0, 0x1, 0xec, + 0xf7, 0x0, 0x3, 0xf7, 0x23, 0xf7, 0xac, 0x15, 0x98, 0x6, 0xa5, 0xfb, + 0x5d, 0xa2, 0xfb, 0x48, 0x73, 0x1a, 0x5a, 0x7f, 0x5f, 0x5f, 0x61, 0x81, + 0xb2, 0xbf, 0xa4, 0xa0, 0xf7, 0x49, 0xa4, 0xf7, 0x5d, 0x1e, 0x5d, 0xf7, + 0x19, 0x15, 0x6d, 0xa3, 0x73, 0xa9, 0xa9, 0xa3, 0xa3, 0xa9, 0xa9, 0x73, + 0xa3, 0x6d, 0x6d, 0x73, 0x73, 0x6d, 0x1e, 0xe, 0x87, 0xd4, 0x52, 0xbf, + 0xf7, 0xfc, 0xa9, 0x73, 0xa9, 0x12, 0xca, 0xd8, 0x13, 0xa8, 0xf7, 0xa, + 0xfb, 0x1e, 0x15, 0xad, 0x6, 0xbc, 0xf7, 0x1e, 0x5, 0x86, 0x9d, 0x99, + 0x87, 0xa1, 0x1b, 0xe2, 0xc6, 0xc8, 0xf3, 0xba, 0x1f, 0x7e, 0x93, 0x5, + 0x13, 0x68, 0x45, 0x5d, 0x62, 0x6d, 0x4d, 0x1b, 0x74, 0x7c, 0x90, 0x92, + 0x78, 0x1f, 0xf0, 0xf7, 0xb7, 0x5, 0x67, 0x9b, 0x9a, 0x7b, 0xa8, 0x1b, + 0xa2, 0x9d, 0x9e, 0xa5, 0xad, 0x6b, 0xaf, 0x60, 0x99, 0x1f, 0xba, 0xf7, + 0x1b, 0x5, 0x68, 0x6, 0x5f, 0xfb, 0x10, 0x5, 0x13, 0x98, 0x8e, 0x78, + 0x7b, 0x8d, 0x7b, 0x1b, 0xfb, 0x19, 0x34, 0xfb, 0x7, 0xfb, 0xe, 0x1f, + 0x13, 0x68, 0x3f, 0xac, 0x3c, 0xde, 0x53, 0x1e, 0xa8, 0xe1, 0x15, 0x5c, + 0xb1, 0x76, 0xbf, 0xce, 0x1a, 0x13, 0x98, 0xf7, 0x19, 0xde, 0xb5, 0xbf, + 0xa1, 0x98, 0x87, 0x86, 0x98, 0x1e, 0xe, 0x83, 0xa7, 0x6f, 0xdf, 0x37, + 0xf7, 0x1e, 0xf7, 0x5a, 0xb8, 0xf7, 0x31, 0xf7, 0x26, 0x70, 0xa6, 0x12, + 0xf7, 0xf, 0xe0, 0xf7, 0x2b, 0xe4, 0x13, 0x57, 0xf7, 0x46, 0xc1, 0x15, + 0x6c, 0xb7, 0xba, 0x6c, 0xbe, 0x1b, 0xd7, 0xe9, 0xda, 0xcc, 0x90, 0x88, + 0x8b, 0x88, 0x1f, 0x76, 0x75, 0x4a, 0x2f, 0x1b, 0x6b, 0x53, 0x92, 0xa7, + 0x4d, 0x1f, 0xa2, 0xed, 0x8e, 0xac, 0x89, 0xc6, 0x8a, 0xa6, 0x18, 0xf7, + 0x18, 0xb8, 0xfb, 0x1b, 0x6, 0x84, 0xc4, 0x87, 0xab, 0xbe, 0x1a, 0xae, + 0x93, 0xf0, 0xe2, 0x97, 0xb7, 0x8b, 0x57, 0x1e, 0x13, 0x3b, 0x6a, 0x8b, + 0x69, 0xb3, 0xa4, 0xa3, 0x9e, 0xad, 0xb9, 0x5d, 0xba, 0x37, 0x22, 0x31, + 0x42, 0xfb, 0x37, 0x6b, 0x8e, 0x7d, 0x8f, 0x76, 0x1e, 0x20, 0x5e, 0xf7, + 0x0, 0x6, 0x90, 0x60, 0x90, 0x69, 0x8f, 0x6e, 0x90, 0x64, 0x8f, 0x6d, + 0x86, 0x6f, 0x8, 0x8f, 0x7d, 0x7d, 0x8c, 0x7d, 0x1b, 0x59, 0x5e, 0x72, + 0x57, 0x60, 0xae, 0x79, 0xab, 0xb9, 0xa5, 0xa9, 0xab, 0xa6, 0x1f, 0xfb, + 0x20, 0x8d, 0x15, 0xa8, 0xab, 0x94, 0xa7, 0xa2, 0xa0, 0x83, 0x82, 0x1e, + 0x13, 0x9b, 0x81, 0x7b, 0x5c, 0x5b, 0x75, 0x79, 0x9a, 0xa0, 0x1e, 0xe, + 0xf7, 0x1d, 0xc4, 0xf7, 0xa4, 0xc4, 0x12, 0xaf, 0xce, 0x5d, 0xc8, 0xf7, + 0x9c, 0xc8, 0x5d, 0xce, 0x13, 0xd4, 0xf7, 0xa, 0xf7, 0xdf, 0x15, 0xd3, + 0xc4, 0xca, 0xd7, 0x1e, 0x13, 0xe8, 0xd6, 0xc3, 0x4c, 0x43, 0x41, 0x53, + 0x4c, 0x40, 0x1f, 0x13, 0xd4, 0x3f, 0x52, 0xca, 0xd5, 0x1f, 0x47, 0xfb, + 0x8a, 0x15, 0xe2, 0xe3, 0x5, 0x74, 0xa5, 0xb6, 0x7e, 0xb6, 0x1b, 0xb7, + 0xb7, 0x97, 0xa3, 0xa5, 0x1f, 0xe4, 0x33, 0xb6, 0xb8, 0x34, 0xe2, 0x5, + 0x13, 0xe8, 0xa4, 0xa7, 0x95, 0xbb, 0xb9, 0x1a, 0xb3, 0x7e, 0xb2, 0x75, + 0xa4, 0x1e, 0xe2, 0xe4, 0x60, 0xb6, 0x32, 0x34, 0x5, 0xa3, 0x71, 0x5f, + 0x96, 0x60, 0x1b, 0x60, 0x5f, 0x7f, 0x74, 0x71, 0x1f, 0x34, 0xe2, 0x5e, + 0x60, 0xe3, 0x32, 0x5, 0x13, 0xd4, 0x74, 0x72, 0x7e, 0x62, 0x60, 0x1a, + 0x5e, 0x96, 0x5e, 0xa4, 0x70, 0x1e, 0x33, 0x34, 0x5, 0xe, 0xa0, 0x76, + 0xf7, 0x4a, 0xb3, 0xe5, 0xb3, 0xf7, 0xca, 0x77, 0x1, 0xf7, 0x52, 0xe0, + 0x3, 0xf7, 0x3, 0x16, 0xf7, 0x88, 0x9e, 0x6, 0x52, 0x8c, 0x74, 0xa3, + 0xd6, 0x1a, 0xca, 0xf7, 0x41, 0xb3, 0xfb, 0x41, 0xd7, 0x7, 0x92, 0x99, + 0x5, 0xf7, 0x3a, 0xb3, 0xfb, 0x26, 0x6, 0xe7, 0xf7, 0x42, 0xad, 0xce, + 0xaf, 0xb4, 0xbb, 0x94, 0x19, 0x9e, 0xfb, 0x57, 0x78, 0x7, 0xae, 0x8e, + 0xa9, 0x77, 0x73, 0x1a, 0x7b, 0x85, 0x7e, 0x83, 0x7c, 0x1e, 0xfb, 0x4, + 0xfb, 0x66, 0xfb, 0xa, 0xf7, 0x67, 0x5, 0x83, 0x9a, 0x86, 0x9c, 0x97, + 0x1a, 0xa0, 0x9d, 0x9f, 0xba, 0x8a, 0x1e, 0x9e, 0xfb, 0x87, 0x78, 0x7, + 0xbe, 0x8a, 0xa0, 0x5f, 0xb9, 0x38, 0xea, 0xfb, 0x37, 0x18, 0xfb, 0x24, + 0x63, 0xf7, 0x3b, 0x6, 0x92, 0x7d, 0x5, 0x3f, 0xfb, 0x42, 0x63, 0xf7, + 0x42, 0x4e, 0x7, 0x53, 0x83, 0x5f, 0x44, 0x89, 0x1e, 0xe, 0xfb, 0x31, + 0x92, 0x7a, 0x1d, 0xd9, 0xb7, 0x3, 0xd9, 0xf8, 0x1d, 0x15, 0xb7, 0xf7, + 0xaf, 0x5f, 0x6, 0xfd, 0x46, 0x4, 0xb7, 0xf7, 0xa9, 0x5f, 0x6, 0xe, + 0xfb, 0x29, 0xa0, 0xf7, 0x74, 0xa0, 0xf8, 0xd0, 0x77, 0x12, 0xcb, 0xc0, + 0xf7, 0x67, 0xed, 0x2b, 0xc3, 0x13, 0xf8, 0xf7, 0xbc, 0xf7, 0x11, 0x15, + 0xe1, 0x83, 0xb7, 0xca, 0xce, 0x1a, 0xc6, 0x62, 0xc1, 0x5b, 0xb3, 0x1e, + 0xfb, 0x1d, 0xf7, 0x5, 0x5, 0x72, 0xa0, 0x82, 0xaa, 0x9f, 0x1a, 0xa2, + 0x9e, 0xba, 0xc7, 0xb9, 0xa1, 0x72, 0x79, 0x87, 0x7f, 0x84, 0x81, 0x7f, + 0x1e, 0x85, 0x83, 0x85, 0x81, 0x7e, 0x1a, 0x7d, 0x94, 0x6e, 0xb1, 0xae, + 0x9b, 0xa3, 0xa9, 0x1e, 0x13, 0xf4, 0xc5, 0x4e, 0xbc, 0x4b, 0x42, 0x46, + 0x65, 0x37, 0x48, 0xb5, 0x68, 0xc2, 0x5d, 0x1e, 0x89, 0x89, 0x5, 0x38, + 0x95, 0x57, 0x51, 0x41, 0x1a, 0x5a, 0xa8, 0x51, 0xd0, 0x56, 0x1e, 0xf7, + 0x26, 0xfb, 0x4, 0x9b, 0x7b, 0x61, 0x1a, 0x59, 0x68, 0x6e, 0x5a, 0x54, + 0x78, 0xad, 0x96, 0x1e, 0x98, 0xad, 0x95, 0xad, 0x1a, 0x9c, 0x7c, 0xa3, + 0x6a, 0x71, 0x6f, 0x79, 0x67, 0x52, 0xc8, 0x56, 0xda, 0xec, 0xb8, 0xca, + 0xca, 0xc3, 0x71, 0xac, 0x49, 0xc3, 0x1e, 0xfb, 0x3f, 0xf7, 0x56, 0x15, + 0xbb, 0xb2, 0x9d, 0xa9, 0xc2, 0xf7, 0x13, 0xfb, 0x0, 0x50, 0x5f, 0x69, + 0x71, 0x66, 0x4c, 0xfb, 0x9, 0xed, 0xd4, 0x1e, 0xe, 0x73, 0xf8, 0x9f, + 0xef, 0x1, 0x9d, 0xed, 0xf0, 0xed, 0x3, 0x9d, 0xf8, 0xd1, 0x15, 0x6e, + 0x1d, 0xf7, 0x5b, 0x16, 0x6e, 0x1d, 0xe, 0xf8, 0x27, 0x7d, 0xb5, 0xf7, + 0x2e, 0x9f, 0xf7, 0x9f, 0x9f, 0xf7, 0x25, 0xb5, 0x1, 0xb1, 0xc2, 0xf1, + 0xd8, 0xf7, 0x97, 0x9b, 0xf7, 0xc, 0xc2, 0x3, 0xb1, 0xf7, 0xde, 0x3e, + 0xa, 0x69, 0xa, 0xf8, 0x4a, 0x38, 0x15, 0x5d, 0x77, 0x68, 0x63, 0x49, + 0x1b, 0x25, 0x61, 0xd8, 0xf4, 0x8c, 0x1f, 0xec, 0x8c, 0xb6, 0xd3, 0xe8, + 0x1b, 0xd9, 0xa7, 0x52, 0x61, 0x8f, 0x1f, 0x9c, 0xdb, 0x6, 0xa9, 0x36, + 0x94, 0x64, 0xfb, 0x2c, 0x4a, 0xfb, 0x2, 0x38, 0xfb, 0x21, 0xea, 0x52, + 0xf7, 0x7, 0xcc, 0xb0, 0x95, 0xa5, 0xa8, 0x1e, 0x9b, 0xd1, 0x5, 0xe, + 0x3a, 0xf8, 0x33, 0x76, 0xf7, 0x92, 0xa7, 0x12, 0x9b, 0xca, 0xd9, 0xd3, + 0x17, 0xf7, 0x32, 0xf8, 0xbb, 0x15, 0x48, 0x7, 0x8a, 0x85, 0x8b, 0x84, + 0x81, 0x82, 0x8, 0x88, 0x85, 0x77, 0x79, 0x7d, 0x1b, 0x73, 0x7b, 0x9d, + 0xa8, 0x9e, 0xa2, 0xa1, 0xcf, 0xa1, 0x1f, 0x93, 0x24, 0x15, 0x5f, 0x92, + 0xa6, 0x81, 0x97, 0x1b, 0x96, 0x9f, 0x8c, 0xa8, 0xa6, 0x1f, 0x9d, 0x7, + 0x85, 0x84, 0x82, 0x85, 0x7f, 0x1b, 0x7e, 0x8b, 0x97, 0xa2, 0x1f, 0xf7, + 0x7, 0x7, 0xac, 0x84, 0xca, 0x2a, 0x40, 0x69, 0x68, 0x6b, 0x7d, 0x96, + 0x7a, 0x9f, 0x9f, 0x97, 0x98, 0x98, 0xa5, 0x89, 0x9d, 0xb8, 0xa2, 0x97, + 0x7a, 0x54, 0x1e, 0x2d, 0x69, 0x50, 0x76, 0x4f, 0x1a, 0x13, 0x80, 0x5e, + 0xb0, 0x75, 0xae, 0xae, 0xae, 0x9f, 0xad, 0x9f, 0x1e, 0xe, 0x79, 0xa, + 0xb5, 0xf7, 0x77, 0x50, 0xa, 0xa4, 0xaf, 0x92, 0x1a, 0x92, 0x89, 0x8f, + 0x83, 0x1e, 0x78, 0xfb, 0x51, 0x50, 0xa, 0xa5, 0xaf, 0x92, 0x96, 0x1d, + 0xf7, 0x63, 0xf7, 0x15, 0x76, 0xf7, 0x68, 0xcd, 0x63, 0xb3, 0x12, 0xf8, + 0x68, 0xcd, 0x5e, 0xb8, 0x13, 0xd0, 0x13, 0xa8, 0xa9, 0xf7, 0xee, 0x15, + 0xf8, 0x5f, 0xfb, 0x82, 0xb8, 0xf7, 0xaa, 0xfc, 0x8c, 0x6, 0xe, 0xf8, + 0x27, 0x7d, 0xb5, 0x7d, 0xf7, 0x49, 0xf7, 0xcd, 0xf7, 0x43, 0x12, 0xb1, + 0xc2, 0xf7, 0x43, 0xcb, 0xf7, 0x4, 0xce, 0xf7, 0x30, 0xc2, 0x13, 0x7e, + 0xf7, 0x6f, 0xf7, 0x2c, 0x15, 0xf7, 0x36, 0x9a, 0x6, 0x59, 0x90, 0x8c, + 0x95, 0xb6, 0x1a, 0xda, 0xbb, 0x7, 0x2d, 0xcb, 0xa4, 0x51, 0xab, 0x1b, + 0xcb, 0x93, 0x6, 0x78, 0x9a, 0x6c, 0xad, 0x71, 0xaf, 0x52, 0xd0, 0x18, + 0xb8, 0x9a, 0xad, 0xb1, 0xbf, 0x1a, 0xca, 0x53, 0xb1, 0x50, 0x1e, 0xfb, + 0x45, 0x7c, 0x6, 0xa1, 0x87, 0xa6, 0x8b, 0x70, 0x1a, 0xfb, 0x8d, 0x7, + 0x60, 0x8c, 0x81, 0x59, 0x86, 0x1e, 0xf7, 0x5, 0xf7, 0x30, 0x15, 0xf7, + 0x46, 0xb4, 0x7, 0xb2, 0xab, 0x6d, 0x52, 0x56, 0x77, 0x65, 0x5a, 0x1f, + 0xfb, 0xe5, 0x92, 0x3e, 0xa, 0x1e, 0x13, 0xbe, 0x69, 0xa, 0xe, 0x73, + 0xf8, 0xb7, 0xc1, 0x1, 0x96, 0xf8, 0xb7, 0x15, 0xf7, 0xcb, 0xc1, 0xfb, + 0xcb, 0x6, 0xe, 0xb6, 0xf8, 0x1a, 0xad, 0xf7, 0x6e, 0xad, 0x1, 0xc4, + 0xb2, 0xf7, 0x64, 0xb2, 0x3, 0xeb, 0xf8, 0xa9, 0x15, 0xc5, 0xb9, 0xbe, + 0xc5, 0xc5, 0xb9, 0x58, 0x51, 0x51, 0x5d, 0x58, 0x51, 0x51, 0x5d, 0xbe, + 0xc5, 0x1e, 0x64, 0x16, 0x3b, 0xca, 0x4c, 0xdb, 0xdb, 0xca, 0xca, 0xdb, + 0xdb, 0x4c, 0xca, 0x3b, 0x3b, 0x4c, 0x4c, 0x3b, 0x1e, 0xe, 0xf7, 0x63, + 0x8b, 0xcd, 0xc3, 0x77, 0xf7, 0x48, 0xcd, 0x54, 0xb6, 0xf7, 0x3e, 0x77, + 0x12, 0xf7, 0x8d, 0xcd, 0x55, 0xb3, 0x13, 0xec, 0xa9, 0x16, 0xf8, 0x8c, + 0xb5, 0xfc, 0x8c, 0x6, 0x13, 0xea, 0xf7, 0x7b, 0xdb, 0x15, 0xb3, 0x6, + 0x13, 0xda, 0xf7, 0x3f, 0xf7, 0x7d, 0xb6, 0xfb, 0x7d, 0xf7, 0x3e, 0x63, + 0xfb, 0x3e, 0xfb, 0x7b, 0x60, 0xf7, 0x7b, 0x7, 0xe, 0x52, 0xf7, 0xa2, + 0xcc, 0xf7, 0xaa, 0xca, 0x1, 0xf7, 0x4d, 0xe7, 0x3, 0x90, 0xf7, 0xa2, + 0x15, 0xf7, 0x92, 0x56, 0xa, 0x67, 0x8b, 0x1d, 0xb4, 0x7f, 0x1d, 0x28, + 0x20, 0x5, 0xe, 0x52, 0xf7, 0x9a, 0x85, 0x1d, 0x13, 0xd0, 0xdf, 0xf8, + 0x60, 0x77, 0xa, 0x79, 0x7c, 0x96, 0x95, 0x7d, 0x1e, 0x94, 0x7e, 0x7e, + 0x94, 0x7d, 0x63, 0xa, 0x13, 0xe0, 0x4e, 0x1d, 0x92, 0x1d, 0xe8, 0xf8, + 0x8f, 0x24, 0xa, 0xfb, 0x59, 0x76, 0xf7, 0x64, 0xc9, 0xf8, 0x22, 0x77, + 0x12, 0xaf, 0xe7, 0x47, 0xab, 0x6b, 0xe3, 0xf7, 0x56, 0xe3, 0x13, 0xea, + 0xe7, 0xc5, 0x15, 0x8d, 0x8d, 0x5, 0x4f, 0xab, 0xc1, 0x81, 0xaa, 0x1b, + 0xbe, 0xbf, 0xb9, 0xbe, 0xa8, 0x1f, 0x8d, 0x6, 0x62, 0x9c, 0x53, 0xbf, + 0xaf, 0xa7, 0x95, 0xba, 0xad, 0x1e, 0x93, 0x7, 0x77, 0x76, 0x7d, 0x83, + 0x7c, 0x1b, 0x6b, 0x8b, 0xb5, 0xa2, 0x1f, 0xf7, 0xfa, 0x33, 0xfb, 0xd9, + 0x7, 0x72, 0x7f, 0x60, 0x5b, 0x58, 0x1b, 0x13, 0xe6, 0x4f, 0x6f, 0xb1, + 0xc1, 0x1f, 0xf7, 0xc6, 0x33, 0xfc, 0x20, 0x7, 0x13, 0xf2, 0x4d, 0x73, + 0x3c, 0x4f, 0x1a, 0x5c, 0x95, 0x73, 0xaf, 0xaf, 0x95, 0xa3, 0xba, 0x1e, + 0x13, 0xea, 0xc7, 0x6d, 0xda, 0x85, 0xcd, 0x1e, 0xe, 0xeb, 0xfb, 0x57, + 0x76, 0xf9, 0xe7, 0xa6, 0x1, 0xf7, 0x7a, 0xaf, 0xe6, 0xaf, 0x3, 0xf7, + 0x7a, 0xfb, 0x6c, 0x15, 0xaf, 0xf9, 0xe7, 0xe6, 0xfd, 0xe7, 0xaf, 0xf9, + 0xe7, 0xcb, 0xa6, 0xfb, 0x87, 0x6, 0xfb, 0x20, 0x3d, 0x4f, 0xfb, 0x11, + 0xfb, 0x11, 0xd9, 0x50, 0xf7, 0x30, 0x1f, 0xe, 0x20, 0xf7, 0x70, 0x76, + 0xf7, 0x3, 0x77, 0x1, 0xd1, 0xf7, 0x3, 0x3, 0xd1, 0xf7, 0x91, 0x15, + 0x43, 0x1d, 0xe, 0x73, 0xfb, 0x6b, 0xf7, 0x2d, 0xc9, 0x77, 0x1, 0xf7, + 0x4e, 0xd6, 0x3, 0xeb, 0x23, 0x15, 0x92, 0x86, 0x5, 0x8f, 0x98, 0x9c, + 0x8d, 0x9a, 0x1b, 0xa0, 0x9c, 0x81, 0x75, 0x68, 0x70, 0x81, 0x6c, 0x76, + 0x74, 0x91, 0x91, 0x79, 0x1f, 0x7d, 0x6c, 0x5, 0x83, 0xac, 0x9e, 0x83, + 0xb5, 0x1b, 0xba, 0xcf, 0xb7, 0xb2, 0xb8, 0x68, 0xa4, 0x60, 0x80, 0x7f, + 0x8a, 0x89, 0x80, 0x1f, 0xa4, 0xcc, 0x5, 0x68, 0x6, 0xe, 0x52, 0xf7, + 0xa2, 0xa3, 0xf8, 0x12, 0x77, 0x1, 0xf7, 0x2, 0xdc, 0x3, 0xc4, 0xf7, + 0xa2, 0x35, 0xa, 0xfb, 0x86, 0x7, 0x69, 0x73, 0x80, 0x6e, 0x89, 0x1e, + 0xe, 0x5c, 0xf8, 0x1e, 0xac, 0xf7, 0x6c, 0xac, 0x1, 0x91, 0xd4, 0xf7, + 0x2c, 0xd4, 0x3, 0x91, 0xf8, 0xa8, 0x15, 0x3f, 0xc6, 0x4d, 0xdf, 0xf7, + 0x1, 0xb9, 0xde, 0xcc, 0xdd, 0x4d, 0xbf, 0x36, 0x2a, 0x55, 0x4a, 0x3c, + 0x1e, 0xd4, 0xa4, 0x15, 0xb7, 0xab, 0xb5, 0xb4, 0xbd, 0xa8, 0x67, 0x3f, + 0x4c, 0x62, 0x62, 0x6a, 0x47, 0x81, 0xe3, 0xb5, 0x1e, 0xe, 0x79, 0xa, + 0xf7, 0x8b, 0xac, 0x15, 0x58, 0xa, 0x7d, 0x79, 0x5c, 0x4d, 0x6a, 0x5d, + 0x8, 0x78, 0x70, 0x7c, 0x75, 0x86, 0x1a, 0x84, 0x8d, 0x87, 0x93, 0x1e, + 0xfb, 0x54, 0x16, 0x58, 0xa, 0x7e, 0x79, 0x5e, 0x52, 0x6a, 0x5e, 0x8, + 0x75, 0x6d, 0x7b, 0x73, 0x8f, 0x1d, 0xf8, 0x1d, 0x92, 0x76, 0xae, 0x76, + 0xe5, 0xc4, 0xf7, 0xf, 0xa3, 0xf8, 0x12, 0x77, 0x12, 0xe5, 0xdc, 0xf8, + 0x3a, 0xd1, 0x13, 0x7e, 0x53, 0xa, 0x13, 0xbe, 0xfc, 0x5b, 0xfb, 0x35, + 0x68, 0x1d, 0xfc, 0xbe, 0x47, 0x1d, 0xe, 0xf8, 0x1d, 0x8b, 0xcc, 0x51, + 0x76, 0xf7, 0xb0, 0xa3, 0xbc, 0xca, 0xf7, 0xa2, 0x77, 0x12, 0xdf, 0xdc, + 0xf8, 0x6a, 0xe7, 0x13, 0x7e, 0xf0, 0x7d, 0x68, 0x1d, 0xfc, 0x9f, 0x47, + 0x1d, 0x13, 0xbe, 0xf8, 0x3d, 0xfb, 0xba, 0x15, 0xf7, 0x91, 0x56, 0xa, + 0x71, 0x8b, 0x1d, 0xaa, 0x7f, 0x1d, 0x29, 0x20, 0x5, 0xe, 0xf8, 0x1d, + 0x92, 0x76, 0xf3, 0xc4, 0xf7, 0x7, 0x85, 0x1d, 0xf7, 0xc2, 0xd1, 0x13, + 0xf6, 0x53, 0xa, 0xfc, 0x5b, 0xfb, 0x35, 0x68, 0x1d, 0xfc, 0x8f, 0xfb, + 0x6c, 0x77, 0xa, 0x7a, 0x7c, 0x95, 0x95, 0x7d, 0x1e, 0x94, 0x7e, 0x7e, + 0x95, 0x7c, 0x63, 0xa, 0x13, 0xfa, 0x4e, 0x1d, 0xe2, 0xfb, 0x6e, 0xa9, + 0xf8, 0xb9, 0xf4, 0x12, 0xa9, 0xe7, 0xac, 0xf4, 0x17, 0xf7, 0x5c, 0xf7, + 0xba, 0x15, 0x4e, 0x64, 0x5a, 0x63, 0x59, 0x1e, 0x5f, 0x54, 0x5c, 0x53, + 0x40, 0x1a, 0x25, 0xd2, 0x4b, 0xf7, 0x4, 0xd0, 0xe9, 0xb6, 0xf0, 0xad, + 0x81, 0xa8, 0x63, 0x6f, 0x76, 0x73, 0x7a, 0x79, 0x94, 0x7f, 0x95, 0x80, + 0x1e, 0x94, 0x80, 0x95, 0x81, 0x7e, 0x1a, 0x6a, 0x62, 0x6f, 0x61, 0x3e, + 0x6a, 0xce, 0xc7, 0x1e, 0x13, 0x50, 0xb3, 0x9e, 0xd0, 0x9d, 0xb3, 0x1e, + 0xa7, 0xcb, 0x5, 0x91, 0x99, 0xa3, 0xd0, 0xc6, 0x1a, 0x4d, 0xf7, 0xb, + 0x15, 0x6e, 0xa2, 0x74, 0xa8, 0x1e, 0xa8, 0xa3, 0xa2, 0xa8, 0x94, 0x1d, + 0x1f, 0xe, 0xf8, 0x1, 0x99, 0x76, 0xf7, 0x73, 0xb4, 0xf8, 0x35, 0x77, + 0xf7, 0x80, 0x77, 0x1, 0x54, 0xf9, 0x47, 0xfd, 0x2, 0xf7, 0x5a, 0x3, + 0x20, 0x1d, 0x59, 0xf8, 0x62, 0x27, 0x1d, 0x5c, 0x1d, 0xf7, 0x80, 0x77, + 0x1, 0x4c, 0xf9, 0x47, 0xfb, 0x93, 0xf7, 0x93, 0x3, 0x21, 0xa, 0x79, + 0x5f, 0x6b, 0x2a, 0x1d, 0xfb, 0x33, 0xf8, 0x62, 0x24, 0xa, 0x5c, 0x1d, + 0xf7, 0x7c, 0x77, 0x1, 0x54, 0xf9, 0x47, 0x3, 0x20, 0x1d, 0xfb, 0x85, + 0xf8, 0x62, 0x25, 0x1d, 0xe, 0x5b, 0x1d, 0xf8, 0x7f, 0xf1, 0x5a, 0xbc, + 0x12, 0x90, 0xf9, 0x47, 0x13, 0xd0, 0x20, 0xa, 0x13, 0x58, 0x77, 0x6, + 0xfb, 0x64, 0xfc, 0x7f, 0x78, 0x5f, 0x6c, 0x2a, 0x1d, 0xfb, 0x8f, 0xf8, + 0x7b, 0x83, 0x1d, 0x9b, 0xb3, 0xb0, 0x1b, 0xa4, 0xa1, 0x80, 0x80, 0x9f, + 0x1f, 0x13, 0xe0, 0x7c, 0xa5, 0xa1, 0x7b, 0xa1, 0x1b, 0xd9, 0x9d, 0xcf, + 0x65, 0xa, 0x63, 0x7a, 0x6f, 0x81, 0x72, 0x1b, 0x7c, 0x75, 0x98, 0x98, + 0x73, 0x1f, 0x97, 0x75, 0x74, 0x97, 0x77, 0x54, 0xa, 0x5c, 0x1d, 0xdd, + 0xee, 0x12, 0x8b, 0xf7, 0x5a, 0x99, 0xee, 0xef, 0xee, 0x13, 0xfa, 0x20, + 0x1d, 0x67, 0xf8, 0xa4, 0x15, 0x6a, 0x1d, 0x13, 0xf6, 0xfb, 0x5b, 0x16, + 0x6a, 0x1d, 0xe, 0x5b, 0x1d, 0xf8, 0x6f, 0xf7, 0x3a, 0x12, 0xf7, 0xb1, + 0xf7, 0x18, 0xfb, 0x15, 0xf7, 0x3a, 0x13, 0xe8, 0x20, 0x1d, 0xfb, 0x57, + 0xf8, 0xb1, 0x67, 0xa, 0xac, 0x16, 0xaf, 0xa9, 0x93, 0xa, 0x6d, 0x67, + 0x1e, 0x13, 0xf0, 0x67, 0x6d, 0xa9, 0xaf, 0x1f, 0xe, 0xf8, 0xa8, 0x8b, + 0xb1, 0xf7, 0x72, 0xb2, 0xa9, 0xb0, 0xf7, 0x98, 0xaf, 0x77, 0x9f, 0x12, + 0x8b, 0xf7, 0x5b, 0xf7, 0x5b, 0xee, 0xf7, 0x87, 0xa0, 0xab, 0xa2, 0x13, + 0xf3, 0x0, 0x13, 0xeb, 0x0, 0x8b, 0x4, 0xf7, 0x5b, 0x9e, 0x6, 0x7e, + 0x8d, 0x49, 0x89, 0xa0, 0xd8, 0x93, 0xaa, 0xa5, 0xb7, 0xba, 0xe4, 0x8, + 0xf7, 0x44, 0xfb, 0x22, 0x6, 0x44, 0x7b, 0x78, 0x53, 0x84, 0x1e, 0x7a, + 0x89, 0x5, 0x78, 0xf8, 0x92, 0x7, 0xb7, 0xf7, 0x3c, 0x5, 0x73, 0x6, + 0xfb, 0x2, 0x52, 0x68, 0x77, 0x22, 0x1b, 0x3f, 0x6, 0x49, 0x88, 0x96, + 0xcc, 0x1f, 0xf7, 0x6b, 0xf7, 0x25, 0x7, 0xe2, 0x90, 0x5c, 0x56, 0x91, + 0x1f, 0xa0, 0xf7, 0x7e, 0x76, 0x6, 0x44, 0x85, 0x7c, 0x71, 0xfb, 0x3, + 0x1b, 0xfb, 0x3, 0xf7, 0x7a, 0x6, 0xa8, 0x9b, 0x8c, 0x96, 0x1e, 0xe2, + 0x6, 0xf7, 0x16, 0xb4, 0x84, 0x29, 0x96, 0x1f, 0xa2, 0xf7, 0x21, 0xfc, + 0xc8, 0x6, 0x13, 0xf7, 0x80, 0x77, 0x7, 0xc8, 0xa8, 0x80, 0x73, 0x83, + 0x86, 0x81, 0x87, 0x83, 0x1f, 0xfb, 0x89, 0xfc, 0x6e, 0x68, 0x46, 0x79, + 0x7e, 0x68, 0x85, 0x19, 0xf7, 0x83, 0xf7, 0xac, 0x15, 0xf7, 0x30, 0xf7, + 0xcd, 0x5, 0x8e, 0xfb, 0xcd, 0x6, 0xe, 0xf7, 0xca, 0xfb, 0x56, 0x76, + 0xf7, 0x5d, 0xb7, 0xf8, 0xf2, 0xb3, 0x1, 0xa7, 0xf7, 0x8, 0xf7, 0xa4, + 0xd6, 0xf5, 0xa2, 0x3, 0xf7, 0xae, 0x8e, 0xa, 0xcc, 0x8c, 0xce, 0xa9, + 0xbf, 0x1a, 0xc3, 0x54, 0xa2, 0x52, 0x7f, 0x1e, 0xa0, 0xc1, 0xf7, 0x32, + 0x9a, 0xd5, 0xf6, 0x8c, 0x8d, 0x19, 0x79, 0x9d, 0x5, 0x77, 0x1d, 0xf7, + 0x24, 0xb7, 0xcb, 0xb2, 0xb1, 0x1f, 0xb4, 0xb5, 0xc5, 0x9f, 0xbd, 0x1b, + 0xf7, 0xf, 0xd3, 0x31, 0x22, 0xa4, 0x1f, 0xa2, 0x6, 0x82, 0xf7, 0x7f, + 0x59, 0x1d, 0x1f, 0x8c, 0x6, 0x66, 0x33, 0x92, 0x86, 0x5, 0xab, 0x94, + 0xbe, 0x8c, 0x86, 0xa, 0x5a, 0x1d, 0xf7, 0x78, 0x77, 0x12, 0x7f, 0xa, + 0x17, 0x97, 0x16, 0xf8, 0xb0, 0x6, 0x13, 0xff, 0x80, 0x23, 0x1d, 0xf7, + 0xdd, 0xf9, 0x50, 0x27, 0x1d, 0x5a, 0x1d, 0xf7, 0x78, 0x77, 0x1, 0x7f, + 0xa, 0x3, 0xf7, 0x7c, 0xf9, 0x63, 0x21, 0x1d, 0xfc, 0x3, 0xfd, 0xf7, + 0x2c, 0xa, 0x5a, 0x1d, 0xf7, 0x74, 0x77, 0x1, 0x7f, 0xa, 0x3, 0xf7, + 0x2a, 0x38, 0xa, 0xfb, 0x9a, 0xfe, 0xa, 0x2c, 0xa, 0x7b, 0xa, 0xf7, + 0xb5, 0xb4, 0xf7, 0x94, 0xb1, 0xd3, 0xf0, 0x12, 0xee, 0xf1, 0x5d, 0xf0, + 0xee, 0xf0, 0x94, 0xa2, 0x13, 0xfa, 0x97, 0x16, 0xf8, 0xb0, 0x6, 0x36, + 0x1d, 0x13, 0x7b, 0x26, 0xa, 0x13, 0x16, 0x3e, 0x7a, 0xa, 0x13, 0xf6, + 0xf7, 0x23, 0xf9, 0x91, 0x15, 0x6c, 0x1d, 0xf7, 0x5c, 0x16, 0x6c, 0x1d, + 0xe, 0x73, 0x83, 0xa, 0xf7, 0x8c, 0x42, 0xa, 0xf7, 0x4c, 0xf9, 0x50, + 0x2d, 0xa, 0x89, 0x81, 0x1d, 0x9d, 0x57, 0xa, 0x73, 0x83, 0xa, 0xf7, + 0x8c, 0x77, 0x1, 0xf7, 0x7, 0xf1, 0x3, 0xe8, 0xf9, 0x63, 0x21, 0x1d, + 0xfb, 0x72, 0xfd, 0xf7, 0x15, 0xf7, 0xbf, 0x9e, 0x6, 0x41, 0x8d, 0x71, + 0x60, 0x1d, 0xa6, 0x9c, 0xd4, 0x8e, 0x1e, 0x9e, 0xfb, 0xbf, 0x78, 0x7, + 0x49, 0xa, 0xe, 0x73, 0x83, 0xa, 0xf7, 0x88, 0x77, 0x1, 0xf7, 0x7, + 0xf1, 0x3, 0x96, 0x38, 0xa, 0xfb, 0x10, 0xfe, 0xa, 0x15, 0xf7, 0xcb, + 0x9e, 0x6, 0x41, 0x8d, 0x6c, 0x60, 0x1d, 0xab, 0x9c, 0xd4, 0x8e, 0x1e, + 0x9e, 0xfb, 0xcb, 0x78, 0x7, 0xde, 0x87, 0xa0, 0x75, 0x41, 0x89, 0x1d, + 0x44, 0x78, 0x70, 0x36, 0x89, 0x1e, 0xe, 0x73, 0xa0, 0x76, 0xf9, 0x17, + 0x97, 0xa, 0x12, 0xad, 0xed, 0x7a, 0xf1, 0x13, 0xd0, 0x9d, 0x16, 0xf7, + 0xbd, 0x9e, 0x6, 0x13, 0xc8, 0x59, 0xa, 0x13, 0xb0, 0x9e, 0xfb, 0xbd, + 0x7, 0x13, 0xd0, 0x78, 0x7, 0x13, 0xc8, 0x49, 0xa, 0xf9, 0x91, 0x4, + 0x6d, 0x1d, 0xf7, 0x5b, 0x16, 0x6d, 0x1d, 0xe, 0xf8, 0x1, 0x8b, 0xb0, + 0xf7, 0xaa, 0xb7, 0xf7, 0x9e, 0xb0, 0x1, 0xf3, 0xf1, 0xf8, 0x6, 0x58, + 0x1d, 0x96, 0x71, 0x41, 0x1f, 0xfb, 0x4c, 0x34, 0x5f, 0xe2, 0xfb, 0x58, + 0x7, 0x45, 0x7f, 0x6d, 0x3f, 0x1e, 0xf7, 0x52, 0xf7, 0xbc, 0x15, 0xf7, + 0x26, 0xb7, 0xfb, 0x26, 0xf7, 0x4b, 0x6, 0xbe, 0x8b, 0xab, 0x8b, 0xa, + 0xfb, 0xb7, 0xfb, 0x8a, 0x8b, 0x4b, 0x5b, 0x7f, 0x9f, 0xc5, 0x1e, 0xe, + 0xf8, 0x1, 0x95, 0x76, 0xab, 0x76, 0xf7, 0x49, 0x77, 0xf8, 0x89, 0x77, + 0xf1, 0xf5, 0x12, 0xf7, 0x1, 0xb7, 0xf8, 0x33, 0xb7, 0x13, 0x7e, 0x5f, + 0xa, 0xf8, 0x10, 0x8d, 0x7, 0x13, 0xbe, 0x3a, 0xa, 0x13, 0x7e, 0xf7, + 0x4c, 0xf9, 0x69, 0x4c, 0xa, 0x9d, 0x67, 0x1f, 0x97, 0x74, 0x75, 0x91, + 0x76, 0x54, 0xa, 0x30, 0x1d, 0xf7, 0x8d, 0xf8, 0x10, 0x27, 0x1d, 0x30, + 0x1d, 0xf7, 0x20, 0xf8, 0x10, 0x24, 0xa, 0x5b, 0xa, 0xf7, 0x66, 0x77, + 0x74, 0xa, 0xf7, 0x62, 0x38, 0xa, 0xfb, 0xbc, 0xfc, 0xb8, 0x29, 0x1d, + 0xe, 0x5b, 0xa, 0xcf, 0xf5, 0x85, 0xa, 0xf7, 0xde, 0x70, 0xa, 0xfb, + 0x17, 0x69, 0x1d, 0xf7, 0x17, 0x61, 0x1d, 0xf7, 0x8, 0x61, 0xa, 0xfb, + 0x8, 0x44, 0x1d, 0xdc, 0xf1, 0xf1, 0xf7, 0x3, 0x3a, 0x71, 0x1d, 0x32, + 0x72, 0x1d, 0xe4, 0xf7, 0x70, 0x1e, 0xbb, 0xf8, 0x31, 0x4c, 0xa, 0x91, + 0x7f, 0x1f, 0xa3, 0x5c, 0x75, 0x91, 0x76, 0x54, 0xa, 0x5b, 0xa, 0xc6, + 0xef, 0x7b, 0x1d, 0xca, 0xef, 0xef, 0xef, 0xca, 0x9a, 0xa, 0xad, 0xf7, + 0xe6, 0x70, 0xa, 0xfb, 0x1f, 0x69, 0x1d, 0xf7, 0x10, 0x61, 0x1d, 0xf7, + 0xf, 0x34, 0xa, 0x33, 0x71, 0x1d, 0x39, 0x5e, 0xa, 0xca, 0xf8, 0x52, + 0x15, 0x30, 0xa, 0xf7, 0x5c, 0x16, 0x30, 0xa, 0xe, 0xf7, 0x63, 0xa8, + 0x76, 0xac, 0x76, 0xf8, 0x71, 0x77, 0x12, 0x13, 0xa0, 0xc5, 0xc3, 0x15, + 0xa6, 0x6f, 0xf7, 0x59, 0xf7, 0x59, 0x5, 0x13, 0x60, 0xf7, 0x61, 0xfb, + 0x61, 0xa7, 0xa6, 0xfb, 0x61, 0xf7, 0x62, 0xf7, 0x59, 0xf7, 0x58, 0x6f, + 0xa7, 0xfb, 0x59, 0xfb, 0x59, 0xfb, 0x58, 0xf7, 0x59, 0x70, 0x6e, 0xf7, + 0x57, 0xfb, 0x57, 0x5, 0xe, 0xf8, 0x1, 0x50, 0x76, 0xcd, 0xaf, 0xf8, + 0xfe, 0xaf, 0xc5, 0x77, 0x74, 0xa, 0xf7, 0x6f, 0xe3, 0x15, 0xf7, 0xc8, + 0xf8, 0x58, 0x5, 0xa8, 0x5a, 0x9d, 0x41, 0x2e, 0x1a, 0xfb, 0x70, 0x25, + 0x39, 0xfb, 0x3, 0x57, 0x57, 0x9f, 0xb9, 0x65, 0x1e, 0x72, 0xae, 0x15, + 0x6e, 0xbc, 0x7a, 0xd9, 0xe6, 0x1a, 0xf7, 0x78, 0xf7, 0x3, 0xd2, 0xf1, + 0xbc, 0xbf, 0x78, 0x5d, 0xb3, 0x1e, 0xfc, 0x52, 0xfd, 0x23, 0x15, 0xbc, + 0x6, 0xda, 0xf7, 0x8, 0x5, 0x6a, 0xbe, 0xc8, 0x7a, 0xcc, 0x1b, 0xf7, + 0x49, 0xf7, 0x26, 0xf7, 0x10, 0xf7, 0x69, 0xf7, 0x11, 0x5b, 0xed, 0x45, + 0xc5, 0x1f, 0xe3, 0xf7, 0x16, 0x5, 0x5a, 0x6, 0x43, 0x20, 0x5, 0xac, + 0x56, 0x4e, 0x9b, 0x4d, 0x1b, 0xfb, 0x38, 0xfb, 0x37, 0x21, 0xfb, 0x7a, + 0xfb, 0xb, 0xb8, 0x24, 0xd3, 0x50, 0x1f, 0xe, 0x7c, 0xa, 0xf7, 0xfd, + 0xb7, 0x3, 0x99, 0xf9, 0x17, 0x15, 0xd7, 0x99, 0x71, 0x41, 0x1f, 0xfb, + 0xc6, 0x7, 0x4a, 0x8b, 0xfb, 0x4e, 0xf7, 0x8c, 0xf7, 0x97, 0x8b, 0xf7, + 0x47, 0xe4, 0x1e, 0xf7, 0x8f, 0x7, 0xf4, 0x9c, 0xab, 0xd8, 0x8c, 0x1e, + 0x9e, 0xfb, 0x7c, 0x78, 0x7, 0xd1, 0x8a, 0xa3, 0x6d, 0x20, 0x1a, 0xfb, + 0x98, 0x7, 0xfb, 0x11, 0x4f, 0x31, 0x98, 0x1d, 0xf7, 0x22, 0xc8, 0x1e, + 0xf7, 0xca, 0x7, 0xd2, 0x97, 0xa7, 0xda, 0x8c, 0x1e, 0x88, 0xa, 0xf8, + 0x13, 0xc4, 0x3a, 0x1d, 0x73, 0x87, 0x8b, 0x7b, 0x1b, 0x6c, 0x8a, 0x81, + 0x1d, 0x9c, 0x57, 0xa, 0x7c, 0xa, 0xf7, 0xf6, 0xb7, 0x3, 0xf8, 0x4, + 0xf9, 0x63, 0x21, 0x1d, 0xfc, 0x89, 0xfb, 0x74, 0x32, 0x1d, 0x6e, 0xa, + 0xf7, 0x88, 0x77, 0x1, 0xf3, 0xf1, 0xf7, 0xf6, 0xb7, 0x3, 0xf7, 0x62, + 0x38, 0xa, 0xfb, 0xd0, 0xfb, 0x87, 0x32, 0x1d, 0xf8, 0x1, 0x7d, 0xb7, + 0xf8, 0xf9, 0x97, 0xa, 0xe9, 0xee, 0x12, 0xf7, 0x13, 0xf1, 0x7a, 0xee, + 0xf0, 0xee, 0xb4, 0xb7, 0x13, 0xcb, 0x99, 0xf9, 0x17, 0x2e, 0x1d, 0x13, + 0xbb, 0x9e, 0xfb, 0x7c, 0x7, 0x13, 0xcb, 0x50, 0x1d, 0x4f, 0x3f, 0xfb, + 0x13, 0x47, 0xa, 0x13, 0xbb, 0x88, 0xa, 0x13, 0xcb, 0x13, 0xb7, 0xf7, + 0x5a, 0xf7, 0xf, 0x4a, 0x1d, 0xf8, 0x1, 0x83, 0xa, 0xf7, 0x8c, 0x72, + 0xa, 0xa8, 0xde, 0x1a, 0xf7, 0x3f, 0x7e, 0x1d, 0x4b, 0x1d, 0x5e, 0x1d, + 0xf7, 0x6, 0xf9, 0x50, 0x24, 0xa, 0xf7, 0x5b, 0x93, 0x9e, 0xf7, 0x25, + 0xb3, 0xf7, 0x95, 0xb1, 0xf7, 0x34, 0x77, 0x6d, 0xa, 0x98, 0xe9, 0x1a, + 0xac, 0x66, 0x1d, 0xf7, 0x6, 0x21, 0xcd, 0xfb, 0x2e, 0x1e, 0x3b, 0x6, + 0x88, 0xe7, 0x9a, 0x97, 0xda, 0x92, 0x8, 0x9e, 0xfb, 0xa9, 0x78, 0x7, + 0xd4, 0x84, 0x96, 0x7f, 0x44, 0x1a, 0xfc, 0x3b, 0x8d, 0xa, 0xf7, 0x4a, + 0x15, 0xf7, 0x98, 0x7, 0xac, 0x96, 0x8b, 0xa9, 0xb7, 0xf7, 0x26, 0x8a, + 0x74, 0x1d, 0x82, 0xa8, 0x77, 0x9f, 0xf9, 0x10, 0xa6, 0x12, 0xd4, 0xdf, + 0xf7, 0x45, 0xe2, 0x5c, 0xe9, 0x13, 0x78, 0x97, 0x16, 0xf7, 0x25, 0xf8, + 0xb9, 0x6, 0x9b, 0x8d, 0xe6, 0xe2, 0xbb, 0xb3, 0x5f, 0x2d, 0x1e, 0xfb, + 0x38, 0xfb, 0x10, 0xc1, 0x69, 0x1a, 0x6e, 0xc4, 0xa5, 0xbb, 0x65, 0x1e, + 0x13, 0xb4, 0x9c, 0x7d, 0xb5, 0x60, 0x23, 0x1a, 0x38, 0x82, 0x46, 0x54, + 0x7a, 0x85, 0x92, 0x99, 0x87, 0x1e, 0x89, 0x93, 0x8a, 0x96, 0x8a, 0x97, + 0x8, 0x9f, 0x89, 0x7c, 0x9f, 0x72, 0x1b, 0x71, 0x78, 0x77, 0x6e, 0x75, + 0x9c, 0x59, 0xdd, 0xf7, 0x1, 0xcf, 0xef, 0xe6, 0xf7, 0x21, 0xfb, 0x4, + 0xbe, 0x46, 0x8d, 0x1f, 0x8d, 0x7, 0x13, 0x78, 0xf7, 0x3, 0xbb, 0xa2, + 0xb4, 0xd0, 0x1a, 0xf6, 0x2c, 0xb3, 0x43, 0xfb, 0x48, 0x8a, 0xfb, 0x3a, + 0x4c, 0x1e, 0xfb, 0xfc, 0x7, 0x4a, 0x73, 0x80, 0x66, 0x88, 0x1e, 0xe, + 0x4f, 0x1d, 0xf7, 0x6e, 0x77, 0x12, 0xb0, 0xe3, 0x39, 0xe3, 0xf7, 0x30, + 0xdc, 0x13, 0xda, 0x34, 0x1d, 0x1e, 0x13, 0xd6, 0xfb, 0x8, 0x67, 0x44, + 0x63, 0x7b, 0x8c, 0x6f, 0xaa, 0xa5, 0xa4, 0x97, 0xa0, 0x1f, 0x94, 0x80, + 0xa4, 0x9a, 0x1a, 0x13, 0xba, 0xaa, 0xb1, 0x37, 0xa, 0xcb, 0x89, 0xa, + 0xbe, 0xab, 0xa4, 0x1e, 0x6d, 0xf8, 0x46, 0x27, 0x1d, 0x4f, 0x1d, 0xf7, + 0x6e, 0x77, 0x1, 0xaa, 0xe3, 0xf7, 0x3c, 0xdc, 0x3, 0x34, 0x1d, 0xfb, + 0x8, 0x4f, 0x44, 0x63, 0x7b, 0xa4, 0x6f, 0xaa, 0xa5, 0x91, 0xa1, 0xa0, + 0x1e, 0xb2, 0x7, 0xaa, 0xb9, 0x37, 0xa, 0xb3, 0x66, 0xc1, 0xe9, 0xb1, + 0xbe, 0xab, 0xa4, 0x1e, 0xfb, 0x1f, 0xf8, 0x46, 0x15, 0xf7, 0x27, 0xf7, + 0x28, 0x5, 0xa2, 0xa2, 0x91, 0x8b, 0x9a, 0x1b, 0xab, 0x8c, 0x6f, 0x87, + 0x74, 0x78, 0x7f, 0x80, 0x84, 0x1f, 0xfb, 0x2e, 0x2a, 0x5, 0xe, 0x4f, + 0x1d, 0xf7, 0x6a, 0x77, 0x84, 0xa, 0xce, 0xf8, 0x8f, 0x25, 0x1d, 0xeb, + 0xfc, 0x2a, 0x29, 0xa, 0x4f, 0x1d, 0xd3, 0xf5, 0x84, 0xa, 0xc4, 0xf8, + 0xa8, 0x83, 0x1d, 0x96, 0xaf, 0xb1, 0x1b, 0x97, 0x98, 0x84, 0x45, 0x1d, + 0x74, 0x94, 0x91, 0x7f, 0x1f, 0xa3, 0x5c, 0x77, 0x96, 0x76, 0x1b, 0x48, + 0x6d, 0x4d, 0x5f, 0x83, 0x1f, 0xf7, 0x7a, 0xfb, 0x9c, 0x29, 0xa, 0x4f, + 0x1d, 0xcb, 0xee, 0x12, 0xb0, 0xe3, 0x46, 0xe3, 0x44, 0xee, 0xf0, 0xea, + 0x3a, 0xdc, 0x13, 0xd8, 0x80, 0xf7, 0xb3, 0xf7, 0xa0, 0x28, 0x1d, 0x13, + 0xd5, 0x0, 0x3e, 0x1d, 0x13, 0xb8, 0x80, 0x3c, 0x1d, 0x13, 0xd3, 0x0, + 0xfb, 0x6b, 0xf8, 0x88, 0x4a, 0x1d, 0xe2, 0x81, 0xc5, 0xf7, 0x95, 0xf7, + 0x2b, 0x77, 0xa3, 0xcd, 0xad, 0xf7, 0x17, 0xad, 0x12, 0xc3, 0xe3, 0x64, + 0xe3, 0x3d, 0xad, 0xf7, 0x7, 0xdc, 0x98, 0xae, 0x13, 0xda, 0x40, 0xf7, + 0xb3, 0xf7, 0xa0, 0x24, 0x1d, 0x13, 0xdc, 0x80, 0x40, 0xa, 0xeb, 0xfb, + 0x29, 0xfb, 0x8, 0x5c, 0x48, 0x57, 0x1d, 0x1e, 0x94, 0x86, 0x9a, 0x9a, + 0x1a, 0x13, 0xba, 0x40, 0xaa, 0xb1, 0x99, 0xac, 0xa9, 0xba, 0x57, 0x43, + 0x1e, 0x7b, 0x4f, 0xa, 0xbf, 0x89, 0xa, 0xbd, 0xac, 0xb0, 0x1e, 0x13, + 0xd9, 0x40, 0xfb, 0x39, 0xf8, 0xae, 0x67, 0xa, 0xad, 0x16, 0xaf, 0xa8, + 0x93, 0xa, 0x6e, 0x67, 0x67, 0x6e, 0xa8, 0xaf, 0x1e, 0xe, 0xf7, 0xca, + 0x81, 0xbb, 0x5b, 0xce, 0xf7, 0x70, 0xa9, 0x88, 0xf7, 0x30, 0x73, 0xa3, + 0x12, 0xb1, 0xe2, 0x4a, 0xe4, 0xf7, 0x10, 0xdc, 0x13, 0x6d, 0xf7, 0xc6, + 0xd4, 0x15, 0x71, 0x9c, 0xa9, 0x52, 0xe1, 0x1b, 0xb1, 0xe9, 0x98, 0xf7, + 0x26, 0xc8, 0x1f, 0x7f, 0x90, 0x5, 0x56, 0x6a, 0x59, 0x5f, 0x54, 0x1b, + 0xfb, 0x14, 0x8b, 0xf7, 0xd, 0xee, 0x1f, 0xf7, 0x9a, 0x6, 0x13, 0x93, + 0xbd, 0x7c, 0xf7, 0x19, 0xfb, 0x22, 0x58, 0x6d, 0x7f, 0x6a, 0x62, 0x1e, + 0xa0, 0x73, 0x6e, 0xa3, 0x49, 0x1b, 0x35, 0x43, 0x5e, 0x4d, 0x65, 0xa4, + 0x80, 0x9c, 0xba, 0x8b, 0xb5, 0xaf, 0x1f, 0x13, 0xad, 0xa8, 0x9e, 0xa4, + 0xb8, 0xcd, 0x89, 0x57, 0x24, 0x87, 0x1e, 0xfb, 0x35, 0x4a, 0x41, 0x6d, + 0x31, 0x1a, 0x61, 0xab, 0x4b, 0xde, 0xee, 0x92, 0xb7, 0xb2, 0xba, 0x1e, + 0x7e, 0xa4, 0x15, 0x7d, 0x52, 0x5d, 0x64, 0x54, 0x7a, 0xc2, 0xa5, 0xca, + 0xa4, 0xa7, 0xf7, 0xf, 0xb6, 0x1e, 0x8c, 0x57, 0x5, 0x8c, 0x44, 0x9d, + 0x72, 0x84, 0x1a, 0xc9, 0xf7, 0x65, 0x15, 0xb5, 0x8d, 0x8f, 0xdd, 0xde, + 0x1b, 0xd3, 0x90, 0x37, 0x63, 0x1f, 0xe, 0xe2, 0xfb, 0x56, 0x76, 0xf7, + 0x61, 0xd3, 0xf7, 0x91, 0xf7, 0x25, 0x6e, 0xa8, 0x12, 0xa4, 0xd8, 0xf7, + 0x31, 0xd6, 0x13, 0xdc, 0xf7, 0x11, 0x8e, 0xa, 0xcb, 0xcf, 0xaa, 0xbf, + 0xc3, 0x54, 0xa2, 0x52, 0x7f, 0x1f, 0xa1, 0xc5, 0xcd, 0x95, 0xc2, 0xb8, + 0xba, 0xee, 0x19, 0x63, 0x1d, 0x90, 0x79, 0x6d, 0x93, 0x1f, 0x13, 0xec, + 0x5f, 0x97, 0x9c, 0x73, 0xa5, 0x1b, 0xa9, 0x9b, 0xa0, 0xa2, 0xca, 0x33, + 0xb1, 0x4e, 0xfb, 0x0, 0xfb, 0x8, 0x38, 0xfb, 0x38, 0xfb, 0x30, 0xf3, + 0x4a, 0xda, 0x89, 0x1f, 0x65, 0x2e, 0x92, 0x86, 0x5, 0xab, 0x94, 0xbd, + 0x8d, 0x86, 0xa, 0xe2, 0x81, 0xd0, 0xf7, 0x4f, 0xab, 0xf7, 0xd, 0xaf, + 0xf7, 0x87, 0x77, 0x12, 0xa3, 0xd0, 0xf7, 0x68, 0xf1, 0x17, 0x26, 0x1d, + 0x13, 0x7c, 0x3d, 0x1d, 0x5e, 0xf7, 0x64, 0x27, 0x1d, 0x87, 0x1d, 0xf7, + 0x11, 0xaf, 0xf7, 0x6e, 0x77, 0x1, 0xac, 0xd0, 0xf7, 0x46, 0xf1, 0x3, + 0x28, 0xa, 0xfb, 0x6, 0xf7, 0x64, 0x24, 0xa, 0x87, 0x1d, 0xf7, 0x11, + 0xaf, 0xf7, 0x6a, 0x77, 0x1, 0xa4, 0xd0, 0xf7, 0x65, 0xf1, 0x3, 0x28, + 0xa, 0xfb, 0x80, 0xf7, 0x64, 0x25, 0x1d, 0xe, 0xe2, 0x81, 0xd0, 0xf7, + 0x58, 0xab, 0xf7, 0x1d, 0xaf, 0xca, 0xef, 0x12, 0xa4, 0xd0, 0x77, 0xed, + 0xf0, 0xed, 0x13, 0xfa, 0x28, 0xa, 0x13, 0xf6, 0xfb, 0x79, 0xf7, 0xa6, + 0x15, 0x4b, 0xa, 0x8f, 0xa, 0xf9, 0x3a, 0x27, 0xa, 0xf7, 0x33, 0xf8, + 0x80, 0x27, 0x1d, 0x8f, 0xa, 0xf9, 0x3a, 0x27, 0xa, 0xbd, 0xf8, 0x80, + 0x24, 0xa, 0x8f, 0xa, 0xf9, 0x36, 0x27, 0xa, 0x6b, 0xf8, 0x80, 0x25, + 0x1d, 0xe, 0x8f, 0xa, 0xf8, 0xa0, 0xee, 0x1, 0x82, 0xed, 0x91, 0xdf, + 0x96, 0xed, 0x23, 0xa, 0x72, 0xf8, 0xc2, 0x15, 0x6b, 0xa, 0xf7, 0x5b, + 0x16, 0x6b, 0xa, 0xe, 0x71, 0xa, 0xf7, 0x76, 0x77, 0x1, 0xa8, 0xe5, + 0xf7, 0x9a, 0xe5, 0x3, 0xf7, 0xb, 0xf7, 0xaa, 0x15, 0xf1, 0xc3, 0xbf, + 0xca, 0xd4, 0xd1, 0x3d, 0xfb, 0x2f, 0xfb, 0x23, 0x48, 0x65, 0x58, 0xfb, + 0xc, 0x73, 0xf7, 0x4c, 0xd7, 0x1e, 0xf7, 0x89, 0xf7, 0x11, 0x15, 0xb4, + 0x60, 0x69, 0x9b, 0x61, 0x1b, 0xfb, 0x19, 0x38, 0xfb, 0x1, 0xfb, 0x17, + 0xfb, 0x13, 0xe6, 0x24, 0x65, 0x1d, 0xf7, 0x32, 0xf7, 0x1c, 0xf7, 0xb, + 0x5e, 0xf7, 0xd, 0x2e, 0xd9, 0x1f, 0xe6, 0xbb, 0x6a, 0xa9, 0x2c, 0x59, + 0x62, 0xa5, 0x57, 0xa5, 0x50, 0x8f, 0x19, 0x61, 0x75, 0xbb, 0x84, 0xb8, + 0x6d, 0xb3, 0x6e, 0x19, 0xfb, 0xd, 0x4b, 0xac, 0x6d, 0xf7, 0xf, 0xcc, + 0xbe, 0x5a, 0xae, 0x54, 0x95, 0x4f, 0x19, 0xe, 0xa0, 0x76, 0xf8, 0x29, + 0xc2, 0xd6, 0xf2, 0x73, 0xa, 0xb2, 0xb6, 0x1a, 0xf7, 0x8c, 0x7e, 0xa, + 0xfb, 0x5b, 0x7, 0x3f, 0x71, 0x7c, 0x82, 0x1d, 0xa7, 0xce, 0x1a, 0xf7, + 0x58, 0x46, 0xa, 0xd0, 0xf8, 0x99, 0x15, 0xa8, 0x6, 0xb0, 0x8e, 0xac, + 0x9e, 0xa3, 0x1b, 0xa6, 0x9f, 0x79, 0x82, 0xa0, 0x1f, 0x7e, 0xaa, 0xa2, + 0x7e, 0x9e, 0x1b, 0xd9, 0x98, 0xd0, 0x65, 0xa, 0x5e, 0x83, 0x7a, 0x80, + 0x75, 0x1b, 0x77, 0x72, 0x98, 0x95, 0x74, 0x1f, 0x9b, 0x66, 0x76, 0x9c, + 0x74, 0x54, 0xa, 0x71, 0xa, 0xf7, 0x6e, 0x77, 0x1, 0xb9, 0xe5, 0xf7, + 0x8a, 0xe5, 0x3, 0x2f, 0x1d, 0xa6, 0x15, 0xf3, 0xc2, 0xd4, 0xca, 0xe7, + 0xbe, 0x34, 0x80, 0xa, 0x46, 0x4f, 0x58, 0xfb, 0xc, 0x76, 0xf7, 0x37, + 0xd5, 0x1e, 0xf7, 0x3b, 0xf7, 0x90, 0x3b, 0x1d, 0x9e, 0x74, 0x86, 0x94, + 0xa, 0x9c, 0x57, 0xa, 0x71, 0xa, 0xf7, 0x6e, 0x77, 0x1, 0xa8, 0xe5, + 0xf7, 0x99, 0xe5, 0x3, 0xa8, 0xf7, 0x7b, 0x15, 0xfb, 0x1b, 0xe5, 0x21, + 0x65, 0x1d, 0xf7, 0x1c, 0xee, 0xf7, 0x25, 0x2d, 0xe5, 0xfb, 0x17, 0xfb, + 0x1a, 0x39, 0x21, 0xfb, 0xf, 0x1e, 0xe5, 0xad, 0x15, 0xf3, 0xc9, 0xca, + 0xca, 0xe7, 0xb7, 0x30, 0x80, 0xa, 0x3b, 0x53, 0x58, 0xfb, 0xc, 0x81, + 0xf7, 0x41, 0xd5, 0x1e, 0xc5, 0xf7, 0x86, 0x24, 0xa, 0x71, 0xa, 0xf7, + 0x6a, 0x77, 0x4c, 0x1d, 0xa9, 0x15, 0xf3, 0xc2, 0xd1, 0xca, 0xe7, 0xbe, + 0x3a, 0x80, 0xa, 0x44, 0x49, 0x58, 0xfb, 0xc, 0x78, 0xf7, 0x3a, 0xd5, + 0x1e, 0x73, 0xf7, 0x8d, 0x25, 0x1d, 0xe, 0x71, 0xa, 0xd3, 0xf5, 0x4c, + 0x1d, 0xbb, 0x15, 0xf3, 0xc2, 0xbf, 0xca, 0xe7, 0xbe, 0xfb, 0x1, 0x80, + 0xa, 0x48, 0x65, 0x58, 0xfb, 0xc, 0x74, 0xf7, 0x4c, 0xd5, 0x1e, 0x69, + 0xf7, 0x94, 0x15, 0xa8, 0x6, 0x91, 0x9c, 0x9b, 0xbb, 0xaf, 0x7e, 0x8, + 0x71, 0xd1, 0xb0, 0x71, 0x52, 0x1d, 0x7a, 0x63, 0x7c, 0x7a, 0x71, 0x92, + 0x8, 0x9b, 0x51, 0x50, 0xad, 0x76, 0x54, 0xa, 0x71, 0xa, 0xca, 0xef, + 0x12, 0xa8, 0xe5, 0x79, 0xef, 0xee, 0xef, 0x77, 0xe5, 0x13, 0xf2, 0x2f, + 0x1d, 0xa4, 0x15, 0xf3, 0xc2, 0xd6, 0xca, 0xe7, 0xbe, 0x3d, 0x80, 0xa, + 0x48, 0x46, 0x58, 0xfb, 0xc, 0x74, 0xf7, 0x35, 0xd5, 0x1e, 0x13, 0xec, + 0x79, 0xf7, 0xd4, 0x15, 0x30, 0xa, 0xf7, 0x5b, 0x16, 0x30, 0xa, 0xe, + 0xf7, 0x63, 0x96, 0x76, 0xe1, 0x77, 0xb9, 0xf7, 0xa, 0x8b, 0xcd, 0x55, + 0xb6, 0xf7, 0x85, 0x77, 0x12, 0xf7, 0x76, 0xf7, 0x5, 0x27, 0xe1, 0x13, + 0xee, 0xa9, 0xf7, 0x7c, 0x15, 0xf8, 0x8c, 0xb6, 0xfc, 0x8c, 0x6, 0xf7, + 0x90, 0xfb, 0xb1, 0x15, 0x13, 0xf5, 0x6c, 0xa, 0xf8, 0x4c, 0x4, 0x6c, + 0xa, 0xe, 0x30, 0x76, 0xf1, 0xa7, 0xf8, 0x32, 0xa7, 0xe6, 0x77, 0x1, + 0xa8, 0xe5, 0xf7, 0x99, 0xe5, 0x3, 0xf7, 0x47, 0xc7, 0x15, 0xf7, 0x35, + 0xf7, 0xc6, 0x5, 0xa5, 0x60, 0x99, 0x4f, 0x4b, 0x1a, 0xfb, 0x23, 0x48, + 0x65, 0x58, 0x67, 0x70, 0x9b, 0xa5, 0x77, 0x1e, 0xfb, 0x13, 0xfb, 0x40, + 0x15, 0xb0, 0x6, 0xcc, 0xf7, 0xf, 0x5, 0x7d, 0xa8, 0xaa, 0x84, 0xad, + 0x1b, 0xf7, 0x2c, 0xd1, 0xf7, 0x1f, 0xee, 0xe7, 0x66, 0xcf, 0x4e, 0xb1, + 0x1f, 0xcc, 0xf7, 0x11, 0x5, 0x64, 0x6, 0x52, 0xfb, 0x1, 0x5, 0x97, + 0x6e, 0x6b, 0x91, 0x68, 0x1b, 0xfb, 0x1a, 0x39, 0xfb, 0x1, 0xfb, 0xf, + 0x36, 0xaf, 0x42, 0xc7, 0x61, 0x1f, 0xac, 0xcb, 0x15, 0x6c, 0xc6, 0x83, + 0xdd, 0xb6, 0x1a, 0xf3, 0xc2, 0xbf, 0xca, 0xab, 0xa5, 0x7e, 0x74, 0xa1, + 0x1e, 0xe, 0x76, 0x1d, 0xf7, 0xe6, 0xe1, 0x15, 0x2e, 0x7, 0x8d, 0x88, + 0x87, 0xa, 0x19, 0x22, 0xa, 0x57, 0xf8, 0x39, 0x27, 0x1d, 0x76, 0x1d, + 0xf7, 0x45, 0xf8, 0x8f, 0x21, 0x1d, 0x9b, 0xfd, 0x2d, 0x25, 0xa, 0xe, + 0x81, 0xc7, 0xf8, 0x24, 0x77, 0xf7, 0x88, 0x90, 0xa, 0xea, 0xf8, 0x8f, + 0x25, 0x1d, 0xf7, 0xd, 0xfd, 0x40, 0x25, 0xa, 0xe, 0x81, 0xc7, 0xf8, + 0x13, 0xf7, 0x52, 0x27, 0xef, 0x12, 0xd2, 0xdf, 0x55, 0xef, 0xed, 0xef, + 0x49, 0xdf, 0x13, 0xd2, 0xf7, 0xe8, 0x81, 0x25, 0xa, 0x13, 0xac, 0xfb, + 0x81, 0xf8, 0xd8, 0x15, 0x30, 0xa, 0xf7, 0x5a, 0x16, 0x30, 0xa, 0xe, + 0x96, 0xa, 0xf8, 0xc2, 0x9a, 0xf7, 0x71, 0x77, 0x12, 0xf7, 0xe8, 0xf7, + 0x1b, 0x13, 0x90, 0x40, 0x1d, 0x13, 0x78, 0x41, 0xa, 0xfb, 0x28, 0xf7, + 0x46, 0x24, 0xa, 0x8e, 0x1d, 0xf7, 0x73, 0x77, 0x1, 0xd6, 0xdf, 0xf7, + 0x75, 0xe1, 0x3, 0x90, 0xfb, 0x5b, 0x15, 0x79, 0xf7, 0x86, 0x9d, 0x7, + 0x43, 0x7b, 0xa0, 0xcb, 0x1f, 0xf7, 0x27, 0x7, 0x5f, 0x1d, 0x75, 0x1f, + 0x89, 0x8d, 0x5, 0x8c, 0xf7, 0xbb, 0x6, 0x86, 0x8e, 0x6b, 0x1d, 0x76, + 0x6d, 0x1f, 0xfd, 0x4a, 0x7, 0x60, 0x87, 0x6c, 0x49, 0x87, 0x1e, 0xf7, + 0x2e, 0xf7, 0xb3, 0x15, 0x5a, 0xa, 0x96, 0xa, 0xf8, 0xbb, 0xf7, 0x50, + 0x27, 0xef, 0x12, 0xf1, 0xed, 0xf0, 0xed, 0x13, 0xac, 0x40, 0x1d, 0x13, + 0x6c, 0x41, 0xa, 0xfb, 0x9b, 0xf7, 0x88, 0x15, 0x13, 0x9c, 0x4b, 0xa, + 0x8f, 0xa, 0xf8, 0x60, 0x27, 0xa, 0xe, 0xf7, 0x92, 0x8b, 0x9e, 0xf9, + 0x4, 0x9e, 0x1, 0xee, 0x5d, 0x1d, 0x9b, 0xd4, 0x1f, 0xf7, 0x40, 0x7, + 0xf7, 0x2f, 0xe9, 0x5, 0xbc, 0x7, 0xfb, 0x2f, 0x2c, 0x5, 0xf7, 0x50, + 0x7, 0xe1, 0x73, 0x1d, 0xfb, 0x88, 0x7, 0x34, 0x55, 0x5, 0x5a, 0x7, + 0xe2, 0xc0, 0x5, 0xfb, 0xb, 0x7, 0x33, 0x7a, 0xa, 0xe, 0x8f, 0xa, + 0xf9, 0x3, 0x9b, 0xb7, 0x77, 0x1, 0xe1, 0xdf, 0x3, 0x9e, 0x16, 0xf7, + 0x84, 0x9a, 0x6, 0x51, 0x8e, 0x78, 0x9d, 0xc5, 0x1a, 0xf7, 0xcd, 0x7, + 0xd8, 0xbf, 0x5, 0xb7, 0x7, 0x3e, 0x56, 0x5, 0xf7, 0x7b, 0x5d, 0xa, + 0xfb, 0x40, 0x7, 0x3c, 0x56, 0x5, 0x5f, 0x7, 0xda, 0xbf, 0x5, 0xfb, + 0x91, 0x7, 0x57, 0x77, 0x74, 0x50, 0x84, 0x1d, 0xf8, 0xa8, 0x85, 0xb0, + 0x6c, 0xb2, 0xf7, 0xb6, 0xb0, 0xf7, 0x9e, 0xa9, 0x6d, 0xaf, 0x6b, 0xaf, + 0x12, 0xa9, 0xf7, 0x4, 0xf7, 0xb5, 0xef, 0xf7, 0x7b, 0xa1, 0x13, 0xa7, + 0x0, 0xf8, 0xa7, 0xf7, 0xdd, 0x15, 0xf7, 0x2c, 0x88, 0x8a, 0x81, 0xa4, + 0x1f, 0xab, 0x81, 0x9f, 0x6d, 0x90, 0x5a, 0x8, 0x13, 0xa7, 0x80, 0xa1, + 0xf7, 0x7e, 0x75, 0x6, 0x2a, 0x7d, 0x85, 0x8b, 0xfb, 0x67, 0x1b, 0xf7, + 0x80, 0x7, 0x9e, 0x8f, 0x90, 0xf7, 0x4, 0xf7, 0x4, 0xb8, 0x84, 0x29, + 0x96, 0x1e, 0xa2, 0xf7, 0x21, 0xfb, 0xda, 0x6, 0x64, 0x66, 0x8d, 0x8c, + 0x6e, 0x1f, 0x13, 0xab, 0x0, 0x8d, 0x6e, 0x77, 0x8c, 0x84, 0x1b, 0xfb, + 0x4a, 0xfb, 0x1f, 0x24, 0xfb, 0x8f, 0xfb, 0x64, 0xf7, 0x18, 0xfb, 0x4, + 0xf7, 0x29, 0xa9, 0xa8, 0x8d, 0x8c, 0xa9, 0x1f, 0x13, 0x67, 0x0, 0x8d, + 0xa9, 0xaa, 0x8c, 0xa9, 0x1b, 0xf7, 0xf2, 0x6, 0xb7, 0xf7, 0x3c, 0x5, + 0x73, 0x6, 0x52, 0xfb, 0x2, 0x5e, 0x7b, 0x5b, 0x89, 0xfb, 0x10, 0x89, + 0x18, 0x67, 0x77, 0x8d, 0xb7, 0x1f, 0x27, 0xba, 0x15, 0x13, 0xb3, 0x0, + 0x56, 0x7d, 0x5c, 0x37, 0xfb, 0x23, 0x5b, 0xf7, 0x16, 0xf7, 0x3d, 0xf7, + 0x34, 0xbf, 0xf7, 0x22, 0xf7, 0x1e, 0xe3, 0x96, 0x54, 0x59, 0x1e, 0xe, + 0xf8, 0x1, 0x81, 0xa5, 0x71, 0xce, 0xf7, 0x66, 0xa9, 0xf7, 0x1a, 0xa8, + 0x12, 0xa9, 0xe5, 0xf7, 0x73, 0xd8, 0xf7, 0x33, 0xea, 0x13, 0x7e, 0xf8, + 0x13, 0xe0, 0x15, 0x4c, 0xa4, 0xb3, 0x6b, 0xcc, 0x1b, 0xec, 0xbc, 0xdd, + 0xce, 0xaa, 0x1f, 0x80, 0x91, 0x5, 0x6e, 0x76, 0x60, 0x50, 0x4b, 0x1b, + 0xfb, 0xf, 0x85, 0xf7, 0x32, 0xbf, 0x89, 0x1f, 0xf7, 0x92, 0x6, 0xf7, + 0x36, 0xfb, 0xa, 0xaa, 0x62, 0x40, 0x6a, 0x5e, 0x6c, 0x74, 0x1e, 0xd0, + 0x54, 0x4a, 0x92, 0x6e, 0x1b, 0xfb, 0x43, 0x6d, 0xfb, 0x48, 0x50, 0xfb, + 0x3e, 0xf7, 0x8, 0x4e, 0xe9, 0xa3, 0xd5, 0x8f, 0xe6, 0xb8, 0x1f, 0xfb, + 0x9b, 0xf7, 0x58, 0x15, 0xf7, 0xc, 0xcc, 0xa9, 0xb5, 0xf7, 0x1, 0x92, + 0xfb, 0x3c, 0x52, 0x1e, 0x13, 0xbe, 0xfb, 0x6, 0x71, 0x3f, 0x3d, 0xfb, + 0x7, 0x87, 0xf7, 0x4c, 0xdc, 0x1e, 0xf7, 0xbf, 0x9b, 0x15, 0xa8, 0x8d, + 0xf4, 0xdc, 0xbc, 0xa7, 0x50, 0x5b, 0x1e, 0x70, 0x7, 0xe, 0xf7, 0x5b, + 0x7d, 0xaf, 0x7d, 0x76, 0xf9, 0x1c, 0xb4, 0xf7, 0x66, 0x77, 0x12, 0xd2, + 0xe1, 0xf7, 0x7d, 0xf0, 0x13, 0x7c, 0xd3, 0x7e, 0x15, 0xa1, 0x6, 0x9b, + 0x9f, 0x9c, 0xa0, 0x1e, 0x13, 0xbc, 0xa9, 0xb2, 0x69, 0xd7, 0x1b, 0xf7, + 0x23, 0xcf, 0xeb, 0xe0, 0xf5, 0x32, 0xc4, 0x35, 0xbd, 0x1f, 0x3a, 0xba, + 0x3d, 0xb5, 0xd4, 0x1a, 0xc9, 0xbe, 0xaa, 0xbd, 0xf4, 0xcb, 0x31, 0x39, + 0x9c, 0x1e, 0xa4, 0x6, 0x75, 0x86, 0x1d, 0x72, 0x5f, 0xad, 0x4f, 0x55, + 0xa, 0x74, 0x6, 0x13, 0x7c, 0xf7, 0x61, 0xf8, 0x9c, 0x31, 0xa, 0xab, + 0x81, 0xa1, 0x90, 0x76, 0xf7, 0x30, 0x77, 0xf7, 0xb0, 0xa2, 0x97, 0x77, + 0xf7, 0x87, 0x77, 0x12, 0xf7, 0xac, 0xd1, 0x13, 0x76, 0xbf, 0x87, 0x15, + 0x98, 0x6, 0x94, 0x91, 0x99, 0x8e, 0x97, 0x1b, 0x9b, 0x8c, 0x9e, 0x84, + 0xa0, 0x86, 0x8, 0x13, 0xb6, 0x87, 0x9a, 0x9b, 0x88, 0x9e, 0x1b, 0xcb, + 0xde, 0xb5, 0xe2, 0xc7, 0x66, 0x66, 0xa, 0xb7, 0xb8, 0x76, 0x25, 0xa1, + 0x1e, 0x9a, 0x6, 0x13, 0xae, 0x87, 0xf7, 0x1d, 0x5, 0x80, 0x6, 0x87, + 0x88, 0x7c, 0x84, 0x82, 0x1b, 0x82, 0x80, 0x91, 0x91, 0x7c, 0x1f, 0x13, + 0xb6, 0x8f, 0x7f, 0x7b, 0x7c, 0x1d, 0xe5, 0x58, 0xa1, 0x73, 0x6b, 0x1a, + 0x52, 0x5a, 0x95, 0xa, 0x7b, 0x6, 0x13, 0x76, 0xf7, 0x3, 0xf7, 0xf7, + 0x31, 0xa, 0x80, 0x1d, 0xf9, 0x17, 0x97, 0xa, 0xe8, 0xef, 0x12, 0xf7, + 0x69, 0xed, 0x8f, 0xf1, 0x82, 0xed, 0x13, 0xcc, 0x68, 0xa, 0xa3, 0xdd, + 0x1a, 0xf7, 0x45, 0x7e, 0x1d, 0x13, 0x3c, 0x4b, 0x1d, 0x7, 0x13, 0x4c, + 0x5e, 0x1d, 0x8a, 0xf9, 0x92, 0x15, 0x13, 0x9a, 0x6f, 0x9f, 0x35, 0x1d, + 0x77, 0x62, 0x1d, 0xf7, 0x5b, 0x16, 0x6f, 0x9f, 0x35, 0x1d, 0x77, 0x62, + 0x1d, 0xe, 0x7b, 0xa, 0x8b, 0x77, 0xf8, 0xf2, 0xb1, 0xf7, 0x74, 0x77, + 0x1, 0xaa, 0xa5, 0xf8, 0x99, 0xa2, 0x3f, 0x1d, 0xf7, 0x9d, 0xf9, 0x54, + 0x31, 0xa, 0xe2, 0x8b, 0xa9, 0xf8, 0x1a, 0xa9, 0xf7, 0x74, 0x77, 0x6a, + 0xa, 0x7a, 0x6c, 0x21, 0x1b, 0xfb, 0x13, 0x56, 0x1d, 0xf7, 0x38, 0xf8, + 0x80, 0x31, 0xa, 0xfb, 0x51, 0xa3, 0xf8, 0xb1, 0xaa, 0xf7, 0x84, 0xa8, + 0x1, 0xeb, 0xf8, 0xc, 0x15, 0xf7, 0xd, 0x6, 0x63, 0xfc, 0x3, 0x5, + 0x38, 0x84, 0x79, 0x30, 0x50, 0x1b, 0x80, 0x83, 0x91, 0x92, 0x1f, 0x95, + 0x9a, 0x96, 0x9e, 0x1a, 0xa2, 0x7d, 0x99, 0x75, 0x7e, 0x6a, 0x83, 0x67, + 0x65, 0xa8, 0x6b, 0xbd, 0xeb, 0xba, 0xf1, 0xf7, 0x43, 0xac, 0x1e, 0x9a, + 0xda, 0x93, 0xe4, 0x9c, 0xf7, 0xc, 0x8, 0xf7, 0xc, 0x6, 0x95, 0xaa, + 0x5, 0xfb, 0x12, 0x6, 0xf7, 0x18, 0x97, 0x99, 0xf7, 0x0, 0xcc, 0x1b, + 0x96, 0x96, 0x89, 0x80, 0x1f, 0x82, 0x7e, 0x7f, 0x7b, 0x1a, 0x7f, 0x97, + 0x75, 0xa4, 0xa3, 0xa2, 0x9c, 0xa9, 0xa8, 0x6c, 0xb0, 0x57, 0xfb, 0x26, + 0x6c, 0xfb, 0x6f, 0x59, 0x84, 0x1e, 0xfb, 0x9, 0x6, 0xe, 0x91, 0xa, + 0x96, 0xf8, 0x8f, 0x2b, 0x1d, 0xfb, 0xf, 0xf7, 0x3b, 0x5, 0x49, 0x6, + 0xe, 0x91, 0xa, 0xf7, 0x1b, 0xf8, 0x8f, 0x31, 0xa, 0x73, 0xf8, 0x8f, + 0xc0, 0xf3, 0x77, 0x1, 0xa5, 0xf9, 0x2c, 0x15, 0x6e, 0x9b, 0xfb, 0x14, + 0xf7, 0xe, 0xf7, 0x14, 0x9a, 0xf7, 0x12, 0xaa, 0x1e, 0x6e, 0x6, 0x4e, + 0x82, 0x5c, 0x60, 0x53, 0x1b, 0x4b, 0x66, 0xb6, 0xc8, 0x81, 0x1f, 0xe, + 0x73, 0xf8, 0x9f, 0xef, 0x1, 0xf7, 0xa, 0xed, 0x3, 0xf7, 0xa, 0xf8, + 0xd1, 0x15, 0x36, 0xa, 0xe, 0x73, 0xf8, 0x94, 0xad, 0xf7, 0x17, 0xad, + 0x12, 0xce, 0xf7, 0x5b, 0x69, 0xad, 0x13, 0xe0, 0xce, 0xf8, 0xf7, 0x15, + 0x55, 0xb5, 0x5e, 0xc4, 0x79, 0x1d, 0x53, 0x60, 0x5d, 0x55, 0x1e, 0xad, + 0x8c, 0x15, 0xa3, 0x9f, 0xb4, 0xb8, 0x1e, 0x13, 0xd0, 0xb0, 0xa8, 0x6d, + 0x67, 0x67, 0x6e, 0x6e, 0x65, 0x5e, 0x78, 0xb4, 0xa4, 0x1f, 0xe, 0x73, + 0xfb, 0x24, 0x76, 0xf7, 0x39, 0x77, 0x1, 0xcb, 0xc0, 0x3, 0xf7, 0xc, + 0x16, 0x72, 0x7b, 0x6c, 0x61, 0x64, 0x1a, 0x6d, 0xa0, 0x65, 0xc5, 0xb4, + 0xbd, 0xa9, 0xc2, 0x9a, 0x1e, 0x7b, 0x92, 0x5, 0x6c, 0x81, 0x68, 0x7b, + 0x6e, 0x1b, 0x73, 0x79, 0x99, 0xa8, 0xab, 0xa8, 0xaa, 0x9d, 0x99, 0x1f, + 0xe, 0x73, 0xf8, 0xa8, 0xf5, 0x1, 0x8c, 0xf8, 0xa8, 0x15, 0xa8, 0x6, + 0x91, 0x9c, 0x98, 0xb9, 0xaf, 0x7f, 0x8, 0x6c, 0xe5, 0x9f, 0x77, 0x52, + 0x1d, 0x7a, 0x63, 0x7c, 0x79, 0x71, 0x93, 0x8, 0xa2, 0x43, 0x5e, 0xa6, + 0x76, 0x54, 0xa, 0x73, 0xf8, 0x8f, 0xf7, 0x3f, 0x1, 0x88, 0xf8, 0x8f, + 0x15, 0xb5, 0x6, 0xf7, 0x2c, 0x22, 0x1d, 0x94, 0xfb, 0x28, 0x15, 0xb5, + 0x6, 0xf7, 0x2c, 0x22, 0x1d, 0xe, 0x8a, 0xa, 0xf8, 0x88, 0xb4, 0xfc, + 0x88, 0x6, 0xe, 0xf9, 0x17, 0x8a, 0xa, 0xfa, 0x7c, 0xb4, 0xfe, 0x7c, + 0x6, 0xe, 0x91, 0x1d, 0xf7, 0x7, 0xf7, 0x1f, 0x3, 0xf7, 0x80, 0xf9, + 0x25, 0x15, 0x51, 0xa, 0x6b, 0x99, 0x71, 0x84, 0x87, 0x88, 0x89, 0x86, + 0x1e, 0x89, 0x87, 0x87, 0x8a, 0x87, 0x64, 0xa, 0xe, 0x91, 0x1d, 0xda, + 0xf7, 0x1f, 0x3, 0xf5, 0xf8, 0x45, 0x15, 0x3c, 0xa, 0xad, 0x7c, 0xa5, + 0x92, 0x92, 0x91, 0x8c, 0x8e, 0x1e, 0x54, 0x1d, 0x73, 0xfb, 0xc, 0x76, + 0xf7, 0x2d, 0x76, 0xa7, 0x76, 0xf3, 0x77, 0x12, 0xda, 0xf7, 0x1f, 0x13, + 0xd8, 0xec, 0xfb, 0xe, 0x15, 0x94, 0x78, 0x5, 0x3c, 0xa, 0xad, 0x7e, + 0xa5, 0x92, 0x92, 0x5c, 0xa, 0xe2, 0xf8, 0x45, 0xf7, 0x3, 0xf7, 0x18, + 0x77, 0x1, 0xb6, 0x97, 0x1d, 0x3, 0xf7, 0x38, 0xf9, 0x25, 0x15, 0x48, + 0x1d, 0xf7, 0x7c, 0x16, 0x48, 0x1d, 0xe, 0xe2, 0xf8, 0x5a, 0x76, 0xf7, + 0x18, 0xf7, 0x3, 0x1, 0xa9, 0x97, 0x1d, 0x3, 0xc4, 0xf8, 0x45, 0x48, + 0xa, 0xf7, 0x85, 0x78, 0x48, 0xa, 0xe, 0xe2, 0xfb, 0xc, 0x76, 0xf7, + 0x18, 0xf7, 0x3, 0x38, 0x76, 0x12, 0xb8, 0x97, 0x1d, 0x13, 0xd8, 0xca, + 0xfb, 0xe, 0x15, 0x94, 0x78, 0x5, 0x46, 0x1d, 0x13, 0xb8, 0x33, 0xa, + 0xf7, 0x7c, 0x16, 0x94, 0x78, 0x5, 0xa9, 0x95, 0xdd, 0xcd, 0xd2, 0x1a, + 0x13, 0xd8, 0xde, 0x51, 0x98, 0x74, 0x72, 0x6a, 0x7c, 0x60, 0x63, 0xae, + 0x7e, 0xa5, 0x92, 0x91, 0x5c, 0xa, 0xfb, 0x14, 0x76, 0xf8, 0xbd, 0xe2, + 0xf7, 0x4d, 0x77, 0x1, 0xf7, 0x84, 0xa2, 0x3, 0xf7, 0x85, 0xfb, 0x29, + 0x15, 0xa0, 0x6, 0x8c, 0xf7, 0x23, 0x5, 0xf7, 0xf, 0xa0, 0xec, 0x9e, + 0xb2, 0x1e, 0x61, 0xb6, 0x8b, 0xeb, 0xb9, 0x1a, 0xb2, 0x88, 0xa2, 0x84, + 0x9c, 0x84, 0x8, 0x82, 0xa0, 0x98, 0x83, 0xa4, 0x1b, 0x9d, 0xa4, 0x94, + 0xae, 0xaa, 0x74, 0x97, 0x79, 0x72, 0x7d, 0x81, 0x82, 0x76, 0x1f, 0x79, + 0x83, 0x75, 0x84, 0x63, 0x8a, 0x8, 0xc2, 0x92, 0xaa, 0x93, 0xa1, 0x1e, + 0x95, 0xa5, 0x96, 0x98, 0xa5, 0x1a, 0xa4, 0x75, 0xa1, 0x73, 0x71, 0x76, + 0x75, 0x72, 0x71, 0x96, 0x7e, 0x95, 0x71, 0x1e, 0x93, 0x75, 0x92, 0x6c, + 0x54, 0x1a, 0x5f, 0x8c, 0x73, 0x94, 0x78, 0x94, 0x8, 0x93, 0x79, 0x7e, + 0x93, 0x75, 0x1b, 0x79, 0x74, 0x7f, 0x6c, 0x68, 0xa2, 0x82, 0x9d, 0xa1, + 0x98, 0x91, 0x92, 0x9c, 0x1f, 0x9e, 0x93, 0xa2, 0x95, 0xb9, 0x8e, 0x8, + 0x5d, 0x8b, 0x2b, 0x61, 0x60, 0x1e, 0x9c, 0x64, 0xa2, 0x2a, 0x8d, 0xfb, + 0xf, 0x8, 0xe, 0xfb, 0x57, 0x76, 0xf7, 0x38, 0xe1, 0x7e, 0x76, 0xf8, + 0x50, 0xe1, 0xf7, 0x38, 0x77, 0x12, 0xcf, 0xf7, 0x54, 0x4f, 0xef, 0x4f, + 0x9f, 0x77, 0xf7, 0x54, 0x13, 0xd9, 0x0, 0xf7, 0x84, 0x16, 0x13, 0xda, + 0x0, 0x76, 0xa, 0x13, 0xd9, 0x0, 0xb7, 0xac, 0xad, 0xbc, 0x1b, 0x8c, + 0x5d, 0x62, 0x52, 0x63, 0x1a, 0x13, 0xdc, 0x0, 0x6d, 0xa0, 0x72, 0xa8, + 0xa8, 0xa0, 0xa4, 0xa9, 0x1e, 0x13, 0xb9, 0x0, 0xb3, 0x62, 0xc4, 0x8c, + 0xb9, 0x1e, 0x78, 0x1d, 0x5f, 0x6a, 0x69, 0x5a, 0x1b, 0x13, 0xdc, 0x0, + 0x8f, 0xb3, 0x98, 0xa1, 0xa9, 0xa0, 0x8, 0x67, 0xb6, 0x80, 0xc6, 0xc1, + 0x1a, 0xc1, 0x96, 0xc6, 0xaf, 0xb6, 0x1e, 0x13, 0xd9, 0x0, 0x6d, 0xa0, + 0x7e, 0xa1, 0x87, 0xb3, 0x8, 0x13, 0xda, 0x0, 0x78, 0x1d, 0x13, 0xdc, + 0x0, 0x5f, 0x6a, 0x69, 0x5a, 0x1b, 0x8a, 0xb9, 0xb4, 0xc4, 0xb3, 0x1a, + 0x13, 0xd8, 0x80, 0xa9, 0x76, 0xa4, 0x6e, 0x6e, 0x76, 0x72, 0x6d, 0x1e, + 0x13, 0xbc, 0x0, 0x63, 0xb4, 0x52, 0x8a, 0x5d, 0x1e, 0x76, 0xa, 0xb7, + 0xac, 0xad, 0xbc, 0x1b, 0x87, 0x63, 0x7e, 0x75, 0x6d, 0x76, 0x8, 0x13, + 0xd8, 0x80, 0xaf, 0x60, 0x96, 0x50, 0x55, 0x1a, 0x55, 0x80, 0x50, 0x67, + 0x60, 0x1e, 0x13, 0xd9, 0x0, 0xa9, 0x76, 0x98, 0x75, 0x8f, 0x63, 0x8, + 0xe, 0x84, 0xf7, 0x6d, 0x76, 0xf7, 0xa2, 0x77, 0x1, 0xb3, 0xf7, 0xdf, + 0x15, 0x40, 0xc7, 0x4f, 0xd6, 0xd6, 0xc7, 0xc8, 0xd5, 0xd6, 0x4f, 0xc7, + 0x40, 0x3f, 0x50, 0x4f, 0x40, 0x1e, 0xe, 0xf9, 0x17, 0x80, 0xf7, 0x3, + 0x1, 0xf7, 0x3, 0xf7, 0x4, 0xf7, 0x70, 0xf7, 0x5, 0xf7, 0x70, 0xf7, + 0x4, 0x14, 0x70, 0xf7, 0x3, 0xb6, 0x15, 0x65, 0xad, 0x81, 0xa, 0x72, + 0x99, 0xa, 0xf7, 0xe0, 0x16, 0x65, 0xae, 0x81, 0xa, 0x71, 0x99, 0xa, + 0xf7, 0xe1, 0x16, 0x65, 0xae, 0x4d, 0x1d, 0x71, 0x99, 0xa, 0xe, 0xf9, + 0x17, 0x7f, 0xa8, 0x6f, 0x76, 0xf7, 0xcd, 0xa7, 0x90, 0xa8, 0xf7, 0x9b, + 0xa8, 0x9c, 0x77, 0x12, 0xb2, 0xd4, 0xf7, 0x1f, 0xd4, 0xb7, 0xd4, 0xf7, + 0x1f, 0xd4, 0xa9, 0xd3, 0xf7, 0x20, 0xd4, 0x13, 0x77, 0xf0, 0xf7, 0xe, + 0x82, 0x15, 0xaa, 0x74, 0xf8, 0x27, 0xf9, 0x29, 0x6b, 0xa2, 0x5, 0x13, + 0xbb, 0xf0, 0xfc, 0x79, 0xfb, 0x57, 0x15, 0x3e, 0x8d, 0x1d, 0xed, 0x28, + 0x1e, 0x8a, 0x6, 0x28, 0x60, 0x29, 0x3b, 0x1f, 0xd4, 0x8c, 0x15, 0xbe, + 0x95, 0xec, 0xc7, 0x1e, 0x8c, 0x6, 0xc8, 0x92, 0x28, 0x59, 0x5d, 0x84, + 0x25, 0x4e, 0x50, 0x7f, 0xf0, 0xbb, 0x1f, 0xf7, 0x94, 0xfb, 0xb9, 0x15, + 0x3d, 0xb6, 0x28, 0xef, 0xee, 0xb6, 0xee, 0xd9, 0xda, 0x60, 0xee, 0x29, + 0x1e, 0x8a, 0x6, 0x27, 0x60, 0x28, 0x3c, 0x1f, 0xf7, 0xcf, 0x16, 0x3d, + 0x8d, 0x1d, 0xee, 0x28, 0x1e, 0x8a, 0x6, 0x28, 0x60, 0x28, 0x3c, 0x1f, + 0xfb, 0x86, 0x8c, 0x15, 0xbd, 0x94, 0xed, 0xc8, 0x1e, 0x8c, 0x6, 0xc8, + 0x92, 0x27, 0x5a, 0x5d, 0x83, 0x25, 0x4f, 0x4d, 0x82, 0xf0, 0xbb, 0x1f, + 0xf7, 0xce, 0x16, 0xbd, 0x96, 0xed, 0xc6, 0x1e, 0x8c, 0x6, 0xc9, 0x92, + 0x27, 0x5a, 0x5d, 0x83, 0x25, 0x4e, 0x4e, 0x81, 0xef, 0xbc, 0x1f, 0xe, + 0x73, 0x79, 0xa, 0xca, 0xf7, 0x77, 0x42, 0x1d, 0x97, 0x9b, 0xb1, 0xbc, + 0xab, 0xb6, 0x8, 0xa5, 0xae, 0xa0, 0xaa, 0x91, 0x96, 0x1d, 0x73, 0x79, + 0xa, 0xc6, 0xac, 0x15, 0xf7, 0x67, 0xf7, 0x51, 0x5, 0xaa, 0x5e, 0xfb, + 0x2d, 0xf7, 0x37, 0x51, 0x1d, 0x7e, 0x7a, 0x61, 0x55, 0x6a, 0x5e, 0x8, + 0x74, 0x6b, 0x79, 0x71, 0x8f, 0x1d, 0xfb, 0x52, 0x92, 0x7a, 0x1d, 0xfb, + 0x3c, 0xf8, 0x87, 0x3, 0xfb, 0xb, 0x7d, 0x15, 0xf8, 0x56, 0xf9, 0x46, + 0x5, 0x5d, 0x6, 0xfc, 0x59, 0xfd, 0x46, 0x5, 0xe, 0xf8, 0x1, 0x8b, + 0xc3, 0xf7, 0x57, 0xb3, 0xe4, 0xb3, 0xf7, 0x6c, 0xb1, 0x1, 0xf7, 0x26, + 0xf7, 0x4, 0x2f, 0xf7, 0x4, 0xf8, 0x14, 0xa5, 0x3, 0xf7, 0x3a, 0xf7, + 0x8f, 0x15, 0xfb, 0x2a, 0x9a, 0xf7, 0x1e, 0x26, 0xf7, 0x15, 0x1b, 0xf7, + 0xb, 0xdc, 0xc9, 0xd9, 0xc5, 0x1f, 0x77, 0x95, 0x5, 0x5f, 0x56, 0x59, + 0x59, 0x51, 0x1b, 0xfb, 0x6, 0xfb, 0x18, 0xc8, 0xf7, 0x1a, 0x8a, 0x1f, + 0xf7, 0xc3, 0x6, 0x99, 0xb3, 0x5, 0xfb, 0xd2, 0x6, 0x89, 0xab, 0x89, + 0xa5, 0x8f, 0xaa, 0x8, 0xf7, 0xe4, 0x6, 0x9a, 0xb3, 0x5, 0xfb, 0xee, + 0x6, 0xf7, 0x16, 0xf1, 0xe0, 0xf5, 0x8c, 0x1e, 0xf7, 0x11, 0xba, 0x51, + 0x2c, 0x1f, 0xa5, 0xf7, 0x26, 0x6, 0xa4, 0x49, 0x64, 0x9f, 0x23, 0x1b, + 0xfb, 0x18, 0xfb, 0x7, 0x68, 0xfb, 0x6f, 0x4d, 0x1f, 0xfb, 0xc, 0x6, + 0x7c, 0x63, 0x5, 0xf7, 0x16, 0x6, 0x88, 0x6d, 0x8a, 0x6e, 0x8d, 0x6d, + 0x8, 0xfb, 0x5, 0x6, 0x7c, 0x63, 0x5, 0xe, 0xf9, 0x3, 0xf7, 0x96, + 0x9f, 0x8a, 0x76, 0xf8, 0x16, 0x9f, 0x12, 0xf7, 0x3b, 0xd2, 0xf7, 0x8e, + 0xa5, 0xf7, 0xd0, 0xd2, 0x13, 0xbc, 0xf7, 0x9, 0xf7, 0x96, 0x15, 0xf7, + 0x3f, 0x9f, 0x6, 0x57, 0x91, 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0xc0, 0xbd, + 0x7, 0xb4, 0x9c, 0x6c, 0x66, 0x94, 0x1f, 0x9f, 0xe3, 0xfb, 0xed, 0x33, + 0x9f, 0x6, 0xb0, 0x94, 0x9c, 0xaa, 0xb5, 0x1b, 0xbc, 0xfb, 0xc0, 0x6, + 0x5b, 0x8d, 0x81, 0x57, 0x85, 0x1e, 0xf7, 0xd3, 0x77, 0x15, 0xf7, 0x17, + 0x9f, 0x6, 0x5e, 0x8f, 0x83, 0xa6, 0xb7, 0x1a, 0xf7, 0x65, 0x8d, 0x7, + 0x13, 0x7c, 0xf7, 0x29, 0xfb, 0xc6, 0x5, 0x96, 0x6, 0xf7, 0x2c, 0xf7, + 0xc8, 0x5, 0x8d, 0xfb, 0x72, 0x6, 0x13, 0xbc, 0x5b, 0x8e, 0x81, 0x57, + 0x85, 0x1e, 0x77, 0xf7, 0x3e, 0x9f, 0x7, 0x57, 0x91, 0x8d, 0x95, 0xbb, + 0x1a, 0xf7, 0x89, 0x7, 0xae, 0x97, 0x9d, 0xb7, 0x8d, 0x1e, 0x9f, 0x24, + 0x7, 0xfb, 0x34, 0xfb, 0xc9, 0xfb, 0x2e, 0xf7, 0xc9, 0x5, 0xfb, 0xd, + 0x77, 0x6, 0xa8, 0xa7, 0x77, 0x6d, 0x97, 0x1f, 0xfb, 0x83, 0x7, 0x5f, + 0x83, 0x70, 0x5f, 0x84, 0x1d, 0xf7, 0x63, 0xf7, 0x70, 0xcd, 0x12, 0x13, + 0x80, 0xa9, 0xf7, 0x70, 0x15, 0xf8, 0x8c, 0xba, 0xfc, 0x8c, 0x6, 0xe, + 0x99, 0x1d, 0xf8, 0x36, 0xab, 0xf7, 0x64, 0xa4, 0x1, 0xee, 0xdf, 0xf7, + 0x4f, 0xdf, 0x3, 0xaa, 0x16, 0xf7, 0x71, 0x9a, 0x6, 0x48, 0x8e, 0x89, + 0xb3, 0xb3, 0x1a, 0xf7, 0xd4, 0x7, 0xa0, 0xf7, 0x9, 0x89, 0x8a, 0x98, + 0x1f, 0xac, 0x86, 0x8e, 0x80, 0x65, 0x1a, 0xfb, 0x92, 0x7, 0x4f, 0x89, + 0x6f, 0x48, 0x87, 0x1e, 0x7c, 0xf7, 0x70, 0x9a, 0x7, 0x58, 0x8f, 0x7b, + 0x9f, 0xcf, 0x1a, 0xf7, 0x90, 0x7, 0xa4, 0x8c, 0xb4, 0x8c, 0xab, 0x1e, + 0x87, 0x8e, 0x5, 0x85, 0x6a, 0x60, 0x87, 0x66, 0x1b, 0xfb, 0x31, 0x6, + 0x8a, 0xce, 0x8b, 0xba, 0x97, 0xa9, 0x8, 0xa8, 0x97, 0xad, 0xae, 0xba, + 0x1b, 0xac, 0x9d, 0x7a, 0x78, 0x99, 0x1f, 0x74, 0x9c, 0x97, 0x72, 0xa8, + 0x1b, 0x9e, 0x9b, 0x9c, 0x9f, 0xbf, 0x4e, 0x9f, 0x4a, 0xfb, 0x20, 0x42, + 0x36, 0xfb, 0x28, 0x86, 0x1f, 0x46, 0x6b, 0xcf, 0xfb, 0xd5, 0x6, 0x51, + 0x78, 0x74, 0x5a, 0x8a, 0x1e, 0xe, 0x99, 0x1d, 0xf8, 0x36, 0xab, 0xf7, + 0x62, 0xa6, 0x1, 0xf0, 0xdf, 0xf7, 0x50, 0xdf, 0x3, 0xab, 0x16, 0xf7, + 0x74, 0x9a, 0x6, 0x61, 0x8f, 0x6e, 0x9a, 0xc2, 0x1a, 0xf7, 0xdd, 0xf7, + 0x50, 0xfb, 0xd8, 0x7, 0x4d, 0x6a, 0x7d, 0x69, 0x88, 0x1e, 0x7c, 0xf7, + 0x6b, 0x9a, 0x7, 0x51, 0x8e, 0x85, 0xa6, 0xb9, 0x1a, 0xf8, 0xe2, 0x7, + 0x86, 0x8d, 0x5, 0x8a, 0x7f, 0x5d, 0x73, 0x7d, 0x1b, 0x7c, 0x7e, 0x94, + 0x92, 0x76, 0x1f, 0x90, 0x7c, 0x78, 0x8f, 0x71, 0x1b, 0x61, 0xfb, 0x11, + 0x78, 0xfb, 0x6a, 0x8a, 0x1f, 0x44, 0x6b, 0xd0, 0xfb, 0xdd, 0x6, 0x69, + 0x78, 0x67, 0x59, 0x87, 0x1e, 0xf7, 0x2d, 0xf8, 0x47, 0x15, 0xe5, 0x89, + 0x89, 0xf7, 0x8, 0xd1, 0x1b, 0xa9, 0x96, 0x78, 0x79, 0x97, 0x1f, 0x79, + 0x97, 0x97, 0x7a, 0xa9, 0x1b, 0x94, 0x8e, 0x8f, 0x8e, 0x8e, 0x1f, 0xfb, + 0x21, 0x7, 0xe, 0x7d, 0x99, 0xf8, 0x56, 0x95, 0xf7, 0x5e, 0x99, 0x6, + 0xfb, 0x6e, 0x8c, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xa7, + 0xa, 0xdf, 0xb, 0xa7, 0x93, 0x8d, 0x8e, 0xc, 0xc, 0xdf, 0x91, 0x97, + 0xc, 0xd, 0xf8, 0x88, 0x14, 0xf7, 0xf9, 0x15, 0xb6, 0x13, 0x0, 0x7b, + 0x2, 0x0, 0x1, 0x0, 0x36, 0x0, 0x3f, 0x0, 0x4f, 0x0, 0x69, 0x0, + 0x6c, 0x0, 0x75, 0x0, 0x8f, 0x0, 0x96, 0x0, 0x9b, 0x0, 0xa6, 0x0, + 0xb1, 0x0, 0xcc, 0x0, 0xd3, 0x0, 0xdc, 0x0, 0xee, 0x0, 0xff, 0x1, + 0x7, 0x1, 0x1b, 0x1, 0x30, 0x1, 0x37, 0x1, 0x43, 0x1, 0x65, 0x1, + 0x6e, 0x1, 0x79, 0x1, 0x7e, 0x1, 0x89, 0x1, 0xbd, 0x1, 0xda, 0x1, + 0xe0, 0x1, 0xe7, 0x2, 0x1c, 0x2, 0x29, 0x2, 0x34, 0x2, 0x3c, 0x2, + 0x52, 0x2, 0x5f, 0x2, 0x78, 0x2, 0x91, 0x2, 0xbb, 0x2, 0xcc, 0x2, + 0xd2, 0x2, 0xe0, 0x2, 0xf6, 0x2, 0xfe, 0x3, 0xc, 0x3, 0x14, 0x3, + 0x1e, 0x3, 0x28, 0x3, 0x34, 0x3, 0x47, 0x3, 0x52, 0x3, 0x74, 0x3, + 0x7b, 0x3, 0x9b, 0x3, 0xba, 0x3, 0xbe, 0x3, 0xcc, 0x3, 0xd7, 0x3, + 0xf1, 0x3, 0xf9, 0x3, 0xff, 0x4, 0x14, 0x4, 0x1b, 0x4, 0x28, 0x4, + 0x2f, 0x4, 0x36, 0x4, 0x3e, 0x4, 0x53, 0x4, 0x5f, 0x4, 0x65, 0x4, + 0x78, 0x4, 0x85, 0x4, 0x90, 0x4, 0xa2, 0x4, 0xb4, 0x4, 0xbd, 0x4, + 0xcf, 0x4, 0xe1, 0x4, 0xe9, 0x4, 0xef, 0x4, 0xf5, 0x4, 0xfb, 0x5, + 0x4, 0x5, 0x15, 0x5, 0x1c, 0x5, 0x26, 0x5, 0x35, 0x5, 0x44, 0x5, + 0x4d, 0x5, 0x54, 0x5, 0x5a, 0x5, 0x5f, 0x5, 0x68, 0x5, 0x6b, 0x5, + 0x78, 0x5, 0x80, 0x5, 0x85, 0x5, 0x91, 0x5, 0x97, 0x5, 0x9b, 0x5, + 0xa6, 0x5, 0xaa, 0x5, 0xb3, 0x5, 0xba, 0x5, 0xbf, 0x5, 0xc4, 0x5, + 0xce, 0x5, 0xd8, 0x5, 0xdf, 0x5, 0xe9, 0x5, 0xf3, 0x5, 0xf7, 0x6, + 0x0, 0x6, 0x9, 0x6, 0x12, 0x6, 0x1b, 0x6, 0x23, 0x6, 0x2c, 0x6, + 0x32, 0x6, 0x38, 0x6, 0x3d, 0x6, 0x41, 0x6, 0x45, 0x9a, 0x16, 0xf7, + 0x5a, 0x9e, 0x6, 0x76, 0x5c, 0x95, 0xb5, 0x96, 0x8e, 0x99, 0x90, 0x98, + 0x1f, 0xb9, 0xf6, 0x5, 0xf7, 0x9a, 0x6, 0xb4, 0x35, 0x5, 0x91, 0x7d, + 0x98, 0x6a, 0x7b, 0x1a, 0x66, 0x6a, 0x80, 0x66, 0x1e, 0x78, 0xf7, 0x93, + 0x9e, 0x7, 0x5f, 0x8e, 0x7d, 0xa0, 0x6b, 0xd4, 0xfb, 0x8d, 0xf8, 0xc2, + 0x18, 0xb, 0x20, 0xa, 0x77, 0x6, 0xfb, 0x64, 0xfc, 0x7f, 0xb, 0x32, + 0xa, 0xfb, 0x6b, 0x52, 0xa, 0x73, 0x2c, 0x1d, 0xbc, 0xc7, 0xb9, 0xbd, + 0xb2, 0x1e, 0xb, 0x3, 0x31, 0x1d, 0xfb, 0x2f, 0x54, 0x5, 0x7c, 0x7, + 0x8d, 0x98, 0x98, 0x53, 0x1d, 0x50, 0x1f, 0xfb, 0x72, 0x7, 0x3d, 0x7a, + 0x7b, 0x4d, 0x88, 0x1e, 0xb, 0x21, 0x1d, 0xe, 0x15, 0x87, 0xa, 0x8, + 0x22, 0xa, 0x2e, 0x7, 0xb, 0x6f, 0xa, 0x44, 0x80, 0x77, 0x73, 0x32, + 0x1b, 0xfb, 0x24, 0xf7, 0x46, 0x6, 0xc2, 0x97, 0xa2, 0x33, 0x1d, 0x78, + 0x6, 0x60, 0xa, 0xfc, 0x3c, 0x7, 0xb, 0x77, 0x1, 0xea, 0xdf, 0x23, + 0xa, 0xb, 0x26, 0x1d, 0x3d, 0x1d, 0xb, 0x28, 0x1d, 0x13, 0xd6, 0x3e, + 0x1d, 0x13, 0xba, 0x3c, 0x1d, 0xe, 0x8c, 0xfb, 0x57, 0x15, 0x43, 0x90, + 0xb5, 0x80, 0x2f, 0xa, 0xb, 0xf7, 0x3, 0xf7, 0x24, 0xc5, 0xf7, 0x1c, + 0xaa, 0x95, 0x1f, 0x7b, 0x92, 0x5, 0x66, 0x74, 0x60, 0x47, 0x32, 0x1b, + 0x49, 0x3a, 0xaa, 0xf7, 0x45, 0x7f, 0x1f, 0xb, 0x15, 0xf8, 0xb0, 0x6, + 0x23, 0x1d, 0xe, 0x3a, 0x1d, 0x72, 0x88, 0x8b, 0x7b, 0x1b, 0x6c, 0xb, + 0x7b, 0x8a, 0x8, 0xf7, 0x5d, 0xf7, 0x82, 0x15, 0xf7, 0x7, 0xf7, 0xa7, + 0xf7, 0x8, 0xfb, 0xa7, 0x5, 0xb, 0x9d, 0x1b, 0x9b, 0xaa, 0x8c, 0xbc, + 0xb5, 0x1f, 0xa5, 0x7, 0x82, 0x80, 0x7e, 0x81, 0x76, 0x1b, 0xb, 0x6f, + 0xa1, 0x35, 0x1d, 0x75, 0x62, 0x1d, 0xb, 0x15, 0xc9, 0x6, 0xf7, 0x11, + 0xf7, 0x3b, 0x5, 0x69, 0x6, 0xfb, 0xe, 0x24, 0xfb, 0xd, 0xf2, 0x5, + 0x69, 0x6, 0xe, 0x99, 0x7, 0x4f, 0x89, 0x89, 0xa2, 0xaf, 0x1a, 0xf7, + 0xeb, 0xfb, 0x32, 0x7a, 0x7, 0xd1, 0x89, 0x8f, 0x6c, 0x63, 0x1a, 0xb, + 0x8c, 0x8f, 0x8e, 0x8c, 0x38, 0x1d, 0xb, 0x61, 0xa, 0xfb, 0x0, 0x44, + 0x1d, 0xd4, 0xf1, 0xf1, 0xf7, 0x3, 0xb, 0x15, 0xf7, 0x53, 0xa3, 0x6, + 0x65, 0x8d, 0x78, 0x9a, 0xa8, 0x1a, 0xf7, 0xe1, 0x7, 0x7d, 0x8e, 0xfb, + 0xa, 0x54, 0x5, 0x74, 0x7, 0x98, 0xaf, 0x8b, 0x8b, 0x93, 0x1b, 0x92, + 0x8b, 0x7c, 0x7e, 0x1f, 0xb, 0x6f, 0xa0, 0x75, 0x9a, 0x1d, 0xa1, 0x41, + 0x1d, 0xb, 0x9d, 0xac, 0xa9, 0xba, 0x80, 0x43, 0x1e, 0x4e, 0x4f, 0xa, + 0xb, 0xf9, 0x63, 0x25, 0x1d, 0xb, 0x92, 0x92, 0x86, 0x82, 0x78, 0x7b, + 0x5e, 0x49, 0x61, 0x1f, 0xb, 0xf8, 0x4c, 0xfc, 0xb8, 0x5, 0x9c, 0xf8, + 0x98, 0x6, 0xf7, 0x9, 0xab, 0x99, 0xca, 0x92, 0x1e, 0x9e, 0xfb, 0x7f, + 0x78, 0x7, 0xcf, 0x86, 0xa7, 0x79, 0xfb, 0x7, 0x1a, 0xfb, 0xd8, 0x89, + 0x7, 0xfc, 0x13, 0xf8, 0x75, 0x5, 0xfb, 0x3f, 0x78, 0x6, 0xb3, 0x9b, + 0x86, 0x59, 0xb4, 0x1f, 0xfc, 0x43, 0x78, 0xa, 0xb, 0xfb, 0x7, 0xf7, + 0x87, 0x5, 0x88, 0x92, 0x84, 0x9b, 0x98, 0x1a, 0xa6, 0xae, 0x96, 0xa2, + 0x8c, 0x1e, 0x9a, 0xfb, 0x62, 0x7d, 0x7, 0x98, 0x89, 0xa5, 0x7c, 0x97, + 0x72, 0xb, 0x3f, 0xa, 0x7c, 0x60, 0x63, 0xb, 0xa7, 0xa7, 0x75, 0xa1, + 0x6f, 0x6f, 0xb, 0x15, 0xfb, 0x53, 0xf7, 0x2a, 0xfb, 0x2d, 0xf7, 0x56, + 0xf7, 0x53, 0xf7, 0x29, 0xf7, 0x2d, 0xf7, 0x53, 0xf7, 0x53, 0xfb, 0x29, + 0xf7, 0x2f, 0xfb, 0x53, 0xfb, 0x56, 0xfb, 0x2a, 0xfb, 0x2f, 0xfb, 0x53, + 0x1e, 0xc2, 0x16, 0xf7, 0x35, 0xf7, 0x12, 0xf7, 0x23, 0xf7, 0x37, 0xf7, + 0x34, 0xf7, 0x11, 0xfb, 0x22, 0xfb, 0x36, 0xb, 0xa9, 0x95, 0xdd, 0xcd, + 0xd2, 0x1a, 0xde, 0x51, 0x98, 0x74, 0x72, 0x6a, 0xb, 0x6e, 0x8b, 0xa8, + 0xa8, 0x1f, 0xf7, 0x57, 0x7, 0xc7, 0x8b, 0xb, 0x45, 0xa, 0x9a, 0xb4, + 0x9f, 0x4a, 0xa, 0xb, 0x77, 0x1, 0xf7, 0x7, 0xf1, 0x3, 0x9d, 0x16, + 0xf7, 0xbd, 0x9e, 0x6, 0x59, 0xa, 0x9e, 0xfb, 0xbd, 0x78, 0x7, 0x49, + 0xa, 0xb, 0x6f, 0xa0, 0x76, 0xa7, 0xa7, 0xa1, 0xa0, 0xa7, 0xa7, 0x75, + 0x55, 0x1d, 0xb, 0xa0, 0x6, 0x95, 0xc2, 0xa1, 0xf7, 0x3, 0xa7, 0x1a, + 0xa6, 0x74, 0xa3, 0x78, 0x77, 0x74, 0x73, 0x70, 0x6f, 0xa1, 0xfb, 0x3, + 0x95, 0x54, 0x1e, 0xb, 0x7e, 0x6c, 0x9d, 0x70, 0x1b, 0x5d, 0x89, 0x65, + 0x85, 0x71, 0xa2, 0x6b, 0xbd, 0xd6, 0xb7, 0xcd, 0xf7, 0x1a, 0xbe, 0x1f, + 0xf7, 0x2e, 0xf8, 0x22, 0xb, 0x7, 0xf7, 0xf, 0x44, 0xa6, 0x5d, 0x50, + 0x65, 0x68, 0x5d, 0x5a, 0x1e, 0xda, 0x7, 0x84, 0x8d, 0x5d, 0x7a, 0x5c, + 0x7c, 0x5e, 0x7e, 0x19, 0x7a, 0x7, 0x8d, 0x8f, 0x96, 0x53, 0x1d, 0x4c, + 0x1f, 0xfb, 0x82, 0x7, 0x50, 0x7a, 0x74, 0x5c, 0x88, 0x1e, 0xb, 0xfb, + 0x42, 0x8b, 0xf7, 0x1f, 0xcb, 0x1e, 0xf7, 0xca, 0x7, 0xd2, 0x97, 0xa2, + 0xda, 0x91, 0x1e, 0xb, 0x15, 0x46, 0x1d, 0x33, 0xa, 0xb, 0xde, 0x87, + 0x99, 0x75, 0x41, 0x89, 0x1d, 0x44, 0x7f, 0x70, 0x36, 0x89, 0x1e, 0xb, + 0x97, 0x98, 0x8d, 0x19, 0x9a, 0xfb, 0x1b, 0x7c, 0x7, 0xab, 0x8c, 0x9b, + 0x77, 0x78, 0x1a, 0x82, 0x7e, 0x6b, 0x81, 0x70, 0x1e, 0xb, 0x36, 0xa, + 0xf7, 0x5b, 0x16, 0x36, 0xa, 0xe, 0x83, 0x1d, 0x96, 0xad, 0xb1, 0x1b, + 0x97, 0x98, 0x86, 0x45, 0x1d, 0x76, 0x99, 0xb, 0x2a, 0xa, 0x40, 0xa, + 0xef, 0xfb, 0x29, 0xb, 0x6, 0xf7, 0x3, 0xa5, 0x7b, 0x32, 0x9a, 0x1f, + 0xa4, 0xb, 0x7, 0xfb, 0x37, 0x4b, 0x34, 0x69, 0x27, 0x1a, 0x48, 0xb, + 0x42, 0x1d, 0x96, 0x9a, 0xac, 0xb6, 0xa9, 0xb3, 0x8, 0xa8, 0xb2, 0xb, + 0x82, 0x9e, 0x5, 0x6d, 0x81, 0x39, 0x49, 0x44, 0x1a, 0x38, 0xc5, 0x7e, + 0xa2, 0xa4, 0xac, 0x9a, 0xb6, 0xb3, 0xb, 0x7, 0x6a, 0x84, 0x81, 0x82, + 0x83, 0x1e, 0x75, 0x70, 0x6d, 0xb, 0xf8, 0x31, 0xe5, 0x15, 0xf7, 0x48, + 0x31, 0xd1, 0xe5, 0xc2, 0xc4, 0x54, 0xf7, 0x96, 0x5c, 0x6, 0xfb, 0x5f, + 0xfb, 0x9e, 0x5, 0xb8, 0x93, 0x15, 0xf7, 0x19, 0xf7, 0x44, 0x5, 0x8d, + 0xfb, 0x44, 0x6, 0xb, 0x1b, 0x48, 0x6d, 0x4d, 0x5f, 0x7d, 0xa, 0x1b, + 0x31, 0x30, 0x53, 0xfb, 0x6, 0x28, 0xcb, 0x5f, 0xe7, 0x56, 0x1f, 0xf7, + 0x27, 0x35, 0x9b, 0x69, 0x52, 0x1a, 0x55, 0x63, 0x52, 0x3b, 0xfb, 0x1b, + 0x58, 0xf7, 0x16, 0xba, 0x78, 0x1e, 0xb, 0x6, 0xb0, 0xe0, 0x7a, 0x92, + 0x7c, 0x73, 0x7f, 0x89, 0x73, 0x8a, 0x19, 0xfb, 0xd, 0x6, 0xe1, 0xe0, + 0x5, 0xa8, 0xa7, 0xc2, 0xc1, 0xcd, 0x1a, 0xce, 0x52, 0xb4, 0x48, 0x40, + 0x5a, 0xb, 0x7d, 0x97, 0x7d, 0xa, 0xf7, 0x67, 0xf7, 0x51, 0x5, 0xa9, + 0x5d, 0xfb, 0x2c, 0xf7, 0x38, 0x51, 0x1d, 0xb, 0x41, 0x8d, 0x73, 0x60, + 0x1d, 0xa4, 0x9c, 0xd4, 0x8e, 0x1e, 0xb, 0xf7, 0x8a, 0x7, 0xb1, 0x91, + 0xc3, 0xa7, 0xaf, 0x1b, 0xf7, 0xe, 0x90, 0xfb, 0x36, 0x74, 0xfb, 0x42, + 0x31, 0x78, 0x6a, 0x54, 0x5c, 0xb6, 0xa2, 0x1f, 0xe, 0xf8, 0x1, 0x7d, + 0xaf, 0xf8, 0xfe, 0xaf, 0xb, 0x88, 0x1d, 0x13, 0xb8, 0x54, 0x1d, 0x7, + 0x87, 0x8d, 0x56, 0x7a, 0x56, 0x7d, 0x56, 0x6f, 0x1d, 0x97, 0x94, 0x8c, + 0x98, 0x1b, 0xb2, 0x91, 0x7b, 0x5e, 0x1f, 0xb, 0x72, 0x1d, 0xec, 0xf7, + 0x70, 0x1e, 0xb, 0x97, 0x16, 0xf7, 0x7f, 0x9e, 0x6, 0x42, 0x8e, 0x76, + 0xab, 0xf2, 0x1a, 0xb, 0xca, 0x86, 0xa3, 0x7b, 0x3c, 0x1a, 0xb, 0xfb, + 0x38, 0xfb, 0x38, 0xfb, 0x37, 0xb, 0x97, 0x16, 0xf8, 0xb0, 0x6, 0x39, + 0x1d, 0xb, 0x1b, 0x75, 0x7e, 0x78, 0x7a, 0x5b, 0xc8, 0x88, 0x9a, 0xf7, + 0x29, 0xbe, 0xdd, 0xbc, 0xd7, 0x56, 0xa9, 0x6a, 0x97, 0x1f, 0xb, 0x1b, + 0x84, 0x84, 0x90, 0x94, 0x9e, 0x9b, 0xb8, 0xcd, 0xb5, 0x1f, 0xb, 0xad, + 0x94, 0x1f, 0x6e, 0x6, 0xb, 0xa7, 0x5a, 0xa9, 0x1f, 0xfb, 0x0, 0xcb, + 0x5, 0x66, 0xa1, 0x85, 0xa8, 0x9f, 0x1a, 0xa5, 0xa0, 0xb2, 0xc2, 0xb, + 0x15, 0x54, 0xb7, 0x5f, 0xc2, 0x79, 0x1d, 0x54, 0x5f, 0x5e, 0x54, 0x1e, + 0xb, 0xf7, 0x6a, 0x16, 0xf7, 0xc6, 0x9e, 0x6, 0x31, 0x8c, 0x7e, 0xb, + 0xfb, 0x34, 0xfb, 0x13, 0xfb, 0x22, 0xfb, 0x32, 0xfb, 0x36, 0xfb, 0x13, + 0xf7, 0x22, 0xf7, 0x34, 0x1e, 0xb, 0x1, 0xc0, 0x9d, 0x3, 0xa6, 0x16, + 0xf8, 0xd, 0x6, 0x99, 0xf7, 0x1b, 0x79, 0x8f, 0x5, 0x3d, 0x7b, 0xb, + 0x6f, 0xa0, 0x76, 0x9a, 0x1d, 0xa0, 0x41, 0x1d, 0xb, 0xa3, 0x9e, 0x9e, + 0xa3, 0xa3, 0x78, 0x9e, 0x73, 0x73, 0x78, 0x78, 0x73, 0x73, 0x9e, 0x78, + 0xa3, 0x1f, 0xb, 0x1, 0xef, 0xf1, 0xf7, 0x7b, 0xf7, 0x1, 0x3, 0x9b, + 0x16, 0xf7, 0xac, 0x9e, 0x6, 0x3e, 0x8d, 0x7a, 0xb, 0xf8, 0x1, 0x7d, + 0xb7, 0xf9, 0xc, 0x77, 0xb, 0xa2, 0xf7, 0x7c, 0x74, 0x6, 0xb, 0x15, + 0xfb, 0x69, 0xf7, 0x26, 0xb, 0x81, 0xa7, 0xf8, 0x32, 0xa7, 0xb, 0x77, + 0x1, 0xf7, 0xcf, 0xf1, 0x3, 0x68, 0xa, 0xb, 0x1, 0xdb, 0xdf, 0xf7, + 0x44, 0xdf, 0x3, 0x9b, 0x16, 0xf7, 0x6a, 0x9a, 0x6, 0x57, 0x8e, 0x7d, + 0xb, 0x7b, 0x1d, 0xf8, 0x3e, 0x9a, 0xa, 0xb, 0x5, 0x82, 0x98, 0x83, + 0x9e, 0x96, 0x1a, 0xa7, 0xa4, 0xb, 0x5a, 0x6a, 0xad, 0x5f, 0x1b, 0x70, + 0x78, 0x7a, 0x71, 0x71, 0x9e, 0x7a, 0xa6, 0x1f, 0xb, 0x15, 0xa2, 0x8e, + 0x5, 0xc6, 0x88, 0xb7, 0x6a, 0x58, 0x1a, 0x72, 0x7e, 0x62, 0x4f, 0xb, + 0x7, 0xfb, 0x0, 0x76, 0x72, 0x3f, 0x86, 0x1e, 0xb, 0xc1, 0x76, 0xf8, + 0x13, 0x77, 0x1, 0xb, 0x74, 0x78, 0x4b, 0x87, 0x1e, 0xb, 0xf7, 0x92, + 0x8b, 0xb1, 0xb, 0x6e, 0xa, 0xf7, 0x8c, 0x77, 0x1, 0xf3, 0xf1, 0xb, + 0x83, 0x1f, 0xe, 0x7, 0xb0, 0xb1, 0xaa, 0x9f, 0xa9, 0x1b, 0xc6, 0x9d, + 0x67, 0x4e, 0x1f, 0xb, 0xee, 0xf1, 0xf7, 0x9c, 0xa2, 0xac, 0xa4, 0xb, + 0xfb, 0x10, 0xfb, 0x23, 0xb, 0x7b, 0xa0, 0xa0, 0xaf, 0x9c, 0xb0, 0xaa, + 0x70, 0xa5, 0x6d, 0x6d, 0xb, 0x8b, 0x91, 0x1b, 0xb7, 0x8b, 0xb, 0xa0, + 0x8a, 0x1d, 0xb, 0x12, 0xb0, 0xe3, 0x46, 0xe3, 0xf7, 0x23, 0xdc, 0x13, + 0xda, 0xb, 0x74, 0xa, 0xad, 0xb, 0x65, 0x1a, 0x4f, 0x3e, 0x97, 0x60, + 0x9a, 0x1e, 0xe, 0xba, 0x9c, 0xb1, 0x9a, 0xc1, 0x99, 0xb, 0x9e, 0xfb, + 0xaf, 0x7, 0xb, 0x66, 0xc1, 0xe9, 0x99, 0xb, 0xf7, 0x5d, 0xbc, 0x12, + 0x13, 0x80, 0xf7, 0x5d, 0x4, 0xb, 0xba, 0xf7, 0x66, 0xf7, 0x5, 0xfb, + 0x2, 0xfb, 0x4f, 0xb, 0xf7, 0xb3, 0xf7, 0xa0, 0x70, 0x1d, 0xb, 0x7, + 0x43, 0x8b, 0x6a, 0x37, 0x85, 0x1e, 0xf7, 0x4e, 0xb, 0xfb, 0x5b, 0x15, + 0x80, 0xa0, 0xa7, 0x86, 0xa7, 0x1b, 0xb, 0x3c, 0xa0, 0x76, 0xb, 0x77, + 0x1, 0xd2, 0xdf, 0xf7, 0x46, 0xdf, 0x3, 0xb, 0x73, 0xf8, 0xa4, 0x76, + 0xf7, 0x3b, 0x77, 0x1, 0xb, 0xf7, 0xf, 0xfb, 0x34, 0x76, 0xf9, 0xf1, + 0x77, 0xb, 0xa9, 0xaf, 0xaf, 0xa9, 0x6d, 0x67, 0x67, 0x6d, 0xb, 0x8f, + 0x7b, 0x1b, 0x6c, 0x8a, 0x81, 0x1d, 0xb, 0x7b, 0x69, 0x29, 0x78, 0xe2, + 0xc0, 0x7f, 0x1e, 0xb, 0xfb, 0x6e, 0xdf, 0x37, 0xf1, 0xb, 0xf7, 0x54, + 0xfb, 0x41, 0x77, 0xb, 0x1a, 0xfb, 0x38, 0x7, 0xb, 0x72, 0x6b, 0x1e, + 0xb, 0xf7, 0x6, 0x3, 0xb}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifBold.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifBold.cpp new file mode 100644 index 000000000000..28758630373d --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifBold.cpp @@ -0,0 +1,1626 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitSerifBoldFontData[19395] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x13, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x42, + 0x6f, 0x6c, 0x64, 0x0, 0x1, 0x1, 0x1, 0x26, 0xf8, 0x10, 0x0, 0xf8, + 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8, 0x1e, 0x3, 0xf8, 0x14, 0x4, 0xfb, + 0x3c, 0xfb, 0x8e, 0xfa, 0x7c, 0xfa, 0xd, 0x5, 0x1c, 0x7, 0x67, 0xf, + 0x1c, 0x8, 0xbe, 0x11, 0xaf, 0x1c, 0x44, 0x8e, 0x12, 0x0, 0x4, 0x1, + 0x1, 0x5, 0x2f, 0x43, 0x52, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x65, 0x72, + 0x69, 0x66, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x43, + 0x68, 0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4f, + 0x54, 0x46, 0x0, 0x7b, 0x2, 0x0, 0x1, 0x0, 0xf, 0x0, 0x4f, 0x0, + 0x54, 0x0, 0x62, 0x0, 0x6d, 0x0, 0x78, 0x0, 0x96, 0x0, 0xbb, 0x0, + 0xbe, 0x0, 0xc7, 0x0, 0xd6, 0x0, 0xdc, 0x0, 0xef, 0x0, 0xf8, 0x1, + 0x5, 0x1, 0x12, 0x1, 0x38, 0x1, 0x45, 0x1, 0x53, 0x1, 0x5a, 0x1, + 0x6b, 0x1, 0x73, 0x1, 0x7e, 0x1, 0x87, 0x1, 0x8b, 0x1, 0x9b, 0x1, + 0xa6, 0x1, 0xab, 0x1, 0xb6, 0x1, 0xce, 0x1, 0xe8, 0x1, 0xf3, 0x1, + 0xfa, 0x2, 0x21, 0x2, 0x33, 0x2, 0x38, 0x2, 0x41, 0x2, 0x4b, 0x2, + 0x70, 0x2, 0x94, 0x2, 0xa2, 0x2, 0xad, 0x2, 0xcf, 0x2, 0xd5, 0x2, + 0xe0, 0x2, 0xec, 0x2, 0xf2, 0x3, 0x8, 0x3, 0x10, 0x3, 0x17, 0x3, + 0x20, 0x3, 0x29, 0x3, 0x30, 0x3, 0x37, 0x3, 0x3b, 0x3, 0x48, 0x3, + 0x53, 0x3, 0x61, 0x3, 0x79, 0x3, 0x7f, 0x3, 0x87, 0x3, 0x8f, 0x3, + 0x96, 0x3, 0x9d, 0x3, 0xb2, 0x3, 0xb6, 0x3, 0xc0, 0x3, 0xc6, 0x3, + 0xcf, 0x3, 0xd5, 0x3, 0xdb, 0x3, 0xef, 0x3, 0xfe, 0x4, 0x9, 0x4, + 0x14, 0x4, 0x1b, 0x4, 0x2d, 0x4, 0x35, 0x4, 0x41, 0x4, 0x47, 0x4, + 0x4d, 0x4, 0x5e, 0x4, 0x6f, 0x4, 0x79, 0x4, 0x89, 0x4, 0x98, 0x4, + 0xa5, 0x4, 0xae, 0x4, 0xb3, 0x4, 0xb8, 0x4, 0xc6, 0x4, 0xd4, 0x4, + 0xe1, 0x4, 0xee, 0x4, 0xf1, 0x4, 0xf5, 0x5, 0x1, 0x5, 0xb, 0x5, + 0x11, 0x5, 0x17, 0x5, 0x20, 0x5, 0x2b, 0x5, 0x36, 0x5, 0x41, 0x5, + 0x48, 0x5, 0x4d, 0x5, 0x51, 0x5, 0x54, 0x5, 0x5e, 0x5, 0x68, 0x5, + 0x72, 0x5, 0x7c, 0x5, 0x86, 0x5, 0x90, 0x5, 0x9a, 0x5, 0x9e, 0x5, + 0xa7, 0x5, 0xb0, 0x5, 0xb9, 0x5, 0xc0, 0x5, 0xc6, 0x5, 0xcb, 0x5, + 0xcf, 0x15, 0x3a, 0xa, 0x20, 0xa, 0x7f, 0x6d, 0x88, 0x86, 0x55, 0x83, + 0x19, 0x31, 0x1d, 0x3c, 0xa, 0x71, 0x29, 0x1b, 0x4a, 0x78, 0x97, 0xb7, + 0x1f, 0xf7, 0x86, 0x7, 0xee, 0xb4, 0x6d, 0xfb, 0x11, 0x97, 0x1f, 0xaf, + 0xf7, 0xe6, 0x67, 0x6, 0xfb, 0x10, 0x7c, 0x62, 0x72, 0x2b, 0x1b, 0xf7, + 0x6d, 0x7, 0xb6, 0x9d, 0x9e, 0xc2, 0xf7, 0x1b, 0xc8, 0x72, 0xfb, 0x22, + 0xa2, 0x1e, 0xae, 0xf7, 0x5d, 0xfc, 0xd5, 0x53, 0x1d, 0xfc, 0x81, 0x7, + 0x4d, 0x6c, 0x9b, 0x52, 0x85, 0x1e, 0xb, 0x15, 0xc3, 0x22, 0xa, 0xb, + 0x32, 0x1d, 0x31, 0xa, 0x2d, 0xb6, 0xfb, 0x3, 0xfb, 0x10, 0x51, 0x3a, + 0x1d, 0xb, 0x29, 0xa, 0x80, 0x7f, 0xa, 0x9a, 0x7c, 0xa4, 0x7c, 0x1f, + 0xb, 0x27, 0x1d, 0x69, 0x7, 0xb4, 0x84, 0x93, 0x7f, 0x38, 0xa, 0xb, + 0x3f, 0xc9, 0x6c, 0xbb, 0xa3, 0xd1, 0x90, 0xcc, 0xcc, 0x1e, 0x8a, 0xb7, + 0x15, 0x7b, 0x7d, 0x74, 0x70, 0x69, 0x1b, 0x67, 0x7c, 0xaf, 0xaa, 0xe2, + 0xee, 0xa8, 0xa2, 0x90, 0x1f, 0xb, 0x5e, 0x8c, 0x80, 0x9d, 0xb2, 0x1a, + 0xf7, 0xfc, 0xfb, 0x5d, 0x69, 0x7, 0xad, 0x88, 0xa7, 0x8a, 0x54, 0x1a, + 0xfb, 0xa5, 0x7, 0x78, 0x78, 0x72, 0x72, 0x65, 0x1b, 0x54, 0x8a, 0xb6, + 0xa7, 0x1f, 0xf7, 0xe7, 0xfb, 0x50, 0xb, 0x22, 0x1d, 0xe, 0x4e, 0xa, + 0xed, 0xf7, 0x4, 0x29, 0x2e, 0xa, 0xb, 0x67, 0xa8, 0x74, 0xa, 0xa8, + 0xa8, 0xaf, 0xaf, 0x6e, 0x61, 0xa, 0x6e, 0x61, 0x1d, 0xb, 0x34, 0xa, + 0x1f, 0x39, 0x1d, 0xb, 0x64, 0x8f, 0x83, 0xa1, 0xaa, 0x1a, 0xf8, 0x6, + 0xfb, 0x54, 0x69, 0x7, 0xb1, 0x84, 0x9a, 0x84, 0x5e, 0x1a, 0xb, 0x15, + 0x2e, 0x1d, 0xf7, 0x66, 0x16, 0x2e, 0x1d, 0xe, 0x67, 0xa7, 0x6f, 0xaf, + 0xaf, 0xa8, 0xa7, 0xaf, 0xaf, 0x6e, 0x6f, 0x1d, 0xb, 0xf7, 0xeb, 0xbf, + 0x15, 0x4a, 0x7, 0xc4, 0x9e, 0x99, 0x8c, 0x28, 0xa, 0xb, 0x33, 0xbc, + 0x31, 0xef, 0xef, 0xbc, 0xe5, 0xe3, 0xe3, 0x5a, 0xe5, 0x27, 0x27, 0x5a, + 0x31, 0x33, 0x1e, 0xf7, 0x6, 0x16, 0xd0, 0x8b, 0xe0, 0xae, 0xae, 0x8b, + 0x36, 0x46, 0x46, 0x8b, 0x36, 0x68, 0x68, 0x8b, 0xe0, 0xd0, 0x1e, 0xb, + 0xf7, 0x48, 0xf7, 0x5d, 0x15, 0xe9, 0xf7, 0x87, 0xf0, 0xfb, 0x87, 0x5, + 0xe, 0x15, 0x6f, 0x91, 0x93, 0x61, 0xd1, 0x1b, 0xb8, 0xb0, 0xa3, 0xac, + 0xa7, 0x1f, 0xb, 0xc0, 0xa9, 0xf7, 0x5, 0x3d, 0xa, 0xb, 0x54, 0x8f, + 0x63, 0x8e, 0xcb, 0x1a, 0xf8, 0x64, 0x7, 0xcf, 0xbb, 0x8c, 0xba, 0x8d, + 0x1e, 0xae, 0xb, 0x5c, 0xa, 0xf7, 0x8b, 0x77, 0x27, 0xa, 0xb, 0x94, + 0x1a, 0x13, 0xbc, 0x3b, 0xa, 0x13, 0x8c, 0x24, 0xa, 0xe, 0x2a, 0xa, + 0x85, 0x93, 0x85, 0x92, 0x94, 0x1a, 0xb, 0x16, 0x2a, 0x1d, 0xe, 0x73, + 0x99, 0x5, 0x74, 0x78, 0x68, 0x5f, 0x50, 0x1b, 0x2c, 0x75, 0xf1, 0xe0, + 0x88, 0x1f, 0xb, 0x4e, 0x4c, 0x47, 0xc1, 0x8b, 0x97, 0xbf, 0x9a, 0xb1, + 0x9d, 0xb, 0x3b, 0xa, 0x24, 0xa, 0xb, 0x65, 0x1d, 0xf7, 0x7f, 0x45, + 0xa, 0xfb, 0x25, 0x5f, 0x1d, 0xb, 0x9a, 0x1a, 0xa7, 0x97, 0x91, 0xd0, + 0x1e, 0xae, 0xfb, 0xe3, 0x68, 0x7, 0xbe, 0x88, 0xa3, 0x60, 0x90, 0x82, + 0xf7, 0x4b, 0xfb, 0xd6, 0x18, 0xb, 0xfc, 0x31, 0x15, 0xf7, 0x89, 0xa9, + 0x6, 0x4b, 0x85, 0x9b, 0xb3, 0x1f, 0xf7, 0xdb, 0x46, 0xa, 0xfb, 0x67, + 0x7, 0x65, 0x87, 0x74, 0x40, 0x8c, 0x1e, 0xb, 0x9f, 0xa1, 0x92, 0x70, + 0x53, 0x3a, 0x52, 0x6f, 0x78, 0x1f, 0xb, 0x15, 0x2a, 0x1d, 0xf7, 0x66, + 0x38, 0x1d, 0x15, 0x2e, 0xca, 0x36, 0xf0, 0xf0, 0xca, 0xe0, 0xe8, 0xe8, + 0x4c, 0xe0, 0x26, 0x26, 0x4c, 0x36, 0x2e, 0x1e, 0xf7, 0xe, 0x16, 0xbd, + 0x8b, 0xef, 0xb5, 0xb5, 0x8b, 0x27, 0x59, 0x59, 0x8b, 0x27, 0x61, 0x61, + 0x8b, 0xef, 0xbd, 0x1e, 0xb, 0xfb, 0x14, 0xf7, 0x8c, 0x7b, 0x9a, 0x3d, + 0x1d, 0xfb, 0x1d, 0x7, 0x38, 0x73, 0x89, 0x46, 0x84, 0x1e, 0xb, 0x33, + 0x1d, 0x5d, 0x67, 0xb, 0xfb, 0x22, 0x60, 0xfb, 0x13, 0x63, 0x23, 0x1a, + 0xb, 0x15, 0xb5, 0x6, 0x9d, 0x8c, 0x9b, 0xa8, 0xab, 0x1b, 0xb, 0x1b, + 0xfb, 0x52, 0x71, 0xfb, 0x1c, 0x4e, 0x5d, 0x8b, 0x35, 0xf7, 0x3f, 0x39, + 0x1f, 0xf7, 0x18, 0x4c, 0xba, 0x73, 0x48, 0x1a, 0x7e, 0x82, 0x28, 0xfb, + 0xc, 0xfb, 0x13, 0x5f, 0xf7, 0x5, 0xf0, 0x77, 0x1e, 0x64, 0x6, 0xb, + 0xf7, 0x4c, 0xcb, 0xf7, 0xd, 0xe3, 0xf7, 0x1, 0x3f, 0xc5, 0x69, 0x9c, + 0x1f, 0xfb, 0x7b, 0xf7, 0x7, 0x78, 0xa1, 0xc1, 0x1a, 0xcc, 0xc2, 0xa9, + 0xbf, 0xf7, 0xa, 0xbd, 0xfb, 0x7, 0x45, 0x9d, 0x1e, 0xb1, 0x6, 0xb, + 0x1e, 0xad, 0xfb, 0x8e, 0x69, 0x7, 0xa4, 0x87, 0x90, 0x8b, 0x97, 0x74, + 0x8, 0xb, 0xfb, 0x5f, 0x7d, 0xd3, 0xf7, 0x4f, 0xb0, 0xf7, 0x34, 0xaa, + 0xb, 0xa5, 0x9b, 0xb9, 0x1a, 0xc3, 0x5c, 0xa3, 0x4d, 0x3e, 0x59, 0x56, + 0x65, 0x78, 0x1e, 0x9f, 0x84, 0x5, 0x9a, 0x95, 0xa2, 0xae, 0xb1, 0x1b, + 0xbb, 0xa0, 0x71, 0x68, 0x54, 0x56, 0x7c, 0x6c, 0x82, 0x1f, 0xb, 0x54, + 0xa, 0xf8, 0x5a, 0x77, 0xb, 0x49, 0x1d, 0xf7, 0x84, 0x77, 0x98, 0xa, + 0x17, 0x4d, 0xa, 0xb, 0xad, 0xfb, 0x2b, 0x69, 0x7, 0xa4, 0x8a, 0xa9, + 0x8b, 0x6b, 0x1a, 0xb, 0x8b, 0xae, 0xf8, 0xf2, 0xae, 0xb, 0x96, 0x83, + 0x5, 0xa7, 0x94, 0xb9, 0x87, 0x66, 0x1a, 0x73, 0x1d, 0x1e, 0x7b, 0x66, + 0x5, 0x7b, 0xb4, 0xa1, 0x89, 0x97, 0x1b, 0xb, 0x1b, 0x2f, 0x78, 0x31, + 0x68, 0x84, 0x1f, 0xb, 0xf7, 0x17, 0x78, 0xac, 0x93, 0x1d, 0xb, 0x12, + 0xa4, 0xf7, 0x26, 0xf7, 0xe, 0xf7, 0x1e, 0xb, 0x68, 0x6, 0xb9, 0x88, + 0xb5, 0x93, 0x49, 0x1a, 0xb, 0x7a, 0x85, 0x81, 0x6b, 0x66, 0x1b, 0xb, + 0x51, 0xa, 0xf7, 0x8b, 0x72, 0xa, 0xb, 0x15, 0xc3, 0x6, 0xb, 0x5a, + 0xa, 0xf7, 0x68, 0xf7, 0xe9, 0x79, 0x1d, 0xf7, 0x3f, 0x66, 0x1d, 0xb, + 0x65, 0x1d, 0xf7, 0x84, 0x45, 0xa, 0xfb, 0x2a, 0x5f, 0x1d, 0xb, 0x5d, + 0x90, 0x88, 0xa8, 0xa2, 0x1a, 0xf7, 0x95, 0x7, 0x94, 0xb6, 0xbc, 0xb3, + 0xb, 0x1a, 0xe6, 0x3b, 0xa0, 0x63, 0x2f, 0x65, 0x33, 0x69, 0x7e, 0x1e, + 0xa3, 0x6, 0xbd, 0xa3, 0xae, 0x8f, 0x9a, 0x1b, 0xcd, 0x96, 0x4f, 0x7a, + 0xb, 0xae, 0xfb, 0x70, 0x68, 0x7, 0xb, 0xae, 0xf7, 0x45, 0xf7, 0xf6, + 0xf7, 0x45, 0xb, 0xa4, 0xf7, 0x27, 0xf7, 0x31, 0xf7, 0x27, 0xb, 0xfb, + 0x55, 0xfb, 0x55, 0xfb, 0x35, 0xb, 0xf7, 0x61, 0xf7, 0x61, 0xf7, 0x29, + 0xb, 0xae, 0x1, 0xf4, 0x7f, 0x1d, 0x9e, 0x16, 0xf8, 0xd6, 0x6, 0xb4, + 0xf7, 0x77, 0x5, 0x6e, 0x6, 0xfb, 0x5, 0x5d, 0x53, 0xb, 0x6e, 0x67, + 0x1e, 0xb, 0x63, 0x1d, 0xb2, 0x5c, 0x5b, 0x67, 0x63, 0x5e, 0x1e, 0xe, + 0x15, 0x5c, 0xaf, 0x64, 0x1d, 0xb, 0x66, 0xbb, 0xba, 0xb1, 0xaf, 0xbb, + 0xb9, 0x65, 0xb, 0xfb, 0x3f, 0xfb, 0x3f, 0x85, 0xb, 0xf7, 0x20, 0xf7, + 0x20, 0xb0, 0xb, 0xb9, 0xb4, 0x63, 0xba, 0x1b, 0xa4, 0xa5, 0xa2, 0xa6, + 0xa6, 0x71, 0xa2, 0x72, 0x1f, 0x5c, 0x62, 0x63, 0x5d, 0x1b, 0xb, 0x76, + 0xf7, 0x42, 0xf7, 0x35, 0x12, 0x99, 0x77, 0xa, 0xe1, 0x77, 0xa, 0x13, + 0xe8, 0xb, 0xf7, 0x4d, 0x16, 0xf7, 0xef, 0xae, 0x6, 0x45, 0x92, 0x75, + 0xb, 0xf7, 0x7e, 0x66, 0x7, 0x72, 0x81, 0x82, 0x76, 0x70, 0x1b, 0xb, + 0xf7, 0xf, 0x98, 0x8, 0xa2, 0x7, 0xb, 0x67, 0xa7, 0x6d, 0xaf, 0xaf, + 0xa6, 0xa9, 0xaf, 0xaf, 0x70, 0xa7, 0x67, 0x67, 0x6f, 0x6f, 0x67, 0x1e, + 0xb, 0x67, 0xa6, 0x81, 0x1d, 0x70, 0x61, 0x1d, 0xb, 0x67, 0xa7, 0x74, + 0xa, 0xa6, 0xa8, 0xaf, 0xaf, 0x70, 0x6f, 0x1d, 0xb, 0x61, 0xa, 0x6f, + 0x61, 0x1d, 0xb, 0xfb, 0x17, 0xfb, 0x1f, 0x34, 0xb, 0xa5, 0xf7, 0xe3, + 0x15, 0xfb, 0x5a, 0xf7, 0x2a, 0xfb, 0x30, 0xf7, 0x5a, 0xf7, 0x5a, 0xf7, + 0x29, 0xb, 0x9b, 0x16, 0xf7, 0x77, 0xae, 0x6, 0x41, 0x93, 0x76, 0x8b, + 0xd3, 0x1a, 0xf8, 0x2d, 0x8d, 0x7, 0xb, 0x62, 0x5d, 0x8b, 0x7f, 0x73, + 0x7b, 0x92, 0x92, 0x78, 0xb, 0x15, 0xf7, 0x35, 0x34, 0xe9, 0xe2, 0xb4, + 0xcd, 0x62, 0xf7, 0x98, 0x57, 0x6, 0x4f, 0x43, 0xb, 0x99, 0x16, 0xf7, + 0x87, 0xad, 0x6, 0x5d, 0x90, 0x8a, 0xa8, 0xa2, 0x1a, 0xf7, 0xda, 0xb, + 0xfc, 0x95, 0x15, 0xcd, 0x6, 0xf8, 0x60, 0xf9, 0x48, 0x5, 0x49, 0x6, + 0xe, 0xa9, 0x30, 0xf1, 0x70, 0xb4, 0x1f, 0xa9, 0xb1, 0xb, 0x15, 0xf7, + 0x6, 0x90, 0xb, 0x15, 0xf7, 0x26, 0xb0, 0xb, 0xfb, 0x57, 0xfb, 0xa6, + 0x15, 0x69, 0xf7, 0xa5, 0xaa, 0x7, 0x5c, 0x8d, 0x6c, 0xb, 0x8f, 0x85, + 0x80, 0x79, 0x7e, 0x82, 0x80, 0x1e, 0xfb, 0x5f, 0xfb, 0x38, 0x5, 0xb, + 0xae, 0x78, 0x15, 0xb2, 0x6, 0x9b, 0x8f, 0x90, 0x9d, 0xa0, 0x1b, 0x98, + 0xb, 0xc5, 0xbb, 0xba, 0xc6, 0xc5, 0x5b, 0xbc, 0x51, 0x51, 0x5a, 0x5b, + 0x50, 0xb, 0x2e, 0xa, 0xe, 0xf7, 0x36, 0x3, 0xb, 0xfb, 0x30, 0xfb, + 0x31, 0xfb, 0xc, 0xf7, 0x1e, 0xf7, 0x38, 0x1e, 0xb, 0x74, 0xa, 0xa7, + 0xa8, 0xaf, 0xaf, 0x6f, 0x61, 0xa, 0xb, 0x8b, 0xad, 0xf8, 0x8, 0xce, + 0xb, 0x76, 0xf7, 0x44, 0x77, 0x1, 0xb, 0xf7, 0x1f, 0x13, 0xe0, 0x9b, + 0x16, 0x99, 0xa, 0xb, 0xf7, 0x1f, 0xf7, 0xe, 0xf7, 0x1f, 0xfb, 0xf, + 0xf7, 0x1f, 0xb, 0xf7, 0x8b, 0xf7, 0x41, 0x6c, 0xaa, 0x12, 0xa4, 0xf7, + 0x21, 0xb, 0xfb, 0x5f, 0xa0, 0x76, 0xf7, 0xe8, 0x76, 0xf7, 0x2, 0xab, + 0xb, 0x89, 0xd3, 0xfb, 0x53, 0x69, 0x6, 0xb, 0xf7, 0xeb, 0xbf, 0x15, + 0xb, 0xd6, 0x8b, 0xae, 0xb, 0x85, 0x1e, 0xe, 0xa1, 0x8a, 0x8a, 0xaf, + 0xcb, 0x1b, 0xf7, 0x40, 0xa2, 0xb, 0xfb, 0x91, 0xfb, 0x2e, 0x76, 0xf9, + 0xfd, 0x77, 0x1, 0xb, 0x6, 0x84, 0x6c, 0x6f, 0x49, 0x54, 0x76, 0x69, + 0x80, 0xb, 0x55, 0x8b, 0x5a, 0xc3, 0x93, 0xc7, 0x8b, 0xcb, 0xd3, 0xb, + 0xd4, 0x90, 0x28, 0x37, 0x53, 0x88, 0xfb, 0x1b, 0x39, 0xb, 0xfb, 0xce, + 0xfb, 0x29, 0xb6, 0xf9, 0x79, 0xb6, 0x1, 0xb, 0xfb, 0xce, 0xfb, 0x27, + 0x76, 0xf9, 0xf2, 0x77, 0x1, 0xb, 0xf9, 0x18, 0xac, 0xb, 0x86, 0x84, + 0x9d, 0x1f, 0x81, 0xa5, 0xae, 0x7f, 0xb, 0xfb, 0xac, 0x1f, 0xfb, 0xc5, + 0x68, 0x6, 0xb2, 0xb, 0xfb, 0x2b, 0x1b, 0x48, 0x75, 0x93, 0xbb, 0x1f, + 0xb, 0x7, 0x73, 0x80, 0x67, 0x63, 0x1e, 0xe, 0x76, 0xf7, 0x4d, 0x77, + 0x1, 0xb, 0xf7, 0x8b, 0x77, 0x1, 0xb, 0xf7, 0x16, 0x12, 0xb, 0x1, + 0x0, 0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0, + 0x0, 0x42, 0x20, 0x0, 0x67, 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, + 0x0, 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, 0x0, + 0x0, 0x6a, 0x0, 0x0, 0x97, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, + 0x0, 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0, 0x0, 0xa9, 0x0, + 0x0, 0x7d, 0x0, 0x0, 0x98, 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, + 0x0, 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0, 0x0, 0x78, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x9b, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, + 0x0, 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0, 0x0, 0xad, 0x0, + 0x0, 0xaf, 0x0, 0x0, 0x8a, 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, + 0x0, 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2, 0x0, 0x9a, 0x0, + 0x0, 0xba, 0x0, 0x0, 0xbe, 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, + 0x0, 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0, 0x0, 0xc4, 0x0, + 0x0, 0xc1, 0x2, 0x0, 0xc5, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, + 0x0, 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0, 0x0, 0xca, 0x0, + 0x0, 0xcc, 0x0, 0x0, 0x90, 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, + 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0, + 0x0, 0xd7, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, + 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0xde, 0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, + 0x0, 0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0, 0x0, 0x8e, 0x0, + 0x0, 0x94, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, + 0x0, 0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0, 0x0, 0x88, 0x0, + 0x0, 0x81, 0x1, 0x0, 0x84, 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, + 0x0, 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0, 0x41, 0x0, + 0x0, 0x8, 0x0, 0x0, 0x75, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0, 0x0, 0x79, 0x1, + 0x0, 0x6b, 0x1, 0x0, 0x63, 0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2, 0x0, 0x1, 0x0, + 0x4, 0x0, 0x7, 0x0, 0x4b, 0x0, 0x78, 0x0, 0xec, 0x1, 0x74, 0x1, + 0xa0, 0x2, 0x61, 0x2, 0x8c, 0x2, 0xba, 0x2, 0xea, 0x3, 0xe4, 0x4, + 0x10, 0x4, 0x3e, 0x4, 0x51, 0x4, 0x59, 0x4, 0x74, 0x4, 0xc5, 0x4, + 0xfb, 0x5, 0x4c, 0x5, 0xb5, 0x5, 0xf3, 0x6, 0x51, 0x6, 0xb4, 0x6, + 0xda, 0x7, 0x5c, 0x7, 0xbb, 0x7, 0xe1, 0x8, 0x28, 0x8, 0x45, 0x8, + 0x67, 0x8, 0x83, 0x8, 0xf4, 0x9, 0xad, 0x9, 0xcd, 0xa, 0x4a, 0xa, + 0xa9, 0xa, 0xee, 0xb, 0x4c, 0xb, 0xab, 0xc, 0x23, 0xc, 0x8c, 0xc, + 0x91, 0xc, 0xe4, 0xd, 0x50, 0xd, 0x75, 0xd, 0xe6, 0xe, 0x0, 0xe, + 0x20, 0xe, 0x7d, 0xe, 0xd7, 0xf, 0x50, 0xf, 0x78, 0xf, 0xbb, 0x10, + 0x3, 0x10, 0x46, 0x10, 0xc0, 0x11, 0x3d, 0x11, 0x5f, 0x11, 0x65, 0x11, + 0x86, 0x11, 0xa1, 0x11, 0xc2, 0x11, 0xe3, 0x11, 0xef, 0x11, 0xf7, 0x12, + 0x36, 0x12, 0x9e, 0x12, 0xe2, 0x13, 0x49, 0x13, 0x76, 0x13, 0xcc, 0x14, + 0x91, 0x14, 0xc3, 0x14, 0xed, 0x15, 0x50, 0x15, 0xb9, 0x15, 0xd7, 0x16, + 0x64, 0x16, 0xac, 0x16, 0xeb, 0x17, 0x23, 0x17, 0x85, 0x17, 0xe0, 0x18, + 0x63, 0x18, 0xac, 0x18, 0xbf, 0x18, 0xef, 0x19, 0x6c, 0x19, 0xe6, 0x19, + 0xfa, 0x1a, 0x25, 0x1a, 0x74, 0x1a, 0x8f, 0x1a, 0xde, 0x1b, 0x21, 0x1b, + 0x70, 0x1b, 0xf8, 0x1c, 0xad, 0x1d, 0x20, 0x1d, 0x9f, 0x1d, 0xc1, 0x1e, + 0x93, 0x1e, 0x9e, 0x1f, 0x19, 0x1f, 0x90, 0x1f, 0xc5, 0x1f, 0xe5, 0x20, + 0x79, 0x20, 0x8a, 0x20, 0xc2, 0x20, 0xff, 0x21, 0x30, 0x21, 0x51, 0x21, + 0x6d, 0x21, 0xec, 0x22, 0x28, 0x22, 0x32, 0x22, 0x57, 0x22, 0x80, 0x22, + 0xb8, 0x22, 0xe4, 0x23, 0x18, 0x23, 0x60, 0x23, 0x98, 0x24, 0xb, 0x24, + 0x1d, 0x24, 0x2f, 0x24, 0x41, 0x24, 0x7c, 0x24, 0x9f, 0x24, 0xd9, 0x25, + 0x78, 0x26, 0x6, 0x26, 0x12, 0x26, 0x22, 0x26, 0x36, 0x26, 0x60, 0x26, + 0x68, 0x26, 0x6f, 0x26, 0x7c, 0x26, 0xae, 0x26, 0xfc, 0x27, 0x35, 0x27, + 0x57, 0x27, 0x6a, 0x27, 0x8a, 0x27, 0xe6, 0x28, 0x5, 0x28, 0x35, 0x28, + 0xa9, 0x28, 0xba, 0x28, 0xce, 0x28, 0xe2, 0x29, 0x6, 0x29, 0x3a, 0x29, + 0xdd, 0x2a, 0x81, 0x2a, 0x9c, 0x2a, 0xb8, 0x2a, 0xd8, 0x2b, 0x28, 0x2b, + 0x46, 0x2b, 0x8e, 0x2c, 0x43, 0x2c, 0x9f, 0x2c, 0xb4, 0x2c, 0xca, 0x2c, + 0xea, 0x2d, 0xf, 0x2d, 0x29, 0x2d, 0x48, 0x2d, 0x6d, 0x2d, 0x90, 0x2e, + 0x5, 0x2e, 0x51, 0x2e, 0xa3, 0x2e, 0xb1, 0x2e, 0xbe, 0x2e, 0xe9, 0x2f, + 0x6, 0x2f, 0x38, 0x2f, 0xc3, 0x2f, 0xde, 0x2f, 0xfe, 0x30, 0x15, 0x30, + 0x3b, 0x30, 0x78, 0x30, 0xa9, 0x30, 0xcd, 0x30, 0xd6, 0x31, 0x14, 0x31, + 0x46, 0x31, 0xe0, 0x32, 0x71, 0x32, 0xa1, 0x33, 0x19, 0x33, 0x4f, 0x33, + 0x61, 0x33, 0x93, 0x34, 0x16, 0x34, 0x21, 0x34, 0x39, 0x34, 0x64, 0x34, + 0x85, 0x34, 0xcc, 0x35, 0x0, 0x35, 0x39, 0x35, 0x52, 0x35, 0x60, 0x35, + 0x70, 0x35, 0x95, 0x35, 0xa1, 0x35, 0xb0, 0x35, 0xd9, 0x35, 0xf3, 0x36, + 0xc, 0x36, 0xb0, 0x37, 0x19, 0x37, 0x38, 0x37, 0x5b, 0x37, 0x96, 0x37, + 0xba, 0x37, 0xdf, 0x37, 0xf8, 0x38, 0x86, 0x39, 0x2f, 0x39, 0x3f, 0x39, + 0xa5, 0x3a, 0x0, 0xfc, 0x21, 0xe, 0xfc, 0x21, 0xe, 0xfb, 0xce, 0x7e, + 0xf7, 0x3d, 0xf8, 0xab, 0x77, 0x1, 0xdc, 0xf7, 0x3e, 0x3, 0xdc, 0xd2, + 0x15, 0x5c, 0xb0, 0x64, 0x1d, 0xb2, 0x5c, 0x5b, 0x66, 0x63, 0x5e, 0x1e, + 0xd1, 0xf7, 0x37, 0x15, 0xa8, 0x6, 0x94, 0xe5, 0x96, 0xc7, 0x96, 0xb7, + 0x8, 0x9f, 0xdd, 0x9f, 0xa5, 0xc2, 0x1a, 0xcb, 0x69, 0xaf, 0x58, 0x57, + 0x6a, 0x67, 0x4b, 0x54, 0x9f, 0x70, 0x9f, 0x38, 0x1e, 0x96, 0x5f, 0x95, + 0x4f, 0x94, 0x33, 0x8, 0xe, 0x2f, 0xf8, 0x3d, 0x76, 0xf7, 0xb3, 0x77, + 0x1, 0xde, 0xf7, 0x15, 0xf7, 0x17, 0xf7, 0x15, 0x3, 0xf7, 0x13, 0xf8, + 0x28, 0x15, 0x6e, 0xa, 0x74, 0xa6, 0xfb, 0xc, 0x9c, 0x43, 0x1e, 0xf7, + 0x98, 0x16, 0x6e, 0xa, 0x1e, 0x8a, 0x74, 0xa7, 0xfb, 0xc, 0x9c, 0x43, + 0x8, 0xe, 0xa0, 0x76, 0xf7, 0x66, 0xcc, 0x4a, 0xd4, 0xf7, 0x20, 0xd4, + 0x45, 0xcb, 0xf7, 0x66, 0x77, 0x12, 0x13, 0xb4, 0xb5, 0x16, 0xce, 0x6, + 0xbb, 0xf7, 0x66, 0x5, 0xf7, 0x21, 0x6, 0x5d, 0xfb, 0x66, 0x5, 0xce, + 0x6, 0xb9, 0xf7, 0x66, 0x5, 0xf0, 0x6, 0x13, 0xcc, 0x8c, 0xcc, 0x5, + 0x35, 0x6, 0xad, 0xf7, 0x2b, 0x5, 0xdb, 0x6, 0x8c, 0xcb, 0x5, 0x47, + 0x6, 0xba, 0xf7, 0x66, 0x5, 0x49, 0x6, 0x5b, 0xfb, 0x66, 0x5, 0xfb, + 0x22, 0x6, 0xb9, 0xf7, 0x66, 0x5, 0x49, 0x6, 0x5c, 0xfb, 0x66, 0x5, + 0xfb, 0xa, 0x6, 0x8a, 0x4b, 0x5, 0xf2, 0x6, 0x6b, 0xfb, 0x2b, 0x5, + 0x28, 0x6, 0x8a, 0x4a, 0x5, 0xe1, 0x6, 0xdc, 0xcc, 0x15, 0xab, 0xf7, + 0x2b, 0x5, 0xf7, 0x25, 0x6, 0x69, 0xfb, 0x2b, 0x5, 0xe, 0x3d, 0x76, + 0xf9, 0xe5, 0x77, 0x12, 0xdc, 0xea, 0xbc, 0xc3, 0xe9, 0xf7, 0x2, 0x17, + 0xf7, 0xa1, 0xa9, 0x15, 0xf7, 0x70, 0x7, 0xc5, 0x6a, 0xae, 0x78, 0x51, + 0x1a, 0x2e, 0x49, 0x7f, 0x70, 0x86, 0x1e, 0xfb, 0x73, 0x98, 0x15, 0xd3, + 0x6e, 0xa7, 0x80, 0xcf, 0x88, 0x8, 0x28, 0xc2, 0xee, 0x7, 0x13, 0x78, + 0xf0, 0x9c, 0xf1, 0xaf, 0xf7, 0x26, 0x1a, 0xf7, 0xe, 0x2c, 0xbd, 0xfb, + 0x0, 0xc2, 0x1e, 0xf7, 0x6b, 0x7, 0xeb, 0x7b, 0xa0, 0x22, 0x96, 0x64, + 0x8, 0xaa, 0xf7, 0x21, 0x6, 0x6f, 0x9c, 0x68, 0xa0, 0x2b, 0x99, 0x8, + 0xd7, 0x54, 0x3d, 0x7, 0x37, 0x87, 0x26, 0x54, 0xfb, 0x9, 0x1a, 0xfb, + 0xd, 0xf7, 0x5, 0x50, 0xd2, 0x68, 0x1e, 0xfb, 0x8f, 0x7, 0x54, 0x95, + 0x5e, 0xa8, 0x67, 0xf7, 0x14, 0x6c, 0x8d, 0x18, 0xf7, 0x3b, 0xf7, 0x93, + 0x15, 0x80, 0x8f, 0x3d, 0xa3, 0xd2, 0x1a, 0xc9, 0xbb, 0x9f, 0xb4, 0x94, + 0x1e, 0xe, 0xf7, 0xf5, 0x7d, 0xb9, 0xf7, 0x9a, 0xb9, 0x78, 0xbe, 0xf7, + 0x97, 0xba, 0x99, 0x77, 0x1, 0xf7, 0x10, 0xf7, 0x6, 0xf7, 0x56, 0xac, + 0xd1, 0xf7, 0x9, 0xf7, 0x54, 0xac, 0x3, 0xf8, 0xee, 0xf7, 0x38, 0x41, + 0x1d, 0xfd, 0x22, 0xf7, 0xe2, 0x41, 0x1d, 0xb9, 0x76, 0x1d, 0xf7, 0x4e, + 0x7b, 0xd8, 0x3e, 0xf0, 0xf8, 0xd1, 0xac, 0x12, 0xc9, 0xf7, 0x1f, 0xf7, + 0xe, 0xf7, 0x24, 0x8b, 0xf0, 0xd6, 0xf7, 0x24, 0x13, 0x7c, 0xf8, 0x6f, + 0xd3, 0x15, 0x5c, 0xb1, 0xc6, 0x62, 0xc9, 0x1b, 0xb0, 0xad, 0x9d, 0xb1, + 0xb1, 0x1f, 0x13, 0x7e, 0x9c, 0x9c, 0xa5, 0xc0, 0x8c, 0x8c, 0x77, 0x97, + 0x18, 0x75, 0x7f, 0x77, 0x7b, 0x72, 0x1b, 0x5c, 0x6c, 0xb0, 0xc1, 0x61, + 0x1f, 0xc1, 0xd0, 0x96, 0x96, 0xc2, 0xe4, 0x9c, 0xa6, 0x9a, 0x94, 0xb8, + 0x8f, 0x8, 0xad, 0xfb, 0x66, 0x69, 0x7, 0xbf, 0x85, 0x99, 0x89, 0x66, + 0x1a, 0x5b, 0x5f, 0x5f, 0x6b, 0x64, 0x1e, 0xfb, 0x2b, 0xf7, 0x6a, 0x5, + 0xcc, 0xa1, 0xe2, 0xb6, 0xdd, 0x1a, 0xc1, 0x61, 0xce, 0xfb, 0x12, 0xfb, + 0x34, 0x25, 0xfb, 0x2c, 0xfb, 0x2b, 0xf7, 0xc, 0x1e, 0x49, 0x6b, 0xfb, + 0x16, 0x4c, 0xfb, 0x17, 0x1a, 0xfb, 0xb, 0xea, 0x50, 0xeb, 0xf1, 0xdc, + 0xc5, 0xa9, 0xb2, 0x1e, 0x74, 0xa7, 0x15, 0x13, 0xbc, 0x77, 0x70, 0x6b, + 0x78, 0x6c, 0x1b, 0x2d, 0x48, 0xf7, 0x17, 0xcf, 0xb7, 0xa0, 0xa3, 0xc0, + 0xa9, 0x1f, 0xe3, 0xfb, 0x18, 0xbe, 0x3f, 0xb1, 0x59, 0x8, 0x54, 0xf7, + 0xf4, 0x15, 0x73, 0xa8, 0x59, 0xce, 0xbe, 0x1a, 0xbb, 0xa7, 0x96, 0xa4, + 0xc4, 0xad, 0x41, 0x59, 0x52, 0x60, 0x7b, 0x70, 0x82, 0x1e, 0xe, 0xfc, + 0x5, 0xf8, 0x3d, 0x76, 0xf7, 0xb3, 0x77, 0x1, 0x5c, 0xf7, 0x15, 0x3, + 0xf7, 0xb, 0xf8, 0x28, 0x15, 0xb4, 0x6, 0x9c, 0xd3, 0xa6, 0xf7, 0x4, + 0xa2, 0x1a, 0xb6, 0x72, 0xb0, 0x63, 0x63, 0x73, 0x66, 0x60, 0x74, 0xa6, + 0xfb, 0x4, 0x9c, 0x43, 0x1e, 0xe, 0x92, 0x1d, 0xbf, 0xf7, 0x5, 0x3, + 0xf7, 0xc6, 0xfb, 0x20, 0x15, 0x2a, 0xc6, 0x59, 0xd3, 0xf7, 0xa4, 0x1a, + 0xf7, 0xc5, 0xcb, 0xb6, 0xde, 0xc3, 0x1e, 0xa6, 0x7, 0x54, 0x72, 0xfb, + 0x61, 0xfb, 0x6, 0xfb, 0xb8, 0x1a, 0x39, 0xa7, 0xfb, 0x74, 0xf7, 0x7c, + 0xfb, 0x11, 0x1e, 0xe, 0x92, 0x1d, 0xf7, 0x42, 0xf7, 0x5, 0x3, 0xa6, + 0xfb, 0x21, 0x15, 0x70, 0x7, 0xc2, 0xa4, 0xf7, 0x61, 0xf7, 0x11, 0xf7, + 0xb8, 0x1a, 0xdd, 0x6f, 0xf7, 0x69, 0xfb, 0x7c, 0xf7, 0x11, 0x1e, 0x6f, + 0x7, 0xec, 0x50, 0xbd, 0x4e, 0xfb, 0xa4, 0x1a, 0xfb, 0xc5, 0x4b, 0x55, + 0x38, 0x53, 0x1e, 0xe, 0xf7, 0xa8, 0x76, 0xf4, 0x76, 0xa3, 0x76, 0xf7, + 0xf, 0x76, 0xf7, 0x8b, 0x77, 0x12, 0xf7, 0x5d, 0xee, 0x13, 0xbc, 0xf7, + 0x85, 0xf8, 0x55, 0x15, 0x6f, 0x88, 0x78, 0x86, 0x7d, 0x1e, 0x80, 0x6a, + 0x76, 0x85, 0x64, 0x1a, 0x69, 0xa2, 0x76, 0xa4, 0xa3, 0xa6, 0xa0, 0xaa, + 0x1e, 0x8a, 0xa8, 0x7b, 0x98, 0x7e, 0xb3, 0x86, 0x9a, 0x87, 0x9f, 0x89, + 0xa4, 0x92, 0x90, 0x18, 0xa1, 0x80, 0x94, 0x85, 0x99, 0x7a, 0x93, 0x81, + 0x94, 0x7d, 0x9a, 0x76, 0x8, 0x76, 0x99, 0xa1, 0x7f, 0x9e, 0x1b, 0xa5, + 0xa2, 0x9a, 0xac, 0xc6, 0x56, 0x7f, 0x4e, 0x97, 0x1f, 0x79, 0x8f, 0x78, + 0x90, 0x79, 0x95, 0x8, 0x93, 0x7, 0xa2, 0x9b, 0x9e, 0x91, 0x9b, 0x8e, + 0xa5, 0x8f, 0xa0, 0x85, 0xa2, 0x94, 0x8, 0xa7, 0x95, 0x98, 0xa1, 0xa0, + 0x1a, 0xa4, 0x79, 0xa2, 0x6a, 0x63, 0x86, 0x6d, 0x64, 0x6b, 0x1e, 0x7f, + 0x7d, 0x7a, 0x7b, 0x75, 0x7b, 0x83, 0x8e, 0x18, 0x88, 0xb1, 0x94, 0xa0, + 0x94, 0x9c, 0x8, 0x96, 0xa0, 0x99, 0x99, 0xa8, 0x1a, 0xad, 0x71, 0x9f, + 0x71, 0x73, 0x73, 0x78, 0x6d, 0x6c, 0x9a, 0x7c, 0x97, 0x73, 0x1e, 0x94, + 0x7a, 0x90, 0x75, 0x67, 0x1a, 0x84, 0x88, 0x6f, 0x98, 0x7d, 0x9c, 0x7f, + 0x9b, 0x19, 0xac, 0x73, 0x86, 0xac, 0x58, 0x1b, 0x7e, 0x6c, 0x80, 0x66, + 0x68, 0x9a, 0x81, 0xa5, 0x86, 0x1f, 0x9d, 0x88, 0xa1, 0x8a, 0xa4, 0x87, + 0x9f, 0x87, 0xa0, 0x85, 0xa2, 0x80, 0x8a, 0x84, 0x18, 0x73, 0x79, 0x78, + 0x85, 0x7a, 0x89, 0x8, 0x89, 0x7e, 0x7b, 0x8b, 0x7b, 0x1b, 0x6e, 0x6a, + 0x7a, 0x67, 0x89, 0x1f, 0x13, 0xdc, 0x71, 0x8a, 0xa1, 0x71, 0xa6, 0x1b, + 0xb6, 0x8f, 0xab, 0xb2, 0xac, 0x1f, 0x97, 0x99, 0x9a, 0x9a, 0xa2, 0x9a, + 0x8, 0xe, 0x3e, 0xa0, 0x76, 0xf7, 0x74, 0xc6, 0xf7, 0x73, 0x77, 0x12, + 0xf7, 0x81, 0xe5, 0x3f, 0xcb, 0x13, 0xf0, 0xac, 0xf7, 0x76, 0x15, 0x13, + 0xe8, 0xf7, 0x6e, 0xfb, 0x76, 0xcb, 0xf7, 0x76, 0xf7, 0x72, 0xc6, 0xfb, + 0x72, 0xf7, 0x71, 0x4b, 0xfb, 0x71, 0xfb, 0x6e, 0x6, 0xe, 0xfc, 0x21, + 0xfb, 0x33, 0x83, 0xa, 0xb2, 0x77, 0xa, 0x13, 0xe0, 0xb6, 0xfb, 0x34, + 0x15, 0x97, 0x77, 0x5, 0xc0, 0xa9, 0xf7, 0x7, 0x3d, 0xa, 0x5d, 0x67, + 0x6d, 0x57, 0x4c, 0xb9, 0x7b, 0xa7, 0x1e, 0x13, 0xd0, 0x9f, 0xa1, 0x92, + 0x70, 0x53, 0x37, 0x50, 0x6f, 0x78, 0x1f, 0xe, 0xfb, 0xce, 0xf7, 0x3f, + 0xf7, 0x8, 0x1, 0xb7, 0xf7, 0x3f, 0x15, 0xf7, 0x87, 0xf7, 0x8, 0xfb, + 0x87, 0x6, 0xe, 0xfc, 0x21, 0x7e, 0x93, 0xa, 0xd2, 0x62, 0x1d, 0xfc, + 0x5, 0x8d, 0x76, 0xf9, 0x4b, 0x77, 0xae, 0x77, 0x12, 0x13, 0xc0, 0x84, + 0x78, 0x15, 0xd3, 0x6, 0x13, 0xa0, 0xf7, 0x78, 0xf9, 0x5a, 0x5, 0x3b, + 0x6, 0xe, 0x7e, 0xa7, 0xf9, 0x19, 0xa7, 0x1, 0xa3, 0xf7, 0x32, 0xf7, + 0x1c, 0xf7, 0x32, 0x3, 0xf7, 0x4a, 0xf7, 0x72, 0x15, 0xf7, 0x79, 0x7, + 0xde, 0x8b, 0xf7, 0x12, 0xce, 0xbb, 0xa0, 0x51, 0xfb, 0x2b, 0x1e, 0xfb, + 0x79, 0x7, 0x3c, 0x8f, 0xfb, 0x14, 0x43, 0x57, 0x7b, 0xcb, 0xf7, 0x23, + 0x1e, 0xfb, 0x32, 0xf7, 0x2, 0x15, 0xfb, 0x5d, 0xed, 0xfb, 0x24, 0xf7, + 0x14, 0xf7, 0x20, 0xe1, 0xf7, 0x39, 0xf7, 0x48, 0xf7, 0x84, 0xfb, 0xe, + 0xf7, 0x8, 0x22, 0x26, 0xfb, 0x10, 0x23, 0xfb, 0x90, 0x1e, 0xe, 0x8b, + 0xad, 0xf9, 0x22, 0x77, 0x1, 0xf7, 0x4e, 0xf7, 0x28, 0x3, 0xcc, 0x16, + 0xf8, 0xd, 0xad, 0x6, 0x28, 0x82, 0xa6, 0xce, 0x1f, 0xf8, 0xc4, 0x7a, + 0x7, 0xfb, 0x90, 0xfb, 0x1, 0x5, 0x71, 0x7, 0x98, 0xad, 0xad, 0x97, + 0x99, 0x1b, 0xb2, 0x8b, 0x5f, 0x72, 0x1f, 0xfc, 0xb, 0x7, 0x4d, 0x86, + 0x65, 0xfb, 0x8, 0x1e, 0xe, 0x8b, 0xf7, 0x19, 0xf8, 0x8, 0x76, 0xe5, + 0xf7, 0x6, 0x1, 0xf7, 0xc0, 0xf7, 0x1c, 0x3, 0x9c, 0x16, 0xf8, 0x34, + 0x6, 0xb8, 0xf7, 0x67, 0x5, 0x69, 0x6, 0x47, 0x6f, 0x82, 0x81, 0x21, + 0x1b, 0xfb, 0x21, 0x6, 0xf7, 0xa8, 0xf7, 0x9b, 0x8b, 0xd7, 0xa8, 0x1a, + 0xf7, 0x2c, 0xfb, 0xf, 0xae, 0x4d, 0xfb, 0x21, 0x50, 0xfb, 0x27, 0x52, + 0x77, 0x1e, 0xa7, 0x6, 0xdf, 0xb0, 0xc9, 0x91, 0xa2, 0x1b, 0xf2, 0x9b, + 0x27, 0x6f, 0xfb, 0xa, 0xfb, 0xd, 0xfb, 0x18, 0xfb, 0x36, 0xfb, 0x41, + 0x1f, 0xe, 0x7d, 0xbd, 0x59, 0xf7, 0x28, 0xf8, 0x6d, 0xdc, 0x12, 0xf7, + 0xf6, 0xf7, 0x6, 0x13, 0xb0, 0xf7, 0x2d, 0xf7, 0xf8, 0x15, 0xd7, 0x71, + 0xf7, 0x11, 0x61, 0xfb, 0x19, 0x1a, 0x31, 0x57, 0x6e, 0x5b, 0x6d, 0x74, + 0xa2, 0xa3, 0x72, 0x1e, 0x13, 0x70, 0xa4, 0x71, 0x6e, 0xa5, 0x60, 0x1b, + 0x6b, 0x6d, 0x74, 0x6a, 0x4c, 0xd2, 0x6e, 0xdb, 0xf7, 0x48, 0xf7, 0xd, + 0xf7, 0xe, 0xf7, 0x20, 0xd6, 0x60, 0xd3, 0x3c, 0xa8, 0x1f, 0xb7, 0xa6, + 0xb2, 0xa4, 0xd8, 0x1a, 0xe8, 0x43, 0xb5, 0x2b, 0xfb, 0xa, 0x3e, 0x31, + 0x4c, 0x6e, 0x1e, 0xa0, 0x7f, 0x5, 0xa3, 0x9a, 0xae, 0xc7, 0xd0, 0x1b, + 0xd4, 0xac, 0x5f, 0x50, 0x30, 0x39, 0x72, 0x5b, 0x7c, 0x1f, 0xe, 0xa0, + 0x76, 0xf7, 0x24, 0xf7, 0x3, 0xf7, 0xcf, 0x76, 0xf7, 0x1f, 0x77, 0x1, + 0xf7, 0xa1, 0xf7, 0x23, 0x3, 0x9e, 0xf7, 0x24, 0x15, 0xf7, 0x8c, 0xfb, + 0x24, 0xf7, 0x25, 0xf7, 0x24, 0xca, 0xf7, 0x3, 0x4c, 0xf8, 0x45, 0x31, + 0x6, 0x31, 0xfb, 0xe, 0xfb, 0x10, 0xfb, 0x3b, 0x32, 0xfb, 0x22, 0x8, + 0xb4, 0x89, 0x15, 0xf7, 0x63, 0xf7, 0xba, 0x5, 0x8d, 0xfb, 0xba, 0x6, + 0xe, 0x83, 0xc8, 0x4e, 0xf7, 0x28, 0xf7, 0x53, 0xf7, 0x1d, 0xdc, 0xf7, + 0x13, 0x12, 0xf8, 0x9, 0xd9, 0x13, 0xb8, 0xbe, 0xf7, 0xdf, 0x15, 0xd3, + 0x86, 0xd7, 0x86, 0xce, 0x6d, 0x8, 0xc0, 0x74, 0xc1, 0x59, 0x4e, 0x1a, + 0x39, 0x49, 0x75, 0x69, 0x6c, 0x6d, 0xa0, 0xa0, 0x6d, 0x1e, 0x13, 0x78, + 0xa1, 0x6c, 0x6b, 0xa2, 0x68, 0x1b, 0x60, 0x78, 0x6b, 0x6f, 0x52, 0xcd, + 0x6c, 0xd8, 0xf7, 0x4a, 0xf3, 0xf7, 0x2, 0xf7, 0x17, 0xed, 0x50, 0xca, + 0x5e, 0xa4, 0x1f, 0x48, 0xb1, 0x4d, 0x91, 0x30, 0x90, 0xa1, 0xe6, 0x18, + 0xf7, 0xaa, 0x6, 0xb6, 0xf7, 0x13, 0x5, 0xfb, 0xd6, 0x6, 0xe, 0x7e, + 0xa6, 0xf7, 0xfe, 0xb8, 0xf7, 0x9f, 0x77, 0x1, 0xa7, 0xf7, 0x31, 0xf7, + 0x1e, 0xf7, 0x2c, 0x3, 0xf8, 0x6a, 0xf9, 0x2a, 0x15, 0xa5, 0x7, 0xfb, + 0xc0, 0x6d, 0xfb, 0x22, 0xfb, 0x54, 0xfb, 0x4a, 0x1a, 0xfb, 0x84, 0xf7, + 0x1f, 0x52, 0xe5, 0xf7, 0x48, 0xb1, 0xf7, 0x3e, 0xc1, 0xf7, 0x40, 0xfb, + 0x4, 0xb1, 0x46, 0x5b, 0x79, 0x84, 0x81, 0x73, 0x1e, 0xb7, 0xf7, 0x4c, + 0xf7, 0xe, 0xc1, 0xef, 0x9f, 0x8, 0xfb, 0xa8, 0xfb, 0xbf, 0x15, 0x97, + 0x96, 0x9c, 0x8c, 0x9b, 0x1b, 0xd0, 0x9b, 0x3f, 0xfb, 0x24, 0x3c, 0x8b, + 0x4c, 0x4e, 0x4d, 0x7c, 0xc9, 0xf7, 0x59, 0xac, 0x93, 0xc3, 0x8c, 0x8c, + 0x1f, 0xe, 0xa0, 0x76, 0xf8, 0x6f, 0x76, 0xe0, 0xf7, 0x1d, 0x1, 0xf7, + 0x27, 0x16, 0xea, 0x6, 0xf7, 0x7f, 0xf9, 0x38, 0x5, 0xfc, 0x34, 0x6, + 0x5f, 0xfb, 0x72, 0x5, 0xae, 0x6, 0xe0, 0xa1, 0xbd, 0x8b, 0xa5, 0x1b, + 0xf7, 0x4f, 0x6, 0xe, 0x7e, 0xab, 0xf9, 0x14, 0xa8, 0x12, 0xa7, 0xf7, + 0xd, 0xfb, 0x2, 0xf7, 0x15, 0xf7, 0x39, 0xf7, 0x1f, 0xfb, 0x19, 0xf7, + 0xb, 0x13, 0xd4, 0xf7, 0xbe, 0xf8, 0x3a, 0x15, 0x81, 0x90, 0xfb, 0xc, + 0xc5, 0xe8, 0x1a, 0xb4, 0xb0, 0xb3, 0xbc, 0xd5, 0x96, 0x44, 0x58, 0x4f, + 0x79, 0x73, 0x74, 0x6c, 0x1e, 0xfb, 0xc, 0x29, 0x15, 0x13, 0xe8, 0x48, + 0x76, 0x38, 0x64, 0xfb, 0x1, 0x1a, 0xfb, 0x2, 0xf0, 0x51, 0xf7, 0x0, + 0xf7, 0x23, 0xe7, 0xd9, 0xf7, 0x11, 0xe8, 0x4b, 0xd1, 0x35, 0xbe, 0x1e, + 0x13, 0xd4, 0xc2, 0x9d, 0xdc, 0xa9, 0xe0, 0x1a, 0xc4, 0x57, 0xe9, 0xfb, + 0x2c, 0xfb, 0x34, 0x54, 0x36, 0x2e, 0x38, 0xcb, 0x4e, 0xd6, 0x61, 0x1e, + 0xa1, 0x79, 0x15, 0x13, 0xe8, 0xcf, 0x5e, 0xcc, 0x60, 0x39, 0x1a, 0x71, + 0x84, 0x30, 0x32, 0x4a, 0x74, 0xcd, 0xd3, 0xd4, 0xa0, 0xaa, 0xa9, 0xb8, + 0x1e, 0xe, 0x93, 0x76, 0xf7, 0x9f, 0xb8, 0xf7, 0xfe, 0xa6, 0x1, 0xa5, + 0xf7, 0x2c, 0xf7, 0x1e, 0xf7, 0x31, 0x3, 0xaa, 0x7e, 0x15, 0xf7, 0xc0, + 0xa9, 0xf7, 0x22, 0xf7, 0x54, 0xf7, 0x4a, 0x1a, 0xf7, 0x84, 0xfb, 0x1f, + 0xc4, 0x31, 0xfb, 0x48, 0x65, 0xfb, 0x3e, 0x55, 0xfb, 0x40, 0xf7, 0x4, + 0x65, 0xd0, 0xae, 0xa5, 0x8e, 0x9b, 0xaa, 0x1e, 0x58, 0xfb, 0x51, 0xfb, + 0x9, 0x58, 0x27, 0x77, 0x8, 0xf7, 0xa8, 0xf7, 0xbf, 0x15, 0x83, 0x8a, + 0x70, 0x86, 0x7b, 0x1b, 0x46, 0x7b, 0xd7, 0xf7, 0x24, 0xda, 0x90, 0xca, + 0xc8, 0xc9, 0x95, 0x42, 0xfb, 0x59, 0x74, 0x85, 0x63, 0x88, 0x7b, 0x1f, + 0xe, 0xfb, 0xce, 0x7e, 0xf7, 0x3a, 0xf7, 0x2f, 0xf7, 0x38, 0x1, 0xdd, + 0xf7, 0x3d, 0x3, 0xdd, 0xd2, 0x63, 0x1d, 0xaf, 0x5c, 0x5b, 0x67, 0x66, + 0x5e, 0x1e, 0xf7, 0xd6, 0x4, 0x86, 0xa, 0xac, 0x5c, 0x5b, 0x67, 0x69, + 0x5e, 0x1e, 0xe, 0xfb, 0xce, 0xfb, 0x33, 0x76, 0xf7, 0xe3, 0xf7, 0x2c, + 0x8b, 0xf7, 0x39, 0x12, 0xdd, 0xf7, 0x3d, 0x56, 0xcf, 0x13, 0xe8, 0xe4, + 0xfb, 0x32, 0x15, 0x96, 0x75, 0x5, 0x33, 0x1d, 0x1e, 0x13, 0xf0, 0x5d, + 0x67, 0x6d, 0x57, 0x3c, 0xd2, 0x8b, 0x8e, 0x1f, 0x13, 0xe8, 0xaf, 0x8d, + 0x91, 0x80, 0x80, 0x1a, 0x53, 0x3a, 0x52, 0x6f, 0x78, 0x1e, 0x13, 0xf0, + 0x84, 0xf8, 0xba, 0x15, 0x86, 0xa, 0xad, 0x5c, 0x5b, 0x67, 0x68, 0x5e, + 0x1e, 0xe, 0x95, 0xa, 0xf7, 0x6b, 0x15, 0xf8, 0x90, 0xfb, 0x73, 0x5, + 0xd4, 0x7, 0xfc, 0x38, 0xf7, 0x53, 0xf8, 0x38, 0xf7, 0x4d, 0x5, 0xd4, + 0x7, 0xfc, 0x90, 0xfb, 0x73, 0x5, 0xe, 0x3e, 0xf6, 0xdf, 0xf7, 0xe, + 0xe1, 0x47, 0xcf, 0x12, 0x13, 0xa0, 0xac, 0xf7, 0xdf, 0x15, 0xf8, 0x8c, + 0xcf, 0xfc, 0x8c, 0x6, 0xfb, 0xb8, 0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, + 0xcc, 0xfc, 0x8c, 0x7, 0xe, 0x95, 0xa, 0x83, 0x15, 0xf8, 0x90, 0xf7, + 0x73, 0x5, 0xd7, 0x7, 0xfc, 0x90, 0xf7, 0x73, 0x5, 0x3f, 0x7, 0xf8, + 0x37, 0xfb, 0x4b, 0xfc, 0x37, 0xfb, 0x50, 0x5, 0xe, 0x7e, 0xf7, 0x3d, + 0xf8, 0x85, 0xaf, 0x12, 0xc4, 0xf7, 0x17, 0x69, 0xf7, 0x3d, 0x70, 0xf7, + 0x29, 0x13, 0xe8, 0xf7, 0x73, 0xf7, 0x7b, 0x15, 0xa9, 0x6, 0xe2, 0x9a, + 0x90, 0xde, 0xbe, 0x1e, 0xc0, 0xac, 0xb4, 0xbb, 0xcb, 0x1a, 0xf7, 0x33, + 0xfb, 0x37, 0x96, 0x6c, 0xfb, 0x38, 0x6d, 0x25, 0x62, 0x68, 0x9e, 0x61, + 0xbe, 0x9f, 0xb4, 0x97, 0xbf, 0xa7, 0x7f, 0x97, 0x81, 0x96, 0x1e, 0x83, + 0x93, 0x84, 0x93, 0x98, 0x1a, 0xb0, 0xbd, 0x8e, 0x94, 0xd9, 0x93, 0x2f, + 0x61, 0x51, 0x7b, 0x65, 0x7a, 0x6a, 0x1e, 0x71, 0x59, 0x6d, 0x65, 0x9b, + 0x44, 0x8, 0x13, 0xd0, 0x46, 0xfb, 0x34, 0x15, 0x5c, 0xb0, 0x66, 0xbb, + 0xb9, 0xb1, 0xaf, 0xbb, 0xb9, 0x65, 0xb2, 0x5d, 0x5b, 0x66, 0x63, 0x5e, + 0x1e, 0xe, 0xf7, 0xaf, 0x6d, 0xb9, 0xf7, 0x13, 0xb0, 0x66, 0xbb, 0xf7, + 0xa2, 0xbb, 0xf7, 0x23, 0xb2, 0x12, 0xeb, 0xe7, 0xf7, 0x25, 0xd8, 0xf8, + 0x1, 0xba, 0x13, 0xbf, 0xf8, 0x20, 0xf7, 0xac, 0x15, 0xf7, 0xd, 0xe3, + 0xd1, 0xbc, 0xa9, 0x99, 0x75, 0x60, 0x1e, 0x13, 0xaf, 0xfb, 0x25, 0x7d, + 0x4e, 0x45, 0x5f, 0x1b, 0x69, 0x6f, 0xa8, 0xc7, 0x1f, 0xf7, 0x23, 0x4b, + 0x15, 0x7e, 0x8a, 0xa3, 0x4f, 0xd0, 0x1b, 0xf7, 0xf, 0xcf, 0xf7, 0x1f, + 0xf4, 0xf7, 0x42, 0xfb, 0x28, 0xf7, 0x16, 0xfb, 0x52, 0xfb, 0x5f, 0xfb, + 0x41, 0xfb, 0x29, 0xfb, 0x72, 0xfb, 0x1e, 0xf7, 0xa, 0xfb, 0x5d, 0xf7, + 0xa1, 0xdb, 0xd1, 0xa7, 0xab, 0xcd, 0x1f, 0x7e, 0xae, 0x5, 0x70, 0x50, + 0x55, 0x75, 0x30, 0x1b, 0xfb, 0x41, 0xfb, 0xd, 0xf7, 0x25, 0xf7, 0x28, + 0xf7, 0x78, 0xf7, 0x1a, 0xf3, 0xf7, 0x2a, 0xf7, 0x4c, 0xf6, 0xfb, 0x28, + 0xfb, 0x9, 0x1f, 0x13, 0xdf, 0x33, 0x59, 0xfb, 0xb, 0x3d, 0x60, 0x8f, + 0xbc, 0x9c, 0x8e, 0x1e, 0xcd, 0xf7, 0x98, 0x5, 0x44, 0x6, 0x80, 0x63, + 0x5, 0xa5, 0x7d, 0x80, 0xa6, 0x5b, 0x1b, 0xfb, 0x1e, 0x4a, 0xfb, 0x36, + 0x3e, 0x1f, 0x13, 0x0, 0xfb, 0x4, 0xd1, 0x72, 0xa8, 0x8c, 0x1e, 0xc8, + 0x90, 0xba, 0xbd, 0x96, 0x9c, 0x8, 0xe, 0x4b, 0x1d, 0x12, 0x94, 0xf7, + 0x5f, 0x65, 0x9a, 0x13, 0xf0, 0x94, 0x16, 0x3a, 0xa, 0x13, 0xe8, 0x20, + 0xa, 0x5, 0x13, 0xf0, 0x7f, 0x6d, 0x88, 0x86, 0x55, 0x83, 0x8, 0x13, + 0xe8, 0x31, 0x1d, 0x9f, 0x8b, 0xb5, 0xf7, 0xc1, 0xa9, 0xf7, 0x9b, 0xb3, + 0x12, 0xf3, 0xf7, 0x34, 0xf7, 0x30, 0xf7, 0x39, 0xfb, 0x1e, 0xf7, 0x40, + 0x13, 0xf4, 0xf7, 0x9c, 0xf7, 0xeb, 0x15, 0xa9, 0x6, 0xcc, 0x88, 0xe3, + 0x7c, 0xfb, 0x23, 0x1a, 0x4e, 0x7e, 0x3c, 0xfb, 0x2, 0x61, 0x79, 0x9b, + 0xb8, 0x1e, 0xf7, 0xa2, 0x4, 0xf7, 0x63, 0x7, 0xa2, 0x8c, 0x8c, 0xac, + 0xbe, 0x1b, 0x13, 0xf8, 0xdc, 0xa1, 0x59, 0x45, 0x25, 0x75, 0x62, 0xfb, + 0x1a, 0x1f, 0xfb, 0x8c, 0xfc, 0x9, 0x15, 0xf7, 0xd6, 0x6, 0x13, 0xf4, + 0xf7, 0x67, 0xd1, 0xed, 0xdf, 0xf7, 0x6, 0x22, 0xc1, 0x37, 0x99, 0x1f, + 0x8d, 0x7, 0x13, 0xf8, 0xb5, 0x98, 0xf7, 0x5, 0xa5, 0xf7, 0x3, 0x1a, + 0xf7, 0x30, 0xfb, 0x60, 0x8f, 0x53, 0x1e, 0xfb, 0xc9, 0x53, 0x1d, 0xfc, + 0x71, 0x7, 0x4e, 0x6b, 0x8a, 0x53, 0x8b, 0x1d, 0xd6, 0x78, 0xbb, 0x7d, + 0xa, 0xfb, 0x44, 0xf7, 0x45, 0xf8, 0x2b, 0xae, 0x13, 0xe6, 0xf9, 0x25, + 0xf7, 0x2c, 0x15, 0x2e, 0x38, 0x38, 0x6d, 0x3d, 0x1b, 0x13, 0xea, 0xfb, + 0x28, 0x64, 0xf7, 0x46, 0xf7, 0x11, 0xf7, 0x3d, 0xb4, 0xf7, 0x31, 0xf7, + 0x26, 0xf7, 0x6, 0xd3, 0xfb, 0x9, 0x34, 0xae, 0x1f, 0xae, 0x6, 0x13, + 0xd6, 0x6a, 0x1d, 0x83, 0x80, 0x90, 0x92, 0x7c, 0x1f, 0x13, 0xe6, 0x99, + 0x6c, 0x5c, 0xa2, 0x4e, 0x1b, 0x13, 0xea, 0xfb, 0x66, 0xfb, 0x2e, 0xfb, + 0x30, 0xfb, 0x5f, 0xfb, 0x4f, 0xf7, 0x17, 0xfb, 0x38, 0xf7, 0x7d, 0xf7, + 0x14, 0xd4, 0xca, 0xde, 0xd4, 0x1f, 0xe, 0x8a, 0x1d, 0x68, 0xb8, 0xf8, + 0xdf, 0xb7, 0x12, 0xec, 0xf7, 0x36, 0xf7, 0x95, 0xf7, 0x42, 0x13, 0xb8, + 0x99, 0x16, 0xf7, 0xd0, 0x6, 0xf7, 0x90, 0xf7, 0x0, 0xf7, 0x38, 0xf7, + 0x4c, 0xf7, 0x2e, 0x30, 0xf7, 0x42, 0x95, 0x1d, 0x87, 0xb7, 0x89, 0x4e, + 0x1a, 0xfc, 0x6d, 0x7, 0x66, 0x77, 0x6e, 0x4c, 0x1e, 0xf7, 0x89, 0xcd, + 0x15, 0xf8, 0x6d, 0x7, 0x8c, 0x1d, 0xfb, 0x55, 0x30, 0x1f, 0x13, 0x78, + 0x84, 0xa, 0x1e, 0xe, 0x9f, 0x8b, 0xb4, 0xf7, 0xb4, 0xad, 0xf7, 0xa1, + 0xb7, 0x12, 0xf3, 0xf7, 0x36, 0xf7, 0x36, 0xa5, 0xf7, 0x6, 0xa4, 0x17, + 0x9b, 0x16, 0x3c, 0xa, 0x7b, 0x29, 0x1b, 0x4a, 0x78, 0x97, 0xb7, 0x1f, + 0xf7, 0x7c, 0x7, 0xee, 0xbe, 0x6d, 0xfb, 0x11, 0x97, 0x1f, 0xa5, 0xf7, + 0xe6, 0x71, 0x6, 0xfb, 0x10, 0x7c, 0x58, 0x72, 0x2b, 0x1b, 0xf7, 0x63, + 0x7, 0xb6, 0x9d, 0x9e, 0xc2, 0xf7, 0x1b, 0xd2, 0x7c, 0xfb, 0x22, 0xa2, + 0x1e, 0xa4, 0xf7, 0x5d, 0xfc, 0xd5, 0x6, 0x13, 0x10, 0x68, 0x7, 0xb9, + 0x88, 0xb5, 0x89, 0x49, 0x1a, 0xfc, 0x6d, 0x7, 0x4d, 0x6c, 0x91, 0x52, + 0x8b, 0x1d, 0x67, 0x8b, 0xae, 0xf7, 0xba, 0xad, 0xf7, 0x19, 0x76, 0xc5, + 0x76, 0xf7, 0xc, 0xb7, 0x1, 0xf3, 0xf7, 0x36, 0xf7, 0x2d, 0xa4, 0xf7, + 0x7, 0xa3, 0x3, 0x9b, 0x16, 0xf7, 0xfc, 0xae, 0x6, 0x45, 0x8e, 0x63, + 0x83, 0xcd, 0x1a, 0xf7, 0x7d, 0x7, 0xf7, 0x12, 0x9b, 0x42, 0x39, 0x96, + 0x1f, 0xa4, 0xf7, 0xe6, 0x72, 0x6, 0x3b, 0x7d, 0x7c, 0x46, 0xfb, 0x10, + 0x1b, 0xf7, 0x6d, 0x7, 0xb6, 0x9d, 0x94, 0xc1, 0xf7, 0x40, 0xa6, 0x56, + 0x23, 0xa1, 0x1e, 0xa3, 0xf7, 0x5d, 0xfc, 0xcb, 0x68, 0x6, 0xba, 0x88, + 0xb4, 0x93, 0x49, 0x1a, 0xfc, 0x78, 0x7, 0x4d, 0x6c, 0x92, 0x52, 0x8b, + 0x1d, 0xf7, 0x17, 0x78, 0xac, 0xf7, 0x82, 0xae, 0xf7, 0x50, 0x76, 0xf7, + 0x60, 0xac, 0x88, 0x77, 0x12, 0xb0, 0xf7, 0x45, 0xf7, 0xbf, 0xf7, 0x30, + 0x13, 0xf6, 0xf8, 0x30, 0xf7, 0x90, 0x15, 0xd0, 0x87, 0xab, 0x7d, 0x4b, + 0x1a, 0x38, 0x7, 0x60, 0x7b, 0x6d, 0x33, 0xfb, 0x51, 0x85, 0xf7, 0x8b, + 0xd2, 0xf7, 0x40, 0xb5, 0xf7, 0x2e, 0xf7, 0x25, 0xf7, 0x6, 0xd3, 0xfb, + 0x9, 0x34, 0xae, 0x1e, 0xae, 0x6, 0x13, 0xee, 0x6a, 0x1d, 0x84, 0x81, + 0x8f, 0x90, 0x7f, 0x1f, 0x13, 0xf6, 0x99, 0x6c, 0x5b, 0xa5, 0x4a, 0x1b, + 0xfb, 0x6c, 0xfb, 0x28, 0xfb, 0x36, 0xfb, 0x59, 0xfb, 0x42, 0xf7, 0xe, + 0xfb, 0x45, 0xf7, 0x8e, 0xe2, 0xf7, 0x11, 0xa7, 0xad, 0xbb, 0x1f, 0xf7, + 0x13, 0x7, 0xdd, 0xa3, 0x84, 0xc9, 0x92, 0x1e, 0xae, 0xfb, 0xeb, 0x7, + 0xe, 0xf7, 0x17, 0xa0, 0x76, 0xf7, 0xda, 0xba, 0xf7, 0xa0, 0xae, 0x1, + 0xf5, 0xf7, 0x36, 0xf7, 0x85, 0x7f, 0x1d, 0xa0, 0x16, 0xf7, 0xe5, 0xae, + 0x6, 0x56, 0x91, 0x66, 0x8f, 0xc8, 0x1a, 0xf7, 0x70, 0xf7, 0x85, 0xfb, + 0x70, 0x7, 0x4e, 0x66, 0x87, 0x56, 0x85, 0x1e, 0x68, 0xf7, 0xe8, 0xae, + 0x7, 0x56, 0x92, 0x68, 0x8f, 0xc7, 0x1a, 0xf8, 0x64, 0x7, 0xcc, 0xb8, + 0x8e, 0xb6, 0x8e, 0x1e, 0xae, 0xfb, 0xe8, 0x68, 0x7, 0xb7, 0x88, 0xb9, + 0x89, 0x49, 0x1a, 0xfb, 0x59, 0xfb, 0x85, 0xf7, 0x59, 0x7, 0xcd, 0xb9, + 0x8d, 0xb7, 0x8e, 0x1e, 0xae, 0xfb, 0xe5, 0x68, 0x7, 0xb5, 0x87, 0xb6, + 0x89, 0x4a, 0x7e, 0xa, 0x50, 0x6b, 0x86, 0x56, 0x8b, 0xa, 0x5c, 0xa, + 0x27, 0xa, 0xe, 0x2b, 0xac, 0xb7, 0xac, 0xf9, 0x7, 0xae, 0x1, 0x63, + 0xf7, 0x23, 0xf7, 0x11, 0x7f, 0x1d, 0xf7, 0x13, 0xf9, 0x15, 0x15, 0xc4, + 0x89, 0xb7, 0x7f, 0x47, 0x1a, 0xfc, 0x5e, 0x7, 0x6c, 0x8b, 0x53, 0x4a, + 0x6f, 0x7b, 0x99, 0x9c, 0x9b, 0x94, 0x92, 0x93, 0x95, 0x1e, 0x90, 0x92, + 0x90, 0x94, 0x9b, 0x1a, 0xc2, 0x59, 0x9f, 0x75, 0x6e, 0x61, 0x75, 0x54, + 0x7a, 0x95, 0xfb, 0x2, 0xf7, 0x2a, 0xf2, 0xf7, 0x10, 0x9a, 0xf4, 0x1e, + 0xf8, 0x5e, 0x7, 0xd0, 0xab, 0x94, 0xc4, 0x8f, 0x1e, 0xae, 0xfb, 0xf4, + 0x7, 0xe, 0xf7, 0x17, 0x4e, 0x1d, 0x1, 0xf7, 0x9, 0x7f, 0x1d, 0xa9, + 0x16, 0xf7, 0xe5, 0xae, 0x6, 0x56, 0x92, 0x68, 0x8f, 0xc7, 0x1a, 0xf7, + 0x4e, 0x7, 0xa6, 0xa4, 0xf7, 0x4a, 0xfb, 0x6d, 0xb5, 0x59, 0x84, 0x7b, + 0x31, 0x8c, 0x19, 0x68, 0xf7, 0xe4, 0xae, 0x7, 0x77, 0x8c, 0x7d, 0x8d, + 0x7c, 0x9d, 0xfb, 0xc5, 0xf8, 0x4, 0x18, 0xf7, 0x3c, 0xf7, 0x40, 0xbb, + 0xb2, 0xf4, 0x91, 0x8, 0xae, 0xfb, 0xb5, 0x68, 0x7, 0xf7, 0x0, 0x8a, + 0x86, 0x6a, 0x55, 0x55, 0xfb, 0x6d, 0xfb, 0x64, 0x18, 0xf7, 0x6a, 0x7, + 0xe1, 0xad, 0x83, 0xc2, 0x8f, 0x1e, 0xae, 0xfb, 0xe6, 0x68, 0x7, 0xb9, + 0x88, 0xb4, 0x7e, 0x49, 0x1a, 0xfc, 0x59, 0x7, 0x4e, 0x6b, 0x87, 0x54, + 0x8b, 0x1d, 0x9f, 0x8b, 0xb4, 0xf8, 0xec, 0x60, 0x1d, 0x42, 0x96, 0x1d, + 0xf8, 0x62, 0x7, 0xcf, 0xaa, 0x99, 0xd1, 0x1e, 0xae, 0xfb, 0xf1, 0x68, + 0x7, 0xb8, 0xb4, 0x7b, 0x49, 0x1f, 0xfc, 0x62, 0x7, 0x4e, 0x61, 0x91, + 0x5f, 0x8b, 0xa, 0xf7, 0xbd, 0x8b, 0xae, 0xf8, 0xf3, 0xae, 0x12, 0xb2, + 0xf7, 0x17, 0x4a, 0xb5, 0xf8, 0x8c, 0xf7, 0x2f, 0x13, 0xd8, 0x99, 0x16, + 0xf7, 0x7e, 0xae, 0x6, 0x38, 0x90, 0x79, 0x90, 0xd1, 0x1a, 0xf8, 0x64, + 0x8d, 0x7, 0x13, 0xe8, 0xf7, 0x8e, 0xfc, 0xd7, 0x5, 0xa6, 0x6, 0xf7, + 0x8e, 0xf8, 0xe6, 0x5, 0x8d, 0xfc, 0x78, 0x6, 0x49, 0x6e, 0x88, 0x4f, + 0x85, 0x1e, 0x68, 0xf7, 0xe0, 0xae, 0x7, 0x49, 0x94, 0x75, 0x7d, 0xdb, + 0x1a, 0xf8, 0x4b, 0x7, 0xe1, 0xab, 0x8d, 0xc3, 0x8f, 0x1e, 0xae, 0xfb, + 0x90, 0x7, 0x13, 0xd0, 0xfb, 0x5c, 0xfc, 0x6c, 0xfb, 0x5c, 0xf8, 0x6c, + 0x5, 0xfb, 0x91, 0x68, 0x6, 0xd2, 0x86, 0x9d, 0x7d, 0x57, 0x1a, 0xfc, + 0x5b, 0x7, 0x51, 0x7e, 0x7c, 0x3d, 0x8b, 0xa, 0xd6, 0x8e, 0x76, 0xb2, + 0x76, 0xf8, 0xb5, 0x76, 0xf7, 0x9, 0xae, 0x12, 0xf3, 0xb7, 0xf8, 0x43, + 0xb7, 0x13, 0x7c, 0x72, 0x1d, 0x13, 0xbc, 0x37, 0xa, 0xe, 0x51, 0x1d, + 0x1, 0xae, 0xf7, 0x45, 0xf7, 0xf6, 0x48, 0xa, 0xfb, 0x48, 0x78, 0xa, + 0xfb, 0x7b, 0x3c, 0x1d, 0xf7, 0x21, 0x5e, 0xa, 0xf7, 0x21, 0x5e, 0x1d, + 0xfb, 0x1d, 0xfb, 0x6e, 0x1e, 0xe, 0x67, 0xa0, 0x76, 0xf7, 0xc3, 0xae, + 0xf7, 0xb9, 0xb8, 0x1, 0xef, 0xf7, 0x36, 0xf7, 0x3a, 0xf7, 0x40, 0x3, + 0x9b, 0x16, 0xf7, 0xe2, 0xae, 0x6, 0x46, 0x94, 0x78, 0x83, 0xdc, 0x1a, + 0xf7, 0x4e, 0x7, 0xf7, 0x3a, 0xf7, 0x40, 0xb6, 0xf7, 0x23, 0xf7, 0x3d, + 0xfb, 0x4a, 0x9d, 0x3b, 0x1f, 0xfb, 0xd6, 0x68, 0x6, 0xc0, 0x86, 0xaa, + 0x86, 0x62, 0x1a, 0xfc, 0x6d, 0x7, 0x31, 0x64, 0x93, 0x5e, 0x1e, 0xf7, + 0x8a, 0xf7, 0xc3, 0x15, 0xf7, 0x96, 0x7, 0xa1, 0x8c, 0x98, 0x98, 0xad, + 0x1b, 0xdd, 0xaf, 0x6f, 0xfb, 0x6, 0xfb, 0x10, 0x5e, 0x6e, 0xfb, 0xd, + 0x8d, 0x1f, 0xe, 0xf7, 0x17, 0xfb, 0x44, 0xf7, 0x52, 0x93, 0x1d, 0x5a, + 0xa, 0xf7, 0xa5, 0x89, 0x15, 0xfb, 0x1f, 0xf7, 0x5, 0xf5, 0x68, 0xe1, + 0x1b, 0xcd, 0xc1, 0x9f, 0x9a, 0xb1, 0x1f, 0x85, 0xa3, 0x2d, 0x6d, 0x2f, + 0xa4, 0x55, 0xf7, 0x8, 0x19, 0xf7, 0x2b, 0xb2, 0xf1, 0xf7, 0x12, 0xf7, + 0x42, 0x1a, 0xf7, 0x6e, 0xfb, 0x35, 0xf7, 0x20, 0x5e, 0x1d, 0xfb, 0x13, + 0xfb, 0x7b, 0xfb, 0x14, 0xd8, 0xfb, 0x33, 0xf7, 0x35, 0x5b, 0x1e, 0x4e, + 0xf7, 0xe3, 0x79, 0x1d, 0xf7, 0x47, 0x66, 0x1d, 0xfb, 0x47, 0x78, 0xa, + 0xfb, 0x7c, 0x65, 0x1d, 0xf7, 0x7c, 0xe2, 0x1e, 0xe, 0xd6, 0xa0, 0x76, + 0xf9, 0xc, 0xb7, 0x68, 0xae, 0x12, 0xf7, 0x6, 0xf7, 0x36, 0xf7, 0x4b, + 0xf7, 0x3f, 0x13, 0xd8, 0xf7, 0xa8, 0xf7, 0xed, 0x15, 0xf7, 0x89, 0x7, + 0xaa, 0x90, 0x8d, 0x96, 0xc2, 0x1b, 0xdb, 0xb4, 0x6a, 0x26, 0xfb, 0x16, + 0x57, 0x75, 0xfb, 0x17, 0x8a, 0x1f, 0xfb, 0x8e, 0xfb, 0xed, 0x15, 0xf7, + 0xe6, 0xae, 0x6, 0x49, 0x94, 0x75, 0x8e, 0xdb, 0x1a, 0xf7, 0x4e, 0xa6, + 0x7, 0xf7, 0x63, 0xfb, 0xcd, 0x5, 0xf7, 0x61, 0xae, 0x6, 0x7f, 0x77, + 0x8c, 0x9d, 0x7d, 0x1f, 0xfb, 0x58, 0xf7, 0xa7, 0x5, 0xc1, 0x9c, 0xf2, + 0xa8, 0xf7, 0xf, 0x1a, 0xf7, 0x3c, 0xfb, 0x68, 0x95, 0x45, 0x1e, 0xfb, + 0xd6, 0x6, 0x13, 0xb8, 0x68, 0x7, 0xc4, 0x87, 0xaa, 0x86, 0x60, 0x1a, + 0xfc, 0x62, 0x7, 0x3a, 0x77, 0x88, 0x47, 0x83, 0x1e, 0xe, 0x30, 0x78, + 0xac, 0xf9, 0x1a, 0xaa, 0x8c, 0x8e, 0xa, 0x13, 0xd8, 0x7c, 0x1d, 0x97, + 0x94, 0x1d, 0xc4, 0x1b, 0x47, 0x1d, 0x13, 0xb8, 0x85, 0xa, 0x77, 0x75, + 0x92, 0x93, 0x73, 0x1f, 0x13, 0xd8, 0x94, 0x70, 0x6e, 0x94, 0x6e, 0x46, + 0x1d, 0xe, 0x9f, 0x8b, 0xae, 0xf8, 0x61, 0x76, 0xf7, 0x3d, 0xab, 0x1, + 0xf7, 0x91, 0x7f, 0x1d, 0xf7, 0x30, 0x16, 0xf7, 0xf9, 0xae, 0x6, 0x41, + 0x90, 0x73, 0x8d, 0xe0, 0x1a, 0xf8, 0x99, 0x7, 0xd0, 0x87, 0xf2, 0x86, + 0x9f, 0xfb, 0x34, 0x8, 0xa8, 0x6, 0x89, 0xf7, 0x5d, 0x5, 0xfc, 0xef, + 0xfb, 0x5d, 0xa8, 0x6, 0x9f, 0xf7, 0x34, 0xf2, 0x90, 0xd1, 0x8f, 0x8, + 0xfc, 0x99, 0x7, 0x37, 0x73, 0x89, 0x42, 0x8b, 0x1d, 0x6b, 0xa, 0x63, + 0xa, 0x9b, 0xf9, 0x15, 0x15, 0xc3, 0x85, 0xa5, 0x8c, 0x37, 0x1a, 0xfb, + 0xdb, 0x7, 0xfb, 0x4d, 0xf7, 0x1c, 0x50, 0xf7, 0x1c, 0xf7, 0x26, 0xf6, + 0xe6, 0xf7, 0x2d, 0x1e, 0xf7, 0xdb, 0x7, 0xcd, 0xa2, 0x9a, 0x43, 0xa, + 0x73, 0x4e, 0x1a, 0xfb, 0xdb, 0x7, 0x4b, 0x89, 0xfb, 0x17, 0xfb, 0x44, + 0xfb, 0x24, 0x8b, 0xf7, 0x1e, 0xc4, 0x1e, 0xf7, 0xdb, 0x7, 0xe3, 0xaa, + 0x89, 0xcd, 0x8e, 0x1e, 0xae, 0xfb, 0xe6, 0x7, 0xe, 0xd6, 0x8e, 0x76, + 0xf9, 0x27, 0xae, 0x1, 0xf7, 0xf8, 0x79, 0x15, 0xa6, 0x6, 0xf7, 0x78, + 0xf8, 0xd5, 0xa1, 0xc3, 0x98, 0x9e, 0xc2, 0x92, 0x19, 0xae, 0xfb, 0x69, + 0x68, 0x7, 0xc4, 0x88, 0xa8, 0x87, 0x64, 0x1a, 0xfb, 0x27, 0xfc, 0x18, + 0x5, 0xfb, 0x21, 0xf7, 0xe9, 0x77, 0xab, 0x9e, 0x1a, 0xb1, 0xa2, 0x8b, + 0xca, 0x8f, 0x1e, 0xae, 0xfb, 0xe4, 0x68, 0x7, 0xb6, 0x84, 0x9a, 0x88, + 0xa5, 0x4f, 0x8, 0xe, 0xf7, 0xf5, 0x91, 0x76, 0xf8, 0x7d, 0x76, 0xf7, + 0x50, 0xae, 0x1, 0xf7, 0xc0, 0x7c, 0x15, 0xa7, 0x6, 0xf7, 0x4a, 0xf8, + 0x68, 0x5, 0x92, 0x6, 0xf7, 0x3c, 0xfc, 0x68, 0x5, 0xa6, 0x6, 0xf7, + 0x5c, 0xf8, 0xe4, 0x97, 0xb0, 0xa1, 0xa3, 0xae, 0x8e, 0x19, 0xae, 0xfb, + 0x4a, 0x68, 0x7, 0xad, 0x89, 0xae, 0x8a, 0x62, 0x1a, 0xfb, 0xa, 0xfc, + 0x8, 0x5, 0x89, 0x6, 0xfb, 0x5, 0xf7, 0xf4, 0x83, 0x99, 0x97, 0x1a, + 0xad, 0xa8, 0x8c, 0xb6, 0x8e, 0x1e, 0xae, 0xfb, 0xcc, 0x68, 0x7, 0xbb, + 0x89, 0x96, 0x80, 0x98, 0x75, 0xae, 0x35, 0x18, 0xfb, 0x9, 0xfb, 0xc5, + 0x5, 0x89, 0x6, 0xfb, 0xf, 0xf8, 0x8, 0x88, 0x8c, 0x96, 0x1a, 0xb0, + 0xa7, 0x8d, 0xaf, 0x8e, 0x1e, 0xae, 0xfb, 0xba, 0x68, 0x7, 0xb5, 0x85, + 0x95, 0x81, 0x9c, 0x5b, 0x8, 0xe, 0xd6, 0x4e, 0x1d, 0x1, 0x9b, 0xf9, + 0x3f, 0x3, 0x9b, 0x16, 0xf7, 0x8e, 0xae, 0x6, 0x68, 0x8e, 0x55, 0x8f, + 0xae, 0x1a, 0xf7, 0x20, 0xf7, 0x56, 0x5, 0xf7, 0x3, 0xfb, 0x46, 0x96, + 0x7b, 0x81, 0x1a, 0x70, 0x6f, 0x89, 0x57, 0x88, 0x1e, 0x68, 0xf7, 0xe8, + 0xae, 0x7, 0x6f, 0x8d, 0x7b, 0x8d, 0x56, 0xdd, 0xfb, 0x4a, 0xf7, 0xa5, + 0x18, 0xf7, 0x32, 0xf7, 0x72, 0x9e, 0x9c, 0xe6, 0x93, 0x8, 0xae, 0xfb, + 0x8e, 0x68, 0x7, 0xb7, 0x88, 0xa7, 0x8a, 0x6c, 0x1a, 0x70, 0x8b, 0x95, + 0xfb, 0x6, 0xfb, 0x32, 0x1e, 0xfb, 0x1, 0xf7, 0x3c, 0x88, 0x87, 0x98, + 0x1a, 0xa8, 0x9f, 0x8b, 0xc6, 0x8f, 0x1e, 0xae, 0xfb, 0xee, 0x68, 0x7, + 0xb5, 0x89, 0x9c, 0x72, 0xa0, 0x6c, 0xf7, 0x5a, 0xfb, 0xad, 0x18, 0xfb, + 0x39, 0xfb, 0x67, 0x62, 0x55, 0x5b, 0x8b, 0x72, 0x89, 0x19, 0xe, 0xd6, + 0x4e, 0x1d, 0x1, 0xf7, 0xaa, 0xf7, 0x36, 0xf7, 0x1d, 0xf7, 0xe, 0x3, + 0x69, 0x1d, 0x8d, 0xde, 0x1a, 0xf7, 0x42, 0x66, 0xa, 0xcf, 0x7f, 0x7a, + 0x6e, 0xfb, 0x38, 0xfb, 0xa0, 0x18, 0x42, 0x1d, 0xe, 0x8c, 0xa, 0x1, + 0x39, 0xa, 0xe, 0x91, 0x1d, 0xce, 0xf3, 0x3, 0xce, 0xfb, 0x29, 0x15, + 0xf7, 0x7e, 0xb6, 0x3b, 0x6, 0x5a, 0x8a, 0xa0, 0xab, 0x1f, 0xf8, 0xfe, + 0x7, 0xc6, 0x96, 0x96, 0xc3, 0x1e, 0xca, 0xb6, 0xfb, 0x7e, 0x6, 0xe, + 0xfc, 0x5, 0xfb, 0xa, 0x76, 0xf7, 0x21, 0x76, 0xf9, 0x5a, 0x77, 0x1, + 0xf7, 0x56, 0xfb, 0x1f, 0x15, 0xcf, 0x6, 0xfb, 0x4e, 0xf9, 0xd2, 0x5, + 0x44, 0x6, 0xe, 0x91, 0x1d, 0xf7, 0x36, 0xf3, 0x3, 0xab, 0x21, 0x15, + 0x60, 0xf7, 0x7e, 0xf9, 0xcf, 0xfb, 0x7e, 0x60, 0xca, 0x7, 0xc3, 0x96, + 0x80, 0x50, 0x1f, 0xfc, 0xfe, 0x7, 0x6a, 0x8b, 0x77, 0x59, 0x1e, 0xe, + 0x49, 0xf7, 0xe0, 0x76, 0xf8, 0x1, 0x77, 0x1, 0xd4, 0xf7, 0xcb, 0x15, + 0xe4, 0x6, 0xf7, 0x15, 0xf7, 0xa0, 0xf7, 0x15, 0xfb, 0xa0, 0x5, 0xe4, + 0x6, 0xfb, 0x46, 0xf8, 0x1, 0x5, 0x3b, 0x6, 0xe, 0xfb, 0x11, 0xbd, + 0x1, 0x40, 0x4, 0x59, 0xf8, 0x88, 0xbd, 0x7, 0xe, 0x90, 0xa, 0xf7, + 0x52, 0xf8, 0xa4, 0x26, 0xa, 0x7d, 0xd1, 0x5a, 0x50, 0xa, 0x12, 0xa4, + 0xf7, 0x26, 0xfb, 0x13, 0xf7, 0x19, 0xf7, 0x8, 0xf7, 0x1e, 0x13, 0x66, + 0xf7, 0xba, 0xc3, 0x32, 0x1d, 0x13, 0x26, 0x31, 0xa, 0x23, 0xb6, 0xfb, + 0x3, 0xfb, 0x10, 0x5b, 0x3a, 0x1d, 0x1e, 0xb2, 0x6d, 0x93, 0xa0, 0x1a, + 0x13, 0x5a, 0x9b, 0xac, 0x9f, 0xaf, 0xd5, 0x8f, 0x55, 0x58, 0x1e, 0x53, + 0x7, 0x44, 0x1d, 0x13, 0x8a, 0x26, 0x1d, 0xe, 0x30, 0x7d, 0xab, 0x81, + 0x76, 0xf8, 0x44, 0xc1, 0xf7, 0x5f, 0x77, 0x12, 0xd3, 0xf7, 0x1f, 0xf7, + 0x37, 0xf7, 0x27, 0x13, 0x7c, 0xd3, 0x7e, 0x15, 0x97, 0x6, 0xda, 0xc3, + 0x5, 0x13, 0xbc, 0x5e, 0xb9, 0xb2, 0x7f, 0xaa, 0x1b, 0xf7, 0x39, 0xd8, + 0xf7, 0x5, 0xf7, 0x13, 0xf7, 0x17, 0x46, 0xf7, 0x8, 0xfb, 0xb, 0x46, + 0x67, 0x65, 0x79, 0x7a, 0x1f, 0xf7, 0x97, 0xfb, 0x56, 0x69, 0x7, 0xaf, + 0x84, 0x9e, 0x87, 0x5c, 0x1a, 0x13, 0x7c, 0xf7, 0x1f, 0xfc, 0x7b, 0x15, + 0xf7, 0x9b, 0x7, 0xa1, 0x94, 0x9a, 0xb0, 0xb9, 0x1b, 0xe2, 0x91, 0xfb, + 0x1a, 0x50, 0x1f, 0x13, 0xbc, 0xfb, 0x31, 0x68, 0x58, 0x4f, 0x54, 0x7e, + 0xbe, 0xa7, 0x1e, 0xe, 0xfb, 0x5f, 0x7d, 0xce, 0x86, 0x1d, 0xf7, 0x12, + 0xf7, 0x10, 0x13, 0xb8, 0xf8, 0x30, 0xf7, 0x1, 0x15, 0x70, 0x73, 0x71, + 0x6e, 0x52, 0x1b, 0x3d, 0x4d, 0xb5, 0xf7, 0x20, 0x8c, 0x1f, 0xf5, 0x8c, + 0x91, 0xf0, 0xd9, 0x1b, 0x9a, 0xa5, 0x82, 0x6d, 0x1f, 0x13, 0xd8, 0x8f, + 0x1d, 0x37, 0xb0, 0x44, 0x2d, 0xfb, 0x22, 0x62, 0xfb, 0x59, 0xfb, 0x1f, + 0xe1, 0xfb, 0x2, 0xf7, 0x14, 0xda, 0xcd, 0xb3, 0xcc, 0xb9, 0x1e, 0xe, + 0x30, 0x7d, 0xc3, 0xf8, 0xb, 0xc3, 0xf7, 0x3d, 0xad, 0x12, 0xa4, 0xf7, + 0x28, 0xf7, 0x37, 0xf7, 0x1f, 0x17, 0xf7, 0xe7, 0xbf, 0x15, 0x4a, 0x7, + 0xc9, 0x9c, 0x94, 0x8c, 0xf7, 0x10, 0x9a, 0x8, 0x13, 0xf8, 0xac, 0x7, + 0x52, 0x8d, 0x89, 0xa8, 0xa6, 0x1a, 0xf8, 0xc9, 0xfb, 0x6b, 0x69, 0x7, + 0xc2, 0x87, 0xa0, 0x8a, 0x56, 0x1a, 0xfb, 0x41, 0x7, 0xa5, 0x73, 0x69, + 0xaf, 0x4f, 0x1b, 0x2d, 0x28, 0x42, 0xfb, 0x42, 0xfb, 0x26, 0xe7, 0x2d, + 0xde, 0xd6, 0xa7, 0xa7, 0xb1, 0xaf, 0x1f, 0x13, 0xd8, 0x88, 0xc7, 0x15, + 0x80, 0x66, 0x50, 0x5d, 0x3b, 0x8b, 0xf7, 0x12, 0xc5, 0xec, 0x99, 0xe9, + 0xd2, 0xc3, 0xa1, 0x4e, 0x8a, 0x1e, 0xe, 0x49, 0x1d, 0x98, 0xa, 0x17, + 0xf7, 0x38, 0xf7, 0xae, 0x15, 0x13, 0xe0, 0xf7, 0x1e, 0xa9, 0xa1, 0xb0, + 0xdb, 0x7d, 0xfb, 0x6, 0x5d, 0x8c, 0x1e, 0xfb, 0x15, 0x66, 0x15, 0xf7, + 0x90, 0x6, 0x13, 0xf0, 0xc1, 0x7b, 0xf7, 0x42, 0xfb, 0x42, 0x1e, 0x13, + 0xd0, 0x2b, 0x1d, 0xe, 0xfb, 0xce, 0x8b, 0xad, 0xf8, 0x13, 0xb7, 0xcf, + 0xf7, 0x36, 0x6c, 0xaa, 0x12, 0xd2, 0xf7, 0x1f, 0x13, 0xd8, 0x99, 0x16, + 0xf7, 0xaa, 0xad, 0x6, 0x4a, 0x8d, 0x7a, 0x9a, 0xb6, 0x1a, 0xf7, 0xd7, + 0xe2, 0xb7, 0x34, 0xf7, 0xe, 0x7, 0xa6, 0x86, 0xbd, 0xbb, 0x97, 0xa3, + 0x88, 0x7b, 0x1e, 0x7c, 0x75, 0x7b, 0x70, 0x1a, 0x13, 0xe8, 0x77, 0x9c, + 0x69, 0xb5, 0xb3, 0xa2, 0xa6, 0xae, 0xd0, 0x40, 0xaa, 0x4e, 0xfb, 0x49, + 0x8a, 0xfb, 0x19, 0x2a, 0x1e, 0x52, 0x5f, 0xc4, 0xfb, 0xd7, 0x6, 0x56, + 0x74, 0x88, 0x69, 0x87, 0x1e, 0xe, 0xfb, 0x62, 0xf7, 0x3a, 0xfb, 0x2d, + 0xab, 0xf7, 0x1, 0xf7, 0xb, 0xe2, 0xa7, 0xf7, 0x6c, 0xc0, 0x82, 0xaa, + 0x12, 0xa7, 0xe3, 0x3c, 0xf7, 0x9, 0xfb, 0x9, 0xf7, 0x1d, 0xf7, 0x15, + 0xf7, 0x1b, 0x69, 0xda, 0x13, 0x7a, 0x20, 0xf7, 0xc, 0x63, 0x15, 0x53, + 0x86, 0x67, 0x71, 0x63, 0x1a, 0x13, 0x79, 0x20, 0x53, 0xd5, 0x64, 0xf7, + 0x10, 0xf7, 0x11, 0xf7, 0x18, 0xa6, 0xf7, 0x10, 0xf7, 0x3, 0xfb, 0x7, + 0x95, 0x5a, 0x8c, 0x1e, 0x13, 0x79, 0x40, 0xfb, 0x1f, 0x8d, 0x71, 0x8c, + 0xad, 0x1a, 0xa9, 0xb0, 0x9f, 0x9e, 0xec, 0x8b, 0x8b, 0x94, 0xa8, 0x1e, + 0xd3, 0xa2, 0xac, 0xc9, 0xc8, 0x1a, 0xc7, 0x6d, 0x9e, 0x81, 0x95, 0x1e, + 0x13, 0x7a, 0x20, 0xdd, 0xc0, 0xfb, 0x17, 0x6, 0x13, 0x94, 0xc0, 0x9b, + 0x63, 0x67, 0x91, 0x67, 0x1b, 0xfb, 0x1d, 0x49, 0x37, 0x3b, 0x43, 0xbb, + 0x5a, 0xd5, 0x70, 0x1f, 0x89, 0x7, 0x60, 0x7f, 0x41, 0x64, 0x4c, 0x1a, + 0x57, 0xac, 0x7c, 0xb8, 0x7b, 0x1e, 0x13, 0x7a, 0x20, 0xaa, 0x7d, 0x15, + 0xf7, 0x41, 0x6, 0xbf, 0xa7, 0x7c, 0x67, 0x44, 0xfb, 0x1e, 0x8b, 0x63, + 0x7a, 0x2e, 0x8a, 0xcb, 0xa1, 0x94, 0x9b, 0xa5, 0xa0, 0x1f, 0x13, 0x74, + 0xc0, 0xa2, 0xf7, 0xfd, 0x15, 0xca, 0x90, 0xd1, 0xc8, 0xcd, 0x8b, 0x33, + 0x5e, 0x52, 0x88, 0x45, 0x4c, 0x50, 0x84, 0xc5, 0xd0, 0x1e, 0xe, 0x30, + 0x82, 0x1d, 0xf7, 0x5f, 0x77, 0x1, 0xbb, 0xf7, 0x1f, 0xf7, 0x2c, 0x8a, + 0xa, 0x9b, 0x41, 0xa, 0x8b, 0xb3, 0x9c, 0x1f, 0x76, 0xa, 0x57, 0x60, + 0x75, 0x53, 0x5b, 0x1e, 0xf7, 0xad, 0xfb, 0x54, 0x69, 0x7, 0xb2, 0x83, + 0x99, 0x88, 0x5c, 0x1a, 0xfc, 0x81, 0x7, 0x5a, 0x7a, 0x8a, 0x67, 0x8b, + 0xa, 0x5d, 0xa, 0x12, 0xb5, 0xf7, 0x2f, 0xfb, 0x1d, 0xf7, 0x2f, 0xfb, + 0x26, 0x84, 0x1d, 0x13, 0xc8, 0x2d, 0xa, 0x13, 0xd0, 0xb7, 0xf8, 0xd7, + 0x15, 0x60, 0xab, 0x69, 0xb9, 0xb6, 0xad, 0xac, 0xb7, 0xb6, 0x69, 0xae, + 0x60, 0x5e, 0x6a, 0x67, 0x61, 0x1e, 0xe, 0xfb, 0xce, 0xfb, 0x5f, 0xf7, + 0x35, 0xf8, 0xd6, 0xf7, 0x2f, 0x12, 0xea, 0xf7, 0x2c, 0xfb, 0x27, 0xf7, + 0x1f, 0x13, 0xd0, 0xc5, 0xf8, 0x3f, 0x15, 0xae, 0x88, 0xa7, 0x8a, 0x54, + 0x7e, 0xa, 0x61, 0x83, 0x69, 0x63, 0x88, 0x6e, 0x8c, 0x9b, 0x93, 0x92, + 0x95, 0x91, 0x96, 0x1e, 0x90, 0x94, 0x90, 0x95, 0x96, 0x1a, 0xa0, 0x79, + 0xac, 0x62, 0x61, 0x77, 0x6c, 0x6f, 0x41, 0xd6, 0x6f, 0xc2, 0xf7, 0x4b, + 0x8f, 0xf7, 0x28, 0xc4, 0x1e, 0xf8, 0x5f, 0xfb, 0x5e, 0x7, 0x13, 0xe0, + 0xbd, 0xf7, 0x2c, 0x15, 0x60, 0xaa, 0x69, 0xb9, 0xb6, 0xae, 0xac, 0xb7, + 0xb6, 0x68, 0xae, 0x60, 0x5e, 0x6b, 0x67, 0x61, 0x1e, 0xe, 0x30, 0x8b, + 0xad, 0xf8, 0x3f, 0x77, 0xf7, 0x7f, 0x77, 0x1, 0xd1, 0x8a, 0xa, 0xa1, + 0x16, 0x99, 0xa, 0x5b, 0x92, 0x87, 0x94, 0xb7, 0x1a, 0xf3, 0x7, 0xa2, + 0xa3, 0x5, 0xf5, 0xfb, 0x1e, 0x98, 0x77, 0x80, 0x1a, 0x7b, 0x6f, 0x88, + 0x7d, 0x1e, 0x69, 0xf7, 0x7e, 0xad, 0x7, 0x83, 0x84, 0x8c, 0x99, 0x81, + 0x1f, 0xfb, 0x56, 0xf7, 0x96, 0xa5, 0xaa, 0xc1, 0xb1, 0xa1, 0x9d, 0x19, + 0xa7, 0xa2, 0x9e, 0x8f, 0xb3, 0x92, 0x8, 0xac, 0xfb, 0x6a, 0x6a, 0x7, + 0xbb, 0x84, 0x96, 0x89, 0x77, 0x1a, 0xfb, 0x29, 0xfb, 0x2e, 0x5, 0xf8, + 0x43, 0xfb, 0x4f, 0x69, 0x7, 0xbb, 0x8b, 0x5c, 0x80, 0x1f, 0xfc, 0x7e, + 0x7, 0x73, 0x83, 0x67, 0x63, 0x1e, 0xe, 0xfc, 0x5, 0x8b, 0xad, 0xf9, + 0x16, 0x77, 0x12, 0xc1, 0xf7, 0x1f, 0xfb, 0x12, 0x84, 0x1d, 0x13, 0xd0, + 0x64, 0x81, 0xaa, 0xa8, 0x1f, 0xf8, 0xda, 0x8d, 0xa, 0xfc, 0x7e, 0x97, + 0x1d, 0xf7, 0x4e, 0x82, 0x1d, 0x4c, 0x76, 0xd3, 0x77, 0x12, 0xd2, 0xf7, + 0x1f, 0xf7, 0x1e, 0x53, 0xa, 0x14, 0xe, 0x13, 0xce, 0x9b, 0x16, 0xf7, + 0x84, 0xad, 0x6, 0x64, 0x8f, 0x84, 0xa1, 0xaa, 0x1a, 0xf7, 0x95, 0x7, + 0x93, 0xb3, 0xbd, 0xb6, 0xc2, 0x8b, 0x58, 0x6b, 0x1e, 0xfb, 0x7c, 0x7, + 0x74, 0x8b, 0x6c, 0x5b, 0x88, 0x1e, 0x69, 0xf7, 0x7e, 0xad, 0x7, 0x65, + 0x8e, 0x82, 0xa1, 0xab, 0x1a, 0xf7, 0x95, 0x7, 0x93, 0xb5, 0xbd, 0xb5, + 0xc1, 0x8b, 0x57, 0x6c, 0x1e, 0xfb, 0x7c, 0x7, 0x73, 0x8b, 0x6c, 0x5a, + 0x89, 0x1e, 0x69, 0xf7, 0x82, 0xad, 0x7, 0x59, 0x8c, 0x8b, 0xaa, 0xa4, + 0x1a, 0xf7, 0x85, 0x7, 0xf7, 0x2, 0x3c, 0xaa, 0x54, 0x51, 0x5e, 0x6f, + 0x50, 0x5e, 0x1e, 0xab, 0x7c, 0x72, 0xc2, 0x30, 0x1b, 0x13, 0xbe, 0x37, + 0x5f, 0x4f, 0x73, 0x7d, 0x1f, 0x88, 0x1d, 0xa8, 0x87, 0xa5, 0x88, 0x57, + 0x1a, 0xfb, 0xa6, 0x7, 0x5a, 0x75, 0x86, 0x6a, 0x8b, 0x1d, 0x30, 0x82, + 0x1d, 0x4c, 0x76, 0xd3, 0x77, 0x12, 0xcd, 0xf7, 0x1f, 0xfb, 0x17, 0x85, + 0x1d, 0x13, 0xca, 0xa0, 0x16, 0xf7, 0x85, 0xad, 0x6, 0x13, 0xc6, 0x59, + 0x1d, 0x1e, 0x13, 0xc9, 0xc1, 0x8c, 0x54, 0x6f, 0x1f, 0x4f, 0xa, 0x8d, + 0x8b, 0xaa, 0xa3, 0x1a, 0x76, 0xa, 0x1e, 0x13, 0xba, 0x36, 0x60, 0x4f, + 0x73, 0x7d, 0x1f, 0x88, 0x1d, 0x13, 0xc6, 0xb3, 0x85, 0x98, 0x83, 0x5e, + 0x1a, 0xfb, 0xa6, 0x7, 0x5a, 0x7a, 0x87, 0x67, 0x8b, 0xa, 0x65, 0xa, + 0x12, 0xa4, 0xf7, 0x27, 0xf7, 0x25, 0xf7, 0x27, 0xfb, 0x1b, 0xf7, 0x27, + 0x13, 0xf0, 0xf7, 0x40, 0xf7, 0x7c, 0x78, 0x1d, 0xeb, 0xd5, 0x1e, 0x13, + 0xe8, 0xc8, 0x9c, 0x4d, 0x64, 0xa, 0x39, 0x46, 0x3b, 0x8b, 0xf6, 0xf7, + 0x0, 0x1f, 0xfb, 0x27, 0x16, 0xfb, 0x16, 0xe2, 0xfb, 0x8, 0x70, 0xa, + 0xf6, 0x6f, 0xa, 0xf7, 0x0, 0x70, 0x1d, 0xfb, 0x4, 0xfb, 0x15, 0x1e, + 0xe, 0x7c, 0xa, 0x7f, 0x77, 0x12, 0xd6, 0xf7, 0x1f, 0xf7, 0xc, 0xf7, + 0x28, 0x21, 0xf7, 0x28, 0x13, 0xf6, 0x81, 0xa, 0x1e, 0x13, 0xf5, 0x90, + 0x1d, 0x54, 0x75, 0xc8, 0x8b, 0x1f, 0x7a, 0x1d, 0x89, 0xc8, 0x58, 0xa, + 0x7a, 0x1f, 0x89, 0x6, 0x13, 0xee, 0xcd, 0xfb, 0x55, 0x69, 0x7, 0xb9, + 0x85, 0x95, 0x7c, 0x65, 0x1a, 0xfc, 0x75, 0x92, 0xa, 0x30, 0xfb, 0x4c, + 0x76, 0xf7, 0x53, 0xc1, 0xf8, 0x25, 0xab, 0x1, 0xad, 0xf7, 0x26, 0xf7, + 0x36, 0x8a, 0xa, 0xf7, 0xea, 0xed, 0x15, 0x8d, 0x7a, 0x51, 0x56, 0x1b, + 0x49, 0x6f, 0xc7, 0xf7, 0x16, 0xde, 0x91, 0xf7, 0x14, 0xde, 0xb9, 0xa6, + 0x63, 0x63, 0x1f, 0x42, 0xfc, 0xa7, 0x15, 0x68, 0xf7, 0x9f, 0xad, 0x7, + 0x67, 0x92, 0x78, 0x8e, 0xbb, 0x1a, 0xf8, 0xde, 0x7c, 0x7, 0x3d, 0x52, + 0x5, 0xab, 0x67, 0x6c, 0xa4, 0x57, 0x1b, 0xfb, 0x2a, 0x36, 0xfb, 0x11, + 0xfb, 0xa, 0xfb, 0x3f, 0xe4, 0x42, 0xef, 0xa8, 0xbc, 0x96, 0xb8, 0xb4, + 0x1f, 0xfb, 0x2f, 0x7, 0x5e, 0x79, 0x89, 0x54, 0x81, 0x1e, 0xe, 0xfb, + 0x5f, 0x8b, 0xad, 0xf7, 0xba, 0xf7, 0x25, 0x45, 0x76, 0xa5, 0x76, 0xd5, + 0x77, 0x12, 0xde, 0xf7, 0x1f, 0x13, 0x9c, 0xa8, 0x16, 0xf7, 0x9e, 0xad, + 0x6, 0x4e, 0x8e, 0x7f, 0x92, 0xbd, 0x1a, 0xf7, 0x5a, 0x7, 0xd4, 0xb7, + 0xa1, 0x9a, 0x9c, 0x93, 0x79, 0x7b, 0x98, 0x1e, 0x13, 0xc4, 0x7e, 0x96, + 0x99, 0x7f, 0xa5, 0x1b, 0xbd, 0x99, 0xb4, 0xa5, 0xa3, 0x7c, 0xc1, 0x47, + 0x1f, 0x13, 0xac, 0x4a, 0x5e, 0x4f, 0x6c, 0x76, 0x1f, 0x89, 0xda, 0xfb, + 0x51, 0x73, 0x6, 0xa9, 0x87, 0xa3, 0x86, 0x59, 0x1a, 0xfb, 0xb0, 0x7, + 0x59, 0x75, 0x87, 0x6b, 0x8b, 0x1d, 0xfb, 0x96, 0x7d, 0xad, 0x7f, 0x76, + 0xf7, 0xfc, 0x76, 0xf7, 0x6, 0xac, 0x89, 0x77, 0x12, 0xa4, 0xef, 0xf7, + 0x20, 0xeb, 0x13, 0x76, 0xa4, 0x7e, 0x15, 0xae, 0x6, 0x9f, 0x95, 0x91, + 0x93, 0x96, 0x1b, 0x8d, 0x90, 0x89, 0x88, 0x91, 0x1f, 0x13, 0xb6, 0x83, + 0x9e, 0xae, 0x7b, 0xb0, 0x1b, 0xe8, 0xd8, 0xc6, 0xea, 0xdb, 0x52, 0xaf, + 0x52, 0xa6, 0x1f, 0x4f, 0xa8, 0x4d, 0x9e, 0xbf, 0x1a, 0xaa, 0xa4, 0xa5, + 0xaf, 0xc4, 0xb4, 0x60, 0x44, 0xa0, 0x1e, 0xae, 0x6, 0x13, 0xae, 0xf7, + 0x25, 0x6b, 0x7, 0x83, 0x88, 0x87, 0x7f, 0x79, 0x1b, 0x83, 0x80, 0x8f, + 0x90, 0x7e, 0x1f, 0x13, 0xb6, 0x91, 0x7a, 0x75, 0x92, 0x71, 0x1b, 0x2f, + 0x46, 0x50, 0x33, 0x41, 0xc3, 0x66, 0xc5, 0x6e, 0x1f, 0xc9, 0x6c, 0xcb, + 0x76, 0x5b, 0x1a, 0x6d, 0x73, 0x67, 0x59, 0xfb, 0x3, 0x80, 0xf4, 0xa6, + 0x85, 0x1e, 0x65, 0x6, 0xe, 0xfb, 0xce, 0x7f, 0xd2, 0xf7, 0xfa, 0xb7, + 0xf7, 0x3d, 0x77, 0x12, 0xc0, 0xf7, 0x1f, 0xfb, 0xc, 0xf7, 0x1f, 0x13, + 0xf0, 0xf7, 0xc7, 0xf7, 0x3, 0x15, 0x76, 0x80, 0x7a, 0x6c, 0x6e, 0x1b, + 0x13, 0xe8, 0x63, 0x8c, 0xa7, 0x9b, 0x1f, 0xf7, 0xce, 0xe9, 0xb7, 0x2d, + 0xf7, 0x3d, 0x72, 0x7, 0x47, 0x2a, 0x5e, 0x5f, 0x56, 0x5e, 0x8, 0x70, + 0xbf, 0xfb, 0xce, 0x7, 0x76, 0x8c, 0x8f, 0x2d, 0xf7, 0x0, 0x1b, 0xe5, + 0xaf, 0xd0, 0xb6, 0xa0, 0x1f, 0xe, 0x30, 0x7d, 0xcc, 0xf8, 0x2e, 0x77, + 0x12, 0xcc, 0x85, 0x1d, 0x13, 0xf0, 0x71, 0xa, 0x13, 0xe8, 0x25, 0x1d, + 0xe, 0x92, 0x76, 0xf8, 0x4d, 0xad, 0x1, 0xa0, 0xf8, 0x64, 0x3, 0xf7, + 0x85, 0x7d, 0x15, 0xa5, 0x6, 0xf7, 0x34, 0xf8, 0x16, 0x9f, 0xbd, 0x99, + 0x8d, 0xa3, 0x8e, 0x19, 0x4d, 0x1d, 0x38, 0xfb, 0x6d, 0x5, 0x33, 0xf7, + 0x6c, 0x8b, 0x8e, 0x8f, 0x1a, 0xa2, 0x9f, 0x8c, 0xac, 0x8e, 0x48, 0x1d, + 0xe, 0xd6, 0x92, 0x76, 0xf7, 0xd8, 0x76, 0xf7, 0x40, 0x77, 0x1, 0xf8, + 0xd0, 0xf7, 0x1b, 0x3, 0xf7, 0x78, 0x7d, 0x15, 0xa3, 0x6, 0xf7, 0xe, + 0xf7, 0xc3, 0x5, 0x90, 0x6, 0xef, 0xfb, 0xc3, 0x5, 0xa2, 0x6, 0xf7, + 0x2f, 0xf8, 0x1b, 0x9c, 0xb7, 0x99, 0x8d, 0x9e, 0x8f, 0x19, 0xad, 0xfb, + 0x1b, 0x69, 0x7, 0xa7, 0x88, 0x9f, 0x89, 0x6b, 0x1a, 0x75, 0x58, 0xfb, + 0x1, 0x70, 0x3f, 0x1e, 0x89, 0x6, 0x79, 0xd9, 0x61, 0xf7, 0xc, 0xa0, + 0x1a, 0xa0, 0xa1, 0x8d, 0xa5, 0x8d, 0x1e, 0xad, 0xfb, 0x7e, 0x69, 0x7, + 0xa3, 0x88, 0x96, 0x8b, 0x94, 0x76, 0x90, 0x7f, 0x91, 0x81, 0x95, 0x69, + 0x47, 0xfb, 0x3f, 0x18, 0x59, 0xf7, 0x1a, 0x69, 0xcd, 0xa0, 0x1a, 0xa5, + 0xa3, 0x8d, 0x99, 0x8d, 0x1e, 0xad, 0xfb, 0x72, 0x69, 0x7, 0xa5, 0x86, + 0x90, 0x8e, 0xa5, 0x4a, 0x8, 0xe, 0xa0, 0x76, 0xf8, 0x3f, 0xad, 0x1, + 0x99, 0xf8, 0x6a, 0x3, 0x99, 0x16, 0xf7, 0x3d, 0xad, 0x6, 0x7a, 0x8c, + 0x5b, 0x90, 0x9a, 0x9f, 0x8, 0x9a, 0xa0, 0xcc, 0xe5, 0x8b, 0x1a, 0x8b, + 0xc1, 0x36, 0xa0, 0x6c, 0x1e, 0x94, 0x7e, 0x6b, 0x84, 0x75, 0x8a, 0x8, + 0x69, 0xf7, 0x85, 0xad, 0x7, 0x7e, 0x8f, 0x83, 0x8e, 0x82, 0x98, 0xfb, + 0x28, 0xf7, 0x6e, 0x18, 0xf0, 0xf7, 0x8, 0x9d, 0xa2, 0xa3, 0x97, 0xa7, + 0x8f, 0x19, 0xad, 0xfb, 0x3c, 0x69, 0x7, 0xb2, 0x88, 0x97, 0x8a, 0x76, + 0x1a, 0x7d, 0x8b, 0x95, 0x41, 0x2c, 0x1e, 0x7c, 0x9e, 0x53, 0xcf, 0x9c, + 0x1a, 0x9b, 0xa2, 0x8f, 0xa3, 0x1e, 0xad, 0xfb, 0x8e, 0x69, 0x7, 0xa6, + 0x87, 0x93, 0x82, 0x9c, 0x71, 0xf7, 0x14, 0xfb, 0x4f, 0x18, 0xfb, 0x17, + 0xfb, 0x3f, 0x88, 0x94, 0x5f, 0x86, 0x8, 0xe, 0xfb, 0x61, 0xf7, 0x23, + 0xf8, 0x9f, 0x77, 0x1, 0xf7, 0x80, 0x7e, 0x15, 0x79, 0x56, 0x5, 0x75, + 0x84, 0x2b, 0xa, 0xe, 0x87, 0x1d, 0x1, 0xb1, 0xaf, 0x87, 0xa, 0x65, + 0x8e, 0x1d, 0x6b, 0x8b, 0x62, 0x8c, 0xf7, 0x7f, 0xf8, 0x27, 0x18, 0xa5, + 0xfc, 0xb, 0x7, 0x84, 0xfb, 0x22, 0x5, 0xaf, 0x6, 0xa5, 0xf7, 0x1, + 0xb0, 0x8b, 0xf7, 0xa, 0x8c, 0xfb, 0x7e, 0xfc, 0x28, 0x18, 0xe, 0x8d, + 0x1d, 0xf7, 0x15, 0xf4, 0x3, 0xa1, 0xf7, 0x99, 0x15, 0xe2, 0x78, 0x9f, + 0x5e, 0x49, 0x1a, 0xfb, 0x3f, 0x7, 0xfb, 0xd, 0xd9, 0x7d, 0xf7, 0x19, + 0x1e, 0x97, 0x7, 0x3a, 0x99, 0x72, 0xb3, 0xd0, 0x1a, 0xf7, 0x3f, 0x7, + 0xd2, 0x7a, 0xb3, 0x2a, 0x9d, 0x1e, 0x8d, 0x7, 0xec, 0x9d, 0x9c, 0xa5, + 0xd2, 0x1a, 0xf7, 0x47, 0x7, 0xd1, 0xa4, 0xb8, 0xdc, 0x9a, 0x1e, 0x97, + 0x7, 0xfb, 0x19, 0x3d, 0x77, 0xfb, 0xe, 0x1f, 0xfb, 0x47, 0x7, 0x49, + 0x77, 0x6c, 0x34, 0x78, 0x1e, 0xe, 0xfc, 0x3f, 0xfb, 0x29, 0x76, 0xf7, + 0x40, 0x76, 0xf9, 0x5a, 0x77, 0x1, 0xcd, 0xe3, 0x3e, 0xd0, 0x3, 0xd8, + 0xfb, 0x3e, 0x15, 0xd0, 0xf9, 0xf1, 0x46, 0x6, 0xe, 0x8d, 0x1d, 0xf7, + 0x34, 0xf4, 0x3, 0xc1, 0xfb, 0x37, 0x15, 0x7f, 0x7, 0xf7, 0x19, 0xd9, + 0x99, 0xf7, 0xe, 0x1f, 0xf7, 0x3f, 0x7, 0xcd, 0x9f, 0xb8, 0xe2, 0x9e, + 0x1e, 0x34, 0x9e, 0x77, 0xaa, 0xcd, 0x1a, 0xf7, 0x47, 0x7, 0xf7, 0xd, + 0x3d, 0x9f, 0xfb, 0x19, 0x1e, 0x7f, 0x7, 0xdc, 0x7d, 0xa4, 0x5d, 0x46, + 0x1a, 0xfb, 0x47, 0x7, 0x44, 0x9c, 0x71, 0xec, 0x79, 0x1e, 0x89, 0x7, + 0x2a, 0x79, 0x7a, 0x63, 0x44, 0x1a, 0xfb, 0x3f, 0x7, 0x45, 0x72, 0x64, + 0x3a, 0x7c, 0x1e, 0xe, 0xfb, 0x13, 0xf7, 0x41, 0xf7, 0x34, 0x1, 0xa8, + 0xf8, 0x62, 0x3, 0xcc, 0xf7, 0x41, 0x15, 0xae, 0x9b, 0xa3, 0xb0, 0xb7, + 0x1b, 0xb1, 0xaa, 0x7e, 0x7c, 0xa8, 0x1f, 0x78, 0xb1, 0xae, 0x76, 0xb9, + 0x1b, 0xc9, 0xac, 0xb7, 0xb5, 0xa9, 0x1f, 0x67, 0xd1, 0x5, 0x68, 0x74, + 0x72, 0x66, 0x63, 0x1b, 0x6e, 0x68, 0x9b, 0x9b, 0x66, 0x1f, 0x9d, 0x64, + 0x63, 0x9d, 0x6a, 0x1b, 0x48, 0x67, 0x5f, 0x61, 0x75, 0x1f, 0xe, 0xfb, + 0xce, 0xfb, 0x4a, 0x76, 0xf8, 0xab, 0xf7, 0x3d, 0x12, 0xdd, 0xf7, 0x3d, + 0x29, 0xa8, 0x13, 0xe0, 0xdd, 0xf8, 0x35, 0x15, 0x5d, 0xb1, 0x64, 0xba, + 0xbb, 0xaf, 0xb3, 0xb8, 0xba, 0x67, 0xb0, 0x5b, 0x5c, 0x65, 0x67, 0x5b, + 0x1e, 0x13, 0xd0, 0xd2, 0xfb, 0x37, 0x15, 0x84, 0x44, 0x83, 0x57, 0x82, + 0x62, 0x8, 0x75, 0x20, 0x73, 0x71, 0x4e, 0x1a, 0x4b, 0xac, 0x68, 0xbe, + 0xbf, 0xac, 0xae, 0xcb, 0xc8, 0x73, 0xa4, 0x75, 0xf5, 0x1e, 0x82, 0xb4, + 0x83, 0xc0, 0x84, 0xd3, 0x8, 0xe, 0xfb, 0xb, 0x76, 0xf7, 0x27, 0x76, + 0xf7, 0xe3, 0x76, 0xf7, 0x22, 0xaa, 0xf7, 0x7, 0x77, 0x1, 0xc0, 0xf7, + 0x21, 0xf7, 0x13, 0xf7, 0xf, 0x3, 0xf7, 0x75, 0xf7, 0x14, 0x15, 0x77, + 0xb1, 0x80, 0xbe, 0xc4, 0x1a, 0xab, 0x90, 0xf7, 0x1c, 0xdb, 0x9c, 0xa4, + 0x7f, 0x6d, 0x1e, 0x88, 0x7, 0xfb, 0x53, 0xfc, 0xad, 0x15, 0xb3, 0x6, + 0xba, 0xf7, 0x19, 0x5, 0x86, 0x9b, 0x9c, 0x89, 0x9d, 0x1b, 0xac, 0xe2, + 0x8b, 0xee, 0xd1, 0x1f, 0x79, 0x9d, 0x5, 0x74, 0x78, 0x6f, 0x70, 0x4f, + 0x1b, 0x6b, 0x70, 0x98, 0xa3, 0x75, 0x1f, 0xdd, 0xf7, 0x7a, 0x5, 0x7d, + 0x96, 0x9c, 0x85, 0x9b, 0x1b, 0x8f, 0xc9, 0x8b, 0xcb, 0xb4, 0x70, 0xa8, + 0x67, 0x9d, 0x1f, 0xbb, 0xf7, 0x1c, 0x5, 0x63, 0x6, 0x5f, 0xfb, 0xf, + 0x5, 0x90, 0x78, 0x77, 0x8e, 0x78, 0x1b, 0xfb, 0x2, 0xfb, 0x10, 0x39, + 0xfb, 0x3b, 0xfb, 0x7, 0xc3, 0x42, 0xd3, 0x6c, 0x1f, 0xe, 0x7d, 0xaa, + 0x6c, 0xf7, 0x12, 0x23, 0x76, 0xf7, 0x17, 0xb9, 0xf7, 0x24, 0xcc, 0xf7, + 0x12, 0xf7, 0x4d, 0x6d, 0xa9, 0x12, 0xa0, 0xab, 0xbf, 0xf7, 0x12, 0x13, + 0x5b, 0x80, 0xf7, 0x71, 0xbc, 0x15, 0x54, 0xc6, 0xad, 0x83, 0xaa, 0x1b, + 0xf7, 0x7, 0x96, 0xf7, 0xf, 0xd5, 0x91, 0x1f, 0x74, 0x6, 0x60, 0x80, + 0x7b, 0x6f, 0x3f, 0x1b, 0x7f, 0x6c, 0x8d, 0x9f, 0x58, 0x1f, 0xa2, 0xc6, + 0x8a, 0xc5, 0x87, 0xc4, 0x8, 0xf7, 0x1, 0xcc, 0xfb, 0x6, 0x6, 0x87, + 0x9a, 0x68, 0xf7, 0x3f, 0xa3, 0x1a, 0xac, 0x96, 0xb1, 0xb8, 0xb7, 0x8b, + 0x69, 0x7f, 0x1e, 0x13, 0x3d, 0x80, 0x37, 0x89, 0xa4, 0x72, 0xad, 0x1b, + 0xbf, 0x9e, 0xad, 0xb1, 0x97, 0x8b, 0xf0, 0xfb, 0x2e, 0xfb, 0x2d, 0x5c, + 0xfb, 0xa, 0x3c, 0x65, 0x92, 0x65, 0x92, 0x65, 0x1f, 0x3b, 0x4a, 0x6, + 0x13, 0x39, 0x0, 0xed, 0x6, 0x9b, 0x5d, 0xa3, 0x51, 0x8c, 0x5c, 0x8, + 0x8f, 0x7c, 0x80, 0x8e, 0x71, 0x1b, 0x26, 0x87, 0x46, 0x70, 0x43, 0xcc, + 0x82, 0x9d, 0xd2, 0xa9, 0xb4, 0xa0, 0x9b, 0x1f, 0x63, 0xb0, 0x15, 0x13, + 0x9d, 0x80, 0x71, 0x84, 0x7e, 0x60, 0x55, 0x1b, 0x7a, 0x66, 0x94, 0xb3, + 0x99, 0x93, 0xb1, 0xb8, 0xb2, 0x9e, 0x7a, 0x7c, 0x9c, 0x1f, 0xe, 0xf7, + 0x38, 0xd4, 0xf7, 0x5b, 0xd6, 0x1, 0xd8, 0xe3, 0xf7, 0x31, 0xe3, 0x3, + 0xf7, 0x1c, 0xf7, 0xe6, 0x15, 0xca, 0xbb, 0xbf, 0xcc, 0xce, 0xbb, 0x57, + 0x4c, 0x4a, 0x5b, 0x52, 0x48, 0x4a, 0x5b, 0xc4, 0xcc, 0x1e, 0x39, 0xfb, + 0x8d, 0x15, 0xe1, 0xe3, 0x5, 0x78, 0xa7, 0xb3, 0x7c, 0xb4, 0x1b, 0xb6, + 0xb3, 0x9a, 0x9e, 0xa7, 0x1f, 0xe1, 0x33, 0xbf, 0xbf, 0x33, 0xe3, 0x5, + 0xa0, 0xa5, 0x97, 0xb3, 0xb6, 0x1a, 0xb6, 0x7d, 0xb1, 0x78, 0xa7, 0x1e, + 0xe3, 0xe3, 0x57, 0xbd, 0x35, 0x35, 0x5, 0x9e, 0x6f, 0x65, 0x95, 0x5e, + 0x1b, 0x62, 0x63, 0x81, 0x78, 0x6f, 0x1f, 0x35, 0xe1, 0x57, 0x59, 0xe3, + 0x33, 0x5, 0x78, 0x71, 0x7c, 0x63, 0x60, 0x1a, 0x60, 0x98, 0x65, 0xa0, + 0x6f, 0x1e, 0x33, 0x33, 0x5, 0xe, 0x8b, 0xae, 0xf7, 0xb, 0xbd, 0xe8, + 0xbd, 0xf7, 0xb9, 0xaf, 0x1, 0xf7, 0x4d, 0xf7, 0x16, 0xe0, 0xf7, 0x13, + 0x3, 0xde, 0x16, 0xf7, 0xdf, 0xae, 0x6, 0x4b, 0x91, 0x68, 0x8d, 0xdd, + 0x1a, 0xb2, 0xf7, 0x1b, 0xbd, 0xfb, 0x1b, 0xce, 0x7, 0x8f, 0x96, 0x5, + 0xf7, 0x17, 0xbd, 0xfb, 0x3, 0x6, 0xf7, 0x10, 0xf7, 0x99, 0x9c, 0xac, + 0xaa, 0x8d, 0x9b, 0x8d, 0x19, 0xaf, 0xfb, 0x61, 0x67, 0x7, 0xb5, 0x89, + 0xaf, 0x8a, 0x64, 0x1a, 0x21, 0xfb, 0x92, 0x5, 0x89, 0x6, 0x55, 0xf7, + 0x2, 0x51, 0xf7, 0x14, 0xa5, 0x1a, 0xa3, 0x9d, 0x93, 0xc6, 0x1e, 0xaf, + 0xfb, 0xc1, 0x67, 0x7, 0xb8, 0x89, 0xa3, 0x74, 0x99, 0x6f, 0xf7, 0x2, + 0xfb, 0x89, 0x18, 0x28, 0x59, 0xf7, 0x10, 0x6, 0x96, 0x76, 0x5, 0x52, + 0xfb, 0x1b, 0x59, 0xf7, 0x1b, 0x64, 0x7, 0x39, 0x66, 0x89, 0x4a, 0x8b, + 0x1d, 0xfc, 0x3f, 0x8d, 0x76, 0xf8, 0x5d, 0x76, 0xf7, 0xa6, 0x77, 0x1, + 0xcd, 0xe3, 0x3e, 0xce, 0x3, 0xd8, 0xf8, 0x35, 0x15, 0xcd, 0xf7, 0xa6, + 0x49, 0x6, 0xfd, 0x5a, 0x4, 0xce, 0xf7, 0xae, 0x48, 0x6, 0xe, 0xfb, + 0xf, 0xa2, 0xf7, 0x93, 0xa4, 0xf7, 0x2d, 0x77, 0xea, 0xa2, 0xf7, 0x6a, + 0x77, 0x12, 0xb3, 0xd6, 0x56, 0xd6, 0x5c, 0xf7, 0x14, 0xf7, 0x0, 0xe0, + 0x13, 0x8c, 0x80, 0xf7, 0xc5, 0xf7, 0x24, 0x15, 0xb8, 0x8c, 0xe8, 0x8e, + 0xf7, 0x6, 0xf7, 0x38, 0xfb, 0xa2, 0xdc, 0xe4, 0x1a, 0xb9, 0xa7, 0xa5, + 0xb4, 0xb9, 0xa1, 0x7d, 0x84, 0x84, 0x80, 0x82, 0x80, 0x81, 0x1e, 0x81, + 0x82, 0x81, 0x7f, 0x7c, 0x1a, 0x71, 0xa8, 0x6c, 0xac, 0x9a, 0xbb, 0x9a, + 0xbf, 0xa6, 0x67, 0xd0, 0xfb, 0x7, 0x1e, 0x13, 0xfc, 0x80, 0x3f, 0x48, + 0x59, 0x38, 0x51, 0xbb, 0x64, 0xbd, 0x5f, 0x1f, 0x89, 0x89, 0x5, 0x13, + 0xea, 0x80, 0x62, 0x8e, 0x2a, 0x87, 0xfb, 0xf, 0x1a, 0x3d, 0xb9, 0x6b, + 0xf7, 0xe, 0x24, 0x1e, 0xd8, 0x4d, 0x9c, 0x7c, 0x62, 0x1a, 0x65, 0x71, + 0x6c, 0x53, 0x51, 0x84, 0xa2, 0x91, 0x91, 0x94, 0x90, 0x94, 0x91, 0x1e, + 0x98, 0x93, 0x9a, 0x95, 0xa2, 0x1a, 0x13, 0xf9, 0x80, 0xa1, 0x75, 0xac, + 0x5f, 0x5c, 0x7c, 0x5e, 0x79, 0x46, 0xe0, 0x6a, 0xc9, 0x1e, 0x13, 0xfa, + 0x80, 0xf6, 0xc7, 0xc6, 0xd0, 0xc8, 0x61, 0xba, 0x52, 0xb1, 0x1f, 0xfb, + 0x41, 0xf7, 0x57, 0x15, 0xb8, 0xb1, 0x95, 0x9d, 0x1e, 0x13, 0x8c, 0x80, + 0xba, 0xe2, 0x33, 0x89, 0x8d, 0x1f, 0xb1, 0x64, 0x90, 0x80, 0x70, 0x1a, + 0x72, 0x7d, 0x6a, 0x62, 0x6b, 0x6c, 0xa4, 0xa3, 0x6f, 0x1e, 0x48, 0xc3, + 0x75, 0x9f, 0xb8, 0x1a, 0xe, 0xfb, 0xce, 0xf8, 0xad, 0xf7, 0x16, 0x1, + 0x89, 0x3f, 0xa, 0xe, 0xef, 0x78, 0xbf, 0xf7, 0x5, 0xa2, 0xf7, 0xb0, + 0x76, 0xe0, 0xa2, 0xf6, 0xbf, 0x1, 0xae, 0xd2, 0xf7, 0x7, 0xf1, 0xf7, + 0x4a, 0x9e, 0xf7, 0x12, 0xd2, 0x3, 0x71, 0x1d, 0xf7, 0x30, 0xf7, 0x5a, + 0xf7, 0x5b, 0xfb, 0x29, 0xf7, 0x31, 0x55, 0xa, 0xfb, 0x1f, 0xfb, 0x39, + 0xfb, 0x38, 0xfb, 0xc, 0xfb, 0x1e, 0x80, 0x1d, 0xf8, 0x40, 0x3c, 0x15, + 0x58, 0x74, 0x64, 0x63, 0x4f, 0x1b, 0x2e, 0x6a, 0xd7, 0xf4, 0x8c, 0x1f, + 0xef, 0x8c, 0xb2, 0xd6, 0xdd, 0x1b, 0xd2, 0xa6, 0x5c, 0x61, 0x95, 0x1f, + 0x9e, 0xd3, 0x6, 0x94, 0x85, 0x92, 0x7b, 0x90, 0x1e, 0x94, 0x70, 0x71, + 0x95, 0x57, 0x1b, 0xfb, 0x3b, 0x52, 0xfb, 0x5, 0x36, 0xfb, 0x1e, 0xef, + 0x49, 0xf7, 0x13, 0xba, 0xaa, 0x99, 0x8f, 0x9e, 0x1f, 0x9c, 0x92, 0x95, + 0x8e, 0x8c, 0x97, 0x9b, 0xd5, 0x18, 0xe, 0xfb, 0xef, 0xf8, 0x36, 0x76, + 0xf7, 0xa0, 0xa2, 0x12, 0x8a, 0xed, 0x36, 0xe0, 0xd6, 0xeb, 0x13, 0xd8, + 0xf7, 0x43, 0xf8, 0x4a, 0x15, 0x7b, 0x8f, 0x90, 0x72, 0xb9, 0x1b, 0xa8, + 0xa3, 0x99, 0x9f, 0x9d, 0x1f, 0x81, 0x97, 0x5, 0x7a, 0x7a, 0x85, 0x9f, + 0x8f, 0x1a, 0xf7, 0x30, 0x7, 0xc4, 0x51, 0xa4, 0x43, 0x36, 0x62, 0x67, + 0x65, 0x62, 0xaf, 0x8b, 0x92, 0xb0, 0x95, 0xa2, 0x96, 0x1e, 0x9e, 0x77, + 0x90, 0x98, 0x1a, 0x94, 0x9a, 0x97, 0xa3, 0xb8, 0x92, 0x6b, 0x6d, 0x1e, + 0x6d, 0x7, 0x13, 0xe8, 0x31, 0x74, 0x37, 0x73, 0x4d, 0x1a, 0x13, 0xa8, + 0x5a, 0xb4, 0x79, 0xab, 0x9a, 0xb9, 0x8d, 0xb2, 0xb5, 0x1e, 0x88, 0xa6, + 0x15, 0x81, 0x84, 0x7c, 0x7b, 0x75, 0x1b, 0x76, 0x81, 0xa1, 0x9d, 0xbf, + 0xcb, 0x9d, 0x96, 0x8e, 0x1f, 0xe, 0x82, 0xa, 0x1, 0xf7, 0x6f, 0xf7, + 0x92, 0x3, 0xa2, 0xf7, 0x75, 0x88, 0xa, 0x82, 0x95, 0x9b, 0x7d, 0x96, + 0x1b, 0x91, 0x90, 0x8f, 0x99, 0x77, 0x1d, 0xe1, 0xf6, 0xa8, 0x1a, 0x95, + 0x88, 0x7b, 0x1d, 0xf7, 0x58, 0x87, 0x88, 0xa, 0x82, 0x95, 0x9c, 0x7d, + 0x96, 0x1b, 0x91, 0x8f, 0x75, 0xa, 0x95, 0x86, 0x7b, 0x1d, 0xe, 0x3e, + 0xf7, 0x15, 0x76, 0xf7, 0x73, 0xcf, 0x12, 0xf8, 0x54, 0xe6, 0x44, 0xd0, + 0x13, 0xe0, 0xac, 0xf7, 0xdf, 0x15, 0x13, 0xd0, 0xf8, 0x47, 0xfb, 0x73, + 0xd0, 0xf7, 0xb7, 0xfc, 0x8c, 0x6, 0xe, 0xef, 0x78, 0xbf, 0x57, 0xf7, + 0x52, 0x7e, 0xf7, 0x51, 0x85, 0x76, 0xf7, 0xef, 0xbf, 0x12, 0xa5, 0xd2, + 0xf7, 0x3e, 0xdb, 0xe4, 0xe0, 0xf7, 0x15, 0xd2, 0x13, 0xaf, 0x80, 0x71, + 0x1d, 0xf7, 0x34, 0xf7, 0x5a, 0xf7, 0x5b, 0xfb, 0x29, 0xf7, 0x2d, 0x55, + 0xa, 0xfb, 0x1b, 0xfb, 0x39, 0xfb, 0x38, 0xfb, 0xc, 0xfb, 0x22, 0x80, + 0x1d, 0xf7, 0x2, 0xfb, 0x4a, 0x15, 0xf7, 0x40, 0x6, 0x13, 0x5f, 0x80, + 0x9d, 0x7, 0x5c, 0x8e, 0x8c, 0x8f, 0xb0, 0x1a, 0xf4, 0xb0, 0x7, 0x13, + 0xaf, 0x80, 0x3a, 0xc0, 0xc9, 0x35, 0x88, 0x1b, 0xdc, 0x96, 0x6, 0xfb, + 0x14, 0xf7, 0x3b, 0x5, 0xbb, 0x9b, 0xab, 0xb0, 0xba, 0x1a, 0xcf, 0x56, + 0xac, 0x4d, 0x1e, 0xfb, 0x55, 0x79, 0x6, 0xba, 0x89, 0x8a, 0x87, 0x65, + 0x1a, 0xfb, 0x93, 0x7, 0x13, 0x5f, 0x80, 0x66, 0x8c, 0x87, 0x5c, 0x88, + 0x1e, 0x13, 0xaf, 0x80, 0xf7, 0x12, 0xf7, 0x3f, 0x15, 0xf7, 0x3c, 0xaf, + 0x7, 0xaf, 0xa4, 0x77, 0x50, 0x5d, 0x7c, 0x60, 0x5c, 0x1f, 0xe, 0xfb, + 0xce, 0xf8, 0xc9, 0xd3, 0x1, 0x8c, 0xf8, 0xc9, 0x15, 0xf7, 0xde, 0xd3, + 0xfb, 0xde, 0x6, 0xe, 0xfb, 0x8b, 0xf8, 0x26, 0xaf, 0xf7, 0x6a, 0xaf, + 0x1, 0xbb, 0xb4, 0xf7, 0x69, 0xb4, 0x3, 0xed, 0xf8, 0xb5, 0x15, 0xc4, + 0xb8, 0xbd, 0xc4, 0xc4, 0xb8, 0x59, 0x52, 0x52, 0x5e, 0x59, 0x52, 0x52, + 0x5e, 0xbd, 0xc4, 0x1e, 0x62, 0x16, 0x3b, 0xca, 0x4c, 0xdb, 0xdb, 0xca, + 0xca, 0xdb, 0xdb, 0x4c, 0xca, 0x3b, 0x3b, 0x4c, 0x4c, 0x3b, 0x1e, 0xe, + 0x3e, 0x8b, 0xe1, 0xf7, 0x51, 0xe3, 0x3b, 0xcd, 0xf7, 0x31, 0x77, 0x12, + 0xf7, 0x85, 0xe3, 0x3e, 0xcd, 0x13, 0xd4, 0xf7, 0x90, 0xf7, 0x12, 0x15, + 0xcd, 0x6, 0x13, 0xb4, 0xf7, 0x31, 0xf7, 0x6f, 0xcd, 0xfb, 0x6f, 0xf7, + 0x31, 0x49, 0xfb, 0x31, 0xfb, 0x6f, 0x49, 0xf7, 0x6f, 0x7, 0xfb, 0x6f, + 0xfb, 0xaf, 0x15, 0xf8, 0x8c, 0x6, 0x13, 0xd8, 0xcd, 0xfc, 0x8c, 0x7, + 0xe, 0xfb, 0xef, 0xf7, 0xa7, 0xdb, 0xf7, 0x9d, 0xcf, 0x12, 0xf7, 0x4c, + 0xe3, 0x17, 0xf7, 0xa7, 0x4, 0xf7, 0xa2, 0x6, 0xa9, 0xf7, 0x13, 0x5, + 0x7b, 0x6, 0x62, 0x79, 0x85, 0x85, 0x46, 0x1b, 0x2f, 0x6, 0xf7, 0x25, + 0xed, 0xa7, 0xe7, 0xaa, 0x5a, 0x1d, 0x1f, 0x44, 0x3c, 0x3c, 0x22, 0x23, + 0x1e, 0xe, 0xfb, 0xef, 0xf7, 0xb5, 0x76, 0xf8, 0x8, 0xbb, 0x12, 0xf7, + 0x44, 0xea, 0x5a, 0xd6, 0x13, 0xd0, 0xe7, 0xf8, 0x7e, 0x40, 0xa, 0x70, + 0xb6, 0x56, 0x9d, 0x1e, 0x13, 0x60, 0xa7, 0x9a, 0x4a, 0x1d, 0xe, 0x90, + 0xa, 0xe1, 0xf8, 0xa4, 0x56, 0x1d, 0xf7, 0x1e, 0xe1, 0x5, 0xa3, 0x9a, + 0x9f, 0x97, 0xa7, 0x1a, 0xaf, 0x71, 0x93, 0x79, 0x81, 0x73, 0x89, 0x71, + 0x74, 0x1e, 0xe, 0x30, 0xfb, 0x4d, 0x76, 0xf9, 0x2f, 0x77, 0x12, 0xac, + 0xf7, 0x14, 0x2c, 0xf7, 0x1f, 0xf7, 0x17, 0xf7, 0x1f, 0x13, 0xd8, 0xf7, + 0x15, 0x9d, 0x15, 0x8d, 0x8d, 0x5, 0x77, 0xa3, 0xab, 0x7e, 0xb9, 0x1b, + 0xb2, 0xaa, 0x9d, 0xad, 0xa5, 0x1f, 0x64, 0xa0, 0xb1, 0x7e, 0xb6, 0x1b, + 0xbd, 0xa2, 0x9f, 0xa8, 0xab, 0x1f, 0xa3, 0x7, 0x82, 0x86, 0x83, 0x89, + 0x83, 0x8c, 0x8, 0x7c, 0x8d, 0x76, 0x99, 0xaa, 0x1a, 0xf7, 0xfc, 0xfb, + 0x1f, 0xfb, 0xfb, 0x7, 0x7d, 0x77, 0x6a, 0x7e, 0x78, 0x1b, 0x6f, 0x6c, + 0x9f, 0xc1, 0x1f, 0xf7, 0xcc, 0xfb, 0x1f, 0xfc, 0x9, 0x7, 0x56, 0x85, + 0x62, 0x83, 0x6a, 0x1e, 0x13, 0xe8, 0x82, 0x64, 0x81, 0x70, 0x74, 0x1a, + 0x5d, 0x9e, 0x6b, 0xbc, 0xb4, 0x9e, 0xab, 0xb9, 0xa8, 0x7f, 0xa7, 0x82, + 0xab, 0x1e, 0x86, 0x9d, 0x87, 0x9e, 0x89, 0x9f, 0x8, 0xe, 0x20, 0xfb, + 0x54, 0x76, 0xf9, 0xd9, 0xb1, 0x75, 0xa1, 0x12, 0xf7, 0x9a, 0xbc, 0xe3, + 0xbc, 0x13, 0xd8, 0xf7, 0x98, 0xfb, 0x69, 0x15, 0xbc, 0xf9, 0xd9, 0xed, + 0xfd, 0xd9, 0x6, 0x13, 0xb8, 0xbc, 0xf9, 0x7a, 0x6, 0xe1, 0x97, 0xa4, + 0xd3, 0x1e, 0xa1, 0xfb, 0xb2, 0x7, 0xfb, 0x6, 0xfb, 0x20, 0x67, 0xfb, + 0x4e, 0xfb, 0x33, 0xf7, 0x6, 0x44, 0xf7, 0x26, 0x1f, 0xe, 0xfc, 0x21, + 0xf7, 0x8c, 0x93, 0xa, 0xf7, 0xe0, 0x62, 0x1d, 0xfb, 0xce, 0xfb, 0x59, + 0x76, 0xf7, 0x6e, 0x77, 0x12, 0xf7, 0x5d, 0xe8, 0x17, 0xf7, 0x33, 0x16, + 0x60, 0x2b, 0x4f, 0x1d, 0x13, 0x60, 0xb1, 0xf7, 0x5, 0x8c, 0xdc, 0xc8, + 0x4b, 0xa7, 0x52, 0x7a, 0x1f, 0xa7, 0xcb, 0x5, 0xe, 0xfb, 0xef, 0xf7, + 0xa7, 0xa9, 0xbd, 0xa9, 0xf7, 0xc3, 0x77, 0x1, 0xf6, 0xeb, 0x3, 0xa9, + 0xf7, 0xf7, 0x15, 0xf7, 0x87, 0xa9, 0x6, 0x4b, 0x85, 0x9b, 0xb3, 0x1f, + 0xf7, 0x8b, 0x46, 0xa, 0xfb, 0x17, 0x7, 0x65, 0x89, 0x74, 0x40, 0x8c, + 0x1e, 0xe, 0xfb, 0xd1, 0xf8, 0x21, 0x9f, 0xf7, 0x8e, 0xa0, 0x1, 0x9d, + 0xec, 0xee, 0xed, 0x3, 0xf7, 0x7, 0xf8, 0xb2, 0x15, 0xe7, 0x97, 0xac, + 0xb1, 0xb1, 0x96, 0x6a, 0x2f, 0x3e, 0x86, 0x5b, 0x5f, 0x5f, 0x85, 0xbb, + 0xd8, 0x1e, 0x2a, 0x16, 0x3b, 0xc5, 0x4a, 0xe4, 0xe4, 0xc5, 0xcc, 0xdb, + 0xde, 0x4e, 0xca, 0x35, 0x35, 0x4e, 0x4c, 0x38, 0x1e, 0xe, 0x82, 0xa, + 0x12, 0xf7, 0x25, 0xf7, 0x1c, 0x17, 0xf7, 0x25, 0x91, 0xa, 0x81, 0x91, + 0x87, 0x91, 0x97, 0x9f, 0x9b, 0x91, 0x92, 0x4c, 0xa, 0xf7, 0x58, 0x16, + 0x6d, 0x65, 0x35, 0x20, 0x6e, 0x1a, 0x80, 0x8f, 0x88, 0x91, 0x96, 0x9d, + 0x99, 0x93, 0x95, 0x4c, 0xa, 0xe, 0xf2, 0x94, 0x76, 0xac, 0x76, 0xe2, + 0xcd, 0xf7, 0xe, 0xa9, 0xb4, 0x76, 0xf7, 0x1, 0x76, 0xf7, 0xa7, 0x77, + 0x12, 0xf6, 0xeb, 0xf8, 0x2a, 0xe8, 0x13, 0x7f, 0x80, 0xf8, 0x53, 0xe2, + 0x74, 0x1d, 0x37, 0x23, 0x50, 0x38, 0x73, 0xa, 0x13, 0xbf, 0x80, 0xfb, + 0xc0, 0xfb, 0x39, 0x69, 0xa, 0xfc, 0xdf, 0x3e, 0x1d, 0xe, 0xf2, 0x8b, + 0xdb, 0x44, 0x76, 0xf7, 0xb3, 0xa9, 0xb3, 0xcf, 0xf7, 0xa7, 0x77, 0x12, + 0xd3, 0xeb, 0xf8, 0x7f, 0xe3, 0x13, 0x7e, 0xf7, 0x18, 0x7f, 0x69, 0xa, + 0xfc, 0xd8, 0x3e, 0x1d, 0x13, 0xbe, 0xf8, 0x76, 0xfb, 0xc5, 0x15, 0xf7, + 0xa2, 0x6, 0xa9, 0xf7, 0x13, 0x5, 0x71, 0x6, 0x62, 0x79, 0x85, 0x85, + 0x46, 0x1b, 0x3f, 0x90, 0x6, 0xe8, 0xe2, 0x5, 0xd5, 0xcd, 0x8b, 0xb8, + 0x9d, 0x5a, 0x1d, 0x44, 0x3c, 0x3c, 0x22, 0x23, 0x1f, 0xe, 0xf2, 0x94, + 0x76, 0xee, 0xcd, 0xf8, 0x7b, 0xbb, 0x12, 0xf7, 0x58, 0xea, 0x5a, 0xd6, + 0xf7, 0xae, 0xe8, 0x13, 0xec, 0xf7, 0x40, 0x7f, 0x69, 0xa, 0xfc, 0x89, + 0xfb, 0x5a, 0x40, 0xa, 0x6f, 0xb6, 0x5b, 0x9b, 0x1e, 0x8f, 0x7, 0x13, + 0xf4, 0xa3, 0x98, 0x4a, 0x1d, 0xf7, 0xd9, 0xfc, 0x31, 0x74, 0x1d, 0x35, + 0x26, 0x52, 0x35, 0x73, 0xa, 0xe, 0xfb, 0x5d, 0xaf, 0xf8, 0x88, 0xf7, + 0x3a, 0x12, 0xc2, 0xf7, 0x29, 0x70, 0xf7, 0x3d, 0x69, 0xf7, 0x17, 0x13, + 0xe8, 0x13, 0xd0, 0xf7, 0x8b, 0xf7, 0x95, 0x15, 0x99, 0x3e, 0x59, 0x6a, + 0x56, 0x68, 0x8, 0x58, 0x6a, 0x57, 0x68, 0x40, 0x1a, 0xfb, 0x33, 0xf7, + 0x37, 0x80, 0xaa, 0xf7, 0x38, 0xa9, 0xf1, 0xb4, 0xae, 0x78, 0xb5, 0x58, + 0x77, 0x62, 0x7f, 0x57, 0x70, 0x96, 0x7f, 0x95, 0x80, 0x1e, 0x93, 0x82, + 0x93, 0x83, 0x7e, 0x1a, 0x66, 0x59, 0x88, 0x82, 0x3d, 0x83, 0xe4, 0xb5, + 0xcf, 0xa1, 0xb5, 0x9f, 0xb1, 0x1e, 0xa2, 0xb6, 0xa4, 0xae, 0x7a, 0xcc, + 0x8, 0x13, 0xe8, 0x27, 0xf7, 0x37, 0x15, 0x5d, 0xb1, 0x64, 0xb9, 0xbb, + 0xb0, 0xb3, 0xb8, 0xba, 0x66, 0xad, 0x5b, 0x5d, 0x65, 0x6a, 0x5b, 0x1e, + 0xe, 0x4b, 0x1d, 0xf7, 0x91, 0x77, 0x1, 0xf8, 0xe, 0xf9, 0x76, 0x24, + 0x1d, 0xfb, 0x77, 0xfd, 0xce, 0x20, 0x1d, 0x4b, 0x1d, 0xf7, 0x91, 0x77, + 0x1, 0xf7, 0xa6, 0xf9, 0x76, 0x22, 0x1d, 0xfc, 0x26, 0xfe, 0x13, 0x20, + 0x1d, 0x4b, 0x1d, 0xf7, 0x88, 0x77, 0x1, 0xf7, 0x4e, 0xf9, 0x76, 0x29, + 0x1d, 0xfb, 0xbf, 0xfe, 0x26, 0x20, 0x1d, 0x54, 0xa, 0xf8, 0x9d, 0xd9, + 0x80, 0xd9, 0x12, 0x13, 0xd0, 0xf7, 0x40, 0xf9, 0x8b, 0x45, 0x1d, 0xa1, + 0xa5, 0x81, 0x80, 0xa3, 0x1f, 0x13, 0xe0, 0x7e, 0xa9, 0xa8, 0x7c, 0xa1, + 0x1b, 0x13, 0xd0, 0x44, 0xa, 0x13, 0xe0, 0x54, 0x1d, 0x6b, 0x77, 0x96, + 0x96, 0x77, 0x1f, 0x13, 0xd0, 0x98, 0x74, 0x75, 0x99, 0x69, 0x50, 0x1d, + 0xfb, 0x37, 0xfd, 0x8b, 0x20, 0x1d, 0x4b, 0x1d, 0xd8, 0xf7, 0x16, 0x1, + 0xf7, 0x4e, 0xf7, 0x13, 0x8b, 0xde, 0x8b, 0xf7, 0x13, 0x14, 0xe, 0xf7, + 0x4e, 0xf9, 0xc0, 0x15, 0x6e, 0x1d, 0xf7, 0x66, 0x16, 0x6e, 0x1d, 0xfc, + 0x17, 0xfd, 0xc0, 0x20, 0x1d, 0x54, 0xa, 0xf8, 0x5f, 0x77, 0xba, 0xbb, + 0xf7, 0x15, 0xbb, 0x1, 0xf7, 0x84, 0xbb, 0x8b, 0xf7, 0x9, 0x8b, 0xbb, + 0x14, 0x7, 0xf7, 0x84, 0xf9, 0xd0, 0x15, 0x4f, 0xbc, 0x5d, 0xc5, 0x7d, + 0x1d, 0x1e, 0xbb, 0x16, 0xac, 0xa4, 0xa5, 0xac, 0xac, 0xa5, 0x71, 0x6a, + 0x6a, 0x71, 0x72, 0x6a, 0x6a, 0x72, 0xa4, 0xac, 0x1e, 0xfb, 0xab, 0xfd, + 0xd0, 0x20, 0x1d, 0xf7, 0xf5, 0x8b, 0xae, 0x68, 0xb7, 0xf7, 0x97, 0xb3, + 0x7f, 0xab, 0xf7, 0xa0, 0xb8, 0x12, 0xf8, 0x44, 0xf7, 0x34, 0x13, 0xac, + 0x8f, 0x16, 0xf7, 0x62, 0xae, 0x6, 0x59, 0x91, 0x66, 0x8f, 0xac, 0x1a, + 0xf7, 0xb, 0xf7, 0x75, 0x5, 0xf7, 0x52, 0xfb, 0x60, 0x6, 0x64, 0x7d, + 0x75, 0x41, 0x88, 0x1e, 0x68, 0xf8, 0xca, 0x7, 0xb4, 0xf7, 0x67, 0x5, + 0x74, 0x6, 0x7e, 0x60, 0x44, 0x6b, 0x6c, 0x1e, 0x13, 0x5c, 0x61, 0x5e, + 0x62, 0x81, 0x21, 0x1b, 0x4f, 0x82, 0x9e, 0xae, 0x1f, 0xf7, 0x7d, 0x7, + 0xf7, 0x16, 0x86, 0x8a, 0x56, 0x9b, 0x28, 0x8, 0xac, 0xf7, 0xe6, 0x6a, + 0x6, 0x6f, 0xfb, 0x14, 0x8b, 0x81, 0xfb, 0x9, 0x80, 0x8, 0xf7, 0x82, + 0x7, 0x9e, 0x8b, 0x96, 0xdd, 0xf7, 0x44, 0x90, 0x49, 0x31, 0x9e, 0x1e, + 0xae, 0xf7, 0x5d, 0xfd, 0xe, 0x6b, 0x6, 0xbf, 0x89, 0xae, 0x85, 0x6c, + 0x1a, 0xfb, 0xbc, 0xfc, 0xac, 0x5, 0x13, 0xac, 0x78, 0x68, 0x84, 0x93, + 0x67, 0x84, 0x8, 0xf7, 0x98, 0xf7, 0xc8, 0x15, 0xf7, 0x35, 0xf7, 0xac, + 0x5, 0x92, 0xfb, 0xac, 0x6, 0xe, 0xd6, 0xfb, 0x59, 0x76, 0xf7, 0x33, + 0xb5, 0x8b, 0xb9, 0x7d, 0xa, 0xf7, 0x57, 0xe8, 0x13, 0xfb, 0xf7, 0xc4, + 0xfb, 0x37, 0x15, 0x7b, 0x66, 0x5, 0x7b, 0xb4, 0xb1, 0x89, 0x97, 0x1b, + 0xb1, 0xec, 0x93, 0xdc, 0xbc, 0x64, 0xa0, 0x58, 0x7e, 0x83, 0x89, 0x88, + 0x81, 0x1f, 0x9f, 0xb8, 0xf7, 0x11, 0x8c, 0xd8, 0xca, 0xd3, 0xdd, 0x19, + 0x6d, 0xa4, 0x5, 0x2e, 0x38, 0x40, 0x6d, 0x3d, 0x1b, 0xfb, 0x2a, 0x5e, + 0xf7, 0x45, 0xf7, 0x12, 0xf7, 0x3d, 0xaa, 0xf7, 0x31, 0xf7, 0x26, 0xf7, + 0x6, 0xdd, 0xfb, 0x9, 0x34, 0xae, 0x1f, 0xae, 0x6, 0x13, 0xf7, 0x6a, + 0x1d, 0x7b, 0x6c, 0x9d, 0x99, 0x61, 0x1f, 0x13, 0xfb, 0x94, 0x70, 0x6b, + 0x93, 0x68, 0x1b, 0xfb, 0x66, 0xfb, 0x24, 0xfb, 0x30, 0xfb, 0x5f, 0xfb, + 0x44, 0xf7, 0x4, 0xfb, 0x30, 0xf7, 0x66, 0x7a, 0x1f, 0x68, 0x3c, 0x96, + 0x83, 0x5, 0x8d, 0x93, 0x92, 0x8d, 0x98, 0x1b, 0xa5, 0x9f, 0x80, 0x72, + 0x73, 0x1d, 0x1f, 0xe, 0x55, 0x1d, 0x9b, 0x16, 0x21, 0x1d, 0xf7, 0xf0, + 0xf9, 0x53, 0x26, 0xa, 0x55, 0x1d, 0xf7, 0x98, 0xf9, 0x76, 0x22, 0x1d, + 0xfc, 0x11, 0xfe, 0x13, 0x15, 0x21, 0x1d, 0xe, 0x51, 0xa, 0xf7, 0x82, + 0x72, 0xa, 0xf7, 0x40, 0xf9, 0x76, 0x29, 0x1d, 0xfb, 0xaa, 0xfe, 0x26, + 0x15, 0x21, 0x1d, 0xe, 0x9f, 0x8b, 0xaa, 0xf7, 0xbe, 0xad, 0xf7, 0xab, + 0xad, 0xd2, 0x9a, 0x1d, 0xf3, 0xf7, 0x36, 0x2c, 0xf7, 0x16, 0xda, 0xf7, + 0x16, 0x2f, 0xaf, 0x13, 0xf9, 0x9b, 0x16, 0x21, 0x1d, 0x13, 0xf6, 0xf7, + 0x2f, 0xf9, 0x9d, 0x15, 0x2a, 0x1d, 0xf7, 0x65, 0x38, 0x1d, 0x35, 0x1d, + 0xf7, 0x5a, 0xf9, 0x53, 0x26, 0xa, 0x35, 0x1d, 0xe9, 0xf9, 0x53, 0x28, + 0x1d, 0x5c, 0xa, 0xf7, 0x82, 0x77, 0x27, 0xa, 0x91, 0xf9, 0x53, 0x29, + 0x1d, 0xe, 0x5c, 0xa, 0xd2, 0x9a, 0x1d, 0x9f, 0xf7, 0x1a, 0x62, 0xf7, + 0x36, 0x62, 0xf7, 0x16, 0x13, 0xf4, 0x9f, 0x16, 0xf7, 0xf2, 0xae, 0x6, + 0x13, 0xe8, 0x34, 0x1d, 0x7, 0x13, 0xf4, 0xfb, 0xf2, 0x68, 0x6, 0x13, + 0xe8, 0x4b, 0xa, 0x13, 0xf4, 0x4d, 0x64, 0x87, 0x55, 0x86, 0x1e, 0x8f, + 0xf9, 0x9d, 0x40, 0x1d, 0x8a, 0x1d, 0xf7, 0xb7, 0xba, 0xf7, 0xa1, 0xad, + 0x1, 0xec, 0xf7, 0x36, 0xf7, 0x95, 0xf7, 0x42, 0x3, 0xf7, 0x97, 0xf7, + 0xda, 0x15, 0xf7, 0x6, 0xba, 0xfb, 0x6, 0xf7, 0x67, 0x6, 0x8c, 0x1d, + 0xfb, 0x69, 0x30, 0x84, 0xa, 0x1f, 0xfb, 0x89, 0x30, 0x15, 0xf7, 0xd0, + 0x6, 0xf7, 0x90, 0xf7, 0x0, 0xf7, 0x2e, 0xf7, 0x4c, 0xf7, 0x2e, 0x30, + 0xf7, 0x4c, 0x95, 0x1d, 0xb7, 0x8f, 0x4e, 0x1f, 0xfb, 0x67, 0x30, 0x5c, + 0xe6, 0xfb, 0x7f, 0x7, 0x66, 0x77, 0x78, 0x4c, 0x1e, 0xe, 0xd6, 0x8e, + 0x76, 0xf9, 0x27, 0xae, 0xdc, 0xd9, 0x12, 0xf2, 0xb7, 0xf8, 0x44, 0xb7, + 0x17, 0x72, 0x1d, 0x37, 0xa, 0xf7, 0x37, 0xf9, 0x68, 0x45, 0x1d, 0x13, + 0x30, 0xa8, 0xa2, 0x81, 0x80, 0xa0, 0x1f, 0x7e, 0xa4, 0xa3, 0x7c, 0xaa, + 0x1b, 0x42, 0xa, 0x13, 0x10, 0x74, 0x76, 0x98, 0x98, 0x72, 0x1f, 0x97, + 0x74, 0x71, 0x96, 0x6a, 0x50, 0x1d, 0xe, 0x51, 0x1d, 0xf7, 0x7c, 0x77, + 0x57, 0x1d, 0xfb, 0x48, 0x78, 0xa, 0xfb, 0x7b, 0x58, 0x1d, 0xf7, 0x21, + 0x5e, 0xa, 0xf7, 0x21, 0x5e, 0x1d, 0xfb, 0x18, 0xfb, 0x6e, 0x1e, 0xf8, + 0xe, 0xf8, 0x21, 0x26, 0xa, 0x51, 0x1d, 0xf7, 0x7c, 0x77, 0x1, 0xae, + 0xf7, 0x45, 0xf7, 0xf6, 0x30, 0xa, 0xf7, 0xa6, 0xf8, 0x26, 0x28, 0x1d, + 0x51, 0x1d, 0x57, 0x1d, 0xfb, 0x49, 0x78, 0xa, 0xfb, 0x7a, 0x58, 0x1d, + 0xf7, 0x20, 0x5e, 0xa, 0xf7, 0x22, 0x5e, 0x1d, 0xfb, 0x18, 0xfb, 0x6e, + 0x1e, 0xf7, 0x4e, 0xf8, 0x21, 0x29, 0x1d, 0xe, 0x51, 0x1d, 0xcd, 0xd9, + 0x6e, 0xd9, 0x12, 0x5c, 0x1d, 0x13, 0xdc, 0xf7, 0x68, 0xf7, 0xea, 0x79, + 0x1d, 0xf7, 0x3e, 0x66, 0x1d, 0xfb, 0x49, 0x78, 0xa, 0xfb, 0x7a, 0x65, + 0x1d, 0xf7, 0x85, 0x45, 0xa, 0xfb, 0x2b, 0x5f, 0x1d, 0xf7, 0x20, 0x5e, + 0xa, 0xf7, 0x22, 0xfb, 0x55, 0x96, 0xa, 0x1e, 0xf7, 0x3a, 0xf8, 0x35, + 0x45, 0x1d, 0xa9, 0xa1, 0x80, 0x80, 0xa1, 0x1f, 0x13, 0xec, 0x7e, 0xa4, + 0xa2, 0x7d, 0xaa, 0x1b, 0x13, 0xdc, 0x44, 0xa, 0x13, 0xec, 0x54, 0x1d, + 0x75, 0x76, 0x98, 0x97, 0x73, 0x1f, 0x13, 0xdc, 0x97, 0x74, 0x70, 0x97, + 0x69, 0x50, 0x1d, 0xe, 0x51, 0x1d, 0xc3, 0xf7, 0x16, 0x1, 0xae, 0xf7, + 0x45, 0x94, 0xf7, 0x14, 0xdc, 0xf7, 0x14, 0x93, 0x30, 0xa, 0xf7, 0x4e, + 0xf8, 0x70, 0x15, 0x6d, 0xa, 0xf7, 0x65, 0x16, 0x6d, 0xa, 0xe, 0x3e, + 0xb0, 0x76, 0xf8, 0x6e, 0x77, 0x1, 0xbb, 0xca, 0x15, 0xb8, 0x5c, 0xf7, + 0x54, 0xf7, 0x56, 0xf7, 0x54, 0xfb, 0x56, 0xb8, 0xbb, 0xfb, 0x54, 0xf7, + 0x51, 0xf7, 0x54, 0xf7, 0x55, 0x5b, 0xb7, 0xfb, 0x51, 0xfb, 0x52, 0xfb, + 0x51, 0xf7, 0x52, 0x5b, 0x5e, 0xf7, 0x53, 0xfb, 0x54, 0x5, 0xe, 0xf7, + 0x17, 0x56, 0x76, 0xc2, 0xac, 0x93, 0x1d, 0xb9, 0x77, 0x5a, 0xa, 0xdc, + 0x41, 0x15, 0xbd, 0x6, 0xd2, 0xf3, 0x5, 0x6b, 0xc0, 0xca, 0x7a, 0xd2, + 0x1b, 0xf7, 0x61, 0xf7, 0x29, 0xf7, 0x1f, 0xf7, 0x66, 0xf7, 0x12, 0x55, + 0xf4, 0x39, 0xc8, 0x1f, 0xd9, 0xf7, 0x7, 0x5, 0x59, 0x6, 0x4c, 0x2e, + 0x5, 0xaa, 0x56, 0x4c, 0x9b, 0x48, 0x1b, 0x96, 0xa, 0xfb, 0xd, 0xbd, + 0x21, 0xdd, 0x4c, 0x1f, 0xce, 0xee, 0x15, 0x76, 0xcf, 0x8a, 0xdc, 0xb5, + 0x1a, 0xf7, 0x26, 0xb0, 0xf7, 0x3e, 0xf7, 0x20, 0xca, 0xb4, 0x68, 0x55, + 0xa6, 0x1e, 0xfb, 0x9f, 0xfc, 0x65, 0x15, 0xf7, 0xb3, 0xf8, 0x38, 0x5, + 0x9e, 0x53, 0x92, 0x40, 0x4c, 0x1a, 0x34, 0x85, 0xfb, 0x79, 0xfb, 0x3f, + 0x46, 0x61, 0xb1, 0xbf, 0x72, 0x1e, 0xe, 0x6b, 0xa, 0xf7, 0x8b, 0x77, + 0x63, 0xa, 0x9b, 0xf9, 0x15, 0x21, 0xa, 0xf8, 0x20, 0xc9, 0x26, 0xa, + 0x6b, 0xa, 0xf7, 0x8b, 0x77, 0x63, 0xa, 0xf7, 0xc8, 0xf9, 0x76, 0x22, + 0x1d, 0xfc, 0x41, 0xfb, 0x92, 0x21, 0xa, 0xe, 0x6b, 0xa, 0xf7, 0x82, + 0x77, 0x63, 0xa, 0xf7, 0x70, 0xf9, 0x76, 0x29, 0x1d, 0xfb, 0xda, 0xfb, + 0xa5, 0x21, 0xa, 0xe, 0x6b, 0xa, 0xd2, 0x9a, 0x1d, 0xed, 0xf7, 0x33, + 0x64, 0xf7, 0x16, 0xc8, 0xf7, 0x16, 0x9c, 0xb7, 0x13, 0xf6, 0x9b, 0xf9, + 0x15, 0x21, 0xa, 0x13, 0xee, 0xf7, 0x5e, 0xf7, 0x1c, 0x15, 0x2a, 0x1d, + 0xf7, 0x67, 0x38, 0x1d, 0xd6, 0x4e, 0x1d, 0xf7, 0x90, 0x77, 0x1, 0xf7, + 0xaa, 0x7f, 0x1d, 0x69, 0x1d, 0x83, 0xde, 0x1a, 0xf7, 0x4c, 0x66, 0xa, + 0xb8, 0x89, 0x64, 0x1a, 0xfb, 0x32, 0xfb, 0xa0, 0x5, 0xfb, 0x14, 0xf7, + 0x82, 0x7b, 0xa4, 0x3d, 0x1d, 0xfb, 0x27, 0x7, 0x38, 0x73, 0x93, 0x46, + 0x84, 0x1e, 0xf7, 0x3, 0xf9, 0x58, 0x28, 0x1d, 0x67, 0x8f, 0x76, 0xb1, + 0x76, 0xf7, 0x41, 0xae, 0x7d, 0xae, 0xf7, 0xa6, 0xae, 0x68, 0xf7, 0x41, + 0xfb, 0x3d, 0xf7, 0x39, 0x8f, 0x77, 0x12, 0xef, 0xf7, 0x36, 0xfb, 0x26, + 0xf7, 0x36, 0xf7, 0x29, 0xf7, 0x40, 0xfb, 0x3f, 0xf7, 0x40, 0x13, 0xa2, + 0xa0, 0xf7, 0x9a, 0xf7, 0x64, 0x15, 0xf7, 0x98, 0x7, 0x13, 0x99, 0x60, + 0xa1, 0x8c, 0x98, 0x98, 0xad, 0x1b, 0x13, 0x92, 0x50, 0xdd, 0xaf, 0x6d, + 0xfb, 0x6, 0x1f, 0x13, 0xa2, 0xa0, 0xfb, 0x10, 0x5e, 0x70, 0xfb, 0xd, + 0x1e, 0x13, 0x52, 0x60, 0xfb, 0x8a, 0xfb, 0x64, 0x15, 0xf7, 0xe2, 0xae, + 0x6, 0x13, 0x92, 0xa0, 0x46, 0x94, 0x78, 0x83, 0xdc, 0x1a, 0x13, 0xa2, + 0xa0, 0xc3, 0x7, 0x13, 0x92, 0x50, 0xf7, 0x3c, 0x8a, 0xf7, 0x3e, 0xb8, + 0xf7, 0x25, 0x1a, 0x13, 0x99, 0x60, 0xdf, 0x60, 0xe7, 0xfb, 0x79, 0x1e, + 0x13, 0x99, 0xa0, 0x49, 0x97, 0x6, 0xdc, 0x9e, 0x8b, 0xd0, 0x95, 0x1e, + 0x13, 0x94, 0x60, 0xae, 0xfb, 0xe2, 0x68, 0x7, 0x13, 0x92, 0xa0, 0xc0, + 0x86, 0xaa, 0x8a, 0x37, 0x1a, 0xfc, 0x46, 0x7, 0x31, 0x70, 0x9e, 0x52, + 0x80, 0x1e, 0xe, 0x30, 0x7f, 0xae, 0x6e, 0xf7, 0x12, 0x28, 0x76, 0xf8, + 0x9, 0xad, 0xf7, 0x94, 0xa7, 0x12, 0xd1, 0xf7, 0x1f, 0xf7, 0x16, 0xf7, + 0x1d, 0x22, 0xf7, 0x26, 0x13, 0x9e, 0x9e, 0x16, 0xad, 0x7, 0x13, 0x5d, + 0xb0, 0x91, 0x99, 0x91, 0xbe, 0x1a, 0xf8, 0x2e, 0x7, 0xf4, 0xdd, 0xda, + 0xf7, 0x8, 0xf7, 0x31, 0xbe, 0x2a, 0x55, 0x3b, 0x4b, 0x5a, 0x32, 0x7a, + 0x1e, 0x89, 0x7, 0xf7, 0x1a, 0x68, 0xc7, 0x53, 0xfb, 0x3, 0x1a, 0x36, + 0x5b, 0x51, 0x57, 0x68, 0x1e, 0x13, 0x9e, 0x7f, 0x83, 0x7d, 0x84, 0x7d, + 0x8a, 0x6e, 0x89, 0x18, 0x6e, 0x6e, 0x94, 0x9e, 0x79, 0x1f, 0x13, 0x3e, + 0x7f, 0x98, 0x83, 0x9b, 0xa0, 0x1a, 0xa8, 0x9f, 0x9e, 0xa7, 0xad, 0x97, + 0x72, 0x75, 0x1e, 0x7f, 0x88, 0x85, 0x81, 0x1a, 0x7d, 0x96, 0x88, 0x97, + 0x1e, 0xa4, 0x90, 0x88, 0xa4, 0x7e, 0xbb, 0x8, 0x85, 0xa3, 0x8d, 0xa7, + 0xab, 0x1a, 0xf7, 0x2e, 0x67, 0xa5, 0x49, 0x8e, 0x1e, 0xad, 0x7, 0x13, + 0x9d, 0xd6, 0x91, 0x86, 0xb6, 0xdf, 0x1a, 0xed, 0x6d, 0xa4, 0x62, 0x55, + 0x87, 0x57, 0x72, 0x8a, 0x1e, 0x13, 0x5e, 0xfc, 0xde, 0x7, 0xe, 0x92, + 0x50, 0xa, 0x52, 0x1d, 0x13, 0xd8, 0xf7, 0xba, 0xc3, 0x2a, 0xa, 0x84, + 0x93, 0x86, 0x92, 0x94, 0x1a, 0x13, 0xb8, 0x3b, 0x1d, 0x71, 0xf7, 0xaf, + 0x26, 0xa, 0x92, 0x50, 0xa, 0xd7, 0x76, 0xf7, 0x4d, 0x77, 0x52, 0x1d, + 0x13, 0xde, 0xf7, 0x37, 0xf8, 0xa4, 0x22, 0x1d, 0x85, 0xfd, 0x9, 0x37, + 0x1d, 0x13, 0xbe, 0x3b, 0x1d, 0xe, 0x92, 0x50, 0xa, 0xf7, 0x7b, 0x77, + 0x52, 0x1d, 0x13, 0xdc, 0xd6, 0xf8, 0xa4, 0x29, 0x1d, 0xec, 0xfd, 0x1c, + 0x23, 0x1d, 0xa2, 0x81, 0x97, 0x82, 0x96, 0x1e, 0x85, 0x92, 0x86, 0x91, + 0x36, 0x1d, 0x92, 0x50, 0xa, 0xd5, 0xd9, 0x6e, 0xd9, 0x52, 0x1d, 0x13, + 0xce, 0xc8, 0xf8, 0xb9, 0x45, 0x1d, 0xa7, 0xa2, 0x82, 0x80, 0xa1, 0x1f, + 0x13, 0xd6, 0x7d, 0xa7, 0xa5, 0x7c, 0xa5, 0x1b, 0x13, 0xce, 0x44, 0xa, + 0x13, 0xd6, 0x54, 0x1d, 0x71, 0x73, 0x96, 0x97, 0x73, 0x1f, 0x13, 0xce, + 0x98, 0x71, 0x72, 0x98, 0x71, 0x50, 0x1d, 0xf7, 0x7d, 0xfc, 0x81, 0x23, + 0x1d, 0xa2, 0x81, 0x98, 0x82, 0x95, 0x1e, 0x85, 0x92, 0x86, 0x91, 0x94, + 0x1a, 0x13, 0xb6, 0x3b, 0xa, 0x13, 0x86, 0x24, 0xa, 0xe, 0x92, 0x50, + 0xa, 0xcb, 0xf7, 0x16, 0x52, 0x1d, 0x13, 0xdc, 0xd6, 0x3f, 0xa, 0x94, + 0xfc, 0xb6, 0x23, 0x1d, 0xa2, 0x80, 0x97, 0x83, 0x95, 0x1e, 0x85, 0x92, + 0x86, 0x92, 0x36, 0x1d, 0x92, 0x76, 0xf7, 0xbb, 0xf7, 0x54, 0xc1, 0xbb, + 0x5b, 0xf7, 0x38, 0xfb, 0x8, 0xf7, 0x8, 0x8b, 0xbc, 0x12, 0xa4, 0xf7, + 0x26, 0x69, 0xf7, 0x38, 0xfb, 0x8, 0xf7, 0x39, 0x13, 0xd5, 0x0, 0xf7, + 0x1d, 0x94, 0xa, 0x13, 0xee, 0x80, 0x7d, 0x1d, 0x1f, 0xf7, 0x31, 0xfc, + 0xd5, 0x37, 0x1d, 0x3b, 0x1d, 0xfb, 0x0, 0xf8, 0x18, 0x15, 0xab, 0xa5, + 0xa5, 0xab, 0xab, 0xa5, 0x71, 0x6b, 0x6b, 0x71, 0x71, 0x6b, 0x6b, 0x71, + 0xa5, 0xab, 0x1e, 0xe, 0xd6, 0x7d, 0xca, 0x4c, 0xd1, 0xf7, 0x54, 0xb0, + 0x8a, 0xf7, 0x51, 0x6b, 0xab, 0x12, 0xac, 0xf7, 0x29, 0xfb, 0x18, 0xf7, + 0x18, 0xf7, 0x6, 0xf7, 0x1e, 0xf7, 0x1d, 0xf7, 0xd, 0x13, 0x6d, 0x80, + 0xf7, 0xe5, 0xd6, 0x15, 0x37, 0xba, 0xcf, 0x86, 0xb0, 0x1b, 0xde, 0xce, + 0xb1, 0xe4, 0xc1, 0x1f, 0x76, 0x9a, 0x5, 0x72, 0x77, 0x69, 0x5c, 0x42, + 0x1b, 0xfb, 0x3, 0x8b, 0xf7, 0xf, 0xb9, 0x1f, 0xa2, 0xf7, 0x96, 0x7, + 0x13, 0x93, 0x80, 0xf7, 0x41, 0x8c, 0xfb, 0x1, 0xbf, 0x39, 0x1b, 0x4b, + 0x65, 0x73, 0x70, 0x71, 0x1f, 0xa0, 0x76, 0x66, 0xa9, 0x29, 0x1b, 0x27, + 0x47, 0x52, 0x47, 0x5f, 0xae, 0x77, 0xa8, 0xb8, 0xa2, 0x9d, 0xb3, 0xa1, + 0x83, 0x95, 0x84, 0x93, 0x1f, 0x84, 0x92, 0x84, 0x91, 0x97, 0x1a, 0x13, + 0xad, 0x80, 0xa1, 0xaf, 0x97, 0xa8, 0xdb, 0x89, 0x57, 0x6e, 0x1e, 0x3b, + 0x7, 0xfb, 0x45, 0x52, 0x35, 0x6f, 0x23, 0x1a, 0x46, 0xb6, 0x67, 0xd7, + 0xe1, 0xc6, 0xbc, 0xad, 0xad, 0x1e, 0x68, 0x97, 0x15, 0x6c, 0x6e, 0x79, + 0x8a, 0x78, 0x1b, 0x5e, 0x83, 0xb7, 0xa7, 0xdb, 0xcb, 0xa7, 0xc2, 0x9e, + 0x1f, 0xf7, 0x1e, 0xb0, 0x15, 0xcb, 0x8b, 0xe9, 0xcf, 0xbf, 0x9c, 0x67, + 0x32, 0x1e, 0x6a, 0x7, 0xe, 0xfb, 0x5f, 0xfb, 0x59, 0x76, 0xf7, 0x63, + 0xcb, 0x86, 0x1d, 0xea, 0xe8, 0x4e, 0xf7, 0x10, 0x13, 0xdc, 0xf7, 0x44, + 0x2b, 0x15, 0x4f, 0x1d, 0xb1, 0xf7, 0x5, 0x8e, 0xda, 0xc7, 0x49, 0xa6, + 0x54, 0x7c, 0x1f, 0xa1, 0xbe, 0xd3, 0x8f, 0xc7, 0xb2, 0xb6, 0xc8, 0x19, + 0x79, 0x9d, 0x5, 0x70, 0x73, 0x71, 0x6e, 0x52, 0x1b, 0x3d, 0x4e, 0xdc, + 0xf7, 0x20, 0xb8, 0x98, 0xf7, 0xf, 0xd9, 0x1f, 0x13, 0xea, 0x9a, 0x9f, + 0x82, 0x6d, 0x8f, 0x1d, 0x33, 0xb0, 0x44, 0x1f, 0x13, 0x4a, 0x2d, 0xfb, + 0x1e, 0x4e, 0xfb, 0x59, 0xfb, 0x7, 0xd6, 0x27, 0xf7, 0x6, 0x80, 0x1f, + 0xe, 0x4c, 0x1d, 0x78, 0xfb, 0x4, 0x5b, 0x94, 0x1e, 0xfb, 0x1c, 0x79, + 0xa, 0x13, 0xd8, 0x2b, 0x1d, 0xde, 0xf7, 0xaf, 0x26, 0xa, 0x4c, 0x1d, + 0x86, 0xfb, 0x9, 0x60, 0x8d, 0x1e, 0xfb, 0x23, 0x80, 0xa, 0x1e, 0x13, + 0xd8, 0x2b, 0x1d, 0x76, 0xf7, 0xaf, 0x28, 0x1d, 0x49, 0x1d, 0xd7, 0x83, + 0x1d, 0xa4, 0x8a, 0xa, 0x4d, 0xa, 0x82, 0xfb, 0x4, 0x5b, 0x92, 0x1e, + 0xfb, 0x24, 0x80, 0xa, 0x34, 0xa, 0x1e, 0x39, 0x1d, 0xfb, 0x1, 0xf7, + 0xaf, 0x29, 0x1d, 0xe, 0x49, 0x1d, 0xcb, 0xf7, 0x16, 0x98, 0xa, 0x21, + 0xf7, 0x16, 0xdb, 0xf7, 0x16, 0x13, 0xfa, 0x4d, 0xa, 0x7d, 0xfb, 0x4, + 0x5b, 0x92, 0x1e, 0xfb, 0x1f, 0x79, 0xa, 0x2b, 0x1d, 0x13, 0xf6, 0xfb, + 0x3, 0xf7, 0xf9, 0x40, 0x1d, 0x3e, 0xa, 0xfb, 0xa6, 0x7, 0x5b, 0x7a, + 0x88, 0x67, 0x82, 0x1e, 0xf7, 0x1f, 0xf8, 0x82, 0x29, 0xa, 0x81, 0x7f, + 0xa, 0x99, 0x7c, 0xa4, 0x7c, 0x1f, 0xe, 0x3e, 0xa, 0xfb, 0xa9, 0x7, + 0x5b, 0x7a, 0x8b, 0x67, 0x82, 0x1e, 0xae, 0xf8, 0x82, 0x56, 0x1d, 0xf7, + 0x22, 0xe3, 0x5, 0xa3, 0x9a, 0x9c, 0x95, 0xa7, 0x1a, 0xaf, 0x6b, 0x2c, + 0xa, 0xe, 0x5d, 0xa, 0xf7, 0x0, 0x83, 0x1d, 0xd0, 0x8a, 0xa, 0x67, + 0xf8, 0xa4, 0x56, 0x1d, 0xf7, 0x3, 0xed, 0xf7, 0x5, 0x29, 0x5, 0xc4, + 0x6, 0xfb, 0x10, 0xf7, 0x44, 0x5, 0x2f, 0x6, 0x46, 0xfd, 0x54, 0x15, + 0x33, 0xa, 0xe, 0xfc, 0x5, 0xa0, 0x76, 0xf8, 0xad, 0x9a, 0x1d, 0x67, + 0xf7, 0x13, 0x75, 0xf7, 0x1f, 0x69, 0xf7, 0x13, 0x13, 0xd0, 0x49, 0xa, + 0x13, 0xe8, 0x57, 0xf8, 0xcd, 0x15, 0x6c, 0x1d, 0xf7, 0x66, 0x16, 0x6c, + 0x1d, 0xe, 0x65, 0xa, 0xf7, 0x6e, 0x77, 0x12, 0x5d, 0x1d, 0xfb, 0x1c, + 0xf7, 0x27, 0x13, 0xf8, 0xf7, 0x40, 0xf7, 0x83, 0x78, 0x1d, 0xe4, 0xd5, + 0xc8, 0x9c, 0x5a, 0x64, 0xa, 0x2c, 0x46, 0x3b, 0x8b, 0xf7, 0x6, 0xf7, + 0x0, 0x1e, 0x13, 0xf4, 0xf7, 0x3c, 0xf7, 0x55, 0x15, 0xab, 0x73, 0x6b, + 0x94, 0x6a, 0x1b, 0xfb, 0x1f, 0x34, 0x22, 0xfb, 0x15, 0xfb, 0x16, 0xe2, + 0xfb, 0xf, 0xf7, 0x1f, 0x1f, 0x13, 0xf8, 0xf7, 0x1c, 0xe4, 0xf6, 0xf7, + 0x26, 0xf7, 0x36, 0x4e, 0xf7, 0x2e, 0x3b, 0xc6, 0x1f, 0xe7, 0xba, 0x5a, + 0xa9, 0x31, 0x5d, 0x55, 0xa8, 0x51, 0x98, 0x5b, 0x8f, 0x19, 0x5d, 0x72, + 0xb8, 0x83, 0xb9, 0x78, 0xb5, 0x6c, 0x19, 0xfb, 0x9, 0x50, 0xbb, 0x6c, + 0xf7, 0x2, 0xc3, 0xb1, 0x66, 0xa9, 0x5c, 0x9d, 0x54, 0x19, 0xe, 0x30, + 0x82, 0x1d, 0xd5, 0xd9, 0x6e, 0xd9, 0x12, 0xd5, 0x53, 0xa, 0x13, 0xdc, + 0xa0, 0x41, 0xa, 0x8d, 0x8b, 0xaa, 0xa3, 0x1a, 0x76, 0xa, 0x36, 0x60, + 0x4f, 0x73, 0x7d, 0x1e, 0x88, 0x1d, 0xb3, 0x85, 0x98, 0x83, 0x5e, 0x1a, + 0xfb, 0xa9, 0x7, 0x5a, 0x7a, 0x8a, 0x67, 0x84, 0x1e, 0xd6, 0xf8, 0x97, + 0x45, 0x1d, 0xa6, 0xa3, 0x80, 0x80, 0xa3, 0x1f, 0x13, 0xec, 0x7e, 0xa6, + 0xa5, 0x7d, 0xa4, 0x1b, 0x13, 0x10, 0x42, 0xa, 0x6d, 0x8f, 0xa, 0x6d, + 0x50, 0x1d, 0xe, 0x65, 0xa, 0xd7, 0x98, 0x1d, 0x5d, 0x1d, 0x3, 0xf7, + 0x40, 0xf7, 0x90, 0x78, 0x1d, 0xd7, 0xd5, 0xc8, 0x9c, 0x5f, 0x64, 0xa, + 0x27, 0x46, 0x3b, 0x8b, 0xf7, 0x13, 0xf7, 0x0, 0x1e, 0xfb, 0x27, 0x75, + 0x15, 0xfb, 0x16, 0xe2, 0xfb, 0x6, 0x70, 0xa, 0xf7, 0x4, 0x6f, 0xa, + 0xf2, 0x70, 0x1d, 0xfb, 0x6, 0xfb, 0x15, 0x1e, 0xf7, 0x8d, 0xf7, 0xbe, + 0x56, 0x1d, 0x49, 0xd7, 0x64, 0xbd, 0x70, 0xa6, 0x8, 0xaa, 0x6c, 0x7c, + 0x8c, 0x80, 0x1b, 0x65, 0x80, 0x7f, 0xa, 0xa5, 0x75, 0xa4, 0x7b, 0x1f, + 0xe, 0x65, 0xa, 0xd7, 0x76, 0xf7, 0x4d, 0x32, 0xa, 0xf7, 0x27, 0xf7, + 0xbf, 0x28, 0x1d, 0x65, 0xa, 0xd7, 0x76, 0xf7, 0x44, 0x32, 0xa, 0xc4, + 0xf7, 0xbf, 0x60, 0xa, 0x65, 0xa, 0xd5, 0xd9, 0x6e, 0xd9, 0x12, 0x5d, + 0x1d, 0x13, 0xdc, 0x25, 0xa, 0xc0, 0xf7, 0xd4, 0x45, 0x1d, 0xa7, 0xa6, + 0x7f, 0x7f, 0xa4, 0x1f, 0x13, 0xec, 0x7f, 0xa4, 0xa3, 0x7e, 0xa3, 0x1b, + 0x13, 0x10, 0x42, 0xa, 0x6c, 0x8f, 0xa, 0x6e, 0x50, 0x1d, 0xe, 0x65, + 0xa, 0xcc, 0xf7, 0x15, 0x12, 0xa4, 0xf7, 0x27, 0x30, 0xf7, 0x15, 0xdc, + 0xf7, 0x15, 0x30, 0xf7, 0x27, 0x13, 0xf2, 0x25, 0xa, 0x13, 0xec, 0xc3, + 0xf8, 0x9, 0x2d, 0x1d, 0x3e, 0x6c, 0xef, 0x27, 0xf7, 0x2a, 0xe5, 0xe2, + 0x40, 0xcb, 0xef, 0xf7, 0x2c, 0x27, 0xef, 0x12, 0xf7, 0x65, 0xf7, 0x2d, + 0xfb, 0x13, 0xef, 0x13, 0x5a, 0xad, 0xf7, 0x71, 0x15, 0xf8, 0x8b, 0xcb, + 0xfc, 0x8b, 0x6, 0x13, 0xa5, 0xf7, 0x5d, 0xfb, 0x9e, 0x15, 0x6c, 0xa, + 0xf8, 0x68, 0x4, 0x6c, 0xa, 0xe, 0x44, 0x76, 0xd9, 0xaa, 0xf7, 0xd9, + 0x76, 0xf7, 0xd, 0xaa, 0xd7, 0x77, 0x12, 0xa2, 0xf7, 0x27, 0xfb, 0x25, + 0xf7, 0x27, 0xf7, 0x31, 0xf7, 0x27, 0x13, 0xfd, 0xf7, 0x41, 0xf7, 0x23, + 0x15, 0x13, 0xfb, 0x8a, 0xa5, 0x8b, 0xa4, 0xa9, 0x1a, 0xf7, 0x6, 0x90, + 0xf3, 0xd5, 0xad, 0x9f, 0x78, 0x62, 0x96, 0x1e, 0xfb, 0x21, 0xfb, 0x83, + 0x5, 0xfb, 0x21, 0xfb, 0x7f, 0x15, 0xba, 0x6, 0xca, 0xf4, 0x5, 0x7a, + 0xa9, 0xb0, 0x81, 0xb3, 0x1b, 0xf7, 0x1c, 0xe4, 0xf4, 0xf7, 0x19, 0xde, + 0x69, 0xd7, 0x55, 0xb6, 0x1f, 0xd4, 0xf7, 0xf, 0x5, 0x5d, 0x6, 0x4f, + 0x26, 0x5, 0x9b, 0x6e, 0x67, 0x94, 0x64, 0x1b, 0xfb, 0x1f, 0x34, 0xfb, + 0xc, 0xfb, 0x15, 0x3e, 0xaa, 0x49, 0xc1, 0x5e, 0x1f, 0xd4, 0xb7, 0x15, + 0xf7, 0x22, 0xf7, 0x85, 0x5, 0x8d, 0x6, 0x8c, 0x72, 0x8c, 0x67, 0x67, + 0x1a, 0xfb, 0x13, 0x83, 0x3b, 0x46, 0x64, 0x77, 0xa3, 0xb2, 0x81, 0x1e, + 0xe, 0x30, 0x7d, 0xcc, 0xf8, 0x2e, 0x77, 0xf7, 0x0, 0x98, 0x1d, 0xcc, + 0x53, 0xa, 0x3, 0x89, 0x1d, 0x49, 0x89, 0xa, 0x8d, 0x28, 0xa, 0x5b, + 0xf8, 0x70, 0x26, 0xa, 0x30, 0x7d, 0xcc, 0xf8, 0x2e, 0x77, 0xf7, 0x0, + 0x98, 0x1d, 0xcc, 0x53, 0xa, 0x3, 0x71, 0xa, 0x27, 0x1d, 0x6c, 0x7, + 0xb4, 0x84, 0x93, 0x7c, 0x38, 0xa, 0xfb, 0x2c, 0xf8, 0x70, 0x28, 0x1d, + 0x30, 0x7d, 0xcc, 0xf8, 0x2e, 0x77, 0xf7, 0x0, 0x83, 0x1d, 0xcc, 0x53, + 0xa, 0x3, 0x2f, 0x1d, 0xfb, 0x84, 0xf8, 0x70, 0x29, 0x1d, 0xe, 0x30, + 0x7d, 0xcc, 0xf8, 0x7a, 0x9a, 0x1d, 0xcc, 0xf7, 0x1f, 0x26, 0xf7, 0x13, + 0xde, 0xf7, 0x13, 0x29, 0xf7, 0x1f, 0x13, 0xe4, 0x2f, 0x1d, 0x13, 0xd8, + 0xfb, 0x84, 0xf8, 0xba, 0x15, 0x6d, 0x1d, 0xf7, 0x66, 0x16, 0x6d, 0x1d, + 0xe, 0xfb, 0x61, 0xf7, 0x23, 0xf8, 0x9f, 0x77, 0xf7, 0x0, 0x76, 0xf7, + 0x4d, 0x77, 0x12, 0x9b, 0xf7, 0xe, 0xfb, 0xe, 0xf8, 0x64, 0xfb, 0x2b, + 0xf7, 0x2b, 0x13, 0x8a, 0x13, 0x4, 0xf7, 0x80, 0x7e, 0x15, 0x40, 0x72, + 0x2f, 0xa, 0x5, 0x13, 0x72, 0x9e, 0xbd, 0x9c, 0x8d, 0xa1, 0x8e, 0x8, + 0x13, 0x74, 0x4d, 0x1d, 0x13, 0xfa, 0x36, 0xa, 0xf7, 0x4, 0xf7, 0x14, + 0x28, 0x1d, 0x7c, 0xa, 0xf7, 0x5f, 0x77, 0x1, 0xd6, 0xf7, 0x1f, 0xf7, + 0x36, 0xf7, 0x28, 0x3, 0x81, 0xa, 0x90, 0x1d, 0x6f, 0x6a, 0xa0, 0xb3, + 0x7b, 0x1e, 0x7a, 0x1d, 0x93, 0xbe, 0x58, 0xa, 0x7c, 0x1f, 0x89, 0xf7, + 0xad, 0xfb, 0x56, 0x69, 0x6, 0xaf, 0x84, 0x9e, 0x87, 0x5c, 0x1a, 0xfd, + 0x4d, 0x92, 0xa, 0xfb, 0x61, 0xf7, 0x23, 0xf8, 0xec, 0xf7, 0x15, 0x12, + 0x9b, 0xf7, 0x56, 0xfb, 0x15, 0xf7, 0x15, 0xdc, 0xf7, 0x15, 0x13, 0xe8, + 0xf7, 0x80, 0x7e, 0x15, 0x40, 0x72, 0x2b, 0xa, 0x13, 0xd8, 0xa2, 0xf7, + 0x5e, 0x2d, 0x1d, 0x5d, 0xa, 0x1, 0xd0, 0x8a, 0xa, 0x49, 0xa, 0xe, + 0x9f, 0x8b, 0xaa, 0xf8, 0xf6, 0x60, 0x1d, 0x38, 0x96, 0x1d, 0xf7, 0x59, + 0x7, 0xf7, 0xf, 0xd7, 0x5, 0xc8, 0x7, 0xfb, 0xf, 0x3f, 0x5, 0xf7, + 0x6a, 0x7, 0xc7, 0xaa, 0x9e, 0xd1, 0x8e, 0x1e, 0xae, 0xfb, 0xf1, 0x68, + 0x7, 0xb8, 0x88, 0xb4, 0x7e, 0x49, 0x1a, 0xfb, 0xc9, 0x7, 0x3a, 0x5a, + 0x5, 0x4e, 0x7, 0xdc, 0xbc, 0x5, 0x25, 0x7, 0x62, 0x6d, 0x87, 0x53, + 0x8b, 0xa, 0xfc, 0x5, 0x8b, 0xad, 0xf9, 0x16, 0x77, 0x1, 0xce, 0x8a, + 0xa, 0x9b, 0x16, 0x99, 0xa, 0x64, 0x81, 0xaa, 0xa8, 0x1f, 0xf7, 0xd1, + 0x7, 0xec, 0xdb, 0x5, 0xbd, 0x7, 0x2a, 0x3b, 0x5, 0xf7, 0x6b, 0x8d, + 0xa, 0xfb, 0x68, 0x7, 0x32, 0x43, 0x5, 0x59, 0x7, 0xe4, 0xd3, 0x5, + 0xfb, 0x78, 0x97, 0x1d, 0xf7, 0xf5, 0x8b, 0xa6, 0x70, 0xae, 0x78, 0x76, + 0xf7, 0xe6, 0xac, 0xf7, 0xa7, 0xae, 0x73, 0xab, 0x12, 0xa1, 0xf7, 0x3e, + 0xf7, 0xac, 0xf7, 0x2f, 0x13, 0x97, 0xf8, 0x6c, 0xf7, 0x68, 0x15, 0xfb, + 0x14, 0x8b, 0x52, 0x21, 0x34, 0x34, 0xa7, 0xf7, 0xa1, 0xf7, 0x9, 0x9f, + 0xf7, 0x67, 0xf7, 0x35, 0xee, 0x8b, 0x51, 0x30, 0x1e, 0xf7, 0x2f, 0xfb, + 0x3e, 0x15, 0xf7, 0xc, 0x93, 0x46, 0x33, 0x98, 0x1f, 0xac, 0xf7, 0xe6, + 0x6a, 0x6, 0xfb, 0x2, 0x73, 0x8d, 0x65, 0xfb, 0xb, 0x1b, 0xf7, 0x8d, + 0x7, 0x13, 0x9b, 0xa3, 0x9b, 0x8d, 0xc4, 0xf7, 0x43, 0x99, 0x42, 0x2e, + 0x9a, 0x1e, 0xaf, 0xf7, 0x5d, 0xfc, 0x30, 0x6, 0x13, 0x37, 0x79, 0xfb, + 0x4, 0x93, 0x79, 0x1b, 0xfb, 0xc6, 0x57, 0xfb, 0x86, 0x2c, 0xfb, 0x79, + 0xf7, 0x19, 0xfb, 0xf, 0xf7, 0x5e, 0x1f, 0x13, 0x9b, 0xc3, 0xa7, 0x90, + 0xcf, 0x1b, 0xf8, 0x42, 0x6, 0xb5, 0xf7, 0x67, 0x5, 0x70, 0x6, 0x13, + 0x5b, 0xfb, 0x33, 0x47, 0x2c, 0x7a, 0x2b, 0x1b, 0x47, 0x8b, 0xa2, 0xa4, + 0x1f, 0xe, 0xd6, 0x7d, 0xa9, 0x6d, 0xd3, 0xf7, 0x4f, 0xb0, 0xf7, 0x36, + 0xa8, 0x12, 0xa1, 0xf7, 0x25, 0xf7, 0x1c, 0xf7, 0x1c, 0xf7, 0x18, 0xf7, + 0x11, 0x13, 0x7e, 0xf8, 0x50, 0xf7, 0xae, 0x15, 0xe0, 0x8c, 0x8b, 0xd8, + 0xc9, 0x1b, 0xc4, 0x8f, 0x4e, 0x26, 0x8e, 0x1f, 0xfb, 0x50, 0xfb, 0x8c, + 0x15, 0x7a, 0x9a, 0xa5, 0x6c, 0xda, 0x1b, 0xf6, 0xbe, 0xd4, 0xbd, 0xae, + 0x1f, 0x77, 0x9b, 0x5, 0x6a, 0x6e, 0x6e, 0x69, 0x4c, 0x1b, 0xfb, 0x1, + 0x87, 0xf7, 0xe, 0xcc, 0x8d, 0x1f, 0xf7, 0x90, 0x6, 0xf7, 0xe, 0x89, + 0x64, 0xf5, 0xfb, 0x28, 0x1b, 0x4e, 0x5d, 0x6f, 0x76, 0x70, 0x1f, 0x9b, + 0x7b, 0x6a, 0xac, 0x38, 0x1b, 0xfb, 0x19, 0x35, 0xfb, 0x2, 0xfb, 0x1c, + 0xfb, 0xd, 0xd9, 0xfb, 0xc, 0xf7, 0x21, 0xe2, 0xae, 0xaa, 0x9c, 0x9f, + 0x1f, 0x40, 0xf7, 0x7, 0x15, 0x13, 0xbe, 0x4b, 0x7c, 0x46, 0x57, 0x5e, + 0x6e, 0x8b, 0xf7, 0x67, 0xf7, 0x3e, 0xa5, 0xba, 0xbb, 0xc0, 0x99, 0x66, + 0x2b, 0x1e, 0xe, 0x30, 0x78, 0xac, 0xf8, 0x76, 0x76, 0xf7, 0x4d, 0xaa, + 0xf7, 0x73, 0x8e, 0xa, 0x17, 0x7c, 0x1d, 0x98, 0x94, 0x1d, 0xc3, 0x1b, + 0x13, 0xfc, 0x47, 0x1d, 0x13, 0xbc, 0x85, 0xa, 0x80, 0x7d, 0x90, 0x91, + 0x7b, 0x1f, 0x95, 0x71, 0x68, 0x97, 0x5a, 0x46, 0x1d, 0xf7, 0x59, 0xf8, + 0x92, 0x35, 0xa, 0xfb, 0x96, 0x7d, 0xad, 0x7f, 0x76, 0xf8, 0x59, 0xac, + 0x12, 0xa6, 0xef, 0xf7, 0x1e, 0xeb, 0x13, 0x78, 0xa4, 0x7e, 0x15, 0xa4, + 0x6, 0x9f, 0x95, 0x91, 0x93, 0x96, 0x1b, 0x90, 0x9f, 0x82, 0x83, 0xa4, + 0x1f, 0x13, 0xb8, 0x85, 0x9f, 0xa4, 0x85, 0xa1, 0x1b, 0xe8, 0xd5, 0xc6, + 0xea, 0x1f, 0xf7, 0x38, 0xfb, 0x7e, 0x74, 0xf1, 0x1a, 0xaa, 0xa2, 0xa5, + 0xaf, 0xc4, 0xbe, 0x60, 0x44, 0xa0, 0x1e, 0xa4, 0xf7, 0x25, 0x75, 0x6, + 0x83, 0x88, 0x87, 0x7f, 0x79, 0x1b, 0x81, 0x7b, 0x91, 0x91, 0x77, 0x1f, + 0x90, 0x79, 0x76, 0x90, 0x75, 0x1b, 0x2f, 0x48, 0x50, 0x33, 0x1f, 0xfb, + 0x2e, 0xf7, 0x82, 0x91, 0x2f, 0x1a, 0x6d, 0x76, 0x67, 0x59, 0xfb, 0x3, + 0x73, 0xf4, 0xa6, 0x85, 0x1e, 0x6f, 0x6, 0x13, 0x78, 0xf7, 0xf, 0xf8, + 0xc, 0x35, 0xa, 0xd6, 0x4e, 0x1d, 0xd3, 0xf7, 0x15, 0x12, 0xf7, 0x68, + 0xf7, 0x15, 0x4c, 0xf7, 0x36, 0x79, 0xf7, 0x15, 0x13, 0xe8, 0x69, 0x1d, + 0x8d, 0xde, 0x1a, 0xf7, 0x42, 0x7, 0xf7, 0x4b, 0xf7, 0xc1, 0x9f, 0xab, + 0xb0, 0x62, 0xa, 0xb0, 0x89, 0x64, 0x1a, 0xfb, 0x2a, 0xfb, 0xa0, 0x5, + 0x42, 0x1d, 0x13, 0xf4, 0xa6, 0xf9, 0x9d, 0x2d, 0x1d, 0x8c, 0xa, 0xf7, + 0x82, 0x77, 0x1, 0xa7, 0xf8, 0xf2, 0x3, 0x39, 0xa, 0xf7, 0x97, 0xf9, + 0x66, 0x35, 0xa, 0x87, 0x1d, 0xe3, 0x83, 0x1d, 0xb1, 0xa5, 0x87, 0xa, + 0x6f, 0x8e, 0x1d, 0x61, 0x8b, 0x62, 0x8c, 0xf7, 0x7b, 0xf8, 0x27, 0x18, + 0xa5, 0xfc, 0x7, 0x7, 0x84, 0xfb, 0x22, 0x5, 0xa5, 0x6, 0xa5, 0xf7, + 0x1, 0xba, 0x8b, 0xf7, 0xa, 0x8c, 0xfb, 0x7e, 0xfc, 0x25, 0x18, 0xf7, + 0x2f, 0xf8, 0x88, 0x35, 0xa, 0xfb, 0x1a, 0x76, 0xf8, 0xb9, 0xb9, 0xf7, + 0x13, 0xf7, 0x1f, 0x6d, 0xa9, 0x12, 0x8b, 0xf7, 0x0, 0xd6, 0xf7, 0x1f, + 0x13, 0xdc, 0xd5, 0xf8, 0x1e, 0x15, 0xf7, 0x8, 0x6, 0x7e, 0xfc, 0x2a, + 0x5, 0x31, 0x88, 0x65, 0x74, 0x73, 0x1b, 0x7f, 0x81, 0x93, 0x92, 0x1f, + 0x98, 0x9d, 0x8d, 0xa5, 0x1a, 0xad, 0x70, 0x9a, 0x70, 0x76, 0x6a, 0x7e, + 0x5e, 0x6a, 0xa0, 0x5f, 0xd3, 0x1e, 0x13, 0x54, 0xf7, 0x1c, 0xc4, 0xf7, + 0x23, 0xf7, 0x25, 0x9d, 0x1f, 0x96, 0xe2, 0x8a, 0xc6, 0x93, 0xf7, 0x7, + 0x8, 0xf7, 0xe, 0xb9, 0xfb, 0xe, 0xe5, 0x6, 0xae, 0x8b, 0xf7, 0x3, + 0xcc, 0x9e, 0x8e, 0x7e, 0x89, 0x1e, 0x85, 0x79, 0x77, 0x76, 0x1a, 0x13, + 0xec, 0x6f, 0xa5, 0x78, 0xa8, 0xa8, 0xa2, 0xa7, 0xab, 0x1e, 0x13, 0x60, + 0x9a, 0x7d, 0xcb, 0x2a, 0xfb, 0x31, 0x73, 0xfb, 0x54, 0x41, 0x7f, 0x1e, + 0xfb, 0xc, 0x6, 0xe, 0xfb, 0xce, 0xf8, 0xb9, 0x83, 0x1d, 0x89, 0xf8, + 0xa4, 0x60, 0xa, 0xfb, 0xce, 0xf8, 0xb9, 0x83, 0x1d, 0xf7, 0xc, 0xf8, + 0xa4, 0x52, 0xa, 0x51, 0x6, 0xfb, 0x3, 0x28, 0xfb, 0x3, 0xee, 0x5, + 0x52, 0x6, 0xe, 0xfb, 0xce, 0xf8, 0xa4, 0xd7, 0x3f, 0xf7, 0x37, 0x12, + 0x13, 0x40, 0x9a, 0xf9, 0x47, 0x15, 0x21, 0xc5, 0x52, 0xe8, 0xec, 0xc2, + 0xca, 0xef, 0x1e, 0x5f, 0x6, 0x13, 0x80, 0x6c, 0x83, 0x7c, 0x53, 0x37, + 0x1b, 0x13, 0x40, 0x30, 0x7f, 0xc6, 0xa7, 0x86, 0x1f, 0xe, 0xfb, 0xce, + 0xf8, 0xad, 0xf7, 0x16, 0x1, 0xf2, 0xf7, 0x13, 0x3, 0xf2, 0xf8, 0xef, + 0x15, 0x66, 0xa6, 0x6e, 0xb0, 0xae, 0xa7, 0xa8, 0xb0, 0xb0, 0x6f, 0xa6, + 0x68, 0x67, 0x6f, 0x6f, 0x67, 0x1e, 0xe, 0xfb, 0xce, 0xf8, 0xa3, 0xf7, + 0x39, 0xfb, 0x9, 0xf7, 0x9, 0xfb, 0x9, 0xf7, 0x39, 0x12, 0xc7, 0xf7, + 0x3a, 0xfb, 0x9, 0xf7, 0x9, 0xfb, 0x9, 0xf7, 0x38, 0x13, 0x90, 0xc7, + 0x94, 0xa, 0x13, 0x24, 0xc5, 0xbb, 0xba, 0xc6, 0xc5, 0x5c, 0xbc, 0x51, + 0x1f, 0x13, 0x90, 0x51, 0x59, 0x5b, 0x50, 0x1f, 0x13, 0x48, 0xbc, 0x16, + 0x6b, 0xa6, 0x71, 0xab, 0xab, 0xa5, 0xa5, 0xab, 0xab, 0x71, 0xa6, 0x6b, + 0x6b, 0x70, 0x70, 0x6b, 0x1e, 0xe, 0xfb, 0xce, 0xfb, 0x41, 0xd0, 0xf7, + 0x28, 0x77, 0x1, 0xe5, 0xdf, 0x3, 0xf7, 0x31, 0xb7, 0x15, 0x5b, 0x5f, + 0x78, 0x5e, 0x5e, 0x1a, 0x46, 0xd2, 0x7d, 0xb3, 0xad, 0xc9, 0xa6, 0xbb, + 0xa1, 0x1e, 0x75, 0xa1, 0x5, 0x7d, 0x75, 0x7e, 0x7d, 0x74, 0x1b, 0x63, + 0x72, 0x9d, 0xba, 0xa4, 0x98, 0xb2, 0x8f, 0x9e, 0x1f, 0xe, 0xfb, 0xce, + 0xf8, 0xb7, 0xd9, 0x6e, 0xd9, 0x12, 0x13, 0x80, 0x7b, 0xf8, 0xb7, 0x15, + 0xb5, 0x6, 0x13, 0x40, 0x9d, 0x8c, 0x9b, 0xaa, 0xab, 0x1b, 0xb5, 0xa4, + 0x7b, 0x7e, 0xa3, 0x1f, 0x80, 0x9e, 0x9d, 0x82, 0xa4, 0x1b, 0x42, 0xa, + 0x74, 0x74, 0x92, 0x94, 0x75, 0x1f, 0x99, 0x68, 0x6c, 0x9e, 0x7a, 0x1b, + 0x2f, 0x78, 0x2f, 0x68, 0x84, 0x1f, 0xe, 0xfb, 0xce, 0xf8, 0xa4, 0xf7, + 0x4d, 0x1, 0x7e, 0xf8, 0xa4, 0x15, 0xc0, 0x6, 0xf7, 0x25, 0x23, 0xa, + 0xcc, 0xfb, 0x31, 0x15, 0xc1, 0x22, 0xa, 0xe, 0xf7, 0x49, 0xe5, 0x1, + 0xf7, 0x49, 0x4, 0xf8, 0x88, 0xca, 0xfc, 0x88, 0x6, 0xe, 0xf7, 0xf5, + 0xf7, 0x49, 0xe5, 0x1, 0xf7, 0x49, 0x4, 0xfa, 0x7c, 0xc9, 0xfe, 0x7c, + 0x6, 0xe, 0xfb, 0xce, 0xf8, 0xd, 0x83, 0xa, 0xd1, 0xcf, 0x47, 0xf7, + 0x4c, 0x13, 0xd0, 0xf7, 0x8b, 0xf9, 0x31, 0x15, 0x5b, 0xa, 0xa5, 0x4d, + 0xd4, 0xb9, 0xb2, 0xa9, 0xbf, 0xca, 0x5d, 0x9b, 0x6f, 0x1e, 0x13, 0xe0, + 0x68, 0xa, 0xe, 0xfb, 0xce, 0xf8, 0xd, 0x7b, 0xa, 0xec, 0xf7, 0xf8, + 0x15, 0x47, 0xa, 0xfb, 0xce, 0xfb, 0x33, 0x7b, 0xa, 0xe1, 0xfb, 0x32, + 0x15, 0x96, 0x75, 0x5, 0x47, 0xa, 0xf7, 0xf8, 0xf7, 0x35, 0xf7, 0x42, + 0x77, 0x12, 0xab, 0xcf, 0x47, 0xf7, 0x4c, 0xe1, 0xcf, 0x47, 0xf7, 0x4c, + 0x13, 0xd8, 0xf7, 0x65, 0xf9, 0x31, 0x15, 0x57, 0xa, 0x13, 0xe4, 0x68, + 0xa, 0xf7, 0xa2, 0x16, 0x57, 0xa, 0x13, 0xe8, 0x68, 0xa, 0xe, 0xf8, + 0xd, 0x68, 0x1d, 0xf7, 0xc2, 0xf7, 0xf8, 0x15, 0x5f, 0xa, 0x13, 0xe4, + 0x3f, 0x1d, 0xfb, 0x97, 0x75, 0x15, 0x5f, 0xa, 0x13, 0xd8, 0x3f, 0x1d, + 0xe, 0xfb, 0x33, 0x68, 0x1d, 0xf7, 0xb7, 0xfb, 0x32, 0x15, 0x56, 0xa, + 0x13, 0xe4, 0x3f, 0x1d, 0xfb, 0xa2, 0x16, 0x56, 0xa, 0x13, 0xd8, 0x3f, + 0x1d, 0xe, 0xfb, 0x5, 0x76, 0xf8, 0xae, 0xf5, 0xf7, 0x49, 0x77, 0x12, + 0xf7, 0x56, 0xf7, 0x5, 0x46, 0xa7, 0x13, 0xe8, 0xf7, 0x84, 0xfb, 0x1a, + 0x15, 0xa0, 0x6, 0x90, 0xf7, 0x2e, 0x90, 0xf7, 0x14, 0xb4, 0xf6, 0x91, + 0x98, 0x19, 0x8e, 0x91, 0x4d, 0xa6, 0x8d, 0xf7, 0x25, 0x8, 0xa8, 0xa0, + 0x83, 0x83, 0x9d, 0x1f, 0x7f, 0xa4, 0x9f, 0x7d, 0xa7, 0x1b, 0xaa, 0x9f, + 0xa8, 0xa7, 0xa4, 0x7c, 0xa3, 0x66, 0x71, 0x79, 0x7d, 0x7f, 0x6f, 0x1f, + 0x7a, 0x84, 0x76, 0x84, 0x6d, 0x87, 0x8a, 0xb3, 0x91, 0xa4, 0x93, 0x9f, + 0x8, 0x13, 0xf0, 0x99, 0xad, 0x9e, 0x9b, 0xb1, 0x1a, 0xbb, 0x5f, 0x8f, + 0x7e, 0x61, 0x7d, 0x6a, 0x71, 0x67, 0xa0, 0x84, 0x98, 0x62, 0x1e, 0x13, + 0xe8, 0x91, 0x78, 0x8f, 0x72, 0x65, 0x1a, 0x6d, 0x8d, 0x78, 0x92, 0x7b, + 0x92, 0x8, 0x98, 0x70, 0x7c, 0x9a, 0x6b, 0x1b, 0x66, 0x7c, 0x72, 0x72, + 0x6f, 0x9f, 0x6e, 0xaa, 0xae, 0x96, 0x9a, 0x98, 0xa8, 0x1f, 0x9a, 0x92, + 0x9f, 0x91, 0xa9, 0x8d, 0x8, 0xfb, 0x26, 0x53, 0x72, 0x8d, 0x85, 0x1e, + 0x8e, 0x83, 0xb7, 0xfb, 0x5, 0x8f, 0xfb, 0x14, 0x8, 0xe, 0xf7, 0x83, + 0x8a, 0x15, 0x87, 0x60, 0x63, 0x55, 0x63, 0x1a, 0x6b, 0xa1, 0x6f, 0xac, + 0xac, 0xa1, 0xa7, 0xab, 0xb3, 0x63, 0xc1, 0x87, 0xb6, 0x1e, 0x67, 0x1d, + 0x8e, 0xad, 0xa0, 0xa9, 0xa7, 0x9e, 0x8, 0x5c, 0xaf, 0x87, 0xb9, 0xbb, + 0x1a, 0xbb, 0x8f, 0xb9, 0xba, 0xaf, 0x1e, 0x6f, 0x9e, 0x76, 0xa9, 0x88, + 0xad, 0x8, 0x67, 0x1d, 0x8f, 0xb6, 0xb3, 0xc1, 0xb3, 0x1a, 0xab, 0x75, + 0xa7, 0x6a, 0x6a, 0x75, 0x6f, 0x6b, 0x63, 0xb3, 0x55, 0x8f, 0x60, 0x1e, + 0x67, 0xa, 0x88, 0x69, 0x76, 0x6d, 0x6f, 0x78, 0x8, 0xba, 0x67, 0x8f, + 0x5d, 0x5b, 0x1a, 0x5b, 0x87, 0x5d, 0x5c, 0x67, 0x1e, 0xa7, 0x78, 0xa0, + 0x6d, 0x8e, 0x69, 0x8, 0x67, 0xa, 0xe, 0xfb, 0xbd, 0xf7, 0x6f, 0x76, + 0xf7, 0xac, 0x77, 0x1, 0xae, 0xf7, 0xe6, 0x15, 0x3c, 0xcb, 0x4e, 0xd7, + 0xda, 0xc8, 0xc8, 0xda, 0xd8, 0x4e, 0xca, 0x3c, 0x3f, 0x4b, 0x4c, 0x3e, + 0x1e, 0xe, 0xf7, 0xf5, 0x7e, 0xf7, 0x3d, 0x1, 0xdd, 0xf7, 0x3d, 0xf7, + 0x38, 0xf7, 0x3d, 0xf7, 0x38, 0xf7, 0x3d, 0x14, 0x70, 0xdd, 0xd4, 0x15, + 0x4a, 0xa, 0xf7, 0xe1, 0x16, 0x4a, 0xa, 0xf7, 0xe1, 0x16, 0x4a, 0xa, + 0xe, 0xf7, 0xf5, 0x7d, 0xa3, 0x87, 0x76, 0xf7, 0xe1, 0xa3, 0x8a, 0x76, + 0xb8, 0x76, 0xf7, 0xc8, 0xa3, 0x8c, 0x77, 0x12, 0xa3, 0x97, 0xa, 0xa1, + 0x97, 0xa, 0xaf, 0x97, 0xa, 0x13, 0xad, 0xf8, 0xf7, 0xec, 0xf7, 0x38, + 0x15, 0x30, 0x1d, 0xf7, 0x70, 0x16, 0x30, 0x1d, 0x13, 0x9d, 0xf8, 0xfd, + 0x94, 0xf7, 0xe2, 0x15, 0x30, 0x1d, 0x13, 0x6b, 0xf8, 0x47, 0x76, 0x1d, + 0xfb, 0xce, 0x82, 0xa, 0x1, 0xbe, 0xf7, 0x75, 0x88, 0xa, 0x81, 0x95, + 0x9b, 0x7e, 0x96, 0x1b, 0x91, 0x90, 0x75, 0xa, 0x96, 0x85, 0x8e, 0x85, + 0x80, 0x79, 0x7e, 0x82, 0x81, 0x1e, 0xfb, 0x5f, 0xfb, 0x38, 0x5, 0xe, + 0xfb, 0xce, 0x82, 0xa, 0x1, 0xf7, 0x26, 0x91, 0xa, 0x80, 0x91, 0x88, + 0x91, 0x96, 0x9d, 0x99, 0x93, 0x95, 0x59, 0xa, 0x95, 0x81, 0x7b, 0x98, + 0x80, 0x1b, 0x84, 0x87, 0x86, 0x7e, 0x6d, 0xe6, 0x25, 0xa6, 0x62, 0x1f, + 0xe, 0xfc, 0x74, 0x94, 0x76, 0xf9, 0x50, 0x77, 0x1, 0xfb, 0x2, 0x7f, + 0x15, 0xf8, 0x4b, 0xf9, 0x50, 0x5, 0x53, 0x6, 0xfc, 0x4d, 0xfd, 0x50, + 0x5, 0xe, 0xd6, 0x8b, 0xe7, 0xf7, 0x3e, 0xb3, 0xe4, 0xb3, 0xe3, 0x76, + 0xf7, 0x34, 0xab, 0x1, 0xf6, 0xf7, 0x3b, 0x3, 0x94, 0xf7, 0x9a, 0x15, + 0xed, 0x6, 0xfb, 0x2a, 0x9a, 0xf7, 0x31, 0xfb, 0x4, 0xf7, 0x15, 0x1b, + 0xf7, 0xb, 0xf3, 0xc0, 0xe2, 0xc5, 0x1f, 0x77, 0x95, 0x5, 0x64, 0x51, + 0x4c, 0x78, 0x51, 0x1b, 0xfb, 0x6, 0x2c, 0xca, 0xf6, 0x84, 0x1f, 0xf7, + 0xb8, 0x6, 0x99, 0xb3, 0x5, 0xfb, 0xc7, 0x6, 0x8a, 0x9c, 0x8a, 0x9a, + 0x9a, 0x1a, 0x99, 0x8b, 0x98, 0x8d, 0x9a, 0x1e, 0xf7, 0xd9, 0x6, 0x9a, + 0xb3, 0x5, 0xfb, 0xe3, 0x6, 0xf7, 0x20, 0x98, 0xc0, 0xe2, 0xf5, 0x1b, + 0xf7, 0x11, 0xc8, 0x4a, 0x2c, 0x96, 0x1f, 0xa5, 0xf7, 0x26, 0x6, 0xa4, + 0x49, 0x4b, 0xa0, 0x23, 0x1b, 0xfb, 0x18, 0xfb, 0x1a, 0x75, 0xfb, 0x81, + 0x4d, 0x1f, 0x34, 0x6, 0x7c, 0x63, 0x5, 0xeb, 0x6, 0x8a, 0x7d, 0x8a, + 0x7c, 0x7d, 0x1a, 0x7c, 0x8b, 0x7c, 0x8c, 0x7b, 0x1e, 0x3b, 0x6, 0xe, + 0xf7, 0xf5, 0xf7, 0xa4, 0xac, 0x7e, 0x76, 0xf8, 0x8, 0xac, 0x73, 0xa3, + 0x12, 0xf7, 0x32, 0xe8, 0xf7, 0x8a, 0xa8, 0xf7, 0xc4, 0xe8, 0x13, 0x9e, + 0xf7, 0x0, 0xf7, 0xa4, 0x15, 0xf7, 0x56, 0xac, 0x6, 0x57, 0x8f, 0x8c, + 0x8f, 0xb3, 0x1a, 0xf7, 0xbf, 0xb9, 0x7, 0xb3, 0x9d, 0x6e, 0x68, 0x93, + 0x1f, 0xa2, 0xe3, 0xfb, 0xfe, 0x33, 0xa2, 0x6, 0xae, 0x93, 0x9c, 0xa8, + 0xb3, 0x1b, 0xb9, 0xfb, 0xbf, 0x6, 0x63, 0x8c, 0x87, 0x58, 0x87, 0x1e, + 0xf7, 0xe5, 0x6a, 0x15, 0xf7, 0x19, 0xac, 0x6, 0x5c, 0x8e, 0x86, 0x91, + 0xbd, 0x1a, 0xf7, 0x5b, 0x8d, 0x7, 0x13, 0x6e, 0xf7, 0x20, 0xfb, 0xb8, + 0x5, 0x98, 0x6, 0xf7, 0x27, 0xf7, 0xba, 0x5, 0x8d, 0xfb, 0x68, 0x6, + 0x13, 0xae, 0x63, 0x8d, 0x87, 0x57, 0x87, 0x1e, 0x6a, 0xf7, 0x56, 0xac, + 0x7, 0x57, 0x8f, 0x8c, 0x8f, 0xb3, 0x1a, 0xf7, 0x86, 0x7, 0xab, 0x92, + 0x99, 0xba, 0x8d, 0x1e, 0xac, 0xfb, 0xa, 0x7, 0xfb, 0x2b, 0xfb, 0xb5, + 0xfb, 0x22, 0xf7, 0xb5, 0x5, 0xfb, 0x1f, 0x6a, 0x6, 0xa8, 0xa6, 0x81, + 0x6b, 0x99, 0x1f, 0xfb, 0x81, 0x7, 0x59, 0x86, 0x85, 0x5c, 0x88, 0x1e, + 0xe, 0x3e, 0xf7, 0x65, 0xcb, 0x1, 0xac, 0xf7, 0x65, 0x15, 0xf8, 0x8c, + 0xcb, 0xfc, 0x8c, 0x6, 0xe, 0x30, 0x8b, 0xad, 0xf8, 0x13, 0xb7, 0xf7, + 0x5c, 0xa9, 0x12, 0xd2, 0xf7, 0x1f, 0xf7, 0x1e, 0xf7, 0x10, 0xfb, 0x10, + 0xf7, 0x1f, 0x13, 0xf8, 0x75, 0x1d, 0xf3, 0x7, 0xa9, 0x8f, 0x7e, 0x76, + 0x1f, 0xfb, 0xb8, 0x7, 0x73, 0x8a, 0x6e, 0x5d, 0x87, 0x6a, 0xa, 0x13, + 0xf4, 0x65, 0x8c, 0x80, 0x9f, 0xaf, 0x1a, 0xf8, 0x12, 0x7, 0x86, 0x56, + 0x49, 0x84, 0x57, 0x1b, 0x21, 0x6, 0xf7, 0x15, 0x88, 0xd2, 0xe0, 0xb7, + 0x9b, 0x78, 0x82, 0x1e, 0x87, 0x82, 0x7f, 0x73, 0x1a, 0x5c, 0xbc, 0x84, + 0x99, 0x1e, 0x13, 0xf8, 0x90, 0xc8, 0x8c, 0xc7, 0xdf, 0xfb, 0x3a, 0x92, + 0x7d, 0xfb, 0x6c, 0x87, 0xfb, 0x38, 0x49, 0x8a, 0x7a, 0xa, 0xe, 0x30, + 0xa0, 0x76, 0xf8, 0x35, 0xb7, 0xf7, 0x59, 0xac, 0x8a, 0x77, 0x12, 0xd2, + 0x53, 0xa, 0x13, 0xdc, 0x75, 0x1d, 0xf7, 0x1e, 0xfb, 0xda, 0x7, 0x78, + 0x8a, 0x6b, 0x5d, 0x85, 0x6a, 0xa, 0x59, 0x8f, 0x8c, 0xb6, 0x95, 0x1a, + 0xf8, 0xeb, 0x78, 0x7, 0x5c, 0x6d, 0x5, 0x13, 0xec, 0xaa, 0x47, 0x4e, + 0x8b, 0x87, 0x1b, 0xfb, 0x52, 0x72, 0xfb, 0x1a, 0x2b, 0x89, 0x7a, 0xa, + 0xf7, 0x58, 0xf8, 0x3f, 0x15, 0xc9, 0x7, 0xc6, 0x87, 0xd7, 0xdd, 0xae, + 0x9c, 0x84, 0x7b, 0x1e, 0x83, 0x7e, 0x79, 0x7d, 0x1a, 0x78, 0x97, 0x7c, + 0x94, 0x89, 0x1e, 0x29, 0x7, 0xe, 0x78, 0x9e, 0xf8, 0x61, 0x97, 0xf7, + 0x5f, 0x9a, 0x6, 0xf7, 0xa0, 0x92, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff, + 0xc, 0x9, 0xb5, 0xa, 0xf7, 0x1d, 0xb, 0x8c, 0xc, 0xe, 0xf8, 0x88, + 0x14, 0xf9, 0x1b, 0x15, 0xaf, 0x13, 0x0, 0x7a, 0x2, 0x0, 0x1, 0x0, + 0x2d, 0x0, 0x6e, 0x0, 0x74, 0x0, 0x81, 0x0, 0x86, 0x0, 0xb2, 0x0, + 0xb5, 0x0, 0xcf, 0x0, 0xd4, 0x0, 0xe3, 0x0, 0xec, 0x0, 0xfa, 0x1, + 0x3, 0x1, 0xf, 0x1, 0x1a, 0x1, 0x40, 0x1, 0x58, 0x1, 0x66, 0x1, + 0x6e, 0x1, 0x73, 0x1, 0x84, 0x1, 0x92, 0x1, 0xa5, 0x1, 0xdc, 0x1, + 0xec, 0x2, 0x21, 0x2, 0x2c, 0x2, 0x38, 0x2, 0x46, 0x2, 0x4f, 0x2, + 0x5f, 0x2, 0x88, 0x2, 0xb0, 0x2, 0xbf, 0x2, 0xc4, 0x2, 0xcd, 0x2, + 0xd6, 0x2, 0xe0, 0x2, 0xf4, 0x2, 0xfb, 0x3, 0x9, 0x3, 0xe, 0x3, + 0x20, 0x3, 0x28, 0x3, 0x3b, 0x3, 0x47, 0x3, 0x4c, 0x3, 0x58, 0x3, + 0x60, 0x3, 0x6f, 0x3, 0x78, 0x3, 0x7f, 0x3, 0x85, 0x3, 0x9f, 0x3, + 0xac, 0x3, 0xbb, 0x3, 0xd4, 0x3, 0xe2, 0x3, 0xe7, 0x3, 0xf4, 0x3, + 0xf9, 0x4, 0x1, 0x4, 0x8, 0x4, 0x12, 0x4, 0x1a, 0x4, 0x1e, 0x4, + 0x27, 0x4, 0x30, 0x4, 0x36, 0x4, 0x3c, 0x4, 0x47, 0x4, 0x5b, 0x4, + 0x66, 0x4, 0x71, 0x4, 0x78, 0x4, 0x7f, 0x4, 0x91, 0x4, 0x9a, 0x4, + 0xac, 0x4, 0xb2, 0x4, 0xb8, 0x4, 0xc1, 0x4, 0xcb, 0x4, 0xdb, 0x4, + 0xdf, 0x4, 0xe8, 0x4, 0xf1, 0x4, 0xf6, 0x4, 0xfb, 0x5, 0x9, 0x5, + 0x17, 0x5, 0x1f, 0x5, 0x2c, 0x5, 0x39, 0x5, 0x3e, 0x5, 0x42, 0x5, + 0x4e, 0x5, 0x5a, 0x5, 0x60, 0x5, 0x66, 0x5, 0x71, 0x5, 0x7c, 0x5, + 0x87, 0x5, 0x92, 0x5, 0x99, 0x5, 0x9e, 0x5, 0xa2, 0x5, 0xa5, 0x5, + 0xaf, 0x5, 0xb9, 0x5, 0xc3, 0x5, 0xcd, 0x5, 0xd4, 0x5, 0xde, 0x5, + 0xe5, 0x5, 0xee, 0x5, 0xf7, 0x6, 0x0, 0x6, 0x9, 0x6, 0xf, 0x6, + 0x14, 0x6, 0x19, 0x9b, 0x9b, 0xaa, 0xa7, 0xd3, 0x1e, 0xf7, 0x75, 0x6, + 0x99, 0x6b, 0xab, 0x4b, 0x70, 0x1a, 0x6a, 0x79, 0x8a, 0x4d, 0x86, 0x1e, + 0x68, 0xf7, 0xd8, 0xae, 0x7, 0x5b, 0x89, 0x87, 0x95, 0x7e, 0xaa, 0xfb, + 0x9f, 0xf8, 0xfc, 0x18, 0x6f, 0x6, 0xfb, 0x8f, 0xfc, 0xf8, 0xb, 0x15, + 0xc3, 0x85, 0xa5, 0x96, 0x37, 0x1a, 0xfb, 0xe5, 0x7, 0xfb, 0x4d, 0xf7, + 0x30, 0x50, 0xf7, 0x1c, 0xf7, 0x36, 0xd2, 0xdd, 0xf7, 0x36, 0x1e, 0xf7, + 0xe5, 0x7, 0xcd, 0xa2, 0x90, 0x43, 0xa, 0x7d, 0x4e, 0x1a, 0xfb, 0xe5, + 0x7, 0x4b, 0x7e, 0xfb, 0x17, 0xfb, 0x44, 0xfb, 0x24, 0x96, 0xf7, 0x1e, + 0xc4, 0x1e, 0xf7, 0xe5, 0x7, 0xe3, 0xaa, 0x7f, 0xcd, 0x8e, 0x1e, 0xae, + 0xfb, 0xe6, 0x7, 0xb, 0x6, 0xf7, 0x22, 0x23, 0xa, 0xb, 0xe3, 0x5, + 0xa3, 0x9a, 0x9b, 0x95, 0xa7, 0x1a, 0xaf, 0x6c, 0x2c, 0xa, 0xb, 0x44, + 0x1d, 0x26, 0x1d, 0xb, 0xf7, 0x40, 0xf7, 0x79, 0x78, 0x1d, 0xee, 0xd5, + 0xc8, 0x9c, 0x50, 0x64, 0xa, 0x36, 0x46, 0x3b, 0x8b, 0xf3, 0xf7, 0x0, + 0x1e, 0xfb, 0x27, 0x16, 0xfb, 0x16, 0xe2, 0xfb, 0x5, 0x70, 0xa, 0xf7, + 0x2, 0x6f, 0xa, 0xf4, 0x70, 0x1d, 0xfb, 0x7, 0xfb, 0x15, 0x1e, 0xb, + 0x24, 0x1d, 0xe, 0x1, 0xf7, 0x5, 0x7f, 0x1d, 0x9f, 0x16, 0xf7, 0xf2, + 0xae, 0x6, 0x34, 0x1d, 0xfb, 0xf2, 0x68, 0x7, 0x4b, 0xa, 0x4d, 0x64, + 0x87, 0x55, 0x86, 0x1e, 0xb, 0x6b, 0x1d, 0x25, 0x1d, 0xb, 0x56, 0x1d, + 0xfb, 0x1d, 0xf7, 0x31, 0x5, 0x98, 0x80, 0x77, 0x9a, 0x76, 0x1b, 0x65, + 0xb, 0x23, 0x1d, 0xa1, 0x81, 0x97, 0x83, 0x95, 0x1e, 0xb, 0x2f, 0xa, + 0x9e, 0xbd, 0x9c, 0x8d, 0xa1, 0x8e, 0x19, 0x4d, 0x1d, 0x36, 0xa, 0xb, + 0x93, 0x79, 0x81, 0x78, 0x89, 0x71, 0x74, 0x1e, 0xb, 0x2c, 0x1d, 0xfb, + 0xa9, 0x7, 0x5b, 0x7a, 0x8b, 0x67, 0x82, 0x1e, 0xb, 0x5, 0xc4, 0x6, + 0xfb, 0xf, 0xf7, 0x44, 0x5, 0x2f, 0x6, 0xb, 0x72, 0x4f, 0x69, 0x1b, + 0x7f, 0x86, 0x97, 0x90, 0x1f, 0x8f, 0x8e, 0x90, 0x94, 0x1a, 0x9d, 0x80, + 0xac, 0x5e, 0x4f, 0x85, 0x58, 0x7d, 0x6b, 0xa6, 0x5d, 0xcc, 0xe9, 0xa0, + 0xc4, 0xf7, 0x19, 0xbd, 0x1e, 0xf7, 0x29, 0xf8, 0x17, 0xb, 0x48, 0xa, + 0xfb, 0x44, 0x78, 0xa, 0xfb, 0x7f, 0x3c, 0x1d, 0xf7, 0x25, 0x5e, 0xa, + 0xf7, 0x1d, 0x5e, 0x1d, 0xfb, 0x1d, 0xfb, 0x6e, 0x1e, 0xb, 0x7c, 0xa0, + 0x5, 0x6c, 0x6c, 0x80, 0xb1, 0x8f, 0x1a, 0xf7, 0x99, 0x7, 0xe9, 0xb, + 0x77, 0x1, 0x5d, 0x1d, 0x3, 0x25, 0xa, 0xb, 0x99, 0xa, 0x2d, 0xa, + 0xb, 0xfb, 0x7, 0x30, 0x2d, 0xfb, 0x28, 0xfb, 0x3f, 0xf1, 0x41, 0xf0, + 0xdb, 0xc4, 0xab, 0xe8, 0xc8, 0xb, 0x52, 0xa, 0x52, 0x6, 0xfb, 0x4, + 0x28, 0xfb, 0x4, 0xee, 0x5, 0x53, 0x6, 0xe, 0x3c, 0xfb, 0x77, 0x5, + 0x3a, 0xf7, 0x63, 0x80, 0x9b, 0x95, 0x1a, 0xa3, 0xa6, 0x8c, 0xa5, 0x8d, + 0x48, 0x1d, 0xb, 0xf8, 0x51, 0xfc, 0xb2, 0x5, 0xa7, 0xf8, 0xce, 0x6, + 0xbb, 0x91, 0xab, 0xd3, 0x94, 0x1e, 0xae, 0xfb, 0x6b, 0x68, 0x7, 0xdc, + 0x85, 0x97, 0x74, 0x4f, 0x1a, 0xfb, 0xc3, 0x89, 0x7, 0xfb, 0xef, 0xf8, + 0x3f, 0x5, 0xfb, 0x67, 0x72, 0x6, 0x98, 0x9b, 0x88, 0x46, 0xc3, 0x1f, + 0xfc, 0x64, 0x7, 0x49, 0x6f, 0x84, 0x4f, 0x84, 0x1e, 0xb, 0x63, 0x1a, + 0xfb, 0x8a, 0x7, 0x44, 0xad, 0x4a, 0xf1, 0xce, 0xb9, 0xb4, 0xa4, 0xa8, + 0x1e, 0xb, 0xa7, 0x16, 0xf8, 0xd8, 0x6, 0xa5, 0xf7, 0x85, 0x5, 0x67, + 0x6, 0x57, 0xfb, 0x66, 0x29, 0x8c, 0xfb, 0x73, 0x8e, 0xf8, 0xf, 0xf9, + 0x5, 0x18, 0x9b, 0xfc, 0xa0, 0x7, 0x76, 0xfb, 0x62, 0x5, 0xb1, 0x6, + 0x9d, 0xbe, 0x9d, 0xdd, 0xd6, 0xa2, 0xac, 0x95, 0x8b, 0x8b, 0xf7, 0x3d, + 0x90, 0xfc, 0x12, 0xfd, 0x5, 0x18, 0xb, 0xf7, 0x5f, 0xae, 0x6, 0x69, + 0x8d, 0x5b, 0x8e, 0xb1, 0x1a, 0xb, 0x9b, 0xb6, 0x9f, 0xaf, 0xd5, 0x85, + 0x55, 0x58, 0x1e, 0x53, 0x7, 0xb, 0xf8, 0xdd, 0x6, 0xb3, 0xf7, 0x64, + 0x5, 0x6f, 0x6, 0xfb, 0x2b, 0x4c, 0x25, 0xb, 0xcc, 0xf7, 0x12, 0x1a, + 0xbf, 0x6e, 0xc9, 0x42, 0xb, 0x5d, 0xa, 0xf7, 0x0, 0x98, 0x1d, 0xd0, + 0x8a, 0xa, 0x9b, 0x16, 0x99, 0xa, 0x2c, 0x1d, 0xb, 0xf8, 0xee, 0x15, + 0x72, 0x9f, 0x63, 0xb6, 0xb0, 0xa6, 0xa8, 0xae, 0xaf, 0x6e, 0xa9, 0x68, + 0x61, 0x76, 0x63, 0x72, 0x1e, 0xf7, 0x66, 0x16, 0x72, 0x9e, 0x63, 0xb6, + 0xb0, 0xa7, 0xa8, 0xae, 0xaf, 0x6d, 0xa9, 0x68, 0x61, 0x77, 0x63, 0x72, + 0x1e, 0xb, 0x15, 0xbc, 0x7b, 0xdc, 0x72, 0x3b, 0x1a, 0x5b, 0x6a, 0x7a, + 0x6b, 0x76, 0x7c, 0x9b, 0x9a, 0x7a, 0x1e, 0x99, 0x7b, 0x78, 0x99, 0x71, + 0x1b, 0x76, 0x85, 0x78, 0x7d, 0x77, 0x1a, 0x55, 0xe4, 0x8a, 0x94, 0xf7, + 0x9, 0xda, 0xd4, 0xdf, 0xb8, 0xb, 0x16, 0xf7, 0x85, 0xad, 0x6, 0x59, + 0x1d, 0xc1, 0x8c, 0x54, 0x6f, 0x1e, 0x4f, 0xa, 0xb, 0x44, 0xa, 0x54, + 0x1d, 0xb, 0xc2, 0x93, 0x1e, 0x5b, 0x1d, 0xe1, 0x87, 0x97, 0xb, 0xe4, + 0xa2, 0xe7, 0xae, 0x94, 0x1f, 0x60, 0x6, 0xb, 0xe2, 0x1e, 0xfb, 0x45, + 0x16, 0xfb, 0x66, 0xf7, 0x29, 0xb, 0x80, 0x7, 0xfb, 0x38, 0x4a, 0x5, + 0x76, 0x7, 0x93, 0xa1, 0xa1, 0x92, 0x95, 0x1b, 0xa4, 0x8b, 0x71, 0x7c, + 0x1f, 0xb, 0x5f, 0xa, 0x13, 0xd0, 0x3f, 0x1d, 0xe, 0xf7, 0x45, 0x3, + 0xf7, 0x68, 0xf7, 0xe4, 0x79, 0x1d, 0xf7, 0x44, 0x66, 0x1d, 0xb, 0x9b, + 0x16, 0x33, 0xa, 0xb, 0x5c, 0xaf, 0x64, 0xbb, 0xba, 0xb1, 0xb1, 0xbb, + 0xb9, 0x65, 0xb0, 0x5c, 0x5b, 0x67, 0x65, 0x5e, 0x1e, 0xb, 0xb9, 0x88, + 0xba, 0x89, 0x49, 0x7e, 0xa, 0xb, 0x59, 0xa, 0x94, 0x81, 0x7b, 0x99, + 0x80, 0x1b, 0x85, 0x86, 0x87, 0x7d, 0x6d, 0xe6, 0x25, 0xa6, 0x62, 0x1f, + 0xb, 0xf7, 0x38, 0xf7, 0xae, 0x15, 0xf7, 0x1e, 0xad, 0xa1, 0xb0, 0xdb, + 0xb, 0x56, 0x1d, 0xf7, 0x4, 0xb, 0xfb, 0x7c, 0x7, 0x66, 0x7d, 0x7a, + 0x6a, 0x88, 0x6a, 0xa, 0x5a, 0xb, 0x76, 0xf7, 0xbb, 0xf7, 0x54, 0x6b, + 0xab, 0xb, 0x9f, 0x8b, 0xaa, 0xf7, 0xbe, 0xad, 0xf7, 0x19, 0x76, 0xc5, + 0x76, 0xf7, 0x16, 0xad, 0xb, 0x15, 0xe7, 0x6, 0xf7, 0xf, 0xf7, 0x44, + 0x5, 0xb, 0xf7, 0x1f, 0xf7, 0x1e, 0xf7, 0x1f, 0xb, 0x8a, 0x1d, 0xf7, + 0x36, 0xb2, 0xb, 0xfb, 0x5a, 0xfb, 0x5a, 0xfb, 0x2a, 0xfb, 0x31, 0xfb, + 0x5b, 0x1e, 0xd2, 0x16, 0xf7, 0x39, 0xf7, 0xc, 0xf7, 0x1f, 0xf7, 0x31, + 0xf7, 0x31, 0xf7, 0xb, 0xb, 0x96, 0x75, 0x5, 0x43, 0x1d, 0x6e, 0x57, + 0x4c, 0xb9, 0x7a, 0xa7, 0x1e, 0xb, 0x5b, 0xa, 0xa8, 0x4d, 0xd4, 0xb9, + 0xaf, 0xa9, 0xbf, 0xca, 0x5d, 0x9b, 0x6f, 0x1e, 0xb, 0x1a, 0xf7, 0x34, + 0x7, 0x6a, 0xad, 0xa7, 0x70, 0xc3, 0x1b, 0xf1, 0xe5, 0xdc, 0xf7, 0x39, + 0xf7, 0x36, 0x28, 0xd9, 0x37, 0x3b, 0x6d, 0x5e, 0x6a, 0xb, 0x1e, 0xf7, + 0x5f, 0xf7, 0x38, 0x5, 0x8f, 0x7, 0xfb, 0x62, 0xf7, 0x3a, 0x5, 0xb, + 0x1, 0x5c, 0x1d, 0x3, 0xb, 0x80, 0xa1, 0x5, 0x56, 0x6d, 0xfb, 0x5, + 0x4a, 0xfb, 0x12, 0x1a, 0x57, 0xb, 0xfb, 0x96, 0x4e, 0x1d, 0xb, 0xfc, + 0x5, 0xa0, 0x76, 0xf8, 0x61, 0x77, 0xb, 0xf7, 0x66, 0xf7, 0x6e, 0xfb, + 0x35, 0xb, 0x43, 0x1d, 0x6d, 0x57, 0x4c, 0xb9, 0x7b, 0xa7, 0x1e, 0xb, + 0x4e, 0xa, 0xf1, 0xf7, 0x4, 0x25, 0x7e, 0x1d, 0xa8, 0x67, 0x67, 0xb, + 0x8f, 0x9e, 0x8e, 0x19, 0x5b, 0x1d, 0xba, 0x88, 0xb, 0x1, 0xed, 0xf7, + 0x33, 0xf7, 0xd6, 0xb7, 0x3, 0xb, 0xfb, 0x2e, 0xfb, 0x13, 0x83, 0xb, + 0x7d, 0xaa, 0xf8, 0x3d, 0xaa, 0xb, 0x7, 0xf7, 0x53, 0xf7, 0xc1, 0x9f, + 0xab, 0xa8, 0x62, 0xa, 0xb, 0x5d, 0x62, 0xb3, 0x5c, 0x1b, 0x72, 0x71, + 0x74, 0x70, 0x70, 0xa5, 0x74, 0xa4, 0x1f, 0xba, 0xb4, 0xb3, 0xb9, 0x1b, + 0xb, 0x77, 0x75, 0x84, 0xa6, 0xc3, 0xdc, 0xc4, 0xa7, 0x9e, 0x1f, 0xb, + 0x15, 0xc5, 0x6, 0xf8, 0x4b, 0xf9, 0x50, 0x5, 0x53, 0x6, 0xb, 0x1e, + 0x69, 0xf7, 0x7f, 0xad, 0x7, 0xb, 0xd6, 0x78, 0xbc, 0xf8, 0xf7, 0xae, + 0xb, 0x6f, 0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7, 0xa7, 0x75, 0xa1, + 0x6f, 0x6f, 0x75, 0x75, 0x6f, 0x1e, 0xb, 0x67, 0xa7, 0x81, 0x1d, 0x6f, + 0x6e, 0x67, 0x1e, 0xb, 0xb4, 0x6, 0x9c, 0xd3, 0xa6, 0xf7, 0xc, 0xa2, + 0x1a, 0xb6, 0x72, 0xa8, 0x63, 0x63, 0x73, 0x6e, 0x60, 0xb, 0xf7, 0x19, + 0xf7, 0x1f, 0x2d, 0xb, 0xf7, 0x1f, 0xf7, 0x1c, 0xe4, 0xb, 0x89, 0x1d, + 0x4a, 0x89, 0xa, 0x8c, 0x6b, 0x1d, 0xb, 0x77, 0x1, 0xf3, 0xf7, 0x36, + 0xf7, 0x2c, 0xaf, 0x3, 0xb, 0x8, 0xa6, 0x8c, 0x15, 0xf7, 0x19, 0xf7, + 0x3e, 0x5, 0x8d, 0xfb, 0x40, 0xfb, 0x1b, 0x6, 0xb, 0x6e, 0xaf, 0xaf, + 0xb, 0x90, 0x98, 0x77, 0x1d, 0xe3, 0xf6, 0xa8, 0x1a, 0xb, 0xf7, 0x7c, + 0x7, 0xf7, 0x2, 0x3c, 0xb3, 0x54, 0xb, 0xf7, 0x4c, 0x47, 0xcf, 0xb, + 0xfb, 0x26, 0x34, 0x85, 0xb, 0x66, 0x15, 0xf7, 0x90, 0x6, 0xc1, 0x88, + 0x7e, 0xf7, 0x42, 0xfb, 0x42, 0x1b, 0xb, 0x1f, 0x52, 0x5f, 0xc4, 0xfb, + 0xd7, 0x6, 0x57, 0x76, 0x88, 0x67, 0x86, 0x1e, 0xb, 0x83, 0xa, 0xda, + 0x77, 0xa, 0x13, 0xe0, 0xb, 0x30, 0xfb, 0x4c, 0x76, 0xf7, 0x54, 0xc2, + 0xf8, 0xa, 0x76, 0xa0, 0xc4, 0xb, 0xf8, 0x52, 0x76, 0xf7, 0x60, 0xac, + 0x88, 0x77, 0x12, 0xbc, 0xf7, 0x45, 0xb, 0x1a, 0xfc, 0x64, 0x7, 0xb, + 0x6d, 0x7d, 0x74, 0xb, 0x66, 0x15, 0xf7, 0x95, 0x6, 0xc1, 0x76, 0xf7, + 0x42, 0xfb, 0x42, 0xb, 0xf7, 0x6a, 0xf2, 0x15, 0xf7, 0x87, 0x7, 0x99, + 0xb2, 0xc3, 0xb8, 0xb, 0xc4, 0x76, 0xf8, 0xf, 0x77, 0xb, 0x76, 0xf7, + 0xe3, 0x77, 0x12, 0xb, 0xfb, 0x83, 0x33, 0x4b, 0xfb, 0x4, 0x5b, 0x82, + 0x9b, 0xb3, 0xb, 0xf7, 0x6d, 0x63, 0x7, 0x78, 0x86, 0x86, 0x7c, 0x74, + 0x1b, 0xb, 0x5c, 0xaf, 0x65, 0xbb, 0xba, 0xb1, 0xb0, 0xbb, 0xb9, 0x65, + 0xb, 0x3, 0xa0, 0x16, 0xf8, 0x13, 0x6, 0x9b, 0xf7, 0x34, 0x5, 0xb, + 0x15, 0xf7, 0x62, 0xfb, 0x3a, 0x5, 0xb, 0x7, 0xc4, 0x9e, 0x99, 0xb, + 0xf7, 0x1f, 0x3, 0xb, 0x84, 0x1e, 0xe, 0x9f, 0x8b, 0xae, 0xf8, 0x47, + 0x77, 0xf7, 0x53, 0xae, 0xb, 0xfb, 0x52, 0x69, 0x7, 0xbc, 0x8d, 0x5c, + 0x80, 0x1f, 0xb, 0x77, 0x12, 0xb7, 0xf7, 0x1, 0xf7, 0x85, 0xf7, 0xb, + 0xb, 0x74, 0x93, 0x95, 0x78, 0x1f, 0x99, 0x6f, 0x76, 0x9c, 0xb, 0xfb, + 0xce, 0xf8, 0xb9, 0x98, 0x1d, 0xb, 0xf7, 0x74, 0x15, 0x6d, 0x65, 0x33, + 0x20, 0x6e, 0x1a, 0xb, 0x7, 0x62, 0x81, 0x81, 0x5d, 0x8b, 0xa, 0xf7, + 0x3d, 0x1, 0xb4, 0xf7, 0x3d, 0x3, 0xb4, 0xb, 0xf9, 0xd, 0x15, 0x4f, + 0xbc, 0x5d, 0xc5, 0x1e, 0xb, 0x3e, 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1, + 0xaa, 0xb, 0xfb, 0x55, 0xfb, 0x35, 0xfb, 0x17, 0xfb, 0x6e, 0xb, 0xf7, + 0x6, 0xd1, 0xf7, 0x6, 0xb, 0x12, 0xa4, 0xf7, 0x1f, 0xb, 0xf7, 0x83, + 0xad, 0x6, 0xb}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.cpp new file mode 100644 index 000000000000..159e53524671 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.cpp @@ -0,0 +1,1737 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitSerifBoldItalicFontData[20733] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x19, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x42, + 0x6f, 0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, + 0x1, 0x29, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8, + 0x1e, 0x3, 0xf8, 0x14, 0x4, 0x7d, 0xc, 0x2, 0xfb, 0x5c, 0xfb, 0x8e, + 0xfa, 0x6e, 0xf9, 0xf9, 0x5, 0x1c, 0x6, 0xf6, 0xf, 0x1c, 0x8, 0x4d, + 0x11, 0xb7, 0x1c, 0x4a, 0x64, 0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f, + 0x4a, 0x59, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, + 0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x20, 0x49, 0x74, 0x61, + 0x6c, 0x69, 0x63, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, + 0x69, 0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x71, 0x2, 0x0, 0x1, 0x0, + 0xf, 0x0, 0x18, 0x0, 0x1d, 0x0, 0x30, 0x0, 0x43, 0x0, 0x50, 0x0, + 0x5a, 0x0, 0x61, 0x0, 0x6d, 0x0, 0x84, 0x0, 0x87, 0x0, 0xc2, 0x0, + 0xe0, 0x0, 0xe3, 0x0, 0xf7, 0x1, 0xa, 0x1, 0x17, 0x1, 0x1f, 0x1, + 0x32, 0x1, 0x39, 0x1, 0x4a, 0x1, 0x6f, 0x1, 0x76, 0x1, 0x89, 0x1, + 0xab, 0x1, 0xb8, 0x1, 0xed, 0x1, 0xf4, 0x1, 0xfe, 0x2, 0xe, 0x2, + 0x1e, 0x2, 0x26, 0x2, 0x35, 0x2, 0x47, 0x2, 0x59, 0x2, 0x5f, 0x2, + 0x6c, 0x2, 0x75, 0x2, 0x7e, 0x2, 0x8d, 0x2, 0x96, 0x2, 0xa4, 0x2, + 0xb2, 0x2, 0xbd, 0x2, 0xca, 0x2, 0xd3, 0x2, 0xdb, 0x2, 0xfb, 0x3, + 0x5, 0x3, 0xb, 0x3, 0x12, 0x3, 0x2e, 0x3, 0x36, 0x3, 0x3e, 0x3, + 0x44, 0x3, 0x4b, 0x3, 0x52, 0x3, 0x6c, 0x3, 0x7a, 0x3, 0x80, 0x3, + 0x84, 0x3, 0x8b, 0x3, 0xa1, 0x3, 0xa4, 0x3, 0xad, 0x3, 0xb9, 0x3, + 0xbf, 0x3, 0xd3, 0x3, 0xe7, 0x3, 0xee, 0x3, 0xf3, 0x4, 0x5, 0x4, + 0xd, 0x4, 0x12, 0x4, 0x23, 0x4, 0x30, 0x4, 0x34, 0x4, 0x39, 0x4, + 0x49, 0x4, 0x59, 0x4, 0x68, 0x4, 0x71, 0x4, 0x78, 0x4, 0x7e, 0x4, + 0x83, 0x4, 0x88, 0x4, 0x96, 0x4, 0xa3, 0x4, 0xaa, 0x4, 0xb7, 0x4, + 0xbf, 0x4, 0xc4, 0x4, 0xd0, 0x4, 0xd6, 0x4, 0xd9, 0x4, 0xdf, 0x4, + 0xea, 0x4, 0xf5, 0x4, 0xfd, 0x5, 0x2, 0x5, 0xc, 0x5, 0x16, 0x5, + 0x20, 0x5, 0x2a, 0x5, 0x2e, 0x5, 0x37, 0x5, 0x40, 0x5, 0x49, 0x5, + 0x4d, 0x5, 0x53, 0x5, 0x57, 0x5, 0x5d, 0x5, 0x62, 0x66, 0xa9, 0x6d, + 0xb0, 0xb0, 0xa9, 0xa9, 0x36, 0x1d, 0x6d, 0x6d, 0x66, 0x1e, 0xb, 0xe2, + 0x5, 0xa2, 0x98, 0x9b, 0x96, 0x25, 0x1d, 0xb, 0x15, 0xbc, 0x21, 0xa, + 0xb, 0x5c, 0x79, 0x9c, 0xa2, 0x90, 0x8d, 0x91, 0x8e, 0x90, 0x3f, 0xa, + 0x5c, 0x69, 0x85, 0x5e, 0x88, 0x2c, 0xa, 0xb, 0x15, 0xf7, 0x58, 0xae, + 0x6, 0x23, 0x1d, 0xf7, 0x78, 0xf7, 0x69, 0x15, 0xf7, 0x28, 0xf7, 0x87, + 0x74, 0x1d, 0xe, 0xa2, 0x1a, 0xab, 0x6f, 0x9a, 0x76, 0x75, 0x76, 0x74, + 0x70, 0x71, 0x1e, 0xb, 0xf7, 0x27, 0x5, 0x98, 0x80, 0x79, 0xa0, 0x30, + 0x1d, 0xb, 0x7b, 0xa, 0xfb, 0x3, 0x26, 0x1d, 0xb, 0x44, 0xa, 0xfb, + 0x3, 0x8e, 0x7a, 0x4a, 0x6f, 0xa, 0x27, 0xa, 0xb, 0x15, 0xc9, 0x8b, + 0x60, 0x6b, 0x1f, 0x5d, 0x2e, 0xfb, 0xa5, 0x38, 0xa, 0xcd, 0xf7, 0x78, + 0xb3, 0xf7, 0x1f, 0x97, 0x84, 0x55, 0xa, 0xb, 0x27, 0x1d, 0xe, 0x15, + 0x43, 0xb2, 0x51, 0xd7, 0xf7, 0x6, 0xd9, 0xf7, 0xf, 0xf3, 0xd6, 0x63, + 0xc3, 0x3d, 0xfb, 0x0, 0x3a, 0xfb, 0xe, 0x21, 0x1e, 0xf7, 0x9, 0xe3, + 0x15, 0xac, 0x95, 0xa0, 0xdc, 0xb6, 0x1b, 0xa4, 0x92, 0x74, 0x76, 0x6b, + 0x6f, 0x32, 0x81, 0x69, 0x1f, 0x6c, 0x82, 0x79, 0x3f, 0x61, 0x1b, 0x75, + 0x81, 0x9e, 0x9e, 0xac, 0xa2, 0xe2, 0x95, 0xad, 0x1f, 0xb, 0xf7, 0xb2, + 0xf7, 0x2f, 0x15, 0x8d, 0x8a, 0x5, 0x81, 0x6d, 0x7f, 0x69, 0x60, 0x1a, + 0x53, 0xbf, 0x8b, 0x9a, 0xdf, 0xc3, 0xea, 0xad, 0x9e, 0x1e, 0x76, 0x98, + 0x5, 0x7f, 0x8d, 0xb, 0x2b, 0xa, 0xe, 0x83, 0x6e, 0x86, 0x79, 0x7b, + 0x1a, 0x57, 0xbb, 0x7d, 0x9e, 0xc8, 0xc4, 0xd5, 0xbf, 0xac, 0x1e, 0x76, + 0x9a, 0x5, 0xb, 0xfb, 0x5a, 0xfb, 0x27, 0x6a, 0x95, 0x2a, 0xee, 0xde, + 0xbe, 0xde, 0xb7, 0xa5, 0x1f, 0xfb, 0x26, 0x8c, 0x15, 0xb, 0x70, 0x1b, + 0x70, 0x79, 0x73, 0x76, 0x76, 0xa0, 0x7a, 0x98, 0x82, 0x1f, 0xb, 0x40, + 0x1d, 0x83, 0x96, 0x89, 0x43, 0xa, 0xb, 0xab, 0xc8, 0xf7, 0x67, 0xb2, + 0xf7, 0x23, 0x1f, 0x47, 0x7b, 0x2d, 0x82, 0x63, 0x88, 0x8, 0x70, 0x7, + 0xa8, 0xb, 0x65, 0x1d, 0xf7, 0x71, 0x25, 0xa, 0xb, 0x74, 0x3d, 0xfb, + 0x8e, 0x5f, 0x1a, 0x73, 0x96, 0x60, 0xc5, 0xd5, 0xb5, 0xc5, 0xd9, 0xbe, + 0x1e, 0xb, 0xf7, 0x85, 0xf7, 0x5, 0x15, 0x70, 0xf7, 0x2f, 0x6b, 0xf7, + 0x27, 0x78, 0xba, 0x66, 0x81, 0x55, 0x82, 0x51, 0x86, 0x8, 0x70, 0x7, + 0xb2, 0x95, 0x8b, 0xfb, 0x2c, 0xad, 0x1f, 0x93, 0x67, 0xb0, 0xfb, 0x48, + 0x5a, 0x1a, 0xb, 0xb0, 0xb0, 0x6d, 0xa9, 0x66, 0x66, 0xb, 0xf8, 0xbe, + 0x6, 0xc6, 0xf7, 0x56, 0x72, 0x90, 0x5, 0xfb, 0x12, 0x46, 0xfb, 0x4, + 0x62, 0xfb, 0xc, 0x1b, 0xb, 0x1b, 0x63, 0x7e, 0x66, 0x79, 0x70, 0xa1, + 0x6a, 0xb0, 0xee, 0xe3, 0xeb, 0xf7, 0x3d, 0xf1, 0x1f, 0x94, 0x9a, 0xf7, + 0x15, 0xf7, 0x64, 0xf7, 0x9, 0x1a, 0xac, 0x6d, 0xa8, 0x6a, 0x6b, 0x73, + 0x6c, 0x72, 0xb, 0x83, 0xba, 0x2b, 0xf8, 0xe4, 0x18, 0x72, 0x6, 0xfc, + 0x8, 0xfc, 0xe4, 0xb, 0xf7, 0x3f, 0xf7, 0x2d, 0x15, 0xe7, 0xe2, 0xf8, + 0x28, 0xf7, 0x4c, 0xf3, 0x8c, 0x20, 0x76, 0xfb, 0x8, 0x2d, 0xfc, 0x19, + 0xfb, 0x46, 0x50, 0x5e, 0xb0, 0x55, 0x1d, 0xd2, 0xfb, 0x17, 0xf7, 0x3b, + 0xf7, 0x8d, 0xf7, 0x45, 0xf7, 0x9b, 0xf7, 0x56, 0xf7, 0x42, 0xfb, 0x19, + 0xd1, 0x5d, 0x1d, 0xfb, 0x78, 0xfb, 0x89, 0x1e, 0xb, 0x5, 0xbe, 0x6, + 0x35, 0x4e, 0xa, 0xb, 0x6c, 0x1d, 0x53, 0x55, 0x73, 0x1b, 0x85, 0x32, + 0xa, 0xb, 0x1b, 0xe2, 0xa1, 0xdf, 0xae, 0x94, 0x1f, 0x62, 0x6, 0x78, + 0x82, 0x81, 0x74, 0x69, 0x1b, 0xb, 0x1f, 0xdd, 0xf7, 0xb6, 0x9c, 0xcb, + 0xa5, 0x90, 0xbe, 0x8e, 0x19, 0xae, 0xfb, 0xcb, 0x7, 0xb, 0x1b, 0x85, + 0x88, 0x90, 0x94, 0x28, 0x1d, 0xb, 0x3c, 0x41, 0x1f, 0xa6, 0x86, 0xb6, + 0xf7, 0x52, 0x5, 0xfc, 0xb0, 0x68, 0x6, 0xc9, 0xb, 0x71, 0x9e, 0x61, + 0xba, 0xb2, 0xa9, 0xa9, 0xaf, 0xb0, 0x6c, 0xaa, 0x65, 0x5e, 0x76, 0x61, + 0x73, 0x1e, 0xb, 0x65, 0xa8, 0x6e, 0xb1, 0xb1, 0xa9, 0xa8, 0xb1, 0xb1, + 0x6d, 0xa9, 0x65, 0x65, 0x6e, 0x6d, 0x65, 0x1e, 0xb, 0x15, 0x62, 0xa9, + 0x45, 0x1d, 0xb, 0xe9, 0xf7, 0xc8, 0x7d, 0x8a, 0x21, 0x74, 0x32, 0x87, + 0x6d, 0xa, 0xad, 0xb, 0x6a, 0xb7, 0xb4, 0xac, 0xab, 0xb5, 0xb4, 0x6a, + 0xb, 0x15, 0x42, 0x1d, 0xf7, 0x68, 0x16, 0x42, 0x1d, 0xe, 0x89, 0x7f, + 0x1f, 0xfb, 0x14, 0xfc, 0x5e, 0x7b, 0x52, 0x76, 0x82, 0x60, 0x85, 0x19, + 0xb, 0x1f, 0xd0, 0xf7, 0x9, 0x5, 0xf7, 0x6b, 0x6, 0xb, 0xf7, 0x77, + 0x70, 0xa, 0x8e, 0x88, 0x90, 0x9d, 0xb6, 0xb4, 0x9b, 0x4a, 0xa, 0xb, + 0x1f, 0x51, 0xfb, 0x65, 0x5, 0x21, 0x6e, 0x64, 0xfb, 0x1e, 0xfb, 0x23, + 0x1b, 0xb, 0x65, 0xfb, 0x32, 0xfb, 0x15, 0xfb, 0x3c, 0xfb, 0x2e, 0x1e, + 0xb, 0x15, 0xdd, 0x6, 0xf7, 0x36, 0xf7, 0x42, 0x5, 0x53, 0x6, 0xfb, + 0x1b, 0xb, 0x1, 0xf7, 0x6c, 0xf7, 0x21, 0x15, 0x72, 0x88, 0xb, 0x88, + 0xf7, 0xb, 0xf7, 0x62, 0xf7, 0xb, 0xb, 0x2a, 0x7d, 0x71, 0x92, 0xab, + 0x1f, 0x7f, 0x57, 0x15, 0x7b, 0xaa, 0x98, 0x85, 0xa4, 0x1b, 0xf7, 0x22, + 0xf7, 0x1a, 0xf7, 0x56, 0xf7, 0x2f, 0xe7, 0x58, 0xad, 0x4f, 0x60, 0x54, + 0x70, 0x3c, 0xb, 0xf7, 0x21, 0xf7, 0x4a, 0x15, 0xf7, 0x55, 0xa9, 0xcb, + 0xb, 0x56, 0xa, 0xf8, 0x47, 0x77, 0xb, 0x1, 0x4e, 0x1d, 0x3, 0xf7, + 0x8, 0xb, 0x58, 0x8b, 0xab, 0xf8, 0xee, 0xae, 0x1, 0x75, 0x16, 0xf8, + 0xbd, 0x6, 0xc6, 0xf7, 0x56, 0x73, 0x90, 0x5, 0xfb, 0x11, 0x46, 0xfb, + 0x4, 0x61, 0xfb, 0xc, 0x1b, 0xb, 0x1b, 0x29, 0x78, 0xfb, 0x8, 0x89, + 0x1f, 0xe, 0xef, 0x1e, 0xfb, 0x24, 0xc4, 0x15, 0x2a, 0xb, 0xb1, 0x90, + 0x19, 0x61, 0xa, 0xb, 0x19, 0xae, 0xfb, 0x64, 0x68, 0x7, 0xb, 0x7e, + 0xd2, 0x58, 0x76, 0xf8, 0x46, 0xb, 0x1, 0xf7, 0xd5, 0xf7, 0x11, 0x3, + 0xf7, 0x5, 0xc8, 0x15, 0xa4, 0xbd, 0xf7, 0x42, 0xa2, 0xbb, 0x1e, 0xb1, + 0x9d, 0xb1, 0xb8, 0xb2, 0x1b, 0xa1, 0x9d, 0xb, 0x77, 0x1, 0xf7, 0x77, + 0xf9, 0x67, 0x5b, 0xa, 0xea, 0xe3, 0x2c, 0x3b, 0x1d, 0xb, 0x58, 0x1d, + 0xb0, 0x90, 0x77, 0xb, 0x77, 0x52, 0x1d, 0xb, 0xfb, 0x1, 0xfb, 0x6f, + 0xfb, 0x5f, 0xb, 0x15, 0xf7, 0x82, 0x6, 0xbe, 0xf7, 0x6, 0x5, 0x7b, + 0x6, 0x69, 0x75, 0x7b, 0x80, 0x57, 0x1b, 0x34, 0x8d, 0x6, 0xf7, 0xf, + 0xb, 0x26, 0x1d, 0xe, 0x4c, 0x1d, 0x26, 0x30, 0xf0, 0x5, 0x59, 0x6, + 0xe, 0x15, 0xc5, 0x6, 0xf8, 0x47, 0xf9, 0x48, 0x5, 0x8d, 0x51, 0x7, + 0xb, 0xf7, 0x19, 0x1a, 0xdb, 0x50, 0xb, 0xce, 0xaa, 0x97, 0xad, 0xa4, + 0x1a, 0xc3, 0x54, 0xa5, 0x61, 0x47, 0x62, 0x62, 0x64, 0x71, 0x1e, 0x99, + 0x7e, 0x5, 0xb, 0x1f, 0x3b, 0xfb, 0xb3, 0xfb, 0x6b, 0xf8, 0x65, 0x5, + 0xfb, 0x57, 0x68, 0x6, 0xc0, 0x86, 0x96, 0x8f, 0x9e, 0x5f, 0xb, 0xc7, + 0x79, 0xad, 0xf9, 0xd, 0xad, 0xb, 0xfc, 0x14, 0x97, 0x76, 0xb, 0x1f, + 0xb1, 0x70, 0x7e, 0x94, 0x79, 0x1b, 0x73, 0x7e, 0x79, 0x70, 0x84, 0x90, + 0x64, 0xdd, 0xf0, 0xe4, 0xb, 0xfb, 0x6e, 0x7e, 0xcb, 0xf8, 0xe, 0xac, + 0xb, 0xf8, 0x1a, 0x62, 0xa, 0xb, 0x1e, 0xae, 0xfb, 0xaf, 0x68, 0x7, + 0xbb, 0x84, 0x92, 0x8a, 0x9d, 0x54, 0xe3, 0xfb, 0x96, 0x18, 0xb, 0x19, + 0xf7, 0x78, 0xf7, 0x69, 0x15, 0xf7, 0x28, 0xf7, 0x87, 0x74, 0x1d, 0xe, + 0x77, 0x4d, 0x1d, 0xb, 0xf7, 0x30, 0x35, 0xe1, 0xb, 0xef, 0xf7, 0xde, + 0x5e, 0x82, 0x66, 0x83, 0x2c, 0x7d, 0x19, 0x89, 0x76, 0x5, 0xa8, 0xb3, + 0xb, 0x15, 0xcb, 0xf7, 0x83, 0x5, 0xa0, 0x8f, 0x91, 0xa2, 0xb2, 0x1b, + 0xe0, 0x8b, 0x23, 0x76, 0xb, 0xa7, 0x88, 0x5, 0xa3, 0x94, 0x98, 0xb0, + 0xb4, 0x1b, 0xf7, 0x25, 0x6, 0xfb, 0xb8, 0xb, 0x15, 0xc1, 0x54, 0xc4, + 0x51, 0xbc, 0x56, 0x8, 0xb, 0xc0, 0x76, 0xf8, 0x13, 0x77, 0x1, 0xb, + 0x9b, 0xb5, 0x1b, 0xf7, 0x51, 0xb, 0xb0, 0xfb, 0x87, 0x5, 0xb, 0xf7, + 0xbc, 0xae, 0x6, 0xb, 0x4a, 0xc1, 0x8b, 0x9b, 0xd9, 0xba, 0xd8, 0xc1, + 0xab, 0x1e, 0x75, 0x98, 0x5, 0xb, 0x7d, 0x4e, 0x83, 0x41, 0x83, 0x6d, + 0xa, 0xad, 0x8c, 0xa8, 0x8b, 0x69, 0xb, 0x28, 0x30, 0xee, 0x5, 0x59, + 0x6, 0xe, 0xfb, 0x6e, 0xfb, 0x61, 0xf7, 0x7, 0xf7, 0x5f, 0x77, 0xf8, + 0x5, 0x77, 0xb, 0x1a, 0xc3, 0xee, 0xbe, 0x9e, 0x95, 0x1e, 0xb, 0xf7, + 0x0, 0xa5, 0xa1, 0xb, 0x1a, 0x86, 0x8b, 0x85, 0x89, 0x85, 0x1e, 0xfb, + 0x19, 0xfc, 0x65, 0xb, 0x45, 0x1d, 0xac, 0x62, 0x60, 0xb, 0x3b, 0x1d, + 0xe, 0xfb, 0xdd, 0xf8, 0xad, 0x76, 0xb, 0x5, 0xb4, 0x96, 0xab, 0x88, + 0x9a, 0x1b, 0xf7, 0x35, 0x8c, 0xb, 0x1f, 0xab, 0x85, 0xbe, 0xf7, 0x7e, + 0x5, 0x6d, 0x6, 0x7b, 0xb, 0x6d, 0xa, 0xac, 0xa9, 0x8d, 0x68, 0x1f, + 0xe, 0xf7, 0xb, 0x40, 0xd6, 0xb, 0x69, 0xa9, 0x79, 0xa6, 0xb1, 0xa4, + 0xa6, 0xb8, 0xb7, 0xb, 0x77, 0x12, 0xf1, 0xf7, 0xd, 0xf7, 0x10, 0xf7, + 0xd, 0xb, 0xe3, 0x8b, 0xf7, 0x29, 0xfb, 0x22, 0x76, 0xf1, 0xc8, 0xb, + 0xfb, 0x61, 0xb0, 0xf7, 0x2f, 0xae, 0xf8, 0x5, 0xd2, 0xb, 0x1b, 0x85, + 0x87, 0xb, 0x21, 0x97, 0x76, 0xa9, 0x76, 0xf8, 0x1a, 0xd3, 0xb, 0x83, + 0x93, 0x1b, 0x90, 0x8f, 0x8f, 0x97, 0x1f, 0xb, 0xc7, 0x8b, 0xae, 0x6e, + 0x76, 0xf9, 0x1d, 0xae, 0xb, 0x83, 0x1d, 0x12, 0xb, 0x76, 0xf9, 0x53, + 0x77, 0x1, 0xb, 0x15, 0x75, 0x1d, 0xb, 0x7e, 0xa8, 0xf8, 0x33, 0xa8, + 0xb, 0xa5, 0xaf, 0xa1, 0xa4, 0xb, 0x1, 0x0, 0x1, 0x6, 0x0, 0x68, + 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67, + 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x66, 0x0, 0x0, 0x83, + 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97, + 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x9c, + 0x0, 0x0, 0xa4, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98, + 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0, 0x85, 0x0, 0x0, 0x96, + 0x0, 0x0, 0x8f, 0x0, 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0, 0xae, 0x0, 0x0, 0xab, + 0x1, 0x0, 0xb0, 0x0, 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0, 0xb9, + 0x0, 0x0, 0xb6, 0x2, 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe, + 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0, 0xa8, + 0x0, 0x0, 0x8d, 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5, + 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0, 0xcb, 0x0, 0x0, 0xc8, + 0x1, 0x0, 0xcd, 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90, + 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0, 0xd6, + 0x0, 0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb, + 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0, 0xda, 0x0, 0x0, 0x9f, + 0x0, 0x0, 0x93, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2, + 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x91, 0x0, 0x0, 0x8c, + 0x0, 0x0, 0x92, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0, 0xe4, 0x0, 0x0, 0x65, + 0x0, 0x0, 0x7e, 0x0, 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x86, 0x0, 0x0, 0x6f, + 0x0, 0x0, 0x89, 0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75, + 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x76, 0x0, 0x0, 0x70, + 0x1, 0x0, 0x74, 0x0, 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63, + 0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0, 0xa6, 0x0, 0x0, 0x6d, + 0x1, 0x0, 0xe6, 0x2, 0x0, 0x1, 0x0, 0x4, 0x0, 0x7, 0x0, 0x5e, + 0x0, 0x9d, 0x1, 0x14, 0x1, 0xa9, 0x1, 0xe3, 0x2, 0xb8, 0x2, 0xe4, + 0x3, 0x17, 0x3, 0x49, 0x4, 0x25, 0x4, 0x51, 0x4, 0x80, 0x4, 0x96, + 0x4, 0xa4, 0x4, 0xb9, 0x5, 0x3, 0x5, 0x44, 0x5, 0x9a, 0x6, 0x2, + 0x6, 0x47, 0x6, 0x98, 0x7, 0x2, 0x7, 0x2e, 0x7, 0xae, 0x8, 0xe, + 0x8, 0x3a, 0x8, 0x8b, 0x8, 0xaf, 0x8, 0xd1, 0x8, 0xf2, 0x9, 0x57, + 0xa, 0x11, 0xa, 0x3b, 0xa, 0xc1, 0xb, 0x17, 0xb, 0x57, 0xb, 0x76, + 0xb, 0xd9, 0xc, 0x5a, 0xc, 0xda, 0xd, 0x15, 0xd, 0x74, 0xd, 0xed, + 0xe, 0x14, 0xe, 0x94, 0xe, 0xd1, 0xf, 0x14, 0xf, 0x6c, 0x10, 0x7, + 0x10, 0x7e, 0x10, 0xff, 0x11, 0x41, 0x11, 0x8c, 0x11, 0xdb, 0x12, 0x59, + 0x12, 0xd5, 0x13, 0x19, 0x13, 0x1f, 0x13, 0x4d, 0x13, 0x64, 0x13, 0x95, + 0x13, 0xb6, 0x13, 0xc2, 0x13, 0xe4, 0x14, 0x1c, 0x14, 0x6d, 0x14, 0xbc, + 0x15, 0x38, 0x15, 0x70, 0x15, 0xee, 0x16, 0x9b, 0x16, 0xff, 0x17, 0x1e, + 0x17, 0x72, 0x17, 0xd0, 0x18, 0x0, 0x18, 0xa0, 0x18, 0xd3, 0x19, 0x10, + 0x19, 0x45, 0x19, 0xb2, 0x19, 0xfd, 0x1a, 0x64, 0x1a, 0xab, 0x1a, 0xd9, + 0x1b, 0x2d, 0x1b, 0xa5, 0x1c, 0x31, 0x1c, 0x53, 0x1c, 0x97, 0x1c, 0xf5, + 0x1d, 0x10, 0x1d, 0x6a, 0x1d, 0xb5, 0x1e, 0x3, 0x1e, 0x79, 0x1f, 0x31, + 0x1f, 0xa7, 0x20, 0x30, 0x20, 0x5f, 0x21, 0x28, 0x21, 0x42, 0x21, 0xdf, + 0x22, 0x4d, 0x22, 0x81, 0x22, 0xa0, 0x23, 0x55, 0x23, 0x69, 0x23, 0x9c, + 0x23, 0xdb, 0x23, 0xff, 0x24, 0x32, 0x24, 0x44, 0x24, 0xc7, 0x25, 0x10, + 0x25, 0x20, 0x25, 0x57, 0x25, 0x90, 0x25, 0xca, 0x25, 0xf4, 0x26, 0x2e, + 0x26, 0x79, 0x26, 0xd3, 0x27, 0x34, 0x27, 0x51, 0x27, 0x63, 0x27, 0x6f, + 0x27, 0xcc, 0x27, 0xf5, 0x28, 0x20, 0x28, 0xc6, 0x29, 0x5d, 0x29, 0x9b, + 0x29, 0xdf, 0x2a, 0x7, 0x2a, 0x36, 0x2a, 0x58, 0x2a, 0x87, 0x2a, 0xab, + 0x2a, 0xd1, 0x2b, 0x29, 0x2b, 0x84, 0x2b, 0x8c, 0x2b, 0x94, 0x2b, 0xa5, + 0x2b, 0xd2, 0x2b, 0xf5, 0x2c, 0x25, 0x2c, 0xa4, 0x2c, 0xcc, 0x2c, 0xf7, + 0x2d, 0x24, 0x2d, 0x59, 0x2d, 0x9f, 0x2e, 0x13, 0x2e, 0xb5, 0x2e, 0xde, + 0x2e, 0xf5, 0x2f, 0xb, 0x2f, 0x45, 0x2f, 0x67, 0x2f, 0xd1, 0x30, 0x8a, + 0x31, 0xe, 0x31, 0x1b, 0x31, 0x24, 0x31, 0x3c, 0x31, 0x5f, 0x31, 0x6e, + 0x31, 0x82, 0x31, 0xa2, 0x31, 0xcb, 0x32, 0x31, 0x32, 0x85, 0x32, 0x94, + 0x32, 0xba, 0x32, 0xc7, 0x32, 0xf4, 0x33, 0x15, 0x33, 0x47, 0x33, 0xbe, + 0x33, 0xdc, 0x33, 0xf0, 0x34, 0x6, 0x34, 0x22, 0x34, 0x4d, 0x34, 0x7f, + 0x34, 0xbb, 0x34, 0xc2, 0x35, 0x4, 0x35, 0x50, 0x36, 0x3, 0x36, 0x9a, + 0x37, 0x2f, 0x37, 0x9c, 0x38, 0xb, 0x38, 0x19, 0x38, 0x65, 0x38, 0xee, + 0x38, 0xfe, 0x39, 0xa, 0x39, 0x35, 0x39, 0x49, 0x39, 0x70, 0x39, 0xa3, + 0x39, 0xf1, 0x3a, 0x9, 0x3a, 0x1a, 0x3a, 0x2c, 0x3a, 0x59, 0x3a, 0x7f, + 0x3a, 0xa9, 0x3a, 0xe2, 0x3b, 0x1b, 0x3b, 0x5b, 0x3b, 0xfb, 0x3c, 0xdb, + 0x3c, 0xfc, 0x3d, 0x34, 0x3d, 0x67, 0x3d, 0x7c, 0x3d, 0x90, 0x3d, 0xaa, + 0x3e, 0x30, 0x3e, 0xd6, 0x3e, 0xe8, 0x3f, 0x9b, 0x40, 0x47, 0xfc, 0x30, + 0xe, 0xfc, 0x30, 0xe, 0xfb, 0xa5, 0x72, 0xf7, 0x24, 0xfb, 0x18, 0xf7, + 0x24, 0xf8, 0xb0, 0x77, 0xac, 0x77, 0x12, 0xce, 0xf7, 0x28, 0x13, 0xa8, + 0xf7, 0x3b, 0xf7, 0x68, 0x15, 0xa8, 0x83, 0xd2, 0xf7, 0x39, 0xd8, 0xf7, + 0x2f, 0x97, 0xa9, 0x19, 0x93, 0xa0, 0x91, 0xa0, 0x9d, 0x1a, 0x13, 0x98, + 0xb4, 0x71, 0xa8, 0x6b, 0x50, 0x6b, 0x38, 0x61, 0x85, 0x1e, 0x7a, 0xfb, + 0x7, 0x80, 0xfb, 0x15, 0x77, 0x24, 0x8, 0x27, 0xfb, 0x2f, 0x15, 0x13, + 0x68, 0x64, 0xa8, 0x6c, 0xb7, 0xb8, 0xa9, 0xad, 0xaf, 0xb1, 0x6a, 0xaf, + 0x60, 0x6a, 0x64, 0x70, 0x5c, 0x1e, 0xe, 0x20, 0xf8, 0x37, 0x76, 0xf7, + 0xb3, 0x77, 0x1, 0xf7, 0x1c, 0xf8, 0x22, 0x15, 0xb3, 0x6, 0xde, 0xf7, + 0x4e, 0x5, 0x91, 0x99, 0x90, 0x9f, 0x9e, 0x1a, 0xa4, 0x7e, 0xa2, 0x66, + 0x65, 0x70, 0x68, 0x65, 0x88, 0x1e, 0xf7, 0x90, 0xfb, 0x6a, 0x15, 0xb1, + 0x6, 0xe0, 0xf7, 0x4e, 0x5, 0x91, 0x98, 0x8e, 0x9d, 0x9c, 0x1a, 0xa6, + 0x7b, 0xa5, 0x6b, 0x65, 0x70, 0x68, 0x65, 0x88, 0x1e, 0xe, 0xa0, 0x76, + 0xf7, 0x66, 0xca, 0x4c, 0xd4, 0xf7, 0x1a, 0xd4, 0x4c, 0xca, 0xf7, 0x66, + 0x77, 0x12, 0x13, 0xb4, 0x75, 0x16, 0xe0, 0xf7, 0x66, 0x5, 0x2b, 0x6, + 0x9f, 0xca, 0x5, 0xf1, 0x6, 0xcb, 0xf7, 0x2e, 0x5, 0x25, 0x6, 0x9f, + 0xca, 0x5, 0xf7, 0x3, 0x6, 0xdc, 0xf7, 0x66, 0x5, 0xd0, 0x6, 0x3b, + 0xfb, 0x66, 0x5, 0xf7, 0x14, 0x6, 0xdc, 0xf7, 0x66, 0x5, 0xd1, 0x6, + 0x3b, 0xfb, 0x66, 0x5, 0xdd, 0x6, 0x77, 0x4c, 0x5, 0x30, 0x6, 0x13, + 0xcc, 0x4b, 0xfb, 0x2e, 0x5, 0xe6, 0x6, 0x77, 0x4c, 0x5, 0x2a, 0x6, + 0x36, 0xfb, 0x66, 0x5, 0x44, 0x6, 0xe0, 0xf7, 0x66, 0x5, 0xfb, 0x14, + 0x6, 0x36, 0xfb, 0x66, 0x5, 0xf7, 0x3, 0xf7, 0xa5, 0x15, 0xf7, 0x14, + 0x6, 0xcb, 0xf7, 0x2e, 0x5, 0xfb, 0x14, 0x6, 0xe, 0x3c, 0x76, 0xf0, + 0xaa, 0xf8, 0xf1, 0xac, 0xca, 0x77, 0x1, 0xda, 0xee, 0xf7, 0x25, 0xf7, + 0x1, 0x3, 0xf7, 0x13, 0x92, 0x15, 0x62, 0x96, 0x62, 0x93, 0x4a, 0xc7, + 0xb5, 0xf7, 0x22, 0x18, 0xa1, 0x85, 0x8e, 0x2e, 0x98, 0x57, 0xd8, 0x68, + 0x19, 0xd5, 0xf7, 0x99, 0x5, 0x20, 0xd8, 0x72, 0xdd, 0xc7, 0x1a, 0xe7, + 0xcf, 0xc3, 0xf7, 0x19, 0x96, 0x94, 0x8a, 0x8a, 0x98, 0x1e, 0x9d, 0xcc, + 0x5, 0xbd, 0x6, 0x77, 0x43, 0xb5, 0x86, 0xcc, 0x69, 0xa8, 0x73, 0x19, + 0x61, 0xfb, 0x19, 0x76, 0x90, 0x8e, 0xb8, 0x8d, 0xe1, 0x33, 0xa3, 0x19, + 0x50, 0xfb, 0x79, 0x5, 0xdb, 0x46, 0xc7, 0x46, 0x32, 0x1a, 0xfb, 0x1, + 0x22, 0x50, 0xfb, 0x29, 0x1e, 0x6f, 0x26, 0x5, 0x57, 0x6, 0xf7, 0x2a, + 0xf8, 0x9e, 0x15, 0xc2, 0xf7, 0x69, 0x5, 0x8e, 0x84, 0x8d, 0x8a, 0x7c, + 0x1b, 0x45, 0x68, 0x48, 0x5b, 0x68, 0x9a, 0x71, 0xc2, 0x64, 0x1f, 0x4d, + 0xfc, 0x1a, 0x15, 0xe2, 0xbd, 0xc5, 0xda, 0xc6, 0x68, 0x9c, 0x68, 0xa8, + 0x1f, 0xe, 0xf7, 0x3f, 0x7d, 0xa5, 0x85, 0x76, 0xf7, 0xe3, 0xa1, 0xf7, + 0xc8, 0xa5, 0x8c, 0x77, 0x12, 0xf7, 0x0, 0xdf, 0xf7, 0x20, 0xdf, 0xc9, + 0xdf, 0xf7, 0x20, 0xdf, 0x13, 0xb7, 0x80, 0xf8, 0xe4, 0x7d, 0x3b, 0xa, + 0xfc, 0x9, 0xf7, 0xc8, 0x3b, 0xa, 0x13, 0x6f, 0x80, 0xf8, 0xba, 0xf7, + 0xdf, 0x15, 0x4f, 0x6, 0xfc, 0xe9, 0xfd, 0x48, 0x5, 0xc7, 0x6, 0xe, + 0xf7, 0x8, 0x79, 0xd1, 0x45, 0xdc, 0x4e, 0x76, 0xca, 0xaf, 0xc0, 0xaf, + 0xf8, 0x74, 0xac, 0x12, 0xa5, 0xf7, 0x19, 0xd6, 0xf7, 0xd, 0xf7, 0xe, + 0xdb, 0x75, 0xa1, 0x13, 0x3f, 0x80, 0xf8, 0x1a, 0xb7, 0x15, 0x13, 0x4f, + 0x80, 0x73, 0xa3, 0xb6, 0x65, 0xd4, 0x1b, 0x13, 0x3f, 0x80, 0xe3, 0xb9, + 0xc4, 0xb4, 0xae, 0x1f, 0x71, 0xa0, 0x5, 0x13, 0x4f, 0x40, 0x70, 0x7f, + 0x75, 0x80, 0x72, 0x1b, 0x5c, 0x52, 0xac, 0xb0, 0x73, 0x1f, 0xe3, 0xf7, + 0xa, 0x8a, 0x81, 0xa3, 0xa6, 0xb4, 0xba, 0x9b, 0x8e, 0xb0, 0x93, 0x8, + 0xae, 0xfb, 0x68, 0x68, 0x7, 0xa6, 0x86, 0xa8, 0x89, 0x6a, 0x1a, 0x68, + 0x61, 0x61, 0x6b, 0x63, 0x1e, 0x6e, 0xb5, 0x5c, 0xf3, 0x81, 0xdc, 0x8, + 0xb8, 0x9e, 0xf7, 0x1d, 0xc0, 0xf0, 0x1a, 0xc2, 0x5d, 0xc5, 0x2e, 0xfb, + 0xb, 0x4a, 0x2b, 0xfb, 0x2, 0x6a, 0x91, 0x6b, 0x90, 0x70, 0x1e, 0xfb, + 0x5, 0x4d, 0xfb, 0x13, 0x75, 0xfb, 0x24, 0x1a, 0x13, 0x3f, 0x80, 0xfb, + 0x30, 0xf7, 0x23, 0x78, 0xb7, 0xb8, 0xd9, 0x92, 0xc3, 0xd6, 0x1e, 0x6f, + 0xaf, 0x15, 0x13, 0x8f, 0x80, 0x80, 0x74, 0x6c, 0x7a, 0x60, 0x1b, 0x30, + 0x67, 0xdd, 0xc0, 0xe8, 0xc3, 0xac, 0xc6, 0xa9, 0x1f, 0x13, 0x3f, 0x80, + 0xab, 0xfb, 0x21, 0xb8, 0x43, 0xab, 0x59, 0x8, 0x8f, 0xf7, 0xf6, 0x15, + 0x84, 0xb6, 0x87, 0xa5, 0xa3, 0x1a, 0xc8, 0x92, 0xc8, 0xc3, 0xb4, 0x9d, + 0x5b, 0x6b, 0x66, 0x78, 0x59, 0x2f, 0x5b, 0x1e, 0xe, 0xfc, 0x14, 0xf8, + 0x37, 0x76, 0xf7, 0xb3, 0x77, 0x1, 0xf7, 0x21, 0xf7, 0xb, 0x3, 0xf7, + 0x3b, 0xf8, 0x22, 0x15, 0xe4, 0xf7, 0x4e, 0x5, 0x92, 0x98, 0x90, 0x9c, + 0x9e, 0x1a, 0xa6, 0x7f, 0xa4, 0x64, 0x64, 0x71, 0x69, 0x64, 0x88, 0x1e, + 0x76, 0xfb, 0x6a, 0x5, 0xe, 0x84, 0xa, 0xa7, 0xe9, 0x3, 0xf7, 0x3e, + 0xfb, 0x47, 0x15, 0xa2, 0x9a, 0x5, 0x70, 0xbb, 0x5f, 0xf7, 0x26, 0xf7, + 0x15, 0x1a, 0xf7, 0xd0, 0xf7, 0x26, 0xf7, 0xe, 0xd7, 0xcf, 0x1e, 0x79, + 0x9f, 0x5, 0xfb, 0x9f, 0xfb, 0x4c, 0x6c, 0xfb, 0x6a, 0xfb, 0x14, 0x1a, + 0xfb, 0x51, 0xf0, 0x2f, 0xb4, 0x52, 0x1e, 0xe, 0x84, 0xa, 0xf7, 0x45, + 0xe9, 0x3, 0x5f, 0xfb, 0x33, 0x15, 0xf7, 0x1f, 0xf7, 0x1c, 0xdd, 0xf7, + 0x2, 0xf7, 0x65, 0x1a, 0xdf, 0x82, 0xf7, 0x57, 0x4c, 0xea, 0x1e, 0xa2, + 0x9a, 0x5, 0xdf, 0x22, 0xc6, 0xfb, 0x19, 0xfb, 0x2b, 0x1a, 0xfb, 0x5e, + 0xfb, 0xb, 0xfb, 0x30, 0xfb, 0x47, 0xfb, 0x9, 0x1e, 0xe, 0xf7, 0xa2, + 0x76, 0xdf, 0xf7, 0x0, 0xc1, 0xf5, 0xdf, 0x77, 0x1, 0xf7, 0x69, 0xee, + 0xe9, 0xbd, 0x3, 0xf7, 0x87, 0xf8, 0x54, 0x15, 0x6e, 0x78, 0x7c, 0x77, + 0x7c, 0x7a, 0x8, 0x76, 0x7b, 0x77, 0x65, 0x6b, 0x1b, 0x72, 0x72, 0x9b, + 0xaa, 0xbc, 0xaa, 0x92, 0xc7, 0x8e, 0x1f, 0xab, 0x8e, 0xaa, 0x8e, 0x9a, + 0x9e, 0x8, 0x94, 0x7, 0x7b, 0x96, 0x63, 0x94, 0x72, 0x8e, 0x8, 0x57, + 0x93, 0x66, 0x87, 0xbd, 0x1a, 0xa7, 0x97, 0xa2, 0xb6, 0xa7, 0x98, 0x6f, + 0x71, 0xa0, 0x1e, 0xa4, 0x6c, 0xa4, 0x70, 0x98, 0x8a, 0x92, 0x90, 0x18, + 0xb4, 0x81, 0xa0, 0x80, 0x9e, 0x1e, 0x80, 0x9e, 0x82, 0x9a, 0xa3, 0x1a, + 0xa3, 0x97, 0xa8, 0xb0, 0xa7, 0xa0, 0x75, 0x6c, 0x74, 0x82, 0x7d, 0x80, + 0x78, 0x1e, 0x80, 0x78, 0x82, 0x75, 0x60, 0x1a, 0x97, 0x86, 0xaa, 0xa0, + 0x99, 0x9f, 0x9b, 0xa2, 0x19, 0xa8, 0x9f, 0x96, 0xa0, 0xac, 0x1b, 0xae, + 0x9a, 0x6c, 0x7b, 0x5b, 0x5c, 0x83, 0x5e, 0x88, 0x1f, 0x70, 0x8a, 0x6e, + 0x85, 0x76, 0x7b, 0x8, 0x81, 0x7, 0x9c, 0x7f, 0xa1, 0x84, 0xaf, 0x88, + 0x8, 0xb7, 0x88, 0xbd, 0x7d, 0x63, 0x1a, 0x5f, 0x5e, 0x86, 0x86, 0x6c, + 0x7f, 0xa0, 0xb0, 0x70, 0x1e, 0x78, 0xa4, 0x7f, 0x9d, 0x70, 0x98, 0x83, + 0x85, 0x18, 0x68, 0x93, 0x76, 0x93, 0x78, 0x1e, 0x97, 0x70, 0x95, 0x7e, + 0x73, 0x1a, 0x6f, 0x7b, 0x71, 0x6c, 0x72, 0x72, 0x99, 0xb4, 0x8a, 0x1e, + 0x8a, 0xa2, 0x99, 0x9a, 0x96, 0xa2, 0x8, 0x94, 0x9e, 0x95, 0xa3, 0xaf, + 0x1a, 0xe, 0x2f, 0xa0, 0x76, 0xf7, 0x70, 0xcc, 0xf7, 0x71, 0x77, 0x12, + 0xf7, 0x83, 0xe5, 0x3b, 0xcb, 0x13, 0xf0, 0xac, 0xf7, 0x70, 0x15, 0x13, + 0xe8, 0xf7, 0x6c, 0xfb, 0x70, 0xcb, 0xf7, 0x70, 0xf7, 0x74, 0xcc, 0xfb, + 0x74, 0xf7, 0x71, 0x4b, 0xfb, 0x71, 0xfb, 0x6c, 0x6, 0xe, 0xfc, 0x30, + 0xfb, 0x35, 0x62, 0xa, 0x7f, 0x6d, 0x1d, 0x13, 0xd0, 0x4f, 0x81, 0xa, + 0xdf, 0x62, 0x1d, 0x9a, 0x70, 0x1e, 0x13, 0xe0, 0x62, 0x6e, 0x6c, 0x61, + 0x6d, 0x9a, 0x7d, 0x9b, 0x7f, 0x1f, 0x13, 0xd0, 0x9e, 0x7e, 0x9f, 0x81, + 0x75, 0x1a, 0x53, 0x28, 0x57, 0x78, 0x81, 0x1e, 0xe, 0xfb, 0xdd, 0xf7, + 0x3a, 0xf7, 0x8, 0x1, 0x8d, 0xf7, 0x3a, 0x15, 0xf7, 0x88, 0x6, 0xa4, + 0xf7, 0x8, 0x5, 0xfb, 0x87, 0x6, 0xe, 0xfc, 0x30, 0x7e, 0xf7, 0x28, + 0x1, 0x82, 0xf7, 0x28, 0x3, 0x82, 0xc8, 0x3c, 0xa, 0xfc, 0x14, 0x8e, + 0x8d, 0x1d, 0x8d, 0x79, 0x15, 0xf7, 0xe8, 0xf9, 0x53, 0x5, 0x45, 0x6, + 0xfb, 0xe4, 0xfd, 0x53, 0x5, 0xe, 0x7d, 0xa8, 0xf9, 0x13, 0xa8, 0x1, + 0xf8, 0xa, 0xf2, 0x3, 0x9c, 0xf7, 0x63, 0x15, 0x30, 0xa4, 0xfb, 0x16, + 0xf7, 0x13, 0xf7, 0x38, 0xf7, 0x24, 0xf7, 0x82, 0xf7, 0x7e, 0xf7, 0x15, + 0x4b, 0xeb, 0x32, 0xfb, 0x47, 0xfb, 0x14, 0xfb, 0xa2, 0xfb, 0x62, 0x1e, + 0xf7, 0x4c, 0xf7, 0x81, 0x15, 0xd5, 0xa2, 0xb6, 0xf7, 0x1c, 0xc4, 0x1b, + 0xb0, 0x98, 0x6b, 0x5a, 0x47, 0x32, 0xfc, 0x7e, 0xfb, 0x8, 0xfb, 0xb, + 0xf7, 0x25, 0xf8, 0x2d, 0x9f, 0x91, 0x1f, 0xe, 0x8b, 0xac, 0xf9, 0x1e, + 0x77, 0x1, 0x90, 0x16, 0xf7, 0xed, 0xac, 0x6, 0x53, 0x60, 0x8e, 0xa9, + 0x8f, 0x8c, 0x8f, 0x8c, 0x90, 0x1f, 0xf7, 0x3a, 0xf8, 0xf0, 0x49, 0x7b, + 0x52, 0x7d, 0xfb, 0x27, 0x75, 0x19, 0x89, 0x74, 0x5, 0x8e, 0x9f, 0xa6, + 0x8d, 0x9f, 0x1b, 0x93, 0xae, 0x8a, 0x74, 0x88, 0x8b, 0x87, 0x8a, 0x87, + 0x1f, 0xfb, 0x18, 0xfc, 0x87, 0x80, 0x61, 0x4c, 0x88, 0x5e, 0x8a, 0x19, + 0xe, 0x8b, 0xf7, 0x3, 0xdb, 0x77, 0xf8, 0x3a, 0xe5, 0x1, 0xf7, 0xcc, + 0xf7, 0x1a, 0x3, 0x70, 0x16, 0xf8, 0x3, 0x6, 0xda, 0xf7, 0x53, 0x5, + 0x72, 0x6, 0x4d, 0x69, 0x73, 0x79, 0x3a, 0x1b, 0xfb, 0x29, 0x6, 0xf7, + 0x58, 0xf7, 0x3b, 0x5, 0xcf, 0xc5, 0xd7, 0xd5, 0xda, 0x1a, 0xf7, 0x11, + 0x51, 0xd0, 0x22, 0xfb, 0x11, 0x49, 0x22, 0x50, 0x6f, 0x1e, 0xa1, 0x7f, + 0x5, 0xa0, 0x99, 0xb6, 0xcc, 0xd7, 0x1b, 0xe8, 0x8b, 0x36, 0x78, 0x3e, + 0x59, 0x3f, 0x52, 0x45, 0x1f, 0x5a, 0x50, 0x8b, 0x8b, 0xfb, 0x4b, 0xfb, + 0x4b, 0x8, 0xe, 0x7e, 0xb3, 0xeb, 0x77, 0xf8, 0x91, 0xd2, 0x12, 0xf7, + 0xb1, 0xf7, 0xf, 0x34, 0xf7, 0x15, 0x13, 0xf0, 0xf7, 0x14, 0xf7, 0xef, + 0x15, 0xef, 0xc4, 0x66, 0x27, 0x2e, 0x58, 0x31, 0x51, 0x68, 0x76, 0xa4, + 0xa4, 0x77, 0x1f, 0xa2, 0x78, 0x7b, 0xa2, 0x74, 0x1b, 0x7a, 0x63, 0x84, + 0x56, 0x80, 0x92, 0x4a, 0xf7, 0x14, 0xf7, 0x30, 0xf7, 0x18, 0xec, 0xf7, + 0x12, 0xf0, 0x6a, 0xc1, 0x5f, 0xab, 0x1f, 0x13, 0xe8, 0xf1, 0xbe, 0x9c, + 0xb7, 0xb5, 0x1a, 0xe7, 0x3a, 0xc4, 0x4a, 0x23, 0x4c, 0x46, 0x4b, 0x63, + 0x1e, 0xa0, 0x7e, 0x5, 0xae, 0xa6, 0xa6, 0xb3, 0xcb, 0x1b, 0xc9, 0xa2, + 0x65, 0x63, 0xfb, 0x9, 0xfb, 0x25, 0x63, 0x5f, 0x83, 0x1f, 0xe, 0xa0, + 0x76, 0xf7, 0x2a, 0xed, 0xf8, 0x47, 0x77, 0x1, 0xf7, 0x50, 0xf7, 0x14, + 0xf7, 0xd, 0xcd, 0x3, 0xf7, 0x79, 0xf7, 0x2a, 0x15, 0x62, 0xfb, 0x2a, + 0x5, 0xf7, 0x14, 0x6, 0xb5, 0xf7, 0x2a, 0x5, 0xcf, 0x6, 0xa6, 0xed, + 0x5, 0x46, 0x6, 0xf7, 0xb, 0xf8, 0x47, 0x5, 0x49, 0x6, 0xfc, 0x3c, + 0xfc, 0x40, 0x6f, 0x22, 0x5, 0xf7, 0xef, 0xf8, 0xb, 0x15, 0x8d, 0x89, + 0x3d, 0xfb, 0xa7, 0x5, 0xfb, 0x5f, 0x6, 0xe, 0x7e, 0xb3, 0x63, 0xf7, + 0x1c, 0xf7, 0x8d, 0xf7, 0x4, 0xd7, 0xf7, 0x1, 0x12, 0xf7, 0xc7, 0xf4, + 0x13, 0xb8, 0xd4, 0xf8, 0x8, 0x15, 0xf7, 0x2a, 0xdf, 0x38, 0x25, 0x40, + 0x52, 0x36, 0x3d, 0x6d, 0x7f, 0xa6, 0xa4, 0x7b, 0x1f, 0x13, 0x78, 0xa2, + 0x7d, 0x7a, 0xa0, 0x68, 0x1b, 0x6f, 0x6c, 0x7b, 0x5f, 0x6d, 0xac, 0x5d, + 0xeb, 0xf7, 0x29, 0xf7, 0x25, 0xed, 0xf7, 0x3c, 0xe6, 0x22, 0xf7, 0x20, + 0xfb, 0x24, 0x1f, 0xad, 0xd7, 0x5, 0xf7, 0x92, 0x6, 0xaf, 0xf7, 0x1, + 0x5, 0xfb, 0xaf, 0x6, 0xe, 0x7c, 0xab, 0xf8, 0x1, 0xb2, 0xf7, 0x96, + 0x77, 0x1, 0xa2, 0xf7, 0x4, 0xf7, 0x34, 0xf7, 0x10, 0x3, 0xf7, 0x7b, + 0xf8, 0x2d, 0x15, 0xbb, 0xee, 0xdd, 0xe8, 0xf7, 0x28, 0xc1, 0x85, 0xa3, + 0x18, 0xfb, 0xdd, 0x5b, 0xfb, 0x2b, 0xfb, 0x8c, 0xfb, 0x4a, 0x1a, 0x3f, + 0x9f, 0xfb, 0x20, 0xf7, 0x32, 0xf7, 0xf, 0xf7, 0xb, 0xf7, 0x1, 0xf7, + 0x30, 0xf7, 0x10, 0x4b, 0xba, 0x4a, 0x6e, 0x6d, 0x88, 0x82, 0x73, 0x1e, + 0x2b, 0xfb, 0xce, 0x15, 0xc7, 0xa1, 0xd8, 0xa0, 0xc6, 0x1e, 0xde, 0xab, + 0x8d, 0x93, 0xb7, 0x1b, 0xca, 0x8b, 0x58, 0x77, 0x3f, 0x59, 0xfb, 0x1c, + 0x88, 0x80, 0x1f, 0x5c, 0x79, 0x72, 0x73, 0x6c, 0x1b, 0x53, 0x8a, 0xc0, + 0xa4, 0x1f, 0xe, 0xa0, 0x76, 0xf8, 0xc0, 0xf7, 0x5, 0x1, 0xde, 0xf8, + 0x68, 0x3, 0xf7, 0x24, 0x16, 0xf8, 0x11, 0xf9, 0x31, 0x5, 0xfc, 0x11, + 0x6, 0x34, 0xfb, 0x52, 0x5, 0xa5, 0x6, 0xc8, 0xae, 0xa3, 0x9b, 0xf7, + 0x1, 0x1b, 0xf7, 0xf, 0x6, 0xfb, 0xd6, 0xfc, 0xc0, 0x5, 0xe, 0x7e, + 0xa9, 0xf9, 0xd, 0xac, 0x12, 0x8e, 0xec, 0x94, 0xf7, 0x3, 0xe1, 0xf7, + 0x5, 0x67, 0xe8, 0x13, 0xf8, 0xf7, 0x4b, 0xf7, 0xe8, 0x15, 0x59, 0x7a, + 0xfb, 0x16, 0x5e, 0xfb, 0x14, 0x1a, 0x6b, 0x9b, 0xfb, 0x17, 0xf7, 0x49, + 0xf7, 0x9, 0xf1, 0xdd, 0xf7, 0x11, 0xe5, 0x50, 0xca, 0x70, 0xa8, 0x1e, + 0x90, 0x7, 0x13, 0xf4, 0xd8, 0xaa, 0xcd, 0xb6, 0xe2, 0x1a, 0xf7, 0x1, + 0xfb, 0xc, 0xab, 0x55, 0xfb, 0x2, 0x38, 0x39, 0x43, 0x3e, 0xb4, 0x43, + 0xac, 0x68, 0x1e, 0xa5, 0x73, 0x15, 0x13, 0xf8, 0xd7, 0x31, 0xa0, 0x71, + 0x4f, 0x1a, 0x4c, 0x65, 0x4a, 0x47, 0x39, 0x79, 0xd7, 0xb7, 0xea, 0xbe, + 0xbd, 0xc5, 0xb2, 0x1e, 0xf0, 0xdd, 0x15, 0x5b, 0xb8, 0x61, 0xb7, 0xc8, + 0x1a, 0xb5, 0xa2, 0xc2, 0xc6, 0x1e, 0x13, 0xf4, 0xba, 0xad, 0x65, 0x45, + 0x4b, 0x65, 0x65, 0x68, 0x66, 0x1f, 0xe, 0x96, 0x76, 0xf7, 0x93, 0x77, + 0xf8, 0x3e, 0xab, 0x1, 0xf7, 0x45, 0xf7, 0xf8, 0x15, 0xa0, 0x9e, 0xf7, + 0x1c, 0xaf, 0xd1, 0x1e, 0xb2, 0x9f, 0xa6, 0xa8, 0xad, 0x1b, 0xbe, 0x8a, + 0x5c, 0x6e, 0x88, 0x88, 0x2e, 0x63, 0x25, 0x1f, 0x37, 0x6b, 0x7c, 0x86, + 0x6c, 0x1b, 0x7c, 0x59, 0x8c, 0xce, 0x1f, 0xfb, 0x4b, 0xfc, 0x2, 0x15, + 0xf7, 0xfc, 0xbe, 0xf7, 0xd, 0xf7, 0xa7, 0xf7, 0x2a, 0x1a, 0xf7, 0x18, + 0x57, 0xe0, 0xfb, 0x2, 0xfb, 0x41, 0x34, 0xfb, 0x2f, 0xfb, 0x8, 0x28, + 0xc7, 0x47, 0xe6, 0xa6, 0x9b, 0x91, 0x93, 0x9d, 0x1e, 0x55, 0xfb, 0x9, + 0x21, 0x2c, 0xfb, 0x9, 0x6b, 0x8, 0xe, 0xfb, 0xdd, 0x7e, 0xf7, 0x26, + 0xf7, 0x47, 0xf7, 0x27, 0x12, 0xa2, 0xf7, 0x28, 0x54, 0xf7, 0x28, 0x13, + 0xe0, 0xa2, 0xc8, 0x43, 0x1d, 0xaa, 0x62, 0x60, 0x6c, 0x6b, 0x63, 0x1e, + 0x13, 0xd0, 0xe8, 0xf7, 0xd9, 0x43, 0x1d, 0xab, 0x62, 0x60, 0x6c, 0x6a, + 0x63, 0x1e, 0xe, 0xfb, 0xdd, 0xfb, 0x36, 0x76, 0xf7, 0xd0, 0x77, 0xf7, + 0x5b, 0xf7, 0x27, 0x1, 0xa2, 0x6d, 0x1d, 0x4c, 0xf7, 0x28, 0x3, 0x72, + 0xfb, 0x33, 0x15, 0x9e, 0x96, 0xee, 0xbc, 0xc4, 0x1a, 0xa2, 0x79, 0x93, + 0x78, 0x98, 0x1e, 0x7a, 0x97, 0x7b, 0x99, 0xaa, 0x1a, 0xb6, 0xa8, 0xaa, + 0xb4, 0xa7, 0xc5, 0x7a, 0x3c, 0xfb, 0x18, 0xfb, 0x44, 0x37, 0x7c, 0x87, + 0x1e, 0xf7, 0x14, 0xf8, 0xcd, 0x15, 0xb3, 0xaa, 0xac, 0xb6, 0xb4, 0xac, + 0x6b, 0x62, 0x60, 0x6a, 0x6c, 0x62, 0x5f, 0x6d, 0xac, 0xb4, 0x1e, 0xe, + 0x2f, 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xaa, 0xf8, 0x90, 0x3, 0xf8, + 0x7d, 0x83, 0x15, 0xcf, 0x7, 0xfc, 0x6, 0xf7, 0x55, 0xf8, 0x38, 0xf7, + 0x55, 0x5, 0xcf, 0x7, 0xfc, 0x90, 0xfb, 0x7d, 0x5, 0x53, 0x7, 0xe, + 0x2f, 0xf1, 0xe5, 0xdd, 0xe4, 0x67, 0xcf, 0x12, 0x13, 0xa0, 0xde, 0xf7, + 0xdf, 0x15, 0xf8, 0x5a, 0xcf, 0xfc, 0x5a, 0x6, 0x59, 0xfb, 0xb8, 0x15, + 0xf8, 0x5a, 0x6, 0x13, 0xc0, 0xcc, 0xfc, 0x5a, 0x7, 0xe, 0x2f, 0x98, + 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xf8, 0xaf, 0xf7, 0x75, 0x15, 0xc3, 0x7, + 0xfc, 0x5e, 0xf7, 0x7d, 0x5, 0x47, 0x7, 0xf8, 0x6, 0xfb, 0x55, 0xfc, + 0x38, 0xfb, 0x55, 0x5, 0x47, 0x7, 0xe, 0x7e, 0xf7, 0x28, 0xf7, 0xf5, + 0xf7, 0x58, 0x6c, 0xaa, 0x12, 0xda, 0xf7, 0x28, 0xfb, 0x0, 0xf7, 0xe, + 0xf1, 0xf7, 0x13, 0x13, 0xcc, 0xf7, 0x3b, 0xf7, 0x6b, 0x15, 0xa8, 0x84, + 0xa3, 0xc6, 0x9a, 0xaa, 0xb6, 0xa7, 0x19, 0xf7, 0x19, 0xe2, 0xc6, 0xbc, + 0xd9, 0x1a, 0xba, 0x65, 0xec, 0xfb, 0x29, 0xfb, 0x1, 0x54, 0x4d, 0x47, + 0x67, 0xa5, 0x6d, 0xae, 0xab, 0xa8, 0xa4, 0xad, 0x9f, 0x83, 0x98, 0x83, + 0x95, 0x1e, 0x84, 0x94, 0x85, 0x92, 0x94, 0x1a, 0x13, 0xb4, 0xa0, 0xb6, + 0x9c, 0xa7, 0xaa, 0xa8, 0x7b, 0x49, 0x55, 0x71, 0x59, 0x3c, 0x2e, 0x1e, + 0x4e, 0x3f, 0x84, 0x59, 0x88, 0x6a, 0x8, 0x33, 0xfb, 0x2e, 0x3c, 0xa, + 0xf7, 0x3e, 0x79, 0xb9, 0xf7, 0x6, 0xb0, 0x66, 0xbb, 0x5c, 0x77, 0xe7, + 0x77, 0xf7, 0xa4, 0xbb, 0xf7, 0x17, 0xb2, 0x12, 0xca, 0xe6, 0xf7, 0xa, + 0xd7, 0xf8, 0xc, 0xb9, 0x13, 0xaf, 0xc0, 0xf7, 0xf0, 0xf7, 0xaa, 0x15, + 0xf7, 0xc, 0xe3, 0xd0, 0xbb, 0xa8, 0x9a, 0x75, 0x60, 0xfb, 0x22, 0x40, + 0x45, 0x5f, 0x6a, 0x6f, 0xa7, 0xc7, 0x1e, 0xf7, 0x22, 0x4c, 0x15, 0x7e, + 0xa2, 0x4f, 0xcf, 0xf7, 0xd, 0xcf, 0xf7, 0x1e, 0xf3, 0xf7, 0x40, 0xfb, + 0x27, 0xf7, 0x15, 0xfb, 0x50, 0xfb, 0x5c, 0xfb, 0x40, 0xfb, 0x28, 0xfb, + 0x70, 0xfb, 0x1d, 0xf7, 0x8, 0xfb, 0x5a, 0xf7, 0x9e, 0xdb, 0xd1, 0xa7, + 0xaa, 0xcc, 0x1e, 0x7e, 0xae, 0x5, 0x70, 0x50, 0x57, 0x76, 0x30, 0x1b, + 0xfb, 0x3f, 0xfb, 0xc, 0xf7, 0x25, 0xf7, 0x24, 0xf7, 0x77, 0xf7, 0x19, + 0xf1, 0xf7, 0x28, 0xf7, 0x4b, 0xf5, 0xfb, 0x26, 0xfb, 0x8, 0x1f, 0x13, + 0xcf, 0xc0, 0x34, 0x59, 0xfb, 0xa, 0x3e, 0x6c, 0x85, 0xa4, 0x9f, 0x92, + 0x8c, 0x91, 0x8c, 0x92, 0x1e, 0xcc, 0xf7, 0x95, 0x5, 0x44, 0x6, 0x80, + 0x65, 0x5, 0xa4, 0x7d, 0x81, 0xa6, 0x5b, 0x1b, 0xfb, 0x1d, 0x4b, 0xfb, + 0x35, 0x3f, 0x1f, 0x13, 0x9f, 0xc0, 0xfb, 0x3, 0xd0, 0x73, 0xa8, 0xc7, + 0xba, 0xc3, 0x9b, 0x96, 0x1e, 0xe, 0x51, 0x1d, 0x1, 0x40, 0xf9, 0x28, + 0x3, 0xf7, 0x15, 0x16, 0xae, 0x7, 0x5f, 0x76, 0x9e, 0x9f, 0x90, 0x8d, + 0x90, 0x8e, 0x92, 0x3f, 0xa, 0x5b, 0x69, 0x83, 0x5e, 0x2c, 0xa, 0x68, + 0x7, 0xf8, 0xc, 0xf8, 0x7f, 0x15, 0x74, 0x1d, 0xfb, 0x4d, 0x6, 0xe, + 0x90, 0x8b, 0xab, 0xf7, 0xc6, 0xa9, 0xf7, 0xa1, 0xae, 0x12, 0xf8, 0x3e, + 0xf7, 0x2d, 0x25, 0xea, 0x2c, 0xf7, 0x27, 0x13, 0xf0, 0x73, 0x16, 0xf7, + 0xaf, 0x6, 0xf7, 0x27, 0xf7, 0x3a, 0xbe, 0xf7, 0x31, 0xf1, 0x38, 0xa7, + 0x58, 0x9b, 0x1f, 0x8d, 0x7, 0x13, 0xe4, 0xcd, 0x9b, 0xf7, 0xc, 0xaf, + 0xf7, 0xd, 0x1a, 0xf7, 0x1f, 0xfb, 0x45, 0x8c, 0x50, 0x1e, 0xfb, 0xa4, + 0x68, 0x6, 0xb5, 0xaa, 0x86, 0x63, 0x1f, 0xfb, 0x19, 0xfc, 0x76, 0x7a, + 0x4d, 0x6f, 0x86, 0x68, 0x86, 0x19, 0xf7, 0xb9, 0xf7, 0xc3, 0x15, 0x13, + 0xf0, 0xd3, 0xd9, 0x76, 0xfb, 0x1, 0x5f, 0x72, 0xfb, 0x18, 0xfb, 0x1b, + 0x65, 0x74, 0x95, 0xa4, 0x93, 0x8c, 0x93, 0x8f, 0x96, 0x1f, 0xd5, 0xf7, + 0xa6, 0x15, 0xc8, 0xf7, 0x75, 0x5, 0x9f, 0x90, 0x91, 0xa3, 0xb1, 0x1b, + 0x13, 0xe8, 0xd1, 0x9f, 0x55, 0x55, 0xfb, 0x38, 0xfb, 0xc, 0x8e, 0x3b, + 0x1f, 0xe, 0x90, 0x79, 0xc0, 0xf8, 0xfb, 0xae, 0x1, 0xab, 0xf7, 0x2e, + 0x3, 0xf8, 0xb6, 0xf7, 0x2d, 0x15, 0x2f, 0x42, 0x4b, 0x71, 0x3c, 0x1b, + 0x7d, 0xfb, 0x16, 0x9f, 0xf7, 0x47, 0xf7, 0x45, 0xf3, 0xf7, 0x83, 0xf7, + 0x35, 0xe3, 0xc5, 0x49, 0x32, 0x7f, 0x8a, 0x7e, 0x89, 0x7e, 0x81, 0x1d, + 0x81, 0x83, 0x7e, 0x75, 0x1b, 0x82, 0x7f, 0x8f, 0x90, 0x7c, 0x1f, 0x94, + 0x70, 0x65, 0x96, 0x54, 0x1b, 0xfb, 0x87, 0xfb, 0x44, 0xfb, 0x79, 0xfb, + 0x72, 0xfb, 0x49, 0xf7, 0x22, 0x44, 0xf7, 0x16, 0xf7, 0x16, 0xe6, 0xd3, + 0xd8, 0xbe, 0x1f, 0xe, 0xc7, 0x8b, 0xad, 0xf8, 0xf0, 0xaa, 0x1, 0xf8, + 0xae, 0xf7, 0x27, 0x3, 0xf7, 0x52, 0xf7, 0x12, 0x15, 0xf7, 0x14, 0xf8, + 0x6e, 0x80, 0x1d, 0xfb, 0x2c, 0x2c, 0x25, 0x60, 0xfb, 0x93, 0xfb, 0x97, + 0x61, 0x7d, 0x99, 0xa3, 0x9a, 0x8f, 0x9d, 0x77, 0xa, 0x8c, 0xf7, 0x13, + 0xf7, 0x73, 0x5d, 0xa, 0x77, 0x83, 0x72, 0xfb, 0xa, 0xfc, 0x37, 0x1e, + 0x75, 0x3d, 0x6b, 0x83, 0x6a, 0x86, 0x8, 0xe, 0x51, 0xa, 0x1, 0x70, + 0x16, 0x37, 0x1d, 0x55, 0x7d, 0x95, 0x9c, 0x98, 0x93, 0x9b, 0x90, 0x9e, + 0x7e, 0xa, 0xf7, 0x4, 0xab, 0x6f, 0x4c, 0x7e, 0x89, 0x7d, 0x89, 0x7b, + 0x2a, 0xa, 0xe, 0x90, 0xa0, 0x76, 0xf7, 0xe6, 0xab, 0xf7, 0x9f, 0xab, + 0x1, 0x7e, 0x16, 0xf7, 0xbb, 0x6, 0x90, 0xae, 0x5, 0x5d, 0x71, 0x96, + 0xa2, 0x8e, 0x8b, 0x8f, 0x8c, 0x8f, 0x1f, 0xcb, 0xf7, 0x96, 0x5, 0xf7, + 0x2, 0xa6, 0x6c, 0x4e, 0x7e, 0x89, 0x7d, 0x89, 0x7c, 0x4c, 0xa, 0x5, + 0x37, 0x5f, 0x7f, 0x75, 0xfb, 0x22, 0x1b, 0xc8, 0xf7, 0x73, 0x5, 0xab, + 0x94, 0x96, 0x97, 0xb2, 0x1b, 0xf7, 0x49, 0x8b, 0x36, 0x47, 0x1f, 0xa6, + 0x86, 0xb6, 0xf7, 0x52, 0x5, 0xfc, 0xa9, 0x68, 0x6, 0xbd, 0x85, 0xa4, + 0x87, 0x7a, 0x8b, 0xa, 0x85, 0x1e, 0xfb, 0x14, 0xfc, 0x94, 0x82, 0x67, + 0x6c, 0x89, 0x63, 0x84, 0x19, 0xe, 0xc7, 0x79, 0xb1, 0xf7, 0xa6, 0xaf, + 0xf7, 0xd3, 0xaf, 0x1, 0xa0, 0xf7, 0x30, 0x3, 0xf8, 0x37, 0xf7, 0xba, + 0x15, 0xb9, 0x87, 0xaa, 0x88, 0x65, 0x1a, 0x84, 0x8a, 0x81, 0x89, 0x81, + 0x1e, 0x84, 0x68, 0x60, 0xfb, 0x10, 0x87, 0x84, 0x8, 0x74, 0x7d, 0x60, + 0x7e, 0x5f, 0x1b, 0x6a, 0xfb, 0x14, 0xbd, 0xf7, 0x3f, 0xf7, 0x67, 0xf4, + 0xf7, 0x59, 0xf7, 0x34, 0xf7, 0x3, 0xbb, 0x3b, 0x26, 0x1f, 0xa8, 0x87, + 0xbe, 0xf7, 0x71, 0x5, 0x6c, 0x6, 0x81, 0x86, 0x82, 0x77, 0x6f, 0x1b, + 0x7e, 0x80, 0x90, 0x90, 0x7c, 0x1f, 0x94, 0x73, 0x68, 0x96, 0x47, 0x1b, + 0xfb, 0x99, 0xfb, 0x34, 0xfb, 0x88, 0xfb, 0x5c, 0xfb, 0x45, 0xf7, 0x1c, + 0x39, 0xf7, 0x39, 0xd7, 0xf7, 0x7, 0xa4, 0xa4, 0xc1, 0x1f, 0x97, 0x94, + 0xbb, 0xf7, 0x49, 0x9d, 0xd0, 0x93, 0x8a, 0xc0, 0x8f, 0x19, 0xaf, 0xfb, + 0xb3, 0x7, 0xe, 0xf7, 0x8, 0x8b, 0xae, 0xf7, 0xba, 0xb7, 0xf7, 0x99, + 0xae, 0x1, 0x73, 0x16, 0x75, 0x1d, 0x5e, 0x8e, 0x6e, 0x95, 0xa5, 0x1a, + 0x8f, 0x8c, 0x8f, 0x8c, 0x90, 0x1e, 0xcd, 0xf7, 0x86, 0x5, 0xf7, 0x83, + 0x6, 0x4c, 0xfb, 0x86, 0x83, 0x6b, 0x79, 0x7a, 0x3f, 0x88, 0x19, 0x68, + 0xf7, 0xd1, 0xae, 0x7, 0x69, 0x8c, 0x64, 0x97, 0xa7, 0x1a, 0x8e, 0x8b, + 0x8f, 0x8c, 0x8f, 0x1e, 0xf7, 0x19, 0xf8, 0x79, 0x9b, 0xc9, 0xa4, 0x85, + 0xb3, 0x91, 0x19, 0x61, 0xa, 0xc0, 0x83, 0xa1, 0x7b, 0x74, 0x1a, 0x86, + 0x8a, 0x86, 0x8a, 0x86, 0x1e, 0x52, 0xfb, 0x5b, 0x5, 0xfb, 0x83, 0x6, + 0xc1, 0xf7, 0x5b, 0x9b, 0xc7, 0xa8, 0x8b, 0xc3, 0x8d, 0x82, 0xa, 0xbe, + 0x84, 0xa3, 0x7b, 0x74, 0x1a, 0x86, 0x8a, 0x86, 0x8a, 0x85, 0x1e, 0xfb, + 0x18, 0xfc, 0x79, 0x80, 0x62, 0x6a, 0x86, 0x66, 0x85, 0x19, 0xe, 0xfb, + 0xa5, 0xa0, 0x76, 0xf9, 0xe, 0xae, 0x1, 0x6b, 0x16, 0x75, 0x1d, 0x60, + 0x8d, 0x6e, 0x9b, 0xa4, 0x1a, 0x90, 0x8b, 0x90, 0x8c, 0x90, 0x1e, 0xf7, + 0x21, 0xf8, 0x77, 0x9a, 0xbe, 0x9e, 0x8d, 0x56, 0x1d, 0xc5, 0x86, 0xa0, + 0x75, 0x88, 0x7a, 0x8a, 0x86, 0x8a, 0x86, 0x8a, 0x87, 0xfb, 0x18, 0xfc, + 0x77, 0x18, 0x80, 0x61, 0x70, 0x81, 0x60, 0x85, 0x8, 0xe, 0x45, 0xf7, + 0x3f, 0xf8, 0xcc, 0x77, 0x12, 0x5d, 0xf7, 0x13, 0xfb, 0x13, 0xf8, 0xce, + 0x13, 0xe0, 0xf7, 0x77, 0xf9, 0xe, 0x15, 0xbd, 0x84, 0xa4, 0x7c, 0x73, + 0x8b, 0xa, 0x84, 0x1e, 0x22, 0xfc, 0x2d, 0x5, 0xfb, 0xb, 0x6b, 0x5d, + 0x61, 0x73, 0x1b, 0x81, 0x86, 0x92, 0x99, 0x98, 0x8f, 0x8f, 0x92, 0x92, + 0x1f, 0x92, 0x92, 0x90, 0x92, 0x9e, 0x1a, 0xaf, 0x6e, 0xa5, 0x68, 0x68, + 0x6f, 0x6f, 0x60, 0x4e, 0xd1, 0x64, 0xdc, 0xf7, 0x18, 0xbe, 0xe5, 0xf1, + 0xa6, 0x1e, 0xf7, 0x0, 0xf8, 0x2d, 0x5, 0x13, 0xd0, 0x9e, 0xc4, 0x9a, + 0x88, 0xba, 0x93, 0x8, 0xae, 0xfb, 0xbd, 0x7, 0xe, 0x90, 0xa0, 0x76, + 0xf9, 0x31, 0x77, 0x1, 0x76, 0x16, 0xf7, 0xb5, 0xae, 0x6, 0x64, 0x70, + 0x98, 0xad, 0x90, 0x8c, 0x90, 0x8c, 0x91, 0x1f, 0xcb, 0xf7, 0x79, 0x93, + 0x89, 0x5, 0xf7, 0x1, 0xfb, 0x7d, 0x97, 0x74, 0x88, 0x1a, 0x74, 0x84, + 0x8a, 0x51, 0x84, 0x1e, 0x68, 0xf7, 0xac, 0xae, 0x7, 0x71, 0x8e, 0x74, + 0x8d, 0x7d, 0xa9, 0xfb, 0x31, 0xf7, 0xdc, 0x18, 0xf7, 0x6c, 0xf7, 0x50, + 0xb8, 0xb5, 0x98, 0x8c, 0xaf, 0x90, 0x19, 0xae, 0xfb, 0x67, 0x68, 0x7, + 0xb2, 0x87, 0x9c, 0x89, 0x75, 0x1a, 0x72, 0xfb, 0x78, 0xfb, 0x44, 0x64, + 0x54, 0x1e, 0x86, 0x8c, 0xc7, 0xf7, 0x71, 0x9b, 0xc5, 0xa7, 0x8b, 0xbd, + 0x8f, 0x19, 0xae, 0xfb, 0xca, 0x68, 0x7, 0xbd, 0x84, 0xa4, 0x7c, 0x74, + 0x7c, 0x1d, 0x79, 0x4b, 0x70, 0x88, 0x68, 0x86, 0x19, 0xe, 0x53, 0x1d, + 0x55, 0x7e, 0x96, 0x9d, 0x94, 0x8f, 0x96, 0x8e, 0x98, 0x1f, 0xf7, 0x15, + 0xf8, 0x72, 0x9b, 0xc7, 0xa8, 0x8a, 0xc3, 0x8e, 0x82, 0xa, 0xbf, 0x84, + 0xa2, 0x7b, 0x75, 0x7c, 0x1d, 0x7b, 0x52, 0x76, 0x82, 0x60, 0x85, 0x19, + 0xe, 0xf7, 0x77, 0x8b, 0xae, 0x71, 0x76, 0xf7, 0x60, 0x77, 0xf8, 0x85, + 0x77, 0x12, 0x13, 0xb0, 0x6e, 0x16, 0xf7, 0x63, 0xae, 0x6, 0x50, 0x79, + 0xa3, 0xac, 0xa5, 0x93, 0xab, 0x93, 0xa7, 0x1f, 0xef, 0xf8, 0x0, 0x5, + 0x8d, 0x6, 0x13, 0x70, 0xcd, 0xfc, 0xbe, 0x5, 0xa7, 0x6, 0xf8, 0x7, + 0xf8, 0xca, 0x8d, 0x89, 0xfb, 0xf, 0xfc, 0x47, 0x5, 0x13, 0xb0, 0x7b, + 0x50, 0x6f, 0x78, 0x53, 0x87, 0x8, 0x68, 0xf7, 0xcc, 0xae, 0x7, 0x55, + 0x7a, 0x96, 0xa0, 0x98, 0x8f, 0x9c, 0x90, 0x9f, 0x1f, 0xf7, 0xf, 0xf8, + 0x51, 0x9b, 0xc9, 0xa4, 0x8f, 0xb3, 0x91, 0x19, 0xae, 0xfb, 0x68, 0x7, + 0xfb, 0xc8, 0xfc, 0x71, 0x6f, 0xa, 0x55, 0xf8, 0x71, 0x5, 0xfb, 0x71, + 0x68, 0x6, 0xc0, 0x89, 0x9e, 0x89, 0x6c, 0x1a, 0xfb, 0xc, 0xfc, 0x39, + 0x63, 0xfb, 0x1e, 0x7f, 0x92, 0x5a, 0x7f, 0x19, 0xe, 0x8b, 0x1d, 0x12, + 0x13, 0xa0, 0x70, 0x16, 0xf7, 0x64, 0xae, 0x6, 0x51, 0x79, 0x9d, 0xb0, + 0x9a, 0x8e, 0x9b, 0x90, 0x9c, 0x1f, 0xf4, 0xf8, 0x20, 0x5, 0x13, 0x60, + 0x59, 0xa, 0x8d, 0x96, 0x94, 0x8a, 0x93, 0x1b, 0xaf, 0x97, 0x72, 0x6b, + 0x6f, 0x85, 0x6a, 0x83, 0x71, 0x64, 0x1d, 0xfb, 0x12, 0xfc, 0x57, 0x18, + 0x13, 0xa0, 0x6d, 0x21, 0x80, 0x9b, 0x55, 0x7e, 0x8, 0xe, 0xc7, 0x79, + 0xad, 0xf9, 0xf, 0xad, 0x1, 0x4d, 0xa, 0x3, 0xf7, 0x3f, 0xf7, 0x2a, + 0x15, 0xe7, 0xe0, 0xf8, 0x2d, 0xf7, 0x4c, 0xf3, 0x8e, 0x21, 0x76, 0xfb, + 0x8, 0x2f, 0xfc, 0x1c, 0xfb, 0x46, 0x50, 0x5c, 0xad, 0x55, 0x1d, 0xd4, + 0xfb, 0x14, 0xf7, 0x3b, 0xf7, 0x8d, 0xf7, 0x43, 0xf7, 0x9e, 0xf7, 0x56, + 0xf7, 0x42, 0xfb, 0x1b, 0xd0, 0xfb, 0x1, 0xfb, 0x6f, 0xfb, 0x5d, 0xfb, + 0x7d, 0xfb, 0x89, 0x1e, 0xe, 0x58, 0xa0, 0x76, 0xf7, 0xd6, 0xab, 0xf7, + 0xaf, 0xab, 0x1, 0xf8, 0x67, 0xf7, 0x26, 0x3, 0xf7, 0xa1, 0xf7, 0xf6, + 0x6f, 0x1d, 0x23, 0x54, 0x55, 0xfb, 0x23, 0x1f, 0xfb, 0xbc, 0xfb, 0xf6, + 0x15, 0xf7, 0xba, 0xae, 0x6, 0x5a, 0x78, 0xa3, 0xb2, 0x97, 0x8e, 0x98, + 0x8e, 0x99, 0x1f, 0xc1, 0xf7, 0x4d, 0x5, 0xf7, 0x27, 0xf7, 0x63, 0xa4, + 0xf7, 0x39, 0xf7, 0x12, 0x20, 0xaa, 0x21, 0x1f, 0xfb, 0xb3, 0x68, 0x6, + 0xbe, 0x84, 0xa3, 0x88, 0x79, 0x8b, 0xa, 0x86, 0x1e, 0xfb, 0xf, 0xfc, + 0x5b, 0x7a, 0x4d, 0x6a, 0x6a, 0x63, 0x84, 0x19, 0xe, 0xc7, 0xfb, 0x64, + 0xe8, 0x5d, 0xf7, 0x46, 0x69, 0xad, 0xf9, 0xe, 0xad, 0x12, 0x4d, 0xa, + 0x13, 0x5c, 0xf7, 0x3f, 0xf7, 0x2a, 0x15, 0xe7, 0xe2, 0xf8, 0x2d, 0xf7, + 0x4c, 0xf3, 0x8c, 0x23, 0x76, 0xfb, 0x8, 0x2d, 0xfc, 0x1d, 0xfb, 0x46, + 0x50, 0x5e, 0xac, 0xef, 0x1e, 0xfb, 0x23, 0xfb, 0xcf, 0x15, 0x99, 0x73, + 0x5, 0xa2, 0xc4, 0xad, 0x90, 0xa0, 0x1b, 0xbe, 0xae, 0x7b, 0x7e, 0xb6, + 0x1f, 0x13, 0xbc, 0x81, 0xab, 0xaf, 0x83, 0xbc, 0x1b, 0xf7, 0x20, 0xd2, + 0xe3, 0xc8, 0xb7, 0x1f, 0x76, 0x9e, 0x5, 0x58, 0x6b, 0x51, 0x73, 0x4e, + 0x1b, 0x6e, 0x6c, 0x8e, 0x94, 0x70, 0x1f, 0x57, 0x9b, 0x5e, 0x93, 0x69, + 0x8f, 0x8, 0x66, 0x90, 0x75, 0x8c, 0x8f, 0x1a, 0x90, 0xaa, 0xa8, 0x9a, + 0x99, 0x1e, 0xf7, 0x86, 0xf7, 0x59, 0xf7, 0x91, 0xf7, 0x64, 0xf7, 0x42, + 0xfb, 0x19, 0xce, 0x5d, 0x1d, 0xfb, 0x7d, 0xfb, 0x89, 0x38, 0xbc, 0x27, + 0xf7, 0x5, 0x6c, 0x1f, 0x95, 0x87, 0x8b, 0x8b, 0x8f, 0x86, 0x88, 0x85, + 0x8b, 0x8b, 0xfb, 0x40, 0xfb, 0x23, 0x8, 0xe, 0x90, 0xa0, 0x76, 0xf9, + 0x11, 0xab, 0x1, 0xf8, 0x6c, 0xf7, 0x2b, 0x3, 0xf7, 0xa5, 0xf7, 0xff, + 0x15, 0xc7, 0xf7, 0x7a, 0x5, 0xa2, 0x90, 0x92, 0xa0, 0xac, 0x1b, 0xcb, + 0xa9, 0x56, 0x4f, 0x25, 0x3b, 0x50, 0xfb, 0xb, 0x1f, 0xfb, 0xc2, 0xfb, + 0xff, 0x8e, 0x1d, 0x66, 0x71, 0x8e, 0xb0, 0x94, 0x8d, 0x95, 0x8e, 0x98, + 0x1f, 0xc2, 0xf7, 0x74, 0x5, 0xa8, 0x6, 0xf6, 0xfb, 0xdf, 0x5, 0xf7, + 0x5e, 0xae, 0x6, 0x5b, 0x90, 0x79, 0x8d, 0x75, 0xcc, 0x38, 0xf7, 0x80, + 0x18, 0xf7, 0x17, 0xa0, 0xc8, 0xdf, 0xd7, 0x1a, 0xf7, 0x25, 0xfb, 0x44, + 0x8b, 0x4f, 0x1e, 0xfb, 0xa8, 0x68, 0x6, 0xbf, 0x84, 0xa2, 0x82, 0x77, + 0x1a, 0x87, 0x8a, 0x87, 0x8a, 0x84, 0x1e, 0xfb, 0x19, 0xfc, 0x70, 0x7b, + 0x52, 0x77, 0x81, 0x5f, 0x86, 0x19, 0xe, 0x21, 0x79, 0xad, 0xf9, 0xe, + 0xae, 0x87, 0x85, 0x1d, 0x13, 0xd8, 0x8d, 0x79, 0x15, 0xa9, 0x6, 0xa2, + 0x96, 0x8f, 0x97, 0xa4, 0x1b, 0x98, 0x9a, 0x84, 0x83, 0xa2, 0x1f, 0x82, + 0xa6, 0xaa, 0x80, 0xb4, 0x1b, 0xf7, 0x30, 0xe5, 0xf7, 0x0, 0xf7, 0x18, + 0xd3, 0x54, 0xc2, 0x51, 0xb8, 0x1f, 0x4b, 0xbe, 0x47, 0xb6, 0xc2, 0x1a, + 0x97, 0x84, 0xea, 0xf1, 0xf7, 0x6, 0xa6, 0xfb, 0x2, 0x53, 0x1e, 0xa6, + 0x87, 0x5, 0x13, 0xb8, 0xb3, 0xf7, 0x5d, 0x5, 0x6d, 0x6, 0x72, 0x7e, + 0x70, 0x8a, 0x87, 0x1b, 0x7c, 0x7a, 0x92, 0x92, 0x74, 0x1f, 0x13, 0xd8, + 0x93, 0x74, 0x70, 0x93, 0x6e, 0x1b, 0xfb, 0x19, 0x38, 0x2b, 0x26, 0x3b, + 0xc8, 0x5e, 0xc8, 0x63, 0x1f, 0xc8, 0x63, 0xc9, 0x66, 0x4b, 0x1a, 0x77, + 0x7e, 0xfb, 0x26, 0xfb, 0x4, 0x61, 0xfb, 0x5, 0x9b, 0xf7, 0x40, 0x1e, + 0x6e, 0x8d, 0x5, 0xe, 0x58, 0x58, 0xa, 0x1, 0xbd, 0x16, 0xf7, 0xdf, + 0x6, 0x8d, 0xae, 0x5, 0x51, 0x76, 0x91, 0xa9, 0x94, 0x8e, 0x97, 0x8f, + 0x9a, 0x1f, 0xf7, 0x1e, 0xf8, 0xa3, 0x5, 0xc0, 0xe0, 0x85, 0xfb, 0x29, + 0x1f, 0xa6, 0x89, 0xaf, 0xf7, 0x54, 0x5, 0xfc, 0xbb, 0x6, 0x65, 0xfb, + 0x3f, 0xa4, 0x84, 0x5, 0xf1, 0xbe, 0xd2, 0xb4, 0xea, 0x1b, 0xfb, 0x26, + 0xfc, 0xa3, 0x78, 0x46, 0x62, 0x86, 0x5e, 0x8d, 0x19, 0xe, 0xc7, 0x79, + 0xc3, 0xf8, 0xe9, 0xad, 0x1, 0xce, 0xf7, 0x1e, 0x3, 0xed, 0xf9, 0xe, + 0x15, 0xc9, 0x83, 0x96, 0x6b, 0x6b, 0x5d, 0x23, 0xfb, 0xa8, 0x38, 0xa, + 0xe1, 0xf7, 0xbb, 0x99, 0xbc, 0x9d, 0x9b, 0x55, 0xa, 0x8c, 0x93, 0x93, + 0x8b, 0x92, 0x1b, 0xba, 0x98, 0x68, 0x72, 0x85, 0x8a, 0x85, 0x8a, 0x86, + 0x1f, 0x3b, 0xfb, 0xbb, 0x5, 0x21, 0x6f, 0x65, 0xfb, 0xb, 0xfb, 0x23, + 0x1b, 0x28, 0x73, 0xb7, 0xc5, 0xb3, 0x9b, 0xbb, 0x97, 0xb7, 0x3e, 0x1d, + 0xe, 0x90, 0x87, 0x76, 0xf7, 0x53, 0x77, 0xb2, 0x77, 0xf8, 0x5c, 0xae, + 0x12, 0xd3, 0xf9, 0x1e, 0x13, 0xd8, 0x13, 0xb8, 0xf7, 0x7b, 0x79, 0x15, + 0xab, 0x6, 0xf8, 0x1d, 0xf8, 0xf8, 0x91, 0x94, 0x9b, 0x9f, 0xb0, 0x96, + 0x19, 0xae, 0xfb, 0x54, 0x68, 0x7, 0xba, 0x87, 0x9d, 0x8a, 0x6c, 0x1a, + 0xfb, 0x8b, 0xfc, 0x31, 0x6f, 0xa, 0x58, 0xf8, 0x18, 0x5, 0x8a, 0x96, + 0x8b, 0x94, 0x92, 0x1a, 0xa7, 0xa7, 0x8d, 0xbb, 0x8f, 0x1e, 0x61, 0xa, + 0xc7, 0x89, 0x93, 0x82, 0x94, 0x51, 0x8, 0xe, 0xf7, 0x77, 0x8e, 0x76, + 0xf7, 0x8b, 0x77, 0xf8, 0x3d, 0xae, 0x1, 0xf7, 0x70, 0x79, 0x15, 0xa8, + 0x6, 0xf7, 0x7b, 0xf8, 0x7a, 0x5, 0x8d, 0x6, 0xc6, 0xfc, 0x7a, 0x5, + 0xa8, 0x6, 0xf7, 0xa8, 0xf8, 0xcf, 0xab, 0xcb, 0xaa, 0x98, 0xaa, 0x90, + 0x19, 0xad, 0xfb, 0x4f, 0x68, 0x7, 0xb8, 0x8e, 0x9d, 0x81, 0x74, 0x1a, + 0x7d, 0x86, 0x7a, 0x81, 0x77, 0x1e, 0xfb, 0x2e, 0xfb, 0xd8, 0x6f, 0xa, + 0x6a, 0xf7, 0xb8, 0x5, 0x88, 0xa4, 0x89, 0xa0, 0x9e, 0x1a, 0xaa, 0x99, + 0x9b, 0xbb, 0x8c, 0x1e, 0xae, 0xfb, 0xa1, 0x69, 0x7, 0xbe, 0x83, 0x9f, + 0x92, 0x2a, 0x1a, 0xfb, 0x28, 0xfb, 0xc8, 0x6f, 0xa, 0x64, 0xf7, 0xe0, + 0x5, 0x8a, 0x94, 0x8b, 0x93, 0x92, 0x1a, 0xb0, 0xa8, 0x94, 0xab, 0x8e, + 0x1e, 0xae, 0xfb, 0xa9, 0x69, 0x7, 0xcb, 0x80, 0x8d, 0x94, 0x96, 0x43, + 0x8, 0xe, 0x90, 0x58, 0xa, 0x1, 0x73, 0x16, 0xf7, 0x6a, 0xae, 0x6, + 0x74, 0x8d, 0x57, 0x90, 0xae, 0x1a, 0xf7, 0x42, 0xf7, 0x4f, 0x5, 0x95, + 0x63, 0xba, 0x20, 0x60, 0x1a, 0x69, 0x6b, 0x89, 0x67, 0x88, 0x1e, 0x68, + 0xf7, 0xc8, 0xae, 0x7, 0x3f, 0x92, 0x7e, 0xa2, 0x70, 0xe1, 0x41, 0xf7, + 0x77, 0x18, 0xf7, 0x5b, 0xf7, 0x57, 0xbf, 0xc1, 0xa3, 0x8e, 0xa2, 0x8f, + 0x19, 0xae, 0xfb, 0x5f, 0x68, 0x7, 0xac, 0x88, 0xa6, 0x7b, 0x7b, 0x1a, + 0x87, 0x8a, 0x87, 0x87, 0x87, 0x1e, 0xfb, 0x38, 0xfb, 0x3a, 0x5, 0x7c, + 0xbf, 0x67, 0xda, 0x9e, 0x1a, 0xad, 0x9a, 0xa2, 0xc6, 0x91, 0x1e, 0xae, + 0xfb, 0xc5, 0x68, 0x7, 0xbf, 0x86, 0xa3, 0x83, 0x9a, 0x59, 0xdf, 0xfb, + 0x9a, 0x18, 0x4f, 0x4c, 0xfb, 0x3, 0xfb, 0xc, 0x47, 0x50, 0x75, 0x78, + 0x84, 0x87, 0x6c, 0x82, 0x8, 0xe, 0x58, 0x58, 0xa, 0x1, 0xd4, 0x16, + 0xf7, 0xd6, 0xae, 0x6, 0x5d, 0x8d, 0x6c, 0x8c, 0xb4, 0x1a, 0xc7, 0xf7, + 0x79, 0x6a, 0xa, 0xc4, 0x88, 0xa3, 0x80, 0x78, 0x1a, 0x81, 0x87, 0x7f, + 0x81, 0x7e, 0x1e, 0xfb, 0x2f, 0xfb, 0x6a, 0x48, 0xf7, 0x5c, 0x8d, 0x83, + 0x81, 0xa5, 0x19, 0x87, 0x95, 0x88, 0x96, 0x92, 0x1a, 0xa6, 0xa8, 0x94, + 0xb9, 0x6a, 0x1d, 0x4f, 0xfb, 0x62, 0x79, 0x4b, 0x72, 0x88, 0x51, 0x86, + 0x19, 0xe, 0x58, 0x58, 0xa, 0x3e, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x33, + 0xb8, 0xf9, 0x7b, 0xb8, 0x1, 0x66, 0xfb, 0x33, 0x15, 0xf7, 0x6f, 0x6, + 0x92, 0xb8, 0x5, 0x3b, 0x6, 0x7f, 0x76, 0x8b, 0xa3, 0x1f, 0xf7, 0x32, + 0xf9, 0x24, 0x5, 0xc6, 0x99, 0x8a, 0x8f, 0xb0, 0x1b, 0xd2, 0x6, 0x92, + 0xb8, 0x5, 0xfb, 0x5c, 0x6, 0xe, 0xfc, 0x14, 0xfb, 0x1c, 0x76, 0xf7, + 0x34, 0x8d, 0x1d, 0xf7, 0x1e, 0xfb, 0x31, 0x15, 0xc6, 0x6, 0x32, 0xf9, + 0xde, 0x5, 0x50, 0x6, 0xe, 0xfb, 0xdd, 0xfb, 0x31, 0xb8, 0xf9, 0x79, + 0xb8, 0x1, 0x64, 0xfb, 0x4, 0x15, 0x84, 0x5e, 0x5, 0xf7, 0x5b, 0x6, + 0xf7, 0x5c, 0xf9, 0xd3, 0x5, 0xfb, 0x70, 0x6, 0x84, 0x5e, 0x5, 0xd9, + 0x6, 0x96, 0xa3, 0x88, 0x75, 0x1f, 0xfb, 0x31, 0xfd, 0x21, 0x5, 0x51, + 0x7d, 0x89, 0x86, 0x66, 0x1b, 0xe, 0x2f, 0xf7, 0xd9, 0x76, 0xf8, 0x1, + 0x77, 0x1, 0xce, 0xf7, 0xc4, 0x15, 0xe4, 0x6, 0xf7, 0x15, 0xf7, 0xa1, + 0xf7, 0x15, 0xfb, 0xa1, 0x5, 0xe4, 0x6, 0xfb, 0x46, 0xf8, 0x1, 0x5, + 0x3b, 0x6, 0xe, 0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8, 0x88, + 0xbd, 0x7, 0xe, 0x7f, 0x1d, 0xf7, 0x49, 0x77, 0x1, 0xf7, 0x90, 0xf8, + 0x98, 0x7b, 0xa, 0xfb, 0x3, 0xf7, 0x27, 0x5, 0x98, 0x80, 0x7a, 0xa0, + 0x70, 0x1b, 0x70, 0x78, 0x75, 0x76, 0x76, 0xa0, 0x78, 0x98, 0x82, 0x1f, + 0xe, 0x58, 0x1d, 0xb5, 0x85, 0x77, 0x74, 0xa, 0x13, 0x68, 0xf7, 0x8e, + 0xf7, 0x7, 0x15, 0x2e, 0x1d, 0x13, 0x98, 0x71, 0xa, 0x90, 0x94, 0x44, + 0xa, 0x5, 0xfb, 0x3, 0x6, 0x7a, 0x4d, 0x6f, 0xa, 0x13, 0xa8, 0xa4, + 0x87, 0x8a, 0xb6, 0x4f, 0x1b, 0xfb, 0xe, 0xfb, 0x33, 0x2f, 0x1d, 0xcc, + 0xd5, 0xf7, 0x84, 0xdf, 0x94, 0xad, 0x39, 0xa, 0xe, 0x7e, 0xac, 0xf8, + 0xa, 0xcf, 0xf7, 0x81, 0x77, 0x1, 0xf7, 0xd3, 0xf7, 0x11, 0x3, 0xf7, + 0x5a, 0xf8, 0xc, 0x15, 0x89, 0x8d, 0xe3, 0xf7, 0xd5, 0x42, 0x77, 0x1d, + 0x65, 0xfb, 0x2d, 0xfc, 0x83, 0x6e, 0x1a, 0x77, 0xc1, 0x63, 0xe0, 0xf7, + 0x3b, 0xf7, 0x2c, 0xf7, 0x3e, 0xf7, 0x3d, 0xd9, 0x5b, 0xc5, 0x4d, 0x4c, + 0x64, 0x63, 0x5d, 0x69, 0x1e, 0x32, 0xfb, 0xd9, 0x15, 0x8c, 0xc7, 0xf7, + 0xea, 0xf3, 0xb9, 0x8b, 0x58, 0x7a, 0x36, 0x4a, 0xfb, 0x71, 0xfb, 0x5, + 0x86, 0x70, 0x8b, 0xaa, 0x1e, 0xe, 0xfb, 0x6e, 0x7e, 0xcb, 0xf7, 0x8f, + 0xf7, 0x34, 0x6a, 0xac, 0x12, 0x86, 0xf7, 0x14, 0x13, 0xb0, 0xf7, 0xd2, + 0xf7, 0x21, 0x15, 0x51, 0x63, 0x66, 0x6b, 0x5e, 0x1b, 0x6e, 0x5f, 0x95, + 0xdb, 0xd2, 0xc7, 0xf7, 0x6d, 0xe2, 0x94, 0x99, 0x87, 0x7e, 0x83, 0x85, + 0x83, 0x85, 0x81, 0x1f, 0x86, 0x82, 0x87, 0x81, 0x7e, 0x1a, 0x13, 0xd0, + 0x84, 0x1d, 0x67, 0xb7, 0x3c, 0xfb, 0x1e, 0xfb, 0x24, 0xfb, 0x3c, 0xfb, + 0x2d, 0xfb, 0x3, 0xde, 0x60, 0xcd, 0xf5, 0xbe, 0xd3, 0xcb, 0xb8, 0x1e, + 0xe, 0x7e, 0xd3, 0x5a, 0x76, 0xf8, 0x43, 0xb5, 0xf7, 0x81, 0x77, 0x12, + 0x76, 0xf7, 0x10, 0x13, 0x78, 0xf7, 0x8e, 0xf7, 0x7, 0x15, 0x84, 0x6c, + 0x88, 0x79, 0x7b, 0x1a, 0x4e, 0xc0, 0x8b, 0x92, 0xd1, 0xc2, 0xe2, 0xb2, + 0xa3, 0x1e, 0x75, 0x9b, 0x5, 0x84, 0x90, 0x55, 0x4b, 0x76, 0x1b, 0x86, + 0x88, 0x8f, 0x94, 0x1f, 0xf7, 0x3c, 0xf9, 0x6, 0x68, 0x83, 0x5d, 0x80, + 0xfb, 0x14, 0x81, 0x6d, 0xa, 0xb6, 0x9e, 0x85, 0x73, 0x7c, 0x72, 0x35, + 0x75, 0x38, 0x1f, 0x99, 0x7d, 0x83, 0x9e, 0x60, 0x1b, 0xfb, 0x8, 0xfb, + 0x37, 0xfb, 0x55, 0xfb, 0x2f, 0x1f, 0x13, 0xb8, 0x5f, 0xa2, 0x38, 0xde, + 0xe1, 0xbb, 0xd9, 0xbc, 0xa8, 0x1e, 0xfb, 0x25, 0x16, 0xd1, 0xcf, 0xf7, + 0x80, 0xe2, 0xb0, 0x98, 0x5d, 0x85, 0x6e, 0x47, 0xfb, 0xac, 0x2c, 0x63, + 0x89, 0xbd, 0x90, 0x1e, 0xe, 0xfb, 0x6e, 0x7e, 0xcb, 0xf8, 0x21, 0xac, + 0x1, 0x90, 0xf7, 0x16, 0xf7, 0x3f, 0xe7, 0x3, 0x50, 0x1d, 0xf7, 0x7, + 0xc2, 0x1a, 0xd3, 0x47, 0x93, 0x68, 0xfb, 0x37, 0xfb, 0x13, 0xfb, 0x55, + 0xfb, 0x1c, 0xfb, 0x4, 0xdf, 0x69, 0x35, 0xa, 0x8e, 0xda, 0x9e, 0x8d, + 0x97, 0x3d, 0xa, 0x65, 0x82, 0x57, 0x70, 0x3a, 0xfb, 0x17, 0x68, 0x1f, + 0xe, 0xfb, 0xdd, 0xfb, 0x61, 0xaa, 0xf8, 0xd9, 0xb5, 0xf7, 0x70, 0xa8, + 0x1, 0xb2, 0xf8, 0x2b, 0x15, 0xd4, 0x6, 0x76, 0x3b, 0x63, 0xfb, 0x57, + 0x70, 0xfb, 0x9, 0x8, 0xfb, 0x1c, 0x6e, 0x7c, 0x56, 0x5b, 0x1b, 0x80, + 0x86, 0x90, 0x92, 0x8e, 0x8f, 0x90, 0x8f, 0x92, 0x1f, 0x8f, 0x92, 0x8f, + 0x93, 0x96, 0x1a, 0xaf, 0x66, 0x98, 0x7e, 0x74, 0x6f, 0x79, 0x6c, 0x4f, + 0xb8, 0x73, 0xbf, 0xf7, 0x43, 0xb3, 0xf7, 0x67, 0xf8, 0x25, 0xe1, 0x1e, + 0xe5, 0x6, 0x94, 0xb5, 0x5, 0x2f, 0x6, 0xf7, 0x3, 0xa6, 0xaa, 0xf7, + 0x1, 0xbe, 0x1b, 0x93, 0x94, 0x88, 0x80, 0x88, 0x87, 0x87, 0x87, 0x84, + 0x1f, 0x87, 0x84, 0x87, 0x83, 0x80, 0x1a, 0x6e, 0xa0, 0x76, 0xa6, 0xa3, + 0xa7, 0x99, 0xb2, 0x9f, 0x81, 0xc7, 0x33, 0xfb, 0x12, 0x49, 0xfb, 0x5, + 0xfb, 0x1c, 0x68, 0x1e, 0x42, 0x6, 0xe, 0xfb, 0x5f, 0xad, 0xf7, 0x4c, + 0x76, 0xf7, 0x33, 0xaa, 0x74, 0x77, 0xf7, 0xb6, 0xaa, 0x12, 0x57, 0xe2, + 0xf7, 0x7b, 0xf7, 0x1, 0x40, 0xf7, 0x9, 0x13, 0xde, 0xd9, 0x93, 0x15, + 0x89, 0x7, 0x4c, 0x7b, 0x48, 0x7a, 0x42, 0x1a, 0x3f, 0xf3, 0x70, 0xdb, + 0xf7, 0x3f, 0xd3, 0xda, 0xd0, 0xda, 0x44, 0xa6, 0x3d, 0xa0, 0x1e, 0x30, + 0xa6, 0x7e, 0x97, 0x9b, 0x1a, 0x96, 0x99, 0xa2, 0x98, 0x1e, 0x13, 0xed, + 0x92, 0x92, 0x8a, 0x88, 0x92, 0x1f, 0x88, 0x93, 0x93, 0x8a, 0x96, 0x1b, + 0xf7, 0x1, 0xf7, 0x3, 0xcc, 0xf7, 0x4, 0x9f, 0x89, 0x93, 0x87, 0x9a, + 0x1f, 0xce, 0xc3, 0xfb, 0x3, 0x6, 0x9e, 0x73, 0x67, 0x99, 0x5b, 0x1b, + 0xfb, 0x28, 0x3f, 0x25, 0x3e, 0x54, 0xa8, 0x64, 0xbe, 0x78, 0x1f, 0x4b, + 0x68, 0x6b, 0x79, 0x5e, 0x1a, 0x60, 0xb7, 0x7b, 0x9a, 0x86, 0x1e, 0x13, + 0xee, 0xae, 0x7d, 0x15, 0xa7, 0xf7, 0x11, 0x63, 0x56, 0x4f, 0x32, 0x81, + 0x5e, 0x40, 0x75, 0xab, 0xb0, 0xbe, 0xd4, 0xb6, 0x90, 0x1f, 0xb1, 0xf7, + 0x92, 0x15, 0x13, 0xed, 0xac, 0xa7, 0xf7, 0x2a, 0xd6, 0xaf, 0x95, 0x68, + 0x70, 0x5b, 0x68, 0xfb, 0x1d, 0x45, 0x5f, 0x8b, 0xb9, 0x9d, 0x1e, 0xe, + 0x89, 0x1d, 0xf7, 0x81, 0x77, 0x12, 0x13, 0x70, 0x7e, 0x83, 0xa, 0xa4, + 0xe3, 0xae, 0xf7, 0xa, 0xb4, 0xc9, 0x8, 0xb6, 0xa7, 0xbe, 0xda, 0xb5, + 0x1b, 0x9e, 0x8f, 0x7c, 0x83, 0x7d, 0x70, 0x44, 0x73, 0x41, 0x1f, 0x78, + 0x4f, 0x79, 0x4e, 0x68, 0x1a, 0x13, 0xb0, 0x6a, 0xa1, 0x6f, 0xb6, 0xdd, + 0xb8, 0xd3, 0xcb, 0xb4, 0x1e, 0x75, 0x9a, 0x5, 0x77, 0x88, 0x53, 0x4d, + 0x8f, 0xa, 0x90, 0x96, 0x90, 0xa0, 0xc5, 0xa1, 0xcb, 0x1f, 0xa3, 0xd0, + 0xa3, 0xd6, 0x9f, 0x1a, 0xda, 0x53, 0x9b, 0x75, 0x59, 0x50, 0x6f, 0xfb, + 0x26, 0x29, 0x1e, 0x89, 0x8c, 0xf5, 0xf8, 0x2e, 0x40, 0x7c, 0x53, 0x83, + 0x3e, 0x84, 0x82, 0x1d, 0x66, 0x1d, 0xf8, 0xc3, 0xf7, 0x1a, 0x4d, 0x1d, + 0x53, 0x55, 0x73, 0x88, 0x1d, 0x8f, 0x95, 0x32, 0x1d, 0xa9, 0x8b, 0x6b, + 0x1f, 0x34, 0x1d, 0xfb, 0x2, 0xf8, 0x7f, 0x15, 0x41, 0x1d, 0xe, 0xfc, + 0x14, 0xfb, 0x4e, 0x76, 0xf9, 0x89, 0xf7, 0x1a, 0x1, 0xaa, 0xf8, 0x2b, + 0x15, 0xbb, 0x99, 0x85, 0x72, 0x1f, 0x23, 0xfc, 0x39, 0x5, 0x36, 0x75, + 0x7c, 0x5d, 0x67, 0x1b, 0x81, 0x7f, 0x92, 0x90, 0x8f, 0x8e, 0x90, 0x8f, + 0x90, 0x1f, 0x8f, 0x91, 0x8f, 0x91, 0x97, 0x1a, 0xb3, 0x65, 0x94, 0x80, + 0x73, 0x72, 0x76, 0x6b, 0x6f, 0xa0, 0x5a, 0xe0, 0xe4, 0xd6, 0xc9, 0xf7, + 0x3d, 0xb7, 0x1e, 0xf7, 0x6, 0xf8, 0x4a, 0x45, 0x7c, 0x7b, 0x89, 0xfb, + 0xe, 0x80, 0x19, 0xf7, 0x5, 0xf7, 0x4c, 0x15, 0x41, 0x1d, 0xe, 0x83, + 0xd2, 0x61, 0x76, 0xf8, 0x55, 0x77, 0xf7, 0xa2, 0x77, 0x12, 0x13, 0x70, + 0x74, 0x16, 0xf7, 0xe, 0x6, 0xbd, 0xf7, 0x50, 0xb2, 0xa6, 0x5, 0x13, + 0xb0, 0xfb, 0xe, 0xa1, 0xa3, 0x26, 0xd9, 0x1b, 0xd0, 0xb5, 0xdb, 0xb7, + 0xa3, 0x1f, 0x75, 0x96, 0x5, 0x76, 0x7f, 0x74, 0x60, 0x71, 0x1b, 0x69, + 0x7d, 0xd3, 0xf7, 0x32, 0x6c, 0x1f, 0xca, 0xc2, 0xd7, 0xce, 0xa2, 0x85, + 0xaf, 0x90, 0x19, 0xae, 0xfb, 0x63, 0x68, 0x7, 0xa5, 0xa4, 0x89, 0x74, + 0x68, 0xfb, 0xf, 0x39, 0x65, 0x6d, 0x1f, 0x89, 0x8d, 0xf7, 0xe, 0xf8, + 0x5b, 0x4c, 0x7f, 0x38, 0x7f, 0x4d, 0x85, 0x82, 0x1d, 0x66, 0x1d, 0xf9, + 0x58, 0x6c, 0x1d, 0x54, 0x55, 0x73, 0x1b, 0x84, 0x87, 0x8f, 0x95, 0x9f, + 0x9b, 0xc5, 0x91, 0xa1, 0x1f, 0xf7, 0x25, 0xf8, 0x9f, 0x7f, 0xa, 0xac, + 0x8d, 0x6c, 0x1f, 0x5c, 0xfb, 0x22, 0xfc, 0x54, 0x4f, 0x1a, 0x7d, 0x8b, + 0x56, 0xcf, 0xdb, 0xb7, 0xd0, 0xce, 0xb7, 0x1e, 0xe, 0xf7, 0x8, 0x97, + 0x76, 0xa9, 0x76, 0xf8, 0x19, 0xd4, 0x12, 0x13, 0x60, 0x7d, 0x83, 0xa, + 0xf8, 0x0, 0xe8, 0xf7, 0x3, 0xa4, 0x92, 0x1b, 0xb8, 0x4d, 0xfb, 0x2e, + 0xfb, 0x7f, 0x41, 0x1f, 0xf7, 0xc, 0x6, 0xbd, 0xf7, 0x38, 0x99, 0xb8, + 0xb0, 0xcb, 0x8e, 0x91, 0xde, 0xf7, 0x5, 0xad, 0x8c, 0x8, 0x94, 0x91, + 0x83, 0x78, 0x7d, 0x6b, 0x38, 0x72, 0x3c, 0x1f, 0x7a, 0x56, 0x7d, 0x57, + 0x6e, 0x1a, 0x13, 0xa0, 0x4a, 0xc0, 0x8b, 0x9c, 0xdb, 0xb9, 0xd9, 0xc0, + 0xaa, 0x1e, 0x75, 0x98, 0x5, 0x73, 0x88, 0x57, 0x58, 0x76, 0x1b, 0x86, + 0x87, 0x90, 0x94, 0x9d, 0x9f, 0xc3, 0xa0, 0xc7, 0x1f, 0xa2, 0xce, 0xa4, + 0xd4, 0xae, 0x1a, 0xb7, 0x73, 0xae, 0x54, 0x39, 0x50, 0x37, 0x3a, 0x58, + 0x1e, 0x8a, 0x8d, 0x5, 0x94, 0xa2, 0x99, 0xad, 0xb2, 0x1a, 0xce, 0x4e, + 0x8b, 0x86, 0x32, 0x4a, 0x27, 0x32, 0x51, 0x1e, 0x88, 0x8d, 0xc7, 0xf7, + 0x4e, 0x46, 0x7b, 0x72, 0x89, 0x21, 0x82, 0x6d, 0xa, 0x9a, 0xb2, 0x8e, + 0x6e, 0x1f, 0x13, 0x60, 0x6a, 0x5e, 0xfb, 0x1f, 0x52, 0xfb, 0x65, 0x1e, + 0xe, 0x89, 0x1d, 0x12, 0x13, 0x60, 0x78, 0xa, 0xaf, 0x6d, 0x2e, 0x30, + 0x6d, 0x1f, 0x77, 0x4f, 0x78, 0x50, 0x6c, 0x1a, 0x13, 0xa0, 0x76, 0x1d, + 0x6a, 0x81, 0x62, 0x61, 0x76, 0x1b, 0x84, 0x86, 0x90, 0x97, 0x99, 0x9f, + 0xc4, 0xa0, 0xc9, 0x1f, 0xa1, 0xcd, 0xa3, 0xd4, 0xad, 0x4f, 0xa, 0x13, + 0x60, 0x88, 0xa, 0xe, 0x7e, 0xa8, 0xf8, 0x35, 0xa8, 0x52, 0x1d, 0xe1, + 0x15, 0xcb, 0xbf, 0xf7, 0xaf, 0xf7, 0x0, 0xa5, 0x9f, 0x7d, 0x59, 0x40, + 0x4f, 0xfb, 0xaa, 0x2b, 0x57, 0x8d, 0xbd, 0x9f, 0x1e, 0xfb, 0xb, 0xbd, + 0x15, 0x2b, 0xd7, 0x56, 0xdd, 0xf7, 0x34, 0xf7, 0x12, 0xf7, 0x40, 0xf7, + 0x29, 0xf7, 0x1a, 0xfb, 0x9, 0x9f, 0x65, 0xfb, 0x32, 0xfb, 0x17, 0xfb, + 0x40, 0xfb, 0x2e, 0x1e, 0xe, 0x87, 0x1d, 0x59, 0x1d, 0x78, 0x6b, 0x43, + 0x44, 0xfb, 0x8a, 0x4f, 0x1d, 0x57, 0x1f, 0x88, 0x8e, 0xad, 0xf2, 0x44, + 0x7d, 0x64, 0x87, 0x38, 0x81, 0x6d, 0xa, 0xaf, 0x9d, 0x89, 0x72, 0x75, + 0x4a, 0xfb, 0x85, 0x4f, 0xfb, 0x8f, 0x1f, 0x69, 0x83, 0x6d, 0x87, 0xa, + 0x6d, 0x8d, 0xab, 0xa1, 0xa8, 0xe3, 0x93, 0xac, 0x1f, 0xe, 0xfb, 0x61, + 0xb0, 0xf7, 0x2f, 0xd3, 0xf7, 0xfc, 0xb6, 0x7e, 0x77, 0x12, 0x8c, 0xf7, + 0x11, 0x13, 0xd8, 0xf3, 0xfb, 0x3c, 0x15, 0x66, 0xf7, 0x9f, 0xb0, 0x7, + 0x68, 0x6d, 0x8b, 0xa9, 0xa0, 0xf7, 0x13, 0xf8, 0x37, 0xb1, 0xf7, 0x27, + 0x1f, 0xfb, 0x1, 0x6, 0x7d, 0x54, 0x6f, 0xa, 0x13, 0xe8, 0xab, 0x86, + 0x84, 0xaf, 0x4b, 0x1b, 0xfb, 0x13, 0xfb, 0x22, 0xfb, 0x60, 0xfb, 0x11, + 0x6a, 0x8b, 0xfb, 0x5, 0xf4, 0xd4, 0xb8, 0xc5, 0xb9, 0xa7, 0x1f, 0x8d, + 0x89, 0x4f, 0xfb, 0x77, 0x83, 0x6d, 0x6d, 0x8e, 0x57, 0x88, 0x19, 0xa1, + 0xf7, 0xc1, 0x15, 0xd6, 0xdc, 0xf7, 0x67, 0xdd, 0xa7, 0x93, 0x70, 0x74, + 0x54, 0x4a, 0xfb, 0x93, 0x2e, 0x62, 0x8b, 0xbc, 0xa4, 0x1e, 0xe, 0xfb, + 0xa5, 0xa0, 0x76, 0xf8, 0x62, 0x77, 0x1, 0x76, 0x83, 0xa, 0xab, 0xe8, + 0x95, 0xbb, 0xa5, 0xce, 0x8, 0xc0, 0xa1, 0xbf, 0xef, 0xa7, 0x1b, 0x91, + 0x91, 0x83, 0x83, 0x92, 0x1f, 0x81, 0x94, 0x98, 0x7f, 0x9e, 0x1b, 0xaa, + 0xa7, 0xa6, 0xb9, 0xcd, 0x55, 0x8b, 0x87, 0x49, 0x50, 0xfb, 0xc, 0x51, + 0x68, 0x1f, 0xc3, 0xf7, 0x46, 0x48, 0x7a, 0x6c, 0x89, 0x25, 0x82, 0x6d, + 0xa, 0xaf, 0x9d, 0x89, 0x72, 0x6b, 0x5a, 0xfb, 0x3c, 0x56, 0xfb, 0x48, + 0x1f, 0xe, 0xfb, 0xa5, 0x93, 0x76, 0xf8, 0x51, 0xac, 0x87, 0x77, 0x12, + 0x8e, 0xa6, 0xf7, 0x2d, 0xeb, 0xa4, 0xa8, 0x13, 0xdc, 0x85, 0xa, 0x96, + 0x95, 0x87, 0x86, 0x97, 0x1f, 0x86, 0x9a, 0x9c, 0x85, 0xa3, 0x1b, 0xcb, + 0xe4, 0xb0, 0xec, 0xba, 0x6f, 0xb6, 0x6c, 0xb3, 0x1f, 0x66, 0xbb, 0x62, + 0xb5, 0xad, 0x1a, 0x90, 0x87, 0xbc, 0xc0, 0xc6, 0xa4, 0x46, 0x59, 0x93, + 0x1e, 0xa6, 0x89, 0x5, 0x13, 0xbc, 0x79, 0xa, 0x7b, 0x82, 0x91, 0x90, + 0x80, 0x1f, 0x91, 0x80, 0x7e, 0x90, 0x72, 0x1b, 0x4a, 0x3c, 0x67, 0x32, + 0x62, 0xaa, 0x5f, 0xab, 0x60, 0x1f, 0xae, 0x5c, 0xb1, 0x5c, 0x60, 0x1a, + 0x72, 0x78, 0x6d, 0x65, 0x82, 0x43, 0x7c, 0xa, 0xe, 0x66, 0x1d, 0xf8, + 0x34, 0xb5, 0xf7, 0x25, 0x77, 0x1, 0xf7, 0x5f, 0xf7, 0x21, 0x15, 0x79, + 0x89, 0x55, 0x4e, 0x72, 0x1b, 0x84, 0x87, 0x8f, 0x95, 0xad, 0xc1, 0xf7, + 0x43, 0xac, 0xf7, 0xe, 0x1f, 0xde, 0xb5, 0x43, 0x6, 0xb2, 0xf7, 0x25, + 0x5, 0x68, 0x6, 0x47, 0x21, 0x3f, 0x6c, 0x64, 0x7c, 0x8, 0x68, 0xbe, + 0x7, 0x5f, 0xfb, 0x32, 0x5b, 0xfb, 0x2a, 0x62, 0x1a, 0x84, 0x8b, 0x4f, + 0xd3, 0xd9, 0xbc, 0xd9, 0xc5, 0xb0, 0x1e, 0xe, 0x64, 0xa, 0xac, 0x77, + 0x12, 0x13, 0xc0, 0x2c, 0x1d, 0x56, 0x4d, 0x73, 0x1b, 0x84, 0x87, 0x91, + 0x98, 0x31, 0xa, 0x63, 0xa0, 0xc2, 0xaf, 0x96, 0x1f, 0x13, 0xa0, 0x44, + 0x1d, 0xa1, 0x88, 0x71, 0x6e, 0x78, 0x50, 0x79, 0x4f, 0x1f, 0x78, 0x4d, + 0x78, 0x4b, 0x68, 0x47, 0xa, 0xe, 0xfb, 0x6e, 0x93, 0x76, 0xf8, 0x6f, + 0x77, 0x1, 0xda, 0xf7, 0xf, 0xdd, 0xf7, 0x9, 0x3, 0xe0, 0x7e, 0x15, + 0xa5, 0x6, 0xf7, 0x3e, 0xf7, 0x32, 0xf7, 0xc, 0xf7, 0x29, 0xef, 0x1a, + 0xb6, 0x68, 0xa4, 0x6f, 0x73, 0x6d, 0x73, 0x6a, 0x76, 0x95, 0x7d, 0x95, + 0x7f, 0x1e, 0x97, 0x7d, 0x97, 0x80, 0x79, 0x1a, 0x6f, 0x75, 0x60, 0x23, + 0xfb, 0x8, 0x1e, 0xf7, 0x4e, 0x82, 0xcf, 0x75, 0xdb, 0x1e, 0x4f, 0x7c, + 0x63, 0x86, 0x54, 0x83, 0x8, 0x70, 0x7, 0xaa, 0xa5, 0x87, 0x6a, 0x1f, + 0x86, 0x8c, 0x85, 0x84, 0x1a, 0xe, 0x90, 0x93, 0x76, 0xf7, 0x5f, 0x77, + 0xf7, 0xb8, 0x77, 0x1, 0xe0, 0xf7, 0xb, 0xf7, 0xe2, 0xd7, 0x3, 0xea, + 0x7e, 0x15, 0xa6, 0x6, 0xda, 0xf7, 0xd, 0xdb, 0xf7, 0x22, 0x94, 0x9e, + 0x8, 0x8d, 0x6, 0x8f, 0x5d, 0x9c, 0xfb, 0x67, 0x8d, 0x72, 0x8, 0xa6, + 0x6, 0xb5, 0xb7, 0xf7, 0x7a, 0xf7, 0x85, 0xf7, 0x11, 0x1a, 0xb9, 0x66, + 0x9e, 0x73, 0x6a, 0x74, 0x6b, 0x70, 0x77, 0x95, 0x7d, 0x95, 0x7d, 0x1e, + 0x95, 0x7d, 0x96, 0x7d, 0x79, 0x1a, 0x62, 0x37, 0x2a, 0x68, 0x62, 0x1e, + 0x6b, 0xf7, 0xe0, 0x5, 0x70, 0x6, 0x52, 0x30, 0x5d, 0x31, 0x58, 0x30, + 0x8, 0x89, 0x6, 0xf7, 0x12, 0x7e, 0xd3, 0x77, 0xd5, 0x1e, 0x5e, 0x82, + 0x5d, 0x81, 0x4b, 0x82, 0x8, 0x70, 0x7, 0xab, 0xa5, 0x8b, 0x69, 0x1f, + 0x85, 0x8c, 0x84, 0x83, 0x1a, 0xe, 0x93, 0x76, 0xe9, 0x77, 0xb4, 0x77, + 0xf8, 0x10, 0x77, 0x1, 0xf7, 0x41, 0xf7, 0x22, 0x15, 0xfb, 0xa, 0x9f, + 0xab, 0x66, 0xba, 0x1b, 0xcd, 0xc4, 0xdf, 0xb1, 0xa5, 0x1f, 0x76, 0x99, + 0x5, 0x68, 0x76, 0x75, 0x75, 0x78, 0x1b, 0x78, 0x7c, 0x99, 0xb0, 0x83, + 0x1f, 0x6b, 0xf7, 0x30, 0x5, 0x9f, 0x99, 0xb6, 0xd6, 0xae, 0x1b, 0x97, + 0x92, 0x86, 0x86, 0x93, 0x1f, 0x86, 0x92, 0x93, 0x86, 0x99, 0x1b, 0xac, + 0xa3, 0xa5, 0xa5, 0xa3, 0x74, 0xb1, 0x6a, 0x57, 0x69, 0x6a, 0x22, 0x41, + 0x1f, 0x7b, 0xd9, 0x82, 0xab, 0x77, 0xa7, 0xfb, 0x3b, 0x73, 0x18, 0x70, + 0x7, 0x8c, 0x95, 0x98, 0x8c, 0x96, 0x1b, 0x9e, 0xa4, 0x8b, 0x48, 0x98, + 0x1f, 0xa9, 0xfb, 0x2e, 0x5, 0x34, 0x55, 0x7c, 0x73, 0x75, 0x1b, 0x7f, + 0x85, 0x91, 0x91, 0x81, 0x1f, 0x8f, 0x83, 0x81, 0x90, 0x7b, 0x1b, 0x68, + 0x77, 0x6c, 0x73, 0x7b, 0x94, 0x5f, 0xc0, 0xc2, 0xcb, 0xd4, 0xdd, 0xb1, + 0x1f, 0xe, 0x79, 0x1d, 0x1, 0xf7, 0xdc, 0xcb, 0x3, 0x45, 0xa, 0x95, + 0x94, 0x7c, 0x1e, 0x93, 0x7e, 0x7d, 0x93, 0x79, 0x38, 0x1d, 0x6a, 0x99, + 0x80, 0x99, 0x81, 0x1e, 0x98, 0x82, 0x99, 0x83, 0x75, 0x7a, 0xa, 0xe, + 0xfb, 0xa5, 0x52, 0x76, 0xf8, 0x46, 0xe8, 0x1, 0x79, 0x74, 0x15, 0xa7, + 0xb1, 0x8b, 0x8b, 0x9a, 0x1b, 0xa4, 0xa4, 0x79, 0x78, 0xa8, 0x1f, 0x75, + 0xac, 0xb2, 0x73, 0xc0, 0x76, 0xa, 0x7f, 0x8e, 0x83, 0x8f, 0x85, 0x1f, + 0x91, 0x82, 0x92, 0x86, 0x82, 0x1a, 0x84, 0x83, 0x83, 0x7e, 0x6f, 0x81, + 0xa6, 0xac, 0x7a, 0x1e, 0x7a, 0xab, 0x72, 0xb1, 0x51, 0xa2, 0x80, 0xa, + 0xfb, 0x2b, 0x70, 0x1d, 0xfb, 0xf9, 0x5, 0xe, 0x8a, 0xa, 0x12, 0xa7, + 0xf3, 0x60, 0xf1, 0x13, 0xe0, 0xf7, 0x69, 0xfb, 0x43, 0x15, 0x47, 0x95, + 0x7e, 0xad, 0xaf, 0x1a, 0x13, 0xd0, 0xc5, 0xc6, 0xf7, 0x2f, 0xc0, 0x1a, + 0xb7, 0x77, 0x9b, 0x47, 0x9c, 0x1e, 0x8d, 0x7, 0xf1, 0x9d, 0xa6, 0xa5, + 0x9d, 0xd2, 0xb8, 0xf7, 0x47, 0x18, 0x9d, 0xd1, 0xae, 0xb8, 0xe0, 0x9a, + 0x8e, 0x97, 0x18, 0xfb, 0x19, 0x37, 0x77, 0xfb, 0xe, 0x6c, 0x1f, 0x5d, + 0xfb, 0x47, 0x7a, 0x49, 0x6f, 0x6c, 0x2f, 0x78, 0x19, 0xc4, 0x7d, 0xa6, + 0x79, 0x60, 0x1a, 0x13, 0xe0, 0x64, 0x4e, 0xfb, 0x41, 0x52, 0x1a, 0x4b, + 0xb2, 0x6f, 0xf7, 0x23, 0x1e, 0xe, 0xfc, 0x4e, 0xfb, 0x3b, 0x76, 0xf7, + 0x53, 0x8d, 0x1d, 0xb0, 0xe3, 0x3, 0xf7, 0x5d, 0xf9, 0x41, 0x15, 0xcf, + 0x6, 0xfb, 0x79, 0xfd, 0xfd, 0x5, 0x47, 0x6, 0xe, 0x8a, 0xa, 0x1, + 0xf7, 0x8, 0xf1, 0x6d, 0xf3, 0x3, 0xfb, 0x12, 0xfb, 0x43, 0x15, 0xe0, + 0x9b, 0xad, 0xb1, 0x9e, 0xd1, 0xb8, 0xf7, 0x3f, 0x18, 0x9e, 0xd3, 0xa6, + 0xb1, 0xf0, 0x9e, 0x8, 0x8d, 0x7, 0x47, 0x9b, 0x77, 0x9a, 0xb6, 0xc0, + 0xc6, 0xf7, 0x2f, 0xc6, 0x1a, 0xb0, 0x7e, 0xad, 0x47, 0x96, 0x1e, 0x8e, + 0x97, 0x5, 0xf7, 0x23, 0xb2, 0x6d, 0x4b, 0x1f, 0x52, 0x4e, 0xfb, 0x3e, + 0x63, 0x1a, 0x60, 0xa6, 0x7a, 0xc4, 0x7c, 0x1e, 0x2e, 0x78, 0x71, 0x5e, + 0x79, 0x49, 0x5d, 0xfb, 0x3f, 0x18, 0xfb, 0xd, 0x6b, 0x38, 0x7c, 0xfb, + 0x19, 0x1b, 0xe, 0x2f, 0xf7, 0x45, 0xdf, 0x48, 0x76, 0xa2, 0x76, 0xd1, + 0xdf, 0x8f, 0x77, 0x12, 0x13, 0x50, 0xef, 0xf7, 0x41, 0x15, 0xae, 0x9b, + 0xa3, 0xb0, 0xb7, 0x1b, 0xb4, 0xac, 0x7c, 0x7b, 0xaa, 0x1f, 0x13, 0x88, + 0x79, 0xae, 0xad, 0x78, 0xb6, 0x1b, 0xc9, 0xac, 0xb7, 0xb5, 0xa9, 0x1f, + 0x67, 0xd1, 0x5, 0x68, 0x74, 0x72, 0x66, 0x63, 0x1b, 0x6e, 0x68, 0x9b, + 0x9b, 0x67, 0x1f, 0x13, 0x30, 0x9d, 0x64, 0x63, 0x9d, 0x69, 0x1b, 0x48, + 0x67, 0x5f, 0x61, 0x75, 0x1f, 0xe, 0xfb, 0xa5, 0xfb, 0x4c, 0x76, 0xf8, + 0xbd, 0xf7, 0x24, 0x1, 0x9e, 0xf7, 0x29, 0x95, 0xf7, 0x24, 0x3, 0xf7, + 0x55, 0xf7, 0xa7, 0x15, 0x4c, 0xfb, 0x39, 0x3a, 0xfb, 0x2f, 0x7b, 0x6d, + 0x8, 0x82, 0x7a, 0x86, 0x7a, 0x7c, 0x1a, 0x5d, 0xac, 0x68, 0xae, 0xc6, + 0x9e, 0xc1, 0xb5, 0x8e, 0x1e, 0x94, 0xf7, 0x7, 0xa4, 0xf7, 0x32, 0x9f, + 0xf2, 0x8, 0x5f, 0xf7, 0x2d, 0x15, 0x63, 0xab, 0x6b, 0xb3, 0xb3, 0xab, + 0xab, 0xb3, 0xb3, 0x6b, 0xab, 0x63, 0x63, 0x6b, 0x6b, 0x63, 0x1e, 0xe, + 0xfb, 0xe, 0x76, 0xf7, 0x2b, 0x76, 0xf8, 0x4f, 0xac, 0xf7, 0x5, 0x77, + 0x1, 0x97, 0xf7, 0x13, 0x3, 0xf7, 0x6a, 0xc4, 0x15, 0x63, 0x9c, 0x86, + 0xbe, 0xa5, 0x1a, 0xce, 0xca, 0xf7, 0x68, 0xde, 0xa0, 0x8e, 0x82, 0x84, + 0x1e, 0xfb, 0x29, 0xfc, 0x3f, 0x15, 0x5d, 0xfb, 0x16, 0x5, 0xad, 0x6, + 0xba, 0xf7, 0x19, 0xdd, 0x98, 0xb6, 0xc8, 0xb5, 0xc6, 0x19, 0x70, 0x9d, + 0x6b, 0x5b, 0x64, 0x63, 0x5c, 0x8a, 0x19, 0xe7, 0xf7, 0x9a, 0x5, 0x85, + 0x92, 0x97, 0x86, 0x9d, 0x1b, 0xaa, 0xab, 0xa5, 0xb5, 0xab, 0x79, 0xa9, + 0x68, 0x9c, 0x1f, 0xb8, 0xf7, 0x12, 0x5, 0x68, 0x6, 0x62, 0xfb, 0x8, + 0x5, 0x8d, 0x81, 0x81, 0x8c, 0x7f, 0x1b, 0xfb, 0x1b, 0xfb, 0x26, 0xfb, + 0x2e, 0xfb, 0x32, 0xfb, 0xe, 0xe9, 0x61, 0xc1, 0x1f, 0xe, 0x7f, 0xaa, + 0x6c, 0xf3, 0x23, 0xf7, 0x42, 0xfb, 0x2c, 0x76, 0xf7, 0x17, 0x77, 0xc2, + 0x77, 0xf7, 0x43, 0xc7, 0xf7, 0xab, 0xad, 0x12, 0x6b, 0xa9, 0x13, 0x4f, + 0x80, 0xf7, 0x30, 0xbc, 0x15, 0x6e, 0xab, 0xb8, 0x6b, 0xb8, 0x1b, 0xe7, + 0xb9, 0xd0, 0xed, 0x9d, 0x1f, 0x72, 0x6, 0x67, 0x7b, 0x7f, 0x70, 0x46, + 0x1b, 0x65, 0x4a, 0xa5, 0x91, 0x7c, 0x1f, 0xad, 0xc0, 0xaa, 0xde, 0x95, + 0xbd, 0x8, 0xf7, 0x7, 0x6, 0x95, 0xc7, 0x5, 0xfb, 0x6, 0x6, 0xb2, + 0xf7, 0x5e, 0x5, 0xbc, 0x94, 0xa0, 0xa7, 0xaa, 0x1b, 0xa7, 0x87, 0x73, + 0x73, 0x86, 0x1f, 0x89, 0x82, 0x8a, 0x82, 0x83, 0x1a, 0x67, 0xab, 0x7c, + 0xa0, 0xa7, 0xac, 0xa2, 0xb7, 0xcc, 0x4f, 0xa6, 0x58, 0x67, 0xfb, 0x37, + 0x7d, 0xfb, 0xbf, 0x59, 0x1e, 0x22, 0x6, 0x81, 0x4f, 0x5, 0xf7, 0x1, + 0x6, 0x83, 0x56, 0x86, 0x4d, 0x85, 0x5c, 0x8, 0x13, 0x23, 0x80, 0x93, + 0x78, 0x7d, 0x91, 0x6b, 0x1b, 0x5d, 0x5d, 0x6d, 0x50, 0x1f, 0x13, 0x1f, + 0x80, 0x5e, 0xaf, 0x64, 0xbe, 0xca, 0xa2, 0xaf, 0xa3, 0x9a, 0x1e, 0x60, + 0xb4, 0x15, 0x13, 0x8f, 0x80, 0x6a, 0x85, 0x7b, 0x65, 0x66, 0x1b, 0x75, + 0x69, 0x99, 0xad, 0xb7, 0xaa, 0x94, 0x9f, 0xa9, 0xa0, 0x79, 0x7f, 0x98, + 0x1f, 0xe, 0xd2, 0x76, 0xdc, 0xd5, 0xf7, 0x65, 0xd5, 0xd4, 0x77, 0x1, + 0xd3, 0xdb, 0xf7, 0x5d, 0xda, 0x3, 0xf7, 0x1c, 0xf7, 0xcc, 0x15, 0xca, + 0xbe, 0xbf, 0xcb, 0xcd, 0xba, 0x55, 0x4c, 0x4a, 0x5b, 0x54, 0x48, 0x4a, + 0x5b, 0xc4, 0xcc, 0x1e, 0x39, 0xfb, 0x8e, 0x15, 0xe1, 0xe3, 0x5, 0x78, + 0xa7, 0xb3, 0x7c, 0xb6, 0x1b, 0xb6, 0xb1, 0x9a, 0x9e, 0xa7, 0x1f, 0xe1, + 0x33, 0xbf, 0xbf, 0x34, 0xe3, 0x5, 0xa0, 0xa6, 0x96, 0xb2, 0xb6, 0x1a, + 0xb6, 0x7d, 0xb1, 0x78, 0xa7, 0x1e, 0xe3, 0xe3, 0x57, 0xbd, 0x34, 0x35, + 0x5, 0x9e, 0x6e, 0x67, 0x95, 0x5f, 0x1b, 0x62, 0x62, 0x81, 0x78, 0x6f, + 0x1f, 0x35, 0xe1, 0x57, 0x59, 0xe3, 0x33, 0x5, 0x78, 0x70, 0x7c, 0x64, + 0x60, 0x1a, 0x60, 0x98, 0x65, 0xa0, 0x6f, 0x1e, 0x33, 0x33, 0x5, 0xe, + 0x8b, 0xa4, 0xf7, 0x1f, 0xbd, 0xd9, 0xbd, 0xf7, 0xc2, 0xa4, 0x1, 0xb9, + 0x16, 0xf7, 0xd6, 0xa4, 0x6, 0x59, 0x8d, 0x6c, 0x8c, 0xb4, 0x1a, 0xa8, + 0x98, 0xb6, 0x91, 0xa2, 0x1e, 0xf7, 0x2c, 0x6, 0x99, 0xbd, 0x5, 0xfb, + 0x2c, 0x6, 0xa0, 0xd9, 0x5, 0xf7, 0x2a, 0x6, 0x98, 0xbd, 0x5, 0xfb, + 0x1b, 0x6, 0xf7, 0x30, 0xf7, 0x7d, 0x90, 0x1d, 0xb8, 0x93, 0x19, 0xa4, + 0xfb, 0x5c, 0x72, 0x7, 0xc7, 0xa1, 0x7c, 0x79, 0x82, 0x86, 0x80, 0x84, + 0x80, 0x1f, 0xfb, 0x2b, 0xfb, 0x80, 0x5, 0x74, 0xc1, 0x56, 0xf7, 0x54, + 0x9d, 0x1a, 0xa2, 0x97, 0x98, 0xca, 0x1e, 0xa4, 0xfb, 0xac, 0x72, 0x7, + 0xc0, 0x84, 0x8a, 0x92, 0xa1, 0x64, 0xd8, 0xfb, 0x9b, 0x18, 0xfb, 0x11, + 0x6, 0x7d, 0x59, 0x5, 0xf7, 0x22, 0x6, 0x75, 0x3d, 0x5, 0xfb, 0x21, + 0x6, 0x7d, 0x59, 0x5, 0xf7, 0x21, 0x6, 0x70, 0x2c, 0x7f, 0x62, 0x71, + 0x8d, 0x4c, 0x86, 0x19, 0xe, 0xfc, 0x4e, 0x3e, 0x76, 0xf0, 0x76, 0xf7, + 0x96, 0x77, 0xad, 0x77, 0xf8, 0x57, 0x77, 0x12, 0xcd, 0xe3, 0x13, 0xdc, + 0xf5, 0xf7, 0xf5, 0x15, 0xcf, 0x6, 0xef, 0xf7, 0xe0, 0x5, 0x43, 0x6, + 0xfb, 0x78, 0xfd, 0xa3, 0x15, 0xd4, 0x6, 0x13, 0xec, 0xeb, 0xf7, 0xe6, + 0x5, 0x47, 0x6, 0xe, 0xfb, 0xe, 0x76, 0xa2, 0x77, 0xf7, 0x99, 0xa6, + 0xf7, 0x90, 0xa4, 0xf7, 0x78, 0xa1, 0x12, 0xaf, 0xf7, 0x6, 0x9d, 0xd1, + 0xa9, 0xd8, 0x9e, 0xd2, 0x13, 0x7f, 0x80, 0xf7, 0xb2, 0xf7, 0xd, 0x15, + 0x8d, 0x8f, 0x5, 0x88, 0x93, 0x95, 0x8a, 0x97, 0x1b, 0xc6, 0xc5, 0xbc, + 0xd6, 0xca, 0x62, 0xc1, 0x78, 0xa3, 0x1f, 0x26, 0xf7, 0xc, 0x67, 0xb5, + 0xb4, 0x1a, 0xb0, 0xa3, 0xb0, 0xc3, 0xaf, 0xa7, 0x7c, 0x7f, 0x82, 0x83, + 0x87, 0x83, 0x84, 0x1e, 0x80, 0x84, 0x82, 0x81, 0x77, 0x1a, 0x70, 0xa3, + 0x71, 0xaa, 0xa0, 0xb0, 0x99, 0xbb, 0xb7, 0x62, 0xc0, 0x27, 0x37, 0x49, + 0x55, 0x3a, 0x4b, 0xb7, 0x56, 0x96, 0x80, 0x1e, 0x89, 0x88, 0x5, 0x8f, + 0x7e, 0x6d, 0x8d, 0x86, 0x1b, 0xfb, 0x0, 0x6e, 0xfb, 0x2b, 0x28, 0xde, + 0x1f, 0xf7, 0x16, 0xfb, 0x34, 0x9e, 0x77, 0x63, 0x1a, 0x4e, 0x4f, 0x7d, + 0x70, 0x75, 0x5f, 0x95, 0x9d, 0x96, 0x93, 0x8f, 0x94, 0x93, 0x1e, 0x94, + 0x93, 0x94, 0x94, 0xa2, 0x1a, 0xb4, 0x66, 0x95, 0x77, 0x6f, 0x6e, 0x76, + 0x64, 0x1e, 0x13, 0xbf, 0x80, 0x52, 0xc4, 0x5b, 0xe3, 0xe2, 0xd8, 0xc4, + 0xd8, 0xc6, 0x64, 0xb9, 0x77, 0xa4, 0x1e, 0x3b, 0xec, 0x15, 0x88, 0x8e, + 0x4b, 0xcf, 0xbe, 0x1a, 0xb2, 0xa5, 0xa0, 0xab, 0xc2, 0xf7, 0x4, 0xfb, + 0x17, 0x50, 0x60, 0x69, 0x78, 0x72, 0x6e, 0x7a, 0x97, 0xc5, 0x56, 0x1e, + 0xe, 0xfb, 0xdd, 0xf8, 0xa1, 0xf7, 0x16, 0x1, 0xb8, 0xf7, 0x16, 0xdf, + 0xf7, 0x16, 0x3, 0xb8, 0xf8, 0xe2, 0x15, 0x4b, 0xa, 0xf7, 0x68, 0x16, + 0x4b, 0xa, 0xe, 0xe0, 0x79, 0xb9, 0xf7, 0x4, 0xa2, 0xe2, 0x77, 0xf7, + 0xb4, 0x9f, 0xf0, 0xb9, 0x1, 0x9f, 0xc8, 0x58, 0xc8, 0xe4, 0xe0, 0xf8, + 0x1c, 0xc8, 0x3, 0xa9, 0xf7, 0xe1, 0x15, 0xf7, 0x57, 0xf7, 0x2b, 0xf7, + 0x31, 0xf7, 0x55, 0xf7, 0x55, 0xf7, 0x2b, 0xfb, 0x31, 0xfb, 0x58, 0xfb, + 0x58, 0xfb, 0x2b, 0xfb, 0x2e, 0xfb, 0x55, 0xfb, 0x55, 0xfb, 0x2b, 0xf7, + 0x2f, 0xf7, 0x58, 0x1e, 0xc8, 0x16, 0xfb, 0x38, 0xf7, 0x12, 0xfb, 0x21, + 0xf7, 0x31, 0xf7, 0x31, 0xf7, 0x12, 0xf7, 0x20, 0xf7, 0x38, 0xf7, 0x38, + 0xfb, 0x12, 0xf7, 0x23, 0xfb, 0x31, 0xfb, 0x32, 0xfb, 0x11, 0xfb, 0x23, + 0xfb, 0x37, 0x1e, 0xf8, 0x59, 0x38, 0x15, 0x7a, 0x43, 0x5, 0x70, 0x6e, + 0x66, 0x80, 0x48, 0x1b, 0xfb, 0xc, 0x2d, 0xc8, 0xf7, 0x21, 0xe0, 0xc8, + 0xf7, 0x3, 0xf7, 0x32, 0xc0, 0xa5, 0x82, 0x82, 0xa6, 0x1f, 0x9a, 0x86, + 0x92, 0x84, 0x82, 0x1a, 0x44, 0x7a, 0x7, 0xb6, 0x83, 0x70, 0xba, 0x3f, + 0x1b, 0x2f, 0x61, 0x3e, 0x28, 0x20, 0xa8, 0x43, 0xef, 0xcc, 0xba, 0xb2, + 0xbb, 0x9f, 0x1f, 0xe, 0xfc, 0x20, 0xf8, 0x24, 0xb8, 0x72, 0x76, 0xf7, + 0x97, 0xa6, 0x12, 0x9b, 0xd9, 0x13, 0x70, 0xf7, 0x54, 0xf8, 0x6f, 0x15, + 0x87, 0x7b, 0x88, 0x81, 0x81, 0x1a, 0x6c, 0xaa, 0x82, 0x97, 0xb3, 0xb0, + 0xb8, 0xaa, 0xa0, 0x1e, 0x7e, 0x94, 0x5, 0x7f, 0x85, 0x6f, 0x6e, 0x7f, + 0x1b, 0x88, 0x89, 0x8d, 0x91, 0xa1, 0x98, 0xb2, 0x94, 0xa7, 0x1f, 0xb9, + 0xf7, 0x20, 0x3f, 0x88, 0x81, 0x6a, 0x6f, 0xa, 0x9a, 0x88, 0x84, 0xa5, + 0x64, 0x1b, 0x39, 0x2c, 0xfb, 0xb, 0x33, 0x1f, 0x13, 0xb0, 0x77, 0x92, + 0x51, 0xcc, 0xc1, 0xac, 0xbd, 0xa6, 0x9a, 0x1e, 0x2b, 0x16, 0xb8, 0xc5, + 0xf7, 0x1c, 0xba, 0x94, 0x95, 0x7f, 0x7a, 0x63, 0x5e, 0xfb, 0x24, 0x52, + 0x88, 0x78, 0x8f, 0xa7, 0x1e, 0xe, 0x72, 0x1d, 0x97, 0xf7, 0x6d, 0x71, + 0x1d, 0x81, 0x94, 0x96, 0x82, 0x93, 0x1b, 0x91, 0x8f, 0x8e, 0x98, 0x1f, + 0x41, 0x8d, 0xa, 0xe3, 0x5f, 0xa, 0xf7, 0x4d, 0x82, 0x71, 0x1d, 0x80, + 0x94, 0x97, 0x8a, 0x1d, 0x41, 0x8d, 0xa, 0xe3, 0xdc, 0xaf, 0x1a, 0x94, + 0x88, 0x8e, 0x86, 0x79, 0x60, 0x62, 0x7b, 0x6c, 0xa, 0xe, 0x53, 0xf7, + 0x15, 0x76, 0xf7, 0x5d, 0xce, 0x48, 0xe5, 0x1, 0xf8, 0x65, 0xe5, 0x43, + 0xd3, 0x3, 0xbe, 0xf7, 0xc9, 0x15, 0xf8, 0x44, 0xfb, 0x5d, 0xd3, 0xf7, + 0xa0, 0xfc, 0x8c, 0x6, 0xe, 0xe0, 0x79, 0xb9, 0xf7, 0xf, 0xf7, 0x4e, + 0xf7, 0x3d, 0xa0, 0xf7, 0x4, 0xb9, 0x1, 0xa9, 0xc8, 0xf7, 0x3a, 0xd2, + 0xf7, 0x1, 0xd4, 0xf7, 0x27, 0xc8, 0x3, 0xa9, 0xf7, 0xe3, 0x15, 0xfb, + 0x58, 0xf7, 0x2b, 0xfb, 0x31, 0xf7, 0x55, 0xf7, 0x55, 0xf7, 0x2b, 0xf7, + 0x2d, 0xf7, 0x58, 0xf7, 0x58, 0xfb, 0x2b, 0xf7, 0x32, 0xfb, 0x55, 0xfb, + 0x55, 0xfb, 0x2b, 0xfb, 0x2f, 0xfb, 0x57, 0x1e, 0xc8, 0x16, 0xf7, 0x38, + 0xf7, 0x11, 0xf7, 0x20, 0xf7, 0x32, 0xf7, 0x32, 0xf7, 0x11, 0xfb, 0x24, + 0xfb, 0x38, 0xfb, 0x38, 0xfb, 0x11, 0xfb, 0x1f, 0xfb, 0x32, 0xfb, 0x31, + 0xfb, 0x12, 0xf7, 0x23, 0xf7, 0x38, 0x1e, 0xf7, 0xb, 0xfb, 0x4c, 0x15, + 0xf7, 0x3a, 0x9b, 0x6, 0x5a, 0x90, 0x8c, 0x8c, 0xb5, 0x1a, 0xf1, 0xb7, + 0x7, 0x30, 0xc8, 0xc8, 0x40, 0x89, 0x1b, 0xd1, 0x6, 0x77, 0xa5, 0x6e, + 0xad, 0x37, 0xf7, 0x9, 0x8, 0xbb, 0x9a, 0xac, 0xb3, 0xbd, 0x1a, 0xcc, + 0x54, 0xa8, 0x4d, 0x1e, 0xfb, 0x4b, 0x7b, 0x6, 0xbc, 0x86, 0x89, 0x8a, + 0x62, 0x1a, 0xfb, 0x8d, 0x7, 0x61, 0x8d, 0x8a, 0x5a, 0x86, 0x1e, 0xf7, + 0xa, 0xf7, 0x3e, 0x15, 0xf7, 0x3d, 0xb3, 0x7, 0xb2, 0xa9, 0x78, 0x51, + 0x56, 0x77, 0x64, 0x5b, 0x1f, 0xe, 0xfb, 0xdd, 0xf8, 0xbd, 0xd1, 0x1, + 0xbe, 0xf8, 0xbd, 0x15, 0xf7, 0xd8, 0x6, 0x9d, 0xd1, 0x5, 0xfb, 0xd7, + 0x6, 0xe, 0xfb, 0x9a, 0xf8, 0x36, 0x76, 0xf7, 0xb2, 0x77, 0x1, 0xde, + 0xf8, 0xb2, 0x15, 0x3c, 0xcb, 0x49, 0xda, 0xda, 0xcb, 0xc9, 0xda, 0xda, + 0x4b, 0xcd, 0x3c, 0x3c, 0x4b, 0x4d, 0x3c, 0x1e, 0xb1, 0x8a, 0x15, 0x51, + 0xb9, 0x5b, 0xc5, 0xc5, 0xba, 0xb7, 0xc5, 0xc5, 0x5c, 0xbc, 0x51, 0x51, + 0x5d, 0x5e, 0x51, 0x1e, 0xe, 0x2f, 0x8b, 0xe4, 0xb2, 0x77, 0xf7, 0x36, + 0xe4, 0x3c, 0xc9, 0xf7, 0x38, 0x77, 0x12, 0xf7, 0x85, 0xe3, 0x3e, 0xcc, + 0x13, 0xea, 0xf7, 0x90, 0xf7, 0x14, 0x15, 0xcc, 0x6, 0x13, 0xda, 0xf7, + 0x2c, 0xf7, 0x70, 0xc9, 0xfb, 0x70, 0xf7, 0x38, 0x4a, 0xfb, 0x38, 0xfb, + 0x6f, 0x4d, 0xf7, 0x6f, 0x7, 0xfb, 0x6f, 0xfb, 0xac, 0x15, 0xf8, 0x8c, + 0x6, 0x13, 0xec, 0xcf, 0xfc, 0x8c, 0x7, 0xe, 0xfb, 0xfe, 0xf7, 0xa6, + 0xd0, 0xf7, 0xab, 0xc8, 0x1, 0x8d, 0xf7, 0xa6, 0x5e, 0x1d, 0xef, 0x5, + 0xb6, 0xaa, 0xbc, 0xbd, 0x52, 0xa, 0x6d, 0x66, 0x61, 0x1f, 0x6b, 0x68, + 0x8b, 0x84, 0xfb, 0x8, 0xfb, 0x2, 0x8, 0xe, 0xfb, 0xfe, 0xf7, 0xb2, + 0x76, 0xf8, 0x3, 0xbe, 0x12, 0xf7, 0x66, 0xdf, 0x4e, 0xe3, 0x13, 0xe0, + 0xf7, 0x2, 0xf8, 0x75, 0x15, 0xcc, 0xae, 0x69, 0x4f, 0x69, 0x66, 0x4f, + 0x69, 0x81, 0x82, 0x8f, 0x97, 0x83, 0x67, 0x1d, 0xcf, 0xe1, 0xbc, 0x74, + 0xa3, 0x6e, 0x9e, 0x1f, 0x13, 0xd0, 0x63, 0x1d, 0x69, 0xa, 0xe, 0x7f, + 0x1d, 0xf7, 0x49, 0x77, 0x1, 0xf7, 0x1f, 0xf8, 0x98, 0x15, 0xbd, 0x6, + 0xf7, 0x2b, 0x21, 0x1d, 0xe, 0x35, 0xfb, 0x4e, 0x76, 0xf7, 0x63, 0xd1, + 0x4d, 0x76, 0xf7, 0x11, 0x77, 0xf7, 0xf9, 0x77, 0x12, 0x4f, 0xf7, 0xb, + 0x13, 0xdc, 0xf7, 0xaf, 0xf7, 0x4, 0x15, 0x83, 0x6c, 0x89, 0x7c, 0x7a, + 0x1a, 0x6d, 0xa1, 0x6b, 0xb3, 0xda, 0xba, 0xd6, 0xc3, 0xb5, 0x1e, 0x76, + 0x9b, 0x5, 0x13, 0xbc, 0x71, 0x80, 0x6b, 0x67, 0x79, 0x1b, 0x80, 0x85, + 0x94, 0xab, 0x93, 0x1f, 0xf3, 0xf7, 0xe4, 0x5, 0xfb, 0x1b, 0x6, 0x58, + 0xfb, 0x38, 0x5, 0xfb, 0xe, 0x62, 0x42, 0x2e, 0x53, 0x1b, 0x6e, 0x95, + 0xb7, 0xa2, 0x91, 0x1f, 0xe8, 0xf7, 0xcc, 0x5, 0x13, 0xdc, 0xfb, 0x1b, + 0x6, 0xfb, 0x3, 0xfc, 0xb, 0x5, 0x5f, 0xfb, 0x12, 0x81, 0x54, 0x64, + 0x1a, 0x60, 0xa0, 0x79, 0xa9, 0xb3, 0xa7, 0xae, 0xbd, 0xb6, 0x87, 0xc0, + 0x9c, 0xbd, 0x1e, 0x7a, 0xa2, 0x94, 0x84, 0xae, 0x1b, 0xc0, 0xcd, 0xd2, + 0xb4, 0xa2, 0x1f, 0xe, 0xfb, 0x57, 0x76, 0xf9, 0xdc, 0xb1, 0x12, 0xb2, + 0xf7, 0x64, 0x42, 0xe4, 0xf7, 0x2c, 0xe4, 0x13, 0xd8, 0xf7, 0x11, 0xfb, + 0x6c, 0x15, 0xbc, 0x6, 0xf7, 0x85, 0xf9, 0xdc, 0x5, 0xe4, 0x6, 0xfb, + 0x85, 0xfd, 0xdc, 0x5, 0xbc, 0x6, 0xf7, 0x69, 0xf9, 0x7e, 0x5, 0xed, + 0xa7, 0x92, 0x9b, 0xe5, 0x1b, 0x90, 0x9d, 0x5, 0xfb, 0xbd, 0x6, 0x13, + 0xe8, 0xfb, 0x64, 0xfb, 0x3, 0xfb, 0x30, 0xfb, 0x1c, 0xfb, 0x13, 0xf0, + 0x6c, 0xf6, 0x89, 0x1f, 0xe, 0xfc, 0x30, 0xf7, 0x95, 0xf7, 0x28, 0x1, + 0xbe, 0xf7, 0x28, 0x3, 0xbe, 0xf7, 0xdf, 0x3c, 0xa, 0xfb, 0xdd, 0xfb, + 0x6e, 0xb4, 0x80, 0xd8, 0x49, 0xd8, 0xf4, 0x77, 0x12, 0x13, 0x50, 0xb4, + 0x90, 0x15, 0x49, 0x2a, 0x98, 0x7f, 0x5, 0x13, 0xb0, 0x7d, 0xa, 0x72, + 0x7c, 0x6c, 0x6e, 0x7b, 0x86, 0xa, 0x9f, 0x79, 0xbf, 0x1b, 0xc0, 0xe9, + 0xa3, 0xca, 0xbf, 0x5e, 0x9e, 0x67, 0x7d, 0x7e, 0x8b, 0x89, 0x83, 0x1f, + 0xb8, 0xce, 0x5, 0xe, 0xfb, 0xfe, 0xf7, 0xbb, 0x76, 0xf7, 0x17, 0x76, + 0xf7, 0xbf, 0x77, 0x1, 0xa9, 0xf8, 0x14, 0x8c, 0xa, 0x62, 0x71, 0x91, + 0xa0, 0x93, 0x1f, 0x9d, 0xb9, 0xc7, 0xf7, 0x21, 0xa7, 0xcd, 0x5e, 0x82, + 0x66, 0x83, 0x2c, 0x7d, 0x89, 0x76, 0x18, 0xa8, 0xb3, 0x93, 0x71, 0x7c, + 0x45, 0xfb, 0x1f, 0x7b, 0x6e, 0x1f, 0x70, 0x7d, 0x66, 0x8b, 0x73, 0x1b, + 0xe, 0xfb, 0xfe, 0xf8, 0x24, 0x9f, 0xf7, 0x89, 0x9f, 0x1, 0xf7, 0x9e, + 0xdc, 0x3, 0xf7, 0x1d, 0xf8, 0x5f, 0x15, 0xb2, 0xae, 0xf7, 0x3b, 0xd2, + 0x95, 0x98, 0x85, 0x6d, 0x5e, 0x64, 0xfb, 0x38, 0x4d, 0x6f, 0x8b, 0xa6, + 0x97, 0x1e, 0x3a, 0xa9, 0x15, 0x52, 0xbe, 0x6b, 0xc0, 0xf3, 0xde, 0xf2, + 0xe5, 0xdb, 0x3f, 0x97, 0x72, 0x24, 0x34, 0x24, 0x2e, 0x1e, 0xe, 0x72, + 0x1d, 0xf7, 0xeb, 0x49, 0x1d, 0x95, 0x82, 0x80, 0x94, 0x83, 0x88, 0x1d, + 0x88, 0x7e, 0x1f, 0xfb, 0x4, 0xfb, 0x40, 0x70, 0xa, 0x8f, 0x88, 0x90, + 0x9d, 0xb5, 0xb5, 0x9a, 0x4a, 0xa, 0x95, 0x82, 0x80, 0x94, 0x83, 0x88, + 0x1d, 0x88, 0x7e, 0x1f, 0xe, 0x86, 0x1d, 0xf8, 0xa7, 0x77, 0xa2, 0x77, + 0x12, 0x13, 0x70, 0xf8, 0x11, 0xe3, 0x15, 0xf7, 0x33, 0x6, 0x13, 0x90, + 0x70, 0x33, 0x5, 0xe1, 0x6, 0x13, 0x70, 0x48, 0xa, 0xfc, 0x39, 0xfb, + 0x37, 0x61, 0x1d, 0xfc, 0xc8, 0xfc, 0x2a, 0x8c, 0xa, 0x5d, 0x7e, 0x92, + 0xa2, 0x93, 0x8e, 0x95, 0x8e, 0x97, 0x1f, 0x13, 0x88, 0x6e, 0x1d, 0x94, + 0x70, 0x6b, 0xa, 0xe3, 0x8b, 0xd0, 0x4d, 0x76, 0xf7, 0x14, 0x77, 0xf7, + 0x92, 0xc8, 0xf7, 0xa3, 0x77, 0xa2, 0x77, 0x12, 0x13, 0x78, 0xf7, 0xd, + 0x7d, 0x61, 0x1d, 0x13, 0xb4, 0xfb, 0x24, 0xfd, 0x3c, 0x5e, 0x1d, 0xee, + 0x5, 0xb6, 0xaa, 0xbc, 0xbe, 0x52, 0xa, 0x63, 0x66, 0x61, 0x1f, 0x6b, + 0x68, 0x8b, 0x8b, 0xfb, 0x8, 0xfb, 0x2, 0x8, 0xfc, 0x39, 0xf7, 0x96, + 0x8c, 0xa, 0x5f, 0x7c, 0x90, 0xa0, 0x94, 0x8d, 0x96, 0x8f, 0x99, 0x1f, + 0x6e, 0x1d, 0x93, 0x71, 0x6b, 0xa, 0x86, 0x1d, 0xf7, 0x8, 0x77, 0xf7, + 0x80, 0xf7, 0x5b, 0x5b, 0xbb, 0x8e, 0x77, 0x12, 0xf7, 0x5c, 0xdf, 0x4e, + 0xe3, 0x13, 0x79, 0x0, 0xf7, 0x21, 0x7d, 0x61, 0x1d, 0xfc, 0x70, 0xfb, + 0x5b, 0x15, 0xcc, 0xae, 0x69, 0x4f, 0x5c, 0x6c, 0x61, 0x65, 0x7e, 0x80, + 0x8f, 0x92, 0x86, 0x67, 0x1d, 0xd1, 0xe1, 0xbc, 0x74, 0xa1, 0x6e, 0x9e, + 0x1f, 0x13, 0x92, 0x80, 0x63, 0x1d, 0x13, 0x94, 0x80, 0x69, 0xa, 0x13, + 0x79, 0x0, 0xf7, 0xb0, 0xfc, 0x2b, 0x15, 0xf7, 0x33, 0x6, 0x13, 0x99, + 0x0, 0x70, 0x33, 0x5, 0xe1, 0x6, 0x13, 0x79, 0x0, 0x48, 0xa, 0xe, + 0xfb, 0x61, 0xaa, 0x6c, 0xf7, 0x58, 0xf7, 0xf5, 0xf7, 0x28, 0x12, 0xa9, + 0xf7, 0x13, 0xf7, 0x8, 0xf7, 0x28, 0x13, 0x78, 0xf7, 0xc4, 0xf7, 0xa3, + 0x15, 0x73, 0x50, 0x7c, 0x6c, 0x60, 0x6f, 0x8, 0xfb, 0x19, 0x34, 0x50, + 0x5a, 0x3d, 0x1a, 0x5c, 0xa8, 0x2a, 0xf7, 0x29, 0xf7, 0x1, 0xcb, 0xc9, + 0xcf, 0xaf, 0x71, 0xa9, 0x68, 0x6b, 0x6e, 0x72, 0x69, 0x78, 0x93, 0x7f, + 0x92, 0x81, 0x1e, 0x92, 0x81, 0x92, 0x83, 0x82, 0x1a, 0x13, 0xb8, 0x76, + 0x6a, 0x7a, 0x6f, 0x6c, 0x64, 0x9b, 0xcd, 0xc1, 0xa9, 0xbd, 0xd6, 0xe8, + 0x1e, 0xc8, 0xd7, 0x92, 0xbd, 0x8e, 0xac, 0x8, 0x4f, 0xf7, 0x2e, 0x3c, + 0xa, 0x51, 0x1d, 0xf7, 0x85, 0x77, 0x1, 0xf8, 0x3c, 0xf9, 0x67, 0x7b, + 0xa, 0xfb, 0x2, 0xf7, 0x26, 0x5, 0x98, 0x80, 0x78, 0xa1, 0x30, 0x1d, + 0xfb, 0xfa, 0xfd, 0xc0, 0x33, 0xa, 0x51, 0x1d, 0xf7, 0x85, 0x77, 0x1, + 0xf7, 0xcb, 0xf9, 0x67, 0x22, 0x1d, 0xfc, 0x88, 0xfd, 0xea, 0x33, 0xa, + 0x51, 0x1d, 0xf7, 0x7e, 0x5a, 0x1d, 0xfc, 0x5a, 0xfe, 0x15, 0x24, 0x1d, + 0x56, 0xa, 0xf8, 0x4d, 0x77, 0xd5, 0x83, 0x1d, 0x5e, 0xd6, 0x12, 0x13, + 0xe4, 0xf7, 0x93, 0xf9, 0x7c, 0x15, 0x13, 0xe8, 0x9e, 0x93, 0x94, 0xa3, + 0xac, 0x1b, 0xac, 0xa2, 0x84, 0x80, 0xa0, 0x1f, 0x13, 0xf0, 0x7f, 0xa6, + 0x9f, 0x7d, 0xa6, 0x1b, 0xe1, 0xa3, 0xde, 0xaf, 0x93, 0x1f, 0x62, 0x6, + 0x78, 0x82, 0x82, 0x74, 0x68, 0x1b, 0x7c, 0x73, 0x96, 0x96, 0x70, 0x1f, + 0x96, 0x70, 0x6f, 0x94, 0x70, 0x1b, 0x28, 0x79, 0xfb, 0x7, 0x88, 0x1f, + 0x35, 0xfd, 0x7c, 0x15, 0xae, 0x7, 0x23, 0x1d, 0x68, 0x7, 0xf8, 0xc, + 0xf8, 0x7f, 0x15, 0x74, 0x1d, 0xfb, 0x4d, 0x6, 0xe, 0x56, 0xa, 0xf8, + 0x59, 0x77, 0xba, 0xf7, 0x1a, 0xfb, 0xd, 0xf7, 0x1a, 0x12, 0xf7, 0x80, + 0xf7, 0x1a, 0xbd, 0xf7, 0x1a, 0x13, 0xee, 0xf7, 0x73, 0xf9, 0xaf, 0x15, + 0x13, 0xf6, 0x20, 0x1d, 0xf7, 0x68, 0x2b, 0xa, 0xfc, 0x8a, 0xfd, 0xaf, + 0x24, 0x1d, 0x51, 0x1d, 0xb8, 0xbb, 0xf7, 0x1, 0xbc, 0x1, 0xf7, 0xb0, + 0xbb, 0xf7, 0x8, 0xbc, 0x3, 0xf7, 0xb0, 0xf9, 0xc2, 0x15, 0x4f, 0xb9, + 0x5d, 0xc7, 0xc6, 0xbb, 0xba, 0xc6, 0xc6, 0x5b, 0xbb, 0x50, 0x50, 0x5c, + 0x5b, 0x5e, 0xa, 0xfc, 0x23, 0xfd, 0xc2, 0x24, 0x1d, 0xf7, 0xae, 0x8b, + 0xab, 0xf7, 0x73, 0xb2, 0xb7, 0xab, 0xf7, 0x9f, 0xab, 0x1, 0x4b, 0xab, + 0x15, 0xac, 0x90, 0x8a, 0x8b, 0xc3, 0xd3, 0xf8, 0x2, 0xf8, 0x5b, 0x18, + 0x98, 0x9b, 0x92, 0x99, 0x98, 0x1a, 0xa0, 0x6d, 0x93, 0x58, 0x1e, 0xac, + 0xf8, 0xe1, 0x7, 0x5e, 0xfb, 0x52, 0x73, 0x90, 0x5, 0xf7, 0x14, 0x39, + 0xa4, 0x3c, 0x56, 0x87, 0x80, 0x76, 0x86, 0x1e, 0x4a, 0xfb, 0x7f, 0xf0, + 0x88, 0xc0, 0x98, 0xb3, 0xeb, 0x19, 0xa5, 0x87, 0x42, 0xfb, 0xa5, 0x72, + 0x90, 0x98, 0xe9, 0x77, 0xb6, 0xfb, 0xf, 0x88, 0x19, 0x4c, 0xfb, 0x85, + 0x5, 0x89, 0x82, 0x8a, 0x83, 0x85, 0x1a, 0x6f, 0x9d, 0x7d, 0xa7, 0xf7, + 0x2b, 0xcf, 0xba, 0xf7, 0xc, 0xd3, 0x1e, 0xa5, 0x88, 0x50, 0xfb, 0x58, + 0x5, 0xfc, 0xa3, 0xab, 0x6, 0xba, 0x93, 0x9a, 0x90, 0x9b, 0xc5, 0xb9, + 0xf7, 0x2c, 0x18, 0xfb, 0x54, 0x6, 0xfb, 0x6, 0xfb, 0x2a, 0x5, 0x82, + 0x7e, 0x86, 0x80, 0x81, 0x1a, 0x71, 0xa0, 0x7e, 0xb5, 0x1e, 0x6b, 0xfb, + 0x57, 0x7, 0xf8, 0x62, 0xf7, 0xba, 0x15, 0xe7, 0xf7, 0xd7, 0x5, 0x7f, + 0x6, 0xfb, 0x91, 0xfb, 0xd7, 0x5, 0xe, 0x90, 0xfb, 0x6e, 0xb4, 0xf7, + 0x6f, 0x76, 0xae, 0xbf, 0xf8, 0xaf, 0xae, 0x1, 0xab, 0xf7, 0x2e, 0xef, + 0xb8, 0xf7, 0xa1, 0xab, 0x98, 0xa9, 0x3, 0xf7, 0x7f, 0x2f, 0x15, 0x98, + 0x7f, 0x5, 0x8f, 0x94, 0x94, 0x8c, 0x93, 0x1b, 0xa8, 0xa1, 0x72, 0x7f, + 0x70, 0x74, 0x7d, 0x6c, 0x6e, 0x7a, 0x91, 0x96, 0x74, 0x1f, 0x75, 0x6a, + 0x5, 0x83, 0x9b, 0xa3, 0x7a, 0xbe, 0x1b, 0xc0, 0xe7, 0x9e, 0xca, 0xc3, + 0x58, 0xa0, 0x65, 0x80, 0x82, 0x8a, 0x89, 0x84, 0x1f, 0xaa, 0xb9, 0x5, + 0xf7, 0x9, 0xdb, 0xd6, 0xd3, 0xbb, 0x1f, 0x6d, 0xa1, 0x5, 0x2e, 0x43, + 0x49, 0x72, 0x3d, 0x1b, 0x7d, 0xfb, 0x16, 0x8b, 0xf7, 0x47, 0xf7, 0x45, + 0xf3, 0xf7, 0x97, 0xf7, 0x35, 0xe3, 0xc5, 0x4d, 0x2a, 0x7f, 0x8a, 0x80, + 0x89, 0x80, 0x81, 0x1d, 0x80, 0x85, 0x7e, 0x74, 0x1b, 0x7e, 0x77, 0x93, + 0x93, 0x6f, 0x1f, 0x92, 0x73, 0x6c, 0x91, 0x63, 0x1b, 0xfb, 0x87, 0xfb, + 0x44, 0xfb, 0x74, 0xfb, 0x71, 0xfb, 0x40, 0xf7, 0x15, 0x36, 0xf7, 0x11, + 0x1f, 0xe, 0x51, 0xa, 0x73, 0xa, 0xf8, 0x3c, 0xf9, 0x67, 0x27, 0x1d, + 0xfb, 0xd2, 0xfd, 0xc0, 0x15, 0x37, 0x1d, 0x57, 0x7b, 0x94, 0x9b, 0x98, + 0x93, 0x9c, 0x90, 0x9f, 0x7e, 0xa, 0xf7, 0x1, 0xae, 0x71, 0x4f, 0x7d, + 0x8a, 0x7b, 0x88, 0x79, 0x4c, 0xa, 0x5, 0x3a, 0x60, 0x7c, 0x72, 0xfb, + 0x27, 0x1b, 0x65, 0xa, 0x93, 0x73, 0x1d, 0x8b, 0x40, 0x1d, 0x85, 0x96, + 0x87, 0x43, 0xa, 0xe, 0x51, 0xa, 0x73, 0xa, 0xf7, 0xcb, 0xf9, 0x67, + 0x15, 0xbc, 0x6, 0xf7, 0x2b, 0xe1, 0x5, 0xa2, 0x98, 0x9c, 0x97, 0x25, + 0x1d, 0xfc, 0x60, 0xfd, 0xea, 0x15, 0x37, 0x1d, 0x55, 0x7d, 0x95, 0x9c, + 0x98, 0x93, 0x9b, 0x90, 0x9e, 0x7e, 0xa, 0xf7, 0x3, 0xac, 0x70, 0x4d, + 0x7e, 0x89, 0x7c, 0x89, 0x7a, 0x4c, 0xa, 0x60, 0x3a, 0x7c, 0x71, 0xfb, + 0x27, 0x8c, 0x19, 0x65, 0xa, 0x95, 0x73, 0x1d, 0x89, 0x31, 0x1d, 0xe, + 0x51, 0xa, 0xf7, 0x78, 0x5a, 0x1d, 0xfc, 0x32, 0xfe, 0x15, 0x15, 0x37, + 0x1d, 0x56, 0x7c, 0x95, 0x9c, 0x98, 0x91, 0x9b, 0x90, 0x9e, 0x1f, 0xca, + 0xf7, 0x7b, 0x5, 0xf7, 0x6, 0xa9, 0x6e, 0x49, 0x7f, 0x89, 0x7e, 0x89, + 0x7d, 0x2a, 0xa, 0xe, 0x51, 0xa, 0xc5, 0xf7, 0x1b, 0x1, 0xf7, 0x86, + 0xf7, 0x1b, 0xd8, 0xf7, 0x1b, 0x3, 0x70, 0x16, 0x37, 0x1d, 0x56, 0x7c, + 0x95, 0x9b, 0x98, 0x93, 0x9b, 0x90, 0x9f, 0x7e, 0xa, 0xf7, 0x3, 0xac, + 0x70, 0x4d, 0x7e, 0x89, 0x7c, 0x89, 0x7a, 0x2a, 0xa, 0xf7, 0xa1, 0xf9, + 0x8b, 0x46, 0x1d, 0x68, 0xa, 0x73, 0xa, 0x6b, 0x16, 0x75, 0x1d, 0x4a, + 0x7f, 0x9a, 0xa1, 0x97, 0x91, 0x98, 0x8e, 0x95, 0x41, 0xa, 0xc6, 0x9b, + 0x7e, 0x7a, 0x7f, 0x86, 0x7c, 0x47, 0x1d, 0xf7, 0xe5, 0xf9, 0x44, 0x2a, + 0x1d, 0x68, 0xa, 0x73, 0xa, 0xf7, 0x54, 0xf9, 0x67, 0x7b, 0xa, 0xf7, + 0x1a, 0xdc, 0x5, 0xa1, 0x98, 0x9e, 0x9c, 0x25, 0x1d, 0xfb, 0xda, 0xfd, + 0xea, 0x8e, 0x1d, 0x4e, 0x7b, 0x98, 0x9f, 0x98, 0x91, 0x9a, 0x8e, 0x96, + 0x41, 0xa, 0xc6, 0x9b, 0x7f, 0x79, 0x7f, 0x86, 0x7c, 0x47, 0x1d, 0xe, + 0x68, 0xa, 0xf7, 0x78, 0x77, 0x1, 0xf7, 0xb, 0xf9, 0x67, 0x15, 0xc4, + 0x6, 0xf4, 0xea, 0xe3, 0x2c, 0x3b, 0x1d, 0xfb, 0xb1, 0xfe, 0x15, 0x8e, + 0x1d, 0x4e, 0x7b, 0x98, 0x9f, 0x98, 0x91, 0x9a, 0x8e, 0x96, 0x46, 0xa, + 0x68, 0xa, 0xc6, 0xf7, 0x1a, 0x1, 0xf2, 0xf7, 0x1b, 0x3, 0xf2, 0xf9, + 0xb0, 0x15, 0x41, 0x1d, 0xf7, 0x63, 0x16, 0x41, 0x1d, 0xfb, 0xea, 0xfd, + 0xb0, 0x8e, 0x1d, 0x4a, 0x7f, 0x9a, 0xa1, 0x97, 0x91, 0x98, 0x8e, 0x95, + 0x46, 0xa, 0xc7, 0x8b, 0xad, 0xf7, 0xbb, 0xb7, 0xf7, 0x9d, 0xaa, 0x1, + 0xf8, 0xbd, 0xf7, 0x27, 0x3, 0xf7, 0x98, 0xf7, 0xdd, 0x15, 0xf7, 0xe, + 0x6, 0x97, 0xb7, 0x5, 0xfb, 0xe, 0x6, 0xc8, 0xf7, 0x77, 0x80, 0x1d, + 0xfb, 0x1d, 0x5b, 0x25, 0x60, 0xfb, 0xd1, 0xfb, 0x97, 0x61, 0x7d, 0x9a, + 0xa3, 0x9a, 0x8f, 0x9c, 0x77, 0xa, 0x91, 0xf7, 0x13, 0xf7, 0x6e, 0x5d, + 0xa, 0x7e, 0x82, 0x75, 0x5a, 0xfb, 0x4a, 0x1e, 0x25, 0x6, 0x7f, 0x5f, + 0x5, 0xf1, 0x6, 0x86, 0x78, 0x80, 0x5c, 0x67, 0xfb, 0xf, 0x6f, 0x2d, + 0x6d, 0x85, 0x6a, 0x86, 0x8, 0xe, 0x8b, 0x1d, 0xd5, 0x8c, 0x1d, 0x13, + 0xb0, 0x70, 0x16, 0xf7, 0x64, 0xae, 0x6, 0x52, 0x77, 0x9e, 0xaf, 0xa7, + 0x92, 0xac, 0x93, 0xa6, 0x1f, 0xee, 0xf7, 0xf8, 0x5, 0x13, 0x70, 0x59, + 0xa, 0xc2, 0xa0, 0x78, 0x6a, 0x6f, 0x85, 0x68, 0x83, 0x6f, 0x64, 0x1d, + 0xfb, 0xc, 0xfc, 0x2f, 0x18, 0x13, 0xa8, 0x63, 0xfb, 0x1f, 0x80, 0x93, + 0x59, 0x7f, 0x8, 0xf7, 0xb1, 0xf9, 0x59, 0x50, 0xa, 0xa8, 0xa2, 0x7f, + 0x80, 0xa2, 0x1f, 0x13, 0xb0, 0x80, 0xa1, 0xa2, 0x81, 0xaa, 0x3d, 0x1d, + 0x7c, 0x73, 0x96, 0x96, 0x70, 0x1f, 0x95, 0x71, 0x6e, 0x95, 0x70, 0x54, + 0x1d, 0x33, 0x1d, 0xf8, 0x3d, 0xf8, 0x96, 0x2a, 0x1d, 0x33, 0x1d, 0xf7, + 0xef, 0xf8, 0x96, 0x26, 0xa, 0x65, 0x1d, 0xf7, 0x6a, 0x25, 0xa, 0xf7, + 0x87, 0xf8, 0x96, 0x5b, 0xa, 0xec, 0xe3, 0x2a, 0x7e, 0x1d, 0x65, 0x1d, + 0xc7, 0x8c, 0x1d, 0x4d, 0xa, 0x13, 0xdc, 0x3a, 0x1d, 0xf7, 0x80, 0xf8, + 0xaa, 0x50, 0xa, 0xa4, 0xa2, 0x7f, 0x80, 0xa4, 0x1f, 0x13, 0xec, 0x80, + 0xa3, 0xa4, 0x81, 0xa8, 0x3d, 0x1d, 0x7c, 0x72, 0x96, 0x96, 0x70, 0x1f, + 0x95, 0x71, 0x6f, 0x95, 0x70, 0x54, 0x1d, 0x65, 0x1d, 0xb8, 0xf7, 0x1a, + 0x12, 0xa6, 0xf7, 0x24, 0xf7, 0xc, 0xf7, 0x1a, 0xd8, 0xf7, 0x1a, 0x32, + 0xf7, 0x24, 0x13, 0xfa, 0x3a, 0x1d, 0xf7, 0x9c, 0xf8, 0xdd, 0x2e, 0xa, + 0x13, 0xfc, 0xf7, 0x67, 0x2d, 0x1d, 0x2f, 0xb0, 0x76, 0xf8, 0x6e, 0x77, + 0x1, 0xbb, 0xc7, 0x15, 0xb7, 0x5f, 0xf7, 0x54, 0xf7, 0x54, 0xf7, 0x53, + 0xfb, 0x54, 0xba, 0xba, 0xfb, 0x55, 0xf7, 0x52, 0xf7, 0x55, 0xf7, 0x56, + 0x59, 0xb6, 0xfb, 0x50, 0xfb, 0x52, 0xfb, 0x52, 0xf7, 0x52, 0x5d, 0x5c, + 0xf7, 0x51, 0xfb, 0x51, 0x5, 0xe, 0xc7, 0x23, 0x76, 0xf6, 0xad, 0xf9, + 0xf, 0xad, 0xda, 0x77, 0x1, 0x4d, 0xa, 0x3, 0xf7, 0x4a, 0xd8, 0x15, + 0x83, 0x9f, 0x88, 0xa2, 0xa9, 0x1a, 0xeb, 0xe4, 0xf8, 0x29, 0xf7, 0x49, + 0xa8, 0xa0, 0x83, 0x7e, 0x9a, 0x1e, 0xfb, 0xbe, 0xfc, 0xe4, 0x15, 0xf7, + 0xd9, 0xf8, 0xbf, 0x5, 0x96, 0x74, 0x8e, 0x6f, 0x79, 0x1a, 0xfb, 0x2, + 0x2e, 0xfc, 0x22, 0xfb, 0x47, 0x72, 0x74, 0x91, 0x9b, 0x78, 0x1e, 0xfb, + 0x23, 0xfb, 0x37, 0x15, 0xbb, 0x6, 0xd1, 0xf7, 0xc, 0x5, 0x83, 0xa3, + 0xa6, 0x86, 0xaa, 0x1b, 0xf7, 0x8d, 0xf7, 0x45, 0xf7, 0xa0, 0xf7, 0x56, + 0xf7, 0x2, 0x56, 0xce, 0x47, 0xae, 0x1f, 0xca, 0xf7, 0x0, 0x5, 0x5a, + 0x6, 0x56, 0x2f, 0x5, 0x94, 0x70, 0x67, 0x8f, 0x70, 0x1b, 0xfb, 0x6f, + 0xfb, 0x57, 0xfb, 0x7d, 0xfb, 0x89, 0x46, 0xaf, 0x36, 0xdc, 0x61, 0x1f, + 0xe, 0x72, 0xa, 0x73, 0xa, 0xb0, 0xf7, 0x1e, 0x3, 0xed, 0xf9, 0xe, + 0x29, 0x1d, 0xc3, 0x9e, 0x7a, 0x68, 0x6e, 0x84, 0x68, 0x84, 0x70, 0x4a, + 0x1d, 0x2c, 0x6f, 0xb4, 0xc1, 0xb5, 0x9a, 0xbd, 0x98, 0xba, 0x3e, 0x1d, + 0xf7, 0xf6, 0xc1, 0x2a, 0x1d, 0x72, 0xa, 0x73, 0xa, 0xce, 0xf7, 0x1e, + 0x3, 0xf8, 0x32, 0xf9, 0x67, 0x22, 0x1d, 0xfc, 0x4a, 0xfb, 0x70, 0x29, + 0x1d, 0xc3, 0x9e, 0x79, 0x68, 0x6f, 0x84, 0x68, 0x84, 0x70, 0x4a, 0x1d, + 0x2f, 0x6c, 0xb1, 0xbf, 0xb6, 0x99, 0xbf, 0x99, 0xbc, 0x3e, 0x1d, 0xe, + 0x72, 0xa, 0xf7, 0x78, 0x77, 0x1, 0xce, 0xf7, 0x1e, 0x3, 0xf7, 0xa2, + 0xf9, 0x67, 0x42, 0xa, 0xfb, 0xe0, 0xfb, 0x9b, 0x29, 0x1d, 0xc0, 0xa1, + 0x7b, 0x6b, 0x6e, 0x85, 0x66, 0x83, 0x6e, 0x4a, 0x1d, 0x30, 0x6b, 0xb1, + 0xbe, 0xb6, 0x99, 0xc0, 0x99, 0xbc, 0x3e, 0x1d, 0xe, 0x72, 0xa, 0xc6, + 0xf7, 0x1a, 0x1, 0xf3, 0xf7, 0x1e, 0xca, 0xf7, 0x1a, 0xba, 0xf7, 0x1a, + 0x3, 0xed, 0xf9, 0xe, 0x29, 0x1d, 0xc4, 0x9d, 0x78, 0x67, 0x6f, 0x84, + 0x6a, 0x84, 0x70, 0x4a, 0x1d, 0x2d, 0x6e, 0xb3, 0xc1, 0xb5, 0x9a, 0xbe, + 0x98, 0xba, 0x3e, 0x1d, 0xf7, 0x63, 0xf7, 0x12, 0x2e, 0xa, 0xf7, 0x69, + 0x2d, 0x1d, 0x58, 0x58, 0xa, 0x73, 0xa, 0xd4, 0x16, 0xf7, 0xd6, 0xae, + 0x6, 0x58, 0x70, 0x98, 0xab, 0x99, 0x8d, 0x9b, 0x92, 0x9c, 0x1f, 0xbf, + 0xf7, 0x49, 0x6a, 0xa, 0xc2, 0xa6, 0x7e, 0x79, 0x81, 0x87, 0x7e, 0x80, + 0x7c, 0x1f, 0xfb, 0x2f, 0xfb, 0x69, 0x5, 0x4b, 0xf7, 0x5c, 0x81, 0x82, + 0xa7, 0x1a, 0xa2, 0x94, 0xb3, 0xc5, 0x6a, 0x1d, 0x55, 0xfb, 0x4e, 0x79, + 0x4b, 0x6c, 0x74, 0x51, 0x86, 0x19, 0xf7, 0xb1, 0xf9, 0x44, 0x26, 0xa, + 0x58, 0x8b, 0xae, 0xf7, 0x27, 0xab, 0xf7, 0xb4, 0xab, 0x6b, 0xf7, 0x3b, + 0x12, 0xf8, 0x3f, 0xf7, 0x26, 0x13, 0xe8, 0xf7, 0x79, 0xf7, 0x6f, 0x6f, + 0x1d, 0x33, 0x62, 0x40, 0x26, 0x7a, 0x78, 0x8c, 0x8f, 0x77, 0x1f, 0xfb, + 0x94, 0xfb, 0x6f, 0x15, 0xf7, 0xba, 0xae, 0x6, 0x4c, 0x7f, 0x9e, 0xa2, + 0x94, 0x8d, 0x94, 0x8d, 0x93, 0x1f, 0xa2, 0xdf, 0x5, 0x87, 0xb0, 0x9a, + 0x8a, 0xb4, 0x1b, 0xf7, 0x1a, 0xf7, 0x13, 0xce, 0xf7, 0x14, 0xf7, 0x12, + 0x20, 0xaa, 0x21, 0x1f, 0x5b, 0x6, 0xa9, 0xe5, 0xa3, 0x8f, 0xb3, 0x91, + 0x8, 0x13, 0xd8, 0x8c, 0xae, 0x5, 0xfb, 0xba, 0x68, 0x6, 0xbf, 0x9f, + 0x7f, 0x77, 0x7c, 0x88, 0x78, 0x85, 0x75, 0x1f, 0xfb, 0xf, 0xfc, 0x4b, + 0x7a, 0x4d, 0x74, 0x88, 0x63, 0x84, 0x19, 0xe, 0xfb, 0x5c, 0xf7, 0x16, + 0xca, 0xad, 0xf9, 0x1c, 0xa9, 0x12, 0xf7, 0xcf, 0xf7, 0xc, 0x42, 0xf7, + 0x3, 0x13, 0xf0, 0xf7, 0x22, 0x9a, 0x15, 0x82, 0x98, 0x96, 0x7e, 0xb6, + 0x1b, 0xf7, 0xb, 0xf6, 0xf7, 0x1a, 0xf7, 0x12, 0xe9, 0x4c, 0xb1, 0x3d, + 0x98, 0x1f, 0x8d, 0x7, 0x13, 0xe8, 0xca, 0xa2, 0xf7, 0x8, 0xbf, 0xf7, + 0x2, 0x1a, 0xd4, 0x4f, 0xba, 0x36, 0xfb, 0x2e, 0x43, 0xfb, 0x33, 0xfb, + 0x23, 0x71, 0x1e, 0x49, 0xfb, 0xff, 0x6d, 0xfb, 0x1c, 0x66, 0x5c, 0x8, + 0x80, 0x82, 0x71, 0x7a, 0x7c, 0x1b, 0x84, 0x87, 0x8f, 0x94, 0x96, 0x93, + 0x8c, 0x90, 0x95, 0x1f, 0x8d, 0x90, 0x8d, 0x91, 0x96, 0x1a, 0xb0, 0x6b, + 0x92, 0x7e, 0x55, 0x8b, 0x5c, 0x83, 0x67, 0xaa, 0x64, 0xcc, 0xf7, 0xa, + 0xcf, 0xf7, 0xd, 0xf7, 0x49, 0xb4, 0x1e, 0xe6, 0xf8, 0x2b, 0x5, 0xf7, + 0x3, 0xa4, 0xa8, 0xc2, 0xb9, 0x1b, 0xba, 0x8c, 0x47, 0x75, 0x4d, 0x79, + 0x21, 0x2b, 0x1f, 0x84, 0x6a, 0x5, 0x13, 0xf0, 0xb6, 0x85, 0xaa, 0x5f, + 0x3a, 0x1a, 0x5b, 0x6d, 0xfb, 0x46, 0x3f, 0x7a, 0x78, 0x93, 0x9a, 0x80, + 0x1e, 0xe, 0x58, 0x1d, 0xb5, 0x85, 0x77, 0xf7, 0x99, 0x34, 0xa, 0x6f, + 0x81, 0x62, 0x62, 0x76, 0x1b, 0x84, 0x86, 0x8f, 0x95, 0x44, 0xa, 0x5, + 0xfb, 0x1, 0x6, 0x78, 0x4d, 0x6f, 0xa, 0x13, 0xac, 0x27, 0xa, 0x30, + 0xa, 0xf7, 0x74, 0xf8, 0x25, 0x2a, 0x1d, 0x5b, 0x1d, 0xf7, 0x93, 0x34, + 0xa, 0x6e, 0x80, 0x5f, 0x63, 0x77, 0x3f, 0x1d, 0x13, 0xac, 0x30, 0xa, + 0xf7, 0xd, 0xf8, 0x25, 0x26, 0xa, 0x5b, 0x1d, 0xf7, 0x8c, 0x34, 0xa, + 0x71, 0xa, 0x8f, 0x95, 0x28, 0x1d, 0x13, 0xac, 0x30, 0xa, 0xa1, 0xf8, + 0x25, 0x42, 0xa, 0xe, 0x5b, 0x1d, 0xe9, 0x8c, 0x1d, 0x76, 0xf7, 0xf, + 0x13, 0x6a, 0x28, 0xa, 0x13, 0x9a, 0x6e, 0x80, 0x5e, 0x63, 0x78, 0x3f, + 0x1d, 0x13, 0xa6, 0x30, 0xa, 0xa9, 0xf8, 0x3a, 0x50, 0xa, 0xa5, 0xa2, + 0x82, 0x81, 0xa1, 0x1f, 0x13, 0xaa, 0x7f, 0xa6, 0xa6, 0x7e, 0xa5, 0x3d, + 0x1d, 0x7b, 0x71, 0x98, 0x96, 0x6e, 0x1f, 0x95, 0x72, 0x70, 0x93, 0x72, + 0x54, 0x1d, 0x5b, 0x1d, 0xda, 0xf7, 0x1a, 0x74, 0xa, 0xa6, 0x8e, 0xa, + 0x13, 0x6f, 0x28, 0xa, 0x13, 0x9f, 0x6e, 0x80, 0x5f, 0x63, 0x77, 0x3f, + 0x1d, 0x13, 0xaf, 0x30, 0xa, 0xa6, 0xf8, 0x6d, 0x2e, 0xa, 0x3a, 0xa, + 0x58, 0x1d, 0xb0, 0x66, 0xb5, 0xc1, 0xbc, 0x5a, 0xf7, 0x39, 0xfb, 0x8, + 0xf7, 0x8, 0xfb, 0x8, 0xf7, 0x38, 0x5b, 0xbb, 0x74, 0xa, 0xf7, 0x3, + 0xf7, 0x37, 0xfb, 0x8, 0xf7, 0x8, 0xfb, 0x8, 0xf7, 0x3a, 0x59, 0xbd, + 0x13, 0x64, 0xe4, 0x28, 0xa, 0x13, 0x99, 0x64, 0x71, 0xa, 0x8f, 0x95, + 0x28, 0x1d, 0x30, 0xa, 0xf7, 0x3, 0xf8, 0x8f, 0x15, 0xc6, 0xba, 0xbb, + 0xc6, 0x1e, 0x13, 0xaa, 0xc8, 0xc6, 0xbb, 0x5b, 0x50, 0x50, 0x5b, 0x5c, + 0x50, 0x1f, 0x13, 0xa4, 0xe4, 0x50, 0x5c, 0xba, 0xc6, 0x1f, 0x13, 0xaa, + 0xd4, 0xba, 0x8c, 0x15, 0x6b, 0xa5, 0x71, 0xab, 0xab, 0xa5, 0xa5, 0xab, + 0xab, 0x71, 0xa5, 0x6b, 0x6b, 0x71, 0x71, 0x6b, 0x1e, 0xe, 0xc7, 0x7e, + 0xca, 0x4c, 0xd2, 0x5a, 0x76, 0xf7, 0xa, 0x77, 0xf7, 0x14, 0x77, 0xf7, + 0x75, 0xb3, 0x6d, 0xa9, 0x8e, 0x77, 0x12, 0x86, 0xf7, 0x12, 0xf8, 0x62, + 0xe5, 0x13, 0x9c, 0xc0, 0xf7, 0xac, 0xf7, 0x8, 0x15, 0x8d, 0x6, 0x5b, + 0x94, 0x9a, 0x3a, 0xf7, 0x10, 0x1b, 0xf7, 0x17, 0xc4, 0xf7, 0x19, 0x8d, + 0x8c, 0x1f, 0x6f, 0x9c, 0x5, 0x7a, 0x82, 0x60, 0x43, 0x44, 0x1b, 0x51, + 0x82, 0xc5, 0xa4, 0x9b, 0x8d, 0x9c, 0x8e, 0x9a, 0x1f, 0xb2, 0x94, 0x5, + 0xf7, 0x35, 0xb0, 0xce, 0xd4, 0xd2, 0x1a, 0xc8, 0x60, 0xa6, 0x53, 0x68, + 0x63, 0x83, 0x56, 0x61, 0x1e, 0x89, 0x8d, 0x9d, 0xc6, 0x5, 0x13, 0x39, + 0xc0, 0x28, 0x8e, 0x76, 0x4d, 0x5, 0x88, 0x6, 0xa5, 0x82, 0x7f, 0xaf, + 0x4d, 0x1b, 0xfb, 0x10, 0xfb, 0x28, 0xfb, 0x5e, 0xfb, 0x21, 0x26, 0xc9, + 0x6d, 0xbe, 0xea, 0xbe, 0xdf, 0xb7, 0xa5, 0x1f, 0xfb, 0x33, 0x8d, 0x15, + 0x13, 0x5c, 0xc0, 0xe9, 0xe0, 0xf7, 0x63, 0xd7, 0xb0, 0x99, 0x71, 0x66, + 0x5a, 0x49, 0xfb, 0x8d, 0x2b, 0x67, 0x7d, 0xa8, 0xaa, 0x1e, 0xf7, 0xb8, + 0xeb, 0x15, 0x90, 0x9c, 0x5, 0x13, 0x9a, 0xc0, 0xc1, 0x9b, 0xb5, 0xf7, + 0x24, 0xd5, 0x1b, 0xac, 0x8b, 0x6f, 0x7d, 0xfb, 0xd, 0xfb, 0x22, 0x57, + 0x6f, 0x1f, 0xe, 0xfb, 0x6e, 0xfb, 0x6e, 0xb4, 0xd8, 0xf7, 0x2b, 0xfb, + 0x2, 0x77, 0xe3, 0x76, 0xf7, 0xce, 0xf7, 0x34, 0x6a, 0xac, 0x12, 0x73, + 0xf7, 0x14, 0x13, 0xba, 0xf7, 0x3, 0x7f, 0x15, 0x54, 0x3b, 0x98, 0x7f, + 0x5, 0x13, 0xca, 0x7d, 0xa, 0x74, 0x7c, 0x6c, 0x6e, 0x79, 0x86, 0xa, + 0xa1, 0x79, 0xbf, 0x1b, 0xc0, 0xe7, 0x9e, 0xca, 0x1f, 0x13, 0xba, 0xc7, + 0x49, 0x9c, 0x73, 0x82, 0x83, 0x8a, 0x89, 0x82, 0x1e, 0xae, 0xbf, 0xe0, + 0x96, 0xcb, 0xcb, 0xb4, 0xc5, 0x19, 0x6f, 0x9d, 0x5, 0x13, 0xc6, 0x51, + 0x63, 0x53, 0x6b, 0x5e, 0x1b, 0x6e, 0x5f, 0xaa, 0xdb, 0xd2, 0xda, 0xf7, + 0x58, 0xe2, 0x94, 0x99, 0x87, 0x7e, 0x86, 0x88, 0x85, 0x87, 0x84, 0x1f, + 0x85, 0x81, 0x83, 0x7e, 0x7a, 0x1a, 0x13, 0xba, 0x84, 0x1d, 0x60, 0xb7, + 0x3c, 0xfb, 0x1e, 0xfb, 0x30, 0xfb, 0x2e, 0xfb, 0x2d, 0x23, 0xd3, 0x4c, + 0xca, 0x1e, 0xe, 0x2f, 0xa, 0xf7, 0x2a, 0xf7, 0xc2, 0x15, 0xb6, 0x6, + 0xfb, 0x1, 0x5f, 0x1d, 0x2f, 0xa, 0xbe, 0xf7, 0xc2, 0x15, 0xb8, 0x5a, + 0xa, 0x68, 0x1d, 0xf7, 0x78, 0x22, 0xa, 0x5b, 0xf7, 0xc2, 0x15, 0xc0, + 0x6, 0xf7, 0x17, 0xe8, 0xe4, 0x2e, 0x5, 0xbd, 0x6, 0x35, 0x4e, 0xa, + 0xe, 0x68, 0x1d, 0xc7, 0xf7, 0x19, 0x12, 0x90, 0xf7, 0x16, 0x69, 0xf7, + 0x19, 0xd3, 0xe7, 0x2f, 0xf7, 0x1d, 0x13, 0xf4, 0x20, 0xa, 0x13, 0xea, + 0x5c, 0xf8, 0xa, 0x15, 0x67, 0xa, 0xf7, 0x65, 0x16, 0x67, 0xa, 0xe, + 0x66, 0x1d, 0xf9, 0x56, 0x3c, 0x1d, 0x74, 0xf8, 0x19, 0x7b, 0xa, 0xfb, + 0x4, 0x5f, 0x1d, 0x66, 0x1d, 0xf9, 0x56, 0x6c, 0x1d, 0x52, 0x55, 0x8f, + 0xa, 0x90, 0x94, 0x24, 0xa, 0xfb, 0x12, 0xf8, 0x19, 0x26, 0xa, 0x66, + 0x1d, 0xf9, 0x4f, 0x6c, 0x1d, 0x54, 0x55, 0x73, 0x1b, 0x84, 0x32, 0xa, + 0xfb, 0x84, 0xf8, 0x19, 0x15, 0xc4, 0x6, 0xf7, 0x16, 0xe8, 0xe4, 0x2e, + 0x5, 0xbe, 0x6, 0x34, 0x4e, 0xa, 0xe, 0x66, 0x1d, 0xf8, 0xa6, 0xf7, + 0x1a, 0x1, 0x9c, 0xf7, 0x1a, 0xd6, 0xf7, 0x1a, 0x3, 0xf7, 0x6c, 0xf7, + 0x21, 0x15, 0x71, 0x88, 0x51, 0x56, 0x74, 0x1b, 0x85, 0x88, 0x90, 0x94, + 0x24, 0xa, 0xfb, 0x71, 0xf8, 0x61, 0x2e, 0xa, 0xf7, 0x65, 0x2d, 0x1d, + 0x7e, 0xa8, 0xf8, 0x35, 0x6e, 0xa, 0xf7, 0x2e, 0x90, 0xa, 0xf7, 0x6b, + 0x7b, 0x1d, 0x7d, 0x59, 0x40, 0x51, 0xfb, 0xaa, 0x2b, 0x57, 0x8b, 0xf7, + 0xa, 0x9f, 0x1e, 0xf7, 0x77, 0xf7, 0x9e, 0x15, 0xa9, 0x7a, 0x6f, 0x97, + 0x73, 0x1b, 0xfb, 0x28, 0xfb, 0x15, 0xfb, 0x2e, 0xfb, 0x2e, 0x2b, 0xd9, + 0x44, 0xdd, 0xf7, 0x2f, 0xf7, 0x15, 0xf7, 0x45, 0xf7, 0x6c, 0xe0, 0x66, + 0xdd, 0x52, 0xc8, 0x1f, 0xf6, 0xc3, 0x69, 0xab, 0x20, 0x52, 0x64, 0xab, + 0x5d, 0xa1, 0x5c, 0x91, 0x19, 0x5f, 0x70, 0xb1, 0x85, 0xb5, 0x73, 0xaf, + 0x68, 0x19, 0xfb, 0xe, 0x4b, 0xac, 0x6c, 0xf7, 0xb, 0xc9, 0x5, 0xae, + 0x5f, 0xa6, 0x56, 0x56, 0x1a, 0xe, 0x21, 0x97, 0x76, 0xa9, 0x76, 0xf8, + 0x62, 0x77, 0xf7, 0x1e, 0xd6, 0x12, 0x13, 0x70, 0x78, 0xa, 0x98, 0x97, + 0x81, 0x7f, 0x1f, 0x75, 0x33, 0xfb, 0x6f, 0x44, 0x1a, 0x13, 0xb0, 0x76, + 0x1d, 0x68, 0x80, 0x60, 0x63, 0x77, 0x88, 0x1d, 0x91, 0x96, 0x1f, 0xa8, + 0xe2, 0xf7, 0x68, 0xcc, 0x4f, 0xa, 0x13, 0x70, 0x88, 0xa, 0xf7, 0x2b, + 0xf8, 0xad, 0x50, 0xa, 0xa9, 0xa1, 0x81, 0x81, 0xa1, 0x1f, 0x7f, 0xa4, + 0xa3, 0x7f, 0xa7, 0x3d, 0x1d, 0x7c, 0x74, 0x95, 0x96, 0x70, 0x1f, 0x95, + 0x71, 0x6d, 0x96, 0x70, 0x54, 0x1d, 0x7e, 0xa8, 0xf8, 0x33, 0xa8, 0xf7, + 0x81, 0x37, 0xa, 0xf7, 0xdd, 0xf8, 0xe, 0x2a, 0x1d, 0x7e, 0xa8, 0xf8, + 0x33, 0x6e, 0xa, 0xe3, 0x90, 0xa, 0xf7, 0xab, 0x7b, 0x1d, 0x7f, 0x59, + 0x40, 0x51, 0xfb, 0xaa, 0x36, 0xa, 0xf7, 0x40, 0xf7, 0x29, 0xf7, 0x1a, + 0xfb, 0xb, 0x9d, 0x4b, 0x1d, 0xf7, 0x76, 0xf8, 0xe, 0x26, 0xa, 0x8f, + 0x1d, 0xf7, 0x7a, 0x37, 0xa, 0xf7, 0x13, 0xf8, 0xe, 0x42, 0xa, 0xe, + 0x8f, 0x1d, 0xd7, 0x8c, 0x1d, 0x4e, 0x1d, 0x13, 0xdc, 0x23, 0xa, 0xf7, + 0x1b, 0xf8, 0x23, 0x50, 0xa, 0xa9, 0xa0, 0x81, 0x80, 0xa0, 0x1f, 0x13, + 0xec, 0x80, 0xa2, 0xa2, 0x7f, 0xac, 0x3d, 0x1d, 0x7c, 0x74, 0x95, 0x96, + 0x71, 0x1f, 0x95, 0x70, 0x6d, 0x96, 0x70, 0x54, 0x1d, 0x8f, 0x1d, 0xc8, + 0xf7, 0x1a, 0x12, 0x88, 0xf7, 0xb, 0x93, 0xf7, 0x1a, 0xcb, 0xf7, 0xb, + 0xfb, 0x1, 0xf7, 0x1a, 0x13, 0xfc, 0x23, 0xa, 0xf7, 0x13, 0xf8, 0x56, + 0x2e, 0xa, 0x13, 0xfa, 0x3a, 0xa, 0x2f, 0x6e, 0xef, 0x27, 0xf7, 0x28, + 0xe7, 0xe1, 0x36, 0xd0, 0xf5, 0xf7, 0x28, 0x27, 0xef, 0x12, 0xf7, 0x67, + 0xf7, 0x28, 0xfb, 0xc, 0xef, 0x13, 0x5a, 0xac, 0xf7, 0x68, 0x15, 0xf8, + 0x8c, 0xd0, 0xfc, 0x8c, 0x6, 0x13, 0xa5, 0xf7, 0x62, 0xfb, 0x98, 0x15, + 0x66, 0xa, 0xf8, 0x64, 0x4, 0x66, 0xa, 0xe, 0x29, 0x76, 0xf5, 0xa8, + 0xcd, 0x77, 0xf8, 0x8, 0xa8, 0xec, 0x5c, 0x1d, 0xe1, 0x90, 0xa, 0xf7, + 0xb0, 0xf7, 0x0, 0x98, 0x96, 0x86, 0x81, 0x94, 0x1e, 0xfb, 0x51, 0xfb, + 0xe5, 0x6f, 0xa, 0x61, 0x40, 0x15, 0x43, 0xfb, 0x12, 0x5, 0xb3, 0x6, + 0xcb, 0xf7, 0x6, 0x5, 0x86, 0x9b, 0x9d, 0x88, 0x9c, 0x1b, 0xf7, 0x34, + 0xf7, 0x10, 0xf7, 0x40, 0xf7, 0x29, 0xda, 0x62, 0xb2, 0x62, 0x9d, 0x1f, + 0xcc, 0xf7, 0x8, 0x5, 0x66, 0x6, 0x50, 0x23, 0x5, 0x90, 0x79, 0x71, + 0x8d, 0x81, 0x1b, 0xfb, 0x32, 0xfb, 0xb, 0xfb, 0x41, 0xfb, 0x2e, 0x4d, + 0xab, 0x5f, 0xb8, 0x74, 0x1f, 0xc1, 0xa6, 0x15, 0xf7, 0x55, 0xf7, 0xeb, + 0x5, 0x8c, 0x8a, 0x8b, 0x87, 0x88, 0x1a, 0x40, 0x51, 0xfb, 0xaa, 0x2b, + 0x77, 0x7f, 0x92, 0x96, 0x83, 0x1e, 0xe, 0x64, 0xa, 0xf7, 0xa0, 0x77, + 0x1, 0x2c, 0x1d, 0x54, 0x4e, 0x8f, 0xa, 0x91, 0x97, 0x31, 0xa, 0x79, + 0x86, 0x97, 0x9a, 0x9e, 0x94, 0xa4, 0x2d, 0xa, 0xcf, 0xf7, 0xfd, 0x2a, + 0x1d, 0x64, 0xa, 0xf7, 0xa0, 0x77, 0x1, 0x29, 0xa, 0x96, 0x9b, 0x9e, + 0x94, 0xa4, 0x2d, 0xa, 0x68, 0xf7, 0xfd, 0x26, 0xa, 0x64, 0xa, 0xf7, + 0x99, 0x77, 0x1, 0x29, 0xa, 0x95, 0x9a, 0x9e, 0x94, 0xa6, 0x2d, 0xa, + 0xfb, 0x1a, 0xf7, 0xfd, 0x42, 0xa, 0xe, 0x64, 0xa, 0xe7, 0xf7, 0x1a, + 0x1, 0xf7, 0x2c, 0x8e, 0xa, 0x3, 0x29, 0xa, 0x96, 0x9a, 0x9e, 0x94, + 0xa5, 0x2d, 0xa, 0xfb, 0x1a, 0xf8, 0x45, 0x2e, 0xa, 0x3a, 0xa, 0x79, + 0x1d, 0xf7, 0x93, 0x77, 0x1, 0x35, 0x1d, 0x55, 0x4b, 0x4a, 0x70, 0x7b, + 0x7e, 0x93, 0x93, 0x7e, 0x1e, 0x94, 0x7c, 0x7c, 0x95, 0x77, 0x38, 0x1d, + 0x6f, 0x96, 0x7e, 0x97, 0x82, 0x1e, 0x9a, 0x7f, 0x9c, 0x85, 0x72, 0x7a, + 0xa, 0x5b, 0xf8, 0x27, 0x26, 0xa, 0x87, 0x1d, 0xf7, 0x81, 0x77, 0x59, + 0x1d, 0x74, 0x6b, 0x43, 0x44, 0xfb, 0x86, 0x4f, 0x1d, 0x5a, 0x1f, 0x88, + 0x8e, 0xea, 0xf7, 0xe8, 0x44, 0x77, 0x1d, 0x1a, 0x7e, 0xfb, 0xe, 0xfc, + 0x5e, 0x4c, 0xfb, 0x88, 0x1e, 0x4d, 0x7b, 0x75, 0x87, 0xa, 0x77, 0xa9, + 0xab, 0xa1, 0x9e, 0xc7, 0x93, 0xac, 0x1f, 0xe, 0xfb, 0x6e, 0xfb, 0x61, + 0xf7, 0x7, 0xf7, 0x65, 0x77, 0xf7, 0xff, 0x77, 0xda, 0xf7, 0x1a, 0x12, + 0xeb, 0x8e, 0xa, 0xfb, 0x2, 0xcb, 0x13, 0xfa, 0x45, 0xa, 0x94, 0x94, + 0x7d, 0x1e, 0x94, 0x7d, 0x7e, 0x93, 0x78, 0x38, 0x1d, 0x6c, 0x98, 0x7e, + 0x98, 0x82, 0x1e, 0x99, 0x81, 0x9a, 0x84, 0x74, 0x7a, 0xa, 0xfb, 0x27, + 0xf8, 0x6f, 0x2e, 0xa, 0x13, 0xfc, 0x3a, 0xa, 0x66, 0x1d, 0xf8, 0x6b, + 0x3c, 0x1d, 0xe, 0x53, 0x1d, 0x56, 0x7d, 0x96, 0x9c, 0x94, 0x8e, 0x97, + 0x8f, 0x98, 0x1f, 0xbd, 0xf7, 0x4d, 0xf7, 0x28, 0xde, 0xa0, 0xd1, 0xfb, + 0x2a, 0x3a, 0xc7, 0xf7, 0x67, 0x9c, 0xc7, 0xa7, 0x94, 0xc3, 0x8e, 0x82, + 0xa, 0xba, 0x84, 0xa3, 0x79, 0x74, 0x1a, 0x83, 0x8b, 0x83, 0x89, 0x83, + 0x1e, 0x3e, 0xfb, 0xa8, 0x27, 0x56, 0x75, 0x45, 0xf3, 0xc3, 0x69, 0xfb, + 0xe, 0x7b, 0x52, 0x76, 0x8c, 0x60, 0x85, 0x19, 0xe, 0x66, 0x1d, 0xf9, + 0x58, 0x77, 0x1, 0xf7, 0x66, 0xf7, 0x21, 0x15, 0x71, 0x88, 0x52, 0x56, + 0x8f, 0xa, 0x90, 0x94, 0x9f, 0x9b, 0xc5, 0x91, 0xa1, 0x1f, 0xc4, 0xf7, + 0x61, 0xe1, 0xba, 0x9e, 0xcf, 0x35, 0x5c, 0xd0, 0xf7, 0x8e, 0x7f, 0xa, + 0x8d, 0xac, 0x8b, 0x6c, 0x1a, 0x76, 0x6f, 0x28, 0x71, 0x2f, 0x1e, 0x3d, + 0x60, 0x78, 0x45, 0xd8, 0xb6, 0x5, 0x65, 0xfb, 0x1d, 0x6d, 0xfb, 0x1, + 0x70, 0x1a, 0x7d, 0x85, 0x56, 0xcf, 0xdb, 0xbd, 0xd0, 0xce, 0xb7, 0x1e, + 0xe, 0xf7, 0xae, 0x83, 0xab, 0x73, 0xab, 0xf7, 0xc4, 0xad, 0xf7, 0x9f, + 0xab, 0x73, 0xab, 0x12, 0xa2, 0xf7, 0x21, 0x13, 0xb4, 0xf8, 0xe1, 0xf7, + 0xe4, 0x15, 0xde, 0x8a, 0xba, 0x80, 0x48, 0x1a, 0x83, 0x88, 0x6b, 0x8a, + 0x7d, 0x1e, 0xa6, 0x86, 0xd3, 0xf7, 0xa4, 0x70, 0x8e, 0x72, 0x54, 0x71, + 0x5a, 0xfb, 0x1e, 0x8c, 0x19, 0xc8, 0xf7, 0x70, 0x5, 0xac, 0x94, 0x8f, + 0x99, 0xb0, 0x1b, 0xf7, 0x44, 0x81, 0x30, 0x4d, 0x1f, 0xa4, 0x85, 0xb9, + 0xf7, 0x53, 0x5, 0xfb, 0xe3, 0x6, 0x78, 0x6d, 0x8d, 0x8d, 0x71, 0x1f, + 0x13, 0xac, 0x8d, 0x70, 0x73, 0x8d, 0x82, 0x1b, 0xfb, 0x24, 0xfb, 0xc9, + 0xfb, 0x6, 0xfb, 0xe0, 0xfb, 0xc, 0xeb, 0xfb, 0xb, 0xf7, 0x3c, 0x1f, + 0xf7, 0x35, 0x92, 0x5, 0x13, 0x74, 0xd5, 0x8c, 0x5, 0xf7, 0xbc, 0x6, + 0xc7, 0xf7, 0x56, 0x70, 0x90, 0x5, 0x46, 0x67, 0x40, 0x29, 0xfb, 0x14, + 0x1b, 0x4c, 0x70, 0x8e, 0xa9, 0x92, 0x8c, 0x94, 0x8d, 0x95, 0x1f, 0xfb, + 0x19, 0xab, 0x15, 0x13, 0xac, 0x4e, 0x7a, 0x73, 0x65, 0x4b, 0x1b, 0xfb, + 0x4, 0x80, 0xf2, 0xab, 0xf7, 0xe, 0xdf, 0xf7, 0xff, 0xf7, 0x50, 0x8c, + 0x1f, 0x9e, 0xc4, 0x8b, 0x4b, 0x74, 0x81, 0x67, 0x89, 0x83, 0x1f, 0xe, + 0xc7, 0x7e, 0xa8, 0x6e, 0xca, 0xf8, 0x13, 0xa8, 0x12, 0x91, 0xf7, 0x9, + 0x13, 0x70, 0xf8, 0x39, 0xf7, 0x6e, 0x15, 0xf7, 0x6a, 0xd2, 0xaf, 0x8b, + 0xa3, 0x1b, 0x9e, 0x9a, 0x7c, 0x70, 0x89, 0x8b, 0xfb, 0x17, 0xfb, 0x39, + 0x64, 0x1f, 0x20, 0xfb, 0x42, 0x15, 0x5c, 0xb3, 0xb8, 0x81, 0xa7, 0x1b, + 0xe6, 0xc5, 0xbd, 0xe2, 0xb6, 0x1f, 0x6f, 0x9a, 0x5, 0x58, 0x6a, 0x70, + 0x65, 0x4f, 0x1b, 0x60, 0x75, 0xb8, 0xbc, 0x98, 0x8e, 0x99, 0x90, 0x98, + 0x1f, 0xf1, 0xa2, 0xf7, 0x32, 0xb3, 0xf7, 0xd, 0x1a, 0xd5, 0x50, 0x9f, + 0x54, 0x49, 0x60, 0x69, 0x6f, 0x68, 0x1e, 0xa4, 0x7a, 0x70, 0xb0, 0x42, + 0x1b, 0xfb, 0x49, 0xfb, 0x4, 0xfb, 0x5c, 0x22, 0xfb, 0x39, 0xf7, 0x19, + 0x86, 0xa5, 0xaf, 0xd0, 0x96, 0xb9, 0xb7, 0x1f, 0xfb, 0x53, 0xc7, 0x15, + 0xea, 0xca, 0xf7, 0x1e, 0x8a, 0x87, 0x1e, 0xb9, 0x9f, 0xa6, 0xc1, 0xbb, + 0x1b, 0xc3, 0x8c, 0x56, 0x76, 0x1f, 0x13, 0xb0, 0x56, 0x51, 0xfb, 0xb6, + 0x28, 0x5d, 0x80, 0xb1, 0xbd, 0x1e, 0xe, 0x21, 0x79, 0xad, 0xf9, 0xe, + 0xae, 0x87, 0x77, 0xf7, 0x80, 0x85, 0x1d, 0x13, 0xdc, 0x8d, 0x79, 0x15, + 0xa9, 0x6, 0xa2, 0x95, 0x90, 0x97, 0xa4, 0x1b, 0x9c, 0xa3, 0x7e, 0x81, + 0xad, 0x1f, 0x84, 0xa1, 0xa6, 0x86, 0xa9, 0x1b, 0xf7, 0x2f, 0xe2, 0xdb, + 0xf7, 0x18, 0xd9, 0x4d, 0xc8, 0x4d, 0xc2, 0x1f, 0x4e, 0xc2, 0x4f, 0xbb, + 0xbf, 0x1a, 0x96, 0x83, 0xeb, 0xf1, 0xf7, 0x6, 0xa1, 0xfb, 0x2, 0x53, + 0x91, 0x1e, 0xa6, 0x87, 0x5, 0x13, 0xbc, 0xb3, 0xf7, 0x5d, 0x5, 0x6d, + 0x6, 0x71, 0x7f, 0x6f, 0x8b, 0x87, 0x1b, 0x7b, 0x76, 0x93, 0x93, 0x73, + 0x1f, 0x13, 0xdc, 0x92, 0x75, 0x72, 0x92, 0x70, 0x1b, 0xfb, 0x1a, 0x3a, + 0x2b, 0x26, 0x3e, 0xc2, 0x57, 0xc5, 0x5b, 0x1f, 0xcb, 0x56, 0xcf, 0x5b, + 0x47, 0x1a, 0x77, 0x82, 0x21, 0xfb, 0x4, 0x61, 0xfb, 0x8, 0x9b, 0xf7, + 0x40, 0x8a, 0x1e, 0x6e, 0x8d, 0x5, 0xf7, 0x94, 0xf8, 0x99, 0x15, 0xdd, + 0x6, 0xf7, 0x2a, 0xf7, 0x42, 0x5, 0x53, 0x6, 0xfb, 0xf, 0x78, 0x1d, + 0xfb, 0xa5, 0x93, 0x76, 0xf8, 0x4e, 0xac, 0x8a, 0x77, 0xf7, 0x8d, 0x77, + 0x12, 0xf7, 0x40, 0xf6, 0x13, 0xd8, 0x85, 0xa, 0x98, 0x96, 0x85, 0x85, + 0x9a, 0x1f, 0x87, 0x97, 0x99, 0x87, 0x9e, 0x1b, 0xcb, 0xe9, 0xb0, 0xec, + 0xba, 0x6e, 0xb7, 0x6c, 0xb3, 0x1f, 0x66, 0xba, 0x63, 0xb5, 0xad, 0x1a, + 0x90, 0x85, 0xbc, 0xc0, 0xc6, 0xa6, 0x46, 0x59, 0x93, 0x1e, 0xa6, 0x89, + 0x5, 0x13, 0xb8, 0x79, 0xa, 0x7a, 0x82, 0x90, 0x91, 0x7f, 0x1f, 0x13, + 0xd8, 0x90, 0x80, 0x7d, 0x91, 0x73, 0x1b, 0x4a, 0x3e, 0x67, 0x32, 0x4e, + 0xaa, 0x65, 0xbc, 0x4c, 0x1f, 0xa4, 0x6b, 0x9f, 0x5e, 0x69, 0x1a, 0x70, + 0x7d, 0x77, 0x66, 0x82, 0x48, 0x7c, 0xa, 0xf7, 0x6a, 0xf8, 0xa5, 0x60, + 0x1d, 0x58, 0x8b, 0xa4, 0xf8, 0xff, 0xa4, 0xc5, 0xf7, 0x1b, 0x1, 0xf7, + 0x74, 0xf7, 0x1b, 0xd8, 0xf7, 0x1b, 0x3, 0xd4, 0x16, 0xf7, 0xd6, 0xa4, + 0x6, 0x64, 0x67, 0x95, 0xac, 0x93, 0x8d, 0x95, 0x8f, 0x96, 0x1f, 0xbf, + 0xf7, 0x67, 0xf7, 0x52, 0xf7, 0x9f, 0x90, 0x1d, 0xb6, 0x93, 0x19, 0xa4, + 0xfb, 0x64, 0x72, 0x7, 0xbc, 0x89, 0x9f, 0x7c, 0x74, 0x1a, 0x79, 0x80, + 0x74, 0x7a, 0x72, 0x1e, 0xfb, 0x15, 0xfb, 0x4e, 0x5, 0x4b, 0xf7, 0x5c, + 0x7e, 0x96, 0xa7, 0x1a, 0xa2, 0x97, 0xa9, 0xc5, 0x1e, 0xa4, 0xfb, 0xaf, + 0x72, 0x7, 0xbb, 0x84, 0x92, 0x94, 0x9d, 0x54, 0xe3, 0xfb, 0xaa, 0x18, + 0x4f, 0xfb, 0x6c, 0x79, 0x4b, 0x72, 0x88, 0x51, 0x86, 0x19, 0xf7, 0x2b, + 0xf9, 0x95, 0x46, 0x1d, 0x58, 0x58, 0xa, 0xf7, 0x78, 0x77, 0x3e, 0xa, + 0xf7, 0xd1, 0xf9, 0x40, 0x60, 0xa, 0xfb, 0xa5, 0x52, 0x76, 0xf8, 0x43, + 0xeb, 0xf7, 0x85, 0x77, 0x1, 0x72, 0x75, 0x15, 0xa7, 0xb1, 0x92, 0x8a, + 0x9a, 0x1b, 0xa5, 0xa4, 0x78, 0x78, 0xa8, 0x1f, 0x75, 0xac, 0xb2, 0x74, + 0xbf, 0x76, 0xa, 0x7e, 0x8f, 0x82, 0x8f, 0x85, 0x1f, 0x90, 0x83, 0x92, + 0x86, 0x83, 0x1a, 0x84, 0x83, 0x83, 0x7e, 0x71, 0x81, 0xa2, 0xa8, 0x7c, + 0x1e, 0x7a, 0xad, 0x73, 0xb5, 0x4c, 0xa4, 0x80, 0xa, 0xfb, 0x2e, 0x70, + 0x1d, 0xfb, 0xf6, 0x5, 0xf7, 0x73, 0xf8, 0x99, 0x60, 0xa, 0xfb, 0x30, + 0xf7, 0x27, 0xf8, 0x29, 0xb7, 0xf7, 0xb, 0xf7, 0x28, 0x6d, 0xa9, 0x12, + 0xf8, 0x3c, 0xf7, 0x5, 0x13, 0xd8, 0xd9, 0xf8, 0x20, 0x15, 0xf4, 0x6, + 0x3f, 0xfc, 0x22, 0x8f, 0x3d, 0x55, 0x69, 0x8, 0x85, 0x82, 0x77, 0x85, + 0x7c, 0x1b, 0x81, 0x83, 0x8f, 0x94, 0x91, 0x94, 0x93, 0x93, 0x96, 0x1f, + 0x91, 0x93, 0x90, 0x95, 0x96, 0x1a, 0x9c, 0x7e, 0xac, 0x64, 0x5c, 0x80, + 0x62, 0x7d, 0x48, 0xc0, 0x72, 0xc3, 0xf7, 0x7, 0xef, 0xe5, 0xf7, 0xc8, + 0xc1, 0x1e, 0xa6, 0xf7, 0x2e, 0x5, 0xf7, 0x8, 0x6, 0x94, 0xb7, 0x5, + 0xfb, 0xa, 0x6, 0xf7, 0x1f, 0xa2, 0x9b, 0xed, 0xcc, 0x1b, 0x97, 0x97, + 0x86, 0x81, 0x86, 0x86, 0x86, 0x85, 0x86, 0x1f, 0x83, 0x83, 0x81, 0x81, + 0x77, 0x1a, 0x13, 0xe8, 0x66, 0xaa, 0x7e, 0x9d, 0xcb, 0x8b, 0xc0, 0x95, + 0xba, 0x5c, 0xb1, 0x4f, 0xfb, 0x41, 0x64, 0xfb, 0x54, 0x40, 0x72, 0x1e, + 0x20, 0x6, 0xe, 0x7f, 0x1d, 0xf7, 0x42, 0x77, 0x1, 0xb3, 0xf8, 0x98, + 0x5b, 0xa, 0xe6, 0xe3, 0x30, 0x7e, 0x1d, 0x7f, 0x1d, 0xf7, 0x42, 0x77, + 0x1, 0xf7, 0x3b, 0xf8, 0x98, 0x60, 0x1d, 0xfb, 0xdd, 0xf8, 0x98, 0xd3, + 0x43, 0xf7, 0x36, 0x1, 0xd3, 0xf9, 0x3a, 0x15, 0xb6, 0x6, 0x57, 0x90, + 0xaa, 0x65, 0xd3, 0x1b, 0xe5, 0x9e, 0xc3, 0xad, 0x9b, 0x1f, 0xb2, 0x6, + 0x85, 0x80, 0xfb, 0x30, 0xfb, 0x37, 0xfb, 0x1f, 0x89, 0xf7, 0xa, 0xb7, + 0x1e, 0xe, 0xfb, 0xdd, 0xf8, 0xa1, 0xf7, 0x16, 0x1, 0xf7, 0x57, 0xf7, + 0x16, 0x3, 0xf7, 0x37, 0xf8, 0xe2, 0x15, 0x4b, 0xa, 0xe, 0xfb, 0xdd, + 0xf8, 0x9d, 0xbc, 0xf7, 0xb, 0xbb, 0x1, 0xf7, 0x6, 0xbb, 0xf7, 0x15, + 0xbc, 0x3, 0xf7, 0x13, 0xf9, 0x3, 0x15, 0x4f, 0xbb, 0x5c, 0xc6, 0xc5, + 0xbb, 0xbb, 0xc6, 0xc5, 0x5b, 0xbb, 0x51, 0x50, 0x5b, 0x5c, 0x5e, 0xa, + 0xe, 0xfb, 0xdd, 0xfb, 0x41, 0xd0, 0xf7, 0x28, 0x77, 0x1, 0x63, 0xdf, + 0x3, 0xa7, 0xb7, 0x15, 0x63, 0x5f, 0x6f, 0x5e, 0x5e, 0x1a, 0x46, 0xd2, + 0x7d, 0xb3, 0xad, 0xc9, 0xa6, 0xbb, 0xa1, 0x1e, 0x71, 0x99, 0x5, 0x81, + 0x79, 0x7e, 0x81, 0x74, 0x1b, 0x63, 0x72, 0x9d, 0xba, 0xa4, 0x98, 0xb2, + 0x8f, 0x9e, 0x1f, 0xe, 0xfb, 0xdd, 0xf8, 0xb2, 0xf6, 0x30, 0x76, 0xa6, + 0x76, 0xb0, 0xd6, 0x41, 0xcf, 0x12, 0x13, 0x30, 0x87, 0xf8, 0xb3, 0x15, + 0xaf, 0x6, 0x13, 0x48, 0x9c, 0x92, 0x93, 0xa0, 0xa9, 0x1b, 0xa5, 0xa1, + 0x82, 0x81, 0x9f, 0x1f, 0x13, 0x80, 0x81, 0xa0, 0xa0, 0x81, 0xa5, 0x1b, + 0xd9, 0x9f, 0xd6, 0xab, 0x93, 0x1f, 0x66, 0x6, 0x7a, 0x83, 0x82, 0x76, + 0x6c, 0x1b, 0x7e, 0x74, 0x95, 0x95, 0x72, 0x1f, 0x94, 0x74, 0x72, 0x94, + 0x73, 0x1b, 0x13, 0x30, 0x33, 0x7a, 0x23, 0x89, 0x1f, 0xe, 0xfb, 0xdd, + 0xf8, 0x98, 0xf7, 0x49, 0x1, 0xd0, 0xf8, 0x98, 0x15, 0xbb, 0x6, 0xf7, + 0x2d, 0x21, 0x1d, 0xd0, 0xfb, 0x17, 0x15, 0xba, 0x5a, 0xa, 0xf7, 0x46, + 0xc7, 0x4f, 0xe6, 0x1, 0x80, 0xf7, 0x46, 0x15, 0xf8, 0x55, 0xc7, 0xfc, + 0x55, 0x6, 0xe, 0xf7, 0xe6, 0xf7, 0x46, 0xc8, 0x4e, 0xe6, 0x1, 0xf7, + 0x46, 0x4, 0xfa, 0x53, 0xc8, 0xfe, 0x53, 0x6, 0xe, 0xfb, 0xdd, 0x69, + 0x1d, 0xf7, 0x14, 0xe1, 0x35, 0xf7, 0x30, 0x13, 0xe0, 0xf7, 0xe0, 0xf9, + 0x29, 0x15, 0x5c, 0xa, 0xc6, 0x7b, 0xa6, 0x1e, 0x13, 0xd0, 0xb4, 0xa8, + 0xab, 0xb5, 0xa9, 0x7c, 0x9a, 0x7a, 0x97, 0x1f, 0x13, 0xe0, 0x79, 0x98, + 0x77, 0x94, 0xa1, 0x7a, 0x1d, 0xe, 0xfb, 0xdd, 0x69, 0x1d, 0xf7, 0x26, + 0x6d, 0x1d, 0x13, 0xd0, 0xf7, 0x3, 0xf8, 0x5, 0x15, 0x49, 0xa, 0x13, + 0xe0, 0x62, 0x6e, 0x6b, 0x61, 0x6b, 0x9c, 0x7d, 0x9c, 0x7f, 0x1f, 0x13, + 0xd0, 0x9d, 0x7f, 0x9d, 0x81, 0x89, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x35, + 0x62, 0xa, 0xb6, 0x6d, 0x1d, 0x13, 0xd0, 0x86, 0xfb, 0x32, 0x15, 0x98, + 0x73, 0x5, 0x49, 0xa, 0x13, 0xe0, 0x62, 0x6e, 0x6b, 0x61, 0x6f, 0x98, + 0x7c, 0x9a, 0x80, 0x1f, 0x13, 0xd0, 0x9e, 0x7c, 0xa2, 0x83, 0x73, 0x54, + 0xa, 0xe, 0x69, 0x1d, 0xc0, 0xe1, 0x35, 0xf7, 0x30, 0xef, 0xe1, 0x35, + 0xf7, 0x30, 0x13, 0xd8, 0xf7, 0x95, 0xf9, 0x29, 0x15, 0x63, 0xa, 0xab, + 0x79, 0x9a, 0x7a, 0x97, 0x1e, 0x13, 0xe4, 0x79, 0x97, 0x7a, 0x94, 0xa0, + 0x7a, 0x1d, 0xf7, 0x94, 0x16, 0x63, 0xa, 0xa8, 0x7c, 0x9a, 0x7b, 0x97, + 0x1e, 0x13, 0xe8, 0x78, 0x99, 0x77, 0x93, 0xa2, 0x7a, 0x1d, 0xe, 0x69, + 0x1d, 0xf0, 0x6d, 0x1d, 0xef, 0x6d, 0x1d, 0x13, 0xe4, 0xf7, 0xd6, 0xf8, + 0x5, 0x15, 0x40, 0xa, 0x6d, 0x61, 0x6c, 0x9c, 0x7b, 0x9c, 0x7f, 0x1f, + 0x13, 0xd4, 0x9d, 0x7e, 0x9d, 0x81, 0x89, 0xa, 0xfb, 0x87, 0x73, 0x15, + 0x40, 0xa, 0x6d, 0x61, 0x6d, 0x9a, 0x7c, 0x9b, 0x7f, 0x1f, 0x13, 0xd8, + 0x9e, 0x7d, 0x9f, 0x81, 0x75, 0x54, 0xa, 0xe, 0xfb, 0x35, 0x62, 0xa, + 0x82, 0x6d, 0x1d, 0xef, 0x6d, 0x1d, 0x13, 0xe4, 0xf7, 0x5b, 0xfb, 0x32, + 0x15, 0x98, 0x73, 0x5, 0x40, 0xa, 0x6c, 0x61, 0x6a, 0x9d, 0x7c, 0x9d, + 0x7f, 0x1f, 0x13, 0xd4, 0x9c, 0x7f, 0x9c, 0x82, 0x89, 0xa, 0xfb, 0x94, + 0x16, 0x98, 0x73, 0x5, 0x40, 0xa, 0x6c, 0x61, 0x6c, 0x9b, 0x7c, 0x9c, + 0x7f, 0x1f, 0x13, 0xd8, 0x9d, 0x7e, 0x9e, 0x82, 0x75, 0x54, 0xa, 0xe, + 0xfb, 0x10, 0x76, 0xf8, 0xb7, 0xf3, 0x4c, 0xa3, 0xf7, 0x6e, 0x77, 0x12, + 0x13, 0xb0, 0xf7, 0x30, 0xfb, 0x25, 0x15, 0xa2, 0x6, 0xb1, 0xf7, 0x1e, + 0xb0, 0xf7, 0x4d, 0xd0, 0xe6, 0x8, 0x81, 0x99, 0x7b, 0xce, 0xbe, 0x1a, + 0x9b, 0x8d, 0x9a, 0x8f, 0x96, 0x1e, 0xa9, 0x8d, 0xa1, 0x84, 0x9d, 0x82, + 0x8, 0x13, 0xd0, 0x7f, 0xa2, 0x9d, 0x7c, 0xa2, 0x1b, 0x95, 0xba, 0x90, + 0xba, 0x90, 0x8b, 0xba, 0x54, 0x73, 0x7a, 0x7e, 0x80, 0x73, 0x1f, 0x13, + 0xb0, 0x83, 0x7a, 0x77, 0x84, 0x6e, 0x1b, 0x8f, 0x9d, 0x91, 0xac, 0x9e, + 0xa2, 0x8, 0xa6, 0xad, 0x9f, 0xa5, 0xa9, 0x1a, 0x9d, 0x80, 0xaf, 0x5d, + 0x69, 0x76, 0x73, 0x68, 0x6c, 0x96, 0x6f, 0x91, 0x71, 0x1e, 0x90, 0x72, + 0x8a, 0x73, 0x80, 0x72, 0x6a, 0x8a, 0x75, 0x94, 0x78, 0x94, 0x8, 0x13, + 0xd0, 0x96, 0x76, 0x79, 0x96, 0x70, 0x1b, 0x81, 0x62, 0x89, 0x57, 0x72, + 0x9e, 0x74, 0xaa, 0xab, 0x9c, 0x97, 0x96, 0x9f, 0x1f, 0x13, 0xb0, 0x9c, + 0x94, 0x9f, 0x93, 0xaa, 0x8a, 0x88, 0x67, 0x6c, 0x38, 0x56, 0x5f, 0x95, + 0xfb, 0xa, 0x18, 0xe, 0xfb, 0x57, 0x76, 0xf7, 0x57, 0xf4, 0xf7, 0xb9, + 0xf4, 0xf7, 0x57, 0x77, 0x1, 0xd9, 0xf7, 0x12, 0xaf, 0x9f, 0xaf, 0xf7, + 0x12, 0x14, 0xe, 0xf7, 0x4a, 0xa1, 0x15, 0x73, 0x40, 0x3b, 0x59, 0x51, + 0x1a, 0x6c, 0xa1, 0x73, 0xaa, 0xb9, 0xa6, 0xb8, 0xb5, 0x1e, 0xad, 0x80, + 0xac, 0xad, 0x1a, 0x9c, 0x8f, 0x9c, 0x8e, 0x9b, 0x1e, 0x8a, 0xc1, 0xb8, + 0x61, 0xc0, 0x1b, 0xa9, 0xa1, 0xa2, 0xa8, 0xaa, 0x71, 0xa1, 0x6e, 0x1f, + 0x8c, 0x6c, 0x50, 0x5e, 0x58, 0x1b, 0x9c, 0xbe, 0xab, 0xa3, 0xbb, 0xa0, + 0x8, 0x70, 0x9e, 0x79, 0xa1, 0xae, 0x1a, 0xc2, 0xb7, 0xa7, 0xb6, 0x9e, + 0x1e, 0x74, 0xa0, 0x7b, 0x9c, 0xad, 0x1a, 0x97, 0x8d, 0x96, 0x8e, 0x97, + 0x1e, 0xb4, 0xcd, 0x58, 0x92, 0xad, 0x1f, 0xac, 0xa0, 0x9e, 0xad, 0xac, + 0x70, 0x9e, 0x6b, 0x5d, 0x67, 0x5f, 0x8c, 0x5a, 0x1f, 0xa3, 0xd6, 0xdb, + 0xbd, 0xc5, 0x1a, 0xaa, 0x75, 0xa3, 0x6c, 0x5d, 0x70, 0x5e, 0x61, 0x1e, + 0x69, 0x96, 0x6a, 0x69, 0x1a, 0x7a, 0x87, 0x7a, 0x88, 0x7b, 0x1e, 0x8c, + 0x55, 0x5e, 0xb5, 0x56, 0x1b, 0x6d, 0x75, 0x74, 0x6e, 0x6c, 0xa5, 0x75, + 0xa8, 0x1f, 0x8a, 0xaa, 0xc6, 0xb8, 0xbe, 0x1b, 0x7a, 0x58, 0x6b, 0x73, + 0x5b, 0x76, 0x8, 0xa6, 0x78, 0x9d, 0x75, 0x68, 0x1a, 0x54, 0x5f, 0x6f, + 0x60, 0x78, 0x1e, 0xa2, 0x76, 0x9b, 0x7a, 0x69, 0x1a, 0x7f, 0x89, 0x80, + 0x88, 0x7f, 0x1e, 0x62, 0x49, 0xbe, 0x84, 0x69, 0x1f, 0x6a, 0x76, 0x78, + 0x69, 0x6a, 0xa6, 0x78, 0xab, 0xb9, 0xaf, 0xb7, 0x8a, 0xbc, 0x1f, 0xe, + 0xfb, 0xcc, 0xf7, 0x58, 0x76, 0xf7, 0xc4, 0x77, 0xcd, 0x77, 0x1, 0xac, + 0xf7, 0xe6, 0x15, 0x3c, 0xcb, 0x4c, 0xd9, 0xd9, 0xca, 0xc9, 0xd9, 0xd9, + 0x4a, 0xcc, 0x3d, 0x3c, 0x4e, 0x4c, 0x3d, 0x1e, 0xe, 0xf7, 0xe6, 0x7e, + 0xf7, 0x28, 0x1, 0xb3, 0xf7, 0x2a, 0xf7, 0x49, 0xf7, 0x2a, 0xf7, 0x49, + 0xf7, 0x2a, 0x14, 0x70, 0xb3, 0xc8, 0x15, 0x62, 0xab, 0x7d, 0x1d, 0x6a, + 0x69, 0x63, 0x1e, 0xf7, 0xdf, 0x16, 0x62, 0xab, 0x7d, 0x1d, 0x6a, 0x69, + 0x63, 0x1e, 0xf7, 0xdf, 0x16, 0x62, 0xa9, 0x6a, 0xb7, 0xb4, 0xae, 0xab, + 0xb5, 0xb4, 0x68, 0x53, 0xa, 0xf7, 0xe6, 0x7d, 0xa5, 0x85, 0x76, 0xf7, + 0xe1, 0xa5, 0xf7, 0xc6, 0xa5, 0x8c, 0x77, 0x12, 0x13, 0xb0, 0xf7, 0xe6, + 0xf7, 0x8, 0x2b, 0x1d, 0xf7, 0x74, 0x33, 0x2b, 0x1d, 0xfd, 0x69, 0xf7, + 0x88, 0x2b, 0x1d, 0x13, 0x68, 0xfb, 0x30, 0xfc, 0xbb, 0x15, 0xc7, 0x6, + 0xf8, 0xe9, 0xf9, 0x48, 0x5, 0x4f, 0x6, 0xe, 0xfb, 0xdd, 0x72, 0x1d, + 0xab, 0xf7, 0x6d, 0x71, 0x1d, 0x80, 0x95, 0x96, 0x8a, 0x1d, 0x42, 0x8d, + 0xa, 0xe2, 0x5f, 0xa, 0xe, 0xfb, 0xdd, 0x72, 0x1d, 0xf7, 0x30, 0x49, + 0x1d, 0x96, 0x82, 0x7f, 0x93, 0x83, 0x1b, 0x86, 0x87, 0x87, 0x7f, 0x1f, + 0xe, 0xfc, 0x83, 0x92, 0x76, 0xf9, 0x4d, 0x77, 0x1, 0xfb, 0x1, 0x7d, + 0x15, 0xf8, 0x45, 0xf9, 0x4b, 0x5, 0x8d, 0x4f, 0x7, 0xfc, 0x45, 0xfd, + 0x4d, 0x5, 0xe, 0x90, 0x8b, 0xba, 0xf7, 0x60, 0xb4, 0xef, 0xb4, 0xf7, + 0x69, 0xb0, 0x1, 0xf7, 0x4, 0xf7, 0x26, 0xf7, 0xa7, 0xae, 0x3, 0xb3, + 0xf7, 0x8f, 0x15, 0xfb, 0x41, 0xf7, 0x1a, 0x3d, 0xf7, 0x4, 0xf7, 0xb, + 0xf7, 0x16, 0xbb, 0xde, 0xc5, 0x1e, 0x6d, 0xa1, 0x5, 0x53, 0x63, 0xfb, + 0x2, 0x59, 0x57, 0x1b, 0xfb, 0xe, 0x55, 0xc3, 0xf7, 0x28, 0x8c, 0x1f, + 0xf7, 0xbd, 0x6, 0x97, 0xb4, 0x5, 0xfb, 0xc5, 0x6, 0xa5, 0x96, 0xb9, + 0x94, 0xa7, 0x1e, 0xf7, 0xc1, 0x6, 0x99, 0xb4, 0x5, 0xfb, 0xc2, 0x6, + 0xd5, 0x97, 0xe3, 0xf7, 0x1f, 0xf1, 0x1b, 0xf7, 0x6, 0x91, 0x51, 0x2e, + 0x1f, 0xae, 0xf7, 0x22, 0x6, 0x9e, 0x63, 0x79, 0xa6, 0x2c, 0x1b, 0x52, + 0xfb, 0x77, 0x55, 0xfb, 0x58, 0x49, 0x1f, 0xfb, 0x17, 0x6, 0x7e, 0x62, + 0x5, 0xf7, 0x14, 0x6, 0x83, 0x6e, 0x83, 0x61, 0x89, 0x6e, 0x8, 0x2a, + 0x6, 0x7e, 0x62, 0x5, 0xe, 0xf7, 0xe6, 0xf7, 0x9d, 0xa0, 0x89, 0x76, + 0xf8, 0x14, 0xa1, 0x12, 0xf7, 0x3c, 0xd9, 0xf7, 0x8d, 0xa6, 0xf7, 0xcc, + 0xd9, 0x13, 0xbc, 0xf7, 0xa, 0xf7, 0x9d, 0x15, 0xf7, 0x46, 0xa0, 0x6, + 0x58, 0x90, 0x8c, 0x8c, 0xb9, 0x1a, 0xf7, 0xc9, 0xbc, 0x7, 0xb3, 0x9d, + 0x6d, 0x67, 0x93, 0x1f, 0xa0, 0xe3, 0xfb, 0xf2, 0x33, 0xa0, 0x6, 0xaf, + 0x93, 0x9d, 0xa9, 0xb3, 0x1b, 0xbc, 0xfb, 0xc9, 0x6, 0x5d, 0x8c, 0x8a, + 0x58, 0x86, 0x1e, 0xf7, 0xd9, 0x76, 0x15, 0xf7, 0x17, 0xa0, 0x6, 0x5e, + 0x8f, 0x84, 0x8c, 0xba, 0x1a, 0xf7, 0x77, 0x8d, 0x7, 0x13, 0x7c, 0xf7, + 0x26, 0xfb, 0xc2, 0x5, 0x96, 0x6, 0xf7, 0x2b, 0xf7, 0xc4, 0x5, 0x8d, + 0xfb, 0x79, 0x6, 0x13, 0xbc, 0x5d, 0x8d, 0x8a, 0x57, 0x86, 0x1e, 0x76, + 0xf7, 0x46, 0xa0, 0x7, 0x58, 0x90, 0x8c, 0x8c, 0xb9, 0x1a, 0xf7, 0x95, + 0x7, 0xad, 0x96, 0x9f, 0xb8, 0x1e, 0x9f, 0xfb, 0x1, 0x7, 0xfb, 0x31, + 0xfb, 0xc2, 0xfb, 0x2a, 0xf7, 0xc2, 0x5, 0xfb, 0x13, 0x77, 0x6, 0xa8, + 0xa7, 0x76, 0x6c, 0x98, 0x1f, 0xfb, 0x97, 0x7, 0x5c, 0x84, 0x8a, 0x5e, + 0x87, 0x1e, 0xe, 0x53, 0xf7, 0x65, 0xc9, 0x4d, 0xe3, 0x1, 0xbe, 0xf7, + 0x65, 0x15, 0xf8, 0x8c, 0xc9, 0xfc, 0x8c, 0x6, 0xe, 0x21, 0xfb, 0x61, + 0xad, 0xf7, 0x4b, 0x76, 0xf8, 0x34, 0xb5, 0xf1, 0xf7, 0x2c, 0x6d, 0xa9, + 0x12, 0x13, 0xe8, 0x9c, 0xf8, 0x2b, 0x15, 0xd6, 0x6, 0x2f, 0xfc, 0x2f, + 0x5, 0xfb, 0x19, 0x6d, 0x7e, 0x69, 0x5d, 0x1b, 0x79, 0x8b, 0x91, 0x8e, + 0x93, 0x92, 0x8e, 0x90, 0x92, 0x1f, 0x8f, 0x90, 0x8e, 0x91, 0x96, 0x1a, + 0xa9, 0x73, 0x9e, 0x6e, 0x80, 0x67, 0x84, 0x59, 0x60, 0xb6, 0x6b, 0xc2, + 0xed, 0xdf, 0xf7, 0x13, 0xd5, 0x9c, 0x1e, 0xf1, 0xf8, 0x2f, 0x5, 0xf7, + 0x2a, 0x6, 0x46, 0xfb, 0xa1, 0x5, 0x85, 0x74, 0x86, 0x6f, 0x71, 0x1a, + 0x65, 0x9b, 0x6b, 0xbc, 0xcc, 0xb5, 0xb3, 0xeb, 0xc8, 0x1e, 0x75, 0x98, + 0x5, 0x7f, 0x83, 0x5f, 0x48, 0x74, 0x1b, 0x80, 0x87, 0x94, 0x99, 0xa8, + 0x9b, 0xbc, 0x8e, 0x99, 0x1f, 0xd4, 0xf7, 0xaf, 0x5, 0x8a, 0x76, 0xfb, + 0x1, 0x82, 0x72, 0x1b, 0xfb, 0xa, 0x6, 0xf7, 0x23, 0xb1, 0xaa, 0xdc, + 0xee, 0x1b, 0xa4, 0x8b, 0x7f, 0x86, 0x84, 0x82, 0x85, 0x85, 0x80, 0x1f, + 0x87, 0x84, 0x88, 0x83, 0x7f, 0x1a, 0x13, 0xf0, 0x71, 0xa0, 0x6f, 0xb0, + 0xa8, 0xa7, 0x9f, 0xb0, 0xc8, 0x48, 0xad, 0x47, 0xfb, 0x4a, 0x5c, 0xfb, + 0x1d, 0xfb, 0x9, 0x63, 0x1e, 0x3f, 0x6, 0xe, 0x21, 0xfb, 0x61, 0xae, + 0xf7, 0x4a, 0x76, 0xf8, 0x34, 0xb5, 0xf7, 0x76, 0xa8, 0x1, 0x9f, 0xf8, + 0x2b, 0x15, 0xd5, 0x6, 0x2f, 0xfc, 0x26, 0x5, 0xfb, 0x3, 0x72, 0x7c, + 0x4b, 0x61, 0x1b, 0x7a, 0x85, 0x91, 0x91, 0x91, 0x90, 0x90, 0x8f, 0x92, + 0x1f, 0x8f, 0x91, 0x8e, 0x91, 0x96, 0x1a, 0xa5, 0x79, 0x9f, 0x6f, 0x85, + 0x5c, 0x8b, 0x57, 0x41, 0xd7, 0x83, 0x9d, 0xf3, 0xd1, 0xba, 0xf7, 0x37, + 0xab, 0x1e, 0xee, 0xf8, 0x26, 0x5, 0xf7, 0x27, 0x6, 0x3c, 0xfb, 0xd5, + 0x5, 0x89, 0x81, 0x89, 0x80, 0x81, 0x1a, 0x68, 0x9c, 0x6e, 0xc1, 0xd7, + 0xb5, 0xcc, 0xd1, 0xb8, 0x1e, 0x77, 0x96, 0x5, 0x7a, 0x80, 0x64, 0x51, + 0x72, 0x1b, 0x7d, 0x87, 0x93, 0x95, 0x91, 0x8d, 0x92, 0x8d, 0x91, 0x1f, + 0xf7, 0x2b, 0xf8, 0xee, 0x28, 0x7f, 0x5, 0x87, 0x50, 0x9a, 0x6c, 0x1b, + 0xfb, 0x45, 0x61, 0xfb, 0x1d, 0xfb, 0xa, 0x66, 0x1f, 0x41, 0x6, 0xf7, + 0x53, 0x16, 0xe3, 0xa0, 0xab, 0xf7, 0x1e, 0xe9, 0x1b, 0xa2, 0x96, 0x7e, + 0x85, 0x87, 0x84, 0x84, 0x85, 0x81, 0x1f, 0x87, 0x84, 0x87, 0x82, 0x81, + 0x1a, 0x73, 0x98, 0x80, 0x93, 0x85, 0x1e, 0x6d, 0xfb, 0xb, 0x5, 0xe, + 0x79, 0x9d, 0xf8, 0x54, 0x99, 0xf7, 0x63, 0x9b, 0x98, 0x91, 0x6, 0xfb, + 0x62, 0x8d, 0xf7, 0x60, 0x8b, 0xf7, 0x9c, 0x94, 0x7, 0x1e, 0xa0, 0x39, + 0x63, 0xff, 0xc, 0x9, 0xb4, 0xa, 0xf7, 0xc, 0xb, 0x8c, 0xc, 0xe, + 0xf8, 0x88, 0x14, 0xf9, 0x2a, 0x15, 0xb7, 0x13, 0x0, 0x71, 0x2, 0x0, + 0x1, 0x0, 0x29, 0x0, 0x2f, 0x0, 0x3b, 0x0, 0x58, 0x0, 0x61, 0x0, + 0x9b, 0x0, 0x9e, 0x0, 0xab, 0x0, 0xb6, 0x0, 0xc3, 0x0, 0xd6, 0x0, + 0xda, 0x0, 0xea, 0x0, 0xfb, 0x0, 0xff, 0x1, 0x6, 0x1, 0x10, 0x1, + 0x28, 0x1, 0x2e, 0x1, 0x58, 0x1, 0x62, 0x1, 0x76, 0x1, 0x89, 0x1, + 0x96, 0x1, 0xa8, 0x1, 0xb5, 0x1, 0xb9, 0x1, 0xf3, 0x1, 0xfd, 0x2, + 0xd, 0x2, 0x41, 0x2, 0x4a, 0x2, 0x51, 0x2, 0x5d, 0x2, 0x65, 0x2, + 0x73, 0x2, 0x7d, 0x2, 0x86, 0x2, 0x92, 0x2, 0x9e, 0x2, 0xc4, 0x2, + 0xcd, 0x2, 0xe0, 0x2, 0xf2, 0x2, 0xfb, 0x3, 0x3, 0x3, 0x9, 0x3, + 0x28, 0x3, 0x32, 0x3, 0x3c, 0x3, 0x58, 0x3, 0x60, 0x3, 0x68, 0x3, + 0x6d, 0x3, 0x74, 0x3, 0x7b, 0x3, 0x81, 0x3, 0x9a, 0x3, 0x9d, 0x3, + 0xa3, 0x3, 0xb0, 0x3, 0xc6, 0x3, 0xdc, 0x3, 0xea, 0x3, 0xee, 0x3, + 0xf4, 0x3, 0xfa, 0x4, 0x4, 0x4, 0xb, 0x4, 0x12, 0x4, 0x24, 0x4, + 0x32, 0x4, 0x37, 0x4, 0x48, 0x4, 0x53, 0x4, 0x62, 0x4, 0x6c, 0x4, + 0x70, 0x4, 0x76, 0x4, 0x7a, 0x4, 0x83, 0x4, 0x8b, 0x4, 0x92, 0x4, + 0x97, 0x4, 0x9c, 0x4, 0xa1, 0x4, 0xaf, 0x4, 0xbd, 0x4, 0xc8, 0x4, + 0xd5, 0x4, 0xdd, 0x4, 0xe1, 0x4, 0xed, 0x4, 0xf9, 0x4, 0xff, 0x5, + 0x9, 0x5, 0x14, 0x5, 0x1d, 0x5, 0x24, 0x5, 0x29, 0x5, 0x33, 0x5, + 0x3d, 0x5, 0x47, 0x5, 0x51, 0x5, 0x5a, 0x5, 0x5e, 0x5, 0x67, 0x5, + 0x6d, 0x5, 0x73, 0x5, 0x79, 0x5, 0x7f, 0x5, 0x83, 0x5, 0x87, 0x50, + 0x1d, 0xf4, 0xc2, 0x1a, 0xd3, 0x47, 0x9d, 0x68, 0xfb, 0x37, 0xfb, 0x13, + 0xfb, 0x4b, 0xfb, 0x1c, 0xfb, 0x4, 0xdf, 0x5f, 0x35, 0xa, 0x98, 0xda, + 0x9e, 0x8d, 0x8d, 0x3d, 0xa, 0x72, 0x82, 0x57, 0x70, 0x2d, 0xfb, 0x17, + 0x68, 0x1f, 0xb, 0x6, 0xf7, 0x2c, 0x21, 0x1d, 0xb, 0x77, 0x1, 0x90, + 0xf7, 0x16, 0xf7, 0x3f, 0xe7, 0x3, 0x20, 0xa, 0xb, 0xf7, 0x8, 0xe3, + 0x90, 0xa, 0xf7, 0xab, 0x7b, 0x1d, 0x7b, 0x59, 0x40, 0x51, 0xfb, 0xa6, + 0x36, 0xa, 0xf7, 0x3c, 0xf7, 0x29, 0xf7, 0x1a, 0xfb, 0xb, 0xa1, 0x4b, + 0x1d, 0xb, 0x32, 0x1d, 0x8c, 0xa9, 0x8a, 0x6b, 0x34, 0x1d, 0xb, 0x77, + 0x1, 0x4d, 0xa, 0x3, 0xf7, 0x3f, 0xf7, 0x2c, 0x15, 0xe7, 0xe2, 0xf8, + 0x29, 0xf7, 0x4c, 0xf3, 0x8c, 0x21, 0x76, 0xfb, 0x8, 0x2d, 0xfc, 0x1a, + 0xfb, 0x46, 0x50, 0x5e, 0xaf, 0x55, 0x1d, 0xd2, 0xfb, 0x16, 0xf7, 0x3b, + 0xf7, 0x8d, 0xf7, 0x45, 0xf7, 0x9c, 0xf7, 0x56, 0xf7, 0x42, 0xfb, 0x19, + 0xd0, 0x5d, 0x1d, 0xfb, 0x79, 0xfb, 0x89, 0x1e, 0xb, 0x22, 0x1d, 0xe, + 0xa4, 0x87, 0x80, 0xb6, 0x4f, 0x1b, 0xfb, 0xe, 0xfb, 0x29, 0x2f, 0x1d, + 0xb, 0xf7, 0x8c, 0xf7, 0x6, 0x15, 0x8d, 0x8c, 0x5, 0x2e, 0x1d, 0xb, + 0x2c, 0x1d, 0x54, 0x4d, 0x8f, 0xa, 0x91, 0x98, 0x31, 0xa, 0x79, 0x86, + 0xb, 0x4c, 0xa, 0x60, 0x3a, 0x7c, 0x71, 0xfb, 0x27, 0x8c, 0x19, 0x65, + 0xa, 0x93, 0x73, 0x1d, 0x8b, 0x31, 0x1d, 0xb, 0x16, 0x20, 0x1d, 0xb, + 0x57, 0xa, 0x4e, 0x90, 0x7c, 0x8f, 0x39, 0x1d, 0x65, 0x50, 0x7b, 0x97, + 0x6e, 0x82, 0x19, 0xb, 0x91, 0x9f, 0x1f, 0x44, 0x1d, 0x89, 0xa1, 0x8a, + 0x71, 0x51, 0x40, 0xfb, 0x4a, 0x46, 0x47, 0xa, 0xb, 0x15, 0x20, 0x1d, + 0xb, 0x68, 0x1d, 0xf7, 0x7f, 0x22, 0xa, 0xb, 0xcc, 0xdb, 0xf7, 0x84, + 0xdf, 0x94, 0xa7, 0x39, 0xa, 0xb, 0xab, 0xde, 0xf7, 0xa1, 0x9f, 0xd1, + 0x1f, 0xfb, 0xa, 0x6, 0x6c, 0x20, 0x74, 0x3c, 0x5e, 0x3a, 0x8, 0x73, + 0x7e, 0x4e, 0x2c, 0x63, 0x1b, 0xb, 0x87, 0x8f, 0x95, 0x24, 0xa, 0xb, + 0x15, 0xf7, 0x58, 0xae, 0x6, 0x60, 0x75, 0x98, 0xa1, 0x92, 0x8c, 0x93, + 0x8f, 0x91, 0x48, 0x1d, 0x9a, 0x20, 0x8b, 0x95, 0x77, 0x1a, 0x5a, 0x69, + 0x84, 0x5e, 0x57, 0xa, 0x4d, 0x91, 0x7d, 0x8e, 0x39, 0x1d, 0x67, 0x50, + 0x78, 0x95, 0x6f, 0x84, 0x6b, 0x1d, 0x77, 0x74, 0xa, 0x13, 0x6c, 0x28, + 0xa, 0x13, 0x9c, 0xb, 0xcd, 0xf7, 0x0, 0xbf, 0xe2, 0xbe, 0xaa, 0x1e, + 0x6e, 0x9c, 0x5, 0x66, 0x72, 0x67, 0x55, 0x55, 0x1b, 0x77, 0x5c, 0xb, + 0x2b, 0x57, 0x8b, 0xbf, 0x9f, 0x1e, 0xfb, 0xb, 0xbd, 0x15, 0x2b, 0xd9, + 0x54, 0xdd, 0xf7, 0x34, 0xf7, 0x10, 0xb, 0x77, 0x1, 0x88, 0xf7, 0xb, + 0xf7, 0x62, 0xf7, 0xb, 0x3, 0x23, 0xa, 0xb, 0x35, 0x1a, 0xfb, 0xc, + 0xf7, 0x4, 0x57, 0xf6, 0xf7, 0x65, 0xb4, 0xf7, 0x22, 0xf7, 0x1f, 0xb3, + 0x1e, 0xb, 0x84, 0x61, 0x41, 0x45, 0xfb, 0x83, 0x34, 0x7d, 0x6d, 0x96, + 0xb9, 0x1e, 0xb, 0xf7, 0x64, 0x2d, 0x1d, 0x15, 0xf7, 0xa, 0xd7, 0xf7, + 0x12, 0xf6, 0xd1, 0x5f, 0xc0, 0x42, 0xfb, 0x8, 0x40, 0xfb, 0xc, 0x20, + 0x44, 0xb0, 0x51, 0xd8, 0x1f, 0x8e, 0xa5, 0x15, 0x72, 0x83, 0x9c, 0xa1, + 0xab, 0xa5, 0xe4, 0x95, 0xae, 0x1f, 0xad, 0x95, 0x9b, 0xd6, 0xb8, 0x1b, + 0xa0, 0x97, 0x7b, 0x76, 0x65, 0x70, 0x36, 0x7f, 0x63, 0x1f, 0x68, 0x81, + 0x7f, 0x46, 0x5d, 0x1b, 0xb, 0x15, 0x62, 0xa9, 0x7d, 0x1d, 0x6c, 0x69, + 0x63, 0x1e, 0xe, 0x8f, 0x9d, 0x1f, 0x92, 0xab, 0x15, 0xd4, 0x9b, 0xbe, + 0xf7, 0x22, 0xc9, 0x1b, 0xa8, 0x8b, 0xb, 0x1, 0x80, 0x16, 0xf8, 0x8e, + 0x6, 0xc6, 0xf7, 0x56, 0x70, 0x90, 0x5, 0xfb, 0x18, 0x4d, 0xfb, 0x1c, + 0x6b, 0x24, 0x1b, 0x45, 0x6, 0xf8, 0x46, 0xf8, 0xe7, 0x5, 0xb2, 0xfc, + 0x68, 0x7, 0x52, 0xfb, 0x46, 0xa7, 0x87, 0x5, 0xcd, 0xba, 0xc8, 0xdc, + 0xf7, 0x24, 0x1b, 0xd9, 0x6, 0xfc, 0x46, 0xfc, 0xe7, 0x5, 0xb, 0x48, + 0x1d, 0x9b, 0x21, 0x8a, 0x94, 0x77, 0x1a, 0xb, 0x49, 0xa, 0x13, 0xe8, + 0x62, 0x6e, 0xb, 0x1f, 0xf7, 0x14, 0xf8, 0x5b, 0x9c, 0xca, 0xa6, 0x8f, + 0x56, 0x1d, 0xb, 0x5b, 0xa, 0xe8, 0xe3, 0x2e, 0x3b, 0x1d, 0xb, 0x6b, + 0x1a, 0xfb, 0x19, 0xfc, 0x79, 0x7a, 0x4d, 0x74, 0x88, 0x63, 0x84, 0x19, + 0xb, 0xaf, 0x9f, 0xcc, 0x99, 0xba, 0x1f, 0xd2, 0xf7, 0x80, 0xb, 0x35, + 0x1d, 0x53, 0x4b, 0x4c, 0x70, 0x79, 0x7d, 0xb, 0x41, 0xa, 0xc7, 0x9a, + 0x7e, 0x79, 0x7f, 0x86, 0x7d, 0x47, 0x1d, 0xe, 0x1a, 0x74, 0x8b, 0x54, + 0xd8, 0xd7, 0xb5, 0xc5, 0xf5, 0xd7, 0x1e, 0xb, 0xa7, 0xe3, 0x5, 0xb7, + 0x6, 0x9c, 0xc8, 0x5, 0x5e, 0x6, 0xd9, 0xf7, 0x99, 0x5, 0x5d, 0x6, + 0xfb, 0xaa, 0xfb, 0x93, 0x5, 0xa7, 0x85, 0x15, 0xf7, 0x48, 0xf7, 0x3a, + 0x8d, 0x89, 0x5, 0x8c, 0x6, 0x58, 0xfb, 0x38, 0x5, 0xb, 0x75, 0xa, + 0xde, 0x62, 0x1d, 0x9b, 0x70, 0x1e, 0xb, 0xa0, 0x1e, 0xbd, 0xaf, 0xdc, + 0xc7, 0xbd, 0xaf, 0x8, 0x94, 0x7, 0x55, 0xc2, 0x52, 0xc5, 0x5a, 0xc0, + 0x8, 0xb, 0x67, 0xa8, 0x6e, 0xaf, 0xaf, 0xa8, 0xa8, 0xaf, 0xaf, 0x6e, + 0xa8, 0x67, 0x67, 0x6e, 0x6e, 0x67, 0x1e, 0xb, 0x1f, 0xa7, 0x86, 0xd5, + 0xf7, 0xa5, 0x6f, 0x8f, 0xb, 0xa6, 0xf7, 0x24, 0xf8, 0xc, 0xf7, 0x24, + 0xb, 0xf7, 0x42, 0x5, 0x3a, 0x6, 0xb, 0x1a, 0xd8, 0x57, 0x8d, 0x73, + 0x34, 0x55, 0x38, 0x21, 0x43, 0x1e, 0x88, 0x8d, 0xc7, 0xf7, 0x4e, 0x5, + 0x79, 0x3c, 0x28, 0x82, 0x75, 0x1b, 0x70, 0x7, 0xa6, 0xa6, 0x8b, 0x71, + 0x1f, 0xb, 0x15, 0xb3, 0x6, 0x9e, 0x93, 0x94, 0xa3, 0xac, 0x1b, 0xb, + 0x90, 0x8b, 0xab, 0xf7, 0xc6, 0xab, 0xf7, 0x9f, 0xab, 0xb, 0xc4, 0x1a, + 0xba, 0x65, 0xc0, 0x47, 0x36, 0x60, 0x4d, 0x67, 0x79, 0x1e, 0x9d, 0x80, + 0x5, 0x94, 0x94, 0xa5, 0xb2, 0xba, 0x1b, 0xc6, 0x8b, 0x52, 0x7f, 0x67, + 0x6a, 0xb, 0xac, 0x62, 0x60, 0x6c, 0x69, 0x63, 0x1e, 0xe, 0x1a, 0x53, + 0x28, 0x58, 0x78, 0x81, 0x1e, 0xb, 0xbd, 0x96, 0x57, 0x1d, 0xb, 0x90, + 0x8b, 0xae, 0xf7, 0x41, 0xb3, 0xb, 0x1e, 0x68, 0xf7, 0xc4, 0xae, 0x7, + 0xb, 0x8b, 0xae, 0xf8, 0xeb, 0xae, 0xb, 0xf7, 0x95, 0xfc, 0xb9, 0x5, + 0xa7, 0x6, 0xf7, 0x23, 0xf8, 0x8e, 0xb2, 0xf7, 0x1e, 0x95, 0x83, 0xc0, + 0x98, 0x19, 0xae, 0xfb, 0x65, 0x68, 0x7, 0xb, 0x21, 0xa, 0xe, 0x15, + 0xc4, 0x6, 0xf7, 0x17, 0xb, 0x7e, 0xa3, 0x5, 0x7c, 0x87, 0xfb, 0x44, + 0x38, 0xfb, 0x19, 0x1a, 0x3b, 0xb, 0xf7, 0x3b, 0x1a, 0xf7, 0x48, 0xfb, + 0x6, 0xed, 0xfb, 0x4f, 0x1e, 0xfb, 0xb6, 0x68, 0x6, 0xc9, 0x82, 0x96, + 0x89, 0x6a, 0x1a, 0xb, 0x50, 0x1e, 0xbb, 0x16, 0xab, 0xa5, 0xa5, 0xab, + 0xab, 0xa5, 0x71, 0x6b, 0x6b, 0x71, 0x71, 0x6b, 0x6b, 0x71, 0xa5, 0xab, + 0x1e, 0xb, 0xdc, 0xaf, 0x1a, 0x94, 0x87, 0x8e, 0x86, 0x79, 0x61, 0x61, + 0x7c, 0x6c, 0xa, 0xb, 0x4c, 0x1d, 0x78, 0x1d, 0xae, 0xfb, 0xbe, 0x68, + 0x7, 0xb, 0x76, 0xf7, 0xd0, 0x77, 0x12, 0xb, 0x5c, 0xa, 0xc3, 0x7b, + 0xa6, 0xb4, 0xab, 0xab, 0xb5, 0xb, 0x21, 0x82, 0xd3, 0xf8, 0x16, 0x77, + 0xb, 0xc8, 0xf7, 0x73, 0x5, 0xa7, 0x93, 0xb, 0x6f, 0xa1, 0x75, 0xa7, + 0xa7, 0xa1, 0xa1, 0xa7, 0xa7, 0x75, 0xa1, 0x6f, 0x6f, 0x75, 0x75, 0x6f, + 0x1e, 0xb, 0x66, 0xa8, 0x6e, 0xb0, 0xb0, 0xa9, 0xa8, 0x36, 0x1d, 0x6e, + 0x6d, 0x66, 0x1e, 0xb, 0xfb, 0xa5, 0x58, 0xa, 0xb, 0x9e, 0x9c, 0x9e, + 0xa2, 0xb4, 0x1b, 0xb3, 0x98, 0x6e, 0x74, 0x4c, 0x2f, 0x7a, 0x6e, 0x86, + 0x1f, 0xb, 0xf7, 0x52, 0xf7, 0x95, 0x90, 0x1d, 0xb6, 0x93, 0x57, 0x1d, + 0xb, 0x7c, 0x59, 0xfb, 0x2c, 0x67, 0xfb, 0x6, 0x1f, 0x65, 0x7b, 0x68, + 0x8a, 0x73, 0x1b, 0xe, 0x76, 0x1e, 0x59, 0x67, 0x3a, 0x4f, 0x59, 0x67, + 0x8, 0xb, 0x19, 0x70, 0x7, 0xb, 0xa8, 0xf7, 0x81, 0x5c, 0x1d, 0xb, + 0x5, 0x89, 0x6, 0xb, 0x15, 0x50, 0x49, 0x34, 0x3a, 0x67, 0x1a, 0x82, + 0xb, 0x6f, 0x80, 0x60, 0x62, 0x77, 0x88, 0x1d, 0xb, 0xc7, 0x79, 0xc3, + 0xf8, 0xe8, 0xae, 0xb, 0xf7, 0x7f, 0x77, 0x1, 0xb, 0x12, 0x76, 0xf7, + 0xf, 0xb, 0x9a, 0x8f, 0xf7, 0x44, 0xb, 0x1b, 0xd7, 0xaa, 0xc3, 0xac, + 0xb4, 0x67, 0x98, 0x79, 0x6f, 0x76, 0x70, 0x74, 0xb, 0x91, 0xa0, 0x1f, + 0xfb, 0x80, 0xfb, 0x12, 0x15, 0xf7, 0xb2, 0x6, 0xf7, 0xd2, 0xb, 0x85, + 0x83, 0xa, 0xf7, 0xe8, 0xe3, 0xf0, 0xbd, 0xa4, 0x1b, 0xb, 0xa2, 0xf7, + 0x2d, 0x5, 0x6e, 0x6, 0x7a, 0x81, 0x88, 0x87, 0x7c, 0x1b, 0xb, 0x1a, + 0x67, 0x62, 0x3c, 0x5f, 0x36, 0x1e, 0xb, 0x15, 0xb8, 0x6, 0xb, 0x8b, + 0xf7, 0x19, 0x7c, 0x1e, 0x70, 0x8e, 0x75, 0xfb, 0x3a, 0x5, 0xb, 0x8d, + 0x93, 0x94, 0x8d, 0x99, 0x1b, 0xb9, 0x8b, 0x6b, 0x87, 0x71, 0xb, 0x1f, + 0xc8, 0xf7, 0x7b, 0x5, 0xb, 0x3c, 0x7c, 0x59, 0x83, 0x3b, 0x84, 0x6d, + 0xa, 0xa9, 0xb, 0xf7, 0xad, 0xf7, 0xe3, 0x18, 0x95, 0xfb, 0xcc, 0x7, + 0x60, 0xb, 0xfb, 0x32, 0x15, 0x98, 0x73, 0x5, 0x75, 0xa, 0xb, 0x19, + 0xae, 0xfb, 0xd1, 0x68, 0x7, 0xb, 0x16, 0xf7, 0xd, 0x6, 0xb, 0xfb, + 0xdd, 0xfb, 0x32, 0x76, 0xf9, 0xf4, 0x77, 0x1, 0xb, 0x93, 0x7e, 0x15, + 0x9c, 0x90, 0x9f, 0x8e, 0x8f, 0x1b, 0xb, 0x92, 0x95, 0x75, 0x1f, 0x75, + 0x6a, 0x5, 0x84, 0x9c, 0xb, 0x8b, 0x69, 0x1b, 0x66, 0xf7, 0x8d, 0xb0, + 0x7, 0x68, 0xb, 0x72, 0x58, 0xfb, 0x39, 0x58, 0xfb, 0x53, 0x1e, 0xb, + 0x76, 0x54, 0xa, 0xb, 0xfb, 0xce, 0xfb, 0x3a, 0x76, 0xf9, 0xfd, 0x77, + 0xb, 0x1a, 0x87, 0x8a, 0x86, 0x8a, 0xb, 0x15, 0xf7, 0x74, 0x9e, 0x6, + 0xb, 0xf7, 0x40, 0x5, 0xc6, 0xcd, 0xb, 0xf7, 0x1a, 0xd5, 0xf7, 0x1a, + 0xb, 0x74, 0x88, 0x1d, 0xb, 0x15, 0xcb, 0xbd, 0xb}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifItalic.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifItalic.cpp new file mode 100644 index 000000000000..eec32d71d332 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifItalic.cpp @@ -0,0 +1,1778 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitSerifItalicFontData[21227] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x15, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x49, + 0x74, 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1, 0x2a, 0xf8, 0x10, + 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8, 0x1e, 0x3, 0xf8, 0x18, + 0x4, 0x1e, 0xe1, 0x5a, 0x4f, 0xc, 0x2, 0xfb, 0x3c, 0xfb, 0x8e, 0xfa, + 0x71, 0xf9, 0xf8, 0x5, 0xf7, 0x3c, 0xf, 0xf8, 0x93, 0x11, 0xb0, 0x1c, + 0x46, 0xd6, 0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f, 0x45, 0x54, 0x45, + 0x75, 0x72, 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4f, 0x54, 0x46, + 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68, 0x72, 0x6F, 0x6D, + 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0, + 0x1, 0x0, 0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, + 0x0, 0x0, 0x42, 0x20, 0x0, 0x67, 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, + 0x0, 0x0, 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, + 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, + 0x0, 0x0, 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0, 0x0, 0xa9, + 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98, 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, + 0x0, 0x0, 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0, 0x0, 0x78, + 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, + 0x0, 0x0, 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0, 0x0, 0xad, + 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a, 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, + 0x0, 0x0, 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2, 0x0, 0x9a, + 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe, 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, + 0x0, 0x0, 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0, 0x0, 0xc4, + 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, + 0x0, 0x0, 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0, 0x0, 0xca, + 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90, 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, + 0x0, 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2, 0x0, 0xa7, + 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, + 0x0, 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0, 0x0, 0xe1, + 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, + 0x0, 0x0, 0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0, 0x0, 0x8e, + 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, + 0x1, 0x0, 0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0, 0x0, 0x88, + 0x0, 0x0, 0x81, 0x1, 0x0, 0x84, 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, + 0x0, 0x0, 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0, 0x41, + 0x0, 0x0, 0x8, 0x0, 0x0, 0x75, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0, 0x0, 0x79, + 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63, 0x0, 0x1, 0x87, 0x0, 0x0, 0x99, + 0x0, 0x0, 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2, 0x0, 0x1, + 0x0, 0x3, 0x0, 0x5, 0x0, 0x4a, 0x0, 0x82, 0x0, 0xf8, 0x1, 0x8c, + 0x1, 0xb7, 0x2, 0x73, 0x2, 0xa0, 0x2, 0xd9, 0x3, 0x17, 0x3, 0xed, + 0x4, 0x1a, 0x4, 0x49, 0x4, 0x60, 0x4, 0x6d, 0x4, 0x88, 0x4, 0xcf, + 0x5, 0x1d, 0x5, 0x70, 0x5, 0xe3, 0x6, 0x2a, 0x6, 0x7a, 0x6, 0xd3, + 0x6, 0xff, 0x7, 0x7d, 0x7, 0xe1, 0x7, 0xfe, 0x8, 0x46, 0x8, 0x71, + 0x8, 0x95, 0x8, 0xb5, 0x9, 0x2c, 0x9, 0xe6, 0xa, 0x2e, 0xa, 0xb6, + 0xa, 0xe4, 0xb, 0x2e, 0xb, 0x8c, 0xb, 0xf5, 0xc, 0x6e, 0xc, 0xf7, + 0xd, 0x30, 0xd, 0x87, 0xe, 0xb, 0xe, 0x3a, 0xe, 0xb5, 0xf, 0x1f, + 0xf, 0x62, 0xf, 0xc8, 0x10, 0x4c, 0x10, 0xc6, 0x11, 0x2, 0x11, 0x4d, + 0x11, 0xa6, 0x11, 0xf6, 0x12, 0x75, 0x12, 0xf6, 0x13, 0x4f, 0x13, 0x59, + 0x13, 0x85, 0x13, 0xa3, 0x13, 0xd2, 0x13, 0xf9, 0x14, 0xa, 0x14, 0x26, + 0x14, 0x63, 0x14, 0xd3, 0x15, 0x11, 0x15, 0x9e, 0x15, 0xea, 0x16, 0x6e, + 0x17, 0x1a, 0x17, 0x8e, 0x17, 0xc6, 0x18, 0x33, 0x18, 0xa9, 0x18, 0xe1, + 0x19, 0x85, 0x19, 0xab, 0x19, 0xea, 0x1a, 0x2a, 0x1a, 0x95, 0x1a, 0xf1, + 0x1b, 0x53, 0x1b, 0xb1, 0x1b, 0xef, 0x1c, 0x56, 0x1c, 0xf1, 0x1d, 0x95, + 0x1d, 0xd7, 0x1e, 0x19, 0x1e, 0x75, 0x1e, 0x8b, 0x1e, 0xe9, 0x1f, 0x36, + 0x1f, 0x81, 0x1f, 0xf7, 0x20, 0x99, 0x21, 0xc, 0x21, 0xa1, 0x21, 0xc0, + 0x22, 0x97, 0x22, 0xa5, 0x23, 0x4c, 0x23, 0xc3, 0x24, 0x4, 0x24, 0x25, + 0x25, 0x13, 0x25, 0x2a, 0x25, 0x62, 0x25, 0x9a, 0x25, 0xb6, 0x25, 0xfd, + 0x26, 0x1c, 0x26, 0x98, 0x26, 0xd0, 0x26, 0xdf, 0x27, 0x21, 0x27, 0x73, + 0x27, 0xb1, 0x27, 0xc4, 0x28, 0x1c, 0x28, 0x88, 0x28, 0xd1, 0x29, 0x31, + 0x29, 0x65, 0x29, 0x8c, 0x29, 0xc3, 0x29, 0xfd, 0x2a, 0x29, 0x2a, 0x89, + 0x2b, 0x2f, 0x2b, 0x91, 0x2b, 0xd0, 0x2b, 0xf3, 0x2c, 0x12, 0x2c, 0x33, + 0x2c, 0x40, 0x2c, 0x5e, 0x2c, 0x74, 0x2c, 0x89, 0x2c, 0xec, 0x2d, 0x85, + 0x2d, 0x96, 0x2d, 0xa9, 0x2d, 0xc2, 0x2d, 0xfd, 0x2e, 0x1f, 0x2e, 0x61, + 0x2e, 0xdd, 0x2f, 0x5, 0x2f, 0x1c, 0x2f, 0x2f, 0x2f, 0x5c, 0x2f, 0xc8, + 0x30, 0x43, 0x30, 0xfb, 0x31, 0x9, 0x31, 0x1b, 0x31, 0x35, 0x31, 0x5d, + 0x31, 0x74, 0x31, 0xbd, 0x32, 0x62, 0x32, 0xd5, 0x32, 0xf4, 0x33, 0x2c, + 0x33, 0x50, 0x33, 0x73, 0x33, 0x92, 0x33, 0xaf, 0x33, 0xbe, 0x33, 0xdb, + 0x34, 0x4f, 0x34, 0x8b, 0x34, 0xa6, 0x34, 0xc0, 0x34, 0xda, 0x35, 0x13, + 0x35, 0x33, 0x35, 0x64, 0x35, 0xd5, 0x35, 0xf0, 0x35, 0xfe, 0x36, 0x24, + 0x36, 0x49, 0x36, 0x95, 0x36, 0xe0, 0x37, 0x3e, 0x37, 0x54, 0x37, 0x93, + 0x37, 0xdd, 0x38, 0x99, 0x39, 0x38, 0x39, 0x7d, 0x39, 0xe5, 0x3a, 0x66, + 0x3a, 0x78, 0x3a, 0xc8, 0x3b, 0x4c, 0x3b, 0x67, 0x3b, 0x83, 0x3b, 0xad, + 0x3b, 0xbd, 0x3c, 0xf, 0x3c, 0x41, 0x3c, 0x5e, 0x3c, 0x7e, 0x3c, 0x92, + 0x3c, 0xa8, 0x3c, 0xcd, 0x3c, 0xfd, 0x3d, 0x1e, 0x3d, 0x60, 0x3d, 0x99, + 0x3d, 0xd2, 0x3e, 0x75, 0x3f, 0x4e, 0x3f, 0x7a, 0x3f, 0xb5, 0x3f, 0xed, + 0x40, 0xb, 0x40, 0x27, 0x40, 0x3c, 0x40, 0xba, 0x41, 0x60, 0x41, 0x6d, + 0x42, 0x36, 0x43, 0x7, 0x20, 0xe, 0x20, 0xe, 0x73, 0x8e, 0xf4, 0xf8, + 0xc3, 0x77, 0x12, 0xb2, 0xf4, 0x17, 0xf7, 0xc, 0xf7, 0x49, 0x15, 0x9c, + 0x87, 0xc5, 0xf7, 0x32, 0xbe, 0xf7, 0x8, 0xb7, 0xf7, 0x10, 0x19, 0x92, + 0x9f, 0x90, 0x9b, 0x9a, 0x1a, 0xa6, 0x6e, 0x99, 0x7c, 0x1e, 0x13, 0xa0, + 0x71, 0x77, 0x6d, 0x64, 0x82, 0x1f, 0x6f, 0xfb, 0x10, 0x76, 0xfb, 0x18, + 0x69, 0xfb, 0x35, 0x8, 0x3a, 0xfb, 0x20, 0x15, 0x6e, 0xa2, 0x85, 0xa, + 0x74, 0x73, 0x6e, 0x1e, 0xe, 0xca, 0xf8, 0x4e, 0x76, 0xf7, 0x89, 0x77, + 0x1, 0xf7, 0x24, 0xa0, 0xf7, 0x32, 0xa0, 0x3, 0xf7, 0xd7, 0xf8, 0x39, + 0x15, 0xa0, 0x6, 0xa8, 0xd0, 0xc6, 0xf6, 0xac, 0x1a, 0x9c, 0x7f, 0x9e, + 0x76, 0x77, 0x71, 0xbc, 0xa, 0xfb, 0x47, 0x16, 0xa0, 0x6, 0xa7, 0xcc, + 0xc1, 0xee, 0xbb, 0x1a, 0x9a, 0x81, 0x9d, 0x7a, 0x72, 0x76, 0xbc, 0xa, + 0xe, 0xa0, 0x76, 0xf7, 0x5f, 0xb2, 0x64, 0xc1, 0xf7, 0x2d, 0xc1, 0x63, + 0xb3, 0xf7, 0x68, 0x77, 0x12, 0xe9, 0xf8, 0x64, 0x13, 0xb6, 0x9c, 0x16, + 0xb3, 0x6, 0xd6, 0xf7, 0x5f, 0x5, 0xf7, 0x42, 0x6, 0x40, 0xfb, 0x5f, + 0x5, 0xb2, 0x6, 0xd7, 0xf7, 0x5f, 0x5, 0xf4, 0x6, 0x13, 0xce, 0x96, + 0xb2, 0x5, 0x26, 0x6, 0xce, 0xf7, 0x4a, 0x5, 0xf0, 0x6, 0x96, 0xb3, + 0x5, 0x2b, 0x6, 0xdb, 0xf7, 0x68, 0x5, 0x62, 0x6, 0x3b, 0xfb, 0x68, + 0x5, 0xfb, 0x41, 0x6, 0xda, 0xf7, 0x68, 0x5, 0x66, 0x6, 0x3b, 0xfb, + 0x68, 0x5, 0x22, 0x6, 0x80, 0x63, 0x5, 0xee, 0x6, 0x49, 0xfb, 0x4a, + 0x5, 0x2b, 0x6, 0x80, 0x64, 0x5, 0xe7, 0x6, 0xc1, 0xb2, 0x15, 0xce, + 0xf7, 0x4a, 0x5, 0xf7, 0x42, 0x6, 0x47, 0xfb, 0x4a, 0x5, 0xe, 0x47, + 0x76, 0xf5, 0x76, 0xa4, 0x76, 0xf9, 0x15, 0xa6, 0xb9, 0x77, 0x12, 0xa2, + 0xd9, 0xf7, 0xab, 0xd6, 0x13, 0xde, 0xf7, 0xae, 0xf8, 0x38, 0x15, 0x61, + 0xa9, 0x64, 0xab, 0xc1, 0x1a, 0xd5, 0xc5, 0xaa, 0xd8, 0x1e, 0xfb, 0x7, + 0xfc, 0xfc, 0x15, 0xcf, 0xf7, 0xad, 0x5, 0xc2, 0x5d, 0xaf, 0x6d, 0x48, + 0x1a, 0xfb, 0x14, 0xfb, 0x14, 0x81, 0x6c, 0x1e, 0xfb, 0x52, 0xb5, 0x15, + 0x97, 0x80, 0xbf, 0x65, 0xe1, 0x7b, 0x75, 0x30, 0x18, 0xae, 0x6, 0x13, + 0xbe, 0xa0, 0xe4, 0x5, 0x13, 0x5e, 0xf7, 0x56, 0xb9, 0xf6, 0xe4, 0xdb, + 0x5e, 0xb9, 0x2a, 0xd5, 0x1f, 0xc3, 0xf7, 0x81, 0x5, 0xad, 0x7d, 0xbe, + 0x76, 0x29, 0x1a, 0x9a, 0x89, 0xa7, 0xf7, 0x6, 0x60, 0xaa, 0x50, 0x9b, + 0x78, 0x8f, 0x19, 0x9b, 0xcf, 0x5, 0x69, 0x6, 0x7a, 0x4c, 0x5, 0x13, + 0x44, 0xfb, 0xe, 0x2b, 0x58, 0xfb, 0x0, 0x44, 0xcc, 0x4d, 0xd1, 0x5c, + 0x1f, 0x46, 0xfb, 0xbd, 0x2a, 0xa1, 0x82, 0xcc, 0x82, 0xd5, 0x19, 0x7b, + 0x88, 0x5, 0xe, 0xf8, 0x70, 0xb0, 0xa, 0xd5, 0xd0, 0xa, 0xf7, 0x1e, + 0xd0, 0xa, 0x13, 0xb7, 0x80, 0xf8, 0x97, 0xf7, 0x9, 0x30, 0xa, 0xfc, + 0x8b, 0xf8, 0x11, 0x30, 0xa, 0x13, 0x6f, 0x80, 0x54, 0xfc, 0x33, 0x15, + 0xba, 0x6, 0xf9, 0x48, 0xf9, 0x48, 0x5, 0x5c, 0x6, 0xe, 0xf8, 0x39, + 0x79, 0xbc, 0x5b, 0xbc, 0xf8, 0x1, 0xaa, 0xf7, 0x62, 0xab, 0x12, 0xd7, + 0xe9, 0xf7, 0x2e, 0xdc, 0xf7, 0x4, 0xd0, 0x13, 0x7e, 0xf8, 0x5d, 0xc8, + 0x15, 0x13, 0xbe, 0x6d, 0xa3, 0xb3, 0x5a, 0xd5, 0x1b, 0xbe, 0xb6, 0xa5, + 0xb5, 0xad, 0x1f, 0x80, 0x96, 0x5, 0x7f, 0x7b, 0x76, 0x79, 0x69, 0x1b, + 0x62, 0x60, 0xa6, 0xce, 0x66, 0x1f, 0xc2, 0xd2, 0xa8, 0xbe, 0x9a, 0x9f, + 0x8, 0xb0, 0xa6, 0x9f, 0xa8, 0xbc, 0x1b, 0x9c, 0xfb, 0x4d, 0x78, 0x7, + 0xaa, 0x95, 0x7b, 0x70, 0x61, 0x71, 0x6a, 0x5f, 0x56, 0x1f, 0x60, 0xcd, + 0x6b, 0xf7, 0xb, 0x7f, 0xbf, 0x8, 0xc7, 0xa9, 0xf7, 0x4, 0xc3, 0xe6, + 0x1a, 0xbb, 0x61, 0xb7, 0x50, 0x30, 0x45, 0x3b, 0xfb, 0x11, 0x7e, 0x8c, + 0x82, 0x91, 0x4e, 0x1e, 0xfb, 0x17, 0x52, 0xfb, 0x10, 0x55, 0xfb, 0x15, + 0x1a, 0xfb, 0x1a, 0xf7, 0x14, 0x75, 0xbd, 0xdb, 0xb3, 0xa5, 0xc0, 0xde, + 0x1e, 0x78, 0xa8, 0x15, 0x61, 0x5d, 0x52, 0x7d, 0x68, 0x1b, 0x48, 0x4c, + 0xba, 0xe1, 0xf7, 0x9, 0xf7, 0x36, 0xc8, 0x8c, 0x1f, 0x9f, 0x45, 0xb2, + 0xfb, 0x13, 0xb9, 0x51, 0x8, 0x6f, 0xf7, 0xe6, 0x15, 0x88, 0xa5, 0x89, + 0x9c, 0xaf, 0x1a, 0xc2, 0x94, 0xd3, 0xc4, 0x9b, 0xa9, 0x8b, 0x53, 0x38, + 0x5c, 0x6e, 0x4f, 0x65, 0x1e, 0xe, 0xfb, 0x23, 0xf8, 0x4e, 0x76, 0xf7, + 0x89, 0x77, 0x1, 0xf7, 0x18, 0xa0, 0x3, 0xf7, 0x18, 0xf8, 0x39, 0x15, + 0xa0, 0x6, 0xb4, 0xe3, 0xba, 0xe5, 0xa8, 0x1a, 0x9c, 0x80, 0xa0, 0x75, + 0x77, 0x71, 0x7e, 0x72, 0x84, 0x1e, 0x82, 0x6b, 0x82, 0xfb, 0xc, 0x86, + 0x54, 0x8, 0xe, 0x73, 0xfb, 0x34, 0x76, 0xf9, 0xe6, 0x77, 0x1, 0xb5, + 0xd2, 0x3, 0xf7, 0x21, 0xfb, 0x49, 0x15, 0x9d, 0x91, 0x5, 0x4c, 0xf7, + 0x9, 0x9c, 0xf7, 0x53, 0xc4, 0x1a, 0xf7, 0x21, 0xeb, 0xf7, 0x7c, 0xf5, + 0xe6, 0x1e, 0x7e, 0x9a, 0x5, 0xfb, 0x4a, 0xfb, 0x2f, 0x3d, 0xfb, 0x30, + 0xfb, 0x39, 0x1a, 0x4b, 0x90, 0xfb, 0x2a, 0xe9, 0xfb, 0x34, 0x1e, 0xe, + 0x73, 0xfb, 0x36, 0x76, 0xf9, 0xe8, 0x77, 0x12, 0xf7, 0x6d, 0xd3, 0x17, + 0x9b, 0xfb, 0x39, 0x15, 0x98, 0x7c, 0x5, 0x13, 0x60, 0xf7, 0x28, 0xf7, + 0xb, 0xf7, 0x4, 0xf7, 0x3a, 0xf7, 0x51, 0x1a, 0xf7, 0x16, 0x70, 0xf7, + 0x14, 0x43, 0xf7, 0x9, 0x1e, 0x78, 0x86, 0xbd, 0x2b, 0x98, 0xfb, 0x1b, + 0x7a, 0xfb, 0x1f, 0x19, 0x75, 0xfb, 0x47, 0x43, 0xfb, 0x4a, 0x20, 0x29, + 0x8, 0xe, 0xf7, 0x37, 0xf7, 0x9, 0x66, 0x76, 0xf8, 0x10, 0x76, 0xe0, + 0x77, 0xa6, 0x77, 0x12, 0xf7, 0xc1, 0x9d, 0x13, 0xac, 0xf7, 0xc0, 0xf8, + 0x52, 0x15, 0x8c, 0x73, 0x8c, 0x71, 0x84, 0x73, 0x8, 0x82, 0x6c, 0x7e, + 0x6f, 0x7c, 0x1a, 0x13, 0x6c, 0x72, 0x9d, 0x79, 0x9d, 0x9d, 0x9e, 0x9c, + 0xa6, 0x8c, 0x1e, 0x8c, 0xa1, 0x7e, 0x99, 0x82, 0xb0, 0x8, 0x87, 0x9d, + 0x88, 0xa2, 0xac, 0x1a, 0xa2, 0x7e, 0x9c, 0x7e, 0x99, 0x7f, 0x8, 0x65, + 0xb6, 0x92, 0x6c, 0xab, 0x1b, 0x9d, 0x9e, 0x9a, 0xa3, 0xb1, 0x62, 0x87, + 0x4c, 0x9e, 0x1f, 0x79, 0x90, 0x76, 0x97, 0x76, 0x96, 0xa3, 0x9d, 0xa3, + 0x94, 0xa0, 0x91, 0x8, 0xc3, 0x9c, 0xb2, 0x82, 0xbb, 0x1a, 0x9e, 0x7a, + 0x9a, 0x78, 0x6f, 0x7b, 0x6f, 0x6f, 0x70, 0x1e, 0x70, 0x70, 0x66, 0x71, + 0x89, 0x1b, 0xb0, 0x8e, 0xa9, 0x90, 0x98, 0x1e, 0x95, 0xa7, 0x94, 0xa1, + 0xa0, 0x1a, 0x13, 0xb4, 0xa7, 0x7a, 0x99, 0x7a, 0x79, 0x78, 0x7b, 0x70, + 0x76, 0x95, 0x7a, 0x93, 0x6a, 0x1e, 0x8f, 0x78, 0x8f, 0x73, 0x6a, 0x1a, + 0x6f, 0x9b, 0x78, 0x9a, 0x7c, 0x99, 0x8, 0xae, 0x66, 0x83, 0xa4, 0x6b, + 0x1b, 0x74, 0x80, 0x77, 0x7d, 0x5e, 0xb3, 0x90, 0xc2, 0x7c, 0x1f, 0x9d, + 0x86, 0x9f, 0x84, 0xac, 0x78, 0x70, 0x79, 0x71, 0x81, 0x74, 0x85, 0x8, + 0x56, 0x7d, 0x66, 0x8f, 0x5f, 0x1a, 0x81, 0x96, 0x74, 0xa3, 0xa8, 0x9c, + 0xa7, 0xa8, 0xa5, 0x1e, 0xa4, 0xa6, 0xa7, 0x97, 0x97, 0x95, 0x8, 0xe, + 0xf7, 0xd2, 0xa0, 0x76, 0xf7, 0x86, 0xb4, 0xf7, 0x73, 0x77, 0x12, 0xf7, + 0xc5, 0xcd, 0x53, 0xb5, 0x13, 0xf0, 0xe1, 0xf7, 0x86, 0x15, 0x13, 0xe8, + 0xf7, 0x79, 0xfb, 0x86, 0xb5, 0xf7, 0x86, 0xf7, 0x7d, 0xb4, 0xfb, 0x7d, + 0xf7, 0x73, 0x61, 0xfb, 0x73, 0xfb, 0x79, 0x6, 0xe, 0x20, 0xfb, 0x0, + 0x76, 0xf7, 0x7a, 0x77, 0x12, 0xa2, 0xc0, 0xa, 0x13, 0xe0, 0x87, 0xfb, + 0x4, 0x15, 0x94, 0x7a, 0x5, 0xc8, 0xa, 0x83, 0x5e, 0x7f, 0x61, 0x75, + 0x97, 0x81, 0x97, 0x83, 0x1e, 0x13, 0xd0, 0x97, 0x83, 0x97, 0x84, 0x7a, + 0x1a, 0x66, 0x54, 0x66, 0x77, 0x7e, 0x1e, 0xe, 0x73, 0xf7, 0x54, 0xca, + 0x1, 0xbc, 0xf7, 0x7d, 0x3, 0xbc, 0xf7, 0x54, 0x15, 0xf7, 0x6e, 0x6, + 0x9a, 0xca, 0x5, 0xfb, 0x6d, 0x6, 0xe, 0x20, 0x80, 0xf7, 0x3, 0x1, + 0xa6, 0xf7, 0x3, 0x3, 0xa6, 0xb7, 0x84, 0xa, 0x3c, 0x8e, 0x76, 0xf9, + 0x40, 0x77, 0x1, 0x77, 0xf8, 0xb, 0x3, 0x77, 0x79, 0x15, 0xf8, 0x2a, + 0xf9, 0x40, 0x5, 0x5f, 0x6, 0xfc, 0x2b, 0xfd, 0x40, 0x5, 0xe, 0x84, + 0xa7, 0xf9, 0x7, 0xa7, 0x1, 0xab, 0xda, 0xf7, 0xc7, 0xda, 0x3, 0xf7, + 0x3, 0xf7, 0x30, 0x15, 0xec, 0xd3, 0xf8, 0x1f, 0xf7, 0x29, 0xe1, 0x8b, + 0x25, 0x6d, 0xfb, 0x43, 0x35, 0xfb, 0xd4, 0xfb, 0x1a, 0x6b, 0x54, 0x9e, + 0xf7, 0x8, 0x1e, 0x3c, 0xbb, 0x15, 0x23, 0xc4, 0x20, 0xf3, 0xf7, 0x3c, + 0xf7, 0x1c, 0xf7, 0x7c, 0xf7, 0x5a, 0xed, 0x70, 0xf7, 0x2f, 0xfb, 0x19, + 0xfb, 0x1f, 0xfb, 0x3a, 0xfb, 0x5e, 0xfb, 0xa2, 0x1e, 0xe, 0xa0, 0x76, + 0xf9, 0x38, 0x77, 0x1, 0xbc, 0xf7, 0xf8, 0x3, 0xbc, 0x16, 0xf7, 0xab, + 0x9a, 0x6, 0x5e, 0x6c, 0x96, 0xaf, 0x8f, 0x8b, 0x8f, 0x8c, 0x90, 0x1f, + 0xf7, 0x2a, 0xf8, 0xc9, 0x5, 0x8e, 0x95, 0x8e, 0x98, 0x92, 0x1a, 0x8f, + 0x8a, 0x8d, 0x88, 0x83, 0xfb, 0x1f, 0x6d, 0x83, 0x5c, 0x1e, 0x7c, 0x7, + 0x8c, 0xa1, 0x9e, 0x8c, 0x99, 0x1b, 0xa7, 0x97, 0x80, 0x76, 0x83, 0x87, + 0x7d, 0x88, 0x80, 0x1f, 0xfb, 0x1a, 0xfc, 0x76, 0x5, 0x5e, 0x7e, 0x52, + 0x79, 0x5d, 0x1b, 0xe, 0x8b, 0xd7, 0xf8, 0xa3, 0xd4, 0x1, 0xf8, 0x2, + 0xe1, 0x3, 0x97, 0x16, 0xf7, 0xf7, 0x6, 0xbd, 0xf7, 0x18, 0x7a, 0x92, + 0x5, 0x67, 0x7a, 0x71, 0x70, 0x49, 0x1b, 0xfb, 0x48, 0x90, 0x6, 0xf7, + 0x54, 0xf7, 0x54, 0x5, 0xf7, 0x10, 0xf7, 0x10, 0xa4, 0xb8, 0xce, 0x1a, + 0xd6, 0x53, 0xe7, 0x21, 0x72, 0xfb, 0x17, 0x87, 0xfb, 0x30, 0x55, 0x1e, + 0xa0, 0x84, 0x5, 0xa4, 0x99, 0xb1, 0xd0, 0xe5, 0x1b, 0xd8, 0xb9, 0x4f, + 0x4d, 0x6a, 0x87, 0x51, 0xfb, 0x20, 0xfb, 0x29, 0x1f, 0xfb, 0x66, 0xfb, + 0x6d, 0x5, 0xe, 0x84, 0xb1, 0x65, 0xf7, 0x0, 0xf7, 0x98, 0x9b, 0xf7, + 0x95, 0xb5, 0x12, 0xf7, 0xee, 0xdb, 0x5b, 0xe2, 0x13, 0x98, 0xf7, 0x20, + 0xf7, 0xfd, 0x15, 0xec, 0x92, 0xe3, 0x66, 0xfb, 0x20, 0x1a, 0xfb, 0x12, + 0x2d, 0x69, 0x69, 0x6f, 0x76, 0x9c, 0x9c, 0x76, 0x1e, 0x13, 0x74, 0x9d, + 0x76, 0x76, 0x9d, 0x74, 0x1b, 0x66, 0x81, 0x6f, 0x76, 0x5e, 0xc2, 0x7d, + 0xc6, 0x1f, 0x13, 0x34, 0xf7, 0x4d, 0xe6, 0xf7, 0x22, 0xf7, 0x3, 0xf7, + 0x2, 0x46, 0xa9, 0x71, 0x97, 0x1f, 0x8e, 0x7, 0xf4, 0xb2, 0xbd, 0xae, + 0xd7, 0x1a, 0xde, 0x43, 0xb5, 0x41, 0x52, 0x40, 0x5f, 0x4f, 0x72, 0x1e, + 0x9b, 0x86, 0x5, 0x9f, 0x9a, 0xae, 0xba, 0xca, 0x1b, 0xb1, 0xbc, 0x73, + 0x48, 0xfb, 0x0, 0xfb, 0x1f, 0x5f, 0x27, 0x7d, 0x1f, 0xe, 0xa0, 0x76, + 0xf7, 0x3c, 0xca, 0xf8, 0x51, 0x77, 0x12, 0x8c, 0xf8, 0x72, 0x17, 0xcc, + 0xf7, 0x7b, 0x15, 0x8f, 0x7, 0xf7, 0xc4, 0xf7, 0xdc, 0x5, 0x8f, 0x6, + 0x13, 0xf0, 0x28, 0xfb, 0xe0, 0x5, 0xfb, 0xa5, 0x4c, 0x15, 0xf7, 0x97, + 0x6, 0x5d, 0xfb, 0x3c, 0x5, 0xda, 0x6, 0xb6, 0xf7, 0x3a, 0x5, 0xef, + 0x6, 0x99, 0xcc, 0x5, 0x2c, 0x6, 0x13, 0x30, 0xf7, 0x10, 0xf8, 0x51, + 0x5, 0x62, 0x6, 0xfc, 0x35, 0xfc, 0x4d, 0x5, 0xe, 0x84, 0xb5, 0xf8, + 0xc4, 0xd2, 0x1, 0xf7, 0xf2, 0xd0, 0x3, 0xf7, 0x17, 0xf8, 0x3b, 0x15, + 0xf7, 0x8, 0x72, 0xf2, 0x7f, 0xfb, 0x2d, 0x1a, 0x34, 0x42, 0xfb, 0x3, + 0x29, 0x6f, 0x77, 0x9a, 0x99, 0x78, 0x1e, 0x98, 0x79, 0x7a, 0x98, 0x75, + 0x1b, 0x78, 0x76, 0x7f, 0x6e, 0x6f, 0xa9, 0x6f, 0xd3, 0xf7, 0x57, 0xf6, + 0xf7, 0x2e, 0xf7, 0x14, 0xf7, 0x1a, 0x31, 0xc9, 0xfb, 0x16, 0xa5, 0x1f, + 0xb2, 0xed, 0x5, 0xf7, 0x7a, 0x6, 0xa2, 0xd2, 0x5, 0xfb, 0x94, 0x6, + 0x23, 0xfb, 0x78, 0x5, 0xe, 0x84, 0xa5, 0xf8, 0x11, 0xaf, 0xf7, 0x8e, + 0x77, 0x1, 0xac, 0xd7, 0xf7, 0x9b, 0xe4, 0x3, 0xf7, 0x5b, 0xf8, 0x4a, + 0x15, 0xbd, 0xa3, 0xf7, 0xe, 0xf7, 0x4a, 0xf7, 0x44, 0x1b, 0x8a, 0x9b, + 0x5, 0xfb, 0xc5, 0xfb, 0x4d, 0xfb, 0xa2, 0xfb, 0x62, 0xfb, 0x38, 0xee, + 0x56, 0xdc, 0xf7, 0x3e, 0xdc, 0xf7, 0x3d, 0xf0, 0xf7, 0x22, 0x26, 0xbf, + 0x47, 0x6c, 0x6d, 0x83, 0x7e, 0x6f, 0x1f, 0x2a, 0xfb, 0xab, 0x15, 0x9b, + 0x95, 0xf7, 0x8c, 0xf7, 0x1e, 0xd7, 0xb5, 0x51, 0x39, 0x31, 0x55, 0xfb, + 0x40, 0xfb, 0x6, 0x29, 0x8b, 0xf7, 0x4, 0xa5, 0x1e, 0xe, 0x98, 0x76, + 0xf8, 0xed, 0xd4, 0x1, 0xd6, 0xf8, 0x5c, 0x3, 0xda, 0x83, 0x15, 0xd1, + 0x6, 0xf8, 0x18, 0xf9, 0x2c, 0x85, 0x95, 0x5, 0xfc, 0xb, 0x6, 0x3a, + 0xfb, 0x1c, 0x99, 0x82, 0x5, 0xb3, 0xad, 0xb0, 0xab, 0xd3, 0x1b, 0xf7, + 0x68, 0x6, 0x8d, 0x88, 0x5, 0xe, 0x84, 0xa1, 0xf9, 0x12, 0xa2, 0x12, + 0xa9, 0xcf, 0xb3, 0xd9, 0xf7, 0x2d, 0xd6, 0x78, 0xcf, 0x13, 0xf8, 0xf7, + 0x75, 0xf7, 0xfc, 0x15, 0x73, 0x84, 0xfb, 0x3f, 0x58, 0xfb, 0x25, 0x1a, + 0x6d, 0xa0, 0xfb, 0x1a, 0xf7, 0x47, 0xf7, 0x1a, 0xdb, 0xe1, 0xe1, 0xd9, + 0x63, 0xcb, 0x40, 0xd6, 0x1e, 0x13, 0xf4, 0xc2, 0x9d, 0xf7, 0x1, 0xb1, + 0xec, 0x1a, 0xf7, 0x2, 0xfb, 0x0, 0xaa, 0x49, 0x2d, 0x34, 0x5a, 0x24, + 0x57, 0xa5, 0x5c, 0xc8, 0x4a, 0x1e, 0xa1, 0x7b, 0x15, 0x13, 0xf8, 0xec, + 0x27, 0xa4, 0x6e, 0x4a, 0x1a, 0x2b, 0x3d, 0x64, 0x55, 0x35, 0x56, 0xc7, + 0xda, 0xf7, 0x13, 0xf7, 0xf, 0xc2, 0xa5, 0x93, 0x1e, 0xcb, 0xc2, 0x15, + 0x2c, 0xe1, 0x8b, 0xaa, 0xa5, 0x1a, 0xce, 0xb1, 0xb7, 0xcb, 0x1e, 0x13, + 0xf4, 0xdc, 0xa5, 0x48, 0x5b, 0x38, 0x50, 0x6d, 0x54, 0x71, 0x1f, 0xe, + 0x8f, 0x76, 0xf7, 0x93, 0xb9, 0xf8, 0x2, 0xa5, 0x1, 0xd0, 0xe3, 0xf7, + 0x98, 0xd6, 0x3, 0xa2, 0x8c, 0x15, 0x79, 0x7, 0xf7, 0x2e, 0xf7, 0xcf, + 0xf7, 0x42, 0xf7, 0xbd, 0xf7, 0x28, 0x3b, 0xd5, 0x24, 0xfb, 0x9, 0xfb, + 0xf, 0xfb, 0x10, 0xfb, 0x1d, 0xfb, 0xb, 0xcd, 0x3e, 0xe0, 0xb7, 0xb7, + 0x9e, 0xa5, 0xb3, 0x1f, 0x8f, 0x89, 0x5, 0x51, 0x80, 0xfb, 0x54, 0xfb, + 0x5f, 0xfb, 0x12, 0x1b, 0xf7, 0x1a, 0xf8, 0x2f, 0x15, 0xe8, 0xbb, 0xf7, + 0x25, 0xf7, 0x5, 0xee, 0x8b, 0xfb, 0x0, 0x64, 0x70, 0x7b, 0xfb, 0x4, + 0x72, 0x64, 0x1e, 0x60, 0x6f, 0x53, 0x7a, 0x6c, 0x1b, 0x27, 0x87, 0xf7, + 0x7, 0xab, 0x1f, 0xe, 0x73, 0x80, 0xf7, 0x2, 0xf7, 0x7c, 0xf7, 0x2, + 0x12, 0xbd, 0xf7, 0x2, 0x82, 0xf7, 0x2, 0x13, 0xe0, 0xbd, 0xb7, 0x8a, + 0xa, 0x13, 0xd0, 0xf0, 0xf7, 0xea, 0x8a, 0xa, 0xe, 0x73, 0xf7, 0xdd, + 0xf7, 0x4, 0x12, 0xf7, 0x29, 0xf7, 0x4, 0xfb, 0x3, 0xf7, 0x3, 0x13, + 0xa0, 0xa6, 0xfb, 0x4, 0x15, 0x94, 0x7a, 0x5, 0x13, 0xc0, 0xc8, 0xa, + 0x76, 0x6c, 0x7c, 0x61, 0x73, 0x99, 0x83, 0x98, 0x83, 0x1e, 0x95, 0x84, + 0x95, 0x84, 0x7c, 0x1a, 0x66, 0x54, 0x66, 0x77, 0x7e, 0x1e, 0xf7, 0xe, + 0xf8, 0x85, 0x15, 0x6c, 0xa4, 0x72, 0xaa, 0xaa, 0xa4, 0xa4, 0xaa, 0xaa, + 0x72, 0xa4, 0x6c, 0x6c, 0x72, 0x72, 0x6c, 0x1e, 0xe, 0xf7, 0xd2, 0x98, + 0x76, 0xb9, 0x76, 0xf8, 0x85, 0x77, 0x1, 0xf7, 0x33, 0xf8, 0x59, 0x3, + 0xdf, 0xf7, 0x88, 0x15, 0xf8, 0x90, 0xfb, 0x90, 0x5, 0xb5, 0x7, 0xfc, + 0x4e, 0xf7, 0x6f, 0xf8, 0x4e, 0xf7, 0x6f, 0x5, 0xb5, 0x7, 0xfc, 0x90, + 0xfb, 0x90, 0x5, 0xe, 0xf7, 0xd2, 0xf7, 0xc, 0xce, 0xf7, 0x18, 0xce, + 0x63, 0xb3, 0x12, 0x13, 0xa0, 0xe1, 0xf7, 0xee, 0x15, 0xf8, 0x8c, 0xb3, + 0xfc, 0x8c, 0x6, 0xfb, 0x9e, 0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, 0xb0, + 0xfc, 0x8c, 0x7, 0xe, 0xf7, 0xd2, 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1, + 0xdf, 0x83, 0x15, 0xb5, 0x7, 0xf8, 0x4e, 0xf7, 0x6f, 0xfc, 0x4e, 0xf7, + 0x6f, 0x5, 0xb5, 0x7, 0xf8, 0x90, 0xfb, 0x90, 0x5, 0x79, 0x7, 0xe, + 0x7f, 0xf3, 0xf8, 0xba, 0xa1, 0x12, 0xf7, 0x18, 0xf3, 0x57, 0xcb, 0xf7, + 0x2a, 0xd5, 0x13, 0xd8, 0xf7, 0x5b, 0xf7, 0x44, 0x15, 0x9c, 0x89, 0x5, + 0xd3, 0xdb, 0xd6, 0xb5, 0xac, 0x1e, 0xbf, 0xb4, 0xdd, 0xc1, 0xe3, 0x1a, + 0xd5, 0x54, 0xc0, 0x2b, 0x44, 0x49, 0x64, 0x44, 0x6e, 0xa1, 0x77, 0xa3, + 0x95, 0xac, 0x94, 0xa9, 0x96, 0x85, 0x92, 0x85, 0x92, 0x1e, 0x85, 0x92, + 0x84, 0x92, 0x97, 0x1a, 0xba, 0xcc, 0x8b, 0x90, 0xd4, 0x92, 0x50, 0x72, + 0x44, 0x62, 0x5e, 0x5b, 0x58, 0x1e, 0x57, 0x55, 0x51, 0x34, 0x41, 0x1a, + 0x13, 0xe8, 0x48, 0xfb, 0x1c, 0x15, 0x13, 0xd8, 0x6e, 0xa2, 0x74, 0xa8, + 0x1e, 0x13, 0xe8, 0xa8, 0xa2, 0xa2, 0xa8, 0x1f, 0x13, 0xd8, 0xa8, 0x74, + 0xa2, 0x6e, 0x1e, 0x13, 0xe8, 0x6e, 0x74, 0x74, 0x6e, 0x1f, 0xe, 0xf8, + 0xc7, 0x79, 0xb2, 0xed, 0xac, 0x7d, 0xb6, 0xf7, 0xb3, 0xb7, 0xf7, 0xf, + 0xaa, 0x12, 0xf7, 0xa, 0xde, 0xf7, 0xc, 0xd2, 0xf8, 0xa, 0xb3, 0x13, + 0xbf, 0xf8, 0x1c, 0xf7, 0x9c, 0x15, 0xf7, 0xc, 0xe3, 0xd3, 0xbb, 0x1e, + 0x13, 0xaf, 0xa8, 0x98, 0x75, 0x61, 0x1f, 0x2a, 0x8c, 0x40, 0xfb, 0x6, + 0x61, 0x1b, 0x68, 0x70, 0xa3, 0xc6, 0x1f, 0xf7, 0x21, 0x53, 0x15, 0x7f, + 0x8a, 0xa2, 0x51, 0xcd, 0x1b, 0xf7, 0xa, 0xce, 0xf7, 0x1b, 0xf0, 0xf7, + 0x3b, 0xfb, 0x23, 0xf7, 0x11, 0xfb, 0x4b, 0xfb, 0x58, 0xfb, 0x3a, 0xfb, + 0x24, 0xfb, 0x69, 0xfb, 0x19, 0xf7, 0x5, 0xfb, 0x56, 0xf7, 0x97, 0xd8, + 0xd9, 0xab, 0xa9, 0xca, 0x1f, 0x7f, 0xa8, 0x5, 0x71, 0x52, 0x4d, 0x71, + 0x33, 0x1b, 0xfb, 0x41, 0xfb, 0x7, 0xf7, 0x1c, 0xf7, 0x21, 0xf7, 0x71, + 0xf7, 0x13, 0xf7, 0x8, 0xf7, 0x2c, 0xf7, 0x4a, 0xf3, 0xfb, 0x29, 0xfb, + 0x5, 0x1f, 0x13, 0xdf, 0x35, 0x5b, 0xfb, 0x8, 0x39, 0x5f, 0x90, 0xbb, + 0x9a, 0x8f, 0x1e, 0xcc, 0xf7, 0x9a, 0x5, 0x46, 0x6, 0x81, 0x5c, 0x5, + 0xa2, 0x7e, 0x80, 0xa7, 0x5c, 0x1b, 0xfb, 0x19, 0x4d, 0xfb, 0x3c, 0x45, + 0x1f, 0x13, 0x0, 0xfb, 0x5, 0xcf, 0x81, 0xa6, 0x1e, 0xc5, 0x8a, 0xb8, + 0xc0, 0x97, 0x9c, 0x8, 0xe, 0x5a, 0xa, 0x1, 0x58, 0xf7, 0x4f, 0xf7, + 0x98, 0xf7, 0x3c, 0x3, 0x58, 0x16, 0x9b, 0xa, 0x5d, 0x7e, 0x9e, 0xa5, + 0xa8, 0x91, 0x91, 0xd2, 0xf7, 0x16, 0x1f, 0xf7, 0x70, 0x6, 0xa1, 0xfb, + 0x12, 0x8b, 0x74, 0x8a, 0x1a, 0x63, 0x71, 0x77, 0x57, 0x1e, 0x7b, 0xf7, + 0x8a, 0x9b, 0x7, 0x51, 0x87, 0xa6, 0xc8, 0x80, 0x1f, 0x2a, 0xf8, 0xc8, + 0x5, 0x71, 0x6, 0xfb, 0xd9, 0xfc, 0xb7, 0x5, 0x59, 0x6e, 0x70, 0x54, + 0x65, 0x1b, 0x45, 0xa, 0xe, 0xf7, 0x92, 0x86, 0xa9, 0x72, 0xa9, 0xf7, + 0xc1, 0xab, 0xf7, 0x98, 0xa9, 0x12, 0xf7, 0x51, 0xf0, 0xf7, 0x21, 0xf7, + 0x0, 0x57, 0xf0, 0x13, 0x7c, 0x83, 0x16, 0xf7, 0xae, 0x6, 0xf7, 0x14, + 0xf7, 0x1d, 0xc9, 0xf7, 0x1d, 0xed, 0x45, 0xa9, 0x56, 0xa2, 0x1f, 0x8d, + 0x7, 0x13, 0xba, 0xe9, 0x9e, 0xd9, 0xb6, 0xe5, 0x1a, 0xf7, 0x7, 0x2b, + 0xad, 0x23, 0x1e, 0xfb, 0x96, 0x7b, 0x6, 0xdf, 0x81, 0x51, 0x52, 0x7c, + 0x1f, 0xfb, 0x5, 0xfc, 0x47, 0x7f, 0x5d, 0x67, 0x73, 0x67, 0x8a, 0x19, + 0x13, 0x7c, 0xf7, 0x4a, 0xd0, 0x15, 0x9e, 0xbc, 0xf7, 0x37, 0x9a, 0xcb, + 0x1e, 0xf7, 0x3a, 0xa6, 0x5e, 0x3d, 0x28, 0x52, 0x3c, 0xfb, 0x21, 0x6e, + 0x6d, 0x9c, 0xb1, 0x1f, 0xd5, 0xf7, 0xaa, 0x15, 0xb5, 0xf7, 0x33, 0x5, + 0xeb, 0xa2, 0x83, 0x90, 0xd1, 0x1b, 0x13, 0xba, 0xd6, 0xb0, 0x67, 0x47, + 0xfb, 0x20, 0xfb, 0xd, 0x7b, 0xfb, 0xa, 0x1f, 0xe, 0xf7, 0xca, 0x79, + 0xb8, 0xd4, 0xa, 0x13, 0xb0, 0xf9, 0x20, 0xf8, 0x65, 0x15, 0xb8, 0xa, + 0x7e, 0x74, 0x93, 0x92, 0x6d, 0x1f, 0x13, 0xd0, 0x90, 0x75, 0x70, 0x8f, + 0x6c, 0xd5, 0xa, 0xfb, 0x5c, 0xf7, 0x26, 0x45, 0xf7, 0x8, 0xf7, 0x26, + 0xe4, 0xf4, 0xb7, 0xb0, 0x6f, 0xa, 0xe, 0xf8, 0x1, 0x8b, 0xa9, 0xf8, + 0xe5, 0xa9, 0x12, 0xf8, 0xe1, 0xf7, 0x3, 0x17, 0xb1, 0xa, 0x1f, 0x13, + 0xe0, 0xf4, 0x4d, 0xf7, 0x35, 0xfb, 0x7a, 0x1e, 0xfb, 0xaa, 0x7b, 0x6, + 0xe3, 0x7e, 0x45, 0x59, 0x7d, 0x1f, 0xfb, 0x7, 0xfc, 0x35, 0x5, 0x4d, + 0x7a, 0x70, 0x75, 0x63, 0x1b, 0xf7, 0x5f, 0xf7, 0x30, 0x15, 0xf7, 0x4, + 0xf8, 0x30, 0x5, 0x99, 0x8f, 0x95, 0xa4, 0xc4, 0xb2, 0xa, 0x59, 0x79, + 0x9d, 0xa5, 0xa6, 0x97, 0xaf, 0x95, 0xae, 0x1f, 0xe, 0xf7, 0x92, 0x8b, + 0xac, 0xf7, 0xb9, 0xac, 0x6c, 0xe9, 0xa, 0x12, 0x8a, 0xf9, 0xf, 0x13, + 0xd8, 0x8b, 0xa, 0x74, 0x62, 0x92, 0xb4, 0x90, 0x8b, 0x96, 0x8d, 0x92, + 0x1f, 0x13, 0xb8, 0x8e, 0x96, 0x85, 0x79, 0xcb, 0xf7, 0x7b, 0x8, 0xf7, + 0x37, 0x8b, 0x7d, 0x63, 0x40, 0xa, 0x85, 0x80, 0xfb, 0x35, 0x1b, 0xb7, + 0xf7, 0x37, 0x5, 0xce, 0x9d, 0x81, 0xa8, 0xe9, 0x1b, 0xf7, 0x3e, 0x9a, + 0x6f, 0x67, 0x7c, 0x8b, 0x79, 0x89, 0x76, 0x63, 0xa, 0xc2, 0x9c, 0x70, + 0x75, 0x77, 0x87, 0x74, 0x84, 0x74, 0x1f, 0xfb, 0x7, 0xfc, 0x3a, 0x5, + 0x47, 0x79, 0x64, 0x7b, 0x70, 0x1b, 0xe, 0x7d, 0xa, 0xf7, 0xdc, 0xe9, + 0xa, 0x1, 0xf7, 0x64, 0xee, 0x3, 0x93, 0x16, 0xf7, 0x90, 0x9b, 0x6, + 0x49, 0x8a, 0x80, 0xb6, 0x9a, 0xc4, 0xc4, 0xf7, 0x69, 0x18, 0xe3, 0xd1, + 0x95, 0x4f, 0x76, 0x86, 0x74, 0x88, 0x7d, 0x1f, 0x9c, 0x86, 0xd7, 0xf7, + 0x7e, 0x79, 0x90, 0x5, 0x2c, 0x5d, 0x7a, 0x8d, 0xfb, 0x2d, 0x1b, 0xb6, + 0xf7, 0x35, 0x5, 0xe4, 0xa3, 0x8b, 0x94, 0xdb, 0x1b, 0xf7, 0x28, 0xaf, + 0x7e, 0x4c, 0x7d, 0x89, 0x7d, 0x8a, 0x7d, 0x1f, 0xa0, 0x89, 0xab, 0xf7, + 0x2d, 0x5, 0xfc, 0x86, 0x7b, 0x6, 0xc2, 0x9b, 0x75, 0x6d, 0x78, 0x87, + 0x74, 0x85, 0x76, 0x1f, 0xfb, 0x1, 0xfc, 0x2a, 0x75, 0x3a, 0x87, 0x84, + 0x4a, 0x7f, 0x19, 0xe, 0xb6, 0xa, 0xb0, 0xf8, 0xf9, 0xad, 0x1, 0xbf, + 0xf7, 0x2, 0x3, 0xf8, 0x5c, 0xf7, 0xc3, 0x15, 0xb9, 0xa0, 0x71, 0x69, + 0x85, 0x8b, 0x84, 0x8a, 0x84, 0x1f, 0x88, 0x7b, 0x76, 0xfb, 0x17, 0x6e, + 0x74, 0x8, 0x74, 0x6e, 0x72, 0x80, 0x58, 0x1b, 0xfb, 0x3e, 0x6b, 0xf7, + 0x10, 0xd9, 0xf7, 0x38, 0xed, 0xf7, 0x8b, 0xf7, 0x5d, 0xd2, 0xf7, 0x1, + 0x6a, 0xfb, 0x17, 0x1f, 0x9d, 0x88, 0xbc, 0xf7, 0x59, 0x7c, 0x8f, 0x5, + 0x7d, 0x81, 0x7d, 0x77, 0x64, 0x1b, 0x7c, 0x70, 0x96, 0x95, 0x67, 0x1f, + 0x92, 0x70, 0x6b, 0x91, 0x67, 0x1b, 0xfb, 0x6a, 0xfb, 0x53, 0xfb, 0x59, + 0xfb, 0x79, 0x60, 0xa8, 0xfb, 0x6b, 0xf7, 0x9c, 0xd4, 0xe9, 0xa1, 0xb3, + 0xcb, 0x1f, 0xb8, 0xf7, 0x45, 0x5, 0xcb, 0x9c, 0xaa, 0x9d, 0xc0, 0x1b, + 0x9b, 0xfb, 0x9e, 0x7, 0xe, 0xf8, 0x1, 0xa0, 0x76, 0xf7, 0xb9, 0xb5, + 0xf7, 0xd2, 0x77, 0x12, 0x83, 0xf7, 0x8a, 0xfb, 0x8a, 0xf9, 0x9b, 0xfb, + 0x8b, 0xf7, 0x8b, 0x13, 0xf4, 0x83, 0x16, 0xf7, 0x8a, 0x9b, 0x6, 0x68, + 0x6d, 0x9a, 0xb1, 0x92, 0x8c, 0x92, 0x8d, 0x94, 0x1f, 0x13, 0xe8, 0xc7, + 0xf7, 0x7e, 0x5, 0xf7, 0xb1, 0x6, 0x50, 0xfb, 0x76, 0x5, 0x4b, 0x79, + 0x55, 0x77, 0x68, 0x1b, 0xe6, 0xa, 0x64, 0x6b, 0x9b, 0xb4, 0x92, 0x8c, + 0x93, 0x8d, 0x93, 0x1f, 0xf7, 0x3, 0xf8, 0x3c, 0x5, 0xf7, 0x7, 0xa9, + 0xaa, 0x8d, 0xae, 0x1b, 0x93, 0xa, 0xbb, 0x9b, 0x73, 0x6c, 0x78, 0x87, + 0x76, 0x85, 0x77, 0x1f, 0x62, 0xfb, 0x2e, 0x5, 0xfb, 0xb1, 0x6, 0xb5, + 0xf7, 0x2e, 0x5, 0xf7, 0x5, 0xaa, 0xbf, 0x8d, 0xa9, 0x1b, 0xc4, 0xa, + 0xc1, 0x9d, 0x74, 0x6c, 0x78, 0x86, 0x76, 0x85, 0x76, 0x1f, 0xfb, 0x4, + 0xfc, 0x3a, 0x5, 0x4d, 0x7a, 0x67, 0x75, 0x69, 0x1b, 0xe, 0x73, 0xcb, + 0xa, 0x83, 0xf8, 0x1c, 0x3, 0x83, 0x16, 0xf7, 0x88, 0x9b, 0x6, 0x59, + 0x7d, 0xa4, 0xaa, 0x9e, 0x90, 0xa0, 0x90, 0x9d, 0x1f, 0xf7, 0x1, 0xf8, + 0x1c, 0x5, 0xec, 0xa6, 0xa2, 0x9d, 0xb6, 0x1b, 0x93, 0xa, 0xb9, 0x9d, + 0x76, 0x72, 0x76, 0x88, 0x72, 0x85, 0x74, 0x1f, 0x20, 0xfc, 0x1c, 0x5, + 0x28, 0x70, 0x78, 0x7c, 0x5c, 0x1b, 0xe, 0xe2, 0x79, 0xaa, 0x6c, 0xf7, + 0x22, 0xf8, 0xa5, 0x77, 0x12, 0x85, 0xe8, 0x13, 0xb0, 0xf7, 0x81, 0xf9, + 0x11, 0x15, 0xc3, 0x9d, 0x76, 0x6d, 0x78, 0x86, 0x74, 0x85, 0x75, 0x1f, + 0xfb, 0x15, 0xfc, 0x5b, 0x5, 0x77, 0x85, 0x82, 0x69, 0x69, 0x1b, 0x6a, + 0x88, 0xa1, 0xa2, 0x8c, 0x1f, 0x91, 0x8c, 0x92, 0x91, 0x1a, 0x13, 0x70, + 0xa4, 0x75, 0xa1, 0x71, 0x6e, 0x7a, 0x74, 0x6c, 0x4e, 0xc7, 0x70, 0xc0, + 0xf7, 0x17, 0xb2, 0xf3, 0xf5, 0xa8, 0x1e, 0xea, 0xf7, 0xde, 0x5, 0xd9, + 0xa2, 0x99, 0xb0, 0xc0, 0x1b, 0x9b, 0xfb, 0x92, 0x7, 0xe, 0xf7, 0xca, + 0xa0, 0x76, 0xf7, 0xe6, 0xb0, 0xf7, 0xaa, 0x77, 0x1, 0x92, 0xf9, 0x5f, + 0x3, 0x92, 0x16, 0xf7, 0x8c, 0x9b, 0x6, 0x52, 0x7e, 0x9d, 0xaa, 0x9a, + 0x91, 0x9e, 0x91, 0xa0, 0x1f, 0xc7, 0xf7, 0x6f, 0x93, 0x8a, 0xf7, 0x7, + 0xfb, 0x5a, 0x5, 0x9a, 0x70, 0x9f, 0x6c, 0x73, 0x1a, 0x73, 0x7b, 0x79, + 0x53, 0x1e, 0x7b, 0xf7, 0xa7, 0x9b, 0x7, 0x5d, 0x74, 0x92, 0xbc, 0x6f, + 0x1f, 0xfb, 0x42, 0xf7, 0xc3, 0xf7, 0xc0, 0xf7, 0x76, 0x5, 0x90, 0x92, + 0xb2, 0xaa, 0xa8, 0x1b, 0x9b, 0xfb, 0x72, 0x7b, 0x7, 0xbc, 0x97, 0x83, + 0x7a, 0x72, 0x3f, 0x4b, 0x47, 0x5b, 0x1f, 0xfb, 0x24, 0x26, 0x85, 0x8c, + 0xb7, 0xf7, 0x31, 0x5, 0xe0, 0xa3, 0xa5, 0x9f, 0xc5, 0x1b, 0xc4, 0xa, + 0xc3, 0xa0, 0x7b, 0x70, 0x7a, 0x87, 0x76, 0x84, 0x73, 0x1f, 0xfb, 0x7, + 0xfc, 0x2f, 0x5, 0x38, 0x74, 0x81, 0x75, 0x52, 0x1b, 0xe, 0x6e, 0xa, + 0x58, 0x59, 0x8b, 0xb2, 0x8f, 0x8b, 0x90, 0x8d, 0x91, 0x1f, 0xf7, 0xd, + 0xf8, 0x4f, 0x5, 0xcd, 0x9d, 0xa5, 0xb1, 0xcd, 0x1b, 0xc4, 0xa, 0xc7, + 0x9c, 0x79, 0x6e, 0x7b, 0x86, 0x77, 0x85, 0x75, 0x1f, 0xfb, 0xf, 0xfc, + 0x4e, 0x5, 0x4d, 0x7a, 0x6a, 0x7f, 0x6c, 0x1b, 0xe, 0xf8, 0x70, 0xcb, + 0xa, 0x79, 0xfa, 0xf, 0xfd, 0x61, 0xf7, 0x49, 0xf7, 0x20, 0xf7, 0xa5, + 0x3, 0x79, 0xe4, 0xa, 0x55, 0x7d, 0xa4, 0xab, 0xa1, 0x93, 0xa6, 0x92, + 0xa3, 0x1f, 0xf5, 0xf8, 0x1a, 0x5, 0x8f, 0x6, 0xc7, 0xfc, 0xac, 0x5, + 0x9c, 0x6, 0xf8, 0x8, 0xf8, 0xbd, 0x5, 0x8e, 0x6, 0xfb, 0xc, 0xfc, + 0x45, 0x5, 0x57, 0x7d, 0x86, 0x57, 0x32, 0x1b, 0xe6, 0xa, 0x4d, 0x7a, + 0x9d, 0xa6, 0x9c, 0x92, 0x9f, 0x91, 0xa1, 0x1f, 0xf7, 0xf, 0xf8, 0x4f, + 0x5, 0xca, 0x9c, 0xa8, 0x96, 0xaf, 0x1b, 0x9b, 0xfb, 0x3b, 0x7, 0xfb, + 0xe1, 0xfc, 0x7d, 0x5, 0x88, 0x6, 0x54, 0xf8, 0x7d, 0x5, 0xfb, 0x49, + 0x7b, 0x6, 0xc2, 0x9e, 0x79, 0x76, 0x82, 0x80, 0x6c, 0x80, 0x63, 0x1f, + 0x21, 0xfc, 0x8, 0x5, 0xfb, 0x8, 0x6a, 0x6b, 0x7d, 0x6a, 0x1b, 0xe, + 0xf7, 0xca, 0x91, 0x76, 0xaf, 0x76, 0xf7, 0x32, 0x77, 0xf8, 0x97, 0x77, + 0x12, 0xf7, 0x5a, 0xaa, 0x13, 0x78, 0x77, 0xe4, 0xa, 0x54, 0x7b, 0xa1, + 0xaa, 0xa9, 0x9a, 0xb0, 0x93, 0xaa, 0x1f, 0xee, 0xf7, 0xfe, 0x5, 0x8f, + 0x6, 0x13, 0xb8, 0xf7, 0x78, 0xfc, 0xb4, 0x5, 0x9d, 0x6, 0xf7, 0x24, + 0xf8, 0x8b, 0x5, 0xf7, 0xd, 0xae, 0xa0, 0xa7, 0xbb, 0x1b, 0xeb, 0xa, + 0x7b, 0x7, 0xc3, 0x9a, 0x77, 0x6d, 0x79, 0x7c, 0x5e, 0x81, 0x67, 0x1f, + 0x33, 0xfb, 0xde, 0x5, 0x88, 0x6, 0xfb, 0x62, 0xf8, 0x83, 0x5, 0xfb, + 0x35, 0x7b, 0x6, 0xb4, 0xa7, 0x78, 0x66, 0x9c, 0x1f, 0xfb, 0xb, 0xfc, + 0x35, 0x5, 0xfb, 0x16, 0x66, 0x75, 0x79, 0x5f, 0x1b, 0xe, 0xbf, 0xa, + 0x90, 0xa, 0xc7, 0xf7, 0x73, 0x15, 0xfb, 0x52, 0xf7, 0x1f, 0x58, 0xe0, + 0xf7, 0x74, 0xf7, 0x53, 0xf7, 0x86, 0xf7, 0x5d, 0xf7, 0x3c, 0x24, 0xd4, + 0xfb, 0xc, 0xfb, 0x47, 0xfb, 0x81, 0xfb, 0x72, 0xfb, 0x71, 0x1e, 0xf4, + 0x5d, 0x15, 0xf7, 0x16, 0xf7, 0x1, 0xf7, 0xda, 0xf7, 0x5a, 0xea, 0xa6, + 0x47, 0x30, 0xfb, 0xe, 0x30, 0xfb, 0xe5, 0xfb, 0x5f, 0xfb, 0x16, 0x86, + 0xf7, 0x1f, 0xa2, 0x1e, 0xe, 0x7d, 0xa, 0xf7, 0xc5, 0xaf, 0xf7, 0xae, + 0xa9, 0x1, 0xf8, 0x8a, 0xf2, 0x3, 0x8b, 0x4, 0xf7, 0x89, 0x9b, 0x6, + 0x59, 0x7d, 0x9d, 0xaa, 0x9d, 0x91, 0xa1, 0x92, 0xa4, 0x1f, 0xbb, 0xf7, + 0x4b, 0x5, 0x86, 0xa1, 0x99, 0x88, 0xd1, 0x1b, 0xf7, 0x5c, 0xc4, 0xf7, + 0xe, 0xd5, 0xf7, 0x2b, 0xfb, 0x3b, 0x8c, 0x5f, 0x1f, 0xfb, 0x8c, 0x7b, + 0x6, 0xc0, 0x9c, 0x79, 0x70, 0x76, 0x83, 0x6f, 0x83, 0x6f, 0x1f, 0x22, + 0xfc, 0x14, 0x5, 0x4b, 0x79, 0x7e, 0x58, 0x4b, 0x1b, 0xf7, 0x8f, 0xf7, + 0xdf, 0xd8, 0xa, 0x9b, 0xa9, 0x1b, 0xf7, 0x2, 0xa9, 0x61, 0x41, 0xfb, + 0x1f, 0x28, 0x70, 0x3a, 0x70, 0x72, 0x8e, 0x8e, 0x78, 0x1f, 0xe, 0xf8, + 0x1, 0xfb, 0x4a, 0xcf, 0x73, 0xf7, 0x2f, 0x6a, 0xac, 0xf8, 0xfc, 0xac, + 0x12, 0x86, 0xa, 0x13, 0x5c, 0xc6, 0xfb, 0x2e, 0x15, 0x95, 0x7c, 0x5, + 0xa4, 0xb2, 0xac, 0x91, 0xaa, 0x1b, 0xad, 0xac, 0x7e, 0x80, 0xb2, 0x1f, + 0x13, 0xbc, 0x81, 0xae, 0xb3, 0x81, 0xbc, 0x1b, 0xba, 0xf7, 0x28, 0xa5, + 0xf6, 0xd2, 0x1f, 0x7c, 0x96, 0x5, 0x62, 0x63, 0x4f, 0x68, 0x26, 0x1b, + 0x75, 0x72, 0x91, 0x92, 0x6f, 0x1f, 0x13, 0x3c, 0x5a, 0x98, 0x53, 0x9c, + 0x55, 0x89, 0xc8, 0xc4, 0x18, 0xae, 0xa, 0xf7, 0x82, 0x4f, 0xa, 0xfb, + 0x66, 0xfb, 0x71, 0xfb, 0x35, 0xeb, 0x44, 0xdb, 0x7c, 0x1f, 0x2a, 0x36, + 0x82, 0x85, 0x44, 0x58, 0x8, 0xf5, 0xf7, 0xeb, 0x15, 0xf7, 0x16, 0xef, + 0xf7, 0xce, 0xf7, 0x5a, 0xea, 0xaf, 0x45, 0x30, 0xfb, 0xe, 0x2b, 0xfb, + 0xe1, 0xfb, 0x5f, 0xfb, 0x16, 0x8b, 0xf7, 0x29, 0xa2, 0x1e, 0xe, 0x7d, + 0xa, 0xf7, 0xe1, 0xa7, 0xf7, 0x9a, 0xa9, 0x1, 0xf8, 0x77, 0xf4, 0x3, + 0x7e, 0x16, 0xf7, 0x88, 0x9b, 0x6, 0x5b, 0x78, 0x98, 0xaa, 0x9a, 0x8f, + 0xa0, 0x92, 0xa3, 0x1f, 0xc3, 0xf7, 0x65, 0xcc, 0x86, 0xf7, 0xf, 0xfb, + 0xd8, 0x5, 0xf7, 0x28, 0x9b, 0x6, 0x57, 0x74, 0xbb, 0xae, 0x7e, 0x1f, + 0x33, 0xf7, 0x7e, 0x5, 0xc1, 0xf7, 0x23, 0xc4, 0xf7, 0xb, 0xf7, 0x24, + 0xfb, 0x40, 0x8b, 0x67, 0x1f, 0xfb, 0x8c, 0x7b, 0x6, 0xbe, 0x9f, 0x7b, + 0x72, 0x79, 0x85, 0x74, 0x85, 0x74, 0x1f, 0xfb, 0x7, 0xfc, 0x30, 0x5, + 0x4c, 0x79, 0x80, 0x62, 0x4f, 0x1b, 0xf7, 0x94, 0xf7, 0xf2, 0x15, 0xcc, + 0xf7, 0x79, 0x5, 0x9d, 0x92, 0x8f, 0x95, 0xb8, 0x1b, 0xc4, 0xc9, 0x74, + 0x35, 0x40, 0x66, 0x3d, 0xfb, 0x24, 0x70, 0x83, 0x8c, 0x8f, 0x73, 0x1f, + 0xe, 0x79, 0xae, 0x76, 0xae, 0x72, 0x76, 0xf9, 0x1c, 0xac, 0x8c, 0x77, + 0x12, 0x13, 0x30, 0xb9, 0xa, 0x9c, 0x84, 0x83, 0x9f, 0x1f, 0x13, 0x90, + 0x81, 0xa4, 0xa8, 0x80, 0xb1, 0x6d, 0xa, 0x13, 0x48, 0xb3, 0xf7, 0x5b, + 0x5, 0x74, 0x6, 0x79, 0x7f, 0x78, 0x83, 0x74, 0x1b, 0x73, 0x7b, 0x94, + 0x92, 0x72, 0x1f, 0x13, 0x90, 0x90, 0x7b, 0x77, 0x8f, 0x70, 0x64, 0xa, + 0xe, 0xf7, 0x5b, 0xa0, 0x76, 0xf8, 0xfe, 0xae, 0x1, 0xcc, 0x16, 0xf7, + 0xb6, 0x9b, 0x6, 0x49, 0x77, 0x9e, 0xac, 0x9c, 0x91, 0xa0, 0x92, 0xa3, + 0x1f, 0xf7, 0x1a, 0xf8, 0x7c, 0x5, 0xf7, 0x12, 0xac, 0x85, 0x3c, 0x7f, + 0x8a, 0x7d, 0x89, 0x7c, 0x1f, 0x9c, 0x89, 0xb7, 0xf7, 0x37, 0x5, 0xfc, + 0xa8, 0x6, 0x61, 0xfb, 0x2e, 0x9d, 0x87, 0x5, 0xf7, 0xf, 0xc5, 0xbd, + 0x8b, 0xf7, 0x16, 0x1b, 0xfb, 0x17, 0xfc, 0x7c, 0x5, 0x49, 0x79, 0x60, + 0x5b, 0x51, 0x1b, 0xe, 0xaa, 0xa, 0x77, 0x1, 0xf1, 0xe5, 0xf8, 0xa, + 0xf7, 0x5b, 0x3, 0xf7, 0x13, 0xf9, 0x11, 0x15, 0xbe, 0xa2, 0x7b, 0x67, + 0x1f, 0x59, 0x28, 0xfb, 0xaf, 0x7c, 0xa, 0xf7, 0x3d, 0xc5, 0xf7, 0x0, + 0xf7, 0x29, 0xb7, 0x1e, 0xee, 0xf7, 0xe3, 0x5, 0x9d, 0x90, 0xa7, 0xb8, + 0xba, 0x1b, 0xeb, 0xa, 0x7b, 0x7, 0xae, 0xaa, 0x7a, 0x5f, 0x79, 0x3d, + 0xfb, 0xb2, 0x83, 0x6c, 0x1f, 0x26, 0x6f, 0x56, 0xfb, 0x9, 0xfb, 0x1a, + 0x1b, 0x4b, 0x40, 0xab, 0xe4, 0xc1, 0xef, 0xf7, 0xea, 0x9a, 0xb8, 0x1f, + 0xaf, 0x97, 0xb0, 0x9b, 0xb7, 0x1b, 0xd2, 0xa, 0xe, 0xf7, 0x92, 0x8e, + 0x76, 0xf9, 0x33, 0x77, 0x1, 0xd7, 0xf8, 0xf8, 0x3, 0xf7, 0x84, 0x79, + 0x15, 0x9e, 0x6, 0xf7, 0xca, 0xf8, 0x94, 0x5, 0x95, 0x91, 0xca, 0xf7, + 0x19, 0xbd, 0x1b, 0x9b, 0xfb, 0x4e, 0x7b, 0x7, 0xb4, 0x9c, 0x75, 0x79, + 0x69, 0x6e, 0x5b, 0x7d, 0x73, 0x1f, 0xfb, 0x62, 0xfb, 0xf8, 0x5, 0x86, + 0x6, 0x4e, 0xf7, 0xfb, 0x5, 0x87, 0xa1, 0x85, 0xa6, 0xa3, 0x1a, 0xb1, + 0x9c, 0xab, 0xcc, 0x1e, 0x9b, 0xfb, 0x85, 0x7b, 0x7, 0xbc, 0x8e, 0x75, + 0xfb, 0xf, 0x9f, 0x1f, 0xe, 0xf8, 0x70, 0x8e, 0x76, 0xf9, 0x33, 0x77, + 0x1, 0xd2, 0xf9, 0xd7, 0x3, 0xf7, 0x68, 0x79, 0x15, 0x9e, 0x6, 0xf7, + 0x72, 0xf8, 0x5a, 0x5, 0x90, 0x6, 0xbd, 0xfc, 0x5a, 0x5, 0x9f, 0x6, + 0xf7, 0xc0, 0xf8, 0xd1, 0x5, 0xbf, 0xa6, 0xa9, 0xa9, 0xa0, 0x1b, 0x9b, + 0xfb, 0x4d, 0x7b, 0x7, 0xbe, 0x99, 0x73, 0x75, 0x79, 0x84, 0x7a, 0x89, + 0x87, 0x1f, 0xfb, 0x58, 0xfc, 0x15, 0x5, 0x88, 0x6, 0x5c, 0xf8, 0x24, + 0x5, 0x8f, 0x8b, 0x90, 0x8f, 0x1a, 0xaa, 0xb2, 0xa5, 0xae, 0x1e, 0x9b, + 0xfb, 0x82, 0x7b, 0x7, 0xc7, 0x97, 0x74, 0x5e, 0x90, 0x1f, 0x92, 0x50, + 0xfb, 0x3e, 0xfb, 0xeb, 0x5, 0x88, 0x6, 0x87, 0xa9, 0x61, 0xf7, 0xfd, + 0x5, 0x8a, 0x93, 0x8b, 0x92, 0x91, 0x1a, 0xb4, 0xb8, 0x9c, 0xaa, 0x1e, + 0x9b, 0xfb, 0x80, 0x7b, 0x7, 0xc1, 0x98, 0x5f, 0x69, 0x8f, 0x1f, 0xe, + 0xf7, 0x92, 0xcb, 0xa, 0x6e, 0xf9, 0x40, 0x3, 0x6e, 0x16, 0xf7, 0x6a, + 0x9b, 0x6, 0x61, 0x75, 0x9a, 0xa0, 0x98, 0x91, 0x9a, 0x99, 0x9c, 0x1f, + 0xf7, 0x2b, 0xf7, 0x40, 0xd3, 0xfb, 0x47, 0x5, 0x8f, 0x81, 0x8d, 0x81, + 0x82, 0x1a, 0x73, 0x79, 0x76, 0x51, 0x1e, 0xe6, 0xa, 0x60, 0x67, 0x95, + 0xcb, 0x72, 0x1f, 0x25, 0xf7, 0x96, 0xf7, 0x4d, 0xf7, 0x68, 0x5, 0xbe, + 0xb8, 0xc0, 0xa5, 0x96, 0x1b, 0x9b, 0xfb, 0x64, 0x7b, 0x7, 0xb4, 0x9e, + 0x7d, 0x78, 0x7e, 0x85, 0x7b, 0x7e, 0x7c, 0x1f, 0xfb, 0x25, 0xfb, 0x3b, + 0x50, 0xf7, 0x27, 0x5, 0x82, 0xa0, 0x86, 0x9e, 0x9b, 0x1a, 0xa4, 0xa1, + 0x9b, 0xbb, 0x1e, 0x9b, 0xfb, 0x9c, 0x7b, 0x7, 0xc2, 0xa2, 0x76, 0x3f, + 0xa9, 0x1f, 0xe5, 0xfb, 0x77, 0xfb, 0x32, 0xfb, 0x4c, 0x7d, 0x7c, 0x7a, + 0x7a, 0x19, 0x53, 0x53, 0x62, 0x72, 0x7a, 0x1b, 0xe, 0xf7, 0x5b, 0xcb, + 0xa, 0xcf, 0xa, 0x58, 0x6d, 0x99, 0xb3, 0x94, 0x8c, 0x95, 0x8e, 0x97, + 0x1f, 0xc1, 0xf7, 0x61, 0xf7, 0x6f, 0xf7, 0xa2, 0x5, 0xb3, 0xab, 0xa9, + 0xa0, 0x93, 0x1b, 0xe8, 0xa, 0xaa, 0xa7, 0x7d, 0x72, 0x83, 0x89, 0x83, + 0x87, 0x81, 0x1f, 0x7a, 0x64, 0xfb, 0x2, 0xfb, 0x16, 0x5e, 0x53, 0x73, + 0xe7, 0x6a, 0xf5, 0x85, 0xa5, 0x8, 0x89, 0x92, 0x8b, 0x90, 0x91, 0x1a, + 0xaa, 0xaf, 0x9c, 0xad, 0xcd, 0xa, 0xaf, 0xa3, 0x82, 0x52, 0x9b, 0x1f, + 0xd8, 0xfb, 0xa1, 0x52, 0xfb, 0x5e, 0x5, 0x49, 0x78, 0x55, 0x79, 0x67, + 0x1b, 0xe, 0xf7, 0x5b, 0x8b, 0xaf, 0xf8, 0xd9, 0xaf, 0x50, 0xa, 0xe, + 0xe1, 0xa, 0xa0, 0xf8, 0x6, 0x3, 0xa0, 0xfb, 0x2d, 0x15, 0xf7, 0x50, + 0x6, 0x92, 0xa6, 0x5, 0x5d, 0x6, 0x6b, 0x68, 0x92, 0xb5, 0x97, 0x1f, + 0xf7, 0x34, 0xf9, 0x3a, 0x5, 0xa6, 0x91, 0xa3, 0x93, 0xa6, 0x1b, 0xbf, + 0x6, 0x92, 0xa6, 0x5, 0xfb, 0x41, 0x6, 0xe, 0x3c, 0xfb, 0x13, 0x76, + 0xf7, 0x20, 0x76, 0xf9, 0x4b, 0x77, 0x1, 0x54, 0xf8, 0xb, 0x3, 0xf7, + 0x6b, 0xfb, 0x28, 0x15, 0xad, 0x6, 0xfb, 0x41, 0xf9, 0xc2, 0x5, 0x66, + 0x6, 0xe, 0xe1, 0xa, 0x97, 0xf8, 0x6, 0x3, 0x9e, 0xfb, 0x12, 0x15, + 0x84, 0x70, 0x5, 0xf7, 0x41, 0x6, 0xf7, 0x59, 0xf9, 0xc4, 0x5, 0xfb, + 0x51, 0x6, 0x84, 0x70, 0x5, 0xba, 0x6, 0xaa, 0xad, 0x86, 0x60, 0x81, + 0x1f, 0xfb, 0x35, 0xfd, 0x3a, 0x5, 0x79, 0x87, 0x7d, 0x79, 0x65, 0x1b, + 0xe, 0xcc, 0xf9, 0x2e, 0x77, 0xa2, 0x76, 0x12, 0xf7, 0x49, 0xf7, 0x41, + 0x13, 0x60, 0xf7, 0xc1, 0x4, 0x13, 0xa0, 0xcf, 0x6, 0xf7, 0x23, 0xf7, + 0xb2, 0xf7, 0x23, 0xfb, 0xb2, 0x5, 0xcf, 0x6, 0xfb, 0x49, 0xf8, 0x1, + 0x5, 0x4f, 0x6, 0xe, 0xfb, 0x11, 0xbd, 0x1, 0x94, 0x40, 0x15, 0x82, + 0x59, 0x5, 0xf8, 0x80, 0x6, 0x93, 0xbd, 0x5, 0xe, 0x73, 0xf8, 0x95, + 0x76, 0xf7, 0x40, 0x77, 0x1, 0xf7, 0xac, 0xf8, 0x80, 0xb7, 0xa, 0xfb, + 0x3, 0xf7, 0x22, 0xc5, 0xa, 0x79, 0x92, 0x56, 0xa, 0x9e, 0x7a, 0x80, + 0xa, 0x80, 0xbc, 0xf8, 0x11, 0xa1, 0x12, 0x9c, 0xdf, 0xf7, 0x58, 0xd4, + 0x8b, 0x99, 0x17, 0xf7, 0xd2, 0xf7, 0x1f, 0x61, 0xa, 0x70, 0xb5, 0xb6, + 0xad, 0xb0, 0xd5, 0xc7, 0x1e, 0x13, 0xf8, 0x38, 0xa, 0x45, 0x8a, 0x7a, + 0x4f, 0x5, 0x89, 0x6, 0xa7, 0x6d, 0xaf, 0x5f, 0xa, 0x36, 0xa, 0xa8, + 0xa1, 0x6e, 0x5b, 0x29, 0x2f, 0xfb, 0x62, 0x21, 0x70, 0x6a, 0x9d, 0xc0, + 0x1e, 0xe, 0x80, 0xa2, 0x7f, 0xa2, 0xf8, 0x5, 0xbc, 0x91, 0xbc, 0xf7, + 0x4f, 0x77, 0x12, 0xa2, 0xe1, 0xf7, 0xab, 0xe0, 0x13, 0x7e, 0xf7, 0x1, + 0xb8, 0x15, 0xf4, 0xeb, 0xf7, 0x86, 0xf7, 0x2, 0xca, 0x95, 0x55, 0x6c, + 0x1e, 0x13, 0xbe, 0x37, 0x2c, 0xfb, 0x67, 0xfb, 0x1d, 0x5c, 0x8b, 0xa5, + 0x92, 0x1e, 0x8c, 0xf8, 0xea, 0x15, 0xb8, 0x9c, 0x7e, 0x76, 0x7b, 0x85, + 0x75, 0x84, 0x73, 0x1f, 0xfb, 0x1c, 0xfc, 0x89, 0x5, 0x87, 0x7, 0x75, + 0xd8, 0x6c, 0xc0, 0xf7, 0x2d, 0xf7, 0x3b, 0xf7, 0x41, 0xf7, 0x32, 0xd4, + 0x5a, 0xbb, 0x45, 0x31, 0x50, 0x38, 0x57, 0x6a, 0x1e, 0x89, 0x8c, 0xad, + 0xf7, 0x5, 0xb5, 0xf7, 0x44, 0xa1, 0xdd, 0x19, 0x86, 0x90, 0x57, 0x81, + 0x58, 0x84, 0x59, 0x85, 0x19, 0xe, 0xe2, 0x80, 0xaf, 0xf8, 0x1f, 0xa0, + 0x1, 0xa9, 0xe1, 0xf7, 0x72, 0xe2, 0x3, 0xf7, 0xf2, 0xf5, 0x15, 0x63, + 0x67, 0x5c, 0x62, 0x4f, 0x1b, 0x4e, 0x6d, 0xb8, 0xd8, 0xeb, 0xd0, 0xdb, + 0xa, 0x84, 0x89, 0x85, 0x88, 0x84, 0x1f, 0x87, 0x80, 0x85, 0x7f, 0x7b, + 0xa3, 0xa, 0xfb, 0x1e, 0xfb, 0x2d, 0xfb, 0x21, 0xfb, 0x19, 0xde, 0x72, + 0xcc, 0xf4, 0xc5, 0xd6, 0xab, 0xa4, 0x1e, 0xe, 0x7f, 0xbb, 0x6f, 0x76, + 0xf8, 0x8a, 0xa2, 0xd3, 0x77, 0x12, 0x9a, 0xe2, 0x13, 0xb8, 0xf1, 0xf7, + 0x3, 0x15, 0xe6, 0xea, 0xf7, 0x69, 0xf7, 0x4, 0xba, 0x8b, 0x62, 0x74, + 0xfb, 0x10, 0x29, 0xfb, 0x53, 0x2c, 0x4e, 0x8b, 0xc5, 0x9c, 0x1e, 0xf7, + 0x59, 0x8e, 0x15, 0x83, 0x68, 0x87, 0x74, 0x74, 0x1a, 0x13, 0x78, 0x76, + 0x93, 0x72, 0xb2, 0xac, 0xcc, 0xba, 0xce, 0xb6, 0x1e, 0x7f, 0x95, 0x5, + 0x5b, 0x61, 0x77, 0x74, 0x77, 0x1b, 0x81, 0x83, 0x92, 0x9a, 0x9b, 0xf7, + 0xd, 0xf8, 0x3e, 0xb6, 0xf7, 0x42, 0x1f, 0x86, 0x90, 0x58, 0x80, 0x58, + 0x84, 0x58, 0x86, 0x19, 0x7a, 0x7, 0xb3, 0x9a, 0x7c, 0x72, 0x79, 0x85, + 0x74, 0x84, 0x72, 0x1f, 0x65, 0xfb, 0x29, 0x89, 0x89, 0x5, 0xa1, 0x87, + 0x84, 0xa9, 0x53, 0x1b, 0x13, 0x38, 0xfb, 0xb, 0xfb, 0x3e, 0xfb, 0x48, + 0xfb, 0x2b, 0x1f, 0x13, 0xb8, 0x57, 0xa0, 0x48, 0xde, 0xbd, 0xc3, 0x9d, + 0xf7, 0x2, 0xd3, 0x1e, 0xe, 0xe2, 0x80, 0xb8, 0xf8, 0x14, 0xa2, 0x12, + 0xaa, 0xe2, 0xf7, 0x78, 0xcd, 0x17, 0xf7, 0x17, 0xf7, 0x5a, 0x15, 0xa0, + 0xc1, 0x5, 0xe5, 0xae, 0xd1, 0xd7, 0xc1, 0x1b, 0xa4, 0x95, 0x6e, 0x76, + 0x83, 0x82, 0xfb, 0xc, 0xfb, 0x62, 0x61, 0x1f, 0x84, 0x75, 0x15, 0xf7, + 0x52, 0xa0, 0xed, 0xe2, 0xda, 0x1a, 0xb7, 0x6c, 0xad, 0x58, 0x1e, 0x13, + 0xa0, 0xfb, 0x21, 0xfb, 0x32, 0x5c, 0xa, 0x1f, 0x73, 0xa, 0x61, 0x57, + 0xa2, 0xcf, 0x9f, 0x8c, 0x95, 0x90, 0xa0, 0x1f, 0xe, 0x3c, 0xfb, 0x63, + 0xa0, 0xf8, 0xd0, 0xab, 0xf7, 0x82, 0xa1, 0x12, 0xf7, 0xed, 0xda, 0x13, + 0xe0, 0xa9, 0xf8, 0x16, 0x15, 0xe5, 0x6, 0x38, 0xfc, 0x2e, 0x5, 0x63, + 0x83, 0x71, 0xfb, 0xe, 0x4b, 0x1b, 0x7f, 0x84, 0x93, 0x93, 0x8f, 0x8c, + 0x8e, 0x8d, 0x8e, 0x1f, 0x8e, 0x8f, 0x8e, 0x8f, 0x95, 0x1a, 0xa4, 0x71, + 0x97, 0x7d, 0x68, 0x8a, 0x63, 0x88, 0x1e, 0x13, 0xf0, 0x65, 0xb7, 0x76, + 0xad, 0xf7, 0x9, 0xc4, 0xf7, 0x35, 0xf7, 0xe, 0xa6, 0x1e, 0xce, 0xf7, + 0xca, 0x5, 0xf7, 0x1, 0x6, 0x91, 0xab, 0x5, 0xfb, 0x0, 0x6, 0xbe, + 0x94, 0xae, 0xf7, 0x4f, 0xdd, 0x1b, 0x98, 0x95, 0x87, 0x83, 0x86, 0x89, + 0x88, 0x89, 0x88, 0x1f, 0x88, 0x87, 0x88, 0x85, 0x7f, 0x1a, 0x80, 0x91, + 0x70, 0xab, 0xa2, 0x9d, 0x9f, 0x9f, 0x9f, 0x7b, 0xb8, 0x43, 0xfb, 0x12, + 0x54, 0xfb, 0x43, 0x36, 0x71, 0x1e, 0x2f, 0x6, 0xe, 0xfb, 0x52, 0xa1, + 0xf7, 0xd3, 0xa0, 0xf7, 0x8b, 0xa1, 0x12, 0x93, 0xcc, 0xa2, 0xd9, 0xf7, + 0x2b, 0xc7, 0x6a, 0xda, 0x13, 0xfc, 0xf7, 0x11, 0xb2, 0x15, 0x37, 0x54, + 0x6a, 0x75, 0x52, 0x1a, 0x54, 0xc0, 0x53, 0xf7, 0x1, 0xf7, 0x1d, 0xd9, + 0xc8, 0xe0, 0xc6, 0x64, 0xaa, 0x5f, 0x9f, 0x1e, 0x4f, 0xa6, 0x45, 0x93, + 0xa9, 0x1a, 0x98, 0xa1, 0xa6, 0x99, 0x1e, 0x98, 0x99, 0x87, 0x98, 0x1b, + 0x13, 0xfa, 0xe3, 0xea, 0xdd, 0xd5, 0x9f, 0x88, 0x9f, 0x85, 0x9e, 0x1f, + 0xbd, 0x6, 0x13, 0xa8, 0xb2, 0x4e, 0x7, 0x7c, 0x60, 0xaf, 0x50, 0x1b, + 0x39, 0xfb, 0x8, 0x51, 0xfb, 0x4, 0x46, 0xb6, 0x73, 0xaf, 0x7b, 0x1f, + 0x69, 0x74, 0x60, 0x6e, 0x6c, 0x1a, 0x78, 0x9a, 0x7f, 0x97, 0x82, 0x1e, + 0xa1, 0x80, 0x15, 0x92, 0x8e, 0xed, 0x63, 0x9d, 0x82, 0x8, 0x13, 0xfc, + 0x9e, 0x82, 0xaf, 0x7a, 0x5e, 0x1a, 0x59, 0x5a, 0x5e, 0x31, 0x7c, 0x2a, + 0x9a, 0xdd, 0x8a, 0x1e, 0xb1, 0x99, 0xbf, 0xc7, 0xa4, 0x1e, 0xa6, 0xf7, + 0x72, 0x15, 0x13, 0xa0, 0xce, 0xb7, 0xf1, 0xd8, 0x1e, 0x13, 0xfa, 0xb5, + 0x9a, 0x6e, 0x64, 0x38, 0x59, 0x2b, 0x49, 0x5e, 0x7a, 0xac, 0xb8, 0x1f, + 0xe, 0xbe, 0xa, 0xf7, 0x86, 0x77, 0x12, 0xf8, 0x6, 0xd9, 0x13, 0x70, + 0x9e, 0x16, 0xd6, 0x6, 0xac, 0xf7, 0x12, 0x99, 0xc2, 0xb9, 0xcf, 0x8, + 0xa7, 0x9e, 0xe0, 0xf7, 0x5, 0xbd, 0x1b, 0x9b, 0x98, 0x81, 0x7a, 0x1f, + 0x7e, 0x39, 0xfb, 0xb3, 0x71, 0x1a, 0x13, 0xb0, 0x70, 0x98, 0x78, 0xab, + 0xcd, 0xb6, 0xc9, 0xbf, 0xaf, 0x1e, 0x13, 0x10, 0x7e, 0x97, 0x5, 0x5b, + 0x65, 0x73, 0x6c, 0x77, 0x1b, 0x83, 0x83, 0x92, 0x97, 0x1f, 0x13, 0x38, + 0xa0, 0xdc, 0xf7, 0x94, 0xae, 0x1a, 0xcc, 0x5d, 0x92, 0x75, 0x31, 0x25, + 0xfb, 0x2e, 0x59, 0x6c, 0x1e, 0x89, 0x8d, 0xf7, 0xa, 0xf8, 0x4b, 0x86, + 0x90, 0x57, 0x7f, 0x56, 0x82, 0x57, 0x85, 0x19, 0x7b, 0x7, 0xb7, 0x9c, + 0x94, 0x4f, 0x81, 0x7a, 0x51, 0x83, 0x6d, 0x1f, 0xe, 0xd7, 0xa, 0xf8, + 0xc4, 0xf4, 0x12, 0xbc, 0xd6, 0xb0, 0xf2, 0x17, 0xf7, 0x72, 0xf7, 0x6, + 0x4a, 0xa, 0xe7, 0xf7, 0xe4, 0x1f, 0x88, 0x8d, 0x5, 0x84, 0x64, 0x32, + 0x79, 0x6b, 0x1b, 0x13, 0xf0, 0x7b, 0x7, 0xc2, 0x8f, 0x7c, 0x76, 0x1f, + 0x6f, 0x40, 0x4b, 0xa, 0x41, 0xf8, 0x86, 0x15, 0x6e, 0xa0, 0x85, 0xa, + 0x76, 0x73, 0x6e, 0x1e, 0xe, 0x3c, 0xfb, 0x63, 0xa2, 0x74, 0xf2, 0xf9, + 0x24, 0xf1, 0x12, 0xfb, 0x10, 0xdc, 0xf7, 0x6d, 0xf1, 0x13, 0xb8, 0xd4, + 0xf8, 0x24, 0x15, 0xc7, 0x8c, 0x99, 0x8c, 0x61, 0x1a, 0x33, 0xfb, 0xff, + 0x5, 0x3e, 0x78, 0x72, 0x23, 0x58, 0x1b, 0x82, 0x80, 0x8c, 0x95, 0x91, + 0x8e, 0x8e, 0x8e, 0x8f, 0x1f, 0x8e, 0x8f, 0x8f, 0x90, 0x96, 0x1a, 0x13, + 0x78, 0xa0, 0x77, 0x9a, 0x77, 0x66, 0x87, 0x68, 0x87, 0x5a, 0xb8, 0x7c, + 0xac, 0xe4, 0xc5, 0xd6, 0xf7, 0x34, 0xb4, 0x1e, 0xf3, 0xf8, 0x2f, 0x88, + 0x8d, 0x5, 0x84, 0x64, 0x2b, 0x79, 0x68, 0x1b, 0xf0, 0xf7, 0x4f, 0x15, + 0x6f, 0xa2, 0x74, 0xa7, 0xa7, 0xa2, 0xa2, 0xa7, 0xa7, 0x74, 0xa2, 0x6f, + 0x6f, 0x74, 0x74, 0x6f, 0x1e, 0xe, 0xe2, 0x95, 0x76, 0xab, 0x76, 0xf9, + 0x24, 0x77, 0xba, 0x77, 0x12, 0x99, 0xf8, 0x53, 0x13, 0x70, 0x99, 0x16, + 0xd6, 0x6, 0xbb, 0xf7, 0x48, 0xb5, 0xab, 0x95, 0x6d, 0xb1, 0x33, 0x97, + 0x74, 0x19, 0x13, 0xb0, 0x50, 0xa9, 0x9d, 0x74, 0xaa, 0x1b, 0xb7, 0xa8, + 0xb0, 0xd3, 0xb1, 0x1f, 0x7c, 0x96, 0x5, 0x59, 0x6e, 0x81, 0x79, 0x75, + 0x1b, 0x71, 0x78, 0xb9, 0xf7, 0x3f, 0x43, 0x1f, 0xf7, 0xe, 0xf7, 0x1e, + 0xb5, 0xab, 0xb8, 0x1b, 0x13, 0x38, 0x9b, 0xfb, 0x4b, 0x7b, 0x7, 0xa6, + 0xa7, 0x8b, 0x78, 0x6c, 0xfb, 0x14, 0x2b, 0x54, 0x60, 0x1f, 0x89, 0x8d, + 0xf7, 0xb, 0xf8, 0x59, 0x86, 0x90, 0x5, 0x7f, 0x57, 0x36, 0x7c, 0x78, + 0x1b, 0x13, 0x0, 0x7b, 0x7, 0xa5, 0xb2, 0x82, 0x71, 0x7c, 0x73, 0x3a, + 0x82, 0x67, 0x1f, 0xe, 0x3c, 0x8f, 0x76, 0xf9, 0x35, 0x77, 0xba, 0x77, + 0x12, 0xb4, 0xd8, 0x17, 0xf7, 0x78, 0xd3, 0xa, 0x7c, 0x8b, 0x99, 0x91, + 0x96, 0x93, 0xa6, 0x8d, 0x94, 0x1f, 0xf7, 0x2b, 0xf8, 0xd7, 0x86, 0x90, + 0x5, 0x7f, 0x57, 0x3d, 0x7c, 0x71, 0x1b, 0x13, 0x90, 0x7b, 0x7, 0xa5, + 0xb1, 0x82, 0x71, 0x1f, 0x76, 0xfb, 0x21, 0xfc, 0x94, 0x76, 0xb5, 0xa, + 0xf8, 0x1, 0x97, 0x76, 0xa9, 0x76, 0xf8, 0x19, 0xbf, 0x12, 0x13, 0x60, + 0x97, 0x16, 0xd6, 0x6, 0xb0, 0xf7, 0xe, 0x9f, 0xcd, 0xb3, 0xc7, 0x8, + 0xb3, 0xa6, 0xd7, 0xf0, 0xb8, 0x1b, 0x94, 0x98, 0x8b, 0x70, 0x78, 0x46, + 0xfb, 0x8a, 0x71, 0x2a, 0x1f, 0xd6, 0x6, 0xa8, 0xf7, 0x5, 0x9c, 0xca, + 0xbb, 0xd7, 0x8, 0xbc, 0xaa, 0xd3, 0xe3, 0xb4, 0x1b, 0x97, 0x94, 0x83, + 0x7c, 0x1f, 0x77, 0x3d, 0xfb, 0xab, 0x70, 0x1a, 0x13, 0xa0, 0x7d, 0x8b, + 0x68, 0xb5, 0xc3, 0xbd, 0xc3, 0xc5, 0xb4, 0x1e, 0x7c, 0x97, 0x5, 0x5c, + 0x65, 0x71, 0x6b, 0x78, 0x1b, 0x7f, 0x88, 0x8e, 0x9c, 0x1f, 0x99, 0xdc, + 0xf7, 0xa0, 0xad, 0x1a, 0xb3, 0x74, 0xa6, 0x67, 0x49, 0x3a, 0x33, 0xfb, + 0x8, 0x45, 0x1e, 0x89, 0x8d, 0x5, 0x99, 0xb3, 0xa2, 0xde, 0x99, 0x1a, + 0xb5, 0x76, 0xa2, 0x65, 0x37, 0x24, 0xfb, 0x2f, 0x5a, 0x6d, 0x1e, 0x89, + 0x8d, 0xc3, 0xf7, 0x5a, 0x88, 0x8f, 0x56, 0x80, 0x56, 0x81, 0x55, 0x81, + 0x19, 0x13, 0x0, 0x7b, 0x7, 0xbc, 0x96, 0x75, 0x75, 0x1f, 0x13, 0x60, + 0x75, 0x3d, 0xfb, 0x9a, 0x7b, 0x49, 0x1e, 0xe, 0xbe, 0xa, 0x12, 0xf7, + 0xfd, 0xdc, 0x13, 0x70, 0x89, 0xa, 0x13, 0x90, 0xc3, 0xa, 0x13, 0xb0, + 0x51, 0xa, 0x13, 0x0, 0x7b, 0x7, 0xc1, 0x93, 0x76, 0x7c, 0x1f, 0x13, + 0x70, 0x76, 0x4a, 0xfb, 0x74, 0x6c, 0xfb, 0x5, 0x1e, 0xe, 0x80, 0xa0, + 0xf8, 0x2e, 0xa0, 0x92, 0xa, 0xa6, 0xf7, 0x1b, 0x15, 0x38, 0xba, 0x4c, + 0xf5, 0xf7, 0x2d, 0xf7, 0x1b, 0xf7, 0x47, 0xf7, 0xf, 0xcd, 0x6a, 0xdf, + 0xfb, 0x8, 0xfb, 0x26, 0xfb, 0x26, 0xfb, 0x33, 0xfb, 0x27, 0x1e, 0xdf, + 0x6d, 0x15, 0xf7, 0xa, 0xe4, 0xf7, 0x59, 0xf7, 0x4, 0xbb, 0xa3, 0x5d, + 0x57, 0x20, 0x3e, 0xfb, 0x61, 0xfb, 0x6, 0x59, 0x6b, 0xb1, 0xc4, 0x1e, + 0xe, 0xfb, 0x48, 0x76, 0xf7, 0x67, 0x76, 0xf8, 0x2d, 0xb6, 0x48, 0xa, + 0x73, 0x1f, 0x89, 0x8d, 0xa6, 0xe8, 0x5, 0x96, 0x8e, 0x88, 0x8d, 0x88, + 0x1b, 0xfb, 0x2f, 0x75, 0x5, 0x13, 0x80, 0x8d, 0x7b, 0x5, 0xb9, 0x9e, + 0x81, 0x79, 0x76, 0x29, 0xfb, 0xfe, 0x70, 0xfb, 0x4, 0x1f, 0x6b, 0x83, + 0x81, 0xda, 0xa, 0x61, 0x75, 0x8b, 0xd1, 0x94, 0x1f, 0x8e, 0x9f, 0x9b, + 0xd3, 0x94, 0xad, 0x8, 0xe, 0xfb, 0x50, 0x76, 0xf7, 0x5a, 0xc0, 0xf8, + 0xd, 0xa1, 0x1, 0xa4, 0xe1, 0xf7, 0xa1, 0x99, 0x3, 0xf7, 0x2a, 0xfb, + 0x55, 0x15, 0x7b, 0xf7, 0x85, 0x9d, 0x7, 0x6e, 0x5c, 0x9a, 0xb5, 0x97, + 0x1f, 0xf7, 0x30, 0xf8, 0xc4, 0x5, 0x42, 0x6, 0x7d, 0x5f, 0x5, 0x89, + 0x6, 0xa5, 0x85, 0x7b, 0xac, 0x53, 0x1b, 0xfb, 0x16, 0xfb, 0x35, 0xfb, + 0x52, 0xfb, 0x1d, 0x47, 0xa5, 0x52, 0xd8, 0xe4, 0xc5, 0xdc, 0xd8, 0xc0, + 0x1f, 0x8d, 0x89, 0x3b, 0xfb, 0xa7, 0x5, 0x5e, 0x7d, 0x6c, 0x79, 0x54, + 0x1b, 0x64, 0xf7, 0xc9, 0x15, 0xf7, 0x8, 0xf7, 0x8, 0xf7, 0x4f, 0xe8, + 0xaa, 0xa8, 0x76, 0x5e, 0x29, 0xfb, 0x0, 0xfb, 0x69, 0x22, 0x68, 0x76, + 0xaa, 0xb6, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf8, 0x4d, 0x77, 0x1, 0xb8, + 0xf8, 0x3, 0x3, 0xb8, 0x16, 0xd7, 0x6, 0xb4, 0xf7, 0x19, 0x99, 0xb8, + 0xb1, 0xd3, 0x8, 0x9a, 0x93, 0xc7, 0xf7, 0x3, 0xaa, 0x1b, 0x97, 0x8d, + 0x83, 0x82, 0x8f, 0x1f, 0x82, 0x90, 0x92, 0x81, 0xa1, 0x1b, 0x96, 0xaf, + 0x8b, 0xbf, 0xad, 0x72, 0x9a, 0x74, 0x4c, 0x39, 0xfb, 0x6, 0x46, 0x70, + 0x1f, 0x83, 0x77, 0x89, 0x8d, 0xbc, 0xf7, 0x5b, 0x88, 0x8d, 0x5, 0x84, + 0x5b, 0x2f, 0x77, 0x7c, 0x1b, 0x7a, 0x7, 0x8d, 0x96, 0x96, 0x8e, 0x96, + 0x1b, 0xa3, 0x94, 0x7a, 0x73, 0x73, 0x83, 0x6d, 0x84, 0x72, 0x1f, 0xe, + 0xab, 0x80, 0xa0, 0x89, 0x76, 0xf8, 0x43, 0xa2, 0x8c, 0x77, 0x12, 0xf7, + 0x1, 0xd4, 0xb9, 0xd7, 0x13, 0x6c, 0xc2, 0xa, 0x9a, 0x9a, 0x86, 0x86, + 0x9a, 0x1f, 0x13, 0xac, 0x86, 0x9a, 0x99, 0x87, 0x9a, 0x1b, 0xc3, 0xe8, + 0xa4, 0xf7, 0x1, 0xb3, 0x70, 0xb5, 0x6e, 0xb2, 0x1f, 0x6b, 0xb6, 0x69, + 0xb3, 0xac, 0x1a, 0xbc, 0xab, 0x94, 0xa1, 0xcc, 0xa8, 0x49, 0x5a, 0x1e, + 0x9b, 0x6, 0x13, 0x9c, 0xbb, 0xa, 0x7d, 0x82, 0x8e, 0x8f, 0x80, 0x1f, + 0x13, 0xac, 0x90, 0x7e, 0x7d, 0x90, 0x73, 0x1b, 0x21, 0x7d, 0x3b, 0x6c, + 0x65, 0xa8, 0x60, 0xa9, 0x61, 0x1f, 0xa9, 0x61, 0xa9, 0x62, 0x6a, 0xb4, + 0xa, 0xe, 0xd7, 0xa, 0xf8, 0x20, 0xab, 0xf7, 0x15, 0x77, 0x1, 0xb0, + 0xf7, 0x97, 0x3, 0xf7, 0x6a, 0xf7, 0x9, 0x15, 0x6b, 0x72, 0x68, 0x5c, + 0x77, 0x1b, 0x86, 0x80, 0x8e, 0x97, 0x97, 0xa6, 0xeb, 0xc7, 0xf7, 0x74, + 0x1f, 0xe1, 0x6, 0x90, 0xab, 0x5, 0x39, 0x6, 0xa9, 0xf7, 0x6, 0x5, + 0x93, 0x8d, 0x89, 0x92, 0x84, 0x1b, 0x82, 0x87, 0x84, 0x86, 0x87, 0x1f, + 0x6f, 0x68, 0x58, 0x53, 0x6b, 0x7a, 0x8, 0x6b, 0x7a, 0x75, 0x91, 0x6d, + 0x1a, 0xd6, 0x6, 0x45, 0xfb, 0x9c, 0x5, 0x87, 0x7b, 0x78, 0x4e, 0x7c, + 0x1a, 0x6d, 0xa7, 0x81, 0x9f, 0xbf, 0xb2, 0xb7, 0xd8, 0xbe, 0x1e, 0xe, + 0x82, 0xbe, 0x6b, 0x76, 0xf8, 0x58, 0xa9, 0xa, 0xd9, 0x13, 0xa0, 0xf7, + 0xe0, 0xf7, 0x77, 0x15, 0x13, 0xb8, 0x4d, 0xa, 0x72, 0xa, 0x80, 0x8a, + 0x96, 0x90, 0x9a, 0x99, 0xb7, 0x90, 0x9f, 0x42, 0xa, 0x84, 0x7c, 0x8f, + 0x9e, 0x97, 0xaa, 0xf7, 0xc, 0xc8, 0xf7, 0x86, 0x1f, 0x88, 0x8d, 0x5, + 0x7f, 0x59, 0x37, 0x7c, 0x7b, 0x1b, 0x13, 0x50, 0x5d, 0xa, 0x13, 0x60, + 0xa6, 0xa, 0xe2, 0x8e, 0x76, 0xf8, 0x5f, 0x77, 0x12, 0xf7, 0x1c, 0xd2, + 0xf7, 0x3c, 0xbe, 0x17, 0xf7, 0x63, 0xd1, 0x15, 0x8a, 0xc9, 0x83, 0xf7, + 0x32, 0x69, 0xf7, 0x17, 0x8, 0x9e, 0x86, 0x8a, 0x8c, 0x81, 0x87, 0xfb, + 0x1, 0x72, 0x7d, 0x1b, 0x7e, 0x7, 0xbc, 0xa2, 0x9e, 0xfb, 0x4, 0xa0, + 0x1f, 0x9b, 0x34, 0x91, 0xfb, 0x4a, 0x6e, 0x1a, 0x7a, 0x8b, 0x7e, 0x94, + 0x1e, 0x13, 0x50, 0x9a, 0x9d, 0x9f, 0xd2, 0xcd, 0x1f, 0xac, 0xae, 0xf7, + 0x29, 0xf7, 0x46, 0xe7, 0x1a, 0xb0, 0x73, 0xa5, 0x6a, 0x77, 0x7b, 0x7d, + 0x7c, 0x73, 0x93, 0x80, 0x94, 0x83, 0x1e, 0x97, 0x80, 0x98, 0x85, 0x75, + 0x1a, 0x59, 0x3b, 0xfb, 0xb, 0x52, 0x50, 0x1e, 0xe, 0xf7, 0xca, 0x8e, + 0x76, 0xf8, 0x5e, 0x77, 0xa0, 0x77, 0x12, 0xf7, 0xd, 0xd2, 0xf7, 0x38, + 0xca, 0xf7, 0x49, 0xbb, 0x13, 0xbc, 0xf7, 0x52, 0xf7, 0x15, 0x15, 0x9d, + 0x84, 0xf7, 0x13, 0x79, 0xf0, 0x1e, 0xc1, 0x81, 0x85, 0x97, 0x85, 0x82, + 0x29, 0x73, 0x77, 0x1b, 0x7d, 0x7, 0xc4, 0x9c, 0x8e, 0x30, 0x94, 0x1f, + 0x90, 0x54, 0x9c, 0x3f, 0xfb, 0x2f, 0x1a, 0x7d, 0x8c, 0x8a, 0x6a, 0x98, + 0x1b, 0x9a, 0x92, 0xa0, 0xf7, 0x40, 0xec, 0x1f, 0xb8, 0xda, 0xa3, 0xb5, + 0x9d, 0xab, 0x8, 0x8d, 0x6, 0xa8, 0xfb, 0xd0, 0x5, 0x7b, 0x8c, 0x8b, + 0x7d, 0x96, 0x1b, 0x96, 0x98, 0x9e, 0xbb, 0xb3, 0x1f, 0xb9, 0xc1, 0xf7, + 0x2f, 0xf7, 0x57, 0xe2, 0x1a, 0xa8, 0x7b, 0xa6, 0x66, 0x6e, 0x82, 0x79, + 0x7a, 0x7a, 0x96, 0x82, 0x96, 0x81, 0x1e, 0x96, 0x81, 0x95, 0x81, 0x79, + 0x1a, 0x57, 0x3e, 0x2a, 0x33, 0xfb, 0x1, 0x1e, 0x6b, 0xf7, 0xfb, 0x5, + 0x13, 0xdc, 0x8d, 0x8a, 0x8b, 0x90, 0x84, 0x1b, 0x85, 0x88, 0x87, 0x86, + 0x88, 0x1f, 0xfb, 0x53, 0xfb, 0xc2, 0x5, 0xe, 0xe2, 0x80, 0xc2, 0xf8, + 0x21, 0x77, 0x1, 0x70, 0xf8, 0x6e, 0x3, 0xf7, 0x62, 0xf7, 0x44, 0x15, + 0xa9, 0xfb, 0xc, 0x5, 0x56, 0x98, 0x9a, 0x7d, 0xa8, 0x1b, 0xa2, 0xa8, + 0x8b, 0xf7, 0x6, 0xd2, 0x1f, 0x7d, 0x93, 0x5, 0x6d, 0x70, 0x77, 0x66, + 0x76, 0x1b, 0x77, 0x84, 0xa4, 0x9b, 0x87, 0x1f, 0x85, 0xa4, 0x69, 0xf7, + 0x1c, 0x9d, 0x1a, 0x8b, 0xcf, 0xf7, 0xd, 0xa8, 0x96, 0x92, 0x87, 0x87, + 0x92, 0x1e, 0x87, 0x93, 0x93, 0x86, 0x97, 0x1b, 0xa3, 0x95, 0x9e, 0x9d, + 0xa3, 0x75, 0x97, 0x78, 0x57, 0x5c, 0x4e, 0x39, 0x57, 0x1f, 0x80, 0xc2, + 0x5, 0xe3, 0x79, 0x7c, 0x8b, 0x75, 0x1b, 0x6b, 0x49, 0x73, 0x82, 0x70, + 0x1f, 0x8f, 0x7c, 0x5, 0x93, 0xab, 0x99, 0x8e, 0x94, 0x1b, 0xa6, 0x97, + 0x73, 0x6c, 0x94, 0x1f, 0x8c, 0x86, 0xa5, 0xfb, 0xf, 0x82, 0x1a, 0xfb, + 0x17, 0x31, 0x71, 0x69, 0x7a, 0x1b, 0x82, 0x82, 0x90, 0x90, 0x81, 0x1f, + 0x90, 0x82, 0x81, 0x8f, 0x80, 0x1b, 0x75, 0x7f, 0x79, 0x7b, 0x73, 0x9b, + 0x78, 0xac, 0xaa, 0x97, 0x96, 0x9e, 0x9c, 0x1f, 0xad, 0xb0, 0xb5, 0xc1, + 0xbb, 0xcd, 0x8, 0xe, 0xe2, 0xfb, 0x4d, 0x76, 0xf9, 0x1b, 0x77, 0x12, + 0xf8, 0x1d, 0xc7, 0xa, 0xcf, 0x7e, 0x5d, 0xf7, 0x11, 0x7e, 0x7e, 0xfb, + 0x12, 0x73, 0x86, 0x1b, 0x13, 0xe0, 0x98, 0xa, 0x9f, 0x4c, 0xe2, 0xa, + 0xae, 0xfb, 0x2f, 0x7a, 0xa, 0x83, 0x85, 0x90, 0x91, 0x83, 0x1f, 0x93, + 0x81, 0x7f, 0x94, 0x7a, 0x96, 0xa, 0x70, 0xa, 0x76, 0x96, 0x83, 0x97, + 0x83, 0x1f, 0x9a, 0x82, 0x9b, 0x84, 0x74, 0xa7, 0xa, 0xe, 0xab, 0x4f, + 0x76, 0xf8, 0x55, 0xc7, 0x1, 0xba, 0xa, 0xb1, 0xb2, 0x71, 0x74, 0xb2, + 0x1f, 0x78, 0xac, 0xad, 0x79, 0xad, 0xaf, 0xa, 0x81, 0x8e, 0x83, 0x8e, + 0x85, 0x1f, 0x8f, 0x83, 0x8f, 0x85, 0x85, 0x1a, 0x7e, 0x7b, 0x88, 0x7f, + 0x81, 0x74, 0x8b, 0xac, 0x75, 0x1e, 0xce, 0x5f, 0x50, 0xac, 0x6b, 0x1b, + 0xf7, 0xb6, 0xf7, 0xec, 0x5, 0xca, 0xa, 0x8e, 0x94, 0xc3, 0xdd, 0x1e, + 0xf7, 0x1c, 0x6, 0xe, 0xdd, 0xa, 0xbe, 0xd6, 0x82, 0xd6, 0x13, 0xe0, + 0xf7, 0x47, 0xfb, 0x3a, 0x15, 0x6b, 0x93, 0x76, 0x9b, 0xb9, 0x1a, 0x13, + 0xd0, 0xb3, 0xcd, 0xf7, 0x61, 0xb4, 0x1a, 0xb3, 0x69, 0x9b, 0x78, 0x93, + 0x1e, 0x8c, 0x8d, 0xcf, 0x9c, 0xa2, 0xb2, 0x9e, 0xd3, 0x19, 0xb8, 0xf7, + 0x3c, 0x5, 0xe6, 0xa3, 0xc0, 0xac, 0xab, 0x1b, 0x8e, 0x96, 0x5, 0x2f, + 0x50, 0x7c, 0xfb, 0xc, 0x69, 0x1f, 0x5a, 0xfb, 0x3e, 0x79, 0x4b, 0x77, + 0x5e, 0x45, 0x79, 0x19, 0xb6, 0x7d, 0x94, 0x78, 0x6d, 0x1a, 0x13, 0xe0, + 0x52, 0x49, 0xfb, 0x49, 0x5a, 0x1a, 0x54, 0xaa, 0x70, 0xe9, 0x1e, 0xe, + 0x39, 0xfb, 0x27, 0x76, 0xf7, 0x3f, 0xe0, 0xa, 0x9a, 0xfb, 0x3c, 0x15, + 0xb6, 0x6, 0xf7, 0x6c, 0xf9, 0xd6, 0x5, 0x62, 0x6, 0xe, 0xdd, 0xa, + 0xf7, 0xa6, 0xd6, 0x42, 0xd6, 0x13, 0xd0, 0x87, 0xfb, 0x3a, 0x15, 0x88, + 0x80, 0x5, 0xe7, 0xc9, 0x9a, 0xf7, 0xc, 0xac, 0x1f, 0xba, 0xf7, 0x3e, + 0x9c, 0xcb, 0xa0, 0xb8, 0xd1, 0x9d, 0x19, 0x60, 0x99, 0x82, 0x9e, 0xa9, + 0x1a, 0x13, 0xe0, 0xc4, 0xcd, 0xf7, 0x49, 0xbc, 0x1a, 0xc2, 0x6c, 0xa6, + 0x2d, 0x1e, 0x88, 0x80, 0x5, 0xa1, 0xaa, 0x73, 0x5d, 0x1f, 0x13, 0xd0, + 0x63, 0x49, 0xfb, 0x61, 0x62, 0x1a, 0x63, 0xad, 0x7b, 0x9e, 0x83, 0x1e, + 0x8a, 0x89, 0x47, 0x7a, 0x74, 0x64, 0x78, 0x43, 0x19, 0x5e, 0xfb, 0x3c, + 0x5, 0x31, 0x73, 0x56, 0x69, 0x6b, 0x1b, 0xe, 0xf7, 0x4c, 0xf7, 0x4f, + 0xcb, 0x5c, 0x76, 0xd3, 0xcb, 0x8f, 0x77, 0x12, 0xb3, 0xf8, 0x62, 0x13, + 0x68, 0xd7, 0xf7, 0x4b, 0x15, 0xae, 0x9b, 0xa3, 0xb0, 0xb7, 0x1b, 0xb9, + 0xa9, 0x7d, 0x7b, 0xa7, 0x1f, 0x13, 0x98, 0x79, 0xac, 0xa9, 0x77, 0xbd, + 0x1b, 0xc9, 0xac, 0xb7, 0xb5, 0xa9, 0x1f, 0x67, 0xbd, 0x5, 0x68, 0x74, + 0x72, 0x66, 0x63, 0x1b, 0x69, 0x6c, 0x99, 0x9b, 0x6c, 0x1f, 0x13, 0x68, + 0x9d, 0x67, 0x66, 0x9f, 0x5f, 0x1b, 0x48, 0x67, 0x5f, 0x61, 0x75, 0x1f, + 0xe, 0xab, 0xfb, 0x4c, 0x76, 0xf8, 0xd0, 0xf5, 0x1, 0xf7, 0x6c, 0xf5, + 0x3, 0xf7, 0x6c, 0xf8, 0x38, 0x15, 0x6e, 0xa3, 0x73, 0xa8, 0xa8, 0xa3, + 0xa3, 0xa8, 0xa8, 0x73, 0xa3, 0x6e, 0x6e, 0x73, 0x73, 0x6e, 0x1e, 0x94, + 0xfb, 0x1a, 0x15, 0x51, 0xfb, 0x32, 0x58, 0xfb, 0xa, 0x5f, 0xfb, 0x10, + 0x8, 0x84, 0x78, 0x85, 0x7d, 0x7c, 0x1a, 0x75, 0x9e, 0x76, 0x9d, 0xb5, + 0x95, 0x9c, 0xc0, 0x96, 0x1e, 0xa5, 0xf7, 0x10, 0xa2, 0xf7, 0x18, 0xad, + 0xf7, 0x35, 0x8, 0xe, 0x81, 0xae, 0x80, 0x76, 0xf8, 0x3c, 0xa2, 0x12, + 0xd8, 0xe1, 0x13, 0xb0, 0xf7, 0x1d, 0xfb, 0x23, 0xb7, 0xa, 0xba, 0xf7, + 0x19, 0x5, 0xf7, 0x16, 0xb5, 0xdb, 0xa5, 0xa5, 0x1f, 0x7b, 0x95, 0x5, + 0x64, 0x69, 0x57, 0x61, 0x57, 0x1b, 0x13, 0x70, 0x81, 0x80, 0x8c, 0x8e, + 0x81, 0x1f, 0xf7, 0x1d, 0xf8, 0x1b, 0x5, 0x9c, 0x9d, 0x85, 0x7d, 0x82, + 0x87, 0x82, 0x87, 0x81, 0x1f, 0x88, 0x82, 0x87, 0x81, 0x7f, 0x97, 0xa, + 0xa9, 0x74, 0xbd, 0x3e, 0x1e, 0xb5, 0xf7, 0xc, 0x5, 0x6d, 0x6, 0x61, + 0xfb, 0xc, 0x5, 0x13, 0x50, 0xfb, 0x12, 0xfb, 0x1f, 0xfb, 0x32, 0xfb, + 0x1b, 0x1f, 0x13, 0x70, 0xfb, 0x6, 0xd3, 0x63, 0xaf, 0x1e, 0x9c, 0xbb, + 0x15, 0x71, 0x9e, 0x7e, 0xaf, 0xbe, 0x1a, 0xf2, 0xe2, 0xf7, 0x3b, 0xdf, + 0x1e, 0xe, 0x7b, 0xa1, 0x7f, 0xd3, 0xa9, 0xa7, 0xf7, 0x61, 0xb5, 0xf7, + 0xa2, 0xa8, 0x12, 0x13, 0xb8, 0xf7, 0x34, 0xf7, 0x7, 0x15, 0x96, 0x63, + 0x8b, 0x8b, 0x76, 0x1b, 0x49, 0x74, 0x5f, 0x79, 0x59, 0xa7, 0x77, 0xb2, + 0xb7, 0xa7, 0xaf, 0xa6, 0xa1, 0x1f, 0x4e, 0xd6, 0xb3, 0x89, 0xaa, 0x1b, + 0xf3, 0xad, 0xe5, 0x92, 0x8d, 0x1f, 0x80, 0x94, 0x5, 0x13, 0x78, 0x70, + 0x66, 0x66, 0x84, 0x68, 0x1b, 0x56, 0x55, 0x9d, 0x9f, 0x6a, 0x1f, 0xb8, + 0xec, 0x91, 0xa4, 0xa4, 0xf2, 0x8, 0xf7, 0x12, 0x6, 0x92, 0xb5, 0x5, + 0xfb, 0xf, 0x6, 0x9d, 0xed, 0x96, 0xc9, 0xa3, 0xc2, 0x8, 0xa1, 0x95, + 0x9b, 0xac, 0xb4, 0x1b, 0xa2, 0x97, 0x7e, 0x6c, 0x8f, 0x1f, 0x6d, 0x8e, + 0x93, 0x7d, 0xa4, 0x1b, 0x9e, 0x9f, 0x93, 0xad, 0xb1, 0x6b, 0xb0, 0x50, + 0xfb, 0x3e, 0x56, 0xfb, 0x76, 0x42, 0x82, 0x1f, 0xfb, 0x2, 0x6, 0x82, + 0x61, 0x5, 0xf7, 0x5, 0x6, 0x61, 0xfb, 0x94, 0x15, 0x13, 0xb8, 0x6c, + 0x83, 0x67, 0x71, 0x73, 0x1b, 0x69, 0x7f, 0xa0, 0x9b, 0x90, 0x8e, 0xb3, + 0xbd, 0xa5, 0x99, 0x81, 0x7c, 0xa0, 0x1f, 0xe, 0xf7, 0x18, 0xc4, 0xf7, + 0xa4, 0xc4, 0x1, 0xc4, 0xc8, 0xf7, 0x9c, 0xc8, 0x3, 0xf7, 0xa, 0xf7, + 0xda, 0x15, 0xd3, 0xc4, 0xca, 0xd7, 0xd6, 0xc3, 0x4c, 0x43, 0x41, 0x53, + 0x4c, 0x40, 0x3f, 0x52, 0xca, 0xd5, 0x1e, 0x47, 0xfb, 0x8a, 0x15, 0xe2, + 0xe3, 0x5, 0x73, 0xa5, 0xb9, 0x7f, 0xb7, 0x1b, 0xb6, 0xb5, 0x97, 0xa3, + 0xa4, 0x1f, 0xe4, 0x33, 0xb6, 0xb8, 0x34, 0xe2, 0x5, 0xa2, 0xa6, 0x97, + 0xb6, 0xb6, 0x1a, 0xb6, 0x80, 0xb6, 0x73, 0xa6, 0x1e, 0xe2, 0xe4, 0x60, + 0xb6, 0x32, 0x34, 0x5, 0xa3, 0x71, 0x5f, 0x96, 0x60, 0x1b, 0x60, 0x5f, + 0x7f, 0x74, 0x71, 0x1f, 0x34, 0xe2, 0x5e, 0x60, 0xe3, 0x32, 0x5, 0x73, + 0x71, 0x7f, 0x5f, 0x5f, 0x1a, 0x60, 0x97, 0x60, 0xa3, 0x71, 0x1e, 0x33, + 0x34, 0x5, 0xe, 0xa0, 0x76, 0xf7, 0x4a, 0xb3, 0xe5, 0xb3, 0xf7, 0xc1, + 0x77, 0x1, 0xbf, 0x16, 0xf7, 0xb1, 0x9b, 0x6, 0x53, 0x6a, 0xa0, 0xb7, + 0x91, 0x8c, 0x91, 0x8d, 0x91, 0x1f, 0x92, 0xa7, 0x8f, 0x96, 0x99, 0xb7, + 0x8, 0xf7, 0x48, 0x6, 0x97, 0xb3, 0x5, 0xfb, 0x48, 0x6, 0xa3, 0xdd, + 0x91, 0x93, 0x5, 0xf7, 0x3e, 0x6, 0x97, 0xb3, 0x5, 0xfb, 0x2b, 0x6, + 0xf7, 0x32, 0xf7, 0x74, 0x5, 0xb3, 0xab, 0xaa, 0xa0, 0x95, 0x1b, 0xe8, + 0xa, 0xa8, 0xab, 0x7c, 0x74, 0x84, 0x89, 0x83, 0x87, 0x83, 0x1f, 0x77, + 0x64, 0x35, 0xfb, 0x1a, 0x5c, 0x53, 0x72, 0xe7, 0x61, 0xf5, 0x86, 0xa5, + 0x8, 0x89, 0x95, 0x8a, 0x94, 0x93, 0x1a, 0xaa, 0x9f, 0x93, 0xbf, 0xcd, + 0xa, 0xa3, 0xb7, 0x8d, 0x47, 0x9f, 0x1f, 0xd4, 0xfb, 0x6f, 0x5, 0xfb, + 0x20, 0x6, 0x7f, 0x63, 0x5, 0xf7, 0x37, 0x6, 0x8e, 0x81, 0x74, 0x3b, + 0x5, 0xfb, 0x38, 0x6, 0x7f, 0x63, 0x5, 0xf7, 0x39, 0x6, 0x73, 0x39, + 0x5, 0x48, 0x77, 0x50, 0x7a, 0x6a, 0x1b, 0xe, 0x39, 0x8e, 0xe0, 0xa, + 0xf7, 0x36, 0xf8, 0x1c, 0x15, 0xb3, 0x6, 0xdd, 0xf7, 0xa6, 0x5, 0x65, + 0x6, 0xfb, 0x5d, 0xfd, 0x40, 0x15, 0xb5, 0x6, 0xd5, 0xf7, 0x93, 0x5, + 0x5e, 0x6, 0xe, 0xfb, 0x29, 0xa0, 0xf7, 0x78, 0xa0, 0xf7, 0x9f, 0xa0, + 0xe8, 0xf7, 0x38, 0x7c, 0xa0, 0x12, 0xc0, 0xf2, 0x49, 0xc4, 0xb0, 0xc8, + 0xb5, 0xc5, 0xab, 0xc5, 0x13, 0xed, 0xc0, 0xf7, 0xae, 0xf3, 0x15, 0x8d, + 0x8e, 0x5, 0x86, 0x96, 0x90, 0x89, 0xa0, 0x1b, 0xcf, 0xb9, 0xc2, 0xd1, + 0xc5, 0x70, 0xb3, 0x7d, 0x9c, 0x1f, 0xfb, 0xf, 0xf7, 0x2a, 0x5, 0x7c, + 0x9e, 0x80, 0xa3, 0xa7, 0x1a, 0xca, 0xba, 0xa0, 0xbb, 0xac, 0xa3, 0x7c, + 0x7b, 0x81, 0x80, 0x82, 0x82, 0x7f, 0x1e, 0x83, 0x81, 0x85, 0x80, 0x7b, + 0x1a, 0x13, 0xf3, 0xc0, 0x79, 0x98, 0x71, 0xac, 0xb6, 0x94, 0xb7, 0xa0, + 0xc0, 0x5c, 0xb9, 0x38, 0x41, 0x42, 0x61, 0x37, 0x5e, 0xa3, 0x60, 0xb6, + 0x58, 0x1e, 0x89, 0x88, 0x5, 0x95, 0x76, 0x70, 0x8c, 0x86, 0x1b, 0x55, + 0x57, 0x5a, 0x3d, 0x60, 0xa4, 0x56, 0xb9, 0x56, 0x1f, 0xd7, 0x34, 0x5, + 0xb6, 0x5a, 0x92, 0x76, 0x6f, 0x1a, 0x5a, 0x66, 0x63, 0x47, 0x67, 0x6b, + 0x9e, 0x9c, 0x95, 0x95, 0x92, 0x95, 0x94, 0x1e, 0x13, 0xed, 0xc0, 0x96, + 0x95, 0x96, 0x97, 0xa4, 0x1a, 0xad, 0x73, 0x95, 0x75, 0x52, 0x8b, 0x51, + 0x80, 0x5c, 0xba, 0x51, 0xe7, 0xd5, 0xda, 0xbe, 0xdf, 0xbe, 0x76, 0xa5, + 0x61, 0xc1, 0x1e, 0x13, 0xeb, 0xc0, 0xfb, 0x1b, 0xf7, 0x6e, 0x15, 0xb5, + 0xae, 0xa3, 0xa9, 0xa9, 0xa6, 0x80, 0x4a, 0xbe, 0x1e, 0xbf, 0x49, 0x90, + 0x6e, 0x71, 0x1a, 0x58, 0x5f, 0x78, 0x75, 0x52, 0x20, 0xf7, 0x17, 0xd1, + 0x1e, 0xe, 0x73, 0xf8, 0x90, 0xed, 0x1, 0xf6, 0xc6, 0xa, 0x3, 0xf6, + 0xf8, 0xc1, 0x23, 0xa, 0xf8, 0x27, 0x79, 0xb5, 0xf7, 0x4, 0x9f, 0xf7, + 0xef, 0x9f, 0xf0, 0xb5, 0x1, 0xb4, 0xc2, 0xea, 0xd8, 0xf7, 0x89, 0x9b, + 0xf7, 0x1b, 0xc2, 0x3, 0xb4, 0xf7, 0xd7, 0x15, 0xfb, 0x51, 0xf7, 0x29, + 0xfb, 0x2c, 0xf7, 0x54, 0xf7, 0x52, 0xf7, 0x27, 0xf7, 0x2c, 0xf7, 0x51, + 0xf7, 0x51, 0xfb, 0x27, 0xf7, 0x2e, 0xfb, 0x52, 0xfb, 0x54, 0xfb, 0x29, + 0xfb, 0x2e, 0xfb, 0x51, 0x1e, 0xc2, 0x16, 0xf7, 0x33, 0xf7, 0x11, 0xf7, + 0x22, 0xf7, 0x35, 0xf7, 0x32, 0xf7, 0x10, 0xfb, 0x21, 0xfb, 0x34, 0xfb, + 0x33, 0xfb, 0x11, 0xfb, 0x20, 0xfb, 0x31, 0xfb, 0x34, 0xfb, 0x12, 0xf7, + 0x20, 0xf7, 0x33, 0x1e, 0xf8, 0x47, 0x42, 0x15, 0x5e, 0x78, 0x66, 0x5a, + 0x49, 0x1b, 0x26, 0x62, 0xd7, 0xf3, 0x8c, 0x1f, 0xeb, 0x8c, 0xb5, 0xd2, + 0xe8, 0x1b, 0xd8, 0xa6, 0x5d, 0x61, 0x90, 0x1f, 0x9b, 0xd0, 0x6, 0x93, + 0x86, 0x93, 0x7b, 0x90, 0x1e, 0x93, 0x71, 0x72, 0x95, 0x59, 0x1b, 0xfb, + 0x2a, 0x49, 0xfb, 0x1, 0x39, 0xfb, 0x20, 0xea, 0x53, 0xf7, 0x6, 0xb9, + 0xb2, 0x95, 0x92, 0x9e, 0x1f, 0x9b, 0x8f, 0x94, 0x8e, 0x8c, 0x97, 0x9c, + 0xd9, 0x18, 0xe, 0x3a, 0xf8, 0x2a, 0xad, 0xf7, 0x80, 0x77, 0x12, 0xb5, + 0xd4, 0xf7, 0x26, 0xaf, 0x13, 0xe0, 0xf7, 0x87, 0xf8, 0x7a, 0x15, 0x80, + 0x70, 0x88, 0x7e, 0x7d, 0x1a, 0x81, 0x90, 0x7b, 0xa6, 0xa7, 0xa1, 0xa1, + 0xb7, 0xb2, 0x1e, 0x13, 0x70, 0x84, 0x95, 0x5, 0x6f, 0x71, 0x7e, 0x80, + 0x84, 0x1b, 0x86, 0x8e, 0x9a, 0x99, 0x8e, 0x1f, 0x13, 0xe0, 0x90, 0xa9, + 0xba, 0xf7, 0x3a, 0x8d, 0x92, 0x56, 0x8a, 0x18, 0x7f, 0x64, 0x5, 0x89, + 0x6, 0x9b, 0x89, 0x7a, 0xa4, 0x65, 0x1b, 0x35, 0x27, 0xfb, 0x3, 0x33, + 0x79, 0x92, 0x56, 0xd1, 0xb8, 0xac, 0x9d, 0xca, 0xb7, 0x1f, 0xfb, 0x12, + 0x89, 0x15, 0xbd, 0xcc, 0xf7, 0xf, 0xd2, 0x98, 0x90, 0x81, 0x64, 0x87, + 0x1e, 0x5a, 0x86, 0x57, 0xfb, 0xc, 0x4a, 0x1b, 0x83, 0x77, 0x95, 0xae, + 0x1f, 0xe, 0xce, 0xa, 0xc0, 0xf7, 0x6c, 0x68, 0xa, 0x93, 0x78, 0xbb, + 0x75, 0xbd, 0x1f, 0x81, 0xa2, 0x80, 0xa3, 0x81, 0x9e, 0xa1, 0xa2, 0x9e, + 0x9f, 0x9b, 0x9c, 0x8, 0xd6, 0xdc, 0x99, 0xa2, 0x99, 0x69, 0xa, 0xf7, + 0x36, 0x82, 0x68, 0xa, 0x93, 0x76, 0xc2, 0x73, 0xc0, 0x1f, 0x82, 0x9f, + 0x82, 0x9e, 0x82, 0x9c, 0xa2, 0xa3, 0x9f, 0xa0, 0x9c, 0x9d, 0x8, 0xd4, + 0xd9, 0x98, 0xa2, 0x99, 0x69, 0xa, 0xe, 0xf7, 0xd2, 0xf7, 0x15, 0x76, + 0xf7, 0x84, 0xb1, 0x12, 0xf8, 0x92, 0xcf, 0x6d, 0xb5, 0x13, 0xe0, 0xe1, + 0xf7, 0xf0, 0x15, 0x13, 0xd0, 0xf8, 0x62, 0xfb, 0x84, 0xb5, 0xf7, 0xaa, + 0xfc, 0x8c, 0x6, 0xe, 0xf8, 0x27, 0x79, 0xb5, 0xf7, 0xe, 0x9a, 0x7c, + 0xf7, 0x35, 0xfb, 0x35, 0xf7, 0x47, 0xfb, 0x3e, 0xf7, 0x3e, 0xf7, 0x3b, + 0xf7, 0x42, 0x51, 0xb5, 0x71, 0xb5, 0x12, 0xb4, 0xc2, 0x5f, 0xc2, 0xf7, + 0x36, 0xcb, 0xf3, 0xce, 0x4e, 0xce, 0xf7, 0x2e, 0xc2, 0x13, 0x92, 0x74, + 0xf7, 0xe1, 0xf7, 0xd9, 0x15, 0x13, 0x94, 0x74, 0xf7, 0x3b, 0xb4, 0x7, + 0x13, 0x92, 0x6c, 0xb1, 0xaa, 0x78, 0x52, 0x56, 0x78, 0x65, 0x5a, 0x1f, + 0x13, 0x92, 0xb4, 0xfb, 0xe2, 0x16, 0xfb, 0x51, 0xf7, 0x29, 0xfb, 0x2e, + 0xf7, 0x54, 0xf7, 0x52, 0xf7, 0x27, 0xf7, 0x2f, 0xf7, 0x51, 0x1e, 0x13, + 0x91, 0x74, 0xf7, 0x51, 0xfb, 0x27, 0xf7, 0x2b, 0xfb, 0x52, 0x1e, 0x13, + 0x92, 0xb4, 0xfb, 0x54, 0xfb, 0x29, 0xfb, 0x2c, 0xfb, 0x51, 0x1f, 0xc2, + 0x16, 0x13, 0x91, 0x74, 0xf7, 0x33, 0xf7, 0x11, 0xf7, 0x20, 0xf7, 0x35, + 0xf7, 0x32, 0xf7, 0x10, 0xfb, 0x1e, 0xfb, 0x34, 0xfb, 0x33, 0xfb, 0x11, + 0xfb, 0x23, 0xfb, 0x31, 0x1e, 0x13, 0x92, 0xb4, 0xfb, 0x34, 0xfb, 0x12, + 0xf7, 0x22, 0xf7, 0x33, 0x1f, 0xf7, 0x11, 0xfb, 0x47, 0x15, 0xf7, 0x34, + 0x6, 0x13, 0xc2, 0x74, 0x9a, 0x7, 0x59, 0x90, 0x8d, 0x8b, 0xb6, 0x1a, + 0x13, 0xa2, 0x74, 0xed, 0xba, 0x7, 0x2e, 0xca, 0xa4, 0x47, 0xab, 0x1b, + 0xca, 0x6, 0x13, 0x8a, 0x74, 0x94, 0x7, 0x78, 0x99, 0x6d, 0xad, 0x71, + 0xaf, 0x52, 0xd9, 0x18, 0x13, 0xc2, 0x6c, 0xb8, 0x9a, 0xad, 0xb1, 0xbe, + 0x1a, 0xc9, 0x54, 0xa7, 0x50, 0x1e, 0xfb, 0x43, 0x7c, 0x6, 0xbc, 0x86, + 0x8a, 0x8c, 0x5f, 0x1a, 0xfb, 0x83, 0x7, 0x60, 0x8c, 0x8b, 0x5a, 0x86, + 0x1e, 0xe, 0x73, 0xf8, 0xa8, 0xbe, 0x1, 0xee, 0xf7, 0xcc, 0x3, 0xee, + 0xf8, 0xa8, 0x15, 0xf7, 0xbf, 0x6, 0x98, 0xbe, 0x5, 0xfb, 0xbf, 0x6, + 0xe, 0xb6, 0xf8, 0x1a, 0xad, 0xf7, 0x6e, 0xad, 0x1, 0xf0, 0xb2, 0xf7, + 0x64, 0xb2, 0x3, 0xf7, 0x20, 0xf8, 0xab, 0x15, 0xc5, 0xb9, 0xbc, 0xc5, + 0xc5, 0xb9, 0x5c, 0x51, 0x51, 0x5d, 0x54, 0x51, 0x51, 0x5d, 0xc0, 0xc5, + 0x1e, 0x64, 0x16, 0x3b, 0xca, 0x4a, 0xdb, 0xdb, 0xca, 0xce, 0xdb, 0xdb, + 0x4c, 0xc6, 0x3b, 0x3b, 0x4c, 0x4e, 0x3b, 0x1e, 0xe, 0xf7, 0xd2, 0x8b, + 0xce, 0xf7, 0x69, 0xcf, 0x54, 0xb8, 0xf7, 0x3c, 0x77, 0x12, 0xf7, 0xc5, + 0xcf, 0x53, 0xb6, 0x13, 0xd8, 0xe1, 0x16, 0xf8, 0x8c, 0xb5, 0xfc, 0x8c, + 0x6, 0x13, 0xb8, 0xf7, 0x8f, 0x4, 0x13, 0xb4, 0xf7, 0x7b, 0xfb, 0x3f, + 0xb6, 0xf7, 0x3f, 0xf7, 0x7a, 0xb8, 0xfb, 0x7a, 0xf7, 0x3c, 0x60, 0xfb, + 0x3c, 0xfb, 0x7b, 0x6, 0xe, 0x52, 0xf7, 0xa3, 0xc0, 0xf7, 0xc1, 0xbe, + 0x1, 0xac, 0xf7, 0xa3, 0xc1, 0xa, 0x77, 0x7e, 0x60, 0x1b, 0x29, 0x95, + 0xa, 0xc2, 0x46, 0x79, 0x36, 0x89, 0x75, 0xa, 0xe, 0x52, 0xf7, 0xa0, + 0xb2, 0x64, 0xd8, 0xf7, 0x24, 0x94, 0x82, 0xf7, 0x4f, 0x6b, 0xab, 0x12, + 0xf7, 0x82, 0xca, 0x6e, 0xce, 0x13, 0x54, 0xf7, 0x11, 0xf8, 0x7d, 0x15, + 0xc3, 0xc4, 0x79, 0x37, 0x47, 0x4e, 0x77, 0x75, 0x7c, 0x84, 0x95, 0x95, + 0x83, 0x1f, 0x98, 0x81, 0x80, 0x98, 0x70, 0x1b, 0x13, 0xac, 0x6c, 0x88, + 0xa5, 0xa, 0x7b, 0x93, 0x1f, 0x87, 0x8d, 0x5, 0x13, 0x6a, 0xc9, 0xa, + 0x66, 0x5a, 0x72, 0x67, 0x7b, 0x1e, 0x83, 0xa, 0x73, 0xf8, 0x97, 0x76, + 0xf7, 0x3e, 0x77, 0x1, 0xf7, 0x48, 0xad, 0xa, 0xf7, 0x33, 0xeb, 0x9f, + 0xa, 0x9d, 0x9c, 0x9a, 0x1a, 0x9d, 0x7d, 0x9c, 0x76, 0x80, 0x76, 0x7d, + 0x9d, 0xa, 0xe, 0xfb, 0x50, 0x76, 0xf7, 0x5b, 0xc2, 0xf8, 0x13, 0x77, + 0x1, 0x6d, 0xf4, 0xf7, 0x99, 0xde, 0x3, 0xd9, 0xc7, 0x15, 0x4f, 0x9d, + 0xbf, 0x81, 0xaa, 0x1b, 0xbe, 0xcc, 0xb9, 0xbe, 0xb2, 0x1f, 0x8d, 0x6, + 0x89, 0x81, 0x85, 0x77, 0x81, 0x1a, 0x68, 0x9d, 0x75, 0xaf, 0xaf, 0xa9, + 0x95, 0xba, 0xb7, 0x1e, 0x8e, 0x94, 0x5, 0x76, 0x71, 0x7b, 0x86, 0x7c, + 0x1b, 0x67, 0x98, 0xb4, 0xa0, 0x8f, 0x1f, 0xd9, 0xf7, 0xe4, 0x5, 0x33, + 0x6, 0x47, 0xfb, 0xc3, 0x5, 0x72, 0x7a, 0x53, 0x54, 0x58, 0x1b, 0x4f, + 0x77, 0xb8, 0xc1, 0x96, 0x1f, 0xce, 0xf7, 0xb0, 0x5, 0x33, 0x6, 0x36, + 0xfc, 0xa, 0x84, 0x6b, 0x7f, 0x68, 0x7c, 0x6a, 0x19, 0x7d, 0x6c, 0x73, + 0x66, 0x5a, 0x1a, 0x72, 0x91, 0x76, 0xa7, 0xcb, 0x92, 0xf7, 0x0, 0xaf, + 0xb4, 0x87, 0xb4, 0x8f, 0xb6, 0x1e, 0xe, 0xf7, 0x3a, 0xfb, 0x57, 0x76, + 0xf9, 0xe7, 0xa6, 0x1, 0xf7, 0x17, 0xfb, 0x6c, 0x15, 0xaf, 0x6, 0xf7, + 0x88, 0xf9, 0xe7, 0x5, 0xe6, 0x6, 0xfb, 0x88, 0xfd, 0xe7, 0x5, 0xae, + 0x6, 0xf7, 0x88, 0xf9, 0xe7, 0x5, 0xcc, 0x6, 0x93, 0xa6, 0x5, 0xfb, + 0x7a, 0x6, 0xfb, 0x8a, 0x5c, 0xfb, 0x44, 0x4c, 0xfb, 0x4, 0xed, 0x7a, + 0xe7, 0x1f, 0xe, 0x20, 0xf7, 0x5b, 0xf7, 0x3, 0x1, 0xd1, 0xf7, 0x3, + 0x3, 0xd1, 0xf7, 0x92, 0x84, 0xa, 0x73, 0xfb, 0x6d, 0xaf, 0xf7, 0x49, + 0x77, 0x1, 0xf7, 0x0, 0xd5, 0x3, 0xdc, 0x16, 0x4c, 0x21, 0x94, 0x83, + 0x5, 0x91, 0x96, 0x9b, 0x8e, 0x99, 0x1b, 0xa0, 0x9e, 0x81, 0x74, 0x6f, + 0x6b, 0x7c, 0x68, 0x78, 0x77, 0x8f, 0x95, 0x7c, 0x1f, 0x7a, 0x6e, 0x5, + 0x7e, 0xa3, 0xaf, 0x83, 0xaf, 0x1b, 0xc6, 0xc4, 0xa2, 0xcb, 0xb5, 0x67, + 0xa4, 0x64, 0x80, 0x80, 0x8b, 0x88, 0x81, 0x1f, 0xb7, 0xcd, 0x5, 0xe, + 0x52, 0xf7, 0xa3, 0x9b, 0xf7, 0x6, 0x76, 0xf7, 0xbc, 0x77, 0x1, 0xb6, + 0xf7, 0x7f, 0x3, 0xb6, 0xf7, 0xa3, 0x15, 0xf7, 0x49, 0x9b, 0x6, 0x68, + 0x7e, 0x96, 0x9b, 0x9c, 0x96, 0xa4, 0x96, 0xae, 0x1f, 0xdd, 0xf7, 0x9c, + 0x5, 0x8e, 0x92, 0x8c, 0x90, 0x8f, 0x1a, 0x8e, 0x89, 0x8d, 0x87, 0x83, + 0x2e, 0x78, 0x88, 0x6e, 0x1e, 0x78, 0x7, 0x8c, 0x9b, 0x97, 0x8b, 0x93, + 0x1b, 0x97, 0x91, 0x86, 0x82, 0x83, 0x8a, 0x81, 0x88, 0x84, 0x1f, 0x4c, + 0xfb, 0x63, 0x73, 0x3b, 0x83, 0x84, 0x4f, 0x7b, 0x19, 0xe, 0x5c, 0xf7, + 0xb9, 0xa3, 0xe4, 0xa3, 0xf7, 0x5d, 0xa1, 0x8c, 0xa1, 0x1, 0xce, 0xd4, + 0xf7, 0x29, 0xd4, 0x3, 0xce, 0xf8, 0x82, 0x15, 0xe3, 0xe8, 0xe9, 0xef, + 0xd8, 0xa4, 0x59, 0x63, 0x40, 0x34, 0x22, 0x23, 0x43, 0x6b, 0xb0, 0xbe, + 0x1e, 0xd4, 0x81, 0x15, 0x6c, 0x97, 0x74, 0xa7, 0xcf, 0xb4, 0xf7, 0xb, + 0xbe, 0xa6, 0x84, 0xa6, 0x70, 0x48, 0x5b, 0xfb, 0x4, 0x51, 0x1e, 0xe, + 0xce, 0xa, 0xc2, 0xf8, 0x1c, 0x3, 0xf7, 0xff, 0xf7, 0x73, 0x15, 0x49, + 0xa, 0xfb, 0x36, 0x16, 0x49, 0xa, 0xe, 0xd9, 0xa, 0xf7, 0x10, 0x9b, + 0xf8, 0x19, 0x77, 0x12, 0xac, 0xf9, 0x53, 0x13, 0x68, 0x67, 0xa, 0x13, + 0xbc, 0x94, 0xa, 0x13, 0xa8, 0xfb, 0xb2, 0xfb, 0x31, 0x8c, 0xa, 0xfc, + 0xc9, 0xfc, 0x29, 0x15, 0xf7, 0x49, 0x6, 0x13, 0x10, 0x9b, 0x7, 0x13, + 0x1c, 0x71, 0x74, 0x95, 0x9d, 0x8d, 0x8b, 0x8d, 0xf4, 0xf7, 0xe4, 0x1f, + 0x8d, 0x92, 0x8d, 0x8f, 0x8f, 0x1a, 0x8e, 0x8a, 0x8e, 0x86, 0xdc, 0xa, + 0x8c, 0x9c, 0x97, 0x8b, 0x93, 0x1b, 0xa7, 0x80, 0x72, 0x7d, 0x87, 0x1f, + 0x32, 0xfb, 0xa7, 0x85, 0x78, 0x71, 0x7f, 0x69, 0x87, 0x19, 0xe, 0xf8, + 0x1d, 0x8b, 0xc0, 0x61, 0x76, 0xf8, 0x0, 0xbf, 0xf7, 0xa2, 0x77, 0x12, + 0xad, 0xf7, 0x83, 0xfb, 0x24, 0xbe, 0xf8, 0x8c, 0xcc, 0x13, 0x76, 0xf7, + 0x15, 0x81, 0x8c, 0xa, 0x13, 0xba, 0xfb, 0x12, 0xfd, 0x38, 0xc1, 0xa, + 0x81, 0x7e, 0x60, 0x1b, 0xfb, 0x0, 0x95, 0xa, 0xc3, 0x46, 0x79, 0x36, + 0x88, 0x75, 0xa, 0xfc, 0x3c, 0xf7, 0x91, 0x15, 0xf7, 0x48, 0x6, 0x13, + 0x0, 0x9b, 0x7, 0x13, 0x18, 0x72, 0x6e, 0x96, 0x9b, 0x90, 0x1f, 0xc8, + 0xf7, 0x5d, 0xba, 0xf7, 0x2d, 0x88, 0x1a, 0x8e, 0x8d, 0x93, 0x84, 0xdc, + 0xa, 0xb0, 0x8c, 0x5, 0x99, 0x8f, 0x86, 0x82, 0x7e, 0x89, 0x88, 0x2f, + 0xfb, 0xb0, 0x1f, 0x85, 0x78, 0x72, 0x7f, 0x69, 0x87, 0x8, 0xe, 0xd9, + 0xa, 0xf7, 0xea, 0xf7, 0x4f, 0x12, 0xf7, 0x6e, 0xca, 0x6e, 0xce, 0x13, + 0x78, 0x67, 0xa, 0x94, 0xa, 0x13, 0xb8, 0xfb, 0xb1, 0xfb, 0x31, 0x8c, + 0xa, 0xfc, 0x82, 0xfb, 0x4f, 0x15, 0xc3, 0xc4, 0x7e, 0x32, 0x47, 0x4e, + 0x77, 0x75, 0x7a, 0x7f, 0x98, 0x97, 0x7f, 0x1f, 0x96, 0x80, 0x80, 0x95, + 0x7d, 0x1b, 0x68, 0x8b, 0xa5, 0xa, 0x77, 0x95, 0x1f, 0x13, 0x74, 0xc9, + 0xa, 0x1e, 0x13, 0x4, 0x66, 0x5a, 0x72, 0x67, 0x7b, 0x1f, 0x83, 0xa, + 0xfb, 0x88, 0xa1, 0x12, 0xa5, 0xd5, 0xf7, 0x2c, 0xcb, 0x55, 0xf5, 0x13, + 0xe0, 0xf7, 0xb0, 0xf7, 0xb1, 0x15, 0x73, 0x26, 0x54, 0x5f, 0x60, 0x68, + 0x8, 0x26, 0x39, 0x6a, 0x6c, 0x45, 0x1a, 0x41, 0xc2, 0x56, 0xeb, 0x1e, + 0xd2, 0xcd, 0xb2, 0xd2, 0xa8, 0x7c, 0xa7, 0x73, 0x81, 0x6d, 0x86, 0x6d, + 0x80, 0x8f, 0x81, 0x8f, 0x81, 0x1f, 0x8f, 0x81, 0x8e, 0x81, 0x7f, 0x1a, + 0x5c, 0x4a, 0x8b, 0x86, 0x42, 0x84, 0xc6, 0xa4, 0xd6, 0xba, 0xba, 0xbc, + 0xc1, 0x1e, 0xba, 0xbf, 0xbb, 0xc6, 0x93, 0xea, 0x8, 0x13, 0xd0, 0x64, + 0xf7, 0x1b, 0x15, 0x6e, 0xa3, 0x85, 0xa, 0x73, 0x73, 0x6e, 0x1e, 0xe, + 0x88, 0xa, 0x58, 0x16, 0x9b, 0xa, 0x5f, 0x7d, 0xa0, 0xa3, 0x9d, 0x93, + 0xa8, 0xcf, 0xf7, 0xa, 0x1f, 0xf7, 0x70, 0x6, 0xa2, 0xfb, 0x18, 0x8b, + 0x82, 0x82, 0x1a, 0x66, 0x74, 0x74, 0x53, 0x27, 0xa, 0xc7, 0xf8, 0x4e, + 0xb7, 0xa, 0xfb, 0x3, 0xf7, 0x27, 0xc5, 0xa, 0x79, 0x8d, 0x56, 0xa, + 0x9e, 0x7f, 0x80, 0xa, 0x88, 0xa, 0xf7, 0xd3, 0xf9, 0x56, 0x7f, 0xa, + 0xfc, 0xa3, 0xfd, 0xf1, 0xe7, 0xa, 0x64, 0x78, 0x9f, 0xa3, 0x9e, 0x94, + 0xa2, 0x96, 0xa0, 0x81, 0xa, 0xa1, 0xfb, 0x11, 0x8c, 0x83, 0x82, 0x1a, + 0x61, 0x78, 0x71, 0x4f, 0x27, 0xa, 0xe, 0x5a, 0xa, 0xf7, 0x75, 0x77, + 0x1, 0x58, 0xf8, 0xfb, 0x3, 0xf7, 0x7f, 0x46, 0xa, 0xfc, 0x4f, 0xfd, + 0xfd, 0xe7, 0xa, 0x63, 0x79, 0x9f, 0xa4, 0x9e, 0x94, 0xa1, 0x96, 0xa0, + 0x81, 0xa, 0xa3, 0xfb, 0x16, 0x8a, 0x82, 0x83, 0x1a, 0x67, 0x71, 0x70, + 0x56, 0x35, 0xa, 0x82, 0x68, 0x7c, 0x19, 0xf7, 0x76, 0xf7, 0x8b, 0x4c, + 0xa, 0xe, 0x5a, 0xa, 0xdf, 0xac, 0xa, 0x13, 0xf4, 0xf7, 0x83, 0xf9, + 0x6d, 0x65, 0xa, 0x73, 0x97, 0x96, 0x71, 0x1f, 0x13, 0xe8, 0x95, 0x73, + 0x72, 0x95, 0x71, 0x6c, 0xa, 0xfb, 0xb6, 0xfd, 0x6d, 0xe7, 0xa, 0x64, + 0x78, 0x9d, 0xa4, 0x9e, 0x94, 0xa3, 0x96, 0xa0, 0x81, 0xa, 0xa1, 0xfb, + 0x12, 0x8c, 0x81, 0x84, 0x1a, 0x61, 0x70, 0x72, 0x57, 0x27, 0xa, 0xe, + 0x5a, 0xa, 0xd3, 0xed, 0x1, 0xf7, 0x8a, 0xc6, 0xa, 0x3, 0x58, 0x16, + 0x9b, 0xa, 0x65, 0x77, 0xa0, 0x9f, 0xa3, 0x94, 0x9f, 0x96, 0xa1, 0x81, + 0xa, 0xa1, 0xfb, 0xf, 0x8c, 0x7f, 0x84, 0x1a, 0x60, 0x72, 0x72, 0x55, + 0x27, 0xa, 0xfb, 0xf, 0xf8, 0x8f, 0x23, 0xa, 0x5a, 0xa, 0xae, 0xf7, + 0x3a, 0xab, 0xa, 0xf7, 0x39, 0x12, 0x58, 0xf7, 0x4f, 0xf7, 0x28, 0xad, + 0x69, 0xf7, 0x39, 0xab, 0xa, 0xf7, 0x3a, 0x13, 0xf2, 0x80, 0xf7, 0xb0, + 0xf9, 0xa3, 0x15, 0x54, 0xb8, 0x5e, 0xc2, 0x1e, 0x13, 0xe7, 0x20, 0xc2, + 0xb8, 0xb8, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0x1f, 0x13, 0xf2, 0x80, 0x54, + 0x5e, 0x5e, 0x54, 0x1f, 0xad, 0x16, 0xb3, 0xa, 0x13, 0xeb, 0x40, 0xe5, + 0xa, 0xfc, 0x5, 0xfd, 0xa3, 0xe7, 0xa, 0x65, 0x77, 0xa0, 0x9f, 0xa3, + 0x94, 0x9f, 0x96, 0xa1, 0x81, 0xa, 0xa1, 0xfb, 0xf, 0x8c, 0x7f, 0x84, + 0x1a, 0x60, 0x72, 0x72, 0x55, 0x27, 0xa, 0xe, 0xf8, 0xa8, 0x8b, 0xac, + 0xf7, 0x5d, 0xb0, 0xc4, 0xe9, 0xa, 0x1, 0xf9, 0x88, 0x9d, 0x3, 0x70, + 0x16, 0x9b, 0xa, 0x6e, 0x6a, 0x9b, 0xa2, 0xb2, 0xe4, 0xe8, 0xad, 0xba, + 0x1f, 0xf7, 0x52, 0x6, 0x5d, 0xfb, 0x34, 0x7f, 0x63, 0x7b, 0x7f, 0x54, + 0x85, 0x19, 0x7b, 0xf8, 0x86, 0x7, 0xcb, 0xf7, 0x38, 0x79, 0x90, 0x5, + 0xfb, 0x3, 0x42, 0x49, 0x72, 0xfb, 0x21, 0x1b, 0x6d, 0x6, 0x65, 0x81, + 0x9f, 0x9f, 0x9d, 0xba, 0xf7, 0x36, 0xa0, 0xd6, 0x1f, 0xb3, 0x6, 0xeb, + 0xa1, 0x84, 0x5d, 0x7b, 0x88, 0x7a, 0x88, 0x7b, 0x1f, 0x9c, 0x87, 0xd0, + 0xf7, 0x7c, 0x79, 0x8f, 0x5, 0x2e, 0x60, 0x7c, 0x87, 0xfb, 0x2d, 0x1b, + 0xc8, 0xf7, 0x72, 0x5, 0xb0, 0x95, 0x94, 0x8b, 0xc7, 0x1b, 0xf7, 0x4e, + 0x81, 0x76, 0x2a, 0x1f, 0x9c, 0x89, 0xac, 0xf7, 0x2d, 0x5, 0xfc, 0x99, + 0x7c, 0x6, 0xbd, 0x87, 0x99, 0x8a, 0x72, 0x1a, 0x7d, 0x7a, 0x78, 0x7c, + 0x79, 0x1e, 0xfc, 0x16, 0xfc, 0x77, 0x71, 0x6b, 0x7a, 0x77, 0x73, 0x85, + 0x19, 0xf7, 0xa8, 0xf7, 0x93, 0x15, 0xf7, 0x97, 0xf7, 0xde, 0x5, 0x91, + 0x6, 0x2f, 0xfb, 0xde, 0x5, 0xe, 0xf7, 0xca, 0xfb, 0x58, 0x76, 0xf7, + 0x5d, 0xb6, 0xd4, 0xa, 0x13, 0xe8, 0xf7, 0x90, 0x21, 0x15, 0x93, 0x83, + 0x5, 0x91, 0x97, 0x9b, 0x8e, 0x9a, 0x1b, 0xa1, 0x9e, 0x81, 0x74, 0x6e, + 0x67, 0x7d, 0x67, 0x7a, 0x79, 0xde, 0xa, 0xa3, 0xb0, 0x83, 0xaf, 0x1b, + 0xc5, 0xc4, 0xa3, 0xca, 0xb5, 0x67, 0xa4, 0x64, 0x80, 0x81, 0x8b, 0x88, + 0x80, 0x1f, 0xac, 0xbd, 0x5, 0xf7, 0x1d, 0xde, 0xf4, 0xb5, 0xaf, 0x6f, + 0xa, 0x9d, 0x88, 0x5, 0x13, 0xd8, 0xb8, 0xa, 0x7f, 0x76, 0x92, 0x91, + 0x70, 0x1f, 0x13, 0xe8, 0x91, 0x73, 0x6e, 0x90, 0x6a, 0xd5, 0xa, 0xfb, + 0x4f, 0xf7, 0x14, 0x3a, 0xf7, 0x5, 0x1f, 0xe, 0x8d, 0xa, 0xf7, 0x73, + 0x77, 0x1, 0xf8, 0x24, 0x9f, 0xf7, 0x36, 0xa0, 0x3, 0x8b, 0xa, 0x68, + 0x6d, 0x98, 0xb2, 0x90, 0x8c, 0x90, 0x8c, 0x91, 0x1f, 0x8d, 0x97, 0x99, + 0x3c, 0xa, 0x7f, 0x80, 0xfb, 0x2f, 0x74, 0xa, 0xf7, 0x50, 0x86, 0x76, + 0x2a, 0x41, 0xa, 0xf8, 0x42, 0xf9, 0x44, 0xb7, 0xa, 0xfb, 0x1, 0xf7, + 0x22, 0xc5, 0xa, 0x77, 0x92, 0x56, 0xa, 0xa0, 0x7a, 0x80, 0xa, 0x8d, + 0xa, 0xf7, 0x73, 0x77, 0x1, 0xf8, 0xda, 0xa0, 0x3, 0xf7, 0xdd, 0xf9, + 0x56, 0x9e, 0xa, 0xf7, 0x38, 0xf0, 0x9f, 0xa, 0x98, 0x97, 0x47, 0xa, + 0x7c, 0x82, 0x9d, 0xa, 0xfc, 0x79, 0xfd, 0xf1, 0x34, 0xa, 0xf7, 0x92, + 0x8b, 0xac, 0xf7, 0xbb, 0xac, 0xf7, 0x99, 0xac, 0x89, 0xbe, 0xd1, 0xa, + 0xf8, 0x24, 0x9f, 0xf7, 0x36, 0xa0, 0x3, 0xf7, 0x98, 0x46, 0xa, 0xfc, + 0x36, 0xfd, 0xfd, 0x34, 0xa, 0x8d, 0xa, 0xce, 0xed, 0x1, 0xf7, 0x9e, + 0xc6, 0xa, 0x3, 0x8a, 0x16, 0x32, 0xa, 0x7f, 0x80, 0xfb, 0x2f, 0x74, + 0xa, 0xf7, 0x50, 0x86, 0x76, 0x2a, 0x41, 0xa, 0xf7, 0x9f, 0xf9, 0x85, + 0x23, 0xa, 0x73, 0x99, 0xa, 0x83, 0x16, 0x2a, 0xa, 0xf7, 0xbe, 0xf9, + 0x44, 0x77, 0xa, 0x73, 0x99, 0xa, 0xf7, 0x66, 0xf9, 0x56, 0x9e, 0xa, + 0xf7, 0x21, 0xee, 0x9f, 0xa, 0x9b, 0x99, 0x47, 0xa, 0x79, 0x80, 0x9d, + 0xa, 0xfb, 0xf2, 0xfd, 0xef, 0x15, 0x2a, 0xa, 0xe, 0x73, 0x9a, 0xa, + 0xbe, 0xd1, 0xa, 0x83, 0xf8, 0x45, 0x3, 0xf7, 0x17, 0x46, 0xa, 0xfb, + 0xbc, 0xfd, 0xfd, 0x15, 0x2a, 0xa, 0xe, 0x73, 0x87, 0xa, 0xe2, 0xed, + 0x1, 0xf7, 0x1d, 0xc6, 0xa, 0x3, 0x83, 0x16, 0x2a, 0xa, 0xf7, 0x25, + 0xf9, 0x85, 0x23, 0xa, 0xf8, 0x1, 0x8b, 0xa9, 0xf7, 0xbc, 0xb5, 0xf7, + 0x93, 0xa9, 0x1, 0xf7, 0x58, 0xee, 0xf7, 0xba, 0xf7, 0x3, 0x3, 0xb1, + 0xa, 0xf4, 0x4d, 0xf7, 0x35, 0xfb, 0x7a, 0x1f, 0xfb, 0xaa, 0x7b, 0x6, + 0xc4, 0x9d, 0x76, 0x6d, 0x7a, 0x87, 0x79, 0x86, 0x78, 0x1f, 0x5d, 0xfb, + 0x38, 0x5, 0x31, 0x6, 0x7f, 0x61, 0x5, 0xe5, 0x6, 0x5d, 0xfb, 0x38, + 0x5, 0x26, 0x6f, 0x86, 0x5e, 0x48, 0x1b, 0xf7, 0x8a, 0xf7, 0xca, 0x15, + 0xf7, 0x2d, 0x6, 0x97, 0xb5, 0x5, 0xfb, 0x2d, 0x6, 0xb8, 0xf7, 0x39, + 0x5, 0xc1, 0x9a, 0x8e, 0xaf, 0xcc, 0xb2, 0xa, 0x55, 0x7a, 0x9b, 0xa5, + 0xa2, 0x97, 0xaa, 0x95, 0xaf, 0x1f, 0xe, 0xf7, 0xca, 0x91, 0x76, 0xaf, + 0x76, 0xf9, 0x1e, 0xf7, 0x2f, 0xfb, 0x2c, 0x77, 0xee, 0xc7, 0x56, 0xf2, + 0x85, 0x77, 0x12, 0x13, 0x62, 0x77, 0xe4, 0xa, 0x56, 0x7c, 0xa0, 0xab, + 0x9c, 0x90, 0x9e, 0x91, 0xa1, 0x1f, 0xf7, 0x0, 0xf8, 0x26, 0x5, 0x8f, + 0x6, 0x13, 0xa2, 0xf7, 0x78, 0xfc, 0xb4, 0x5, 0x9d, 0x6, 0xf7, 0x2c, + 0xf8, 0xad, 0xa2, 0xdb, 0x9c, 0xa2, 0xc3, 0x97, 0x19, 0x13, 0x5a, 0xeb, + 0xa, 0x7, 0x13, 0x62, 0x7b, 0x7, 0xbd, 0x9b, 0x74, 0x6d, 0x78, 0x87, + 0x76, 0x85, 0x77, 0x1f, 0x29, 0xfc, 0x2, 0x5, 0x88, 0x6, 0x13, 0x5a, + 0xfb, 0x62, 0xf8, 0x83, 0x5, 0xfb, 0x35, 0x6, 0x13, 0x62, 0x7b, 0x7, + 0xbb, 0xa0, 0x78, 0x66, 0x9c, 0x1f, 0xfb, 0x13, 0xfc, 0x57, 0x76, 0x3f, + 0x78, 0x6d, 0x54, 0x83, 0x19, 0xf7, 0xbd, 0xf9, 0x5d, 0x60, 0xa, 0x9d, + 0xa9, 0x7f, 0x80, 0xa8, 0x1f, 0x13, 0x5a, 0x80, 0xa7, 0xa6, 0x81, 0x71, + 0xa, 0x77, 0x74, 0x96, 0x96, 0x71, 0x1f, 0x13, 0x54, 0x95, 0x73, 0x71, + 0x96, 0x71, 0xd6, 0xa, 0xbf, 0xa, 0xf7, 0x66, 0xa8, 0xa, 0xc7, 0xf7, + 0x77, 0x24, 0xa, 0xf7, 0xd4, 0xf8, 0x71, 0x77, 0xa, 0xbf, 0xa, 0xf7, + 0x66, 0xa8, 0xa, 0xf8, 0x33, 0xf9, 0x56, 0x5e, 0xa, 0xfc, 0x95, 0xfd, + 0xe, 0x24, 0xa, 0xe, 0xb6, 0xa, 0xac, 0xf8, 0xf7, 0xb1, 0x6c, 0xac, + 0x8b, 0xb1, 0xf7, 0x3d, 0xa8, 0xa, 0xf7, 0xd5, 0x46, 0xa, 0xfc, 0x36, + 0xfd, 0x1a, 0x24, 0xa, 0xe, 0xb6, 0xa, 0xac, 0xf8, 0xff, 0xac, 0xd0, + 0xf2, 0x88, 0x77, 0x12, 0x86, 0xa, 0x13, 0xec, 0xf7, 0xcf, 0xf9, 0x6d, + 0x60, 0xa, 0x9c, 0xa6, 0x81, 0x81, 0xa6, 0x1f, 0x7f, 0xa9, 0xa9, 0x7f, + 0x9e, 0x1b, 0x13, 0xdc, 0x43, 0xa, 0x78, 0x74, 0x96, 0x96, 0x72, 0x1f, + 0x13, 0xec, 0x96, 0x73, 0x70, 0x95, 0x70, 0x6c, 0xa, 0xfb, 0x93, 0xfc, + 0x8a, 0x24, 0xa, 0xe, 0xb6, 0xa, 0xac, 0xf8, 0xb8, 0xac, 0xf7, 0x14, + 0xed, 0x12, 0xc7, 0xf4, 0xf8, 0x8, 0xed, 0x62, 0xf4, 0x13, 0xf4, 0xc7, + 0xf7, 0x77, 0x24, 0xa, 0xf7, 0x40, 0xf8, 0xb2, 0x58, 0xa, 0x13, 0xf8, + 0x25, 0xa, 0xf7, 0xd2, 0xa8, 0x76, 0xb4, 0x76, 0xf8, 0x56, 0x77, 0xb2, + 0x77, 0x12, 0xf7, 0x1e, 0xf8, 0x26, 0x13, 0x98, 0xf7, 0x8, 0xc4, 0x15, + 0xa7, 0x70, 0xf7, 0x57, 0xf7, 0x53, 0x5, 0x13, 0x58, 0xf7, 0x57, 0xfb, + 0x55, 0xa7, 0xa8, 0xfb, 0x57, 0xf7, 0x56, 0xf7, 0x5c, 0xf7, 0x5a, 0x5, + 0x13, 0xa8, 0x6e, 0xa8, 0xfb, 0x5b, 0xfb, 0x5a, 0xfb, 0x58, 0xf7, 0x58, + 0x70, 0x6e, 0xf7, 0x56, 0xfb, 0x58, 0x5, 0xe, 0xf8, 0x1, 0x37, 0x76, + 0xe2, 0xac, 0xf8, 0xfe, 0xac, 0xc3, 0xa8, 0xa, 0xf7, 0x52, 0xd5, 0x15, + 0x72, 0xba, 0x8b, 0xe5, 0x98, 0x1a, 0xf7, 0x12, 0xf7, 0x16, 0xf7, 0xaf, + 0xf7, 0x3c, 0xaf, 0xa7, 0x81, 0x7b, 0x9e, 0x1e, 0xfb, 0xdf, 0xfc, 0xc7, + 0x15, 0xf7, 0xf7, 0xf8, 0xa6, 0x5, 0x9d, 0x6f, 0x91, 0x39, 0x62, 0x1a, + 0xfb, 0x1, 0xfb, 0xe, 0xfb, 0xbf, 0xfb, 0x44, 0x65, 0x71, 0x97, 0x9c, + 0x7a, 0x1e, 0xfb, 0x26, 0xfb, 0x29, 0x15, 0xb7, 0x6, 0xd5, 0xf7, 0x0, + 0x5, 0x7e, 0xa9, 0xad, 0x83, 0xa7, 0x1b, 0xae, 0xa, 0xf7, 0x84, 0xf7, + 0x5d, 0xed, 0x65, 0xcd, 0x53, 0xb2, 0x1f, 0xcb, 0xeb, 0x5, 0x5f, 0x6, + 0x57, 0x3d, 0x5, 0x9a, 0x6a, 0x67, 0x92, 0x66, 0x1b, 0xfb, 0x47, 0xfb, + 0x78, 0xfb, 0x6e, 0xfb, 0x71, 0x21, 0xb5, 0x4b, 0xc0, 0x68, 0x1f, 0xe, + 0xaa, 0xa, 0x77, 0xf7, 0x83, 0x77, 0xa3, 0x77, 0x12, 0xcc, 0xa, 0x13, + 0xec, 0xf7, 0x13, 0xf9, 0x11, 0x29, 0xa, 0xf8, 0x4, 0xbe, 0xb7, 0xa, + 0x20, 0xf7, 0x22, 0x5, 0x13, 0xdc, 0xa2, 0x79, 0x75, 0x92, 0x56, 0xa, + 0xa2, 0x7a, 0x80, 0xa, 0xaa, 0xa, 0x77, 0xf7, 0x87, 0x77, 0x1, 0xcc, + 0xa, 0x3, 0xf8, 0x33, 0xf9, 0x56, 0x5e, 0xa, 0xfc, 0x52, 0xfb, 0x74, + 0x29, 0xa, 0xe, 0xaa, 0xa, 0xbe, 0xd1, 0xa, 0xcc, 0xa, 0x3, 0xf7, + 0xc6, 0x46, 0xa, 0xfb, 0xe4, 0xfb, 0x80, 0x29, 0xa, 0xe, 0xb6, 0xa, + 0xb4, 0xf8, 0xfa, 0xdf, 0xa, 0xf1, 0xe5, 0xf7, 0x48, 0xc6, 0xa, 0x13, + 0xce, 0xf7, 0x13, 0xf9, 0x11, 0x3a, 0xa, 0x13, 0xbe, 0xeb, 0xa, 0x7, + 0x13, 0xce, 0x37, 0xa, 0x13, 0xbe, 0xd2, 0xa, 0x13, 0xce, 0xf7, 0x89, + 0xf7, 0x8, 0x15, 0x13, 0xbe, 0x21, 0xa, 0xf7, 0x5b, 0x99, 0xa, 0xcf, + 0xa, 0x59, 0x69, 0x9c, 0xba, 0x92, 0x8c, 0x91, 0x8d, 0x93, 0x1f, 0x91, + 0xa7, 0x92, 0xa1, 0xb8, 0xf7, 0x2f, 0xf7, 0x6f, 0xf7, 0xa2, 0x18, 0xab, + 0xb3, 0x96, 0x93, 0xa6, 0x98, 0x8, 0xe8, 0xa, 0xab, 0xac, 0x86, 0x67, + 0x62, 0xfb, 0x1f, 0xfb, 0x2c, 0x5e, 0x53, 0x1f, 0x73, 0xe7, 0x6c, 0xf5, + 0x85, 0xa5, 0x8, 0x89, 0x95, 0x8b, 0x93, 0x92, 0x1a, 0xa4, 0xaa, 0x98, + 0xb0, 0x8e, 0xcd, 0xa, 0xa9, 0xa7, 0x88, 0x4c, 0x9d, 0x1f, 0xd8, 0xfb, + 0xa1, 0x51, 0xfb, 0x5e, 0x5, 0x49, 0x78, 0x57, 0x79, 0x66, 0x1b, 0xf7, + 0xa6, 0xf9, 0x46, 0x9e, 0xa, 0xf7, 0x3f, 0xf5, 0x9f, 0xa, 0x91, 0x92, + 0x47, 0xa, 0x83, 0x87, 0x9d, 0xa, 0xe, 0x7d, 0xa, 0xf7, 0x3e, 0xb0, + 0xf7, 0xad, 0xa9, 0x6d, 0xf7, 0x39, 0x12, 0xf8, 0x66, 0xf2, 0x13, 0xe8, + 0x8b, 0x4, 0xf7, 0x89, 0x9b, 0x6, 0x55, 0x7e, 0x9d, 0xa5, 0x96, 0x8e, + 0x98, 0x8f, 0x99, 0x1f, 0xa0, 0xdd, 0x5, 0x84, 0xae, 0xad, 0x88, 0xab, + 0x1b, 0xf7, 0x2d, 0xf7, 0x1, 0xdb, 0xf7, 0x8, 0xf7, 0x2b, 0xfb, 0x3b, + 0x8c, 0x5f, 0x1f, 0x53, 0x6, 0x99, 0xc9, 0x94, 0xaf, 0xa6, 0x9b, 0xab, + 0x90, 0x19, 0x13, 0xd8, 0x9b, 0xfb, 0x82, 0x7b, 0x7, 0xb5, 0x86, 0xa5, + 0x7e, 0x66, 0x1a, 0x7d, 0x83, 0x6d, 0x85, 0x74, 0x1e, 0xfb, 0x7, 0xfc, + 0x33, 0x79, 0x4b, 0x7b, 0x7f, 0x58, 0x83, 0x19, 0xf7, 0x6b, 0xf7, 0x57, + 0xd8, 0xa, 0x9c, 0xa9, 0x1b, 0xf7, 0x2, 0xa9, 0x60, 0x41, 0xfb, 0x1f, + 0x30, 0x72, 0x38, 0x6f, 0x70, 0x8d, 0x8d, 0x75, 0x1f, 0xe, 0xfb, 0x63, + 0xa3, 0x73, 0xf3, 0xdb, 0xa1, 0xf9, 0x25, 0xa2, 0x12, 0xf8, 0x3, 0xe2, + 0x62, 0xdb, 0x13, 0xb4, 0xa2, 0x87, 0x15, 0x2c, 0x76, 0x75, 0x37, 0x4c, + 0x1b, 0x7d, 0x87, 0x8f, 0x90, 0x8e, 0x8e, 0x8f, 0x8e, 0x92, 0x1f, 0x8e, + 0x91, 0x8e, 0x93, 0x92, 0x1a, 0x13, 0x74, 0x94, 0x84, 0xa6, 0x6c, 0x74, + 0x79, 0x80, 0x6a, 0x65, 0xaf, 0x75, 0xb5, 0xf7, 0xe, 0xbf, 0xf7, 0x44, + 0xb6, 0x96, 0x1e, 0xf7, 0x3, 0xf8, 0x3e, 0x5, 0xb5, 0x96, 0xb9, 0xf7, + 0x44, 0xe1, 0x1b, 0xb4, 0xa2, 0x70, 0x5b, 0x4d, 0x7b, 0x3f, 0x4b, 0x6b, + 0x1f, 0x74, 0x80, 0x7a, 0x89, 0x7f, 0x8a, 0x8, 0x7c, 0x8a, 0x85, 0x8d, + 0x7c, 0x1a, 0x80, 0x95, 0x89, 0x99, 0x8a, 0x1e, 0x13, 0xb8, 0xab, 0x88, + 0xbe, 0x89, 0xfb, 0x1, 0x1a, 0x40, 0x61, 0xfb, 0x49, 0x3a, 0x7e, 0x86, + 0x94, 0x8f, 0x91, 0x8f, 0x8f, 0x8e, 0x92, 0x1e, 0x8e, 0x90, 0x8d, 0x91, + 0x95, 0x1a, 0xa0, 0x7f, 0x9e, 0x71, 0x73, 0x77, 0x7b, 0x6d, 0x58, 0xba, + 0x7b, 0xaa, 0xf7, 0x28, 0xd3, 0xf7, 0x4b, 0xd6, 0xdc, 0x5e, 0xc6, 0x3c, + 0x91, 0x1e, 0x8e, 0x7, 0x13, 0xb4, 0xc9, 0xa1, 0xf0, 0xb2, 0xf3, 0x1a, + 0xc7, 0x64, 0xd1, 0x28, 0xfb, 0x22, 0x48, 0xfb, 0x20, 0xfb, 0x74, 0x58, + 0x1e, 0xe, 0xa1, 0xa, 0x33, 0xa, 0x13, 0xb8, 0x28, 0xa, 0xf7, 0x9b, + 0xf8, 0x13, 0x78, 0xa, 0xa1, 0xa, 0xf7, 0x9c, 0xf8, 0x82, 0x7f, 0xa, + 0x24, 0xfc, 0x92, 0x22, 0xa, 0x13, 0xb8, 0x28, 0xa, 0xe, 0x76, 0xa, + 0x8b, 0xbe, 0xf7, 0x3d, 0x77, 0x12, 0x9c, 0xdf, 0x13, 0x7c, 0xf7, 0x43, + 0x55, 0xa, 0x7d, 0xfc, 0x9e, 0x22, 0xa, 0x13, 0xbc, 0x28, 0xa, 0xe, + 0x76, 0xa, 0xda, 0xac, 0xa, 0x9c, 0xdf, 0x13, 0xb6, 0xf7, 0x4c, 0xf8, + 0x99, 0x65, 0xa, 0x74, 0x97, 0x96, 0x71, 0x1f, 0x13, 0x6a, 0x95, 0x73, + 0x71, 0x95, 0x71, 0x6c, 0xa, 0xf7, 0x1a, 0xfc, 0xe, 0x22, 0xa, 0x13, + 0xb6, 0x28, 0xa, 0xe, 0x76, 0xa, 0xce, 0xed, 0x12, 0x9c, 0xdf, 0xe5, + 0xc6, 0xa, 0x13, 0x7e, 0x33, 0xa, 0x13, 0xbe, 0x28, 0xa, 0xe5, 0xf8, + 0x54, 0x23, 0xa, 0x76, 0xa, 0xbe, 0xac, 0x8b, 0xf7, 0x17, 0xfb, 0x17, + 0xf7, 0x3a, 0x12, 0x9c, 0xdf, 0xf7, 0x1f, 0xf7, 0x38, 0xab, 0xa, 0xf7, + 0x3a, 0x13, 0x76, 0x40, 0x33, 0xa, 0x13, 0xb7, 0x0, 0x28, 0xa, 0xf7, + 0x1f, 0xf8, 0x76, 0x15, 0x54, 0xb7, 0x5f, 0xc2, 0x1e, 0x13, 0xb6, 0x40, + 0xc2, 0xb8, 0xb7, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0x1f, 0x13, 0xb7, 0x0, + 0x54, 0x5f, 0x5e, 0x54, 0x1f, 0xac, 0x8a, 0x15, 0xb3, 0xa, 0x13, 0xba, + 0x80, 0xe5, 0xa, 0xe, 0xf7, 0xca, 0x80, 0xbd, 0xf8, 0xd, 0xa4, 0x77, + 0x9f, 0x12, 0xa2, 0xe1, 0xf7, 0x53, 0xe3, 0xf7, 0x4e, 0xcd, 0x13, 0xbc, + 0xf7, 0xba, 0xf7, 0x20, 0x15, 0x90, 0x6, 0x89, 0x83, 0x8a, 0x85, 0x82, + 0x1a, 0x49, 0xab, 0x4d, 0xd9, 0xeb, 0xe5, 0xf1, 0x95, 0x91, 0x1e, 0x81, + 0x97, 0x5, 0x48, 0x48, 0x58, 0x81, 0x76, 0x1b, 0x42, 0x8b, 0xd6, 0xa8, + 0xa3, 0x8c, 0x8d, 0x90, 0xa1, 0x1f, 0xf7, 0xa, 0xad, 0xf7, 0x20, 0xb2, + 0xf1, 0x1a, 0xc7, 0x50, 0x9d, 0x75, 0x64, 0x62, 0x76, 0x64, 0x65, 0x1e, + 0x89, 0x8d, 0x9f, 0xc3, 0x44, 0x89, 0x78, 0x60, 0x5, 0xa3, 0x80, 0x81, + 0xa2, 0x5b, 0x1b, 0xfb, 0x12, 0xfb, 0x2b, 0xfb, 0x6a, 0xfb, 0x18, 0x5c, + 0x9a, 0x50, 0xd3, 0xd7, 0xc6, 0xda, 0xd3, 0xbc, 0x1f, 0xfb, 0x4d, 0x67, + 0x15, 0xed, 0xee, 0xf7, 0x6f, 0xe9, 0x99, 0xad, 0x88, 0x54, 0x27, 0x20, + 0xfb, 0x74, 0x29, 0x1e, 0x13, 0x58, 0x69, 0x89, 0xaa, 0xad, 0x1f, 0xf7, + 0xab, 0xf7, 0x1, 0x15, 0xf7, 0x1d, 0xb5, 0xc7, 0xcd, 0xbb, 0x1b, 0x13, + 0xc, 0x9b, 0x9f, 0x7c, 0x6b, 0x56, 0x59, 0x40, 0xfb, 0x1c, 0x6f, 0x1f, + 0xe, 0xe2, 0xfb, 0x6d, 0xaf, 0xdc, 0xad, 0xc3, 0xae, 0xf8, 0x1f, 0xa0, + 0x1, 0xa5, 0xe1, 0xd7, 0xd5, 0xd7, 0xe2, 0x3, 0xf0, 0x28, 0x15, 0x94, + 0x83, 0x5, 0x91, 0x95, 0x98, 0x8c, 0x97, 0x1b, 0xa1, 0xa0, 0x7e, 0x72, + 0x6e, 0x69, 0x7d, 0x67, 0x79, 0x78, 0xde, 0xa, 0xa2, 0xaf, 0x83, 0xaf, + 0x1b, 0xc6, 0xc5, 0xa2, 0xcb, 0xb4, 0x69, 0xa5, 0x65, 0x7f, 0x7f, 0x8b, + 0x88, 0x80, 0x1f, 0xb1, 0xc3, 0xeb, 0x91, 0xc0, 0xd1, 0xa3, 0xa9, 0x19, + 0x7b, 0x95, 0x5, 0x63, 0x67, 0x5c, 0x62, 0x4f, 0x1b, 0x4e, 0x69, 0xb8, + 0xd8, 0xeb, 0xd4, 0xdb, 0xa, 0x81, 0x86, 0x82, 0x87, 0x80, 0x1f, 0x88, + 0x83, 0x88, 0x81, 0x80, 0xa3, 0xa, 0xfb, 0x22, 0xfb, 0x2d, 0xfb, 0x21, + 0xfb, 0xa, 0xd0, 0x6a, 0xc7, 0x85, 0x1e, 0xe, 0xe2, 0x80, 0xb8, 0xf7, + 0xfc, 0xa2, 0x8c, 0xa2, 0xf7, 0x73, 0x77, 0x1, 0xaa, 0xe0, 0x3, 0xf7, + 0x17, 0xf7, 0x5a, 0x15, 0x9c, 0xb7, 0x5, 0x2d, 0xa, 0xf7, 0x68, 0xf7, + 0xd0, 0x78, 0xa, 0xe2, 0x80, 0xb8, 0xf8, 0xd, 0xa2, 0xf7, 0x7a, 0x77, + 0x12, 0xaa, 0xe0, 0xf7, 0x7b, 0xcc, 0x17, 0xf7, 0x80, 0xad, 0xa, 0xf7, + 0x3a, 0xee, 0x9f, 0xa, 0x96, 0x99, 0x47, 0xa, 0x7e, 0x80, 0x9d, 0xa, + 0xfb, 0x9a, 0xfc, 0x55, 0x15, 0x9c, 0xb7, 0x5, 0x3d, 0xa, 0x13, 0xd0, + 0xb7, 0x70, 0xad, 0x58, 0x1e, 0x5b, 0xa, 0x1f, 0x54, 0xa, 0xe, 0xe2, + 0x80, 0xb8, 0xf7, 0xf3, 0xa2, 0x95, 0xa2, 0x8b, 0xbe, 0xf3, 0xcc, 0x8b, + 0x77, 0x1, 0xaa, 0xe0, 0xf7, 0x7b, 0xcc, 0x3, 0xf7, 0x27, 0x55, 0xa, + 0xfb, 0x41, 0xfc, 0x63, 0x15, 0x9c, 0xb7, 0x5, 0x2d, 0xa, 0xe, 0xe2, + 0x80, 0xb8, 0xf8, 0xd, 0xa2, 0x7b, 0xa2, 0xce, 0xed, 0x12, 0xaa, 0xe0, + 0xb0, 0xc6, 0xa, 0x13, 0xde, 0xf7, 0x17, 0xf7, 0x5a, 0x15, 0x9c, 0xb7, + 0x5, 0x13, 0xbe, 0x2d, 0xa, 0xa8, 0xf8, 0x11, 0x23, 0xa, 0xd7, 0xa, + 0xf9, 0x37, 0xe3, 0xa, 0xf7, 0x72, 0xf7, 0x6, 0x2c, 0xa, 0x9d, 0xf8, + 0x19, 0xb7, 0xa, 0xfb, 0x3, 0xf7, 0x23, 0xc5, 0xa, 0x79, 0x91, 0x56, + 0xa, 0x9e, 0x7b, 0x80, 0xa, 0xd7, 0xa, 0xf9, 0x37, 0xe3, 0xa, 0xf7, + 0x18, 0xad, 0xa, 0xf7, 0x3a, 0xef, 0x9f, 0xa, 0x97, 0x98, 0x47, 0xa, + 0x7d, 0x81, 0x9d, 0xa, 0x48, 0xfc, 0xaa, 0x2c, 0xa, 0xe, 0xd7, 0xa, + 0xf9, 0x34, 0xe3, 0xa, 0xad, 0x55, 0xa, 0xaa, 0xfc, 0xb7, 0x2c, 0xa, + 0xe, 0xd7, 0xa, 0xf8, 0x9b, 0xed, 0x1, 0xbc, 0xf2, 0xf2, 0xed, 0x3, + 0xf7, 0x72, 0xf7, 0x6, 0x2c, 0xa, 0xfb, 0x49, 0xf8, 0x5a, 0x58, 0xa, + 0xf7, 0x5d, 0x16, 0x20, 0xa, 0xe, 0x80, 0xa0, 0xf7, 0x46, 0xa0, 0xf8, + 0x6e, 0x77, 0x12, 0xa6, 0xdf, 0xf7, 0xa5, 0xde, 0x17, 0xf7, 0x3, 0xf2, + 0x15, 0xf7, 0xa, 0xe6, 0xf7, 0x5b, 0xf7, 0x4, 0xbb, 0xa1, 0x5f, 0x57, + 0x20, 0x3c, 0xfb, 0x63, 0xfb, 0x6, 0x59, 0x6d, 0xaf, 0xc4, 0x1e, 0xf7, + 0xaf, 0xf7, 0xb5, 0x15, 0xa9, 0x7d, 0x6a, 0x9e, 0x66, 0x1b, 0xfb, 0x1b, + 0xfb, 0x28, 0xfb, 0x35, 0xfb, 0x27, 0x38, 0xb8, 0x4e, 0xf5, 0xf7, 0x2d, + 0xf7, 0x1c, 0xf7, 0x43, 0xf7, 0x5c, 0xec, 0x67, 0xce, 0x59, 0xc1, 0x1f, + 0xf0, 0xb8, 0x6b, 0xa7, 0x28, 0x60, 0x64, 0xac, 0x5b, 0xa9, 0x63, 0x93, + 0x19, 0x68, 0x7a, 0xaf, 0x7d, 0xb3, 0x6b, 0xab, 0x6c, 0x19, 0xfb, 0xf, + 0x55, 0xac, 0x6e, 0xf7, 0x9, 0xbe, 0xaf, 0x5e, 0xa6, 0x5a, 0x94, 0x45, + 0x19, 0xe, 0xbe, 0xa, 0xda, 0xac, 0xa, 0xf7, 0xfd, 0xdc, 0x13, 0x6a, + 0x89, 0xa, 0xc3, 0xa, 0x13, 0xaa, 0x51, 0xa, 0x7b, 0x7, 0xc1, 0x92, + 0x76, 0x7c, 0x1f, 0x13, 0x76, 0x76, 0x4b, 0xfb, 0x74, 0x6c, 0xfb, 0x5, + 0x1e, 0xf7, 0x1b, 0xa2, 0xa, 0xa7, 0x1f, 0x80, 0xa8, 0x57, 0xa, 0x77, + 0x72, 0x98, 0x96, 0x70, 0x1f, 0x13, 0x6a, 0x95, 0x74, 0x72, 0x94, 0x72, + 0xd6, 0xa, 0xa4, 0xa, 0xa6, 0xf7, 0x19, 0x26, 0xa, 0xf7, 0x91, 0xf7, + 0xfc, 0xb7, 0xa, 0xfb, 0x5, 0xf7, 0x26, 0xc5, 0xa, 0x7b, 0x8e, 0x56, + 0xa, 0x9c, 0x7e, 0x80, 0xa, 0xa4, 0xa, 0xf7, 0x9c, 0xad, 0xa, 0xf7, + 0x33, 0xed, 0x9f, 0xa, 0x9d, 0x9a, 0x47, 0xa, 0x77, 0x7f, 0x9d, 0xa, + 0xfc, 0x17, 0xfc, 0x95, 0x26, 0xa, 0xe, 0x80, 0xa0, 0xf8, 0x18, 0xa0, + 0x8c, 0xa0, 0x8b, 0xbe, 0xf3, 0xcc, 0x8b, 0x77, 0x92, 0xa, 0xf7, 0x39, + 0x55, 0xa, 0xfb, 0xbb, 0xfc, 0xa4, 0x26, 0xa, 0xe, 0x80, 0xa0, 0xf8, + 0x21, 0xa0, 0xe7, 0xac, 0xa, 0xa6, 0xdf, 0xf7, 0xa5, 0xdf, 0x13, 0xee, + 0xf7, 0x3d, 0xf8, 0x99, 0x60, 0xa, 0x9c, 0xa6, 0x81, 0x80, 0xa7, 0x1f, + 0x80, 0xa8, 0xa9, 0x7f, 0x9e, 0x1b, 0x43, 0xa, 0x77, 0x74, 0x97, 0x96, + 0x71, 0x1f, 0x13, 0xd6, 0x95, 0x73, 0x71, 0x95, 0x71, 0x6c, 0xa, 0xfb, + 0x22, 0xfc, 0x14, 0x26, 0xa, 0xe, 0x80, 0xa0, 0xf8, 0x25, 0xa0, 0xd7, + 0xed, 0x12, 0xa6, 0xdf, 0xdb, 0xed, 0xea, 0xdf, 0x3e, 0xed, 0x13, 0xfc, + 0xa6, 0xf7, 0x19, 0x26, 0xa, 0xdb, 0xf8, 0x3d, 0x58, 0xa, 0x13, 0xfa, + 0x25, 0xa, 0xf7, 0xd2, 0x80, 0xf7, 0x3, 0xf7, 0xc, 0xcd, 0x53, 0xb9, + 0xf7, 0x16, 0xf7, 0x3, 0x12, 0xf7, 0xaf, 0xf7, 0x3, 0x23, 0xe1, 0x13, + 0xb8, 0xe1, 0xf7, 0x7a, 0x15, 0xf8, 0x8c, 0xb9, 0xfc, 0x8c, 0x6, 0xf7, + 0x8b, 0xf7, 0x2f, 0x15, 0x13, 0xd4, 0x8e, 0xa, 0x8d, 0xfc, 0x4e, 0x15, + 0x8e, 0xa, 0xe, 0x82, 0xa2, 0xf8, 0x28, 0xa1, 0x12, 0xa7, 0xdf, 0xf7, + 0xa5, 0xdf, 0x17, 0xf7, 0x20, 0xa8, 0x15, 0x78, 0x9c, 0x82, 0x97, 0xd7, + 0x1a, 0xd9, 0xd8, 0xf7, 0x62, 0xf7, 0x1f, 0x1e, 0xfb, 0x35, 0xfc, 0x28, + 0x15, 0xf7, 0x52, 0xf8, 0x1c, 0x5, 0xaa, 0x67, 0x88, 0x71, 0x58, 0x1a, + 0x7c, 0x64, 0xfb, 0x9c, 0xfb, 0x47, 0x1e, 0x60, 0x79, 0x15, 0x4b, 0xfb, + 0x17, 0x5, 0xae, 0x6, 0x13, 0xf0, 0xc8, 0xf7, 0x12, 0x5, 0x13, 0x50, + 0xf7, 0x61, 0xf7, 0x0, 0xf7, 0x54, 0xf7, 0x0, 0xcf, 0x6f, 0xc6, 0x44, + 0x9c, 0x1f, 0xc5, 0xf7, 0xb, 0x5, 0x69, 0x6, 0x54, 0xfb, 0x6, 0x5, + 0x13, 0x20, 0xfb, 0x3b, 0xfb, 0x24, 0xfb, 0x34, 0xfb, 0x25, 0x1f, 0x13, + 0x0, 0x53, 0xa1, 0x4c, 0xd5, 0x77, 0x1e, 0xe, 0xa0, 0xa, 0xf7, 0xdd, + 0xf7, 0x77, 0x3b, 0xa, 0xae, 0xf7, 0x9d, 0xb7, 0xa, 0xfb, 0x4, 0xf7, + 0x25, 0xc5, 0xa, 0x7a, 0x8f, 0x56, 0xa, 0x9d, 0x7d, 0x80, 0xa, 0xa0, + 0xa, 0xf7, 0x92, 0xf8, 0x82, 0x7e, 0xa, 0x3b, 0xfc, 0x38, 0x3b, 0xa, + 0xe, 0x82, 0xba, 0x6f, 0x76, 0xf8, 0x4f, 0xc7, 0xf7, 0x3d, 0xa9, 0xa, + 0xe5, 0x13, 0xb0, 0xf7, 0x39, 0xf8, 0x80, 0x15, 0xb2, 0x6, 0x13, 0xbc, + 0x39, 0xa, 0x92, 0xfc, 0x46, 0x53, 0xa, 0x13, 0xac, 0x2e, 0xa, 0x13, + 0x70, 0xa6, 0xa, 0x82, 0xba, 0x6f, 0x76, 0xf8, 0x9b, 0xed, 0x12, 0xb5, + 0xd8, 0xc9, 0xc6, 0xa, 0x13, 0xac, 0xf7, 0xdd, 0xf7, 0x77, 0x53, 0xa, + 0x13, 0xbc, 0x2b, 0xa, 0x13, 0x7c, 0x5d, 0xa, 0x62, 0xa, 0xfb, 0x28, + 0xf7, 0xde, 0x23, 0xa, 0xe2, 0xfb, 0x62, 0xb8, 0xf8, 0xee, 0x77, 0xf7, + 0x87, 0x77, 0x12, 0xf8, 0x16, 0xc7, 0xa, 0xdb, 0x7c, 0x5f, 0xf7, 0x5, + 0x7e, 0x1b, 0x79, 0x3d, 0x7b, 0x83, 0x5b, 0x1f, 0x98, 0xa, 0x9e, 0x4f, + 0xe2, 0xa, 0xaf, 0xfb, 0x32, 0x7a, 0xa, 0x84, 0x84, 0x8f, 0x91, 0x84, + 0x1f, 0x93, 0x81, 0x7f, 0x95, 0x79, 0x96, 0xa, 0x1f, 0x13, 0x70, 0x70, + 0xa, 0x73, 0x99, 0x82, 0x99, 0x83, 0x1f, 0x98, 0x83, 0x98, 0x84, 0x77, + 0xa7, 0xa, 0x6f, 0xf8, 0x3a, 0x7e, 0xa, 0xe, 0xfb, 0x4c, 0x76, 0xf7, + 0x6b, 0x76, 0xf8, 0x2d, 0xb6, 0xf7, 0x86, 0x77, 0x48, 0xa, 0x77, 0x1f, + 0x89, 0x8d, 0x91, 0x9c, 0xdd, 0xf7, 0xce, 0x8e, 0x97, 0x19, 0x13, 0x90, + 0x86, 0x90, 0x58, 0x81, 0x58, 0x84, 0x59, 0x85, 0x19, 0x7a, 0x7, 0xba, + 0x9a, 0x7d, 0x75, 0x7a, 0x84, 0x76, 0x85, 0x75, 0x1f, 0x6a, 0xfb, 0x9, + 0xfb, 0xf, 0xfc, 0x64, 0x76, 0x35, 0x8, 0x6b, 0x83, 0x82, 0xda, 0xa, + 0x74, 0x66, 0x90, 0xb9, 0x9e, 0xa4, 0xe5, 0x93, 0xaf, 0x1f, 0xe, 0xe2, + 0xfb, 0x4d, 0x76, 0xf9, 0x1b, 0x77, 0xe2, 0xed, 0x12, 0xf7, 0x23, 0xc6, + 0xa, 0x54, 0xb3, 0x13, 0xf4, 0xf7, 0x9c, 0xd3, 0x15, 0x6a, 0xf7, 0x3f, + 0x5, 0xd6, 0x7d, 0x5e, 0xf7, 0xf, 0x7e, 0x1b, 0x79, 0x8a, 0x3d, 0x7c, + 0x5b, 0x83, 0x8, 0x13, 0xb8, 0x98, 0xa, 0x9f, 0x43, 0xe2, 0xa, 0xae, + 0xfb, 0x26, 0x7a, 0xa, 0x82, 0x83, 0x93, 0x92, 0x81, 0x1f, 0x92, 0x82, + 0x80, 0x91, 0x7d, 0x96, 0xa, 0x1f, 0x13, 0x74, 0x70, 0xa, 0x75, 0x97, + 0x83, 0x98, 0x83, 0x1f, 0x99, 0x82, 0x9a, 0x84, 0x75, 0xa7, 0xa, 0xfb, + 0xd, 0xf8, 0x79, 0x58, 0xa, 0x13, 0xf8, 0x25, 0xa, 0xd7, 0xa, 0xf8, + 0x58, 0xe3, 0xa, 0xf7, 0x72, 0xf7, 0x6, 0x3f, 0xa, 0x64, 0x84, 0x38, + 0x7b, 0x65, 0x89, 0x19, 0x3e, 0xa, 0xe, 0x6e, 0xa, 0x54, 0x5e, 0x8b, + 0xb7, 0xac, 0xac, 0xe4, 0xab, 0xf7, 0x11, 0x1f, 0xf7, 0x22, 0xde, 0x99, + 0xbc, 0xfb, 0x23, 0x36, 0xb9, 0xf7, 0x31, 0xaa, 0xf5, 0x9b, 0x82, 0xc8, + 0x94, 0x19, 0xc4, 0xa, 0xc3, 0x9f, 0x78, 0x6e, 0x7b, 0x87, 0x77, 0x85, + 0x76, 0x1f, 0x4f, 0xfb, 0x6a, 0x28, 0x50, 0x7e, 0x5b, 0xee, 0xc6, 0x5c, + 0xfb, 0x3e, 0x7a, 0x4d, 0x79, 0x7e, 0x5a, 0x82, 0x19, 0xe, 0xd7, 0xa, + 0xf9, 0x4a, 0x77, 0x1, 0xb0, 0xd7, 0x3, 0xf7, 0x74, 0xd3, 0xa, 0x7e, + 0x88, 0x95, 0x97, 0x9c, 0x94, 0xa0, 0x8d, 0x92, 0x1f, 0xd5, 0xf7, 0xaf, + 0xec, 0xbd, 0x97, 0xb9, 0x2a, 0x59, 0xcc, 0xf7, 0x8e, 0x86, 0x90, 0x57, + 0x7f, 0x57, 0x82, 0x57, 0x85, 0x19, 0x7b, 0x7, 0xa5, 0xb2, 0x82, 0x71, + 0x81, 0x6f, 0xfb, 0x0, 0x6e, 0xfb, 0x1, 0x1f, 0x43, 0x67, 0x7f, 0x5d, + 0xd3, 0xaf, 0x5, 0x62, 0xfb, 0x28, 0x6b, 0xfb, 0xf, 0x81, 0xb5, 0xa, + 0xf8, 0xdf, 0x83, 0xab, 0x73, 0xac, 0xf7, 0xbb, 0xe9, 0xa, 0x78, 0xab, + 0x12, 0xbc, 0xf7, 0x0, 0x13, 0xb4, 0xf9, 0x84, 0xf7, 0x74, 0x15, 0x9f, + 0x89, 0xcd, 0xf7, 0x7a, 0x79, 0x8f, 0x5, 0x37, 0x64, 0x7b, 0x80, 0xfb, + 0x39, 0x1b, 0xcb, 0xf7, 0x77, 0x5, 0x9a, 0x8f, 0x91, 0x9c, 0xa6, 0x1b, + 0xeb, 0x6, 0xf7, 0xc, 0x8b, 0x69, 0x38, 0x1f, 0x9b, 0x6, 0xaa, 0xf7, + 0x2a, 0x5, 0xfc, 0x5, 0x6, 0x7b, 0x71, 0x8f, 0x8e, 0x6f, 0x1f, 0x13, + 0xac, 0x8f, 0x6e, 0x6d, 0x8d, 0x73, 0x1b, 0xfb, 0x5e, 0xfb, 0x53, 0xfb, + 0x5e, 0xfb, 0x88, 0xfb, 0x14, 0xf0, 0x27, 0xf7, 0xc, 0xb2, 0xae, 0x8d, + 0x8d, 0xad, 0x1f, 0x13, 0x74, 0x8d, 0xae, 0xae, 0x8d, 0xb3, 0x1b, 0xf7, + 0xee, 0x6, 0xcc, 0xf7, 0x3a, 0x7b, 0x91, 0x5, 0x49, 0x5b, 0x56, 0x42, + 0xfb, 0x37, 0x1b, 0x46, 0x71, 0x8d, 0xae, 0x99, 0x95, 0xad, 0x90, 0x9f, + 0x1f, 0xbf, 0xf7, 0x52, 0x5, 0xf7, 0x1f, 0xa7, 0x7a, 0x5e, 0x1f, 0x87, + 0x71, 0x8f, 0xa0, 0x85, 0x66, 0x8, 0xfb, 0xba, 0x72, 0x15, 0x13, 0xac, + 0xfb, 0x3, 0x6d, 0x72, 0x4b, 0x21, 0x1b, 0xfb, 0x1f, 0x8a, 0xf7, 0x20, + 0xb6, 0xf7, 0x45, 0xf7, 0x7, 0xf7, 0x8e, 0xf7, 0x42, 0xca, 0xb5, 0x6c, + 0x58, 0x7a, 0x7e, 0x62, 0x84, 0x70, 0x1f, 0xe, 0xf7, 0xca, 0x7f, 0xa0, + 0x76, 0xb5, 0x77, 0x76, 0xf8, 0x41, 0xa2, 0x12, 0x9f, 0xde, 0x13, 0x58, + 0xf7, 0xc3, 0xc3, 0x15, 0x62, 0x9e, 0xb3, 0x70, 0xb8, 0x1b, 0xe0, 0xd6, + 0xcf, 0xb1, 0xb0, 0x1f, 0x80, 0x96, 0x5, 0x5f, 0x52, 0x63, 0x6c, 0x59, + 0x1b, 0x79, 0x54, 0x99, 0xcf, 0xa0, 0x8d, 0xaf, 0x94, 0x99, 0x1f, 0x93, + 0x97, 0xf0, 0x8a, 0xe5, 0xcc, 0x8, 0xb7, 0xab, 0x9e, 0xb6, 0xa6, 0x1a, + 0x92, 0x85, 0xd4, 0x49, 0x61, 0x5c, 0x86, 0x40, 0x3c, 0x1e, 0x93, 0x89, + 0x73, 0xd3, 0x32, 0x1b, 0xfb, 0xe, 0xfb, 0x29, 0xfb, 0x37, 0xfb, 0x1e, + 0x1f, 0x13, 0x38, 0xfb, 0x3, 0xdf, 0x63, 0xc2, 0xd5, 0xae, 0xac, 0xad, + 0xae, 0x1e, 0xfb, 0x5c, 0xc1, 0x15, 0xf7, 0x5, 0xe1, 0xf7, 0x57, 0xe6, + 0xc3, 0x92, 0x61, 0x6e, 0x1e, 0x13, 0x98, 0x66, 0x5a, 0xfb, 0xc1, 0xfb, + 0xe, 0x46, 0x8b, 0xd6, 0xa5, 0x1e, 0xf7, 0xb2, 0xea, 0x15, 0xf7, 0x8, + 0xa9, 0xd7, 0xea, 0xc1, 0x1b, 0xa2, 0x93, 0x70, 0x74, 0x7a, 0x83, 0x5c, + 0x54, 0x60, 0x1f, 0x6a, 0x72, 0x73, 0x84, 0x44, 0x75, 0x8, 0xe, 0x79, + 0xae, 0x80, 0x76, 0xf9, 0x1c, 0xac, 0x8c, 0x77, 0x12, 0xbe, 0x9f, 0xc7, + 0xe3, 0x13, 0x6c, 0xb9, 0xa, 0x9a, 0x85, 0x83, 0x9e, 0x1f, 0x13, 0xac, + 0x81, 0xa4, 0xaa, 0x7f, 0xb2, 0x6d, 0xa, 0x13, 0x9c, 0xb3, 0xf7, 0x5b, + 0x5, 0x74, 0x6, 0x78, 0x80, 0x7a, 0x85, 0x78, 0x1b, 0x78, 0x75, 0x91, + 0x91, 0x7a, 0x1f, 0x13, 0xac, 0x91, 0x79, 0x7d, 0x91, 0x5e, 0x64, 0xa, + 0x13, 0x6c, 0xf7, 0x98, 0xf8, 0x84, 0x52, 0xa, 0xab, 0x93, 0x76, 0xf8, + 0x43, 0xa2, 0xf7, 0x70, 0x77, 0x12, 0xf7, 0x1, 0xd4, 0x8b, 0xf7, 0x28, + 0x25, 0xd7, 0x13, 0xf4, 0xc2, 0xa, 0x99, 0x9a, 0x87, 0x86, 0x99, 0x1f, + 0x86, 0x9a, 0x9b, 0x86, 0x9a, 0x1b, 0xc3, 0xe8, 0xa4, 0xf7, 0x1, 0xb5, + 0x6d, 0xb6, 0x6d, 0xb3, 0x1f, 0x6c, 0xb4, 0x6c, 0xb2, 0xab, 0x1a, 0xbc, + 0xab, 0x94, 0xa1, 0x1e, 0x13, 0xf8, 0xcc, 0xa8, 0x51, 0x52, 0x1f, 0x9b, + 0x6, 0xbb, 0xa, 0x7b, 0x80, 0x90, 0x90, 0x7e, 0x1f, 0x8f, 0x80, 0x7e, + 0x8e, 0x76, 0x1b, 0x21, 0x7d, 0x3b, 0x6c, 0x63, 0xab, 0x5d, 0xaa, 0x60, + 0x1f, 0x13, 0xf4, 0xa8, 0x63, 0xa6, 0x65, 0x6b, 0xb4, 0xa, 0xf7, 0x65, + 0xf7, 0xee, 0x52, 0xa, 0xf7, 0x5b, 0xa0, 0x76, 0xf9, 0x11, 0xdf, 0xa, + 0xf7, 0x8d, 0xc6, 0xa, 0x13, 0xcc, 0xcf, 0xa, 0x51, 0x8f, 0x6c, 0x90, + 0xb6, 0x1a, 0x94, 0x8d, 0x96, 0x8f, 0x98, 0x1e, 0xc7, 0xf7, 0x61, 0xf7, + 0x6f, 0xf7, 0xa2, 0xab, 0xb3, 0x96, 0x93, 0xa6, 0x98, 0x19, 0x13, 0xbc, + 0x9b, 0xfb, 0x51, 0x7, 0x13, 0xcc, 0x7b, 0x7, 0xb3, 0x87, 0xa6, 0x86, + 0x73, 0x1a, 0x84, 0x89, 0x83, 0x87, 0x80, 0x1e, 0x7c, 0x64, 0xfb, 0xc, + 0xfb, 0x1c, 0x5e, 0x53, 0x73, 0xe7, 0x6e, 0xf0, 0x83, 0xad, 0x8, 0x88, + 0x96, 0x8b, 0x94, 0x93, 0x1a, 0xa4, 0xa3, 0x95, 0xb8, 0x1e, 0x13, 0xbc, + 0x9b, 0xfb, 0x83, 0x7, 0x13, 0xcc, 0x7b, 0x7, 0xbf, 0x83, 0x93, 0x8a, + 0x9b, 0x52, 0xd8, 0xfb, 0xa1, 0x18, 0x4b, 0xfb, 0x5e, 0x78, 0x49, 0x67, + 0x7d, 0x5c, 0x87, 0x19, 0xf7, 0x3f, 0xf9, 0x85, 0x15, 0x13, 0xbc, 0x21, + 0xa, 0xf7, 0x5b, 0x8b, 0xaf, 0xf8, 0xd9, 0xaf, 0xf7, 0x70, 0x77, 0x50, + 0xa, 0xf7, 0xe3, 0xf9, 0x46, 0x52, 0xa, 0xab, 0x54, 0x76, 0xf8, 0x50, + 0xc7, 0xf7, 0x7d, 0x77, 0x12, 0xf7, 0xd8, 0xd0, 0x17, 0xba, 0xa, 0xac, + 0xac, 0x79, 0x77, 0xac, 0x1f, 0x74, 0xb2, 0xb2, 0x72, 0xb3, 0xaf, 0xa, + 0x82, 0x8d, 0x85, 0x8e, 0x85, 0x1f, 0x8f, 0x82, 0x90, 0x84, 0x84, 0x1a, + 0x7e, 0x7b, 0x88, 0x7f, 0x81, 0x78, 0x8b, 0xac, 0x71, 0x1e, 0x57, 0xce, + 0x7a, 0x9e, 0x49, 0x99, 0xf7, 0xb6, 0xf7, 0xec, 0x18, 0xca, 0xa, 0xc3, + 0xa1, 0xaa, 0x8e, 0xb1, 0x1b, 0xf7, 0x1c, 0x6, 0x13, 0xa0, 0x38, 0xf7, + 0x10, 0x52, 0xa, 0xfb, 0x4a, 0xa2, 0xf8, 0xa7, 0xa9, 0xf7, 0x8f, 0xa8, + 0x1, 0xa4, 0xdf, 0xf7, 0xd1, 0xdc, 0x3, 0xf7, 0xe, 0xf8, 0x8, 0x15, + 0xf7, 0x4, 0x6, 0x67, 0xfb, 0xe1, 0x5, 0xfb, 0x8, 0x7e, 0x80, 0x39, + 0x4f, 0x1b, 0x85, 0x7e, 0x8f, 0x97, 0x91, 0x8f, 0x90, 0x8e, 0x91, 0x1f, + 0x8f, 0x91, 0x8e, 0x92, 0x93, 0x1a, 0x9c, 0x7c, 0xa0, 0x73, 0x85, 0x64, + 0x89, 0x5a, 0x6d, 0xa4, 0x69, 0xc2, 0xf7, 0x18, 0xb0, 0xf7, 0x72, 0xb2, + 0x90, 0x1e, 0xb2, 0xf7, 0xb9, 0x5, 0xf7, 0xe, 0x6, 0x92, 0xa9, 0x5, + 0xfb, 0x12, 0x6, 0xf7, 0x34, 0x9f, 0x99, 0xe6, 0xcc, 0x1b, 0x97, 0x92, + 0x84, 0x85, 0x85, 0x88, 0x85, 0x87, 0x85, 0x1f, 0x88, 0x86, 0x88, 0x86, + 0x84, 0x1a, 0x72, 0xa2, 0x7d, 0x9c, 0xa5, 0x9a, 0xa0, 0xa5, 0xbe, 0x59, + 0x9d, 0x6d, 0xfb, 0x2, 0x50, 0xfb, 0x20, 0xfb, 0x20, 0x77, 0x1e, 0xfb, + 0x1, 0x6, 0xe, 0x73, 0xf8, 0x95, 0x76, 0xd1, 0xa, 0xe6, 0xf8, 0x80, + 0x15, 0xb4, 0x6, 0xf7, 0x16, 0xf3, 0xe0, 0x23, 0x5, 0xb1, 0x6, 0x33, + 0xf7, 0x3d, 0x5, 0x5a, 0x6, 0xe, 0x73, 0xf8, 0x95, 0x76, 0xd1, 0xa, + 0xf7, 0xd, 0xf7, 0xc5, 0x3, 0xf7, 0x6d, 0xf8, 0x80, 0x7b, 0xa, 0x66, + 0x6, 0xfb, 0x1e, 0x22, 0x2f, 0xf4, 0x5, 0x65, 0x6, 0xe, 0x73, 0xf8, + 0x80, 0xc3, 0xf1, 0x77, 0x1, 0xf7, 0x9, 0xa9, 0x3, 0xf7, 0x9, 0xf9, + 0x1e, 0x15, 0x61, 0x8c, 0xfb, 0x8, 0xf7, 0x19, 0xe1, 0xce, 0xd2, 0xe2, + 0x99, 0x1e, 0x6d, 0x6, 0x87, 0x8a, 0x6b, 0x29, 0x28, 0x1b, 0x28, 0x81, + 0xe1, 0x9b, 0x1f, 0xe, 0x73, 0xf8, 0x90, 0xed, 0x1, 0xf7, 0x63, 0xed, + 0x3, 0xf7, 0x63, 0xf8, 0xc1, 0x58, 0xa, 0xe, 0x73, 0xf8, 0x80, 0xad, + 0x69, 0xf7, 0x39, 0xab, 0xa, 0xf7, 0x39, 0x12, 0xf7, 0x2f, 0xae, 0x68, + 0xf7, 0x3b, 0xfb, 0x18, 0xf7, 0x18, 0xfb, 0x18, 0xf7, 0x39, 0x6a, 0xac, + 0x13, 0xa4, 0x80, 0xf7, 0x2f, 0xf8, 0xe3, 0x15, 0x54, 0xb7, 0x5f, 0xc2, + 0x1e, 0x13, 0x99, 0x0, 0xc2, 0xb9, 0xb7, 0xc2, 0xc2, 0x5d, 0xb8, 0x54, + 0x1f, 0x13, 0x44, 0x80, 0x54, 0x5f, 0x5e, 0x54, 0x1f, 0xae, 0x16, 0xaf, + 0xa8, 0xa9, 0xaf, 0xaf, 0xaa, 0x6d, 0x67, 0x67, 0x6c, 0x6e, 0x67, 0x1e, + 0x13, 0xaa, 0x80, 0xe5, 0xa, 0xe, 0x73, 0xfb, 0x3d, 0xb7, 0xf7, 0x39, + 0x77, 0x1, 0x77, 0xc5, 0x3, 0xc5, 0xb3, 0x15, 0x6e, 0x71, 0x5a, 0x44, + 0x62, 0x1a, 0x59, 0xa3, 0x76, 0xaa, 0xbb, 0xe8, 0xb2, 0xb4, 0xa3, 0x1e, + 0x75, 0x9c, 0x5, 0x6f, 0x76, 0x43, 0x72, 0x74, 0x1b, 0x7d, 0x81, 0x94, + 0x9f, 0xb3, 0xa2, 0xc5, 0xa5, 0xb1, 0x1f, 0xe, 0x73, 0xf8, 0x9c, 0xf2, + 0x12, 0xef, 0xa2, 0xa, 0xa8, 0x1f, 0x13, 0x80, 0x80, 0xa7, 0x57, 0xa, + 0x78, 0x75, 0x95, 0x96, 0x72, 0x1f, 0x96, 0x72, 0x70, 0x96, 0x70, 0xd6, + 0xa, 0x73, 0xf8, 0x82, 0xf7, 0x3e, 0x1, 0xe8, 0xf8, 0x1d, 0x3, 0xe8, + 0xad, 0xa, 0xf7, 0x36, 0xee, 0x9f, 0xa, 0x9a, 0x99, 0x47, 0xa, 0x7a, + 0x80, 0x9d, 0xa, 0x9c, 0xfb, 0x2d, 0x5e, 0xa, 0xe, 0xf7, 0x59, 0xad, + 0x69, 0xb9, 0x1, 0x85, 0xf7, 0x59, 0x15, 0xf8, 0x89, 0x6, 0x95, 0xad, + 0x5, 0xfc, 0x89, 0x6, 0xe, 0xf8, 0xa8, 0xf7, 0x59, 0xb1, 0x65, 0xb9, + 0x1, 0x85, 0xf7, 0x59, 0x15, 0xfa, 0xd, 0x6, 0x96, 0xb1, 0x5, 0xfe, + 0xd, 0x6, 0xe, 0x73, 0x91, 0xa, 0xf7, 0x3f, 0xcb, 0x4b, 0xf7, 0x5, + 0x13, 0xd0, 0xf7, 0xca, 0xf9, 0x1d, 0x15, 0x79, 0xa, 0xb9, 0x93, 0xb5, + 0xa0, 0x80, 0x96, 0x7f, 0x95, 0x1e, 0x13, 0xe0, 0x7e, 0x96, 0x7e, 0x93, + 0x9d, 0xbd, 0xa, 0xe, 0x73, 0x91, 0xa, 0xf7, 0x44, 0xf7, 0x6, 0x4b, + 0xcb, 0x13, 0xe0, 0xf7, 0x34, 0xf8, 0x48, 0x15, 0xea, 0xa, 0xc8, 0x9c, + 0xa, 0xaa, 0x69, 0x83, 0x5c, 0x84, 0x61, 0x76, 0x96, 0x81, 0x97, 0x81, + 0x1e, 0x13, 0xd0, 0x98, 0x80, 0x99, 0x82, 0x79, 0x1a, 0x66, 0x54, 0x68, + 0x77, 0x7e, 0x1e, 0xe, 0x73, 0xfb, 0x15, 0xf7, 0x7a, 0x12, 0xd2, 0xc0, + 0xa, 0x13, 0xc0, 0xb7, 0xfb, 0x4, 0x15, 0x6b, 0xa, 0x74, 0x98, 0x7f, + 0x98, 0x81, 0x1e, 0x13, 0xa0, 0x96, 0x82, 0x96, 0x82, 0x7b, 0x82, 0xa, + 0xe, 0xf7, 0x5b, 0x91, 0xa, 0xf7, 0x3a, 0xcb, 0x4b, 0xf7, 0x4, 0xec, + 0xcb, 0x4b, 0xf7, 0x4, 0x13, 0xd4, 0xf7, 0xc5, 0xf9, 0x1d, 0x15, 0x79, + 0xa, 0xb8, 0x93, 0xb5, 0xa2, 0x7e, 0x97, 0x7e, 0x95, 0x1e, 0x13, 0xe4, + 0x80, 0x94, 0x80, 0x94, 0x9b, 0xbd, 0xa, 0xf7, 0x65, 0x16, 0x79, 0xa, + 0xb8, 0x93, 0xb5, 0xa3, 0x7d, 0x96, 0x7e, 0x96, 0x1e, 0x13, 0xd8, 0x80, + 0x94, 0x81, 0x93, 0x9b, 0xbd, 0xa, 0xe, 0xf7, 0x5b, 0x91, 0xa, 0xf7, + 0x46, 0xc0, 0xa, 0xec, 0xc0, 0xa, 0x13, 0xe4, 0xf7, 0x34, 0xf8, 0x48, + 0x15, 0x59, 0xa, 0x75, 0x96, 0x80, 0x97, 0x81, 0x1e, 0x13, 0xd8, 0x97, + 0x81, 0x98, 0x82, 0x7a, 0x82, 0xa, 0xf7, 0x6e, 0x7a, 0x15, 0x59, 0xa, + 0x77, 0x94, 0x80, 0x96, 0x82, 0x1e, 0x13, 0xd4, 0x98, 0x80, 0x9a, 0x82, + 0x78, 0x82, 0xa, 0xe, 0xf7, 0x5b, 0xfb, 0x15, 0xf7, 0x7a, 0x12, 0xdf, + 0xc0, 0xa, 0xec, 0xc0, 0xa, 0x13, 0xd0, 0xc4, 0xfb, 0x4, 0x15, 0x6b, + 0xa, 0x75, 0x97, 0x7f, 0x97, 0x81, 0x1e, 0x13, 0xb0, 0x97, 0x81, 0x97, + 0x83, 0x7a, 0x82, 0xa, 0xf7, 0x65, 0x16, 0x6b, 0xa, 0x73, 0x99, 0x80, + 0x98, 0x80, 0x1e, 0x13, 0xa8, 0x96, 0x82, 0x95, 0x83, 0x7b, 0x82, 0xa, + 0xe, 0xf8, 0x3e, 0xa0, 0xf7, 0x6f, 0x77, 0x12, 0xf7, 0xb2, 0xe4, 0x17, + 0xf7, 0x31, 0xfb, 0x33, 0x15, 0xa1, 0x6, 0xbb, 0xf7, 0x66, 0x97, 0xc1, + 0xb2, 0xf7, 0x1, 0xa9, 0xb7, 0x19, 0x81, 0x8e, 0x85, 0xb5, 0xb7, 0x1a, + 0xa7, 0x8e, 0xa9, 0x91, 0xa0, 0x1e, 0xbc, 0xa7, 0x82, 0x82, 0xa0, 0x1f, + 0x84, 0x9c, 0x97, 0x85, 0x9a, 0x1b, 0xa8, 0x9b, 0xa0, 0xa0, 0x1f, 0x13, + 0xe0, 0x9f, 0x7c, 0x9f, 0x6c, 0x72, 0x7e, 0x84, 0x83, 0x7a, 0x1e, 0x84, + 0x7a, 0x75, 0x83, 0x5f, 0x1b, 0x96, 0xc3, 0x9d, 0xa7, 0x9a, 0x9f, 0x8, + 0x9a, 0x9f, 0x97, 0x98, 0xa5, 0x1a, 0xb0, 0x77, 0x9e, 0x76, 0x74, 0x72, + 0x77, 0x67, 0x7a, 0x8e, 0x7f, 0x8d, 0x7e, 0x1e, 0x8d, 0x81, 0x8d, 0x7f, + 0x7c, 0x1a, 0x78, 0x88, 0x6f, 0x84, 0x66, 0x1e, 0x60, 0x75, 0x92, 0x93, + 0x79, 0x1f, 0x92, 0x7a, 0x7e, 0x93, 0x72, 0x1b, 0x6c, 0x7c, 0x77, 0x77, + 0x76, 0x9b, 0x76, 0xa8, 0x9c, 0x99, 0x93, 0x93, 0x9e, 0x1f, 0x93, 0x9e, + 0xa4, 0x92, 0xb3, 0x1b, 0x7f, 0x45, 0x73, 0x55, 0x65, 0x63, 0x99, 0xfb, + 0x20, 0x76, 0x56, 0x61, 0xfb, 0x78, 0x8, 0xe, 0xfb, 0x57, 0x76, 0xf7, + 0x3e, 0xd3, 0x74, 0x76, 0xb2, 0x76, 0xf8, 0x58, 0xd3, 0xf7, 0x3e, 0x77, + 0x12, 0xd8, 0xe0, 0xf7, 0x39, 0xe0, 0x13, 0x9f, 0xf7, 0x30, 0x79, 0x15, + 0x7b, 0x5b, 0x4c, 0x4a, 0x5b, 0x1a, 0x79, 0x99, 0x78, 0x9e, 0xaa, 0xa0, + 0xa3, 0xdb, 0xab, 0x8e, 0xab, 0x94, 0xa9, 0x1e, 0xc2, 0xb8, 0x6f, 0xaf, + 0x1b, 0xa0, 0x9e, 0x9a, 0xa0, 0x9f, 0x78, 0x9b, 0x78, 0x1f, 0x66, 0x67, + 0x71, 0x50, 0x1b, 0x9b, 0xb3, 0x9e, 0xb5, 0xb0, 0xa4, 0x8, 0x84, 0x9d, + 0x88, 0x9d, 0x9e, 0x1a, 0xd0, 0xb3, 0xee, 0xc3, 0xb4, 0x1e, 0x7f, 0x9e, + 0x85, 0x9a, 0xa2, 0x1a, 0x9c, 0x8f, 0x9c, 0x8f, 0x9b, 0x1e, 0xc9, 0xb1, + 0x71, 0xae, 0x1b, 0x9f, 0x9f, 0x9a, 0xa0, 0x9e, 0x77, 0x9c, 0x79, 0x1f, + 0x66, 0x5b, 0x6f, 0x5c, 0x1b, 0x9b, 0xbb, 0xca, 0xcc, 0xbb, 0x1a, 0x9d, + 0x7d, 0x9e, 0x78, 0x6c, 0x76, 0x73, 0x3b, 0x1e, 0x13, 0xcf, 0x6b, 0x88, + 0x6b, 0x82, 0x6d, 0x1e, 0x54, 0x5e, 0xa7, 0x67, 0x1b, 0x76, 0x78, 0x7c, + 0x76, 0x1f, 0x13, 0xaf, 0x77, 0x9e, 0x7b, 0x9e, 0x1e, 0xb0, 0xaf, 0xa5, + 0xc6, 0x1b, 0x7b, 0x63, 0x78, 0x61, 0x66, 0x72, 0x8, 0x92, 0x79, 0x8e, + 0x79, 0x78, 0x1a, 0x46, 0x63, 0x28, 0x53, 0x62, 0x1e, 0x13, 0xcf, 0x97, + 0x78, 0x91, 0x7c, 0x74, 0x1a, 0x7a, 0x87, 0x7a, 0x87, 0x7b, 0x1e, 0x4d, + 0x65, 0xa5, 0x68, 0x1b, 0x13, 0x9f, 0x77, 0x77, 0x7c, 0x76, 0x78, 0x9f, + 0x7a, 0x9d, 0x1f, 0xb0, 0xbb, 0xa7, 0xba, 0x1b, 0xe, 0x84, 0xf7, 0x68, + 0x76, 0xad, 0x76, 0xf7, 0x87, 0x77, 0xad, 0x77, 0x12, 0xbe, 0xf7, 0x8a, + 0x13, 0x98, 0xc0, 0xf7, 0xdb, 0x15, 0x13, 0x58, 0x47, 0xc1, 0x54, 0xcf, + 0xce, 0xc1, 0xc3, 0xce, 0x1e, 0x13, 0xa8, 0xce, 0x55, 0xc0, 0x47, 0x47, + 0x56, 0x56, 0x48, 0x1e, 0xe, 0xf8, 0xa8, 0x80, 0xef, 0x12, 0xc4, 0xf7, + 0x3, 0x35, 0xef, 0xf7, 0x3b, 0xef, 0x2c, 0xf7, 0x3, 0xf7, 0x2c, 0xef, + 0x49, 0xf7, 0x3, 0x13, 0xaa, 0xdd, 0xb2, 0x15, 0x8f, 0xa, 0x13, 0xd2, + 0xf7, 0x9f, 0x16, 0x8f, 0xa, 0x13, 0xcc, 0xf7, 0xa0, 0x16, 0x6f, 0xa0, + 0x75, 0xa7, 0xa7, 0xa2, 0xa1, 0xa7, 0xa7, 0x74, 0xa1, 0x6f, 0x6f, 0x76, + 0x75, 0x6f, 0x1e, 0xe, 0xf9, 0x17, 0xb0, 0xa, 0xcb, 0xd0, 0xa, 0x75, + 0xd0, 0xa, 0xb1, 0xd0, 0xa, 0x13, 0xb5, 0xe0, 0xf9, 0x42, 0xf7, 0x9, + 0x30, 0xa, 0xfc, 0x27, 0xbc, 0x30, 0xa, 0xfb, 0xeb, 0xf8, 0x11, 0x6a, + 0xa, 0x1e, 0x13, 0xb6, 0xe0, 0x2f, 0xa, 0x13, 0x6e, 0xe0, 0x53, 0xfc, + 0x33, 0x15, 0xb5, 0x6, 0xf8, 0xad, 0xf9, 0x48, 0x5, 0x61, 0x6, 0xe, + 0x73, 0xb0, 0xf8, 0x2, 0x1, 0xbe, 0xf7, 0x7a, 0x3, 0xbe, 0xf7, 0x6c, + 0x68, 0xa, 0x96, 0x63, 0xef, 0x6c, 0xc8, 0x1f, 0xf7, 0x12, 0xf7, 0x16, + 0x9e, 0xaa, 0x9c, 0x69, 0xa, 0xe, 0x73, 0xce, 0xa, 0xc7, 0xf7, 0x72, + 0x3, 0xf7, 0x5a, 0xf7, 0x73, 0x15, 0xfb, 0x12, 0xfb, 0x16, 0x77, 0x6c, + 0x7a, 0x44, 0xa, 0x80, 0xb4, 0x27, 0xaa, 0x4e, 0x1f, 0xe, 0xfb, 0x52, + 0x96, 0x76, 0xf9, 0x42, 0x77, 0x1, 0x82, 0x81, 0x15, 0xb7, 0x6, 0xf7, + 0x36, 0xf9, 0x42, 0x5, 0x5c, 0x6, 0xe, 0x8b, 0xb8, 0xf7, 0x65, 0xb1, + 0xe1, 0xb1, 0xf7, 0x6b, 0xb0, 0x1, 0xf7, 0x4e, 0xf7, 0x1, 0xf7, 0x8a, + 0xa2, 0x3, 0xce, 0xf7, 0x92, 0x15, 0xfb, 0x41, 0xf4, 0x3a, 0xf6, 0xf6, + 0xf7, 0x12, 0xba, 0xdf, 0xbf, 0x1e, 0x7a, 0x94, 0x5, 0x53, 0x63, 0x26, + 0x64, 0x57, 0x1b, 0xfb, 0x13, 0x58, 0xbf, 0xf7, 0x31, 0x1f, 0xf7, 0xac, + 0x6, 0x97, 0xb1, 0x5, 0xfb, 0xb7, 0x6, 0xa5, 0x94, 0xab, 0x94, 0xa7, + 0x1e, 0xf7, 0xb5, 0x6, 0x99, 0xb1, 0x5, 0xfb, 0xb5, 0x6, 0xd5, 0x97, + 0xe2, 0xf7, 0x21, 0xf1, 0x1b, 0xf7, 0x6, 0x91, 0x52, 0x2e, 0x1f, 0xa2, + 0xf7, 0x22, 0x6, 0x9e, 0x63, 0x79, 0xa5, 0x2c, 0x1b, 0x52, 0xfb, 0x44, + 0x53, 0xfb, 0x58, 0x49, 0x1f, 0x28, 0x6, 0x7e, 0x65, 0x5, 0xeb, 0x6, + 0x83, 0x6e, 0x83, 0x6f, 0x89, 0x6e, 0x8, 0x4a, 0x6, 0x7e, 0x65, 0x5, + 0xe, 0xf9, 0x3, 0xf7, 0x8d, 0x9f, 0x8a, 0x76, 0xf8, 0x16, 0x9f, 0x12, + 0xf7, 0x3b, 0xd2, 0xf7, 0x8e, 0xa5, 0xf7, 0xd0, 0xd2, 0x13, 0xbc, 0xf7, + 0x9, 0xf7, 0x8d, 0x15, 0xf7, 0x3f, 0x9f, 0x6, 0x57, 0x91, 0x8d, 0x95, + 0xbb, 0x1a, 0xf7, 0xc0, 0xbd, 0x7, 0xb4, 0x9c, 0x6c, 0x66, 0x94, 0x1f, + 0x9f, 0xe3, 0xfb, 0xed, 0x33, 0x9f, 0x6, 0xb0, 0x94, 0x9c, 0xaa, 0xb5, + 0x1b, 0xbc, 0xfb, 0xc0, 0x6, 0x5b, 0x8d, 0x81, 0x57, 0x85, 0x1e, 0xf7, + 0xd3, 0x77, 0x15, 0xf7, 0x17, 0x9f, 0x6, 0x5e, 0x8f, 0x83, 0xa6, 0xb7, + 0x1a, 0xf7, 0x65, 0x8d, 0x7, 0x13, 0x7c, 0xf7, 0x29, 0xfb, 0xc6, 0x5, + 0x96, 0x6, 0xf7, 0x2c, 0xf7, 0xc8, 0x5, 0x8d, 0xfb, 0x72, 0x6, 0x13, + 0xbc, 0x5b, 0x8e, 0x81, 0x57, 0x85, 0x1e, 0x77, 0xf7, 0x3e, 0x9f, 0x7, + 0x57, 0x91, 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0x89, 0x7, 0xae, 0x97, 0x9d, + 0xb7, 0x8d, 0x1e, 0x9f, 0x24, 0x7, 0xfb, 0x34, 0xfb, 0xc9, 0xfb, 0x2e, + 0xf7, 0xc9, 0x5, 0xfb, 0xd, 0x77, 0x6, 0xa8, 0xa7, 0x77, 0x6d, 0x97, + 0x1f, 0xfb, 0x83, 0x7, 0x5f, 0x83, 0x70, 0x5f, 0x87, 0x1e, 0xe, 0xf7, + 0xd2, 0xe1, 0xf7, 0x70, 0x15, 0xf8, 0x96, 0xb5, 0xfc, 0x96, 0x6, 0xe, + 0xfb, 0x63, 0xa3, 0x73, 0xf7, 0x4, 0xf3, 0x76, 0xf8, 0x2c, 0xab, 0xf7, + 0x7b, 0xa1, 0x12, 0x13, 0xb8, 0xb8, 0xf8, 0x20, 0x15, 0xe2, 0x6, 0x81, + 0x75, 0x53, 0xfb, 0xb3, 0x74, 0xfb, 0x3, 0x8, 0x55, 0x80, 0x70, 0x22, + 0x54, 0x1b, 0x77, 0x87, 0x8e, 0x95, 0x90, 0x8e, 0x92, 0x8e, 0x93, 0x1f, + 0x13, 0x78, 0x8d, 0x91, 0x8c, 0x91, 0x91, 0x1a, 0x98, 0x82, 0xa3, 0x70, + 0x70, 0x7e, 0x68, 0x7c, 0x7a, 0x98, 0x5e, 0xcc, 0xf7, 0x9, 0xc3, 0xf7, + 0x34, 0xf7, 0xf, 0xa7, 0x1e, 0xd3, 0xf7, 0xd4, 0x5, 0xf7, 0x2f, 0x6, + 0x97, 0x8f, 0x87, 0x86, 0x88, 0x8b, 0x87, 0x8a, 0x88, 0x1f, 0x6e, 0x20, + 0x53, 0xfb, 0x52, 0x66, 0x1a, 0x6c, 0x9d, 0x77, 0xaa, 0xb8, 0xb7, 0xb9, + 0xc6, 0xb5, 0x1e, 0x7b, 0x94, 0x5, 0x78, 0x7b, 0x61, 0x59, 0x78, 0x1b, + 0x86, 0x84, 0x8d, 0x94, 0x9a, 0xe3, 0xf7, 0xce, 0x92, 0xa7, 0x1f, 0x90, + 0x9e, 0x8c, 0x91, 0x8a, 0x8e, 0x86, 0x8e, 0x18, 0x85, 0x80, 0x89, 0x89, + 0x7b, 0x1f, 0x89, 0x7b, 0x75, 0x89, 0x6f, 0x1b, 0xfb, 0x2a, 0x6, 0xf7, + 0x16, 0xb0, 0xa7, 0xf0, 0xea, 0x1b, 0x9f, 0x9a, 0x86, 0x80, 0x86, 0x88, + 0x87, 0x88, 0x85, 0x1f, 0x88, 0x85, 0x87, 0x83, 0x7d, 0x1a, 0x70, 0x9b, + 0x7d, 0xa0, 0x9f, 0xa5, 0x99, 0xb2, 0xba, 0x55, 0xa1, 0x5d, 0xfb, 0x37, + 0x58, 0xfb, 0x31, 0x2b, 0x6f, 0x1e, 0x34, 0x6, 0xe, 0xfb, 0x60, 0xa4, + 0xf7, 0x53, 0x76, 0xf8, 0x29, 0xab, 0xf7, 0x7c, 0xa1, 0x12, 0xfb, 0x21, + 0xd3, 0x17, 0xf7, 0x6c, 0xf8, 0x40, 0x15, 0xd2, 0x9d, 0xb0, 0xf7, 0x35, + 0xf7, 0x1, 0x1b, 0x13, 0xf8, 0xa9, 0x97, 0x7d, 0x82, 0x1f, 0x86, 0x7f, + 0x81, 0x7d, 0x1a, 0x85, 0x8d, 0x86, 0x8e, 0x85, 0x1e, 0x8e, 0x85, 0x8e, + 0x84, 0x89, 0x85, 0x67, 0xfb, 0x24, 0x18, 0xfb, 0xea, 0x6b, 0x15, 0xe4, + 0x6, 0x87, 0x79, 0x5f, 0xfb, 0x69, 0x64, 0xfb, 0x4e, 0x8, 0x4e, 0x7e, + 0x70, 0x2a, 0x57, 0x1b, 0x75, 0x88, 0x8f, 0x94, 0x90, 0x8e, 0x92, 0x8d, + 0x92, 0x1f, 0x8d, 0x91, 0x8d, 0x91, 0x92, 0x1a, 0x9e, 0x7c, 0x9c, 0x77, + 0x6b, 0x82, 0x6c, 0x77, 0x7e, 0x94, 0x5b, 0xd1, 0xea, 0xce, 0xf7, 0x3, + 0xf7, 0x47, 0xb3, 0x1e, 0xd0, 0xf7, 0xca, 0x5, 0xf7, 0x3a, 0x6, 0x7a, + 0x35, 0x4c, 0xfb, 0x67, 0x53, 0x1a, 0x6a, 0x9e, 0x78, 0xa7, 0xad, 0xb0, + 0x9c, 0xe3, 0xc9, 0x1e, 0x7b, 0x94, 0x5, 0x70, 0x74, 0x67, 0x61, 0x79, + 0x1b, 0x86, 0x84, 0x8d, 0x95, 0x1f, 0x13, 0x30, 0xa1, 0xf7, 0x1d, 0xf8, + 0xc0, 0x94, 0xac, 0x1e, 0x8c, 0x90, 0x8c, 0x90, 0x8f, 0x1a, 0x90, 0x89, + 0x8f, 0x88, 0x87, 0x85, 0x88, 0x89, 0x84, 0x1e, 0x88, 0x84, 0x84, 0x88, + 0x83, 0x1b, 0x83, 0x7d, 0x8e, 0x8e, 0x7b, 0x1f, 0x8d, 0x7b, 0x7a, 0x8e, + 0x7d, 0x1b, 0xfb, 0x2e, 0x4a, 0xfb, 0x1e, 0xfb, 0x8, 0x6b, 0x1f, 0x30, + 0x6, 0xe, 0x79, 0x9d, 0xf8, 0x3f, 0x98, 0xf7, 0x68, 0x9c, 0x91, 0x92, + 0x6, 0xfb, 0x64, 0x8f, 0xf8, 0x6c, 0x8d, 0x7, 0x1e, 0xa0, 0x39, 0x63, + 0xff, 0xc, 0x9, 0xaa, 0xa, 0xd6, 0xb, 0xf8, 0x88, 0x14, 0xf7, 0xf9, + 0x15, 0xb0, 0x13, 0x0, 0xcd, 0x2, 0x0, 0x1, 0x0, 0x13, 0x0, 0x17, + 0x0, 0x31, 0x0, 0x34, 0x0, 0x61, 0x0, 0x67, 0x0, 0x9c, 0x0, 0xa5, + 0x0, 0xb6, 0x0, 0xbf, 0x0, 0xf3, 0x1, 0xf, 0x1, 0x1b, 0x1, 0x27, + 0x1, 0x2c, 0x1, 0x4e, 0x1, 0x53, 0x1, 0x59, 0x1, 0x6b, 0x1, 0x72, + 0x1, 0x88, 0x1, 0xa2, 0x1, 0xb8, 0x1, 0xdf, 0x1, 0xf3, 0x2, 0x2, + 0x2, 0x21, 0x2, 0x2a, 0x2, 0x37, 0x2, 0x57, 0x2, 0x63, 0x2, 0x6e, + 0x2, 0x85, 0x2, 0x99, 0x2, 0xae, 0x2, 0xbd, 0x2, 0xe3, 0x2, 0xea, + 0x2, 0xef, 0x2, 0xf7, 0x3, 0x37, 0x3, 0x53, 0x3, 0x62, 0x3, 0x71, + 0x3, 0x7e, 0x3, 0x8f, 0x3, 0xa0, 0x3, 0xae, 0x3, 0xe7, 0x4, 0x1f, + 0x4, 0x2c, 0x4, 0x32, 0x4, 0x3f, 0x4, 0x44, 0x4, 0x4c, 0x4, 0x51, + 0x4, 0x55, 0x4, 0x61, 0x4, 0x6a, 0x4, 0x71, 0x4, 0x7f, 0x4, 0x8d, + 0x4, 0x9d, 0x4, 0xa7, 0x4, 0xb1, 0x4, 0xbb, 0x4, 0xc8, 0x4, 0xd4, + 0x4, 0xf9, 0x5, 0x3, 0x5, 0xa, 0x5, 0x2d, 0x5, 0x40, 0x5, 0x53, + 0x5, 0x5e, 0x5, 0x64, 0x5, 0x6c, 0x5, 0x8c, 0x5, 0xac, 0x5, 0xcc, + 0x5, 0xdd, 0x5, 0xe2, 0x5, 0xec, 0x5, 0xf6, 0x6, 0x2, 0x6, 0x1e, + 0x6, 0x26, 0x6, 0x36, 0x6, 0x46, 0x6, 0x55, 0x6, 0x64, 0x6, 0x6d, + 0x6, 0x76, 0x6, 0x7b, 0x6, 0x8b, 0x6, 0x9b, 0x6, 0x9f, 0x6, 0xa7, + 0x6, 0xaf, 0x6, 0xc3, 0x6, 0xd6, 0x6, 0xe2, 0x6, 0xe8, 0x6, 0xec, + 0x6, 0xf7, 0x7, 0xa, 0x7, 0x1d, 0x7, 0x22, 0x7, 0x2d, 0x7, 0x36, + 0x7, 0x48, 0x7, 0x5a, 0x7, 0x5f, 0x7, 0x67, 0x7, 0x6f, 0x7, 0x75, + 0x7, 0x86, 0x7, 0x97, 0x7, 0xa1, 0x7, 0xab, 0x7, 0xb5, 0x7, 0xbc, + 0x7, 0xc1, 0x7, 0xc6, 0x7, 0xcb, 0x7, 0xcf, 0x7, 0xd3, 0x7, 0xd7, + 0x7, 0xe3, 0x7, 0xee, 0x7, 0xf3, 0x7, 0xfc, 0x8, 0x7, 0x8, 0x16, + 0x8, 0x19, 0x8, 0x22, 0x8, 0x26, 0x8, 0x2d, 0x8, 0x33, 0x8, 0x3a, + 0x8, 0x41, 0x8, 0x46, 0x8, 0x4b, 0x8, 0x59, 0x8, 0x67, 0x8, 0x75, + 0x8, 0x83, 0x8, 0x91, 0x8, 0x9f, 0x8, 0xab, 0x8, 0xaf, 0x8, 0xb3, + 0x8, 0xc0, 0x8, 0xcd, 0x8, 0xda, 0x8, 0xe7, 0x8, 0xf4, 0x8, 0xfc, + 0x9, 0x4, 0x9, 0xb, 0x9, 0x10, 0x9, 0x1c, 0x9, 0x28, 0x9, 0x34, + 0x9, 0x3a, 0x9, 0x3e, 0x9, 0x42, 0x9, 0x4d, 0x9, 0x55, 0x9, 0x60, + 0x9, 0x6b, 0x9, 0x6f, 0x9, 0x76, 0x9, 0x7d, 0x9, 0x84, 0x9, 0x8b, + 0x9, 0x90, 0x9, 0x95, 0x9, 0x9a, 0x9, 0xa4, 0x9, 0xae, 0x9, 0xb8, + 0x9, 0xbb, 0x9, 0xbf, 0x9, 0xc8, 0x9, 0xd1, 0x9, 0xda, 0x9, 0xe3, + 0x9, 0xec, 0x9, 0xf5, 0x9, 0xfe, 0xa, 0x7, 0xa, 0x10, 0xa, 0x19, + 0xa, 0x1f, 0xa, 0x25, 0xa, 0x2b, 0xa, 0x31, 0xa, 0x37, 0xa, 0x3b, + 0xa, 0x41, 0xa, 0x46, 0xa, 0x4a, 0xa, 0x4e, 0xa, 0x52, 0x70, 0xa1, + 0x75, 0xa6, 0xa6, 0xa1, 0xa1, 0xa6, 0xa6, 0x75, 0xa1, 0x70, 0x70, 0x75, + 0x75, 0x70, 0x1e, 0xb, 0x20, 0xa, 0x25, 0xa, 0x61, 0xa, 0x71, 0xb5, + 0xb6, 0xad, 0xaf, 0xd5, 0xc7, 0x1e, 0x38, 0xa, 0x47, 0x87, 0x7b, 0x52, + 0x5, 0x89, 0x6, 0xa4, 0x6a, 0xb2, 0x5f, 0xa, 0x1e, 0xb, 0x15, 0x21, + 0xa, 0x15, 0xfb, 0x52, 0xf7, 0x1a, 0x54, 0xe0, 0xae, 0xa, 0xf7, 0x84, + 0x4f, 0xa, 0xfb, 0x6e, 0xfb, 0x71, 0x1e, 0xf4, 0x16, 0xd8, 0xeb, 0xf7, + 0xdd, 0xf7, 0x5e, 0xef, 0xaa, 0x48, 0xfb, 0x17, 0x2e, 0x2b, 0xfb, 0xdb, + 0xfb, 0x5f, 0xfb, 0x16, 0x8b, 0xf7, 0x1a, 0xd9, 0x1e, 0xb, 0xf7, 0x5c, + 0x16, 0x20, 0xa, 0xe, 0x15, 0x38, 0xb8, 0x4e, 0xf5, 0xf7, 0x2d, 0xf7, + 0x1d, 0xf7, 0x49, 0xf7, 0xf, 0xcd, 0x6c, 0xdd, 0xfb, 0x8, 0xfb, 0x26, + 0xfb, 0x28, 0xfb, 0x35, 0xfb, 0x27, 0x1e, 0xdf, 0x8a, 0x15, 0xc9, 0xe6, + 0xf7, 0x76, 0xf7, 0x4, 0xb8, 0xa4, 0x7d, 0xfb, 0x5, 0x5a, 0x3c, 0xfb, + 0x7e, 0xfb, 0x6, 0x59, 0x6d, 0xaa, 0xe6, 0x1e, 0xb, 0x35, 0xa, 0x83, + 0x68, 0x7c, 0x19, 0x45, 0xa, 0xb, 0x36, 0xa, 0xaa, 0xa2, 0x7c, 0x4d, + 0x2e, 0x2c, 0xfb, 0x67, 0x21, 0x70, 0x6a, 0x9d, 0xc0, 0x1e, 0xb, 0x3a, + 0xa, 0xeb, 0xa, 0x37, 0xa, 0xd2, 0xa, 0xb, 0xf7, 0x88, 0x9b, 0x6, + 0x58, 0x8f, 0x7c, 0xa1, 0xa6, 0x1a, 0x9e, 0x92, 0xa1, 0x90, 0x9f, 0x1e, + 0xf5, 0xf8, 0x1b, 0xa3, 0xe1, 0x90, 0xa0, 0xce, 0x94, 0x19, 0x93, 0xa, + 0xbc, 0x85, 0x9c, 0x76, 0x6f, 0x1a, 0x79, 0x87, 0x76, 0x85, 0x76, 0x1e, + 0xfb, 0x0, 0xfc, 0x1b, 0x73, 0x36, 0x87, 0x77, 0x4a, 0x81, 0x19, 0xb, + 0x72, 0xa, 0x70, 0xa8, 0xd8, 0x9d, 0x90, 0x42, 0xa, 0x79, 0x87, 0x9a, + 0x97, 0x8d, 0x8c, 0x94, 0xe6, 0xf7, 0xfb, 0x1f, 0x56, 0x81, 0x59, 0x82, + 0x59, 0x85, 0x8, 0xb, 0x3f, 0xa, 0x5, 0x84, 0x64, 0x2c, 0x79, 0x71, + 0x1b, 0x3e, 0xa, 0xb, 0x3d, 0xa, 0xb7, 0x70, 0xad, 0x58, 0x5b, 0xa, + 0x1e, 0x54, 0xa, 0xb, 0x2b, 0xa, 0x5d, 0xa, 0xb, 0xe5, 0x4d, 0xb9, + 0x58, 0xfb, 0x1, 0x3a, 0xfb, 0x11, 0x27, 0x1e, 0xc9, 0x5a, 0x15, 0xd1, + 0xc0, 0xf7, 0x4c, 0xd6, 0xb5, 0x94, 0x65, 0x6f, 0x4e, 0x56, 0xfb, 0x4f, + 0x3e, 0x6a, 0x7b, 0xa9, 0xa9, 0x1e, 0xb, 0x6a, 0xa, 0x2f, 0xa, 0xb, + 0x15, 0xb2, 0x6, 0x39, 0xa, 0xb, 0x4e, 0xa, 0x69, 0x6c, 0x97, 0xb0, + 0x91, 0x8b, 0x91, 0x8d, 0x92, 0x1f, 0x8e, 0x97, 0x98, 0x3c, 0xa, 0xb, + 0xf7, 0xd2, 0xf7, 0x1f, 0x22, 0xa, 0xb, 0x15, 0x32, 0xa, 0x7e, 0x80, + 0xfb, 0x2e, 0x74, 0xa, 0xf7, 0x2f, 0xa9, 0x7d, 0x4f, 0x7e, 0x8a, 0x7d, + 0x8a, 0x7a, 0x41, 0xa, 0xe, 0x1e, 0x7b, 0xf7, 0x8a, 0x9b, 0x7, 0x51, + 0x90, 0x86, 0xa0, 0x7f, 0xd1, 0x2c, 0xf8, 0xc0, 0x18, 0x71, 0x6, 0xfb, + 0xce, 0xfc, 0xb3, 0x5a, 0x35, 0x76, 0xb, 0x6e, 0x8e, 0x32, 0xef, 0xc7, + 0xc0, 0xa9, 0xf7, 0xe, 0xde, 0x1e, 0xfb, 0x6b, 0x6b, 0x15, 0xe5, 0xe5, + 0xf7, 0x70, 0xf7, 0x9, 0xb, 0x7b, 0x7, 0xb1, 0xa9, 0x7a, 0x5f, 0x79, + 0x2f, 0xfb, 0xd6, 0x82, 0x6c, 0x1f, 0x5f, 0x7e, 0x58, 0xfb, 0x1e, 0xfb, + 0x1e, 0x1b, 0x4b, 0x40, 0xab, 0xe4, 0xc1, 0xf4, 0xf7, 0xe8, 0x97, 0xb9, + 0x1f, 0xa9, 0x93, 0xa4, 0xa2, 0xc5, 0x1b, 0xb, 0x7f, 0x95, 0x5, 0x5f, + 0x5e, 0x77, 0x72, 0x7c, 0xec, 0xa, 0x91, 0x92, 0xaa, 0xe7, 0xf7, 0xe9, + 0x8e, 0x97, 0x1f, 0xb, 0xf7, 0x1d, 0xf3, 0xdd, 0x23, 0x5, 0xaf, 0x6, + 0x33, 0xf7, 0x3d, 0x5, 0x5a, 0x6, 0xb, 0x15, 0xc5, 0x86, 0x9c, 0x7f, + 0x67, 0x59, 0x27, 0xfb, 0xae, 0x7c, 0xa, 0xf7, 0x2d, 0xd2, 0xe3, 0xf7, + 0x19, 0xb2, 0x1e, 0xf5, 0xf8, 0x7, 0x95, 0xae, 0x97, 0x9c, 0xc6, 0x96, + 0x19, 0xb, 0x53, 0xa, 0x2e, 0xa, 0x13, 0x78, 0x62, 0xa, 0xb, 0xb4, + 0xb9, 0xf7, 0x42, 0x8, 0xf7, 0x37, 0x8b, 0x86, 0x5a, 0x40, 0xa, 0xb, + 0xe5, 0xae, 0xd9, 0xe1, 0xc1, 0x1b, 0x9e, 0x98, 0x84, 0x64, 0x83, 0x81, + 0xfb, 0x10, 0xfb, 0x62, 0x61, 0x1f, 0x84, 0x75, 0x15, 0xa7, 0x8f, 0x5, + 0xf7, 0x36, 0xa2, 0xed, 0xdc, 0xda, 0x1a, 0xb, 0x7b, 0x7, 0xc2, 0x90, + 0x7c, 0x76, 0x1f, 0x6f, 0x3f, 0x4b, 0xa, 0xb, 0x4a, 0xa, 0x8f, 0x99, + 0x1f, 0xe3, 0xf7, 0xd6, 0x88, 0x8d, 0xb, 0x7b, 0x88, 0x7b, 0x87, 0x7c, + 0x1f, 0x9f, 0x86, 0xcf, 0xf7, 0x7c, 0x79, 0x8f, 0x81, 0x75, 0x82, 0x78, + 0x82, 0x7d, 0x19, 0x6c, 0x75, 0xb, 0x63, 0xa, 0xdb, 0x8f, 0x5d, 0x50, + 0x79, 0x1f, 0xfb, 0x9, 0xfc, 0x40, 0x7a, 0x4d, 0x76, 0x7a, 0x5a, 0x82, + 0x19, 0xb, 0x1f, 0xda, 0xf7, 0xbf, 0x5, 0x41, 0x6, 0x64, 0x20, 0x75, + 0x4c, 0x5a, 0x41, 0x8, 0x57, 0x69, 0x4c, 0x2d, 0x60, 0x1b, 0xb, 0xb8, + 0xb3, 0xb0, 0xce, 0x96, 0x1f, 0x6f, 0x6, 0x76, 0x84, 0x83, 0x74, 0x65, + 0x1b, 0xb, 0x1a, 0x86, 0x8d, 0x88, 0x91, 0x94, 0xd0, 0xc9, 0xa7, 0xab, + 0x1e, 0xaa, 0xa6, 0xbf, 0xb1, 0xa8, 0xa2, 0x8, 0x94, 0x7, 0x84, 0x97, + 0x5f, 0xc1, 0x7b, 0x9d, 0x8, 0x9c, 0x7c, 0x56, 0xd9, 0x7e, 0x1b, 0x83, + 0x8b, 0x85, 0x89, 0xb, 0xf7, 0x76, 0xf7, 0x8a, 0x4c, 0xa, 0xb, 0xf9, + 0x54, 0x31, 0xa, 0xb, 0x9a, 0x1a, 0x9d, 0x7c, 0x9c, 0x76, 0x80, 0xb, + 0x12, 0xf8, 0xf, 0xe5, 0x17, 0xf7, 0x9, 0xb8, 0x15, 0xb2, 0xb3, 0xf7, + 0x1c, 0xa4, 0xcb, 0x1e, 0xcf, 0xa5, 0xc5, 0xb9, 0xba, 0x1b, 0xcc, 0x8c, + 0x51, 0x70, 0xfb, 0xb, 0x31, 0xfb, 0x4e, 0xfb, 0xe, 0x72, 0x72, 0x96, + 0xa5, 0x1f, 0x7d, 0x64, 0x15, 0x7f, 0xa2, 0x9f, 0x86, 0xa4, 0x1b, 0xf7, + 0x1e, 0xf7, 0x34, 0xf7, 0x3a, 0xf7, 0x2f, 0xd3, 0x6d, 0xc6, 0x32, 0x39, + 0x52, 0x42, 0x68, 0xb, 0x75, 0x74, 0x78, 0x77, 0x7b, 0x7a, 0x8, 0x40, + 0x3a, 0x7d, 0x74, 0x7d, 0x44, 0xa, 0x84, 0x9d, 0x5a, 0xa1, 0x5a, 0x1f, + 0x95, 0x73, 0x97, 0x74, 0x95, 0x77, 0x8, 0xb, 0x15, 0x51, 0x62, 0x6e, + 0x77, 0x7f, 0x1b, 0x82, 0x84, 0x93, 0x92, 0x97, 0x97, 0xb3, 0xb, 0xfb, + 0x82, 0x5c, 0x1a, 0x79, 0x8b, 0x5f, 0xba, 0xc3, 0xb7, 0xc2, 0xc6, 0xb2, + 0x1e, 0xb, 0x15, 0xf7, 0x29, 0xf7, 0x97, 0x5, 0x8c, 0x6, 0xb7, 0xfb, + 0x97, 0x5, 0xb, 0x74, 0x39, 0x77, 0x37, 0x79, 0x1a, 0x7c, 0x8d, 0x66, + 0xb8, 0xbd, 0xa5, 0xa5, 0xe6, 0xca, 0x1e, 0xb, 0xf8, 0x8f, 0x6, 0xc9, + 0xf7, 0x36, 0x7b, 0x93, 0x5, 0x28, 0x44, 0x60, 0x65, 0xfb, 0x55, 0x1b, + 0xb, 0xf7, 0x5d, 0xf7, 0x3c, 0xfb, 0x4, 0xd6, 0xfb, 0xc, 0xfb, 0x47, + 0xfb, 0x78, 0xb, 0x1, 0x85, 0xf8, 0xf8, 0x3, 0x85, 0x16, 0xf8, 0x8d, + 0x6, 0xc1, 0xf7, 0x3c, 0x78, 0x8e, 0x5, 0x24, 0x5a, 0x5c, 0x6b, 0xfb, + 0x38, 0x1b, 0xfb, 0x2b, 0x6, 0xf8, 0x77, 0xf8, 0xef, 0x5, 0x99, 0xfc, + 0x7a, 0x7, 0x5d, 0xfb, 0x26, 0x9e, 0x86, 0x5, 0xd0, 0xad, 0xab, 0xb9, + 0xf7, 0x2d, 0x1b, 0xf7, 0x35, 0x6, 0xfc, 0x73, 0xfc, 0xef, 0x5, 0xb, + 0x6e, 0x8d, 0x6d, 0xb9, 0xc1, 0xae, 0xb9, 0xce, 0xbd, 0x1e, 0x7d, 0x98, + 0x5, 0x5c, 0x66, 0x72, 0x6b, 0x77, 0x1b, 0x89, 0x7d, 0x8d, 0x9a, 0x1f, + 0xa9, 0xdb, 0xf7, 0x8b, 0xb6, 0x1a, 0xb5, 0x74, 0xa3, 0x5d, 0x38, 0x2f, + 0xfb, 0x1f, 0x41, 0x5c, 0x1e, 0x89, 0x8d, 0xcb, 0xf7, 0x65, 0x88, 0x8d, + 0x55, 0x80, 0x55, 0x81, 0x55, 0x81, 0x19, 0xb, 0x7b, 0xa, 0x67, 0x6, + 0xfb, 0x22, 0x22, 0x31, 0xf4, 0x5, 0x66, 0x6, 0xe, 0x15, 0x8e, 0x6, + 0x4d, 0xa, 0xb, 0x73, 0xa, 0x57, 0x5f, 0xb4, 0xc8, 0x98, 0x8e, 0x98, + 0x90, 0x99, 0x1f, 0xb, 0xf8, 0x80, 0x31, 0xa, 0xb, 0x84, 0x1b, 0x75, + 0x7d, 0x7c, 0x77, 0x7a, 0xb, 0xa7, 0x80, 0x71, 0xa, 0xb, 0x15, 0x20, + 0xa, 0xb, 0xea, 0xa, 0xc7, 0x9c, 0xa, 0xab, 0x69, 0x83, 0x5e, 0x83, + 0x61, 0xb, 0x7d, 0xa, 0xf7, 0x76, 0xaf, 0xf8, 0x2a, 0x77, 0xb, 0xfb, + 0x21, 0xfb, 0x36, 0x5c, 0xa, 0xb, 0xfb, 0x3c, 0xfb, 0x23, 0x4c, 0xab, + 0x3d, 0xf4, 0xef, 0xe6, 0xe7, 0x9b, 0x96, 0xb, 0x7d, 0x7, 0xb4, 0x9b, + 0x81, 0x6e, 0x1f, 0x70, 0x42, 0xfb, 0x86, 0x5f, 0x1a, 0xb, 0x9e, 0xa, + 0xf7, 0x3b, 0xf0, 0x9f, 0xa, 0x95, 0x97, 0x47, 0xa, 0x7f, 0x82, 0x9d, + 0xa, 0xb, 0x60, 0xfb, 0x19, 0xfb, 0x2d, 0xfb, 0x4f, 0xfb, 0x27, 0xb, + 0x15, 0xa8, 0x6, 0xa7, 0x92, 0x9c, 0x9e, 0xa7, 0x1b, 0xb, 0x15, 0x7b, + 0x4e, 0x86, 0x75, 0x74, 0x1a, 0x7a, 0x8b, 0xb, 0x5f, 0x9e, 0x7c, 0xaf, + 0xe5, 0xd5, 0xf7, 0x11, 0xf7, 0x5, 0xcf, 0x1e, 0xb, 0x1f, 0xa0, 0x89, + 0xaa, 0xf7, 0x2d, 0x5, 0xfc, 0x85, 0x7b, 0x6, 0xb, 0x1b, 0x2e, 0x3c, + 0x48, 0x2a, 0x4a, 0x90, 0x80, 0xf7, 0x1e, 0xfb, 0x27, 0x1f, 0xac, 0x68, + 0xb0, 0x6c, 0x4b, 0x1a, 0x59, 0x68, 0x39, 0x2d, 0x31, 0x53, 0xda, 0xe4, + 0x93, 0x8c, 0x90, 0x8c, 0x93, 0x1e, 0x77, 0x8d, 0x5, 0xb, 0x66, 0xa, + 0xa8, 0x1f, 0x80, 0xa7, 0x57, 0xa, 0x77, 0xb, 0x60, 0xa, 0x9d, 0xa8, + 0x80, 0x80, 0xb, 0xf8, 0x64, 0xf7, 0x27, 0x15, 0xf7, 0x4c, 0xf7, 0x49, + 0x8d, 0x89, 0x8c, 0x8c, 0x51, 0xfb, 0x48, 0x5, 0xfb, 0x45, 0x61, 0x15, + 0xf7, 0x3c, 0x6, 0x6b, 0x22, 0x5, 0xca, 0x6, 0xa9, 0xf3, 0x5, 0xc5, + 0x6, 0xb, 0x15, 0x92, 0x7f, 0xb7, 0x55, 0x9b, 0x79, 0x8, 0x7a, 0x9a, + 0xc0, 0x3d, 0x98, 0x1b, 0x93, 0x8b, 0x91, 0x8d, 0xb, 0x1a, 0x90, 0x89, + 0x8e, 0x85, 0x82, 0x46, 0x4d, 0x6f, 0x6b, 0x1e, 0x6c, 0x70, 0x57, 0x65, + 0x6e, 0x74, 0x8, 0xb, 0x15, 0x45, 0xb9, 0x50, 0xd4, 0xde, 0xf0, 0xed, + 0xf7, 0xc, 0xb, 0x94, 0x7a, 0x5, 0x59, 0xa, 0xb, 0x1b, 0x41, 0x7a, + 0x47, 0x65, 0x81, 0x1f, 0xb, 0x1b, 0xf7, 0x19, 0xd1, 0xf3, 0xe9, 0xcd, + 0x77, 0xb3, 0x2e, 0xe6, 0x1f, 0x35, 0xe1, 0x7e, 0xa2, 0xba, 0x1a, 0xce, + 0xbe, 0xac, 0xc2, 0xf7, 0xd, 0x8f, 0x22, 0x52, 0x1e, 0x9d, 0x88, 0x5, + 0xb, 0xf7, 0x5b, 0x8b, 0xaf, 0xf8, 0xfd, 0x77, 0x1, 0x83, 0xf8, 0xcb, + 0x3, 0x83, 0x16, 0xf8, 0x91, 0x6, 0xc5, 0xf7, 0x47, 0x77, 0x91, 0x5, + 0xfb, 0x26, 0x49, 0x3a, 0x88, 0xfb, 0xd, 0x1b, 0xb, 0x1f, 0x7a, 0x99, + 0x5, 0x5c, 0x5b, 0x45, 0x44, 0xfb, 0x5, 0x1b, 0xfb, 0xb, 0x54, 0xde, + 0xf7, 0x17, 0xf7, 0x27, 0xf1, 0xf7, 0x86, 0xf7, 0x5c, 0xf7, 0x23, 0x96, + 0xfb, 0x1a, 0x6f, 0x1f, 0xb, 0xf7, 0xb, 0xf7, 0xac, 0xf8, 0x66, 0xf7, + 0xb, 0xaf, 0x77, 0xa5, 0x66, 0x71, 0x80, 0x76, 0x7d, 0xb, 0x9d, 0x1b, + 0x43, 0xa, 0xb, 0x7d, 0x94, 0x5, 0x5f, 0x68, 0x6f, 0x68, 0x78, 0x1b, + 0xb, 0x7f, 0x97, 0x5, 0x62, 0x59, 0x61, 0x69, 0x55, 0x1b, 0xb, 0x1b, + 0xbc, 0xf7, 0x40, 0x5, 0xd5, 0xa0, 0x82, 0x98, 0xe0, 0x1b, 0xb, 0x2d, + 0x68, 0x1e, 0x98, 0x83, 0x5, 0x96, 0x94, 0xa4, 0xb5, 0xc5, 0x1b, 0xba, + 0xa8, 0x67, 0x6d, 0x7c, 0x8a, 0x67, 0x2f, 0x32, 0x1f, 0xfb, 0x19, 0xfb, + 0x16, 0x5, 0xb, 0x80, 0xbc, 0x70, 0x76, 0xf8, 0x41, 0xa1, 0xb, 0xb7, + 0xa, 0xfb, 0x2, 0xf7, 0x22, 0xc5, 0xa, 0x78, 0x92, 0x56, 0xa, 0x9f, + 0x7a, 0x80, 0xa, 0xb7, 0xa, 0xfb, 0x2, 0xf7, 0x23, 0xc5, 0xa, 0x78, + 0x91, 0x56, 0xa, 0x9f, 0x7b, 0x80, 0xa, 0x82, 0x9c, 0x5, 0x52, 0x6f, + 0x42, 0x4f, 0x48, 0x1a, 0x60, 0xa4, 0x6b, 0xad, 0x93, 0xb, 0x65, 0x1a, + 0x70, 0x61, 0x5a, 0x72, 0x6e, 0x1e, 0x63, 0x69, 0x7e, 0x82, 0x7b, 0x1b, + 0xb, 0x15, 0xb9, 0x6, 0xf7, 0x37, 0xf7, 0x3d, 0x5, 0xb, 0x26, 0x1a, + 0xfb, 0x6, 0xf7, 0x3, 0x54, 0xf1, 0xb, 0xf7, 0x92, 0xa0, 0x76, 0xb, + 0x9e, 0xa, 0xf7, 0x38, 0xee, 0x9f, 0xa, 0x98, 0x99, 0x47, 0xa, 0x7c, + 0x80, 0x9d, 0xa, 0xb, 0x9e, 0xa, 0xf7, 0x3a, 0xf0, 0x9f, 0xa, 0x96, + 0x97, 0x47, 0xa, 0x7e, 0x82, 0x9d, 0xa, 0xb, 0x90, 0x87, 0x1f, 0xe, + 0x1f, 0xc3, 0xf2, 0x5, 0xf7, 0x70, 0x6, 0xb, 0x1a, 0x66, 0x54, 0x69, + 0x77, 0x7e, 0x1e, 0xb, 0x95, 0x84, 0x5, 0x94, 0x95, 0xa2, 0xa6, 0xb4, + 0x1b, 0x9d, 0xaa, 0x7e, 0x63, 0x51, 0x31, 0x71, 0x52, 0x82, 0x1f, 0xe, + 0x15, 0x6c, 0xa3, 0x73, 0xaa, 0xaa, 0xa4, 0xa3, 0xaa, 0xaa, 0x72, 0xa4, + 0x6c, 0x6c, 0x73, 0x72, 0x6c, 0x1e, 0xe, 0x74, 0xa8, 0xa8, 0xa3, 0xa2, + 0xa8, 0xa8, 0x73, 0xa3, 0x6e, 0x6e, 0xb, 0xc7, 0xf4, 0xf8, 0x41, 0xf4, + 0xb, 0x9a, 0xa, 0x77, 0xb, 0x5a, 0xa, 0xf7, 0x78, 0x77, 0x1, 0x58, + 0xf8, 0xfb, 0x3, 0xb, 0x99, 0x16, 0xd6, 0x6, 0xb4, 0xf7, 0x1c, 0x99, + 0xb6, 0xb8, 0xd0, 0x8, 0xc3, 0xb0, 0xc9, 0xe1, 0xbb, 0x1b, 0xb, 0x15, + 0x6d, 0xa4, 0x72, 0xa9, 0xa9, 0xa4, 0xa4, 0xa9, 0xa9, 0x72, 0xa4, 0x6d, + 0x6d, 0x72, 0x72, 0x6d, 0x1e, 0xb, 0x8a, 0x16, 0x4e, 0xa, 0xb, 0x15, + 0xbe, 0x6, 0xf8, 0x5b, 0xf9, 0x42, 0x5, 0x58, 0x6, 0xb, 0xf7, 0x92, + 0x8b, 0xac, 0xf7, 0xbb, 0xe9, 0xa, 0xb, 0xa3, 0x9e, 0x9e, 0xa3, 0xa3, + 0x78, 0x9e, 0x73, 0x73, 0x78, 0x78, 0x73, 0x73, 0x9e, 0x78, 0xa3, 0x1f, + 0xb, 0x6f, 0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7, 0xa7, 0x75, 0xa1, + 0x6f, 0x6f, 0x75, 0x75, 0x6f, 0x1e, 0xb, 0x1, 0x86, 0xa, 0x3, 0xb, + 0xf8, 0x5d, 0x76, 0xf7, 0x7a, 0x77, 0x12, 0xb, 0x1, 0xa6, 0xdf, 0xf7, + 0xa5, 0xdf, 0x3, 0xb, 0x9b, 0xfb, 0x8b, 0x7b, 0x7, 0xb, 0x94, 0xb6, + 0x5, 0x54, 0x6, 0xda, 0xf7, 0x97, 0x5, 0x67, 0x6, 0xfb, 0xa3, 0xfb, + 0x97, 0x5, 0xb, 0x6, 0x89, 0x90, 0xf7, 0x6, 0xf7, 0x2, 0x5, 0xdb, + 0xd8, 0x9e, 0xa3, 0xb3, 0x1a, 0xb4, 0x64, 0xb, 0x1b, 0x76, 0x7a, 0x7a, + 0x76, 0x61, 0xb6, 0x88, 0x93, 0xb, 0x1a, 0x74, 0x9a, 0x7d, 0xa4, 0xa4, + 0xa1, 0xa7, 0xa7, 0xb, 0x7a, 0x7, 0x8e, 0x97, 0x92, 0x8c, 0x9a, 0x1b, + 0xc4, 0xb, 0x87, 0xa, 0xf7, 0x87, 0x77, 0x1, 0xb, 0xa0, 0x76, 0xf9, + 0x21, 0xb, 0xf7, 0x4f, 0x9b, 0x6, 0xb, 0xce, 0x1a, 0xb6, 0x72, 0xb, + 0x85, 0x85, 0x1e, 0xb, 0x15, 0xae, 0x6, 0xb, 0x5, 0x96, 0x92, 0xb, + 0x82, 0xba, 0x6f, 0x76, 0xf9, 0x37, 0xa9, 0xa, 0xe5, 0x13, 0xb8, 0xb, + 0x76, 0xa, 0xf7, 0x73, 0x77, 0x12, 0x9c, 0xdf, 0x13, 0x78, 0xb, 0xf8, + 0x99, 0x66, 0xa, 0xb, 0x97, 0xa, 0xaa, 0x72, 0xbd, 0x37, 0xfb, 0x28, + 0xb, 0x80, 0xa0, 0xf8, 0x2e, 0xa0, 0xf7, 0x73, 0x77, 0x92, 0xa, 0xb, + 0x72, 0x7e, 0x6c, 0xaf, 0x83, 0xb2, 0xf7, 0x10, 0xc6, 0xe0, 0xce, 0xcd, + 0x60, 0x9c, 0xb, 0x62, 0xa, 0xe, 0x1a, 0x56, 0x3c, 0xfb, 0x1b, 0x60, + 0x45, 0x1e, 0xb, 0x77, 0x90, 0xa, 0xb, 0x77, 0x12, 0xb5, 0xd8, 0xf7, + 0x3e, 0xb, 0xb6, 0xa, 0xb4, 0xf9, 0xa, 0xb, 0xfb, 0x17, 0xf7, 0x17, + 0xfb, 0x17, 0xb, 0xc7, 0x4f, 0xf2, 0x8c, 0x77, 0x12, 0xb, 0xf8, 0x82, + 0x9e, 0xa, 0xb, 0xf7, 0x74, 0xf7, 0x58, 0xb, 0x1b, 0xbe, 0xb6, 0xb0, + 0xb1, 0xab, 0x72, 0x90, 0x82, 0x74, 0x7f, 0x7d, 0x7a, 0xb, 0x7f, 0x9f, + 0x89, 0x76, 0xf7, 0xe5, 0x9f, 0xf7, 0xcc, 0x9f, 0x8e, 0x77, 0x12, 0xb, + 0x83, 0x16, 0xf7, 0x91, 0x6, 0xf7, 0xba, 0xf7, 0x35, 0xf7, 0x4d, 0xf7, + 0x5e, 0xb, 0x1b, 0xf7, 0x45, 0xad, 0xfb, 0xf, 0x26, 0x4e, 0x6a, 0xfb, + 0xc8, 0xfb, 0xcf, 0xb, 0xaf, 0xa8, 0xa9, 0xaf, 0xaf, 0xa9, 0x6d, 0x67, + 0x67, 0x6d, 0x6e, 0x67, 0x1e, 0xb, 0x1a, 0x6a, 0x7b, 0x5b, 0x53, 0x3a, + 0x7b, 0xe7, 0xb7, 0x84, 0x1e, 0x7b, 0x6, 0xb, 0x1a, 0x6f, 0x8f, 0x69, + 0xb7, 0xc9, 0xb2, 0xbb, 0xd8, 0xbe, 0x1e, 0xe, 0xf8, 0x1, 0x79, 0xb, + 0x15, 0xaa, 0x6, 0xb, 0xb0, 0xf7, 0x5b, 0x5, 0x76, 0x6, 0x81, 0x86, + 0x7b, 0x7f, 0x6e, 0x1b, 0xb, 0x9c, 0x7c, 0x15, 0x9d, 0x6, 0x98, 0x8f, + 0x9c, 0x9f, 0xa7, 0x1b, 0x9a, 0xb, 0x89, 0x87, 0x15, 0x94, 0x82, 0x5, + 0x96, 0x98, 0x9a, 0x92, 0x9c, 0x1b, 0xb, 0x9f, 0xf7, 0x1f, 0x5, 0x7d, + 0x6, 0x83, 0x86, 0x7b, 0x81, 0x7a, 0x1b, 0xb, 0x7d, 0x72, 0x84, 0x1e, + 0x82, 0x6b, 0x82, 0xfb, 0xb, 0x86, 0x54, 0x8, 0xb, 0x1a, 0xb0, 0xc2, + 0xad, 0x9f, 0x98, 0x1e, 0xb, 0x97, 0x76, 0xa9, 0x76, 0xf8, 0x1a, 0xbe, + 0xb, 0xb6, 0xa, 0xac, 0xf8, 0xfe, 0xac, 0xb, 0xf7, 0x4, 0x4b, 0xcb, + 0xb, 0x15, 0xf7, 0x7b, 0x6, 0xac, 0xda, 0x80, 0x93, 0x5, 0x76, 0x7f, + 0xb, 0x9b, 0x7e, 0x15, 0x9b, 0x6, 0x96, 0x91, 0x99, 0x95, 0x99, 0x1b, + 0xb, 0x9e, 0x91, 0x7d, 0x79, 0x1f, 0x63, 0x41, 0xfb, 0x88, 0x73, 0x1a, + 0xb, 0x9b, 0xfb, 0xa5, 0x7b, 0x7, 0xb, 0x5, 0xa2, 0x79, 0xb, 0xed, + 0xf1, 0xed, 0xb, 0xb3, 0x17, 0xf7, 0x9c, 0xd3, 0x15, 0x6a, 0xf7, 0x44, + 0x5, 0xb, 0xea, 0xa, 0xca, 0x9c, 0xa, 0xa8, 0x69, 0xb, 0xcf, 0xa2, + 0xac, 0xa0, 0xb9, 0x1a, 0xbc, 0x59, 0xa3, 0x5b, 0xb, 0x96, 0xfb, 0xb0, + 0x7, 0x6c, 0xfb, 0x7, 0x9b, 0x87, 0x5, 0xb, 0x87, 0xa, 0x1, 0xb, + 0xf1, 0xe5, 0xf8, 0x4e, 0xf7, 0x17, 0xb, 0x1e, 0x9b, 0xfb, 0x83, 0x7b, + 0x7, 0xb, 0xc5, 0x76, 0xf8, 0x2, 0x77, 0x1, 0xb, 0xd9, 0x16, 0xf7, + 0xb5, 0x9b, 0x6, 0xb, 0xc9, 0xf7, 0x47, 0xc9, 0xb, 0xf7, 0x3d, 0x77, + 0x1, 0xb, 0x9b, 0xfb, 0xa5, 0x7, 0xb, 0xf7, 0xf, 0x15, 0x4c, 0x5a, + 0x76, 0x6f, 0x72, 0x1b, 0xb, 0xf8, 0xef, 0xaf, 0x89, 0x77, 0x12, 0xcd, + 0xf7, 0x4, 0xb, 0x1b, 0xfb, 0x79, 0xfb, 0x45, 0xfb, 0x71, 0xfb, 0x55, + 0xb, 0x6c, 0xa, 0xe, 0x3c, 0x95, 0x76, 0xb, 0x15, 0xd2, 0xf7, 0x8c, + 0x5, 0x97, 0x8e, 0x92, 0xb, 0xf8, 0x1d, 0x96, 0x76, 0xaa, 0x76, 0xf4, + 0xb5, 0xb, 0x66, 0x56, 0x1b, 0x7b, 0xf7, 0x61, 0x9a, 0x7, 0xb, 0xf7, + 0x45, 0xf7, 0x16, 0x9d, 0x9f, 0x86, 0x7c, 0xb, 0x82, 0x30, 0x79, 0x87, + 0x6d, 0x1e, 0x78, 0x7, 0xb, 0xb6, 0xfb, 0x30, 0x76, 0xf9, 0xf4, 0x77, + 0x12, 0xb, 0x90, 0x94, 0x7d, 0x1f, 0x7a, 0x6e, 0x5, 0x7e, 0xb, 0xf7, + 0x49, 0xfb, 0x39, 0x77, 0xe2, 0xed, 0x12, 0xb, 0x76, 0xf9, 0x40, 0x77, + 0x1, 0xf4, 0xcd, 0x3, 0xb, 0xab, 0xfb, 0x2d, 0xa6, 0xf9, 0x8e, 0xa6, + 0x1, 0xb, 0x30, 0xa7, 0x1f, 0x9b, 0x55, 0xb, 0x77, 0x1, 0xbc, 0xd6, + 0x3, 0xb, 0x16, 0xf7, 0x5a, 0x9b, 0x6, 0xb, 0x67, 0x6e, 0xa8, 0xaf, + 0x1f, 0xb, 0x7b, 0xf7, 0xa5, 0x9b, 0x7, 0xb, 0x15, 0x9b, 0xa, 0xb, + 0x9b, 0xfb, 0x51, 0x7b, 0x7, 0xb, 0xac, 0xf7, 0x97, 0xac, 0xb, 0xc4, + 0xa7, 0xd4, 0xb, 0x9b, 0xfb, 0x5b, 0xb, 0x1b, 0x83, 0x85, 0xb}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifMM.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifMM.cpp new file mode 100644 index 000000000000..4195e9cb4a9e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSerifMM.cpp @@ -0,0 +1,9462 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitSerifMMFontData[113417] = { + 0x80, 0x01, 0xD6, 0x29, 0x00, 0x00, 0x25, 0x21, 0x50, 0x53, 0x2D, 0x41, + 0x64, 0x6F, 0x62, 0x65, 0x46, 0x6F, 0x6E, 0x74, 0x2D, 0x31, 0x2E, 0x30, + 0x3A, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, + 0x66, 0x4D, 0x4D, 0x20, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x0D, + 0x25, 0x25, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, + 0x74, 0x65, 0x3A, 0x20, 0x54, 0x75, 0x65, 0x20, 0x4F, 0x63, 0x74, 0x20, + 0x33, 0x31, 0x20, 0x30, 0x31, 0x3A, 0x33, 0x34, 0x3A, 0x32, 0x32, 0x20, + 0x32, 0x30, 0x30, 0x36, 0x0D, 0x25, 0x25, 0x56, 0x4D, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x3A, 0x20, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, + 0x35, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x31, 0x37, 0x20, 0x64, 0x69, 0x63, + 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, + 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, + 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, + 0x2F, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x28, 0x30, 0x30, + 0x31, 0x2E, 0x30, 0x30, 0x30, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, + 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x4E, 0x6F, 0x74, + 0x69, 0x63, 0x65, 0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, + 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x75, 0x6C, 0x6C, + 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, + 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, + 0x2F, 0x46, 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x4E, 0x61, 0x6D, 0x65, 0x20, + 0x28, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x65, 0x72, 0x69, + 0x66, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, + 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x49, 0x74, 0x61, 0x6C, + 0x69, 0x63, 0x41, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x30, 0x20, 0x64, 0x65, + 0x66, 0x0D, 0x2F, 0x69, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x69, + 0x74, 0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x65, + 0x66, 0x0D, 0x2F, 0x55, 0x6E, 0x64, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x65, + 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x2D, 0x31, 0x30, + 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E, 0x64, 0x65, 0x72, + 0x6C, 0x69, 0x6E, 0x65, 0x54, 0x68, 0x69, 0x63, 0x6B, 0x6E, 0x65, 0x73, + 0x73, 0x20, 0x35, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x41, 0x6C, 0x6C, 0x29, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, + 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, + 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x5B, 0x5B, + 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x30, 0x20, 0x5D, 0x5B, + 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x31, 0x20, 0x5D, 0x5D, + 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, + 0x65, 0x73, 0x69, 0x67, 0x6E, 0x4D, 0x61, 0x70, 0x20, 0x5B, 0x5B, 0x5B, + 0x31, 0x31, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x37, 0x39, 0x30, 0x20, + 0x31, 0x20, 0x5D, 0x5D, 0x5B, 0x5B, 0x31, 0x30, 0x30, 0x20, 0x30, 0x20, + 0x5D, 0x5B, 0x39, 0x30, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5D, 0x20, + 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, + 0x69, 0x73, 0x54, 0x79, 0x70, 0x65, 0x73, 0x20, 0x5B, 0x2F, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x2F, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, + 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, + 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, + 0x20, 0x5B, 0x30, 0x2E, 0x32, 0x37, 0x30, 0x32, 0x20, 0x30, 0x2E, 0x31, + 0x30, 0x34, 0x38, 0x20, 0x30, 0x2E, 0x34, 0x35, 0x30, 0x34, 0x20, 0x30, + 0x2E, 0x31, 0x37, 0x34, 0x36, 0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, + 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x2F, 0x43, + 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x66, 0x4D, 0x4D, + 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, + 0x6E, 0x67, 0x20, 0x32, 0x35, 0x36, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, + 0x0D, 0x30, 0x20, 0x31, 0x20, 0x32, 0x35, 0x35, 0x20, 0x7B, 0x31, 0x20, + 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, + 0x2E, 0x6E, 0x6F, 0x74, 0x64, 0x65, 0x66, 0x20, 0x70, 0x75, 0x74, 0x20, + 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x32, + 0x20, 0x2F, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, + 0x61, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, + 0x34, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x35, 0x20, 0x2F, + 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6E, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x36, 0x20, 0x2F, 0x64, + 0x6F, 0x6C, 0x6C, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6E, + 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x38, + 0x20, 0x2F, 0x61, 0x6D, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6E, 0x64, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x39, 0x20, 0x2F, + 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x30, 0x20, 0x2F, + 0x70, 0x61, 0x72, 0x65, 0x6E, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x31, 0x20, 0x2F, 0x70, 0x61, + 0x72, 0x65, 0x6E, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x32, 0x20, 0x2F, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x69, 0x73, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x34, 0x33, 0x20, 0x2F, 0x70, 0x6C, 0x75, 0x73, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x34, 0x20, 0x2F, 0x63, + 0x6F, 0x6D, 0x6D, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x34, 0x35, 0x20, 0x2F, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6E, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x36, 0x20, 0x2F, + 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x34, 0x37, 0x20, 0x2F, 0x73, 0x6C, 0x61, 0x73, 0x68, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x38, 0x20, + 0x2F, 0x7A, 0x65, 0x72, 0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x34, 0x39, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x30, 0x20, 0x2F, 0x74, 0x77, + 0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x31, + 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x35, 0x32, 0x20, 0x2F, 0x66, 0x6F, 0x75, 0x72, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x33, 0x20, + 0x2F, 0x66, 0x69, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x35, 0x34, 0x20, 0x2F, 0x73, 0x69, 0x78, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x35, 0x20, 0x2F, 0x73, 0x65, + 0x76, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x35, 0x36, 0x20, 0x2F, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x37, 0x20, 0x2F, 0x6E, 0x69, + 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, + 0x38, 0x20, 0x2F, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x39, 0x20, 0x2F, 0x73, 0x65, 0x6D, + 0x69, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x36, 0x30, 0x20, 0x2F, 0x6C, 0x65, 0x73, 0x73, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x31, 0x20, 0x2F, + 0x65, 0x71, 0x75, 0x61, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x36, 0x32, 0x20, 0x2F, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x33, + 0x20, 0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x34, 0x20, 0x2F, 0x61, + 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x35, + 0x20, 0x2F, 0x41, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x36, 0x36, 0x20, 0x2F, 0x42, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x36, 0x37, 0x20, 0x2F, 0x43, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x36, 0x38, 0x20, 0x2F, 0x44, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x39, 0x20, 0x2F, 0x45, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x30, 0x20, 0x2F, + 0x46, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x31, + 0x20, 0x2F, 0x47, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x37, 0x32, 0x20, 0x2F, 0x48, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x37, 0x33, 0x20, 0x2F, 0x49, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x37, 0x34, 0x20, 0x2F, 0x4A, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x35, 0x20, 0x2F, 0x4B, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x36, 0x20, 0x2F, + 0x4C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x37, + 0x20, 0x2F, 0x4D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x37, 0x38, 0x20, 0x2F, 0x4E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x37, 0x39, 0x20, 0x2F, 0x4F, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x38, 0x30, 0x20, 0x2F, 0x50, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x31, 0x20, 0x2F, 0x51, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x32, 0x20, 0x2F, + 0x52, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x33, + 0x20, 0x2F, 0x53, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x38, 0x34, 0x20, 0x2F, 0x54, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x38, 0x35, 0x20, 0x2F, 0x55, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x38, 0x36, 0x20, 0x2F, 0x56, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x37, 0x20, 0x2F, 0x57, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x38, 0x20, 0x2F, + 0x58, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x39, + 0x20, 0x2F, 0x59, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x39, 0x30, 0x20, 0x2F, 0x5A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x39, 0x31, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, + 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x39, 0x32, 0x20, 0x2F, 0x62, 0x61, 0x63, 0x6B, 0x73, 0x6C, + 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x39, 0x33, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x39, 0x34, 0x20, 0x2F, 0x61, 0x73, 0x63, 0x69, 0x69, 0x63, 0x69, + 0x72, 0x63, 0x75, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x39, 0x35, 0x20, 0x2F, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x73, 0x63, + 0x6F, 0x72, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x39, 0x36, 0x20, 0x2F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x37, 0x20, 0x2F, 0x61, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x38, 0x20, 0x2F, + 0x62, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x39, + 0x20, 0x2F, 0x63, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x30, 0x30, 0x20, 0x2F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x30, 0x31, 0x20, 0x2F, 0x65, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x32, 0x20, 0x2F, 0x66, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x33, + 0x20, 0x2F, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x30, 0x34, 0x20, 0x2F, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x30, 0x35, 0x20, 0x2F, 0x69, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x36, 0x20, 0x2F, 0x6A, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x37, + 0x20, 0x2F, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x30, 0x38, 0x20, 0x2F, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x30, 0x39, 0x20, 0x2F, 0x6D, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x30, 0x20, 0x2F, 0x6E, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x31, + 0x20, 0x2F, 0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x31, 0x32, 0x20, 0x2F, 0x70, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x31, 0x33, 0x20, 0x2F, 0x71, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x34, 0x20, 0x2F, 0x72, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x35, + 0x20, 0x2F, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x31, 0x36, 0x20, 0x2F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x31, 0x37, 0x20, 0x2F, 0x75, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x38, 0x20, 0x2F, 0x76, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x39, + 0x20, 0x2F, 0x77, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x32, 0x30, 0x20, 0x2F, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x32, 0x31, 0x20, 0x2F, 0x79, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x32, 0x20, 0x2F, 0x7A, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x33, + 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x34, 0x20, + 0x2F, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x31, 0x32, 0x35, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x31, 0x32, 0x36, 0x20, 0x2F, 0x61, 0x73, 0x63, 0x69, 0x69, 0x74, + 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x31, 0x32, 0x38, 0x20, 0x2F, 0x45, 0x75, 0x72, 0x6F, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x30, 0x20, 0x2F, + 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x62, 0x61, + 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x33, 0x31, 0x20, 0x2F, 0x66, 0x6C, 0x6F, 0x72, 0x69, 0x6E, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x32, 0x20, 0x2F, + 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x33, + 0x20, 0x2F, 0x65, 0x6C, 0x6C, 0x69, 0x70, 0x73, 0x69, 0x73, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x34, 0x20, 0x2F, + 0x64, 0x61, 0x67, 0x67, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x33, 0x35, 0x20, 0x2F, 0x64, 0x61, 0x67, 0x67, + 0x65, 0x72, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x31, 0x33, 0x36, 0x20, 0x2F, 0x63, 0x69, 0x72, 0x63, 0x75, + 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x31, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x74, 0x68, + 0x6F, 0x75, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x33, 0x38, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x72, + 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x33, 0x39, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E, 0x67, + 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x31, 0x34, 0x30, 0x20, 0x2F, 0x4F, 0x45, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x35, 0x20, 0x2F, 0x71, + 0x75, 0x6F, 0x74, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x36, 0x20, 0x2F, 0x71, 0x75, + 0x6F, 0x74, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x37, 0x20, 0x2F, 0x71, 0x75, + 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x38, 0x20, 0x2F, + 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, + 0x39, 0x20, 0x2F, 0x62, 0x75, 0x6C, 0x6C, 0x65, 0x74, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x30, 0x20, 0x2F, 0x65, + 0x6E, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x31, 0x35, 0x31, 0x20, 0x2F, 0x65, 0x6D, 0x64, 0x61, 0x73, + 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, + 0x32, 0x20, 0x2F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x33, 0x20, 0x2F, 0x74, 0x72, + 0x61, 0x64, 0x65, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x34, 0x20, 0x2F, 0x73, 0x63, 0x61, + 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x35, 0x35, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E, + 0x67, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x36, 0x20, 0x2F, 0x6F, 0x65, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x39, 0x20, + 0x2F, 0x59, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x31, 0x20, 0x2F, + 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x64, 0x6F, 0x77, 0x6E, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x32, 0x20, 0x2F, + 0x63, 0x65, 0x6E, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x31, 0x36, 0x33, 0x20, 0x2F, 0x73, 0x74, 0x65, 0x72, 0x6C, 0x69, + 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x36, 0x34, 0x20, 0x2F, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x35, + 0x20, 0x2F, 0x79, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x31, 0x36, 0x36, 0x20, 0x2F, 0x62, 0x72, 0x6F, 0x6B, 0x65, + 0x6E, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x31, 0x36, 0x37, 0x20, 0x2F, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6F, + 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, + 0x38, 0x20, 0x2F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x39, 0x20, + 0x2F, 0x63, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x30, 0x20, 0x2F, + 0x6F, 0x72, 0x64, 0x66, 0x65, 0x6D, 0x69, 0x6E, 0x69, 0x6E, 0x65, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x31, 0x20, + 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x6C, 0x65, + 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x37, 0x32, 0x20, 0x2F, 0x6C, 0x6F, 0x67, 0x69, 0x63, 0x61, 0x6C, 0x6E, + 0x6F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x37, 0x34, 0x20, 0x2F, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x37, 0x35, 0x20, 0x2F, 0x6D, 0x61, 0x63, 0x72, 0x6F, 0x6E, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x36, 0x20, 0x2F, + 0x64, 0x65, 0x67, 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x37, 0x37, 0x20, 0x2F, 0x70, 0x6C, 0x75, 0x73, + 0x6D, 0x69, 0x6E, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x31, 0x37, 0x38, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x37, 0x39, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, + 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x30, 0x20, 0x2F, 0x61, + 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x31, 0x38, 0x31, 0x20, 0x2F, 0x6D, 0x75, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x32, 0x20, 0x2F, 0x70, 0x61, + 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x33, 0x20, 0x2F, 0x70, 0x65, 0x72, + 0x69, 0x6F, 0x64, 0x63, 0x65, 0x6E, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x34, 0x20, + 0x2F, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x35, 0x20, 0x2F, 0x6F, 0x6E, + 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x36, 0x20, 0x2F, 0x6F, + 0x72, 0x64, 0x6D, 0x61, 0x73, 0x63, 0x75, 0x6C, 0x69, 0x6E, 0x65, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x37, 0x20, + 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x38, 0x38, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x71, 0x75, 0x61, 0x72, + 0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x38, 0x39, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x68, 0x61, 0x6C, 0x66, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x30, + 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, + 0x65, 0x72, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x31, 0x39, 0x31, 0x20, 0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, + 0x6E, 0x64, 0x6F, 0x77, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x31, 0x39, 0x32, 0x20, 0x2F, 0x41, 0x67, 0x72, 0x61, 0x76, + 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, + 0x33, 0x20, 0x2F, 0x41, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x34, 0x20, 0x2F, 0x41, + 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x35, 0x20, 0x2F, + 0x41, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x31, 0x39, 0x36, 0x20, 0x2F, 0x41, 0x64, 0x69, 0x65, + 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x31, 0x39, 0x37, 0x20, 0x2F, 0x41, 0x72, 0x69, 0x6E, 0x67, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x38, + 0x20, 0x2F, 0x41, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x31, 0x39, 0x39, 0x20, 0x2F, 0x43, 0x63, 0x65, 0x64, 0x69, 0x6C, + 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x30, 0x30, 0x20, 0x2F, 0x45, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x31, 0x20, 0x2F, + 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x32, 0x30, 0x32, 0x20, 0x2F, 0x45, 0x63, 0x69, 0x72, + 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x33, 0x20, 0x2F, 0x45, 0x64, 0x69, + 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x32, 0x30, 0x34, 0x20, 0x2F, 0x49, 0x67, 0x72, 0x61, + 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x30, 0x35, 0x20, 0x2F, 0x49, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x36, 0x20, 0x2F, + 0x49, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x37, 0x20, + 0x2F, 0x49, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x38, 0x20, 0x2F, + 0x45, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x32, 0x30, 0x39, 0x20, 0x2F, 0x4E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x30, 0x20, + 0x2F, 0x4F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x31, 0x20, 0x2F, 0x4F, 0x61, 0x63, + 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x32, 0x31, 0x32, 0x20, 0x2F, 0x4F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, + 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x32, 0x31, 0x33, 0x20, 0x2F, 0x4F, 0x74, 0x69, 0x6C, 0x64, 0x65, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x34, + 0x20, 0x2F, 0x4F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x35, 0x20, + 0x2F, 0x6D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x79, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x36, 0x20, 0x2F, 0x4F, + 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x32, 0x31, 0x37, 0x20, 0x2F, 0x55, 0x67, 0x72, 0x61, 0x76, + 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, + 0x38, 0x20, 0x2F, 0x55, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x39, 0x20, 0x2F, 0x55, + 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x30, 0x20, 0x2F, + 0x55, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x31, 0x20, 0x2F, 0x59, + 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x32, 0x32, 0x32, 0x20, 0x2F, 0x54, 0x68, 0x6F, 0x72, 0x6E, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x33, + 0x20, 0x2F, 0x67, 0x65, 0x72, 0x6D, 0x61, 0x6E, 0x64, 0x62, 0x6C, 0x73, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x34, + 0x20, 0x2F, 0x61, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x35, 0x20, 0x2F, 0x61, 0x61, + 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x32, 0x32, 0x36, 0x20, 0x2F, 0x61, 0x63, 0x69, 0x72, 0x63, 0x75, + 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x32, 0x32, 0x37, 0x20, 0x2F, 0x61, 0x74, 0x69, 0x6C, 0x64, + 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, + 0x38, 0x20, 0x2F, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x39, + 0x20, 0x2F, 0x61, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x30, 0x20, 0x2F, 0x61, 0x65, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x31, 0x20, + 0x2F, 0x63, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x32, 0x20, 0x2F, 0x65, + 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x32, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x61, 0x63, 0x75, 0x74, + 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, + 0x34, 0x20, 0x2F, 0x65, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, + 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x33, 0x35, 0x20, 0x2F, 0x65, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, + 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, + 0x36, 0x20, 0x2F, 0x69, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, + 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x37, 0x20, 0x2F, 0x69, + 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x32, 0x33, 0x38, 0x20, 0x2F, 0x69, 0x63, 0x69, 0x72, 0x63, + 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x32, 0x33, 0x39, 0x20, 0x2F, 0x69, 0x64, 0x69, 0x65, + 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x32, 0x34, 0x30, 0x20, 0x2F, 0x65, 0x74, 0x68, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x31, 0x20, 0x2F, + 0x6E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x32, 0x34, 0x32, 0x20, 0x2F, 0x6F, 0x67, 0x72, 0x61, + 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x34, 0x33, 0x20, 0x2F, 0x6F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x34, 0x20, 0x2F, + 0x6F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, + 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x35, 0x20, + 0x2F, 0x6F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, + 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x36, 0x20, 0x2F, 0x6F, 0x64, 0x69, + 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x32, 0x34, 0x37, 0x20, 0x2F, 0x64, 0x69, 0x76, 0x69, + 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x34, 0x38, 0x20, 0x2F, 0x6F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x39, 0x20, 0x2F, + 0x75, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x32, 0x35, 0x30, 0x20, 0x2F, 0x75, 0x61, 0x63, 0x75, + 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x35, 0x31, 0x20, 0x2F, 0x75, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, + 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x32, 0x35, 0x32, 0x20, 0x2F, 0x75, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, + 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x35, 0x33, 0x20, 0x2F, 0x79, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, + 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x34, 0x20, 0x2F, + 0x74, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x32, 0x35, 0x35, 0x20, 0x2F, 0x79, 0x64, 0x69, 0x65, 0x72, + 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x72, 0x65, 0x61, + 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, + 0x61, 0x69, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x30, 0x20, 0x64, + 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x20, 0x31, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x42, 0x6C, 0x65, + 0x6E, 0x64, 0x20, 0x7B, 0x20, 0x30, 0x2E, 0x31, 0x30, 0x34, 0x38, 0x20, + 0x6D, 0x75, 0x6C, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x34, + 0x35, 0x30, 0x34, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x20, + 0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x31, 0x37, 0x34, 0x36, 0x20, + 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x64, 0x64, 0x20, + 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, + 0x46, 0x6F, 0x6E, 0x74, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x5B, + 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, + 0x20, 0x30, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, + 0x20, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, + 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, + 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x2D, 0x31, 0x35, 0x37, 0x20, + 0x2D, 0x32, 0x35, 0x37, 0x20, 0x31, 0x31, 0x39, 0x34, 0x20, 0x38, 0x37, + 0x32, 0x7D, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, + 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20, 0x33, + 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, + 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, + 0x78, 0x20, 0x7B, 0x7B, 0x20, 0x2D, 0x31, 0x33, 0x35, 0x20, 0x2D, 0x32, + 0x33, 0x36, 0x20, 0x2D, 0x31, 0x33, 0x35, 0x20, 0x2D, 0x32, 0x30, 0x31, + 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, + 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, + 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x35, 0x38, 0x32, 0x20, 0x31, 0x32, 0x31, + 0x37, 0x20, 0x31, 0x32, 0x37, 0x34, 0x20, 0x31, 0x39, 0x32, 0x32, 0x20, + 0x7D, 0x20, 0x7B, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20, + 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20, 0x7D, 0x7D, 0x20, 0x64, + 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, + 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x65, 0x66, 0x0D, + 0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x25, 0x20, 0x43, 0x6F, + 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, + 0x31, 0x39, 0x39, 0x30, 0x2D, 0x31, 0x39, 0x39, 0x34, 0x20, 0x41, 0x64, + 0x6F, 0x62, 0x65, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x73, 0x20, + 0x49, 0x6E, 0x63, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x0D, 0x25, 0x20, 0x41, 0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, + 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2E, 0x0D, + 0x2F, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, + 0x64, 0x20, 0x7B, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, + 0x64, 0x20, 0x7D, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74, + 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, + 0x64, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, + 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, + 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x75, 0x70, 0x0D, + 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, + 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, + 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, + 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, + 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x6F, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6F, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, + 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, + 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, + 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6E, 0x65, 0x0D, 0x7B, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, + 0x20, 0x7B, 0x20, 0x31, 0x31, 0x20, 0x6C, 0x74, 0x20, 0x7D, 0x20, 0x69, + 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, + 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, + 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, + 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, + 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x31, 0x31, 0x20, 0x70, 0x6F, 0x70, + 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, + 0x74, 0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x57, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x67, 0x65, + 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x71, 0x0D, + 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, + 0x20, 0x7B, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, + 0x61, 0x6C, 0x6C, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x61, 0x62, + 0x73, 0x20, 0x2E, 0x30, 0x30, 0x31, 0x20, 0x67, 0x74, 0x20, 0x7D, 0x0D, + 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, + 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, + 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, + 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, + 0x20, 0x2F, 0x72, 0x61, 0x6E, 0x67, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, + 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, + 0x69, 0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, + 0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, + 0x68, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, + 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x20, 0x2F, + 0x46, 0x49, 0x44, 0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49, + 0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20, + 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20, 0x6F, + 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7B, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, + 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, + 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x2F, + 0x58, 0x55, 0x49, 0x44, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, + 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x67, 0x65, 0x74, 0x20, + 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x32, + 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, + 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, + 0x67, 0x74, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, + 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x0D, 0x65, 0x78, 0x63, 0x68, + 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x36, + 0x35, 0x35, 0x33, 0x36, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x63, 0x76, 0x69, + 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20, + 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, + 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x2F, + 0x58, 0x55, 0x49, 0x44, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x65, + 0x66, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, + 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, + 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, + 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x50, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, + 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, + 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, + 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x64, 0x69, 0x63, 0x74, + 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C, + 0x73, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, + 0x49, 0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, + 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20, + 0x6F, 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, + 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, + 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, + 0x73, 0x65, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, + 0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x66, 0x6F, + 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x2F, 0x24, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, + 0x20, 0x5B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, + 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, + 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, + 0x2D, 0x31, 0x20, 0x31, 0x20, 0x7B, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, + 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, + 0x68, 0x20, 0x33, 0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, + 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x30, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, + 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x65, 0x78, + 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, + 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x2F, 0x70, + 0x6F, 0x70, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, + 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, + 0x20, 0x31, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, + 0x7D, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, + 0x7B, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, + 0x20, 0x34, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, + 0x69, 0x66, 0x0D, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, + 0x2F, 0x6D, 0x75, 0x6C, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, + 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, + 0x6C, 0x73, 0x65, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, + 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, + 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, + 0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, + 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D, + 0x70, 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C, + 0x6F, 0x61, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x5D, 0x20, 0x63, + 0x76, 0x78, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x63, + 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E, + 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, + 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, + 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, + 0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, + 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, + 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, + 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, + 0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, + 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, + 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, + 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x0D, 0x7D, 0x20, 0x66, 0x6F, + 0x72, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7B, 0x20, + 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, + 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, + 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, + 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, + 0x65, 0x78, 0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, + 0x64, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x35, 0x20, 0x69, 0x6E, 0x64, + 0x65, 0x78, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x33, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, + 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, + 0x34, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, + 0x20, 0x67, 0x65, 0x74, 0x20, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, + 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, + 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, + 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x66, + 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, + 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, + 0x6F, 0x6C, 0x64, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64, + 0x20, 0x67, 0x65, 0x74, 0x20, 0x67, 0x74, 0x20, 0x33, 0x20, 0x63, 0x6F, + 0x70, 0x79, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x7B, 0x20, 0x6C, 0x65, 0x6E, + 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, + 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E, 0x65, 0x20, 0x7B, 0x20, + 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, + 0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, + 0x7B, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, + 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x72, 0x65, 0x61, + 0x6C, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, + 0x68, 0x20, 0x6F, 0x72, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x7D, 0x20, 0x66, + 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, + 0x73, 0x65, 0x20, 0x7D, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, + 0x38, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, + 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x35, 0x20, 0x69, 0x6E, + 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B, + 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, + 0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x31, + 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x78, 0x63, 0x68, 0x65, 0x63, + 0x6B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x78, 0x20, 0x7D, 0x20, 0x69, 0x66, + 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, + 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, + 0x20, 0x31, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, + 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, + 0x63, 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F, + 0x72, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x0D, 0x39, 0x20, 0x69, 0x6E, + 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x39, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, + 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x32, 0x20, 0x69, 0x6E, + 0x64, 0x65, 0x78, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, + 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, + 0x65, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x0D, 0x31, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x53, 0x74, + 0x65, 0x6D, 0x53, 0x6E, 0x61, 0x70, 0x48, 0x20, 0x65, 0x71, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x2F, 0x53, 0x74, 0x65, 0x6D, 0x53, 0x6E, 0x61, + 0x70, 0x56, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x64, + 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, + 0x73, 0x75, 0x62, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, + 0x6C, 0x65, 0x20, 0x7B, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, + 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x31, + 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, + 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, + 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x32, 0x20, 0x63, 0x6F, + 0x70, 0x79, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, + 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x32, 0x20, 0x69, 0x6E, + 0x64, 0x65, 0x78, 0x20, 0x30, 0x20, 0x70, 0x75, 0x74, 0x20, 0x30, 0x20, + 0x7D, 0x20, 0x69, 0x66, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x20, 0x31, 0x20, + 0x73, 0x75, 0x62, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, + 0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, + 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, + 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, + 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, + 0x0D, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, + 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, + 0x73, 0x75, 0x62, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x75, 0x74, + 0x0D, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20, + 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, + 0x20, 0x73, 0x75, 0x62, 0x20, 0x6C, 0x74, 0x20, 0x7B, 0x20, 0x31, 0x20, + 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, + 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, + 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x67, + 0x65, 0x74, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x30, + 0x20, 0x67, 0x74, 0x20, 0x7B, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, + 0x20, 0x69, 0x66, 0x20, 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, + 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, + 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, + 0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, + 0x65, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x20, 0x7D, + 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, + 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x0D, + 0x7B, 0x20, 0x2F, 0x64, 0x69, 0x63, 0x74, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x65, 0x71, 0x20, 0x7B, 0x20, 0x36, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, + 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x67, 0x65, 0x74, + 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, + 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, + 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, + 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, + 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63, + 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, + 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x6F, 0x70, 0x20, + 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x42, 0x6C, 0x65, 0x6E, 0x64, + 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, + 0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, + 0x20, 0x70, 0x75, 0x74, 0x0D, 0x2F, 0x24, 0x66, 0x62, 0x66, 0x20, 0x7B, + 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, + 0x72, 0x79, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, + 0x72, 0x6B, 0x20, 0x33, 0x20, 0x61, 0x64, 0x64, 0x20, 0x2D, 0x31, 0x20, + 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B, + 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, + 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x5D, 0x20, 0x65, 0x78, 0x63, 0x68, + 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x65, 0x78, + 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, + 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, + 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F, 0x45, 0x6E, + 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x67, 0x65, 0x74, 0x20, 0x70, + 0x75, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, + 0x74, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F, + 0x53, 0x63, 0x61, 0x6C, 0x65, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, + 0x67, 0x65, 0x74, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x66, 0x6F, 0x6E, 0x74, + 0x20, 0x73, 0x65, 0x74, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20, 0x62, + 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20, + 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, + 0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x4E, + 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x65, 0x44, 0x65, 0x73, 0x69, + 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x31, 0x31, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20, + 0x36, 0x38, 0x30, 0x20, 0x64, 0x69, 0x76, 0x0D, 0x65, 0x78, 0x63, 0x68, + 0x20, 0x31, 0x30, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20, 0x38, 0x30, 0x30, + 0x20, 0x64, 0x69, 0x76, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, + 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74, + 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, + 0x20, 0x7B, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, + 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, + 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, + 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, + 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, + 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, + 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, 0x31, + 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, + 0x78, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75, + 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x70, + 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x62, 0x69, 0x6E, + 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x6D, 0x6D, 0x66, 0x66, + 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, + 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, + 0x70, 0x20, 0x73, 0x61, 0x76, 0x65, 0x20, 0x7B, 0x20, 0x72, 0x65, 0x73, + 0x74, 0x6F, 0x72, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, + 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x7D, + 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x2F, 0x73, 0x65, 0x74, + 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, + 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, + 0x7D, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, + 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x2F, 0x66, 0x69, 0x6E, 0x64, + 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x70, + 0x6F, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6D, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, + 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, + 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, + 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, + 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, + 0x6C, 0x73, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, + 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, + 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x0D, + 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, + 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x7D, 0x20, 0x7B, 0x20, + 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x73, 0x63, 0x68, 0x65, + 0x63, 0x6B, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, + 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, + 0x64, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, + 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x73, + 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, + 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, + 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, + 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x2F, 0x24, + 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, + 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, + 0x6F, 0x6E, 0x74, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x66, + 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x64, 0x75, + 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, + 0x77, 0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F, 0x6E, + 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x33, 0x20, + 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x53, + 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, + 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, + 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, + 0x20, 0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, + 0x7D, 0x0D, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, + 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, + 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, + 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, + 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, + 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6E, 0x67, 0x20, 0x63, 0x76, 0x73, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x0D, 0x63, 0x76, 0x6E, 0x20, + 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74, + 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, + 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x65, 0x78, 0x63, + 0x68, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, + 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, + 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x6F, 0x72, 0x20, + 0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, + 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x37, 0x20, + 0x61, 0x64, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x64, + 0x75, 0x70, 0x20, 0x30, 0x20, 0x28, 0x25, 0x66, 0x6F, 0x6E, 0x74, 0x25, + 0x29, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6C, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, + 0x78, 0x20, 0x36, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, + 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6E, 0x67, 0x20, 0x63, 0x76, 0x73, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x7B, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65, + 0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, + 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x66, 0x61, + 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, + 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D, + 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, + 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, + 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x5B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, + 0x7B, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x72, 0x20, 0x7D, 0x20, 0x73, + 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, + 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, + 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, + 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, + 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, + 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, + 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, + 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, + 0x6F, 0x20, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, + 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x67, 0x65, 0x74, + 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6F, 0x75, 0x6E, + 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x32, 0x20, 0x73, 0x75, + 0x62, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, + 0x70, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, + 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, + 0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, + 0x69, 0x7A, 0x65, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, + 0x74, 0x6F, 0x72, 0x0D, 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x44, + 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D, + 0x5D, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, + 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, + 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x32, + 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, + 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x65, 0x78, 0x63, + 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, + 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x63, 0x6C, 0x65, + 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x24, 0x6D, 0x6D, + 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, + 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, + 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, + 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x24, 0x6D, 0x6D, + 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, + 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, + 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x24, 0x6D, 0x6D, + 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, + 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, + 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, + 0x62, 0x69, 0x6E, 0x64, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, + 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x53, 0x68, 0x61, 0x72, 0x65, + 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, + 0x72, 0x79, 0x20, 0x64, 0x75, 0x70, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, + 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, + 0x20, 0x7B, 0x20, 0x30, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x33, 0x20, + 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, + 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x65, 0x6E, 0x64, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, + 0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, + 0x74, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x65, 0x65, 0x78, 0x65, 0x63, 0x0D, + 0x80, 0x02, 0x0B, 0x8F, 0x01, 0x00, 0xE8, 0xDC, 0x61, 0x72, 0x80, 0x71, + 0xAB, 0xD4, 0xD5, 0xBC, 0xD2, 0x30, 0xC4, 0xE1, 0x86, 0xDC, 0xE0, 0x96, + 0x54, 0x1C, 0x9C, 0x1F, 0x2E, 0x58, 0x69, 0x40, 0x4E, 0x33, 0xF9, 0xCE, + 0xFF, 0x7D, 0x2F, 0xBF, 0xEF, 0x5F, 0x26, 0xC7, 0xE1, 0x84, 0x89, 0x54, + 0xC7, 0x07, 0x55, 0x24, 0x4E, 0x73, 0x41, 0xB8, 0x26, 0x97, 0xE2, 0xE8, + 0xEA, 0x9C, 0xE9, 0x13, 0x1D, 0x00, 0x55, 0x78, 0xAB, 0x3D, 0xE1, 0x9F, + 0xA9, 0xF2, 0xFA, 0xFF, 0x3B, 0xEB, 0x53, 0x17, 0x4A, 0x8E, 0x2F, 0x33, + 0xE9, 0xDB, 0xE0, 0x38, 0x63, 0x42, 0xF4, 0x0E, 0x5D, 0xF2, 0x5B, 0x7A, + 0x88, 0x22, 0xEE, 0x2B, 0x6C, 0xDC, 0xAC, 0x58, 0xA9, 0x8F, 0x9B, 0x04, + 0x71, 0x44, 0xE3, 0xF6, 0xE7, 0x4A, 0xB6, 0x0C, 0x00, 0xE4, 0x42, 0xE8, + 0x30, 0xB1, 0x30, 0x30, 0x8A, 0x3F, 0x0E, 0xDF, 0x2C, 0xE6, 0x62, 0x35, + 0xF9, 0x21, 0x6D, 0x42, 0x0F, 0x23, 0xAC, 0xED, 0xEC, 0x60, 0xA8, 0x8A, + 0x73, 0x77, 0x14, 0x62, 0xE1, 0xB2, 0x04, 0x04, 0x29, 0x5D, 0x49, 0xBA, + 0x8A, 0x8B, 0xCB, 0xF2, 0x04, 0x2A, 0x8D, 0xEB, 0x9A, 0x65, 0xBA, 0xF1, + 0xC8, 0x24, 0x2F, 0x7E, 0x90, 0xD9, 0x49, 0x63, 0x23, 0x73, 0xF8, 0x43, + 0x8F, 0xC1, 0xE7, 0x37, 0x37, 0x0B, 0x91, 0x15, 0x08, 0x9D, 0xA7, 0x90, + 0xA8, 0x28, 0x50, 0xB6, 0x91, 0xE6, 0xE8, 0x3B, 0x37, 0x22, 0xC0, 0x07, + 0x14, 0xDC, 0xBC, 0xEA, 0xA1, 0xDC, 0x3D, 0x22, 0x98, 0x3B, 0x35, 0x61, + 0x6A, 0xD7, 0xF1, 0x03, 0x35, 0x0B, 0x4A, 0x40, 0xB2, 0xAA, 0xE5, 0x0E, + 0xF0, 0x94, 0x6C, 0x77, 0xC5, 0x67, 0x73, 0x0D, 0x0D, 0xE6, 0x76, 0xA6, + 0x95, 0x13, 0x0A, 0xBE, 0xC8, 0xC7, 0xB8, 0xC4, 0x6B, 0xFA, 0xBC, 0xDA, + 0xDD, 0x88, 0x2C, 0x74, 0x58, 0x58, 0x9B, 0x2B, 0xEA, 0x87, 0xE1, 0x23, + 0x2C, 0x60, 0x58, 0x0C, 0x62, 0x35, 0xB7, 0xD7, 0xE8, 0xC6, 0x6A, 0x2A, + 0x72, 0x90, 0x1F, 0x3D, 0x0D, 0x76, 0x59, 0x30, 0x0E, 0x7E, 0x04, 0xFF, + 0xDE, 0x4A, 0xA6, 0xD8, 0x88, 0x25, 0x75, 0x76, 0x30, 0xCF, 0x8C, 0x9E, + 0x8E, 0xA4, 0x14, 0x10, 0x7F, 0x2F, 0xC4, 0xA8, 0x0F, 0xCA, 0xAF, 0xCB, + 0x54, 0x39, 0x87, 0x1A, 0x81, 0x71, 0xFB, 0xA5, 0x08, 0x17, 0x4F, 0x53, + 0xB8, 0xEC, 0xE2, 0xD3, 0xBF, 0xBD, 0xBA, 0x93, 0x75, 0xFF, 0x8F, 0xB9, + 0x66, 0x12, 0x02, 0x21, 0x87, 0x6D, 0xB0, 0xDC, 0x2D, 0x37, 0x22, 0xB7, + 0x88, 0xB4, 0xD3, 0x8F, 0x8B, 0x24, 0xEF, 0x76, 0xF3, 0xB4, 0x91, 0x58, + 0x95, 0xFF, 0x41, 0xD8, 0xFA, 0xFA, 0xD8, 0xE8, 0x68, 0xA9, 0xA8, 0x5B, + 0x59, 0x2C, 0xF0, 0x30, 0xA1, 0xD0, 0x44, 0x8A, 0x81, 0xF5, 0xE6, 0x92, + 0x1E, 0xAE, 0xE8, 0x26, 0xA4, 0xD9, 0xB7, 0x05, 0x5A, 0x9C, 0xA1, 0xC7, + 0x98, 0xAA, 0xFA, 0x25, 0x91, 0x11, 0x4D, 0x61, 0xCB, 0x50, 0x2E, 0xFC, + 0xFC, 0x44, 0x63, 0x02, 0x08, 0xCB, 0xA9, 0x17, 0x10, 0x3B, 0xC3, 0xA1, + 0x2A, 0x60, 0xB1, 0x79, 0x84, 0x95, 0x83, 0xD0, 0xB1, 0xF1, 0xDC, 0x9F, + 0xBE, 0xB2, 0xBC, 0x90, 0xD1, 0xE4, 0xF2, 0x42, 0xD5, 0x08, 0x0B, 0xD4, + 0xB1, 0x4C, 0x73, 0x8D, 0x0C, 0xD1, 0x69, 0xC8, 0x1E, 0xB6, 0x84, 0x5F, + 0xD9, 0x2D, 0xAB, 0x2A, 0x6B, 0xBB, 0x48, 0x3F, 0xB6, 0xFB, 0x08, 0x2F, + 0x57, 0x11, 0xAB, 0x42, 0x54, 0xC9, 0xD7, 0xB1, 0xF8, 0x28, 0xBA, 0xCD, + 0x68, 0xF9, 0x0D, 0xE0, 0xD1, 0x26, 0xCE, 0xA0, 0x24, 0x56, 0x63, 0xB7, + 0xA1, 0xC6, 0x85, 0xD8, 0x55, 0x18, 0x60, 0x25, 0x55, 0x0B, 0xC6, 0x9B, + 0xC4, 0x28, 0x0C, 0x37, 0xE0, 0x9A, 0x74, 0x52, 0x0D, 0x76, 0x5F, 0x41, + 0xDC, 0xEA, 0xD8, 0x35, 0x1A, 0xB7, 0x49, 0xC3, 0x5C, 0x6D, 0xD0, 0x83, + 0x7A, 0x4F, 0xC1, 0xCB, 0x12, 0xAB, 0x27, 0x4B, 0xCF, 0x7F, 0xF8, 0x01, + 0xC1, 0x8D, 0x13, 0x34, 0x62, 0xFF, 0xE0, 0x5C, 0x56, 0xCE, 0x4E, 0x3D, + 0x34, 0x37, 0xAC, 0xFB, 0xB0, 0x3E, 0x05, 0xA6, 0x2B, 0xF6, 0x2C, 0xA2, + 0x46, 0x65, 0x6A, 0xAF, 0x3E, 0xD6, 0x5A, 0x92, 0x22, 0xFF, 0x51, 0xF3, + 0x19, 0x27, 0x39, 0xB3, 0x32, 0x7F, 0x94, 0x7A, 0x6B, 0x56, 0xF8, 0xB8, + 0xA5, 0x70, 0xB1, 0x3F, 0x15, 0x15, 0xF6, 0x61, 0x4B, 0x88, 0xB0, 0x12, + 0xE0, 0x4F, 0x6F, 0xE9, 0xCB, 0x2C, 0x72, 0x01, 0xB1, 0xDB, 0x85, 0x78, + 0x3C, 0x0F, 0xD2, 0x3B, 0x54, 0x8E, 0x29, 0x21, 0x66, 0xBA, 0x80, 0xC6, + 0x05, 0x5E, 0xD1, 0xD9, 0x93, 0xCD, 0x63, 0xA0, 0x95, 0xBB, 0x26, 0xA3, + 0x36, 0x12, 0x2D, 0x1C, 0xE4, 0xEA, 0x98, 0xE6, 0xDC, 0x9F, 0xD6, 0x61, + 0xF8, 0x71, 0x14, 0xFE, 0xF8, 0x10, 0xB9, 0x24, 0x36, 0xF9, 0xB3, 0x6C, + 0x0F, 0xC3, 0x28, 0x46, 0x43, 0x19, 0xAF, 0xA7, 0xB1, 0xEC, 0x4A, 0x88, + 0x7C, 0xE7, 0x85, 0x81, 0x23, 0x69, 0xF3, 0x21, 0x90, 0xEB, 0x3D, 0xB1, + 0x73, 0x4A, 0xB2, 0xF2, 0x55, 0x30, 0xF8, 0x02, 0x79, 0x76, 0x1D, 0xFB, + 0x0A, 0x40, 0x06, 0x61, 0xCC, 0xCB, 0x47, 0x94, 0x1A, 0x74, 0x70, 0x8F, + 0x1B, 0x93, 0x16, 0x24, 0xAA, 0x32, 0xD4, 0xB0, 0xEE, 0xCA, 0xEE, 0x0D, + 0x27, 0x71, 0x0D, 0xE8, 0xCC, 0xD7, 0x2A, 0x28, 0xA5, 0xC4, 0xD8, 0xDD, + 0x0B, 0x16, 0x74, 0xF7, 0xE3, 0x61, 0x06, 0x37, 0x24, 0x1C, 0x00, 0x14, + 0x0C, 0x32, 0x7F, 0x88, 0x75, 0xF9, 0x9B, 0xFA, 0x3B, 0xCA, 0xF6, 0x51, + 0xD2, 0xAB, 0xD5, 0x3F, 0x21, 0xCD, 0x51, 0x3D, 0x3D, 0xB4, 0x81, 0xF9, + 0x33, 0x79, 0xE9, 0x62, 0x9F, 0x93, 0x5F, 0xA8, 0x77, 0x26, 0x75, 0x01, + 0x40, 0xD3, 0xE3, 0xBD, 0x68, 0x8D, 0x1B, 0xCC, 0xE7, 0x79, 0xB2, 0x3E, + 0x61, 0xB6, 0x00, 0xF0, 0x0A, 0x58, 0xF2, 0xC1, 0x4C, 0x5A, 0xA4, 0x86, + 0xD4, 0xCA, 0xCB, 0x15, 0xCC, 0xD1, 0x16, 0x74, 0x70, 0xF3, 0xCB, 0xBA, + 0x0E, 0x8A, 0xDB, 0xEB, 0x4F, 0x3D, 0x0C, 0x3C, 0xFE, 0x40, 0x7D, 0x46, + 0xC0, 0x0E, 0x0E, 0x18, 0x64, 0x69, 0xAB, 0xEF, 0x00, 0x68, 0x83, 0x95, + 0xFF, 0x32, 0xF3, 0x13, 0x78, 0x8C, 0x1E, 0xF9, 0xA8, 0xE8, 0x2D, 0x5F, + 0x04, 0xB8, 0x15, 0x22, 0x76, 0xDD, 0x46, 0xCF, 0x69, 0xA4, 0xCE, 0x5B, + 0x20, 0x77, 0xA0, 0x22, 0x24, 0xE5, 0xDE, 0xB8, 0xF3, 0x44, 0x5B, 0xC9, + 0xEF, 0x47, 0xFD, 0x3A, 0x02, 0xAF, 0x31, 0x6C, 0x02, 0x4A, 0x02, 0x3C, + 0x65, 0x5A, 0x0B, 0x63, 0xB0, 0x11, 0xBB, 0x07, 0x3C, 0xFC, 0xFA, 0xAD, + 0x93, 0x46, 0x11, 0x6D, 0x68, 0xFF, 0xB7, 0xC7, 0x58, 0x2F, 0x7C, 0x23, + 0x62, 0xD7, 0xD9, 0xF9, 0x7A, 0x8A, 0xD3, 0x11, 0x58, 0xAC, 0x43, 0x0D, + 0xA0, 0x77, 0x8D, 0x88, 0xD5, 0x34, 0xD1, 0xB9, 0x2E, 0x4A, 0x8C, 0xDC, + 0xA0, 0x71, 0xB9, 0xB2, 0x18, 0xC5, 0x74, 0x1E, 0x48, 0x9E, 0x70, 0x0A, + 0x7E, 0x9B, 0x71, 0xFA, 0xC7, 0x4D, 0x3C, 0x6E, 0x19, 0x88, 0xF0, 0xE2, + 0xA5, 0x99, 0x3D, 0x85, 0xBB, 0xE1, 0xDA, 0x82, 0x7B, 0xA9, 0xBA, 0x59, + 0x0E, 0x03, 0x26, 0x3B, 0x83, 0xC8, 0x81, 0x36, 0x70, 0xA4, 0x11, 0x97, + 0x97, 0xB6, 0x47, 0x7D, 0x81, 0x02, 0x45, 0x1C, 0x76, 0x33, 0x98, 0x84, + 0xFE, 0xFE, 0x65, 0xDE, 0x37, 0x31, 0xE7, 0xD9, 0x6F, 0xDC, 0xAC, 0xC1, + 0x1C, 0x1F, 0xA4, 0x08, 0x98, 0x47, 0xD3, 0x53, 0xF9, 0x24, 0x6E, 0x26, + 0x99, 0x7C, 0xF2, 0xCF, 0x2A, 0xC8, 0xCC, 0xAD, 0x17, 0x09, 0xE3, 0x1B, + 0x66, 0xAC, 0x24, 0x6F, 0xE0, 0x88, 0x14, 0xC4, 0x8A, 0xF2, 0xFA, 0x93, + 0xE9, 0x48, 0xB5, 0xA4, 0x52, 0xF9, 0xDE, 0x54, 0xF5, 0xF4, 0x20, 0x95, + 0x45, 0xCE, 0x37, 0x2E, 0x9E, 0x0A, 0xC7, 0x89, 0xF2, 0x00, 0x64, 0x6D, + 0xBC, 0xAF, 0x9F, 0x52, 0xBC, 0xA0, 0x17, 0xE3, 0x20, 0x42, 0xAB, 0xBF, + 0xFB, 0x2A, 0x7F, 0x51, 0xAC, 0xCC, 0x40, 0xEF, 0x6D, 0xF2, 0xBC, 0x3D, + 0xE2, 0xDC, 0x99, 0x0C, 0x2D, 0xBC, 0x47, 0x1D, 0x98, 0x02, 0x0B, 0xB2, + 0xE2, 0xA2, 0x03, 0x47, 0x3C, 0x17, 0x69, 0xD6, 0x09, 0xA4, 0x8B, 0x9F, + 0x63, 0x40, 0xD8, 0x5F, 0x67, 0xB3, 0x95, 0x28, 0x16, 0xAF, 0x67, 0x97, + 0x3A, 0x67, 0x29, 0x67, 0x3C, 0xF1, 0x9D, 0x24, 0x34, 0xE3, 0x47, 0x14, + 0xC6, 0x94, 0xA0, 0x1F, 0xB7, 0x64, 0x9D, 0x7E, 0x38, 0xB8, 0x70, 0xD2, + 0x4A, 0x74, 0x54, 0xA4, 0x64, 0x34, 0x27, 0x3B, 0xB7, 0x98, 0x18, 0x07, + 0x1F, 0x4E, 0x00, 0x86, 0x91, 0x6A, 0x71, 0x09, 0x72, 0x6B, 0x42, 0x4F, + 0x11, 0x62, 0xDC, 0x0B, 0x15, 0x0C, 0x74, 0x0B, 0x6D, 0xFF, 0xC2, 0x28, + 0x98, 0x97, 0x33, 0x65, 0xD6, 0xBB, 0x83, 0x4E, 0x4B, 0xE2, 0xCF, 0x7E, + 0x98, 0x4B, 0xAD, 0x55, 0xF2, 0x1A, 0xEF, 0x15, 0x05, 0xA6, 0xB6, 0xF4, + 0xDD, 0x97, 0xAA, 0x81, 0x6D, 0x84, 0x86, 0x17, 0xA0, 0xA5, 0x1D, 0xC3, + 0x8C, 0xEA, 0x28, 0xCE, 0x69, 0xCC, 0x56, 0x15, 0xFA, 0xD3, 0xEC, 0x12, + 0xCD, 0x8A, 0x98, 0xD5, 0x13, 0xE9, 0x72, 0xBF, 0x01, 0xCE, 0xBA, 0xF7, + 0xCA, 0x85, 0x8C, 0x64, 0x55, 0x60, 0xBA, 0x61, 0xF0, 0xDE, 0x97, 0xD9, + 0x15, 0xCF, 0xE2, 0x9C, 0xA3, 0x9A, 0x5F, 0x9F, 0xFE, 0xD3, 0xC7, 0x5A, + 0xF4, 0x44, 0x69, 0x7F, 0x63, 0x41, 0x97, 0x33, 0xD7, 0x41, 0xDF, 0x9B, + 0x3F, 0x03, 0x23, 0x4A, 0x84, 0x7B, 0x4E, 0xB9, 0x94, 0x3D, 0xBD, 0x32, + 0x56, 0x1C, 0x47, 0x7A, 0xF0, 0xED, 0x9D, 0x99, 0x24, 0x09, 0xC6, 0x50, + 0xC0, 0x98, 0xEA, 0xFE, 0x70, 0x8B, 0xDF, 0xB8, 0x5E, 0x7D, 0x64, 0x2C, + 0xDC, 0xB5, 0x5F, 0xCA, 0xF6, 0x7B, 0x02, 0x88, 0xA2, 0x82, 0xD2, 0x14, + 0x0E, 0xA4, 0x14, 0x3B, 0x4A, 0x95, 0x14, 0x5E, 0xD9, 0xFB, 0x47, 0x5F, + 0x36, 0x9F, 0x85, 0xC2, 0x94, 0x15, 0xB9, 0xC0, 0x01, 0x08, 0x86, 0x75, + 0x1E, 0x88, 0x2D, 0x5A, 0x39, 0xC1, 0xDE, 0xC1, 0x8B, 0x32, 0xC4, 0xE7, + 0x19, 0xA6, 0xFE, 0xFC, 0x62, 0xE9, 0xCF, 0x3E, 0x11, 0xD1, 0x5E, 0x24, + 0x66, 0x23, 0x5B, 0x8F, 0x42, 0x83, 0xD6, 0x3E, 0x2A, 0xE5, 0xF2, 0xE3, + 0x6A, 0x69, 0x40, 0xBE, 0xD4, 0xFA, 0x83, 0xC6, 0xE8, 0x2B, 0x35, 0xFE, + 0x1A, 0xD1, 0xF3, 0x37, 0x9A, 0x88, 0xA0, 0xC9, 0x55, 0x13, 0x4B, 0xC0, + 0xEC, 0x45, 0xD7, 0x48, 0x16, 0x28, 0x99, 0xE4, 0x3B, 0x77, 0xF2, 0xB9, + 0x27, 0x34, 0x4F, 0xAB, 0x18, 0x87, 0x63, 0xE5, 0xF5, 0x68, 0x57, 0x9D, + 0x5C, 0xAD, 0x53, 0xD7, 0x25, 0xB3, 0x99, 0x5D, 0x70, 0xE0, 0xF6, 0x72, + 0xBE, 0xD9, 0x5E, 0x82, 0xFB, 0xD0, 0x72, 0xF5, 0x6E, 0x86, 0xEF, 0x7C, + 0xD8, 0x23, 0x1E, 0x85, 0x20, 0x7C, 0xEA, 0x2C, 0x8E, 0x09, 0x2A, 0x9B, + 0x73, 0x62, 0xD3, 0x96, 0xAA, 0xE0, 0x45, 0x1E, 0x63, 0x57, 0xB7, 0x6A, + 0xB7, 0xB8, 0xFE, 0x01, 0x85, 0x93, 0xEB, 0x7B, 0x25, 0x41, 0xE5, 0x7D, + 0xE5, 0x20, 0x50, 0x15, 0x92, 0x06, 0xFE, 0xFA, 0x3F, 0x93, 0x16, 0xC5, + 0x6F, 0x4A, 0xDF, 0xB3, 0xB9, 0x43, 0x17, 0x32, 0xAF, 0x81, 0x3B, 0x61, + 0x19, 0xDE, 0xCD, 0xBB, 0x7E, 0x24, 0x74, 0xDD, 0xEB, 0xAE, 0xEA, 0x64, + 0x34, 0x59, 0x30, 0x31, 0x84, 0x15, 0x77, 0x30, 0x0A, 0xB6, 0x5D, 0xD9, + 0x3A, 0x47, 0xD2, 0x9D, 0xA9, 0x57, 0x6F, 0x1D, 0x3E, 0x47, 0x82, 0xAD, + 0x80, 0x4C, 0x11, 0x64, 0x4A, 0xA5, 0x28, 0xAE, 0xD3, 0x52, 0x13, 0x23, + 0xEF, 0x74, 0x9D, 0x05, 0xBD, 0xCA, 0x9D, 0xAF, 0x69, 0x55, 0xE8, 0x96, + 0xDB, 0x35, 0x52, 0x75, 0x0D, 0x7A, 0x19, 0x3E, 0xE9, 0x11, 0xF1, 0x84, + 0x5E, 0xB5, 0x1F, 0xD8, 0xF4, 0xA3, 0x25, 0x2A, 0x7F, 0xAF, 0x44, 0xD0, + 0xAC, 0x7F, 0x9C, 0x87, 0xB1, 0x11, 0x48, 0x69, 0x9F, 0x3C, 0x60, 0xC4, + 0x38, 0x40, 0xBF, 0x43, 0xA2, 0xE4, 0x37, 0xC3, 0x7E, 0xB1, 0x51, 0x82, + 0x93, 0xFE, 0x7F, 0xD1, 0x30, 0xD8, 0xBF, 0xD8, 0x6D, 0x7A, 0xE8, 0x38, + 0xFA, 0xE5, 0x4B, 0x42, 0x2C, 0x24, 0xF3, 0xA1, 0x7D, 0xE3, 0xE7, 0x9A, + 0x6B, 0x53, 0x3C, 0xAC, 0x00, 0x6A, 0xB5, 0xF9, 0x10, 0xD5, 0x3D, 0x11, + 0xE4, 0x1D, 0x51, 0xA2, 0x40, 0xC4, 0x48, 0xDC, 0x1C, 0x30, 0xA8, 0x1F, + 0x89, 0xE2, 0x53, 0x25, 0xF2, 0xDA, 0xE3, 0xA4, 0xD6, 0xBB, 0x72, 0x5A, + 0x0F, 0x3F, 0x98, 0xE4, 0x27, 0xF2, 0xC6, 0x82, 0x5B, 0x64, 0x8A, 0x3D, + 0x29, 0x9A, 0xBF, 0x6A, 0x0D, 0x61, 0xA1, 0xCF, 0x4F, 0x00, 0xE0, 0xE2, + 0x9A, 0x45, 0xF7, 0xDB, 0x38, 0x0D, 0x38, 0x7C, 0x98, 0x20, 0xB6, 0xA8, + 0x00, 0xFE, 0xB5, 0xCD, 0xBB, 0xC2, 0x8A, 0xDF, 0xA3, 0x23, 0x87, 0x77, + 0x7F, 0x33, 0x36, 0xB2, 0xC3, 0x90, 0xAA, 0x49, 0x92, 0x71, 0xEB, 0xFE, + 0xCD, 0x32, 0xD1, 0xAB, 0x22, 0xB3, 0xC6, 0x4B, 0x12, 0x7E, 0x53, 0xAA, + 0xCF, 0xC7, 0x01, 0xDA, 0x38, 0x2A, 0x0A, 0x54, 0xFC, 0x88, 0x41, 0x15, + 0x04, 0x27, 0x02, 0x8C, 0x0F, 0x6D, 0xC2, 0xCF, 0xDA, 0xF8, 0x3C, 0xF7, + 0x58, 0xE2, 0x70, 0x1A, 0x7E, 0xBE, 0x39, 0xEE, 0xC2, 0x7A, 0xD5, 0x52, + 0x4B, 0x62, 0x84, 0xDE, 0x91, 0x46, 0xDC, 0x3A, 0x67, 0x4A, 0xE6, 0x4D, + 0x82, 0xFA, 0x60, 0xE2, 0x34, 0x26, 0x1A, 0xD8, 0x0D, 0xA1, 0x57, 0x62, + 0x04, 0x38, 0x52, 0x4D, 0xA6, 0x8B, 0xC2, 0x0E, 0xCE, 0x26, 0x28, 0x31, + 0x53, 0xC6, 0x63, 0x5A, 0x75, 0x45, 0x65, 0xDA, 0x4B, 0x8D, 0x77, 0xB0, + 0x06, 0x28, 0x36, 0x43, 0x1D, 0xA3, 0xC7, 0x33, 0x28, 0x8D, 0x70, 0xB5, + 0x0D, 0x24, 0x25, 0x50, 0xA2, 0xEB, 0x50, 0x61, 0x98, 0x3D, 0x8C, 0xCD, + 0xDC, 0x17, 0x3F, 0xE4, 0xDD, 0x46, 0x3A, 0xD0, 0xA6, 0x78, 0xD7, 0x85, + 0x63, 0xC8, 0x3A, 0x54, 0xDB, 0xD5, 0xB9, 0x7C, 0x4B, 0xFD, 0x1E, 0xA2, + 0xBD, 0x97, 0x22, 0x09, 0x06, 0x8F, 0xA5, 0x49, 0x06, 0x29, 0x71, 0x13, + 0x69, 0xCE, 0xEC, 0x75, 0xE9, 0x93, 0x58, 0x80, 0x05, 0xFF, 0xBF, 0x1D, + 0x48, 0xCE, 0x34, 0xDC, 0x03, 0x40, 0xB9, 0x6F, 0x40, 0x94, 0x2C, 0x30, + 0xD0, 0x6F, 0x35, 0xC0, 0x46, 0xE5, 0xD1, 0xFF, 0x44, 0x83, 0x2C, 0x6D, + 0x6C, 0xB2, 0x04, 0xD8, 0xB0, 0x1E, 0x2C, 0xF8, 0x71, 0xA4, 0xA1, 0x60, + 0x23, 0x8F, 0x19, 0xF7, 0x58, 0x29, 0x42, 0x9F, 0x24, 0x18, 0x2B, 0xD3, + 0xF0, 0x31, 0x45, 0xB1, 0xA3, 0x5E, 0xA1, 0xC9, 0x52, 0xEE, 0xE6, 0xF5, + 0x0A, 0xBB, 0xEB, 0x6B, 0x09, 0xE9, 0xA7, 0x84, 0xB6, 0x1C, 0xE3, 0xA3, + 0x0B, 0x7E, 0x8A, 0x0B, 0xD0, 0x4C, 0xE9, 0x50, 0x45, 0x34, 0x21, 0x1B, + 0x55, 0x0E, 0x12, 0x1A, 0x74, 0xDE, 0x28, 0xEB, 0x20, 0x66, 0x13, 0xBB, + 0xEA, 0xC7, 0xDA, 0xCF, 0xB4, 0x16, 0x57, 0x65, 0x0A, 0xAD, 0x98, 0xF7, + 0x03, 0x1E, 0xF5, 0xD9, 0xFC, 0x3E, 0x59, 0xEC, 0x7A, 0x2B, 0x46, 0xC0, + 0x13, 0x19, 0xD8, 0xFD, 0xF7, 0x0D, 0x61, 0xFC, 0x41, 0x2A, 0x5C, 0xC7, + 0x84, 0x95, 0xEF, 0x31, 0x9F, 0x1F, 0x84, 0x53, 0x7E, 0xA8, 0x37, 0x04, + 0x1D, 0x1D, 0x08, 0xD5, 0xE5, 0x4B, 0x0C, 0x06, 0xCC, 0x14, 0x19, 0xA9, + 0x4D, 0x75, 0x06, 0x49, 0x48, 0xC9, 0xDB, 0x3F, 0x1B, 0xB1, 0x0D, 0x19, + 0x71, 0xEB, 0x13, 0xE1, 0x26, 0xAF, 0xC0, 0xD9, 0x87, 0xC3, 0xD8, 0x68, + 0x8A, 0x3C, 0x96, 0x6B, 0xDE, 0x94, 0x3D, 0x60, 0x0B, 0x24, 0x8F, 0x0C, + 0xE1, 0xA3, 0xA7, 0x05, 0x40, 0xB7, 0x24, 0x35, 0x82, 0x45, 0xA0, 0xE0, + 0x26, 0xD2, 0xFA, 0xAB, 0x59, 0x33, 0x4E, 0x95, 0xD2, 0xFA, 0x72, 0x82, + 0x2C, 0x00, 0x2F, 0xE0, 0xE5, 0x49, 0x16, 0x30, 0x0C, 0x3A, 0xC1, 0xDC, + 0x11, 0x70, 0x59, 0xF9, 0x98, 0x81, 0xBB, 0x9F, 0x60, 0xEB, 0xB0, 0xAD, + 0x5B, 0x65, 0x7A, 0xC4, 0x3E, 0xE7, 0x6A, 0x3D, 0xD2, 0x7D, 0x02, 0xD3, + 0xA8, 0x98, 0xE5, 0xF1, 0xF5, 0xE1, 0xCF, 0xFA, 0x71, 0x50, 0xAA, 0x8A, + 0xB1, 0x43, 0xDC, 0x3A, 0x0E, 0xC2, 0x77, 0xF3, 0x95, 0x39, 0x82, 0x1D, + 0x4D, 0x88, 0xFD, 0xA6, 0x55, 0x02, 0x5C, 0x80, 0x1E, 0x84, 0x91, 0x5C, + 0x7D, 0x63, 0x36, 0x42, 0x68, 0xA8, 0x15, 0x72, 0x40, 0xC0, 0xF5, 0x52, + 0xC8, 0x9B, 0xB8, 0xAD, 0x00, 0xCB, 0x4B, 0x0A, 0x87, 0x54, 0x96, 0x48, + 0x47, 0x7D, 0x39, 0xCA, 0x1D, 0xF0, 0x83, 0x63, 0x9A, 0x7F, 0xE9, 0xB5, + 0x5A, 0x11, 0x2F, 0x94, 0x30, 0x9F, 0x1D, 0xD6, 0xD5, 0x98, 0xCB, 0x80, + 0x7B, 0x82, 0x2B, 0xC0, 0xA0, 0x73, 0xBD, 0x17, 0x33, 0xE4, 0x3B, 0xE0, + 0xE5, 0x20, 0x59, 0xE6, 0x94, 0xF8, 0xD5, 0x41, 0x21, 0x2D, 0xAD, 0xF0, + 0x10, 0x08, 0x79, 0x60, 0x2F, 0x7E, 0x26, 0x82, 0xE8, 0xA2, 0x41, 0x79, + 0xE7, 0xF6, 0x06, 0xC0, 0xB2, 0x59, 0xF9, 0x5B, 0x1B, 0x20, 0x12, 0xA0, + 0xF5, 0xD8, 0x0F, 0x1F, 0xA6, 0x96, 0x0A, 0x69, 0x3B, 0x2B, 0xD1, 0x95, + 0x18, 0x7F, 0xA4, 0x1B, 0x4B, 0xE4, 0x82, 0xDA, 0x50, 0x41, 0xA6, 0x30, + 0x0D, 0xC0, 0x68, 0xEC, 0xA9, 0x43, 0x2E, 0x17, 0x13, 0x0B, 0x21, 0x00, + 0x42, 0xF5, 0xCE, 0x2F, 0x10, 0x81, 0x3D, 0x6F, 0xDB, 0xDE, 0x81, 0xD1, + 0x10, 0xDE, 0x4E, 0x02, 0x98, 0x85, 0x29, 0x81, 0x59, 0xC4, 0x24, 0x82, + 0x25, 0xF0, 0x3D, 0x93, 0xB3, 0x08, 0xC9, 0xC5, 0x3D, 0xA1, 0x97, 0xAE, + 0x2D, 0xE3, 0x93, 0xAC, 0xBB, 0xB2, 0x06, 0xC6, 0x54, 0x58, 0x1C, 0x9A, + 0x37, 0x6B, 0xDE, 0xEA, 0x63, 0xDE, 0x3F, 0x07, 0x76, 0xFF, 0x8E, 0x41, + 0x4D, 0x2E, 0x04, 0x54, 0x7D, 0xDF, 0x7F, 0x26, 0x6A, 0xD2, 0x5D, 0xBB, + 0x19, 0x5F, 0x2B, 0x09, 0xF4, 0x15, 0x7D, 0x5E, 0xB5, 0x48, 0xEE, 0xF1, + 0x17, 0xC0, 0x32, 0xE6, 0x14, 0x2C, 0x2D, 0xF3, 0xDD, 0xDA, 0xFD, 0xC5, + 0x2D, 0x05, 0xB3, 0x7D, 0x69, 0x42, 0xF4, 0x4F, 0xDC, 0xEE, 0x27, 0x6C, + 0x10, 0x59, 0xCB, 0x63, 0xF6, 0xE9, 0xC2, 0x3B, 0x8A, 0xD0, 0xA8, 0x10, + 0x70, 0xF1, 0x35, 0x2B, 0x3D, 0x8E, 0xAE, 0xBD, 0xD3, 0xB7, 0xE2, 0x9E, + 0x3A, 0xD7, 0xBD, 0xF5, 0x38, 0x32, 0x90, 0x4F, 0xE2, 0x42, 0xB7, 0x73, + 0xE0, 0xFE, 0x83, 0xEA, 0x25, 0x87, 0xFB, 0xB7, 0xE7, 0x31, 0x66, 0xEB, + 0xAA, 0xCC, 0x40, 0x4F, 0x35, 0x18, 0x21, 0xFF, 0x31, 0x3C, 0x61, 0x8C, + 0xEC, 0xB4, 0x20, 0xD0, 0xFE, 0x1C, 0x81, 0x53, 0xB0, 0x6F, 0x76, 0xF7, + 0x0F, 0x7F, 0x51, 0x51, 0x40, 0xAE, 0x35, 0x84, 0x84, 0xA9, 0x35, 0x9C, + 0xC0, 0x3C, 0x0D, 0x7E, 0x73, 0x5B, 0xA7, 0xE6, 0x28, 0x62, 0x6C, 0x53, + 0x68, 0x2D, 0x72, 0xA1, 0x0F, 0x63, 0xCB, 0x79, 0x79, 0xE5, 0xA5, 0x24, + 0xCF, 0x6A, 0x60, 0x6C, 0x0E, 0xF3, 0x52, 0x5B, 0xDF, 0xA4, 0x26, 0x7C, + 0xC2, 0xF3, 0xD1, 0x20, 0x8A, 0x8C, 0x80, 0x04, 0x77, 0xCE, 0x0C, 0xE0, + 0xA3, 0x8C, 0xE5, 0xC2, 0xDE, 0x60, 0xC1, 0x35, 0x18, 0xA8, 0x94, 0xCF, + 0xEA, 0x81, 0xD8, 0xE9, 0x22, 0x93, 0xDB, 0x7A, 0xAA, 0x51, 0xAD, 0xE5, + 0x44, 0x6B, 0x31, 0xFF, 0x04, 0xE1, 0xB6, 0xE3, 0x55, 0xFA, 0xEF, 0x17, + 0xE7, 0x94, 0x37, 0xDF, 0x89, 0xD5, 0x29, 0x07, 0x96, 0xC7, 0x76, 0xE5, + 0x21, 0xD7, 0xE2, 0xB3, 0xA4, 0x77, 0x6F, 0xE4, 0x1E, 0xAD, 0x03, 0x64, + 0xF5, 0x38, 0x33, 0xC5, 0x74, 0x2E, 0xA1, 0xF1, 0xBB, 0xAF, 0x1B, 0x24, + 0x8B, 0xEE, 0x46, 0x86, 0x25, 0xAD, 0x95, 0x5E, 0x28, 0x1F, 0xE9, 0x2C, + 0xCD, 0xC9, 0x85, 0xFC, 0x5B, 0x74, 0x3F, 0xF3, 0xF9, 0x2B, 0x5C, 0x23, + 0x5C, 0xD0, 0xBA, 0xBA, 0x7E, 0x8C, 0xA0, 0xA9, 0x56, 0xA0, 0x55, 0xA5, + 0x36, 0x7D, 0xB8, 0x8B, 0xA6, 0x46, 0x62, 0x1C, 0x1E, 0x7E, 0x7C, 0xE3, + 0xC3, 0xEA, 0x33, 0x8E, 0x28, 0x9A, 0xA8, 0xB6, 0x8E, 0xC3, 0xA4, 0x0F, + 0x4A, 0x23, 0xFF, 0x6F, 0x3B, 0x2A, 0xBE, 0x65, 0x97, 0x10, 0x30, 0x12, + 0xC0, 0xA6, 0x3A, 0x34, 0xE3, 0x6C, 0xA8, 0x11, 0xED, 0x78, 0x60, 0xE2, + 0xAE, 0xC8, 0x2E, 0xE3, 0xEA, 0xB9, 0x3E, 0xAB, 0xBD, 0x15, 0x49, 0x9C, + 0x75, 0xD7, 0x49, 0xE3, 0x5C, 0xE9, 0xA2, 0x8A, 0x0C, 0xBE, 0x74, 0x81, + 0x1D, 0xE0, 0xCA, 0x12, 0x3E, 0x8A, 0x23, 0xF2, 0x7B, 0x5D, 0xF0, 0xF7, + 0x0E, 0x1B, 0x73, 0xF6, 0x5E, 0x8C, 0xE0, 0x8E, 0x57, 0xD5, 0x01, 0x56, + 0x5E, 0x3B, 0x7C, 0xC8, 0xF7, 0xE4, 0x61, 0x70, 0x5D, 0x4F, 0xC3, 0x01, + 0x26, 0x2A, 0x71, 0x26, 0x50, 0x9B, 0x65, 0xA1, 0x49, 0xBE, 0x50, 0x4C, + 0x44, 0x3C, 0x5B, 0x09, 0x3B, 0x39, 0x32, 0x34, 0x82, 0x3B, 0xBF, 0x74, + 0x6B, 0x37, 0x59, 0xF4, 0x13, 0x21, 0x30, 0x86, 0x6D, 0x94, 0xDE, 0x2F, + 0x5F, 0x69, 0x07, 0x32, 0xFF, 0x14, 0x88, 0x46, 0xA4, 0xB1, 0x9E, 0x69, + 0x5A, 0xB7, 0x91, 0x41, 0x2A, 0x62, 0x3C, 0x81, 0xE1, 0x4A, 0x47, 0x9D, + 0x61, 0xB2, 0x46, 0x2D, 0x04, 0x3F, 0xD9, 0x57, 0xF2, 0xAB, 0xC9, 0x4F, + 0xB3, 0xCE, 0x11, 0x2A, 0x77, 0x76, 0x49, 0x1B, 0x7E, 0x1D, 0xB7, 0xB3, + 0x1D, 0xB7, 0x84, 0x5A, 0xC5, 0xCC, 0x1F, 0x9C, 0x82, 0x6D, 0xE0, 0x62, + 0x03, 0xEE, 0xA9, 0x9A, 0x05, 0x26, 0x0A, 0xEB, 0x0D, 0x55, 0x01, 0x59, + 0x71, 0x10, 0xB9, 0x53, 0x20, 0x65, 0x7B, 0x42, 0x90, 0x37, 0x36, 0x5A, + 0xC2, 0xBA, 0x91, 0x20, 0xE0, 0x89, 0xA9, 0x65, 0x2D, 0x67, 0x83, 0x5D, + 0x5A, 0xB9, 0x6B, 0x27, 0x13, 0x51, 0xA8, 0x00, 0x9E, 0x98, 0xE9, 0x62, + 0xD1, 0x55, 0x7D, 0x37, 0x1E, 0xB5, 0xA3, 0x17, 0x9B, 0x45, 0xD8, 0x60, + 0x02, 0xAC, 0xFC, 0x2B, 0xA9, 0xAC, 0x66, 0x79, 0xF9, 0x0C, 0xBC, 0xD4, + 0x50, 0x15, 0x8B, 0x48, 0xB1, 0x6A, 0xB4, 0xED, 0xB7, 0xFE, 0xE8, 0x9E, + 0x3B, 0xE3, 0x1C, 0xA5, 0x21, 0x15, 0x06, 0x66, 0x2F, 0xBB, 0x05, 0x33, + 0xE4, 0x5A, 0x17, 0x5D, 0xF7, 0xB9, 0x2F, 0x3A, 0x2B, 0x83, 0xFF, 0xAC, + 0xB6, 0x65, 0x92, 0xEF, 0x6E, 0x1C, 0x8A, 0x6C, 0x72, 0x52, 0x32, 0xA6, + 0x5A, 0x16, 0x75, 0xEE, 0xA9, 0x95, 0x84, 0x33, 0x34, 0x5E, 0x71, 0x66, + 0x40, 0xB9, 0xFF, 0x8B, 0xD5, 0x50, 0x81, 0xAF, 0x27, 0xC8, 0x58, 0xEE, + 0x0D, 0xE7, 0x6D, 0xEB, 0x24, 0xA2, 0x3F, 0xDA, 0x1A, 0xD4, 0xBE, 0x3B, + 0x02, 0x7B, 0x1C, 0x5A, 0xAF, 0x1D, 0xE3, 0x4B, 0x9F, 0xBC, 0x78, 0x5B, + 0x0B, 0x91, 0x73, 0x78, 0x64, 0xD9, 0x77, 0xC7, 0x6E, 0x4B, 0x94, 0x5F, + 0xE9, 0x8D, 0x8F, 0x49, 0xDC, 0x48, 0xEE, 0x58, 0x86, 0x04, 0x63, 0xEB, + 0x0D, 0x39, 0x31, 0x81, 0xB4, 0xA8, 0x16, 0xB3, 0x7F, 0x60, 0x7F, 0x94, + 0xEE, 0x06, 0x53, 0x38, 0x10, 0x0F, 0x93, 0x7F, 0x12, 0x1F, 0x76, 0x28, + 0xA7, 0x3E, 0x46, 0x10, 0x8C, 0x28, 0x53, 0xCF, 0x9F, 0x83, 0x7F, 0x0C, + 0xD8, 0xD6, 0x52, 0xF3, 0xE8, 0xD2, 0x21, 0xA6, 0x4A, 0xEE, 0x8B, 0xF7, + 0x5B, 0x19, 0x90, 0x6D, 0x35, 0x83, 0xAF, 0x3F, 0x49, 0x71, 0xB1, 0x3E, + 0xD1, 0x98, 0x60, 0x77, 0x05, 0x36, 0xA5, 0xFF, 0x82, 0x37, 0x14, 0x49, + 0x62, 0x98, 0xB3, 0x05, 0xF5, 0xAC, 0xE2, 0xCC, 0x47, 0x09, 0x94, 0x8A, + 0x59, 0x00, 0x23, 0xF4, 0x6D, 0x08, 0xE2, 0xAD, 0x7A, 0xF0, 0xCC, 0x97, + 0x68, 0xF7, 0x21, 0x5C, 0x43, 0xD4, 0x1F, 0x16, 0x1A, 0xC6, 0x65, 0xFE, + 0x96, 0xB4, 0x7C, 0x2C, 0x79, 0x9E, 0xEC, 0xD4, 0x96, 0xAF, 0x0E, 0x35, + 0x24, 0x06, 0x03, 0x8E, 0x9A, 0x4E, 0xA5, 0xA7, 0xCD, 0x35, 0x32, 0xD2, + 0x30, 0x15, 0xAC, 0xED, 0xDF, 0xF1, 0x83, 0x39, 0x17, 0xBB, 0x9B, 0x90, + 0xED, 0xFB, 0x64, 0xE9, 0x55, 0x09, 0x49, 0x86, 0x7A, 0x9A, 0x43, 0x13, + 0xB1, 0xD2, 0xC7, 0xC7, 0xC6, 0xA1, 0x99, 0xC8, 0x51, 0x4A, 0x5F, 0x9D, + 0x6F, 0xA6, 0xCD, 0x97, 0x30, 0xE9, 0x55, 0x0B, 0x6F, 0x0F, 0x4A, 0x43, + 0x6E, 0x71, 0xE6, 0xCF, 0x3A, 0x7C, 0xC9, 0x78, 0x70, 0xFE, 0xBD, 0x0A, + 0x00, 0xEC, 0xA6, 0x7F, 0x83, 0xFA, 0xBE, 0xD4, 0xDF, 0xB0, 0x86, 0x41, + 0x12, 0x53, 0x1B, 0x4F, 0x7C, 0x1E, 0x60, 0x2A, 0xC1, 0x20, 0x7A, 0x00, + 0xED, 0x6C, 0x66, 0x23, 0x1F, 0x79, 0xC3, 0x3E, 0x01, 0x74, 0xA7, 0x60, + 0x7D, 0x1F, 0x29, 0x93, 0x03, 0xF0, 0x64, 0xF6, 0x6F, 0x56, 0x8E, 0x75, + 0x57, 0x25, 0x70, 0xDC, 0xD2, 0xD2, 0x28, 0x37, 0xA8, 0x05, 0x9B, 0xB0, + 0xAD, 0x1A, 0x2D, 0x86, 0xA9, 0x50, 0xB8, 0xE3, 0xF6, 0xA2, 0x3E, 0x17, + 0x5B, 0x78, 0x65, 0xC0, 0x61, 0x95, 0x0E, 0x27, 0x39, 0x72, 0x6A, 0x9E, + 0xCB, 0x8E, 0xAD, 0xEC, 0x0C, 0xFC, 0xDB, 0x9A, 0x9A, 0x12, 0x31, 0x16, + 0x68, 0x4F, 0x83, 0x79, 0x11, 0x3D, 0x75, 0xED, 0x2D, 0xEA, 0x92, 0x8E, + 0xDE, 0xAC, 0x07, 0x55, 0xF1, 0xE4, 0x30, 0x6C, 0xFC, 0x5C, 0x88, 0x1F, + 0x77, 0x94, 0xC8, 0x87, 0x73, 0xB2, 0xB6, 0x9F, 0x2A, 0x05, 0x71, 0xDE, + 0x8E, 0xF2, 0xEB, 0x3A, 0xDB, 0xBE, 0x46, 0xFA, 0x11, 0xA1, 0xCA, 0x1A, + 0xB3, 0x65, 0xAC, 0x42, 0x85, 0xD5, 0x0B, 0x23, 0x57, 0xA5, 0x53, 0xE9, + 0x58, 0x30, 0xE0, 0xF9, 0x23, 0xF0, 0x75, 0x2A, 0xF5, 0x2B, 0x9A, 0x25, + 0x96, 0xD7, 0x1E, 0x71, 0x31, 0xC7, 0xA7, 0xB0, 0x6B, 0x3F, 0x26, 0xF8, + 0x8D, 0xF9, 0x1E, 0x15, 0x83, 0xB8, 0xFF, 0xC6, 0xAA, 0xA6, 0x42, 0xAC, + 0x90, 0x82, 0xA2, 0x50, 0x7F, 0x1F, 0xC3, 0x99, 0xDC, 0x27, 0xD7, 0xAA, + 0x65, 0x13, 0x08, 0xA2, 0x66, 0x51, 0x7D, 0xC7, 0x7E, 0xAE, 0x1A, 0x33, + 0x2B, 0x72, 0xF3, 0xF4, 0x25, 0xD9, 0xEE, 0xF1, 0x07, 0x0F, 0xC3, 0x87, + 0xDF, 0x2B, 0x0C, 0xC8, 0x4D, 0x2E, 0xEB, 0xA3, 0x93, 0xB2, 0xBB, 0xAA, + 0x61, 0xE1, 0x71, 0x0D, 0x53, 0xE2, 0xF5, 0x7E, 0xF7, 0x08, 0x06, 0xAD, + 0x3E, 0xE7, 0xA6, 0xB9, 0x3B, 0xC9, 0x68, 0x5D, 0xB8, 0x7D, 0xC1, 0x31, + 0x9B, 0x70, 0xC2, 0x2B, 0x57, 0x26, 0x54, 0x67, 0x3D, 0x14, 0x26, 0xCF, + 0xB0, 0xEC, 0xD6, 0x00, 0xE3, 0x3F, 0x26, 0xCA, 0xEF, 0xB8, 0x1A, 0xFD, + 0xE4, 0x06, 0xE9, 0x41, 0xF2, 0xAD, 0x2E, 0x16, 0x11, 0x0A, 0x98, 0x4B, + 0x01, 0x67, 0x76, 0x99, 0xAE, 0x58, 0xF4, 0xAD, 0xC2, 0xC8, 0x56, 0x26, + 0x50, 0xB2, 0x77, 0x4B, 0x32, 0x71, 0x16, 0x13, 0xC7, 0xAE, 0xE3, 0xDE, + 0x1C, 0x6D, 0x54, 0x4C, 0x89, 0xA4, 0x81, 0x18, 0x53, 0xC3, 0x01, 0xCD, + 0xCF, 0x85, 0xFB, 0x3A, 0x97, 0xD5, 0x25, 0x56, 0x39, 0x89, 0xEF, 0x52, + 0xBB, 0x02, 0xC8, 0x23, 0xDD, 0x04, 0x36, 0x85, 0xA2, 0x33, 0xE4, 0x4F, + 0x41, 0xC8, 0xE9, 0x8B, 0xCE, 0xD5, 0xB0, 0xDB, 0xF3, 0xB4, 0xC3, 0x7C, + 0x70, 0x29, 0x0F, 0xB6, 0x3C, 0xB1, 0xD3, 0x0C, 0xD5, 0x06, 0x56, 0x2E, + 0x57, 0xD1, 0x90, 0xAB, 0x5D, 0xE8, 0xE6, 0xD6, 0x94, 0x58, 0xE2, 0xA8, + 0x92, 0x42, 0xF8, 0xD4, 0xD7, 0x2F, 0x1F, 0x16, 0x92, 0x0C, 0xD5, 0x8E, + 0x69, 0x98, 0xA9, 0x48, 0xA1, 0x6E, 0x94, 0x8C, 0x66, 0x30, 0xA3, 0x52, + 0x50, 0x7A, 0x29, 0x96, 0xB0, 0x2B, 0x16, 0x3E, 0x2C, 0x56, 0xA4, 0x9F, + 0x85, 0x96, 0x56, 0x25, 0x98, 0x56, 0xAA, 0xFB, 0xEE, 0x4A, 0x31, 0xD9, + 0xD7, 0xB3, 0x37, 0xE4, 0x1D, 0x49, 0x3D, 0xA7, 0xF7, 0x93, 0x31, 0x6D, + 0x99, 0x24, 0xE5, 0x30, 0x8F, 0xB4, 0x89, 0x56, 0x1F, 0xB7, 0x09, 0x4F, + 0x71, 0xDB, 0x4D, 0x02, 0x40, 0x7B, 0xEA, 0x75, 0x38, 0x2C, 0xCD, 0xE2, + 0x9F, 0x60, 0xC8, 0x4A, 0x84, 0x2F, 0x9D, 0xFF, 0x75, 0xED, 0x32, 0xBA, + 0xB7, 0xF4, 0xC8, 0x0E, 0xCF, 0xC5, 0x31, 0x8A, 0xA0, 0xF7, 0xC9, 0x07, + 0x54, 0x44, 0x90, 0xC1, 0x1C, 0x46, 0x49, 0xEE, 0x33, 0x0E, 0xB4, 0x87, + 0x4B, 0x9E, 0x3C, 0xF0, 0xAD, 0x0B, 0xA5, 0xA4, 0x28, 0x43, 0xE6, 0x34, + 0xD3, 0xD0, 0xF4, 0x88, 0x1E, 0xDE, 0x6E, 0x50, 0x81, 0x0E, 0x24, 0xE5, + 0x87, 0xA4, 0xAB, 0x67, 0xD1, 0x91, 0xD2, 0xB8, 0x57, 0xA6, 0x86, 0x4A, + 0x47, 0x45, 0x39, 0x6B, 0x1E, 0x2B, 0xCF, 0xCD, 0xE2, 0x1B, 0xBF, 0x75, + 0xC2, 0xD4, 0x5A, 0x68, 0x8F, 0xC6, 0xDC, 0x64, 0xBB, 0xBE, 0x71, 0x38, + 0x9D, 0x4B, 0xBE, 0x4E, 0xF6, 0x2D, 0xAC, 0x5D, 0x23, 0x6B, 0xC3, 0x96, + 0x51, 0x4D, 0x10, 0x70, 0x83, 0xCA, 0x69, 0x91, 0x52, 0x3E, 0x46, 0x03, + 0x93, 0xC3, 0xE0, 0x10, 0xDF, 0x24, 0x7F, 0x9B, 0x86, 0xD6, 0x5B, 0x95, + 0xD4, 0xCF, 0xED, 0x14, 0xCD, 0x53, 0x82, 0x97, 0x6C, 0x81, 0x9C, 0x3F, + 0x6B, 0xFA, 0x9B, 0x44, 0x1B, 0x29, 0xCA, 0x66, 0xD9, 0x22, 0xB1, 0xDE, + 0xFE, 0x3A, 0xE2, 0x0C, 0xD5, 0x62, 0xDB, 0x00, 0x12, 0x59, 0x74, 0xE6, + 0x8C, 0x22, 0x7B, 0x11, 0x7F, 0x59, 0xB3, 0x0A, 0x2C, 0x76, 0x5F, 0x71, + 0x31, 0xA2, 0xD8, 0x42, 0x28, 0xF3, 0x24, 0xC5, 0xF6, 0x85, 0x60, 0x32, + 0xC1, 0x91, 0xD7, 0x95, 0x61, 0x70, 0x51, 0x9A, 0x4E, 0x62, 0x8A, 0xCF, + 0xBD, 0x98, 0x00, 0xA0, 0x12, 0xB5, 0xB6, 0x90, 0xC7, 0x6E, 0xC3, 0x4A, + 0x8E, 0x2F, 0x50, 0xAD, 0xC0, 0x26, 0x12, 0xF4, 0x68, 0x1D, 0x51, 0x72, + 0x14, 0x06, 0xB7, 0x7A, 0xCA, 0x37, 0x8F, 0x39, 0x01, 0x76, 0xE5, 0xE4, + 0xF1, 0xCA, 0xDA, 0x6A, 0x6B, 0x7C, 0x7D, 0xD9, 0xA9, 0x39, 0xBB, 0x50, + 0x79, 0x02, 0xD6, 0xA1, 0x12, 0xE7, 0xE6, 0x9A, 0x1B, 0xF4, 0x89, 0x48, + 0x29, 0x88, 0xA7, 0xC8, 0xE9, 0xEF, 0xB1, 0x28, 0x18, 0x22, 0x4B, 0x6A, + 0x96, 0xAF, 0x06, 0x3B, 0xE0, 0x8E, 0x9B, 0x2C, 0xC1, 0x7B, 0xD9, 0x87, + 0x72, 0xA5, 0xC8, 0xFE, 0x30, 0x9C, 0x24, 0x79, 0xAD, 0x04, 0xBB, 0x38, + 0xA9, 0xB8, 0x29, 0x01, 0x41, 0xC3, 0x40, 0xD9, 0xE6, 0xE4, 0xD3, 0x97, + 0xE2, 0x42, 0xBF, 0x79, 0x59, 0x7B, 0xAF, 0x31, 0x0C, 0xF3, 0xD1, 0x72, + 0xA4, 0x9D, 0x36, 0xD9, 0xDB, 0x0C, 0x0F, 0xCC, 0x3A, 0x8C, 0xAF, 0x71, + 0xB7, 0x46, 0x2F, 0x26, 0x7D, 0x1E, 0x25, 0xC9, 0x8E, 0xA3, 0x9B, 0xCF, + 0x7F, 0xC4, 0x96, 0xB6, 0xC7, 0x05, 0x62, 0x08, 0x49, 0x3C, 0xFC, 0x24, + 0xAA, 0x16, 0xEB, 0x3C, 0xE6, 0x04, 0x57, 0xD1, 0xA3, 0x81, 0x6E, 0xD4, + 0x64, 0xF5, 0xC6, 0x24, 0x06, 0x9E, 0xA4, 0x76, 0x3E, 0x62, 0x31, 0x54, + 0xC8, 0xC7, 0xAA, 0x31, 0xC6, 0xF0, 0x71, 0x1B, 0xE7, 0x08, 0xFF, 0x3A, + 0x7A, 0xD3, 0x51, 0x5A, 0xE8, 0xA6, 0xD4, 0xAA, 0x6E, 0x20, 0x37, 0x28, + 0x0D, 0x0A, 0xCC, 0x25, 0x6C, 0x1E, 0x76, 0x8C, 0xC5, 0xCA, 0xDA, 0x6C, + 0x24, 0x17, 0xD4, 0xB0, 0x45, 0x3E, 0xD7, 0x25, 0xB8, 0x03, 0xED, 0xA2, + 0xDA, 0x82, 0x08, 0x8F, 0x10, 0x3F, 0x13, 0x43, 0x07, 0x3F, 0x8C, 0xF9, + 0xE5, 0xD5, 0xB0, 0x35, 0x01, 0x13, 0x61, 0x38, 0x97, 0xCA, 0xB4, 0xFE, + 0x1B, 0x1F, 0x44, 0xEC, 0xFB, 0xAB, 0x07, 0xB6, 0x3F, 0x21, 0x80, 0x6A, + 0x8D, 0xBA, 0x8A, 0x1D, 0xEA, 0xEF, 0xA0, 0xEB, 0xBC, 0x26, 0x37, 0x4F, + 0xA6, 0x16, 0xF8, 0xA2, 0x90, 0x3E, 0xF7, 0x06, 0xD8, 0x4C, 0x21, 0x94, + 0x2C, 0x5F, 0x49, 0x05, 0x12, 0xF8, 0xA8, 0xA5, 0x14, 0x40, 0xBE, 0x40, + 0x01, 0xF5, 0x23, 0xE1, 0xEE, 0xF6, 0x5B, 0xC0, 0xE6, 0x76, 0xEF, 0x1D, + 0x05, 0xA8, 0x77, 0xF2, 0x5D, 0x91, 0xBA, 0x62, 0xB8, 0xDD, 0xF0, 0xFC, + 0x5B, 0xA9, 0xB2, 0x25, 0xDD, 0x0E, 0x08, 0xFA, 0xE8, 0x5C, 0xCA, 0x43, + 0x0D, 0xD0, 0x65, 0x08, 0x23, 0xA7, 0x2A, 0x2C, 0xE6, 0x6F, 0xB6, 0x0A, + 0xE7, 0xED, 0x86, 0x80, 0x50, 0x94, 0x58, 0x0D, 0x11, 0x57, 0xED, 0xB9, + 0xD5, 0x7C, 0x33, 0xCD, 0x44, 0x9A, 0x17, 0xFB, 0x74, 0xF3, 0xB1, 0x2D, + 0x9F, 0x38, 0x5E, 0x6A, 0x9A, 0xAE, 0x5F, 0x7B, 0xAD, 0x4F, 0x9C, 0x8E, + 0x1E, 0x3A, 0x75, 0x4F, 0x30, 0xCF, 0xF7, 0x1C, 0x82, 0x34, 0xC6, 0x3E, + 0xE7, 0x5B, 0x8B, 0x2C, 0xD8, 0xFE, 0xDB, 0x33, 0x27, 0xBB, 0x2E, 0x24, + 0xB0, 0xDA, 0x74, 0xD3, 0x94, 0x85, 0x78, 0x36, 0x40, 0x2D, 0xEE, 0x40, + 0x4A, 0xED, 0x00, 0x4C, 0xDB, 0xF9, 0x49, 0x2F, 0xEC, 0x03, 0x99, 0x63, + 0xDD, 0x9E, 0xB7, 0xA3, 0x3B, 0xE1, 0xF2, 0x0E, 0x5D, 0x58, 0xD8, 0x33, + 0xE9, 0xE4, 0x0A, 0xD2, 0x83, 0xA0, 0x3F, 0x80, 0x9A, 0x01, 0xC5, 0x8D, + 0xF3, 0x14, 0xC8, 0x0F, 0xE4, 0xB8, 0xAD, 0xCD, 0x3E, 0x50, 0x43, 0x17, + 0xC1, 0x58, 0x8D, 0x64, 0x03, 0xB1, 0xE5, 0x42, 0xC8, 0x34, 0x6A, 0xFB, + 0x74, 0x18, 0xA0, 0xD9, 0x3D, 0x01, 0xD7, 0x2F, 0x51, 0x0F, 0xD8, 0x29, + 0x74, 0xB1, 0xF8, 0x99, 0xCA, 0x74, 0xB2, 0xF1, 0xB6, 0x7B, 0x53, 0x10, + 0xCE, 0x73, 0xF6, 0x32, 0x3F, 0x05, 0x6E, 0xC7, 0xAD, 0x27, 0x34, 0xD4, + 0xB9, 0x1D, 0x34, 0x5D, 0xEC, 0x88, 0x46, 0x22, 0x90, 0x94, 0xAF, 0x1A, + 0x51, 0x33, 0x10, 0xB7, 0xBF, 0xBE, 0x0A, 0xCD, 0x1E, 0xE8, 0x95, 0x78, + 0x61, 0x17, 0x63, 0x8F, 0x3A, 0xE2, 0x30, 0x59, 0x3F, 0xBF, 0xD8, 0xA3, + 0x85, 0xEF, 0x3D, 0x1D, 0xD2, 0x4F, 0x7B, 0xB3, 0xD7, 0x14, 0x91, 0x65, + 0xC2, 0x3A, 0x66, 0xBC, 0xFF, 0xFD, 0xC2, 0x12, 0x4A, 0xAF, 0xC4, 0xCC, + 0x78, 0x1F, 0xA1, 0xAB, 0x54, 0xB7, 0xDB, 0x3B, 0x07, 0x45, 0x09, 0x93, + 0x45, 0x40, 0x2F, 0xA0, 0x68, 0x73, 0x54, 0x27, 0x96, 0xB4, 0x2E, 0x88, + 0xC2, 0xF7, 0x98, 0x9E, 0xCA, 0xBF, 0xF4, 0xEC, 0x0A, 0xB6, 0x8F, 0x33, + 0x08, 0x5C, 0x91, 0x1B, 0x9F, 0x55, 0xDF, 0xF9, 0x04, 0x5D, 0xF0, 0x3A, + 0xE1, 0xFF, 0x93, 0x3A, 0xA7, 0xBB, 0x24, 0x75, 0xA3, 0x0D, 0x95, 0x7D, + 0x66, 0x11, 0x4D, 0x0C, 0xCD, 0x8A, 0x98, 0xA3, 0xC4, 0x38, 0x88, 0x00, + 0xD3, 0x7F, 0xA8, 0x7D, 0xE6, 0x14, 0xF0, 0xA5, 0xF2, 0x5E, 0xA0, 0xE2, + 0xD4, 0x3E, 0xFA, 0x00, 0xD4, 0x5D, 0x01, 0x5D, 0x55, 0xF9, 0xA4, 0xC8, + 0x49, 0x59, 0x16, 0xFA, 0xC5, 0x51, 0x15, 0xDC, 0xC3, 0x1E, 0xD5, 0xED, + 0xE4, 0xBB, 0x14, 0xA0, 0xF3, 0x68, 0xD5, 0x60, 0xE0, 0x42, 0xB4, 0x30, + 0x82, 0xD8, 0xD6, 0x3E, 0xEC, 0xE7, 0xAD, 0x3C, 0x69, 0x61, 0x28, 0x8E, + 0x8C, 0x04, 0xF1, 0xA0, 0x1E, 0xBD, 0xDF, 0xBE, 0xFD, 0xAE, 0xD9, 0x65, + 0x66, 0x33, 0x0F, 0xB0, 0x8D, 0xE9, 0x46, 0xFD, 0xD5, 0xF9, 0x20, 0x18, + 0x7F, 0xF7, 0x20, 0x3F, 0xE2, 0x7A, 0x38, 0x14, 0xBB, 0x1A, 0xC3, 0xCA, + 0xAB, 0x56, 0x5B, 0x17, 0x1B, 0x1A, 0xC3, 0x00, 0x97, 0x69, 0x9B, 0x5D, + 0xBD, 0x4D, 0x22, 0x77, 0x36, 0x65, 0xD7, 0x04, 0x8F, 0x5B, 0x76, 0xB2, + 0x6B, 0x23, 0x52, 0xA2, 0x02, 0xC4, 0x98, 0x16, 0xE3, 0xF7, 0x2B, 0xFC, + 0x36, 0x94, 0x91, 0x0B, 0x0B, 0x82, 0x7F, 0xC6, 0x70, 0x8C, 0x80, 0x36, + 0x48, 0x4F, 0x8C, 0x15, 0xB9, 0x06, 0x4C, 0x0B, 0x79, 0xA0, 0x37, 0x7D, + 0x18, 0xBB, 0x83, 0x8C, 0xA6, 0xF0, 0x02, 0x7D, 0xAE, 0xD1, 0x8D, 0xF7, + 0x11, 0x14, 0x69, 0x2D, 0xEE, 0x85, 0x47, 0x52, 0x44, 0x95, 0xD8, 0x8B, + 0x91, 0x04, 0x1A, 0x0D, 0x0A, 0xE9, 0x61, 0x35, 0x14, 0xB7, 0x3D, 0x77, + 0xD3, 0x7B, 0x97, 0xE2, 0x54, 0x37, 0xCD, 0x77, 0x49, 0x52, 0x2B, 0xF5, + 0x0A, 0xA2, 0xCD, 0x9A, 0x51, 0x17, 0x7F, 0xD2, 0x9D, 0x65, 0x0F, 0x0F, + 0x54, 0xEC, 0x00, 0x71, 0x89, 0x5B, 0xAC, 0x7C, 0x59, 0x55, 0xA3, 0xEA, + 0x27, 0xF1, 0x47, 0x79, 0xF5, 0xDD, 0x0F, 0xD9, 0x14, 0xDB, 0x00, 0xE1, + 0xA2, 0x4D, 0x92, 0xDA, 0x0B, 0xEF, 0x41, 0x29, 0x1E, 0xFB, 0x37, 0xAC, + 0x08, 0x5D, 0xB7, 0x75, 0x7B, 0x63, 0xC9, 0x47, 0x0B, 0x13, 0x66, 0x39, + 0xA1, 0x58, 0x82, 0xA3, 0x8D, 0x8B, 0xAF, 0xF9, 0x21, 0x84, 0xE1, 0xBD, + 0x49, 0xD4, 0xF4, 0x43, 0x7F, 0x9A, 0xCF, 0x59, 0xF2, 0xA5, 0x2C, 0x4D, + 0x85, 0xB5, 0xFD, 0x95, 0xE8, 0x45, 0xD2, 0xE8, 0x8A, 0xE4, 0xA9, 0x41, + 0x6B, 0x99, 0xBE, 0x0D, 0xF1, 0xB2, 0x57, 0x61, 0x7B, 0x6D, 0x09, 0x53, + 0x26, 0xCC, 0x28, 0x2C, 0x82, 0x08, 0xFB, 0xDC, 0xA9, 0x8A, 0xEC, 0x76, + 0xE3, 0x4D, 0xDE, 0xAC, 0x3E, 0x54, 0xAC, 0xC7, 0x50, 0x92, 0x8A, 0x19, + 0x3A, 0xF3, 0xFA, 0xF0, 0xC1, 0x7E, 0xEE, 0x69, 0x0E, 0xB5, 0x35, 0x9D, + 0x93, 0x4B, 0xAE, 0xA9, 0x97, 0x09, 0x34, 0x9B, 0x8E, 0x3C, 0xB4, 0x2A, + 0x1D, 0x59, 0xF9, 0x1C, 0x82, 0x25, 0x14, 0xCB, 0xC4, 0x89, 0xA5, 0xD5, + 0x62, 0xD9, 0xC4, 0xD5, 0xFF, 0xF5, 0xFF, 0x9A, 0xA8, 0x05, 0x95, 0xE1, + 0xAC, 0xAF, 0x61, 0x1B, 0x57, 0x77, 0xB0, 0x2C, 0x68, 0xE6, 0x3F, 0x1B, + 0x63, 0xFF, 0xC3, 0x33, 0x04, 0x8A, 0x0B, 0x54, 0x7D, 0x36, 0xAE, 0xAE, + 0x3F, 0xD3, 0xA6, 0x83, 0x65, 0xA4, 0xFE, 0x3C, 0x29, 0xDB, 0x81, 0x99, + 0xF9, 0x7A, 0x9B, 0xBB, 0xA7, 0x86, 0x6B, 0xDF, 0x67, 0x08, 0x23, 0x88, + 0x62, 0xE3, 0x08, 0x5C, 0x23, 0x73, 0x0C, 0x01, 0x96, 0xB0, 0x99, 0xC0, + 0x8D, 0xD5, 0xDB, 0xCE, 0x4C, 0x1F, 0xE4, 0xFD, 0x19, 0x2E, 0xD7, 0x20, + 0x81, 0x4E, 0x22, 0x4E, 0xAD, 0x02, 0x86, 0x1C, 0xEF, 0x2C, 0xEC, 0xCF, + 0xD0, 0x7E, 0xFB, 0x02, 0xE1, 0xE1, 0xFD, 0xE5, 0xB9, 0xBC, 0xE5, 0x12, + 0xA3, 0xCA, 0xE8, 0x88, 0x45, 0x03, 0x15, 0x0E, 0xA0, 0xC2, 0x1A, 0xB7, + 0x13, 0xB3, 0x52, 0x3C, 0x87, 0x18, 0x95, 0x3F, 0x56, 0x9C, 0x31, 0x52, + 0x2A, 0x5D, 0x57, 0xD3, 0xA1, 0x41, 0x2B, 0x82, 0x11, 0x23, 0xC2, 0x4D, + 0xE8, 0xE5, 0xC3, 0xBA, 0x59, 0x6B, 0x32, 0xBE, 0x22, 0x37, 0xB8, 0xC9, + 0x11, 0x88, 0x5C, 0x7E, 0x94, 0x5F, 0xDA, 0xB5, 0xC5, 0xAB, 0xA8, 0xD7, + 0x98, 0x2E, 0x4A, 0xBC, 0x5B, 0xD0, 0x7D, 0x3E, 0xA3, 0x43, 0xE8, 0xAB, + 0x9F, 0xA7, 0x44, 0x02, 0x07, 0xE9, 0x78, 0x50, 0xB4, 0x0A, 0xE9, 0x5D, + 0xDB, 0x23, 0x1E, 0x1D, 0x0A, 0xCB, 0x95, 0xE2, 0xDB, 0xCC, 0x42, 0x40, + 0x52, 0x6C, 0x5C, 0xF6, 0xBD, 0x80, 0x51, 0x4C, 0x56, 0x54, 0xB6, 0xC9, + 0xB2, 0x9F, 0x70, 0x66, 0xE6, 0x48, 0xD5, 0xC3, 0x7D, 0x94, 0x73, 0xAA, + 0x50, 0x10, 0x3D, 0x53, 0x04, 0x85, 0xC1, 0x4E, 0x77, 0x3A, 0x90, 0x3B, + 0xBA, 0x9F, 0x37, 0x80, 0xDA, 0xF2, 0x0B, 0xB1, 0xBC, 0x30, 0x94, 0xC6, + 0xB7, 0x39, 0x8D, 0xDD, 0x32, 0xA2, 0x71, 0x83, 0x74, 0xE8, 0x1F, 0xB6, + 0x92, 0xD5, 0xBE, 0xE6, 0x4B, 0x9F, 0xC5, 0x40, 0x5A, 0x23, 0xDB, 0x3C, + 0xB0, 0xAF, 0x14, 0x47, 0x9F, 0x66, 0x53, 0x0D, 0x3E, 0x43, 0x5D, 0xF3, + 0xE6, 0x18, 0x03, 0x47, 0xE3, 0x1A, 0xF5, 0x96, 0x53, 0xCA, 0xFE, 0x1B, + 0x07, 0x88, 0xBD, 0x6D, 0xE4, 0xF1, 0x86, 0x43, 0xEE, 0x09, 0x6E, 0x3A, + 0x81, 0xB7, 0x6B, 0x56, 0x6B, 0x04, 0x25, 0x57, 0x79, 0x5E, 0xD3, 0xAB, + 0xA1, 0xBB, 0x60, 0xB8, 0x4A, 0xDB, 0x09, 0xFA, 0x3F, 0x1A, 0x3F, 0x05, + 0x1A, 0xDA, 0xFA, 0x5E, 0xB8, 0x55, 0xDB, 0xDC, 0xD7, 0x0A, 0x10, 0x89, + 0xAF, 0x70, 0xA3, 0x70, 0xC6, 0xDA, 0xB6, 0x8C, 0x04, 0x27, 0xD8, 0xEF, + 0x44, 0x55, 0x8F, 0x07, 0xAF, 0xD5, 0x22, 0xDA, 0x3D, 0x67, 0x9C, 0xC8, + 0xE8, 0x2D, 0xE1, 0xF7, 0x2D, 0xFE, 0xFE, 0xA9, 0x27, 0x43, 0xAA, 0xB8, + 0x81, 0x78, 0xBC, 0x7F, 0x77, 0xBC, 0xC8, 0x83, 0x0D, 0xF8, 0x8D, 0x81, + 0xD8, 0xD4, 0x1E, 0xB9, 0x5C, 0x91, 0x19, 0x41, 0x13, 0xA5, 0x44, 0xC8, + 0x60, 0x1F, 0x08, 0xDF, 0x5E, 0xFA, 0xB1, 0xEA, 0x46, 0x01, 0x1E, 0xE2, + 0x6D, 0x63, 0xF8, 0x7E, 0xD6, 0xBB, 0x17, 0xC9, 0x80, 0x76, 0x40, 0x87, + 0xCF, 0x1A, 0x69, 0x53, 0x40, 0xA4, 0x44, 0xA1, 0x56, 0xD1, 0x28, 0x5F, + 0x60, 0x12, 0x7A, 0xBD, 0x02, 0xE3, 0xE1, 0xFF, 0xA4, 0xCB, 0xA0, 0x1E, + 0xDC, 0x5C, 0x6C, 0xDB, 0xF7, 0x05, 0x55, 0xC0, 0xE5, 0xAB, 0x57, 0xF8, + 0xB4, 0xFF, 0x20, 0xD9, 0x3D, 0xEB, 0x02, 0x1C, 0x67, 0x31, 0xC7, 0xB4, + 0x2D, 0x5C, 0x4A, 0x9F, 0xF1, 0x18, 0x97, 0x27, 0x5B, 0x1A, 0x72, 0xDD, + 0x6A, 0x8E, 0x29, 0xBB, 0x26, 0xE8, 0x3E, 0xCB, 0xF6, 0x48, 0x19, 0xC1, + 0xD2, 0x18, 0x28, 0x92, 0xCA, 0x30, 0xE6, 0x59, 0xBB, 0x34, 0xE4, 0x4C, + 0x3B, 0xD8, 0x7D, 0x06, 0xA0, 0xD8, 0x85, 0xD6, 0x06, 0x1F, 0xE9, 0x04, + 0x27, 0x78, 0x8F, 0xCA, 0xFC, 0x56, 0x68, 0xE4, 0xA5, 0x25, 0xE0, 0x4C, + 0xA0, 0xBC, 0x36, 0xED, 0xBF, 0xAD, 0xC3, 0xA0, 0x2E, 0x83, 0xB3, 0x79, + 0x80, 0x4F, 0xC2, 0x80, 0x93, 0xC7, 0xC4, 0x8C, 0xFE, 0x64, 0xEC, 0xFE, + 0x24, 0xF1, 0x5C, 0xC5, 0x51, 0x51, 0x13, 0xC0, 0x5E, 0x61, 0x61, 0x5D, + 0x5C, 0xAB, 0x50, 0x72, 0x79, 0x91, 0xA3, 0xB6, 0x17, 0x8D, 0x2F, 0xB5, + 0xA7, 0x3B, 0x19, 0x8A, 0x5E, 0x14, 0x13, 0xE4, 0xDC, 0x8E, 0x92, 0xE1, + 0x51, 0xFF, 0x98, 0xC5, 0xAC, 0xA2, 0x5F, 0xC0, 0xA5, 0x46, 0x77, 0x64, + 0x9F, 0xD8, 0x82, 0x0D, 0x54, 0x3A, 0xD7, 0x77, 0xC9, 0xBE, 0x0E, 0xF6, + 0x05, 0xF0, 0x17, 0xF1, 0x1E, 0xBF, 0x00, 0x57, 0xAE, 0xAA, 0xE8, 0xB3, + 0xEE, 0xF8, 0x2B, 0x4A, 0x02, 0x79, 0xC0, 0x3C, 0xF8, 0x7A, 0x56, 0xA8, + 0x69, 0xFF, 0x64, 0x7C, 0x02, 0x76, 0x26, 0x93, 0x95, 0x02, 0xD9, 0x1E, + 0xA6, 0x6A, 0x69, 0x3C, 0x00, 0x78, 0x8D, 0x71, 0x7C, 0x83, 0xD0, 0x38, + 0xD7, 0x65, 0x94, 0xBD, 0xD3, 0x7B, 0xF0, 0xC3, 0x26, 0x96, 0x27, 0x23, + 0xCA, 0xC0, 0x33, 0x74, 0xE1, 0x6D, 0x3E, 0x61, 0xF8, 0xF8, 0x49, 0x0B, + 0x79, 0x90, 0x90, 0xCA, 0xD4, 0x5B, 0x7D, 0x9B, 0x75, 0xF9, 0x08, 0x36, + 0x8B, 0x2E, 0xA5, 0x50, 0xB8, 0x7E, 0x3A, 0xED, 0x09, 0xED, 0x0C, 0x1C, + 0xB8, 0xDD, 0x5E, 0x13, 0x0A, 0x0B, 0x5C, 0xFB, 0x75, 0x41, 0x98, 0x2B, + 0xC9, 0xAB, 0xC9, 0x14, 0xDA, 0xFE, 0x34, 0x72, 0xB9, 0x7C, 0x86, 0x89, + 0x0E, 0x2E, 0x58, 0xC3, 0xC1, 0xD5, 0x2B, 0x66, 0x26, 0xD2, 0xBF, 0xBF, + 0x96, 0x33, 0x30, 0xCE, 0x5D, 0x87, 0x02, 0xE2, 0x20, 0x71, 0xEC, 0x24, + 0xAD, 0x40, 0xFE, 0xEF, 0x52, 0xD1, 0x84, 0x72, 0xCD, 0xCD, 0x3C, 0xDB, + 0xA7, 0x94, 0x0F, 0xAD, 0x4C, 0x67, 0x3F, 0x13, 0x16, 0x4B, 0x6B, 0x26, + 0x92, 0x3F, 0xB2, 0xAE, 0xA4, 0x5F, 0xBB, 0x65, 0x0B, 0x13, 0xE2, 0xB9, + 0x87, 0xA7, 0xB2, 0x14, 0xC0, 0x2A, 0x66, 0x5B, 0x99, 0x6C, 0xC6, 0x98, + 0xC2, 0xB6, 0x1B, 0x05, 0x14, 0xD6, 0xC9, 0x5B, 0x33, 0xE1, 0x14, 0x35, + 0x82, 0xF9, 0x50, 0xF6, 0xFD, 0xA0, 0x15, 0x6D, 0xB1, 0x59, 0x4A, 0x51, + 0x9D, 0x81, 0xD4, 0x1C, 0xE2, 0x31, 0xDD, 0xD0, 0xFF, 0xC8, 0x9A, 0x7B, + 0x9F, 0xED, 0xD4, 0x33, 0xDF, 0xBA, 0x58, 0x9E, 0x36, 0xC1, 0x69, 0xA2, + 0xE2, 0x93, 0xC7, 0x21, 0x8D, 0x07, 0xFD, 0xA2, 0x37, 0xA9, 0xDC, 0x28, + 0x7F, 0x16, 0xA1, 0x0E, 0x00, 0x5E, 0x0D, 0x01, 0xCB, 0x36, 0x97, 0xD5, + 0xC1, 0xF2, 0x93, 0xC7, 0x8A, 0xAE, 0xA7, 0xE6, 0xBE, 0x0B, 0xA8, 0x3E, + 0xA2, 0x26, 0xDF, 0x62, 0x13, 0xEF, 0xB8, 0x9A, 0xDA, 0xD4, 0x4D, 0xD0, + 0x78, 0x02, 0x54, 0x78, 0xEE, 0x5A, 0x6F, 0xAB, 0xD2, 0x6D, 0x94, 0xBC, + 0xE9, 0xD3, 0x71, 0x3B, 0x59, 0x73, 0xBE, 0x32, 0x7E, 0x7C, 0x69, 0x5C, + 0xFC, 0xA3, 0x86, 0x86, 0x59, 0x83, 0x34, 0xD8, 0xC9, 0x66, 0x8C, 0xEB, + 0x56, 0xE0, 0xD0, 0xC2, 0xD1, 0x08, 0x35, 0xAB, 0x6F, 0x04, 0xAA, 0xB4, + 0x5C, 0x4D, 0x41, 0x71, 0x0A, 0xB8, 0x3E, 0x8C, 0xAF, 0x73, 0xF0, 0xF7, + 0xD2, 0x28, 0x2A, 0x20, 0xD6, 0xC6, 0x21, 0x2E, 0xB8, 0xF3, 0xDE, 0x84, + 0xFD, 0x1C, 0x10, 0x36, 0x3A, 0x3B, 0x27, 0x97, 0x93, 0xBB, 0x0F, 0xBE, + 0x4E, 0xD4, 0x44, 0xA1, 0x3F, 0x53, 0x30, 0x68, 0x58, 0xA5, 0xF9, 0x27, + 0xF5, 0xFF, 0x3F, 0xC1, 0x9D, 0x89, 0x57, 0xE8, 0xF9, 0x3E, 0x66, 0x82, + 0x57, 0x7B, 0x00, 0xD6, 0x46, 0x6E, 0x42, 0x98, 0x6D, 0xCB, 0x99, 0x71, + 0x74, 0xB9, 0x2A, 0x65, 0x54, 0xCE, 0xDD, 0x10, 0xD3, 0xBB, 0xA6, 0x4D, + 0xCA, 0x3B, 0x4E, 0x4D, 0x5C, 0xF8, 0x80, 0x45, 0xED, 0x0D, 0xBB, 0x1F, + 0xC8, 0xDD, 0x69, 0x33, 0x13, 0x6D, 0x47, 0x3F, 0x29, 0x51, 0x1C, 0xF9, + 0xD9, 0x95, 0x64, 0x29, 0x5C, 0xEC, 0x7A, 0x8B, 0x14, 0x07, 0xA0, 0x43, + 0x1E, 0x5B, 0x7A, 0x5E, 0xDA, 0x7B, 0xA7, 0xC9, 0x7B, 0xDC, 0x72, 0xF5, + 0x90, 0xF2, 0x7D, 0xF9, 0x59, 0xE2, 0xE3, 0x74, 0xEE, 0x8B, 0xBC, 0x87, + 0x15, 0x24, 0x6D, 0x5C, 0x39, 0xA6, 0xE2, 0x1E, 0xA9, 0x4D, 0xB7, 0x39, + 0x39, 0x75, 0x50, 0xF9, 0x05, 0x88, 0xD2, 0xB5, 0x7C, 0xDB, 0x9A, 0x4D, + 0x75, 0x52, 0xAB, 0x45, 0x2F, 0x0B, 0x77, 0x11, 0xEF, 0xE6, 0x22, 0x86, + 0xA9, 0xB7, 0x14, 0x08, 0xA9, 0xB2, 0x52, 0x54, 0x2F, 0x01, 0x32, 0x89, + 0x3C, 0xBE, 0xC2, 0xF6, 0x7D, 0x34, 0xBE, 0xD1, 0xDB, 0xE3, 0x74, 0x6F, + 0x9B, 0x59, 0xF9, 0x86, 0x0F, 0xE1, 0xA8, 0x7F, 0x64, 0x2D, 0xE0, 0x73, + 0x9A, 0xCF, 0xB3, 0xF7, 0x7C, 0x7D, 0xE7, 0xF4, 0xFB, 0x70, 0xF4, 0xFF, + 0x82, 0x13, 0x31, 0x47, 0x66, 0xAC, 0x93, 0x3C, 0x5E, 0x59, 0x1B, 0xEE, + 0xEE, 0x63, 0x39, 0xF6, 0xED, 0x97, 0xAC, 0x17, 0x63, 0x90, 0xF2, 0x99, + 0xCB, 0xC1, 0x8C, 0x37, 0x42, 0xE1, 0x58, 0xF1, 0x91, 0xCA, 0x9E, 0x43, + 0x01, 0x17, 0xA4, 0xD5, 0xDB, 0x48, 0x26, 0x2B, 0xB9, 0x91, 0xE0, 0x42, + 0xC0, 0xB2, 0x9C, 0x55, 0xD6, 0x0B, 0xF2, 0xC4, 0x03, 0x3B, 0x8B, 0xD2, + 0x42, 0xFB, 0xDD, 0xDD, 0xB8, 0x22, 0x01, 0x10, 0xC4, 0xE9, 0xA8, 0x88, + 0xA4, 0x98, 0x5A, 0xBF, 0x20, 0xEB, 0x6B, 0x0D, 0x6C, 0xB5, 0x2C, 0x82, + 0xA8, 0xC5, 0xE4, 0xC2, 0x38, 0x77, 0x5E, 0x43, 0x73, 0x75, 0x03, 0x6D, + 0xDC, 0xD3, 0xE4, 0x01, 0xFD, 0x5A, 0x25, 0xD7, 0xF2, 0x7F, 0xC7, 0xF7, + 0x53, 0x94, 0x32, 0x11, 0xA1, 0x70, 0x46, 0x61, 0x33, 0x39, 0x73, 0xFB, + 0xB9, 0x93, 0xD1, 0x59, 0x92, 0xE8, 0xCB, 0x4A, 0x17, 0xB9, 0xB8, 0x75, + 0xA8, 0xCC, 0x14, 0xD9, 0xD6, 0x4D, 0xF7, 0x71, 0xB6, 0x3D, 0xDC, 0x56, + 0x1E, 0x5D, 0x53, 0x83, 0xEE, 0xEA, 0x5C, 0xCE, 0xA0, 0xDC, 0x73, 0x4D, + 0xE5, 0x6D, 0x1D, 0x8C, 0x6B, 0xE1, 0xD9, 0x27, 0xAE, 0x70, 0x61, 0xEE, + 0x8C, 0x3B, 0x83, 0x6A, 0x94, 0x70, 0x28, 0xB1, 0x83, 0x03, 0x6E, 0x0A, + 0xE9, 0xA7, 0x15, 0x42, 0x6F, 0x11, 0x95, 0x1D, 0x05, 0x63, 0x20, 0xA8, + 0xFA, 0x9A, 0x4F, 0x9B, 0xCD, 0xAF, 0xDA, 0xA2, 0x76, 0x12, 0x41, 0xB1, + 0x38, 0xCC, 0x43, 0xFB, 0x88, 0xB7, 0xB4, 0xAB, 0xC0, 0x60, 0x13, 0xC3, + 0x8D, 0x98, 0x67, 0x51, 0x35, 0xCE, 0x91, 0x8D, 0xF6, 0x06, 0xA1, 0xE5, + 0xB3, 0x36, 0x1C, 0xE2, 0xEA, 0x58, 0x75, 0x7A, 0xD1, 0x5A, 0xF2, 0xE6, + 0x97, 0x17, 0x82, 0x07, 0x8D, 0xBD, 0x73, 0xF0, 0x2B, 0x23, 0x37, 0xDA, + 0xF7, 0xE0, 0xCE, 0xF0, 0xFB, 0x52, 0xA5, 0x4E, 0x62, 0xF7, 0xDF, 0xC6, + 0x07, 0x56, 0xF0, 0x4B, 0x75, 0xD2, 0x05, 0xC2, 0xD8, 0xE2, 0x60, 0xDE, + 0x02, 0x21, 0x65, 0x68, 0x38, 0x5E, 0xA4, 0x4A, 0x91, 0x51, 0x12, 0x71, + 0xA4, 0x32, 0x52, 0xFD, 0x34, 0x5C, 0xC4, 0x0D, 0x38, 0x66, 0x22, 0xC5, + 0xD5, 0x28, 0xD2, 0xB2, 0x4A, 0x76, 0x9A, 0x04, 0xAD, 0x90, 0x34, 0xCF, + 0x44, 0x56, 0xF0, 0x10, 0x04, 0x16, 0x25, 0x3C, 0x05, 0x6F, 0x3D, 0xBD, + 0xDC, 0x56, 0x15, 0xE8, 0x51, 0xC4, 0xB3, 0x7E, 0xB6, 0xBC, 0x00, 0x20, + 0xEA, 0x21, 0x9D, 0x9B, 0x8F, 0xBB, 0x76, 0x70, 0x16, 0x45, 0x23, 0xDE, + 0xC3, 0xA5, 0xB7, 0x18, 0x2E, 0x93, 0x5B, 0x65, 0x53, 0x35, 0xDC, 0xED, + 0x55, 0x01, 0x89, 0xA6, 0x2A, 0x26, 0xDE, 0x31, 0x68, 0x6D, 0x65, 0xA3, + 0x40, 0xB0, 0xC9, 0xC9, 0x83, 0xEF, 0xB5, 0x95, 0x98, 0xC5, 0xD6, 0x35, + 0xE7, 0x25, 0x79, 0x5E, 0xFE, 0x5F, 0x5F, 0x32, 0x5F, 0xF8, 0x19, 0x41, + 0xB8, 0x97, 0x73, 0xEE, 0xAC, 0x6A, 0x8F, 0x7C, 0x48, 0xEC, 0x02, 0x48, + 0x17, 0x0C, 0x60, 0x87, 0x9A, 0x4E, 0xC5, 0xAE, 0x3C, 0xA5, 0xBE, 0x18, + 0x34, 0xC6, 0xDF, 0x79, 0x1B, 0x3D, 0x4E, 0xEC, 0x98, 0xE5, 0x59, 0x1B, + 0xAC, 0xBF, 0xC3, 0x4A, 0xF4, 0x84, 0x97, 0x21, 0xCA, 0xA2, 0xB3, 0xF3, + 0xE4, 0x2B, 0x78, 0xB9, 0x51, 0x43, 0x2A, 0x1C, 0x47, 0xC1, 0x54, 0x3B, + 0x0A, 0x75, 0x16, 0x58, 0x6E, 0x7B, 0x73, 0xBF, 0xAD, 0xEA, 0xD6, 0x86, + 0xF9, 0x1B, 0x06, 0x5B, 0x1C, 0x34, 0xC0, 0xEE, 0x41, 0x05, 0xB1, 0x8D, + 0xE6, 0x2B, 0x61, 0xB1, 0x24, 0x17, 0x89, 0xB1, 0x43, 0xCF, 0xAE, 0xC0, + 0x21, 0x76, 0x23, 0xC7, 0xA5, 0xE7, 0xDE, 0x44, 0x9F, 0x12, 0x8B, 0x6C, + 0xBC, 0x19, 0x82, 0xCA, 0x23, 0x39, 0x9E, 0xEC, 0x4E, 0xCE, 0x0F, 0x01, + 0x51, 0x0D, 0xFE, 0x62, 0x9E, 0x80, 0xF4, 0x69, 0xB3, 0x7A, 0xBC, 0x63, + 0x96, 0x60, 0xD3, 0xEA, 0xFB, 0xC4, 0xEE, 0x1B, 0x34, 0x86, 0xA0, 0x7C, + 0x2C, 0xAE, 0x6D, 0x71, 0x30, 0x59, 0x22, 0x2C, 0x24, 0xE3, 0x7B, 0x46, + 0x7D, 0x18, 0xE1, 0xBA, 0x5D, 0xC0, 0x15, 0x67, 0x0A, 0x04, 0x62, 0xC1, + 0x8C, 0x5C, 0xC5, 0x2E, 0x19, 0xB3, 0x8A, 0x41, 0xBE, 0x2A, 0x76, 0x22, + 0x8C, 0x76, 0xA2, 0x45, 0xDB, 0xB7, 0x7E, 0x1D, 0xB0, 0x76, 0x37, 0x59, + 0xDC, 0x22, 0x47, 0x7D, 0xAB, 0x34, 0x4D, 0x5F, 0x41, 0xCE, 0x89, 0x5D, + 0x84, 0xF1, 0xBE, 0x90, 0x25, 0xD3, 0xAC, 0xEE, 0x9F, 0x2A, 0x1E, 0x5C, + 0xE2, 0x19, 0x76, 0x6F, 0xA2, 0x5C, 0x28, 0xAC, 0x99, 0xBD, 0x59, 0x86, + 0x08, 0x36, 0x0C, 0xB8, 0x3E, 0xD1, 0x98, 0x5D, 0x62, 0x94, 0x8F, 0xB1, + 0xA3, 0xE4, 0xFD, 0x56, 0x09, 0x95, 0xCB, 0xFD, 0x79, 0x7C, 0x6A, 0x78, + 0x81, 0x19, 0x3C, 0x34, 0x8A, 0x3B, 0x47, 0x10, 0x48, 0xBC, 0x22, 0x3D, + 0xEB, 0x6A, 0xE7, 0x2E, 0xB0, 0xE1, 0x42, 0x55, 0xE4, 0x2D, 0x98, 0xD1, + 0x7B, 0x9C, 0xD2, 0x5E, 0x6F, 0x52, 0x33, 0x1E, 0xBB, 0x62, 0xBA, 0xB8, + 0xFB, 0x2B, 0x52, 0xE1, 0x3D, 0xA0, 0xB4, 0xDD, 0x05, 0xAC, 0xA6, 0xDC, + 0x3A, 0x07, 0x0F, 0xB0, 0x78, 0x5E, 0x93, 0xDE, 0xBD, 0x2A, 0x34, 0x92, + 0xE0, 0xF0, 0xBC, 0x32, 0xB1, 0xEC, 0xAE, 0xD6, 0x10, 0x37, 0x48, 0x89, + 0x50, 0x74, 0x24, 0xEF, 0xC2, 0x5A, 0xFA, 0xF1, 0xCA, 0x5D, 0x12, 0xF9, + 0x00, 0xCE, 0x95, 0xA5, 0x9A, 0xC1, 0x38, 0x42, 0x27, 0xE6, 0xD3, 0xD6, + 0xE1, 0x20, 0xDE, 0x6E, 0x96, 0x1D, 0x1A, 0x02, 0xC3, 0x0E, 0x10, 0x3E, + 0x55, 0x27, 0x78, 0xFA, 0xA1, 0x2B, 0x25, 0x6D, 0x30, 0x97, 0xA5, 0xA6, + 0xA0, 0x9D, 0xDE, 0x12, 0x2B, 0xDA, 0x82, 0xF9, 0xE9, 0xF5, 0x4F, 0xB9, + 0x30, 0x44, 0x57, 0x92, 0xC7, 0x64, 0xFE, 0x77, 0xF7, 0x0A, 0x4C, 0xC0, + 0x96, 0xDD, 0x79, 0xFD, 0xCC, 0xE7, 0xFE, 0x6A, 0x8F, 0x69, 0x34, 0x37, + 0xB4, 0x41, 0xAA, 0x72, 0x74, 0xC6, 0xDA, 0xCD, 0x7E, 0x72, 0x14, 0x92, + 0x2D, 0xA1, 0x77, 0xAD, 0x1C, 0xDF, 0x99, 0x79, 0x6C, 0xEE, 0xDA, 0x0F, + 0x4C, 0x45, 0x93, 0x52, 0xC9, 0x83, 0x07, 0x57, 0x1A, 0xE2, 0xE0, 0xE6, + 0x3F, 0x91, 0x7F, 0x72, 0x0E, 0x2F, 0xC9, 0x21, 0x09, 0xB6, 0x66, 0xEA, + 0xB2, 0x8D, 0xFB, 0x3E, 0xD2, 0x7C, 0xA4, 0xB5, 0xE9, 0xFF, 0x35, 0xFB, + 0x1A, 0x92, 0x81, 0xEA, 0x1D, 0x08, 0x01, 0x6F, 0x7E, 0x02, 0x55, 0x5E, + 0x11, 0x51, 0xD1, 0x37, 0x35, 0xD7, 0x96, 0xAD, 0xAC, 0xE4, 0x73, 0x3B, + 0x63, 0x1A, 0x57, 0xCB, 0xF8, 0xF7, 0x84, 0xC5, 0x10, 0x84, 0x1F, 0x30, + 0x4E, 0x8E, 0xDA, 0xA0, 0xBE, 0xD1, 0x38, 0xC5, 0x7B, 0x08, 0x3C, 0x9D, + 0xA3, 0x09, 0x9F, 0x64, 0xE4, 0x12, 0xBA, 0x54, 0x45, 0x2D, 0x32, 0x2A, + 0x14, 0xCC, 0x75, 0xF5, 0xE0, 0xEB, 0x05, 0x87, 0x9B, 0xE4, 0x83, 0x52, + 0x67, 0xC4, 0xB7, 0x9E, 0x97, 0x38, 0xC7, 0x35, 0x7F, 0xF6, 0x34, 0x08, + 0x3F, 0x12, 0x65, 0x88, 0x57, 0x8E, 0x60, 0x76, 0xCB, 0x00, 0x4D, 0xF4, + 0x88, 0x12, 0xF6, 0x3C, 0x2E, 0xA1, 0x8F, 0xD8, 0xA8, 0x29, 0x3B, 0xB0, + 0xE9, 0x5C, 0x32, 0x36, 0x9C, 0xAF, 0x90, 0x9F, 0x72, 0xA2, 0x96, 0x65, + 0x17, 0x61, 0x06, 0x63, 0x2B, 0x9E, 0x57, 0xA6, 0xA7, 0x1E, 0xB7, 0xD9, + 0xEB, 0xC2, 0x2A, 0x64, 0xA3, 0x0B, 0x2A, 0x9A, 0x9B, 0x87, 0x13, 0x25, + 0x2C, 0x7C, 0xED, 0x8F, 0x21, 0x04, 0x13, 0x4A, 0xF1, 0xB9, 0xD2, 0x0D, + 0xAF, 0x95, 0x85, 0x77, 0x0C, 0x94, 0x77, 0xAF, 0x03, 0xA6, 0xA7, 0x3B, + 0x06, 0xDF, 0x61, 0x08, 0x36, 0x01, 0x49, 0x6D, 0x7F, 0x34, 0x4F, 0x56, + 0x17, 0x50, 0xB5, 0xB4, 0xE7, 0xE7, 0xAE, 0xF5, 0x61, 0xB5, 0xEB, 0xFD, + 0x40, 0x15, 0x37, 0x9C, 0xF0, 0xA0, 0x47, 0x89, 0x45, 0x2B, 0x16, 0x49, + 0x98, 0xD0, 0xF7, 0x7F, 0x7A, 0xBC, 0x60, 0xA1, 0xBD, 0x7A, 0xB1, 0x75, + 0xBD, 0x55, 0xD6, 0x2D, 0x19, 0x5A, 0x51, 0x09, 0xA6, 0xA5, 0x19, 0x98, + 0xC2, 0xA3, 0xA0, 0x40, 0x4F, 0x1A, 0x23, 0x04, 0x55, 0x46, 0xA7, 0x1E, + 0xE8, 0x33, 0xE1, 0x90, 0x13, 0x74, 0x74, 0x15, 0xA1, 0xCE, 0x47, 0x9C, + 0x62, 0x7D, 0x46, 0x3E, 0xE6, 0x2A, 0x51, 0xC4, 0x12, 0xB3, 0x6B, 0x4A, + 0x1A, 0xBD, 0xE1, 0x10, 0x8D, 0x64, 0x8A, 0xA8, 0x1D, 0x5F, 0x2E, 0x2F, + 0x2F, 0x34, 0xD3, 0xEF, 0x48, 0x1C, 0x5E, 0xAE, 0xA1, 0x53, 0xDB, 0xD5, + 0x56, 0x8D, 0xD2, 0x10, 0xDB, 0x1B, 0x6A, 0x64, 0x86, 0x44, 0x27, 0xC5, + 0xD0, 0xE0, 0xD0, 0x94, 0x6F, 0xDC, 0x5A, 0x0D, 0x60, 0x93, 0xFA, 0x54, + 0x65, 0xE0, 0xA8, 0x14, 0xDB, 0xDF, 0x9F, 0x7B, 0xBB, 0xFA, 0xF7, 0xD5, + 0x49, 0x7E, 0xB1, 0x38, 0x2F, 0x49, 0x02, 0xF6, 0x15, 0xB7, 0x6F, 0x25, + 0xFA, 0xDB, 0xE4, 0x1A, 0xB9, 0xCF, 0x5F, 0xA1, 0x6C, 0x7D, 0x71, 0xED, + 0xCC, 0xAB, 0x76, 0x4E, 0xE2, 0xC8, 0x44, 0x1A, 0xF9, 0xAA, 0x63, 0x51, + 0xA0, 0x47, 0xE9, 0x62, 0xAD, 0x48, 0x25, 0x15, 0xBD, 0x6B, 0xA8, 0xF2, + 0x69, 0x10, 0x0A, 0xA9, 0x56, 0xCA, 0xCA, 0xF4, 0xCD, 0x7D, 0x55, 0x09, + 0xDB, 0x3C, 0x34, 0x9B, 0xED, 0x3A, 0x3A, 0xF9, 0xA4, 0xB2, 0xF4, 0xCE, + 0xD5, 0x46, 0x77, 0x34, 0xA3, 0x96, 0xA8, 0x0E, 0xA1, 0xB5, 0xD3, 0x69, + 0x68, 0xF5, 0xB3, 0x17, 0x99, 0x30, 0xBE, 0x03, 0xB0, 0x89, 0x1D, 0x75, + 0xA4, 0xF7, 0x79, 0xF6, 0x7D, 0xA0, 0x24, 0xCD, 0xE0, 0x0A, 0x92, 0x4D, + 0xE4, 0xF7, 0x28, 0xE7, 0x52, 0x0C, 0x28, 0x62, 0xBA, 0x24, 0xD6, 0xA4, + 0x02, 0xFF, 0xD1, 0x6B, 0xDE, 0x0C, 0xB9, 0xA1, 0xBC, 0xBD, 0x2C, 0x7D, + 0xF6, 0xFF, 0x2C, 0x8D, 0x83, 0x08, 0x62, 0xC5, 0x6B, 0x9F, 0x11, 0xA2, + 0x7D, 0xB7, 0x90, 0x38, 0x08, 0xB9, 0xDC, 0x46, 0xA3, 0xD1, 0xD1, 0xE5, + 0x36, 0xC3, 0xEE, 0x5F, 0x82, 0x63, 0x4E, 0x66, 0x30, 0x38, 0xC8, 0x40, + 0x2E, 0xB8, 0x82, 0xAE, 0x95, 0xCF, 0x45, 0x1A, 0xF9, 0x2A, 0x85, 0x9C, + 0x66, 0x96, 0x7D, 0x69, 0xC5, 0xE7, 0x13, 0xD6, 0x86, 0x39, 0x14, 0xE3, + 0x1B, 0xBF, 0x78, 0x5B, 0xFB, 0x6A, 0x88, 0x1A, 0xCA, 0x21, 0x6C, 0xE3, + 0x80, 0xCE, 0x61, 0x3F, 0x13, 0x7A, 0xFD, 0x16, 0x4F, 0x32, 0xE0, 0xB8, + 0x76, 0x6D, 0x1D, 0x46, 0xB9, 0xF4, 0xA1, 0x05, 0x53, 0x5E, 0x96, 0x42, + 0xF3, 0xF5, 0xA6, 0xAF, 0x87, 0x78, 0xCF, 0x3D, 0x84, 0xB1, 0xFC, 0x97, + 0x1F, 0x86, 0x79, 0x1E, 0xCE, 0xEF, 0x21, 0x13, 0x5F, 0xD3, 0x23, 0xD3, + 0x52, 0xE7, 0x31, 0x37, 0x40, 0x08, 0xB7, 0x6C, 0x50, 0xCA, 0x82, 0xB5, + 0x47, 0x04, 0x98, 0x5F, 0x28, 0xAA, 0x39, 0x76, 0xFA, 0x18, 0xAD, 0x08, + 0x57, 0x9F, 0xFE, 0x7B, 0x6F, 0x2B, 0x46, 0x83, 0x6C, 0xDE, 0x90, 0xCB, + 0x41, 0x40, 0x22, 0x24, 0x4B, 0x82, 0x23, 0x72, 0xC0, 0x28, 0x79, 0xAC, + 0xE8, 0xF5, 0x96, 0xC2, 0xC1, 0x76, 0x6C, 0x5B, 0xBA, 0xFB, 0x60, 0x12, + 0xA1, 0xF1, 0x59, 0xE9, 0x70, 0x97, 0x5C, 0xD3, 0x6D, 0x3C, 0xC2, 0x18, + 0xA4, 0x30, 0x37, 0xF0, 0xAC, 0x92, 0xB3, 0xC3, 0x1F, 0xAA, 0x73, 0x03, + 0x0A, 0x9F, 0x01, 0x5F, 0x4C, 0x68, 0x3A, 0xA5, 0xB0, 0xB9, 0xBB, 0x87, + 0xA4, 0x76, 0x9B, 0x36, 0xD0, 0x35, 0x68, 0x26, 0xEE, 0x76, 0x82, 0xDA, + 0x81, 0x16, 0xFB, 0x82, 0xD2, 0x9D, 0xCD, 0x4F, 0x3A, 0xAD, 0xA3, 0xC2, + 0xBD, 0x9E, 0x60, 0x39, 0x30, 0x1B, 0x9D, 0x4F, 0xAD, 0x0C, 0x88, 0x54, + 0x57, 0x64, 0xFD, 0xBB, 0x63, 0x37, 0x7A, 0xB0, 0x7E, 0x4C, 0x69, 0x4C, + 0x6D, 0x78, 0x84, 0x69, 0x59, 0xF2, 0xAF, 0xFD, 0x76, 0x67, 0x0D, 0x1A, + 0x40, 0xB4, 0x4A, 0xE7, 0xDB, 0x9D, 0xD7, 0xD8, 0x66, 0xC7, 0x8D, 0xAD, + 0x4C, 0xE2, 0x9D, 0x1A, 0x63, 0xA2, 0x56, 0xD9, 0x40, 0x6D, 0x7B, 0xE0, + 0x0F, 0x78, 0xAA, 0x88, 0xA7, 0xA8, 0x62, 0xE3, 0x7E, 0xE9, 0x8C, 0x65, + 0xB5, 0x56, 0x2A, 0x1E, 0x5C, 0xDF, 0xC4, 0x3C, 0xC3, 0x5D, 0x46, 0x00, + 0xF1, 0x8A, 0x0B, 0x7C, 0x58, 0x94, 0xA4, 0x5B, 0xAA, 0x3A, 0x72, 0x0D, + 0xE9, 0x59, 0x99, 0x87, 0x06, 0xE8, 0xC9, 0x4F, 0xC5, 0x54, 0x10, 0x00, + 0xAE, 0x45, 0xCF, 0xE7, 0x81, 0xE5, 0xC4, 0x85, 0x70, 0xD6, 0xD9, 0x60, + 0x9D, 0x19, 0x5F, 0xC9, 0xBE, 0x3D, 0xB7, 0x24, 0xB4, 0x7B, 0x08, 0xFB, + 0xA4, 0x9E, 0x36, 0x26, 0xA0, 0xF2, 0x86, 0xE9, 0x67, 0x10, 0xF6, 0x8E, + 0xE9, 0xEB, 0xA3, 0xB3, 0x75, 0x83, 0x38, 0xA7, 0x45, 0x81, 0xF0, 0xF3, + 0x62, 0x18, 0x02, 0xF1, 0x95, 0x8C, 0xEA, 0x39, 0xD2, 0xB7, 0x11, 0xC0, + 0x06, 0x11, 0x07, 0x42, 0x54, 0xE5, 0x2B, 0xC8, 0xD5, 0x8C, 0x08, 0x25, + 0xE1, 0xD0, 0x8D, 0x7E, 0x61, 0x28, 0x79, 0x6A, 0x2B, 0x33, 0xD9, 0xE9, + 0x6B, 0x04, 0x95, 0x1E, 0xE0, 0xA1, 0xA4, 0x32, 0x71, 0x0E, 0xCD, 0xCB, + 0x80, 0xB8, 0x38, 0x79, 0xF0, 0x9E, 0x58, 0x5E, 0xF6, 0x35, 0xCC, 0xC5, + 0xB9, 0xC7, 0x73, 0xCF, 0x13, 0xEA, 0x77, 0x18, 0xD4, 0x37, 0x46, 0x1B, + 0x66, 0xED, 0x68, 0xEA, 0x1B, 0x38, 0xCF, 0xAD, 0x64, 0x28, 0x1C, 0x04, + 0x81, 0x52, 0x03, 0x8F, 0xC7, 0x45, 0xAE, 0x52, 0xD4, 0x23, 0x27, 0xDB, + 0x2C, 0x98, 0xE8, 0x74, 0xE6, 0xA7, 0x1E, 0x6E, 0x31, 0x10, 0xF5, 0xBB, + 0x1A, 0xA0, 0x5F, 0x6C, 0xAE, 0x38, 0xD7, 0xC6, 0xA2, 0x77, 0x6A, 0x47, + 0x92, 0xC5, 0xC3, 0xE3, 0x12, 0xCE, 0x9A, 0xCB, 0x1F, 0x75, 0xED, 0x1C, + 0x16, 0x30, 0xB8, 0xCC, 0x4E, 0xB1, 0xA5, 0xCE, 0x85, 0xD3, 0x2E, 0xC1, + 0x13, 0x3D, 0x32, 0xBE, 0xBB, 0x22, 0x77, 0x9B, 0x13, 0x10, 0x2C, 0x53, + 0x96, 0x24, 0x02, 0xA1, 0x6B, 0xB1, 0xEF, 0xC8, 0xE9, 0xF0, 0x2A, 0x87, + 0xEF, 0xE3, 0xBF, 0xD8, 0xB3, 0x16, 0xC2, 0x6C, 0xFE, 0xC2, 0xAC, 0x91, + 0x28, 0x4F, 0x31, 0xA8, 0xAF, 0x51, 0x1C, 0xB7, 0x37, 0xA7, 0x6E, 0x77, + 0x37, 0x78, 0x2B, 0x74, 0x78, 0xEF, 0x09, 0x9B, 0x55, 0x30, 0x4E, 0x23, + 0xFE, 0xCE, 0x62, 0xCE, 0x92, 0x38, 0x49, 0x6F, 0x5D, 0xDD, 0xCD, 0x09, + 0x9E, 0xEB, 0xC5, 0xCC, 0x9B, 0xC2, 0xE4, 0xBF, 0x12, 0x47, 0xFA, 0xA5, + 0xB6, 0x89, 0x09, 0x25, 0xDA, 0x33, 0x3A, 0xFD, 0x77, 0xB2, 0x7A, 0xB3, + 0x77, 0xC1, 0x88, 0x88, 0x8E, 0xC5, 0x81, 0xA6, 0x5E, 0x69, 0xE1, 0xA4, + 0xB0, 0x4A, 0x99, 0x59, 0xA0, 0xC7, 0x11, 0x9E, 0xBC, 0x63, 0x62, 0x43, + 0xC0, 0x2C, 0x33, 0x63, 0x6B, 0x51, 0xCE, 0xDC, 0x15, 0x8C, 0x59, 0x46, + 0x6D, 0x91, 0x98, 0x1B, 0x59, 0xA5, 0x48, 0xF1, 0x04, 0x8E, 0x06, 0xA6, + 0x5D, 0x30, 0xB6, 0xAF, 0xBF, 0x84, 0x78, 0x06, 0x8B, 0x79, 0x69, 0xB5, + 0x19, 0x5A, 0x85, 0xD6, 0xF4, 0x6B, 0xD4, 0x0D, 0x80, 0xDB, 0xCF, 0xC6, + 0xCA, 0xE1, 0x48, 0x3C, 0x97, 0x19, 0x5E, 0x4B, 0xE6, 0x5C, 0x6D, 0xAF, + 0xA0, 0xBE, 0xF6, 0x50, 0x4C, 0xE2, 0x58, 0xDD, 0xE7, 0xCD, 0x28, 0x70, + 0x54, 0x3B, 0x50, 0x97, 0x20, 0xB1, 0x19, 0xF2, 0x09, 0x0B, 0xBB, 0xCF, + 0x35, 0xDA, 0x36, 0xAB, 0x12, 0xBA, 0xAF, 0xFF, 0xF4, 0x6C, 0x87, 0xA7, + 0xB9, 0x7C, 0x02, 0xB7, 0xC7, 0x16, 0x7E, 0x3E, 0xF1, 0x33, 0x9E, 0x60, + 0x9C, 0x3F, 0xCC, 0xAC, 0x01, 0x4C, 0x13, 0xF0, 0x43, 0xBF, 0x21, 0x60, + 0xE9, 0xBA, 0x34, 0x2B, 0x08, 0xD2, 0xFE, 0x0F, 0x73, 0x52, 0xAE, 0xA2, + 0x54, 0x51, 0x90, 0xD2, 0x9E, 0xE9, 0x62, 0xAC, 0x37, 0x39, 0x2A, 0xAD, + 0x0A, 0x1C, 0xFE, 0x09, 0x30, 0xDD, 0x9C, 0x2F, 0x52, 0xFD, 0x8F, 0x41, + 0xF9, 0xCE, 0xAE, 0xB8, 0x66, 0xB6, 0x44, 0x1A, 0x82, 0x53, 0x33, 0x48, + 0xA6, 0x8D, 0xEF, 0xE8, 0x80, 0xC3, 0x0E, 0xD7, 0x80, 0xC6, 0x13, 0x1F, + 0x4C, 0x99, 0x43, 0x56, 0x45, 0x35, 0x54, 0x33, 0x68, 0x1F, 0xEF, 0x7F, + 0xB2, 0xB1, 0xF5, 0x7E, 0x7E, 0x08, 0xDE, 0xD2, 0x5B, 0x52, 0x89, 0x20, + 0xDF, 0xD9, 0x5A, 0x64, 0x71, 0x37, 0x79, 0x98, 0x69, 0x10, 0xF6, 0xA2, + 0x5F, 0xBE, 0x71, 0x35, 0xE0, 0x88, 0x74, 0x7A, 0xB5, 0x81, 0x2E, 0x4E, + 0x71, 0x7F, 0x5A, 0x3A, 0x8A, 0xCE, 0xBE, 0xC5, 0x40, 0x8F, 0xC5, 0x2E, + 0xA5, 0x9A, 0x4D, 0x74, 0xE4, 0x73, 0xC7, 0x96, 0x97, 0x84, 0x7E, 0x90, + 0x44, 0x83, 0x24, 0xEE, 0x83, 0x42, 0xA3, 0xCC, 0x1C, 0x7A, 0x4D, 0x27, + 0x0B, 0x80, 0xD0, 0xA4, 0xAC, 0x9B, 0x1E, 0xCB, 0xFC, 0x7F, 0x12, 0x31, + 0x41, 0x3D, 0x06, 0x4A, 0xBC, 0xF6, 0x22, 0xF1, 0xC8, 0xF0, 0x9C, 0x1A, + 0x8D, 0x96, 0x5A, 0xA7, 0xB4, 0x6B, 0x45, 0xBC, 0x4D, 0x32, 0xC1, 0x9C, + 0xC6, 0xA0, 0xCE, 0xED, 0x7B, 0x97, 0x59, 0x7F, 0x42, 0x32, 0x22, 0xA3, + 0x18, 0xFD, 0x65, 0xBC, 0x2C, 0xC3, 0xEA, 0xE8, 0xBD, 0xC1, 0xFF, 0xE1, + 0x20, 0xAB, 0xC0, 0x6A, 0xDA, 0xF9, 0x3A, 0x85, 0x79, 0x7A, 0x10, 0xB9, + 0xA0, 0x7A, 0xAA, 0xAD, 0xF1, 0x8D, 0x67, 0x8F, 0x59, 0xE0, 0x10, 0x4A, + 0x62, 0xA7, 0xD1, 0x8D, 0xF9, 0x26, 0xBE, 0x00, 0x42, 0x81, 0xA0, 0x1F, + 0xFF, 0xCE, 0xAE, 0xAF, 0x1C, 0x56, 0x92, 0x48, 0x65, 0xE7, 0x2A, 0xC6, + 0xE2, 0x78, 0xDE, 0xA2, 0x87, 0x5C, 0x89, 0x3E, 0x38, 0xC4, 0x30, 0xB4, + 0x07, 0x75, 0x7A, 0x01, 0x76, 0xCD, 0x95, 0xD2, 0xA1, 0x4C, 0x37, 0xB5, + 0xA5, 0x2B, 0xE5, 0x09, 0x8B, 0x45, 0x5C, 0x77, 0x9F, 0xE8, 0xAB, 0xB9, + 0xD6, 0xB0, 0x91, 0x57, 0xA6, 0x9E, 0x5D, 0x01, 0xB5, 0xE2, 0xE5, 0x11, + 0xC5, 0x77, 0xC1, 0x11, 0x54, 0x97, 0x45, 0x4F, 0x8E, 0x75, 0xB4, 0xA3, + 0xD7, 0xF4, 0x0F, 0xCC, 0x69, 0xAA, 0xB2, 0xAC, 0xB4, 0x92, 0xD4, 0x66, + 0xB8, 0xA1, 0x91, 0xA2, 0x74, 0xEF, 0xBE, 0x1D, 0xDF, 0xBD, 0xF9, 0x26, + 0x34, 0x1D, 0x71, 0x7C, 0x54, 0x14, 0x42, 0x40, 0x94, 0x4B, 0xA2, 0xF2, + 0x1C, 0xD6, 0x86, 0x32, 0x22, 0x64, 0xE4, 0x13, 0x8D, 0x6A, 0xA2, 0x1C, + 0xB0, 0x3F, 0x78, 0xA9, 0x56, 0x61, 0xFB, 0x56, 0xEE, 0x3D, 0x26, 0x2A, + 0x1C, 0x7E, 0x4D, 0x22, 0xD4, 0xFA, 0xA6, 0xBA, 0x7E, 0x2D, 0x9B, 0x6C, + 0xF7, 0x64, 0x20, 0xCA, 0xD6, 0x89, 0x49, 0x92, 0xFF, 0x2A, 0xBB, 0xA8, + 0x8A, 0xE5, 0x90, 0xEA, 0x20, 0x07, 0xFF, 0xE7, 0xF5, 0xD6, 0x96, 0x77, + 0xE2, 0xEB, 0xC4, 0xD2, 0x51, 0x19, 0x74, 0x83, 0xE2, 0xA3, 0xC2, 0x77, + 0xF9, 0x2E, 0x73, 0x95, 0x86, 0x76, 0x82, 0x6F, 0xB6, 0x4A, 0x0B, 0x6A, + 0x95, 0xCA, 0xDD, 0x7F, 0x66, 0x17, 0x09, 0xE1, 0xD9, 0xD1, 0xA0, 0xE7, + 0x25, 0x64, 0xCB, 0xB6, 0x9A, 0x0F, 0x33, 0x0F, 0xFB, 0xB3, 0x52, 0x78, + 0x00, 0x4E, 0xFB, 0xFF, 0xC9, 0x55, 0x2A, 0x66, 0x8B, 0xC7, 0x9B, 0x4B, + 0x94, 0xFB, 0x5E, 0x77, 0x54, 0x08, 0x94, 0xC3, 0x7C, 0xFB, 0x63, 0xF0, + 0x7C, 0x7C, 0xD5, 0xC4, 0xE2, 0xAE, 0x9F, 0x8E, 0x7F, 0xA2, 0x43, 0x10, + 0x6E, 0x1C, 0x9C, 0xC7, 0x62, 0x1E, 0x58, 0x87, 0xFE, 0x80, 0x0F, 0x53, + 0x40, 0x1E, 0xC9, 0xA5, 0xE1, 0xCD, 0xFC, 0x65, 0x75, 0x5B, 0xC8, 0x4B, + 0x18, 0x0C, 0x71, 0x70, 0xF6, 0x0E, 0x70, 0xE6, 0x9C, 0xE0, 0xF3, 0xFE, + 0x2A, 0xA2, 0x58, 0x23, 0x80, 0x85, 0xAD, 0xA0, 0x65, 0xA2, 0x62, 0xB6, + 0xB5, 0x0A, 0x78, 0x3E, 0xF9, 0x46, 0x85, 0x22, 0xA5, 0xBD, 0x63, 0xB3, + 0x56, 0x75, 0x99, 0xD6, 0x87, 0xFB, 0x6A, 0xB6, 0xB1, 0x02, 0x3B, 0xB1, + 0x10, 0x32, 0x19, 0x71, 0x32, 0xD4, 0x12, 0xFB, 0x49, 0xBC, 0x51, 0x09, + 0xC7, 0x2F, 0xFF, 0xB8, 0xA2, 0xE3, 0x1D, 0xCA, 0x74, 0xC1, 0x41, 0xC3, + 0xEF, 0x3F, 0xDC, 0x4D, 0x40, 0xEA, 0xF7, 0xBB, 0x05, 0x91, 0x11, 0x78, + 0x99, 0xB4, 0xA4, 0xD9, 0x39, 0x17, 0x87, 0xDF, 0x25, 0xDB, 0xE0, 0x73, + 0xA6, 0xE9, 0x3D, 0x27, 0x44, 0xCD, 0x4F, 0xB1, 0x8E, 0x1A, 0x90, 0x94, + 0x07, 0xC9, 0x3E, 0x93, 0x46, 0xDB, 0x05, 0x06, 0xF8, 0x64, 0x5D, 0x78, + 0xBF, 0x7D, 0x73, 0x59, 0x69, 0x5C, 0x6C, 0x1A, 0xE1, 0x86, 0x9E, 0x69, + 0x3C, 0x3B, 0x51, 0x09, 0xE6, 0x43, 0xD3, 0x2B, 0xA8, 0x47, 0x37, 0xAE, + 0x9C, 0xBA, 0x6C, 0x3C, 0x2C, 0x46, 0x60, 0x24, 0x69, 0xE8, 0xCE, 0xF5, + 0x40, 0xCA, 0x72, 0x7E, 0x2E, 0xAA, 0x6F, 0x60, 0x7E, 0x79, 0x53, 0xFC, + 0x09, 0x30, 0x3E, 0x2D, 0x60, 0x21, 0xBA, 0x68, 0x54, 0x49, 0x91, 0x76, + 0x53, 0x60, 0x23, 0xE5, 0xC8, 0x9B, 0xA4, 0x4C, 0x64, 0xD5, 0x02, 0x46, + 0x95, 0xD9, 0x72, 0x3C, 0x30, 0xE8, 0xF1, 0x53, 0x53, 0xC7, 0x8E, 0x90, + 0xF4, 0x34, 0xF3, 0x0C, 0x3F, 0x72, 0xCA, 0x1D, 0x75, 0x72, 0xBE, 0x46, + 0x8A, 0xC0, 0xD3, 0x06, 0x93, 0x72, 0xB0, 0xBF, 0xD0, 0x77, 0x99, 0x06, + 0x7B, 0xDF, 0x6F, 0x10, 0xFB, 0xC6, 0x1D, 0x55, 0x66, 0x2F, 0x81, 0x83, + 0x72, 0x3F, 0x30, 0x60, 0xFA, 0x34, 0xE9, 0xCF, 0xB3, 0x0F, 0x95, 0xBD, + 0xE4, 0x9F, 0xDF, 0x53, 0x6E, 0x00, 0xC9, 0x07, 0x7E, 0x9B, 0x79, 0xBD, + 0xD2, 0xE2, 0x77, 0x80, 0xB4, 0xF3, 0x9A, 0x46, 0x20, 0x8C, 0x21, 0x0A, + 0xEA, 0xFE, 0x07, 0x61, 0x58, 0xB8, 0x38, 0x47, 0xF5, 0x75, 0x5B, 0x33, + 0x78, 0x9E, 0x66, 0xDF, 0x30, 0xAD, 0xD8, 0xED, 0x5D, 0x73, 0x75, 0x6D, + 0x4E, 0x63, 0x8B, 0x35, 0x4F, 0xCA, 0x75, 0x58, 0xDB, 0xEA, 0x2A, 0xE2, + 0xB1, 0xE1, 0x15, 0x6C, 0x69, 0x46, 0xC8, 0xD9, 0x67, 0x15, 0x4B, 0xCE, + 0xB4, 0x04, 0x9B, 0x9D, 0xCA, 0xB7, 0x5E, 0x4B, 0xA3, 0x6C, 0xD1, 0xFF, + 0x4A, 0x71, 0x71, 0x9C, 0x11, 0x87, 0x5E, 0x9E, 0x5D, 0xA9, 0x05, 0x1F, + 0xD8, 0x96, 0xA9, 0x3F, 0xFA, 0xEB, 0x0A, 0x91, 0x44, 0xDD, 0xCF, 0x93, + 0xD5, 0x0A, 0x80, 0x9C, 0xA8, 0xCB, 0x2A, 0x7F, 0x03, 0x45, 0x43, 0xA7, + 0xC3, 0x59, 0xFF, 0xFC, 0xFF, 0x44, 0x24, 0xB1, 0x02, 0xBB, 0x42, 0xCF, + 0x45, 0xC9, 0xF4, 0xAE, 0x23, 0x5D, 0xB2, 0x0B, 0xDE, 0xAD, 0x7E, 0xD6, + 0x1C, 0x75, 0xFE, 0x90, 0xCF, 0x49, 0xB1, 0x51, 0x36, 0x3A, 0x48, 0xD2, + 0xCE, 0xAA, 0x40, 0x2D, 0xE9, 0x70, 0x85, 0xCC, 0x66, 0xB5, 0x2A, 0x85, + 0xA2, 0x1E, 0x18, 0x18, 0xA7, 0x6A, 0x89, 0x39, 0x1E, 0x56, 0x7E, 0xA7, + 0xC7, 0x9F, 0x9B, 0xFA, 0x58, 0x4A, 0x08, 0x0E, 0x78, 0x81, 0x84, 0xB3, + 0x66, 0xA4, 0x8B, 0x20, 0xF2, 0xB0, 0x48, 0xA4, 0xE4, 0xA1, 0xC2, 0x05, + 0xB7, 0x19, 0xFE, 0x71, 0xEF, 0xCB, 0x30, 0x8C, 0xC2, 0x3B, 0xE4, 0x78, + 0x1C, 0x92, 0x51, 0x96, 0xC1, 0x89, 0xA3, 0x71, 0x9A, 0x6D, 0xF5, 0x35, + 0xA6, 0xEE, 0x71, 0xE2, 0x12, 0x55, 0x88, 0x61, 0x10, 0x50, 0x47, 0x53, + 0x3D, 0xBA, 0x0F, 0x6A, 0xE9, 0x5C, 0x8B, 0x0F, 0x8B, 0xAC, 0xCD, 0x20, + 0xAE, 0x5B, 0x9A, 0x80, 0xB4, 0x9C, 0x27, 0x5D, 0x47, 0xD6, 0x03, 0xFE, + 0x68, 0x38, 0xBC, 0x34, 0x1B, 0xFD, 0x62, 0xCF, 0x9A, 0xC0, 0xC9, 0x7C, + 0xAB, 0xF5, 0x85, 0x1D, 0x81, 0x41, 0x6D, 0xB3, 0x62, 0x72, 0x4A, 0x6F, + 0xDD, 0xA8, 0xB4, 0xAE, 0xEA, 0xE0, 0xED, 0x57, 0x82, 0x0A, 0x7E, 0xD1, + 0x3B, 0x7E, 0xA5, 0x43, 0x9E, 0x5F, 0x73, 0x92, 0xEF, 0xAA, 0xC5, 0xAB, + 0xA9, 0x07, 0xD5, 0xB5, 0x32, 0x9E, 0xD3, 0x66, 0xA3, 0x98, 0xDC, 0xF5, + 0x12, 0xB6, 0x89, 0xE0, 0x58, 0xE3, 0x26, 0x62, 0xDC, 0xA2, 0xB9, 0x58, + 0x7C, 0x42, 0xA7, 0xFB, 0x9E, 0x12, 0xD9, 0x50, 0x55, 0xFD, 0x64, 0xC7, + 0xFC, 0xA1, 0x12, 0x98, 0x43, 0xEE, 0x62, 0xBC, 0x75, 0x3B, 0x5D, 0xE1, + 0xFF, 0xAF, 0x29, 0x4D, 0x81, 0x6A, 0xB2, 0x13, 0x2D, 0xE9, 0x9C, 0x65, + 0x90, 0x1A, 0xBE, 0x06, 0x69, 0x9D, 0xC7, 0xF5, 0x98, 0xEB, 0xA4, 0x13, + 0x67, 0xDD, 0xA4, 0x7E, 0x23, 0x56, 0x92, 0x31, 0x62, 0xA3, 0xDD, 0x7B, + 0xB9, 0x1C, 0xD1, 0x0E, 0xEF, 0x1A, 0xB5, 0x94, 0xF4, 0x10, 0xD4, 0x21, + 0x76, 0x14, 0xC1, 0x2D, 0x5C, 0x2F, 0x71, 0x86, 0x94, 0x84, 0x41, 0x6A, + 0x1F, 0xA2, 0x75, 0xFF, 0x34, 0x0B, 0xCA, 0xD4, 0x11, 0x7F, 0xB7, 0xD0, + 0xAB, 0x7E, 0xB9, 0x13, 0x26, 0x1B, 0x60, 0x48, 0x62, 0x2A, 0xF7, 0x18, + 0x24, 0xDF, 0x51, 0x6B, 0x34, 0x61, 0x99, 0x27, 0x03, 0x95, 0x6C, 0xAA, + 0x81, 0xFA, 0x94, 0xAB, 0x9E, 0x34, 0xA5, 0xC5, 0x8C, 0xA6, 0x6A, 0x43, + 0x2D, 0x5F, 0x99, 0xE5, 0x00, 0xE5, 0x51, 0x71, 0x19, 0xA6, 0xF5, 0x36, + 0x1E, 0x21, 0xF2, 0x26, 0xE4, 0x7A, 0x18, 0x76, 0x10, 0xE9, 0xE0, 0x9E, + 0x54, 0x2D, 0xFA, 0x83, 0x9F, 0x41, 0x7C, 0x0E, 0xA7, 0xC9, 0xDD, 0x58, + 0x73, 0x18, 0xCB, 0x26, 0x60, 0xE8, 0x90, 0xC1, 0x4D, 0x0B, 0x01, 0x01, + 0xD8, 0x57, 0xED, 0x78, 0xF9, 0x28, 0x0D, 0xA7, 0x1F, 0x66, 0x99, 0x0A, + 0x17, 0x8C, 0xA7, 0xC1, 0xD2, 0x51, 0x4C, 0x2E, 0x7C, 0x3F, 0xE0, 0x2F, + 0x66, 0x6D, 0x68, 0x2B, 0xE0, 0x17, 0x2F, 0x21, 0xE5, 0x4A, 0xD9, 0x46, + 0x39, 0xA4, 0xD5, 0x2E, 0xF7, 0x6F, 0xAD, 0xA9, 0x13, 0xAE, 0x97, 0xF3, + 0xFC, 0xCE, 0xDA, 0x4C, 0x35, 0xF1, 0x19, 0xCC, 0x27, 0xA4, 0x5C, 0xF9, + 0xDD, 0x19, 0x84, 0xF2, 0x35, 0xDD, 0x3D, 0x7A, 0xD0, 0x9F, 0xA5, 0x81, + 0xFB, 0x66, 0x6E, 0x71, 0x83, 0x88, 0x47, 0xA5, 0xF7, 0xE8, 0x19, 0x5B, + 0x93, 0xE0, 0x1A, 0xE4, 0xED, 0x56, 0xC5, 0xCC, 0x8D, 0xCB, 0x50, 0x41, + 0x0B, 0xEA, 0x2D, 0x2F, 0xBA, 0x8A, 0xA3, 0x64, 0x46, 0x5F, 0x27, 0x22, + 0x17, 0xD9, 0xCC, 0xD6, 0xAD, 0x32, 0xE6, 0x19, 0x35, 0xD2, 0x3C, 0x54, + 0xB5, 0x14, 0xC8, 0x3C, 0x65, 0x9F, 0xA4, 0x2A, 0x44, 0xBA, 0xF3, 0xE5, + 0xBA, 0x10, 0x3B, 0xD6, 0x67, 0xFB, 0x94, 0x99, 0x9A, 0xD7, 0x37, 0x96, + 0xC6, 0x6B, 0xD7, 0xBA, 0x58, 0x82, 0xED, 0x49, 0xD8, 0x6A, 0x58, 0xDB, + 0x04, 0x78, 0x62, 0x8D, 0x30, 0xCA, 0xA0, 0xB8, 0xDE, 0xCD, 0x06, 0x7D, + 0xF3, 0xE8, 0xF8, 0x54, 0xD7, 0xD4, 0x8D, 0xFB, 0xD0, 0xB9, 0x08, 0xE3, + 0xCE, 0x81, 0x7C, 0xCF, 0x71, 0x41, 0x03, 0x1B, 0x9A, 0xED, 0x5C, 0x71, + 0xB5, 0x7B, 0x56, 0xDC, 0x0B, 0x1F, 0xF1, 0xAF, 0x55, 0xE2, 0x37, 0x44, + 0x42, 0x69, 0x27, 0xDB, 0xCE, 0x5E, 0xC1, 0x8A, 0x20, 0x30, 0xBD, 0x7F, + 0x71, 0x2C, 0x1A, 0x26, 0x7C, 0xF8, 0xEF, 0x72, 0x6B, 0x87, 0xB7, 0x13, + 0x9B, 0x39, 0xBC, 0xBD, 0x67, 0xEC, 0x54, 0xA9, 0xB0, 0x5C, 0x11, 0xC3, + 0x60, 0xA7, 0x2F, 0x6D, 0xBC, 0xEB, 0x99, 0x82, 0x47, 0xEE, 0xD4, 0xEE, + 0x85, 0xA5, 0xF6, 0xEB, 0x59, 0xA1, 0xC0, 0x0E, 0xC1, 0x1C, 0x1B, 0x9F, + 0xC7, 0xAD, 0xF1, 0x1C, 0x35, 0x77, 0x06, 0x42, 0xD7, 0xB2, 0x98, 0x0D, + 0x86, 0xF1, 0x71, 0x93, 0xED, 0x29, 0x10, 0xC1, 0x64, 0xA1, 0x0D, 0x5F, + 0x21, 0x8E, 0x9B, 0x7B, 0x16, 0xF8, 0xAA, 0x6E, 0x39, 0x38, 0x71, 0xB0, + 0xDA, 0x6F, 0xF7, 0x74, 0xBD, 0xAB, 0xF2, 0x4C, 0xB2, 0x9E, 0x1E, 0x1D, + 0xB0, 0x75, 0x97, 0xD3, 0x22, 0x03, 0x3D, 0xB9, 0x24, 0x16, 0x16, 0x88, + 0x95, 0x17, 0x9D, 0x67, 0x19, 0xC1, 0x6F, 0x40, 0xC2, 0x61, 0x52, 0xC8, + 0x27, 0x39, 0x75, 0xE5, 0x93, 0xD5, 0x71, 0x89, 0x3E, 0x79, 0x08, 0x49, + 0x4B, 0x02, 0xD9, 0x8D, 0xD8, 0x5B, 0x19, 0x35, 0x34, 0x5F, 0x32, 0x68, + 0x0A, 0xBA, 0xEA, 0x9C, 0xB3, 0x21, 0x25, 0x29, 0x3F, 0xA5, 0x11, 0xF8, + 0x78, 0xA9, 0x6E, 0xED, 0x7E, 0x20, 0xC3, 0xA5, 0xC7, 0x56, 0xCE, 0x29, + 0x4E, 0xC0, 0xA5, 0x04, 0x73, 0x2A, 0xE3, 0x22, 0xF8, 0x30, 0xE5, 0x1D, + 0x0C, 0x76, 0x00, 0xF6, 0x8F, 0xEC, 0x70, 0x65, 0x18, 0x64, 0xCD, 0x20, + 0x37, 0x35, 0x43, 0xA2, 0xF0, 0x67, 0x2D, 0xDE, 0x49, 0xE3, 0x7A, 0x66, + 0x5A, 0x01, 0x87, 0x31, 0xD8, 0x77, 0x85, 0x39, 0x6D, 0xBC, 0x5A, 0xF3, + 0x8B, 0x5C, 0x7C, 0x8F, 0xD8, 0x6A, 0x98, 0xE6, 0x8C, 0x80, 0x3A, 0x44, + 0x9B, 0x44, 0xFC, 0xA1, 0x13, 0xF9, 0xA6, 0x26, 0x1D, 0xC2, 0xF8, 0x49, + 0x98, 0x97, 0x49, 0xEF, 0x28, 0x55, 0x0A, 0x0B, 0x0B, 0x3E, 0x12, 0x20, + 0x3E, 0x25, 0x57, 0xC0, 0xB4, 0xB1, 0xD8, 0x87, 0x33, 0xB7, 0xB4, 0xD8, + 0x99, 0x86, 0x85, 0xB1, 0xCD, 0xB0, 0x36, 0xC1, 0xFD, 0x1D, 0x6E, 0x5E, + 0x6C, 0x65, 0x28, 0x34, 0x13, 0x2C, 0x65, 0x91, 0x98, 0x46, 0xCF, 0x26, + 0x66, 0x06, 0x35, 0x10, 0xE4, 0x82, 0x89, 0x2E, 0xE2, 0x62, 0x6C, 0xAA, + 0x2B, 0x97, 0xAC, 0x23, 0x67, 0x50, 0xE1, 0x88, 0xE2, 0xC2, 0x02, 0xCC, + 0x8C, 0x93, 0xAC, 0x46, 0xB1, 0x0D, 0x4B, 0x63, 0x53, 0xC6, 0x75, 0x17, + 0xA7, 0x68, 0x98, 0xA5, 0x8D, 0x44, 0x48, 0x9D, 0x7C, 0xEB, 0x78, 0x05, + 0x93, 0x30, 0x6E, 0x17, 0xDF, 0x1C, 0x35, 0xED, 0x6A, 0x7A, 0x52, 0x31, + 0x27, 0x2F, 0x82, 0xDD, 0x8D, 0x46, 0x18, 0xCE, 0xFF, 0x13, 0xF6, 0x62, + 0x3E, 0xB1, 0xBC, 0xE5, 0xF7, 0x8E, 0xA2, 0x04, 0x22, 0x3D, 0xFC, 0xA7, + 0x0D, 0xCE, 0x94, 0x2C, 0x48, 0xA2, 0x78, 0x7F, 0x22, 0xBF, 0x08, 0x69, + 0xDE, 0x89, 0x5F, 0x56, 0xE4, 0x88, 0xDB, 0xA1, 0x07, 0xD6, 0x6E, 0xCE, + 0x50, 0xF0, 0xEE, 0x31, 0x52, 0x69, 0xD3, 0x85, 0x22, 0x96, 0x91, 0xA4, + 0x71, 0xA5, 0xB8, 0x7C, 0x0A, 0x8D, 0x59, 0x1F, 0x48, 0x2A, 0xFA, 0xDC, + 0x94, 0x6E, 0x31, 0x92, 0x80, 0x4A, 0x05, 0xE4, 0x00, 0x02, 0x19, 0x23, + 0xDD, 0xA6, 0x10, 0x03, 0x6B, 0x3D, 0xC2, 0xAE, 0x3C, 0x84, 0x44, 0x84, + 0x9B, 0xC9, 0x7F, 0x6D, 0xA1, 0xBE, 0xE8, 0xE9, 0x8E, 0x43, 0x17, 0x18, + 0x85, 0x14, 0x6C, 0x3E, 0xB2, 0xB8, 0x83, 0xFF, 0xA8, 0xE0, 0xF3, 0x9C, + 0xA4, 0x74, 0xA2, 0x7D, 0x82, 0x58, 0xAB, 0x0B, 0xD2, 0xC8, 0x07, 0x29, + 0x8D, 0x66, 0xCD, 0x86, 0xFC, 0xF0, 0x71, 0x7A, 0x6A, 0xF4, 0xC4, 0xD7, + 0xEA, 0x34, 0xB8, 0xF7, 0xCC, 0xF7, 0x8F, 0x27, 0xB1, 0xA7, 0x3D, 0x33, + 0xFE, 0x2F, 0xA1, 0x80, 0x59, 0xE9, 0x0A, 0xF5, 0x3B, 0xEB, 0x84, 0x65, + 0x36, 0xCC, 0x16, 0x49, 0xD8, 0xCE, 0x64, 0x22, 0x12, 0xDA, 0x04, 0x20, + 0x16, 0x85, 0x82, 0xC3, 0x5D, 0x17, 0xE2, 0x01, 0xFB, 0xB9, 0x83, 0x52, + 0x52, 0x50, 0x3B, 0x70, 0x07, 0x87, 0xD5, 0x2E, 0xC1, 0x09, 0x06, 0x3B, + 0xCD, 0x5A, 0xF8, 0x93, 0xA0, 0xD6, 0x67, 0x72, 0xD3, 0x0A, 0x24, 0xB8, + 0x4D, 0x98, 0xE9, 0xB4, 0x3F, 0xDA, 0xB5, 0xA4, 0x32, 0x7D, 0x8B, 0x27, + 0xF3, 0xA0, 0x81, 0x73, 0x18, 0x2A, 0xE0, 0x5B, 0x09, 0x5F, 0x0D, 0xE6, + 0xE9, 0x30, 0x7F, 0x00, 0x33, 0xE5, 0xE3, 0x2B, 0x05, 0x5D, 0x29, 0x9B, + 0xA2, 0x90, 0xEE, 0x09, 0x04, 0x62, 0x07, 0x34, 0x8D, 0x95, 0x00, 0x17, + 0x56, 0x88, 0x05, 0xD2, 0x8E, 0x3F, 0x49, 0x74, 0xD7, 0x59, 0x69, 0x93, + 0xE2, 0x8C, 0xA1, 0xC9, 0x0D, 0xE7, 0x3B, 0x51, 0xB8, 0xE4, 0xA8, 0x77, + 0x58, 0x7A, 0xC2, 0xC7, 0x56, 0x01, 0x0C, 0x0D, 0x5C, 0x1F, 0x00, 0x4D, + 0x36, 0x74, 0x2A, 0xA1, 0xD8, 0x00, 0xC2, 0xAC, 0x61, 0xAC, 0xAC, 0xC8, + 0xA4, 0x0F, 0xE5, 0x8C, 0xCF, 0x9C, 0x2F, 0x93, 0x1A, 0x4A, 0xD9, 0x96, + 0x87, 0x31, 0x42, 0x5C, 0x59, 0x16, 0x89, 0xC4, 0xD5, 0x80, 0x0F, 0xD1, + 0x2E, 0x43, 0x4E, 0x8A, 0xEE, 0x55, 0x49, 0x32, 0x14, 0x31, 0xD4, 0x5E, + 0x58, 0x4E, 0xE9, 0x9A, 0xE3, 0xC2, 0x7C, 0x0E, 0x62, 0xFF, 0xD4, 0x93, + 0xFA, 0xF3, 0x16, 0x7D, 0x35, 0xF8, 0x7A, 0x1D, 0x2E, 0x4C, 0x14, 0xEC, + 0xE8, 0xFB, 0x2A, 0x77, 0x1D, 0x78, 0xCB, 0xE0, 0xC8, 0x50, 0xEB, 0x90, + 0x87, 0xEE, 0xA4, 0xFC, 0xB4, 0x1B, 0x10, 0x11, 0x45, 0x95, 0x26, 0x4F, + 0xCD, 0xDC, 0x3E, 0x16, 0x53, 0xBB, 0x84, 0x5C, 0x97, 0x5D, 0x72, 0xBB, + 0x96, 0xD1, 0x72, 0x08, 0x0E, 0xAB, 0xA2, 0x40, 0x61, 0x84, 0x4F, 0x09, + 0x1A, 0x53, 0xD8, 0x32, 0xEB, 0x48, 0xEC, 0x72, 0x6E, 0x5D, 0x59, 0x48, + 0x69, 0x57, 0xD4, 0x0F, 0xA9, 0xA0, 0x19, 0x4F, 0x3C, 0xBB, 0x5C, 0x97, + 0xF4, 0xF1, 0x48, 0x10, 0x4D, 0xC1, 0x74, 0xCB, 0x61, 0x4F, 0xDE, 0x8E, + 0x04, 0x28, 0xF2, 0xFC, 0x43, 0xDD, 0x7D, 0x1A, 0x30, 0xA5, 0xED, 0xF8, + 0x01, 0x70, 0x73, 0xAE, 0x5F, 0x40, 0xA6, 0x83, 0xF0, 0x59, 0xE2, 0xFB, + 0xE3, 0x43, 0xA2, 0x54, 0x7A, 0x9E, 0xE2, 0xED, 0xF1, 0xD4, 0x82, 0x14, + 0xB3, 0x89, 0x5A, 0xAE, 0xAB, 0x83, 0x37, 0x73, 0x14, 0xE0, 0x48, 0x37, + 0x38, 0xA2, 0x2B, 0x6D, 0x26, 0x9A, 0xD7, 0x40, 0x6E, 0x29, 0xB4, 0x1A, + 0xD4, 0x82, 0x07, 0x16, 0xC0, 0x0C, 0xAE, 0x4A, 0xA5, 0xB3, 0x08, 0xBD, + 0x3C, 0x78, 0xC9, 0x67, 0x3E, 0x3D, 0x85, 0x38, 0xC4, 0x49, 0x03, 0x1C, + 0xE6, 0x92, 0x77, 0x5D, 0xD3, 0xEC, 0x54, 0x7D, 0x18, 0x1F, 0x05, 0xF3, + 0xBB, 0x7D, 0xD2, 0xBC, 0xB8, 0x4D, 0xD0, 0x6E, 0xD5, 0x0A, 0x52, 0x4F, + 0x7A, 0x29, 0x4A, 0x2C, 0xDC, 0x61, 0x5D, 0x44, 0xEA, 0xD7, 0x89, 0x4D, + 0x89, 0xB0, 0x0D, 0x44, 0xC9, 0x4E, 0xCF, 0xD9, 0xE2, 0xFA, 0xC8, 0xA3, + 0xB8, 0x2A, 0x2D, 0x3D, 0x26, 0x63, 0x0D, 0xB5, 0x28, 0x2A, 0xA0, 0x2D, + 0x2F, 0xC5, 0x7B, 0xE8, 0xC4, 0x59, 0x7C, 0xEA, 0xFC, 0x2E, 0x3F, 0xE1, + 0x73, 0xF1, 0x38, 0xA6, 0xC0, 0x3E, 0x78, 0x69, 0xF6, 0x77, 0x64, 0x16, + 0x52, 0x3A, 0x0D, 0x1F, 0x33, 0x3E, 0xE6, 0x68, 0x9B, 0x32, 0x5E, 0xD6, + 0x04, 0xB1, 0x86, 0x0D, 0x61, 0x44, 0xB9, 0xF4, 0x2F, 0xFC, 0x53, 0x78, + 0xFA, 0xB9, 0x2E, 0x37, 0x42, 0x41, 0xC1, 0x2E, 0x3D, 0xBF, 0xA9, 0x2C, + 0x6D, 0x49, 0x44, 0x0D, 0x7D, 0x0C, 0xD1, 0x91, 0xFF, 0xE7, 0x02, 0x6C, + 0x20, 0xB8, 0xE3, 0xF5, 0xD7, 0x3F, 0x6A, 0x5A, 0xFB, 0xA9, 0x24, 0x38, + 0x06, 0x15, 0x22, 0xAE, 0xFA, 0x4C, 0xCD, 0x94, 0xDC, 0x1C, 0x3D, 0x74, + 0x15, 0x88, 0x3E, 0xD3, 0x40, 0x8D, 0x5E, 0xA1, 0xD5, 0x4B, 0x25, 0x5F, + 0xE6, 0x06, 0x91, 0x69, 0x1A, 0xB9, 0x70, 0x79, 0x0B, 0x67, 0xAD, 0xF9, + 0xB8, 0x0E, 0xCC, 0x6F, 0x2A, 0x3A, 0x89, 0x14, 0x48, 0x07, 0x69, 0x43, + 0x4E, 0xAA, 0x21, 0xB0, 0x55, 0xDC, 0xC1, 0x9F, 0x36, 0x39, 0x29, 0x36, + 0x4B, 0x33, 0x84, 0x35, 0x1D, 0x13, 0xF5, 0x4F, 0x46, 0x65, 0x30, 0xD9, + 0xFB, 0xC9, 0x43, 0xAB, 0x54, 0x27, 0x77, 0x4F, 0xC7, 0x70, 0x35, 0x75, + 0xBF, 0xF5, 0x69, 0x65, 0x93, 0xB8, 0x27, 0x07, 0x12, 0x6F, 0x34, 0xE5, + 0x6F, 0x31, 0x80, 0xD5, 0xCD, 0x0D, 0x26, 0x2E, 0xC7, 0xB3, 0xF4, 0x62, + 0x79, 0x5C, 0x20, 0x97, 0xB5, 0x17, 0x46, 0x8A, 0xFE, 0xC4, 0x11, 0xBC, + 0x7E, 0x6C, 0xFF, 0xF5, 0x5D, 0x08, 0x9F, 0xE8, 0x5A, 0x6D, 0x79, 0x22, + 0x0F, 0xFD, 0x0A, 0xB6, 0x76, 0xC7, 0x28, 0x43, 0x61, 0x74, 0x69, 0x7B, + 0x82, 0xCF, 0x3A, 0xB2, 0xC7, 0x56, 0x51, 0x6D, 0xE3, 0x6C, 0x5A, 0x7C, + 0x38, 0x52, 0xAF, 0x56, 0x71, 0xBD, 0x1E, 0xB6, 0x4D, 0x77, 0x43, 0xD9, + 0x76, 0x9B, 0xF7, 0xD2, 0x5E, 0xD5, 0xAF, 0x39, 0xAA, 0x14, 0x74, 0xAF, + 0xB1, 0x15, 0x5C, 0xA9, 0x11, 0x3C, 0x62, 0xA9, 0xA7, 0x92, 0xB6, 0x4F, + 0x95, 0xCD, 0x26, 0x1A, 0x75, 0x23, 0x4F, 0x55, 0x29, 0x7E, 0x5E, 0xDC, + 0x04, 0x57, 0x70, 0xC4, 0x4D, 0xEB, 0x7F, 0x51, 0xB7, 0x99, 0x0D, 0x20, + 0x92, 0xA4, 0xC8, 0x88, 0x7B, 0x6D, 0xB4, 0xC8, 0x1C, 0x19, 0x36, 0xC7, + 0xD2, 0xFA, 0xC1, 0x9B, 0x92, 0x16, 0x79, 0xAD, 0x88, 0x9A, 0xCB, 0x31, + 0xA4, 0x92, 0xA8, 0xBC, 0xF5, 0x46, 0xE3, 0x71, 0xC4, 0xE8, 0x63, 0xF5, + 0x89, 0x68, 0x2A, 0x21, 0x41, 0x46, 0x81, 0x7A, 0x99, 0xAC, 0x04, 0xDD, + 0x18, 0x91, 0x4E, 0x3D, 0x02, 0x06, 0x8B, 0x8A, 0x6F, 0x47, 0x3A, 0xA5, + 0xD5, 0x75, 0xE0, 0x8E, 0x81, 0xB8, 0x36, 0x3D, 0xA0, 0x35, 0x20, 0x5F, + 0x0B, 0x96, 0x8E, 0xD8, 0x1D, 0x56, 0x2F, 0x14, 0x81, 0xE1, 0x40, 0x30, + 0x79, 0x84, 0x7D, 0x49, 0x83, 0x71, 0xBA, 0xDC, 0x14, 0x0B, 0x64, 0xFC, + 0x52, 0xD8, 0xBE, 0x3F, 0x35, 0x74, 0x4C, 0x64, 0x15, 0x8D, 0x84, 0xF4, + 0xB5, 0x9D, 0xF9, 0x14, 0x35, 0xC9, 0x71, 0x69, 0x1C, 0x1A, 0x5D, 0x99, + 0xA4, 0x41, 0xFF, 0x3B, 0x98, 0x30, 0x64, 0xCE, 0xF3, 0xB3, 0xA9, 0xF7, + 0xF0, 0xAA, 0xB2, 0x73, 0xF2, 0x29, 0x01, 0x95, 0x6C, 0xF8, 0x14, 0x21, + 0x1B, 0x6E, 0x58, 0xD4, 0x9E, 0x7A, 0x62, 0x82, 0xB7, 0xD7, 0xB3, 0xEE, + 0xEB, 0x3F, 0x3D, 0x3D, 0x52, 0x9F, 0xA9, 0x15, 0x5D, 0xB4, 0xB0, 0x6D, + 0x17, 0xC8, 0x5C, 0x5F, 0xF7, 0x55, 0xB1, 0xA9, 0xA5, 0x25, 0xEF, 0x89, + 0xE2, 0x7F, 0xBA, 0xAA, 0xDD, 0x40, 0x54, 0x6F, 0x6E, 0x86, 0x27, 0x24, + 0x3B, 0x18, 0x49, 0xE6, 0xD3, 0x6B, 0xDD, 0x44, 0xC0, 0x94, 0xB0, 0x1D, + 0x32, 0xDE, 0x5B, 0x3E, 0xEA, 0x72, 0xB4, 0x01, 0xA1, 0xE4, 0x58, 0x52, + 0x26, 0xD7, 0x6F, 0xC7, 0x86, 0x7A, 0xB7, 0x41, 0xC2, 0xB0, 0x55, 0x55, + 0x8F, 0x1F, 0xA2, 0x43, 0x60, 0x2E, 0x5A, 0x53, 0xBF, 0xA8, 0xAC, 0xD6, + 0x63, 0xA8, 0x0E, 0x2A, 0xA0, 0x4F, 0x8A, 0xF3, 0xF9, 0xF6, 0x1C, 0xC1, + 0x1A, 0x0A, 0x3D, 0x16, 0x2F, 0xF5, 0x8A, 0x6F, 0xEF, 0x41, 0x08, 0xAA, + 0x5C, 0xFE, 0xFF, 0x4A, 0xFE, 0x9D, 0x36, 0x1B, 0xDE, 0x4C, 0x36, 0x9E, + 0x57, 0x0F, 0x4C, 0xD7, 0xFC, 0x8B, 0x03, 0x7E, 0xFB, 0x59, 0x34, 0xBB, + 0x1C, 0x8D, 0xCF, 0x59, 0x9D, 0x4C, 0xA4, 0x26, 0xD3, 0x68, 0x35, 0xCE, + 0x80, 0xCD, 0xDB, 0x6D, 0xE0, 0x02, 0x5A, 0xAE, 0x64, 0xD9, 0x9E, 0x44, + 0x74, 0x08, 0x71, 0x5E, 0x6D, 0x95, 0x0A, 0x60, 0x75, 0xAA, 0xA7, 0xB5, + 0xD7, 0x75, 0x5E, 0xD3, 0x05, 0xA3, 0x50, 0xA1, 0x32, 0x13, 0x8C, 0x29, + 0x81, 0x45, 0x7A, 0x38, 0x61, 0xB5, 0xD0, 0x4C, 0xB5, 0x95, 0xD7, 0x92, + 0x58, 0x8C, 0xF8, 0x0B, 0x9D, 0x7C, 0x33, 0x35, 0xAE, 0x8E, 0x69, 0x48, + 0x0F, 0x03, 0x75, 0x81, 0x78, 0xE8, 0x91, 0x0D, 0xEF, 0x84, 0x91, 0x53, + 0xF1, 0xE6, 0xED, 0xC1, 0xD7, 0x1D, 0xD3, 0xE0, 0x73, 0x9E, 0x94, 0xD5, + 0x68, 0xE9, 0xBD, 0x13, 0xA6, 0x22, 0x76, 0x19, 0x5F, 0x2D, 0xAC, 0xF9, + 0xD6, 0x06, 0x88, 0x1E, 0x5B, 0xA5, 0x00, 0x67, 0x6F, 0x0D, 0xD2, 0xF3, + 0x5D, 0x8D, 0x06, 0x90, 0xD1, 0xF7, 0xBE, 0x39, 0x19, 0xD5, 0x9E, 0x60, + 0x6B, 0xD4, 0x51, 0xE6, 0x46, 0xB2, 0x96, 0xC4, 0x01, 0xC3, 0xD2, 0xA5, + 0x3D, 0xCD, 0x4F, 0x9C, 0xBD, 0x3D, 0xC3, 0x0F, 0x1E, 0x94, 0xA8, 0xFD, + 0x26, 0xA9, 0x9C, 0x4C, 0xA4, 0xF8, 0xBC, 0xD8, 0xB1, 0xC7, 0xFE, 0x5F, + 0x8B, 0xF2, 0x60, 0x37, 0x6D, 0xF9, 0x62, 0xEF, 0xAE, 0xAD, 0x19, 0x69, + 0xAF, 0x20, 0x26, 0x41, 0x60, 0xEC, 0x8D, 0x32, 0x6B, 0x3B, 0xA3, 0xA2, + 0x67, 0xB0, 0x6D, 0xA3, 0x48, 0x8A, 0xAA, 0x03, 0xD3, 0xE4, 0xE7, 0x76, + 0xA0, 0x8C, 0xBE, 0x53, 0xF3, 0x2E, 0x96, 0x1A, 0xEB, 0x1E, 0x38, 0x47, + 0x29, 0x64, 0x8F, 0xDB, 0x15, 0xAA, 0xFF, 0xE6, 0xC0, 0x16, 0x22, 0xD8, + 0x95, 0x36, 0x56, 0x28, 0x5B, 0x90, 0x0C, 0x8C, 0xF3, 0x03, 0x01, 0xA3, + 0x53, 0x17, 0x62, 0x0C, 0xB6, 0xDC, 0x65, 0xE4, 0x70, 0x49, 0xD2, 0x76, + 0x85, 0x47, 0x90, 0x8B, 0x84, 0xF4, 0x00, 0x13, 0x0A, 0xB6, 0x3F, 0xF4, + 0x3E, 0x67, 0x1A, 0x11, 0xFF, 0xA5, 0x28, 0x0F, 0x1E, 0x0C, 0xD5, 0xE9, + 0x99, 0x3E, 0x09, 0xB5, 0x0B, 0x87, 0x9B, 0xF1, 0xB2, 0x8D, 0xFD, 0x24, + 0x95, 0x43, 0x52, 0x1D, 0x38, 0xA7, 0x1B, 0x98, 0x38, 0xEC, 0x68, 0x7C, + 0x69, 0x45, 0x17, 0x21, 0x63, 0x85, 0x16, 0xF8, 0xCE, 0x10, 0xA4, 0xE1, + 0xCE, 0xD8, 0x1A, 0x82, 0x6E, 0xC7, 0x06, 0xD4, 0xB0, 0x58, 0x09, 0x22, + 0x95, 0x84, 0x0E, 0xD6, 0x2E, 0x06, 0x74, 0x07, 0x5D, 0x01, 0x8B, 0x88, + 0x8D, 0x66, 0xF4, 0x0D, 0x36, 0x52, 0x41, 0xCD, 0xE6, 0x17, 0xBF, 0xF2, + 0x37, 0x50, 0x68, 0x3A, 0x5C, 0x7D, 0x4F, 0xD5, 0xE0, 0xE7, 0xB3, 0x24, + 0xD3, 0x2A, 0x07, 0x18, 0x9F, 0x53, 0x8D, 0x52, 0xD6, 0x98, 0x26, 0x30, + 0xA5, 0x43, 0x04, 0x7C, 0xB1, 0xF3, 0x93, 0xE2, 0xE6, 0x21, 0x1B, 0x94, + 0xDA, 0xEE, 0x29, 0xB1, 0xDB, 0x07, 0x3D, 0x9F, 0x9B, 0x14, 0x8F, 0x4E, + 0x9D, 0xCB, 0xCE, 0xA9, 0x5C, 0x60, 0xB1, 0xC0, 0x4C, 0xB7, 0x89, 0xBA, + 0xD2, 0x14, 0xEE, 0x94, 0xBC, 0xD4, 0x5D, 0x90, 0x3B, 0xC6, 0xC5, 0x7C, + 0xCB, 0x13, 0xB9, 0xDE, 0xA0, 0x06, 0x37, 0x94, 0x73, 0xBC, 0xC8, 0xA0, + 0xDB, 0xE3, 0x51, 0xD3, 0x36, 0xB5, 0x4E, 0x4F, 0xA0, 0xB0, 0x74, 0x38, + 0x76, 0xBC, 0x8A, 0x98, 0x4B, 0xFA, 0x00, 0x4F, 0x89, 0xA5, 0x59, 0x92, + 0xC4, 0xAD, 0x35, 0x67, 0x68, 0xE5, 0x7D, 0xDD, 0x5E, 0x1C, 0x50, 0x35, + 0x4E, 0xE1, 0xEB, 0x9C, 0x1A, 0xD2, 0x4C, 0x98, 0x25, 0x2A, 0x43, 0x7E, + 0x7C, 0x64, 0x45, 0x1B, 0x19, 0x97, 0xDE, 0xD0, 0xCB, 0x24, 0x5C, 0x40, + 0x95, 0x46, 0x0A, 0xEC, 0x14, 0x59, 0x55, 0x10, 0x12, 0x23, 0x1C, 0xF9, + 0x9E, 0xB5, 0xEF, 0xEA, 0x6E, 0xE4, 0x6B, 0xF7, 0xDD, 0x95, 0xD2, 0x8F, + 0x96, 0xBA, 0xDA, 0x04, 0x87, 0x47, 0x5B, 0x2A, 0xB6, 0x71, 0x2C, 0xE3, + 0xCA, 0xC6, 0x94, 0xC0, 0xA0, 0xB8, 0x17, 0x78, 0x0A, 0xFE, 0xB9, 0x1E, + 0xB3, 0xCB, 0x21, 0x7E, 0x90, 0x01, 0xB2, 0xBD, 0xEE, 0x81, 0xD0, 0x05, + 0xDE, 0xC2, 0xFB, 0x6E, 0x94, 0xDC, 0x22, 0xA0, 0x0F, 0x8A, 0xD5, 0xB5, + 0x56, 0xA5, 0xB4, 0x39, 0xCD, 0x1E, 0xDB, 0x5A, 0xF2, 0x92, 0xA8, 0x7B, + 0x1F, 0xDC, 0x44, 0xE7, 0xFF, 0xE3, 0x59, 0x69, 0x2D, 0x5E, 0x45, 0x53, + 0x99, 0xB6, 0xC2, 0x15, 0x21, 0x65, 0x32, 0x43, 0xFC, 0xAD, 0x6D, 0x91, + 0xC9, 0x09, 0x82, 0x6B, 0x2C, 0xA8, 0x0A, 0xE8, 0x4A, 0xD7, 0x19, 0x06, + 0x53, 0x9A, 0x00, 0x0A, 0x9E, 0x25, 0xA6, 0x6E, 0xE0, 0x98, 0xC2, 0xC9, + 0xD4, 0x98, 0x32, 0xE4, 0xEE, 0x37, 0x5D, 0x1F, 0x10, 0x22, 0xCD, 0x91, + 0xBD, 0x7B, 0xDA, 0x27, 0xB5, 0x06, 0x5A, 0x9E, 0x27, 0x6C, 0xBA, 0x53, + 0x20, 0x13, 0xA3, 0x2E, 0xAC, 0x05, 0x9A, 0x3C, 0xD1, 0xEB, 0xA2, 0xE8, + 0x7F, 0x4E, 0xB0, 0xE6, 0x5A, 0x73, 0x6B, 0x5D, 0x37, 0x80, 0x66, 0xD3, + 0x50, 0x21, 0xA6, 0x9E, 0x43, 0x15, 0x15, 0x77, 0xC7, 0x0B, 0x30, 0x16, + 0xB6, 0x8D, 0x38, 0x93, 0x53, 0xF5, 0x68, 0xF4, 0x34, 0x07, 0xD1, 0xBD, + 0x10, 0xDE, 0xDD, 0x4E, 0x87, 0x32, 0xB6, 0xB4, 0x37, 0xD1, 0xBB, 0x8A, + 0xD2, 0x4B, 0xBF, 0x04, 0x73, 0x3A, 0x36, 0x5C, 0x87, 0xF7, 0x0B, 0x41, + 0x11, 0xF6, 0x27, 0x2C, 0xB6, 0xC2, 0x8B, 0xBE, 0x6E, 0x5D, 0x17, 0xA6, + 0xEC, 0x74, 0xDF, 0xE4, 0x88, 0xDD, 0x9E, 0xEF, 0xFD, 0x2B, 0x25, 0xD9, + 0x3B, 0x42, 0xB1, 0x2F, 0x21, 0xE4, 0x29, 0xC8, 0x69, 0x48, 0xC8, 0xB8, + 0xB3, 0x8C, 0x2B, 0x4F, 0x31, 0xB9, 0x0C, 0xB2, 0xE1, 0xE9, 0xE1, 0xF4, + 0x7C, 0xE9, 0x78, 0x1F, 0xFF, 0xB7, 0x6D, 0xF9, 0x01, 0xF5, 0xDA, 0xCB, + 0x37, 0x20, 0xAE, 0x29, 0xED, 0xC7, 0x93, 0x25, 0xB7, 0x10, 0x47, 0x1E, + 0x07, 0x8A, 0x82, 0xDC, 0xB9, 0x93, 0x39, 0xA0, 0xD8, 0x24, 0x5F, 0xA2, + 0x8C, 0xE5, 0xB0, 0xAC, 0x8C, 0x63, 0x09, 0x50, 0x49, 0x04, 0x27, 0xD5, + 0x2B, 0xA5, 0xA1, 0x8C, 0x86, 0x8B, 0x3D, 0x19, 0xC6, 0x39, 0x88, 0xB8, + 0xB4, 0x2B, 0x4C, 0x5D, 0x6B, 0x9C, 0x36, 0xA6, 0x7A, 0x1A, 0xA7, 0x71, + 0xE8, 0x97, 0x78, 0x1C, 0x03, 0xDA, 0x0D, 0xA3, 0xE9, 0xF6, 0x5F, 0x63, + 0x2E, 0x9B, 0x6C, 0x86, 0xB9, 0x7C, 0x3D, 0xD2, 0xC9, 0x90, 0xCA, 0x5F, + 0x48, 0x5E, 0x1C, 0x11, 0x88, 0xCA, 0xBF, 0x79, 0xB5, 0xBF, 0x2D, 0xED, + 0xFE, 0x4D, 0xC6, 0x2C, 0xFB, 0x8E, 0x0E, 0x42, 0x53, 0x8C, 0xB2, 0x07, + 0x92, 0xFF, 0xEC, 0x6B, 0xAA, 0xC5, 0xAE, 0x25, 0x09, 0xEA, 0xBB, 0x82, + 0x5E, 0x86, 0x63, 0xD2, 0xF5, 0x59, 0x8F, 0x26, 0xF5, 0x98, 0x17, 0xE4, + 0x6A, 0x89, 0x28, 0x2B, 0xF5, 0x8A, 0x5E, 0x96, 0x1C, 0x8D, 0xBE, 0x30, + 0x47, 0xE6, 0x75, 0x84, 0x79, 0xFE, 0xF1, 0x35, 0xDD, 0x70, 0x7E, 0xCA, + 0xC9, 0x1F, 0xD8, 0x03, 0x26, 0xEA, 0x48, 0x39, 0x68, 0xFF, 0x34, 0x8B, + 0x58, 0xC6, 0x7C, 0x68, 0x54, 0x1A, 0x03, 0x17, 0x55, 0x23, 0xF9, 0xA8, + 0x66, 0x04, 0x6A, 0xB4, 0x3C, 0xA9, 0xDB, 0x46, 0x5C, 0x48, 0xEB, 0xB2, + 0x0D, 0x74, 0x67, 0x30, 0xD6, 0x2D, 0xFF, 0x30, 0x6D, 0xB5, 0x66, 0x66, + 0x7C, 0xE2, 0x8B, 0xB0, 0xB6, 0x08, 0xFE, 0x2F, 0x05, 0xC4, 0x26, 0x33, + 0x1F, 0x40, 0xC3, 0x07, 0x04, 0xAE, 0xFC, 0xC1, 0x23, 0xE5, 0x31, 0xEA, + 0x16, 0x63, 0xB5, 0x9C, 0xD8, 0x2D, 0xC1, 0xCE, 0x46, 0xBC, 0x4C, 0x88, + 0x7C, 0xBC, 0x86, 0xC5, 0x89, 0x69, 0x93, 0x13, 0x97, 0x0C, 0x05, 0xF3, + 0x7C, 0x9D, 0x23, 0xC2, 0x81, 0x2C, 0xB9, 0x98, 0x05, 0x3D, 0x1B, 0x67, + 0xDA, 0x50, 0x04, 0xD4, 0x79, 0x8A, 0x97, 0x63, 0xE5, 0xAF, 0xA4, 0xFD, + 0x3D, 0x4D, 0x17, 0x3D, 0x8B, 0x9C, 0xA8, 0xEF, 0xA1, 0x42, 0x62, 0xFE, + 0xD0, 0xD3, 0x86, 0xBE, 0x8D, 0xCB, 0x54, 0x02, 0xCD, 0x4D, 0xBF, 0xA9, + 0xC2, 0x74, 0xBC, 0x4C, 0x82, 0x5A, 0x0A, 0xF9, 0xC6, 0x6C, 0xD1, 0x59, + 0x2B, 0x8F, 0xED, 0x51, 0xAF, 0xA6, 0x17, 0x4A, 0xBB, 0xBD, 0xE4, 0x1B, + 0xA2, 0x40, 0xC9, 0xAB, 0x7F, 0xE0, 0x59, 0x19, 0x98, 0xCE, 0x84, 0x51, + 0x35, 0x3F, 0x49, 0x0E, 0x9F, 0x13, 0xD3, 0x43, 0xAF, 0x98, 0xD7, 0x8A, + 0x8E, 0x2E, 0x88, 0x02, 0x4C, 0x17, 0x08, 0x9F, 0xFD, 0x4C, 0xF7, 0x9F, + 0x38, 0x74, 0x4E, 0x39, 0xCF, 0x93, 0xC3, 0x0A, 0xB2, 0x9B, 0xBF, 0xE4, + 0xAE, 0xA5, 0x6D, 0x7F, 0x1A, 0x62, 0x16, 0x05, 0x9C, 0x10, 0xF4, 0x81, + 0x6F, 0xA7, 0xDF, 0xE8, 0x95, 0xC8, 0x88, 0x8A, 0x11, 0xEB, 0x56, 0xC6, + 0x27, 0xE0, 0x92, 0x45, 0x87, 0x6F, 0x63, 0x11, 0x1B, 0x5C, 0xD8, 0x4E, + 0x13, 0xAA, 0xB5, 0x04, 0x15, 0xCD, 0xF6, 0x66, 0x1C, 0x7C, 0x62, 0x3A, + 0x6F, 0x73, 0xCF, 0x8B, 0xAB, 0x3A, 0x42, 0x5E, 0x1F, 0x58, 0x3E, 0xF2, + 0x4C, 0xAF, 0xCB, 0x7A, 0x0E, 0x0C, 0xAB, 0xED, 0x04, 0xF6, 0xC2, 0x91, + 0xAC, 0x8D, 0x30, 0xF1, 0x2A, 0x43, 0x53, 0x02, 0x5C, 0xF5, 0x92, 0x21, + 0x50, 0x56, 0x2E, 0x38, 0x7C, 0x6E, 0x48, 0xDE, 0x81, 0x0E, 0x41, 0x3B, + 0xA0, 0x74, 0xFC, 0x63, 0xC3, 0x3D, 0x8E, 0xC9, 0x28, 0xA2, 0xA0, 0x57, + 0x4A, 0xDC, 0xB5, 0xAA, 0x1E, 0x86, 0xA2, 0x6C, 0x55, 0xF7, 0xC9, 0x1F, + 0x28, 0x6B, 0xB5, 0xD6, 0x98, 0x25, 0x32, 0xE0, 0xA5, 0x29, 0xC8, 0xA6, + 0xFE, 0x95, 0xC0, 0xA5, 0xFE, 0x82, 0x32, 0xD5, 0xC0, 0xFE, 0x63, 0x37, + 0xBD, 0x57, 0x42, 0x53, 0xF6, 0xF9, 0x6A, 0x2C, 0x88, 0x71, 0xDC, 0xB5, + 0x28, 0xF0, 0x18, 0x7E, 0x45, 0xF0, 0xB2, 0x19, 0x15, 0x1C, 0x2D, 0x1A, + 0xD2, 0xF4, 0xAD, 0xDB, 0xAF, 0x23, 0x07, 0xA1, 0x3F, 0xDE, 0x97, 0xA5, + 0x1A, 0xD2, 0x7E, 0x61, 0x8D, 0x23, 0x49, 0xC6, 0x22, 0x0E, 0xE0, 0xD9, + 0x40, 0xC5, 0xE2, 0xD7, 0x0C, 0xDC, 0xD1, 0x50, 0x45, 0xC3, 0x74, 0x64, + 0xD4, 0xCC, 0x11, 0xEC, 0x1F, 0x5E, 0x7E, 0x67, 0x76, 0x73, 0x3E, 0x55, + 0x43, 0x44, 0x31, 0x1B, 0xBD, 0xF3, 0xA9, 0x7C, 0x72, 0xCE, 0x83, 0x2E, + 0x5D, 0x2B, 0xF6, 0x2C, 0xA5, 0xB2, 0xC6, 0xB1, 0x71, 0x1E, 0xEA, 0x33, + 0xF1, 0x83, 0x2A, 0x21, 0x65, 0x13, 0xFE, 0xA0, 0x21, 0xB7, 0x44, 0x07, + 0x04, 0xF1, 0x46, 0x1D, 0xEF, 0x71, 0x80, 0x27, 0x42, 0x5F, 0x90, 0x55, + 0x54, 0x84, 0x60, 0x37, 0xCF, 0xFB, 0xFA, 0x36, 0x4D, 0x92, 0x63, 0x82, + 0x3D, 0xE8, 0xC2, 0x09, 0xE7, 0xBE, 0xC3, 0x7D, 0x4C, 0x17, 0xF1, 0x5C, + 0x0F, 0xB6, 0x57, 0x25, 0x5D, 0xC0, 0x0C, 0x63, 0xE1, 0xF2, 0x9F, 0x69, + 0xD6, 0x35, 0x73, 0xDC, 0xB3, 0x1D, 0xDA, 0x72, 0x5E, 0xB7, 0x12, 0x3B, + 0x43, 0xF7, 0xB4, 0xCC, 0x48, 0xAC, 0xE2, 0xB3, 0xFB, 0x15, 0x91, 0x03, + 0xFB, 0xDF, 0x2A, 0x4D, 0x70, 0x88, 0x75, 0x02, 0x18, 0x53, 0xF9, 0x9F, + 0xC1, 0x9C, 0x0C, 0x5B, 0x5A, 0x59, 0x1B, 0x5F, 0x4A, 0xE5, 0x39, 0x20, + 0xAD, 0x28, 0xC7, 0x80, 0x77, 0x13, 0x8E, 0x61, 0xBD, 0xE8, 0x80, 0x37, + 0x41, 0x6E, 0xE7, 0x75, 0xCA, 0x41, 0xC6, 0xA9, 0xCC, 0x1C, 0xAF, 0xFF, + 0x97, 0xCC, 0xFE, 0xF2, 0xED, 0x85, 0xD8, 0xB1, 0x4F, 0xF3, 0x7A, 0xE7, + 0xF9, 0x18, 0x41, 0xD7, 0x49, 0xA2, 0x1B, 0xBC, 0xE2, 0x89, 0x93, 0x54, + 0x5A, 0xF1, 0x5E, 0xA3, 0x66, 0x51, 0x8C, 0x66, 0x7A, 0xF7, 0x44, 0xD7, + 0xFD, 0x90, 0xF1, 0xEE, 0x3E, 0xF6, 0x0E, 0xA5, 0xE9, 0xDB, 0xD0, 0xDB, + 0x58, 0xA7, 0x45, 0xA9, 0x34, 0xD8, 0x44, 0xA3, 0x65, 0x29, 0xCB, 0x61, + 0x8E, 0xAD, 0x7F, 0x95, 0xBA, 0x71, 0xFB, 0xB6, 0x93, 0x5F, 0x6F, 0xFC, + 0xC1, 0xAA, 0xE6, 0x9F, 0x73, 0x55, 0x69, 0xE7, 0x35, 0x12, 0xCA, 0x26, + 0x56, 0x39, 0x79, 0xFB, 0xAB, 0x53, 0x00, 0xF0, 0x8F, 0x72, 0xBF, 0x2D, + 0x30, 0x05, 0x67, 0x65, 0x4B, 0xD3, 0x6A, 0xF7, 0x8B, 0x79, 0x41, 0xFA, + 0x89, 0x2A, 0xDB, 0x0C, 0xA1, 0x10, 0xFC, 0x3A, 0x12, 0x63, 0x55, 0xB0, + 0x3A, 0xB5, 0x30, 0xDB, 0x08, 0x76, 0xAF, 0xF6, 0x1A, 0xD9, 0xAE, 0x51, + 0x81, 0xE3, 0x84, 0x90, 0x70, 0x2C, 0x1B, 0xA7, 0x75, 0xA3, 0x44, 0xD2, + 0x9B, 0x71, 0x7C, 0x39, 0x0E, 0x1E, 0x32, 0x7D, 0x6B, 0x40, 0x90, 0xEE, + 0xEF, 0x85, 0xB3, 0x21, 0x86, 0x2B, 0xE7, 0x53, 0x70, 0x7B, 0xB4, 0xE2, + 0x2D, 0xBE, 0x1F, 0x61, 0xEA, 0x7D, 0x31, 0x4E, 0x07, 0xB6, 0xD3, 0x20, + 0x82, 0x2F, 0x7E, 0xEA, 0x63, 0x8E, 0x31, 0xD8, 0xCE, 0x3C, 0x50, 0x58, + 0x58, 0x99, 0x3D, 0x77, 0x18, 0x6C, 0xF6, 0x64, 0xB2, 0xB8, 0xBF, 0x39, + 0xE0, 0x2C, 0x47, 0xAF, 0xBC, 0xDF, 0xC9, 0xE3, 0x4A, 0x92, 0xB3, 0xAB, + 0x28, 0x4C, 0x07, 0x32, 0x53, 0xDC, 0x33, 0x25, 0xC8, 0xD6, 0xAC, 0xE9, + 0xFF, 0x17, 0xF1, 0x63, 0xD6, 0x03, 0x6A, 0x81, 0xEE, 0x3F, 0xDA, 0xAE, + 0xD1, 0x5D, 0xAD, 0x92, 0x51, 0x99, 0xA8, 0x5C, 0xDA, 0x47, 0x3A, 0xDB, + 0x94, 0x9D, 0x89, 0xA2, 0x24, 0x88, 0xB0, 0xBB, 0x22, 0x46, 0x8F, 0x03, + 0xB0, 0x9C, 0xB9, 0xDE, 0xD6, 0xCA, 0xEA, 0xDE, 0x6B, 0x97, 0xA9, 0xB0, + 0xB3, 0xDB, 0xA6, 0x5E, 0xAD, 0xEC, 0x12, 0x23, 0x04, 0x4D, 0x7B, 0xF2, + 0x7C, 0x0A, 0xE2, 0xB3, 0xA0, 0x81, 0x58, 0x8F, 0xC0, 0xA6, 0xE9, 0xDF, + 0x7F, 0xA7, 0x89, 0x6E, 0x2D, 0x68, 0x23, 0xF1, 0x29, 0xB7, 0xD7, 0xDC, + 0x63, 0x4A, 0xCB, 0x83, 0x24, 0xC0, 0xE4, 0x54, 0x5C, 0x67, 0x12, 0xB3, + 0xFB, 0x6A, 0x1E, 0x37, 0xE0, 0xBE, 0x85, 0xDA, 0x7C, 0xB4, 0x8B, 0xEC, + 0xE8, 0xBB, 0x08, 0x84, 0xD9, 0x90, 0x4B, 0x56, 0xFA, 0x2F, 0xA2, 0x36, + 0xC8, 0x97, 0xFC, 0x3E, 0xC0, 0x9C, 0x28, 0x5D, 0xFD, 0x54, 0xD8, 0x53, + 0x7D, 0x41, 0x4F, 0x15, 0x09, 0xA6, 0x3F, 0xAF, 0x13, 0x31, 0xE6, 0xE8, + 0x45, 0x8C, 0x64, 0xFC, 0xF6, 0x53, 0x1C, 0x2B, 0x25, 0xDF, 0x15, 0x93, + 0x06, 0xE1, 0x32, 0x45, 0x9A, 0x29, 0x6B, 0xD5, 0x11, 0x27, 0xA7, 0x2E, + 0x98, 0xA8, 0x30, 0xD7, 0x93, 0x37, 0xDE, 0xFE, 0xC2, 0xE7, 0xC0, 0xAE, + 0x5E, 0x26, 0x04, 0xA4, 0x57, 0x7A, 0x3F, 0xD7, 0x0E, 0xB6, 0x27, 0xE1, + 0xCF, 0xBA, 0x27, 0xC3, 0x84, 0xFE, 0xD5, 0x4A, 0x87, 0xF0, 0xB5, 0x1C, + 0x44, 0x3E, 0x17, 0xC9, 0x99, 0x8F, 0x85, 0xE6, 0xDA, 0x41, 0x94, 0xAB, + 0x71, 0xC9, 0x0B, 0x9E, 0xA8, 0xF0, 0x5A, 0x01, 0x14, 0x8E, 0x15, 0x05, + 0xB7, 0xE0, 0x90, 0xDD, 0x33, 0x9E, 0x82, 0x3B, 0x14, 0x57, 0xBD, 0xD1, + 0xC7, 0xC1, 0x6D, 0xDE, 0x3F, 0x4B, 0x4E, 0xD6, 0xF4, 0x49, 0xED, 0xAF, + 0x6C, 0x6C, 0xE3, 0x51, 0x0E, 0xDF, 0x15, 0xAF, 0xCD, 0x7F, 0xBF, 0x64, + 0xF4, 0x66, 0x0F, 0x25, 0x86, 0xDA, 0xEF, 0xDF, 0xBB, 0x75, 0x92, 0xAD, + 0x70, 0x42, 0x1E, 0xC7, 0x23, 0x2C, 0xC1, 0x49, 0x4B, 0x9B, 0xAC, 0x7C, + 0x3C, 0x7D, 0xFA, 0xA2, 0x80, 0xCC, 0x0E, 0xDC, 0xD2, 0xAD, 0xDA, 0xBD, + 0xF2, 0xFB, 0xAD, 0xCA, 0x96, 0x68, 0x19, 0xAE, 0x7E, 0xDB, 0x43, 0xF3, + 0xEF, 0x52, 0x3F, 0x95, 0x3E, 0x5C, 0x9A, 0x9E, 0x54, 0x8F, 0x47, 0x27, + 0xEC, 0xC1, 0xBF, 0x31, 0x7A, 0xDB, 0x6B, 0xBE, 0x40, 0x98, 0x8A, 0x33, + 0xD8, 0x42, 0x97, 0x0C, 0x51, 0x3B, 0xD7, 0xB1, 0x95, 0xF8, 0xEF, 0x3B, + 0xC8, 0xD8, 0x4C, 0x94, 0x0D, 0xDE, 0xC4, 0x09, 0x77, 0x52, 0x6E, 0xF2, + 0xEF, 0x50, 0x9A, 0x83, 0x48, 0x6D, 0x69, 0x91, 0x33, 0x1A, 0x56, 0x98, + 0xC0, 0x12, 0x86, 0xA8, 0xE3, 0xDE, 0x2E, 0xE9, 0x43, 0xB3, 0x7A, 0x71, + 0x40, 0xFA, 0x34, 0xF7, 0xA6, 0xC3, 0x2F, 0xBB, 0x16, 0x6B, 0x91, 0x01, + 0x58, 0xB0, 0x8D, 0x7A, 0x54, 0x62, 0x59, 0x3E, 0xC3, 0x2F, 0x3D, 0x48, + 0xFB, 0x6C, 0x85, 0xD3, 0xD7, 0xB0, 0xFD, 0x4E, 0xCA, 0x3A, 0xEE, 0x37, + 0xFF, 0xA1, 0xA8, 0xB0, 0x8F, 0xF8, 0x3F, 0xC7, 0x88, 0x07, 0x30, 0x1C, + 0x81, 0x56, 0x63, 0xC2, 0x97, 0x05, 0x8C, 0x7A, 0x01, 0xBF, 0x14, 0x50, + 0xA7, 0x87, 0x9A, 0x86, 0x79, 0x59, 0x45, 0x0F, 0x78, 0xD4, 0x0D, 0x1E, + 0x3B, 0xE0, 0xF1, 0x14, 0x11, 0x55, 0x04, 0xE8, 0x10, 0x34, 0xDC, 0xF8, + 0x3C, 0x12, 0xC5, 0x93, 0x64, 0x47, 0x70, 0x84, 0x89, 0x5F, 0xAF, 0xC3, + 0x6B, 0xB2, 0x89, 0xAE, 0xED, 0xF6, 0x6A, 0x55, 0xC5, 0x50, 0xC5, 0xDE, + 0x02, 0x70, 0xF9, 0x03, 0x67, 0xA4, 0x82, 0xDE, 0x0D, 0x38, 0x18, 0xDF, + 0x5D, 0x24, 0x8D, 0x00, 0x8A, 0xF5, 0xA3, 0x01, 0xC6, 0xE3, 0xA6, 0x17, + 0x16, 0xB9, 0xA1, 0x8E, 0x9C, 0x08, 0x9B, 0x2A, 0x20, 0x22, 0x69, 0x50, + 0x91, 0x10, 0x98, 0x2C, 0x19, 0x94, 0xE6, 0xE9, 0x2C, 0x0F, 0xDD, 0x0A, + 0x5A, 0xF8, 0xAD, 0xE5, 0xBE, 0x65, 0x3C, 0xD3, 0x75, 0x1C, 0x75, 0x77, + 0xC2, 0xF7, 0x23, 0x7E, 0x6E, 0x62, 0xAF, 0xD2, 0x5F, 0x00, 0xFC, 0xD0, + 0xF9, 0xF1, 0xCF, 0x7E, 0x11, 0xE6, 0xF5, 0x7E, 0xC0, 0x46, 0xCA, 0xEF, + 0x1C, 0x5F, 0x62, 0x2F, 0x6D, 0xF9, 0xF4, 0x88, 0x64, 0xD2, 0xE0, 0x1F, + 0x04, 0x33, 0xB9, 0xBA, 0x99, 0xC9, 0x9E, 0xD9, 0x48, 0x11, 0x6B, 0x2C, + 0x35, 0x79, 0x36, 0x40, 0xDF, 0xB8, 0x3C, 0x2F, 0xAA, 0x35, 0x91, 0x43, + 0xD2, 0x23, 0x8F, 0x1E, 0x24, 0x4E, 0x29, 0xA8, 0x9F, 0x3F, 0xF9, 0xF4, + 0x5E, 0xAC, 0xBF, 0x39, 0xE2, 0x7F, 0x12, 0x4C, 0x95, 0xBC, 0xCE, 0x61, + 0xF3, 0xEF, 0xD0, 0x30, 0x60, 0x6B, 0xFD, 0xD6, 0xF8, 0x15, 0x25, 0x56, + 0x57, 0xC2, 0xF5, 0x84, 0xE4, 0xDF, 0xE8, 0x28, 0xBF, 0x81, 0x98, 0x5D, + 0xFA, 0x28, 0x66, 0xF5, 0xD5, 0x43, 0x71, 0x17, 0xBF, 0x19, 0xA2, 0x5F, + 0xB6, 0xDB, 0x14, 0x93, 0xBC, 0x30, 0xC4, 0x3E, 0x11, 0x01, 0xC5, 0x04, + 0x30, 0x90, 0xBE, 0xA5, 0x85, 0xC4, 0x1B, 0xAD, 0x68, 0xCA, 0xBB, 0x7B, + 0x8B, 0x45, 0x29, 0xF4, 0xA3, 0xCE, 0x72, 0x36, 0x79, 0x1B, 0xE6, 0x4D, + 0xD7, 0x52, 0xBA, 0xD7, 0x2E, 0x61, 0x97, 0xDB, 0x5B, 0xA5, 0x47, 0x1F, + 0x6F, 0xE0, 0x29, 0x25, 0xBC, 0xA1, 0xCF, 0x17, 0xC5, 0x32, 0xAA, 0x2B, + 0xB2, 0x52, 0x89, 0x32, 0xCB, 0xFB, 0x1A, 0xCE, 0x4A, 0x2B, 0x98, 0x7F, + 0xB5, 0x9B, 0x72, 0x42, 0x08, 0xB4, 0x52, 0x83, 0xB5, 0x98, 0x9D, 0xA0, + 0x04, 0x50, 0x3B, 0xFD, 0x4B, 0x18, 0xAF, 0x9D, 0xE0, 0x70, 0xE7, 0x0B, + 0x84, 0x09, 0x93, 0x51, 0x35, 0xE1, 0xC0, 0xB2, 0xD3, 0xE1, 0x66, 0x17, + 0xB1, 0xDC, 0xE4, 0x1D, 0xBF, 0xE6, 0x76, 0x53, 0x1B, 0x05, 0xB2, 0x47, + 0x02, 0x0B, 0xAB, 0x70, 0x52, 0x1B, 0x1C, 0x5B, 0xAF, 0x84, 0x0F, 0x12, + 0xCD, 0xB9, 0x3F, 0xB9, 0x15, 0xC6, 0x56, 0xBB, 0xD7, 0x80, 0xBB, 0x94, + 0xFB, 0xFB, 0x7C, 0xB9, 0xCF, 0xBC, 0x0E, 0xCB, 0xA8, 0x7E, 0x4A, 0xF3, + 0xBA, 0x73, 0xCD, 0x9E, 0x14, 0x0D, 0x12, 0x17, 0x91, 0xF6, 0xF4, 0x9D, + 0x14, 0x13, 0x91, 0x8E, 0x6D, 0x62, 0xF3, 0x27, 0xA1, 0x01, 0x85, 0xD2, + 0x7A, 0xF5, 0x60, 0x13, 0xEE, 0xDC, 0x75, 0xF9, 0xFF, 0x23, 0x2D, 0xFE, + 0xE7, 0x69, 0x40, 0x8B, 0x0A, 0xA8, 0xFF, 0x86, 0x2A, 0x6D, 0x0D, 0xD3, + 0x9D, 0x14, 0xA3, 0xDF, 0xB8, 0x1C, 0x44, 0xE9, 0x7E, 0x9D, 0x73, 0x6B, + 0x0C, 0xF2, 0x0F, 0x45, 0xA5, 0xCF, 0x46, 0xDA, 0xDC, 0xF6, 0x24, 0xC6, + 0x72, 0xD0, 0x91, 0x6E, 0x38, 0x76, 0x1F, 0xA7, 0xF9, 0x8F, 0x9A, 0xFC, + 0x16, 0x1E, 0xF7, 0x6A, 0x82, 0x49, 0x1C, 0xC0, 0xDE, 0x8A, 0xDA, 0x62, + 0x86, 0x06, 0x6C, 0xF6, 0x8E, 0xA3, 0xE1, 0x65, 0x32, 0x7B, 0x65, 0x00, + 0x99, 0xEA, 0xAF, 0x86, 0x03, 0xDE, 0xCE, 0xF9, 0xE6, 0xAE, 0x16, 0x2D, + 0x9D, 0x90, 0xB4, 0x63, 0x96, 0xA6, 0x7E, 0xEE, 0x06, 0xE7, 0x69, 0x84, + 0x40, 0xDE, 0x94, 0x20, 0x7C, 0xCF, 0x37, 0x21, 0x6E, 0x3D, 0xB0, 0xED, + 0x9C, 0x9E, 0xAE, 0x56, 0x5D, 0xD7, 0x54, 0x51, 0x80, 0xA7, 0xCB, 0xB8, + 0xC2, 0x02, 0x45, 0xF3, 0x5B, 0x15, 0xA6, 0xEC, 0x5A, 0x10, 0xB2, 0xCC, + 0xC6, 0x4D, 0xCD, 0xE5, 0xF5, 0xB5, 0x86, 0xC3, 0x73, 0x00, 0xDB, 0x5B, + 0xE7, 0x0E, 0xF8, 0x51, 0x05, 0x4B, 0x93, 0xB3, 0xD0, 0x78, 0x12, 0x1E, + 0x86, 0xCD, 0xBB, 0xE4, 0x80, 0xF7, 0x72, 0xF5, 0xC7, 0x95, 0xF5, 0x62, + 0xFA, 0x27, 0x9B, 0x9A, 0x24, 0xDD, 0x7E, 0xE3, 0xCE, 0x7C, 0x96, 0x13, + 0x29, 0xD2, 0xCD, 0xB5, 0x31, 0xD8, 0x8D, 0xE9, 0x8D, 0x12, 0xD5, 0x49, + 0x76, 0xFD, 0xCC, 0xCC, 0x8B, 0x30, 0x6D, 0x7D, 0x33, 0xC1, 0x0B, 0x0B, + 0xC8, 0xD3, 0xA2, 0x3A, 0x98, 0xAB, 0x20, 0x50, 0x25, 0x44, 0xC4, 0x34, + 0xC0, 0x82, 0x64, 0x94, 0x44, 0x19, 0x33, 0xCB, 0x18, 0x5A, 0x7B, 0x33, + 0x38, 0xED, 0xC6, 0x5F, 0xD4, 0x85, 0xD1, 0x1D, 0xDD, 0x1C, 0xD7, 0x43, + 0xFF, 0x67, 0x28, 0xD2, 0xC1, 0x8E, 0x3D, 0x19, 0x21, 0xC1, 0x8D, 0x00, + 0xCE, 0x0C, 0x2C, 0x83, 0x89, 0x11, 0x14, 0xC1, 0x59, 0x29, 0x63, 0x2D, + 0xC6, 0x46, 0xD0, 0x52, 0xFB, 0x02, 0xEC, 0xF3, 0x9C, 0xF2, 0x64, 0xB4, + 0x37, 0x99, 0x5C, 0xF6, 0x57, 0xC9, 0x4A, 0x51, 0x18, 0x08, 0x6E, 0x8B, + 0x9D, 0xEB, 0xA5, 0x8F, 0xE4, 0x85, 0x29, 0x4C, 0x5F, 0xD8, 0x41, 0x2A, + 0x62, 0xAB, 0x25, 0x42, 0xEE, 0x90, 0x64, 0x8E, 0x93, 0x64, 0x87, 0x49, + 0x98, 0x7C, 0x0E, 0xDF, 0xAC, 0xC5, 0x79, 0x2D, 0xC8, 0x53, 0x45, 0x2B, + 0xCF, 0x2F, 0x0B, 0xB6, 0x5B, 0x4C, 0x45, 0x38, 0x96, 0xE3, 0x70, 0x91, + 0x8E, 0xAC, 0x51, 0x67, 0xA2, 0xDB, 0x83, 0x55, 0x4C, 0x9D, 0xEB, 0x49, + 0xE4, 0x37, 0x68, 0x9B, 0x58, 0xDC, 0x4B, 0xEC, 0xB5, 0xC4, 0xDC, 0x13, + 0xB1, 0x54, 0x92, 0xA5, 0x67, 0x75, 0x98, 0x43, 0x71, 0x27, 0xFF, 0xA5, + 0x6E, 0xE3, 0x12, 0x8C, 0xF6, 0xCB, 0x18, 0x21, 0x7C, 0x0A, 0x4B, 0xB3, + 0xA5, 0xF4, 0xEA, 0x09, 0x2C, 0x1C, 0x57, 0xBF, 0x8F, 0xA6, 0x94, 0xDD, + 0x19, 0x35, 0x4F, 0x17, 0xA7, 0x55, 0x45, 0xBD, 0xC8, 0x32, 0x72, 0x9E, + 0x05, 0xD6, 0xBA, 0x3C, 0x60, 0x2E, 0xE6, 0x83, 0x12, 0xC4, 0xE2, 0x80, + 0x03, 0xDE, 0xBB, 0x88, 0xFB, 0x7F, 0xAD, 0x3B, 0x9C, 0xD8, 0xD0, 0x8E, + 0x4C, 0x52, 0x4D, 0x7A, 0xB8, 0x89, 0xB0, 0xBC, 0x7F, 0x94, 0x81, 0xBB, + 0x6C, 0xE7, 0x5E, 0x1C, 0xFA, 0x69, 0x81, 0xB6, 0x46, 0xC2, 0x3B, 0x70, + 0xB8, 0x02, 0xA9, 0x9F, 0x17, 0x0F, 0xF2, 0x31, 0x17, 0x82, 0xFF, 0x17, + 0x02, 0xB9, 0x14, 0xBB, 0xE7, 0x1B, 0x1B, 0x4B, 0x92, 0x14, 0xE4, 0xE7, + 0x6D, 0x6D, 0x73, 0xB8, 0xCB, 0x5D, 0x92, 0x27, 0x7D, 0xDA, 0x00, 0x69, + 0x70, 0x15, 0x3C, 0x0F, 0xF0, 0xDE, 0x5F, 0xCD, 0x1A, 0x17, 0x86, 0x2A, + 0x58, 0xB5, 0x4B, 0x3E, 0xAB, 0x4D, 0x8D, 0x75, 0x4D, 0x40, 0x7F, 0x84, + 0x1D, 0x19, 0x17, 0x1E, 0x41, 0x4C, 0xB9, 0xEF, 0x61, 0x46, 0x80, 0xAD, + 0x5D, 0xDB, 0x01, 0x1E, 0x73, 0xED, 0x42, 0xDD, 0x35, 0x07, 0x8B, 0xD0, + 0xEC, 0x2E, 0x77, 0x35, 0xB8, 0xFC, 0x2E, 0xE5, 0x8D, 0x30, 0x96, 0x0D, + 0x88, 0x7F, 0x52, 0xE7, 0x6B, 0x11, 0xF0, 0xD2, 0x6A, 0x6F, 0x89, 0x66, + 0x3F, 0x3A, 0x94, 0x98, 0x64, 0x0F, 0x0E, 0x77, 0xF2, 0x04, 0x96, 0xD9, + 0xAA, 0x36, 0x0B, 0x39, 0xEE, 0x1F, 0x1D, 0x10, 0x23, 0xD0, 0xFA, 0x0B, + 0xE1, 0x88, 0xED, 0x97, 0x73, 0xFF, 0xCC, 0xC8, 0xD6, 0x49, 0x4A, 0x24, + 0xC1, 0x49, 0x78, 0x25, 0x7A, 0x26, 0xD4, 0x6A, 0x9E, 0x4C, 0x98, 0xFA, + 0x90, 0xB4, 0xD4, 0x07, 0xA4, 0xD2, 0x5E, 0x8B, 0x6D, 0xB1, 0x03, 0xBD, + 0xCE, 0x13, 0x3B, 0x3E, 0x78, 0x4F, 0xFE, 0xCB, 0xB6, 0x53, 0xB7, 0x27, + 0xAA, 0xC4, 0x35, 0xCD, 0xD8, 0xD9, 0x96, 0x78, 0x9A, 0x1D, 0xE5, 0x97, + 0xAC, 0xBE, 0x31, 0x8A, 0x77, 0x65, 0x67, 0x61, 0x3A, 0xF0, 0x0E, 0x04, + 0x54, 0x1C, 0xE4, 0x5F, 0xED, 0x06, 0xBA, 0xFB, 0x34, 0x59, 0xB2, 0x91, + 0x33, 0xED, 0xF4, 0x52, 0xFE, 0x42, 0xFB, 0xAE, 0xEF, 0x46, 0xE5, 0x01, + 0x95, 0x6F, 0xB7, 0xE6, 0x8A, 0xEE, 0x45, 0xE5, 0xAF, 0x13, 0x8B, 0x76, + 0x74, 0xC3, 0x31, 0x36, 0xD2, 0x84, 0x1C, 0xA9, 0x4D, 0xF1, 0x1E, 0xA7, + 0x97, 0xF4, 0x4B, 0xD6, 0xA2, 0xF8, 0x90, 0x31, 0x2F, 0xCC, 0x70, 0x9F, + 0x59, 0x98, 0x6F, 0x8F, 0x6F, 0x81, 0x44, 0x01, 0x70, 0x25, 0x6B, 0x6A, + 0x86, 0xF9, 0x76, 0x87, 0x37, 0xDB, 0x23, 0x5A, 0xE1, 0x1B, 0x83, 0x8C, + 0x87, 0x2C, 0x21, 0xC2, 0x8B, 0x76, 0x37, 0x1A, 0x5D, 0x96, 0xFB, 0x5B, + 0x9E, 0xF7, 0xA3, 0xFD, 0x11, 0x8F, 0x87, 0x0A, 0xD5, 0xE2, 0x13, 0x33, + 0xCC, 0x02, 0xB5, 0x9B, 0x31, 0x7F, 0x50, 0x4B, 0xED, 0x88, 0x74, 0xCF, + 0x0A, 0x04, 0x2C, 0x92, 0xE2, 0xE7, 0x79, 0x00, 0x68, 0xFF, 0xC2, 0x5B, + 0xA5, 0x76, 0x40, 0xD0, 0x63, 0x53, 0x39, 0x24, 0x48, 0xB2, 0x9F, 0x34, + 0x76, 0xD1, 0x68, 0x75, 0x47, 0x0E, 0x51, 0x90, 0x01, 0x53, 0x05, 0x3E, + 0x88, 0xE8, 0x1A, 0x10, 0x85, 0x52, 0x2D, 0x57, 0x12, 0x17, 0x83, 0x4D, + 0x11, 0xBB, 0x63, 0x0E, 0x59, 0x61, 0xCA, 0xAC, 0x3F, 0xE0, 0x18, 0x04, + 0x68, 0xDC, 0x7D, 0xC7, 0xD8, 0xF2, 0x5D, 0xB6, 0x7C, 0x86, 0x0C, 0x03, + 0xD6, 0x7E, 0xA6, 0x2C, 0x01, 0x5F, 0x7E, 0xFF, 0x9B, 0x0C, 0x26, 0xA9, + 0x9C, 0x5D, 0x9D, 0x00, 0xCD, 0x59, 0x4C, 0x3A, 0xD6, 0x82, 0x85, 0x8B, + 0x65, 0x41, 0x85, 0x40, 0xE0, 0xE9, 0x0B, 0x93, 0xE5, 0x32, 0x24, 0xDB, + 0x94, 0x74, 0x94, 0x07, 0x47, 0x1B, 0x01, 0x6E, 0x4B, 0x5D, 0x26, 0x31, + 0x42, 0xBE, 0x38, 0x08, 0x2B, 0x19, 0xC1, 0x51, 0xCC, 0x51, 0xFC, 0x62, + 0xFE, 0x09, 0x08, 0xD3, 0x58, 0x6C, 0x8A, 0x2D, 0x35, 0xDE, 0x82, 0xD6, + 0x4F, 0xEB, 0x65, 0x9F, 0xA1, 0xC9, 0xC3, 0x7A, 0x70, 0x9F, 0xAA, 0xF3, + 0x97, 0xF3, 0xE9, 0xFC, 0x3B, 0x84, 0x1D, 0xE5, 0x35, 0xA0, 0x05, 0xEE, + 0xAB, 0x78, 0xDB, 0xF0, 0xAD, 0xEC, 0x1E, 0xE9, 0x86, 0x96, 0x46, 0x45, + 0x44, 0xD5, 0x28, 0x7D, 0x83, 0xB0, 0x83, 0x69, 0xBC, 0x60, 0x5E, 0x14, + 0x28, 0xCA, 0xA7, 0x3C, 0xEF, 0xDE, 0x74, 0x89, 0x6D, 0xBF, 0x1B, 0x8F, + 0x59, 0x8E, 0x96, 0xD5, 0xCE, 0x19, 0x41, 0x92, 0x88, 0x2A, 0xE8, 0x1B, + 0x1D, 0x9E, 0xC1, 0x34, 0x2C, 0x3E, 0x3F, 0xBC, 0x4F, 0x72, 0x61, 0x44, + 0x21, 0xCA, 0x08, 0x26, 0x0D, 0x28, 0xDC, 0x3D, 0x6F, 0x33, 0x49, 0xE6, + 0x8B, 0xE6, 0xDD, 0x09, 0x6B, 0x29, 0x8B, 0xAB, 0xF6, 0x2C, 0x23, 0x7E, + 0x2B, 0x51, 0x63, 0x0F, 0x97, 0x25, 0xA1, 0x3C, 0x76, 0x39, 0x3B, 0xFB, + 0x75, 0x62, 0xA4, 0xF5, 0xC6, 0x72, 0x5E, 0xBF, 0x38, 0xA1, 0x8D, 0xB3, + 0x31, 0x0E, 0x02, 0x7A, 0x42, 0xDB, 0x92, 0xD0, 0x44, 0x85, 0x8F, 0x6E, + 0x7B, 0xCA, 0xD4, 0xE1, 0x8B, 0xC9, 0x6A, 0xC2, 0x20, 0xF7, 0x67, 0x00, + 0x39, 0xDA, 0xAA, 0xF9, 0x54, 0x77, 0xDB, 0x54, 0x76, 0x7B, 0x15, 0xBF, + 0xE3, 0x8F, 0x7E, 0x75, 0x09, 0x50, 0x1D, 0x8A, 0x82, 0x91, 0xCA, 0x7E, + 0xF3, 0x11, 0xB8, 0x1B, 0xA7, 0x11, 0x0F, 0x29, 0xA4, 0x32, 0xB7, 0xB4, + 0x66, 0x5A, 0xCE, 0xC3, 0x70, 0xCA, 0x19, 0xF1, 0x75, 0x32, 0x18, 0xCD, + 0x11, 0xCD, 0x29, 0x6F, 0x7D, 0x9D, 0x56, 0x17, 0x6F, 0xB2, 0x82, 0x75, + 0x9B, 0xE5, 0x60, 0x5F, 0x98, 0xAF, 0x2A, 0x9A, 0xBA, 0x97, 0x90, 0xC5, + 0x99, 0x73, 0xC0, 0xFD, 0x70, 0xA3, 0x14, 0xF7, 0xD8, 0xAF, 0xA4, 0x1C, + 0xEC, 0x04, 0x27, 0xD5, 0xCB, 0x95, 0xAB, 0x1E, 0x1D, 0x01, 0x33, 0xDA, + 0xC1, 0xF3, 0xF3, 0x14, 0x0E, 0xE9, 0x40, 0xCA, 0x8D, 0x16, 0xAF, 0x61, + 0x4C, 0x5B, 0x98, 0x11, 0xFE, 0x39, 0x84, 0x08, 0x29, 0x0B, 0x3C, 0xD1, + 0xC6, 0x80, 0xAB, 0x8B, 0x61, 0xD3, 0x36, 0x84, 0xAC, 0xBE, 0xD0, 0xC5, + 0x5D, 0xD8, 0x7B, 0x9B, 0xF0, 0x72, 0xC0, 0x0C, 0xFD, 0x57, 0x57, 0x75, + 0x31, 0x0D, 0x7D, 0x6E, 0xA4, 0xE8, 0xDC, 0x15, 0x73, 0x22, 0x00, 0x25, + 0xCB, 0xCA, 0x54, 0x5A, 0xB3, 0x1D, 0x27, 0x52, 0xE5, 0xF8, 0xEA, 0xA5, + 0xE7, 0x3E, 0x25, 0x8B, 0x58, 0x23, 0x93, 0xB6, 0x90, 0x62, 0x32, 0xD9, + 0xAA, 0xEC, 0x37, 0xB6, 0xC3, 0xA0, 0x92, 0xE4, 0xFB, 0xFF, 0xB3, 0xF4, + 0xBF, 0x90, 0x58, 0x51, 0x9F, 0xAC, 0xFD, 0xA7, 0x7B, 0xEA, 0x47, 0x67, + 0x5B, 0x5D, 0x1A, 0x1D, 0xED, 0xC8, 0x80, 0x19, 0x86, 0x97, 0x7D, 0x8E, + 0x70, 0x1E, 0x5B, 0xF1, 0x04, 0x21, 0xA0, 0x41, 0xBE, 0x6A, 0x6E, 0x0D, + 0x31, 0x62, 0xB7, 0xE9, 0x9F, 0xCF, 0x09, 0xC2, 0xC0, 0xC0, 0xA8, 0xE2, + 0x9A, 0x01, 0xDB, 0x0C, 0x8B, 0xC3, 0x04, 0xD3, 0xE6, 0xAE, 0x51, 0xCD, + 0xA8, 0x75, 0x51, 0xC9, 0x85, 0x87, 0x38, 0x5B, 0x6F, 0xD6, 0x7C, 0x2C, + 0x56, 0x7B, 0xE3, 0x90, 0x72, 0xC4, 0x17, 0x4D, 0x61, 0xE8, 0x82, 0x04, + 0xB4, 0x54, 0x27, 0xA1, 0xEA, 0x75, 0xB7, 0x3A, 0xA7, 0x51, 0x43, 0xB4, + 0x0C, 0xC8, 0xFB, 0x7D, 0xBD, 0x47, 0x43, 0xDC, 0xE1, 0x60, 0x09, 0x94, + 0xF1, 0xDA, 0x45, 0x6F, 0x57, 0xFB, 0x66, 0xEF, 0xA4, 0x14, 0x6F, 0x7A, + 0xAD, 0xAA, 0xE2, 0x85, 0x3D, 0xC5, 0xF5, 0x14, 0xEB, 0x7B, 0x68, 0xAE, + 0x41, 0xDF, 0xB6, 0xDD, 0x83, 0x14, 0x83, 0xAF, 0x54, 0xF8, 0x34, 0xEA, + 0x01, 0x61, 0x8D, 0x9B, 0xCC, 0xE9, 0xDB, 0x81, 0x68, 0xC2, 0x6F, 0xD2, + 0xAB, 0xF9, 0xF2, 0xC0, 0xF1, 0x29, 0x7A, 0x47, 0x4F, 0x52, 0x51, 0xDB, + 0xDA, 0x1C, 0xD3, 0x5C, 0xE8, 0x2A, 0x68, 0xFF, 0x99, 0xD1, 0x6D, 0xE8, + 0xA1, 0x90, 0x17, 0x1A, 0x2C, 0x7D, 0xB3, 0x1D, 0x8E, 0xF6, 0x84, 0xE2, + 0x3F, 0x1A, 0xD0, 0x3D, 0xE8, 0x51, 0x7B, 0xEA, 0x3E, 0xFF, 0x2B, 0x25, + 0xB7, 0x27, 0x3D, 0xA0, 0x2E, 0x10, 0xD8, 0x1C, 0x99, 0xA4, 0xE0, 0x78, + 0xA3, 0x30, 0x8E, 0x1E, 0xD2, 0xE4, 0xA1, 0x08, 0x0E, 0x9F, 0x60, 0x22, + 0xDE, 0xB3, 0x8C, 0x0F, 0xAE, 0x97, 0x21, 0x35, 0xDC, 0x8E, 0x0D, 0x65, + 0x99, 0xFA, 0xAC, 0x46, 0x79, 0x97, 0xEC, 0x58, 0x7E, 0x42, 0x45, 0x58, + 0x33, 0xAF, 0x2D, 0xE4, 0x45, 0x9F, 0x54, 0x93, 0x34, 0xCB, 0xAD, 0x10, + 0xD6, 0x61, 0x33, 0xB8, 0x5B, 0xCF, 0xB3, 0xF4, 0x68, 0x16, 0xA5, 0x98, + 0x54, 0x75, 0x95, 0x8C, 0xCD, 0xCF, 0x74, 0x29, 0x7F, 0xB5, 0xF7, 0xC9, + 0x56, 0x6E, 0x5B, 0xFF, 0xEA, 0xCB, 0x8A, 0x53, 0x1E, 0x78, 0xA3, 0x25, + 0x68, 0x15, 0xE4, 0xD3, 0xC4, 0xDF, 0x93, 0x6E, 0xC8, 0xAA, 0x53, 0xFA, + 0x3C, 0x60, 0xAC, 0x0D, 0xA2, 0x01, 0xF6, 0x36, 0x1E, 0x80, 0x61, 0xE1, + 0x89, 0x29, 0xDC, 0x0B, 0xC4, 0x0D, 0xB7, 0x8A, 0xD2, 0xB2, 0x7C, 0xAD, + 0x47, 0xB5, 0xE0, 0x1F, 0x48, 0x21, 0x55, 0xAA, 0x5F, 0x7D, 0x85, 0x48, + 0xE8, 0xD6, 0x19, 0xBE, 0xE6, 0x9C, 0x61, 0x8F, 0x89, 0x35, 0x49, 0x6D, + 0x2E, 0x8B, 0x46, 0x1B, 0xCB, 0xD8, 0x06, 0x83, 0x8B, 0x70, 0xED, 0x66, + 0x17, 0xAD, 0x2C, 0xF6, 0xC8, 0xF3, 0x1E, 0xE2, 0xCA, 0xDA, 0x04, 0xAA, + 0xD4, 0xA0, 0xA6, 0x8B, 0xCC, 0x19, 0xF1, 0x87, 0x93, 0x3A, 0x69, 0xEE, + 0x82, 0x75, 0x71, 0x8B, 0x8E, 0xFD, 0x39, 0x4A, 0x9D, 0x95, 0x07, 0x80, + 0x4E, 0xF6, 0x25, 0xFA, 0x9C, 0x68, 0xF1, 0xA6, 0x84, 0x28, 0x8C, 0x47, + 0xFB, 0xCC, 0xE5, 0x7A, 0x2B, 0xAC, 0x3B, 0x58, 0xEE, 0x51, 0x31, 0x18, + 0x6F, 0xFD, 0x5A, 0xE4, 0xFE, 0x80, 0x75, 0x92, 0x67, 0xF1, 0xF9, 0x78, + 0x73, 0xF1, 0x52, 0x4E, 0x9F, 0xFE, 0xA7, 0x18, 0x99, 0x48, 0x74, 0xE3, + 0x94, 0x70, 0x1A, 0x9F, 0xCD, 0x15, 0x31, 0xB3, 0x68, 0x4C, 0xFA, 0xED, + 0x44, 0xC2, 0x8D, 0x71, 0xC0, 0xC2, 0x1B, 0x39, 0x97, 0xE2, 0xFF, 0xA5, + 0x4E, 0x07, 0xF1, 0xA7, 0xFF, 0xBF, 0x85, 0x79, 0x00, 0x29, 0x62, 0xB7, + 0x0F, 0xF9, 0x6A, 0xE5, 0xFE, 0x09, 0xE2, 0x2B, 0x76, 0x74, 0xF6, 0x40, + 0xBE, 0x64, 0xE9, 0xD4, 0x27, 0x74, 0x6F, 0xEC, 0xDD, 0xBC, 0x53, 0xCD, + 0x9F, 0x16, 0x6B, 0x92, 0xAE, 0x59, 0x9E, 0x74, 0x72, 0x18, 0xA5, 0x68, + 0xE0, 0xA0, 0xAE, 0x06, 0xDB, 0xC4, 0xE5, 0x34, 0x37, 0x87, 0xAD, 0x80, + 0x2B, 0x0F, 0x84, 0x37, 0x99, 0x96, 0x9D, 0xEF, 0x87, 0x3C, 0xED, 0x7A, + 0xD9, 0xAA, 0xB8, 0xC8, 0x7A, 0xD4, 0xD0, 0x2A, 0xD7, 0xDA, 0xEC, 0x0B, + 0x85, 0x8A, 0x93, 0x84, 0x38, 0x2D, 0x3F, 0x6B, 0xE1, 0x8A, 0x88, 0x5D, + 0x4C, 0x26, 0x69, 0xF5, 0x43, 0x55, 0xB1, 0x32, 0xB2, 0x78, 0x67, 0x39, + 0xC3, 0x64, 0x4A, 0x6A, 0x5B, 0xA3, 0x7A, 0xBC, 0x8A, 0x0A, 0x76, 0xDB, + 0x69, 0x09, 0x66, 0x2C, 0x2F, 0xD9, 0x30, 0x0B, 0x4E, 0xB0, 0x71, 0x5E, + 0xDE, 0x48, 0x58, 0x6A, 0x10, 0x6B, 0xB1, 0x6D, 0xF8, 0xB3, 0xF9, 0xD9, + 0x24, 0x43, 0x0C, 0xB9, 0xAE, 0xB7, 0x9B, 0x76, 0x3A, 0xB3, 0xF1, 0x68, + 0x0A, 0xD4, 0xE5, 0xEC, 0x30, 0x8D, 0x19, 0xD0, 0x19, 0x42, 0x42, 0xF4, + 0xD2, 0xF0, 0x3D, 0x40, 0x4E, 0xF0, 0x52, 0x8C, 0x9D, 0x77, 0xE4, 0x5B, + 0x04, 0x12, 0x4C, 0x08, 0xC3, 0xF6, 0x9A, 0x58, 0x20, 0x40, 0x4B, 0x06, + 0x8B, 0x1C, 0xD6, 0x0E, 0x7D, 0x2C, 0x8A, 0x9F, 0xEC, 0x25, 0xF0, 0x66, + 0x91, 0x34, 0xBE, 0xB9, 0x27, 0x02, 0xFE, 0x9C, 0x1C, 0x3D, 0x8A, 0xD9, + 0x0C, 0x64, 0x98, 0xE1, 0x2C, 0x9F, 0x25, 0xE9, 0x0A, 0xB7, 0xA4, 0xE7, + 0xE1, 0x59, 0x51, 0x2A, 0xC0, 0xBF, 0x63, 0x80, 0xEE, 0x71, 0x25, 0xD2, + 0xCA, 0x3E, 0x23, 0xA2, 0x0A, 0x5D, 0x53, 0xD5, 0x38, 0xC6, 0x7E, 0xB2, + 0xD6, 0xA1, 0xB0, 0x1F, 0xD0, 0xDA, 0xA7, 0x59, 0x33, 0xF4, 0x43, 0x0A, + 0x9E, 0xCB, 0x95, 0x5C, 0x52, 0xD5, 0x34, 0x9E, 0x52, 0xAC, 0xC1, 0x36, + 0x84, 0x1F, 0x62, 0x1D, 0x86, 0xD6, 0xBD, 0x56, 0x9F, 0xCC, 0xAF, 0x30, + 0xC0, 0x39, 0x28, 0x22, 0xDB, 0xDA, 0xD5, 0x4C, 0x4F, 0x1B, 0x36, 0x1D, + 0x1D, 0xAC, 0xF4, 0x98, 0xF5, 0x46, 0x94, 0x32, 0x80, 0x2B, 0xF8, 0x14, + 0xF0, 0x68, 0x91, 0x1E, 0xF6, 0x72, 0x1C, 0x4A, 0xF9, 0xD6, 0xC2, 0xA6, + 0x3A, 0x85, 0xE9, 0xE1, 0x76, 0xB5, 0xA0, 0xEA, 0x46, 0x6A, 0x2C, 0xF8, + 0x8B, 0x8D, 0x0C, 0xD0, 0x1F, 0x4F, 0xD9, 0x38, 0x5B, 0xFE, 0x6E, 0x59, + 0xA3, 0xB8, 0xA4, 0x68, 0xED, 0x03, 0x4A, 0x06, 0xD3, 0xC1, 0xCD, 0x02, + 0x95, 0x24, 0x5C, 0x3D, 0x3B, 0xEC, 0x5A, 0x1C, 0x46, 0xD6, 0x1B, 0xA5, + 0x42, 0xFD, 0x2E, 0xE7, 0xEA, 0x42, 0x98, 0x42, 0x53, 0xB5, 0xD9, 0xCE, + 0x53, 0xC1, 0x8F, 0x83, 0x4D, 0xB2, 0xB6, 0x9F, 0x8F, 0xB1, 0x88, 0x4D, + 0x45, 0x3D, 0x08, 0x01, 0x9A, 0x28, 0x7B, 0x10, 0x97, 0x6C, 0x76, 0x44, + 0xE1, 0x07, 0x04, 0x51, 0x0E, 0x4A, 0xC7, 0x98, 0xED, 0x86, 0x17, 0x69, + 0x90, 0x14, 0xA9, 0xD8, 0xB7, 0x07, 0x28, 0x4A, 0x77, 0x0B, 0xF9, 0x3F, + 0x27, 0x4F, 0xCF, 0xA9, 0xDA, 0xCE, 0xC4, 0xDA, 0x30, 0x09, 0x56, 0x64, + 0x55, 0xCE, 0xD6, 0xEA, 0xE4, 0x85, 0x92, 0x95, 0x3E, 0x12, 0x5B, 0xF4, + 0x21, 0x91, 0xCB, 0xD9, 0xFB, 0xB7, 0x38, 0xBB, 0x1D, 0xFB, 0xAD, 0xE9, + 0x55, 0x40, 0x9D, 0xF3, 0x30, 0xC5, 0xA4, 0x9E, 0x02, 0xA8, 0x9B, 0x6E, + 0x30, 0x07, 0x32, 0x16, 0xD9, 0xEB, 0x85, 0x55, 0xC8, 0x38, 0xBC, 0x84, + 0x9A, 0x9D, 0x61, 0x1C, 0x0D, 0xF5, 0x07, 0x06, 0xC8, 0x0B, 0x73, 0xC1, + 0xB8, 0xD2, 0x84, 0xC2, 0xAF, 0xCA, 0xB2, 0x88, 0x0A, 0xE4, 0x79, 0x84, + 0x5C, 0x8B, 0xF7, 0xB6, 0xC4, 0x47, 0x92, 0xC9, 0xC1, 0xBD, 0xF6, 0x84, + 0x78, 0xC2, 0x74, 0xC3, 0xF8, 0x3C, 0x3F, 0xD6, 0x0E, 0x02, 0x5D, 0x22, + 0x42, 0x7D, 0xD3, 0xB8, 0xE9, 0xBB, 0x91, 0x36, 0x32, 0x81, 0xDD, 0x89, + 0xCD, 0x41, 0x00, 0x37, 0x4F, 0xA1, 0x48, 0x03, 0x2F, 0x3D, 0x54, 0x38, + 0x17, 0x7C, 0x51, 0x40, 0x9A, 0x41, 0x57, 0x3C, 0xF4, 0x5E, 0x0D, 0xF6, + 0xA4, 0xE4, 0xA2, 0x97, 0x30, 0x71, 0x40, 0xC3, 0x20, 0x88, 0xEE, 0x95, + 0x7A, 0xB9, 0x03, 0x9D, 0x54, 0x10, 0xD1, 0x5B, 0xBC, 0x6D, 0x79, 0xFE, + 0xF4, 0x44, 0x9C, 0xCB, 0x1E, 0xAF, 0x0C, 0x6B, 0xB7, 0x17, 0x60, 0x91, + 0x46, 0x1F, 0x9A, 0xA9, 0xD8, 0x84, 0x0D, 0x49, 0x60, 0x4A, 0x48, 0xDD, + 0x73, 0x1E, 0xDD, 0x17, 0xAD, 0xB8, 0x3C, 0x8A, 0xB3, 0xD3, 0x4C, 0x3C, + 0x97, 0xE3, 0xD0, 0x0A, 0x8D, 0x83, 0x7E, 0x3F, 0xE2, 0x03, 0xD1, 0xD3, + 0x93, 0xA3, 0xFF, 0x3B, 0x12, 0x65, 0x36, 0xF3, 0x27, 0xC1, 0x05, 0x27, + 0xA2, 0x03, 0x71, 0x7C, 0xBD, 0xEC, 0xDB, 0xE4, 0x3B, 0x33, 0x5F, 0x93, + 0xB5, 0x41, 0xAC, 0xF8, 0x6D, 0xD7, 0xCB, 0x06, 0x33, 0x9A, 0x25, 0x2E, + 0xF6, 0x2F, 0xF4, 0x34, 0x6F, 0x5A, 0x05, 0xDD, 0x04, 0x95, 0x33, 0x67, + 0x45, 0xD8, 0xD5, 0xD5, 0xEA, 0xC8, 0x2F, 0x9B, 0xC3, 0xBE, 0xED, 0xCA, + 0xC0, 0xCF, 0xB6, 0xFC, 0x7C, 0x88, 0x37, 0x1A, 0x7D, 0xDA, 0x9B, 0x0E, + 0xFC, 0x30, 0xD9, 0x17, 0xF3, 0x4C, 0x14, 0xF3, 0xDA, 0xF2, 0xCF, 0xCD, + 0x8A, 0x46, 0x23, 0xDA, 0x76, 0xC5, 0xF9, 0x06, 0xB9, 0x79, 0xD3, 0x1A, + 0xD2, 0xA8, 0x11, 0x03, 0x5D, 0x79, 0xA9, 0xA0, 0x93, 0x15, 0xC8, 0x27, + 0xC2, 0xD9, 0x7F, 0x78, 0x3E, 0x84, 0xD4, 0x37, 0x38, 0x52, 0x97, 0xD8, + 0x58, 0x67, 0x6A, 0x13, 0x00, 0x00, 0x20, 0xFB, 0xF2, 0xBD, 0x52, 0x71, + 0xE6, 0x1C, 0x6C, 0x99, 0xF6, 0xDE, 0x72, 0x89, 0xCC, 0x92, 0x57, 0x13, + 0x52, 0x04, 0x88, 0xE7, 0xA5, 0xBC, 0x36, 0x46, 0x3C, 0x03, 0x59, 0xFE, + 0x86, 0x99, 0xBC, 0x40, 0x70, 0xE9, 0xF1, 0xAA, 0xCC, 0x4E, 0x16, 0xD2, + 0x4B, 0x55, 0xC0, 0x42, 0x43, 0x3D, 0xF1, 0x1A, 0x38, 0xB9, 0x4F, 0x9E, + 0x31, 0x4E, 0x86, 0x08, 0x57, 0x95, 0x2D, 0xFB, 0xD7, 0x12, 0xC4, 0x11, + 0xC0, 0x5D, 0x00, 0xD0, 0xB5, 0x8D, 0xEA, 0x8F, 0x66, 0xD3, 0x00, 0x17, + 0x80, 0x1A, 0x54, 0x0F, 0xDE, 0x75, 0x40, 0xD5, 0x1B, 0x64, 0x89, 0x96, + 0xF9, 0x9A, 0x0D, 0x70, 0x26, 0x50, 0x31, 0x3A, 0x3C, 0x0F, 0x5E, 0xC8, + 0xA3, 0xB8, 0x5D, 0x72, 0xDC, 0xBA, 0xB2, 0xEF, 0x58, 0x89, 0x52, 0x55, + 0xF7, 0x9A, 0x17, 0xE7, 0x43, 0xC2, 0x0F, 0x3A, 0x16, 0x75, 0xEB, 0x48, + 0x87, 0x2A, 0xF8, 0x0E, 0xBA, 0xBB, 0x0D, 0xA2, 0x6C, 0x37, 0x71, 0x50, + 0xA4, 0xB8, 0x3F, 0x77, 0x2A, 0xDE, 0x12, 0x1B, 0x87, 0x39, 0x91, 0x40, + 0xA9, 0x62, 0x93, 0x87, 0x59, 0x8F, 0x1F, 0x9E, 0x27, 0xD6, 0x5F, 0xA9, + 0x45, 0x67, 0xBC, 0x8C, 0xE2, 0x84, 0x4C, 0x28, 0x0A, 0x7D, 0xBF, 0xC0, + 0x08, 0x1C, 0x72, 0x87, 0x93, 0xC4, 0xA5, 0x88, 0xFF, 0xD9, 0x29, 0x62, + 0xC9, 0x2F, 0x9D, 0x96, 0x44, 0x77, 0xC1, 0x9E, 0xF4, 0xDF, 0x37, 0x5D, + 0x05, 0x2F, 0xD8, 0x4A, 0x46, 0x5D, 0xB2, 0x0C, 0xBE, 0x28, 0xA4, 0x15, + 0x6B, 0xC0, 0xE4, 0x9A, 0xFB, 0xAE, 0xCB, 0x1F, 0x14, 0x3F, 0x63, 0x65, + 0x24, 0xD2, 0x49, 0x49, 0x90, 0x31, 0xBF, 0x6F, 0x4F, 0x83, 0xE0, 0xDB, + 0xF0, 0x0A, 0xA0, 0x7E, 0x45, 0x7F, 0x15, 0x86, 0x4A, 0x00, 0x06, 0x52, + 0xCE, 0x94, 0x81, 0x55, 0x48, 0x99, 0xF8, 0x2C, 0xD5, 0x18, 0x98, 0xF5, + 0xB7, 0x5C, 0x71, 0x11, 0x19, 0xAB, 0x7D, 0xAD, 0x35, 0x61, 0x2B, 0x00, + 0x00, 0x80, 0xF0, 0x33, 0xF2, 0x4A, 0x77, 0x44, 0xF2, 0x79, 0xA5, 0xE1, + 0x53, 0xEE, 0x84, 0x18, 0x8C, 0x1F, 0x43, 0xA5, 0xF6, 0xA7, 0x3E, 0x73, + 0x89, 0x42, 0x9B, 0x45, 0xA6, 0x23, 0x09, 0x8B, 0x28, 0x02, 0xF4, 0x52, + 0xBA, 0x2D, 0x9A, 0x3A, 0xBC, 0x50, 0x8A, 0x6D, 0xD4, 0x0D, 0x19, 0xAC, + 0x7F, 0x04, 0x99, 0xFC, 0x5C, 0x15, 0xD7, 0x30, 0x9E, 0xDE, 0xCB, 0x61, + 0x89, 0x54, 0x37, 0x6A, 0x9E, 0x21, 0x62, 0x5E, 0x28, 0x4E, 0xCE, 0x41, + 0x7D, 0x50, 0xFC, 0x99, 0xB0, 0x43, 0x86, 0x4A, 0xAD, 0x2C, 0x1C, 0xFC, + 0x36, 0xF4, 0x16, 0x8A, 0x23, 0x88, 0xB8, 0x32, 0xB0, 0x53, 0x3F, 0x50, + 0xDB, 0x04, 0x20, 0x91, 0x9C, 0xA9, 0x71, 0x57, 0xAB, 0x89, 0xE7, 0xA0, + 0xAF, 0x65, 0xE4, 0xDF, 0x19, 0x7D, 0x1C, 0x95, 0xEB, 0x76, 0x9A, 0x1E, + 0x89, 0xEE, 0x44, 0x2D, 0xCA, 0xAF, 0x63, 0x32, 0x1B, 0xA6, 0x0C, 0x0A, + 0xA0, 0x9D, 0x75, 0xFB, 0x98, 0x68, 0x44, 0xC7, 0x31, 0x4E, 0xA4, 0x39, + 0xE4, 0x74, 0xD6, 0xBB, 0xE4, 0x21, 0x6F, 0xAD, 0x57, 0x54, 0x2C, 0x9F, + 0x35, 0x01, 0xF1, 0x0A, 0xE1, 0x07, 0xF5, 0x61, 0x60, 0x0C, 0xF8, 0x9B, + 0x85, 0xE9, 0xC4, 0xBB, 0xBD, 0xEC, 0x45, 0x5B, 0xDD, 0x0B, 0xED, 0x0F, + 0x55, 0x54, 0x7B, 0x50, 0xDB, 0xC7, 0xAC, 0x05, 0x16, 0x5E, 0x55, 0x9C, + 0x83, 0xB2, 0x6D, 0x95, 0x59, 0x3B, 0xCA, 0xB5, 0x1B, 0x81, 0x4D, 0xC6, + 0xC3, 0x8B, 0x20, 0x95, 0x5C, 0xE6, 0x03, 0xBF, 0xF8, 0xA7, 0x16, 0x8B, + 0x49, 0x63, 0xDD, 0x71, 0x15, 0x8B, 0x66, 0xA2, 0xAB, 0x47, 0x06, 0x74, + 0xB5, 0xA8, 0xC4, 0x49, 0x31, 0x4F, 0xFF, 0x08, 0x08, 0xB2, 0x2F, 0x9E, + 0x6D, 0x13, 0xDD, 0xCB, 0x53, 0xB0, 0x47, 0x61, 0x49, 0x47, 0x10, 0xFF, + 0x87, 0xB0, 0x10, 0xD9, 0x21, 0xBD, 0x0F, 0x03, 0x98, 0x3B, 0x07, 0xC5, + 0xC4, 0x65, 0x39, 0x76, 0xCC, 0x44, 0x60, 0xCC, 0x79, 0x7B, 0x56, 0x37, + 0xFE, 0x31, 0xBB, 0xFB, 0x88, 0x82, 0xCD, 0xA4, 0xA0, 0xED, 0x2F, 0x0A, + 0xF8, 0x74, 0x4A, 0x6F, 0xC3, 0xB9, 0x11, 0x76, 0x0A, 0xEA, 0x0F, 0x1C, + 0xFC, 0x6A, 0x49, 0x6A, 0x39, 0x32, 0xF8, 0x5C, 0x40, 0x1A, 0xA5, 0xED, + 0x72, 0x58, 0x6B, 0xD6, 0xA3, 0x53, 0x11, 0x82, 0xB8, 0x78, 0x85, 0x38, + 0xD8, 0xFD, 0x18, 0x8B, 0xDF, 0x0E, 0x62, 0xAF, 0x6B, 0xE4, 0x5F, 0x43, + 0x55, 0x53, 0xB7, 0xAA, 0x43, 0x33, 0x89, 0xA8, 0x67, 0x6E, 0xD8, 0x0A, + 0xCC, 0x1F, 0x89, 0xDA, 0xA4, 0x16, 0xA2, 0xE0, 0xBA, 0xF5, 0x20, 0x10, + 0x05, 0x42, 0x00, 0xAD, 0x39, 0x49, 0xE9, 0x3D, 0x0A, 0xDF, 0x7E, 0x65, + 0x14, 0xAF, 0xA8, 0x5E, 0xD9, 0xC2, 0x16, 0x4F, 0x07, 0x18, 0xA0, 0xAD, + 0x2C, 0xD8, 0x19, 0x6D, 0x11, 0x93, 0x63, 0xD7, 0x6D, 0x05, 0xA9, 0xDB, + 0xBA, 0x02, 0xC8, 0x10, 0x6A, 0xA5, 0x4F, 0x35, 0xC4, 0x35, 0x74, 0xC5, + 0xBF, 0x40, 0x71, 0x92, 0xDB, 0x26, 0xB6, 0xEB, 0xD8, 0x17, 0x34, 0x95, + 0xEE, 0x3A, 0xF6, 0x30, 0x48, 0x6C, 0xAD, 0x88, 0x82, 0x22, 0x48, 0x9B, + 0xA3, 0xDE, 0x5A, 0x47, 0xEB, 0x80, 0x4C, 0x70, 0xFF, 0x7B, 0x7C, 0xD9, + 0xD7, 0x7E, 0x08, 0x74, 0x8F, 0xC5, 0x14, 0xBC, 0xC0, 0x4B, 0xF2, 0x3F, + 0xFF, 0x52, 0xBC, 0x23, 0xFB, 0x30, 0xA9, 0x2E, 0x7A, 0x93, 0x16, 0x73, + 0x99, 0xF4, 0xE5, 0xB7, 0x5F, 0x01, 0xDD, 0x96, 0x1A, 0xDB, 0x36, 0x74, + 0xBE, 0xD4, 0xAB, 0xE2, 0x16, 0x24, 0xB2, 0x0E, 0x36, 0x46, 0x36, 0x8C, + 0x92, 0xB7, 0x79, 0x5E, 0x83, 0x37, 0x6A, 0x1A, 0x15, 0xCE, 0x6D, 0x61, + 0xEA, 0x9D, 0xE6, 0x65, 0x27, 0xD7, 0xB3, 0xF4, 0x6D, 0x55, 0xB8, 0xC0, + 0x42, 0x4C, 0xE8, 0x36, 0x1A, 0x0A, 0x21, 0x68, 0xB3, 0x17, 0xB1, 0xEA, + 0x8D, 0x5C, 0x50, 0xBE, 0xC4, 0x49, 0xC5, 0x7D, 0x19, 0x83, 0xF8, 0x02, + 0x78, 0xAE, 0x3A, 0x5A, 0xB9, 0xA3, 0xA2, 0x0E, 0xCC, 0x10, 0x36, 0x49, + 0x84, 0x44, 0xA3, 0xFE, 0x5B, 0x56, 0x5C, 0x13, 0x43, 0xDD, 0x90, 0x29, + 0x67, 0x9B, 0x3E, 0xD3, 0x9B, 0x68, 0xA7, 0xAE, 0x52, 0x9C, 0x38, 0xF8, + 0xF1, 0x10, 0xB7, 0x19, 0x75, 0x43, 0x27, 0x75, 0x7F, 0x32, 0x40, 0x40, + 0xDB, 0xD2, 0x71, 0x35, 0x45, 0x6C, 0x5B, 0x47, 0x84, 0x57, 0x49, 0x75, + 0xEB, 0x75, 0xDE, 0x93, 0xB2, 0xA7, 0x99, 0x65, 0xB1, 0x34, 0xA7, 0xB7, + 0x67, 0x21, 0x95, 0x56, 0x28, 0xF4, 0x16, 0xF6, 0xA5, 0x86, 0x04, 0x65, + 0x44, 0x48, 0xDE, 0x02, 0xE4, 0x08, 0x6F, 0x57, 0xA3, 0xE1, 0x45, 0x68, + 0xC2, 0x9C, 0x96, 0xFD, 0xCB, 0x5B, 0x1D, 0xDF, 0xB5, 0x52, 0xAC, 0xB4, + 0xE4, 0x2D, 0x33, 0x76, 0x3C, 0x55, 0x8A, 0xD7, 0xD9, 0x65, 0xBD, 0x44, + 0x27, 0x4F, 0x7B, 0x48, 0x05, 0xD5, 0x3D, 0xB8, 0x87, 0x7E, 0x49, 0xE6, + 0x99, 0x12, 0x27, 0xDA, 0x8E, 0xC9, 0x49, 0x4F, 0xFC, 0x61, 0xD4, 0x8C, + 0x63, 0xD1, 0x25, 0x8B, 0x09, 0xA1, 0x21, 0x96, 0xDC, 0xFF, 0x7A, 0x5F, + 0x99, 0xBE, 0xBC, 0x04, 0x0B, 0xD1, 0x0E, 0x44, 0xCE, 0x2C, 0xA1, 0x3C, + 0x8F, 0x49, 0xD9, 0xA1, 0xD4, 0x4D, 0x8E, 0x2B, 0x3E, 0xB4, 0x2F, 0x59, + 0xDB, 0x71, 0x8A, 0xA5, 0x85, 0xD8, 0x31, 0x6A, 0xD3, 0xEE, 0xBD, 0x32, + 0x9D, 0xCA, 0x55, 0x19, 0x6A, 0x7F, 0x43, 0xE0, 0x5B, 0x91, 0x14, 0x4B, + 0x0C, 0xD2, 0xA1, 0xDA, 0xE8, 0x73, 0xF1, 0x24, 0xB9, 0xEA, 0x69, 0x77, + 0xE4, 0x2A, 0x7D, 0xC4, 0xD2, 0xB0, 0x7F, 0xAB, 0x28, 0xB1, 0xD0, 0x34, + 0xF1, 0x89, 0x18, 0x57, 0xB0, 0x65, 0x50, 0x3D, 0x5E, 0x81, 0xE5, 0xEE, + 0xBF, 0xD1, 0x58, 0x1E, 0xC6, 0xA1, 0xCF, 0xD7, 0x31, 0x4A, 0x5D, 0x78, + 0xC6, 0xED, 0x7F, 0xCC, 0xC4, 0xBD, 0xFB, 0x6D, 0xF6, 0xEE, 0x26, 0xF7, + 0xA6, 0xBE, 0x08, 0x6A, 0xAD, 0x03, 0x24, 0xE0, 0x79, 0x24, 0xD0, 0xC1, + 0xE9, 0x9A, 0xAF, 0x94, 0x3F, 0x10, 0x2E, 0xC8, 0x93, 0x34, 0x08, 0x70, + 0xFF, 0x2F, 0x32, 0x66, 0xAF, 0x19, 0xFD, 0xFE, 0xEC, 0x24, 0x44, 0x79, + 0x30, 0x41, 0x21, 0x49, 0xC0, 0xEF, 0x30, 0x59, 0xC5, 0x5B, 0xBA, 0x04, + 0xAB, 0x03, 0x2F, 0x50, 0x55, 0xF5, 0x48, 0x9F, 0x46, 0x98, 0xF3, 0xC1, + 0xDC, 0xFE, 0x8F, 0xE9, 0x59, 0x9F, 0x49, 0xB6, 0x6D, 0x53, 0x9F, 0x05, + 0x3E, 0xED, 0xCE, 0xAE, 0x4F, 0xE8, 0x38, 0xE6, 0x0F, 0x55, 0x96, 0xD2, + 0x53, 0x72, 0x6C, 0x80, 0x78, 0xFB, 0x7C, 0xDD, 0xD0, 0x2E, 0x23, 0x1B, + 0x65, 0x08, 0xF2, 0x76, 0x7C, 0x34, 0x6A, 0xDC, 0xA0, 0xFB, 0xEC, 0xDF, + 0x45, 0x1C, 0x53, 0x6B, 0xFD, 0x2C, 0x96, 0x3D, 0xF4, 0x29, 0x4C, 0xF8, + 0x92, 0x9E, 0xC4, 0x6B, 0x97, 0xCD, 0x16, 0x4D, 0xAB, 0xBC, 0x12, 0xED, + 0x32, 0x8C, 0xAA, 0x94, 0xEC, 0x3E, 0xF2, 0xEC, 0x24, 0x35, 0xD0, 0x97, + 0xC9, 0x1E, 0x4C, 0x57, 0xF3, 0xC5, 0x3D, 0xE9, 0x11, 0x6B, 0xB0, 0x66, + 0xB4, 0x45, 0xE4, 0x4C, 0xE3, 0x5C, 0xFA, 0x24, 0x0F, 0x70, 0x09, 0xB5, + 0xF5, 0x5B, 0x80, 0xBD, 0x0B, 0x14, 0xB4, 0xF5, 0x9B, 0x51, 0x10, 0x6D, + 0xB8, 0x29, 0x6F, 0x74, 0x89, 0x89, 0x0E, 0x26, 0x08, 0xBF, 0x3E, 0xC2, + 0xD5, 0x30, 0x1D, 0xAC, 0x33, 0x19, 0x10, 0x32, 0x5E, 0xCB, 0x9A, 0x50, + 0x52, 0xB4, 0x8F, 0xC8, 0xA1, 0x44, 0xB8, 0x2E, 0x8B, 0x0D, 0x67, 0x1E, + 0x8F, 0x31, 0x03, 0x99, 0x96, 0xB2, 0x76, 0xF2, 0xC7, 0xDF, 0xC3, 0x55, + 0x52, 0xE3, 0x17, 0xF1, 0xDF, 0x75, 0x60, 0xB0, 0x48, 0xF8, 0xC1, 0xDC, + 0xB2, 0xFC, 0x8A, 0x17, 0x6A, 0xED, 0x58, 0x33, 0x02, 0x24, 0x07, 0x86, + 0xD4, 0xC0, 0xD9, 0x96, 0x3E, 0x05, 0x10, 0x78, 0x5D, 0x69, 0x56, 0x7F, + 0x1D, 0x08, 0x20, 0x49, 0x6E, 0x4F, 0x2A, 0x0B, 0xE6, 0xFD, 0x1E, 0x32, + 0x08, 0x07, 0x62, 0xA7, 0x9C, 0xD5, 0x34, 0xF0, 0x37, 0x13, 0x8E, 0x43, + 0x10, 0x9D, 0xF9, 0x51, 0x38, 0xBB, 0x5F, 0x61, 0x0A, 0x18, 0xD4, 0xA4, + 0xFB, 0x60, 0x93, 0xED, 0x0A, 0x6F, 0x99, 0x89, 0xD6, 0x63, 0x5C, 0x15, + 0x6F, 0x93, 0xD8, 0xB1, 0xF2, 0x95, 0x11, 0xDE, 0x20, 0xA2, 0xEE, 0x1E, + 0x84, 0xDA, 0x3F, 0xF1, 0xE6, 0x10, 0xA4, 0xA8, 0x2F, 0xF1, 0x6E, 0x2A, + 0x07, 0x4D, 0x8D, 0xE6, 0x39, 0x96, 0x8A, 0xCC, 0x00, 0x33, 0x3F, 0x0C, + 0x77, 0x5F, 0x2A, 0x85, 0x25, 0x29, 0x1E, 0xF6, 0x65, 0x0F, 0x2D, 0x5E, + 0x05, 0xBF, 0x3C, 0x0E, 0x0A, 0x17, 0x98, 0xB8, 0xA4, 0x49, 0x28, 0xA9, + 0x3B, 0xED, 0xCE, 0xF3, 0x7E, 0xB6, 0x38, 0x66, 0x0A, 0x31, 0x42, 0xC7, + 0x2E, 0x40, 0x63, 0x16, 0xA7, 0x80, 0xE8, 0x19, 0x3A, 0x61, 0xC7, 0x84, + 0xBE, 0x89, 0x59, 0xD0, 0x23, 0xD9, 0xAA, 0x84, 0x2A, 0x26, 0x53, 0x32, + 0x0D, 0x6B, 0xBC, 0xBF, 0xAD, 0xE1, 0x03, 0x5F, 0x4A, 0xC7, 0x5F, 0x03, + 0x88, 0x0B, 0x8F, 0x7A, 0x53, 0xF8, 0xCC, 0x92, 0xAD, 0x57, 0x04, 0xD8, + 0xC9, 0x9F, 0x51, 0xB7, 0x9C, 0x6A, 0xAB, 0x45, 0x27, 0x0F, 0xC6, 0x21, + 0xBE, 0x01, 0x43, 0x8F, 0x0C, 0x54, 0xDD, 0xAF, 0xF6, 0xFB, 0x32, 0xA3, + 0x95, 0xCC, 0x09, 0xBC, 0x98, 0xAD, 0xEF, 0xA8, 0xC5, 0x3F, 0x47, 0xF7, + 0x46, 0xBF, 0x2C, 0xF6, 0x05, 0xFB, 0xC8, 0xE8, 0x56, 0x2C, 0x50, 0x89, + 0xDF, 0x14, 0x67, 0xE0, 0xD4, 0x41, 0x12, 0x82, 0xD1, 0x94, 0x75, 0x00, + 0x3E, 0xF9, 0x4F, 0xCB, 0x20, 0x9A, 0x62, 0x16, 0xB4, 0x50, 0xB6, 0x63, + 0x3A, 0x9C, 0x91, 0x3C, 0xBC, 0x0F, 0x6A, 0xB0, 0xE5, 0x2E, 0xD7, 0xEA, + 0xE7, 0x85, 0xA3, 0xD9, 0xB0, 0xAB, 0x8C, 0x83, 0x69, 0x62, 0x43, 0x56, + 0x1E, 0xDD, 0xA1, 0x55, 0x86, 0x7F, 0x1F, 0xCB, 0x1F, 0xA4, 0xF2, 0x57, + 0xCE, 0xB0, 0xA2, 0x1D, 0xFA, 0x17, 0x43, 0x46, 0xF7, 0xFD, 0xA3, 0x72, + 0xFC, 0x5C, 0xBC, 0x96, 0xA9, 0xB3, 0x39, 0xB9, 0x54, 0xD3, 0x75, 0x11, + 0x78, 0xAD, 0x05, 0x61, 0x0A, 0xB6, 0x7E, 0x94, 0xCB, 0x36, 0x2F, 0x00, + 0xEA, 0xCA, 0xEA, 0x5F, 0x09, 0xE8, 0xDF, 0x98, 0xA0, 0xFE, 0x8B, 0x9A, + 0xCB, 0x5E, 0xFC, 0x4E, 0xD8, 0x30, 0x91, 0x97, 0x95, 0x92, 0x9E, 0x55, + 0xAB, 0x45, 0x4A, 0x0F, 0xDD, 0xFF, 0x73, 0x4E, 0x0C, 0xC3, 0x62, 0x13, + 0x3A, 0xC9, 0xB5, 0xEF, 0x85, 0xD1, 0x4D, 0xB3, 0x7B, 0xD5, 0xA5, 0x33, + 0xAF, 0x9D, 0xBC, 0x47, 0xE3, 0x1E, 0xC8, 0x97, 0xF4, 0xAF, 0xE0, 0x96, + 0x82, 0x8D, 0x3E, 0xD9, 0xBE, 0x1E, 0xDB, 0x04, 0xA6, 0x38, 0xE7, 0x6F, + 0x8F, 0xC1, 0xC7, 0x67, 0x0F, 0x50, 0x42, 0xCE, 0x1F, 0x42, 0xCA, 0x2C, + 0x52, 0xA0, 0xEC, 0xB2, 0x02, 0x56, 0x37, 0x3B, 0x95, 0x70, 0x0F, 0x03, + 0x33, 0x61, 0xE7, 0xDD, 0x6A, 0x0A, 0x0A, 0x27, 0x8C, 0x0E, 0x18, 0xF0, + 0x39, 0x83, 0x87, 0x12, 0x18, 0x2B, 0x53, 0xF4, 0x41, 0x01, 0x52, 0xCF, + 0xC7, 0xBE, 0x4A, 0x1B, 0x3B, 0x77, 0xCD, 0xF2, 0xE1, 0x4D, 0xC5, 0x78, + 0x4E, 0x93, 0x9B, 0xBD, 0xD6, 0xFA, 0xBF, 0x60, 0x48, 0x76, 0x19, 0x3F, + 0x22, 0xAB, 0xA8, 0x84, 0xA0, 0xA7, 0x9E, 0x40, 0xE3, 0xA4, 0x86, 0xF1, + 0x4F, 0x35, 0x7F, 0xE9, 0xAD, 0x6F, 0x43, 0x62, 0x4E, 0x9B, 0x91, 0xD7, + 0x3B, 0x6C, 0x1A, 0x51, 0x67, 0xDB, 0x18, 0x51, 0x9C, 0x8E, 0xB0, 0xB2, + 0xE2, 0x45, 0xB5, 0x48, 0x11, 0x03, 0x5C, 0xF3, 0x3A, 0xCD, 0x43, 0x14, + 0x40, 0xFC, 0x72, 0x8E, 0x44, 0xF0, 0xE6, 0xF7, 0x69, 0xD3, 0xC2, 0xF9, + 0x5A, 0xC7, 0x68, 0xB3, 0xA0, 0x74, 0x94, 0x12, 0xEA, 0x5F, 0xF4, 0x93, + 0x2A, 0x9B, 0x71, 0xF5, 0x19, 0x87, 0x98, 0xC2, 0x04, 0xC0, 0x52, 0xC7, + 0x2C, 0x26, 0xC1, 0x93, 0xDD, 0xB1, 0xB2, 0xA8, 0x68, 0xF7, 0xE3, 0xCE, + 0x20, 0x8E, 0x02, 0xBF, 0x05, 0x08, 0xBD, 0x53, 0xD1, 0x31, 0x30, 0xD7, + 0xF2, 0x7B, 0x15, 0xCB, 0x10, 0x47, 0x7B, 0x66, 0xEE, 0x63, 0x44, 0x21, + 0xAD, 0xD7, 0xDC, 0xD9, 0x61, 0xCB, 0xC7, 0x71, 0x87, 0x06, 0xEB, 0xE0, + 0x6B, 0x7D, 0x4E, 0x01, 0x05, 0x0A, 0xDC, 0x8F, 0xF0, 0x40, 0xA7, 0xDF, + 0x18, 0xD6, 0x71, 0x2C, 0x2E, 0x81, 0x05, 0x95, 0x48, 0x26, 0x52, 0xBB, + 0x9F, 0x7D, 0xD0, 0x51, 0x28, 0xA5, 0x7F, 0x9F, 0xC5, 0x38, 0x39, 0x3A, + 0xDE, 0x1E, 0x53, 0x2F, 0x08, 0x19, 0xE0, 0x56, 0x83, 0x28, 0xB2, 0x5C, + 0xB4, 0xEF, 0x35, 0x90, 0xE0, 0xE0, 0x54, 0xCC, 0xE6, 0xA7, 0xB4, 0x83, + 0x5E, 0xC0, 0xC4, 0xBE, 0x46, 0x33, 0x14, 0xB1, 0x09, 0xBB, 0xD2, 0xB3, + 0xDB, 0xE9, 0xAC, 0x62, 0xEF, 0x52, 0x42, 0x82, 0x5D, 0x99, 0x8E, 0xFD, + 0x28, 0xA8, 0xB6, 0xAA, 0xC6, 0x68, 0x58, 0xDF, 0x87, 0x10, 0x32, 0xD9, + 0xB1, 0xA7, 0x49, 0x76, 0x2D, 0x40, 0xDD, 0x6D, 0xB3, 0x67, 0x4C, 0x59, + 0xC4, 0x5C, 0x66, 0x74, 0xBE, 0x13, 0xC5, 0x19, 0x92, 0x23, 0x3F, 0x81, + 0x74, 0xB1, 0x9A, 0x65, 0x5D, 0xDD, 0x24, 0x7E, 0x6F, 0x3B, 0xF1, 0x45, + 0x56, 0x9D, 0x66, 0xB2, 0x8B, 0xD6, 0x89, 0xE3, 0xF7, 0xD7, 0xDD, 0x44, + 0x6F, 0x41, 0x52, 0x43, 0x66, 0xE0, 0xB1, 0x18, 0x37, 0xFE, 0xE4, 0x95, + 0x26, 0x71, 0x29, 0x7D, 0xC5, 0x7A, 0x4A, 0x6B, 0xB0, 0xB1, 0x3B, 0xF2, + 0xFA, 0x67, 0x1D, 0x57, 0xBE, 0x51, 0xF0, 0x76, 0x37, 0x45, 0x65, 0xF3, + 0x30, 0x75, 0x0C, 0x26, 0xD5, 0x6E, 0x7A, 0xBD, 0xB5, 0x31, 0xE7, 0x30, + 0x14, 0x50, 0x64, 0xB8, 0x3C, 0x89, 0x43, 0xF1, 0x32, 0x7C, 0x45, 0xE3, + 0xD8, 0x52, 0xF2, 0x00, 0xD4, 0x8D, 0x76, 0xD4, 0xE6, 0x4C, 0x6D, 0x98, + 0x7D, 0x56, 0x37, 0x15, 0x1B, 0x0F, 0x75, 0x66, 0x88, 0x29, 0xDF, 0xFB, + 0xBF, 0x99, 0x51, 0x46, 0xDA, 0x20, 0xB4, 0xD1, 0xB8, 0x0D, 0xE1, 0xA8, + 0x82, 0x2C, 0x69, 0x7C, 0x93, 0xE7, 0x51, 0x3E, 0x0F, 0x25, 0xDE, 0x25, + 0x2F, 0x8D, 0x28, 0x4C, 0xAF, 0x35, 0x4F, 0x1C, 0x6B, 0x4B, 0x43, 0xC9, + 0x82, 0xAA, 0x5C, 0x31, 0xF6, 0x4D, 0x9F, 0x3B, 0x17, 0x25, 0x21, 0x0D, + 0xE4, 0x81, 0x49, 0xD3, 0x02, 0xED, 0xEE, 0x73, 0xCD, 0x54, 0xBD, 0xF1, + 0x0E, 0x31, 0x5E, 0x49, 0x13, 0xFE, 0xAA, 0xFF, 0x5D, 0x77, 0x65, 0x3D, + 0x9A, 0x62, 0xDE, 0x52, 0x4F, 0x4E, 0x5C, 0xA6, 0xA2, 0xEA, 0xA0, 0x85, + 0x69, 0x6F, 0x64, 0x30, 0x71, 0xD7, 0xE0, 0x5F, 0xF0, 0xDF, 0xB7, 0xFC, + 0x93, 0x08, 0xDA, 0x58, 0xAA, 0x53, 0x10, 0x3E, 0x2F, 0x47, 0x48, 0x11, + 0xC7, 0x02, 0xB1, 0xB0, 0x25, 0x46, 0x83, 0x88, 0x5D, 0xF8, 0xBB, 0x43, + 0x00, 0x91, 0x84, 0x8E, 0x80, 0xF1, 0xE8, 0xE8, 0x90, 0xE4, 0xC8, 0x4A, + 0x11, 0xA0, 0x92, 0xAA, 0x7E, 0xA5, 0xCA, 0xA7, 0xB6, 0x22, 0x9A, 0xB1, + 0x55, 0x8E, 0x6D, 0xE5, 0x47, 0xD6, 0x2E, 0x58, 0x42, 0xCB, 0xC4, 0x19, + 0xB5, 0xFF, 0xAB, 0xB1, 0x8F, 0x2A, 0x81, 0x94, 0x19, 0x91, 0xDA, 0x3A, + 0x3C, 0xBB, 0x74, 0x8E, 0x84, 0x07, 0xD3, 0x3B, 0x6A, 0x5E, 0xD0, 0x4D, + 0xD1, 0xA0, 0xD6, 0x5B, 0x32, 0x7F, 0x92, 0xCC, 0x5E, 0xDF, 0xCE, 0x88, + 0xCD, 0x2B, 0x6A, 0x4B, 0x3D, 0x68, 0x75, 0x7A, 0xB0, 0xF1, 0x36, 0x1B, + 0xCA, 0x96, 0xFB, 0xE3, 0x77, 0x9B, 0x38, 0x83, 0x2E, 0xDD, 0x4C, 0x53, + 0x35, 0x85, 0xC2, 0xE3, 0xCF, 0xA2, 0xF3, 0x85, 0x44, 0xA1, 0xB2, 0x9B, + 0x0F, 0xE9, 0x2A, 0x82, 0xD5, 0xB3, 0xC3, 0xF1, 0x2B, 0xE8, 0x1B, 0x2C, + 0xFF, 0x7D, 0x3C, 0xC9, 0x24, 0x24, 0x35, 0xC8, 0x43, 0x10, 0x2A, 0x92, + 0x53, 0x29, 0x1D, 0x71, 0xB8, 0xFD, 0x7E, 0x18, 0x9B, 0xBA, 0x5F, 0x43, + 0x9F, 0x8C, 0x35, 0xB6, 0x0D, 0x93, 0xC1, 0xA7, 0xB9, 0x2A, 0x05, 0xEB, + 0x59, 0xB4, 0xA1, 0x94, 0x6C, 0x8B, 0xD3, 0x82, 0xD3, 0xFF, 0xA7, 0x36, + 0x8C, 0x79, 0x8D, 0xB9, 0x11, 0x04, 0x78, 0x49, 0xA8, 0xBE, 0x76, 0x7C, + 0xAE, 0x9C, 0xD8, 0x26, 0x4C, 0x12, 0x07, 0x45, 0xE3, 0x39, 0x7A, 0xED, + 0xFD, 0x1E, 0xC1, 0xC2, 0xBB, 0x90, 0xB2, 0xA7, 0x7A, 0xDC, 0x65, 0x4E, + 0x99, 0x73, 0x80, 0xF8, 0x9B, 0x6F, 0x93, 0x76, 0x18, 0x7D, 0x69, 0x75, + 0xA9, 0xB0, 0x42, 0xD9, 0xEB, 0x21, 0xF5, 0x0B, 0x33, 0x47, 0xDD, 0xB4, + 0xC1, 0x36, 0xDA, 0x6B, 0x82, 0xE1, 0x5B, 0x21, 0xA1, 0xB7, 0x8A, 0x29, + 0x73, 0x64, 0x06, 0xC9, 0x0A, 0x67, 0x82, 0xCD, 0xD2, 0xC9, 0x5C, 0x62, + 0x75, 0x03, 0x1A, 0xD7, 0x32, 0xFE, 0x84, 0x4E, 0xB6, 0xCF, 0x97, 0x0D, + 0x6C, 0x12, 0x0A, 0x57, 0xC3, 0xF2, 0x87, 0x6C, 0x1D, 0x05, 0x39, 0x0C, + 0xC9, 0xDB, 0xA8, 0xE5, 0x2E, 0x6A, 0xE0, 0xAB, 0xD1, 0x1C, 0xCC, 0x16, + 0xFE, 0xB7, 0x49, 0x3C, 0xC0, 0xCB, 0x43, 0x63, 0x74, 0x89, 0xD8, 0xB6, + 0xC0, 0x69, 0x80, 0xF4, 0x8E, 0x84, 0xE0, 0x10, 0x61, 0x3E, 0xF4, 0x04, + 0xB5, 0x04, 0x37, 0xA4, 0x23, 0x33, 0xD8, 0x3C, 0x35, 0x26, 0xC9, 0xF6, + 0x06, 0x85, 0x5B, 0xC2, 0x8F, 0x53, 0xBA, 0x46, 0xDE, 0x4C, 0x7A, 0xCD, + 0x8F, 0xF9, 0x31, 0x8A, 0x21, 0xD9, 0xDF, 0x0C, 0x2A, 0xC4, 0xF0, 0x1F, + 0xF1, 0x37, 0xD1, 0x1F, 0xA5, 0x21, 0x27, 0xE8, 0x2B, 0xA6, 0xB6, 0x89, + 0x34, 0xF4, 0xF3, 0x7C, 0x24, 0x0E, 0xA6, 0xDB, 0xB3, 0x9D, 0x60, 0x29, + 0x3A, 0xC7, 0xD6, 0xAE, 0xE7, 0x95, 0xBF, 0x30, 0x11, 0xA4, 0x77, 0xCC, + 0x7C, 0xE7, 0x96, 0x7E, 0xAC, 0xFC, 0xFA, 0xFD, 0x41, 0xAA, 0x0C, 0x6C, + 0x53, 0x56, 0xB6, 0x55, 0x7E, 0xC3, 0xB4, 0x82, 0x4B, 0xC0, 0x4A, 0xFE, + 0xF7, 0x5F, 0xD1, 0xAB, 0xD8, 0x89, 0x00, 0x44, 0xAA, 0xB1, 0x62, 0xEF, + 0xD6, 0x7F, 0x1B, 0x7B, 0x22, 0x48, 0xEA, 0x00, 0x53, 0x49, 0xA7, 0xCD, + 0xA6, 0x7B, 0x61, 0xE3, 0xDD, 0xFC, 0xBF, 0xB7, 0xB0, 0xCB, 0xAE, 0xAC, + 0xDE, 0x9B, 0x98, 0xC8, 0x86, 0x7C, 0xB2, 0xFB, 0xED, 0x75, 0xA4, 0x30, + 0xBF, 0x8A, 0x52, 0x95, 0x7E, 0xCF, 0x4B, 0x28, 0xF2, 0xA2, 0x2F, 0xB9, + 0xA2, 0x24, 0x93, 0xA3, 0x84, 0xCB, 0x2C, 0xC0, 0x7D, 0x2F, 0x6E, 0x35, + 0x33, 0x1B, 0x0F, 0x6E, 0xFF, 0x32, 0x92, 0x09, 0x17, 0x31, 0xE4, 0xFC, + 0x2C, 0x6A, 0x93, 0x1B, 0xFA, 0xA4, 0x87, 0x04, 0x9D, 0x1E, 0xCC, 0xC1, + 0xD4, 0x40, 0x83, 0x21, 0xB3, 0x5F, 0x3F, 0x68, 0x9C, 0x37, 0x68, 0x47, + 0x6A, 0x21, 0x98, 0xBC, 0x95, 0x50, 0xBE, 0xF7, 0xD4, 0x72, 0x20, 0x70, + 0x12, 0x4F, 0xCB, 0x77, 0xBF, 0x68, 0x5A, 0xCE, 0xB5, 0x13, 0xC6, 0x25, + 0x30, 0x75, 0xA4, 0xF6, 0xE9, 0xDC, 0xF5, 0xC2, 0xB0, 0x57, 0x55, 0xC3, + 0x69, 0xE5, 0xF1, 0xB9, 0xAE, 0x55, 0x69, 0x56, 0x5A, 0xBC, 0xCE, 0x0F, + 0x11, 0x32, 0x2A, 0xE9, 0x7E, 0x40, 0x40, 0xCC, 0xDD, 0x04, 0x62, 0x8B, + 0x3B, 0x57, 0xE5, 0x45, 0xCB, 0xEE, 0xF0, 0x3D, 0x6A, 0xAC, 0xDD, 0x83, + 0x7C, 0x2F, 0x66, 0x9A, 0x6C, 0x3B, 0xD1, 0x80, 0x85, 0xE6, 0xE7, 0xEA, + 0xE0, 0x89, 0x19, 0x0E, 0x5A, 0xDE, 0x7E, 0x8F, 0x6C, 0x05, 0xB3, 0xA5, + 0x89, 0x08, 0x45, 0x60, 0xA5, 0xE0, 0xB8, 0xD1, 0x7D, 0x45, 0xB6, 0x23, + 0x19, 0x84, 0x6A, 0xC2, 0x33, 0xD2, 0xD8, 0x9A, 0x87, 0xD0, 0xF4, 0xED, + 0x06, 0x11, 0x08, 0xF1, 0xF2, 0x92, 0xA5, 0x4D, 0xF6, 0xE7, 0xBF, 0x8E, + 0x3D, 0x01, 0x60, 0x50, 0xC0, 0x4F, 0xBB, 0x37, 0xAA, 0x8E, 0xE4, 0x81, + 0x9F, 0xBD, 0xDD, 0xA0, 0xA1, 0x00, 0xD8, 0x5C, 0x55, 0xB0, 0xCF, 0x39, + 0xEF, 0xA0, 0xE1, 0x4F, 0xA7, 0x5D, 0x46, 0x85, 0x11, 0x98, 0x8F, 0x9E, + 0xEB, 0x16, 0x0D, 0xF7, 0x0F, 0xEE, 0x9F, 0xBD, 0x22, 0x87, 0x0B, 0x10, + 0x0B, 0x9E, 0x4D, 0xC1, 0x5F, 0x82, 0xFA, 0xED, 0xCC, 0xAC, 0xB4, 0x62, + 0xCA, 0x57, 0x8B, 0xE7, 0x60, 0x5B, 0xCF, 0x9B, 0x78, 0xFB, 0x8D, 0x10, + 0xCD, 0x33, 0x68, 0x19, 0x25, 0x00, 0xCB, 0xD1, 0x13, 0xB4, 0xA3, 0x21, + 0x07, 0x5C, 0xED, 0xC5, 0xBB, 0xFA, 0x60, 0x8C, 0xB7, 0xD4, 0x41, 0x39, + 0x2D, 0x9E, 0x69, 0x3E, 0xC8, 0x25, 0x34, 0xA4, 0x5B, 0x52, 0xB3, 0xBD, + 0x33, 0xC9, 0x74, 0x7B, 0x7D, 0x46, 0x61, 0x9D, 0x9F, 0x28, 0xBC, 0xE6, + 0x53, 0xD3, 0xEA, 0x5E, 0xEF, 0xE3, 0x2E, 0xE8, 0x76, 0x68, 0x75, 0x80, + 0x98, 0x78, 0x9F, 0x20, 0xF8, 0x50, 0xB7, 0xA1, 0x88, 0x0C, 0x0B, 0xD6, + 0xF4, 0x84, 0x7C, 0xA5, 0x7D, 0xEE, 0xBB, 0xD6, 0x47, 0x30, 0x89, 0x5C, + 0xF6, 0xF3, 0x9F, 0x83, 0x56, 0xB5, 0x47, 0xCD, 0x9F, 0xD6, 0x50, 0x7A, + 0xD2, 0xE5, 0x3C, 0x36, 0x36, 0xBE, 0xBB, 0xAD, 0xB5, 0xDE, 0x92, 0x9F, + 0xAF, 0x06, 0x5E, 0x3E, 0x36, 0xB9, 0xC2, 0x53, 0xCA, 0x35, 0x21, 0x3E, + 0x4F, 0x83, 0x4C, 0x6B, 0x5E, 0x80, 0x98, 0x05, 0x49, 0xE7, 0x17, 0xC6, + 0x6E, 0x29, 0x41, 0xF1, 0x51, 0xB6, 0xDF, 0x97, 0x9C, 0x37, 0xEB, 0xD1, + 0x28, 0x57, 0xDD, 0xD5, 0x64, 0x93, 0x31, 0x80, 0x67, 0x67, 0x4B, 0xF3, + 0x08, 0x38, 0x6D, 0x8A, 0x0D, 0x50, 0x5D, 0x22, 0x03, 0xF2, 0x5F, 0x79, + 0x98, 0x87, 0x2D, 0x2D, 0x32, 0x91, 0xD9, 0x7C, 0x07, 0x8B, 0xA5, 0x83, + 0xC0, 0x89, 0xE1, 0x9D, 0x78, 0xF5, 0xB8, 0x88, 0x5F, 0xF6, 0x5C, 0x35, + 0x13, 0x2B, 0x07, 0xEA, 0xAB, 0xED, 0x98, 0x1D, 0xC2, 0x51, 0x56, 0x41, + 0x90, 0xA3, 0x0D, 0xB5, 0x96, 0xCB, 0x34, 0x1C, 0x6E, 0x43, 0x8F, 0xBF, + 0xB5, 0x6F, 0x5D, 0x5E, 0x94, 0x99, 0xC1, 0xD9, 0x12, 0x0F, 0x1D, 0x1E, + 0x16, 0x01, 0xA7, 0x71, 0xB1, 0xF5, 0x49, 0xE3, 0x77, 0x3D, 0x02, 0xCF, + 0xE2, 0x7C, 0x96, 0x77, 0x8B, 0xA8, 0x01, 0xFD, 0xC0, 0xB5, 0x58, 0x6E, + 0xA2, 0x57, 0xFF, 0x31, 0x20, 0x5D, 0x90, 0x59, 0x55, 0x42, 0xB5, 0x5E, + 0x8F, 0x4C, 0x23, 0x55, 0x23, 0x21, 0x4A, 0x79, 0x30, 0x9C, 0xF8, 0xB8, + 0xD4, 0x5F, 0x23, 0x66, 0xF4, 0x01, 0x96, 0x43, 0xF8, 0x2A, 0x20, 0xFD, + 0x04, 0x7E, 0xE4, 0xC3, 0x4B, 0xC3, 0x57, 0x85, 0x61, 0x15, 0x44, 0x7D, + 0x8B, 0xDC, 0x29, 0xA4, 0xDB, 0xE6, 0x2D, 0xCC, 0x3E, 0x12, 0x03, 0xEB, + 0xC3, 0xB9, 0xDC, 0xE0, 0x13, 0x74, 0x41, 0x2B, 0xF6, 0xEF, 0x67, 0xDD, + 0x1D, 0xEE, 0x8B, 0x07, 0x30, 0x68, 0xF8, 0x56, 0x64, 0x2B, 0x4E, 0xB1, + 0x19, 0xE3, 0xE7, 0xBE, 0x72, 0xD9, 0x50, 0x69, 0x3C, 0x21, 0xDA, 0xEE, + 0x63, 0x89, 0x5D, 0xB3, 0x79, 0xD8, 0xEF, 0x26, 0xE2, 0x1F, 0x66, 0x17, + 0x4C, 0x70, 0xCF, 0xDF, 0xC0, 0x9F, 0xE9, 0x8F, 0xA2, 0x88, 0xDB, 0xD2, + 0x7F, 0xDF, 0x32, 0xEA, 0xEF, 0x83, 0x4F, 0xC3, 0x6F, 0x7F, 0x0D, 0x4F, + 0x63, 0x00, 0xBA, 0xDD, 0x60, 0x37, 0x21, 0x02, 0xAF, 0x99, 0xE6, 0xDC, + 0x12, 0xF5, 0x4F, 0xCE, 0x9A, 0xC2, 0x19, 0xB9, 0xB2, 0x9E, 0x87, 0x83, + 0xA8, 0x06, 0x56, 0x7D, 0xB7, 0x7F, 0x73, 0x38, 0xDC, 0xE9, 0xC7, 0x75, + 0x63, 0xCA, 0x3C, 0x07, 0x06, 0x6A, 0x9E, 0x97, 0x14, 0x2E, 0xED, 0x40, + 0x58, 0x3D, 0x9F, 0x52, 0x8F, 0x52, 0x40, 0x3A, 0x2A, 0xBB, 0x3B, 0xE1, + 0x8B, 0xEA, 0xD4, 0xCD, 0xC0, 0xE9, 0x68, 0x15, 0x53, 0x93, 0x59, 0xC1, + 0x3A, 0x50, 0xD6, 0x98, 0xF5, 0x4E, 0xBC, 0x87, 0x3E, 0x3A, 0x2E, 0xB0, + 0x03, 0x88, 0x40, 0x5B, 0x6A, 0x9B, 0x6D, 0x3D, 0xCB, 0x6C, 0x1B, 0x0A, + 0xAA, 0x7F, 0xBC, 0xE1, 0x56, 0xF0, 0x62, 0x09, 0xC4, 0x04, 0xFB, 0xE2, + 0x61, 0xAA, 0xDE, 0x73, 0xF3, 0x37, 0xA9, 0x49, 0x98, 0x29, 0x05, 0x67, + 0x7C, 0xB8, 0x78, 0xFE, 0xD6, 0xF8, 0xBF, 0x59, 0xD4, 0xF5, 0x20, 0x37, + 0xCC, 0x4C, 0x5A, 0xC5, 0x26, 0x17, 0x34, 0x8D, 0xB0, 0x30, 0x79, 0x92, + 0x64, 0xAD, 0xFB, 0x6D, 0x73, 0xD9, 0xD2, 0x5D, 0x4C, 0x52, 0x86, 0xB2, + 0x4A, 0xE5, 0xDE, 0xF0, 0x58, 0x72, 0xE5, 0xB5, 0xC3, 0x83, 0xD4, 0xFC, + 0x7E, 0x2F, 0x2D, 0xAD, 0x90, 0x36, 0xCC, 0xD6, 0x49, 0x93, 0xFE, 0xA0, + 0x7A, 0xED, 0x8B, 0x85, 0x73, 0x65, 0x1A, 0xAD, 0xB2, 0xD5, 0xA1, 0x86, + 0x8A, 0x43, 0x81, 0xD9, 0x4F, 0xA0, 0x09, 0x4B, 0xBF, 0x2C, 0xBB, 0x12, + 0x5C, 0xFF, 0xB6, 0x56, 0x26, 0x83, 0x98, 0x7A, 0x31, 0x10, 0x72, 0x8F, + 0x4F, 0x38, 0x75, 0xA4, 0x5D, 0xC3, 0x49, 0x88, 0x0B, 0x15, 0x86, 0x2D, + 0x30, 0x2F, 0x8B, 0xAD, 0xC2, 0x5B, 0xBE, 0xC7, 0x79, 0x04, 0x6A, 0x36, + 0x2F, 0xD8, 0x27, 0xE2, 0xD9, 0x58, 0x2A, 0x0A, 0xA2, 0x14, 0xCB, 0x59, + 0x0F, 0xDC, 0x3C, 0x7D, 0x57, 0x0F, 0x47, 0x53, 0x1E, 0x3E, 0x99, 0x6E, + 0xF6, 0x3B, 0xE8, 0xCF, 0xE3, 0x13, 0x57, 0x14, 0xF5, 0x7C, 0x2F, 0x8B, + 0xD8, 0x83, 0x3B, 0x1A, 0x7D, 0x15, 0x0A, 0x8A, 0x67, 0x0F, 0x18, 0x21, + 0x09, 0x8E, 0xE7, 0x4E, 0xC2, 0x66, 0xF9, 0x53, 0x82, 0x24, 0x58, 0xF8, + 0x3E, 0x41, 0x34, 0x71, 0x8E, 0x99, 0x87, 0x27, 0xB9, 0x1F, 0x8A, 0xAD, + 0x56, 0x56, 0x2D, 0x49, 0x00, 0xA4, 0xB2, 0x89, 0xFB, 0x8F, 0x50, 0x11, + 0xEB, 0x17, 0x6A, 0x51, 0x39, 0xD0, 0x23, 0x1F, 0x76, 0xD6, 0xF8, 0x41, + 0x5B, 0x09, 0xDF, 0xEA, 0x8B, 0x4E, 0x86, 0x56, 0x12, 0x56, 0x99, 0x8D, + 0x1D, 0xC2, 0x15, 0x7C, 0x3C, 0x27, 0xAB, 0x6A, 0x48, 0x5A, 0x14, 0x25, + 0x1E, 0x69, 0x91, 0x03, 0x26, 0xF3, 0x87, 0xA5, 0x66, 0x14, 0x9E, 0xEA, + 0x78, 0xC7, 0xEC, 0x9B, 0x0A, 0x40, 0x56, 0x94, 0x78, 0x5A, 0x9D, 0x99, + 0xAD, 0xD3, 0xFB, 0xC9, 0x5D, 0xCE, 0x05, 0xAC, 0x6E, 0x95, 0x57, 0x6C, + 0x4E, 0x04, 0xB5, 0xE4, 0x3B, 0xEF, 0x82, 0x70, 0x1B, 0xC4, 0x38, 0x63, + 0x0C, 0x66, 0x47, 0xB9, 0xDF, 0x4B, 0xF5, 0xB1, 0xAC, 0xB9, 0xB2, 0xB5, + 0xF1, 0xF2, 0xE0, 0x67, 0x39, 0x62, 0x1C, 0x0A, 0x4F, 0x10, 0xFA, 0xDA, + 0xEC, 0x5A, 0xBD, 0x55, 0x82, 0xB9, 0x5F, 0xB9, 0x1C, 0x7B, 0xC3, 0x88, + 0x7F, 0xB6, 0x4A, 0x41, 0xA2, 0x02, 0xF2, 0x3E, 0xE0, 0x0F, 0x1C, 0xD6, + 0xC9, 0xB5, 0x6F, 0xFB, 0xD7, 0x16, 0x49, 0xB2, 0x14, 0xC9, 0x2C, 0x2B, + 0xC6, 0x45, 0x19, 0x84, 0x17, 0x87, 0xE1, 0xDC, 0x49, 0x48, 0x0B, 0x65, + 0x47, 0x2B, 0xFE, 0x7C, 0x75, 0x30, 0xFA, 0xB9, 0x40, 0x1C, 0xC2, 0xA2, + 0x10, 0x43, 0xDE, 0x5E, 0xF1, 0x4D, 0xCE, 0x56, 0xA9, 0x59, 0x5C, 0x7C, + 0x37, 0x9A, 0x17, 0x8A, 0xEA, 0x2D, 0xFF, 0x32, 0xF7, 0xB7, 0x01, 0xEE, + 0xB6, 0xC6, 0xA1, 0xD7, 0xBB, 0x79, 0x88, 0x2B, 0xC6, 0x52, 0x7E, 0xCD, + 0x75, 0x19, 0x88, 0xAB, 0x51, 0x67, 0xFC, 0x5C, 0x11, 0x79, 0x49, 0x66, + 0xE8, 0xE6, 0x48, 0x6B, 0x79, 0x0E, 0x35, 0x93, 0x1E, 0xD4, 0x1E, 0xD7, + 0xC8, 0x7A, 0xCE, 0x24, 0xF5, 0x01, 0x69, 0x16, 0xC1, 0xFB, 0x8B, 0x36, + 0x9E, 0x4F, 0x42, 0x0D, 0x7C, 0xB5, 0x8E, 0xDA, 0x2A, 0x07, 0x7D, 0xFF, + 0xB3, 0x19, 0xB6, 0x33, 0xF4, 0x2B, 0x25, 0xED, 0x7E, 0x21, 0xA2, 0x9A, + 0x26, 0x0E, 0x0A, 0xE0, 0x98, 0x1F, 0xAD, 0x79, 0xA6, 0x4C, 0xF6, 0x2D, + 0xD1, 0xE2, 0x2C, 0x4B, 0xEA, 0xAB, 0x5E, 0xEB, 0x9E, 0xB0, 0xF4, 0xB5, + 0xFC, 0xCC, 0x68, 0xFF, 0x35, 0x1D, 0xBF, 0xEE, 0x3B, 0x22, 0xC1, 0x95, + 0x4C, 0x39, 0x55, 0xE8, 0xEA, 0x80, 0xD4, 0x9E, 0x9C, 0x8D, 0xFF, 0x22, + 0x60, 0xC6, 0x56, 0x96, 0x86, 0x47, 0x3C, 0xA5, 0xB8, 0xD5, 0x35, 0x97, + 0xF7, 0x35, 0xC7, 0x08, 0x47, 0xE1, 0xAD, 0xC5, 0x28, 0x54, 0xCE, 0xF3, + 0xA9, 0x6A, 0x08, 0x38, 0xE9, 0x42, 0x6A, 0x2E, 0xC5, 0xC0, 0xA0, 0xA4, + 0x62, 0x7D, 0xE0, 0x6F, 0x56, 0x25, 0xEE, 0x90, 0xD9, 0x17, 0x05, 0x1A, + 0x0C, 0xAB, 0xD3, 0xD2, 0xBA, 0xDE, 0xAB, 0xBA, 0x8F, 0x85, 0x3E, 0xAF, + 0x2E, 0xA1, 0x53, 0x02, 0x8A, 0x55, 0x91, 0x88, 0xB8, 0x92, 0x3E, 0x11, + 0xEF, 0xB4, 0x2B, 0x81, 0xE3, 0xCD, 0x0D, 0xEB, 0xC2, 0x5E, 0x34, 0xCB, + 0x27, 0x56, 0x79, 0x69, 0xD8, 0x3A, 0xC3, 0x91, 0x94, 0x47, 0xE9, 0xFC, + 0x98, 0xA6, 0x74, 0x7E, 0xBE, 0x8D, 0x09, 0xB6, 0x5C, 0x46, 0xA4, 0xD1, + 0x7B, 0xF8, 0x78, 0x33, 0x88, 0xEF, 0xD6, 0x56, 0x66, 0x8B, 0x27, 0xB3, + 0x55, 0x27, 0xCB, 0xF5, 0xD1, 0x25, 0x15, 0x97, 0x70, 0x13, 0x09, 0x72, + 0xEB, 0xE1, 0xD3, 0xF9, 0x89, 0x75, 0x27, 0xF5, 0xA3, 0xA3, 0x00, 0xD6, + 0x11, 0x1B, 0x09, 0xF9, 0xB9, 0x0B, 0x8C, 0xBA, 0x40, 0xC0, 0x3F, 0x87, + 0xCF, 0xC5, 0xAB, 0xB0, 0x50, 0x99, 0x72, 0x5E, 0xF6, 0x73, 0x48, 0xE8, + 0x0B, 0x4C, 0xDE, 0x49, 0xC0, 0xD7, 0x73, 0x21, 0x21, 0x2C, 0x22, 0x4D, + 0x9D, 0xF9, 0x48, 0xA0, 0x84, 0x1B, 0xCC, 0x34, 0x2F, 0x1C, 0x58, 0x7E, + 0xC4, 0x75, 0xB5, 0x75, 0x28, 0xBC, 0xF8, 0x9C, 0x5D, 0xEA, 0x3C, 0x94, + 0xF3, 0x5F, 0x0A, 0x90, 0x4C, 0x64, 0xE4, 0xC2, 0x70, 0x69, 0x79, 0xC4, + 0x28, 0xDF, 0x94, 0x10, 0x43, 0x6F, 0xAD, 0x9A, 0xCC, 0xF3, 0x74, 0x28, + 0xBA, 0xDB, 0x8F, 0xE5, 0x5D, 0x1F, 0x2D, 0xDB, 0x0A, 0x99, 0x36, 0xA4, + 0x50, 0x93, 0x53, 0xAC, 0x37, 0x71, 0x59, 0x64, 0xFC, 0xD1, 0x89, 0x4F, + 0x9E, 0x3A, 0xDC, 0x2C, 0xBB, 0x78, 0x1F, 0x19, 0x63, 0xD7, 0xB2, 0x55, + 0xF8, 0x96, 0xFC, 0x19, 0xA6, 0x46, 0xC5, 0xFB, 0xCC, 0x69, 0x97, 0xD4, + 0x08, 0x3F, 0xD3, 0xB7, 0x27, 0xD0, 0x52, 0x48, 0x0D, 0x42, 0xE3, 0x49, + 0xFE, 0xDE, 0x4C, 0x04, 0x3F, 0x81, 0x48, 0x44, 0x88, 0x29, 0x38, 0x11, + 0x2A, 0x1F, 0x2B, 0x33, 0x13, 0x0F, 0x0F, 0x44, 0xAC, 0xEB, 0xBA, 0xE1, + 0x83, 0x15, 0x83, 0x52, 0x50, 0xD2, 0x80, 0x28, 0xED, 0x76, 0xE3, 0x59, + 0xC8, 0xC1, 0x8C, 0x41, 0x22, 0xBC, 0xD9, 0x5F, 0x50, 0x40, 0xFF, 0x5F, + 0x66, 0x69, 0x1B, 0xD5, 0x47, 0x76, 0x44, 0xC0, 0x85, 0xB5, 0x55, 0x70, + 0x13, 0xAC, 0xEE, 0x11, 0x61, 0xAC, 0xFE, 0x1A, 0xA7, 0x43, 0xA9, 0x6D, + 0xB7, 0x94, 0x50, 0x81, 0x8D, 0xBE, 0xCC, 0xCE, 0xED, 0x62, 0xC4, 0x1B, + 0x97, 0xFD, 0x10, 0x14, 0xE6, 0x0E, 0x11, 0x16, 0x95, 0x6A, 0x5E, 0x0F, + 0x87, 0x88, 0x72, 0xA7, 0x32, 0x9A, 0x05, 0xA2, 0xC0, 0xD3, 0x23, 0x0C, + 0xC0, 0x34, 0x93, 0x80, 0x51, 0x40, 0x9A, 0x25, 0x4D, 0x5D, 0x70, 0x87, + 0x4C, 0xCE, 0x45, 0xE2, 0x2D, 0x42, 0x5A, 0x36, 0x5A, 0x2A, 0x69, 0xF2, + 0x81, 0xA0, 0x90, 0xFF, 0xEB, 0xB5, 0x5A, 0x6B, 0xB5, 0x9F, 0x15, 0x6A, + 0x0A, 0x39, 0xF0, 0x3A, 0x3F, 0xA7, 0x8F, 0xF5, 0x1B, 0x81, 0xA9, 0x7F, + 0xDF, 0x49, 0xEA, 0xC3, 0x6B, 0xC5, 0xC3, 0x23, 0xE5, 0x08, 0x8D, 0xFC, + 0xDE, 0x55, 0xEA, 0x65, 0xBE, 0x6E, 0x19, 0xB5, 0xAC, 0xD1, 0xE3, 0xC8, + 0x70, 0x41, 0x40, 0x29, 0xCC, 0xE1, 0xEA, 0x47, 0xC9, 0xB4, 0xB4, 0x86, + 0x4C, 0xCC, 0x50, 0x54, 0x46, 0xC1, 0x5A, 0xC0, 0x23, 0xEE, 0xF0, 0x4E, + 0x7C, 0xEA, 0x5C, 0x22, 0x3D, 0x6E, 0x0C, 0xA2, 0x34, 0x11, 0x69, 0x89, + 0x5A, 0x95, 0xEB, 0x2A, 0x75, 0x13, 0x81, 0x8A, 0x14, 0xD0, 0x9F, 0x78, + 0x90, 0x3F, 0xBC, 0xE6, 0x64, 0x82, 0x7B, 0xF3, 0x5E, 0x40, 0x11, 0x1B, + 0xF9, 0x21, 0x6A, 0x8F, 0x8B, 0x63, 0xCB, 0xD7, 0x1E, 0x02, 0x05, 0xC6, + 0x69, 0xAF, 0x0C, 0x3B, 0xAE, 0x7B, 0x53, 0x6F, 0x5B, 0x99, 0x1D, 0x46, + 0x81, 0x99, 0xF2, 0xC6, 0xEE, 0xDB, 0x2E, 0x23, 0xC3, 0xBB, 0x44, 0xB2, + 0xD3, 0xC5, 0x6D, 0x96, 0xBA, 0x7F, 0x70, 0x78, 0xC2, 0x31, 0xD8, 0xF5, + 0x40, 0xD8, 0xB0, 0x2A, 0x48, 0x09, 0xB5, 0x91, 0x77, 0x35, 0x9B, 0x2E, + 0x87, 0xEF, 0x9E, 0x37, 0xA3, 0x2B, 0x68, 0xC4, 0xA2, 0x01, 0x48, 0x51, + 0x5C, 0xEF, 0xE7, 0x47, 0x97, 0x55, 0x85, 0x24, 0xCE, 0x8C, 0x20, 0xFF, + 0x9D, 0x7E, 0x4D, 0x09, 0xC3, 0xDE, 0x50, 0xDA, 0x52, 0x41, 0xCE, 0x75, + 0x57, 0x2C, 0xDC, 0x45, 0x21, 0x33, 0xFB, 0x8C, 0x72, 0xA4, 0x03, 0xF1, + 0xEB, 0x86, 0x0D, 0x61, 0xA7, 0x95, 0xA4, 0xE7, 0xAD, 0x5A, 0x89, 0xCB, + 0x99, 0x02, 0xA1, 0xE9, 0x16, 0x64, 0x84, 0x18, 0xF6, 0x0F, 0x0E, 0x25, + 0x45, 0x22, 0x5C, 0x56, 0x59, 0x6D, 0x61, 0xAD, 0xC0, 0x05, 0x9A, 0x40, + 0xD3, 0xCE, 0xE7, 0xA3, 0x92, 0x38, 0x3A, 0xEF, 0xA9, 0xE0, 0x08, 0x35, + 0x6D, 0x5B, 0x38, 0x40, 0x15, 0x6D, 0xE0, 0x4A, 0x43, 0x4B, 0x63, 0xDA, + 0x6A, 0x07, 0x7E, 0xB1, 0xCD, 0x12, 0xDC, 0x05, 0xA2, 0x23, 0x57, 0x28, + 0x7A, 0x0D, 0xB4, 0x89, 0xBD, 0xA3, 0xDB, 0xF4, 0x70, 0x8B, 0x12, 0xFC, + 0xD0, 0x75, 0x40, 0x7D, 0x92, 0x8C, 0x5C, 0xD7, 0xA7, 0xE4, 0x6D, 0x7B, + 0x92, 0x89, 0x0C, 0xF4, 0xFA, 0xE5, 0x49, 0x15, 0x80, 0x68, 0x88, 0x25, + 0xC5, 0x93, 0xAF, 0x78, 0x8E, 0x92, 0x31, 0xE8, 0xBA, 0x9B, 0xEC, 0x93, + 0x2E, 0x06, 0xBC, 0x87, 0x30, 0x6E, 0x6F, 0x42, 0x31, 0xC6, 0xCD, 0xEA, + 0xE2, 0x43, 0xDF, 0xA6, 0x2C, 0xFE, 0x05, 0x4E, 0x63, 0xD6, 0x63, 0xD8, + 0x46, 0x56, 0xD8, 0xB2, 0x6E, 0x4F, 0xDC, 0xF5, 0x23, 0xDE, 0x49, 0xAD, + 0xE8, 0x2D, 0x00, 0xEA, 0xAD, 0xE6, 0xE4, 0x4A, 0x48, 0x78, 0x20, 0xCC, + 0xC0, 0x47, 0x22, 0xB4, 0xB3, 0xB8, 0xAF, 0x71, 0x1D, 0x89, 0x68, 0xD6, + 0x18, 0x70, 0x34, 0xAD, 0xFF, 0x99, 0xB3, 0x41, 0xD4, 0x6B, 0x93, 0xB5, + 0x47, 0x54, 0xB3, 0x7D, 0xF5, 0x5F, 0xA3, 0x6E, 0x54, 0x1A, 0x59, 0x11, + 0x53, 0x83, 0xAC, 0x23, 0xC2, 0x1F, 0x39, 0x64, 0x11, 0x67, 0x11, 0xBF, + 0x50, 0xDB, 0x5D, 0x1D, 0x74, 0x48, 0xDC, 0xF3, 0xBE, 0x55, 0xAA, 0x53, + 0xDB, 0xC8, 0x5C, 0x79, 0xEA, 0xB3, 0x28, 0x7A, 0xB6, 0xDB, 0x71, 0x7F, + 0xD7, 0xCF, 0x39, 0x77, 0xFD, 0xCE, 0x8B, 0x9F, 0x1A, 0x27, 0x14, 0x3C, + 0x78, 0x58, 0x18, 0xE5, 0x93, 0xDD, 0x81, 0x24, 0xF8, 0xFE, 0x97, 0x3C, + 0xA8, 0x8F, 0xFE, 0x6C, 0xA1, 0xDB, 0xE2, 0xCF, 0x59, 0x9B, 0x28, 0xC2, + 0xAB, 0x59, 0x13, 0x98, 0xDD, 0x2F, 0x03, 0xD0, 0x05, 0x93, 0x72, 0x97, + 0x07, 0xA0, 0xBC, 0xC3, 0x8B, 0x47, 0xDF, 0x55, 0x1C, 0x0E, 0x70, 0x6D, + 0xEF, 0x48, 0x0E, 0x33, 0x0D, 0x5F, 0x05, 0xF5, 0x98, 0xAC, 0xE3, 0xEE, + 0x8F, 0x9D, 0xBD, 0x84, 0xB7, 0x9C, 0x8C, 0x06, 0x60, 0x86, 0xB1, 0xDE, + 0x80, 0xB3, 0xAC, 0xD7, 0xE8, 0x35, 0xDC, 0x51, 0x57, 0x8F, 0xE8, 0x7A, + 0xC8, 0xC2, 0x46, 0x3A, 0x22, 0x4D, 0x15, 0x6B, 0x9E, 0x0A, 0xB3, 0xFF, + 0x11, 0xD9, 0x2D, 0xE0, 0x5A, 0x32, 0xBB, 0x0D, 0x72, 0x0F, 0x8B, 0xB2, + 0xD9, 0x86, 0x2D, 0x5F, 0x57, 0x92, 0xBF, 0xAF, 0x00, 0x5C, 0xE2, 0x54, + 0x91, 0x51, 0x22, 0xA9, 0x3A, 0x48, 0x9F, 0x8E, 0xF0, 0xA8, 0x04, 0x1F, + 0xD3, 0x58, 0x00, 0xB3, 0xDC, 0x7B, 0x99, 0x74, 0x18, 0x12, 0x44, 0x35, + 0x65, 0x1A, 0x1E, 0x95, 0xCC, 0x73, 0x53, 0xBB, 0xFC, 0x90, 0x07, 0x68, + 0x2B, 0x46, 0x69, 0xF2, 0x68, 0x6E, 0x62, 0x31, 0x5B, 0x11, 0x10, 0x9C, + 0x18, 0x70, 0x29, 0x0D, 0x1A, 0x88, 0xD8, 0xA5, 0xC6, 0x2C, 0xAA, 0xB7, + 0x80, 0xC6, 0x36, 0xB0, 0x4E, 0x3C, 0x68, 0x74, 0xB8, 0xFE, 0xF6, 0x82, + 0x5D, 0x74, 0x71, 0xBE, 0xD1, 0x3C, 0xE0, 0x2D, 0x20, 0x3A, 0x36, 0xA9, + 0x87, 0x76, 0xAA, 0x16, 0xB7, 0x6F, 0xB8, 0x66, 0x05, 0xEB, 0x63, 0x15, + 0xB6, 0xDE, 0x01, 0x49, 0xF5, 0x01, 0x37, 0xF0, 0x98, 0x11, 0xC9, 0x43, + 0x5D, 0xCB, 0x04, 0x48, 0x75, 0xD4, 0x73, 0x97, 0xE6, 0xD5, 0xEF, 0x97, + 0x8C, 0xF7, 0x37, 0xC8, 0xDA, 0xAB, 0x53, 0x12, 0x44, 0xF5, 0x72, 0xE7, + 0x58, 0xBD, 0x2A, 0x65, 0xE5, 0x79, 0x8D, 0xA5, 0x50, 0xBF, 0x3E, 0x3B, + 0x36, 0x9D, 0x48, 0x73, 0xA0, 0x17, 0x4C, 0x8E, 0x82, 0x98, 0xD0, 0xFD, + 0xB1, 0xDB, 0x16, 0xBE, 0x05, 0x70, 0xBE, 0xEF, 0x43, 0x8A, 0xE8, 0xB8, + 0x79, 0x83, 0xBC, 0x3B, 0x23, 0x94, 0xAD, 0xA8, 0xD9, 0x98, 0x74, 0x4C, + 0x91, 0x48, 0x22, 0x96, 0x7D, 0x0E, 0x78, 0xF9, 0x35, 0xC0, 0xAE, 0xFD, + 0x0A, 0xB0, 0xF0, 0x6C, 0xA7, 0x51, 0x4D, 0x44, 0xD9, 0xBD, 0x84, 0x76, + 0x48, 0x4A, 0x66, 0x41, 0x55, 0xA6, 0xBE, 0xA4, 0xA2, 0x3E, 0xDE, 0xA0, + 0xE4, 0x6F, 0xB9, 0xB2, 0xED, 0x74, 0xE2, 0x36, 0x2F, 0x54, 0x64, 0x9C, + 0x41, 0xE6, 0xE3, 0xC8, 0x35, 0x23, 0xD5, 0x61, 0x0E, 0x03, 0xCA, 0xFA, + 0x17, 0xED, 0x05, 0x69, 0x9C, 0x7A, 0x58, 0x4D, 0x16, 0x34, 0x15, 0xA3, + 0x5B, 0x0C, 0x87, 0x0F, 0x02, 0xD2, 0xB3, 0xAF, 0x00, 0xC2, 0x1D, 0x39, + 0x87, 0x21, 0xF3, 0x9F, 0x96, 0xD2, 0xA1, 0x8C, 0xBE, 0xFB, 0xF4, 0xAB, + 0x0B, 0x65, 0x3A, 0xF9, 0xB7, 0x00, 0x91, 0x53, 0xE6, 0xF8, 0x9E, 0xD3, + 0x65, 0xFE, 0xEB, 0x00, 0x6D, 0x15, 0x00, 0x7A, 0x4D, 0xE8, 0xD2, 0xF9, + 0xB7, 0xBC, 0x41, 0xBC, 0x90, 0x29, 0xEF, 0x72, 0xAE, 0x38, 0xE8, 0x25, + 0x77, 0xEC, 0x55, 0xFF, 0x1D, 0x71, 0x79, 0x8E, 0x7F, 0x32, 0x87, 0x39, + 0x46, 0x58, 0x06, 0x19, 0xBB, 0xC0, 0x77, 0x5A, 0x3E, 0xB5, 0xE2, 0x35, + 0x7C, 0x24, 0xB5, 0xCC, 0x68, 0xA3, 0x2C, 0xC2, 0xF4, 0x48, 0x39, 0x21, + 0x25, 0x46, 0xE1, 0x2B, 0x08, 0x8D, 0x5E, 0xDC, 0x85, 0x4E, 0x03, 0x59, + 0x21, 0x42, 0x2C, 0x0F, 0x65, 0xC8, 0xF9, 0x27, 0x7C, 0x28, 0x0A, 0xAF, + 0x2E, 0x88, 0x88, 0x0E, 0xB7, 0xB7, 0xB7, 0x01, 0xCA, 0xD8, 0x19, 0xC8, + 0x43, 0xE5, 0xCD, 0xBB, 0xBE, 0xC2, 0x74, 0xDE, 0x1F, 0xBA, 0x0B, 0x4C, + 0x40, 0x30, 0xEA, 0xC4, 0x76, 0xE7, 0x30, 0xE9, 0xDA, 0x19, 0x30, 0x33, + 0x86, 0xD8, 0xC7, 0x47, 0xB3, 0xBB, 0x7A, 0x0D, 0x5F, 0xF1, 0x44, 0x8A, + 0xE5, 0x2F, 0x86, 0xC9, 0xCF, 0x5A, 0xF5, 0x12, 0xA1, 0xC8, 0x7B, 0x5F, + 0x83, 0x98, 0x96, 0x2D, 0x6A, 0x99, 0xE8, 0xE5, 0xD7, 0x4E, 0x6D, 0x0A, + 0x51, 0xCA, 0x90, 0x8F, 0x17, 0x4A, 0x02, 0x94, 0xAF, 0xBC, 0xB9, 0x64, + 0x2A, 0xFD, 0x29, 0x84, 0x40, 0x53, 0x71, 0xD6, 0x85, 0xEF, 0x26, 0xD4, + 0x33, 0x6C, 0x18, 0x8C, 0x4F, 0x4A, 0xFB, 0xA9, 0xAC, 0x24, 0x63, 0xED, + 0x61, 0x20, 0x9C, 0x3A, 0xF0, 0xCF, 0x60, 0xDB, 0xA2, 0xB8, 0xB7, 0x61, + 0xB7, 0x0E, 0x68, 0xC3, 0xCB, 0x08, 0x69, 0xA2, 0x08, 0x7B, 0xB4, 0xCB, + 0xBA, 0x4A, 0x89, 0x26, 0x38, 0xED, 0x8D, 0x7B, 0x56, 0x27, 0xE1, 0x00, + 0xB9, 0x18, 0x7F, 0xDC, 0x42, 0x7C, 0x0D, 0xD6, 0x58, 0x93, 0xC9, 0x6F, + 0x56, 0x22, 0x9A, 0x8C, 0x80, 0x19, 0xBA, 0x0F, 0xE0, 0x52, 0x22, 0x1D, + 0x98, 0xA7, 0x98, 0x85, 0xCE, 0x21, 0xE2, 0x6E, 0x70, 0x9E, 0x4F, 0xE5, + 0x04, 0x35, 0xEA, 0x66, 0x88, 0x22, 0x63, 0xB9, 0x17, 0x1A, 0xFA, 0x56, + 0x35, 0x06, 0xB4, 0x27, 0x2C, 0x8F, 0xE3, 0x13, 0x47, 0xCC, 0xA8, 0xC6, + 0x46, 0x54, 0x57, 0xD8, 0x70, 0xFF, 0x86, 0x4C, 0xB3, 0xF2, 0x0E, 0x29, + 0x5E, 0xD8, 0x88, 0x4C, 0x5A, 0x16, 0x1A, 0x79, 0x41, 0x87, 0x70, 0x52, + 0x1E, 0xBA, 0x02, 0xCC, 0xA3, 0xC9, 0xEF, 0x53, 0x12, 0x56, 0x6D, 0x55, + 0xBF, 0x8B, 0xAF, 0xFD, 0x12, 0xE0, 0x2D, 0x27, 0x83, 0x9F, 0x8E, 0x2E, + 0x1B, 0x7A, 0x22, 0x6D, 0xF9, 0x59, 0xF9, 0x63, 0x7F, 0xB0, 0xBF, 0x05, + 0x97, 0x78, 0x2E, 0x67, 0xC3, 0xA8, 0x4B, 0x16, 0xCB, 0x72, 0x47, 0xFD, + 0x0C, 0x0F, 0xAE, 0xC9, 0xB4, 0xB6, 0xE8, 0x99, 0xAA, 0xA3, 0x60, 0xF4, + 0xD2, 0x07, 0xF5, 0x82, 0xDA, 0x7B, 0xE6, 0x6E, 0xCC, 0x85, 0xD3, 0x2E, + 0xC1, 0x13, 0x3D, 0x32, 0xBE, 0xBB, 0x25, 0xA5, 0x2E, 0x00, 0xAA, 0x28, + 0x63, 0x2B, 0x61, 0x3E, 0x7F, 0x34, 0xA0, 0x83, 0xCE, 0xEC, 0x44, 0x72, + 0x29, 0x1F, 0x81, 0x62, 0x8A, 0xED, 0x9D, 0x5F, 0xFD, 0xFE, 0x14, 0x52, + 0x9C, 0xFC, 0xB4, 0x04, 0x70, 0x0A, 0x27, 0x7E, 0x94, 0x69, 0x13, 0x80, + 0x97, 0xCC, 0xD2, 0x69, 0xDD, 0xD1, 0x38, 0xFA, 0x51, 0x88, 0xC0, 0x9D, + 0xB6, 0x14, 0xE3, 0x20, 0xEB, 0x69, 0x62, 0xF4, 0xB7, 0x07, 0xF2, 0x6F, + 0xFE, 0xDA, 0xE3, 0xF9, 0x7A, 0x64, 0x70, 0xAD, 0x11, 0x10, 0x54, 0x6B, + 0x9F, 0x8B, 0x48, 0x9C, 0x19, 0x27, 0x83, 0x20, 0x29, 0x3E, 0x7C, 0x57, + 0x0E, 0x6E, 0x4F, 0x0B, 0xB7, 0xB2, 0x6D, 0x61, 0x52, 0xE0, 0xE5, 0x67, + 0xDB, 0xF9, 0x96, 0xBA, 0xF2, 0xA6, 0x4D, 0x2A, 0x98, 0xDF, 0x2F, 0x03, + 0xD1, 0x78, 0xB4, 0xF9, 0x08, 0x2A, 0x7C, 0xBA, 0xD6, 0x53, 0x57, 0x6A, + 0x2C, 0x8D, 0xF4, 0xDC, 0xA9, 0x05, 0x00, 0xA6, 0x8C, 0xFB, 0xFF, 0x45, + 0x13, 0xF4, 0xE8, 0xBD, 0xB5, 0xF4, 0x1D, 0xF7, 0x5F, 0x32, 0xC8, 0x30, + 0x1F, 0xD5, 0x0A, 0xC7, 0xA4, 0x28, 0x06, 0xFF, 0x44, 0x18, 0x43, 0x1A, + 0x8C, 0x63, 0x81, 0x2B, 0x16, 0x4C, 0xE4, 0xB0, 0xF4, 0x9A, 0x49, 0x09, + 0x7B, 0x8B, 0x6F, 0x93, 0x2E, 0xEC, 0x8C, 0x4F, 0x71, 0x01, 0xFF, 0x54, + 0x90, 0x1B, 0x6C, 0xF1, 0x9B, 0xB1, 0x06, 0xDA, 0xFC, 0xD4, 0xD6, 0xFB, + 0x10, 0xDA, 0x46, 0x8C, 0x0E, 0xAF, 0xF8, 0x19, 0xC0, 0x35, 0xA5, 0xD2, + 0x74, 0xFD, 0x25, 0xEF, 0xDD, 0x2E, 0x9C, 0x0B, 0xE1, 0x17, 0xD5, 0x0C, + 0xFB, 0xC1, 0xA8, 0xE6, 0x4A, 0x44, 0x0A, 0xF2, 0x48, 0xA2, 0x07, 0x42, + 0x3C, 0x36, 0xC5, 0xD7, 0x45, 0x9D, 0xDB, 0xA6, 0x4B, 0x30, 0xC1, 0x3A, + 0xB0, 0x31, 0x88, 0x0E, 0xB1, 0x38, 0x4E, 0x34, 0xF9, 0x33, 0xE2, 0x8A, + 0x0B, 0xF7, 0x7C, 0xF1, 0xE3, 0x07, 0x5A, 0xA0, 0x63, 0x12, 0x22, 0xFD, + 0x44, 0x8A, 0xE7, 0x35, 0xF7, 0x24, 0xAD, 0x6F, 0xBA, 0xC1, 0xA3, 0x2F, + 0x6C, 0x58, 0xF3, 0xD3, 0x13, 0x4D, 0x21, 0x0A, 0xA1, 0x1C, 0x54, 0xAA, + 0x5E, 0x35, 0xEF, 0x00, 0x48, 0xE8, 0xDE, 0x56, 0xA4, 0xFF, 0xBB, 0xD9, + 0xF9, 0xA7, 0x0D, 0x83, 0x08, 0x8B, 0x41, 0xDC, 0x63, 0xA4, 0x40, 0x62, + 0x46, 0xAD, 0x57, 0x49, 0x43, 0x67, 0x6D, 0x43, 0x23, 0x19, 0x7E, 0x17, + 0xF6, 0xEF, 0xDE, 0x07, 0xF2, 0x5D, 0x11, 0x78, 0x42, 0x8D, 0x11, 0xEF, + 0x9F, 0x4A, 0xA6, 0xCE, 0x95, 0x92, 0x34, 0x20, 0x02, 0x95, 0xB9, 0xA8, + 0x16, 0xF5, 0x5E, 0x2F, 0x7C, 0xF8, 0xE2, 0x07, 0xB8, 0xF4, 0x07, 0x30, + 0x1C, 0x77, 0xD3, 0x46, 0x11, 0x07, 0x8D, 0x6D, 0x69, 0x87, 0xB4, 0x91, + 0xCB, 0x72, 0x8E, 0x2D, 0xAD, 0x0E, 0xCD, 0x97, 0x8C, 0xA4, 0x0D, 0x05, + 0x93, 0xAF, 0x42, 0xDE, 0x74, 0xF8, 0x97, 0x3B, 0x7F, 0xBF, 0x4D, 0x6A, + 0x12, 0xE4, 0xE2, 0xF2, 0xAF, 0x6D, 0x1F, 0x31, 0xCA, 0x81, 0x33, 0x2F, + 0x42, 0x42, 0xCE, 0x48, 0x31, 0xD9, 0x09, 0x2A, 0x70, 0xDF, 0x75, 0xE3, + 0x9C, 0x42, 0xEF, 0x8A, 0xB1, 0x96, 0x6B, 0xA1, 0xBC, 0x2C, 0x84, 0x77, + 0xE9, 0x3D, 0x13, 0x3C, 0x04, 0x9F, 0xC8, 0x70, 0xC3, 0x26, 0xF0, 0xE3, + 0xC5, 0x04, 0xD3, 0xEA, 0x02, 0x10, 0x7E, 0xD2, 0xB5, 0x32, 0x87, 0x8D, + 0x02, 0xA8, 0x1B, 0x19, 0x7D, 0x6A, 0x54, 0x45, 0x62, 0x06, 0xD3, 0x28, + 0x32, 0xAC, 0x2A, 0x1E, 0xA1, 0xC3, 0x56, 0x96, 0xCB, 0xA4, 0x3A, 0x6F, + 0xCB, 0x2B, 0xBC, 0xCF, 0x7F, 0x75, 0xE9, 0x05, 0x12, 0x24, 0xC0, 0xD4, + 0x97, 0xAB, 0xCF, 0x4D, 0x38, 0x23, 0x87, 0xE6, 0x3D, 0x22, 0xE6, 0x3D, + 0xE1, 0xE7, 0x45, 0xF6, 0x62, 0xF3, 0xAB, 0x9B, 0x0C, 0x11, 0x23, 0x57, + 0x56, 0x57, 0xB7, 0xD8, 0x58, 0x37, 0x5A, 0x8C, 0x1F, 0x31, 0xA8, 0x29, + 0x1A, 0x04, 0xE2, 0xA7, 0x4A, 0xC7, 0x27, 0xCC, 0x39, 0x0E, 0xEF, 0x7F, + 0xD4, 0xE1, 0x46, 0xCD, 0xCC, 0x96, 0x22, 0xBC, 0x0E, 0xDD, 0xDF, 0xCA, + 0xDB, 0x77, 0x65, 0x49, 0x7C, 0x2F, 0x2C, 0xC0, 0x94, 0x05, 0x71, 0xC2, + 0x23, 0x5E, 0x74, 0xC3, 0x4E, 0x59, 0xA9, 0xE2, 0xD1, 0x0F, 0x2B, 0x68, + 0x5E, 0x6C, 0x6B, 0x3C, 0xD4, 0x7C, 0x42, 0xE4, 0x26, 0x79, 0xAE, 0xFB, + 0x14, 0x65, 0x56, 0x75, 0x6F, 0xA6, 0x70, 0xB9, 0x2E, 0x28, 0x94, 0xF1, + 0xD2, 0xE3, 0xDA, 0x1C, 0x4B, 0xF2, 0x71, 0x8A, 0xED, 0xE6, 0x20, 0x1C, + 0xF4, 0xEE, 0x63, 0xBB, 0x74, 0x73, 0x61, 0xD9, 0x55, 0x84, 0xED, 0xD9, + 0x59, 0x1B, 0x47, 0x8B, 0xE5, 0xEF, 0xBF, 0xA5, 0x78, 0xB4, 0x99, 0x7E, + 0xF3, 0x31, 0x59, 0x2A, 0xC8, 0x23, 0xB9, 0x0A, 0x81, 0xE2, 0x4C, 0x8A, + 0x97, 0xBC, 0x74, 0x08, 0xE4, 0x35, 0x2D, 0xD1, 0x3C, 0xBA, 0xF2, 0x20, + 0x51, 0x76, 0xF8, 0xFD, 0x20, 0x5D, 0xD2, 0x63, 0x7D, 0xA3, 0xEF, 0x7D, + 0x56, 0x46, 0x44, 0x86, 0x29, 0x70, 0xC3, 0x5F, 0x1B, 0xC6, 0x3D, 0x42, + 0xD3, 0x69, 0x78, 0x5C, 0xD3, 0xD4, 0x79, 0x3B, 0x0B, 0x81, 0x48, 0x00, + 0xAA, 0xEA, 0x4C, 0x95, 0x56, 0x20, 0xE8, 0xB1, 0xB6, 0xE9, 0xA7, 0xD6, + 0x0F, 0x4F, 0x5B, 0xB1, 0xC3, 0xCD, 0xF6, 0x43, 0x83, 0x6C, 0x4C, 0xA3, + 0x17, 0x58, 0xAB, 0x06, 0x68, 0xBB, 0x14, 0x50, 0x07, 0xBC, 0x7B, 0x75, + 0x9B, 0x5F, 0x96, 0xC6, 0x79, 0xFF, 0x3C, 0x6A, 0x05, 0x5B, 0xA4, 0x63, + 0xA3, 0x93, 0x6F, 0x6F, 0x87, 0xE8, 0xAF, 0x44, 0x48, 0x02, 0x49, 0x4C, + 0xED, 0x8C, 0x3A, 0x51, 0x50, 0x43, 0x6F, 0xE6, 0x2A, 0x5E, 0x47, 0x25, + 0x05, 0xFB, 0x68, 0x17, 0x2D, 0x90, 0xEB, 0xE2, 0x76, 0xAB, 0x6B, 0x99, + 0xB3, 0x84, 0x59, 0xD0, 0xFD, 0x6A, 0x60, 0x6E, 0x4F, 0x46, 0xA0, 0x37, + 0xE7, 0x06, 0xB6, 0x15, 0xC9, 0x00, 0xEC, 0x00, 0x38, 0x0A, 0x8F, 0x81, + 0xDB, 0xAB, 0xBA, 0xE7, 0xD3, 0x88, 0xF0, 0x1B, 0x5D, 0xE9, 0x41, 0xAC, + 0xA0, 0xBC, 0x47, 0x93, 0x73, 0x04, 0x72, 0x88, 0x63, 0x91, 0xD8, 0x60, + 0x82, 0xAA, 0x2D, 0x49, 0xA4, 0xFF, 0xFF, 0x0C, 0xCF, 0x16, 0x73, 0x74, + 0xFE, 0x5F, 0x72, 0x90, 0x8C, 0x5E, 0x82, 0x2D, 0x6E, 0xDA, 0x8B, 0x30, + 0xA6, 0x39, 0xFB, 0x2A, 0x92, 0xC5, 0x0D, 0x49, 0x3A, 0x59, 0x3E, 0x0D, + 0xA7, 0xBB, 0x0B, 0x28, 0x46, 0x99, 0x6E, 0x7E, 0x6C, 0xD7, 0x6B, 0x89, + 0x8D, 0x1A, 0x85, 0x1D, 0x7E, 0x1A, 0xE8, 0xC8, 0xEF, 0x8F, 0xDD, 0x00, + 0xF8, 0x4F, 0xAE, 0x12, 0xF6, 0x88, 0x91, 0x36, 0xF9, 0xDB, 0x09, 0xDD, + 0xF7, 0xD5, 0xB3, 0xC8, 0x90, 0x0C, 0xC4, 0xB0, 0x45, 0xD2, 0x96, 0xBF, + 0x61, 0xE3, 0xD8, 0xD1, 0x4F, 0xDB, 0x1B, 0xF6, 0xA8, 0x0D, 0x40, 0xF0, + 0xEF, 0x23, 0x26, 0x2F, 0x25, 0xAB, 0x0E, 0x15, 0xB6, 0x90, 0x1F, 0xA3, + 0x6B, 0xEE, 0x93, 0xD4, 0x57, 0xA7, 0x78, 0x39, 0xB4, 0x79, 0x2B, 0x9E, + 0xE7, 0xFA, 0x2E, 0x1D, 0xAA, 0x41, 0xEB, 0x87, 0x99, 0x4E, 0x78, 0x42, + 0x47, 0x9D, 0x43, 0x80, 0x9F, 0x56, 0x13, 0x5E, 0x3D, 0x95, 0xF8, 0xB4, + 0x76, 0x9F, 0x72, 0x83, 0x81, 0xB1, 0x74, 0xDE, 0x43, 0xBE, 0x91, 0x57, + 0x71, 0x90, 0x3C, 0xA0, 0x1F, 0xA0, 0x87, 0x07, 0x47, 0xDF, 0x5C, 0xFD, + 0x21, 0xD6, 0x64, 0x4C, 0x72, 0xFB, 0xCE, 0x21, 0xC5, 0x89, 0x23, 0x0B, + 0xAE, 0x75, 0x72, 0x73, 0xA6, 0xA6, 0xB3, 0xCE, 0x9C, 0xB1, 0xAF, 0xAB, + 0xDF, 0x06, 0x55, 0x5F, 0x0C, 0x1D, 0x6D, 0x13, 0xD1, 0xD2, 0xF0, 0x54, + 0x00, 0xAE, 0xA6, 0x51, 0xF2, 0x8B, 0x50, 0xF5, 0x5D, 0x76, 0xC9, 0x4D, + 0x55, 0x3C, 0x6F, 0xC7, 0xCB, 0xD1, 0x43, 0xEB, 0x52, 0xCE, 0x84, 0x00, + 0x90, 0xEB, 0xBD, 0x54, 0xC9, 0x04, 0x3B, 0x4B, 0xA9, 0x5D, 0x53, 0x0D, + 0xB6, 0x13, 0x55, 0xD4, 0x36, 0xEB, 0x71, 0x23, 0x00, 0x98, 0xB3, 0xB9, + 0x73, 0x8B, 0x0B, 0xD3, 0xB9, 0x67, 0x50, 0x28, 0xBC, 0xCC, 0x16, 0xD5, + 0xDE, 0x72, 0x5B, 0x75, 0x7B, 0x12, 0xF6, 0x3C, 0x94, 0xAE, 0x3E, 0xEF, + 0x44, 0x3B, 0x9E, 0x8F, 0x80, 0x1C, 0x18, 0x5F, 0x9B, 0x43, 0x4F, 0xF5, + 0xB1, 0xD7, 0x8A, 0x42, 0xA0, 0x51, 0x74, 0x86, 0x0F, 0x31, 0x18, 0x6C, + 0x47, 0xF8, 0xB9, 0x97, 0x0F, 0x4B, 0x47, 0x18, 0xF6, 0x5C, 0x70, 0x49, + 0xBF, 0xF5, 0x00, 0x08, 0xC6, 0xD7, 0x04, 0x79, 0xE2, 0xE5, 0x05, 0xAA, + 0x00, 0x4A, 0xE0, 0xA8, 0x62, 0xDC, 0xD7, 0x17, 0x7C, 0x8D, 0x17, 0x14, + 0x0A, 0x16, 0x3B, 0x0B, 0x70, 0x50, 0xF0, 0xB8, 0x1A, 0xE0, 0xB9, 0x8C, + 0x04, 0xF0, 0xEB, 0xB1, 0xCB, 0x15, 0x3C, 0xF6, 0xCE, 0xED, 0x40, 0xA2, + 0x40, 0x36, 0x3A, 0xF0, 0xA8, 0x21, 0xF9, 0x31, 0x49, 0x8A, 0xC8, 0x1D, + 0x57, 0x63, 0xC3, 0x4E, 0x98, 0x3E, 0x2A, 0x0C, 0x41, 0xD9, 0x01, 0xF6, + 0xB5, 0xB4, 0xCD, 0x5C, 0xCE, 0x1A, 0x04, 0x81, 0xC4, 0x66, 0x38, 0xAA, + 0x06, 0xC9, 0xDA, 0x42, 0x8F, 0x26, 0x7D, 0xB3, 0x51, 0x43, 0x94, 0x1A, + 0xC6, 0x8E, 0x2C, 0x78, 0xC4, 0x4E, 0x88, 0x40, 0xF3, 0x38, 0x47, 0x4E, + 0x0F, 0xA4, 0x29, 0xBC, 0xC2, 0x02, 0x1F, 0x58, 0x44, 0xF4, 0x1B, 0x8D, + 0x2B, 0x82, 0x15, 0x92, 0x80, 0xA2, 0x65, 0xBD, 0x50, 0x93, 0xC5, 0xF9, + 0xEF, 0x18, 0x83, 0x45, 0x51, 0x4A, 0x5C, 0xCC, 0x9C, 0x69, 0xF6, 0x96, + 0x9E, 0xC0, 0x14, 0x2A, 0x48, 0x72, 0xBD, 0xEE, 0x93, 0x4B, 0x50, 0xFF, + 0xF4, 0x60, 0x62, 0x33, 0xE2, 0x0B, 0xD3, 0x63, 0xFE, 0xE6, 0xE5, 0xE9, + 0xB0, 0x1A, 0x25, 0x7F, 0x5B, 0xDC, 0xF7, 0xA0, 0x9A, 0x5B, 0x61, 0x76, + 0x61, 0x5D, 0x1F, 0xE3, 0x24, 0x02, 0x11, 0x28, 0x97, 0x0E, 0xCB, 0x95, + 0x08, 0x1B, 0xD1, 0xA8, 0xD9, 0xE7, 0x91, 0xC6, 0x47, 0x38, 0x10, 0xEC, + 0x33, 0xE0, 0x45, 0xF4, 0xE8, 0xAF, 0xBD, 0xCB, 0x5C, 0x32, 0x38, 0x3D, + 0x49, 0xC6, 0x36, 0x62, 0xE3, 0x7D, 0x94, 0xC4, 0x05, 0xAF, 0x47, 0x0B, + 0x01, 0x72, 0xF1, 0x76, 0x2B, 0x7C, 0xCC, 0x62, 0xB2, 0xF4, 0xD4, 0xE0, + 0x10, 0x02, 0x1D, 0xFD, 0x3B, 0xE3, 0x0F, 0x46, 0x45, 0x18, 0x11, 0xF5, + 0xBF, 0x15, 0xEB, 0xC7, 0xA4, 0x15, 0x96, 0x53, 0x02, 0xC1, 0xCD, 0xB0, + 0xC0, 0xD4, 0xE7, 0xBC, 0x47, 0x7F, 0xE3, 0xAD, 0x1F, 0x4A, 0xFF, 0x36, + 0xB2, 0x83, 0x5D, 0x1B, 0xF1, 0x2C, 0xE9, 0xE5, 0xDA, 0x17, 0x0F, 0x6C, + 0x68, 0x55, 0x23, 0xEC, 0x28, 0x4C, 0x2B, 0xC3, 0xC3, 0xC2, 0x26, 0x9D, + 0xF0, 0x61, 0x8C, 0xDC, 0xD6, 0xDB, 0xDB, 0x3E, 0xF0, 0x37, 0x67, 0xBC, + 0x67, 0xFA, 0xCD, 0x17, 0xBC, 0xBA, 0xAC, 0x05, 0xA1, 0x50, 0x41, 0x0B, + 0x18, 0x97, 0xE9, 0x7B, 0xE9, 0xE5, 0xA5, 0x70, 0x14, 0x24, 0x7B, 0x75, + 0x74, 0xCD, 0x9C, 0x9B, 0xA6, 0xC3, 0x6B, 0x10, 0x7F, 0x9C, 0x6F, 0x8A, + 0xE6, 0xDD, 0x30, 0xB0, 0x70, 0x7E, 0x46, 0xB5, 0xC5, 0xDE, 0x97, 0xE0, + 0x65, 0x64, 0x64, 0x3E, 0xAD, 0xA3, 0xA8, 0x0A, 0x69, 0xC7, 0x37, 0x5E, + 0xCE, 0x17, 0xFD, 0x2B, 0x0C, 0xAE, 0x04, 0xDE, 0xFB, 0x6A, 0x96, 0xD1, + 0x6C, 0x32, 0x00, 0xC8, 0xBD, 0x4B, 0xB6, 0x9A, 0xC5, 0xF7, 0xDA, 0xBC, + 0xED, 0xA7, 0x11, 0x0D, 0x91, 0x75, 0xC3, 0xFF, 0x7A, 0xC9, 0x06, 0x18, + 0x1C, 0x31, 0x92, 0xC2, 0x49, 0x7B, 0xB4, 0xC6, 0xF8, 0xA3, 0x42, 0xC0, + 0x37, 0xBE, 0xAD, 0x3C, 0x06, 0xF5, 0x73, 0x62, 0xBF, 0xDE, 0x08, 0x77, + 0x29, 0x52, 0x2E, 0x28, 0x57, 0xBF, 0xF9, 0x98, 0xFA, 0xC3, 0x9F, 0xC4, + 0xF4, 0xB2, 0xC2, 0x99, 0x4E, 0x45, 0x33, 0x50, 0xB4, 0x9A, 0x65, 0xC9, + 0xFB, 0x40, 0xC2, 0x77, 0xAC, 0xC8, 0x87, 0x1C, 0x9F, 0x7F, 0xD9, 0x1C, + 0xE7, 0xC1, 0x04, 0x44, 0xAB, 0xFA, 0x47, 0x5D, 0xE4, 0x89, 0x2D, 0xCF, + 0x52, 0xC1, 0x24, 0x30, 0x3D, 0xAD, 0x1B, 0x25, 0x34, 0xAF, 0x76, 0xBA, + 0xE0, 0x26, 0xF2, 0x63, 0xD0, 0x68, 0xFA, 0x18, 0x07, 0xA4, 0x39, 0xEE, + 0xF2, 0xF0, 0xEC, 0xDD, 0xB4, 0x95, 0x4E, 0xBF, 0x46, 0x31, 0x39, 0xC7, + 0x1D, 0xB6, 0xCB, 0x5F, 0xA2, 0xA2, 0x62, 0x83, 0x11, 0xA5, 0xE9, 0xED, + 0x92, 0xC2, 0xD8, 0x5B, 0x64, 0xD9, 0x65, 0xFE, 0x18, 0xE8, 0xB1, 0xBD, + 0xAD, 0xF2, 0xF9, 0xD0, 0x1D, 0xCB, 0x71, 0xDC, 0x49, 0x3F, 0x4F, 0xD9, + 0x9E, 0x17, 0x7F, 0xF6, 0x46, 0xA0, 0xFF, 0x99, 0x17, 0xA2, 0xE6, 0xEB, + 0xDE, 0xB7, 0xAF, 0x26, 0x4C, 0xFD, 0xDA, 0xE1, 0xFB, 0xEF, 0xAA, 0xC5, + 0x2F, 0xF9, 0x31, 0x5C, 0xF6, 0x91, 0x70, 0xDA, 0x66, 0xED, 0xB3, 0x51, + 0x72, 0x95, 0x29, 0x22, 0xA5, 0xE2, 0x82, 0x0C, 0x43, 0xFE, 0x92, 0xFF, + 0x72, 0xA8, 0xD9, 0xF5, 0x6F, 0xCF, 0x63, 0xFC, 0x75, 0xD2, 0x33, 0x47, + 0xAD, 0x01, 0x87, 0xC2, 0xE6, 0xDE, 0xBB, 0xB9, 0xCF, 0xE2, 0x17, 0x50, + 0x3A, 0x68, 0x31, 0xD1, 0xB6, 0xC9, 0x3F, 0x43, 0x25, 0xBC, 0xB5, 0xF3, + 0xC9, 0xF9, 0xF3, 0xB3, 0x11, 0x5E, 0xF6, 0xE0, 0xBF, 0xAF, 0x1B, 0x90, + 0xA3, 0x61, 0xA3, 0x36, 0xFB, 0xBF, 0x0E, 0x62, 0xDF, 0xCC, 0x9B, 0x51, + 0x59, 0xFE, 0xA4, 0xFA, 0xD1, 0x3A, 0x4B, 0xA5, 0x9A, 0xA8, 0x21, 0x01, + 0x1D, 0x52, 0xAF, 0xBE, 0x74, 0x2D, 0x8B, 0x91, 0x91, 0x98, 0xC9, 0xD1, + 0x9C, 0x5B, 0x38, 0x12, 0x00, 0x2B, 0x12, 0x6F, 0x92, 0x7A, 0xC7, 0x45, + 0x16, 0xB8, 0xA7, 0xB3, 0x9F, 0x46, 0xF9, 0xAE, 0xBD, 0x13, 0xFB, 0xDD, + 0xDB, 0x86, 0x8A, 0x94, 0xFB, 0x10, 0x3B, 0xA3, 0x4D, 0x4C, 0x4D, 0xDD, + 0xC2, 0x38, 0x22, 0x58, 0xC4, 0x34, 0xCE, 0x58, 0x78, 0x89, 0x7B, 0x77, + 0x28, 0x30, 0xD6, 0xC7, 0x44, 0x04, 0x52, 0x7A, 0x19, 0x1E, 0xF1, 0xFD, + 0xD3, 0x77, 0x5F, 0x50, 0x0D, 0xAE, 0xAE, 0xEF, 0x59, 0x06, 0xF4, 0x3D, + 0x18, 0x43, 0x38, 0x51, 0xD6, 0x3D, 0xC5, 0x23, 0x04, 0x1F, 0x5B, 0x25, + 0x4C, 0x74, 0xB0, 0xC6, 0xEB, 0x76, 0xBA, 0xE8, 0xB1, 0xA7, 0x44, 0xE2, + 0x5C, 0xD4, 0x18, 0x1D, 0x34, 0x8D, 0xA8, 0x05, 0x25, 0x03, 0xA2, 0xD7, + 0xA3, 0x3F, 0x50, 0x07, 0x52, 0x09, 0x2D, 0x88, 0xFC, 0x2C, 0xF3, 0xAF, + 0xB4, 0x89, 0x6A, 0xA0, 0x27, 0x5F, 0xD3, 0x2B, 0x63, 0x8D, 0xD9, 0x60, + 0x1B, 0xD3, 0x35, 0x18, 0x61, 0x93, 0xF6, 0x82, 0xD8, 0xBC, 0x9F, 0x90, + 0xB6, 0xB1, 0xCF, 0xFD, 0x3B, 0xD4, 0xA8, 0x07, 0x0D, 0x76, 0xF1, 0x44, + 0x4F, 0x45, 0x10, 0x4C, 0xFB, 0x92, 0x1A, 0x56, 0x48, 0x87, 0x15, 0x7B, + 0x55, 0x3D, 0x10, 0xCE, 0xD8, 0x07, 0x3A, 0x79, 0x72, 0x17, 0x5C, 0xF2, + 0x9C, 0x84, 0xE1, 0x72, 0x36, 0x2A, 0xEB, 0xBB, 0xEE, 0x3E, 0xC8, 0x1F, + 0x33, 0x2F, 0x53, 0xDF, 0x6B, 0xE8, 0x3E, 0x0A, 0x5C, 0x32, 0x36, 0x81, + 0x77, 0x4A, 0xD6, 0xD0, 0xA8, 0x14, 0xBB, 0x32, 0xDC, 0x8B, 0x55, 0xB2, + 0xEF, 0xD4, 0xE8, 0xCA, 0xFF, 0x50, 0xDC, 0xBD, 0x55, 0xB5, 0x5E, 0xBE, + 0x1B, 0x74, 0x8A, 0x57, 0x5B, 0xBC, 0xCC, 0x2F, 0xF6, 0x72, 0x0C, 0xAF, + 0x9F, 0x2A, 0x96, 0xBE, 0xDC, 0xBC, 0xFC, 0x3A, 0xA8, 0xDF, 0x3E, 0x2E, + 0x78, 0xA7, 0xD8, 0xA0, 0x2A, 0x95, 0x70, 0x24, 0xBC, 0x6C, 0x1A, 0xFA, + 0xAA, 0xE6, 0xE1, 0x38, 0xE4, 0x8A, 0xD8, 0x63, 0x03, 0x82, 0x3C, 0xFB, + 0xA6, 0x9E, 0xB9, 0x69, 0xF6, 0x04, 0x60, 0x37, 0x0B, 0xBC, 0xEF, 0x85, + 0x70, 0xD4, 0xCB, 0xBE, 0x3E, 0xD3, 0xF2, 0x81, 0x37, 0x45, 0x1A, 0x94, + 0xB4, 0x02, 0xD9, 0xA2, 0xC8, 0x1D, 0x92, 0xE0, 0x5C, 0xA4, 0x5D, 0x43, + 0xA5, 0xFA, 0x1D, 0xD3, 0x18, 0x14, 0x0B, 0x18, 0x86, 0x74, 0x8E, 0x16, + 0xB3, 0x65, 0xD3, 0x24, 0x45, 0x71, 0xA9, 0x28, 0x46, 0x25, 0x68, 0x21, + 0x94, 0x8D, 0xDB, 0xCA, 0x13, 0x3C, 0x0C, 0xB1, 0xBB, 0xF2, 0x6E, 0xC2, + 0x2D, 0x67, 0xBA, 0x0D, 0xA9, 0x5B, 0x3A, 0xD7, 0x45, 0xDC, 0x68, 0x94, + 0x41, 0x30, 0xC1, 0xAD, 0x0C, 0xEF, 0x7E, 0xB1, 0x66, 0x1E, 0xEE, 0x0E, + 0x23, 0xC0, 0x6B, 0x08, 0xF0, 0x3E, 0xD0, 0xA8, 0xEF, 0x60, 0x34, 0xA7, + 0xDB, 0x9A, 0x3C, 0xD5, 0xEE, 0x02, 0x4C, 0x3E, 0x1C, 0x94, 0x75, 0x8E, + 0x95, 0xD2, 0x91, 0xCD, 0xF0, 0x20, 0x49, 0xBC, 0x6A, 0xBC, 0x26, 0x0C, + 0x40, 0x55, 0x4F, 0xE4, 0x29, 0xC7, 0x2D, 0xB0, 0x55, 0x28, 0xB1, 0xB2, + 0x99, 0x2A, 0x87, 0x4A, 0x19, 0x58, 0x7D, 0xEE, 0x24, 0xE7, 0xEE, 0xA6, + 0x6A, 0xBE, 0xE1, 0x96, 0xBB, 0x80, 0xF0, 0x1B, 0x55, 0x71, 0x02, 0x9D, + 0xCA, 0x8A, 0x51, 0xE4, 0x1D, 0x34, 0x6C, 0x1D, 0x22, 0x91, 0x3C, 0x19, + 0xBC, 0x31, 0x59, 0xA0, 0xD4, 0x82, 0x96, 0xAE, 0xE9, 0x2B, 0x24, 0x8E, + 0xF4, 0x97, 0x3B, 0xF0, 0x06, 0xC3, 0x60, 0x18, 0x0A, 0x46, 0xA3, 0x69, + 0xA3, 0x9B, 0x35, 0xA8, 0x04, 0xBC, 0x5B, 0x60, 0xE5, 0xF5, 0x10, 0x22, + 0x03, 0x59, 0x12, 0x09, 0x1B, 0x28, 0x6B, 0xC4, 0xF1, 0x82, 0xB1, 0x72, + 0x43, 0x8B, 0x0A, 0x27, 0x84, 0x7A, 0x38, 0x72, 0x64, 0xFD, 0x74, 0x39, + 0x02, 0xB6, 0x19, 0xE2, 0xDD, 0x28, 0x85, 0x61, 0xDE, 0x4F, 0x15, 0x0B, + 0x90, 0xE3, 0x83, 0xB5, 0x82, 0xC6, 0xB9, 0xA6, 0xFD, 0x6B, 0x8A, 0xB1, + 0x9E, 0xEB, 0xA9, 0xFC, 0xAA, 0x10, 0xC9, 0x4D, 0x06, 0xAB, 0x53, 0x06, + 0x2F, 0xF5, 0x7A, 0x94, 0xFB, 0x45, 0x14, 0x52, 0x1D, 0xFD, 0xCD, 0x2C, + 0xC7, 0x7B, 0x6D, 0x89, 0xCB, 0x50, 0xC4, 0x6D, 0x89, 0x9D, 0x66, 0x66, + 0xFA, 0x17, 0xD7, 0x03, 0xB4, 0x62, 0xAA, 0x6F, 0xEC, 0xB9, 0x33, 0xF1, + 0x2A, 0x7E, 0x53, 0x2C, 0x86, 0x41, 0xF2, 0x73, 0xE1, 0xC6, 0xFB, 0x6E, + 0x0F, 0x5B, 0x31, 0x66, 0xB3, 0x6C, 0x89, 0xC7, 0x49, 0x26, 0xE6, 0x1B, + 0x22, 0xB1, 0x01, 0xC8, 0x00, 0x1D, 0xFF, 0xAF, 0x3C, 0x5F, 0x48, 0xB3, + 0x59, 0xCC, 0xAE, 0x96, 0x36, 0x30, 0xCB, 0xBF, 0x64, 0xEB, 0x7D, 0xC1, + 0xF0, 0x36, 0xA8, 0x0D, 0xD1, 0x5D, 0xAB, 0x31, 0x89, 0x8E, 0x40, 0x1D, + 0xED, 0x84, 0xC9, 0x08, 0x73, 0xB4, 0xFE, 0x20, 0xEF, 0x15, 0x25, 0xD1, + 0xF8, 0xAA, 0x24, 0xF9, 0xCE, 0xEC, 0x2B, 0x38, 0x30, 0x98, 0x97, 0x7A, + 0x43, 0xEE, 0xFC, 0xCE, 0x1C, 0x90, 0x87, 0x48, 0x7D, 0x7F, 0x97, 0xDF, + 0x72, 0x18, 0x16, 0xD7, 0xD3, 0xD7, 0x65, 0xA1, 0xB5, 0xEC, 0xC2, 0xFC, + 0x95, 0xC0, 0x34, 0x34, 0x51, 0x15, 0xE5, 0x72, 0xDC, 0x9A, 0x56, 0x67, + 0x01, 0xF8, 0x9C, 0x96, 0x12, 0x9E, 0xF4, 0xBD, 0x5B, 0xBE, 0x17, 0xC2, + 0xC2, 0x32, 0x6A, 0x0A, 0xD2, 0x4A, 0x0C, 0xF6, 0xAC, 0x33, 0x64, 0x48, + 0xE7, 0x36, 0x20, 0x99, 0x4A, 0xCA, 0xF2, 0xFC, 0xC7, 0x88, 0x34, 0x68, + 0x15, 0xFC, 0x28, 0x2E, 0xAC, 0xD2, 0x9E, 0xEE, 0x39, 0x7A, 0xC9, 0xB4, + 0x88, 0x64, 0xEA, 0x1F, 0x21, 0xA2, 0x5C, 0x5F, 0x29, 0xD1, 0x5B, 0xE9, + 0x7E, 0x76, 0x24, 0x7A, 0x05, 0x00, 0xCF, 0x49, 0x0D, 0x51, 0x28, 0x65, + 0x07, 0x82, 0xC2, 0x9E, 0x13, 0xED, 0x4A, 0x86, 0xB6, 0xCA, 0x78, 0x15, + 0xF0, 0x2C, 0x7A, 0xE5, 0x00, 0xF5, 0x74, 0xFF, 0x2E, 0x50, 0x85, 0xE0, + 0x72, 0xCA, 0xB1, 0x41, 0xC2, 0x88, 0x7F, 0x37, 0x9F, 0x46, 0xB2, 0x1F, + 0x20, 0x69, 0x7B, 0x1B, 0x44, 0xF6, 0x56, 0xD7, 0xDB, 0xDB, 0x58, 0x5D, + 0xF0, 0xDB, 0x11, 0x2B, 0x6E, 0x31, 0xE0, 0x95, 0x8C, 0xAC, 0x64, 0x7A, + 0xDE, 0x40, 0x6B, 0xA4, 0x78, 0x7A, 0xC1, 0xAB, 0x6A, 0x03, 0x4F, 0x88, + 0x96, 0x0E, 0xF1, 0x14, 0x6B, 0x66, 0xB7, 0x9F, 0x51, 0x25, 0x4F, 0x9A, + 0x25, 0x19, 0xBA, 0xE2, 0x31, 0xC5, 0x6D, 0xB0, 0x11, 0x28, 0x1D, 0xAF, + 0x8B, 0xEB, 0x75, 0x69, 0x85, 0xB9, 0x27, 0x47, 0xB1, 0x84, 0x35, 0x19, + 0xC6, 0xEB, 0xE9, 0x4E, 0x3F, 0x61, 0xFD, 0xA4, 0xEE, 0xD2, 0xC0, 0x31, + 0xEC, 0x22, 0x56, 0xE5, 0xB7, 0x22, 0x76, 0x34, 0x2A, 0x75, 0xC1, 0x5D, + 0x76, 0x7A, 0xFE, 0x4D, 0x48, 0x17, 0x53, 0xEA, 0xCD, 0x13, 0x09, 0xFF, + 0x04, 0x9D, 0xB1, 0x11, 0x70, 0xAF, 0x9B, 0x15, 0x1B, 0xB6, 0x81, 0xD4, + 0xF6, 0x38, 0x72, 0x65, 0xF5, 0xFB, 0x01, 0xF5, 0xB0, 0xD0, 0xBA, 0xCA, + 0xF0, 0x8E, 0x94, 0x81, 0xB1, 0x39, 0xBD, 0x7F, 0x3A, 0x33, 0x89, 0x04, + 0xE5, 0x96, 0x7E, 0xF6, 0xFC, 0x48, 0xE5, 0x96, 0xCF, 0x05, 0xAE, 0x8F, + 0x3E, 0xDE, 0x30, 0x92, 0xB8, 0xE0, 0x20, 0x1B, 0x86, 0xC3, 0x12, 0xA8, + 0xCA, 0xD8, 0xF3, 0xF5, 0xBF, 0x55, 0x0D, 0x8B, 0x20, 0xC8, 0x96, 0xB8, + 0x8E, 0x47, 0xCB, 0xC8, 0xE2, 0x73, 0xF9, 0x1A, 0xFD, 0x07, 0x90, 0x71, + 0xDB, 0xC4, 0xAF, 0xCE, 0xB4, 0xB6, 0x3A, 0x53, 0xCB, 0x1F, 0xCC, 0x67, + 0xE9, 0x9E, 0xD2, 0x82, 0x1F, 0xE0, 0x46, 0x46, 0xF8, 0xE6, 0x22, 0x01, + 0xE7, 0x54, 0x66, 0xB3, 0x66, 0x2E, 0xE3, 0x2B, 0x7E, 0x78, 0x6C, 0x68, + 0x81, 0xDC, 0x9E, 0x6F, 0xCA, 0xD3, 0x25, 0x94, 0x30, 0x84, 0x4F, 0x32, + 0xD5, 0x37, 0x21, 0x2C, 0xF6, 0xCE, 0x85, 0x83, 0x21, 0x6F, 0xC9, 0x09, + 0xE5, 0x0A, 0xE4, 0x8C, 0x22, 0x66, 0xB9, 0x50, 0xFB, 0xE6, 0x97, 0xCF, + 0x74, 0x8A, 0xC7, 0x67, 0xCB, 0x38, 0xDA, 0x85, 0x47, 0x8B, 0xF0, 0x64, + 0xF3, 0xFF, 0xA4, 0x91, 0x05, 0x7C, 0xE8, 0xED, 0x6F, 0x9F, 0x93, 0x3E, + 0x18, 0xA2, 0x4C, 0x68, 0x0C, 0x62, 0xEB, 0x6D, 0x3A, 0x45, 0x52, 0xBF, + 0x05, 0xC1, 0xB8, 0xB5, 0x0C, 0xBB, 0xCB, 0xF7, 0xA5, 0x88, 0xB4, 0x94, + 0x00, 0x77, 0x92, 0x9D, 0xA3, 0xFB, 0xC2, 0x04, 0x11, 0x4F, 0x8F, 0xA2, + 0x22, 0xFB, 0xEC, 0x71, 0xCA, 0x5E, 0x3A, 0xC2, 0x42, 0x1C, 0x2B, 0x74, + 0xCE, 0x9E, 0x46, 0xF7, 0xEF, 0x48, 0x24, 0xCF, 0xBA, 0xE1, 0x0A, 0x92, + 0xC9, 0x59, 0xF5, 0x10, 0xD7, 0x25, 0x6E, 0xAB, 0x9B, 0xAB, 0xD4, 0xC6, + 0x16, 0x98, 0x5B, 0x31, 0x87, 0x39, 0x21, 0xA9, 0x09, 0x7F, 0x47, 0x0B, + 0xF4, 0xFB, 0xA9, 0xFE, 0x60, 0x07, 0x1A, 0x31, 0xEC, 0x48, 0x64, 0x0D, + 0x73, 0x71, 0xDF, 0x78, 0xE6, 0xB1, 0x76, 0xD9, 0xE1, 0x4C, 0xCF, 0x80, + 0xBD, 0x58, 0x96, 0xAF, 0x3D, 0x3D, 0x82, 0x7B, 0xC0, 0x16, 0xD7, 0xD7, + 0x8C, 0xBC, 0x5F, 0x91, 0x30, 0xA3, 0x6C, 0x5D, 0x25, 0xCF, 0xAC, 0xA6, + 0xEC, 0xCF, 0x42, 0x41, 0x05, 0xA4, 0x74, 0x2E, 0x82, 0xBA, 0x21, 0x42, + 0x95, 0xDF, 0xF2, 0xD6, 0x29, 0x5B, 0x04, 0xBD, 0x47, 0x8E, 0x47, 0xBA, + 0x3F, 0x99, 0x20, 0x4D, 0x74, 0x56, 0xD6, 0x43, 0x42, 0xC4, 0x36, 0x7D, + 0x24, 0xE3, 0xC9, 0xD8, 0x66, 0xAB, 0x3D, 0x62, 0xE2, 0xA9, 0x51, 0x3C, + 0x9F, 0x1A, 0xA7, 0x6C, 0x7F, 0x4D, 0xC9, 0xEB, 0x21, 0x66, 0xBB, 0x46, + 0xA4, 0x97, 0x5E, 0x6D, 0xAD, 0xD4, 0x6F, 0xFB, 0xB1, 0xC6, 0x6F, 0x51, + 0x2F, 0x0A, 0x9A, 0x97, 0x8E, 0xBB, 0x80, 0xD7, 0x16, 0x70, 0xC4, 0x98, + 0xEE, 0xB9, 0x69, 0x48, 0x49, 0xA2, 0xBB, 0x93, 0x8B, 0xE6, 0x10, 0xCB, + 0xC3, 0x8D, 0x57, 0x17, 0x0A, 0xFE, 0x1B, 0xB5, 0x40, 0x06, 0x7D, 0xE4, + 0x89, 0x76, 0x13, 0x01, 0xB1, 0x2E, 0x01, 0xD7, 0x20, 0x1D, 0x5B, 0xE9, + 0x5C, 0x11, 0x24, 0x78, 0xF5, 0x9F, 0x02, 0xF8, 0x8B, 0xA9, 0x0B, 0x22, + 0x42, 0x66, 0x1A, 0xFE, 0x15, 0xF7, 0x51, 0x93, 0xB7, 0xDB, 0x00, 0x52, + 0x0A, 0xF0, 0x4A, 0xA8, 0xE1, 0xDF, 0xCE, 0x88, 0xBF, 0x47, 0x47, 0x73, + 0x48, 0x19, 0x89, 0x3B, 0xDD, 0xD2, 0x82, 0x14, 0xB4, 0x70, 0xF6, 0xF2, + 0xC1, 0x4D, 0x8B, 0x47, 0x74, 0x12, 0xC1, 0x42, 0x69, 0xE1, 0xFD, 0x25, + 0x6F, 0x62, 0xF6, 0x41, 0xF8, 0x60, 0x83, 0xB8, 0x91, 0x06, 0x09, 0x5D, + 0x90, 0x2E, 0x52, 0xB3, 0xFC, 0x34, 0x86, 0xD7, 0xC8, 0x27, 0x94, 0xA4, + 0xB9, 0x32, 0x7E, 0xA0, 0xA4, 0xB4, 0xE5, 0x2F, 0x14, 0x37, 0x7B, 0xFA, + 0x9C, 0x15, 0xD0, 0xE2, 0x13, 0x4C, 0x62, 0x24, 0xE8, 0x0C, 0xDC, 0x52, + 0x10, 0xC3, 0xCE, 0x6F, 0xE5, 0x21, 0x57, 0xF3, 0x17, 0xD0, 0x0F, 0x67, + 0x9D, 0x58, 0xEA, 0x84, 0x13, 0x9E, 0xE3, 0xEA, 0xF6, 0xBC, 0x5C, 0x40, + 0xCE, 0xCC, 0xAA, 0xE8, 0x5B, 0x41, 0x86, 0x68, 0xD7, 0xC3, 0x3B, 0x66, + 0xFB, 0x6B, 0xC1, 0xAE, 0x72, 0x29, 0xE6, 0x6C, 0x2A, 0x71, 0xB4, 0xC5, + 0x4F, 0x69, 0xBA, 0x40, 0x80, 0x58, 0x08, 0x4F, 0x8D, 0xE5, 0x69, 0x44, + 0x1B, 0xC0, 0x3D, 0x97, 0xAB, 0x7D, 0x23, 0xF3, 0x79, 0x40, 0x1A, 0x9D, + 0x04, 0x98, 0x31, 0x6A, 0x5E, 0x6C, 0x59, 0x17, 0xEA, 0x34, 0xEC, 0x29, + 0xA2, 0x7D, 0xC9, 0x2B, 0x5B, 0x76, 0x9C, 0x15, 0x22, 0x67, 0x6C, 0x08, + 0x33, 0x41, 0xC5, 0x46, 0xA7, 0xA6, 0x0E, 0xEB, 0xFB, 0x92, 0x17, 0x41, + 0xAF, 0x3B, 0x22, 0x96, 0xDE, 0x35, 0xD6, 0xB6, 0x7C, 0xEF, 0x6B, 0xF6, + 0x10, 0xFC, 0xE7, 0xBC, 0x38, 0xE2, 0xB7, 0xA6, 0x93, 0x1F, 0x12, 0x86, + 0xF7, 0x1F, 0xBE, 0x41, 0x42, 0xCC, 0xDB, 0xF8, 0x52, 0xCB, 0xFD, 0xFF, + 0x40, 0xC1, 0x38, 0x50, 0x6F, 0x72, 0x77, 0x2B, 0xB1, 0x27, 0xCD, 0x9A, + 0x0F, 0x6B, 0x5D, 0x1E, 0xE7, 0x9A, 0xB9, 0xA4, 0xA2, 0xC3, 0x8C, 0x2D, + 0x73, 0xC1, 0xF9, 0x6B, 0x5E, 0x08, 0xD8, 0x8B, 0x1E, 0x05, 0x0A, 0x04, + 0xBD, 0x29, 0xE2, 0x57, 0x52, 0xF7, 0x21, 0xEE, 0x10, 0x36, 0x7E, 0x90, + 0x09, 0x08, 0xA3, 0x44, 0xE1, 0xCA, 0xCF, 0x59, 0x53, 0xDB, 0x6E, 0x65, + 0x28, 0xEE, 0xF3, 0x60, 0xCB, 0x47, 0x83, 0x18, 0xDC, 0x05, 0xAD, 0xCC, + 0x04, 0x09, 0x91, 0x05, 0xAE, 0x96, 0x2F, 0x10, 0x0E, 0x50, 0x0C, 0xF0, + 0x57, 0xA8, 0xEE, 0x81, 0x89, 0x4C, 0x9B, 0x72, 0x13, 0xA1, 0xB9, 0x5A, + 0x9E, 0x31, 0xB2, 0xA9, 0x80, 0xA8, 0x51, 0xEA, 0x7E, 0x59, 0xA7, 0xB9, + 0x7C, 0xBE, 0x82, 0x13, 0xC7, 0x30, 0xAE, 0xF9, 0xF5, 0x22, 0x15, 0xE1, + 0xC6, 0xC2, 0x06, 0xD9, 0xC9, 0xD9, 0xF4, 0x4C, 0xBF, 0x0A, 0x02, 0xD3, + 0x4C, 0x38, 0x28, 0x60, 0x52, 0xB9, 0xF7, 0x3C, 0xD9, 0x1C, 0x28, 0x98, + 0x89, 0xAC, 0xBD, 0x81, 0x17, 0x5E, 0x59, 0xF5, 0x55, 0xC7, 0xED, 0x58, + 0x1F, 0x29, 0xE7, 0x57, 0xC1, 0x27, 0x0A, 0x7E, 0x67, 0x00, 0x56, 0xD5, + 0x93, 0x99, 0xA6, 0x8E, 0x7D, 0xB1, 0xA0, 0x17, 0x98, 0x88, 0xA8, 0x9D, + 0x2D, 0x27, 0x6B, 0x0C, 0x59, 0x5C, 0x0B, 0x3C, 0x6A, 0x3B, 0xFD, 0x44, + 0x37, 0x18, 0xAA, 0x49, 0xE7, 0xA1, 0xC1, 0x24, 0xCD, 0xB6, 0xA6, 0x2C, + 0x4D, 0x38, 0x1D, 0x3A, 0x0B, 0xA6, 0x42, 0x84, 0x48, 0x63, 0xCB, 0x5A, + 0x74, 0xBF, 0x62, 0x3B, 0x5E, 0x55, 0x94, 0xC7, 0x52, 0x7D, 0xD1, 0xA6, + 0xFE, 0x3B, 0x1A, 0xE8, 0x80, 0x3D, 0x57, 0x9E, 0x03, 0xE4, 0xA7, 0xB0, + 0x52, 0x84, 0x42, 0xC4, 0x95, 0x63, 0xC9, 0xD2, 0x6E, 0xA9, 0x51, 0xE8, + 0x51, 0x9C, 0xFB, 0x67, 0xD1, 0xF6, 0x37, 0xC2, 0x56, 0x64, 0x95, 0x70, + 0x07, 0x23, 0x0C, 0x79, 0x4C, 0x20, 0x52, 0x94, 0x68, 0x9B, 0xC3, 0x64, + 0x7A, 0xBC, 0xF6, 0x54, 0x97, 0xF0, 0xEB, 0x0F, 0x71, 0x8E, 0x69, 0x85, + 0xCC, 0x2F, 0x2B, 0x2F, 0xCF, 0x8D, 0xEA, 0x1A, 0x04, 0x37, 0x47, 0xDA, + 0xFE, 0xCF, 0xD2, 0x5E, 0xA8, 0xE7, 0x03, 0x21, 0xBA, 0xFE, 0x88, 0x21, + 0x33, 0x17, 0xE3, 0x78, 0xB0, 0xE4, 0x71, 0x47, 0x1A, 0x88, 0x9B, 0x4F, + 0x5F, 0x38, 0xF8, 0x0F, 0x8F, 0x82, 0x04, 0x72, 0xDC, 0x1E, 0x7B, 0xB6, + 0x90, 0x55, 0x19, 0xDE, 0xD7, 0x0E, 0xE6, 0xED, 0xEE, 0x9A, 0x47, 0x5A, + 0x63, 0xC4, 0xE6, 0x2A, 0x09, 0xB0, 0xC4, 0x0A, 0xBA, 0x70, 0xF8, 0x18, + 0x0F, 0xE1, 0x87, 0xAD, 0x41, 0xCE, 0xB9, 0x4B, 0x6E, 0xF1, 0x0B, 0x04, + 0xAC, 0x6A, 0x4F, 0x09, 0x40, 0xDE, 0x60, 0xF2, 0x10, 0xC7, 0xD8, 0x11, + 0xFB, 0x58, 0x4D, 0x8C, 0x6F, 0xD9, 0xF7, 0xA5, 0xC3, 0x13, 0x16, 0x39, + 0x25, 0x5A, 0x01, 0xE5, 0x92, 0x06, 0x8A, 0x4A, 0x89, 0xB5, 0x43, 0x7A, + 0x39, 0xC2, 0x12, 0xCD, 0x45, 0x8B, 0x8E, 0x59, 0x1C, 0x4F, 0x72, 0xA6, + 0xEE, 0xA4, 0x88, 0x6F, 0x04, 0xE8, 0x68, 0xD1, 0xDC, 0x90, 0x41, 0x28, + 0x8C, 0x2B, 0xC9, 0xF1, 0x92, 0x08, 0xAC, 0x7F, 0x7E, 0xEE, 0x7A, 0x3F, + 0x54, 0xFB, 0x45, 0x7F, 0x73, 0xF6, 0xE5, 0xE2, 0xE4, 0x8C, 0x05, 0xA4, + 0xAF, 0x63, 0x86, 0xB4, 0xA5, 0x6B, 0x33, 0x19, 0x00, 0x79, 0xB0, 0x73, + 0x2C, 0x89, 0xFC, 0x81, 0xDF, 0x7E, 0x5C, 0x59, 0x02, 0xF2, 0xFA, 0x52, + 0x9C, 0x1E, 0xD4, 0xE5, 0x56, 0x90, 0x56, 0x23, 0x3A, 0x7A, 0xFD, 0x6F, + 0xB4, 0x98, 0x8D, 0x47, 0xD7, 0x4D, 0x84, 0xB9, 0x2A, 0x09, 0xF2, 0x6C, + 0xAB, 0x1C, 0x70, 0xD1, 0x01, 0xD5, 0x63, 0xF0, 0xDF, 0x3F, 0xCD, 0x27, + 0x94, 0x36, 0xB8, 0xE8, 0xB9, 0xAF, 0xB7, 0xDD, 0x41, 0xE1, 0x43, 0xC7, + 0xE4, 0xF5, 0xA8, 0xB7, 0xF4, 0x59, 0x91, 0x84, 0x96, 0x0A, 0x6E, 0x13, + 0xA8, 0x43, 0x1C, 0xC1, 0x4A, 0xB6, 0x52, 0x6E, 0x36, 0x21, 0x02, 0x18, + 0x15, 0xB1, 0x65, 0xA5, 0xE1, 0x0F, 0xA5, 0x0C, 0xE1, 0xFF, 0xE2, 0x10, + 0xCC, 0xBB, 0xBD, 0x33, 0x91, 0x73, 0x7D, 0xA0, 0x16, 0x23, 0x39, 0x9B, + 0x36, 0xCF, 0x94, 0x2F, 0x7C, 0xA0, 0x63, 0xE8, 0x3C, 0xB8, 0xBE, 0xC5, + 0x03, 0x3D, 0x1A, 0x3D, 0x97, 0x10, 0x7F, 0x79, 0x7F, 0xCA, 0x94, 0x77, + 0x30, 0x1A, 0x5B, 0x3A, 0xF1, 0xAF, 0xF1, 0xF4, 0x4F, 0x69, 0xA8, 0x0C, + 0x7B, 0x87, 0xED, 0x30, 0x99, 0xEE, 0xEE, 0xD5, 0xEF, 0x29, 0x1B, 0xB9, + 0xC0, 0x4C, 0xF6, 0x46, 0x46, 0xD9, 0x12, 0x9E, 0x73, 0xF6, 0x5C, 0x8F, + 0x12, 0x14, 0xF1, 0xFC, 0x4C, 0x49, 0xE6, 0xDF, 0xCD, 0x92, 0x82, 0xDC, + 0xD6, 0xF1, 0x2D, 0x04, 0x27, 0x94, 0x55, 0xF5, 0x7E, 0xC5, 0x81, 0x4B, + 0x84, 0xB8, 0x6F, 0x43, 0xD4, 0x4E, 0x58, 0x44, 0x66, 0x31, 0xC8, 0xB4, + 0xD4, 0x64, 0x37, 0x72, 0xAA, 0x46, 0xD0, 0x7A, 0x49, 0x94, 0xEA, 0x1E, + 0xF6, 0xED, 0x31, 0xE2, 0xCF, 0xD0, 0x12, 0x53, 0x5F, 0xC4, 0xA9, 0xF4, + 0x79, 0xD5, 0xB2, 0x2E, 0xD2, 0x7C, 0xC9, 0x12, 0xDE, 0xFA, 0xED, 0x9E, + 0x6B, 0xFB, 0x08, 0xBE, 0x61, 0x53, 0x96, 0x1A, 0xB8, 0x71, 0x2C, 0x5E, + 0xE5, 0xF8, 0xAE, 0x68, 0xF5, 0x39, 0x11, 0x53, 0xDD, 0x30, 0x4F, 0x49, + 0xCB, 0x5E, 0x9C, 0x20, 0x2B, 0x99, 0x77, 0x8F, 0xA8, 0x46, 0x5F, 0xD2, + 0xBB, 0x31, 0x8E, 0x2C, 0x84, 0x60, 0x63, 0xEB, 0xE9, 0x0C, 0x20, 0x98, + 0xAA, 0x58, 0xF5, 0x75, 0xA0, 0x2E, 0xB2, 0x65, 0x79, 0xA2, 0xB9, 0xAB, + 0xD9, 0xE8, 0xA6, 0xF3, 0x1B, 0x34, 0x37, 0x75, 0xA4, 0xFF, 0x00, 0xF8, + 0xA6, 0xF6, 0x26, 0xA4, 0xFF, 0x63, 0x14, 0xB9, 0xA5, 0xD0, 0x12, 0x45, + 0x08, 0x8C, 0x6E, 0x78, 0x0C, 0xC5, 0x75, 0xB8, 0xEC, 0x77, 0x73, 0xEA, + 0x87, 0x6F, 0xAD, 0x4D, 0x98, 0xCD, 0xC7, 0xA5, 0x20, 0xC3, 0x4E, 0x31, + 0x79, 0x16, 0xB0, 0x2A, 0x9A, 0x84, 0x02, 0xAA, 0x00, 0x60, 0xBB, 0x58, + 0x84, 0xC6, 0x95, 0xF3, 0xF4, 0x6C, 0xEB, 0xD8, 0xEC, 0x1A, 0xC3, 0x92, + 0xD6, 0x09, 0x58, 0x56, 0xDB, 0x64, 0xF9, 0x00, 0x1A, 0x45, 0xF4, 0x2F, + 0x65, 0x71, 0x8C, 0xD0, 0x9B, 0xFA, 0x0B, 0x7E, 0xDF, 0x29, 0xF1, 0x91, + 0xD5, 0x33, 0xF2, 0x46, 0xC3, 0xBD, 0x30, 0xF8, 0x7E, 0x5A, 0xA7, 0x6A, + 0x19, 0x88, 0xC3, 0xE3, 0x5B, 0x37, 0xA9, 0x4C, 0x4F, 0xB3, 0xBD, 0xB8, + 0x65, 0x57, 0xCB, 0xBE, 0x79, 0x82, 0x88, 0xDA, 0xB5, 0xAA, 0x9A, 0xD3, + 0x05, 0xFA, 0x7A, 0x7B, 0xC0, 0xB9, 0x33, 0xD0, 0xCE, 0x34, 0xEF, 0x43, + 0x41, 0x36, 0x23, 0xD4, 0x9C, 0x1F, 0x35, 0x70, 0xC4, 0x18, 0x87, 0x51, + 0x7B, 0x9C, 0x8E, 0x24, 0x7C, 0x73, 0x9F, 0x6D, 0xD6, 0x4B, 0xFA, 0x22, + 0x1F, 0x99, 0x2E, 0x1F, 0xEE, 0x13, 0xB4, 0xA3, 0xE8, 0xCE, 0xF6, 0xF3, + 0x00, 0x9B, 0xE3, 0xDD, 0x0F, 0x8A, 0xCB, 0xC5, 0x49, 0xB1, 0xCA, 0x3F, + 0x83, 0x96, 0xB4, 0xA3, 0x37, 0x72, 0x43, 0xAD, 0x2A, 0x79, 0xAF, 0x7F, + 0x56, 0x18, 0xB3, 0x95, 0xA2, 0x3B, 0x15, 0x8A, 0x82, 0xFC, 0xED, 0xD1, + 0xA1, 0x81, 0x44, 0x23, 0x88, 0x39, 0x89, 0xD8, 0x11, 0x8F, 0xAC, 0x62, + 0xCB, 0xC9, 0x9F, 0x88, 0x3C, 0xDD, 0xE8, 0x4B, 0xB4, 0xF4, 0x99, 0xC7, + 0x9E, 0xD9, 0xB7, 0xBC, 0x5B, 0x81, 0xD9, 0x0C, 0x1C, 0xA2, 0x8B, 0x36, + 0x3C, 0xE2, 0xA9, 0xD4, 0x81, 0x2D, 0x5D, 0x72, 0x5A, 0xBF, 0xB2, 0x62, + 0x8E, 0x48, 0x74, 0x56, 0xB8, 0xB9, 0x48, 0x04, 0x53, 0xCA, 0x0F, 0x20, + 0x4E, 0x28, 0xD4, 0x0B, 0xC8, 0xE0, 0x3F, 0x09, 0xC5, 0x8F, 0x19, 0x99, + 0xB3, 0x5F, 0xC4, 0xC7, 0x5A, 0x65, 0xD6, 0x1F, 0x27, 0xB0, 0xD2, 0x28, + 0x03, 0x7B, 0xAB, 0x62, 0x6C, 0xAA, 0x78, 0xA0, 0x15, 0x00, 0xE8, 0x0E, + 0xA8, 0x28, 0xAF, 0x1B, 0xCD, 0x1E, 0x5B, 0x09, 0x0E, 0x47, 0x10, 0xA8, + 0x67, 0x32, 0x1D, 0x05, 0x7D, 0xBB, 0x57, 0x81, 0x2B, 0xDB, 0x4B, 0x6A, + 0x4F, 0xBF, 0x9E, 0x51, 0x45, 0xC3, 0xCC, 0x70, 0xC6, 0x9E, 0x70, 0x30, + 0x82, 0x65, 0xCE, 0x23, 0xCD, 0x6A, 0x4F, 0x3B, 0xA5, 0x58, 0x69, 0xFE, + 0x37, 0x27, 0xE6, 0x03, 0x0C, 0x99, 0x8D, 0x31, 0xF5, 0xC0, 0xC8, 0xAC, + 0x73, 0xCC, 0x48, 0x86, 0xC6, 0x4B, 0xC4, 0xE8, 0x13, 0x0A, 0xEE, 0xC0, + 0x18, 0xC8, 0xE3, 0x01, 0x9B, 0x2B, 0xB5, 0x64, 0x06, 0xA9, 0xB6, 0xFD, + 0xC4, 0xC1, 0x5D, 0x42, 0x49, 0xEC, 0x83, 0x53, 0x61, 0xAF, 0x7A, 0x8D, + 0x8C, 0x1F, 0x7C, 0xBE, 0xE5, 0xA1, 0x2B, 0x8E, 0x20, 0x31, 0x4F, 0x37, + 0x6A, 0x88, 0xF8, 0xBF, 0x0C, 0xD9, 0xBA, 0x1B, 0xCB, 0xC7, 0x23, 0x81, + 0x85, 0x47, 0x93, 0xD0, 0xC0, 0x03, 0xBE, 0x2E, 0x3D, 0x89, 0xE3, 0x75, + 0xAB, 0x5B, 0x32, 0x65, 0x83, 0x40, 0xBF, 0x16, 0xA9, 0x25, 0xE5, 0x4A, + 0xFD, 0x86, 0xD2, 0x5F, 0xA0, 0xCF, 0x1F, 0xFF, 0x63, 0xFF, 0x75, 0x2B, + 0xAF, 0x1A, 0x0B, 0x3A, 0x03, 0xE3, 0x2D, 0x04, 0x57, 0xDF, 0x56, 0x6D, + 0x83, 0x61, 0x81, 0xC5, 0xDB, 0x51, 0xDA, 0x70, 0x0B, 0x5D, 0x5B, 0x21, + 0xB6, 0xF4, 0x20, 0x0E, 0x44, 0xFD, 0x7D, 0xA0, 0xD8, 0x5A, 0xF4, 0x16, + 0xF1, 0x69, 0x11, 0x6B, 0x13, 0x8F, 0xB3, 0xEC, 0x1E, 0x0C, 0x7D, 0x63, + 0xBF, 0x96, 0xDD, 0xA2, 0x80, 0x8F, 0xE7, 0x47, 0x57, 0x4B, 0xCA, 0xE5, + 0xF1, 0xB2, 0x66, 0xB5, 0xDC, 0x27, 0x75, 0x72, 0x49, 0x0C, 0x1E, 0x69, + 0x6D, 0x3E, 0x31, 0xC4, 0x36, 0xCA, 0x3C, 0xE9, 0x5B, 0xC5, 0xDA, 0x4E, + 0x28, 0xBA, 0x12, 0x39, 0x40, 0x9E, 0x92, 0x3E, 0x77, 0x60, 0xC7, 0xDF, + 0x0F, 0xE7, 0xDC, 0x3B, 0x97, 0x39, 0xAF, 0x24, 0x49, 0xBA, 0xB0, 0xA2, + 0x44, 0x04, 0x20, 0x3C, 0xE6, 0x40, 0x87, 0x30, 0xC2, 0x27, 0x23, 0x69, + 0x4F, 0xDE, 0x13, 0x94, 0x09, 0x15, 0xDB, 0x39, 0xDC, 0x04, 0x07, 0xE3, + 0x1B, 0x0E, 0xAA, 0x80, 0x0D, 0xA7, 0x58, 0x87, 0xDC, 0x0C, 0xC0, 0xDE, + 0x43, 0x81, 0x70, 0x55, 0x11, 0xC8, 0x69, 0x42, 0xA2, 0x72, 0x35, 0xC4, + 0xB9, 0x51, 0x2A, 0xD9, 0x19, 0xEE, 0x68, 0xE1, 0x86, 0x02, 0x58, 0x24, + 0x8D, 0xE0, 0xF8, 0x0D, 0x19, 0x21, 0x24, 0xF7, 0x23, 0x3D, 0x07, 0xA0, + 0x52, 0xE3, 0xE4, 0x98, 0xA3, 0xFD, 0x25, 0x0C, 0x48, 0x26, 0xC2, 0x97, + 0xEB, 0x73, 0xFB, 0x00, 0x95, 0xF9, 0x12, 0x45, 0xD9, 0xA8, 0x41, 0xFE, + 0xF0, 0xD7, 0x18, 0x7E, 0x6E, 0x9A, 0xFA, 0x78, 0x15, 0xA6, 0x54, 0xB0, + 0x3A, 0x8A, 0xFA, 0x8F, 0xD1, 0xE5, 0x22, 0xB9, 0x19, 0x40, 0xC1, 0x19, + 0xBA, 0x6B, 0xD5, 0x04, 0x67, 0x4E, 0x1C, 0xDA, 0x81, 0x16, 0x22, 0xE8, + 0xB4, 0x7C, 0x99, 0xB7, 0xDD, 0x6E, 0x19, 0x16, 0xAE, 0x11, 0x58, 0xE4, + 0x03, 0xA1, 0xA2, 0x6C, 0xDF, 0xF3, 0x1A, 0x88, 0x4B, 0xAF, 0x3F, 0xA2, + 0xB0, 0x54, 0xE7, 0x68, 0xE1, 0x3B, 0xB7, 0x2F, 0xFC, 0xB3, 0xE6, 0x80, + 0x6F, 0x2B, 0x82, 0x7E, 0x15, 0x6E, 0x61, 0xD3, 0x5F, 0x25, 0xBB, 0xE2, + 0xF4, 0x41, 0xD1, 0xEB, 0x47, 0x8E, 0x50, 0x0F, 0x8E, 0x04, 0x80, 0xB5, + 0xA7, 0x9E, 0xBB, 0x55, 0x03, 0x69, 0x11, 0x98, 0xAD, 0x64, 0x4E, 0x65, + 0x9C, 0xB2, 0x17, 0x2E, 0x0A, 0xD6, 0x4C, 0xD9, 0x55, 0xF1, 0x12, 0x08, + 0xB4, 0xB4, 0x4C, 0xDE, 0xE1, 0x27, 0x15, 0x66, 0x28, 0x27, 0x8E, 0xDE, + 0xCE, 0xF0, 0x86, 0x28, 0x2B, 0x11, 0x0B, 0x45, 0x27, 0x31, 0xE3, 0x3D, + 0x01, 0x71, 0xBD, 0x20, 0x4F, 0xE4, 0x03, 0xBB, 0xFA, 0x1B, 0x63, 0x63, + 0x62, 0x4F, 0x0C, 0x9D, 0x47, 0x27, 0x97, 0x0B, 0x0A, 0x53, 0x4E, 0x08, + 0xDA, 0x55, 0xDD, 0x27, 0xEB, 0x7D, 0x3B, 0x04, 0x2E, 0x29, 0x8E, 0x40, + 0x2F, 0x6B, 0xCC, 0x05, 0xA8, 0x2A, 0x9E, 0x33, 0xF5, 0xB3, 0x82, 0x07, + 0x8D, 0x2B, 0x16, 0xA1, 0x8B, 0x6F, 0xB9, 0x06, 0x67, 0x8A, 0x4B, 0x9B, + 0x7F, 0x92, 0x21, 0x66, 0x5F, 0x83, 0x57, 0x81, 0xD1, 0x71, 0x02, 0x7C, + 0x9E, 0xA1, 0xFB, 0x69, 0xF7, 0x7F, 0x57, 0xA7, 0x49, 0xB3, 0x86, 0xA2, + 0x21, 0x9C, 0x71, 0xB8, 0x39, 0x45, 0x12, 0x42, 0x41, 0xA4, 0xF3, 0x89, + 0x80, 0xF5, 0x13, 0x2F, 0x79, 0xDB, 0xA0, 0x0E, 0xED, 0x9A, 0x6A, 0xA0, + 0x4C, 0x09, 0xC9, 0x92, 0xAC, 0x10, 0x2F, 0x10, 0xDF, 0xE8, 0xCB, 0x1D, + 0x0F, 0x0D, 0xE1, 0x2E, 0x62, 0x99, 0xAC, 0xCB, 0x52, 0xD2, 0x1B, 0xAF, + 0xB6, 0xB0, 0x78, 0xE0, 0x31, 0xDC, 0x6D, 0xBE, 0x7A, 0xF9, 0x02, 0xE1, + 0x48, 0xE5, 0x14, 0xD8, 0x90, 0x9C, 0xE6, 0xE3, 0xF6, 0x6D, 0x7B, 0xF3, + 0xDB, 0x60, 0x00, 0x39, 0x38, 0xAB, 0xE7, 0x17, 0xE9, 0x15, 0xC6, 0x3A, + 0x7D, 0x40, 0xDF, 0xD9, 0x02, 0xDC, 0x83, 0x50, 0x76, 0xB0, 0x12, 0x16, + 0x11, 0x57, 0x1D, 0xC1, 0x22, 0xBC, 0x88, 0x46, 0xCB, 0x13, 0x5D, 0x8F, + 0x8F, 0xED, 0xCD, 0xAE, 0x15, 0xC0, 0x2D, 0xB0, 0x2C, 0xDA, 0xD7, 0x38, + 0x35, 0x29, 0x2D, 0xF5, 0x0E, 0xF0, 0xD5, 0x96, 0x74, 0x80, 0x96, 0xAB, + 0x83, 0xAA, 0xA8, 0xA1, 0x55, 0xB4, 0x90, 0x35, 0x0F, 0x4F, 0x19, 0xF8, + 0x52, 0x8A, 0x81, 0x4A, 0xDB, 0x5F, 0x34, 0x25, 0xF9, 0xBB, 0x48, 0x8B, + 0x66, 0x18, 0x64, 0x32, 0xC2, 0xAE, 0x44, 0x8E, 0x7F, 0xB1, 0x7F, 0x3F, + 0x09, 0x83, 0xB4, 0x21, 0xEF, 0xF6, 0x70, 0xF8, 0xEB, 0xE6, 0x6A, 0xFB, + 0x0B, 0x46, 0x23, 0x05, 0xE8, 0x6D, 0x2B, 0x82, 0x87, 0x89, 0xA6, 0x6D, + 0x53, 0x86, 0xD6, 0xAC, 0x0C, 0xD3, 0x6C, 0x3A, 0x77, 0x4F, 0x7F, 0xDD, + 0x61, 0x47, 0x5C, 0x17, 0x02, 0x79, 0x49, 0x15, 0xCC, 0xE7, 0x33, 0xF8, + 0x01, 0x51, 0x64, 0x43, 0xD7, 0x00, 0x29, 0x15, 0x69, 0xD2, 0xDA, 0xF6, + 0x66, 0xE1, 0x65, 0xCA, 0x40, 0xB5, 0x8A, 0xE1, 0x0B, 0x1D, 0x54, 0x17, + 0xF6, 0x95, 0xD1, 0xFB, 0x21, 0xD9, 0x4B, 0x34, 0xD8, 0x0D, 0x44, 0xB7, + 0xEF, 0x5A, 0x94, 0xFC, 0xED, 0x74, 0x01, 0xED, 0x7B, 0x70, 0x52, 0x8D, + 0xC9, 0xF2, 0x33, 0x61, 0x74, 0x83, 0xC5, 0x4D, 0x72, 0x53, 0xFA, 0x68, + 0xCA, 0xA3, 0x85, 0xEF, 0x8A, 0x7E, 0xEF, 0xEC, 0xF8, 0xAA, 0x22, 0x2D, + 0x53, 0xB2, 0xA5, 0xCE, 0x74, 0x3D, 0xF1, 0x87, 0xCE, 0xE7, 0xA0, 0xAE, + 0xA6, 0x68, 0xB1, 0xA4, 0xE1, 0x3F, 0x60, 0xBC, 0x9A, 0x05, 0xFF, 0x1F, + 0xA4, 0x12, 0x7F, 0xC5, 0xE7, 0x86, 0x18, 0x8A, 0x64, 0x94, 0xDB, 0xFC, + 0xB2, 0x4C, 0xFB, 0x3E, 0x2A, 0xB0, 0xC5, 0x88, 0xFC, 0x00, 0x6A, 0x5E, + 0x33, 0x81, 0xD4, 0x40, 0x12, 0x44, 0xB0, 0x24, 0xA9, 0xE6, 0xFB, 0x95, + 0xEF, 0x56, 0xF2, 0x4B, 0xF0, 0x46, 0x8B, 0xBF, 0xE6, 0x8F, 0x77, 0x90, + 0x0E, 0x3B, 0xDA, 0xCD, 0xDC, 0x6F, 0x78, 0x25, 0x37, 0x23, 0x55, 0x3A, + 0xBA, 0x35, 0x74, 0x41, 0x31, 0xE0, 0x34, 0xFF, 0x89, 0x14, 0x92, 0xCD, + 0x65, 0x6E, 0x22, 0x00, 0x6C, 0xFE, 0x1E, 0x73, 0x5C, 0x59, 0xC6, 0x88, + 0x32, 0xFA, 0xC4, 0x9D, 0x8F, 0xF0, 0x54, 0x6F, 0x64, 0xBC, 0x13, 0x44, + 0x94, 0x04, 0x92, 0xDE, 0x30, 0xCA, 0x9E, 0xE8, 0x20, 0x3A, 0x03, 0x43, + 0xFD, 0xE1, 0x6B, 0x17, 0x09, 0xCC, 0xEC, 0x62, 0x3B, 0x10, 0x8E, 0x79, + 0x64, 0x15, 0x6C, 0x01, 0x09, 0x0F, 0x0D, 0x8E, 0x79, 0xBC, 0xD4, 0xE3, + 0x01, 0x2C, 0xAF, 0x0C, 0xF9, 0x5F, 0x53, 0xB8, 0xB0, 0x7E, 0x6D, 0xB9, + 0x8D, 0x29, 0xC9, 0x3F, 0x1E, 0x82, 0xB8, 0xF0, 0xEB, 0xDD, 0x6A, 0xB4, + 0xB4, 0xAE, 0x74, 0xC6, 0x0B, 0x45, 0x12, 0xEC, 0x9D, 0xDD, 0x79, 0x94, + 0xC1, 0x2D, 0x4D, 0x3C, 0x25, 0x75, 0xA6, 0x2E, 0x7A, 0x52, 0xE1, 0x31, + 0xA4, 0xDD, 0x4E, 0x1B, 0xBC, 0x54, 0x83, 0x50, 0x27, 0xA1, 0xF9, 0xB0, + 0xFF, 0xA1, 0x58, 0x71, 0xAD, 0x72, 0x05, 0xAB, 0x90, 0xEC, 0x99, 0x63, + 0x69, 0x7F, 0x81, 0xF3, 0xED, 0x31, 0x76, 0x52, 0x6C, 0x5D, 0x56, 0xFA, + 0x74, 0x29, 0xFA, 0x40, 0xD7, 0x78, 0x75, 0x29, 0x66, 0x28, 0x46, 0xB2, + 0x01, 0xF6, 0xAE, 0x63, 0x37, 0xA5, 0xF9, 0x9F, 0x0F, 0x08, 0x65, 0x27, + 0x7D, 0x68, 0xB7, 0x28, 0xD6, 0x5F, 0x04, 0x5F, 0xA8, 0x3F, 0x0D, 0x0B, + 0x4E, 0x4B, 0x60, 0x7D, 0xCA, 0xA4, 0x2A, 0x20, 0x5C, 0xD3, 0x0B, 0x58, + 0xFF, 0x65, 0x6F, 0xCF, 0x5A, 0x75, 0x1A, 0xB7, 0x75, 0x62, 0x0E, 0xBF, + 0xFA, 0xD0, 0xBF, 0xB9, 0x14, 0xE9, 0x56, 0xE7, 0x2C, 0x3D, 0x2C, 0x7C, + 0x5D, 0x7E, 0xA8, 0x4B, 0x7F, 0x6B, 0x94, 0x84, 0x17, 0x8C, 0x90, 0x24, + 0x06, 0xFD, 0xE0, 0xCE, 0xD7, 0x03, 0xAB, 0x29, 0x9A, 0xCE, 0x09, 0xAB, + 0xF0, 0x83, 0x20, 0x19, 0xC4, 0x08, 0xB5, 0x74, 0x45, 0x5C, 0xDB, 0x99, + 0xF5, 0x3D, 0x2A, 0x9F, 0x6A, 0xB6, 0x70, 0xBD, 0x6D, 0x9C, 0x8A, 0xF2, + 0x18, 0x64, 0x13, 0x5D, 0x92, 0x09, 0x78, 0xD6, 0x04, 0x2A, 0xFB, 0x75, + 0xF7, 0x0D, 0xDE, 0x95, 0x81, 0x52, 0xB3, 0x69, 0xF0, 0x0F, 0x84, 0xA2, + 0xED, 0x02, 0xB5, 0x79, 0x98, 0x51, 0x66, 0x0B, 0xBD, 0x72, 0x6F, 0xAA, + 0xFE, 0xAA, 0x1B, 0x03, 0x4B, 0x3D, 0x24, 0x52, 0xCA, 0x81, 0x78, 0xFE, + 0x91, 0xAF, 0x33, 0x90, 0x1D, 0x42, 0x9B, 0x1F, 0xE0, 0x26, 0x39, 0x09, + 0x2B, 0xBF, 0x41, 0xDD, 0xB4, 0x99, 0xF6, 0x39, 0x29, 0x5A, 0xF6, 0x20, + 0x46, 0xB2, 0x4C, 0x89, 0xF6, 0x87, 0xF0, 0x91, 0x2E, 0x3C, 0xE0, 0x91, + 0x1E, 0x4F, 0x4E, 0x3E, 0x49, 0xAB, 0x79, 0x55, 0xA5, 0x7D, 0xE7, 0xAA, + 0x35, 0x31, 0x1B, 0xB1, 0x6F, 0x76, 0x30, 0xBC, 0xC6, 0x3E, 0x6C, 0x9B, + 0xAB, 0x99, 0x82, 0xB5, 0xA2, 0x37, 0xBD, 0xAC, 0x37, 0x39, 0xAB, 0xA9, + 0xCC, 0xD9, 0x65, 0xC6, 0x3D, 0x5E, 0x8B, 0x08, 0x0B, 0x0E, 0xAE, 0xA8, + 0x44, 0xFC, 0x30, 0x26, 0x92, 0x3A, 0xAB, 0x9E, 0xB5, 0x16, 0x85, 0xD8, + 0xDA, 0x4E, 0x54, 0x36, 0x69, 0x8E, 0x4D, 0xB6, 0x61, 0x83, 0xAF, 0x46, + 0x5F, 0x17, 0x71, 0xF2, 0x7C, 0xD2, 0x53, 0xD0, 0xD7, 0xC3, 0x52, 0x6A, + 0x8A, 0x18, 0x40, 0xB6, 0x00, 0xD7, 0x0F, 0x41, 0x0B, 0xC1, 0xC5, 0xC0, + 0xA6, 0x98, 0x59, 0x7C, 0x45, 0x19, 0x11, 0xDA, 0x2C, 0xE3, 0xCE, 0x56, + 0x9E, 0xBF, 0x85, 0xCE, 0xFA, 0xE5, 0x68, 0x66, 0x06, 0xE6, 0x57, 0x58, + 0x76, 0xAD, 0xB6, 0xC7, 0xFE, 0x2E, 0x2F, 0xA1, 0x62, 0x7D, 0x8C, 0xB9, + 0xC6, 0xBC, 0xF9, 0x0A, 0x84, 0x1A, 0xB7, 0xF6, 0x5C, 0x75, 0x00, 0x1F, + 0xA0, 0x6B, 0xF9, 0x54, 0x51, 0xB6, 0xBD, 0xA4, 0xC3, 0xDF, 0x25, 0x07, + 0x93, 0x33, 0x6B, 0x8C, 0x7E, 0x7C, 0xC8, 0x16, 0x78, 0x1A, 0xDA, 0xCA, + 0x48, 0x4A, 0x7C, 0x61, 0xAD, 0xEE, 0x08, 0x51, 0xCB, 0xE4, 0x99, 0xB2, + 0x2A, 0x02, 0x6F, 0x0D, 0x86, 0x1C, 0xC1, 0xD5, 0x0C, 0x55, 0x91, 0xDE, + 0x77, 0xF2, 0xE2, 0x96, 0xEF, 0xD7, 0x39, 0x08, 0x42, 0x22, 0x6D, 0x2B, + 0xA0, 0xE4, 0xA1, 0x38, 0x86, 0x4F, 0xE4, 0x1A, 0xF2, 0x30, 0xCB, 0xD9, + 0x38, 0x1E, 0xF0, 0x27, 0xAA, 0x1A, 0xA3, 0xD6, 0x2B, 0xC8, 0xE8, 0x5E, + 0x31, 0xBF, 0xEB, 0x3A, 0x68, 0xF2, 0x98, 0x94, 0xA0, 0x8A, 0x6E, 0x07, + 0x2A, 0x81, 0xE7, 0x01, 0xD3, 0x7C, 0xD8, 0x58, 0x19, 0x96, 0x53, 0xA8, + 0x3C, 0x71, 0x0E, 0x4C, 0xFB, 0x24, 0x7D, 0x63, 0x47, 0x61, 0x90, 0x94, + 0x71, 0x18, 0x38, 0x35, 0x80, 0x03, 0x41, 0xD4, 0x3E, 0xA9, 0x27, 0xAE, + 0xB7, 0x0B, 0x9A, 0xD1, 0xDB, 0xC5, 0x1F, 0x38, 0x88, 0x73, 0xD2, 0x3C, + 0xB0, 0x72, 0x60, 0x5C, 0xFD, 0xF9, 0xD3, 0x3F, 0x90, 0x89, 0x2B, 0xE2, + 0x6C, 0x08, 0x4E, 0xB6, 0x4E, 0xF1, 0x4F, 0x5D, 0x82, 0x3C, 0xC6, 0x08, + 0x96, 0xA3, 0xEB, 0xFF, 0xEC, 0xF4, 0xC5, 0xB1, 0xC7, 0x1B, 0xF3, 0x5E, + 0x67, 0x6F, 0x11, 0xA3, 0xAC, 0x18, 0xF8, 0xF3, 0x0F, 0x6A, 0x64, 0x02, + 0x4F, 0xE2, 0xE4, 0x3A, 0x2A, 0x20, 0x28, 0x5B, 0x5E, 0xAC, 0x83, 0x8C, + 0xA3, 0xF1, 0x67, 0x0D, 0xBA, 0x8E, 0xEC, 0x25, 0xDE, 0x7D, 0xEF, 0xCF, + 0x2C, 0x06, 0x74, 0x9F, 0x9A, 0x38, 0x70, 0x8D, 0xD0, 0x3E, 0xEA, 0x90, + 0x5E, 0xD1, 0xAE, 0xDB, 0x03, 0xC7, 0x8A, 0xEF, 0x55, 0x54, 0x34, 0xB2, + 0x15, 0x6F, 0x17, 0x60, 0x31, 0xE4, 0x32, 0x27, 0xF3, 0x82, 0xAE, 0xFB, + 0x9E, 0x6E, 0x25, 0x4A, 0x96, 0xFE, 0x23, 0x4E, 0xFB, 0x46, 0xFC, 0xB8, + 0x02, 0xAB, 0xD4, 0xD3, 0x1F, 0x0B, 0x23, 0x72, 0x10, 0xAD, 0x6F, 0x13, + 0x56, 0xB4, 0x95, 0x20, 0xD3, 0x5A, 0x48, 0xE0, 0xC4, 0xBB, 0x96, 0x4C, + 0x52, 0xEA, 0x25, 0x9F, 0xAE, 0xFE, 0x49, 0x3A, 0xA2, 0x54, 0x98, 0x53, + 0x06, 0xD3, 0x1A, 0xC2, 0x6C, 0x5A, 0x6D, 0xD7, 0x28, 0xDE, 0x54, 0xDC, + 0xCC, 0x2D, 0x42, 0x48, 0x3D, 0x33, 0xA7, 0x9E, 0xEE, 0x9E, 0xAE, 0xAC, + 0x4D, 0x8B, 0x0D, 0x98, 0x03, 0xF0, 0x4D, 0xF9, 0x40, 0x62, 0x12, 0x38, + 0x34, 0xA4, 0x81, 0xA3, 0x51, 0xA2, 0xDB, 0x76, 0xDD, 0x33, 0xEA, 0x6B, + 0xB1, 0x54, 0x6F, 0xCF, 0x42, 0x6C, 0xAB, 0x9D, 0x15, 0x93, 0x3A, 0x0C, + 0xEA, 0xD0, 0x0B, 0xBB, 0x77, 0xB1, 0xA0, 0x23, 0xDA, 0x15, 0x10, 0xA9, + 0x3E, 0xE6, 0x2F, 0x52, 0x41, 0x57, 0xA8, 0x86, 0xEB, 0x43, 0x96, 0x63, + 0x8D, 0x98, 0xE2, 0xE3, 0x8F, 0x2B, 0xA3, 0xB4, 0xAD, 0x2D, 0xDE, 0x72, + 0xF0, 0x08, 0xBB, 0x19, 0x42, 0xFB, 0xA4, 0x56, 0x13, 0xEF, 0xF5, 0xE0, + 0x6D, 0x2F, 0x9D, 0x87, 0x81, 0x2C, 0xCB, 0xC9, 0x72, 0x21, 0x27, 0xB5, + 0x23, 0xB2, 0x9F, 0xC4, 0x0F, 0x4E, 0xBA, 0x9C, 0xF4, 0x86, 0xBE, 0xC7, + 0x9C, 0xF9, 0x53, 0xA7, 0xE1, 0x99, 0xB0, 0xF0, 0xF9, 0x35, 0x47, 0x00, + 0xB9, 0xC4, 0xED, 0x11, 0x21, 0x5A, 0x48, 0xAE, 0x71, 0xC7, 0xD3, 0xFC, + 0x78, 0xBB, 0x69, 0xEA, 0x9A, 0xEA, 0x60, 0x2A, 0x8D, 0xE8, 0x16, 0x33, + 0x80, 0x2F, 0x38, 0xEF, 0x9E, 0x09, 0x18, 0x2D, 0xCF, 0x0F, 0xD5, 0x23, + 0x8A, 0xF2, 0xE0, 0x2E, 0x68, 0x97, 0x4F, 0x24, 0xCE, 0xD9, 0xD8, 0xC4, + 0xAE, 0xCC, 0x97, 0x56, 0x01, 0x0A, 0x2B, 0x3A, 0x42, 0x6D, 0xB4, 0x04, + 0xA2, 0x4A, 0x78, 0x77, 0x9F, 0xC2, 0x1E, 0x25, 0x2C, 0x2F, 0x69, 0xC1, + 0x3D, 0x4C, 0xB2, 0x8C, 0x9A, 0x02, 0xB8, 0x20, 0x4E, 0xBD, 0x7B, 0x65, + 0xFC, 0x7A, 0xDE, 0x24, 0x30, 0x2A, 0xF2, 0x79, 0xD1, 0x5E, 0x45, 0x7D, + 0x6D, 0x6B, 0x93, 0xDC, 0xF3, 0x2A, 0xF4, 0x40, 0x6B, 0xE0, 0x08, 0x09, + 0xD0, 0x2E, 0x9A, 0xCA, 0x64, 0x42, 0x63, 0xF7, 0x7B, 0x8D, 0x16, 0x49, + 0x8F, 0x02, 0xEB, 0x22, 0xCB, 0x8B, 0xB3, 0xE1, 0x3F, 0x10, 0x89, 0xAE, + 0x02, 0x72, 0xA0, 0x1A, 0x5E, 0xE4, 0xDD, 0x82, 0x72, 0x50, 0x6A, 0x05, + 0xAB, 0x2A, 0xFE, 0xCA, 0x27, 0x4F, 0xF7, 0xC6, 0xBE, 0xDE, 0xC4, 0x7D, + 0x0F, 0xF4, 0x5C, 0x38, 0x50, 0xDC, 0x37, 0xF3, 0x13, 0xCA, 0x54, 0x56, + 0x30, 0x2F, 0xFF, 0xB1, 0xBC, 0xD1, 0xED, 0x19, 0xA4, 0xFC, 0x84, 0xB0, + 0x9E, 0xC3, 0x5A, 0xA7, 0x63, 0x43, 0x7C, 0x8A, 0x06, 0x4D, 0x04, 0x72, + 0x16, 0x6B, 0x22, 0xA6, 0x74, 0x0E, 0x12, 0x47, 0x5E, 0xA1, 0x74, 0x72, + 0xEE, 0x65, 0x95, 0x8E, 0x30, 0x6B, 0xBF, 0x92, 0xE6, 0x3E, 0xA0, 0xB8, + 0x86, 0x55, 0x54, 0xC8, 0x0A, 0x20, 0xA9, 0xE9, 0xAE, 0x5B, 0x47, 0x2E, + 0xCE, 0x0A, 0xD5, 0x4B, 0xAF, 0x22, 0xA0, 0x23, 0x3E, 0x4E, 0x77, 0xA7, + 0x64, 0x01, 0x15, 0x47, 0x28, 0x6A, 0xD1, 0x90, 0xCD, 0x32, 0x74, 0x7A, + 0x02, 0x80, 0xEA, 0x91, 0x2E, 0x6B, 0x22, 0x52, 0x68, 0xC2, 0x40, 0x19, + 0xCE, 0xB7, 0x9A, 0xA2, 0xB3, 0x8A, 0xF5, 0xD8, 0xD8, 0x7B, 0x3E, 0x23, + 0xA9, 0x33, 0x56, 0x06, 0x1C, 0x74, 0x73, 0x93, 0x3E, 0x97, 0x5C, 0x41, + 0x4D, 0x3F, 0xFF, 0x97, 0xD8, 0x94, 0x29, 0xAF, 0x06, 0xD9, 0xC3, 0xF1, + 0xD6, 0x8D, 0xA7, 0xEE, 0xAA, 0x26, 0xF7, 0x4F, 0x43, 0x5E, 0x60, 0x8D, + 0x0B, 0xD5, 0xAA, 0xD9, 0x89, 0x79, 0x04, 0x7B, 0xC3, 0x90, 0x1A, 0xDF, + 0xA7, 0xB1, 0xBA, 0xC5, 0xCA, 0xAB, 0x0C, 0xB8, 0xE8, 0xF0, 0x45, 0xDC, + 0x85, 0xB5, 0x3B, 0xAC, 0xA7, 0xB2, 0x5C, 0x25, 0x52, 0x90, 0x0D, 0x4C, + 0xEF, 0xFF, 0x06, 0x0F, 0xEE, 0x0F, 0x8A, 0xE9, 0x93, 0x60, 0x3D, 0x8D, + 0x47, 0xC7, 0x55, 0xD9, 0x23, 0xAF, 0x77, 0xDB, 0x01, 0x69, 0xBA, 0x3D, + 0x9B, 0x62, 0x74, 0x44, 0x8E, 0x65, 0x40, 0x66, 0x3E, 0xDF, 0x54, 0x45, + 0x8F, 0xF5, 0xA8, 0x8F, 0xD6, 0x51, 0x42, 0xDE, 0x9D, 0x02, 0xDB, 0x90, + 0xD3, 0x93, 0x8C, 0xE0, 0x0E, 0xFA, 0x11, 0xCF, 0xA9, 0xBD, 0x94, 0xDA, + 0x0F, 0x94, 0x33, 0xF7, 0xA8, 0x80, 0x62, 0x61, 0xAC, 0xE6, 0x1E, 0xC6, + 0x80, 0x55, 0x9D, 0x7C, 0x5B, 0xB8, 0xB3, 0x67, 0xBB, 0x69, 0xA6, 0x6D, + 0xE1, 0x42, 0xD6, 0x81, 0x4E, 0x13, 0x68, 0xC0, 0x6B, 0x01, 0xE8, 0x0F, + 0xFB, 0xD4, 0x07, 0x08, 0xC7, 0x33, 0xAB, 0x3A, 0x68, 0x23, 0x14, 0x86, + 0xC7, 0x76, 0x13, 0xD5, 0x38, 0xF6, 0x4C, 0x91, 0x3E, 0x4F, 0x10, 0xC3, + 0x7A, 0xD0, 0x9B, 0xF6, 0x58, 0x42, 0xD5, 0x12, 0x5A, 0xCE, 0x58, 0x1A, + 0xB0, 0xBF, 0x27, 0x96, 0xFA, 0xE5, 0x8C, 0x43, 0xF7, 0xDE, 0xBD, 0x5F, + 0xE3, 0x79, 0x69, 0xDC, 0x57, 0xA5, 0x12, 0x27, 0x77, 0x61, 0x5E, 0x97, + 0xD4, 0x6F, 0xF6, 0x6E, 0x5B, 0x46, 0x98, 0x8F, 0x06, 0xC9, 0x58, 0xAB, + 0x2D, 0x02, 0x8C, 0x93, 0x61, 0x7F, 0xDF, 0x14, 0xB1, 0xEC, 0xFD, 0x97, + 0xFE, 0x80, 0xD5, 0xCA, 0x08, 0x57, 0x23, 0x9F, 0x49, 0x3A, 0xE3, 0x56, + 0xD8, 0x5A, 0x3C, 0x52, 0x5A, 0x4B, 0xC0, 0x8C, 0xB3, 0x79, 0xD7, 0xC4, + 0xFD, 0x48, 0xF3, 0xEA, 0x4C, 0x40, 0xF9, 0x36, 0x15, 0x47, 0x3B, 0x14, + 0x48, 0x51, 0xF0, 0xC6, 0xBB, 0x30, 0xBB, 0x80, 0xA3, 0x5C, 0x6F, 0xBD, + 0xA1, 0x4E, 0xEC, 0x71, 0x52, 0x44, 0x98, 0xB2, 0x82, 0x49, 0x2D, 0xEB, + 0x61, 0x22, 0xEE, 0xFC, 0x60, 0xCB, 0x01, 0x53, 0xAA, 0xFD, 0x9A, 0xC8, + 0x1B, 0xE9, 0xE4, 0x8C, 0x2C, 0x3C, 0xC8, 0x0A, 0x82, 0xCA, 0x3C, 0x92, + 0xB5, 0x96, 0xDA, 0xF1, 0x41, 0x76, 0x8D, 0x19, 0xED, 0x3B, 0xEE, 0x44, + 0xB0, 0xD2, 0xB3, 0xE9, 0xD5, 0x8E, 0xD5, 0x70, 0x67, 0x72, 0xD0, 0x33, + 0x2B, 0xFC, 0x50, 0x83, 0x1A, 0x72, 0xAE, 0xFE, 0xF0, 0x87, 0x07, 0xD7, + 0x19, 0x97, 0xDB, 0x95, 0xEF, 0xDD, 0xBB, 0xEC, 0x3F, 0xC8, 0x08, 0xBB, + 0x87, 0x5C, 0xB2, 0x51, 0x3F, 0xEE, 0x27, 0xF4, 0xA8, 0x2C, 0x6C, 0x3B, + 0x0C, 0xB9, 0x7C, 0xFB, 0x75, 0xA3, 0xAE, 0x1C, 0xFD, 0x1F, 0x99, 0xF2, + 0x5F, 0x30, 0x16, 0x0B, 0x24, 0xB7, 0x02, 0xE5, 0xDD, 0x59, 0x8E, 0x98, + 0x92, 0x1E, 0xDB, 0x6C, 0x6E, 0xCF, 0x51, 0x81, 0xE0, 0xF5, 0x32, 0xAD, + 0x5F, 0xCC, 0xA1, 0x91, 0x5F, 0x2E, 0xAC, 0xA0, 0xB1, 0x9B, 0x2F, 0xAF, + 0x7E, 0x8E, 0x30, 0x76, 0x82, 0xE3, 0x74, 0x01, 0x2C, 0x2C, 0xB3, 0xB3, + 0xAD, 0xC3, 0x3B, 0x2C, 0x45, 0xB3, 0x40, 0x97, 0x4B, 0xEB, 0xFD, 0xC6, + 0x55, 0xD9, 0x66, 0x0A, 0x4F, 0x3F, 0xB4, 0xE6, 0x01, 0x68, 0x9F, 0x20, + 0xEC, 0x97, 0xBE, 0x6C, 0x09, 0xFF, 0x26, 0x09, 0x3D, 0x66, 0x0F, 0x19, + 0x2C, 0xAF, 0xBD, 0xA2, 0xF4, 0xEA, 0xD1, 0xF6, 0x37, 0x64, 0x8A, 0x9E, + 0x9A, 0x79, 0xFC, 0x20, 0xEC, 0x5B, 0x58, 0x74, 0x8A, 0xD7, 0x78, 0x8E, + 0x1F, 0xBF, 0xEC, 0x78, 0xC0, 0x65, 0xE8, 0xD8, 0x4A, 0x72, 0xEB, 0x13, + 0x4C, 0xD8, 0xE9, 0x7B, 0xEC, 0x48, 0x00, 0x33, 0x69, 0x92, 0xDC, 0xE9, + 0xBE, 0xE5, 0xC7, 0xCE, 0x56, 0x2E, 0x9B, 0xD3, 0x4D, 0xFD, 0xE7, 0x68, + 0xE1, 0xCE, 0x18, 0x8D, 0xD0, 0x92, 0x39, 0xE1, 0x69, 0x83, 0x55, 0x54, + 0x62, 0xE8, 0x26, 0x8B, 0xAB, 0xA0, 0xAC, 0xB2, 0xFD, 0xB2, 0xBB, 0xB0, + 0xD4, 0x1B, 0xC8, 0x2F, 0xA8, 0x9E, 0x9B, 0x24, 0x56, 0xB8, 0x6E, 0xEE, + 0x2F, 0x36, 0x2E, 0xD4, 0x2B, 0x9A, 0x2C, 0x00, 0xE1, 0x18, 0x67, 0xD6, + 0x13, 0x35, 0xF2, 0x8F, 0x77, 0x88, 0x36, 0x40, 0x1F, 0x7B, 0x18, 0x6C, + 0x2B, 0xE6, 0x0E, 0x26, 0x30, 0x98, 0x71, 0x20, 0xE1, 0xA5, 0xF4, 0x94, + 0x36, 0xEF, 0x73, 0x52, 0x59, 0xF2, 0x87, 0x67, 0xFD, 0xBA, 0x55, 0x40, + 0xBE, 0x3B, 0x3B, 0x25, 0x89, 0x40, 0x73, 0xBA, 0x60, 0xAF, 0x50, 0xBE, + 0xEA, 0xC3, 0x31, 0x34, 0x32, 0x71, 0xE4, 0xEC, 0x0E, 0x24, 0x9D, 0x46, + 0x56, 0x33, 0xC7, 0x01, 0x94, 0xA5, 0x51, 0xD1, 0xC6, 0xDB, 0xCA, 0x26, + 0x8D, 0x89, 0xAF, 0xA9, 0x89, 0x7F, 0x26, 0xFB, 0x67, 0x92, 0x73, 0x39, + 0x1A, 0x1A, 0x1C, 0x4E, 0xEB, 0x72, 0x68, 0x92, 0x9F, 0x71, 0x35, 0x13, + 0x38, 0x36, 0xF8, 0x0D, 0xBF, 0x95, 0x9F, 0x35, 0x00, 0x79, 0x47, 0x41, + 0x62, 0x23, 0xBA, 0xF4, 0xCA, 0xC6, 0x12, 0x7C, 0x96, 0x9D, 0xB8, 0x40, + 0x4F, 0x7E, 0x31, 0x01, 0x1E, 0xC7, 0xFD, 0x49, 0xB9, 0xC2, 0x2B, 0x35, + 0x24, 0x2A, 0x13, 0x89, 0x62, 0x63, 0xBA, 0x6C, 0xA8, 0x93, 0x6D, 0x99, + 0xED, 0x9C, 0xE9, 0xB0, 0xF1, 0x8C, 0x9D, 0xA9, 0xEF, 0xDE, 0xF0, 0x92, + 0x1A, 0x3B, 0xA9, 0x94, 0x38, 0x87, 0xA2, 0x53, 0x65, 0x31, 0xAE, 0x0C, + 0x96, 0x64, 0xAC, 0xC8, 0xF8, 0x03, 0x65, 0x59, 0x5A, 0xAF, 0xD7, 0x8B, + 0x0B, 0x31, 0xD9, 0x3A, 0x2F, 0x1C, 0xE3, 0x49, 0xF3, 0xFA, 0x80, 0x9D, + 0x34, 0x0D, 0xC0, 0xCE, 0xBB, 0x6E, 0x90, 0x6E, 0xA5, 0xA7, 0x0D, 0xB4, + 0xB8, 0x04, 0x6A, 0xD6, 0x0C, 0x95, 0x79, 0x9E, 0x27, 0x43, 0xDD, 0xD1, + 0x8E, 0x8F, 0xE0, 0x19, 0xB5, 0xBF, 0xD9, 0x25, 0xEE, 0xBB, 0x3E, 0x79, + 0x0D, 0x9E, 0x0B, 0x03, 0x3D, 0x09, 0x9C, 0xF1, 0x02, 0x0A, 0x81, 0x7B, + 0xCE, 0x95, 0x44, 0x99, 0x72, 0xC5, 0x18, 0x4B, 0xD4, 0x9E, 0x5E, 0x8B, + 0x2D, 0x5F, 0x1E, 0x13, 0xF1, 0x95, 0xCA, 0x37, 0x75, 0x49, 0x7D, 0x3A, + 0x1A, 0x22, 0x02, 0xAC, 0x3E, 0xFE, 0x62, 0xF9, 0x59, 0xB7, 0x11, 0x82, + 0xB6, 0x55, 0x82, 0xC7, 0x13, 0xB7, 0x83, 0x8C, 0x1E, 0x90, 0xB4, 0x3D, + 0x9B, 0x57, 0xE7, 0x1F, 0x4E, 0xB1, 0x70, 0xF4, 0x9E, 0x06, 0x3B, 0x97, + 0xF4, 0xC1, 0xBA, 0x3D, 0xAD, 0x50, 0x01, 0x21, 0xBB, 0x0F, 0xE1, 0x60, + 0x49, 0x25, 0x5A, 0x0F, 0xA3, 0x24, 0x33, 0x97, 0xA4, 0xA2, 0x8D, 0xFE, + 0x9E, 0x17, 0x7D, 0x42, 0x3D, 0x40, 0xBB, 0xE5, 0xFB, 0xB2, 0xCA, 0x2C, + 0x93, 0x38, 0x13, 0xEA, 0x5C, 0xEB, 0x53, 0xFD, 0xFE, 0xD1, 0x2C, 0xB8, + 0xF6, 0xE2, 0x0C, 0xDF, 0xFA, 0x93, 0x2C, 0x25, 0x5C, 0x63, 0x07, 0x27, + 0x11, 0x4E, 0x5E, 0xFA, 0xD0, 0x9D, 0x2E, 0xE3, 0x85, 0xA8, 0xC5, 0x8B, + 0x7B, 0xFE, 0xA0, 0x9C, 0xFE, 0xFE, 0xE5, 0x69, 0xD8, 0x59, 0xAA, 0x52, + 0x40, 0x71, 0x6B, 0x1D, 0x51, 0xDA, 0x13, 0x48, 0xEC, 0xCE, 0x1E, 0x2A, + 0xE5, 0x70, 0x66, 0xB1, 0x1F, 0xA6, 0x65, 0x3E, 0x99, 0x8E, 0x4B, 0x4D, + 0x7C, 0x75, 0xB1, 0x46, 0x51, 0x07, 0x6E, 0x31, 0x7E, 0xE7, 0x5D, 0xE7, + 0x66, 0xA6, 0x6F, 0x65, 0x4E, 0xBD, 0xEF, 0x1E, 0xEC, 0x90, 0x36, 0xFA, + 0xDB, 0x73, 0x5F, 0x54, 0x68, 0x9A, 0xFD, 0xD9, 0x3D, 0xF0, 0xDC, 0xD5, + 0xA3, 0xBF, 0x45, 0xBD, 0x24, 0x7D, 0xB5, 0xC4, 0xC5, 0x63, 0x5F, 0xBC, + 0x4C, 0x19, 0x1A, 0xA3, 0x84, 0x71, 0xBD, 0x63, 0x8B, 0x85, 0x71, 0x30, + 0x2C, 0x00, 0x76, 0x90, 0xDB, 0x44, 0xFC, 0x86, 0x40, 0x10, 0x4C, 0x4F, + 0x9E, 0xFB, 0xC9, 0xF3, 0x61, 0xED, 0x6A, 0x37, 0x7F, 0x76, 0x1E, 0x8D, + 0xB2, 0x30, 0x2B, 0xC1, 0x9F, 0x00, 0xF0, 0x54, 0x60, 0x13, 0x74, 0x87, + 0x83, 0x90, 0xCD, 0xF3, 0x78, 0xD7, 0x84, 0xA2, 0xCA, 0x47, 0x7F, 0x10, + 0xD8, 0xC5, 0xEA, 0xA4, 0xA7, 0x53, 0x47, 0xEF, 0x43, 0x44, 0xA4, 0xEB, + 0xD4, 0x73, 0xB9, 0x08, 0xB1, 0x06, 0xD5, 0xD1, 0xF5, 0x9D, 0x92, 0x2C, + 0xA2, 0x6C, 0x69, 0x68, 0xF6, 0xD2, 0xEF, 0x35, 0x1F, 0x91, 0xC8, 0x8F, + 0x78, 0xF5, 0x2D, 0xB4, 0x83, 0x2C, 0x97, 0x3F, 0xF3, 0x51, 0x42, 0xE7, + 0x8C, 0xE0, 0xDC, 0x01, 0x34, 0x66, 0x05, 0x9A, 0x61, 0x6E, 0x90, 0x5F, + 0x0C, 0xCD, 0xC9, 0x74, 0x8F, 0x5B, 0xA0, 0x40, 0xB6, 0xAF, 0x48, 0xAA, + 0xD9, 0xFA, 0x06, 0x6D, 0xCE, 0x4E, 0x0E, 0x62, 0x8E, 0xF3, 0x23, 0xEB, + 0xF5, 0xE5, 0x22, 0x50, 0x74, 0x06, 0x05, 0xA3, 0x00, 0xD7, 0x5C, 0x5E, + 0x68, 0x1B, 0x0F, 0xB1, 0x38, 0xB0, 0x46, 0xE1, 0x7B, 0xB7, 0xA1, 0x0F, + 0x7B, 0x9A, 0xC2, 0xA3, 0x78, 0x03, 0xD5, 0xA7, 0x93, 0xB1, 0x76, 0xE8, + 0xB5, 0x32, 0x8E, 0x5A, 0x2E, 0xA3, 0xCC, 0xC7, 0x6B, 0xAD, 0x88, 0xB1, + 0x7C, 0x68, 0xC8, 0x1A, 0x09, 0xAC, 0x19, 0xA1, 0x7F, 0x00, 0xB1, 0xC2, + 0xAB, 0x1F, 0x81, 0x29, 0x7A, 0x5C, 0xF1, 0x55, 0xF9, 0x96, 0x52, 0x5E, + 0x8C, 0x57, 0x65, 0xDA, 0x5B, 0xC6, 0x0E, 0xB1, 0xC6, 0x0F, 0x50, 0x9C, + 0x61, 0x20, 0x7A, 0x62, 0x68, 0x53, 0x4E, 0xF9, 0x40, 0xA4, 0xD4, 0x66, + 0xF8, 0xC7, 0x0B, 0xE6, 0x09, 0xA6, 0xBD, 0xBF, 0xA3, 0x57, 0x5E, 0xD6, + 0xA1, 0x84, 0x49, 0x05, 0x54, 0x69, 0xC7, 0xA4, 0x67, 0x08, 0x37, 0x3A, + 0xD3, 0xD3, 0x43, 0x8E, 0xD3, 0xD1, 0xBF, 0xBD, 0x6A, 0x8D, 0x3A, 0x14, + 0x76, 0x6F, 0x04, 0xDE, 0x69, 0x0D, 0xD5, 0x07, 0xF4, 0xEA, 0x36, 0x28, + 0x9E, 0x54, 0x47, 0x25, 0x7D, 0x02, 0x54, 0x53, 0xFC, 0x68, 0x72, 0x77, + 0xE4, 0x9E, 0x6B, 0xF7, 0xAC, 0xD2, 0xBF, 0xA7, 0xC5, 0x3C, 0xF6, 0x99, + 0xEB, 0xC7, 0xA3, 0x11, 0x33, 0xB6, 0xB6, 0x62, 0x4A, 0x3B, 0x93, 0xC2, + 0xF6, 0xC7, 0xF1, 0x7B, 0x3F, 0x6D, 0x2D, 0x12, 0x4B, 0x46, 0xC3, 0xC2, + 0xC7, 0x5F, 0xDE, 0xC0, 0xFD, 0x5E, 0xCD, 0x3B, 0xD1, 0x4C, 0x41, 0x77, + 0x0A, 0x77, 0x3A, 0xA8, 0xB1, 0xEF, 0x02, 0x49, 0x54, 0xA2, 0x3B, 0xA7, + 0x79, 0xEF, 0x2B, 0x56, 0x32, 0x7E, 0x81, 0x71, 0xA6, 0x99, 0x53, 0x8D, + 0xBF, 0x07, 0x9A, 0x4B, 0x70, 0x7F, 0x1D, 0x84, 0x99, 0xCE, 0x0C, 0x4F, + 0x7A, 0x99, 0xBA, 0x94, 0x52, 0xFE, 0x06, 0xDE, 0x2A, 0xF1, 0xDF, 0x75, + 0x45, 0x38, 0x25, 0xD9, 0xC4, 0x6A, 0xF1, 0x5B, 0x2B, 0xA3, 0x50, 0x00, + 0x68, 0xE7, 0x9C, 0xBC, 0x90, 0xDB, 0x38, 0xF7, 0xEC, 0xBD, 0xDB, 0x1B, + 0x77, 0xFF, 0xF8, 0xB8, 0xDB, 0xE8, 0xE5, 0x7F, 0x71, 0xF1, 0x9B, 0x83, + 0x98, 0xF3, 0xE2, 0x4E, 0xA6, 0xBD, 0xE7, 0xD7, 0xD2, 0xBF, 0xB1, 0x89, + 0x54, 0x3D, 0x36, 0xF0, 0x4E, 0x85, 0x5F, 0x14, 0xE3, 0x58, 0x5B, 0x24, + 0x86, 0x75, 0x8D, 0x98, 0x0C, 0xBA, 0x5D, 0x26, 0x62, 0xC4, 0xC2, 0x84, + 0xA6, 0xF9, 0x9B, 0x42, 0x0F, 0xA1, 0x8D, 0x39, 0xF1, 0x67, 0xCE, 0xE7, + 0xB8, 0x70, 0x24, 0xB8, 0xE6, 0x82, 0xE8, 0xC7, 0xF6, 0x7B, 0xFE, 0xD8, + 0x38, 0xCF, 0x1D, 0x0D, 0xEA, 0x7D, 0xBB, 0x65, 0x61, 0x9B, 0xFA, 0xA2, + 0xB8, 0xA7, 0x9B, 0xAD, 0x76, 0x0B, 0x93, 0x00, 0x5E, 0x43, 0x10, 0x4A, + 0x5F, 0x22, 0xCA, 0x74, 0x8E, 0xEC, 0x2B, 0xB4, 0x68, 0x44, 0x2C, 0x95, + 0x4A, 0xDA, 0xDA, 0xC5, 0xBE, 0x8B, 0xFF, 0x4C, 0xC2, 0x0A, 0x74, 0xE0, + 0x6E, 0x45, 0xBD, 0xD5, 0x0A, 0x50, 0xB1, 0x33, 0x8D, 0x57, 0xE8, 0xF0, + 0x78, 0x6D, 0x05, 0x2B, 0x9C, 0x56, 0xC7, 0xB7, 0xE4, 0x66, 0xB8, 0x72, + 0x90, 0x92, 0xC0, 0x07, 0x7B, 0x18, 0xB1, 0x14, 0x6A, 0x64, 0xEE, 0xC1, + 0x9F, 0x0D, 0xB4, 0x1D, 0xE7, 0xF1, 0x17, 0x49, 0xB1, 0x84, 0xD9, 0x26, + 0xA5, 0x9A, 0xFA, 0xF1, 0xA3, 0x55, 0xC2, 0xAA, 0xF5, 0xBE, 0x49, 0xF6, + 0x6C, 0x67, 0x93, 0x04, 0x0A, 0xE3, 0xC0, 0xA1, 0x72, 0x8B, 0xE7, 0x05, + 0xEA, 0x70, 0xEF, 0x27, 0xF4, 0xC0, 0xE3, 0xBE, 0x57, 0xA3, 0x66, 0xAF, + 0x83, 0x04, 0x0E, 0xAD, 0x08, 0x77, 0x1F, 0xA4, 0x1C, 0xA5, 0xF5, 0xED, + 0x03, 0xB4, 0x0E, 0xDA, 0xEC, 0xFD, 0x9D, 0x8B, 0x81, 0x5C, 0xDF, 0xAE, + 0x5D, 0xEC, 0x08, 0x94, 0x78, 0xA4, 0x0F, 0x1A, 0x75, 0x0B, 0x32, 0xE2, + 0x9F, 0x0B, 0xDF, 0xD4, 0x5D, 0xFE, 0xF8, 0x43, 0x5E, 0xC5, 0xC0, 0x8C, + 0xBC, 0xAB, 0xDE, 0x33, 0x38, 0xA0, 0x76, 0x86, 0x94, 0xF0, 0xF0, 0x40, + 0xD4, 0x3F, 0x82, 0xED, 0x3F, 0x2C, 0x5A, 0x6F, 0xB3, 0xE9, 0x4C, 0x5D, + 0xE5, 0xAB, 0xD5, 0xAB, 0x89, 0x9D, 0x0A, 0x37, 0x9F, 0xC0, 0x84, 0xF6, + 0x81, 0xB7, 0x9B, 0x5C, 0x1A, 0xC4, 0x40, 0x06, 0x29, 0xC6, 0x62, 0xCE, + 0x07, 0x1B, 0x13, 0xBA, 0x81, 0xDF, 0xEE, 0xF9, 0xD3, 0xE7, 0xC1, 0x9A, + 0x7C, 0x43, 0x0E, 0x83, 0xB0, 0x4E, 0xCD, 0x8E, 0xB4, 0x34, 0xBF, 0xEF, + 0x74, 0x4D, 0xE0, 0xF4, 0xB3, 0x25, 0x93, 0xAC, 0xCE, 0x20, 0x7B, 0x22, + 0x6E, 0xAA, 0x75, 0x14, 0xCA, 0xA8, 0x09, 0x2A, 0xCE, 0xE0, 0x57, 0x5E, + 0x3A, 0xCA, 0xF5, 0x11, 0x5D, 0xC6, 0x08, 0x6D, 0xB1, 0xD8, 0x4C, 0x90, + 0x4A, 0x5A, 0x4B, 0x1F, 0x98, 0xD6, 0x87, 0xF2, 0xD5, 0x82, 0x86, 0x16, + 0xA5, 0x01, 0xEA, 0xFC, 0x78, 0xF3, 0xF9, 0xE2, 0x3C, 0x74, 0xC4, 0xFC, + 0x9B, 0x8D, 0x2C, 0x36, 0x87, 0xE6, 0x57, 0x8C, 0x5D, 0xEA, 0x8F, 0x96, + 0x85, 0x9A, 0xEF, 0x18, 0x34, 0x36, 0xC0, 0x46, 0x7C, 0x77, 0xD6, 0xBF, + 0x25, 0xA2, 0xE7, 0x95, 0xFA, 0x82, 0xDD, 0x11, 0x2B, 0xAC, 0x9D, 0xB8, + 0x7B, 0x21, 0xB7, 0x51, 0xFC, 0x21, 0x24, 0xA5, 0x20, 0xD4, 0x89, 0xF0, + 0xFF, 0x31, 0x1B, 0x3E, 0x29, 0x10, 0x00, 0xFA, 0xEA, 0x6E, 0xA7, 0xA0, + 0x4E, 0x1E, 0x21, 0xDF, 0x7F, 0x84, 0x16, 0x77, 0x8B, 0xF1, 0xFE, 0xAB, + 0x4E, 0xBD, 0xF4, 0xA1, 0x2B, 0xA3, 0x8B, 0x7A, 0x46, 0xF2, 0xD3, 0x92, + 0x23, 0xBB, 0x23, 0x30, 0x10, 0x7A, 0x69, 0x38, 0x6C, 0xBA, 0xF3, 0xBD, + 0xDF, 0xF6, 0xCE, 0xC7, 0x9A, 0xA7, 0x20, 0xB8, 0xE9, 0xE6, 0x14, 0xEE, + 0xFD, 0x3E, 0x89, 0xF8, 0x93, 0x6F, 0x7B, 0xDE, 0xD9, 0xB4, 0x3A, 0xED, + 0xA9, 0x4B, 0x05, 0x2E, 0x4F, 0xE4, 0x07, 0x0F, 0x45, 0x3F, 0x95, 0x62, + 0x6C, 0x4B, 0x23, 0xA3, 0xBF, 0x74, 0x13, 0x16, 0xFD, 0x88, 0xDB, 0xF8, + 0xC6, 0xB1, 0xA6, 0x72, 0x20, 0xCC, 0xE2, 0x67, 0x92, 0x30, 0xE0, 0x2C, + 0xAF, 0xDA, 0xD9, 0x27, 0x92, 0x01, 0x97, 0xAB, 0xBE, 0xCB, 0x2C, 0x0D, + 0x01, 0x67, 0x3F, 0xE3, 0x7A, 0x5B, 0xE0, 0x06, 0x08, 0xB3, 0x25, 0x4E, + 0x78, 0x80, 0x76, 0x67, 0xFB, 0x4C, 0xD0, 0x5E, 0xFD, 0x5A, 0x64, 0xD7, + 0x0C, 0x09, 0xC2, 0x21, 0x57, 0x06, 0x63, 0x5A, 0x59, 0x2E, 0xF1, 0x3F, + 0x09, 0x0D, 0x60, 0xDF, 0xED, 0xDA, 0xA7, 0x75, 0x70, 0xB7, 0xD7, 0x0A, + 0x66, 0x2D, 0xAC, 0xB8, 0x2F, 0xA3, 0x96, 0x19, 0xB0, 0x5B, 0x29, 0x9C, + 0x6E, 0x50, 0xC0, 0x00, 0x14, 0xC5, 0x3B, 0xA3, 0x6C, 0x3A, 0x6A, 0xAB, + 0x97, 0x96, 0x47, 0x72, 0xE7, 0x21, 0x74, 0x8F, 0xD9, 0xB4, 0xCE, 0xDC, + 0x81, 0x6E, 0x48, 0x96, 0x59, 0xB7, 0xC9, 0xF3, 0x99, 0xD0, 0x8D, 0x10, + 0x3B, 0x69, 0xD0, 0xF5, 0xA7, 0x31, 0x9D, 0xA8, 0x36, 0x63, 0xB6, 0xBC, + 0x8A, 0xC9, 0x03, 0x3A, 0xCC, 0xDC, 0xFA, 0x9A, 0xAB, 0x47, 0xC4, 0x19, + 0x83, 0xD6, 0xD3, 0x1F, 0x6E, 0x60, 0xD9, 0xCC, 0x98, 0xE5, 0x53, 0xC6, + 0xC3, 0xE8, 0xA7, 0xF3, 0xB9, 0xF1, 0xAC, 0xA9, 0xB9, 0x05, 0x47, 0x46, + 0x21, 0x3F, 0x0C, 0xCC, 0x60, 0x5C, 0xF8, 0x9E, 0xA8, 0x42, 0x5D, 0xD9, + 0xC8, 0xF3, 0x9E, 0x75, 0xAD, 0x22, 0x68, 0x67, 0x37, 0xF2, 0x8F, 0xD1, + 0x7C, 0x5D, 0x07, 0xD8, 0x69, 0x6C, 0x34, 0xF0, 0x7E, 0x71, 0x47, 0x29, + 0xA1, 0x8D, 0x07, 0x3F, 0x60, 0x75, 0xC8, 0x16, 0xEF, 0x11, 0xE3, 0xFD, + 0x48, 0x35, 0xED, 0xCA, 0x2C, 0x37, 0xCF, 0xEA, 0x37, 0x6D, 0xA0, 0xFF, + 0x7A, 0x46, 0x15, 0x41, 0x6B, 0xE3, 0x40, 0x6F, 0x27, 0x02, 0xA4, 0x2B, + 0x34, 0x0B, 0x07, 0xE3, 0x69, 0x4E, 0xF3, 0xF3, 0xAC, 0x4A, 0xA7, 0xE4, + 0xBB, 0x4E, 0x8E, 0xAF, 0xC0, 0x76, 0x9B, 0xD3, 0xB1, 0x93, 0xF3, 0x87, + 0x38, 0x7B, 0x0B, 0x84, 0xFA, 0xDA, 0x85, 0x32, 0x06, 0x7C, 0xFD, 0x2E, + 0xF0, 0x90, 0x31, 0xAE, 0x3E, 0x9B, 0xBF, 0x0A, 0xDF, 0xA4, 0xA9, 0x3B, + 0x43, 0x16, 0x31, 0x04, 0xD6, 0x2F, 0x9F, 0x7A, 0x79, 0xD5, 0x79, 0x5D, + 0x1C, 0x4A, 0x6A, 0x19, 0x2A, 0xD0, 0x05, 0x69, 0xFE, 0xAC, 0x78, 0x41, + 0xE7, 0xEA, 0xE7, 0xDD, 0x23, 0xA7, 0x7C, 0x59, 0x7F, 0x6B, 0xDA, 0x30, + 0x77, 0x16, 0xE8, 0x02, 0x3D, 0xB4, 0x4D, 0xB3, 0xCC, 0x41, 0x56, 0x05, + 0x1F, 0xD7, 0x07, 0x0B, 0x5B, 0x30, 0x6C, 0x45, 0x7E, 0x41, 0xE4, 0x79, + 0x0B, 0x5A, 0x17, 0xF5, 0xD6, 0x30, 0x9E, 0xAC, 0x2F, 0x6F, 0x99, 0x18, + 0x4E, 0x11, 0x39, 0xF4, 0x29, 0x55, 0x82, 0x08, 0xF8, 0x2D, 0xE6, 0x06, + 0xE8, 0x2D, 0x62, 0xD5, 0x66, 0xB4, 0x5E, 0x62, 0x96, 0x16, 0xA6, 0xD8, + 0x69, 0x04, 0x23, 0x35, 0xD0, 0x4F, 0xA0, 0x7F, 0xC5, 0xE4, 0x49, 0x6C, + 0x64, 0x4A, 0xD8, 0xC3, 0x4D, 0x51, 0xBC, 0x49, 0x12, 0x76, 0x8A, 0xEC, + 0xB2, 0x03, 0x93, 0xB8, 0x2D, 0x42, 0x91, 0x09, 0xAE, 0xC2, 0x50, 0xD2, + 0x72, 0x3A, 0x11, 0x26, 0xF8, 0x43, 0x2A, 0xD5, 0x13, 0x4E, 0x4D, 0x1E, + 0x28, 0xE5, 0xAF, 0xCC, 0xCE, 0x6D, 0x4A, 0x06, 0xB4, 0x2E, 0xF7, 0x40, + 0x89, 0x33, 0x61, 0x11, 0x7A, 0x4C, 0x75, 0xC5, 0x7D, 0x2E, 0xDB, 0x1D, + 0xE7, 0xA0, 0xD7, 0x96, 0xDD, 0x37, 0xF3, 0x48, 0x62, 0xBB, 0xAF, 0xB2, + 0x2C, 0x56, 0x99, 0x20, 0x45, 0x1A, 0x20, 0x96, 0x6F, 0x5E, 0x74, 0x7B, + 0x04, 0xDA, 0x67, 0x05, 0x0F, 0x4D, 0xFC, 0x7E, 0xE0, 0x65, 0x13, 0xDB, + 0x06, 0x5E, 0x50, 0x93, 0xA4, 0xA2, 0x1D, 0x10, 0x7D, 0x61, 0x25, 0x3D, + 0x19, 0xCD, 0xC9, 0x51, 0xE2, 0xF1, 0x6A, 0xBC, 0xCF, 0x7D, 0xB3, 0x0F, + 0x77, 0x98, 0x7A, 0x09, 0x9C, 0x40, 0x03, 0x48, 0x17, 0xE2, 0x75, 0x10, + 0x59, 0xAC, 0x9F, 0x4A, 0xEC, 0x63, 0x0F, 0xD9, 0x3A, 0x75, 0x0D, 0xCD, + 0xD4, 0x4E, 0x7F, 0xA5, 0xE3, 0xFB, 0xA3, 0x5E, 0x0A, 0x6E, 0xD2, 0xD8, + 0x05, 0x3D, 0x84, 0x20, 0x5E, 0xCE, 0xBE, 0xFC, 0x9A, 0x29, 0x85, 0x08, + 0xD6, 0x07, 0x07, 0x4B, 0x01, 0x60, 0x07, 0xE7, 0xF5, 0x83, 0x9E, 0x35, + 0x12, 0xEF, 0xDD, 0xA6, 0x97, 0x51, 0xD1, 0x39, 0x11, 0x22, 0x45, 0xB0, + 0x5D, 0xCA, 0x29, 0x69, 0x12, 0xE3, 0x0C, 0xA7, 0x41, 0x57, 0x99, 0xF2, + 0xD9, 0x05, 0xAD, 0x87, 0xDE, 0xC7, 0x2C, 0xB3, 0x2B, 0x63, 0x87, 0x9F, + 0xC5, 0xEE, 0xAB, 0xF5, 0x2A, 0xF1, 0x9B, 0x54, 0xB6, 0x54, 0xC0, 0x41, + 0x88, 0x6E, 0x54, 0x63, 0x85, 0xD3, 0xFB, 0xED, 0xAD, 0x45, 0xEE, 0x91, + 0xD3, 0x65, 0x4E, 0x5D, 0xF7, 0xE1, 0xF9, 0x56, 0x29, 0x12, 0x9D, 0x3C, + 0xFE, 0x91, 0x76, 0xBE, 0x49, 0xD5, 0x62, 0x61, 0x24, 0x4F, 0x5C, 0x6B, + 0x9A, 0xFC, 0xD2, 0x31, 0x98, 0x24, 0xA5, 0x5A, 0x7A, 0x98, 0xF5, 0x0B, + 0xFE, 0xD4, 0x44, 0xF1, 0xE2, 0x88, 0xE7, 0x00, 0xA7, 0x56, 0xD6, 0xC9, + 0xC8, 0x0C, 0x66, 0x20, 0xCC, 0x92, 0x3B, 0x8A, 0x50, 0x65, 0x09, 0x61, + 0x54, 0x06, 0xA3, 0x7D, 0x73, 0xFB, 0x9E, 0x45, 0xD8, 0x67, 0x0F, 0x79, + 0xF6, 0xF9, 0xAB, 0x72, 0x61, 0xA0, 0x36, 0xE2, 0x95, 0x32, 0x58, 0xE6, + 0x47, 0xA6, 0x53, 0x27, 0x68, 0x36, 0xB5, 0x4B, 0x59, 0x61, 0x08, 0xEA, + 0xE9, 0xE8, 0x0A, 0x24, 0xFD, 0x96, 0x5A, 0x02, 0xDB, 0xC2, 0xB4, 0x88, + 0xF2, 0x15, 0x3C, 0xDC, 0xEF, 0x51, 0x34, 0x43, 0xD2, 0xF4, 0x9D, 0x9E, + 0xD4, 0x5C, 0x98, 0x5B, 0xB2, 0xB8, 0x70, 0x39, 0x26, 0x5E, 0x8D, 0xAD, + 0x9B, 0x37, 0x18, 0xB9, 0x74, 0xAC, 0xC6, 0xD0, 0x07, 0x1D, 0x13, 0x20, + 0x66, 0x36, 0x28, 0x52, 0x62, 0xD9, 0x36, 0x54, 0xAE, 0x14, 0xF4, 0x62, + 0x50, 0xA5, 0x96, 0x9B, 0xBE, 0xB8, 0x33, 0xFB, 0xD3, 0xDC, 0xB3, 0x74, + 0x90, 0x2B, 0x3B, 0xAC, 0x27, 0xD8, 0x83, 0x8E, 0xF9, 0x6D, 0x35, 0x42, + 0xD5, 0x60, 0x46, 0x33, 0x93, 0xF8, 0xB4, 0x77, 0xB0, 0xBF, 0xCD, 0xAE, + 0x33, 0x9C, 0x8A, 0x7A, 0x06, 0x33, 0x05, 0x0C, 0x27, 0x61, 0x30, 0x31, + 0x13, 0xD3, 0x15, 0xB1, 0x7C, 0x23, 0x22, 0x99, 0xFF, 0x47, 0xB4, 0xA2, + 0x1D, 0x39, 0x9A, 0xE1, 0x52, 0xCC, 0x1A, 0x53, 0xF3, 0xA4, 0xE7, 0x2A, + 0x4A, 0x12, 0xE5, 0xA4, 0x8D, 0x0D, 0xC4, 0xA6, 0xFE, 0x4F, 0x45, 0x2D, + 0x2C, 0xA2, 0x64, 0x39, 0x41, 0xA5, 0xC0, 0xB7, 0x84, 0xA5, 0x98, 0x67, + 0x2A, 0xA9, 0x2D, 0x7B, 0xAF, 0x8E, 0xDC, 0xE3, 0x58, 0xAA, 0x17, 0x5B, + 0xC3, 0x69, 0xE7, 0x88, 0x64, 0xB8, 0x72, 0x5A, 0xA5, 0xCD, 0x07, 0x27, + 0x1B, 0xC3, 0x37, 0x99, 0x9B, 0x57, 0xE7, 0x1F, 0x32, 0xED, 0xB5, 0xD6, + 0x39, 0x5C, 0x40, 0x03, 0x6A, 0x20, 0x51, 0xC3, 0x4E, 0x39, 0x9C, 0x5F, + 0x75, 0x2B, 0xFF, 0xCA, 0xA1, 0x43, 0x83, 0xC3, 0xA8, 0x5F, 0x0E, 0xC5, + 0xBD, 0x88, 0xE6, 0xA9, 0x89, 0x07, 0x60, 0xA1, 0x21, 0x76, 0xF7, 0xBE, + 0x65, 0xBC, 0x31, 0x59, 0x88, 0x00, 0xE5, 0xA7, 0xE3, 0x7A, 0x61, 0xE6, + 0x87, 0x5C, 0x4E, 0xD1, 0x29, 0xDE, 0xD6, 0x4B, 0xCF, 0x64, 0x93, 0x31, + 0xE9, 0x72, 0x91, 0x9F, 0xB3, 0x1E, 0x6E, 0x98, 0x1D, 0xF5, 0x8F, 0xFA, + 0xFD, 0x7C, 0xA1, 0x16, 0x39, 0x76, 0x15, 0x52, 0x99, 0x40, 0x5A, 0x2E, + 0x40, 0x71, 0x06, 0x53, 0xA9, 0x85, 0x98, 0x67, 0x5D, 0x38, 0x45, 0x50, + 0xAF, 0xA3, 0x27, 0x46, 0x12, 0xCF, 0x79, 0xC9, 0x20, 0x39, 0xE9, 0x37, + 0xBE, 0xD1, 0xC3, 0x8A, 0xFA, 0x7E, 0x6D, 0x34, 0x79, 0x64, 0x9F, 0x57, + 0x78, 0xF1, 0xD2, 0x61, 0x2E, 0xD4, 0x80, 0x3B, 0xF3, 0x13, 0x9E, 0x05, + 0x18, 0x0A, 0x5C, 0x7B, 0x2E, 0xAA, 0xB8, 0xA6, 0xCB, 0x11, 0x85, 0x48, + 0xBA, 0x78, 0x7B, 0x3A, 0x8E, 0x1A, 0x91, 0xB7, 0x97, 0x61, 0xB5, 0x8E, + 0xEB, 0xD4, 0x46, 0xE1, 0x68, 0x2E, 0x66, 0xC6, 0x8F, 0xF3, 0xCA, 0x29, + 0x5B, 0x7E, 0xAA, 0x22, 0x71, 0xCA, 0x8A, 0xBB, 0xD5, 0x0D, 0x14, 0xA5, + 0x98, 0xD7, 0x63, 0x60, 0xC2, 0x9A, 0x30, 0xD6, 0x5A, 0xE8, 0xCC, 0xFA, + 0xCC, 0x06, 0x08, 0x63, 0x1E, 0x16, 0x4C, 0x3D, 0xF5, 0x68, 0xDD, 0xDC, + 0xE2, 0xFB, 0xDE, 0x3F, 0x90, 0xD6, 0x7B, 0xC5, 0x09, 0xF7, 0x34, 0x5A, + 0x23, 0xA0, 0x45, 0x88, 0x5C, 0x86, 0xA6, 0x12, 0x70, 0x1D, 0xF4, 0x3D, + 0xAE, 0xFC, 0x44, 0xA7, 0xB2, 0xBE, 0x3F, 0xEA, 0xC0, 0xA2, 0x28, 0x6C, + 0x91, 0xA3, 0xB7, 0xE9, 0xF6, 0x8F, 0x60, 0x29, 0xDA, 0x89, 0xF5, 0x95, + 0x85, 0x2C, 0x4D, 0x09, 0xDF, 0x54, 0xC8, 0x96, 0xB5, 0xD4, 0x18, 0xA8, + 0xCC, 0xCD, 0x3F, 0xDF, 0x70, 0x2B, 0xD9, 0x28, 0xBC, 0x51, 0x44, 0x02, + 0x11, 0xE9, 0x5D, 0xDB, 0xF0, 0x25, 0x68, 0xD3, 0x2F, 0x7E, 0x17, 0x0B, + 0x76, 0x31, 0xF9, 0x8E, 0x46, 0x5B, 0x22, 0xB9, 0xB3, 0xBF, 0xDE, 0x24, + 0x06, 0x28, 0x37, 0x2A, 0xB6, 0x3D, 0xBA, 0x4D, 0xD8, 0x8F, 0xE0, 0x5D, + 0x39, 0x52, 0xA0, 0x2F, 0xE1, 0xDD, 0x8B, 0x91, 0x84, 0xC2, 0xDA, 0x38, + 0x2D, 0x61, 0xE0, 0x31, 0x03, 0x8D, 0xE5, 0xCF, 0xDC, 0x74, 0x88, 0x7C, + 0x0C, 0xF6, 0x89, 0x99, 0x73, 0xD1, 0x7C, 0x06, 0xC1, 0x4B, 0xDE, 0xC0, + 0x66, 0x53, 0xB5, 0xA8, 0x2E, 0xF7, 0x03, 0xE6, 0x88, 0x8D, 0xC3, 0x46, + 0x0C, 0xCA, 0xE3, 0x03, 0xA3, 0xEE, 0xA9, 0x4C, 0x3F, 0xAF, 0x81, 0x06, + 0x2C, 0xAF, 0x0D, 0x43, 0x2C, 0xF4, 0x9B, 0x42, 0xC0, 0x7B, 0x8B, 0xE5, + 0x89, 0xB7, 0x43, 0xA2, 0xBD, 0x4E, 0x98, 0x47, 0x74, 0x1B, 0x80, 0xC3, + 0x91, 0x47, 0x11, 0xAA, 0xC0, 0x60, 0x8D, 0x11, 0xFA, 0x5D, 0xC7, 0x1C, + 0x3A, 0x3D, 0xE3, 0xA4, 0x2A, 0xBE, 0x4A, 0xF1, 0x30, 0xD8, 0xCC, 0x66, + 0x14, 0x8D, 0xE1, 0xEF, 0xB5, 0xCE, 0xE7, 0x65, 0xDB, 0xCC, 0xDF, 0xE9, + 0x68, 0x61, 0x2C, 0x20, 0x49, 0x5B, 0xD5, 0x8D, 0x67, 0xAA, 0x32, 0xDF, + 0x12, 0x37, 0x53, 0x3E, 0x84, 0x25, 0xAB, 0x3C, 0x00, 0xD7, 0x71, 0x87, + 0x69, 0xEC, 0x73, 0x62, 0xED, 0x4D, 0x74, 0x1E, 0x1E, 0x28, 0x99, 0x4A, + 0x92, 0x48, 0x88, 0x61, 0x2E, 0x5B, 0x67, 0x0F, 0xA6, 0x43, 0xA7, 0x7F, + 0xE9, 0xC5, 0x87, 0xB5, 0x00, 0xE7, 0xE8, 0xF4, 0x9A, 0x51, 0x6A, 0xA6, + 0xFE, 0xCD, 0x49, 0xED, 0x63, 0x3C, 0x2D, 0x41, 0x31, 0xD0, 0x6D, 0x3E, + 0xCA, 0x31, 0x10, 0x0B, 0x8C, 0xB0, 0x84, 0xF9, 0x55, 0x23, 0x3E, 0x18, + 0x48, 0x7B, 0x93, 0xBF, 0x34, 0x9F, 0x2D, 0x20, 0x24, 0x5A, 0x40, 0x4C, + 0xDF, 0x97, 0xAB, 0xB9, 0xF1, 0x54, 0xCF, 0x35, 0x13, 0xE8, 0x60, 0x74, + 0x21, 0x64, 0xB1, 0xFE, 0xE2, 0x85, 0xD4, 0x4D, 0x4A, 0xA0, 0x74, 0xDD, + 0xC2, 0x03, 0xD7, 0x61, 0x4C, 0x77, 0x0F, 0x38, 0xFE, 0x43, 0xEB, 0xDE, + 0xEE, 0x32, 0x4D, 0x79, 0x50, 0xE6, 0x02, 0x2B, 0x97, 0x4C, 0xAA, 0x46, + 0x31, 0x3A, 0x8D, 0xBD, 0x7F, 0x54, 0x86, 0x0A, 0x51, 0x5D, 0x3D, 0x59, + 0xBB, 0x7B, 0x07, 0x99, 0x0F, 0xF0, 0x63, 0xAD, 0x39, 0x0B, 0x99, 0xDC, + 0x18, 0x2F, 0x01, 0x26, 0x1F, 0x29, 0xF1, 0x81, 0xD9, 0x46, 0x68, 0x13, + 0xC8, 0xE8, 0xC6, 0xE7, 0x7C, 0x66, 0x72, 0xDF, 0x31, 0xEA, 0x13, 0xDF, + 0x3E, 0x88, 0xF7, 0x35, 0xC0, 0x27, 0xF1, 0xC8, 0x04, 0x55, 0x8D, 0xC2, + 0xB3, 0x87, 0x98, 0x51, 0x54, 0x46, 0x0C, 0x63, 0xBE, 0xD0, 0xBA, 0x4D, + 0x6F, 0x1C, 0xDF, 0xD4, 0xB1, 0x76, 0xCA, 0xB2, 0x85, 0xFE, 0x65, 0xE6, + 0xC0, 0x0D, 0x56, 0xBA, 0x2D, 0x99, 0xFC, 0x9B, 0x6D, 0xC2, 0xFE, 0x28, + 0x53, 0xED, 0xE0, 0xF7, 0x20, 0x4D, 0xD7, 0x4D, 0xF6, 0x5D, 0xC6, 0x50, + 0x8D, 0xC1, 0x19, 0xC7, 0x12, 0xF5, 0x53, 0xE0, 0xE8, 0x07, 0xA5, 0x4E, + 0x18, 0xF7, 0x5F, 0xFE, 0x48, 0x00, 0x12, 0x5F, 0x23, 0x4B, 0x80, 0x0D, + 0x43, 0x11, 0xCA, 0xAC, 0xFF, 0x1F, 0xB5, 0x3C, 0x43, 0x23, 0x7D, 0x86, + 0xB3, 0x58, 0x40, 0xF4, 0x42, 0xC1, 0xFB, 0x28, 0xFD, 0x89, 0x6B, 0x9C, + 0x41, 0xE5, 0x60, 0xCA, 0x14, 0x76, 0xAB, 0x35, 0x09, 0x74, 0xF0, 0x89, + 0xBB, 0x47, 0x3C, 0xBC, 0xED, 0x90, 0x5C, 0x75, 0xFE, 0x24, 0xD9, 0x41, + 0x93, 0xE1, 0x98, 0x8D, 0xA7, 0x71, 0xDF, 0x54, 0x4C, 0x62, 0x02, 0x7C, + 0x20, 0x9E, 0xDB, 0x59, 0xBB, 0x90, 0x89, 0x2C, 0x4D, 0x8E, 0x21, 0x25, + 0x5E, 0x6C, 0xD8, 0x2F, 0x4D, 0x03, 0x92, 0xDF, 0xE0, 0xD3, 0x57, 0xAA, + 0x12, 0xA1, 0x84, 0x88, 0x65, 0x25, 0x4B, 0xD6, 0xA1, 0x5C, 0x9F, 0xC0, + 0x6E, 0xCE, 0xD8, 0x49, 0xF6, 0x54, 0x22, 0x99, 0xDD, 0x69, 0x3D, 0x97, + 0x57, 0x71, 0xB1, 0x8D, 0x94, 0xA2, 0x3A, 0x53, 0x6C, 0xEB, 0xB7, 0x90, + 0xEC, 0x4F, 0x9C, 0x35, 0xCC, 0x7B, 0xE1, 0xFD, 0x54, 0xE2, 0xE8, 0xBD, + 0x97, 0xDE, 0x5C, 0xE6, 0x2E, 0xEA, 0x1B, 0x72, 0xFF, 0x30, 0xD5, 0x6F, + 0x94, 0x60, 0x42, 0x52, 0xA7, 0x71, 0xE2, 0xEA, 0xA9, 0xDC, 0xD0, 0xC4, + 0x5A, 0x01, 0x70, 0xFA, 0x04, 0x85, 0x45, 0x30, 0xFF, 0x23, 0x0B, 0x38, + 0xFB, 0xBA, 0x63, 0xAB, 0xA4, 0x50, 0x8F, 0x6A, 0x73, 0xAC, 0xFE, 0x33, + 0x95, 0x23, 0x1C, 0xD8, 0x5F, 0xEF, 0x71, 0xCD, 0x73, 0xC2, 0x84, 0x9E, + 0x7D, 0x81, 0x3B, 0xAE, 0x4D, 0xA8, 0xB7, 0xA8, 0xE8, 0xF5, 0x1A, 0xF0, + 0x02, 0x8E, 0x1C, 0x5E, 0x3F, 0x06, 0xDD, 0x2B, 0xC8, 0x38, 0x07, 0x29, + 0xAF, 0x80, 0xDB, 0x9E, 0xCD, 0x8A, 0x9F, 0x96, 0xB4, 0x3A, 0x94, 0x53, + 0x2F, 0xDA, 0xD8, 0x54, 0x88, 0x73, 0x63, 0x46, 0x73, 0x95, 0xE2, 0xD8, + 0xC5, 0x32, 0x06, 0xE7, 0x7C, 0xB4, 0xC7, 0x04, 0x6B, 0x66, 0xE0, 0x18, + 0xCD, 0x57, 0x45, 0x5D, 0x62, 0x8A, 0x39, 0x4C, 0x5F, 0x6E, 0x2F, 0xFC, + 0x73, 0xFA, 0x9E, 0xBB, 0x23, 0x9E, 0xCB, 0x56, 0x15, 0x6D, 0xF1, 0xDD, + 0x98, 0x1E, 0x33, 0x8E, 0xCA, 0xB7, 0x63, 0x3B, 0x62, 0x69, 0x7B, 0x68, + 0x71, 0xDB, 0x80, 0xA1, 0xD3, 0x9E, 0xBB, 0xC9, 0x0E, 0x90, 0x4F, 0xFA, + 0x61, 0xFC, 0xA3, 0xE1, 0xFA, 0xC3, 0x1F, 0x69, 0xC8, 0x4D, 0xBF, 0xB0, + 0x1F, 0x0C, 0xB2, 0x37, 0x28, 0xEC, 0xF1, 0xF7, 0x42, 0x80, 0xD4, 0x9B, + 0x40, 0x7D, 0xDA, 0x8B, 0x07, 0x60, 0x18, 0x26, 0x5C, 0x42, 0x1B, 0x05, + 0x81, 0x8B, 0xD0, 0xA1, 0x72, 0x3D, 0xCD, 0x44, 0x66, 0xD4, 0xFD, 0x10, + 0xDF, 0x78, 0x4D, 0xF0, 0x61, 0x00, 0x05, 0xC1, 0xEC, 0xF0, 0xE8, 0x73, + 0x58, 0xDE, 0xCF, 0x97, 0xAF, 0x57, 0xFC, 0x07, 0x0B, 0x06, 0x0F, 0xBB, + 0xCD, 0x0F, 0x62, 0x0E, 0x38, 0x80, 0x93, 0x86, 0x95, 0x17, 0x52, 0x22, + 0xAE, 0x1A, 0x3B, 0x55, 0x42, 0xCE, 0xF3, 0xF0, 0xFD, 0x34, 0x2F, 0x7E, + 0x57, 0x71, 0xAF, 0x45, 0x59, 0x3E, 0x65, 0x4C, 0xA6, 0x04, 0x3A, 0x19, + 0x94, 0x00, 0xD4, 0xEE, 0xBB, 0x3F, 0x09, 0x86, 0x57, 0x51, 0xD6, 0x71, + 0x03, 0xA9, 0xDB, 0x56, 0xED, 0x94, 0x8D, 0x75, 0xBB, 0x5A, 0x8D, 0x35, + 0xBA, 0xEC, 0xDF, 0x13, 0x7A, 0xAF, 0x1D, 0x19, 0xBE, 0x2E, 0x60, 0xB8, + 0xED, 0x0A, 0xEA, 0x26, 0xA3, 0x48, 0xF4, 0x8A, 0x71, 0x05, 0x35, 0x5A, + 0x54, 0x74, 0xAA, 0xA9, 0x15, 0x93, 0xEF, 0x0E, 0x81, 0x23, 0xE9, 0x4E, + 0xD1, 0x4E, 0x88, 0xC2, 0x1D, 0xE6, 0x5C, 0xC4, 0x54, 0x2B, 0xAE, 0xB4, + 0xF0, 0xF0, 0x4C, 0x86, 0xBA, 0xB1, 0xDD, 0x00, 0xEC, 0xF6, 0x7E, 0x6F, + 0x3F, 0x45, 0xA7, 0xA7, 0x09, 0x58, 0x49, 0x22, 0xBC, 0xB4, 0x0C, 0x33, + 0x21, 0xD6, 0x07, 0x44, 0x3C, 0xBA, 0xFE, 0xF8, 0xF8, 0x2B, 0xAE, 0x33, + 0x5B, 0xE7, 0xF9, 0x67, 0x68, 0xE3, 0xED, 0x40, 0x28, 0xF5, 0xFD, 0x5C, + 0xE5, 0x25, 0x20, 0x04, 0x29, 0x9B, 0xC1, 0xDD, 0x51, 0xEC, 0x57, 0x56, + 0x16, 0xA7, 0x4C, 0x3D, 0x80, 0xAE, 0x62, 0xFE, 0xBB, 0x2D, 0x17, 0x51, + 0x00, 0x01, 0x79, 0x53, 0xD7, 0x70, 0xFA, 0x89, 0xEB, 0xB5, 0x37, 0x92, + 0x03, 0x9C, 0x88, 0xC0, 0xA6, 0x62, 0x14, 0xB2, 0x0D, 0x22, 0xC8, 0xDC, + 0x43, 0x17, 0xF8, 0x72, 0xFE, 0x0B, 0x88, 0xD6, 0x96, 0x7A, 0xB5, 0xF3, + 0xC4, 0x6F, 0xEF, 0xA5, 0x87, 0xB7, 0x8A, 0xAD, 0x46, 0xCD, 0xFF, 0xF2, + 0x38, 0x14, 0xD8, 0xD4, 0xD4, 0xC5, 0x9A, 0x5D, 0x38, 0x3D, 0x44, 0x53, + 0xF3, 0x43, 0x79, 0x3F, 0xCD, 0xC2, 0x93, 0xB5, 0x34, 0x4F, 0x5E, 0xFA, + 0x4D, 0x64, 0x61, 0x39, 0x0A, 0xDC, 0x8D, 0xB5, 0xD3, 0x82, 0xFD, 0x53, + 0xAD, 0x9B, 0xC6, 0x79, 0x24, 0x09, 0x91, 0x8F, 0x61, 0x25, 0x07, 0x21, + 0x97, 0x73, 0x98, 0x98, 0xB5, 0x46, 0xD1, 0xFB, 0xCE, 0x91, 0xF4, 0xC6, + 0x39, 0xC7, 0xBE, 0xBF, 0x65, 0x97, 0x59, 0x27, 0x08, 0xDA, 0x30, 0x7D, + 0x05, 0x6D, 0x04, 0xD8, 0xA2, 0xDA, 0x52, 0xFA, 0xC2, 0x6B, 0x37, 0x21, + 0xEC, 0x03, 0xEE, 0x4D, 0x89, 0xA7, 0x81, 0x54, 0x1A, 0xB0, 0x2B, 0x3E, + 0xA7, 0xE0, 0x54, 0xF6, 0x5A, 0xD6, 0x4E, 0xA2, 0x23, 0x1D, 0x1E, 0xE2, + 0x46, 0x89, 0x20, 0xB5, 0x63, 0x44, 0xF1, 0xF5, 0x50, 0x6E, 0x5E, 0xD1, + 0x6A, 0x34, 0xA8, 0xA1, 0xE8, 0xC4, 0x17, 0xE8, 0x4F, 0xC8, 0x2E, 0x64, + 0x37, 0xC6, 0xEC, 0xDC, 0x65, 0x88, 0x38, 0x4A, 0xBF, 0x61, 0xC0, 0x8D, + 0xC6, 0xEE, 0xFA, 0x77, 0x66, 0xE5, 0xD1, 0x0C, 0x92, 0xC8, 0xD8, 0xE9, + 0x9B, 0xD6, 0x96, 0xB9, 0x93, 0x86, 0xB7, 0x40, 0x02, 0x7F, 0xD5, 0x5D, + 0x63, 0x53, 0x59, 0xCF, 0xBB, 0xD1, 0xE9, 0x3D, 0xF1, 0x2C, 0xC0, 0xAE, + 0xAD, 0xFC, 0x66, 0xC2, 0x0E, 0x13, 0x76, 0x2B, 0xA6, 0xB0, 0xDB, 0x31, + 0x89, 0x7D, 0xFE, 0x79, 0xAA, 0x49, 0xB1, 0x9A, 0xC1, 0xF0, 0x39, 0x05, + 0x08, 0x1C, 0x1F, 0xFC, 0xA8, 0xDC, 0x19, 0x3F, 0xDA, 0x26, 0x09, 0x11, + 0x7D, 0xAD, 0x8D, 0x55, 0xC3, 0x53, 0x61, 0x17, 0x74, 0x21, 0x7B, 0x0E, + 0xFC, 0xBF, 0xB5, 0x5B, 0xDC, 0x2B, 0x8F, 0x05, 0x40, 0x31, 0x05, 0xB9, + 0xF5, 0x9E, 0x25, 0x3D, 0x92, 0x4E, 0xDD, 0x8B, 0x41, 0x63, 0xC1, 0x7A, + 0x48, 0xCA, 0x8A, 0xE2, 0xA4, 0xFA, 0xB0, 0x81, 0x2F, 0x2A, 0x57, 0x8D, + 0x18, 0xE3, 0x34, 0xCD, 0x3F, 0x16, 0x7D, 0x69, 0x4E, 0x27, 0x84, 0x62, + 0xDD, 0x0C, 0x37, 0x81, 0x79, 0xB0, 0x79, 0x38, 0x46, 0xEF, 0x8B, 0xA7, + 0x2A, 0xC1, 0xCA, 0x67, 0xB6, 0xF7, 0x8B, 0xB9, 0x77, 0x93, 0x8F, 0x55, + 0x76, 0x10, 0x1C, 0x27, 0x92, 0x94, 0xCA, 0x67, 0xD1, 0xD4, 0xB8, 0x96, + 0xEF, 0xD1, 0xD2, 0x32, 0xF4, 0xD7, 0x86, 0x9C, 0xBE, 0xBA, 0x8E, 0x05, + 0xDA, 0x4B, 0x3D, 0x4A, 0x7E, 0x09, 0xE8, 0x0C, 0xE7, 0x53, 0xCB, 0x16, + 0xA1, 0x9E, 0x56, 0xCD, 0xD8, 0x6C, 0x14, 0x4C, 0x19, 0x01, 0xEE, 0x5E, + 0x03, 0x34, 0xB0, 0x3E, 0x30, 0x6E, 0x97, 0x75, 0x7F, 0x2B, 0xF2, 0xBA, + 0xB1, 0x84, 0x76, 0x79, 0xC7, 0x6E, 0x46, 0x79, 0xC1, 0x3B, 0x2F, 0x18, + 0x18, 0xDF, 0xBC, 0xAE, 0xFC, 0x1D, 0xE2, 0xB6, 0x77, 0x72, 0x5D, 0x04, + 0x1E, 0x46, 0x20, 0xFF, 0x78, 0x9A, 0x64, 0xF9, 0xE8, 0x36, 0x19, 0x19, + 0xBC, 0xF6, 0x54, 0x84, 0xAA, 0x8F, 0xB9, 0x7E, 0x06, 0x40, 0xF6, 0x96, + 0x0A, 0xD9, 0x01, 0x1B, 0x6C, 0xCC, 0x0D, 0x63, 0x9C, 0x0A, 0x13, 0xF0, + 0xC6, 0x16, 0x4D, 0xC2, 0x9F, 0xAF, 0x6B, 0x07, 0x96, 0x94, 0x69, 0x5A, + 0x90, 0x43, 0x51, 0xAE, 0xD3, 0x90, 0x10, 0x66, 0xEE, 0x94, 0xA1, 0x6C, + 0x42, 0x9F, 0x67, 0x1C, 0x85, 0x86, 0xBC, 0x81, 0xF7, 0x88, 0x30, 0xB8, + 0xCA, 0x47, 0xA2, 0x08, 0xC1, 0x99, 0x9A, 0x86, 0x79, 0x51, 0x12, 0xCD, + 0xE1, 0x69, 0xAE, 0xD2, 0x2C, 0xF8, 0x81, 0x92, 0x68, 0x3B, 0xDB, 0xDA, + 0xFA, 0x98, 0x29, 0x84, 0x1C, 0xF0, 0xFD, 0xA1, 0xDA, 0x90, 0x6D, 0xB3, + 0x78, 0xD2, 0x04, 0x1D, 0xD1, 0x9B, 0xBF, 0x0C, 0x15, 0x36, 0x9D, 0xC6, + 0xB4, 0x4D, 0xB5, 0x93, 0xD9, 0xDF, 0xBC, 0x3A, 0x16, 0x2A, 0x07, 0x3C, + 0xB0, 0x43, 0x95, 0x6E, 0x1E, 0x65, 0x09, 0x8D, 0x0D, 0x34, 0x45, 0x0E, + 0xD9, 0x3E, 0x52, 0x69, 0x91, 0xC1, 0x90, 0xCA, 0x8E, 0x33, 0x02, 0xD3, + 0x54, 0xB5, 0x61, 0xE8, 0xC6, 0x53, 0x01, 0x49, 0x4D, 0x0B, 0xAC, 0x3A, + 0x95, 0x1B, 0x70, 0x43, 0x62, 0x6B, 0xD8, 0x37, 0x6C, 0xE7, 0xAE, 0x94, + 0xE5, 0xE0, 0x1D, 0xE8, 0x1B, 0xC1, 0x52, 0x2A, 0x6B, 0x50, 0x32, 0xDE, + 0xF7, 0xF8, 0xCE, 0x49, 0x3E, 0xE5, 0x74, 0x29, 0x33, 0x75, 0xF0, 0x63, + 0x8A, 0x40, 0xE3, 0x13, 0x8F, 0xEB, 0x08, 0x24, 0xB2, 0x5A, 0x7A, 0xA9, + 0xD0, 0x1F, 0xCE, 0x8A, 0x84, 0xBA, 0x8C, 0x4F, 0x10, 0x78, 0xAE, 0x64, + 0xC3, 0xC3, 0x9A, 0x88, 0x59, 0xD2, 0xCD, 0x6E, 0xC2, 0xBC, 0x71, 0xEF, + 0xDF, 0xAA, 0xD4, 0x52, 0xF9, 0x1B, 0xCC, 0x17, 0x51, 0x46, 0x7E, 0xB6, + 0x0F, 0x77, 0x25, 0x3F, 0x23, 0x3B, 0xD9, 0xA7, 0x82, 0x6A, 0xB4, 0x12, + 0x30, 0x96, 0x27, 0x47, 0x9D, 0x70, 0xD6, 0xE9, 0x86, 0xFA, 0xBD, 0x9D, + 0x96, 0xE3, 0x30, 0x0C, 0x1E, 0xBD, 0xD9, 0xEA, 0x1E, 0x50, 0x18, 0x7F, + 0x7E, 0xBE, 0xAE, 0x8E, 0x11, 0xEA, 0xDE, 0x17, 0x97, 0x9D, 0x60, 0x2B, + 0xA2, 0x44, 0x1B, 0xCE, 0xC5, 0x3E, 0x68, 0x88, 0x1B, 0xDE, 0x0E, 0xFB, + 0xD2, 0xDA, 0x30, 0x1E, 0x75, 0x70, 0x84, 0x19, 0xBD, 0x50, 0x8C, 0x9B, + 0x46, 0x7F, 0xF4, 0x27, 0x19, 0xBF, 0x5C, 0xFC, 0xE3, 0xCF, 0x18, 0x9D, + 0xD1, 0x32, 0x39, 0x28, 0x1E, 0xCD, 0x47, 0xD4, 0x38, 0xB1, 0xF8, 0x06, + 0x4B, 0xC7, 0x45, 0x0B, 0x09, 0xA4, 0xE2, 0xF1, 0xC4, 0xA9, 0x00, 0xEA, + 0x44, 0xF5, 0x75, 0xCA, 0x9F, 0xD1, 0x3F, 0xCE, 0x4D, 0xD0, 0x42, 0x79, + 0x95, 0x76, 0xD9, 0x7C, 0xEF, 0x0A, 0xC6, 0x31, 0x82, 0xCC, 0xEA, 0x59, + 0x4B, 0x43, 0xD5, 0xB6, 0x1D, 0x05, 0x5E, 0x59, 0xA7, 0x21, 0x45, 0x0D, + 0x65, 0x57, 0x38, 0x76, 0x22, 0x39, 0x8A, 0x5D, 0xC8, 0x94, 0xE0, 0x51, + 0x19, 0x68, 0x1E, 0x58, 0x5F, 0xB0, 0xBA, 0xC3, 0x55, 0xB4, 0x86, 0x18, + 0x24, 0xDE, 0x2C, 0x8E, 0xE2, 0xB6, 0x67, 0x04, 0xD0, 0x3B, 0x84, 0x22, + 0x50, 0xDB, 0x04, 0x1E, 0xE0, 0x17, 0x5F, 0xF0, 0xC7, 0xFE, 0x02, 0x17, + 0xD0, 0x0C, 0x9D, 0x49, 0x00, 0x54, 0x79, 0xA0, 0xD0, 0x9B, 0xBF, 0xC2, + 0xCE, 0x5E, 0xCC, 0xDE, 0x65, 0xF4, 0x62, 0x72, 0x7D, 0x33, 0x08, 0xF9, + 0x26, 0x22, 0x84, 0xEE, 0xC8, 0x35, 0xD7, 0x42, 0x31, 0x8F, 0x5C, 0x23, + 0xAA, 0x37, 0xC1, 0x79, 0xB0, 0xAD, 0x1E, 0x3A, 0xE3, 0x1C, 0x16, 0x49, + 0x4D, 0xEA, 0xB0, 0x0A, 0x06, 0xD3, 0x56, 0x33, 0xD6, 0xDE, 0x3E, 0xF3, + 0x64, 0xE2, 0xB6, 0xF2, 0xAC, 0xA5, 0x41, 0xDD, 0x8E, 0xDA, 0x3E, 0x56, + 0x91, 0x66, 0x1B, 0x80, 0xC3, 0x2D, 0xAB, 0x84, 0xC6, 0xBF, 0xDD, 0x10, + 0x36, 0x21, 0x65, 0xE5, 0xBE, 0x2B, 0x54, 0xCC, 0x6F, 0xE0, 0x70, 0xE5, + 0x7A, 0x73, 0xC7, 0xF9, 0x8F, 0xB2, 0xEC, 0x1E, 0xD6, 0x5E, 0x55, 0x74, + 0xC5, 0x19, 0x9D, 0x40, 0x13, 0x7C, 0xD4, 0x85, 0x10, 0xD5, 0x1D, 0x8C, + 0x8F, 0x27, 0x68, 0xBC, 0x76, 0x9E, 0x14, 0xFF, 0x5D, 0xEA, 0x8B, 0xCB, + 0x16, 0xBE, 0x4F, 0xFB, 0x02, 0xAC, 0x97, 0x0F, 0x3E, 0xBD, 0xD0, 0x1A, + 0xCB, 0x93, 0xD8, 0x98, 0xBD, 0x15, 0x26, 0x91, 0xB9, 0xD0, 0xC6, 0x8D, + 0x6B, 0x91, 0x82, 0x4A, 0x10, 0x77, 0xFA, 0x04, 0x60, 0xCC, 0xEB, 0x76, + 0x15, 0x5D, 0x96, 0xE6, 0x16, 0x19, 0x73, 0xD2, 0xB9, 0xDD, 0x25, 0xF7, + 0xFB, 0xFD, 0x7A, 0xEC, 0x1D, 0xA4, 0x5D, 0x3E, 0xAE, 0xBA, 0xEB, 0x84, + 0x1D, 0x73, 0xD4, 0xE4, 0xB5, 0xBC, 0x0D, 0x79, 0xC5, 0xF6, 0xA3, 0xE9, + 0x02, 0x64, 0x96, 0x65, 0x7A, 0x23, 0xDE, 0xFD, 0xEE, 0x22, 0x24, 0xFD, + 0x1A, 0x39, 0x37, 0xD0, 0x51, 0xEB, 0x35, 0x3D, 0x30, 0x90, 0xE4, 0x70, + 0x6A, 0x58, 0xB7, 0x9A, 0xE6, 0xB0, 0xAE, 0x7C, 0x64, 0x61, 0x42, 0x74, + 0x0C, 0xF3, 0x9D, 0xCC, 0x40, 0x92, 0x23, 0xC1, 0x25, 0x2E, 0x07, 0x0E, + 0x76, 0x0C, 0x4C, 0x3C, 0xA4, 0x2A, 0xE7, 0x1A, 0x91, 0xDE, 0x15, 0xF0, + 0xF4, 0x08, 0x95, 0x77, 0x58, 0x4B, 0xF2, 0x45, 0xBE, 0x7C, 0xE4, 0x51, + 0x57, 0x24, 0x92, 0x8D, 0x5F, 0x50, 0xA6, 0x77, 0xFA, 0x9E, 0xB4, 0xA2, + 0xF9, 0xBA, 0x31, 0x37, 0xD8, 0x2D, 0xAF, 0xCB, 0x47, 0x98, 0xB3, 0x68, + 0xA0, 0xB7, 0xCA, 0x2F, 0x79, 0xBA, 0xB7, 0x8D, 0x53, 0xB3, 0xAB, 0xDC, + 0x4E, 0x47, 0x2F, 0x35, 0x4B, 0xC7, 0xAA, 0x64, 0x49, 0x9B, 0xB2, 0x92, + 0x85, 0x43, 0x10, 0xE6, 0x84, 0x8B, 0xF5, 0xAE, 0x77, 0x28, 0x30, 0x46, + 0xF4, 0xFC, 0xEE, 0x46, 0x78, 0x71, 0xE1, 0xDA, 0xAA, 0x33, 0x23, 0x98, + 0x5E, 0xF0, 0xA5, 0x41, 0x75, 0x4B, 0xC9, 0xBD, 0x4B, 0x91, 0x38, 0xEF, + 0x5B, 0x5D, 0x29, 0x9F, 0xAE, 0x95, 0x5F, 0xDB, 0x60, 0xDD, 0xB9, 0xBE, + 0x4D, 0x7D, 0xA0, 0xA4, 0xAC, 0x9F, 0x65, 0x6A, 0xFA, 0x81, 0x01, 0xCF, + 0x8F, 0xE2, 0x2C, 0x27, 0x64, 0x3A, 0x4D, 0x23, 0xC7, 0x7B, 0x4F, 0xCF, + 0xA1, 0xDC, 0x0E, 0x21, 0x82, 0x2B, 0xD8, 0x51, 0x8B, 0x35, 0x81, 0x87, + 0x9F, 0xFD, 0x05, 0xC5, 0x17, 0xAF, 0x99, 0x3D, 0x2B, 0x28, 0x2D, 0x82, + 0x3A, 0x13, 0x68, 0x31, 0x21, 0x66, 0x53, 0xDB, 0x07, 0x45, 0xBD, 0x24, + 0x52, 0xAA, 0xC6, 0xD4, 0x70, 0x24, 0xB1, 0x67, 0x9A, 0x94, 0xEA, 0xF0, + 0x6B, 0x67, 0x99, 0xDD, 0x4F, 0x11, 0x73, 0xD2, 0x04, 0xBE, 0xB5, 0x77, + 0xFB, 0xA2, 0x31, 0xCC, 0xD4, 0x1E, 0x91, 0x02, 0xD2, 0x62, 0xF6, 0xB1, + 0x32, 0x36, 0x12, 0xF8, 0x4D, 0x1D, 0x47, 0x10, 0xA8, 0x65, 0x34, 0x71, + 0x48, 0x9E, 0x22, 0x2B, 0xA2, 0x4F, 0xF9, 0x2B, 0xEB, 0x0F, 0x31, 0x80, + 0x7E, 0xCA, 0x4A, 0xCF, 0x37, 0x08, 0x21, 0x1D, 0xBA, 0xD9, 0x32, 0x14, + 0x3E, 0xEF, 0x6C, 0xFE, 0xB7, 0xA3, 0x56, 0x07, 0x62, 0x50, 0xA5, 0x23, + 0xB4, 0x45, 0x9C, 0x51, 0xDF, 0xEB, 0x93, 0x1D, 0x4E, 0xFF, 0x29, 0xB2, + 0x50, 0xF0, 0x2A, 0xEF, 0xEE, 0x73, 0x9B, 0x51, 0x69, 0x34, 0xAE, 0xF7, + 0x4A, 0x4C, 0x06, 0x9D, 0x20, 0xC7, 0x12, 0x3F, 0x31, 0xBB, 0xBC, 0xD3, + 0x27, 0xA9, 0x89, 0xC7, 0x42, 0x1F, 0x2E, 0x60, 0xEC, 0x29, 0x0D, 0x11, + 0x88, 0xFC, 0xB4, 0x31, 0x08, 0xDD, 0x69, 0x15, 0xF1, 0x64, 0x25, 0x52, + 0x46, 0x07, 0xAE, 0x35, 0xAA, 0x46, 0x89, 0x3A, 0xEA, 0x7F, 0xDC, 0x69, + 0x9F, 0xD6, 0xF1, 0x3C, 0xDC, 0x6D, 0x00, 0x09, 0x95, 0x9D, 0x72, 0x50, + 0xE7, 0xD7, 0xAC, 0x7D, 0x3D, 0xFD, 0x1D, 0x06, 0x38, 0xAD, 0xD7, 0x7A, + 0xEC, 0x06, 0x0F, 0x2F, 0x3F, 0x4F, 0xD2, 0xC2, 0xAA, 0x30, 0x92, 0x18, + 0x93, 0xE0, 0x65, 0xD9, 0xD8, 0x01, 0x48, 0xFD, 0xC1, 0xA3, 0xE4, 0xBD, + 0x21, 0x05, 0x45, 0xA0, 0xCD, 0xDC, 0x87, 0x29, 0x6E, 0xE1, 0x77, 0x98, + 0x4D, 0x09, 0x79, 0xB2, 0x62, 0x51, 0x73, 0x7B, 0x61, 0x14, 0x1D, 0x41, + 0xA0, 0x92, 0xB9, 0x6E, 0x32, 0xA7, 0xD1, 0x68, 0xFB, 0x6D, 0x4C, 0x88, + 0x3D, 0x7A, 0x54, 0x85, 0x49, 0x7C, 0x24, 0xD9, 0xFF, 0xC7, 0x07, 0x9C, + 0xEF, 0xF6, 0x16, 0x6A, 0xB6, 0x1B, 0xB4, 0x23, 0x71, 0x40, 0x3B, 0x0F, + 0xE6, 0xC6, 0x35, 0x6E, 0x3B, 0xC7, 0x8F, 0xCE, 0x08, 0xFF, 0x6A, 0x94, + 0xCB, 0xB9, 0xA5, 0x21, 0x30, 0xAC, 0xE1, 0xE6, 0xB1, 0xDB, 0x31, 0x84, + 0xB3, 0x5A, 0x41, 0x9F, 0x10, 0x21, 0x68, 0xCF, 0xED, 0x6B, 0xB4, 0xCF, + 0xAB, 0x6E, 0xA2, 0x05, 0xF1, 0xF1, 0xEC, 0xE8, 0x29, 0xF4, 0xD9, 0x95, + 0x61, 0xC2, 0x2A, 0xCC, 0xFE, 0x9B, 0x8D, 0x5B, 0x94, 0x60, 0x96, 0x51, + 0x02, 0x3D, 0xB4, 0x0F, 0xC6, 0x51, 0x05, 0x7F, 0xFB, 0x4E, 0x4D, 0x21, + 0x38, 0xBF, 0xDD, 0x2E, 0x2A, 0xB0, 0x85, 0xC8, 0x16, 0xB9, 0x78, 0xAB, + 0xE1, 0xA0, 0x54, 0x0E, 0x19, 0x86, 0xCD, 0x39, 0xBF, 0x73, 0x38, 0xFF, + 0xD3, 0x2F, 0xF9, 0xEB, 0x21, 0xB7, 0x9F, 0x96, 0x8C, 0x15, 0x44, 0x06, + 0xEE, 0x04, 0x04, 0xAD, 0x3C, 0xCA, 0x2D, 0xB6, 0xAF, 0x8F, 0x6B, 0x11, + 0xE4, 0x12, 0x46, 0x2A, 0x4A, 0x9B, 0x2F, 0x8F, 0x66, 0xEB, 0x2B, 0xA1, + 0xF7, 0x65, 0x92, 0x14, 0x78, 0xF9, 0xA4, 0x5A, 0x8A, 0x33, 0x92, 0x87, + 0x75, 0x9F, 0x0A, 0x27, 0x53, 0xC8, 0xB1, 0xD5, 0xAB, 0xA2, 0x56, 0xB7, + 0x8D, 0xA4, 0xA7, 0x2F, 0x95, 0xA8, 0xC5, 0xC6, 0xB0, 0xBE, 0xAF, 0x68, + 0x99, 0x2D, 0x86, 0x01, 0x31, 0x6A, 0x7A, 0xE3, 0xDD, 0x87, 0x03, 0x31, + 0x57, 0x33, 0x31, 0x49, 0x12, 0x90, 0xEB, 0x1A, 0x3C, 0x67, 0x2C, 0x60, + 0xB8, 0xC4, 0x2C, 0x6A, 0xD2, 0x1C, 0xF5, 0x0E, 0x2E, 0x71, 0x1A, 0x14, + 0x25, 0xE0, 0xAA, 0xE2, 0xD7, 0xB7, 0x9D, 0xCE, 0xDA, 0x12, 0x0C, 0x9D, + 0x85, 0x37, 0x0E, 0xF3, 0x8B, 0x9D, 0xBF, 0xE7, 0xFB, 0xAC, 0x5D, 0x3D, + 0x00, 0x72, 0x4C, 0xB9, 0xEE, 0x7B, 0xF7, 0xA6, 0xC9, 0xD4, 0xE6, 0x27, + 0x24, 0x31, 0xD0, 0x56, 0x58, 0x4B, 0x00, 0x02, 0xA0, 0x2A, 0xDA, 0xBB, + 0x23, 0x43, 0x87, 0x8F, 0xC0, 0xB4, 0x87, 0x6F, 0xD4, 0xF8, 0x0F, 0x38, + 0x6E, 0x82, 0xFC, 0xE2, 0x1E, 0xD5, 0x96, 0x05, 0xD1, 0x1A, 0x95, 0x1B, + 0xE6, 0xC1, 0xF0, 0xA1, 0x8A, 0x0F, 0xF0, 0xD4, 0x2D, 0x03, 0x5D, 0x2F, + 0xCD, 0xF4, 0x0A, 0xFF, 0xBB, 0xD2, 0x79, 0x06, 0xAA, 0x65, 0xF1, 0x4D, + 0x8E, 0x6E, 0x24, 0x08, 0x6D, 0xA5, 0x66, 0x84, 0x28, 0x25, 0xE2, 0xC1, + 0xA8, 0xFB, 0x6F, 0x2E, 0x99, 0xC1, 0xA8, 0x99, 0x16, 0xF8, 0xCD, 0x5F, + 0xF5, 0x41, 0xFB, 0xD1, 0xC7, 0xA6, 0xF4, 0x2F, 0x4A, 0xAE, 0x36, 0xF8, + 0x9D, 0x23, 0x62, 0x5C, 0x3C, 0x62, 0xD4, 0xF5, 0x52, 0x46, 0xDE, 0x28, + 0xB5, 0x7D, 0xFD, 0x25, 0xB4, 0x51, 0x70, 0xB3, 0x5D, 0x56, 0x92, 0x51, + 0x8C, 0x4B, 0x69, 0xE8, 0x34, 0x66, 0x41, 0x4E, 0x22, 0x72, 0x82, 0x1A, + 0xEB, 0xDE, 0x59, 0x5B, 0x3C, 0x0E, 0x66, 0x7F, 0xB6, 0xC8, 0x07, 0x2F, + 0x82, 0x89, 0xDA, 0xC4, 0x8E, 0xC4, 0x70, 0xA1, 0xEA, 0xD3, 0xA9, 0x28, + 0xFE, 0x9B, 0xCA, 0xE8, 0x89, 0xD1, 0xE0, 0xC6, 0x36, 0x91, 0x09, 0x98, + 0x4F, 0x28, 0x9B, 0x10, 0x4B, 0x89, 0xDB, 0xC4, 0xCA, 0x60, 0x57, 0xA0, + 0x0F, 0x04, 0x3F, 0x1B, 0x75, 0xAE, 0x5A, 0x9F, 0x0A, 0xFB, 0xCC, 0x6F, + 0x46, 0xE8, 0xC1, 0xB0, 0x98, 0x1D, 0x6B, 0xC3, 0x3C, 0xEA, 0x83, 0x5E, + 0xBF, 0x21, 0x5E, 0x28, 0x3C, 0x8E, 0xF4, 0x6B, 0xAA, 0x3F, 0x0E, 0xBC, + 0xB5, 0xAD, 0x65, 0xEF, 0xA3, 0xB1, 0x73, 0x3C, 0x55, 0x52, 0xB6, 0xBC, + 0x5E, 0xA4, 0xC6, 0x27, 0x88, 0xEB, 0x34, 0xB1, 0x61, 0x5F, 0x03, 0x20, + 0x66, 0x95, 0x9B, 0xC6, 0x94, 0xC1, 0x65, 0xAA, 0x8E, 0x4E, 0x41, 0xB4, + 0xB2, 0x45, 0x04, 0x42, 0xA0, 0xC3, 0xB1, 0xD2, 0x46, 0x0A, 0xFE, 0x4A, + 0xDD, 0xC3, 0xC0, 0x01, 0x6A, 0x3F, 0xAF, 0xF5, 0xDE, 0x92, 0xC3, 0xF0, + 0xEC, 0xDF, 0x69, 0xEC, 0x25, 0x1F, 0x43, 0x4E, 0x87, 0x80, 0xF9, 0xD7, + 0x54, 0x92, 0x8E, 0x02, 0xCC, 0xF0, 0x46, 0x79, 0x9C, 0x2A, 0x5F, 0xCF, + 0x24, 0x3F, 0x7F, 0xD3, 0x2F, 0xBE, 0x71, 0x51, 0xCD, 0xAC, 0x73, 0xD5, + 0x60, 0x44, 0x7E, 0x96, 0xE6, 0x5F, 0xFD, 0x08, 0x46, 0x17, 0x10, 0x3A, + 0x71, 0xF6, 0x8E, 0xAF, 0x6E, 0xFC, 0x4E, 0x05, 0xD1, 0x43, 0xC0, 0xF1, + 0x77, 0xEE, 0x02, 0x94, 0x8D, 0x84, 0x32, 0xB5, 0x7E, 0x40, 0x3F, 0xF9, + 0x74, 0xF1, 0x5B, 0xCC, 0xDA, 0xB5, 0x48, 0xEC, 0x5A, 0xEC, 0xC0, 0x1D, + 0x50, 0x9D, 0x86, 0x6F, 0xBF, 0x42, 0xAE, 0xEE, 0x93, 0x46, 0xEF, 0xEC, + 0x0F, 0xFE, 0x13, 0x37, 0x7D, 0xD3, 0xF4, 0xAF, 0x7F, 0x6F, 0x62, 0x61, + 0xA3, 0x1A, 0xD1, 0xEF, 0x8D, 0xCF, 0x9E, 0xE3, 0x46, 0x8A, 0x9F, 0x35, + 0x3A, 0xB4, 0xBC, 0xA7, 0x9F, 0x3F, 0x90, 0x16, 0x66, 0xBB, 0x6B, 0x5B, + 0x47, 0xF9, 0xD5, 0x80, 0x53, 0x26, 0x69, 0x0F, 0x0E, 0x5D, 0xAD, 0x3E, + 0x42, 0x75, 0xD1, 0x65, 0x62, 0xDD, 0xBB, 0xBB, 0x0F, 0x2B, 0x11, 0xCC, + 0xEE, 0x1D, 0x47, 0x2E, 0xD7, 0x83, 0x71, 0xCE, 0x24, 0x1C, 0xA4, 0xC3, + 0xA1, 0x0C, 0x9F, 0x99, 0x51, 0x59, 0x39, 0x8F, 0x24, 0xDA, 0x16, 0xA1, + 0x1A, 0xE3, 0x69, 0x07, 0x27, 0x5B, 0xAA, 0xA7, 0x24, 0xA2, 0xEB, 0x2B, + 0x49, 0x29, 0x21, 0xA0, 0xA3, 0xC9, 0x0D, 0xC7, 0xB5, 0x0D, 0xDF, 0xA3, + 0xED, 0xD8, 0x37, 0x97, 0x47, 0x56, 0xAB, 0x6E, 0x8C, 0x64, 0xE3, 0xDC, + 0x2F, 0x1C, 0x0F, 0x44, 0x71, 0x23, 0xF7, 0x59, 0x26, 0xAB, 0xDA, 0x8C, + 0x7D, 0x5A, 0x80, 0x15, 0x2D, 0xA0, 0x92, 0x5C, 0x6A, 0x8F, 0x07, 0x88, + 0x14, 0xED, 0xAE, 0x56, 0x35, 0xF4, 0x3E, 0xBF, 0x69, 0x84, 0xE0, 0xAE, + 0x60, 0xB9, 0xF6, 0x8A, 0x2B, 0x53, 0x22, 0xCE, 0x1C, 0x95, 0x85, 0xBC, + 0xEC, 0xE4, 0xE3, 0xE2, 0x96, 0xC0, 0xCF, 0xA5, 0x5D, 0x25, 0x0C, 0x85, + 0x51, 0x2A, 0xC5, 0x38, 0x25, 0x97, 0xDC, 0x7C, 0x14, 0x39, 0x1F, 0xB4, + 0x3C, 0xBF, 0x65, 0x0F, 0x41, 0xD1, 0xE5, 0x81, 0xCA, 0xF3, 0xB7, 0x1C, + 0xC5, 0xC4, 0xC0, 0xB8, 0xBB, 0xCE, 0x39, 0x7C, 0x2E, 0x1F, 0x27, 0xAD, + 0x16, 0x8A, 0x69, 0x69, 0x1D, 0x3B, 0x89, 0x4E, 0xC3, 0x28, 0x1C, 0x1B, + 0x47, 0x98, 0xA3, 0xDB, 0xC9, 0x69, 0x6E, 0x11, 0xD6, 0xA0, 0x08, 0x74, + 0x8B, 0x37, 0x4B, 0x66, 0x7A, 0x12, 0x70, 0x35, 0x84, 0x38, 0x27, 0x8F, + 0xAC, 0xC9, 0xFF, 0xFC, 0xC2, 0x1A, 0x0F, 0x58, 0x8E, 0x7E, 0xF1, 0xCD, + 0x73, 0x74, 0x09, 0x57, 0x24, 0xBC, 0xA3, 0x0B, 0xBD, 0x6D, 0x8E, 0x63, + 0x09, 0x15, 0xBD, 0x7F, 0x09, 0xDA, 0xE1, 0x06, 0x34, 0x0B, 0x74, 0xB8, + 0xB8, 0x9D, 0x8A, 0xFA, 0x4E, 0x1E, 0xF4, 0x6A, 0x8C, 0x4C, 0xD6, 0x34, + 0x3F, 0x82, 0xD2, 0x84, 0xD5, 0xDA, 0x2D, 0xDB, 0xCD, 0x9F, 0x2A, 0x1D, + 0xE8, 0x24, 0x43, 0xEC, 0x94, 0xCF, 0x51, 0xBF, 0x48, 0x50, 0xC5, 0x71, + 0x73, 0x78, 0x35, 0xD9, 0x98, 0x1E, 0xCF, 0x96, 0x02, 0x74, 0x29, 0xE9, + 0x30, 0x02, 0x5B, 0xEC, 0x66, 0xD8, 0xD0, 0xB6, 0x4D, 0x33, 0x3F, 0x2A, + 0xF4, 0x2A, 0xC6, 0xAD, 0x82, 0x9A, 0x1D, 0x62, 0xE2, 0xDA, 0x05, 0xE7, + 0x8C, 0x69, 0xCB, 0xB4, 0xB8, 0xD9, 0xEB, 0x7D, 0x49, 0xD6, 0x5E, 0xDD, + 0xA5, 0x85, 0xB5, 0x3F, 0x08, 0xEB, 0x33, 0xA6, 0x2D, 0x68, 0x17, 0xF2, + 0x20, 0x3D, 0xEC, 0xAC, 0x71, 0x8C, 0x51, 0x7A, 0x20, 0x05, 0x63, 0xF3, + 0x7A, 0x98, 0x4A, 0x26, 0x2E, 0xEC, 0xD1, 0x9B, 0x50, 0x7D, 0xEB, 0x37, + 0xD3, 0xD9, 0x21, 0x6B, 0x97, 0x06, 0x9F, 0x10, 0x0A, 0x8B, 0x56, 0x6D, + 0x7B, 0x78, 0x9D, 0xF6, 0x89, 0x8B, 0xDF, 0x7B, 0x21, 0xF0, 0x55, 0x85, + 0xF8, 0x23, 0xAB, 0xEA, 0x5A, 0xF8, 0x0C, 0xB8, 0xB9, 0x13, 0xDA, 0xCC, + 0x0A, 0x35, 0x21, 0xAF, 0x78, 0x87, 0x33, 0x78, 0x89, 0x39, 0x1E, 0x15, + 0xD7, 0x14, 0x49, 0xC9, 0x14, 0x60, 0x39, 0xAC, 0x4C, 0x76, 0x64, 0xD7, + 0xCF, 0x8A, 0x4A, 0xDA, 0xF7, 0x20, 0xCD, 0x46, 0xB4, 0x3B, 0x20, 0x60, + 0x43, 0x6B, 0x52, 0xD9, 0x20, 0x10, 0x8A, 0xF9, 0xF7, 0x34, 0xDA, 0x5E, + 0xCF, 0xD1, 0xCC, 0x60, 0x31, 0xF8, 0xE5, 0x5C, 0xF5, 0xC8, 0xCB, 0x3C, + 0xF6, 0x63, 0xD4, 0x26, 0xA1, 0x41, 0x71, 0xCD, 0x73, 0x97, 0xBF, 0x27, + 0x2A, 0x2C, 0x0C, 0x75, 0x6D, 0x4A, 0xA0, 0x8A, 0x0D, 0x02, 0x53, 0xBA, + 0x72, 0xA3, 0xE0, 0xE6, 0x1A, 0x85, 0xC5, 0xD7, 0xF1, 0x49, 0x4F, 0x24, + 0x16, 0x35, 0x3F, 0x0C, 0x2B, 0xCE, 0x9C, 0x35, 0x0F, 0x23, 0xA3, 0x7C, + 0xCE, 0xC8, 0xED, 0x34, 0x2C, 0xCC, 0x33, 0x0A, 0x73, 0xA3, 0x58, 0x53, + 0x78, 0x55, 0xD1, 0xC2, 0x08, 0xCA, 0x03, 0xBE, 0x6E, 0x1D, 0x9C, 0xD2, + 0x67, 0x71, 0x4D, 0x77, 0x9A, 0x63, 0xA1, 0x7C, 0x31, 0x11, 0x3D, 0xDE, + 0xE0, 0xDC, 0x0D, 0x06, 0xDD, 0xAF, 0x16, 0x65, 0xF6, 0xF0, 0x27, 0x28, + 0x9A, 0xBA, 0xED, 0xE2, 0xC2, 0x27, 0x2B, 0x74, 0x2D, 0xF8, 0x6E, 0xE1, + 0x0C, 0xB2, 0xC7, 0xBF, 0xD3, 0x0A, 0x94, 0x0E, 0x3A, 0xE1, 0x04, 0x34, + 0x97, 0xA7, 0x7E, 0x01, 0xA0, 0x31, 0x89, 0x86, 0x05, 0x28, 0x84, 0x0C, + 0x3E, 0xB5, 0x22, 0x26, 0x6E, 0x52, 0xFD, 0x3B, 0x39, 0x5B, 0xB7, 0xEC, + 0x49, 0x50, 0x21, 0xA6, 0x58, 0x20, 0x50, 0x11, 0x5D, 0x9E, 0xFF, 0xF5, + 0x93, 0x74, 0x39, 0x24, 0xBD, 0xBA, 0x5A, 0xB5, 0x4E, 0x35, 0xEB, 0x13, + 0x31, 0x04, 0x3D, 0xAD, 0xBE, 0xBB, 0x43, 0x24, 0xC1, 0x8F, 0x2A, 0x43, + 0x6D, 0x85, 0x6C, 0x8E, 0x78, 0x6A, 0x7F, 0xE3, 0x5C, 0xE4, 0xC1, 0x4A, + 0x68, 0x46, 0xC4, 0xA4, 0xEB, 0x8A, 0xB0, 0xFB, 0x02, 0xE9, 0x76, 0x49, + 0x0C, 0x90, 0x3F, 0x4F, 0x79, 0x39, 0xA9, 0x93, 0x61, 0x66, 0x4F, 0x60, + 0x8A, 0x5C, 0x91, 0xCC, 0x2D, 0x2D, 0x43, 0xCD, 0x38, 0xE7, 0x6B, 0xE1, + 0xA5, 0xA9, 0x53, 0xC9, 0x0E, 0xBB, 0x36, 0x10, 0x2C, 0xDF, 0x2E, 0xB5, + 0xD1, 0x81, 0xCC, 0x4F, 0xAF, 0x77, 0x21, 0xFC, 0xA8, 0xFB, 0x78, 0x3D, + 0xF0, 0x16, 0x76, 0xCF, 0x97, 0x67, 0xE8, 0x2B, 0x29, 0x00, 0x93, 0xAF, + 0x60, 0x66, 0x38, 0x0C, 0x4A, 0xED, 0xAA, 0xA7, 0x89, 0x3F, 0xE8, 0x40, + 0x9D, 0x02, 0xA7, 0xB7, 0x95, 0x51, 0xBE, 0x57, 0x45, 0xC5, 0x7E, 0x1E, + 0xAD, 0x09, 0x6C, 0xD9, 0x81, 0x56, 0xA2, 0x92, 0x72, 0x17, 0xD2, 0x86, + 0x62, 0x7A, 0x62, 0x0A, 0xAE, 0xEC, 0x0D, 0x27, 0x35, 0x40, 0xFA, 0xAE, + 0x78, 0xEA, 0x70, 0xD4, 0xF0, 0xDA, 0xCD, 0x87, 0xF5, 0x9D, 0x5F, 0x83, + 0xCB, 0x3B, 0x07, 0x52, 0xD0, 0xA2, 0xB4, 0x22, 0x8E, 0xDF, 0xAA, 0xF6, + 0xAB, 0x31, 0x91, 0x90, 0xBE, 0x21, 0xF9, 0x7D, 0x87, 0x23, 0x1C, 0x59, + 0x00, 0x05, 0xF5, 0x4F, 0x9B, 0xBB, 0x6D, 0x50, 0x7E, 0x56, 0x6B, 0x3E, + 0xAE, 0x9B, 0x6F, 0xAB, 0x88, 0xEC, 0xAE, 0x0F, 0x6C, 0x89, 0xAB, 0x26, + 0x6B, 0x5A, 0xD9, 0x6D, 0xF1, 0x23, 0x9E, 0xB3, 0xEB, 0x97, 0x08, 0xF0, + 0x0E, 0x5C, 0x80, 0x00, 0xCD, 0x7A, 0x4F, 0x64, 0xF9, 0x1A, 0x80, 0x0D, + 0xFA, 0x3D, 0x42, 0x71, 0x39, 0x83, 0x15, 0x8A, 0xFF, 0x91, 0x9F, 0x80, + 0x0F, 0x67, 0xAA, 0xBB, 0xB0, 0x67, 0x45, 0x30, 0xDD, 0x86, 0x8C, 0x1D, + 0xF7, 0x7A, 0xB3, 0x28, 0xA1, 0xD6, 0x56, 0x63, 0xD2, 0x75, 0x10, 0xF0, + 0x77, 0x53, 0x1A, 0x95, 0x9A, 0x49, 0xD7, 0x3E, 0xAA, 0x24, 0x92, 0x02, + 0x92, 0xF5, 0x7D, 0x2F, 0x8F, 0x24, 0x36, 0x11, 0x59, 0xCF, 0x62, 0xA6, + 0x69, 0xCD, 0xB5, 0x66, 0x75, 0x20, 0x16, 0x41, 0xC1, 0x4F, 0xE5, 0x81, + 0xC4, 0xC2, 0x91, 0x69, 0xC0, 0xF1, 0xA3, 0x01, 0x6B, 0xA9, 0x0F, 0x55, + 0x2D, 0x29, 0xD7, 0x1D, 0xDD, 0x7D, 0x9E, 0xCF, 0xF5, 0x05, 0xFA, 0x7C, + 0x1F, 0x8B, 0xC9, 0xCA, 0x34, 0x66, 0xEF, 0x3C, 0x24, 0x9A, 0xAE, 0xCF, + 0xCB, 0x12, 0xB1, 0xE5, 0x59, 0xD9, 0x30, 0x90, 0xB3, 0xA7, 0xE9, 0x38, + 0x9A, 0x73, 0x1C, 0xDE, 0xBE, 0x62, 0x77, 0x5E, 0x75, 0xBF, 0x37, 0x39, + 0x27, 0xBA, 0x91, 0xEB, 0xED, 0xAB, 0xB5, 0xCE, 0x8E, 0x6E, 0xBD, 0xD4, + 0x64, 0x64, 0x47, 0x16, 0x14, 0x98, 0xC6, 0xF0, 0xB6, 0x4A, 0xE8, 0xB7, + 0x67, 0x86, 0xC5, 0xCB, 0xCE, 0xB1, 0x7B, 0xC0, 0xDE, 0x87, 0xF7, 0x8E, + 0xE7, 0x21, 0x3A, 0x86, 0xB5, 0x9C, 0x38, 0xBA, 0x60, 0x98, 0xFA, 0x93, + 0xBA, 0x63, 0xE3, 0x0F, 0x74, 0xB1, 0x6B, 0x39, 0x68, 0xB6, 0x53, 0xB1, + 0x8A, 0xBB, 0x76, 0x65, 0x74, 0x1D, 0x99, 0xBA, 0x01, 0x8A, 0xE3, 0x7C, + 0xC0, 0x73, 0x2A, 0x98, 0x13, 0x0E, 0x22, 0xB4, 0xF6, 0xC4, 0xF9, 0x89, + 0xAF, 0x9B, 0x52, 0x6F, 0x28, 0xEC, 0x8E, 0x13, 0xC4, 0xD4, 0x97, 0x74, + 0x2E, 0xDB, 0x6F, 0xA8, 0x41, 0xE3, 0xDC, 0x6A, 0xE4, 0xB8, 0x18, 0x2C, + 0x19, 0x59, 0xE1, 0x45, 0xC5, 0xED, 0x8F, 0xCA, 0x24, 0x2A, 0x3F, 0xAD, + 0xDA, 0x98, 0xC1, 0x70, 0x7F, 0xF3, 0x87, 0xE1, 0xB8, 0xBC, 0xF5, 0xFB, + 0x29, 0x7B, 0x12, 0x26, 0x22, 0x1A, 0x5B, 0x59, 0x21, 0x21, 0x79, 0x30, + 0xA7, 0x69, 0x13, 0xD9, 0x9E, 0x62, 0x02, 0x77, 0x84, 0xB9, 0x87, 0xD3, + 0xCB, 0x0E, 0xB0, 0x73, 0x58, 0x21, 0xFE, 0x18, 0x6A, 0x92, 0x94, 0x30, + 0xEC, 0x06, 0x11, 0xB9, 0xC8, 0x99, 0x6B, 0xE9, 0xFE, 0x44, 0x9D, 0x04, + 0xBA, 0xC9, 0x92, 0x7E, 0x46, 0x7B, 0x81, 0x4A, 0x70, 0x79, 0x56, 0x7F, + 0x39, 0x96, 0x58, 0xC6, 0x35, 0x8A, 0x8F, 0x98, 0x47, 0xF8, 0xD9, 0x16, + 0x81, 0xC1, 0x79, 0x43, 0x08, 0xF9, 0x4A, 0xC7, 0xBA, 0x31, 0xCA, 0xC3, + 0x0D, 0xEA, 0x71, 0x40, 0x42, 0x2E, 0x29, 0xF2, 0xB1, 0x96, 0xFB, 0xC0, + 0x98, 0x3B, 0x2F, 0xB2, 0x8D, 0x82, 0xBA, 0xB0, 0x8D, 0x3D, 0x78, 0x10, + 0xF2, 0x33, 0x55, 0xD2, 0x02, 0x98, 0x3A, 0xF3, 0x43, 0x8F, 0x8D, 0x27, + 0xD0, 0x1B, 0x50, 0x04, 0xB2, 0xA8, 0x42, 0x36, 0xE7, 0xD9, 0x2B, 0x4A, + 0x33, 0x9E, 0xBF, 0x46, 0x12, 0x17, 0x82, 0x89, 0xEA, 0xAA, 0x35, 0x7F, + 0x3C, 0x6B, 0xEC, 0xC2, 0x84, 0x33, 0xAB, 0x10, 0x25, 0x59, 0x0F, 0x2B, + 0x90, 0x3F, 0xF4, 0x2A, 0x97, 0x6F, 0xD5, 0x6C, 0xE3, 0x08, 0x07, 0xA9, + 0xFC, 0x84, 0x7B, 0x51, 0x2F, 0x23, 0x2A, 0x6E, 0xF1, 0x0F, 0xEF, 0x48, + 0x9F, 0x66, 0x8F, 0x5C, 0x9A, 0x21, 0x84, 0xD7, 0xB1, 0x14, 0x82, 0xA2, + 0xE4, 0xE6, 0x72, 0x56, 0x46, 0xCB, 0x26, 0x2F, 0xE2, 0x6D, 0x5B, 0x07, + 0xA6, 0xF3, 0x94, 0x24, 0x24, 0x58, 0x45, 0xF4, 0xB4, 0x54, 0x90, 0xFF, + 0x59, 0x17, 0x04, 0xC8, 0x9A, 0x4D, 0x82, 0xEF, 0x24, 0xBB, 0x2C, 0x11, + 0x9F, 0x2D, 0xD4, 0xE5, 0x0A, 0x2A, 0xF0, 0x94, 0x64, 0x48, 0xFF, 0xB4, + 0x7D, 0x01, 0x42, 0xBE, 0x8F, 0xB2, 0x2F, 0x2A, 0x0A, 0x17, 0xB0, 0xA2, + 0x0B, 0x5E, 0x32, 0x05, 0x2A, 0x0A, 0xE5, 0xF6, 0x3D, 0xA8, 0x12, 0xBD, + 0x5C, 0x4F, 0x59, 0x76, 0xAB, 0x9C, 0x89, 0x98, 0xFD, 0xCE, 0x0B, 0xA1, + 0x62, 0x4D, 0x3A, 0x16, 0xA5, 0x80, 0x62, 0x8B, 0x52, 0xD4, 0x2A, 0x8E, + 0xC0, 0x17, 0xE3, 0x42, 0xA6, 0x70, 0x40, 0x6B, 0xE8, 0xE7, 0xD7, 0xA7, + 0x43, 0x12, 0xF6, 0xB3, 0x7A, 0xE2, 0xFE, 0x42, 0xB0, 0xAF, 0x33, 0x56, + 0x10, 0xB1, 0x69, 0x3D, 0x7B, 0x7F, 0xDE, 0xC6, 0xE1, 0x0F, 0xCC, 0x5B, + 0xF9, 0x53, 0x08, 0x80, 0x05, 0x33, 0xD8, 0x09, 0x7B, 0x87, 0x71, 0xE0, + 0xF5, 0xCA, 0xB5, 0xFB, 0xB4, 0x3C, 0x4A, 0x6B, 0x10, 0xBA, 0xA6, 0xE6, + 0x69, 0xD6, 0x8E, 0x8C, 0x5B, 0x33, 0x07, 0xE8, 0x22, 0xB9, 0xF8, 0x3C, + 0xEF, 0xE0, 0xDA, 0x06, 0x54, 0xCB, 0x14, 0xDB, 0x2B, 0x50, 0x92, 0xB2, + 0x5C, 0xB8, 0xCB, 0xB6, 0x40, 0xB1, 0x91, 0xD4, 0xD7, 0xF9, 0xC2, 0x08, + 0x77, 0xC9, 0xB7, 0x00, 0x9B, 0x32, 0x20, 0xC4, 0x08, 0x39, 0xEE, 0xD6, + 0x32, 0xB8, 0x63, 0x0F, 0x1A, 0x73, 0x33, 0x73, 0xE1, 0xFB, 0x0E, 0x94, + 0x75, 0xCE, 0x37, 0xA4, 0xAF, 0xBC, 0x39, 0xAB, 0x25, 0x35, 0xA7, 0xDF, + 0xC2, 0x9B, 0xF5, 0xD7, 0x52, 0x44, 0xDE, 0x21, 0x50, 0x5F, 0x3E, 0xA6, + 0x37, 0x9E, 0x91, 0x56, 0x12, 0x82, 0xCB, 0xA0, 0xAE, 0x6F, 0xA8, 0x81, + 0x0C, 0x3B, 0xC0, 0x4C, 0xEE, 0x47, 0x57, 0x79, 0xC1, 0x49, 0x4B, 0x7A, + 0x92, 0xC7, 0x95, 0xA4, 0xD6, 0x3E, 0x25, 0xE5, 0xCF, 0x55, 0x65, 0x10, + 0x52, 0x58, 0xEA, 0x4F, 0xFC, 0x34, 0xB1, 0x0E, 0x0E, 0x2E, 0x45, 0x4C, + 0xD7, 0xB7, 0x92, 0xC4, 0x70, 0xE5, 0x33, 0xA1, 0x22, 0x49, 0x04, 0xF8, + 0xAF, 0x5E, 0x6D, 0x4B, 0xDE, 0x76, 0xCD, 0x50, 0x40, 0xFB, 0xFD, 0x7B, + 0xC3, 0xF2, 0xEA, 0x4B, 0xEA, 0xA7, 0x66, 0x44, 0x2B, 0x4D, 0x0C, 0xA3, + 0xC4, 0xAA, 0x9C, 0x50, 0x36, 0x5A, 0x4D, 0xB7, 0x04, 0x81, 0x5C, 0xBD, + 0x40, 0x62, 0x12, 0x6A, 0x4C, 0x13, 0x35, 0x4E, 0x47, 0x16, 0xD9, 0x43, + 0xE5, 0x8A, 0x44, 0x6D, 0x49, 0x71, 0x30, 0xA9, 0x4C, 0xDE, 0x31, 0x1E, + 0x2A, 0xE1, 0xDB, 0xBF, 0x1F, 0xB6, 0x7C, 0x36, 0xAA, 0x0F, 0x02, 0xBA, + 0x85, 0x87, 0xFC, 0x47, 0x90, 0x34, 0xD5, 0x13, 0x9E, 0x09, 0x2B, 0xC3, + 0xEC, 0x83, 0x80, 0x9D, 0xFE, 0x3D, 0x18, 0xBA, 0xFB, 0x51, 0x8D, 0x79, + 0xF6, 0xFA, 0x38, 0x48, 0x60, 0x14, 0xCC, 0x60, 0x81, 0x57, 0xEE, 0xA5, + 0x04, 0x1B, 0x4A, 0x0E, 0x43, 0x15, 0x00, 0x57, 0xE2, 0x0A, 0xBC, 0xF4, + 0x14, 0x3B, 0x96, 0x95, 0xF3, 0xFC, 0x4E, 0x13, 0x6F, 0x0D, 0x63, 0x85, + 0xD0, 0xB0, 0x3B, 0xCA, 0x0A, 0x80, 0x3D, 0x11, 0xD1, 0x7A, 0xCF, 0xB2, + 0x0B, 0xE1, 0x67, 0xDD, 0x45, 0x9B, 0xEC, 0x30, 0xD5, 0xE3, 0x06, 0xB3, + 0x94, 0xBB, 0xCB, 0x32, 0xBA, 0x17, 0xDF, 0x5F, 0x1F, 0x38, 0xAF, 0xC6, + 0xA9, 0xB5, 0x7F, 0xF6, 0x85, 0xC2, 0x99, 0x33, 0x0A, 0x3F, 0x7D, 0xB2, + 0x72, 0x7D, 0xF7, 0xF4, 0x1B, 0x11, 0xA1, 0x7D, 0xF7, 0x3D, 0x7F, 0x0F, + 0xFA, 0xB1, 0xEE, 0x6C, 0xAD, 0xA9, 0xE7, 0x43, 0x5D, 0xFE, 0xC9, 0x32, + 0xF6, 0xF1, 0x97, 0xE7, 0x87, 0x17, 0x85, 0xB9, 0xBC, 0xC1, 0xD5, 0x2F, + 0xC4, 0x5A, 0xBE, 0x03, 0xC3, 0x49, 0xAB, 0x9D, 0x40, 0xFA, 0xE1, 0xBD, + 0x1E, 0x44, 0xE8, 0x8A, 0x6E, 0x98, 0x99, 0x4C, 0xC6, 0x2B, 0xE0, 0x18, + 0x26, 0x83, 0xCA, 0x08, 0x0B, 0xDD, 0x69, 0xD1, 0x33, 0xD5, 0x8F, 0xAD, + 0xBD, 0x86, 0xFE, 0xC3, 0x0C, 0xC3, 0x99, 0x3D, 0x4B, 0xB0, 0x0C, 0x75, + 0x17, 0x89, 0x6E, 0x70, 0x0C, 0x23, 0xA9, 0x99, 0xD9, 0x59, 0x07, 0x7D, + 0x30, 0xFC, 0xC5, 0x98, 0xD0, 0xFF, 0x5D, 0x10, 0x99, 0xF4, 0xB7, 0xC5, + 0x56, 0xE8, 0xA7, 0x0D, 0x02, 0xB4, 0x04, 0xFB, 0x9E, 0x9C, 0x8B, 0x0C, + 0x03, 0x57, 0x48, 0x73, 0x51, 0x9A, 0x8E, 0xB6, 0xB9, 0x15, 0x57, 0xFD, + 0x52, 0x1E, 0x27, 0x87, 0x68, 0xCF, 0x1C, 0x2B, 0x18, 0x2D, 0xDA, 0x00, + 0x2F, 0x71, 0xB8, 0x66, 0x35, 0x3F, 0x50, 0xC0, 0xBC, 0xF6, 0xF1, 0x0E, + 0xD0, 0xAC, 0x1C, 0xFC, 0xAD, 0x7C, 0xD9, 0x36, 0x3F, 0x20, 0xC1, 0x96, + 0x83, 0xB1, 0x14, 0xAB, 0xC7, 0xD5, 0x0A, 0xF4, 0x41, 0x65, 0x7D, 0x4C, + 0x8D, 0x03, 0xB0, 0x4C, 0x3E, 0x16, 0x6B, 0xB7, 0xF7, 0x16, 0x6B, 0x2A, + 0x82, 0x27, 0x5A, 0x1A, 0x60, 0xFF, 0x21, 0x47, 0x0E, 0xF9, 0x66, 0x78, + 0x3D, 0x27, 0xE7, 0x22, 0x93, 0x3C, 0x39, 0x9D, 0xA1, 0xC1, 0x89, 0x6D, + 0x16, 0xCF, 0x12, 0x43, 0x24, 0x9A, 0x40, 0x7A, 0x5A, 0xBA, 0xA5, 0xD2, + 0x1A, 0x9E, 0x71, 0x1F, 0x22, 0x33, 0x22, 0xA5, 0xEA, 0xA0, 0xF9, 0x88, + 0x55, 0x05, 0x8D, 0xD9, 0x0A, 0x45, 0x21, 0x9F, 0xA2, 0xD7, 0x0B, 0xE1, + 0xC1, 0x3E, 0xDF, 0x89, 0xDE, 0x24, 0xF9, 0x3F, 0x9B, 0x1E, 0xA6, 0xB9, + 0x94, 0x67, 0x4D, 0xFB, 0x9E, 0x27, 0xA4, 0x6F, 0xF5, 0xCE, 0xEB, 0x97, + 0xDA, 0xB4, 0x8A, 0xFB, 0xF2, 0xAD, 0xD2, 0x2C, 0x0A, 0x76, 0xF2, 0xA7, + 0x13, 0x0B, 0x47, 0xE2, 0xF7, 0xDA, 0x56, 0xDF, 0x83, 0x86, 0x59, 0xE5, + 0x22, 0x58, 0x2F, 0x9E, 0x9F, 0x51, 0xDF, 0xA5, 0x35, 0xB1, 0xC1, 0xC6, + 0xCE, 0xAF, 0x2C, 0xF7, 0x5F, 0xE1, 0x39, 0x6A, 0x87, 0x67, 0xB6, 0x86, + 0xC7, 0x24, 0x93, 0xEA, 0x78, 0x80, 0xDD, 0x66, 0x96, 0x40, 0x4E, 0xD7, + 0x72, 0x14, 0x8F, 0x8E, 0x2B, 0x62, 0x72, 0x07, 0x2F, 0x14, 0x9B, 0x3D, + 0x7A, 0xB4, 0x90, 0x10, 0xF2, 0xDC, 0x1A, 0x0F, 0x68, 0xAC, 0x00, 0x21, + 0xA0, 0xF7, 0xE3, 0x31, 0x6F, 0xC8, 0x62, 0xDD, 0x16, 0x13, 0xDB, 0x5A, + 0x28, 0x56, 0xE5, 0x2A, 0x1D, 0x74, 0x7E, 0x9E, 0x33, 0xC2, 0xE2, 0x96, + 0x2C, 0x88, 0xF5, 0xA4, 0x46, 0x43, 0xE5, 0x90, 0x67, 0xE2, 0xC9, 0xF4, + 0xB9, 0xC6, 0x44, 0xAB, 0xA2, 0x90, 0x22, 0xD2, 0x7D, 0xF7, 0x23, 0x5F, + 0xF7, 0x98, 0x09, 0x2A, 0xB1, 0xF5, 0xDC, 0x63, 0x50, 0x68, 0xB5, 0x07, + 0x22, 0x82, 0x59, 0x44, 0x34, 0x7B, 0x8C, 0x0A, 0x15, 0x16, 0x45, 0x9F, + 0xAE, 0x25, 0x10, 0x94, 0xB7, 0xC5, 0x4A, 0xDC, 0x42, 0x1C, 0x8A, 0xBC, + 0x79, 0xD3, 0xB3, 0xA7, 0x57, 0x70, 0x52, 0xAB, 0x0A, 0x17, 0x3B, 0x8B, + 0xAE, 0x4B, 0x6D, 0x7C, 0x4D, 0x94, 0x30, 0x12, 0xAC, 0x9F, 0xF0, 0x2C, + 0xB7, 0x84, 0x4F, 0xAF, 0x54, 0x9E, 0x2A, 0x0B, 0x76, 0x65, 0xEB, 0x4C, + 0x09, 0x26, 0x51, 0xAC, 0x85, 0xC2, 0xD3, 0x27, 0xE8, 0x90, 0xB1, 0xBD, + 0x70, 0x00, 0xBB, 0xBE, 0x32, 0x8A, 0x06, 0x90, 0xB6, 0x7A, 0x28, 0x8C, + 0x18, 0xE0, 0xA7, 0x0A, 0x93, 0x4E, 0x3B, 0x91, 0x63, 0xB8, 0xF8, 0xCD, + 0x8D, 0xFD, 0x9C, 0x80, 0x22, 0x11, 0x60, 0x16, 0x47, 0xAE, 0x63, 0xD2, + 0xEA, 0x1E, 0xF6, 0x09, 0x1E, 0x8A, 0x9B, 0xB5, 0x77, 0xE4, 0x66, 0x2D, + 0x04, 0x89, 0xD8, 0xB6, 0xAB, 0x68, 0x70, 0x67, 0x4D, 0x15, 0x70, 0x6F, + 0x1C, 0xB0, 0xC0, 0x23, 0x27, 0xDB, 0xCA, 0x5A, 0x10, 0x34, 0x5A, 0x6C, + 0x2F, 0x89, 0x27, 0x45, 0x8D, 0xF4, 0xCD, 0x38, 0x28, 0x9B, 0x5C, 0x66, + 0xD4, 0x8F, 0x23, 0x08, 0xF9, 0x8F, 0x60, 0x58, 0x56, 0x92, 0xBB, 0xC2, + 0x8F, 0x6E, 0xC8, 0x15, 0x92, 0x92, 0x33, 0xAD, 0xB4, 0x50, 0x7C, 0x31, + 0x3D, 0x77, 0x9D, 0xCF, 0x01, 0x9E, 0x08, 0xA1, 0x63, 0xEE, 0x3B, 0xDD, + 0x79, 0x67, 0x61, 0xF0, 0xB3, 0x90, 0x00, 0x5F, 0x70, 0x58, 0x85, 0x97, + 0xED, 0x1F, 0x5C, 0x67, 0x96, 0x45, 0x31, 0xC5, 0xCF, 0xDC, 0x00, 0x48, + 0x34, 0xDF, 0x0B, 0x5B, 0xFB, 0xC0, 0xB3, 0x3F, 0x72, 0xFF, 0x0D, 0x05, + 0x4E, 0x4D, 0x42, 0x6F, 0x65, 0x75, 0x1B, 0xB5, 0xCA, 0xB5, 0xA6, 0x67, + 0x18, 0x77, 0x51, 0x21, 0x4D, 0x0B, 0xC3, 0x6B, 0xB7, 0x70, 0x78, 0x81, + 0xCC, 0xB1, 0xD8, 0xCD, 0xFA, 0xA4, 0x40, 0x80, 0xEF, 0x90, 0xE6, 0x64, + 0x4C, 0x7E, 0xC7, 0x5F, 0x90, 0xF1, 0xA0, 0x66, 0x7C, 0x06, 0x4F, 0xF9, + 0xD3, 0x96, 0x31, 0x96, 0x4B, 0x91, 0x8B, 0x94, 0x45, 0x59, 0xCB, 0xE1, + 0x5F, 0x45, 0xBD, 0xDD, 0x29, 0xED, 0x2D, 0xFE, 0xDD, 0x58, 0xBC, 0xED, + 0x4A, 0x8B, 0xEE, 0xF5, 0xEA, 0x9B, 0xDC, 0xCE, 0x55, 0xB6, 0x9A, 0x3E, + 0xE0, 0xD0, 0xE0, 0x1E, 0xDE, 0xB4, 0x33, 0xF1, 0xA5, 0x1B, 0x07, 0x2B, + 0x5F, 0xA2, 0x59, 0x28, 0xD7, 0xC3, 0x3B, 0x52, 0xBF, 0x4C, 0x2E, 0xD7, + 0x88, 0x22, 0x77, 0xD9, 0x51, 0x27, 0x08, 0xA4, 0xC7, 0xF3, 0x5B, 0xF2, + 0x7B, 0x6D, 0x34, 0x6E, 0x81, 0x53, 0xB2, 0xB8, 0x0F, 0xDE, 0x51, 0x75, + 0x20, 0x36, 0x1E, 0x86, 0xB5, 0x1D, 0xCF, 0xCA, 0x5D, 0xEF, 0x00, 0x3E, + 0x68, 0xD6, 0x8C, 0x09, 0xE6, 0x12, 0x2D, 0x97, 0x24, 0xFD, 0x6A, 0xB1, + 0xD5, 0x13, 0x18, 0x1A, 0xBF, 0x8D, 0xE5, 0x38, 0x7E, 0x57, 0x47, 0x09, + 0xEC, 0xA9, 0xDF, 0x97, 0xDA, 0x8C, 0x91, 0x2F, 0x29, 0x2D, 0xAC, 0x8B, + 0xCA, 0xC7, 0x03, 0xD8, 0x68, 0xF9, 0x77, 0x2E, 0x9F, 0x5F, 0xCE, 0xD8, + 0xA4, 0x39, 0x0E, 0x64, 0xB8, 0xD8, 0x21, 0x7D, 0xCE, 0x68, 0xA5, 0xD5, + 0x38, 0x79, 0x9F, 0x90, 0x49, 0x33, 0x72, 0x05, 0x72, 0x4C, 0x76, 0x83, + 0x35, 0xFC, 0x1A, 0xE2, 0xF4, 0x60, 0xC8, 0xA8, 0x54, 0xC3, 0xC1, 0x4D, + 0x17, 0xFD, 0xAE, 0xA9, 0xA9, 0x20, 0xFE, 0xF9, 0x25, 0x4A, 0xE3, 0x22, + 0xDC, 0x7D, 0xE0, 0xFC, 0x47, 0xF7, 0xA6, 0xF3, 0x3F, 0xCE, 0xC8, 0x2E, + 0x8B, 0xCE, 0xFA, 0x46, 0x8D, 0x38, 0x4B, 0x3C, 0xB6, 0x23, 0xA9, 0x2E, + 0x53, 0xD9, 0xC3, 0x60, 0x60, 0xFF, 0x10, 0xC7, 0x38, 0x54, 0x5C, 0xBD, + 0x3E, 0xB1, 0x52, 0x2C, 0x30, 0xB3, 0x6D, 0x14, 0x5B, 0x4D, 0xAD, 0x68, + 0x9E, 0xD6, 0x0A, 0x91, 0xFD, 0x40, 0x69, 0xE1, 0xB3, 0x76, 0x21, 0x9D, + 0x5D, 0x97, 0x9F, 0x01, 0x11, 0x55, 0x9A, 0x82, 0x57, 0x1D, 0xD6, 0x55, + 0xE7, 0x20, 0x5E, 0x12, 0x0A, 0xD9, 0xA8, 0x26, 0xB9, 0x1B, 0x0A, 0xE5, + 0xB0, 0x25, 0x79, 0xB2, 0x94, 0x9F, 0x43, 0xA6, 0xBA, 0x29, 0x7E, 0x61, + 0x4C, 0x48, 0xEA, 0xBE, 0xC1, 0x5D, 0xE8, 0xF0, 0xEB, 0x4B, 0xE1, 0xF5, + 0x4B, 0x2D, 0xD3, 0xAA, 0x1C, 0x51, 0x00, 0x15, 0x16, 0x64, 0xFC, 0xC3, + 0x2B, 0xF0, 0x91, 0xBC, 0xF9, 0xDB, 0xE9, 0x88, 0x70, 0xD3, 0x56, 0x47, + 0xA3, 0x65, 0xA3, 0x34, 0x74, 0xD8, 0x97, 0x14, 0x7B, 0xA5, 0x1E, 0x12, + 0xD7, 0xA6, 0x88, 0x00, 0x91, 0x49, 0xFE, 0xD8, 0xF1, 0x0F, 0x59, 0xE3, + 0xED, 0x5D, 0x8E, 0x39, 0x0D, 0x10, 0xB5, 0x42, 0x31, 0x31, 0x6A, 0x7A, + 0x56, 0xD0, 0x25, 0xB6, 0x47, 0x7D, 0xBB, 0xCE, 0x47, 0x0A, 0xA7, 0xFF, + 0xB9, 0xCB, 0xED, 0x79, 0xFF, 0xFE, 0x16, 0x0C, 0x5F, 0xC4, 0xAF, 0x31, + 0x2C, 0xAB, 0x23, 0xA9, 0xBB, 0x2E, 0x9B, 0x09, 0xFA, 0x52, 0xC6, 0x80, + 0xF8, 0xB7, 0x3A, 0xFD, 0xD2, 0xAC, 0xBF, 0x87, 0x77, 0x3B, 0x71, 0x25, + 0xCA, 0xDB, 0xC7, 0xE9, 0x90, 0xCC, 0x98, 0x42, 0x36, 0xCE, 0xF5, 0x9F, + 0x3D, 0x52, 0xDD, 0xE8, 0xB3, 0xFB, 0x46, 0x94, 0xAE, 0x17, 0xC8, 0xA4, + 0x84, 0xF7, 0xA7, 0xD3, 0xBD, 0x31, 0xCE, 0x90, 0xAF, 0xE7, 0x88, 0x59, + 0x06, 0x68, 0x7F, 0x05, 0xEB, 0x93, 0xDC, 0x17, 0x41, 0x1C, 0xE0, 0x8B, + 0x08, 0x98, 0xCE, 0x45, 0xF2, 0xE5, 0x8C, 0xF7, 0xBA, 0xBB, 0x2B, 0x0D, + 0x2D, 0x78, 0xC7, 0x37, 0xB2, 0xDD, 0xE9, 0x86, 0x75, 0x96, 0xB7, 0xB6, + 0x90, 0x14, 0x0E, 0xB8, 0x65, 0x74, 0xC9, 0x4A, 0xA7, 0x7B, 0x39, 0x88, + 0x61, 0x02, 0x24, 0x55, 0x21, 0x14, 0x9B, 0x29, 0xC3, 0xB1, 0x37, 0xE3, + 0x48, 0xCE, 0xAE, 0x42, 0x07, 0x2C, 0x08, 0xC8, 0x6E, 0xCE, 0x6F, 0xF6, + 0x40, 0x40, 0xBD, 0xC2, 0xC9, 0x76, 0x7B, 0x11, 0xF7, 0x81, 0xD9, 0xE7, + 0x6D, 0x4B, 0x1B, 0xDB, 0x9E, 0x13, 0x30, 0xDB, 0x55, 0xBB, 0x84, 0xE7, + 0x0F, 0xBA, 0x13, 0x72, 0x04, 0xBE, 0x94, 0x13, 0xB4, 0xA8, 0xF4, 0x23, + 0x89, 0x20, 0x1D, 0x5A, 0xC2, 0x23, 0xCF, 0x41, 0x38, 0xCD, 0xFF, 0x93, + 0x76, 0x7D, 0xF6, 0x95, 0x5A, 0x3C, 0x27, 0x27, 0xEC, 0x79, 0xA8, 0xF7, + 0x41, 0x5C, 0xA4, 0xD7, 0x37, 0x09, 0x6E, 0xBD, 0x1D, 0x2C, 0x59, 0xFE, + 0xD7, 0x6B, 0x73, 0xC1, 0x1F, 0x97, 0x5F, 0x9F, 0x1E, 0xDE, 0x23, 0x9D, + 0xFF, 0xE2, 0x83, 0x52, 0x9E, 0xB0, 0x80, 0x2D, 0x2E, 0xE4, 0x99, 0xB1, + 0x02, 0x28, 0x69, 0xEB, 0x0B, 0x5E, 0xD0, 0xEA, 0xB4, 0x77, 0x96, 0xBD, + 0x79, 0xE9, 0xCB, 0x1B, 0xBD, 0x4D, 0x39, 0x83, 0x4E, 0x2D, 0x62, 0x94, + 0xB2, 0x29, 0xFC, 0x9E, 0xC3, 0x18, 0x60, 0x8C, 0xE0, 0x60, 0x40, 0x10, + 0x97, 0x16, 0xAB, 0x3A, 0x85, 0x2D, 0xD5, 0x80, 0x0C, 0xDA, 0xB7, 0x41, + 0xE4, 0x6A, 0x07, 0x75, 0xC5, 0x43, 0x49, 0x6B, 0xBB, 0xA6, 0x12, 0x84, + 0xBF, 0xDD, 0x4D, 0x76, 0xC8, 0x0F, 0xEC, 0xC1, 0x1B, 0xFE, 0x24, 0x67, + 0x37, 0x08, 0x42, 0xA5, 0x61, 0x60, 0xC9, 0x2B, 0x32, 0x25, 0x88, 0xB4, + 0x99, 0x68, 0x40, 0xAD, 0x68, 0x49, 0xD5, 0x61, 0xF9, 0xBA, 0x5A, 0xDD, + 0xB1, 0x47, 0xB1, 0xA9, 0x61, 0x38, 0x87, 0xC4, 0x86, 0x88, 0x0B, 0x7B, + 0xA8, 0xCD, 0xB0, 0x35, 0x62, 0xA2, 0xDA, 0x7A, 0x3C, 0x85, 0x00, 0x66, + 0x79, 0x74, 0xFF, 0x79, 0x6F, 0x6C, 0x4B, 0x21, 0x65, 0x7E, 0x2F, 0xFF, + 0x8A, 0xD8, 0xE8, 0x69, 0x3D, 0x3D, 0xF5, 0xB8, 0xEF, 0x8B, 0x6D, 0xE8, + 0x6F, 0x69, 0x2F, 0x8B, 0x49, 0xD8, 0x10, 0xF5, 0x42, 0xB9, 0xA6, 0x2A, + 0xC8, 0xB2, 0xE7, 0x6A, 0x20, 0x84, 0x89, 0x07, 0xA0, 0xFF, 0xC8, 0x0D, + 0x8D, 0xEE, 0xB6, 0xED, 0x7B, 0x03, 0x46, 0x36, 0xC7, 0x69, 0x8A, 0x18, + 0x88, 0x5C, 0xBB, 0xA9, 0xC0, 0x40, 0x49, 0x16, 0xB4, 0x85, 0x50, 0x88, + 0x3D, 0x50, 0x7C, 0x50, 0x3B, 0x12, 0x19, 0xEB, 0x9E, 0x1F, 0x44, 0x11, + 0x8B, 0x1C, 0xF0, 0xCF, 0xE1, 0x76, 0xA4, 0xAB, 0x4F, 0x2E, 0x46, 0x43, + 0xA4, 0xB2, 0x6E, 0x79, 0x4A, 0x89, 0x19, 0x70, 0xD8, 0xBE, 0xF5, 0x8D, + 0xAA, 0x5B, 0x23, 0xB8, 0xBA, 0xFB, 0xE6, 0xA7, 0xF1, 0xE8, 0xA3, 0xF8, + 0xE7, 0x2D, 0x7F, 0x3B, 0x7D, 0x89, 0x48, 0x99, 0xAC, 0x5A, 0xC0, 0x5B, + 0xCD, 0xE3, 0xC1, 0x65, 0x52, 0xB0, 0xA5, 0xFC, 0x5C, 0xA2, 0xEB, 0xFB, + 0x61, 0x04, 0xE2, 0xC9, 0xD6, 0x24, 0x27, 0x12, 0x2F, 0x3A, 0x9E, 0xE6, + 0x97, 0x87, 0x19, 0x4F, 0xBB, 0x09, 0x80, 0x4A, 0xAD, 0x9B, 0x18, 0x8E, + 0x43, 0x91, 0xAF, 0x2C, 0x54, 0xE8, 0xDB, 0xB8, 0x0C, 0x11, 0xC7, 0x29, + 0xE7, 0x76, 0xCF, 0xAA, 0xCC, 0x83, 0x77, 0x4E, 0xE6, 0x4D, 0x78, 0xFD, + 0x1C, 0x14, 0xCA, 0x1F, 0x0F, 0xA3, 0x70, 0xDB, 0x33, 0x44, 0xF2, 0x34, + 0x3F, 0xDB, 0x5E, 0x1F, 0x9B, 0x25, 0x47, 0x44, 0x5F, 0x04, 0xCD, 0xBA, + 0x79, 0x2A, 0x21, 0xD0, 0x8B, 0x71, 0xF8, 0x9F, 0x16, 0x6D, 0xEE, 0x1A, + 0xE9, 0x6C, 0x52, 0xDB, 0x8D, 0x17, 0x28, 0xAD, 0xFD, 0xEF, 0x7B, 0xAC, + 0x53, 0x6B, 0xED, 0x11, 0x04, 0x83, 0xFD, 0x96, 0x2E, 0xB2, 0x31, 0xC6, + 0x0C, 0x13, 0x4C, 0x20, 0x58, 0x19, 0xDE, 0x2F, 0x8C, 0xF1, 0x63, 0x48, + 0x8C, 0x3A, 0xE9, 0xF8, 0x81, 0x75, 0x0D, 0x10, 0x1E, 0x74, 0xA5, 0x7E, + 0xF7, 0xC3, 0x11, 0xFB, 0x20, 0xF0, 0xF9, 0x72, 0x7B, 0x8B, 0xF4, 0x3C, + 0xCC, 0x54, 0x5F, 0xA6, 0xEF, 0xA8, 0x03, 0xB3, 0x7E, 0x72, 0xEB, 0xA0, + 0x93, 0x67, 0xAC, 0x38, 0x9F, 0xD6, 0xEF, 0x16, 0x1D, 0x33, 0x4B, 0xC5, + 0x80, 0x60, 0x70, 0xF1, 0xF8, 0x10, 0x91, 0x2D, 0xA7, 0x04, 0xDD, 0x0A, + 0xEB, 0xEC, 0x2F, 0xA3, 0xB9, 0x4B, 0x79, 0x96, 0x3C, 0xA4, 0xE8, 0x47, + 0xA5, 0xDA, 0xE2, 0x65, 0x94, 0xEA, 0xAA, 0x32, 0x78, 0xBD, 0x6F, 0xA2, + 0x78, 0x7D, 0x15, 0x7D, 0xC3, 0xE8, 0x28, 0x91, 0xE4, 0x3C, 0x91, 0x3C, + 0xC1, 0x42, 0xEA, 0x0A, 0x51, 0x3E, 0x40, 0x4B, 0xAF, 0xB5, 0xBF, 0x56, + 0x42, 0xDE, 0x98, 0xE5, 0xC5, 0xB7, 0xF5, 0x14, 0x22, 0xDB, 0xA6, 0xA4, + 0x7E, 0x88, 0xEA, 0xD1, 0x2F, 0x57, 0xD0, 0x3D, 0x17, 0x41, 0x7D, 0xD8, + 0x4C, 0x3D, 0x49, 0xC4, 0xF3, 0x0D, 0xC4, 0x80, 0xBE, 0x6C, 0x1A, 0x26, + 0xEB, 0xBF, 0xF6, 0x95, 0xE7, 0x9A, 0x44, 0x41, 0x90, 0x1F, 0xD1, 0x70, + 0x7B, 0x65, 0xA1, 0x0F, 0xA3, 0xAA, 0xB5, 0xF1, 0xC0, 0x3D, 0x31, 0x92, + 0xA7, 0x2F, 0xB4, 0x72, 0xAB, 0x7A, 0x61, 0xB5, 0x37, 0xBF, 0xC2, 0xE5, + 0x41, 0xBA, 0x75, 0x5D, 0xB3, 0x59, 0xFA, 0x96, 0x04, 0x59, 0x2B, 0x96, + 0x10, 0x79, 0x66, 0x76, 0xF7, 0x71, 0xCB, 0x37, 0xF7, 0x60, 0x19, 0x59, + 0x21, 0x5F, 0xEE, 0x8B, 0x2D, 0x91, 0x3D, 0xEB, 0x57, 0x65, 0xB4, 0x09, + 0x09, 0x38, 0xEB, 0x70, 0x96, 0x43, 0x87, 0x80, 0x07, 0x9F, 0x0B, 0x09, + 0x03, 0xF8, 0x5F, 0xF4, 0x5A, 0x53, 0x60, 0x86, 0x48, 0x8A, 0xB3, 0xB6, + 0x34, 0xE0, 0xFC, 0xE5, 0x95, 0x12, 0xE7, 0x7C, 0xE9, 0x14, 0x56, 0x2D, + 0x8D, 0x9C, 0xA8, 0x6F, 0x2F, 0x65, 0x29, 0xBC, 0xC2, 0xEB, 0xA8, 0xD2, + 0xA9, 0xD3, 0x3E, 0x7E, 0xED, 0x28, 0x9C, 0xFD, 0x15, 0x5D, 0x64, 0x21, + 0x30, 0xAB, 0xD3, 0x0C, 0x0D, 0x63, 0x5B, 0xC5, 0xBE, 0x03, 0xB1, 0x03, + 0x7E, 0x7E, 0xE5, 0xCC, 0x0C, 0x1C, 0xB8, 0x74, 0x57, 0x58, 0x0E, 0xA1, + 0xBE, 0xA7, 0x90, 0x3B, 0x9B, 0x98, 0xB2, 0xC0, 0xF3, 0x97, 0x41, 0xBD, + 0x1F, 0xD7, 0x31, 0x42, 0xB6, 0xFF, 0x6D, 0x4B, 0xEC, 0x4D, 0x98, 0x15, + 0x71, 0x46, 0x4C, 0x14, 0x7B, 0x59, 0xE2, 0x88, 0xE4, 0x4E, 0xF2, 0x74, + 0x6F, 0x64, 0x4A, 0xEE, 0x46, 0x46, 0x4F, 0xC6, 0xF5, 0x3C, 0x12, 0xC8, + 0xBE, 0x8C, 0x55, 0x19, 0xC5, 0xC0, 0x9F, 0x31, 0xC4, 0xDA, 0xCB, 0x3C, + 0xF3, 0xC6, 0x42, 0xBC, 0x3B, 0x96, 0x62, 0xB9, 0x77, 0x54, 0x41, 0xE6, + 0x74, 0x82, 0xBA, 0xCB, 0x32, 0x7A, 0x8D, 0x05, 0xBF, 0x3C, 0x4A, 0x97, + 0x2A, 0xF7, 0xEC, 0xCF, 0xA0, 0x3E, 0x5A, 0xDC, 0x41, 0x23, 0xB0, 0xB8, + 0x56, 0x55, 0xD8, 0xC2, 0xA7, 0x3F, 0x32, 0x37, 0xD3, 0x6F, 0x01, 0xA2, + 0x0E, 0x26, 0xD7, 0xB5, 0xA0, 0xA5, 0x34, 0x22, 0x47, 0xFD, 0xD1, 0x52, + 0xF3, 0xE1, 0xE0, 0xAB, 0xF9, 0xD0, 0x8E, 0x7C, 0x42, 0x1D, 0x11, 0xEA, + 0xA4, 0xCE, 0x38, 0x68, 0xDE, 0xBC, 0xBA, 0x6A, 0x50, 0x91, 0x54, 0x86, + 0x0E, 0x98, 0xAA, 0x2C, 0x57, 0x5C, 0x2A, 0x70, 0x57, 0x58, 0x6A, 0xD1, + 0x9C, 0xB9, 0xEB, 0x5E, 0xD2, 0x35, 0xD9, 0xC5, 0x2A, 0x6B, 0x0C, 0x60, + 0x39, 0xE4, 0x4C, 0xCD, 0xF0, 0xFB, 0xF7, 0x52, 0x86, 0x48, 0xCF, 0x27, + 0xB4, 0x9A, 0xC7, 0x20, 0xB2, 0xDD, 0x5E, 0x7D, 0x4F, 0x2B, 0xC5, 0x96, + 0xC5, 0xAE, 0x65, 0x26, 0xD9, 0x18, 0xC6, 0xBE, 0x59, 0xFF, 0x85, 0x51, + 0x6D, 0xE6, 0x4E, 0xED, 0x25, 0x7D, 0x8D, 0x86, 0xDD, 0xB9, 0x06, 0x7A, + 0x76, 0x66, 0x68, 0x42, 0x13, 0x6F, 0xC8, 0x7D, 0xF8, 0x9E, 0x9B, 0x51, + 0xFD, 0xEE, 0x2F, 0xF5, 0x19, 0x5E, 0x14, 0x4E, 0xFB, 0x69, 0x68, 0xE6, + 0x9D, 0xB7, 0xD5, 0x31, 0xBB, 0xB4, 0x96, 0x4F, 0x25, 0x86, 0x25, 0xDA, + 0x98, 0xC7, 0x3A, 0xD6, 0x10, 0xD0, 0xD4, 0x52, 0x5C, 0x5E, 0x4E, 0xFD, + 0xE5, 0x04, 0x6E, 0x37, 0xDE, 0x84, 0x55, 0x6A, 0xB4, 0xAA, 0xC3, 0x50, + 0xCB, 0x36, 0x3D, 0x0F, 0x68, 0x26, 0x2D, 0xA0, 0xBB, 0xC3, 0x58, 0x85, + 0x37, 0xC3, 0xD5, 0xC2, 0x13, 0x17, 0x15, 0x59, 0x77, 0x4D, 0xEE, 0x44, + 0xC2, 0x1E, 0x37, 0x10, 0x44, 0xC3, 0xCD, 0xB5, 0x9C, 0xD7, 0xE2, 0x82, + 0xA9, 0x77, 0x83, 0x83, 0xCC, 0xB8, 0xC1, 0xB0, 0xD5, 0x2D, 0xE2, 0xC2, + 0x0D, 0x1A, 0x40, 0xCE, 0xBF, 0x57, 0x33, 0x19, 0xFF, 0xB7, 0x9C, 0xC2, + 0xAF, 0x3B, 0x7A, 0x51, 0x16, 0x0B, 0x6C, 0xB1, 0x89, 0x49, 0x7D, 0x11, + 0x78, 0x79, 0x99, 0xAF, 0x68, 0xB9, 0xB7, 0xA8, 0xC2, 0x8C, 0xD4, 0x54, + 0x2A, 0xCB, 0xC1, 0xFA, 0xBA, 0x23, 0x18, 0x44, 0xFB, 0xF4, 0x0D, 0xA9, + 0xBD, 0x93, 0x33, 0x55, 0x85, 0xC6, 0xD9, 0xE9, 0xCA, 0x48, 0x4C, 0xBF, + 0xA8, 0xA2, 0x19, 0x9C, 0x38, 0xFD, 0x3E, 0xA6, 0x83, 0x9A, 0xFC, 0x94, + 0xF7, 0xF7, 0xCC, 0xD5, 0x61, 0xED, 0x3C, 0x02, 0x8B, 0xF4, 0x4E, 0xAF, + 0x8A, 0x34, 0xEA, 0x30, 0x4F, 0x65, 0x1A, 0x79, 0x8B, 0x64, 0xAB, 0x9D, + 0x3C, 0x90, 0x6B, 0x1D, 0x17, 0x9A, 0x05, 0x9D, 0x11, 0xF6, 0xC1, 0x45, + 0x86, 0x87, 0xC0, 0x79, 0xAB, 0x5D, 0x9B, 0x1F, 0xAA, 0x80, 0x7F, 0x7C, + 0x4C, 0xAD, 0x26, 0x47, 0x9B, 0xB8, 0x59, 0x79, 0x18, 0x61, 0xC7, 0x29, + 0x28, 0xCA, 0xB5, 0xC4, 0x5E, 0x18, 0xA4, 0x02, 0x91, 0x9C, 0xBB, 0x63, + 0xBB, 0xBA, 0xCE, 0xBC, 0xC4, 0xB8, 0x65, 0xDA, 0xC4, 0x33, 0xB2, 0x44, + 0xDC, 0x26, 0xB9, 0x91, 0x34, 0xA4, 0x69, 0x03, 0x4B, 0x55, 0x12, 0xAB, + 0x5E, 0x20, 0x49, 0xFB, 0x3F, 0xA4, 0x68, 0x23, 0x0F, 0xDF, 0xB6, 0xA1, + 0x56, 0x98, 0xDD, 0x8B, 0xE7, 0x33, 0xFD, 0x5C, 0x80, 0x69, 0x6E, 0x2E, + 0x81, 0xD4, 0x4A, 0x8F, 0x1A, 0xD2, 0x88, 0x8C, 0x1A, 0xB7, 0x41, 0xB4, + 0x93, 0x82, 0x4B, 0xC9, 0xED, 0xF0, 0xC7, 0x2F, 0x4B, 0xA4, 0xB3, 0xD5, + 0x70, 0x47, 0x3A, 0x6F, 0xBD, 0x45, 0x85, 0x4D, 0x91, 0xDA, 0x28, 0x83, + 0x6C, 0xDF, 0x24, 0xD5, 0xFC, 0x4A, 0xE2, 0xFD, 0xD5, 0xC2, 0x5F, 0xC3, + 0x69, 0xF4, 0x2A, 0x19, 0xD2, 0x2B, 0x13, 0xC3, 0x57, 0x0D, 0x29, 0xD6, + 0x6D, 0xB1, 0x1B, 0xA8, 0x38, 0x72, 0xBC, 0x09, 0x4E, 0x6B, 0x22, 0xF0, + 0x89, 0x6C, 0x19, 0x7A, 0x61, 0x0C, 0xC8, 0xE5, 0xCD, 0x7A, 0xA8, 0x44, + 0x15, 0xCF, 0x9A, 0x43, 0xA7, 0xF4, 0x75, 0x0B, 0xD1, 0x60, 0x57, 0xF6, + 0xF9, 0xE5, 0x18, 0xE8, 0x80, 0xCE, 0x07, 0x17, 0x17, 0x25, 0x1E, 0xA1, + 0x15, 0x8C, 0x77, 0x14, 0x4F, 0x4C, 0xA0, 0x22, 0x85, 0x13, 0x5F, 0x54, + 0x28, 0x98, 0x23, 0x5A, 0x95, 0xC1, 0xFB, 0x1F, 0x69, 0x4D, 0xD3, 0x4C, + 0x48, 0xAC, 0xD1, 0xF1, 0xC6, 0x24, 0xFE, 0x02, 0x15, 0xFE, 0x00, 0x22, + 0x14, 0x4A, 0x67, 0x5E, 0xD3, 0xE4, 0x36, 0x6B, 0x04, 0xCA, 0x98, 0xDA, + 0x97, 0x9E, 0x52, 0x9E, 0xE5, 0x94, 0xAA, 0x87, 0xEE, 0xCB, 0x08, 0xC8, + 0xA7, 0x24, 0x46, 0xF2, 0x23, 0x62, 0xD1, 0x9C, 0xA7, 0x7F, 0xCC, 0x93, + 0xC1, 0x58, 0xFF, 0xA8, 0x17, 0xAF, 0x56, 0x28, 0x1D, 0x9F, 0xFB, 0x28, + 0x95, 0xBE, 0x48, 0x30, 0xBB, 0xD4, 0x0B, 0x3F, 0xF3, 0x53, 0x34, 0xFC, + 0x50, 0x5F, 0x90, 0x89, 0x28, 0xFE, 0x4C, 0x7E, 0x08, 0xF9, 0x0C, 0x53, + 0xD8, 0x16, 0xF7, 0x44, 0x88, 0x17, 0xFD, 0xFD, 0x21, 0x0D, 0x52, 0xBF, + 0xD8, 0x74, 0xD8, 0xCF, 0x7E, 0xB8, 0x70, 0x8B, 0xA9, 0xBB, 0x5A, 0xC9, + 0x75, 0xF2, 0xC0, 0xD3, 0xC5, 0xE0, 0x61, 0x7B, 0xEF, 0xA5, 0x51, 0x70, + 0x37, 0xA1, 0xB8, 0x09, 0xAC, 0xF0, 0xF7, 0x43, 0xD5, 0xE8, 0xB5, 0x7C, + 0xE5, 0xE7, 0x97, 0xC8, 0x20, 0x88, 0x53, 0xA3, 0x8F, 0x2F, 0x6B, 0xB4, + 0xD2, 0xF9, 0x88, 0xDE, 0x15, 0xE3, 0x88, 0xA6, 0x94, 0xC3, 0x51, 0xCE, + 0xFF, 0x2F, 0xF5, 0x59, 0xB8, 0xB4, 0x49, 0x6A, 0xAE, 0x6E, 0x8B, 0x63, + 0x7B, 0x08, 0xB0, 0xD7, 0x00, 0x3A, 0xF6, 0xBF, 0x55, 0x63, 0xB1, 0x09, + 0x24, 0x14, 0x39, 0x56, 0x62, 0x18, 0x33, 0x64, 0x64, 0xEF, 0xAA, 0xA8, + 0xC9, 0x38, 0x2A, 0xA2, 0x70, 0x4A, 0x61, 0x66, 0x6F, 0xD7, 0x73, 0xF7, + 0xF0, 0x8B, 0x34, 0xC4, 0x92, 0xD1, 0x63, 0xFC, 0x05, 0xC6, 0xD4, 0xE4, + 0x9B, 0x8F, 0x4E, 0x2A, 0x58, 0x2A, 0xA7, 0x7C, 0x47, 0x34, 0x01, 0xF3, + 0x5D, 0x0F, 0x99, 0xF3, 0x21, 0x86, 0xB7, 0x52, 0x8F, 0x06, 0x60, 0x1D, + 0xC6, 0xBB, 0xC4, 0x5A, 0x8F, 0x9B, 0x5E, 0x43, 0x4A, 0xA4, 0x2C, 0x1A, + 0xAD, 0xB8, 0x74, 0x79, 0x2C, 0x2D, 0x3A, 0x31, 0x21, 0x7F, 0x63, 0x91, + 0x0C, 0xED, 0xFF, 0x33, 0xF4, 0x2D, 0x19, 0xB6, 0x83, 0xD3, 0x33, 0x7B, + 0xE7, 0x9C, 0xF1, 0x8E, 0xAF, 0x57, 0x91, 0x81, 0x3A, 0x86, 0x1D, 0xA8, + 0xC4, 0x58, 0x78, 0xA8, 0xE8, 0x34, 0xB9, 0xE6, 0x57, 0x89, 0x4E, 0xD3, + 0x72, 0xD3, 0xD2, 0x09, 0x8C, 0xF1, 0x5B, 0xFB, 0x64, 0xDB, 0xA5, 0x32, + 0x17, 0x99, 0x65, 0x08, 0x31, 0xAD, 0x89, 0x64, 0x60, 0x60, 0xB8, 0xFE, + 0x77, 0xE5, 0x33, 0x80, 0xF8, 0x41, 0x75, 0xF0, 0xAE, 0x04, 0xB3, 0x49, + 0x6C, 0x24, 0x33, 0xC8, 0x7A, 0x09, 0x43, 0x6D, 0x0F, 0x88, 0xE6, 0xCD, + 0x35, 0xA8, 0xF2, 0xBD, 0xEA, 0x39, 0xA6, 0x46, 0xB5, 0x21, 0xD4, 0xC0, + 0xF5, 0x91, 0xDD, 0x9C, 0x58, 0x68, 0x04, 0x99, 0x58, 0x1C, 0xC2, 0x03, + 0xED, 0x1D, 0xCA, 0x93, 0xBA, 0x18, 0x1D, 0xDD, 0xB4, 0xBB, 0xE2, 0x1E, + 0x38, 0x59, 0x04, 0x5E, 0x8E, 0xFF, 0x80, 0xEC, 0xBB, 0x57, 0xE4, 0xA8, + 0x9F, 0x4D, 0xC3, 0xE5, 0x15, 0x71, 0x57, 0xDD, 0x02, 0xB2, 0x67, 0x50, + 0xD2, 0xDB, 0x95, 0xFF, 0x03, 0x2C, 0xDE, 0xE3, 0x78, 0x4F, 0xFE, 0xA9, + 0xAC, 0xE7, 0xE9, 0xC9, 0xA6, 0xB0, 0xCF, 0x98, 0x5E, 0xF7, 0xD7, 0x2C, + 0x92, 0x78, 0x44, 0xB9, 0xA0, 0x1A, 0xA4, 0x17, 0xA3, 0x50, 0x5E, 0x7E, + 0x1A, 0x9F, 0x18, 0x3C, 0x53, 0x8A, 0xFC, 0x9C, 0xF1, 0x58, 0x5D, 0xA3, + 0xD5, 0x18, 0x6C, 0xC7, 0x55, 0x2F, 0x46, 0x5D, 0xFB, 0x33, 0x75, 0x50, + 0x0A, 0x28, 0x37, 0x99, 0xBD, 0x06, 0xAD, 0x14, 0x84, 0xB5, 0x9D, 0xDF, + 0x04, 0x3F, 0x33, 0x28, 0x1F, 0xD8, 0x57, 0xB7, 0x6A, 0x90, 0x18, 0xC7, + 0xA6, 0x1B, 0x56, 0xD1, 0xBF, 0x22, 0x4E, 0x33, 0x6A, 0x7F, 0x94, 0xB8, + 0xA6, 0x0C, 0xA0, 0xE0, 0x7C, 0xD1, 0xEE, 0xDA, 0xFF, 0xE0, 0x9B, 0x41, + 0x75, 0xD7, 0xCA, 0x96, 0x01, 0xA9, 0xAA, 0xAD, 0x75, 0x54, 0xBA, 0x86, + 0x14, 0xF1, 0x84, 0x66, 0xC3, 0xC8, 0x66, 0x71, 0x63, 0x0D, 0x4A, 0x2C, + 0x85, 0x4E, 0xD7, 0x6F, 0x9A, 0x59, 0x51, 0x8A, 0xB6, 0xAF, 0xF5, 0x5F, + 0x18, 0xA2, 0x49, 0xD0, 0x34, 0xD4, 0x51, 0xF9, 0x8D, 0xA3, 0x91, 0x59, + 0x7C, 0x87, 0x9D, 0x31, 0x14, 0xE0, 0xF0, 0x08, 0x95, 0x2C, 0x61, 0xCC, + 0x53, 0xE2, 0x15, 0x9D, 0xEE, 0xA1, 0xC2, 0xDE, 0x2B, 0x53, 0xB6, 0x21, + 0x88, 0xE0, 0x5B, 0x77, 0x1F, 0x50, 0xEF, 0xFA, 0xAA, 0x48, 0xCF, 0x97, + 0x40, 0x3B, 0xC1, 0x82, 0x34, 0x6D, 0xAB, 0xB4, 0xAD, 0x5A, 0xE3, 0x99, + 0x78, 0xB6, 0xBD, 0x16, 0x34, 0x32, 0xC9, 0xA2, 0xC2, 0xA1, 0xAB, 0xB3, + 0xFA, 0xA6, 0x62, 0x7D, 0xB5, 0xF7, 0x89, 0xAD, 0x9A, 0xA9, 0x7E, 0x1C, + 0x7F, 0x9C, 0x64, 0x30, 0x47, 0x9B, 0x6E, 0x48, 0x62, 0x2C, 0xDE, 0x9A, + 0xAF, 0x2A, 0xE2, 0xF1, 0x7B, 0xEA, 0xA2, 0xAA, 0x75, 0x3C, 0xB5, 0xB2, + 0xC5, 0x2F, 0x0F, 0x50, 0x36, 0x15, 0x12, 0x71, 0x48, 0x2A, 0xD2, 0x73, + 0x02, 0xB3, 0xA8, 0xBE, 0x24, 0x18, 0x79, 0xB0, 0xE0, 0x06, 0x07, 0x13, + 0xE5, 0xF6, 0x32, 0x96, 0x9C, 0x88, 0x6B, 0xF0, 0xFB, 0xA9, 0x04, 0x52, + 0x18, 0x41, 0x91, 0x5D, 0x4C, 0xDC, 0x96, 0x35, 0x45, 0x85, 0x1D, 0x1C, + 0xDF, 0x28, 0xCA, 0x07, 0xC5, 0x27, 0x47, 0xF7, 0x30, 0x6D, 0xDF, 0x28, + 0x12, 0xCA, 0x28, 0x31, 0x71, 0x77, 0xCC, 0x35, 0x0A, 0x2E, 0x81, 0xEE, + 0xD2, 0x6F, 0x01, 0x95, 0x5A, 0x97, 0x44, 0xCA, 0x18, 0x69, 0xD9, 0xA0, + 0xC8, 0x88, 0xF3, 0x2B, 0x7A, 0x7F, 0xFD, 0x5F, 0xA6, 0x42, 0x3D, 0x1A, + 0x36, 0x78, 0x4D, 0x1B, 0x56, 0x8F, 0x3A, 0xCB, 0x65, 0x77, 0x9E, 0x78, + 0x03, 0xDE, 0xA9, 0xE6, 0x0D, 0x06, 0xF6, 0x43, 0xC6, 0x94, 0xCB, 0x37, + 0xEA, 0xC1, 0x97, 0x01, 0x69, 0x41, 0x6D, 0x55, 0x7C, 0xC8, 0x9C, 0xD1, + 0x4A, 0x66, 0x9E, 0x90, 0x03, 0xCA, 0x29, 0x53, 0x68, 0x0F, 0x69, 0x6C, + 0x7D, 0xEB, 0xAD, 0xD9, 0x1A, 0xA4, 0x46, 0xB4, 0x92, 0x9C, 0x42, 0x0E, + 0x9F, 0x81, 0x29, 0xA2, 0xDF, 0xB0, 0x2C, 0x4C, 0x32, 0xA2, 0x57, 0x25, + 0x01, 0xB1, 0x9C, 0x12, 0x53, 0xC7, 0xF0, 0x0A, 0x60, 0xA6, 0x51, 0xC9, + 0x8F, 0xB4, 0x52, 0x20, 0x8A, 0x61, 0x17, 0x76, 0xA3, 0x85, 0xB9, 0x51, + 0x02, 0x0A, 0x2D, 0x81, 0x07, 0x90, 0x56, 0x96, 0xA7, 0xF9, 0x5A, 0x36, + 0x6E, 0x2A, 0xA8, 0x7E, 0xC1, 0xD8, 0x23, 0x0E, 0x81, 0xBA, 0x85, 0xDD, + 0x60, 0x61, 0x28, 0xEF, 0x93, 0x4E, 0x12, 0x9B, 0x1A, 0x0B, 0xC7, 0xEB, + 0x7C, 0xE0, 0xEF, 0x24, 0xA1, 0x0A, 0x7D, 0x98, 0xB8, 0x55, 0xF9, 0x88, + 0x42, 0xA2, 0x69, 0xC5, 0x8C, 0x24, 0xE1, 0xA1, 0xA4, 0xDE, 0x34, 0x6E, + 0x08, 0xFD, 0x1F, 0x25, 0x0C, 0x94, 0xEF, 0x08, 0x62, 0x63, 0x75, 0x08, + 0x3E, 0x71, 0xAF, 0xA6, 0xFA, 0x5D, 0x8E, 0xA8, 0x37, 0x00, 0xB7, 0xDF, + 0x4A, 0x4D, 0x6E, 0x92, 0x0A, 0x45, 0x02, 0xF8, 0xF0, 0x08, 0x77, 0x38, + 0x0C, 0x2B, 0xAE, 0x15, 0xF8, 0x40, 0x6C, 0x40, 0xCC, 0x08, 0x76, 0xB4, + 0xD5, 0x92, 0x59, 0x49, 0xA0, 0x98, 0xEC, 0x65, 0xCE, 0xCC, 0xAF, 0x8B, + 0xC4, 0xA9, 0xE8, 0x2B, 0x23, 0x90, 0xC0, 0x19, 0x12, 0x15, 0x23, 0xCE, + 0xD4, 0x80, 0x22, 0x82, 0x30, 0x6A, 0x50, 0xFA, 0x6D, 0x3A, 0xBD, 0x4B, + 0xE1, 0x5B, 0x1A, 0x07, 0x88, 0x4E, 0xD0, 0x42, 0xA6, 0xFD, 0x5E, 0x3C, + 0x7F, 0x53, 0x20, 0xDD, 0x9C, 0x46, 0xEA, 0xE8, 0x8D, 0x6F, 0x17, 0x57, + 0x41, 0x59, 0xEA, 0x27, 0xC7, 0x70, 0xFB, 0x12, 0x2D, 0x6C, 0xF7, 0xEF, + 0xA7, 0x6A, 0x5C, 0x15, 0x09, 0xE3, 0x63, 0xF1, 0x5B, 0xB8, 0xE4, 0x69, + 0x92, 0x7C, 0x13, 0x90, 0xBB, 0xA3, 0xE8, 0xF0, 0xC9, 0xF3, 0xD5, 0x27, + 0xB7, 0xC4, 0x2B, 0xEB, 0x66, 0x19, 0x36, 0x9B, 0x88, 0x88, 0xFD, 0xBA, + 0x0F, 0x2E, 0x66, 0x98, 0x94, 0x3C, 0x6F, 0x09, 0x0B, 0x89, 0x35, 0x3A, + 0x8A, 0x8A, 0x7B, 0xA5, 0x1F, 0x9B, 0x9D, 0x53, 0x67, 0xEE, 0xBC, 0x8C, + 0x63, 0x83, 0x11, 0x31, 0x87, 0x24, 0x36, 0xBA, 0x7F, 0xC5, 0xA2, 0x06, + 0x33, 0x10, 0x79, 0xEC, 0x01, 0x89, 0x48, 0x96, 0x2A, 0xC9, 0x25, 0x0F, + 0xF3, 0x92, 0x1E, 0x52, 0x93, 0xCD, 0x65, 0x71, 0x2B, 0x98, 0xE7, 0xC8, + 0x29, 0xA3, 0x21, 0x43, 0xF0, 0x37, 0x3C, 0x36, 0x8E, 0x7F, 0xDC, 0x95, + 0xA1, 0x56, 0xA1, 0x20, 0xA1, 0xBC, 0x5C, 0x30, 0xDE, 0x52, 0x54, 0xC8, + 0x73, 0xCE, 0xA6, 0x30, 0x44, 0x0F, 0x3F, 0xA0, 0x7B, 0x7E, 0x11, 0x66, + 0x2E, 0xD6, 0xD8, 0x85, 0x5B, 0x56, 0xC1, 0xD3, 0xEE, 0xF1, 0x7E, 0xBA, + 0x08, 0xF1, 0xA4, 0x49, 0xB3, 0x0C, 0x41, 0xA3, 0xFC, 0xAF, 0xA6, 0x9E, + 0x90, 0x25, 0x44, 0xC2, 0x36, 0x64, 0x74, 0x38, 0xC9, 0xBC, 0xA5, 0xE8, + 0x36, 0x2E, 0x84, 0xCD, 0xEA, 0x22, 0x8A, 0x09, 0x94, 0xB2, 0x38, 0x67, + 0xC3, 0xBD, 0x7C, 0x79, 0x12, 0x3D, 0xE2, 0xA0, 0x0A, 0x1F, 0xCE, 0xE7, + 0x1D, 0x7A, 0xB5, 0x2B, 0x4E, 0x62, 0x82, 0x37, 0xEC, 0xFB, 0x7B, 0x05, + 0xAC, 0xE5, 0x10, 0x60, 0x8B, 0x09, 0x7D, 0xC8, 0x16, 0xE0, 0xFA, 0x78, + 0x35, 0x13, 0xF6, 0x8D, 0xB0, 0x39, 0x5F, 0xC8, 0xF4, 0x08, 0xCF, 0x0D, + 0xA9, 0xA1, 0xC6, 0xE0, 0xDC, 0x0A, 0x4D, 0x54, 0x6C, 0x47, 0x16, 0xFD, + 0x61, 0x08, 0xD3, 0x90, 0xC3, 0x4A, 0xD2, 0xE0, 0x7E, 0xE9, 0xB1, 0x62, + 0xBD, 0x15, 0x61, 0xB8, 0x6A, 0xF2, 0x76, 0x66, 0xBB, 0x5C, 0xB6, 0x87, + 0x40, 0x8B, 0xFF, 0x90, 0x1F, 0xB7, 0x63, 0xF3, 0x73, 0xF4, 0xE9, 0xEB, + 0x96, 0xA9, 0x73, 0xA5, 0xF5, 0x94, 0x5E, 0x16, 0x9B, 0xB1, 0x9F, 0x2F, + 0x6B, 0x9D, 0x13, 0x6F, 0x01, 0xD6, 0xB6, 0x74, 0xA7, 0x86, 0x19, 0x82, + 0x6F, 0x50, 0x1A, 0x44, 0x5D, 0x47, 0xC5, 0xC5, 0x66, 0xEF, 0x24, 0xE3, + 0xA8, 0x16, 0xD3, 0xEB, 0x2B, 0x06, 0x54, 0xDB, 0x9B, 0x1F, 0xFE, 0x8D, + 0x03, 0x1C, 0x63, 0x4C, 0xFA, 0x7E, 0xB8, 0x5A, 0xA3, 0x50, 0x2D, 0xE1, + 0x04, 0xE1, 0x15, 0x31, 0xF7, 0xB3, 0x23, 0xD7, 0x0E, 0x78, 0x42, 0x4D, + 0x28, 0x1F, 0xF2, 0x9D, 0xFC, 0x4A, 0xEC, 0xA1, 0xF2, 0x6E, 0x40, 0xA2, + 0xD9, 0xEC, 0x67, 0xDB, 0x81, 0x7C, 0xEA, 0x72, 0x38, 0xAF, 0xA2, 0x06, + 0xCC, 0xAB, 0x22, 0xFA, 0x5C, 0xF9, 0xB7, 0x9D, 0xE5, 0x35, 0x11, 0xE8, + 0xB3, 0x01, 0xFB, 0xEF, 0xE8, 0xE4, 0x08, 0x36, 0xDB, 0xB3, 0x83, 0x8D, + 0xD0, 0xA9, 0xFD, 0xFB, 0x8A, 0x28, 0x60, 0xD3, 0xDC, 0x72, 0x52, 0x40, + 0x97, 0x53, 0xBB, 0xA2, 0xAF, 0x6F, 0x04, 0x2B, 0xBE, 0x8E, 0x16, 0x2D, + 0x0E, 0x7C, 0x2A, 0xEB, 0xC1, 0xC8, 0x6E, 0x96, 0x29, 0x1F, 0x64, 0x26, + 0xFF, 0x89, 0xF3, 0x2D, 0xF2, 0x26, 0xF0, 0x74, 0x0F, 0x4D, 0x7F, 0x2F, + 0x61, 0x3C, 0xE9, 0x03, 0x43, 0x82, 0x24, 0x2F, 0x80, 0x42, 0x5D, 0xBE, + 0xFA, 0x13, 0x06, 0x0F, 0xA8, 0x82, 0x44, 0x04, 0x97, 0xC4, 0x21, 0x21, + 0x4C, 0x4D, 0xB4, 0x37, 0xB3, 0x5D, 0xD8, 0xF7, 0xDB, 0xC3, 0xC6, 0x21, + 0x98, 0xF3, 0x11, 0x7A, 0x8D, 0xD9, 0xE3, 0xD9, 0x7F, 0xF6, 0xED, 0x44, + 0xCC, 0xCB, 0x2A, 0x2D, 0x22, 0x3C, 0x23, 0x64, 0x25, 0xA0, 0xCC, 0xDE, + 0x99, 0x01, 0xE8, 0xCB, 0xB4, 0xE6, 0x4D, 0xEB, 0x57, 0xEC, 0xDA, 0xB3, + 0x9A, 0x7E, 0xF5, 0xCC, 0x9B, 0x9D, 0x3A, 0xC8, 0xD4, 0xA9, 0x39, 0x7D, + 0x6A, 0x63, 0xC7, 0x48, 0xFF, 0x8E, 0x36, 0x81, 0x8C, 0x2B, 0x8F, 0x1E, + 0x52, 0x42, 0xEE, 0x1C, 0xBB, 0xB9, 0xE9, 0xC5, 0xB9, 0x27, 0x47, 0xA7, + 0x92, 0x39, 0x01, 0x3E, 0x35, 0xA9, 0x6C, 0x47, 0x55, 0x46, 0x07, 0x28, + 0x82, 0x5C, 0x0A, 0xC7, 0x07, 0x6A, 0xE0, 0x57, 0x9F, 0x3C, 0x08, 0xDA, + 0xA2, 0x5E, 0xE8, 0xA1, 0xBC, 0xB2, 0x4F, 0xD1, 0xB0, 0x2E, 0x71, 0xC2, + 0xAC, 0xA4, 0xF1, 0x8B, 0xE1, 0xF8, 0x30, 0xD6, 0x48, 0xBC, 0x79, 0x74, + 0xF6, 0xC3, 0x3F, 0x83, 0x75, 0xC4, 0xC5, 0x20, 0xED, 0x01, 0xB6, 0xA9, + 0x3B, 0x22, 0xC0, 0x1F, 0xC2, 0x49, 0xF0, 0xA9, 0x5F, 0x53, 0x6D, 0x6D, + 0xB8, 0xE1, 0x6D, 0x9E, 0xE8, 0xD5, 0x45, 0x34, 0x69, 0x87, 0xF8, 0x42, + 0x78, 0x1A, 0xD0, 0x07, 0x6A, 0xC6, 0x9E, 0x56, 0xEB, 0xA6, 0xF6, 0x71, + 0x88, 0x80, 0x3A, 0xDD, 0xDC, 0xC4, 0x8E, 0xA3, 0x74, 0x6D, 0x10, 0xBA, + 0x26, 0x98, 0xE1, 0x68, 0x49, 0x6A, 0x86, 0x0F, 0x62, 0xA5, 0x75, 0x83, + 0xD9, 0x5A, 0xD6, 0x34, 0x81, 0x65, 0x17, 0xA9, 0xD2, 0xF0, 0x35, 0x35, + 0x27, 0x9D, 0x81, 0x72, 0xAE, 0xA4, 0xC0, 0xFE, 0x09, 0x95, 0xFA, 0x3D, + 0x78, 0xEA, 0x3D, 0xA5, 0xA9, 0xB6, 0x4B, 0x91, 0xBA, 0x31, 0x44, 0xCD, + 0xD6, 0x94, 0x7A, 0x38, 0x40, 0x75, 0xD6, 0x4C, 0x6F, 0x30, 0x8A, 0x8E, + 0xF6, 0x75, 0x50, 0x70, 0x17, 0x28, 0xED, 0x0B, 0xDF, 0xEB, 0x8B, 0x94, + 0x05, 0x9B, 0x85, 0x7A, 0xAA, 0xE7, 0x76, 0xE4, 0x5D, 0x9D, 0x2A, 0x02, + 0x9A, 0x96, 0x70, 0xA4, 0xC5, 0x4D, 0x90, 0x18, 0x5D, 0x31, 0x2E, 0x49, + 0xFF, 0xA9, 0xBE, 0x9D, 0x9E, 0x7F, 0x6E, 0x0A, 0x08, 0x04, 0x83, 0x43, + 0xA1, 0x5B, 0x44, 0xA4, 0xAC, 0x66, 0xE1, 0x5A, 0xA3, 0x70, 0xED, 0x00, + 0x84, 0x53, 0x0E, 0x52, 0x22, 0x29, 0x3D, 0x14, 0x9D, 0x9C, 0x1C, 0xBC, + 0x0A, 0x19, 0xC0, 0x7B, 0xED, 0xBC, 0x4D, 0x15, 0x8B, 0xEC, 0x99, 0xF7, + 0x68, 0x76, 0xCD, 0x3C, 0x11, 0x57, 0x28, 0x49, 0xF1, 0x0F, 0x7F, 0x74, + 0x24, 0x40, 0x05, 0x98, 0xFF, 0xF4, 0xE7, 0xB7, 0x84, 0xDB, 0x55, 0x09, + 0xD6, 0x0B, 0xE4, 0x5B, 0xF9, 0xFF, 0xB1, 0x2E, 0x25, 0x00, 0x3C, 0x9A, + 0xEE, 0x1B, 0x24, 0x07, 0x3C, 0xE1, 0xA9, 0xB1, 0x90, 0x44, 0x73, 0x1E, + 0xD1, 0xFA, 0x00, 0x35, 0xF5, 0x79, 0xAB, 0xDE, 0xB3, 0x5E, 0x62, 0x56, + 0x0B, 0xCC, 0xA3, 0x49, 0x67, 0x44, 0x79, 0x85, 0x3A, 0x5D, 0x2B, 0x9D, + 0xA3, 0x57, 0x44, 0x97, 0x2A, 0x50, 0x34, 0xA9, 0x2F, 0x20, 0xE7, 0x58, + 0x49, 0xF9, 0x54, 0x8F, 0x9B, 0xE1, 0xCC, 0x44, 0xC2, 0x27, 0xBE, 0x60, + 0xDD, 0x6E, 0x4D, 0xFB, 0xA8, 0xB7, 0x5E, 0xFA, 0xBF, 0xDE, 0xF2, 0xB2, + 0xDE, 0xF9, 0x55, 0x40, 0xD3, 0xB7, 0x63, 0x56, 0x74, 0x2D, 0x12, 0x37, + 0x2D, 0xD6, 0x7E, 0x84, 0x63, 0x3E, 0xAD, 0x44, 0x69, 0x58, 0x8D, 0xEE, + 0x9A, 0xA2, 0xF7, 0xFD, 0x90, 0x05, 0xD3, 0x52, 0x2C, 0x53, 0xFF, 0xA0, + 0xC3, 0x42, 0xE9, 0x6E, 0x61, 0x68, 0xE9, 0x88, 0x39, 0x35, 0xD7, 0xA0, + 0x03, 0xDA, 0x49, 0x0E, 0x9C, 0x03, 0xE4, 0x87, 0x95, 0xA5, 0xD9, 0xD6, + 0x29, 0xA2, 0xFB, 0x63, 0x9E, 0xDE, 0x7C, 0x9E, 0x1E, 0xAF, 0x86, 0xC8, + 0xD0, 0x27, 0x5E, 0xE1, 0xD3, 0xC6, 0x3A, 0x60, 0xD8, 0x43, 0xD7, 0xDC, + 0xFB, 0xC5, 0x72, 0xBF, 0xCF, 0xBD, 0x3A, 0x16, 0xEF, 0x79, 0xC6, 0x3E, + 0xB4, 0x27, 0x4C, 0x60, 0x2B, 0x4C, 0xAF, 0x44, 0x26, 0x1E, 0xAB, 0xEC, + 0xB2, 0xCE, 0xD6, 0xD1, 0x71, 0xFE, 0x8A, 0xE2, 0xA5, 0x6C, 0x53, 0x89, + 0x84, 0x08, 0x8E, 0x79, 0x41, 0xE7, 0xBB, 0x36, 0x8F, 0xFA, 0x81, 0xED, + 0x6D, 0x7B, 0x4F, 0x4B, 0x52, 0xC9, 0x03, 0x83, 0x65, 0xC4, 0xF3, 0x28, + 0xC3, 0x44, 0x25, 0x85, 0x5D, 0x6D, 0x07, 0x38, 0xDE, 0xC3, 0x33, 0x6E, + 0x09, 0x16, 0x64, 0x3F, 0x2F, 0x8A, 0x22, 0x53, 0xEE, 0xDB, 0x1B, 0xF1, + 0x41, 0xD2, 0xE5, 0x26, 0xD2, 0xD5, 0x9F, 0x2B, 0x1E, 0x78, 0xFE, 0x81, + 0x03, 0x68, 0x79, 0x7C, 0xEB, 0x3E, 0x71, 0xF0, 0x64, 0x28, 0xA0, 0x3E, + 0x54, 0x44, 0x2B, 0x56, 0x21, 0x11, 0xD6, 0xD7, 0x35, 0xB3, 0xFD, 0xC1, + 0xE5, 0xE6, 0x10, 0xB3, 0xCC, 0xD5, 0x24, 0x25, 0xE0, 0xF6, 0x1A, 0x0F, + 0xF9, 0xD5, 0x34, 0x72, 0x26, 0xD1, 0x9F, 0xFA, 0xFA, 0x41, 0x1C, 0x22, + 0x97, 0x99, 0x16, 0x41, 0xA8, 0xDC, 0x3B, 0x59, 0xC6, 0xB1, 0x9E, 0xB6, + 0x10, 0xD1, 0xD3, 0x36, 0xC8, 0x12, 0x73, 0x4D, 0x7D, 0xD0, 0xFE, 0xF5, + 0x82, 0x0A, 0x4A, 0x20, 0x5C, 0xE1, 0x7F, 0x19, 0xFD, 0x1B, 0x34, 0x14, + 0xE1, 0x8A, 0xDB, 0x01, 0x9B, 0xF8, 0x68, 0x78, 0x2E, 0x9B, 0x6A, 0x3C, + 0xF5, 0x86, 0x67, 0xF7, 0x6D, 0x92, 0xF3, 0xD6, 0x00, 0x77, 0x6B, 0x5F, + 0x60, 0x16, 0xE6, 0x41, 0xAB, 0xF6, 0x51, 0xC5, 0x0D, 0xF0, 0x96, 0x13, + 0xBB, 0x14, 0x82, 0x44, 0xD1, 0xCC, 0x86, 0xDE, 0xC1, 0x51, 0x88, 0xE3, + 0x72, 0x02, 0x5B, 0x41, 0xA2, 0x43, 0x0E, 0xEC, 0x3B, 0xEE, 0xAB, 0xB7, + 0xEE, 0xAC, 0xCA, 0x84, 0x71, 0x3F, 0x9F, 0xB7, 0x59, 0x4F, 0x7B, 0x2C, + 0x76, 0x10, 0xF1, 0xF8, 0xDC, 0x88, 0x8D, 0x03, 0x76, 0x6D, 0x1D, 0x4B, + 0x98, 0x08, 0x74, 0x1D, 0x2E, 0xD5, 0xFC, 0xF3, 0x68, 0x27, 0xB3, 0xA1, + 0x89, 0x26, 0x5E, 0x8D, 0x5C, 0xE4, 0x86, 0x9B, 0x10, 0xF0, 0x86, 0xC3, + 0xE0, 0x76, 0xFF, 0x8B, 0x8C, 0x39, 0x32, 0x4E, 0xF8, 0xF3, 0x86, 0xE6, + 0x0C, 0x6A, 0x00, 0xEB, 0x7F, 0xBD, 0xDE, 0x7F, 0x0C, 0x80, 0xBA, 0x8B, + 0xEA, 0x8D, 0x20, 0xCB, 0x86, 0x81, 0x1B, 0x44, 0x49, 0x65, 0xD1, 0xFA, + 0x12, 0xD8, 0x1B, 0xD7, 0x6D, 0xA7, 0xF6, 0x53, 0x19, 0x8D, 0x9A, 0x04, + 0x34, 0xB2, 0x15, 0xDD, 0xE7, 0x46, 0x75, 0xAA, 0x90, 0xEC, 0x41, 0x9C, + 0x93, 0xBA, 0xFD, 0xFE, 0x08, 0xFD, 0x86, 0x73, 0x7C, 0x93, 0xB6, 0xD0, + 0x3E, 0x16, 0x82, 0x05, 0x01, 0xC4, 0xBE, 0x9C, 0x24, 0x05, 0x94, 0x53, + 0x25, 0xBD, 0x67, 0x48, 0x7C, 0x66, 0xDC, 0xB6, 0x9D, 0x28, 0x26, 0x22, + 0xFA, 0x5D, 0xF6, 0x39, 0x31, 0x1D, 0xDA, 0xAA, 0x1A, 0x04, 0x40, 0x33, + 0x67, 0xA5, 0x97, 0x48, 0xB1, 0x06, 0xFB, 0x9A, 0xEC, 0xF0, 0x04, 0x5F, + 0x11, 0x26, 0x23, 0x93, 0x90, 0x48, 0x72, 0x92, 0xBD, 0xB8, 0xA6, 0xD1, + 0xEE, 0x70, 0xFD, 0xB8, 0x53, 0x91, 0x62, 0xC1, 0x48, 0x0D, 0x70, 0xBB, + 0xCD, 0xD4, 0xC3, 0xA1, 0x3D, 0x24, 0x42, 0x59, 0xD6, 0x3B, 0xA0, 0xD0, + 0xAC, 0x89, 0x07, 0x45, 0x66, 0xC9, 0x1D, 0xBF, 0x66, 0xC4, 0xF9, 0x5D, + 0x90, 0x3D, 0x84, 0x10, 0x62, 0x21, 0x37, 0x78, 0x8D, 0x27, 0xF2, 0x01, + 0xA8, 0xD0, 0x2E, 0x81, 0xA0, 0xDB, 0x8D, 0x89, 0x78, 0x10, 0xBB, 0x49, + 0x60, 0xA0, 0x50, 0x11, 0x6B, 0x04, 0xF3, 0x2E, 0x41, 0xBF, 0x00, 0xC4, + 0xFA, 0xA8, 0x3B, 0x93, 0x9C, 0x90, 0x29, 0xD6, 0xBD, 0xC4, 0xE9, 0x26, + 0xE2, 0xDB, 0xE8, 0x7E, 0xD6, 0xA7, 0xE7, 0x55, 0x61, 0x5E, 0x46, 0x82, + 0x32, 0x8D, 0xD4, 0x96, 0xF5, 0x6B, 0xB3, 0x1D, 0x18, 0xA9, 0xAA, 0x8A, + 0x22, 0x49, 0xF7, 0xB7, 0x36, 0xF7, 0xD0, 0x96, 0x2E, 0xC6, 0x73, 0x99, + 0x93, 0x63, 0x12, 0x18, 0xF3, 0x82, 0x50, 0xE1, 0x96, 0x1B, 0x7E, 0xA9, + 0x29, 0xFF, 0xFA, 0x75, 0x07, 0x82, 0x7D, 0x94, 0x4C, 0x2D, 0xCC, 0x06, + 0xAD, 0x41, 0xF3, 0xB5, 0xF3, 0x6E, 0xAD, 0x8A, 0xDD, 0x7B, 0x7F, 0xE4, + 0x7D, 0x58, 0xA8, 0x6D, 0x7C, 0xED, 0x9C, 0x1B, 0x63, 0x94, 0xD6, 0x81, + 0x43, 0x1B, 0x8C, 0x1B, 0x7F, 0xB9, 0x1C, 0xB4, 0xD5, 0xB7, 0xBD, 0xED, + 0xAA, 0x8D, 0xE4, 0x06, 0xE8, 0x88, 0xDB, 0xB5, 0xCB, 0xE9, 0xA5, 0x30, + 0xA6, 0xD9, 0xA0, 0x99, 0x5F, 0x53, 0xC5, 0x9E, 0x4E, 0x29, 0xBB, 0xE5, + 0xC5, 0xA4, 0xD9, 0x99, 0x86, 0xF1, 0x11, 0xE1, 0x4A, 0x5D, 0xCB, 0xD4, + 0xF4, 0xBC, 0x66, 0x87, 0x33, 0x93, 0x76, 0xBC, 0x10, 0x4E, 0xC1, 0xB3, + 0x0B, 0x00, 0xF5, 0x0C, 0x57, 0x9A, 0xC5, 0x30, 0x45, 0xCC, 0xDE, 0x08, + 0xF0, 0x1C, 0x4C, 0x6D, 0xA9, 0xD8, 0x6C, 0x65, 0x7A, 0xC5, 0x0A, 0xE2, + 0x0A, 0x47, 0xB4, 0x2F, 0x82, 0x0A, 0x8B, 0x12, 0xF5, 0xF5, 0xC4, 0x08, + 0x17, 0x89, 0x4B, 0xEB, 0x11, 0x9E, 0x1F, 0x2E, 0x2A, 0x24, 0xDF, 0x15, + 0xC0, 0x1B, 0x04, 0xCE, 0x07, 0x10, 0xB5, 0x26, 0x81, 0xC4, 0x4C, 0xA5, + 0x14, 0x5B, 0x17, 0x57, 0x38, 0x61, 0xF9, 0x2A, 0x25, 0x0E, 0x51, 0x15, + 0x5B, 0xEB, 0x85, 0xFE, 0xAA, 0x3E, 0xB6, 0x10, 0x6E, 0x20, 0xAF, 0xAC, + 0xFA, 0xE7, 0x86, 0xFF, 0x96, 0xA9, 0xB3, 0xB7, 0x86, 0xAC, 0x2C, 0x53, + 0xD9, 0x0A, 0x7A, 0x01, 0xE1, 0x58, 0xBD, 0x8C, 0x7C, 0xB0, 0x7F, 0xBB, + 0x70, 0x9B, 0xE1, 0x9A, 0xB8, 0x0E, 0x5D, 0xC9, 0x5D, 0x90, 0xBE, 0x2F, + 0x94, 0xCE, 0x2E, 0x28, 0xFB, 0x09, 0xF8, 0xC0, 0x11, 0x31, 0x2F, 0xE2, + 0xFF, 0xE1, 0x63, 0xE8, 0x58, 0xB9, 0x4D, 0x27, 0x02, 0x7A, 0x05, 0xF0, + 0x61, 0x70, 0x34, 0xAA, 0xB6, 0xCC, 0xA1, 0xB8, 0xC3, 0x53, 0xAE, 0x1B, + 0x0D, 0xB6, 0x2B, 0x3D, 0x84, 0x5A, 0xC4, 0x12, 0xDF, 0x6C, 0x60, 0x73, + 0x28, 0xE1, 0x07, 0xFF, 0x2C, 0x04, 0xE8, 0xF1, 0x86, 0xCE, 0x38, 0x1E, + 0xDE, 0x06, 0x14, 0x59, 0x2A, 0x91, 0x24, 0x6C, 0x72, 0x7A, 0xB6, 0x2A, + 0x1A, 0x74, 0xB6, 0x5F, 0x88, 0xE3, 0xC0, 0xC9, 0x28, 0xDE, 0xE5, 0x4B, + 0x08, 0x7F, 0xD1, 0x75, 0x2D, 0xF6, 0x9E, 0x91, 0x8D, 0xF0, 0x79, 0x6A, + 0x0C, 0xA2, 0x19, 0xD4, 0xDE, 0xE6, 0x45, 0xFC, 0x66, 0xA0, 0xB8, 0x24, + 0x1D, 0x88, 0xDD, 0x31, 0x2C, 0x99, 0x02, 0x86, 0xC7, 0xF7, 0xA9, 0xFF, + 0x19, 0x61, 0x2E, 0xFA, 0xCE, 0xD2, 0x46, 0xD5, 0x89, 0xD1, 0xBC, 0x3E, + 0x03, 0x21, 0x13, 0x14, 0x65, 0x1C, 0x15, 0x54, 0xAB, 0x22, 0xA0, 0x52, + 0xEA, 0xEC, 0xB5, 0x8D, 0x7B, 0xC7, 0xFC, 0x9A, 0x1C, 0x30, 0x1D, 0x50, + 0x6A, 0xB6, 0xA4, 0x0F, 0x57, 0xE4, 0x6B, 0xBD, 0x69, 0x79, 0xF8, 0x75, + 0x43, 0xBE, 0xDC, 0x5C, 0xAD, 0xC0, 0xB8, 0xEF, 0xF1, 0x57, 0xB7, 0xEE, + 0xAB, 0xBA, 0x94, 0xBD, 0xEE, 0x62, 0x0C, 0x99, 0xC8, 0xC1, 0x7C, 0x07, + 0xCE, 0xE0, 0x51, 0x34, 0x67, 0x8D, 0xFD, 0x89, 0x7E, 0xFD, 0x56, 0xBC, + 0xD1, 0x3E, 0x4C, 0x30, 0x11, 0xA4, 0x2C, 0x4E, 0x98, 0xA3, 0xAC, 0xD4, + 0x34, 0xE4, 0xD2, 0x30, 0xA5, 0xC6, 0xD5, 0xBE, 0xE9, 0x93, 0x20, 0x2E, + 0xD0, 0xD3, 0x27, 0x6C, 0x18, 0xB3, 0xE4, 0x38, 0x09, 0x93, 0x49, 0xE7, + 0xB3, 0x25, 0xDF, 0x5F, 0x80, 0x36, 0xC4, 0x74, 0x03, 0x3B, 0x12, 0x0C, + 0x4E, 0xA3, 0x79, 0x42, 0x15, 0xC8, 0x7D, 0xE3, 0xCD, 0xED, 0x30, 0x3F, + 0x23, 0x11, 0x15, 0x37, 0xB5, 0x03, 0x04, 0x1D, 0xD3, 0x9E, 0x6B, 0x68, + 0x78, 0xE7, 0xBF, 0xB6, 0x3D, 0x89, 0x21, 0xF9, 0xAA, 0xC4, 0xD7, 0x54, + 0x17, 0xD6, 0xF3, 0x3E, 0xDC, 0xE9, 0xB3, 0x87, 0xA0, 0x3B, 0x6A, 0x54, + 0xB0, 0x6D, 0x9E, 0xB0, 0xC2, 0x48, 0xA7, 0xE9, 0x29, 0xEB, 0xDF, 0x88, + 0xE6, 0x9F, 0x4B, 0x83, 0xAF, 0x29, 0x4F, 0x30, 0x62, 0x37, 0xC5, 0x23, + 0xFB, 0x19, 0x08, 0x1D, 0xFF, 0xA3, 0x19, 0xB2, 0xEB, 0xBF, 0x68, 0x88, + 0xBC, 0x1F, 0x9A, 0xE5, 0x2A, 0x24, 0x46, 0xC0, 0x87, 0x82, 0x7F, 0x49, + 0x7F, 0x71, 0x50, 0x69, 0xD6, 0x57, 0x27, 0x58, 0x64, 0xFD, 0x06, 0xB8, + 0x05, 0x5D, 0x74, 0xD0, 0x33, 0xFC, 0x5A, 0x34, 0x6F, 0x1E, 0xB3, 0x0E, + 0xFE, 0x6B, 0x27, 0xCE, 0x3A, 0x51, 0x2D, 0xF5, 0x48, 0x4C, 0x27, 0x36, + 0x26, 0x87, 0xE7, 0x3B, 0xB6, 0x64, 0x95, 0x5C, 0x73, 0x3D, 0xD4, 0x2C, + 0x4C, 0x03, 0x02, 0x9F, 0x0E, 0xBD, 0xF0, 0xA3, 0x4C, 0xE6, 0xC9, 0xE1, + 0xBE, 0x4C, 0x1A, 0xBD, 0xE8, 0x39, 0x75, 0xEC, 0xAA, 0x0A, 0x3D, 0xED, + 0x77, 0x57, 0x44, 0x92, 0xF3, 0xE6, 0x86, 0xFA, 0x11, 0x75, 0x7C, 0xA2, + 0x1A, 0xF3, 0x36, 0x95, 0xA5, 0xE4, 0xAB, 0x77, 0x8A, 0xA5, 0xCF, 0x72, + 0xAB, 0x7B, 0xBC, 0xB7, 0x4F, 0x9A, 0xB3, 0xD6, 0xE6, 0xA7, 0x76, 0x8E, + 0x44, 0xD3, 0x4B, 0x2D, 0xC7, 0xC9, 0xCA, 0x1C, 0xE4, 0x94, 0x86, 0x60, + 0xF9, 0x9E, 0xEC, 0xA9, 0xD8, 0x47, 0xF1, 0xAB, 0xD7, 0x08, 0x89, 0x63, + 0xA4, 0x1D, 0x6C, 0xC7, 0xCC, 0x62, 0xB5, 0xC6, 0x92, 0x1C, 0x12, 0x49, + 0x3E, 0x35, 0x01, 0x44, 0x64, 0x3F, 0xEC, 0x73, 0x79, 0x88, 0xC2, 0x57, + 0x34, 0x41, 0x49, 0x9D, 0xF6, 0xE9, 0x4D, 0xCC, 0xE1, 0x96, 0xCF, 0x21, + 0xA6, 0xFA, 0x9E, 0x1C, 0xDC, 0x6A, 0x0A, 0x97, 0x46, 0x9A, 0x4B, 0x97, + 0x7C, 0x24, 0x10, 0x85, 0x83, 0xE7, 0x17, 0x36, 0xB9, 0xE6, 0x5D, 0xA0, + 0x56, 0xAD, 0xBE, 0xB5, 0x8B, 0x30, 0xD0, 0xC0, 0x67, 0x0E, 0x7D, 0x85, + 0xD1, 0x8A, 0x3B, 0x9F, 0xF4, 0x63, 0x67, 0xC1, 0x37, 0xEC, 0xFF, 0x5F, + 0x61, 0x4A, 0x98, 0xDC, 0xF4, 0x01, 0x59, 0x5F, 0xBC, 0xF0, 0x7D, 0x3A, + 0xD3, 0x2F, 0x19, 0x4F, 0xB1, 0x85, 0x18, 0x3D, 0x4F, 0x99, 0xA0, 0x61, + 0x3B, 0x7C, 0x56, 0x56, 0x00, 0x5C, 0x4E, 0xD9, 0x49, 0x66, 0xDF, 0xF5, + 0x28, 0xA3, 0x83, 0x9E, 0xAA, 0xC7, 0x6D, 0xE1, 0xF6, 0xEB, 0x7D, 0x61, + 0xFF, 0xFA, 0xDC, 0x26, 0x46, 0x69, 0x66, 0x77, 0x2B, 0x68, 0xA9, 0x63, + 0xD0, 0x55, 0xA1, 0xFF, 0xFB, 0xC6, 0x87, 0xF1, 0x01, 0x83, 0x4D, 0x1D, + 0xD6, 0x26, 0x51, 0x36, 0x7F, 0x85, 0x73, 0xF7, 0x77, 0xD5, 0x03, 0xCF, + 0x76, 0x40, 0xA9, 0xDC, 0x7C, 0x03, 0xFE, 0x59, 0x8C, 0xF7, 0x93, 0x64, + 0x7A, 0x0E, 0xA3, 0xB6, 0x6B, 0xAD, 0xBD, 0xD3, 0xB0, 0x43, 0xC6, 0xCA, + 0x9D, 0x10, 0x04, 0x96, 0xB1, 0xCE, 0xEF, 0x1B, 0x8D, 0xE2, 0x67, 0x20, + 0x4F, 0x96, 0x2E, 0x6C, 0x6D, 0x21, 0xEC, 0x74, 0x0F, 0x23, 0xAE, 0x60, + 0x92, 0xB6, 0x19, 0x51, 0xFF, 0x96, 0xA9, 0xC5, 0xF1, 0x04, 0x50, 0x02, + 0xCE, 0xB1, 0x5E, 0x83, 0x06, 0x5C, 0x41, 0xB5, 0x2E, 0xBE, 0xDE, 0xB7, + 0x39, 0x4C, 0x22, 0xBB, 0x92, 0x4C, 0x74, 0x76, 0x9C, 0xDD, 0xE8, 0xF4, + 0xDF, 0xFF, 0xD3, 0x8F, 0x4D, 0xE8, 0xAF, 0xEA, 0xA1, 0xEC, 0x02, 0x32, + 0x37, 0xF0, 0xD5, 0xA4, 0x0A, 0x4C, 0x1C, 0x60, 0xE6, 0x95, 0x84, 0x9C, + 0xF8, 0xC0, 0x16, 0x7B, 0x88, 0xE6, 0x97, 0x82, 0x0C, 0x6A, 0xEC, 0xE5, + 0x8C, 0x9B, 0xFF, 0x96, 0x6D, 0xD5, 0x04, 0xE7, 0x59, 0xD0, 0xB0, 0xCE, + 0x6F, 0x9D, 0xBB, 0x7E, 0x09, 0x82, 0xDD, 0xC0, 0xE5, 0x37, 0xB9, 0x07, + 0xF0, 0x6E, 0xBA, 0x8C, 0x19, 0x77, 0xA4, 0x21, 0xCB, 0xE1, 0xFA, 0x14, + 0xC2, 0x68, 0xBF, 0x86, 0xC0, 0xEE, 0xB3, 0xED, 0x17, 0x8D, 0x99, 0x70, + 0x01, 0x61, 0xBF, 0x92, 0x18, 0xA9, 0x2C, 0xEE, 0x94, 0xB4, 0x88, 0x35, + 0x21, 0x56, 0xD1, 0x02, 0xA8, 0xC4, 0x12, 0x34, 0x69, 0x7E, 0x1A, 0xFC, + 0x64, 0x66, 0x32, 0x8E, 0xA4, 0x1C, 0xB9, 0xDD, 0x37, 0xF0, 0x52, 0xC6, + 0x76, 0x5A, 0xEA, 0x4F, 0x49, 0xD3, 0x1C, 0x83, 0x90, 0x96, 0x35, 0x67, + 0x65, 0x38, 0x86, 0xE2, 0x45, 0xA9, 0xC4, 0x07, 0x59, 0xAE, 0xCC, 0xD5, + 0xDD, 0x88, 0xDE, 0xF2, 0x52, 0xD9, 0x88, 0x02, 0x10, 0x13, 0x62, 0x8C, + 0x5A, 0x32, 0x76, 0x80, 0x31, 0xD0, 0xF2, 0x91, 0x22, 0x51, 0x26, 0x3C, + 0xD6, 0xA4, 0x1A, 0x61, 0x5A, 0xB2, 0x7D, 0xE7, 0xCD, 0x71, 0x0B, 0x28, + 0xB2, 0x3F, 0xA6, 0x38, 0xDC, 0xD9, 0x61, 0xD0, 0xE5, 0xC8, 0x0F, 0xF1, + 0xC9, 0x04, 0x09, 0x4A, 0x9F, 0x91, 0x7C, 0xEA, 0x88, 0x74, 0xC0, 0x32, + 0xB2, 0xCE, 0xBB, 0xA7, 0xE1, 0x95, 0x4E, 0xEF, 0xA0, 0x6F, 0xE0, 0x75, + 0xC3, 0x9F, 0x44, 0x02, 0xF1, 0x06, 0x0B, 0xFD, 0xC8, 0x11, 0x0B, 0xCB, + 0xCF, 0x19, 0xE1, 0x64, 0xDE, 0x8D, 0xEE, 0x97, 0x37, 0x48, 0x5F, 0xF6, + 0xE7, 0xCE, 0x5C, 0x7A, 0xB7, 0xC6, 0xAB, 0x4F, 0x9A, 0x33, 0x2C, 0xBF, + 0x7A, 0x2F, 0xEE, 0x28, 0x90, 0xD6, 0x6E, 0x8A, 0x6D, 0xE0, 0xDE, 0x0E, + 0x2B, 0x2B, 0xE1, 0x36, 0xBA, 0xD6, 0xE7, 0x1A, 0x3C, 0x2F, 0x34, 0xF3, + 0x39, 0xE2, 0x22, 0x33, 0x91, 0xEB, 0xFF, 0x1C, 0x00, 0x09, 0x82, 0xFE, + 0xAB, 0x1E, 0x1F, 0x40, 0x5E, 0x05, 0xF5, 0x6B, 0xCD, 0x52, 0xAB, 0xEA, + 0x52, 0x91, 0x23, 0x26, 0x91, 0x6F, 0xEF, 0xA3, 0x46, 0x70, 0xD9, 0x00, + 0x79, 0xE6, 0x06, 0x2F, 0x31, 0x2A, 0x35, 0x5F, 0x29, 0xDA, 0x7A, 0xF6, + 0xE2, 0x5B, 0xFA, 0x50, 0x5F, 0x27, 0xD9, 0x5E, 0x3D, 0x72, 0x2C, 0xE5, + 0x6F, 0x6C, 0xFA, 0x73, 0x2D, 0x5C, 0x02, 0xFF, 0x64, 0xF7, 0xBB, 0xC0, + 0x4D, 0x72, 0xCD, 0x3A, 0x68, 0xA8, 0xD0, 0xD4, 0xB4, 0x36, 0x25, 0x4D, + 0xD2, 0xF2, 0x72, 0x2E, 0x29, 0x6A, 0x5C, 0xAE, 0x53, 0x36, 0x26, 0x24, + 0x2D, 0x40, 0x7B, 0xE2, 0x95, 0xB1, 0x38, 0xCC, 0x98, 0xC3, 0xCA, 0xFD, + 0xD2, 0x14, 0x20, 0x67, 0x69, 0xFE, 0xA8, 0x3F, 0xE7, 0xA4, 0xF5, 0x12, + 0x72, 0x45, 0x35, 0x09, 0xFB, 0x41, 0x5E, 0xF7, 0x14, 0xC7, 0x6B, 0xF6, + 0x14, 0x1B, 0x3D, 0xB6, 0x30, 0xE2, 0x9E, 0xDA, 0xCE, 0x71, 0xF1, 0x7E, + 0xAB, 0xD6, 0xE3, 0xFE, 0x81, 0xFB, 0x0B, 0x46, 0xDB, 0x92, 0xBF, 0x0C, + 0x78, 0x48, 0x26, 0xD7, 0x06, 0xD2, 0x25, 0x24, 0x07, 0x94, 0xBD, 0x4B, + 0x1F, 0xC4, 0x97, 0x13, 0x45, 0xD3, 0x34, 0x7C, 0x6B, 0x6F, 0x2A, 0xD7, + 0x4B, 0x2C, 0xF3, 0x4D, 0x30, 0x8E, 0x6F, 0x08, 0x59, 0x23, 0xAD, 0x3C, + 0xE0, 0xF8, 0xF1, 0xC5, 0x6D, 0xF2, 0xB2, 0x8C, 0x1B, 0xB4, 0x0D, 0x06, + 0xAE, 0xBC, 0x9A, 0x26, 0xE8, 0x1B, 0xB1, 0x69, 0x57, 0xE9, 0x61, 0x9A, + 0xDF, 0xF2, 0xEA, 0x46, 0xC8, 0x1D, 0x49, 0xA1, 0x0F, 0x7A, 0x0D, 0xFC, + 0xC7, 0x45, 0xC5, 0x8B, 0xBC, 0xF7, 0x0B, 0x7E, 0x27, 0x60, 0x42, 0xD5, + 0x5C, 0x7F, 0x99, 0x77, 0x57, 0x3A, 0x9F, 0x7B, 0xC2, 0xE1, 0xDF, 0x96, + 0xD4, 0x70, 0x25, 0x5A, 0xBB, 0xC0, 0xEC, 0xB4, 0xC6, 0x93, 0x21, 0x29, + 0x96, 0xEC, 0x47, 0x41, 0x6C, 0xE3, 0x60, 0xFC, 0x40, 0x7F, 0x47, 0x1D, + 0x8A, 0x19, 0x2C, 0xE9, 0x10, 0x1B, 0x3B, 0x1A, 0x35, 0x29, 0xE4, 0xA6, + 0xBC, 0x6B, 0x35, 0x37, 0xF5, 0x39, 0xCD, 0x03, 0x4E, 0x9A, 0x88, 0xF8, + 0x88, 0xE1, 0x20, 0x6A, 0xA2, 0x77, 0xD0, 0xF0, 0x82, 0x3E, 0x23, 0x95, + 0x1C, 0x72, 0x06, 0xF6, 0x08, 0x0A, 0x79, 0x0C, 0x96, 0x0B, 0x6A, 0x19, + 0x13, 0x66, 0x3F, 0xA3, 0xC4, 0xBB, 0x63, 0x21, 0x8E, 0x83, 0xF9, 0x61, + 0x82, 0xC5, 0x0E, 0x47, 0x79, 0x9C, 0x09, 0x7C, 0xD2, 0xEE, 0x52, 0x06, + 0xDA, 0xAF, 0x4A, 0x69, 0xAA, 0x8C, 0xA1, 0x74, 0x33, 0x7E, 0x58, 0x0A, + 0x5C, 0xA9, 0x08, 0x8A, 0x9F, 0x89, 0x3D, 0x72, 0xC4, 0x6B, 0x26, 0xED, + 0xCB, 0x46, 0xFA, 0x0A, 0x5C, 0x6E, 0x3C, 0x66, 0x36, 0xC7, 0x5B, 0xEF, + 0xCE, 0x59, 0x9F, 0xF1, 0x41, 0xED, 0xA5, 0x70, 0x97, 0xF4, 0xD7, 0xB5, + 0x56, 0xFC, 0xBC, 0x50, 0xB6, 0xB4, 0x61, 0xED, 0x8E, 0x5E, 0xF0, 0x50, + 0xF0, 0x96, 0xF7, 0x81, 0xAD, 0xE2, 0x8C, 0xA7, 0xB8, 0xC7, 0x17, 0xD5, + 0x0C, 0x80, 0xB7, 0x7B, 0xA4, 0xD9, 0x89, 0x04, 0xF2, 0x7B, 0xF8, 0x89, + 0x8F, 0x58, 0x8B, 0x88, 0xEF, 0x6E, 0x9A, 0xCB, 0x67, 0xBA, 0x32, 0xA7, + 0x68, 0x92, 0x0A, 0xD7, 0xC9, 0xB9, 0x8B, 0xE6, 0x44, 0x0C, 0x38, 0x39, + 0x14, 0xBF, 0x0C, 0xE4, 0x68, 0x13, 0xB2, 0x2A, 0x0D, 0x2E, 0xA8, 0x53, + 0x46, 0x3D, 0xF5, 0xC6, 0x67, 0x8B, 0x2C, 0x50, 0x94, 0xD5, 0x4A, 0xB3, + 0xDA, 0xB0, 0x1F, 0xDD, 0x17, 0xED, 0xF9, 0xF5, 0xDB, 0x1F, 0x96, 0x33, + 0xE9, 0x81, 0x28, 0x86, 0x04, 0xAA, 0x0E, 0xEF, 0x8B, 0x6D, 0xE0, 0xA2, + 0x26, 0x34, 0xFF, 0x6D, 0xFE, 0x57, 0xB1, 0x0A, 0xE7, 0xE5, 0x7D, 0xD4, + 0x13, 0xEF, 0xC8, 0xDC, 0xFE, 0xFA, 0x0A, 0xF7, 0x34, 0x75, 0x37, 0xDC, + 0xA3, 0x96, 0xDA, 0x18, 0x75, 0xA3, 0x2D, 0x93, 0xD4, 0x2F, 0xD7, 0xDE, + 0x4B, 0xA2, 0x9C, 0x6A, 0x15, 0x36, 0xC5, 0x1F, 0x69, 0x82, 0x0C, 0x65, + 0x8C, 0x5E, 0x96, 0x07, 0xF7, 0x5D, 0x7B, 0x22, 0x7C, 0xAB, 0x0D, 0x91, + 0xD7, 0xAC, 0xB4, 0x9F, 0x46, 0x82, 0x81, 0xF8, 0xCC, 0xA6, 0x88, 0x6D, + 0xEA, 0x36, 0xB3, 0x0B, 0xA7, 0xC8, 0xB6, 0xBD, 0xC8, 0x74, 0x26, 0x09, + 0x57, 0xE4, 0xBD, 0x39, 0x86, 0xD9, 0xED, 0x2A, 0xA9, 0x77, 0x6B, 0xD3, + 0x77, 0xF9, 0x92, 0xEB, 0x1C, 0xF1, 0xB8, 0x97, 0xBD, 0x8E, 0xCB, 0xCB, + 0xF7, 0x1A, 0xBC, 0x12, 0x98, 0x79, 0x56, 0xD4, 0x0D, 0x31, 0xDE, 0xBF, + 0xB9, 0x12, 0x82, 0xA2, 0x69, 0x7A, 0x55, 0x23, 0x73, 0xF6, 0xF8, 0xA6, + 0x12, 0xCC, 0x51, 0x65, 0xD4, 0x00, 0xDF, 0x46, 0xA0, 0x37, 0xB8, 0x1C, + 0x39, 0xD8, 0x73, 0x66, 0xCB, 0x5F, 0xAE, 0x69, 0x3D, 0xFF, 0x9B, 0x13, + 0x33, 0xCF, 0xE0, 0x15, 0xD6, 0x78, 0x6B, 0xF1, 0x0F, 0x77, 0xEF, 0x33, + 0x64, 0x1C, 0xD8, 0x60, 0x2A, 0xC6, 0x62, 0xFB, 0xC9, 0x84, 0x10, 0xC2, + 0x76, 0x24, 0x4C, 0x6F, 0xAF, 0x23, 0x68, 0x3C, 0x71, 0xB1, 0x80, 0x71, + 0x0C, 0x86, 0xE0, 0x15, 0xBF, 0xC0, 0xAA, 0xB0, 0x18, 0x61, 0x48, 0x93, + 0xFD, 0xAD, 0xC8, 0xC4, 0x23, 0x18, 0x87, 0x21, 0x10, 0x55, 0x7A, 0x35, + 0xCC, 0x08, 0xBE, 0x2E, 0xE2, 0xA5, 0x99, 0xAB, 0x55, 0x90, 0x42, 0x19, + 0x6E, 0x62, 0x79, 0x4A, 0xE5, 0xE3, 0x70, 0xED, 0x91, 0x3F, 0x85, 0x02, + 0xB4, 0x0B, 0xF4, 0x84, 0x89, 0x6D, 0x95, 0xA4, 0x2A, 0x8A, 0x9E, 0x53, + 0xCE, 0x5D, 0xCA, 0xE7, 0x58, 0xB2, 0xB0, 0x40, 0x15, 0x5B, 0xA8, 0x79, + 0x02, 0xB5, 0x0F, 0xCA, 0x19, 0x8A, 0x3F, 0x2B, 0xA4, 0xE8, 0x66, 0x1D, + 0x70, 0x95, 0xF7, 0xE7, 0x4B, 0x1B, 0x37, 0x18, 0xFB, 0x4F, 0xEF, 0x93, + 0xDE, 0xCB, 0x2F, 0x5E, 0xD3, 0xA4, 0x56, 0x95, 0xA7, 0x0F, 0x89, 0xB8, + 0xE2, 0xC5, 0x35, 0xE0, 0x88, 0xD4, 0x30, 0x05, 0x56, 0xCC, 0x9F, 0x6B, + 0x58, 0xA3, 0x12, 0x98, 0x91, 0x99, 0xD8, 0x9B, 0x10, 0xFA, 0xF5, 0x58, + 0xD6, 0xD1, 0x7A, 0xBF, 0x16, 0x6E, 0x45, 0x74, 0xF1, 0x7A, 0xC5, 0x08, + 0x35, 0x5E, 0xB2, 0x89, 0x93, 0xFA, 0x30, 0xE0, 0x13, 0x94, 0xA1, 0x45, + 0xDF, 0x24, 0x59, 0x3B, 0xE7, 0xBA, 0x15, 0x5E, 0x32, 0x49, 0x37, 0x25, + 0xC2, 0x32, 0x07, 0x05, 0x5D, 0x35, 0x9C, 0x8E, 0x8A, 0x53, 0x56, 0xF7, + 0x53, 0xCD, 0xE5, 0x9D, 0xEF, 0x1E, 0x49, 0xC3, 0x24, 0x67, 0x96, 0x1C, + 0x94, 0xDF, 0x8F, 0x98, 0x1F, 0x8A, 0xF6, 0x8E, 0x8F, 0xED, 0xFD, 0xEE, + 0x4E, 0xBC, 0x00, 0xE8, 0x95, 0x53, 0xEF, 0x11, 0xD6, 0x65, 0xD0, 0x52, + 0xDC, 0x08, 0x7C, 0xB0, 0x32, 0x01, 0xBF, 0xB3, 0x1D, 0x0F, 0x62, 0x32, + 0xA3, 0x7D, 0x18, 0x9E, 0x9E, 0x19, 0x9B, 0xF6, 0x68, 0xFF, 0x63, 0xB3, + 0x97, 0x61, 0xD6, 0x31, 0xFF, 0x42, 0x7A, 0xE8, 0xCA, 0x87, 0xFA, 0xD7, + 0xF0, 0x6C, 0x3C, 0x13, 0x6B, 0x3E, 0x31, 0x10, 0xA9, 0x55, 0x46, 0x64, + 0xAA, 0xF6, 0xA0, 0x3A, 0x16, 0x28, 0xBE, 0x71, 0xDE, 0xE0, 0x44, 0x78, + 0x5B, 0xE6, 0xF6, 0xAB, 0x2F, 0x9B, 0xE7, 0x61, 0x0A, 0xA4, 0x04, 0x2D, + 0xFD, 0xFB, 0x2E, 0x5D, 0xD7, 0x36, 0xC8, 0x30, 0xA8, 0x93, 0xD8, 0x17, + 0x4F, 0x8F, 0x4D, 0x8C, 0x98, 0x57, 0x8C, 0x6F, 0x46, 0x57, 0xA0, 0x4A, + 0x1A, 0xDB, 0xE7, 0x3F, 0x96, 0xC7, 0x56, 0x41, 0x0D, 0x55, 0x5B, 0x3F, + 0x67, 0xD2, 0xAB, 0xEC, 0x4A, 0x66, 0x67, 0x9A, 0xF2, 0x2D, 0x63, 0xC4, + 0xB6, 0x50, 0x86, 0xB7, 0x70, 0xAA, 0x19, 0x05, 0x9A, 0xA5, 0x3E, 0x7B, + 0x89, 0x64, 0xF9, 0x97, 0x0C, 0xDB, 0x3D, 0x99, 0x92, 0xF0, 0x9A, 0x5C, + 0x63, 0x46, 0x6E, 0x57, 0x15, 0xF2, 0xC1, 0x24, 0x09, 0xB0, 0x94, 0xB6, + 0x22, 0xA0, 0x23, 0x32, 0x53, 0x9B, 0x24, 0x4B, 0xC7, 0x83, 0x6D, 0xA9, + 0xDB, 0x1E, 0x1A, 0xBD, 0x56, 0xB7, 0x13, 0xD8, 0x92, 0x2E, 0x0C, 0x17, + 0xA5, 0xEF, 0x4B, 0x53, 0x36, 0xC9, 0xC4, 0xE8, 0xFA, 0x4D, 0xD8, 0xA1, + 0x81, 0xE5, 0x9C, 0xE8, 0x65, 0x62, 0xEF, 0x65, 0xA6, 0xA9, 0x1C, 0xBA, + 0x33, 0xE2, 0x3F, 0xE7, 0xB7, 0xD6, 0x1A, 0x07, 0xBE, 0x5D, 0xF6, 0x5C, + 0x3E, 0xC4, 0x40, 0xF7, 0x3F, 0x8A, 0xE0, 0x77, 0xC0, 0x61, 0x73, 0x86, + 0x26, 0x2D, 0x71, 0x54, 0x51, 0xE5, 0x57, 0x5E, 0xB7, 0x46, 0x57, 0x2A, + 0xD3, 0x22, 0x90, 0x2E, 0x3E, 0x75, 0xF8, 0x87, 0xB1, 0xD2, 0x29, 0xC2, + 0xDD, 0x93, 0x94, 0xD2, 0x5E, 0xAC, 0xCC, 0x90, 0xD2, 0xD8, 0x2E, 0xD3, + 0x9B, 0xE5, 0x10, 0x5B, 0xE5, 0x7F, 0x8E, 0x34, 0x64, 0x97, 0xB9, 0xA0, + 0x7E, 0xD9, 0x0E, 0x7F, 0xB4, 0x6B, 0x0C, 0xE7, 0x31, 0xA4, 0x35, 0x46, + 0x82, 0x7B, 0xDB, 0x6F, 0x0C, 0x7D, 0xE7, 0x21, 0x37, 0x10, 0x54, 0x03, + 0x0E, 0x83, 0x77, 0xCB, 0xD9, 0xBB, 0x23, 0x87, 0xF3, 0xA0, 0x68, 0x06, + 0x67, 0xF0, 0x0A, 0x6B, 0xE5, 0x98, 0x05, 0x06, 0xB1, 0xDC, 0xB7, 0xE8, + 0xDC, 0x7B, 0x2D, 0x9A, 0xF7, 0x1E, 0x53, 0xBE, 0xBB, 0x9D, 0x90, 0xD0, + 0x80, 0xA3, 0x02, 0x53, 0xDD, 0x3B, 0x97, 0xF2, 0xC9, 0x1A, 0x5A, 0xAB, + 0x9F, 0x53, 0xFB, 0xED, 0x1C, 0x44, 0xEA, 0x13, 0xE6, 0xFF, 0x03, 0xB1, + 0xAB, 0x21, 0x94, 0x7A, 0x58, 0x5F, 0x2E, 0x0C, 0xFF, 0xC1, 0x6A, 0xA8, + 0xD6, 0xE3, 0x11, 0xC6, 0x9C, 0x88, 0xE5, 0xEB, 0x90, 0x50, 0x6F, 0x34, + 0x59, 0x63, 0xD6, 0xAC, 0xFB, 0x1C, 0x70, 0xEC, 0x7E, 0x50, 0xA6, 0xD3, + 0x7E, 0xF5, 0x98, 0x4B, 0x26, 0xEE, 0x0B, 0xB4, 0x04, 0xF6, 0x72, 0x77, + 0x4A, 0x72, 0x70, 0xE3, 0x8B, 0xE2, 0x55, 0xD2, 0x31, 0x39, 0xF8, 0xB6, + 0x8D, 0x97, 0x57, 0x54, 0xAE, 0x02, 0xC8, 0x00, 0x65, 0x49, 0xF7, 0xF2, + 0x88, 0xD1, 0x07, 0x46, 0x58, 0x7A, 0x52, 0x66, 0x32, 0xE4, 0xF4, 0x4B, + 0xD8, 0xFA, 0xFB, 0x1D, 0xF5, 0xAF, 0x61, 0x60, 0x52, 0x4D, 0x87, 0xC3, + 0xBB, 0x71, 0x60, 0x42, 0x1D, 0xA3, 0x8C, 0x59, 0xF3, 0x48, 0xB7, 0x9D, + 0x7E, 0xE3, 0xC5, 0x91, 0x20, 0xDE, 0x82, 0xFD, 0xA3, 0xDE, 0xFF, 0x0B, + 0x12, 0x6C, 0x9A, 0xD4, 0x37, 0x97, 0xA1, 0x10, 0x2C, 0x1A, 0x84, 0x1A, + 0x65, 0xE0, 0xBB, 0xED, 0x31, 0xD9, 0x9E, 0x63, 0x48, 0x3F, 0x73, 0xCD, + 0x9D, 0x9C, 0x1A, 0x89, 0x01, 0x89, 0x95, 0xA0, 0x01, 0xFF, 0x15, 0x2E, + 0xFD, 0x5B, 0xB7, 0x56, 0x54, 0x9B, 0x1A, 0xD9, 0xD8, 0x6B, 0x4D, 0x2B, + 0xEE, 0x65, 0x82, 0xF4, 0x18, 0xC0, 0x8F, 0x92, 0x0F, 0xA9, 0x85, 0x36, + 0xE0, 0xFF, 0x5C, 0x67, 0xBC, 0x1C, 0x4C, 0x04, 0x00, 0x1A, 0xFF, 0x33, + 0xF3, 0x3C, 0xB9, 0x01, 0x85, 0xF5, 0x9C, 0x42, 0x48, 0x98, 0xD1, 0x1C, + 0x12, 0x12, 0x36, 0x69, 0x9F, 0x00, 0x9D, 0x91, 0x55, 0xF2, 0x3B, 0x3C, + 0x65, 0x1F, 0x08, 0x56, 0x48, 0x57, 0x6B, 0xE3, 0x88, 0xED, 0x2A, 0x13, + 0x48, 0xC4, 0x2C, 0xD5, 0x46, 0x54, 0x8A, 0xBC, 0x1C, 0x4B, 0xCF, 0x27, + 0x88, 0xC9, 0x74, 0xCF, 0xD5, 0x82, 0x76, 0x57, 0x76, 0x83, 0x2C, 0xA6, + 0x4E, 0xD6, 0xEB, 0xD0, 0xEB, 0x8C, 0x0D, 0x04, 0xD6, 0xAD, 0x88, 0xE3, + 0x7C, 0x3C, 0x9C, 0xB1, 0xCA, 0x4E, 0xEF, 0x8A, 0x57, 0x3B, 0x6C, 0x68, + 0x2C, 0xEE, 0xA9, 0xEA, 0x71, 0xBB, 0x84, 0x2A, 0xCF, 0x68, 0xBE, 0x7F, + 0x16, 0x77, 0x4A, 0x6D, 0x2F, 0x9B, 0x23, 0xA7, 0x65, 0x1D, 0x3A, 0x43, + 0xE1, 0xEA, 0xF8, 0x0B, 0x4E, 0xA7, 0x6A, 0x9C, 0x68, 0x65, 0x80, 0x34, + 0xBF, 0x92, 0x35, 0x52, 0x47, 0xA3, 0xD1, 0x19, 0x54, 0xD4, 0x61, 0xB2, + 0x59, 0xCB, 0x98, 0x01, 0x2A, 0x03, 0xA3, 0x26, 0x13, 0xF4, 0x8D, 0x2E, + 0xA5, 0xF5, 0x89, 0xA1, 0x27, 0x5F, 0x08, 0x9E, 0xDF, 0x24, 0xB6, 0x1F, + 0x88, 0x0F, 0xA9, 0xA7, 0x3F, 0x8B, 0x14, 0xD6, 0xAE, 0x50, 0x43, 0x73, + 0x7F, 0xE5, 0x47, 0xFA, 0xF6, 0xA8, 0xC6, 0x85, 0x03, 0x20, 0x5C, 0x91, + 0x13, 0xB4, 0xDF, 0xD0, 0xDE, 0xD5, 0xA3, 0x7A, 0x6F, 0x85, 0xE4, 0x92, + 0x9B, 0xED, 0x3D, 0xE9, 0x03, 0x08, 0x45, 0x21, 0x12, 0x0E, 0x5A, 0xEB, + 0x12, 0xDF, 0x07, 0x71, 0xD4, 0x96, 0x06, 0x0A, 0xCA, 0xA5, 0x2D, 0x7C, + 0x6D, 0xC8, 0x23, 0xAD, 0xB9, 0x7C, 0xCB, 0x0A, 0xEA, 0x29, 0x77, 0x8C, + 0x5E, 0x9D, 0xE2, 0x64, 0xFE, 0x41, 0x89, 0x3A, 0xEA, 0x26, 0x6F, 0x2C, + 0x1C, 0x73, 0x72, 0x9A, 0xA7, 0x46, 0x69, 0xC6, 0x4D, 0x0B, 0x7F, 0x30, + 0x33, 0x1C, 0x73, 0x8D, 0x46, 0xC0, 0xA2, 0xD6, 0x4C, 0x8E, 0x99, 0xB2, + 0x0D, 0xC8, 0xD6, 0x41, 0x05, 0xAE, 0x29, 0xB2, 0xEE, 0x1C, 0x58, 0x2E, + 0xBB, 0xE3, 0xC1, 0x79, 0x40, 0x3F, 0xA7, 0x15, 0xC9, 0xBB, 0xA7, 0xE4, + 0xAF, 0x7E, 0xB3, 0x43, 0x5F, 0xF8, 0xD0, 0x78, 0x01, 0x68, 0x46, 0xFA, + 0x82, 0x03, 0x77, 0x72, 0x21, 0x9A, 0x51, 0x1D, 0x5D, 0xB5, 0xC5, 0x29, + 0x5D, 0x75, 0xC6, 0x3B, 0x6B, 0x68, 0x7B, 0x6F, 0xF3, 0xD2, 0x9D, 0xE4, + 0x8E, 0x69, 0xA2, 0x63, 0x8B, 0xEE, 0xFF, 0xB5, 0x1A, 0xBF, 0xFE, 0xFD, + 0x59, 0x18, 0x4D, 0xFC, 0x86, 0xEB, 0x9A, 0xBF, 0x52, 0xC7, 0x4B, 0x77, + 0x15, 0x2A, 0xF7, 0x20, 0x37, 0xFE, 0x70, 0x43, 0xE7, 0x26, 0x91, 0xC9, + 0xF8, 0x17, 0xA3, 0x96, 0xAD, 0x52, 0xFC, 0x42, 0xCB, 0x0D, 0x2D, 0x16, + 0xC7, 0x23, 0xE2, 0x1A, 0x54, 0x8D, 0xF1, 0xAD, 0x1F, 0xAB, 0x7A, 0x10, + 0x72, 0x2D, 0x3A, 0xD6, 0xF4, 0x93, 0x50, 0x5F, 0xF0, 0x90, 0xD0, 0x5D, + 0xE6, 0xC7, 0x8C, 0x22, 0xA8, 0xAE, 0x9A, 0x87, 0x35, 0x4D, 0x1D, 0x66, + 0x2C, 0x2C, 0x4C, 0x6F, 0x8F, 0x6B, 0x10, 0xE9, 0x66, 0xB2, 0xA6, 0xE9, + 0x92, 0xCF, 0xC7, 0x6A, 0x87, 0xA3, 0x5F, 0x13, 0x1A, 0x36, 0x69, 0x6A, + 0x94, 0xA4, 0xCA, 0xB8, 0xB2, 0xD1, 0xFC, 0x97, 0x62, 0x14, 0x50, 0x2B, + 0xD6, 0xEA, 0x9B, 0xDC, 0xE2, 0xD6, 0xC9, 0x17, 0x7B, 0xD7, 0xAF, 0x0E, + 0x62, 0x66, 0x5E, 0x67, 0x58, 0xE4, 0x09, 0x68, 0x63, 0x26, 0xF0, 0x23, + 0x3A, 0x18, 0xAE, 0x4E, 0xAE, 0x03, 0x6D, 0xA0, 0xBA, 0xB4, 0xE5, 0x20, + 0x0B, 0x8B, 0xB0, 0x0E, 0xC1, 0x09, 0x5F, 0xAA, 0xD7, 0x2B, 0xD2, 0x3E, + 0xCD, 0xE6, 0xBE, 0xFE, 0x11, 0x11, 0x4B, 0x55, 0x01, 0xEF, 0x0C, 0xFF, + 0xF4, 0x4A, 0xBC, 0x87, 0x0F, 0x76, 0x73, 0x5E, 0xCD, 0x4B, 0x3D, 0xA9, + 0xAF, 0x3E, 0x96, 0x8D, 0x49, 0xDC, 0x16, 0x18, 0x76, 0x8C, 0x93, 0xB2, + 0x6F, 0x72, 0x8F, 0xE0, 0xBD, 0xF5, 0xFA, 0x01, 0xEF, 0x2F, 0x47, 0xD9, + 0x6C, 0xAE, 0xE2, 0x37, 0xA2, 0x45, 0x1F, 0xFB, 0xA2, 0xB4, 0xAF, 0x74, + 0xFC, 0xE3, 0x6A, 0xC8, 0x4C, 0x9E, 0xAA, 0xFE, 0x86, 0x23, 0xE7, 0xFD, + 0x51, 0x32, 0x25, 0xAE, 0x57, 0xAB, 0xE2, 0x44, 0xEE, 0x6A, 0x1B, 0x61, + 0x0F, 0x0E, 0x8C, 0xA0, 0x87, 0x1B, 0x5F, 0x66, 0x2E, 0x97, 0x11, 0x29, + 0xBD, 0x7D, 0xD9, 0x40, 0x92, 0x7B, 0xF8, 0x1D, 0xCB, 0x97, 0xE8, 0x7B, + 0xE8, 0x5C, 0x07, 0x61, 0x19, 0xD6, 0xEE, 0x99, 0xD1, 0xBE, 0x36, 0x1F, + 0x42, 0xF7, 0x33, 0x94, 0x01, 0xA4, 0xE0, 0x0C, 0x99, 0x1F, 0x21, 0x31, + 0x5A, 0xF9, 0xA1, 0x98, 0xFD, 0x85, 0x44, 0xBB, 0x82, 0xB7, 0x9D, 0xE9, + 0x4F, 0x4A, 0xD9, 0xBC, 0x8D, 0xDD, 0x2E, 0xF6, 0x75, 0x38, 0xC0, 0x12, + 0x36, 0xA8, 0x1F, 0x57, 0x37, 0x9F, 0x64, 0xB3, 0xF3, 0xFA, 0x5B, 0xA9, + 0x81, 0x8B, 0x5E, 0x25, 0x34, 0x38, 0x28, 0x74, 0x4E, 0x58, 0xA1, 0x6C, + 0xC2, 0x57, 0x58, 0x40, 0x22, 0x3E, 0xE8, 0x48, 0xBA, 0x6F, 0x4F, 0xC9, + 0xC5, 0x06, 0x4D, 0x12, 0xDC, 0x48, 0x68, 0xDB, 0xC2, 0x6A, 0x20, 0xA2, + 0x99, 0x4E, 0x08, 0x05, 0xB2, 0x8E, 0xB1, 0x61, 0x2E, 0x25, 0x67, 0x27, + 0x69, 0xB9, 0x04, 0xDB, 0x3A, 0x73, 0xEC, 0xA0, 0xB7, 0x73, 0x88, 0x7E, + 0x25, 0x4B, 0x33, 0x3B, 0xAC, 0x7F, 0x11, 0x12, 0x3A, 0x49, 0xB5, 0x3A, + 0x36, 0x39, 0xD3, 0xCA, 0x02, 0xA0, 0xE4, 0xD8, 0x12, 0x5C, 0x98, 0x29, + 0x57, 0x69, 0x39, 0x8E, 0x35, 0x12, 0x07, 0x83, 0xFE, 0x77, 0xD8, 0x30, + 0xB4, 0x34, 0xD2, 0xE6, 0xB1, 0x9A, 0xFF, 0xAC, 0xFC, 0x0D, 0x3B, 0x8A, + 0x18, 0x1F, 0xF4, 0xE8, 0xBF, 0xE8, 0xE4, 0x26, 0xE5, 0x07, 0xB0, 0xB2, + 0x2B, 0xCB, 0x14, 0xFA, 0x53, 0x39, 0x64, 0x43, 0xCB, 0x3D, 0xFC, 0x61, + 0x90, 0x3A, 0xF6, 0xE8, 0x7B, 0x13, 0xCD, 0x6E, 0xA9, 0xA5, 0x66, 0xD0, + 0x9E, 0xE2, 0x50, 0xC6, 0xCF, 0xFC, 0x03, 0xB1, 0xD5, 0x7D, 0x0A, 0x62, + 0x7F, 0xE2, 0x3D, 0x9F, 0x0F, 0x9F, 0x29, 0x99, 0x65, 0x13, 0x69, 0xF2, + 0x85, 0x58, 0x07, 0x1D, 0x00, 0x66, 0x9D, 0x4B, 0xA8, 0xC9, 0x07, 0x1A, + 0x8F, 0x3E, 0xD7, 0x81, 0xA6, 0xDB, 0xE9, 0x32, 0xB3, 0xD4, 0x29, 0x6D, + 0xB8, 0xBA, 0x41, 0x0F, 0x51, 0xCB, 0x50, 0x74, 0x48, 0x07, 0x97, 0x27, + 0xC9, 0x23, 0x3C, 0xBD, 0x5B, 0x0F, 0x46, 0x04, 0x38, 0xB5, 0xC0, 0xB6, + 0x20, 0x03, 0xFA, 0x56, 0x52, 0x9E, 0x27, 0xAC, 0xF1, 0xE7, 0x32, 0x25, + 0x72, 0xFC, 0xAB, 0xE5, 0x1F, 0xF0, 0x55, 0x7D, 0xED, 0xB8, 0x28, 0x96, + 0x47, 0xED, 0x86, 0x45, 0xC9, 0xBA, 0xD1, 0xF6, 0xFA, 0xFC, 0xC6, 0xF6, + 0x67, 0x45, 0xC4, 0xA9, 0x25, 0xDE, 0xC7, 0x3F, 0x8A, 0xD8, 0x31, 0x3C, + 0xB6, 0xE4, 0x0D, 0x7B, 0xBE, 0x89, 0x5A, 0x69, 0x80, 0xEB, 0x62, 0xDE, + 0xAF, 0x02, 0x6E, 0xD1, 0x4B, 0x2C, 0x7B, 0xCD, 0x4D, 0xF1, 0xDF, 0x58, + 0x82, 0xD0, 0xE6, 0x6F, 0xB7, 0x45, 0x8E, 0xDF, 0xE6, 0x30, 0x84, 0xC4, + 0x5D, 0x26, 0xC0, 0x4C, 0x39, 0xC5, 0x2C, 0x99, 0x34, 0x13, 0xF5, 0x32, + 0xA3, 0xEE, 0xCF, 0x54, 0x5C, 0x58, 0x2B, 0x5D, 0x54, 0xEF, 0xFA, 0x11, + 0xC4, 0xBB, 0x1F, 0x34, 0x7C, 0xE6, 0x2F, 0xE4, 0xA9, 0xD3, 0x95, 0x8B, + 0x58, 0xC7, 0xB5, 0xE2, 0x27, 0xCE, 0xF0, 0xF8, 0xD1, 0x9E, 0x0F, 0x88, + 0x93, 0x3D, 0x90, 0x0D, 0x15, 0x9A, 0xC3, 0xEA, 0x91, 0xF5, 0xF6, 0xE4, + 0x3E, 0x89, 0x01, 0x8A, 0x4E, 0x6F, 0xE3, 0x21, 0xB1, 0x93, 0x04, 0x36, + 0x30, 0x22, 0x7B, 0x92, 0x7F, 0xCF, 0x06, 0x6B, 0xA5, 0x60, 0x8E, 0x15, + 0x77, 0x8F, 0x7E, 0x9E, 0xB1, 0xE6, 0xFA, 0x30, 0x4D, 0xD1, 0xC7, 0x20, + 0xEA, 0xAF, 0xD5, 0xB2, 0x58, 0xD3, 0xAA, 0x74, 0xBC, 0xDD, 0x10, 0x6F, + 0x54, 0xFF, 0x15, 0xD4, 0xB0, 0x20, 0xD5, 0xDC, 0xF3, 0x89, 0x28, 0x04, + 0x4C, 0x69, 0x7E, 0xE9, 0xBF, 0xE5, 0x83, 0x33, 0x81, 0x69, 0xE4, 0xB8, + 0x46, 0xD8, 0x26, 0x24, 0x51, 0xEE, 0x5B, 0x1D, 0x8E, 0xA0, 0x2B, 0xA2, + 0xD6, 0x6B, 0x4C, 0x7F, 0xA3, 0xDA, 0xDF, 0x64, 0x4B, 0x79, 0xF8, 0xEA, + 0x0D, 0x53, 0x20, 0xB6, 0x67, 0xE4, 0x9F, 0xB5, 0xB6, 0x63, 0x1D, 0x6E, + 0xDA, 0x91, 0x1C, 0x9C, 0xE1, 0x96, 0x0D, 0x67, 0xD4, 0xFE, 0xE9, 0x80, + 0xEA, 0x43, 0xF3, 0x6C, 0x7F, 0x9D, 0x1E, 0xCB, 0x9A, 0xB0, 0x29, 0x60, + 0x68, 0x8C, 0xB9, 0x1B, 0x23, 0x8E, 0x87, 0xBD, 0x27, 0x1A, 0x93, 0xCB, + 0xD5, 0x3B, 0x8F, 0x9B, 0xF7, 0x5F, 0xF8, 0x5D, 0xA0, 0x90, 0xC8, 0xEC, + 0xDB, 0x2E, 0xCC, 0xBB, 0xDA, 0x4A, 0x8E, 0x7E, 0xD9, 0x80, 0xC9, 0x7C, + 0xEA, 0x17, 0x31, 0x51, 0x0E, 0xB0, 0x3E, 0xC2, 0x45, 0x40, 0x70, 0x7B, + 0xA4, 0x1B, 0x26, 0x9C, 0xC4, 0x35, 0x38, 0x24, 0x21, 0x6A, 0x33, 0x57, + 0x10, 0x7B, 0xE1, 0x00, 0x51, 0x24, 0x22, 0x46, 0xC1, 0x95, 0x0F, 0x9C, + 0xC1, 0x38, 0x48, 0xD5, 0x19, 0x09, 0x75, 0xBA, 0x85, 0x8A, 0x7B, 0x55, + 0xD5, 0x8C, 0xD3, 0x51, 0x4D, 0x9B, 0x49, 0xCD, 0xA4, 0xCB, 0x14, 0x11, + 0xBF, 0x78, 0x52, 0xB1, 0x58, 0x28, 0x50, 0x9B, 0x81, 0x9C, 0xB4, 0x6D, + 0xD1, 0xE4, 0x67, 0xED, 0x13, 0x47, 0xE9, 0xC4, 0xDE, 0xB2, 0xC2, 0x38, + 0x06, 0x58, 0x40, 0x20, 0x85, 0x80, 0x81, 0xF2, 0x7A, 0xCF, 0xFC, 0x22, + 0x31, 0x27, 0x31, 0x0A, 0x3C, 0xF5, 0xAE, 0xBE, 0x8D, 0xDD, 0x94, 0x80, + 0x25, 0x73, 0xC5, 0xFD, 0xEB, 0xFA, 0x0C, 0xA8, 0x25, 0x2D, 0xD5, 0x48, + 0xF3, 0x48, 0x59, 0x84, 0x4C, 0x71, 0x8D, 0x28, 0xA1, 0x7A, 0x19, 0xF7, + 0x45, 0xAA, 0x83, 0x15, 0xEA, 0x40, 0x8F, 0x0F, 0x90, 0xEF, 0x1F, 0x4E, + 0x81, 0xAB, 0xEB, 0x03, 0x4F, 0xD4, 0x59, 0xC5, 0xFB, 0x1E, 0xFA, 0x3E, + 0x44, 0xB5, 0x48, 0xE2, 0x71, 0x88, 0x18, 0xF3, 0x73, 0x5F, 0xF3, 0x9B, + 0x7B, 0xBF, 0x18, 0x17, 0xEB, 0x48, 0x5A, 0x5C, 0xCE, 0x54, 0xDA, 0x84, + 0xE8, 0xDC, 0x9C, 0x03, 0xC1, 0xD6, 0x70, 0xBF, 0x5F, 0x3F, 0xC2, 0x3E, + 0x05, 0x73, 0x82, 0x2C, 0xB0, 0x19, 0xCF, 0xDC, 0x7D, 0xD8, 0xF4, 0x27, + 0x1B, 0xBE, 0x28, 0x9A, 0x0C, 0x22, 0x90, 0x94, 0x60, 0x5A, 0x30, 0x1A, + 0xBA, 0xD3, 0x2D, 0xEE, 0xFF, 0x1A, 0x7A, 0x4C, 0xC9, 0x7C, 0xB4, 0x4C, + 0xB1, 0x88, 0xB9, 0xF9, 0xFC, 0xE7, 0x62, 0x0F, 0x54, 0xBC, 0x7A, 0x4E, + 0xA6, 0xC6, 0x73, 0xE2, 0x4D, 0x49, 0x59, 0x8B, 0x2A, 0x69, 0x0A, 0x62, + 0x1D, 0xA4, 0x6B, 0x9C, 0x90, 0x80, 0x82, 0x02, 0x29, 0xBD, 0xF4, 0x04, + 0x3A, 0x52, 0x27, 0x85, 0x16, 0x81, 0xB5, 0xB9, 0x4E, 0xB5, 0xA4, 0xD7, + 0x3B, 0x22, 0x02, 0x71, 0x87, 0xF5, 0x42, 0x8D, 0x95, 0x13, 0xF2, 0xB5, + 0xD2, 0xDE, 0xC6, 0xC4, 0xD8, 0xB9, 0x09, 0x3D, 0x89, 0x7E, 0xFD, 0x71, + 0x96, 0x0B, 0x2C, 0xBF, 0xD2, 0xDC, 0x12, 0xE3, 0xE8, 0xD3, 0x4B, 0xE2, + 0xA8, 0x99, 0x7A, 0x0E, 0xAA, 0xD8, 0x89, 0x34, 0x6B, 0x8B, 0xF9, 0x56, + 0x12, 0x23, 0x5C, 0x80, 0xCC, 0x85, 0x13, 0x0D, 0x9F, 0x4D, 0xBA, 0xBB, + 0x66, 0xE4, 0x44, 0x6D, 0x37, 0xF2, 0x26, 0x57, 0x4C, 0x21, 0xE1, 0x99, + 0x96, 0xEE, 0x61, 0x80, 0xC3, 0x22, 0x51, 0x2A, 0xD8, 0x70, 0x4B, 0x10, + 0x0B, 0x03, 0xF9, 0x13, 0x72, 0x5E, 0xD8, 0x85, 0x81, 0x33, 0x66, 0x97, + 0x7D, 0xAC, 0x18, 0x08, 0xE8, 0x24, 0xC1, 0x6C, 0x5F, 0xD6, 0xA3, 0x99, + 0xC6, 0x50, 0x54, 0x61, 0x90, 0xF0, 0x3B, 0xBF, 0xF3, 0x12, 0x74, 0x8C, + 0x24, 0x38, 0xEB, 0xC5, 0x7A, 0xF1, 0x14, 0x33, 0x59, 0x8E, 0x57, 0x0F, + 0x66, 0xF7, 0x9C, 0xC2, 0xE5, 0x2A, 0x39, 0x88, 0xE6, 0x5F, 0x5C, 0x80, + 0xD9, 0xDB, 0x1D, 0x80, 0xF5, 0xCF, 0xA9, 0xFC, 0x2F, 0x81, 0x37, 0x11, + 0x90, 0x8D, 0x91, 0xD7, 0x7A, 0x76, 0x18, 0x31, 0x80, 0x97, 0xA1, 0x24, + 0xB2, 0x86, 0x7F, 0x01, 0x28, 0xB2, 0xA0, 0x78, 0x4F, 0x30, 0xCA, 0x37, + 0xC4, 0xFC, 0xCA, 0xC2, 0xC4, 0xE1, 0xD0, 0x62, 0x9E, 0x11, 0x00, 0x12, + 0x29, 0xD2, 0x1A, 0x5B, 0x7D, 0x50, 0x69, 0xBF, 0x32, 0xA3, 0xFF, 0x13, + 0x26, 0x30, 0x6D, 0xB7, 0xB2, 0x26, 0xAC, 0xE4, 0x74, 0x94, 0x92, 0xA0, + 0xFB, 0x8F, 0xF4, 0xB0, 0x9D, 0xAA, 0xA4, 0x00, 0x7F, 0x3B, 0xCC, 0xC9, + 0xD4, 0x67, 0xCA, 0xAD, 0xB7, 0xB8, 0xB9, 0xD4, 0x01, 0x27, 0x6C, 0x8E, + 0x8F, 0x16, 0x41, 0x13, 0xE5, 0xB5, 0x81, 0x3A, 0x29, 0x3C, 0x21, 0x16, + 0x3E, 0x49, 0x8B, 0x15, 0x59, 0x21, 0x8B, 0x14, 0xAB, 0x53, 0x58, 0x8A, + 0xC6, 0x02, 0x15, 0x41, 0x38, 0x9A, 0x25, 0x45, 0xBC, 0xF7, 0x84, 0x0B, + 0xD7, 0x2F, 0x98, 0x4D, 0xBA, 0x56, 0x9F, 0x3C, 0x0D, 0x86, 0x1F, 0xDC, + 0x40, 0x2D, 0x31, 0xA9, 0xB0, 0xBE, 0x84, 0x51, 0x58, 0xEC, 0x2F, 0xFB, + 0x4E, 0x36, 0x09, 0xAE, 0x5A, 0x7E, 0xAA, 0x1D, 0xFC, 0xF5, 0x91, 0x9A, + 0x28, 0xA2, 0x58, 0x3B, 0xB6, 0x9D, 0xB5, 0x12, 0xB7, 0x70, 0x7D, 0x64, + 0x52, 0xB3, 0xC4, 0x07, 0xFA, 0x3A, 0xAA, 0x85, 0xA4, 0x1A, 0x4E, 0x47, + 0xB0, 0xD0, 0x44, 0x75, 0x77, 0xA2, 0xFB, 0xB3, 0xE3, 0x27, 0x55, 0xD0, + 0x1F, 0x3C, 0x9E, 0x2A, 0xB9, 0x41, 0x1D, 0x50, 0x98, 0x7E, 0xE9, 0xC9, + 0xA7, 0x3C, 0x0B, 0xB1, 0x96, 0x74, 0xFC, 0xDB, 0xB6, 0x35, 0xAC, 0xD3, + 0x89, 0xCA, 0x3B, 0x79, 0x32, 0x81, 0x70, 0x5C, 0xEE, 0x35, 0x79, 0x55, + 0xDC, 0x77, 0x85, 0x01, 0x68, 0xE7, 0xA4, 0xB9, 0x9E, 0xDA, 0x55, 0xA1, + 0xDF, 0x9A, 0xF5, 0xEA, 0xF0, 0xE1, 0x4F, 0x59, 0xB4, 0x13, 0xD7, 0xAC, + 0x12, 0xF5, 0x06, 0xA2, 0x82, 0x01, 0xA1, 0xB5, 0x04, 0x9B, 0x00, 0x62, + 0x11, 0xEF, 0xF9, 0x82, 0x8E, 0x00, 0x4D, 0x0C, 0x16, 0x4C, 0x0C, 0x80, + 0xC7, 0x33, 0xCB, 0x0A, 0x43, 0xC3, 0x90, 0x47, 0x79, 0xCD, 0xEA, 0x96, + 0xDC, 0xDE, 0x7C, 0xB9, 0x1D, 0x0C, 0xB1, 0xBC, 0x0F, 0x8B, 0x76, 0xE5, + 0xBD, 0xD0, 0x59, 0x76, 0x08, 0x79, 0xE4, 0xF3, 0xE1, 0xB3, 0x12, 0xF1, + 0x94, 0x14, 0x79, 0xBF, 0xAC, 0x22, 0x4E, 0x57, 0x7B, 0xCB, 0x5B, 0xBF, + 0xE4, 0x9D, 0x16, 0x18, 0xA2, 0xB3, 0x2D, 0x04, 0x3A, 0x11, 0xC9, 0x18, + 0x6D, 0xCC, 0x99, 0xB5, 0xB5, 0x36, 0xF5, 0x49, 0x4B, 0xEC, 0x60, 0x3E, + 0x22, 0x9A, 0x73, 0x60, 0x91, 0x2F, 0x4F, 0x70, 0xB7, 0xA4, 0x48, 0x61, + 0xCB, 0x0D, 0x17, 0x84, 0x61, 0xF1, 0xAD, 0x7F, 0xEE, 0xEC, 0x72, 0x18, + 0x60, 0x6D, 0xAC, 0xEE, 0xDB, 0xC1, 0xC2, 0x81, 0xF1, 0x03, 0x74, 0xA2, + 0x5A, 0xA9, 0xC8, 0x0E, 0x52, 0x85, 0xDD, 0x1D, 0x12, 0xBE, 0x1C, 0xC4, + 0x58, 0x0F, 0x62, 0xEE, 0x17, 0xD4, 0xF5, 0x7F, 0xDB, 0xF4, 0x1B, 0xDF, + 0x2D, 0x18, 0x6D, 0x0B, 0x47, 0xDB, 0xFF, 0xAF, 0x70, 0xE6, 0xA1, 0x52, + 0x60, 0x9E, 0xFC, 0x83, 0xCC, 0x76, 0xB3, 0xAF, 0xED, 0x23, 0x21, 0xBB, + 0x7D, 0xBE, 0x7E, 0x59, 0x7F, 0x3A, 0x22, 0x10, 0x8F, 0x43, 0x4E, 0x65, + 0xC6, 0xBC, 0xEB, 0xE0, 0x63, 0x82, 0x78, 0xB8, 0xD5, 0xD0, 0xE7, 0xDA, + 0x44, 0xF2, 0x1A, 0xBD, 0x75, 0x46, 0xF7, 0x2A, 0xFE, 0x5F, 0x2A, 0x95, + 0xB3, 0x4F, 0x51, 0xC2, 0xD1, 0x24, 0xEA, 0x88, 0x06, 0x88, 0x8E, 0xCB, + 0x33, 0xA8, 0x71, 0xC3, 0x89, 0x4E, 0xD4, 0x25, 0xBC, 0x87, 0x1C, 0x05, + 0x87, 0x74, 0xF5, 0x99, 0x90, 0x58, 0xA1, 0x2E, 0x14, 0x13, 0x25, 0xD6, + 0xCB, 0x5C, 0xE5, 0xA8, 0x46, 0xA6, 0x71, 0x68, 0x72, 0x66, 0x48, 0xD8, + 0x92, 0x8F, 0x75, 0xAC, 0xB7, 0x14, 0x32, 0x42, 0xB9, 0x9D, 0x57, 0xF9, + 0xD2, 0x8E, 0x85, 0x27, 0x92, 0xA8, 0xCC, 0x1A, 0x26, 0x33, 0x76, 0x06, + 0x1A, 0xB6, 0x27, 0x56, 0x5D, 0x8E, 0xDC, 0x1F, 0xFC, 0xBA, 0x3F, 0x6A, + 0x67, 0xFF, 0x9B, 0x14, 0xFF, 0x90, 0xE7, 0x8E, 0xED, 0x2D, 0x8B, 0x5E, + 0x22, 0x84, 0xA2, 0x06, 0x8F, 0xFD, 0x25, 0x02, 0xFD, 0x3D, 0x92, 0x41, + 0xE5, 0x49, 0x2D, 0x43, 0x6A, 0x9B, 0x1E, 0xA5, 0x46, 0xC9, 0xA9, 0xDC, + 0x2D, 0x8E, 0x75, 0xE2, 0x1B, 0x8D, 0x8F, 0x23, 0x59, 0x2E, 0x21, 0x5D, + 0x3C, 0x0A, 0x41, 0xC5, 0x27, 0xD2, 0x76, 0x9A, 0xCA, 0x7D, 0xAC, 0x65, + 0x31, 0xC8, 0xAD, 0xB6, 0xBD, 0x19, 0x88, 0x08, 0x7A, 0x91, 0x74, 0xAD, + 0x23, 0x14, 0x60, 0xC3, 0x93, 0xCE, 0xF2, 0x10, 0xCF, 0xE3, 0xF1, 0xF7, + 0x3F, 0xD2, 0x1F, 0xD1, 0x91, 0x9B, 0x9C, 0xE9, 0xB9, 0xD7, 0xE5, 0xFA, + 0x8F, 0xAD, 0xB1, 0x95, 0x03, 0x28, 0xB4, 0x20, 0x46, 0xA2, 0xBD, 0x23, + 0x1A, 0x32, 0xB0, 0x23, 0x65, 0x54, 0x93, 0x87, 0x4F, 0xF1, 0x3A, 0xA7, + 0x8A, 0xD5, 0x0F, 0x59, 0xC7, 0xD6, 0x7E, 0xBE, 0x6B, 0xFB, 0x66, 0x8A, + 0x1E, 0x48, 0xD3, 0xCB, 0xC3, 0x78, 0xBC, 0x2A, 0x07, 0x57, 0x66, 0xD4, + 0x83, 0x95, 0xE1, 0x67, 0xDA, 0xE8, 0x0D, 0x68, 0x86, 0xE8, 0xF7, 0xBF, + 0x05, 0x4F, 0xB0, 0x41, 0x0C, 0xE6, 0x72, 0x9C, 0xB4, 0xBF, 0x93, 0x59, + 0xE5, 0x97, 0xAC, 0x7B, 0xB0, 0x93, 0x0E, 0xEC, 0xE6, 0xC2, 0xC1, 0x0E, + 0x06, 0x81, 0x69, 0xF6, 0x27, 0xE4, 0xCA, 0x2D, 0xE0, 0x76, 0x9E, 0x0A, + 0x03, 0xE3, 0x60, 0xD1, 0xAB, 0x4C, 0x63, 0xCC, 0x03, 0x7E, 0xBC, 0x4A, + 0x58, 0x74, 0x94, 0xEF, 0x96, 0xB7, 0x33, 0xE8, 0x80, 0x56, 0xBD, 0xEC, + 0x3F, 0xD6, 0x75, 0x6F, 0xF6, 0xFE, 0x85, 0x0B, 0x0A, 0x30, 0x30, 0xBE, + 0x0D, 0x7F, 0x5B, 0x15, 0xD2, 0x0B, 0x7D, 0xA3, 0x2B, 0xB7, 0xE7, 0xE9, + 0x17, 0x4C, 0x94, 0xE1, 0x70, 0xED, 0xF7, 0x40, 0x94, 0x3B, 0x3A, 0xCA, + 0xCE, 0xF5, 0xB2, 0xF3, 0x8A, 0x69, 0x61, 0x57, 0x5F, 0x64, 0xC5, 0xBC, + 0x0F, 0x78, 0x15, 0x9C, 0xF8, 0x30, 0x3A, 0xA4, 0xC2, 0xD8, 0x35, 0xA8, + 0x1B, 0xFA, 0x65, 0xAE, 0x78, 0x2A, 0x2B, 0x0E, 0x8C, 0xF7, 0x7E, 0x81, + 0x43, 0x0E, 0x15, 0x05, 0xC6, 0x76, 0x7B, 0x29, 0xA6, 0x26, 0xDE, 0xA0, + 0xF0, 0x38, 0x39, 0x8B, 0x33, 0x8D, 0x38, 0xD6, 0x84, 0x69, 0x55, 0xF6, + 0x5A, 0x6E, 0xBE, 0x7E, 0x18, 0x41, 0x4A, 0x4D, 0xF5, 0x7A, 0x86, 0x8B, + 0xCE, 0x48, 0xDD, 0xF5, 0x80, 0xEE, 0x57, 0x05, 0x99, 0x97, 0xA9, 0xCE, + 0x26, 0x68, 0x20, 0xA4, 0x9C, 0x84, 0x00, 0x88, 0x0A, 0x7F, 0x7B, 0x74, + 0x12, 0xE6, 0x60, 0xF7, 0xD9, 0xE7, 0xB4, 0x46, 0x59, 0x1A, 0x84, 0x1E, + 0x08, 0x20, 0x2E, 0x74, 0x51, 0xAE, 0x95, 0xD7, 0x77, 0x5A, 0x6A, 0x9B, + 0x0B, 0xFF, 0xB5, 0x5D, 0x65, 0xDC, 0x35, 0x6E, 0x00, 0xAF, 0x01, 0x73, + 0x41, 0x82, 0x92, 0x29, 0x9B, 0x67, 0x38, 0x86, 0xE4, 0x1A, 0x2A, 0xDA, + 0xBF, 0x23, 0xEC, 0x17, 0x97, 0x13, 0x1B, 0x32, 0x58, 0x31, 0x2F, 0x4E, + 0x6D, 0x8E, 0x39, 0x99, 0x7B, 0x9D, 0xEB, 0xBE, 0x47, 0xC5, 0x22, 0x81, + 0x64, 0xAE, 0x0B, 0x0D, 0xBC, 0x33, 0x6C, 0x0B, 0x30, 0xDE, 0xD0, 0xA4, + 0x8D, 0xB2, 0x9E, 0xFB, 0x02, 0x6C, 0xDC, 0xD3, 0x3E, 0xCF, 0xD6, 0x49, + 0x76, 0x22, 0xF2, 0x21, 0x76, 0x26, 0xDE, 0x32, 0x65, 0xAC, 0x1E, 0x68, + 0x2F, 0xC5, 0xF3, 0x78, 0x07, 0x15, 0x08, 0xAF, 0x74, 0xD0, 0x81, 0x13, + 0x45, 0xAB, 0x14, 0xD4, 0x59, 0x46, 0x24, 0x9F, 0x75, 0x12, 0x0E, 0xBB, + 0xDC, 0x6E, 0x4D, 0x44, 0xD3, 0x28, 0x2D, 0x64, 0xA8, 0xD6, 0x71, 0xE2, + 0xE0, 0x8B, 0xD2, 0xF4, 0xBD, 0xFC, 0x97, 0x30, 0x0C, 0xAC, 0x52, 0x3A, + 0x06, 0xE6, 0x3A, 0x24, 0x09, 0xF5, 0xEE, 0xDB, 0x6C, 0x0A, 0x34, 0xCC, + 0xF4, 0xEF, 0x97, 0x39, 0x4B, 0x0E, 0x51, 0xC4, 0x3F, 0x04, 0xC6, 0x79, + 0xFC, 0xFC, 0x2C, 0x66, 0x7C, 0x74, 0x9C, 0xF6, 0x42, 0x98, 0x57, 0xE2, + 0x78, 0x24, 0x72, 0x0A, 0xF2, 0x3B, 0x82, 0x22, 0xE6, 0x33, 0x80, 0xBC, + 0x9A, 0xF5, 0x0D, 0x59, 0x5D, 0xEC, 0x04, 0xD1, 0x63, 0x37, 0x61, 0xB6, + 0xBA, 0x30, 0x50, 0x1D, 0xC8, 0x3B, 0xF9, 0x41, 0xC1, 0x4A, 0x70, 0xEF, + 0x01, 0x8C, 0xFD, 0x8C, 0xCF, 0xE3, 0xE1, 0x00, 0x94, 0xA0, 0xB7, 0xE8, + 0xFA, 0xB9, 0x29, 0x36, 0xFD, 0x8B, 0x39, 0x86, 0x32, 0x48, 0xE6, 0xA1, + 0x3B, 0x2C, 0xB7, 0xDB, 0xF3, 0x81, 0xAA, 0x06, 0x45, 0x7F, 0x2F, 0x2B, + 0x82, 0xC7, 0xEB, 0x4A, 0x24, 0x35, 0x4F, 0x77, 0x9E, 0xCE, 0xF1, 0xDE, + 0x01, 0xCB, 0x43, 0x5B, 0x39, 0x3F, 0x48, 0xDF, 0xEB, 0x6E, 0x16, 0xFA, + 0x3B, 0x9D, 0x76, 0x7E, 0xEA, 0xB6, 0x1B, 0x49, 0x21, 0x35, 0x3C, 0xEC, + 0x9B, 0x22, 0x65, 0x23, 0x8C, 0x1C, 0xA5, 0xF2, 0xD9, 0xA1, 0x9C, 0xE0, + 0x5D, 0x9A, 0xFC, 0xE0, 0x6B, 0x78, 0x45, 0xEF, 0xBC, 0xCC, 0x8A, 0x7C, + 0xE0, 0x70, 0xDB, 0xD6, 0xB1, 0x9A, 0xB3, 0x9D, 0x45, 0x3B, 0x9D, 0xE0, + 0x23, 0x82, 0xF6, 0x9D, 0x6F, 0x0C, 0xF5, 0x7D, 0xB7, 0x41, 0x51, 0x4C, + 0x02, 0xB7, 0x8D, 0xB5, 0x30, 0x9F, 0xF8, 0xD7, 0x50, 0x72, 0xF8, 0xAD, + 0x2A, 0x54, 0x0F, 0xF9, 0x2D, 0x08, 0x1C, 0x32, 0x3C, 0xEE, 0xB3, 0x06, + 0x73, 0x2B, 0x27, 0xEC, 0x81, 0xB6, 0x73, 0xC2, 0xAE, 0xF0, 0xE0, 0x16, + 0x58, 0x55, 0x56, 0xC1, 0x0E, 0x89, 0xC2, 0xA7, 0xCA, 0xFD, 0x9A, 0x02, + 0xC6, 0xB7, 0x68, 0xBD, 0x10, 0xFF, 0x82, 0x81, 0x58, 0x77, 0x9F, 0x55, + 0x62, 0xC9, 0x80, 0xE9, 0x68, 0xE4, 0xBE, 0x8B, 0xDD, 0xAC, 0x28, 0xF8, + 0xE5, 0xC6, 0xC4, 0x6C, 0x77, 0xA3, 0x4F, 0xB4, 0x3F, 0xDC, 0x64, 0x70, + 0xF8, 0x32, 0x87, 0x19, 0x97, 0x2F, 0xEE, 0x04, 0xE1, 0x92, 0x4E, 0x73, + 0x28, 0x6F, 0x1B, 0x62, 0xCD, 0xD6, 0xD9, 0x7C, 0x6C, 0x5D, 0x09, 0x1F, + 0x9C, 0x0A, 0x72, 0x6D, 0xE7, 0x78, 0xA4, 0xA8, 0xEE, 0xF0, 0xA1, 0x3B, + 0x03, 0x9E, 0xDF, 0x19, 0x46, 0xD7, 0x0B, 0x8F, 0x1B, 0xCC, 0x9C, 0xD6, + 0x3A, 0xB6, 0x98, 0x42, 0x4C, 0x7C, 0xD4, 0x59, 0xC4, 0xBD, 0x86, 0x9E, + 0x79, 0x01, 0x05, 0x7C, 0xA7, 0xC4, 0xD5, 0xC4, 0xA4, 0xD7, 0xB2, 0x8A, + 0x15, 0x3C, 0x08, 0x12, 0xFF, 0x0E, 0xF1, 0x20, 0x9A, 0x5C, 0x57, 0x2A, + 0xDE, 0xF2, 0x21, 0xA7, 0xFB, 0xF2, 0xA7, 0xE9, 0x37, 0xA8, 0x73, 0x45, + 0xE8, 0xD4, 0xAC, 0x2F, 0x06, 0xC8, 0x6E, 0x04, 0xDE, 0xF7, 0xE2, 0xF6, + 0xD1, 0xA3, 0xC0, 0x7B, 0xD9, 0x77, 0xEF, 0x53, 0x74, 0xEA, 0xBE, 0x23, + 0xD2, 0x7E, 0xF0, 0xF0, 0x56, 0xAC, 0x95, 0x80, 0xF3, 0x53, 0xEE, 0x47, + 0x1D, 0x76, 0x30, 0x21, 0xC8, 0xAD, 0x46, 0x73, 0x8B, 0x1F, 0x4A, 0xB1, + 0x48, 0x4F, 0xE7, 0x3B, 0x92, 0xC0, 0xA7, 0x68, 0xF3, 0x53, 0xC7, 0xD4, + 0x51, 0xA8, 0xF6, 0xC9, 0x85, 0xAD, 0xBF, 0xB9, 0x6A, 0x31, 0x0E, 0x0C, + 0x7E, 0x64, 0x6F, 0x50, 0x99, 0x31, 0xE4, 0x13, 0xA6, 0xBF, 0xEA, 0xFF, + 0x09, 0x1A, 0xA7, 0xD8, 0xD6, 0x42, 0xA7, 0x62, 0x4F, 0xAC, 0x87, 0x4B, + 0xBA, 0xB7, 0xBE, 0x50, 0x5A, 0x09, 0x43, 0xD7, 0x4F, 0x9B, 0x27, 0x05, + 0x78, 0xEB, 0xB2, 0x16, 0x6C, 0xCA, 0x18, 0x41, 0x58, 0xF2, 0x24, 0xF9, + 0xED, 0xBB, 0xF6, 0x96, 0x2F, 0xF3, 0xCB, 0x4A, 0xE9, 0xF8, 0x25, 0x4A, + 0x6E, 0x8E, 0x32, 0xB6, 0x51, 0x17, 0x29, 0x98, 0x9B, 0x41, 0xE7, 0x23, + 0x80, 0xEA, 0x17, 0x84, 0xAB, 0xF1, 0x94, 0x81, 0xFE, 0xB4, 0x30, 0xA8, + 0xF8, 0x59, 0x33, 0x28, 0xAE, 0xF5, 0x24, 0x20, 0x7E, 0x78, 0x54, 0x7C, + 0xD5, 0xE9, 0xBA, 0xC1, 0x12, 0xA2, 0x71, 0xD6, 0x1D, 0x5E, 0xE2, 0x5B, + 0xF3, 0x26, 0xAA, 0x0B, 0x96, 0x68, 0x46, 0x63, 0x1D, 0x71, 0x38, 0x8C, + 0xB4, 0x29, 0x18, 0x92, 0x22, 0x6A, 0x0A, 0x67, 0x70, 0xC2, 0x14, 0xEC, + 0x4F, 0x0F, 0x3B, 0x43, 0x27, 0x6F, 0xF5, 0x1B, 0xE0, 0x7B, 0xEB, 0x35, + 0x3A, 0x6F, 0x7C, 0xA5, 0x9C, 0xBC, 0x17, 0x2D, 0xF5, 0xC0, 0x7D, 0x67, + 0xE2, 0xF1, 0x0D, 0x00, 0x04, 0xD4, 0x68, 0x9F, 0xB8, 0x48, 0xFE, 0xB6, + 0xA8, 0x6F, 0xFD, 0xCB, 0x34, 0x94, 0xFA, 0x2D, 0xFA, 0x46, 0x3E, 0x11, + 0x2D, 0xF5, 0xBB, 0x2B, 0xD2, 0x92, 0x92, 0x0E, 0x37, 0xEB, 0x7E, 0x84, + 0xF9, 0xFD, 0x3B, 0x22, 0xD3, 0xCD, 0xFC, 0x46, 0xEF, 0x21, 0x35, 0x91, + 0x19, 0xCF, 0x1F, 0xE0, 0xFE, 0x5C, 0x1A, 0x49, 0x38, 0x95, 0xE0, 0x40, + 0x1D, 0x4A, 0xB8, 0xB7, 0xBB, 0xB8, 0x52, 0x08, 0x37, 0x72, 0xE4, 0xF6, + 0xE8, 0x42, 0x0A, 0xAB, 0x1E, 0xF0, 0x74, 0x7B, 0xFB, 0x9E, 0x94, 0x4C, + 0x87, 0xF5, 0xEE, 0x0D, 0x9E, 0x07, 0x10, 0x79, 0x0C, 0x02, 0xA7, 0xE6, + 0x4A, 0xBF, 0xAB, 0xAD, 0x71, 0x5F, 0x31, 0xE1, 0xD5, 0x39, 0x1E, 0x72, + 0x53, 0x93, 0xA4, 0x38, 0xB4, 0x04, 0x79, 0xA3, 0x72, 0xCD, 0xBC, 0x29, + 0x3E, 0x9F, 0x63, 0xF4, 0x87, 0xB5, 0xB8, 0x99, 0xFC, 0x4E, 0x9D, 0xD2, + 0xD9, 0x6F, 0xD5, 0x16, 0x1D, 0x01, 0xF8, 0x43, 0x22, 0x6B, 0xF9, 0xF8, + 0xF8, 0x7E, 0x03, 0xD1, 0xF0, 0xC9, 0x8B, 0x97, 0x78, 0x12, 0xF1, 0xE8, + 0x23, 0x88, 0x53, 0xD3, 0x73, 0x8D, 0x8D, 0x5D, 0x64, 0x7F, 0xD8, 0x5E, + 0x15, 0xA6, 0x4E, 0x31, 0xE5, 0x8F, 0x1E, 0x7C, 0x8F, 0xC7, 0x60, 0x86, + 0x2B, 0x4F, 0x69, 0x0E, 0x2C, 0x39, 0x8B, 0xFC, 0xF4, 0x5C, 0xF4, 0x0A, + 0x63, 0x4E, 0xE5, 0xCA, 0x46, 0x6B, 0x15, 0xF3, 0x9B, 0x7E, 0xBB, 0xD9, + 0xA1, 0x87, 0x50, 0x36, 0x23, 0xEF, 0x37, 0x88, 0xE3, 0x89, 0xAB, 0x5F, + 0x0A, 0x07, 0xB4, 0x5F, 0xF8, 0x45, 0xBB, 0xE8, 0x12, 0x10, 0xE8, 0x95, + 0xB6, 0x13, 0xEF, 0x51, 0xA2, 0x24, 0x12, 0x7F, 0x6D, 0x05, 0x0E, 0x94, + 0xF9, 0x92, 0xB8, 0x2E, 0x64, 0x40, 0xDC, 0xDA, 0xDC, 0xDE, 0x82, 0x81, + 0x9C, 0xE0, 0x0A, 0x27, 0xC6, 0x06, 0xB5, 0x01, 0xBF, 0x36, 0x76, 0xF8, + 0xB1, 0xE5, 0x3C, 0x42, 0xC3, 0x07, 0xE7, 0xBD, 0xFC, 0x7B, 0xFD, 0x70, + 0x4C, 0x17, 0x8F, 0x21, 0x9B, 0xBA, 0x06, 0xFC, 0x34, 0x56, 0xDD, 0x23, + 0x7E, 0x2C, 0x8D, 0xF8, 0x99, 0xD6, 0x69, 0xDA, 0x75, 0x42, 0x84, 0x43, + 0xDB, 0x51, 0x12, 0xA0, 0x78, 0xEC, 0x95, 0x87, 0x86, 0x84, 0xC9, 0x21, + 0xEF, 0x8C, 0x0D, 0xEA, 0xBC, 0xE7, 0x5A, 0x23, 0x01, 0xB1, 0xBD, 0x6A, + 0x23, 0x49, 0x1C, 0x42, 0xED, 0x39, 0x5D, 0x26, 0xEF, 0x54, 0x36, 0x5E, + 0xE8, 0xA8, 0xB0, 0xC9, 0xF2, 0x39, 0xD0, 0x49, 0x10, 0x89, 0x2A, 0xF3, + 0x4F, 0x3B, 0x3F, 0xF3, 0x6F, 0x98, 0xC0, 0xA2, 0x37, 0xC5, 0x98, 0xCB, + 0x7A, 0xE6, 0x78, 0x11, 0x15, 0x97, 0x77, 0x7D, 0x34, 0xE5, 0x67, 0x61, + 0x8B, 0xC7, 0x2B, 0xA2, 0xE8, 0x67, 0x3F, 0xBA, 0xD6, 0xEC, 0xC1, 0x5B, + 0xF7, 0x4E, 0x70, 0xC3, 0x1A, 0x98, 0x20, 0x05, 0xBA, 0x2D, 0x2B, 0x79, + 0xB8, 0x10, 0xA3, 0x74, 0xC9, 0x50, 0xEC, 0x90, 0x3C, 0xA9, 0xF8, 0xF7, + 0xF9, 0x9F, 0xF9, 0xE1, 0x8E, 0x92, 0x40, 0xEE, 0x62, 0xCE, 0x36, 0x70, + 0x90, 0xAA, 0x3D, 0x17, 0xDF, 0x78, 0x8D, 0x49, 0xC1, 0x77, 0x9F, 0xF0, + 0xBC, 0x8A, 0xF6, 0x06, 0x90, 0xF5, 0x13, 0x51, 0xA7, 0x1B, 0xB8, 0x7B, + 0x15, 0xAE, 0xBA, 0x54, 0x90, 0xCA, 0x01, 0x0C, 0xB0, 0x82, 0xF1, 0xA6, + 0x36, 0x0E, 0x1F, 0x40, 0x38, 0x19, 0xE5, 0x3D, 0x22, 0x12, 0x0A, 0xB7, + 0x17, 0x5D, 0x47, 0x46, 0x85, 0xE9, 0x40, 0xC3, 0x90, 0x6D, 0xAE, 0xBE, + 0x95, 0xCA, 0xA1, 0x00, 0x47, 0x6C, 0x6E, 0xCE, 0xBF, 0xAB, 0x0A, 0x9B, + 0x73, 0x86, 0x4C, 0x64, 0x73, 0x7D, 0xF4, 0x01, 0xCF, 0x4F, 0x4F, 0xBD, + 0xFB, 0xC5, 0x37, 0xC1, 0x95, 0xAC, 0xCE, 0x58, 0x0A, 0x58, 0x26, 0x67, + 0xF2, 0x0B, 0x10, 0x13, 0xC5, 0x8D, 0x72, 0xAC, 0xCE, 0xC2, 0x7B, 0x74, + 0xB6, 0x4A, 0xB6, 0x0A, 0x8B, 0xD9, 0x27, 0x3A, 0x3D, 0x15, 0x42, 0xA4, + 0xF5, 0xC3, 0x04, 0x91, 0x64, 0x05, 0xF1, 0x44, 0x27, 0x9D, 0xBE, 0xB6, + 0x24, 0xDA, 0x68, 0x7B, 0xDB, 0x5C, 0xF7, 0x02, 0x72, 0xF4, 0xBC, 0x88, + 0xF6, 0x8A, 0xE1, 0x45, 0xE8, 0x9D, 0x06, 0x5F, 0x37, 0x61, 0xF5, 0xD4, + 0xE8, 0x37, 0xAA, 0xE7, 0x79, 0xAA, 0x7C, 0x21, 0x93, 0x0C, 0x66, 0x95, + 0x63, 0xE8, 0x25, 0xAD, 0xCB, 0xBD, 0x29, 0x96, 0x7A, 0x87, 0x76, 0x18, + 0xC4, 0x97, 0x74, 0x24, 0xF4, 0x00, 0x00, 0x0E, 0x7E, 0xB1, 0xAD, 0x5D, + 0xF1, 0x63, 0x3C, 0xF0, 0xA3, 0x21, 0x91, 0x04, 0x15, 0x5C, 0xCD, 0xEC, + 0xA3, 0xDC, 0x39, 0x7A, 0x85, 0x12, 0xFC, 0x4C, 0x7B, 0xF6, 0x01, 0x9D, + 0xBC, 0x64, 0x31, 0x27, 0xFB, 0x20, 0x69, 0xB2, 0x95, 0x8A, 0xB8, 0x53, + 0x15, 0x0D, 0xE8, 0x12, 0x44, 0xA5, 0x96, 0x91, 0x19, 0xA1, 0xB5, 0x77, + 0xA2, 0xD2, 0x91, 0x63, 0xB2, 0x3B, 0x8C, 0x29, 0x5A, 0x77, 0xCB, 0x9A, + 0x82, 0x17, 0x7C, 0xEB, 0x9A, 0x8D, 0x1D, 0x38, 0xFD, 0x0D, 0x33, 0x62, + 0xD3, 0xF1, 0x90, 0xA1, 0x41, 0x90, 0x85, 0x10, 0x28, 0x1C, 0x73, 0x77, + 0xD6, 0x64, 0xAE, 0xDE, 0x21, 0x5D, 0xE6, 0xD0, 0xBE, 0x59, 0xA8, 0x04, + 0xB1, 0xF1, 0x70, 0xA3, 0xDA, 0xD6, 0xB0, 0xBC, 0x7F, 0x3D, 0x60, 0x91, + 0x38, 0xA3, 0xC9, 0xC1, 0xBE, 0xA0, 0xD6, 0x4A, 0x8E, 0x33, 0xF6, 0x1A, + 0x99, 0x20, 0xBF, 0xFC, 0x38, 0x9F, 0xD6, 0x66, 0x6A, 0x61, 0xF7, 0xB0, + 0x09, 0xC3, 0xB2, 0xD3, 0xC1, 0xA1, 0xB3, 0xB4, 0x6A, 0xE3, 0x94, 0xF5, + 0x92, 0xD3, 0xC0, 0xB6, 0x12, 0x53, 0x7A, 0xAC, 0x1E, 0x69, 0x58, 0x3B, + 0x1C, 0x0F, 0x69, 0x9E, 0x0E, 0xAA, 0xF4, 0xF2, 0x12, 0xAE, 0x66, 0x3B, + 0x40, 0x4A, 0xC3, 0x19, 0x15, 0xDA, 0x08, 0x58, 0x73, 0x1A, 0x9D, 0x18, + 0xAD, 0xA7, 0xA3, 0x66, 0xD1, 0x5D, 0x9A, 0x36, 0x4E, 0xF0, 0xA5, 0x69, + 0x33, 0xD0, 0x8A, 0x11, 0x2E, 0xBA, 0x33, 0xCB, 0xBE, 0x4F, 0x63, 0x9D, + 0x97, 0x50, 0x26, 0x96, 0x8F, 0x6F, 0x4D, 0x30, 0x80, 0x72, 0x28, 0x5E, + 0xA8, 0x74, 0x8E, 0x42, 0x9D, 0x15, 0xDA, 0xAC, 0x36, 0x74, 0x91, 0xFA, + 0x29, 0x8F, 0x54, 0xF5, 0x06, 0xCC, 0x80, 0x78, 0xED, 0x76, 0xDA, 0x3D, + 0x86, 0x9D, 0x9D, 0x3D, 0xA4, 0xA4, 0x7E, 0x9A, 0x80, 0xCC, 0x90, 0x7C, + 0x90, 0x14, 0x8D, 0x33, 0x30, 0x8B, 0xCB, 0x17, 0x36, 0xBB, 0xAF, 0xA7, + 0xE6, 0x7C, 0xA3, 0xE1, 0x7D, 0xB0, 0xA1, 0x9A, 0xA6, 0x28, 0xFE, 0x13, + 0xA3, 0xFF, 0xE5, 0xE9, 0xC9, 0xBD, 0x1E, 0xEF, 0x2C, 0xB6, 0xFE, 0x6F, + 0x6E, 0xDD, 0x94, 0xAB, 0x1C, 0xCE, 0x6E, 0x2A, 0x30, 0x08, 0x82, 0xD3, + 0xD1, 0xFB, 0xE3, 0xC8, 0x63, 0x25, 0xB2, 0xF6, 0x67, 0x1D, 0x72, 0x57, + 0x8B, 0xEE, 0x9F, 0x56, 0x2F, 0x16, 0x3E, 0x9B, 0xEC, 0x27, 0xDE, 0x2E, + 0x84, 0x97, 0x67, 0xA9, 0x69, 0x0D, 0xC5, 0x59, 0xC3, 0xC8, 0x74, 0xEE, + 0x04, 0x89, 0xEF, 0xF6, 0x4B, 0xB9, 0xA2, 0xE5, 0x82, 0x78, 0x1F, 0x49, + 0xDB, 0x02, 0xC6, 0x56, 0x4B, 0xD6, 0x25, 0xDB, 0xBD, 0xF9, 0x9C, 0xFD, + 0x2E, 0xF3, 0x05, 0x5A, 0x73, 0x69, 0x2A, 0xE9, 0x62, 0xD2, 0x10, 0x82, + 0x9D, 0xC8, 0x6C, 0xDC, 0xC6, 0xF2, 0x18, 0x17, 0xEB, 0x2F, 0x91, 0xDC, + 0x30, 0x55, 0xDF, 0xD8, 0x7C, 0xA4, 0x79, 0xE0, 0xC5, 0x37, 0x9D, 0x23, + 0xD5, 0xDF, 0xA4, 0xF2, 0x1B, 0x60, 0xB6, 0xC7, 0x6F, 0x20, 0x5C, 0xFC, + 0xF2, 0x6D, 0x01, 0x75, 0xFB, 0x50, 0x01, 0x5D, 0x24, 0x48, 0x53, 0xBF, + 0x27, 0x99, 0x73, 0x3A, 0x47, 0xD4, 0xDD, 0xBF, 0xE7, 0x41, 0xD3, 0x15, + 0x09, 0x21, 0x29, 0xDA, 0xFE, 0x6A, 0x8E, 0x20, 0xB8, 0x86, 0xC1, 0x8D, + 0x54, 0x74, 0xC7, 0xD6, 0x66, 0xA7, 0xE5, 0x67, 0xB9, 0xE8, 0x0A, 0x74, + 0x3A, 0xF9, 0x4D, 0xAF, 0x54, 0x2D, 0xF0, 0x44, 0x79, 0x04, 0x01, 0x54, + 0x49, 0xF9, 0x04, 0x2A, 0xEF, 0xDD, 0x50, 0x19, 0xF6, 0x56, 0x0A, 0x34, + 0x58, 0x20, 0x90, 0x23, 0x94, 0x70, 0x43, 0xBC, 0xF3, 0x1E, 0xC0, 0x7D, + 0xB5, 0xBD, 0xF0, 0xBF, 0xC9, 0x1F, 0x93, 0x17, 0x1D, 0x56, 0xDF, 0xA0, + 0x42, 0x9C, 0xAA, 0x31, 0xD1, 0xE0, 0x74, 0x0D, 0x42, 0x02, 0x3B, 0x06, + 0xF6, 0xC5, 0xA8, 0xBB, 0x17, 0x5C, 0xCD, 0x56, 0x71, 0x9E, 0xAA, 0x1E, + 0xE8, 0x96, 0x4E, 0x0D, 0x55, 0x4E, 0xA0, 0x9E, 0xDC, 0x30, 0x3E, 0x58, + 0xD3, 0x62, 0xB6, 0xAB, 0x3B, 0xCF, 0x4D, 0x2B, 0x4A, 0x17, 0x25, 0xFB, + 0xCA, 0x5E, 0x0A, 0x3B, 0x82, 0x36, 0xCC, 0x6D, 0x5D, 0x64, 0x86, 0x5C, + 0x73, 0x1E, 0x86, 0xDC, 0x32, 0x5F, 0xF5, 0x2A, 0x2D, 0x58, 0x89, 0xDA, + 0x23, 0x1A, 0xAB, 0x0A, 0x6E, 0x5F, 0xD3, 0x84, 0x33, 0x33, 0xC7, 0xFD, + 0x42, 0xE9, 0xD3, 0xBD, 0x56, 0xE3, 0x70, 0x8A, 0xBA, 0x95, 0xAF, 0xF6, + 0x0A, 0xA6, 0x22, 0x50, 0x3B, 0xCB, 0x1A, 0xE8, 0x88, 0xDF, 0xD3, 0xE8, + 0x94, 0x8C, 0xBF, 0xC7, 0x32, 0x4C, 0x31, 0x0F, 0x1E, 0x14, 0x95, 0x9C, + 0x2E, 0x08, 0x5B, 0x8B, 0x63, 0x62, 0x51, 0x5B, 0xAB, 0x8B, 0x81, 0x6E, + 0xA2, 0x9B, 0xE3, 0x56, 0x9B, 0x78, 0x44, 0x09, 0xCC, 0xD4, 0x69, 0xC4, + 0xF0, 0x4F, 0x7D, 0xA9, 0x1B, 0xE1, 0xD7, 0xFB, 0xD4, 0x44, 0x3F, 0xFF, + 0x3E, 0xDB, 0xEC, 0xB7, 0x52, 0x91, 0x0E, 0xE6, 0xF7, 0xEF, 0x2F, 0x32, + 0x15, 0xC5, 0x25, 0xA6, 0x10, 0xDF, 0xD2, 0x2F, 0x5E, 0xD0, 0x50, 0x28, + 0x47, 0xA2, 0x93, 0x37, 0x42, 0x33, 0xC2, 0x3E, 0x2E, 0x1C, 0x1A, 0x52, + 0xE5, 0x2C, 0x71, 0x6C, 0xB5, 0x4A, 0x78, 0xD2, 0x60, 0xDE, 0x9D, 0x26, + 0x8E, 0xAA, 0x3C, 0x31, 0xFA, 0x55, 0x78, 0x41, 0xD1, 0xBC, 0x9D, 0x19, + 0x85, 0x8B, 0x4C, 0xF9, 0x10, 0x95, 0x0E, 0x43, 0x8A, 0x34, 0x66, 0x4A, + 0x5A, 0x4D, 0xD9, 0x4A, 0xD6, 0x19, 0x23, 0xC9, 0x67, 0x6A, 0x81, 0x36, + 0x87, 0xC2, 0x79, 0x89, 0xE7, 0x17, 0x90, 0x7E, 0x5B, 0x61, 0x49, 0xD8, + 0x05, 0xA0, 0x4F, 0x08, 0x9A, 0x77, 0x53, 0x6D, 0x8C, 0xD5, 0x36, 0x4F, + 0xE7, 0x4E, 0x56, 0xB4, 0xE1, 0xC0, 0x53, 0xD3, 0xB8, 0xBE, 0xB7, 0x90, + 0xCA, 0xFE, 0xB9, 0x80, 0x0E, 0x13, 0xB2, 0x7C, 0x8F, 0x66, 0x40, 0xCC, + 0x8B, 0xB0, 0x7C, 0x32, 0x89, 0xDE, 0x2C, 0x5D, 0x6A, 0xC5, 0xE9, 0x4B, + 0x36, 0x38, 0xCD, 0x51, 0xE2, 0x97, 0x9F, 0x12, 0x45, 0x92, 0x68, 0x38, + 0xED, 0x62, 0x6A, 0xB6, 0x9A, 0x36, 0x82, 0x72, 0x43, 0x58, 0x0F, 0xA9, + 0xB0, 0x4F, 0x12, 0xC9, 0x32, 0x2C, 0xC0, 0xAF, 0xF6, 0xE5, 0x4D, 0x48, + 0xBF, 0xDD, 0xEC, 0xDB, 0x28, 0xC9, 0xD3, 0x5B, 0xE3, 0xFC, 0x7E, 0xAD, + 0x76, 0x28, 0xD4, 0x23, 0x71, 0x85, 0xA5, 0x22, 0xE9, 0x93, 0x5E, 0x43, + 0xB5, 0x0F, 0xAE, 0xDF, 0x8B, 0x51, 0x41, 0x86, 0xC3, 0x55, 0xE4, 0x68, + 0x43, 0x27, 0x7C, 0x0C, 0x8F, 0x7F, 0xA0, 0x5A, 0x7A, 0xD7, 0x88, 0xC3, + 0x8E, 0xF8, 0xC0, 0xF3, 0xB3, 0xC9, 0x15, 0x34, 0x80, 0x16, 0x34, 0x13, + 0x17, 0x6A, 0xD1, 0x59, 0x03, 0x94, 0x59, 0x7B, 0xA0, 0xE8, 0xE0, 0xA4, + 0x16, 0xFC, 0x76, 0xF0, 0x7C, 0x5A, 0x00, 0x01, 0x50, 0xE8, 0x56, 0xEF, + 0x18, 0xC8, 0xDA, 0xBC, 0xCD, 0xB8, 0x92, 0xB8, 0x22, 0xE3, 0xB5, 0x16, + 0x05, 0x25, 0xE7, 0x65, 0x3D, 0x1C, 0x0F, 0x23, 0xC5, 0x24, 0x16, 0x9E, + 0x75, 0xCC, 0xF0, 0xF9, 0x19, 0x47, 0x83, 0xA0, 0x42, 0xBC, 0x36, 0x99, + 0x76, 0xE0, 0x27, 0xA9, 0xDB, 0x4A, 0x6E, 0x50, 0x22, 0x99, 0x4D, 0xDF, + 0x43, 0x69, 0xA3, 0x95, 0x48, 0x97, 0xC7, 0xC5, 0x4F, 0x1B, 0x2A, 0x32, + 0xBA, 0x9F, 0xB9, 0x2D, 0x1D, 0xE3, 0x6E, 0x46, 0x1F, 0xBD, 0x7A, 0x4F, + 0x2A, 0x07, 0xB4, 0xA2, 0xC2, 0x31, 0xA9, 0x93, 0xE9, 0x98, 0x39, 0x93, + 0x89, 0x51, 0x82, 0x10, 0x99, 0xD5, 0x65, 0x25, 0x27, 0x37, 0xB1, 0x7E, + 0x98, 0x50, 0xEC, 0xA7, 0x29, 0xE0, 0xBE, 0xA4, 0x0C, 0xD5, 0x9B, 0x3D, + 0xAD, 0x02, 0x4D, 0x81, 0x93, 0x0F, 0xA4, 0xD7, 0xF4, 0x48, 0xCC, 0x4E, + 0xF6, 0x6F, 0xF3, 0x5C, 0xF6, 0x5A, 0x2E, 0x05, 0xFA, 0xFB, 0x04, 0x8D, + 0x95, 0x29, 0x94, 0x03, 0x34, 0xF2, 0x33, 0xD9, 0x5B, 0x47, 0x96, 0x6C, + 0x0C, 0xE6, 0x8E, 0xF2, 0xD1, 0xF2, 0x83, 0x6A, 0xF2, 0x95, 0x4C, 0xBF, + 0x46, 0xB4, 0x42, 0x95, 0xDA, 0x59, 0xBE, 0x32, 0x2F, 0xFB, 0x7A, 0x33, + 0xA0, 0x09, 0xB6, 0x34, 0x49, 0x4B, 0xA7, 0x9B, 0xF6, 0x56, 0xA9, 0xB7, + 0x5A, 0x98, 0xCD, 0x74, 0xF9, 0xBB, 0xD9, 0x1A, 0x46, 0x87, 0x5D, 0xA4, + 0x81, 0x25, 0xB9, 0x9E, 0x58, 0xF7, 0xBE, 0x19, 0x6E, 0x84, 0x50, 0x7D, + 0x94, 0x3B, 0x57, 0x0A, 0x05, 0x81, 0x42, 0x2F, 0x42, 0x90, 0x9B, 0xF1, + 0xA7, 0x66, 0xD0, 0xD4, 0xF6, 0xD0, 0xB7, 0xE0, 0xDF, 0x2D, 0x6D, 0x60, + 0x11, 0xBE, 0xC8, 0xB3, 0x65, 0xEB, 0x71, 0x33, 0x74, 0xAD, 0xD0, 0x3B, + 0x5D, 0x06, 0x79, 0x9B, 0xD8, 0x03, 0xB7, 0x28, 0xEC, 0x2D, 0x3F, 0x82, + 0xE5, 0xD4, 0x73, 0x01, 0xE8, 0x51, 0xD5, 0x04, 0x46, 0x0D, 0xA9, 0x48, + 0x83, 0x75, 0x88, 0x87, 0x4F, 0xA3, 0xC5, 0xCC, 0x0E, 0x39, 0x46, 0x9E, + 0xE8, 0xC7, 0x7C, 0xC2, 0xA1, 0xEA, 0x89, 0x08, 0xE4, 0x37, 0xAC, 0xC6, + 0x2B, 0x50, 0x7D, 0x78, 0x4F, 0x72, 0xC8, 0x96, 0xDC, 0x48, 0xB0, 0xEF, + 0x69, 0x70, 0xDF, 0x85, 0x0A, 0xE8, 0xEF, 0x14, 0xF9, 0x8C, 0xFE, 0x9E, + 0xB1, 0xA4, 0x9B, 0x58, 0xC1, 0x77, 0x5E, 0x88, 0x3D, 0xB1, 0x39, 0xC9, + 0xE1, 0x8B, 0x4C, 0x16, 0xC2, 0x10, 0xD7, 0x4D, 0x11, 0x11, 0x3E, 0xD9, + 0x60, 0xD1, 0xAB, 0x18, 0x9D, 0x85, 0x8E, 0xFF, 0xFA, 0xB6, 0x09, 0x2B, + 0xD2, 0x9A, 0xFD, 0x6F, 0x5C, 0x05, 0x51, 0x04, 0x03, 0x25, 0x38, 0x12, + 0xCD, 0xF1, 0x0B, 0x10, 0x28, 0x8A, 0x09, 0x2E, 0x2C, 0x38, 0x43, 0x19, + 0x40, 0xF8, 0x45, 0xFF, 0x80, 0x5D, 0xD4, 0xDB, 0x52, 0x2C, 0x51, 0x77, + 0xD7, 0xB1, 0xFF, 0xED, 0x06, 0x99, 0x56, 0x48, 0x53, 0x40, 0xF7, 0x80, + 0xFB, 0x9C, 0x0E, 0x6F, 0x1D, 0x25, 0xAA, 0x4C, 0x8E, 0x91, 0xE7, 0xC5, + 0x0A, 0xDB, 0x3F, 0xEA, 0x48, 0xB9, 0xB2, 0xFA, 0x39, 0x46, 0x9E, 0x3A, + 0xC3, 0xDC, 0x15, 0xF9, 0xCF, 0x8C, 0xA7, 0x14, 0xFD, 0x16, 0x11, 0x69, + 0xC7, 0xD9, 0x2B, 0x00, 0xBA, 0xE7, 0x47, 0xB5, 0xF3, 0x74, 0x14, 0x11, + 0xC5, 0x29, 0x5F, 0xA0, 0xF2, 0x0B, 0xB5, 0x45, 0xEB, 0x88, 0x96, 0x1F, + 0x26, 0xCC, 0x47, 0xD7, 0x5A, 0x96, 0x1A, 0xB5, 0xD7, 0x66, 0x98, 0xD0, + 0x65, 0xDC, 0xE2, 0x15, 0xAF, 0xAC, 0x7E, 0x60, 0xBE, 0x9E, 0x2D, 0xB5, + 0x9B, 0xD9, 0x19, 0x36, 0x53, 0x2F, 0xE4, 0x40, 0xD7, 0xDC, 0x82, 0x16, + 0x8B, 0x99, 0x1B, 0xB3, 0x5C, 0xBB, 0x6A, 0x3F, 0x90, 0xE4, 0xF8, 0x57, + 0xDE, 0x9E, 0x63, 0xFD, 0x78, 0x4F, 0x0A, 0x26, 0x73, 0x0E, 0xD9, 0x47, + 0x8B, 0x52, 0xBF, 0x77, 0x75, 0x15, 0xD2, 0x70, 0xDC, 0x4B, 0x47, 0x1D, + 0x6A, 0x7A, 0x5F, 0xFE, 0x64, 0x89, 0xAB, 0xA1, 0x95, 0x8F, 0x27, 0xD1, + 0xAD, 0x5C, 0x6D, 0xAB, 0xAF, 0x53, 0xA5, 0x7E, 0xFC, 0x14, 0x02, 0xE0, + 0xEA, 0x14, 0x60, 0x71, 0x20, 0xB5, 0x2B, 0x33, 0x47, 0xE8, 0x05, 0x82, + 0x4B, 0x85, 0xE3, 0xFE, 0x9D, 0x21, 0x95, 0x7F, 0x18, 0x11, 0xB4, 0x0D, + 0x7F, 0xB6, 0xAB, 0xF4, 0xF4, 0xE7, 0x43, 0x20, 0x50, 0x28, 0x72, 0x8B, + 0x11, 0x83, 0xA5, 0xB6, 0x1E, 0x94, 0xF9, 0x25, 0x94, 0x2B, 0xBC, 0xD6, + 0x55, 0x41, 0xE4, 0xF0, 0xD9, 0xF5, 0x4D, 0x30, 0x4A, 0xD4, 0x9D, 0x3B, + 0x23, 0xE3, 0x95, 0x2E, 0xB6, 0x60, 0x0D, 0xAD, 0x28, 0xE5, 0xF9, 0x6E, + 0x6A, 0x74, 0xB5, 0x6C, 0x88, 0x59, 0x87, 0x30, 0x4A, 0x54, 0xE0, 0x80, + 0xAA, 0x1E, 0x76, 0x02, 0x16, 0x55, 0xC5, 0xF2, 0xC8, 0x38, 0xE3, 0x22, + 0x12, 0x7A, 0x16, 0x51, 0xDB, 0x5B, 0x38, 0xF3, 0xE0, 0xC1, 0x45, 0x56, + 0x6A, 0xD3, 0xD3, 0x25, 0x59, 0x9A, 0x7A, 0x1F, 0x8A, 0xF4, 0xAF, 0x98, + 0x4E, 0xC8, 0x1D, 0x6A, 0x7E, 0x34, 0x4B, 0xD7, 0x85, 0x2F, 0xBB, 0x0F, + 0x7B, 0xD4, 0x76, 0x44, 0x83, 0x8A, 0x76, 0x01, 0x39, 0xAE, 0x88, 0xA5, + 0xB0, 0xFC, 0xBF, 0xEA, 0xD1, 0xFD, 0x44, 0x25, 0x72, 0xD9, 0xBC, 0x3F, + 0xD9, 0xC1, 0x29, 0x44, 0x22, 0x0E, 0x6A, 0x49, 0xE1, 0x32, 0x23, 0xB3, + 0x45, 0x80, 0x81, 0x9C, 0x38, 0x88, 0xE7, 0x27, 0x66, 0x09, 0x90, 0xF2, + 0xBD, 0x3C, 0x4B, 0x10, 0x98, 0x52, 0x4D, 0x81, 0x26, 0x25, 0xD3, 0xE3, + 0x66, 0x00, 0x27, 0x39, 0xBF, 0x6A, 0x40, 0x1D, 0x8F, 0x6F, 0x21, 0x16, + 0x22, 0x73, 0x1E, 0x9E, 0x11, 0xFF, 0xB8, 0xC9, 0x9A, 0x56, 0x35, 0x14, + 0x78, 0xBD, 0x1F, 0x7B, 0x89, 0x47, 0xB6, 0x6A, 0x51, 0xBC, 0x08, 0x9F, + 0x3D, 0xCF, 0x1C, 0xC5, 0x2C, 0x82, 0x88, 0x72, 0xCC, 0x35, 0x9B, 0xD7, + 0x31, 0xFE, 0xAE, 0x40, 0x2D, 0xBF, 0x21, 0xC3, 0xF1, 0xA8, 0x39, 0xC0, + 0x59, 0xB4, 0x29, 0x7C, 0x5D, 0x5C, 0x0A, 0x7C, 0xD6, 0xA2, 0xB9, 0x5A, + 0x69, 0x3A, 0xF2, 0xA5, 0xB5, 0x40, 0x5D, 0x84, 0x1E, 0x8A, 0x93, 0x2B, + 0x75, 0x8C, 0xF0, 0x7F, 0x57, 0x12, 0xB6, 0xF9, 0xBB, 0xBE, 0x28, 0x20, + 0x4B, 0xB1, 0xA8, 0x90, 0xE6, 0x6A, 0xE9, 0xB3, 0xB2, 0x14, 0xCE, 0xA0, + 0xCD, 0x9B, 0xD2, 0x8D, 0xEB, 0x34, 0xB2, 0x71, 0x86, 0x96, 0xFB, 0x88, + 0x5E, 0x9F, 0x0D, 0xE6, 0x99, 0x87, 0xAB, 0xAA, 0xF4, 0xEA, 0xD3, 0xFE, + 0xCE, 0x6D, 0x2C, 0x93, 0x8A, 0x06, 0x16, 0x47, 0xBB, 0xFF, 0xE0, 0xC5, + 0x31, 0xF1, 0x46, 0x31, 0xB4, 0x6D, 0xFE, 0x9A, 0x62, 0xC0, 0xD9, 0x17, + 0xC2, 0x38, 0x18, 0x5C, 0xBA, 0x00, 0xCE, 0x10, 0x89, 0x96, 0x36, 0x82, + 0x95, 0xD4, 0x76, 0x90, 0x7D, 0x5D, 0x79, 0x59, 0x20, 0x63, 0xA4, 0x5F, + 0x10, 0x5C, 0x08, 0xF4, 0x53, 0x39, 0xC7, 0x16, 0xB7, 0xE7, 0x37, 0xC6, + 0x67, 0x2D, 0x75, 0xA9, 0x86, 0x96, 0x3D, 0x55, 0x45, 0xFE, 0xFA, 0xC4, + 0xFE, 0x66, 0xEA, 0x53, 0xD3, 0x3C, 0x40, 0xA1, 0x96, 0x31, 0x0F, 0x2C, + 0x56, 0x82, 0xF5, 0xAD, 0x4B, 0x56, 0x1A, 0x04, 0x5E, 0xC0, 0x92, 0xED, + 0x74, 0xF1, 0x9D, 0x11, 0x0F, 0x8F, 0x69, 0x90, 0x53, 0x78, 0x71, 0x0D, + 0x8A, 0x6C, 0x8E, 0xB0, 0xA2, 0x33, 0x38, 0x7E, 0x18, 0xC5, 0x28, 0xEE, + 0x4F, 0xE5, 0x57, 0xC5, 0x5E, 0x42, 0xDE, 0xA8, 0xB7, 0x77, 0xE5, 0x5D, + 0xDD, 0xD9, 0xFE, 0xFF, 0x69, 0xF6, 0x0A, 0xBF, 0xE1, 0x22, 0xEC, 0x09, + 0xF3, 0x05, 0x61, 0x31, 0x71, 0x31, 0x06, 0x36, 0x76, 0x34, 0xB4, 0x5B, + 0x46, 0x4C, 0x7F, 0x26, 0x0F, 0x97, 0x75, 0x34, 0x75, 0x2B, 0x88, 0x1B, + 0xEC, 0xF7, 0x65, 0xF7, 0x92, 0x30, 0x04, 0xBA, 0x56, 0xBE, 0x44, 0xF8, + 0x0C, 0x3A, 0x27, 0xD9, 0xE1, 0x70, 0x10, 0x18, 0xE8, 0xE0, 0xB5, 0xC6, + 0x1E, 0x0E, 0x11, 0x7C, 0xB8, 0x7C, 0x3E, 0xD1, 0xDD, 0xEB, 0xA4, 0x14, + 0x2F, 0xC1, 0xAB, 0x77, 0x0E, 0x51, 0x23, 0xCC, 0x5E, 0x34, 0x19, 0xC9, + 0xBD, 0x81, 0x96, 0x00, 0xD6, 0xE9, 0xAA, 0x82, 0xD3, 0xE6, 0x00, 0x09, + 0x3E, 0xC0, 0xB6, 0x4F, 0xF1, 0x39, 0x00, 0xF0, 0xD6, 0xB1, 0x7A, 0xA2, + 0xD3, 0xD6, 0x08, 0x65, 0xE5, 0x4A, 0x84, 0xDA, 0x85, 0x17, 0xAC, 0x17, + 0x03, 0x35, 0x07, 0x8F, 0xF9, 0xB3, 0xCC, 0xC9, 0x3E, 0xF9, 0x4E, 0xA4, + 0x30, 0xE3, 0xC9, 0x96, 0x8B, 0x6B, 0x53, 0x4E, 0x11, 0xAF, 0x53, 0xAC, + 0x92, 0x8E, 0xCC, 0xFE, 0xCA, 0x12, 0x7F, 0x92, 0x0A, 0x62, 0x7A, 0x38, + 0xCA, 0xAA, 0x89, 0x0C, 0x00, 0x91, 0xA1, 0x9F, 0x96, 0x13, 0x2B, 0x46, + 0x0E, 0x59, 0xC0, 0xF3, 0x49, 0xDC, 0xF0, 0xFA, 0xBF, 0x4D, 0xE7, 0xF3, + 0x0A, 0x82, 0x12, 0x05, 0xDE, 0xA5, 0xA9, 0x8B, 0x67, 0xD0, 0xF5, 0x0B, + 0xEE, 0xA1, 0x73, 0x8F, 0xCC, 0x47, 0x67, 0x7E, 0x83, 0x79, 0x56, 0x19, + 0x49, 0x5B, 0xE0, 0x30, 0x5F, 0xE6, 0xCB, 0x6E, 0xEC, 0x69, 0x31, 0xB8, + 0x87, 0x6E, 0xC0, 0xEA, 0x76, 0x79, 0x3A, 0x1A, 0x05, 0x8B, 0xD3, 0xB1, + 0x56, 0x57, 0x13, 0xDF, 0x3A, 0x6F, 0x38, 0xFF, 0x3A, 0xFB, 0x59, 0x35, + 0x37, 0xFA, 0x93, 0xBB, 0xA3, 0x13, 0x69, 0xC1, 0xCA, 0x3B, 0x9C, 0x73, + 0x51, 0x81, 0x38, 0x57, 0x12, 0x55, 0xA7, 0x7F, 0x27, 0x87, 0x8B, 0x4A, + 0x0C, 0x7F, 0x2D, 0x6C, 0x6E, 0xED, 0x69, 0xDD, 0xC3, 0x29, 0xDA, 0x67, + 0xDF, 0x2E, 0x9B, 0x3D, 0xB1, 0xA7, 0xFA, 0x1E, 0xF0, 0x09, 0xE2, 0x69, + 0x4A, 0x97, 0xE0, 0x63, 0x92, 0x16, 0xF1, 0x7C, 0x70, 0x50, 0x72, 0xFE, + 0x96, 0x94, 0xE4, 0xAB, 0x5A, 0xCA, 0xEB, 0x69, 0x3C, 0x12, 0xE5, 0x1A, + 0xB8, 0x2C, 0x8C, 0x24, 0xA2, 0xF3, 0x2A, 0xFF, 0xA0, 0xEC, 0xE8, 0xDE, + 0xAF, 0x4C, 0xA0, 0xEB, 0x4D, 0x13, 0x77, 0x19, 0x23, 0xE3, 0xE2, 0x72, + 0xC3, 0xD4, 0x3A, 0x70, 0x1D, 0xA7, 0xE0, 0x92, 0x38, 0x98, 0x68, 0xBB, + 0x82, 0x98, 0xC7, 0x30, 0x38, 0x50, 0x2A, 0xDF, 0xAF, 0x9C, 0x7F, 0xAB, + 0x8A, 0xBB, 0x98, 0x6A, 0x48, 0x4A, 0xE4, 0x29, 0x3F, 0x5A, 0xBE, 0x7D, + 0x3D, 0xC8, 0xCB, 0x13, 0x9E, 0x9D, 0x86, 0xC5, 0x96, 0x1C, 0xB4, 0xD6, + 0xBF, 0x32, 0xE2, 0x4D, 0x1B, 0x86, 0x1A, 0xFA, 0xD0, 0xFB, 0x25, 0xA2, + 0xBA, 0x6F, 0xEE, 0x36, 0xF6, 0x24, 0xEC, 0x7D, 0x8E, 0x96, 0xA4, 0x95, + 0x4B, 0x3F, 0x5D, 0x1F, 0x11, 0x9B, 0xAD, 0x4B, 0xC5, 0x5C, 0x87, 0x58, + 0xA4, 0x56, 0xEB, 0xEA, 0x99, 0xC3, 0x85, 0x11, 0x01, 0x7B, 0xFD, 0x39, + 0x33, 0xB9, 0xD7, 0xDC, 0x26, 0x99, 0xCD, 0xB7, 0x7E, 0x7E, 0x60, 0xE7, + 0x44, 0x29, 0x6C, 0x0C, 0xFB, 0x13, 0x71, 0x2B, 0x5C, 0x13, 0x88, 0xFD, + 0xB9, 0xF4, 0x53, 0x20, 0xD6, 0xBB, 0xEF, 0xF0, 0xDB, 0x53, 0x4A, 0xD0, + 0x1B, 0xF3, 0x6F, 0xDB, 0x8E, 0xF6, 0xB0, 0x46, 0x5C, 0x2A, 0xAD, 0xFB, + 0x27, 0x52, 0xE5, 0xFD, 0x3D, 0x9B, 0x56, 0x9F, 0x47, 0xBA, 0xA9, 0xB7, + 0xAA, 0x5C, 0xB2, 0xFD, 0x4F, 0xA8, 0xAD, 0xA9, 0xDB, 0xB2, 0x34, 0xE5, + 0x86, 0xCB, 0x5F, 0xE7, 0x65, 0xEE, 0x92, 0x9D, 0x3E, 0x35, 0x42, 0x35, + 0x48, 0x03, 0x52, 0x31, 0x71, 0xCE, 0x72, 0xEC, 0x1F, 0x88, 0xCE, 0xDC, + 0xB2, 0x38, 0x32, 0xEA, 0x1B, 0x71, 0x22, 0xFC, 0x14, 0x53, 0xD8, 0x2E, + 0x6B, 0xF3, 0xDB, 0xF9, 0x3F, 0x01, 0xDC, 0xEF, 0xFE, 0x74, 0xE4, 0xE1, + 0x7B, 0x55, 0x21, 0xB5, 0x40, 0x78, 0x87, 0x76, 0xFC, 0xFA, 0x36, 0x25, + 0x45, 0xB9, 0x47, 0x2A, 0x65, 0x56, 0x75, 0x8E, 0xDC, 0x6E, 0x27, 0x2D, + 0x43, 0x82, 0xCC, 0x76, 0xA0, 0x48, 0x33, 0x88, 0x5B, 0x58, 0xF3, 0x83, + 0x6D, 0x8C, 0x1E, 0xFC, 0xA3, 0x1A, 0xAC, 0x74, 0xB4, 0x38, 0x47, 0xCA, + 0x20, 0x06, 0x14, 0xAB, 0x5A, 0xBD, 0x5E, 0x38, 0x5A, 0x1E, 0x88, 0xC7, + 0xF9, 0x69, 0x7D, 0xBF, 0x91, 0x2C, 0x51, 0x18, 0x95, 0xF6, 0x19, 0x98, + 0x79, 0xFC, 0x69, 0xFD, 0xF7, 0xA9, 0x21, 0xA1, 0xD4, 0xBF, 0xC5, 0x21, + 0xF5, 0xBA, 0xD2, 0x9B, 0xF8, 0xA5, 0x40, 0x57, 0xD1, 0x10, 0x47, 0x0F, + 0x93, 0x50, 0x0F, 0x5D, 0x97, 0x96, 0x14, 0x2B, 0x71, 0x63, 0x88, 0xEC, + 0xA1, 0x92, 0xF0, 0x76, 0x86, 0x5C, 0xCC, 0x37, 0x86, 0x04, 0xD2, 0xB0, + 0xDD, 0x53, 0x82, 0xD6, 0x28, 0xCC, 0x05, 0x60, 0xE1, 0x3F, 0x27, 0xD2, + 0x1C, 0x80, 0x68, 0xAA, 0xA9, 0x16, 0xCD, 0xF5, 0x82, 0x55, 0x11, 0xDD, + 0x05, 0x2D, 0x56, 0x9F, 0xC9, 0x92, 0xA2, 0xB8, 0xDF, 0xD9, 0x32, 0x28, + 0xD4, 0xE9, 0xEA, 0x7E, 0x93, 0x5D, 0x33, 0x96, 0x77, 0x81, 0xCF, 0x63, + 0xE2, 0xC5, 0xC4, 0x41, 0x89, 0x0A, 0x64, 0xCC, 0x68, 0xD3, 0x3A, 0x80, + 0x1A, 0xAC, 0x36, 0xDC, 0x50, 0x95, 0x5B, 0x8A, 0xE7, 0x24, 0xAD, 0x65, + 0xC9, 0x86, 0x2A, 0xC2, 0x0C, 0x48, 0xB0, 0xDD, 0x33, 0x53, 0x1F, 0x08, + 0x35, 0x9B, 0x91, 0x52, 0xBB, 0xA8, 0x85, 0xE2, 0xA9, 0x0D, 0x22, 0x80, + 0x1D, 0xCA, 0x57, 0xA5, 0x52, 0xE4, 0xDA, 0x10, 0x7C, 0x31, 0xDB, 0xAA, + 0x27, 0x98, 0x85, 0xB7, 0xC7, 0x4E, 0xFC, 0x9D, 0x39, 0x8A, 0x10, 0x30, + 0x78, 0x4B, 0xB3, 0x3C, 0xAF, 0xAB, 0xE7, 0xD9, 0xBB, 0xB4, 0x11, 0x3E, + 0x59, 0x32, 0x2A, 0xD8, 0x89, 0xD8, 0xF5, 0xEB, 0x45, 0xFC, 0xEF, 0x8B, + 0x78, 0xCF, 0x10, 0x1B, 0xCF, 0x4A, 0x2C, 0x24, 0x57, 0xED, 0x82, 0x2E, + 0x4B, 0xC9, 0x1A, 0xC8, 0x1C, 0xD0, 0x5D, 0xE1, 0x87, 0x6E, 0xEA, 0xED, + 0xD9, 0x0D, 0xC9, 0x1C, 0x59, 0x14, 0x85, 0xFB, 0x60, 0xFE, 0x62, 0x06, + 0x4A, 0xB9, 0x0F, 0x0E, 0x83, 0xFE, 0x14, 0x1A, 0x7F, 0x6F, 0xFB, 0xC0, + 0xBF, 0x76, 0x02, 0x3C, 0xAB, 0x58, 0x86, 0xB0, 0xDA, 0x69, 0xE7, 0xFD, + 0x2B, 0x4C, 0x47, 0x66, 0xAB, 0xAB, 0xFF, 0x5D, 0xA0, 0xF2, 0x95, 0x47, + 0xC8, 0x23, 0xB8, 0x58, 0xA2, 0x74, 0x9D, 0x65, 0x6D, 0x3F, 0xC9, 0xD9, + 0xC0, 0xE9, 0x8A, 0x62, 0x0A, 0x6E, 0x1F, 0xE7, 0xD2, 0x86, 0x97, 0x26, + 0xA4, 0x0A, 0x9C, 0x54, 0x44, 0xC8, 0x8C, 0x4E, 0x3B, 0xA9, 0xE6, 0x97, + 0xBE, 0xBE, 0x16, 0x09, 0xE3, 0xC7, 0xCA, 0x68, 0x47, 0x24, 0x80, 0x22, + 0x27, 0x0D, 0xC7, 0xE4, 0x11, 0x68, 0xD2, 0x1A, 0x79, 0x61, 0x89, 0x59, + 0xD5, 0xA3, 0x99, 0xDF, 0x9C, 0x5B, 0x10, 0x58, 0x36, 0x6D, 0xDE, 0x9F, + 0xB5, 0xC2, 0xF2, 0x9F, 0x68, 0x99, 0x95, 0xD1, 0x79, 0x08, 0x8F, 0xE4, + 0xEC, 0x82, 0x7D, 0x70, 0xCF, 0xEA, 0x77, 0x00, 0x0A, 0x0A, 0xE6, 0x39, + 0x45, 0x96, 0xB6, 0xA1, 0xC0, 0xA3, 0xAA, 0x64, 0xF8, 0x3B, 0xD2, 0xF7, + 0x5C, 0xAD, 0xC0, 0x62, 0x93, 0xDA, 0xAE, 0x08, 0x5F, 0xB5, 0x10, 0x7F, + 0x14, 0xB6, 0x91, 0xC3, 0xEC, 0xBB, 0x0F, 0x18, 0x4B, 0x88, 0xBE, 0xFF, + 0xA2, 0xF1, 0x02, 0x48, 0x03, 0x6C, 0x6A, 0x5C, 0xAE, 0x7F, 0xBB, 0xA3, + 0x02, 0x25, 0x6E, 0x13, 0x9B, 0x64, 0x8C, 0x6B, 0x3D, 0xC1, 0xC6, 0xC7, + 0xB6, 0xA8, 0xF2, 0x85, 0x12, 0x87, 0xEA, 0xE0, 0x07, 0x3A, 0xEE, 0x2F, + 0xC2, 0x68, 0xB8, 0x05, 0xB5, 0x55, 0x15, 0xDF, 0x21, 0x78, 0x9D, 0x21, + 0x80, 0xE8, 0x91, 0xA4, 0x97, 0x1C, 0x08, 0xDB, 0x68, 0xA8, 0xEF, 0x25, + 0x00, 0xEE, 0xAC, 0xD7, 0x87, 0x26, 0xD6, 0x27, 0xB8, 0xE5, 0x85, 0x79, + 0x3F, 0xA4, 0xE9, 0xC8, 0x51, 0x44, 0xAF, 0xAE, 0x32, 0x08, 0x57, 0x1D, + 0xC6, 0xB7, 0x4D, 0x43, 0xDC, 0x3D, 0x27, 0xD4, 0x34, 0x53, 0xEA, 0x1A, + 0xFA, 0x57, 0x11, 0x04, 0xC1, 0x70, 0x7D, 0x88, 0x9B, 0x35, 0xAA, 0xBE, + 0x23, 0xD4, 0x10, 0xFB, 0xEA, 0x9C, 0x4A, 0xBC, 0xA5, 0xC0, 0x4E, 0xE1, + 0x2C, 0x30, 0x15, 0x1B, 0xA6, 0xFA, 0x7C, 0x27, 0x78, 0xA3, 0x2B, 0xF7, + 0x90, 0x20, 0x4B, 0xB2, 0xBD, 0xEE, 0x11, 0xD1, 0x53, 0xEB, 0xBC, 0x33, + 0xAD, 0x87, 0xD5, 0x15, 0x6B, 0x69, 0xFD, 0x20, 0x3E, 0x74, 0xF3, 0x9D, + 0x24, 0x9A, 0xC7, 0x39, 0xEB, 0xD2, 0x81, 0x24, 0x7A, 0x75, 0x20, 0x20, + 0xA3, 0x2B, 0xB6, 0x59, 0x62, 0x54, 0xE4, 0x6F, 0x03, 0x41, 0xCD, 0x3A, + 0x13, 0x69, 0x5C, 0xDA, 0xD6, 0xE1, 0x64, 0x14, 0x4F, 0x05, 0x03, 0x04, + 0x4F, 0x1A, 0x38, 0xF8, 0x40, 0x9E, 0xA1, 0x38, 0xDA, 0x20, 0xB5, 0x54, + 0xC6, 0x0D, 0x1D, 0x58, 0xE4, 0x45, 0x10, 0xF5, 0x9C, 0xA6, 0xA4, 0x90, + 0x64, 0x35, 0xE6, 0xF0, 0xFE, 0x58, 0x47, 0xC6, 0x84, 0xA6, 0x69, 0x62, + 0xCC, 0xFA, 0x50, 0xFA, 0xAC, 0x24, 0x5E, 0x72, 0xCF, 0x4C, 0xAF, 0xCF, + 0xF1, 0x12, 0xB8, 0x62, 0xA0, 0xF1, 0xB6, 0x36, 0xF7, 0x3E, 0xD5, 0x3F, + 0x2B, 0xD5, 0xC3, 0x57, 0xE7, 0x84, 0x9E, 0xCE, 0x48, 0x21, 0x90, 0x09, + 0x5D, 0x62, 0xBB, 0xDC, 0x5A, 0x93, 0x20, 0x6D, 0xF3, 0x8F, 0x9C, 0x51, + 0x97, 0x74, 0xC7, 0x55, 0x08, 0xD9, 0x42, 0x11, 0x70, 0x55, 0x08, 0x96, + 0x2D, 0xC2, 0x5C, 0x0B, 0x02, 0x6D, 0xFC, 0x3A, 0xCD, 0x21, 0xF2, 0x72, + 0xD6, 0x78, 0x3B, 0xD5, 0x52, 0xC9, 0xE9, 0x94, 0x51, 0x2F, 0xBA, 0x27, + 0x99, 0x6B, 0xF1, 0xF2, 0xFA, 0xBF, 0x15, 0x68, 0xD1, 0xC6, 0x8A, 0x86, + 0x3A, 0x51, 0x45, 0xB2, 0xE9, 0x5D, 0xD1, 0x82, 0xC3, 0x32, 0x28, 0xD3, + 0x8B, 0xFB, 0x90, 0x6D, 0x96, 0x9E, 0x65, 0x07, 0xE1, 0x05, 0x28, 0x52, + 0xE6, 0x93, 0x93, 0x4B, 0xB1, 0x44, 0xE1, 0xD5, 0xB5, 0x65, 0x1D, 0x1D, + 0x5C, 0xFA, 0xB0, 0xCA, 0xC3, 0x9D, 0xCD, 0xAC, 0x11, 0xFF, 0x81, 0x44, + 0x91, 0xB0, 0x1C, 0xC8, 0x6F, 0x21, 0xC2, 0x61, 0x95, 0x61, 0x49, 0x19, + 0x3F, 0x67, 0x9A, 0xC0, 0x7F, 0xEE, 0xCF, 0xE8, 0x5E, 0x75, 0x03, 0x56, + 0x4D, 0x24, 0x61, 0xF9, 0xD8, 0x98, 0xA1, 0x2B, 0xD1, 0x8C, 0x40, 0x9B, + 0xDC, 0xB6, 0x5C, 0xC0, 0xD6, 0x84, 0x67, 0x2E, 0x00, 0x2A, 0x89, 0xCE, + 0x0A, 0x6D, 0x06, 0x23, 0x64, 0x10, 0xD5, 0xD2, 0x17, 0xC5, 0xF9, 0x98, + 0xEE, 0xE6, 0xFC, 0x16, 0x6B, 0x0E, 0xAD, 0x40, 0x4D, 0x2D, 0x78, 0x9C, + 0x75, 0x60, 0xDD, 0x55, 0x5B, 0x9F, 0xDF, 0xE0, 0x70, 0x2A, 0x72, 0xF3, + 0x10, 0x31, 0x0F, 0xB9, 0xA6, 0xDC, 0x3E, 0x0C, 0x9D, 0x20, 0x91, 0xA6, + 0x0F, 0x4E, 0x49, 0x0D, 0x3D, 0x2C, 0x2D, 0x33, 0x32, 0x31, 0x1E, 0xF6, + 0x89, 0xD6, 0x66, 0xF0, 0x98, 0x1E, 0x11, 0x36, 0xE2, 0xF2, 0xDE, 0x09, + 0x5F, 0x7B, 0x29, 0xA2, 0x51, 0x47, 0xA6, 0xAC, 0x2B, 0xE2, 0x5A, 0xAE, + 0x7F, 0x38, 0xA5, 0xF6, 0xFE, 0x61, 0x42, 0x70, 0xB9, 0xCC, 0xCC, 0xD7, + 0x23, 0x0F, 0xBF, 0xCC, 0x87, 0x48, 0x31, 0x38, 0x1B, 0x7A, 0x4B, 0x9E, + 0xEB, 0x1F, 0x3D, 0x16, 0x55, 0xFA, 0xDB, 0xC2, 0xA0, 0xFF, 0xDC, 0x34, + 0x4B, 0x0D, 0x3C, 0x33, 0x55, 0x87, 0x7E, 0x73, 0xCD, 0x66, 0x8A, 0x5D, + 0x3F, 0xE4, 0xFE, 0xF1, 0x56, 0xFE, 0xB1, 0xB1, 0x09, 0x4E, 0x1D, 0xA5, + 0xEE, 0xD5, 0x6D, 0x9F, 0xA3, 0xA9, 0xCB, 0x16, 0xE4, 0x62, 0x87, 0x1F, + 0xB5, 0x88, 0xFB, 0x2B, 0x77, 0xA0, 0xB8, 0x9D, 0x51, 0x1F, 0x88, 0x60, + 0x45, 0x69, 0x2A, 0x46, 0x1E, 0x7B, 0x7F, 0x63, 0x98, 0x59, 0x8A, 0x75, + 0x6C, 0x4E, 0xFE, 0xFD, 0xC1, 0xCB, 0x68, 0x10, 0x71, 0x38, 0x8F, 0x1A, + 0x50, 0xF5, 0x4A, 0xE3, 0x82, 0x28, 0x46, 0x4A, 0x72, 0x0A, 0x86, 0xF9, + 0xE0, 0xF4, 0x7E, 0xCB, 0x3A, 0xB5, 0x6C, 0x6A, 0x6B, 0x14, 0x1B, 0x0E, + 0xAD, 0x60, 0xCE, 0x39, 0x8F, 0x62, 0x3F, 0x2A, 0x33, 0xBC, 0xF3, 0x03, + 0x90, 0x40, 0x3B, 0x5E, 0x30, 0x77, 0xE0, 0xA4, 0xAA, 0x5D, 0xC3, 0xCF, + 0x43, 0x0F, 0xF7, 0x1C, 0x4E, 0x60, 0x87, 0x82, 0xB6, 0x5A, 0xF3, 0x35, + 0x17, 0x48, 0xFB, 0x8F, 0x34, 0xCB, 0xED, 0x6F, 0xFC, 0xB8, 0x73, 0xBB, + 0x09, 0xCE, 0x07, 0x89, 0x58, 0xEB, 0xC4, 0x82, 0x67, 0x45, 0xAD, 0xCA, + 0xD9, 0x49, 0xE4, 0x00, 0xAA, 0x5A, 0xED, 0x61, 0xA6, 0x49, 0x1A, 0xB6, + 0xC8, 0x09, 0xDE, 0xAA, 0x65, 0x1A, 0x0C, 0xF5, 0xDF, 0xA9, 0x2B, 0xB6, + 0x91, 0xE9, 0xF0, 0x08, 0x2A, 0xBB, 0x4A, 0x04, 0x30, 0x0C, 0x71, 0x64, + 0xE2, 0xCF, 0xF3, 0xD4, 0x1E, 0x99, 0x9A, 0x2B, 0x11, 0x5D, 0x29, 0x61, + 0xC6, 0x2C, 0xC1, 0xA7, 0x05, 0xE8, 0x9B, 0xD0, 0xE4, 0xD2, 0x56, 0x96, + 0x5E, 0xA9, 0x25, 0x96, 0x25, 0xBC, 0xBC, 0x12, 0xE5, 0x50, 0x47, 0x4C, + 0x8D, 0xBF, 0xA6, 0xDA, 0x0A, 0x88, 0x70, 0x2F, 0x74, 0x2D, 0xE9, 0xCD, + 0xD8, 0xF6, 0xD9, 0x76, 0x37, 0x9A, 0x1F, 0x1D, 0x3D, 0x10, 0xBA, 0xD0, + 0x3C, 0x13, 0x56, 0x73, 0x79, 0x97, 0xB9, 0x55, 0x9D, 0x8B, 0xF3, 0xD5, + 0x87, 0x0B, 0x1D, 0x97, 0x53, 0xD0, 0xF9, 0xA9, 0x76, 0x3B, 0xDE, 0x18, + 0x3C, 0xE8, 0xF0, 0x81, 0x13, 0x16, 0x5A, 0x7D, 0x59, 0xF1, 0x9E, 0xE3, + 0xC5, 0xBA, 0xFC, 0xB7, 0x7E, 0x5F, 0x05, 0xF4, 0x38, 0x6C, 0xA1, 0x09, + 0xAA, 0x15, 0x4C, 0xC5, 0xF6, 0xE7, 0x25, 0x72, 0xC4, 0xAA, 0x82, 0xFE, + 0xEB, 0x3F, 0xBC, 0x6B, 0x26, 0xB2, 0xAD, 0x85, 0x83, 0xFB, 0xFA, 0xD9, + 0x2D, 0x78, 0x50, 0xBE, 0xF6, 0x70, 0xB4, 0x8A, 0xDB, 0x71, 0xA2, 0x60, + 0x80, 0x7A, 0x91, 0xB2, 0x74, 0x54, 0x81, 0xB5, 0xF7, 0x48, 0x77, 0x96, + 0x05, 0xD6, 0x34, 0xC1, 0x06, 0x0E, 0x35, 0x20, 0x39, 0x28, 0x2D, 0x57, + 0xC1, 0x75, 0xA2, 0x26, 0x0B, 0xEB, 0x59, 0x12, 0x07, 0x46, 0x35, 0x1B, + 0x7D, 0x2A, 0x5B, 0x0D, 0x19, 0x1A, 0xBD, 0x09, 0x5D, 0xEF, 0x7A, 0x79, + 0x7F, 0xB1, 0xD6, 0x45, 0x00, 0xC3, 0x3E, 0xB2, 0xA9, 0x03, 0x19, 0x43, + 0xC3, 0x53, 0x73, 0x24, 0xA2, 0xEC, 0x9B, 0x88, 0x09, 0xF4, 0x5C, 0xB5, + 0xC0, 0x69, 0x00, 0xB6, 0xB4, 0x80, 0xDE, 0x9A, 0x7A, 0x85, 0x1D, 0xA7, + 0x85, 0x81, 0x3D, 0x83, 0x41, 0x85, 0xA5, 0x32, 0x7B, 0x7D, 0x47, 0xEB, + 0x35, 0x07, 0x3C, 0xED, 0xBC, 0x6B, 0xEF, 0xB0, 0x1A, 0x6F, 0x33, 0x0A, + 0x2C, 0xBA, 0x54, 0xF8, 0xEE, 0xA9, 0xB4, 0x2A, 0x17, 0x8A, 0x1E, 0x6C, + 0x58, 0xFB, 0x09, 0xF0, 0x76, 0x0F, 0x03, 0xD3, 0x34, 0xC1, 0xC2, 0xA1, + 0xCD, 0x96, 0x21, 0xFC, 0x9C, 0x21, 0x3D, 0xB6, 0xA2, 0xD1, 0xA2, 0x0F, + 0x24, 0xF6, 0x33, 0xB4, 0xB4, 0x36, 0xCA, 0x12, 0x25, 0x52, 0x85, 0x5B, + 0x07, 0x82, 0xAF, 0xB8, 0x8B, 0xB1, 0x36, 0x67, 0x32, 0xAF, 0x51, 0x74, + 0xDE, 0x15, 0x9B, 0xE7, 0xD9, 0x6D, 0x2C, 0xEA, 0xDE, 0x68, 0x99, 0x66, + 0x31, 0x87, 0x7D, 0xEA, 0xA8, 0x4D, 0xF4, 0x06, 0xB5, 0x28, 0xD8, 0x93, + 0xB8, 0x38, 0xB3, 0x2D, 0xA2, 0xA8, 0xCD, 0x03, 0x96, 0x61, 0xD1, 0x7B, + 0x49, 0x11, 0xE8, 0xEE, 0x25, 0xCE, 0x44, 0xA7, 0x77, 0xED, 0x72, 0xA3, + 0xF4, 0xA7, 0xCB, 0x2D, 0x9D, 0xC5, 0xBA, 0x89, 0xBD, 0x9A, 0xC0, 0x84, + 0xDD, 0x14, 0x09, 0x1C, 0x11, 0x17, 0x4F, 0x99, 0x23, 0xDA, 0xD2, 0xD4, + 0x68, 0x4E, 0x7B, 0xFC, 0x85, 0x24, 0xE7, 0x1A, 0x79, 0xA5, 0x91, 0x9E, + 0xD8, 0xBB, 0x0E, 0xFA, 0xC4, 0x99, 0x31, 0xFB, 0x02, 0x4C, 0x15, 0xEC, + 0x38, 0x6E, 0xBC, 0xF8, 0xA1, 0xCB, 0xAD, 0x8D, 0x12, 0x66, 0x91, 0x61, + 0xAF, 0xA8, 0x01, 0x86, 0xF7, 0x8A, 0x54, 0x30, 0x40, 0xDE, 0x3F, 0x83, + 0xA4, 0x9C, 0x43, 0x98, 0x50, 0x21, 0x12, 0xB3, 0x20, 0x53, 0xE5, 0x46, + 0x82, 0x7E, 0xDF, 0x59, 0x1E, 0x19, 0x0C, 0x2B, 0xFF, 0x77, 0x92, 0x25, + 0xF4, 0x31, 0xDA, 0x82, 0xDA, 0x3A, 0x73, 0xF8, 0x2E, 0x83, 0x30, 0xBF, + 0x1E, 0x47, 0x46, 0x2C, 0x62, 0xBA, 0xA7, 0x95, 0x5D, 0xE2, 0xB8, 0x7A, + 0xE2, 0x3F, 0xD9, 0x6C, 0xEF, 0xC8, 0x47, 0xA7, 0x19, 0x60, 0x56, 0xC0, + 0x8F, 0xB4, 0x8E, 0x1F, 0x33, 0xAD, 0x2A, 0x08, 0xDA, 0x53, 0x52, 0x2D, + 0x86, 0x14, 0x6A, 0xB5, 0x94, 0xD0, 0xFC, 0xEE, 0xE6, 0xDD, 0x76, 0xC6, + 0x91, 0xCA, 0x3D, 0x00, 0xA4, 0x63, 0x3A, 0x38, 0xE4, 0x79, 0xDE, 0x44, + 0x48, 0x41, 0x50, 0x9C, 0x1A, 0xCB, 0x15, 0x68, 0xD5, 0xE5, 0xE8, 0x00, + 0x69, 0x3E, 0x2B, 0x82, 0x3B, 0x3D, 0x0A, 0x8F, 0x8B, 0xBE, 0x98, 0x08, + 0xD9, 0x66, 0xC3, 0xF2, 0xC9, 0x6E, 0xDF, 0xD0, 0xDC, 0xB1, 0x24, 0x91, + 0xA8, 0x70, 0xFA, 0xD2, 0xD7, 0x43, 0x25, 0xE1, 0x04, 0xDA, 0xED, 0x5D, + 0xBF, 0xD0, 0x1A, 0x8B, 0xBD, 0x22, 0xA1, 0xEC, 0x90, 0x76, 0xBF, 0x07, + 0xE2, 0xA5, 0xB4, 0x4D, 0xEA, 0x39, 0xDA, 0x95, 0x2F, 0xE0, 0x77, 0x23, + 0x07, 0x48, 0x28, 0x57, 0x35, 0xD7, 0x30, 0xC0, 0xB2, 0xFC, 0x6E, 0x2B, + 0x2F, 0xF3, 0x44, 0x9C, 0xD8, 0xBF, 0xD9, 0x44, 0x2D, 0x92, 0xDF, 0x51, + 0x7A, 0x6E, 0xBB, 0x69, 0xC9, 0xA8, 0xC2, 0x27, 0x15, 0x8F, 0x88, 0xE3, + 0xFD, 0x96, 0xD4, 0x1D, 0x1A, 0xF9, 0xB7, 0x2C, 0x54, 0xE5, 0xA6, 0x4B, + 0xBC, 0xC3, 0x89, 0xFD, 0x09, 0xAB, 0xB9, 0xB2, 0xC2, 0xF1, 0xB6, 0x9E, + 0xFA, 0x2E, 0xF1, 0x6A, 0x2A, 0x3F, 0x3A, 0xDC, 0x21, 0x66, 0x76, 0xB5, + 0x7C, 0xEA, 0xE5, 0xE0, 0xD9, 0xA9, 0x14, 0x92, 0xD6, 0x0D, 0x04, 0xB4, + 0x04, 0x8A, 0xF6, 0xF1, 0x85, 0x69, 0xF4, 0x1F, 0x8D, 0xBC, 0x6A, 0x9B, + 0x7F, 0x0D, 0x7C, 0xC7, 0x4C, 0x26, 0x60, 0x4F, 0xB0, 0x08, 0x5D, 0x15, + 0x72, 0x02, 0x2E, 0xD1, 0xF1, 0xD1, 0xED, 0x8F, 0x0A, 0x8B, 0x8A, 0xD1, + 0x18, 0x18, 0x77, 0x40, 0x40, 0x35, 0x2B, 0xDB, 0x28, 0x9B, 0x0B, 0x32, + 0xBF, 0x17, 0x54, 0x3B, 0xF5, 0xEF, 0xED, 0x6A, 0x6C, 0x4D, 0x8C, 0x27, + 0xF5, 0x36, 0xD2, 0x97, 0x20, 0x3E, 0x72, 0x50, 0x91, 0x79, 0x93, 0x53, + 0x53, 0xA3, 0x50, 0xD3, 0x09, 0xAF, 0x36, 0x90, 0x0A, 0xAA, 0xE6, 0x19, + 0x05, 0x5D, 0x5D, 0x6D, 0x04, 0x9A, 0x08, 0x7A, 0xD9, 0x06, 0x9C, 0x03, + 0xD9, 0x12, 0xFA, 0x36, 0x10, 0xEB, 0x9C, 0x4C, 0x74, 0xEC, 0x69, 0x36, + 0xB3, 0x8A, 0x0C, 0x22, 0xA6, 0xB3, 0xF1, 0xAE, 0x70, 0x8B, 0xA8, 0x38, + 0x08, 0x0F, 0x42, 0x40, 0x89, 0x6D, 0x09, 0xEC, 0x71, 0x44, 0x8F, 0xD1, + 0xC7, 0xCB, 0x8F, 0x4C, 0xEC, 0xC8, 0x5B, 0x7D, 0xB1, 0x77, 0x36, 0x66, + 0xA6, 0xDF, 0x29, 0x2B, 0x2F, 0x5E, 0x8D, 0x3D, 0xE6, 0x38, 0xC1, 0x32, + 0x0B, 0x64, 0x90, 0xB1, 0xA7, 0x03, 0x4A, 0x41, 0x94, 0xE6, 0xFF, 0x37, + 0x1E, 0x75, 0xD4, 0x1C, 0x71, 0x63, 0xB4, 0x64, 0x9B, 0x1B, 0x4C, 0x7B, + 0xFB, 0x16, 0x95, 0x95, 0xDB, 0xB6, 0x08, 0x93, 0x9B, 0x7B, 0x86, 0xA0, + 0x53, 0x24, 0x40, 0x7F, 0x2F, 0xF0, 0x86, 0xE4, 0x89, 0x02, 0x88, 0xBA, + 0x25, 0xE9, 0xD9, 0x46, 0x08, 0x1C, 0xBD, 0x73, 0x81, 0xBB, 0x48, 0x55, + 0x65, 0x46, 0x9D, 0x06, 0x75, 0x99, 0x75, 0x7A, 0x06, 0x3E, 0x4B, 0x25, + 0x8D, 0x7B, 0x78, 0x81, 0xC6, 0x98, 0xAA, 0x20, 0x22, 0x8B, 0x74, 0x6B, + 0x01, 0x1E, 0x7A, 0x36, 0x39, 0xC7, 0x53, 0x09, 0x53, 0x92, 0xF0, 0x1A, + 0x49, 0x2E, 0x91, 0x26, 0x02, 0xEB, 0x14, 0xEE, 0x8D, 0x48, 0xC1, 0x79, + 0x01, 0x1B, 0x03, 0x33, 0x7B, 0xD1, 0xAE, 0x99, 0xD9, 0xDE, 0x17, 0xAB, + 0xBE, 0xA8, 0x38, 0xAD, 0x8B, 0x82, 0x60, 0x4E, 0xF3, 0xF0, 0xB2, 0xFB, + 0x51, 0x14, 0x57, 0x9A, 0xE3, 0xDC, 0xB0, 0x5C, 0x66, 0xDD, 0xFE, 0x2A, + 0x5A, 0x10, 0x23, 0x2F, 0xBA, 0x07, 0x3C, 0x48, 0x37, 0x6A, 0x29, 0xA5, + 0x6C, 0xC5, 0x1E, 0xCF, 0x36, 0x1C, 0x0B, 0x4B, 0x1F, 0x39, 0x8C, 0xAF, + 0x16, 0x50, 0xEB, 0x42, 0x30, 0x5F, 0x23, 0x74, 0x85, 0x94, 0xFA, 0x69, + 0x53, 0x95, 0xF8, 0xAF, 0x78, 0xDD, 0x88, 0x82, 0xC6, 0xEA, 0xBB, 0xB1, + 0xAF, 0x12, 0xE8, 0x97, 0x9A, 0xBB, 0x70, 0x8C, 0x5D, 0x0B, 0x89, 0xB1, + 0x86, 0x2F, 0x7C, 0x8B, 0x59, 0x57, 0x2D, 0xC9, 0xC8, 0x8A, 0xDC, 0xA1, + 0xCD, 0xE1, 0x5D, 0x15, 0x2E, 0x6C, 0x9C, 0xAA, 0x22, 0x0A, 0x93, 0x6B, + 0x8B, 0x9A, 0xDF, 0xE7, 0xBE, 0xD9, 0x29, 0x02, 0x09, 0x8A, 0x7B, 0x14, + 0xA4, 0x86, 0xF2, 0x50, 0xFC, 0x64, 0xAA, 0x69, 0xC8, 0x8B, 0xB7, 0xA9, + 0x55, 0xFB, 0x1F, 0xD4, 0x35, 0x91, 0xCE, 0x81, 0xBC, 0xC6, 0x54, 0x2A, + 0x86, 0x2F, 0x02, 0x90, 0xB7, 0x01, 0x15, 0x31, 0x69, 0x67, 0x18, 0xA0, + 0x2B, 0x90, 0x3A, 0xA9, 0xA1, 0x38, 0xDD, 0xA7, 0x42, 0x92, 0xE8, 0x71, + 0xCE, 0x32, 0x18, 0x73, 0xCB, 0x1D, 0xC3, 0xA2, 0xF8, 0x1C, 0x6B, 0x60, + 0xED, 0xCA, 0x0F, 0xF6, 0xB5, 0x80, 0x7A, 0x7A, 0x33, 0x6D, 0xD1, 0x6D, + 0xD1, 0x8C, 0xD1, 0x58, 0x3E, 0xA7, 0x7A, 0x95, 0x30, 0x65, 0xBD, 0x07, + 0x15, 0xC1, 0xFC, 0xFF, 0x41, 0x93, 0x5F, 0x7C, 0x7F, 0x30, 0x66, 0x52, + 0x44, 0x16, 0x39, 0x6D, 0x42, 0x9D, 0x0D, 0xF1, 0x72, 0x69, 0x11, 0x53, + 0xC3, 0xA0, 0x9B, 0x89, 0xB6, 0xE4, 0x8C, 0x4B, 0x87, 0x80, 0x9A, 0xB4, + 0x3E, 0x33, 0x8D, 0xAB, 0x81, 0x15, 0x05, 0x19, 0x87, 0xB1, 0xDA, 0x05, + 0x4B, 0x60, 0xBA, 0x1D, 0xE7, 0x3B, 0x7E, 0x42, 0xAB, 0x5A, 0xD0, 0x21, + 0x30, 0xB5, 0x78, 0xB5, 0xC0, 0x8F, 0x83, 0x39, 0x7A, 0x7A, 0xAF, 0x4F, + 0x9B, 0xCC, 0xD9, 0xDA, 0x01, 0x9C, 0xFE, 0xAD, 0xAB, 0xE7, 0xF7, 0x2F, + 0xC1, 0xE6, 0x32, 0xC4, 0x9F, 0xCD, 0x10, 0xF2, 0xA5, 0x0F, 0xDD, 0x54, + 0x98, 0xEA, 0x57, 0x7C, 0x43, 0x39, 0xAA, 0x95, 0x83, 0x7E, 0x1B, 0x34, + 0x3A, 0x29, 0xF7, 0x07, 0xC0, 0x8B, 0xAF, 0x48, 0x71, 0xED, 0xEA, 0x7F, + 0x73, 0xD6, 0x0E, 0x6D, 0x96, 0xC3, 0x0F, 0x9F, 0xA9, 0x5C, 0x98, 0x00, + 0x16, 0xC4, 0xC6, 0x72, 0xEF, 0x00, 0x27, 0x01, 0x31, 0x75, 0x18, 0x28, + 0x75, 0xE5, 0xCB, 0x4D, 0x9E, 0x25, 0xCD, 0x72, 0xD8, 0xAA, 0x1B, 0x0B, + 0x35, 0x6A, 0xDC, 0x0A, 0x11, 0x85, 0x01, 0x7B, 0x94, 0x29, 0xA8, 0x41, + 0x29, 0xD4, 0xCE, 0xBE, 0x7B, 0x14, 0x45, 0x52, 0x56, 0xEB, 0x4E, 0x45, + 0x14, 0x62, 0x87, 0xA4, 0x29, 0x24, 0xF6, 0xF8, 0x70, 0x77, 0x29, 0x6A, + 0xB6, 0x56, 0x46, 0x20, 0x5A, 0x9C, 0x45, 0x3A, 0x54, 0x6B, 0xF8, 0x2B, + 0x4A, 0xCA, 0x8E, 0xBB, 0x97, 0x15, 0xAC, 0x6B, 0x60, 0x34, 0x73, 0x6F, + 0x26, 0xEA, 0x1F, 0x1F, 0x8C, 0x10, 0x40, 0x46, 0x10, 0x09, 0x16, 0x37, + 0x26, 0x86, 0xB1, 0xCF, 0x29, 0x28, 0x9F, 0x14, 0x75, 0x6C, 0xEE, 0x7F, + 0x92, 0xFB, 0x95, 0xD6, 0xFA, 0x8F, 0x13, 0x75, 0x37, 0xA5, 0xCC, 0x8A, + 0x8E, 0xD0, 0x50, 0x9D, 0x80, 0x3B, 0xD8, 0x1E, 0x5A, 0xA4, 0x66, 0xA9, + 0x5D, 0xC7, 0xB2, 0x25, 0x3D, 0xCB, 0x36, 0x82, 0x36, 0x9F, 0xCD, 0x11, + 0x07, 0x6B, 0x94, 0xED, 0x1D, 0xB2, 0x5A, 0xD8, 0x39, 0xEE, 0xC9, 0x5F, + 0x5A, 0xDC, 0x2D, 0xDE, 0x75, 0x9D, 0x3C, 0x6E, 0xA0, 0xD3, 0x61, 0x96, + 0x08, 0x44, 0x37, 0x31, 0x62, 0xDB, 0xC1, 0xEC, 0x72, 0x7A, 0xDF, 0x29, + 0xD7, 0x94, 0x10, 0x42, 0xA0, 0x77, 0xC4, 0x3E, 0xA2, 0x6D, 0x4D, 0x0D, + 0x3F, 0xFA, 0x9A, 0x3B, 0x3D, 0x7D, 0x86, 0xD1, 0x91, 0x96, 0x3F, 0x6C, + 0x9C, 0xEF, 0x83, 0xE7, 0x31, 0xC9, 0xEB, 0x7B, 0xDA, 0x82, 0x7A, 0xAA, + 0xF9, 0xD7, 0xB2, 0x55, 0x39, 0xE8, 0xF4, 0xEC, 0x06, 0xE8, 0x1C, 0x22, + 0x68, 0x18, 0x10, 0x8F, 0xF9, 0x13, 0x0C, 0x0E, 0xEC, 0x26, 0xDB, 0x0D, + 0x03, 0xE1, 0x24, 0xC1, 0x97, 0xDB, 0x13, 0xA1, 0x2C, 0xFC, 0x61, 0x32, + 0xC6, 0x1B, 0xFB, 0x4F, 0x7C, 0x18, 0xD4, 0x85, 0x1E, 0x14, 0xEE, 0x45, + 0x1A, 0x0C, 0xA3, 0xD0, 0x2A, 0x8F, 0x44, 0x10, 0x7F, 0x32, 0xC3, 0x6E, + 0xF9, 0x57, 0x6D, 0x59, 0x49, 0xAA, 0xD0, 0x5D, 0xBA, 0xB7, 0xA5, 0x28, + 0xD3, 0xE9, 0x1E, 0x99, 0xB1, 0x46, 0x4B, 0xF5, 0x8D, 0x4A, 0xE1, 0x11, + 0xAF, 0x9F, 0xBE, 0x3A, 0x21, 0xE1, 0x3F, 0x8F, 0x83, 0xF0, 0x2F, 0x30, + 0xB6, 0x59, 0x4F, 0x03, 0x17, 0xDA, 0x32, 0x7F, 0x01, 0x0F, 0x58, 0xB1, + 0xAC, 0x04, 0xA5, 0xC3, 0x4D, 0x5C, 0x13, 0xFD, 0x14, 0x58, 0x8D, 0xEE, + 0x78, 0x82, 0xBD, 0xD4, 0xFE, 0xA3, 0x7F, 0xDC, 0x78, 0x44, 0x07, 0x3A, + 0x4A, 0x64, 0x31, 0x1A, 0x7F, 0xBD, 0x5E, 0x7D, 0x20, 0x99, 0x3B, 0xE3, + 0x2B, 0x99, 0x89, 0xDA, 0xEA, 0x73, 0x13, 0x5E, 0x53, 0x5C, 0x93, 0x93, + 0xE9, 0x8B, 0xEA, 0x7E, 0xB5, 0xAA, 0xDD, 0xA0, 0x63, 0x0C, 0xB1, 0x2F, + 0x2C, 0xD7, 0xAA, 0x13, 0x51, 0x5D, 0xA8, 0x5C, 0x97, 0x9A, 0x9B, 0xF2, + 0x70, 0x0D, 0xA6, 0x1C, 0x6E, 0xD1, 0xA5, 0xBA, 0xB8, 0x62, 0x78, 0x00, + 0xB1, 0xE5, 0x5D, 0xB5, 0x9F, 0xD0, 0x0C, 0x06, 0x51, 0x9E, 0x41, 0xF0, + 0xE3, 0xBA, 0x46, 0x39, 0x83, 0x39, 0xAF, 0x7A, 0xDF, 0x5C, 0x0E, 0xDB, + 0xE4, 0xEB, 0x4C, 0x0E, 0x99, 0xC3, 0xD7, 0x95, 0x31, 0xBF, 0xDB, 0x2D, + 0xB1, 0x21, 0xA8, 0xDD, 0xB6, 0xB8, 0xAE, 0x08, 0x0A, 0x71, 0x23, 0xF9, + 0xE1, 0x57, 0xAD, 0xB8, 0x19, 0xBA, 0x39, 0xB6, 0x65, 0xAC, 0xC3, 0x42, + 0x6F, 0xB9, 0x4A, 0xD9, 0xB5, 0xB9, 0xA9, 0x1E, 0xE5, 0xA7, 0x3F, 0xE6, + 0x40, 0x63, 0x02, 0x2F, 0xF2, 0x01, 0x0D, 0x07, 0xA1, 0x2F, 0xC3, 0x65, + 0xC0, 0x58, 0x2D, 0x21, 0xBC, 0x4C, 0x6E, 0x51, 0xF4, 0xB0, 0xF4, 0x87, + 0x79, 0xA5, 0x74, 0x08, 0xF7, 0xFB, 0xF6, 0xF9, 0x13, 0x49, 0x11, 0xBC, + 0x36, 0x14, 0x87, 0x20, 0x06, 0x74, 0xBA, 0x1E, 0xCF, 0x92, 0xBC, 0xC3, + 0x26, 0x6D, 0xD9, 0x05, 0xC6, 0x08, 0x91, 0x97, 0x8F, 0x0F, 0xC1, 0x9A, + 0x3A, 0x91, 0x9C, 0x5F, 0xBE, 0x51, 0x9D, 0x01, 0xA4, 0xF3, 0xAA, 0x26, + 0x5E, 0x25, 0xDE, 0xF2, 0x01, 0x6B, 0x84, 0x85, 0x46, 0xBF, 0x8C, 0xCB, + 0xBC, 0x24, 0x39, 0x88, 0xB7, 0x2E, 0x5B, 0xD4, 0x36, 0x12, 0xD4, 0xFD, + 0xAE, 0x81, 0xA3, 0x9E, 0xD6, 0xE8, 0xA2, 0x40, 0xBD, 0x22, 0xBA, 0x0D, + 0x51, 0x8C, 0x67, 0xBC, 0x54, 0x13, 0x3C, 0x1D, 0x05, 0x20, 0xA8, 0x9D, + 0x61, 0x0A, 0x74, 0x73, 0x99, 0x5E, 0xBD, 0xB3, 0x10, 0xD9, 0xC7, 0x7C, + 0x58, 0x24, 0xF5, 0x9F, 0xFA, 0x13, 0x35, 0x83, 0x1A, 0x14, 0x13, 0x7B, + 0x3B, 0xB6, 0xF5, 0x16, 0xB2, 0x75, 0xC2, 0x9E, 0x41, 0x83, 0xC5, 0x68, + 0x8C, 0xDF, 0xFC, 0xC1, 0x2E, 0xAC, 0xFC, 0x08, 0x1C, 0xE5, 0x2D, 0x15, + 0x0D, 0xB8, 0xE2, 0x3F, 0xD7, 0xA1, 0x46, 0x9E, 0xCB, 0x46, 0x4A, 0x4A, + 0x71, 0x88, 0x4E, 0x61, 0x0F, 0x82, 0x34, 0xF0, 0xC5, 0xEA, 0xD0, 0x08, + 0x9A, 0xCF, 0xAE, 0x93, 0xEB, 0x69, 0x06, 0x2D, 0x96, 0x1F, 0x96, 0x70, + 0xDE, 0x1A, 0x87, 0xA0, 0x24, 0x7E, 0x1F, 0x8E, 0x9C, 0xDB, 0x77, 0xC1, + 0x95, 0xDC, 0xDE, 0x9E, 0xE7, 0xEE, 0x85, 0xD9, 0xB4, 0xEC, 0xD5, 0x2A, + 0xDF, 0xF7, 0xCD, 0xA6, 0x2B, 0x81, 0xFA, 0xE6, 0x10, 0xB1, 0x3B, 0x03, + 0x23, 0xE0, 0xBD, 0xA1, 0xA4, 0x7F, 0x89, 0x69, 0x55, 0x78, 0x14, 0xB1, + 0x86, 0x07, 0x6E, 0xB0, 0xB2, 0xB3, 0x96, 0xFD, 0xA0, 0x03, 0x00, 0xC1, + 0xF5, 0x60, 0xAA, 0x62, 0xD4, 0xB2, 0xC7, 0xA3, 0x9E, 0x25, 0xF5, 0xF5, + 0xB3, 0x85, 0x1D, 0xD2, 0x47, 0xDB, 0xF3, 0x1E, 0x70, 0x85, 0xAC, 0x30, + 0x02, 0x87, 0xF4, 0xEB, 0xB8, 0x99, 0xFB, 0x65, 0xAA, 0x56, 0x3F, 0xDC, + 0x5C, 0x52, 0x2C, 0x2A, 0xDE, 0x23, 0xEA, 0xE7, 0xD0, 0x20, 0x9C, 0xF3, + 0x9A, 0xA9, 0x16, 0x4C, 0xCE, 0x29, 0x87, 0x08, 0x52, 0xA4, 0x5D, 0x3A, + 0x4C, 0xC6, 0x2C, 0x13, 0x16, 0x94, 0x3E, 0x14, 0x5B, 0x50, 0x92, 0x34, + 0xC2, 0x64, 0x7A, 0x95, 0x89, 0x5C, 0xCA, 0x82, 0xF8, 0x59, 0x7B, 0x27, + 0xAA, 0x0F, 0x64, 0x45, 0xBB, 0xFA, 0x61, 0x30, 0x30, 0x57, 0x6E, 0x3A, + 0x69, 0x1A, 0x8F, 0x3E, 0xB7, 0x63, 0xCB, 0x86, 0xF6, 0xE2, 0xC6, 0xDF, + 0xFB, 0xE5, 0xB7, 0xEA, 0x3B, 0xF5, 0x28, 0x31, 0x6C, 0x44, 0x54, 0xD3, + 0xEC, 0x37, 0x77, 0xB9, 0xF7, 0x08, 0xF1, 0x05, 0xDA, 0x16, 0xB8, 0x95, + 0x69, 0x5E, 0x84, 0x49, 0x31, 0xC5, 0xEC, 0x06, 0x30, 0x82, 0x52, 0xC2, + 0x46, 0xB2, 0xE3, 0x47, 0xE6, 0x60, 0x12, 0x1C, 0x96, 0xDC, 0xBB, 0x08, + 0x60, 0x4A, 0xC3, 0x01, 0x4D, 0xBC, 0x1A, 0x4E, 0xF8, 0x3C, 0x06, 0x66, + 0xF0, 0x78, 0xB9, 0x6D, 0x04, 0x66, 0x60, 0xDF, 0x7E, 0x5F, 0x2C, 0x07, + 0x2A, 0x5A, 0x4F, 0x13, 0x59, 0x40, 0x26, 0x6F, 0xC6, 0x4A, 0x37, 0xE9, + 0x5E, 0x58, 0x41, 0xEF, 0xCD, 0xCE, 0x89, 0xAD, 0xAB, 0x72, 0xEF, 0x16, + 0x8B, 0x7D, 0x66, 0x1A, 0x98, 0xFC, 0x8B, 0xC2, 0xF7, 0xFD, 0xC3, 0xF9, + 0x51, 0xCF, 0x26, 0x06, 0xC6, 0x28, 0x2C, 0x2E, 0x8D, 0x53, 0xBE, 0xD8, + 0xA7, 0x26, 0xC3, 0xD6, 0xD8, 0x05, 0xCD, 0x19, 0xCC, 0xA3, 0x23, 0x14, + 0x74, 0xC2, 0x97, 0x01, 0x1C, 0x0B, 0x96, 0x22, 0xE2, 0x94, 0x23, 0xD8, + 0xC2, 0x1B, 0xF7, 0x03, 0xB5, 0x1E, 0x35, 0x2C, 0x9A, 0x9B, 0xCC, 0x7A, + 0x1F, 0x04, 0x52, 0x26, 0x69, 0xD7, 0x6A, 0x21, 0xEA, 0xA8, 0x3A, 0x62, + 0x51, 0xA2, 0x02, 0xB2, 0x37, 0x13, 0xC0, 0x57, 0xCC, 0x1D, 0xC4, 0xFF, + 0xE6, 0x90, 0xC1, 0x86, 0x20, 0x5B, 0x03, 0xED, 0x6F, 0x32, 0x77, 0x9A, + 0x86, 0xB1, 0x1C, 0x89, 0xFB, 0x9B, 0x2B, 0xF4, 0x86, 0xE9, 0xB9, 0xF0, + 0x39, 0xF9, 0x85, 0x51, 0x0C, 0x62, 0x95, 0x01, 0x28, 0xD7, 0x6F, 0xB7, + 0xBF, 0xC7, 0x2F, 0x2F, 0xF8, 0xAC, 0x31, 0xD1, 0xF8, 0x5D, 0x37, 0xDC, + 0xBE, 0x98, 0x2D, 0x76, 0xC4, 0x9C, 0x20, 0xDA, 0xB6, 0xF3, 0xC3, 0xC0, + 0x31, 0x14, 0xBF, 0x2B, 0x87, 0x00, 0x66, 0x4A, 0xE2, 0x50, 0x49, 0x84, + 0x1E, 0x97, 0x85, 0xB8, 0xED, 0x33, 0x2B, 0xF8, 0x59, 0xC9, 0x03, 0x3F, + 0x5A, 0x28, 0xA7, 0xB8, 0xFB, 0x9F, 0x2E, 0x44, 0xFA, 0x2E, 0x6D, 0xFF, + 0x40, 0x9E, 0x21, 0xE4, 0x05, 0xB6, 0x31, 0x76, 0xAE, 0xDB, 0x76, 0x96, + 0x88, 0x4D, 0x96, 0xCE, 0x1E, 0xD4, 0x22, 0x91, 0xE4, 0xA8, 0x91, 0x5B, + 0xED, 0xA4, 0x03, 0x10, 0x06, 0x8C, 0x24, 0xE4, 0xC4, 0x80, 0x16, 0x4D, + 0x50, 0xAF, 0xC1, 0x64, 0x4A, 0xA4, 0xB9, 0x79, 0xE3, 0x37, 0x38, 0x7D, + 0x8A, 0x85, 0x90, 0xB7, 0x1C, 0x7D, 0x24, 0x26, 0x7F, 0x5F, 0x0C, 0x9D, + 0xB3, 0x2D, 0x4D, 0xB0, 0xEE, 0xAC, 0x95, 0x8F, 0x2E, 0x5A, 0xA2, 0x78, + 0x7D, 0x0D, 0xDA, 0x99, 0x47, 0x93, 0x13, 0xF9, 0x0C, 0xFF, 0x5E, 0x71, + 0x99, 0x8D, 0xE3, 0x21, 0x03, 0x44, 0xF7, 0x4D, 0x61, 0xD0, 0x1D, 0x47, + 0xCB, 0x3D, 0x57, 0x4D, 0x43, 0x3C, 0x01, 0xBB, 0x33, 0xC2, 0x04, 0x91, + 0x66, 0xC9, 0xA1, 0xF2, 0x18, 0x47, 0x0D, 0x60, 0x61, 0x9F, 0xA7, 0x27, + 0x99, 0xB5, 0x27, 0x88, 0x60, 0x2B, 0x8D, 0x3C, 0x8F, 0xD5, 0x53, 0xDD, + 0x64, 0xC5, 0x14, 0xB3, 0x77, 0x5C, 0xDE, 0xA9, 0x91, 0x2E, 0x23, 0x83, + 0x24, 0xE3, 0xE6, 0x38, 0xC5, 0xCB, 0x9B, 0x4E, 0xC4, 0xEE, 0x3D, 0x7D, + 0x58, 0x6C, 0x60, 0x16, 0x97, 0xBC, 0xF6, 0x47, 0x77, 0x83, 0xCE, 0xF1, + 0xA9, 0x8F, 0xDA, 0xFF, 0xB3, 0xE4, 0x52, 0x50, 0x67, 0xBA, 0x13, 0x2A, + 0xAB, 0xB4, 0x32, 0xC0, 0x4C, 0xAE, 0xBC, 0x92, 0x3C, 0x65, 0x97, 0xA4, + 0xD8, 0x10, 0xDF, 0x60, 0x95, 0xCA, 0x74, 0x17, 0x3F, 0x8A, 0xC5, 0x2A, + 0x9F, 0xAF, 0xDB, 0xA4, 0x3C, 0x77, 0x01, 0xA6, 0x02, 0x66, 0x0C, 0x15, + 0x0F, 0x00, 0x90, 0xBD, 0x9B, 0x77, 0x53, 0xFD, 0x93, 0x44, 0x6F, 0x86, + 0x50, 0x54, 0x11, 0x40, 0xBE, 0x72, 0xD2, 0xE5, 0x4B, 0xA4, 0x13, 0x88, + 0x0D, 0xAA, 0x87, 0xFB, 0xED, 0x6E, 0x66, 0x59, 0xFB, 0xB8, 0xA0, 0xFE, + 0xD1, 0x08, 0x27, 0x07, 0xC4, 0x31, 0x31, 0x8C, 0x6F, 0xE2, 0x0B, 0x23, + 0x95, 0x96, 0xF6, 0x3B, 0xD9, 0xD4, 0xB6, 0x5D, 0x84, 0xC2, 0xC4, 0x23, + 0xE9, 0xF2, 0xB6, 0x96, 0x9E, 0xD0, 0x4A, 0xE2, 0x2D, 0xAB, 0xBB, 0xB0, + 0xAA, 0xEC, 0xFE, 0x67, 0x3A, 0xF9, 0x1A, 0xA8, 0x30, 0xDA, 0x9A, 0x17, + 0xD5, 0x46, 0xCC, 0xBA, 0xF7, 0xDA, 0x8E, 0x54, 0x49, 0x58, 0xBE, 0x9C, + 0x3B, 0x7E, 0x4E, 0xE4, 0x06, 0x8E, 0x32, 0xB4, 0x7A, 0xEA, 0xF8, 0x40, + 0x78, 0xD4, 0x62, 0xBD, 0xAC, 0xA7, 0x9F, 0x0B, 0x27, 0xC4, 0x90, 0xA1, + 0xDF, 0x15, 0x64, 0xBA, 0xEC, 0xCB, 0x69, 0xF7, 0xBF, 0xE6, 0x0D, 0x89, + 0x6E, 0x5D, 0x62, 0x5D, 0xEA, 0x04, 0x37, 0x1B, 0x40, 0x04, 0x37, 0x3B, + 0xD0, 0xC6, 0xE0, 0xFC, 0x63, 0xA6, 0xA1, 0xC8, 0xAB, 0x45, 0xA4, 0xFD, + 0x05, 0xFA, 0x57, 0x01, 0x5F, 0x34, 0x76, 0x0B, 0xCF, 0xB0, 0xD3, 0xFD, + 0xED, 0x66, 0xAC, 0xFB, 0x63, 0x89, 0x53, 0x46, 0x61, 0xFF, 0x22, 0x64, + 0xEB, 0x20, 0x60, 0x02, 0x0B, 0x78, 0xA4, 0xEC, 0xF9, 0x1D, 0x34, 0xAB, + 0x98, 0x33, 0xB7, 0x76, 0x4D, 0xDA, 0x4C, 0x33, 0x57, 0xD6, 0x23, 0x84, + 0x25, 0x76, 0x4A, 0x0B, 0xDD, 0xC5, 0xCD, 0x8B, 0xFF, 0xB8, 0x22, 0x37, + 0x16, 0xAB, 0xCE, 0xDD, 0x92, 0xDB, 0xD1, 0x12, 0xB3, 0x52, 0xD0, 0xE5, + 0x4E, 0xBE, 0x69, 0xA8, 0xDF, 0x2F, 0xAF, 0x22, 0x29, 0xD0, 0x28, 0xD3, + 0x80, 0xA1, 0x39, 0x57, 0x88, 0x17, 0xBA, 0x63, 0x75, 0xD7, 0xB9, 0x05, + 0xBC, 0x4E, 0x60, 0x02, 0xAC, 0x84, 0x96, 0xD9, 0x23, 0x1E, 0xE3, 0xDA, + 0xD6, 0x74, 0xC2, 0xCD, 0xA4, 0x22, 0x65, 0x82, 0x50, 0x10, 0xFE, 0x76, + 0xF5, 0xE7, 0x61, 0x0D, 0x86, 0xD9, 0x8D, 0x56, 0x10, 0x43, 0x9C, 0xFE, + 0x05, 0x3A, 0x51, 0x93, 0x81, 0x74, 0xD2, 0x11, 0x10, 0x82, 0xFC, 0x4C, + 0xA1, 0x83, 0x64, 0x21, 0x4B, 0xEB, 0xA9, 0x8E, 0x9A, 0xB8, 0xAB, 0x95, + 0x15, 0x96, 0x9D, 0x49, 0x9D, 0xFE, 0xEC, 0xC8, 0xC3, 0x6B, 0xBB, 0x4C, + 0x8E, 0x75, 0xBB, 0x8C, 0x42, 0x76, 0x18, 0x8E, 0x6F, 0xE0, 0xD6, 0x7C, + 0x19, 0xDA, 0x08, 0xD7, 0xE1, 0x73, 0x6C, 0x18, 0x1B, 0x90, 0xCF, 0x6E, + 0x18, 0xE4, 0x61, 0xC7, 0x1B, 0xE3, 0x93, 0x22, 0x80, 0xB0, 0xE6, 0x66, + 0xA0, 0xF7, 0x06, 0xA9, 0x1E, 0xD8, 0x62, 0xC5, 0xE3, 0x52, 0x59, 0xF1, + 0x71, 0x2A, 0x3C, 0xC0, 0xBC, 0x37, 0xF4, 0x51, 0x8C, 0x81, 0xB4, 0x65, + 0x95, 0x4A, 0x9D, 0xB5, 0xDF, 0x59, 0x2A, 0x06, 0xA6, 0xB1, 0x05, 0xCE, + 0xF3, 0x24, 0x7A, 0x59, 0x37, 0x76, 0x79, 0xAB, 0x84, 0x23, 0xF9, 0x5C, + 0xFD, 0x48, 0xA3, 0xED, 0x75, 0xB8, 0x58, 0x2F, 0x8A, 0xE7, 0xAD, 0x71, + 0x94, 0x62, 0x27, 0x1C, 0xAC, 0x5F, 0xE3, 0x92, 0x12, 0x6F, 0xAE, 0xAC, + 0x12, 0xDA, 0xA9, 0x02, 0x45, 0xD7, 0x62, 0x53, 0xE0, 0xB8, 0xB9, 0xA8, + 0x02, 0xD7, 0xED, 0xA9, 0x26, 0x8C, 0x8F, 0x82, 0x78, 0x93, 0x8D, 0x1E, + 0x8F, 0x8D, 0xEC, 0x89, 0xBA, 0x37, 0x6A, 0x35, 0x21, 0x61, 0xD9, 0xE1, + 0x52, 0x95, 0x46, 0xD5, 0x3A, 0xDF, 0x8B, 0xBD, 0x9F, 0x36, 0x71, 0x95, + 0x09, 0x28, 0x88, 0xB1, 0xF0, 0x70, 0xC2, 0x01, 0xA1, 0x4E, 0x0A, 0xF8, + 0xF2, 0x25, 0x1C, 0x60, 0x3C, 0xA3, 0xA0, 0xFB, 0x5C, 0x3E, 0xF4, 0x11, + 0xCC, 0x54, 0xDA, 0xD7, 0x80, 0x80, 0xCC, 0xC2, 0xB0, 0x81, 0xDF, 0xC8, + 0x1C, 0x96, 0x01, 0x95, 0x17, 0x4E, 0x01, 0x7E, 0x76, 0xF4, 0x1C, 0x61, + 0x98, 0x58, 0x2A, 0xBD, 0x04, 0x7E, 0x14, 0x8A, 0x88, 0x77, 0xB6, 0xAD, + 0x05, 0x54, 0xC7, 0xDA, 0xDD, 0x08, 0xBA, 0x5C, 0x9F, 0xC8, 0x3C, 0x87, + 0x24, 0xB5, 0xA0, 0x53, 0xC7, 0xBD, 0x92, 0x77, 0x5F, 0xE8, 0x22, 0x34, + 0x27, 0x98, 0x10, 0xD7, 0x4B, 0x76, 0x77, 0x26, 0x2D, 0xD0, 0x24, 0x03, + 0x8E, 0x15, 0x57, 0xF2, 0xC6, 0xED, 0x39, 0xB7, 0xAD, 0xE9, 0xFA, 0x14, + 0xED, 0xCF, 0x50, 0x9E, 0x8D, 0xAC, 0x87, 0x4B, 0x26, 0x28, 0xE4, 0x02, + 0xBE, 0x24, 0x6A, 0x39, 0x17, 0xBE, 0x9B, 0x79, 0xB7, 0x7E, 0xDF, 0xA6, + 0x6E, 0x7B, 0x52, 0xE6, 0x1C, 0xD2, 0xAD, 0xCE, 0x30, 0xB9, 0x91, 0xE7, + 0x64, 0x8B, 0xBD, 0x1E, 0x8E, 0x40, 0xE3, 0x69, 0xA6, 0xD4, 0xB2, 0x18, + 0x42, 0x53, 0x6C, 0xE6, 0x1C, 0x69, 0xF9, 0x26, 0x84, 0x4E, 0x6F, 0x16, + 0xD5, 0x39, 0xB5, 0x4C, 0x86, 0xC9, 0x0D, 0x07, 0x6D, 0x25, 0x61, 0x9E, + 0x7D, 0xDA, 0xB7, 0x13, 0x73, 0x7B, 0xC6, 0xF9, 0xF8, 0x25, 0x9D, 0x44, + 0xA6, 0x70, 0xFE, 0x5F, 0xC0, 0xFA, 0x64, 0xEE, 0x85, 0x6D, 0xA5, 0x0C, + 0x28, 0x68, 0x8C, 0x17, 0xCE, 0x3E, 0x38, 0x86, 0x83, 0x24, 0x97, 0xA3, + 0xC2, 0x54, 0xF9, 0x3C, 0xE7, 0x3A, 0xE8, 0xBC, 0x6D, 0xB8, 0x17, 0x7D, + 0xF0, 0x6C, 0xEF, 0xFB, 0xBB, 0xC9, 0xD7, 0x5B, 0xBF, 0xBB, 0x99, 0x83, + 0x94, 0x29, 0xE9, 0x9F, 0xFC, 0x6D, 0xD7, 0xA8, 0x6C, 0x62, 0x42, 0x18, + 0x95, 0x2D, 0x44, 0xFF, 0xB4, 0x48, 0x30, 0x88, 0x29, 0x25, 0x41, 0x83, + 0x0F, 0xAE, 0x9D, 0xE3, 0xEC, 0xB2, 0x18, 0x0F, 0xBF, 0x4F, 0x11, 0x1F, + 0xDA, 0xF2, 0xEC, 0x54, 0xE3, 0xCF, 0xE9, 0xAD, 0x4A, 0x7E, 0xF0, 0xDE, + 0xD4, 0x65, 0x21, 0x6F, 0x3A, 0xA8, 0x2E, 0xD5, 0x02, 0x39, 0x11, 0x4C, + 0xA5, 0x0A, 0xF1, 0xE4, 0x04, 0xFE, 0xC7, 0xFA, 0xE2, 0x2B, 0x74, 0xD3, + 0xBD, 0xB2, 0x8D, 0xAB, 0x18, 0x6B, 0x22, 0x3B, 0x79, 0x67, 0x88, 0x0F, + 0x05, 0xB2, 0xA5, 0x26, 0x9B, 0x5A, 0x4E, 0x96, 0xBE, 0xE4, 0x60, 0x9F, + 0xD5, 0x8C, 0x0F, 0x81, 0x12, 0xEE, 0x5E, 0xAA, 0x63, 0x10, 0x0C, 0x87, + 0x42, 0x73, 0xA7, 0x16, 0x97, 0x7D, 0x8A, 0x3E, 0x6C, 0xAC, 0xB8, 0xAF, + 0x70, 0xC2, 0xCA, 0x95, 0xD5, 0x01, 0x9A, 0x3B, 0xB0, 0x36, 0xBF, 0xEE, + 0xF9, 0x7D, 0x0B, 0xA1, 0x21, 0xA6, 0x6D, 0x85, 0x12, 0xB1, 0xCF, 0x14, + 0xE8, 0xCC, 0xFC, 0xC3, 0xA2, 0x1A, 0x09, 0x28, 0x48, 0xEB, 0xA8, 0xB2, + 0x8B, 0x4D, 0x17, 0xCD, 0x5C, 0x47, 0x70, 0xB9, 0x82, 0xB0, 0xFF, 0xEA, + 0xE8, 0x3F, 0x64, 0xDB, 0x9A, 0x0E, 0xFC, 0xED, 0x1D, 0xD2, 0xDE, 0x03, + 0x92, 0x91, 0x17, 0xF1, 0x6F, 0x38, 0x14, 0xEC, 0x79, 0x14, 0xCF, 0xA0, + 0x2B, 0x63, 0x65, 0x84, 0x28, 0xD3, 0xB8, 0x77, 0x4C, 0x0B, 0x55, 0x4D, + 0xF5, 0x89, 0xEF, 0xE7, 0x41, 0xC1, 0x5F, 0x18, 0xAE, 0x06, 0x7F, 0xA9, + 0x37, 0x84, 0x34, 0x6F, 0x7C, 0xC3, 0x9B, 0x96, 0x68, 0x88, 0x91, 0x99, + 0x35, 0x2B, 0xFF, 0x62, 0xD8, 0xC5, 0xE0, 0x4D, 0x40, 0x79, 0x1D, 0x18, + 0x30, 0x58, 0x4B, 0xF9, 0x48, 0xA7, 0x27, 0x02, 0xF5, 0x67, 0xB3, 0x17, + 0x4C, 0x22, 0x46, 0x2B, 0x39, 0x20, 0x79, 0x22, 0xE9, 0x25, 0x13, 0x1D, + 0x28, 0x20, 0x3E, 0xDA, 0x49, 0x53, 0xA6, 0x3D, 0x7F, 0x70, 0x7B, 0xA6, + 0x75, 0xA9, 0x45, 0xEB, 0x3B, 0x8F, 0xFE, 0x36, 0xAD, 0xBA, 0xBE, 0x5B, + 0x5A, 0x5B, 0x9E, 0x2A, 0xEA, 0x28, 0xFE, 0xD5, 0x2D, 0x4A, 0x89, 0x7B, + 0x6C, 0xBE, 0xF6, 0xEF, 0x19, 0xCD, 0xA1, 0x90, 0xD1, 0x44, 0x10, 0x58, + 0x58, 0xD8, 0x39, 0x53, 0x13, 0xA9, 0xBF, 0x02, 0xBC, 0x7A, 0xD3, 0xBC, + 0xD1, 0x61, 0xA4, 0xCC, 0x64, 0x0C, 0xF3, 0x51, 0x7C, 0x8B, 0x03, 0x67, + 0xBC, 0xA4, 0x0C, 0x20, 0x5C, 0xD5, 0xF1, 0xCA, 0xF3, 0x7B, 0x93, 0x5D, + 0x1D, 0x5B, 0x2C, 0xF2, 0x92, 0x3D, 0xF5, 0x0B, 0x90, 0x4C, 0x0C, 0xB6, + 0x1C, 0x4D, 0x8D, 0x15, 0x9C, 0x9B, 0x46, 0xDC, 0xC0, 0x7D, 0x01, 0x92, + 0x2B, 0x7D, 0xED, 0xCA, 0x27, 0xF3, 0xA2, 0x0F, 0x46, 0x62, 0x09, 0xEA, + 0x4B, 0xB1, 0x70, 0x6C, 0x24, 0x96, 0x93, 0xFB, 0xA5, 0x95, 0xD6, 0xF6, + 0xDD, 0x04, 0x39, 0x05, 0x58, 0x5C, 0xAC, 0xE2, 0x12, 0xAC, 0x9C, 0x7F, + 0x69, 0xBB, 0x0D, 0xD1, 0xD8, 0xE7, 0x26, 0x6D, 0x32, 0xCF, 0xB7, 0x12, + 0xC5, 0x21, 0x49, 0x64, 0xCC, 0x31, 0x72, 0x33, 0x8E, 0x2F, 0xC5, 0x9F, + 0x4C, 0x92, 0x5E, 0xDB, 0x03, 0x8F, 0x1F, 0x2A, 0xBB, 0xA6, 0x9C, 0xA0, + 0x1F, 0xC2, 0x89, 0xB1, 0xA6, 0x70, 0x32, 0x17, 0x74, 0x35, 0x14, 0xE2, + 0xF8, 0x83, 0x9D, 0x1E, 0x04, 0xD7, 0x05, 0x34, 0x8E, 0xAE, 0xA8, 0x0A, + 0x34, 0x74, 0xA7, 0x42, 0x1B, 0x1F, 0x90, 0x31, 0xA7, 0x9A, 0xFA, 0xC7, + 0xD3, 0x6C, 0x45, 0xBA, 0x49, 0x3C, 0x4E, 0xBA, 0x85, 0xFC, 0x0B, 0x8A, + 0x89, 0xEF, 0x6A, 0xD2, 0x88, 0xF1, 0xA9, 0xA4, 0x55, 0x54, 0xA0, 0x38, + 0x4D, 0xEC, 0x1B, 0x9D, 0x70, 0x7F, 0x98, 0x9E, 0xE0, 0x7E, 0xC0, 0x4F, + 0xD3, 0xA5, 0xC5, 0x78, 0x86, 0xDD, 0x92, 0xB5, 0x8A, 0xA5, 0xFB, 0x75, + 0x64, 0x06, 0x66, 0xAF, 0x06, 0xF2, 0xEF, 0x7C, 0x82, 0x61, 0xE3, 0x81, + 0x64, 0xBC, 0x53, 0x03, 0x8B, 0x62, 0x61, 0xE7, 0xFD, 0x75, 0x3A, 0x63, + 0x9C, 0x03, 0x84, 0x00, 0xA0, 0x90, 0x27, 0xAA, 0xF3, 0xA7, 0xF8, 0xB4, + 0xB5, 0xF5, 0xC7, 0x22, 0xDE, 0x35, 0x95, 0x3A, 0x35, 0xE6, 0x6D, 0x89, + 0x58, 0x0D, 0xBC, 0xC2, 0xC6, 0x97, 0xB1, 0xD4, 0xA6, 0xF0, 0x65, 0x66, + 0x7F, 0x19, 0xAF, 0x50, 0x88, 0xB9, 0x58, 0x8C, 0xC2, 0xED, 0x6E, 0x4A, + 0xF8, 0xB3, 0xC7, 0x06, 0x1A, 0xCF, 0x92, 0xC4, 0x98, 0x43, 0x27, 0x0D, + 0xA2, 0x01, 0x5B, 0x85, 0x98, 0x8C, 0x9C, 0x5E, 0x82, 0x19, 0xA8, 0x4E, + 0xA8, 0x60, 0xB1, 0xEE, 0x14, 0x73, 0xC7, 0x70, 0xA9, 0x6E, 0x2A, 0x39, + 0x4F, 0xF6, 0x4C, 0x77, 0x1F, 0xB3, 0x7A, 0x4B, 0xAB, 0xA8, 0x14, 0x8D, + 0xF2, 0xC5, 0xBC, 0xE2, 0xF1, 0x7E, 0xB8, 0xC3, 0x6B, 0xA2, 0xF5, 0x61, + 0x79, 0x93, 0x98, 0xBB, 0x13, 0x5F, 0x7F, 0x62, 0xAE, 0x74, 0xC6, 0xF8, + 0x23, 0x4F, 0xA6, 0x41, 0x0D, 0x23, 0xF6, 0x3F, 0xF5, 0x23, 0xD9, 0xE4, + 0xCC, 0x87, 0xA5, 0x3E, 0xF8, 0xCC, 0xBC, 0x4F, 0x8F, 0xC8, 0x5C, 0xC8, + 0x7D, 0xC1, 0xC4, 0x23, 0x66, 0x62, 0xA5, 0x75, 0xC7, 0x44, 0x15, 0x84, + 0xC3, 0xFC, 0x16, 0x81, 0x7F, 0xE5, 0x0C, 0xDA, 0xAC, 0xD8, 0x53, 0x71, + 0x5D, 0xBE, 0x91, 0xB8, 0xFC, 0x3B, 0x8F, 0x88, 0x2D, 0x67, 0xA4, 0x1D, + 0x9F, 0xFB, 0x12, 0xD7, 0x1D, 0xF0, 0x6C, 0x2F, 0x2D, 0xA3, 0x36, 0x97, + 0x1A, 0xA5, 0x5D, 0xE7, 0x18, 0x21, 0x31, 0xFB, 0xAB, 0x1E, 0x75, 0x41, + 0x70, 0x4C, 0xC4, 0xBB, 0x01, 0x7B, 0x72, 0x51, 0xAE, 0x0B, 0xB3, 0x59, + 0x6D, 0xA4, 0x1F, 0xCB, 0x69, 0x7C, 0x72, 0x28, 0xF6, 0x85, 0xC2, 0xA1, + 0x88, 0x4A, 0x82, 0xEA, 0xCF, 0xBA, 0x87, 0xB7, 0x13, 0x5B, 0xD0, 0xFC, + 0x5E, 0x77, 0x4F, 0x3D, 0x92, 0x9E, 0x3F, 0xB0, 0xE0, 0xDC, 0x9B, 0xB8, + 0x67, 0x13, 0xCE, 0x5D, 0x2F, 0xE8, 0x96, 0xF6, 0x18, 0x24, 0x52, 0x87, + 0x6E, 0x46, 0x51, 0x80, 0x37, 0x56, 0xE2, 0xE2, 0x3D, 0x33, 0x82, 0x31, + 0xEF, 0x0E, 0xA2, 0xB2, 0x56, 0xF9, 0x3F, 0xBA, 0x22, 0x26, 0x96, 0x3E, + 0x3D, 0xE6, 0x35, 0x8E, 0x24, 0x19, 0x7D, 0x0E, 0x0B, 0x10, 0x4C, 0xFE, + 0x74, 0x59, 0x32, 0x9C, 0x65, 0xA7, 0xB1, 0xEF, 0x08, 0xF8, 0x07, 0x1C, + 0x11, 0x52, 0xC0, 0x8F, 0xE3, 0x93, 0x9E, 0x53, 0x23, 0x13, 0xA6, 0x3E, + 0xB3, 0xB1, 0x20, 0x24, 0xB6, 0xE1, 0x22, 0xD1, 0xED, 0x36, 0xD3, 0x5C, + 0x18, 0xC4, 0xE4, 0x09, 0x7F, 0x60, 0x45, 0x9D, 0xCE, 0xAE, 0xDF, 0xE2, + 0xD4, 0xC6, 0xBA, 0x53, 0x6B, 0x97, 0xAD, 0x2B, 0x60, 0x54, 0x60, 0x22, + 0x3C, 0x4C, 0x25, 0x2C, 0x87, 0xF9, 0x64, 0x51, 0x60, 0x2E, 0xE1, 0x90, + 0xAE, 0xCC, 0x70, 0xC1, 0xCA, 0x62, 0x07, 0xEF, 0x63, 0x40, 0x80, 0x7B, + 0xC2, 0x35, 0x56, 0xC6, 0xB8, 0x12, 0x0E, 0x34, 0xF4, 0x54, 0x28, 0x53, + 0x52, 0xD4, 0x4F, 0x0F, 0x98, 0x78, 0x74, 0x9A, 0x4A, 0x1E, 0x77, 0x31, + 0x4D, 0xAB, 0x7D, 0xDD, 0x07, 0x4E, 0x57, 0x24, 0xAE, 0x3F, 0xF1, 0x30, + 0x19, 0xA8, 0x2E, 0x66, 0xB1, 0x4D, 0x30, 0x5B, 0x28, 0xB4, 0x9F, 0x48, + 0xFF, 0x59, 0x19, 0xED, 0xA1, 0x47, 0x5F, 0xBF, 0xC0, 0x6C, 0x50, 0xCA, + 0x7C, 0xF3, 0x01, 0x40, 0xAE, 0xD2, 0x06, 0x29, 0x68, 0xAF, 0xDA, 0xD5, + 0x42, 0x5B, 0x75, 0xA3, 0xD0, 0xC1, 0x95, 0x6D, 0xB5, 0xB5, 0x1C, 0x63, + 0x7D, 0x3F, 0x8F, 0x37, 0x84, 0x67, 0x69, 0xF9, 0xF4, 0x17, 0x03, 0xAB, + 0xD8, 0x79, 0x0B, 0x8F, 0xB8, 0x78, 0x6C, 0x7B, 0xE6, 0x43, 0xA4, 0x87, + 0x39, 0x3E, 0x57, 0xC6, 0x69, 0x13, 0x41, 0x8A, 0x14, 0x53, 0xBD, 0x1B, + 0x44, 0x51, 0x96, 0x87, 0x4A, 0xEB, 0xD4, 0xCB, 0xE1, 0x65, 0x4A, 0x2F, + 0xF6, 0xAC, 0x8A, 0x58, 0x94, 0x87, 0xC0, 0xB8, 0x19, 0x7F, 0x88, 0xC2, + 0xDE, 0x9A, 0x8E, 0x57, 0xD7, 0xD5, 0xDB, 0x92, 0x8C, 0x16, 0xB7, 0x85, + 0x93, 0xE1, 0x7E, 0x16, 0x80, 0x23, 0x2B, 0x5C, 0x83, 0x63, 0xB0, 0xDD, + 0x82, 0xDB, 0x21, 0x17, 0x22, 0x51, 0x35, 0xE3, 0x22, 0x36, 0x2B, 0xDA, + 0x5E, 0xE5, 0x48, 0xEA, 0xC5, 0x23, 0x05, 0x8E, 0xD1, 0xFF, 0xE6, 0x81, + 0xC5, 0x0B, 0xE1, 0x06, 0x0E, 0xD0, 0x2C, 0xA6, 0x43, 0xF3, 0x89, 0x5A, + 0x67, 0xBD, 0x33, 0xE6, 0xC8, 0x5E, 0xAC, 0x83, 0xB5, 0xDC, 0x0E, 0x98, + 0xAB, 0x32, 0x5A, 0x25, 0xFD, 0xE4, 0x77, 0x48, 0x11, 0xE6, 0x81, 0x22, + 0x26, 0x2C, 0x95, 0x3E, 0xDB, 0x5E, 0x74, 0x6C, 0x5E, 0x3B, 0x58, 0x09, + 0x89, 0x3F, 0x4A, 0xB8, 0xAF, 0x53, 0xE2, 0x45, 0x3B, 0x63, 0xB5, 0xEE, + 0x15, 0xDF, 0x0B, 0x3E, 0x29, 0xF1, 0xAF, 0x54, 0x69, 0xB2, 0x89, 0xF3, + 0x42, 0x92, 0x14, 0xF0, 0xC0, 0xC5, 0x25, 0x7F, 0xDF, 0x42, 0xDE, 0xC1, + 0x29, 0x60, 0x1A, 0x62, 0xFB, 0x0C, 0xF8, 0xC6, 0x57, 0x8B, 0x1E, 0x82, + 0x06, 0x35, 0xA9, 0x06, 0x41, 0xAC, 0x76, 0x7E, 0x8C, 0x84, 0xE2, 0xF9, + 0x18, 0x69, 0xC4, 0xD2, 0xB7, 0xB1, 0xBE, 0xDB, 0x83, 0x92, 0xA8, 0x7F, + 0x32, 0xC7, 0xF4, 0x08, 0xE0, 0x26, 0xBE, 0x2D, 0x6B, 0x76, 0x9D, 0x68, + 0xE3, 0x4B, 0xC9, 0x1A, 0x0A, 0xE4, 0x77, 0x19, 0xB8, 0xB2, 0xBE, 0x46, + 0x2A, 0x3C, 0x76, 0xB7, 0x54, 0x6F, 0x41, 0x59, 0x21, 0x7A, 0xA6, 0x44, + 0xCE, 0x74, 0xA9, 0xD4, 0x13, 0x47, 0xD1, 0x55, 0xA0, 0xF0, 0x85, 0x20, + 0x80, 0xDF, 0x4E, 0x7D, 0xF4, 0xB2, 0xBE, 0x75, 0x9A, 0xA2, 0x10, 0xC2, + 0xFD, 0xB1, 0xB9, 0x8E, 0x14, 0x80, 0xB6, 0x5B, 0x8A, 0x6A, 0x81, 0x37, + 0x8C, 0x03, 0x51, 0x85, 0x25, 0xD7, 0x85, 0x6A, 0xC8, 0x0A, 0x1F, 0x24, + 0xB6, 0x2C, 0xB0, 0x1A, 0x20, 0x23, 0xCB, 0xB5, 0xF8, 0x19, 0x88, 0x63, + 0x67, 0xB7, 0xCD, 0x5B, 0x4F, 0x3C, 0xAA, 0xE6, 0x90, 0xCC, 0x6A, 0xDD, + 0xE0, 0x51, 0x29, 0x22, 0xFF, 0x17, 0x53, 0x62, 0x40, 0xF4, 0xB6, 0x5F, + 0x55, 0x65, 0x67, 0x79, 0x5B, 0x98, 0xA3, 0x58, 0x35, 0xB2, 0x21, 0xDB, + 0x0C, 0x6C, 0x20, 0x07, 0x3A, 0x58, 0xE5, 0x96, 0x7F, 0xB9, 0x1F, 0x31, + 0x7A, 0x8A, 0x64, 0xA8, 0x06, 0xAA, 0x56, 0x55, 0x2D, 0x0B, 0x8B, 0x71, + 0x78, 0x8B, 0x9F, 0xC1, 0x12, 0x54, 0x00, 0x5E, 0x2E, 0x76, 0x98, 0x99, + 0x77, 0xE3, 0x4D, 0x08, 0x47, 0xC2, 0xF1, 0xFB, 0xF9, 0xE1, 0x8D, 0x40, + 0x71, 0x67, 0xF9, 0x15, 0x34, 0xED, 0x10, 0x63, 0x63, 0xA2, 0x2A, 0x59, + 0x0B, 0x3E, 0xA2, 0xB6, 0xC2, 0x03, 0x19, 0x8B, 0x7C, 0x76, 0x17, 0xEF, + 0x6B, 0xE3, 0x1F, 0xBF, 0x32, 0xDC, 0xF4, 0x2E, 0x69, 0x15, 0x54, 0x40, + 0x78, 0x97, 0x13, 0x2D, 0xB5, 0x7D, 0x18, 0x91, 0x40, 0x84, 0x8F, 0x92, + 0x44, 0x32, 0x42, 0x9F, 0xD1, 0x2D, 0xEA, 0x82, 0x48, 0x39, 0x49, 0x19, + 0x07, 0xC6, 0x32, 0x9F, 0xD5, 0x87, 0x80, 0x92, 0x78, 0xDA, 0x9A, 0x93, + 0x90, 0x71, 0xDD, 0xC4, 0x6D, 0xC3, 0x74, 0xA6, 0xC9, 0x88, 0x98, 0xFF, + 0x8A, 0x81, 0x50, 0xAC, 0x73, 0x49, 0x0A, 0x75, 0x27, 0x02, 0xAF, 0x81, + 0xB8, 0xAD, 0x83, 0xA9, 0x08, 0x29, 0xF0, 0x78, 0x4A, 0x32, 0xDB, 0x10, + 0xA4, 0x5E, 0xFA, 0x3B, 0x49, 0xBD, 0xA5, 0xE1, 0xE6, 0x0B, 0xDB, 0x6F, + 0x31, 0x18, 0xDC, 0xA7, 0x63, 0xD0, 0xBA, 0xC7, 0xA3, 0x0A, 0x88, 0x76, + 0xA8, 0x6C, 0x4B, 0xBE, 0x3A, 0xD6, 0x81, 0x20, 0xEF, 0xD4, 0x36, 0x4C, + 0x2E, 0xBD, 0x22, 0x56, 0x5E, 0xE9, 0xBB, 0x25, 0x75, 0x54, 0x33, 0xF6, + 0x1B, 0x7F, 0xD8, 0x95, 0x49, 0x9B, 0xB1, 0x30, 0x3E, 0x6F, 0x17, 0x91, + 0x42, 0x82, 0x42, 0x81, 0x16, 0x56, 0xCF, 0x2D, 0xC2, 0x34, 0x6C, 0x38, + 0xA0, 0x42, 0x14, 0x7A, 0x13, 0x9D, 0x38, 0xC1, 0x6D, 0x3A, 0x3D, 0x0E, + 0x24, 0x2C, 0x23, 0xE3, 0xBC, 0x36, 0x2A, 0x97, 0x05, 0x9E, 0x31, 0x9A, + 0xF2, 0x88, 0x84, 0xA2, 0x28, 0xB8, 0xB3, 0x40, 0x3E, 0xE8, 0x5F, 0x44, + 0x32, 0x7E, 0xD7, 0x64, 0xFE, 0x37, 0x51, 0x32, 0xD1, 0x59, 0x4E, 0xB8, + 0x98, 0xC4, 0x87, 0x50, 0xB0, 0x0C, 0xAD, 0xE8, 0x98, 0x20, 0xA2, 0xAA, + 0xFC, 0x94, 0xCF, 0x87, 0xFB, 0x60, 0xDB, 0xBF, 0x93, 0x7E, 0xBD, 0x5F, + 0x13, 0x6C, 0xC9, 0x06, 0x34, 0xD5, 0x8A, 0xED, 0x5D, 0xAC, 0x77, 0xC9, + 0x84, 0xD5, 0x05, 0x61, 0x71, 0x4E, 0x69, 0xE1, 0xC6, 0xFD, 0x12, 0x3F, + 0x37, 0x3F, 0xEE, 0x1D, 0x93, 0x6E, 0xF3, 0x32, 0x18, 0x26, 0x87, 0x2A, + 0x7C, 0x0F, 0x75, 0x1A, 0x06, 0x61, 0x76, 0x22, 0x18, 0x39, 0x24, 0x49, + 0xA7, 0xF7, 0x81, 0x51, 0x1E, 0x8F, 0x86, 0x76, 0xE3, 0xF2, 0xF0, 0xCF, + 0x8B, 0xB1, 0x5E, 0xFA, 0xA7, 0xF3, 0x0F, 0x63, 0x6B, 0x4D, 0x0B, 0x71, + 0x3A, 0xAB, 0x60, 0x76, 0x01, 0xA5, 0x28, 0x4D, 0xB4, 0xBF, 0xDB, 0x8E, + 0x2B, 0xE1, 0xD6, 0xE6, 0xC8, 0x8F, 0xE6, 0x79, 0xD6, 0x19, 0xD9, 0x3A, + 0x6F, 0x0C, 0xDC, 0xC0, 0x31, 0x61, 0x70, 0x21, 0xE4, 0xFA, 0x43, 0x43, + 0x03, 0xFC, 0x88, 0xA8, 0x77, 0xCA, 0xE6, 0x79, 0x59, 0x84, 0x5D, 0x2B, + 0x0A, 0xB7, 0x13, 0x1B, 0x2C, 0xEC, 0xDD, 0x8A, 0x26, 0xE9, 0xB3, 0x69, + 0x4F, 0x72, 0xCB, 0x82, 0x2E, 0x54, 0x00, 0xD1, 0x19, 0xA5, 0x0F, 0xB2, + 0x5F, 0xCA, 0x3C, 0xB6, 0x5F, 0x8B, 0xC8, 0xD4, 0x21, 0xCF, 0x26, 0x83, + 0x5A, 0xD2, 0xCA, 0xFF, 0x26, 0x46, 0x5E, 0xE8, 0x2C, 0x0F, 0xA7, 0xBA, + 0x8E, 0xCD, 0xBB, 0xB0, 0x70, 0x78, 0xA2, 0xF4, 0x8F, 0x9D, 0x0F, 0x23, + 0x29, 0xF4, 0xBC, 0xFC, 0x54, 0x22, 0x00, 0x7B, 0x88, 0x0F, 0x87, 0x08, + 0xF2, 0x37, 0x3E, 0x07, 0x4E, 0xEF, 0xF3, 0x4F, 0x96, 0x7B, 0xB3, 0xA4, + 0x1D, 0x45, 0x3D, 0x88, 0x5D, 0xC2, 0xA8, 0xFA, 0x71, 0xBE, 0xA6, 0x1F, + 0x7E, 0x77, 0xD5, 0x48, 0x23, 0x73, 0x1C, 0x62, 0xF5, 0x98, 0x8E, 0xB7, + 0x67, 0xB1, 0xC8, 0xFA, 0xD7, 0xCB, 0x08, 0x0A, 0x64, 0x57, 0x93, 0x7E, + 0x8E, 0xF2, 0x20, 0xAA, 0xB5, 0x06, 0x8D, 0x12, 0xE2, 0xB8, 0x4D, 0xFC, + 0xC8, 0x23, 0xAB, 0x61, 0x05, 0xE4, 0x46, 0x87, 0x15, 0x25, 0x23, 0x43, + 0x15, 0x32, 0x63, 0x9E, 0x79, 0xFA, 0xBE, 0x10, 0x2B, 0xA3, 0x49, 0xA0, + 0x80, 0xB0, 0x3F, 0x50, 0x68, 0xF5, 0xC0, 0x7C, 0x55, 0xA2, 0x58, 0x92, + 0xD4, 0xF3, 0xA0, 0xEE, 0x83, 0x33, 0x71, 0xE6, 0xAB, 0x77, 0x44, 0x25, + 0x5D, 0xBF, 0x57, 0x91, 0x25, 0x14, 0x0C, 0x5D, 0x07, 0xA0, 0x8F, 0x82, + 0x9C, 0xA8, 0x33, 0x05, 0x25, 0x5F, 0x6B, 0x20, 0xB1, 0x92, 0xDC, 0x4E, + 0xDA, 0x6D, 0xC4, 0x85, 0xE7, 0xDE, 0x00, 0xAD, 0x0E, 0x45, 0x9A, 0x3E, + 0xBF, 0x1E, 0x7B, 0xF1, 0x94, 0x11, 0x77, 0xCE, 0xE2, 0xF0, 0x7B, 0x9A, + 0x85, 0x46, 0x98, 0x27, 0x44, 0xCC, 0xC7, 0x3F, 0x2D, 0x6F, 0xE2, 0xD3, + 0xDF, 0x6E, 0x6D, 0x74, 0xFD, 0xC0, 0xEF, 0x8C, 0xA3, 0x71, 0xEA, 0xA4, + 0x56, 0x59, 0x57, 0x23, 0x78, 0x87, 0x16, 0x8C, 0x1E, 0x63, 0x9C, 0xE2, + 0xA7, 0x28, 0x2A, 0x64, 0xC0, 0x97, 0x34, 0xB0, 0xD5, 0x78, 0x4C, 0xC3, + 0xB2, 0x5D, 0x9B, 0x89, 0x3F, 0xD3, 0x7E, 0xD2, 0x8A, 0x78, 0x8C, 0x1A, + 0x82, 0xB2, 0xA5, 0xFD, 0x37, 0xE6, 0x64, 0x32, 0xF0, 0xC9, 0xDE, 0xAF, + 0xA6, 0xBD, 0xB9, 0xDD, 0xE1, 0xF6, 0x2D, 0xC1, 0x17, 0x15, 0xF1, 0x73, + 0xA4, 0x4C, 0x65, 0x11, 0x92, 0xDC, 0x61, 0xFD, 0x0C, 0x60, 0x49, 0x43, + 0x54, 0xAC, 0xC9, 0xD7, 0xD5, 0x85, 0x09, 0xD4, 0x57, 0x74, 0x18, 0xD6, + 0x53, 0xEB, 0x26, 0xAE, 0x13, 0xCE, 0x0C, 0x6F, 0x7C, 0x11, 0x90, 0x02, + 0xB9, 0x46, 0xB8, 0xEC, 0x25, 0x31, 0xE2, 0xBA, 0xD4, 0xE4, 0x19, 0x1F, + 0xF8, 0xB9, 0x6D, 0xA6, 0x7A, 0xE8, 0x03, 0x9A, 0x94, 0x9F, 0x26, 0x3B, + 0xE0, 0x1A, 0x32, 0xAD, 0x73, 0x3C, 0xB7, 0xE4, 0x32, 0x6F, 0x51, 0x3B, + 0x3D, 0x83, 0x86, 0xD7, 0x62, 0x6D, 0xF8, 0xDF, 0x5C, 0xB2, 0x59, 0x92, + 0xAE, 0x52, 0xA7, 0xFE, 0xA9, 0x9B, 0x0F, 0xD8, 0x5C, 0xCA, 0x50, 0xC3, + 0xD7, 0x7C, 0x8E, 0x80, 0x1E, 0xCE, 0xC9, 0x8E, 0x6B, 0x7A, 0x4F, 0x1B, + 0x3A, 0x1E, 0x91, 0x18, 0x4C, 0x01, 0x50, 0x47, 0x54, 0x65, 0xF2, 0x72, + 0xA1, 0x83, 0xE2, 0x86, 0x9B, 0x93, 0x07, 0x75, 0xE4, 0x33, 0x47, 0xB5, + 0xBD, 0x42, 0xB2, 0x30, 0x6B, 0x69, 0x1F, 0xE9, 0xB3, 0x58, 0x91, 0x95, + 0x7B, 0xED, 0xC3, 0xF2, 0x46, 0x28, 0xB5, 0x18, 0x21, 0x27, 0x57, 0xF2, + 0x39, 0xE6, 0x8A, 0x28, 0xA7, 0x7D, 0xFB, 0x01, 0xF2, 0x7B, 0x56, 0x5A, + 0xC4, 0x85, 0x5A, 0x41, 0x96, 0xF7, 0xF7, 0xC5, 0x91, 0xA4, 0x89, 0x9A, + 0x09, 0x91, 0xBB, 0xE9, 0x29, 0x92, 0x7F, 0xE6, 0x5B, 0x94, 0x8E, 0x93, + 0x43, 0x90, 0x53, 0x0F, 0x10, 0xD7, 0x7E, 0x04, 0x28, 0xB7, 0xF7, 0x14, + 0xB3, 0x42, 0x5E, 0xDF, 0xB5, 0xAA, 0xE4, 0xF7, 0xED, 0x98, 0x43, 0xC6, + 0x8C, 0xFA, 0x7C, 0xB0, 0x71, 0xB1, 0xE9, 0x64, 0x65, 0xBB, 0x58, 0xCC, + 0x73, 0x5F, 0x6A, 0x5A, 0x86, 0x2D, 0x2E, 0x89, 0xB4, 0x5A, 0xFE, 0x16, + 0x5B, 0x64, 0x56, 0x27, 0x38, 0xC2, 0x1D, 0x1C, 0xF0, 0xC5, 0x0B, 0x80, + 0x8D, 0x6F, 0x2E, 0x0C, 0x7B, 0x56, 0xEF, 0x23, 0xE5, 0xFC, 0xD2, 0x55, + 0xF6, 0x9C, 0xF7, 0x5F, 0xB5, 0xEC, 0xB7, 0xEE, 0xC4, 0xEC, 0xFE, 0xD6, + 0xAA, 0xEC, 0x24, 0xB8, 0xB7, 0x98, 0x8D, 0x0B, 0x12, 0x36, 0xAC, 0x5B, + 0x3E, 0x87, 0x29, 0x21, 0x9C, 0xFD, 0x84, 0xFD, 0xF5, 0x10, 0xA4, 0xE8, + 0x1C, 0x4F, 0x16, 0x45, 0xBF, 0xC9, 0x18, 0x9F, 0xDE, 0xF1, 0x96, 0x64, + 0x58, 0x61, 0xF1, 0x41, 0x82, 0xE2, 0xDA, 0xA3, 0xE4, 0x86, 0x0F, 0xB7, + 0xCA, 0x17, 0x17, 0x2A, 0x7D, 0xAC, 0x9F, 0xB3, 0x8E, 0x65, 0x63, 0x80, + 0x64, 0x8E, 0x6F, 0xDB, 0xD4, 0x05, 0x65, 0xEE, 0x13, 0x1C, 0xE6, 0x51, + 0x53, 0x01, 0xA1, 0xE2, 0xA1, 0x3E, 0x46, 0x82, 0xBB, 0x4A, 0x7E, 0xC1, + 0x4A, 0x12, 0xBB, 0x56, 0xA2, 0x2F, 0x81, 0xC0, 0x0F, 0x47, 0x7F, 0xA1, + 0xD9, 0x8F, 0x21, 0xC5, 0x48, 0x34, 0xF0, 0x7F, 0x07, 0xE8, 0xB4, 0x0C, + 0x37, 0xEA, 0x4A, 0x76, 0x5E, 0x98, 0xA0, 0x87, 0x08, 0xC1, 0x51, 0x3D, + 0xED, 0xC6, 0xA2, 0x75, 0x90, 0xB4, 0x23, 0xFC, 0x3E, 0x36, 0x4A, 0x9A, + 0xEA, 0x25, 0x1F, 0x62, 0x41, 0x69, 0xCC, 0x8C, 0xB0, 0xB7, 0xAA, 0x6B, + 0x67, 0xC9, 0x85, 0x7F, 0x92, 0xC0, 0x7A, 0x30, 0x18, 0x35, 0xCD, 0xFD, + 0x85, 0xC4, 0x70, 0x23, 0x75, 0x45, 0x67, 0x79, 0xAB, 0xFE, 0x83, 0x4B, + 0xC9, 0x09, 0x78, 0xF1, 0x7F, 0xFA, 0xCC, 0xF2, 0x0A, 0x03, 0x0E, 0x43, + 0x9A, 0xD1, 0xBF, 0x53, 0xA8, 0x1E, 0x0F, 0x75, 0xC9, 0x14, 0x54, 0x07, + 0x6D, 0xCD, 0xC7, 0xB3, 0x5D, 0x14, 0x87, 0x29, 0x0C, 0x43, 0xED, 0x91, + 0xE3, 0x0A, 0xD0, 0x6F, 0xAE, 0x3B, 0xB5, 0xA8, 0x29, 0x3C, 0xA5, 0x5E, + 0x0A, 0x51, 0xB4, 0x7F, 0x3D, 0x15, 0xCC, 0x1A, 0x35, 0xFB, 0xA4, 0x70, + 0xDC, 0x4B, 0x98, 0xD4, 0xBF, 0x28, 0xE6, 0x29, 0x42, 0x60, 0x71, 0xA7, + 0xAE, 0x02, 0xC0, 0xE4, 0xEE, 0x61, 0x48, 0x07, 0x84, 0x87, 0xAD, 0x5E, + 0x70, 0xA8, 0x03, 0x30, 0x81, 0xE3, 0xE3, 0x53, 0x28, 0xFC, 0x06, 0xF8, + 0x37, 0x19, 0x69, 0xA1, 0xD2, 0x7A, 0xDB, 0x91, 0xAD, 0xB2, 0x8E, 0x51, + 0xE1, 0xC0, 0x0A, 0xEE, 0x70, 0x3B, 0xB7, 0x37, 0x96, 0x07, 0xBC, 0x66, + 0x3B, 0x10, 0x6F, 0x18, 0xCC, 0xA8, 0x8F, 0xDD, 0x6C, 0x30, 0x18, 0xEF, + 0x96, 0x09, 0xE5, 0x89, 0x47, 0x8E, 0xBA, 0x57, 0x8D, 0x8F, 0x63, 0x8A, + 0xAB, 0x30, 0xA0, 0x45, 0x1C, 0x4C, 0x0D, 0xB0, 0x72, 0x09, 0x0A, 0xC8, + 0x56, 0xD8, 0x45, 0x71, 0xD3, 0xB8, 0x03, 0xD3, 0xCD, 0x9E, 0x86, 0x53, + 0xA5, 0xD5, 0x58, 0xA5, 0x03, 0xE3, 0xFC, 0x5E, 0x1C, 0x63, 0x65, 0xE9, + 0x70, 0x53, 0xF4, 0x99, 0x71, 0x7A, 0x76, 0x2C, 0x2C, 0x38, 0xBE, 0x5A, + 0x20, 0xFF, 0xC0, 0x25, 0x16, 0x46, 0xA8, 0x65, 0x9B, 0xE0, 0xB1, 0x10, + 0x7D, 0xB2, 0x90, 0xBC, 0xE4, 0xB5, 0x22, 0xC7, 0xD6, 0x8A, 0xBB, 0x19, + 0x9F, 0xCD, 0x11, 0x62, 0x82, 0xFC, 0x8D, 0x36, 0xE2, 0x08, 0xF0, 0xDD, + 0x68, 0x60, 0x48, 0x09, 0x1F, 0xF0, 0xC5, 0x54, 0xE9, 0x47, 0x7D, 0x79, + 0xE6, 0xC4, 0xC1, 0xF1, 0xFF, 0x2D, 0x5C, 0xA3, 0xFD, 0xF2, 0xB1, 0xA7, + 0x89, 0xB7, 0xB9, 0x7C, 0x44, 0x28, 0xE5, 0x82, 0x36, 0x4D, 0x48, 0x34, + 0x01, 0x5B, 0x43, 0x36, 0x2D, 0x05, 0x93, 0xEE, 0xF5, 0x92, 0x73, 0xDF, + 0xA6, 0xBA, 0x3D, 0x5B, 0x96, 0x49, 0x73, 0xDF, 0x70, 0x9B, 0x7A, 0x70, + 0x5C, 0x30, 0x14, 0xB8, 0xB7, 0x46, 0xE0, 0xD7, 0xFF, 0x5C, 0x8E, 0x27, + 0x39, 0x0E, 0xEE, 0x99, 0x2F, 0x08, 0x1E, 0x95, 0xD4, 0x70, 0xB0, 0xC4, + 0x28, 0x83, 0x78, 0x92, 0x93, 0x46, 0xB9, 0xF9, 0xFF, 0x8C, 0x16, 0xA9, + 0x63, 0x71, 0xAF, 0xBD, 0x84, 0x1A, 0x25, 0xBE, 0xE8, 0xE3, 0xB2, 0x33, + 0x51, 0xB9, 0xB6, 0x0E, 0x12, 0xB8, 0xA7, 0x6E, 0x28, 0xBC, 0xA3, 0x66, + 0x24, 0x49, 0x4D, 0x45, 0xA4, 0x5C, 0xCD, 0x4D, 0x2E, 0x17, 0xFB, 0xC0, + 0xB5, 0xA7, 0x55, 0x34, 0x08, 0xD7, 0xC7, 0x54, 0x0A, 0xFE, 0xE6, 0x98, + 0x85, 0x6D, 0xAF, 0x42, 0x79, 0xED, 0x0A, 0xFA, 0xCF, 0xD3, 0xE2, 0x7C, + 0xB8, 0x24, 0xA5, 0xE1, 0x01, 0xA5, 0x94, 0x55, 0x61, 0xA0, 0x49, 0x1B, + 0x7C, 0x71, 0xA8, 0x96, 0x5A, 0x4C, 0xF5, 0xC5, 0x1E, 0x8D, 0xD9, 0x2E, + 0xBE, 0xC4, 0x13, 0x27, 0xD0, 0xC0, 0x67, 0xA7, 0x77, 0x86, 0x61, 0xAE, + 0x7E, 0x69, 0x53, 0xB4, 0x70, 0xC6, 0x1E, 0x62, 0x1A, 0x8B, 0xB3, 0x0A, + 0xC5, 0xDF, 0xF4, 0xFA, 0xEB, 0xC5, 0x50, 0x7E, 0xDE, 0xD5, 0x15, 0xB1, + 0x2E, 0x09, 0x75, 0xD7, 0x9E, 0xB1, 0x58, 0x76, 0x2F, 0xFE, 0x86, 0x0A, + 0xC2, 0x10, 0x1D, 0x84, 0xDF, 0x94, 0x11, 0xD0, 0x86, 0x06, 0xFA, 0x9E, + 0x00, 0xF0, 0x27, 0x51, 0x00, 0x43, 0xAF, 0xEA, 0x13, 0x4E, 0xC8, 0x48, + 0x5A, 0x57, 0xDB, 0x5C, 0x20, 0xDC, 0xF3, 0x7D, 0x2B, 0x77, 0x35, 0x20, + 0xBD, 0x17, 0x0C, 0x3A, 0x2C, 0x3B, 0x58, 0x7D, 0x9D, 0x40, 0xA0, 0xDF, + 0xD5, 0xBA, 0x84, 0xA2, 0x9E, 0x4C, 0x87, 0xA5, 0xF9, 0xED, 0xEA, 0xEB, + 0x98, 0x0D, 0x81, 0xD9, 0xCB, 0xE3, 0xD5, 0xA0, 0xF7, 0xFF, 0x2A, 0x28, + 0xE9, 0x6F, 0x08, 0xE4, 0xBA, 0x76, 0x16, 0x0A, 0xF5, 0x3C, 0x01, 0x11, + 0xB3, 0xBA, 0x4C, 0x7E, 0xC3, 0x1F, 0x0B, 0x91, 0x62, 0x82, 0xDD, 0x29, + 0x7C, 0x60, 0x5F, 0x56, 0xE5, 0x48, 0x7D, 0xB8, 0x4A, 0xC7, 0x1F, 0x7D, + 0xD5, 0xB7, 0x17, 0x9F, 0x91, 0xDD, 0xE3, 0xE0, 0x04, 0x14, 0xF3, 0x4C, + 0xD2, 0xB3, 0xC3, 0xAC, 0x7F, 0x63, 0x67, 0xFA, 0x1B, 0x14, 0x0E, 0x2A, + 0x8C, 0x82, 0xD8, 0x49, 0x8B, 0x24, 0x4B, 0xF3, 0x21, 0x86, 0x06, 0x91, + 0xC9, 0x81, 0xF9, 0x84, 0xC6, 0x2B, 0x12, 0xCF, 0x95, 0x32, 0x7A, 0xFD, + 0x9C, 0x1C, 0xFC, 0x3B, 0x3B, 0x06, 0xBA, 0x2C, 0x45, 0x88, 0xDA, 0x5B, + 0x5D, 0x90, 0xDC, 0x07, 0xBD, 0xEC, 0xAF, 0xB2, 0x06, 0x98, 0x05, 0xAC, + 0x1D, 0x41, 0xA1, 0xD5, 0x76, 0x9D, 0x7B, 0x59, 0x82, 0x9C, 0x46, 0x02, + 0xF4, 0x03, 0xB4, 0xFB, 0x70, 0x48, 0x73, 0xB2, 0x4C, 0x8B, 0xA6, 0xDB, + 0x11, 0xC5, 0x7E, 0xFE, 0x23, 0x4E, 0xC2, 0x2B, 0x0F, 0x95, 0x51, 0x2A, + 0x3B, 0x46, 0x1C, 0xB7, 0xBF, 0x51, 0xF0, 0xA4, 0xF8, 0xAD, 0x16, 0x96, + 0xAA, 0x6D, 0xBE, 0xFE, 0x45, 0x46, 0xEF, 0x8B, 0x96, 0xED, 0xE1, 0xE5, + 0xB5, 0xEF, 0x22, 0x8C, 0xBA, 0x3A, 0xB0, 0x2F, 0x9A, 0x34, 0x16, 0x52, + 0x56, 0x5A, 0x36, 0x8B, 0x50, 0x89, 0xBD, 0xC0, 0xFE, 0xAE, 0x2B, 0xBB, + 0x53, 0xAE, 0x76, 0x8D, 0xB6, 0x91, 0x9D, 0x32, 0x18, 0xF5, 0xD7, 0x1A, + 0xE5, 0x04, 0x05, 0xFD, 0xDC, 0x5B, 0x67, 0xBE, 0x34, 0x05, 0x03, 0x90, + 0xD5, 0xBF, 0xAA, 0x35, 0x8D, 0xB7, 0x63, 0x76, 0xC9, 0x98, 0x2B, 0x99, + 0xD6, 0x5A, 0xB4, 0x39, 0x4A, 0xAA, 0xDF, 0xEC, 0x82, 0x83, 0xC6, 0x80, + 0xA1, 0x86, 0x74, 0xC8, 0x8E, 0x37, 0xAB, 0x7A, 0xC2, 0x35, 0x99, 0x62, + 0xAD, 0x30, 0xD2, 0x4E, 0x30, 0xA4, 0x3F, 0xC6, 0x16, 0x9C, 0xBF, 0xD5, + 0x5C, 0x08, 0xF8, 0xF4, 0x35, 0x20, 0x86, 0xF4, 0x0C, 0x12, 0x56, 0xD4, + 0xDB, 0x73, 0xDB, 0x82, 0x30, 0x73, 0xD2, 0x60, 0xCF, 0xF7, 0xA8, 0xF6, + 0xC8, 0x71, 0xB2, 0x6E, 0xC3, 0x65, 0x05, 0x07, 0x6C, 0x9C, 0x3F, 0xD7, + 0xC9, 0x6E, 0x09, 0xFF, 0x9E, 0xF0, 0x68, 0xB6, 0xE0, 0xDB, 0x6A, 0x1F, + 0xE9, 0xBC, 0x8C, 0xC1, 0xEB, 0xC5, 0x2A, 0x8B, 0x99, 0x23, 0xFC, 0x35, + 0xAF, 0xC1, 0x4A, 0xD8, 0x62, 0x28, 0x95, 0x4C, 0xD5, 0x93, 0x21, 0xBC, + 0x19, 0x52, 0xA0, 0x71, 0x3C, 0x2B, 0x3F, 0x88, 0x68, 0xA0, 0xE0, 0x16, + 0x10, 0x85, 0xCA, 0xDB, 0x45, 0x96, 0xBD, 0x44, 0xB3, 0x24, 0xE2, 0xCB, + 0xE6, 0xE7, 0xC9, 0xDD, 0x7A, 0x78, 0x9B, 0x7C, 0x1E, 0x28, 0x2B, 0xC2, + 0x2B, 0x53, 0x12, 0xB2, 0xD7, 0xB8, 0x59, 0x41, 0x19, 0x3D, 0xF9, 0x6F, + 0x34, 0xDB, 0x76, 0x43, 0x8C, 0x21, 0x2A, 0xC2, 0xAB, 0x4B, 0x0D, 0xC5, + 0x0A, 0x92, 0x41, 0xD2, 0xD2, 0xEB, 0x40, 0x7C, 0x14, 0x5D, 0x73, 0x3D, + 0x6C, 0x42, 0xAC, 0xF1, 0xC8, 0x37, 0xCD, 0xC3, 0xC0, 0xDD, 0xC0, 0x42, + 0x35, 0x6A, 0x99, 0xF3, 0x7F, 0x63, 0xE1, 0x17, 0xB5, 0x8F, 0xC3, 0x2C, + 0xF5, 0x67, 0x4A, 0x96, 0x25, 0xDD, 0xC9, 0x06, 0x3A, 0x86, 0x3C, 0x2B, + 0x23, 0x04, 0xB0, 0x53, 0x3C, 0x82, 0xDD, 0x7E, 0xAE, 0x1A, 0xF4, 0x76, + 0x65, 0x57, 0xF1, 0x7F, 0xBC, 0x5C, 0xFC, 0xB0, 0xBB, 0x04, 0x13, 0x9B, + 0x81, 0x9C, 0x70, 0x87, 0xFE, 0x6C, 0xC2, 0x9B, 0x88, 0x83, 0x3C, 0x4D, + 0x43, 0x0B, 0x64, 0xE3, 0x8C, 0x79, 0x25, 0x5D, 0xF7, 0x20, 0xCF, 0xAB, + 0x65, 0xC3, 0x9F, 0x17, 0xDA, 0x5A, 0x6F, 0x02, 0x81, 0xEC, 0x8A, 0x20, + 0x56, 0x09, 0x31, 0xE2, 0x0E, 0x80, 0x68, 0xE5, 0xA7, 0xFF, 0x70, 0x92, + 0x68, 0x09, 0x70, 0x93, 0x98, 0xD1, 0x73, 0xD4, 0x47, 0xA2, 0xD3, 0x91, + 0x00, 0xAB, 0xF0, 0x35, 0xD1, 0xBE, 0xB8, 0xC9, 0x9E, 0x82, 0x39, 0x17, + 0x2E, 0xB7, 0x8B, 0x0C, 0x7B, 0xAF, 0x84, 0x5C, 0xB5, 0x0A, 0xCE, 0x31, + 0x30, 0xE7, 0x38, 0x06, 0xAA, 0x10, 0x48, 0x2C, 0xA8, 0xE1, 0xBD, 0xBD, + 0xEE, 0x3D, 0xDA, 0x11, 0xA0, 0x0C, 0x07, 0xFA, 0xD0, 0x5B, 0xA5, 0x91, + 0xE5, 0x1D, 0x54, 0x6A, 0xBF, 0x53, 0x56, 0x55, 0x11, 0xC9, 0x5C, 0x89, + 0xFE, 0x72, 0x5A, 0xA7, 0x15, 0x9C, 0xBB, 0x37, 0x4E, 0x18, 0x89, 0xED, + 0xF2, 0x82, 0x83, 0xF1, 0x5B, 0x9D, 0x27, 0x3D, 0xCF, 0xF3, 0x0B, 0x0C, + 0xCB, 0x53, 0xF3, 0x13, 0xA8, 0xA1, 0x5A, 0x0E, 0xB2, 0x21, 0x8B, 0x16, + 0xD7, 0x5E, 0xAE, 0xD2, 0x7B, 0x3A, 0x2A, 0xCD, 0x23, 0x14, 0x0F, 0xE7, + 0x0D, 0x81, 0x82, 0xF2, 0x41, 0x8B, 0x77, 0x53, 0x16, 0xAE, 0xC7, 0xDF, + 0xF7, 0xD1, 0x91, 0x8B, 0x73, 0xA5, 0x0E, 0x9F, 0xC3, 0xBF, 0x2C, 0xC3, + 0xE4, 0xB7, 0x60, 0x60, 0xF7, 0xCA, 0x95, 0x6D, 0xFA, 0x4F, 0x66, 0xC2, + 0x98, 0xA0, 0x72, 0xC9, 0x0C, 0x9E, 0x6B, 0xFD, 0x5D, 0x14, 0x8B, 0x9E, + 0x7F, 0xA1, 0x20, 0x48, 0x99, 0x09, 0xDC, 0xAA, 0xAB, 0xB4, 0x46, 0x10, + 0xAB, 0x1B, 0x77, 0x98, 0x2F, 0x7D, 0xE0, 0xD4, 0x18, 0x64, 0x4A, 0x5C, + 0xBA, 0x23, 0x3C, 0x7E, 0x2F, 0x96, 0x13, 0xC6, 0x4D, 0x38, 0xED, 0xCE, + 0x4D, 0xB3, 0x02, 0x23, 0xAE, 0x9E, 0xD8, 0x8A, 0xC0, 0x17, 0x39, 0x91, + 0x75, 0x33, 0x6A, 0xA9, 0x75, 0x12, 0xE3, 0x65, 0x19, 0x30, 0x98, 0x00, + 0x4D, 0x82, 0xDB, 0xA3, 0xA2, 0xE7, 0x11, 0x51, 0x7A, 0xA1, 0xFE, 0xD2, + 0x4E, 0xEA, 0xBB, 0xCD, 0xA1, 0x29, 0xB0, 0xB3, 0x63, 0x23, 0x54, 0x11, + 0x0B, 0xF3, 0xBD, 0x82, 0xA4, 0x60, 0xC2, 0xFE, 0xE9, 0x5C, 0xD7, 0xB5, + 0xDA, 0x7D, 0x6C, 0x3D, 0x57, 0xD1, 0xF9, 0x90, 0x03, 0x0B, 0xE8, 0xC1, + 0x20, 0xEE, 0x46, 0x68, 0x18, 0x95, 0x66, 0x3C, 0x01, 0x2A, 0xE8, 0x84, + 0xC1, 0x26, 0x3B, 0x15, 0xBB, 0x20, 0x5E, 0x3B, 0x57, 0x0E, 0x59, 0xEA, + 0x1C, 0xD3, 0x6C, 0xC7, 0x35, 0xE7, 0x23, 0xFE, 0x40, 0x37, 0x84, 0x2D, + 0x70, 0x0F, 0xE9, 0x2F, 0xB2, 0x22, 0xEA, 0xB9, 0xB6, 0x93, 0xDC, 0x67, + 0xE1, 0xFB, 0x0E, 0x34, 0x91, 0x35, 0x76, 0x52, 0x03, 0x27, 0x79, 0x42, + 0x55, 0x1D, 0x5B, 0x8D, 0xAA, 0x17, 0x5C, 0x64, 0x3D, 0x8D, 0xA1, 0x04, + 0xBE, 0x3E, 0x6D, 0x92, 0x6E, 0xE6, 0x2C, 0x0B, 0x6E, 0x9B, 0x8A, 0x5D, + 0x18, 0x05, 0xB8, 0xE4, 0x18, 0x6E, 0x9E, 0x90, 0x74, 0xD3, 0x1D, 0x33, + 0x4D, 0x72, 0xF5, 0x99, 0xE3, 0x2B, 0x2A, 0x0C, 0x11, 0x5C, 0x94, 0xB7, + 0x66, 0xCC, 0xAC, 0xF1, 0x0D, 0x8D, 0x20, 0xC5, 0x75, 0x20, 0x4C, 0x0A, + 0xB8, 0xBA, 0xCD, 0x0F, 0xD9, 0xF1, 0x59, 0x6E, 0xC8, 0x63, 0x5C, 0x9E, + 0xE5, 0xBB, 0x85, 0x93, 0xFE, 0x1F, 0xD9, 0x8C, 0x89, 0xB4, 0x7E, 0xD8, + 0xB5, 0xC6, 0x62, 0x03, 0xD1, 0xAB, 0x5F, 0xD2, 0xB4, 0x47, 0xC0, 0xC5, + 0xC9, 0x75, 0x14, 0x91, 0x37, 0xFE, 0x3B, 0x78, 0x1F, 0x56, 0x87, 0x13, + 0xF4, 0xCC, 0x3A, 0xBD, 0x2C, 0xC1, 0x61, 0xF5, 0xAB, 0x3A, 0xE8, 0x9C, + 0x97, 0xCA, 0xAA, 0xA3, 0x12, 0xC4, 0x70, 0x8F, 0x32, 0xDD, 0xEA, 0xE8, + 0xF8, 0x8A, 0x03, 0x65, 0x89, 0x99, 0x53, 0x45, 0x28, 0xF3, 0xA8, 0xF3, + 0x14, 0x80, 0xB4, 0xD6, 0x44, 0xD4, 0x02, 0xEE, 0x9C, 0x58, 0x46, 0xC1, + 0x4F, 0xEE, 0xFA, 0xCD, 0x63, 0x4D, 0x87, 0xE6, 0x22, 0x9F, 0xF9, 0xDA, + 0x77, 0xD0, 0x51, 0xAA, 0x1F, 0x2A, 0x2F, 0x48, 0x66, 0x55, 0xE0, 0x2A, + 0x5F, 0xEC, 0x12, 0xA6, 0x14, 0xAD, 0x7D, 0xDD, 0xC2, 0x7B, 0x3E, 0xE9, + 0x8F, 0x2C, 0xB8, 0x60, 0x7E, 0x03, 0x76, 0x28, 0x7C, 0x22, 0x18, 0x6B, + 0x53, 0x39, 0x21, 0x6A, 0xB2, 0x05, 0x75, 0x58, 0xB7, 0xB1, 0x49, 0x1B, + 0x11, 0x1D, 0xD6, 0xFA, 0xC8, 0x01, 0x77, 0x12, 0x16, 0x17, 0xB8, 0x71, + 0xC2, 0x6F, 0x12, 0xE0, 0xFA, 0xBF, 0x7A, 0xB3, 0xE3, 0xDB, 0xB6, 0x19, + 0x78, 0xAF, 0x25, 0x18, 0x4F, 0x7A, 0x21, 0x63, 0xF6, 0x68, 0x33, 0xCC, + 0xD9, 0x12, 0x4A, 0x36, 0x73, 0x3D, 0x7C, 0xA4, 0x6E, 0x5E, 0xFD, 0x5E, + 0x0D, 0x45, 0xDF, 0x68, 0x66, 0xC6, 0x3F, 0x42, 0xEF, 0xD5, 0x0A, 0x7D, + 0x41, 0x3E, 0x1B, 0x4E, 0x3F, 0x93, 0x4F, 0xAA, 0x0B, 0xB4, 0x34, 0x67, + 0xEC, 0xEF, 0x23, 0x6B, 0x87, 0x8A, 0xF9, 0x66, 0x48, 0x19, 0xF5, 0x92, + 0x57, 0xA8, 0x60, 0x53, 0xC3, 0x37, 0xF3, 0x61, 0x82, 0x42, 0xC3, 0x09, + 0x95, 0xBE, 0xE9, 0x1F, 0xBA, 0x1F, 0x01, 0xB6, 0x37, 0xC7, 0xD9, 0x65, + 0xAF, 0x2D, 0xB4, 0x42, 0x22, 0xC0, 0x54, 0x1A, 0x3B, 0x13, 0x07, 0x30, + 0x94, 0x15, 0x01, 0x17, 0x21, 0x36, 0x3A, 0x4F, 0xC3, 0x76, 0xC4, 0xA9, + 0x64, 0x0D, 0xE0, 0x4F, 0x93, 0xCD, 0x5D, 0x7D, 0xD4, 0xB6, 0xDE, 0xAC, + 0x9C, 0xB6, 0x79, 0x3B, 0xCE, 0x49, 0x35, 0x21, 0xE2, 0x20, 0xC2, 0x36, + 0x9E, 0xCF, 0x51, 0x4D, 0x1D, 0x41, 0x32, 0x05, 0xB0, 0x45, 0x85, 0xEF, + 0x68, 0x94, 0xE2, 0x56, 0x61, 0x7A, 0x08, 0xE7, 0x46, 0x3E, 0xBA, 0xEC, + 0x9E, 0x82, 0x17, 0x1B, 0xE4, 0xE1, 0x32, 0xCD, 0x9C, 0xF8, 0xC1, 0xE5, + 0x1C, 0x9E, 0x84, 0xBB, 0x20, 0x71, 0xF5, 0x6F, 0x0B, 0x55, 0x6F, 0x4C, + 0x96, 0x28, 0x08, 0x6E, 0x5D, 0xF2, 0xFE, 0xF9, 0xE2, 0xBB, 0xEF, 0x58, + 0xFC, 0x34, 0xEF, 0xD6, 0xF5, 0xB2, 0x77, 0x5F, 0x62, 0x4F, 0x8F, 0x32, + 0xD7, 0xAD, 0x14, 0x07, 0xFC, 0xAB, 0x53, 0x06, 0xC9, 0x65, 0x8A, 0x0F, + 0xDA, 0xDF, 0x4F, 0xA4, 0x88, 0x45, 0xFC, 0x17, 0x74, 0x1C, 0xE0, 0x9F, + 0xBC, 0x91, 0xF3, 0x7A, 0x9D, 0xE8, 0x92, 0xD6, 0x3C, 0x8E, 0x71, 0x65, + 0x34, 0x64, 0x4B, 0xAE, 0x41, 0x04, 0x37, 0x3E, 0xE3, 0x79, 0xA1, 0xD4, + 0x4F, 0x89, 0xE8, 0x3C, 0x1C, 0x36, 0x41, 0x66, 0x14, 0xA4, 0xCF, 0xC5, + 0x38, 0x59, 0xE6, 0x8C, 0x75, 0xE7, 0x6F, 0x3B, 0x20, 0x11, 0x41, 0x55, + 0x28, 0x67, 0x12, 0xD5, 0x67, 0x81, 0xC5, 0x76, 0x02, 0xC3, 0xC7, 0x03, + 0x1C, 0xC0, 0x2E, 0xDC, 0x7E, 0xD9, 0xAD, 0x24, 0xE0, 0x7A, 0x07, 0x8D, + 0xC7, 0xE5, 0x2B, 0x27, 0x13, 0xAC, 0x76, 0x46, 0x93, 0x4B, 0x3B, 0x1C, + 0xC7, 0xD2, 0x9E, 0xEF, 0x32, 0xEA, 0x3A, 0x43, 0xDC, 0x79, 0xD6, 0xE8, + 0x52, 0x89, 0xAB, 0xEE, 0x9F, 0x22, 0xAA, 0x02, 0xD7, 0x08, 0xE2, 0x50, + 0x94, 0x16, 0x09, 0x49, 0x5C, 0x70, 0x61, 0x97, 0xEA, 0x99, 0x42, 0xAC, + 0xFB, 0x97, 0xFA, 0x35, 0xA1, 0x80, 0xFD, 0x06, 0x44, 0xA3, 0x6F, 0xFC, + 0x39, 0x7A, 0xA2, 0x37, 0x87, 0x3B, 0x72, 0xC2, 0x7A, 0x2A, 0xBA, 0x54, + 0x6B, 0xF9, 0xFA, 0x75, 0x46, 0xE6, 0x1B, 0x3C, 0xE7, 0x21, 0xA0, 0xDE, + 0xC1, 0x26, 0xC7, 0x3F, 0x8C, 0xA1, 0x8A, 0xC5, 0xBD, 0x7D, 0xC6, 0x70, + 0xF7, 0xB6, 0x6B, 0x84, 0xCB, 0x20, 0x4B, 0x34, 0x4D, 0x50, 0xA5, 0xD8, + 0xF3, 0x50, 0xF2, 0xE7, 0xE0, 0xE0, 0x32, 0x07, 0x5F, 0xF6, 0x86, 0x06, + 0x9D, 0x31, 0x7A, 0xB0, 0x63, 0xB7, 0xB3, 0x04, 0x5B, 0x31, 0xA6, 0x9B, + 0x29, 0x27, 0x96, 0xB1, 0x5A, 0x41, 0x09, 0xE3, 0x13, 0x39, 0x8E, 0x0C, + 0x94, 0xFF, 0xD2, 0x2D, 0x8F, 0x91, 0x73, 0x43, 0xC7, 0xFA, 0x65, 0x56, + 0x70, 0x94, 0x0B, 0x5F, 0xA3, 0xD1, 0xCB, 0x4C, 0x95, 0x5F, 0x64, 0x8D, + 0xD2, 0x7C, 0x68, 0xBA, 0x31, 0x0D, 0x1C, 0x55, 0xB6, 0x2F, 0x96, 0xB7, + 0xB1, 0x79, 0xDE, 0x50, 0xB5, 0x8D, 0x4C, 0xC4, 0xD5, 0x3A, 0xE2, 0x13, + 0x80, 0x37, 0x68, 0x51, 0xDA, 0x33, 0x70, 0x95, 0x49, 0x57, 0xB5, 0x3F, + 0x3F, 0x2F, 0xDA, 0xC5, 0xE3, 0x63, 0x95, 0x63, 0x29, 0x96, 0x4A, 0xED, + 0xB5, 0x2F, 0x7D, 0xC2, 0xCC, 0x4C, 0x87, 0xDE, 0x49, 0xE2, 0xCA, 0x46, + 0x60, 0x38, 0x31, 0xB4, 0x65, 0x86, 0x3F, 0x91, 0x61, 0x8C, 0x11, 0x0F, + 0xAF, 0x6F, 0xED, 0xED, 0x4B, 0x9F, 0x32, 0xAB, 0x7A, 0xBB, 0x83, 0xCD, + 0xE9, 0x36, 0x58, 0x7E, 0x3D, 0xCD, 0xD1, 0x00, 0x41, 0x80, 0x41, 0x14, + 0xD3, 0xF1, 0xEA, 0x24, 0xF2, 0xD7, 0x79, 0x71, 0x71, 0x0B, 0x24, 0x5E, + 0x2B, 0xA8, 0x15, 0xCA, 0x20, 0x35, 0xF5, 0x8B, 0xED, 0xC6, 0xD7, 0x7B, + 0xAB, 0xF5, 0x74, 0x7E, 0x55, 0xEE, 0xCC, 0x92, 0xF0, 0xBB, 0x0D, 0xE4, + 0xF7, 0xD9, 0xD4, 0x74, 0x89, 0x87, 0xF2, 0xE2, 0xAA, 0x73, 0xDF, 0xCD, + 0x5C, 0xE1, 0x0D, 0xF1, 0xDA, 0xA9, 0x62, 0x33, 0x20, 0x61, 0x5B, 0xC4, + 0x17, 0x8A, 0xDA, 0xA3, 0xD1, 0xA7, 0xB1, 0x27, 0xA1, 0xD7, 0x41, 0x02, + 0x06, 0x4A, 0x18, 0xC7, 0xDE, 0x2B, 0xD2, 0xF9, 0xD2, 0x16, 0x43, 0x4B, + 0x02, 0x0E, 0xD6, 0x2F, 0x16, 0x28, 0xCA, 0x9C, 0x19, 0xAE, 0x27, 0x61, + 0xC8, 0x09, 0xD6, 0xAE, 0x89, 0x90, 0x52, 0x04, 0xC2, 0x17, 0x7D, 0x3D, + 0x41, 0x18, 0x20, 0x70, 0xB4, 0xBA, 0x83, 0x51, 0xE1, 0xF0, 0x23, 0x7E, + 0x9B, 0x4B, 0x56, 0xC7, 0x9F, 0x3D, 0x0D, 0xE6, 0x92, 0xED, 0xC0, 0xAD, + 0x46, 0xC3, 0x35, 0x94, 0xFB, 0xDB, 0x3C, 0xB3, 0x95, 0x9C, 0xFD, 0xA2, + 0x9E, 0x23, 0x49, 0xA6, 0xDC, 0xA0, 0x63, 0xC3, 0x5D, 0x37, 0xF1, 0x9C, + 0x57, 0xE7, 0x58, 0xD5, 0x28, 0xC4, 0x73, 0x2B, 0xE3, 0xBF, 0x14, 0xD3, + 0x83, 0xEC, 0x49, 0x03, 0x42, 0xD1, 0x3F, 0xE6, 0x22, 0xEE, 0xC5, 0x23, + 0x50, 0x64, 0x5F, 0xA6, 0x9F, 0x92, 0x5A, 0x69, 0xC5, 0x7D, 0x76, 0x81, + 0xB9, 0x0F, 0x43, 0x24, 0x94, 0x20, 0xF1, 0x51, 0xF7, 0x30, 0xF7, 0x6A, + 0x3A, 0x73, 0xEF, 0x5B, 0x39, 0xD8, 0x75, 0x0F, 0x78, 0xFB, 0x7A, 0xFD, + 0xEB, 0x80, 0xE8, 0xF0, 0x98, 0x4C, 0xE2, 0xDE, 0xA9, 0x5F, 0x75, 0x36, + 0x62, 0x3F, 0x7B, 0x66, 0xF1, 0xA8, 0xA7, 0x55, 0xD4, 0x6C, 0x03, 0xE8, + 0xFF, 0xD6, 0xBB, 0x50, 0x0E, 0x38, 0xFB, 0xD5, 0xD9, 0xB2, 0x4B, 0xFD, + 0xC5, 0x05, 0x08, 0x88, 0xBC, 0x90, 0x47, 0x15, 0xE1, 0x92, 0x04, 0x18, + 0x06, 0x4B, 0x13, 0x12, 0x12, 0xCE, 0xF6, 0xA4, 0x9A, 0xBC, 0x1B, 0x60, + 0x9E, 0x49, 0xBA, 0xC5, 0x56, 0x9D, 0x47, 0x21, 0x5F, 0xE5, 0x19, 0xFC, + 0x71, 0xCB, 0x8D, 0x6F, 0x9E, 0x91, 0x18, 0x6F, 0x6E, 0xF8, 0x07, 0xE9, + 0x6C, 0xB3, 0x6B, 0x94, 0x2C, 0xCF, 0xAC, 0x5F, 0x1C, 0x1A, 0xA1, 0xD7, + 0x8F, 0x9A, 0x1B, 0x49, 0x28, 0x22, 0xEA, 0x52, 0xDE, 0x0D, 0xB5, 0xF9, + 0x0E, 0x08, 0xA4, 0x78, 0x3B, 0x7F, 0x31, 0x1C, 0x75, 0x91, 0x0A, 0xC4, + 0x35, 0x68, 0x0D, 0xDF, 0x00, 0xEB, 0x31, 0x0C, 0x84, 0x62, 0xEC, 0xAF, + 0x82, 0xAD, 0x52, 0xA2, 0xE2, 0x1F, 0xFE, 0xAC, 0xBE, 0x4D, 0xFB, 0xCE, + 0x0C, 0x82, 0xE5, 0x4A, 0x4D, 0xD8, 0x98, 0x57, 0xFD, 0xE6, 0x83, 0x21, + 0x95, 0x25, 0xF3, 0xAD, 0x2E, 0xAD, 0x69, 0xB9, 0x4E, 0x1E, 0x4A, 0x29, + 0xF0, 0x75, 0xB2, 0xE2, 0x05, 0x7A, 0x4E, 0xF2, 0x7D, 0x1A, 0xFB, 0x03, + 0xB4, 0xEE, 0xA2, 0x69, 0x44, 0x42, 0x5C, 0x96, 0xFB, 0xE9, 0xC7, 0x42, + 0x74, 0x7A, 0x2F, 0xDE, 0xCC, 0xA4, 0x5C, 0x29, 0xA9, 0x8C, 0xB6, 0x18, + 0xBD, 0x0F, 0xB5, 0xB4, 0x79, 0x63, 0x87, 0xAA, 0x60, 0xCA, 0xE9, 0x7C, + 0x6A, 0xA9, 0x94, 0x0F, 0x7A, 0x5B, 0xEB, 0x4D, 0x14, 0x27, 0xC5, 0x27, + 0xDB, 0x98, 0x7A, 0xB4, 0x6A, 0x79, 0xCB, 0x27, 0xEB, 0x6E, 0x51, 0x9E, + 0x6C, 0x55, 0xFC, 0x40, 0xAF, 0xBF, 0x2F, 0x66, 0xED, 0xE1, 0xB0, 0x46, + 0x29, 0xCE, 0x04, 0x92, 0xF1, 0xF2, 0x9C, 0xA4, 0x9D, 0x0C, 0xFC, 0x85, + 0x57, 0xC4, 0x1D, 0x85, 0x28, 0x8A, 0xFD, 0xA7, 0xF1, 0x3E, 0x24, 0x10, + 0x90, 0xBE, 0x97, 0xCE, 0x15, 0x78, 0x7C, 0x46, 0x13, 0xB2, 0x5E, 0x42, + 0x4D, 0x67, 0x5D, 0x1F, 0x71, 0x7A, 0xB0, 0xAD, 0xB8, 0xAA, 0x8E, 0xA2, + 0x8E, 0x1E, 0x3F, 0xD1, 0x7C, 0xE4, 0x66, 0xCA, 0x06, 0xD7, 0xC8, 0xDC, + 0x9B, 0xC5, 0x87, 0x11, 0x99, 0x8D, 0xEF, 0xE9, 0xDA, 0xB3, 0x2F, 0x20, + 0x8D, 0x9F, 0xB0, 0x4B, 0xF8, 0xDE, 0x68, 0xC5, 0x88, 0xC2, 0x5D, 0x84, + 0xB9, 0xB5, 0x90, 0x7A, 0x41, 0x0C, 0x31, 0x33, 0x55, 0x9D, 0xD6, 0xBE, + 0x86, 0x15, 0xA9, 0xE3, 0xFD, 0xB0, 0xB9, 0x79, 0xF8, 0x5C, 0xF4, 0x4B, + 0x49, 0x74, 0x27, 0x81, 0xC1, 0xEC, 0xB4, 0x2B, 0x91, 0x7E, 0xF3, 0xC2, + 0x9D, 0x62, 0x35, 0x49, 0xF4, 0xE3, 0x8E, 0x4D, 0xEE, 0x44, 0xB7, 0xE2, + 0x20, 0xB1, 0x38, 0xC5, 0x30, 0xFD, 0x01, 0x6C, 0xCC, 0x6E, 0x76, 0xF9, + 0x6C, 0x27, 0xD1, 0x0F, 0x67, 0x04, 0xCF, 0xF1, 0x00, 0xB5, 0x6A, 0xD4, + 0xCD, 0x58, 0x76, 0xAF, 0x1C, 0xFF, 0x74, 0xD7, 0xA7, 0x77, 0x45, 0xCD, + 0x33, 0x4E, 0x45, 0xBD, 0xCC, 0x38, 0x5C, 0x6C, 0xF7, 0x7C, 0xF7, 0x2B, + 0xCF, 0x45, 0x2C, 0xC4, 0x73, 0xB1, 0x2D, 0x2B, 0xE6, 0x06, 0x0F, 0x4B, + 0xAB, 0x48, 0x1E, 0xF2, 0x58, 0x0C, 0x8B, 0x47, 0x4D, 0x81, 0x32, 0x23, + 0x7F, 0x7D, 0x2F, 0xF4, 0x80, 0x43, 0x3E, 0x8A, 0xDC, 0x5D, 0x1F, 0x27, + 0xE6, 0xA2, 0xDC, 0xC8, 0xB6, 0xF7, 0x63, 0x0E, 0x6D, 0xEB, 0xE8, 0x16, + 0x52, 0x69, 0x97, 0xF2, 0x61, 0x7B, 0x2C, 0x8A, 0x15, 0xD8, 0xE1, 0xE9, + 0x28, 0xFF, 0x54, 0x92, 0xF3, 0xCB, 0x72, 0x72, 0xB5, 0x23, 0x48, 0xE9, + 0x52, 0xA3, 0xC7, 0x3B, 0x1D, 0x05, 0x90, 0x26, 0x10, 0xA4, 0x42, 0x9B, + 0xA5, 0xAF, 0x7F, 0x99, 0x3B, 0x5A, 0x70, 0xA4, 0x6C, 0xF8, 0xB5, 0xC3, + 0x42, 0x46, 0x47, 0xEA, 0x62, 0xA0, 0x8F, 0x34, 0x5F, 0x5F, 0x0A, 0x88, + 0xB9, 0x19, 0x47, 0xFD, 0x94, 0x04, 0x05, 0x7C, 0x8B, 0x65, 0xC4, 0x1D, + 0xD2, 0xFC, 0xDD, 0x0E, 0x3A, 0x92, 0x8B, 0xE0, 0xCE, 0xBD, 0xF9, 0x1B, + 0xFB, 0x91, 0xD3, 0x90, 0x80, 0x08, 0x6B, 0x94, 0x20, 0xCC, 0xC8, 0xC9, + 0xF9, 0x60, 0x28, 0x7D, 0x6F, 0xDA, 0x5E, 0x64, 0xE0, 0x1C, 0x5F, 0xE9, + 0xB8, 0xC3, 0x33, 0x18, 0xA5, 0x60, 0xE4, 0xE1, 0x45, 0x1B, 0xEE, 0x20, + 0xFF, 0x40, 0x52, 0xFB, 0x3F, 0xD2, 0x03, 0x0A, 0x71, 0xD2, 0xCE, 0xC5, + 0x84, 0x98, 0x21, 0xE1, 0xF8, 0x13, 0xD6, 0x78, 0x21, 0x75, 0x3C, 0x22, + 0x1A, 0xCC, 0x67, 0x12, 0x9B, 0x31, 0x06, 0xB7, 0x5E, 0xE6, 0x4B, 0xC2, + 0x7E, 0x12, 0xCA, 0x6D, 0xD6, 0x95, 0x67, 0xDC, 0xF1, 0x7C, 0xC8, 0xAD, + 0x95, 0x53, 0x25, 0x7B, 0x16, 0xD3, 0x0B, 0xE4, 0xF4, 0x17, 0x86, 0xC6, + 0xA1, 0x2B, 0x28, 0xA9, 0x02, 0x1D, 0x48, 0x14, 0x42, 0x0A, 0x76, 0x95, + 0x3D, 0xC4, 0x2D, 0x77, 0x5A, 0x67, 0x6F, 0xDB, 0x81, 0xA4, 0xA4, 0x74, + 0x19, 0xA0, 0xFC, 0x2F, 0x9D, 0x26, 0x4D, 0x44, 0x44, 0xDD, 0xAE, 0xCB, + 0x85, 0xBC, 0x21, 0xBB, 0xFC, 0xDF, 0xDB, 0x54, 0xAA, 0x21, 0x95, 0x0C, + 0xFF, 0x2C, 0x17, 0x37, 0x5A, 0xFC, 0x4A, 0x39, 0x34, 0xED, 0xE4, 0x71, + 0x84, 0x5C, 0x28, 0xEB, 0x0A, 0x25, 0x16, 0xA4, 0xA1, 0x8B, 0x63, 0xB0, + 0xFB, 0x26, 0xF3, 0xD1, 0x37, 0x0E, 0x52, 0xF9, 0x77, 0x3D, 0xAA, 0x66, + 0xC7, 0xB9, 0xED, 0x84, 0x88, 0xFE, 0xEF, 0x33, 0x5A, 0x61, 0x87, 0x03, + 0x2A, 0x83, 0xDB, 0x4C, 0x73, 0xBE, 0xF9, 0x6A, 0x04, 0x3F, 0xEC, 0x6E, + 0xCC, 0x5D, 0xA5, 0x8F, 0xA1, 0xCB, 0x53, 0x86, 0x80, 0xC4, 0x21, 0xBA, + 0xC2, 0x2D, 0x65, 0xE7, 0xE2, 0x35, 0x97, 0x2C, 0xA6, 0xE2, 0x09, 0x76, + 0x10, 0xA2, 0xC0, 0x30, 0xDF, 0x9A, 0xDC, 0x38, 0x06, 0x3D, 0x05, 0x26, + 0x16, 0x4D, 0xA8, 0xA9, 0x1E, 0x07, 0x1D, 0x62, 0x6C, 0xA5, 0xCC, 0xEB, + 0x05, 0x21, 0x64, 0xD4, 0x3E, 0x4B, 0xB3, 0x96, 0x14, 0x75, 0xFC, 0x5C, + 0xCA, 0xDB, 0x1F, 0xDC, 0x41, 0x9D, 0x60, 0x05, 0xF8, 0x89, 0xC9, 0x7E, + 0x3B, 0x74, 0x75, 0x49, 0x34, 0x3A, 0x74, 0x79, 0xDF, 0x16, 0x3D, 0x6F, + 0xA1, 0xF3, 0x26, 0x29, 0x61, 0x5F, 0xBB, 0xEB, 0x62, 0x42, 0x3A, 0x7F, + 0x2F, 0xC5, 0x19, 0xD6, 0x77, 0x9E, 0x1D, 0xF5, 0x15, 0x71, 0x6F, 0x74, + 0x1E, 0xE5, 0xBA, 0x08, 0x21, 0x07, 0x64, 0x9F, 0x78, 0x5A, 0x11, 0x20, + 0xFB, 0x43, 0x4F, 0x4A, 0xFD, 0x6A, 0x2F, 0xB7, 0x66, 0x7A, 0xA5, 0x27, + 0xF7, 0x6F, 0x05, 0x85, 0xCC, 0xC2, 0xC5, 0xDE, 0x18, 0x43, 0xB9, 0x9F, + 0x84, 0xBA, 0x09, 0x1A, 0x0E, 0x7E, 0xBE, 0xBA, 0xE4, 0xD6, 0x1E, 0x9E, + 0x83, 0x7D, 0x1D, 0xED, 0xDE, 0x4D, 0x96, 0x91, 0x50, 0x2D, 0x54, 0x46, + 0x98, 0xC5, 0xE2, 0xE6, 0xE7, 0x6F, 0xB4, 0x06, 0xF0, 0x56, 0x4C, 0x2B, + 0xB1, 0xEC, 0xC4, 0x98, 0x87, 0x76, 0x00, 0xF8, 0x47, 0x70, 0x4F, 0x13, + 0x2C, 0xDE, 0x79, 0x9B, 0xB5, 0x90, 0xFA, 0xC3, 0xAA, 0x0D, 0xB6, 0xCC, + 0x37, 0xB2, 0x5D, 0xB7, 0x8B, 0x19, 0x96, 0x20, 0xFF, 0x0C, 0x21, 0x23, + 0x41, 0xA8, 0x15, 0x3F, 0x03, 0x01, 0x57, 0xA2, 0x7F, 0xF1, 0xE6, 0x4B, + 0x50, 0xC3, 0xD6, 0xF3, 0xEF, 0xE0, 0x7A, 0xEE, 0x76, 0xA0, 0x67, 0x22, + 0x09, 0x45, 0x91, 0x07, 0x87, 0x1E, 0xC6, 0x2A, 0x13, 0x45, 0x10, 0x0E, + 0x72, 0x9E, 0xFB, 0xA0, 0x9C, 0xA4, 0xA3, 0xE7, 0x17, 0xC5, 0x90, 0x30, + 0x42, 0x87, 0x1B, 0x3A, 0xC0, 0xD9, 0xA7, 0x9A, 0xEE, 0xDE, 0x42, 0xFE, + 0x96, 0xD3, 0x7A, 0x3E, 0xBE, 0xAF, 0xE9, 0xCD, 0xEF, 0xA6, 0xD9, 0xC6, + 0x0E, 0x2C, 0xA9, 0xC1, 0x6B, 0x99, 0x11, 0xC2, 0x91, 0x45, 0x0B, 0xC4, + 0xD0, 0xC3, 0xD7, 0xF9, 0x0B, 0x9A, 0x1E, 0x2E, 0xC7, 0x01, 0x22, 0x6A, + 0x75, 0x50, 0x89, 0x79, 0x07, 0x21, 0x8C, 0xF9, 0xA6, 0x15, 0x95, 0xC0, + 0xE3, 0xFC, 0x20, 0x65, 0x36, 0x2D, 0x5F, 0xAE, 0xFE, 0xCE, 0x97, 0x71, + 0xF5, 0x3A, 0xBD, 0xCB, 0xA1, 0x9F, 0x46, 0xA6, 0x3A, 0xA7, 0x7A, 0x26, + 0xA2, 0xDE, 0x36, 0x19, 0x15, 0xDE, 0x17, 0x7E, 0xD7, 0x5E, 0x4A, 0xEE, + 0xE2, 0xC9, 0x53, 0x25, 0x77, 0xC3, 0x18, 0xBB, 0xB4, 0xAA, 0x43, 0xFD, + 0x5C, 0x21, 0x8A, 0x37, 0xDB, 0x1C, 0x3D, 0x36, 0x2E, 0x6D, 0xEA, 0x61, + 0x72, 0x9E, 0xF1, 0x6F, 0xD1, 0x14, 0xF6, 0x29, 0x4E, 0xFD, 0xFD, 0x3D, + 0x4D, 0xB9, 0x25, 0x4B, 0x38, 0xA2, 0x00, 0xEB, 0x14, 0xBA, 0xEE, 0xB1, + 0x03, 0x84, 0x98, 0xF4, 0xCF, 0x05, 0x9E, 0x1C, 0x7A, 0x8F, 0xAE, 0x85, + 0x76, 0x57, 0xF4, 0x8E, 0x16, 0x06, 0x35, 0x77, 0xBB, 0x90, 0x41, 0x9E, + 0xCB, 0x52, 0x97, 0xCA, 0xC1, 0x7F, 0xA9, 0x01, 0x8B, 0x7D, 0xC4, 0xB8, + 0xD9, 0xDC, 0x01, 0x3D, 0x58, 0xF8, 0x10, 0xD1, 0xDF, 0x1A, 0x6A, 0x27, + 0xE2, 0x65, 0x47, 0x1A, 0xC3, 0x8C, 0xDB, 0xE4, 0xC5, 0x5C, 0x72, 0x0D, + 0xAB, 0x84, 0x71, 0x54, 0xE2, 0x0F, 0xBB, 0xDE, 0xE0, 0x1F, 0xB1, 0x70, + 0x08, 0x09, 0x6B, 0x43, 0x72, 0x76, 0x71, 0x7C, 0xA5, 0x87, 0x65, 0x11, + 0x7F, 0xA3, 0x17, 0x93, 0x1C, 0x88, 0x4C, 0x6D, 0x9E, 0x36, 0x17, 0x37, + 0x7F, 0x18, 0xDE, 0x6B, 0xC9, 0xEF, 0x04, 0x95, 0xE6, 0x0A, 0x20, 0xEF, + 0x30, 0x53, 0xED, 0x09, 0x1F, 0x08, 0xA3, 0x42, 0x1B, 0xA5, 0x5F, 0x21, + 0x9D, 0xFF, 0xE1, 0x13, 0x23, 0xC9, 0x36, 0xB4, 0x43, 0x1F, 0x34, 0x2A, + 0x18, 0xC5, 0x26, 0x42, 0xCB, 0xFB, 0xF3, 0x67, 0xA8, 0x5E, 0xF6, 0x14, + 0x50, 0x68, 0xA6, 0xF9, 0x6D, 0x78, 0xB5, 0xF3, 0x8A, 0x14, 0xE3, 0xFE, + 0xB5, 0x7C, 0x88, 0x11, 0x56, 0xDA, 0x9A, 0x62, 0x30, 0x46, 0x34, 0xFB, + 0x9D, 0x99, 0xE0, 0xA6, 0xB2, 0x2F, 0xA6, 0xF3, 0x7F, 0x2D, 0xAC, 0x71, + 0x29, 0x0A, 0x3D, 0x86, 0xB0, 0x75, 0x97, 0xA4, 0xC3, 0x28, 0x9D, 0x6D, + 0x0F, 0xA1, 0x3A, 0xB1, 0xC7, 0xEB, 0xC5, 0x3D, 0x38, 0xE5, 0xED, 0xA6, + 0xD9, 0xDF, 0x25, 0x38, 0x81, 0xBC, 0xBA, 0x73, 0x80, 0x09, 0xED, 0x98, + 0x59, 0xB9, 0xD9, 0x71, 0xD1, 0xD8, 0x6B, 0xF7, 0x08, 0xF8, 0x8E, 0x0A, + 0xD2, 0x57, 0x66, 0xEA, 0x02, 0x5F, 0x8B, 0xF3, 0xAD, 0x62, 0xCA, 0x25, + 0x83, 0xD3, 0xA4, 0x0C, 0x3A, 0x68, 0x8E, 0xFC, 0x8A, 0xDE, 0xD8, 0x42, + 0x47, 0x6C, 0x38, 0x57, 0xE6, 0xD2, 0x6B, 0x42, 0xDD, 0x68, 0x8E, 0xBA, + 0xCD, 0xC7, 0xFB, 0x1C, 0x72, 0x6E, 0xE8, 0x2C, 0x16, 0xCF, 0xB1, 0xEB, + 0x1F, 0x07, 0xF4, 0xEB, 0x56, 0x44, 0xD2, 0xA5, 0xC8, 0xCB, 0x97, 0xD5, + 0x71, 0xA1, 0xAE, 0x11, 0x38, 0x2F, 0x2E, 0xB8, 0x06, 0x80, 0x73, 0xA2, + 0x82, 0xC6, 0x0F, 0x24, 0x58, 0xD9, 0xDB, 0x5A, 0x1A, 0xAC, 0xCA, 0xCA, + 0x6C, 0xB3, 0x74, 0x59, 0x4A, 0xBC, 0x42, 0x80, 0x8D, 0x2A, 0xF7, 0x5E, + 0x12, 0x7F, 0x01, 0x01, 0x6B, 0xF4, 0x0B, 0xFE, 0x83, 0xD1, 0xC9, 0x9C, + 0x11, 0xFE, 0x7C, 0x18, 0xBD, 0xF0, 0xB9, 0x93, 0xEA, 0x5E, 0x6F, 0x95, + 0xA1, 0x06, 0x90, 0xA2, 0xEA, 0xAD, 0xA5, 0x87, 0x23, 0x78, 0x9A, 0x20, + 0x50, 0xAF, 0x38, 0x17, 0x6D, 0x14, 0xBB, 0x68, 0x5C, 0xCB, 0x6E, 0xC7, + 0xD3, 0x11, 0x81, 0x43, 0xD5, 0xE5, 0x87, 0xE4, 0x4E, 0xFB, 0xEE, 0x3E, + 0x3A, 0x6D, 0xEC, 0x79, 0xE5, 0x90, 0x68, 0xCB, 0xF7, 0x01, 0xFF, 0x26, + 0x3B, 0x82, 0xB1, 0x67, 0x04, 0xB7, 0x32, 0x52, 0xA0, 0xFF, 0x60, 0x97, + 0x8D, 0xA9, 0x8C, 0xDC, 0xF3, 0x37, 0xE1, 0x87, 0x1F, 0x95, 0xAD, 0x16, + 0x69, 0x4B, 0xF2, 0x26, 0xE4, 0x79, 0x1C, 0x3C, 0xA8, 0x87, 0x4D, 0x9D, + 0x0D, 0xB2, 0x01, 0x29, 0x22, 0xB6, 0x20, 0x8B, 0x66, 0x8A, 0x1A, 0x09, + 0xF4, 0xE1, 0xAF, 0x52, 0xBA, 0x63, 0xA9, 0x35, 0xD1, 0x1D, 0x4B, 0xDD, + 0xBE, 0x30, 0x11, 0x4E, 0xFE, 0xCD, 0x57, 0x54, 0xFA, 0x39, 0xB4, 0x8C, + 0x2B, 0x0D, 0x83, 0x36, 0x18, 0x81, 0xE5, 0xBA, 0x18, 0xDF, 0x41, 0x5F, + 0x21, 0x25, 0xCE, 0x47, 0x11, 0x56, 0x20, 0x5D, 0x72, 0xFA, 0x54, 0x1E, + 0xF5, 0x0A, 0x31, 0x92, 0x85, 0x95, 0x26, 0x11, 0x26, 0x24, 0x67, 0x84, + 0x1A, 0xA2, 0x71, 0xFB, 0xAE, 0x7E, 0xAE, 0x27, 0xB5, 0x64, 0xF0, 0xF3, + 0x40, 0x55, 0x7D, 0xDB, 0xF3, 0x28, 0x62, 0xDD, 0xF0, 0xFA, 0x41, 0xD7, + 0xCA, 0x38, 0x73, 0x25, 0xD9, 0x13, 0x3E, 0xCB, 0xC2, 0x49, 0x79, 0x10, + 0xE9, 0x43, 0xCD, 0xEA, 0x78, 0x6C, 0x61, 0x36, 0x87, 0xF3, 0x37, 0x80, + 0x08, 0x3C, 0x5B, 0x41, 0x1A, 0x59, 0x3E, 0xA0, 0x2D, 0x07, 0x03, 0x9B, + 0xEE, 0x47, 0xEC, 0xB4, 0xB8, 0xB5, 0x5C, 0x5F, 0x70, 0xAB, 0x04, 0x12, + 0xF7, 0x5A, 0x89, 0xB7, 0x00, 0x6A, 0x2A, 0x37, 0x14, 0x56, 0xA8, 0x03, + 0x45, 0x38, 0xBB, 0xC5, 0x70, 0xAB, 0x4B, 0xBE, 0x6D, 0xEA, 0xA6, 0x27, + 0x1F, 0x19, 0x5A, 0x02, 0x12, 0xE0, 0x9E, 0x83, 0xD9, 0x78, 0x27, 0x34, + 0x6B, 0x81, 0x2A, 0x82, 0x73, 0x80, 0x06, 0x7E, 0x9C, 0xE2, 0xFB, 0x6E, + 0x12, 0xAE, 0xA6, 0x7E, 0x8D, 0xBF, 0xAC, 0x5A, 0x6C, 0x49, 0x81, 0xE7, + 0x03, 0x8C, 0x3C, 0x05, 0x01, 0x61, 0x96, 0xD8, 0x05, 0x62, 0xFA, 0x36, + 0xBC, 0x26, 0x8E, 0xB3, 0x2D, 0x49, 0x80, 0x6B, 0x4D, 0xF1, 0x63, 0x42, + 0x56, 0x53, 0xA8, 0x8E, 0x63, 0xB2, 0xCF, 0x38, 0x31, 0xF0, 0x56, 0x6D, + 0x58, 0x6A, 0xEB, 0x59, 0x07, 0x27, 0x08, 0x1D, 0x64, 0xE2, 0x5A, 0x69, + 0xBE, 0x47, 0xE8, 0xCA, 0xEE, 0x66, 0x3D, 0x95, 0xE3, 0x00, 0x24, 0xAF, + 0xEA, 0xF6, 0xE8, 0x30, 0xB2, 0x24, 0x85, 0x30, 0x28, 0xFB, 0x46, 0x7A, + 0xDC, 0xC1, 0x11, 0xF6, 0xBE, 0xBB, 0x12, 0x92, 0x9E, 0x7A, 0x85, 0x24, + 0x25, 0xF1, 0xFB, 0xDE, 0xD1, 0x1E, 0x46, 0xCE, 0x4D, 0xCC, 0xB4, 0x5D, + 0xD2, 0x41, 0x7F, 0x47, 0x92, 0x1A, 0xAE, 0xB3, 0xB5, 0x26, 0x96, 0xB2, + 0x38, 0x92, 0x33, 0x67, 0x52, 0x3D, 0xA9, 0x3C, 0xA0, 0x46, 0x43, 0xE8, + 0xEE, 0x22, 0x82, 0xD7, 0xEC, 0xBC, 0x79, 0x9E, 0x0F, 0x47, 0x20, 0x32, + 0x48, 0x7E, 0x79, 0x2C, 0x82, 0xD7, 0x57, 0x31, 0xD8, 0xE8, 0xEC, 0x4D, + 0x44, 0x7E, 0x92, 0xB8, 0xA2, 0xE3, 0xC5, 0x09, 0x6C, 0x13, 0xFF, 0xF0, + 0x35, 0x12, 0x63, 0x46, 0x46, 0x35, 0x3F, 0xC7, 0x7C, 0xB8, 0xEA, 0xA7, + 0x96, 0x9D, 0x19, 0xAC, 0x72, 0x44, 0xA5, 0xBC, 0x41, 0xD0, 0x4D, 0xA2, + 0xD7, 0x00, 0x19, 0xFF, 0xD7, 0x3F, 0x09, 0xEB, 0x58, 0xAC, 0x81, 0x9D, + 0xBB, 0x80, 0x74, 0xFA, 0x2E, 0xBC, 0x6D, 0xE6, 0xEB, 0x91, 0x80, 0x5F, + 0x67, 0x03, 0x14, 0x54, 0x65, 0x0A, 0x7D, 0x6C, 0xC1, 0xC9, 0xC0, 0xF4, + 0xE0, 0x7B, 0x6A, 0x45, 0xCF, 0x13, 0x3E, 0x37, 0x07, 0x03, 0x42, 0xCA, + 0xE0, 0xA2, 0xD1, 0x00, 0x00, 0x10, 0xDE, 0xE5, 0x81, 0x9A, 0xD0, 0x14, + 0xF7, 0x98, 0xA5, 0xE1, 0xD3, 0x84, 0xAC, 0x70, 0xC6, 0x75, 0xB4, 0x27, + 0xF5, 0xEB, 0x08, 0x4C, 0x64, 0xC1, 0x74, 0x45, 0xB1, 0x30, 0x48, 0xE4, + 0xAA, 0x99, 0xBD, 0xC0, 0x27, 0xDE, 0x54, 0xA4, 0xC4, 0xFE, 0xDF, 0x69, + 0xF2, 0x46, 0xF8, 0x7E, 0x79, 0x99, 0xFE, 0xD1, 0x4A, 0x77, 0x6C, 0xFA, + 0x13, 0x2C, 0xD3, 0x9B, 0x45, 0x2F, 0x86, 0x0F, 0xB6, 0xAA, 0x76, 0x42, + 0xE7, 0x11, 0x3D, 0xE9, 0x52, 0xC1, 0x3B, 0x17, 0x66, 0x60, 0x1C, 0x67, + 0xA9, 0xF0, 0x83, 0xFF, 0x80, 0x59, 0x4F, 0xAA, 0xC7, 0xE7, 0x95, 0x81, + 0xA0, 0xEE, 0x5D, 0x3D, 0x36, 0xA6, 0x0B, 0x81, 0xFD, 0xD0, 0xF3, 0xE7, + 0x76, 0x7C, 0x11, 0xB4, 0x4F, 0x62, 0xD6, 0x3A, 0x1E, 0x5D, 0xED, 0x91, + 0xB3, 0x55, 0x2D, 0x83, 0xD3, 0xF4, 0xC9, 0x52, 0x59, 0x6B, 0xD2, 0xCA, + 0x22, 0xC4, 0x8D, 0x74, 0xEC, 0x15, 0x47, 0x03, 0x0B, 0xDD, 0x1E, 0x83, + 0x6A, 0xD7, 0x3C, 0x6F, 0x57, 0x67, 0x6B, 0x77, 0x8D, 0x67, 0x98, 0x88, + 0x5D, 0x3C, 0x4C, 0x52, 0x6B, 0xC5, 0x8F, 0x82, 0x10, 0x18, 0x13, 0x3F, + 0xD4, 0x65, 0x18, 0xFC, 0xFA, 0xD7, 0x97, 0xFD, 0x89, 0xC4, 0x82, 0x4E, + 0xB6, 0x40, 0xC0, 0x62, 0x60, 0xB9, 0x95, 0xAB, 0x86, 0xB8, 0xE1, 0x10, + 0xBD, 0xB3, 0xEC, 0x58, 0xDF, 0x13, 0xF4, 0x4D, 0x0A, 0x1D, 0xB8, 0x78, + 0x2C, 0x0D, 0x70, 0xC2, 0xF9, 0xB8, 0x78, 0x10, 0x0E, 0x4D, 0xC6, 0x7B, + 0xED, 0x1D, 0xBF, 0x64, 0x4E, 0xBC, 0xEA, 0x0A, 0x61, 0x49, 0xCE, 0x20, + 0xD1, 0x21, 0x31, 0xEC, 0x30, 0xF9, 0x34, 0x94, 0x46, 0xF0, 0xFF, 0x4E, + 0xFE, 0xB8, 0x6D, 0x78, 0xA5, 0x2C, 0x95, 0xDD, 0x45, 0x1E, 0x73, 0xA1, + 0xC1, 0x7B, 0x60, 0xBD, 0x62, 0x2F, 0x31, 0x59, 0x6D, 0x3D, 0x00, 0x09, + 0x0D, 0x2A, 0xA4, 0x86, 0xF3, 0x5A, 0x12, 0xAA, 0x50, 0x72, 0x8F, 0xA6, + 0x96, 0xFD, 0x27, 0xA5, 0x52, 0xE3, 0xD1, 0x87, 0x8C, 0x00, 0xAE, 0xF9, + 0x98, 0x98, 0x05, 0xD6, 0x89, 0x54, 0x71, 0x7E, 0x8F, 0xA7, 0xFE, 0x40, + 0xAB, 0xEE, 0x04, 0xE2, 0xB2, 0xB5, 0x89, 0xFD, 0x38, 0xF0, 0xF9, 0x63, + 0xAD, 0xBA, 0x2F, 0xF2, 0xF2, 0xC4, 0x7B, 0xF4, 0xE4, 0x10, 0x25, 0x8C, + 0xBD, 0x6A, 0xF3, 0x23, 0x4B, 0xAE, 0xB1, 0x9B, 0x83, 0xF4, 0x1D, 0x12, + 0x54, 0x72, 0xB5, 0xD4, 0xA0, 0xED, 0x4F, 0xA0, 0xBB, 0xBD, 0xEF, 0x4E, + 0xC7, 0xDC, 0x5F, 0x04, 0x8B, 0x4F, 0x28, 0x02, 0x6D, 0x57, 0xE5, 0xD1, + 0x44, 0x86, 0x26, 0xBB, 0x8E, 0x20, 0xC2, 0xCD, 0xD2, 0x1E, 0x49, 0x0E, + 0x71, 0x36, 0xD8, 0x38, 0x7F, 0x18, 0x08, 0x16, 0x98, 0x13, 0x84, 0x39, + 0x1C, 0x17, 0xED, 0x52, 0xE8, 0x43, 0x48, 0x44, 0x00, 0x7C, 0x9C, 0xE8, + 0x80, 0xF3, 0x71, 0xD0, 0x2D, 0xF8, 0x6D, 0xFF, 0x6E, 0x0B, 0xF5, 0x86, + 0xE8, 0x68, 0x25, 0x90, 0xC2, 0x04, 0x0C, 0x30, 0x6B, 0x31, 0x3E, 0x71, + 0x51, 0x98, 0xD6, 0xD8, 0x50, 0xB4, 0xAA, 0xDF, 0x02, 0x0C, 0x78, 0x8F, + 0x5E, 0x29, 0x02, 0xC8, 0xB5, 0xAD, 0x43, 0x9E, 0x59, 0x7D, 0xF1, 0xBB, + 0x1E, 0xCC, 0xA0, 0x78, 0x53, 0xB1, 0x1C, 0x77, 0xAC, 0x55, 0xE1, 0x8C, + 0xE3, 0x65, 0x27, 0x06, 0x79, 0x61, 0x95, 0x9D, 0x93, 0x05, 0xBA, 0x35, + 0xCF, 0xAA, 0x96, 0x4F, 0x9A, 0xD1, 0x4C, 0x71, 0x27, 0xC4, 0x06, 0x5A, + 0xBD, 0x39, 0x26, 0x87, 0x5F, 0x3C, 0x61, 0x94, 0xB9, 0x55, 0x48, 0x03, + 0x06, 0x47, 0x8F, 0x81, 0x88, 0x19, 0x63, 0xE9, 0x3D, 0x8E, 0x6C, 0x5F, + 0x72, 0xDE, 0x48, 0x1B, 0xFF, 0x8C, 0xEC, 0x2B, 0xF1, 0x75, 0x64, 0x03, + 0xE7, 0xA3, 0xB4, 0xCC, 0x19, 0x44, 0x42, 0x96, 0x5C, 0xC4, 0x17, 0x6C, + 0x7A, 0x20, 0xFF, 0xE3, 0xD5, 0x2C, 0xB6, 0x5C, 0x27, 0x97, 0xB3, 0x5B, + 0x7B, 0xBC, 0x65, 0x76, 0xB5, 0xFD, 0x05, 0xD2, 0xA3, 0xC5, 0x79, 0x77, + 0xBF, 0x77, 0x00, 0x7D, 0xA0, 0x0E, 0x53, 0x15, 0x2B, 0xC1, 0xB7, 0x40, + 0xEA, 0xBC, 0x37, 0xE0, 0x52, 0x28, 0xAE, 0x03, 0x4D, 0x3E, 0x95, 0x03, + 0x61, 0x2B, 0x5C, 0x7D, 0x6E, 0x51, 0xCA, 0x49, 0x37, 0xA2, 0xCF, 0xEA, + 0x4C, 0x4B, 0x4D, 0x43, 0xCD, 0xF7, 0xBC, 0xCE, 0xEE, 0x4D, 0xE2, 0x96, + 0x6D, 0xD6, 0xE2, 0x82, 0x92, 0xFE, 0x4C, 0x3E, 0x97, 0xD5, 0xDA, 0x45, + 0xA3, 0xB0, 0xE0, 0x8C, 0x7E, 0x45, 0xF7, 0xE5, 0x9E, 0xB5, 0xA0, 0x63, + 0xE6, 0xC4, 0x0C, 0x02, 0x91, 0x17, 0x4A, 0xC2, 0xD3, 0xB1, 0xDB, 0x85, + 0xD1, 0x90, 0x7F, 0x21, 0x4B, 0x8E, 0xEA, 0x13, 0x55, 0xEE, 0xD5, 0xA2, + 0xA6, 0xB9, 0x09, 0x96, 0xA2, 0xF8, 0xCB, 0xCE, 0xC4, 0x3B, 0x1C, 0x05, + 0xEB, 0x00, 0x13, 0xFC, 0xFC, 0x9F, 0xC0, 0xCD, 0x2C, 0xB0, 0xC5, 0x8F, + 0x38, 0xD7, 0xAB, 0xE4, 0x86, 0xB4, 0xA3, 0x78, 0x1F, 0x36, 0x22, 0xD2, + 0x81, 0x6A, 0xBD, 0xA0, 0x9F, 0x61, 0x92, 0xF8, 0x6A, 0x27, 0x75, 0x72, + 0x06, 0x16, 0x66, 0x76, 0x90, 0x93, 0x29, 0xBD, 0xEB, 0x9D, 0xA5, 0x81, + 0xEF, 0xEB, 0x69, 0x93, 0x8E, 0xE8, 0x17, 0x8F, 0x42, 0x0A, 0x4D, 0xA0, + 0x2D, 0x20, 0xB3, 0x1F, 0x6A, 0xDB, 0x22, 0xE9, 0x24, 0x64, 0x52, 0x06, + 0x65, 0xA5, 0xC5, 0x82, 0x59, 0x47, 0xF4, 0xE9, 0xB9, 0xA3, 0xB1, 0x02, + 0xFC, 0x60, 0x8B, 0x42, 0xF5, 0x23, 0xD8, 0xD8, 0x35, 0x70, 0x38, 0xEB, + 0x5D, 0x15, 0xEF, 0xD6, 0xD3, 0x75, 0x80, 0x6E, 0xBA, 0x2E, 0xD6, 0x11, + 0x54, 0x6E, 0x24, 0xC1, 0xC7, 0x7A, 0xE1, 0xCB, 0xAE, 0x62, 0x27, 0x48, + 0xB7, 0x9C, 0xA7, 0x9E, 0x15, 0xFD, 0xDE, 0xC0, 0xBE, 0xBB, 0xC2, 0x2E, + 0x4A, 0x5C, 0xD4, 0x81, 0xC0, 0x93, 0x58, 0x00, 0x9C, 0xFB, 0x36, 0x27, + 0xD7, 0x72, 0x46, 0x9D, 0xAC, 0xEF, 0xD8, 0x14, 0x1C, 0x58, 0xC0, 0x4E, + 0xD4, 0x16, 0xE1, 0x58, 0x56, 0x25, 0xA9, 0x38, 0xCF, 0x06, 0xAA, 0xA3, + 0x4F, 0x52, 0x70, 0x09, 0x41, 0x44, 0xD0, 0x98, 0x73, 0xED, 0x18, 0xB4, + 0xDB, 0x07, 0xC9, 0xB7, 0xBB, 0x5A, 0xD6, 0x08, 0xE5, 0x89, 0x19, 0xD8, + 0x1A, 0xB6, 0x84, 0x72, 0x1B, 0xEA, 0x14, 0x78, 0x96, 0xB4, 0x2D, 0x61, + 0x20, 0x8D, 0x9A, 0xD2, 0x87, 0x23, 0x18, 0x7A, 0xA3, 0x70, 0x4D, 0xA6, + 0xBB, 0xEE, 0x99, 0x78, 0xD8, 0x94, 0xF1, 0x35, 0x91, 0x45, 0xDB, 0x2A, + 0x8A, 0xDD, 0x8F, 0xC5, 0x05, 0x17, 0xB6, 0x69, 0x4E, 0xD2, 0xF0, 0x16, + 0x09, 0x14, 0x65, 0xE0, 0x76, 0x6B, 0x33, 0xE8, 0x4D, 0xDF, 0xAF, 0x5A, + 0x0C, 0xF6, 0xB0, 0x29, 0xEF, 0xB9, 0x85, 0x96, 0x16, 0xED, 0x03, 0x45, + 0xFA, 0x6F, 0x03, 0x64, 0x62, 0x6D, 0x32, 0x75, 0x82, 0x32, 0x14, 0x23, + 0x5A, 0x85, 0xFF, 0xFE, 0x65, 0x52, 0xBC, 0xAD, 0x99, 0xC2, 0xDA, 0x8B, + 0x86, 0xC0, 0x2E, 0x78, 0x38, 0xDF, 0x5E, 0x83, 0xDE, 0xE0, 0x72, 0xD5, + 0x91, 0x6B, 0xDB, 0xDF, 0x7F, 0xA7, 0x8B, 0xA4, 0x5B, 0x10, 0x93, 0x4D, + 0xA4, 0xB4, 0x22, 0xC1, 0xB3, 0xBE, 0x8B, 0x56, 0x82, 0xB9, 0x33, 0x85, + 0x01, 0xFA, 0xF5, 0x95, 0x9D, 0x0C, 0xBC, 0xD4, 0xB0, 0x2F, 0x94, 0xD9, + 0x2E, 0xDA, 0xB9, 0x49, 0xC5, 0x53, 0xA2, 0xE9, 0x4D, 0x81, 0xDE, 0xC0, + 0xF8, 0x01, 0x60, 0xEA, 0xAA, 0x57, 0x66, 0xA5, 0x5D, 0x4B, 0x6D, 0xEC, + 0x85, 0xBF, 0x10, 0x18, 0x43, 0xD1, 0xD7, 0xA2, 0xBA, 0x72, 0x09, 0x63, + 0x71, 0xB2, 0xA2, 0x14, 0x52, 0x94, 0xFD, 0x40, 0xA6, 0x89, 0x1B, 0xD5, + 0x16, 0x7D, 0xB1, 0x22, 0x00, 0xF7, 0x62, 0x12, 0x5E, 0xBB, 0xA1, 0x03, + 0x6C, 0x3D, 0x32, 0x1C, 0xD8, 0x3A, 0xB5, 0x24, 0xF6, 0x64, 0x67, 0xCD, + 0x47, 0xEB, 0x6A, 0xFB, 0x94, 0xCE, 0xA6, 0xF4, 0x9D, 0x2B, 0xBD, 0x50, + 0x2A, 0x53, 0x63, 0xEF, 0x7B, 0x94, 0x68, 0x26, 0xE2, 0xD8, 0x13, 0x5A, + 0xD2, 0xE3, 0x1D, 0x01, 0xE4, 0xB8, 0x3C, 0x42, 0x07, 0x3B, 0x14, 0x01, + 0xEB, 0x18, 0xBF, 0x39, 0xD9, 0xC4, 0xD6, 0x41, 0xB2, 0xE7, 0xCD, 0x02, + 0x86, 0x8B, 0xA7, 0x77, 0x5D, 0xC9, 0x5C, 0xC0, 0xBE, 0xDE, 0x3D, 0x67, + 0xA3, 0xD7, 0xDA, 0xB5, 0x88, 0x39, 0xEA, 0x9D, 0x7A, 0xF7, 0x99, 0x3E, + 0xDE, 0xF9, 0x36, 0x1E, 0xBB, 0xAB, 0x61, 0x8C, 0xB2, 0xB9, 0x61, 0x18, + 0x7D, 0x4A, 0x32, 0x7E, 0xCC, 0x71, 0xBC, 0xC6, 0xAA, 0xDE, 0x08, 0xFF, + 0xEE, 0x44, 0x4B, 0xD7, 0xC1, 0xDB, 0xCE, 0xFE, 0x89, 0x56, 0x03, 0xDA, + 0x3A, 0xF5, 0xD3, 0x9D, 0x39, 0x63, 0x92, 0x33, 0x50, 0x13, 0x8B, 0x7B, + 0x5A, 0xC0, 0x79, 0xED, 0x40, 0xAD, 0x1B, 0x53, 0x50, 0x74, 0x0A, 0xA0, + 0xA7, 0x5D, 0x5B, 0x61, 0x85, 0x93, 0x8A, 0xB9, 0xA9, 0x2C, 0x0F, 0xA2, + 0xBD, 0x7A, 0x33, 0xF3, 0xD6, 0xD6, 0x64, 0x60, 0xCF, 0x12, 0x88, 0x08, + 0x13, 0x0B, 0xC2, 0x76, 0xEC, 0x4B, 0x75, 0x74, 0xCC, 0x60, 0xF8, 0x9E, + 0xAD, 0x40, 0xFD, 0x5E, 0x58, 0x2D, 0x08, 0xB7, 0x6C, 0xB6, 0x27, 0x73, + 0x4B, 0x31, 0x03, 0x1D, 0x7A, 0xC5, 0x59, 0x67, 0x1F, 0x5C, 0xDE, 0x08, + 0x24, 0x0D, 0xB9, 0x33, 0x97, 0x51, 0xC6, 0xC3, 0x13, 0xE0, 0xFC, 0x45, + 0xDA, 0x5F, 0xFC, 0xA9, 0x8E, 0x71, 0x54, 0x1C, 0x3A, 0x4D, 0xFB, 0x7B, + 0x06, 0xFB, 0x65, 0xB1, 0x27, 0x0B, 0x8C, 0xAF, 0xF2, 0xA0, 0x12, 0xA6, + 0xD7, 0xAC, 0x27, 0xC1, 0x55, 0xE7, 0x17, 0x81, 0xFD, 0xA2, 0xF8, 0xC3, + 0x17, 0x55, 0x9B, 0x00, 0xFE, 0x91, 0xA9, 0xDC, 0xDE, 0xB0, 0xD7, 0x5D, + 0x2A, 0xE8, 0x87, 0xF2, 0x1B, 0x28, 0x19, 0x20, 0x63, 0x9E, 0xD8, 0x7E, + 0x85, 0xF3, 0x87, 0x0D, 0xAF, 0x35, 0xA5, 0x9F, 0x3B, 0xE7, 0x44, 0x8D, + 0x63, 0xDE, 0xEB, 0x7E, 0xC7, 0xD2, 0x0F, 0x09, 0x30, 0xE3, 0xE2, 0x7B, + 0xEA, 0x74, 0xAD, 0x46, 0x7D, 0xB4, 0xB8, 0x0C, 0xF1, 0xD3, 0xFA, 0x07, + 0xF3, 0xDD, 0xC5, 0xB1, 0x00, 0xF2, 0xD6, 0xBD, 0x4B, 0xBD, 0xAC, 0xC8, + 0xBB, 0xA7, 0xD4, 0x53, 0xDE, 0x73, 0x0D, 0xED, 0xFB, 0x84, 0x4C, 0x82, + 0x47, 0x0D, 0x2D, 0x9D, 0x2B, 0x0C, 0x4A, 0x4D, 0x4B, 0xD4, 0x3A, 0x4D, + 0x64, 0x27, 0xD8, 0x59, 0x27, 0xD3, 0x41, 0x73, 0xA5, 0xCB, 0xF5, 0x31, + 0xA2, 0x88, 0x99, 0x79, 0xFB, 0x2B, 0x9A, 0xBA, 0x68, 0x88, 0x35, 0x12, + 0x15, 0x11, 0xF6, 0xEA, 0x9A, 0x1B, 0x2A, 0xE1, 0x95, 0x5B, 0x15, 0xAB, + 0x79, 0xE2, 0x5A, 0x4A, 0x6E, 0xE2, 0xF7, 0x63, 0x74, 0x52, 0xB5, 0x9B, + 0xA9, 0x58, 0x5D, 0x78, 0xAB, 0x61, 0x40, 0xA5, 0x6F, 0x99, 0x80, 0x06, + 0xCA, 0x73, 0x82, 0x78, 0x64, 0x8F, 0xE4, 0xA7, 0x2F, 0x9F, 0x6D, 0x50, + 0x80, 0x11, 0xF4, 0xE9, 0xE3, 0x63, 0x2A, 0x96, 0x0C, 0xFC, 0x3C, 0xE0, + 0xAA, 0xF7, 0x05, 0x55, 0x28, 0xB0, 0x76, 0x24, 0x87, 0xDA, 0x29, 0x28, + 0x05, 0xA9, 0x61, 0x0B, 0x66, 0x3C, 0xA0, 0x51, 0x5E, 0xCE, 0xF5, 0x80, + 0x0F, 0x1C, 0x90, 0xDD, 0x56, 0x52, 0x07, 0xDF, 0xB4, 0xE6, 0x92, 0x4A, + 0x57, 0x97, 0x71, 0xAB, 0x58, 0xF3, 0x03, 0x43, 0x99, 0x49, 0x1A, 0xFC, + 0x96, 0x29, 0x31, 0x15, 0x30, 0x6D, 0xCA, 0x92, 0x39, 0x68, 0xF6, 0xAE, + 0xDE, 0x56, 0x74, 0x53, 0xC5, 0xCA, 0xBE, 0x09, 0x0C, 0x88, 0xEE, 0xEC, + 0xE9, 0xE8, 0xD0, 0x6A, 0x55, 0x6A, 0xB2, 0xDF, 0x41, 0x79, 0xC8, 0x44, + 0xD1, 0x2B, 0x6B, 0x5F, 0xB4, 0x27, 0x02, 0xFE, 0x9E, 0x70, 0x48, 0xE9, + 0xE8, 0x9B, 0x44, 0x5D, 0x19, 0xB7, 0x24, 0x47, 0x42, 0x0D, 0x1D, 0xA9, + 0x26, 0x07, 0x70, 0xC4, 0x36, 0x6A, 0x03, 0xA2, 0xBD, 0x60, 0x65, 0x9A, + 0x92, 0x6F, 0x0A, 0x1B, 0xE6, 0x36, 0x7B, 0xA4, 0x55, 0x79, 0xBF, 0x7B, + 0x27, 0xBE, 0x6D, 0x67, 0x01, 0x6D, 0xB7, 0x49, 0x7C, 0x3F, 0x99, 0x1B, + 0x4E, 0xFB, 0x32, 0x3A, 0xE5, 0x76, 0x0B, 0x96, 0xC6, 0x55, 0xC5, 0x90, + 0x5F, 0x80, 0x19, 0x77, 0xAD, 0xB1, 0x5F, 0x6C, 0x75, 0x41, 0x1E, 0x07, + 0x58, 0x6F, 0x6D, 0xB5, 0xDA, 0x2E, 0x3E, 0x2B, 0x76, 0xAA, 0x4D, 0xF5, + 0x3F, 0x9A, 0x56, 0x31, 0x53, 0x74, 0x1F, 0xA6, 0xC3, 0x97, 0xAE, 0x8A, + 0x3E, 0x8B, 0x76, 0xE1, 0x2C, 0x77, 0x6C, 0x70, 0xEC, 0xBB, 0xD5, 0xA5, + 0xA7, 0x30, 0x4B, 0xE8, 0xA6, 0x29, 0xAC, 0xE6, 0x6F, 0x8E, 0xC7, 0xFF, + 0xBA, 0xD9, 0xCB, 0x62, 0xE8, 0x2E, 0xD7, 0xCF, 0xA3, 0x02, 0xD4, 0x55, + 0x88, 0x2D, 0x12, 0x9D, 0x6A, 0x19, 0x50, 0xB4, 0x98, 0xFA, 0x29, 0xF5, + 0x2E, 0xFF, 0xF2, 0xD4, 0xAD, 0x04, 0x85, 0xF4, 0xB6, 0x22, 0x56, 0x03, + 0x50, 0x3F, 0x96, 0x5D, 0xDE, 0xCD, 0x0D, 0xB3, 0xC5, 0xFB, 0xDB, 0xAC, + 0x7F, 0xBD, 0xC1, 0xB6, 0xD0, 0x20, 0xCF, 0x30, 0x5E, 0x62, 0xD6, 0xF9, + 0x44, 0x19, 0xF3, 0x96, 0x0D, 0x72, 0xF8, 0xFB, 0x71, 0xB1, 0x9D, 0xA7, + 0x77, 0x6E, 0xDD, 0xD2, 0x1B, 0xD9, 0x39, 0xAB, 0x10, 0x26, 0x18, 0xB8, + 0x56, 0x92, 0x6E, 0x9B, 0xC2, 0x3D, 0x9B, 0x94, 0x88, 0x9E, 0x2B, 0x4D, + 0x79, 0xF6, 0x8D, 0xC6, 0x23, 0x0B, 0x8D, 0xF4, 0xB3, 0x00, 0x8C, 0xD4, + 0x4F, 0xE1, 0xA1, 0x2B, 0x9F, 0xE7, 0x3D, 0xE9, 0x04, 0x65, 0xD4, 0x21, + 0x87, 0x44, 0xDB, 0x00, 0x30, 0x23, 0x7A, 0x94, 0xC1, 0xE7, 0x4B, 0xC4, + 0xA0, 0xA6, 0x90, 0x20, 0x99, 0xE6, 0x98, 0x48, 0x67, 0xB6, 0x49, 0x90, + 0x20, 0xB4, 0xA0, 0xA8, 0x90, 0x1E, 0x1B, 0x49, 0x50, 0x41, 0x7B, 0xC5, + 0x02, 0xF3, 0xFF, 0xB1, 0x6D, 0x39, 0x79, 0x1C, 0x3C, 0x5E, 0xC7, 0x98, + 0x1F, 0xD9, 0x52, 0x49, 0x75, 0x59, 0x01, 0x1A, 0xC1, 0x82, 0xBD, 0xDB, + 0x1A, 0x86, 0xD8, 0x9F, 0x12, 0x93, 0xD2, 0x80, 0x13, 0xDE, 0x79, 0x3D, + 0xB6, 0xEB, 0xC5, 0x47, 0x75, 0x24, 0xE3, 0x70, 0x8E, 0x20, 0xBE, 0x78, + 0x26, 0x15, 0xBD, 0xD4, 0x5B, 0x9D, 0x6D, 0x7B, 0x02, 0x80, 0x73, 0x44, + 0xA2, 0xC7, 0x22, 0x8D, 0xAD, 0x19, 0xD0, 0x38, 0x2B, 0xEA, 0x4F, 0xDE, + 0x68, 0x84, 0x3C, 0x77, 0x6B, 0xA2, 0x6C, 0x9A, 0x56, 0x13, 0x75, 0x66, + 0x8A, 0x91, 0x87, 0xDA, 0xC4, 0x24, 0xE6, 0xC5, 0x14, 0xE7, 0x91, 0x0B, + 0x40, 0xBD, 0x7D, 0x8A, 0x3A, 0x0D, 0x39, 0xB5, 0x65, 0x1A, 0xF6, 0x0F, + 0x79, 0x4D, 0xED, 0x07, 0x8F, 0xE4, 0x48, 0xA3, 0x7A, 0xE8, 0x9F, 0x09, + 0x5B, 0x9E, 0x30, 0x46, 0xA8, 0x63, 0x89, 0x9E, 0xAF, 0xD1, 0x8F, 0xBE, + 0x53, 0x20, 0x07, 0xDE, 0x54, 0x8B, 0x8B, 0x98, 0xED, 0x76, 0xD7, 0x3A, + 0xE9, 0x40, 0xEC, 0x27, 0x64, 0xDC, 0x66, 0xD4, 0x32, 0x22, 0x43, 0x7E, + 0xE0, 0x3E, 0xF8, 0x15, 0xAB, 0xDE, 0xAA, 0xC4, 0x13, 0x7F, 0x56, 0x4E, + 0x57, 0xC8, 0x69, 0x27, 0xD4, 0xC6, 0x6B, 0x72, 0x71, 0xB8, 0xA4, 0x7A, + 0x2F, 0x82, 0x7D, 0xEE, 0x0C, 0x21, 0xCE, 0xDF, 0xA5, 0x56, 0x01, 0xFC, + 0xD2, 0xE7, 0x48, 0x35, 0xD6, 0x8C, 0x87, 0xEF, 0xD8, 0xE1, 0xDC, 0xFC, + 0x60, 0x1D, 0xD7, 0x81, 0xE5, 0xE2, 0x83, 0x83, 0xF7, 0x14, 0xDA, 0xC8, + 0x64, 0xA1, 0xDC, 0xBF, 0x6A, 0x0D, 0xB4, 0x5D, 0xCB, 0x1E, 0xDF, 0xA7, + 0xE7, 0x37, 0xDE, 0xCD, 0x35, 0x27, 0xAF, 0x18, 0xD3, 0xB3, 0xC5, 0xF1, + 0x69, 0x57, 0xCD, 0xE4, 0x64, 0x07, 0x50, 0x08, 0x80, 0x80, 0x6A, 0x2F, + 0xD3, 0x1E, 0xA8, 0xC9, 0xA7, 0x6C, 0xFD, 0xA1, 0x91, 0xF3, 0x06, 0x12, + 0x97, 0x56, 0x9E, 0x37, 0x6A, 0x3D, 0x30, 0x0E, 0x0D, 0x88, 0x1D, 0x47, + 0xCC, 0x95, 0x53, 0xAA, 0xF4, 0xDC, 0x11, 0x9C, 0xD5, 0xBA, 0xDA, 0xA6, + 0xAC, 0xE3, 0xC6, 0x14, 0x54, 0x75, 0xA9, 0x22, 0x31, 0x0E, 0x58, 0x6B, + 0xF6, 0x3E, 0x42, 0x54, 0x81, 0xF1, 0x26, 0x60, 0x42, 0x7E, 0xD7, 0x15, + 0x7C, 0x1A, 0xB3, 0x48, 0x74, 0x7E, 0x2A, 0xBC, 0x32, 0xEA, 0x37, 0x98, + 0x56, 0x7C, 0x06, 0x44, 0xD3, 0xC6, 0x91, 0x8D, 0x8A, 0xA0, 0xF6, 0x8E, + 0x84, 0x11, 0xC1, 0xEB, 0x9A, 0x39, 0x1A, 0xF2, 0xA7, 0x78, 0x17, 0x21, + 0x3B, 0xBF, 0x32, 0x5B, 0x9C, 0x61, 0x6A, 0xDD, 0x96, 0x55, 0x62, 0x38, + 0x57, 0x6F, 0xA8, 0x7A, 0xB3, 0x44, 0x85, 0x6C, 0x4B, 0x06, 0xD6, 0x8E, + 0xAF, 0x6F, 0x30, 0x03, 0xBA, 0x88, 0xE4, 0x2A, 0x61, 0x58, 0x33, 0x34, + 0xC9, 0xBF, 0x52, 0xC4, 0x11, 0x71, 0xD1, 0x65, 0xEC, 0x07, 0x40, 0x92, + 0x4A, 0x39, 0x4A, 0xF1, 0x6A, 0x37, 0x25, 0x82, 0x91, 0x4A, 0x68, 0x98, + 0xAA, 0x25, 0xDC, 0xD4, 0xCB, 0x51, 0x15, 0x46, 0xE4, 0xF0, 0x06, 0xA1, + 0x5B, 0x7F, 0xCA, 0xC9, 0xC9, 0xD7, 0x91, 0xF3, 0x9F, 0x0E, 0xC0, 0x69, + 0x37, 0x48, 0x81, 0x0C, 0xF4, 0x15, 0x51, 0x9E, 0xE3, 0x73, 0xAC, 0xDF, + 0x57, 0x49, 0x2A, 0xF6, 0x98, 0x72, 0x5C, 0x43, 0x2A, 0x63, 0x40, 0x94, + 0xF1, 0xB4, 0x0B, 0xBD, 0x79, 0x67, 0xB8, 0xAB, 0xAE, 0xD4, 0x9C, 0xFA, + 0x2F, 0x64, 0x0D, 0x33, 0xB7, 0x7F, 0x9E, 0xC4, 0xB7, 0xE6, 0xCB, 0x5E, + 0x61, 0x60, 0x29, 0x6D, 0xB7, 0xC9, 0xCA, 0x7D, 0xE2, 0x43, 0x1E, 0x95, + 0x04, 0xE1, 0xA9, 0x6B, 0xBD, 0x5F, 0xB2, 0xBF, 0x07, 0x1C, 0xFF, 0x30, + 0x74, 0x9A, 0xBC, 0xC4, 0xD5, 0x5C, 0x00, 0x32, 0x76, 0xA6, 0xDD, 0x25, + 0x3D, 0x53, 0xD0, 0x38, 0x34, 0x53, 0x7B, 0xD6, 0xBF, 0x0E, 0x84, 0xA0, + 0x96, 0xF9, 0x8A, 0x82, 0x8D, 0x94, 0x60, 0x57, 0xE2, 0x54, 0xBE, 0x44, + 0x96, 0xF7, 0x86, 0xF5, 0x39, 0x0D, 0x05, 0xA7, 0xB6, 0x74, 0xA5, 0x41, + 0xB3, 0x0A, 0xB0, 0x5D, 0x91, 0xCB, 0x85, 0x79, 0x83, 0x4B, 0xC6, 0x55, + 0x57, 0x68, 0x8C, 0x91, 0x2F, 0x2A, 0xB8, 0x4A, 0x08, 0x82, 0x1F, 0xEC, + 0x9A, 0x68, 0x11, 0x4C, 0x22, 0x2C, 0x90, 0x86, 0x7E, 0xA5, 0x71, 0x46, + 0xB5, 0xE0, 0x2B, 0x3F, 0x21, 0x8E, 0xCD, 0x41, 0xA3, 0x96, 0xA5, 0x9E, + 0x88, 0x9D, 0xC0, 0x06, 0x64, 0x4A, 0x4B, 0x3A, 0xD4, 0xA1, 0xE7, 0x16, + 0xD4, 0x3E, 0x57, 0xD2, 0x0C, 0xDA, 0xE1, 0x34, 0xD8, 0xD6, 0x58, 0xF7, + 0x86, 0xBD, 0xF6, 0xC4, 0xBC, 0xDA, 0x21, 0x74, 0xCA, 0x8A, 0xA6, 0xAA, + 0x30, 0xEF, 0x25, 0x1F, 0x32, 0x7B, 0x49, 0xA6, 0xEF, 0x9B, 0x95, 0x51, + 0x83, 0x34, 0xB8, 0xB8, 0x3E, 0xCE, 0xF6, 0x85, 0x21, 0x3F, 0xE2, 0x93, + 0x5E, 0x52, 0xBF, 0x8D, 0xE7, 0xDD, 0xCE, 0xDF, 0x0B, 0x99, 0xB4, 0xB3, + 0x89, 0x31, 0x70, 0xAE, 0x82, 0x4D, 0xF5, 0xD1, 0x31, 0xF7, 0x04, 0xB2, + 0x8A, 0x6A, 0xD8, 0xAD, 0x36, 0x50, 0x7D, 0x5B, 0xD5, 0xD1, 0x26, 0x07, + 0xB0, 0x40, 0xF0, 0x93, 0x4C, 0x17, 0xCD, 0x3F, 0xC3, 0x65, 0x95, 0x25, + 0xF4, 0x58, 0x12, 0xEE, 0xAA, 0xE6, 0x86, 0xAB, 0x92, 0x90, 0x18, 0xCD, + 0xBD, 0x9A, 0x98, 0xFB, 0x64, 0x17, 0x61, 0xF7, 0x04, 0x8B, 0x26, 0xD6, + 0x13, 0xA2, 0x0C, 0x7C, 0xB7, 0x98, 0x35, 0xD0, 0x47, 0x2C, 0x44, 0xB0, + 0xA6, 0x5E, 0x96, 0xAE, 0x60, 0x54, 0x15, 0x1C, 0x1F, 0xEF, 0x95, 0x2A, + 0x7F, 0xF5, 0x11, 0x8B, 0xD2, 0xFA, 0x9D, 0x2B, 0x80, 0xD7, 0xA3, 0x0E, + 0x25, 0xFD, 0x61, 0xA1, 0x59, 0xEF, 0xFA, 0xC6, 0x7D, 0x8C, 0xE2, 0x0E, + 0xD5, 0x3B, 0x7F, 0x0A, 0x9B, 0x07, 0x66, 0x2A, 0x10, 0xF7, 0x58, 0x97, + 0x78, 0xB5, 0x9E, 0x8C, 0x17, 0x10, 0x36, 0x8F, 0x7E, 0xB5, 0x62, 0xDD, + 0xBA, 0x53, 0x62, 0x20, 0x86, 0x69, 0x0B, 0x44, 0xDF, 0x3A, 0xEA, 0x0B, + 0xB6, 0xD8, 0xDD, 0x3E, 0x0F, 0x0D, 0xD0, 0x37, 0xDC, 0x2D, 0xD7, 0xEF, + 0xB6, 0xD7, 0x4E, 0x2B, 0xFE, 0xA1, 0x4B, 0xDC, 0xC2, 0x69, 0xEA, 0x04, + 0x79, 0x6E, 0xC2, 0xD4, 0xD6, 0xC7, 0x3D, 0x21, 0x7C, 0xBD, 0x12, 0x4C, + 0x3A, 0x0F, 0xA6, 0xB9, 0xA8, 0x64, 0xF0, 0x13, 0x24, 0x9C, 0xD9, 0xC8, + 0x97, 0xBB, 0xAD, 0x31, 0x3D, 0x74, 0x6C, 0x6D, 0x62, 0xE7, 0x4E, 0x54, + 0xC9, 0xEA, 0x0C, 0x65, 0xA5, 0xF8, 0x4A, 0xC1, 0x7C, 0x26, 0x6B, 0x3F, + 0x71, 0x06, 0xA8, 0xE6, 0xD5, 0x41, 0xCF, 0xD3, 0xFB, 0x6C, 0x88, 0xBC, + 0x82, 0xE1, 0x4D, 0x5F, 0x3C, 0x48, 0x61, 0xB4, 0xA1, 0x17, 0x43, 0x18, + 0x8E, 0xA3, 0xD2, 0xDE, 0xF5, 0x11, 0xE7, 0x6F, 0xBA, 0x9D, 0x00, 0x8E, + 0x59, 0x6D, 0xC5, 0x1C, 0x59, 0x38, 0xD5, 0x3D, 0x1F, 0xB9, 0x20, 0xDA, + 0x91, 0xF3, 0xA6, 0x79, 0x91, 0xD4, 0x6A, 0x96, 0xB6, 0xDE, 0xF6, 0xD9, + 0xB7, 0x43, 0xD9, 0x14, 0x03, 0x61, 0x69, 0x6B, 0xF1, 0x96, 0x91, 0x5B, + 0xA6, 0x47, 0xA5, 0x87, 0x07, 0x5C, 0xB7, 0x33, 0xE1, 0x35, 0xFA, 0x71, + 0x0B, 0xF0, 0x15, 0x96, 0x1D, 0xA7, 0x01, 0x88, 0xEC, 0x94, 0xC5, 0xD1, + 0x62, 0x53, 0x0F, 0xD9, 0x37, 0x88, 0x7B, 0x83, 0x9F, 0x59, 0x19, 0xB6, + 0xC3, 0x6F, 0x98, 0xF7, 0x40, 0x34, 0x10, 0x84, 0xB3, 0x66, 0x72, 0x4E, + 0x9B, 0x5B, 0xD5, 0xCE, 0x84, 0x47, 0x6C, 0xBB, 0x89, 0xC0, 0xD7, 0x07, + 0x11, 0x20, 0xD8, 0x2E, 0x27, 0x52, 0x3C, 0x33, 0x9E, 0xC9, 0x9F, 0x9F, + 0x4A, 0x5F, 0x73, 0xC9, 0xBE, 0xC9, 0x63, 0xD9, 0xF1, 0xDA, 0xE6, 0x3B, + 0x09, 0xC0, 0xAA, 0x55, 0xD1, 0xA6, 0x31, 0xF6, 0xB4, 0x3D, 0xED, 0x79, + 0x56, 0xE8, 0xB9, 0x04, 0xC6, 0x5D, 0x10, 0x81, 0x86, 0xB8, 0xD4, 0x32, + 0xF8, 0x7B, 0xC4, 0x9C, 0x89, 0x68, 0x26, 0x8C, 0xA1, 0xC2, 0x40, 0x34, + 0x4B, 0xAD, 0x06, 0xC9, 0x31, 0xD1, 0xDD, 0xE6, 0xB8, 0x77, 0x82, 0xA4, + 0xFE, 0x8F, 0x74, 0x69, 0x8E, 0xFF, 0x33, 0xB8, 0xAE, 0x29, 0x99, 0x92, + 0x37, 0x8B, 0x82, 0x73, 0x51, 0xE3, 0x0D, 0x5A, 0x88, 0xBE, 0x20, 0x12, + 0x7E, 0x04, 0x1A, 0xDA, 0x76, 0x79, 0x34, 0x15, 0xA3, 0x52, 0x5D, 0x77, + 0x90, 0x41, 0xFD, 0x32, 0xA5, 0x43, 0x27, 0x03, 0xEC, 0xD6, 0x05, 0x49, + 0x6E, 0x0F, 0x21, 0xD2, 0xBD, 0x5E, 0x2C, 0x46, 0x8C, 0x07, 0xAB, 0x64, + 0xA3, 0x00, 0x52, 0x6F, 0x65, 0x87, 0x91, 0x2A, 0x88, 0x3F, 0x93, 0x5C, + 0xC6, 0x2F, 0xD2, 0xF6, 0x7E, 0x6D, 0x48, 0xC8, 0x7E, 0x29, 0x37, 0x3E, + 0xA5, 0xA6, 0x04, 0x3B, 0x55, 0x65, 0xB5, 0x9B, 0x49, 0x72, 0x9C, 0xB7, + 0xE6, 0xC4, 0x6D, 0x6A, 0xBD, 0x71, 0x60, 0x6B, 0xBD, 0x60, 0x2E, 0x43, + 0xFE, 0x84, 0x88, 0xD8, 0x8C, 0x81, 0xD1, 0xB0, 0x8F, 0xAA, 0xA0, 0x91, + 0x9B, 0x1E, 0xE2, 0xA7, 0x1D, 0x56, 0x89, 0x72, 0xE7, 0xD3, 0xE1, 0x58, + 0x4E, 0x07, 0x30, 0x75, 0xDE, 0xCD, 0x00, 0xD2, 0xF6, 0xFB, 0x2D, 0x5D, + 0xAA, 0x29, 0xF7, 0xEB, 0x84, 0x16, 0x28, 0x17, 0xEB, 0xC9, 0x6D, 0x18, + 0xE9, 0x22, 0xF2, 0xED, 0x11, 0xBC, 0xDC, 0x33, 0x91, 0x01, 0xC9, 0x6F, + 0x96, 0xD1, 0x89, 0xEB, 0xEF, 0x47, 0x55, 0x93, 0xF1, 0x94, 0x2D, 0xDE, + 0x40, 0x2B, 0x9E, 0xDB, 0x02, 0x9E, 0xB8, 0xA9, 0x7E, 0x9D, 0xB6, 0xBF, + 0x96, 0x87, 0x3F, 0x07, 0x8D, 0x43, 0x58, 0x70, 0x92, 0xB8, 0x41, 0x7A, + 0x05, 0x3F, 0x1F, 0xA7, 0x0B, 0x5B, 0x29, 0xB1, 0x6C, 0x76, 0xB3, 0x44, + 0x6C, 0x6F, 0x82, 0x74, 0x10, 0xAB, 0xF0, 0x29, 0x20, 0x6D, 0x00, 0x1E, + 0x42, 0x89, 0x8B, 0x79, 0x4B, 0x6A, 0xF0, 0x9D, 0x5E, 0x1C, 0x05, 0x7B, + 0x2B, 0x57, 0xB3, 0x45, 0xBF, 0x5A, 0x72, 0x46, 0x01, 0xFB, 0xF6, 0x03, + 0x14, 0xBB, 0x1A, 0x1C, 0x62, 0xCA, 0x9B, 0x40, 0xB9, 0xAE, 0x48, 0x4A, + 0xC9, 0x0E, 0x0A, 0x26, 0x85, 0x2C, 0x01, 0x92, 0x3F, 0xE1, 0x22, 0x3B, + 0xBC, 0x25, 0xF6, 0x08, 0xB7, 0x7E, 0x94, 0x45, 0x18, 0x9B, 0x48, 0xEE, + 0x5E, 0xD0, 0xC6, 0x74, 0x34, 0xAF, 0x6E, 0x66, 0xBC, 0x0C, 0xAA, 0x6D, + 0xD6, 0x1A, 0xC1, 0x0F, 0xAC, 0xF6, 0x97, 0x20, 0xCF, 0xF3, 0x9A, 0x78, + 0xCA, 0x1B, 0x9F, 0x25, 0x52, 0x3D, 0xA9, 0x35, 0x0D, 0xEA, 0x12, 0xCF, + 0x0C, 0x32, 0x53, 0x5A, 0x55, 0x4B, 0x99, 0x05, 0x80, 0x56, 0xB6, 0xE2, + 0x59, 0xC8, 0x37, 0x0F, 0x4C, 0x79, 0xEF, 0xE5, 0xE0, 0x41, 0x0A, 0x4C, + 0x1E, 0x5F, 0x85, 0x90, 0xC7, 0x66, 0x28, 0xAB, 0xD7, 0xF1, 0x91, 0x60, + 0xE7, 0x77, 0x28, 0x01, 0x7C, 0xA8, 0x2A, 0x23, 0x84, 0x76, 0x91, 0xAA, + 0x65, 0xA4, 0xFF, 0xEC, 0xA2, 0x02, 0x36, 0x9A, 0x43, 0x18, 0xAA, 0x0F, + 0x81, 0x26, 0x8F, 0x8B, 0x9C, 0x46, 0x2C, 0x53, 0x63, 0x01, 0x5C, 0x44, + 0x4B, 0xBC, 0x28, 0xEA, 0x2F, 0x4E, 0x57, 0x72, 0x35, 0xA3, 0x85, 0x4F, + 0x27, 0x22, 0xB5, 0x92, 0x5F, 0x5B, 0xD0, 0x78, 0x49, 0xAF, 0x42, 0x1F, + 0x0B, 0x19, 0x9E, 0x17, 0xB0, 0xA6, 0xFB, 0x2F, 0xD7, 0x82, 0x60, 0x11, + 0xB6, 0x63, 0x4C, 0x65, 0x44, 0xD1, 0xB4, 0x9A, 0xDA, 0x7A, 0xF8, 0x6E, + 0xA5, 0xAE, 0x55, 0x32, 0x46, 0xDD, 0xE5, 0xB8, 0xC3, 0xC6, 0xDC, 0xC4, + 0x49, 0x2C, 0x35, 0x2A, 0x2F, 0xFE, 0x85, 0xEE, 0xD0, 0xD7, 0x5E, 0xF1, + 0xD9, 0xE9, 0x23, 0xCB, 0x96, 0xAE, 0x30, 0x22, 0x54, 0x80, 0x93, 0x9A, + 0xD5, 0x7C, 0x0A, 0xF9, 0x47, 0x1F, 0x02, 0x80, 0x21, 0xFF, 0x53, 0x39, + 0xC6, 0xB7, 0x73, 0xDE, 0x4B, 0x03, 0xC8, 0xB7, 0xBF, 0x34, 0x0F, 0xCB, + 0x37, 0xD1, 0x5F, 0x53, 0x5F, 0x05, 0x62, 0x2D, 0x62, 0xC4, 0xB6, 0xED, + 0x82, 0xC3, 0x19, 0x09, 0xFD, 0xC8, 0x93, 0xAB, 0x63, 0xB2, 0xA5, 0x6B, + 0x97, 0x82, 0x37, 0x29, 0xBF, 0x97, 0x54, 0xFE, 0x9B, 0x32, 0xFD, 0x51, + 0xE9, 0x14, 0xE1, 0x74, 0x07, 0x2B, 0xFA, 0x39, 0x1C, 0x6A, 0x5B, 0xA3, + 0x5B, 0x7E, 0xB6, 0xD9, 0x66, 0x82, 0x0D, 0xF9, 0xD7, 0x9C, 0x64, 0xE8, + 0x2A, 0x73, 0x98, 0x95, 0x31, 0xCF, 0xAE, 0xBE, 0x6D, 0x57, 0x69, 0x34, + 0x4E, 0x58, 0x0A, 0xD1, 0x5A, 0x94, 0x8F, 0xFE, 0xF5, 0xD6, 0x4E, 0x73, + 0xC0, 0x96, 0x4E, 0xFD, 0x21, 0x25, 0xC4, 0xB6, 0x11, 0xFA, 0xA7, 0x41, + 0x7E, 0xB2, 0xFC, 0x42, 0x14, 0x16, 0x90, 0xC9, 0x74, 0x5D, 0x4A, 0x25, + 0x73, 0xE1, 0x63, 0x7E, 0x81, 0xF9, 0x3F, 0x8E, 0x24, 0x4C, 0x61, 0x02, + 0xD5, 0xF8, 0xB2, 0x2E, 0xF3, 0x80, 0x79, 0xBF, 0x13, 0xA0, 0x38, 0xC7, + 0x0E, 0x4E, 0x2C, 0x22, 0x46, 0x0E, 0x29, 0xEE, 0x2A, 0x8C, 0xDD, 0x86, + 0x33, 0xB7, 0xF0, 0xCC, 0x0F, 0x13, 0x7E, 0x03, 0x07, 0xB3, 0x3E, 0x97, + 0xC5, 0x6F, 0xDC, 0xFF, 0x96, 0x23, 0xCB, 0x69, 0x8B, 0x86, 0x94, 0x6D, + 0x86, 0xEF, 0x2F, 0x5C, 0x31, 0x7F, 0xF7, 0x22, 0x96, 0x61, 0x88, 0x75, + 0x3C, 0x76, 0x97, 0x12, 0x1A, 0xEF, 0x70, 0x7D, 0x6A, 0x17, 0xF5, 0xB1, + 0xB5, 0x68, 0x50, 0x91, 0xDD, 0x88, 0x0F, 0xCB, 0x33, 0x73, 0xB9, 0xBF, + 0xC6, 0x65, 0xAE, 0x15, 0x6B, 0x20, 0xCF, 0x8A, 0xDF, 0xDF, 0x5D, 0xAD, + 0xE8, 0x45, 0x69, 0x7D, 0x1C, 0x1B, 0xF2, 0xAC, 0xCD, 0x9D, 0x9F, 0xB8, + 0x6D, 0x57, 0x16, 0x92, 0xCC, 0x1A, 0xF2, 0xC2, 0x62, 0xEE, 0xE2, 0x71, + 0x2D, 0x58, 0xAB, 0xB7, 0x60, 0x4D, 0xDB, 0xEF, 0x88, 0xC2, 0x2B, 0x39, + 0x8B, 0x4C, 0x0F, 0xEF, 0xEB, 0x86, 0x16, 0x34, 0x49, 0x9E, 0x1E, 0x24, + 0xFC, 0xE9, 0x77, 0x2A, 0xD2, 0x75, 0x76, 0x96, 0x24, 0xD3, 0x33, 0x4D, + 0x8B, 0xDD, 0x92, 0xBE, 0xBF, 0xE5, 0xB0, 0x12, 0x92, 0x0C, 0x89, 0xD8, + 0x73, 0xE2, 0xA6, 0xD7, 0xF3, 0x15, 0x59, 0x76, 0x9F, 0x3B, 0x10, 0xC1, + 0xA4, 0x9B, 0x64, 0xC8, 0x4B, 0xD4, 0xEE, 0x63, 0xA7, 0xF7, 0xE9, 0xB4, + 0x43, 0x50, 0xC4, 0x7B, 0xE1, 0x7A, 0x53, 0x6D, 0xC8, 0x17, 0x82, 0x31, + 0xE4, 0x53, 0xF3, 0x20, 0xF0, 0xE9, 0x78, 0xAF, 0x8F, 0x95, 0x96, 0xA8, + 0xE9, 0x0E, 0xFE, 0x10, 0x51, 0x8E, 0xF1, 0x64, 0x89, 0x2B, 0x0B, 0xE1, + 0xCE, 0xA1, 0xA9, 0xCA, 0xF0, 0xD4, 0xD3, 0xAA, 0x49, 0xE3, 0x68, 0x76, + 0xDE, 0x20, 0x77, 0xCB, 0x92, 0x60, 0x36, 0x66, 0x82, 0x06, 0x6D, 0xDF, + 0x11, 0xF7, 0xA3, 0x07, 0x43, 0x18, 0x48, 0x89, 0x40, 0x19, 0x72, 0xAD, + 0xF5, 0x06, 0x0B, 0x61, 0x87, 0xD9, 0x48, 0x17, 0x8A, 0x0D, 0xC8, 0x6C, + 0xD9, 0xC9, 0x9D, 0xEE, 0x08, 0x16, 0x1F, 0x0D, 0x88, 0xB5, 0xEF, 0x5B, + 0x2F, 0x40, 0xAE, 0x71, 0x0F, 0x02, 0x96, 0xAF, 0x2C, 0xC8, 0x8E, 0x86, + 0x64, 0x58, 0xF1, 0x7C, 0xE9, 0x86, 0xDB, 0xCF, 0x57, 0x5E, 0xF9, 0x57, + 0x7E, 0x85, 0xAE, 0x8B, 0x6A, 0x1E, 0x9B, 0x2B, 0x0D, 0xE2, 0x07, 0xDE, + 0x42, 0x76, 0x79, 0x72, 0x25, 0xBB, 0xD6, 0xDA, 0xD8, 0x8D, 0xE4, 0x34, + 0xF6, 0xC6, 0xBB, 0x00, 0x62, 0x22, 0x4D, 0x0F, 0x90, 0xD1, 0x35, 0x20, + 0x6B, 0x3C, 0x43, 0xB2, 0xBF, 0xED, 0xCA, 0x5D, 0xC2, 0x0F, 0x5A, 0x94, + 0x87, 0xE3, 0x61, 0x94, 0x85, 0xE4, 0x24, 0x63, 0xEF, 0x8C, 0xD9, 0x7B, + 0xEE, 0x24, 0x5C, 0x51, 0x4A, 0xF1, 0x6B, 0xEB, 0xD6, 0x5A, 0x0F, 0xCE, + 0x3B, 0x29, 0xAE, 0x86, 0xAA, 0xFF, 0xEC, 0x66, 0x54, 0x45, 0xA4, 0x86, + 0xD1, 0x3F, 0x2C, 0xEF, 0xF1, 0x71, 0x33, 0x4E, 0xB8, 0x16, 0x1A, 0xB2, + 0x18, 0x6E, 0xCD, 0xBA, 0x59, 0xDB, 0x52, 0xE8, 0x49, 0x78, 0x75, 0x5C, + 0x9F, 0x97, 0xB7, 0x00, 0x57, 0x11, 0xB1, 0x9D, 0x99, 0x0C, 0xA2, 0x54, + 0xDD, 0x0A, 0x03, 0xF5, 0xAA, 0x0D, 0xBF, 0x47, 0x2D, 0xC0, 0x41, 0x3A, + 0x29, 0x0A, 0xA5, 0x8C, 0x77, 0x38, 0xA5, 0x4F, 0xE9, 0x9C, 0x7E, 0x23, + 0x7E, 0xEF, 0x8F, 0xB3, 0x45, 0x96, 0xA5, 0xDC, 0xAC, 0x1A, 0x44, 0xEE, + 0xE4, 0x1C, 0x17, 0x01, 0x7E, 0x26, 0x9D, 0xA0, 0x90, 0xD8, 0x4F, 0x5A, + 0x14, 0x99, 0x46, 0x51, 0x1F, 0x29, 0xFA, 0xE2, 0xB6, 0xEB, 0x71, 0x1A, + 0xF4, 0xE2, 0x59, 0x32, 0x18, 0x66, 0x31, 0x73, 0x58, 0x23, 0xF3, 0xDC, + 0xCB, 0x73, 0xBF, 0x04, 0xB5, 0xBD, 0xAD, 0x4D, 0x67, 0x96, 0x84, 0xFA, + 0x60, 0x48, 0x97, 0x32, 0xED, 0x55, 0xB1, 0x90, 0xD3, 0x15, 0xFA, 0xD9, + 0xE4, 0x9E, 0x65, 0x72, 0x8D, 0xC5, 0x16, 0x99, 0xC9, 0xE7, 0xF7, 0x29, + 0xAD, 0xF7, 0xDB, 0x4C, 0x0A, 0xD0, 0x40, 0xBE, 0x26, 0xF4, 0xC3, 0x89, + 0x70, 0xE1, 0x82, 0xF1, 0x95, 0xB3, 0xB8, 0x64, 0xE4, 0xBA, 0x2E, 0x4C, + 0x4A, 0x93, 0x41, 0x21, 0xF1, 0xBD, 0x2C, 0x8E, 0x15, 0xFC, 0xC2, 0x33, + 0x9E, 0x76, 0xAD, 0xCE, 0x93, 0xED, 0x4D, 0x04, 0x27, 0x71, 0xDB, 0x21, + 0x0A, 0xDE, 0x48, 0xAD, 0x43, 0x6F, 0xF7, 0x97, 0x7B, 0xBC, 0xCD, 0x5A, + 0xDE, 0x60, 0x07, 0x07, 0x2A, 0x83, 0xF4, 0x25, 0x6A, 0xD1, 0xBF, 0xB2, + 0x3B, 0xF7, 0x4E, 0x46, 0xB0, 0x34, 0xC2, 0x93, 0x45, 0xB9, 0xE6, 0x32, + 0x8E, 0x75, 0x67, 0x12, 0x06, 0x46, 0x7B, 0xB1, 0xD6, 0xEC, 0x91, 0x73, + 0x87, 0x99, 0x3E, 0x9E, 0xBB, 0xAC, 0x0C, 0x94, 0xCC, 0xBD, 0x33, 0xCF, + 0x27, 0x65, 0x70, 0x18, 0x49, 0x27, 0xD9, 0xAF, 0x17, 0x43, 0x16, 0x99, + 0xD3, 0x0A, 0xB9, 0xE9, 0xD6, 0x4A, 0xDE, 0x9C, 0x9C, 0x3F, 0xE8, 0x25, + 0xB8, 0xB9, 0xAE, 0xB6, 0x5B, 0xD5, 0x9E, 0x5E, 0x41, 0x41, 0xDE, 0xC8, + 0x8E, 0xE3, 0xEC, 0x88, 0xE8, 0xD6, 0x09, 0x16, 0xAB, 0x5C, 0x93, 0xC5, + 0xAC, 0xA8, 0x70, 0x14, 0x8B, 0x9D, 0x87, 0x27, 0xC9, 0x07, 0x83, 0x94, + 0xD3, 0xBD, 0x38, 0xF8, 0x92, 0xB9, 0xB0, 0xFB, 0xC2, 0xCF, 0x69, 0x0A, + 0x6E, 0x39, 0xB4, 0x11, 0xD7, 0x54, 0xCF, 0x2C, 0x87, 0x94, 0x7E, 0xD8, + 0x6D, 0xED, 0x54, 0xDF, 0xBA, 0xF6, 0x57, 0x2E, 0xE6, 0x5B, 0x26, 0x3E, + 0xD2, 0xA3, 0xE6, 0xB3, 0x9B, 0x75, 0xD5, 0xBD, 0x76, 0x9E, 0xE5, 0x82, + 0xA8, 0x4A, 0x2B, 0xC5, 0x45, 0x80, 0xC5, 0x55, 0x0A, 0x72, 0x78, 0x58, + 0x3E, 0x88, 0x9D, 0x7D, 0x7C, 0x23, 0xE8, 0xCD, 0x1C, 0xAF, 0x7C, 0x43, + 0xB1, 0xE0, 0x19, 0x96, 0x5C, 0xBC, 0xF7, 0x2A, 0x60, 0xF2, 0x50, 0x54, + 0xCC, 0xE7, 0xF4, 0xD7, 0x2D, 0xDF, 0x03, 0xBB, 0x77, 0xCE, 0x9C, 0xB3, + 0x9F, 0xC0, 0xBC, 0xC3, 0xBB, 0x47, 0xC6, 0xAE, 0x1A, 0x0A, 0x57, 0x52, + 0xA5, 0x75, 0xB5, 0x32, 0x62, 0x9A, 0x11, 0xD6, 0x45, 0x03, 0xFC, 0xAA, + 0x43, 0x55, 0x4D, 0xDC, 0xE8, 0x0F, 0xBC, 0x46, 0x5B, 0x57, 0x37, 0x9F, + 0xD4, 0x5E, 0xFC, 0xD4, 0x7A, 0x1B, 0x67, 0xB7, 0x2A, 0xBE, 0x6A, 0x58, + 0xF6, 0x21, 0x20, 0x29, 0x90, 0xC9, 0xB1, 0x25, 0x05, 0xF2, 0x95, 0x5F, + 0xA2, 0x3E, 0x39, 0xFC, 0xF0, 0x08, 0x61, 0xE5, 0xB2, 0x9A, 0xFB, 0xE0, + 0x9D, 0x40, 0x5D, 0xE4, 0x2D, 0x62, 0x37, 0x8E, 0x02, 0x5A, 0xA1, 0xD5, + 0x63, 0x9A, 0xE2, 0x77, 0x46, 0xC6, 0xD1, 0x10, 0xAA, 0x46, 0x1D, 0x22, + 0x46, 0x2F, 0xE9, 0x95, 0xF4, 0xD5, 0x69, 0xE6, 0x70, 0xDC, 0x09, 0x4E, + 0x0D, 0xA6, 0xD6, 0x16, 0x97, 0xD1, 0x4C, 0xD3, 0xD7, 0x0B, 0x4C, 0x97, + 0x66, 0xC0, 0x3F, 0x91, 0xB0, 0x9E, 0x2F, 0x00, 0xF1, 0x10, 0x78, 0x50, + 0x9F, 0xC6, 0x38, 0xC5, 0x46, 0xB0, 0x45, 0x53, 0x4F, 0x01, 0x7C, 0x46, + 0xB2, 0x85, 0xBE, 0x89, 0xB3, 0x99, 0x33, 0xCB, 0x84, 0x07, 0x45, 0x40, + 0x16, 0x0E, 0x2F, 0xE7, 0x5D, 0x0E, 0xFE, 0xF7, 0x68, 0xF3, 0x70, 0xED, + 0x8C, 0x82, 0x2F, 0x48, 0x65, 0xD2, 0xCD, 0x3E, 0x65, 0xC3, 0xCD, 0x7A, + 0x3D, 0xAD, 0xA0, 0xB4, 0x29, 0x57, 0x26, 0xF1, 0xFF, 0xA1, 0x92, 0x9F, + 0x64, 0xAF, 0x1D, 0xB4, 0xF1, 0xDD, 0x4F, 0xC8, 0x1C, 0x1A, 0x8A, 0x26, + 0x3D, 0xBC, 0xC8, 0x57, 0x92, 0xDB, 0xAA, 0x5D, 0x5B, 0x7F, 0x77, 0xC5, + 0x47, 0x02, 0x34, 0x25, 0x60, 0xC5, 0x7B, 0x8C, 0x84, 0x30, 0x9D, 0xF2, + 0x8A, 0x14, 0x6D, 0x55, 0x14, 0xA4, 0xA2, 0x56, 0xFC, 0x26, 0x9F, 0x1B, + 0x66, 0xCC, 0x5F, 0x69, 0xF5, 0x9B, 0x43, 0xA0, 0xFC, 0x84, 0x00, 0x1F, + 0x85, 0x6A, 0x9C, 0x23, 0x99, 0x6F, 0xF1, 0xFC, 0x8E, 0x07, 0xC4, 0x62, + 0x73, 0xEA, 0xFD, 0x7F, 0x92, 0x28, 0xE1, 0xC1, 0x51, 0x5B, 0xDC, 0x2D, + 0xB1, 0x88, 0xE5, 0x8C, 0x69, 0x18, 0xF3, 0xD7, 0xFF, 0x76, 0x35, 0x83, + 0x0A, 0x54, 0x59, 0x22, 0x31, 0x83, 0x26, 0xB8, 0x5F, 0x26, 0xA7, 0x73, + 0x50, 0xB1, 0xB7, 0x53, 0x82, 0x2C, 0x15, 0x65, 0xDF, 0xF9, 0x5E, 0x2A, + 0x9A, 0x7E, 0x19, 0xEE, 0xBE, 0xDE, 0xA8, 0xB2, 0x82, 0x58, 0x06, 0xE1, + 0xD1, 0xAB, 0xE6, 0x15, 0x7A, 0x31, 0x1B, 0x4B, 0xF6, 0xEE, 0x49, 0x25, + 0xB3, 0x68, 0xFE, 0x25, 0x6C, 0x46, 0x9B, 0x88, 0xFA, 0x4C, 0xFC, 0x90, + 0xA5, 0x6B, 0x40, 0x07, 0xDB, 0xA5, 0xE5, 0x97, 0x20, 0xD5, 0xE3, 0x0A, + 0xC9, 0xB8, 0x55, 0xDD, 0x9B, 0xBA, 0x11, 0x06, 0x4C, 0x3D, 0x34, 0x09, + 0xD1, 0xAA, 0x87, 0x5B, 0x95, 0xDD, 0xF9, 0x5D, 0x7E, 0x53, 0xE3, 0x31, + 0x46, 0xAB, 0x33, 0x12, 0x0B, 0xB8, 0xEB, 0x4C, 0x2F, 0x95, 0x0D, 0x39, + 0xD5, 0xB4, 0xED, 0x96, 0xCE, 0xC0, 0x5A, 0xA3, 0x16, 0xB8, 0x9A, 0x68, + 0xDC, 0xE9, 0x3B, 0xC6, 0x36, 0x75, 0x8C, 0x8E, 0x25, 0x97, 0xF7, 0x81, + 0xC2, 0xAC, 0x3F, 0x5E, 0x6B, 0x4C, 0x7E, 0x95, 0xAE, 0xD1, 0x50, 0x91, + 0x15, 0x67, 0x8E, 0xC8, 0xF2, 0x81, 0x8A, 0x6B, 0xBF, 0x4B, 0xC6, 0xAF, + 0xCD, 0x04, 0xCC, 0x16, 0xA2, 0x43, 0x7A, 0x78, 0x56, 0xC1, 0x7E, 0xC8, + 0xBE, 0x91, 0x9D, 0x7B, 0x9C, 0xAC, 0x7E, 0x18, 0xFA, 0xEB, 0xAD, 0x1F, + 0x28, 0xE0, 0x61, 0x81, 0xC3, 0xD3, 0x24, 0x78, 0x08, 0xE6, 0xD5, 0x91, + 0x83, 0x36, 0xA4, 0x1A, 0xB8, 0xCF, 0x93, 0x4F, 0x26, 0x6C, 0xC1, 0x7F, + 0x48, 0x93, 0xD2, 0xD6, 0xC2, 0x33, 0x5C, 0x9D, 0x3F, 0x84, 0x7C, 0xD7, + 0x8B, 0xBC, 0x9A, 0xDC, 0x46, 0x84, 0xCC, 0x72, 0xF7, 0x7C, 0xEE, 0xA8, + 0x37, 0x54, 0x77, 0xD8, 0x21, 0x44, 0xA3, 0x3A, 0xBD, 0xCF, 0x65, 0xF3, + 0xDB, 0xD0, 0x6F, 0xCA, 0x19, 0xCD, 0xAC, 0xBD, 0x66, 0x92, 0x89, 0xDF, + 0x2B, 0xFE, 0x8D, 0x28, 0xBA, 0x79, 0x5B, 0xBF, 0x66, 0x67, 0x05, 0xE9, + 0xA6, 0xFD, 0x56, 0xD6, 0x63, 0x8A, 0x23, 0x01, 0x24, 0x5A, 0x6D, 0x43, + 0xCD, 0x26, 0x13, 0x2E, 0x48, 0x46, 0x01, 0x20, 0x52, 0x5A, 0xD8, 0x34, + 0x75, 0xF5, 0x4E, 0x63, 0x56, 0x17, 0x35, 0x10, 0x29, 0x4B, 0xDD, 0x0B, + 0xA5, 0xAF, 0x95, 0x92, 0xEE, 0x11, 0x99, 0xD2, 0xEA, 0x30, 0x80, 0x16, + 0xB3, 0xF8, 0x96, 0x24, 0xED, 0x98, 0x5F, 0x4F, 0x02, 0xBB, 0x69, 0xDD, + 0x30, 0x1C, 0xBE, 0x3F, 0x1B, 0x33, 0x2A, 0xA7, 0x83, 0xD7, 0x0E, 0x3D, + 0x49, 0x58, 0xEF, 0x61, 0x0D, 0x1C, 0x6B, 0x1B, 0x41, 0xB7, 0xB3, 0x64, + 0xF9, 0xE1, 0x1F, 0xF2, 0x4B, 0xC8, 0xED, 0xC7, 0xEE, 0x3A, 0xCB, 0xCD, + 0x18, 0x40, 0x28, 0x2F, 0x1C, 0x41, 0x02, 0x31, 0x7A, 0xC3, 0x71, 0x75, + 0x21, 0x49, 0x65, 0x6D, 0x32, 0xAC, 0x06, 0x42, 0x11, 0x96, 0xB2, 0xEC, + 0xD9, 0x5D, 0xD3, 0xB4, 0xB1, 0x21, 0xFF, 0x98, 0x9F, 0xD6, 0x77, 0x70, + 0x6B, 0xA4, 0x6E, 0x45, 0x69, 0x8C, 0xDB, 0x77, 0x92, 0x80, 0xF3, 0x82, + 0x95, 0x2E, 0x73, 0xA6, 0x7E, 0xAA, 0x6F, 0xE2, 0x78, 0x82, 0x9E, 0x78, + 0x3C, 0xB7, 0x5A, 0x90, 0xA0, 0xE8, 0xB4, 0x5D, 0x7A, 0xA8, 0xCE, 0xAC, + 0xBA, 0x00, 0xEA, 0x0F, 0xDF, 0x6B, 0x75, 0x4C, 0x0D, 0x1C, 0x30, 0x7F, + 0x6E, 0xFA, 0x03, 0xDC, 0x6B, 0x48, 0xE0, 0x74, 0xD9, 0xB9, 0x67, 0x9D, + 0x0B, 0x55, 0xD3, 0xFE, 0x68, 0x79, 0xF7, 0x10, 0x7F, 0x9E, 0xE1, 0xB9, + 0x60, 0xE7, 0x54, 0x13, 0x67, 0x2C, 0x04, 0x48, 0xDF, 0xD9, 0x85, 0x2C, + 0xFF, 0x1E, 0x01, 0x61, 0x0F, 0x74, 0x2C, 0x21, 0x69, 0x3F, 0xE6, 0x7A, + 0xF3, 0xD7, 0xE6, 0xD3, 0xBF, 0x77, 0x83, 0xC8, 0xF5, 0x5D, 0xF4, 0x4D, + 0xC6, 0x0B, 0xEC, 0x46, 0x39, 0xDA, 0xBD, 0x39, 0x51, 0xB9, 0xF2, 0xC3, + 0x48, 0x41, 0xDA, 0x1E, 0x2F, 0xD8, 0xFB, 0x7F, 0x9E, 0x9C, 0x10, 0xF1, + 0xB2, 0x2A, 0x14, 0xD1, 0x3C, 0x38, 0x0F, 0x21, 0x9D, 0xAF, 0x64, 0x95, + 0x46, 0x6A, 0xD2, 0x28, 0x14, 0x16, 0xF0, 0x28, 0x43, 0xC9, 0x81, 0x1D, + 0x1E, 0xB7, 0x0D, 0x84, 0x8B, 0x30, 0xFD, 0xE3, 0xBB, 0x46, 0x5E, 0xFD, + 0xEA, 0x0A, 0x9E, 0x02, 0x3F, 0x5E, 0xE5, 0x00, 0x97, 0xFB, 0x0D, 0xEA, + 0xF8, 0x66, 0x7F, 0xB3, 0x6D, 0x2E, 0xFD, 0xC8, 0x15, 0x97, 0xE0, 0xDB, + 0x44, 0x59, 0xBC, 0x32, 0xB7, 0x70, 0x61, 0x88, 0xC9, 0x81, 0x21, 0xA4, + 0x82, 0x8D, 0x27, 0x67, 0x33, 0x31, 0xE5, 0x6B, 0x94, 0x26, 0xB9, 0xC3, + 0xB8, 0x45, 0x69, 0x5D, 0x0B, 0xD2, 0xB1, 0x3A, 0x03, 0x40, 0x8B, 0x06, + 0x79, 0x76, 0x63, 0x24, 0x61, 0xB9, 0x26, 0x64, 0x14, 0xC3, 0x9C, 0x9A, + 0xFA, 0xD9, 0xBF, 0x7B, 0x6A, 0xB3, 0x2B, 0x9C, 0x9A, 0x8D, 0x9A, 0x11, + 0x9B, 0xF7, 0x9D, 0xD2, 0xF8, 0xE4, 0x74, 0x6D, 0x5E, 0x12, 0xD9, 0xC2, + 0xE3, 0x7D, 0xDE, 0xDA, 0x57, 0xD6, 0xEF, 0x9A, 0xB1, 0x13, 0xF0, 0xC5, + 0x99, 0x5B, 0x88, 0xE2, 0x9B, 0xDF, 0x3B, 0x62, 0x9F, 0x3C, 0x10, 0x38, + 0x91, 0xFA, 0x97, 0x82, 0x44, 0x36, 0x65, 0x8C, 0xA2, 0x47, 0x9B, 0x10, + 0x12, 0x96, 0xA1, 0x4E, 0x0E, 0x57, 0x42, 0x62, 0xF4, 0xE6, 0xAF, 0x23, + 0xC0, 0xB4, 0xA0, 0x49, 0x5A, 0x33, 0xA9, 0x4D, 0xB1, 0xB0, 0x5B, 0x0C, + 0x6A, 0x67, 0x47, 0xFB, 0x03, 0x7C, 0x1F, 0x15, 0xA1, 0x72, 0x99, 0xBE, + 0x84, 0x58, 0x68, 0x36, 0x13, 0x34, 0x0C, 0x20, 0x11, 0xDB, 0x68, 0x30, + 0x9F, 0xEA, 0x05, 0x99, 0xDC, 0x30, 0xF3, 0xA7, 0xA9, 0x3C, 0x7D, 0xA8, + 0x3C, 0x0D, 0x43, 0xCB, 0xCC, 0xA5, 0x40, 0xCF, 0x0F, 0xF4, 0x34, 0x91, + 0x79, 0x36, 0xB8, 0x4D, 0x25, 0x3E, 0xF7, 0x69, 0xC7, 0x31, 0x9D, 0x45, + 0xEC, 0x3C, 0x3D, 0x99, 0x13, 0x54, 0x19, 0x3D, 0xDD, 0x2B, 0xE9, 0x6B, + 0xE0, 0xCE, 0xB7, 0xBF, 0x8F, 0x47, 0x0F, 0x1A, 0x43, 0x14, 0x4C, 0xAB, + 0xD4, 0xEE, 0xAC, 0x55, 0x0C, 0x4D, 0x7E, 0xA5, 0x40, 0xE9, 0xD0, 0x0A, + 0xC0, 0xCD, 0xB8, 0xB4, 0x31, 0x63, 0xEB, 0x78, 0xE9, 0x32, 0x19, 0xE3, + 0xFB, 0xA4, 0xCF, 0x48, 0x39, 0x92, 0xA5, 0xAA, 0xA0, 0x4E, 0xA1, 0xF3, + 0x2E, 0x1A, 0x59, 0x62, 0xA4, 0xC0, 0x7B, 0xAC, 0xCA, 0xAD, 0x52, 0xA4, + 0xB7, 0x6F, 0x4B, 0x67, 0x5E, 0x5E, 0x2A, 0xE0, 0xEC, 0x9B, 0xA7, 0xD6, + 0x65, 0xD4, 0x60, 0xF3, 0x48, 0xDF, 0x45, 0xF3, 0xFD, 0xB5, 0x0F, 0xC9, + 0xE6, 0x10, 0x78, 0x4D, 0xAD, 0x30, 0xD1, 0x07, 0xEA, 0x38, 0x6A, 0xE3, + 0x3B, 0x10, 0x99, 0x1A, 0xA6, 0xDE, 0x2D, 0x9D, 0x1D, 0xCE, 0x5D, 0x26, + 0x76, 0x25, 0x87, 0x43, 0xA1, 0xBD, 0xE9, 0xA9, 0xB8, 0xA0, 0x1E, 0x88, + 0x1A, 0x6A, 0x99, 0x79, 0x01, 0x32, 0x3A, 0x4C, 0x3B, 0xC1, 0xB5, 0x18, + 0x72, 0x32, 0x0F, 0x7B, 0x91, 0x38, 0x66, 0x8A, 0x16, 0x12, 0xAF, 0xBE, + 0x5F, 0x73, 0xA3, 0x0A, 0x1D, 0x97, 0x35, 0x87, 0x53, 0x27, 0xB6, 0x5B, + 0x43, 0x12, 0xB4, 0xEC, 0xF0, 0x2F, 0x16, 0x59, 0x6E, 0x11, 0x2C, 0x20, + 0x11, 0xAB, 0x84, 0x2B, 0x7F, 0x9C, 0x82, 0x19, 0x5D, 0xD3, 0x9A, 0x18, + 0xA2, 0xFF, 0x38, 0x7A, 0x07, 0xD3, 0xBE, 0x23, 0x5C, 0x33, 0x00, 0x99, + 0xFE, 0xE0, 0xFC, 0xC0, 0x35, 0x05, 0x89, 0xFF, 0x58, 0x93, 0x20, 0x41, + 0xDC, 0xD0, 0x27, 0x31, 0xA0, 0xD5, 0xAC, 0xBF, 0x78, 0x87, 0x23, 0x33, + 0xBF, 0x52, 0xE2, 0xDB, 0x24, 0xB8, 0x83, 0xE1, 0x26, 0x42, 0x8C, 0x1D, + 0xD4, 0xD4, 0xFC, 0xE3, 0x34, 0xF4, 0x5D, 0x98, 0x17, 0xA1, 0xC4, 0x2A, + 0x48, 0x3C, 0x4E, 0x89, 0x7D, 0x03, 0x38, 0xE3, 0x13, 0x66, 0xD4, 0x76, + 0xB2, 0x93, 0xD2, 0x9C, 0x75, 0x3F, 0xD3, 0x91, 0x34, 0xAF, 0x61, 0x55, + 0x1D, 0xE8, 0x4C, 0x2F, 0x59, 0x2A, 0x64, 0x05, 0xB9, 0x1D, 0xC1, 0x0B, + 0x1F, 0x4B, 0xFF, 0x83, 0xAB, 0xBE, 0xB7, 0xB5, 0xF2, 0x23, 0x78, 0xD1, + 0xA3, 0x81, 0x8F, 0xF2, 0x7C, 0xC6, 0xE7, 0x9F, 0x29, 0xD2, 0x81, 0xFE, + 0x50, 0x1C, 0xE7, 0xEF, 0xBF, 0x7F, 0x1C, 0x2A, 0x3F, 0x1A, 0x7C, 0x5E, + 0xF7, 0xF5, 0x1B, 0x11, 0x8D, 0xB1, 0xF3, 0xC7, 0xE3, 0x38, 0x43, 0x56, + 0x1A, 0x1E, 0x26, 0xE6, 0xD4, 0x15, 0x84, 0x03, 0x04, 0x49, 0xBD, 0xA0, + 0xC0, 0x21, 0xC8, 0x8E, 0xC9, 0x96, 0x9B, 0xFA, 0xCA, 0x98, 0xAE, 0x2F, + 0xE2, 0x9A, 0x9B, 0xEC, 0x29, 0x8F, 0xF2, 0x04, 0xEA, 0x94, 0xB9, 0x70, + 0xED, 0xB1, 0x4E, 0x2B, 0x5C, 0x65, 0x00, 0x79, 0x41, 0x53, 0x4B, 0x9D, + 0xFA, 0x90, 0x22, 0x52, 0x76, 0x51, 0xEC, 0xC2, 0x50, 0xCC, 0x6C, 0xA1, + 0x5B, 0x4A, 0xAC, 0x58, 0x8F, 0x97, 0x0D, 0xFE, 0xE5, 0x3C, 0x24, 0x34, + 0xDC, 0xF2, 0x7A, 0x81, 0xA7, 0x9D, 0x3D, 0x28, 0x87, 0xCF, 0xF3, 0xD2, + 0x51, 0x0D, 0xF1, 0x5C, 0x01, 0xD5, 0x58, 0x72, 0x33, 0xD7, 0x48, 0x4A, + 0x75, 0xF5, 0x1A, 0x10, 0xF1, 0x12, 0x76, 0x70, 0xD2, 0x0E, 0x3A, 0x9B, + 0x09, 0x23, 0x66, 0xED, 0x15, 0xB7, 0xEB, 0x5D, 0xEF, 0x66, 0xEB, 0x8F, + 0xAF, 0xD7, 0xDC, 0xF6, 0x5E, 0xA5, 0xED, 0xA8, 0x77, 0xE2, 0xC0, 0xF6, + 0x19, 0xFE, 0x38, 0xEC, 0x2D, 0xCC, 0x82, 0xC6, 0x21, 0x22, 0x69, 0x67, + 0xE4, 0x86, 0x26, 0x0E, 0xCC, 0x88, 0x55, 0x6A, 0x17, 0xC6, 0xD0, 0x5F, + 0x1C, 0x68, 0x72, 0x08, 0x2D, 0x8B, 0xB7, 0xD7, 0xAF, 0x85, 0x0C, 0xC5, + 0x9F, 0x4F, 0x6D, 0x0B, 0x34, 0xA2, 0x8D, 0x6D, 0x92, 0x31, 0x6C, 0x92, + 0x91, 0xFE, 0x3F, 0xC0, 0xA5, 0x4A, 0x58, 0xA7, 0x23, 0x06, 0xA7, 0xE3, + 0xAF, 0xC6, 0xF5, 0x4C, 0x9D, 0x2A, 0x74, 0x4D, 0xAA, 0xD3, 0xA5, 0xD9, + 0xB9, 0x4D, 0xDE, 0x2F, 0xA4, 0x69, 0x24, 0x56, 0x5F, 0xCA, 0x0F, 0x43, + 0x1E, 0x58, 0xD4, 0x70, 0xD9, 0x11, 0x53, 0xE7, 0xB6, 0x9E, 0x8F, 0x06, + 0xCA, 0xBF, 0x20, 0x59, 0xE9, 0x51, 0xAE, 0xBA, 0x68, 0x30, 0xDE, 0x5E, + 0x9C, 0x4D, 0x0A, 0xD1, 0xF7, 0xFB, 0x1E, 0xEF, 0xE3, 0x71, 0xFC, 0x9E, + 0x12, 0x96, 0xEF, 0xB7, 0xC1, 0xD5, 0x44, 0x48, 0x5E, 0x44, 0x32, 0xED, + 0x52, 0xFA, 0x18, 0xA1, 0xAE, 0x6F, 0xCD, 0xDB, 0x83, 0x38, 0x8E, 0xD0, + 0xEC, 0x8E, 0x3A, 0xEF, 0x43, 0x03, 0xF2, 0x68, 0x14, 0xE2, 0xD3, 0x7D, + 0xF8, 0x2E, 0x23, 0xBC, 0x54, 0x52, 0x60, 0xE4, 0x89, 0xED, 0x87, 0x78, + 0x21, 0x07, 0xF8, 0x24, 0x12, 0x1E, 0x99, 0x21, 0x36, 0x3F, 0x6B, 0xB1, + 0xE5, 0x62, 0x46, 0x82, 0xC9, 0x44, 0x67, 0x33, 0x3E, 0x38, 0x62, 0x02, + 0xA0, 0x48, 0x1B, 0xD7, 0xBD, 0x21, 0xAB, 0x2E, 0x62, 0x9E, 0x35, 0x8E, + 0x3E, 0xDA, 0x2D, 0xA4, 0xDC, 0x7E, 0x43, 0x57, 0x45, 0x13, 0xD4, 0x62, + 0x45, 0xAB, 0x95, 0x57, 0x4C, 0x56, 0x4C, 0xAD, 0x5F, 0xBF, 0xA0, 0x24, + 0x23, 0x53, 0x71, 0xE5, 0xA1, 0x5C, 0x6C, 0xD3, 0xFD, 0xE6, 0x43, 0xFD, + 0x28, 0x86, 0xA6, 0x63, 0xA7, 0x73, 0x35, 0xF0, 0xFD, 0xFF, 0xC7, 0x7B, + 0x16, 0x38, 0x73, 0x9C, 0xFC, 0x65, 0x50, 0x94, 0x2D, 0x57, 0xE5, 0xDD, + 0x8C, 0x3B, 0x68, 0x81, 0xEA, 0x90, 0xA5, 0x3F, 0xC2, 0x2F, 0x9C, 0xD6, + 0x9F, 0xBA, 0x01, 0xD7, 0x8E, 0xA1, 0x71, 0xE2, 0xA5, 0x2A, 0x6A, 0xA5, + 0xFA, 0xE1, 0x6F, 0x44, 0x13, 0x56, 0x16, 0x3A, 0x1A, 0xBA, 0xBE, 0x5D, + 0xA6, 0xFA, 0x73, 0xEB, 0x05, 0xE0, 0x88, 0x8A, 0xEB, 0x5A, 0x50, 0xF5, + 0xFC, 0x86, 0xA2, 0x35, 0x41, 0x03, 0x72, 0x92, 0x4A, 0x8F, 0x73, 0xF0, + 0x05, 0x2A, 0xA4, 0x8C, 0x5C, 0x46, 0xEB, 0xE9, 0xE3, 0x3C, 0x6F, 0xB2, + 0x23, 0x6B, 0xA0, 0x77, 0xED, 0xA9, 0x95, 0x5C, 0x50, 0xA3, 0x01, 0xB0, + 0x8D, 0xE9, 0x5B, 0x5C, 0x0B, 0x91, 0xF5, 0x32, 0x9D, 0x52, 0xA1, 0x45, + 0x21, 0x45, 0x4A, 0xEA, 0x42, 0x8A, 0x7A, 0x91, 0xA0, 0x34, 0x95, 0x85, + 0xEC, 0x84, 0x21, 0xEB, 0x9E, 0x6C, 0xC8, 0xE5, 0x5C, 0x5F, 0xAF, 0x0C, + 0xC8, 0x17, 0xC8, 0x87, 0x3C, 0x10, 0xD2, 0x20, 0x03, 0x08, 0xD3, 0x3E, + 0xC6, 0x70, 0x33, 0xFE, 0x9E, 0x11, 0x85, 0xDC, 0xB2, 0xD6, 0xEA, 0x83, + 0xD2, 0xE2, 0x41, 0x1E, 0x70, 0x0E, 0xED, 0xE5, 0x64, 0xBC, 0x83, 0x6F, + 0x1F, 0xEF, 0xC4, 0xFE, 0x20, 0x99, 0x87, 0xF6, 0x76, 0x76, 0x4B, 0xC2, + 0xEF, 0x9C, 0xA9, 0xED, 0x33, 0xF8, 0x6A, 0x64, 0x83, 0x76, 0xAE, 0x5D, + 0x48, 0xAA, 0x08, 0x64, 0x95, 0xB8, 0x8F, 0x33, 0xB3, 0x88, 0x07, 0x55, + 0xDB, 0x6C, 0xA5, 0x1E, 0x3B, 0xCA, 0x76, 0xDC, 0x0D, 0x85, 0x02, 0xA2, + 0xEC, 0xB5, 0x0F, 0xC4, 0x52, 0x11, 0x57, 0xF5, 0x2D, 0x8D, 0xFB, 0x3C, + 0x49, 0xC7, 0x59, 0x68, 0x3A, 0x62, 0xC9, 0x28, 0xCD, 0x81, 0x98, 0x10, + 0xB0, 0x71, 0x3B, 0x96, 0xB9, 0xC2, 0x16, 0x14, 0x88, 0xCC, 0x56, 0x1A, + 0xD2, 0x78, 0xBC, 0x53, 0x4A, 0xA8, 0x27, 0xDE, 0x8A, 0x5B, 0xEF, 0x58, + 0x97, 0x95, 0x02, 0xF3, 0x76, 0xC1, 0xA2, 0x01, 0xB8, 0xD2, 0xB8, 0xAC, + 0xC5, 0xB3, 0x36, 0x33, 0x7C, 0x1A, 0xCA, 0x06, 0x4C, 0x09, 0xBC, 0x3C, + 0x0B, 0x0A, 0xD8, 0xAC, 0x74, 0x25, 0xA4, 0x91, 0xDB, 0x13, 0xE5, 0x2B, + 0x09, 0xC7, 0x3D, 0x99, 0xFB, 0x4F, 0xFF, 0xB4, 0x9C, 0x9E, 0x89, 0xF8, + 0xD3, 0xAC, 0xCF, 0x37, 0xEA, 0x3F, 0xAC, 0x3E, 0x8F, 0x7E, 0xFD, 0x66, + 0x97, 0xF1, 0x8A, 0x94, 0xE0, 0x36, 0x2A, 0x48, 0x1C, 0xA9, 0x5B, 0x1E, + 0x4D, 0xCC, 0xB0, 0xF6, 0xA6, 0x26, 0x2E, 0x6D, 0x29, 0x6E, 0x89, 0x30, + 0x6C, 0x2B, 0xA3, 0x04, 0xD4, 0x8F, 0x8C, 0xCB, 0xA7, 0xA2, 0x05, 0x94, + 0x93, 0xE9, 0x9B, 0x03, 0x18, 0x91, 0x76, 0x25, 0x42, 0xF6, 0xC1, 0xE1, + 0xE8, 0x6B, 0x56, 0xEF, 0x61, 0xED, 0xDB, 0xF7, 0xD6, 0xD3, 0x50, 0xB1, + 0x59, 0xAE, 0x79, 0x22, 0xEB, 0xCC, 0x39, 0x3E, 0x10, 0xD7, 0x21, 0x04, + 0x7D, 0xEF, 0x96, 0x73, 0xBC, 0x6C, 0xE5, 0x0D, 0x15, 0x8A, 0x94, 0x07, + 0x14, 0x96, 0x86, 0x31, 0x68, 0xD6, 0xC0, 0xE7, 0xE5, 0xEE, 0x6C, 0x77, + 0xBD, 0x9E, 0xD9, 0x27, 0xE7, 0x68, 0x1E, 0x57, 0x1A, 0x0D, 0x01, 0xDD, + 0x3B, 0xAF, 0x85, 0x5A, 0xA3, 0x49, 0x4A, 0xCB, 0x1D, 0x2E, 0xC4, 0xFE, + 0x39, 0x50, 0x36, 0x5C, 0xF8, 0xE4, 0xC4, 0x0D, 0x6A, 0x84, 0xCC, 0xC1, + 0x5C, 0xF1, 0x72, 0x34, 0x1B, 0xAE, 0x8E, 0xFB, 0x45, 0x23, 0xBE, 0xC5, + 0x4B, 0xAE, 0xC2, 0xC9, 0x74, 0xF5, 0x83, 0x84, 0x26, 0x7A, 0xFA, 0x8D, + 0xFF, 0x34, 0x68, 0xDE, 0x39, 0xB3, 0xDB, 0x15, 0xDB, 0x13, 0xC2, 0x59, + 0xDE, 0x5F, 0x78, 0xD2, 0x04, 0x1D, 0x3A, 0x45, 0x7B, 0xCD, 0xB5, 0xC4, + 0x51, 0xCF, 0x8F, 0xAD, 0x2E, 0x61, 0x23, 0xEC, 0x66, 0x37, 0x2D, 0x4A, + 0xB3, 0xD4, 0xCA, 0x8C, 0x37, 0x3F, 0xAE, 0x15, 0x3F, 0xBE, 0xE7, 0x5E, + 0x2D, 0xAD, 0x95, 0x30, 0xFB, 0x35, 0x42, 0xC9, 0xFB, 0xF1, 0x5A, 0xD0, + 0x20, 0x3A, 0x06, 0xF5, 0x1D, 0x2D, 0xDB, 0xAC, 0x4C, 0xEB, 0x02, 0xF0, + 0x11, 0x4D, 0xC9, 0x24, 0x46, 0x5E, 0x1A, 0xAA, 0x24, 0xE8, 0x0B, 0xAC, + 0x83, 0xAD, 0x12, 0x9D, 0xD1, 0x79, 0xBC, 0xE0, 0xF7, 0x56, 0x21, 0x90, + 0x71, 0x7D, 0x6D, 0x36, 0x59, 0xC3, 0xF8, 0x4C, 0x60, 0xBF, 0x0B, 0xF4, + 0x29, 0x60, 0x65, 0xF3, 0xC7, 0x48, 0xAC, 0x8F, 0x7C, 0x5D, 0x4B, 0xF8, + 0x75, 0x5E, 0x94, 0x97, 0x1C, 0x02, 0x70, 0xED, 0xA3, 0xC4, 0x22, 0xB6, + 0x10, 0xFA, 0x74, 0x00, 0x8C, 0x73, 0x6C, 0xC7, 0xB2, 0xFA, 0x6E, 0x0F, + 0x42, 0x8B, 0xF5, 0xB7, 0xF0, 0xE9, 0x29, 0xE8, 0x48, 0xB3, 0x1C, 0xD2, + 0xAB, 0xA1, 0xA5, 0x8B, 0x1C, 0x43, 0x44, 0xEF, 0xE9, 0x95, 0xC8, 0xA6, + 0xE9, 0x48, 0x8C, 0x73, 0xFA, 0x6C, 0x9C, 0xC4, 0xAE, 0x2B, 0xB3, 0xC9, + 0x11, 0x06, 0x20, 0xA9, 0x00, 0xFB, 0x50, 0x1D, 0x73, 0x68, 0xD5, 0xC0, + 0x4D, 0x38, 0x4C, 0xAA, 0x93, 0xC0, 0x24, 0x25, 0xE0, 0x55, 0x0C, 0x6F, + 0xE8, 0xA2, 0x66, 0x3C, 0xE0, 0x5E, 0x5C, 0x2F, 0xBC, 0x27, 0x66, 0x99, + 0x0E, 0xF6, 0xFE, 0xCF, 0x14, 0x19, 0x0E, 0x9D, 0x75, 0xCF, 0xE9, 0x29, + 0xC1, 0x77, 0x26, 0xF5, 0x78, 0xA5, 0x4E, 0x7D, 0x7F, 0x3F, 0x33, 0x11, + 0x5F, 0x26, 0xCD, 0xCB, 0x5B, 0x47, 0xD4, 0x37, 0x4C, 0xBA, 0x38, 0x59, + 0x23, 0x80, 0x84, 0xEF, 0x3C, 0xCC, 0xD6, 0xA9, 0x71, 0xA3, 0xFE, 0x5B, + 0xD5, 0x3B, 0x21, 0x52, 0xC2, 0xD6, 0x1B, 0x71, 0x3B, 0x06, 0x55, 0x5C, + 0x1B, 0x77, 0xAB, 0x80, 0x0B, 0x17, 0xCB, 0x14, 0x72, 0x87, 0xFB, 0x81, + 0xD4, 0xFB, 0xB7, 0xD0, 0x84, 0x65, 0x9B, 0x6F, 0x2B, 0xD5, 0x7A, 0x12, + 0xA8, 0x2A, 0xBE, 0xA5, 0xE7, 0xE2, 0x8F, 0x05, 0x1A, 0x54, 0x10, 0xAA, + 0x72, 0x34, 0xF6, 0xE9, 0x08, 0x6B, 0xB4, 0xFC, 0x69, 0xAF, 0x26, 0x5F, + 0xC5, 0x72, 0x61, 0x96, 0x3A, 0xD6, 0xE4, 0x5B, 0xBA, 0xCB, 0x0C, 0xD1, + 0xAE, 0xF8, 0x19, 0xFA, 0xB6, 0xCF, 0x0C, 0xCC, 0xFC, 0xCD, 0x82, 0x15, + 0xAC, 0x36, 0x04, 0x80, 0x75, 0x3D, 0x8D, 0xF9, 0x36, 0x57, 0x4F, 0x7C, + 0x55, 0x60, 0xE0, 0x2F, 0xB4, 0x89, 0x9E, 0x77, 0xED, 0xCB, 0x19, 0x96, + 0xB4, 0xC0, 0x5E, 0xBE, 0x4E, 0xEF, 0xB9, 0xA7, 0xCB, 0x92, 0x68, 0x74, + 0xF0, 0x9A, 0x38, 0xE1, 0x15, 0x67, 0x64, 0xE0, 0x70, 0x08, 0x36, 0xED, + 0xC4, 0x47, 0x11, 0xD6, 0x79, 0x5E, 0x12, 0x4A, 0x50, 0xD8, 0xFE, 0x7D, + 0x09, 0x67, 0x11, 0x53, 0x2B, 0x2E, 0x6F, 0x5B, 0x91, 0xF5, 0x1A, 0xAA, + 0x0C, 0x0C, 0x50, 0x45, 0x0B, 0x94, 0x01, 0x16, 0xB7, 0x83, 0x9A, 0xF6, + 0xCC, 0x45, 0x79, 0x7C, 0xD0, 0x9C, 0xFD, 0x66, 0xB1, 0xBD, 0xCF, 0x70, + 0xBC, 0x77, 0xF4, 0xA2, 0xEE, 0x6F, 0x13, 0x28, 0x48, 0x39, 0x81, 0xCB, + 0x80, 0x52, 0xED, 0x49, 0xEE, 0x54, 0xFD, 0x59, 0x27, 0x51, 0x68, 0x8E, + 0xFA, 0x46, 0x89, 0x9A, 0xCF, 0x48, 0x45, 0x9F, 0xA5, 0x6F, 0x16, 0x6C, + 0x3C, 0x36, 0x41, 0xF7, 0x06, 0xAA, 0x3A, 0x7D, 0xFF, 0x4E, 0x37, 0xE6, + 0x7D, 0x83, 0x9F, 0xDE, 0x6E, 0xBC, 0x7C, 0x95, 0xEF, 0x93, 0x82, 0x42, + 0x43, 0xAA, 0xC2, 0x85, 0xBA, 0x7E, 0x9C, 0xB6, 0xD4, 0xE1, 0x11, 0xB2, + 0x44, 0xDC, 0xFF, 0xC7, 0x5C, 0x92, 0xCE, 0xC0, 0xBC, 0xA7, 0xB2, 0x41, + 0x75, 0x05, 0x4F, 0x00, 0xB9, 0x23, 0xF2, 0xCA, 0xE9, 0x65, 0x23, 0x24, + 0x49, 0xA4, 0x15, 0x8E, 0x10, 0xB1, 0xC1, 0x2F, 0xCA, 0xB4, 0xAF, 0x86, + 0xF7, 0x80, 0x3D, 0xF2, 0xC1, 0x5A, 0x42, 0x2F, 0xC7, 0x39, 0xFD, 0x06, + 0x74, 0xEF, 0x15, 0xEB, 0xE0, 0x24, 0x8F, 0x7B, 0xEE, 0xE0, 0xE4, 0x1D, + 0x5F, 0x2A, 0x88, 0xDC, 0x9E, 0xB5, 0xA9, 0x9F, 0xDE, 0x73, 0x2C, 0x7A, + 0xF3, 0x9B, 0x32, 0xF3, 0xF4, 0x5F, 0x3C, 0x5E, 0xBE, 0xBA, 0xA0, 0xEA, + 0xB6, 0x0B, 0x00, 0x10, 0xE5, 0xBA, 0x6C, 0x62, 0x26, 0x27, 0x62, 0x3B, + 0x48, 0x5C, 0x60, 0xEE, 0xEB, 0xFA, 0xEE, 0xB1, 0x6C, 0x0A, 0x46, 0xF3, + 0x1E, 0xED, 0xA3, 0x1B, 0xF3, 0x60, 0x02, 0xF3, 0x60, 0x6A, 0x1A, 0x8A, + 0x33, 0x70, 0x13, 0x7C, 0x5F, 0xC6, 0xEF, 0x8A, 0x15, 0xCB, 0xC1, 0x44, + 0xDD, 0xEF, 0x73, 0x9D, 0x01, 0x70, 0xAF, 0xAA, 0x60, 0x34, 0xB4, 0x2D, + 0x4B, 0xA1, 0xBB, 0x5B, 0xF2, 0x54, 0x0F, 0x10, 0xDD, 0xA4, 0xBB, 0xA4, + 0xE5, 0xC4, 0x3D, 0xAE, 0xEF, 0x70, 0xF9, 0xED, 0x9A, 0x60, 0x2E, 0x22, + 0xAB, 0xF5, 0xA8, 0x8A, 0xEA, 0x62, 0x05, 0x2A, 0x32, 0x31, 0x29, 0xDE, + 0x4C, 0x8E, 0x8C, 0x6C, 0x4B, 0x70, 0xB0, 0x9C, 0x0A, 0x95, 0x52, 0xC6, + 0x90, 0x0D, 0x2A, 0xAA, 0xAC, 0x07, 0x54, 0xCE, 0xFE, 0xF6, 0x95, 0xBB, + 0xCD, 0xF3, 0xE4, 0x69, 0xC7, 0x44, 0x75, 0x63, 0x72, 0x84, 0x0E, 0xD5, + 0x13, 0xE4, 0xFA, 0x48, 0xC1, 0x42, 0xD5, 0x5F, 0x6B, 0x88, 0x3D, 0x8E, + 0x09, 0x67, 0x42, 0x61, 0x69, 0x72, 0xEE, 0xE3, 0xDF, 0x37, 0x75, 0x30, + 0xCE, 0x9D, 0xE3, 0x0C, 0xF9, 0x16, 0x0C, 0xD2, 0x6F, 0x3C, 0x69, 0x8D, + 0x8F, 0x1D, 0x78, 0x1C, 0x8B, 0x3A, 0x6C, 0xDF, 0x28, 0x5E, 0x76, 0x79, + 0x89, 0x75, 0x82, 0xB7, 0x46, 0x97, 0xB3, 0xF2, 0x60, 0x98, 0x96, 0x5E, + 0x5C, 0x24, 0x35, 0xA7, 0x0B, 0xA7, 0xB6, 0x96, 0x80, 0xD3, 0x9C, 0x38, + 0xE2, 0xF3, 0x9B, 0x76, 0x86, 0x68, 0xC9, 0xA4, 0x08, 0x46, 0x8D, 0x1D, + 0x5C, 0xF7, 0x68, 0x62, 0xBC, 0x6B, 0x7B, 0x1C, 0xE5, 0x72, 0x94, 0x4A, + 0xAF, 0x2C, 0x74, 0x4D, 0x9A, 0x05, 0x90, 0xA6, 0xD9, 0x2C, 0xDF, 0x20, + 0x2A, 0xE9, 0x0D, 0x8B, 0xDD, 0xD9, 0x97, 0x1D, 0x30, 0x8B, 0xC0, 0x23, + 0xCD, 0x1E, 0xF4, 0x3C, 0x06, 0xA2, 0xDC, 0xE9, 0x13, 0xDA, 0xC7, 0x82, + 0xC0, 0x5F, 0x08, 0x12, 0x7C, 0xEE, 0x7A, 0x3D, 0x95, 0xE9, 0xCB, 0xA2, + 0xBC, 0xA0, 0x55, 0x18, 0x49, 0x83, 0x86, 0x62, 0xCF, 0x8F, 0xA6, 0xF1, + 0x14, 0xAA, 0x0A, 0x5A, 0xE1, 0x96, 0xF7, 0x13, 0x0C, 0xC1, 0x09, 0xFD, + 0xBF, 0x84, 0xEE, 0x6D, 0x0A, 0x34, 0x73, 0x88, 0xD8, 0x54, 0x61, 0x9A, + 0x1F, 0x2B, 0x34, 0x36, 0x44, 0x34, 0x41, 0x7F, 0x09, 0x8F, 0x08, 0x08, + 0x40, 0xA1, 0x70, 0x24, 0x30, 0x23, 0x02, 0x2D, 0x76, 0x39, 0xC0, 0xCA, + 0xF1, 0xAC, 0xA2, 0xFA, 0x09, 0x07, 0xE0, 0x5D, 0xE2, 0x44, 0x0C, 0x2C, + 0xAB, 0x77, 0x4C, 0xE7, 0x7E, 0xFA, 0xAB, 0xF3, 0x43, 0xAF, 0x6F, 0x5D, + 0xC1, 0xE3, 0x81, 0x28, 0x9A, 0x47, 0xD4, 0xE5, 0x4B, 0x04, 0x0A, 0x47, + 0xFD, 0xF6, 0x31, 0x6D, 0x54, 0xAD, 0x3B, 0x19, 0xF7, 0x28, 0x1D, 0x42, + 0x7C, 0x3A, 0x4C, 0xCC, 0xB3, 0x66, 0xE2, 0x9F, 0x8C, 0x18, 0x0F, 0x77, + 0xC4, 0xA3, 0xF4, 0x22, 0x75, 0x83, 0x65, 0xFB, 0x4F, 0x02, 0x71, 0xE6, + 0x4A, 0x2D, 0x2F, 0xE2, 0x46, 0xB4, 0x0C, 0x39, 0x29, 0xAB, 0xC7, 0x3E, + 0x38, 0xC3, 0x0B, 0xA5, 0xE8, 0xB5, 0xE6, 0x0E, 0xEC, 0x77, 0x7C, 0xD0, + 0xBF, 0x2F, 0xB1, 0x27, 0x4F, 0x56, 0x73, 0xCA, 0x70, 0xA5, 0x35, 0x71, + 0x4A, 0x42, 0xA5, 0x37, 0x0A, 0xA7, 0xAD, 0x27, 0x18, 0x02, 0x8C, 0x4B, + 0x3A, 0xB1, 0x6D, 0x17, 0xC1, 0x81, 0x76, 0x70, 0x8D, 0xAC, 0xAD, 0x4A, + 0xDD, 0x3D, 0x27, 0x18, 0x66, 0x63, 0x3A, 0x0D, 0xFC, 0xA2, 0x9F, 0xC5, + 0x2E, 0x29, 0xD9, 0xA5, 0x0C, 0x4C, 0xA3, 0x6F, 0xA9, 0x3F, 0xFF, 0xB5, + 0x83, 0x6B, 0x00, 0x93, 0x57, 0x39, 0x26, 0x6D, 0x40, 0x81, 0x89, 0x4A, + 0xAE, 0x55, 0x06, 0x58, 0x75, 0x6F, 0x49, 0xC2, 0xFF, 0xA0, 0x92, 0x7B, + 0xB6, 0x60, 0x80, 0x72, 0x52, 0xE5, 0x8D, 0x33, 0xC0, 0xB6, 0x3F, 0xF2, + 0x2A, 0x81, 0x11, 0x8F, 0xF5, 0xA2, 0x98, 0x84, 0x59, 0x7C, 0xA8, 0xD5, + 0x9C, 0xDE, 0x69, 0x4C, 0x67, 0xD9, 0xFB, 0xBC, 0x68, 0x29, 0x92, 0x25, + 0x7D, 0xFD, 0x01, 0x8D, 0x60, 0xBC, 0xAE, 0x34, 0x00, 0x77, 0x06, 0x99, + 0xD2, 0x9B, 0xFD, 0x69, 0xD5, 0x56, 0x00, 0xB0, 0x76, 0x71, 0x38, 0xCE, + 0xBE, 0xAE, 0xA2, 0xA4, 0x8C, 0xA4, 0xE6, 0x78, 0x9E, 0x96, 0x2F, 0x92, + 0xF3, 0x13, 0x22, 0x50, 0xE9, 0x0F, 0xB2, 0x0F, 0x31, 0x4E, 0xC7, 0x2E, + 0xF0, 0x70, 0x21, 0x33, 0x41, 0xCA, 0xFA, 0xF0, 0x4D, 0xF8, 0xCD, 0x1E, + 0x41, 0x42, 0xED, 0xAA, 0xA0, 0x49, 0x30, 0x2D, 0xBA, 0x1E, 0x11, 0x09, + 0x14, 0x0E, 0x39, 0x32, 0x32, 0x22, 0x48, 0x93, 0xCF, 0x1A, 0xF8, 0xC1, + 0x91, 0x6A, 0x0B, 0xCC, 0x76, 0x98, 0xD1, 0x2B, 0x9A, 0x40, 0xBF, 0x12, + 0xD6, 0xFF, 0x20, 0x7E, 0x54, 0xB8, 0x4E, 0x65, 0xEB, 0xB3, 0x46, 0xD1, + 0x44, 0x6A, 0x80, 0x19, 0x72, 0xFD, 0x39, 0x11, 0xD7, 0x7A, 0x7C, 0x03, + 0x7D, 0x76, 0xE0, 0xB2, 0x30, 0x02, 0xAA, 0xEC, 0x29, 0xA7, 0x90, 0x08, + 0xC8, 0x16, 0x12, 0xA0, 0x30, 0x2C, 0xA1, 0x4E, 0xC1, 0x7C, 0x5F, 0xB7, + 0x5A, 0x17, 0xF7, 0xA7, 0xFC, 0xFA, 0xCB, 0x5D, 0xC2, 0xDC, 0x2C, 0x86, + 0xF7, 0xCD, 0x2A, 0x0A, 0xA7, 0x22, 0x47, 0x48, 0xC2, 0x75, 0x1E, 0x24, + 0xC6, 0x26, 0x98, 0x84, 0x15, 0xAD, 0xB9, 0xBA, 0xC9, 0xAF, 0x7D, 0xA2, + 0x5D, 0xDD, 0x8E, 0xE0, 0xEE, 0xEF, 0x74, 0xCE, 0x3F, 0xBC, 0xFC, 0xA0, + 0x26, 0x09, 0x15, 0x30, 0xEC, 0x3B, 0xBB, 0x0A, 0xC4, 0x43, 0x9F, 0x27, + 0x90, 0x1F, 0xCC, 0x2D, 0x8B, 0x7F, 0xDA, 0x51, 0xCB, 0xF7, 0x27, 0xAC, + 0xE5, 0xD7, 0x7D, 0xAA, 0xB0, 0xD9, 0x7C, 0xBF, 0x17, 0xD0, 0x42, 0x57, + 0xC0, 0xF9, 0xE3, 0xF0, 0x0E, 0x7B, 0x5F, 0xE4, 0x4B, 0xA0, 0xC1, 0xEE, + 0xF1, 0xF2, 0xEB, 0x33, 0xDA, 0x25, 0xFB, 0x08, 0xAE, 0x6F, 0x4B, 0xFB, + 0x5E, 0x98, 0x91, 0xD7, 0x91, 0x9A, 0x62, 0x76, 0xC6, 0x51, 0xAA, 0x64, + 0x6A, 0xF2, 0xCD, 0xAD, 0x24, 0x42, 0x87, 0x05, 0xD3, 0x39, 0xE1, 0xC5, + 0xA8, 0x30, 0x79, 0xD8, 0xC0, 0x03, 0x42, 0x84, 0x5A, 0x75, 0xB4, 0x8C, + 0x0D, 0xE3, 0xB4, 0xCB, 0x00, 0xFD, 0x51, 0xDC, 0xE1, 0xA8, 0xDE, 0xE7, + 0x33, 0x6D, 0x74, 0x62, 0x2A, 0xAE, 0x99, 0x79, 0x9E, 0xFC, 0x0E, 0x19, + 0x35, 0xDD, 0xA1, 0x75, 0xE4, 0x2B, 0x0C, 0xC5, 0x37, 0xCB, 0x70, 0x3E, + 0x00, 0x0B, 0x28, 0x37, 0x03, 0x23, 0x4D, 0xF0, 0x85, 0xFB, 0xF5, 0x3B, + 0x8D, 0xC1, 0xB9, 0xB2, 0x7D, 0x15, 0x4C, 0xC0, 0x86, 0x78, 0x74, 0x01, + 0xDB, 0xB0, 0xC3, 0x01, 0x25, 0x4D, 0x56, 0x70, 0x60, 0x66, 0xCC, 0xC0, + 0x1A, 0xD7, 0x77, 0x90, 0x42, 0xDE, 0xE1, 0x09, 0xA9, 0x14, 0xB8, 0xB9, + 0x78, 0xAF, 0x64, 0x1F, 0x50, 0x02, 0xF9, 0xAF, 0x2C, 0x43, 0x9A, 0xF3, + 0xD9, 0x00, 0x56, 0x81, 0xC9, 0xC6, 0xC8, 0xAF, 0x1D, 0x49, 0x5A, 0xC5, + 0xFB, 0x80, 0xF6, 0x3E, 0xD1, 0x03, 0x5B, 0x8B, 0xF4, 0xFA, 0x8B, 0x81, + 0xB8, 0x87, 0xD3, 0xEE, 0x40, 0x17, 0xB0, 0x39, 0xE5, 0x20, 0xF4, 0x96, + 0xEE, 0x8E, 0xA3, 0x71, 0xCE, 0x05, 0xD4, 0x3C, 0x71, 0x46, 0x91, 0xEA, + 0x89, 0xC5, 0x9F, 0xD3, 0x07, 0x77, 0x1E, 0x1C, 0x4B, 0x28, 0xA1, 0xA4, + 0x5F, 0xE3, 0xC3, 0x9A, 0xF5, 0x2A, 0xF8, 0xC3, 0x68, 0x4C, 0x76, 0x7B, + 0x8B, 0x62, 0x49, 0x8C, 0x7C, 0x31, 0x9D, 0x41, 0x07, 0x29, 0xE9, 0xD9, + 0xF1, 0x58, 0x6F, 0x20, 0x31, 0x06, 0x45, 0xEA, 0xAB, 0x5E, 0x94, 0x21, + 0xEC, 0xB2, 0xC0, 0xA9, 0xD3, 0x23, 0x54, 0x09, 0x32, 0x95, 0xF7, 0x50, + 0x41, 0x13, 0x7E, 0x9D, 0x7C, 0xEB, 0xB8, 0x49, 0x87, 0xD2, 0xF9, 0x55, + 0xDC, 0xE5, 0x57, 0x5E, 0x45, 0x3C, 0xA0, 0xE7, 0xF2, 0x70, 0x2B, 0x7A, + 0x08, 0x38, 0x1D, 0xCC, 0x34, 0x55, 0xF3, 0x79, 0x99, 0xD8, 0x3A, 0x6C, + 0xEA, 0xFD, 0x18, 0xE6, 0xA8, 0x8C, 0x22, 0xE6, 0x24, 0x02, 0xC6, 0x71, + 0xFE, 0x09, 0x01, 0x63, 0xD9, 0x13, 0xD6, 0x82, 0xE7, 0x86, 0x9C, 0x08, + 0xDC, 0xC5, 0x2A, 0x83, 0x13, 0x3A, 0x03, 0x52, 0x25, 0x71, 0x8B, 0x9E, + 0xB5, 0xCC, 0x08, 0x05, 0x98, 0xBC, 0xFF, 0xF0, 0xB8, 0x22, 0xF1, 0x87, + 0x6B, 0xE7, 0x0A, 0xB0, 0xF1, 0x77, 0xAC, 0x70, 0xA5, 0x34, 0x22, 0x46, + 0xD0, 0x53, 0xB5, 0xE8, 0x77, 0x04, 0x9D, 0x90, 0x8D, 0xE8, 0x57, 0x47, + 0x5D, 0xE7, 0x91, 0x41, 0xA5, 0x2B, 0xD2, 0xF0, 0xBE, 0x7B, 0xFE, 0x03, + 0xF4, 0x81, 0x73, 0x2F, 0xA4, 0x39, 0x21, 0x3D, 0x24, 0x35, 0xAE, 0xCE, + 0xE3, 0x9C, 0x36, 0x5B, 0x45, 0xC4, 0xA0, 0xD4, 0x46, 0x02, 0x38, 0xF7, + 0x9E, 0xC3, 0x11, 0x01, 0x31, 0xB8, 0xAC, 0xE8, 0xFC, 0xDB, 0xC5, 0xB4, + 0xC4, 0xD5, 0x2A, 0xFB, 0x0D, 0xF7, 0x29, 0xB5, 0xCC, 0xE7, 0xD1, 0xF5, + 0x1F, 0x53, 0xDF, 0xD7, 0x7D, 0x71, 0xED, 0x0C, 0xB4, 0xDA, 0xFE, 0xA5, + 0x28, 0x5D, 0x5A, 0x4D, 0x54, 0x9D, 0x04, 0x40, 0x92, 0xBD, 0xC4, 0xD7, + 0x38, 0x4B, 0xBC, 0xF5, 0x1F, 0x58, 0xAE, 0xD8, 0x0D, 0xA6, 0x92, 0xE8, + 0xEF, 0x43, 0xEF, 0xDF, 0x0F, 0xCD, 0x22, 0xFA, 0x61, 0x24, 0x77, 0x6A, + 0x60, 0x8D, 0x42, 0xFA, 0x8A, 0x0D, 0x6C, 0x47, 0xDB, 0xC2, 0x57, 0x9F, + 0x12, 0x0E, 0x32, 0xD4, 0x12, 0xD7, 0x05, 0x1F, 0xDF, 0x7A, 0xEC, 0xE2, + 0x79, 0xEB, 0xC4, 0x8B, 0xC4, 0x71, 0x47, 0xB8, 0xE2, 0xA6, 0xF7, 0x55, + 0x7D, 0x6D, 0xC7, 0x93, 0xDB, 0x11, 0xED, 0x70, 0xDE, 0xCD, 0xD9, 0x87, + 0x14, 0xDA, 0x69, 0x00, 0x63, 0xFF, 0x5E, 0x0F, 0x9A, 0x38, 0xE7, 0xA2, + 0x2F, 0xA6, 0x38, 0x0E, 0xA8, 0x88, 0x38, 0xD4, 0xF5, 0xF3, 0x26, 0x27, + 0x33, 0x2A, 0xF0, 0xA1, 0xC8, 0x01, 0x7E, 0xF3, 0xB1, 0xEB, 0x59, 0xCE, + 0x3F, 0xE0, 0xC4, 0x86, 0x25, 0xDD, 0xCA, 0x55, 0x58, 0x4F, 0x4B, 0x4F, + 0x5D, 0x8A, 0x01, 0xAB, 0x82, 0x3E, 0x48, 0x9F, 0x14, 0x4B, 0x9E, 0x05, + 0x6C, 0x3E, 0xEE, 0xF6, 0x84, 0x59, 0x76, 0x56, 0x69, 0x10, 0x6B, 0x4B, + 0x79, 0xB6, 0x90, 0x0F, 0x2E, 0x04, 0x45, 0x5C, 0x5A, 0x35, 0x7C, 0x4A, + 0x8D, 0xEA, 0xC3, 0xA8, 0x35, 0xD2, 0xCD, 0x0B, 0xE1, 0x37, 0xF3, 0x83, + 0xCB, 0x65, 0x8B, 0x65, 0x73, 0xEC, 0xA9, 0x80, 0x11, 0xA2, 0xA5, 0x97, + 0x83, 0xC2, 0x0D, 0xF0, 0x23, 0x27, 0x6C, 0xA7, 0xFE, 0xD3, 0x01, 0x1A, + 0x1A, 0x60, 0x1C, 0x82, 0x09, 0xE6, 0xB7, 0x7E, 0xE3, 0xE5, 0x9E, 0xF3, + 0xEC, 0x7F, 0x76, 0x23, 0xCD, 0xF5, 0xCD, 0xA7, 0x21, 0xD5, 0xCF, 0x7C, + 0x56, 0x56, 0x1E, 0xF2, 0x25, 0x36, 0x81, 0x81, 0xE8, 0x33, 0x39, 0xFC, + 0x93, 0xE7, 0xC8, 0x4A, 0x39, 0xB5, 0x1C, 0x86, 0x13, 0xC9, 0xD2, 0xAA, + 0xC6, 0x31, 0x46, 0xDE, 0xEF, 0x35, 0x26, 0x5A, 0x09, 0x42, 0x0F, 0x24, + 0xA5, 0x6A, 0x82, 0x84, 0x17, 0x95, 0x35, 0x7C, 0xB7, 0x99, 0x60, 0x6E, + 0x54, 0xE1, 0x43, 0xDC, 0xDD, 0x2A, 0x17, 0x06, 0xB9, 0xF2, 0x34, 0xAE, + 0xDB, 0xE9, 0xF3, 0xAB, 0x6C, 0xAA, 0x1A, 0x5E, 0x65, 0xCF, 0x45, 0x3B, + 0xB2, 0x6C, 0x47, 0xE5, 0x26, 0x7B, 0x43, 0xD0, 0x58, 0x0A, 0x74, 0xE3, + 0xEC, 0xDD, 0x7C, 0xB8, 0x3B, 0xE6, 0xCC, 0x72, 0xD3, 0x35, 0x63, 0xB5, + 0x26, 0x7A, 0xBE, 0x71, 0x21, 0x82, 0x75, 0x35, 0x20, 0x11, 0x7F, 0x1D, + 0xFE, 0xD4, 0x19, 0xD0, 0xB7, 0xC1, 0xF3, 0xF4, 0xE6, 0x9A, 0xE0, 0x7D, + 0x02, 0x60, 0xF0, 0xC8, 0x41, 0xC9, 0x36, 0x14, 0xDE, 0xF5, 0x03, 0x91, + 0xE6, 0xFE, 0xAD, 0x1F, 0x50, 0xA7, 0x95, 0xFB, 0x09, 0x26, 0x21, 0x23, + 0xA4, 0xF8, 0x84, 0xD2, 0xAB, 0x02, 0x88, 0x62, 0xDD, 0xB9, 0x7A, 0x57, + 0xF0, 0x57, 0x92, 0x6E, 0xA5, 0xDD, 0x6D, 0xCF, 0xEF, 0x30, 0x0B, 0xC3, + 0xD3, 0xE1, 0xDF, 0xB4, 0x39, 0x35, 0x73, 0x19, 0xED, 0xAE, 0x1A, 0x8A, + 0x0D, 0xC8, 0x31, 0x94, 0x3C, 0xB5, 0xEF, 0x2C, 0x67, 0xBA, 0xFD, 0x34, + 0x13, 0x95, 0x5B, 0x00, 0x0B, 0xDF, 0x23, 0xBC, 0x7D, 0xDE, 0x1C, 0x30, + 0x72, 0x81, 0x9C, 0x34, 0xB7, 0x60, 0x0E, 0x4C, 0x96, 0x64, 0x5C, 0x93, + 0x61, 0x53, 0x12, 0x20, 0xD3, 0xA2, 0xBB, 0x9F, 0x1F, 0x26, 0x7F, 0xD5, + 0xD7, 0xDE, 0x4C, 0x20, 0x8F, 0x1D, 0x43, 0xAB, 0x2C, 0x7F, 0x50, 0xED, + 0x9C, 0x7C, 0x2B, 0x44, 0x2C, 0x22, 0xBF, 0xD6, 0x56, 0xB2, 0x56, 0xE4, + 0x74, 0x8A, 0x78, 0x5F, 0x21, 0xB9, 0xD2, 0xDB, 0x9D, 0x7D, 0x42, 0x54, + 0x92, 0x8F, 0x55, 0x9E, 0x85, 0xE8, 0x28, 0x92, 0xF0, 0x27, 0x77, 0xCF, + 0xFD, 0xE0, 0xB6, 0x2F, 0xBD, 0xC6, 0x4B, 0x8E, 0x3E, 0x90, 0xBB, 0x52, + 0xED, 0xF6, 0xAA, 0x22, 0x6F, 0x50, 0xDF, 0xFC, 0x65, 0x7B, 0x0D, 0xE9, + 0x27, 0x03, 0x7E, 0x4A, 0x38, 0xDD, 0x0E, 0x7A, 0x27, 0x66, 0x65, 0xDF, + 0xD4, 0xDC, 0x62, 0x41, 0x4F, 0xBE, 0x74, 0xBB, 0xCE, 0x45, 0x98, 0xBC, + 0x78, 0xC4, 0x58, 0xCB, 0x8B, 0xD7, 0x6E, 0xDE, 0x47, 0xE7, 0x62, 0xE5, + 0xE4, 0x83, 0xC4, 0x88, 0x07, 0xE8, 0x59, 0xA8, 0x45, 0x66, 0xE7, 0x2E, + 0xC0, 0xC6, 0x34, 0x56, 0x9B, 0x6E, 0xC8, 0x7A, 0x79, 0xE1, 0x67, 0x1A, + 0x02, 0x00, 0xC9, 0x0D, 0x4F, 0xFE, 0x10, 0x39, 0x18, 0x01, 0xF4, 0xB9, + 0x07, 0x10, 0x72, 0xC7, 0xCF, 0x39, 0xE4, 0xFE, 0x7C, 0x90, 0x2E, 0x29, + 0x27, 0x7E, 0x6A, 0x64, 0x8E, 0xC6, 0x52, 0x49, 0x00, 0x15, 0x54, 0xFB, + 0x17, 0x73, 0x19, 0x22, 0x24, 0x47, 0x9C, 0x90, 0xA3, 0xC2, 0x16, 0xAC, + 0x33, 0x93, 0x1B, 0x3F, 0x3D, 0x7C, 0xC2, 0xB1, 0x73, 0xC4, 0xD4, 0xB5, + 0xB3, 0xE0, 0x3D, 0x10, 0x8C, 0x1C, 0x93, 0xE0, 0xAC, 0x24, 0xB0, 0xBE, + 0x45, 0xF3, 0xE6, 0x44, 0xD8, 0xEB, 0x82, 0x6D, 0x13, 0x73, 0x71, 0x2A, + 0x56, 0xD6, 0x7C, 0x25, 0xFB, 0xD6, 0xC2, 0xE9, 0xB0, 0x8A, 0xE9, 0xEB, + 0x1D, 0xA5, 0x6F, 0x19, 0xDD, 0x66, 0x6C, 0x24, 0xCF, 0x44, 0x06, 0x12, + 0xF3, 0xC0, 0xAE, 0x21, 0x8B, 0xA1, 0xDF, 0x04, 0xC2, 0x1B, 0xF1, 0xA7, + 0x3C, 0xF3, 0x68, 0xB9, 0xB2, 0xAF, 0x8C, 0x24, 0xBF, 0x75, 0x72, 0x60, + 0x18, 0x06, 0x1C, 0x3F, 0x26, 0x4D, 0x3B, 0x1B, 0xFD, 0x76, 0xC6, 0x91, + 0xB0, 0xB6, 0xD2, 0x5F, 0x67, 0xFA, 0x7D, 0xFF, 0xEC, 0xC7, 0x93, 0x7A, + 0x15, 0x4F, 0xE1, 0x1C, 0x46, 0x71, 0x1E, 0x96, 0xBE, 0xAD, 0x2F, 0x31, + 0x28, 0x71, 0xCB, 0x04, 0x21, 0xFA, 0x47, 0xB4, 0x4D, 0x8B, 0xEC, 0xD0, + 0x78, 0xA1, 0x2B, 0x1B, 0x39, 0xDB, 0x41, 0x27, 0x14, 0x28, 0xE2, 0xA8, + 0xFE, 0xAC, 0x68, 0x47, 0xFD, 0x7B, 0x4F, 0xE0, 0xA2, 0xC8, 0x7E, 0x83, + 0x86, 0xBD, 0x73, 0x03, 0x18, 0x37, 0xDB, 0x46, 0x1F, 0x6B, 0x17, 0x19, + 0x11, 0x0C, 0xA2, 0x14, 0x8B, 0x75, 0xB8, 0xB9, 0xEB, 0xC9, 0xD6, 0x0E, + 0x8D, 0x78, 0x62, 0xEB, 0x51, 0x9F, 0xE7, 0xAE, 0x96, 0x83, 0x50, 0x75, + 0x36, 0xF6, 0x7F, 0x30, 0x9B, 0x52, 0x57, 0x5B, 0x4D, 0xBC, 0x95, 0x70, + 0xCA, 0x2C, 0x8E, 0x3F, 0x59, 0xE0, 0x1C, 0x21, 0x3F, 0x81, 0x07, 0x5B, + 0x0D, 0xEB, 0x35, 0xA3, 0x04, 0x10, 0x48, 0xE8, 0x1D, 0x82, 0xEB, 0x3C, + 0x5A, 0xCF, 0xA7, 0x96, 0x6C, 0x04, 0x80, 0x38, 0x94, 0x8A, 0x5A, 0x20, + 0xDD, 0xE0, 0x84, 0x23, 0xEB, 0x88, 0x31, 0x1E, 0x75, 0xD5, 0x1B, 0x35, + 0xE0, 0xE6, 0x79, 0xDF, 0x97, 0xCF, 0x5D, 0x9A, 0xDA, 0x22, 0x55, 0xD3, + 0x37, 0xDC, 0x09, 0x4D, 0xE4, 0x06, 0x00, 0x4F, 0xA1, 0xD3, 0x8D, 0xFA, + 0xDF, 0x99, 0x67, 0x10, 0x46, 0x61, 0x1D, 0x54, 0x73, 0x7D, 0x5F, 0xF6, + 0x5C, 0x38, 0x67, 0xB4, 0x31, 0x59, 0xFF, 0xD2, 0x09, 0x28, 0x2F, 0x7C, + 0x2A, 0x95, 0xA2, 0x10, 0x55, 0xED, 0xE3, 0xBA, 0x9D, 0x8F, 0x34, 0xB8, + 0xC0, 0xC8, 0x25, 0x4D, 0xF2, 0x1C, 0x50, 0x2A, 0x60, 0xF7, 0x0D, 0x1D, + 0x29, 0xD3, 0x26, 0xF9, 0x88, 0xDD, 0xA2, 0x62, 0x1E, 0x9E, 0x84, 0xC3, + 0xB9, 0x5A, 0xAD, 0x5F, 0xA9, 0xAA, 0xC9, 0x00, 0xDA, 0xCD, 0x89, 0xB5, + 0x33, 0xEB, 0x3B, 0x02, 0xBC, 0x86, 0xD5, 0x46, 0x95, 0x43, 0xC7, 0xD7, + 0x5E, 0x19, 0x99, 0xD7, 0xB5, 0x5F, 0x9D, 0x60, 0x11, 0x84, 0xA0, 0xDB, + 0x24, 0x13, 0xBD, 0x88, 0xAC, 0xBE, 0x04, 0x0E, 0x43, 0xF0, 0x6F, 0x2D, + 0x28, 0xBF, 0x23, 0xA0, 0x27, 0xF4, 0xDF, 0xA5, 0xAD, 0x51, 0x77, 0xE3, + 0x17, 0x8A, 0x4C, 0x74, 0x32, 0x70, 0x91, 0x39, 0xB2, 0xE6, 0xA8, 0x55, + 0x87, 0xF5, 0xDD, 0x6D, 0xA6, 0x7B, 0x53, 0x1F, 0xFF, 0xFD, 0xB2, 0x97, + 0x59, 0x8E, 0x5F, 0xB3, 0x54, 0xDB, 0xF7, 0x5C, 0x57, 0x4E, 0xDD, 0xF6, + 0x36, 0x23, 0xBF, 0xBE, 0xB9, 0xD0, 0x2C, 0x9E, 0xDA, 0x4B, 0x33, 0x38, + 0x5A, 0x25, 0xED, 0xFE, 0x00, 0x08, 0xE5, 0x64, 0xC3, 0x95, 0x00, 0xAA, + 0x96, 0xD3, 0xA9, 0x39, 0xB8, 0xE4, 0x47, 0x72, 0x6C, 0xEB, 0x1A, 0x93, + 0x37, 0x9E, 0xD6, 0x1E, 0x5C, 0x6D, 0xDB, 0x74, 0x42, 0x16, 0x95, 0x44, + 0x7E, 0x3B, 0xAE, 0xBC, 0x02, 0x15, 0x93, 0xB9, 0x07, 0xBF, 0xFD, 0x4B, + 0xD2, 0x94, 0xF2, 0x35, 0xFD, 0xA1, 0x44, 0x37, 0x74, 0xFB, 0x45, 0x46, + 0x83, 0x39, 0x1D, 0xA8, 0xE9, 0xE8, 0x9C, 0x67, 0x55, 0xEC, 0x2C, 0x59, + 0xF8, 0x3E, 0x6A, 0x54, 0x75, 0x23, 0x1F, 0x90, 0xCE, 0x6A, 0xAA, 0x5C, + 0x80, 0x93, 0x6E, 0x6D, 0x2C, 0xC3, 0x5A, 0xF2, 0xA2, 0x93, 0x97, 0xAA, + 0x7F, 0xAA, 0x76, 0x0B, 0x59, 0x6D, 0x39, 0x38, 0x32, 0x00, 0xA1, 0xF5, + 0x39, 0x94, 0x60, 0x9D, 0xD3, 0xE6, 0xF8, 0xF8, 0x14, 0xC4, 0x6D, 0x47, + 0x21, 0x66, 0x43, 0xE4, 0xCB, 0x07, 0x0D, 0xBD, 0xD9, 0x55, 0xDD, 0x03, + 0x75, 0x90, 0x91, 0x38, 0x3F, 0x32, 0xE6, 0x73, 0x34, 0xC9, 0xC0, 0x87, + 0x3A, 0xC5, 0x62, 0x25, 0x1D, 0x74, 0xB8, 0x0D, 0xA5, 0xED, 0xAF, 0x20, + 0xC1, 0x0D, 0xA6, 0x2C, 0x78, 0xC2, 0x46, 0xEA, 0x05, 0xDE, 0x06, 0x47, + 0x8D, 0xE2, 0x42, 0x1B, 0x4F, 0x44, 0xEE, 0x83, 0x1A, 0xD7, 0x66, 0x49, + 0xBE, 0xD0, 0x8C, 0x58, 0x73, 0xF1, 0x9F, 0x97, 0x74, 0x11, 0xA6, 0x4A, + 0x07, 0xDA, 0xA5, 0x75, 0x3D, 0x4A, 0x0F, 0x0D, 0x06, 0x56, 0xB2, 0x5F, + 0x5A, 0x8E, 0x2A, 0x1C, 0x38, 0x72, 0xBF, 0xC4, 0xD1, 0x06, 0x55, 0xB2, + 0x73, 0xC0, 0x9D, 0x5F, 0x2F, 0x9B, 0x07, 0x17, 0xA7, 0x44, 0xA0, 0x0A, + 0x0E, 0xE4, 0x72, 0xB7, 0x70, 0x2E, 0x1E, 0x82, 0x76, 0x63, 0xB5, 0xC1, + 0x8F, 0x03, 0x6C, 0xEE, 0x80, 0x3C, 0x86, 0xE1, 0x8E, 0x56, 0xD7, 0x14, + 0x37, 0x77, 0x93, 0x9C, 0xB6, 0xE0, 0xFC, 0x49, 0x64, 0x56, 0x77, 0xAE, + 0x4E, 0xB0, 0x28, 0xBA, 0x5B, 0x49, 0x5A, 0xB8, 0x83, 0xD8, 0x6B, 0xE5, + 0x41, 0x7A, 0x65, 0x8C, 0xC1, 0x71, 0xDD, 0x97, 0x01, 0xA8, 0x9A, 0xAD, + 0xC8, 0x43, 0xAB, 0xA6, 0xDC, 0x71, 0xD7, 0x9A, 0xCB, 0x99, 0x5F, 0xCA, + 0x4D, 0x75, 0xC7, 0xE4, 0x20, 0x0A, 0x12, 0xE5, 0x45, 0x64, 0x19, 0x7E, + 0x32, 0x50, 0x67, 0x22, 0x5C, 0x88, 0xA4, 0xAB, 0x30, 0x97, 0x42, 0xF7, + 0xE6, 0x17, 0x35, 0xD5, 0xFE, 0xF3, 0x51, 0xD3, 0x6F, 0x2A, 0xB6, 0x01, + 0x9B, 0x80, 0x4F, 0x86, 0x1F, 0xA7, 0x2B, 0xF5, 0x84, 0xD9, 0xBB, 0x0E, + 0xE6, 0x2A, 0x05, 0x22, 0xBE, 0xFF, 0x21, 0xCD, 0xFD, 0xCD, 0x85, 0x62, + 0xAC, 0xC3, 0xC1, 0x99, 0xDD, 0x8F, 0xDB, 0xCD, 0xDC, 0xD5, 0xA7, 0x08, + 0x75, 0x9B, 0x3F, 0x44, 0xB9, 0x91, 0xE9, 0xF0, 0x56, 0x59, 0x33, 0x9F, + 0xC3, 0xBD, 0x08, 0x04, 0x17, 0x93, 0x3C, 0x41, 0x66, 0x14, 0x20, 0x44, + 0x01, 0x46, 0xEB, 0x05, 0x10, 0xBF, 0x6A, 0xAF, 0x4E, 0x44, 0x8C, 0xE1, + 0xBB, 0xB9, 0x86, 0x64, 0x64, 0xB4, 0xDE, 0x7C, 0x17, 0x92, 0xD3, 0x9B, + 0x98, 0x23, 0xAA, 0x8C, 0x15, 0xE8, 0xBC, 0xEC, 0xDA, 0x58, 0x3D, 0x8F, + 0x53, 0x66, 0x66, 0xA1, 0x87, 0xD1, 0x75, 0x56, 0xFD, 0x9F, 0x6C, 0x72, + 0x65, 0xDF, 0x2D, 0x48, 0x58, 0x44, 0xD4, 0x6D, 0xD4, 0x47, 0xFD, 0x4C, + 0xF1, 0xBA, 0x76, 0x55, 0xD5, 0x35, 0x76, 0x97, 0x1D, 0x25, 0x8B, 0x20, + 0xEA, 0x70, 0x6B, 0x7B, 0x8A, 0x44, 0xA0, 0xC6, 0x04, 0x14, 0xD1, 0x91, + 0x50, 0x5E, 0x8E, 0xDC, 0xBC, 0xF9, 0xEA, 0xC2, 0xF7, 0x08, 0x0B, 0x20, + 0x46, 0x8F, 0x44, 0x2F, 0xD8, 0xAF, 0x16, 0xD8, 0x9A, 0xEA, 0x7A, 0x93, + 0x22, 0xAB, 0x3D, 0x6B, 0x82, 0x81, 0x3D, 0xE8, 0x3B, 0x33, 0xA4, 0x2E, + 0x6D, 0x4B, 0x24, 0xFD, 0x00, 0x9C, 0xA6, 0x6F, 0x84, 0xC0, 0xE8, 0xDE, + 0x66, 0x8C, 0xDF, 0x10, 0xE0, 0x13, 0xF1, 0x6C, 0xC6, 0x2E, 0x29, 0xD9, + 0xB3, 0x77, 0xB4, 0x5E, 0xFB, 0xE9, 0x10, 0x89, 0xC5, 0x23, 0x36, 0x1C, + 0x59, 0xD8, 0xE4, 0x78, 0x45, 0x00, 0xCB, 0xC8, 0x31, 0xE1, 0x5A, 0x78, + 0x6E, 0x05, 0x56, 0x82, 0xF0, 0x66, 0x4A, 0x40, 0xA4, 0x49, 0xA8, 0x3A, + 0xF0, 0x32, 0x55, 0xAD, 0x21, 0xE8, 0x56, 0xDB, 0x4C, 0xB5, 0xD4, 0x45, + 0x89, 0x57, 0x53, 0xFC, 0x65, 0x23, 0xA7, 0xF0, 0x78, 0x61, 0xC6, 0x4A, + 0x32, 0x1F, 0x95, 0xAE, 0x69, 0x46, 0x28, 0xBF, 0xB4, 0x88, 0xD7, 0x18, + 0xF6, 0xD3, 0xBE, 0xD4, 0x00, 0x8C, 0x44, 0x17, 0xDC, 0xA1, 0x65, 0x06, + 0xF4, 0xE4, 0x9D, 0x51, 0x40, 0x49, 0x30, 0xD1, 0x5A, 0x09, 0xE6, 0xBD, + 0x2A, 0x16, 0x47, 0xDD, 0x14, 0x68, 0xF4, 0xED, 0xEB, 0xD5, 0xF2, 0xF5, + 0xF3, 0x1C, 0xEC, 0xCF, 0x89, 0x10, 0x9C, 0xDF, 0x26, 0x4C, 0xD7, 0x50, + 0xE6, 0x0F, 0x8B, 0x64, 0x86, 0x36, 0x05, 0x35, 0x6C, 0xED, 0x80, 0x9E, + 0x68, 0x1E, 0x44, 0x1D, 0xF7, 0x4C, 0xD9, 0xC2, 0xEB, 0x81, 0x6A, 0xB3, + 0xA0, 0xE4, 0xFC, 0x06, 0x84, 0x5B, 0xFE, 0x8A, 0x82, 0xE4, 0xD0, 0x20, + 0x11, 0x78, 0x0F, 0xD5, 0xDC, 0x4B, 0x6F, 0xCA, 0xCE, 0x2B, 0xB4, 0x0A, + 0x67, 0x1A, 0x19, 0x19, 0xA0, 0x06, 0x5C, 0x56, 0xC1, 0x45, 0xA7, 0x3E, + 0xDC, 0xD2, 0x41, 0x59, 0x75, 0x59, 0x7E, 0xCB, 0xB7, 0x0B, 0x9C, 0x44, + 0xA8, 0x81, 0x6C, 0xF7, 0x89, 0x49, 0x67, 0x11, 0xCF, 0xB8, 0x0D, 0x44, + 0x87, 0x97, 0x97, 0xDC, 0x44, 0xF8, 0x37, 0x93, 0xE4, 0x14, 0xAC, 0xF7, + 0xB1, 0x64, 0xA4, 0x2C, 0xDF, 0xC5, 0x04, 0xB1, 0x99, 0x9B, 0x6F, 0x85, + 0x7F, 0x77, 0x11, 0xF6, 0x70, 0x6A, 0xF6, 0xE4, 0x54, 0xE7, 0xEC, 0xBC, + 0x29, 0xE8, 0x11, 0x0A, 0x24, 0x8F, 0xB6, 0xC7, 0xE8, 0x76, 0x65, 0x54, + 0x05, 0x54, 0x80, 0x46, 0x4D, 0xA9, 0x8A, 0xF8, 0x6E, 0x46, 0x01, 0x7B, + 0xD6, 0x42, 0x74, 0x54, 0x43, 0xE9, 0xC7, 0xE5, 0x1E, 0xAB, 0x28, 0x66, + 0xF7, 0x0A, 0xF0, 0x86, 0x71, 0x7B, 0x05, 0x50, 0xDF, 0xAB, 0x7D, 0x19, + 0x04, 0x5D, 0x48, 0x31, 0xD2, 0xE1, 0x75, 0x3C, 0xFF, 0xDB, 0x4A, 0xC1, + 0xAA, 0x63, 0xEE, 0x2C, 0xF9, 0x79, 0x11, 0x1E, 0x09, 0xCF, 0x86, 0x86, + 0x0B, 0x4E, 0xD1, 0x94, 0x13, 0x3F, 0x29, 0xE5, 0x81, 0xA8, 0x12, 0x41, + 0xF3, 0xF3, 0x83, 0x2B, 0x2F, 0xF4, 0x18, 0x10, 0x43, 0x16, 0x95, 0xD7, + 0xF8, 0x3E, 0x32, 0x9E, 0x2E, 0x93, 0x08, 0xE3, 0x80, 0xD0, 0x52, 0xDD, + 0x68, 0x71, 0x82, 0x2A, 0x16, 0x02, 0xBF, 0xE1, 0x45, 0x93, 0x2A, 0x98, + 0x49, 0x87, 0x2A, 0x3C, 0xDF, 0xA0, 0xCD, 0x4C, 0x64, 0x8A, 0xAE, 0xBC, + 0x39, 0x71, 0xF8, 0xBA, 0xE6, 0xAB, 0x21, 0x60, 0x34, 0x74, 0x54, 0x99, + 0xCD, 0x9F, 0x94, 0xB6, 0xE7, 0x62, 0x3A, 0xB7, 0x4D, 0xCB, 0x27, 0xE4, + 0xC8, 0x92, 0xF5, 0x45, 0x6E, 0x32, 0x91, 0x15, 0x8C, 0x4E, 0x10, 0x76, + 0x1A, 0x93, 0x2C, 0x4E, 0xBD, 0xDA, 0x27, 0x3F, 0x99, 0xAA, 0xB7, 0x3D, + 0xF0, 0xFB, 0x34, 0xB2, 0xD2, 0x7A, 0x23, 0xBA, 0xCF, 0xF4, 0xDE, 0xDB, + 0xCC, 0x8C, 0xB1, 0x2D, 0x4A, 0xD6, 0xCA, 0xC0, 0xD8, 0x70, 0x58, 0xBC, + 0x9E, 0x22, 0x92, 0xAB, 0xD8, 0xFB, 0xE7, 0xBC, 0xEB, 0x81, 0xB3, 0x77, + 0x70, 0x31, 0x86, 0xE1, 0x79, 0xD8, 0x52, 0xD0, 0x6D, 0x39, 0x14, 0x78, + 0x73, 0x52, 0x96, 0xE5, 0xBC, 0x2E, 0x42, 0x90, 0x43, 0x2D, 0x81, 0x31, + 0x01, 0xE1, 0xA4, 0x59, 0x83, 0x6E, 0xB5, 0x02, 0x8F, 0x53, 0xD0, 0x04, + 0x82, 0x0B, 0x60, 0xF0, 0xC6, 0x5F, 0xE4, 0x07, 0x6C, 0x8E, 0xF3, 0xC9, + 0x15, 0x15, 0x38, 0xB6, 0x1A, 0x17, 0x0A, 0x52, 0xEF, 0xEF, 0xDC, 0x03, + 0x4E, 0x62, 0x5E, 0xF6, 0x7E, 0xAD, 0xCA, 0x52, 0xA6, 0xBC, 0x21, 0xC9, + 0x0A, 0x15, 0xAB, 0xA6, 0xDF, 0x6C, 0xB1, 0xF9, 0xC6, 0xF3, 0x53, 0x3B, + 0xA9, 0x87, 0x06, 0x62, 0x18, 0xBA, 0x06, 0x23, 0xC8, 0xA8, 0x72, 0xC7, + 0x89, 0x1E, 0x1D, 0xEC, 0x5E, 0x46, 0xB9, 0xBE, 0x38, 0x04, 0x0B, 0x29, + 0x69, 0x60, 0x97, 0x2E, 0x6F, 0x6A, 0x7F, 0x7A, 0xDD, 0x9C, 0x4A, 0x60, + 0x2D, 0x19, 0x16, 0x1A, 0xD6, 0x25, 0xAB, 0x17, 0x44, 0x5E, 0x51, 0x5B, + 0xC3, 0x4D, 0x36, 0xC0, 0xEE, 0xA3, 0x8B, 0x10, 0x78, 0x4D, 0xC3, 0x00, + 0xB5, 0x07, 0x19, 0xA4, 0xC0, 0x3C, 0x99, 0x4B, 0x70, 0x48, 0xBB, 0x53, + 0xFB, 0x21, 0x4D, 0x9B, 0x2B, 0x4C, 0x75, 0x6D, 0x0B, 0x86, 0x49, 0x27, + 0x76, 0x61, 0x1D, 0xBB, 0x8C, 0x9F, 0xCB, 0x3B, 0xF6, 0x2F, 0x63, 0x64, + 0x65, 0x2C, 0x38, 0x9E, 0xE7, 0x12, 0x85, 0xA7, 0x29, 0x48, 0xE9, 0xC6, + 0xDB, 0x2D, 0xA6, 0x54, 0x5A, 0xD5, 0xE0, 0xB6, 0x77, 0xA1, 0x78, 0x84, + 0x52, 0xD7, 0xC1, 0x5B, 0x9D, 0x0D, 0x8A, 0x70, 0x3E, 0x72, 0x6A, 0x5D, + 0x63, 0x0D, 0xEF, 0x97, 0x68, 0x78, 0x1F, 0x35, 0xDA, 0x98, 0x6E, 0x25, + 0x05, 0xCC, 0xF3, 0xC0, 0x1E, 0x4F, 0xD2, 0x29, 0xE4, 0x26, 0xC2, 0x32, + 0xE6, 0xA0, 0x65, 0xFE, 0x3E, 0xDB, 0x71, 0xAB, 0x85, 0x79, 0xAB, 0xC9, + 0x8D, 0xD1, 0x8A, 0xF2, 0xA2, 0x62, 0xE7, 0x4F, 0xC5, 0xCD, 0x09, 0x94, + 0xFD, 0xF0, 0x0E, 0xA2, 0x3D, 0x98, 0x8E, 0x65, 0x35, 0x5F, 0xC8, 0xD5, + 0xCC, 0xE2, 0xED, 0x3B, 0x50, 0xB5, 0x52, 0x57, 0xB1, 0x04, 0xA1, 0x6E, + 0x48, 0x58, 0xE5, 0x61, 0x75, 0x8D, 0xD2, 0x34, 0x21, 0x62, 0xC3, 0xD2, + 0x0C, 0x51, 0xF1, 0x2B, 0xD4, 0xF7, 0xA7, 0x04, 0xE7, 0x22, 0x7B, 0xC0, + 0xF0, 0x14, 0xFF, 0x3F, 0xAD, 0x46, 0xED, 0xF3, 0xC1, 0xC6, 0x4D, 0xE7, + 0x95, 0x86, 0x60, 0xE3, 0x6E, 0x01, 0xE8, 0x96, 0xEF, 0x85, 0xF3, 0xC0, + 0x8C, 0xF1, 0x7D, 0x70, 0x4E, 0x69, 0x5C, 0x06, 0xD0, 0xF9, 0x71, 0x0D, + 0x9C, 0x6F, 0x5F, 0xC9, 0xFC, 0x27, 0x32, 0x13, 0x0A, 0xA2, 0x79, 0x31, + 0x91, 0x19, 0xFE, 0x50, 0xA5, 0x49, 0xC5, 0x39, 0x9E, 0x7C, 0xD6, 0x89, + 0xF9, 0x85, 0x1D, 0x08, 0x1A, 0xD1, 0xF1, 0xA5, 0x9C, 0x35, 0xE9, 0x24, + 0x12, 0xDC, 0x15, 0x89, 0x30, 0xB9, 0x99, 0xEF, 0x54, 0x79, 0xCC, 0x68, + 0x78, 0xFE, 0x77, 0xDE, 0x51, 0xAD, 0x89, 0x7A, 0x4C, 0x31, 0x29, 0x1D, + 0x70, 0x45, 0x80, 0xC6, 0x7D, 0xA4, 0xFD, 0xE4, 0x86, 0xA0, 0xA2, 0x4A, + 0x31, 0x17, 0xA9, 0xD0, 0x08, 0xCC, 0xF9, 0xEF, 0x3C, 0x71, 0x1A, 0xEE, + 0xFA, 0x94, 0x83, 0x1D, 0x2B, 0xEF, 0x19, 0x00, 0xD0, 0x43, 0xB8, 0x10, + 0x35, 0x63, 0x06, 0x9D, 0xA8, 0xFC, 0xF9, 0xC3, 0x07, 0x39, 0x48, 0x0E, + 0x86, 0x95, 0x80, 0xD2, 0x9E, 0xB0, 0x9E, 0x89, 0x96, 0x2D, 0x58, 0x5D, + 0xD6, 0x88, 0x77, 0xEB, 0x64, 0xC0, 0xA2, 0xB6, 0xCD, 0x96, 0x7D, 0xE2, + 0xC8, 0x21, 0x93, 0x65, 0x51, 0xF1, 0x17, 0xAE, 0xB7, 0xF8, 0xBF, 0x90, + 0x54, 0x40, 0xE0, 0x9C, 0xD0, 0xDE, 0xD7, 0xFC, 0x18, 0x55, 0x6B, 0x58, + 0x0C, 0x17, 0xC7, 0xA3, 0x06, 0x93, 0x9B, 0x2F, 0x68, 0x7E, 0x7D, 0x0F, + 0x0C, 0xC8, 0x6F, 0xC5, 0xDB, 0x37, 0xA1, 0x46, 0xE4, 0xDA, 0x1E, 0x66, + 0x06, 0xF3, 0x24, 0xB0, 0x05, 0xA2, 0x16, 0x76, 0x2D, 0xA4, 0xA2, 0x27, + 0x18, 0x56, 0x63, 0x92, 0xD8, 0xED, 0x9D, 0xA7, 0x3A, 0xC0, 0xA8, 0xFE, + 0x24, 0x0F, 0x06, 0xC4, 0x05, 0x74, 0xA5, 0x31, 0xA0, 0x42, 0xFC, 0x59, + 0xD0, 0xC3, 0x79, 0x6E, 0x1D, 0x6E, 0x35, 0xFC, 0xBB, 0x58, 0x20, 0x0D, + 0x5B, 0xA6, 0xAF, 0xBD, 0x07, 0x81, 0xBC, 0xBE, 0x52, 0x37, 0x20, 0x4C, + 0x0D, 0x6A, 0x28, 0xE6, 0x12, 0x3D, 0x0B, 0x84, 0xE1, 0xBE, 0x4F, 0x93, + 0x56, 0x5A, 0xCB, 0x82, 0x23, 0x8C, 0xF1, 0xF9, 0xB1, 0xEB, 0xAC, 0x5C, + 0x88, 0xB4, 0xC0, 0xF8, 0x6A, 0x78, 0x40, 0x13, 0x43, 0xA3, 0xB9, 0xE3, + 0x65, 0xE8, 0xAA, 0x0A, 0xC3, 0xCB, 0x19, 0x9A, 0x7B, 0x76, 0xBA, 0x2A, + 0xBF, 0x48, 0xAF, 0xFA, 0x9A, 0xFD, 0x69, 0x46, 0x27, 0x7F, 0x34, 0xF8, + 0x9F, 0x89, 0x87, 0xB8, 0x5E, 0x34, 0xCE, 0x40, 0x9E, 0xE7, 0x0E, 0xC1, + 0x29, 0x27, 0x5F, 0xD4, 0xEB, 0x5F, 0x3A, 0xD3, 0x20, 0xD7, 0xCC, 0x4B, + 0x04, 0x22, 0xD5, 0x48, 0x3B, 0x87, 0x7E, 0x80, 0x31, 0xD0, 0xCF, 0xEB, + 0x9E, 0xAB, 0xAE, 0xF0, 0x98, 0x5B, 0x50, 0xC3, 0xED, 0x5A, 0xF9, 0xF8, + 0xC6, 0xA2, 0xF9, 0x6E, 0x32, 0x22, 0x46, 0x74, 0x01, 0x55, 0xE2, 0x40, + 0xA2, 0x0D, 0x15, 0xEA, 0x4B, 0x67, 0x9A, 0x61, 0x5E, 0x10, 0x40, 0x43, + 0xE8, 0xDF, 0x81, 0xB3, 0x4C, 0x0C, 0x27, 0x1F, 0x04, 0x74, 0x5F, 0x49, + 0x3E, 0x81, 0x6F, 0x52, 0xC8, 0x4A, 0xD7, 0x0F, 0xD8, 0xCB, 0x6F, 0x0B, + 0x76, 0xBE, 0xB2, 0x64, 0xE0, 0x02, 0x08, 0xC6, 0x9E, 0x17, 0xDC, 0x37, + 0x76, 0xD4, 0x94, 0xE4, 0xAC, 0xA0, 0x7A, 0x06, 0x4A, 0x48, 0x30, 0x16, + 0x54, 0x5B, 0xB8, 0x03, 0x4D, 0x83, 0x67, 0x56, 0x2F, 0x37, 0xFD, 0xC7, + 0xC3, 0x60, 0xCC, 0xF9, 0x9D, 0x71, 0x9F, 0x0F, 0xE4, 0xDE, 0x4F, 0xE1, + 0xE0, 0x4A, 0xF5, 0xEB, 0xB1, 0x19, 0x92, 0xDF, 0x20, 0x9D, 0x7E, 0x99, + 0x0A, 0x06, 0xB6, 0x90, 0x25, 0x3A, 0x6E, 0x21, 0x10, 0x8F, 0x71, 0xAF, + 0x7B, 0x26, 0xB3, 0x48, 0x85, 0x1E, 0x37, 0x14, 0x16, 0x6C, 0x71, 0x2A, + 0xED, 0x0A, 0x73, 0xFB, 0x9B, 0x8B, 0x30, 0xC6, 0x6B, 0xE5, 0xCD, 0x29, + 0x4B, 0xE3, 0x16, 0xC7, 0x8B, 0x97, 0x24, 0xE6, 0xD6, 0x5D, 0x4C, 0x66, + 0xAE, 0xE6, 0x28, 0xC3, 0x79, 0x93, 0xE5, 0x38, 0xE9, 0x83, 0x9C, 0x3B, + 0xAC, 0x90, 0x8F, 0x7C, 0x73, 0x4E, 0xA7, 0xC9, 0x56, 0x39, 0x75, 0x20, + 0xE1, 0x94, 0x4A, 0x34, 0x99, 0xF1, 0x6D, 0x47, 0xD5, 0x51, 0x24, 0x0A, + 0xD3, 0x3B, 0xB6, 0x4F, 0x87, 0xD2, 0x8C, 0x3E, 0xAE, 0xCD, 0xC0, 0xBA, + 0xCA, 0x51, 0xAC, 0x56, 0xBD, 0xB5, 0xAA, 0xAC, 0xA4, 0xB0, 0xC5, 0x7E, + 0xD8, 0x7B, 0x50, 0xC2, 0x8B, 0x0F, 0xCE, 0x14, 0xEB, 0xB6, 0x0C, 0x0A, + 0x0F, 0x2D, 0xE0, 0xFF, 0x8D, 0x3C, 0xCE, 0x0E, 0x98, 0xF3, 0x97, 0x44, + 0x28, 0xE8, 0x6C, 0x0B, 0x90, 0x7F, 0xAB, 0xD1, 0xB6, 0xA2, 0xDE, 0x7F, + 0x49, 0x30, 0x52, 0x45, 0x90, 0x8F, 0xB2, 0x3E, 0x50, 0x3E, 0x24, 0x72, + 0x11, 0xB8, 0xB6, 0x20, 0x69, 0xC1, 0x85, 0x54, 0xD4, 0x33, 0x46, 0xEC, + 0x99, 0xDD, 0x21, 0xB9, 0x37, 0x2A, 0x81, 0xD0, 0xC2, 0xC8, 0x19, 0xEC, + 0x95, 0x7B, 0x5E, 0xC5, 0xBC, 0x08, 0x53, 0x36, 0xD9, 0xE1, 0x51, 0x50, + 0xD3, 0x7B, 0xB2, 0xDA, 0xF9, 0x33, 0x92, 0xBF, 0x17, 0x28, 0xF4, 0x1C, + 0x5E, 0x35, 0x4C, 0x74, 0xD4, 0x82, 0xFA, 0xBA, 0xBE, 0x89, 0x81, 0x44, + 0x10, 0xBE, 0x9D, 0x2E, 0xBA, 0x40, 0xF0, 0x83, 0xE3, 0x42, 0xF4, 0x5F, + 0x4D, 0x2A, 0xFD, 0xC5, 0x5D, 0xF1, 0xCE, 0x83, 0x20, 0xD6, 0xEF, 0xBF, + 0xB1, 0xBB, 0xC4, 0xC7, 0x53, 0x69, 0x10, 0x80, 0x65, 0x73, 0xBF, 0xCE, + 0x0A, 0x41, 0x03, 0xEF, 0x4A, 0xB4, 0xA7, 0x23, 0x7D, 0x6C, 0xE8, 0x5F, + 0x2F, 0x44, 0x96, 0xD9, 0xD3, 0x10, 0xA5, 0xF7, 0xAA, 0x5C, 0x18, 0xA0, + 0x31, 0x00, 0xB9, 0xB2, 0xD9, 0x12, 0x1C, 0x4B, 0x22, 0x66, 0xCF, 0xED, + 0xB8, 0xC3, 0xF7, 0xE6, 0x1A, 0xF5, 0xCE, 0xA4, 0xEB, 0xED, 0x69, 0xE8, + 0x38, 0xA0, 0x9F, 0x47, 0x3E, 0x4C, 0x51, 0xDC, 0xFB, 0x4B, 0x34, 0xBC, + 0xFA, 0xD4, 0x52, 0xFC, 0x11, 0x6F, 0xBA, 0x3E, 0x06, 0x82, 0x4B, 0x06, + 0x8F, 0x8A, 0x66, 0x2C, 0xAE, 0x9B, 0x5F, 0x1D, 0x74, 0x46, 0xBF, 0x9B, + 0xB3, 0x94, 0x7A, 0xE2, 0xEE, 0x68, 0xB4, 0x91, 0x37, 0x44, 0x8A, 0xF6, + 0x2C, 0xC5, 0x99, 0x7E, 0x68, 0x3A, 0xED, 0x2E, 0x05, 0x0B, 0xBF, 0xCB, + 0x99, 0x31, 0xBC, 0xBD, 0x96, 0x26, 0x2F, 0x11, 0xA3, 0xEC, 0x67, 0x3D, + 0xBF, 0x08, 0x02, 0xAB, 0x12, 0x43, 0x39, 0x60, 0xCE, 0xCF, 0x35, 0xE8, + 0x88, 0xC6, 0x57, 0xA4, 0x7A, 0x35, 0x80, 0x48, 0x3C, 0x6C, 0xC9, 0x9B, + 0xDA, 0xE5, 0xB3, 0x48, 0x51, 0x92, 0x7B, 0x8B, 0x45, 0xFB, 0x5F, 0x88, + 0xDB, 0x95, 0x73, 0xC2, 0x43, 0xD2, 0x92, 0xA3, 0x34, 0x0F, 0xCB, 0x83, + 0x90, 0x78, 0xE6, 0x7A, 0x45, 0x9C, 0xEA, 0xD5, 0x03, 0xCC, 0xEB, 0xB3, + 0x74, 0xE2, 0x0E, 0x9A, 0xB5, 0xFB, 0xF2, 0x48, 0x5C, 0x3E, 0xB1, 0x67, + 0x0C, 0xB8, 0x6C, 0x36, 0x08, 0x84, 0xC6, 0x4C, 0x82, 0x98, 0xE4, 0xD8, + 0x1D, 0x58, 0x15, 0xAC, 0xC4, 0x41, 0xF7, 0x9D, 0x08, 0x64, 0x4A, 0xE9, + 0x74, 0x7E, 0x3B, 0x91, 0xC1, 0xE3, 0x9A, 0x0E, 0x81, 0x5C, 0xD1, 0x5C, + 0x7A, 0x95, 0x02, 0xD4, 0x28, 0x30, 0xD4, 0xE0, 0xAE, 0xB8, 0xF1, 0x7B, + 0xCF, 0xAC, 0x50, 0x90, 0xEF, 0x8F, 0x18, 0xD1, 0x9A, 0x19, 0x6F, 0x41, + 0x65, 0xCB, 0x28, 0xBD, 0x9C, 0xB6, 0x27, 0x65, 0x8B, 0xB5, 0xB8, 0x08, + 0xC7, 0x41, 0xBC, 0xF2, 0x63, 0x6D, 0x9C, 0xD7, 0x69, 0x03, 0xBF, 0xB0, + 0x7B, 0x04, 0xCC, 0xFD, 0x74, 0xA0, 0xBD, 0x81, 0x08, 0x86, 0x4F, 0x42, + 0x25, 0xD2, 0x4A, 0x66, 0x49, 0x3E, 0xD0, 0x7A, 0x3D, 0x54, 0xCB, 0x50, + 0x94, 0xF3, 0x7F, 0x3A, 0xF2, 0x91, 0xE6, 0x5E, 0x11, 0xC6, 0xA4, 0x76, + 0x97, 0xC3, 0x6C, 0x21, 0x0E, 0xB6, 0xBA, 0x10, 0x4A, 0xE3, 0xDC, 0xDC, + 0x43, 0x3B, 0xF0, 0x0B, 0x47, 0x65, 0xB9, 0xD7, 0x0B, 0x32, 0xFD, 0xF5, + 0x51, 0x03, 0xEA, 0x8C, 0x01, 0x65, 0xC4, 0x6B, 0x25, 0xF1, 0xC2, 0x3A, + 0x09, 0x65, 0x1D, 0x58, 0xDE, 0xF4, 0x2B, 0xC7, 0x67, 0x30, 0x04, 0x08, + 0x0A, 0x7A, 0x3A, 0x4B, 0xE4, 0xE7, 0xE8, 0xBE, 0xFF, 0x05, 0x42, 0xFC, + 0xE0, 0x1F, 0xAE, 0xA8, 0x75, 0xBA, 0xE9, 0xDC, 0x8C, 0xBD, 0x30, 0xB8, + 0x1D, 0x04, 0x57, 0xD3, 0x93, 0x1A, 0x43, 0x93, 0xFE, 0x5D, 0x6A, 0x28, + 0xBE, 0xE0, 0x39, 0xB2, 0xCC, 0xF0, 0x7D, 0x06, 0x4C, 0x95, 0xFC, 0x62, + 0xC7, 0x05, 0xEB, 0x16, 0x88, 0x2B, 0x0E, 0x96, 0xF1, 0xC7, 0x43, 0xC2, + 0xB7, 0xE9, 0x2F, 0xEC, 0xA0, 0x5C, 0x9A, 0xD7, 0x26, 0x64, 0x69, 0xDB, + 0x13, 0x25, 0xD8, 0x43, 0xE0, 0x5B, 0x0B, 0xA1, 0xE4, 0xB0, 0xF2, 0x4E, + 0x6A, 0x9C, 0xF4, 0x7B, 0x9E, 0xE3, 0xB7, 0xD4, 0xC6, 0x10, 0xF2, 0x37, + 0x45, 0x8A, 0x6B, 0x97, 0x28, 0x2E, 0x0E, 0xA0, 0x93, 0x13, 0xF7, 0x0B, + 0x8A, 0xB9, 0x9F, 0xC0, 0xE4, 0x4A, 0xED, 0xE1, 0x79, 0x32, 0x31, 0x97, + 0x2B, 0xB7, 0x09, 0xB5, 0xB9, 0xE3, 0x57, 0x56, 0x5F, 0x81, 0x28, 0x85, + 0xAA, 0xF8, 0x69, 0x77, 0x40, 0x74, 0xD6, 0x4B, 0x7A, 0xAC, 0xD5, 0x2D, + 0x74, 0xB4, 0x67, 0x89, 0xE1, 0xF1, 0xD9, 0x1F, 0xB8, 0xDC, 0xDF, 0x0D, + 0x8D, 0xA6, 0xA7, 0x8D, 0xF1, 0x59, 0x30, 0xD6, 0x00, 0x26, 0xD1, 0x21, + 0x2E, 0xE7, 0xB7, 0x91, 0x2E, 0xA9, 0xF6, 0xD0, 0x5A, 0xB6, 0x8A, 0x34, + 0x59, 0x92, 0x9E, 0x37, 0x1E, 0xD9, 0x38, 0x2A, 0xAE, 0x12, 0xD4, 0x95, + 0x8B, 0xE8, 0xA7, 0x5D, 0x8C, 0x92, 0xA1, 0x8A, 0x4D, 0x9E, 0x64, 0x20, + 0xA2, 0x7E, 0xCC, 0x39, 0x50, 0xA4, 0x01, 0xEC, 0xA7, 0xF5, 0x6D, 0x88, + 0x8E, 0xB6, 0xCE, 0xA4, 0x58, 0xAA, 0xFB, 0xCA, 0xC5, 0x67, 0x26, 0x07, + 0xBB, 0xEC, 0xFB, 0x73, 0x5D, 0x48, 0x9B, 0x49, 0xFE, 0x99, 0x25, 0x6D, + 0x82, 0x1F, 0x6E, 0x6E, 0x1E, 0x21, 0xBF, 0x94, 0x52, 0xB7, 0xAC, 0x8E, + 0x74, 0x22, 0x10, 0x27, 0x14, 0x6F, 0xDC, 0x80, 0xBD, 0xB3, 0xD6, 0xAD, + 0x1F, 0x17, 0x59, 0x6B, 0x42, 0x68, 0xBD, 0x37, 0xCF, 0xC6, 0x46, 0x11, + 0x64, 0x9E, 0xEB, 0xF5, 0xCD, 0xA2, 0x5F, 0x3F, 0xC8, 0x0E, 0x1F, 0xCC, + 0xFA, 0xE0, 0x59, 0xC4, 0x82, 0x8B, 0x8E, 0xC4, 0x8C, 0x96, 0x56, 0xF5, + 0x16, 0x2A, 0x53, 0x0E, 0x36, 0xC9, 0x61, 0x34, 0x3F, 0x0F, 0x73, 0xC3, + 0xD9, 0x0C, 0x3B, 0x74, 0xD5, 0x97, 0x3F, 0x2D, 0x1B, 0xCF, 0x1F, 0xD2, + 0xFC, 0xFF, 0xBC, 0xFB, 0x9E, 0xE7, 0x5D, 0x30, 0x5D, 0x9C, 0x66, 0x06, + 0x26, 0xD3, 0x0A, 0x4E, 0x4C, 0x45, 0xA8, 0xE6, 0x23, 0x0A, 0xE1, 0x3A, + 0x31, 0x39, 0xC0, 0x01, 0x9D, 0x19, 0xD3, 0x2A, 0x28, 0xD7, 0x43, 0x40, + 0x38, 0xC5, 0xA9, 0xCC, 0x80, 0x71, 0xAF, 0xDC, 0xEF, 0x4E, 0x85, 0xC0, + 0xBE, 0x56, 0xC1, 0x54, 0xA6, 0xDE, 0x30, 0xE4, 0xF9, 0xD0, 0x1B, 0x40, + 0x6A, 0x61, 0x2B, 0x5C, 0x2B, 0xF6, 0x16, 0x99, 0xD7, 0x62, 0xC2, 0x59, + 0x81, 0x87, 0xFB, 0x93, 0x45, 0xEE, 0x38, 0xB8, 0xE7, 0xDD, 0x37, 0xC0, + 0x76, 0xC9, 0x0D, 0x17, 0x06, 0x34, 0xD3, 0xB3, 0x6E, 0x88, 0x26, 0x99, + 0x48, 0x0E, 0x67, 0x46, 0xE3, 0xE4, 0x22, 0x97, 0xFA, 0xD3, 0xC3, 0x66, + 0xD1, 0x08, 0x17, 0x93, 0xDD, 0xC9, 0xC6, 0x41, 0xC7, 0x12, 0x4F, 0x83, + 0xB8, 0xCC, 0x60, 0xA0, 0x24, 0xB7, 0x17, 0x16, 0x31, 0xC6, 0x42, 0xEB, + 0xEC, 0x48, 0xE1, 0xEB, 0x75, 0x54, 0x75, 0xE8, 0x01, 0xF6, 0x42, 0x67, + 0xF1, 0x46, 0xF7, 0xB7, 0x2A, 0x22, 0x88, 0x20, 0xAC, 0xCF, 0xA3, 0x27, + 0x36, 0x38, 0xD0, 0x70, 0x99, 0xD5, 0x63, 0xA3, 0xF7, 0x05, 0x25, 0x52, + 0x82, 0x04, 0x02, 0xED, 0xBD, 0x13, 0x9F, 0xCE, 0x89, 0xD0, 0x6E, 0xE2, + 0x85, 0xBB, 0xEC, 0x7B, 0xFA, 0x6C, 0x88, 0x4B, 0x57, 0xD4, 0xC7, 0xCA, + 0x5A, 0x01, 0x6A, 0x6C, 0xD9, 0x75, 0x1E, 0x89, 0x26, 0xFA, 0x4A, 0x0E, + 0x1F, 0x2B, 0xA9, 0x97, 0xDB, 0x19, 0x4E, 0xD4, 0x55, 0x5C, 0x3D, 0xF2, + 0xDB, 0xD7, 0x5B, 0x60, 0x9E, 0x12, 0x4A, 0x62, 0x45, 0xE7, 0xBB, 0x0E, + 0xEF, 0x67, 0x99, 0x68, 0xAA, 0x0E, 0x2B, 0x49, 0x82, 0x8D, 0x7E, 0x4C, + 0xA4, 0x78, 0x08, 0xC3, 0xAE, 0x79, 0xF4, 0x39, 0xC1, 0xEC, 0x00, 0xB4, + 0x9D, 0x7C, 0x40, 0xFC, 0x6B, 0xBC, 0x16, 0xDB, 0xD8, 0xC4, 0x48, 0x5B, + 0x63, 0x16, 0xF6, 0xCE, 0xAA, 0x99, 0xC8, 0xF2, 0x87, 0x2A, 0x05, 0xAD, + 0x31, 0xB8, 0xA0, 0x1D, 0xA0, 0xA2, 0x03, 0x0C, 0x54, 0xD5, 0x7B, 0x0C, + 0xBF, 0x35, 0x70, 0x57, 0xCD, 0xE3, 0xB0, 0x57, 0xE8, 0xBE, 0x7A, 0x95, + 0xDF, 0xDF, 0xAB, 0x11, 0x55, 0x86, 0xA3, 0x27, 0x6E, 0x0B, 0x7B, 0xF0, + 0xAD, 0x2E, 0xEE, 0xF8, 0xD6, 0x10, 0xC8, 0x4D, 0x68, 0xCE, 0xA7, 0x86, + 0xFC, 0x45, 0xC1, 0x1E, 0x4E, 0x56, 0x61, 0x1E, 0xE8, 0x2C, 0xCA, 0x0D, + 0x51, 0xD2, 0x2C, 0xC3, 0x7E, 0xCF, 0xB3, 0x96, 0x1B, 0xEA, 0xD6, 0x0B, + 0x2D, 0x86, 0xDD, 0x8C, 0xAA, 0xAF, 0x1B, 0x4C, 0x4A, 0xA7, 0xA1, 0x53, + 0x5F, 0x8D, 0xB6, 0x0A, 0x3F, 0x5C, 0xA8, 0x23, 0x33, 0xCB, 0x92, 0xEA, + 0x1A, 0xEF, 0xBD, 0x2F, 0x89, 0xA1, 0x5C, 0x73, 0x3D, 0xDE, 0x51, 0x64, + 0xC5, 0x52, 0xA7, 0x92, 0xBC, 0x1D, 0xCA, 0xBA, 0xC8, 0xFC, 0x2C, 0x1A, + 0x69, 0x44, 0x71, 0xFE, 0xAB, 0x2A, 0x2E, 0xBB, 0x02, 0x92, 0xED, 0x90, + 0x01, 0xBC, 0x44, 0x7F, 0x6F, 0x76, 0x1E, 0x30, 0xDC, 0x4D, 0x3D, 0xBC, + 0x01, 0xD1, 0x1E, 0xE5, 0x71, 0x0E, 0xA6, 0x7D, 0xE1, 0xD5, 0xA6, 0x08, + 0xA6, 0x66, 0x9F, 0x0F, 0xAC, 0x11, 0x96, 0x66, 0x13, 0x03, 0x9F, 0x4C, + 0x0E, 0x8A, 0x2A, 0x4C, 0x39, 0xF0, 0xC6, 0x8E, 0x41, 0x9B, 0x23, 0xDD, + 0xDB, 0x7B, 0x94, 0x71, 0x6C, 0x78, 0x1B, 0xA6, 0xC1, 0xA8, 0x9B, 0xA5, + 0x86, 0x0E, 0x02, 0x97, 0x72, 0x2F, 0xE8, 0xE0, 0x01, 0x64, 0x39, 0x8C, + 0x6C, 0x4F, 0x64, 0x24, 0x34, 0x81, 0x33, 0x6D, 0xC6, 0x56, 0x60, 0x23, + 0x8C, 0xB1, 0xA3, 0x11, 0x94, 0x37, 0xEF, 0xE4, 0x3E, 0x4D, 0xAF, 0x61, + 0x2C, 0xF8, 0x86, 0x03, 0xFB, 0x25, 0xA3, 0x0F, 0xFA, 0x04, 0x3F, 0x72, + 0x10, 0xF1, 0xE6, 0x71, 0x13, 0x8A, 0xD7, 0xD3, 0x04, 0x92, 0x46, 0x4A, + 0x31, 0xAB, 0x5A, 0x1D, 0x16, 0x68, 0x77, 0x26, 0x9C, 0x28, 0x86, 0x27, + 0xD9, 0x60, 0xCA, 0x74, 0x41, 0x90, 0xB6, 0x0C, 0x91, 0xB1, 0x1E, 0x82, + 0xD9, 0x81, 0x63, 0x00, 0x2A, 0xA0, 0x07, 0x74, 0x62, 0x3B, 0xBD, 0x5B, + 0x9C, 0xA0, 0x6E, 0xE0, 0x55, 0x9B, 0x0A, 0x60, 0x84, 0x92, 0x7E, 0xB1, + 0xF1, 0xFC, 0x36, 0x97, 0xF8, 0x92, 0xAF, 0x3B, 0xD1, 0x2A, 0xBF, 0x4E, + 0xFD, 0x68, 0xC2, 0xF5, 0x89, 0xED, 0xE8, 0x4A, 0x44, 0xA0, 0x66, 0x50, + 0xDF, 0x4F, 0x6B, 0x9D, 0x1C, 0x98, 0xA4, 0xF4, 0x22, 0x9F, 0x51, 0x17, + 0x46, 0x4F, 0xFC, 0x07, 0xAD, 0xE6, 0x24, 0xF9, 0x5F, 0x9F, 0x56, 0x49, + 0x6A, 0x15, 0x39, 0xCA, 0x68, 0x98, 0xAF, 0xF1, 0x3F, 0xFB, 0x60, 0x36, + 0xDC, 0xB7, 0xD4, 0x27, 0x1F, 0x98, 0xDD, 0x6B, 0x21, 0x72, 0x1C, 0x4F, + 0x4C, 0x93, 0xC4, 0x01, 0xA4, 0x9C, 0xB7, 0x02, 0xC3, 0xFE, 0xCA, 0xC0, + 0x8D, 0xD5, 0xBA, 0x09, 0xB9, 0xAF, 0x1C, 0xB0, 0x08, 0x09, 0x36, 0x70, + 0x91, 0x08, 0xF5, 0x1B, 0x14, 0xE9, 0x81, 0xB1, 0xD1, 0xA0, 0x94, 0x4C, + 0x73, 0x46, 0xBB, 0x7C, 0xFA, 0xB9, 0xE7, 0x31, 0x94, 0xFD, 0xCE, 0x97, + 0xDB, 0x52, 0x32, 0x11, 0x72, 0xD7, 0x1C, 0xDE, 0x97, 0xBE, 0x19, 0xD9, + 0xCB, 0xCC, 0xEF, 0x0F, 0x2C, 0x90, 0xEA, 0xED, 0x1F, 0x07, 0x10, 0xD4, + 0x4E, 0xDF, 0x3F, 0x92, 0x29, 0x57, 0x22, 0x7A, 0x18, 0xB0, 0xE1, 0xDE, + 0x76, 0x61, 0xF3, 0xBA, 0x84, 0xD4, 0x7D, 0x9C, 0x92, 0x7B, 0x0B, 0xC2, + 0x7F, 0x6A, 0xF5, 0x5E, 0x77, 0xD6, 0xBB, 0xF5, 0x23, 0x1D, 0xCE, 0x52, + 0xFA, 0x21, 0x33, 0xD1, 0x33, 0x38, 0x65, 0x34, 0xCE, 0x8C, 0x25, 0x9D, + 0xF4, 0x95, 0xF1, 0x71, 0x17, 0xE6, 0x08, 0x96, 0xEA, 0x54, 0xA1, 0xA1, + 0xEB, 0xFD, 0x90, 0xAE, 0x63, 0x42, 0xC0, 0x8B, 0x57, 0xD4, 0x64, 0xDF, + 0xB9, 0xF1, 0xB2, 0x8A, 0xAD, 0x42, 0x64, 0x99, 0xF4, 0x3E, 0x72, 0xDB, + 0xE1, 0x18, 0xF2, 0x28, 0x0A, 0xDD, 0xB9, 0x8D, 0x66, 0xC2, 0xB1, 0x02, + 0xDC, 0xAB, 0x31, 0x2E, 0x42, 0xC8, 0x7A, 0xC0, 0xD2, 0x82, 0x7B, 0x2E, + 0xBA, 0x25, 0x07, 0x51, 0xB6, 0xC2, 0xDC, 0x75, 0x84, 0x5B, 0xB5, 0x43, + 0x36, 0x37, 0x26, 0x8B, 0x89, 0x77, 0x50, 0xC3, 0x49, 0xC0, 0xA1, 0x41, + 0xDC, 0xAA, 0x84, 0x32, 0x4E, 0x77, 0xE5, 0xC3, 0xF2, 0x2E, 0xD8, 0xA0, + 0x29, 0x64, 0xAA, 0x4A, 0x43, 0x90, 0xBA, 0xB1, 0x84, 0xFB, 0x9D, 0x40, + 0x82, 0x97, 0x01, 0xFE, 0x22, 0x40, 0x54, 0x06, 0x68, 0x9A, 0x9E, 0xB6, + 0x29, 0x21, 0xFB, 0x9F, 0xD4, 0x3A, 0x23, 0xDC, 0xAC, 0xB6, 0x7F, 0x19, + 0xC8, 0x01, 0x12, 0x40, 0xDB, 0xFB, 0xA1, 0x93, 0xAD, 0xD2, 0x03, 0xFA, + 0xB3, 0xA1, 0x47, 0x49, 0x8E, 0x8E, 0xA2, 0xF8, 0xDA, 0xB8, 0xDA, 0xF8, + 0x55, 0x2E, 0x8D, 0x91, 0x8E, 0x8C, 0x03, 0x1C, 0x6D, 0x9F, 0x09, 0x41, + 0x4B, 0x0A, 0x20, 0xDF, 0x6C, 0x1E, 0x07, 0x33, 0x39, 0xDC, 0xFE, 0x4F, + 0xD1, 0xC9, 0xFE, 0xC1, 0x44, 0x38, 0x95, 0x88, 0xE6, 0xAA, 0x20, 0x43, + 0x3A, 0x23, 0xBB, 0x05, 0x47, 0x34, 0x26, 0x19, 0xD0, 0x9F, 0x7B, 0x3F, + 0x6D, 0x10, 0x36, 0xBD, 0xC1, 0x96, 0x4B, 0xB2, 0x2B, 0x25, 0x36, 0xD3, + 0x79, 0x74, 0x1D, 0xDD, 0x88, 0x8D, 0x05, 0x4A, 0xF1, 0xA6, 0xC6, 0x62, + 0xE7, 0x28, 0x06, 0xD7, 0x34, 0x73, 0x2F, 0xB8, 0xDE, 0x3C, 0xB3, 0xAA, + 0x69, 0xBD, 0xDA, 0x1A, 0x30, 0xE8, 0x59, 0x44, 0x81, 0xCB, 0xCF, 0xAA, + 0xE0, 0xD0, 0x1B, 0x7C, 0xC6, 0x0E, 0xD7, 0x24, 0x12, 0xA9, 0x86, 0xB7, + 0xC3, 0x73, 0xA4, 0x87, 0x35, 0xC5, 0x6D, 0x44, 0x41, 0x30, 0xC0, 0x53, + 0xF3, 0x15, 0x12, 0x12, 0xEA, 0xA0, 0x50, 0x95, 0xA4, 0x8A, 0xC3, 0x4B, + 0xB1, 0xC1, 0xA8, 0xB6, 0x20, 0x63, 0x00, 0x8B, 0x77, 0x29, 0x30, 0x51, + 0x60, 0x87, 0x7C, 0x0E, 0x80, 0x3C, 0x7A, 0xB3, 0x56, 0x82, 0x99, 0xEC, + 0xA2, 0x9D, 0x87, 0xE0, 0x8A, 0x7B, 0xF9, 0x88, 0x74, 0xEF, 0xE6, 0x95, + 0xC4, 0x58, 0xFD, 0x85, 0xAF, 0xBD, 0x16, 0xFD, 0xAD, 0x5D, 0x5F, 0xFB, + 0xE7, 0xCC, 0xD0, 0x50, 0x59, 0x80, 0x2B, 0x12, 0x2F, 0xB2, 0x2E, 0xC0, + 0xEB, 0x6C, 0xF9, 0xE9, 0x95, 0xA7, 0x7E, 0xD5, 0xBD, 0x07, 0x68, 0xFB, + 0x09, 0xF3, 0xF9, 0x6F, 0xF2, 0xE1, 0x40, 0x78, 0x9D, 0xD1, 0xA4, 0x85, + 0xFF, 0x8F, 0x2E, 0x85, 0x87, 0xF2, 0xAA, 0x77, 0xD8, 0xFC, 0xF9, 0x96, + 0x74, 0xB0, 0xB4, 0x1E, 0x3C, 0x2C, 0x17, 0x63, 0x3B, 0x03, 0xF0, 0xF0, + 0xC9, 0x29, 0x57, 0x11, 0x81, 0xF8, 0x1B, 0x68, 0x03, 0x40, 0x53, 0x0C, + 0x75, 0x4C, 0x93, 0x6D, 0xC4, 0x5D, 0x40, 0xD0, 0x91, 0xAC, 0xA1, 0x6E, + 0x5F, 0xDD, 0x0F, 0x51, 0xB8, 0x77, 0x2D, 0x0E, 0x71, 0x45, 0x53, 0x2A, + 0x10, 0x83, 0x4A, 0xFA, 0x1B, 0xE7, 0x51, 0x8E, 0xE0, 0xDF, 0x54, 0xBF, + 0xBF, 0xA8, 0x6E, 0xC2, 0xA9, 0x15, 0x1D, 0x15, 0x15, 0x21, 0x9A, 0x9F, + 0x72, 0x00, 0x0C, 0xB3, 0xD6, 0xF6, 0xF6, 0x25, 0x73, 0xE6, 0x27, 0xFD, + 0x24, 0xF4, 0x06, 0x63, 0x21, 0x40, 0x0F, 0x38, 0x24, 0xDC, 0x78, 0x7A, + 0x5A, 0x60, 0x50, 0xA6, 0xAD, 0x1D, 0x02, 0x27, 0x60, 0xC5, 0x2B, 0x11, + 0x6B, 0xD3, 0x44, 0x52, 0x25, 0xAC, 0x90, 0x8C, 0x8E, 0xBD, 0x77, 0xC7, + 0xB7, 0x14, 0x8D, 0xDB, 0xF4, 0xBD, 0xD0, 0xED, 0x4F, 0x76, 0xFE, 0x0C, + 0x5E, 0x81, 0x63, 0x49, 0xDD, 0x27, 0x79, 0xD3, 0xEF, 0x12, 0x64, 0xD5, + 0x84, 0x99, 0xA4, 0x16, 0x25, 0xC6, 0xE2, 0xAC, 0xD5, 0xC4, 0x8C, 0xBA, + 0x42, 0x12, 0x21, 0x96, 0x53, 0xFF, 0xC2, 0xCB, 0x12, 0x98, 0xEB, 0xEC, + 0x0E, 0x72, 0xE3, 0x4A, 0x15, 0x5F, 0x61, 0xAF, 0xA4, 0x60, 0x43, 0x3F, + 0x79, 0x17, 0xC6, 0xCF, 0x9B, 0x48, 0x4C, 0x49, 0x74, 0xC6, 0x64, 0x92, + 0x6C, 0x41, 0xD4, 0xBB, 0xB9, 0x9D, 0x17, 0xA1, 0x68, 0xF1, 0x6E, 0xD5, + 0x5E, 0xD6, 0xD9, 0xF6, 0xDA, 0xD8, 0x36, 0xC1, 0x3E, 0xC2, 0xF2, 0x85, + 0xBC, 0x9B, 0x05, 0xE0, 0xD5, 0x15, 0xCF, 0x00, 0xBC, 0xD1, 0x1F, 0xCE, + 0x50, 0x47, 0x37, 0xFE, 0x57, 0x7A, 0xCB, 0x1C, 0x2E, 0x36, 0x79, 0xC4, + 0xDC, 0x1C, 0x11, 0x84, 0xDF, 0xD0, 0xF2, 0x7A, 0x02, 0xDD, 0x37, 0x5E, + 0xD0, 0x4A, 0x11, 0x0D, 0x59, 0x8F, 0xDD, 0xEB, 0xF6, 0x1D, 0xE6, 0x0D, + 0x58, 0x18, 0x7D, 0xD4, 0x4D, 0x3D, 0x1B, 0xD5, 0x13, 0xB1, 0xD4, 0xBB, + 0x50, 0x56, 0x29, 0xB1, 0x78, 0xCA, 0xC9, 0xC3, 0xA4, 0x10, 0x67, 0xFA, + 0x48, 0x13, 0x12, 0xAB, 0xB5, 0xDA, 0x45, 0x72, 0x6A, 0x41, 0x11, 0x6B, + 0xA9, 0xBF, 0x93, 0xFA, 0x47, 0x6D, 0x46, 0xE4, 0xAE, 0x58, 0xED, 0x5D, + 0xF3, 0x38, 0x57, 0xED, 0x49, 0xB7, 0x6A, 0x15, 0xC9, 0xBA, 0x05, 0xF2, + 0xA5, 0x9D, 0xC0, 0x0A, 0x31, 0x02, 0xC4, 0x70, 0x33, 0x4E, 0x5D, 0x29, + 0x02, 0x5B, 0x99, 0xEF, 0x2A, 0x1B, 0xD6, 0x90, 0xA9, 0xF1, 0x9A, 0x52, + 0x09, 0xD4, 0xFD, 0xF7, 0x5F, 0x50, 0xA1, 0x78, 0xD5, 0xA0, 0x69, 0xBE, + 0xD7, 0x61, 0x5E, 0x97, 0x16, 0x33, 0xBD, 0x25, 0x2B, 0x9F, 0x25, 0x49, + 0x6C, 0x9B, 0x5B, 0xB7, 0x8A, 0x9F, 0x54, 0x46, 0x2C, 0x3F, 0xC9, 0xFA, + 0xB8, 0xD0, 0xA3, 0x35, 0xBB, 0xF1, 0x7D, 0x4A, 0x74, 0xEC, 0x6F, 0xD3, + 0x14, 0xB3, 0x5E, 0x92, 0xFB, 0xF2, 0xE8, 0x41, 0x0A, 0xD2, 0x33, 0xF0, + 0x73, 0x5B, 0x36, 0x9A, 0x70, 0x97, 0x6E, 0x60, 0x54, 0xFD, 0x27, 0x79, + 0xC0, 0x4B, 0x1C, 0x86, 0x22, 0xAA, 0xA0, 0x14, 0x9D, 0xF6, 0x79, 0x3A, + 0xC3, 0x5C, 0xC4, 0xAC, 0xB2, 0xBC, 0x4D, 0xCC, 0xDC, 0xE0, 0x48, 0xB7, + 0x8E, 0xBD, 0x49, 0x08, 0x15, 0xB2, 0xA7, 0x05, 0xF9, 0x15, 0x18, 0x79, + 0xF1, 0x5F, 0xEA, 0xB8, 0x53, 0x5B, 0xA2, 0xD8, 0x7E, 0xA7, 0x0A, 0x28, + 0x1B, 0x0E, 0x21, 0x10, 0x02, 0xB9, 0xAA, 0x62, 0x1E, 0x17, 0x12, 0x31, + 0x8A, 0x60, 0x70, 0x90, 0x66, 0xFF, 0x83, 0x3F, 0x39, 0x97, 0x75, 0xE3, + 0x8D, 0x51, 0xA8, 0x0A, 0xA4, 0x9C, 0x1F, 0x73, 0x91, 0x8F, 0x8A, 0x9D, + 0x17, 0x7C, 0x43, 0x33, 0x1C, 0xE8, 0x29, 0x73, 0xA2, 0x3D, 0x2C, 0x43, + 0x07, 0x9B, 0x6D, 0xB2, 0x7F, 0x4E, 0x16, 0x6D, 0x94, 0x5D, 0x3F, 0xC4, + 0x0E, 0xEF, 0xEB, 0x0F, 0x71, 0x04, 0x2F, 0x99, 0xCD, 0x50, 0x81, 0x23, + 0x2A, 0x9C, 0xB0, 0x74, 0x63, 0x94, 0x8E, 0x41, 0x29, 0x93, 0x2B, 0x20, + 0x8B, 0xC8, 0x75, 0x34, 0xEB, 0x11, 0x4C, 0x4F, 0xDA, 0x1A, 0x8B, 0xE5, + 0x87, 0xA6, 0xB0, 0x57, 0xE2, 0x3F, 0x58, 0x68, 0xA3, 0xC0, 0x2E, 0x48, + 0x92, 0x4B, 0x9A, 0xE1, 0xFD, 0xF3, 0x22, 0x66, 0x8B, 0xF6, 0xCA, 0x10, + 0xBA, 0x83, 0x0C, 0x50, 0x68, 0x73, 0xD0, 0x21, 0x06, 0x2E, 0xAD, 0x68, + 0x2F, 0x11, 0x1E, 0x31, 0x38, 0x8D, 0xCF, 0x3E, 0xD7, 0x68, 0x08, 0xE3, + 0xD2, 0x47, 0x7B, 0x71, 0x68, 0xF6, 0x4F, 0x11, 0x36, 0x97, 0xD9, 0x2A, + 0xCF, 0x87, 0x0A, 0xCB, 0x5E, 0xE7, 0x1C, 0x1B, 0x02, 0x7F, 0x58, 0x4F, + 0x16, 0x3E, 0x5E, 0x28, 0x9E, 0xB4, 0x3B, 0x20, 0x5C, 0x9B, 0x6D, 0x25, + 0x4B, 0x72, 0xE1, 0xA5, 0x38, 0xC1, 0x7F, 0x69, 0x0A, 0x60, 0x42, 0xAB, + 0x24, 0x86, 0x09, 0xAA, 0x5D, 0x9E, 0x65, 0xF8, 0xC7, 0x6A, 0xCD, 0x31, + 0x14, 0xBC, 0xC0, 0x45, 0x80, 0x68, 0x09, 0xA2, 0x77, 0xD6, 0x4B, 0x95, + 0xD4, 0xF4, 0x58, 0xF0, 0xAB, 0x2F, 0x79, 0x77, 0x59, 0x74, 0x38, 0xD5, + 0x69, 0xB8, 0x77, 0x32, 0x92, 0x2A, 0x49, 0x96, 0xBE, 0x40, 0x31, 0x4F, + 0xC5, 0xCD, 0x9B, 0xA1, 0xD6, 0xB9, 0xCE, 0xF6, 0x4B, 0x01, 0x87, 0xE1, + 0x0E, 0x55, 0x40, 0x13, 0xE5, 0x42, 0x01, 0xC8, 0x78, 0x90, 0x6F, 0xA9, + 0x5B, 0x65, 0x79, 0xA0, 0x84, 0x85, 0x3B, 0x42, 0x73, 0x2D, 0x7C, 0xBA, + 0x2B, 0x7F, 0x19, 0xEB, 0x8D, 0x9D, 0x82, 0xA6, 0xE5, 0x10, 0x0A, 0x5A, + 0xAB, 0xA1, 0x1B, 0xD8, 0x87, 0xAB, 0xC5, 0x70, 0x78, 0xC1, 0xBC, 0xF6, + 0x5C, 0xFC, 0x60, 0x69, 0x5A, 0xD7, 0xE1, 0x20, 0x50, 0xCB, 0xDD, 0x55, + 0x1E, 0x80, 0x1F, 0x0A, 0x97, 0x65, 0x86, 0x02, 0xD4, 0x6C, 0x2E, 0x08, + 0xB8, 0xB0, 0x26, 0x78, 0xB9, 0xB3, 0x6D, 0x57, 0x9E, 0x21, 0x37, 0x01, + 0xDB, 0xEF, 0x49, 0x4D, 0x66, 0xE0, 0x7C, 0xCB, 0xCC, 0xD9, 0xAC, 0xEE, + 0xF2, 0xCE, 0xA5, 0x8E, 0x15, 0x4F, 0x1C, 0x83, 0x3C, 0xC8, 0xD0, 0x88, + 0x7E, 0x66, 0xCE, 0xA9, 0xBA, 0x32, 0x97, 0x15, 0x5F, 0x8B, 0xBC, 0x9E, + 0x1C, 0x14, 0x55, 0x9A, 0xBC, 0x4E, 0x4A, 0x6B, 0xB0, 0xE0, 0xF0, 0xDB, + 0x3A, 0x64, 0x14, 0x75, 0xAC, 0x14, 0x36, 0xE8, 0x6A, 0xB0, 0x3D, 0x7E, + 0xD9, 0xB4, 0x2B, 0x1F, 0xE9, 0x50, 0xB1, 0x7C, 0x18, 0x05, 0xA6, 0xE2, + 0x44, 0xF3, 0xCE, 0xE6, 0x4C, 0x21, 0x9E, 0x69, 0xAA, 0x22, 0x7E, 0xE2, + 0x35, 0x76, 0x3A, 0xAE, 0x6E, 0x4E, 0x72, 0x25, 0xB5, 0x4D, 0xA4, 0xF7, + 0x47, 0x82, 0x9C, 0xD5, 0xA0, 0x08, 0x53, 0x17, 0x74, 0xB5, 0xB4, 0xA2, + 0x6F, 0x10, 0x40, 0x62, 0x47, 0xB9, 0xCE, 0x00, 0xC8, 0x68, 0x94, 0x9F, + 0xD6, 0x7C, 0x0D, 0xD5, 0xB7, 0x8A, 0x13, 0xDE, 0x8C, 0x5B, 0x0B, 0x33, + 0xB7, 0x15, 0xD5, 0x43, 0xAE, 0xC0, 0x87, 0x0A, 0x13, 0xF3, 0xB5, 0x1C, + 0x00, 0xC7, 0xA4, 0x36, 0x05, 0xE4, 0xFF, 0xE2, 0x18, 0x6E, 0xF5, 0xF9, + 0x0D, 0xDE, 0xDA, 0x4D, 0xC6, 0x1B, 0x0D, 0x89, 0xD7, 0xD5, 0x5E, 0x84, + 0xDA, 0xC2, 0xAF, 0x42, 0x2D, 0x89, 0xD3, 0x69, 0x38, 0x25, 0xDB, 0xE0, + 0xC3, 0x17, 0xCF, 0x3A, 0xB1, 0x8F, 0x60, 0x74, 0xC4, 0x3C, 0x20, 0x1B, + 0xE3, 0x0C, 0x91, 0x93, 0xDC, 0xCB, 0x39, 0x45, 0x0E, 0xB3, 0x78, 0x52, + 0xBF, 0x6A, 0x79, 0x10, 0x93, 0x67, 0x25, 0x87, 0xD7, 0xA6, 0x55, 0xEB, + 0xC0, 0xE2, 0x04, 0x43, 0xF9, 0x25, 0x3B, 0x10, 0x95, 0xEF, 0xD5, 0x34, + 0xB0, 0xA6, 0x67, 0x24, 0x26, 0x94, 0x71, 0x4C, 0xA5, 0x7F, 0x4E, 0xAC, + 0xA7, 0x58, 0x89, 0xA1, 0x47, 0x47, 0x76, 0x17, 0xC0, 0x79, 0x21, 0xFE, + 0x53, 0xB8, 0x55, 0xC3, 0x73, 0xF7, 0x07, 0x4C, 0x76, 0xEE, 0x45, 0x92, + 0x72, 0x75, 0x07, 0xAE, 0x18, 0x44, 0xC0, 0x96, 0x20, 0x9F, 0xE6, 0x54, + 0x04, 0xEE, 0x16, 0xBA, 0x4B, 0x29, 0xA9, 0x27, 0x35, 0xBE, 0x58, 0xA6, + 0x32, 0x00, 0xEE, 0x7C, 0x8D, 0x3F, 0x4D, 0xB2, 0x1D, 0xB2, 0x0C, 0x6D, + 0xC9, 0xFE, 0x26, 0x92, 0xCF, 0x50, 0xD8, 0x0F, 0x27, 0x00, 0xDA, 0x4A, + 0xB6, 0xD5, 0xD7, 0x03, 0x8E, 0x09, 0xCA, 0x9D, 0xA8, 0xC0, 0x95, 0x6D, + 0x7E, 0xC8, 0x36, 0x43, 0x9C, 0x41, 0x30, 0x92, 0xC6, 0x97, 0x0D, 0x6C, + 0x87, 0x9F, 0xBC, 0x41, 0x72, 0x83, 0x6F, 0x7E, 0xCA, 0x29, 0x9B, 0x9B, + 0x43, 0x7F, 0x1A, 0x1B, 0xE3, 0xEF, 0x48, 0x3B, 0x22, 0x3F, 0x18, 0xDA, + 0x3B, 0xE6, 0xE0, 0x10, 0xCA, 0xD4, 0x0E, 0xAF, 0x56, 0xD4, 0x17, 0x20, + 0xD8, 0x80, 0xB7, 0xCF, 0xB1, 0xE5, 0x3B, 0xE8, 0x9A, 0x5F, 0xD0, 0x16, + 0x44, 0xEE, 0x3A, 0x8B, 0xB3, 0x23, 0x75, 0x1F, 0xBD, 0xDF, 0xE1, 0xF0, + 0xFD, 0xB9, 0xEB, 0x21, 0x49, 0x16, 0x00, 0xEE, 0xFD, 0x87, 0x45, 0x97, + 0x45, 0x68, 0xDA, 0x57, 0x01, 0x60, 0x33, 0x1A, 0x01, 0x43, 0xB2, 0x1C, + 0xB7, 0xA6, 0xCD, 0x67, 0xFD, 0x38, 0x00, 0x44, 0x04, 0xFD, 0xA4, 0x35, + 0x63, 0x58, 0x79, 0x47, 0x6A, 0x1B, 0x6F, 0x65, 0x7A, 0x49, 0x2E, 0xA4, + 0xCE, 0xEE, 0x44, 0x78, 0xA7, 0xCB, 0x0C, 0xF1, 0x9E, 0x8B, 0x3E, 0xC8, + 0x4E, 0xDA, 0x4F, 0x90, 0xF6, 0xA6, 0x38, 0x1C, 0x14, 0x64, 0x21, 0x16, + 0x7C, 0x09, 0xAA, 0x52, 0x03, 0xC7, 0xBE, 0x62, 0x9E, 0xBD, 0xC6, 0x3F, + 0x6A, 0x0A, 0x79, 0x24, 0xFD, 0x00, 0xDF, 0xCB, 0x9E, 0xC9, 0x8D, 0x56, + 0xC6, 0x58, 0x81, 0x78, 0xCD, 0xA6, 0x36, 0x63, 0xE4, 0x78, 0x2F, 0xC8, + 0xAF, 0x6E, 0xD5, 0xB4, 0xDD, 0x31, 0xE4, 0x84, 0x33, 0x4E, 0x6F, 0x4D, + 0xE1, 0xD2, 0x87, 0x2A, 0xE3, 0xBA, 0x11, 0xBC, 0x0A, 0x4E, 0x28, 0xC9, + 0x8B, 0x50, 0x6E, 0xCF, 0x55, 0x06, 0x63, 0x89, 0x6B, 0x45, 0x83, 0x36, + 0x08, 0xA2, 0x67, 0x61, 0xBB, 0x72, 0x2F, 0xD1, 0xA4, 0x45, 0xD7, 0x1C, + 0x1A, 0x76, 0x47, 0x43, 0xED, 0x72, 0xA7, 0x68, 0x2F, 0xEA, 0xCB, 0x04, + 0xD0, 0x70, 0x00, 0xE9, 0xB5, 0xCA, 0xF0, 0x47, 0x5E, 0x5C, 0x28, 0x5E, + 0x03, 0x88, 0xB4, 0xD6, 0x52, 0x6A, 0xFE, 0xFF, 0x88, 0x9C, 0x2B, 0x32, + 0xD1, 0x3D, 0x9E, 0x4F, 0xD3, 0xD4, 0xA7, 0xE1, 0xB6, 0xB9, 0x89, 0xE7, + 0xE2, 0xF7, 0xBC, 0x57, 0xD7, 0xC4, 0x20, 0xFB, 0x91, 0xC0, 0x87, 0x5E, + 0xC4, 0x4F, 0xB7, 0x0B, 0xD4, 0x34, 0x30, 0xAC, 0x02, 0x1F, 0xC7, 0x7A, + 0xBE, 0x64, 0x25, 0x34, 0x92, 0x12, 0x22, 0x66, 0xB5, 0x81, 0x7F, 0x6E, + 0x89, 0xA6, 0x49, 0x07, 0xFA, 0xA6, 0x14, 0x80, 0x7A, 0x5D, 0x4D, 0x06, + 0x9D, 0x57, 0x17, 0x82, 0x1B, 0x70, 0xBE, 0xFA, 0x50, 0x1A, 0x5E, 0x7B, + 0x48, 0x11, 0xF8, 0x2F, 0xFD, 0xC0, 0xE4, 0x75, 0x57, 0xCD, 0x81, 0x57, + 0xDA, 0x84, 0x1A, 0x92, 0x18, 0x40, 0x8A, 0xC3, 0x66, 0xCC, 0xE0, 0x93, + 0x8A, 0x19, 0x30, 0x2F, 0xD5, 0x9A, 0xAD, 0x24, 0x8A, 0x39, 0x03, 0x45, + 0xCF, 0x8E, 0xF9, 0x8C, 0x8D, 0xE1, 0x29, 0x2D, 0xDD, 0xB6, 0xA0, 0x33, + 0xCD, 0x75, 0x99, 0x27, 0xBA, 0x20, 0x10, 0x6C, 0xEE, 0xC5, 0xFE, 0xDB, + 0x86, 0x53, 0xD6, 0xCE, 0x48, 0x24, 0xEF, 0xB3, 0x27, 0x99, 0xFC, 0x51, + 0x25, 0x52, 0x76, 0x6F, 0xCD, 0x75, 0x68, 0x7E, 0xD2, 0xC8, 0xB7, 0x82, + 0x55, 0x5D, 0x2F, 0x30, 0xD0, 0xBF, 0x0C, 0xC6, 0xD6, 0xAB, 0xC8, 0x3A, + 0x48, 0x76, 0x26, 0x24, 0x08, 0xBF, 0x44, 0xA2, 0x27, 0xC8, 0x3F, 0xE7, + 0xD8, 0xBB, 0xD5, 0xED, 0x5D, 0xE4, 0xFE, 0x94, 0x9F, 0xE0, 0x13, 0xFC, + 0x1B, 0xB8, 0x0D, 0xED, 0x68, 0x33, 0xE5, 0x38, 0xFC, 0x7C, 0x05, 0xB1, + 0x74, 0xEA, 0x8E, 0xA2, 0x2F, 0x53, 0x5B, 0x9D, 0xD3, 0x53, 0x55, 0x18, + 0x01, 0x4C, 0xFE, 0x84, 0x00, 0xF7, 0x66, 0x11, 0x4E, 0xEF, 0x45, 0xF1, + 0xAE, 0xCF, 0x6B, 0x5C, 0x40, 0x76, 0x8B, 0xE3, 0xE0, 0x3F, 0x10, 0x14, + 0x07, 0x22, 0x9C, 0xBD, 0xE0, 0xFF, 0x56, 0x2F, 0x62, 0xEA, 0x50, 0x50, + 0xF6, 0x73, 0xA9, 0x2D, 0x3D, 0xED, 0x2B, 0x1A, 0x10, 0xB8, 0xAC, 0x07, + 0x69, 0xB0, 0x7D, 0x42, 0x9A, 0x58, 0x18, 0xA9, 0x87, 0x04, 0x63, 0xE0, + 0x64, 0x81, 0x9B, 0x17, 0xB1, 0x42, 0x36, 0x00, 0xA1, 0xA9, 0x1C, 0x9F, + 0x03, 0xC2, 0x6E, 0xB8, 0x40, 0xC4, 0xB1, 0x40, 0xDB, 0x45, 0xD3, 0x47, + 0xB6, 0x1A, 0x55, 0xB0, 0x91, 0x6B, 0xAE, 0xE4, 0x8C, 0x75, 0x9F, 0x6A, + 0x1F, 0xFA, 0xD2, 0x4B, 0x7B, 0x34, 0xE3, 0xAC, 0x77, 0x66, 0x1E, 0x88, + 0x2A, 0x89, 0x2E, 0x19, 0xF3, 0x21, 0xC5, 0xEA, 0x09, 0x99, 0xB2, 0x30, + 0x9F, 0xA5, 0x6B, 0x75, 0xF0, 0xE8, 0xCB, 0x9F, 0xB0, 0x3E, 0x17, 0x59, + 0x10, 0xDD, 0x0B, 0xA7, 0x97, 0xB4, 0x7E, 0x68, 0x26, 0x46, 0xE8, 0xA4, + 0x88, 0x4B, 0x0C, 0xE8, 0x5F, 0x4A, 0x2F, 0x67, 0xFE, 0x70, 0x33, 0xA4, + 0x55, 0x35, 0xC3, 0x85, 0x20, 0xBC, 0x12, 0x18, 0x85, 0x6B, 0x8D, 0x53, + 0x70, 0x1F, 0xF3, 0x8E, 0x1A, 0x56, 0x6F, 0x2E, 0xAD, 0xC9, 0x67, 0x00, + 0x28, 0x11, 0x72, 0x2D, 0xAF, 0x8D, 0x45, 0xC3, 0x86, 0xC7, 0xE9, 0xA8, + 0xC0, 0xBB, 0x26, 0x97, 0xD5, 0xE4, 0xB7, 0xCF, 0x57, 0x01, 0x00, 0x1E, + 0xBF, 0x11, 0xE2, 0xE4, 0x1E, 0x4D, 0xB6, 0x52, 0xC6, 0x69, 0xDE, 0xA0, + 0x3A, 0xD6, 0x97, 0x38, 0x63, 0x39, 0x60, 0x17, 0xAC, 0xD6, 0xED, 0xFB, + 0x10, 0xA9, 0xE0, 0x5E, 0x6D, 0x43, 0xC2, 0x24, 0xA8, 0xAC, 0xB8, 0xC5, + 0xE1, 0xF5, 0xBD, 0x4B, 0x89, 0x47, 0x50, 0x9F, 0x02, 0xB4, 0x40, 0xB1, + 0xFA, 0xCD, 0x48, 0x52, 0x68, 0xE5, 0x25, 0xE0, 0x74, 0xA2, 0x64, 0xC4, + 0x7B, 0xE5, 0xF1, 0x61, 0x21, 0xA6, 0x39, 0x42, 0x26, 0xC1, 0x87, 0x1F, + 0x6F, 0x3D, 0x68, 0x96, 0xC4, 0x74, 0xCD, 0x5E, 0xEE, 0x43, 0x6F, 0x99, + 0x91, 0x1D, 0x30, 0x97, 0xBA, 0x7E, 0xA5, 0xA6, 0x08, 0x3B, 0x8D, 0x40, + 0x61, 0xAF, 0x1B, 0xA2, 0x37, 0x63, 0x48, 0xD1, 0x70, 0xF6, 0xFC, 0x6A, + 0xDF, 0x09, 0x82, 0x4E, 0x00, 0xD6, 0xAA, 0x31, 0x76, 0x98, 0x24, 0x78, + 0xE3, 0x18, 0x91, 0xF6, 0x88, 0x3E, 0xA8, 0x54, 0xA1, 0x3F, 0xAD, 0xE1, + 0x67, 0xCE, 0x3E, 0x9E, 0x82, 0x62, 0x99, 0x18, 0xF8, 0x40, 0x60, 0x22, + 0x92, 0x55, 0xF6, 0xA1, 0x6D, 0x80, 0x69, 0xB9, 0x77, 0x40, 0xBA, 0xAC, + 0x3C, 0x31, 0x32, 0xAA, 0xE8, 0x09, 0x26, 0x64, 0x2B, 0xE7, 0x6D, 0x19, + 0x31, 0xF3, 0x88, 0xFF, 0x45, 0xF2, 0xA9, 0xD7, 0xBF, 0xDA, 0x50, 0x33, + 0xD7, 0x83, 0x55, 0x08, 0xCA, 0xFE, 0xF6, 0x3B, 0x2A, 0x5A, 0xC4, 0xBD, + 0x26, 0x35, 0xF5, 0x9D, 0xE8, 0xA8, 0xFE, 0x9C, 0x43, 0x0F, 0x2C, 0xFD, + 0x33, 0x81, 0x08, 0x11, 0x4D, 0xE6, 0x5B, 0xB1, 0x96, 0xE7, 0x3A, 0x83, + 0xCB, 0xEF, 0x18, 0xDE, 0xF8, 0x5B, 0x09, 0x4D, 0x61, 0x3D, 0xB5, 0xB7, + 0xE4, 0xC9, 0x73, 0xFE, 0x5C, 0xD3, 0x57, 0x4F, 0x46, 0x6F, 0x42, 0x56, + 0x85, 0xC1, 0x4A, 0x8A, 0xD8, 0x61, 0xA3, 0x15, 0x49, 0x66, 0xA6, 0x1C, + 0xC0, 0x1F, 0xB7, 0xA9, 0x88, 0x06, 0xA4, 0x2F, 0xE4, 0x9A, 0xCC, 0x38, + 0xE0, 0x90, 0x64, 0xB6, 0x0F, 0xE5, 0xAE, 0xB5, 0x87, 0x64, 0x1C, 0x42, + 0x5C, 0x11, 0x01, 0xB5, 0xC2, 0x90, 0x3D, 0xAB, 0x26, 0x4B, 0x2A, 0x67, + 0x9F, 0x5B, 0x5B, 0xE3, 0x21, 0xA0, 0xB9, 0x7D, 0x64, 0xD3, 0xF8, 0xB3, + 0x77, 0x91, 0x2D, 0x34, 0x78, 0x8E, 0xB8, 0x1D, 0x30, 0x4B, 0xE1, 0x31, + 0xFE, 0x3D, 0xE6, 0xAB, 0xDA, 0xA6, 0xB4, 0xDF, 0xB0, 0x67, 0x25, 0x57, + 0x4A, 0x30, 0x8F, 0x86, 0x58, 0x13, 0xE6, 0xEA, 0xEE, 0x91, 0x86, 0xD2, + 0x0D, 0xCD, 0x19, 0xDC, 0x26, 0x18, 0x86, 0x52, 0xD2, 0x77, 0x79, 0x31, + 0xDA, 0xF9, 0x9A, 0xCA, 0x7B, 0xBE, 0xF6, 0x96, 0x61, 0xAE, 0x32, 0xC8, + 0x68, 0x17, 0xFF, 0xB8, 0xF4, 0xF5, 0xE5, 0xA4, 0x20, 0xC9, 0x44, 0x8A, + 0xD6, 0x8D, 0xB0, 0x0D, 0x3D, 0x2B, 0x47, 0x4B, 0xA5, 0x49, 0x37, 0x11, + 0x18, 0x2C, 0x94, 0x37, 0xEB, 0x7D, 0xD6, 0x49, 0x59, 0xFD, 0x75, 0xC7, + 0x6C, 0x11, 0x83, 0xBD, 0x92, 0xF4, 0xA0, 0xFD, 0x5D, 0x2D, 0x24, 0x42, + 0x8D, 0x3E, 0x96, 0xDA, 0x4B, 0xCD, 0x85, 0xDA, 0xF4, 0x11, 0x27, 0x0F, + 0x5B, 0xE1, 0xB4, 0x62, 0x51, 0xC6, 0x04, 0x22, 0xCD, 0x8D, 0x3D, 0x26, + 0x59, 0xC9, 0xF3, 0xBF, 0xBD, 0x07, 0xEB, 0x3D, 0xDD, 0x41, 0x3A, 0xAE, + 0x35, 0xB6, 0x9C, 0x76, 0xE6, 0xE9, 0x5E, 0x98, 0xF6, 0x9F, 0x9B, 0x6D, + 0x9A, 0x0F, 0xF3, 0xA2, 0x5E, 0xD0, 0x37, 0x0F, 0xA7, 0xB9, 0xC1, 0xC2, + 0xFF, 0x26, 0x59, 0x51, 0xC6, 0x27, 0x15, 0x25, 0xFD, 0x8E, 0xA0, 0xAA, + 0x72, 0xD4, 0xA8, 0x13, 0x61, 0xE0, 0x4C, 0xD0, 0xD2, 0xCA, 0xA8, 0x85, + 0x98, 0x95, 0x26, 0x68, 0x7A, 0x1D, 0xBC, 0x6D, 0x87, 0xF8, 0x8C, 0xEC, + 0x31, 0xA7, 0x8E, 0x98, 0x1C, 0xEC, 0x51, 0xCA, 0xF7, 0x38, 0x5A, 0x03, + 0xF1, 0x7B, 0x84, 0x9D, 0x96, 0x75, 0x30, 0x96, 0x92, 0xDD, 0x4F, 0xCD, + 0xD8, 0x00, 0xA0, 0xAB, 0x7B, 0x52, 0x42, 0x2F, 0x0A, 0x9F, 0x28, 0x18, + 0x12, 0xD7, 0x47, 0xF5, 0x83, 0xB4, 0x27, 0xA6, 0x5D, 0x8C, 0xB1, 0xD7, + 0xC2, 0xB5, 0x3F, 0xCC, 0x31, 0xCA, 0x7C, 0xB5, 0xB5, 0x37, 0xAA, 0xCB, + 0xA5, 0x8A, 0x2D, 0x21, 0x72, 0x24, 0xCE, 0xD6, 0x05, 0xDA, 0x32, 0x2A, + 0xA9, 0x92, 0x57, 0x07, 0x24, 0x7C, 0x53, 0x92, 0xBA, 0x4A, 0x3D, 0xF8, + 0xA9, 0xCB, 0xEC, 0x7A, 0x34, 0x4A, 0xFD, 0x2E, 0x3D, 0x22, 0xA1, 0x8B, + 0xC4, 0x8B, 0x39, 0x8F, 0x11, 0x8E, 0x75, 0x85, 0xB3, 0x1C, 0xB3, 0x2E, + 0x5B, 0xF6, 0xF7, 0x03, 0x88, 0x11, 0x14, 0x7A, 0x42, 0xDA, 0x25, 0x0C, + 0xAD, 0x88, 0xE7, 0xC9, 0xE6, 0x90, 0x65, 0x13, 0x2B, 0x40, 0x20, 0xC3, + 0x03, 0xCC, 0x38, 0x71, 0x5C, 0x32, 0x54, 0xFE, 0x42, 0x2A, 0xC8, 0x4D, + 0xDB, 0x4F, 0x0F, 0x9D, 0x53, 0xEA, 0xBE, 0xA8, 0x84, 0x87, 0x63, 0x8F, + 0xC7, 0xC5, 0xC7, 0xD9, 0x41, 0xDF, 0x53, 0x72, 0x50, 0x61, 0x9A, 0x81, + 0x6B, 0x70, 0x6F, 0xE4, 0x98, 0xBB, 0x46, 0xEF, 0x24, 0xA6, 0xA0, 0xCB, + 0x49, 0x05, 0x13, 0xA6, 0xC2, 0x1F, 0x2D, 0x1A, 0x2B, 0xBD, 0xA9, 0x97, + 0xB4, 0xEC, 0x6C, 0x0C, 0x1C, 0xA1, 0x9E, 0xDB, 0x5E, 0x55, 0x95, 0xE0, + 0xE1, 0xC5, 0x4E, 0x97, 0x89, 0x69, 0xDA, 0xB6, 0x5C, 0xAA, 0xF2, 0x96, + 0x28, 0x7A, 0xCB, 0xA9, 0xCE, 0x46, 0x5E, 0x07, 0xFE, 0x73, 0x4F, 0x2C, + 0x46, 0xAF, 0xFB, 0x2F, 0xC5, 0xD1, 0xB6, 0xB2, 0x85, 0x65, 0x1C, 0x7F, + 0x72, 0xBC, 0xF9, 0x51, 0x1B, 0x02, 0xAE, 0x6A, 0x46, 0xB5, 0x39, 0x1A, + 0x8D, 0x34, 0x84, 0x40, 0xE5, 0x1B, 0x91, 0x11, 0xE9, 0x42, 0x44, 0x56, + 0x64, 0x01, 0xF5, 0xC0, 0x7D, 0x64, 0x37, 0x72, 0xA4, 0x7A, 0xE5, 0xD6, + 0x19, 0xA6, 0xDB, 0x78, 0x23, 0x47, 0x68, 0xE5, 0x8D, 0x7D, 0x8C, 0xE5, + 0x63, 0xF3, 0x3E, 0x07, 0xEE, 0x4E, 0x8D, 0xF1, 0x56, 0x37, 0xA4, 0x27, + 0xDC, 0x67, 0x45, 0x84, 0x41, 0x89, 0xD2, 0x77, 0x67, 0x3C, 0x76, 0x27, + 0x6B, 0x8B, 0xD2, 0x65, 0x6A, 0x65, 0x2B, 0xB1, 0xA6, 0x73, 0x3F, 0xD2, + 0xC6, 0x78, 0x5D, 0xF9, 0xDA, 0xBD, 0x8B, 0x9F, 0xC0, 0x5B, 0xF2, 0xF4, + 0xA6, 0x46, 0xF4, 0x5A, 0xCD, 0xDC, 0x40, 0x0E, 0x48, 0x28, 0xA2, 0x98, + 0x87, 0xE7, 0x4F, 0x46, 0xD4, 0x6E, 0xFB, 0x6F, 0x11, 0xC5, 0x85, 0xCF, + 0xDF, 0xA9, 0xBB, 0xE1, 0x61, 0x80, 0x41, 0xFC, 0x69, 0x8F, 0xD7, 0xDD, + 0xD9, 0x8B, 0x63, 0xE2, 0x60, 0x1A, 0x0A, 0xFF, 0x56, 0x85, 0x6C, 0x4C, + 0x0D, 0x19, 0x9E, 0xE1, 0xCB, 0xF3, 0xEB, 0x9C, 0xBF, 0x11, 0x4A, 0x0B, + 0x23, 0xFD, 0x88, 0x93, 0x1A, 0x8B, 0xA2, 0x68, 0xD2, 0x07, 0x90, 0x11, + 0xC6, 0x3D, 0xEF, 0x2C, 0x3C, 0x02, 0x41, 0x1F, 0x41, 0x93, 0x2B, 0x83, + 0xAB, 0x2D, 0x35, 0xA4, 0x6E, 0xD7, 0x36, 0x51, 0x09, 0x7C, 0x23, 0x4F, + 0xAD, 0xF8, 0x38, 0xF0, 0x1D, 0x98, 0x2E, 0xEA, 0x20, 0xAF, 0x10, 0x9B, + 0x03, 0x96, 0xE0, 0x68, 0xCB, 0x01, 0xC2, 0xAF, 0x4B, 0x70, 0xB0, 0x6F, + 0xB6, 0xBC, 0x71, 0xA8, 0x57, 0x32, 0x26, 0x98, 0x23, 0xAD, 0xC6, 0x07, + 0xE8, 0xDF, 0xB6, 0xC8, 0x83, 0xF6, 0x17, 0xFD, 0x4C, 0xDA, 0xB7, 0x1D, + 0xA4, 0x92, 0xCE, 0xAD, 0x4B, 0xB8, 0xD2, 0xBB, 0xC4, 0x2E, 0x9C, 0xE3, + 0x40, 0x31, 0xF1, 0xF8, 0x1A, 0xC7, 0x55, 0x99, 0x08, 0xAE, 0xFF, 0xD1, + 0x39, 0x74, 0x4F, 0x87, 0x6A, 0x26, 0xBC, 0x36, 0x5D, 0x2C, 0x25, 0x53, + 0x0B, 0x18, 0x15, 0x7F, 0xA3, 0x2A, 0x45, 0xC4, 0x9A, 0xE2, 0xEF, 0xDC, + 0xDC, 0xF1, 0x9D, 0xE9, 0x5E, 0xD9, 0xD5, 0x54, 0x89, 0x6D, 0x5A, 0xCE, + 0x8D, 0x22, 0x16, 0xF1, 0xD7, 0x36, 0xB9, 0x9A, 0xB0, 0xF4, 0xCD, 0xEF, + 0xE6, 0x0C, 0x3A, 0x5D, 0x09, 0x22, 0xF6, 0x45, 0xD7, 0x02, 0x55, 0x01, + 0x02, 0x7A, 0x4F, 0xBB, 0x22, 0x6A, 0x87, 0x66, 0x62, 0xD0, 0x1D, 0x54, + 0x72, 0xB2, 0xD8, 0x0A, 0x7E, 0x60, 0xC1, 0x1D, 0x68, 0xEA, 0xFB, 0x6A, + 0xE3, 0x5F, 0x97, 0xC5, 0xFD, 0xEB, 0x08, 0x2C, 0x50, 0x96, 0xB8, 0xC1, + 0x9D, 0x5E, 0x1E, 0x3E, 0x46, 0xA6, 0x49, 0x57, 0xC8, 0xBD, 0xB1, 0xD6, + 0xD5, 0x21, 0x2A, 0x03, 0x84, 0x65, 0x24, 0x11, 0xB0, 0xF0, 0x0F, 0xF4, + 0x04, 0x52, 0x43, 0xBA, 0xEA, 0x93, 0xBA, 0x9F, 0x34, 0x26, 0x1F, 0xD7, + 0x1F, 0x7B, 0xC0, 0x30, 0x01, 0x69, 0x68, 0x9B, 0x21, 0x13, 0xA5, 0xD4, + 0x87, 0x30, 0xDC, 0xEB, 0x35, 0x39, 0x76, 0x35, 0xB9, 0xE3, 0xDF, 0xCD, + 0xB5, 0xE5, 0x89, 0xEA, 0x54, 0x1F, 0x3E, 0xDB, 0x90, 0xCF, 0x5C, 0x4A, + 0x96, 0x97, 0x32, 0x3F, 0x6F, 0xB4, 0xE5, 0x28, 0xDF, 0xE4, 0xCA, 0xB1, + 0x1B, 0x78, 0x65, 0x2C, 0x99, 0x3D, 0x77, 0x32, 0x5F, 0x6C, 0x6D, 0xD3, + 0x53, 0x67, 0x15, 0x39, 0xFD, 0xE1, 0x2A, 0xB0, 0x48, 0x24, 0x4D, 0x36, + 0x4D, 0x90, 0x9F, 0xF3, 0x1D, 0x4F, 0x9D, 0x3B, 0xBE, 0x64, 0xFE, 0xF0, + 0xF2, 0xAE, 0x31, 0xB2, 0xBE, 0x35, 0x8E, 0x34, 0xD6, 0x56, 0xAB, 0xF2, + 0x45, 0xC4, 0x37, 0x65, 0xA0, 0x08, 0x66, 0x5D, 0x9F, 0x0D, 0x96, 0x0B, + 0x58, 0xC2, 0x18, 0x00, 0x43, 0xBA, 0xC4, 0xFE, 0xD3, 0x6C, 0x96, 0x78, + 0xAE, 0x10, 0x2D, 0x86, 0x4D, 0x8F, 0x87, 0x44, 0xCF, 0x8E, 0x1D, 0x23, + 0x00, 0x8D, 0x8A, 0x91, 0x28, 0xDE, 0x13, 0xF1, 0x2B, 0xBC, 0x75, 0x32, + 0xB3, 0x50, 0xDB, 0xD3, 0x5A, 0xA5, 0x2A, 0x28, 0x82, 0x70, 0x4B, 0xF9, + 0x77, 0x70, 0xC5, 0x5D, 0x4A, 0x52, 0x43, 0x4C, 0x1D, 0x6E, 0xB5, 0x6A, + 0x41, 0x65, 0xFF, 0xF2, 0x67, 0xC2, 0x86, 0x85, 0x0C, 0x95, 0x25, 0xAB, + 0x61, 0x3E, 0x79, 0x0A, 0x2F, 0x3F, 0xBB, 0x4A, 0xC7, 0x33, 0xEE, 0x2E, + 0x04, 0xD6, 0x44, 0xCE, 0x40, 0xB9, 0xFA, 0xF4, 0x8A, 0x7B, 0xA2, 0xE0, + 0x43, 0xFE, 0x80, 0x88, 0xA5, 0xB1, 0x47, 0x51, 0xFF, 0x48, 0xE4, 0x13, + 0xA1, 0x6D, 0x6D, 0x1E, 0x4F, 0x14, 0x5C, 0x32, 0x05, 0x73, 0x4E, 0x1B, + 0x9E, 0xB2, 0xEB, 0xF1, 0xC7, 0x42, 0x84, 0x3A, 0xAA, 0xE0, 0x6D, 0xEC, + 0x3E, 0x79, 0x60, 0x00, 0x36, 0x01, 0x2F, 0xBC, 0xB7, 0x82, 0x03, 0x6D, + 0x26, 0x6F, 0x28, 0x6E, 0x4C, 0xB7, 0xD7, 0x93, 0xCB, 0xF2, 0xFC, 0x58, + 0x2B, 0x3F, 0x5A, 0x2F, 0x88, 0x36, 0xCB, 0x7A, 0xEF, 0xF2, 0xC6, 0x63, + 0xC1, 0x60, 0x20, 0x71, 0x1F, 0xE4, 0xA6, 0x8A, 0x14, 0x16, 0x7D, 0x9F, + 0xD3, 0x83, 0x8D, 0x0C, 0x8D, 0xC4, 0x8A, 0x5D, 0x1F, 0xE2, 0x05, 0x07, + 0xC7, 0x1D, 0x2B, 0x4F, 0xAF, 0x20, 0x33, 0x60, 0x43, 0x6D, 0x60, 0x5F, + 0xEC, 0x57, 0x2F, 0xF5, 0x8A, 0xC4, 0xC7, 0x8E, 0x2B, 0x6B, 0xE8, 0xF0, + 0xA2, 0x4E, 0x66, 0xBA, 0x55, 0xEF, 0x67, 0x78, 0x20, 0x70, 0x1D, 0x57, + 0x25, 0x1C, 0xC8, 0x0C, 0x7F, 0x1D, 0x88, 0x4D, 0x28, 0xCE, 0x90, 0xDE, + 0xE5, 0xBE, 0x9B, 0xCC, 0x28, 0x38, 0x52, 0xA5, 0xB4, 0xE0, 0x86, 0x7F, + 0x73, 0x22, 0x75, 0x9D, 0xCA, 0x1F, 0xCB, 0x31, 0x35, 0xC7, 0x55, 0xA7, + 0xD2, 0xCD, 0x56, 0xC7, 0x22, 0xA6, 0xD3, 0x37, 0x02, 0x2E, 0xBE, 0x08, + 0x00, 0x26, 0x9A, 0x99, 0x62, 0x46, 0x1B, 0x25, 0xED, 0x6A, 0xD5, 0x61, + 0x20, 0xB9, 0xDD, 0xF7, 0xBE, 0xDD, 0x64, 0x5D, 0x61, 0xE5, 0x2F, 0x87, + 0x81, 0x47, 0x7E, 0xC2, 0x7D, 0x45, 0xB7, 0x2A, 0x0C, 0xB0, 0x0C, 0x5F, + 0x4C, 0x93, 0x02, 0xEE, 0x96, 0x55, 0xAF, 0x7C, 0x06, 0xA8, 0x74, 0x64, + 0x61, 0x6A, 0xA1, 0x41, 0x69, 0x55, 0x63, 0x15, 0x5B, 0x50, 0xA9, 0x8A, + 0xC5, 0x02, 0x3E, 0x5E, 0xFF, 0x4D, 0xD7, 0xE4, 0xE0, 0x88, 0xFE, 0xB5, + 0x53, 0x72, 0xA0, 0x52, 0xCE, 0x3C, 0x25, 0x98, 0xFF, 0x05, 0xFC, 0xE4, + 0x0C, 0x57, 0xE7, 0x4C, 0xD0, 0xEB, 0x1B, 0x4C, 0xEC, 0x89, 0xCE, 0x88, + 0x15, 0x6A, 0x9B, 0x7B, 0xDD, 0x0C, 0x53, 0x72, 0x0D, 0x0C, 0xD2, 0xE0, + 0x6E, 0x20, 0xF5, 0x30, 0xCE, 0xD2, 0xF6, 0x11, 0x0D, 0xCC, 0x85, 0x4C, + 0x9A, 0xD3, 0xBF, 0xF2, 0x39, 0xFF, 0x26, 0x4F, 0x4D, 0xAE, 0x25, 0x4A, + 0x72, 0xD9, 0x22, 0x8B, 0xE1, 0x07, 0xA9, 0xBD, 0x53, 0x45, 0x7C, 0xEB, + 0xFE, 0x56, 0xAE, 0x01, 0x7F, 0x12, 0x4E, 0x18, 0xE7, 0x96, 0xB1, 0x0E, + 0x9C, 0x89, 0xA8, 0xB4, 0x1C, 0xDA, 0x3E, 0xFE, 0x8C, 0x1C, 0xEF, 0xB4, + 0x50, 0xE5, 0x46, 0x1B, 0x56, 0xCE, 0x01, 0x53, 0xB2, 0x6D, 0xB0, 0xD0, + 0x8E, 0x08, 0x89, 0x2A, 0x5B, 0xC8, 0xFC, 0x9B, 0x6B, 0x4B, 0x6D, 0xDC, + 0x2E, 0x2E, 0x74, 0xAB, 0xE1, 0xAE, 0xA6, 0x74, 0x8F, 0x31, 0x74, 0x5F, + 0x34, 0x45, 0xE4, 0x88, 0xCE, 0x66, 0x24, 0xE9, 0x93, 0x68, 0x76, 0xD6, + 0xB9, 0x10, 0xA9, 0xBA, 0x6A, 0x3A, 0xCD, 0xB8, 0x95, 0x44, 0x7D, 0x75, + 0x13, 0x64, 0x7B, 0xD2, 0x29, 0xB9, 0x3A, 0x75, 0x98, 0x26, 0xFC, 0x2B, + 0x46, 0x8A, 0xFD, 0x5C, 0x2B, 0xB5, 0x6C, 0x48, 0x20, 0x5F, 0xAA, 0x09, + 0xAD, 0xBA, 0x7B, 0xE3, 0x13, 0x55, 0x3D, 0xBD, 0x43, 0xEA, 0xC7, 0xA7, + 0x3E, 0xDD, 0xF3, 0xEB, 0xBB, 0x7D, 0xFE, 0x2A, 0x9B, 0xC4, 0xFB, 0x44, + 0x1D, 0xD1, 0x72, 0x33, 0x88, 0x65, 0xFE, 0xE7, 0xD1, 0xD7, 0x55, 0xDC, + 0x2F, 0x17, 0xC0, 0x8A, 0xE2, 0xDA, 0x5E, 0xA4, 0x68, 0x9C, 0xA2, 0x5C, + 0xA0, 0xE7, 0x1F, 0x02, 0xFB, 0xC3, 0xEE, 0x63, 0xB7, 0xBD, 0x29, 0xEF, + 0xCB, 0xA5, 0x47, 0x5A, 0x79, 0x4D, 0x5E, 0x9D, 0x44, 0x5A, 0xF9, 0xC6, + 0xDE, 0x0A, 0x71, 0x58, 0xB6, 0xA0, 0x02, 0xE5, 0xAA, 0x62, 0x15, 0xF4, + 0x39, 0x28, 0x9A, 0xF8, 0x59, 0xF1, 0x92, 0x17, 0x45, 0x27, 0x6A, 0x1D, + 0x11, 0x3E, 0x08, 0xA2, 0xCD, 0x31, 0x0E, 0xEE, 0xD4, 0xFC, 0xF9, 0x3C, + 0x1F, 0x87, 0x00, 0xE2, 0x5F, 0xB8, 0x35, 0xBB, 0xC5, 0x97, 0x32, 0xCE, + 0x7F, 0x1D, 0xD6, 0x05, 0xEE, 0xD7, 0x0D, 0xB9, 0x3C, 0x6B, 0xAF, 0x23, + 0x0B, 0x86, 0x3C, 0x40, 0x66, 0xCD, 0x65, 0x8A, 0xF8, 0xEB, 0x6B, 0xAB, + 0x2F, 0x98, 0x6C, 0x40, 0x8E, 0x54, 0x90, 0xB5, 0x1C, 0x79, 0x7B, 0x83, + 0x12, 0xA4, 0x0B, 0x20, 0xD5, 0x95, 0x30, 0x2C, 0x8A, 0x6E, 0x94, 0xD2, + 0xAB, 0x78, 0xF5, 0x71, 0x38, 0x4F, 0xB2, 0x93, 0x50, 0xDB, 0x16, 0x94, + 0xC4, 0xA9, 0x7D, 0x9D, 0x2F, 0x48, 0x98, 0xEB, 0x74, 0xE2, 0xD7, 0x97, + 0x91, 0xBC, 0xF8, 0x90, 0xAF, 0x74, 0x71, 0x38, 0x94, 0xFE, 0xA6, 0xC7, + 0x89, 0x63, 0x0D, 0x9B, 0xF1, 0x81, 0x28, 0x4A, 0x75, 0x85, 0x53, 0x83, + 0x34, 0x99, 0xE6, 0xF4, 0xAA, 0xF4, 0xF0, 0x1D, 0x92, 0xBE, 0x12, 0x8E, + 0x20, 0xBF, 0xCA, 0x41, 0x30, 0x08, 0x9B, 0x47, 0xD0, 0x23, 0x45, 0x67, + 0x38, 0x2B, 0x0F, 0xD3, 0xBA, 0x59, 0xEB, 0x7C, 0x39, 0xCF, 0xA8, 0xB7, + 0xA9, 0xEF, 0xF4, 0xC7, 0xD9, 0x1B, 0x5B, 0xC4, 0xC3, 0xA3, 0x92, 0xA2, + 0xF9, 0x1F, 0xC1, 0x99, 0x57, 0xE6, 0xD8, 0x22, 0xF8, 0xA5, 0xC8, 0x4B, + 0xCE, 0xAD, 0xBD, 0x19, 0x71, 0xC3, 0x1A, 0xEB, 0x25, 0xFD, 0xA7, 0x7F, + 0xA8, 0x7A, 0xEC, 0x54, 0x0A, 0x97, 0x3E, 0x85, 0x29, 0xAF, 0x85, 0xDE, + 0x14, 0x10, 0x3C, 0xBD, 0x66, 0xBE, 0x59, 0xE4, 0x71, 0xD8, 0x7E, 0xEA, + 0xF6, 0x8A, 0x8F, 0xF1, 0x3A, 0x03, 0x41, 0x99, 0x27, 0x45, 0xB6, 0x05, + 0x2F, 0x6B, 0x11, 0x61, 0xB4, 0x40, 0x40, 0x3A, 0xD2, 0xE9, 0x90, 0xDD, + 0x0C, 0x19, 0x3B, 0x01, 0xF2, 0xA4, 0xF5, 0x3B, 0x9C, 0x18, 0x32, 0x26, + 0xCB, 0xDB, 0x20, 0x5B, 0xE2, 0x43, 0x70, 0xCB, 0x37, 0xA6, 0xEC, 0x34, + 0x85, 0x33, 0xD6, 0x8B, 0x1F, 0x5F, 0x10, 0xCC, 0x86, 0xAB, 0x04, 0x31, + 0x5D, 0x07, 0xD6, 0x7C, 0x5F, 0x71, 0x08, 0xAC, 0x3F, 0x08, 0xC6, 0xCF, + 0xAC, 0x50, 0xCF, 0xA2, 0xFC, 0xDB, 0x02, 0x01, 0xD5, 0x33, 0x9E, 0x57, + 0xDC, 0x88, 0xBC, 0x51, 0x71, 0x95, 0x9A, 0x86, 0x99, 0xBB, 0xFC, 0x5A, + 0x3C, 0xB8, 0xC0, 0xA5, 0x12, 0xA4, 0x26, 0x55, 0xE7, 0x8A, 0xD0, 0x6F, + 0x2C, 0x52, 0x21, 0xA4, 0x0A, 0xBE, 0xC9, 0xA7, 0x87, 0x4B, 0xBD, 0x47, + 0x44, 0xFA, 0x7A, 0xE5, 0xDF, 0x07, 0x54, 0xC8, 0xA3, 0xF3, 0x73, 0x28, + 0xE5, 0x52, 0x36, 0x04, 0x42, 0xAB, 0x9C, 0x6E, 0x80, 0x5B, 0x44, 0xF0, + 0xA7, 0xC6, 0x00, 0xC3, 0x69, 0x14, 0xE9, 0x01, 0xD2, 0xE4, 0x69, 0x7D, + 0x32, 0xAC, 0x78, 0x70, 0x76, 0x81, 0x9A, 0x19, 0x7D, 0x80, 0x82, 0xB5, + 0xCE, 0x11, 0xBD, 0xF1, 0x15, 0x36, 0x49, 0xB1, 0x84, 0xCB, 0x15, 0x46, + 0x87, 0xF4, 0x83, 0x3D, 0x82, 0x9A, 0x84, 0xB7, 0x86, 0x47, 0x06, 0x72, + 0xE9, 0xE5, 0xFE, 0x4C, 0x11, 0xAE, 0xD1, 0x0D, 0xA7, 0xBE, 0xFD, 0xE2, + 0xF7, 0xAD, 0xC2, 0x47, 0xA5, 0x72, 0x4A, 0x96, 0x38, 0xCC, 0x6B, 0xE7, + 0x94, 0xA3, 0x91, 0x6B, 0x3D, 0x20, 0x86, 0xA4, 0x70, 0x84, 0xDB, 0x35, + 0x78, 0xC9, 0x50, 0x89, 0x57, 0xE6, 0xB1, 0xA7, 0x60, 0xD7, 0x89, 0x13, + 0x8C, 0x04, 0xEC, 0x19, 0x40, 0x0C, 0xFB, 0x5D, 0x73, 0xAB, 0x2B, 0x58, + 0xEF, 0xD2, 0x9C, 0x2C, 0x8F, 0x11, 0x5F, 0x86, 0x43, 0xD3, 0x68, 0xE3, + 0x7C, 0xB6, 0x6B, 0xEF, 0x88, 0xC6, 0x64, 0x69, 0x32, 0x0C, 0x86, 0x30, + 0xCC, 0x25, 0x0B, 0x5A, 0x74, 0x64, 0x5C, 0xCC, 0xAC, 0xEF, 0x61, 0xFD, + 0x06, 0xEE, 0x95, 0xC6, 0xEB, 0xB8, 0xD1, 0x46, 0x7B, 0x50, 0xD1, 0x1D, + 0x82, 0x4C, 0xE5, 0xA2, 0xB2, 0xAC, 0x24, 0x49, 0xE0, 0xFB, 0x14, 0x29, + 0xC9, 0x39, 0x93, 0x9C, 0x35, 0x61, 0xD4, 0x29, 0xD3, 0x1A, 0x21, 0x6C, + 0xD4, 0x89, 0x84, 0x47, 0xF6, 0xE2, 0x00, 0x3A, 0x40, 0xB2, 0xC1, 0x39, + 0xFE, 0x79, 0x18, 0xC8, 0x5A, 0x41, 0x1C, 0xAD, 0x8A, 0xB6, 0x79, 0x3F, + 0x32, 0xFD, 0x8F, 0x3E, 0x57, 0x22, 0x5F, 0xDE, 0xE0, 0x90, 0x9B, 0xB7, + 0xF7, 0x80, 0xA2, 0x42, 0x33, 0x4E, 0x64, 0xD2, 0xB4, 0x25, 0x77, 0x62, + 0xA2, 0x48, 0x80, 0x06, 0x17, 0xBB, 0xC8, 0x04, 0x35, 0x94, 0x1A, 0xD7, + 0x64, 0xA4, 0xE6, 0xB6, 0xE6, 0x43, 0x30, 0x46, 0x78, 0xB6, 0x98, 0x1B, + 0x0F, 0x90, 0xE6, 0xF7, 0x9A, 0x6A, 0xEC, 0x96, 0x7F, 0x46, 0xD8, 0x1E, + 0x62, 0xA6, 0x56, 0x54, 0x63, 0x44, 0x62, 0x18, 0x75, 0x61, 0xB4, 0x11, + 0x0F, 0x6D, 0x5E, 0xE3, 0x45, 0xD4, 0x80, 0xC1, 0xAF, 0x98, 0xF6, 0x48, + 0x15, 0xDF, 0xD5, 0x3C, 0xD3, 0xE9, 0xD2, 0x17, 0x7E, 0x1A, 0x18, 0x3A, + 0xA1, 0xFF, 0xF0, 0x46, 0x9C, 0x48, 0xBA, 0x72, 0xFF, 0x21, 0x66, 0x63, + 0x8D, 0xB7, 0xA5, 0x17, 0x42, 0x4F, 0x2E, 0xCA, 0xEA, 0x8E, 0xD9, 0x6F, + 0xBD, 0x4B, 0x80, 0x4C, 0x73, 0x4F, 0x85, 0x3D, 0x0B, 0x80, 0x32, 0x1A, + 0xAD, 0x93, 0x83, 0x82, 0x0B, 0xA6, 0x5E, 0x76, 0x5B, 0x60, 0x51, 0x81, + 0x53, 0x9D, 0x82, 0x5F, 0x65, 0xAD, 0x93, 0x80, 0x81, 0x2C, 0x8A, 0x0B, + 0x7D, 0x58, 0x67, 0xE5, 0xAD, 0xB9, 0x94, 0xF7, 0x11, 0x58, 0xE9, 0x7D, + 0xE0, 0xC6, 0x92, 0xC9, 0x7D, 0x4C, 0xDC, 0x4C, 0x88, 0x22, 0x31, 0x68, + 0xC3, 0x37, 0xE3, 0x1E, 0xE5, 0xA4, 0x6B, 0x41, 0xEA, 0x9D, 0xE8, 0xFC, + 0xF1, 0xF3, 0x78, 0xF4, 0x54, 0x40, 0x53, 0x9D, 0x7D, 0x4C, 0x70, 0x56, + 0xBE, 0xB0, 0x74, 0x67, 0xAC, 0x7D, 0xE0, 0x4F, 0x67, 0x28, 0x71, 0xDD, + 0xCE, 0x78, 0xDB, 0xB5, 0xFF, 0x54, 0x22, 0xBD, 0x89, 0x74, 0x38, 0x14, + 0x1A, 0x10, 0x2C, 0xDF, 0x30, 0x24, 0xB0, 0xC1, 0x85, 0x09, 0x4D, 0xB5, + 0xE2, 0x02, 0x5E, 0x85, 0x9E, 0x6E, 0x6A, 0xB7, 0xE0, 0x6C, 0xF3, 0x91, + 0x42, 0xE7, 0x08, 0x07, 0x95, 0x00, 0xD9, 0x7F, 0x2C, 0xD0, 0xA1, 0x2A, + 0xB1, 0x52, 0x18, 0x62, 0x57, 0x51, 0xA0, 0xF2, 0xC9, 0x8B, 0xAA, 0x01, + 0x08, 0x74, 0xA6, 0x7C, 0x60, 0x3D, 0x3C, 0x4B, 0xED, 0x45, 0xFE, 0xCE, + 0x00, 0x9E, 0x6E, 0x99, 0xDA, 0x0B, 0xC6, 0xB6, 0xC5, 0xCF, 0xAA, 0x03, + 0xEE, 0x7F, 0x41, 0xAE, 0x83, 0xAB, 0x23, 0xAA, 0x67, 0x1E, 0x20, 0x42, + 0x55, 0x54, 0x95, 0xAE, 0xAE, 0x82, 0x2A, 0x3F, 0xAA, 0x14, 0x66, 0xF4, + 0xAB, 0x01, 0xAD, 0x5F, 0xA7, 0x76, 0xFA, 0x21, 0xF4, 0x82, 0x22, 0x67, + 0x8F, 0xDC, 0xA2, 0x1A, 0xBC, 0x01, 0x75, 0x8D, 0x66, 0x8C, 0xD5, 0x46, + 0x90, 0x4D, 0xD8, 0xC0, 0xBC, 0x0F, 0x61, 0xB2, 0xE9, 0xE2, 0xD0, 0x32, + 0x27, 0x4B, 0x39, 0x43, 0x50, 0xD0, 0xF7, 0xF2, 0x32, 0x24, 0xE8, 0x32, + 0x19, 0x31, 0x57, 0x04, 0x5B, 0xAB, 0x54, 0xC7, 0x44, 0x6B, 0x5F, 0x6C, + 0x14, 0xB2, 0x83, 0xA2, 0xEC, 0x5F, 0x04, 0x8A, 0x78, 0x0D, 0xF8, 0x8F, + 0x61, 0xFA, 0x32, 0xC9, 0xB4, 0x60, 0xCC, 0xCB, 0x35, 0x92, 0xB3, 0x23, + 0x29, 0x28, 0x4D, 0x48, 0x6C, 0x00, 0x9F, 0xF9, 0x8D, 0x26, 0x44, 0xC9, + 0x0B, 0xB2, 0x73, 0x94, 0xF3, 0x7A, 0x9C, 0x4E, 0x7E, 0xC3, 0xB7, 0x7E, + 0x87, 0x98, 0x18, 0x83, 0x35, 0x93, 0xDD, 0x35, 0xF7, 0xD1, 0x3D, 0xF1, + 0x40, 0x48, 0x89, 0xAC, 0xEE, 0x98, 0xE7, 0x5A, 0x77, 0xED, 0x3A, 0xED, + 0x5A, 0xE7, 0x38, 0x74, 0xF7, 0xD6, 0xB6, 0x40, 0x76, 0xAE, 0xBD, 0x99, + 0x93, 0x02, 0xB3, 0xFF, 0xDE, 0x14, 0x70, 0xC3, 0xBF, 0x77, 0x00, 0x4F, + 0xC6, 0x7E, 0x7A, 0x1E, 0x39, 0xD3, 0x00, 0xDC, 0xC2, 0x35, 0x01, 0x25, + 0x8C, 0x9C, 0x34, 0x79, 0xA0, 0x47, 0xD4, 0xD4, 0x3B, 0xFF, 0x89, 0x7D, + 0x79, 0x8B, 0xBF, 0x9A, 0x64, 0x4E, 0xB7, 0xE5, 0x79, 0x31, 0xB8, 0x45, + 0x03, 0xD0, 0xCC, 0xA6, 0xE5, 0x22, 0xBC, 0xF1, 0x40, 0x24, 0xBA, 0xF6, + 0x2B, 0xE0, 0x21, 0xE3, 0xA5, 0x4D, 0xBE, 0xBB, 0x45, 0x12, 0x5A, 0x10, + 0x1B, 0x28, 0xC2, 0xD6, 0x85, 0xBE, 0xBD, 0xD0, 0xDD, 0xA3, 0xA0, 0x7B, + 0x2F, 0x98, 0xE2, 0x9D, 0x62, 0xB1, 0xB6, 0xE2, 0x1E, 0x1D, 0x7E, 0x69, + 0x6F, 0x39, 0x92, 0xF2, 0x97, 0x3D, 0x02, 0xE1, 0x17, 0x25, 0x03, 0x63, + 0x20, 0x39, 0xEF, 0xBD, 0x56, 0xFD, 0x66, 0xD5, 0x40, 0x31, 0x9A, 0xA7, + 0x45, 0x00, 0xD0, 0x01, 0x60, 0x30, 0xA2, 0xD5, 0x6C, 0x5A, 0x56, 0x67, + 0x11, 0x57, 0xC8, 0x09, 0x9D, 0x96, 0xB0, 0xD1, 0x88, 0x9F, 0xE7, 0xE3, + 0xAC, 0xD0, 0x0C, 0x39, 0x13, 0xB8, 0xF5, 0xFA, 0xDB, 0xFE, 0x5C, 0x52, + 0x4A, 0x8D, 0xA2, 0x8C, 0xA8, 0x7E, 0xAB, 0xEC, 0x22, 0x7F, 0x23, 0x04, + 0x16, 0x0E, 0x8F, 0x99, 0xD7, 0x83, 0x13, 0xDF, 0x40, 0x3F, 0xB7, 0xF1, + 0xA9, 0x2A, 0x04, 0x62, 0xD3, 0xC1, 0x2F, 0x4B, 0x5D, 0xE8, 0xB8, 0x0E, + 0xD2, 0x46, 0xF3, 0x13, 0x92, 0x9A, 0x63, 0x03, 0x54, 0xEC, 0x9E, 0xD3, + 0x30, 0x00, 0x03, 0x8A, 0x77, 0x8B, 0xCD, 0x8C, 0x3D, 0x6B, 0x9E, 0xBB, + 0x72, 0x7B, 0xB8, 0x72, 0xB9, 0xCD, 0x98, 0x69, 0xFB, 0x20, 0xB8, 0xC5, + 0x3F, 0xA0, 0x9C, 0xD1, 0x29, 0x89, 0xE0, 0x55, 0xDF, 0x87, 0x5D, 0x90, + 0x28, 0x99, 0xE6, 0x39, 0x63, 0x6A, 0x19, 0xE8, 0x0D, 0x50, 0xB1, 0x2C, + 0xF3, 0x31, 0xC1, 0x68, 0x23, 0xE3, 0x70, 0xFF, 0x7E, 0x1F, 0x4D, 0xF5, + 0xC5, 0x90, 0xE9, 0x81, 0x17, 0x66, 0x17, 0x40, 0x44, 0xDF, 0x2F, 0x63, + 0x50, 0x82, 0x72, 0x87, 0x23, 0x93, 0x6B, 0x7E, 0xAD, 0x53, 0x6F, 0xD7, + 0x78, 0x31, 0x25, 0x9F, 0x9E, 0xC3, 0xC9, 0x42, 0x18, 0x40, 0xE9, 0x4C, + 0xFC, 0xAA, 0xC7, 0xF5, 0x51, 0x93, 0x24, 0xE2, 0xFD, 0x69, 0x72, 0x68, + 0xE1, 0x8D, 0x59, 0x42, 0x1A, 0x14, 0x48, 0x6A, 0xDD, 0x59, 0xC3, 0xA7, + 0x34, 0x73, 0x37, 0xAE, 0x82, 0xB9, 0xEB, 0x46, 0xD2, 0xB6, 0x31, 0xB4, + 0x3E, 0x82, 0x49, 0x4B, 0x0F, 0x13, 0xB5, 0x98, 0x47, 0x26, 0xD4, 0x45, + 0x8C, 0xE2, 0x04, 0xD4, 0xC6, 0x8B, 0x7B, 0x7D, 0x0E, 0x7D, 0x3C, 0x63, + 0x39, 0xD7, 0xDF, 0xB2, 0x68, 0x34, 0xD4, 0xB4, 0x70, 0x6A, 0x98, 0x15, + 0xDF, 0x16, 0xEF, 0xAF, 0x1E, 0xC5, 0x1F, 0x5C, 0x3D, 0x85, 0x74, 0xC6, + 0xCF, 0x44, 0x01, 0xD3, 0xC3, 0x61, 0x93, 0xBF, 0x23, 0x9F, 0x99, 0x44, + 0x54, 0x2A, 0x32, 0xB9, 0x75, 0x21, 0x1B, 0x2C, 0xE1, 0xFB, 0xFF, 0xAF, + 0x62, 0x6F, 0x86, 0x23, 0xFE, 0xCD, 0x68, 0x38, 0xB6, 0xAC, 0x49, 0xF6, + 0x4A, 0x0C, 0xA1, 0xF5, 0x19, 0xD1, 0x5A, 0xA8, 0xF0, 0xB4, 0x9B, 0x4E, + 0x0F, 0x6B, 0x65, 0x46, 0x44, 0x16, 0x2F, 0x7E, 0x6E, 0xDC, 0x5F, 0x5E, + 0x6F, 0x31, 0x99, 0x43, 0xA0, 0x27, 0xBD, 0x2A, 0x58, 0x6E, 0xB2, 0x82, + 0x29, 0x78, 0xED, 0xA6, 0x83, 0x4D, 0x1B, 0xCD, 0x9C, 0x0F, 0xE5, 0xE7, + 0x1A, 0xE4, 0x63, 0xD6, 0x6A, 0xD5, 0x03, 0x39, 0xB8, 0x48, 0x77, 0x80, + 0xF7, 0xF3, 0xFE, 0x64, 0x8B, 0x98, 0x72, 0xBE, 0x31, 0x28, 0xF0, 0x48, + 0x2A, 0x65, 0x37, 0xDA, 0xD1, 0x9A, 0x18, 0x37, 0xBB, 0x23, 0x59, 0xB3, + 0x24, 0x75, 0xF7, 0xF5, 0x79, 0x4E, 0xF0, 0xCA, 0x85, 0x13, 0x3C, 0x93, + 0xD0, 0xC6, 0xD9, 0xEA, 0xAE, 0xDF, 0x7E, 0xAC, 0xE4, 0xAB, 0x88, 0x0E, + 0x78, 0x80, 0x1D, 0x26, 0x2A, 0x5C, 0x95, 0x23, 0x6B, 0x70, 0x99, 0x6C, + 0x15, 0xC4, 0x86, 0xC0, 0x29, 0x9D, 0x55, 0xE4, 0xC1, 0x84, 0x37, 0x6B, + 0xA7, 0x26, 0x82, 0xCC, 0x9C, 0xDA, 0xEB, 0x54, 0x17, 0x67, 0xD3, 0x74, + 0x4B, 0x4F, 0x7C, 0x63, 0x4D, 0xE7, 0xE4, 0x93, 0x34, 0xDB, 0xDE, 0x9D, + 0x17, 0x28, 0x06, 0xEA, 0x09, 0x2A, 0x63, 0x8D, 0x1A, 0x32, 0xD8, 0xC9, + 0x66, 0xE2, 0x77, 0xE6, 0x19, 0x59, 0x44, 0x13, 0x2A, 0x7E, 0x4E, 0xF4, + 0x5A, 0xC7, 0xBB, 0x43, 0xDC, 0xC8, 0x6A, 0x56, 0x5D, 0x2F, 0x55, 0xFD, + 0x7E, 0x5A, 0x37, 0x1F, 0x99, 0xE3, 0xF8, 0xEC, 0x50, 0x0B, 0xE3, 0x94, + 0xC4, 0xF5, 0xCD, 0xC1, 0x03, 0x96, 0x76, 0xB3, 0x34, 0x01, 0xF9, 0x5C, + 0xE6, 0xC9, 0x99, 0x40, 0xB7, 0xCD, 0x5C, 0xF8, 0xE6, 0xF7, 0x3F, 0x7B, + 0x13, 0x19, 0x22, 0x02, 0xEF, 0x59, 0x45, 0x48, 0x61, 0x2B, 0xED, 0xCD, + 0xB5, 0x90, 0x2C, 0xD0, 0x49, 0xB4, 0x39, 0x76, 0x51, 0xBE, 0x51, 0xD7, + 0x3D, 0xD7, 0xDD, 0x55, 0x98, 0xC5, 0x0F, 0xBD, 0xF6, 0xE0, 0x96, 0xAA, + 0xB8, 0x19, 0x97, 0x7F, 0x35, 0x2C, 0x50, 0x69, 0xE8, 0xEE, 0x6A, 0x2F, + 0x00, 0x18, 0x65, 0x1B, 0xD6, 0xB8, 0x2A, 0xC3, 0x0A, 0x37, 0xEA, 0x7E, + 0x95, 0x8B, 0x60, 0xA5, 0x2E, 0xC0, 0x55, 0x24, 0x3B, 0x3D, 0xB1, 0x40, + 0x22, 0x8A, 0x56, 0xAB, 0x04, 0x6B, 0x31, 0x0E, 0xB6, 0xD7, 0x17, 0xF1, + 0xEA, 0x9B, 0x91, 0x0E, 0xEE, 0xCE, 0x0A, 0xFE, 0x37, 0x46, 0xAC, 0x15, + 0xF9, 0x60, 0xFF, 0x73, 0x54, 0xC9, 0xE1, 0x8C, 0x42, 0xFA, 0x39, 0x51, + 0xD4, 0x77, 0xAC, 0x62, 0xF3, 0x15, 0x8D, 0xC5, 0xEC, 0x46, 0x75, 0x97, + 0x50, 0xED, 0x10, 0xF5, 0xC7, 0x81, 0xEC, 0x1D, 0x7C, 0x40, 0x7B, 0x9F, + 0x4F, 0x37, 0xA4, 0xED, 0x3C, 0x35, 0x68, 0xDB, 0xDB, 0x7F, 0xF2, 0xF3, + 0xDC, 0x39, 0xA0, 0x40, 0xE8, 0x17, 0x9C, 0xD8, 0x26, 0x92, 0xF2, 0x57, + 0x5E, 0xE7, 0x56, 0xDA, 0x4F, 0x3F, 0x4C, 0xF4, 0x90, 0x4A, 0x89, 0x33, + 0x49, 0xBB, 0x99, 0xE9, 0xCA, 0x6F, 0x5F, 0x51, 0xAE, 0xFF, 0x83, 0x90, + 0x83, 0x53, 0xFF, 0x00, 0x7F, 0x2F, 0x84, 0xD7, 0xD8, 0xE8, 0xB1, 0xAB, + 0xF9, 0x56, 0x65, 0x93, 0xA7, 0xC2, 0xB4, 0xD7, 0x6B, 0xB4, 0xCF, 0x65, + 0xC8, 0xCA, 0x20, 0x15, 0x91, 0x74, 0x30, 0x4D, 0x72, 0x5B, 0xBD, 0x70, + 0xC5, 0x8B, 0xD3, 0xC7, 0xD4, 0x7B, 0xFB, 0xDF, 0x6B, 0x7B, 0x19, 0x6B, + 0x8B, 0x83, 0x47, 0x83, 0xC6, 0x44, 0xBA, 0xA8, 0xEA, 0xB8, 0x38, 0x67, + 0x6B, 0x58, 0xF3, 0x4E, 0xC8, 0xA8, 0xF4, 0xDD, 0x30, 0xDD, 0x59, 0x4D, + 0x55, 0x27, 0x1E, 0x14, 0x3A, 0x71, 0xD5, 0xFD, 0x59, 0x0B, 0xC2, 0x17, + 0x2F, 0x08, 0x53, 0x27, 0x07, 0xEE, 0xA0, 0xC6, 0xE9, 0xF8, 0x31, 0xDD, + 0x97, 0xC4, 0xAD, 0xC1, 0x9A, 0x60, 0x5C, 0xE4, 0x27, 0x0A, 0x03, 0x35, + 0x10, 0x9C, 0xE8, 0x70, 0xE3, 0xF3, 0xD8, 0xE6, 0x72, 0xA5, 0x31, 0xC6, + 0xFE, 0x46, 0xA8, 0x46, 0x6E, 0x74, 0x90, 0xD6, 0x8F, 0x27, 0x3C, 0x39, + 0x24, 0x5E, 0x31, 0x3C, 0xCC, 0x9A, 0xDD, 0xFE, 0xE9, 0xDA, 0x84, 0xE8, + 0xA1, 0xCC, 0x4B, 0xE1, 0x1B, 0xAA, 0x7D, 0xF6, 0x7C, 0xA8, 0x4C, 0xD5, + 0xFC, 0x3C, 0x4C, 0xFC, 0x62, 0x32, 0xAE, 0x5D, 0xBA, 0x65, 0xDC, 0xC3, + 0x1D, 0x8C, 0x9D, 0x0E, 0x2A, 0x46, 0x64, 0x8D, 0xCD, 0x6E, 0xBC, 0x86, + 0x16, 0x15, 0xA2, 0x26, 0xD1, 0x3E, 0x5F, 0x0A, 0x81, 0x86, 0x0F, 0xE8, + 0xA1, 0x28, 0xA3, 0x5F, 0xFF, 0xE4, 0x68, 0x2C, 0xE6, 0x30, 0x16, 0xB8, + 0x2E, 0xCD, 0x41, 0x52, 0xE3, 0x81, 0xFB, 0x1D, 0x1C, 0xA2, 0x17, 0xC3, + 0xF1, 0x24, 0x02, 0x94, 0xB9, 0x59, 0xEC, 0x4A, 0x6D, 0xE3, 0x27, 0x18, + 0x2C, 0xDA, 0x75, 0x17, 0x42, 0xAA, 0xF7, 0x61, 0x50, 0x29, 0x8C, 0x0A, + 0xCA, 0x8E, 0xCA, 0x59, 0x82, 0x1F, 0x1D, 0x0B, 0x00, 0x36, 0xE4, 0x78, + 0x25, 0x01, 0xF7, 0xFB, 0x0E, 0x65, 0x4E, 0x07, 0x5E, 0xD8, 0x23, 0xC6, + 0x49, 0x76, 0x06, 0x0B, 0xA5, 0xC2, 0x30, 0x55, 0x82, 0xF6, 0x60, 0x69, + 0xAE, 0x1B, 0x37, 0xC1, 0x02, 0xE8, 0x23, 0x9B, 0x15, 0x70, 0x7B, 0xF8, + 0xF9, 0x5E, 0x50, 0x69, 0x2F, 0x28, 0x7E, 0xDB, 0x35, 0x2F, 0x6C, 0x87, + 0xCC, 0xFD, 0x23, 0x1A, 0x3B, 0x32, 0x9C, 0xFC, 0xE2, 0x6A, 0x24, 0x2A, + 0x0C, 0x5E, 0x4D, 0x19, 0x7E, 0xDA, 0xCA, 0x95, 0x61, 0xE1, 0xC6, 0x60, + 0x4E, 0x62, 0xCB, 0x6A, 0x09, 0x83, 0x02, 0xEF, 0xC8, 0x7E, 0x36, 0x79, + 0x14, 0x24, 0x35, 0x01, 0xCF, 0xCB, 0x95, 0xF5, 0x08, 0x5E, 0x0A, 0x46, + 0xD2, 0x5B, 0x46, 0x43, 0x54, 0x3B, 0x4F, 0x96, 0xD5, 0x53, 0x81, 0x8D, + 0x0E, 0xDE, 0x7A, 0x94, 0xB8, 0x09, 0x11, 0x47, 0x8F, 0x38, 0xFE, 0x47, + 0x00, 0xFA, 0x76, 0x73, 0x96, 0xDA, 0x1C, 0x55, 0xE9, 0x9E, 0x73, 0x1E, + 0x75, 0xCF, 0x7A, 0x4D, 0xB0, 0x44, 0x6E, 0x2A, 0x6D, 0x98, 0x2B, 0x39, + 0xDC, 0xBA, 0x17, 0x50, 0x06, 0xEA, 0xA6, 0x62, 0x33, 0xD9, 0xD2, 0x66, + 0x78, 0x05, 0xE5, 0x52, 0x2B, 0x9F, 0x34, 0xAE, 0xDF, 0xE9, 0x9D, 0x44, + 0xBA, 0x93, 0xD8, 0x29, 0x02, 0xC6, 0xED, 0x5A, 0x59, 0x0A, 0xD0, 0xD9, + 0x6D, 0xBE, 0x97, 0x25, 0x5E, 0xDA, 0x95, 0x44, 0xCE, 0x73, 0xFD, 0xE5, + 0x98, 0xFD, 0x75, 0x38, 0x88, 0x1E, 0x42, 0x2A, 0x3F, 0x65, 0x96, 0x7C, + 0xF1, 0x86, 0x51, 0xBE, 0x51, 0xB1, 0x1E, 0xD1, 0x76, 0x64, 0x08, 0x85, + 0x49, 0xD7, 0xDD, 0xDD, 0xD4, 0xFA, 0xFE, 0xCA, 0x67, 0xDB, 0x36, 0x90, + 0x07, 0xEB, 0x86, 0xF6, 0x07, 0x7A, 0x21, 0xDB, 0xEE, 0x57, 0x24, 0x55, + 0x87, 0x2C, 0xD2, 0xA4, 0xEE, 0x45, 0x51, 0xE8, 0x05, 0xD1, 0x24, 0x08, + 0xD0, 0x3B, 0x7D, 0xCA, 0x0E, 0x5D, 0x03, 0x57, 0x44, 0xF7, 0x76, 0x0A, + 0xCD, 0x20, 0x9B, 0x93, 0xE0, 0x7D, 0x86, 0x3E, 0x48, 0x8D, 0xF0, 0x4C, + 0x28, 0x32, 0x77, 0xD8, 0xA3, 0x48, 0xA0, 0x93, 0x36, 0x05, 0xA0, 0x19, + 0xF2, 0x98, 0x6C, 0x17, 0x5E, 0x2C, 0x5E, 0xE4, 0xAD, 0x36, 0x96, 0x10, + 0x1B, 0xE5, 0xB7, 0x6B, 0x84, 0x0C, 0xED, 0xE3, 0xDC, 0x4B, 0xA4, 0xE7, + 0x0A, 0xDA, 0xD4, 0xE7, 0xD9, 0x1E, 0xEE, 0xF9, 0xD5, 0x06, 0xAF, 0x3F, + 0x51, 0x1D, 0x98, 0x42, 0x77, 0x11, 0x02, 0x57, 0x10, 0x3C, 0x5C, 0x98, + 0xDA, 0x7D, 0x64, 0x6B, 0xEC, 0x6B, 0x51, 0xFB, 0x77, 0x31, 0x79, 0xCE, + 0x9C, 0x58, 0x03, 0xEA, 0x2A, 0xDF, 0x92, 0x5D, 0xED, 0x0F, 0x20, 0xCC, + 0x0A, 0x70, 0x42, 0x94, 0x37, 0xFA, 0xDF, 0xA1, 0xAF, 0x70, 0x1B, 0x0E, + 0x80, 0x5B, 0x3E, 0xA9, 0xBF, 0x0F, 0x2B, 0x5D, 0xD8, 0x2F, 0xEF, 0xF9, + 0xF3, 0x53, 0xC5, 0xE7, 0x93, 0x87, 0x49, 0x54, 0xE4, 0x48, 0x74, 0xD2, + 0xDC, 0x2A, 0x9A, 0xE2, 0x18, 0x61, 0xD7, 0xAC, 0x4C, 0x1A, 0x2E, 0x72, + 0x83, 0x8D, 0xDA, 0xCE, 0x16, 0xD1, 0x3F, 0x90, 0x62, 0xCA, 0xA7, 0x06, + 0x22, 0x66, 0xF3, 0x67, 0xB0, 0xA3, 0xD4, 0xDD, 0xB1, 0xA4, 0xF3, 0x22, + 0xB3, 0x02, 0x4D, 0xD4, 0x2C, 0x84, 0xF5, 0x75, 0x87, 0x7D, 0x56, 0x04, + 0xC1, 0xC1, 0x62, 0x12, 0x59, 0xCF, 0x04, 0xA4, 0x20, 0x1F, 0xF5, 0xC5, + 0x8D, 0xB6, 0x88, 0x54, 0x61, 0xF3, 0x5A, 0x88, 0x3F, 0x6E, 0x5C, 0xE9, + 0x8B, 0x81, 0x56, 0xE6, 0x10, 0xC7, 0xED, 0x5F, 0x03, 0x67, 0x3E, 0x2E, + 0xBD, 0x6A, 0xC3, 0x4D, 0x33, 0xB7, 0xD4, 0x87, 0x46, 0x0B, 0x27, 0x86, + 0xFC, 0x65, 0x6F, 0xDF, 0x5A, 0x3D, 0x77, 0x49, 0x5A, 0xFB, 0x3A, 0x81, + 0xCE, 0xA1, 0xAC, 0x02, 0x18, 0x7E, 0x5B, 0x58, 0x75, 0xFB, 0x64, 0x7C, + 0xAA, 0x50, 0xE6, 0xE6, 0xA2, 0x7E, 0xFC, 0xC7, 0x67, 0x25, 0x5D, 0xE5, + 0x24, 0x28, 0x1F, 0x3B, 0xE6, 0x31, 0x6D, 0x43, 0x93, 0xD3, 0xC4, 0xB4, + 0x6F, 0x89, 0x02, 0x9B, 0x54, 0xC7, 0x6B, 0x97, 0xD3, 0x85, 0x06, 0xE1, + 0x4E, 0x15, 0xD2, 0xE8, 0xF3, 0x94, 0x37, 0x40, 0x30, 0x2C, 0xA0, 0x25, + 0x77, 0xA8, 0xC0, 0x23, 0x3F, 0x5F, 0x55, 0x71, 0x21, 0xD3, 0x33, 0x0B, + 0x7A, 0x2F, 0xDF, 0xB9, 0x39, 0x0D, 0xAE, 0x65, 0xCF, 0x53, 0x9C, 0x82, + 0xA2, 0xE5, 0x40, 0xF9, 0xF6, 0xDF, 0xBA, 0x33, 0x96, 0xF3, 0x55, 0x25, + 0x35, 0x9E, 0x5F, 0x9B, 0x25, 0x39, 0x94, 0x2F, 0x03, 0xA6, 0x28, 0xB0, + 0x6A, 0xFF, 0xFA, 0x14, 0xD6, 0xE7, 0x02, 0x07, 0x8F, 0x1A, 0xC4, 0xF0, + 0x51, 0x34, 0x3D, 0xD3, 0xDF, 0xCB, 0x57, 0xC3, 0xF5, 0x04, 0xE2, 0x4C, + 0x58, 0x18, 0xA5, 0xE2, 0x39, 0xB4, 0xA3, 0xE2, 0xE6, 0x25, 0xC5, 0xAC, + 0xFD, 0x75, 0xB2, 0x2B, 0x5B, 0x93, 0xC5, 0xFF, 0x56, 0xDB, 0xAA, 0x6E, + 0xCC, 0x18, 0x98, 0x90, 0x8A, 0x2C, 0x85, 0x84, 0xE7, 0xCF, 0xB0, 0xC5, + 0x18, 0x1F, 0x59, 0xC7, 0xA4, 0xCE, 0xAD, 0xB2, 0x04, 0x41, 0xBD, 0x56, + 0xD3, 0x12, 0xD5, 0x0A, 0x19, 0x83, 0x6D, 0xED, 0x87, 0xB0, 0xAB, 0xAE, + 0x8F, 0x79, 0xE5, 0x51, 0x30, 0xE9, 0x90, 0xBB, 0x91, 0x38, 0x2A, 0x17, + 0xDE, 0x3F, 0x53, 0x54, 0x34, 0x1E, 0x3F, 0x20, 0xE1, 0xA5, 0x17, 0xD5, + 0xCD, 0x64, 0x62, 0x1C, 0x60, 0xD2, 0xFC, 0xC1, 0x86, 0xA1, 0x55, 0x62, + 0x29, 0x58, 0x33, 0xD6, 0x1D, 0x3F, 0xD2, 0x70, 0xD6, 0x79, 0x09, 0x35, + 0x23, 0x6B, 0xEA, 0x8E, 0x80, 0xEB, 0x43, 0xAF, 0xBF, 0x86, 0xE8, 0xD6, + 0xBB, 0x1F, 0x75, 0x7A, 0x43, 0xAC, 0xC7, 0x84, 0x85, 0xAD, 0xE1, 0x72, + 0x4A, 0xF8, 0x97, 0xBE, 0xC6, 0x11, 0xCD, 0xAD, 0x99, 0xAE, 0xD4, 0x78, + 0x4F, 0xFA, 0x76, 0x5F, 0x95, 0xEF, 0x0E, 0x0C, 0x86, 0x2F, 0x45, 0x6F, + 0xB0, 0xED, 0x35, 0x87, 0x55, 0x79, 0x0B, 0x39, 0x0E, 0x13, 0x4A, 0x67, + 0x9A, 0xC5, 0x27, 0xC7, 0x5C, 0x99, 0x84, 0x75, 0xE6, 0xD1, 0x66, 0x2F, + 0x2F, 0x47, 0xA9, 0xE6, 0xDD, 0x9C, 0xCF, 0x10, 0x64, 0x33, 0xDE, 0xBB, + 0x35, 0x54, 0x9F, 0xBB, 0x40, 0x1B, 0xF1, 0x53, 0x48, 0xA1, 0x68, 0x42, + 0x39, 0x92, 0x52, 0xAE, 0xAC, 0xA5, 0x6E, 0xA4, 0x09, 0x96, 0x1A, 0xE8, + 0x88, 0x59, 0x38, 0xF3, 0xCA, 0x72, 0x52, 0xCC, 0xB0, 0x4F, 0x2B, 0x86, + 0xA9, 0xA9, 0x7D, 0xBF, 0x6F, 0x6A, 0x07, 0x89, 0x52, 0x99, 0xF8, 0x06, + 0xE5, 0x28, 0xC5, 0x74, 0xEC, 0x81, 0xE1, 0xE8, 0x25, 0x66, 0xD7, 0x7F, + 0xEA, 0x51, 0x56, 0xF7, 0xA8, 0x06, 0x44, 0xE9, 0xE0, 0x2F, 0x33, 0x19, + 0x4A, 0xD1, 0xCD, 0x92, 0x19, 0x2A, 0x1F, 0x03, 0x07, 0xD1, 0x46, 0x05, + 0x0D, 0x64, 0x23, 0xEC, 0x4D, 0x4E, 0x03, 0x2A, 0xED, 0xA5, 0xF4, 0x9F, + 0xC3, 0x93, 0xAB, 0xA3, 0xE2, 0x8C, 0x3F, 0xC4, 0xA5, 0xE1, 0x47, 0x0D, + 0x1A, 0x37, 0x52, 0x9D, 0x45, 0x96, 0xE2, 0x4D, 0x7F, 0xFD, 0x06, 0x28, + 0xE3, 0xEE, 0xE4, 0x57, 0x5D, 0x7B, 0x72, 0xA7, 0x8A, 0xCE, 0x77, 0x26, + 0xCF, 0x98, 0x06, 0x31, 0xB7, 0x28, 0x73, 0x1D, 0xA3, 0x4F, 0xB5, 0x01, + 0xE5, 0x4C, 0x14, 0xAD, 0xDB, 0x3F, 0xE6, 0xD1, 0xDA, 0xF7, 0x58, 0xBC, + 0x54, 0x76, 0x9E, 0x99, 0xD4, 0xFC, 0x7F, 0xE9, 0x6D, 0xF9, 0xAE, 0xC2, + 0x7B, 0x45, 0x32, 0x7D, 0x29, 0x22, 0xB2, 0xF3, 0x7D, 0x08, 0x37, 0x49, + 0x0C, 0xB7, 0xC4, 0x0E, 0xE7, 0x6C, 0x1E, 0xA7, 0xBE, 0x75, 0x4E, 0x4C, + 0x1A, 0xBD, 0x2F, 0xC6, 0x70, 0xD7, 0x38, 0xAE, 0x61, 0x3C, 0x01, 0xEB, + 0x07, 0x25, 0xEA, 0x45, 0x21, 0x06, 0x99, 0xBF, 0xD0, 0xAC, 0xD1, 0xDB, + 0x69, 0xF4, 0x64, 0x9F, 0xEB, 0xB3, 0xCF, 0xD8, 0xB1, 0x90, 0xAA, 0xAF, + 0x80, 0x50, 0xA0, 0x92, 0xBA, 0x7E, 0xA2, 0x7B, 0x2D, 0x13, 0x7E, 0x9F, + 0x4F, 0xFD, 0x0F, 0x40, 0xEC, 0x2D, 0x0E, 0x85, 0xB7, 0xDA, 0x01, 0x64, + 0x95, 0x95, 0x66, 0x91, 0x15, 0x3F, 0x09, 0x77, 0xAC, 0xBF, 0x0D, 0x6F, + 0x7C, 0xC1, 0xB7, 0x5F, 0xBD, 0xDA, 0xE9, 0xF7, 0xCC, 0x83, 0x17, 0x3B, + 0x14, 0x20, 0x81, 0xE5, 0x9A, 0xA5, 0x4A, 0x40, 0xD7, 0x4A, 0x7A, 0x94, + 0xE1, 0x6F, 0x3B, 0x27, 0xEA, 0x13, 0x7E, 0x5E, 0xE7, 0x4D, 0x96, 0xF1, + 0x47, 0x8F, 0xD4, 0x79, 0x3D, 0x98, 0xD7, 0xCD, 0x3C, 0x35, 0x3A, 0x3F, + 0x54, 0x3A, 0x48, 0x73, 0x66, 0xC3, 0xFD, 0x11, 0x87, 0x76, 0x0C, 0xF0, + 0xC5, 0x08, 0x97, 0xA6, 0xC5, 0x88, 0x3F, 0x4F, 0xC7, 0x32, 0x72, 0x5C, + 0xD4, 0x17, 0x8D, 0x45, 0x91, 0x62, 0xB2, 0xC3, 0x4A, 0xA4, 0x58, 0x88, + 0x5C, 0x9C, 0xB5, 0x72, 0xFE, 0xE9, 0xB7, 0x73, 0x55, 0x7B, 0xD5, 0x91, + 0x66, 0x02, 0x4C, 0xF7, 0x11, 0x77, 0x9D, 0x68, 0x4E, 0x1A, 0xC5, 0x6B, + 0xB9, 0x0A, 0xC3, 0x7F, 0xB0, 0x48, 0x87, 0xC4, 0xC9, 0x29, 0x73, 0x1A, + 0x25, 0xDA, 0x46, 0x3E, 0x10, 0x02, 0x9A, 0xCE, 0x23, 0xD9, 0x77, 0xC6, + 0x0D, 0xA3, 0xD5, 0xF8, 0x6B, 0xE2, 0x10, 0x90, 0x01, 0xE7, 0xF7, 0xAF, + 0x35, 0x59, 0x8D, 0x1D, 0xA7, 0x3B, 0xD2, 0x5A, 0x33, 0x33, 0xAF, 0xB0, + 0xAC, 0xD1, 0x2A, 0x43, 0x79, 0x13, 0x5C, 0x2A, 0x55, 0x37, 0x52, 0xA1, + 0x69, 0x17, 0x7F, 0xE9, 0x7C, 0xD7, 0x6D, 0x43, 0x57, 0xC3, 0x1B, 0x2E, + 0x5D, 0xA0, 0x5B, 0x3D, 0x75, 0x4E, 0xF4, 0xA1, 0x24, 0xDE, 0x50, 0x18, + 0x90, 0xB9, 0x89, 0xF1, 0x47, 0x4C, 0x61, 0xDB, 0xD8, 0xF0, 0x66, 0xD6, + 0x1F, 0xB3, 0x9F, 0x91, 0x4D, 0x91, 0xFD, 0x6E, 0xB9, 0x4B, 0x47, 0xC9, + 0xF6, 0x48, 0x07, 0xFB, 0xC6, 0x64, 0x48, 0x33, 0x5F, 0x92, 0x19, 0x22, + 0xB7, 0x69, 0xE2, 0x9D, 0x69, 0x02, 0xE7, 0x47, 0x97, 0xAC, 0x52, 0xAA, + 0xB6, 0x50, 0xC7, 0x9B, 0x16, 0x29, 0x15, 0x1F, 0x12, 0x46, 0xE0, 0xC0, + 0x3F, 0xA9, 0xB0, 0x30, 0x47, 0xE7, 0x6F, 0x73, 0x62, 0xB0, 0xD6, 0x50, + 0x20, 0x40, 0x47, 0x4C, 0x5D, 0x5C, 0xA1, 0xBA, 0x05, 0x8E, 0x06, 0x22, + 0xEA, 0xDF, 0x4C, 0x52, 0xFE, 0x21, 0x72, 0x6B, 0xD4, 0xB1, 0xEF, 0x38, + 0x74, 0xF5, 0xB3, 0x4D, 0x38, 0x91, 0x5F, 0x21, 0x74, 0x4B, 0x18, 0x27, + 0xBD, 0x70, 0x4A, 0x6A, 0xBD, 0x62, 0x2A, 0xEE, 0xCE, 0xAE, 0x6B, 0x23, + 0xA2, 0x97, 0x7E, 0x06, 0x24, 0xAE, 0x09, 0xD6, 0xC3, 0xEE, 0x10, 0x6D, + 0x8D, 0x04, 0xF2, 0xAE, 0x09, 0x10, 0xB0, 0x54, 0xD0, 0x1C, 0x84, 0x55, + 0xCF, 0xED, 0xFD, 0xB8, 0xDE, 0xF5, 0xA4, 0x5B, 0xFA, 0x7D, 0x7C, 0xAC, + 0xC0, 0x85, 0x48, 0xB2, 0x05, 0x45, 0x05, 0x36, 0xDD, 0x9A, 0xD9, 0x43, + 0x75, 0x94, 0xAF, 0xD5, 0xDF, 0x70, 0xE4, 0x7D, 0x37, 0x49, 0x0E, 0xE6, + 0xD1, 0xC2, 0x1A, 0xBD, 0xCD, 0xC6, 0xD8, 0xC5, 0xAA, 0xD8, 0x90, 0x6E, + 0xD7, 0x5D, 0xA4, 0x6B, 0x19, 0xB1, 0x7A, 0x18, 0xF1, 0x29, 0x4D, 0x20, + 0xF7, 0x7A, 0x7F, 0x7C, 0xE6, 0x8A, 0x54, 0x05, 0xB7, 0xA0, 0xD9, 0x32, + 0xDB, 0x53, 0xF6, 0x48, 0x65, 0x89, 0x86, 0x5B, 0x85, 0x7F, 0x11, 0x61, + 0x0A, 0x99, 0xBE, 0x01, 0x56, 0xA3, 0xA7, 0x3A, 0xE6, 0xAB, 0xDF, 0x6B, + 0xB4, 0x11, 0x24, 0xFC, 0x36, 0x30, 0x8C, 0x85, 0x06, 0xFB, 0x0C, 0xB9, + 0xB2, 0x50, 0x51, 0xF8, 0xDD, 0x3B, 0xB3, 0xC7, 0x4E, 0x7A, 0x4A, 0x8E, + 0x42, 0x01, 0xCB, 0xA9, 0xE5, 0x21, 0xD5, 0xDF, 0x8E, 0x59, 0x53, 0x82, + 0xA8, 0xA0, 0x25, 0x9F, 0xCE, 0x99, 0x17, 0x9F, 0xC6, 0xD7, 0xDB, 0x67, + 0xA7, 0x72, 0xC8, 0x22, 0x43, 0x32, 0x8E, 0x75, 0xE7, 0x29, 0xAC, 0x7A, + 0x0A, 0x95, 0xC3, 0x32, 0xA9, 0x56, 0xE6, 0xD7, 0xFE, 0x29, 0xC1, 0x5C, + 0x02, 0xB6, 0xD7, 0x16, 0x06, 0xC7, 0x86, 0x33, 0x68, 0x41, 0x64, 0xAE, + 0x1D, 0xD6, 0xEC, 0x9F, 0x4D, 0x2A, 0x79, 0x01, 0xDB, 0x48, 0x52, 0xB7, + 0x62, 0x36, 0x2B, 0x47, 0x2C, 0x0C, 0x9F, 0x10, 0xB0, 0x16, 0x34, 0x13, + 0xAA, 0xF8, 0x18, 0xC5, 0xAA, 0xAF, 0x57, 0x03, 0xC9, 0x48, 0xE4, 0x75, + 0x94, 0xCB, 0xDA, 0xC2, 0xDF, 0xDE, 0x92, 0x23, 0x1E, 0x07, 0xF8, 0x04, + 0xFC, 0x90, 0x34, 0xCE, 0xC3, 0x9C, 0x87, 0xBF, 0xA6, 0x45, 0x1B, 0xFC, + 0x73, 0x2B, 0xF8, 0x4E, 0x96, 0x82, 0xDA, 0xE8, 0x98, 0x87, 0x0D, 0x37, + 0xCD, 0xD1, 0x3E, 0x31, 0x15, 0x72, 0x87, 0x3B, 0x67, 0xAF, 0x5D, 0x0B, + 0x88, 0xFF, 0x44, 0xC1, 0xAB, 0xD1, 0x1E, 0x5F, 0xE6, 0x8B, 0xAD, 0x0F, + 0x95, 0xFC, 0x9F, 0x8F, 0x91, 0xED, 0x36, 0xE2, 0xD6, 0x2E, 0xC3, 0x2D, + 0x9E, 0x80, 0x6A, 0x78, 0x4A, 0xCA, 0x04, 0xCD, 0x64, 0x73, 0x7A, 0x81, + 0x2D, 0x45, 0x53, 0xC8, 0xED, 0x68, 0x74, 0x36, 0x85, 0x83, 0xD9, 0x6F, + 0x8C, 0xAF, 0xEC, 0xE5, 0xC1, 0xF1, 0x65, 0x0C, 0x45, 0xB4, 0xE7, 0xD1, + 0xF8, 0x3C, 0xAA, 0xF3, 0x1E, 0xC7, 0x99, 0x78, 0x13, 0xC9, 0x55, 0x2B, + 0xA8, 0x5C, 0x24, 0xE2, 0xDF, 0x43, 0x46, 0x09, 0xAD, 0xAB, 0x1D, 0xED, + 0xAA, 0xE0, 0xE6, 0x09, 0xE2, 0x52, 0xE0, 0x5E, 0x78, 0xF8, 0x26, 0x88, + 0x66, 0xB9, 0x98, 0x68, 0x52, 0x7A, 0xB4, 0xDF, 0x34, 0xAA, 0xF6, 0x1A, + 0x4C, 0x3D, 0x36, 0x8D, 0xB7, 0x05, 0x5B, 0x0B, 0x00, 0xF8, 0x3B, 0xDD, + 0x95, 0xB7, 0x47, 0x3A, 0xB0, 0x5A, 0x0A, 0xA8, 0x85, 0x17, 0xCB, 0x4E, + 0x92, 0x47, 0x72, 0x92, 0x73, 0x6A, 0xAB, 0xB5, 0x7D, 0x99, 0xBC, 0x8B, + 0xAC, 0x1B, 0xE8, 0x1A, 0xE6, 0x32, 0x11, 0x79, 0x2C, 0x6B, 0x88, 0x56, + 0x70, 0x41, 0xED, 0xC3, 0x7E, 0x0A, 0xA8, 0xDF, 0xCA, 0xA8, 0xD4, 0x3E, + 0x1A, 0xE0, 0x9E, 0x6D, 0x7C, 0xBD, 0x32, 0xB1, 0x7F, 0x7D, 0x32, 0x18, + 0x4D, 0x18, 0x5E, 0xF3, 0x19, 0x30, 0xCA, 0x8C, 0x66, 0xB5, 0x77, 0x57, + 0x5B, 0x98, 0x8F, 0x6D, 0x6B, 0x2D, 0x8D, 0xC4, 0x0B, 0x76, 0xE0, 0x37, + 0x42, 0x02, 0xC4, 0x61, 0xFE, 0x43, 0x5F, 0x41, 0xA7, 0x40, 0x64, 0x45, + 0xD6, 0x09, 0x99, 0x3F, 0x95, 0x73, 0x0D, 0x9F, 0xC4, 0xBE, 0x22, 0x2A, + 0xE5, 0x4C, 0xAD, 0x32, 0xC2, 0xF3, 0x49, 0xC4, 0xCF, 0x9C, 0xD1, 0x63, + 0x3E, 0xBA, 0xD3, 0x9B, 0x24, 0x2F, 0x52, 0xF3, 0xBA, 0x21, 0x2E, 0xEC, + 0xDF, 0x8D, 0xAD, 0x3F, 0xF3, 0xE1, 0x23, 0x8C, 0x0D, 0x76, 0xDD, 0xCB, + 0x36, 0xB9, 0x7A, 0x13, 0x78, 0xB2, 0x6D, 0xDB, 0x16, 0xAD, 0x2A, 0x94, + 0xAC, 0xF9, 0x86, 0x8B, 0x2D, 0x75, 0x33, 0x86, 0x43, 0x18, 0xCF, 0x65, + 0x4F, 0x08, 0x22, 0x88, 0x6E, 0x38, 0xBF, 0xF7, 0x12, 0x3F, 0x8A, 0xC3, + 0x49, 0xA0, 0xC6, 0x03, 0xAB, 0x1C, 0xD5, 0x3D, 0xA2, 0x43, 0xFF, 0x93, + 0xD4, 0x80, 0xDA, 0xDC, 0x77, 0x6D, 0xF8, 0xE1, 0xD3, 0x88, 0xA4, 0xCF, + 0x82, 0xE0, 0x08, 0xB2, 0x6E, 0x98, 0xBA, 0x6C, 0x0A, 0x84, 0xA0, 0x94, + 0x51, 0xFE, 0x17, 0x96, 0xF1, 0xBC, 0xD0, 0xFB, 0x6B, 0x50, 0x13, 0xA6, + 0x8E, 0x42, 0xFA, 0x01, 0x8C, 0xF4, 0x04, 0x02, 0xB1, 0xA8, 0x53, 0x5D, + 0x9B, 0x15, 0x48, 0xC3, 0x81, 0xCB, 0xAF, 0x4B, 0x4E, 0x61, 0xB6, 0x86, + 0x5C, 0xB1, 0x83, 0x44, 0x5C, 0xB9, 0x3F, 0x31, 0x84, 0xEF, 0x75, 0x20, + 0x66, 0x4C, 0x77, 0x66, 0x73, 0x04, 0x45, 0xB8, 0xE7, 0xBD, 0x14, 0xF9, + 0x93, 0xC7, 0x17, 0x60, 0xE5, 0x63, 0xAE, 0x6A, 0xD6, 0x99, 0xCD, 0x10, + 0x4F, 0x6B, 0xC1, 0x44, 0x63, 0x37, 0x79, 0x9C, 0x9C, 0xAA, 0xBC, 0x64, + 0x19, 0x61, 0xB5, 0xC1, 0x52, 0x09, 0x6E, 0x6B, 0x6B, 0x90, 0x8B, 0xA6, + 0x23, 0xDC, 0xE4, 0xE1, 0xB4, 0x82, 0x47, 0x11, 0x86, 0x9B, 0x9F, 0xE0, + 0x24, 0xC0, 0x19, 0xAE, 0x7D, 0x9A, 0x8C, 0x49, 0x6C, 0x42, 0x6D, 0x4E, + 0x1F, 0xC7, 0x66, 0x20, 0x19, 0xCA, 0xA0, 0xF0, 0x44, 0x1A, 0x61, 0x1E, + 0x67, 0x58, 0x4B, 0xA4, 0x15, 0x8F, 0x26, 0x2C, 0xAC, 0xE8, 0xBA, 0x1D, + 0x33, 0x77, 0x22, 0x83, 0xBB, 0xE1, 0x18, 0xBD, 0x45, 0x1A, 0xB4, 0x9F, + 0x4F, 0x1F, 0x80, 0xE8, 0x99, 0x14, 0xB2, 0x1C, 0x1E, 0x4E, 0xBB, 0x04, + 0xD6, 0x57, 0x50, 0x6F, 0x79, 0x60, 0xAA, 0xC1, 0xFD, 0x5D, 0xC7, 0x72, + 0xA7, 0xBC, 0xD0, 0x29, 0x29, 0x32, 0xD9, 0xDF, 0x9D, 0xF4, 0xC6, 0xF6, + 0x54, 0x67, 0xF4, 0x16, 0x3C, 0xB7, 0xA9, 0x06, 0x9D, 0xDC, 0xD9, 0x69, + 0x4C, 0xD7, 0xC2, 0x8B, 0xF7, 0x7E, 0xAD, 0x7E, 0xD8, 0xC7, 0x23, 0x90, + 0x1F, 0xD6, 0xC4, 0xD3, 0xBB, 0xD4, 0x57, 0x35, 0xF6, 0xD3, 0x52, 0x32, + 0x18, 0x20, 0xEC, 0x33, 0x97, 0x01, 0xB5, 0x91, 0x7C, 0xCF, 0xB4, 0x6B, + 0x55, 0x0C, 0x5C, 0x73, 0xE9, 0x8D, 0x9E, 0xDD, 0xCF, 0xF8, 0xDF, 0xB8, + 0x21, 0x13, 0x62, 0x2B, 0x66, 0x6E, 0x76, 0x03, 0x04, 0x75, 0xAA, 0x56, + 0xDF, 0x91, 0x5F, 0x26, 0x9B, 0xF9, 0x72, 0x25, 0x81, 0x63, 0x5B, 0xFE, + 0xE4, 0x2A, 0x8E, 0x14, 0x03, 0xFD, 0x8D, 0x23, 0x35, 0x82, 0x64, 0x70, + 0x30, 0x91, 0x3F, 0xBB, 0x19, 0x2C, 0x04, 0x9E, 0x44, 0xDC, 0x79, 0x9A, + 0x7B, 0x69, 0x52, 0x08, 0xC3, 0x9E, 0x2A, 0xB9, 0x02, 0xD4, 0x19, 0xF2, + 0x3A, 0x4A, 0x4C, 0x47, 0x08, 0x38, 0x4B, 0x2E, 0x75, 0xF8, 0x86, 0x7C, + 0x09, 0x72, 0xEC, 0xB2, 0xAC, 0x9C, 0xEC, 0x42, 0x5C, 0x61, 0x7F, 0xD8, + 0x24, 0x05, 0x88, 0x55, 0x3D, 0xB7, 0x79, 0x90, 0x73, 0x7D, 0x0A, 0x10, + 0xF5, 0xB3, 0x5C, 0xC8, 0x8D, 0x5E, 0x59, 0x51, 0xD2, 0xDB, 0x4E, 0x5D, + 0x4B, 0x39, 0x16, 0x14, 0xF2, 0xA2, 0x75, 0x28, 0x66, 0x45, 0xBF, 0x73, + 0x60, 0xD3, 0xFD, 0x53, 0xDA, 0x8D, 0x5C, 0x94, 0x2E, 0x91, 0x14, 0xE2, + 0xAA, 0xEF, 0x93, 0x82, 0x68, 0x0A, 0x69, 0x1F, 0xE2, 0x10, 0x26, 0xEB, + 0x69, 0xD6, 0x35, 0x9B, 0x62, 0x05, 0x97, 0x7D, 0x04, 0x6D, 0x6C, 0x22, + 0x3E, 0x7C, 0xAB, 0x13, 0xC0, 0xEF, 0x4C, 0xE1, 0x96, 0x5B, 0xB7, 0xA3, + 0x80, 0xC2, 0x89, 0x1A, 0x2F, 0x47, 0x0B, 0xD9, 0x76, 0x6C, 0xD3, 0x03, + 0x08, 0xA3, 0x8E, 0x9B, 0xAE, 0xA1, 0x55, 0x73, 0x7B, 0x9F, 0xAE, 0x40, + 0xB6, 0x0C, 0x0A, 0x8A, 0x83, 0x7A, 0x88, 0x6B, 0x3E, 0xD7, 0x98, 0x7F, + 0x43, 0x40, 0x01, 0xE4, 0x3A, 0xFF, 0x26, 0xEC, 0x91, 0x68, 0x71, 0xD8, + 0x84, 0x18, 0xC1, 0xD5, 0xAB, 0xA2, 0xBB, 0xCC, 0xEA, 0x43, 0x79, 0x73, + 0x97, 0x4C, 0x9B, 0x03, 0xD0, 0x10, 0x7C, 0x09, 0x84, 0x32, 0x04, 0x0A, + 0x35, 0xA6, 0x29, 0xAB, 0x6E, 0x26, 0x9A, 0xCF, 0x49, 0x8F, 0x15, 0xC2, + 0xAC, 0x56, 0xD6, 0x82, 0xB9, 0x3C, 0xD2, 0xDD, 0x68, 0xB7, 0x43, 0xBC, + 0xBC, 0xFD, 0xA4, 0xC5, 0xCE, 0x5C, 0xC0, 0xD3, 0x93, 0xD6, 0x40, 0xAF, + 0xDA, 0x23, 0x55, 0x83, 0x3A, 0xE6, 0x6C, 0x64, 0xA0, 0x37, 0xC0, 0x47, + 0xBA, 0xAA, 0x62, 0x79, 0x56, 0x85, 0x55, 0xC1, 0xEA, 0x80, 0xD5, 0x3C, + 0xBB, 0x9F, 0x89, 0xEA, 0x45, 0xFC, 0x59, 0x6C, 0x26, 0xF0, 0x07, 0x72, + 0x31, 0xCC, 0x5F, 0x8F, 0xA5, 0x61, 0x20, 0x16, 0x55, 0x4D, 0x87, 0x72, + 0x13, 0xE6, 0xA9, 0xB3, 0xAF, 0xBD, 0x42, 0x08, 0x39, 0xD5, 0xCF, 0x81, + 0xCA, 0x5E, 0xD0, 0xAB, 0x77, 0xB0, 0x05, 0x7E, 0x73, 0x87, 0xFE, 0xF4, + 0xA7, 0x7F, 0x00, 0xBE, 0xF9, 0x67, 0x83, 0x64, 0x61, 0x19, 0x4F, 0x23, + 0x21, 0xD9, 0x37, 0xB7, 0x54, 0xD3, 0x2F, 0x0C, 0x39, 0xD2, 0xA4, 0x78, + 0xFD, 0x3C, 0x9F, 0x5C, 0xC5, 0x16, 0x55, 0x9B, 0xBB, 0x96, 0x72, 0x13, + 0x1D, 0xCC, 0xAF, 0xB4, 0xC1, 0xEB, 0x7D, 0xF9, 0xA1, 0x37, 0x93, 0x13, + 0xC3, 0xDB, 0x58, 0xF8, 0x7C, 0xFB, 0x2E, 0x91, 0x7B, 0x6D, 0x21, 0xE2, + 0xCE, 0xB1, 0xAF, 0x8A, 0x55, 0x25, 0x5A, 0x08, 0x35, 0xAD, 0xF6, 0x1E, + 0x54, 0x56, 0xB9, 0x52, 0xA8, 0x9F, 0x9F, 0x06, 0x9B, 0x30, 0x7B, 0x5F, + 0x25, 0x13, 0x7C, 0xD4, 0xA7, 0x56, 0xE3, 0x48, 0x55, 0x40, 0xB8, 0x3E, + 0x11, 0x7B, 0x81, 0x89, 0x2E, 0x40, 0x76, 0x1D, 0x4C, 0x30, 0xCF, 0xBE, + 0xA6, 0x66, 0x25, 0x69, 0x9B, 0xE7, 0x85, 0x36, 0x71, 0x45, 0xD4, 0x54, + 0x24, 0x3B, 0x2D, 0x16, 0x9B, 0xD6, 0xE6, 0x91, 0x13, 0x53, 0x6E, 0x56, + 0x21, 0xB6, 0x3C, 0x12, 0x23, 0x20, 0xC9, 0xB7, 0xDD, 0xF1, 0x04, 0x1C, + 0x49, 0x58, 0x44, 0x97, 0x4A, 0x21, 0x36, 0x0C, 0x7D, 0xDE, 0x3F, 0x2F, + 0xE6, 0x8E, 0x05, 0x42, 0x28, 0x2A, 0xA5, 0x0F, 0xF1, 0x31, 0x7B, 0x9A, + 0x1B, 0x36, 0x40, 0x48, 0xC3, 0xC4, 0x59, 0x8F, 0xFF, 0x82, 0x2F, 0xE2, + 0x75, 0xEF, 0x54, 0x39, 0x31, 0xC8, 0x5F, 0xD2, 0xDA, 0x74, 0x50, 0x47, + 0x45, 0x16, 0xC9, 0xF8, 0x2B, 0xAE, 0x07, 0x6B, 0x18, 0xF6, 0x22, 0x1F, + 0xF4, 0x39, 0x6D, 0x13, 0x83, 0x0C, 0xCB, 0xF3, 0x12, 0x1B, 0xB4, 0x27, + 0xB6, 0xB1, 0x67, 0x79, 0x29, 0xD7, 0xAF, 0x00, 0xF1, 0xE4, 0x14, 0xB4, + 0xA1, 0x95, 0x54, 0x47, 0x19, 0x7B, 0xB0, 0xF6, 0x81, 0x42, 0x94, 0xE4, + 0xD3, 0xA3, 0x9D, 0x74, 0xE5, 0x93, 0xEE, 0x02, 0x5A, 0x44, 0x9F, 0x25, + 0xCB, 0xB2, 0x8E, 0xEE, 0xD8, 0xE7, 0x02, 0x5D, 0x83, 0x94, 0x68, 0xDD, + 0xA4, 0x3E, 0x6A, 0x86, 0xE6, 0x2E, 0xFC, 0x1C, 0xC5, 0xAE, 0x91, 0x7D, + 0x34, 0x12, 0xD5, 0x10, 0xD8, 0x4E, 0x34, 0x18, 0x6B, 0x72, 0x0D, 0x8F, + 0x28, 0x17, 0xE2, 0x81, 0xD6, 0xE4, 0x70, 0xBB, 0x20, 0x0C, 0xE9, 0xA9, + 0x65, 0xEC, 0xDC, 0x80, 0x41, 0x13, 0xB4, 0x53, 0x67, 0x1F, 0xF4, 0xB0, + 0xA6, 0x4D, 0xB1, 0x43, 0x29, 0x00, 0xAD, 0x51, 0xE8, 0x4C, 0x6A, 0x62, + 0x8B, 0xB9, 0xEE, 0x05, 0x53, 0xE5, 0xBE, 0xCC, 0xDD, 0x08, 0xA9, 0x89, + 0x84, 0x04, 0xF3, 0xC4, 0xA9, 0x4E, 0x40, 0x18, 0xE4, 0xF8, 0xEC, 0xB0, + 0xF4, 0x7B, 0x69, 0x6D, 0xD1, 0xB3, 0x5F, 0x53, 0x85, 0x14, 0xF5, 0xC9, + 0xBE, 0x9D, 0x8E, 0x7B, 0x9A, 0x8C, 0x77, 0xA2, 0xD6, 0x97, 0xA3, 0x35, + 0x48, 0x47, 0x93, 0x5C, 0x2D, 0xB7, 0xBA, 0x80, 0xC0, 0xB5, 0xD5, 0x24, + 0x40, 0xA8, 0xB6, 0xA6, 0x4E, 0x4C, 0x4C, 0xE8, 0x60, 0xE4, 0xF7, 0xDC, + 0x24, 0xD9, 0x0F, 0x3C, 0xC7, 0x86, 0xC9, 0xEB, 0xEA, 0xD9, 0xDC, 0x12, + 0x50, 0x30, 0xB2, 0x7D, 0x28, 0x2E, 0x9D, 0x7C, 0xC3, 0x72, 0x6D, 0x22, + 0x40, 0x81, 0x1A, 0x5B, 0xED, 0x16, 0xDD, 0x6D, 0x15, 0x83, 0xD1, 0xC6, + 0x35, 0xBD, 0x11, 0x1F, 0x0F, 0x60, 0x89, 0x22, 0xCD, 0x63, 0x39, 0x42, + 0x2B, 0x05, 0xE5, 0x40, 0x89, 0xC3, 0x64, 0xBC, 0xB2, 0x7B, 0x1E, 0xBF, + 0x37, 0x68, 0x0A, 0x82, 0xD8, 0x71, 0x10, 0xE7, 0xD3, 0xEB, 0xF9, 0x24, + 0xBD, 0x5F, 0x62, 0x7F, 0xAA, 0xF0, 0x5B, 0xE5, 0x75, 0xCB, 0x84, 0xA4, + 0x66, 0x78, 0x80, 0xE4, 0xD5, 0x04, 0x02, 0xE4, 0xE6, 0x79, 0x67, 0xC2, + 0x79, 0x92, 0x3C, 0x32, 0x8C, 0xB6, 0x1D, 0x21, 0xDB, 0xB8, 0x91, 0x88, + 0x76, 0xBD, 0x20, 0x30, 0x8A, 0x87, 0x49, 0x7F, 0x54, 0x32, 0x95, 0x3D, + 0x1F, 0x44, 0xDE, 0xA0, 0xE6, 0x4D, 0x00, 0xE9, 0x1F, 0x12, 0x49, 0x2A, + 0x73, 0x58, 0x55, 0xB2, 0x22, 0x36, 0x46, 0x37, 0x6E, 0x89, 0xCF, 0x8E, + 0x17, 0x91, 0x8C, 0xD3, 0xAE, 0x40, 0x75, 0x66, 0xAA, 0xAD, 0x37, 0x77, + 0x00, 0x9B, 0x56, 0x98, 0x52, 0x1F, 0x41, 0x01, 0x60, 0x6A, 0x3D, 0xB1, + 0x07, 0x5F, 0x57, 0x72, 0xE6, 0x69, 0x0B, 0x93, 0xE7, 0x1B, 0xB1, 0x54, + 0x26, 0xB0, 0x52, 0xA1, 0xB1, 0x0A, 0x1A, 0x59, 0xBD, 0xA5, 0x70, 0x98, + 0x21, 0xCD, 0x09, 0x35, 0x1A, 0x29, 0x03, 0x10, 0xAC, 0x40, 0x90, 0x47, + 0xFB, 0xA3, 0x07, 0xB4, 0x43, 0xCC, 0x37, 0x14, 0xC9, 0xA8, 0xD4, 0x5A, + 0xD0, 0x70, 0xF9, 0x85, 0xAC, 0xF3, 0xFA, 0xA5, 0x5A, 0x9A, 0xF1, 0xC3, + 0x54, 0xDC, 0xE1, 0x00, 0x2D, 0xD6, 0xCF, 0x7A, 0x02, 0x87, 0x8B, 0x49, + 0x6C, 0x19, 0xF4, 0x68, 0xDE, 0x5F, 0x11, 0x91, 0xF1, 0x7A, 0xF2, 0x34, + 0xA5, 0xDF, 0x42, 0x01, 0x2E, 0x2F, 0x12, 0x91, 0xA9, 0x5E, 0x23, 0x6E, + 0xFC, 0x1C, 0x96, 0xFA, 0xE8, 0xBB, 0x4A, 0x42, 0x7F, 0xB7, 0xEE, 0x12, + 0x3C, 0x25, 0xDB, 0x7B, 0x95, 0xED, 0xF6, 0xAB, 0xBC, 0x59, 0xE4, 0xF3, + 0x15, 0x71, 0xAB, 0xAB, 0x1B, 0x27, 0x6B, 0x48, 0x44, 0x52, 0xC3, 0xA3, + 0xB0, 0xC1, 0x49, 0xCE, 0x74, 0xD9, 0x9D, 0xC8, 0xAC, 0x71, 0xB5, 0xB9, + 0x1B, 0xA6, 0xD3, 0xF9, 0x84, 0x30, 0xAE, 0x9E, 0x69, 0x31, 0xB8, 0xB4, + 0x64, 0xE8, 0xD9, 0x47, 0xBD, 0x63, 0xB5, 0x25, 0x30, 0x1A, 0xD7, 0xB2, + 0xC0, 0xBD, 0x75, 0x30, 0x55, 0x02, 0x5B, 0xC6, 0xE6, 0x63, 0x69, 0x65, + 0xAF, 0xE7, 0x7B, 0xAB, 0x5D, 0xA6, 0xA5, 0xC4, 0xAF, 0xDE, 0xAC, 0x67, + 0x1E, 0x7F, 0x73, 0x55, 0x2C, 0x33, 0x25, 0x83, 0x24, 0x3F, 0xB0, 0x48, + 0xFC, 0x08, 0xB9, 0x60, 0xBB, 0xFB, 0x3D, 0xFD, 0xA3, 0xF6, 0xF2, 0x1B, + 0x89, 0x82, 0x87, 0xD1, 0x10, 0xE5, 0xBD, 0xEF, 0x16, 0xA7, 0x3F, 0x15, + 0x32, 0x11, 0x50, 0xB9, 0x7D, 0x77, 0x15, 0x0F, 0xBA, 0xFE, 0x76, 0x0A, + 0x4F, 0xF2, 0xA0, 0xFB, 0x2D, 0xF1, 0xCE, 0x5E, 0xE7, 0x50, 0x6A, 0xA0, + 0xB2, 0xB4, 0xEE, 0x2B, 0xD5, 0x3B, 0x03, 0x07, 0xB0, 0x40, 0x4A, 0x26, + 0xF4, 0x3E, 0x1F, 0xC4, 0x58, 0x80, 0x8A, 0x3B, 0x00, 0x52, 0x2B, 0x53, + 0xBF, 0xD4, 0x8F, 0xEE, 0x6D, 0xA4, 0x0D, 0xF7, 0x82, 0xF8, 0x53, 0xDA, + 0xF6, 0x53, 0xAF, 0xF8, 0xD2, 0xD8, 0xFB, 0x1F, 0x2D, 0x98, 0x87, 0xDA, + 0x19, 0xAC, 0x48, 0x6B, 0xEA, 0xDE, 0x08, 0xA6, 0x13, 0x37, 0x1B, 0x2C, + 0x15, 0x60, 0xB2, 0xDB, 0x28, 0x0E, 0x2E, 0xA3, 0x4A, 0xB1, 0xF2, 0x5C, + 0x48, 0x69, 0x46, 0xFA, 0x08, 0x9F, 0xE9, 0x65, 0x2F, 0x3A, 0x29, 0xB0, + 0x88, 0xB5, 0x13, 0x44, 0x41, 0x92, 0x30, 0x74, 0x9C, 0x9C, 0xD8, 0xC8, + 0xB1, 0x59, 0x42, 0x67, 0xAC, 0xC8, 0x0D, 0xFF, 0x8E, 0x52, 0x4C, 0xED, + 0x86, 0xFF, 0x4E, 0x45, 0xBE, 0xC4, 0xAF, 0x32, 0xE4, 0xBC, 0x41, 0xC5, + 0xDC, 0x3F, 0x71, 0x8C, 0x2C, 0xAD, 0x78, 0x7E, 0x79, 0x47, 0xB2, 0x02, + 0xA6, 0x11, 0xDE, 0x0F, 0x5D, 0xAD, 0xFE, 0x8D, 0x6B, 0x09, 0xEA, 0x28, + 0x4B, 0xB1, 0x9F, 0xD3, 0x09, 0x4A, 0x77, 0x52, 0x58, 0xA2, 0x31, 0xC1, + 0x48, 0xF1, 0x35, 0x48, 0x46, 0x93, 0xDB, 0x22, 0xFD, 0x06, 0x49, 0xEB, + 0x22, 0xE8, 0xB3, 0x9C, 0xCF, 0x40, 0x8B, 0xC7, 0x35, 0x07, 0xBD, 0x2C, + 0x21, 0xFB, 0x15, 0x53, 0x38, 0x0B, 0x61, 0x10, 0x75, 0x11, 0x17, 0x1F, + 0xE1, 0x76, 0x10, 0x53, 0x66, 0x2E, 0x36, 0x65, 0xF6, 0x62, 0x19, 0xAC, + 0x68, 0x63, 0x1D, 0x17, 0x6C, 0x49, 0x6C, 0xA8, 0x40, 0x49, 0xFC, 0xBA, + 0x63, 0x25, 0x5E, 0x79, 0x07, 0x10, 0xC3, 0x3C, 0xC5, 0x81, 0x14, 0xBB, + 0xCD, 0xC3, 0x63, 0x36, 0x9F, 0xB9, 0x68, 0x54, 0x8D, 0x31, 0x66, 0xC8, + 0xF7, 0x4A, 0xA0, 0x68, 0x8A, 0xCC, 0xE2, 0xB8, 0x50, 0x88, 0x7B, 0xFF, + 0x38, 0xE0, 0x8B, 0x90, 0x0C, 0x98, 0xF1, 0xC5, 0x5F, 0xFA, 0x2A, 0x37, + 0x6A, 0x3C, 0x39, 0xC0, 0xF1, 0x29, 0x0F, 0xC1, 0xA6, 0xCE, 0xCC, 0x98, + 0xD7, 0x9C, 0xAE, 0x71, 0xAB, 0xFE, 0xA1, 0xC6, 0x0E, 0xF7, 0xE7, 0x60, + 0x9B, 0x63, 0x50, 0x00, 0x8B, 0x1A, 0xC4, 0xF2, 0xDB, 0xFF, 0xCB, 0xC8, + 0xDC, 0x23, 0x49, 0xA9, 0xFB, 0xF3, 0x1A, 0x09, 0xA5, 0x27, 0xD5, 0x18, + 0x4C, 0x84, 0x2E, 0x6E, 0x56, 0x39, 0x3F, 0xD3, 0x08, 0xDE, 0x76, 0x90, + 0xC1, 0x43, 0x33, 0x32, 0xF8, 0x76, 0x59, 0x48, 0x14, 0xCD, 0x2E, 0x19, + 0xDF, 0x8B, 0x72, 0xAF, 0xB2, 0x2F, 0xD9, 0x5C, 0x5C, 0x87, 0x8C, 0x3A, + 0x66, 0x86, 0xBD, 0xEA, 0x82, 0xFC, 0x36, 0xFA, 0x05, 0xE8, 0xE0, 0x07, + 0x53, 0xD8, 0x68, 0xD4, 0x86, 0x3A, 0xA4, 0x64, 0xD5, 0x13, 0x16, 0x3F, + 0x9B, 0x1D, 0x60, 0x3A, 0x46, 0xAF, 0x99, 0x89, 0xBF, 0x1A, 0xD2, 0x45, + 0xF8, 0xD7, 0x86, 0x6E, 0x0C, 0x3A, 0xCD, 0x69, 0x05, 0x1A, 0x07, 0x7D, + 0x52, 0x96, 0xE1, 0xB6, 0x84, 0xE9, 0x63, 0x5B, 0x3D, 0xEE, 0xF6, 0xDC, + 0x8A, 0xE2, 0xDC, 0xFA, 0xDD, 0xD6, 0x5F, 0xA3, 0x17, 0xD3, 0xE6, 0x3C, + 0xC6, 0xEE, 0x7C, 0x84, 0x6F, 0x82, 0x9A, 0x01, 0xF7, 0xC4, 0x71, 0x69, + 0x0B, 0x56, 0xEB, 0x48, 0xB3, 0x09, 0x23, 0x05, 0x26, 0x47, 0xD5, 0x8B, + 0x2D, 0x8B, 0x91, 0x73, 0xF8, 0x14, 0xAC, 0xE6, 0xEE, 0xB3, 0x40, 0x6D, + 0x43, 0x70, 0x18, 0x8A, 0xA4, 0xA9, 0x9A, 0x66, 0x77, 0x85, 0x7E, 0x0F, + 0x48, 0x24, 0x0B, 0xF1, 0x15, 0xEF, 0xBB, 0x25, 0xB8, 0x44, 0x43, 0x8E, + 0x91, 0x29, 0x74, 0x43, 0xEC, 0xF9, 0x31, 0x48, 0x97, 0xFC, 0xDF, 0x5A, + 0xA9, 0x3B, 0x50, 0xAB, 0x9E, 0xE5, 0x93, 0xF3, 0x39, 0xD8, 0x4E, 0xAB, + 0x7F, 0xAD, 0x2E, 0x83, 0x7F, 0x85, 0x46, 0x24, 0xE7, 0x76, 0xF4, 0x64, + 0xFF, 0x6A, 0xDA, 0x79, 0x2F, 0x49, 0x16, 0xD8, 0xF1, 0x54, 0xD6, 0x37, + 0xCB, 0x50, 0x13, 0xA0, 0xB2, 0x4E, 0xDC, 0x1E, 0xF0, 0x59, 0xB4, 0x4F, + 0xB4, 0x9B, 0x6D, 0x17, 0xA1, 0x4C, 0x25, 0x24, 0x71, 0x3C, 0x06, 0x6D, + 0xEE, 0x35, 0x8D, 0xA7, 0x6E, 0x1C, 0x59, 0x17, 0x7A, 0xA5, 0xB4, 0x14, + 0x9F, 0x12, 0x8D, 0xE0, 0xC1, 0xEE, 0xAA, 0xE5, 0xF6, 0x9D, 0x2F, 0x81, + 0x75, 0x9F, 0xCC, 0xE4, 0xE1, 0x87, 0x85, 0x65, 0x86, 0x08, 0xD4, 0xC2, + 0xC5, 0xE1, 0x87, 0x4C, 0x76, 0x25, 0xFC, 0x9F, 0x70, 0x08, 0x5C, 0x69, + 0xB2, 0xEF, 0xDD, 0x2E, 0x41, 0xAF, 0x8E, 0x8A, 0x51, 0x0F, 0x1E, 0x7D, + 0xD2, 0x24, 0x8C, 0x70, 0x4D, 0xB9, 0x22, 0x8B, 0x39, 0x51, 0xEF, 0xCB, + 0x19, 0x16, 0xDC, 0x38, 0xF2, 0x95, 0xE6, 0x39, 0xD0, 0x2A, 0x59, 0x2D, + 0xD0, 0xFA, 0xC3, 0x7E, 0xC7, 0x43, 0xF1, 0x74, 0x11, 0x1D, 0x4D, 0xA2, + 0x35, 0x35, 0xCA, 0x97, 0x05, 0x02, 0x2B, 0xA2, 0x82, 0x23, 0x36, 0xEF, + 0xFC, 0xEC, 0xA9, 0x0A, 0x1B, 0xCA, 0x55, 0x77, 0x11, 0xAC, 0x3F, 0xCC, + 0xA7, 0xF5, 0x12, 0x1D, 0x7C, 0x4C, 0xA3, 0xF9, 0x14, 0x85, 0x1D, 0x8E, + 0x5E, 0xD3, 0x49, 0x52, 0x9D, 0x37, 0x6D, 0x8E, 0x35, 0x8C, 0xA9, 0xFE, + 0x37, 0x23, 0x56, 0xB8, 0x05, 0x65, 0x54, 0x07, 0xF2, 0xC6, 0xED, 0x70, + 0x10, 0xA1, 0x97, 0x77, 0xD4, 0xD7, 0x77, 0x50, 0x50, 0x16, 0x8C, 0x6E, + 0x45, 0xED, 0x9D, 0xB4, 0xF3, 0xE5, 0x82, 0x37, 0x99, 0x67, 0x53, 0x68, + 0xC6, 0x22, 0x33, 0xFD, 0x0C, 0xAD, 0x18, 0x24, 0x76, 0x06, 0x26, 0x5D, + 0x9B, 0x14, 0xF6, 0xCC, 0xB8, 0x48, 0x7E, 0x85, 0x15, 0x35, 0xC7, 0x16, + 0x1F, 0xE5, 0x3A, 0x41, 0x9B, 0xB6, 0xA8, 0x64, 0x48, 0x57, 0x32, 0x60, + 0x91, 0xE5, 0xC1, 0x41, 0xEC, 0x4C, 0x97, 0xEF, 0xD4, 0xF8, 0x84, 0x41, + 0x61, 0x47, 0x17, 0x08, 0x96, 0xC3, 0xBB, 0xF3, 0xB7, 0x2C, 0xF6, 0xB9, + 0xA1, 0x89, 0x78, 0x79, 0x73, 0x89, 0x4C, 0x07, 0x34, 0x4E, 0x75, 0x88, + 0xA8, 0x18, 0x54, 0x3C, 0xF3, 0x8F, 0xED, 0x04, 0xE7, 0x86, 0xD7, 0x8B, + 0xED, 0x34, 0x6B, 0xCF, 0x29, 0x1F, 0x7A, 0x54, 0x7E, 0x8A, 0xE1, 0x81, + 0x4C, 0xEE, 0xEA, 0x23, 0x7B, 0x3F, 0x16, 0x24, 0x71, 0x9D, 0x97, 0xF8, + 0x5B, 0xD0, 0x73, 0x86, 0xFA, 0x21, 0x27, 0x3E, 0x73, 0x1F, 0x0C, 0x36, + 0x87, 0x56, 0x2F, 0x21, 0x10, 0x38, 0xFD, 0x14, 0xB4, 0x1E, 0xAB, 0x3B, + 0xC1, 0x54, 0xE2, 0xDB, 0xB5, 0x76, 0xF2, 0x61, 0x14, 0xBA, 0x19, 0x23, + 0x7C, 0x53, 0x30, 0xC8, 0x0C, 0x62, 0x61, 0x93, 0x41, 0x83, 0x1C, 0xA7, + 0x2D, 0x15, 0xD5, 0x67, 0x95, 0xEE, 0xBD, 0xDB, 0x27, 0x31, 0x16, 0x81, + 0xC9, 0x3A, 0x78, 0xFC, 0xB2, 0x26, 0x10, 0x3F, 0xCA, 0x89, 0x11, 0xB0, + 0x03, 0xE1, 0xB9, 0x7E, 0xDE, 0x0C, 0x34, 0xD1, 0xAA, 0x72, 0x34, 0x90, + 0xD8, 0x62, 0x74, 0xAE, 0xA7, 0x63, 0x96, 0xCD, 0xBA, 0x58, 0x60, 0x6E, + 0xD1, 0x6C, 0x6B, 0xAE, 0xB2, 0x15, 0x7E, 0x12, 0x1A, 0x29, 0x03, 0x2E, + 0x28, 0x98, 0x59, 0x52, 0xE2, 0x94, 0xAC, 0x18, 0x00, 0x1B, 0x2D, 0xCC, + 0xE0, 0xDC, 0x71, 0xA0, 0x97, 0xAF, 0xA1, 0xD3, 0x9D, 0xA6, 0xEE, 0x62, + 0xB4, 0x51, 0xBE, 0xE9, 0xF0, 0x23, 0xBD, 0x5A, 0xED, 0x16, 0xEC, 0x01, + 0x70, 0x8F, 0x39, 0xF2, 0xF9, 0xD8, 0x6D, 0x54, 0x6A, 0xD3, 0x70, 0x7B, + 0xE4, 0x6E, 0x1D, 0x40, 0xF4, 0x4A, 0x04, 0xA6, 0x3A, 0x2B, 0x76, 0x62, + 0x7F, 0x04, 0xC2, 0x0B, 0xB0, 0xAC, 0xB6, 0xE1, 0x85, 0x8A, 0xD5, 0x35, + 0xCA, 0xDF, 0xDE, 0x8A, 0x57, 0x34, 0x51, 0xD0, 0x44, 0xC0, 0xBB, 0x51, + 0x16, 0x44, 0x3F, 0xC7, 0xC4, 0x10, 0x3B, 0x06, 0xB2, 0xB7, 0xA1, 0xF4, + 0x9C, 0x2F, 0xFA, 0xD3, 0x46, 0x51, 0xC3, 0x25, 0x9A, 0x94, 0xB8, 0x78, + 0xE3, 0x3B, 0x63, 0x64, 0x61, 0xF6, 0x1D, 0x4C, 0x9C, 0xFF, 0x68, 0x18, + 0xCC, 0x51, 0xD0, 0xC3, 0x0B, 0x67, 0x0D, 0xED, 0x78, 0xF4, 0xD7, 0x26, + 0x41, 0x0C, 0xEE, 0xB7, 0x35, 0x72, 0xDA, 0x39, 0x3D, 0x20, 0x35, 0xF0, + 0xC8, 0xF2, 0x6A, 0x29, 0xE3, 0x03, 0x90, 0x80, 0xE7, 0x76, 0xBA, 0x78, + 0x5E, 0x5C, 0x9A, 0x35, 0x05, 0x9C, 0x2E, 0xB8, 0xA8, 0x86, 0x2F, 0xD3, + 0xEA, 0x37, 0x7D, 0xED, 0x66, 0xA8, 0x4E, 0xEF, 0xA3, 0xBF, 0x3F, 0x85, + 0x21, 0x94, 0x59, 0x23, 0x3A, 0xB5, 0x42, 0x6D, 0x95, 0x3D, 0x9A, 0xE2, + 0x2A, 0x08, 0xC9, 0xD5, 0x6D, 0xC3, 0x6C, 0x09, 0x09, 0xAC, 0x48, 0x4A, + 0x7A, 0x46, 0xB7, 0x34, 0x03, 0xF0, 0x8A, 0x33, 0x3E, 0xAE, 0x27, 0xFD, + 0x2D, 0xF8, 0xAB, 0xE4, 0x82, 0x81, 0x93, 0x65, 0x4E, 0xC2, 0x0D, 0x6D, + 0xD0, 0xEA, 0xDF, 0x8D, 0xA5, 0xD6, 0xA1, 0x45, 0x7F, 0x08, 0xE1, 0x93, + 0x7E, 0x87, 0x50, 0x84, 0xDE, 0x7D, 0x03, 0x9F, 0x3C, 0xD9, 0x81, 0x31, + 0x1B, 0x1E, 0xA1, 0x82, 0x17, 0x76, 0xE4, 0x3F, 0x45, 0xC9, 0x2E, 0x8E, + 0x72, 0xE3, 0x43, 0xF1, 0x84, 0xF2, 0xFC, 0x0B, 0x8E, 0x6E, 0xB4, 0x5F, + 0x10, 0xF2, 0x3E, 0xC0, 0x7D, 0x57, 0xC2, 0x3E, 0xE9, 0x15, 0x4F, 0xC8, + 0x0B, 0x65, 0x53, 0xBB, 0xD9, 0x50, 0xA2, 0x5C, 0xCB, 0x11, 0x14, 0x77, + 0xDF, 0x2A, 0x18, 0x43, 0x3E, 0xE0, 0x1D, 0x30, 0x6E, 0xF3, 0xFE, 0xB7, + 0x3D, 0x7B, 0x22, 0x7A, 0x73, 0xF4, 0x62, 0xBA, 0x82, 0x51, 0x5D, 0x42, + 0x0B, 0x27, 0x0E, 0x13, 0x27, 0xB4, 0xB5, 0xB4, 0x29, 0xDA, 0x94, 0xB3, + 0x99, 0x9B, 0x3B, 0x37, 0x6E, 0xB2, 0x28, 0x26, 0x52, 0xCF, 0x5C, 0xCB, + 0x74, 0x95, 0x30, 0x50, 0x48, 0xC9, 0xAD, 0xEE, 0x8B, 0xC6, 0x72, 0x55, + 0xEC, 0x28, 0x14, 0x00, 0x78, 0xC4, 0x42, 0x61, 0xBF, 0x96, 0x81, 0x06, + 0xFA, 0x45, 0x4F, 0xC0, 0x1F, 0xC0, 0x4F, 0xCA, 0xEE, 0xBC, 0xCC, 0xF5, + 0xAA, 0xC4, 0x78, 0x0A, 0x16, 0xF5, 0xD2, 0x65, 0x6D, 0xCD, 0x74, 0x2D, + 0x87, 0x93, 0xBC, 0x51, 0x02, 0x68, 0xE0, 0x72, 0xE0, 0x5F, 0x98, 0x1E, + 0x7D, 0x2B, 0x9F, 0xCD, 0x1D, 0xC7, 0x20, 0x34, 0xF5, 0x95, 0x82, 0x7A, + 0x04, 0x80, 0x35, 0x96, 0x88, 0xB8, 0x1C, 0x26, 0x16, 0x62, 0xD9, 0x32, + 0x91, 0xD0, 0x0F, 0x87, 0x23, 0x4E, 0x44, 0x25, 0x7C, 0x2A, 0xD4, 0x8E, + 0x43, 0x0B, 0xEC, 0xA4, 0xD0, 0x92, 0x46, 0xEE, 0xB1, 0xC3, 0xC4, 0x61, + 0xE5, 0xA9, 0x90, 0x0D, 0x03, 0x00, 0xBD, 0xA5, 0xEB, 0x81, 0xB0, 0x2B, + 0xAB, 0xEF, 0x5F, 0x70, 0x6A, 0x80, 0x2F, 0xA1, 0xDC, 0xB3, 0x47, 0x7F, + 0xF4, 0x8A, 0x41, 0xB2, 0x94, 0xEA, 0x06, 0x91, 0x92, 0x1D, 0xEF, 0x4A, + 0xF1, 0x81, 0xAE, 0x8E, 0xA6, 0xE8, 0x7B, 0xC1, 0x46, 0xDD, 0x33, 0xBE, + 0x14, 0x1C, 0x24, 0x27, 0xD8, 0xE0, 0xE7, 0x69, 0x9E, 0xFC, 0x53, 0x7E, + 0x40, 0x2C, 0x13, 0xA7, 0xD6, 0x5A, 0x82, 0xD6, 0xFF, 0x09, 0xA8, 0x6B, + 0xB1, 0x60, 0x82, 0x0A, 0xDD, 0x90, 0x1C, 0xE4, 0x6A, 0xA3, 0x18, 0xFB, + 0x66, 0xD4, 0x4F, 0x9B, 0x28, 0xB2, 0x5B, 0xE7, 0x73, 0xCA, 0x33, 0x2F, + 0x75, 0x57, 0x9B, 0xEA, 0x36, 0x03, 0xC4, 0x06, 0x22, 0x4D, 0xDE, 0x30, + 0x57, 0x4C, 0x7C, 0x90, 0xE5, 0xCF, 0x88, 0x39, 0xF5, 0x19, 0x18, 0x18, + 0x2A, 0x1A, 0x16, 0x11, 0xD8, 0x49, 0xCF, 0x5A, 0x4A, 0x51, 0x1B, 0x78, + 0x1D, 0xF1, 0x65, 0xB2, 0x7C, 0xC7, 0xD4, 0xF1, 0xB1, 0x3D, 0xA3, 0x5C, + 0x0A, 0xB5, 0x3E, 0x72, 0x4B, 0xE3, 0x28, 0xEA, 0xC9, 0x73, 0x9F, 0x36, + 0xC1, 0x50, 0x4F, 0x19, 0x33, 0x47, 0xAB, 0x46, 0x71, 0x60, 0x0E, 0xE8, + 0x1D, 0xD2, 0xDB, 0xD3, 0xD8, 0xF3, 0xA9, 0xD7, 0xE5, 0x25, 0x2B, 0xA2, + 0x75, 0x36, 0x77, 0x55, 0x00, 0x8E, 0x67, 0xF1, 0xF9, 0xDE, 0x38, 0x45, + 0x24, 0x84, 0x01, 0x15, 0xA6, 0xD2, 0x30, 0x91, 0x71, 0xE3, 0xA6, 0xA7, + 0xF4, 0x52, 0x77, 0x76, 0x74, 0xC8, 0x43, 0x76, 0x3E, 0xBF, 0x61, 0xB1, + 0xBD, 0x1C, 0x68, 0x10, 0x8B, 0x69, 0xCD, 0x90, 0x1C, 0x2D, 0x76, 0xD4, + 0x4B, 0x3F, 0xF4, 0x3F, 0xC0, 0x8F, 0xB2, 0x13, 0x2D, 0x07, 0xC0, 0x9A, + 0x03, 0x74, 0x11, 0x0A, 0xAA, 0x74, 0x61, 0xB7, 0x5F, 0x64, 0xE8, 0x0D, + 0xE7, 0x57, 0x4C, 0x46, 0x36, 0xAE, 0x54, 0x71, 0xFD, 0x02, 0xD1, 0x6E, + 0x18, 0x06, 0xCA, 0x74, 0x7F, 0xA8, 0xF4, 0xDF, 0x1A, 0x37, 0xF2, 0xD6, + 0x43, 0xD3, 0xF5, 0x70, 0x22, 0xFD, 0x78, 0x24, 0x65, 0xF1, 0x90, 0x79, + 0xE2, 0x12, 0x31, 0xBD, 0xAA, 0xFF, 0xA1, 0x89, 0x05, 0xBE, 0xAE, 0xCA, + 0x1A, 0x4B, 0x9A, 0x6D, 0x24, 0xF3, 0xDF, 0x4E, 0xB2, 0xB9, 0x71, 0x10, + 0x96, 0xCD, 0xA5, 0xEB, 0x99, 0xDA, 0x5D, 0xB1, 0xF4, 0x50, 0x30, 0x8F, + 0x51, 0x6F, 0xDF, 0xF5, 0x7F, 0xB5, 0x8B, 0xD9, 0x58, 0xD2, 0x0C, 0x72, + 0x00, 0xB2, 0x32, 0x62, 0x18, 0x78, 0xBD, 0x8A, 0x2B, 0x07, 0xB4, 0x5E, + 0x4E, 0xB5, 0x1B, 0xE4, 0x4D, 0xD4, 0x59, 0x29, 0x8E, 0xAA, 0x97, 0x71, + 0x66, 0x7F, 0x9E, 0x3B, 0x57, 0xE0, 0x35, 0x03, 0x6B, 0xF7, 0x12, 0x3C, + 0x5A, 0xAD, 0x1A, 0xF1, 0xC6, 0xC9, 0x5A, 0xF0, 0x1D, 0x25, 0x15, 0xE4, + 0x3B, 0x45, 0x88, 0x70, 0x77, 0x7F, 0x33, 0xC0, 0xA7, 0x50, 0x6F, 0x22, + 0x9B, 0xB6, 0xAF, 0x35, 0xF4, 0xC1, 0xEC, 0xEC, 0xF7, 0x7B, 0x59, 0x45, + 0x2E, 0x8C, 0x45, 0x94, 0xCF, 0xF2, 0x64, 0xD4, 0x99, 0x78, 0xB6, 0xD3, + 0x20, 0x42, 0x49, 0xF4, 0x8E, 0xC4, 0x4E, 0xC9, 0x63, 0x10, 0xE7, 0x57, + 0xA8, 0x33, 0xBB, 0xE3, 0xF2, 0xDF, 0x38, 0x24, 0xF4, 0xC5, 0xEA, 0x86, + 0xAF, 0xB7, 0xB1, 0x34, 0x46, 0x74, 0xAD, 0x96, 0x84, 0x5F, 0x44, 0x16, + 0xE2, 0x54, 0xCA, 0x6A, 0x93, 0xE1, 0x59, 0xBD, 0x56, 0xCF, 0x8C, 0x3A, + 0x3C, 0x1B, 0xAB, 0xBE, 0x6A, 0x0E, 0xCA, 0x56, 0x20, 0x1C, 0xDE, 0xDF, + 0x0A, 0x5D, 0x7F, 0x55, 0xF9, 0x9E, 0x21, 0x9D, 0x98, 0x37, 0xFD, 0xFE, + 0xE7, 0xD7, 0xDC, 0x87, 0xD1, 0xC5, 0x60, 0xF5, 0x91, 0xD9, 0x10, 0x95, + 0x6C, 0x24, 0x5B, 0x0F, 0x59, 0x54, 0x4D, 0x04, 0xE8, 0xF8, 0x33, 0x94, + 0x1D, 0x00, 0x72, 0xCE, 0x6B, 0xCD, 0x90, 0xC7, 0x6A, 0x9F, 0xF4, 0xE7, + 0x5B, 0x67, 0x52, 0xBB, 0xB6, 0x58, 0x19, 0xBB, 0xD5, 0x09, 0x0B, 0x8C, + 0x30, 0xBE, 0x21, 0xDA, 0xCB, 0xE7, 0x67, 0xDC, 0x24, 0x00, 0xDD, 0x1A, + 0x43, 0x13, 0x71, 0x44, 0x11, 0xA1, 0xA5, 0x9D, 0x9E, 0xD1, 0x19, 0xE4, + 0x9D, 0x59, 0x2D, 0xF9, 0x9F, 0x8D, 0x2D, 0x09, 0x01, 0x32, 0x35, 0xC7, + 0x2E, 0x12, 0x15, 0x84, 0x88, 0x9F, 0xA7, 0xA2, 0x48, 0x72, 0xA6, 0xB2, + 0xE0, 0x81, 0x8A, 0xB1, 0x07, 0x21, 0x5D, 0x9D, 0x74, 0x1D, 0x3D, 0x98, + 0x24, 0x1E, 0x4C, 0x45, 0xBD, 0x45, 0x3F, 0x1E, 0x31, 0x5D, 0xBE, 0x8C, + 0x4F, 0xDD, 0x1D, 0x0C, 0xA7, 0xFC, 0x5C, 0xA3, 0x20, 0x13, 0x71, 0x9F, + 0xB8, 0x0E, 0x50, 0xFA, 0x27, 0x5A, 0xA0, 0x91, 0x28, 0xCA, 0xDF, 0x43, + 0x39, 0x18, 0xA2, 0x9F, 0x60, 0xAB, 0xEC, 0x2B, 0x89, 0x03, 0x03, 0x58, + 0xB0, 0xA0, 0x76, 0x46, 0xBB, 0x2A, 0x37, 0xEF, 0xD9, 0xD7, 0xDD, 0x93, + 0x40, 0x0A, 0x13, 0x7E, 0xF6, 0x84, 0xB7, 0x34, 0x10, 0xB2, 0x31, 0x83, + 0x09, 0x66, 0x78, 0xA1, 0x60, 0xD5, 0x30, 0xC4, 0x82, 0xD4, 0x2E, 0x6D, + 0xFD, 0x8B, 0x01, 0x84, 0x91, 0x78, 0x4A, 0x4E, 0x2A, 0x85, 0x82, 0xC9, + 0x92, 0x0D, 0x28, 0x32, 0x26, 0xE5, 0x25, 0x35, 0x09, 0x79, 0x04, 0xA5, + 0xE4, 0xFA, 0x35, 0xE0, 0xB3, 0x87, 0x8B, 0x18, 0x02, 0xED, 0xEC, 0x7B, + 0x34, 0x56, 0xAE, 0x6C, 0x00, 0x3C, 0x8F, 0xEF, 0xA6, 0x06, 0xFC, 0xBD, + 0xD9, 0x35, 0x47, 0x79, 0x0F, 0xB4, 0x49, 0x7D, 0x9A, 0x1B, 0xB9, 0xEE, + 0xB4, 0xFB, 0xDA, 0xAA, 0xCD, 0xEF, 0xA1, 0xD6, 0xD4, 0xCA, 0x7F, 0xE8, + 0x1D, 0x91, 0x72, 0x83, 0xB6, 0x4B, 0x86, 0xE4, 0xEC, 0x27, 0xD9, 0xEF, + 0xDC, 0x0D, 0xA0, 0x25, 0xE8, 0xD8, 0xEA, 0xC0, 0xD1, 0x5C, 0x58, 0x00, + 0xFD, 0x31, 0x48, 0x69, 0xD7, 0x09, 0xFD, 0xD4, 0x1A, 0x8D, 0x5B, 0xE7, + 0xA6, 0xE1, 0x9A, 0xF6, 0x1A, 0x03, 0xF9, 0x2D, 0x2E, 0x42, 0xC9, 0x93, + 0xCA, 0x31, 0xAA, 0xF1, 0xBB, 0x52, 0xCF, 0x20, 0x01, 0x67, 0xE0, 0x7D, + 0x80, 0x69, 0xBA, 0x81, 0xF5, 0x3A, 0x55, 0x40, 0x4E, 0x4F, 0x9B, 0xDD, + 0x0F, 0xF9, 0x20, 0xB8, 0x4A, 0x16, 0x58, 0x21, 0x6D, 0x71, 0x42, 0x78, + 0xC4, 0x25, 0x3D, 0x6F, 0x9C, 0xC5, 0xE1, 0x2B, 0x39, 0xE0, 0x52, 0x07, + 0x4A, 0xFF, 0x62, 0x2C, 0xD2, 0xAB, 0xF3, 0x5B, 0x20, 0xB3, 0x85, 0x44, + 0x24, 0x84, 0x8C, 0x3C, 0x38, 0x09, 0x9A, 0x3A, 0x4E, 0xAF, 0xBC, 0xAB, + 0x6E, 0x0D, 0x60, 0x30, 0xBA, 0x04, 0xAA, 0x74, 0x93, 0x15, 0x14, 0xB8, + 0xD4, 0x20, 0xD6, 0x2F, 0x2B, 0x23, 0x7F, 0x03, 0xC1, 0x3F, 0xF0, 0xE2, + 0xBA, 0x77, 0x9C, 0xF3, 0x83, 0xE5, 0x61, 0x11, 0xA2, 0x77, 0x9D, 0xB8, + 0x65, 0xB5, 0x87, 0xC2, 0xFD, 0xEA, 0x9E, 0x6E, 0xBA, 0x5D, 0x5E, 0x76, + 0x46, 0x49, 0x4E, 0x5A, 0x5F, 0x4C, 0x96, 0xB1, 0x5F, 0x6A, 0xE5, 0xA2, + 0xC2, 0xDB, 0xC6, 0x66, 0x92, 0xD7, 0xD4, 0x80, 0x6F, 0x63, 0x01, 0x1C, + 0x0D, 0x13, 0xB5, 0xA9, 0x72, 0x8B, 0x6B, 0xA6, 0xF0, 0x98, 0xE4, 0xC6, + 0xF8, 0x46, 0x23, 0x61, 0x1E, 0x4C, 0xFD, 0xFF, 0x3E, 0x4C, 0x78, 0xE8, + 0x49, 0xCE, 0xA6, 0xD0, 0x5C, 0x2B, 0x85, 0x7D, 0xB4, 0xF5, 0x7D, 0x71, + 0x1C, 0x89, 0x57, 0x42, 0x6A, 0x7A, 0x71, 0x44, 0x75, 0x01, 0x90, 0xC3, + 0xBF, 0x95, 0x7B, 0x0A, 0x4E, 0x01, 0x0A, 0x52, 0xF4, 0xA0, 0x21, 0x94, + 0x7C, 0xEB, 0xA9, 0xEB, 0xAD, 0x1B, 0xBE, 0x78, 0x98, 0x04, 0xC4, 0x26, + 0x20, 0x73, 0x5F, 0xB5, 0x45, 0x6C, 0xE2, 0xC7, 0x04, 0xD2, 0xEB, 0x67, + 0xE5, 0x8F, 0x2F, 0xA0, 0x66, 0x4C, 0xBD, 0x36, 0x2C, 0xFE, 0x8E, 0x40, + 0x46, 0xB6, 0xAB, 0x2F, 0xCF, 0x1F, 0xA1, 0x3E, 0xBF, 0x96, 0x61, 0x74, + 0x68, 0xD6, 0x82, 0x1D, 0x12, 0xD5, 0xFD, 0xB9, 0x45, 0xDA, 0x8D, 0x2B, + 0x76, 0xDE, 0x9C, 0x65, 0xA0, 0x2D, 0x76, 0x2F, 0x49, 0x2E, 0xEC, 0x27, + 0xD4, 0x40, 0x26, 0xA3, 0x06, 0x01, 0x2E, 0x60, 0x04, 0x94, 0x43, 0xA4, + 0x79, 0x5D, 0xEA, 0xD8, 0xD1, 0x5B, 0x95, 0xF2, 0x2E, 0x13, 0x17, 0x9E, + 0xED, 0x7A, 0x7E, 0x83, 0x86, 0xDF, 0xD1, 0xD4, 0xE9, 0x00, 0x55, 0x8D, + 0xCA, 0x4F, 0x18, 0x74, 0x4E, 0x5E, 0x7C, 0xAC, 0xE9, 0x4A, 0x25, 0xA7, + 0x3A, 0x84, 0x43, 0xF5, 0x77, 0x74, 0x1E, 0xDC, 0x32, 0xDB, 0x50, 0xCF, + 0xF8, 0xAC, 0x01, 0x37, 0x33, 0x59, 0xBE, 0xF5, 0xC2, 0x98, 0xE7, 0x09, + 0x29, 0xE3, 0x6E, 0xBC, 0x22, 0x1D, 0x20, 0x06, 0x89, 0x90, 0x95, 0xCC, + 0xC7, 0x3F, 0x2B, 0x48, 0x5F, 0x23, 0x0B, 0xCB, 0xD5, 0xA2, 0x4E, 0x52, + 0x5A, 0x1E, 0x1A, 0x4C, 0x51, 0x75, 0x67, 0x33, 0xD6, 0xF1, 0xBE, 0x9B, + 0x8D, 0x31, 0x0F, 0xBA, 0x2A, 0x67, 0x58, 0xF5, 0x62, 0xC3, 0x80, 0x48, + 0x89, 0x5C, 0x3F, 0x81, 0xFF, 0x27, 0x6E, 0x0B, 0x79, 0x6A, 0xD0, 0x33, + 0xD6, 0x2D, 0x6A, 0xF1, 0x36, 0xCC, 0x96, 0x6C, 0xA6, 0x6D, 0xA0, 0x92, + 0x04, 0x5B, 0x27, 0xC9, 0x05, 0x1D, 0xCA, 0xB2, 0x8D, 0x4F, 0x20, 0xB6, + 0xEA, 0xE4, 0x57, 0xAE, 0xAF, 0x77, 0xF7, 0xA8, 0xA5, 0xCD, 0xFF, 0x5C, + 0xB9, 0x7F, 0x29, 0x98, 0x2C, 0x5E, 0xDA, 0x69, 0x3E, 0x99, 0x21, 0x25, + 0x49, 0x1F, 0xEA, 0xD4, 0x91, 0x63, 0x89, 0xB8, 0xEC, 0xCF, 0x8B, 0x1D, + 0xF6, 0x33, 0x3C, 0x29, 0x26, 0xEF, 0xAC, 0x81, 0x12, 0xC5, 0x1B, 0x44, + 0xAC, 0x18, 0x90, 0x20, 0xBB, 0x03, 0x5B, 0x3F, 0x3E, 0xD3, 0xD3, 0xC5, + 0x47, 0xAF, 0x7F, 0x44, 0x9E, 0x32, 0xC5, 0x06, 0xE9, 0xB6, 0x7D, 0xB3, + 0xA1, 0xF6, 0x77, 0x29, 0x7F, 0xA9, 0xA9, 0x10, 0x20, 0xCE, 0x2E, 0x18, + 0xC8, 0xAA, 0x68, 0x65, 0x64, 0x11, 0x57, 0x4F, 0xE9, 0xA2, 0xE3, 0xD1, + 0xEA, 0x03, 0x40, 0xAC, 0x68, 0x04, 0xC8, 0x36, 0x69, 0xE9, 0xB5, 0x6D, + 0x77, 0x93, 0xFA, 0xD6, 0xB8, 0xA5, 0x71, 0x63, 0x70, 0xE8, 0xA0, 0x27, + 0x39, 0xD7, 0x33, 0x52, 0x76, 0x59, 0xF1, 0xEF, 0xE2, 0x76, 0x83, 0xC5, + 0x4D, 0xC5, 0xA3, 0xF2, 0x10, 0x4C, 0xB3, 0x35, 0x6E, 0x12, 0x5B, 0x26, + 0x7C, 0x4A, 0x8B, 0xFB, 0x02, 0x2B, 0xBE, 0xF4, 0x0A, 0x91, 0xF5, 0x7C, + 0x82, 0x08, 0x62, 0x70, 0xD8, 0xA4, 0x29, 0xE0, 0xF8, 0x97, 0x19, 0x1D, + 0x06, 0xD3, 0x46, 0x90, 0xEB, 0xB5, 0x89, 0x5B, 0x6C, 0x50, 0xB5, 0xB6, + 0x70, 0x58, 0xA0, 0x30, 0x05, 0xF5, 0x40, 0x51, 0x4E, 0x30, 0xDF, 0x64, + 0x6F, 0x7A, 0x4E, 0x54, 0x64, 0xE3, 0x20, 0xD3, 0x93, 0xE3, 0x79, 0x28, + 0x39, 0xB1, 0x18, 0xDF, 0xCC, 0xF1, 0x98, 0xD1, 0x2D, 0x86, 0x34, 0x84, + 0xA1, 0x83, 0x4A, 0xE5, 0xA9, 0x61, 0x6B, 0x09, 0xA2, 0x3B, 0xCE, 0x5E, + 0xF7, 0x6B, 0xFF, 0xC2, 0x20, 0xFC, 0xF3, 0xAC, 0x2E, 0x7C, 0x63, 0x55, + 0x11, 0x24, 0xEE, 0xE3, 0x51, 0xE6, 0x18, 0xB0, 0xD6, 0x6E, 0x85, 0xF5, + 0xE5, 0x00, 0x91, 0x21, 0xD4, 0x88, 0xF1, 0x50, 0x31, 0x39, 0x0A, 0x08, + 0x23, 0xA9, 0x01, 0xB3, 0xEF, 0xE8, 0xAF, 0xDF, 0xAE, 0x2B, 0xAF, 0xF9, + 0x0D, 0xE2, 0x4D, 0x00, 0xE3, 0x5B, 0x56, 0x80, 0x90, 0xB8, 0xD4, 0x76, + 0xEA, 0x14, 0x68, 0x40, 0x53, 0x9A, 0x3B, 0x82, 0xFC, 0x63, 0x9F, 0x9A, + 0x4C, 0xFF, 0xE3, 0x10, 0x49, 0xCB, 0xA8, 0x1D, 0x59, 0x98, 0x3F, 0x4C, + 0xDD, 0x2C, 0xB2, 0x8D, 0x11, 0xB5, 0x23, 0xF4, 0x90, 0x87, 0xE3, 0x85, + 0x24, 0xD4, 0x0A, 0xE9, 0x79, 0xBB, 0x1F, 0x56, 0xC3, 0x62, 0x35, 0xDF, + 0xE0, 0xAA, 0x51, 0x02, 0x93, 0xAE, 0x11, 0x21, 0xCF, 0xE4, 0xF3, 0x84, + 0x08, 0x64, 0x06, 0x8B, 0x8A, 0x32, 0xB0, 0xF0, 0xC5, 0xD3, 0x5E, 0x1E, + 0xF1, 0x69, 0x48, 0x46, 0xEC, 0x61, 0xA2, 0x7F, 0x28, 0xB6, 0xF8, 0xC9, + 0x78, 0x35, 0x9B, 0x4D, 0x8C, 0xFE, 0xB7, 0xC9, 0xBC, 0xE9, 0x6E, 0x17, + 0xCB, 0xFB, 0x00, 0x91, 0xE8, 0x27, 0x77, 0x7C, 0x96, 0xD6, 0xAF, 0x8D, + 0xE4, 0x18, 0x8F, 0xEB, 0x7B, 0x9F, 0x01, 0x9C, 0x2E, 0x77, 0xF5, 0x40, + 0x7C, 0x6D, 0x85, 0xA5, 0x17, 0x8F, 0x40, 0xB7, 0x9D, 0xBB, 0x68, 0x96, + 0x22, 0x17, 0x0A, 0x75, 0xA3, 0x1D, 0x07, 0xE4, 0x93, 0x8A, 0xBB, 0xAD, + 0x7E, 0x2E, 0xAA, 0x21, 0xDA, 0x62, 0xBF, 0xE8, 0xBB, 0x28, 0xB2, 0xCE, + 0xE3, 0x0F, 0xCB, 0x3C, 0x2C, 0x4A, 0x3D, 0xAA, 0xFC, 0x4B, 0xB5, 0x6A, + 0x04, 0x05, 0xA4, 0x63, 0x98, 0xD8, 0xA2, 0x5E, 0x96, 0xD5, 0x52, 0x7B, + 0xCB, 0xED, 0xA3, 0x72, 0x3E, 0x2A, 0x3F, 0xE2, 0x79, 0x3D, 0xFE, 0x8A, + 0xA0, 0xD4, 0x32, 0x60, 0x10, 0xBE, 0xF2, 0xE5, 0xF9, 0x03, 0xE2, 0x66, + 0x76, 0x7A, 0x48, 0xEF, 0x33, 0x63, 0xA0, 0x93, 0x99, 0x28, 0x97, 0x40, + 0xB9, 0xAD, 0xEC, 0xB4, 0xD7, 0x98, 0x9D, 0x87, 0x6A, 0x6C, 0x9D, 0xD5, + 0xF6, 0xAA, 0x64, 0xE4, 0xD6, 0x73, 0x92, 0xA9, 0xC2, 0xB4, 0x80, 0x0F, + 0x58, 0x7B, 0x01, 0x17, 0xAD, 0x7C, 0x3E, 0x5C, 0xDE, 0x7D, 0x77, 0xF2, + 0x35, 0x4E, 0x6F, 0x0D, 0xE1, 0x4E, 0xAD, 0x4E, 0x82, 0x36, 0x87, 0x89, + 0x43, 0x13, 0x50, 0x08, 0x22, 0x3D, 0x14, 0x3D, 0x85, 0x50, 0xBC, 0x17, + 0x18, 0x66, 0xE1, 0x85, 0xEF, 0xCA, 0xF1, 0x12, 0x9B, 0xA1, 0xC0, 0x95, + 0x14, 0x2E, 0x2C, 0xB6, 0x1B, 0x25, 0x9F, 0x4C, 0xF2, 0x49, 0xAE, 0x8A, + 0xD4, 0xE7, 0x1A, 0x05, 0xFB, 0x6F, 0x75, 0x42, 0xC6, 0x14, 0xD8, 0xE5, + 0x03, 0x04, 0x80, 0xEB, 0x58, 0x8F, 0x92, 0xAF, 0xD1, 0x15, 0x00, 0x63, + 0xB7, 0xFF, 0xF8, 0xD7, 0xE3, 0xC0, 0x37, 0xEF, 0x68, 0xF9, 0xC8, 0x5A, + 0x03, 0x6D, 0x4A, 0x56, 0xAE, 0xDF, 0x8E, 0xBD, 0x52, 0x5F, 0x7D, 0x22, + 0x4A, 0xFA, 0xFE, 0xA2, 0x3F, 0xCE, 0x45, 0xD8, 0x41, 0x94, 0x70, 0x21, + 0x48, 0xF7, 0x95, 0xE5, 0xE4, 0x22, 0x52, 0x7E, 0x15, 0xAE, 0xC7, 0x34, + 0xA8, 0xF9, 0x15, 0x4B, 0x15, 0x11, 0x19, 0x19, 0xDC, 0x4A, 0x3D, 0x3D, + 0x33, 0x79, 0x0E, 0x8A, 0x34, 0x11, 0xEB, 0x4A, 0x8B, 0xAF, 0x0F, 0xE8, + 0xBA, 0x3E, 0x94, 0xA6, 0x2C, 0xF8, 0xF8, 0xA9, 0xD1, 0xE7, 0x3A, 0x3D, + 0x44, 0xC8, 0x08, 0x47, 0x5E, 0xD8, 0xF1, 0x6C, 0xCD, 0x8C, 0x60, 0xD7, + 0xF6, 0xA5, 0x57, 0xF2, 0x0C, 0xD6, 0x9E, 0x0C, 0x90, 0xCB, 0xAE, 0xC0, + 0xC1, 0x62, 0xD4, 0xC6, 0x6C, 0x7F, 0xED, 0x38, 0x23, 0x48, 0x0B, 0x53, + 0x64, 0xBE, 0xD2, 0x6C, 0xE2, 0xAB, 0x71, 0x9E, 0x51, 0x87, 0xBF, 0x54, + 0xC1, 0x36, 0xC0, 0x5B, 0x0E, 0xD0, 0x63, 0xE9, 0x1C, 0x0C, 0x07, 0x3B, + 0xAE, 0xEE, 0xA5, 0x51, 0x1E, 0xE6, 0x8E, 0x01, 0x1E, 0x59, 0xEA, 0x6C, + 0x25, 0x63, 0x33, 0x08, 0x08, 0x2C, 0x21, 0xF5, 0xEA, 0x01, 0x56, 0x44, + 0x7D, 0xE0, 0x85, 0x1C, 0xD5, 0x4D, 0x8D, 0xC2, 0xB7, 0xEE, 0x54, 0x51, + 0xCA, 0x8B, 0xA6, 0xCF, 0x47, 0x85, 0x02, 0x29, 0xDD, 0x60, 0x42, 0xE4, + 0x17, 0x8E, 0x42, 0x5D, 0xFF, 0x10, 0x91, 0x25, 0x46, 0x93, 0x6B, 0xDA, + 0xAD, 0xDA, 0x01, 0x0F, 0x31, 0x85, 0x53, 0x9E, 0x7A, 0x3C, 0x14, 0xF5, + 0xF0, 0xA4, 0x12, 0x9B, 0xED, 0xC7, 0x83, 0x73, 0xA4, 0x6B, 0xC8, 0xAA, + 0x7B, 0xD4, 0x64, 0xF7, 0xF5, 0xD3, 0x07, 0x2F, 0x41, 0x8B, 0x09, 0xBF, + 0xC7, 0xBD, 0x00, 0x2A, 0xBC, 0xBA, 0xFC, 0x9A, 0xE2, 0x58, 0x64, 0xFD, + 0xE1, 0x60, 0x4E, 0x3C, 0x60, 0xE3, 0x84, 0xCD, 0xD3, 0xAE, 0xB4, 0x0D, + 0xF8, 0xA3, 0xAA, 0x74, 0xE1, 0x42, 0x18, 0x56, 0xA6, 0x72, 0x65, 0xD1, + 0x14, 0xCC, 0xFE, 0x1F, 0xD0, 0x91, 0x84, 0xA1, 0x6A, 0x33, 0x76, 0x97, + 0x5B, 0x72, 0x3F, 0xB3, 0xB8, 0xDF, 0xD9, 0x3E, 0x1D, 0x1E, 0xFD, 0x35, + 0xDF, 0x4B, 0xD7, 0x50, 0xE7, 0x2D, 0x1B, 0xC8, 0xCA, 0xB3, 0x89, 0xE4, + 0x56, 0xA9, 0x81, 0x4A, 0xED, 0x96, 0xE3, 0x0C, 0xE5, 0x9F, 0x60, 0xF5, + 0xB4, 0x9A, 0xCD, 0xAD, 0xBA, 0x63, 0x8B, 0x54, 0x39, 0xD0, 0x0A, 0xE9, + 0x98, 0x5E, 0xC1, 0xC9, 0x40, 0xB7, 0xA4, 0x10, 0x32, 0x7D, 0x9E, 0x00, + 0x68, 0x69, 0xB8, 0x23, 0xDF, 0xBE, 0xC0, 0x45, 0x33, 0xF1, 0x8E, 0x27, + 0xED, 0xA1, 0xD9, 0x38, 0x74, 0xF2, 0x8A, 0xBE, 0x85, 0x1E, 0xF0, 0x5B, + 0x1A, 0x34, 0x93, 0x72, 0xDE, 0x37, 0xD7, 0x83, 0xEB, 0x7B, 0x28, 0x5E, + 0x14, 0x2A, 0xBC, 0xC7, 0xE2, 0xB3, 0x06, 0x29, 0x76, 0x37, 0xD3, 0xC4, + 0x47, 0x8A, 0xDB, 0xC7, 0x30, 0x02, 0x66, 0xC9, 0x53, 0x5E, 0xBA, 0xDB, + 0x07, 0x60, 0x0D, 0x6B, 0x54, 0xCB, 0x0C, 0xC1, 0x27, 0x54, 0xDE, 0x12, + 0xED, 0x7D, 0x8E, 0x76, 0xCD, 0x57, 0x52, 0x88, 0xF0, 0x16, 0x9C, 0x80, + 0xE1, 0x00, 0x50, 0x95, 0x61, 0x8E, 0x55, 0xEE, 0xE1, 0xC9, 0x8F, 0xD4, + 0x1C, 0x74, 0xDD, 0x85, 0xCB, 0xE5, 0x7C, 0x8B, 0x24, 0x4C, 0x4B, 0xDA, + 0x16, 0x98, 0xA0, 0x70, 0x58, 0x13, 0x5D, 0x05, 0x0C, 0x3F, 0x61, 0xE3, + 0x14, 0xE2, 0xEF, 0x92, 0xC8, 0x3A, 0xDA, 0xFF, 0x0E, 0x1A, 0xB3, 0x7D, + 0x02, 0x43, 0xDD, 0xE5, 0xE3, 0x8C, 0xE9, 0xFC, 0xD1, 0x66, 0xA2, 0x8E, + 0x4D, 0x81, 0xA4, 0x4C, 0xBF, 0x4D, 0x9B, 0x67, 0x53, 0x63, 0x11, 0x86, + 0x78, 0x54, 0xF0, 0x9E, 0x70, 0x56, 0x1C, 0x5F, 0xBA, 0xC9, 0x1C, 0xAB, + 0xC8, 0x39, 0x8B, 0xC9, 0xE4, 0xB1, 0x07, 0xEA, 0xB5, 0xD4, 0x75, 0xF2, + 0x91, 0x83, 0x1C, 0x2F, 0x73, 0xEC, 0xFB, 0x56, 0x68, 0xA1, 0xC8, 0xAC, + 0xCA, 0x20, 0x3F, 0x6A, 0xE9, 0xBF, 0xC1, 0x1D, 0x00, 0xBC, 0x23, 0x1F, + 0x1E, 0xF8, 0xC3, 0x08, 0xBD, 0x66, 0xA5, 0xF6, 0x5D, 0x77, 0xD5, 0x5A, + 0x6D, 0x04, 0xEB, 0x76, 0x9E, 0xDB, 0x0C, 0x8C, 0x28, 0x9F, 0xCC, 0x4E, + 0x77, 0xFC, 0x00, 0x36, 0xEC, 0xCE, 0x4B, 0x72, 0x06, 0xD1, 0x73, 0x1A, + 0xD8, 0x91, 0x45, 0x55, 0xB8, 0xA7, 0x8C, 0x40, 0xCA, 0xF7, 0xCF, 0x39, + 0x6A, 0x74, 0x63, 0xD3, 0x71, 0x76, 0xA4, 0x59, 0xB8, 0x8C, 0xB5, 0x4E, + 0xCA, 0x12, 0x35, 0xB5, 0x87, 0x9F, 0xA9, 0x94, 0x07, 0x67, 0x4D, 0xF0, + 0xDF, 0x97, 0x0F, 0x53, 0x68, 0xCC, 0x67, 0x26, 0xF8, 0xF5, 0xBE, 0xAD, + 0x1E, 0x95, 0xD0, 0x90, 0x88, 0x27, 0xA8, 0x3D, 0x4F, 0xA1, 0x58, 0xDE, + 0x8F, 0xBC, 0x36, 0x2F, 0x36, 0x0B, 0x38, 0x9A, 0x51, 0x95, 0xA2, 0xE5, + 0x8F, 0xC5, 0x1D, 0xE4, 0x2E, 0x27, 0x9D, 0xEA, 0x43, 0xD7, 0x07, 0x02, + 0x0B, 0x26, 0x85, 0xD3, 0xEC, 0xA3, 0x67, 0xA9, 0xC3, 0x23, 0xFA, 0x46, + 0x5F, 0x9C, 0x64, 0xD5, 0xCC, 0x7D, 0x75, 0xE3, 0x51, 0x32, 0x31, 0x1F, + 0x51, 0x99, 0xF0, 0x57, 0x30, 0xC9, 0x22, 0xA0, 0x2B, 0xA3, 0xA7, 0x7A, + 0x26, 0x21, 0x91, 0xD1, 0x75, 0xD4, 0xB7, 0x0B, 0xC5, 0x96, 0x71, 0x66, + 0x2D, 0x5E, 0xDA, 0x71, 0x48, 0xEA, 0xAC, 0x97, 0x8B, 0x23, 0xD5, 0x49, + 0xC2, 0x66, 0x1D, 0x62, 0xFC, 0x06, 0x17, 0xA1, 0xEC, 0x71, 0x17, 0xA0, + 0x3B, 0xE3, 0xF0, 0xF7, 0x0D, 0xCB, 0x84, 0xB6, 0x7C, 0xC0, 0x42, 0x0E, + 0xB8, 0xA3, 0x8C, 0x31, 0x4A, 0x9A, 0xAA, 0x97, 0xFC, 0x67, 0xB1, 0x75, + 0xC6, 0x51, 0xFC, 0x28, 0x69, 0xD0, 0x43, 0x28, 0x54, 0xB9, 0xAE, 0xBE, + 0x44, 0x7A, 0x18, 0x36, 0x39, 0x26, 0x46, 0x29, 0x33, 0x0E, 0x15, 0xAF, + 0x03, 0x21, 0x07, 0x87, 0xDE, 0x30, 0xE3, 0xE5, 0xDA, 0x34, 0x81, 0xE5, + 0xE2, 0xCD, 0x6B, 0xEE, 0xEF, 0x95, 0xD3, 0x2C, 0x7B, 0x31, 0x15, 0x56, + 0xB4, 0x77, 0xDA, 0x40, 0xFD, 0x59, 0xB9, 0xDF, 0xEC, 0x39, 0x2B, 0x6C, + 0x18, 0x7E, 0xCA, 0x99, 0x5E, 0x55, 0xF2, 0x61, 0x45, 0x74, 0x2C, 0x50, + 0xB7, 0x42, 0x31, 0xD9, 0x58, 0xAE, 0x75, 0x17, 0x4D, 0xFA, 0xF1, 0x18, + 0x26, 0x6B, 0x2C, 0xD9, 0xE8, 0x98, 0x75, 0xE7, 0x8A, 0xC9, 0x07, 0x63, + 0x6D, 0x55, 0xFD, 0xEE, 0x2D, 0x24, 0x4D, 0x0F, 0x11, 0x7C, 0x0B, 0x48, + 0x99, 0xC0, 0x06, 0x83, 0xC3, 0xF5, 0x90, 0xBD, 0x12, 0xE7, 0xC6, 0x86, + 0x16, 0x8A, 0x63, 0xD7, 0xF8, 0x1E, 0x54, 0xCD, 0x06, 0x20, 0x4C, 0x5C, + 0xC6, 0x15, 0x76, 0x56, 0xE0, 0xE1, 0xDD, 0xE4, 0xC1, 0x63, 0x75, 0x53, + 0xBC, 0xE1, 0x8C, 0xBF, 0x26, 0x41, 0xF9, 0xA9, 0xCC, 0xEE, 0x69, 0xEA, + 0x7D, 0x0E, 0x9F, 0xF2, 0x70, 0x0C, 0x4A, 0xD0, 0x2D, 0x17, 0x47, 0xB0, + 0x66, 0xD4, 0xDF, 0x9A, 0xDC, 0xAD, 0x94, 0xE6, 0x66, 0x3F, 0x0D, 0x57, + 0xB3, 0xAD, 0x90, 0xD0, 0xD7, 0x72, 0x3D, 0x1E, 0x9C, 0xAF, 0x1A, 0x46, + 0x20, 0x8B, 0x48, 0xEA, 0x3A, 0x10, 0x42, 0x32, 0x3D, 0xB9, 0xEB, 0x61, + 0x47, 0x29, 0x61, 0xED, 0xB6, 0x8C, 0x1D, 0x9E, 0xD4, 0x00, 0x34, 0xD9, + 0xAB, 0x16, 0x16, 0x84, 0xAF, 0xC5, 0x79, 0x37, 0xE4, 0xC9, 0xBE, 0x91, + 0x57, 0x4F, 0xFE, 0x87, 0xF7, 0x47, 0x62, 0x99, 0x4F, 0xFA, 0xAE, 0x51, + 0x68, 0x1A, 0xE2, 0x90, 0xB5, 0x62, 0x21, 0xE4, 0x06, 0x14, 0x3D, 0xB5, + 0xC2, 0x34, 0xB0, 0xF3, 0x6B, 0x0D, 0xF7, 0x0F, 0x3C, 0x54, 0xD6, 0x2B, + 0xCF, 0xD8, 0xD1, 0x9B, 0x54, 0x8B, 0x93, 0xBB, 0x15, 0xF1, 0xC5, 0x9F, + 0x24, 0x53, 0x02, 0x94, 0xDE, 0x66, 0x4F, 0x2F, 0x77, 0xF6, 0xE4, 0x4C, + 0x58, 0x19, 0xBB, 0x08, 0x0A, 0x9B, 0xAC, 0x4C, 0xA5, 0xAC, 0x4A, 0x66, + 0x72, 0x01, 0x45, 0x41, 0xDA, 0x86, 0xF9, 0x7C, 0x0A, 0x8E, 0xA6, 0xFD, + 0x10, 0x18, 0x4F, 0x2F, 0xEA, 0x5A, 0xD9, 0x79, 0xD2, 0xD8, 0x3F, 0x02, + 0x11, 0x5F, 0x43, 0x79, 0x3A, 0x40, 0x75, 0x6C, 0xFC, 0x3A, 0x24, 0xEB, + 0xBF, 0xD2, 0xC0, 0xF3, 0xD0, 0xD1, 0x21, 0xA9, 0x84, 0xFB, 0x9D, 0xA3, + 0xF1, 0x0F, 0x57, 0xAE, 0x99, 0xCB, 0x3B, 0xBC, 0x55, 0x88, 0xE6, 0xE1, + 0x7D, 0xC6, 0xDB, 0xA9, 0x35, 0x59, 0x11, 0x26, 0x05, 0x0E, 0x8E, 0x5D, + 0xBE, 0xF1, 0x32, 0x5A, 0xBF, 0xBE, 0xE8, 0x07, 0xB8, 0x80, 0x61, 0x70, + 0xEA, 0x8C, 0x05, 0xC0, 0x4D, 0xBF, 0xE9, 0x63, 0xA1, 0x11, 0xFC, 0x0A, + 0x4B, 0x6D, 0x03, 0x11, 0x86, 0x7A, 0x69, 0x49, 0x15, 0xDA, 0x23, 0x67, + 0xC5, 0x51, 0x3A, 0x5A, 0xAD, 0xCA, 0xAC, 0xF7, 0xD7, 0x6C, 0x0E, 0x2D, + 0xC5, 0x88, 0xD9, 0x95, 0x48, 0x58, 0x70, 0x37, 0xBE, 0x8E, 0xBC, 0xF6, + 0x14, 0x4C, 0xA0, 0x13, 0x9C, 0x8D, 0x58, 0x9F, 0x02, 0xAB, 0x65, 0xCA, + 0x66, 0x73, 0x84, 0x3B, 0xC6, 0xD5, 0x43, 0x9E, 0x1C, 0xCE, 0xA0, 0x00, + 0x59, 0xEC, 0x4A, 0xC0, 0x9D, 0x31, 0x5A, 0xB2, 0x0A, 0x86, 0x23, 0x2A, + 0xCD, 0xCF, 0x18, 0x96, 0xE2, 0xE5, 0xFF, 0x36, 0xBC, 0x66, 0x8A, 0xA7, + 0x8A, 0xE0, 0xF4, 0x06, 0x39, 0x7C, 0xCF, 0x21, 0xEE, 0x17, 0x39, 0x87, + 0x74, 0xA0, 0x73, 0x38, 0xA9, 0x90, 0x6C, 0xC2, 0x1B, 0xF0, 0x69, 0xD8, + 0xBF, 0x6E, 0x44, 0x6F, 0x77, 0x75, 0x1E, 0x45, 0xB5, 0x65, 0xAD, 0xDF, + 0x56, 0x66, 0xFD, 0xA0, 0x59, 0x85, 0xC5, 0x06, 0x0C, 0xBF, 0xD5, 0x17, + 0xA1, 0x48, 0x99, 0x63, 0xEE, 0xF0, 0x7D, 0xAE, 0x3A, 0x7C, 0x6A, 0x7C, + 0xB4, 0xDA, 0xDB, 0x1A, 0xED, 0x70, 0xF9, 0x4D, 0xD2, 0xA4, 0x09, 0xE4, + 0xFA, 0x4B, 0x95, 0xDD, 0x95, 0x7B, 0x3D, 0xD1, 0x52, 0xDB, 0x59, 0x68, + 0xFF, 0xE5, 0x13, 0x39, 0xE5, 0x01, 0x12, 0x7F, 0x9A, 0x0E, 0xFF, 0x35, + 0x75, 0x6A, 0x56, 0xEA, 0x66, 0x91, 0xF7, 0x3E, 0x71, 0x86, 0x6C, 0xC3, + 0x11, 0x1B, 0x04, 0x4C, 0x98, 0x13, 0xA1, 0x35, 0x23, 0x96, 0xC9, 0x8C, + 0xFB, 0x43, 0x96, 0x4B, 0xC0, 0x1F, 0x30, 0x95, 0xAA, 0x8B, 0x27, 0x16, + 0x6C, 0x91, 0x0D, 0x62, 0xAB, 0x87, 0x1A, 0xDA, 0x61, 0xB1, 0x2E, 0xBC, + 0x19, 0xA8, 0xF0, 0x32, 0xD7, 0x06, 0x6F, 0x82, 0xFD, 0x5F, 0xF1, 0x08, + 0x5E, 0x97, 0x83, 0xEF, 0xB0, 0x91, 0xC2, 0xE6, 0x37, 0x47, 0xFC, 0xD1, + 0xE7, 0x6C, 0xC1, 0x1A, 0xAF, 0x91, 0xDF, 0x5C, 0x2D, 0x1B, 0xBC, 0x6A, + 0x10, 0xAC, 0xAE, 0x2C, 0x34, 0xCD, 0xD2, 0x6B, 0x15, 0x07, 0xEA, 0xD0, + 0x6C, 0x3E, 0x19, 0x14, 0xEF, 0x35, 0xA4, 0x2B, 0x17, 0xF8, 0x2F, 0x48, + 0x0D, 0x5C, 0x70, 0xE2, 0xFF, 0x94, 0x2B, 0x59, 0x3C, 0xDE, 0x2F, 0x14, + 0x84, 0x5F, 0x0F, 0xF3, 0xA0, 0xFC, 0x40, 0xBE, 0xFA, 0xAE, 0x97, 0xC7, + 0xC6, 0xF3, 0xB5, 0xC2, 0x50, 0xBB, 0xA3, 0xB8, 0xC1, 0x7D, 0x6B, 0xE9, + 0x87, 0x98, 0x8B, 0xBE, 0x19, 0xA5, 0xAC, 0xB1, 0x8D, 0x6C, 0x67, 0x94, + 0x95, 0x7C, 0x60, 0xCC, 0x0B, 0x75, 0x24, 0xB9, 0x54, 0x7D, 0xD4, 0x4D, + 0x9B, 0xF2, 0xA6, 0xFB, 0xC0, 0x78, 0x38, 0x90, 0x19, 0x5A, 0x62, 0x85, + 0x3A, 0x34, 0xD8, 0xCD, 0xA1, 0xA5, 0xD9, 0xC0, 0xC5, 0xB3, 0x6E, 0x26, + 0x13, 0xCF, 0x7C, 0xC1, 0x50, 0x6D, 0x80, 0xCE, 0xF9, 0xA7, 0xFE, 0x2F, + 0x14, 0x53, 0x03, 0x0E, 0xFE, 0xB4, 0xA2, 0x75, 0x0A, 0xB4, 0xD9, 0xDB, + 0xEA, 0xBC, 0xF1, 0xB0, 0x8E, 0xE5, 0x33, 0x49, 0x16, 0xCD, 0x3B, 0x7C, + 0x3B, 0x31, 0x51, 0x8D, 0xF2, 0x12, 0xDB, 0x09, 0xA7, 0x06, 0x7E, 0x66, + 0x09, 0x77, 0xA2, 0x3E, 0xB9, 0xA2, 0xA2, 0xEE, 0xFB, 0x9E, 0x84, 0xF1, + 0x77, 0x28, 0xB1, 0x02, 0xF4, 0xE9, 0x74, 0x56, 0x3D, 0x6F, 0x83, 0x2F, + 0xDE, 0x50, 0x4F, 0xAA, 0x2C, 0xC9, 0x8A, 0x71, 0x45, 0xE1, 0x79, 0x4D, + 0x9B, 0xC0, 0xC0, 0x8B, 0x33, 0x7D, 0x3F, 0x07, 0x2B, 0x4C, 0x16, 0x4F, + 0xD1, 0xFB, 0x28, 0xB8, 0x7B, 0xF2, 0x4F, 0xA8, 0x56, 0x84, 0xDF, 0x61, + 0xEC, 0x1F, 0x4D, 0x95, 0xC5, 0xD7, 0x90, 0x4D, 0x38, 0x35, 0xE5, 0x96, + 0xBA, 0x6D, 0x31, 0xAE, 0xE7, 0xAC, 0xE6, 0xDD, 0x05, 0x5E, 0xD4, 0xF5, + 0x47, 0x5B, 0xEA, 0xA3, 0x36, 0x7C, 0x58, 0x04, 0x41, 0x3C, 0xEC, 0xC6, + 0x70, 0x59, 0xEC, 0x4D, 0xE3, 0x80, 0x59, 0x6D, 0xA1, 0x3A, 0x31, 0xA1, + 0x50, 0xB7, 0x10, 0xC0, 0xC4, 0x47, 0x87, 0xAB, 0xEA, 0x4B, 0xFD, 0xF6, + 0x5C, 0xA8, 0x62, 0x40, 0x3E, 0x89, 0x1D, 0xE1, 0x9B, 0x04, 0x1F, 0x22, + 0x2B, 0xAF, 0x0B, 0xFC, 0xD1, 0x64, 0x4B, 0xCE, 0xC4, 0xF9, 0x19, 0xF4, + 0x21, 0x95, 0xBA, 0xC0, 0x77, 0x4B, 0xFC, 0x15, 0xC7, 0x6F, 0xF7, 0x70, + 0x8E, 0xE2, 0xDF, 0xFE, 0x48, 0xA9, 0x17, 0xA2, 0xAB, 0xA5, 0xFC, 0x2A, + 0x72, 0x08, 0xFF, 0xBC, 0x56, 0xFC, 0xAF, 0xFF, 0x47, 0xEC, 0xCE, 0x29, + 0x17, 0xAE, 0x2D, 0xB3, 0xB3, 0x5F, 0x93, 0x9D, 0x57, 0x2A, 0xF4, 0xDE, + 0xDD, 0xE4, 0xE6, 0x43, 0x73, 0xCA, 0x00, 0x16, 0xB8, 0xD7, 0x15, 0x67, + 0xEB, 0x33, 0x6C, 0xCE, 0x0C, 0xFA, 0x8F, 0xF1, 0x08, 0x6E, 0xC0, 0x3F, + 0xAF, 0x30, 0x9F, 0x2A, 0x98, 0x4C, 0x03, 0x1C, 0x88, 0x7D, 0xBF, 0x7A, + 0xB1, 0xAE, 0x51, 0x69, 0x6D, 0xE9, 0x67, 0x8F, 0x73, 0x3A, 0xB9, 0x58, + 0x9B, 0xB0, 0xE6, 0x14, 0xB2, 0x04, 0x57, 0x85, 0x6E, 0x09, 0x84, 0x53, + 0x1F, 0x6D, 0xAA, 0xD1, 0x42, 0xCA, 0xFA, 0x8D, 0xB5, 0xAA, 0xD6, 0xDC, + 0x9A, 0xC1, 0x90, 0x69, 0x5A, 0xB7, 0xB8, 0x75, 0xD4, 0xD8, 0x5E, 0x2B, + 0x5E, 0xB5, 0x73, 0x4B, 0x42, 0x2D, 0x5C, 0x4C, 0x58, 0x9E, 0xF1, 0xE0, + 0x18, 0x51, 0x5B, 0x68, 0xEA, 0x4E, 0x92, 0x98, 0x62, 0x6C, 0xF8, 0x68, + 0xA8, 0x92, 0x48, 0x8E, 0x2B, 0x11, 0xC7, 0xC5, 0x8E, 0x3A, 0x3C, 0xFF, + 0xB3, 0x93, 0x32, 0xA8, 0x55, 0x94, 0x0E, 0xA1, 0x78, 0x7E, 0x3D, 0xD2, + 0xF0, 0xA2, 0x27, 0x1B, 0x8F, 0x14, 0x73, 0x0B, 0xE7, 0xC9, 0xBE, 0xE5, + 0x49, 0xCF, 0x26, 0xE2, 0xC0, 0x5E, 0x51, 0xE5, 0xAC, 0x32, 0x45, 0x37, + 0x6A, 0x4C, 0xF9, 0xCC, 0x6C, 0x0A, 0x0B, 0xEE, 0x1C, 0x5B, 0x7D, 0xE8, + 0xDF, 0x83, 0x96, 0x0E, 0x7D, 0x6E, 0x87, 0x2D, 0x4A, 0xA8, 0x00, 0x7C, + 0xE9, 0xE2, 0x1A, 0xE7, 0x9E, 0x9D, 0x09, 0x99, 0xA5, 0xB6, 0x46, 0x4D, + 0xDE, 0xD7, 0xA9, 0x9B, 0x13, 0xA5, 0xC9, 0xB1, 0x6E, 0xDC, 0xF6, 0x42, + 0x20, 0x08, 0x86, 0xFE, 0x8A, 0x3E, 0x42, 0x42, 0x33, 0x0B, 0x54, 0xD1, + 0xB9, 0x97, 0x86, 0x03, 0xC9, 0xA7, 0x20, 0x0B, 0x09, 0x46, 0x0C, 0xCF, + 0x6B, 0x7B, 0x74, 0x95, 0xFE, 0xC0, 0x24, 0x8D, 0x12, 0xBD, 0xC9, 0x60, + 0x48, 0x2F, 0x02, 0x77, 0x5C, 0x5F, 0x86, 0xA9, 0x39, 0xB3, 0x7C, 0x77, + 0x10, 0xCE, 0xE9, 0xB4, 0x61, 0x63, 0x63, 0x39, 0x86, 0x89, 0x97, 0x4A, + 0xD3, 0x16, 0x51, 0x1F, 0x8E, 0xFC, 0xF0, 0x51, 0xF4, 0x5D, 0x62, 0x73, + 0xF3, 0x47, 0x82, 0x04, 0xF0, 0xD8, 0xD8, 0xD5, 0x16, 0x63, 0x96, 0xBE, + 0xF5, 0xB5, 0x4A, 0x70, 0xCB, 0x8B, 0x23, 0xF5, 0xB0, 0xEE, 0x0F, 0xFA, + 0xC7, 0x9A, 0xA5, 0xB1, 0x6B, 0x39, 0x53, 0x90, 0xAF, 0xF8, 0x9F, 0xCC, + 0x99, 0xE4, 0x65, 0x7A, 0x69, 0xBD, 0x2B, 0x1F, 0x27, 0x3F, 0x87, 0x69, + 0x2D, 0x1E, 0x9F, 0xC2, 0x96, 0xE9, 0x64, 0xEC, 0xF8, 0x34, 0x30, 0xA1, + 0xC3, 0xAF, 0x77, 0x55, 0x42, 0x30, 0xA7, 0x8E, 0x35, 0x12, 0xBF, 0x1C, + 0xA3, 0x1F, 0x74, 0x43, 0x41, 0xD5, 0x35, 0xC9, 0x02, 0x6E, 0xB9, 0x3C, + 0x12, 0x6D, 0x23, 0x3B, 0xD6, 0xCB, 0x2D, 0x01, 0xCA, 0x96, 0xCB, 0x36, + 0xCD, 0x65, 0x81, 0x04, 0xDA, 0x83, 0xB2, 0x8E, 0x32, 0xB7, 0x85, 0xAE, + 0x7F, 0xC2, 0x2F, 0x05, 0xFE, 0x0C, 0x29, 0x9D, 0x21, 0x8D, 0x9E, 0xED, + 0x9A, 0x45, 0xCD, 0xD6, 0xC1, 0xC5, 0x22, 0xAF, 0x4B, 0xFD, 0xED, 0xEE, + 0x34, 0xA4, 0xD7, 0x51, 0xFE, 0x05, 0x20, 0xE0, 0x25, 0xBF, 0x4D, 0xCE, + 0xCE, 0x8B, 0xC6, 0xBA, 0xF2, 0x8C, 0x13, 0xF2, 0xA5, 0x50, 0xC9, 0xC7, + 0x69, 0x64, 0xA7, 0x9F, 0x42, 0xD4, 0x82, 0xA8, 0x1A, 0x65, 0x36, 0xBD, + 0xF8, 0x42, 0x98, 0x41, 0x76, 0x32, 0x34, 0x19, 0x1C, 0xC9, 0x3E, 0x08, + 0x43, 0xB2, 0x1F, 0xE4, 0x3B, 0x17, 0x75, 0x8F, 0x6A, 0x66, 0xFA, 0xF0, + 0x63, 0xC5, 0xA0, 0x96, 0x0B, 0x9C, 0xB8, 0xA1, 0x76, 0xDE, 0xEC, 0xB2, + 0x8B, 0x28, 0xC0, 0xAC, 0x99, 0x7E, 0x4B, 0x36, 0x50, 0xD1, 0xBC, 0xE6, + 0xBA, 0xEE, 0x8B, 0x4C, 0x5A, 0xD7, 0xD4, 0x59, 0x4B, 0xE2, 0x96, 0xC5, + 0x29, 0xFC, 0xE2, 0x22, 0xE1, 0x90, 0x64, 0x4F, 0xBA, 0x52, 0x20, 0x11, + 0x96, 0x5B, 0x1D, 0x92, 0xC9, 0x6F, 0x32, 0x8E, 0x2D, 0x21, 0xEC, 0xA0, + 0xDE, 0x49, 0xBA, 0x44, 0xB7, 0x86, 0xCE, 0xA8, 0x5D, 0xB0, 0xB2, 0x80, + 0x14, 0x64, 0x2E, 0xA0, 0x3D, 0xB2, 0x17, 0xE2, 0xD3, 0x83, 0x09, 0x30, + 0x26, 0x32, 0x90, 0x8D, 0x41, 0x1F, 0x18, 0x47, 0xC0, 0xC2, 0x35, 0x47, + 0xA1, 0xE5, 0x83, 0x68, 0x96, 0x4E, 0x84, 0x9C, 0x2F, 0x0E, 0x64, 0xBA, + 0x07, 0x18, 0x50, 0xFE, 0x1B, 0xF2, 0xD7, 0xED, 0x05, 0x3A, 0x1A, 0xE8, + 0xC9, 0x89, 0xCE, 0xC0, 0x45, 0x19, 0xB4, 0x3F, 0x98, 0x08, 0xAB, 0x2D, + 0x32, 0xE8, 0x36, 0x58, 0x14, 0xBA, 0xF1, 0x28, 0x37, 0x4D, 0xA0, 0x51, + 0x53, 0xA6, 0xAE, 0xDA, 0x5D, 0xF0, 0xEC, 0x51, 0xDA, 0x22, 0xDB, 0xEB, + 0x6A, 0x79, 0xC6, 0x63, 0x3B, 0x03, 0x1A, 0xF7, 0x8F, 0x87, 0xBB, 0x7B, + 0x85, 0x56, 0x5E, 0x99, 0xCD, 0xFA, 0x4A, 0x6C, 0x13, 0xCF, 0x55, 0x8E, + 0x90, 0xE7, 0xB1, 0x6B, 0x73, 0xF3, 0x44, 0xAF, 0xDB, 0x05, 0xAB, 0x6B, + 0xEF, 0x34, 0x56, 0xF8, 0xAC, 0x76, 0xC4, 0xD0, 0xF7, 0xE9, 0x12, 0xF6, + 0xF1, 0x7B, 0xB9, 0x27, 0x4D, 0xF6, 0xBF, 0x3A, 0xC9, 0x25, 0xD1, 0x08, + 0xF0, 0xE1, 0x0F, 0xF0, 0x0E, 0x1D, 0xBC, 0x31, 0x09, 0x2A, 0x58, 0x37, + 0xC1, 0x25, 0x45, 0x7E, 0x9D, 0x15, 0xEA, 0x53, 0x8B, 0xE9, 0x27, 0x7C, + 0xB1, 0xEC, 0x0A, 0xC0, 0x36, 0x64, 0xBB, 0xC3, 0x2F, 0xB7, 0xD3, 0x95, + 0x24, 0x7D, 0xEA, 0x35, 0x42, 0xDF, 0x48, 0xF5, 0x23, 0x2E, 0xF1, 0x7F, + 0xE8, 0x4A, 0x4E, 0x7B, 0x38, 0xB5, 0xD8, 0x13, 0xE4, 0x73, 0x31, 0x50, + 0x9D, 0x21, 0xE1, 0xD9, 0xDC, 0xF5, 0x87, 0x6F, 0xC1, 0xBC, 0x9F, 0xF5, + 0x1A, 0xEB, 0x61, 0x92, 0xD8, 0x10, 0x88, 0x2B, 0xC7, 0x48, 0x3E, 0xC6, + 0x2E, 0x9B, 0xF4, 0x20, 0x4D, 0x10, 0x5C, 0x45, 0xA2, 0x82, 0x87, 0xBE, + 0x96, 0x54, 0xEA, 0xE7, 0x53, 0xDC, 0x35, 0x36, 0xAD, 0x48, 0x98, 0xD8, + 0xD2, 0x37, 0x0A, 0x82, 0xF7, 0x55, 0x8C, 0x28, 0x01, 0x68, 0x9C, 0x8E, + 0xE0, 0x44, 0x2A, 0xD5, 0x09, 0x95, 0x8F, 0x2D, 0xD7, 0xE7, 0x26, 0xB9, + 0xDC, 0x7D, 0x00, 0x0B, 0x5A, 0xDB, 0x30, 0xDC, 0x58, 0x3F, 0x53, 0x6D, + 0x14, 0xBA, 0x5C, 0x4B, 0x3E, 0xB1, 0x7F, 0x3C, 0xF8, 0x2E, 0x49, 0xB3, + 0x7F, 0x05, 0x44, 0xC6, 0x44, 0x5D, 0x83, 0xFC, 0xD7, 0x15, 0x3F, 0xA3, + 0x55, 0x60, 0x15, 0x13, 0x38, 0xBD, 0x9C, 0x3B, 0xFE, 0xF3, 0x68, 0x06, + 0xD8, 0xF1, 0x7C, 0x19, 0xB4, 0x01, 0xAB, 0x5C, 0x81, 0xBC, 0x69, 0xAD, + 0xF5, 0xB2, 0xF6, 0x58, 0xFB, 0x03, 0xE3, 0x79, 0xE5, 0xC3, 0x63, 0xDB, + 0x23, 0xA5, 0xD8, 0xE9, 0x32, 0xCE, 0xA0, 0x56, 0xD6, 0xFD, 0x53, 0xA0, + 0xA5, 0xB4, 0x1D, 0xE9, 0x44, 0x19, 0x27, 0xEE, 0x3C, 0xE7, 0x5D, 0x11, + 0x14, 0x7B, 0x56, 0xEA, 0x16, 0xB8, 0x2A, 0x4B, 0x7E, 0x7C, 0x6D, 0x7D, + 0xD1, 0x8F, 0x72, 0xFB, 0x75, 0x8F, 0x12, 0x5C, 0x6D, 0x1C, 0xBF, 0x40, + 0xD7, 0x8E, 0x30, 0x09, 0xAB, 0xAE, 0xB3, 0x7D, 0x34, 0x23, 0xCD, 0xA8, + 0x69, 0xB7, 0xD7, 0x78, 0x75, 0x14, 0x82, 0xD5, 0x36, 0x12, 0x9B, 0x70, + 0x3E, 0x94, 0xE7, 0xA5, 0x2E, 0xF4, 0x44, 0x48, 0x82, 0x47, 0xCF, 0xE9, + 0xA1, 0x21, 0x28, 0x60, 0x4C, 0x60, 0x4A, 0xDB, 0xC6, 0x25, 0x0B, 0xF3, + 0x5B, 0x5C, 0x34, 0x7B, 0x6B, 0x8F, 0x1D, 0x6C, 0xCD, 0xA5, 0x03, 0x62, + 0x24, 0xB5, 0x4E, 0x8F, 0x1B, 0x80, 0x61, 0x19, 0x52, 0x95, 0xC8, 0x46, + 0xEF, 0x57, 0xB6, 0x8F, 0x0C, 0xE3, 0xA1, 0xD6, 0x08, 0x16, 0xC8, 0x20, + 0x3C, 0x13, 0x93, 0x42, 0xDE, 0xE4, 0xE2, 0x28, 0xAC, 0x62, 0xA4, 0xCC, + 0x28, 0x83, 0xB0, 0xF9, 0xEB, 0xD8, 0x51, 0xA9, 0x13, 0x3C, 0x53, 0x73, + 0x7A, 0x9D, 0xB5, 0xC4, 0xFA, 0xC8, 0x0D, 0xB8, 0x66, 0x15, 0x8E, 0x65, + 0x79, 0x08, 0xC9, 0x6E, 0x65, 0xC5, 0x09, 0x9B, 0x20, 0x7D, 0xC0, 0xBE, + 0xCC, 0xC3, 0x60, 0xA5, 0x10, 0xBD, 0xC9, 0x50, 0xCE, 0xE2, 0xAF, 0x16, + 0xD7, 0xE0, 0xAC, 0x17, 0x78, 0x35, 0x2A, 0x0A, 0xAF, 0x4C, 0x2C, 0x78, + 0x78, 0x3E, 0xF4, 0x7A, 0xB2, 0x63, 0xD4, 0xBD, 0x4B, 0xC2, 0x8C, 0x0C, + 0x5C, 0x57, 0xBA, 0x90, 0x5C, 0x2D, 0xDB, 0x79, 0xCE, 0x4B, 0x83, 0xB6, + 0x3C, 0xB0, 0x7B, 0xFA, 0x7B, 0x05, 0xAD, 0x0B, 0xA0, 0xF5, 0xBD, 0x24, + 0x42, 0x69, 0x2D, 0xE4, 0x9B, 0x67, 0xB9, 0xBD, 0x6E, 0x18, 0x61, 0xE6, + 0x30, 0x62, 0x01, 0xBB, 0x88, 0xB6, 0xC2, 0x6A, 0x09, 0x87, 0x2C, 0xB9, + 0xC6, 0x11, 0x54, 0xC5, 0x19, 0xA3, 0xBC, 0x54, 0xDD, 0x2C, 0x13, 0xDD, + 0xA1, 0xD2, 0x4D, 0x79, 0x2A, 0xE0, 0x89, 0xB0, 0x3B, 0xC1, 0xF4, 0xB8, + 0xCC, 0x7A, 0xF8, 0x90, 0xC2, 0xEF, 0x2F, 0x1E, 0xEC, 0xBB, 0xDC, 0x8A, + 0x82, 0x9E, 0x94, 0x04, 0x30, 0x1E, 0x33, 0x66, 0x8F, 0x22, 0x47, 0xE4, + 0x80, 0x6A, 0x70, 0x87, 0x47, 0x95, 0x5D, 0x7F, 0x10, 0x66, 0x7D, 0x94, + 0xDB, 0xB2, 0xD2, 0xA6, 0x10, 0xE0, 0xBE, 0x01, 0xB2, 0x5A, 0xB2, 0x66, + 0x01, 0xA2, 0xA1, 0x4E, 0xB5, 0xD5, 0xBE, 0x52, 0x88, 0x11, 0xB0, 0x45, + 0xB6, 0xA4, 0x0B, 0xEE, 0x50, 0x45, 0x0C, 0x9D, 0x3F, 0xA3, 0x4C, 0xEC, + 0x63, 0x6D, 0x99, 0x6C, 0x30, 0x7F, 0xB1, 0x27, 0x38, 0xB7, 0xBC, 0x41, + 0x49, 0x08, 0x7E, 0xBE, 0x84, 0x9C, 0x3C, 0x5C, 0xBA, 0x19, 0xA3, 0x00, + 0xB1, 0x1F, 0xD4, 0x1B, 0x80, 0x9D, 0xA2, 0xFC, 0xCA, 0x70, 0xFF, 0x15, + 0x02, 0x60, 0x69, 0x12, 0x64, 0x40, 0x1D, 0xF1, 0x65, 0x12, 0x52, 0x64, + 0x3A, 0xAC, 0x44, 0xE2, 0x9D, 0xE3, 0x8C, 0x50, 0xD5, 0x59, 0x7E, 0x1A, + 0xE0, 0x26, 0x72, 0xB5, 0x52, 0xB4, 0x79, 0xB9, 0x93, 0x41, 0xA2, 0xC9, + 0x5D, 0x9E, 0x65, 0x70, 0x83, 0x2D, 0x3A, 0x93, 0xE4, 0xDE, 0xC3, 0x40, + 0x35, 0xA2, 0x86, 0x3D, 0x9D, 0x0A, 0x9E, 0x11, 0xEA, 0x81, 0xDB, 0x3B, + 0x99, 0xCB, 0x46, 0xD3, 0x6B, 0x49, 0xB6, 0xDA, 0xE8, 0xF1, 0xB5, 0xA4, + 0x52, 0x15, 0x39, 0xAE, 0xBF, 0xA7, 0xDB, 0xEE, 0xDF, 0x41, 0x24, 0x98, + 0xED, 0xF3, 0x0D, 0x12, 0xBE, 0x59, 0x4E, 0x09, 0xF8, 0x50, 0xDE, 0xE2, + 0x36, 0x9A, 0x12, 0xC4, 0x12, 0xF2, 0xF1, 0xF8, 0x58, 0xC8, 0x86, 0x14, + 0xE1, 0x39, 0x3B, 0x9A, 0xFB, 0x46, 0x7B, 0x98, 0x0D, 0x26, 0xBC, 0xA3, + 0x54, 0xEA, 0x01, 0x72, 0x68, 0x73, 0x2F, 0xD5, 0x08, 0x3B, 0xF3, 0x7B, + 0x7A, 0x9F, 0xDB, 0x29, 0x11, 0x3B, 0xF0, 0x07, 0x4C, 0x46, 0x10, 0xDF, + 0xA0, 0x9D, 0x0A, 0xD8, 0x08, 0x1A, 0x7B, 0xD1, 0xE1, 0x9A, 0x83, 0x77, + 0x1A, 0x2F, 0x1A, 0x16, 0x77, 0x22, 0x75, 0x98, 0xED, 0x70, 0x40, 0x54, + 0x9A, 0x15, 0x56, 0x32, 0x93, 0xC9, 0xA2, 0xD1, 0x48, 0x54, 0x8F, 0xEF, + 0x07, 0x43, 0x4D, 0x9E, 0xC7, 0x07, 0x32, 0x6C, 0x6E, 0xAC, 0x79, 0x8C, + 0x6E, 0x1A, 0x48, 0x99, 0xBC, 0x6A, 0x0D, 0x19, 0x47, 0x5B, 0x1C, 0x3E, + 0x18, 0xCA, 0x54, 0x6A, 0x7F, 0xA4, 0xAB, 0xD3, 0x2B, 0x86, 0xD1, 0x1B, + 0x32, 0xCB, 0x8C, 0x12, 0x1C, 0x0D, 0x28, 0x52, 0xD1, 0x02, 0x47, 0x22, + 0xD2, 0xD4, 0x79, 0xDD, 0xB9, 0x8C, 0x49, 0xD0, 0x26, 0x94, 0xAE, 0x0E, + 0xC1, 0xA3, 0x27, 0x6F, 0x87, 0x5D, 0x30, 0xED, 0xFB, 0x30, 0x13, 0x23, + 0x9C, 0xC3, 0x10, 0x5D, 0x8F, 0x8A, 0x9D, 0xD8, 0x91, 0xC2, 0xA5, 0x70, + 0x8C, 0xC4, 0x56, 0xD0, 0x43, 0xE7, 0xAB, 0x40, 0xD4, 0x8F, 0xBE, 0x1B, + 0xE4, 0xD5, 0xD2, 0xC5, 0x83, 0x8C, 0x27, 0xE9, 0x3B, 0x4F, 0xDB, 0xF4, + 0x79, 0xCA, 0x91, 0x89, 0xF3, 0x78, 0xEB, 0x40, 0x25, 0x80, 0x73, 0xB6, + 0x49, 0x8F, 0x76, 0x74, 0x70, 0xD4, 0x70, 0xDC, 0x77, 0x2F, 0xDD, 0xC2, + 0x1B, 0x12, 0xB1, 0xA1, 0x3F, 0xC5, 0xAC, 0x70, 0x22, 0x1F, 0xB4, 0x8E, + 0x36, 0xC2, 0x5E, 0x93, 0x51, 0x42, 0x93, 0xEB, 0x26, 0x13, 0xDC, 0x38, + 0x03, 0x68, 0xF6, 0xE1, 0x77, 0x3C, 0x81, 0x07, 0xD4, 0x55, 0x70, 0x56, + 0x25, 0x0A, 0x08, 0x36, 0x6F, 0x99, 0xFE, 0x12, 0xDC, 0xA1, 0x35, 0x19, + 0x30, 0xAA, 0x84, 0xB5, 0xE6, 0xF6, 0x23, 0x81, 0xC4, 0x7D, 0x95, 0x35, + 0x4C, 0xD5, 0xFA, 0x12, 0xB4, 0x09, 0x20, 0x00, 0x5C, 0x15, 0xB2, 0xDD, + 0x8B, 0x77, 0x2F, 0x97, 0xDD, 0xFD, 0x4E, 0xEF, 0x20, 0x3F, 0x0F, 0x0C, + 0xA6, 0xE3, 0x40, 0x12, 0xA3, 0xD1, 0x18, 0x0F, 0x88, 0x16, 0x97, 0x48, + 0x6B, 0x76, 0x10, 0xE8, 0x4A, 0x91, 0xA4, 0x9C, 0x05, 0x88, 0xA8, 0xC7, + 0x2B, 0x3A, 0xAB, 0x87, 0xE1, 0x51, 0x21, 0xE5, 0x7B, 0xD4, 0x78, 0xB7, + 0x4C, 0x35, 0x7C, 0x0A, 0x27, 0x63, 0xA8, 0x15, 0xCF, 0xB8, 0xEE, 0x00, + 0x5C, 0xD5, 0x9F, 0x40, 0x5B, 0x8A, 0xEC, 0xA3, 0xFA, 0x64, 0x73, 0xE2, + 0x8E, 0x5E, 0x1F, 0x69, 0x0C, 0xD4, 0x0A, 0x95, 0x2E, 0x62, 0xD6, 0xB1, + 0x7B, 0x51, 0x3E, 0x54, 0x7C, 0x51, 0x00, 0xF2, 0xF0, 0x49, 0xD2, 0xB2, + 0x13, 0xF6, 0x1E, 0x37, 0xC4, 0xE8, 0x2A, 0xC2, 0x5D, 0x50, 0xCE, 0x31, + 0xDD, 0x4F, 0x5E, 0x94, 0x8A, 0x33, 0xF3, 0x52, 0xDC, 0x9E, 0xBE, 0x1B, + 0xE9, 0xA2, 0x97, 0xF4, 0x4A, 0xC0, 0xCA, 0x26, 0x24, 0x2B, 0x94, 0xA3, + 0xBF, 0x41, 0xD5, 0x1E, 0x06, 0xFC, 0x74, 0x34, 0xCA, 0x2A, 0x61, 0x3C, + 0xB2, 0x22, 0xD9, 0x24, 0xF9, 0x8C, 0x37, 0x3E, 0x48, 0x1D, 0xAA, 0xBE, + 0x9F, 0x0F, 0x93, 0x14, 0x94, 0x3A, 0x44, 0x7F, 0x47, 0x7A, 0x1D, 0x07, + 0x33, 0x4F, 0x86, 0x39, 0xF3, 0xD5, 0x23, 0xAF, 0x83, 0xF0, 0xCC, 0xFA, + 0xDA, 0x86, 0x5F, 0x6B, 0x28, 0x77, 0xF2, 0x28, 0x78, 0xFF, 0x7B, 0xB9, + 0xB9, 0x9B, 0xF7, 0x45, 0x46, 0x86, 0x12, 0xED, 0xB0, 0x93, 0x89, 0x7B, + 0xFF, 0xE8, 0x93, 0xB7, 0xAD, 0x08, 0xBC, 0xB2, 0xE9, 0x53, 0xFB, 0x78, + 0xD6, 0xAD, 0xB3, 0x0D, 0x9F, 0xEC, 0x97, 0x49, 0xA6, 0x43, 0xAB, 0xBE, + 0x5E, 0xF9, 0x9D, 0xA0, 0xAE, 0x1D, 0x7C, 0x05, 0xB7, 0x2B, 0x60, 0x3A, + 0x61, 0xE3, 0x69, 0xA8, 0xBA, 0x6F, 0xD5, 0x9E, 0x23, 0x8E, 0x0C, 0x99, + 0x03, 0x24, 0xE9, 0xDC, 0x52, 0xC5, 0x74, 0xE9, 0x14, 0x1F, 0x71, 0x5C, + 0x91, 0x61, 0x6D, 0x2F, 0xB2, 0xA8, 0xCE, 0x88, 0xBE, 0x8E, 0x73, 0x44, + 0xF4, 0x53, 0x9B, 0x19, 0x0A, 0xEC, 0xBE, 0x54, 0xF6, 0x31, 0x00, 0x91, + 0xE9, 0x39, 0x72, 0x0E, 0x07, 0x6A, 0xE9, 0x46, 0x5E, 0xF8, 0xF8, 0x3B, + 0x30, 0x60, 0x8E, 0xD0, 0xBC, 0x05, 0x1E, 0xF5, 0xEE, 0x33, 0x6A, 0xFA, + 0x54, 0xCD, 0x4E, 0x8B, 0xCF, 0xEC, 0xD9, 0x9F, 0x53, 0x3A, 0xEF, 0x21, + 0xC3, 0x6F, 0x09, 0xF8, 0x67, 0xFD, 0x3E, 0x70, 0xE6, 0x6F, 0x63, 0x99, + 0xE5, 0x4F, 0xD6, 0x70, 0xED, 0xFB, 0x3B, 0xD9, 0xFF, 0xAA, 0x30, 0x5C, + 0xBE, 0xB2, 0x28, 0x78, 0xE4, 0xB5, 0x26, 0x82, 0x03, 0x86, 0xB9, 0xDB, + 0x9D, 0xBD, 0x99, 0xD8, 0xF2, 0x70, 0x9C, 0x9D, 0x6C, 0x81, 0xFC, 0xF8, + 0x2B, 0x5E, 0xD4, 0x85, 0x95, 0x62, 0xEB, 0xFA, 0xEB, 0x5A, 0x09, 0xC6, + 0x14, 0x51, 0xE2, 0x43, 0x62, 0xE9, 0x69, 0x31, 0xB1, 0x7B, 0x8F, 0xA6, + 0x4D, 0x76, 0xD5, 0x8C, 0xF1, 0xB2, 0xD5, 0x07, 0x17, 0x21, 0x64, 0x23, + 0xCA, 0x68, 0xF8, 0x60, 0xFF, 0x15, 0x7D, 0xB8, 0xCE, 0xBA, 0xF3, 0x92, + 0x77, 0x04, 0x2F, 0x38, 0x99, 0x1A, 0xF7, 0x91, 0xC9, 0x0C, 0x99, 0x0F, + 0x3A, 0x58, 0x7D, 0x31, 0x01, 0xCB, 0x10, 0xBD, 0xC0, 0xAD, 0x4D, 0x37, + 0x6C, 0x87, 0x3E, 0x9B, 0x4B, 0xE2, 0x68, 0x72, 0x8C, 0x40, 0xED, 0x6F, + 0xD6, 0xC1, 0x8B, 0xA0, 0x82, 0xA7, 0x72, 0x73, 0x79, 0x8A, 0xC9, 0xFB, + 0x57, 0xEE, 0xFA, 0x5D, 0x15, 0x53, 0x2F, 0x81, 0x66, 0x7E, 0xC1, 0x4E, + 0xEF, 0x23, 0xC2, 0xB5, 0x76, 0x61, 0xC1, 0xAC, 0x55, 0x01, 0x72, 0xB6, + 0x2E, 0xC9, 0x56, 0x30, 0x73, 0x77, 0xFE, 0x6F, 0x0F, 0x4F, 0xD4, 0xA3, + 0xA0, 0x51, 0xC1, 0xEC, 0xE9, 0xF8, 0x16, 0x7A, 0x22, 0x9F, 0x55, 0xDA, + 0xA9, 0xC0, 0x31, 0x84, 0xC0, 0x3F, 0x3A, 0x57, 0x9D, 0x41, 0x9B, 0x4A, + 0x5E, 0x84, 0x19, 0xE5, 0x93, 0xC8, 0xAE, 0xFA, 0x91, 0xD8, 0xB8, 0x98, + 0x67, 0xB2, 0x8C, 0x37, 0x4B, 0x4C, 0xAA, 0xF9, 0x7C, 0xCD, 0x67, 0x50, + 0xB2, 0x83, 0x19, 0x88, 0x89, 0xE9, 0xD1, 0xD1, 0x29, 0xA8, 0x9C, 0x94, + 0x24, 0x65, 0x1D, 0xF4, 0x67, 0x9A, 0xF3, 0x91, 0xB2, 0x3B, 0xAB, 0x94, + 0xE9, 0x8C, 0x16, 0xD6, 0x58, 0x17, 0x18, 0x72, 0xB2, 0xBD, 0xCD, 0x1B, + 0x4B, 0x8A, 0x32, 0x70, 0xDC, 0xFC, 0x97, 0x54, 0x73, 0x25, 0x74, 0x9B, + 0xF3, 0x90, 0x0C, 0x04, 0xDD, 0x7C, 0x1A, 0xA8, 0xD7, 0x33, 0xCD, 0xE6, + 0x88, 0xAF, 0x8E, 0x96, 0xD1, 0xE9, 0xFF, 0xCE, 0xEE, 0x3C, 0x1A, 0x42, + 0xA5, 0xB2, 0x56, 0xB3, 0x99, 0xA3, 0x8E, 0xED, 0x2D, 0xE7, 0xAE, 0xB0, + 0x2E, 0x3C, 0xC6, 0x7C, 0xAA, 0xA3, 0x3F, 0xC7, 0xD2, 0x79, 0x04, 0x98, + 0x9A, 0xC0, 0xA4, 0x6A, 0xDC, 0x64, 0x49, 0x24, 0x4F, 0x8B, 0xFA, 0x86, + 0x45, 0x17, 0xE8, 0x7E, 0xF5, 0xD3, 0x8A, 0x56, 0x76, 0xBF, 0x95, 0x50, + 0xE2, 0x4A, 0xE1, 0x3F, 0xF2, 0x50, 0x5E, 0x8F, 0x99, 0x2C, 0xE7, 0xB9, + 0x10, 0x6C, 0x99, 0x7C, 0x39, 0x6C, 0xA3, 0x39, 0xAB, 0x0B, 0xF0, 0x84, + 0x82, 0x7C, 0xD6, 0x59, 0x21, 0x5B, 0x85, 0xFD, 0xFC, 0xF9, 0x15, 0xC2, + 0x35, 0x02, 0x52, 0xD2, 0x16, 0x20, 0x3B, 0x6F, 0x27, 0xFB, 0x7F, 0x11, + 0xBF, 0x05, 0xA1, 0xF1, 0x7C, 0xA1, 0x73, 0x34, 0xFD, 0x40, 0x3D, 0xF0, + 0x36, 0xEE, 0xC8, 0x4B, 0xC7, 0x4F, 0x35, 0x04, 0x1C, 0x69, 0x49, 0x65, + 0x0B, 0xCD, 0x4E, 0x3B, 0xED, 0x5C, 0xA6, 0x42, 0x11, 0xB8, 0xFC, 0x8F, + 0xA9, 0x44, 0x04, 0x55, 0x19, 0x12, 0xA8, 0xAC, 0xE0, 0x4F, 0x13, 0xB5, + 0xA0, 0xBA, 0xAD, 0xFA, 0x84, 0x5E, 0x11, 0x95, 0x4B, 0xC1, 0x19, 0x57, + 0x45, 0x3E, 0x3C, 0x46, 0x92, 0x0C, 0xAD, 0x54, 0xD2, 0xDD, 0x47, 0x6F, + 0xF0, 0x77, 0x0E, 0xAD, 0xD2, 0x5D, 0xEF, 0x39, 0xF3, 0x67, 0xD7, 0x8D, + 0x31, 0x3C, 0xCD, 0x5B, 0xB0, 0x3A, 0x47, 0x4C, 0xD1, 0x16, 0xBB, 0xB2, + 0xDA, 0x65, 0xF0, 0x9B, 0x82, 0x75, 0x3B, 0xF7, 0x46, 0xD3, 0x12, 0xBA, + 0xFD, 0x04, 0x9D, 0x2E, 0x8A, 0x3E, 0x75, 0x88, 0x9A, 0xC7, 0xF3, 0x20, + 0x6B, 0x9E, 0xD7, 0xD3, 0xD3, 0x39, 0x75, 0xF9, 0x76, 0x47, 0xB0, 0xEB, + 0xD1, 0x3E, 0xEA, 0xD9, 0xF4, 0x7F, 0x0B, 0x6C, 0xF6, 0x8B, 0x04, 0xD3, + 0x6F, 0x1F, 0x6D, 0x30, 0xA0, 0xA3, 0x09, 0x45, 0x57, 0x6E, 0xE2, 0x3A, + 0x0E, 0xE7, 0x07, 0x98, 0x24, 0xED, 0xCB, 0x6D, 0x73, 0xB9, 0x4E, 0x09, + 0xE7, 0xA9, 0xDD, 0xF7, 0x28, 0xBE, 0xA6, 0x94, 0x4E, 0x58, 0x92, 0x88, + 0x74, 0x91, 0x85, 0x20, 0x3C, 0x78, 0xBB, 0xA4, 0x13, 0x65, 0xA6, 0x82, + 0x2A, 0xCF, 0x1F, 0x2F, 0x43, 0x78, 0x43, 0x36, 0x32, 0x8B, 0x99, 0xE9, + 0x7E, 0xC3, 0x73, 0x39, 0x3E, 0xC3, 0xFF, 0x42, 0x29, 0x76, 0xD7, 0x99, + 0x3B, 0x7A, 0x0A, 0xCF, 0x7F, 0x40, 0xB7, 0x54, 0x92, 0x23, 0x18, 0x64, + 0xD8, 0xD1, 0x12, 0xC4, 0x91, 0xBF, 0xA1, 0x90, 0x5E, 0x03, 0xB3, 0x1D, + 0xC5, 0xF4, 0xD7, 0xC7, 0x9A, 0x6C, 0x87, 0x90, 0xB8, 0xD2, 0x0C, 0x66, + 0x04, 0x20, 0x73, 0xA9, 0x6A, 0x73, 0xD4, 0xC5, 0x76, 0x5A, 0xBA, 0x4D, + 0xD1, 0x56, 0xFA, 0x99, 0xF6, 0x32, 0x90, 0x5E, 0xFD, 0x19, 0xA4, 0xCD, + 0x85, 0x1F, 0x13, 0x39, 0x0D, 0x2D, 0x6B, 0x01, 0xA4, 0x48, 0x59, 0x0F, + 0x6E, 0x4B, 0xC2, 0xD4, 0xF4, 0x03, 0x71, 0x92, 0x91, 0x0E, 0xCD, 0x5B, + 0x0A, 0x48, 0xB4, 0xA2, 0x1A, 0xA4, 0xF1, 0x93, 0x6F, 0x1B, 0x90, 0x33, + 0xCF, 0x05, 0xF5, 0xB4, 0x0D, 0x7F, 0xE3, 0x88, 0xD7, 0x8F, 0xB6, 0x34, + 0xBD, 0xEC, 0x0B, 0xA2, 0x45, 0xCA, 0x3B, 0xFD, 0xB2, 0x74, 0x10, 0xC0, + 0x16, 0x03, 0x77, 0x1B, 0x0C, 0xBC, 0xFB, 0x36, 0x93, 0x8A, 0x95, 0x52, + 0x14, 0x4A, 0x52, 0x42, 0x4E, 0x8C, 0x5E, 0x59, 0xEC, 0x68, 0xC7, 0xCE, + 0x8F, 0xFB, 0x15, 0x10, 0xA1, 0xDB, 0xA2, 0x6A, 0x6D, 0x49, 0x65, 0x3C, + 0x7C, 0x71, 0xE9, 0x91, 0xD5, 0x25, 0x08, 0x19, 0x66, 0xFD, 0x67, 0xF7, + 0xC3, 0x4C, 0x1A, 0x4D, 0x6E, 0x31, 0xA0, 0x2A, 0x49, 0x57, 0x97, 0xB0, + 0x8E, 0xB4, 0xB6, 0x0D, 0xCE, 0xA5, 0x26, 0x52, 0x6C, 0xA3, 0xB3, 0x0E, + 0xC6, 0x1E, 0x28, 0xA6, 0x4B, 0xEF, 0x20, 0xD1, 0x58, 0x86, 0x64, 0xEF, + 0x49, 0x40, 0x62, 0x43, 0x58, 0x2A, 0x65, 0x5D, 0x8C, 0x91, 0xFE, 0xDB, + 0x85, 0x2D, 0x9D, 0x66, 0x0B, 0x5B, 0xDF, 0xCA, 0xFC, 0xA4, 0x35, 0x01, + 0xA4, 0x0C, 0x3E, 0x82, 0xF6, 0xD0, 0xB6, 0xEB, 0x38, 0x6F, 0x6F, 0xD6, + 0xB0, 0x6D, 0xD5, 0xC8, 0x37, 0x2D, 0xD4, 0x3F, 0x7F, 0xA9, 0xCD, 0x95, + 0xD0, 0xE0, 0xBA, 0x56, 0xF2, 0xF5, 0x2F, 0x38, 0xDA, 0x23, 0x3C, 0x62, + 0xC1, 0x96, 0xAC, 0xE4, 0xA5, 0xAB, 0xD3, 0xE4, 0x42, 0xD6, 0x06, 0x7D, + 0x2F, 0x64, 0xBC, 0x8E, 0xD7, 0x49, 0xF1, 0xA8, 0x08, 0xC0, 0xD4, 0xED, + 0x10, 0x53, 0x99, 0x3F, 0x7E, 0x66, 0xC8, 0x24, 0xDB, 0x12, 0x1E, 0x15, + 0x30, 0x8E, 0x76, 0xD7, 0xCD, 0x65, 0xD4, 0x97, 0xCB, 0xC7, 0xDD, 0x89, + 0x1E, 0x28, 0x7B, 0x08, 0xED, 0x16, 0xBD, 0x78, 0x21, 0x5A, 0xBD, 0x37, + 0x98, 0xD8, 0xE3, 0x81, 0x6B, 0x5C, 0x96, 0x51, 0x45, 0x95, 0xED, 0x2A, + 0x53, 0x4B, 0xDB, 0x96, 0x66, 0xB4, 0xBF, 0x54, 0x55, 0xBC, 0x82, 0xB0, + 0x31, 0x75, 0xA0, 0xA7, 0x5F, 0x4D, 0xED, 0x89, 0xBB, 0x47, 0x87, 0x40, + 0x68, 0xCA, 0x74, 0x3A, 0xD9, 0x3A, 0xC3, 0x10, 0xBA, 0x18, 0xAF, 0xC7, + 0x67, 0x0A, 0x86, 0x31, 0x08, 0xE6, 0x8A, 0xD6, 0x0C, 0xD6, 0xDE, 0xB6, + 0x4A, 0xD7, 0x99, 0xC6, 0x28, 0xBF, 0xD2, 0x82, 0xF6, 0x8C, 0xFA, 0xC9, + 0x0F, 0x81, 0x1A, 0x9B, 0xD1, 0xE5, 0x7C, 0x3B, 0x31, 0x30, 0x14, 0x27, + 0x23, 0x69, 0xD6, 0x3E, 0xB2, 0x94, 0x0A, 0xC4, 0xD0, 0x6F, 0x98, 0x4A, + 0x42, 0xE5, 0x81, 0x51, 0x00, 0xD4, 0x46, 0x1F, 0x6A, 0x96, 0x3B, 0xB1, + 0x03, 0x2F, 0x81, 0x2B, 0xD8, 0xC8, 0x79, 0xCF, 0x3E, 0x3F, 0x53, 0xDC, + 0x88, 0x1A, 0xF8, 0xAF, 0x1C, 0xF5, 0x71, 0x0A, 0xCF, 0xE2, 0x06, 0x29, + 0x76, 0xBD, 0xAA, 0x55, 0x9E, 0x87, 0x72, 0x47, 0x7C, 0x74, 0x36, 0x17, + 0xC7, 0xDF, 0x90, 0xA4, 0x92, 0x2C, 0x72, 0x17, 0x4B, 0xAB, 0x41, 0x7B, + 0xA2, 0xEC, 0x60, 0x0A, 0xB9, 0x25, 0xAF, 0xAC, 0x0F, 0x66, 0x60, 0x92, + 0xC1, 0xA8, 0x5F, 0xD4, 0x67, 0x3F, 0x9D, 0xF4, 0x63, 0x3A, 0x28, 0x21, + 0x2A, 0x8C, 0x4A, 0x4E, 0x89, 0x0B, 0x23, 0x46, 0x81, 0x8D, 0xC1, 0xE0, + 0x0F, 0x87, 0x60, 0xFA, 0xA1, 0xC1, 0x71, 0x1F, 0x10, 0x37, 0xDA, 0xCC, + 0x65, 0xF5, 0xA0, 0x33, 0x84, 0x84, 0x36, 0x0A, 0xED, 0x28, 0x3F, 0x5A, + 0xBE, 0x76, 0x95, 0xB6, 0xA4, 0xBA, 0xE3, 0x92, 0xF8, 0x4B, 0x55, 0x78, + 0x23, 0xBF, 0xAD, 0x7B, 0x39, 0x72, 0xAF, 0xE8, 0xAC, 0xEE, 0x27, 0x69, + 0x0E, 0x8C, 0x57, 0x29, 0x08, 0xDA, 0xCB, 0x35, 0x07, 0x6D, 0xA4, 0x66, + 0xC5, 0xF6, 0xF0, 0x73, 0x3A, 0xDC, 0xD3, 0x08, 0x79, 0x9A, 0x28, 0xCC, + 0xD0, 0xCC, 0x45, 0x7C, 0xED, 0x82, 0x5A, 0x14, 0x29, 0xEF, 0x7E, 0x1E, + 0x80, 0x42, 0x5E, 0x36, 0xD3, 0x21, 0x48, 0x8C, 0xE6, 0xBA, 0x91, 0x42, + 0x54, 0xC6, 0xCF, 0x36, 0x4D, 0x68, 0xE5, 0xC3, 0x18, 0xEF, 0xCE, 0x92, + 0x47, 0xE7, 0x2E, 0x8F, 0xB1, 0x67, 0x88, 0xC6, 0xB4, 0xB3, 0x98, 0xF8, + 0x44, 0x51, 0x6D, 0x44, 0xC5, 0x11, 0xFB, 0x2E, 0xA5, 0x67, 0x48, 0xDE, + 0xED, 0x7E, 0x9C, 0x6F, 0x53, 0x5D, 0xA0, 0xFF, 0x9F, 0x4D, 0x2E, 0x3F, + 0xB6, 0x0D, 0x61, 0x41, 0x35, 0xB7, 0x0B, 0x28, 0x8F, 0x6A, 0x29, 0xD5, + 0xFC, 0x25, 0x42, 0xBF, 0x04, 0x0E, 0xA7, 0xC0, 0xE9, 0xD4, 0xD0, 0x99, + 0x26, 0x0C, 0x3B, 0xEE, 0xE0, 0x66, 0xFB, 0x66, 0x0E, 0xEC, 0x37, 0x13, + 0xE2, 0xD8, 0x2F, 0x90, 0x6B, 0x0D, 0x4E, 0x9C, 0x14, 0xCB, 0xBA, 0xF0, + 0xD6, 0x49, 0x55, 0xAB, 0xFE, 0x96, 0x74, 0x48, 0x07, 0xA2, 0x0B, 0x6F, + 0x91, 0x0B, 0x7D, 0x75, 0x60, 0xB9, 0x11, 0x1B, 0x8F, 0x48, 0x6D, 0x66, + 0xED, 0xDD, 0xCC, 0x83, 0x57, 0x1A, 0x2B, 0x81, 0x7F, 0xC5, 0x7B, 0x3B, + 0x16, 0x92, 0x93, 0x6C, 0xC7, 0xB2, 0xC5, 0x48, 0xAE, 0xB2, 0x2E, 0x4C, + 0x22, 0xE8, 0xF9, 0xD4, 0x91, 0x95, 0xA9, 0xA1, 0x97, 0x48, 0x80, 0x4D, + 0x4D, 0x5E, 0xEF, 0x3E, 0x87, 0xD5, 0x3C, 0xF7, 0xDF, 0xFA, 0x36, 0x4A, + 0xC4, 0x72, 0x0C, 0x2E, 0x0E, 0xA2, 0xC6, 0x61, 0xB1, 0x3D, 0xEC, 0x5A, + 0x6C, 0x9D, 0x16, 0x81, 0x13, 0x61, 0x8E, 0x7E, 0x28, 0xA0, 0x3D, 0xEB, + 0x8E, 0x97, 0x59, 0x0E, 0x24, 0xCF, 0x5B, 0x4D, 0x98, 0xDE, 0x01, 0xC9, + 0x48, 0x97, 0x8F, 0x1C, 0xCC, 0xF9, 0x6B, 0xA8, 0xC0, 0x44, 0x73, 0xEB, + 0x06, 0x17, 0xB2, 0x8D, 0xA5, 0xD4, 0x25, 0x87, 0x0E, 0xE2, 0x6E, 0x0D, + 0x99, 0x7E, 0xCE, 0x06, 0x83, 0x99, 0x3A, 0x8C, 0xE6, 0xC7, 0x99, 0xAC, + 0x3C, 0xF3, 0x0C, 0x50, 0x8F, 0xA7, 0xB2, 0x2B, 0x3C, 0xCA, 0x56, 0x06, + 0x63, 0xA0, 0x9A, 0xB6, 0xF8, 0x84, 0x43, 0x03, 0x04, 0x07, 0x8A, 0xEC, + 0x43, 0xA1, 0x3E, 0x5F, 0xE2, 0x2A, 0x50, 0x02, 0xBA, 0x62, 0xDA, 0x77, + 0x7A, 0xC9, 0x06, 0x50, 0xF5, 0xEE, 0xE0, 0xD0, 0x85, 0xDA, 0x15, 0x54, + 0x36, 0x83, 0x44, 0xC5, 0x14, 0xBD, 0x98, 0xB4, 0x37, 0x27, 0x56, 0x4B, + 0xB2, 0x19, 0x59, 0xEB, 0xD5, 0x95, 0x27, 0xAD, 0x94, 0x2F, 0x36, 0x8D, + 0x61, 0x26, 0x95, 0xEF, 0x4B, 0x05, 0x9E, 0x22, 0xDB, 0x76, 0x06, 0x67, + 0xA0, 0x0D, 0x28, 0x90, 0x5D, 0x6D, 0xFF, 0xA6, 0x2F, 0x2F, 0x8F, 0x1F, + 0x72, 0xEA, 0x88, 0x79, 0xE2, 0xC8, 0x8B, 0xA1, 0x19, 0xC3, 0x09, 0xA3, + 0x21, 0x93, 0xB4, 0x74, 0xB1, 0xDF, 0x53, 0x78, 0x08, 0x25, 0x01, 0xC6, + 0x83, 0x2D, 0x17, 0xD4, 0x6C, 0x44, 0x1C, 0xAE, 0xFD, 0x3D, 0xE8, 0xF0, + 0xA7, 0x93, 0x59, 0x3B, 0x96, 0x01, 0x5F, 0xC1, 0xA4, 0x5F, 0x82, 0xA7, + 0x1D, 0x9C, 0xB9, 0x60, 0x00, 0xF4, 0x02, 0x9A, 0xD0, 0xCF, 0xA7, 0x8F, + 0x25, 0x9E, 0x21, 0xD7, 0x47, 0x9A, 0x18, 0x9E, 0x7F, 0x39, 0x1A, 0x7E, + 0x5E, 0x52, 0x44, 0x11, 0x1A, 0xF0, 0xD6, 0x4D, 0x3E, 0x98, 0x2D, 0x88, + 0x45, 0xDA, 0xC4, 0xBF, 0x51, 0x9F, 0x34, 0xC0, 0xEA, 0x0E, 0xD1, 0x32, + 0xCD, 0xB9, 0x7E, 0x16, 0x01, 0xF2, 0xD4, 0x81, 0x9E, 0x40, 0xC9, 0xBA, + 0xC0, 0x93, 0xFB, 0x88, 0x14, 0x8E, 0x79, 0x2F, 0x85, 0x54, 0x12, 0x29, + 0x54, 0x8E, 0x4F, 0x72, 0x6C, 0x3F, 0x0D, 0xB6, 0xD4, 0x27, 0x91, 0xCE, + 0xAC, 0xC7, 0x7B, 0x9A, 0x77, 0xEA, 0xCB, 0xBE, 0x0C, 0x53, 0xCB, 0x2E, + 0x8E, 0x45, 0x3E, 0xC0, 0x95, 0x76, 0x35, 0x96, 0xF0, 0xAF, 0xA1, 0x91, + 0x7E, 0x64, 0xE8, 0x82, 0xA2, 0x27, 0x3F, 0x90, 0xC6, 0xE3, 0x78, 0x75, + 0xC6, 0x32, 0x3B, 0xDD, 0x91, 0xE4, 0x7C, 0xFD, 0x18, 0x16, 0xAC, 0xEF, + 0x93, 0xEF, 0x76, 0xC4, 0x4C, 0xC8, 0x1F, 0x61, 0xEF, 0xD0, 0x40, 0x0D, + 0xD9, 0x9B, 0x13, 0xB8, 0xAA, 0x6E, 0xFC, 0x9F, 0x1D, 0x5E, 0x7C, 0x7F, + 0xB6, 0x2B, 0xCA, 0x06, 0xF6, 0xDA, 0x06, 0xE0, 0x94, 0x81, 0x8C, 0x49, + 0x75, 0xD6, 0x8A, 0xA3, 0xC0, 0x7A, 0x59, 0xCE, 0xFC, 0x85, 0xB4, 0xCA, + 0xE5, 0xA3, 0x58, 0x64, 0x31, 0xA8, 0x41, 0x2D, 0xF4, 0xCD, 0x56, 0x10, + 0x2A, 0x18, 0x4C, 0x15, 0xBE, 0xD5, 0x1B, 0xAC, 0xC7, 0x68, 0xB4, 0x3C, + 0x60, 0x4D, 0xD0, 0xC2, 0x7A, 0xE4, 0xE1, 0x59, 0x84, 0x95, 0x5D, 0x0C, + 0x1D, 0x74, 0x4E, 0x5A, 0xCC, 0xBB, 0x85, 0xAA, 0xFC, 0x91, 0x81, 0x50, + 0xFC, 0x05, 0xC7, 0x77, 0xC5, 0xE3, 0xCE, 0x70, 0xA1, 0x35, 0xBD, 0xAF, + 0x9C, 0x17, 0xB3, 0x52, 0xD0, 0xE1, 0xC4, 0x6B, 0x12, 0x00, 0x4E, 0xA3, + 0x2E, 0xC2, 0x45, 0xB3, 0x85, 0x1E, 0xBF, 0x4C, 0x1C, 0xC5, 0x49, 0x7A, + 0xB4, 0x9D, 0xCB, 0xB9, 0x2D, 0x93, 0xAF, 0xB3, 0x98, 0x30, 0xA1, 0x17, + 0x93, 0x31, 0xE8, 0x79, 0xBE, 0xFB, 0xE3, 0xF6, 0x8E, 0x8F, 0xBE, 0x11, + 0x43, 0xCB, 0x06, 0x38, 0xDD, 0x33, 0x5A, 0x27, 0x77, 0xF7, 0x59, 0xF9, + 0x12, 0x8E, 0x9E, 0xAA, 0xA6, 0x99, 0x54, 0x9C, 0x26, 0xD8, 0x55, 0x39, + 0x8C, 0xD0, 0x62, 0xC7, 0x2B, 0xE7, 0xAD, 0x43, 0xDC, 0xFA, 0xA4, 0xB7, + 0xB3, 0xB2, 0xEE, 0xDB, 0xC1, 0x1F, 0x37, 0x44, 0x89, 0x30, 0xBC, 0xE6, + 0x6A, 0x17, 0xEC, 0x31, 0xBB, 0x52, 0x52, 0x36, 0x99, 0x49, 0x45, 0x59, + 0x6A, 0x55, 0xD0, 0xC6, 0x5C, 0xAD, 0x1B, 0xE6, 0x2F, 0x1B, 0x71, 0x6A, + 0x3D, 0x78, 0x3C, 0xFD, 0x63, 0x6F, 0x41, 0x6B, 0x4D, 0xA7, 0x83, 0x65, + 0x01, 0xFF, 0x82, 0x0E, 0x0E, 0x04, 0xFC, 0x8B, 0x24, 0xD1, 0x65, 0x3B, + 0xF0, 0x61, 0x78, 0x2A, 0x43, 0x4A, 0xD5, 0xDE, 0xE2, 0x7E, 0x41, 0x15, + 0x76, 0x08, 0xB8, 0x9B, 0x24, 0x2D, 0x2A, 0xD9, 0x3C, 0xA7, 0x17, 0x47, + 0xF7, 0x88, 0xA0, 0xCF, 0xDD, 0x5B, 0x08, 0xB6, 0x05, 0x25, 0x54, 0x80, + 0x93, 0x83, 0x9E, 0x8D, 0xE1, 0x1F, 0xE6, 0x8E, 0x08, 0x4C, 0x06, 0x26, + 0xE2, 0x0B, 0xE5, 0xEE, 0xDD, 0x4D, 0xAB, 0xD0, 0x43, 0x15, 0x95, 0x66, + 0x8F, 0xB6, 0xF8, 0x54, 0xF2, 0xF5, 0x9F, 0x79, 0xB5, 0x08, 0x2E, 0x94, + 0x8D, 0x1F, 0x00, 0x86, 0xEF, 0xF2, 0xB7, 0x1C, 0x9A, 0x01, 0xA9, 0x00, + 0xE2, 0x61, 0x39, 0x47, 0x52, 0xF1, 0x25, 0xA6, 0xA2, 0xCC, 0x82, 0xB4, + 0xE1, 0x93, 0xBE, 0xC4, 0xBF, 0x2E, 0xBA, 0x02, 0x5D, 0x65, 0x09, 0x50, + 0x2F, 0x36, 0x58, 0x82, 0x49, 0x9C, 0xC3, 0x78, 0xD8, 0x1D, 0xD5, 0xBC, + 0xE8, 0x18, 0xA7, 0xD8, 0x9C, 0xB0, 0x15, 0x7D, 0xF9, 0xE1, 0x58, 0xD3, + 0x59, 0xEA, 0x13, 0xEC, 0x9F, 0xD7, 0xF3, 0x35, 0x90, 0xF7, 0x29, 0xC0, + 0x21, 0x7C, 0x55, 0xD4, 0x11, 0x48, 0xF7, 0x6F, 0x6A, 0x00, 0xC5, 0x25, + 0xE5, 0x00, 0x64, 0xC4, 0xB0, 0x31, 0xE5, 0xF2, 0x03, 0x92, 0x9A, 0x07, + 0x47, 0x5E, 0xA0, 0x94, 0x65, 0xAF, 0x5A, 0xB6, 0xFC, 0x4B, 0x48, 0xB6, + 0x4A, 0xCF, 0x4D, 0xCA, 0x8C, 0x16, 0x77, 0x6C, 0xF7, 0x99, 0xBD, 0xCC, + 0x1E, 0x40, 0x55, 0xE2, 0xAA, 0xCB, 0xBF, 0xCC, 0x74, 0x92, 0xA2, 0x8A, + 0x64, 0xC3, 0xE6, 0x17, 0x60, 0x10, 0x72, 0xD1, 0xA0, 0x62, 0xD3, 0x06, + 0xCF, 0x12, 0xAD, 0xE6, 0xBE, 0xC4, 0x76, 0xD7, 0x34, 0x8E, 0xA7, 0xB4, + 0x76, 0xD5, 0x9D, 0xC3, 0xA1, 0x4A, 0xCE, 0xA9, 0xC0, 0x4F, 0x70, 0x15, + 0x91, 0xAD, 0x41, 0x23, 0x44, 0xB8, 0x65, 0x8C, 0x44, 0x49, 0x4F, 0xB8, + 0xBE, 0x45, 0x49, 0xA5, 0xAF, 0x02, 0x66, 0x71, 0x58, 0xB6, 0x8D, 0x40, + 0xAD, 0x4F, 0x89, 0xF4, 0x6F, 0x25, 0x14, 0xB0, 0x62, 0x9A, 0xA6, 0xE8, + 0x72, 0x01, 0x66, 0x02, 0xC9, 0xF2, 0xCE, 0xCA, 0xBD, 0xA1, 0x3A, 0x12, + 0xE4, 0xD4, 0x3A, 0x4B, 0x40, 0xC6, 0xB6, 0x29, 0x00, 0xC9, 0x92, 0x04, + 0x3B, 0xBC, 0xA9, 0x2E, 0xAD, 0x63, 0x7C, 0xC5, 0x84, 0xAE, 0x3D, 0x91, + 0x64, 0x28, 0xB1, 0xA2, 0xA7, 0x7E, 0x67, 0xD5, 0xBF, 0x8B, 0x00, 0x23, + 0x37, 0x87, 0x57, 0x83, 0xA8, 0x2C, 0x13, 0x12, 0x5A, 0x86, 0x67, 0x79, + 0x3A, 0xF7, 0xFA, 0x2B, 0xCB, 0xC2, 0xB6, 0x20, 0xF0, 0xD2, 0x3F, 0x39, + 0x1B, 0x23, 0xA2, 0x11, 0x74, 0x9C, 0xA2, 0x8E, 0x91, 0x4E, 0x70, 0xB3, + 0xE1, 0x85, 0x18, 0xC6, 0x16, 0x4B, 0x25, 0x93, 0xF1, 0x76, 0x74, 0x4C, + 0xA8, 0x9C, 0x81, 0x73, 0xE4, 0x97, 0x54, 0x2A, 0x74, 0x45, 0xD7, 0x3A, + 0x80, 0x36, 0x43, 0x68, 0x91, 0xAE, 0x99, 0x3B, 0xE6, 0x64, 0x28, 0xC1, + 0xFD, 0xE6, 0xD3, 0xFA, 0xCE, 0xE2, 0x63, 0xA2, 0x27, 0xA0, 0x50, 0x83, + 0x9E, 0x90, 0xE9, 0x47, 0x95, 0x27, 0x20, 0x6F, 0x82, 0x4A, 0x88, 0x46, + 0xBB, 0xC6, 0xBA, 0x55, 0x72, 0xA8, 0xBD, 0x21, 0xD7, 0xE7, 0xFC, 0xC2, + 0xCF, 0x30, 0x43, 0x09, 0x80, 0x15, 0xDC, 0x61, 0xFA, 0xE3, 0x46, 0x03, + 0xD6, 0x28, 0x05, 0xC4, 0x24, 0xD3, 0xC6, 0x90, 0x36, 0x4B, 0x58, 0xE0, + 0x32, 0x3A, 0x6B, 0xDD, 0x95, 0xEF, 0x4A, 0xDB, 0x72, 0x8A, 0x85, 0xFD, + 0x1B, 0x72, 0x48, 0xAF, 0xE1, 0x75, 0x0B, 0xAF, 0x65, 0xAA, 0xDC, 0xD1, + 0xBA, 0xB5, 0x6F, 0x15, 0x95, 0xE6, 0x2B, 0x9B, 0x78, 0xE3, 0xCF, 0xB8, + 0xB6, 0x1D, 0xE6, 0xB9, 0xB9, 0xA5, 0x20, 0x53, 0xC4, 0x50, 0xDC, 0xD2, + 0x4A, 0x4D, 0x80, 0x44, 0xF5, 0xFD, 0x68, 0xB0, 0x78, 0x75, 0x79, 0x08, + 0x19, 0xCE, 0x4C, 0xA1, 0x85, 0x51, 0xFA, 0xCB, 0xB6, 0xE6, 0x4B, 0x81, + 0x42, 0x5D, 0xEA, 0xF3, 0x97, 0xC6, 0x68, 0xD1, 0x56, 0x51, 0x52, 0x48, + 0x3D, 0x61, 0xD2, 0x1C, 0x0D, 0x68, 0x4A, 0xC4, 0xDE, 0x06, 0x04, 0x34, + 0x1C, 0xE4, 0xD1, 0x36, 0xED, 0x6D, 0xA7, 0x70, 0x38, 0x89, 0x64, 0x34, + 0xC3, 0xBB, 0x93, 0xA2, 0x75, 0xE6, 0x39, 0xF7, 0x97, 0x1C, 0xBD, 0x8F, + 0xD1, 0xAF, 0x4C, 0x98, 0xF4, 0x7D, 0xD7, 0x71, 0xEE, 0x50, 0x78, 0x72, + 0x86, 0xB0, 0xD4, 0xB9, 0xD0, 0xCB, 0x5B, 0xB1, 0x50, 0x55, 0xFC, 0xC2, + 0xB3, 0x0B, 0x2F, 0xAF, 0x54, 0x32, 0x7C, 0x77, 0x6E, 0xC8, 0x2A, 0x57, + 0xBB, 0x99, 0x8E, 0xB3, 0x93, 0x37, 0x11, 0xFE, 0x23, 0x2C, 0x4B, 0x33, + 0x48, 0x9D, 0x13, 0x05, 0xD9, 0x90, 0xF3, 0x4D, 0xBB, 0x3C, 0x3C, 0xBE, + 0xF2, 0x29, 0x6A, 0xFB, 0xC9, 0x77, 0x21, 0x64, 0x3A, 0xA7, 0xA4, 0x8D, + 0xC8, 0x62, 0x4D, 0xE7, 0x97, 0x96, 0x2D, 0x88, 0xF7, 0xF1, 0x0D, 0x99, + 0x35, 0x09, 0x2B, 0x34, 0xAF, 0x19, 0xB4, 0xBC, 0x0C, 0xBA, 0x35, 0x13, + 0x9F, 0x85, 0x27, 0x98, 0xD7, 0x5A, 0x98, 0x76, 0x41, 0x3D, 0xE3, 0xDC, + 0xB1, 0x57, 0x2F, 0x84, 0xA7, 0xAC, 0x60, 0x28, 0x0A, 0x41, 0xCA, 0xA1, + 0xB6, 0xB4, 0x68, 0xA9, 0x4F, 0xC8, 0xDA, 0x4A, 0x43, 0x89, 0x25, 0x36, + 0xC9, 0xCF, 0x6E, 0x3F, 0x04, 0x73, 0xCB, 0xE7, 0x9E, 0x2A, 0xB6, 0x04, + 0xFF, 0x9F, 0x4B, 0x42, 0x7D, 0x2D, 0x74, 0xAC, 0x3D, 0x6D, 0x78, 0xC7, + 0xA5, 0x34, 0x9C, 0xD2, 0x8A, 0x09, 0x06, 0xF0, 0x80, 0xA9, 0x69, 0x60, + 0xEC, 0x52, 0x70, 0x6B, 0x34, 0x0C, 0x7E, 0xAF, 0x17, 0xA7, 0x48, 0x5E, + 0xAF, 0x85, 0xF7, 0x29, 0xE4, 0x33, 0x54, 0xA2, 0x44, 0x8B, 0xA0, 0x30, + 0xF0, 0xAA, 0xE5, 0xAD, 0x87, 0x5E, 0xF6, 0xA8, 0x67, 0xBA, 0x4A, 0x4E, + 0xA8, 0x85, 0xED, 0x50, 0x2C, 0x4D, 0xBA, 0xC2, 0x89, 0x2F, 0x39, 0x64, + 0x62, 0x9F, 0x4B, 0x8E, 0x60, 0x5B, 0x2C, 0x5F, 0x4A, 0xFA, 0x65, 0xB3, + 0xCD, 0x52, 0x93, 0x43, 0xC1, 0x71, 0x3E, 0xE7, 0xFB, 0x78, 0xAD, 0x32, + 0xEC, 0xF0, 0xB8, 0x2C, 0x72, 0xEF, 0xD8, 0x37, 0xCA, 0x80, 0xFB, 0x4F, + 0x2C, 0x18, 0xF4, 0x6D, 0x88, 0x5E, 0xCB, 0x07, 0xB7, 0xB3, 0x9C, 0x05, + 0x58, 0x84, 0x71, 0xB1, 0xE1, 0x11, 0xD4, 0xC9, 0x63, 0xAE, 0x23, 0x82, + 0xEB, 0xF9, 0x48, 0x97, 0xCA, 0x26, 0x30, 0xC2, 0xF1, 0x37, 0x8E, 0xE6, + 0x53, 0x08, 0x16, 0x5E, 0x2A, 0x24, 0x95, 0xFB, 0x92, 0x68, 0xF5, 0xFC, + 0x34, 0x70, 0x98, 0x6E, 0x2C, 0x54, 0x97, 0x81, 0x11, 0xFC, 0x95, 0xEF, + 0xCA, 0xD3, 0xBF, 0xC3, 0xB5, 0xB5, 0xC0, 0xC7, 0xCE, 0xF3, 0x22, 0x8C, + 0x9F, 0xD7, 0xC7, 0xA2, 0xFC, 0x95, 0xEE, 0x69, 0x94, 0x20, 0x16, 0x5B, + 0x55, 0xA4, 0x48, 0x66, 0x2A, 0x70, 0x91, 0xD5, 0x61, 0x32, 0xBB, 0x34, + 0x61, 0x13, 0x00, 0x59, 0xEA, 0xB7, 0xDE, 0xAE, 0xE0, 0xA2, 0xEF, 0x3B, + 0xF0, 0x1C, 0xA9, 0xC2, 0xFC, 0x02, 0xE3, 0x69, 0x8E, 0xBA, 0xED, 0xAD, + 0xBA, 0x37, 0x52, 0x71, 0x4E, 0x8A, 0xC3, 0xA1, 0x77, 0xA8, 0xDF, 0xA5, + 0x3E, 0x95, 0xF7, 0xEE, 0xEF, 0xD7, 0xBE, 0x46, 0x4F, 0x65, 0x7A, 0xB5, + 0x8C, 0xBB, 0xB7, 0x45, 0xB9, 0x36, 0xA2, 0xD1, 0x44, 0xBE, 0x10, 0x8F, + 0x9F, 0x29, 0xDF, 0xFC, 0x4E, 0xC0, 0x69, 0x49, 0x8E, 0x05, 0x07, 0x7D, + 0x9E, 0xA2, 0x0B, 0x6E, 0x92, 0x47, 0x18, 0x99, 0xF2, 0xF7, 0x62, 0x5C, + 0x38, 0xD9, 0xE6, 0x92, 0x82, 0x37, 0x44, 0xB7, 0xAB, 0x8B, 0x7D, 0xB5, + 0x4D, 0x3E, 0xA4, 0xF3, 0x8F, 0x6B, 0x0B, 0x8B, 0x60, 0xDD, 0x55, 0x2D, + 0x9E, 0xB7, 0xF8, 0x79, 0x9B, 0xCA, 0x8F, 0x76, 0x78, 0x7B, 0x1B, 0xE7, + 0xDB, 0x55, 0xBA, 0x71, 0x0B, 0x7F, 0x7D, 0xEC, 0xF4, 0x2A, 0x7D, 0x7E, + 0xA6, 0xD5, 0xE6, 0x7C, 0x50, 0x6E, 0x11, 0x3A, 0x00, 0x33, 0xA5, 0xB7, + 0xF1, 0x40, 0xF5, 0xDE, 0x62, 0xD5, 0xC9, 0x18, 0x76, 0x70, 0x7C, 0x09, + 0x5A, 0x88, 0x2F, 0x0F, 0x5C, 0xC9, 0x80, 0xB1, 0xEA, 0x55, 0x05, 0x4F, + 0x7E, 0x51, 0x25, 0xF8, 0x82, 0x76, 0xF6, 0x0B, 0x5E, 0xC5, 0x7E, 0xCE, + 0xB8, 0x59, 0x2B, 0x2C, 0x8B, 0x0B, 0x43, 0xDC, 0xC7, 0x74, 0x96, 0x13, + 0xBA, 0x34, 0xD7, 0x69, 0x11, 0x6C, 0x01, 0x4E, 0xC2, 0x8A, 0xD7, 0x38, + 0x10, 0x20, 0xB8, 0xAB, 0x20, 0xA1, 0xA7, 0x10, 0x20, 0xD3, 0x61, 0x07, + 0x01, 0x5C, 0x48, 0x89, 0x87, 0x93, 0xFE, 0x36, 0x05, 0x28, 0x52, 0x07, + 0x35, 0xF0, 0x05, 0x75, 0x0D, 0x26, 0x95, 0x77, 0xEC, 0x41, 0x99, 0xBF, + 0xEB, 0xC4, 0xD8, 0xD1, 0x0A, 0x08, 0x78, 0xC6, 0x6A, 0xEA, 0x52, 0x05, + 0x1D, 0x45, 0x5D, 0x87, 0x80, 0x94, 0x42, 0xD9, 0x5A, 0x1F, 0xBA, 0xAE, + 0x11, 0x86, 0xA1, 0xCC, 0xF9, 0xBA, 0x29, 0xE4, 0xF2, 0x07, 0x91, 0xF1, + 0xDF, 0x17, 0x61, 0x56, 0xF5, 0xEC, 0x19, 0xCC, 0x1F, 0xB0, 0xF5, 0x22, + 0x9F, 0xD1, 0x06, 0x93, 0x6B, 0xE5, 0x98, 0xF6, 0xBE, 0xE1, 0x3C, 0x0E, + 0x62, 0xF5, 0x77, 0xF6, 0x27, 0x7E, 0xDB, 0xB2, 0x96, 0x13, 0xCE, 0x0E, + 0x43, 0x41, 0x14, 0x52, 0x35, 0xAF, 0x63, 0x36, 0xAE, 0x97, 0x2E, 0xB0, + 0x22, 0xCA, 0xC1, 0xEC, 0xC9, 0x98, 0x93, 0xBD, 0xCD, 0x8E, 0x90, 0x6B, + 0x12, 0x30, 0x1D, 0xAA, 0x6C, 0xB4, 0xEF, 0x3B, 0x0D, 0x24, 0xBE, 0x28, + 0xB0, 0xD1, 0xAD, 0x06, 0xDA, 0x82, 0x16, 0x0F, 0xB2, 0xD4, 0xDB, 0x2A, + 0xAC, 0x7B, 0x94, 0x62, 0xF3, 0x3F, 0x29, 0xA6, 0xF3, 0x6F, 0xC5, 0xD6, + 0xBB, 0x81, 0x53, 0xAB, 0x86, 0xE5, 0xA5, 0x63, 0x02, 0xDA, 0xF3, 0x88, + 0x8E, 0xBF, 0xB5, 0x56, 0x1A, 0x79, 0x4D, 0x39, 0xCA, 0xDB, 0xC9, 0xD4, + 0x78, 0xFD, 0x4C, 0xDB, 0x03, 0x10, 0x84, 0x83, 0xAD, 0x4A, 0x13, 0xCF, + 0xB8, 0xD7, 0x58, 0x34, 0x51, 0xD8, 0x13, 0x25, 0x99, 0x46, 0x9E, 0xD6, + 0xD7, 0xDB, 0xE6, 0x2F, 0x6F, 0xAC, 0x12, 0xF1, 0x08, 0xB1, 0x07, 0xB9, + 0x73, 0x61, 0xDB, 0x68, 0xAE, 0x3A, 0xC3, 0xBC, 0x74, 0x02, 0xD3, 0x55, + 0x8F, 0x69, 0x8A, 0x2E, 0x51, 0x84, 0xEA, 0x19, 0x6B, 0xA9, 0x52, 0xC7, + 0x06, 0x47, 0x79, 0xFB, 0xD0, 0x98, 0xC6, 0x7D, 0xF2, 0xBA, 0xF6, 0xE4, + 0xEC, 0x10, 0x69, 0xE0, 0xB8, 0x52, 0x2C, 0x7F, 0xB8, 0x9C, 0x4F, 0xB2, + 0x5A, 0x48, 0x39, 0x05, 0x81, 0xA8, 0x5E, 0x91, 0xD6, 0xFA, 0x84, 0xC9, + 0xE6, 0x12, 0xC6, 0x09, 0x44, 0x3A, 0x69, 0xE9, 0x9C, 0x20, 0x9C, 0x4B, + 0x6E, 0x39, 0xC8, 0x0A, 0xC8, 0x65, 0x28, 0x96, 0xA6, 0x6F, 0x3B, 0x07, + 0x5E, 0xB0, 0xF1, 0x91, 0x27, 0x99, 0x38, 0x23, 0xF9, 0x0B, 0xF1, 0xE1, + 0xC6, 0x01, 0xFB, 0x64, 0xA1, 0x41, 0x4D, 0x49, 0xEA, 0xC6, 0x35, 0xF4, + 0x6A, 0x73, 0xE9, 0x9E, 0x6A, 0x2F, 0xA0, 0x00, 0x06, 0xF7, 0xF6, 0x8C, + 0xD7, 0x3D, 0x7A, 0xC5, 0xEF, 0xBD, 0x91, 0xFD, 0x76, 0x8D, 0x78, 0xAA, + 0x2D, 0x14, 0x0F, 0x01, 0xC8, 0x70, 0x96, 0xF9, 0x8F, 0x83, 0x61, 0xC7, + 0xE4, 0xB2, 0xA6, 0x52, 0xBB, 0xE5, 0x1B, 0x49, 0x16, 0xCC, 0xBE, 0xD7, + 0xAF, 0x76, 0xA7, 0x38, 0x44, 0x4D, 0xF2, 0xAC, 0x23, 0xD2, 0x50, 0x2C, + 0xE7, 0x4E, 0xDC, 0xBA, 0xFD, 0xCB, 0x0C, 0x8A, 0xEA, 0xE7, 0x7A, 0x00, + 0xEE, 0x14, 0xAB, 0xC9, 0x52, 0xCE, 0xA4, 0x38, 0x40, 0xE0, 0x75, 0x5E, + 0x33, 0xCA, 0xA5, 0x20, 0xB7, 0x5D, 0xF9, 0x09, 0x1A, 0xA8, 0xBD, 0xBE, + 0x34, 0xBF, 0xD8, 0x12, 0xF9, 0xF0, 0xC2, 0x63, 0xEE, 0xFF, 0xA9, 0xBF, + 0x5C, 0xD7, 0xD3, 0x3A, 0x40, 0xEC, 0xE6, 0x32, 0x86, 0xA7, 0xA7, 0x0B, + 0xA8, 0x87, 0x7A, 0x3E, 0x5E, 0x53, 0x4B, 0x85, 0x53, 0xFA, 0x9F, 0xA2, + 0xAB, 0xC7, 0x88, 0x16, 0x77, 0x4D, 0x35, 0x06, 0xFE, 0xDA, 0x4A, 0x47, + 0x4F, 0x1C, 0x7C, 0xFF, 0x4C, 0xB2, 0x84, 0x2D, 0x4F, 0x51, 0x7F, 0x65, + 0x4E, 0x1C, 0xA7, 0x92, 0xE6, 0xCD, 0x80, 0x0A, 0xA3, 0xE8, 0xB8, 0x7A, + 0x42, 0xBC, 0x3A, 0x09, 0xEC, 0xE4, 0x7D, 0x2F, 0xBC, 0x27, 0x2A, 0xBD, + 0x8C, 0x6E, 0xE4, 0x48, 0x54, 0x73, 0x6D, 0x1F, 0x15, 0xCD, 0x37, 0x39, + 0x64, 0x12, 0xE3, 0xE4, 0x49, 0x35, 0xCA, 0x83, 0x84, 0xE3, 0xE2, 0x58, + 0xEB, 0xEB, 0x8D, 0xC7, 0x3B, 0x9E, 0xB0, 0xD4, 0x74, 0xF9, 0xC9, 0x09, + 0x58, 0x15, 0xC4, 0x43, 0x18, 0x1E, 0x1D, 0x6D, 0xE2, 0xB1, 0xE7, 0x2A, + 0x50, 0xC6, 0x4F, 0x32, 0x39, 0xAE, 0xC8, 0x9E, 0x6C, 0xFF, 0xF7, 0xD2, + 0xD9, 0xA6, 0x13, 0x85, 0x82, 0xA2, 0xF7, 0x0A, 0xF7, 0x2E, 0x52, 0x96, + 0x41, 0xCE, 0x84, 0x1E, 0x54, 0x53, 0x4A, 0x63, 0x34, 0xA2, 0x56, 0x3A, + 0xD1, 0xAF, 0x52, 0xDF, 0x33, 0x39, 0x37, 0xBD, 0x78, 0x52, 0x01, 0x95, + 0x52, 0xA1, 0x39, 0xE0, 0xEB, 0x33, 0xC5, 0x05, 0x5B, 0x02, 0xB7, 0xFE, + 0xA7, 0x89, 0x7F, 0xE2, 0x30, 0x27, 0xF4, 0xD4, 0xBF, 0x07, 0x44, 0xF8, + 0x6A, 0x56, 0x82, 0xE1, 0x87, 0xE1, 0xFB, 0xBA, 0x06, 0xD1, 0x75, 0xBB, + 0x32, 0x69, 0x61, 0x6B, 0x45, 0x68, 0x87, 0x2C, 0x4C, 0xF2, 0xBE, 0xAD, + 0x27, 0xB7, 0x7B, 0x9E, 0xB2, 0x24, 0x15, 0x44, 0x89, 0x2D, 0x2A, 0xF2, + 0x10, 0xE5, 0x0D, 0x60, 0x44, 0xC8, 0x25, 0x03, 0xAD, 0xC9, 0x64, 0xAA, + 0xD6, 0x90, 0x05, 0x14, 0xD7, 0xFE, 0xBF, 0x3B, 0x0F, 0xD8, 0x76, 0xD9, + 0x76, 0x24, 0xE8, 0xA5, 0xF1, 0x0C, 0xAA, 0x78, 0x4D, 0xF1, 0x43, 0x8A, + 0x5E, 0x8B, 0x40, 0xC2, 0x15, 0xD9, 0x3E, 0x29, 0x75, 0x8F, 0x8D, 0x63, + 0x32, 0x4B, 0xC4, 0xFD, 0x4F, 0x7C, 0x9C, 0x33, 0x6A, 0x21, 0x17, 0xE6, + 0xF7, 0xA5, 0x03, 0x3D, 0x68, 0x3E, 0xC9, 0x2A, 0x46, 0xCB, 0xB1, 0x5F, + 0x69, 0x67, 0xDC, 0x28, 0xD7, 0xA9, 0x0D, 0x08, 0xAA, 0x55, 0x9B, 0xB1, + 0x52, 0x7B, 0x20, 0x28, 0xC2, 0x67, 0x77, 0xBA, 0xB1, 0xC4, 0x81, 0x70, + 0x5E, 0xDD, 0x46, 0x89, 0x16, 0xC9, 0x16, 0x5E, 0x79, 0x16, 0xEC, 0x7C, + 0x5C, 0x5B, 0x6B, 0x15, 0x74, 0x28, 0xE4, 0xB7, 0xFC, 0x59, 0xB7, 0x22, + 0xB7, 0x5C, 0x8D, 0x7A, 0xB2, 0x4F, 0xE4, 0x29, 0x2D, 0xD1, 0x10, 0xBF, + 0xCA, 0x92, 0x90, 0x85, 0x51, 0x76, 0x48, 0x1D, 0x4F, 0x7B, 0x40, 0xC1, + 0xB2, 0xED, 0x91, 0x20, 0x96, 0xD3, 0xD4, 0x46, 0x10, 0xD0, 0xA6, 0xF4, + 0x3F, 0x0B, 0x7D, 0x6D, 0x6C, 0x04, 0xC9, 0x94, 0x23, 0x97, 0x2F, 0xBD, + 0x75, 0x06, 0x68, 0x85, 0xCB, 0x2D, 0xFD, 0xA9, 0xD1, 0xD5, 0xD2, 0x98, + 0x60, 0x74, 0xC8, 0x1D, 0xAD, 0x8A, 0x21, 0xD3, 0x54, 0x8F, 0x20, 0xBE, + 0x06, 0x3D, 0x34, 0xE4, 0x95, 0x78, 0x55, 0x8E, 0x70, 0xC5, 0xB5, 0x3B, + 0x68, 0x58, 0x2F, 0xC2, 0x16, 0xEC, 0x7F, 0x85, 0xC0, 0x05, 0x28, 0xB7, + 0xBF, 0x33, 0x3F, 0x0D, 0x83, 0xC7, 0x93, 0x36, 0x97, 0x24, 0x18, 0x0A, + 0x43, 0x28, 0xFF, 0x90, 0xA1, 0x38, 0xF5, 0xCE, 0x27, 0xCA, 0xD7, 0x47, + 0x46, 0xBD, 0x40, 0x7A, 0xF2, 0x49, 0x2D, 0x56, 0x1B, 0xAD, 0xDA, 0x00, + 0x51, 0x74, 0x44, 0xA3, 0x09, 0x25, 0xE7, 0xB9, 0x13, 0xA8, 0x51, 0xED, + 0xED, 0xDB, 0xB1, 0x54, 0xFB, 0x5F, 0x38, 0x30, 0x0D, 0x4B, 0x4B, 0x92, + 0xB5, 0x2B, 0x45, 0x5E, 0x41, 0xFB, 0x27, 0xC4, 0x17, 0xDF, 0x82, 0x3D, + 0x9C, 0xD3, 0xF9, 0x8A, 0x0E, 0x4A, 0x2F, 0xA1, 0x4D, 0xF4, 0x7C, 0x26, + 0xFB, 0x8A, 0xA9, 0xBC, 0xB3, 0xE8, 0x3D, 0x11, 0x5A, 0x2B, 0x9D, 0x7D, + 0xDA, 0xE7, 0x85, 0x19, 0x9F, 0x78, 0x70, 0x5A, 0x5C, 0xDE, 0x88, 0x40, + 0x8C, 0x09, 0x5A, 0x0A, 0x2E, 0x0C, 0x6E, 0xF2, 0xFA, 0x9A, 0x00, 0xAC, + 0x2A, 0x29, 0xB1, 0x30, 0xB1, 0x19, 0x0A, 0x1E, 0x01, 0x6C, 0x02, 0x2F, + 0x6F, 0x1D, 0xDF, 0x77, 0x45, 0xF6, 0x81, 0x1F, 0xBC, 0x2D, 0x55, 0x2D, + 0x31, 0xC9, 0x34, 0x9A, 0xE3, 0x04, 0xC7, 0xD1, 0x1D, 0xA2, 0xE1, 0x5D, + 0xD4, 0xFF, 0x2F, 0xD5, 0x74, 0x1B, 0xAF, 0x49, 0xA3, 0x2A, 0xE2, 0x31, + 0x8D, 0x7E, 0x3B, 0x21, 0x64, 0x54, 0x8D, 0x52, 0x64, 0x58, 0x96, 0xFF, + 0x83, 0x4F, 0x43, 0xA8, 0x4A, 0xDD, 0xB0, 0xFE, 0xC7, 0x4F, 0x8C, 0xDD, + 0xA3, 0x02, 0x30, 0xCA, 0xC2, 0xB2, 0x59, 0x17, 0x5D, 0xB3, 0xD7, 0x0A, + 0x66, 0x4D, 0xF6, 0x7B, 0x38, 0xA2, 0x67, 0xDA, 0x37, 0x3C, 0x69, 0xF0, + 0x89, 0xE5, 0x57, 0xBA, 0xAF, 0x7C, 0x0C, 0x64, 0x3A, 0x5B, 0x8D, 0xD5, + 0x33, 0xE4, 0xBC, 0xFD, 0x45, 0x44, 0x04, 0x23, 0xDB, 0x03, 0x3D, 0xCD, + 0xA1, 0xA8, 0x6A, 0xE6, 0x9E, 0xDB, 0x1D, 0xBF, 0x10, 0xBB, 0x32, 0xD8, + 0x6A, 0x47, 0xDB, 0x83, 0x24, 0xE4, 0x1B, 0x4C, 0xC3, 0xDE, 0x5B, 0x3D, + 0xD5, 0x1E, 0x69, 0x51, 0xA3, 0x94, 0xFF, 0x97, 0x54, 0x44, 0xDF, 0x20, + 0x41, 0xD8, 0xE2, 0xFE, 0x72, 0xC7, 0x0B, 0x99, 0x0B, 0x1D, 0x49, 0x09, + 0xA9, 0xBE, 0xE4, 0x66, 0xD1, 0x16, 0x49, 0x8A, 0xE9, 0xBD, 0x7D, 0xEF, + 0xCF, 0xE2, 0x69, 0x2A, 0x51, 0x28, 0xCC, 0xD6, 0x80, 0xC7, 0xCE, 0x9C, + 0x9E, 0x20, 0x1D, 0x42, 0x00, 0x5F, 0x3C, 0xCC, 0x0B, 0x10, 0x40, 0xE3, + 0x7A, 0xB6, 0x2A, 0x34, 0xB6, 0x44, 0x50, 0x6F, 0x9B, 0x6E, 0xC5, 0xE5, + 0xE1, 0x94, 0x0D, 0x0C, 0x9B, 0xF7, 0x35, 0x91, 0xFD, 0xCE, 0x65, 0x1A, + 0x79, 0xE1, 0x20, 0x69, 0xAD, 0xB4, 0x92, 0xC2, 0x58, 0x85, 0xF9, 0x45, + 0x1C, 0x98, 0x46, 0xC7, 0x23, 0xA4, 0xDD, 0x81, 0x7C, 0x93, 0x81, 0x55, + 0x1D, 0x47, 0x7B, 0x23, 0x18, 0xB4, 0x7D, 0xFF, 0x03, 0xA5, 0xE0, 0x78, + 0xE3, 0x57, 0xA3, 0x17, 0xB3, 0xB1, 0x01, 0x88, 0x03, 0xA9, 0x10, 0x0B, + 0x35, 0xFE, 0x67, 0xFA, 0x67, 0x6F, 0xD3, 0xF5, 0x25, 0xCB, 0x75, 0xA0, + 0x4F, 0x39, 0xD6, 0x5B, 0xD0, 0x65, 0xD7, 0xA8, 0x77, 0xBB, 0xD8, 0x60, + 0xAF, 0x2B, 0x9D, 0x37, 0x19, 0xFA, 0x83, 0xF8, 0x52, 0x57, 0xDA, 0x2D, + 0xEF, 0xBC, 0x17, 0xAA, 0xC6, 0x97, 0xF4, 0xC5, 0xEF, 0x16, 0x81, 0xA7, + 0xBF, 0x27, 0x49, 0xEA, 0x7A, 0x23, 0x6F, 0x31, 0x6D, 0x62, 0x5B, 0xB6, + 0xF3, 0x61, 0xE1, 0xFA, 0x87, 0x72, 0xE8, 0xE1, 0x0C, 0x89, 0x6B, 0x53, + 0xF0, 0x7F, 0x09, 0x9D, 0x7E, 0x1D, 0x8C, 0x02, 0xFE, 0x29, 0xAA, 0xBD, + 0x6C, 0xB1, 0x68, 0x67, 0xCC, 0xA6, 0xEA, 0xAE, 0xA9, 0x84, 0xDD, 0xC4, + 0x44, 0xF7, 0x2E, 0x22, 0x8C, 0xA5, 0x07, 0xE7, 0xEE, 0xE5, 0xC6, 0xB5, + 0xF3, 0x5A, 0x41, 0xD4, 0x02, 0x2A, 0xE6, 0x1E, 0x79, 0x5C, 0x4B, 0x1B, + 0xED, 0x9F, 0x2A, 0xBA, 0xB6, 0x0E, 0x9B, 0xAB, 0x83, 0x2D, 0xF0, 0x84, + 0x35, 0x83, 0xA2, 0xF4, 0x2C, 0xB6, 0x2F, 0x4C, 0xE9, 0x8B, 0xF6, 0xA4, + 0x5C, 0x8A, 0xEC, 0x01, 0x9A, 0x2E, 0x80, 0xC0, 0x6C, 0x5B, 0xAC, 0x92, + 0x07, 0xAB, 0x93, 0x2D, 0x5D, 0x77, 0x7A, 0xA3, 0xA1, 0xDB, 0x8F, 0x05, + 0x51, 0xD9, 0x92, 0x98, 0x1E, 0xD1, 0x23, 0x01, 0xEC, 0x7E, 0xB7, 0xB8, + 0x4F, 0xA7, 0xCD, 0xCC, 0x5F, 0x76, 0x64, 0xDD, 0x06, 0xA9, 0xC9, 0x98, + 0xD2, 0x3C, 0xB8, 0x06, 0x4B, 0x79, 0x28, 0x9E, 0x14, 0x10, 0xFB, 0x39, + 0xDC, 0xF9, 0xE1, 0xE5, 0x27, 0xFB, 0x89, 0x8C, 0x66, 0xB6, 0xFE, 0xC1, + 0x13, 0x0F, 0x7C, 0xAA, 0x6A, 0x02, 0x45, 0xB1, 0x18, 0xD8, 0x3A, 0x2C, + 0x94, 0x09, 0x8B, 0x66, 0xED, 0xE9, 0xD7, 0x5E, 0xA2, 0x48, 0x01, 0x8D, + 0x8D, 0xC7, 0x05, 0x6A, 0xD3, 0x67, 0x07, 0xFC, 0x22, 0x28, 0xE8, 0x0F, + 0xCD, 0xFF, 0x12, 0xD5, 0xED, 0x64, 0x3F, 0xE5, 0x89, 0x08, 0x41, 0x2C, + 0x49, 0x4D, 0x07, 0x7D, 0xF8, 0x2C, 0x28, 0xB5, 0x2F, 0xCB, 0xF6, 0xC0, + 0x68, 0xDB, 0x0E, 0xFF, 0x92, 0x06, 0xCC, 0x15, 0x17, 0xDD, 0xA7, 0xF4, + 0xA9, 0x7C, 0x49, 0xFF, 0x91, 0x8B, 0xBE, 0xA5, 0xDC, 0x43, 0x5B, 0xD9, + 0x17, 0x17, 0x4A, 0xBC, 0x27, 0xAC, 0x90, 0xC4, 0xC7, 0x68, 0x9F, 0x84, + 0x29, 0x4E, 0x52, 0xF4, 0x6D, 0x29, 0x30, 0xA7, 0xB4, 0x87, 0x42, 0x4F, + 0x93, 0x1D, 0x71, 0x7A, 0xC4, 0x97, 0x7C, 0xEB, 0xB1, 0x55, 0xDA, 0x95, + 0xA5, 0x48, 0xC8, 0xA3, 0xFF, 0x2E, 0xE0, 0x2F, 0x5B, 0xE1, 0xA3, 0x2A, + 0x93, 0x2A, 0x34, 0x30, 0x19, 0x63, 0x45, 0xB1, 0x7D, 0x68, 0x95, 0x23, + 0xCD, 0xE1, 0x79, 0x1B, 0x4D, 0x10, 0x45, 0x0C, 0x9B, 0xF3, 0x7A, 0x13, + 0x78, 0xC1, 0x06, 0x09, 0x7E, 0x24, 0xAE, 0xDE, 0xB7, 0xE0, 0x91, 0x12, + 0x4C, 0x0C, 0xA3, 0x0F, 0xA9, 0xFE, 0xB5, 0x2E, 0x13, 0x16, 0x87, 0x9F, + 0x89, 0xBD, 0x33, 0x72, 0xF9, 0x34, 0xBC, 0x50, 0xA3, 0x60, 0x49, 0xED, + 0x65, 0x04, 0xD3, 0xB7, 0x94, 0x95, 0x8D, 0xFA, 0xE9, 0xE5, 0x8C, 0x6F, + 0x72, 0xEB, 0xE6, 0x21, 0x77, 0x6E, 0xCE, 0x77, 0xEE, 0xFC, 0xDA, 0x4E, + 0x93, 0xDA, 0x1E, 0xCD, 0xA3, 0xB0, 0xB1, 0x40, 0x37, 0xC8, 0x7B, 0x3E, + 0xFF, 0x8D, 0x99, 0xAF, 0xB7, 0x79, 0x18, 0x6D, 0xF6, 0xB0, 0x7E, 0xA1, + 0xFD, 0x0F, 0x55, 0x98, 0x65, 0xCD, 0x74, 0x64, 0x4C, 0x97, 0x63, 0x48, + 0xC1, 0x0C, 0x24, 0xBE, 0xC9, 0x92, 0x8E, 0x8F, 0x15, 0x66, 0x0A, 0x02, + 0x13, 0xC2, 0x5B, 0x9F, 0xB2, 0x03, 0xD1, 0xC3, 0x0A, 0xCE, 0x56, 0x6E, + 0x26, 0xD1, 0x55, 0x4E, 0xFA, 0xE9, 0xCB, 0x48, 0xA5, 0x74, 0xCC, 0x59, + 0x54, 0x92, 0x40, 0x15, 0x07, 0x5D, 0x92, 0xAD, 0xCF, 0x7C, 0x75, 0x2D, + 0x0C, 0xEE, 0x5B, 0x75, 0x99, 0xB5, 0x66, 0x9B, 0xC6, 0x62, 0xAC, 0x84, + 0xC8, 0x69, 0x53, 0xA3, 0xD3, 0xAC, 0x64, 0x1F, 0x3C, 0x6B, 0xD4, 0xB8, + 0x57, 0x79, 0x20, 0xDB, 0x28, 0xD8, 0x0B, 0xB0, 0x40, 0x72, 0x76, 0x40, + 0x51, 0xEC, 0xBC, 0x36, 0x4A, 0xC7, 0x01, 0x55, 0x1D, 0x76, 0xE8, 0xB3, + 0xF6, 0x5B, 0x38, 0x9A, 0x01, 0xFE, 0x00, 0xE0, 0x5B, 0xF6, 0x3F, 0x5D, + 0xC2, 0x55, 0x0E, 0x1A, 0xB6, 0xC1, 0x88, 0x43, 0xB9, 0xB8, 0xE5, 0xDA, + 0xF9, 0x6D, 0xBC, 0x96, 0x3F, 0xC5, 0xB3, 0xC2, 0x14, 0xFF, 0xB8, 0x24, + 0x70, 0x4D, 0x8F, 0xF2, 0x65, 0xD9, 0x52, 0xE2, 0x6F, 0x95, 0x47, 0x0F, + 0xEF, 0xD3, 0xBD, 0xF0, 0x93, 0xF6, 0x77, 0x7C, 0x4B, 0xDD, 0x09, 0xA1, + 0x9D, 0x14, 0xB7, 0x09, 0x75, 0x5A, 0xD5, 0xE7, 0xCD, 0xB4, 0x4E, 0xC9, + 0xB2, 0xCC, 0xEB, 0xA7, 0x13, 0x8D, 0xF1, 0xBE, 0x7B, 0xF1, 0x3C, 0x03, + 0xDC, 0xAE, 0x73, 0x50, 0xC1, 0x79, 0xDC, 0x1E, 0xC1, 0x3A, 0xD1, 0x23, + 0x9D, 0xF1, 0xF3, 0x87, 0x18, 0x5B, 0x97, 0x09, 0x53, 0xF2, 0x61, 0x89, + 0x2D, 0xD7, 0x20, 0x3F, 0x40, 0x85, 0x83, 0x1F, 0x69, 0xB0, 0xF7, 0x07, + 0x48, 0x50, 0x2D, 0x2D, 0xEF, 0xA8, 0x1A, 0x9F, 0x0B, 0xC1, 0xA5, 0x3C, + 0xAD, 0x43, 0x59, 0x8A, 0xAA, 0x64, 0x6C, 0x60, 0x50, 0x67, 0x3B, 0x52, + 0x61, 0x3D, 0x8B, 0x7B, 0xA5, 0x2D, 0x04, 0x7E, 0xE5, 0xEB, 0xE7, 0x79, + 0x69, 0xD1, 0x05, 0xAE, 0xA2, 0x20, 0x7A, 0xC7, 0x68, 0x8A, 0xCA, 0xBE, + 0xBF, 0x27, 0x0C, 0xB3, 0x49, 0x05, 0x16, 0x83, 0x7F, 0x29, 0x87, 0x1E, + 0x58, 0x94, 0x76, 0xEA, 0xEA, 0xC5, 0x43, 0x3B, 0xB3, 0x17, 0xB6, 0x41, + 0x3C, 0x59, 0x03, 0x20, 0x83, 0x78, 0x57, 0xD8, 0x9A, 0x69, 0x2C, 0xEE, + 0x27, 0xCC, 0xC1, 0xAA, 0x7F, 0x52, 0x3A, 0x81, 0x04, 0xC3, 0xCD, 0x64, + 0xC0, 0xAF, 0xCF, 0xF8, 0xB2, 0x34, 0x8A, 0x94, 0xBD, 0xF7, 0x83, 0x0D, + 0x16, 0xE7, 0xB0, 0x47, 0xA2, 0xFA, 0xD6, 0xA7, 0x3E, 0xDF, 0xE1, 0x3A, + 0xBA, 0x87, 0xA7, 0xF3, 0x8C, 0x5B, 0xB2, 0x28, 0x88, 0x4A, 0x13, 0x69, + 0x1C, 0xEF, 0x07, 0xAE, 0xC4, 0xCE, 0x95, 0x0D, 0x49, 0x1E, 0x11, 0x96, + 0x79, 0x72, 0xEB, 0xA5, 0x3E, 0x86, 0x6B, 0x80, 0xF8, 0xE2, 0xAF, 0x28, + 0x70, 0x22, 0xE0, 0x07, 0x98, 0xD9, 0xE5, 0x0A, 0x45, 0xD1, 0x9A, 0xD9, + 0x86, 0x85, 0xEE, 0x92, 0xCC, 0x9B, 0x3A, 0xB6, 0xFE, 0x3F, 0x17, 0x59, + 0x53, 0xE1, 0xDA, 0xF0, 0x7A, 0x3B, 0x28, 0xD6, 0x28, 0xFD, 0xA2, 0xE6, + 0x49, 0xBA, 0x68, 0x99, 0x32, 0x89, 0x73, 0xB1, 0x87, 0xA8, 0x3E, 0x84, + 0x70, 0xE9, 0xD4, 0x22, 0x24, 0x89, 0x20, 0x01, 0xAF, 0x1B, 0xD9, 0xB5, + 0x51, 0xA6, 0xFB, 0x67, 0x26, 0x9A, 0x89, 0x47, 0x85, 0x52, 0xB6, 0x0B, + 0xD4, 0x6B, 0xEE, 0xF4, 0xEF, 0x44, 0xD8, 0x27, 0x74, 0xBA, 0x1E, 0x3C, + 0x45, 0x68, 0xFF, 0x93, 0xDE, 0x4F, 0x03, 0xA7, 0xC1, 0xB9, 0x11, 0xD3, + 0x27, 0xEB, 0x78, 0x40, 0x68, 0xF5, 0x1D, 0x78, 0xE9, 0x24, 0x47, 0x3E, + 0x80, 0x87, 0xF7, 0xE1, 0x87, 0xDA, 0xA0, 0xE3, 0x79, 0xA6, 0x61, 0x80, + 0xFD, 0x1A, 0xEB, 0x03, 0x7F, 0xE9, 0x50, 0x00, 0xD3, 0x1E, 0xBC, 0x6D, + 0x65, 0xA2, 0xD5, 0x09, 0x53, 0x3E, 0x60, 0x54, 0x6D, 0xD0, 0x2E, 0x01, + 0x04, 0xA6, 0x13, 0xEE, 0xC0, 0x72, 0x8A, 0x66, 0x09, 0x91, 0x56, 0x84, + 0x40, 0xFC, 0x8D, 0x35, 0x01, 0xE2, 0x13, 0x76, 0x4E, 0x63, 0xCE, 0xE8, + 0xF0, 0xD9, 0x0F, 0x09, 0xBA, 0x19, 0x44, 0x4B, 0x44, 0x79, 0xAB, 0xF5, + 0xE2, 0x48, 0x92, 0x3F, 0xD9, 0x16, 0x57, 0xCA, 0x94, 0x82, 0x9E, 0xFE, + 0x02, 0x24, 0x93, 0xAE, 0xF2, 0xF3, 0x2B, 0xCE, 0x0A, 0x17, 0x91, 0x5D, + 0x90, 0x97, 0x74, 0x13, 0x59, 0x8B, 0x16, 0xB4, 0x65, 0xD2, 0xFF, 0x5C, + 0x91, 0x35, 0xB8, 0x6D, 0xA0, 0xEA, 0xCB, 0x07, 0xD2, 0x88, 0x6E, 0x8C, + 0xF1, 0xC3, 0x9C, 0x6E, 0x25, 0xDC, 0xC4, 0x16, 0x73, 0x2B, 0xEA, 0x87, + 0xAC, 0x60, 0x7B, 0x0D, 0x50, 0xFF, 0xE8, 0x24, 0xB2, 0x77, 0xEF, 0xFD, + 0x5D, 0x93, 0x16, 0x62, 0xF5, 0x47, 0x17, 0x5B, 0x3E, 0x0B, 0x55, 0x93, + 0xCD, 0x04, 0xCD, 0xB2, 0x51, 0xFC, 0x78, 0x0A, 0x4E, 0xAD, 0x07, 0x46, + 0xC3, 0x66, 0xE5, 0xA6, 0xB7, 0xE4, 0xE2, 0x71, 0x99, 0xA8, 0x44, 0x5B, + 0xD6, 0x3D, 0x63, 0x7A, 0x3A, 0x4F, 0x15, 0x6E, 0x3E, 0x07, 0x23, 0xDB, + 0xBF, 0xD6, 0x78, 0x2B, 0x51, 0x73, 0xCF, 0x48, 0xB3, 0x2C, 0x6A, 0xB6, + 0x8A, 0x3D, 0x5D, 0x25, 0xA7, 0x70, 0x8D, 0x5A, 0x44, 0x2D, 0x1B, 0x24, + 0x4C, 0x27, 0xAA, 0x02, 0xE3, 0x57, 0x79, 0xA1, 0x74, 0x0F, 0x73, 0x5F, + 0xD2, 0x09, 0x64, 0xE7, 0x26, 0xE6, 0xC3, 0xA4, 0x15, 0x90, 0x12, 0x68, + 0x54, 0x4A, 0xAF, 0xA5, 0x01, 0x0C, 0x10, 0x1D, 0x22, 0xF3, 0x79, 0xAF, + 0xED, 0xA4, 0x68, 0x58, 0x4B, 0x97, 0x6F, 0xE9, 0x2B, 0x59, 0x4B, 0x61, + 0x91, 0x87, 0x0D, 0x33, 0x2C, 0x75, 0xAA, 0x19, 0x93, 0x81, 0xC1, 0xD0, + 0x5D, 0xA6, 0xA4, 0xE4, 0x85, 0x1C, 0xBC, 0x32, 0xA7, 0xB5, 0x36, 0x3F, + 0x26, 0x57, 0xAB, 0xAA, 0xEC, 0x9F, 0xC8, 0x74, 0x08, 0x83, 0x4B, 0x09, + 0xE1, 0x22, 0x94, 0xD5, 0xD8, 0xB4, 0xAA, 0x90, 0xFD, 0x34, 0x14, 0x27, + 0xCA, 0x6B, 0x9A, 0x5A, 0x30, 0x2D, 0x75, 0x6D, 0x01, 0x6D, 0x17, 0xCB, + 0xEF, 0xA6, 0x3F, 0x36, 0xE2, 0xB2, 0x6B, 0x81, 0x3E, 0xAF, 0x8C, 0x92, + 0x70, 0x43, 0xA1, 0x1D, 0x09, 0x61, 0x71, 0x6B, 0x0E, 0x53, 0x0F, 0x6B, + 0x00, 0x32, 0xAC, 0x78, 0xCC, 0x2D, 0xC9, 0x42, 0x0C, 0x70, 0x3F, 0xDF, + 0x52, 0x5C, 0xD4, 0x43, 0xC7, 0xAC, 0x1C, 0x17, 0xE2, 0xC0, 0x75, 0x8B, + 0xF8, 0xC8, 0xD2, 0xE1, 0x69, 0xB1, 0x86, 0x07, 0x82, 0x37, 0xB9, 0x4A, + 0x5F, 0xC6, 0x4F, 0x95, 0x86, 0x1B, 0x6D, 0x2B, 0xEB, 0x21, 0xD2, 0x84, + 0xD6, 0x4B, 0xFA, 0xBF, 0x54, 0x41, 0x34, 0xA8, 0x5C, 0x86, 0x23, 0x3A, + 0x3D, 0xB6, 0x0C, 0x97, 0x28, 0x8B, 0xBB, 0xE8, 0xF6, 0xC0, 0x68, 0xE5, + 0x83, 0x21, 0x60, 0xF0, 0xE8, 0x8D, 0x80, 0xFA, 0x1F, 0xAC, 0x32, 0xC6, + 0x1D, 0x17, 0xD2, 0x3E, 0x57, 0xEB, 0x81, 0x68, 0x28, 0x0B, 0x36, 0x6F, + 0x3C, 0x08, 0xA3, 0xEB, 0xEE, 0xF0, 0x25, 0x24, 0xB2, 0x70, 0xC5, 0x62, + 0xA9, 0xC8, 0x48, 0xDC, 0xA1, 0x02, 0x49, 0x0E, 0xE8, 0x19, 0xBE, 0xFC, + 0x8C, 0x8E, 0xC4, 0xBE, 0x9D, 0x6A, 0xDB, 0x70, 0xDC, 0x78, 0xE1, 0xD4, + 0xD1, 0xA4, 0xC8, 0x57, 0x3E, 0xC7, 0x40, 0xA6, 0xF0, 0xA9, 0x83, 0x12, + 0x76, 0x52, 0x4D, 0xB0, 0xBB, 0xBA, 0xE4, 0x85, 0x93, 0xBF, 0x6D, 0x71, + 0x2C, 0x18, 0x57, 0xDE, 0x57, 0x24, 0x8E, 0x33, 0xD7, 0xF9, 0x36, 0xE6, + 0x3B, 0x63, 0x3B, 0x71, 0xB6, 0xF5, 0x9C, 0x4D, 0x2C, 0xC3, 0x55, 0x7B, + 0xDB, 0xD9, 0x1F, 0x7D, 0xC7, 0x2B, 0x4E, 0x65, 0x3C, 0xD4, 0xFD, 0xEC, + 0x01, 0xA6, 0xD8, 0xDB, 0x4F, 0x0A, 0x76, 0xF2, 0x3E, 0x3E, 0x16, 0xB5, + 0xE9, 0xBB, 0xE7, 0x8B, 0xDF, 0x8D, 0x60, 0x80, 0x79, 0xB5, 0xC6, 0x79, + 0x1E, 0x9A, 0xDB, 0x53, 0xB4, 0x80, 0x6C, 0x9C, 0xC9, 0x97, 0x7C, 0x0E, + 0xAF, 0x41, 0xF9, 0x4C, 0x5E, 0xA4, 0xA4, 0x46, 0x85, 0xF2, 0x9A, 0xAE, + 0xFE, 0xC5, 0xB0, 0xB7, 0x16, 0x07, 0x03, 0x89, 0x27, 0x3F, 0x53, 0x92, + 0x3E, 0x85, 0xE3, 0x23, 0xE4, 0x72, 0x1F, 0xD7, 0x77, 0xCF, 0x3E, 0x57, + 0xB3, 0x1F, 0xD8, 0x5D, 0x0C, 0xE2, 0xD1, 0xD6, 0xCF, 0x20, 0xB0, 0xE1, + 0x80, 0x38, 0xF6, 0xEF, 0x91, 0xD3, 0xD7, 0x2E, 0xDE, 0xA3, 0xEA, 0x77, + 0x44, 0xAF, 0xDC, 0x9A, 0x13, 0x19, 0x75, 0x28, 0x85, 0x61, 0xE5, 0x40, + 0x8C, 0xE3, 0xF9, 0x5A, 0xEC, 0x2A, 0x5C, 0x29, 0x12, 0x7B, 0x13, 0xBC, + 0x21, 0x4D, 0x79, 0xF8, 0xEF, 0xD4, 0xEB, 0xA2, 0x95, 0x43, 0xC5, 0xB5, + 0x9E, 0x5B, 0x11, 0xAB, 0xE1, 0x9E, 0xB3, 0x76, 0xFF, 0x05, 0xD5, 0x42, + 0x4F, 0x92, 0x47, 0x58, 0x7A, 0xE2, 0x4D, 0x58, 0x8F, 0x95, 0xC4, 0xDC, + 0xC3, 0xD4, 0x4A, 0x78, 0x8A, 0xB7, 0x9B, 0x5D, 0x2D, 0x51, 0xFA, 0x4B, + 0x10, 0x7B, 0x92, 0xF0, 0x66, 0xEC, 0x7C, 0x01, 0xCA, 0xEE, 0x5F, 0xB8, + 0x45, 0x78, 0x54, 0x87, 0xB8, 0xDF, 0xDE, 0x80, 0xE8, 0xAD, 0x3A, 0xB7, + 0xA6, 0xB2, 0x60, 0xC4, 0xA0, 0xE0, 0x42, 0x13, 0x38, 0xED, 0xFF, 0xB4, + 0x77, 0xA8, 0xF4, 0xE7, 0xF7, 0xE8, 0x71, 0xAE, 0x93, 0x3D, 0xA0, 0xCE, + 0xB5, 0x55, 0xC9, 0x5F, 0xE0, 0x65, 0x4F, 0x2C, 0xD6, 0x31, 0x7B, 0x61, + 0x8E, 0x45, 0x00, 0x02, 0x97, 0x4F, 0x0F, 0xB9, 0x05, 0x03, 0xC4, 0xC2, + 0xBE, 0x3C, 0x4C, 0x2C, 0xB5, 0x04, 0x22, 0x7F, 0x7E, 0x16, 0x3E, 0xC1, + 0xC7, 0xBD, 0x6A, 0xEB, 0x10, 0xA6, 0x15, 0x78, 0x6C, 0x66, 0x55, 0x7D, + 0xFA, 0xE0, 0x2B, 0xD0, 0x88, 0xAB, 0x80, 0x71, 0x6D, 0x2B, 0xD9, 0xC3, + 0x39, 0x7A, 0x6F, 0x39, 0xCC, 0xC0, 0x17, 0x73, 0xC8, 0x58, 0x21, 0x63, + 0xF5, 0x7F, 0x99, 0xF7, 0xC7, 0x46, 0xFC, 0x2B, 0xE3, 0x3B, 0x66, 0x73, + 0x0E, 0x90, 0x4A, 0xC3, 0x48, 0xCE, 0xDB, 0x39, 0x46, 0xF9, 0xE9, 0x7B, + 0x33, 0xCD, 0x9B, 0x8B, 0x3E, 0x21, 0x55, 0x35, 0xAE, 0x71, 0xFE, 0xA4, + 0x2E, 0xC9, 0xC8, 0xA0, 0x1E, 0x97, 0x10, 0x6A, 0x29, 0x95, 0xFC, 0xCD, + 0xE0, 0xEC, 0x37, 0x95, 0xFA, 0x61, 0xB5, 0x62, 0x5C, 0xC5, 0xEA, 0xDF, + 0x8D, 0xA7, 0xC2, 0xF7, 0x4A, 0xC9, 0x34, 0x15, 0xA4, 0x8C, 0x63, 0xA5, + 0x16, 0x25, 0x4F, 0xA9, 0x89, 0xD7, 0x2D, 0x77, 0x0D, 0x5E, 0xC1, 0x32, + 0x2A, 0x86, 0x55, 0x80, 0x97, 0xD1, 0x8C, 0x98, 0x04, 0x5A, 0x89, 0xC9, + 0xD1, 0x5F, 0x00, 0x5E, 0x29, 0x2C, 0xEB, 0x17, 0x96, 0x6A, 0xEB, 0x9A, + 0xEA, 0x5F, 0x2D, 0x99, 0x3D, 0x47, 0xCD, 0xFA, 0xA7, 0x8B, 0xFA, 0xB8, + 0x16, 0x1A, 0xE7, 0x07, 0x85, 0x47, 0xB6, 0x3F, 0xBD, 0x96, 0x4C, 0xD2, + 0xE8, 0xBE, 0x78, 0xE0, 0xFE, 0xF8, 0xD7, 0x9F, 0x05, 0xC2, 0xDF, 0x2F, + 0x1D, 0x8C, 0xDC, 0xDF, 0x4C, 0x36, 0x06, 0xF5, 0xD3, 0xAD, 0xFC, 0x82, + 0xB3, 0x7D, 0x47, 0xE3, 0xE6, 0x26, 0xD7, 0xA8, 0xC1, 0xA8, 0xD7, 0x73, + 0x55, 0x0D, 0x99, 0x81, 0xE8, 0x97, 0x84, 0x22, 0x5D, 0x93, 0x7B, 0x83, + 0xE3, 0x27, 0xEA, 0x60, 0x03, 0x2E, 0xC9, 0x71, 0xBB, 0x31, 0xF1, 0x4A, + 0x4D, 0xEA, 0x5B, 0xAD, 0x29, 0x37, 0xAA, 0x4F, 0x6D, 0xEC, 0xBB, 0x00, + 0x6A, 0xD9, 0x98, 0xDB, 0x08, 0x72, 0x8A, 0x94, 0xC8, 0x9C, 0x03, 0xC5, + 0x02, 0x54, 0x46, 0xB5, 0x1E, 0x25, 0xD1, 0x50, 0x3C, 0x3E, 0xE0, 0x55, + 0x89, 0x28, 0xC0, 0xE3, 0x08, 0x1A, 0x26, 0x9C, 0x4D, 0x74, 0x57, 0x09, + 0x34, 0xB3, 0x2D, 0x21, 0xA0, 0x4E, 0x9B, 0xB2, 0x93, 0xC0, 0x7A, 0x52, + 0xAC, 0x0D, 0x2B, 0xAA, 0x5F, 0xCF, 0x9E, 0x94, 0x88, 0x0D, 0xCB, 0x30, + 0x74, 0xC7, 0x6B, 0x78, 0x5E, 0xEE, 0x24, 0xC4, 0xA8, 0x0B, 0x84, 0x2D, + 0xD7, 0xEC, 0x31, 0xA8, 0xE3, 0x62, 0xC8, 0x43, 0x6A, 0x12, 0x0E, 0x46, + 0xEE, 0x86, 0x33, 0x4B, 0xF9, 0xA6, 0x52, 0x96, 0x6D, 0xA1, 0xD2, 0x1C, + 0x50, 0xEC, 0xEE, 0x53, 0xE8, 0x7E, 0xD4, 0xE1, 0x41, 0x76, 0x6E, 0xF7, + 0x66, 0x89, 0x46, 0xA6, 0xC9, 0x06, 0x32, 0xCC, 0x13, 0x23, 0x80, 0xE8, + 0x3E, 0x93, 0x52, 0x05, 0x78, 0x1A, 0x02, 0xAA, 0x5C, 0x11, 0xD7, 0xF0, + 0x39, 0x77, 0x06, 0x4F, 0xB3, 0x4B, 0x8E, 0x9D, 0x84, 0x00, 0x3A, 0xEE, + 0x03, 0xFD, 0x48, 0xBA, 0xA7, 0x23, 0x59, 0xBE, 0x43, 0x7B, 0x2F, 0xA0, + 0x23, 0x6F, 0x9A, 0xE9, 0xB0, 0xC2, 0x84, 0x1A, 0x9F, 0x5A, 0x39, 0x22, + 0xB6, 0x78, 0x21, 0x86, 0xDD, 0xEC, 0x37, 0x24, 0x1C, 0xB1, 0xD8, 0x7C, + 0x88, 0xAB, 0xC3, 0x9F, 0xA1, 0x3C, 0xBA, 0xF8, 0x1C, 0x43, 0x41, 0xB2, + 0x12, 0x3C, 0x16, 0x38, 0xD6, 0x58, 0xFF, 0xBF, 0x73, 0xEA, 0xFE, 0x63, + 0xE0, 0x36, 0xA4, 0xE7, 0x38, 0xA2, 0xA5, 0xB2, 0xEF, 0xE0, 0x7B, 0x32, + 0xCC, 0x34, 0x0A, 0x32, 0x23, 0x14, 0xCE, 0xE9, 0xDC, 0xC7, 0xF1, 0x85, + 0x79, 0x19, 0x4B, 0xC2, 0x39, 0xC8, 0x57, 0x2A, 0xDD, 0x19, 0x6D, 0x10, + 0xC9, 0x3E, 0x39, 0x13, 0x5A, 0xC3, 0x33, 0xC5, 0xB1, 0x6D, 0xD8, 0x8B, + 0x35, 0x14, 0x9C, 0x67, 0xE6, 0x58, 0xC9, 0x0C, 0xE6, 0xC7, 0x59, 0xCA, + 0xA7, 0xB6, 0x10, 0x8B, 0x44, 0x2D, 0x8D, 0x12, 0xC3, 0xC3, 0xEE, 0x58, + 0xB9, 0xFA, 0x60, 0xBD, 0xAB, 0x29, 0xD4, 0xB9, 0x86, 0xA1, 0x2D, 0x8F, + 0x62, 0xE4, 0x19, 0x9A, 0x71, 0xC2, 0xF4, 0xA5, 0x93, 0x04, 0xBB, 0x8D, + 0x64, 0xB5, 0x40, 0x8C, 0x8B, 0xA6, 0x52, 0xCE, 0xE3, 0x95, 0x53, 0xEA, + 0x14, 0x21, 0x7C, 0x64, 0xCE, 0xCA, 0x69, 0xE9, 0x3F, 0xD9, 0xB7, 0xD4, + 0xB3, 0xB3, 0xC2, 0x82, 0x64, 0xA2, 0x23, 0xC6, 0xE6, 0x8A, 0x5F, 0xFE, + 0xFA, 0x06, 0xE6, 0x5F, 0xA2, 0x82, 0x3B, 0x4E, 0x89, 0xAA, 0xCF, 0xCB, + 0x18, 0xA1, 0x69, 0x65, 0x93, 0xA8, 0x19, 0xC7, 0x78, 0x6F, 0x94, 0x9A, + 0x2F, 0x1F, 0x5B, 0x47, 0x30, 0x06, 0xBE, 0x59, 0x5D, 0x84, 0xDB, 0xDF, + 0xAC, 0xAF, 0x91, 0x8A, 0x39, 0x28, 0xB4, 0xA1, 0x68, 0x2D, 0x4F, 0x39, + 0x64, 0xC3, 0x92, 0xB7, 0x31, 0x38, 0xAE, 0x87, 0xD1, 0xCD, 0xB8, 0x11, + 0xD4, 0xF6, 0xEA, 0x06, 0xB6, 0xB2, 0x22, 0xE8, 0x46, 0x7C, 0xB3, 0xC4, + 0x93, 0xD1, 0x19, 0x2D, 0xEE, 0x9B, 0xAC, 0x1E, 0x9C, 0xEE, 0x6C, 0x85, + 0x6F, 0x35, 0xAC, 0x97, 0x3E, 0x97, 0xD0, 0x50, 0x38, 0x59, 0xF8, 0x5E, + 0xB0, 0x3D, 0xAA, 0x9E, 0x8F, 0x78, 0x51, 0x04, 0xE0, 0x01, 0x8C, 0xF3, + 0xE3, 0x9F, 0x59, 0x11, 0x7D, 0x5F, 0xC9, 0xDB, 0xA3, 0x99, 0xA6, 0xE2, + 0x65, 0x90, 0x75, 0xDD, 0xEC, 0x59, 0x60, 0x19, 0x70, 0x66, 0x12, 0x0B, + 0x27, 0x26, 0xC2, 0x3B, 0x5B, 0xDB, 0x6F, 0x11, 0x39, 0x08, 0xDC, 0xF4, + 0x14, 0x51, 0x06, 0xFE, 0x9B, 0xDB, 0x22, 0x25, 0x1E, 0x25, 0x43, 0x8D, + 0xD5, 0xD0, 0xFB, 0x68, 0xF3, 0x65, 0xEA, 0x97, 0x20, 0xDD, 0x60, 0x7B, + 0xB4, 0xE0, 0x90, 0x24, 0x62, 0xF6, 0x84, 0xF0, 0x47, 0xD6, 0xB9, 0xE3, + 0xB8, 0x16, 0x6A, 0xDB, 0xA7, 0xF7, 0xFD, 0xFC, 0x74, 0x1F, 0x8C, 0xFD, + 0x88, 0x4A, 0xE9, 0xEE, 0xFE, 0xCC, 0xE5, 0xA0, 0x2C, 0x1D, 0xAE, 0xD0, + 0xF3, 0x56, 0xBE, 0xD8, 0x45, 0xC4, 0x44, 0xEA, 0xD7, 0x71, 0x34, 0x7C, + 0x2A, 0x0A, 0x3F, 0xD1, 0xA8, 0xCA, 0xF1, 0x7E, 0x9C, 0x39, 0x6B, 0x51, + 0xBD, 0xDB, 0x56, 0x87, 0xAC, 0xDF, 0x31, 0xF9, 0xC0, 0x73, 0xDB, 0xBC, + 0x0D, 0x1D, 0xD7, 0x8B, 0xBB, 0x50, 0x3B, 0xE7, 0xB5, 0xE9, 0x6A, 0x3B, + 0x83, 0xF8, 0x27, 0xE8, 0x7C, 0xD1, 0x8D, 0x14, 0xDD, 0x5A, 0xDF, 0xD1, + 0xBE, 0xBA, 0xFD, 0x3E, 0xF8, 0xA4, 0x8A, 0xED, 0xAD, 0x82, 0xFD, 0x28, + 0x3F, 0x46, 0x1C, 0x56, 0x71, 0x71, 0x71, 0xFB, 0x1F, 0xEB, 0xE6, 0x72, + 0x10, 0x40, 0xDB, 0xA3, 0x40, 0xEA, 0x06, 0x63, 0x74, 0xE7, 0xC3, 0xA9, + 0xE4, 0x07, 0xFD, 0xA8, 0x5C, 0x83, 0x16, 0x69, 0xB4, 0x6A, 0xAE, 0x85, + 0xFC, 0x32, 0xDF, 0x59, 0x71, 0xBB, 0x7A, 0xC1, 0xC2, 0x0E, 0xC0, 0x5A, + 0xA1, 0x1F, 0x88, 0x6E, 0xF4, 0x79, 0xF2, 0x4F, 0xA5, 0x84, 0x8B, 0xA7, + 0x39, 0xCC, 0x6D, 0x44, 0x33, 0xD8, 0x1A, 0x9B, 0xAD, 0x8F, 0x12, 0x49, + 0x63, 0x93, 0xBB, 0x70, 0xA7, 0x9D, 0x4A, 0x69, 0xDC, 0x18, 0x09, 0xB8, + 0xED, 0xB1, 0x50, 0x13, 0x59, 0xEA, 0xDC, 0x7B, 0xBF, 0x7F, 0x83, 0x4F, + 0xC7, 0xFA, 0x3B, 0x44, 0xEF, 0xF9, 0x4C, 0xE9, 0x72, 0x70, 0xD7, 0x27, + 0xEC, 0x80, 0x18, 0x2A, 0x45, 0x71, 0x87, 0x99, 0x9F, 0xE0, 0x74, 0x3E, + 0xE0, 0xE1, 0xCD, 0xF6, 0x76, 0xD9, 0x82, 0x6D, 0xF5, 0x01, 0x9C, 0x33, + 0x19, 0xB7, 0x0A, 0x1E, 0x07, 0xC7, 0x11, 0x4B, 0xC2, 0x64, 0x16, 0x14, + 0x9F, 0xE6, 0xD2, 0x65, 0x64, 0x9E, 0xCA, 0x29, 0xB9, 0xC1, 0xA1, 0x64, + 0x4A, 0x39, 0x36, 0xD7, 0xED, 0xC4, 0xCA, 0x4D, 0x93, 0xB7, 0xE7, 0x52, + 0x6E, 0xC4, 0x2A, 0x89, 0x16, 0x14, 0xC2, 0x26, 0xF9, 0xD6, 0x69, 0xA6, + 0x8B, 0x52, 0x04, 0xA3, 0xF9, 0xB5, 0x34, 0x97, 0x98, 0x0F, 0x77, 0x01, + 0x02, 0xD7, 0x3D, 0x75, 0x08, 0xE7, 0x90, 0x1B, 0x0A, 0xA4, 0x1D, 0x27, + 0xBB, 0xC3, 0xF5, 0x9A, 0x3A, 0x75, 0xC2, 0x85, 0x12, 0x98, 0x59, 0x90, + 0x92, 0x99, 0x15, 0x73, 0xA2, 0x1D, 0x8A, 0xC0, 0x68, 0x39, 0x69, 0x93, + 0x2C, 0xCF, 0xE1, 0x43, 0x99, 0xD6, 0x68, 0xEB, 0xBD, 0xB1, 0xF2, 0xA4, + 0xB4, 0x84, 0x78, 0x62, 0xCA, 0xF7, 0xE3, 0xC8, 0x5B, 0x12, 0x92, 0xA4, + 0x93, 0xAA, 0x04, 0x07, 0x45, 0x26, 0x09, 0x77, 0x6E, 0x30, 0x47, 0x26, + 0x9D, 0x24, 0x8B, 0xED, 0xDC, 0xFB, 0xFF, 0x23, 0x3A, 0xFD, 0x6B, 0xCB, + 0xA0, 0x88, 0x08, 0x76, 0x66, 0x0A, 0xF9, 0x7B, 0x4F, 0xE2, 0x23, 0x5C, + 0x4E, 0xE9, 0x16, 0x29, 0xA0, 0x9E, 0xE2, 0x7B, 0xB7, 0xD6, 0xDB, 0xD9, + 0xC5, 0xCF, 0x68, 0x4A, 0x9F, 0x08, 0x22, 0xA0, 0xEC, 0xF2, 0x3F, 0x95, + 0xAE, 0x25, 0x95, 0xED, 0x10, 0x6F, 0x35, 0x1A, 0xCA, 0x58, 0xB2, 0xC6, + 0x72, 0xA1, 0x03, 0x7E, 0x58, 0x70, 0x59, 0x24, 0x6A, 0x39, 0x00, 0x8B, + 0x4A, 0x27, 0xBC, 0xB9, 0x00, 0x92, 0x6A, 0xA5, 0xC8, 0x1D, 0xBA, 0xFB, + 0x24, 0x7F, 0x91, 0x3D, 0xF3, 0x4D, 0x7D, 0xB5, 0xF8, 0xB8, 0x76, 0x27, + 0x0A, 0x50, 0x10, 0x98, 0xD3, 0xFE, 0xD8, 0xCD, 0x55, 0xDD, 0xC3, 0x70, + 0x38, 0x23, 0x75, 0x44, 0xA1, 0x16, 0x01, 0xC4, 0xFB, 0x7A, 0x31, 0xBD, + 0xC1, 0x1B, 0x51, 0x7F, 0xAB, 0xC0, 0xAE, 0x0C, 0x43, 0xA5, 0x07, 0x35, + 0x88, 0xAF, 0x8D, 0x5F, 0xF6, 0xE0, 0xFA, 0x6C, 0x83, 0x05, 0xEC, 0xFC, + 0x85, 0xDD, 0x66, 0x11, 0x64, 0x77, 0xE7, 0xCA, 0xF4, 0xE5, 0xC8, 0x11, + 0xC2, 0xAE, 0x06, 0x94, 0x40, 0xF7, 0xA4, 0x00, 0x6F, 0xDD, 0x99, 0xBD, + 0x3A, 0xA3, 0x69, 0x5B, 0xFF, 0x09, 0xC8, 0xC7, 0xF5, 0xFD, 0xA7, 0xE3, + 0x6D, 0x0D, 0x81, 0xC4, 0x70, 0xA1, 0x86, 0x35, 0xEF, 0x76, 0x58, 0x4F, + 0xD8, 0x91, 0xD2, 0x34, 0xF6, 0x48, 0x86, 0x20, 0x95, 0xA2, 0x39, 0xDD, + 0x4A, 0x63, 0xC4, 0xFD, 0xAC, 0x12, 0x61, 0xCC, 0xF9, 0x08, 0x15, 0x17, + 0x4D, 0x94, 0x9B, 0x03, 0xFF, 0x27, 0x06, 0xDC, 0x2A, 0x6B, 0xC6, 0x45, + 0x8C, 0xBE, 0x6B, 0x2E, 0x21, 0x9A, 0xDE, 0xBE, 0x17, 0x3A, 0x91, 0xA8, + 0xA4, 0x09, 0x94, 0x70, 0x22, 0x62, 0x06, 0xDD, 0x65, 0x5E, 0x81, 0x8C, + 0xB0, 0x2D, 0xA7, 0xA6, 0x6B, 0xD9, 0x9C, 0x75, 0xA1, 0x4C, 0x55, 0x96, + 0x67, 0x6C, 0xF7, 0xFB, 0x34, 0xA6, 0x4C, 0x53, 0x10, 0x5A, 0xDB, 0x54, + 0x7E, 0xAC, 0x67, 0xEA, 0x12, 0xF0, 0x29, 0x2A, 0x49, 0x89, 0xFF, 0xC5, + 0xF3, 0xD4, 0x1D, 0xBA, 0xFB, 0xEF, 0xCE, 0xA3, 0x58, 0x33, 0x7C, 0xFA, + 0xC0, 0x30, 0x45, 0x70, 0x15, 0xB0, 0xDE, 0x85, 0xD7, 0x66, 0xCA, 0x00, + 0x87, 0x93, 0x85, 0x6B, 0xD0, 0x2E, 0x94, 0x80, 0x30, 0x24, 0x69, 0xC5, + 0xD9, 0xD8, 0x00, 0xA7, 0xBF, 0x4E, 0xF7, 0x5C, 0xDE, 0x10, 0xBE, 0x0A, + 0xAE, 0xDA, 0x8D, 0xFD, 0xCB, 0xD0, 0xAF, 0x6F, 0xBB, 0xD2, 0xEB, 0xEB, + 0x05, 0xA4, 0xF7, 0x3B, 0x0B, 0xC1, 0x0E, 0x50, 0xE4, 0x80, 0x65, 0xF6, + 0xEE, 0x78, 0xDB, 0xFA, 0xCD, 0x96, 0xDA, 0xB7, 0x47, 0xDD, 0x95, 0x0D, + 0xEC, 0x65, 0x4F, 0x2A, 0x51, 0x8A, 0xC6, 0xA9, 0x25, 0xCE, 0x3D, 0x2D, + 0xC2, 0x06, 0xB9, 0x26, 0xE1, 0x68, 0xA4, 0x68, 0x23, 0xB9, 0x0B, 0x12, + 0x7D, 0x79, 0xD3, 0x48, 0x0E, 0xA6, 0x2A, 0x2B, 0xA3, 0x23, 0x64, 0x10, + 0xBA, 0xA3, 0x92, 0x83, 0xF0, 0x91, 0xB9, 0xF7, 0x12, 0x4A, 0x08, 0xFA, + 0xE3, 0x10, 0xAE, 0x69, 0xDD, 0x93, 0x1C, 0xC6, 0xCC, 0x32, 0x78, 0x85, + 0x15, 0x84, 0xBE, 0x0E, 0x9B, 0x21, 0xB0, 0xE7, 0x0B, 0xC0, 0x25, 0xCA, + 0xE3, 0xA3, 0xC0, 0x6A, 0x96, 0xC4, 0x98, 0x51, 0x9B, 0xF6, 0x5B, 0x09, + 0xAD, 0x67, 0x03, 0xA1, 0x4A, 0x51, 0x1B, 0xC0, 0x4B, 0x0B, 0x1C, 0x23, + 0x0A, 0x2B, 0xBA, 0x9F, 0xAE, 0x74, 0xED, 0xFA, 0xA1, 0xC4, 0x30, 0xAB, + 0x00, 0xED, 0x7A, 0x17, 0xCC, 0x15, 0xC5, 0xBF, 0xCC, 0x49, 0x41, 0x97, + 0x3D, 0xBE, 0x2A, 0xE7, 0xED, 0x33, 0x02, 0x5B, 0x42, 0xF3, 0x18, 0x10, + 0xD3, 0xD5, 0x27, 0x08, 0x4A, 0xFD, 0xFB, 0xA5, 0x19, 0x43, 0xE6, 0x38, + 0x26, 0xAA, 0xC3, 0xE6, 0x7B, 0xF1, 0xD5, 0x02, 0x96, 0x27, 0x86, 0xAC, + 0x38, 0x86, 0x4E, 0xD0, 0x8B, 0xD7, 0x2B, 0xCC, 0x97, 0x96, 0x24, 0x6D, + 0x66, 0x7D, 0x2B, 0xC8, 0xF7, 0x49, 0xEA, 0x26, 0x74, 0xED, 0x29, 0x50, + 0x03, 0x72, 0x2E, 0x3D, 0x52, 0x3D, 0x1C, 0x63, 0x38, 0x67, 0x47, 0x3B, + 0x07, 0xF8, 0x5C, 0x54, 0x98, 0x0A, 0xEA, 0xB9, 0x0E, 0xB7, 0x7E, 0x78, + 0xF6, 0xD5, 0x8E, 0xC1, 0x1C, 0x36, 0x2A, 0x17, 0x17, 0x0A, 0x3E, 0x90, + 0xA4, 0x77, 0x27, 0x47, 0xBA, 0xC9, 0x03, 0x6A, 0x3C, 0x88, 0x17, 0xF5, + 0xEC, 0x7A, 0x94, 0x3D, 0xD3, 0x06, 0x00, 0xEE, 0xB2, 0x31, 0x36, 0xB5, + 0xCA, 0x53, 0x52, 0xC9, 0x4C, 0xA6, 0x54, 0x12, 0xC6, 0x58, 0xB7, 0x2F, + 0xD1, 0xD1, 0xF5, 0x8A, 0x96, 0x3E, 0x44, 0x61, 0x4B, 0xA0, 0x9D, 0xF1, + 0x54, 0x4A, 0xE7, 0x27, 0x8B, 0x02, 0x8B, 0x8E, 0xC3, 0xF2, 0xAF, 0x01, + 0xDE, 0x38, 0xE9, 0x7A, 0x15, 0xAE, 0x0D, 0xA2, 0xF2, 0x43, 0x2C, 0x2D, + 0x2E, 0xCD, 0xD9, 0x61, 0x72, 0xD2, 0x34, 0x7E, 0x07, 0x2C, 0x2A, 0x00, + 0x2D, 0x56, 0x6A, 0x9C, 0xFF, 0x13, 0xBE, 0xF2, 0x60, 0xCD, 0xBA, 0xFA, + 0xB5, 0xBA, 0x95, 0x7F, 0x3B, 0xE1, 0x6F, 0x86, 0x83, 0xAF, 0x52, 0xD3, + 0x86, 0xBE, 0xDF, 0x71, 0xFD, 0x39, 0x1B, 0x49, 0x23, 0xE8, 0x82, 0x3D, + 0x98, 0xE7, 0x6A, 0x7E, 0xE4, 0x76, 0xB0, 0x2C, 0xBD, 0xAE, 0x26, 0xC5, + 0xB5, 0x6F, 0x9A, 0xA2, 0x7E, 0x95, 0x84, 0x2A, 0x74, 0x4A, 0xEC, 0x70, + 0x4D, 0xC1, 0xA9, 0xEB, 0x30, 0xD9, 0xAE, 0x8D, 0x7A, 0xA3, 0xF7, 0x5F, + 0x3F, 0xDE, 0xC2, 0xCD, 0x8B, 0xB0, 0xD6, 0xD0, 0xC5, 0x71, 0x7C, 0xC7, + 0xF9, 0x97, 0x98, 0x51, 0x52, 0x7E, 0x0D, 0x50, 0xB4, 0xC9, 0x29, 0x79, + 0x65, 0xC8, 0x43, 0x7B, 0x46, 0x9B, 0x57, 0xF8, 0x74, 0xF7, 0x8B, 0x58, + 0xE8, 0xB3, 0x22, 0x43, 0xEB, 0x06, 0xCD, 0xED, 0x0C, 0xC9, 0x86, 0x2B, + 0x5E, 0xF9, 0xBA, 0xF5, 0xA3, 0x01, 0x46, 0xE5, 0xE7, 0x99, 0x17, 0x83, + 0xA2, 0x4F, 0x2C, 0xEA, 0x9B, 0x12, 0xDB, 0xC9, 0x0B, 0x51, 0x79, 0x65, + 0x6F, 0x3A, 0xC6, 0x1D, 0x35, 0x3B, 0xCB, 0xC2, 0xA1, 0x27, 0xA0, 0xE0, + 0xC8, 0xCB, 0xBF, 0xA0, 0x7E, 0x9D, 0x7B, 0x8A, 0x6F, 0x38, 0x1D, 0x6A, + 0xDA, 0x14, 0xF6, 0x00, 0xA4, 0xEA, 0x18, 0x71, 0x48, 0x3D, 0x05, 0x03, + 0x42, 0x42, 0xE7, 0x50, 0x3C, 0x3F, 0x21, 0x2F, 0x7C, 0x18, 0x65, 0x3F, + 0xDE, 0xDC, 0x65, 0x9D, 0xB2, 0x8E, 0x92, 0xA1, 0xC7, 0x0B, 0xAD, 0x3C, + 0x22, 0x3C, 0x07, 0x62, 0x1D, 0x3C, 0x8F, 0x57, 0xF0, 0x50, 0x21, 0x5C, + 0xC2, 0x6A, 0xA9, 0x72, 0x3B, 0x9F, 0xB0, 0x51, 0xEF, 0x1F, 0x5C, 0x83, + 0x27, 0x1F, 0xAA, 0x81, 0x50, 0xDC, 0xB2, 0x80, 0x94, 0xE2, 0x69, 0x66, + 0x4B, 0x7E, 0xBD, 0xCA, 0x8B, 0x5F, 0xD0, 0xE8, 0x69, 0x63, 0x6D, 0xE4, + 0xDA, 0xF7, 0x83, 0x45, 0xCB, 0xFC, 0x33, 0xDB, 0x43, 0x99, 0x7E, 0x41, + 0x86, 0x3F, 0x95, 0xDC, 0xB2, 0x58, 0x8F, 0x8E, 0x7F, 0xAA, 0xC8, 0x37, + 0x80, 0x08, 0x1C, 0xAE, 0x22, 0x03, 0xF1, 0x98, 0x73, 0x47, 0x75, 0x38, + 0x5B, 0x1F, 0x99, 0x70, 0xE4, 0x48, 0x15, 0x48, 0xCE, 0x24, 0x15, 0xE4, + 0x0B, 0xCA, 0x01, 0x8E, 0x8B, 0xE7, 0x9B, 0x4E, 0x5B, 0x56, 0x11, 0x14, + 0x31, 0x78, 0x8F, 0xA9, 0x9A, 0xDA, 0x41, 0x52, 0x21, 0xBB, 0x34, 0x10, + 0x74, 0x55, 0x87, 0x4B, 0x7A, 0x65, 0xBA, 0x53, 0xFB, 0x06, 0xB3, 0x82, + 0x3F, 0xEC, 0x43, 0x84, 0xF4, 0xC9, 0xAF, 0x11, 0x7F, 0x25, 0x7A, 0x7A, + 0x2F, 0x33, 0x93, 0x10, 0x9B, 0x7D, 0xA0, 0xAB, 0x35, 0x54, 0x61, 0x85, + 0x3A, 0x08, 0x6B, 0x38, 0x45, 0x35, 0xCB, 0xAC, 0x71, 0x07, 0x43, 0x5C, + 0x38, 0x79, 0x28, 0xFB, 0x9E, 0x30, 0xDC, 0x69, 0xBE, 0x28, 0x25, 0x52, + 0x1A, 0xCF, 0x0C, 0x67, 0x9E, 0x20, 0xF9, 0x18, 0xE2, 0x48, 0x4B, 0xD3, + 0x2D, 0x78, 0xF5, 0xFC, 0xB0, 0xCF, 0x03, 0xC8, 0x9B, 0x4D, 0x82, 0xF5, + 0xEE, 0x4A, 0x87, 0x45, 0xEC, 0x49, 0x32, 0x59, 0x15, 0x32, 0xEC, 0x63, + 0x0B, 0x44, 0x9F, 0x03, 0xAD, 0x0C, 0x4B, 0xC4, 0xCE, 0x74, 0xF0, 0xBA, + 0x8D, 0xE6, 0x4A, 0xBC, 0x69, 0xB7, 0xF5, 0xAE, 0xCB, 0x54, 0x43, 0xE8, + 0x5A, 0x61, 0xF9, 0x4D, 0x04, 0xAA, 0xCE, 0x99, 0xF4, 0x67, 0x60, 0x63, + 0x70, 0x3A, 0x98, 0x3C, 0x42, 0x48, 0x38, 0x9B, 0x90, 0xB4, 0x2F, 0xD7, + 0xE1, 0xCF, 0x15, 0x63, 0x1F, 0x9C, 0xDC, 0x3C, 0x1A, 0xE7, 0x43, 0x2A, + 0x54, 0xE7, 0x95, 0x16, 0x12, 0xE9, 0x93, 0xAE, 0x89, 0x21, 0x0B, 0xAD, + 0xFB, 0x05, 0x50, 0x5A, 0x70, 0x02, 0xD0, 0xCC, 0xDA, 0x66, 0x25, 0x68, + 0x11, 0x1F, 0x42, 0x07, 0x10, 0x56, 0x47, 0xCC, 0xA2, 0x3A, 0xAA, 0x44, + 0x5B, 0x10, 0xA0, 0x0F, 0x25, 0x44, 0x70, 0x3E, 0x72, 0x3A, 0x58, 0x7C, + 0x82, 0x03, 0x3B, 0x8B, 0xFF, 0x5E, 0x6C, 0x06, 0x5A, 0xFC, 0x23, 0x1B, + 0x78, 0xD1, 0xCE, 0xC6, 0xC0, 0x3A, 0xAA, 0x07, 0x0F, 0xC0, 0xAC, 0xB7, + 0x88, 0x31, 0x31, 0x9A, 0x67, 0x3C, 0xDA, 0x7F, 0xE6, 0x48, 0xAB, 0xE8, + 0x30, 0xC0, 0xB4, 0xBF, 0x0B, 0x14, 0x97, 0x81, 0x8F, 0x5E, 0x65, 0x5D, + 0xC9, 0x80, 0xDC, 0x85, 0x76, 0x84, 0x90, 0x7B, 0xC0, 0x2E, 0x59, 0x03, + 0xB2, 0x19, 0x2C, 0x5B, 0x98, 0xA7, 0xA9, 0xDC, 0xE9, 0x4A, 0x02, 0xE3, + 0x80, 0x0D, 0x08, 0x57, 0x03, 0x1D, 0xBB, 0xB0, 0x88, 0x32, 0xCA, 0xF0, + 0x4C, 0xD3, 0xF9, 0xBD, 0x25, 0x56, 0x86, 0xBC, 0x99, 0x92, 0xFC, 0xAE, + 0x66, 0xF2, 0x9B, 0x43, 0xF9, 0xCF, 0xEE, 0xD4, 0xEF, 0xF9, 0xFE, 0xB6, + 0x26, 0x5D, 0x47, 0x07, 0x94, 0x1F, 0xE9, 0xD9, 0xA0, 0x78, 0xF9, 0x57, + 0x26, 0x6E, 0xF9, 0xEB, 0x02, 0x01, 0x9E, 0xB0, 0x75, 0x43, 0x0C, 0x6D, + 0x82, 0x54, 0xFC, 0xE2, 0xFA, 0x1B, 0x3C, 0x31, 0x64, 0xD5, 0x66, 0x22, + 0x45, 0x1F, 0x35, 0x74, 0x8A, 0x70, 0x9A, 0xD8, 0xEC, 0xE8, 0x44, 0x0C, + 0x9D, 0x10, 0xFD, 0x5A, 0xB3, 0x53, 0x21, 0x6A, 0x64, 0xD5, 0x15, 0x6A, + 0x96, 0x48, 0x1A, 0xA3, 0x4E, 0x97, 0xB8, 0xCF, 0xB2, 0xA3, 0x14, 0x23, + 0x83, 0xC1, 0x1A, 0x07, 0x6B, 0x89, 0x64, 0x16, 0x02, 0x9B, 0x04, 0x17, + 0xA4, 0xE3, 0xF3, 0xDB, 0x1C, 0x8F, 0x9E, 0x0D, 0x0A, 0x6D, 0xB4, 0xA2, + 0xA7, 0x76, 0x49, 0xBB, 0xBA, 0x79, 0x2D, 0x6F, 0xCE, 0xD9, 0x5C, 0x24, + 0xC7, 0xDD, 0xF1, 0x22, 0xCC, 0x7D, 0xDF, 0xED, 0x97, 0x93, 0x60, 0xDD, + 0x0B, 0x99, 0xBD, 0x58, 0x0B, 0x06, 0x77, 0x91, 0x82, 0x1F, 0xE2, 0xFE, + 0xCF, 0x14, 0xF8, 0x51, 0x12, 0x2B, 0xBE, 0xFF, 0x68, 0xE7, 0xD9, 0xA5, + 0xA4, 0x2E, 0xD5, 0xAA, 0xE2, 0xFA, 0x80, 0x58, 0xAC, 0xD1, 0x6C, 0xDD, + 0xB6, 0x40, 0xB6, 0xCE, 0x39, 0x6B, 0x95, 0x5C, 0xFF, 0x46, 0x7D, 0x2F, + 0x03, 0xCA, 0xE1, 0x92, 0x5E, 0x2D, 0xD5, 0x58, 0x56, 0x82, 0xE1, 0x7D, + 0x13, 0x21, 0xB0, 0x76, 0x1A, 0x92, 0xDE, 0x77, 0xB4, 0x05, 0xD0, 0xBC, + 0xC9, 0xE3, 0xCE, 0xD2, 0xB9, 0x2B, 0x70, 0xBD, 0xF4, 0x79, 0x3C, 0xFA, + 0xF3, 0x91, 0x51, 0xAA, 0xF4, 0xF0, 0x14, 0x0C, 0x4E, 0xD1, 0x66, 0x60, + 0x90, 0x16, 0x5B, 0xEF, 0x34, 0xE8, 0xB1, 0x5A, 0x2B, 0x8E, 0x2C, 0x11, + 0x39, 0x2D, 0x37, 0x43, 0x4F, 0xA3, 0x9C, 0x0B, 0x19, 0x19, 0x3D, 0x30, + 0xCA, 0x51, 0x07, 0x67, 0x5A, 0xD2, 0xE0, 0x1D, 0x6C, 0xDD, 0xB2, 0xF8, + 0x9E, 0x32, 0x07, 0x7A, 0x33, 0x26, 0x2F, 0x3A, 0x71, 0x25, 0xB0, 0x26, + 0xDF, 0xAB, 0xEE, 0xCC, 0xAD, 0xA9, 0x46, 0x40, 0x65, 0xD6, 0x51, 0xD2, + 0x12, 0x5D, 0x27, 0x4F, 0xBB, 0x95, 0x51, 0x87, 0x55, 0xB2, 0xF7, 0xEB, + 0x89, 0x65, 0xDF, 0xCA, 0xDF, 0xA2, 0x55, 0xAD, 0xA0, 0x19, 0x6A, 0xE5, + 0x88, 0x0A, 0xCE, 0x24, 0xA2, 0xA7, 0xEB, 0x0C, 0x29, 0xDC, 0x24, 0x09, + 0x93, 0x99, 0x50, 0x2C, 0xB7, 0x0F, 0x21, 0xB7, 0x71, 0xF6, 0x8B, 0x3F, + 0x69, 0x0C, 0x32, 0xA1, 0x18, 0x3A, 0x81, 0xEE, 0x42, 0x67, 0x82, 0x5E, + 0xE1, 0x7B, 0x1C, 0x6F, 0x57, 0xA9, 0x60, 0x38, 0x53, 0x42, 0x04, 0x65, + 0x21, 0x31, 0x8B, 0xB8, 0xEA, 0x9F, 0x0D, 0xA6, 0xAE, 0xD8, 0x4D, 0x9B, + 0xCB, 0x36, 0x53, 0xC4, 0x60, 0x2F, 0x84, 0x0E, 0x64, 0xBF, 0xCE, 0x08, + 0x89, 0xD0, 0x2B, 0xB9, 0xE3, 0x87, 0xEC, 0x10, 0xA8, 0x61, 0x70, 0xF7, + 0xE5, 0x23, 0xAA, 0x2E, 0x7A, 0x70, 0x64, 0x5D, 0x04, 0xD6, 0xC6, 0xA2, + 0xA9, 0x3B, 0x79, 0xD6, 0x9A, 0x9A, 0x15, 0x39, 0xDF, 0xF4, 0x4A, 0x2A, + 0xE0, 0x2C, 0x67, 0xC7, 0x01, 0xF3, 0x02, 0x6B, 0xE4, 0xF4, 0xE0, 0x77, + 0x17, 0xA2, 0xEC, 0x93, 0xD3, 0x61, 0x49, 0xB4, 0xAC, 0x52, 0x3A, 0x84, + 0xFA, 0x3E, 0x2C, 0xD8, 0xAB, 0xD9, 0xE6, 0xDD, 0x59, 0x1C, 0x1E, 0x41, + 0x97, 0xEF, 0x29, 0x13, 0xF2, 0x2D, 0x1D, 0x21, 0x5F, 0x6F, 0x16, 0xF2, + 0x7C, 0x72, 0x69, 0xB6, 0x93, 0xC9, 0xE5, 0x7A, 0x1B, 0x4E, 0x10, 0x78, + 0x6C, 0x79, 0x4B, 0x23, 0x73, 0x02, 0x9B, 0xF2, 0xE0, 0xC3, 0xDB, 0x58, + 0xF3, 0x23, 0x37, 0xC9, 0x06, 0x20, 0xF1, 0x08, 0x34, 0x47, 0x91, 0xB0, + 0x8E, 0xF3, 0xFF, 0xFE, 0x83, 0x4A, 0x97, 0xA4, 0x55, 0x22, 0x55, 0xF3, + 0x9F, 0x41, 0x7F, 0xE1, 0xF5, 0xE3, 0x42, 0xAE, 0x54, 0xF0, 0x83, 0x68, + 0x08, 0x09, 0x2C, 0x95, 0x6C, 0x23, 0x11, 0x7E, 0x9F, 0x7D, 0x53, 0x78, + 0xA1, 0x6B, 0x02, 0x14, 0x8C, 0xDD, 0xF2, 0x34, 0x35, 0x7D, 0xF7, 0xCB, + 0xEF, 0x68, 0x04, 0x07, 0x2C, 0xC2, 0x36, 0x1E, 0x15, 0x17, 0x15, 0x6B, + 0x74, 0x56, 0xC4, 0x12, 0xB7, 0xBF, 0xC8, 0xDB, 0x66, 0xF2, 0x88, 0xFA, + 0xEB, 0xD3, 0xA3, 0x99, 0xBE, 0xD3, 0x21, 0x35, 0x05, 0xED, 0x73, 0x9A, + 0xA0, 0x14, 0x3C, 0x24, 0x0A, 0xDF, 0x97, 0x0F, 0x1B, 0xA2, 0x9A, 0xB0, + 0x0F, 0x01, 0xAD, 0x1D, 0x87, 0xED, 0x21, 0x8F, 0x2F, 0xA8, 0x4D, 0xFD, + 0x02, 0x5E, 0x4B, 0xEA, 0xAD, 0x44, 0x2D, 0x58, 0xB4, 0xC8, 0x8F, 0x40, + 0x38, 0x9D, 0x93, 0x3D, 0x32, 0x28, 0x6C, 0x50, 0xE2, 0x10, 0xC1, 0x7C, + 0xDD, 0x10, 0x08, 0x22, 0xB1, 0x1C, 0xB2, 0x2C, 0xA2, 0x33, 0xB5, 0x91, + 0x55, 0x3C, 0xDA, 0xAA, 0xF2, 0xDA, 0xBF, 0x97, 0xA8, 0xB0, 0x81, 0x21, + 0xD8, 0x5E, 0xBE, 0xCE, 0x21, 0x55, 0xD7, 0xBE, 0xC0, 0xAF, 0xDE, 0xF3, + 0xB7, 0x5E, 0xDB, 0x98, 0x40, 0x71, 0x8D, 0xB0, 0xDD, 0xAB, 0x7D, 0xEB, + 0x68, 0x9C, 0xAD, 0x24, 0xA6, 0xE1, 0xB0, 0x90, 0x79, 0xAC, 0xEB, 0xD4, + 0x9D, 0x69, 0x09, 0xE8, 0xE1, 0x7E, 0xFD, 0xE5, 0xAD, 0x59, 0xD2, 0x3A, + 0xBD, 0x83, 0x96, 0xC8, 0x04, 0xF4, 0x8E, 0x55, 0x56, 0xBC, 0x95, 0xC9, + 0x0D, 0x9E, 0xC6, 0x6F, 0xA3, 0x4F, 0x68, 0xD2, 0x78, 0x16, 0x57, 0x5D, + 0x09, 0xE0, 0x61, 0xC5, 0xAD, 0x3F, 0xD1, 0xE0, 0xFA, 0xE8, 0x1D, 0x77, + 0x70, 0x42, 0xF7, 0x53, 0x47, 0xAA, 0xBB, 0x7D, 0xF3, 0xBA, 0xC9, 0x26, + 0xB2, 0xC9, 0xC3, 0x0A, 0x17, 0x4C, 0x2A, 0x1B, 0xB6, 0x12, 0x32, 0x54, + 0x9A, 0xB1, 0xEA, 0xC7, 0xB5, 0x28, 0x5F, 0x59, 0xD9, 0x19, 0x4E, 0xFF, + 0x0D, 0xB1, 0x67, 0x40, 0xD3, 0x76, 0xA7, 0x0A, 0x94, 0xD9, 0x75, 0x71, + 0xCE, 0x6E, 0xE5, 0xFB, 0xD8, 0x9F, 0xB6, 0x5F, 0x91, 0x74, 0x68, 0x9F, + 0x7C, 0xA3, 0x99, 0x3A, 0xD9, 0x0C, 0x83, 0x64, 0xFB, 0x7E, 0xB2, 0x9B, + 0x1A, 0x5F, 0xDA, 0x85, 0xB5, 0xB9, 0x4C, 0xB1, 0x72, 0xA2, 0x1B, 0x92, + 0x20, 0x7A, 0x77, 0xD3, 0x41, 0x8E, 0x1B, 0xF1, 0xC3, 0x5A, 0x6B, 0xF0, + 0x66, 0x16, 0x94, 0x1F, 0x57, 0x5A, 0xC1, 0x16, 0xB3, 0xF9, 0xE9, 0xFA, + 0x0C, 0x28, 0xC5, 0x32, 0x6F, 0x04, 0xF1, 0xAF, 0x66, 0x9F, 0xF8, 0x72, + 0xD6, 0x91, 0x5F, 0x4C, 0xE9, 0x9A, 0xA8, 0x38, 0x47, 0x6C, 0x8C, 0x00, + 0xB4, 0x47, 0x20, 0x41, 0x68, 0x12, 0x54, 0x51, 0x1A, 0x56, 0x66, 0x56, + 0x4B, 0xC3, 0x59, 0xC7, 0x9C, 0x49, 0x74, 0x06, 0xAB, 0x45, 0x1D, 0x7B, + 0x01, 0xA0, 0xF5, 0x34, 0x9E, 0xE3, 0xAD, 0x5B, 0x3A, 0x12, 0x33, 0x3E, + 0x03, 0xB7, 0xA6, 0x92, 0x62, 0x11, 0x75, 0x5D, 0xE4, 0xB9, 0x78, 0x43, + 0xCC, 0x4D, 0xF7, 0x03, 0x0C, 0x5A, 0xED, 0x74, 0x55, 0x96, 0x91, 0x29, + 0xFA, 0xBA, 0xC6, 0x38, 0xCB, 0x22, 0xF2, 0x90, 0x6B, 0x7B, 0x3D, 0xFF, + 0xEF, 0x94, 0x29, 0x59, 0x33, 0x8B, 0x60, 0x66, 0xE7, 0x32, 0xFD, 0x6B, + 0xE1, 0x19, 0x68, 0x2F, 0xD3, 0x71, 0xA0, 0x70, 0xE9, 0xAF, 0xE6, 0x25, + 0x4E, 0xE8, 0x46, 0x08, 0x1C, 0xF1, 0xE3, 0x60, 0x75, 0x63, 0xF2, 0xAC, + 0xAE, 0x25, 0x45, 0x6E, 0xB7, 0x43, 0x71, 0xFD, 0xF9, 0x0B, 0x34, 0x2F, + 0xDA, 0xBD, 0x6B, 0x27, 0x68, 0x0D, 0x27, 0x8D, 0xDE, 0xC7, 0x7C, 0x8D, + 0x24, 0xC4, 0xCB, 0x9B, 0xED, 0x80, 0x01, 0x14, 0x02, 0x00, 0x00, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, + 0x72, 0x6B, 0x0D, 0x80, 0x03, +}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSymbol.cpp b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSymbol.cpp new file mode 100644 index 000000000000..37ce309f585d --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/FoxitSymbol.cpp @@ -0,0 +1,1404 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" + +const unsigned char g_FoxitSymbolFontData[16729] = { + 0x1, 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xf, 0x43, 0x68, 0x72, + 0x6f, 0x6d, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x4f, 0x54, 0x46, 0x0, + 0x1, 0x1, 0x1, 0x26, 0xf8, 0x10, 0x0, 0xf8, 0xad, 0x1, 0xf8, 0xae, + 0x2, 0xf8, 0xae, 0x3, 0xf8, 0x18, 0x4, 0xfb, 0x48, 0xfb, 0xba, 0xfa, + 0xd6, 0xfa, 0x86, 0x5, 0x1c, 0x6, 0x3d, 0xf, 0x1c, 0x6, 0x89, 0x11, + 0xab, 0x1c, 0x3e, 0xa2, 0x12, 0x0, 0x94, 0x2, 0x0, 0x1, 0x0, 0x6, + 0x0, 0xa, 0x0, 0xf, 0x0, 0x16, 0x0, 0x1a, 0x0, 0x1d, 0x0, 0x22, + 0x0, 0x26, 0x0, 0x2b, 0x0, 0x31, 0x0, 0x33, 0x0, 0x35, 0x0, 0x37, + 0x0, 0x3e, 0x0, 0x40, 0x0, 0x43, 0x0, 0x48, 0x0, 0x4b, 0x0, 0x52, + 0x0, 0x55, 0x0, 0x58, 0x0, 0x5b, 0x0, 0x60, 0x0, 0x64, 0x0, 0x69, + 0x0, 0x6e, 0x0, 0x75, 0x0, 0x79, 0x0, 0x7c, 0x0, 0x81, 0x0, 0x85, + 0x0, 0x8a, 0x0, 0x90, 0x0, 0x92, 0x0, 0x94, 0x0, 0x9b, 0x0, 0x9d, + 0x0, 0xa0, 0x0, 0xa6, 0x0, 0xab, 0x0, 0xae, 0x0, 0xb5, 0x0, 0xb8, + 0x0, 0xbb, 0x0, 0xbe, 0x0, 0xc3, 0x0, 0xc9, 0x0, 0xd1, 0x0, 0xd5, + 0x0, 0xdb, 0x0, 0xe1, 0x0, 0xe7, 0x0, 0xeb, 0x0, 0xf3, 0x0, 0xfe, + 0x1, 0x6, 0x1, 0xb, 0x1, 0x10, 0x1, 0x19, 0x1, 0x20, 0x1, 0x2a, + 0x1, 0x33, 0x1, 0x3c, 0x1, 0x4a, 0x1, 0x56, 0x1, 0x60, 0x1, 0x6d, + 0x1, 0x79, 0x1, 0x85, 0x1, 0x8e, 0x1, 0x99, 0x1, 0xa4, 0x1, 0xac, + 0x1, 0xb1, 0x1, 0xb9, 0x1, 0xc0, 0x1, 0xca, 0x1, 0xd2, 0x1, 0xd9, + 0x1, 0xe2, 0x1, 0xee, 0x1, 0xf5, 0x2, 0x1, 0x2, 0x9, 0x2, 0xe, + 0x2, 0x18, 0x2, 0x21, 0x2, 0x2d, 0x2, 0x32, 0x2, 0x3a, 0x2, 0x43, + 0x2, 0x4a, 0x2, 0x53, 0x2, 0x5e, 0x2, 0x66, 0x2, 0x71, 0x2, 0x7a, + 0x2, 0x86, 0x2, 0x92, 0x2, 0xa0, 0x2, 0xa9, 0x2, 0xb5, 0x2, 0xc3, + 0x2, 0xcd, 0x2, 0xdb, 0x2, 0xe8, 0x2, 0xef, 0x2, 0xf9, 0x3, 0x3, + 0x3, 0xc, 0x3, 0x16, 0x3, 0x1d, 0x3, 0x22, 0x3, 0x26, 0x3, 0x2b, + 0x3, 0x32, 0x3, 0x40, 0x3, 0x4d, 0x3, 0x5b, 0x3, 0x64, 0x3, 0x6f, + 0x3, 0x7b, 0x3, 0x87, 0x3, 0x94, 0x3, 0xa1, 0x3, 0xac, 0x3, 0xb7, + 0x3, 0xc2, 0x3, 0xcf, 0x3, 0xdc, 0x3, 0xe9, 0x3, 0xf4, 0x4, 0x0, + 0x4, 0xb, 0x4, 0x12, 0x4, 0x1c, 0x4, 0x28, 0x4, 0x34, 0x4, 0x40, + 0x4, 0x4e, 0x4, 0x5c, 0x4, 0x6a, 0x4, 0x76, 0x4, 0x83, 0x4, 0x8f, + 0x4, 0x94, 0x4, 0xbe, 0x4, 0xce, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x42, + 0x65, 0x74, 0x61, 0x47, 0x61, 0x6d, 0x6d, 0x61, 0x45, 0x70, 0x73, 0x69, + 0x6c, 0x6f, 0x6e, 0x5a, 0x65, 0x74, 0x61, 0x45, 0x74, 0x61, 0x54, 0x68, + 0x65, 0x74, 0x61, 0x49, 0x6f, 0x74, 0x61, 0x4b, 0x61, 0x70, 0x70, 0x61, + 0x4c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x4d, 0x75, 0x4e, 0x75, 0x58, 0x69, + 0x4f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x50, 0x69, 0x52, 0x68, 0x6f, + 0x53, 0x69, 0x67, 0x6d, 0x61, 0x54, 0x61, 0x75, 0x55, 0x70, 0x73, 0x69, + 0x6c, 0x6f, 0x6e, 0x50, 0x68, 0x69, 0x43, 0x68, 0x69, 0x50, 0x73, 0x69, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x61, 0x67, 0x61, 0x6d, + 0x6d, 0x61, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x65, 0x70, 0x73, 0x69, 0x6c, + 0x6f, 0x6e, 0x7a, 0x65, 0x74, 0x61, 0x65, 0x74, 0x61, 0x74, 0x68, 0x65, + 0x74, 0x61, 0x69, 0x6f, 0x74, 0x61, 0x6b, 0x61, 0x70, 0x70, 0x61, 0x6c, + 0x61, 0x6d, 0x62, 0x64, 0x61, 0x6e, 0x75, 0x78, 0x69, 0x6f, 0x6d, 0x69, + 0x63, 0x72, 0x6f, 0x6e, 0x70, 0x69, 0x72, 0x68, 0x6f, 0x73, 0x69, 0x67, + 0x6d, 0x61, 0x31, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x74, 0x61, 0x75, 0x75, + 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x70, 0x68, 0x69, 0x63, 0x68, 0x69, + 0x70, 0x73, 0x69, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x74, 0x68, 0x65, 0x74, + 0x61, 0x31, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x31, 0x70, 0x68, + 0x69, 0x31, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x31, 0x6d, 0x69, 0x6e, 0x75, + 0x74, 0x65, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x45, 0x75, 0x72, 0x6f, + 0x49, 0x66, 0x72, 0x61, 0x6b, 0x74, 0x75, 0x72, 0x77, 0x65, 0x69, 0x65, + 0x72, 0x73, 0x74, 0x72, 0x61, 0x73, 0x73, 0x52, 0x66, 0x72, 0x61, 0x6b, + 0x74, 0x75, 0x72, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x61, 0x6c, 0x65, 0x70, + 0x68, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66, 0x74, 0x61, 0x72, + 0x72, 0x6f, 0x77, 0x75, 0x70, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, + 0x61, 0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68, 0x63, 0x61, 0x72, + 0x72, 0x69, 0x61, 0x67, 0x65, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x61, + 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x6c, 0x65, 0x66, 0x74, 0x61, + 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x75, 0x70, 0x61, 0x72, 0x72, + 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x72, 0x69, 0x67, 0x68, 0x74, 0x61, 0x72, + 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x61, 0x72, + 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x62, 0x6f, 0x74, 0x68, 0x75, 0x6e, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x61, 0x6c, 0x64, 0x69, 0x66, 0x66, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x73, 0x65, + 0x74, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, + 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x6e, 0x6f, 0x74, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x75, 0x63, 0x68, 0x74, + 0x68, 0x61, 0x74, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x69, 0x73, 0x6b, 0x6d, 0x61, 0x74, 0x68, 0x72, 0x61, 0x64, 0x69, 0x63, + 0x61, 0x6c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x69, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x61, 0x6e, + 0x67, 0x6c, 0x65, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x61, 0x6e, + 0x64, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x6f, 0x72, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x75, 0x6e, + 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x73, 0x69, 0x6d, 0x69, + 0x6c, 0x61, 0x72, 0x63, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x65, 0x6e, 0x74, + 0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x6e, + 0x6f, 0x74, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x65, 0x71, 0x75, 0x69, 0x76, + 0x61, 0x6c, 0x65, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x65, 0x71, + 0x75, 0x61, 0x6c, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x65, 0x71, + 0x75, 0x61, 0x6c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x75, 0x62, + 0x73, 0x65, 0x74, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x73, 0x65, 0x74, 0x6e, 0x6f, 0x74, 0x73, 0x75, 0x62, 0x73, + 0x65, 0x74, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x78, 0x73, 0x75, 0x62, 0x73, + 0x65, 0x74, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x78, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x73, 0x65, 0x74, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x70, 0x6c, + 0x75, 0x73, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x79, 0x70, 0x65, 0x72, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x63, 0x75, 0x6c, 0x61, 0x72, 0x64, 0x6f, 0x74, 0x6d, 0x61, 0x74, 0x68, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x74, 0x70, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x62, 0x74, 0x61, 0x6e, 0x67, 0x6c, + 0x65, 0x6c, 0x65, 0x66, 0x74, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x6c, 0x6f, 0x7a, 0x65, 0x6e, 0x67, 0x65, 0x73, 0x70, + 0x61, 0x64, 0x65, 0x63, 0x6c, 0x75, 0x62, 0x68, 0x65, 0x61, 0x72, 0x74, + 0x64, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x63, 0x6f, 0x70, 0x79, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x73, 0x65, 0x72, 0x69, 0x66, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x65, 0x72, 0x69, 0x66, 0x74, 0x72, + 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x65, 0x72, 0x69, 0x66, + 0x72, 0x61, 0x64, 0x69, 0x63, 0x61, 0x6c, 0x65, 0x78, 0x61, 0x72, 0x72, + 0x6f, 0x77, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x61, 0x72, 0x72, 0x6f, + 0x77, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x78, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x61, 0x6e, 0x73, 0x63, 0x6f, 0x70, 0x79, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x61, 0x6e, 0x73, 0x74, 0x72, 0x61, + 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x61, 0x6e, 0x73, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x6c, 0x65, 0x66, 0x74, 0x74, 0x70, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x6c, 0x65, 0x66, 0x74, 0x65, 0x78, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x6c, 0x65, 0x66, 0x74, 0x62, 0x74, 0x62, 0x72, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x74, 0x70, 0x62, 0x72, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x65, 0x78, 0x62, 0x72, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x62, 0x74, 0x62, 0x72, + 0x61, 0x63, 0x65, 0x6c, 0x65, 0x66, 0x74, 0x74, 0x70, 0x62, 0x72, 0x61, + 0x63, 0x65, 0x6c, 0x65, 0x66, 0x74, 0x6d, 0x69, 0x64, 0x62, 0x72, 0x61, + 0x63, 0x65, 0x6c, 0x65, 0x66, 0x74, 0x62, 0x74, 0x62, 0x72, 0x61, 0x63, + 0x65, 0x65, 0x78, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x65, + 0x78, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67, 0x68, 0x74, 0x74, + 0x70, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, + 0x78, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67, 0x68, 0x74, 0x62, + 0x74, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x65, 0x78, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x62, 0x74, 0x62, 0x72, 0x61, 0x63, 0x65, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x65, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x6d, 0x69, 0x64, 0x62, 0x72, 0x61, 0x63, + 0x65, 0x72, 0x69, 0x67, 0x68, 0x74, 0x62, 0x74, 0x61, 0x70, 0x70, 0x6c, + 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, + 0x20, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x4f, 0x54, 0x46, 0x0, + 0x0, 0x1, 0x0, 0x1, 0x1, 0x0, 0x4, 0x0, 0x0, 0x6, 0x1, 0x0, + 0x9, 0x1, 0x0, 0xc, 0x1, 0x0, 0xf, 0x11, 0x0, 0x3c, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x40, 0x0, 0x0, 0x5c, 0x2, 0x0, 0x97, 0x0, 0x0, + 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x98, 0x0, 0x0, 0xa8, 0x0, 0x0, + 0x9f, 0x0, 0x0, 0x65, 0x0, 0x1, 0x87, 0x31, 0x0, 0x74, 0x0, 0x0, + 0x79, 0x0, 0x1, 0xb9, 0x1, 0x0, 0x63, 0x0, 0x1, 0xbb, 0x1b, 0x0, + 0xa6, 0x0, 0x1, 0xd7, 0x41, 0x0, 0xbf, 0x2, 0x0, 0x1, 0x0, 0x4, + 0x0, 0x7, 0x0, 0x3b, 0x0, 0xad, 0x1, 0x68, 0x2, 0x26, 0x2, 0x5c, + 0x2, 0x8f, 0x2, 0xb0, 0x3, 0x4, 0x3, 0x13, 0x3, 0x27, 0x3, 0x73, + 0x3, 0xa3, 0x3, 0xf5, 0x4, 0x65, 0x4, 0x99, 0x4, 0xf2, 0x5, 0x53, + 0x5, 0x7a, 0x5, 0xf1, 0x6, 0x56, 0x6, 0x6d, 0x6, 0xd9, 0x6, 0xf0, + 0x7, 0x3, 0x7, 0x1c, 0x7, 0x79, 0x7, 0x9a, 0x7, 0xbc, 0x7, 0xcc, + 0x8, 0x17, 0x8, 0x2d, 0x8, 0x79, 0x8, 0x91, 0x8, 0xc9, 0x8, 0xf8, + 0x9, 0x6e, 0x9, 0x9d, 0x9, 0xbd, 0xa, 0x3c, 0xa, 0xa0, 0xb, 0xa, + 0xb, 0x4c, 0xb, 0xa9, 0xb, 0xe8, 0xc, 0x18, 0xc, 0xb5, 0xc, 0xc4, + 0xd, 0x1e, 0xd, 0x6f, 0xd, 0xca, 0xe, 0x11, 0xe, 0x88, 0xe, 0xdd, + 0xf, 0x1c, 0xf, 0x69, 0xf, 0xa5, 0xf, 0xde, 0x10, 0x2e, 0x10, 0xab, + 0x11, 0x40, 0x11, 0xab, 0x12, 0x1a, 0x12, 0xa8, 0x13, 0x2, 0x13, 0x87, + 0x14, 0xa, 0x14, 0x90, 0x14, 0xf6, 0x15, 0x4d, 0x15, 0x89, 0x16, 0x4, + 0x16, 0x61, 0x16, 0xac, 0x17, 0x62, 0x17, 0xa8, 0x18, 0x10, 0x18, 0x71, + 0x18, 0xe3, 0x19, 0x2e, 0x19, 0x80, 0x19, 0xe3, 0x1a, 0x47, 0x1a, 0xa3, + 0x1b, 0x18, 0x1b, 0x93, 0x1c, 0x24, 0x1c, 0x85, 0x1c, 0xf2, 0x1d, 0x87, + 0x1d, 0xab, 0x1d, 0xd0, 0x1d, 0xf2, 0x1e, 0x1f, 0x1e, 0x38, 0x1e, 0xc3, + 0x1f, 0x58, 0x20, 0xc, 0x20, 0xe9, 0x21, 0x72, 0x22, 0x1a, 0x22, 0x4b, + 0x22, 0x79, 0x22, 0xa5, 0x22, 0xd4, 0x23, 0x31, 0x23, 0x53, 0x23, 0x96, + 0x23, 0xd5, 0x24, 0xf, 0x24, 0x4e, 0x24, 0xad, 0x24, 0xde, 0x25, 0x46, + 0x25, 0x6b, 0x25, 0xea, 0x26, 0xe, 0x26, 0x33, 0x26, 0x74, 0x26, 0xe6, + 0x27, 0x31, 0x27, 0x80, 0x27, 0xd8, 0x27, 0xe3, 0x28, 0xf3, 0x29, 0x16, + 0x29, 0x88, 0x29, 0xf3, 0x2a, 0xa, 0x2a, 0x26, 0x2a, 0x49, 0x2a, 0x7f, + 0x2a, 0xb5, 0x2b, 0xc, 0x2b, 0x54, 0x2b, 0xa0, 0x2b, 0xfb, 0x2c, 0x46, + 0x2c, 0x84, 0x2c, 0xa1, 0x2c, 0xb3, 0x2c, 0xc8, 0x2c, 0xfa, 0x2d, 0x24, + 0x2d, 0x7a, 0x2d, 0xb6, 0x2d, 0xef, 0x2e, 0x31, 0x2e, 0x7d, 0x2e, 0x98, + 0x2e, 0xb7, 0x2e, 0xf1, 0x2f, 0x2d, 0x2f, 0x45, 0x2f, 0x5f, 0x2f, 0x95, + 0x2f, 0xff, 0x30, 0x8e, 0x30, 0xda, 0x30, 0xf9, 0x31, 0x55, 0x31, 0xeb, + 0x32, 0x87, 0x32, 0x99, 0x32, 0xab, 0x32, 0xc0, 0x33, 0x45, 0x33, 0x92, + 0x33, 0xdb, 0x34, 0x6, 0x34, 0x12, 0x34, 0x3a, 0x34, 0x57, 0x34, 0x68, + 0x34, 0x84, 0x34, 0xa7, 0x34, 0xd5, 0x34, 0xf4, 0x34, 0xfb, 0x35, 0xe, + 0x35, 0x35, 0x35, 0x43, 0x35, 0x6b, 0x35, 0x8a, 0x35, 0x9e, 0x35, 0xbb, + 0x35, 0xd7, 0x36, 0x5, 0x36, 0x21, 0x36, 0x97, 0xfc, 0x45, 0xe, 0xfc, + 0x45, 0xe, 0xfb, 0xf2, 0x7a, 0xf7, 0x4, 0xf8, 0xd5, 0x77, 0x1, 0xf7, + 0x14, 0xf7, 0x4, 0x3, 0xf7, 0x42, 0xf7, 0x64, 0x15, 0x7f, 0x8c, 0x90, + 0x85, 0x8f, 0x1b, 0x8f, 0x8f, 0x91, 0x97, 0x8d, 0x1f, 0xb0, 0xf7, 0xb8, + 0x94, 0xc1, 0xb6, 0x1a, 0xcb, 0x69, 0x96, 0x75, 0x75, 0x69, 0x81, 0x4a, + 0x1e, 0xfc, 0xc2, 0x4, 0x22, 0xa, 0xfb, 0x4b, 0x90, 0x76, 0xf7, 0x64, + 0xb9, 0xf7, 0x4a, 0xb9, 0xf7, 0x63, 0x77, 0x1, 0x9f, 0xf8, 0x61, 0x3, + 0xe9, 0x7b, 0x15, 0xba, 0x6, 0xa8, 0xf7, 0x64, 0x5, 0xf7, 0x10, 0x6, + 0x6f, 0xfb, 0x64, 0x5, 0xba, 0x6, 0xa7, 0xf7, 0x64, 0x5, 0xf3, 0x6, + 0x91, 0xb9, 0x5, 0x24, 0x6, 0xa3, 0xf7, 0x4a, 0x5, 0xf2, 0x6, 0x91, + 0xb9, 0x5, 0x25, 0x6, 0xa7, 0xf7, 0x63, 0x5, 0x5c, 0x6, 0x6f, 0xfb, + 0x63, 0x5, 0xfb, 0x11, 0x6, 0xa8, 0xf7, 0x63, 0x5, 0x5c, 0x6, 0x6e, + 0xfb, 0x63, 0x5, 0x27, 0x6, 0x85, 0x5d, 0x5, 0xef, 0x6, 0x72, 0xfb, + 0x4a, 0x5, 0x24, 0x6, 0x85, 0x5d, 0x5, 0xf2, 0x6, 0xc0, 0xb9, 0x15, + 0xa4, 0xf7, 0x4a, 0x5, 0xf7, 0x10, 0x6, 0x73, 0xfb, 0x4a, 0x5, 0xe, + 0xf7, 0x2a, 0x5d, 0xb1, 0xf7, 0xa6, 0xbc, 0x7c, 0xb1, 0xf7, 0x70, 0xa7, + 0xd0, 0x77, 0x12, 0xca, 0xdc, 0xf7, 0x70, 0xa8, 0xb7, 0xd6, 0xf7, 0x79, + 0xaa, 0x13, 0xdf, 0x80, 0xf7, 0x3f, 0x67, 0x15, 0xc2, 0x6, 0xf8, 0x4d, + 0xf9, 0x47, 0x5, 0x54, 0x6, 0x66, 0x82, 0x33, 0x6b, 0x5c, 0x1b, 0x53, + 0x8a, 0x6c, 0xa4, 0x83, 0x8f, 0x8, 0xa0, 0x71, 0x79, 0x9f, 0x63, 0x1b, + 0xfb, 0x4, 0xfb, 0x6, 0xfb, 0x23, 0xfb, 0x19, 0x40, 0xb9, 0x65, 0xc7, + 0xf7, 0x1a, 0xe4, 0xf7, 0x25, 0xef, 0x8c, 0x1f, 0xa0, 0x8b, 0xa0, 0x88, + 0x9f, 0x1e, 0x9c, 0x81, 0xaa, 0x85, 0xac, 0x8c, 0xb0, 0x8c, 0xb3, 0x93, + 0xa4, 0x9b, 0x8, 0xfb, 0x69, 0x87, 0x15, 0x8d, 0x76, 0x8d, 0x80, 0x6f, + 0x1a, 0x3a, 0x45, 0xfb, 0xf, 0x27, 0x66, 0x7e, 0xb3, 0xad, 0xe3, 0xda, + 0xf7, 0x14, 0xcd, 0x95, 0x1e, 0x9b, 0x7e, 0xac, 0x7d, 0xa1, 0x82, 0x8, + 0xd8, 0xfc, 0x7e, 0x15, 0x3b, 0xbc, 0x5e, 0xd8, 0xf7, 0xc, 0xe4, 0xf7, + 0x2a, 0xf2, 0x1e, 0x13, 0xbf, 0x80, 0xc2, 0x76, 0xcd, 0x35, 0xfb, 0x18, + 0x2b, 0xfb, 0x20, 0xfb, 0x1, 0x1e, 0xd6, 0x80, 0x15, 0xe8, 0xdf, 0xf7, + 0x16, 0xd3, 0x8a, 0x1e, 0xc6, 0x99, 0x5c, 0x60, 0x38, 0x38, 0xfb, 0x11, + 0x26, 0x6c, 0x7d, 0xb0, 0xb2, 0x1f, 0xe, 0xea, 0x79, 0xc6, 0x50, 0xd6, + 0xf7, 0xed, 0x9d, 0xf7, 0x5d, 0xb3, 0x12, 0xb4, 0xe8, 0xc9, 0xd7, 0x8b, + 0xf7, 0x38, 0x8b, 0xbd, 0x13, 0x7f, 0xf8, 0x3e, 0xdd, 0x15, 0x76, 0xa0, + 0xd2, 0x3c, 0xdb, 0x1b, 0x13, 0xbf, 0xdb, 0xb2, 0xb4, 0xd8, 0xac, 0x1f, + 0x7b, 0x99, 0x5, 0x66, 0x61, 0x64, 0x77, 0x73, 0x1b, 0x4f, 0x56, 0xc2, + 0xaa, 0x6c, 0x1f, 0xcc, 0xd7, 0x9f, 0xb7, 0xb2, 0xc8, 0x8, 0xaf, 0xa2, + 0xa3, 0xb5, 0xbd, 0x1b, 0x9d, 0xfb, 0x67, 0x79, 0x7, 0xae, 0xa2, 0x7d, + 0x71, 0x52, 0x48, 0xfb, 0xa, 0x75, 0x7b, 0x1f, 0x4d, 0xd3, 0x60, 0xd6, + 0x69, 0xc9, 0x8, 0xe2, 0xb1, 0xd5, 0xab, 0xe8, 0x1a, 0xc9, 0x4d, 0xc3, + 0x49, 0x27, 0x4d, 0x54, 0x24, 0x1e, 0x13, 0x9f, 0x56, 0x9e, 0x6f, 0x9c, + 0x5b, 0x1e, 0xfb, 0x2, 0x44, 0x3a, 0x5f, 0xfb, 0xd, 0x1a, 0xfb, 0x0, + 0xe2, 0x5b, 0xe4, 0xf7, 0x11, 0xc2, 0xd0, 0xaa, 0xa8, 0x1e, 0xfb, 0xd, + 0xf7, 0xdc, 0x15, 0x7c, 0xb0, 0x79, 0xbc, 0xb8, 0x1a, 0xb6, 0xb1, 0xb0, + 0xba, 0xaf, 0xb6, 0x6a, 0x52, 0x51, 0x3c, 0x6a, 0x57, 0x6d, 0x1e, 0xe8, + 0xfb, 0xc4, 0x15, 0x13, 0xbf, 0x82, 0x83, 0x4e, 0x53, 0x48, 0x1b, 0x44, + 0x52, 0xc9, 0xda, 0xe4, 0xd2, 0xb1, 0xb4, 0xaa, 0x1f, 0xba, 0x3b, 0xa2, + 0x5b, 0xde, 0x24, 0x8, 0xe, 0x50, 0xa, 0xc0, 0xdd, 0x3, 0xf7, 0xb6, + 0xfb, 0x53, 0x15, 0x95, 0x9c, 0x5, 0xfb, 0xe, 0xe6, 0x60, 0xf7, 0x35, + 0xf7, 0x3a, 0x1a, 0xf7, 0x40, 0xad, 0xf7, 0x2f, 0xf7, 0x17, 0xe0, 0x1e, + 0x81, 0x9c, 0x5, 0xfb, 0x0, 0x72, 0xfb, 0x15, 0xfb, 0x2a, 0xfb, 0x95, + 0x1a, 0xfb, 0x7a, 0xf7, 0x22, 0xfb, 0x48, 0xea, 0x75, 0x1e, 0xe, 0x50, + 0xa, 0xf7, 0x58, 0xdd, 0x3, 0xb4, 0xfb, 0x53, 0x15, 0xea, 0xa1, 0xf7, + 0x22, 0xf7, 0x48, 0xf7, 0x7a, 0x1a, 0xf7, 0x95, 0xfb, 0x15, 0xf7, 0x2a, + 0xfb, 0x0, 0xa4, 0x1e, 0x81, 0x7a, 0x5, 0xf7, 0x17, 0x36, 0xad, 0xfb, + 0x2f, 0xfb, 0x40, 0x1a, 0xfb, 0x3a, 0x60, 0xfb, 0x35, 0xfb, 0xe, 0x30, + 0x1e, 0xe, 0xf7, 0xbe, 0x8b, 0x1, 0xf7, 0x8b, 0xc2, 0x3, 0x95, 0xf7, + 0x87, 0x15, 0xf7, 0x81, 0xfb, 0x87, 0xc2, 0xf7, 0x87, 0xf7, 0x81, 0xc2, + 0xfb, 0x81, 0xf7, 0x7f, 0x54, 0xfb, 0x7f, 0xfb, 0x81, 0x6, 0xe, 0xfc, + 0x45, 0xfb, 0x17, 0x76, 0xf7, 0x24, 0xf7, 0x4, 0x22, 0xf4, 0x12, 0xc3, + 0xf7, 0x1e, 0x13, 0xd0, 0xc3, 0xb8, 0x15, 0x6b, 0x9e, 0x76, 0xaf, 0x1e, + 0x13, 0xb0, 0x97, 0x99, 0x93, 0x8a, 0x93, 0x1f, 0x8f, 0x8a, 0x8d, 0x89, + 0x84, 0x1a, 0x54, 0x51, 0x62, 0x73, 0x79, 0x1e, 0x86, 0x87, 0x83, 0x86, + 0x84, 0x1a, 0x84, 0x90, 0x87, 0x92, 0x8f, 0x92, 0x8c, 0x90, 0x92, 0x1e, + 0x9c, 0x95, 0xac, 0xa4, 0x9f, 0xa4, 0x8, 0xaf, 0xb9, 0x8d, 0xb4, 0xa7, + 0x1a, 0xba, 0x65, 0xa7, 0x67, 0x5f, 0x77, 0x6c, 0x6f, 0x1e, 0xe, 0xfc, + 0x45, 0x7a, 0xf7, 0x4, 0x1, 0xd0, 0xf7, 0x4, 0x3, 0xd0, 0xb2, 0x15, + 0x22, 0xa, 0xfc, 0x29, 0x8e, 0x76, 0xf9, 0x2c, 0x77, 0x1, 0x79, 0x4, + 0xb7, 0x6, 0xf7, 0x66, 0xf9, 0x2c, 0x5, 0x5f, 0x6, 0xe, 0xfb, 0x4b, + 0x7a, 0xab, 0xf9, 0x14, 0xa9, 0x1, 0xa2, 0xee, 0xf7, 0x93, 0xe9, 0x3, + 0xf7, 0xe, 0xf7, 0xe3, 0x15, 0xd4, 0x8b, 0xf7, 0x8b, 0xf7, 0x14, 0xf7, + 0x14, 0x8a, 0xfb, 0x8b, 0x42, 0x38, 0x8c, 0xfb, 0x81, 0xfb, 0x14, 0xfb, + 0x14, 0x8b, 0xf7, 0x7f, 0xe0, 0x1e, 0x28, 0x16, 0xfb, 0x11, 0xb6, 0xfb, + 0x77, 0xf7, 0x4c, 0xf7, 0x4c, 0xb0, 0xf7, 0x77, 0xf7, 0x11, 0xf7, 0xf, + 0x66, 0xf7, 0x77, 0xfb, 0x4c, 0xfb, 0x4c, 0x60, 0xfb, 0x77, 0xfb, 0xf, + 0x1e, 0xe, 0xfb, 0x4b, 0x3b, 0xa, 0xf7, 0x69, 0xdf, 0x3, 0xf7, 0x9, + 0x16, 0xf7, 0xa5, 0x9d, 0x6, 0x7e, 0x3b, 0x96, 0xd2, 0x1f, 0xf8, 0xd1, + 0x79, 0x7, 0xfb, 0x36, 0x32, 0x5, 0x79, 0x7, 0xc4, 0xa0, 0x5, 0xa7, + 0x95, 0x96, 0x7e, 0x77, 0x1a, 0xfc, 0x64, 0x7, 0x44, 0x38, 0x80, 0x7e, + 0x1e, 0xe, 0xfb, 0x4b, 0x8b, 0xd7, 0xf8, 0x1c, 0x9d, 0xf7, 0xc, 0xdb, + 0x1, 0xf7, 0xe0, 0xe5, 0x3, 0xa4, 0x16, 0xf8, 0x1d, 0x6, 0xc4, 0xf7, + 0x1d, 0x7e, 0x90, 0x5, 0x4c, 0x64, 0x6e, 0x88, 0x64, 0x1b, 0xfb, 0x77, + 0x6, 0xf7, 0x58, 0xf7, 0x5c, 0xed, 0xf7, 0x6, 0xf5, 0x1a, 0xf7, 0xd, + 0x41, 0xd0, 0x22, 0x33, 0x2d, 0x5a, 0xfb, 0x2b, 0x6d, 0x1e, 0xa0, 0x86, + 0x5, 0xc1, 0xa1, 0xa9, 0xd2, 0xe6, 0x1b, 0xf7, 0x7, 0xa1, 0x30, 0x5c, + 0x37, 0x5d, 0x34, 0x46, 0x40, 0x1f, 0xfb, 0x54, 0xfb, 0x66, 0x5, 0xe, + 0xfb, 0x4b, 0x7a, 0xb2, 0xf8, 0xef, 0xc7, 0x12, 0xf7, 0xcf, 0xdd, 0x65, + 0xd7, 0x13, 0xd0, 0xf7, 0x25, 0xf7, 0xe8, 0x15, 0xf1, 0x8c, 0xf7, 0x4, + 0x5c, 0xfb, 0x1, 0x1a, 0x37, 0x62, 0x3c, 0x2e, 0x6e, 0x74, 0x97, 0x9c, + 0x76, 0x1e, 0x9c, 0x76, 0x77, 0x98, 0x74, 0x1b, 0x68, 0x7d, 0x7e, 0x6e, + 0x58, 0xf7, 0x10, 0x86, 0x9e, 0xf7, 0x20, 0xf7, 0x5, 0xe5, 0xf7, 0x27, + 0xf7, 0x16, 0x36, 0xb5, 0x5d, 0x9b, 0x1f, 0x13, 0xe0, 0xcd, 0xb8, 0xa6, + 0xb6, 0xc1, 0x1a, 0xb4, 0x70, 0xe9, 0xfb, 0x15, 0x48, 0x2c, 0x6b, 0xfb, + 0x17, 0x63, 0x1e, 0x9a, 0x87, 0x5, 0xa7, 0x9a, 0xbb, 0xda, 0xe6, 0x1b, + 0xd5, 0xac, 0x56, 0x58, 0x2f, 0x40, 0x5b, 0x2c, 0x71, 0x1f, 0x86, 0x8b, + 0x86, 0x86, 0x1a, 0xe, 0xfb, 0x4b, 0xa0, 0x76, 0xf7, 0x33, 0xd1, 0xf8, + 0x5c, 0x77, 0x1, 0x9b, 0xb8, 0xf7, 0x81, 0xdf, 0x3, 0x9b, 0xf7, 0x33, + 0x15, 0xf7, 0xae, 0xfb, 0x33, 0xdf, 0xf7, 0x33, 0xe2, 0xd1, 0x34, 0xf8, + 0x5c, 0x59, 0x6, 0xfb, 0xd0, 0xfc, 0x5b, 0x5, 0xb8, 0x8a, 0x15, 0xf7, + 0x81, 0xf7, 0xe4, 0x5, 0xfb, 0xe4, 0x7, 0xe, 0xfb, 0x4b, 0x7a, 0xb3, + 0xf8, 0x1c, 0xe0, 0xe9, 0xda, 0x1, 0xf7, 0xf7, 0xd2, 0x3, 0xc7, 0xf8, + 0x33, 0x15, 0xf7, 0x7, 0x86, 0xf7, 0x48, 0x59, 0xfb, 0x34, 0x1a, 0xfb, + 0xe, 0x42, 0x54, 0x4a, 0x70, 0x78, 0x9d, 0x9d, 0x77, 0x1e, 0x9d, 0x78, + 0x77, 0x9d, 0x6d, 0x1b, 0x6c, 0x75, 0x7a, 0x6b, 0x57, 0xe5, 0x80, 0xbd, + 0xf7, 0x32, 0xee, 0xf7, 0x1, 0xf7, 0x19, 0xf7, 0x2d, 0x30, 0xf7, 0x4, + 0xfb, 0x57, 0x95, 0x1f, 0xaf, 0xe9, 0x5, 0xf7, 0x79, 0x6, 0xb1, 0xe1, + 0x7c, 0x90, 0x5, 0x81, 0x81, 0x6e, 0x89, 0x64, 0x1b, 0xfb, 0x48, 0x6, + 0xe, 0xfb, 0x4b, 0x7d, 0xa7, 0xf8, 0x4, 0xb9, 0xf7, 0x95, 0x77, 0x1, + 0xad, 0xe8, 0xf7, 0x8f, 0xe5, 0x3, 0xf8, 0x51, 0xf9, 0x41, 0x15, 0xfb, + 0x85, 0x82, 0xfb, 0x3e, 0xfb, 0x4a, 0xfb, 0x5f, 0x1a, 0xfb, 0x66, 0xf1, + 0x2c, 0xf7, 0xa, 0xf7, 0x46, 0xaf, 0xf7, 0x33, 0xd4, 0xf7, 0x1a, 0x3d, + 0xd7, 0x22, 0x54, 0x74, 0x7f, 0x6c, 0x52, 0x1e, 0xa0, 0xf7, 0xc, 0xee, + 0xf7, 0x1b, 0xf7, 0x48, 0xa7, 0x8, 0xfb, 0xce, 0xfb, 0xdc, 0x15, 0xad, + 0xaf, 0xaf, 0x93, 0xb0, 0x1b, 0xf2, 0xa9, 0x27, 0x24, 0xfb, 0x5, 0x5d, + 0x57, 0x4c, 0x40, 0x48, 0xd5, 0xf7, 0x3c, 0xad, 0x8c, 0xa5, 0x93, 0xa3, + 0x1f, 0xe, 0xfb, 0x4b, 0x92, 0x76, 0xf8, 0xe9, 0xe5, 0x1, 0xf7, 0x43, + 0x7b, 0x15, 0xc7, 0x6, 0xf7, 0x69, 0xf9, 0x25, 0x5, 0xab, 0xfb, 0xff, + 0x7, 0x4e, 0xfb, 0x34, 0xa1, 0x82, 0x5, 0xb3, 0xa3, 0xa6, 0xb2, 0xc3, + 0x1b, 0xf7, 0x6d, 0x6, 0xe, 0xfb, 0x4b, 0x79, 0xab, 0xf9, 0xe, 0xb0, + 0x12, 0xc1, 0xd9, 0x45, 0xd1, 0xf7, 0x72, 0xcc, 0x55, 0xd6, 0x13, 0xe4, + 0xf7, 0x63, 0xf7, 0xcd, 0x15, 0xf7, 0x4, 0x38, 0xb9, 0x6d, 0x41, 0x1a, + 0x45, 0x5d, 0x61, 0x4c, 0x3a, 0x60, 0xcc, 0xd8, 0xe6, 0xb3, 0xb2, 0xae, + 0xa6, 0x1e, 0x6f, 0xa6, 0x15, 0x34, 0x4a, 0x65, 0x61, 0x34, 0x1a, 0x3d, + 0xcf, 0x35, 0xf7, 0x10, 0xf7, 0x3a, 0xa7, 0xf7, 0x8, 0xbf, 0xce, 0x7c, + 0xc8, 0xfb, 0x16, 0xe1, 0x1e, 0x13, 0xd8, 0xc1, 0xb1, 0xd1, 0xbc, 0xe7, + 0x1a, 0xd7, 0x4c, 0xcd, 0xfb, 0x5, 0x35, 0x2c, 0x55, 0x26, 0x3a, 0xab, + 0x69, 0xe0, 0x40, 0x1e, 0xde, 0xbd, 0x15, 0x68, 0xa1, 0x30, 0xc4, 0xd9, + 0x1a, 0xbb, 0xab, 0xc0, 0xd6, 0xd8, 0xad, 0x55, 0x54, 0x33, 0x56, 0x66, + 0x64, 0x73, 0x1e, 0xe, 0xfb, 0x4b, 0x8e, 0x76, 0xf7, 0x8d, 0xb6, 0xf8, + 0xe, 0xac, 0x1, 0xaa, 0xe6, 0xf7, 0x84, 0xed, 0x3, 0xc2, 0x8d, 0x15, + 0x90, 0x77, 0x5, 0xf7, 0x8e, 0x98, 0xf7, 0x2a, 0xf7, 0x48, 0xf7, 0x75, + 0x1a, 0xf7, 0x3b, 0x2a, 0xf7, 0xa, 0xfb, 0xf, 0xfb, 0x16, 0x3c, 0xfb, + 0x5, 0xfb, 0x19, 0x39, 0xb8, 0xfb, 0x12, 0xf7, 0x1a, 0xbd, 0xc0, 0x9d, + 0xb0, 0xb7, 0x1e, 0x87, 0x70, 0x54, 0xfb, 0x6d, 0xfb, 0x87, 0x63, 0x8, + 0xf7, 0xc3, 0xf7, 0xd8, 0x15, 0x69, 0x6a, 0x61, 0x79, 0x6a, 0x1b, 0x21, + 0x75, 0xf7, 0x13, 0xd7, 0xdd, 0xa2, 0xe8, 0xdf, 0xf7, 0x17, 0x8d, 0xfb, + 0x4f, 0x4a, 0x76, 0x89, 0x69, 0x89, 0x78, 0x1f, 0xe, 0xfc, 0x29, 0x7a, + 0xf7, 0x4, 0xf7, 0x91, 0xf7, 0x4, 0x1, 0xdc, 0xf7, 0x4, 0x3, 0xdc, + 0xb2, 0x37, 0xa, 0xf8, 0x1, 0x4, 0x22, 0xa, 0xfc, 0x29, 0xfb, 0x17, + 0x76, 0xf7, 0x3b, 0x76, 0xa6, 0x76, 0xf7, 0xf0, 0xf7, 0x4, 0x12, 0xde, + 0xf7, 0x1e, 0xfb, 0x15, 0xf7, 0x4, 0x13, 0xd8, 0xde, 0xb5, 0x15, 0x72, + 0x9b, 0x74, 0xb0, 0x90, 0x91, 0x8c, 0x8d, 0x90, 0x1e, 0x13, 0xb8, 0x8d, + 0x91, 0x91, 0x8c, 0x8f, 0x1b, 0x91, 0x8f, 0x87, 0x80, 0x6f, 0x7b, 0x71, + 0x7b, 0x7a, 0x1f, 0x7c, 0x7c, 0x7a, 0x7f, 0x7f, 0x83, 0x8, 0x7e, 0x82, + 0x85, 0x88, 0x80, 0x1a, 0x86, 0x8d, 0x88, 0x91, 0x8e, 0x8f, 0x8b, 0x8c, + 0x90, 0x1e, 0x95, 0x8d, 0xb7, 0xab, 0xa5, 0xaa, 0x8, 0xa8, 0xae, 0x94, + 0xb7, 0xab, 0x1a, 0xb2, 0x6a, 0xaf, 0x5d, 0x6a, 0x71, 0x75, 0x67, 0x1e, + 0x13, 0xd4, 0x94, 0xf7, 0xfe, 0x15, 0x22, 0xa, 0xa0, 0x76, 0xf8, 0x9e, + 0x77, 0x1, 0xa5, 0xf7, 0x7a, 0x15, 0xf8, 0x85, 0xfb, 0x7a, 0x5, 0xc9, + 0x7, 0xfc, 0x45, 0xf7, 0x5b, 0x3e, 0xa, 0xf7, 0x21, 0xc2, 0xf7, 0x1f, + 0xc2, 0x1, 0x96, 0xf7, 0xe3, 0x15, 0x3a, 0xa, 0xfb, 0x8d, 0x4, 0x3a, + 0xa, 0xe, 0xa0, 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xf8, 0x9f, 0xf7, 0x7a, + 0x15, 0x51, 0xa, 0xf8, 0x44, 0xfb, 0x5b, 0xfc, 0x44, 0xfb, 0x5b, 0x5, + 0x4d, 0x7, 0xe, 0xfb, 0x83, 0x7a, 0xf7, 0x4, 0xf8, 0xc3, 0xab, 0x1, + 0xf7, 0x42, 0xf7, 0x4, 0xa6, 0xeb, 0x3, 0xf7, 0x74, 0xf7, 0x3b, 0x15, + 0xa0, 0x6, 0x98, 0xe7, 0xb1, 0xc3, 0xad, 0xb3, 0x8, 0x9f, 0xa3, 0xc6, + 0xd6, 0xd6, 0x1a, 0xbd, 0x77, 0xf6, 0xfb, 0x32, 0xfb, 0x5, 0x5b, 0x32, + 0x4a, 0x69, 0x9f, 0x68, 0xa8, 0xa1, 0x9b, 0x97, 0xa5, 0x9e, 0x80, 0x99, + 0x81, 0x9a, 0x1e, 0x82, 0x98, 0x82, 0x99, 0x9e, 0x1a, 0xb2, 0xb9, 0x9f, + 0xbe, 0xc1, 0xb7, 0x56, 0x41, 0x4b, 0x76, 0x56, 0x75, 0x51, 0x1e, 0x77, + 0x53, 0x77, 0x48, 0x85, 0x4d, 0x8, 0x59, 0xfb, 0x14, 0x15, 0x22, 0xa, + 0x4e, 0xa, 0xe1, 0xd8, 0x3, 0xe1, 0xfb, 0x2f, 0x15, 0xf7, 0x69, 0xa4, + 0x3c, 0x6, 0x64, 0x79, 0xa3, 0xb0, 0x1f, 0xf9, 0x25, 0x7, 0xb0, 0x9d, + 0xa3, 0xb2, 0x1e, 0xda, 0xa4, 0xfb, 0x69, 0x6, 0xe, 0x4e, 0xa, 0xf7, + 0x3d, 0xd8, 0x3, 0xac, 0xfb, 0x16, 0x15, 0x72, 0xf7, 0x69, 0xf9, 0xd1, + 0xfb, 0x69, 0x72, 0xda, 0x7, 0xb2, 0x9d, 0x73, 0x66, 0x1f, 0xfd, 0x25, + 0x7, 0x66, 0x79, 0x73, 0x64, 0x1e, 0xe, 0xfb, 0x4b, 0xfb, 0x90, 0xb9, + 0x1, 0x89, 0xfb, 0x62, 0x15, 0x5d, 0xf8, 0x8c, 0xb9, 0x7, 0xe, 0x4d, + 0xa, 0xf7, 0x4e, 0xd6, 0x3, 0xc5, 0xf7, 0x7c, 0x15, 0xc4, 0x7f, 0xd2, + 0x8b, 0x27, 0x1a, 0xfb, 0x53, 0x7, 0x39, 0xac, 0x6d, 0xd8, 0x1e, 0xf0, + 0xa4, 0x5a, 0x6, 0x52, 0x6d, 0xaa, 0xc3, 0x1f, 0xf7, 0x53, 0x7, 0xdb, + 0x28, 0xb4, 0x5b, 0x8e, 0x1e, 0xb8, 0x93, 0xf1, 0xaf, 0xdd, 0x1a, 0xf7, + 0x53, 0x7, 0xc5, 0xa9, 0xa8, 0xc4, 0x1e, 0xbc, 0xa4, 0x26, 0x6, 0x3f, + 0x69, 0x71, 0x35, 0x1f, 0xfb, 0x53, 0x7, 0x27, 0x44, 0x8b, 0x52, 0x7f, + 0x1e, 0xe, 0xfc, 0x77, 0xfb, 0x30, 0x76, 0xf9, 0xe6, 0x77, 0x1, 0xcc, + 0xd1, 0x3, 0xcc, 0xfb, 0x45, 0x15, 0xd1, 0xf9, 0xe6, 0x45, 0x6, 0xe, + 0x4d, 0xa, 0xf7, 0x6b, 0xd6, 0x3, 0xda, 0xfb, 0x32, 0x15, 0x72, 0xf0, + 0x7, 0xd8, 0xac, 0xa7, 0xdf, 0x1f, 0xf7, 0x53, 0x7, 0xef, 0xd2, 0x8b, + 0xc4, 0x97, 0x1e, 0xa5, 0x7, 0x52, 0x97, 0x44, 0x8b, 0xef, 0x1a, 0xf7, + 0x53, 0x7, 0xdd, 0x6b, 0xa9, 0x3d, 0x1e, 0x26, 0x72, 0xbc, 0x6, 0xbd, + 0xb0, 0x74, 0x4b, 0x1f, 0xfb, 0x53, 0x7, 0x39, 0xf3, 0x65, 0xb6, 0x83, + 0x1e, 0x5e, 0x89, 0x25, 0x63, 0x3b, 0x1a, 0xfb, 0x53, 0x7, 0x4b, 0x66, + 0x74, 0x59, 0x1e, 0xe, 0xa9, 0xf7, 0x7d, 0xc2, 0x1, 0xf8, 0xf1, 0xc2, + 0x3, 0xae, 0xf7, 0xb4, 0x15, 0xf9, 0x5, 0xfb, 0xb4, 0x54, 0xf7, 0x7d, + 0xfc, 0xce, 0x6, 0xe, 0xfb, 0xaf, 0xf8, 0x15, 0xb4, 0xf7, 0x6e, 0xb4, + 0x1, 0xbd, 0xb6, 0xf7, 0x6b, 0xb5, 0x3, 0xbd, 0xf8, 0xab, 0x15, 0x38, + 0xce, 0x48, 0xde, 0xdd, 0xcf, 0xce, 0xde, 0xdd, 0x47, 0xcf, 0x39, 0x38, + 0x48, 0x49, 0x37, 0x1e, 0xb6, 0x16, 0xc7, 0xb9, 0xbc, 0xc7, 0xc8, 0xbb, + 0x5a, 0x4f, 0x4e, 0x5b, 0x5b, 0x4f, 0x4e, 0x5d, 0xbb, 0xc8, 0x1e, 0xe, + 0x8b, 0xc2, 0xf7, 0xbe, 0xc2, 0xf7, 0x81, 0x77, 0x1, 0xf7, 0x8b, 0xc2, + 0x3, 0x95, 0xf7, 0xf5, 0x15, 0xf7, 0x81, 0xfb, 0x82, 0xc2, 0xf7, 0x82, + 0xf7, 0x81, 0xc2, 0xfb, 0x81, 0xf7, 0x81, 0x54, 0xfb, 0x81, 0xfb, 0x81, + 0x6, 0xfc, 0x2c, 0x4, 0xf8, 0xa5, 0xc2, 0xfc, 0xa5, 0x6, 0xe, 0x20, + 0xfb, 0x5e, 0x76, 0xf7, 0x61, 0xbd, 0x59, 0xd2, 0xf8, 0x53, 0x77, 0x12, + 0xc8, 0xe1, 0xf7, 0x63, 0xe1, 0x13, 0xdc, 0xec, 0xaa, 0x15, 0x6c, 0x9c, + 0xbd, 0x79, 0xb4, 0x1b, 0xca, 0xd3, 0xd2, 0xb1, 0x9a, 0x1f, 0x52, 0x8c, + 0xb8, 0x57, 0xcf, 0x1b, 0xd1, 0xa7, 0xc6, 0xc7, 0x1f, 0x77, 0x6, 0x72, + 0x81, 0x80, 0x5f, 0x67, 0x1b, 0x69, 0x7b, 0xbd, 0xad, 0x1f, 0xf8, 0x14, + 0x35, 0xfb, 0xfe, 0x7, 0x13, 0xbc, 0x5d, 0x6f, 0x62, 0x64, 0x5c, 0x1b, + 0x4a, 0x71, 0xbf, 0xc9, 0x1f, 0xf7, 0xe1, 0x35, 0xfc, 0x80, 0x7, 0x73, + 0x88, 0x78, 0x87, 0x7b, 0x1e, 0x83, 0x6b, 0x7e, 0x72, 0x63, 0x1a, 0x66, + 0x9e, 0x65, 0xa8, 0xa6, 0x9e, 0xb2, 0xb0, 0xb0, 0x7e, 0xa1, 0x82, 0xaf, + 0x1e, 0x87, 0x9b, 0x88, 0x9f, 0x8a, 0xa3, 0x8, 0xe, 0xa8, 0x76, 0xf8, + 0x98, 0x77, 0x1, 0x9c, 0xb8, 0x15, 0xaf, 0x66, 0xf7, 0x72, 0xf7, 0x72, + 0xf7, 0x72, 0xfb, 0x72, 0xaf, 0xb0, 0xfb, 0x70, 0xf7, 0x71, 0xf7, 0x70, + 0xf7, 0x71, 0x68, 0xb0, 0xfb, 0x73, 0xfb, 0x72, 0xfb, 0x72, 0xf7, 0x72, + 0x67, 0x66, 0xf7, 0x70, 0xfb, 0x71, 0x5, 0xe, 0xd2, 0xf7, 0x4, 0xc0, + 0xc2, 0xc0, 0xf7, 0x4, 0x1, 0xf7, 0x68, 0xf7, 0x4, 0x14, 0xe0, 0x95, + 0xf7, 0x80, 0x15, 0x3a, 0xa, 0xf7, 0x5e, 0xf7, 0x1, 0x37, 0xa, 0xfb, + 0xa5, 0x4, 0x22, 0xa, 0xfb, 0x4b, 0xf8, 0xa, 0xac, 0xf7, 0x91, 0xa5, + 0x1, 0x8d, 0xdf, 0xf7, 0xdc, 0xdb, 0x3, 0xf0, 0xf8, 0xa, 0x15, 0xf7, + 0x9, 0x6, 0x6d, 0xfb, 0xab, 0x85, 0x4f, 0x84, 0x53, 0x8, 0x6a, 0x87, + 0x76, 0xfb, 0x5, 0x53, 0x1b, 0x82, 0x80, 0x8d, 0x90, 0x1f, 0x9a, 0x97, + 0x8b, 0xb0, 0x1a, 0x9f, 0x78, 0x9e, 0x78, 0x76, 0x72, 0x7d, 0x65, 0x5a, + 0xb6, 0x74, 0xb5, 0x1e, 0xe8, 0x8c, 0xb0, 0xe6, 0x9c, 0xd7, 0xa7, 0xf7, + 0x1c, 0x9c, 0xf7, 0x16, 0xa2, 0xf7, 0x19, 0x8, 0xf7, 0xe, 0x6, 0x95, + 0xac, 0x5, 0xfb, 0x14, 0x6, 0xf7, 0x3d, 0xa0, 0x9c, 0xdf, 0xbe, 0x1b, + 0x9b, 0x94, 0x87, 0x83, 0x1f, 0x84, 0x85, 0x7b, 0x81, 0x1a, 0x76, 0x9c, + 0x73, 0xa4, 0xa5, 0x97, 0x9e, 0xa8, 0xb3, 0x67, 0xa7, 0x6b, 0xfb, 0x26, + 0x65, 0xfb, 0x30, 0xfb, 0xf, 0x7b, 0x1e, 0xfb, 0x4, 0x6, 0xe, 0xb2, + 0xa0, 0x76, 0xf7, 0x6e, 0xb5, 0xf8, 0x31, 0x77, 0x1, 0x8f, 0xf7, 0x13, + 0xf8, 0x4, 0xf7, 0x4d, 0x3, 0x8f, 0x16, 0xf7, 0x54, 0x9d, 0x6, 0x7c, + 0x59, 0x90, 0xb5, 0x94, 0x8d, 0x95, 0x8f, 0x97, 0x1f, 0xbb, 0xf7, 0xe, + 0x5, 0xf7, 0x97, 0x6, 0xbc, 0xfb, 0xe, 0x5, 0x8f, 0x7f, 0x8d, 0x81, + 0x82, 0x1a, 0x61, 0x59, 0x86, 0x7c, 0x1e, 0x79, 0xf7, 0x8e, 0x9d, 0x7, + 0x5d, 0x7d, 0xaf, 0xb1, 0x7a, 0x1f, 0xfb, 0x8f, 0xf8, 0xd9, 0x5, 0x71, + 0x6, 0xfb, 0x8d, 0xfc, 0xd9, 0x5, 0x67, 0x7b, 0x79, 0x65, 0x60, 0x1b, + 0xf7, 0x5c, 0xf7, 0x86, 0x15, 0xf7, 0x5, 0xf7, 0xa0, 0xf7, 0x5, 0xfb, + 0xa0, 0x5, 0xe, 0x7b, 0x8b, 0xb5, 0xf7, 0xb2, 0xb5, 0xf7, 0x98, 0xb6, + 0x12, 0xf7, 0xb, 0xf3, 0xf7, 0x81, 0xf2, 0x36, 0xf7, 0x6, 0x13, 0xf4, + 0xa8, 0x16, 0xf7, 0xe7, 0x6, 0xf7, 0x10, 0xef, 0xd5, 0xf7, 0x2, 0xd6, + 0x5d, 0xd0, 0xfb, 0x2, 0xa3, 0x1f, 0x8d, 0x7, 0x13, 0xf8, 0xe3, 0xa5, + 0xb2, 0xbb, 0xd3, 0x1a, 0xf7, 0x32, 0xfb, 0x32, 0x9a, 0x28, 0x33, 0xa, + 0xf7, 0xf4, 0x15, 0x13, 0x78, 0xf7, 0x8f, 0x7, 0x99, 0xd2, 0x86, 0x97, + 0xf7, 0xc, 0xad, 0x42, 0x4e, 0xfb, 0xd, 0xfb, 0xa, 0x86, 0x63, 0x1e, + 0x3c, 0x61, 0x15, 0xde, 0x6, 0x13, 0xf4, 0xf1, 0xd1, 0x68, 0xfb, 0x9, + 0x3a, 0x4f, 0x56, 0x4b, 0x1f, 0x33, 0x6, 0x61, 0x8a, 0xab, 0xa3, 0x1f, + 0xe, 0x3b, 0xa0, 0x76, 0xf9, 0x8, 0xb8, 0x77, 0x9f, 0x12, 0xf7, 0x11, + 0xf3, 0xf7, 0xf7, 0xa4, 0x13, 0xd0, 0xa3, 0x16, 0xf7, 0xbb, 0x9d, 0x6, + 0x2a, 0xa, 0x13, 0x58, 0xf8, 0xac, 0xf7, 0x54, 0x7, 0xea, 0xcc, 0x6a, + 0x37, 0x8e, 0x1f, 0xa4, 0x6, 0x7a, 0xf7, 0x36, 0x5, 0xfc, 0xcc, 0x6, + 0x13, 0xb0, 0x77, 0x7, 0x9f, 0x8a, 0xdc, 0x86, 0x23, 0x1a, 0xfc, 0x57, + 0x7, 0x54, 0x5d, 0x78, 0x54, 0x1e, 0xe, 0x43, 0x8b, 0xb9, 0xf7, 0xb3, + 0xb5, 0xf7, 0x8e, 0xbb, 0x79, 0x9d, 0x12, 0xf7, 0xe, 0xf3, 0xf7, 0x96, + 0xa2, 0xa8, 0xa6, 0x13, 0xee, 0xab, 0x16, 0xf8, 0xa9, 0x6, 0xb9, 0xf7, + 0x3e, 0x5, 0x6c, 0x6, 0x58, 0x73, 0x72, 0x42, 0x21, 0x1b, 0xfb, 0x33, + 0x6, 0x76, 0x78, 0x99, 0xae, 0x1f, 0xf7, 0x82, 0xf7, 0x30, 0x7, 0xdb, + 0xa1, 0x69, 0x4f, 0x1f, 0xa2, 0xf7, 0x7a, 0x74, 0x6, 0x4f, 0x75, 0x69, + 0x3b, 0x1e, 0xfb, 0x30, 0xf7, 0x8e, 0xf7, 0x6b, 0x6, 0xe1, 0x87, 0x55, + 0x5d, 0x98, 0x1f, 0xa6, 0xf7, 0x28, 0xfc, 0xa7, 0x6, 0x13, 0xdc, 0x79, + 0x7, 0x25, 0xa, 0xe, 0x43, 0x8b, 0xb5, 0xf8, 0xe1, 0xb5, 0x1, 0xb7, + 0xf8, 0xe4, 0x3, 0xb7, 0x16, 0xf8, 0xcb, 0x6, 0xa4, 0xf7, 0x49, 0x5, + 0x6e, 0x6, 0x5c, 0x7d, 0x78, 0x2f, 0xfb, 0x1f, 0x1b, 0xfb, 0x87, 0x6, + 0xf8, 0x31, 0xf8, 0xf0, 0x5, 0xa6, 0xfc, 0x9e, 0x7, 0x7c, 0xfb, 0x43, + 0x5, 0xa4, 0x6, 0xd1, 0x9f, 0x9a, 0xca, 0xf7, 0x12, 0x1b, 0xf7, 0x6f, + 0x6, 0xfc, 0x41, 0xfc, 0xf8, 0x5, 0xe, 0xb2, 0xa0, 0x76, 0xf7, 0xd7, + 0xb5, 0xf7, 0xc8, 0x77, 0x1, 0xf7, 0x15, 0xf3, 0xf7, 0xc2, 0xf3, 0x3, + 0xb2, 0x24, 0xa, 0xf7, 0x7b, 0xf7, 0xc2, 0xfb, 0x7b, 0x27, 0xa, 0x79, + 0xf7, 0xb0, 0x9d, 0x7, 0x2a, 0xa, 0xf8, 0x7d, 0x7, 0x3c, 0xa, 0xfb, + 0x6c, 0xfb, 0xc2, 0xf7, 0x6c, 0x26, 0xa, 0xc5, 0x7a, 0xb2, 0xf7, 0xae, + 0xce, 0xf7, 0xa5, 0xb2, 0x1, 0xb4, 0xf7, 0x6, 0xf8, 0x50, 0xf7, 0x8, + 0x3, 0xb4, 0xf7, 0xe6, 0x15, 0xfb, 0x42, 0xf7, 0x14, 0xfb, 0x49, 0xf7, + 0x63, 0xf7, 0x63, 0xf7, 0x18, 0xf7, 0x49, 0xf7, 0x42, 0xf7, 0x3e, 0xfb, + 0x1b, 0xf7, 0x43, 0xfb, 0x60, 0xfb, 0x60, 0xfb, 0x17, 0xfb, 0x43, 0xfb, + 0x3e, 0x1e, 0xf7, 0x6, 0x16, 0xf7, 0x22, 0xbc, 0xf7, 0x38, 0xf7, 0x40, + 0xf7, 0x41, 0xbd, 0xfb, 0x38, 0xfb, 0x22, 0xfb, 0x1a, 0x50, 0xfb, 0x4a, + 0xfb, 0x38, 0xfb, 0x3d, 0x57, 0xf7, 0x4a, 0xf7, 0x1a, 0x1e, 0xd9, 0x35, + 0x15, 0x9a, 0x8a, 0x5, 0xad, 0x96, 0x9e, 0x9e, 0xb0, 0x1b, 0xf7, 0x12, + 0x6, 0xb0, 0x9e, 0x78, 0x69, 0x96, 0x1f, 0x9a, 0x8c, 0x5, 0x87, 0xac, + 0x89, 0xa7, 0xa4, 0x1a, 0xa4, 0x8d, 0xa7, 0x8f, 0xab, 0x1e, 0x7c, 0x8c, + 0x5, 0x6a, 0x80, 0x78, 0x77, 0x66, 0x1b, 0xfb, 0x12, 0x6, 0x66, 0x78, + 0x9f, 0xac, 0x80, 0x1f, 0x7c, 0x8a, 0x5, 0x8f, 0x6b, 0x8d, 0x6f, 0x72, + 0x1a, 0x72, 0x89, 0x6f, 0x87, 0x6a, 0x1e, 0xe, 0xfb, 0xf2, 0x3b, 0xa, + 0xf7, 0xe, 0xf3, 0x3, 0xab, 0x24, 0xa, 0xf8, 0x7d, 0x26, 0xa, 0xb2, + 0x3b, 0xa, 0xf7, 0x11, 0xf3, 0xf7, 0x9a, 0xf7, 0x42, 0x3, 0xae, 0x24, + 0xa, 0xf7, 0x61, 0x7, 0xac, 0xa9, 0xf7, 0x66, 0xfb, 0x81, 0x5, 0x9a, + 0x79, 0x93, 0x7d, 0x80, 0x1a, 0x77, 0x72, 0x82, 0x57, 0x1e, 0x79, 0xf7, + 0xc4, 0x9d, 0x7, 0x6a, 0x91, 0x73, 0x88, 0x43, 0xdc, 0xfb, 0x95, 0xf7, + 0xb6, 0x18, 0xd5, 0xd0, 0xbd, 0xbb, 0xcd, 0xd0, 0x8, 0xc5, 0xc6, 0xae, + 0x9e, 0xb8, 0x1b, 0x9d, 0xfb, 0x98, 0x79, 0x7, 0xbd, 0xaf, 0x81, 0x74, + 0x80, 0x84, 0x7c, 0x79, 0x79, 0x1f, 0x3f, 0x3d, 0x3d, 0x43, 0x38, 0x47, + 0x8, 0xf7, 0x71, 0x26, 0xa, 0x8e, 0x8b, 0x9d, 0xf9, 0x28, 0x77, 0x1, + 0x91, 0xf7, 0x28, 0xf7, 0xdd, 0xf7, 0x59, 0x3, 0x91, 0x16, 0xf7, 0x6b, + 0x9d, 0x6, 0x6d, 0x66, 0x91, 0xb4, 0x97, 0x8e, 0x9a, 0x92, 0x9e, 0x1f, + 0xf7, 0x26, 0xf8, 0x15, 0xf7, 0x36, 0xfc, 0x17, 0x5, 0x91, 0x7c, 0x90, + 0x75, 0x81, 0x1a, 0x5f, 0x51, 0x8b, 0x7a, 0x1e, 0x79, 0xf7, 0xa4, 0x9d, + 0x7, 0x80, 0x53, 0xa1, 0xd0, 0x6d, 0x1f, 0xfb, 0x87, 0xf8, 0xcd, 0x5, + 0x83, 0x6, 0xfb, 0x6c, 0xfc, 0xcb, 0x5, 0x52, 0x74, 0x46, 0x67, 0x79, + 0x1b, 0xe, 0xf7, 0x62, 0x3b, 0xa, 0xf7, 0xd, 0xbc, 0xf8, 0x9f, 0xf3, + 0x3, 0xa7, 0x16, 0xf7, 0x7c, 0x9d, 0x6, 0x58, 0x64, 0xa6, 0xba, 0x1f, + 0xf8, 0x57, 0x7, 0xf7, 0x98, 0xfc, 0xb3, 0x5, 0x9d, 0x6, 0xf7, 0x89, + 0xf8, 0xd0, 0x5, 0xfc, 0x74, 0x27, 0xa, 0x79, 0xf7, 0xb0, 0x9d, 0x7, + 0x54, 0x68, 0x94, 0xcc, 0x1f, 0xf8, 0x76, 0x7, 0xd2, 0xc8, 0x95, 0xa8, + 0x1e, 0x9d, 0xfb, 0x5c, 0x7, 0xfb, 0x74, 0xfc, 0x92, 0xfb, 0x7e, 0xf8, + 0x92, 0x5, 0xfb, 0x5d, 0x79, 0x6, 0xda, 0x85, 0x99, 0x65, 0x49, 0x1a, + 0xfc, 0x59, 0x7, 0x5c, 0x61, 0x70, 0x58, 0x1e, 0xe, 0xb2, 0x98, 0x76, + 0xf9, 0x3d, 0x77, 0x1, 0xf7, 0xb, 0xbc, 0xf8, 0x31, 0xbc, 0x3, 0xa8, + 0x83, 0x15, 0xf7, 0x79, 0x9d, 0x6, 0x58, 0x64, 0xa6, 0xba, 0x1f, 0xf8, + 0x5b, 0x7, 0xf8, 0x4c, 0xfc, 0xb7, 0x5, 0xa1, 0xf8, 0xe1, 0x6, 0x31, + 0xa, 0xfb, 0x79, 0x45, 0xa, 0xfc, 0x20, 0x7, 0xfc, 0x13, 0xf8, 0x7c, + 0x5, 0xfb, 0x3d, 0x79, 0x6, 0xbe, 0x94, 0x79, 0x69, 0xa9, 0x1f, 0xfc, + 0x9b, 0x7, 0x5c, 0x64, 0x70, 0x58, 0x1e, 0xe, 0x65, 0x8b, 0xe8, 0xf7, + 0x69, 0xea, 0xf7, 0x4a, 0xe5, 0x1, 0xaf, 0x9d, 0xe8, 0x9d, 0xf7, 0xc9, + 0x9d, 0xe4, 0x9d, 0x3, 0xc7, 0xf8, 0x9e, 0x15, 0x9b, 0x6, 0x9d, 0x8e, + 0x8d, 0xb6, 0xcd, 0x1b, 0xf7, 0xec, 0x6, 0xcd, 0x8e, 0x60, 0x79, 0x8e, + 0x1f, 0x9b, 0xf7, 0x2b, 0xfc, 0x9b, 0x6, 0xe2, 0xfc, 0x3b, 0x15, 0x9d, + 0x6, 0xbb, 0x8e, 0xa3, 0x93, 0xae, 0x1b, 0xf7, 0x4d, 0x6, 0xae, 0xa3, + 0x83, 0x5b, 0x8e, 0x1f, 0x9d, 0xf7, 0x63, 0x79, 0x6, 0x5b, 0x88, 0x73, + 0x83, 0x68, 0x1b, 0xfb, 0x4d, 0x6, 0x68, 0x73, 0x93, 0xbb, 0x88, 0x1f, + 0x79, 0x6, 0xfb, 0x3, 0xfc, 0x5d, 0x15, 0xf8, 0xc7, 0xf7, 0x56, 0x79, + 0x6, 0x47, 0x82, 0x7b, 0x6a, 0x43, 0x1b, 0xfb, 0xdd, 0x6, 0x43, 0x77, + 0xac, 0xcf, 0x82, 0x1f, 0x79, 0x6, 0xe, 0xb2, 0x7a, 0xb2, 0xf9, 0x4, + 0xb2, 0x1, 0xb4, 0xf7, 0x8, 0xf8, 0x4f, 0xf7, 0x7, 0x3, 0xb4, 0xf7, + 0xe4, 0x15, 0xfb, 0x42, 0xf7, 0x16, 0xfb, 0x47, 0xf7, 0x63, 0xf7, 0x63, + 0xf7, 0x16, 0xf7, 0x47, 0xf7, 0x42, 0xf7, 0x3e, 0xfb, 0x19, 0xf7, 0x47, + 0xfb, 0x60, 0xfb, 0x60, 0xfb, 0x19, 0xfb, 0x47, 0xfb, 0x3e, 0x1e, 0xf7, + 0x8, 0x16, 0xf7, 0x1b, 0xc6, 0xf7, 0x43, 0xf7, 0x36, 0xf7, 0x3b, 0xc2, + 0xfb, 0x3f, 0xfb, 0x20, 0xfb, 0x1b, 0x53, 0xfb, 0x46, 0xfb, 0x3a, 0xfb, + 0x3c, 0x56, 0xf7, 0x48, 0xf7, 0x1a, 0x1e, 0xe, 0xe0, 0xa0, 0x76, 0xf9, + 0xc, 0xb4, 0x79, 0x9d, 0x12, 0xf7, 0x7, 0xf2, 0xf7, 0xe1, 0xf2, 0x13, + 0xd8, 0xa4, 0x24, 0xa, 0x8a, 0xf8, 0xb0, 0x5, 0xf7, 0xe1, 0xfc, 0xb0, + 0x6, 0x28, 0xa, 0x79, 0xf7, 0xb0, 0x9d, 0x7, 0x2a, 0xa, 0x8a, 0xf8, + 0x6f, 0x5, 0x13, 0xb8, 0xd4, 0xcc, 0x9a, 0xa5, 0x1e, 0x9d, 0xfd, 0x64, + 0x79, 0x7, 0xa5, 0xcb, 0x7c, 0x42, 0x1f, 0xfc, 0x6f, 0x39, 0xa, 0xfb, + 0x13, 0xa0, 0x76, 0xf7, 0xc0, 0xb4, 0xf7, 0xb8, 0xb3, 0x79, 0x9d, 0x12, + 0xf7, 0xa, 0xf3, 0xf7, 0x6a, 0xf6, 0x13, 0xdc, 0xa7, 0x24, 0xa, 0xf7, + 0x64, 0x7, 0xf7, 0xbe, 0x8a, 0xa2, 0xd5, 0xf7, 0xf, 0x1a, 0xf7, 0x5, + 0x6a, 0xcb, 0xfb, 0x61, 0x33, 0xa, 0xf7, 0xe3, 0x15, 0xf7, 0x94, 0x7, + 0x13, 0xec, 0x9e, 0x9d, 0x90, 0x9c, 0x1e, 0xf7, 0x9, 0x8c, 0xc9, 0x77, + 0xfb, 0xa, 0x1a, 0xfb, 0x12, 0x6b, 0x6e, 0xfb, 0x2d, 0x7f, 0x81, 0x92, + 0x90, 0x84, 0x1e, 0xe, 0x30, 0x8b, 0xe9, 0xf8, 0xa9, 0xb9, 0x1, 0x90, + 0x16, 0xf8, 0xb7, 0x6, 0xb0, 0xf7, 0x61, 0x5, 0x77, 0x6, 0x2a, 0x6d, + 0x5c, 0x7d, 0x4b, 0x1b, 0xfb, 0xaf, 0x6, 0xf7, 0x80, 0xf7, 0xa7, 0xfb, + 0x5d, 0xf7, 0x96, 0x5, 0xf7, 0x66, 0x6, 0xee, 0xa6, 0x48, 0x65, 0x95, + 0x1f, 0x9e, 0x6, 0x81, 0xf7, 0x2b, 0x5, 0xfc, 0x9a, 0x6, 0xf7, 0xa1, + 0xfb, 0xee, 0x5, 0xe, 0x43, 0xa0, 0x76, 0xf9, 0xe, 0xb2, 0x1, 0xae, + 0xa3, 0xf7, 0x65, 0xf3, 0xf7, 0x65, 0xa2, 0x3, 0xf7, 0x46, 0x24, 0xa, + 0xf8, 0xb2, 0x7, 0xf7, 0xc, 0x8c, 0xe5, 0x6f, 0x8a, 0x20, 0xa5, 0x8d, + 0x18, 0x86, 0xf7, 0x3f, 0x5, 0xfc, 0xc8, 0x6, 0x86, 0xfb, 0x3f, 0xa5, + 0x89, 0x8c, 0xf6, 0xdb, 0xa7, 0xf7, 0x14, 0x8a, 0x19, 0xfc, 0xb2, 0x39, + 0xa, 0x92, 0x3b, 0xa, 0xf7, 0xba, 0xf3, 0x3, 0xf7, 0x60, 0x24, 0xa, + 0xf7, 0x60, 0x7, 0xf7, 0x4d, 0xf7, 0xbe, 0x5, 0xca, 0xb2, 0xb0, 0x89, + 0xae, 0x1b, 0x9d, 0xfb, 0x7c, 0x79, 0x7, 0xbf, 0x9b, 0x7f, 0x7c, 0x81, + 0x84, 0x7e, 0x84, 0x80, 0x1f, 0xfb, 0x20, 0xfb, 0x7b, 0xfb, 0x30, 0xf7, + 0x83, 0x5, 0x85, 0x95, 0x88, 0x94, 0x92, 0x1a, 0x9d, 0xa5, 0x94, 0xbf, + 0x1e, 0x9d, 0xfb, 0xbd, 0x79, 0x7, 0xc0, 0xac, 0x64, 0x7b, 0x97, 0x1f, + 0xf7, 0x60, 0xfb, 0xc0, 0x5, 0xfb, 0x64, 0x39, 0xa, 0xdb, 0x8b, 0x9d, + 0xe2, 0xae, 0xf8, 0x21, 0xaa, 0xe2, 0x9d, 0x1, 0xa5, 0xf7, 0xd, 0xf7, + 0x4f, 0xf1, 0xf7, 0x4f, 0xf7, 0xa, 0x3, 0xf7, 0x7c, 0x16, 0xf7, 0xc6, + 0x9d, 0x6, 0x32, 0x7e, 0xb4, 0xb9, 0x1f, 0xf7, 0x21, 0x8a, 0xf7, 0x38, + 0xd5, 0xf7, 0x2d, 0x1a, 0xf7, 0x23, 0xfb, 0x2b, 0xe9, 0xfb, 0x2e, 0x1e, + 0xb9, 0x97, 0xb4, 0xe4, 0x1e, 0x9d, 0xfb, 0xc4, 0x79, 0x7, 0xe4, 0x97, + 0x62, 0x5d, 0x1f, 0xfb, 0x37, 0xfb, 0x25, 0x2f, 0xfb, 0x25, 0xfb, 0x2f, + 0xf7, 0x35, 0x43, 0xf7, 0x27, 0x8c, 0x1f, 0x5d, 0x7e, 0x62, 0x32, 0x1e, + 0xf7, 0x60, 0xf7, 0xe, 0x15, 0xf8, 0x21, 0x7, 0xf7, 0x4, 0xd6, 0x31, + 0xfb, 0x8, 0x3d, 0x5a, 0xfb, 0x5, 0xfb, 0x1e, 0x1f, 0x25, 0x16, 0xfb, + 0x1c, 0x58, 0xf7, 0x4, 0xda, 0xf7, 0x1, 0xce, 0xeb, 0xf7, 0xc, 0x8c, + 0x1f, 0xe, 0xb2, 0xa0, 0x76, 0xf9, 0x35, 0x77, 0x12, 0x82, 0xf7, 0x38, + 0xfb, 0x38, 0xf9, 0x5d, 0xfb, 0x46, 0xf7, 0x35, 0x13, 0xe8, 0x82, 0x16, + 0xf7, 0x7a, 0x9d, 0x6, 0x59, 0x7b, 0x9f, 0xa0, 0x95, 0x90, 0x96, 0x92, + 0x94, 0x1f, 0xf7, 0x39, 0xf7, 0x5f, 0xf7, 0x21, 0xfb, 0x67, 0x5, 0x91, + 0x81, 0x8e, 0x82, 0x83, 0x1a, 0x76, 0x72, 0x7c, 0x56, 0x1e, 0x79, 0x7, + 0x13, 0xd0, 0xf7, 0xc0, 0x9d, 0x6, 0x62, 0x5f, 0xb9, 0x9b, 0x7f, 0x1f, + 0xfb, 0x67, 0xf7, 0xbb, 0xf7, 0x42, 0xf7, 0x65, 0x5, 0x13, 0xf0, 0xae, + 0xa9, 0xc7, 0xaf, 0xa6, 0x1b, 0x9d, 0xfb, 0x7c, 0x79, 0x7, 0xc0, 0x9d, + 0x7e, 0x7a, 0x7d, 0x83, 0x7c, 0x82, 0x7f, 0x1f, 0xfb, 0x20, 0xfb, 0x3f, + 0xfb, 0xf, 0xf7, 0x47, 0x5, 0x84, 0x96, 0x89, 0x95, 0x94, 0x1a, 0x9f, + 0xa4, 0x98, 0xc0, 0x1e, 0x9d, 0xfb, 0xc0, 0x79, 0x7, 0xb8, 0xb7, 0x5b, + 0x7b, 0x97, 0x1f, 0xf7, 0x51, 0xfb, 0x96, 0xfb, 0x5d, 0xfb, 0x88, 0x5, + 0x66, 0x6c, 0x51, 0x69, 0x73, 0x1b, 0xe, 0xf7, 0x4, 0xa0, 0x76, 0xf7, + 0xb6, 0xb3, 0xf7, 0xd9, 0x9d, 0x96, 0x77, 0x12, 0xd2, 0xf7, 0x7, 0xf7, + 0x34, 0xf3, 0xf7, 0x34, 0xf7, 0x7, 0x14, 0xe, 0x13, 0xde, 0xf7, 0x94, + 0x24, 0xa, 0xf7, 0x5a, 0x7, 0xf7, 0x1b, 0xf7, 0x20, 0xad, 0xf7, 0x20, + 0xf7, 0x5, 0x82, 0xe4, 0xcc, 0x1f, 0x9d, 0x7, 0xfb, 0x19, 0x65, 0x3a, + 0xfb, 0x1b, 0xfb, 0x12, 0x29, 0x80, 0x4d, 0x8a, 0x1f, 0xf7, 0x8f, 0x7, + 0x13, 0xee, 0x3c, 0xa, 0xfb, 0x8f, 0x7, 0x4d, 0x8c, 0x29, 0x96, 0xf7, + 0x12, 0x1a, 0x13, 0xde, 0xf7, 0x1e, 0x6c, 0xd9, 0xfb, 0x20, 0x1e, 0x79, + 0x7, 0xd2, 0x7c, 0x33, 0xfb, 0x6, 0xfb, 0x21, 0xf7, 0x1f, 0x6a, 0xf7, + 0x1c, 0x1f, 0xfb, 0x5a, 0x39, 0xa, 0x57, 0x79, 0xad, 0x69, 0xd1, 0xf8, + 0x26, 0xb9, 0x12, 0xb4, 0xf5, 0x13, 0x70, 0xf8, 0x4e, 0xf6, 0x15, 0x49, + 0xae, 0xa5, 0x50, 0xb7, 0x1b, 0xd4, 0x8d, 0xf7, 0x4, 0xb6, 0x1f, 0x79, + 0x6, 0x7d, 0x8c, 0x76, 0x44, 0x6b, 0x1b, 0x69, 0x6b, 0xcb, 0xc1, 0x7d, + 0x1f, 0xf7, 0x7, 0xf7, 0xde, 0x5, 0x33, 0x6, 0x4b, 0xfb, 0x53, 0x5, + 0xdc, 0x7c, 0x55, 0xf7, 0x2, 0xfb, 0x2, 0x1b, 0xfb, 0x22, 0x42, 0xfb, + 0x0, 0xfb, 0x13, 0xfb, 0x35, 0xaf, 0xfb, 0xe, 0xf7, 0x3b, 0xea, 0xe1, + 0xeb, 0xa8, 0x9c, 0x1f, 0x68, 0xf7, 0x8, 0x15, 0x13, 0xb0, 0x20, 0x70, + 0x40, 0x27, 0x4f, 0x1b, 0x2b, 0x89, 0xf7, 0x42, 0xd4, 0xf4, 0x92, 0xe1, + 0xf3, 0xd1, 0xcc, 0xfb, 0x28, 0x38, 0x99, 0x1f, 0xe, 0xfb, 0x5e, 0x76, + 0xf7, 0x61, 0xbb, 0xf8, 0x5, 0xc2, 0xf7, 0x91, 0xad, 0x12, 0xd8, 0xd9, + 0xf7, 0x61, 0xf2, 0x56, 0xf4, 0x13, 0xfa, 0xf7, 0x32, 0xb0, 0x15, 0xbd, + 0x65, 0xc9, 0x79, 0xc6, 0x8c, 0x8, 0xe8, 0x8c, 0xe8, 0xda, 0xf7, 0x1e, + 0x1a, 0xf2, 0x55, 0xe1, 0x2f, 0xb6, 0x1e, 0x13, 0xfc, 0xc8, 0xa2, 0xac, + 0xc7, 0xc8, 0x1a, 0xf7, 0x7, 0x34, 0xbd, 0xfb, 0x0, 0x3c, 0xfb, 0x4, + 0x51, 0x28, 0x1e, 0xfd, 0x23, 0x7, 0x58, 0x80, 0x59, 0x86, 0x58, 0x1e, + 0xe2, 0x6, 0x8e, 0xa4, 0x90, 0xa4, 0xa4, 0x1a, 0x8a, 0xf7, 0x85, 0x15, + 0xf8, 0x8c, 0x7, 0xc7, 0xbc, 0xbd, 0xc0, 0xd6, 0xa6, 0x4f, 0x49, 0x8c, + 0x1e, 0x5c, 0x8c, 0x7b, 0x3b, 0x65, 0x7a, 0x77, 0x91, 0x74, 0x1b, 0x77, + 0x78, 0x81, 0x74, 0x73, 0x9e, 0x81, 0xa0, 0x1f, 0xa3, 0x9e, 0x91, 0x9f, + 0x1b, 0x13, 0xfa, 0xc0, 0xb9, 0xfb, 0x3a, 0x4b, 0x40, 0x6a, 0x4b, 0x31, + 0x59, 0x54, 0xa6, 0xaf, 0x70, 0x1f, 0xe, 0xfb, 0xa4, 0xfb, 0x60, 0x76, + 0xf9, 0x1b, 0xd8, 0x1, 0x90, 0x9b, 0xf7, 0x32, 0xf7, 0xb, 0x3, 0xf7, + 0x83, 0xc7, 0x15, 0x78, 0x5a, 0x62, 0x2b, 0x45, 0x1a, 0x63, 0x9e, 0x6d, + 0xa7, 0xbd, 0xa1, 0xca, 0xc1, 0xcf, 0x7c, 0xd4, 0x88, 0xa4, 0x1e, 0xf7, + 0x60, 0xf8, 0x4d, 0x5, 0x23, 0x6, 0xfb, 0x5, 0xfb, 0xf9, 0x5, 0x89, + 0x6, 0xe8, 0x79, 0x6c, 0xf7, 0x9c, 0xfb, 0x0, 0x1b, 0x4c, 0x65, 0x54, + 0x3d, 0x8a, 0x1f, 0x74, 0x8b, 0x77, 0x8a, 0x7b, 0x1e, 0x9b, 0x6, 0xb3, + 0x8e, 0x9a, 0xd6, 0xc0, 0x1b, 0xef, 0xad, 0xfb, 0x9f, 0x2c, 0x98, 0x1f, + 0xe, 0xfb, 0x51, 0x78, 0xba, 0xf9, 0x34, 0xb3, 0x12, 0xb3, 0xee, 0x61, + 0xbc, 0xf7, 0x82, 0xec, 0x13, 0xe8, 0xf7, 0x93, 0xf8, 0x53, 0x15, 0xfb, + 0x2b, 0x68, 0x4b, 0x34, 0xfb, 0x17, 0x1a, 0x25, 0xe7, 0xfb, 0x3, 0xf7, + 0x18, 0xf7, 0xb, 0xed, 0xf7, 0x0, 0xf7, 0x8, 0xf7, 0xf, 0x54, 0xcf, + 0x43, 0xc4, 0x1e, 0x13, 0xd8, 0x21, 0xde, 0x25, 0xb9, 0xcf, 0x1a, 0xa7, + 0xb1, 0xa1, 0xad, 0xb2, 0xa4, 0x7b, 0x77, 0x9d, 0x1e, 0x6b, 0xa9, 0x9a, + 0x60, 0xb5, 0x1b, 0xa8, 0xa3, 0x9c, 0xaa, 0xcf, 0xfb, 0xa, 0xae, 0x3d, + 0x4b, 0x38, 0x78, 0x40, 0x33, 0xf7, 0x2, 0x58, 0xbb, 0x4f, 0x1f, 0xaa, + 0x6e, 0x15, 0x97, 0x88, 0xe6, 0x24, 0x86, 0xfb, 0x2, 0x8, 0x32, 0x87, + 0x5f, 0x36, 0x41, 0x1b, 0x66, 0x6d, 0xa4, 0xad, 0x77, 0x1f, 0x13, 0xe8, + 0x76, 0xae, 0x7c, 0xb7, 0xb1, 0x1a, 0xef, 0xb0, 0xe0, 0xf7, 0x2, 0xa8, + 0x1e, 0xe, 0xfb, 0x88, 0x78, 0xb9, 0xf7, 0x58, 0xba, 0x64, 0xbc, 0xf7, + 0x4e, 0xaf, 0x12, 0xa1, 0xf3, 0x30, 0xe6, 0x13, 0xb8, 0xf7, 0x19, 0xf7, + 0x90, 0x15, 0x65, 0x86, 0x42, 0x66, 0x30, 0x1a, 0x28, 0xf7, 0x4, 0x64, + 0xe6, 0xf7, 0x4, 0xe5, 0xa7, 0xed, 0x1e, 0x71, 0x92, 0x5, 0x49, 0x77, + 0x63, 0x76, 0x4f, 0x1b, 0x4d, 0x8a, 0x2e, 0xa6, 0xdb, 0x1a, 0xc5, 0xb0, + 0xb3, 0xce, 0x1e, 0x13, 0xd8, 0xa6, 0x97, 0x83, 0xb0, 0x1b, 0x9d, 0x9b, + 0x94, 0xa2, 0x1f, 0x13, 0xb8, 0x9d, 0x79, 0x92, 0x79, 0x1e, 0x13, 0xd4, + 0x67, 0x7c, 0x81, 0x6f, 0x1b, 0x5a, 0x5a, 0xb1, 0xcf, 0xb2, 0xb3, 0xbe, + 0xc0, 0x1f, 0xaf, 0x8c, 0xab, 0x76, 0x92, 0x6e, 0x8, 0x5c, 0x96, 0xa8, + 0x86, 0x9e, 0x1b, 0xa4, 0x9c, 0xa2, 0xa5, 0xc5, 0x30, 0xa9, 0x53, 0x37, + 0xfb, 0x16, 0x67, 0x20, 0x1f, 0x8c, 0x55, 0xb7, 0x69, 0xc0, 0x78, 0x8, + 0xe, 0xfb, 0x51, 0xfb, 0x75, 0xef, 0xf7, 0x17, 0xed, 0xf9, 0x20, 0x77, + 0x12, 0xc7, 0xbb, 0x85, 0xc6, 0xf7, 0x9c, 0xb5, 0x13, 0xf4, 0xf7, 0x59, + 0xf8, 0xdc, 0x15, 0x3c, 0x33, 0x51, 0xfb, 0x35, 0x2d, 0x1a, 0xfb, 0x54, + 0xf7, 0x0, 0x60, 0xf7, 0x44, 0xb8, 0xaf, 0x77, 0x62, 0x70, 0x76, 0x43, + 0x51, 0x98, 0x1e, 0x8e, 0x7c, 0x68, 0x98, 0x72, 0x1b, 0x63, 0x7d, 0x6f, + 0x77, 0x63, 0xc0, 0x7f, 0xaa, 0xf1, 0xcb, 0xd9, 0xf7, 0xd, 0xf7, 0x12, + 0xfb, 0x13, 0x8f, 0xfb, 0x2, 0xfb, 0x2, 0x7f, 0xec, 0xb7, 0xf7, 0x20, + 0xce, 0xf7, 0x2, 0xcc, 0xe2, 0x1f, 0xbe, 0x86, 0xf7, 0x23, 0xbc, 0xc5, + 0x1a, 0xab, 0x77, 0x9a, 0x73, 0x4f, 0x27, 0x25, 0x7c, 0x7f, 0x1e, 0x13, + 0xec, 0x72, 0x8e, 0x6b, 0xa2, 0xae, 0x1a, 0xb2, 0xb5, 0x9e, 0x96, 0x90, + 0x1e, 0x89, 0x9d, 0x5, 0x67, 0x41, 0x58, 0x5d, 0x72, 0xa1, 0x66, 0xd4, + 0x7e, 0x1f, 0xe, 0x3b, 0xfb, 0x49, 0x76, 0xf7, 0x73, 0x76, 0xf8, 0x4f, + 0xd2, 0x62, 0x76, 0x12, 0x8b, 0x9d, 0xf2, 0xe0, 0xf7, 0x61, 0xe4, 0x13, + 0xee, 0xf7, 0xd, 0x16, 0xe0, 0xf7, 0xeb, 0x6, 0xb7, 0x9e, 0xac, 0xc3, + 0xbe, 0x1b, 0xc6, 0xb3, 0x74, 0x41, 0x8e, 0x1f, 0x99, 0xfc, 0x5c, 0x8d, + 0x56, 0x92, 0x7c, 0x8f, 0x73, 0x19, 0xe4, 0x6, 0x82, 0x9e, 0x84, 0xb7, + 0x97, 0x1a, 0x80, 0xf8, 0x85, 0x5, 0xda, 0x89, 0x5b, 0xcc, 0x39, 0x1b, + 0x40, 0x4f, 0x6f, 0x33, 0x6d, 0x1f, 0xbf, 0x8e, 0x6c, 0xc3, 0x53, 0x1b, + 0x36, 0x69, 0x39, 0x4b, 0x1f, 0x9d, 0x6, 0x13, 0xde, 0xa9, 0x8c, 0xa0, + 0xc9, 0xae, 0x1b, 0xb3, 0x91, 0x52, 0x58, 0x1f, 0xe, 0xfb, 0x36, 0x7a, + 0xb1, 0xf7, 0xbb, 0xbf, 0xf7, 0xb4, 0xad, 0x1, 0xb6, 0xf1, 0xf7, 0x86, + 0xed, 0x3, 0xf7, 0x9f, 0x7a, 0x15, 0xf7, 0x3f, 0xba, 0xf7, 0x71, 0xf7, + 0x1d, 0xf7, 0x24, 0x4f, 0xf7, 0x61, 0xfb, 0x34, 0xfb, 0x35, 0x4e, 0xfb, + 0x70, 0xfb, 0x11, 0xfb, 0x18, 0xc5, 0xfb, 0x7a, 0xf7, 0x3a, 0x1f, 0xfb, + 0xe, 0xf8, 0x15, 0x15, 0xf7, 0x1d, 0xae, 0xf7, 0x2b, 0xe1, 0xf0, 0x9e, + 0xfb, 0x49, 0x20, 0x8c, 0x1e, 0xfb, 0x85, 0x57, 0x15, 0xf7, 0x84, 0x6, + 0x32, 0x71, 0xfb, 0x62, 0x2e, 0x2c, 0x71, 0xf7, 0x65, 0xe1, 0x1e, 0xe, + 0xfb, 0xf6, 0x7a, 0xbd, 0xf8, 0x6a, 0x77, 0x1, 0xe3, 0xe0, 0x3, 0xf7, + 0xd5, 0xf0, 0x15, 0x78, 0x6, 0x6e, 0x89, 0x7e, 0x64, 0x61, 0x1b, 0x5a, + 0x88, 0xce, 0xae, 0x1f, 0xf8, 0x4, 0x7, 0x57, 0x78, 0x6c, 0x7b, 0x31, + 0x79, 0x8, 0x77, 0x7, 0xab, 0xc3, 0x8f, 0xfb, 0x17, 0x1f, 0xfb, 0x78, + 0x7, 0x5f, 0xa7, 0x5b, 0xcd, 0xf5, 0x93, 0xe8, 0xa4, 0x90, 0x1e, 0xe, + 0xa0, 0x76, 0xf8, 0x41, 0xd3, 0x48, 0xa0, 0x12, 0xf7, 0xb, 0xd6, 0x13, + 0xd0, 0xf7, 0xb, 0x16, 0xd6, 0xf7, 0x96, 0x6, 0xf7, 0x2f, 0xfb, 0x55, + 0x5, 0x92, 0x82, 0x90, 0x81, 0x83, 0x1a, 0x80, 0x81, 0x82, 0x6f, 0x1e, + 0x79, 0xf7, 0x7f, 0x9d, 0x7, 0x50, 0x71, 0xaf, 0xb0, 0x6c, 0x1f, 0xfb, + 0x3c, 0xf7, 0x6a, 0xbe, 0xbe, 0xaa, 0xa6, 0xab, 0xa6, 0x19, 0x99, 0x9c, + 0x96, 0x90, 0x95, 0x1b, 0x97, 0x8a, 0x95, 0x81, 0x9e, 0x7e, 0x93, 0x84, + 0x9b, 0x87, 0x9b, 0x8c, 0x8, 0xa4, 0x8c, 0xa5, 0x98, 0xb0, 0x1a, 0xaf, + 0x62, 0x9e, 0x6a, 0x6f, 0x6d, 0x80, 0x7b, 0x78, 0x1e, 0x41, 0x4f, 0x48, + 0x49, 0x43, 0x4b, 0x8, 0x13, 0x50, 0xf7, 0x6d, 0x7, 0x13, 0xb0, 0x39, + 0x69, 0x65, 0x82, 0x62, 0x88, 0x8, 0x76, 0x7, 0xae, 0x8a, 0xbe, 0x85, + 0x35, 0x1a, 0xe, 0x7a, 0xe2, 0xf8, 0xe5, 0xd7, 0x1, 0xc6, 0x9e, 0xf7, + 0x67, 0xb1, 0xf7, 0x5e, 0x9e, 0x3, 0xa3, 0x7a, 0x15, 0xe7, 0x6, 0xf7, + 0x3f, 0xf8, 0x12, 0x5, 0x8d, 0x6, 0xfb, 0x24, 0xaa, 0x89, 0xfb, 0x82, + 0xf7, 0xf, 0x1b, 0xe1, 0xa0, 0xf6, 0xd4, 0x1f, 0x78, 0x6, 0x70, 0x8a, + 0x77, 0x41, 0x57, 0x1b, 0x62, 0x6e, 0xba, 0xb6, 0x7f, 0x1f, 0x5f, 0xf7, + 0x30, 0x65, 0xf7, 0x51, 0x60, 0xf7, 0x3a, 0x8, 0xb5, 0x80, 0x6b, 0xad, + 0x5a, 0x1b, 0x45, 0x6d, 0xfb, 0x12, 0x56, 0x8d, 0x1f, 0x9e, 0x6, 0xa3, + 0x8a, 0xa3, 0xda, 0xc1, 0x1b, 0xbf, 0xaa, 0x2f, 0x42, 0x9c, 0x1f, 0xe, + 0xfb, 0x36, 0x90, 0x76, 0xf8, 0x9f, 0x77, 0x1, 0xf7, 0x7c, 0x7b, 0x15, + 0xb0, 0x6, 0xa1, 0xb7, 0xe2, 0xf7, 0x44, 0xc1, 0xf7, 0x2, 0x8, 0xa5, + 0xc0, 0x9c, 0xb5, 0xb5, 0x1a, 0xa6, 0x82, 0xa8, 0x5d, 0x58, 0x89, 0x50, + 0x5a, 0x94, 0x1e, 0x8f, 0x75, 0x8e, 0x7a, 0x7c, 0x1a, 0x6d, 0x83, 0x74, + 0x78, 0x66, 0x1e, 0x3f, 0xfb, 0x2c, 0xfb, 0x32, 0xf8, 0x28, 0x51, 0x72, + 0x88, 0x8c, 0x45, 0x84, 0x19, 0x78, 0x7, 0xb4, 0x86, 0xa4, 0x87, 0x99, + 0x67, 0x8, 0xe, 0xfb, 0x52, 0xfb, 0x5f, 0x76, 0xf7, 0x70, 0xeb, 0xf7, + 0xb8, 0xe7, 0xf7, 0xb6, 0x77, 0x12, 0xa6, 0xbc, 0x7f, 0xc0, 0x74, 0xb2, + 0xf7, 0xb3, 0xbc, 0x13, 0xfb, 0xf7, 0x2d, 0xf8, 0x2e, 0x15, 0x42, 0x50, + 0x56, 0x53, 0x31, 0x1a, 0xfb, 0x43, 0xf7, 0x37, 0x69, 0xf7, 0x28, 0xa7, + 0xc1, 0x89, 0x51, 0x53, 0x64, 0x6d, 0x68, 0x97, 0x1e, 0x6a, 0x96, 0x72, + 0x90, 0x79, 0x89, 0x8, 0x6d, 0x89, 0x7c, 0x7b, 0x6e, 0x1a, 0x60, 0xc0, + 0x81, 0xa6, 0xf4, 0xc6, 0xdc, 0xf7, 0xd, 0xd7, 0x43, 0xb1, 0x3d, 0xfb, + 0x3d, 0x41, 0xc8, 0xce, 0xe1, 0xe1, 0xd5, 0xb2, 0x9b, 0x1e, 0x85, 0x8c, + 0xb8, 0x85, 0xbb, 0x1b, 0xc6, 0xc1, 0x97, 0xb9, 0xa6, 0x6b, 0x92, 0x72, + 0x51, 0x39, 0x6c, 0x7c, 0x71, 0x1f, 0x64, 0xa3, 0x7e, 0xac, 0xab, 0x1a, + 0xb5, 0xa8, 0xb3, 0xaa, 0x98, 0x1e, 0xad, 0x85, 0xf7, 0x19, 0xb0, 0xc0, + 0x1a, 0xa1, 0x7e, 0x9b, 0x6f, 0x5a, 0x45, 0x4f, 0x73, 0x6e, 0x1e, 0x13, + 0xf5, 0x6e, 0x8d, 0x72, 0x9c, 0xa7, 0x1a, 0xac, 0x9e, 0x96, 0x97, 0x90, + 0x1e, 0x89, 0x9d, 0x5, 0x58, 0x6c, 0x6c, 0x62, 0x64, 0xb6, 0x6e, 0xa9, + 0x83, 0x1f, 0x13, 0xfb, 0x6f, 0x6b, 0x7c, 0x68, 0x68, 0x1a, 0x66, 0x9d, + 0x66, 0xb4, 0x6b, 0x1e, 0xe, 0x78, 0xb7, 0xf8, 0x4f, 0xaa, 0x1, 0xae, + 0xea, 0xf7, 0xad, 0xe5, 0x3, 0xae, 0xf7, 0x80, 0x15, 0xfb, 0xe, 0xef, + 0xfb, 0x19, 0xf7, 0x21, 0xf7, 0x23, 0xdd, 0xf7, 0x17, 0xf7, 0x2a, 0xf7, + 0x24, 0x20, 0xe8, 0xfb, 0x1b, 0xfb, 0x1d, 0x34, 0xfb, 0x1b, 0xfb, 0x14, + 0x1e, 0xea, 0xaa, 0x15, 0xde, 0xa1, 0xf7, 0xa, 0xf0, 0xf7, 0xd, 0xb0, + 0xfb, 0x34, 0x29, 0x33, 0x68, 0x2a, 0x30, 0xfb, 0x2, 0x5e, 0xf7, 0x28, + 0xe9, 0x1e, 0xe, 0x78, 0xe9, 0xf7, 0xda, 0xe1, 0x1, 0x95, 0xf7, 0xdc, + 0x15, 0x9c, 0x6, 0xc4, 0xab, 0x9c, 0x9b, 0xa7, 0x1b, 0xc4, 0x6, 0x6e, + 0xfb, 0x6c, 0x8b, 0x6d, 0x7c, 0x73, 0x8, 0x77, 0x6b, 0x64, 0x72, 0x63, + 0x1a, 0x7d, 0x95, 0x64, 0xb8, 0xb2, 0x9a, 0xa7, 0xb4, 0x94, 0x1e, 0x97, + 0xc1, 0x9d, 0xf7, 0x2, 0x9b, 0xf7, 0x4f, 0x8, 0xf7, 0x5, 0x6, 0x7a, + 0xfb, 0x35, 0x5, 0x3a, 0x82, 0x87, 0xfb, 0x46, 0xf7, 0x9, 0x1b, 0xd3, + 0xaf, 0xd8, 0xf2, 0x1f, 0x76, 0x6, 0x76, 0x78, 0x4a, 0x5c, 0x66, 0x75, + 0xbf, 0xb2, 0xb1, 0x8b, 0xdb, 0x97, 0xf7, 0x9, 0x1e, 0xf7, 0x1a, 0xe1, + 0xfc, 0x11, 0x6, 0x33, 0x63, 0xfb, 0x0, 0x58, 0x80, 0x1f, 0xe, 0xfb, + 0x65, 0x76, 0xf9, 0x36, 0xc2, 0x1, 0xc6, 0xe3, 0xf7, 0x91, 0xe5, 0x3, + 0xf7, 0x27, 0xb3, 0x15, 0xb0, 0x69, 0xab, 0x6f, 0xca, 0x8c, 0x8, 0xf7, + 0x2b, 0x8d, 0xc7, 0xef, 0xf7, 0x4a, 0x1a, 0xf7, 0x4f, 0x45, 0xbc, 0xfb, + 0x2d, 0xfb, 0x1c, 0x40, 0x26, 0xfb, 0xa, 0x8c, 0x1e, 0x8f, 0xfc, 0x3b, + 0x5, 0x6d, 0x87, 0x69, 0x84, 0x74, 0x1e, 0xe2, 0x6, 0x95, 0xb3, 0x8b, + 0xae, 0xb3, 0x1a, 0x88, 0xf7, 0x70, 0x15, 0x85, 0xf7, 0x7b, 0x5, 0xc2, + 0x8a, 0xab, 0xc0, 0xc2, 0x1b, 0xf7, 0x18, 0xb7, 0x4f, 0xfb, 0x22, 0xfb, + 0x7, 0x6d, 0x30, 0xfb, 0xd, 0x64, 0x5d, 0xa2, 0xb9, 0x77, 0x1f, 0xe, + 0xfb, 0x88, 0xfb, 0x68, 0x76, 0xf7, 0x75, 0xf4, 0xf7, 0xbe, 0xf4, 0x3b, + 0xdb, 0x12, 0xb3, 0xb5, 0xf7, 0xd0, 0xb1, 0x13, 0xdc, 0xb3, 0xf7, 0x66, + 0x15, 0xfb, 0x15, 0xd4, 0x32, 0xf7, 0x1b, 0xf7, 0xa, 0xab, 0x74, 0x62, + 0x68, 0x78, 0x66, 0x65, 0x8a, 0x1e, 0x7d, 0x7c, 0x90, 0x91, 0x7b, 0x1f, + 0x91, 0x7b, 0x7a, 0x92, 0x7b, 0x1b, 0x72, 0x71, 0x78, 0x68, 0x6c, 0xaa, + 0x70, 0xbe, 0xd3, 0xe1, 0xd2, 0xf7, 0x5, 0xf1, 0x50, 0xb7, 0x34, 0x20, + 0x26, 0x88, 0xf7, 0x1f, 0xf1, 0xca, 0xdf, 0xdc, 0x8c, 0x1f, 0x9f, 0xa0, + 0x84, 0x84, 0xa0, 0x1f, 0x13, 0xec, 0x85, 0x9c, 0x9c, 0x86, 0x9a, 0x1b, + 0xb9, 0xa9, 0x9c, 0xa7, 0xbe, 0x52, 0x94, 0x62, 0xfb, 0x38, 0xfb, 0x3, + 0xfb, 0x14, 0xfb, 0x36, 0x1f, 0xe, 0x3b, 0x76, 0xb7, 0xf8, 0x1b, 0xe1, + 0x1, 0xa9, 0xf0, 0xf7, 0xc2, 0xe9, 0x3, 0xf8, 0xe0, 0xf8, 0x32, 0x15, + 0xe1, 0xfb, 0x97, 0x7, 0xfb, 0x14, 0xfb, 0x3f, 0x42, 0xfb, 0x31, 0xfb, + 0x17, 0xd9, 0xfb, 0x34, 0xf7, 0x43, 0xf7, 0x4e, 0xc5, 0xf7, 0xc, 0xec, + 0xee, 0x46, 0xd1, 0x34, 0xba, 0x1f, 0x8d, 0x7, 0x56, 0x16, 0xe0, 0x40, + 0xa9, 0x48, 0xfb, 0x0, 0x1a, 0x3e, 0x60, 0x4b, 0x3b, 0x2b, 0x38, 0xf7, + 0xd, 0xf7, 0xa, 0xf1, 0xe7, 0xbd, 0xea, 0x1e, 0xe, 0xfb, 0x88, 0x78, + 0xe8, 0xf7, 0xe1, 0xe8, 0x1, 0xf7, 0x4a, 0xd5, 0x3, 0xa7, 0xf7, 0xc1, + 0x15, 0xaf, 0x98, 0xb0, 0xd1, 0xad, 0x1b, 0xe6, 0x6, 0x85, 0x56, 0x7c, + 0xfb, 0x11, 0x28, 0x1a, 0x23, 0xb5, 0x5e, 0xc6, 0xe8, 0x9d, 0xf7, 0x7, + 0xcd, 0x87, 0x1e, 0x79, 0x6, 0x84, 0x62, 0x7d, 0x5b, 0x5d, 0x8c, 0x58, + 0x8c, 0x81, 0xca, 0x8f, 0xbd, 0x9b, 0xf7, 0x70, 0x18, 0xf7, 0x2e, 0x8a, + 0x5, 0xe8, 0xfb, 0x7f, 0x7, 0x66, 0x60, 0x7b, 0x6f, 0x72, 0x1f, 0x6b, + 0x67, 0x7c, 0x62, 0x76, 0x3d, 0x8, 0xe, 0x20, 0x79, 0xbb, 0xf8, 0x71, + 0x77, 0x1, 0xf7, 0x21, 0xe1, 0xf7, 0x79, 0xda, 0x3, 0x92, 0xf7, 0xee, + 0x15, 0xa1, 0x6, 0x97, 0xac, 0x9e, 0xbd, 0xaf, 0x8c, 0x8, 0x98, 0x96, + 0x7b, 0x7f, 0x8d, 0x1f, 0x92, 0x66, 0x97, 0xfb, 0x2, 0x40, 0x1a, 0x26, + 0xc7, 0x2a, 0xf7, 0xc, 0xf7, 0x21, 0xd4, 0xf7, 0x9, 0xf7, 0x26, 0xf7, + 0x3, 0x65, 0xe2, 0xfb, 0x2c, 0xcb, 0x1e, 0x85, 0x7a, 0x5, 0x9d, 0x89, + 0xee, 0x4f, 0xfb, 0x47, 0x1a, 0x28, 0x73, 0xfb, 0xc, 0x2f, 0x4b, 0x5a, + 0xcb, 0xd9, 0xc7, 0x82, 0xf7, 0x14, 0x81, 0xd3, 0x1e, 0xbc, 0x84, 0x6e, + 0xa5, 0x65, 0x1b, 0x38, 0x69, 0x2f, 0x46, 0x81, 0x1f, 0xe, 0xfb, 0x36, + 0xfb, 0x5f, 0x76, 0xfa, 0x13, 0x77, 0x1, 0xa6, 0xe6, 0xf7, 0x8, 0xbb, + 0x5e, 0xb8, 0xf7, 0xc, 0xe3, 0x3, 0xf7, 0x85, 0x7e, 0x15, 0x8d, 0xfb, + 0x5b, 0xb2, 0x7f, 0x5, 0xf7, 0x67, 0x7, 0xb5, 0xf7, 0x3a, 0xaa, 0xf7, + 0x7c, 0xf7, 0x46, 0xfb, 0x2a, 0xd3, 0x51, 0x1f, 0xf7, 0x2e, 0x7, 0x5a, + 0x9c, 0x8d, 0xfb, 0x3f, 0x5, 0x68, 0xfb, 0x41, 0x63, 0xfb, 0x70, 0xfb, + 0x52, 0xf7, 0x24, 0x4c, 0xd1, 0x1f, 0xb4, 0xb0, 0x15, 0xf8, 0x4c, 0x7, + 0x9b, 0xf3, 0x55, 0xfb, 0x3c, 0xfb, 0x48, 0x28, 0x67, 0x76, 0x89, 0x1f, + 0x61, 0x16, 0x72, 0x2a, 0xb8, 0xf7, 0x40, 0xf7, 0x3e, 0xe9, 0xc0, 0xa2, + 0x1f, 0xe, 0xfb, 0x7b, 0xe3, 0xf8, 0xca, 0xd7, 0x1, 0x98, 0xfb, 0x7b, + 0x15, 0xf1, 0x6, 0xf7, 0x2e, 0xf7, 0xae, 0x5, 0x8d, 0x6, 0x3a, 0x9a, + 0xa1, 0xfb, 0x5d, 0xe9, 0x1b, 0xe7, 0xa5, 0xf7, 0x1f, 0xbf, 0x8d, 0x1f, + 0x78, 0x6, 0x6f, 0x8a, 0x6c, 0x40, 0x4e, 0x1b, 0x3c, 0x71, 0xf7, 0x5c, + 0xb5, 0x82, 0x1f, 0xf7, 0x76, 0xf8, 0x24, 0x5, 0x25, 0x6, 0xfb, 0x2f, + 0xfb, 0xa1, 0x5, 0xf7, 0x20, 0x73, 0x79, 0xf7, 0x15, 0x25, 0x1b, 0x34, + 0x7b, 0xfb, 0x1f, 0x5a, 0x85, 0x1f, 0x9d, 0x6, 0xa8, 0x90, 0xa3, 0xde, + 0xbe, 0x1b, 0xdb, 0xa8, 0xfb, 0x43, 0x46, 0x9e, 0x1f, 0xe, 0x8e, 0xfb, + 0x63, 0x76, 0xf9, 0x6c, 0x77, 0x1, 0xf7, 0xd9, 0xca, 0x3, 0xf7, 0xd9, + 0x70, 0x15, 0xfb, 0x5d, 0xca, 0xf7, 0x5d, 0x7, 0xc0, 0x96, 0xcd, 0xa3, + 0xba, 0xca, 0xaa, 0xb5, 0xa3, 0xbe, 0x97, 0xf7, 0x81, 0x8e, 0xc2, 0xaa, + 0x8f, 0xb9, 0x95, 0x8, 0x9d, 0x7, 0x97, 0x75, 0x69, 0x8b, 0x7f, 0x1b, + 0xfb, 0x17, 0x8b, 0xfb, 0x8b, 0xfb, 0x11, 0x7d, 0x1f, 0x83, 0x3f, 0x57, + 0x6d, 0x63, 0x81, 0x8, 0xf8, 0x6f, 0x4c, 0xfc, 0x6f, 0x7, 0x63, 0x95, + 0x57, 0xa9, 0x83, 0xd7, 0x8, 0xf7, 0x11, 0x7e, 0x95, 0xf7, 0x8b, 0xfb, + 0x22, 0x1b, 0x7f, 0x69, 0x8b, 0x7f, 0x75, 0x1f, 0x79, 0x7, 0xb9, 0x81, + 0xaa, 0x87, 0x8e, 0x54, 0x97, 0xfb, 0x81, 0xa3, 0x58, 0xaa, 0x61, 0xba, + 0x4c, 0xcd, 0x73, 0xc0, 0x80, 0x8, 0xe, 0x8e, 0x7a, 0xb9, 0xf8, 0x6b, + 0x77, 0x1, 0xb5, 0xf2, 0xf7, 0x39, 0xf5, 0xf7, 0x38, 0xf3, 0x3, 0xf7, + 0xff, 0xd3, 0x15, 0x5c, 0xa9, 0xc3, 0x61, 0xc5, 0x1b, 0xf7, 0x5, 0xcb, + 0xf7, 0x9, 0xf6, 0xf7, 0x2a, 0x36, 0xf7, 0x23, 0xfb, 0x3e, 0x1f, 0x7a, + 0x7, 0xf7, 0x7, 0x74, 0xaf, 0xfb, 0x8, 0x26, 0x1a, 0x46, 0x83, 0xfb, + 0x25, 0x39, 0x41, 0x6b, 0xe2, 0xa4, 0x8e, 0x1e, 0x97, 0x98, 0x9c, 0xd4, + 0xce, 0x1a, 0xc9, 0x7f, 0xc4, 0x62, 0x62, 0x7f, 0x52, 0x4d, 0x48, 0x9c, + 0x42, 0x97, 0x7e, 0x1e, 0x73, 0x8d, 0x6e, 0x33, 0x41, 0x1b, 0x3d, 0x7c, + 0xf7, 0x18, 0xd0, 0xf3, 0xab, 0xf7, 0x11, 0xf7, 0xc, 0xa3, 0x1f, 0x9c, + 0x7, 0xfb, 0x3a, 0x32, 0xfb, 0x15, 0xfb, 0x26, 0xfb, 0x2, 0xc6, 0xfb, + 0x18, 0xf7, 0x10, 0xc3, 0xc0, 0xb7, 0xb8, 0xa8, 0x1f, 0xe, 0x57, 0x79, + 0xa7, 0xf8, 0x15, 0xd1, 0xf7, 0x43, 0xb4, 0x12, 0xf7, 0x1d, 0xdd, 0x48, + 0xe5, 0x92, 0xad, 0xf7, 0x50, 0xd9, 0x13, 0xee, 0x9d, 0xf7, 0xd6, 0x15, + 0x90, 0x89, 0x90, 0x8a, 0x90, 0x89, 0x8, 0xb1, 0xa1, 0xa4, 0xb3, 0xaf, + 0x1b, 0xa4, 0x94, 0x78, 0x77, 0x8d, 0x1f, 0x13, 0xf6, 0x8f, 0x4f, 0x78, + 0x42, 0x4e, 0x1a, 0xfb, 0x6, 0xc4, 0x49, 0xf2, 0xf7, 0x37, 0xe4, 0xf7, + 0x28, 0xf7, 0x51, 0x1e, 0xd5, 0x5d, 0x5, 0xc0, 0x7, 0x41, 0xb0, 0x5, + 0xf2, 0x66, 0xf7, 0x6b, 0xfb, 0x3a, 0x48, 0x6d, 0x60, 0x55, 0xfb, 0xa, + 0xf0, 0x56, 0xf7, 0xd, 0x49, 0x1e, 0x37, 0x8c, 0x7e, 0xfb, 0x91, 0xfb, + 0x26, 0x1b, 0x47, 0x71, 0xc4, 0xcc, 0x1f, 0x13, 0xee, 0xdb, 0xa2, 0xda, + 0xdb, 0x1a, 0xbf, 0x62, 0xb5, 0x5c, 0x53, 0x4c, 0x42, 0x45, 0x7a, 0x1e, + 0xf8, 0x58, 0xcf, 0x15, 0x63, 0x9f, 0xfb, 0x27, 0xcd, 0xf0, 0x1a, 0xad, + 0x9f, 0xa8, 0xb3, 0xf7, 0xa, 0x94, 0xfb, 0x73, 0x70, 0x1e, 0xe, 0x4c, + 0xa0, 0x76, 0xf8, 0x8b, 0xf7, 0x4a, 0x66, 0xb0, 0x12, 0xf7, 0x84, 0xf3, + 0x13, 0xb0, 0xf7, 0x2b, 0x24, 0xa, 0x8a, 0xf7, 0x6a, 0x5, 0xda, 0x91, + 0xb1, 0xf7, 0x9b, 0xf7, 0x4, 0x1b, 0x9d, 0x9a, 0x81, 0x7d, 0x1f, 0x75, + 0x65, 0x72, 0x6d, 0x1a, 0x13, 0xd0, 0x6b, 0xa5, 0x7f, 0xa6, 0xad, 0xa7, + 0xb4, 0xb4, 0xcc, 0x6d, 0xae, 0x56, 0xfb, 0x1d, 0x58, 0xfb, 0x2a, 0x2a, + 0x76, 0x1e, 0xf7, 0x31, 0x7d, 0xfb, 0x1d, 0xe1, 0xfb, 0x27, 0x1b, 0x7e, + 0x82, 0x83, 0x84, 0x87, 0x8f, 0x87, 0x92, 0x89, 0x1f, 0xf7, 0x59, 0x5e, + 0xac, 0x2e, 0x8c, 0xfb, 0x6b, 0x8c, 0xfb, 0x67, 0x18, 0x28, 0xa, 0xe, + 0x3b, 0xfb, 0x5f, 0x76, 0xf7, 0x68, 0xb1, 0xf8, 0x21, 0xd7, 0x1, 0xaf, + 0xf4, 0xf7, 0x1a, 0xcc, 0xf7, 0x27, 0xef, 0x3, 0xf7, 0xa9, 0x7f, 0x15, + 0xfb, 0x68, 0xca, 0xf7, 0x68, 0x7, 0xf7, 0x1b, 0x8a, 0xf7, 0x4, 0xee, + 0xf7, 0x27, 0x1a, 0xf7, 0x27, 0x49, 0xf7, 0xb, 0xfb, 0x10, 0x26, 0x73, + 0x48, 0x3e, 0x8d, 0x1e, 0x8e, 0xfb, 0xdd, 0x5, 0x28, 0x66, 0xf7, 0x7, + 0xf0, 0xd7, 0x9b, 0xf7, 0x15, 0xe6, 0xad, 0x1f, 0x9d, 0x7, 0xfb, 0x10, + 0x33, 0xfb, 0x1d, 0xfb, 0x10, 0xfb, 0x36, 0xf7, 0x4, 0x32, 0xf7, 0x15, + 0x8c, 0x1f, 0xca, 0xb1, 0x15, 0xf7, 0xde, 0x7, 0xa5, 0x8c, 0x8a, 0xb4, + 0xb7, 0x1b, 0xd8, 0xa5, 0x28, 0x32, 0xfb, 0x8, 0x53, 0x2e, 0x30, 0x1f, + 0xe, 0xa9, 0x79, 0xb4, 0xf8, 0x6f, 0xe0, 0x1, 0xae, 0xf5, 0xf7, 0x37, + 0xec, 0xf7, 0x40, 0xed, 0x3, 0xf7, 0xf8, 0xd0, 0x15, 0x61, 0x9b, 0xbc, + 0x5e, 0xd6, 0x1b, 0xf7, 0xc, 0xc2, 0xf7, 0x1d, 0xf7, 0x11, 0xec, 0x3e, + 0xf7, 0x17, 0x24, 0xa5, 0x1f, 0xf7, 0x48, 0x8c, 0x5, 0xdf, 0xfc, 0x9d, + 0x7, 0x6b, 0x47, 0x66, 0x25, 0x65, 0x1f, 0x9d, 0x87, 0xc6, 0xb7, 0xab, + 0x94, 0xe4, 0x92, 0x19, 0x26, 0x4e, 0x41, 0x36, 0xfb, 0x6, 0x1a, 0xfb, + 0x14, 0xb7, 0xfb, 0x16, 0xf7, 0x1b, 0xc5, 0xca, 0xbb, 0xb2, 0xa0, 0x1e, + 0x72, 0xd4, 0x15, 0x62, 0x8d, 0x5e, 0x3d, 0x52, 0x1b, 0x36, 0x86, 0xf7, + 0x2c, 0xd1, 0xf7, 0xa, 0xc2, 0xf0, 0xed, 0xad, 0x1f, 0xf7, 0x10, 0x6, + 0xf0, 0x6d, 0xc1, 0xfb, 0x9, 0x23, 0x1a, 0x3d, 0x8b, 0xfb, 0x22, 0x30, + 0x4e, 0x5e, 0xcf, 0xba, 0x8d, 0x1e, 0x98, 0xc5, 0x95, 0xd1, 0xad, 0x1a, + 0xab, 0x8d, 0xdc, 0x5a, 0x57, 0x8e, 0x3f, 0x67, 0x8a, 0x1e, 0x8a, 0x60, + 0x95, 0x41, 0x9d, 0x5d, 0x8, 0xe, 0xfb, 0x73, 0xf7, 0x1a, 0x76, 0xf7, + 0xfc, 0x77, 0x1, 0xbd, 0xf7, 0xfc, 0x3, 0xf7, 0x7a, 0xf7, 0x5, 0x15, + 0xee, 0xdc, 0xdb, 0xef, 0xee, 0x3a, 0xdc, 0x28, 0x27, 0x3b, 0x3a, 0x28, + 0x27, 0xdb, 0x3b, 0xef, 0x1f, 0xe, 0xf7, 0xd1, 0x7a, 0xf7, 0x4, 0x1, + 0xf7, 0x3, 0xf7, 0x4, 0xf7, 0x71, 0xf7, 0x4, 0xf7, 0x71, 0xf7, 0x4, + 0x14, 0x70, 0xf7, 0x3, 0xb1, 0x15, 0x29, 0xa, 0xf7, 0xe1, 0x16, 0x29, + 0xa, 0xf7, 0xe1, 0x16, 0x29, 0xa, 0xe, 0xfc, 0x48, 0xf8, 0x74, 0x76, + 0xf7, 0xa8, 0x77, 0x1, 0xa9, 0xf8, 0x7d, 0x15, 0x38, 0xa, 0x59, 0xa, + 0x1e, 0xf7, 0x31, 0xf7, 0x5a, 0x40, 0xa, 0x6d, 0xa1, 0x6c, 0x7b, 0x7d, + 0x85, 0x81, 0x87, 0x1e, 0xe, 0xfb, 0xa4, 0xf8, 0x74, 0x76, 0xf7, 0xaa, + 0x77, 0x1, 0xb9, 0xf8, 0x5f, 0x15, 0x59, 0xa, 0x1f, 0xf7, 0x32, 0x36, + 0xa, 0x23, 0xfb, 0x7c, 0x5, 0x38, 0xa, 0x1e, 0xf7, 0x54, 0x16, 0x59, + 0xa, 0x1f, 0xf7, 0x31, 0x36, 0xa, 0x24, 0xfb, 0x7c, 0x5, 0x38, 0xa, + 0x1e, 0xe, 0xfc, 0x98, 0x94, 0x76, 0xf9, 0x45, 0x77, 0x1, 0xfb, 0x10, + 0x7f, 0x15, 0xf8, 0x64, 0xf9, 0x45, 0x5, 0x53, 0x6, 0xfc, 0x64, 0xfd, + 0x45, 0x5, 0xe, 0xce, 0x7f, 0xca, 0xf7, 0x54, 0xca, 0xca, 0xca, 0xf7, + 0x52, 0xca, 0x1, 0xf7, 0x7, 0xce, 0x3, 0x9f, 0xf7, 0x87, 0x15, 0xf7, + 0x0, 0x6, 0xfb, 0x26, 0xb0, 0xf7, 0x1b, 0xfb, 0x1, 0xf7, 0x39, 0x1b, + 0xea, 0xd6, 0xb0, 0xb3, 0xbd, 0x1f, 0xe5, 0x7, 0x4b, 0x57, 0x39, 0x63, + 0x35, 0x1b, 0xfb, 0x11, 0x25, 0xdb, 0xf7, 0x4, 0x64, 0x1f, 0xf7, 0xf8, + 0x6, 0xa9, 0xca, 0x5, 0xfc, 0x25, 0x6, 0x8a, 0x96, 0x8a, 0x94, 0x95, + 0x1a, 0x95, 0x8c, 0x95, 0x8c, 0x98, 0x1e, 0xf8, 0x42, 0x6, 0xa9, 0xca, + 0x5, 0xfc, 0x51, 0x6, 0xf7, 0x0, 0xad, 0xf6, 0xdd, 0xf7, 0x11, 0x1b, + 0xe5, 0xdc, 0x61, 0x4f, 0xbc, 0x1f, 0xa8, 0xc8, 0x5, 0xcb, 0x4b, 0x31, + 0xb3, 0x2c, 0x1b, 0xfb, 0x35, 0xfb, 0x1f, 0x22, 0xfb, 0x28, 0x66, 0x1f, + 0x3d, 0x6, 0x6d, 0x4c, 0x5, 0xeb, 0x6, 0x8a, 0x7e, 0x8b, 0x82, 0x81, + 0x1a, 0x82, 0x8b, 0x82, 0x8c, 0x7e, 0x1e, 0x49, 0x6, 0xe, 0x8e, 0x56, + 0xde, 0xad, 0xcf, 0xf7, 0x70, 0xa2, 0xf7, 0xa9, 0xe3, 0x1, 0xc4, 0xb2, + 0xf7, 0xac, 0xd1, 0xc3, 0xd7, 0x3, 0xa5, 0xb7, 0x15, 0x98, 0xa6, 0x9b, + 0x92, 0x9b, 0x1b, 0x99, 0xc2, 0x6f, 0x6e, 0xc3, 0x1f, 0x6d, 0xc5, 0xc6, + 0x6d, 0x99, 0x1b, 0xac, 0xf7, 0x60, 0xf7, 0x3e, 0xcd, 0xb0, 0x5d, 0xd0, + 0x65, 0xcf, 0x1f, 0x71, 0xba, 0x75, 0xb9, 0xaf, 0x1a, 0x9f, 0xda, 0xe7, + 0xb3, 0xc3, 0x1e, 0xb1, 0x42, 0x25, 0xbb, 0x32, 0x1b, 0xfb, 0x5, 0xfb, + 0x17, 0x44, 0xfb, 0x14, 0xfb, 0x6, 0xef, 0x3f, 0xf7, 0x0, 0x8c, 0x1f, + 0x8d, 0xa2, 0x5, 0x41, 0x8a, 0x2a, 0xcd, 0xdc, 0x1a, 0xdf, 0xd0, 0xb8, + 0xdd, 0x8d, 0x1e, 0xcd, 0x8d, 0xf1, 0x64, 0xbe, 0x71, 0x8, 0x39, 0x23, + 0x83, 0x75, 0x74, 0x1a, 0x63, 0xa2, 0x5c, 0xa5, 0x5d, 0x1e, 0xae, 0x4d, + 0xb5, 0x4d, 0x5c, 0x1a, 0x5f, 0x4b, 0x4d, 0x5b, 0x77, 0x57, 0xa7, 0xa6, + 0x57, 0x1e, 0xa5, 0x59, 0x5c, 0xa0, 0x77, 0x1b, 0x72, 0x2d, 0x50, 0x7f, + 0x77, 0x1f, 0xe, 0xf7, 0xc4, 0xfb, 0x67, 0xac, 0xf7, 0x39, 0xaf, 0xf8, + 0x4b, 0xb5, 0xd0, 0x77, 0x1, 0xf7, 0x33, 0xab, 0x9e, 0xdb, 0xb8, 0xd3, + 0xac, 0xb9, 0xf7, 0xb2, 0xed, 0x3, 0xf7, 0x8c, 0xf7, 0x10, 0x15, 0x67, + 0x4b, 0x56, 0x50, 0x40, 0x1a, 0x45, 0xa8, 0x48, 0xe5, 0xee, 0xa9, 0xdb, + 0xd8, 0xee, 0x64, 0xbf, 0x6a, 0xde, 0x1e, 0xef, 0xd6, 0xf7, 0x5c, 0xf7, + 0x4a, 0xf0, 0x1b, 0xb0, 0xa3, 0x6b, 0x46, 0xfb, 0x26, 0x26, 0xfb, 0x54, + 0x2f, 0x48, 0x71, 0xac, 0xae, 0xa2, 0x9e, 0x91, 0x97, 0x1f, 0xa7, 0x8c, + 0xa0, 0xa7, 0xa3, 0x1a, 0xa3, 0x76, 0x9e, 0x73, 0x8a, 0x1e, 0x5b, 0x8a, + 0x6a, 0x5e, 0x58, 0x1a, 0x43, 0xbe, 0x50, 0xe4, 0xf7, 0x41, 0xf7, 0x9, + 0xf7, 0x87, 0xf7, 0x6, 0xd9, 0x5a, 0xdd, 0x33, 0xfb, 0x3e, 0xfb, 0x1f, + 0xfb, 0x50, 0x21, 0x25, 0x1e, 0x75, 0xb5, 0x81, 0xa6, 0xa5, 0x1a, 0xda, + 0xf7, 0x16, 0xf7, 0x1, 0xc9, 0xcb, 0x1e, 0x82, 0x9b, 0x5, 0x27, 0x48, + 0xfb, 0x37, 0xfb, 0x8, 0xfb, 0x11, 0x1a, 0x8a, 0x56, 0xa4, 0x58, 0x99, + 0x66, 0x8, 0x9a, 0x6d, 0x15, 0xc1, 0xfb, 0x0, 0x9d, 0x5d, 0x65, 0x1a, + 0x63, 0x7f, 0x63, 0x5c, 0x5c, 0x65, 0xb7, 0xcb, 0xbc, 0xaf, 0xc5, 0xaf, + 0xc4, 0x1e, 0xe, 0xf7, 0x4, 0x91, 0x76, 0xc2, 0xdf, 0xf8, 0xa4, 0xdd, + 0x52, 0xc4, 0x12, 0xa5, 0xac, 0xf7, 0x24, 0xc0, 0xe5, 0xe3, 0x13, 0xee, + 0xd1, 0xac, 0x15, 0x92, 0x86, 0x90, 0x86, 0x92, 0x86, 0x8, 0x9a, 0x9e, + 0x9b, 0x92, 0x97, 0x1b, 0xaa, 0xa7, 0x64, 0x7b, 0xa4, 0x1f, 0xf7, 0x2c, + 0xc3, 0xc8, 0xf7, 0x42, 0xf7, 0x19, 0x1a, 0x13, 0xae, 0xd0, 0x8b, 0xe5, + 0x7c, 0xe3, 0x1e, 0xb6, 0xce, 0x98, 0x99, 0xa0, 0x1b, 0xa2, 0xf3, 0x2a, + 0x84, 0x92, 0x1f, 0xfb, 0x55, 0xfb, 0x24, 0x96, 0x77, 0x5, 0xd3, 0x9e, + 0x39, 0x21, 0xfb, 0xd, 0x9a, 0x4c, 0xd3, 0x70, 0x1f, 0xf7, 0x2, 0xe3, + 0x7c, 0xa2, 0x5, 0x86, 0x7f, 0x6f, 0x79, 0x7c, 0x1b, 0x69, 0x86, 0xb4, + 0xed, 0xef, 0x82, 0xf7, 0x1, 0x46, 0xa3, 0x1f, 0xf7, 0x4a, 0xf7, 0x1f, + 0x5, 0x13, 0x1e, 0xf7, 0x26, 0xfb, 0x38, 0x8a, 0x8f, 0x7b, 0x1b, 0x79, + 0xfb, 0xe, 0x2f, 0x78, 0x71, 0x1f, 0xce, 0x76, 0x41, 0xb7, 0x44, 0x1b, + 0xfb, 0x1d, 0x3d, 0x47, 0xfb, 0x11, 0x2e, 0xdd, 0x5b, 0xd3, 0x63, 0x1f, + 0x9a, 0x82, 0x93, 0x81, 0x81, 0x1a, 0x78, 0x77, 0x7f, 0x85, 0x82, 0x1e, + 0xa2, 0x7b, 0x5, 0xb6, 0xb8, 0x98, 0xa0, 0x9e, 0x1a, 0xa9, 0x60, 0xa9, + 0x5e, 0xa6, 0x1e, 0x57, 0xa8, 0x52, 0xa9, 0xcc, 0x1a, 0x13, 0xde, 0xc8, + 0xd5, 0xb8, 0xc4, 0xf7, 0x1c, 0x9e, 0xfb, 0x29, 0xfb, 0x1f, 0xfb, 0x15, + 0x64, 0xfb, 0x25, 0x60, 0x50, 0x1e, 0xc6, 0x35, 0x9d, 0x94, 0x7a, 0x1b, + 0x75, 0x88, 0x40, 0x36, 0x80, 0x88, 0x8, 0xe, 0xe0, 0x8b, 0xf0, 0xf8, + 0xbf, 0xab, 0x12, 0xad, 0x9a, 0x91, 0xf7, 0x8, 0xf8, 0x40, 0xf7, 0x9, + 0x90, 0x9a, 0x17, 0xad, 0x16, 0x13, 0xdc, 0xf7, 0xb8, 0x6, 0x7b, 0xf7, + 0x2c, 0x5, 0xfb, 0x1, 0xa9, 0x6d, 0xf7, 0xf, 0xf4, 0x1a, 0xf7, 0x16, + 0xdb, 0xf7, 0x8, 0xf7, 0x1a, 0xf7, 0x20, 0xd5, 0xfb, 0x8, 0xfb, 0x1a, + 0x27, 0x65, 0xfb, 0x14, 0x26, 0x71, 0x1e, 0x7b, 0xfb, 0x2c, 0x5, 0x13, + 0xfc, 0xf7, 0xb8, 0xf7, 0x36, 0x6, 0x13, 0xdc, 0x7c, 0x6, 0x5a, 0x7f, + 0x75, 0x7f, 0x61, 0x1b, 0xfb, 0x28, 0x6, 0x8d, 0xa7, 0x5, 0xf7, 0x1e, + 0xa1, 0xda, 0xf7, 0x18, 0xf7, 0x10, 0x1a, 0xf7, 0x52, 0xfb, 0x3f, 0xe6, + 0xfb, 0x34, 0xfb, 0x33, 0xfb, 0x3e, 0x2f, 0xfb, 0x4d, 0x8a, 0x1e, 0x8a, + 0xfb, 0x12, 0xd6, 0xfb, 0x1b, 0xf7, 0x22, 0x76, 0x8d, 0x6f, 0x18, 0x13, + 0xa0, 0xfb, 0x28, 0x6, 0x61, 0x75, 0x97, 0xbc, 0x7f, 0x1f, 0x7c, 0x6, + 0xe, 0xf7, 0x20, 0x8e, 0x76, 0xb2, 0x76, 0xf8, 0x69, 0xf7, 0x18, 0xc4, + 0x77, 0x12, 0xf7, 0x43, 0xe6, 0x13, 0x78, 0xf7, 0x43, 0x16, 0xf7, 0x47, + 0x6, 0x9b, 0xb6, 0x86, 0x9e, 0x99, 0x1a, 0xac, 0x6e, 0xb0, 0x70, 0xb1, + 0x1e, 0x75, 0xab, 0x76, 0xac, 0xac, 0x1a, 0xaa, 0xa6, 0xa1, 0xa0, 0xa1, + 0x1e, 0x13, 0xb8, 0xf7, 0x7c, 0xfb, 0xa1, 0xbb, 0x4f, 0x97, 0x5d, 0x8, + 0x9e, 0x93, 0xaf, 0xab, 0xcd, 0x1a, 0xc3, 0x6a, 0xb1, 0x6b, 0xac, 0x1e, + 0x6b, 0xab, 0x6c, 0xa6, 0xac, 0x1a, 0xd9, 0xd0, 0xe0, 0xc1, 0x7e, 0x1e, + 0x90, 0xe0, 0x5, 0xad, 0x86, 0x74, 0xa4, 0x6a, 0x1b, 0x7a, 0x7d, 0x8b, + 0x8c, 0x7f, 0x1f, 0x55, 0x8e, 0x87, 0x96, 0x90, 0xb5, 0x8, 0x5c, 0x84, + 0x76, 0x54, 0x5b, 0x1a, 0x47, 0xcb, 0x7d, 0xc2, 0x8e, 0x1e, 0x62, 0x5d, + 0x7f, 0x61, 0x77, 0x5d, 0xfb, 0x6c, 0xf7, 0x92, 0x79, 0x99, 0x83, 0xbb, + 0x8, 0x70, 0x82, 0x65, 0x5a, 0x60, 0x1a, 0x64, 0xd0, 0x40, 0xb4, 0x5d, + 0x1e, 0x4b, 0x4a, 0x5d, 0x6f, 0x3e, 0x1a, 0x74, 0xa0, 0x71, 0x9b, 0x6a, + 0x1e, 0x95, 0x76, 0x94, 0x73, 0x6f, 0x1a, 0x6e, 0x67, 0x8c, 0x77, 0x1e, + 0xe, 0x46, 0xa, 0xab, 0xfa, 0x22, 0x3, 0xab, 0xf7, 0x8c, 0x15, 0xe9, + 0x31, 0xd1, 0x45, 0xe2, 0x24, 0xae, 0xae, 0x18, 0x5b, 0xc7, 0x2d, 0xf1, + 0x64, 0xb1, 0x8, 0xf9, 0xb9, 0xc3, 0xfd, 0xb9, 0x6, 0xb2, 0xb1, 0xe9, + 0xf1, 0xbb, 0xc7, 0x68, 0xae, 0x18, 0x34, 0x24, 0x45, 0x45, 0x2d, 0x31, + 0x8, 0xe, 0x3b, 0xa0, 0x76, 0xfa, 0x22, 0x49, 0xa, 0xf7, 0xac, 0x16, + 0xc3, 0xf9, 0xb9, 0x6, 0xb1, 0x64, 0xf1, 0x2d, 0xc7, 0x5b, 0xae, 0xae, + 0x18, 0x24, 0xe2, 0x45, 0xd1, 0x31, 0xe9, 0x31, 0x2d, 0x45, 0x45, 0x24, + 0x34, 0xae, 0x68, 0x18, 0xc7, 0xbb, 0xf1, 0xe9, 0xb1, 0xb2, 0x8, 0xe, + 0x46, 0xa, 0xbc, 0xf7, 0x70, 0x15, 0xf9, 0xb9, 0x6, 0x64, 0x65, 0x2d, + 0x25, 0x5b, 0x4f, 0xae, 0x68, 0x18, 0xe2, 0xf2, 0xd1, 0xd1, 0xe9, 0xe5, + 0x2d, 0xe5, 0x45, 0xd1, 0x34, 0xf2, 0x68, 0x68, 0x18, 0xbb, 0x4f, 0xe9, + 0x25, 0xb2, 0x65, 0x8, 0xfd, 0xb9, 0x6, 0xe, 0x3b, 0x8a, 0x76, 0xfa, + 0x22, 0x49, 0xa, 0xb8, 0xf7, 0x79, 0x15, 0xf2, 0x34, 0xd1, 0x45, 0xe5, + 0x2d, 0xe5, 0xe9, 0xd1, 0xd1, 0xf2, 0xe2, 0x68, 0xae, 0x18, 0x4f, 0x5b, + 0x25, 0x2d, 0x65, 0x64, 0x8, 0xf9, 0xb9, 0x53, 0xfd, 0xb9, 0x7, 0x65, + 0xb2, 0x25, 0xe9, 0x4f, 0xbb, 0x8, 0xe, 0xf7, 0xfb, 0x91, 0x76, 0xf7, + 0x81, 0xbf, 0xf7, 0x81, 0x77, 0x1, 0xa3, 0xfa, 0x7c, 0x3, 0xa3, 0xf7, + 0x8c, 0x15, 0xf7, 0x7, 0x25, 0xc2, 0x48, 0xda, 0x2d, 0xb0, 0xab, 0x18, + 0x47, 0xea, 0x6f, 0xa0, 0x36, 0xe4, 0x8, 0xf9, 0xaa, 0x6, 0x36, 0x32, + 0x70, 0x75, 0x46, 0x2d, 0xb0, 0x6b, 0x18, 0xda, 0xe9, 0xc2, 0xce, 0xf7, + 0x7, 0xf1, 0xfb, 0x7, 0xf1, 0x54, 0xce, 0x3c, 0xe9, 0x66, 0x6b, 0x18, + 0xd0, 0x2e, 0xa5, 0x73, 0xe1, 0x33, 0x8, 0xfd, 0xaa, 0x6, 0xe0, 0xe4, + 0xa7, 0xa0, 0xcf, 0xea, 0x66, 0xab, 0x18, 0x3c, 0x2d, 0x54, 0x48, 0xfb, + 0x7, 0x25, 0x8, 0xe, 0x72, 0x90, 0x76, 0xe9, 0xc2, 0xf8, 0x84, 0x77, + 0x1, 0xf8, 0xb7, 0xc2, 0x3, 0x9a, 0xf5, 0x15, 0xf7, 0x3a, 0xfb, 0xe, + 0x5, 0xe9, 0xf8, 0x39, 0xf8, 0xbb, 0x54, 0xfc, 0x84, 0xfc, 0x2, 0xe9, + 0x7, 0xe, 0xf7, 0xc4, 0xeb, 0xc0, 0xf7, 0x5c, 0xc0, 0xd9, 0xac, 0x8b, + 0x77, 0x1, 0xa9, 0xfa, 0x21, 0x3, 0xa9, 0xf7, 0x8d, 0x15, 0xf7, 0xa, + 0xfb, 0x3, 0xb4, 0x61, 0xe5, 0xfb, 0x3, 0xb4, 0xac, 0x18, 0x4d, 0xd9, + 0x5, 0xf9, 0x3d, 0xc0, 0xfd, 0x65, 0x6, 0x23, 0xef, 0xf3, 0xef, 0x5, + 0xf9, 0x65, 0xc0, 0xfd, 0x3d, 0x6, 0xc9, 0xd9, 0x62, 0xac, 0x31, 0xfb, + 0x3, 0x62, 0x61, 0xfb, 0xa, 0xfb, 0x3, 0x19, 0xe, 0x3b, 0xa2, 0x76, + 0xfa, 0x21, 0x77, 0x1, 0xf7, 0x3e, 0xc0, 0xf7, 0x34, 0xc0, 0x3, 0xf7, + 0x3e, 0x8d, 0x15, 0xc0, 0xf9, 0x7c, 0x6, 0xdb, 0xdc, 0xdb, 0x3a, 0x5, + 0xfd, 0x7c, 0xc0, 0xf9, 0x4c, 0x7, 0xed, 0x3e, 0xac, 0xb4, 0xfb, 0x3, + 0xe5, 0x61, 0xb4, 0xfb, 0x3, 0xf7, 0xa, 0x19, 0xfb, 0x3, 0xfb, 0xa, + 0x61, 0x62, 0xfb, 0x3, 0x31, 0xac, 0x62, 0x18, 0xed, 0xd8, 0x5, 0xe, + 0xf7, 0xc4, 0xee, 0xc0, 0xf7, 0x51, 0xc0, 0x1, 0xb8, 0xee, 0x15, 0xf9, + 0x3d, 0x6, 0x48, 0x35, 0xb9, 0x6a, 0xe5, 0xf7, 0x3, 0xb4, 0xb5, 0xf7, + 0xa, 0xf7, 0x3, 0x19, 0xfb, 0xa, 0xf7, 0x3, 0x62, 0xb5, 0x31, 0xf7, + 0x3, 0x5d, 0x6a, 0x18, 0xce, 0x3a, 0x5, 0xfd, 0x3d, 0x56, 0xf9, 0x68, + 0x6, 0xf0, 0x2a, 0x26, 0x2f, 0x5, 0xfd, 0x68, 0x6, 0xe, 0x3b, 0x8d, + 0x76, 0xfa, 0x21, 0x77, 0x1, 0xf7, 0x43, 0xc0, 0xf7, 0x34, 0xc0, 0x3, + 0xb7, 0xf7, 0x7a, 0x15, 0xf7, 0x3, 0x31, 0xb5, 0x62, 0xf7, 0x3, 0xfb, + 0xa, 0xf7, 0x3, 0xf7, 0xa, 0xb5, 0xb4, 0xf7, 0x3, 0xe5, 0x6a, 0xb4, + 0x18, 0x29, 0x3e, 0x5, 0xf9, 0x4c, 0x56, 0xfd, 0x7c, 0x7, 0x3b, 0x3a, + 0x3b, 0xdc, 0x5, 0xf9, 0x7c, 0x56, 0xfd, 0x4c, 0x7, 0x29, 0xd8, 0x5, + 0xe, 0xf7, 0xfb, 0xf7, 0x1, 0xbd, 0xf7, 0x40, 0xbd, 0x1, 0xa6, 0xfa, + 0x78, 0x3, 0xa6, 0xf7, 0x89, 0x15, 0xf7, 0x8, 0x21, 0xb2, 0x61, 0xed, + 0xfb, 0x9, 0xb3, 0xad, 0x18, 0x3f, 0xea, 0x5, 0xf8, 0xc6, 0x6, 0x3f, + 0x2c, 0xb3, 0x69, 0xed, 0xf7, 0x9, 0xb2, 0xb5, 0xf7, 0x8, 0xf5, 0x19, + 0xfb, 0x8, 0xf5, 0x64, 0xb5, 0x29, 0xf7, 0x9, 0x63, 0x69, 0x18, 0xd7, + 0x2c, 0x5, 0xfc, 0xc6, 0x6, 0xd7, 0xea, 0x63, 0xad, 0x29, 0xfb, 0x9, + 0x64, 0x61, 0xfb, 0x8, 0x21, 0x19, 0xf7, 0x41, 0x35, 0x15, 0x34, 0xe1, + 0xe2, 0xe1, 0x5, 0xf9, 0x1f, 0x6, 0xe2, 0x35, 0x34, 0x35, 0x5, 0xe, + 0xa9, 0xa0, 0x76, 0xf8, 0x5d, 0xc2, 0xf7, 0x55, 0x77, 0x1, 0xf7, 0xdd, + 0x16, 0xc6, 0x6, 0xf7, 0xb9, 0xf9, 0x55, 0x5, 0x52, 0x6, 0x39, 0xfb, + 0x55, 0x5, 0xfc, 0x5, 0x6, 0x36, 0xf7, 0x55, 0x5, 0x52, 0x6, 0xf7, + 0xde, 0xfd, 0xf, 0x15, 0xfb, 0x38, 0xf8, 0x17, 0x5, 0xf7, 0xd6, 0x6, + 0xe, 0xfb, 0x51, 0x77, 0xa8, 0xf8, 0x0, 0xb2, 0xf7, 0xb2, 0xbb, 0x1, + 0xa5, 0xe1, 0xf7, 0x9f, 0xde, 0x3, 0xf8, 0xf, 0xf7, 0xec, 0x15, 0xbf, + 0x48, 0x6e, 0x9b, 0x50, 0x1b, 0xfb, 0xa, 0x3b, 0x27, 0xfb, 0xe, 0xfb, + 0x10, 0xdf, 0x35, 0xf6, 0xf7, 0x56, 0xbe, 0xf7, 0xb4, 0xf7, 0x11, 0xf7, + 0x30, 0x48, 0xf7, 0x59, 0xfb, 0x59, 0x57, 0x58, 0x7b, 0x7e, 0x6d, 0x1f, + 0xb2, 0x59, 0x5, 0xa0, 0xb4, 0xa4, 0x95, 0xd2, 0x1b, 0xf1, 0xb6, 0xfb, + 0x36, 0xfb, 0x54, 0x84, 0x1f, 0x83, 0x68, 0x15, 0x2b, 0x77, 0x7a, 0xfb, + 0x60, 0xfb, 0x1b, 0x1b, 0x40, 0x7f, 0xea, 0xb7, 0xd9, 0xb1, 0xf7, 0x27, + 0xf7, 0x0, 0xc8, 0xaa, 0x62, 0x74, 0xa0, 0x1f, 0xe, 0x8b, 0xc2, 0xf7, + 0xb3, 0xc2, 0xf7, 0x93, 0xc2, 0x1, 0xf8, 0x3b, 0xc2, 0x3, 0xa4, 0x16, + 0xf8, 0x59, 0xf9, 0x57, 0xfc, 0x59, 0x54, 0xf8, 0x22, 0xfb, 0x93, 0xfb, + 0xf6, 0x54, 0xf7, 0xf6, 0xfb, 0xb3, 0xfc, 0x22, 0x6, 0xe, 0xf7, 0x20, + 0x73, 0xc0, 0xf9, 0x14, 0xbd, 0x1, 0xb2, 0xc3, 0xf9, 0xb, 0xc2, 0x3, + 0xf7, 0x6c, 0xf7, 0x0, 0x15, 0xf8, 0x42, 0xf8, 0x56, 0x5, 0xba, 0x55, + 0xac, 0x40, 0x3c, 0x1a, 0xfb, 0x40, 0xfb, 0x20, 0xfb, 0x29, 0xfb, 0x40, + 0x3c, 0x48, 0xad, 0xb8, 0x57, 0x1e, 0x66, 0xb1, 0x15, 0x73, 0xa8, 0x4f, + 0xc5, 0xf7, 0xe, 0x1a, 0xf7, 0x2e, 0xf7, 0x24, 0xf7, 0x34, 0xf7, 0x3f, + 0xd7, 0xd0, 0x6d, 0x5d, 0xc2, 0x1e, 0xfc, 0xcb, 0xfc, 0xdc, 0x15, 0xac, + 0x6a, 0xee, 0xe5, 0x5, 0x53, 0xca, 0xde, 0x69, 0xe8, 0x1b, 0xf7, 0x5f, + 0xf7, 0x38, 0xf7, 0x3f, 0xf7, 0x5f, 0xe8, 0x65, 0xe4, 0x51, 0xcc, 0x1f, + 0xe4, 0xe3, 0x67, 0xad, 0x33, 0x34, 0x5, 0xc2, 0x4b, 0x37, 0xab, 0x2f, + 0x1b, 0xfb, 0x5f, 0xfb, 0x3c, 0xfb, 0x3f, 0xfb, 0x55, 0xfb, 0x10, 0xbc, + 0x3b, 0xbd, 0x5b, 0x1f, 0xe, 0x44, 0x8b, 0xbc, 0xf9, 0x13, 0x77, 0x1, + 0x91, 0xf8, 0xee, 0x3, 0x91, 0x16, 0xf8, 0xee, 0x6, 0xfb, 0xc3, 0xf9, + 0x44, 0x5, 0xfb, 0x88, 0xfd, 0x13, 0x15, 0xf7, 0x6e, 0xf8, 0x68, 0xf7, + 0x5b, 0xfc, 0x68, 0x5, 0xe, 0xa9, 0x8d, 0x76, 0xf9, 0x42, 0xbe, 0x1, + 0xaf, 0xf9, 0x19, 0x3, 0xf7, 0xe5, 0x78, 0x15, 0xf7, 0xec, 0xf9, 0x75, + 0x5, 0xfd, 0x19, 0x6, 0xf7, 0xe9, 0xfc, 0xc0, 0x15, 0xfb, 0x62, 0xf8, + 0x8d, 0x5, 0xf8, 0x47, 0x6, 0xe, 0xa9, 0x8b, 0xc1, 0xf7, 0x2d, 0xc1, + 0xf7, 0x2d, 0xc1, 0x1, 0xb8, 0xf8, 0x60, 0x14, 0xe0, 0xef, 0xf7, 0x63, + 0x15, 0xf8, 0x29, 0xc1, 0xfc, 0x29, 0x6, 0xe2, 0x95, 0xd7, 0xcd, 0xdd, + 0x1b, 0xf7, 0x81, 0xc1, 0xfb, 0x81, 0x6, 0xfb, 0x2a, 0x42, 0xfb, 0xd, + 0xfb, 0x5, 0xfb, 0x6, 0xd7, 0xfb, 0xc, 0xf7, 0x27, 0x1f, 0xf7, 0x81, + 0xc1, 0xfb, 0x81, 0x6, 0x39, 0x3f, 0xcd, 0xe2, 0x81, 0x1f, 0xe, 0xa9, + 0x66, 0x76, 0xc5, 0xc1, 0xf7, 0x2d, 0xc1, 0xf7, 0x2d, 0xc1, 0xe2, 0x77, + 0x1, 0xb8, 0xc2, 0x3, 0xe9, 0x6a, 0x15, 0xb7, 0x72, 0xb8, 0xd8, 0x5, + 0x80, 0x9a, 0xa9, 0x83, 0xa1, 0x1b, 0xf7, 0x93, 0xc1, 0xfb, 0x89, 0x6, + 0x7f, 0x73, 0x8d, 0x95, 0x7c, 0x1f, 0xdb, 0xf7, 0x21, 0x5, 0xf7, 0x6c, + 0xc1, 0xfb, 0x4e, 0x6, 0xe2, 0xf7, 0x2d, 0x5, 0xee, 0xc1, 0x47, 0x6, + 0xae, 0xc9, 0x5d, 0xa4, 0x5a, 0x34, 0x5, 0xfb, 0x8, 0x6, 0x29, 0xfb, + 0xa, 0x2e, 0xfb, 0x1b, 0x38, 0xa7, 0x57, 0xcc, 0x4f, 0x1f, 0x65, 0xf7, + 0x6c, 0x15, 0xd2, 0x91, 0xd6, 0xdf, 0xd5, 0x1b, 0xe8, 0x6, 0x32, 0xfb, + 0x2f, 0x5, 0x2e, 0xfb, 0x3b, 0x15, 0x6e, 0xa6, 0x70, 0xb3, 0x83, 0xb9, + 0x8, 0xf7, 0x14, 0x6, 0xe, 0xfb, 0x88, 0x7a, 0xba, 0xf7, 0x4b, 0xc2, + 0xf7, 0x4a, 0xbd, 0x1, 0xf7, 0xd4, 0xe9, 0x3, 0xbb, 0x8e, 0x15, 0x85, + 0x9d, 0xab, 0x7d, 0xbe, 0x1b, 0xf7, 0x22, 0xf7, 0xf, 0xf7, 0x1, 0xf7, + 0x3d, 0xe3, 0x50, 0xf7, 0x2b, 0xfb, 0x43, 0x6c, 0x69, 0x88, 0x82, 0x64, + 0x1f, 0x60, 0x7, 0x8e, 0x98, 0x99, 0x8d, 0x98, 0x1b, 0xf0, 0xf2, 0x45, + 0xfb, 0x4, 0x1f, 0xfb, 0x5c, 0x54, 0xf7, 0x5a, 0x6, 0x24, 0x2f, 0x3b, + 0x25, 0x72, 0x71, 0x8f, 0x94, 0x72, 0x1e, 0xe, 0xf7, 0x20, 0x26, 0xa2, + 0xf9, 0xba, 0xa2, 0x1, 0xf7, 0xe, 0xf7, 0x5, 0xf7, 0xfa, 0xf7, 0x5, + 0x3, 0xa4, 0x3d, 0x15, 0x74, 0xf7, 0xc7, 0xa2, 0x7, 0x50, 0x65, 0xa0, + 0xd1, 0x1f, 0xf9, 0x43, 0xf7, 0xfa, 0xfd, 0x43, 0x7, 0x45, 0x65, 0x76, + 0x51, 0x1e, 0x74, 0xf7, 0xc6, 0xa2, 0x7, 0x50, 0x65, 0xa0, 0xd1, 0x1f, + 0xf8, 0xf2, 0x7, 0xe8, 0xd0, 0x9b, 0xa7, 0x1e, 0xa2, 0xfd, 0x9e, 0x74, + 0x7, 0xa7, 0xd0, 0x7b, 0x2e, 0x1f, 0xfc, 0xf2, 0x7, 0x45, 0x66, 0x76, + 0x4f, 0x1e, 0xe, 0xa9, 0x27, 0xf2, 0xf9, 0x4d, 0xb8, 0x1, 0xf8, 0xef, + 0x9f, 0x3, 0x99, 0xfb, 0x0, 0x15, 0x9f, 0xa6, 0x93, 0x9f, 0x1b, 0xf8, + 0x78, 0x8e, 0x5, 0xa4, 0xaf, 0x84, 0x87, 0xa5, 0x1f, 0x98, 0xf1, 0x90, + 0x9f, 0xa4, 0xf1, 0x8, 0x74, 0x6, 0x32, 0x68, 0x6b, 0x73, 0x3d, 0x1b, + 0xfb, 0xfd, 0x6, 0xf7, 0xba, 0xf7, 0xe7, 0xfb, 0xa5, 0xf7, 0xfa, 0x5, + 0xf7, 0x91, 0x6, 0xf7, 0x14, 0x9a, 0x5a, 0x4a, 0x9f, 0x1f, 0x9f, 0x6, + 0x85, 0xf7, 0x33, 0x5, 0xfc, 0x85, 0x6, 0x69, 0x65, 0x90, 0x8d, 0x69, + 0x1f, 0xf7, 0xf1, 0xfc, 0x5a, 0x5, 0xe, 0xf7, 0x7d, 0xc2, 0x1, 0x96, + 0xf7, 0x7d, 0x15, 0x42, 0xa, 0xe, 0xfb, 0x4b, 0xf7, 0x2f, 0x76, 0xf7, + 0x4f, 0xb9, 0x9e, 0xdb, 0xe0, 0x77, 0x1, 0xf7, 0x81, 0x9d, 0x3, 0xcc, + 0xf7, 0x94, 0x15, 0x75, 0x9e, 0x7f, 0x9f, 0xa2, 0x93, 0xa0, 0xa1, 0x9f, + 0x1e, 0x9e, 0xa0, 0x97, 0x96, 0xab, 0x9f, 0x8, 0x8e, 0x90, 0x92, 0x8c, + 0x8d, 0x1b, 0x91, 0x8a, 0x7f, 0x87, 0x76, 0x86, 0x7a, 0x86, 0x7c, 0x1f, + 0x83, 0x73, 0x80, 0x77, 0x6d, 0x1a, 0x74, 0x96, 0x76, 0xa6, 0xa5, 0x95, + 0xa2, 0xa0, 0x8c, 0x1e, 0xa9, 0x81, 0x9f, 0x83, 0xa4, 0x1e, 0x86, 0x9a, + 0x87, 0x9b, 0xa0, 0x1a, 0x8f, 0x89, 0x96, 0x91, 0x8e, 0x8e, 0x8a, 0x87, + 0x92, 0x1e, 0xa6, 0x7a, 0x9e, 0x7a, 0x98, 0x7e, 0x8, 0x73, 0xa3, 0x99, + 0x75, 0xa6, 0x1b, 0x9b, 0x99, 0x97, 0xa1, 0xaa, 0x68, 0x94, 0x6e, 0x93, + 0x1f, 0x6f, 0x93, 0x6b, 0x93, 0x74, 0x97, 0x8, 0x84, 0x8f, 0x85, 0x8e, + 0x90, 0x1a, 0x8e, 0x8f, 0x8f, 0x94, 0x90, 0x1e, 0xcd, 0xaa, 0x8d, 0x82, + 0xb3, 0x95, 0x8, 0x97, 0x8e, 0xa6, 0x98, 0xa3, 0x1a, 0xa4, 0x7a, 0x97, + 0x78, 0x6e, 0x79, 0x6b, 0x6f, 0x70, 0x1e, 0x7f, 0x7f, 0x7a, 0x7f, 0x7d, + 0x83, 0x8, 0x88, 0x85, 0x86, 0x88, 0x88, 0x1b, 0x87, 0x8a, 0x90, 0x98, + 0xa6, 0x92, 0x9e, 0x92, 0x9f, 0x1f, 0x91, 0x9c, 0x91, 0x9d, 0xa4, 0x1a, + 0x9d, 0x83, 0xa1, 0x70, 0x70, 0x83, 0x76, 0x79, 0x73, 0x91, 0x79, 0x91, + 0x78, 0x1e, 0x92, 0x77, 0x92, 0x77, 0x71, 0x1a, 0x7f, 0x8a, 0x85, 0x87, + 0x88, 0x87, 0x8d, 0x8f, 0x84, 0x1e, 0x75, 0x96, 0x7d, 0x97, 0x80, 0x96, + 0x8, 0xa3, 0x75, 0x80, 0xae, 0x6a, 0x1b, 0x73, 0x7b, 0x7a, 0x75, 0x71, + 0x9f, 0x83, 0xb3, 0x84, 0x1f, 0xa8, 0x86, 0x8b, 0x8d, 0xc5, 0x70, 0x8, + 0x96, 0x86, 0x90, 0x87, 0x88, 0x1a, 0x88, 0x87, 0x87, 0x82, 0x86, 0x1e, + 0x70, 0x7b, 0x71, 0x84, 0x72, 0x86, 0x8, 0x6b, 0x86, 0x63, 0x7f, 0x6c, + 0x1a, 0xe, 0x65, 0xfa, 0x4f, 0x1, 0x95, 0xf8, 0x8d, 0x3, 0xf8, 0x1, + 0x65, 0x15, 0xf7, 0x2a, 0xfa, 0x4a, 0x68, 0x90, 0xfb, 0x13, 0xfd, 0xb2, + 0xfb, 0x59, 0xf8, 0x31, 0xfb, 0x26, 0x43, 0x9b, 0x6a, 0xeb, 0xba, 0x5, + 0xe, 0xa9, 0xf7, 0xf, 0xbe, 0xf7, 0x46, 0xbf, 0x1, 0xa6, 0xc0, 0x3, + 0xf8, 0x1, 0xf7, 0x81, 0x15, 0x60, 0xb6, 0xda, 0x44, 0xd0, 0x1b, 0xad, + 0xa8, 0x9b, 0x9f, 0x9f, 0x1f, 0x6b, 0xad, 0x5, 0x7f, 0x7d, 0x7b, 0x84, + 0x7a, 0x1b, 0x5d, 0x59, 0xb2, 0xc4, 0x50, 0x1f, 0xbc, 0xbf, 0xba, 0xb0, + 0xb8, 0x1b, 0xa0, 0x9f, 0x85, 0x7b, 0x9f, 0x1f, 0xa8, 0xb1, 0x5, 0x93, + 0x7e, 0x72, 0xa3, 0x63, 0x1b, 0x37, 0x68, 0x64, 0x4e, 0x3f, 0x1f, 0xc6, + 0x44, 0x51, 0xb4, 0x47, 0x1b, 0x33, 0x55, 0x3f, 0x51, 0x3e, 0xc3, 0x45, + 0xde, 0xd6, 0xc7, 0xbf, 0xc9, 0xcb, 0x1f, 0x62, 0xab, 0x15, 0x73, 0x7d, + 0x3b, 0x45, 0x4f, 0x1b, 0x56, 0x66, 0xc2, 0xb2, 0xa5, 0xa3, 0xc4, 0xcf, + 0xbe, 0xe1, 0x4c, 0x77, 0x9a, 0x1f, 0xe, 0xa9, 0xf7, 0x10, 0xbe, 0xf7, + 0x48, 0xbc, 0x1, 0xa5, 0xbe, 0xf8, 0xc2, 0xc0, 0x3, 0xf7, 0xf9, 0xf7, + 0x80, 0x15, 0x76, 0xa3, 0xcf, 0x30, 0xdf, 0x1b, 0xf4, 0xbd, 0xd2, 0xd5, + 0xd1, 0x4a, 0xcc, 0x31, 0x36, 0x67, 0x5a, 0x56, 0x54, 0x1f, 0xc5, 0x4d, + 0x61, 0xb7, 0x34, 0x1b, 0x42, 0x8a, 0x48, 0x4f, 0x41, 0x1a, 0x41, 0xba, + 0x44, 0xe8, 0xf2, 0xcb, 0xe6, 0xa0, 0xa3, 0x1e, 0x69, 0xac, 0x15, 0x58, + 0x5d, 0x5a, 0x60, 0x4d, 0x1b, 0x5c, 0x61, 0xae, 0xc6, 0xb0, 0xa6, 0xbc, + 0xc9, 0xbf, 0xb3, 0x6b, 0x55, 0xcc, 0x1f, 0xce, 0x16, 0xc2, 0xca, 0xa1, + 0xa8, 0xc5, 0x1b, 0xd6, 0xa6, 0x51, 0x71, 0x49, 0x56, 0x6d, 0x5a, 0x61, + 0x61, 0xb2, 0xc4, 0x50, 0x1f, 0xe, 0xe0, 0x8b, 0xc2, 0xf8, 0xfe, 0x77, + 0x1, 0xa5, 0x16, 0xf9, 0x5c, 0xc2, 0xfc, 0xd6, 0x6, 0xf8, 0xd6, 0xf8, + 0xd9, 0x62, 0xb0, 0x5, 0xe, 0x3b, 0xa0, 0x76, 0xf8, 0x5a, 0x77, 0x1, + 0xa2, 0x16, 0xcc, 0x6, 0xf7, 0x6b, 0xf7, 0xf2, 0xf7, 0x6b, 0xfb, 0xf2, + 0x5, 0xcc, 0x6, 0xfb, 0xac, 0xf8, 0x5a, 0x5, 0xe, 0x3b, 0xa0, 0x76, + 0xf8, 0x71, 0x77, 0x1, 0xa9, 0xf8, 0xb8, 0x3, 0xa9, 0xf8, 0x54, 0x15, + 0xf7, 0xa6, 0xfc, 0x54, 0xf7, 0xa6, 0xf8, 0x54, 0x5f, 0xa8, 0xfb, 0x7a, + 0xfc, 0xb, 0xfb, 0x7a, 0xf8, 0xb, 0x5, 0xe, 0xe0, 0xa0, 0x76, 0xf8, + 0x61, 0xbb, 0x55, 0xa, 0x16, 0xc2, 0xf7, 0x51, 0x6, 0xf7, 0x23, 0xf7, + 0x27, 0xf7, 0x15, 0xf7, 0x24, 0xf7, 0x32, 0xf7, 0x19, 0xfb, 0x27, 0xfb, + 0x11, 0x1e, 0xfb, 0x51, 0xc2, 0xf7, 0x51, 0x7, 0xf7, 0x41, 0xfb, 0x2f, + 0xf7, 0x27, 0xfb, 0x53, 0xfb, 0x53, 0xfb, 0x2f, 0xfb, 0x27, 0xfb, 0x41, + 0x1e, 0xe, 0xe0, 0x7a, 0xba, 0xf8, 0x62, 0x77, 0x55, 0xa, 0xf7, 0xc1, + 0x15, 0xfb, 0x41, 0xf7, 0x2f, 0xfb, 0x25, 0x4b, 0xa, 0xf7, 0x2f, 0xf7, + 0x25, 0xf7, 0x41, 0x1e, 0xf7, 0x53, 0x54, 0xfb, 0x52, 0x7, 0xfb, 0x11, + 0xfb, 0x19, 0xfb, 0x27, 0xfb, 0x32, 0xfb, 0x24, 0xfb, 0x27, 0xf7, 0x15, + 0xf7, 0x23, 0x1e, 0xf7, 0x52, 0x54, 0x7, 0xe, 0xfc, 0x2d, 0x20, 0xf7, + 0x4, 0xf9, 0xb8, 0xf6, 0x1, 0xf7, 0xc, 0xd1, 0x3, 0x8d, 0x58, 0x15, + 0x6a, 0xaa, 0x74, 0xae, 0xf7, 0x27, 0x6e, 0xf8, 0x5d, 0xf7, 0x1e, 0x8f, + 0x1e, 0xf7, 0x1c, 0x76, 0xf7, 0x31, 0x8d, 0xb0, 0x1e, 0x95, 0x8c, 0x8e, + 0x92, 0x94, 0x9b, 0x9a, 0x71, 0xac, 0x1b, 0xa4, 0x9d, 0x9d, 0xa6, 0xb2, + 0x72, 0xa2, 0x67, 0xfb, 0xb, 0x94, 0xfb, 0x8a, 0xfb, 0x27, 0x1f, 0x8a, + 0xfb, 0xca, 0x90, 0x2e, 0x8d, 0x41, 0x8, 0x5c, 0x8d, 0x8a, 0x73, 0x7c, + 0x7c, 0x7a, 0xa9, 0x71, 0x1b, 0x6f, 0x73, 0x7e, 0x60, 0x1f, 0xe, 0xf7, + 0x48, 0x8b, 0xf7, 0x15, 0xf7, 0x6f, 0xf7, 0x16, 0x1, 0xf7, 0x37, 0xf7, + 0x15, 0xd6, 0xf7, 0x16, 0xd6, 0xf7, 0x15, 0x14, 0x38, 0xf7, 0x37, 0xcc, + 0x15, 0x52, 0xa, 0x6f, 0xa7, 0x67, 0x67, 0x6e, 0x6f, 0x67, 0x1e, 0xf8, + 0x2d, 0x16, 0x52, 0xa, 0x6d, 0xa7, 0x67, 0x67, 0x70, 0x6f, 0x67, 0x1e, + 0xfb, 0x61, 0xf7, 0xf0, 0x15, 0x67, 0xa8, 0x6e, 0xaf, 0xaf, 0xa8, 0xa8, + 0xaf, 0xaf, 0x6e, 0xa8, 0x67, 0x67, 0x6e, 0x6e, 0x67, 0x1e, 0xe, 0xf7, + 0x5f, 0xbf, 0x8b, 0xbf, 0x12, 0x9c, 0xf8, 0x94, 0x17, 0x13, 0x60, 0xbc, + 0xf7, 0x5f, 0x15, 0xa9, 0xa6, 0xaa, 0xa1, 0xb8, 0x1b, 0xa9, 0xaa, 0x7f, + 0x7c, 0xba, 0x1f, 0x7f, 0xb1, 0xc0, 0x7e, 0xba, 0x1b, 0xa2, 0xa1, 0x92, + 0x94, 0x9f, 0x1f, 0xaa, 0x9a, 0xa5, 0xa0, 0x94, 0x9d, 0x6a, 0xad, 0x18, + 0x7c, 0x7d, 0x6f, 0x66, 0x53, 0x1b, 0x63, 0x5f, 0x96, 0x98, 0x65, 0x1f, + 0x13, 0xe0, 0x99, 0x63, 0x66, 0x99, 0x5c, 0x1b, 0x40, 0x6a, 0x61, 0x73, + 0x70, 0x1f, 0xe, 0x8b, 0xc2, 0xf7, 0x15, 0xc2, 0xf7, 0x1b, 0xba, 0x90, + 0xbb, 0x12, 0x96, 0xf7, 0x4c, 0x15, 0x3a, 0xa, 0xfb, 0x83, 0x4, 0x3a, + 0xa, 0x13, 0x30, 0xba, 0xf7, 0xcf, 0x15, 0xab, 0xa8, 0xa2, 0xa3, 0xbe, + 0x1b, 0xa5, 0xad, 0x84, 0x7b, 0xb9, 0x1f, 0x13, 0x20, 0x78, 0xc0, 0xb4, + 0x81, 0xaf, 0x1b, 0xa4, 0xa1, 0x90, 0x96, 0xa2, 0x1f, 0xb7, 0xa0, 0x96, + 0xa4, 0x93, 0x9a, 0x66, 0xa3, 0x18, 0x7b, 0x7d, 0x73, 0x65, 0x4b, 0x1b, + 0x72, 0x63, 0x94, 0x97, 0x6c, 0x1f, 0x13, 0x10, 0x66, 0x99, 0x60, 0x9c, + 0x5e, 0x8c, 0x8, 0x34, 0x5e, 0x5d, 0x6b, 0x77, 0x1f, 0xe, 0xf7, 0x1b, + 0xbe, 0xf4, 0xbe, 0x12, 0x99, 0xf8, 0x96, 0x17, 0xb9, 0xf7, 0xb7, 0x57, + 0xa, 0xb3, 0x7b, 0x7d, 0xbc, 0x1f, 0x80, 0xb0, 0xb6, 0x32, 0xa, 0x97, + 0x98, 0x65, 0x1f, 0x98, 0x63, 0x62, 0x99, 0x5c, 0x1b, 0x40, 0x68, 0x63, + 0x72, 0x6d, 0x1f, 0xab, 0xfb, 0x56, 0x57, 0xa, 0xb5, 0x7b, 0x7d, 0xbc, + 0x1f, 0x13, 0xa0, 0x80, 0xb0, 0xb4, 0x32, 0xa, 0x98, 0x98, 0x64, 0x1f, + 0x98, 0x63, 0x63, 0x98, 0x5c, 0x1b, 0x40, 0x68, 0x62, 0x72, 0x6d, 0x1f, + 0xe, 0x87, 0x76, 0xf7, 0x35, 0xc2, 0xf7, 0x1f, 0xc2, 0xf7, 0x38, 0x77, + 0x1, 0xe9, 0x16, 0xbd, 0x72, 0xe6, 0xf7, 0x35, 0x5, 0xf7, 0xc5, 0xc2, + 0xfb, 0xa7, 0x6, 0xd8, 0xf7, 0x1f, 0x5, 0xf7, 0x5a, 0xc2, 0xfb, 0x3c, + 0x6, 0xd7, 0xf7, 0x1c, 0x5a, 0xa7, 0x30, 0xfb, 0x38, 0x5, 0xfb, 0xb9, + 0x54, 0xf7, 0x9a, 0x6, 0x3e, 0xfb, 0x1f, 0x5, 0xfb, 0x4d, 0x54, 0xf7, + 0x2f, 0x6, 0xe, 0xdd, 0xc2, 0xed, 0xc2, 0xed, 0xc2, 0x1, 0x99, 0xf8, + 0xa0, 0x14, 0xe0, 0x99, 0xf8, 0x18, 0x15, 0x42, 0xa, 0xfb, 0x64, 0x4, + 0x42, 0xa, 0xfb, 0x64, 0x4, 0x42, 0xa, 0xe, 0x3d, 0xa, 0xf7, 0xb8, + 0x4, 0xf8, 0x85, 0xfb, 0x76, 0x5, 0xc9, 0x7, 0xfc, 0x45, 0xf7, 0x57, + 0x3e, 0xa, 0x3d, 0xa, 0xcd, 0x4, 0xf8, 0x85, 0xf7, 0x76, 0x5, 0x51, + 0xa, 0xf8, 0x45, 0xfb, 0x5b, 0xfc, 0x45, 0xfb, 0x57, 0x5, 0xe, 0xa9, + 0x8b, 0x47, 0xa, 0xb1, 0xc5, 0x3, 0xf9, 0x46, 0x16, 0xc2, 0xfc, 0x29, + 0x7, 0x21, 0x8c, 0x39, 0xe3, 0xe2, 0x1a, 0xf0, 0xe1, 0xde, 0xf3, 0x1e, + 0xf8, 0x27, 0xc2, 0xfc, 0x28, 0x6, 0xfb, 0x33, 0x34, 0xfb, 0x11, 0xfb, + 0x6, 0x8a, 0x1f, 0xfb, 0x19, 0x8a, 0xf7, 0x6, 0x29, 0xf7, 0x16, 0x1b, + 0xe, 0xa9, 0x8b, 0x47, 0xa, 0xf8, 0xfb, 0xc5, 0x3, 0xf8, 0x40, 0x16, + 0xf7, 0x16, 0xf7, 0x7, 0xed, 0xf7, 0x19, 0xf7, 0x6, 0x31, 0xf7, 0x11, + 0xfb, 0x33, 0x1f, 0xfc, 0x28, 0x54, 0xf8, 0x27, 0x6, 0xf3, 0xe3, 0x38, + 0x26, 0x34, 0x37, 0x33, 0x21, 0x58, 0xa, 0xa9, 0x5a, 0x76, 0xd1, 0xc2, + 0xf7, 0xfb, 0xc2, 0xd2, 0x77, 0x1, 0xaf, 0xc5, 0x3, 0xf7, 0x8d, 0x45, + 0x15, 0xc7, 0x6, 0xaf, 0xd1, 0x5, 0xf7, 0xed, 0xc2, 0xfb, 0xd0, 0x6, + 0xf7, 0x44, 0xf7, 0xfb, 0x5, 0xf7, 0x20, 0xc2, 0xfb, 0x4, 0x6, 0xb0, + 0xd2, 0x5, 0x4f, 0x6, 0x67, 0x44, 0x5, 0xfb, 0x8a, 0x6, 0xfb, 0x4, + 0xfb, 0x11, 0x36, 0xfb, 0x2b, 0xfb, 0x31, 0xf7, 0x11, 0x3f, 0xf7, 0x10, + 0x8a, 0x1f, 0xa7, 0xc2, 0x15, 0xfb, 0x14, 0x8c, 0x30, 0xdc, 0xee, 0x1a, + 0xe2, 0xd9, 0xe7, 0xf5, 0x1e, 0xf7, 0x68, 0x6, 0xe, 0xa9, 0xfb, 0x11, + 0xc2, 0xd1, 0x47, 0xa, 0xb0, 0xc3, 0x3, 0xb0, 0x45, 0x15, 0x54, 0xf9, + 0x21, 0xc2, 0x7, 0xd1, 0x4, 0xc2, 0xfc, 0x29, 0x7, 0xfb, 0x10, 0x8c, + 0x46, 0xee, 0x8c, 0xdc, 0x8, 0xf7, 0x0, 0x8c, 0xea, 0xd2, 0xed, 0x1b, + 0xf8, 0x27, 0xc2, 0xfc, 0x28, 0x6, 0xfb, 0x40, 0x3e, 0xfb, 0x16, 0xfb, + 0x1, 0xfb, 0x19, 0xf3, 0x29, 0xf7, 0x21, 0x1f, 0xe, 0xa9, 0xfb, 0x11, + 0xc2, 0xd1, 0x47, 0xa, 0xf8, 0xfd, 0xc3, 0x3, 0x9f, 0xfb, 0x11, 0x15, + 0xf9, 0x21, 0xc2, 0xfd, 0x21, 0x6, 0xf8, 0x2c, 0xd1, 0x15, 0xf7, 0x21, + 0xf3, 0xed, 0xf7, 0x19, 0xf7, 0x1, 0x3e, 0xf7, 0x16, 0xfb, 0x40, 0x1f, + 0xfc, 0x28, 0x54, 0xf8, 0x27, 0x6, 0xed, 0xeb, 0x44, 0xfb, 0x0, 0x3a, + 0x47, 0x28, 0xfb, 0x10, 0x58, 0xa, 0xe0, 0x7c, 0xc0, 0xf7, 0x9d, 0xc1, + 0xf7, 0x9d, 0xc0, 0x1, 0xb6, 0xc4, 0xf7, 0x99, 0xc1, 0xf7, 0x9d, 0xc0, + 0x14, 0xe0, 0xf7, 0x24, 0xf7, 0xc3, 0x15, 0xf7, 0x6d, 0xfb, 0x71, 0xc1, + 0xf7, 0x71, 0xf7, 0x6e, 0xc1, 0xfb, 0x6e, 0xf7, 0x6f, 0x55, 0xfb, 0x6f, + 0xfb, 0x6d, 0x6, 0x5f, 0x70, 0x15, 0xf7, 0x35, 0xf7, 0x13, 0x30, 0xa, + 0xfb, 0x13, 0xf7, 0x17, 0xf7, 0x35, 0x1e, 0x52, 0x16, 0x21, 0xa, 0xe, + 0xe0, 0x7a, 0xc0, 0xf8, 0xdc, 0xc0, 0x1, 0xb6, 0xc0, 0xf8, 0xdc, 0xc0, + 0x3, 0xf7, 0x54, 0xf7, 0x3f, 0x15, 0xb2, 0x64, 0xf7, 0x31, 0xf7, 0x32, + 0xf7, 0x32, 0xfb, 0x33, 0xb2, 0xb1, 0xfb, 0x32, 0xf7, 0x33, 0xf7, 0x30, + 0xf7, 0x30, 0x64, 0xb1, 0xfb, 0x30, 0xfb, 0x30, 0xfb, 0x31, 0xf7, 0x32, + 0x64, 0x64, 0xf7, 0x31, 0xfb, 0x31, 0x5, 0xfb, 0xc6, 0x16, 0x21, 0xa, + 0xc0, 0x16, 0xf7, 0x35, 0xf7, 0x17, 0x30, 0xa, 0xfb, 0x17, 0xf7, 0x17, + 0xf7, 0x35, 0x1e, 0xe, 0x72, 0x8b, 0xc2, 0xf8, 0xff, 0x77, 0x1, 0xf7, + 0xc6, 0xc2, 0x3, 0x9a, 0x16, 0xf9, 0x11, 0xc2, 0xfb, 0xb7, 0xf8, 0xff, + 0x54, 0xfc, 0xff, 0xfb, 0xb7, 0x6, 0xe, 0xfc, 0x45, 0xf7, 0x66, 0xef, + 0x1, 0xd0, 0xef, 0x3, 0xd0, 0xf7, 0x98, 0x15, 0x6f, 0xa1, 0x75, 0xa7, + 0xa6, 0xa2, 0xa1, 0xa7, 0xa6, 0x74, 0xa2, 0x70, 0x6f, 0x75, 0x74, 0x70, + 0x1e, 0xe, 0x8e, 0x4d, 0x76, 0xf9, 0xe9, 0xf7, 0x2b, 0x1, 0xf7, 0xe0, + 0xd1, 0x3, 0xf7, 0xe0, 0x38, 0x15, 0xd1, 0xf8, 0x13, 0x6, 0xf8, 0x88, + 0xf7, 0x33, 0xd0, 0xae, 0x93, 0x92, 0x89, 0x89, 0x8f, 0x1e, 0x82, 0x86, + 0x80, 0x79, 0x78, 0x1a, 0x73, 0x9d, 0x6e, 0xb1, 0xb7, 0x9f, 0xb3, 0xb2, + 0xaf, 0x68, 0xaf, 0x5e, 0x4f, 0xfb, 0x87, 0x59, 0xfc, 0xd3, 0x1e, 0xe, + 0x8e, 0x3a, 0xf7, 0x29, 0xf9, 0xe9, 0x77, 0x1, 0xf7, 0xee, 0xd0, 0x3, + 0xf7, 0x1e, 0x70, 0x15, 0x94, 0x90, 0x96, 0x9d, 0x9e, 0x1a, 0xa3, 0x79, + 0xa8, 0x65, 0x5f, 0x78, 0x64, 0x64, 0x67, 0xad, 0x68, 0xb8, 0xc7, 0xf7, + 0x81, 0xbb, 0xf8, 0xd3, 0x1e, 0xf8, 0xf, 0x46, 0xfc, 0x13, 0x7, 0xfc, + 0x88, 0xfb, 0x2e, 0x46, 0x68, 0x83, 0x84, 0x8d, 0x8d, 0x87, 0x1e, 0xe, + 0x4c, 0xa, 0xa4, 0xf7, 0xa6, 0x15, 0xf7, 0x7a, 0xfc, 0x6c, 0xbe, 0xa4, + 0xfb, 0x6e, 0xf8, 0x53, 0xf7, 0x6e, 0xf8, 0x54, 0x58, 0xa3, 0x5, 0xe, + 0x4c, 0xa, 0xd3, 0xfb, 0x5a, 0x15, 0xf7, 0x7a, 0xf8, 0x6c, 0xfb, 0x7a, + 0xf8, 0x6c, 0x58, 0x73, 0xf7, 0x6e, 0xfc, 0x54, 0xfb, 0x6e, 0xfc, 0x53, + 0x5, 0xe, 0xfb, 0x51, 0xa0, 0x76, 0xf9, 0x7d, 0x77, 0x1, 0x9d, 0xc7, + 0xf7, 0xde, 0xc7, 0x3, 0xf7, 0x68, 0x16, 0xc7, 0x6, 0xf7, 0x58, 0xf8, + 0xd, 0xfb, 0x58, 0xf8, 0x4, 0x5, 0x4f, 0x6, 0xfb, 0x56, 0xfc, 0x4, + 0x5, 0xf7, 0x74, 0xfb, 0xd6, 0x15, 0xfb, 0x38, 0xf7, 0xd6, 0xf7, 0x38, + 0xf7, 0xce, 0xf7, 0x3a, 0xfb, 0xce, 0x5, 0xe, 0xd1, 0x7c, 0x76, 0xf8, + 0xdc, 0x77, 0x1, 0xf7, 0xec, 0xc1, 0x3, 0xf7, 0xbb, 0x67, 0x15, 0xf7, + 0x2c, 0x6, 0x84, 0x95, 0x62, 0xac, 0x8a, 0xce, 0x8, 0xaf, 0x8a, 0x94, + 0xa0, 0x9d, 0x1b, 0x91, 0x8f, 0x86, 0x81, 0x90, 0x1f, 0x5d, 0xa2, 0xa2, + 0x5e, 0xcc, 0x1b, 0xbb, 0xaa, 0xc4, 0xbb, 0xc0, 0x74, 0xb2, 0x61, 0xc2, + 0x1f, 0x2d, 0xf7, 0x10, 0x6f, 0xae, 0x44, 0xf7, 0x4, 0x44, 0xfb, 0x4, + 0x6f, 0x68, 0x2d, 0xfb, 0x10, 0x8, 0x61, 0x54, 0x74, 0x64, 0x56, 0x1a, + 0x5f, 0xa1, 0x4c, 0xcb, 0xc8, 0xa6, 0xc6, 0xb1, 0x9c, 0x1e, 0x92, 0x8e, + 0x8f, 0x90, 0x94, 0x1b, 0x98, 0x97, 0x77, 0x65, 0x8a, 0x1f, 0x8a, 0x48, + 0x62, 0x6a, 0x84, 0x81, 0x8, 0xe, 0xd1, 0x86, 0x76, 0xf7, 0x3c, 0xf7, + 0x17, 0x12, 0xf7, 0xe5, 0xd2, 0x4f, 0xbd, 0x13, 0xd0, 0xf7, 0xbf, 0x71, + 0x15, 0xf7, 0x28, 0x6, 0x70, 0xac, 0x75, 0x9f, 0xcd, 0x1a, 0xaa, 0x8e, + 0x9e, 0x99, 0x95, 0x9a, 0x7e, 0x6f, 0xa2, 0x1e, 0x6b, 0xa6, 0xab, 0x81, + 0xb2, 0x1b, 0xc5, 0xb4, 0xc7, 0xc9, 0xd1, 0x67, 0xc6, 0x47, 0x5f, 0x5e, + 0x6d, 0x83, 0x7c, 0x1f, 0x13, 0xe0, 0x70, 0x7d, 0x7a, 0x92, 0x9a, 0x1a, + 0x92, 0x8f, 0x92, 0x90, 0x90, 0x1e, 0x9d, 0x9e, 0xcd, 0xb0, 0xd1, 0x1a, + 0xd9, 0x4b, 0xa8, 0x4b, 0x4a, 0x4b, 0x6c, 0x38, 0x48, 0xd1, 0x67, 0x9a, + 0x7b, 0x1e, 0x90, 0x85, 0x8e, 0x85, 0x84, 0x1a, 0x7c, 0x79, 0x86, 0x72, + 0x97, 0x1e, 0x93, 0x7c, 0x64, 0xa9, 0x5f, 0x1b, 0x46, 0x62, 0x53, 0x46, + 0x47, 0xb5, 0x50, 0xcc, 0xaf, 0xa8, 0x98, 0xa9, 0xa5, 0x1f, 0xa7, 0xa4, + 0x9b, 0x97, 0x94, 0x1b, 0x13, 0xd0, 0x99, 0x8b, 0x71, 0x74, 0x49, 0x74, + 0x76, 0x71, 0x6b, 0x1f, 0xe, 0xd1, 0x7f, 0x76, 0xf8, 0xc9, 0x77, 0x1, + 0xf8, 0xa, 0x6a, 0x15, 0xd9, 0xf7, 0x7, 0x9a, 0xa7, 0xe6, 0xf7, 0x9, + 0x8, 0xb4, 0xc0, 0xab, 0xc0, 0xc4, 0x1a, 0xf7, 0x8, 0x43, 0xa5, 0x61, + 0x5d, 0x5d, 0x76, 0x48, 0x72, 0x1e, 0x78, 0x83, 0x88, 0x75, 0x7c, 0x1b, + 0x7c, 0x88, 0xa1, 0x9e, 0x83, 0x1f, 0xce, 0x72, 0x5d, 0xa0, 0x5d, 0x1b, + 0x61, 0x43, 0x71, 0xfb, 0x8, 0x52, 0xab, 0x56, 0xb4, 0x56, 0x1f, 0xe6, + 0xfb, 0x9, 0x9a, 0x6f, 0xd9, 0xfb, 0x7, 0x8, 0xe, 0xd1, 0x7c, 0x76, + 0xf8, 0xde, 0x77, 0x1, 0xf7, 0x22, 0xf8, 0x5e, 0x3, 0xf7, 0x22, 0xf7, + 0x95, 0x15, 0xf7, 0x7c, 0xfb, 0xb9, 0xf7, 0x76, 0xf7, 0xb9, 0xfb, 0x76, + 0xf7, 0xb9, 0x5, 0xe, 0xf6, 0x7c, 0xb3, 0xf3, 0xb1, 0xf7, 0xdb, 0xa5, + 0xf7, 0x7, 0xb3, 0x1, 0xbe, 0xb3, 0xf7, 0xa, 0xcc, 0xf7, 0x92, 0x9f, + 0xf7, 0x2d, 0xb3, 0x3, 0xf8, 0xaf, 0xf7, 0x70, 0x15, 0x62, 0x59, 0x6a, + 0x7f, 0x5e, 0x1b, 0x40, 0x4d, 0xc7, 0xf1, 0xd5, 0xb8, 0xe6, 0xdc, 0xc6, + 0xc6, 0x6c, 0x42, 0x95, 0x1f, 0x9f, 0x6, 0x87, 0xf7, 0x14, 0x5, 0x78, + 0x6, 0x88, 0x7d, 0x7c, 0x86, 0x79, 0x8f, 0x8, 0x90, 0x76, 0x6b, 0x97, + 0x64, 0x1b, 0x24, 0x36, 0x31, 0x23, 0xfb, 0x9, 0xdb, 0x3b, 0xf7, 0xb, + 0xd7, 0xb7, 0xbd, 0xa2, 0xa1, 0x1f, 0xfc, 0x87, 0xf7, 0x14, 0x23, 0xa, + 0xf6, 0x7a, 0xb3, 0xf7, 0x18, 0x9d, 0xf7, 0x31, 0xa2, 0xf7, 0x32, 0xa3, + 0xed, 0xb3, 0x1, 0xbd, 0xb3, 0xf7, 0x51, 0xcb, 0xf7, 0x17, 0xcf, 0xf7, + 0x32, 0xb3, 0x3, 0xbd, 0xf7, 0xdc, 0x4f, 0xa, 0xf7, 0x52, 0xf7, 0x2f, + 0xf7, 0x2e, 0xf7, 0x53, 0x48, 0xa, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x52, + 0x8c, 0x2c, 0xa, 0x1e, 0xfb, 0x3d, 0x8a, 0xfb, 0x1c, 0x43, 0xa, 0x1a, + 0xf7, 0x20, 0xfb, 0x40, 0x15, 0xf7, 0x34, 0x9d, 0x6, 0x75, 0x72, 0x9a, + 0xa3, 0x1f, 0xf7, 0xa, 0xa5, 0x7, 0xf7, 0x19, 0xfb, 0x43, 0x5, 0xea, + 0x9d, 0x6, 0x7e, 0x7f, 0x8b, 0x99, 0x80, 0x1f, 0xfb, 0xc, 0xf7, 0x2c, + 0x5, 0xc5, 0x9c, 0xb6, 0xa2, 0xc9, 0x1a, 0xd8, 0x3b, 0x9c, 0x4f, 0x1e, + 0xfb, 0x3b, 0x79, 0x6, 0xb3, 0x8f, 0x80, 0x6e, 0x1f, 0xfb, 0xa0, 0x7, + 0x78, 0x71, 0x7a, 0x74, 0x1e, 0xf7, 0x5, 0xf7, 0x48, 0x15, 0xf7, 0x12, + 0x7, 0x9c, 0x95, 0x9a, 0x95, 0xcf, 0xb5, 0x79, 0x58, 0x8c, 0x1e, 0x39, + 0x43, 0x85, 0x50, 0x8a, 0x1e, 0xe, 0xf7, 0x63, 0xf7, 0xce, 0x76, 0xf7, + 0xf9, 0xa2, 0x79, 0x9d, 0x12, 0x9d, 0x9d, 0xf7, 0x6, 0xc6, 0xf7, 0x6, + 0x9d, 0xdd, 0xa6, 0xf7, 0xbc, 0xc6, 0x13, 0xdf, 0xee, 0xf7, 0xb9, 0x15, + 0xf7, 0x34, 0x9d, 0x6, 0x6c, 0x78, 0x9a, 0xa2, 0x1f, 0xf7, 0xc2, 0x7, + 0xb0, 0x8a, 0xc3, 0x89, 0xa2, 0x6e, 0x89, 0x5f, 0x19, 0x9d, 0x8c, 0x88, + 0xec, 0x5, 0xfb, 0xd1, 0x6, 0x88, 0x2a, 0x9d, 0x8a, 0x89, 0xb7, 0xa2, + 0xa8, 0xc3, 0x8d, 0x19, 0xb0, 0x8c, 0x5, 0xfb, 0xc2, 0x4a, 0xa, 0xf7, + 0xa5, 0x79, 0x15, 0xf7, 0x15, 0x9d, 0x6, 0x6c, 0x77, 0x9a, 0xa2, 0x1f, + 0xf7, 0x8f, 0x7, 0xf7, 0x24, 0xfb, 0xc7, 0x5, 0x9d, 0x6, 0xf7, 0x1a, + 0xf7, 0xd7, 0x5, 0xfb, 0x9f, 0x4a, 0xa, 0x79, 0xf7, 0x34, 0x9d, 0x7, + 0x6c, 0x78, 0x9a, 0xa2, 0x1f, 0xf7, 0xad, 0x7, 0x13, 0xbf, 0xa6, 0xa8, + 0x89, 0xa0, 0x1e, 0x9d, 0xfb, 0x5, 0x7, 0xfb, 0x12, 0xfb, 0xb4, 0xfb, + 0x18, 0xf7, 0xb4, 0x5, 0xfb, 0x6, 0x79, 0x6, 0xab, 0xa0, 0x8e, 0x65, + 0x1f, 0xfb, 0xa3, 0x4a, 0xa, 0xe, 0xfb, 0x4b, 0xfa, 0x5, 0xaf, 0x1, + 0xf8, 0x74, 0xfa, 0x5, 0x15, 0xf8, 0xf6, 0xaf, 0xfc, 0xf6, 0x6, 0xe, + 0x3b, 0x28, 0x76, 0xfa, 0xfe, 0x49, 0xa, 0xf7, 0xac, 0xfb, 0xc, 0x15, + 0xc3, 0xfa, 0xfe, 0x53, 0x6, 0xe, 0xf7, 0xd1, 0xf7, 0x70, 0xc3, 0x1, + 0x4f, 0xfa, 0xea, 0x3, 0x4f, 0xf7, 0x70, 0x15, 0xfa, 0xea, 0xc3, 0xfe, + 0xea, 0x6, 0xe, 0xf6, 0x77, 0xb3, 0xf7, 0xb4, 0xb6, 0xf7, 0x17, 0xb6, + 0xf4, 0xb3, 0x1, 0xbd, 0xb3, 0xf7, 0x44, 0xbc, 0xf7, 0x54, 0xb9, 0xf7, + 0x27, 0xb3, 0x3, 0xbd, 0xf7, 0xd9, 0x4f, 0xa, 0x1e, 0xf7, 0x52, 0x8c, + 0xf7, 0x2f, 0xf7, 0x2d, 0xf7, 0x53, 0x1a, 0x48, 0xa, 0xfb, 0x2e, 0xfb, + 0x2f, 0xfb, 0x52, 0x2c, 0xa, 0xfb, 0x3d, 0xfb, 0x1c, 0xf7, 0x1c, 0xf7, + 0x3c, 0x1e, 0xf7, 0x44, 0xfb, 0x50, 0x15, 0xbc, 0xf7, 0x40, 0xf7, 0x11, + 0x6, 0xd2, 0x82, 0x3c, 0x67, 0x8c, 0x1f, 0x8c, 0x6f, 0x93, 0x89, 0x94, + 0x79, 0x8, 0x9e, 0xa1, 0x8b, 0x9e, 0x1b, 0x73, 0xa7, 0x87, 0xa3, 0xb0, + 0x1a, 0xbe, 0x7c, 0xa6, 0x6c, 0xa0, 0x1e, 0xb0, 0xa7, 0x98, 0x9d, 0xbc, + 0x1a, 0xe1, 0x4d, 0x96, 0x50, 0x1e, 0xfb, 0x3e, 0x6, 0xbc, 0xfb, 0x42, + 0x15, 0xf7, 0x17, 0xf7, 0xe, 0x7, 0xa9, 0xb3, 0x83, 0x4a, 0x5a, 0x66, + 0x82, 0x6a, 0x1f, 0xe, 0xf6, 0x7c, 0xb3, 0xef, 0xb9, 0xf7, 0xcc, 0xb6, + 0xf7, 0x1, 0xb3, 0x1, 0xbc, 0xb3, 0xf7, 0x1e, 0xbc, 0xf7, 0x80, 0xb8, + 0xf7, 0x22, 0xb3, 0x3, 0xf8, 0x94, 0xf7, 0xa6, 0x15, 0x52, 0x59, 0x5d, + 0x52, 0x35, 0x60, 0xe5, 0xd6, 0xdd, 0xb7, 0xcc, 0xd8, 0xce, 0xb3, 0x6f, + 0x58, 0x8d, 0x1e, 0xbe, 0x6, 0xe5, 0x89, 0x44, 0xab, 0x33, 0x1b, 0xfb, + 0x0, 0x4e, 0x33, 0x23, 0xfb, 0x4, 0xcd, 0x2a, 0xf7, 0x4, 0xf7, 0x0, + 0xb9, 0xe7, 0xc4, 0x1f, 0xfc, 0x92, 0xc3, 0x23, 0xa, 0xf2, 0xf7, 0xce, + 0x76, 0xf7, 0xe5, 0xb6, 0x1, 0xf7, 0x16, 0xbc, 0xf7, 0x50, 0xbc, 0xf7, + 0x98, 0xbc, 0x3, 0xf7, 0x16, 0xf7, 0xb9, 0x15, 0xbc, 0xf7, 0xe5, 0xf7, + 0x11, 0xb6, 0xfb, 0xbf, 0x60, 0xf7, 0x11, 0x6, 0xf7, 0x81, 0xfb, 0xe5, + 0x15, 0xbc, 0xf7, 0xc9, 0x6, 0xf4, 0xfb, 0xc4, 0x5, 0xbd, 0x6, 0xf4, + 0xf7, 0xc4, 0x5, 0xfb, 0xc9, 0xbc, 0xf8, 0x10, 0x44, 0x7, 0xfb, 0x0, + 0xfb, 0xd2, 0xfb, 0x0, 0xf7, 0xd2, 0x5, 0x44, 0x6, 0xe, 0xfb, 0xbf, + 0xfb, 0xb9, 0x1c, 0x4, 0xb9, 0x1, 0xa3, 0xdf, 0x3, 0xa3, 0xfb, 0xb9, + 0x15, 0xdf, 0xf8, 0x2e, 0x6, 0xf7, 0xf3, 0xf5, 0xf7, 0xc9, 0xf7, 0x72, + 0xf7, 0x1f, 0x1e, 0x7e, 0x95, 0x5, 0xfb, 0x57, 0x2a, 0xfb, 0x60, 0xfb, + 0x62, 0xfc, 0x8e, 0x1a, 0xe, 0xfb, 0xbf, 0xfa, 0x31, 0x8b, 0x1, 0xa3, + 0xdf, 0x3, 0xa3, 0x54, 0xa, 0x3f, 0xa, 0xa3, 0xdf, 0x3, 0xf8, 0x41, + 0xfb, 0xb9, 0x15, 0x92, 0x95, 0x5, 0xfb, 0x72, 0xf7, 0x29, 0x21, 0xf7, + 0xbf, 0xf7, 0xf3, 0x1a, 0xf8, 0x2e, 0x37, 0xfc, 0x2e, 0x7, 0xfc, 0x8e, + 0xf7, 0x65, 0xfb, 0x58, 0xf7, 0x57, 0x20, 0x1e, 0xe, 0xfb, 0xbf, 0xfa, + 0x9, 0xb4, 0x1, 0x8b, 0xd8, 0x3, 0x3b, 0x4, 0xd8, 0xf9, 0xd2, 0x6, + 0xf7, 0x11, 0x9b, 0x95, 0xf7, 0x11, 0x1e, 0xf7, 0x17, 0xb4, 0xfb, 0xf1, + 0x6, 0xe, 0xfb, 0xbf, 0x3c, 0xfa, 0x80, 0x1, 0x8b, 0xd8, 0x3, 0x3c, + 0x4, 0xd8, 0xfa, 0x80, 0x3e, 0x6, 0xe, 0xfb, 0xbf, 0x3b, 0xb4, 0x1, + 0x8b, 0xd8, 0x3, 0x3b, 0x4, 0xf7, 0xe8, 0xb4, 0xfb, 0xe, 0x6, 0xfb, + 0x11, 0x7b, 0x95, 0xf7, 0x11, 0x1f, 0xf9, 0xd2, 0x3e, 0x7, 0xe, 0xfb, + 0x51, 0xfa, 0x13, 0xa9, 0x35, 0xa, 0xf7, 0xb0, 0x36, 0x15, 0xf9, 0xc8, + 0x7, 0xf7, 0x2, 0x91, 0xbd, 0xdb, 0x1e, 0xd6, 0xa9, 0x40, 0x6, 0xfb, + 0x2, 0x58, 0x6e, 0xfb, 0x35, 0x1f, 0xfd, 0xc8, 0x7, 0xe, 0x2d, 0xa, + 0xf7, 0x7f, 0x6, 0xf7, 0x2d, 0x4c, 0xde, 0xfb, 0x1c, 0xb2, 0x1e, 0xf7, + 0x1c, 0xb2, 0xca, 0xde, 0xf7, 0x2d, 0x1a, 0xf7, 0x7f, 0x40, 0xfb, 0x7f, + 0x7, 0x27, 0x67, 0xfb, 0x7, 0xfb, 0x2d, 0x5e, 0x1e, 0x6d, 0x7, 0xf7, + 0x2d, 0x5e, 0xaf, 0xfb, 0x7, 0x27, 0x1a, 0xe, 0x53, 0xa, 0xf7, 0x65, + 0xfa, 0x3b, 0x15, 0xfd, 0xcc, 0x7, 0xfb, 0x35, 0xb4, 0x72, 0xf7, 0x2, + 0x1e, 0xe0, 0xa9, 0x36, 0x6, 0x3b, 0x8f, 0xb9, 0xf7, 0x2, 0x1f, 0xf9, + 0xcc, 0x7, 0xe, 0x2d, 0xa, 0xfa, 0x90, 0x40, 0x6, 0xe, 0x8e, 0x33, + 0xfa, 0xbb, 0x1, 0xf7, 0xc8, 0xd1, 0x3, 0xf7, 0xc8, 0x33, 0x15, 0xd1, + 0xfa, 0xbb, 0x45, 0x6, 0xe, 0x3f, 0xa, 0xf8, 0x12, 0xdf, 0x3, 0xf8, + 0x12, 0xfb, 0xb9, 0x15, 0xdf, 0xf8, 0x38, 0x6, 0xf8, 0x8e, 0xfb, 0x60, + 0xf7, 0x58, 0xfb, 0x57, 0xec, 0x1e, 0x7e, 0x81, 0x5, 0xf7, 0x72, 0xfb, + 0x1f, 0xf5, 0xfb, 0xbf, 0xfb, 0xf3, 0x1a, 0xe, 0xfb, 0xbf, 0x36, 0xfa, + 0x86, 0x1, 0xf8, 0x12, 0xdf, 0x3, 0xf8, 0x12, 0x54, 0xa, 0x3f, 0xa, + 0xf8, 0x12, 0xdf, 0x3, 0xc1, 0xfb, 0xaf, 0x15, 0x98, 0x81, 0x5, 0xf7, + 0x57, 0xec, 0xf7, 0x60, 0xf7, 0x5d, 0xf8, 0x8e, 0x1a, 0xf8, 0x33, 0x37, + 0xfc, 0x33, 0x7, 0xfb, 0xf3, 0x21, 0xfb, 0xc4, 0xfb, 0x72, 0xfb, 0x1f, + 0x1e, 0xe, 0xfb, 0xbf, 0xfa, 0x9, 0xb4, 0x1, 0xf7, 0xb9, 0xd9, 0x3, + 0xf7, 0xb9, 0x3b, 0x15, 0xd9, 0xfa, 0x82, 0xfb, 0xf1, 0x62, 0xf7, 0x1b, + 0x6, 0xf7, 0x11, 0x96, 0x80, 0xfb, 0x11, 0x1f, 0xe, 0xfb, 0xbf, 0x3c, + 0xfa, 0x80, 0x1, 0xf7, 0xba, 0xd8, 0x3, 0xf7, 0xba, 0x3c, 0x15, 0xd8, + 0xfa, 0x80, 0x3e, 0x6, 0xe, 0xfb, 0xbf, 0x3b, 0xb4, 0x1, 0xf7, 0xba, + 0xd8, 0x3, 0xa1, 0x64, 0x15, 0x62, 0xf7, 0xf1, 0xfa, 0x82, 0x3e, 0xfd, + 0xcf, 0x7, 0xfb, 0x13, 0x79, 0x80, 0xfb, 0x11, 0x1e, 0xe, 0xfb, 0x51, + 0xfa, 0x13, 0xa9, 0x2e, 0xa, 0xf9, 0xc8, 0x6, 0xf7, 0x2c, 0x74, 0xb1, + 0xfb, 0x19, 0x1e, 0x3b, 0x6d, 0xdb, 0x6, 0xd1, 0x96, 0x5f, 0xfb, 0x8, + 0x1f, 0xe, 0x2d, 0xa, 0xf7, 0x80, 0x6, 0xef, 0xaf, 0xf7, 0x6, 0xf7, + 0x2d, 0xb8, 0x1e, 0xa9, 0x7, 0xfb, 0x2d, 0xb8, 0x67, 0xf7, 0x6, 0xef, + 0x1a, 0xf7, 0x80, 0x40, 0xfb, 0x80, 0x7, 0xfb, 0x2d, 0xca, 0x39, 0xf7, + 0x1c, 0x64, 0x1e, 0xfb, 0x1c, 0x64, 0x4c, 0x39, 0xfb, 0x2d, 0x1a, 0xe, + 0x53, 0xa, 0xbb, 0x5e, 0x15, 0x6d, 0xdb, 0x7, 0xf7, 0x16, 0xa5, 0xb3, + 0xf7, 0x2b, 0x1f, 0xf9, 0xc7, 0x40, 0xfd, 0xc7, 0x7, 0xfb, 0x16, 0x80, + 0x6c, 0x45, 0x1e, 0xe, 0xf6, 0x9d, 0x76, 0xf8, 0xff, 0xf7, 0x54, 0x1, + 0xf9, 0x71, 0xf7, 0x69, 0x15, 0x3f, 0xa0, 0x65, 0xd3, 0xd4, 0x1a, 0xce, + 0xa9, 0xcd, 0xca, 0xa9, 0x1e, 0xbf, 0x6e, 0x41, 0xa4, 0x52, 0x1b, 0x6e, + 0x76, 0x84, 0x83, 0x76, 0x1f, 0x83, 0x76, 0x75, 0x83, 0x6e, 0x1b, 0x72, + 0x75, 0x93, 0x93, 0x76, 0x1f, 0x94, 0x74, 0x75, 0x94, 0x70, 0x1b, 0xfb, + 0x3, 0x25, 0x2b, 0xfb, 0x21, 0xfb, 0x1a, 0xd2, 0xfb, 0x92, 0xf7, 0x37, + 0xa5, 0x9e, 0x96, 0x94, 0xa0, 0x1f, 0x92, 0x9b, 0x9b, 0x91, 0xa0, 0x1b, + 0xa1, 0x9b, 0x85, 0x85, 0x9a, 0x1f, 0x82, 0xa1, 0x9d, 0x7f, 0xa7, 0x1b, + 0xe1, 0xb5, 0xe2, 0xf7, 0x15, 0xd6, 0x1f, 0xfb, 0xdb, 0xf8, 0x27, 0x15, + 0xe6, 0x88, 0xe5, 0xf0, 0x76, 0xe9, 0x8, 0x3c, 0x35, 0x2b, 0x2b, 0x90, + 0x1f, 0xe, 0x78, 0x9e, 0xf8, 0x7b, 0x98, 0xf7, 0x41, 0x9a, 0x6, 0x1e, + 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xe7, 0xa, 0xe0, 0xb, 0x9f, 0xd3, + 0xc, 0xc, 0xf8, 0xb9, 0x14, 0xf9, 0x3f, 0x15, 0xab, 0x13, 0x0, 0x3a, + 0x2, 0x0, 0x1, 0x0, 0x13, 0x0, 0x2d, 0x0, 0x30, 0x0, 0x47, 0x0, + 0x4f, 0x0, 0x56, 0x0, 0x5d, 0x0, 0x61, 0x0, 0x67, 0x0, 0x7c, 0x0, + 0x82, 0x0, 0x8b, 0x0, 0xa6, 0x0, 0xae, 0x0, 0xb4, 0x0, 0xba, 0x0, + 0xc7, 0x0, 0xce, 0x0, 0xe3, 0x0, 0xed, 0x0, 0xf6, 0x0, 0xfc, 0x1, + 0xa, 0x1, 0xe, 0x1, 0x19, 0x1, 0x1c, 0x1, 0x23, 0x1, 0x2a, 0x1, + 0x31, 0x1, 0x40, 0x1, 0x4d, 0x1, 0x56, 0x1, 0x5f, 0x1, 0x66, 0x1, + 0x6d, 0x1, 0x72, 0x1, 0x77, 0x1, 0x7c, 0x1, 0x88, 0x1, 0x8e, 0x1, + 0x99, 0x1, 0xa0, 0x1, 0xa7, 0x1, 0xac, 0x1, 0xb6, 0x1, 0xc0, 0x1, + 0xca, 0x1, 0xce, 0x1, 0xd8, 0x1, 0xe2, 0x1, 0xec, 0x1, 0xf3, 0x1, + 0xfb, 0x2, 0x4, 0x2, 0x9, 0x2, 0x12, 0x2, 0x19, 0x2, 0x1f, 0x6c, + 0xa4, 0x72, 0xaa, 0xaa, 0xa4, 0xa4, 0xaa, 0xaa, 0x72, 0xa4, 0x6c, 0x6c, + 0x72, 0x72, 0x6c, 0x1e, 0xb, 0x2b, 0xa, 0xf7, 0x53, 0xf7, 0x2e, 0xf7, + 0x2e, 0x4b, 0xa, 0xfb, 0x2e, 0xf7, 0x2e, 0xfb, 0x53, 0xfb, 0x53, 0xfb, + 0x2e, 0xfb, 0x2e, 0xfb, 0x53, 0x1e, 0xb, 0x20, 0xa, 0xe, 0x15, 0x21, + 0xa, 0xb3, 0x16, 0xf7, 0x3c, 0xf7, 0x1d, 0x43, 0xa, 0xf7, 0x3c, 0xf7, + 0x1d, 0x34, 0xa, 0x34, 0xa, 0x43, 0xa, 0x1e, 0xe, 0x16, 0xf7, 0xb0, + 0x9d, 0x6, 0x2a, 0xa, 0xb, 0x2f, 0xa, 0xfc, 0x7d, 0x27, 0xa, 0xb, + 0x7, 0x3c, 0xa, 0xfc, 0x7d, 0x39, 0xa, 0x7, 0x28, 0xa, 0xb, 0x54, + 0x68, 0x78, 0x54, 0x1e, 0xb, 0x6d, 0xa4, 0x72, 0xaa, 0x1e, 0xa9, 0x8c, + 0xa5, 0xa3, 0xaa, 0x1a, 0xa9, 0x71, 0xa5, 0x6d, 0x6c, 0x72, 0x71, 0x6c, + 0x1e, 0xb, 0x54, 0x68, 0x9e, 0xc2, 0x1f, 0xb, 0xfb, 0x53, 0xf7, 0x2e, + 0xfb, 0x2e, 0xf7, 0x53, 0xb, 0x1e, 0xb3, 0x8a, 0x15, 0xf7, 0x3d, 0xf7, + 0x1c, 0x43, 0xa, 0xf7, 0x3d, 0xf7, 0x1d, 0xfb, 0x1d, 0xfb, 0x3c, 0xfb, + 0x3d, 0xfb, 0x1d, 0xfb, 0x1c, 0xfb, 0x3c, 0xb, 0xfb, 0x51, 0x36, 0xfa, + 0x90, 0x2e, 0xa, 0xb, 0x44, 0xa, 0x36, 0x15, 0xd6, 0xb, 0xc2, 0xae, + 0x78, 0x54, 0x1f, 0xb, 0xf7, 0x17, 0xf7, 0x35, 0xf7, 0x35, 0xf7, 0x17, + 0x56, 0xa, 0x41, 0xa, 0xb, 0xc2, 0xae, 0x9e, 0xc2, 0x1e, 0x9d, 0xb, + 0x82, 0xb9, 0x1b, 0xc5, 0xc7, 0xb4, 0xa8, 0x9a, 0x1f, 0x68, 0xac, 0x5, + 0x7c, 0x7d, 0x72, 0x66, 0x53, 0x1b, 0x62, 0x66, 0xb, 0x1e, 0xfb, 0xa9, + 0x79, 0x6, 0x25, 0xa, 0xf7, 0x56, 0xb, 0xfb, 0x1d, 0xfb, 0x3c, 0xfb, + 0x3c, 0xfb, 0x1d, 0xb, 0x1, 0xf7, 0x65, 0xd6, 0x3, 0xb, 0xf7, 0x5c, + 0x40, 0xa, 0x6f, 0xa1, 0x6c, 0x7b, 0x7b, 0x85, 0x81, 0x87, 0x1e, 0xb, + 0x15, 0x20, 0xa, 0xb, 0x88, 0x85, 0x8b, 0x89, 0x8a, 0x1a, 0x7c, 0x9a, + 0x85, 0x96, 0xb, 0x27, 0xa, 0xe, 0xf8, 0xa2, 0xc2, 0xfc, 0xa2, 0x6, + 0xb, 0xa0, 0x76, 0xf9, 0x35, 0x77, 0x1, 0xb, 0x31, 0xa, 0xfb, 0xb0, + 0x45, 0xa, 0xb, 0x8b, 0xc2, 0xf8, 0xdc, 0x77, 0x1, 0xa8, 0x16, 0xf8, + 0x85, 0xc2, 0xfc, 0x85, 0x6, 0xb, 0xf8, 0x45, 0xf7, 0x5b, 0x5, 0xc9, + 0x7, 0xfc, 0x85, 0xfb, 0x7a, 0x5, 0xe, 0xfb, 0xbf, 0xfb, 0xb9, 0x1c, + 0x4, 0xc3, 0x1, 0xb, 0x5, 0x8f, 0x8f, 0x8d, 0x95, 0x91, 0x1a, 0xa8, + 0xb, 0xfb, 0x17, 0xfb, 0x35, 0xfb, 0x35, 0xb, 0xf8, 0xa0, 0xc2, 0xfc, + 0xa0, 0x6, 0xb, 0xf7, 0x1d, 0xf7, 0x3c, 0xb, 0x35, 0xa, 0xf7, 0x65, + 0xb, 0x79, 0x7, 0x2f, 0xa, 0xb, 0xf7, 0xc4, 0x91, 0x76, 0xf7, 0x7f, + 0xc3, 0xf7, 0x7f, 0x77, 0x1, 0xb, 0xc2, 0xf7, 0xfc, 0xc2, 0x1, 0xb, + 0xf7, 0x52, 0xfb, 0x2f, 0xf7, 0x2f, 0xfb, 0x52, 0xfb, 0x53, 0xb, 0x77, + 0x1, 0xf7, 0xac, 0xc3, 0x3, 0xb, 0x7, 0x74, 0x77, 0x7c, 0x6c, 0x1e, + 0xb, 0xf7, 0x53, 0xf7, 0x53, 0xb, 0xfb, 0xf6, 0xfb, 0x45, 0x76, 0xfa, + 0x44, 0x77, 0x1, 0xb, 0xfb, 0x5f, 0xfb, 0x4b, 0xa4, 0xf9, 0xba, 0xa4, + 0x1, 0xb, 0xfb, 0xf2, 0xfb, 0x2f, 0xa4, 0xf9, 0x9f, 0xa4, 0x1, 0xb, + 0x15, 0x2b, 0xa, 0xb, 0xfb, 0xf2, 0xfb, 0x3e, 0x76, 0xf9, 0xf4, 0x77, + 0x1, 0xb, 0xc9, 0x7, 0xfc, 0x85, 0xf7, 0x7a, 0x5, 0x4d, 0x7, 0xb, + 0x67, 0xa8, 0x6e, 0xaf, 0xaf, 0xa7, 0xa8, 0xaf, 0xaf, 0xb, 0xfb, 0x51, + 0x40, 0xa9, 0x35, 0xa, 0xb, 0x36, 0x15, 0xdf, 0xfa, 0x86, 0x37, 0x6, + 0xe, 0x1, 0xb3, 0xc2, 0xf8, 0xda, 0xc2, 0x3, 0xb3, 0xb, 0x41, 0xa, + 0xfb, 0x17, 0xb, 0x15, 0xa9, 0xa6, 0xaa, 0x9f, 0xb8, 0x1b, 0xaa, 0xb, + 0x8a, 0x1f, 0xfc, 0x29, 0x54, 0x6, 0xe, 0x90, 0x90, 0x8f, 0x8e, 0x8d, + 0xb}; diff --git a/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/chromefontdata.h b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/chromefontdata.h new file mode 100644 index 000000000000..3cd8d1a8cadc --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fontdata/chromefontdata/chromefontdata.h @@ -0,0 +1,35 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_FONTDATA_CHROMEFONTDATA_CHROMEFONTDATA_H_ +#define CORE_FXGE_FONTDATA_CHROMEFONTDATA_CHROMEFONTDATA_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +extern const unsigned char g_FoxitFixedItalicFontData[18746]; +extern const unsigned char g_FoxitFixedFontData[17597]; +extern const unsigned char g_FoxitSansItalicFontData[16339]; +extern const unsigned char g_FoxitSansFontData[15025]; +extern const unsigned char g_FoxitSerifItalicFontData[21227]; +extern const unsigned char g_FoxitSerifFontData[19469]; +extern const unsigned char g_FoxitFixedBoldItalicFontData[19151]; +extern const unsigned char g_FoxitFixedBoldFontData[18055]; +extern const unsigned char g_FoxitSansBoldItalicFontData[16418]; +extern const unsigned char g_FoxitSansBoldFontData[16344]; +extern const unsigned char g_FoxitSerifBoldItalicFontData[20733]; +extern const unsigned char g_FoxitSerifBoldFontData[19395]; +extern const unsigned char g_FoxitSymbolFontData[16729]; +extern const unsigned char g_FoxitDingbatsFontData[29513]; +extern const unsigned char g_FoxitSerifMMFontData[113417]; +extern const unsigned char g_FoxitSansMMFontData[66919]; + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // CORE_FXGE_FONTDATA_CHROMEFONTDATA_CHROMEFONTDATA_H_ diff --git a/modules/pdfium/pdfium/core/fxge/freetype/DEPS b/modules/pdfium/pdfium/core/fxge/freetype/DEPS new file mode 100644 index 000000000000..26546f7920cf --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/freetype/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + '+third_party/freetype/src' +] diff --git a/modules/pdfium/pdfium/core/fxge/freetype/fx_freetype.cpp b/modules/pdfium/pdfium/core/fxge/freetype/fx_freetype.cpp new file mode 100644 index 000000000000..6d4dbe8cfa3d --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/freetype/fx_freetype.cpp @@ -0,0 +1,171 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fx_freetype.h" + +#include "psnames/pstables.h" + +static int xyq_search_node(char* glyph_name, + int name_offset, + int table_offset, + wchar_t unicode) { + int i, count; + + // copy letters + while (1) { + glyph_name[name_offset] = ft_adobe_glyph_list[table_offset] & 0x7f; + name_offset++; + table_offset++; + if (!(ft_adobe_glyph_list[table_offset - 1] & 0x80)) + break; + } + glyph_name[name_offset] = 0; + + // get child count + count = ft_adobe_glyph_list[table_offset] & 0x7f; + + // check if we have value for this node + if (ft_adobe_glyph_list[table_offset] & 0x80) { + unsigned short thiscode = ft_adobe_glyph_list[table_offset + 1] * 256 + + ft_adobe_glyph_list[table_offset + 2]; + if (thiscode == (unsigned short)unicode) // found it! + return 1; + table_offset += 3; + } else { + table_offset++; + } + + // now search in sub-nodes + if (count == 0) + return 0; + for (i = 0; i < count; i++) { + int child_offset = ft_adobe_glyph_list[table_offset + i * 2] * 256 + + ft_adobe_glyph_list[table_offset + i * 2 + 1]; + if (xyq_search_node(glyph_name, name_offset, child_offset, unicode)) + // found in child + return 1; + } + return 0; +} + +#define VARIANT_BIT 0x80000000UL + +int FXFT_unicode_from_adobe_name(const char* glyph_name) { + /* If the name begins with `uni', then the glyph name may be a */ + /* hard-coded unicode character code. */ + if (glyph_name[0] == 'u' && glyph_name[1] == 'n' && glyph_name[2] == 'i') { + /* determine whether the next four characters following are */ + /* hexadecimal. */ + + /* XXX: Add code to deal with ligatures, i.e. glyph names like */ + /* `uniXXXXYYYYZZZZ'... */ + + FT_Int count; + FT_UInt32 value = 0; + const char* p = glyph_name + 3; + + for (count = 4; count > 0; count--, p++) { + char c = *p; + unsigned int d; + + d = (unsigned char)c - '0'; + if (d >= 10) { + d = (unsigned char)c - 'A'; + if (d >= 6) + d = 16; + else + d += 10; + } + + /* Exit if a non-uppercase hexadecimal character was found */ + /* -- this also catches character codes below `0' since such */ + /* negative numbers cast to `unsigned int' are far too big. */ + if (d >= 16) + break; + + value = (value << 4) + d; + } + + /* there must be exactly four hex digits */ + if (count == 0) { + if (*p == '\0') + return value; + if (*p == '.') + return (FT_UInt32)(value | VARIANT_BIT); + } + } + + /* If the name begins with `u', followed by four to six uppercase */ + /* hexadecimal digits, it is a hard-coded unicode character code. */ + if (glyph_name[0] == 'u') { + FT_Int count; + FT_UInt32 value = 0; + const char* p = glyph_name + 1; + + for (count = 6; count > 0; count--, p++) { + char c = *p; + unsigned int d; + + d = (unsigned char)c - '0'; + if (d >= 10) { + d = (unsigned char)c - 'A'; + if (d >= 6) + d = 16; + else + d += 10; + } + + if (d >= 16) + break; + + value = (value << 4) + d; + } + + if (count <= 2) { + if (*p == '\0') + return value; + if (*p == '.') + return (FT_UInt32)(value | VARIANT_BIT); + } + } + + /* Look for a non-initial dot in the glyph name in order to */ + /* find variants like `A.swash', `e.final', etc. */ + { + const char* p = glyph_name; + const char* dot = nullptr; + + for (; *p; p++) { + if (*p == '.' && p > glyph_name) { + dot = p; + break; + } + } + + /* now look up the glyph in the Adobe Glyph List */ + if (!dot) + return (FT_UInt32)ft_get_adobe_glyph_index(glyph_name, p); + else + return (FT_UInt32)(ft_get_adobe_glyph_index(glyph_name, dot) | + VARIANT_BIT); + } +} + +void FXFT_adobe_name_from_unicode(char* glyph_name, wchar_t unicode) { + int i, count; + + // start from top level node + count = ft_adobe_glyph_list[1]; + for (i = 0; i < count; i++) { + int child_offset = + ft_adobe_glyph_list[i * 2 + 2] * 256 + ft_adobe_glyph_list[i * 2 + 3]; + if (xyq_search_node(glyph_name, 0, child_offset, unicode)) + return; + } + + // failed, clear the buffer + glyph_name[0] = 0; +} diff --git a/modules/pdfium/pdfium/core/fxge/fx_dib.h b/modules/pdfium/pdfium/core/fxge/fx_dib.h new file mode 100644 index 000000000000..14be05fafe8e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fx_dib.h @@ -0,0 +1,697 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_FX_DIB_H_ +#define CORE_FXGE_FX_DIB_H_ + +#include +#include + +#include "core/fxcrt/cfx_shared_copy_on_write.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" + +enum FXDIB_Format { + FXDIB_Invalid = 0, + FXDIB_1bppMask = 0x101, + FXDIB_1bppRgb = 0x001, + FXDIB_1bppCmyk = 0x401, + FXDIB_8bppMask = 0x108, + FXDIB_8bppRgb = 0x008, + FXDIB_8bppRgba = 0x208, + FXDIB_8bppCmyk = 0x408, + FXDIB_8bppCmyka = 0x608, + FXDIB_Rgb = 0x018, + FXDIB_Rgba = 0x218, + FXDIB_Rgb32 = 0x020, + FXDIB_Argb = 0x220, + FXDIB_Cmyk = 0x420, + FXDIB_Cmyka = 0x620, +}; + +enum FXDIB_Channel { + FXDIB_Red = 1, + FXDIB_Green, + FXDIB_Blue, + FXDIB_Cyan, + FXDIB_Magenta, + FXDIB_Yellow, + FXDIB_Black, + FXDIB_Alpha +}; + +#define FXDIB_DOWNSAMPLE 0x04 +#define FXDIB_INTERPOL 0x20 +#define FXDIB_BICUBIC_INTERPOL 0x80 +#define FXDIB_NOSMOOTH 0x100 +#define FXDIB_BLEND_NORMAL 0 +#define FXDIB_BLEND_MULTIPLY 1 +#define FXDIB_BLEND_SCREEN 2 +#define FXDIB_BLEND_OVERLAY 3 +#define FXDIB_BLEND_DARKEN 4 +#define FXDIB_BLEND_LIGHTEN 5 + +#define FXDIB_BLEND_COLORDODGE 6 +#define FXDIB_BLEND_COLORBURN 7 +#define FXDIB_BLEND_HARDLIGHT 8 +#define FXDIB_BLEND_SOFTLIGHT 9 +#define FXDIB_BLEND_DIFFERENCE 10 +#define FXDIB_BLEND_EXCLUSION 11 +#define FXDIB_BLEND_NONSEPARABLE 21 +#define FXDIB_BLEND_HUE 21 +#define FXDIB_BLEND_SATURATION 22 +#define FXDIB_BLEND_COLOR 23 +#define FXDIB_BLEND_LUMINOSITY 24 +#define FXDIB_BLEND_UNSUPPORTED -1 +typedef uint32_t FX_ARGB; +typedef uint32_t FX_COLORREF; +typedef uint32_t FX_CMYK; +class CFX_ClipRgn; +class CFX_DIBSource; +class CFX_DIBitmap; +class CStretchEngine; + +#define FXSYS_RGB(r, g, b) ((r) | ((g) << 8) | ((b) << 16)) +#define FXSYS_GetRValue(rgb) ((rgb)&0xff) +#define FXSYS_GetGValue(rgb) (((rgb) >> 8) & 0xff) +#define FXSYS_GetBValue(rgb) (((rgb) >> 16) & 0xff) +#define FX_CCOLOR(val) (255 - (val)) +#define FXSYS_CMYK(c, m, y, k) (((c) << 24) | ((m) << 16) | ((y) << 8) | (k)) +#define FXSYS_GetCValue(cmyk) ((uint8_t)((cmyk) >> 24) & 0xff) +#define FXSYS_GetMValue(cmyk) ((uint8_t)((cmyk) >> 16) & 0xff) +#define FXSYS_GetYValue(cmyk) ((uint8_t)((cmyk) >> 8) & 0xff) +#define FXSYS_GetKValue(cmyk) ((uint8_t)(cmyk)&0xff) +void CmykDecode(FX_CMYK cmyk, int& c, int& m, int& y, int& k); +inline FX_CMYK CmykEncode(int c, int m, int y, int k) { + return (c << 24) | (m << 16) | (y << 8) | k; +} +void ArgbDecode(FX_ARGB argb, int& a, int& r, int& g, int& b); +void ArgbDecode(FX_ARGB argb, int& a, FX_COLORREF& rgb); +inline FX_ARGB ArgbEncode(int a, int r, int g, int b) { + return (a << 24) | (r << 16) | (g << 8) | b; +} +FX_ARGB ArgbEncode(int a, FX_COLORREF rgb); +#define FXARGB_A(argb) ((uint8_t)((argb) >> 24)) +#define FXARGB_R(argb) ((uint8_t)((argb) >> 16)) +#define FXARGB_G(argb) ((uint8_t)((argb) >> 8)) +#define FXARGB_B(argb) ((uint8_t)(argb)) +#define FXARGB_MAKE(a, r, g, b) \ + (((uint32_t)(a) << 24) | ((r) << 16) | ((g) << 8) | (b)) +#define FXARGB_MUL_ALPHA(argb, alpha) \ + (((((argb) >> 24) * (alpha) / 255) << 24) | ((argb)&0xffffff)) +#define FXRGB2GRAY(r, g, b) (((b)*11 + (g)*59 + (r)*30) / 100) +#define FXCMYK2GRAY(c, m, y, k) \ + (((255 - (c)) * (255 - (k)) * 30 + (255 - (m)) * (255 - (k)) * 59 + \ + (255 - (y)) * (255 - (k)) * 11) / \ + 25500) +#define FXDIB_ALPHA_MERGE(backdrop, source, source_alpha) \ + (((backdrop) * (255 - (source_alpha)) + (source) * (source_alpha)) / 255) +#define FXDIB_ALPHA_UNION(dest, src) ((dest) + (src) - (dest) * (src) / 255) +#define FXCMYK_GETDIB(p) \ + ((((uint8_t*)(p))[0] << 24 | (((uint8_t*)(p))[1] << 16) | \ + (((uint8_t*)(p))[2] << 8) | ((uint8_t*)(p))[3])) +#define FXCMYK_SETDIB(p, cmyk) ((uint8_t*)(p))[0] = (uint8_t)((cmyk) >> 24), \ + ((uint8_t*)(p))[1] = (uint8_t)((cmyk) >> 16), \ + ((uint8_t*)(p))[2] = (uint8_t)((cmyk) >> 8), \ + ((uint8_t*)(p))[3] = (uint8_t)(cmyk)) +#define FXARGB_GETDIB(p) \ + ((((uint8_t*)(p))[0]) | (((uint8_t*)(p))[1] << 8) | \ + (((uint8_t*)(p))[2] << 16) | (((uint8_t*)(p))[3] << 24)) +#define FXARGB_SETDIB(p, argb) \ + ((uint8_t*)(p))[0] = (uint8_t)(argb), \ + ((uint8_t*)(p))[1] = (uint8_t)((argb) >> 8), \ + ((uint8_t*)(p))[2] = (uint8_t)((argb) >> 16), \ + ((uint8_t*)(p))[3] = (uint8_t)((argb) >> 24) +#define FXARGB_COPY(dest, src) \ + *(uint8_t*)(dest) = *(uint8_t*)(src), \ + *((uint8_t*)(dest) + 1) = *((uint8_t*)(src) + 1), \ + *((uint8_t*)(dest) + 2) = *((uint8_t*)(src) + 2), \ + *((uint8_t*)(dest) + 3) = *((uint8_t*)(src) + 3) +#define FXCMYK_COPY(dest, src) \ + *(uint8_t*)(dest) = *(uint8_t*)(src), \ + *((uint8_t*)(dest) + 1) = *((uint8_t*)(src) + 1), \ + *((uint8_t*)(dest) + 2) = *((uint8_t*)(src) + 2), \ + *((uint8_t*)(dest) + 3) = *((uint8_t*)(src) + 3) +#define FXARGB_SETRGBORDERDIB(p, argb) \ + ((uint8_t*)(p))[3] = (uint8_t)(argb >> 24), \ + ((uint8_t*)(p))[0] = (uint8_t)((argb) >> 16), \ + ((uint8_t*)(p))[1] = (uint8_t)((argb) >> 8), \ + ((uint8_t*)(p))[2] = (uint8_t)(argb) +#define FXARGB_GETRGBORDERDIB(p) \ + (((uint8_t*)(p))[2]) | (((uint8_t*)(p))[1] << 8) | \ + (((uint8_t*)(p))[0] << 16) | (((uint8_t*)(p))[3] << 24) +#define FXARGB_RGBORDERCOPY(dest, src) \ + *((uint8_t*)(dest) + 3) = *((uint8_t*)(src) + 3), \ + *(uint8_t*)(dest) = *((uint8_t*)(src) + 2), \ + *((uint8_t*)(dest) + 1) = *((uint8_t*)(src) + 1), \ + *((uint8_t*)(dest) + 2) = *((uint8_t*)(src)) +#define FXARGB_TODIB(argb) (argb) +#define FXCMYK_TODIB(cmyk) \ + ((uint8_t)((cmyk) >> 24) | ((uint8_t)((cmyk) >> 16)) << 8 | \ + ((uint8_t)((cmyk) >> 8)) << 16 | ((uint8_t)(cmyk) << 24)) +#define FXARGB_TOBGRORDERDIB(argb) \ + ((uint8_t)(argb >> 16) | ((uint8_t)(argb >> 8)) << 8 | \ + ((uint8_t)(argb)) << 16 | ((uint8_t)(argb >> 24) << 24)) +#define FXGETFLAG_COLORTYPE(flag) (uint8_t)((flag) >> 8) +#define FXGETFLAG_ALPHA_FILL(flag) (uint8_t)(flag) + +bool ConvertBuffer(FXDIB_Format dest_format, + uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top, + std::unique_ptr* pal); + +class CFX_DIBSource { + public: + virtual ~CFX_DIBSource(); + + virtual uint8_t* GetBuffer() const; + virtual const uint8_t* GetScanline(int line) const = 0; + virtual bool SkipToScanline(int line, IFX_Pause* pPause) const; + virtual void DownSampleScanline(int line, + uint8_t* dest_scan, + int dest_bpp, + int dest_width, + bool bFlipX, + int clip_left, + int clip_width) const = 0; + + int GetWidth() const { return m_Width; } + int GetHeight() const { return m_Height; } + + FXDIB_Format GetFormat() const { + return (FXDIB_Format)(m_AlphaFlag * 0x100 + m_bpp); + } + uint32_t GetPitch() const { return m_Pitch; } + uint32_t* GetPalette() const { return m_pPalette.get(); } + int GetBPP() const { return m_bpp; } + + // TODO(thestig): Investigate this. Given the possible values of FXDIB_Format, + // it feels as though this should be implemented as !!(m_AlphaFlag & 1) and + // IsOpaqueImage() below should never be able to return true. + bool IsAlphaMask() const { return m_AlphaFlag == 1; } + bool HasAlpha() const { return !!(m_AlphaFlag & 2); } + bool IsOpaqueImage() const { return !(m_AlphaFlag & 3); } + bool IsCmykImage() const { return !!(m_AlphaFlag & 4); } + + int GetPaletteSize() const { + return IsAlphaMask() ? 0 : (m_bpp == 1 ? 2 : (m_bpp == 8 ? 256 : 0)); + } + + uint32_t GetPaletteEntry(int index) const; + + void SetPaletteEntry(int index, uint32_t color); + uint32_t GetPaletteArgb(int index) const { return GetPaletteEntry(index); } + void SetPaletteArgb(int index, uint32_t color) { + SetPaletteEntry(index, color); + } + + // Copies into internally-owned palette. + void SetPalette(const uint32_t* pSrcPal); + + std::unique_ptr Clone(const FX_RECT* pClip = nullptr) const; + std::unique_ptr CloneConvert(FXDIB_Format format) const; + std::unique_ptr StretchTo(int dest_width, + int dest_height, + uint32_t flags = 0, + const FX_RECT* pClip = nullptr) const; + std::unique_ptr TransformTo( + const CFX_Matrix* pMatrix, + int& left, + int& top, + uint32_t flags = 0, + const FX_RECT* pClip = nullptr) const; + std::unique_ptr SwapXY(bool bXFlip, + bool bYFlip, + const FX_RECT* pClip = nullptr) const; + std::unique_ptr FlipImage(bool bXFlip, bool bYFlip) const; + + std::unique_ptr CloneAlphaMask( + const FX_RECT* pClip = nullptr) const; + + // Copies into internally-owned mask. + bool SetAlphaMask(const CFX_DIBSource* pAlphaMask, + const FX_RECT* pClip = nullptr); + + + void GetOverlapRect(int& dest_left, + int& dest_top, + int& width, + int& height, + int src_width, + int src_height, + int& src_left, + int& src_top, + const CFX_ClipRgn* pClipRgn); + +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ + void DebugVerifyBitmapIsPreMultiplied(void* buffer = nullptr) const; +#endif + + CFX_DIBitmap* m_pAlphaMask; + + protected: + CFX_DIBSource(); + + void BuildPalette(); + bool BuildAlphaMask(); + int FindPalette(uint32_t color) const; + void GetPalette(uint32_t* pal, int alpha) const; + + int m_Width; + int m_Height; + int m_bpp; + uint32_t m_AlphaFlag; + uint32_t m_Pitch; + // TODO(weili): Use std::vector for this. + std::unique_ptr m_pPalette; +}; + +class CFX_DIBitmap : public CFX_DIBSource { + public: + CFX_DIBitmap(); + explicit CFX_DIBitmap(const CFX_DIBitmap& src); + ~CFX_DIBitmap() override; + + bool Create(int width, + int height, + FXDIB_Format format, + uint8_t* pBuffer = nullptr, + int pitch = 0); + + bool Copy(const CFX_DIBSource* pSrc); + + // CFX_DIBSource + uint8_t* GetBuffer() const override; + const uint8_t* GetScanline(int line) const override; + void DownSampleScanline(int line, + uint8_t* dest_scan, + int dest_bpp, + int dest_width, + bool bFlipX, + int clip_left, + int clip_width) const override; + + void TakeOver(CFX_DIBitmap* pSrcBitmap); + + bool ConvertFormat(FXDIB_Format format); + + void Clear(uint32_t color); + + uint32_t GetPixel(int x, int y) const; + + void SetPixel(int x, int y, uint32_t color); + + bool LoadChannel(FXDIB_Channel destChannel, + CFX_DIBSource* pSrcBitmap, + FXDIB_Channel srcChannel); + + bool LoadChannel(FXDIB_Channel destChannel, int value); + + bool MultiplyAlpha(int alpha); + + bool MultiplyAlpha(CFX_DIBSource* pAlphaMask); + + bool TransferBitmap(int dest_left, + int dest_top, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top); + + bool CompositeBitmap(int dest_left, + int dest_top, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top, + int blend_type = FXDIB_BLEND_NORMAL, + const CFX_ClipRgn* pClipRgn = nullptr, + bool bRgbByteOrder = false, + void* pIccTransform = nullptr); + + bool TransferMask(int dest_left, + int dest_top, + int width, + int height, + const CFX_DIBSource* pMask, + uint32_t color, + int src_left, + int src_top, + int alpha_flag = 0, + void* pIccTransform = nullptr); + + bool CompositeMask(int dest_left, + int dest_top, + int width, + int height, + const CFX_DIBSource* pMask, + uint32_t color, + int src_left, + int src_top, + int blend_type = FXDIB_BLEND_NORMAL, + const CFX_ClipRgn* pClipRgn = nullptr, + bool bRgbByteOrder = false, + int alpha_flag = 0, + void* pIccTransform = nullptr); + + bool CompositeRect(int dest_left, + int dest_top, + int width, + int height, + uint32_t color, + int alpha_flag = 0, + void* pIccTransform = nullptr); + + bool ConvertColorScale(uint32_t forecolor, uint32_t backcolor); + +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ + void PreMultiply(); +#endif +#if defined _SKIA_SUPPORT_PATHS_ + void UnPreMultiply(); +#endif + + protected: + bool GetGrayData(void* pIccTransform = nullptr); + +#if defined _SKIA_SUPPORT_PATHS_ + enum class Format { kCleared, kPreMultiplied, kUnPreMultiplied }; +#endif + + uint8_t* m_pBuffer; +#if defined _SKIA_SUPPORT_PATHS_ + Format m_nFormat; +#endif + bool m_bExtBuf; +}; + +class CFX_DIBExtractor { + public: + explicit CFX_DIBExtractor(const CFX_DIBSource* pSrc); + ~CFX_DIBExtractor(); + + CFX_DIBitmap* GetBitmap() { return m_pBitmap.get(); } + + private: + std::unique_ptr m_pBitmap; +}; + +typedef CFX_SharedCopyOnWrite CFX_DIBitmapRef; + +class CFX_FilteredDIB : public CFX_DIBSource { + public: + CFX_FilteredDIB(); + ~CFX_FilteredDIB() override; + + void LoadSrc(const CFX_DIBSource* pSrc, bool bAutoDropSrc = false); + + virtual FXDIB_Format GetDestFormat() = 0; + + virtual uint32_t* GetDestPalette() = 0; + + virtual void TranslateScanline(const uint8_t* src_buf, + std::vector* dest_buf) const = 0; + + virtual void TranslateDownSamples(uint8_t* dest_buf, + const uint8_t* src_buf, + int pixels, + int Bpp) const = 0; + + protected: + // CFX_DIBSource + const uint8_t* GetScanline(int line) const override; + void DownSampleScanline(int line, + uint8_t* dest_scan, + int dest_bpp, + int dest_width, + bool bFlipX, + int clip_left, + int clip_width) const override; + + const CFX_DIBSource* m_pSrc; + bool m_bAutoDropSrc; + mutable std::vector m_Scanline; +}; + +class IFX_ScanlineComposer { + public: + virtual ~IFX_ScanlineComposer() {} + + virtual void ComposeScanline(int line, + const uint8_t* scanline, + const uint8_t* scan_extra_alpha = nullptr) = 0; + + virtual bool SetInfo(int width, + int height, + FXDIB_Format src_format, + uint32_t* pSrcPalette) = 0; +}; + +class CFX_ScanlineCompositor { + public: + CFX_ScanlineCompositor(); + + ~CFX_ScanlineCompositor(); + + bool Init(FXDIB_Format dest_format, + FXDIB_Format src_format, + int32_t width, + uint32_t* pSrcPalette, + uint32_t mask_color, + int blend_type, + bool bClip, + bool bRgbByteOrder = false, + int alpha_flag = 0, + void* pIccTransform = nullptr); + + void CompositeRgbBitmapLine(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + const uint8_t* clip_scan, + const uint8_t* src_extra_alpha = nullptr, + uint8_t* dst_extra_alpha = nullptr); + + void CompositePalBitmapLine(uint8_t* dest_scan, + const uint8_t* src_scan, + int src_left, + int width, + const uint8_t* clip_scan, + const uint8_t* src_extra_alpha = nullptr, + uint8_t* dst_extra_alpha = nullptr); + + void CompositeByteMaskLine(uint8_t* dest_scan, + const uint8_t* src_scan, + int width, + const uint8_t* clip_scan, + uint8_t* dst_extra_alpha = nullptr); + + void CompositeBitMaskLine(uint8_t* dest_scan, + const uint8_t* src_scan, + int src_left, + int width, + const uint8_t* clip_scan, + uint8_t* dst_extra_alpha = nullptr); + + protected: + int m_Transparency; + FXDIB_Format m_SrcFormat, m_DestFormat; + uint32_t* m_pSrcPalette; + + int m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, m_MaskBlack; + int m_BlendType; + void* m_pIccTransform; + uint8_t* m_pCacheScanline; + int m_CacheSize; + bool m_bRgbByteOrder; +}; + +class CFX_BitmapComposer : public IFX_ScanlineComposer { + public: + CFX_BitmapComposer(); + ~CFX_BitmapComposer() override; + + void Compose(CFX_DIBitmap* pDest, + const CFX_ClipRgn* pClipRgn, + int bitmap_alpha, + uint32_t mask_color, + FX_RECT& dest_rect, + bool bVertical, + bool bFlipX, + bool bFlipY, + bool bRgbByteOrder = false, + int alpha_flag = 0, + void* pIccTransform = nullptr, + int blend_type = FXDIB_BLEND_NORMAL); + + // IFX_ScanlineComposer + bool SetInfo(int width, + int height, + FXDIB_Format src_format, + uint32_t* pSrcPalette) override; + + void ComposeScanline(int line, + const uint8_t* scanline, + const uint8_t* scan_extra_alpha) override; + + protected: + void DoCompose(uint8_t* dest_scan, + const uint8_t* src_scan, + int dest_width, + const uint8_t* clip_scan, + const uint8_t* src_extra_alpha = nullptr, + uint8_t* dst_extra_alpha = nullptr); + CFX_DIBitmap* m_pBitmap; + const CFX_ClipRgn* m_pClipRgn; + FXDIB_Format m_SrcFormat; + int m_DestLeft, m_DestTop, m_DestWidth, m_DestHeight, m_BitmapAlpha; + uint32_t m_MaskColor; + const CFX_DIBitmap* m_pClipMask; + CFX_ScanlineCompositor m_Compositor; + bool m_bVertical, m_bFlipX, m_bFlipY; + int m_AlphaFlag; + void* m_pIccTransform; + bool m_bRgbByteOrder; + int m_BlendType; + void ComposeScanlineV(int line, + const uint8_t* scanline, + const uint8_t* scan_extra_alpha = nullptr); + uint8_t* m_pScanlineV; + uint8_t* m_pClipScanV; + uint8_t* m_pAddClipScan; + uint8_t* m_pScanlineAlphaV; +}; + +class CFX_BitmapStorer : public IFX_ScanlineComposer { + public: + CFX_BitmapStorer(); + ~CFX_BitmapStorer() override; + + // IFX_ScanlineComposer + void ComposeScanline(int line, + const uint8_t* scanline, + const uint8_t* scan_extra_alpha) override; + bool SetInfo(int width, + int height, + FXDIB_Format src_format, + uint32_t* pSrcPalette) override; + + CFX_DIBitmap* GetBitmap() { return m_pBitmap.get(); } + std::unique_ptr Detach(); + void Replace(std::unique_ptr pBitmap); + + private: + std::unique_ptr m_pBitmap; +}; + +class CFX_ImageStretcher { + public: + CFX_ImageStretcher(IFX_ScanlineComposer* pDest, + const CFX_DIBSource* pSource, + int dest_width, + int dest_height, + const FX_RECT& bitmap_rect, + uint32_t flags); + ~CFX_ImageStretcher(); + + bool Start(); + bool Continue(IFX_Pause* pPause); + + const CFX_DIBSource* source() { return m_pSource; } + + private: + bool StartQuickStretch(); + bool StartStretch(); + bool ContinueQuickStretch(IFX_Pause* pPause); + bool ContinueStretch(IFX_Pause* pPause); + + IFX_ScanlineComposer* const m_pDest; + const CFX_DIBSource* const m_pSource; + std::unique_ptr m_pStretchEngine; + std::unique_ptr m_pScanline; + std::unique_ptr m_pMaskScanline; + const uint32_t m_Flags; + bool m_bFlipX; + bool m_bFlipY; + int m_DestWidth; + int m_DestHeight; + FX_RECT m_ClipRect; + const FXDIB_Format m_DestFormat; + const int m_DestBPP; + int m_LineIndex; +}; + +class CFX_ImageTransformer { + public: + CFX_ImageTransformer(const CFX_DIBSource* pSrc, + const CFX_Matrix* pMatrix, + int flags, + const FX_RECT* pClip); + ~CFX_ImageTransformer(); + + bool Start(); + bool Continue(IFX_Pause* pPause); + + const FX_RECT& result() const { return m_result; } + std::unique_ptr DetachBitmap(); + + private: + const CFX_DIBSource* const m_pSrc; + const CFX_Matrix* const m_pMatrix; + const FX_RECT* const m_pClip; + FX_RECT m_StretchClip; + FX_RECT m_result; + CFX_Matrix m_dest2stretch; + std::unique_ptr m_Stretcher; + CFX_BitmapStorer m_Storer; + const uint32_t m_Flags; + int m_Status; +}; + +class CFX_ImageRenderer { + public: + CFX_ImageRenderer(); + ~CFX_ImageRenderer(); + + bool Start(CFX_DIBitmap* pDevice, + const CFX_ClipRgn* pClipRgn, + const CFX_DIBSource* pSource, + int bitmap_alpha, + uint32_t mask_color, + const CFX_Matrix* pMatrix, + uint32_t dib_flags, + bool bRgbByteOrder = false, + int alpha_flag = 0, + void* pIccTransform = nullptr, + int blend_type = FXDIB_BLEND_NORMAL); + + bool Continue(IFX_Pause* pPause); + + protected: + CFX_DIBitmap* m_pDevice; + const CFX_ClipRgn* m_pClipRgn; + int m_BitmapAlpha; + uint32_t m_MaskColor; + CFX_Matrix m_Matrix; + std::unique_ptr m_pTransformer; + std::unique_ptr m_Stretcher; + CFX_BitmapComposer m_Composer; + int m_Status; + FX_RECT m_ClipBox; + uint32_t m_Flags; + int m_AlphaFlag; + void* m_pIccTransform; + bool m_bRgbByteOrder; + int m_BlendType; +}; + +#endif // CORE_FXGE_FX_DIB_H_ diff --git a/modules/pdfium/pdfium/core/fxge/fx_font.h b/modules/pdfium/pdfium/core/fxge/fx_font.h new file mode 100644 index 000000000000..07392fa07f3d --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fx_font.h @@ -0,0 +1,252 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_FX_FONT_H_ +#define CORE_FXGE_FX_FONT_H_ + +#include +#include +#include + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/cfx_substfont.h" +#include "core/fxge/fx_dib.h" +#include "core/fxge/fx_freetype.h" + +typedef struct FT_FaceRec_* FXFT_Face; +typedef void* FXFT_Library; + +class CFX_FaceCache; +class CFX_GlyphBitmap; +class CFX_PathData; +class CFX_SizeGlyphCache; + +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ +class SkTypeface; + +using CFX_TypeFace = SkTypeface; +#endif + +/* Character sets for the font */ +#define FXFONT_ANSI_CHARSET 0 +#define FXFONT_DEFAULT_CHARSET 1 +#define FXFONT_SYMBOL_CHARSET 2 +#define FXFONT_SHIFTJIS_CHARSET 128 +#define FXFONT_HANGUL_CHARSET 129 +#define FXFONT_GB2312_CHARSET 134 +#define FXFONT_CHINESEBIG5_CHARSET 136 +#define FXFONT_THAI_CHARSET 222 +#define FXFONT_EASTEUROPE_CHARSET 238 +#define FXFONT_RUSSIAN_CHARSET 204 +#define FXFONT_GREEK_CHARSET 161 +#define FXFONT_TURKISH_CHARSET 162 +#define FXFONT_HEBREW_CHARSET 177 +#define FXFONT_ARABIC_CHARSET 178 +#define FXFONT_BALTIC_CHARSET 186 +#define FXFONT_JOHAB_CHARSET 130 +#define FXFONT_VIETNAMESE_CHARSET 163 + +/* Font pitch and family flags */ +#define FXFONT_FF_FIXEDPITCH 1 +#define FXFONT_FF_ROMAN (1 << 4) +#define FXFONT_FF_SCRIPT (4 << 4) + +/* Typical weight values */ +#define FXFONT_FW_NORMAL 400 +#define FXFONT_FW_BOLD 700 + +/* Font styles as defined in PDF 1.7 Table 5.20 */ +#define FXFONT_FIXED_PITCH (1 << 0) +#define FXFONT_SERIF (1 << 1) +#define FXFONT_SYMBOLIC (1 << 2) +#define FXFONT_SCRIPT (1 << 3) +#define FXFONT_NONSYMBOLIC (1 << 5) +#define FXFONT_ITALIC (1 << 6) +#define FXFONT_ALLCAP (1 << 16) +#define FXFONT_SMALLCAP (1 << 17) +#define FXFONT_BOLD (1 << 18) + +/* Other font flags */ +#define FXFONT_USEEXTERNATTR 0x80000 +#define FXFONT_CIDFONT 0x100000 +#ifdef PDF_ENABLE_XFA +#define FXFONT_EXACTMATCH 0x80000000 +#endif // PDF_ENABLE_XFA + +#define CHARSET_FLAG_ANSI 1 +#define CHARSET_FLAG_SYMBOL 2 +#define CHARSET_FLAG_SHIFTJIS 4 +#define CHARSET_FLAG_BIG5 8 +#define CHARSET_FLAG_GB 16 +#define CHARSET_FLAG_KOREAN 32 + +#define GET_TT_SHORT(w) (uint16_t)(((w)[0] << 8) | (w)[1]) +#define GET_TT_LONG(w) \ + (uint32_t)(((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3]) + +// Sets the given transform on the font, and resets it to the identity when it +// goes out of scope. +class ScopedFontTransform { + public: + ScopedFontTransform(FT_Face face, FXFT_Matrix* matrix); + ~ScopedFontTransform(); + + private: + FT_Face m_Face; +}; + +class CFX_Font { + public: + CFX_Font(); + ~CFX_Font(); + + void LoadSubst(const CFX_ByteString& face_name, + bool bTrueType, + uint32_t flags, + int weight, + int italic_angle, + int CharsetCP, + bool bVertical); + + bool LoadEmbedded(const uint8_t* data, uint32_t size); + FXFT_Face GetFace() const { return m_Face; } + CFX_SubstFont* GetSubstFont() const { return m_pSubstFont.get(); } + +#ifdef PDF_ENABLE_XFA + bool LoadFile(const CFX_RetainPtr& pFile, + int nFaceIndex = 0, + int* pFaceCount = nullptr); + + bool LoadClone(const CFX_Font* pFont); + void SetFace(FXFT_Face face); + void SetSubstFont(std::unique_ptr subst) { + m_pSubstFont = std::move(subst); + } +#endif // PDF_ENABLE_XFA + + const CFX_GlyphBitmap* LoadGlyphBitmap(uint32_t glyph_index, + bool bFontStyle, + const CFX_Matrix* pMatrix, + int dest_width, + int anti_alias, + int& text_flags) const; + const CFX_PathData* LoadGlyphPath(uint32_t glyph_index, int dest_width) const; + +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ + CFX_TypeFace* GetDeviceCache() const; +#endif + + int GetGlyphWidth(uint32_t glyph_index); + int GetAscent() const; + int GetDescent() const; + bool GetGlyphBBox(uint32_t glyph_index, FX_RECT& bbox); + bool IsItalic() const; + bool IsBold() const; + bool IsFixedWidth() const; + bool IsVertical() const { return m_bVertical; } + CFX_ByteString GetPsName() const; + CFX_ByteString GetFamilyName() const; + CFX_ByteString GetFaceName() const; + bool IsTTFont() const; + bool GetBBox(FX_RECT& bbox); + int GetHeight() const; + int GetULPos() const; + int GetULthickness() const; + int GetMaxAdvanceWidth() const; + bool IsEmbedded() const { return m_bEmbedded; } + uint8_t* GetSubData() const { return m_pGsubData; } + void SetSubData(uint8_t* data) { m_pGsubData = data; } +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + void* GetPlatformFont() const { return m_pPlatformFont; } + void SetPlatformFont(void* font) { m_pPlatformFont = font; } +#endif + uint8_t* GetFontData() const { return m_pFontData; } + uint32_t GetSize() const { return m_dwSize; } + void AdjustMMParams(int glyph_index, int width, int weight) const; + + static const size_t kAngleSkewArraySize = 30; + static const char s_AngleSkew[kAngleSkewArraySize]; + static const size_t kWeightPowArraySize = 100; + static const uint8_t s_WeightPow[kWeightPowArraySize]; + static const uint8_t s_WeightPow_11[kWeightPowArraySize]; + static const uint8_t s_WeightPow_SHIFTJIS[kWeightPowArraySize]; + +#ifdef PDF_ENABLE_XFA + protected: + bool m_bShallowCopy; + FXFT_StreamRec* m_pOwnedStream; +#endif // PDF_ENABLE_XFA + + private: + friend class CFX_FaceCache; + CFX_PathData* LoadGlyphPathImpl(uint32_t glyph_index, + int dest_width = 0) const; + CFX_FaceCache* GetFaceCache() const; + void ReleasePlatformResource(); + void DeleteFace(); + void ClearFaceCache(); + + FXFT_Face m_Face; + mutable CFX_FaceCache* m_FaceCache; // not owned. + std::unique_ptr m_pSubstFont; + std::vector m_pFontDataAllocation; + uint8_t* m_pFontData; + uint8_t* m_pGsubData; + uint32_t m_dwSize; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + void* m_pPlatformFont; +#endif + bool m_bEmbedded; + bool m_bVertical; +}; + +class CFX_FontFaceInfo { + public: + CFX_FontFaceInfo(CFX_ByteString filePath, + CFX_ByteString faceName, + CFX_ByteString fontTables, + uint32_t fontOffset, + uint32_t fileSize); + + const CFX_ByteString m_FilePath; + const CFX_ByteString m_FaceName; + const CFX_ByteString m_FontTables; + const uint32_t m_FontOffset; + const uint32_t m_FileSize; + uint32_t m_Styles; + uint32_t m_Charsets; +}; + +class CFX_GlyphBitmap { + public: + int m_Top; + int m_Left; + CFX_DIBitmap m_Bitmap; +}; + +class FXTEXT_GLYPHPOS { + public: + FXTEXT_GLYPHPOS(); + FXTEXT_GLYPHPOS(const FXTEXT_GLYPHPOS&); + ~FXTEXT_GLYPHPOS(); + + const CFX_GlyphBitmap* m_pGlyph; + CFX_Point m_Origin; + CFX_PointF m_fOrigin; +}; + +FX_RECT FXGE_GetGlyphsBBox(const std::vector& glyphs, + int anti_alias, + FX_FLOAT retinaScaleX = 1.0f, + FX_FLOAT retinaScaleY = 1.0f); + +CFX_ByteString GetNameFromTT(const uint8_t* name_table, + uint32_t name_table_size, + uint32_t name); + +int PDF_GetStandardFontName(CFX_ByteString* name); + +#endif // CORE_FXGE_FX_FONT_H_ diff --git a/modules/pdfium/pdfium/core/fxge/fx_freetype.h b/modules/pdfium/pdfium/core/fxge/fx_freetype.h new file mode 100644 index 000000000000..8ead6b755cc4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/fx_freetype.h @@ -0,0 +1,180 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_FX_FREETYPE_H_ +#define CORE_FXGE_FX_FREETYPE_H_ + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include FT_LCD_FILTER_H +#include FT_MULTIPLE_MASTERS_H +#include FT_OUTLINE_H +#include FT_TRUETYPE_TABLES_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define FXFT_ENCODING_UNICODE FT_ENCODING_UNICODE +#define FXFT_ENCODING_ADOBE_STANDARD FT_ENCODING_ADOBE_STANDARD +#define FXFT_ENCODING_ADOBE_EXPERT FT_ENCODING_ADOBE_EXPERT +#define FXFT_ENCODING_ADOBE_LATIN_1 FT_ENCODING_ADOBE_LATIN_1 +#define FXFT_ENCODING_APPLE_ROMAN FT_ENCODING_APPLE_ROMAN +#define FXFT_ENCODING_ADOBE_CUSTOM FT_ENCODING_ADOBE_CUSTOM +#define FXFT_ENCODING_MS_SYMBOL FT_ENCODING_MS_SYMBOL +#define FXFT_ENCODING_GB2312 FT_ENCODING_GB2312 +#define FXFT_ENCODING_BIG5 FT_ENCODING_BIG5 +#define FXFT_ENCODING_SJIS FT_ENCODING_SJIS +#define FXFT_ENCODING_JOHAB FT_ENCODING_JOHAB +#define FXFT_ENCODING_WANSUNG FT_ENCODING_WANSUNG +#define FXFT_LOAD_NO_SCALE FT_LOAD_NO_SCALE +#define FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH \ + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH +#define FXFT_RENDER_MODE_LCD FT_RENDER_MODE_LCD +#define FXFT_RENDER_MODE_MONO FT_RENDER_MODE_MONO +#define FXFT_RENDER_MODE_NORMAL FT_RENDER_MODE_NORMAL +#define FXFT_LOAD_IGNORE_TRANSFORM FT_LOAD_IGNORE_TRANSFORM +#define FXFT_LOAD_NO_BITMAP FT_LOAD_NO_BITMAP +#define FXFT_LOAD_NO_HINTING FT_LOAD_NO_HINTING +#define FXFT_PIXEL_MODE_MONO FT_PIXEL_MODE_MONO +#define FXFT_STYLE_FLAG_ITALIC FT_STYLE_FLAG_ITALIC +#define FXFT_STYLE_FLAG_BOLD FT_STYLE_FLAG_BOLD +#define FXFT_FACE_FLAG_SFNT FT_FACE_FLAG_SFNT +#define FXFT_FACE_FLAG_TRICKY (1L << 13) +typedef FT_MM_Var* FXFT_MM_Var; +typedef FT_Bitmap* FXFT_Bitmap; +#define FXFT_Matrix FT_Matrix +#define FXFT_Vector FT_Vector +#define FXFT_Outline_Funcs FT_Outline_Funcs +typedef FT_Open_Args FXFT_Open_Args; +typedef FT_StreamRec FXFT_StreamRec; +typedef FT_StreamRec* FXFT_Stream; +typedef FT_BBox FXFT_BBox; +typedef FT_Glyph FXFT_Glyph; +typedef FT_CharMap FXFT_CharMap; +#define FXFT_GLYPH_BBOX_PIXELS FT_GLYPH_BBOX_PIXELS +#define FXFT_Open_Face(library, args, index, face) \ + FT_Open_Face((FT_Library)(library), args, index, (FT_Face*)(face)) +#define FXFT_Done_Face(face) FT_Done_Face((FT_Face)(face)) +#define FXFT_Done_FreeType(library) FT_Done_FreeType((FT_Library)(library)) +#define FXFT_Init_FreeType(library) FT_Init_FreeType((FT_Library*)(library)) +#define FXFT_New_Memory_Face(library, base, size, index, face) \ + FT_New_Memory_Face((FT_Library)(library), base, size, index, (FT_Face*)(face)) +#define FXFT_New_Face(library, filename, index, face) \ + FT_New_Face((FT_Library)(library), filename, index, (FT_Face*)(face)) +#define FXFT_Get_Face_FreeType(face) ((FT_Face)face)->driver->root.library +#define FXFT_Select_Charmap(face, encoding) \ + FT_Select_Charmap((FT_Face)face, (FT_Encoding)encoding) +#define FXFT_Set_Charmap(face, charmap) \ + FT_Set_Charmap((FT_Face)face, (FT_CharMap)charmap) +#define FXFT_Load_Glyph(face, glyph_index, flags) \ + FT_Load_Glyph((FT_Face)face, glyph_index, flags) +#define FXFT_Get_Char_Index(face, code) FT_Get_Char_Index((FT_Face)face, code) +#define FXFT_Get_Glyph_Name(face, index, buffer, size) \ + FT_Get_Glyph_Name((FT_Face)face, index, buffer, size) +#define FXFT_Get_Name_Index(face, name) FT_Get_Name_Index((FT_Face)face, name) +#define FXFT_Has_Glyph_Names(face) \ + (((FT_Face)face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES) +#define FXFT_Get_Postscript_Name(face) FT_Get_Postscript_Name((FT_Face)face) +#define FXFT_Load_Sfnt_Table(face, tag, offset, buffer, length) \ + FT_Load_Sfnt_Table((FT_Face)face, tag, offset, buffer, length) +#define FXFT_Get_First_Char(face, glyph_index) \ + FT_Get_First_Char((FT_Face)face, glyph_index) +#define FXFT_Get_Next_Char(face, code, glyph_index) \ + FT_Get_Next_Char((FT_Face)face, code, glyph_index) +#define FXFT_Clear_Face_External_Stream(face) \ + (((FT_Face)face)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM) +#define FXFT_Get_Face_External_Stream(face) \ + (((FT_Face)face)->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM) +#define FXFT_Is_Face_TT_OT(face) \ + (((FT_Face)face)->face_flags & FT_FACE_FLAG_SFNT) +#define FXFT_Is_Face_Tricky(face) \ + (((FT_Face)face)->face_flags & FXFT_FACE_FLAG_TRICKY) +#define FXFT_Is_Face_fixedwidth(face) \ + (((FT_Face)face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH) +#define FXFT_Get_Face_Stream_Base(face) ((FT_Face)face)->stream->base +#define FXFT_Get_Face_Stream_Size(face) ((FT_Face)face)->stream->size +#define FXFT_Get_Face_Family_Name(face) ((FT_Face)face)->family_name +#define FXFT_Get_Face_Style_Name(face) ((FT_Face)face)->style_name +#define FXFT_Get_Face_Numfaces(face) ((FT_Face)face)->num_faces +#define FXFT_Get_Face_Faceindex(face) ((FT_Face)face)->face_index +#define FXFT_Is_Face_Italic(face) \ + (((FT_Face)face)->style_flags & FT_STYLE_FLAG_ITALIC) +#define FXFT_Is_Face_Bold(face) \ + (((FT_Face)face)->style_flags & FT_STYLE_FLAG_BOLD) +#define FXFT_Get_Face_Charmaps(face) ((FT_Face)face)->charmaps +#define FXFT_Get_Glyph_HoriBearingX(face) \ + ((FT_Face)face)->glyph->metrics.horiBearingX +#define FXFT_Get_Glyph_HoriBearingY(face) \ + ((FT_Face)face)->glyph->metrics.horiBearingY +#define FXFT_Get_Glyph_Width(face) ((FT_Face)face)->glyph->metrics.width +#define FXFT_Get_Glyph_Height(face) ((FT_Face)face)->glyph->metrics.height +#define FXFT_Get_Face_CharmapCount(face) ((FT_Face)face)->num_charmaps +#define FXFT_Get_Charmap_Encoding(charmap) ((FT_CharMap)charmap)->encoding +#define FXFT_Get_Face_Charmap(face) ((FT_Face)face)->charmap +#define FXFT_Get_Charmap_PlatformID(charmap) ((FT_CharMap)charmap)->platform_id +#define FXFT_Get_Charmap_EncodingID(charmap) ((FT_CharMap)charmap)->encoding_id +#define FXFT_Get_Face_UnitsPerEM(face) ((FT_Face)face)->units_per_EM +#define FXFT_Get_Face_xMin(face) ((FT_Face)face)->bbox.xMin +#define FXFT_Get_Face_xMax(face) ((FT_Face)face)->bbox.xMax +#define FXFT_Get_Face_yMin(face) ((FT_Face)face)->bbox.yMin +#define FXFT_Get_Face_yMax(face) ((FT_Face)face)->bbox.yMax +#define FXFT_Get_Face_Height(face) ((FT_Face)face)->height +#define FXFT_Get_Face_UnderLineThickness(face) \ + ((FT_Face)face)->underline_thickness +#define FXFT_Get_Face_UnderLinePosition(face) \ + ((FT_Face)face)->underline_position +#define FXFT_Get_Face_MaxAdvanceWidth(face) ((FT_Face)face)->max_advance_width +#define FXFT_Get_Face_Ascender(face) ((FT_Face)face)->ascender +#define FXFT_Get_Face_Descender(face) ((FT_Face)face)->descender +#define FXFT_Get_Glyph_HoriAdvance(face) \ + ((FT_Face)face)->glyph->metrics.horiAdvance +#define FXFT_Get_MM_Axis(var, index) &static_cast(var)->axis[index] +#define FXFT_Get_MM_Axis_Min(axis) ((FT_Var_Axis*)axis)->minimum +#define FXFT_Get_MM_Axis_Max(axis) ((FT_Var_Axis*)axis)->maximum +#define FXFT_Get_MM_Axis_Def(axis) ((FT_Var_Axis*)axis)->def +#define FXFT_Alloc(library, size) \ + ((FT_Library)library)->memory->alloc(((FT_Library)library)->memory, size) +#define FXFT_Free(face, p) \ + ((FT_Face)face)->memory->free(((FT_Face)face)->memory, p) +#define FXFT_Get_Glyph_Outline(face) &static_cast(face)->glyph->outline +#define FXFT_Get_Outline_Bbox(outline, cbox) FT_Outline_Get_CBox(outline, cbox) +#define FXFT_Render_Glyph(face, mode) \ + FT_Render_Glyph(((FT_Face)face)->glyph, (enum FT_Render_Mode_)mode) +#define FXFT_Get_MM_Var(face, p) FT_Get_MM_Var((FT_Face)face, p) +#define FXFT_Set_MM_Design_Coordinates(face, n, p) \ + FT_Set_MM_Design_Coordinates((FT_Face)face, n, p) +#define FXFT_Set_Pixel_Sizes(face, w, h) FT_Set_Pixel_Sizes((FT_Face)face, w, h) +#define FXFT_Set_Transform(face, m, d) FT_Set_Transform((FT_Face)face, m, d) +#define FXFT_Outline_Embolden(outline, s) FT_Outline_Embolden(outline, s) +#define FXFT_Get_Glyph_Bitmap(face) &static_cast(face)->glyph->bitmap +#define FXFT_Get_Bitmap_Width(bitmap) ((FT_Bitmap*)bitmap)->width +#define FXFT_Get_Bitmap_Rows(bitmap) ((FT_Bitmap*)bitmap)->rows +#define FXFT_Get_Bitmap_PixelMode(bitmap) ((FT_Bitmap*)bitmap)->pixel_mode +#define FXFT_Get_Bitmap_Pitch(bitmap) ((FT_Bitmap*)bitmap)->pitch +#define FXFT_Get_Bitmap_Buffer(bitmap) ((FT_Bitmap*)bitmap)->buffer +#define FXFT_Get_Glyph_BitmapLeft(face) ((FT_Face)face)->glyph->bitmap_left +#define FXFT_Get_Glyph_BitmapTop(face) ((FT_Face)face)->glyph->bitmap_top +#define FXFT_Outline_Decompose(outline, funcs, params) \ + FT_Outline_Decompose(outline, funcs, params) +#define FXFT_Set_Char_Size(face, char_width, char_height, horz_resolution, \ + vert_resolution) \ + FT_Set_Char_Size(face, char_width, char_height, horz_resolution, \ + vert_resolution) +#define FXFT_Get_Glyph(slot, aglyph) FT_Get_Glyph(slot, aglyph) +#define FXFT_Glyph_Get_CBox(glyph, bbox_mode, acbox) \ + FT_Glyph_Get_CBox(glyph, bbox_mode, acbox) +#define FXFT_Done_Glyph(glyph) FT_Done_Glyph(glyph) +#define FXFT_Library_SetLcdFilter(library, filter) \ + FT_Library_SetLcdFilter((FT_Library)(library), filter) +int FXFT_unicode_from_adobe_name(const char* glyph_name); +void FXFT_adobe_name_from_unicode(char* name, wchar_t unicode); +#ifdef __cplusplus +}; +#endif + +#endif // CORE_FXGE_FX_FREETYPE_H_ diff --git a/modules/pdfium/pdfium/core/fxge/ge/DEPS b/modules/pdfium/pdfium/core/fxge/ge/DEPS new file mode 100644 index 000000000000..6492756b7ef4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + '+third_party/skia/include' +] diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_cliprgn.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_cliprgn.cpp new file mode 100644 index 000000000000..ea3eb51f1823 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_cliprgn.cpp @@ -0,0 +1,103 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/ge/cfx_cliprgn.h" + +CFX_ClipRgn::CFX_ClipRgn(int width, int height) + : m_Type(RectI), m_Box(0, 0, width, height) {} + +CFX_ClipRgn::CFX_ClipRgn(const CFX_ClipRgn& src) { + m_Type = src.m_Type; + m_Box = src.m_Box; + m_Mask = src.m_Mask; +} + +CFX_ClipRgn::~CFX_ClipRgn() {} + +void CFX_ClipRgn::Reset(const FX_RECT& rect) { + m_Type = RectI; + m_Box = rect; + m_Mask.SetNull(); +} + +void CFX_ClipRgn::IntersectRect(const FX_RECT& rect) { + if (m_Type == RectI) { + m_Box.Intersect(rect); + return; + } + if (m_Type == MaskF) { + IntersectMaskRect(rect, m_Box, m_Mask); + return; + } +} + +void CFX_ClipRgn::IntersectMaskRect(FX_RECT rect, + FX_RECT mask_rect, + CFX_DIBitmapRef Mask) { + const CFX_DIBitmap* mask_dib = Mask.GetObject(); + m_Type = MaskF; + m_Box = rect; + m_Box.Intersect(mask_rect); + if (m_Box.IsEmpty()) { + m_Type = RectI; + return; + } + if (m_Box == mask_rect) { + m_Mask = Mask; + return; + } + CFX_DIBitmap* new_dib = m_Mask.Emplace(); + new_dib->Create(m_Box.Width(), m_Box.Height(), FXDIB_8bppMask); + for (int row = m_Box.top; row < m_Box.bottom; row++) { + uint8_t* dest_scan = + new_dib->GetBuffer() + new_dib->GetPitch() * (row - m_Box.top); + uint8_t* src_scan = + mask_dib->GetBuffer() + mask_dib->GetPitch() * (row - mask_rect.top); + for (int col = m_Box.left; col < m_Box.right; col++) + dest_scan[col - m_Box.left] = src_scan[col - mask_rect.left]; + } +} + +void CFX_ClipRgn::IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask) { + const CFX_DIBitmap* mask_dib = Mask.GetObject(); + ASSERT(mask_dib->GetFormat() == FXDIB_8bppMask); + FX_RECT mask_box(left, top, left + mask_dib->GetWidth(), + top + mask_dib->GetHeight()); + if (m_Type == RectI) { + IntersectMaskRect(m_Box, mask_box, Mask); + return; + } + if (m_Type == MaskF) { + FX_RECT new_box = m_Box; + new_box.Intersect(mask_box); + if (new_box.IsEmpty()) { + m_Type = RectI; + m_Mask.SetNull(); + m_Box = new_box; + return; + } + CFX_DIBitmapRef new_mask; + CFX_DIBitmap* new_dib = new_mask.Emplace(); + new_dib->Create(new_box.Width(), new_box.Height(), FXDIB_8bppMask); + const CFX_DIBitmap* old_dib = m_Mask.GetObject(); + for (int row = new_box.top; row < new_box.bottom; row++) { + uint8_t* old_scan = + old_dib->GetBuffer() + (row - m_Box.top) * old_dib->GetPitch(); + uint8_t* mask_scan = + mask_dib->GetBuffer() + (row - top) * mask_dib->GetPitch(); + uint8_t* new_scan = + new_dib->GetBuffer() + (row - new_box.top) * new_dib->GetPitch(); + for (int col = new_box.left; col < new_box.right; col++) { + new_scan[col - new_box.left] = + old_scan[col - m_Box.left] * mask_scan[col - left] / 255; + } + } + m_Box = new_box; + m_Mask = new_mask; + return; + } + ASSERT(false); +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_cliprgn.h b/modules/pdfium/pdfium/core/fxge/ge/cfx_cliprgn.h new file mode 100644 index 000000000000..f3fd5856b6e7 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_cliprgn.h @@ -0,0 +1,36 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_GE_CFX_CLIPRGN_H_ +#define CORE_FXGE_GE_CFX_CLIPRGN_H_ + +#include "core/fxge/fx_dib.h" + +class CFX_ClipRgn { + public: + enum ClipType { RectI, MaskF }; + + CFX_ClipRgn(int device_width, int device_height); + CFX_ClipRgn(const CFX_ClipRgn& src); + ~CFX_ClipRgn(); + + ClipType GetType() const { return m_Type; } + const FX_RECT& GetBox() const { return m_Box; } + CFX_DIBitmapRef GetMask() const { return m_Mask; } + + void Reset(const FX_RECT& rect); + void IntersectRect(const FX_RECT& rect); + void IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask); + + private: + void IntersectMaskRect(FX_RECT rect, FX_RECT mask_box, CFX_DIBitmapRef Mask); + + ClipType m_Type; + FX_RECT m_Box; + CFX_DIBitmapRef m_Mask; +}; + +#endif // CORE_FXGE_GE_CFX_CLIPRGN_H_ diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_facecache.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_facecache.cpp new file mode 100644 index 000000000000..314c95b8b201 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_facecache.cpp @@ -0,0 +1,394 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/cfx_facecache.h" + +#include +#include +#include + +#include "core/fxge/cfx_fontmgr.h" +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_substfont.h" +#include "core/fxge/fx_freetype.h" +#include "core/fxge/ge/fx_text_int.h" +#include "third_party/base/numerics/safe_math.h" + +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ +#include "third_party/skia/include/core/SkStream.h" +#include "third_party/skia/include/core/SkTypeface.h" +#endif + +namespace { + +constexpr uint32_t kInvalidGlyphIndex = static_cast(-1); + +void GammaAdjust(uint8_t* pData, + int nHeight, + int src_pitch, + const uint8_t* gammaTable) { + int count = nHeight * src_pitch; + for (int i = 0; i < count; i++) + pData[i] = gammaTable[pData[i]]; +} + +void ContrastAdjust(uint8_t* pDataIn, + uint8_t* pDataOut, + int nWidth, + int nHeight, + int nSrcRowBytes, + int nDstRowBytes) { + int col, row, temp; + int max = 0, min = 255; + FX_FLOAT rate; + for (row = 0; row < nHeight; row++) { + uint8_t* pRow = pDataIn + row * nSrcRowBytes; + for (col = 0; col < nWidth; col++) { + temp = *pRow++; + max = std::max(temp, max); + min = std::min(temp, min); + } + } + temp = max - min; + if (temp == 0 || temp == 255) { + int rowbytes = std::min(FXSYS_abs(nSrcRowBytes), nDstRowBytes); + for (row = 0; row < nHeight; row++) { + FXSYS_memcpy(pDataOut + row * nDstRowBytes, pDataIn + row * nSrcRowBytes, + rowbytes); + } + return; + } + rate = 255.f / temp; + for (row = 0; row < nHeight; row++) { + uint8_t* pSrcRow = pDataIn + row * nSrcRowBytes; + uint8_t* pDstRow = pDataOut + row * nDstRowBytes; + for (col = 0; col < nWidth; col++) { + temp = static_cast((*(pSrcRow++) - min) * rate + 0.5); + temp = std::min(temp, 255); + temp = std::max(temp, 0); + *pDstRow++ = (uint8_t)temp; + } + } +} +} // namespace + +CFX_FaceCache::CFX_FaceCache(FXFT_Face face) + : m_Face(face) +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ + , + m_pTypeface(nullptr) +#endif +{ +} + +CFX_FaceCache::~CFX_FaceCache() { +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ + SkSafeUnref(m_pTypeface); +#endif +} + +CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(const CFX_Font* pFont, + uint32_t glyph_index, + bool bFontStyle, + const CFX_Matrix* pMatrix, + int dest_width, + int anti_alias) { + if (!m_Face) + return nullptr; + + FXFT_Matrix ft_matrix; + ft_matrix.xx = (signed long)(pMatrix->a / 64 * 65536); + ft_matrix.xy = (signed long)(pMatrix->c / 64 * 65536); + ft_matrix.yx = (signed long)(pMatrix->b / 64 * 65536); + ft_matrix.yy = (signed long)(pMatrix->d / 64 * 65536); + bool bUseCJKSubFont = false; + const CFX_SubstFont* pSubstFont = pFont->GetSubstFont(); + if (pSubstFont) { + bUseCJKSubFont = pSubstFont->m_bSubstCJK && bFontStyle; + int skew = 0; + if (bUseCJKSubFont) + skew = pSubstFont->m_bItalicCJK ? -15 : 0; + else + skew = pSubstFont->m_ItalicAngle; + if (skew) { + // |skew| is nonpositive so |-skew| is used as the index. We need to make + // sure |skew| != INT_MIN since -INT_MIN is undefined. + if (skew <= 0 && skew != std::numeric_limits::min() && + static_cast(-skew) < CFX_Font::kAngleSkewArraySize) { + skew = -CFX_Font::s_AngleSkew[-skew]; + } else { + skew = -58; + } + if (pFont->IsVertical()) + ft_matrix.yx += ft_matrix.yy * skew / 100; + else + ft_matrix.xy -= ft_matrix.xx * skew / 100; + } + if (pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) { + pFont->AdjustMMParams(glyph_index, dest_width, + pFont->GetSubstFont()->m_Weight); + } + } + ScopedFontTransform scoped_transform(m_Face, &ft_matrix); + int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) + ? FXFT_LOAD_NO_BITMAP + : (FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING); + int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags); + if (error) { + // if an error is returned, try to reload glyphs without hinting. + if (load_flags & FT_LOAD_NO_HINTING || load_flags & FT_LOAD_NO_SCALE) + return nullptr; + + load_flags |= FT_LOAD_NO_HINTING; + error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags); + + if (error) + return nullptr; + } + int weight = 0; + if (bUseCJKSubFont) + weight = pSubstFont->m_WeightCJK; + else + weight = pSubstFont ? pSubstFont->m_Weight : 0; + if (pSubstFont && !(pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && + weight > 400) { + uint32_t index = (weight - 400) / 10; + if (index >= CFX_Font::kWeightPowArraySize) + return nullptr; + pdfium::base::CheckedNumeric level = 0; + if (pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) + level = CFX_Font::s_WeightPow_SHIFTJIS[index] * 2; + else + level = CFX_Font::s_WeightPow_11[index]; + + level = level * (FXSYS_abs(static_cast(ft_matrix.xx)) + + FXSYS_abs(static_cast(ft_matrix.xy))) / + 36655; + FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), + level.ValueOrDefault(0)); + } + FXFT_Library_SetLcdFilter(CFX_GEModule::Get()->GetFontMgr()->GetFTLibrary(), + FT_LCD_FILTER_DEFAULT); + error = FXFT_Render_Glyph(m_Face, anti_alias); + if (error) + return nullptr; + int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(m_Face)); + int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(m_Face)); + if (bmwidth > 2048 || bmheight > 2048) + return nullptr; + int dib_width = bmwidth; + CFX_GlyphBitmap* pGlyphBitmap = new CFX_GlyphBitmap; + pGlyphBitmap->m_Bitmap.Create( + dib_width, bmheight, + anti_alias == FXFT_RENDER_MODE_MONO ? FXDIB_1bppMask : FXDIB_8bppMask); + pGlyphBitmap->m_Left = FXFT_Get_Glyph_BitmapLeft(m_Face); + pGlyphBitmap->m_Top = FXFT_Get_Glyph_BitmapTop(m_Face); + int dest_pitch = pGlyphBitmap->m_Bitmap.GetPitch(); + int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(m_Face)); + uint8_t* pDestBuf = pGlyphBitmap->m_Bitmap.GetBuffer(); + uint8_t* pSrcBuf = + (uint8_t*)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(m_Face)); + if (anti_alias != FXFT_RENDER_MODE_MONO && + FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == + FXFT_PIXEL_MODE_MONO) { + int bytes = anti_alias == FXFT_RENDER_MODE_LCD ? 3 : 1; + for (int i = 0; i < bmheight; i++) { + for (int n = 0; n < bmwidth; n++) { + uint8_t data = + (pSrcBuf[i * src_pitch + n / 8] & (0x80 >> (n % 8))) ? 255 : 0; + for (int b = 0; b < bytes; b++) + pDestBuf[i * dest_pitch + n * bytes + b] = data; + } + } + } else { + FXSYS_memset(pDestBuf, 0, dest_pitch * bmheight); + if (anti_alias == FXFT_RENDER_MODE_MONO && + FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == + FXFT_PIXEL_MODE_MONO) { + int rowbytes = + FXSYS_abs(src_pitch) > dest_pitch ? dest_pitch : FXSYS_abs(src_pitch); + for (int row = 0; row < bmheight; row++) { + FXSYS_memcpy(pDestBuf + row * dest_pitch, pSrcBuf + row * src_pitch, + rowbytes); + } + } else { + ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, + dest_pitch); + GammaAdjust(pDestBuf, bmheight, dest_pitch, + CFX_GEModule::Get()->GetTextGammaTable()); + } + } + return pGlyphBitmap; +} + +const CFX_PathData* CFX_FaceCache::LoadGlyphPath(const CFX_Font* pFont, + uint32_t glyph_index, + int dest_width) { + if (!m_Face || glyph_index == kInvalidGlyphIndex || dest_width < 0) + return nullptr; + + uint32_t key = glyph_index; + auto* pSubstFont = pFont->GetSubstFont(); + if (pSubstFont) { + if (pSubstFont->m_Weight < 0 || pSubstFont->m_ItalicAngle < 0) + return nullptr; + uint32_t weight = static_cast(pSubstFont->m_Weight); + uint32_t angle = static_cast(pSubstFont->m_ItalicAngle); + uint32_t key_modifier = (weight / 16) << 15; + key_modifier += (angle / 2) << 21; + key_modifier += (static_cast(dest_width) / 16) << 25; + if (pFont->IsVertical()) + key_modifier += 1U << 31; + key += key_modifier; + } + auto it = m_PathMap.find(key); + if (it != m_PathMap.end()) + return it->second.get(); + + CFX_PathData* pGlyphPath = pFont->LoadGlyphPathImpl(glyph_index, dest_width); + m_PathMap[key] = std::unique_ptr(pGlyphPath); + return pGlyphPath; +} + +const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(const CFX_Font* pFont, + uint32_t glyph_index, + bool bFontStyle, + const CFX_Matrix* pMatrix, + int dest_width, + int anti_alias, + int& text_flags) { + if (glyph_index == kInvalidGlyphIndex) + return nullptr; + + _CFX_UniqueKeyGen keygen; + int nMatrixA = static_cast(pMatrix->a * 10000); + int nMatrixB = static_cast(pMatrix->b * 10000); + int nMatrixC = static_cast(pMatrix->c * 10000); + int nMatrixD = static_cast(pMatrix->d * 10000); +#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ + if (pFont->GetSubstFont()) { + keygen.Generate(9, nMatrixA, nMatrixB, nMatrixC, nMatrixD, dest_width, + anti_alias, pFont->GetSubstFont()->m_Weight, + pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical()); + } else { + keygen.Generate(6, nMatrixA, nMatrixB, nMatrixC, nMatrixD, dest_width, + anti_alias); + } +#else + if (text_flags & FXTEXT_NO_NATIVETEXT) { + if (pFont->GetSubstFont()) { + keygen.Generate(9, nMatrixA, nMatrixB, nMatrixC, nMatrixD, dest_width, + anti_alias, pFont->GetSubstFont()->m_Weight, + pFont->GetSubstFont()->m_ItalicAngle, + pFont->IsVertical()); + } else { + keygen.Generate(6, nMatrixA, nMatrixB, nMatrixC, nMatrixD, dest_width, + anti_alias); + } + } else { + if (pFont->GetSubstFont()) { + keygen.Generate(10, nMatrixA, nMatrixB, nMatrixC, nMatrixD, dest_width, + anti_alias, pFont->GetSubstFont()->m_Weight, + pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical(), + 3); + } else { + keygen.Generate(7, nMatrixA, nMatrixB, nMatrixC, nMatrixD, dest_width, + anti_alias, 3); + } + } +#endif + CFX_ByteString FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen); +#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ || defined _SKIA_SUPPORT_ || \ + defined _SKIA_SUPPORT_PATHS_ + return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, + bFontStyle, dest_width, anti_alias); +#else + if (text_flags & FXTEXT_NO_NATIVETEXT) { + return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, + bFontStyle, dest_width, anti_alias); + } + CFX_GlyphBitmap* pGlyphBitmap; + auto it = m_SizeMap.find(FaceGlyphsKey); + if (it != m_SizeMap.end()) { + CFX_SizeGlyphCache* pSizeCache = it->second.get(); + auto it2 = pSizeCache->m_GlyphMap.find(glyph_index); + if (it2 != pSizeCache->m_GlyphMap.end()) + return it2->second; + + pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, + dest_width, anti_alias); + if (pGlyphBitmap) { + pSizeCache->m_GlyphMap[glyph_index] = pGlyphBitmap; + return pGlyphBitmap; + } + } else { + pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, + dest_width, anti_alias); + if (pGlyphBitmap) { + CFX_SizeGlyphCache* pSizeCache = new CFX_SizeGlyphCache; + m_SizeMap[FaceGlyphsKey] = + std::unique_ptr(pSizeCache); + pSizeCache->m_GlyphMap[glyph_index] = pGlyphBitmap; + return pGlyphBitmap; + } + } + if (pFont->GetSubstFont()) { + keygen.Generate(9, nMatrixA, nMatrixB, nMatrixC, nMatrixD, dest_width, + anti_alias, pFont->GetSubstFont()->m_Weight, + pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical()); + } else { + keygen.Generate(6, nMatrixA, nMatrixB, nMatrixC, nMatrixD, dest_width, + anti_alias); + } + CFX_ByteString FaceGlyphsKey2(keygen.m_Key, keygen.m_KeyLen); + text_flags |= FXTEXT_NO_NATIVETEXT; + return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey2, glyph_index, + bFontStyle, dest_width, anti_alias); +#endif +} + +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ +CFX_TypeFace* CFX_FaceCache::GetDeviceCache(const CFX_Font* pFont) { + if (!m_pTypeface) { + m_pTypeface = + SkTypeface::MakeFromStream( + new SkMemoryStream(pFont->GetFontData(), pFont->GetSize())) + .release(); + } + return m_pTypeface; +} +#endif + +#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ +void CFX_FaceCache::InitPlatform() {} +#endif + +CFX_GlyphBitmap* CFX_FaceCache::LookUpGlyphBitmap( + const CFX_Font* pFont, + const CFX_Matrix* pMatrix, + const CFX_ByteString& FaceGlyphsKey, + uint32_t glyph_index, + bool bFontStyle, + int dest_width, + int anti_alias) { + CFX_SizeGlyphCache* pSizeCache; + auto it = m_SizeMap.find(FaceGlyphsKey); + if (it == m_SizeMap.end()) { + pSizeCache = new CFX_SizeGlyphCache; + m_SizeMap[FaceGlyphsKey] = std::unique_ptr(pSizeCache); + } else { + pSizeCache = it->second.get(); + } + auto it2 = pSizeCache->m_GlyphMap.find(glyph_index); + if (it2 != pSizeCache->m_GlyphMap.end()) + return it2->second; + + CFX_GlyphBitmap* pGlyphBitmap = RenderGlyph(pFont, glyph_index, bFontStyle, + pMatrix, dest_width, anti_alias); + pSizeCache->m_GlyphMap[glyph_index] = pGlyphBitmap; + return pGlyphBitmap; +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_folderfontinfo.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_folderfontinfo.cpp new file mode 100644 index 000000000000..776a37319b3c --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_folderfontinfo.cpp @@ -0,0 +1,379 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/ge/cfx_folderfontinfo.h" + +#include + +#include "core/fxge/cfx_fontmapper.h" +#include "core/fxge/fx_font.h" + +#include "third_party/base/stl_util.h" + +namespace { + +const struct { + const FX_CHAR* m_pName; + const FX_CHAR* m_pSubstName; +} Base14Substs[] = { + {"Courier", "Courier New"}, + {"Courier-Bold", "Courier New Bold"}, + {"Courier-BoldOblique", "Courier New Bold Italic"}, + {"Courier-Oblique", "Courier New Italic"}, + {"Helvetica", "Arial"}, + {"Helvetica-Bold", "Arial Bold"}, + {"Helvetica-BoldOblique", "Arial Bold Italic"}, + {"Helvetica-Oblique", "Arial Italic"}, + {"Times-Roman", "Times New Roman"}, + {"Times-Bold", "Times New Roman Bold"}, + {"Times-BoldItalic", "Times New Roman Bold Italic"}, + {"Times-Italic", "Times New Roman Italic"}, +}; + +CFX_ByteString FPDF_ReadStringFromFile(FXSYS_FILE* pFile, uint32_t size) { + CFX_ByteString buffer; + if (!FXSYS_fread(buffer.GetBuffer(size), size, 1, pFile)) + return CFX_ByteString(); + buffer.ReleaseBuffer(size); + return buffer; +} + +CFX_ByteString FPDF_LoadTableFromTT(FXSYS_FILE* pFile, + const uint8_t* pTables, + uint32_t nTables, + uint32_t tag) { + for (uint32_t i = 0; i < nTables; i++) { + const uint8_t* p = pTables + i * 16; + if (GET_TT_LONG(p) == tag) { + uint32_t offset = GET_TT_LONG(p + 8); + uint32_t size = GET_TT_LONG(p + 12); + FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET); + return FPDF_ReadStringFromFile(pFile, size); + } + } + return CFX_ByteString(); +} + +uint32_t GetCharset(int charset) { + switch (charset) { + case FXFONT_SHIFTJIS_CHARSET: + return CHARSET_FLAG_SHIFTJIS; + case FXFONT_GB2312_CHARSET: + return CHARSET_FLAG_GB; + case FXFONT_CHINESEBIG5_CHARSET: + return CHARSET_FLAG_BIG5; + case FXFONT_HANGUL_CHARSET: + return CHARSET_FLAG_KOREAN; + case FXFONT_SYMBOL_CHARSET: + return CHARSET_FLAG_SYMBOL; + case FXFONT_ANSI_CHARSET: + return CHARSET_FLAG_ANSI; + default: + break; + } + return 0; +} + +int32_t GetSimilarValue(int weight, + bool bItalic, + int pitch_family, + uint32_t style) { + int32_t iSimilarValue = 0; + if (!!(style & FXFONT_BOLD) == (weight > 400)) + iSimilarValue += 16; + if (!!(style & FXFONT_ITALIC) == bItalic) + iSimilarValue += 16; + if (!!(style & FXFONT_SERIF) == !!(pitch_family & FXFONT_FF_ROMAN)) + iSimilarValue += 16; + if (!!(style & FXFONT_SCRIPT) == !!(pitch_family & FXFONT_FF_SCRIPT)) + iSimilarValue += 8; + if (!!(style & FXFONT_FIXED_PITCH) == + !!(pitch_family & FXFONT_FF_FIXEDPITCH)) { + iSimilarValue += 8; + } + return iSimilarValue; +} + +} // namespace + +CFX_FolderFontInfo::CFX_FolderFontInfo() {} + +CFX_FolderFontInfo::~CFX_FolderFontInfo() { + for (const auto& pair : m_FontList) + delete pair.second; +} + +void CFX_FolderFontInfo::AddPath(const CFX_ByteStringC& path) { + m_PathList.push_back(CFX_ByteString(path)); +} + +bool CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper) { + m_pMapper = pMapper; + for (const auto& path : m_PathList) + ScanPath(path); + return true; +} + +void CFX_FolderFontInfo::ScanPath(const CFX_ByteString& path) { + FX_FileHandle* handle = FX_OpenFolder(path.c_str()); + if (!handle) + return; + + CFX_ByteString filename; + bool bFolder; + while (FX_GetNextFile(handle, &filename, &bFolder)) { + if (bFolder) { + if (filename == "." || filename == "..") + continue; + } else { + CFX_ByteString ext = filename.Right(4); + ext.MakeUpper(); + if (ext != ".TTF" && ext != ".OTF" && ext != ".TTC") + continue; + } + + CFX_ByteString fullpath = path; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + fullpath += "\\"; +#else + fullpath += "/"; +#endif + + fullpath += filename; + bFolder ? ScanPath(fullpath) : ScanFile(fullpath); + } + FX_CloseFolder(handle); +} + +void CFX_FolderFontInfo::ScanFile(const CFX_ByteString& path) { + FXSYS_FILE* pFile = FXSYS_fopen(path.c_str(), "rb"); + if (!pFile) + return; + + FXSYS_fseek(pFile, 0, FXSYS_SEEK_END); + + uint32_t filesize = FXSYS_ftell(pFile); + uint8_t buffer[16]; + FXSYS_fseek(pFile, 0, FXSYS_SEEK_SET); + + size_t readCnt = FXSYS_fread(buffer, 12, 1, pFile); + if (readCnt != 1) { + FXSYS_fclose(pFile); + return; + } + + if (GET_TT_LONG(buffer) == kTableTTCF) { + uint32_t nFaces = GET_TT_LONG(buffer + 8); + if (nFaces > std::numeric_limits::max() / 4) { + FXSYS_fclose(pFile); + return; + } + uint32_t face_bytes = nFaces * 4; + uint8_t* offsets = FX_Alloc(uint8_t, face_bytes); + readCnt = FXSYS_fread(offsets, 1, face_bytes, pFile); + if (readCnt != face_bytes) { + FX_Free(offsets); + FXSYS_fclose(pFile); + return; + } + for (uint32_t i = 0; i < nFaces; i++) { + uint8_t* p = offsets + i * 4; + ReportFace(path, pFile, filesize, GET_TT_LONG(p)); + } + FX_Free(offsets); + } else { + ReportFace(path, pFile, filesize, 0); + } + FXSYS_fclose(pFile); +} + +void CFX_FolderFontInfo::ReportFace(const CFX_ByteString& path, + FXSYS_FILE* pFile, + uint32_t filesize, + uint32_t offset) { + FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET); + char buffer[16]; + if (!FXSYS_fread(buffer, 12, 1, pFile)) + return; + + uint32_t nTables = GET_TT_SHORT(buffer + 4); + CFX_ByteString tables = FPDF_ReadStringFromFile(pFile, nTables * 16); + if (tables.IsEmpty()) + return; + + CFX_ByteString names = + FPDF_LoadTableFromTT(pFile, tables.raw_str(), nTables, 0x6e616d65); + if (names.IsEmpty()) + return; + + CFX_ByteString facename = + GetNameFromTT(names.raw_str(), names.GetLength(), 1); + if (facename.IsEmpty()) + return; + + CFX_ByteString style = GetNameFromTT(names.raw_str(), names.GetLength(), 2); + if (style != "Regular") + facename += " " + style; + + if (pdfium::ContainsKey(m_FontList, facename)) + return; + + CFX_FontFaceInfo* pInfo = + new CFX_FontFaceInfo(path, facename, tables, offset, filesize); + CFX_ByteString os2 = + FPDF_LoadTableFromTT(pFile, tables.raw_str(), nTables, 0x4f532f32); + if (os2.GetLength() >= 86) { + const uint8_t* p = os2.raw_str() + 78; + uint32_t codepages = GET_TT_LONG(p); + if (codepages & (1 << 17)) { + m_pMapper->AddInstalledFont(facename, FXFONT_SHIFTJIS_CHARSET); + pInfo->m_Charsets |= CHARSET_FLAG_SHIFTJIS; + } + if (codepages & (1 << 18)) { + m_pMapper->AddInstalledFont(facename, FXFONT_GB2312_CHARSET); + pInfo->m_Charsets |= CHARSET_FLAG_GB; + } + if (codepages & (1 << 20)) { + m_pMapper->AddInstalledFont(facename, FXFONT_CHINESEBIG5_CHARSET); + pInfo->m_Charsets |= CHARSET_FLAG_BIG5; + } + if ((codepages & (1 << 19)) || (codepages & (1 << 21))) { + m_pMapper->AddInstalledFont(facename, FXFONT_HANGUL_CHARSET); + pInfo->m_Charsets |= CHARSET_FLAG_KOREAN; + } + if (codepages & (1 << 31)) { + m_pMapper->AddInstalledFont(facename, FXFONT_SYMBOL_CHARSET); + pInfo->m_Charsets |= CHARSET_FLAG_SYMBOL; + } + } + m_pMapper->AddInstalledFont(facename, FXFONT_ANSI_CHARSET); + pInfo->m_Charsets |= CHARSET_FLAG_ANSI; + pInfo->m_Styles = 0; + if (style.Find("Bold") > -1) + pInfo->m_Styles |= FXFONT_BOLD; + if (style.Find("Italic") > -1 || style.Find("Oblique") > -1) + pInfo->m_Styles |= FXFONT_ITALIC; + if (facename.Find("Serif") > -1) + pInfo->m_Styles |= FXFONT_SERIF; + + m_FontList[facename] = pInfo; +} + +void* CFX_FolderFontInfo::GetSubstFont(const CFX_ByteString& face) { + for (size_t iBaseFont = 0; iBaseFont < FX_ArraySize(Base14Substs); + iBaseFont++) { + if (face == Base14Substs[iBaseFont].m_pName) + return GetFont(Base14Substs[iBaseFont].m_pSubstName); + } + return nullptr; +} + +void* CFX_FolderFontInfo::FindFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* family, + bool bMatchName) { + CFX_FontFaceInfo* pFind = nullptr; + if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) + return GetFont("Courier New"); + uint32_t charset_flag = GetCharset(charset); + int32_t iBestSimilar = 0; + for (const auto& it : m_FontList) { + const CFX_ByteString& bsName = it.first; + CFX_FontFaceInfo* pFont = it.second; + if (!(pFont->m_Charsets & charset_flag) && + charset != FXFONT_DEFAULT_CHARSET) { + continue; + } + int32_t index = bsName.Find(family); + if (bMatchName && index < 0) + continue; + int32_t iSimilarValue = + GetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles); + if (iSimilarValue > iBestSimilar) { + iBestSimilar = iSimilarValue; + pFind = pFont; + } + } + return pFind; +} + +void* CFX_FolderFontInfo::MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* family, + int& iExact) { + return nullptr; +} + +#ifdef PDF_ENABLE_XFA +void* CFX_FolderFontInfo::MapFontByUnicode(uint32_t dwUnicode, + int weight, + bool bItalic, + int pitch_family) { + return nullptr; +} +#endif // PDF_ENABLE_XFA + +void* CFX_FolderFontInfo::GetFont(const FX_CHAR* face) { + auto it = m_FontList.find(face); + return it != m_FontList.end() ? it->second : nullptr; +} + +uint32_t CFX_FolderFontInfo::GetFontData(void* hFont, + uint32_t table, + uint8_t* buffer, + uint32_t size) { + if (!hFont) + return 0; + + const CFX_FontFaceInfo* pFont = static_cast(hFont); + uint32_t datasize = 0; + uint32_t offset = 0; + if (table == 0) { + datasize = pFont->m_FontOffset ? 0 : pFont->m_FileSize; + } else if (table == kTableTTCF) { + datasize = pFont->m_FontOffset ? pFont->m_FileSize : 0; + } else { + uint32_t nTables = pFont->m_FontTables.GetLength() / 16; + for (uint32_t i = 0; i < nTables; i++) { + const uint8_t* p = pFont->m_FontTables.raw_str() + i * 16; + if (GET_TT_LONG(p) == table) { + offset = GET_TT_LONG(p + 8); + datasize = GET_TT_LONG(p + 12); + } + } + } + + if (!datasize || size < datasize) + return datasize; + + FXSYS_FILE* pFile = FXSYS_fopen(pFont->m_FilePath.c_str(), "rb"); + if (!pFile) + return 0; + + if (FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET) < 0 || + FXSYS_fread(buffer, datasize, 1, pFile) != 1) { + datasize = 0; + } + FXSYS_fclose(pFile); + return datasize; +} + +void CFX_FolderFontInfo::DeleteFont(void* hFont) {} +bool CFX_FolderFontInfo::GetFaceName(void* hFont, CFX_ByteString& name) { + if (!hFont) + return false; + CFX_FontFaceInfo* pFont = (CFX_FontFaceInfo*)hFont; + name = pFont->m_FaceName; + return true; +} + +bool CFX_FolderFontInfo::GetFontCharset(void* hFont, int& charset) { + return false; +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_folderfontinfo.h b/modules/pdfium/pdfium/core/fxge/ge/cfx_folderfontinfo.h new file mode 100644 index 000000000000..d031eef3d06a --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_folderfontinfo.h @@ -0,0 +1,67 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_GE_CFX_FOLDERFONTINFO_H_ +#define CORE_FXGE_GE_CFX_FOLDERFONTINFO_H_ + +#include +#include + +#include "core/fxge/cfx_fontmapper.h" +#include "core/fxge/fx_font.h" +#include "core/fxge/ifx_systemfontinfo.h" + +class CFX_FolderFontInfo : public IFX_SystemFontInfo { + public: + CFX_FolderFontInfo(); + ~CFX_FolderFontInfo() override; + + void AddPath(const CFX_ByteStringC& path); + + // IFX_SytemFontInfo: + bool EnumFontList(CFX_FontMapper* pMapper) override; + void* MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* face, + int& bExact) override; +#ifdef PDF_ENABLE_XFA + void* MapFontByUnicode(uint32_t dwUnicode, + int weight, + bool bItalic, + int pitch_family) override; +#endif // PDF_ENABLE_XFA + void* GetFont(const FX_CHAR* face) override; + uint32_t GetFontData(void* hFont, + uint32_t table, + uint8_t* buffer, + uint32_t size) override; + void DeleteFont(void* hFont) override; + bool GetFaceName(void* hFont, CFX_ByteString& name) override; + bool GetFontCharset(void* hFont, int& charset) override; + + protected: + void ScanPath(const CFX_ByteString& path); + void ScanFile(const CFX_ByteString& path); + void ReportFace(const CFX_ByteString& path, + FXSYS_FILE* pFile, + uint32_t filesize, + uint32_t offset); + void* GetSubstFont(const CFX_ByteString& face); + void* FindFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* family, + bool bMatchName); + + std::map m_FontList; + std::vector m_PathList; + CFX_FontMapper* m_pMapper; +}; + +#endif // CORE_FXGE_GE_CFX_FOLDERFONTINFO_H_ diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_font.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_font.cpp new file mode 100644 index 000000000000..87157b010114 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_font.cpp @@ -0,0 +1,697 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/fx_font.h" + +#include +#include +#include +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fxge/cfx_facecache.h" +#include "core/fxge/cfx_fontcache.h" +#include "core/fxge/cfx_fontmgr.h" +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_substfont.h" +#include "core/fxge/fx_freetype.h" +#include "core/fxge/ge/fx_text_int.h" +#include "third_party/base/ptr_util.h" + +#define EM_ADJUST(em, a) (em == 0 ? (a) : (a)*1000 / em) + +namespace { + +typedef struct { + CFX_PathData* m_pPath; + int m_CurX; + int m_CurY; + FX_FLOAT m_CoordUnit; +} OUTLINE_PARAMS; + +#ifdef PDF_ENABLE_XFA + +unsigned long FTStreamRead(FXFT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count) { + if (count == 0) + return 0; + + IFX_SeekableReadStream* pFile = + static_cast(stream->descriptor.pointer); + if (!pFile) + return 0; + + if (!pFile->ReadBlock(buffer, offset, count)) + return 0; + + return count; +} + +void FTStreamClose(FXFT_Stream stream) {} + +bool LoadFileImp(FXFT_Library library, + FXFT_Face* Face, + const CFX_RetainPtr& pFile, + int32_t faceIndex, + std::unique_ptr* stream) { + auto stream1 = pdfium::MakeUnique(); + stream1->base = nullptr; + stream1->size = static_cast(pFile->GetSize()); + stream1->pos = 0; + stream1->descriptor.pointer = static_cast(pFile.Get()); + stream1->close = FTStreamClose; + stream1->read = FTStreamRead; + FXFT_Open_Args args; + args.flags = FT_OPEN_STREAM; + args.stream = stream1.get(); + if (FXFT_Open_Face(library, &args, faceIndex, Face)) + return false; + if (stream) + *stream = std::move(stream1); + return true; +} +#endif // PDF_ENABLE_XFA + +FXFT_Face FT_LoadFont(const uint8_t* pData, int size) { + return CFX_GEModule::Get()->GetFontMgr()->GetFixedFace(pData, size, 0); +} + +void Outline_CheckEmptyContour(OUTLINE_PARAMS* param) { + std::vector& points = param->m_pPath->GetPoints(); + size_t size = points.size(); + + if (size >= 2 && points[size - 2].IsTypeAndOpen(FXPT_TYPE::MoveTo) && + points[size - 2].m_Point == points[size - 1].m_Point) { + size -= 2; + } + if (size >= 4 && points[size - 4].IsTypeAndOpen(FXPT_TYPE::MoveTo) && + points[size - 3].IsTypeAndOpen(FXPT_TYPE::BezierTo) && + points[size - 3].m_Point == points[size - 4].m_Point && + points[size - 2].m_Point == points[size - 4].m_Point && + points[size - 1].m_Point == points[size - 4].m_Point) { + size -= 4; + } + points.resize(size); +} + +int Outline_MoveTo(const FXFT_Vector* to, void* user) { + OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user; + + Outline_CheckEmptyContour(param); + + param->m_pPath->ClosePath(); + param->m_pPath->AppendPoint( + CFX_PointF(to->x / param->m_CoordUnit, to->y / param->m_CoordUnit), + FXPT_TYPE::MoveTo, false); + + param->m_CurX = to->x; + param->m_CurY = to->y; + return 0; +} + +int Outline_LineTo(const FXFT_Vector* to, void* user) { + OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user; + + param->m_pPath->AppendPoint( + CFX_PointF(to->x / param->m_CoordUnit, to->y / param->m_CoordUnit), + FXPT_TYPE::LineTo, false); + + param->m_CurX = to->x; + param->m_CurY = to->y; + return 0; +} + +int Outline_ConicTo(const FXFT_Vector* control, + const FXFT_Vector* to, + void* user) { + OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user; + + param->m_pPath->AppendPoint( + CFX_PointF((param->m_CurX + (control->x - param->m_CurX) * 2 / 3) / + param->m_CoordUnit, + (param->m_CurY + (control->y - param->m_CurY) * 2 / 3) / + param->m_CoordUnit), + FXPT_TYPE::BezierTo, false); + + param->m_pPath->AppendPoint( + CFX_PointF((control->x + (to->x - control->x) / 3) / param->m_CoordUnit, + (control->y + (to->y - control->y) / 3) / param->m_CoordUnit), + FXPT_TYPE::BezierTo, false); + + param->m_pPath->AppendPoint( + CFX_PointF(to->x / param->m_CoordUnit, to->y / param->m_CoordUnit), + FXPT_TYPE::BezierTo, false); + + param->m_CurX = to->x; + param->m_CurY = to->y; + return 0; +} + +int Outline_CubicTo(const FXFT_Vector* control1, + const FXFT_Vector* control2, + const FXFT_Vector* to, + void* user) { + OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user; + + param->m_pPath->AppendPoint(CFX_PointF(control1->x / param->m_CoordUnit, + control1->y / param->m_CoordUnit), + FXPT_TYPE::BezierTo, false); + + param->m_pPath->AppendPoint(CFX_PointF(control2->x / param->m_CoordUnit, + control2->y / param->m_CoordUnit), + FXPT_TYPE::BezierTo, false); + + param->m_pPath->AppendPoint( + CFX_PointF(to->x / param->m_CoordUnit, to->y / param->m_CoordUnit), + FXPT_TYPE::BezierTo, false); + + param->m_CurX = to->x; + param->m_CurY = to->y; + return 0; +} + +} // namespace + +const char CFX_Font::s_AngleSkew[] = { + 0, 2, 3, 5, 7, 9, 11, 12, 14, 16, 18, 19, 21, 23, 25, + 27, 29, 31, 32, 34, 36, 38, 40, 42, 45, 47, 49, 51, 53, 55, +}; + +const uint8_t CFX_Font::s_WeightPow[] = { + 0, 3, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 36, 36, 37, + 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, + 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, + 47, 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, + 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, +}; + +const uint8_t CFX_Font::s_WeightPow_11[] = { + 0, 4, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 39, 40, 40, 41, + 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, + 46, 43, 47, 47, 48, 48, 48, 48, 45, 50, 50, 50, 46, 51, 51, 51, 52, + 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, + 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, +}; + +const uint8_t CFX_Font::s_WeightPow_SHIFTJIS[] = { + 0, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 21, + 22, 24, 26, 28, 30, 32, 33, 35, 37, 39, 41, 43, 45, 48, 48, 48, 48, + 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, + 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, + 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, + 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, +}; + +CFX_Font::CFX_Font() + : +#ifdef PDF_ENABLE_XFA + m_bShallowCopy(false), + m_pOwnedStream(nullptr), +#endif // PDF_ENABLE_XFA + m_Face(nullptr), + m_FaceCache(nullptr), + m_pFontData(nullptr), + m_pGsubData(nullptr), + m_dwSize(0), +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + m_pPlatformFont(nullptr), +#endif + m_bEmbedded(false), + m_bVertical(false) { +} + +#ifdef PDF_ENABLE_XFA +bool CFX_Font::LoadClone(const CFX_Font* pFont) { + if (!pFont) + return false; + + m_bShallowCopy = true; + if (pFont->m_pSubstFont) { + m_pSubstFont = pdfium::MakeUnique(); + m_pSubstFont->m_Charset = pFont->m_pSubstFont->m_Charset; + m_pSubstFont->m_SubstFlags = pFont->m_pSubstFont->m_SubstFlags; + m_pSubstFont->m_Weight = pFont->m_pSubstFont->m_Weight; + m_pSubstFont->m_Family = pFont->m_pSubstFont->m_Family; + m_pSubstFont->m_ItalicAngle = pFont->m_pSubstFont->m_ItalicAngle; + } + m_Face = pFont->m_Face; + m_bEmbedded = pFont->m_bEmbedded; + m_bVertical = pFont->m_bVertical; + m_dwSize = pFont->m_dwSize; + m_pFontData = pFont->m_pFontData; + m_pGsubData = pFont->m_pGsubData; +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + m_pPlatformFont = pFont->m_pPlatformFont; +#endif + m_pOwnedStream = pFont->m_pOwnedStream; + m_FaceCache = pFont->GetFaceCache(); + return true; +} + +void CFX_Font::SetFace(FXFT_Face face) { + ClearFaceCache(); + m_Face = face; +} + +#endif // PDF_ENABLE_XFA + +CFX_Font::~CFX_Font() { +#ifdef PDF_ENABLE_XFA + if (m_bShallowCopy) + return; +#endif // PDF_ENABLE_XFA + if (m_Face) { +#ifndef PDF_ENABLE_XFA + if (FXFT_Get_Face_External_Stream(m_Face)) { + FXFT_Clear_Face_External_Stream(m_Face); + } +#endif // PDF_ENABLE_XFA + DeleteFace(); + } +#ifdef PDF_ENABLE_XFA + delete m_pOwnedStream; +#endif // PDF_ENABLE_XFA + FX_Free(m_pGsubData); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && !defined _SKIA_SUPPORT_ + ReleasePlatformResource(); +#endif +} + +void CFX_Font::DeleteFace() { + ClearFaceCache(); + if (m_bEmbedded) { + FXFT_Done_Face(m_Face); + } else { + CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face); + } + m_Face = nullptr; +} + +void CFX_Font::LoadSubst(const CFX_ByteString& face_name, + bool bTrueType, + uint32_t flags, + int weight, + int italic_angle, + int CharsetCP, + bool bVertical) { + m_bEmbedded = false; + m_bVertical = bVertical; + m_pSubstFont = pdfium::MakeUnique(); + m_Face = CFX_GEModule::Get()->GetFontMgr()->FindSubstFont( + face_name, bTrueType, flags, weight, italic_angle, CharsetCP, + m_pSubstFont.get()); + if (m_Face) { + m_pFontData = FXFT_Get_Face_Stream_Base(m_Face); + m_dwSize = FXFT_Get_Face_Stream_Size(m_Face); + } +} + +#ifdef PDF_ENABLE_XFA +bool CFX_Font::LoadFile(const CFX_RetainPtr& pFile, + int nFaceIndex, + int* pFaceCount) { + m_bEmbedded = false; + + CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); + pFontMgr->InitFTLibrary(); + + FXFT_Library library = pFontMgr->GetFTLibrary(); + std::unique_ptr stream; + if (!LoadFileImp(library, &m_Face, pFile, nFaceIndex, &stream)) + return false; + + if (pFaceCount) + *pFaceCount = (int)m_Face->num_faces; + m_pOwnedStream = stream.release(); + FXFT_Set_Pixel_Sizes(m_Face, 0, 64); + return true; +} +#endif // PDF_ENABLE_XFA + +int CFX_Font::GetGlyphWidth(uint32_t glyph_index) { + if (!m_Face) + return 0; + if (m_pSubstFont && (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM)) + AdjustMMParams(glyph_index, 0, 0); + int err = FXFT_Load_Glyph( + m_Face, glyph_index, + FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); + if (err) + return 0; + int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Glyph_HoriAdvance(m_Face)); + return width; +} + +bool CFX_Font::LoadEmbedded(const uint8_t* data, uint32_t size) { + std::vector temp(data, data + size); + m_pFontDataAllocation.swap(temp); + m_Face = FT_LoadFont(m_pFontDataAllocation.data(), size); + m_pFontData = m_pFontDataAllocation.data(); + m_bEmbedded = true; + m_dwSize = size; + return !!m_Face; +} + +bool CFX_Font::IsTTFont() const { + if (!m_Face) + return false; + return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT; +} + +int CFX_Font::GetAscent() const { + if (!m_Face) + return 0; + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_Ascender(m_Face)); +} + +int CFX_Font::GetDescent() const { + if (!m_Face) + return 0; + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_Descender(m_Face)); +} + +bool CFX_Font::GetGlyphBBox(uint32_t glyph_index, FX_RECT& bbox) { + if (!m_Face) + return false; + + if (FXFT_Is_Face_Tricky(m_Face)) { + int error = FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72); + if (error) + return false; + error = FXFT_Load_Glyph(m_Face, glyph_index, + FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); + if (error) + return false; + FXFT_BBox cbox; + FT_Glyph glyph; + error = FXFT_Get_Glyph(((FXFT_Face)m_Face)->glyph, &glyph); + if (error) + return false; + FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox); + int pixel_size_x = ((FXFT_Face)m_Face)->size->metrics.x_ppem, + pixel_size_y = ((FXFT_Face)m_Face)->size->metrics.y_ppem; + if (pixel_size_x == 0 || pixel_size_y == 0) { + bbox.left = cbox.xMin; + bbox.right = cbox.xMax; + bbox.top = cbox.yMax; + bbox.bottom = cbox.yMin; + } else { + bbox.left = cbox.xMin * 1000 / pixel_size_x; + bbox.right = cbox.xMax * 1000 / pixel_size_x; + bbox.top = cbox.yMax * 1000 / pixel_size_y; + bbox.bottom = cbox.yMin * 1000 / pixel_size_y; + } + if (bbox.top > FXFT_Get_Face_Ascender(m_Face)) + bbox.top = FXFT_Get_Face_Ascender(m_Face); + if (bbox.bottom < FXFT_Get_Face_Descender(m_Face)) + bbox.bottom = FXFT_Get_Face_Descender(m_Face); + FT_Done_Glyph(glyph); + return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0; + } + if (FXFT_Load_Glyph( + m_Face, glyph_index, + FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) { + return false; + } + int em = FXFT_Get_Face_UnitsPerEM(m_Face); + if (em == 0) { + bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face); + bbox.bottom = FXFT_Get_Glyph_HoriBearingY(m_Face); + bbox.top = bbox.bottom - FXFT_Get_Glyph_Height(m_Face); + bbox.right = bbox.left + FXFT_Get_Glyph_Width(m_Face); + } else { + bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face) * 1000 / em; + bbox.top = + (FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)) * + 1000 / em; + bbox.right = + (FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)) * + 1000 / em; + bbox.bottom = (FXFT_Get_Glyph_HoriBearingY(m_Face)) * 1000 / em; + } + return true; +} + +bool CFX_Font::IsItalic() const { + if (!m_Face) + return false; + + if (FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC) + return true; + CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face)); + str.MakeLower(); + return str.Find("italic") != -1; +} + +bool CFX_Font::IsBold() const { + if (!m_Face) + return false; + return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD; +} + +bool CFX_Font::IsFixedWidth() const { + if (!m_Face) + return false; + return FXFT_Is_Face_fixedwidth(m_Face) != 0; +} + +CFX_ByteString CFX_Font::GetPsName() const { + if (!m_Face) + return CFX_ByteString(); + + CFX_ByteString psName = FXFT_Get_Postscript_Name(m_Face); + if (psName.IsEmpty()) + psName = "Untitled"; + return psName; +} + +CFX_ByteString CFX_Font::GetFamilyName() const { + if (!m_Face && !m_pSubstFont) + return CFX_ByteString(); + if (m_Face) + return CFX_ByteString(FXFT_Get_Face_Family_Name(m_Face)); + return m_pSubstFont->m_Family; +} + +CFX_ByteString CFX_Font::GetFaceName() const { + if (!m_Face && !m_pSubstFont) + return CFX_ByteString(); + if (m_Face) { + CFX_ByteString facename; + CFX_ByteString style = CFX_ByteString(FXFT_Get_Face_Style_Name(m_Face)); + facename = GetFamilyName(); + if (facename.IsEmpty()) + facename = "Untitled"; + if (!style.IsEmpty() && style != "Regular") + facename += " " + style; + return facename; + } + return m_pSubstFont->m_Family; +} + +bool CFX_Font::GetBBox(FX_RECT& bbox) { + if (!m_Face) + return false; + int em = FXFT_Get_Face_UnitsPerEM(m_Face); + if (em == 0) { + bbox.left = FXFT_Get_Face_xMin(m_Face); + bbox.bottom = FXFT_Get_Face_yMax(m_Face); + bbox.top = FXFT_Get_Face_yMin(m_Face); + bbox.right = FXFT_Get_Face_xMax(m_Face); + } else { + bbox.left = FXFT_Get_Face_xMin(m_Face) * 1000 / em; + bbox.top = FXFT_Get_Face_yMin(m_Face) * 1000 / em; + bbox.right = FXFT_Get_Face_xMax(m_Face) * 1000 / em; + bbox.bottom = FXFT_Get_Face_yMax(m_Face) * 1000 / em; + } + return true; +} + +int CFX_Font::GetHeight() const { + if (!m_Face) + return 0; + + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_Height(m_Face)); +} + +int CFX_Font::GetMaxAdvanceWidth() const { + if (!m_Face) + return 0; + + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_MaxAdvanceWidth(m_Face)); +} + +CFX_FaceCache* CFX_Font::GetFaceCache() const { + if (!m_FaceCache) { + m_FaceCache = CFX_GEModule::Get()->GetFontCache()->GetCachedFace(this); + } + return m_FaceCache; +} + +void CFX_Font::ClearFaceCache() { + if (!m_FaceCache) + return; + CFX_GEModule::Get()->GetFontCache()->ReleaseCachedFace(this); + m_FaceCache = nullptr; +} + +int CFX_Font::GetULPos() const { + if (!m_Face) + return 0; + + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_UnderLinePosition(m_Face)); +} + +int CFX_Font::GetULthickness() const { + if (!m_Face) + return 0; + + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_UnderLineThickness(m_Face)); +} + +void CFX_Font::AdjustMMParams(int glyph_index, + int dest_width, + int weight) const { + FXFT_MM_Var pMasters = nullptr; + FXFT_Get_MM_Var(m_Face, &pMasters); + if (!pMasters) + return; + long coords[2]; + if (weight == 0) + coords[0] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 0)) / 65536; + else + coords[0] = weight; + if (dest_width == 0) { + coords[1] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 1)) / 65536; + } else { + int min_param = FXFT_Get_MM_Axis_Min(FXFT_Get_MM_Axis(pMasters, 1)) / 65536; + int max_param = FXFT_Get_MM_Axis_Max(FXFT_Get_MM_Axis(pMasters, 1)) / 65536; + coords[1] = min_param; + FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords); + FXFT_Load_Glyph(m_Face, glyph_index, + FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); + int min_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / + FXFT_Get_Face_UnitsPerEM(m_Face); + coords[1] = max_param; + FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords); + FXFT_Load_Glyph(m_Face, glyph_index, + FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); + int max_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / + FXFT_Get_Face_UnitsPerEM(m_Face); + if (max_width == min_width) { + FXFT_Free(m_Face, pMasters); + return; + } + int param = min_param + + (max_param - min_param) * (dest_width - min_width) / + (max_width - min_width); + coords[1] = param; + } + FXFT_Free(m_Face, pMasters); + FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords); +} + +CFX_PathData* CFX_Font::LoadGlyphPathImpl(uint32_t glyph_index, + int dest_width) const { + if (!m_Face) + return nullptr; + FXFT_Set_Pixel_Sizes(m_Face, 0, 64); + FXFT_Matrix ft_matrix = {65536, 0, 0, 65536}; + if (m_pSubstFont) { + if (m_pSubstFont->m_ItalicAngle) { + int skew = m_pSubstFont->m_ItalicAngle; + // |skew| is nonpositive so |-skew| is used as the index. We need to make + // sure |skew| != INT_MIN since -INT_MIN is undefined. + if (skew <= 0 && skew != std::numeric_limits::min() && + static_cast(-skew) < kAngleSkewArraySize) { + skew = -s_AngleSkew[-skew]; + } else { + skew = -58; + } + if (m_bVertical) + ft_matrix.yx += ft_matrix.yy * skew / 100; + else + ft_matrix.xy -= ft_matrix.xx * skew / 100; + } + if (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) { + AdjustMMParams(glyph_index, dest_width, m_pSubstFont->m_Weight); + } + } + ScopedFontTransform scoped_transform(m_Face, &ft_matrix); + int load_flags = FXFT_LOAD_NO_BITMAP; + if (!(m_Face->face_flags & FT_FACE_FLAG_SFNT) || !FT_IS_TRICKY(m_Face)) + load_flags |= FT_LOAD_NO_HINTING; + if (FXFT_Load_Glyph(m_Face, glyph_index, load_flags)) + return nullptr; + if (m_pSubstFont && !(m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && + m_pSubstFont->m_Weight > 400) { + uint32_t index = (m_pSubstFont->m_Weight - 400) / 10; + index = std::min(index, static_cast(kWeightPowArraySize - 1)); + int level = 0; + if (m_pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) + level = s_WeightPow_SHIFTJIS[index] * 2 * 65536 / 36655; + else + level = s_WeightPow[index] * 2; + FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level); + } + + FXFT_Outline_Funcs funcs; + funcs.move_to = Outline_MoveTo; + funcs.line_to = Outline_LineTo; + funcs.conic_to = Outline_ConicTo; + funcs.cubic_to = Outline_CubicTo; + funcs.shift = 0; + funcs.delta = 0; + + OUTLINE_PARAMS params; + auto pPath = pdfium::MakeUnique(); + params.m_pPath = pPath.get(); + params.m_CurX = params.m_CurY = 0; + params.m_CoordUnit = 64 * 64.0; + + FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, ¶ms); + if (pPath->GetPoints().empty()) + return nullptr; + + Outline_CheckEmptyContour(¶ms); + pPath->ClosePath(); + + return pPath.release(); +} + +const CFX_GlyphBitmap* CFX_Font::LoadGlyphBitmap(uint32_t glyph_index, + bool bFontStyle, + const CFX_Matrix* pMatrix, + int dest_width, + int anti_alias, + int& text_flags) const { + return GetFaceCache()->LoadGlyphBitmap(this, glyph_index, bFontStyle, pMatrix, + dest_width, anti_alias, text_flags); +} + +const CFX_PathData* CFX_Font::LoadGlyphPath(uint32_t glyph_index, + int dest_width) const { + return GetFaceCache()->LoadGlyphPath(this, glyph_index, dest_width); +} + +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ +CFX_TypeFace* CFX_Font::GetDeviceCache() const { + return GetFaceCache()->GetDeviceCache(this); +} +#endif diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_fontcache.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_fontcache.cpp new file mode 100644 index 000000000000..58cee06d42cc --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_fontcache.cpp @@ -0,0 +1,67 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/cfx_fontcache.h" + +#include +#include + +#include "core/fxge/cfx_facecache.h" +#include "core/fxge/fx_font.h" +#include "core/fxge/fx_freetype.h" + +CFX_FontCache::CountedFaceCache::CountedFaceCache() {} + +CFX_FontCache::CountedFaceCache::~CountedFaceCache() {} + +CFX_FontCache::CFX_FontCache() {} + +CFX_FontCache::~CFX_FontCache() { + ASSERT(m_ExtFaceMap.empty()); + ASSERT(m_FTFaceMap.empty()); +} + +CFX_FaceCache* CFX_FontCache::GetCachedFace(const CFX_Font* pFont) { + FXFT_Face face = pFont->GetFace(); + const bool bExternal = !face; + CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap; + auto it = map.find(face); + if (it != map.end()) { + CountedFaceCache* counted_face_cache = it->second.get(); + counted_face_cache->m_nCount++; + return counted_face_cache->m_Obj.get(); + } + + std::unique_ptr counted_face_cache(new CountedFaceCache); + counted_face_cache->m_nCount = 2; + CFX_FaceCache* face_cache = new CFX_FaceCache(bExternal ? nullptr : face); + counted_face_cache->m_Obj.reset(face_cache); + map[face] = std::move(counted_face_cache); + return face_cache; +} + +#ifdef _SKIA_SUPPORT_ +CFX_TypeFace* CFX_FontCache::GetDeviceCache(const CFX_Font* pFont) { + return GetCachedFace(pFont)->GetDeviceCache(pFont); +} +#endif + +void CFX_FontCache::ReleaseCachedFace(const CFX_Font* pFont) { + FXFT_Face face = pFont->GetFace(); + const bool bExternal = !face; + CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap; + + auto it = map.find(face); + if (it == map.end()) + return; + + CountedFaceCache* counted_face_cache = it->second.get(); + if (counted_face_cache->m_nCount > 2) { + counted_face_cache->m_nCount--; + } else { + map.erase(it); + } +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_fontmapper.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_fontmapper.cpp new file mode 100644 index 000000000000..064fc9610aae --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_fontmapper.cpp @@ -0,0 +1,820 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/cfx_fontmapper.h" + +#include +#include +#include + +#include "core/fxge/cfx_substfont.h" +#include "core/fxge/fx_font.h" +#include "core/fxge/ifx_systemfontinfo.h" + +#include "third_party/base/stl_util.h" + +#define FX_FONT_STYLE_None 0x00 +#define FX_FONT_STYLE_Bold 0x01 +#define FX_FONT_STYLE_Italic 0x02 +#define FX_FONT_STYLE_BoldBold 0x04 + +namespace { + +const int kNumStandardFonts = 14; + +const FX_CHAR* const g_Base14FontNames[kNumStandardFonts] = { + "Courier", + "Courier-Bold", + "Courier-BoldOblique", + "Courier-Oblique", + "Helvetica", + "Helvetica-Bold", + "Helvetica-BoldOblique", + "Helvetica-Oblique", + "Times-Roman", + "Times-Bold", + "Times-BoldItalic", + "Times-Italic", + "Symbol", + "ZapfDingbats", +}; + +const struct AltFontName { + const FX_CHAR* m_pName; + int m_Index; +} g_AltFontNames[] = { + {"Arial", 4}, + {"Arial,Bold", 5}, + {"Arial,BoldItalic", 6}, + {"Arial,Italic", 7}, + {"Arial-Bold", 5}, + {"Arial-BoldItalic", 6}, + {"Arial-BoldItalicMT", 6}, + {"Arial-BoldMT", 5}, + {"Arial-Italic", 7}, + {"Arial-ItalicMT", 7}, + {"ArialBold", 5}, + {"ArialBoldItalic", 6}, + {"ArialItalic", 7}, + {"ArialMT", 4}, + {"ArialMT,Bold", 5}, + {"ArialMT,BoldItalic", 6}, + {"ArialMT,Italic", 7}, + {"ArialRoundedMTBold", 5}, + {"Courier", 0}, + {"Courier,Bold", 1}, + {"Courier,BoldItalic", 2}, + {"Courier,Italic", 3}, + {"Courier-Bold", 1}, + {"Courier-BoldOblique", 2}, + {"Courier-Oblique", 3}, + {"CourierBold", 1}, + {"CourierBoldItalic", 2}, + {"CourierItalic", 3}, + {"CourierNew", 0}, + {"CourierNew,Bold", 1}, + {"CourierNew,BoldItalic", 2}, + {"CourierNew,Italic", 3}, + {"CourierNew-Bold", 1}, + {"CourierNew-BoldItalic", 2}, + {"CourierNew-Italic", 3}, + {"CourierNewBold", 1}, + {"CourierNewBoldItalic", 2}, + {"CourierNewItalic", 3}, + {"CourierNewPS-BoldItalicMT", 2}, + {"CourierNewPS-BoldMT", 1}, + {"CourierNewPS-ItalicMT", 3}, + {"CourierNewPSMT", 0}, + {"CourierStd", 0}, + {"CourierStd-Bold", 1}, + {"CourierStd-BoldOblique", 2}, + {"CourierStd-Oblique", 3}, + {"Helvetica", 4}, + {"Helvetica,Bold", 5}, + {"Helvetica,BoldItalic", 6}, + {"Helvetica,Italic", 7}, + {"Helvetica-Bold", 5}, + {"Helvetica-BoldItalic", 6}, + {"Helvetica-BoldOblique", 6}, + {"Helvetica-Italic", 7}, + {"Helvetica-Oblique", 7}, + {"HelveticaBold", 5}, + {"HelveticaBoldItalic", 6}, + {"HelveticaItalic", 7}, + {"Symbol", 12}, + {"SymbolMT", 12}, + {"Times-Bold", 9}, + {"Times-BoldItalic", 10}, + {"Times-Italic", 11}, + {"Times-Roman", 8}, + {"TimesBold", 9}, + {"TimesBoldItalic", 10}, + {"TimesItalic", 11}, + {"TimesNewRoman", 8}, + {"TimesNewRoman,Bold", 9}, + {"TimesNewRoman,BoldItalic", 10}, + {"TimesNewRoman,Italic", 11}, + {"TimesNewRoman-Bold", 9}, + {"TimesNewRoman-BoldItalic", 10}, + {"TimesNewRoman-Italic", 11}, + {"TimesNewRomanBold", 9}, + {"TimesNewRomanBoldItalic", 10}, + {"TimesNewRomanItalic", 11}, + {"TimesNewRomanPS", 8}, + {"TimesNewRomanPS-Bold", 9}, + {"TimesNewRomanPS-BoldItalic", 10}, + {"TimesNewRomanPS-BoldItalicMT", 10}, + {"TimesNewRomanPS-BoldMT", 9}, + {"TimesNewRomanPS-Italic", 11}, + {"TimesNewRomanPS-ItalicMT", 11}, + {"TimesNewRomanPSMT", 8}, + {"TimesNewRomanPSMT,Bold", 9}, + {"TimesNewRomanPSMT,BoldItalic", 10}, + {"TimesNewRomanPSMT,Italic", 11}, + {"ZapfDingbats", 13}, +}; + +const struct AltFontFamily { + const FX_CHAR* m_pFontName; + const FX_CHAR* m_pFontFamily; +} g_AltFontFamilies[] = { + {"AGaramondPro", "Adobe Garamond Pro"}, + {"BankGothicBT-Medium", "BankGothic Md BT"}, + {"ForteMT", "Forte"}, +}; + +const struct FX_FontStyle { + const FX_CHAR* style; + int32_t len; +} g_FontStyles[] = { + {"Bold", 4}, {"Italic", 6}, {"BoldItalic", 10}, {"Reg", 3}, {"Regular", 7}, +}; + +const struct CODEPAGE_MAP { + uint16_t codepage; + uint8_t charset; +} g_Codepage2CharsetTable[] = { + {0, 1}, {42, 2}, {437, 254}, {850, 255}, {874, 222}, + {932, 128}, {936, 134}, {949, 129}, {950, 136}, {1250, 238}, + {1251, 204}, {1252, 0}, {1253, 161}, {1254, 162}, {1255, 177}, + {1256, 178}, {1257, 186}, {1258, 163}, {1361, 130}, {10000, 77}, + {10001, 78}, {10002, 81}, {10003, 79}, {10004, 84}, {10005, 83}, + {10006, 85}, {10007, 89}, {10008, 80}, {10021, 87}, {10029, 88}, + {10081, 86}, +}; + +int CompareFontFamilyString(const void* key, const void* element) { + CFX_ByteString str_key((const FX_CHAR*)key); + const AltFontFamily* family = reinterpret_cast(element); + if (str_key.Find(family->m_pFontName) != -1) + return 0; + return FXSYS_stricmp(reinterpret_cast(key), + family->m_pFontName); +} + +int CompareString(const void* key, const void* element) { + return FXSYS_stricmp(reinterpret_cast(key), + reinterpret_cast(element)->m_pName); +} + +CFX_ByteString TT_NormalizeName(const FX_CHAR* family) { + CFX_ByteString norm(family); + norm.Remove(' '); + norm.Remove('-'); + norm.Remove(','); + int pos = norm.Find('+'); + if (pos > 0) + norm = norm.Left(pos); + norm.MakeLower(); + return norm; +} + +uint8_t GetCharsetFromCodePage(uint16_t codepage) { + const CODEPAGE_MAP* pEnd = + g_Codepage2CharsetTable + FX_ArraySize(g_Codepage2CharsetTable); + const CODEPAGE_MAP* pCharmap = + std::lower_bound(g_Codepage2CharsetTable, pEnd, codepage, + [](const CODEPAGE_MAP& charset, uint16_t page) { + return charset.codepage < page; + }); + if (pCharmap < pEnd && codepage == pCharmap->codepage) + return pCharmap->charset; + return FXFONT_DEFAULT_CHARSET; +} + +CFX_ByteString GetFontFamily(CFX_ByteString fontName, int nStyle) { + if (fontName.Find("Script") >= 0) { + if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) + fontName = "ScriptMTBold"; + else if (fontName.Find("Palace") >= 0) + fontName = "PalaceScriptMT"; + else if (fontName.Find("French") >= 0) + fontName = "FrenchScriptMT"; + else if (fontName.Find("FreeStyle") >= 0) + fontName = "FreeStyleScript"; + return fontName; + } + AltFontFamily* found = reinterpret_cast(FXSYS_bsearch( + fontName.c_str(), g_AltFontFamilies, FX_ArraySize(g_AltFontFamilies), + sizeof(AltFontFamily), CompareFontFamilyString)); + return found ? CFX_ByteString(found->m_pFontFamily) : fontName; +} + +CFX_ByteString ParseStyle(const FX_CHAR* pStyle, int iLen, int iIndex) { + CFX_ByteTextBuf buf; + if (!iLen || iLen <= iIndex) + return buf.MakeString(); + while (iIndex < iLen) { + if (pStyle[iIndex] == ',') + break; + buf.AppendChar(pStyle[iIndex]); + ++iIndex; + } + return buf.MakeString(); +} + +int32_t GetStyleType(const CFX_ByteString& bsStyle, bool bReverse) { + int32_t iLen = bsStyle.GetLength(); + if (!iLen) + return -1; + int iSize = FX_ArraySize(g_FontStyles); + const FX_FontStyle* pStyle = nullptr; + for (int i = iSize - 1; i >= 0; --i) { + pStyle = g_FontStyles + i; + if (!pStyle || pStyle->len > iLen) + continue; + + if (bReverse) { + if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) + return i; + } else { + if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) + return i; + } + } + return -1; +} + +bool CheckSupportThirdPartFont(CFX_ByteString name, int& PitchFamily) { + if (name == "MyriadPro") { + PitchFamily &= ~FXFONT_FF_ROMAN; + return true; + } + return false; +} + +void UpdatePitchFamily(uint32_t flags, int& PitchFamily) { + if (flags & FXFONT_SERIF) + PitchFamily |= FXFONT_FF_ROMAN; + if (flags & FXFONT_SCRIPT) + PitchFamily |= FXFONT_FF_SCRIPT; + if (flags & FXFONT_FIXED_PITCH) + PitchFamily |= FXFONT_FF_FIXEDPITCH; +} + +} // namespace + +CFX_FontMapper::CFX_FontMapper(CFX_FontMgr* mgr) + : m_bListLoaded(false), m_pFontMgr(mgr) { + m_MMFaces[0] = nullptr; + m_MMFaces[1] = nullptr; + FXSYS_memset(m_FoxitFaces, 0, sizeof(m_FoxitFaces)); +} + +CFX_FontMapper::~CFX_FontMapper() { + for (size_t i = 0; i < FX_ArraySize(m_FoxitFaces); ++i) { + if (m_FoxitFaces[i]) + FXFT_Done_Face(m_FoxitFaces[i]); + } + if (m_MMFaces[0]) + FXFT_Done_Face(m_MMFaces[0]); + if (m_MMFaces[1]) + FXFT_Done_Face(m_MMFaces[1]); +} + +void CFX_FontMapper::SetSystemFontInfo( + std::unique_ptr pFontInfo) { + if (!pFontInfo) + return; + + m_pFontInfo = std::move(pFontInfo); +} + +CFX_ByteString CFX_FontMapper::GetPSNameFromTT(void* hFont) { + if (!m_pFontInfo) + return CFX_ByteString(); + + uint32_t size = m_pFontInfo->GetFontData(hFont, kTableNAME, nullptr, 0); + if (!size) + return CFX_ByteString(); + + std::vector buffer(size); + uint8_t* buffer_ptr = buffer.data(); + uint32_t bytes_read = + m_pFontInfo->GetFontData(hFont, kTableNAME, buffer_ptr, size); + return bytes_read == size ? GetNameFromTT(buffer_ptr, bytes_read, 6) + : CFX_ByteString(); +} + +void CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset) { + if (!m_pFontInfo) + return; + + m_FaceArray.push_back({name, static_cast(charset)}); + if (name == m_LastFamily) + return; + + const uint8_t* ptr = name.raw_str(); + bool bLocalized = false; + for (int i = 0; i < name.GetLength(); i++) { + if (ptr[i] > 0x80) { + bLocalized = true; + break; + } + } + + if (bLocalized) { + void* hFont = m_pFontInfo->GetFont(name.c_str()); + if (!hFont) { + int iExact; + hFont = m_pFontInfo->MapFont(0, 0, FXFONT_DEFAULT_CHARSET, 0, + name.c_str(), iExact); + if (!hFont) + return; + } + + CFX_ByteString new_name = GetPSNameFromTT(hFont); + if (!new_name.IsEmpty()) + m_LocalizedTTFonts.push_back(std::make_pair(new_name, name)); + m_pFontInfo->DeleteFont(hFont); + } + m_InstalledTTFonts.push_back(name); + m_LastFamily = name; +} + +void CFX_FontMapper::LoadInstalledFonts() { + if (!m_pFontInfo || m_bListLoaded) + return; + + m_pFontInfo->EnumFontList(this); + m_bListLoaded = true; +} + +CFX_ByteString CFX_FontMapper::MatchInstalledFonts( + const CFX_ByteString& norm_name) { + LoadInstalledFonts(); + int i; + for (i = pdfium::CollectionSize(m_InstalledTTFonts) - 1; i >= 0; i--) { + CFX_ByteString norm1 = TT_NormalizeName(m_InstalledTTFonts[i].c_str()); + if (norm1 == norm_name) + return m_InstalledTTFonts[i]; + } + for (i = pdfium::CollectionSize(m_LocalizedTTFonts) - 1; i >= 0; i--) { + CFX_ByteString norm1 = + TT_NormalizeName(m_LocalizedTTFonts[i].first.c_str()); + if (norm1 == norm_name) + return m_LocalizedTTFonts[i].second; + } + return CFX_ByteString(); +} + +FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, + int iBaseFont, + int italic_angle, + int weight, + int picthfamily) { + if (iBaseFont < kNumStandardFonts) { + if (m_FoxitFaces[iBaseFont]) + return m_FoxitFaces[iBaseFont]; + const uint8_t* pFontData = nullptr; + uint32_t size = 0; + if (m_pFontMgr->GetBuiltinFont(iBaseFont, &pFontData, &size)) { + m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(pFontData, size, 0); + return m_FoxitFaces[iBaseFont]; + } + } + pSubstFont->m_SubstFlags |= FXFONT_SUBST_MM; + pSubstFont->m_ItalicAngle = italic_angle; + if (weight) + pSubstFont->m_Weight = weight; + if (picthfamily & FXFONT_FF_ROMAN) { + pSubstFont->m_Weight = pSubstFont->m_Weight * 4 / 5; + pSubstFont->m_Family = "Chrome Serif"; + if (m_MMFaces[1]) + return m_MMFaces[1]; + const uint8_t* pFontData = nullptr; + uint32_t size = 0; + m_pFontMgr->GetBuiltinFont(14, &pFontData, &size); + m_MMFaces[1] = m_pFontMgr->GetFixedFace(pFontData, size, 0); + return m_MMFaces[1]; + } + pSubstFont->m_Family = "Chrome Sans"; + if (m_MMFaces[0]) + return m_MMFaces[0]; + const uint8_t* pFontData = nullptr; + uint32_t size = 0; + m_pFontMgr->GetBuiltinFont(15, &pFontData, &size); + m_MMFaces[0] = m_pFontMgr->GetFixedFace(pFontData, size, 0); + return m_MMFaces[0]; +} + +FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, + bool bTrueType, + uint32_t flags, + int weight, + int italic_angle, + int WindowCP, + CFX_SubstFont* pSubstFont) { + if (!(flags & FXFONT_USEEXTERNATTR)) { + weight = FXFONT_FW_NORMAL; + italic_angle = 0; + } + CFX_ByteString SubstName = name; + SubstName.Remove(' '); + if (bTrueType && name[0] == '@') + SubstName = name.Mid(1); + PDF_GetStandardFontName(&SubstName); + if (SubstName == "Symbol" && !bTrueType) { + pSubstFont->m_Family = "Chrome Symbol"; + pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET; + return UseInternalSubst(pSubstFont, 12, italic_angle, weight, 0); + } + if (SubstName == "ZapfDingbats") { + pSubstFont->m_Family = "Chrome Dingbats"; + pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET; + return UseInternalSubst(pSubstFont, 13, italic_angle, weight, 0); + } + int iBaseFont = 0; + CFX_ByteString family; + CFX_ByteString style; + bool bHasComma = false; + bool bHasHyphen = false; + int find = SubstName.Find(",", 0); + if (find >= 0) { + family = SubstName.Left(find); + PDF_GetStandardFontName(&family); + style = SubstName.Mid(find + 1); + bHasComma = true; + } else { + family = SubstName; + } + for (; iBaseFont < 12; iBaseFont++) { + if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont])) + break; + } + int PitchFamily = 0; + bool bItalic = false; + uint32_t nStyle = 0; + bool bStyleAvail = false; + if (iBaseFont < 12) { + if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2) + nStyle |= FX_FONT_STYLE_Bold; + if ((iBaseFont % 4) / 2) + nStyle |= FX_FONT_STYLE_Italic; + if (iBaseFont < 4) + PitchFamily |= FXFONT_FF_FIXEDPITCH; + if (iBaseFont >= 8) + PitchFamily |= FXFONT_FF_ROMAN; + } else { + iBaseFont = kNumStandardFonts; + if (!bHasComma) { + find = family.ReverseFind('-'); + if (find >= 0) { + style = family.Mid(find + 1); + family = family.Left(find); + bHasHyphen = true; + } + } + if (!bHasHyphen) { + int nLen = family.GetLength(); + int32_t nRet = GetStyleType(family, true); + if (nRet > -1) { + family = family.Left(nLen - g_FontStyles[nRet].len); + if (nRet == 0) + nStyle |= FX_FONT_STYLE_Bold; + else if (nRet == 1) + nStyle |= FX_FONT_STYLE_Italic; + else if (nRet == 2) + nStyle |= (FX_FONT_STYLE_Bold | FX_FONT_STYLE_Italic); + } + } + UpdatePitchFamily(flags, PitchFamily); + } + if (!style.IsEmpty()) { + int nLen = style.GetLength(); + const FX_CHAR* pStyle = style.c_str(); + int i = 0; + bool bFirstItem = true; + CFX_ByteString buf; + while (i < nLen) { + buf = ParseStyle(pStyle, nLen, i); + int32_t nRet = GetStyleType(buf, false); + if ((i && !bStyleAvail) || (!i && nRet < 0)) { + family = SubstName; + iBaseFont = kNumStandardFonts; + break; + } + if (nRet >= 0) { + bStyleAvail = true; + } + if (nRet == 1) { + if (bFirstItem) { + nStyle |= FX_FONT_STYLE_Italic; + } else { + family = SubstName; + iBaseFont = kNumStandardFonts; + } + break; + } + if (nRet == 0) { + if (nStyle & FX_FONT_STYLE_Bold) + nStyle |= FX_FONT_STYLE_BoldBold; + else + nStyle |= FX_FONT_STYLE_Bold; + bFirstItem = false; + } else if (nRet == 2) { + nStyle |= FX_FONT_STYLE_Italic; + if (nStyle & FX_FONT_STYLE_Bold) + nStyle |= FX_FONT_STYLE_BoldBold; + else + nStyle |= FX_FONT_STYLE_Bold; + bFirstItem = false; + } + i += buf.GetLength() + 1; + } + } + weight = weight ? weight : FXFONT_FW_NORMAL; + int old_weight = weight; + if (nStyle) { + weight = + nStyle & FX_FONT_STYLE_BoldBold + ? 900 + : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL); + } + if (nStyle & FX_FONT_STYLE_Italic) + bItalic = true; + int iExact = 0; + int Charset = FXFONT_ANSI_CHARSET; + if (WindowCP) + Charset = GetCharsetFromCodePage(WindowCP); + else if (iBaseFont == kNumStandardFonts && (flags & FXFONT_SYMBOLIC)) + Charset = FXFONT_SYMBOL_CHARSET; + bool bCJK = + (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET || + Charset == FXFONT_HANGUL_CHARSET || + Charset == FXFONT_CHINESEBIG5_CHARSET); + if (!m_pFontInfo) { + return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, + PitchFamily); + } + family = GetFontFamily(family, nStyle); + CFX_ByteString match = MatchInstalledFonts(TT_NormalizeName(family.c_str())); + if (match.IsEmpty() && family != SubstName && + (!bHasComma && (!bHasHyphen || (bHasHyphen && !bStyleAvail)))) { + match = MatchInstalledFonts(TT_NormalizeName(SubstName.c_str())); + } + if (match.IsEmpty() && iBaseFont >= kNumStandardFonts) { + if (!bCJK) { + if (!CheckSupportThirdPartFont(family, PitchFamily)) { + bItalic = italic_angle != 0; + weight = old_weight; + } +#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ + if (SubstName.Find("Narrow") > 0 || SubstName.Find("Condensed") > 0) + family = "LiberationSansNarrow"; +#elif _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ + if (family.Find("Narrow") > 0 || family.Find("Condensed") > 0) + family = "RobotoCondensed"; +#else + if (family.Find("Narrow") > 0 || family.Find("Condensed") > 0) + family = "ArialNarrow"; +#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ + } else { + pSubstFont->m_bSubstCJK = true; + if (nStyle) + pSubstFont->m_WeightCJK = nStyle ? weight : FXFONT_FW_NORMAL; + if (nStyle & FX_FONT_STYLE_Italic) + pSubstFont->m_bItalicCJK = true; + } + } else { + italic_angle = 0; + weight = + nStyle & FX_FONT_STYLE_BoldBold + ? 900 + : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL); + } + if (!match.IsEmpty() || iBaseFont < kNumStandardFonts) { + if (!match.IsEmpty()) + family = match; + if (iBaseFont < kNumStandardFonts) { + if (nStyle && !(iBaseFont % 4)) { + if ((nStyle & 0x3) == 1) + iBaseFont += 1; + if ((nStyle & 0x3) == 2) + iBaseFont += 3; + if ((nStyle & 0x3) == 3) + iBaseFont += 2; + } + family = g_Base14FontNames[iBaseFont]; + } + } else { + if (flags & FXFONT_ITALIC) + bItalic = true; + } + iExact = !match.IsEmpty(); + void* hFont = m_pFontInfo->MapFont(weight, bItalic, Charset, PitchFamily, + family.c_str(), iExact); + if (iExact) + pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT; + if (!hFont) { +#ifdef PDF_ENABLE_XFA + if (flags & FXFONT_EXACTMATCH) + return nullptr; +#endif // PDF_ENABLE_XFA + if (bCJK) { + bItalic = italic_angle != 0; + weight = old_weight; + } + if (!match.IsEmpty()) { + hFont = m_pFontInfo->GetFont(match.c_str()); + if (!hFont) { + return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, + PitchFamily); + } + } else { + if (Charset == FXFONT_SYMBOL_CHARSET) { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || \ + _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ + if (SubstName == "Symbol") { + pSubstFont->m_Family = "Chrome Symbol"; + pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET; + return UseInternalSubst(pSubstFont, 12, italic_angle, old_weight, + PitchFamily); + } +#endif + return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, + weight, italic_angle, 0, pSubstFont); + } + if (Charset == FXFONT_ANSI_CHARSET) { + return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, + PitchFamily); + } + + auto it = + std::find_if(m_FaceArray.begin(), m_FaceArray.end(), + [Charset](const FaceData& face) { + return face.charset == static_cast(Charset); + }); + if (it == m_FaceArray.end()) { + return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, + PitchFamily); + } + hFont = m_pFontInfo->GetFont(it->name.c_str()); + } + } + if (!hFont) + return nullptr; + + m_pFontInfo->GetFaceName(hFont, SubstName); + if (Charset == FXFONT_DEFAULT_CHARSET) + m_pFontInfo->GetFontCharset(hFont, Charset); + uint32_t ttc_size = m_pFontInfo->GetFontData(hFont, kTableTTCF, nullptr, 0); + uint32_t font_size = m_pFontInfo->GetFontData(hFont, 0, nullptr, 0); + if (font_size == 0 && ttc_size == 0) { + m_pFontInfo->DeleteFont(hFont); + return nullptr; + } + FXFT_Face face = nullptr; + if (ttc_size) + face = GetCachedTTCFace(hFont, kTableTTCF, ttc_size, font_size); + else + face = GetCachedFace(hFont, SubstName, weight, bItalic, font_size); + if (!face) { + m_pFontInfo->DeleteFont(hFont); + return nullptr; + } + pSubstFont->m_Family = SubstName; + pSubstFont->m_Charset = Charset; + bool bNeedUpdateWeight = false; + if (FXFT_Is_Face_Bold(face)) + bNeedUpdateWeight = weight != FXFONT_FW_BOLD; + else + bNeedUpdateWeight = weight != FXFONT_FW_NORMAL; + if (bNeedUpdateWeight) + pSubstFont->m_Weight = weight; + if (bItalic && !FXFT_Is_Face_Italic(face)) { + if (italic_angle == 0) + italic_angle = -12; + else if (FXSYS_abs(italic_angle) < 5) + italic_angle = 0; + pSubstFont->m_ItalicAngle = italic_angle; + } + m_pFontInfo->DeleteFont(hFont); + return face; +} + +#ifdef PDF_ENABLE_XFA +FXFT_Face CFX_FontMapper::FindSubstFontByUnicode(uint32_t dwUnicode, + uint32_t flags, + int weight, + int italic_angle) { + if (!m_pFontInfo) + return nullptr; + + bool bItalic = (flags & FXFONT_ITALIC) != 0; + int PitchFamily = 0; + UpdatePitchFamily(flags, PitchFamily); + void* hFont = + m_pFontInfo->MapFontByUnicode(dwUnicode, weight, bItalic, PitchFamily); + if (!hFont) + return nullptr; + + uint32_t ttc_size = m_pFontInfo->GetFontData(hFont, 0x74746366, nullptr, 0); + uint32_t font_size = m_pFontInfo->GetFontData(hFont, 0, nullptr, 0); + if (font_size == 0 && ttc_size == 0) { + m_pFontInfo->DeleteFont(hFont); + return nullptr; + } + FXFT_Face face = nullptr; + if (ttc_size) { + face = GetCachedTTCFace(hFont, 0x74746366, ttc_size, font_size); + } else { + CFX_ByteString SubstName; + m_pFontInfo->GetFaceName(hFont, SubstName); + face = GetCachedFace(hFont, SubstName, weight, bItalic, font_size); + } + m_pFontInfo->DeleteFont(hFont); + return face; +} +#endif // PDF_ENABLE_XFA + +int CFX_FontMapper::GetFaceSize() const { + return pdfium::CollectionSize(m_FaceArray); +} + +bool CFX_FontMapper::IsBuiltinFace(const FXFT_Face face) const { + for (size_t i = 0; i < MM_FACE_COUNT; ++i) { + if (m_MMFaces[i] == face) + return true; + } + for (size_t i = 0; i < FOXIT_FACE_COUNT; ++i) { + if (m_FoxitFaces[i] == face) + return true; + } + return false; +} + +FXFT_Face CFX_FontMapper::GetCachedTTCFace(void* hFont, + const uint32_t tableTTCF, + uint32_t ttc_size, + uint32_t font_size) { + FXFT_Face face; + uint8_t buffer[1024]; + m_pFontInfo->GetFontData(hFont, tableTTCF, buffer, FX_ArraySize(buffer)); + uint32_t* pBuffer = reinterpret_cast(buffer); + uint32_t checksum = 0; + for (int i = 0; i < 256; i++) + checksum += pBuffer[i]; + uint8_t* pFontData; + face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size, + pFontData); + if (!face) { + pFontData = FX_Alloc(uint8_t, ttc_size); + m_pFontInfo->GetFontData(hFont, tableTTCF, pFontData, ttc_size); + face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, ttc_size, + ttc_size - font_size); + } + return face; +} + +FXFT_Face CFX_FontMapper::GetCachedFace(void* hFont, + CFX_ByteString SubstName, + int weight, + bool bItalic, + uint32_t font_size) { + FXFT_Face face; + uint8_t* pFontData; + face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData); + if (!face) { + pFontData = FX_Alloc(uint8_t, font_size); + m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size); + face = + m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, + font_size, m_pFontInfo->GetFaceIndex(hFont)); + } + return face; +} + +int PDF_GetStandardFontName(CFX_ByteString* name) { + AltFontName* found = static_cast( + FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames), + sizeof(AltFontName), CompareString)); + if (!found) + return -1; + + *name = g_Base14FontNames[found->m_Index]; + return found->m_Index; +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_fontmgr.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_fontmgr.cpp new file mode 100644 index 000000000000..64f647e3f603 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_fontmgr.cpp @@ -0,0 +1,261 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/cfx_fontmgr.h" + +#include +#include + +#include "core/fxge/cfx_fontmapper.h" +#include "core/fxge/cfx_substfont.h" +#include "core/fxge/fontdata/chromefontdata/chromefontdata.h" +#include "core/fxge/fx_font.h" +#include "core/fxge/ge/cttfontdesc.h" +#include "core/fxge/ifx_systemfontinfo.h" +#include "third_party/base/ptr_util.h" + +namespace { + +struct BuiltinFont { + const uint8_t* m_pFontData; + uint32_t m_dwSize; +}; + +const BuiltinFont g_FoxitFonts[14] = { + {g_FoxitFixedFontData, 17597}, + {g_FoxitFixedBoldFontData, 18055}, + {g_FoxitFixedBoldItalicFontData, 19151}, + {g_FoxitFixedItalicFontData, 18746}, + {g_FoxitSansFontData, 15025}, + {g_FoxitSansBoldFontData, 16344}, + {g_FoxitSansBoldItalicFontData, 16418}, + {g_FoxitSansItalicFontData, 16339}, + {g_FoxitSerifFontData, 19469}, + {g_FoxitSerifBoldFontData, 19395}, + {g_FoxitSerifBoldItalicFontData, 20733}, + {g_FoxitSerifItalicFontData, 21227}, + {g_FoxitSymbolFontData, 16729}, + {g_FoxitDingbatsFontData, 29513}, +}; + +const BuiltinFont g_MMFonts[2] = { + {g_FoxitSerifMMFontData, 113417}, + {g_FoxitSansMMFontData, 66919}, +}; + +CFX_ByteString KeyNameFromFace(const CFX_ByteString& face_name, + int weight, + bool bItalic) { + CFX_ByteString key(face_name); + key += ','; + key += CFX_ByteString::FormatInteger(weight); + key += bItalic ? 'I' : 'N'; + return key; +} + +CFX_ByteString KeyNameFromSize(int ttc_size, uint32_t checksum) { + CFX_ByteString key; + key.Format("%d:%d", ttc_size, checksum); + return key; +} + +int GetTTCIndex(const uint8_t* pFontData, + uint32_t ttc_size, + uint32_t font_offset) { + int face_index = 0; + const uint8_t* p = pFontData + 8; + uint32_t nfont = GET_TT_LONG(p); + uint32_t index; + for (index = 0; index < nfont; index++) { + p = pFontData + 12 + index * 4; + if (GET_TT_LONG(p) == font_offset) + break; + } + if (index >= nfont) + face_index = 0; + else + face_index = index; + return face_index; +} + +} // namespace + +CFX_FontMgr::CFX_FontMgr() + : m_FTLibrary(nullptr), m_FTLibrarySupportsHinting(false) { + m_pBuiltinMapper = pdfium::MakeUnique(this); +} + +CFX_FontMgr::~CFX_FontMgr() { + for (const auto& pair : m_FaceMap) + delete pair.second; + + // |m_pBuiltinMapper| references |m_FTLibrary|, so it has to be destroyed + // first. + m_pBuiltinMapper.reset(); + FXFT_Done_FreeType(m_FTLibrary); +} + +void CFX_FontMgr::InitFTLibrary() { + if (m_FTLibrary) + return; + FXFT_Init_FreeType(&m_FTLibrary); + m_FTLibrarySupportsHinting = + FXFT_Library_SetLcdFilter(m_FTLibrary, FT_LCD_FILTER_DEFAULT) != + FT_Err_Unimplemented_Feature; +} + +void CFX_FontMgr::SetSystemFontInfo( + std::unique_ptr pFontInfo) { + m_pBuiltinMapper->SetSystemFontInfo(std::move(pFontInfo)); +} + +FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, + bool bTrueType, + uint32_t flags, + int weight, + int italic_angle, + int CharsetCP, + CFX_SubstFont* pSubstFont) { + InitFTLibrary(); + return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight, + italic_angle, CharsetCP, pSubstFont); +} + +FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name, + int weight, + bool bItalic, + uint8_t*& pFontData) { + auto it = m_FaceMap.find(KeyNameFromFace(face_name, weight, bItalic)); + if (it == m_FaceMap.end()) + return nullptr; + + CTTFontDesc* pFontDesc = it->second; + pFontData = pFontDesc->m_pFontData; + pFontDesc->m_RefCount++; + return pFontDesc->m_SingleFace; +} + +FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name, + int weight, + bool bItalic, + uint8_t* pData, + uint32_t size, + int face_index) { + CTTFontDesc* pFontDesc = new CTTFontDesc; + pFontDesc->m_Type = 1; + pFontDesc->m_SingleFace = nullptr; + pFontDesc->m_pFontData = pData; + pFontDesc->m_RefCount = 1; + + InitFTLibrary(); + FXFT_Library library = m_FTLibrary; + int ret = FXFT_New_Memory_Face(library, pData, size, face_index, + &pFontDesc->m_SingleFace); + if (ret) { + delete pFontDesc; + return nullptr; + } + ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace, 64, 64); + if (ret) { + delete pFontDesc; + return nullptr; + } + m_FaceMap[KeyNameFromFace(face_name, weight, bItalic)] = pFontDesc; + return pFontDesc->m_SingleFace; +} + +FXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size, + uint32_t checksum, + int font_offset, + uint8_t*& pFontData) { + auto it = m_FaceMap.find(KeyNameFromSize(ttc_size, checksum)); + if (it == m_FaceMap.end()) + return nullptr; + + CTTFontDesc* pFontDesc = it->second; + pFontData = pFontDesc->m_pFontData; + pFontDesc->m_RefCount++; + int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset); + if (!pFontDesc->m_TTCFaces[face_index]) { + pFontDesc->m_TTCFaces[face_index] = + GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index); + } + return pFontDesc->m_TTCFaces[face_index]; +} + +FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, + uint32_t checksum, + uint8_t* pData, + uint32_t size, + int font_offset) { + CTTFontDesc* pFontDesc = new CTTFontDesc; + pFontDesc->m_Type = 2; + pFontDesc->m_pFontData = pData; + for (int i = 0; i < 16; i++) + pFontDesc->m_TTCFaces[i] = nullptr; + pFontDesc->m_RefCount++; + m_FaceMap[KeyNameFromSize(ttc_size, checksum)] = pFontDesc; + int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset); + pFontDesc->m_TTCFaces[face_index] = + GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index); + return pFontDesc->m_TTCFaces[face_index]; +} + +FXFT_Face CFX_FontMgr::GetFixedFace(const uint8_t* pData, + uint32_t size, + int face_index) { + InitFTLibrary(); + FXFT_Library library = m_FTLibrary; + FXFT_Face face = nullptr; + if (FXFT_New_Memory_Face(library, pData, size, face_index, &face)) + return nullptr; + return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face; +} + +FXFT_Face CFX_FontMgr::GetFileFace(const FX_CHAR* filename, int face_index) { + InitFTLibrary(); + FXFT_Library library = m_FTLibrary; + FXFT_Face face = nullptr; + if (FXFT_New_Face(library, filename, face_index, &face)) + return nullptr; + return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face; +} + +void CFX_FontMgr::ReleaseFace(FXFT_Face face) { + if (!face) + return; + bool bNeedFaceDone = true; + auto it = m_FaceMap.begin(); + while (it != m_FaceMap.end()) { + auto temp = it++; + int nRet = temp->second->ReleaseFace(face); + if (nRet == -1) + continue; + bNeedFaceDone = false; + if (nRet == 0) + m_FaceMap.erase(temp); + break; + } + if (bNeedFaceDone && !m_pBuiltinMapper->IsBuiltinFace(face)) + FXFT_Done_Face(face); +} + +bool CFX_FontMgr::GetBuiltinFont(size_t index, + const uint8_t** pFontData, + uint32_t* size) { + if (index < FX_ArraySize(g_FoxitFonts)) { + *pFontData = g_FoxitFonts[index].m_pFontData; + *size = g_FoxitFonts[index].m_dwSize; + return true; + } + index -= FX_ArraySize(g_FoxitFonts); + if (index < FX_ArraySize(g_MMFonts)) { + *pFontData = g_MMFonts[index].m_pFontData; + *size = g_MMFonts[index].m_dwSize; + return true; + } + return false; +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_gemodule.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_gemodule.cpp new file mode 100644 index 000000000000..ed6d6cb32e67 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_gemodule.cpp @@ -0,0 +1,72 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/cfx_gemodule.h" + +#include "core/fxge/cfx_fontcache.h" +#include "core/fxge/cfx_fontmgr.h" +#include "core/fxge/ge/cfx_folderfontinfo.h" +#include "core/fxge/ge/fx_text_int.h" + +namespace { + +CFX_GEModule* g_pGEModule = nullptr; + +} // namespace + +CFX_GEModule::CFX_GEModule() + : m_FTLibrary(nullptr), + m_pFontCache(nullptr), + m_pFontMgr(new CFX_FontMgr), + m_pCodecModule(nullptr), + m_pPlatformData(nullptr), + m_pUserFontPaths(nullptr) {} + +CFX_GEModule::~CFX_GEModule() { + delete m_pFontCache; + DestroyPlatform(); +} + +// static +CFX_GEModule* CFX_GEModule::Get() { + if (!g_pGEModule) + g_pGEModule = new CFX_GEModule(); + return g_pGEModule; +} + +// static +void CFX_GEModule::Destroy() { + ASSERT(g_pGEModule); + delete g_pGEModule; + g_pGEModule = nullptr; +} + +void CFX_GEModule::Init(const char** userFontPaths, + CCodec_ModuleMgr* pCodecModule) { + ASSERT(g_pGEModule); + m_pCodecModule = pCodecModule; + m_pUserFontPaths = userFontPaths; + InitPlatform(); + SetTextGamma(2.2f); +} + +CFX_FontCache* CFX_GEModule::GetFontCache() { + if (!m_pFontCache) + m_pFontCache = new CFX_FontCache(); + return m_pFontCache; +} + +void CFX_GEModule::SetTextGamma(FX_FLOAT gammaValue) { + gammaValue /= 2.2f; + for (int i = 0; i < 256; ++i) { + m_GammaValue[i] = static_cast( + FXSYS_pow(static_cast(i) / 255, gammaValue) * 255.0f + 0.5f); + } +} + +const uint8_t* CFX_GEModule::GetTextGammaTable() const { + return m_GammaValue; +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_graphstate.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_graphstate.cpp new file mode 100644 index 000000000000..6357aa51a413 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_graphstate.cpp @@ -0,0 +1,61 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/cfx_graphstate.h" + +#include "core/fpdfapi/parser/cpdf_array.h" + +CFX_GraphState::CFX_GraphState() {} + +CFX_GraphState::CFX_GraphState(const CFX_GraphState& that) + : m_Ref(that.m_Ref) {} + +CFX_GraphState::~CFX_GraphState() {} + +void CFX_GraphState::Emplace() { + m_Ref.Emplace(); +} + +void CFX_GraphState::SetLineDash(CPDF_Array* pArray, + FX_FLOAT phase, + FX_FLOAT scale) { + CFX_GraphStateData* pData = m_Ref.GetPrivateCopy(); + pData->m_DashPhase = phase * scale; + pData->SetDashCount(static_cast(pArray->GetCount())); + for (size_t i = 0; i < pArray->GetCount(); i++) + pData->m_DashArray[i] = pArray->GetNumberAt(i) * scale; +} + +FX_FLOAT CFX_GraphState::GetLineWidth() const { + return m_Ref.GetObject() ? m_Ref.GetObject()->m_LineWidth : 1.f; +} + +void CFX_GraphState::SetLineWidth(FX_FLOAT width) { + m_Ref.GetPrivateCopy()->m_LineWidth = width; +} + +CFX_GraphStateData::LineCap CFX_GraphState::GetLineCap() const { + return m_Ref.GetObject()->m_LineCap; +} +void CFX_GraphState::SetLineCap(CFX_GraphStateData::LineCap cap) { + m_Ref.GetPrivateCopy()->m_LineCap = cap; +} + +CFX_GraphStateData::LineJoin CFX_GraphState::GetLineJoin() const { + return m_Ref.GetObject()->m_LineJoin; +} + +void CFX_GraphState::SetLineJoin(CFX_GraphStateData::LineJoin join) { + m_Ref.GetPrivateCopy()->m_LineJoin = join; +} + +FX_FLOAT CFX_GraphState::GetMiterLimit() const { + return m_Ref.GetObject() ? m_Ref.GetObject()->m_MiterLimit : 10.f; +} + +void CFX_GraphState::SetMiterLimit(FX_FLOAT limit) { + m_Ref.GetPrivateCopy()->m_MiterLimit = limit; +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_graphstatedata.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_graphstatedata.cpp new file mode 100644 index 000000000000..03798a63200c --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_graphstatedata.cpp @@ -0,0 +1,52 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/cfx_graphstatedata.h" + +#include "core/fxcrt/fx_memory.h" +#include "core/fxcrt/fx_system.h" + +CFX_GraphStateData::CFX_GraphStateData() + : m_LineCap(LineCapButt), + m_DashCount(0), + m_DashArray(nullptr), + m_DashPhase(0), + m_LineJoin(LineJoinMiter), + m_MiterLimit(10 * 1.0f), + m_LineWidth(1.0f) {} + +CFX_GraphStateData::CFX_GraphStateData(const CFX_GraphStateData& src) { + m_DashArray = nullptr; + Copy(src); +} + +void CFX_GraphStateData::Copy(const CFX_GraphStateData& src) { + m_LineCap = src.m_LineCap; + m_DashCount = src.m_DashCount; + FX_Free(m_DashArray); + m_DashArray = nullptr; + m_DashPhase = src.m_DashPhase; + m_LineJoin = src.m_LineJoin; + m_MiterLimit = src.m_MiterLimit; + m_LineWidth = src.m_LineWidth; + if (m_DashCount) { + m_DashArray = FX_Alloc(FX_FLOAT, m_DashCount); + FXSYS_memcpy(m_DashArray, src.m_DashArray, m_DashCount * sizeof(FX_FLOAT)); + } +} + +CFX_GraphStateData::~CFX_GraphStateData() { + FX_Free(m_DashArray); +} + +void CFX_GraphStateData::SetDashCount(int count) { + FX_Free(m_DashArray); + m_DashArray = nullptr; + m_DashCount = count; + if (count == 0) + return; + m_DashArray = FX_Alloc(FX_FLOAT, count); +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_pathdata.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_pathdata.cpp new file mode 100644 index 000000000000..9fa2cd2aacfb --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_pathdata.cpp @@ -0,0 +1,485 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/cfx_pathdata.h" + +#include "core/fxcrt/fx_system.h" +#include "third_party/base/numerics/safe_math.h" + +namespace { + +void UpdateLineEndPoints(CFX_FloatRect* rect, + const CFX_PointF& start_pos, + const CFX_PointF& end_pos, + FX_FLOAT hw) { + if (start_pos.x == end_pos.x) { + if (start_pos.y == end_pos.y) { + rect->UpdateRect(end_pos.x + hw, end_pos.y + hw); + rect->UpdateRect(end_pos.x - hw, end_pos.y - hw); + return; + } + + FX_FLOAT point_y; + if (end_pos.y < start_pos.y) + point_y = end_pos.y - hw; + else + point_y = end_pos.y + hw; + + rect->UpdateRect(end_pos.x + hw, point_y); + rect->UpdateRect(end_pos.x - hw, point_y); + return; + } + + if (start_pos.y == end_pos.y) { + FX_FLOAT point_x; + if (end_pos.x < start_pos.x) + point_x = end_pos.x - hw; + else + point_x = end_pos.x + hw; + + rect->UpdateRect(point_x, end_pos.y + hw); + rect->UpdateRect(point_x, end_pos.y - hw); + return; + } + + CFX_PointF diff = end_pos - start_pos; + FX_FLOAT ll = FXSYS_sqrt2(diff.x, diff.y); + FX_FLOAT mx = end_pos.x + hw * diff.x / ll; + FX_FLOAT my = end_pos.y + hw * diff.y / ll; + FX_FLOAT dx1 = hw * diff.y / ll; + FX_FLOAT dy1 = hw * diff.x / ll; + rect->UpdateRect(mx - dx1, my + dy1); + rect->UpdateRect(mx + dx1, my - dy1); +} + +void UpdateLineJoinPoints(CFX_FloatRect* rect, + const CFX_PointF& start_pos, + const CFX_PointF& mid_pos, + const CFX_PointF& end_pos, + FX_FLOAT half_width, + FX_FLOAT miter_limit) { + FX_FLOAT start_k = 0; + FX_FLOAT start_c = 0; + FX_FLOAT end_k = 0; + FX_FLOAT end_c = 0; + FX_FLOAT start_len = 0; + FX_FLOAT start_dc = 0; + FX_FLOAT end_len = 0; + FX_FLOAT end_dc = 0; + FX_FLOAT one_twentieth = 1.0f / 20; + + bool bStartVert = FXSYS_fabs(start_pos.x - mid_pos.x) < one_twentieth; + bool bEndVert = FXSYS_fabs(mid_pos.x - end_pos.x) < one_twentieth; + if (bStartVert && bEndVert) { + int start_dir = mid_pos.y > start_pos.y ? 1 : -1; + FX_FLOAT point_y = mid_pos.y + half_width * start_dir; + rect->UpdateRect(mid_pos.x + half_width, point_y); + rect->UpdateRect(mid_pos.x - half_width, point_y); + return; + } + + if (!bStartVert) { + CFX_PointF start_to_mid = start_pos - mid_pos; + start_k = (mid_pos.y - start_pos.y) / (mid_pos.x - start_pos.x); + start_c = mid_pos.y - (start_k * mid_pos.x); + start_len = FXSYS_sqrt2(start_to_mid.x, start_to_mid.y); + start_dc = static_cast( + FXSYS_fabs(half_width * start_len / start_to_mid.x)); + } + if (!bEndVert) { + CFX_PointF end_to_mid = end_pos - mid_pos; + end_k = end_to_mid.y / end_to_mid.x; + end_c = mid_pos.y - (end_k * mid_pos.x); + end_len = FXSYS_sqrt2(end_to_mid.x, end_to_mid.y); + end_dc = + static_cast(FXSYS_fabs(half_width * end_len / end_to_mid.x)); + } + if (bStartVert) { + CFX_PointF outside(start_pos.x, 0); + if (end_pos.x < start_pos.x) + outside.x += half_width; + else + outside.x -= half_width; + + if (start_pos.y < (end_k * start_pos.x) + end_c) + outside.y = (end_k * outside.x) + end_c + end_dc; + else + outside.y = (end_k * outside.x) + end_c - end_dc; + + rect->UpdateRect(outside.x, outside.y); + return; + } + + if (bEndVert) { + CFX_PointF outside(end_pos.x, 0); + if (start_pos.x < end_pos.x) + outside.x += half_width; + else + outside.x -= half_width; + + if (end_pos.y < (start_k * end_pos.x) + start_c) + outside.y = (start_k * outside.x) + start_c + start_dc; + else + outside.y = (start_k * outside.x) + start_c - start_dc; + + rect->UpdateRect(outside.x, outside.y); + return; + } + + if (FXSYS_fabs(start_k - end_k) < one_twentieth) { + int start_dir = mid_pos.x > start_pos.x ? 1 : -1; + int end_dir = end_pos.x > mid_pos.x ? 1 : -1; + if (start_dir == end_dir) + UpdateLineEndPoints(rect, mid_pos, end_pos, half_width); + else + UpdateLineEndPoints(rect, start_pos, mid_pos, half_width); + return; + } + + FX_FLOAT start_outside_c = start_c; + if (end_pos.y < (start_k * end_pos.x) + start_c) + start_outside_c += start_dc; + else + start_outside_c -= start_dc; + + FX_FLOAT end_outside_c = end_c; + if (start_pos.y < (end_k * start_pos.x) + end_c) + end_outside_c += end_dc; + else + end_outside_c -= end_dc; + + FX_FLOAT join_x = (end_outside_c - start_outside_c) / (start_k - end_k); + FX_FLOAT join_y = start_k * join_x + start_outside_c; + rect->UpdateRect(join_x, join_y); +} + +} // namespace + +FX_PATHPOINT::FX_PATHPOINT() = default; + +FX_PATHPOINT::FX_PATHPOINT(const CFX_PointF& point, FXPT_TYPE type, bool close) + : m_Point(point), m_Type(type), m_CloseFigure(close) {} + +FX_PATHPOINT::FX_PATHPOINT(const FX_PATHPOINT& other) = default; + +FX_PATHPOINT::~FX_PATHPOINT() = default; + +CFX_PathData::CFX_PathData() {} + +CFX_PathData::~CFX_PathData() {} + +CFX_PathData::CFX_PathData(const CFX_PathData& src) : m_Points(src.m_Points) {} + +void CFX_PathData::Clear() { + m_Points.clear(); +} + +void CFX_PathData::ClosePath() { + if (m_Points.empty()) + return; + m_Points.back().m_CloseFigure = true; +} + +void CFX_PathData::Append(const CFX_PathData* pSrc, const CFX_Matrix* pMatrix) { + if (pSrc->m_Points.empty()) + return; + + size_t cur_size = m_Points.size(); + m_Points.insert(m_Points.end(), pSrc->m_Points.begin(), pSrc->m_Points.end()); + + if (!pMatrix) + return; + + for (size_t i = cur_size; i < m_Points.size(); i++) + m_Points[i].m_Point = pMatrix->Transform(m_Points[i].m_Point); +} + +void CFX_PathData::AppendPoint(const CFX_PointF& point, + FXPT_TYPE type, + bool closeFigure) { + m_Points.push_back(FX_PATHPOINT(point, type, closeFigure)); +} + +void CFX_PathData::AppendRect(FX_FLOAT left, + FX_FLOAT bottom, + FX_FLOAT right, + FX_FLOAT top) { + m_Points.push_back( + FX_PATHPOINT(CFX_PointF(left, bottom), FXPT_TYPE::MoveTo, false)); + m_Points.push_back( + FX_PATHPOINT(CFX_PointF(left, top), FXPT_TYPE::LineTo, false)); + m_Points.push_back( + FX_PATHPOINT(CFX_PointF(right, top), FXPT_TYPE::LineTo, false)); + m_Points.push_back( + FX_PATHPOINT(CFX_PointF(right, bottom), FXPT_TYPE::LineTo, false)); + m_Points.push_back( + FX_PATHPOINT(CFX_PointF(left, bottom), FXPT_TYPE::LineTo, true)); +} + +CFX_FloatRect CFX_PathData::GetBoundingBox() const { + if (m_Points.empty()) + return CFX_FloatRect(); + + CFX_FloatRect rect; + rect.InitRect(m_Points[0].m_Point.x, m_Points[0].m_Point.y); + for (size_t i = 1; i < m_Points.size(); i++) + rect.UpdateRect(m_Points[i].m_Point.x, m_Points[i].m_Point.y); + return rect; +} + +CFX_FloatRect CFX_PathData::GetBoundingBox(FX_FLOAT line_width, + FX_FLOAT miter_limit) const { + CFX_FloatRect rect(100000.0f, 100000.0f, -100000.0f, -100000.0f); + size_t iPoint = 0; + FX_FLOAT half_width = line_width; + int iStartPoint = 0; + int iEndPoint = 0; + int iMiddlePoint = 0; + bool bJoin; + while (iPoint < m_Points.size()) { + if (m_Points[iPoint].IsTypeAndOpen(FXPT_TYPE::MoveTo)) { + iStartPoint = iPoint + 1; + iEndPoint = iPoint; + bJoin = false; + } else { + if (m_Points[iPoint].IsTypeAndOpen(FXPT_TYPE::BezierTo)) { + rect.UpdateRect(m_Points[iPoint].m_Point.x, m_Points[iPoint].m_Point.y); + rect.UpdateRect(m_Points[iPoint + 1].m_Point.x, + m_Points[iPoint + 1].m_Point.y); + iPoint += 2; + } + if (iPoint == m_Points.size() - 1 || + m_Points[iPoint + 1].IsTypeAndOpen(FXPT_TYPE::MoveTo)) { + iStartPoint = iPoint - 1; + iEndPoint = iPoint; + bJoin = false; + } else { + iStartPoint = iPoint - 1; + iMiddlePoint = iPoint; + iEndPoint = iPoint + 1; + bJoin = true; + } + } + + CFX_PointF start_pos = m_Points[iStartPoint].m_Point; + CFX_PointF end_pos = m_Points[iEndPoint].m_Point; + if (bJoin) { + CFX_PointF mid_pos = m_Points[iMiddlePoint].m_Point; + UpdateLineJoinPoints(&rect, start_pos, mid_pos, end_pos, half_width, + miter_limit); + } else { + UpdateLineEndPoints(&rect, start_pos, end_pos, half_width); + } + iPoint++; + } + return rect; +} + +void CFX_PathData::Transform(const CFX_Matrix* pMatrix) { + if (!pMatrix) + return; + for (auto& point : m_Points) + point.m_Point = pMatrix->Transform(point.m_Point); +} + +bool CFX_PathData::GetZeroAreaPath(const CFX_Matrix* pMatrix, + bool bAdjust, + CFX_PathData* NewPath, + bool* bThin, + bool* setIdentity) const { + *setIdentity = false; + if (m_Points.size() < 3) + return false; + + if (m_Points.size() == 3 && m_Points[0].m_Type == FXPT_TYPE::MoveTo && + m_Points[1].m_Type == FXPT_TYPE::LineTo && + m_Points[2].m_Type == FXPT_TYPE::LineTo && + m_Points[0].m_Point == m_Points[2].m_Point) { + for (size_t i = 0; i < 2; i++) { + CFX_PointF point = m_Points[i].m_Point; + if (bAdjust) { + if (pMatrix) + point = pMatrix->Transform(point); + + point = CFX_PointF(static_cast(point.x) + 0.5f, + static_cast(point.y) + 0.5f); + } + NewPath->AppendPoint( + point, i == 0 ? FXPT_TYPE::MoveTo : FXPT_TYPE::LineTo, false); + } + if (bAdjust && pMatrix) + *setIdentity = true; + + // Note, they both have to be not equal. + if (m_Points[0].m_Point.x != m_Points[1].m_Point.x && + m_Points[0].m_Point.y != m_Points[1].m_Point.y) { + *bThin = true; + } + return true; + } + + if (((m_Points.size() > 3) && (m_Points.size() % 2))) { + int mid = m_Points.size() / 2; + bool bZeroArea = false; + CFX_PathData t_path; + for (int i = 0; i < mid; i++) { + if (!(m_Points[mid - i - 1].m_Point == m_Points[mid + i + 1].m_Point && + m_Points[mid - i - 1].m_Type != FXPT_TYPE::BezierTo && + m_Points[mid + i + 1].m_Type != FXPT_TYPE::BezierTo)) { + bZeroArea = true; + break; + } + + t_path.AppendPoint(m_Points[mid - i].m_Point, FXPT_TYPE::MoveTo, false); + t_path.AppendPoint(m_Points[mid - i - 1].m_Point, FXPT_TYPE::LineTo, + false); + } + if (!bZeroArea) { + NewPath->Append(&t_path, nullptr); + *bThin = true; + return true; + } + } + + int stratPoint = 0; + int next = 0; + for (size_t i = 0; i < m_Points.size(); i++) { + FXPT_TYPE point_type = m_Points[i].m_Type; + if (point_type == FXPT_TYPE::MoveTo) { + stratPoint = i; + } else if (point_type == FXPT_TYPE::LineTo) { + next = (i + 1 - stratPoint) % (m_Points.size() - stratPoint) + stratPoint; + if (m_Points[next].m_Type != FXPT_TYPE::BezierTo && + m_Points[next].m_Type != FXPT_TYPE::MoveTo) { + if ((m_Points[i - 1].m_Point.x == m_Points[i].m_Point.x && + m_Points[i].m_Point.x == m_Points[next].m_Point.x) && + ((m_Points[i].m_Point.y - m_Points[i - 1].m_Point.y) * + (m_Points[i].m_Point.y - m_Points[next].m_Point.y) > + 0)) { + int pre = i; + if (FXSYS_fabs(m_Points[i].m_Point.y - m_Points[i - 1].m_Point.y) < + FXSYS_fabs(m_Points[i].m_Point.y - m_Points[next].m_Point.y)) { + pre--; + next--; + } + + NewPath->AppendPoint(m_Points[pre].m_Point, FXPT_TYPE::MoveTo, false); + NewPath->AppendPoint(m_Points[next].m_Point, FXPT_TYPE::LineTo, + false); + } else if ((m_Points[i - 1].m_Point.y == m_Points[i].m_Point.y && + m_Points[i].m_Point.y == m_Points[next].m_Point.y) && + ((m_Points[i].m_Point.x - m_Points[i - 1].m_Point.x) * + (m_Points[i].m_Point.x - m_Points[next].m_Point.x) > + 0)) { + int pre = i; + if (FXSYS_fabs(m_Points[i].m_Point.x - m_Points[i - 1].m_Point.x) < + FXSYS_fabs(m_Points[i].m_Point.x - m_Points[next].m_Point.x)) { + pre--; + next--; + } + + NewPath->AppendPoint(m_Points[pre].m_Point, FXPT_TYPE::MoveTo, false); + NewPath->AppendPoint(m_Points[next].m_Point, FXPT_TYPE::LineTo, + false); + } else if (m_Points[i - 1].m_Type == FXPT_TYPE::MoveTo && + m_Points[next].m_Type == FXPT_TYPE::LineTo && + m_Points[i - 1].m_Point == m_Points[next].m_Point && + m_Points[next].m_CloseFigure) { + NewPath->AppendPoint(m_Points[i - 1].m_Point, FXPT_TYPE::MoveTo, + false); + NewPath->AppendPoint(m_Points[i].m_Point, FXPT_TYPE::LineTo, false); + *bThin = true; + } + } + } else if (point_type == FXPT_TYPE::BezierTo) { + i += 2; + continue; + } + } + + size_t new_path_size = NewPath->GetPoints().size(); + if (m_Points.size() > 3 && new_path_size > 0) + *bThin = true; + return new_path_size != 0; +} + +bool CFX_PathData::IsRect() const { + if (m_Points.size() != 5 && m_Points.size() != 4) + return false; + + if ((m_Points.size() == 5 && m_Points[0].m_Point != m_Points[4].m_Point) || + m_Points[0].m_Point == m_Points[2].m_Point || + m_Points[1].m_Point == m_Points[3].m_Point) { + return false; + } + // Note, both x,y have to not equal. + if (m_Points[0].m_Point.x != m_Points[3].m_Point.x && + m_Points[0].m_Point.y != m_Points[3].m_Point.y) { + return false; + } + + for (int i = 1; i < 4; i++) { + if (m_Points[i].m_Type != FXPT_TYPE::LineTo) + return false; + // Note, both x,y have to not equal. + if (m_Points[i].m_Point.x != m_Points[i - 1].m_Point.x && + m_Points[i].m_Point.y != m_Points[i - 1].m_Point.y) { + return false; + } + } + return m_Points.size() == 5 || m_Points[3].m_CloseFigure; +} + +bool CFX_PathData::IsRect(const CFX_Matrix* pMatrix, + CFX_FloatRect* pRect) const { + if (!pMatrix) { + if (!IsRect()) + return false; + + if (pRect) { + pRect->left = m_Points[0].m_Point.x; + pRect->right = m_Points[2].m_Point.x; + pRect->bottom = m_Points[0].m_Point.y; + pRect->top = m_Points[2].m_Point.y; + pRect->Normalize(); + } + return true; + } + + if (m_Points.size() != 5 && m_Points.size() != 4) + return false; + + if ((m_Points.size() == 5 && m_Points[0].m_Point != m_Points[4].m_Point) || + m_Points[1].m_Point == m_Points[3].m_Point) { + return false; + } + // Note, both x,y not equal. + if (m_Points.size() == 4 && m_Points[0].m_Point.x != m_Points[3].m_Point.x && + m_Points[0].m_Point.y != m_Points[3].m_Point.y) { + return false; + } + + CFX_PointF points[5]; + for (size_t i = 0; i < m_Points.size(); i++) { + points[i] = pMatrix->Transform(m_Points[i].m_Point); + + if (i == 0) + continue; + if (m_Points[i].m_Type != FXPT_TYPE::LineTo) + return false; + if (points[i].x != points[i - 1].x && points[i].y != points[i - 1].y) + return false; + } + + if (pRect) { + pRect->left = points[0].x; + pRect->right = points[2].x; + pRect->bottom = points[0].y; + pRect->top = points[2].y; + pRect->Normalize(); + } + return true; +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_renderdevice.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_renderdevice.cpp new file mode 100644 index 000000000000..daa67ccc91bd --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_renderdevice.cpp @@ -0,0 +1,1112 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/cfx_renderdevice.h" + +#include +#include +#include +#include + +#include "core/fxcrt/fx_safe_types.h" +#include "core/fxge/cfx_facecache.h" +#include "core/fxge/cfx_fxgedevice.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/ifx_renderdevicedriver.h" + +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ +#include "third_party/skia/include/core/SkTypes.h" +#endif + +namespace { + +void AdjustGlyphSpace(std::vector* pGlyphAndPos) { + ASSERT(pGlyphAndPos->size() > 1); + std::vector& glyphs = *pGlyphAndPos; + bool bVertical = glyphs.back().m_Origin.x == glyphs.front().m_Origin.x; + if (!bVertical && (glyphs.back().m_Origin.y != glyphs.front().m_Origin.y)) + return; + + for (size_t i = glyphs.size() - 1; i > 1; --i) { + FXTEXT_GLYPHPOS& next = glyphs[i]; + int next_origin = bVertical ? next.m_Origin.y : next.m_Origin.x; + FX_FLOAT next_origin_f = bVertical ? next.m_fOrigin.y : next.m_fOrigin.x; + + FXTEXT_GLYPHPOS& current = glyphs[i - 1]; + int& current_origin = bVertical ? current.m_Origin.y : current.m_Origin.x; + FX_FLOAT current_origin_f = + bVertical ? current.m_fOrigin.y : current.m_fOrigin.x; + + int space = next_origin - current_origin; + FX_FLOAT space_f = next_origin_f - current_origin_f; + FX_FLOAT error = + FXSYS_fabs(space_f) - FXSYS_fabs(static_cast(space)); + if (error > 0.5f) + current_origin += space > 0 ? -1 : 1; + } +} + +const uint8_t g_TextGammaAdjust[256] = { + 0, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 18, + 19, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, + 36, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 250, 251, 252, 253, 254, + 255, +}; + +int TextGammaAdjust(int value) { + ASSERT(value >= 0); + ASSERT(value <= 255); + return g_TextGammaAdjust[value]; +} + +int CalcAlpha(int src, int alpha) { + return src * alpha / 255; +} + +void Merge(uint8_t src, int channel, int alpha, uint8_t* dest) { + *dest = FXDIB_ALPHA_MERGE(*dest, channel, CalcAlpha(src, alpha)); +} + +void MergeGammaAdjust(uint8_t src, int channel, int alpha, uint8_t* dest) { + *dest = + FXDIB_ALPHA_MERGE(*dest, channel, CalcAlpha(TextGammaAdjust(src), alpha)); +} + +void MergeGammaAdjustBgr(const uint8_t* src, + int r, + int g, + int b, + int a, + uint8_t* dest) { + MergeGammaAdjust(src[0], b, a, &dest[0]); + MergeGammaAdjust(src[1], g, a, &dest[1]); + MergeGammaAdjust(src[2], r, a, &dest[2]); +} + +void MergeGammaAdjustRgb(const uint8_t* src, + int r, + int g, + int b, + int a, + uint8_t* dest) { + MergeGammaAdjust(src[2], b, a, &dest[0]); + MergeGammaAdjust(src[1], g, a, &dest[1]); + MergeGammaAdjust(src[0], r, a, &dest[2]); +} + +int AverageRgb(const uint8_t* src) { + return (src[0] + src[1] + src[2]) / 3; +} + +uint8_t CalculateDestAlpha(uint8_t back_alpha, int src_alpha) { + return back_alpha + src_alpha - back_alpha * src_alpha / 255; +} + +void ApplyDestAlpha(uint8_t back_alpha, + int src_alpha, + int r, + int g, + int b, + uint8_t* dest) { + uint8_t dest_alpha = CalculateDestAlpha(back_alpha, src_alpha); + int alpha_ratio = src_alpha * 255 / dest_alpha; + dest[0] = FXDIB_ALPHA_MERGE(dest[0], b, alpha_ratio); + dest[1] = FXDIB_ALPHA_MERGE(dest[1], g, alpha_ratio); + dest[2] = FXDIB_ALPHA_MERGE(dest[2], r, alpha_ratio); + dest[3] = dest_alpha; +} + +void NormalizeRgbDst(int src_value, int r, int g, int b, int a, uint8_t* dest) { + int src_alpha = CalcAlpha(TextGammaAdjust(src_value), a); + dest[0] = FXDIB_ALPHA_MERGE(dest[0], b, src_alpha); + dest[1] = FXDIB_ALPHA_MERGE(dest[1], g, src_alpha); + dest[2] = FXDIB_ALPHA_MERGE(dest[2], r, src_alpha); +} + +void NormalizeRgbSrc(int src_value, int r, int g, int b, int a, uint8_t* dest) { + int src_alpha = CalcAlpha(TextGammaAdjust(src_value), a); + if (src_alpha == 0) + return; + + dest[0] = FXDIB_ALPHA_MERGE(dest[0], b, src_alpha); + dest[1] = FXDIB_ALPHA_MERGE(dest[1], g, src_alpha); + dest[2] = FXDIB_ALPHA_MERGE(dest[2], r, src_alpha); +} + +void NormalizeArgbDest(int src_value, + int r, + int g, + int b, + int a, + uint8_t* dest) { + int src_alpha = CalcAlpha(TextGammaAdjust(src_value), a); + uint8_t back_alpha = dest[3]; + if (back_alpha == 0) { + FXARGB_SETDIB(dest, FXARGB_MAKE(src_alpha, r, g, b)); + } else if (src_alpha != 0) { + ApplyDestAlpha(back_alpha, src_alpha, r, g, b, dest); + } +} + +void NormalizeArgbSrc(int src_value, + int r, + int g, + int b, + int a, + uint8_t* dest) { + int src_alpha = CalcAlpha(TextGammaAdjust(src_value), a); + if (src_alpha == 0) + return; + + uint8_t back_alpha = dest[3]; + if (back_alpha == 0) { + FXARGB_SETDIB(dest, FXARGB_MAKE(src_alpha, r, g, b)); + } else { + ApplyDestAlpha(back_alpha, src_alpha, r, g, b, dest); + } +} + +void NextPixel(uint8_t** src_scan, uint8_t** dst_scan, int bpp) { + *src_scan += 3; + *dst_scan += bpp; +} + +void SetAlpha(uint8_t* alpha) { + alpha[3] = 255; +} + +void SetAlphaDoNothing(uint8_t* alpha) {} + +void DrawNormalTextHelper(CFX_DIBitmap* bitmap, + const CFX_DIBitmap* pGlyph, + int nrows, + int left, + int top, + int start_col, + int end_col, + bool bNormal, + bool bBGRStripe, + int x_subpixel, + int a, + int r, + int g, + int b) { + const bool has_alpha = bitmap->GetFormat() == FXDIB_Argb; + uint8_t* src_buf = pGlyph->GetBuffer(); + int src_pitch = pGlyph->GetPitch(); + uint8_t* dest_buf = bitmap->GetBuffer(); + int dest_pitch = bitmap->GetPitch(); + const int Bpp = has_alpha ? 4 : bitmap->GetBPP() / 8; + auto* pNormalizeSrcFunc = has_alpha ? &NormalizeArgbSrc : &NormalizeRgbDst; + auto* pNormalizeDstFunc = has_alpha ? &NormalizeArgbDest : &NormalizeRgbSrc; + auto* pSetAlpha = has_alpha ? &SetAlpha : &SetAlphaDoNothing; + + for (int row = 0; row < nrows; row++) { + int dest_row = row + top; + if (dest_row < 0 || dest_row >= bitmap->GetHeight()) + continue; + + uint8_t* src_scan = src_buf + row * src_pitch + (start_col - left) * 3; + uint8_t* dest_scan = dest_buf + dest_row * dest_pitch + start_col * Bpp; + if (bBGRStripe) { + if (x_subpixel == 0) { + for (int col = start_col; col < end_col; col++) { + if (has_alpha) { + Merge(src_scan[2], r, a, &dest_scan[2]); + Merge(src_scan[1], g, a, &dest_scan[1]); + Merge(src_scan[0], b, a, &dest_scan[0]); + } else { + MergeGammaAdjustBgr(&src_scan[0], r, g, b, a, &dest_scan[0]); + } + pSetAlpha(dest_scan); + NextPixel(&src_scan, &dest_scan, Bpp); + } + } else if (x_subpixel == 1) { + MergeGammaAdjust(src_scan[1], r, a, &dest_scan[2]); + MergeGammaAdjust(src_scan[0], g, a, &dest_scan[1]); + if (start_col > left) + MergeGammaAdjust(src_scan[-1], b, a, &dest_scan[0]); + pSetAlpha(dest_scan); + NextPixel(&src_scan, &dest_scan, Bpp); + for (int col = start_col + 1; col < end_col - 1; col++) { + MergeGammaAdjustBgr(&src_scan[-1], r, g, b, a, &dest_scan[0]); + pSetAlpha(dest_scan); + NextPixel(&src_scan, &dest_scan, Bpp); + } + } else { + MergeGammaAdjust(src_scan[0], r, a, &dest_scan[2]); + if (start_col > left) { + MergeGammaAdjust(src_scan[-1], g, a, &dest_scan[1]); + MergeGammaAdjust(src_scan[-2], b, a, &dest_scan[0]); + } + pSetAlpha(dest_scan); + NextPixel(&src_scan, &dest_scan, Bpp); + for (int col = start_col + 1; col < end_col - 1; col++) { + MergeGammaAdjustBgr(&src_scan[-2], r, g, b, a, &dest_scan[0]); + pSetAlpha(dest_scan); + NextPixel(&src_scan, &dest_scan, Bpp); + } + } + } else { + if (x_subpixel == 0) { + for (int col = start_col; col < end_col; col++) { + if (bNormal) { + int src_value = AverageRgb(&src_scan[0]); + pNormalizeDstFunc(src_value, r, g, b, a, dest_scan); + } else { + MergeGammaAdjustRgb(&src_scan[0], r, g, b, a, &dest_scan[0]); + pSetAlpha(dest_scan); + } + NextPixel(&src_scan, &dest_scan, Bpp); + } + } else if (x_subpixel == 1) { + if (bNormal) { + int src_value = start_col > left ? AverageRgb(&src_scan[-1]) + : (src_scan[0] + src_scan[1]) / 3; + pNormalizeSrcFunc(src_value, r, g, b, a, dest_scan); + } else { + if (start_col > left) + MergeGammaAdjust(src_scan[-1], r, a, &dest_scan[2]); + MergeGammaAdjust(src_scan[0], g, a, &dest_scan[1]); + MergeGammaAdjust(src_scan[1], b, a, &dest_scan[0]); + pSetAlpha(dest_scan); + } + NextPixel(&src_scan, &dest_scan, Bpp); + for (int col = start_col + 1; col < end_col; col++) { + if (bNormal) { + int src_value = AverageRgb(&src_scan[-1]); + pNormalizeDstFunc(src_value, r, g, b, a, dest_scan); + } else { + MergeGammaAdjustRgb(&src_scan[-1], r, g, b, a, &dest_scan[0]); + pSetAlpha(dest_scan); + } + NextPixel(&src_scan, &dest_scan, Bpp); + } + } else { + if (bNormal) { + int src_value = + start_col > left ? AverageRgb(&src_scan[-2]) : src_scan[0] / 3; + pNormalizeSrcFunc(src_value, r, g, b, a, dest_scan); + } else { + if (start_col > left) { + MergeGammaAdjust(src_scan[-2], r, a, &dest_scan[2]); + MergeGammaAdjust(src_scan[-1], g, a, &dest_scan[1]); + } + MergeGammaAdjust(src_scan[0], b, a, &dest_scan[0]); + pSetAlpha(dest_scan); + } + NextPixel(&src_scan, &dest_scan, Bpp); + for (int col = start_col + 1; col < end_col; col++) { + if (bNormal) { + int src_value = AverageRgb(&src_scan[-2]); + pNormalizeDstFunc(src_value, r, g, b, a, dest_scan); + } else { + MergeGammaAdjustRgb(&src_scan[-2], r, g, b, a, &dest_scan[0]); + pSetAlpha(dest_scan); + } + NextPixel(&src_scan, &dest_scan, Bpp); + } + } + } + } +} + +bool ShouldDrawDeviceText(const CFX_Font* pFont, uint32_t text_flags) { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + if (text_flags & FXFONT_CIDFONT) + return false; + + const CFX_ByteString bsPsName = pFont->GetPsName(); + if (bsPsName.Find("+ZJHL") != -1) + return false; + + if (bsPsName == "CNAAJI+cmex10") + return false; +#endif + return true; +} + +} // namespace + +FXTEXT_CHARPOS::FXTEXT_CHARPOS() + : m_GlyphIndex(0), + m_FontCharWidth(0), +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + m_ExtGID(0), +#endif + m_FallbackFontPosition(0), + m_bGlyphAdjust(false), + m_bFontStyle(false) { +} + +FXTEXT_CHARPOS::FXTEXT_CHARPOS(const FXTEXT_CHARPOS&) = default; + +FXTEXT_CHARPOS::~FXTEXT_CHARPOS(){}; + +CFX_RenderDevice::CFX_RenderDevice() + : m_pBitmap(nullptr), + m_Width(0), + m_Height(0), + m_bpp(0), + m_RenderCaps(0), + m_DeviceClass(0) {} + +CFX_RenderDevice::~CFX_RenderDevice() { +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ + Flush(); +#endif +} + +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ +void CFX_RenderDevice::Flush() { + m_pDeviceDriver.reset(); +} +#endif + +void CFX_RenderDevice::SetDeviceDriver( + std::unique_ptr pDriver) { + m_pDeviceDriver = std::move(pDriver); + InitDeviceInfo(); +} + +void CFX_RenderDevice::InitDeviceInfo() { + m_Width = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_WIDTH); + m_Height = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_HEIGHT); + m_bpp = m_pDeviceDriver->GetDeviceCaps(FXDC_BITS_PIXEL); + m_RenderCaps = m_pDeviceDriver->GetDeviceCaps(FXDC_RENDER_CAPS); + m_DeviceClass = m_pDeviceDriver->GetDeviceCaps(FXDC_DEVICE_CLASS); + if (!m_pDeviceDriver->GetClipBox(&m_ClipBox)) { + m_ClipBox.left = 0; + m_ClipBox.top = 0; + m_ClipBox.right = m_Width; + m_ClipBox.bottom = m_Height; + } +} + +void CFX_RenderDevice::SaveState() { + m_pDeviceDriver->SaveState(); +} + +void CFX_RenderDevice::RestoreState(bool bKeepSaved) { + m_pDeviceDriver->RestoreState(bKeepSaved); + UpdateClipBox(); +} + +int CFX_RenderDevice::GetDeviceCaps(int caps_id) const { + return m_pDeviceDriver->GetDeviceCaps(caps_id); +} +CFX_Matrix CFX_RenderDevice::GetCTM() const { + return m_pDeviceDriver->GetCTM(); +} + +bool CFX_RenderDevice::CreateCompatibleBitmap(CFX_DIBitmap* pDIB, + int width, + int height) const { + if (m_RenderCaps & FXRC_CMYK_OUTPUT) { + return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT + ? FXDIB_Cmyka + : FXDIB_Cmyk); + } + if (m_RenderCaps & FXRC_BYTEMASK_OUTPUT) + return pDIB->Create(width, height, FXDIB_8bppMask); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || defined _SKIA_SUPPORT_PATHS_ + return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT + ? FXDIB_Argb + : FXDIB_Rgb32); +#else + return pDIB->Create( + width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb); +#endif +} + +bool CFX_RenderDevice::SetClip_PathFill(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + int fill_mode) { + if (!m_pDeviceDriver->SetClip_PathFill(pPathData, pObject2Device, + fill_mode)) { + return false; + } + UpdateClipBox(); + return true; +} + +bool CFX_RenderDevice::SetClip_PathStroke( + const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState) { + if (!m_pDeviceDriver->SetClip_PathStroke(pPathData, pObject2Device, + pGraphState)) { + return false; + } + UpdateClipBox(); + return true; +} + +bool CFX_RenderDevice::SetClip_Rect(const FX_RECT& rect) { + CFX_PathData path; + path.AppendRect(rect.left, rect.bottom, rect.right, rect.top); + if (!SetClip_PathFill(&path, nullptr, FXFILL_WINDING)) + return false; + + UpdateClipBox(); + return true; +} + +void CFX_RenderDevice::UpdateClipBox() { + if (m_pDeviceDriver->GetClipBox(&m_ClipBox)) + return; + m_ClipBox.left = 0; + m_ClipBox.top = 0; + m_ClipBox.right = m_Width; + m_ClipBox.bottom = m_Height; +} + +bool CFX_RenderDevice::DrawPathWithBlend(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode, + int blend_type) { + uint8_t stroke_alpha = pGraphState ? FXARGB_A(stroke_color) : 0; + uint8_t fill_alpha = (fill_mode & 3) ? FXARGB_A(fill_color) : 0; + const std::vector& pPoints = pPathData->GetPoints(); + if (stroke_alpha == 0 && pPoints.size() == 2) { + CFX_PointF pos1 = pPoints[0].m_Point; + CFX_PointF pos2 = pPoints[1].m_Point; + if (pObject2Device) { + pos1 = pObject2Device->Transform(pos1); + pos2 = pObject2Device->Transform(pos2); + } + DrawCosmeticLine(pos1.x, pos1.y, pos2.x, pos2.y, fill_color, fill_mode, + blend_type); + return true; + } + + if ((pPoints.size() == 5 || pPoints.size() == 4) && stroke_alpha == 0) { + CFX_FloatRect rect_f; + if (!(fill_mode & FXFILL_RECT_AA) && + pPathData->IsRect(pObject2Device, &rect_f)) { + FX_RECT rect_i = rect_f.GetOuterRect(); + + // Depending on the top/bottom, left/right values of the rect it's + // possible to overflow the Width() and Height() calculations. Check that + // the rect will have valid dimension before continuing. + if (!rect_i.Valid()) + return false; + + int width = (int)FXSYS_ceil(rect_f.right - rect_f.left); + if (width < 1) { + width = 1; + if (rect_i.left == rect_i.right) + rect_i.right++; + } + int height = (int)FXSYS_ceil(rect_f.top - rect_f.bottom); + if (height < 1) { + height = 1; + if (rect_i.bottom == rect_i.top) + rect_i.bottom++; + } + if (rect_i.Width() >= width + 1) { + if (rect_f.left - (FX_FLOAT)(rect_i.left) > + (FX_FLOAT)(rect_i.right) - rect_f.right) { + rect_i.left++; + } else { + rect_i.right--; + } + } + if (rect_i.Height() >= height + 1) { + if (rect_f.top - (FX_FLOAT)(rect_i.top) > + (FX_FLOAT)(rect_i.bottom) - rect_f.bottom) { + rect_i.top++; + } else { + rect_i.bottom--; + } + } + if (FillRectWithBlend(&rect_i, fill_color, blend_type)) + return true; + } + } + if ((fill_mode & 3) && stroke_alpha == 0 && !(fill_mode & FX_FILL_STROKE) && + !(fill_mode & FX_FILL_TEXT_MODE)) { + CFX_PathData newPath; + bool bThin = false; + bool setIdentity = false; + if (pPathData->GetZeroAreaPath(pObject2Device, + !!m_pDeviceDriver->GetDriverType(), &newPath, + &bThin, &setIdentity)) { + CFX_GraphStateData graphState; + graphState.m_LineWidth = 0.0f; + + uint32_t strokecolor = fill_color; + if (bThin) + strokecolor = (((fill_alpha >> 2) << 24) | (strokecolor & 0x00ffffff)); + + const CFX_Matrix* pMatrix = nullptr; + if (pObject2Device && !pObject2Device->IsIdentity() && !setIdentity) + pMatrix = pObject2Device; + + int smooth_path = FX_ZEROAREA_FILL; + if (fill_mode & FXFILL_NOPATHSMOOTH) + smooth_path |= FXFILL_NOPATHSMOOTH; + + m_pDeviceDriver->DrawPath(&newPath, pMatrix, &graphState, 0, strokecolor, + smooth_path, blend_type); + } + } + if ((fill_mode & 3) && fill_alpha && stroke_alpha < 0xff && + (fill_mode & FX_FILL_STROKE)) { + if (m_RenderCaps & FXRC_FILLSTROKE_PATH) { + return m_pDeviceDriver->DrawPath(pPathData, pObject2Device, pGraphState, + fill_color, stroke_color, fill_mode, + blend_type); + } + return DrawFillStrokePath(pPathData, pObject2Device, pGraphState, + fill_color, stroke_color, fill_mode, blend_type); + } + return m_pDeviceDriver->DrawPath(pPathData, pObject2Device, pGraphState, + fill_color, stroke_color, fill_mode, + blend_type); +} + +// This can be removed once PDFium entirely relies on Skia +bool CFX_RenderDevice::DrawFillStrokePath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode, + int blend_type) { + if (!(m_RenderCaps & FXRC_GET_BITS)) + return false; + CFX_FloatRect bbox; + if (pGraphState) { + bbox = pPathData->GetBoundingBox(pGraphState->m_LineWidth, + pGraphState->m_MiterLimit); + } else { + bbox = pPathData->GetBoundingBox(); + } + if (pObject2Device) + pObject2Device->TransformRect(bbox); + + CFX_Matrix ctm = GetCTM(); + FX_FLOAT fScaleX = FXSYS_fabs(ctm.a); + FX_FLOAT fScaleY = FXSYS_fabs(ctm.d); + FX_RECT rect = bbox.GetOuterRect(); + CFX_DIBitmap bitmap, Backdrop; + if (!CreateCompatibleBitmap(&bitmap, FXSYS_round(rect.Width() * fScaleX), + FXSYS_round(rect.Height() * fScaleY))) { + return false; + } + if (bitmap.HasAlpha()) { + bitmap.Clear(0); + Backdrop.Copy(&bitmap); + } else { + if (!m_pDeviceDriver->GetDIBits(&bitmap, rect.left, rect.top)) + return false; + Backdrop.Copy(&bitmap); + } + CFX_FxgeDevice bitmap_device; + bitmap_device.Attach(&bitmap, false, &Backdrop, true); + CFX_Matrix matrix; + if (pObject2Device) + matrix = *pObject2Device; + matrix.Translate(-rect.left, -rect.top); + matrix.Concat(CFX_Matrix(fScaleX, 0, 0, fScaleY, 0, 0)); + if (!bitmap_device.GetDeviceDriver()->DrawPath( + pPathData, &matrix, pGraphState, fill_color, stroke_color, fill_mode, + blend_type)) { + return false; + } +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ + bitmap_device.GetDeviceDriver()->Flush(); +#endif + FX_RECT src_rect(0, 0, FXSYS_round(rect.Width() * fScaleX), + FXSYS_round(rect.Height() * fScaleY)); + return m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, rect.left, rect.top, + FXDIB_BLEND_NORMAL); +} + +bool CFX_RenderDevice::SetPixel(int x, int y, uint32_t color) { + if (m_pDeviceDriver->SetPixel(x, y, color)) + return true; + + FX_RECT rect(x, y, x + 1, y + 1); + return FillRectWithBlend(&rect, color, FXDIB_BLEND_NORMAL); +} + +bool CFX_RenderDevice::FillRectWithBlend(const FX_RECT* pRect, + uint32_t fill_color, + int blend_type) { + if (m_pDeviceDriver->FillRectWithBlend(pRect, fill_color, blend_type)) + return true; + + if (!(m_RenderCaps & FXRC_GET_BITS)) + return false; + + CFX_DIBitmap bitmap; + if (!CreateCompatibleBitmap(&bitmap, pRect->Width(), pRect->Height())) + return false; + + if (!m_pDeviceDriver->GetDIBits(&bitmap, pRect->left, pRect->top)) + return false; + + if (!bitmap.CompositeRect(0, 0, pRect->Width(), pRect->Height(), fill_color, + 0, nullptr)) { + return false; + } + FX_RECT src_rect(0, 0, pRect->Width(), pRect->Height()); + m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, pRect->left, pRect->top, + FXDIB_BLEND_NORMAL); + return true; +} + +bool CFX_RenderDevice::DrawCosmeticLine(FX_FLOAT x1, + FX_FLOAT y1, + FX_FLOAT x2, + FX_FLOAT y2, + uint32_t color, + int fill_mode, + int blend_type) { + if ((color >= 0xff000000) && + m_pDeviceDriver->DrawCosmeticLine(x1, y1, x2, y2, color, blend_type)) { + return true; + } + CFX_GraphStateData graph_state; + CFX_PathData path; + path.AppendPoint(CFX_PointF(x1, y1), FXPT_TYPE::MoveTo, false); + path.AppendPoint(CFX_PointF(x2, y2), FXPT_TYPE::LineTo, false); + return m_pDeviceDriver->DrawPath(&path, nullptr, &graph_state, 0, color, + fill_mode, blend_type); +} + +bool CFX_RenderDevice::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top) { + if (!(m_RenderCaps & FXRC_GET_BITS)) + return false; + return m_pDeviceDriver->GetDIBits(pBitmap, left, top); +} + +CFX_DIBitmap* CFX_RenderDevice::GetBackDrop() { + return m_pDeviceDriver->GetBackDrop(); +} + +bool CFX_RenderDevice::SetDIBitsWithBlend(const CFX_DIBSource* pBitmap, + int left, + int top, + int blend_mode) { + ASSERT(!pBitmap->IsAlphaMask()); + CFX_Matrix ctm = GetCTM(); + FX_FLOAT fScaleX = FXSYS_fabs(ctm.a); + FX_FLOAT fScaleY = FXSYS_fabs(ctm.d); + FX_RECT dest_rect(left, top, + FXSYS_round(left + pBitmap->GetWidth() / fScaleX), + FXSYS_round(top + pBitmap->GetHeight() / fScaleY)); + dest_rect.Intersect(m_ClipBox); + if (dest_rect.IsEmpty()) + return true; + FX_RECT src_rect(dest_rect.left - left, dest_rect.top - top, + dest_rect.left - left + dest_rect.Width(), + dest_rect.top - top + dest_rect.Height()); + src_rect.left = FXSYS_round(src_rect.left * fScaleX); + src_rect.top = FXSYS_round(src_rect.top * fScaleY); + src_rect.right = FXSYS_round(src_rect.right * fScaleX); + src_rect.bottom = FXSYS_round(src_rect.bottom * fScaleY); + if ((blend_mode != FXDIB_BLEND_NORMAL && !(m_RenderCaps & FXRC_BLEND_MODE)) || + (pBitmap->HasAlpha() && !(m_RenderCaps & FXRC_ALPHA_IMAGE))) { + if (!(m_RenderCaps & FXRC_GET_BITS)) + return false; + int bg_pixel_width = FXSYS_round(dest_rect.Width() * fScaleX); + int bg_pixel_height = FXSYS_round(dest_rect.Height() * fScaleY); + CFX_DIBitmap background; + if (!background.Create( + bg_pixel_width, bg_pixel_height, + (m_RenderCaps & FXRC_CMYK_OUTPUT) ? FXDIB_Cmyk : FXDIB_Rgb32)) { + return false; + } + if (!m_pDeviceDriver->GetDIBits(&background, dest_rect.left, + dest_rect.top)) { + return false; + } + if (!background.CompositeBitmap(0, 0, bg_pixel_width, bg_pixel_height, + pBitmap, src_rect.left, src_rect.top, + blend_mode, nullptr, false, nullptr)) { + return false; + } + FX_RECT rect(0, 0, bg_pixel_width, bg_pixel_height); + return m_pDeviceDriver->SetDIBits(&background, 0, &rect, dest_rect.left, + dest_rect.top, FXDIB_BLEND_NORMAL); + } + return m_pDeviceDriver->SetDIBits(pBitmap, 0, &src_rect, dest_rect.left, + dest_rect.top, blend_mode); +} + +bool CFX_RenderDevice::StretchDIBitsWithFlagsAndBlend( + const CFX_DIBSource* pBitmap, + int left, + int top, + int dest_width, + int dest_height, + uint32_t flags, + int blend_mode) { + FX_RECT dest_rect(left, top, left + dest_width, top + dest_height); + FX_RECT clip_box = m_ClipBox; + clip_box.Intersect(dest_rect); + if (clip_box.IsEmpty()) + return true; + return m_pDeviceDriver->StretchDIBits(pBitmap, 0, left, top, dest_width, + dest_height, &clip_box, flags, + blend_mode); +} + +bool CFX_RenderDevice::SetBitMask(const CFX_DIBSource* pBitmap, + int left, + int top, + uint32_t argb) { + FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()); + return m_pDeviceDriver->SetDIBits(pBitmap, argb, &src_rect, left, top, + FXDIB_BLEND_NORMAL); +} + +bool CFX_RenderDevice::StretchBitMask(const CFX_DIBSource* pBitmap, + int left, + int top, + int dest_width, + int dest_height, + uint32_t color) { + return StretchBitMaskWithFlags(pBitmap, left, top, dest_width, dest_height, + color, 0); +} + +bool CFX_RenderDevice::StretchBitMaskWithFlags(const CFX_DIBSource* pBitmap, + int left, + int top, + int dest_width, + int dest_height, + uint32_t argb, + uint32_t flags) { + FX_RECT dest_rect(left, top, left + dest_width, top + dest_height); + FX_RECT clip_box = m_ClipBox; + clip_box.Intersect(dest_rect); + return m_pDeviceDriver->StretchDIBits(pBitmap, argb, left, top, dest_width, + dest_height, &clip_box, flags, + FXDIB_BLEND_NORMAL); +} + +bool CFX_RenderDevice::StartDIBitsWithBlend(const CFX_DIBSource* pBitmap, + int bitmap_alpha, + uint32_t argb, + const CFX_Matrix* pMatrix, + uint32_t flags, + void*& handle, + int blend_mode) { + return m_pDeviceDriver->StartDIBits(pBitmap, bitmap_alpha, argb, pMatrix, + flags, handle, blend_mode); +} + +bool CFX_RenderDevice::ContinueDIBits(void* handle, IFX_Pause* pPause) { + return m_pDeviceDriver->ContinueDIBits(handle, pPause); +} + +void CFX_RenderDevice::CancelDIBits(void* handle) { + m_pDeviceDriver->CancelDIBits(handle); +} + +#ifdef _SKIA_SUPPORT_ +void CFX_RenderDevice::DebugVerifyBitmapIsPreMultiplied() const { + SkASSERT(0); +} + +bool CFX_RenderDevice::SetBitsWithMask(const CFX_DIBSource* pBitmap, + const CFX_DIBSource* pMask, + int left, + int top, + int bitmap_alpha, + int blend_type) { + return m_pDeviceDriver->SetBitsWithMask(pBitmap, pMask, left, top, + bitmap_alpha, blend_type); +} +#endif + +bool CFX_RenderDevice::DrawNormalText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + FX_FLOAT font_size, + const CFX_Matrix* pText2Device, + uint32_t fill_color, + uint32_t text_flags) { + int nativetext_flags = text_flags; + if (m_DeviceClass != FXDC_DISPLAY) { + if (!(text_flags & FXTEXT_PRINTGRAPHICTEXT)) { + if (ShouldDrawDeviceText(pFont, text_flags) && + m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pText2Device, + font_size, fill_color)) { + return true; + } + } + if (FXARGB_A(fill_color) < 255) + return false; + } else if (!(text_flags & FXTEXT_NO_NATIVETEXT)) { + if (ShouldDrawDeviceText(pFont, text_flags) && + m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pText2Device, + font_size, fill_color)) { + return true; + } + } + CFX_Matrix char2device; + CFX_Matrix text2Device; + if (pText2Device) { + char2device = *pText2Device; + text2Device = *pText2Device; + } + + char2device.Scale(font_size, -font_size); + if (FXSYS_fabs(char2device.a) + FXSYS_fabs(char2device.b) > 50 * 1.0f || + ((m_DeviceClass == FXDC_PRINTER) && + !(text_flags & FXTEXT_PRINTIMAGETEXT))) { + if (pFont->GetFace()) { + int nPathFlags = + (text_flags & FXTEXT_NOSMOOTH) == 0 ? 0 : FXFILL_NOPATHSMOOTH; + return DrawTextPath(nChars, pCharPos, pFont, font_size, pText2Device, + nullptr, nullptr, fill_color, 0, nullptr, nPathFlags); + } + } + int anti_alias = FXFT_RENDER_MODE_MONO; + bool bNormal = false; + if ((text_flags & FXTEXT_NOSMOOTH) == 0) { + if (m_DeviceClass == FXDC_DISPLAY && m_bpp > 1) { + if (!CFX_GEModule::Get()->GetFontMgr()->FTLibrarySupportsHinting()) { + // Some Freetype implementations (like the one packaged with Fedora) do + // not support hinting due to patents 6219025, 6239783, 6307566, + // 6225973, 6243070, 6393145, 6421054, 6282327, and 6624828; the latest + // one expires 10/7/19. This makes LCD antialiasing very ugly, so we + // instead fall back on NORMAL antialiasing. + anti_alias = FXFT_RENDER_MODE_NORMAL; + } else if ((m_RenderCaps & (FXRC_ALPHA_OUTPUT | FXRC_CMYK_OUTPUT))) { + anti_alias = FXFT_RENDER_MODE_LCD; + bNormal = true; + } else if (m_bpp < 16) { + anti_alias = FXFT_RENDER_MODE_NORMAL; + } else { + anti_alias = FXFT_RENDER_MODE_LCD; + + bool bClearType = false; + if (pFont->GetFace()) + bClearType = !!(text_flags & FXTEXT_CLEARTYPE); + bNormal = !bClearType; + } + } + } + std::vector glyphs(nChars); + CFX_Matrix matrixCTM = GetCTM(); + FX_FLOAT scale_x = FXSYS_fabs(matrixCTM.a); + FX_FLOAT scale_y = FXSYS_fabs(matrixCTM.d); + CFX_Matrix deviceCtm = char2device; + CFX_Matrix m(scale_x, 0, 0, scale_y, 0, 0); + deviceCtm.Concat(m); + text2Device.Concat(m); + + for (size_t i = 0; i < glyphs.size(); ++i) { + FXTEXT_GLYPHPOS& glyph = glyphs[i]; + const FXTEXT_CHARPOS& charpos = pCharPos[i]; + + glyph.m_fOrigin = text2Device.Transform(charpos.m_Origin); + if (anti_alias < FXFT_RENDER_MODE_LCD) + glyph.m_Origin.x = FXSYS_round(glyph.m_fOrigin.x); + else + glyph.m_Origin.x = static_cast(FXSYS_floor(glyph.m_fOrigin.x)); + glyph.m_Origin.y = FXSYS_round(glyph.m_fOrigin.y); + + if (charpos.m_bGlyphAdjust) { + CFX_Matrix new_matrix( + charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1], + charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0); + new_matrix.Concat(deviceCtm); + glyph.m_pGlyph = pFont->LoadGlyphBitmap( + charpos.m_GlyphIndex, charpos.m_bFontStyle, &new_matrix, + charpos.m_FontCharWidth, anti_alias, nativetext_flags); + } else { + glyph.m_pGlyph = pFont->LoadGlyphBitmap( + charpos.m_GlyphIndex, charpos.m_bFontStyle, &deviceCtm, + charpos.m_FontCharWidth, anti_alias, nativetext_flags); + } + } + if (anti_alias < FXFT_RENDER_MODE_LCD && glyphs.size() > 1) + AdjustGlyphSpace(&glyphs); + + FX_RECT bmp_rect1 = FXGE_GetGlyphsBBox(glyphs, anti_alias); + if (scale_x > 1 && scale_y > 1) { + bmp_rect1.left--; + bmp_rect1.top--; + bmp_rect1.right++; + bmp_rect1.bottom++; + } + FX_RECT bmp_rect(FXSYS_round((FX_FLOAT)(bmp_rect1.left) / scale_x), + FXSYS_round((FX_FLOAT)(bmp_rect1.top) / scale_y), + FXSYS_round((FX_FLOAT)bmp_rect1.right / scale_x), + FXSYS_round((FX_FLOAT)bmp_rect1.bottom / scale_y)); + bmp_rect.Intersect(m_ClipBox); + if (bmp_rect.IsEmpty()) + return true; + int pixel_width = FXSYS_round(bmp_rect.Width() * scale_x); + int pixel_height = FXSYS_round(bmp_rect.Height() * scale_y); + int pixel_left = FXSYS_round(bmp_rect.left * scale_x); + int pixel_top = FXSYS_round(bmp_rect.top * scale_y); + if (anti_alias == FXFT_RENDER_MODE_MONO) { + CFX_DIBitmap bitmap; + if (!bitmap.Create(pixel_width, pixel_height, FXDIB_1bppMask)) + return false; + bitmap.Clear(0); + for (const FXTEXT_GLYPHPOS& glyph : glyphs) { + if (!glyph.m_pGlyph) + continue; + const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap; + bitmap.TransferBitmap( + glyph.m_Origin.x + glyph.m_pGlyph->m_Left - pixel_left, + glyph.m_Origin.y - glyph.m_pGlyph->m_Top - pixel_top, + pGlyph->GetWidth(), pGlyph->GetHeight(), pGlyph, 0, 0); + } + return SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color); + } + CFX_DIBitmap bitmap; + if (m_bpp == 8) { + if (!bitmap.Create(pixel_width, pixel_height, FXDIB_8bppMask)) + return false; + } else { + if (!CreateCompatibleBitmap(&bitmap, pixel_width, pixel_height)) + return false; + } + if (!bitmap.HasAlpha() && !bitmap.IsAlphaMask()) { + bitmap.Clear(0xFFFFFFFF); + if (!GetDIBits(&bitmap, bmp_rect.left, bmp_rect.top)) + return false; + } else { + bitmap.Clear(0); + if (bitmap.m_pAlphaMask) + bitmap.m_pAlphaMask->Clear(0); + } + int dest_width = pixel_width; + int a = 0; + int r = 0; + int g = 0; + int b = 0; + if (anti_alias == FXFT_RENDER_MODE_LCD) + ArgbDecode(fill_color, a, r, g, b); + + for (const FXTEXT_GLYPHPOS& glyph : glyphs) { + if (!glyph.m_pGlyph) + continue; + + pdfium::base::CheckedNumeric left = glyph.m_Origin.x; + left += glyph.m_pGlyph->m_Left; + left -= pixel_left; + if (!left.IsValid()) + return false; + + pdfium::base::CheckedNumeric top = glyph.m_Origin.y; + top -= glyph.m_pGlyph->m_Top; + top -= pixel_top; + if (!top.IsValid()) + return false; + + const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap; + int ncols = pGlyph->GetWidth(); + int nrows = pGlyph->GetHeight(); + if (anti_alias == FXFT_RENDER_MODE_NORMAL) { + if (!bitmap.CompositeMask(left.ValueOrDie(), top.ValueOrDie(), ncols, + nrows, pGlyph, fill_color, 0, 0, + FXDIB_BLEND_NORMAL, nullptr, false, 0, + nullptr)) { + return false; + } + continue; + } + bool bBGRStripe = !!(text_flags & FXTEXT_BGR_STRIPE); + ncols /= 3; + int x_subpixel = static_cast(glyph.m_fOrigin.x * 3) % 3; + int start_col = + pdfium::base::ValueOrDieForType(pdfium::base::CheckMax(left, 0)); + pdfium::base::CheckedNumeric end_col_safe = left; + end_col_safe += ncols; + if (!end_col_safe.IsValid()) + return false; + + int end_col = + std::min(static_cast(end_col_safe.ValueOrDie()), dest_width); + if (start_col >= end_col) + continue; + + DrawNormalTextHelper(&bitmap, pGlyph, nrows, left.ValueOrDie(), + top.ValueOrDie(), start_col, end_col, bNormal, + bBGRStripe, x_subpixel, a, r, g, b); + } + if (bitmap.IsAlphaMask()) + SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color); + else + SetDIBits(&bitmap, bmp_rect.left, bmp_rect.top); + return true; +} + +bool CFX_RenderDevice::DrawTextPath(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + FX_FLOAT font_size, + const CFX_Matrix* pText2User, + const CFX_Matrix* pUser2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + FX_ARGB stroke_color, + CFX_PathData* pClippingPath, + int nFlag) { + for (int iChar = 0; iChar < nChars; iChar++) { + const FXTEXT_CHARPOS& charpos = pCharPos[iChar]; + CFX_Matrix matrix; + if (charpos.m_bGlyphAdjust) { + matrix = CFX_Matrix(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1], + charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], + 0, 0); + } + matrix.Concat(CFX_Matrix(font_size, 0, 0, font_size, charpos.m_Origin.x, + charpos.m_Origin.y)); + const CFX_PathData* pPath = + pFont->LoadGlyphPath(charpos.m_GlyphIndex, charpos.m_FontCharWidth); + if (!pPath) + continue; + + matrix.Concat(*pText2User); + + CFX_PathData TransformedPath(*pPath); + TransformedPath.Transform(&matrix); + if (fill_color || stroke_color) { + int fill_mode = nFlag; + if (fill_color) + fill_mode |= FXFILL_WINDING; + fill_mode |= FX_FILL_TEXT_MODE; + if (!DrawPathWithBlend(&TransformedPath, pUser2Device, pGraphState, + fill_color, stroke_color, fill_mode, + FXDIB_BLEND_NORMAL)) { + return false; + } + } + if (pClippingPath) + pClippingPath->Append(&TransformedPath, pUser2Device); + } + return true; +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_substfont.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_substfont.cpp new file mode 100644 index 000000000000..475372e3d900 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_substfont.cpp @@ -0,0 +1,18 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/cfx_substfont.h" + +#include "core/fxge/fx_font.h" + +CFX_SubstFont::CFX_SubstFont() + : m_Charset(FXFONT_ANSI_CHARSET), + m_SubstFlags(0), + m_Weight(0), + m_ItalicAngle(0), + m_bSubstCJK(false), + m_WeightCJK(0), + m_bItalicCJK(false) {} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_unicodeencoding.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_unicodeencoding.cpp new file mode 100644 index 000000000000..cba67ba35466 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_unicodeencoding.cpp @@ -0,0 +1,33 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/cfx_unicodeencoding.h" + +#include "core/fxge/fx_font.h" +#include "core/fxge/fx_freetype.h" + +CFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont) : m_pFont(pFont) {} + +CFX_UnicodeEncoding::~CFX_UnicodeEncoding() {} + +uint32_t CFX_UnicodeEncoding::GlyphFromCharCode(uint32_t charcode) { + FXFT_Face face = m_pFont->GetFace(); + if (!face) + return charcode; + + if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0) + return FXFT_Get_Char_Index(face, charcode); + + if (m_pFont->GetSubstFont() && + m_pFont->GetSubstFont()->m_Charset == FXFONT_SYMBOL_CHARSET) { + uint32_t index = 0; + if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0) + index = FXFT_Get_Char_Index(face, charcode); + if (!index && !FXFT_Select_Charmap(face, FXFT_ENCODING_APPLE_ROMAN)) + return FXFT_Get_Char_Index(face, charcode); + } + return charcode; +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cfx_unicodeencodingex.cpp b/modules/pdfium/pdfium/core/fxge/ge/cfx_unicodeencodingex.cpp new file mode 100644 index 000000000000..c7e3303f0269 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cfx_unicodeencodingex.cpp @@ -0,0 +1,98 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/cfx_unicodeencodingex.h" + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fxge/fx_font.h" +#include "core/fxge/fx_freetype.h" + +namespace { + +const uint32_t g_EncodingID[] = { + FXFM_ENCODING_MS_SYMBOL, FXFM_ENCODING_UNICODE, + FXFM_ENCODING_MS_SJIS, FXFM_ENCODING_MS_GB2312, + FXFM_ENCODING_MS_BIG5, FXFM_ENCODING_MS_WANSUNG, + FXFM_ENCODING_MS_JOHAB, FXFM_ENCODING_ADOBE_STANDARD, + FXFM_ENCODING_ADOBE_EXPERT, FXFM_ENCODING_ADOBE_CUSTOM, + FXFM_ENCODING_ADOBE_LATIN_1, FXFM_ENCODING_OLD_LATIN_2, + FXFM_ENCODING_APPLE_ROMAN, +}; + +CFX_UnicodeEncodingEx* FXFM_CreateFontEncoding(CFX_Font* pFont, + uint32_t nEncodingID) { + if (FXFT_Select_Charmap(pFont->GetFace(), nEncodingID)) + return nullptr; + return new CFX_UnicodeEncodingEx(pFont, nEncodingID); +} + +} // namespace + +CFX_UnicodeEncodingEx::CFX_UnicodeEncodingEx(CFX_Font* pFont, + uint32_t EncodingID) + : CFX_UnicodeEncoding(pFont), m_nEncodingID(EncodingID) {} + +CFX_UnicodeEncodingEx::~CFX_UnicodeEncodingEx() {} + +uint32_t CFX_UnicodeEncodingEx::GlyphFromCharCode(uint32_t charcode) { + FXFT_Face face = m_pFont->GetFace(); + FT_UInt nIndex = FXFT_Get_Char_Index(face, charcode); + if (nIndex > 0) + return nIndex; + int nmaps = FXFT_Get_Face_CharmapCount(face); + int m = 0; + while (m < nmaps) { + uint32_t nEncodingID = + FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[m++]); + if (m_nEncodingID == nEncodingID) + continue; + int error = FXFT_Select_Charmap(face, nEncodingID); + if (error) + continue; + nIndex = FXFT_Get_Char_Index(face, charcode); + if (nIndex > 0) { + m_nEncodingID = nEncodingID; + return nIndex; + } + } + FXFT_Select_Charmap(face, m_nEncodingID); + return 0; +} + +uint32_t CFX_UnicodeEncodingEx::CharCodeFromUnicode(FX_WCHAR Unicode) const { + if (m_nEncodingID == FXFM_ENCODING_UNICODE || + m_nEncodingID == FXFM_ENCODING_MS_SYMBOL) { + return Unicode; + } + FXFT_Face face = m_pFont->GetFace(); + int nmaps = FXFT_Get_Face_CharmapCount(face); + for (int i = 0; i < nmaps; i++) { + int nEncodingID = + FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i]); + if (nEncodingID == FXFM_ENCODING_UNICODE || + nEncodingID == FXFM_ENCODING_MS_SYMBOL) { + return Unicode; + } + } + return CPDF_Font::kInvalidCharCode; +} + +CFX_UnicodeEncodingEx* FX_CreateFontEncodingEx(CFX_Font* pFont, + uint32_t nEncodingID) { + if (!pFont || !pFont->GetFace()) + return nullptr; + + if (nEncodingID != FXFM_ENCODING_NONE) + return FXFM_CreateFontEncoding(pFont, nEncodingID); + + for (size_t i = 0; i < FX_ArraySize(g_EncodingID); ++i) { + CFX_UnicodeEncodingEx* pFontEncoding = + FXFM_CreateFontEncoding(pFont, g_EncodingID[i]); + if (pFontEncoding) + return pFontEncoding; + } + return nullptr; +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cttfontdesc.cpp b/modules/pdfium/pdfium/core/fxge/ge/cttfontdesc.cpp new file mode 100644 index 000000000000..269abfe7f742 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cttfontdesc.cpp @@ -0,0 +1,42 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/ge/cttfontdesc.h" + +#include "core/fxge/fx_freetype.h" + +CTTFontDesc::~CTTFontDesc() { + if (m_Type == 1) { + if (m_SingleFace) + FXFT_Done_Face(m_SingleFace); + } else if (m_Type == 2) { + for (int i = 0; i < 16; i++) { + if (m_TTCFaces[i]) + FXFT_Done_Face(m_TTCFaces[i]); + } + } + FX_Free(m_pFontData); +} + +int CTTFontDesc::ReleaseFace(FXFT_Face face) { + if (m_Type == 1) { + if (m_SingleFace != face) + return -1; + } else if (m_Type == 2) { + int i; + for (i = 0; i < 16; i++) { + if (m_TTCFaces[i] == face) + break; + } + if (i == 16) + return -1; + } + m_RefCount--; + if (m_RefCount) + return m_RefCount; + delete this; + return 0; +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/cttfontdesc.h b/modules/pdfium/pdfium/core/fxge/ge/cttfontdesc.h new file mode 100644 index 000000000000..d756cb947a29 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/cttfontdesc.h @@ -0,0 +1,40 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_GE_CTTFONTDESC_H_ +#define CORE_FXGE_GE_CTTFONTDESC_H_ + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/fx_font.h" + +#define FX_FONT_FLAG_SERIF 0x01 +#define FX_FONT_FLAG_FIXEDPITCH 0x02 +#define FX_FONT_FLAG_ITALIC 0x04 +#define FX_FONT_FLAG_BOLD 0x08 +#define FX_FONT_FLAG_SYMBOLIC_SYMBOL 0x10 +#define FX_FONT_FLAG_SYMBOLIC_DINGBATS 0x20 +#define FX_FONT_FLAG_MULTIPLEMASTER 0x40 + +class CTTFontDesc { + public: + CTTFontDesc() : m_Type(0), m_pFontData(nullptr), m_RefCount(0) {} + ~CTTFontDesc(); + // ret < 0, releaseface not appropriate for this object. + // ret == 0, object released + // ret > 0, object still alive, other referrers. + int ReleaseFace(FXFT_Face face); + + int m_Type; + + union { + FXFT_Face m_SingleFace; + FXFT_Face m_TTCFaces[16]; + }; + uint8_t* m_pFontData; + int m_RefCount; +}; + +#endif // CORE_FXGE_GE_CTTFONTDESC_H_ diff --git a/modules/pdfium/pdfium/core/fxge/ge/fx_ge_fontmap.cpp b/modules/pdfium/pdfium/core/fxge/ge/fx_ge_fontmap.cpp new file mode 100644 index 000000000000..7ac4fada5cc0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/fx_ge_fontmap.cpp @@ -0,0 +1,93 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include "core/fxge/cfx_fontmapper.h" +#include "core/fxge/ifx_systemfontinfo.h" + +static CFX_ByteString GetStringFromTable(const uint8_t* string_ptr, + uint32_t string_ptr_length, + uint16_t offset, + uint16_t length) { + if (string_ptr_length < static_cast(offset + length)) { + return CFX_ByteString(); + } + return CFX_ByteString(string_ptr + offset, length); +} + +CFX_ByteString GetNameFromTT(const uint8_t* name_table, + uint32_t name_table_size, + uint32_t name_id) { + if (!name_table || name_table_size < 6) { + return CFX_ByteString(); + } + uint32_t name_count = GET_TT_SHORT(name_table + 2); + uint32_t string_offset = GET_TT_SHORT(name_table + 4); + // We will ignore the possibility of overlap of structures and + // string table as if it's all corrupt there's not a lot we can do. + if (name_table_size < string_offset) { + return CFX_ByteString(); + } + + const uint8_t* string_ptr = name_table + string_offset; + uint32_t string_ptr_size = name_table_size - string_offset; + name_table += 6; + name_table_size -= 6; + if (name_table_size < name_count * 12) { + return CFX_ByteString(); + } + + for (uint32_t i = 0; i < name_count; i++, name_table += 12) { + if (GET_TT_SHORT(name_table + 6) == name_id && + GET_TT_SHORT(name_table) == 1 && GET_TT_SHORT(name_table + 2) == 0) { + return GetStringFromTable(string_ptr, string_ptr_size, + GET_TT_SHORT(name_table + 10), + GET_TT_SHORT(name_table + 8)); + } + } + return CFX_ByteString(); +} +#ifdef PDF_ENABLE_XFA +void* IFX_SystemFontInfo::MapFontByUnicode(uint32_t dwUnicode, + int weight, + bool bItalic, + int pitch_family) { + return nullptr; +} +#endif // PDF_ENABLE_XFA + +int IFX_SystemFontInfo::GetFaceIndex(void* hFont) { + return 0; +} + +extern "C" { +unsigned long _FTStreamRead(FXFT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count); +void _FTStreamClose(FXFT_Stream stream); +}; + +#if _FX_OS_ == _FX_ANDROID_ +std::unique_ptr IFX_SystemFontInfo::CreateDefault( + const char** pUnused) { + return nullptr; +} +#endif + +CFX_FontFaceInfo::CFX_FontFaceInfo(CFX_ByteString filePath, + CFX_ByteString faceName, + CFX_ByteString fontTables, + uint32_t fontOffset, + uint32_t fileSize) + : m_FilePath(filePath), + m_FaceName(faceName), + m_FontTables(fontTables), + m_FontOffset(fontOffset), + m_FileSize(fileSize), + m_Styles(0), + m_Charsets(0) {} diff --git a/modules/pdfium/pdfium/core/fxge/ge/fx_ge_linux.cpp b/modules/pdfium/pdfium/core/fxge/ge/fx_ge_linux.cpp new file mode 100644 index 000000000000..e7086bb4e0a1 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/fx_ge_linux.cpp @@ -0,0 +1,163 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/ge/cfx_folderfontinfo.h" +#include "core/fxge/ifx_systemfontinfo.h" + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ +namespace { + +const size_t kLinuxGpNameSize = 6; + +const FX_CHAR* const g_LinuxGpFontList[][kLinuxGpNameSize] = { + {"TakaoPGothic", "VL PGothic", "IPAPGothic", "VL Gothic", "Kochi Gothic", + "VL Gothic regular"}, + {"TakaoGothic", "VL Gothic", "IPAGothic", "Kochi Gothic", nullptr, + "VL Gothic regular"}, + {"TakaoPMincho", "IPAPMincho", "VL Gothic", "Kochi Mincho", nullptr, + "VL Gothic regular"}, + {"TakaoMincho", "IPAMincho", "VL Gothic", "Kochi Mincho", nullptr, + "VL Gothic regular"}, +}; + +const FX_CHAR* const g_LinuxGbFontList[] = { + "AR PL UMing CN Light", "WenQuanYi Micro Hei", "AR PL UKai CN", +}; + +const FX_CHAR* const g_LinuxB5FontList[] = { + "AR PL UMing TW Light", "WenQuanYi Micro Hei", "AR PL UKai TW", +}; + +const FX_CHAR* const g_LinuxHGFontList[] = { + "UnDotum", +}; + +size_t GetJapanesePreference(const FX_CHAR* facearr, + int weight, + int pitch_family) { + CFX_ByteString face = facearr; + if (face.Find("Gothic") >= 0 || + face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) { + if (face.Find("PGothic") >= 0 || + face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) { + return 0; + } + return 1; + } + if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) { + if (face.Find("PMincho") >= 0 || + face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) { + return 2; + } + return 3; + } + if (!(pitch_family & FXFONT_FF_ROMAN) && weight > 400) + return 0; + + return 2; +} + +class CFX_LinuxFontInfo : public CFX_FolderFontInfo { + public: + CFX_LinuxFontInfo() {} + ~CFX_LinuxFontInfo() override {} + + void* MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* family, + int& iExact) override; + bool ParseFontCfg(const char** pUserPaths); +}; + +void* CFX_LinuxFontInfo::MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* cstr_face, + int& iExact) { + void* font = GetSubstFont(cstr_face); + if (font) { + iExact = 1; + return font; + } + bool bCJK = true; + switch (charset) { + case FXFONT_SHIFTJIS_CHARSET: { + size_t index = GetJapanesePreference(cstr_face, weight, pitch_family); + ASSERT(index < FX_ArraySize(g_LinuxGpFontList)); + for (size_t i = 0; i < kLinuxGpNameSize; i++) { + auto it = m_FontList.find(g_LinuxGpFontList[index][i]); + if (it != m_FontList.end()) + return it->second; + } + break; + } + case FXFONT_GB2312_CHARSET: { + for (size_t i = 0; i < FX_ArraySize(g_LinuxGbFontList); ++i) { + auto it = m_FontList.find(g_LinuxGbFontList[i]); + if (it != m_FontList.end()) + return it->second; + } + break; + } + case FXFONT_CHINESEBIG5_CHARSET: { + for (size_t i = 0; i < FX_ArraySize(g_LinuxB5FontList); ++i) { + auto it = m_FontList.find(g_LinuxB5FontList[i]); + if (it != m_FontList.end()) + return it->second; + } + break; + } + case FXFONT_HANGUL_CHARSET: { + for (size_t i = 0; i < FX_ArraySize(g_LinuxHGFontList); ++i) { + auto it = m_FontList.find(g_LinuxHGFontList[i]); + if (it != m_FontList.end()) + return it->second; + } + break; + } + default: + bCJK = false; + break; + } + return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK); +} + +bool CFX_LinuxFontInfo::ParseFontCfg(const char** pUserPaths) { + if (!pUserPaths) + return false; + + for (const char** pPath = pUserPaths; *pPath; ++pPath) + AddPath(*pPath); + return true; +} + +} // namespace + +std::unique_ptr IFX_SystemFontInfo::CreateDefault( + const char** pUserPaths) { + CFX_LinuxFontInfo* pInfo = new CFX_LinuxFontInfo; + if (!pInfo->ParseFontCfg(pUserPaths)) { + pInfo->AddPath("/usr/share/fonts"); + pInfo->AddPath("/usr/share/X11/fonts/Type1"); + pInfo->AddPath("/usr/share/X11/fonts/TTF"); + pInfo->AddPath("/usr/local/share/fonts"); + } + return std::unique_ptr(pInfo); +} + +void CFX_GEModule::InitPlatform() { + m_pFontMgr->SetSystemFontInfo( + IFX_SystemFontInfo::CreateDefault(m_pUserFontPaths)); +} + +void CFX_GEModule::DestroyPlatform() {} +#endif // _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ diff --git a/modules/pdfium/pdfium/core/fxge/ge/fx_ge_text.cpp b/modules/pdfium/pdfium/core/fxge/ge/fx_ge_text.cpp new file mode 100644 index 000000000000..669969db0bcc --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/fx_ge_text.cpp @@ -0,0 +1,126 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include +#include +#include + +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/fx_safe_types.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/fx_freetype.h" +#include "core/fxge/ge/fx_text_int.h" +#include "core/fxge/ifx_renderdevicedriver.h" + +namespace { + +void ResetTransform(FT_Face face) { + FXFT_Matrix matrix; + matrix.xx = 0x10000L; + matrix.xy = 0; + matrix.yx = 0; + matrix.yy = 0x10000L; + FXFT_Set_Transform(face, &matrix, 0); +} + +} // namespace + +FXTEXT_GLYPHPOS::FXTEXT_GLYPHPOS() : m_pGlyph(nullptr) {} + +FXTEXT_GLYPHPOS::FXTEXT_GLYPHPOS(const FXTEXT_GLYPHPOS&) = default; + +FXTEXT_GLYPHPOS::~FXTEXT_GLYPHPOS(){}; + +ScopedFontTransform::ScopedFontTransform(FT_Face face, FXFT_Matrix* matrix) + : m_Face(face) { + FXFT_Set_Transform(m_Face, matrix, 0); +} + +ScopedFontTransform::~ScopedFontTransform() { + ResetTransform(m_Face); +} + +FX_RECT FXGE_GetGlyphsBBox(const std::vector& glyphs, + int anti_alias, + FX_FLOAT retinaScaleX, + FX_FLOAT retinaScaleY) { + FX_RECT rect(0, 0, 0, 0); + bool bStarted = false; + for (const FXTEXT_GLYPHPOS& glyph : glyphs) { + const CFX_GlyphBitmap* pGlyph = glyph.m_pGlyph; + if (!pGlyph) + continue; + + FX_SAFE_INT32 char_left = glyph.m_Origin.x; + char_left += pGlyph->m_Left; + if (!char_left.IsValid()) + continue; + + FX_SAFE_INT32 char_width = pGlyph->m_Bitmap.GetWidth(); + char_width /= retinaScaleX; + if (anti_alias == FXFT_RENDER_MODE_LCD) + char_width /= 3; + if (!char_width.IsValid()) + continue; + + FX_SAFE_INT32 char_right = char_left + char_width; + if (!char_right.IsValid()) + continue; + + FX_SAFE_INT32 char_top = glyph.m_Origin.y; + char_top -= pGlyph->m_Top; + if (!char_top.IsValid()) + continue; + + FX_SAFE_INT32 char_height = pGlyph->m_Bitmap.GetHeight(); + char_height /= retinaScaleY; + if (!char_height.IsValid()) + continue; + + FX_SAFE_INT32 char_bottom = char_top + char_height; + if (!char_bottom.IsValid()) + continue; + + if (bStarted) { + rect.left = pdfium::base::ValueOrDieForType( + pdfium::base::CheckMin(rect.left, char_left)); + rect.right = pdfium::base::ValueOrDieForType( + pdfium::base::CheckMax(rect.right, char_right)); + rect.top = pdfium::base::ValueOrDieForType( + pdfium::base::CheckMin(rect.top, char_top)); + rect.bottom = pdfium::base::ValueOrDieForType( + pdfium::base::CheckMax(rect.bottom, char_bottom)); + continue; + } + + rect.left = char_left.ValueOrDie(); + rect.right = char_right.ValueOrDie(); + rect.top = char_top.ValueOrDie(); + rect.bottom = char_bottom.ValueOrDie(); + bStarted = true; + } + return rect; +} + +CFX_SizeGlyphCache::CFX_SizeGlyphCache() {} + +CFX_SizeGlyphCache::~CFX_SizeGlyphCache() { + for (const auto& pair : m_GlyphMap) { + delete pair.second; + } + m_GlyphMap.clear(); +} + +void _CFX_UniqueKeyGen::Generate(int count, ...) { + va_list argList; + va_start(argList, count); + for (int i = 0; i < count; i++) { + int p = va_arg(argList, int); + ((uint32_t*)m_Key)[i] = p; + } + va_end(argList); + m_KeyLen = count * sizeof(uint32_t); +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/fx_ge_text_embeddertest.cpp b/modules/pdfium/pdfium/core/fxge/ge/fx_ge_text_embeddertest.cpp new file mode 100644 index 000000000000..045b6dc8690c --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/fx_ge_text_embeddertest.cpp @@ -0,0 +1,18 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +class FXGETextEmbedderTest : public EmbedderTest {}; + +TEST_F(FXGETextEmbedderTest, BadItalic) { + // Shouldn't crash. + EXPECT_TRUE(OpenDocument("bug_601362.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_NE(nullptr, page); + FPDF_BITMAP bitmap = RenderPage(page); + FPDFBitmap_Destroy(bitmap); + UnloadPage(page); +} diff --git a/modules/pdfium/pdfium/core/fxge/ge/fx_text_int.h b/modules/pdfium/pdfium/core/fxge/ge/fx_text_int.h new file mode 100644 index 000000000000..4de6587d4117 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ge/fx_text_int.h @@ -0,0 +1,28 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_GE_FX_TEXT_INT_H_ +#define CORE_FXGE_GE_FX_TEXT_INT_H_ + +#include + +#include "core/fxge/fx_font.h" +#include "core/fxge/fx_freetype.h" + +struct _CFX_UniqueKeyGen { + void Generate(int count, ...); + FX_CHAR m_Key[128]; + int m_KeyLen; +}; + +class CFX_SizeGlyphCache { + public: + CFX_SizeGlyphCache(); + ~CFX_SizeGlyphCache(); + std::map m_GlyphMap; +}; + +#endif // CORE_FXGE_GE_FX_TEXT_INT_H_ diff --git a/modules/pdfium/pdfium/core/fxge/ifx_renderdevicedriver.cpp b/modules/pdfium/pdfium/core/fxge/ifx_renderdevicedriver.cpp new file mode 100644 index 000000000000..77af00f4306c --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ifx_renderdevicedriver.cpp @@ -0,0 +1,105 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/ifx_renderdevicedriver.h" + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" + +IFX_RenderDeviceDriver::~IFX_RenderDeviceDriver() {} + +CFX_Matrix IFX_RenderDeviceDriver::GetCTM() const { + return CFX_Matrix(); +} + +bool IFX_RenderDeviceDriver::StartRendering() { + return true; +} + +void IFX_RenderDeviceDriver::EndRendering() {} + +bool IFX_RenderDeviceDriver::SetClip_PathStroke( + const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState) { + return false; +} + +bool IFX_RenderDeviceDriver::SetPixel(int x, int y, uint32_t color) { + return false; +} + +bool IFX_RenderDeviceDriver::FillRectWithBlend(const FX_RECT* pRect, + uint32_t fill_color, + int blend_type) { + return false; +} + +bool IFX_RenderDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, + FX_FLOAT y1, + FX_FLOAT x2, + FX_FLOAT y2, + uint32_t color, + int blend_type) { + return false; +} + +bool IFX_RenderDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap, + int left, + int top) { + return false; +} + +CFX_DIBitmap* IFX_RenderDeviceDriver::GetBackDrop() { + return nullptr; +} + +bool IFX_RenderDeviceDriver::ContinueDIBits(void* handle, IFX_Pause* pPause) { + return false; +} + +void IFX_RenderDeviceDriver::CancelDIBits(void* handle) {} + +bool IFX_RenderDeviceDriver::DrawDeviceText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t color) { + return false; +} + +void* IFX_RenderDeviceDriver::GetPlatformSurface() const { + return nullptr; +} + +int IFX_RenderDeviceDriver::GetDriverType() const { + return 0; +} + +void IFX_RenderDeviceDriver::ClearDriver() {} + +bool IFX_RenderDeviceDriver::DrawShading(const CPDF_ShadingPattern* pPattern, + const CFX_Matrix* pMatrix, + const FX_RECT& clip_rect, + int alpha, + bool bAlphaMode) { + return false; +} + +bool IFX_RenderDeviceDriver::SetBitsWithMask(const CFX_DIBSource* pBitmap, + const CFX_DIBSource* pMask, + int left, + int top, + int bitmap_alpha, + int blend_type) { + return false; +} + +#if defined _SKIA_SUPPORT_ || _SKIA_SUPPORT_PATHS_ +void IFX_RenderDeviceDriver::Flush() {} +#endif diff --git a/modules/pdfium/pdfium/core/fxge/ifx_renderdevicedriver.h b/modules/pdfium/pdfium/core/fxge/ifx_renderdevicedriver.h new file mode 100644 index 000000000000..fd35149e42e0 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ifx_renderdevicedriver.h @@ -0,0 +1,111 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_IFX_RENDERDEVICEDRIVER_H_ +#define CORE_FXGE_IFX_RENDERDEVICEDRIVER_H_ + +#include "core/fxcrt/fx_system.h" + +class CFX_DIBitmap; +class CFX_DIBSource; +class CFX_Font; +class CFX_GraphStateData; +class CFX_Matrix; +class CFX_PathData; +class CPDF_ShadingPattern; +class FXTEXT_CHARPOS; +class IFX_Pause; +struct FX_RECT; + +class IFX_RenderDeviceDriver { + public: + virtual ~IFX_RenderDeviceDriver(); + + virtual int GetDeviceCaps(int caps_id) const = 0; + virtual CFX_Matrix GetCTM() const; + + virtual bool StartRendering(); + virtual void EndRendering(); + virtual void SaveState() = 0; + virtual void RestoreState(bool bKeepSaved) = 0; + + virtual bool SetClip_PathFill(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + int fill_mode) = 0; + virtual bool SetClip_PathStroke(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState); + virtual bool DrawPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode, + int blend_type) = 0; + virtual bool SetPixel(int x, int y, uint32_t color); + virtual bool FillRectWithBlend(const FX_RECT* pRect, + uint32_t fill_color, + int blend_type); + virtual bool DrawCosmeticLine(FX_FLOAT x1, + FX_FLOAT y1, + FX_FLOAT x2, + FX_FLOAT y2, + uint32_t color, + int blend_type); + + virtual bool GetClipBox(FX_RECT* pRect) = 0; + virtual bool GetDIBits(CFX_DIBitmap* pBitmap, int left, int top); + virtual CFX_DIBitmap* GetBackDrop(); + virtual bool SetDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + const FX_RECT* pSrcRect, + int dest_left, + int dest_top, + int blend_type) = 0; + virtual bool StretchDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + uint32_t flags, + int blend_type) = 0; + virtual bool StartDIBits(const CFX_DIBSource* pBitmap, + int bitmap_alpha, + uint32_t color, + const CFX_Matrix* pMatrix, + uint32_t flags, + void*& handle, + int blend_type) = 0; + virtual bool ContinueDIBits(void* handle, IFX_Pause* pPause); + virtual void CancelDIBits(void* handle); + virtual bool DrawDeviceText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t color); + virtual void* GetPlatformSurface() const; + virtual int GetDriverType() const; + virtual void ClearDriver(); + virtual bool DrawShading(const CPDF_ShadingPattern* pPattern, + const CFX_Matrix* pMatrix, + const FX_RECT& clip_rect, + int alpha, + bool bAlphaMode); + virtual bool SetBitsWithMask(const CFX_DIBSource* pBitmap, + const CFX_DIBSource* pMask, + int left, + int top, + int bitmap_alpha, + int blend_type); +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ + virtual void Flush(); +#endif +}; + +#endif // CORE_FXGE_IFX_RENDERDEVICEDRIVER_H_ diff --git a/modules/pdfium/pdfium/core/fxge/ifx_systemfontinfo.h b/modules/pdfium/pdfium/core/fxge/ifx_systemfontinfo.h new file mode 100644 index 000000000000..1ab0ab677c5a --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/ifx_systemfontinfo.h @@ -0,0 +1,51 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_IFX_SYSTEMFONTINFO_H_ +#define CORE_FXGE_IFX_SYSTEMFONTINFO_H_ + +#include + +#include "core/fxge/cfx_fontmapper.h" +#include "core/fxge/fx_font.h" + +const uint32_t kTableNAME = FXDWORD_GET_MSBFIRST("name"); +const uint32_t kTableTTCF = FXDWORD_GET_MSBFIRST("ttcf"); + +class IFX_SystemFontInfo { + public: + static std::unique_ptr CreateDefault( + const char** pUserPaths); + + virtual ~IFX_SystemFontInfo() {} + + virtual bool EnumFontList(CFX_FontMapper* pMapper) = 0; + virtual void* MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* face, + int& iExact) = 0; + +#ifdef PDF_ENABLE_XFA + virtual void* MapFontByUnicode(uint32_t dwUnicode, + int weight, + bool bItalic, + int pitch_family); +#endif // PDF_ENABLE_XFA + + virtual void* GetFont(const FX_CHAR* face) = 0; + virtual uint32_t GetFontData(void* hFont, + uint32_t table, + uint8_t* buffer, + uint32_t size) = 0; + virtual bool GetFaceName(void* hFont, CFX_ByteString& name) = 0; + virtual bool GetFontCharset(void* hFont, int& charset) = 0; + virtual int GetFaceIndex(void* hFont); + virtual void DeleteFont(void* hFont) = 0; +}; + +#endif // CORE_FXGE_IFX_SYSTEMFONTINFO_H_ diff --git a/modules/pdfium/pdfium/core/fxge/skia/DEPS b/modules/pdfium/pdfium/core/fxge/skia/DEPS new file mode 100644 index 000000000000..17c026539500 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/skia/DEPS @@ -0,0 +1,5 @@ +include_rules = [ + '+fpdfsdk', + '+public', + '+third_party/skia/include', +] diff --git a/modules/pdfium/pdfium/core/fxge/skia/fx_skia_device.cpp b/modules/pdfium/pdfium/core/fxge/skia/fx_skia_device.cpp new file mode 100644 index 000000000000..7e23f97287ca --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/skia/fx_skia_device.cpp @@ -0,0 +1,3102 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_meshstream.h" +#include "core/fpdfapi/page/cpdf_shadingpattern.h" +#include "core/fpdfapi/page/pageint.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/fx_memory.h" +#include "core/fxge/cfx_fxgedevice.h" +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "core/fxge/skia/fx_skia_device.h" + +#ifdef _SKIA_SUPPORT_PATHS_ +#include "core/fxge/ge/cfx_cliprgn.h" +#endif // _SKIA_SUPPORT_PATHS_ + +#include "third_party/base/ptr_util.h" + +#include "third_party/skia/include/core/SkCanvas.h" +#include "third_party/skia/include/core/SkClipOp.h" +#include "third_party/skia/include/core/SkPaint.h" +#include "third_party/skia/include/core/SkPath.h" +#include "third_party/skia/include/core/SkShader.h" +#include "third_party/skia/include/core/SkStream.h" +#include "third_party/skia/include/core/SkTypeface.h" +#include "third_party/skia/include/effects/SkDashPathEffect.h" +#include "third_party/skia/include/effects/SkGradientShader.h" +#include "third_party/skia/include/pathops/SkPathOps.h" + +#ifdef _SKIA_SUPPORT_ +#include "third_party/skia/include/core/SkColorFilter.h" +#include "third_party/skia/include/core/SkColorPriv.h" +#include "third_party/skia/include/core/SkMaskFilter.h" +#include "third_party/skia/include/core/SkPictureRecorder.h" +#endif // _SKIA_SUPPORT_ + +namespace { + +#ifdef _SKIA_SUPPORT_PATHS_ +void RgbByteOrderTransferBitmap(CFX_DIBitmap* pBitmap, + int dest_left, + int dest_top, + int width, + int height, + const CFX_DIBSource* pSrcBitmap, + int src_left, + int src_top) { + if (!pBitmap) + return; + + pBitmap->GetOverlapRect(dest_left, dest_top, width, height, + pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), + src_left, src_top, nullptr); + if (width == 0 || height == 0) + return; + + int Bpp = pBitmap->GetBPP() / 8; + FXDIB_Format dest_format = pBitmap->GetFormat(); + FXDIB_Format src_format = pSrcBitmap->GetFormat(); + int pitch = pBitmap->GetPitch(); + uint8_t* buffer = pBitmap->GetBuffer(); + if (dest_format == src_format) { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = buffer + (dest_top + row) * pitch + dest_left * Bpp; + uint8_t* src_scan = + (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp; + if (Bpp == 4) { + for (int col = 0; col < width; col++) { + FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_scan[3], src_scan[0], + src_scan[1], src_scan[2])); + dest_scan += 4; + src_scan += 4; + } + } else { + for (int col = 0; col < width; col++) { + *dest_scan++ = src_scan[2]; + *dest_scan++ = src_scan[1]; + *dest_scan++ = src_scan[0]; + src_scan += 3; + } + } + } + return; + } + + uint8_t* dest_buf = buffer + dest_top * pitch + dest_left * Bpp; + if (dest_format == FXDIB_Rgb) { + if (src_format == FXDIB_Rgb32) { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * pitch; + uint8_t* src_scan = + (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * 4; + for (int col = 0; col < width; col++) { + *dest_scan++ = src_scan[2]; + *dest_scan++ = src_scan[1]; + *dest_scan++ = src_scan[0]; + src_scan += 4; + } + } + } else { + ASSERT(false); + } + return; + } + + if (dest_format == FXDIB_Argb || dest_format == FXDIB_Rgb32) { + if (src_format == FXDIB_Rgb) { + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = (uint8_t*)(dest_buf + row * pitch); + uint8_t* src_scan = + (uint8_t*)pSrcBitmap->GetScanline(src_top + row) + src_left * 3; + for (int col = 0; col < width; col++) { + FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], + src_scan[2])); + dest_scan += 4; + src_scan += 3; + } + } + } else if (src_format == FXDIB_Rgb32) { + ASSERT(dest_format == FXDIB_Argb); + for (int row = 0; row < height; row++) { + uint8_t* dest_scan = dest_buf + row * pitch; + uint8_t* src_scan = + (uint8_t*)(pSrcBitmap->GetScanline(src_top + row) + src_left * 4); + for (int col = 0; col < width; col++) { + FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], + src_scan[2])); + src_scan += 4; + dest_scan += 4; + } + } + } + return; + } + + ASSERT(false); +} + +#endif // _SKIA_SUPPORT_PATHS_ + +#define SHOW_SKIA_PATH 0 // set to 1 to print the path contents +#define DRAW_SKIA_CLIP 0 // set to 1 to draw a green rectangle around the clip + +#if SHOW_SKIA_PATH +void DebugShowSkiaPaint(const SkPaint& paint) { + if (SkPaint::kFill_Style == paint.getStyle()) { + printf("fill 0x%08x\n", paint.getColor()); + } else { + printf("stroke 0x%08x width %g\n", paint.getColor(), + paint.getStrokeWidth()); + } +} + +void DebugShowCanvasMatrix(const SkCanvas* canvas) { + SkMatrix matrix = canvas->getTotalMatrix(); + SkScalar m[9]; + matrix.get9(m); + printf("matrix (%g,%g,%g) (%g,%g,%g) (%g,%g,%g)\n", m[0], m[1], m[2], m[3], + m[4], m[5], m[6], m[7], m[8]); +} +#endif // SHOW_SKIA_PATH + +void DebugShowSkiaPath(const SkPath& path) { +#if SHOW_SKIA_PATH + char buffer[4096]; + sk_bzero(buffer, sizeof(buffer)); + SkMemoryWStream stream(buffer, sizeof(buffer)); + path.dump(&stream, false, false); + printf("%s", buffer); +#endif // SHOW_SKIA_PATH +} + +void DebugShowCanvasClip(const SkCanvas* canvas) { +#if SHOW_SKIA_PATH + SkRect local; + SkIRect device; + canvas->getClipBounds(&local); + printf("local bounds %g %g %g %g\n", local.fLeft, local.fTop, local.fRight, + local.fBottom); + canvas->getClipDeviceBounds(&device); + printf("device bounds %d %d %d %d\n", device.fLeft, device.fTop, + device.fRight, device.fBottom); +#endif // SHOW_SKIA_PATH +} + +#if SHOW_SKIA_PATH +void DebugShowSkiaPaint(const SkPaint& paint) { + if (SkPaint::kFill_Style == paint.getStyle()) { + printf("fill 0x%08x\n", paint.getColor()); + } else { + printf("stroke 0x%08x width %g\n", paint.getColor(), + paint.getStrokeWidth()); + } +} +#endif // SHOW_SKIA_PATH + +void DebugShowSkiaDrawPath(const SkCanvas* canvas, + const SkPaint& paint, + const SkPath& path) { +#if SHOW_SKIA_PATH + DebugShowSkiaPaint(paint); + DebugShowCanvasMatrix(canvas); + DebugShowCanvasClip(canvas); + DebugShowSkiaPath(path); + printf("\n"); +#endif // SHOW_SKIA_PATH +} + +void DebugShowSkiaDrawRect(const SkCanvas* canvas, + const SkPaint& paint, + const SkRect& rect) { +#if SHOW_SKIA_PATH + DebugShowSkiaPaint(paint); + DebugShowCanvasMatrix(canvas); + DebugShowCanvasClip(canvas); + printf("rect %g %g %g %g\n", rect.fLeft, rect.fTop, rect.fRight, + rect.fBottom); +#endif // SHOW_SKIA_PATH +} + +#if DRAW_SKIA_CLIP + +SkPaint DebugClipPaint() { + SkPaint paint; + paint.setAntiAlias(true); + paint.setColor(SK_ColorGREEN); + paint.setStyle(SkPaint::kStroke_Style); + return paint; +} + +void DebugDrawSkiaClipRect(SkCanvas* canvas, const SkRect& rect) { + SkPaint paint = DebugClipPaint(); + canvas->drawRect(rect, paint); +} + +void DebugDrawSkiaClipPath(SkCanvas* canvas, const SkPath& path) { + SkPaint paint = DebugClipPaint(); + canvas->drawPath(path, paint); +} + +#else // DRAW_SKIA_CLIP + +void DebugDrawSkiaClipRect(SkCanvas* canvas, const SkRect& rect) {} + +void DebugDrawSkiaClipPath(SkCanvas* canvas, const SkPath& path) {} + +#endif // DRAW_SKIA_CLIP + +#ifdef _SKIA_SUPPORT_ +static void DebugValidate(const CFX_DIBitmap* bitmap, + const CFX_DIBitmap* device) { + if (bitmap) { + SkASSERT(bitmap->GetBPP() == 8 || bitmap->GetBPP() == 32); + if (bitmap->GetBPP() == 32) { + bitmap->DebugVerifyBitmapIsPreMultiplied(); + } + } + if (device) { + SkASSERT(device->GetBPP() == 8 || device->GetBPP() == 32); + if (device->GetBPP() == 32) { + device->DebugVerifyBitmapIsPreMultiplied(); + } + } +} +#endif // _SKIA_SUPPORT_ + +SkPath BuildPath(const CFX_PathData* pPathData) { + SkPath skPath; + const CFX_PathData* pFPath = pPathData; + const std::vector& pPoints = pFPath->GetPoints(); + for (size_t i = 0; i < pPoints.size(); i++) { + CFX_PointF point = pPoints[i].m_Point; + FXPT_TYPE point_type = pPoints[i].m_Type; + if (point_type == FXPT_TYPE::MoveTo) { + skPath.moveTo(point.x, point.y); + } else if (point_type == FXPT_TYPE::LineTo) { + skPath.lineTo(point.x, point.y); + } else if (point_type == FXPT_TYPE::BezierTo) { + CFX_PointF point2 = pPoints[i + 1].m_Point; + CFX_PointF point3 = pPoints[i + 2].m_Point; + skPath.cubicTo(point.x, point.y, point2.x, point2.y, point3.x, point3.y); + i += 2; + } + if (pPoints[i].m_CloseFigure) + skPath.close(); + } + return skPath; +} + +SkMatrix ToSkMatrix(const CFX_Matrix& m) { + SkMatrix skMatrix; + skMatrix.setAll(m.a, m.c, m.e, m.b, m.d, m.f, 0, 0, 1); + return skMatrix; +} + +// use when pdf's y-axis points up instead of down +SkMatrix ToFlippedSkMatrix(const CFX_Matrix& m, SkScalar flip) { + SkMatrix skMatrix; + skMatrix.setAll(m.a * flip, -m.c * flip, m.e, m.b * flip, -m.d * flip, m.f, 0, + 0, 1); + return skMatrix; +} + +SkBlendMode GetSkiaBlendMode(int blend_type) { + switch (blend_type) { + case FXDIB_BLEND_MULTIPLY: + return SkBlendMode::kMultiply; + case FXDIB_BLEND_SCREEN: + return SkBlendMode::kScreen; + case FXDIB_BLEND_OVERLAY: + return SkBlendMode::kOverlay; + case FXDIB_BLEND_DARKEN: + return SkBlendMode::kDarken; + case FXDIB_BLEND_LIGHTEN: + return SkBlendMode::kLighten; + case FXDIB_BLEND_COLORDODGE: + return SkBlendMode::kColorDodge; + case FXDIB_BLEND_COLORBURN: + return SkBlendMode::kColorBurn; + case FXDIB_BLEND_HARDLIGHT: + return SkBlendMode::kHardLight; + case FXDIB_BLEND_SOFTLIGHT: + return SkBlendMode::kSoftLight; + case FXDIB_BLEND_DIFFERENCE: + return SkBlendMode::kDifference; + case FXDIB_BLEND_EXCLUSION: + return SkBlendMode::kExclusion; + case FXDIB_BLEND_HUE: + return SkBlendMode::kHue; + case FXDIB_BLEND_SATURATION: + return SkBlendMode::kSaturation; + case FXDIB_BLEND_COLOR: + return SkBlendMode::kColor; + case FXDIB_BLEND_LUMINOSITY: + return SkBlendMode::kLuminosity; + case FXDIB_BLEND_NORMAL: + default: + return SkBlendMode::kSrcOver; + } +} + +bool AddColors(const CPDF_ExpIntFunc* pFunc, SkTDArray* skColors) { + if (pFunc->CountInputs() != 1) + return false; + if (pFunc->m_Exponent != 1) + return false; + if (pFunc->m_nOrigOutputs != 3) + return false; + skColors->push( + SkColorSetARGB(0xFF, SkUnitScalarClampToByte(pFunc->m_pBeginValues[0]), + SkUnitScalarClampToByte(pFunc->m_pBeginValues[1]), + SkUnitScalarClampToByte(pFunc->m_pBeginValues[2]))); + skColors->push( + SkColorSetARGB(0xFF, SkUnitScalarClampToByte(pFunc->m_pEndValues[0]), + SkUnitScalarClampToByte(pFunc->m_pEndValues[1]), + SkUnitScalarClampToByte(pFunc->m_pEndValues[2]))); + return true; +} + +uint8_t FloatToByte(FX_FLOAT f) { + ASSERT(0 <= f && f <= 1); + return (uint8_t)(f * 255.99f); +} + +bool AddSamples(const CPDF_SampledFunc* pFunc, + SkTDArray* skColors, + SkTDArray* skPos) { + if (pFunc->CountInputs() != 1) + return false; + if (pFunc->CountOutputs() != 3) // expect rgb + return false; + if (pFunc->GetEncodeInfo().empty()) + return false; + const CPDF_SampledFunc::SampleEncodeInfo& encodeInfo = + pFunc->GetEncodeInfo()[0]; + if (encodeInfo.encode_min != 0) + return false; + if (encodeInfo.encode_max != encodeInfo.sizes - 1) + return false; + uint32_t sampleSize = pFunc->GetBitsPerSample(); + uint32_t sampleCount = encodeInfo.sizes; + if (sampleCount != 1U << sampleSize) + return false; + if (pFunc->GetSampleStream()->GetSize() < sampleCount * 3 * sampleSize / 8) + return false; + + FX_FLOAT colorsMin[3]; + FX_FLOAT colorsMax[3]; + for (int i = 0; i < 3; ++i) { + colorsMin[i] = pFunc->GetRange(i * 2); + colorsMax[i] = pFunc->GetRange(i * 2 + 1); + } + const uint8_t* pSampleData = pFunc->GetSampleStream()->GetData(); + for (uint32_t i = 0; i < sampleCount; ++i) { + FX_FLOAT floatColors[3]; + for (uint32_t j = 0; j < 3; ++j) { + int sample = GetBits32(pSampleData, (i * 3 + j) * sampleSize, sampleSize); + FX_FLOAT interp = (FX_FLOAT)sample / (sampleCount - 1); + floatColors[j] = colorsMin[j] + (colorsMax[j] - colorsMin[j]) * interp; + } + SkColor color = + SkPackARGB32(0xFF, FloatToByte(floatColors[0]), + FloatToByte(floatColors[1]), FloatToByte(floatColors[2])); + skColors->push(color); + skPos->push((FX_FLOAT)i / (sampleCount - 1)); + } + return true; +} + +bool AddStitching(const CPDF_StitchFunc* pFunc, + SkTDArray* skColors, + SkTDArray* skPos) { + FX_FLOAT boundsStart = pFunc->GetDomain(0); + + const auto& subFunctions = pFunc->GetSubFunctions(); + int subFunctionCount = subFunctions.size(); + for (int i = 0; i < subFunctionCount; ++i) { + const CPDF_ExpIntFunc* pSubFunc = subFunctions[i]->ToExpIntFunc(); + if (!pSubFunc) + return false; + if (!AddColors(pSubFunc, skColors)) + return false; + FX_FLOAT boundsEnd = + i < subFunctionCount - 1 ? pFunc->GetBound(i + 1) : pFunc->GetDomain(1); + skPos->push(boundsStart); + skPos->push(boundsEnd); + boundsStart = boundsEnd; + } + return true; +} + +// see https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line +SkScalar LineSide(const SkPoint line[2], const SkPoint& pt) { + return (line[1].fY - line[0].fY) * pt.fX - (line[1].fX - line[0].fX) * pt.fY + + line[1].fX * line[0].fY - line[1].fY * line[0].fX; +} + +SkPoint IntersectSides(const SkPoint& parallelPt, + const SkVector& paraRay, + const SkPoint& perpendicularPt) { + SkVector perpRay = {paraRay.fY, -paraRay.fX}; + SkScalar denom = perpRay.fY * paraRay.fX - paraRay.fY * perpRay.fX; + if (!denom) { + SkPoint zeroPt = {0, 0}; + return zeroPt; + } + SkVector ab0 = parallelPt - perpendicularPt; + SkScalar numerA = ab0.fY * perpRay.fX - perpRay.fY * ab0.fX; + numerA /= denom; + SkPoint result = {parallelPt.fX + paraRay.fX * numerA, + parallelPt.fY + paraRay.fY * numerA}; + return result; +} + +void ClipAngledGradient(const SkPoint pts[2], + SkPoint rectPts[4], + bool clipStart, + bool clipEnd, + SkPath* clip) { + // find the corners furthest from the gradient perpendiculars + SkScalar minPerpDist = SK_ScalarMax; + SkScalar maxPerpDist = SK_ScalarMin; + int minPerpPtIndex = -1; + int maxPerpPtIndex = -1; + SkVector slope = pts[1] - pts[0]; + SkPoint startPerp[2] = {pts[0], {pts[0].fX + slope.fY, pts[0].fY - slope.fX}}; + SkPoint endPerp[2] = {pts[1], {pts[1].fX + slope.fY, pts[1].fY - slope.fX}}; + for (int i = 0; i < 4; ++i) { + SkScalar sDist = LineSide(startPerp, rectPts[i]); + SkScalar eDist = LineSide(endPerp, rectPts[i]); + if (sDist * eDist <= 0) // if the signs are different, + continue; // the point is inside the gradient + if (sDist < 0) { + SkScalar smaller = SkTMin(sDist, eDist); + if (minPerpDist > smaller) { + minPerpDist = smaller; + minPerpPtIndex = i; + } + } else { + SkScalar larger = SkTMax(sDist, eDist); + if (maxPerpDist < larger) { + maxPerpDist = larger; + maxPerpPtIndex = i; + } + } + } + if (minPerpPtIndex < 0 && maxPerpPtIndex < 0) // nothing's outside + return; + // determine if negative distances are before start or after end + SkPoint beforeStart = {pts[0].fX * 2 - pts[1].fX, pts[0].fY * 2 - pts[1].fY}; + bool beforeNeg = LineSide(startPerp, beforeStart) < 0; + const SkPoint& startEdgePt = + clipStart ? pts[0] : beforeNeg ? rectPts[minPerpPtIndex] + : rectPts[maxPerpPtIndex]; + const SkPoint& endEdgePt = clipEnd ? pts[1] : beforeNeg + ? rectPts[maxPerpPtIndex] + : rectPts[minPerpPtIndex]; + // find the corners that bound the gradient + SkScalar minDist = SK_ScalarMax; + SkScalar maxDist = SK_ScalarMin; + int minBounds = -1; + int maxBounds = -1; + for (int i = 0; i < 4; ++i) { + SkScalar dist = LineSide(pts, rectPts[i]); + if (minDist > dist) { + minDist = dist; + minBounds = i; + } + if (maxDist < dist) { + maxDist = dist; + maxBounds = i; + } + } + ASSERT(minBounds >= 0); + ASSERT(maxBounds != minBounds && maxBounds >= 0); + // construct a clip parallel to the gradient that goes through + // rectPts[minBounds] and rectPts[maxBounds] and perpendicular to the + // gradient that goes through startEdgePt, endEdgePt. + clip->moveTo(IntersectSides(rectPts[minBounds], slope, startEdgePt)); + clip->lineTo(IntersectSides(rectPts[minBounds], slope, endEdgePt)); + clip->lineTo(IntersectSides(rectPts[maxBounds], slope, endEdgePt)); + clip->lineTo(IntersectSides(rectPts[maxBounds], slope, startEdgePt)); +} + +#ifdef _SKIA_SUPPORT_ +void SetBitmapMatrix(const CFX_Matrix* pMatrix, + int width, + int height, + SkMatrix* skMatrix) { + const CFX_Matrix& m = *pMatrix; + skMatrix->setAll(m.a / width, -m.c / height, m.c + m.e, m.b / width, + -m.d / height, m.d + m.f, 0, 0, 1); +} + +void SetBitmapPaint(bool isAlphaMask, + uint32_t argb, + int bitmap_alpha, + int blend_type, + SkPaint* paint) { + paint->setAntiAlias(true); + if (isAlphaMask) { + paint->setColorFilter( + SkColorFilter::MakeModeFilter(argb, SkBlendMode::kSrc)); + } + // paint->setFilterQuality(kHigh_SkFilterQuality); + paint->setBlendMode(GetSkiaBlendMode(blend_type)); + paint->setAlpha(bitmap_alpha); +} + +bool Upsample(const CFX_DIBSource* pSource, + std::unique_ptr& dst8Storage, + std::unique_ptr& dst32Storage, + SkColorTable** ctPtr, + SkBitmap* skBitmap, + int* widthPtr, + int* heightPtr, + bool forceAlpha) { + void* buffer = pSource->GetBuffer(); + if (!buffer) + return false; + SkColorType colorType = forceAlpha || pSource->IsAlphaMask() + ? SkColorType::kAlpha_8_SkColorType + : SkColorType::kGray_8_SkColorType; + SkAlphaType alphaType = + pSource->IsAlphaMask() ? kPremul_SkAlphaType : kOpaque_SkAlphaType; + int width = pSource->GetWidth(); + int height = pSource->GetHeight(); + int rowBytes = pSource->GetPitch(); + switch (pSource->GetBPP()) { + case 1: { + dst8Storage.reset(FX_Alloc2D(uint8_t, width, height)); + uint8_t* dst8Pixels = dst8Storage.get(); + for (int y = 0; y < height; ++y) { + const uint8_t* srcRow = + static_cast(buffer) + y * rowBytes; + uint8_t* dstRow = dst8Pixels + y * width; + for (int x = 0; x < width; ++x) + dstRow[x] = srcRow[x >> 3] & (1 << (~x & 0x07)) ? 0xFF : 0x00; + } + buffer = dst8Storage.get(); + rowBytes = width; + break; + } + case 8: + if (pSource->GetPalette()) { + *ctPtr = + new SkColorTable(pSource->GetPalette(), pSource->GetPaletteSize()); + colorType = SkColorType::kIndex_8_SkColorType; + } + break; + case 24: { + dst32Storage.reset(FX_Alloc2D(uint32_t, width, height)); + uint32_t* dst32Pixels = dst32Storage.get(); + for (int y = 0; y < height; ++y) { + const uint8_t* srcRow = + static_cast(buffer) + y * rowBytes; + uint32_t* dstRow = dst32Pixels + y * width; + for (int x = 0; x < width; ++x) { + dstRow[x] = SkPackARGB32(0xFF, srcRow[x * 3 + 2], srcRow[x * 3 + 1], + srcRow[x * 3 + 0]); + } + } + buffer = dst32Storage.get(); + rowBytes = width * sizeof(uint32_t); + colorType = SkColorType::kN32_SkColorType; + alphaType = kOpaque_SkAlphaType; + break; + } + case 32: + colorType = SkColorType::kN32_SkColorType; + alphaType = kPremul_SkAlphaType; + pSource->DebugVerifyBitmapIsPreMultiplied(buffer); + break; + default: + SkASSERT(0); // TODO(caryclark) ensure that all cases are covered + colorType = SkColorType::kUnknown_SkColorType; + } + SkImageInfo imageInfo = + SkImageInfo::Make(width, height, colorType, alphaType); + skBitmap->installPixels(imageInfo, buffer, rowBytes, *ctPtr, nullptr, + nullptr); + *widthPtr = width; + *heightPtr = height; + return true; +} +#endif // _SKIA_SUPPORT_ + +} // namespace + +// Encapsulate the state used for successive text and path draws so that +// they can be combined. +class SkiaState { + public: + enum class Clip { + kSave, + kPath, + }; + + enum class Accumulator { + kNone, + kPath, + kText, + kOther, + }; + + // mark all cached state as uninitialized + explicit SkiaState(CFX_SkiaDeviceDriver* pDriver) + : m_pDriver(pDriver), + m_pFont(nullptr), + m_fontSize(0), + m_fillColor(0), + m_strokeColor(0), + m_blendType(0), + m_commandIndex(0), + m_drawIndex(INT_MAX), + m_clipIndex(0), + m_type(Accumulator::kNone), + m_fillFullCover(false), + m_fillPath(false), + m_groupKnockout(false), + m_debugDisable(false) +#if SHOW_SKIA_PATH + , + m_debugSaveCounter(0) +#endif + { + } + + bool DrawPath(const CFX_PathData* pPathData, + const CFX_Matrix* pMatrix, + const CFX_GraphStateData* pDrawState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode, + int blend_type) { + if (m_debugDisable) + return false; + Dump(__func__); + int drawIndex = SkTMin(m_drawIndex, m_commands.count()); + if (Accumulator::kText == m_type || drawIndex != m_commandIndex || + (Accumulator::kPath == m_type && + DrawChanged(pMatrix, pDrawState, fill_color, stroke_color, fill_mode, + blend_type, m_pDriver->m_bGroupKnockout))) { + Flush(); + } + if (Accumulator::kPath != m_type) { + m_skPath.reset(); + m_fillFullCover = !!(fill_mode & FXFILL_FULLCOVER); + m_fillPath = (fill_mode & 3) && fill_color; + m_skPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE + ? SkPath::kEvenOdd_FillType + : SkPath::kWinding_FillType); + if (pDrawState) + m_drawState.Copy(*pDrawState); + m_fillColor = fill_color; + m_strokeColor = stroke_color; + m_blendType = blend_type; + m_groupKnockout = m_pDriver->m_bGroupKnockout; + if (pMatrix) + m_drawMatrix = *pMatrix; + m_drawIndex = m_commandIndex; + m_type = Accumulator::kPath; + } + SkPath skPath = BuildPath(pPathData); + SkPoint delta; + if (MatrixOffset(pMatrix, &delta)) + skPath.offset(delta.fX, delta.fY); + m_skPath.addPath(skPath); + return true; + } + + void FlushPath() { + Dump(__func__); + SkMatrix skMatrix = ToSkMatrix(m_drawMatrix); + SkPaint skPaint; + skPaint.setAntiAlias(true); + if (m_fillFullCover) + skPaint.setBlendMode(SkBlendMode::kPlus); + int stroke_alpha = FXARGB_A(m_strokeColor); + if (stroke_alpha) + m_pDriver->PaintStroke(&skPaint, &m_drawState, skMatrix); + SkCanvas* skCanvas = m_pDriver->SkiaCanvas(); + skCanvas->save(); + skCanvas->concat(skMatrix); + if (m_fillPath) { + SkPath strokePath; + const SkPath* fillPath = &m_skPath; + if (stroke_alpha) { + if (m_groupKnockout) { + skPaint.getFillPath(m_skPath, &strokePath); + if (Op(m_skPath, strokePath, SkPathOp::kDifference_SkPathOp, + &strokePath)) { + fillPath = &strokePath; + } + } + } + skPaint.setStyle(SkPaint::kFill_Style); + skPaint.setColor(m_fillColor); +#ifdef _SKIA_SUPPORT_PATHS_ + m_pDriver->PreMultiply(); +#endif // _SKIA_SUPPORT_PATHS_ + DebugShowSkiaDrawPath(skCanvas, skPaint, *fillPath); + skCanvas->drawPath(*fillPath, skPaint); + } + if (stroke_alpha) { + skPaint.setStyle(SkPaint::kStroke_Style); + skPaint.setColor(m_strokeColor); +#ifdef _SKIA_SUPPORT_PATHS_ + m_pDriver->PreMultiply(); +#endif // _SKIA_SUPPORT_PATHS_ + DebugShowSkiaDrawPath(skCanvas, skPaint, m_skPath); + skCanvas->drawPath(m_skPath, skPaint); + } + skCanvas->restore(); + m_drawIndex = INT_MAX; + m_type = Accumulator::kNone; + } + + bool DrawText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pMatrix, + FX_FLOAT font_size, + uint32_t color) { + if (m_debugDisable) + return false; + Dump(__func__); + int drawIndex = SkTMin(m_drawIndex, m_commands.count()); + if (Accumulator::kPath == m_type || drawIndex != m_commandIndex || + (Accumulator::kText == m_type && + FontChanged(pFont, pMatrix, font_size, color))) { + Flush(); + } + if (Accumulator::kText != m_type) { + m_positions.setCount(0); + m_glyphs.setCount(0); + m_pFont = pFont; + m_fontSize = font_size; + m_fillColor = color; + m_drawMatrix = *pMatrix; + m_drawIndex = m_commandIndex; + m_type = Accumulator::kText; + } + int count = m_positions.count(); + m_positions.setCount(nChars + count); + m_glyphs.setCount(nChars + count); + SkScalar flip = m_fontSize < 0 ? -1 : 1; + SkScalar vFlip = flip; + if (pFont->IsVertical()) + vFlip *= -1; + for (int index = 0; index < nChars; ++index) { + const FXTEXT_CHARPOS& cp = pCharPos[index]; + m_positions[index + count] = {cp.m_Origin.x * flip, + cp.m_Origin.y * vFlip}; + m_glyphs[index + count] = static_cast(cp.m_GlyphIndex); + } + SkPoint delta; + if (MatrixOffset(pMatrix, &delta)) { + for (int index = 0; index < nChars; ++index) + m_positions[index + count].offset(delta.fX * flip, -delta.fY * flip); + } + return true; + } + + void FlushText() { + Dump(__func__); + SkPaint skPaint; + skPaint.setAntiAlias(true); + skPaint.setColor(m_fillColor); + if (m_pFont->GetFace()) { // exclude placeholder test fonts + sk_sp typeface(SkSafeRef(m_pFont->GetDeviceCache())); + skPaint.setTypeface(typeface); + } + skPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); + skPaint.setHinting(SkPaint::kNo_Hinting); + skPaint.setTextSize(SkTAbs(m_fontSize)); + skPaint.setSubpixelText(true); + SkCanvas* skCanvas = m_pDriver->SkiaCanvas(); + skCanvas->save(); + SkScalar flip = m_fontSize < 0 ? -1 : 1; + SkMatrix skMatrix = ToFlippedSkMatrix(m_drawMatrix, flip); + skCanvas->concat(skMatrix); +#ifdef _SKIA_SUPPORT_PATHS_ + m_pDriver->PreMultiply(); +#endif // _SKIA_SUPPORT_PATHS_ + skCanvas->drawPosText(m_glyphs.begin(), m_glyphs.count() * 2, + m_positions.begin(), skPaint); + skCanvas->restore(); + m_drawIndex = INT_MAX; + m_type = Accumulator::kNone; + } + + bool SetClipFill(const CFX_PathData* pPathData, + const CFX_Matrix* pMatrix, + int fill_mode) { + if (m_debugDisable) + return false; + Dump(__func__); + SkPath skClipPath = BuildPath(pPathData); + skClipPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE + ? SkPath::kEvenOdd_FillType + : SkPath::kWinding_FillType); + SkMatrix skMatrix = ToSkMatrix(*pMatrix); + skClipPath.transform(skMatrix); + return SetClip(skClipPath); + } + + bool SetClip(const SkPath& skClipPath) { + // if a pending draw depends on clip state that is cached, flush it and draw + if (m_commandIndex < m_commands.count()) { + if (m_commands[m_commandIndex] == Clip::kPath && + m_clips[m_commandIndex] == skClipPath) { + ++m_commandIndex; + return true; + } + Flush(); + } + while (m_clipIndex > m_commandIndex) { + do { + --m_clipIndex; + SkASSERT(m_clipIndex >= 0); + } while (m_commands[m_clipIndex] != Clip::kSave); + m_pDriver->SkiaCanvas()->restore(); + } + if (m_commandIndex < m_commands.count()) { + m_commands[m_commandIndex] = Clip::kPath; + m_clips[m_commandIndex] = skClipPath; + } else { + m_commands.push(Clip::kPath); + m_clips.push_back(skClipPath); + } + ++m_commandIndex; + return true; + } + + bool SetClipStroke(const CFX_PathData* pPathData, + const CFX_Matrix* pMatrix, + const CFX_GraphStateData* pGraphState) { + if (m_debugDisable) + return false; + Dump(__func__); + SkPath skPath = BuildPath(pPathData); + SkMatrix skMatrix = ToSkMatrix(*pMatrix); + SkPaint skPaint; + m_pDriver->PaintStroke(&skPaint, pGraphState, skMatrix); + SkPath dst_path; + skPaint.getFillPath(skPath, &dst_path); + dst_path.transform(skMatrix); + return SetClip(dst_path); + } + + bool MatrixOffset(const CFX_Matrix* pMatrix, SkPoint* delta) { + CFX_Matrix identityMatrix; + if (!pMatrix) + pMatrix = &identityMatrix; + delta->set(pMatrix->e - m_drawMatrix.e, pMatrix->f - m_drawMatrix.f); + if (!delta->fX && !delta->fY) + return true; + SkMatrix drawMatrix = ToSkMatrix(m_drawMatrix); + if (!(drawMatrix.getType() & ~SkMatrix::kTranslate_Mask)) + return true; + SkMatrix invDrawMatrix; + if (!drawMatrix.invert(&invDrawMatrix)) + return false; + SkMatrix invNewMatrix; + SkMatrix newMatrix = ToSkMatrix(*pMatrix); + if (!newMatrix.invert(&invNewMatrix)) + return false; + delta->set(invDrawMatrix.getTranslateX() - invNewMatrix.getTranslateX(), + invDrawMatrix.getTranslateY() - invNewMatrix.getTranslateY()); + return true; + } + + // returns true if caller should apply command to skia canvas + bool ClipSave() { + if (m_debugDisable) + return false; + Dump(__func__); + int count = m_commands.count(); + if (m_commandIndex < count - 1) { + if (Clip::kSave == m_commands[m_commandIndex + 1]) { + ++m_commandIndex; + return true; + } + Flush(); + AdjustClip(m_commandIndex); + m_commands[++m_commandIndex] = Clip::kSave; + m_clips[m_commandIndex] = m_skEmptyPath; + } else { + AdjustClip(m_commandIndex); + m_commands.push(Clip::kSave); + m_clips.push_back(m_skEmptyPath); + ++m_commandIndex; + } + return true; + } + + bool ClipRestore() { + if (m_debugDisable) + return false; + Dump(__func__); + while (Clip::kSave != m_commands[--m_commandIndex]) { + SkASSERT(m_commandIndex > 0); + } + return true; + } + + bool DrawChanged(const CFX_Matrix* pMatrix, + const CFX_GraphStateData* pState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode, + int blend_type, + bool group_knockout) const { + return MatrixChanged(pMatrix, m_drawMatrix) || + StateChanged(pState, m_drawState) || fill_color != m_fillColor || + stroke_color != m_strokeColor || + ((fill_mode & 3) == FXFILL_ALTERNATE) != + (m_skPath.getFillType() == SkPath::kEvenOdd_FillType) || + blend_type != m_blendType || group_knockout != m_groupKnockout; + } + + bool FontChanged(CFX_Font* pFont, + const CFX_Matrix* pMatrix, + FX_FLOAT font_size, + uint32_t color) const { + return pFont != m_pFont || MatrixChanged(pMatrix, m_drawMatrix) || + font_size != m_fontSize || color != m_fillColor; + } + + bool MatrixChanged(const CFX_Matrix* pMatrix, + const CFX_Matrix& refMatrix) const { + CFX_Matrix identityMatrix; + if (!pMatrix) + pMatrix = &identityMatrix; + return pMatrix->a != refMatrix.a || pMatrix->b != refMatrix.b || + pMatrix->c != refMatrix.c || pMatrix->d != refMatrix.d; + } + + bool StateChanged(const CFX_GraphStateData* pState, + const CFX_GraphStateData& refState) const { + CFX_GraphStateData identityState; + if (!pState) + pState = &identityState; + return pState->m_LineWidth != refState.m_LineWidth || + pState->m_LineCap != refState.m_LineCap || + pState->m_LineJoin != refState.m_LineJoin || + pState->m_MiterLimit != refState.m_MiterLimit || + DashChanged(pState, refState); + } + + bool DashChanged(const CFX_GraphStateData* pState, + const CFX_GraphStateData& refState) const { + bool dashArray = pState && pState->m_DashArray; + if (!dashArray && !refState.m_DashArray) + return false; + if (!dashArray || !refState.m_DashArray) + return true; + if (pState->m_DashPhase != refState.m_DashPhase || + pState->m_DashCount != refState.m_DashCount) { + return true; + } + for (int index = 0; index < pState->m_DashCount; ++index) { + if (pState->m_DashArray[index] != refState.m_DashArray[index]) + return true; + } + return true; + } + + void AdjustClip(int limit) { + while (m_clipIndex > limit) { + do { + --m_clipIndex; + SkASSERT(m_clipIndex >= 0); + } while (m_commands[m_clipIndex] != Clip::kSave); + m_pDriver->SkiaCanvas()->restore(); + } + while (m_clipIndex < limit) { + if (Clip::kSave == m_commands[m_clipIndex]) { + m_pDriver->SkiaCanvas()->save(); + } else { + SkASSERT(Clip::kPath == m_commands[m_clipIndex]); + m_pDriver->SkiaCanvas()->clipPath(m_clips[m_clipIndex], + SkClipOp::kIntersect, true); + } + ++m_clipIndex; + } + } + + void Flush() { + if (m_debugDisable) + return; + Dump(__func__); + if (Accumulator::kPath == m_type || Accumulator::kText == m_type) { + AdjustClip(SkTMin(m_drawIndex, m_commands.count())); + Accumulator::kPath == m_type ? FlushPath() : FlushText(); + } + } + + void FlushForDraw() { + if (m_debugDisable) + return; + Flush(); // draw any pending text or path + AdjustClip(m_commandIndex); // set up clip stack with any pending state + } + +#if SHOW_SKIA_PATH + void DumpPrefix(int index) const { + if (index != m_commandIndex && index != m_drawIndex && + index != m_clipIndex) { + printf(" "); + return; + } + printf("%c%c%c> ", index == m_commandIndex ? 'x' : '-', + index == m_drawIndex ? 'd' : '-', index == m_clipIndex ? 'c' : '-'); + } + + void DumpEndPrefix() const { + int index = m_commands.count(); + if (index != m_commandIndex && index > m_drawIndex && index != m_clipIndex) + return; + printf("%c%c%c>\n", index == m_commandIndex ? 'x' : '-', + index <= m_drawIndex ? 'd' : '-', index == m_clipIndex ? 'c' : '-'); + } +#endif // SHOW_SKIA_PATH + + void Dump(const char* where) const { +#if SHOW_SKIA_PATH + printf("\n%s\nSkia Save Count %d:\n", where, + m_pDriver->m_pCanvas->getSaveCount()); + printf("Cache:\n"); + for (int index = 0; index < m_commands.count(); ++index) { + DumpPrefix(index); + switch (m_commands[index]) { + case Clip::kSave: + printf("Save %d\n", ++m_debugSaveCounter); + break; + case Clip::kPath: + m_clips[index].dump(); + break; + default: + printf("unknown\n"); + } + } + DumpEndPrefix(); +#endif // SHOW_SKIA_PATH +#ifdef SK_DEBUG + int skCanvasSaveCount = m_pDriver->m_pCanvas->getSaveCount(); + int cacheSaveCount = 1; + SkASSERT(m_clipIndex <= m_commands.count()); + for (int index = 0; index < m_clipIndex; ++index) + cacheSaveCount += Clip::kSave == m_commands[index]; + SkASSERT(skCanvasSaveCount == cacheSaveCount); +#endif + } + + private: + SkTArray m_clips; // stack of clips that may be reused + SkTDArray m_commands; // stack of clip-related commands + SkTDArray m_positions; // accumulator for text positions + SkTDArray m_glyphs; // accumulator for text glyphs + SkPath m_skPath; // accumulator for path contours + SkPath m_skEmptyPath; // used as placehold in the clips array + CFX_Matrix m_drawMatrix; + CFX_GraphStateData m_clipState; + CFX_GraphStateData m_drawState; + CFX_Matrix m_clipMatrix; + CFX_SkiaDeviceDriver* m_pDriver; + CFX_Font* m_pFont; + FX_FLOAT m_fontSize; + uint32_t m_fillColor; + uint32_t m_strokeColor; + int m_blendType; + int m_commandIndex; // active position in clip command stack + int m_drawIndex; // position of the pending path or text draw + int m_clipIndex; // position reflecting depth of canvas clip stacck + Accumulator m_type; // type of pending draw + bool m_fillFullCover; + bool m_fillPath; + bool m_groupKnockout; + bool m_debugDisable; // turn off cache for debugging +#if SHOW_SKIA_PATH + mutable int m_debugSaveCounter; +#endif +}; + +// convert a stroking path to scanlines +void CFX_SkiaDeviceDriver::PaintStroke(SkPaint* spaint, + const CFX_GraphStateData* pGraphState, + const SkMatrix& matrix) { + SkPaint::Cap cap; + switch (pGraphState->m_LineCap) { + case CFX_GraphStateData::LineCapRound: + cap = SkPaint::kRound_Cap; + break; + case CFX_GraphStateData::LineCapSquare: + cap = SkPaint::kSquare_Cap; + break; + default: + cap = SkPaint::kButt_Cap; + break; + } + SkPaint::Join join; + switch (pGraphState->m_LineJoin) { + case CFX_GraphStateData::LineJoinRound: + join = SkPaint::kRound_Join; + break; + case CFX_GraphStateData::LineJoinBevel: + join = SkPaint::kBevel_Join; + break; + default: + join = SkPaint::kMiter_Join; + break; + } + SkMatrix inverse; + if (!matrix.invert(&inverse)) + return; // give up if the matrix is degenerate, and not invertable + inverse.set(SkMatrix::kMTransX, 0); + inverse.set(SkMatrix::kMTransY, 0); + SkVector deviceUnits[2] = {{0, 1}, {1, 0}}; + inverse.mapPoints(deviceUnits, SK_ARRAY_COUNT(deviceUnits)); + FX_FLOAT width = + SkTMax(pGraphState->m_LineWidth, + SkTMin(deviceUnits[0].length(), deviceUnits[1].length())); + if (pGraphState->m_DashArray) { + int count = (pGraphState->m_DashCount + 1) / 2; + SkScalar* intervals = FX_Alloc2D(SkScalar, count, sizeof(SkScalar)); + // Set dash pattern + for (int i = 0; i < count; i++) { + FX_FLOAT on = pGraphState->m_DashArray[i * 2]; + if (on <= 0.000001f) + on = 1.f / 10; + FX_FLOAT off = i * 2 + 1 == pGraphState->m_DashCount + ? on + : pGraphState->m_DashArray[i * 2 + 1]; + if (off < 0) + off = 0; + intervals[i * 2] = on; + intervals[i * 2 + 1] = off; + } + spaint->setPathEffect( + SkDashPathEffect::Make(intervals, count * 2, pGraphState->m_DashPhase)); + } + spaint->setStyle(SkPaint::kStroke_Style); + spaint->setAntiAlias(true); + spaint->setStrokeWidth(width); + spaint->setStrokeMiter(pGraphState->m_MiterLimit); + spaint->setStrokeCap(cap); + spaint->setStrokeJoin(join); +} + +CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(CFX_DIBitmap* pBitmap, + bool bRgbByteOrder, + CFX_DIBitmap* pOriDevice, + bool bGroupKnockout) + : m_pBitmap(pBitmap), + m_pOriDevice(pOriDevice), + m_pRecorder(nullptr), + m_pCache(new SkiaState(this)), +#ifdef _SKIA_SUPPORT_PATHS_ + m_pClipRgn(nullptr), + m_FillFlags(0), + m_bRgbByteOrder(bRgbByteOrder), +#endif // _SKIA_SUPPORT_PATHS_ + m_bGroupKnockout(bGroupKnockout) { + SkBitmap skBitmap; + SkASSERT(pBitmap->GetBPP() == 8 || pBitmap->GetBPP() == 32); + SkImageInfo imageInfo = SkImageInfo::Make( + pBitmap->GetWidth(), pBitmap->GetHeight(), + pBitmap->GetBPP() == 8 ? kAlpha_8_SkColorType : kN32_SkColorType, + kOpaque_SkAlphaType); + skBitmap.installPixels(imageInfo, pBitmap->GetBuffer(), pBitmap->GetPitch(), + nullptr, // FIXME(caryclark) set color table + nullptr, nullptr); + m_pCanvas = new SkCanvas(skBitmap); +} + +#ifdef _SKIA_SUPPORT_ +CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(int size_x, int size_y) + : m_pBitmap(nullptr), + m_pOriDevice(nullptr), + m_pRecorder(new SkPictureRecorder), + m_pCache(new SkiaState(this)), + m_bGroupKnockout(false) { + m_pRecorder->beginRecording(SkIntToScalar(size_x), SkIntToScalar(size_y)); + m_pCanvas = m_pRecorder->getRecordingCanvas(); +} + +CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(SkPictureRecorder* recorder) + : m_pBitmap(nullptr), + m_pOriDevice(nullptr), + m_pRecorder(recorder), + m_pCache(new SkiaState(this)), + m_bGroupKnockout(false) { + m_pCanvas = m_pRecorder->getRecordingCanvas(); +} +#endif // _SKIA_SUPPORT_ + +CFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver() { + Flush(); + if (!m_pRecorder) + delete m_pCanvas; +} + +void CFX_SkiaDeviceDriver::Flush() { + m_pCache->Flush(); +} + +bool CFX_SkiaDeviceDriver::DrawDeviceText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t color) { + if (m_pCache->DrawText(nChars, pCharPos, pFont, pObject2Device, font_size, + color)) { + return true; + } + sk_sp typeface(SkSafeRef(pFont->GetDeviceCache())); + SkPaint paint; + paint.setAntiAlias(true); + paint.setColor(color); + paint.setTypeface(typeface); + paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); + paint.setHinting(SkPaint::kNo_Hinting); + paint.setTextSize(SkTAbs(font_size)); + paint.setSubpixelText(true); + m_pCanvas->save(); + SkScalar flip = font_size < 0 ? -1 : 1; + SkScalar vFlip = flip; + if (pFont->IsVertical()) + vFlip *= -1; + SkMatrix skMatrix = ToFlippedSkMatrix(*pObject2Device, flip); + m_pCanvas->concat(skMatrix); + SkTDArray positions; + positions.setCount(nChars); + SkTDArray glyphs; + glyphs.setCount(nChars); + for (int index = 0; index < nChars; ++index) { + const FXTEXT_CHARPOS& cp = pCharPos[index]; + positions[index] = {cp.m_Origin.x * flip, cp.m_Origin.y * vFlip}; + glyphs[index] = static_cast(cp.m_GlyphIndex); + } +#ifdef _SKIA_SUPPORT_PATHS_ + m_pBitmap->PreMultiply(); +#endif // _SKIA_SUPPORT_PATHS_ + m_pCanvas->drawPosText(glyphs.begin(), nChars * 2, positions.begin(), paint); + m_pCanvas->restore(); + + return true; +} + +int CFX_SkiaDeviceDriver::GetDeviceCaps(int caps_id) const { + switch (caps_id) { + case FXDC_DEVICE_CLASS: + return FXDC_DISPLAY; +#ifdef _SKIA_SUPPORT_ + case FXDC_PIXEL_WIDTH: + return m_pCanvas->imageInfo().width(); + case FXDC_PIXEL_HEIGHT: + return m_pCanvas->imageInfo().height(); + case FXDC_BITS_PIXEL: + return 32; + case FXDC_HORZ_SIZE: + case FXDC_VERT_SIZE: + return 0; + case FXDC_RENDER_CAPS: + return FXRC_GET_BITS | FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE | + FXRC_BLEND_MODE | FXRC_SOFT_CLIP | FXRC_ALPHA_OUTPUT | + FXRC_FILLSTROKE_PATH | FXRC_SHADING; +#endif // _SKIA_SUPPORT_ + +#ifdef _SKIA_SUPPORT_PATHS_ + case FXDC_PIXEL_WIDTH: + return m_pBitmap->GetWidth(); + case FXDC_PIXEL_HEIGHT: + return m_pBitmap->GetHeight(); + case FXDC_BITS_PIXEL: + return m_pBitmap->GetBPP(); + case FXDC_HORZ_SIZE: + case FXDC_VERT_SIZE: + return 0; + case FXDC_RENDER_CAPS: { + int flags = FXRC_GET_BITS | FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE | + FXRC_BLEND_MODE | FXRC_SOFT_CLIP | FXRC_SHADING; + if (m_pBitmap->HasAlpha()) { + flags |= FXRC_ALPHA_OUTPUT; + } else if (m_pBitmap->IsAlphaMask()) { + if (m_pBitmap->GetBPP() == 1) { + flags |= FXRC_BITMASK_OUTPUT; + } else { + flags |= FXRC_BYTEMASK_OUTPUT; + } + } + if (m_pBitmap->IsCmykImage()) { + flags |= FXRC_CMYK_OUTPUT; + } + return flags; + } +#endif // _SKIA_SUPPORT_PATHS_ + } + return 0; +} + +void CFX_SkiaDeviceDriver::SaveState() { + if (!m_pCache->ClipSave()) + m_pCanvas->save(); + +#ifdef _SKIA_SUPPORT_PATHS_ + std::unique_ptr pClip; + if (m_pClipRgn) + pClip = pdfium::MakeUnique(*m_pClipRgn); + m_StateStack.push_back(std::move(pClip)); +#endif // _SKIA_SUPPORT_PATHS_ +} + +void CFX_SkiaDeviceDriver::RestoreState(bool bKeepSaved) { + if (!m_pCache->ClipRestore()) + m_pCanvas->restore(); + if (bKeepSaved && !m_pCache->ClipSave()) + m_pCanvas->save(); +#ifdef _SKIA_SUPPORT_PATHS_ + m_pClipRgn.reset(); + + if (m_StateStack.empty()) + return; + + if (bKeepSaved) { + if (m_StateStack.back()) + m_pClipRgn = pdfium::MakeUnique(*m_StateStack.back()); + } else { + m_pClipRgn = std::move(m_StateStack.back()); + m_StateStack.pop_back(); + } +#endif // _SKIA_SUPPORT_PATHS_ +} + +#ifdef _SKIA_SUPPORT_PATHS_ +void CFX_SkiaDeviceDriver::SetClipMask(const FX_RECT& clipBox, + const SkPath& path) { + FX_RECT path_rect(clipBox.left, clipBox.top, clipBox.right + 1, + clipBox.bottom + 1); + path_rect.Intersect(m_pClipRgn->GetBox()); + CFX_DIBitmapRef mask; + CFX_DIBitmap* pThisLayer = mask.Emplace(); + pThisLayer->Create(path_rect.Width(), path_rect.Height(), FXDIB_8bppMask); + pThisLayer->Clear(0); + + SkImageInfo imageInfo = + SkImageInfo::Make(pThisLayer->GetWidth(), pThisLayer->GetHeight(), + SkColorType::kAlpha_8_SkColorType, kOpaque_SkAlphaType); + SkBitmap bitmap; + bitmap.installPixels(imageInfo, pThisLayer->GetBuffer(), + pThisLayer->GetPitch(), nullptr, nullptr, nullptr); + SkCanvas* canvas = new SkCanvas(bitmap); + canvas->translate( + -path_rect.left, + -path_rect.top); // FIXME(caryclark) wrong sign(s)? upside down? + SkPaint paint; + paint.setAntiAlias((m_FillFlags & FXFILL_NOPATHSMOOTH) == 0); + canvas->drawPath(path, paint); + m_pClipRgn->IntersectMaskF(path_rect.left, path_rect.top, mask); + delete canvas; +} +#endif // _SKIA_SUPPORT_PATHS_ + +bool CFX_SkiaDeviceDriver::SetClip_PathFill( + const CFX_PathData* pPathData, // path info + const CFX_Matrix* pObject2Device, // flips object's y-axis + int fill_mode // fill mode, WINDING or ALTERNATE + ) { + CFX_Matrix identity; + const CFX_Matrix* deviceMatrix = pObject2Device ? pObject2Device : &identity; + bool cached = m_pCache->SetClipFill(pPathData, deviceMatrix, fill_mode); + +#ifdef _SKIA_SUPPORT_PATHS_ + m_FillFlags = fill_mode; + if (!m_pClipRgn) { + m_pClipRgn = pdfium::MakeUnique( + GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); + } +#endif // _SKIA_SUPPORT_PATHS_ + if (pPathData->GetPoints().size() == 5 || + pPathData->GetPoints().size() == 4) { + CFX_FloatRect rectf; + if (pPathData->IsRect(deviceMatrix, &rectf)) { + rectf.Intersect( + CFX_FloatRect(0, 0, (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH), + (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_HEIGHT))); + // note that PDF's y-axis goes up; Skia's y-axis goes down + if (!cached) { + SkRect skClipRect = + SkRect::MakeLTRB(rectf.left, rectf.bottom, rectf.right, rectf.top); + DebugDrawSkiaClipRect(m_pCanvas, skClipRect); + m_pCanvas->clipRect(skClipRect, SkClipOp::kIntersect, true); + } + +#ifdef _SKIA_SUPPORT_PATHS_ + FX_RECT rect = rectf.GetOuterRect(); + m_pClipRgn->IntersectRect(rect); +#endif // _SKIA_SUPPORT_PATHS_ + DebugShowCanvasClip(m_pCanvas); + return true; + } + } + SkPath skClipPath = BuildPath(pPathData); + skClipPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE + ? SkPath::kEvenOdd_FillType + : SkPath::kWinding_FillType); + SkMatrix skMatrix = ToSkMatrix(*deviceMatrix); + skClipPath.transform(skMatrix); + DebugShowSkiaPath(skClipPath); + if (!cached) { + DebugDrawSkiaClipPath(m_pCanvas, skClipPath); + m_pCanvas->clipPath(skClipPath, SkClipOp::kIntersect, true); + } +#ifdef _SKIA_SUPPORT_PATHS_ + FX_RECT clipBox(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH), + GetDeviceCaps(FXDC_PIXEL_HEIGHT)); + SetClipMask(clipBox, skClipPath); +#endif // _SKIA_SUPPORT_PATHS_ + DebugShowCanvasClip(m_pCanvas); + return true; +} + +bool CFX_SkiaDeviceDriver::SetClip_PathStroke( + const CFX_PathData* pPathData, // path info + const CFX_Matrix* pObject2Device, // optional transformation + const CFX_GraphStateData* pGraphState // graphic state, for pen attributes + ) { + bool cached = m_pCache->SetClipStroke(pPathData, pObject2Device, pGraphState); + +#ifdef _SKIA_SUPPORT_PATHS_ + if (!m_pClipRgn) { + m_pClipRgn = pdfium::MakeUnique( + GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT)); + } +#endif // _SKIA_SUPPORT_PATHS_ + // build path data + SkPath skPath = BuildPath(pPathData); + SkMatrix skMatrix = ToSkMatrix(*pObject2Device); + SkPaint skPaint; + PaintStroke(&skPaint, pGraphState, skMatrix); + SkPath dst_path; + skPaint.getFillPath(skPath, &dst_path); + dst_path.transform(skMatrix); + if (!cached) { + DebugDrawSkiaClipPath(m_pCanvas, dst_path); + m_pCanvas->clipPath(dst_path, SkClipOp::kIntersect, true); + } +#ifdef _SKIA_SUPPORT_PATHS_ + FX_RECT clipBox(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH), + GetDeviceCaps(FXDC_PIXEL_HEIGHT)); + SetClipMask(clipBox, dst_path); +#endif // _SKIA_SUPPORT_PATHS_ + DebugShowCanvasClip(m_pCanvas); + return true; +} + +bool CFX_SkiaDeviceDriver::DrawPath( + const CFX_PathData* pPathData, // path info + const CFX_Matrix* pObject2Device, // optional transformation + const CFX_GraphStateData* pGraphState, // graphic state, for pen attributes + uint32_t fill_color, // fill color + uint32_t stroke_color, // stroke color + int fill_mode, // fill mode, WINDING or ALTERNATE. 0 for not filled + int blend_type) { + if (fill_mode & FX_ZEROAREA_FILL) + return true; + if (m_pCache->DrawPath(pPathData, pObject2Device, pGraphState, fill_color, + stroke_color, fill_mode, blend_type)) { + return true; + } + SkMatrix skMatrix; + if (pObject2Device) + skMatrix = ToSkMatrix(*pObject2Device); + else + skMatrix.setIdentity(); + SkPaint skPaint; + skPaint.setAntiAlias(true); + if (fill_mode & FXFILL_FULLCOVER) + skPaint.setBlendMode(SkBlendMode::kPlus); + int stroke_alpha = FXARGB_A(stroke_color); + if (pGraphState && stroke_alpha) + PaintStroke(&skPaint, pGraphState, skMatrix); + SkPath skPath = BuildPath(pPathData); + m_pCanvas->save(); + m_pCanvas->concat(skMatrix); + if ((fill_mode & 3) && fill_color) { + skPath.setFillType((fill_mode & 3) == FXFILL_ALTERNATE + ? SkPath::kEvenOdd_FillType + : SkPath::kWinding_FillType); + SkPath strokePath; + const SkPath* fillPath = &skPath; + if (pGraphState && stroke_alpha) { + if (m_bGroupKnockout) { + skPaint.getFillPath(skPath, &strokePath); + if (Op(skPath, strokePath, SkPathOp::kDifference_SkPathOp, + &strokePath)) { + fillPath = &strokePath; + } + } + } + skPaint.setStyle(SkPaint::kFill_Style); + skPaint.setColor(fill_color); +#ifdef _SKIA_SUPPORT_PATHS_ + m_pBitmap->PreMultiply(); +#endif // _SKIA_SUPPORT_PATHS_ + DebugShowSkiaDrawPath(m_pCanvas, skPaint, *fillPath); + m_pCanvas->drawPath(*fillPath, skPaint); + } + if (pGraphState && stroke_alpha) { + skPaint.setStyle(SkPaint::kStroke_Style); + skPaint.setColor(stroke_color); +#ifdef _SKIA_SUPPORT_PATHS_ + m_pBitmap->PreMultiply(); +#endif // _SKIA_SUPPORT_PATHS_ + DebugShowSkiaDrawPath(m_pCanvas, skPaint, skPath); + m_pCanvas->drawPath(skPath, skPaint); + } + m_pCanvas->restore(); + return true; +} + +bool CFX_SkiaDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, + FX_FLOAT y1, + FX_FLOAT x2, + FX_FLOAT y2, + uint32_t color, + int blend_type) { + return false; +} + +bool CFX_SkiaDeviceDriver::FillRectWithBlend(const FX_RECT* pRect, + uint32_t fill_color, + int blend_type) { + m_pCache->FlushForDraw(); + SkPaint spaint; + spaint.setAntiAlias(true); + spaint.setColor(fill_color); + spaint.setBlendMode(GetSkiaBlendMode(blend_type)); + SkRect rect = + SkRect::MakeLTRB(pRect->left, SkTMin(pRect->top, pRect->bottom), + pRect->right, SkTMax(pRect->bottom, pRect->top)); + DebugShowSkiaDrawRect(m_pCanvas, spaint, rect); + m_pCanvas->drawRect(rect, spaint); + return true; +} + +bool CFX_SkiaDeviceDriver::DrawShading(const CPDF_ShadingPattern* pPattern, + const CFX_Matrix* pMatrix, + const FX_RECT& clip_rect, + int alpha, + bool bAlphaMode) { + m_pCache->FlushForDraw(); + ShadingType shadingType = pPattern->GetShadingType(); + if (kAxialShading != shadingType && kRadialShading != shadingType && + kCoonsPatchMeshShading != shadingType) { + // TODO(caryclark) more types + return false; + } + int csFamily = pPattern->GetCS()->GetFamily(); + if (PDFCS_DEVICERGB != csFamily && PDFCS_DEVICEGRAY != csFamily) + return false; + const std::vector>& pFuncs = + pPattern->GetFuncs(); + int nFuncs = pFuncs.size(); + if (nFuncs > 1) // TODO(caryclark) remove this restriction + return false; + CPDF_Dictionary* pDict = pPattern->GetShadingObject()->GetDict(); + CPDF_Array* pCoords = pDict->GetArrayFor("Coords"); + if (!pCoords && kCoonsPatchMeshShading != shadingType) + return false; + // TODO(caryclark) Respect Domain[0], Domain[1]. (Don't know what they do + // yet.) + SkTDArray skColors; + SkTDArray skPos; + for (int j = 0; j < nFuncs; j++) { + if (!pFuncs[j]) + continue; + + if (const CPDF_SampledFunc* pSampledFunc = pFuncs[j]->ToSampledFunc()) { + /* TODO(caryclark) + Type 0 Sampled Functions in PostScript can also have an Order integer + in the dictionary. PDFium doesn't appear to check for this anywhere. + */ + if (!AddSamples(pSampledFunc, &skColors, &skPos)) + return false; + } else if (const CPDF_ExpIntFunc* pExpIntFuc = pFuncs[j]->ToExpIntFunc()) { + if (!AddColors(pExpIntFuc, &skColors)) + return false; + skPos.push(0); + skPos.push(1); + } else if (const CPDF_StitchFunc* pStitchFunc = pFuncs[j]->ToStitchFunc()) { + if (!AddStitching(pStitchFunc, &skColors, &skPos)) + return false; + } else { + return false; + } + } + CPDF_Array* pArray = pDict->GetArrayFor("Extend"); + bool clipStart = !pArray || !pArray->GetIntegerAt(0); + bool clipEnd = !pArray || !pArray->GetIntegerAt(1); + SkPaint paint; + paint.setAntiAlias(true); + paint.setAlpha(alpha); + SkMatrix skMatrix = ToSkMatrix(*pMatrix); + SkRect skRect = SkRect::MakeLTRB(clip_rect.left, clip_rect.top, + clip_rect.right, clip_rect.bottom); + SkPath skClip; + SkPath skPath; + if (kAxialShading == shadingType) { + FX_FLOAT start_x = pCoords->GetNumberAt(0); + FX_FLOAT start_y = pCoords->GetNumberAt(1); + FX_FLOAT end_x = pCoords->GetNumberAt(2); + FX_FLOAT end_y = pCoords->GetNumberAt(3); + SkPoint pts[] = {{start_x, start_y}, {end_x, end_y}}; + skMatrix.mapPoints(pts, SK_ARRAY_COUNT(pts)); + paint.setShader(SkGradientShader::MakeLinear( + pts, skColors.begin(), skPos.begin(), skColors.count(), + SkShader::kClamp_TileMode)); + if (clipStart || clipEnd) { + // if the gradient is horizontal or vertical, modify the draw rectangle + if (pts[0].fX == pts[1].fX) { // vertical + if (pts[0].fY > pts[1].fY) { + SkTSwap(pts[0].fY, pts[1].fY); + SkTSwap(clipStart, clipEnd); + } + if (clipStart) + skRect.fTop = SkTMax(skRect.fTop, pts[0].fY); + if (clipEnd) + skRect.fBottom = SkTMin(skRect.fBottom, pts[1].fY); + } else if (pts[0].fY == pts[1].fY) { // horizontal + if (pts[0].fX > pts[1].fX) { + SkTSwap(pts[0].fX, pts[1].fX); + SkTSwap(clipStart, clipEnd); + } + if (clipStart) + skRect.fLeft = SkTMax(skRect.fLeft, pts[0].fX); + if (clipEnd) + skRect.fRight = SkTMin(skRect.fRight, pts[1].fX); + } else { // if the gradient is angled and contained by the rect, clip + SkPoint rectPts[4] = {{skRect.fLeft, skRect.fTop}, + {skRect.fRight, skRect.fTop}, + {skRect.fRight, skRect.fBottom}, + {skRect.fLeft, skRect.fBottom}}; + ClipAngledGradient(pts, rectPts, clipStart, clipEnd, &skClip); + } + } + skPath.addRect(skRect); + skMatrix.setIdentity(); + } else if (kRadialShading == shadingType) { + FX_FLOAT start_x = pCoords->GetNumberAt(0); + FX_FLOAT start_y = pCoords->GetNumberAt(1); + FX_FLOAT start_r = pCoords->GetNumberAt(2); + FX_FLOAT end_x = pCoords->GetNumberAt(3); + FX_FLOAT end_y = pCoords->GetNumberAt(4); + FX_FLOAT end_r = pCoords->GetNumberAt(5); + SkPoint pts[] = {{start_x, start_y}, {end_x, end_y}}; + + paint.setShader(SkGradientShader::MakeTwoPointConical( + pts[0], start_r, pts[1], end_r, skColors.begin(), skPos.begin(), + skColors.count(), SkShader::kClamp_TileMode)); + if (clipStart || clipEnd) { + if (clipStart && start_r) + skClip.addCircle(pts[0].fX, pts[0].fY, start_r); + if (clipEnd) + skClip.addCircle(pts[1].fX, pts[1].fY, end_r, SkPath::kCCW_Direction); + else + skClip.setFillType(SkPath::kInverseWinding_FillType); + skClip.transform(skMatrix); + } + SkMatrix inverse; + if (!skMatrix.invert(&inverse)) + return false; + skPath.addRect(skRect); + skPath.transform(inverse); + } else { + ASSERT(kCoonsPatchMeshShading == shadingType); + CPDF_Stream* pStream = ToStream(pPattern->GetShadingObject()); + if (!pStream) + return false; + CPDF_MeshStream stream(shadingType, pPattern->GetFuncs(), pStream, + pPattern->GetCS()); + if (!stream.Load()) + return false; + SkPoint cubics[12]; + SkColor colors[4]; + m_pCanvas->save(); + if (!skClip.isEmpty()) + m_pCanvas->clipPath(skClip, SkClipOp::kIntersect, true); + m_pCanvas->concat(skMatrix); + while (!stream.BitStream()->IsEOF()) { + uint32_t flag = stream.ReadFlag(); + int iStartPoint = flag ? 4 : 0; + int iStartColor = flag ? 2 : 0; + if (flag) { + SkPoint tempCubics[4]; + for (int i = 0; i < (int)SK_ARRAY_COUNT(tempCubics); i++) + tempCubics[i] = cubics[(flag * 3 + i) % 12]; + FXSYS_memcpy(cubics, tempCubics, sizeof(tempCubics)); + SkColor tempColors[2]; + tempColors[0] = colors[flag]; + tempColors[1] = colors[(flag + 1) % 4]; + FXSYS_memcpy(colors, tempColors, sizeof(tempColors)); + } + for (int i = iStartPoint; i < (int)SK_ARRAY_COUNT(cubics); i++) { + CFX_PointF point = stream.ReadCoords(); + cubics[i].fX = point.x; + cubics[i].fY = point.y; + } + for (int i = iStartColor; i < (int)SK_ARRAY_COUNT(colors); i++) { + FX_FLOAT r; + FX_FLOAT g; + FX_FLOAT b; + std::tie(r, g, b) = stream.ReadColor(); + colors[i] = SkColorSetARGBInline(0xFF, (U8CPU)(r * 255), + (U8CPU)(g * 255), (U8CPU)(b * 255)); + } + m_pCanvas->drawPatch(cubics, colors, nullptr, paint); + } + m_pCanvas->restore(); + return true; + } + m_pCanvas->save(); + if (!skClip.isEmpty()) + m_pCanvas->clipPath(skClip, SkClipOp::kIntersect, true); + m_pCanvas->concat(skMatrix); + m_pCanvas->drawPath(skPath, paint); + m_pCanvas->restore(); + return true; +} + +uint8_t* CFX_SkiaDeviceDriver::GetBuffer() const { + return m_pBitmap->GetBuffer(); +} + +bool CFX_SkiaDeviceDriver::GetClipBox(FX_RECT* pRect) { + // TODO(caryclark) call m_canvas->getClipDeviceBounds() instead + pRect->left = 0; + pRect->top = 0; + const SkImageInfo& canvasSize = m_pCanvas->imageInfo(); + pRect->right = canvasSize.width(); + pRect->bottom = canvasSize.height(); + return true; +} + +bool CFX_SkiaDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top) { + if (!m_pBitmap) + return true; + uint8_t* srcBuffer = m_pBitmap->GetBuffer(); + if (!srcBuffer) + return true; +#ifdef _SKIA_SUPPORT_ + m_pCache->FlushForDraw(); + int srcWidth = m_pBitmap->GetWidth(); + int srcHeight = m_pBitmap->GetHeight(); + int srcRowBytes = srcWidth * sizeof(uint32_t); + SkImageInfo srcImageInfo = SkImageInfo::Make( + srcWidth, srcHeight, SkColorType::kN32_SkColorType, kPremul_SkAlphaType); + SkBitmap skSrcBitmap; + skSrcBitmap.installPixels(srcImageInfo, srcBuffer, srcRowBytes, nullptr, + nullptr, nullptr); + SkASSERT(pBitmap); + uint8_t* dstBuffer = pBitmap->GetBuffer(); + SkASSERT(dstBuffer); + int dstWidth = pBitmap->GetWidth(); + int dstHeight = pBitmap->GetHeight(); + int dstRowBytes = dstWidth * sizeof(uint32_t); + SkImageInfo dstImageInfo = SkImageInfo::Make( + dstWidth, dstHeight, SkColorType::kN32_SkColorType, kPremul_SkAlphaType); + SkBitmap skDstBitmap; + skDstBitmap.installPixels(dstImageInfo, dstBuffer, dstRowBytes, nullptr, + nullptr, nullptr); + SkCanvas canvas(skDstBitmap); + canvas.drawBitmap(skSrcBitmap, left, top, nullptr); + return true; +#endif // _SKIA_SUPPORT_ + +#ifdef _SKIA_SUPPORT_PATHS_ + Flush(); + m_pBitmap->UnPreMultiply(); + FX_RECT rect(left, top, left + pBitmap->GetWidth(), + top + pBitmap->GetHeight()); + std::unique_ptr pBack; + if (m_pOriDevice) { + pBack = m_pOriDevice->Clone(&rect); + if (!pBack) + return true; + + pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(), + m_pBitmap, 0, 0); + } else { + pBack = m_pBitmap->Clone(&rect); + if (!pBack) + return true; + } + + bool bRet = true; + left = std::min(left, 0); + top = std::min(top, 0); + if (m_bRgbByteOrder) { + RgbByteOrderTransferBitmap(pBitmap, 0, 0, rect.Width(), rect.Height(), + pBack.get(), left, top); + } else { + bRet = pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(), + pBack.get(), left, top); + } + return bRet; +#endif // _SKIA_SUPPORT_PATHS_ +} + +CFX_DIBitmap* CFX_SkiaDeviceDriver::GetBackDrop() { + return m_pOriDevice; +} + +bool CFX_SkiaDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap, + uint32_t argb, + const FX_RECT* pSrcRect, + int left, + int top, + int blend_type) { + if (!m_pBitmap || !m_pBitmap->GetBuffer()) + return true; + +#ifdef _SKIA_SUPPORT_ + CFX_Matrix m(pBitmap->GetWidth(), 0, 0, -pBitmap->GetHeight(), left, + top + pBitmap->GetHeight()); + void* dummy; + return StartDIBits(pBitmap, 0xFF, argb, &m, 0, dummy, blend_type); +#endif // _SKIA_SUPPORT_ + +#ifdef _SKIA_SUPPORT_PATHS_ + Flush(); + if (pBitmap->IsAlphaMask()) { + return m_pBitmap->CompositeMask( + left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, argb, + pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn.get(), + m_bRgbByteOrder, 0, nullptr); + } + return m_pBitmap->CompositeBitmap( + left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, pSrcRect->left, + pSrcRect->top, blend_type, m_pClipRgn.get(), m_bRgbByteOrder, nullptr); +#endif // _SKIA_SUPPORT_PATHS_ +} + +bool CFX_SkiaDeviceDriver::StretchDIBits(const CFX_DIBSource* pSource, + uint32_t argb, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + uint32_t flags, + int blend_type) { +#ifdef _SKIA_SUPPORT_ + m_pCache->FlushForDraw(); + if (!m_pBitmap->GetBuffer()) + return true; + CFX_Matrix m(dest_width, 0, 0, -dest_height, dest_left, + dest_top + dest_height); + + m_pCanvas->save(); + SkRect skClipRect = SkRect::MakeLTRB(pClipRect->left, pClipRect->bottom, + pClipRect->right, pClipRect->top); + m_pCanvas->clipRect(skClipRect, SkClipOp::kIntersect, true); + void* dummy; + bool result = StartDIBits(pSource, 0xFF, argb, &m, 0, dummy, blend_type); + m_pCanvas->restore(); + + return result; +#endif // _SKIA_SUPPORT_ + +#ifdef _SKIA_SUPPORT_PATHS_ + if (dest_width == pSource->GetWidth() && + dest_height == pSource->GetHeight()) { + FX_RECT rect(0, 0, dest_width, dest_height); + return SetDIBits(pSource, argb, &rect, dest_left, dest_top, blend_type); + } + Flush(); + FX_RECT dest_rect(dest_left, dest_top, dest_left + dest_width, + dest_top + dest_height); + dest_rect.Normalize(); + FX_RECT dest_clip = dest_rect; + dest_clip.Intersect(*pClipRect); + CFX_BitmapComposer composer; + composer.Compose(m_pBitmap, m_pClipRgn.get(), 255, argb, dest_clip, false, + false, false, m_bRgbByteOrder, 0, nullptr, blend_type); + dest_clip.Offset(-dest_rect.left, -dest_rect.top); + CFX_ImageStretcher stretcher(&composer, pSource, dest_width, dest_height, + dest_clip, flags); + if (stretcher.Start()) + stretcher.Continue(nullptr); + return true; +#endif // _SKIA_SUPPORT_PATHS_ +} + +bool CFX_SkiaDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, + int bitmap_alpha, + uint32_t argb, + const CFX_Matrix* pMatrix, + uint32_t render_flags, + void*& handle, + int blend_type) { +#ifdef _SKIA_SUPPORT_ + m_pCache->FlushForDraw(); + DebugValidate(m_pBitmap, m_pOriDevice); + SkColorTable* ct = nullptr; + std::unique_ptr dst8Storage; + std::unique_ptr dst32Storage; + SkBitmap skBitmap; + int width, height; + if (!Upsample(pSource, dst8Storage, dst32Storage, &ct, &skBitmap, &width, + &height, false)) { + return false; + } + m_pCanvas->save(); + SkMatrix skMatrix; + SetBitmapMatrix(pMatrix, width, height, &skMatrix); + m_pCanvas->concat(skMatrix); + SkPaint paint; + SetBitmapPaint(pSource->IsAlphaMask(), argb, bitmap_alpha, blend_type, + &paint); + // TODO(caryclark) Once Skia supports 8 bit src to 8 bit dst remove this + if (m_pBitmap && m_pBitmap->GetBPP() == 8 && pSource->GetBPP() == 8) { + SkMatrix inv; + SkAssertResult(skMatrix.invert(&inv)); + for (int y = 0; y < m_pBitmap->GetHeight(); ++y) { + for (int x = 0; x < m_pBitmap->GetWidth(); ++x) { + SkPoint src = {x + 0.5f, y + 0.5f}; + inv.mapPoints(&src, 1); + // TODO(caryclark) Why does the matrix map require clamping? + src.fX = SkTMax(0.5f, SkTMin(src.fX, width - 0.5f)); + src.fY = SkTMax(0.5f, SkTMin(src.fY, height - 0.5f)); + m_pBitmap->SetPixel(x, y, skBitmap.getColor(src.fX, src.fY)); + } + } + } else { + m_pCanvas->drawBitmap(skBitmap, 0, 0, &paint); + } + m_pCanvas->restore(); + if (ct) + ct->unref(); + DebugValidate(m_pBitmap, m_pOriDevice); +#endif // _SKIA_SUPPORT_ + +#ifdef _SKIA_SUPPORT_PATHS_ + Flush(); + if (!m_pBitmap->GetBuffer()) + return true; + m_pBitmap->UnPreMultiply(); + CFX_ImageRenderer* pRenderer = new CFX_ImageRenderer; + pRenderer->Start(m_pBitmap, m_pClipRgn.get(), pSource, bitmap_alpha, argb, + pMatrix, render_flags, m_bRgbByteOrder, 0, nullptr); + handle = pRenderer; +#endif // _SKIA_SUPPORT_PATHS_ + return true; +} + +bool CFX_SkiaDeviceDriver::ContinueDIBits(void* handle, IFX_Pause* pPause) { +#ifdef _SKIA_SUPPORT_ + m_pCache->FlushForDraw(); + return false; +#endif // _SKIA_SUPPORT_ + +#ifdef _SKIA_SUPPORT_PATHS_ + Flush(); + if (!m_pBitmap->GetBuffer()) { + return true; + } + return static_cast(handle)->Continue(pPause); +#endif // _SKIA_SUPPORT_PATHS_ +} + +#if defined _SKIA_SUPPORT_ +void CFX_SkiaDeviceDriver::PreMultiply(CFX_DIBitmap* pDIBitmap) { + pDIBitmap->PreMultiply(); +} +#endif // _SKIA_SUPPORT_ + +void CFX_DIBitmap::PreMultiply() { + if (this->GetBPP() != 32) + return; + void* buffer = this->GetBuffer(); + if (!buffer) + return; +#if defined _SKIA_SUPPORT_PATHS_ + Format priorFormat = m_nFormat; + m_nFormat = Format::kPreMultiplied; + if (priorFormat != Format::kUnPreMultiplied) + return; +#endif + int height = this->GetHeight(); + int width = this->GetWidth(); + int rowBytes = this->GetPitch(); + SkImageInfo unpremultipliedInfo = + SkImageInfo::Make(width, height, kN32_SkColorType, kUnpremul_SkAlphaType); + SkPixmap unpremultiplied(unpremultipliedInfo, buffer, rowBytes); + SkImageInfo premultipliedInfo = + SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType); + SkPixmap premultiplied(premultipliedInfo, buffer, rowBytes); + unpremultiplied.readPixels(premultiplied); + this->DebugVerifyBitmapIsPreMultiplied(); +} + +#ifdef _SKIA_SUPPORT_PATHS_ +void CFX_DIBitmap::UnPreMultiply() { + if (this->GetBPP() != 32) + return; + void* buffer = this->GetBuffer(); + if (!buffer) + return; + Format priorFormat = m_nFormat; + m_nFormat = Format::kUnPreMultiplied; + if (priorFormat != Format::kPreMultiplied) + return; + this->DebugVerifyBitmapIsPreMultiplied(); + int height = this->GetHeight(); + int width = this->GetWidth(); + int rowBytes = this->GetPitch(); + SkImageInfo premultipliedInfo = + SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType); + SkPixmap premultiplied(premultipliedInfo, buffer, rowBytes); + SkImageInfo unpremultipliedInfo = + SkImageInfo::Make(width, height, kN32_SkColorType, kUnpremul_SkAlphaType); + SkPixmap unpremultiplied(unpremultipliedInfo, buffer, rowBytes); + premultiplied.readPixels(unpremultiplied); +} +#endif // _SKIA_SUPPORT_PATHS_ + +#ifdef _SKIA_SUPPORT_ +bool CFX_SkiaDeviceDriver::DrawBitsWithMask(const CFX_DIBSource* pSource, + const CFX_DIBSource* pMask, + int bitmap_alpha, + const CFX_Matrix* pMatrix, + int blend_type) { + DebugValidate(m_pBitmap, m_pOriDevice); + SkColorTable* srcCt = nullptr; + SkColorTable* maskCt = nullptr; + std::unique_ptr src8Storage, mask8Storage; + std::unique_ptr src32Storage, mask32Storage; + SkBitmap skBitmap, skMask; + int srcWidth, srcHeight, maskWidth, maskHeight; + if (!Upsample(pSource, src8Storage, src32Storage, &srcCt, &skBitmap, + &srcWidth, &srcHeight, false)) { + return false; + } + if (!Upsample(pMask, mask8Storage, mask32Storage, &maskCt, &skMask, + &maskWidth, &maskHeight, true)) { + return false; + } + m_pCanvas->save(); + SkMatrix skMatrix; + SetBitmapMatrix(pMatrix, srcWidth, srcHeight, &skMatrix); + m_pCanvas->concat(skMatrix); + SkPaint paint; + SetBitmapPaint(pSource->IsAlphaMask(), 0xFFFFFFFF, bitmap_alpha, blend_type, + &paint); + sk_sp skSrc = SkImage::MakeFromBitmap(skBitmap); + sk_sp skSrcShader = + skSrc->makeShader(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); + sk_sp skMaskImage = SkImage::MakeFromBitmap(skMask); + sk_sp skMaskShader = skMaskImage->makeShader( + SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); + paint.setShader(SkShader::MakeComposeShader(skMaskShader, skSrcShader, + SkBlendMode::kSrcIn)); + SkRect r = {0, 0, SkIntToScalar(srcWidth), SkIntToScalar(srcHeight)}; + m_pCanvas->drawRect(r, paint); + m_pCanvas->restore(); + if (srcCt) + srcCt->unref(); + DebugValidate(m_pBitmap, m_pOriDevice); + return true; +} + +bool CFX_SkiaDeviceDriver::SetBitsWithMask(const CFX_DIBSource* pBitmap, + const CFX_DIBSource* pMask, + int dest_left, + int dest_top, + int bitmap_alpha, + int blend_type) { + if (!m_pBitmap || !m_pBitmap->GetBuffer()) + return true; + CFX_Matrix m(pBitmap->GetWidth(), 0, 0, -pBitmap->GetHeight(), dest_left, + dest_top + pBitmap->GetHeight()); + return DrawBitsWithMask(pBitmap, pMask, bitmap_alpha, &m, blend_type); +} + +void CFX_SkiaDeviceDriver::Clear(uint32_t color) { + m_pCanvas->clear(color); +} +#endif // _SKIA_SUPPORT_ + +void CFX_SkiaDeviceDriver::Dump() const { +#if SHOW_SKIA_PATH && defined _SKIA_SUPPORT_ + if (m_pCache) + m_pCache->Dump(this); +#endif // SHOW_SKIA_PATH && defined _SKIA_SUPPORT_ +} + +#ifdef _SKIA_SUPPORT_ +void CFX_SkiaDeviceDriver::DebugVerifyBitmapIsPreMultiplied() const { + if (m_pOriDevice) + m_pOriDevice->DebugVerifyBitmapIsPreMultiplied(); +} +#endif // _SKIA_SUPPORT_ + +CFX_FxgeDevice::CFX_FxgeDevice() { +#ifdef _SKIA_SUPPORT_ + m_bOwnedBitmap = false; +#endif // _SKIA_SUPPORT_ +} + +#ifdef _SKIA_SUPPORT_ +void CFX_FxgeDevice::Clear(uint32_t color) { + CFX_SkiaDeviceDriver* skDriver = + static_cast(GetDeviceDriver()); + skDriver->Clear(color); +} + +SkPictureRecorder* CFX_FxgeDevice::CreateRecorder(int size_x, int size_y) { + CFX_SkiaDeviceDriver* skDriver = new CFX_SkiaDeviceDriver(size_x, size_y); + SetDeviceDriver(pdfium::WrapUnique(skDriver)); + return skDriver->GetRecorder(); +} +#endif // _SKIA_SUPPORT_ + +bool CFX_FxgeDevice::Attach(CFX_DIBitmap* pBitmap, + bool bRgbByteOrder, + CFX_DIBitmap* pOriDevice, + bool bGroupKnockout) { + if (!pBitmap) + return false; + SetBitmap(pBitmap); + SetDeviceDriver(pdfium::MakeUnique( + pBitmap, bRgbByteOrder, pOriDevice, bGroupKnockout)); + return true; +} + +#ifdef _SKIA_SUPPORT_ +bool CFX_FxgeDevice::AttachRecorder(SkPictureRecorder* recorder) { + if (!recorder) + return false; + SetDeviceDriver(pdfium::MakeUnique(recorder)); + return true; +} +#endif // _SKIA_SUPPORT_ + +bool CFX_FxgeDevice::Create(int width, + int height, + FXDIB_Format format, + CFX_DIBitmap* pOriDevice) { + m_bOwnedBitmap = true; + CFX_DIBitmap* pBitmap = new CFX_DIBitmap; + if (!pBitmap->Create(width, height, format)) { + delete pBitmap; + return false; + } + SetBitmap(pBitmap); + SetDeviceDriver(pdfium::MakeUnique(pBitmap, false, + pOriDevice, false)); + return true; +} + +CFX_FxgeDevice::~CFX_FxgeDevice() { +#ifdef _SKIA_SUPPORT_ + Flush(); + // call destructor of CFX_RenderDevice / CFX_SkiaDeviceDriver immediately + if (m_bOwnedBitmap && GetBitmap()) + delete GetBitmap(); +#endif // _SKIA_SUPPORT_ +} + +#ifdef _SKIA_SUPPORT_ +void CFX_FxgeDevice::DebugVerifyBitmapIsPreMultiplied() const { +#ifdef SK_DEBUG + CFX_SkiaDeviceDriver* skDriver = + static_cast(GetDeviceDriver()); + if (skDriver) + skDriver->DebugVerifyBitmapIsPreMultiplied(); +#endif // SK_DEBUG +} + +bool CFX_FxgeDevice::SetBitsWithMask(const CFX_DIBSource* pBitmap, + const CFX_DIBSource* pMask, + int left, + int top, + int bitmap_alpha, + int blend_type) { + CFX_SkiaDeviceDriver* skDriver = + static_cast(GetDeviceDriver()); + if (skDriver) + return skDriver->SetBitsWithMask(pBitmap, pMask, left, top, bitmap_alpha, + blend_type); + return false; +} +#endif // _SKIA_SUPPORT_ + +void CFX_DIBSource::DebugVerifyBitmapIsPreMultiplied(void* opt) const { +#ifdef SK_DEBUG + SkASSERT(32 == GetBPP()); + const uint32_t* buffer = (const uint32_t*)(opt ? opt : GetBuffer()); + int width = GetWidth(); + int height = GetHeight(); + // verify that input is really premultiplied + for (int y = 0; y < height; ++y) { + const uint32_t* srcRow = buffer + y * width; + for (int x = 0; x < width; ++x) { + uint8_t a = SkGetPackedA32(srcRow[x]); + uint8_t r = SkGetPackedR32(srcRow[x]); + uint8_t g = SkGetPackedG32(srcRow[x]); + uint8_t b = SkGetPackedB32(srcRow[x]); + SkA32Assert(a); + SkASSERT(r <= a); + SkASSERT(g <= a); + SkASSERT(b <= a); + } + } +#endif // SK_DEBUG +} + +#ifdef _SKIA_SUPPORT_PATHS_ +class CFX_Renderer { + private: + int m_Alpha, m_Red, m_Green, m_Blue, m_Gray; + uint32_t m_Color; + bool m_bFullCover; + bool m_bRgbByteOrder; + CFX_DIBitmap* m_pOriDevice; + FX_RECT m_ClipBox; + const CFX_DIBitmap* m_pClipMask; + CFX_DIBitmap* m_pDevice; + const CFX_ClipRgn* m_pClipRgn; + void (CFX_Renderer::*composite_span)(uint8_t*, + int, + int, + int, + uint8_t*, + int, + int, + uint8_t*, + uint8_t*); + + public: + void prepare(unsigned) {} + + void CompositeSpan(uint8_t* dest_scan, + uint8_t* ori_scan, + int Bpp, + bool bDestAlpha, + int span_left, + int span_len, + uint8_t* cover_scan, + int clip_left, + int clip_right, + uint8_t* clip_scan) { + ASSERT(!m_pDevice->IsCmykImage()); + int col_start = span_left < clip_left ? clip_left - span_left : 0; + int col_end = (span_left + span_len) < clip_right + ? span_len + : (clip_right - span_left); + if (Bpp) { + dest_scan += col_start * Bpp; + ori_scan += col_start * Bpp; + } else { + dest_scan += col_start / 8; + ori_scan += col_start / 8; + } + if (m_bRgbByteOrder) { + if (Bpp == 4 && bDestAlpha) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + uint8_t dest_alpha = + ori_scan[3] + src_alpha - ori_scan[3] * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + if (m_bFullCover) { + *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, alpha_ratio); + *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, alpha_ratio); + *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, alpha_ratio); + dest_scan++; + ori_scan++; + } else { + int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, alpha_ratio); + int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, alpha_ratio); + int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, alpha_ratio); + ori_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]); + dest_scan += 2; + } + } + return; + } + if (Bpp == 3 || Bpp == 4) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, src_alpha); + int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); + int b = FXDIB_ALPHA_MERGE(*ori_scan, m_Blue, src_alpha); + ori_scan += Bpp - 2; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]); + dest_scan += Bpp - 2; + } + } + return; + } + if (Bpp == 4 && bDestAlpha) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + int src_alpha_covered = src_alpha * cover_scan[col] / 255; + if (src_alpha_covered == 0) { + dest_scan += 4; + continue; + } + if (cover_scan[col] == 255) { + dest_scan[3] = src_alpha_covered; + *dest_scan++ = m_Blue; + *dest_scan++ = m_Green; + *dest_scan = m_Red; + dest_scan += 2; + continue; + } else { + if (dest_scan[3] == 0) { + dest_scan[3] = src_alpha_covered; + *dest_scan++ = m_Blue; + *dest_scan++ = m_Green; + *dest_scan = m_Red; + dest_scan += 2; + continue; + } + uint8_t cover = cover_scan[col]; + dest_scan[3] = FXDIB_ALPHA_MERGE(dest_scan[3], src_alpha, cover); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, cover); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, cover); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, cover); + dest_scan += 2; + } + } + return; + } + if (Bpp == 3 || Bpp == 4) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + if (m_bFullCover) { + *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha); + *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha); + dest_scan += Bpp - 2; + ori_scan += Bpp - 2; + continue; + } + int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha); + int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha); + int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha); + ori_scan += Bpp - 2; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan[col]); + dest_scan += Bpp - 2; + continue; + } + return; + } + if (Bpp == 1) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + if (m_bFullCover) { + *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha); + } else { + int gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha); + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan[col]); + dest_scan++; + } + } + } else { + int index = 0; + if (m_pDevice->GetPalette()) { + for (int i = 0; i < 2; i++) { + if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) { + index = i; + } + } + } else { + index = ((uint8_t)m_Color == 0xff) ? 1 : 0; + } + uint8_t* dest_scan1 = dest_scan; + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + if (src_alpha) { + if (!index) { + *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8)); + } else { + *dest_scan1 |= 1 << (7 - (col + span_left) % 8); + } + } + dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8; + } + } + } + + void CompositeSpan1bpp(uint8_t* dest_scan, + int Bpp, + int span_left, + int span_len, + uint8_t* cover_scan, + int clip_left, + int clip_right, + uint8_t* clip_scan, + uint8_t* dest_extra_alpha_scan) { + ASSERT(!m_bRgbByteOrder); + ASSERT(!m_pDevice->IsCmykImage()); + int col_start = span_left < clip_left ? clip_left - span_left : 0; + int col_end = (span_left + span_len) < clip_right + ? span_len + : (clip_right - span_left); + dest_scan += col_start / 8; + int index = 0; + if (m_pDevice->GetPalette()) { + for (int i = 0; i < 2; i++) { + if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) { + index = i; + } + } + } else { + index = ((uint8_t)m_Color == 0xff) ? 1 : 0; + } + uint8_t* dest_scan1 = dest_scan; + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + if (src_alpha) { + if (!index) { + *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8)); + } else { + *dest_scan1 |= 1 << (7 - (col + span_left) % 8); + } + } + dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8; + } + } + + void CompositeSpanGray(uint8_t* dest_scan, + int Bpp, + int span_left, + int span_len, + uint8_t* cover_scan, + int clip_left, + int clip_right, + uint8_t* clip_scan, + uint8_t* dest_extra_alpha_scan) { + ASSERT(!m_bRgbByteOrder); + int col_start = span_left < clip_left ? clip_left - span_left : 0; + int col_end = (span_left + span_len) < clip_right + ? span_len + : (clip_right - span_left); + dest_scan += col_start; + if (dest_extra_alpha_scan) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (m_bFullCover) { + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + } else { + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + } + if (src_alpha) { + if (src_alpha == 255) { + *dest_scan = m_Gray; + *dest_extra_alpha_scan = m_Alpha; + } else { + uint8_t dest_alpha = (*dest_extra_alpha_scan) + src_alpha - + (*dest_extra_alpha_scan) * src_alpha / 255; + *dest_extra_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio); + dest_scan++; + continue; + } + } + dest_extra_alpha_scan++; + dest_scan++; + } + } else { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + if (src_alpha) { + if (src_alpha == 255) { + *dest_scan = m_Gray; + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha); + } + } + dest_scan++; + } + } + } + + void CompositeSpanARGB(uint8_t* dest_scan, + int Bpp, + int span_left, + int span_len, + uint8_t* cover_scan, + int clip_left, + int clip_right, + uint8_t* clip_scan, + uint8_t* dest_extra_alpha_scan) { + int col_start = span_left < clip_left ? clip_left - span_left : 0; + int col_end = (span_left + span_len) < clip_right + ? span_len + : (clip_right - span_left); + dest_scan += col_start * Bpp; + if (m_bRgbByteOrder) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (m_bFullCover) { + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + } else { + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + } + if (src_alpha) { + if (src_alpha == 255) { + *(uint32_t*)dest_scan = m_Color; + } else { + uint8_t dest_alpha = + dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); + dest_scan += 2; + continue; + } + } + dest_scan += 4; + } + return; + } + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (m_bFullCover) { + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + } else { + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + } + if (src_alpha) { + if (src_alpha == 255) { + *(uint32_t*)dest_scan = m_Color; + } else { + if (dest_scan[3] == 0) { + dest_scan[3] = src_alpha; + *dest_scan++ = m_Blue; + *dest_scan++ = m_Green; + *dest_scan = m_Red; + dest_scan += 2; + continue; + } + uint8_t dest_alpha = + dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255; + dest_scan[3] = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); + dest_scan += 2; + continue; + } + } + dest_scan += Bpp; + } + } + + void CompositeSpanRGB(uint8_t* dest_scan, + int Bpp, + int span_left, + int span_len, + uint8_t* cover_scan, + int clip_left, + int clip_right, + uint8_t* clip_scan, + uint8_t* dest_extra_alpha_scan) { + int col_start = span_left < clip_left ? clip_left - span_left : 0; + int col_end = (span_left + span_len) < clip_right + ? span_len + : (clip_right - span_left); + dest_scan += col_start * Bpp; + if (m_bRgbByteOrder) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + if (src_alpha) { + if (src_alpha == 255) { + if (Bpp == 4) { + *(uint32_t*)dest_scan = m_Color; + } else if (Bpp == 3) { + *dest_scan++ = m_Red; + *dest_scan++ = m_Green; + *dest_scan++ = m_Blue; + continue; + } + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); + dest_scan += Bpp - 2; + continue; + } + } + dest_scan += Bpp; + } + return; + } + if (Bpp == 3 && dest_extra_alpha_scan) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (m_bFullCover) { + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + } else { + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + } + if (src_alpha) { + if (src_alpha == 255) { + *dest_scan++ = (uint8_t)m_Blue; + *dest_scan++ = (uint8_t)m_Green; + *dest_scan++ = (uint8_t)m_Red; + *dest_extra_alpha_scan++ = (uint8_t)m_Alpha; + continue; + } else { + uint8_t dest_alpha = (*dest_extra_alpha_scan) + src_alpha - + (*dest_extra_alpha_scan) * src_alpha / 255; + *dest_extra_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); + dest_scan++; + continue; + } + } + dest_extra_alpha_scan++; + dest_scan += Bpp; + } + } else { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (m_bFullCover) { + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + } else { + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + } + if (src_alpha) { + if (src_alpha == 255) { + if (Bpp == 4) { + *(uint32_t*)dest_scan = m_Color; + } else if (Bpp == 3) { + *dest_scan++ = m_Blue; + *dest_scan++ = m_Green; + *dest_scan++ = m_Red; + continue; + } + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha); + dest_scan += Bpp - 2; + continue; + } + } + dest_scan += Bpp; + } + } + } + + void CompositeSpanCMYK(uint8_t* dest_scan, + int Bpp, + int span_left, + int span_len, + uint8_t* cover_scan, + int clip_left, + int clip_right, + uint8_t* clip_scan, + uint8_t* dest_extra_alpha_scan) { + ASSERT(!m_bRgbByteOrder); + int col_start = span_left < clip_left ? clip_left - span_left : 0; + int col_end = (span_left + span_len) < clip_right + ? span_len + : (clip_right - span_left); + dest_scan += col_start * 4; + if (dest_extra_alpha_scan) { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (m_bFullCover) { + if (clip_scan) { + src_alpha = m_Alpha * clip_scan[col] / 255; + } else { + src_alpha = m_Alpha; + } + } else { + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + } + if (src_alpha) { + if (src_alpha == 255) { + *(FX_CMYK*)dest_scan = m_Color; + *dest_extra_alpha_scan = (uint8_t)m_Alpha; + } else { + uint8_t dest_alpha = (*dest_extra_alpha_scan) + src_alpha - + (*dest_extra_alpha_scan) * src_alpha / 255; + *dest_extra_alpha_scan++ = dest_alpha; + int alpha_ratio = src_alpha * 255 / dest_alpha; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio); + dest_scan++; + continue; + } + } + dest_extra_alpha_scan++; + dest_scan += 4; + } + } else { + for (int col = col_start; col < col_end; col++) { + int src_alpha; + if (clip_scan) { + src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255; + } else { + src_alpha = m_Alpha * cover_scan[col] / 255; + } + if (src_alpha) { + if (src_alpha == 255) { + *(FX_CMYK*)dest_scan = m_Color; + } else { + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha); + dest_scan++; + *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha); + dest_scan++; + continue; + } + } + dest_scan += 4; + } + } + } + + template + void render(const Scanline& sl) { + if (!m_pOriDevice && !composite_span) { + return; + } + int y = sl.y(); + if (y < m_ClipBox.top || y >= m_ClipBox.bottom) { + return; + } + uint8_t* dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPitch() * y; + uint8_t* dest_scan_extra_alpha = nullptr; + CFX_DIBitmap* pAlphaMask = m_pDevice->m_pAlphaMask; + if (pAlphaMask) { + dest_scan_extra_alpha = + pAlphaMask->GetBuffer() + pAlphaMask->GetPitch() * y; + } + uint8_t* ori_scan = nullptr; + if (m_pOriDevice) { + ori_scan = m_pOriDevice->GetBuffer() + m_pOriDevice->GetPitch() * y; + } + int Bpp = m_pDevice->GetBPP() / 8; + bool bDestAlpha = m_pDevice->HasAlpha() || m_pDevice->IsAlphaMask(); + unsigned num_spans = sl.num_spans(); + typename Scanline::const_iterator span = sl.begin(); + while (1) { + int x = span->x; + ASSERT(span->len > 0); + uint8_t* dest_pos = nullptr; + uint8_t* dest_extra_alpha_pos = nullptr; + uint8_t* ori_pos = nullptr; + if (Bpp) { + ori_pos = ori_scan ? ori_scan + x * Bpp : nullptr; + dest_pos = dest_scan + x * Bpp; + dest_extra_alpha_pos = + dest_scan_extra_alpha ? dest_scan_extra_alpha + x : nullptr; + } else { + dest_pos = dest_scan + x / 8; + ori_pos = ori_scan ? ori_scan + x / 8 : nullptr; + } + uint8_t* clip_pos = nullptr; + if (m_pClipMask) { + clip_pos = m_pClipMask->GetBuffer() + + (y - m_ClipBox.top) * m_pClipMask->GetPitch() + x - + m_ClipBox.left; + } + if (ori_pos) { + CompositeSpan(dest_pos, ori_pos, Bpp, bDestAlpha, x, span->len, + span->covers, m_ClipBox.left, m_ClipBox.right, clip_pos); + } else { + (this->*composite_span)(dest_pos, Bpp, x, span->len, span->covers, + m_ClipBox.left, m_ClipBox.right, clip_pos, + dest_extra_alpha_pos); + } + if (--num_spans == 0) { + break; + } + ++span; + } + } + + bool Init(CFX_DIBitmap* pDevice, + CFX_DIBitmap* pOriDevice, + const CFX_ClipRgn* pClipRgn, + uint32_t color, + bool bFullCover, + bool bRgbByteOrder, + int alpha_flag = 0, + void* pIccTransform = nullptr) { + m_pDevice = pDevice; + m_pClipRgn = pClipRgn; + composite_span = nullptr; + m_bRgbByteOrder = bRgbByteOrder; + m_pOriDevice = pOriDevice; + if (m_pClipRgn) { + m_ClipBox = m_pClipRgn->GetBox(); + } else { + m_ClipBox.left = m_ClipBox.top = 0; + m_ClipBox.right = m_pDevice->GetWidth(); + m_ClipBox.bottom = m_pDevice->GetHeight(); + } + m_pClipMask = nullptr; + if (m_pClipRgn && m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) { + m_pClipMask = m_pClipRgn->GetMask().GetObject(); + } + m_bFullCover = bFullCover; + bool bObjectCMYK = !!FXGETFLAG_COLORTYPE(alpha_flag); + bool bDeviceCMYK = pDevice->IsCmykImage(); + m_Alpha = bObjectCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color); + CCodec_IccModule* pIccModule = nullptr; + if (!CFX_GEModule::Get()->GetCodecModule() || + !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) { + pIccTransform = nullptr; + } else { + pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule(); + } + if (m_pDevice->GetBPP() == 8) { + ASSERT(!m_bRgbByteOrder); + composite_span = &CFX_Renderer::CompositeSpanGray; + if (m_pDevice->IsAlphaMask()) { + m_Gray = 255; + } else { + if (pIccTransform) { + uint8_t gray; + color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); + pIccModule->TranslateScanline(pIccTransform, &gray, + (const uint8_t*)&color, 1); + m_Gray = gray; + } else { + if (bObjectCMYK) { + uint8_t r, g, b; + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), + FXSYS_GetYValue(color), FXSYS_GetKValue(color), + r, g, b); + m_Gray = FXRGB2GRAY(r, g, b); + } else { + m_Gray = + FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color)); + } + } + } + return true; + } + if (bDeviceCMYK) { + ASSERT(!m_bRgbByteOrder); + composite_span = &CFX_Renderer::CompositeSpanCMYK; + if (bObjectCMYK) { + m_Color = FXCMYK_TODIB(color); + if (pIccTransform) { + pIccModule->TranslateScanline(pIccTransform, (uint8_t*)&m_Color, + (const uint8_t*)&m_Color, 1); + } + } else { + if (!pIccTransform) { + return false; + } + color = FXARGB_TODIB(color); + pIccModule->TranslateScanline(pIccTransform, (uint8_t*)&m_Color, + (const uint8_t*)&color, 1); + } + m_Red = ((uint8_t*)&m_Color)[0]; + m_Green = ((uint8_t*)&m_Color)[1]; + m_Blue = ((uint8_t*)&m_Color)[2]; + m_Gray = ((uint8_t*)&m_Color)[3]; + } else { + composite_span = (pDevice->GetFormat() == FXDIB_Argb) + ? &CFX_Renderer::CompositeSpanARGB + : &CFX_Renderer::CompositeSpanRGB; + if (pIccTransform) { + color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color); + pIccModule->TranslateScanline(pIccTransform, (uint8_t*)&m_Color, + (const uint8_t*)&color, 1); + ((uint8_t*)&m_Color)[3] = m_Alpha; + m_Red = ((uint8_t*)&m_Color)[2]; + m_Green = ((uint8_t*)&m_Color)[1]; + m_Blue = ((uint8_t*)&m_Color)[0]; + if (m_bRgbByteOrder) { + m_Color = FXARGB_TODIB(m_Color); + m_Color = FXARGB_TOBGRORDERDIB(m_Color); + } + } else { + if (bObjectCMYK) { + uint8_t r, g, b; + AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), + FXSYS_GetYValue(color), FXSYS_GetKValue(color), r, + g, b); + m_Color = FXARGB_MAKE(m_Alpha, r, g, b); + if (m_bRgbByteOrder) { + m_Color = FXARGB_TOBGRORDERDIB(m_Color); + } else { + m_Color = FXARGB_TODIB(m_Color); + } + m_Red = r; + m_Green = g; + m_Blue = b; + } else { + if (m_bRgbByteOrder) { + m_Color = FXARGB_TOBGRORDERDIB(color); + } else { + m_Color = FXARGB_TODIB(color); + } + ArgbDecode(color, m_Alpha, m_Red, m_Green, m_Blue); + } + } + } + if (m_pDevice->GetBPP() == 1) { + composite_span = &CFX_Renderer::CompositeSpan1bpp; + } + return true; + } +}; + +#endif // _SKIA_SUPPORT_PATHS_ diff --git a/modules/pdfium/pdfium/core/fxge/skia/fx_skia_device.h b/modules/pdfium/pdfium/core/fxge/skia/fx_skia_device.h new file mode 100644 index 000000000000..ecb110451828 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/skia/fx_skia_device.h @@ -0,0 +1,178 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CORE_FXGE_SKIA_FX_SKIA_DEVICE_H_ +#define CORE_FXGE_SKIA_FX_SKIA_DEVICE_H_ + +#if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ + +#include +#include + +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/ifx_renderdevicedriver.h" + +class FXTEXT_CHARPOS; +class SkCanvas; +class SkMatrix; +class SkPaint; +class SkPath; +class SkPictureRecorder; +class SkiaState; +struct SkIRect; + +class CFX_SkiaDeviceDriver : public IFX_RenderDeviceDriver { + public: + CFX_SkiaDeviceDriver(CFX_DIBitmap* pBitmap, + bool bRgbByteOrder, + CFX_DIBitmap* pOriDevice, + bool bGroupKnockout); +#ifdef _SKIA_SUPPORT_ + explicit CFX_SkiaDeviceDriver(SkPictureRecorder* recorder); + CFX_SkiaDeviceDriver(int size_x, int size_y); +#endif + ~CFX_SkiaDeviceDriver() override; + + /** Options */ + int GetDeviceCaps(int caps_id) const override; + + /** Save and restore all graphic states */ + void SaveState() override; + void RestoreState(bool bKeepSaved) override; + + /** Set clipping path using filled region */ + bool SetClip_PathFill( + const CFX_PathData* pPathData, // path info + const CFX_Matrix* pObject2Device, // optional transformation + int fill_mode) override; // fill mode, WINDING or ALTERNATE + + /** Set clipping path using stroked region */ + bool SetClip_PathStroke( + const CFX_PathData* pPathData, // path info + const CFX_Matrix* pObject2Device, // optional transformation + const CFX_GraphStateData* + pGraphState) // graphic state, for pen attributes + override; + + /** Draw a path */ + bool DrawPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode, + int blend_type) override; + + bool FillRectWithBlend(const FX_RECT* pRect, + uint32_t fill_color, + int blend_type) override; + + /** Draw a single pixel (device dependant) line */ + bool DrawCosmeticLine(FX_FLOAT x1, + FX_FLOAT y1, + FX_FLOAT x2, + FX_FLOAT y2, + uint32_t color, + int blend_type) override; + + bool GetClipBox(FX_RECT* pRect) override; + + /** Load device buffer into a DIB */ + bool GetDIBits(CFX_DIBitmap* pBitmap, int left, int top) override; + + CFX_DIBitmap* GetBackDrop() override; + + bool SetDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + const FX_RECT* pSrcRect, + int dest_left, + int dest_top, + int blend_type) override; +#ifdef _SKIA_SUPPORT_ + bool SetBitsWithMask(const CFX_DIBSource* pBitmap, + const CFX_DIBSource* pMask, + int dest_left, + int dest_top, + int bitmap_alpha, + int blend_type) override; +#endif + +#ifdef _SKIA_SUPPORT_PATHS_ + void SetClipMask(const FX_RECT& clipBox, const SkPath& skClipPath); +#endif + + bool StretchDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + uint32_t flags, + int blend_type) override; + + bool StartDIBits(const CFX_DIBSource* pBitmap, + int bitmap_alpha, + uint32_t color, + const CFX_Matrix* pMatrix, + uint32_t flags, + void*& handle, + int blend_type) override; + + bool ContinueDIBits(void* handle, IFX_Pause* pPause) override; + + void CancelDIBits(void* handle) override {} + + bool DrawBitsWithMask(const CFX_DIBSource* pBitmap, + const CFX_DIBSource* pMask, + int bitmap_alpha, + const CFX_Matrix* pMatrix, + int blend_type); + + bool DrawDeviceText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t color) override; + + bool DrawShading(const CPDF_ShadingPattern* pPattern, + const CFX_Matrix* pMatrix, + const FX_RECT& clip_rect, + int alpha, + bool bAlphaMode) override; + + virtual uint8_t* GetBuffer() const; + + void PaintStroke(SkPaint* spaint, + const CFX_GraphStateData* pGraphState, + const SkMatrix& matrix); + void Clear(uint32_t color); + void Flush() override; + SkPictureRecorder* GetRecorder() const { return m_pRecorder; } + void PreMultiply() { m_pBitmap->PreMultiply(); } + static void PreMultiply(CFX_DIBitmap* pDIBitmap); + SkCanvas* SkiaCanvas() { return m_pCanvas; } + void DebugVerifyBitmapIsPreMultiplied() const; + void Dump() const; + + private: + friend class SkiaState; + + CFX_DIBitmap* m_pBitmap; + CFX_DIBitmap* m_pOriDevice; + SkCanvas* m_pCanvas; + SkPictureRecorder* const m_pRecorder; + std::unique_ptr m_pCache; +#ifdef _SKIA_SUPPORT_PATHS_ + std::unique_ptr m_pClipRgn; + std::vector> m_StateStack; + int m_FillFlags; + bool m_bRgbByteOrder; +#endif + bool m_bGroupKnockout; +}; +#endif // defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_ + +#endif // CORE_FXGE_SKIA_FX_SKIA_DEVICE_H_ diff --git a/modules/pdfium/pdfium/core/fxge/skia/fx_skia_device_unittest.cpp b/modules/pdfium/pdfium/core/fxge/skia/fx_skia_device_unittest.cpp new file mode 100644 index 000000000000..afd47780d7f3 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/skia/fx_skia_device_unittest.cpp @@ -0,0 +1,174 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxge/cfx_fxgedevice.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "core/fxge/skia/fx_skia_device.h" +#include "fpdfsdk/fsdk_define.h" +#include "public/fpdfview.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkPictureRecorder.h" + +namespace { + +struct State { + enum class Change { kNo, kYes }; + enum class Save { kNo, kYes }; + enum class Clip { kNo, kSame, kDifferentPath, kDifferentMatrix }; + enum class Graphic { kNone, kPath, kText }; + + Change m_change; + Save m_save; + Clip m_clip; + Graphic m_graphic; + uint32_t m_pixel; +}; + +void EmptyTest(CFX_SkiaDeviceDriver* driver, const State&) { + driver->SaveState(); + driver->RestoreState(true); + driver->RestoreState(false); +} + +void CommonTest(CFX_SkiaDeviceDriver* driver, const State& state) { + FXTEXT_CHARPOS charPos[1]; + charPos[0].m_Origin = CFX_PointF(0, 1); + charPos[0].m_GlyphIndex = 1; + charPos[0].m_FontCharWidth = 4; + + CFX_Font font; + FX_FLOAT fontSize = 1; + CFX_PathData clipPath, clipPath2; + clipPath.AppendRect(0, 0, 3, 1); + clipPath2.AppendRect(0, 0, 2, 1); + CFX_Matrix clipMatrix; + CFX_Matrix clipMatrix2(1, 0, 0, 1, 0, 1); + driver->SaveState(); + CFX_PathData path1; + path1.AppendRect(0, 0, 1, 2); + + CFX_Matrix matrix; + CFX_Matrix matrix2; + matrix2.Translate(1, 0); + CFX_GraphStateData graphState; + if (state.m_save == State::Save::kYes) + driver->SaveState(); + if (state.m_clip != State::Clip::kNo) + driver->SetClip_PathFill(&clipPath, &clipMatrix, 0); + if (state.m_graphic == State::Graphic::kPath) { + driver->DrawPath(&path1, &matrix, &graphState, 0xFF112233, 0, + FXFILL_WINDING, 0); + } else if (state.m_graphic == State::Graphic::kText) { + driver->DrawDeviceText(SK_ARRAY_COUNT(charPos), charPos, &font, &matrix, + fontSize, 0xFF445566); + } + if (state.m_save == State::Save::kYes) + driver->RestoreState(true); + CFX_PathData path2; + path2.AppendRect(0, 0, 2, 2); + if (state.m_change == State::Change::kYes) { + if (state.m_graphic == State::Graphic::kPath) + graphState.m_LineCap = CFX_GraphStateData::LineCapRound; + else if (state.m_graphic == State::Graphic::kText) + fontSize = 2; + } + if (state.m_clip == State::Clip::kSame) + driver->SetClip_PathFill(&clipPath, &clipMatrix, 0); + else if (state.m_clip == State::Clip::kDifferentPath) + driver->SetClip_PathFill(&clipPath2, &clipMatrix, 0); + else if (state.m_clip == State::Clip::kDifferentMatrix) + driver->SetClip_PathFill(&clipPath, &clipMatrix2, 0); + if (state.m_graphic == State::Graphic::kPath) { + driver->DrawPath(&path2, &matrix2, &graphState, 0xFF112233, 0, + FXFILL_WINDING, 0); + } else if (state.m_graphic == State::Graphic::kText) { + driver->DrawDeviceText(SK_ARRAY_COUNT(charPos), charPos, &font, &matrix2, + fontSize, 0xFF445566); + } + if (state.m_save == State::Save::kYes) + driver->RestoreState(false); + driver->RestoreState(false); +} + +void OutOfSequenceClipTest(CFX_SkiaDeviceDriver* driver, const State&) { + CFX_PathData clipPath; + clipPath.AppendRect(1, 0, 3, 1); + CFX_Matrix clipMatrix; + driver->SaveState(); + driver->SetClip_PathFill(&clipPath, &clipMatrix, 0); + driver->RestoreState(true); + driver->SaveState(); + driver->SetClip_PathFill(&clipPath, &clipMatrix, 0); + driver->RestoreState(false); + driver->RestoreState(false); + + driver->SaveState(); + driver->SaveState(); + driver->SetClip_PathFill(&clipPath, &clipMatrix, 0); + driver->RestoreState(true); + driver->SetClip_PathFill(&clipPath, &clipMatrix, 0); + driver->RestoreState(false); + driver->RestoreState(false); +} + +void Harness(void (*Test)(CFX_SkiaDeviceDriver*, const State&), + const State& state) { + int h = 1; + int w = 4; + FPDF_BITMAP bitmap = FPDFBitmap_Create(w, h, 1); + EXPECT_NE(nullptr, bitmap); + if (!bitmap) + return; + FPDFBitmap_FillRect(bitmap, 0, 0, w, h, 0x00000000); + CFX_FxgeDevice geDevice; + CFX_DIBitmap* pBitmap = CFXBitmapFromFPDFBitmap(bitmap); + geDevice.Attach(pBitmap, false, nullptr, false); + CFX_SkiaDeviceDriver* driver = + static_cast(geDevice.GetDeviceDriver()); + (*Test)(driver, state); + driver->Flush(); + uint32_t pixel = pBitmap->GetPixel(0, 0); + EXPECT_EQ(state.m_pixel, pixel); +#ifdef SK_DEBUG + if (!driver) // force dump to be linked in so it can be called from debugger + driver->Dump(); +#endif +} + +} // namespace + +TEST(fxge, SkiaStateEmpty) { + Harness(&EmptyTest, {}); +} + +TEST(fxge, SkiaStatePath) { + Harness(&CommonTest, {State::Change::kNo, State::Save::kYes, + State::Clip::kSame, State::Graphic::kPath, 0xFF112233}); + Harness(&CommonTest, + {State::Change::kNo, State::Save::kYes, State::Clip::kDifferentPath, + State::Graphic::kPath, 0xFF112233}); + Harness(&CommonTest, {State::Change::kNo, State::Save::kYes, State::Clip::kNo, + State::Graphic::kPath, 0xFF112233}); + Harness(&CommonTest, {State::Change::kYes, State::Save::kNo, State::Clip::kNo, + State::Graphic::kPath, 0xFF112233}); + Harness(&CommonTest, {State::Change::kNo, State::Save::kNo, State::Clip::kNo, + State::Graphic::kPath, 0xFF112233}); +} + +#ifdef _SKIA_SUPPORT_ +TEST(fxge, SkiaStateText) { + Harness(&CommonTest, + {State::Change::kNo, State::Save::kYes, State::Clip::kDifferentMatrix, + State::Graphic::kText, 0xFF445566}); + Harness(&CommonTest, {State::Change::kNo, State::Save::kYes, + State::Clip::kSame, State::Graphic::kText, 0xFF445566}); +} +#endif + +TEST(fxge, SkiaStateOOSClip) { + Harness(&OutOfSequenceClipTest, {}); +} diff --git a/modules/pdfium/pdfium/core/fxge/win32/cfx_psrenderer.cpp b/modules/pdfium/pdfium/core/fxge/win32/cfx_psrenderer.cpp new file mode 100644 index 000000000000..74fae088d98e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/win32/cfx_psrenderer.cpp @@ -0,0 +1,686 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/win32/cfx_psrenderer.h" + +#include + +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxge/cfx_facecache.h" +#include "core/fxge/cfx_fontcache.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "core/fxge/ge/fx_text_int.h" +#include "core/fxge/win32/cpsoutput.h" +#include "third_party/base/ptr_util.h" + +struct PSGlyph { + CFX_Font* m_pFont; + uint32_t m_GlyphIndex; + bool m_bGlyphAdjust; + FX_FLOAT m_AdjustMatrix[4]; +}; + +class CPSFont { + public: + PSGlyph m_Glyphs[256]; + int m_nGlyphs; +}; + +CFX_PSRenderer::CFX_PSRenderer() { + m_pOutput = nullptr; + m_bColorSet = m_bGraphStateSet = false; + m_bInited = false; +} + +CFX_PSRenderer::~CFX_PSRenderer() {} + +#define OUTPUT_PS(str) m_pOutput->OutputPS(str, sizeof(str) - 1) + +void CFX_PSRenderer::Init(CPSOutput* pOutput, + int pslevel, + int width, + int height, + bool bCmykOutput) { + m_PSLevel = pslevel; + m_pOutput = pOutput; + m_ClipBox.left = m_ClipBox.top = 0; + m_ClipBox.right = width; + m_ClipBox.bottom = height; + m_bCmykOutput = bCmykOutput; +} + +bool CFX_PSRenderer::StartRendering() { + if (m_bInited) { + return true; + } + static const char init_str[] = + "\nsave\n/im/initmatrix load def\n" + "/n/newpath load def/m/moveto load def/l/lineto load def/c/curveto load " + "def/h/closepath load def\n" + "/f/fill load def/F/eofill load def/s/stroke load def/W/clip load " + "def/W*/eoclip load def\n" + "/rg/setrgbcolor load def/k/setcmykcolor load def\n" + "/J/setlinecap load def/j/setlinejoin load def/w/setlinewidth load " + "def/M/setmiterlimit load def/d/setdash load def\n" + "/q/gsave load def/Q/grestore load def/iM/imagemask load def\n" + "/Tj/show load def/Ff/findfont load def/Fs/scalefont load def/Sf/setfont " + "load def\n" + "/cm/concat load def/Cm/currentmatrix load def/mx/matrix load " + "def/sm/setmatrix load def\n"; + OUTPUT_PS(init_str); + m_bInited = true; + return true; +} + +void CFX_PSRenderer::EndRendering() { + if (m_bInited) { + OUTPUT_PS("\nrestore\n"); + m_bInited = false; + } +} + +void CFX_PSRenderer::SaveState() { + StartRendering(); + OUTPUT_PS("q\n"); + m_ClipBoxStack.push_back(m_ClipBox); +} + +void CFX_PSRenderer::RestoreState(bool bKeepSaved) { + StartRendering(); + if (bKeepSaved) + OUTPUT_PS("Q\nq\n"); + else + OUTPUT_PS("Q\n"); + + m_bColorSet = false; + m_bGraphStateSet = false; + if (m_ClipBoxStack.empty()) + return; + + m_ClipBox = m_ClipBoxStack.back(); + if (!bKeepSaved) + m_ClipBoxStack.pop_back(); +} + +void CFX_PSRenderer::OutputPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device) { + CFX_ByteTextBuf buf; + size_t size = pPathData->GetPoints().size(); + buf.EstimateSize(size * 10); + + for (size_t i = 0; i < size; i++) { + FXPT_TYPE type = pPathData->GetType(i); + bool closing = pPathData->IsClosingFigure(i); + CFX_PointF pos = pPathData->GetPoint(i); + if (pObject2Device) + pos = pObject2Device->Transform(pos); + + buf << pos.x << " " << pos.y; + switch (type) { + case FXPT_TYPE::MoveTo: + buf << " m "; + break; + case FXPT_TYPE::LineTo: + buf << " l "; + if (closing) + buf << "h "; + break; + case FXPT_TYPE::BezierTo: { + CFX_PointF pos1 = pPathData->GetPoint(i + 1); + CFX_PointF pos2 = pPathData->GetPoint(i + 2); + if (pObject2Device) { + pos1 = pObject2Device->Transform(pos1); + pos2 = pObject2Device->Transform(pos2); + } + buf << " " << pos1.x << " " << pos1.y << " " << pos2.x << " " << pos2.y + << " c"; + if (closing) + buf << " h"; + buf << "\n"; + i += 2; + break; + } + } + } + m_pOutput->OutputPS((const FX_CHAR*)buf.GetBuffer(), buf.GetSize()); +} + +void CFX_PSRenderer::SetClip_PathFill(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + int fill_mode) { + StartRendering(); + OutputPath(pPathData, pObject2Device); + CFX_FloatRect rect = pPathData->GetBoundingBox(); + if (pObject2Device) + pObject2Device->TransformRect(rect); + + m_ClipBox.left = static_cast(rect.left); + m_ClipBox.right = static_cast(rect.left + rect.right); + m_ClipBox.top = static_cast(rect.top + rect.bottom); + m_ClipBox.bottom = static_cast(rect.bottom); + if ((fill_mode & 3) == FXFILL_WINDING) { + OUTPUT_PS("W n\n"); + } else { + OUTPUT_PS("W* n\n"); + } +} + +void CFX_PSRenderer::SetClip_PathStroke(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState) { + StartRendering(); + SetGraphState(pGraphState); + if (pObject2Device) { + CFX_ByteTextBuf buf; + buf << "mx Cm [" << pObject2Device->a << " " << pObject2Device->b << " " + << pObject2Device->c << " " << pObject2Device->d << " " + << pObject2Device->e << " " << pObject2Device->f << "]cm "; + m_pOutput->OutputPS((const FX_CHAR*)buf.GetBuffer(), buf.GetSize()); + } + OutputPath(pPathData, nullptr); + CFX_FloatRect rect = pPathData->GetBoundingBox(pGraphState->m_LineWidth, + pGraphState->m_MiterLimit); + pObject2Device->TransformRect(rect); + m_ClipBox.Intersect(rect.GetOuterRect()); + if (pObject2Device) { + OUTPUT_PS("strokepath W n sm\n"); + } else { + OUTPUT_PS("strokepath W n\n"); + } +} + +bool CFX_PSRenderer::DrawPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode) { + StartRendering(); + int fill_alpha = FXARGB_A(fill_color); + int stroke_alpha = FXARGB_A(stroke_color); + if (fill_alpha && fill_alpha < 255) { + return false; + } + if (stroke_alpha && stroke_alpha < 255) { + return false; + } + if (fill_alpha == 0 && stroke_alpha == 0) { + return false; + } + if (stroke_alpha) { + SetGraphState(pGraphState); + if (pObject2Device) { + CFX_ByteTextBuf buf; + buf << "mx Cm [" << pObject2Device->a << " " << pObject2Device->b << " " + << pObject2Device->c << " " << pObject2Device->d << " " + << pObject2Device->e << " " << pObject2Device->f << "]cm "; + m_pOutput->OutputPS((const FX_CHAR*)buf.GetBuffer(), buf.GetSize()); + } + } + OutputPath(pPathData, stroke_alpha ? nullptr : pObject2Device); + if (fill_mode && fill_alpha) { + SetColor(fill_color); + if ((fill_mode & 3) == FXFILL_WINDING) { + if (stroke_alpha) { + OUTPUT_PS("q f Q "); + } else { + OUTPUT_PS("f"); + } + } else if ((fill_mode & 3) == FXFILL_ALTERNATE) { + if (stroke_alpha) { + OUTPUT_PS("q F Q "); + } else { + OUTPUT_PS("F"); + } + } + } + if (stroke_alpha) { + SetColor(stroke_color); + if (pObject2Device) { + OUTPUT_PS("s sm"); + } else { + OUTPUT_PS("s"); + } + } + OUTPUT_PS("\n"); + return true; +} + +void CFX_PSRenderer::SetGraphState(const CFX_GraphStateData* pGraphState) { + CFX_ByteTextBuf buf; + if (!m_bGraphStateSet || + m_CurGraphState.m_LineCap != pGraphState->m_LineCap) { + buf << pGraphState->m_LineCap << " J\n"; + } + if (!m_bGraphStateSet || + m_CurGraphState.m_DashCount != pGraphState->m_DashCount || + FXSYS_memcmp(m_CurGraphState.m_DashArray, pGraphState->m_DashArray, + sizeof(FX_FLOAT) * m_CurGraphState.m_DashCount)) { + buf << "["; + for (int i = 0; i < pGraphState->m_DashCount; ++i) { + buf << pGraphState->m_DashArray[i] << " "; + } + buf << "]" << pGraphState->m_DashPhase << " d\n"; + } + if (!m_bGraphStateSet || + m_CurGraphState.m_LineJoin != pGraphState->m_LineJoin) { + buf << pGraphState->m_LineJoin << " j\n"; + } + if (!m_bGraphStateSet || + m_CurGraphState.m_LineWidth != pGraphState->m_LineWidth) { + buf << pGraphState->m_LineWidth << " w\n"; + } + if (!m_bGraphStateSet || + m_CurGraphState.m_MiterLimit != pGraphState->m_MiterLimit) { + buf << pGraphState->m_MiterLimit << " M\n"; + } + m_CurGraphState.Copy(*pGraphState); + m_bGraphStateSet = true; + if (buf.GetSize()) { + m_pOutput->OutputPS((const FX_CHAR*)buf.GetBuffer(), buf.GetSize()); + } +} + +static void FaxCompressData(uint8_t* src_buf, + int width, + int height, + std::unique_ptr* dest_buf, + uint32_t* dest_size) { + if (width * height > 128) { + CCodec_FaxModule::FaxEncode(src_buf, width, height, (width + 7) / 8, + dest_buf, dest_size); + FX_Free(src_buf); + } else { + dest_buf->reset(src_buf); + *dest_size = (width + 7) / 8 * height; + } +} + +static void PSCompressData(int PSLevel, + uint8_t* src_buf, + uint32_t src_size, + uint8_t** output_buf, + uint32_t* output_size, + const FX_CHAR** filter) { + *output_buf = src_buf; + *output_size = src_size; + *filter = ""; + if (src_size < 1024) { + return; + } + CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule(); + uint8_t* dest_buf = nullptr; + uint32_t dest_size = src_size; + if (PSLevel >= 3) { + if (pEncoders && + pEncoders->GetFlateModule()->Encode(src_buf, src_size, &dest_buf, + &dest_size)) { + *filter = "/FlateDecode filter "; + } + } else { + if (pEncoders && + pEncoders->GetBasicModule()->RunLengthEncode(src_buf, src_size, + &dest_buf, &dest_size)) { + *filter = "/RunLengthDecode filter "; + } + } + if (dest_size < src_size) { + *output_buf = dest_buf; + *output_size = dest_size; + } else { + *filter = nullptr; + FX_Free(dest_buf); + } +} + +bool CFX_PSRenderer::SetDIBits(const CFX_DIBSource* pSource, + uint32_t color, + int left, + int top) { + StartRendering(); + CFX_Matrix matrix((FX_FLOAT)(pSource->GetWidth()), 0.0f, 0.0f, + -(FX_FLOAT)(pSource->GetHeight()), (FX_FLOAT)(left), + (FX_FLOAT)(top + pSource->GetHeight())); + return DrawDIBits(pSource, color, &matrix, 0); +} + +bool CFX_PSRenderer::StretchDIBits(const CFX_DIBSource* pSource, + uint32_t color, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + uint32_t flags) { + StartRendering(); + CFX_Matrix matrix((FX_FLOAT)(dest_width), 0.0f, 0.0f, + (FX_FLOAT)(-dest_height), (FX_FLOAT)(dest_left), + (FX_FLOAT)(dest_top + dest_height)); + return DrawDIBits(pSource, color, &matrix, flags); +} + +bool CFX_PSRenderer::DrawDIBits(const CFX_DIBSource* pSource, + uint32_t color, + const CFX_Matrix* pMatrix, + uint32_t flags) { + StartRendering(); + if ((pMatrix->a == 0 && pMatrix->b == 0) || + (pMatrix->c == 0 && pMatrix->d == 0)) { + return true; + } + if (pSource->HasAlpha()) { + return false; + } + int alpha = FXARGB_A(color); + if (pSource->IsAlphaMask() && (alpha < 255 || pSource->GetBPP() != 1)) + return false; + + OUTPUT_PS("q\n"); + CFX_ByteTextBuf buf; + buf << "[" << pMatrix->a << " " << pMatrix->b << " " << pMatrix->c << " " + << pMatrix->d << " " << pMatrix->e << " " << pMatrix->f << "]cm "; + int width = pSource->GetWidth(); + int height = pSource->GetHeight(); + buf << width << " " << height; + if (pSource->GetBPP() == 1 && !pSource->GetPalette()) { + int pitch = (width + 7) / 8; + uint32_t src_size = height * pitch; + uint8_t* src_buf = FX_Alloc(uint8_t, src_size); + for (int row = 0; row < height; row++) { + const uint8_t* src_scan = pSource->GetScanline(row); + FXSYS_memcpy(src_buf + row * pitch, src_scan, pitch); + } + std::unique_ptr output_buf; + uint32_t output_size; + FaxCompressData(src_buf, width, height, &output_buf, &output_size); + if (pSource->IsAlphaMask()) { + SetColor(color); + m_bColorSet = false; + buf << " true["; + } else { + buf << " 1["; + } + buf << width << " 0 0 -" << height << " 0 " << height + << "]currentfile/ASCII85Decode filter "; + if (output_buf.get() != src_buf) { + buf << "<>/CCITTFaxDecode filter "; + } + if (pSource->IsAlphaMask()) { + buf << "iM\n"; + } else { + buf << "false 1 colorimage\n"; + } + m_pOutput->OutputPS((const FX_CHAR*)buf.GetBuffer(), buf.GetSize()); + WritePSBinary(output_buf.get(), output_size); + output_buf.release(); + } else { + CFX_DIBExtractor source_extractor(pSource); + CFX_MaybeOwned pConverted(source_extractor.GetBitmap()); + if (!pConverted.Get()) + return false; + switch (pSource->GetFormat()) { + case FXDIB_1bppRgb: + case FXDIB_Rgb32: + pConverted = pConverted->CloneConvert(FXDIB_Rgb).release(); + break; + case FXDIB_8bppRgb: + if (pSource->GetPalette()) { + pConverted = pConverted->CloneConvert(FXDIB_Rgb).release(); + } + break; + case FXDIB_1bppCmyk: + pConverted = pConverted->CloneConvert(FXDIB_Cmyk).release(); + break; + case FXDIB_8bppCmyk: + if (pSource->GetPalette()) { + pConverted = pConverted->CloneConvert(FXDIB_Cmyk).release(); + } + break; + default: + break; + } + if (!pConverted) { + OUTPUT_PS("\nQ\n"); + return false; + } + int bpp = pConverted->GetBPP() / 8; + uint8_t* output_buf = nullptr; + FX_STRSIZE output_size = 0; + const FX_CHAR* filter = nullptr; + if ((m_PSLevel == 2 || flags & FXRENDER_IMAGE_LOSSY) && + CCodec_JpegModule::JpegEncode(pConverted.Get(), &output_buf, + &output_size)) { + filter = "/DCTDecode filter "; + } + if (!filter) { + int src_pitch = width * bpp; + output_size = height * src_pitch; + output_buf = FX_Alloc(uint8_t, output_size); + for (int row = 0; row < height; row++) { + const uint8_t* src_scan = pConverted->GetScanline(row); + uint8_t* dest_scan = output_buf + row * src_pitch; + if (bpp == 3) { + for (int col = 0; col < width; col++) { + *dest_scan++ = src_scan[2]; + *dest_scan++ = src_scan[1]; + *dest_scan++ = *src_scan; + src_scan += 3; + } + } else { + FXSYS_memcpy(dest_scan, src_scan, src_pitch); + } + } + uint8_t* compressed_buf; + uint32_t compressed_size; + PSCompressData(m_PSLevel, output_buf, output_size, &compressed_buf, + &compressed_size, &filter); + if (output_buf != compressed_buf) { + FX_Free(output_buf); + } + output_buf = compressed_buf; + output_size = compressed_size; + } + buf << " 8["; + buf << width << " 0 0 -" << height << " 0 " << height << "]"; + buf << "currentfile/ASCII85Decode filter "; + if (filter) { + buf << filter; + } + buf << "false " << bpp; + buf << " colorimage\n"; + m_pOutput->OutputPS((const FX_CHAR*)buf.GetBuffer(), buf.GetSize()); + WritePSBinary(output_buf, output_size); + FX_Free(output_buf); + } + OUTPUT_PS("\nQ\n"); + return true; +} + +void CFX_PSRenderer::SetColor(uint32_t color) { + bool bCMYK = false; + if (bCMYK != m_bCmykOutput || !m_bColorSet || m_LastColor != color) { + CFX_ByteTextBuf buf; + if (bCMYK) { + buf << FXSYS_GetCValue(color) / 255.0 << " " + << FXSYS_GetMValue(color) / 255.0 << " " + << FXSYS_GetYValue(color) / 255.0 << " " + << FXSYS_GetKValue(color) / 255.0 << " k\n"; + } else { + buf << FXARGB_R(color) / 255.0 << " " << FXARGB_G(color) / 255.0 << " " + << FXARGB_B(color) / 255.0 << " rg\n"; + } + if (bCMYK == m_bCmykOutput) { + m_bColorSet = true; + m_LastColor = color; + } + m_pOutput->OutputPS((const FX_CHAR*)buf.GetBuffer(), buf.GetSize()); + } +} + +void CFX_PSRenderer::FindPSFontGlyph(CFX_FaceCache* pFaceCache, + CFX_Font* pFont, + const FXTEXT_CHARPOS& charpos, + int* ps_fontnum, + int* ps_glyphindex) { + int i = 0; + for (const auto& pPSFont : m_PSFontList) { + for (int j = 0; j < pPSFont->m_nGlyphs; j++) { + if (pPSFont->m_Glyphs[j].m_pFont == pFont && + pPSFont->m_Glyphs[j].m_GlyphIndex == charpos.m_GlyphIndex && + ((!pPSFont->m_Glyphs[j].m_bGlyphAdjust && !charpos.m_bGlyphAdjust) || + (pPSFont->m_Glyphs[j].m_bGlyphAdjust && charpos.m_bGlyphAdjust && + (FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[0] - + charpos.m_AdjustMatrix[0]) < 0.01 && + FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[1] - + charpos.m_AdjustMatrix[1]) < 0.01 && + FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[2] - + charpos.m_AdjustMatrix[2]) < 0.01 && + FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[3] - + charpos.m_AdjustMatrix[3]) < 0.01)))) { + *ps_fontnum = i; + *ps_glyphindex = j; + return; + } + } + ++i; + } + if (m_PSFontList.empty() || m_PSFontList.back()->m_nGlyphs == 256) { + m_PSFontList.push_back(pdfium::MakeUnique()); + m_PSFontList.back()->m_nGlyphs = 0; + CFX_ByteTextBuf buf; + buf << "8 dict begin/FontType 3 def/FontMatrix[1 0 0 1 0 0]def\n" + "/FontBBox[0 0 0 0]def/Encoding 256 array def 0 1 255{Encoding " + "exch/.notdef put}for\n" + "/CharProcs 1 dict def CharProcs begin/.notdef {} def end\n" + "/BuildGlyph{1 0 -10 -10 10 10 setcachedevice exch/CharProcs get " + "exch 2 copy known not{pop/.notdef}if get exec}bind def\n" + "/BuildChar{1 index/Encoding get exch get 1 index/BuildGlyph get " + "exec}bind def\n" + "currentdict end\n"; + buf << "/X" << static_cast(m_PSFontList.size() - 1) + << " exch definefont pop\n"; + m_pOutput->OutputPS((const FX_CHAR*)buf.GetBuffer(), buf.GetSize()); + buf.Clear(); + } + *ps_fontnum = m_PSFontList.size() - 1; + CPSFont* pPSFont = m_PSFontList[*ps_fontnum].get(); + int glyphindex = pPSFont->m_nGlyphs; + *ps_glyphindex = glyphindex; + pPSFont->m_Glyphs[glyphindex].m_GlyphIndex = charpos.m_GlyphIndex; + pPSFont->m_Glyphs[glyphindex].m_pFont = pFont; + pPSFont->m_Glyphs[glyphindex].m_bGlyphAdjust = charpos.m_bGlyphAdjust; + if (charpos.m_bGlyphAdjust) { + pPSFont->m_Glyphs[glyphindex].m_AdjustMatrix[0] = charpos.m_AdjustMatrix[0]; + pPSFont->m_Glyphs[glyphindex].m_AdjustMatrix[1] = charpos.m_AdjustMatrix[1]; + pPSFont->m_Glyphs[glyphindex].m_AdjustMatrix[2] = charpos.m_AdjustMatrix[2]; + pPSFont->m_Glyphs[glyphindex].m_AdjustMatrix[3] = charpos.m_AdjustMatrix[3]; + } + pPSFont->m_nGlyphs++; + + CFX_Matrix matrix; + if (charpos.m_bGlyphAdjust) { + matrix = + CFX_Matrix(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1], + charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0); + } + matrix.Concat(CFX_Matrix(1.0f, 0, 0, 1.0f, 0, 0)); + const CFX_PathData* pPathData = pFaceCache->LoadGlyphPath( + pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth); + if (!pPathData) + return; + + CFX_PathData TransformedPath(*pPathData); + if (charpos.m_bGlyphAdjust) + TransformedPath.Transform(&matrix); + + CFX_ByteTextBuf buf; + buf << "/X" << *ps_fontnum << " Ff/CharProcs get begin/" << glyphindex + << "{n "; + for (size_t p = 0; p < TransformedPath.GetPoints().size(); p++) { + CFX_PointF point = TransformedPath.GetPoint(p); + switch (TransformedPath.GetType(p)) { + case FXPT_TYPE::MoveTo: { + buf << point.x << " " << point.y << " m\n"; + break; + } + case FXPT_TYPE::LineTo: { + buf << point.x << " " << point.y << " l\n"; + break; + } + case FXPT_TYPE::BezierTo: { + CFX_PointF point1 = TransformedPath.GetPoint(p + 1); + CFX_PointF point2 = TransformedPath.GetPoint(p + 2); + buf << point.x << " " << point.y << " " << point1.x << " " << point1.y + << " " << point2.x << " " << point2.y << " c\n"; + p += 2; + break; + } + } + } + buf << "f}bind def end\n"; + buf << "/X" << *ps_fontnum << " Ff/Encoding get " << glyphindex << "/" + << glyphindex << " put\n"; + m_pOutput->OutputPS((const FX_CHAR*)buf.GetBuffer(), buf.GetSize()); +} + +bool CFX_PSRenderer::DrawText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t color) { + StartRendering(); + int alpha = FXARGB_A(color); + if (alpha < 255) + return false; + + if ((pObject2Device->a == 0 && pObject2Device->b == 0) || + (pObject2Device->c == 0 && pObject2Device->d == 0)) { + return true; + } + SetColor(color); + CFX_ByteTextBuf buf; + buf << "q[" << pObject2Device->a << " " << pObject2Device->b << " " + << pObject2Device->c << " " << pObject2Device->d << " " + << pObject2Device->e << " " << pObject2Device->f << "]cm\n"; + + CFX_FontCache* pCache = CFX_GEModule::Get()->GetFontCache(); + CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont); + int last_fontnum = -1; + for (int i = 0; i < nChars; i++) { + int ps_fontnum, ps_glyphindex; + FindPSFontGlyph(pFaceCache, pFont, pCharPos[i], &ps_fontnum, + &ps_glyphindex); + if (last_fontnum != ps_fontnum) { + buf << "/X" << ps_fontnum << " Ff " << font_size << " Fs Sf "; + last_fontnum = ps_fontnum; + } + buf << pCharPos[i].m_Origin.x << " " << pCharPos[i].m_Origin.y << " m"; + CFX_ByteString hex; + hex.Format("<%02X>", ps_glyphindex); + buf << hex.AsStringC() << "Tj\n"; + } + buf << "Q\n"; + m_pOutput->OutputPS((const FX_CHAR*)buf.GetBuffer(), buf.GetSize()); + pCache->ReleaseCachedFace(pFont); + return true; +} + +void CFX_PSRenderer::WritePSBinary(const uint8_t* data, int len) { + uint8_t* dest_buf; + uint32_t dest_size; + CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule(); + if (pEncoders && + pEncoders->GetBasicModule()->A85Encode(data, len, &dest_buf, + &dest_size)) { + m_pOutput->OutputPS((const FX_CHAR*)dest_buf, dest_size); + FX_Free(dest_buf); + } else { + m_pOutput->OutputPS((const FX_CHAR*)data, len); + } +} diff --git a/modules/pdfium/pdfium/core/fxge/win32/cfx_psrenderer.h b/modules/pdfium/pdfium/core/fxge/win32/cfx_psrenderer.h new file mode 100644 index 000000000000..163c6180af4c --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/win32/cfx_psrenderer.h @@ -0,0 +1,101 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_WIN32_CFX_PSRENDERER_H_ +#define CORE_FXGE_WIN32_CFX_PSRENDERER_H_ + +#include +#include + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/win32/cpsoutput.h" + +class CFX_DIBSource; +class CFX_FaceCache; +class CFX_Font; +class CFX_FontCache; +class CFX_Matrix; +class CFX_PathData; +class CPSFont; +class FXTEXT_CHARPOS; + +class CFX_PSRenderer { + public: + CFX_PSRenderer(); + ~CFX_PSRenderer(); + + void Init(CPSOutput* pOutput, + int pslevel, + int width, + int height, + bool bCmykOutput); + bool StartRendering(); + void EndRendering(); + void SaveState(); + void RestoreState(bool bKeepSaved); + void SetClip_PathFill(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + int fill_mode); + void SetClip_PathStroke(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState); + FX_RECT GetClipBox() { return m_ClipBox; } + bool DrawPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode); + bool SetDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + int dest_left, + int dest_top); + bool StretchDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + uint32_t flags); + bool DrawDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + const CFX_Matrix* pMatrix, + uint32_t flags); + bool DrawText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t color); + + private: + void OutputPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device); + void SetGraphState(const CFX_GraphStateData* pGraphState); + void SetColor(uint32_t color); + void FindPSFontGlyph(CFX_FaceCache* pFaceCache, + CFX_Font* pFont, + const FXTEXT_CHARPOS& charpos, + int* ps_fontnum, + int* ps_glyphindex); + void WritePSBinary(const uint8_t* data, int len); + + CPSOutput* m_pOutput; + int m_PSLevel; + CFX_GraphStateData m_CurGraphState; + bool m_bGraphStateSet; + bool m_bCmykOutput; + bool m_bColorSet; + uint32_t m_LastColor; + FX_RECT m_ClipBox; + std::vector> m_PSFontList; + std::vector m_ClipBoxStack; + bool m_bInited; +}; + +#endif // CORE_FXGE_WIN32_CFX_PSRENDERER_H_ diff --git a/modules/pdfium/pdfium/core/fxge/win32/cfx_windowsdib.h b/modules/pdfium/pdfium/core/fxge/win32/cfx_windowsdib.h new file mode 100644 index 000000000000..2564b7fa36a4 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/win32/cfx_windowsdib.h @@ -0,0 +1,52 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_WIN32_CFX_WINDOWSDIB_H_ +#define CORE_FXGE_WIN32_CFX_WINDOWSDIB_H_ +#ifdef _WIN32 +#ifndef _WINDOWS_ +#include +#endif +#define WINDIB_OPEN_MEMORY 0x1 +#define WINDIB_OPEN_PATHNAME 0x2 + +typedef struct WINDIB_Open_Args_ { + int flags; + + const uint8_t* memory_base; + + size_t memory_size; + + const FX_WCHAR* path_name; +} WINDIB_Open_Args_; + +class CFX_WindowsDIB : public CFX_DIBitmap { + public: + CFX_WindowsDIB(HDC hDC, int width, int height); + ~CFX_WindowsDIB() override; + + static CFX_ByteString GetBitmapInfo(const CFX_DIBitmap* pBitmap); + static CFX_DIBitmap* LoadFromBuf(BITMAPINFO* pbmi, void* pData); + static HBITMAP GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC); + static CFX_DIBitmap* LoadFromFile(const FX_WCHAR* filename); + static CFX_DIBitmap* LoadFromFile(const FX_CHAR* filename); + static CFX_DIBitmap* LoadDIBitmap(WINDIB_Open_Args_ args); + + HDC GetDC() const { return m_hMemDC; } + HBITMAP GetWindowsBitmap() const { return m_hBitmap; } + + void LoadFromDevice(HDC hDC, int left, int top); + void SetToDevice(HDC hDC, int left, int top); + + protected: + HDC m_hMemDC; + HBITMAP m_hBitmap; + HBITMAP m_hOldBitmap; +}; + +#endif // _WIN32 + +#endif // CORE_FXGE_WIN32_CFX_WINDOWSDIB_H_ diff --git a/modules/pdfium/pdfium/core/fxge/win32/cpsoutput.cpp b/modules/pdfium/pdfium/core/fxge/win32/cpsoutput.cpp new file mode 100644 index 000000000000..76b37d7dacf1 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/win32/cpsoutput.cpp @@ -0,0 +1,40 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxge/win32/cpsoutput.h" + +#include + +#include "core/fxcrt/fx_system.h" + +CPSOutput::CPSOutput(HDC hDC) { + m_hDC = hDC; +} + +CPSOutput::~CPSOutput() {} + +void CPSOutput::Release() { + delete this; +} + +void CPSOutput::OutputPS(const FX_CHAR* str, int len) { + if (len < 0) + len = static_cast(FXSYS_strlen(str)); + + int sent_len = 0; + while (len > 0) { + FX_CHAR buffer[1026]; + int send_len = std::min(len, 1024); + *(reinterpret_cast(buffer)) = send_len; + FXSYS_memcpy(buffer + 2, str + sent_len, send_len); + + // TODO(thestig/rbpotter): Do PASSTHROUGH for non-Chromium usage. + // ExtEscape(m_hDC, PASSTHROUGH, send_len + 2, buffer, 0, nullptr); + ::GdiComment(m_hDC, send_len + 2, reinterpret_cast(buffer)); + sent_len += send_len; + len -= send_len; + } +} diff --git a/modules/pdfium/pdfium/core/fxge/win32/cpsoutput.h b/modules/pdfium/pdfium/core/fxge/win32/cpsoutput.h new file mode 100644 index 000000000000..bc9225bd7e85 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/win32/cpsoutput.h @@ -0,0 +1,26 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_WIN32_CPSOUTPUT_H_ +#define CORE_FXGE_WIN32_CPSOUTPUT_H_ + +#include + +#include "core/fxcrt/fx_system.h" + +class CPSOutput { + public: + explicit CPSOutput(HDC hDC); + ~CPSOutput(); + + // IFX_PSOutput + void Release(); + void OutputPS(const FX_CHAR* str, int len); + + HDC m_hDC; +}; + +#endif // CORE_FXGE_WIN32_CPSOUTPUT_H_ diff --git a/modules/pdfium/pdfium/core/fxge/win32/dwrite_int.h b/modules/pdfium/pdfium/core/fxge/win32/dwrite_int.h new file mode 100644 index 000000000000..86ead89947ab --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/win32/dwrite_int.h @@ -0,0 +1,66 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_WIN32_DWRITE_INT_H_ +#define CORE_FXGE_WIN32_DWRITE_INT_H_ + +#ifndef DECLSPEC_UUID +#if (_MSC_VER >= 1100) && defined(__cplusplus) +#define DECLSPEC_UUID(x) __declspec(uuid(x)) +#else +#define DECLSPEC_UUID(x) +#endif +#endif +#ifndef DECLSPEC_NOVTABLE +#if (_MSC_VER >= 1100) && defined(__cplusplus) +#define DECLSPEC_NOVTABLE __declspec(novtable) +#else +#define DECLSPEC_NOVTABLE +#endif +#endif +#if (WINVER < 0x0500) +#ifndef _MAC +DECLARE_HANDLE(HMONITOR); +#endif +#endif +class CDWriteExt { + public: + CDWriteExt(); + ~CDWriteExt(); + + void Load(); + void Unload(); + + bool IsAvailable() { return !!m_pDWriteFactory; } + + void* DwCreateFontFaceFromStream(uint8_t* pData, + uint32_t size, + int simulation_style); + bool DwCreateRenderingTarget(CFX_DIBitmap* pSrc, void** renderTarget); + void DwDeleteRenderingTarget(void* renderTarget); + bool DwRendingString(void* renderTarget, + CFX_ClipRgn* pClipRgn, + FX_RECT& stringRect, + CFX_Matrix* pMatrix, + void* font, + FX_FLOAT font_size, + FX_ARGB text_color, + int glyph_count, + unsigned short* glyph_indices, + FX_FLOAT baselineOriginX, + FX_FLOAT baselineOriginY, + void* glyph_offsets, + FX_FLOAT* glyph_advances); + void DwDeleteFont(void* pFont); + + protected: + void* m_hModule; + void* m_pDWriteFactory; + void* m_pDwFontContext; + void* m_pDwTextRenderer; +}; + +#endif // CORE_FXGE_WIN32_DWRITE_INT_H_ diff --git a/modules/pdfium/pdfium/core/fxge/win32/fx_win32_device.cpp b/modules/pdfium/pdfium/core/fxge/win32/fx_win32_device.cpp new file mode 100644 index 000000000000..92e9b41e064e --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/win32/fx_win32_device.cpp @@ -0,0 +1,1388 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include +#include +#include + +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxcrt/fx_memory.h" +#include "core/fxcrt/fx_system.h" +#include "core/fxge/cfx_windowsdevice.h" +#include "core/fxge/dib/dib_int.h" +#include "core/fxge/fx_font.h" +#include "core/fxge/fx_freetype.h" +#include "core/fxge/ge/cfx_folderfontinfo.h" +#include "core/fxge/ge/fx_text_int.h" +#include "core/fxge/ifx_systemfontinfo.h" +#include "core/fxge/win32/cfx_windowsdib.h" +#include "core/fxge/win32/dwrite_int.h" +#include "core/fxge/win32/win32_int.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +#ifndef _SKIA_SUPPORT_ +#include "core/fxge/agg/fx_agg_driver.h" +#endif + +namespace { + +const struct { + const FX_CHAR* m_pFaceName; + const FX_CHAR* m_pVariantName; +} g_VariantNames[] = { + {"DFKai-SB", "\x19\x6A\x77\x69\xD4\x9A"}, +}; + +const struct { + const FX_CHAR* m_pName; + const FX_CHAR* m_pWinName; + bool m_bBold; + bool m_bItalic; +} g_Base14Substs[] = { + {"Courier", "Courier New", false, false}, + {"Courier-Bold", "Courier New", true, false}, + {"Courier-BoldOblique", "Courier New", true, true}, + {"Courier-Oblique", "Courier New", false, true}, + {"Helvetica", "Arial", false, false}, + {"Helvetica-Bold", "Arial", true, false}, + {"Helvetica-BoldOblique", "Arial", true, true}, + {"Helvetica-Oblique", "Arial", false, true}, + {"Times-Roman", "Times New Roman", false, false}, + {"Times-Bold", "Times New Roman", true, false}, + {"Times-BoldItalic", "Times New Roman", true, true}, + {"Times-Italic", "Times New Roman", false, true}, +}; + +struct FontNameMap { + const FX_CHAR* m_pSubFontName; + const FX_CHAR* m_pSrcFontName; +}; +const FontNameMap g_JpFontNameMap[] = { + {"MS Mincho", "Heiseimin-W3"}, + {"MS Gothic", "Jun101-Light"}, +}; + +bool GetSubFontName(CFX_ByteString* name) { + for (size_t i = 0; i < FX_ArraySize(g_JpFontNameMap); ++i) { + if (!FXSYS_stricmp(name->c_str(), g_JpFontNameMap[i].m_pSrcFontName)) { + *name = g_JpFontNameMap[i].m_pSubFontName; + return true; + } + } + return false; +} + +bool IsGDIEnabled() { + // If GDI is disabled then GetDC for the desktop will fail. + HDC hdc = ::GetDC(nullptr); + if (!hdc) + return false; + ::ReleaseDC(nullptr, hdc); + return true; +} + +HPEN CreatePen(const CFX_GraphStateData* pGraphState, + const CFX_Matrix* pMatrix, + uint32_t argb) { + FX_FLOAT width; + FX_FLOAT scale = 1.f; + if (pMatrix) + scale = FXSYS_fabs(pMatrix->a) > FXSYS_fabs(pMatrix->b) + ? FXSYS_fabs(pMatrix->a) + : FXSYS_fabs(pMatrix->b); + if (pGraphState) { + width = scale * pGraphState->m_LineWidth; + } else { + width = 1.0f; + } + uint32_t PenStyle = PS_GEOMETRIC; + if (width < 1) { + width = 1; + } + if (pGraphState->m_DashCount) { + PenStyle |= PS_USERSTYLE; + } else { + PenStyle |= PS_SOLID; + } + switch (pGraphState->m_LineCap) { + case 0: + PenStyle |= PS_ENDCAP_FLAT; + break; + case 1: + PenStyle |= PS_ENDCAP_ROUND; + break; + case 2: + PenStyle |= PS_ENDCAP_SQUARE; + break; + } + switch (pGraphState->m_LineJoin) { + case 0: + PenStyle |= PS_JOIN_MITER; + break; + case 1: + PenStyle |= PS_JOIN_ROUND; + break; + case 2: + PenStyle |= PS_JOIN_BEVEL; + break; + } + int a; + FX_COLORREF rgb; + ArgbDecode(argb, a, rgb); + LOGBRUSH lb; + lb.lbColor = rgb; + lb.lbStyle = BS_SOLID; + lb.lbHatch = 0; + std::vector dashes; + if (pGraphState->m_DashCount) { + dashes.resize(pGraphState->m_DashCount); + for (int i = 0; i < pGraphState->m_DashCount; i++) { + dashes[i] = FXSYS_round( + pMatrix ? pMatrix->TransformDistance(pGraphState->m_DashArray[i]) + : pGraphState->m_DashArray[i]); + dashes[i] = std::max(dashes[i], 1U); + } + } + return ExtCreatePen(PenStyle, (DWORD)FXSYS_ceil(width), &lb, + pGraphState->m_DashCount, + reinterpret_cast(dashes.data())); +} + +HBRUSH CreateBrush(uint32_t argb) { + int a; + FX_COLORREF rgb; + ArgbDecode(argb, a, rgb); + return CreateSolidBrush(rgb); +} + +void SetPathToDC(HDC hDC, + const CFX_PathData* pPathData, + const CFX_Matrix* pMatrix) { + BeginPath(hDC); + + const std::vector& pPoints = pPathData->GetPoints(); + for (size_t i = 0; i < pPoints.size(); i++) { + CFX_PointF pos = pPoints[i].m_Point; + if (pMatrix) + pos = pMatrix->Transform(pos); + + CFX_Point screen(FXSYS_round(pos.x), FXSYS_round(pos.y)); + FXPT_TYPE point_type = pPoints[i].m_Type; + if (point_type == FXPT_TYPE::MoveTo) { + MoveToEx(hDC, screen.x, screen.y, nullptr); + } else if (point_type == FXPT_TYPE::LineTo) { + if (pPoints[i].m_Point == pPoints[i - 1].m_Point) + screen.x++; + + LineTo(hDC, screen.x, screen.y); + } else if (point_type == FXPT_TYPE::BezierTo) { + POINT lppt[3]; + lppt[0].x = screen.x; + lppt[0].y = screen.y; + + pos = pPoints[i + 1].m_Point; + if (pMatrix) + pos = pMatrix->Transform(pos); + + lppt[1].x = FXSYS_round(pos.x); + lppt[1].y = FXSYS_round(pos.y); + + pos = pPoints[i + 2].m_Point; + if (pMatrix) + pos = pMatrix->Transform(pos); + + lppt[2].x = FXSYS_round(pos.x); + lppt[2].y = FXSYS_round(pos.y); + PolyBezierTo(hDC, lppt, 3); + i += 2; + } + if (pPoints[i].m_CloseFigure) + CloseFigure(hDC); + } + EndPath(hDC); +} + +#ifdef _SKIA_SUPPORT_ +// TODO(caryclark) This antigrain function is duplicated here to permit +// removing the last remaining dependency. Eventually, this will be elminiated +// altogether and replace by Skia code. + +struct rect_base { + FX_FLOAT x1; + FX_FLOAT y1; + FX_FLOAT x2; + FX_FLOAT y2; +}; + +unsigned clip_liang_barsky(FX_FLOAT x1, + FX_FLOAT y1, + FX_FLOAT x2, + FX_FLOAT y2, + const rect_base& clip_box, + FX_FLOAT* x, + FX_FLOAT* y) { + const FX_FLOAT nearzero = 1e-30f; + FX_FLOAT deltax = x2 - x1; + FX_FLOAT deltay = y2 - y1; + unsigned np = 0; + if (deltax == 0) + deltax = (x1 > clip_box.x1) ? -nearzero : nearzero; + FX_FLOAT xin, xout; + if (deltax > 0) { + xin = clip_box.x1; + xout = clip_box.x2; + } else { + xin = clip_box.x2; + xout = clip_box.x1; + } + FX_FLOAT tinx = (xin - x1) / deltax; + if (deltay == 0) + deltay = (y1 > clip_box.y1) ? -nearzero : nearzero; + FX_FLOAT yin, yout; + if (deltay > 0) { + yin = clip_box.y1; + yout = clip_box.y2; + } else { + yin = clip_box.y2; + yout = clip_box.y1; + } + FX_FLOAT tiny = (yin - y1) / deltay; + FX_FLOAT tin1, tin2; + if (tinx < tiny) { + tin1 = tinx; + tin2 = tiny; + } else { + tin1 = tiny; + tin2 = tinx; + } + if (tin1 <= 1.0f) { + if (0 < tin1) { + *x++ = xin; + *y++ = yin; + ++np; + } + if (tin2 <= 1.0f) { + FX_FLOAT toutx = (xout - x1) / deltax; + FX_FLOAT touty = (yout - y1) / deltay; + FX_FLOAT tout1 = (toutx < touty) ? toutx : touty; + if (tin2 > 0 || tout1 > 0) { + if (tin2 <= tout1) { + if (tin2 > 0) { + if (tinx > tiny) { + *x++ = xin; + *y++ = y1 + (deltay * tinx); + } else { + *x++ = x1 + (deltax * tiny); + *y++ = yin; + } + ++np; + } + if (tout1 < 1.0f) { + if (toutx < touty) { + *x++ = xout; + *y++ = y1 + (deltay * toutx); + } else { + *x++ = x1 + (deltax * touty); + *y++ = yout; + } + } else { + *x++ = x2; + *y++ = y2; + } + ++np; + } else { + if (tinx > tiny) { + *x++ = xin; + *y++ = yout; + } else { + *x++ = xout; + *y++ = yin; + } + ++np; + } + } + } + } + return np; +} +#endif // _SKIA_SUPPORT_ + +class CFX_Win32FallbackFontInfo final : public CFX_FolderFontInfo { + public: + CFX_Win32FallbackFontInfo() {} + ~CFX_Win32FallbackFontInfo() override {} + + // CFX_FolderFontInfo: + void* MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* family, + int& iExact) override; +}; + +class CFX_Win32FontInfo final : public IFX_SystemFontInfo { + public: + CFX_Win32FontInfo(); + ~CFX_Win32FontInfo() override; + + // IFX_SystemFontInfo + bool EnumFontList(CFX_FontMapper* pMapper) override; + void* MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* face, + int& iExact) override; + void* GetFont(const FX_CHAR* face) override { return nullptr; } + uint32_t GetFontData(void* hFont, + uint32_t table, + uint8_t* buffer, + uint32_t size) override; + bool GetFaceName(void* hFont, CFX_ByteString& name) override; + bool GetFontCharset(void* hFont, int& charset) override; + void DeleteFont(void* hFont) override; + + bool IsOpenTypeFromDiv(const LOGFONTA* plf); + bool IsSupportFontFormDiv(const LOGFONTA* plf); + void AddInstalledFont(const LOGFONTA* plf, uint32_t FontType); + void GetGBPreference(CFX_ByteString& face, int weight, int picth_family); + void GetJapanesePreference(CFX_ByteString& face, + int weight, + int picth_family); + CFX_ByteString FindFont(const CFX_ByteString& name); + + HDC m_hDC; + CFX_FontMapper* m_pMapper; + CFX_ByteString m_LastFamily; + CFX_ByteString m_KaiTi, m_FangSong; +}; + +int CALLBACK FontEnumProc(const LOGFONTA* plf, + const TEXTMETRICA* lpntme, + uint32_t FontType, + LPARAM lParam) { + CFX_Win32FontInfo* pFontInfo = reinterpret_cast(lParam); + pFontInfo->AddInstalledFont(plf, FontType); + return 1; +} + +CFX_Win32FontInfo::CFX_Win32FontInfo() : m_hDC(CreateCompatibleDC(nullptr)) {} + +CFX_Win32FontInfo::~CFX_Win32FontInfo() { + DeleteDC(m_hDC); +} + +bool CFX_Win32FontInfo::IsOpenTypeFromDiv(const LOGFONTA* plf) { + HFONT hFont = CreateFontIndirectA(plf); + bool ret = false; + uint32_t font_size = GetFontData(hFont, 0, nullptr, 0); + if (font_size != GDI_ERROR && font_size >= sizeof(uint32_t)) { + uint32_t lVersion = 0; + GetFontData(hFont, 0, (uint8_t*)(&lVersion), sizeof(uint32_t)); + lVersion = (((uint32_t)(uint8_t)(lVersion)) << 24) | + ((uint32_t)((uint8_t)(lVersion >> 8))) << 16 | + ((uint32_t)((uint8_t)(lVersion >> 16))) << 8 | + ((uint8_t)(lVersion >> 24)); + if (lVersion == FXBSTR_ID('O', 'T', 'T', 'O') || lVersion == 0x00010000 || + lVersion == FXBSTR_ID('t', 't', 'c', 'f') || + lVersion == FXBSTR_ID('t', 'r', 'u', 'e') || lVersion == 0x00020000) { + ret = true; + } + } + DeleteFont(hFont); + return ret; +} + +bool CFX_Win32FontInfo::IsSupportFontFormDiv(const LOGFONTA* plf) { + HFONT hFont = CreateFontIndirectA(plf); + bool ret = false; + uint32_t font_size = GetFontData(hFont, 0, nullptr, 0); + if (font_size != GDI_ERROR && font_size >= sizeof(uint32_t)) { + uint32_t lVersion = 0; + GetFontData(hFont, 0, (uint8_t*)(&lVersion), sizeof(uint32_t)); + lVersion = (((uint32_t)(uint8_t)(lVersion)) << 24) | + ((uint32_t)((uint8_t)(lVersion >> 8))) << 16 | + ((uint32_t)((uint8_t)(lVersion >> 16))) << 8 | + ((uint8_t)(lVersion >> 24)); + if (lVersion == FXBSTR_ID('O', 'T', 'T', 'O') || lVersion == 0x00010000 || + lVersion == FXBSTR_ID('t', 't', 'c', 'f') || + lVersion == FXBSTR_ID('t', 'r', 'u', 'e') || lVersion == 0x00020000 || + (lVersion & 0xFFFF0000) == FXBSTR_ID(0x80, 0x01, 0x00, 0x00) || + (lVersion & 0xFFFF0000) == FXBSTR_ID('%', '!', 0, 0)) { + ret = true; + } + } + DeleteFont(hFont); + return ret; +} + +void CFX_Win32FontInfo::AddInstalledFont(const LOGFONTA* plf, + uint32_t FontType) { + CFX_ByteString name(plf->lfFaceName); + if (name[0] == '@') + return; + + if (name == m_LastFamily) { + m_pMapper->AddInstalledFont(name, plf->lfCharSet); + return; + } + if (!(FontType & TRUETYPE_FONTTYPE)) { + if (!(FontType & DEVICE_FONTTYPE) || !IsSupportFontFormDiv(plf)) + return; + } + + m_pMapper->AddInstalledFont(name, plf->lfCharSet); + m_LastFamily = name; +} + +bool CFX_Win32FontInfo::EnumFontList(CFX_FontMapper* pMapper) { + m_pMapper = pMapper; + LOGFONTA lf; + FXSYS_memset(&lf, 0, sizeof(LOGFONTA)); + lf.lfCharSet = FXFONT_DEFAULT_CHARSET; + lf.lfFaceName[0] = 0; + lf.lfPitchAndFamily = 0; + EnumFontFamiliesExA(m_hDC, &lf, (FONTENUMPROCA)FontEnumProc, (uintptr_t) this, + 0); + return true; +} + +CFX_ByteString CFX_Win32FontInfo::FindFont(const CFX_ByteString& name) { + if (!m_pMapper) + return name; + + for (size_t i = 0; i < m_pMapper->m_InstalledTTFonts.size(); ++i) { + CFX_ByteString thisname = m_pMapper->m_InstalledTTFonts[i]; + if (thisname.Left(name.GetLength()) == name) + return m_pMapper->m_InstalledTTFonts[i]; + } + for (size_t i = 0; i < m_pMapper->m_LocalizedTTFonts.size(); ++i) { + CFX_ByteString thisname = m_pMapper->m_LocalizedTTFonts[i].first; + if (thisname.Left(name.GetLength()) == name) + return m_pMapper->m_LocalizedTTFonts[i].second; + } + return CFX_ByteString(); +} + +void* CFX_Win32FallbackFontInfo::MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* cstr_face, + int& iExact) { + void* font = GetSubstFont(cstr_face); + if (font) { + iExact = 1; + return font; + } + bool bCJK = true; + switch (charset) { + case FXFONT_SHIFTJIS_CHARSET: + case FXFONT_GB2312_CHARSET: + case FXFONT_CHINESEBIG5_CHARSET: + case FXFONT_HANGUL_CHARSET: + break; + default: + bCJK = false; + break; + } + return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK); +} + +void CFX_Win32FontInfo::GetGBPreference(CFX_ByteString& face, + int weight, + int picth_family) { + if (face.Find("KaiTi") >= 0 || face.Find("\xbf\xac") >= 0) { + if (m_KaiTi.IsEmpty()) { + m_KaiTi = FindFont("KaiTi"); + if (m_KaiTi.IsEmpty()) { + m_KaiTi = "SimSun"; + } + } + face = m_KaiTi; + } else if (face.Find("FangSong") >= 0 || face.Find("\xb7\xc2\xcb\xce") >= 0) { + if (m_FangSong.IsEmpty()) { + m_FangSong = FindFont("FangSong"); + if (m_FangSong.IsEmpty()) { + m_FangSong = "SimSun"; + } + } + face = m_FangSong; + } else if (face.Find("SimSun") >= 0 || face.Find("\xcb\xce") >= 0) { + face = "SimSun"; + } else if (face.Find("SimHei") >= 0 || face.Find("\xba\xda") >= 0) { + face = "SimHei"; + } else if (!(picth_family & FF_ROMAN) && weight > 550) { + face = "SimHei"; + } else { + face = "SimSun"; + } +} + +void CFX_Win32FontInfo::GetJapanesePreference(CFX_ByteString& face, + int weight, + int picth_family) { + if (face.Find("Gothic") >= 0 || + face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) { + if (face.Find("PGothic") >= 0 || + face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) { + face = "MS PGothic"; + } else if (face.Find("UI Gothic") >= 0) { + face = "MS UI Gothic"; + } else { + if (face.Find("HGSGothicM") >= 0 || face.Find("HGMaruGothicMPRO") >= 0) { + face = "MS PGothic"; + } else { + face = "MS Gothic"; + } + } + return; + } + if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) { + if (face.Find("PMincho") >= 0 || + face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) { + face = "MS PMincho"; + } else { + face = "MS Mincho"; + } + return; + } + if (GetSubFontName(&face)) + return; + + if (!(picth_family & FF_ROMAN) && weight > 400) { + face = "MS PGothic"; + } else { + face = "MS PMincho"; + } +} + +void* CFX_Win32FontInfo::MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* cstr_face, + int& iExact) { + CFX_ByteString face = cstr_face; + int iBaseFont; + for (iBaseFont = 0; iBaseFont < 12; iBaseFont++) + if (face == CFX_ByteStringC(g_Base14Substs[iBaseFont].m_pName)) { + face = g_Base14Substs[iBaseFont].m_pWinName; + weight = g_Base14Substs[iBaseFont].m_bBold ? FW_BOLD : FW_NORMAL; + bItalic = g_Base14Substs[iBaseFont].m_bItalic; + iExact = true; + break; + } + if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_SYMBOL_CHARSET) { + charset = FXFONT_DEFAULT_CHARSET; + } + int subst_pitch_family = pitch_family; + switch (charset) { + case FXFONT_SHIFTJIS_CHARSET: + subst_pitch_family = FF_ROMAN; + break; + case FXFONT_CHINESEBIG5_CHARSET: + case FXFONT_HANGUL_CHARSET: + case FXFONT_GB2312_CHARSET: + subst_pitch_family = 0; + break; + } + HFONT hFont = + ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, + OUT_TT_ONLY_PRECIS, 0, 0, subst_pitch_family, face.c_str()); + char facebuf[100]; + HFONT hOldFont = (HFONT)::SelectObject(m_hDC, hFont); + ::GetTextFaceA(m_hDC, 100, facebuf); + ::SelectObject(m_hDC, hOldFont); + if (face.EqualNoCase(facebuf)) + return hFont; + + CFX_WideString wsFace = CFX_WideString::FromLocal(facebuf); + for (size_t i = 0; i < FX_ArraySize(g_VariantNames); ++i) { + if (face != g_VariantNames[i].m_pFaceName) + continue; + + const unsigned short* pName = reinterpret_cast( + g_VariantNames[i].m_pVariantName); + FX_STRSIZE len = CFX_WideString::WStringLength(pName); + CFX_WideString wsName = CFX_WideString::FromUTF16LE(pName, len); + if (wsFace == wsName) + return hFont; + } + ::DeleteObject(hFont); + if (charset == FXFONT_DEFAULT_CHARSET) + return nullptr; + + switch (charset) { + case FXFONT_SHIFTJIS_CHARSET: + GetJapanesePreference(face, weight, pitch_family); + break; + case FXFONT_GB2312_CHARSET: + GetGBPreference(face, weight, pitch_family); + break; + case FXFONT_HANGUL_CHARSET: + face = "Gulim"; + break; + case FXFONT_CHINESEBIG5_CHARSET: + if (face.Find("MSung") >= 0) { + face = "MingLiU"; + } else { + face = "PMingLiU"; + } + break; + } + hFont = + ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, + OUT_TT_ONLY_PRECIS, 0, 0, subst_pitch_family, face.c_str()); + return hFont; +} + +void CFX_Win32FontInfo::DeleteFont(void* hFont) { + ::DeleteObject(hFont); +} + +uint32_t CFX_Win32FontInfo::GetFontData(void* hFont, + uint32_t table, + uint8_t* buffer, + uint32_t size) { + HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); + table = FXDWORD_GET_MSBFIRST(reinterpret_cast(&table)); + size = ::GetFontData(m_hDC, table, 0, buffer, size); + ::SelectObject(m_hDC, hOldFont); + if (size == GDI_ERROR) { + return 0; + } + return size; +} + +bool CFX_Win32FontInfo::GetFaceName(void* hFont, CFX_ByteString& name) { + char facebuf[100]; + HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); + int ret = ::GetTextFaceA(m_hDC, 100, facebuf); + ::SelectObject(m_hDC, hOldFont); + if (ret == 0) { + return false; + } + name = facebuf; + return true; +} + +bool CFX_Win32FontInfo::GetFontCharset(void* hFont, int& charset) { + TEXTMETRIC tm; + HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); + ::GetTextMetrics(m_hDC, &tm); + ::SelectObject(m_hDC, hOldFont); + charset = tm.tmCharSet; + return true; +} + +} // namespace + +int g_pdfium_print_postscript_level = 0; + +std::unique_ptr IFX_SystemFontInfo::CreateDefault( + const char** pUnused) { + if (IsGDIEnabled()) + return std::unique_ptr(new CFX_Win32FontInfo); + + // Select the fallback font information class if GDI is disabled. + CFX_Win32FallbackFontInfo* pInfoFallback = new CFX_Win32FallbackFontInfo; + // Construct the font path manually, SHGetKnownFolderPath won't work under + // a restrictive sandbox. + CHAR windows_path[MAX_PATH] = {}; + DWORD path_len = ::GetWindowsDirectoryA(windows_path, MAX_PATH); + if (path_len > 0 && path_len < MAX_PATH) { + CFX_ByteString fonts_path(windows_path); + fonts_path += "\\Fonts"; + pInfoFallback->AddPath(fonts_path.AsStringC()); + } + return std::unique_ptr(pInfoFallback); +} + +void CFX_GEModule::InitPlatform() { + CWin32Platform* pPlatformData = new CWin32Platform; + OSVERSIONINFO ver; + ver.dwOSVersionInfoSize = sizeof(ver); + GetVersionEx(&ver); + pPlatformData->m_bHalfTone = ver.dwMajorVersion >= 5; + if (IsGDIEnabled()) + pPlatformData->m_GdiplusExt.Load(); + m_pPlatformData = pPlatformData; + m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault(nullptr)); +} + +void CFX_GEModule::DestroyPlatform() { + delete (CWin32Platform*)m_pPlatformData; + m_pPlatformData = nullptr; +} + +CGdiDeviceDriver::CGdiDeviceDriver(HDC hDC, int device_class) { + m_hDC = hDC; + m_DeviceClass = device_class; + CWin32Platform* pPlatform = + (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); + SetStretchBltMode(hDC, pPlatform->m_bHalfTone ? HALFTONE : COLORONCOLOR); + DWORD obj_type = GetObjectType(m_hDC); + m_bMetafileDCType = obj_type == OBJ_ENHMETADC || obj_type == OBJ_ENHMETAFILE; + if (obj_type == OBJ_MEMDC) { + HBITMAP hBitmap = CreateBitmap(1, 1, 1, 1, nullptr); + hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap); + BITMAP bitmap; + GetObject(hBitmap, sizeof bitmap, &bitmap); + m_nBitsPerPixel = bitmap.bmBitsPixel; + m_Width = bitmap.bmWidth; + m_Height = abs(bitmap.bmHeight); + hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap); + DeleteObject(hBitmap); + } else { + m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL); + m_Width = ::GetDeviceCaps(m_hDC, HORZRES); + m_Height = ::GetDeviceCaps(m_hDC, VERTRES); + } + if (m_DeviceClass != FXDC_DISPLAY) { + m_RenderCaps = FXRC_BIT_MASK; + } else { + m_RenderCaps = FXRC_GET_BITS | FXRC_BIT_MASK; + } +} + +CGdiDeviceDriver::~CGdiDeviceDriver() {} + +int CGdiDeviceDriver::GetDeviceCaps(int caps_id) const { + switch (caps_id) { + case FXDC_DEVICE_CLASS: + return m_DeviceClass; + case FXDC_PIXEL_WIDTH: + return m_Width; + case FXDC_PIXEL_HEIGHT: + return m_Height; + case FXDC_BITS_PIXEL: + return m_nBitsPerPixel; + case FXDC_RENDER_CAPS: + return m_RenderCaps; + } + return 0; +} + +void CGdiDeviceDriver::SaveState() { + SaveDC(m_hDC); +} + +void CGdiDeviceDriver::RestoreState(bool bKeepSaved) { + RestoreDC(m_hDC, -1); + if (bKeepSaved) + SaveDC(m_hDC); +} + +bool CGdiDeviceDriver::GDI_SetDIBits(CFX_DIBitmap* pBitmap1, + const FX_RECT* pSrcRect, + int left, + int top) { + if (m_DeviceClass == FXDC_PRINTER) { + std::unique_ptr pBitmap = pBitmap1->FlipImage(false, true); + if (!pBitmap) + return false; + + if (pBitmap->IsCmykImage() && !pBitmap->ConvertFormat(FXDIB_Rgb)) + return false; + + int width = pSrcRect->Width(), height = pSrcRect->Height(); + LPBYTE pBuffer = pBitmap->GetBuffer(); + CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap.get()); + ((BITMAPINFOHEADER*)info.c_str())->biHeight *= -1; + FX_RECT dst_rect(0, 0, width, height); + dst_rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()); + int dst_width = dst_rect.Width(); + int dst_height = dst_rect.Height(); + ::StretchDIBits(m_hDC, left, top, dst_width, dst_height, 0, 0, dst_width, + dst_height, pBuffer, (BITMAPINFO*)info.c_str(), + DIB_RGB_COLORS, SRCCOPY); + } else { + CFX_MaybeOwned pBitmap(pBitmap1); + if (pBitmap->IsCmykImage()) { + pBitmap = pBitmap->CloneConvert(FXDIB_Rgb).release(); + if (!pBitmap) + return false; + } + int width = pSrcRect->Width(), height = pSrcRect->Height(); + LPBYTE pBuffer = pBitmap->GetBuffer(); + CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap.Get()); + ::SetDIBitsToDevice(m_hDC, left, top, width, height, pSrcRect->left, + pBitmap->GetHeight() - pSrcRect->bottom, 0, + pBitmap->GetHeight(), pBuffer, + (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS); + } + return true; +} + +bool CGdiDeviceDriver::GDI_StretchDIBits(CFX_DIBitmap* pBitmap1, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + uint32_t flags) { + CFX_DIBitmap* pBitmap = pBitmap1; + if (!pBitmap || dest_width == 0 || dest_height == 0) + return false; + + if (pBitmap->IsCmykImage() && !pBitmap->ConvertFormat(FXDIB_Rgb)) + return false; + + CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap); + if ((int64_t)abs(dest_width) * abs(dest_height) < + (int64_t)pBitmap1->GetWidth() * pBitmap1->GetHeight() * 4 || + (flags & FXDIB_INTERPOL) || (flags & FXDIB_BICUBIC_INTERPOL)) { + SetStretchBltMode(m_hDC, HALFTONE); + } else { + SetStretchBltMode(m_hDC, COLORONCOLOR); + } + CFX_MaybeOwned pToStrechBitmap(pBitmap); + if (m_DeviceClass == FXDC_PRINTER && + ((int64_t)pBitmap->GetWidth() * pBitmap->GetHeight() > + (int64_t)abs(dest_width) * abs(dest_height))) { + pToStrechBitmap = pBitmap->StretchTo(dest_width, dest_height); + } + CFX_ByteString toStrechBitmapInfo = + CFX_WindowsDIB::GetBitmapInfo(pToStrechBitmap.Get()); + ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height, 0, 0, + pToStrechBitmap->GetWidth(), pToStrechBitmap->GetHeight(), + pToStrechBitmap->GetBuffer(), + (BITMAPINFO*)toStrechBitmapInfo.c_str(), DIB_RGB_COLORS, + SRCCOPY); + return true; +} + +bool CGdiDeviceDriver::GDI_StretchBitMask(CFX_DIBitmap* pBitmap1, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + uint32_t bitmap_color, + uint32_t flags) { + CFX_DIBitmap* pBitmap = pBitmap1; + if (!pBitmap || dest_width == 0 || dest_height == 0) + return false; + + int width = pBitmap->GetWidth(), height = pBitmap->GetHeight(); + struct { + BITMAPINFOHEADER bmiHeader; + uint32_t bmiColors[2]; + } bmi; + FXSYS_memset(&bmi.bmiHeader, 0, sizeof(BITMAPINFOHEADER)); + bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmi.bmiHeader.biBitCount = 1; + bmi.bmiHeader.biCompression = BI_RGB; + bmi.bmiHeader.biHeight = -height; + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biWidth = width; + if (m_nBitsPerPixel != 1) { + SetStretchBltMode(m_hDC, HALFTONE); + } + bmi.bmiColors[0] = 0xffffff; + bmi.bmiColors[1] = 0; + + HBRUSH hPattern = CreateSolidBrush(bitmap_color & 0xffffff); + HBRUSH hOld = (HBRUSH)SelectObject(m_hDC, hPattern); + + // In PDF, when image mask is 1, use device bitmap; when mask is 0, use brush + // bitmap. + // A complete list of the boolen operations is as follows: + + /* P(bitmap_color) S(ImageMask) D(DeviceBitmap) Result + * 0 0 0 0 + * 0 0 1 0 + * 0 1 0 0 + * 0 1 1 1 + * 1 0 0 1 + * 1 0 1 1 + * 1 1 0 0 + * 1 1 1 1 + */ + // The boolen codes is B8. Based on + // http://msdn.microsoft.com/en-us/library/aa932106.aspx, the ROP3 code is + // 0xB8074A + + ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height, 0, 0, + width, height, pBitmap->GetBuffer(), (BITMAPINFO*)&bmi, + DIB_RGB_COLORS, 0xB8074A); + + SelectObject(m_hDC, hOld); + DeleteObject(hPattern); + + return true; +} + +bool CGdiDeviceDriver::GetClipBox(FX_RECT* pRect) { + return !!(::GetClipBox(m_hDC, (RECT*)pRect)); +} + +void* CGdiDeviceDriver::GetPlatformSurface() const { + return (void*)m_hDC; +} + +void CGdiDeviceDriver::DrawLine(FX_FLOAT x1, + FX_FLOAT y1, + FX_FLOAT x2, + FX_FLOAT y2) { + if (!m_bMetafileDCType) { // EMF drawing is not bound to the DC. + int startOutOfBoundsFlag = (x1 < 0) | ((x1 > m_Width) << 1) | + ((y1 < 0) << 2) | ((y1 > m_Height) << 3); + int endOutOfBoundsFlag = (x2 < 0) | ((x2 > m_Width) << 1) | + ((y2 < 0) << 2) | ((y2 > m_Height) << 3); + if (startOutOfBoundsFlag & endOutOfBoundsFlag) + return; + + if (startOutOfBoundsFlag || endOutOfBoundsFlag) { + FX_FLOAT x[2]; + FX_FLOAT y[2]; + int np; +#ifdef _SKIA_SUPPORT_ + // TODO(caryclark) temporary replacement of antigrain in line function + // to permit removing antigrain altogether + rect_base rect = {0.0f, 0.0f, (FX_FLOAT)(m_Width), (FX_FLOAT)(m_Height)}; + np = clip_liang_barsky(x1, y1, x2, y2, rect, x, y); +#else + agg::rect_base rect(0.0f, 0.0f, (FX_FLOAT)(m_Width), + (FX_FLOAT)(m_Height)); + np = agg::clip_liang_barsky(x1, y1, x2, y2, rect, x, y); +#endif + if (np == 0) + return; + + if (np == 1) { + x2 = x[0]; + y2 = y[0]; + } else { + ASSERT(np == 2); + x1 = x[0]; + y1 = y[0]; + x2 = x[1]; + y2 = y[1]; + } + } + } + + MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), nullptr); + LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2)); +} + +bool CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData, + const CFX_Matrix* pMatrix, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode, + int blend_type) { + if (blend_type != FXDIB_BLEND_NORMAL) + return false; + + CWin32Platform* pPlatform = + (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); + if (!(pGraphState || stroke_color == 0) && + !pPlatform->m_GdiplusExt.IsAvailable()) { + CFX_FloatRect bbox_f = pPathData->GetBoundingBox(); + if (pMatrix) + pMatrix->TransformRect(bbox_f); + + FX_RECT bbox = bbox_f.GetInnerRect(); + if (bbox.Width() <= 0) { + return DrawCosmeticLine( + (FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.left), + (FX_FLOAT)(bbox.bottom + 1), fill_color, FXDIB_BLEND_NORMAL); + } + if (bbox.Height() <= 0) { + return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), + (FX_FLOAT)(bbox.right + 1), (FX_FLOAT)(bbox.top), + fill_color, FXDIB_BLEND_NORMAL); + } + } + int fill_alpha = FXARGB_A(fill_color); + int stroke_alpha = FXARGB_A(stroke_color); + bool bDrawAlpha = (fill_alpha > 0 && fill_alpha < 255) || + (stroke_alpha > 0 && stroke_alpha < 255 && pGraphState); + if (!pPlatform->m_GdiplusExt.IsAvailable() && bDrawAlpha) + return false; + + if (pPlatform->m_GdiplusExt.IsAvailable()) { + if (bDrawAlpha || + ((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) || + (pGraphState && pGraphState->m_DashCount))) { + if (!((!pMatrix || !pMatrix->WillScale()) && pGraphState && + pGraphState->m_LineWidth == 1.f && + (pPathData->GetPoints().size() == 5 || + pPathData->GetPoints().size() == 4) && + pPathData->IsRect())) { + if (pPlatform->m_GdiplusExt.DrawPath(m_hDC, pPathData, pMatrix, + pGraphState, fill_color, + stroke_color, fill_mode)) { + return true; + } + } + } + } + int old_fill_mode = fill_mode; + fill_mode &= 3; + HPEN hPen = nullptr; + HBRUSH hBrush = nullptr; + if (pGraphState && stroke_alpha) { + SetMiterLimit(m_hDC, pGraphState->m_MiterLimit, nullptr); + hPen = CreatePen(pGraphState, pMatrix, stroke_color); + hPen = (HPEN)SelectObject(m_hDC, hPen); + } + if (fill_mode && fill_alpha) { + SetPolyFillMode(m_hDC, fill_mode); + hBrush = CreateBrush(fill_color); + hBrush = (HBRUSH)SelectObject(m_hDC, hBrush); + } + if (pPathData->GetPoints().size() == 2 && pGraphState && + pGraphState->m_DashCount) { + CFX_PointF pos1 = pPathData->GetPoint(0); + CFX_PointF pos2 = pPathData->GetPoint(1); + if (pMatrix) { + pos1 = pMatrix->Transform(pos1); + pos2 = pMatrix->Transform(pos2); + } + DrawLine(pos1.x, pos1.y, pos2.x, pos2.y); + } else { + SetPathToDC(m_hDC, pPathData, pMatrix); + if (pGraphState && stroke_alpha) { + if (fill_mode && fill_alpha) { + if (old_fill_mode & FX_FILL_TEXT_MODE) { + StrokeAndFillPath(m_hDC); + } else { + FillPath(m_hDC); + SetPathToDC(m_hDC, pPathData, pMatrix); + StrokePath(m_hDC); + } + } else { + StrokePath(m_hDC); + } + } else if (fill_mode && fill_alpha) { + FillPath(m_hDC); + } + } + if (hPen) { + hPen = (HPEN)SelectObject(m_hDC, hPen); + DeleteObject(hPen); + } + if (hBrush) { + hBrush = (HBRUSH)SelectObject(m_hDC, hBrush); + DeleteObject(hBrush); + } + return true; +} + +bool CGdiDeviceDriver::FillRectWithBlend(const FX_RECT* pRect, + uint32_t fill_color, + int blend_type) { + if (blend_type != FXDIB_BLEND_NORMAL) + return false; + + int alpha; + FX_COLORREF rgb; + ArgbDecode(fill_color, alpha, rgb); + if (alpha == 0) + return true; + + if (alpha < 255) + return false; + + HBRUSH hBrush = CreateSolidBrush(rgb); + ::FillRect(m_hDC, (RECT*)pRect, hBrush); + DeleteObject(hBrush); + return true; +} + +bool CGdiDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData, + const CFX_Matrix* pMatrix, + int fill_mode) { + if (pPathData->GetPoints().size() == 5) { + CFX_FloatRect rectf; + if (pPathData->IsRect(pMatrix, &rectf)) { + FX_RECT rect = rectf.GetOuterRect(); + IntersectClipRect(m_hDC, rect.left, rect.top, rect.right, rect.bottom); + return true; + } + } + SetPathToDC(m_hDC, pPathData, pMatrix); + SetPolyFillMode(m_hDC, fill_mode & 3); + SelectClipPath(m_hDC, RGN_AND); + return true; +} + +bool CGdiDeviceDriver::SetClip_PathStroke( + const CFX_PathData* pPathData, + const CFX_Matrix* pMatrix, + const CFX_GraphStateData* pGraphState) { + HPEN hPen = CreatePen(pGraphState, pMatrix, 0xff000000); + hPen = (HPEN)SelectObject(m_hDC, hPen); + SetPathToDC(m_hDC, pPathData, pMatrix); + WidenPath(m_hDC); + SetPolyFillMode(m_hDC, WINDING); + bool ret = !!SelectClipPath(m_hDC, RGN_AND); + hPen = (HPEN)SelectObject(m_hDC, hPen); + DeleteObject(hPen); + return ret; +} + +bool CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, + FX_FLOAT y1, + FX_FLOAT x2, + FX_FLOAT y2, + uint32_t color, + int blend_type) { + if (blend_type != FXDIB_BLEND_NORMAL) + return false; + + int a; + FX_COLORREF rgb; + ArgbDecode(color, a, rgb); + if (a == 0) + return true; + + HPEN hPen = CreatePen(PS_SOLID, 1, rgb); + hPen = (HPEN)SelectObject(m_hDC, hPen); + MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), nullptr); + LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2)); + hPen = (HPEN)SelectObject(m_hDC, hPen); + DeleteObject(hPen); + return true; +} + +CGdiDisplayDriver::CGdiDisplayDriver(HDC hDC) + : CGdiDeviceDriver(hDC, FXDC_DISPLAY) { + CWin32Platform* pPlatform = + (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); + if (pPlatform->m_GdiplusExt.IsAvailable()) { + m_RenderCaps |= FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE; + } +} + +CGdiDisplayDriver::~CGdiDisplayDriver() {} + +bool CGdiDisplayDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top) { + bool ret = false; + int width = pBitmap->GetWidth(); + int height = pBitmap->GetHeight(); + HBITMAP hbmp = CreateCompatibleBitmap(m_hDC, width, height); + HDC hDCMemory = CreateCompatibleDC(m_hDC); + HBITMAP holdbmp = (HBITMAP)SelectObject(hDCMemory, hbmp); + BitBlt(hDCMemory, 0, 0, width, height, m_hDC, left, top, SRCCOPY); + SelectObject(hDCMemory, holdbmp); + BITMAPINFO bmi; + FXSYS_memset(&bmi, 0, sizeof bmi); + bmi.bmiHeader.biSize = sizeof bmi.bmiHeader; + bmi.bmiHeader.biBitCount = pBitmap->GetBPP(); + bmi.bmiHeader.biHeight = -height; + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biWidth = width; + if (pBitmap->GetBPP() > 8 && !pBitmap->IsCmykImage()) { + ret = ::GetDIBits(hDCMemory, hbmp, 0, height, pBitmap->GetBuffer(), &bmi, + DIB_RGB_COLORS) == height; + } else { + CFX_DIBitmap bitmap; + if (bitmap.Create(width, height, FXDIB_Rgb)) { + bmi.bmiHeader.biBitCount = 24; + ::GetDIBits(hDCMemory, hbmp, 0, height, bitmap.GetBuffer(), &bmi, + DIB_RGB_COLORS); + ret = pBitmap->TransferBitmap(0, 0, width, height, &bitmap, 0, 0); + } else { + ret = false; + } + } + if (pBitmap->HasAlpha() && ret) + pBitmap->LoadChannel(FXDIB_Alpha, 0xff); + + DeleteObject(hbmp); + DeleteObject(hDCMemory); + return ret; +} + +bool CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource, + uint32_t color, + const FX_RECT* pSrcRect, + int left, + int top, + int blend_type) { + ASSERT(blend_type == FXDIB_BLEND_NORMAL); + if (pSource->IsAlphaMask()) { + int width = pSource->GetWidth(), height = pSource->GetHeight(); + int alpha = FXARGB_A(color); + if (pSource->GetBPP() != 1 || alpha != 255) { + CFX_DIBitmap background; + if (!background.Create(width, height, FXDIB_Rgb32) || + !GetDIBits(&background, left, top) || + !background.CompositeMask(0, 0, width, height, pSource, color, 0, 0, + FXDIB_BLEND_NORMAL, nullptr, false, 0, + nullptr)) { + return false; + } + FX_RECT src_rect(0, 0, width, height); + return SetDIBits(&background, 0, &src_rect, left, top, + FXDIB_BLEND_NORMAL); + } + FX_RECT clip_rect(left, top, left + pSrcRect->Width(), + top + pSrcRect->Height()); + return StretchDIBits(pSource, color, left - pSrcRect->left, + top - pSrcRect->top, width, height, &clip_rect, 0, + FXDIB_BLEND_NORMAL); + } + int width = pSrcRect->Width(), height = pSrcRect->Height(); + if (pSource->HasAlpha()) { + CFX_DIBitmap bitmap; + if (!bitmap.Create(width, height, FXDIB_Rgb) || + !GetDIBits(&bitmap, left, top) || + !bitmap.CompositeBitmap(0, 0, width, height, pSource, pSrcRect->left, + pSrcRect->top, FXDIB_BLEND_NORMAL, nullptr, + false, nullptr)) { + return false; + } + FX_RECT src_rect(0, 0, width, height); + return SetDIBits(&bitmap, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL); + } + CFX_DIBExtractor temp(pSource); + CFX_DIBitmap* pBitmap = temp.GetBitmap(); + if (!pBitmap) + return false; + return GDI_SetDIBits(pBitmap, pSrcRect, left, top); +} + +bool CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource, + uint32_t color, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + int render_flags) { + FX_RECT bitmap_clip = *pClipRect; + if (dest_width < 0) + dest_left += dest_width; + + if (dest_height < 0) + dest_top += dest_height; + + bitmap_clip.Offset(-dest_left, -dest_top); + std::unique_ptr pStretched( + pSource->StretchTo(dest_width, dest_height, render_flags, &bitmap_clip)); + if (!pStretched) + return true; + + FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight()); + return SetDIBits(pStretched.get(), color, &src_rect, pClipRect->left, + pClipRect->top, FXDIB_BLEND_NORMAL); +} + +bool CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource, + uint32_t color, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + uint32_t flags, + int blend_type) { + ASSERT(pSource && pClipRect); + if (flags || dest_width > 10000 || dest_width < -10000 || + dest_height > 10000 || dest_height < -10000) { + return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, + dest_width, dest_height, pClipRect, flags); + } + if (pSource->IsAlphaMask()) { + FX_RECT image_rect; + image_rect.left = dest_width > 0 ? dest_left : dest_left + dest_width; + image_rect.right = dest_width > 0 ? dest_left + dest_width : dest_left; + image_rect.top = dest_height > 0 ? dest_top : dest_top + dest_height; + image_rect.bottom = dest_height > 0 ? dest_top + dest_height : dest_top; + FX_RECT clip_rect = image_rect; + clip_rect.Intersect(*pClipRect); + clip_rect.Offset(-image_rect.left, -image_rect.top); + int clip_width = clip_rect.Width(), clip_height = clip_rect.Height(); + std::unique_ptr pStretched( + pSource->StretchTo(dest_width, dest_height, flags, &clip_rect)); + if (!pStretched) + return true; + + CFX_DIBitmap background; + if (!background.Create(clip_width, clip_height, FXDIB_Rgb32) || + !GetDIBits(&background, image_rect.left + clip_rect.left, + image_rect.top + clip_rect.top) || + !background.CompositeMask( + 0, 0, clip_width, clip_height, pStretched.get(), color, 0, 0, + FXDIB_BLEND_NORMAL, nullptr, false, 0, nullptr)) { + return false; + } + + FX_RECT src_rect(0, 0, clip_width, clip_height); + return SetDIBits(&background, 0, &src_rect, + image_rect.left + clip_rect.left, + image_rect.top + clip_rect.top, FXDIB_BLEND_NORMAL); + } + if (pSource->HasAlpha()) { + CWin32Platform* pPlatform = + (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); + if (pPlatform->m_GdiplusExt.IsAvailable() && !pSource->IsCmykImage()) { + CFX_DIBExtractor temp(pSource); + CFX_DIBitmap* pBitmap = temp.GetBitmap(); + if (!pBitmap) + return false; + return pPlatform->m_GdiplusExt.StretchDIBits( + m_hDC, pBitmap, dest_left, dest_top, dest_width, dest_height, + pClipRect, flags); + } + return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, + dest_width, dest_height, pClipRect, flags); + } + CFX_DIBExtractor temp(pSource); + CFX_DIBitmap* pBitmap = temp.GetBitmap(); + if (!pBitmap) + return false; + return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, + dest_height, flags); +} + +bool CGdiDisplayDriver::StartDIBits(const CFX_DIBSource* pBitmap, + int bitmap_alpha, + uint32_t color, + const CFX_Matrix* pMatrix, + uint32_t render_flags, + void*& handle, + int blend_type) { + return false; +} + +CFX_WindowsDevice::CFX_WindowsDevice(HDC hDC) { + SetDeviceDriver(pdfium::WrapUnique(CreateDriver(hDC))); +} + +CFX_WindowsDevice::~CFX_WindowsDevice() {} + +HDC CFX_WindowsDevice::GetDC() const { + IFX_RenderDeviceDriver* pRDD = GetDeviceDriver(); + return pRDD ? reinterpret_cast(pRDD->GetPlatformSurface()) : nullptr; +} + +// static +IFX_RenderDeviceDriver* CFX_WindowsDevice::CreateDriver(HDC hDC) { + int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY); + int obj_type = ::GetObjectType(hDC); + bool use_printer = device_type == DT_RASPRINTER || + device_type == DT_PLOTTER || obj_type == OBJ_ENHMETADC; + + if (!use_printer) + return new CGdiDisplayDriver(hDC); + + if (g_pdfium_print_postscript_level == 2 || + g_pdfium_print_postscript_level == 3) { + return new CPSPrinterDriver(hDC, g_pdfium_print_postscript_level, false); + } + return new CGdiPrinterDriver(hDC); +} diff --git a/modules/pdfium/pdfium/core/fxge/win32/fx_win32_dib.cpp b/modules/pdfium/pdfium/core/fxge/win32/fx_win32_dib.cpp new file mode 100644 index 000000000000..40c9ca6e3111 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/win32/fx_win32_dib.cpp @@ -0,0 +1,218 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/win32/cfx_windowsdib.h" +#include "core/fxge/win32/win32_int.h" + +CFX_ByteString CFX_WindowsDIB::GetBitmapInfo(const CFX_DIBitmap* pBitmap) { + CFX_ByteString result; + int len = sizeof(BITMAPINFOHEADER); + if (pBitmap->GetBPP() == 1 || pBitmap->GetBPP() == 8) { + len += sizeof(DWORD) * (int)(1 << pBitmap->GetBPP()); + } + BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)result.GetBuffer(len); + FXSYS_memset(pbmih, 0, sizeof(BITMAPINFOHEADER)); + pbmih->biSize = sizeof(BITMAPINFOHEADER); + pbmih->biBitCount = pBitmap->GetBPP(); + pbmih->biCompression = BI_RGB; + pbmih->biHeight = -(int)pBitmap->GetHeight(); + pbmih->biPlanes = 1; + pbmih->biWidth = pBitmap->GetWidth(); + if (pBitmap->GetBPP() == 8) { + uint32_t* pPalette = (uint32_t*)(pbmih + 1); + if (pBitmap->GetPalette()) { + for (int i = 0; i < 256; i++) { + pPalette[i] = pBitmap->GetPalette()[i]; + } + } else { + for (int i = 0; i < 256; i++) { + pPalette[i] = i * 0x010101; + } + } + } + if (pBitmap->GetBPP() == 1) { + uint32_t* pPalette = (uint32_t*)(pbmih + 1); + if (pBitmap->GetPalette()) { + pPalette[0] = pBitmap->GetPalette()[0]; + pPalette[1] = pBitmap->GetPalette()[1]; + } else { + pPalette[0] = 0; + pPalette[1] = 0xffffff; + } + } + result.ReleaseBuffer(len); + return result; +} + +CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, + LPVOID pData, + bool bAlpha) { + int width = pbmi->bmiHeader.biWidth; + int height = pbmi->bmiHeader.biHeight; + BOOL bBottomUp = true; + if (height < 0) { + height = -height; + bBottomUp = false; + } + int pitch = (width * pbmi->bmiHeader.biBitCount + 31) / 32 * 4; + CFX_DIBitmap* pBitmap = new CFX_DIBitmap; + FXDIB_Format format = bAlpha + ? (FXDIB_Format)(pbmi->bmiHeader.biBitCount + 0x200) + : (FXDIB_Format)pbmi->bmiHeader.biBitCount; + bool ret = pBitmap->Create(width, height, format); + if (!ret) { + delete pBitmap; + return nullptr; + } + FXSYS_memcpy(pBitmap->GetBuffer(), pData, pitch * height); + if (bBottomUp) { + uint8_t* temp_buf = FX_Alloc(uint8_t, pitch); + int top = 0, bottom = height - 1; + while (top < bottom) { + FXSYS_memcpy(temp_buf, pBitmap->GetBuffer() + top * pitch, pitch); + FXSYS_memcpy(pBitmap->GetBuffer() + top * pitch, + pBitmap->GetBuffer() + bottom * pitch, pitch); + FXSYS_memcpy(pBitmap->GetBuffer() + bottom * pitch, temp_buf, pitch); + top++; + bottom--; + } + FX_Free(temp_buf); + temp_buf = nullptr; + } + if (pbmi->bmiHeader.biBitCount == 1) { + for (int i = 0; i < 2; i++) { + pBitmap->SetPaletteEntry(i, ((uint32_t*)pbmi->bmiColors)[i] | 0xff000000); + } + } else if (pbmi->bmiHeader.biBitCount == 8) { + for (int i = 0; i < 256; i++) { + pBitmap->SetPaletteEntry(i, ((uint32_t*)pbmi->bmiColors)[i] | 0xff000000); + } + } + return pBitmap; +} + +CFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData) { + return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, false); +} + +HBITMAP CFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC) { + CFX_ByteString info = GetBitmapInfo(pBitmap); + return CreateDIBitmap(hDC, (BITMAPINFOHEADER*)info.c_str(), CBM_INIT, + pBitmap->GetBuffer(), (BITMAPINFO*)info.c_str(), + DIB_RGB_COLORS); +} + +void GetBitmapSize(HBITMAP hBitmap, int& w, int& h) { + BITMAP bmp; + GetObject(hBitmap, sizeof bmp, &bmp); + w = bmp.bmWidth; + h = bmp.bmHeight; +} + +CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(const FX_WCHAR* filename) { + CWin32Platform* pPlatform = + (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); + if (pPlatform->m_GdiplusExt.IsAvailable()) { + WINDIB_Open_Args_ args; + args.flags = WINDIB_OPEN_PATHNAME; + args.path_name = filename; + return pPlatform->m_GdiplusExt.LoadDIBitmap(args); + } + HBITMAP hBitmap = (HBITMAP)LoadImageW(nullptr, (wchar_t*)filename, + IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); + if (!hBitmap) { + return nullptr; + } + HDC hDC = CreateCompatibleDC(nullptr); + int width, height; + GetBitmapSize(hBitmap, width, height); + CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap; + if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) { + delete pDIBitmap; + DeleteDC(hDC); + return nullptr; + } + CFX_ByteString info = GetBitmapInfo(pDIBitmap); + int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), + (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS); + if (!ret) { + delete pDIBitmap; + pDIBitmap = nullptr; + } + DeleteDC(hDC); + return pDIBitmap; +} + +CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(const FX_CHAR* filename) { + return LoadFromFile(CFX_WideString::FromLocal(filename).c_str()); +} + +CFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args) { + CWin32Platform* pPlatform = + (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData(); + if (pPlatform->m_GdiplusExt.IsAvailable()) { + return pPlatform->m_GdiplusExt.LoadDIBitmap(args); + } + if (args.flags == WINDIB_OPEN_MEMORY) { + return nullptr; + } + HBITMAP hBitmap = (HBITMAP)LoadImageW(nullptr, (wchar_t*)args.path_name, + IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); + if (!hBitmap) { + return nullptr; + } + HDC hDC = CreateCompatibleDC(nullptr); + int width, height; + GetBitmapSize(hBitmap, width, height); + CFX_DIBitmap* pDIBitmap = new CFX_DIBitmap; + if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) { + delete pDIBitmap; + DeleteDC(hDC); + return nullptr; + } + CFX_ByteString info = GetBitmapInfo(pDIBitmap); + int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), + (BITMAPINFO*)info.c_str(), DIB_RGB_COLORS); + if (!ret) { + delete pDIBitmap; + pDIBitmap = nullptr; + } + DeleteDC(hDC); + return pDIBitmap; +} + +CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height) { + Create(width, height, FXDIB_Rgb, (uint8_t*)1); + BITMAPINFOHEADER bmih; + FXSYS_memset(&bmih, 0, sizeof bmih); + bmih.biSize = sizeof bmih; + bmih.biBitCount = 24; + bmih.biHeight = -height; + bmih.biPlanes = 1; + bmih.biWidth = width; + m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, + (LPVOID*)&m_pBuffer, nullptr, 0); + m_hMemDC = CreateCompatibleDC(hDC); + m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap); +} + +CFX_WindowsDIB::~CFX_WindowsDIB() { + SelectObject(m_hMemDC, m_hOldBitmap); + DeleteDC(m_hMemDC); + DeleteObject(m_hBitmap); +} + +void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top) { + ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY); +} + +void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top) { + ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY); +} diff --git a/modules/pdfium/pdfium/core/fxge/win32/fx_win32_dwrite.cpp b/modules/pdfium/pdfium/core/fxge/win32/fx_win32_dwrite.cpp new file mode 100644 index 000000000000..dc0f5ed7459f --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/win32/fx_win32_dwrite.cpp @@ -0,0 +1,446 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/ge/cfx_cliprgn.h" +#include "core/fxge/win32/dwrite_int.h" + +typedef HRESULT(__stdcall* FuncType_DWriteCreateFactory)( + __in DWRITE_FACTORY_TYPE, + __in REFIID, + __out IUnknown**); +template +inline void SafeRelease(InterfaceType** currentObject) { + if (*currentObject) { + (*currentObject)->Release(); + *currentObject = nullptr; + } +} +template +inline InterfaceType* SafeAcquire(InterfaceType* newObject) { + if (newObject) { + newObject->AddRef(); + } + return newObject; +} + +class CDwFontFileStream final : public IDWriteFontFileStream { + public: + explicit CDwFontFileStream(void const* fontFileReferenceKey, + UINT32 fontFileReferenceKeySize); + + // IUnknown. + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, + void** ppvObject) override; + ULONG STDMETHODCALLTYPE AddRef() override; + ULONG STDMETHODCALLTYPE Release() override; + + // IDWriteFontFileStream. + HRESULT STDMETHODCALLTYPE + ReadFileFragment(void const** fragmentStart, + UINT64 fileOffset, + UINT64 fragmentSize, + OUT void** fragmentContext) override; + void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext) override; + HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize) override; + HRESULT STDMETHODCALLTYPE + GetLastWriteTime(OUT UINT64* lastWriteTime) override; + + bool IsInitialized() { return !!resourcePtr_; } + + private: + ULONG refCount_; + void const* resourcePtr_; + DWORD resourceSize_; +}; + +class CDwFontFileLoader final : public IDWriteFontFileLoader { + public: + // IUnknown. + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, + void** ppvObject) override; + ULONG STDMETHODCALLTYPE AddRef() override; + ULONG STDMETHODCALLTYPE Release() override; + + // IDWriteFontFileLoader. + HRESULT STDMETHODCALLTYPE + CreateStreamFromKey(void const* fontFileReferenceKey, + UINT32 fontFileReferenceKeySize, + OUT IDWriteFontFileStream** fontFileStream) override; + + static IDWriteFontFileLoader* GetLoader() { + if (!instance_) { + instance_ = new CDwFontFileLoader(); + } + return instance_; + } + static bool IsLoaderInitialized() { return !!instance_; } + + private: + CDwFontFileLoader(); + ULONG refCount_; + static IDWriteFontFileLoader* instance_; +}; + +class CDwFontContext { + public: + explicit CDwFontContext(IDWriteFactory* dwriteFactory); + ~CDwFontContext(); + + HRESULT Initialize(); + + private: + CDwFontContext(CDwFontContext const&); + void operator=(CDwFontContext const&); + HRESULT hr_; + IDWriteFactory* dwriteFactory_; +}; + +class CDwGdiTextRenderer { + public: + CDwGdiTextRenderer(CFX_DIBitmap* pBitmap, + IDWriteBitmapRenderTarget* bitmapRenderTarget, + IDWriteRenderingParams* renderingParams); + ~CDwGdiTextRenderer(); + + HRESULT STDMETHODCALLTYPE DrawGlyphRun(const FX_RECT& text_bbox, + __in_opt CFX_ClipRgn* pClipRgn, + __in_opt DWRITE_MATRIX const* pMatrix, + FLOAT baselineOriginX, + FLOAT baselineOriginY, + DWRITE_MEASURING_MODE measuringMode, + __in DWRITE_GLYPH_RUN const* glyphRun, + const COLORREF& textColor); + + private: + CFX_DIBitmap* pBitmap_; + IDWriteBitmapRenderTarget* pRenderTarget_; + IDWriteRenderingParams* pRenderingParams_; +}; + +CDWriteExt::CDWriteExt() + : m_hModule(nullptr), + m_pDWriteFactory(nullptr), + m_pDwFontContext(nullptr), + m_pDwTextRenderer(nullptr) {} + +void CDWriteExt::Load() {} + +void CDWriteExt::Unload() { + if (m_pDwFontContext) { + delete (CDwFontContext*)m_pDwFontContext; + m_pDwFontContext = nullptr; + } + SafeRelease((IDWriteFactory**)&m_pDWriteFactory); +} + +CDWriteExt::~CDWriteExt() { + Unload(); +} + +LPVOID CDWriteExt::DwCreateFontFaceFromStream(uint8_t* pData, + uint32_t size, + int simulation_style) { + IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory; + IDWriteFontFile* pDwFontFile = nullptr; + IDWriteFontFace* pDwFontFace = nullptr; + BOOL isSupportedFontType = false; + DWRITE_FONT_FILE_TYPE fontFileType; + DWRITE_FONT_FACE_TYPE fontFaceType; + UINT32 numberOfFaces; + DWRITE_FONT_SIMULATIONS fontStyle = + (DWRITE_FONT_SIMULATIONS)(simulation_style & 3); + HRESULT hr = S_OK; + hr = pDwFactory->CreateCustomFontFileReference( + (void const*)pData, (UINT32)size, CDwFontFileLoader::GetLoader(), + &pDwFontFile); + if (FAILED(hr)) { + goto failed; + } + hr = pDwFontFile->Analyze(&isSupportedFontType, &fontFileType, &fontFaceType, + &numberOfFaces); + if (FAILED(hr) || !isSupportedFontType || + fontFaceType == DWRITE_FONT_FACE_TYPE_UNKNOWN) { + goto failed; + } + hr = pDwFactory->CreateFontFace(fontFaceType, 1, &pDwFontFile, 0, fontStyle, + &pDwFontFace); + if (FAILED(hr)) { + goto failed; + } + SafeRelease(&pDwFontFile); + return pDwFontFace; +failed: + SafeRelease(&pDwFontFile); + return nullptr; +} + +bool CDWriteExt::DwCreateRenderingTarget(CFX_DIBitmap* pBitmap, + void** renderTarget) { + if (pBitmap->GetFormat() > FXDIB_Argb) { + return false; + } + IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory; + IDWriteGdiInterop* pGdiInterop = nullptr; + IDWriteBitmapRenderTarget* pBitmapRenderTarget = nullptr; + IDWriteRenderingParams* pRenderingParams = nullptr; + HRESULT hr = S_OK; + hr = pDwFactory->GetGdiInterop(&pGdiInterop); + if (FAILED(hr)) { + goto failed; + } + hr = pGdiInterop->CreateBitmapRenderTarget( + nullptr, pBitmap->GetWidth(), pBitmap->GetHeight(), &pBitmapRenderTarget); + if (FAILED(hr)) { + goto failed; + } + hr = pDwFactory->CreateCustomRenderingParams( + 1.0f, 0.0f, 1.0f, DWRITE_PIXEL_GEOMETRY_RGB, + DWRITE_RENDERING_MODE_DEFAULT, &pRenderingParams); + if (FAILED(hr)) { + goto failed; + } + hr = pBitmapRenderTarget->SetPixelsPerDip(1.0f); + if (FAILED(hr)) { + goto failed; + } + *(CDwGdiTextRenderer**)renderTarget = + new CDwGdiTextRenderer(pBitmap, pBitmapRenderTarget, pRenderingParams); + SafeRelease(&pGdiInterop); + SafeRelease(&pBitmapRenderTarget); + SafeRelease(&pRenderingParams); + return true; +failed: + SafeRelease(&pGdiInterop); + SafeRelease(&pBitmapRenderTarget); + SafeRelease(&pRenderingParams); + return false; +} + +bool CDWriteExt::DwRendingString(void* renderTarget, + CFX_ClipRgn* pClipRgn, + FX_RECT& stringRect, + CFX_Matrix* pMatrix, + void* font, + FX_FLOAT font_size, + FX_ARGB text_color, + int glyph_count, + unsigned short* glyph_indices, + FX_FLOAT baselineOriginX, + FX_FLOAT baselineOriginY, + void* glyph_offsets, + FX_FLOAT* glyph_advances) { + if (!renderTarget) { + return true; + } + CDwGdiTextRenderer* pTextRenderer = (CDwGdiTextRenderer*)renderTarget; + DWRITE_MATRIX transform; + DWRITE_GLYPH_RUN glyphRun; + HRESULT hr = S_OK; + if (pMatrix) { + transform.m11 = pMatrix->a; + transform.m12 = pMatrix->b; + transform.m21 = pMatrix->c; + transform.m22 = pMatrix->d; + transform.dx = pMatrix->e; + transform.dy = pMatrix->f; + } + glyphRun.fontFace = (IDWriteFontFace*)font; + glyphRun.fontEmSize = font_size; + glyphRun.glyphCount = glyph_count; + glyphRun.glyphIndices = glyph_indices; + glyphRun.glyphAdvances = glyph_advances; + glyphRun.glyphOffsets = (DWRITE_GLYPH_OFFSET*)glyph_offsets; + glyphRun.isSideways = false; + glyphRun.bidiLevel = 0; + hr = pTextRenderer->DrawGlyphRun( + stringRect, pClipRgn, pMatrix ? &transform : nullptr, baselineOriginX, + baselineOriginY, DWRITE_MEASURING_MODE_NATURAL, &glyphRun, + RGB(FXARGB_R(text_color), FXARGB_G(text_color), FXARGB_B(text_color))); + return SUCCEEDED(hr); +} + +void CDWriteExt::DwDeleteRenderingTarget(void* renderTarget) { + delete (CDwGdiTextRenderer*)renderTarget; +} + +void CDWriteExt::DwDeleteFont(void* pFont) { + if (pFont) { + SafeRelease((IDWriteFontFace**)&pFont); + } +} + +CDwFontFileStream::CDwFontFileStream(void const* fontFileReferenceKey, + UINT32 fontFileReferenceKeySize) { + refCount_ = 0; + resourcePtr_ = fontFileReferenceKey; + resourceSize_ = fontFileReferenceKeySize; +} + +HRESULT STDMETHODCALLTYPE CDwFontFileStream::QueryInterface(REFIID iid, + void** ppvObject) { + if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) { + *ppvObject = this; + AddRef(); + return S_OK; + } + *ppvObject = nullptr; + return E_NOINTERFACE; +} + +ULONG STDMETHODCALLTYPE CDwFontFileStream::AddRef() { + return InterlockedIncrement((long*)(&refCount_)); +} + +ULONG STDMETHODCALLTYPE CDwFontFileStream::Release() { + ULONG newCount = InterlockedDecrement((long*)(&refCount_)); + if (newCount == 0) { + delete this; + } + return newCount; +} + +HRESULT STDMETHODCALLTYPE +CDwFontFileStream::ReadFileFragment(void const** fragmentStart, + UINT64 fileOffset, + UINT64 fragmentSize, + OUT void** fragmentContext) { + if (fileOffset <= resourceSize_ && + fragmentSize <= resourceSize_ - fileOffset) { + *fragmentStart = static_cast(resourcePtr_) + + static_cast(fileOffset); + *fragmentContext = nullptr; + return S_OK; + } + *fragmentStart = nullptr; + *fragmentContext = nullptr; + return E_FAIL; +} + +void STDMETHODCALLTYPE +CDwFontFileStream::ReleaseFileFragment(void* fragmentContext) {} +HRESULT STDMETHODCALLTYPE CDwFontFileStream::GetFileSize(OUT UINT64* fileSize) { + *fileSize = resourceSize_; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE +CDwFontFileStream::GetLastWriteTime(OUT UINT64* lastWriteTime) { + *lastWriteTime = 0; + return E_NOTIMPL; +} + +IDWriteFontFileLoader* CDwFontFileLoader::instance_ = nullptr; +CDwFontFileLoader::CDwFontFileLoader() : refCount_(0) {} +HRESULT STDMETHODCALLTYPE CDwFontFileLoader::QueryInterface(REFIID iid, + void** ppvObject) { + if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) { + *ppvObject = this; + AddRef(); + return S_OK; + } + *ppvObject = nullptr; + return E_NOINTERFACE; +} + +ULONG STDMETHODCALLTYPE CDwFontFileLoader::AddRef() { + return InterlockedIncrement((long*)(&refCount_)); +} + +ULONG STDMETHODCALLTYPE CDwFontFileLoader::Release() { + ULONG newCount = InterlockedDecrement((long*)(&refCount_)); + if (newCount == 0) { + instance_ = nullptr; + delete this; + } + return newCount; +} + +HRESULT STDMETHODCALLTYPE CDwFontFileLoader::CreateStreamFromKey( + void const* fontFileReferenceKey, + UINT32 fontFileReferenceKeySize, + OUT IDWriteFontFileStream** fontFileStream) { + *fontFileStream = nullptr; + CDwFontFileStream* stream = + new CDwFontFileStream(fontFileReferenceKey, fontFileReferenceKeySize); + if (!stream->IsInitialized()) { + delete stream; + return E_FAIL; + } + *fontFileStream = SafeAcquire(stream); + return S_OK; +} + +CDwFontContext::CDwFontContext(IDWriteFactory* dwriteFactory) + : hr_(S_FALSE), dwriteFactory_(SafeAcquire(dwriteFactory)) {} + +CDwFontContext::~CDwFontContext() { + if (dwriteFactory_ && hr_ == S_OK) { + dwriteFactory_->UnregisterFontFileLoader(CDwFontFileLoader::GetLoader()); + } + SafeRelease(&dwriteFactory_); +} + +HRESULT CDwFontContext::Initialize() { + if (hr_ == S_FALSE) { + return hr_ = dwriteFactory_->RegisterFontFileLoader( + CDwFontFileLoader::GetLoader()); + } + return hr_; +} + +CDwGdiTextRenderer::CDwGdiTextRenderer( + CFX_DIBitmap* pBitmap, + IDWriteBitmapRenderTarget* bitmapRenderTarget, + IDWriteRenderingParams* renderingParams) + : pBitmap_(pBitmap), + pRenderTarget_(SafeAcquire(bitmapRenderTarget)), + pRenderingParams_(SafeAcquire(renderingParams)) {} +CDwGdiTextRenderer::~CDwGdiTextRenderer() { + SafeRelease(&pRenderTarget_); + SafeRelease(&pRenderingParams_); +} + +STDMETHODIMP CDwGdiTextRenderer::DrawGlyphRun( + const FX_RECT& text_bbox, + __in_opt CFX_ClipRgn* pClipRgn, + __in_opt DWRITE_MATRIX const* pMatrix, + FLOAT baselineOriginX, + FLOAT baselineOriginY, + DWRITE_MEASURING_MODE measuringMode, + __in DWRITE_GLYPH_RUN const* glyphRun, + const COLORREF& textColor) { + HRESULT hr = S_OK; + if (pMatrix) { + hr = pRenderTarget_->SetCurrentTransform(pMatrix); + if (FAILED(hr)) { + return hr; + } + } + HDC hDC = pRenderTarget_->GetMemoryDC(); + HBITMAP hBitmap = (HBITMAP)::GetCurrentObject(hDC, OBJ_BITMAP); + BITMAP bitmap; + GetObject(hBitmap, sizeof bitmap, &bitmap); + CFX_DIBitmap dib; + dib.Create(bitmap.bmWidth, bitmap.bmHeight, + bitmap.bmBitsPixel == 24 ? FXDIB_Rgb : FXDIB_Rgb32, + (uint8_t*)bitmap.bmBits); + dib.CompositeBitmap(text_bbox.left, text_bbox.top, text_bbox.Width(), + text_bbox.Height(), pBitmap_, text_bbox.left, + text_bbox.top, FXDIB_BLEND_NORMAL, nullptr); + hr = pRenderTarget_->DrawGlyphRun(baselineOriginX, baselineOriginY, + measuringMode, glyphRun, pRenderingParams_, + textColor); + if (FAILED(hr)) { + return hr; + } + pBitmap_->CompositeBitmap(text_bbox.left, text_bbox.top, text_bbox.Width(), + text_bbox.Height(), &dib, text_bbox.left, + text_bbox.top, FXDIB_BLEND_NORMAL, pClipRgn); + return hr; +} diff --git a/modules/pdfium/pdfium/core/fxge/win32/fx_win32_gdipext.cpp b/modules/pdfium/pdfium/core/fxge/win32/fx_win32_gdipext.cpp new file mode 100644 index 000000000000..d642bdf61341 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/win32/fx_win32_gdipext.cpp @@ -0,0 +1,1521 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#undef WIN32_LEAN_AND_MEAN +#include + +#include +#include + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/win32/cfx_windowsdib.h" +#include "core/fxge/win32/win32_int.h" +#include "third_party/base/ptr_util.h" + +// Has to come before gdiplus.h +namespace Gdiplus { +using std::min; +using std::max; +} // namespace Gdiplus + +#include // NOLINT + +using namespace Gdiplus; // NOLINT +using namespace Gdiplus::DllExports; // NOLINT + +#define GdiFillType2Gdip(fill_type) \ + (fill_type == ALTERNATE ? FillModeAlternate : FillModeWinding) + +enum { + FuncId_GdipCreatePath2, + FuncId_GdipSetPenDashStyle, + FuncId_GdipSetPenDashArray, + FuncId_GdipSetPenDashCap197819, + FuncId_GdipSetPenLineJoin, + FuncId_GdipSetPenWidth, + FuncId_GdipCreateFromHDC, + FuncId_GdipSetPageUnit, + FuncId_GdipSetSmoothingMode, + FuncId_GdipCreateSolidFill, + FuncId_GdipFillPath, + FuncId_GdipDeleteBrush, + FuncId_GdipCreatePen1, + FuncId_GdipSetPenMiterLimit, + FuncId_GdipDrawPath, + FuncId_GdipDeletePen, + FuncId_GdipDeletePath, + FuncId_GdipDeleteGraphics, + FuncId_GdipCreateBitmapFromFileICM, + FuncId_GdipCreateBitmapFromStreamICM, + FuncId_GdipGetImageHeight, + FuncId_GdipGetImageWidth, + FuncId_GdipGetImagePixelFormat, + FuncId_GdipBitmapLockBits, + FuncId_GdipGetImagePaletteSize, + FuncId_GdipGetImagePalette, + FuncId_GdipBitmapUnlockBits, + FuncId_GdipDisposeImage, + FuncId_GdipFillRectangle, + FuncId_GdipCreateBitmapFromScan0, + FuncId_GdipSetImagePalette, + FuncId_GdipSetInterpolationMode, + FuncId_GdipDrawImagePointsI, + FuncId_GdipCreateBitmapFromGdiDib, + FuncId_GdiplusStartup, + FuncId_GdipDrawLineI, + FuncId_GdipResetClip, + FuncId_GdipCreatePath, + FuncId_GdipAddPathPath, + FuncId_GdipSetPathFillMode, + FuncId_GdipSetClipPath, + FuncId_GdipGetClip, + FuncId_GdipCreateRegion, + FuncId_GdipGetClipBoundsI, + FuncId_GdipSetClipRegion, + FuncId_GdipWidenPath, + FuncId_GdipAddPathLine, + FuncId_GdipAddPathRectangle, + FuncId_GdipDeleteRegion, + FuncId_GdipGetDC, + FuncId_GdipReleaseDC, + FuncId_GdipSetPenLineCap197819, + FuncId_GdipSetPenDashOffset, + FuncId_GdipResetPath, + FuncId_GdipCreateRegionPath, + FuncId_GdipCreateFont, + FuncId_GdipGetFontSize, + FuncId_GdipCreateFontFamilyFromName, + FuncId_GdipSetTextRenderingHint, + FuncId_GdipDrawDriverString, + FuncId_GdipCreateMatrix2, + FuncId_GdipDeleteMatrix, + FuncId_GdipSetWorldTransform, + FuncId_GdipResetWorldTransform, + FuncId_GdipDeleteFontFamily, + FuncId_GdipDeleteFont, + FuncId_GdipNewPrivateFontCollection, + FuncId_GdipDeletePrivateFontCollection, + FuncId_GdipPrivateAddMemoryFont, + FuncId_GdipGetFontCollectionFamilyList, + FuncId_GdipGetFontCollectionFamilyCount, + FuncId_GdipSetTextContrast, + FuncId_GdipSetPixelOffsetMode, + FuncId_GdipGetImageGraphicsContext, + FuncId_GdipDrawImageI, + FuncId_GdipDrawImageRectI, + FuncId_GdipDrawString, + FuncId_GdipSetPenTransform, +}; +static LPCSTR g_GdipFuncNames[] = { + "GdipCreatePath2", + "GdipSetPenDashStyle", + "GdipSetPenDashArray", + "GdipSetPenDashCap197819", + "GdipSetPenLineJoin", + "GdipSetPenWidth", + "GdipCreateFromHDC", + "GdipSetPageUnit", + "GdipSetSmoothingMode", + "GdipCreateSolidFill", + "GdipFillPath", + "GdipDeleteBrush", + "GdipCreatePen1", + "GdipSetPenMiterLimit", + "GdipDrawPath", + "GdipDeletePen", + "GdipDeletePath", + "GdipDeleteGraphics", + "GdipCreateBitmapFromFileICM", + "GdipCreateBitmapFromStreamICM", + "GdipGetImageHeight", + "GdipGetImageWidth", + "GdipGetImagePixelFormat", + "GdipBitmapLockBits", + "GdipGetImagePaletteSize", + "GdipGetImagePalette", + "GdipBitmapUnlockBits", + "GdipDisposeImage", + "GdipFillRectangle", + "GdipCreateBitmapFromScan0", + "GdipSetImagePalette", + "GdipSetInterpolationMode", + "GdipDrawImagePointsI", + "GdipCreateBitmapFromGdiDib", + "GdiplusStartup", + "GdipDrawLineI", + "GdipResetClip", + "GdipCreatePath", + "GdipAddPathPath", + "GdipSetPathFillMode", + "GdipSetClipPath", + "GdipGetClip", + "GdipCreateRegion", + "GdipGetClipBoundsI", + "GdipSetClipRegion", + "GdipWidenPath", + "GdipAddPathLine", + "GdipAddPathRectangle", + "GdipDeleteRegion", + "GdipGetDC", + "GdipReleaseDC", + "GdipSetPenLineCap197819", + "GdipSetPenDashOffset", + "GdipResetPath", + "GdipCreateRegionPath", + "GdipCreateFont", + "GdipGetFontSize", + "GdipCreateFontFamilyFromName", + "GdipSetTextRenderingHint", + "GdipDrawDriverString", + "GdipCreateMatrix2", + "GdipDeleteMatrix", + "GdipSetWorldTransform", + "GdipResetWorldTransform", + "GdipDeleteFontFamily", + "GdipDeleteFont", + "GdipNewPrivateFontCollection", + "GdipDeletePrivateFontCollection", + "GdipPrivateAddMemoryFont", + "GdipGetFontCollectionFamilyList", + "GdipGetFontCollectionFamilyCount", + "GdipSetTextContrast", + "GdipSetPixelOffsetMode", + "GdipGetImageGraphicsContext", + "GdipDrawImageI", + "GdipDrawImageRectI", + "GdipDrawString", + "GdipSetPenTransform", +}; +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreatePath2)(GDIPCONST GpPointF*, + GDIPCONST BYTE*, + INT, + GpFillMode, + GpPath** path); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenDashStyle)( + GpPen* pen, + GpDashStyle dashstyle); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenDashArray)(GpPen* pen, + GDIPCONST REAL* dash, + INT count); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenDashCap197819)( + GpPen* pen, + GpDashCap dashCap); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenLineJoin)(GpPen* pen, + GpLineJoin lineJoin); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenWidth)(GpPen* pen, REAL width); +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateFromHDC)(HDC hdc, + GpGraphics** graphics); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPageUnit)(GpGraphics* graphics, + GpUnit unit); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetSmoothingMode)( + GpGraphics* graphics, + SmoothingMode smoothingMode); +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateSolidFill)(ARGB color, + GpSolidFill** brush); +typedef GpStatus(WINGDIPAPI* FuncType_GdipFillPath)(GpGraphics* graphics, + GpBrush* brush, + GpPath* path); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeleteBrush)(GpBrush* brush); +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreatePen1)(ARGB color, + REAL width, + GpUnit unit, + GpPen** pen); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenMiterLimit)(GpPen* pen, + REAL miterLimit); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawPath)(GpGraphics* graphics, + GpPen* pen, + GpPath* path); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeletePen)(GpPen* pen); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeletePath)(GpPath* path); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeleteGraphics)(GpGraphics* graphics); +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateBitmapFromFileICM)( + GDIPCONST WCHAR* filename, + GpBitmap** bitmap); +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateBitmapFromStreamICM)( + IStream* stream, + GpBitmap** bitmap); +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetImageWidth)(GpImage* image, + UINT* width); +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetImageHeight)(GpImage* image, + UINT* height); +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetImagePixelFormat)( + GpImage* image, + PixelFormat* format); +typedef GpStatus(WINGDIPAPI* FuncType_GdipBitmapLockBits)( + GpBitmap* bitmap, + GDIPCONST GpRect* rect, + UINT flags, + PixelFormat format, + BitmapData* lockedBitmapData); +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetImagePalette)( + GpImage* image, + ColorPalette* palette, + INT size); +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetImagePaletteSize)(GpImage* image, + INT* size); +typedef GpStatus(WINGDIPAPI* FuncType_GdipBitmapUnlockBits)( + GpBitmap* bitmap, + BitmapData* lockedBitmapData); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDisposeImage)(GpImage* image); +typedef GpStatus(WINGDIPAPI* FuncType_GdipFillRectangle)(GpGraphics* graphics, + GpBrush* brush, + REAL x, + REAL y, + REAL width, + REAL height); +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateBitmapFromScan0)( + INT width, + INT height, + INT stride, + PixelFormat format, + BYTE* scan0, + GpBitmap** bitmap); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetImagePalette)( + GpImage* image, + GDIPCONST ColorPalette* palette); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetInterpolationMode)( + GpGraphics* graphics, + InterpolationMode interpolationMode); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawImagePointsI)( + GpGraphics* graphics, + GpImage* image, + GDIPCONST GpPoint* dstpoints, + INT count); +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateBitmapFromGdiDib)( + GDIPCONST BITMAPINFO* gdiBitmapInfo, + VOID* gdiBitmapData, + GpBitmap** bitmap); +typedef Status(WINAPI* FuncType_GdiplusStartup)( + OUT uintptr_t* token, + const GdiplusStartupInput* input, + OUT GdiplusStartupOutput* output); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawLineI)(GpGraphics* graphics, + GpPen* pen, + int x1, + int y1, + int x2, + int y2); +typedef GpStatus(WINGDIPAPI* FuncType_GdipResetClip)(GpGraphics* graphics); +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreatePath)(GpFillMode brushMode, + GpPath** path); +typedef GpStatus(WINGDIPAPI* FuncType_GdipAddPathPath)( + GpPath* path, + GDIPCONST GpPath* addingPath, + BOOL connect); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPathFillMode)(GpPath* path, + GpFillMode fillmode); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetClipPath)(GpGraphics* graphics, + GpPath* path, + CombineMode combineMode); +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetClip)(GpGraphics* graphics, + GpRegion* region); +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateRegion)(GpRegion** region); +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetClipBoundsI)(GpGraphics* graphics, + GpRect* rect); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetClipRegion)( + GpGraphics* graphics, + GpRegion* region, + CombineMode combineMode); +typedef GpStatus(WINGDIPAPI* FuncType_GdipWidenPath)(GpPath* nativePath, + GpPen* pen, + GpMatrix* matrix, + REAL flatness); +typedef GpStatus(WINGDIPAPI* FuncType_GdipAddPathLine)(GpPath* path, + REAL x1, + REAL y1, + REAL x2, + REAL y2); +typedef GpStatus(WINGDIPAPI* FuncType_GdipAddPathRectangle)(GpPath* path, + REAL x, + REAL y, + REAL width, + REAL height); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeleteRegion)(GpRegion* region); +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetDC)(GpGraphics* graphics, + HDC* hdc); +typedef GpStatus(WINGDIPAPI* FuncType_GdipReleaseDC)(GpGraphics* graphics, + HDC hdc); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenLineCap197819)( + GpPen* pen, + GpLineCap startCap, + GpLineCap endCap, + GpDashCap dashCap); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenDashOffset)(GpPen* pen, + REAL offset); +typedef GpStatus(WINGDIPAPI* FuncType_GdipResetPath)(GpPath* path); +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateRegionPath)(GpPath* path, + GpRegion** region); +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateFont)( + GDIPCONST GpFontFamily* fontFamily, + REAL emSize, + INT style, + Unit unit, + GpFont** font); +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetFontSize)(GpFont* font, + REAL* size); +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateFontFamilyFromName)( + GDIPCONST WCHAR* name, + GpFontCollection* fontCollection, + GpFontFamily** FontFamily); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetTextRenderingHint)( + GpGraphics* graphics, + TextRenderingHint mode); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawDriverString)( + GpGraphics* graphics, + GDIPCONST UINT16* text, + INT length, + GDIPCONST GpFont* font, + GDIPCONST GpBrush* brush, + GDIPCONST PointF* positions, + INT flags, + GDIPCONST GpMatrix* matrix); +typedef GpStatus(WINGDIPAPI* FuncType_GdipCreateMatrix2)(REAL m11, + REAL m12, + REAL m21, + REAL m22, + REAL dx, + REAL dy, + GpMatrix** matrix); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeleteMatrix)(GpMatrix* matrix); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetWorldTransform)( + GpGraphics* graphics, + GpMatrix* matrix); +typedef GpStatus(WINGDIPAPI* FuncType_GdipResetWorldTransform)( + GpGraphics* graphics); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeleteFontFamily)( + GpFontFamily* FontFamily); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeleteFont)(GpFont* font); +typedef GpStatus(WINGDIPAPI* FuncType_GdipNewPrivateFontCollection)( + GpFontCollection** fontCollection); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDeletePrivateFontCollection)( + GpFontCollection** fontCollection); +typedef GpStatus(WINGDIPAPI* FuncType_GdipPrivateAddMemoryFont)( + GpFontCollection* fontCollection, + GDIPCONST void* memory, + INT length); +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetFontCollectionFamilyList)( + GpFontCollection* fontCollection, + INT numSought, + GpFontFamily* gpfamilies[], + INT* numFound); +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetFontCollectionFamilyCount)( + GpFontCollection* fontCollection, + INT* numFound); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetTextContrast)(GpGraphics* graphics, + UINT contrast); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPixelOffsetMode)( + GpGraphics* graphics, + PixelOffsetMode pixelOffsetMode); +typedef GpStatus(WINGDIPAPI* FuncType_GdipGetImageGraphicsContext)( + GpImage* image, + GpGraphics** graphics); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawImageI)(GpGraphics* graphics, + GpImage* image, + INT x, + INT y); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawImageRectI)(GpGraphics* graphics, + GpImage* image, + INT x, + INT y, + INT width, + INT height); +typedef GpStatus(WINGDIPAPI* FuncType_GdipDrawString)( + GpGraphics* graphics, + GDIPCONST WCHAR* str, + INT length, + GDIPCONST GpFont* font, + GDIPCONST RectF* layoutRect, + GDIPCONST GpStringFormat* stringFormat, + GDIPCONST GpBrush* brush); +typedef GpStatus(WINGDIPAPI* FuncType_GdipSetPenTransform)(GpPen* pen, + GpMatrix* matrix); +#define CallFunc(funcname) \ + ((FuncType_##funcname)GdiplusExt.m_Functions[FuncId_##funcname]) + +void* CGdiplusExt::GdiAddFontMemResourceEx(void* pFontdata, + uint32_t size, + void* pdv, + uint32_t* num_face) { + if (!m_pGdiAddFontMemResourceEx) + return nullptr; + + return m_pGdiAddFontMemResourceEx((PVOID)pFontdata, (DWORD)size, (PVOID)pdv, + (DWORD*)num_face); +} + +bool CGdiplusExt::GdiRemoveFontMemResourceEx(void* handle) { + return m_pGdiRemoveFontMemResourseEx && + m_pGdiRemoveFontMemResourseEx((HANDLE)handle); +} + +static GpBrush* _GdipCreateBrush(DWORD argb) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + GpSolidFill* solidBrush = nullptr; + CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush); + return solidBrush; +} + +static std::unique_ptr StretchMonoToGray( + int dest_width, + int dest_height, + const CFX_DIBitmap* pSource, + FX_RECT* pClipRect) { + bool bFlipX = dest_width < 0; + if (bFlipX) + dest_width = -dest_width; + + bool bFlipY = dest_height < 0; + if (bFlipY) + dest_height = -dest_height; + + int result_width = pClipRect->Width(); + int result_height = pClipRect->Height(); + int result_pitch = (result_width + 3) / 4 * 4; + auto pStretched = pdfium::MakeUnique(); + if (!pStretched->Create(result_width, result_height, FXDIB_8bppRgb)) + return nullptr; + + LPBYTE dest_buf = pStretched->GetBuffer(); + int src_width = pSource->GetWidth(); + int src_height = pSource->GetHeight(); + int y_unit = src_height / dest_height; + int x_unit = src_width / dest_width; + int area_unit = y_unit * x_unit; + LPBYTE src_buf = pSource->GetBuffer(); + int src_pitch = pSource->GetPitch(); + for (int dest_y = 0; dest_y < result_height; dest_y++) { + LPBYTE dest_scan = dest_buf + dest_y * result_pitch; + int src_y_start = bFlipY ? (dest_height - 1 - dest_y - pClipRect->top) + : (dest_y + pClipRect->top); + src_y_start = src_y_start * src_height / dest_height; + LPBYTE src_scan = src_buf + src_y_start * src_pitch; + for (int dest_x = 0; dest_x < result_width; dest_x++) { + int sum = 0; + int src_x_start = bFlipX ? (dest_width - 1 - dest_x - pClipRect->left) + : (dest_x + pClipRect->left); + src_x_start = src_x_start * src_width / dest_width; + int src_x_end = src_x_start + x_unit; + LPBYTE src_line = src_scan; + for (int src_y = 0; src_y < y_unit; src_y++) { + for (int src_x = src_x_start; src_x < src_x_end; src_x++) { + if (!(src_line[src_x / 8] & (1 << (7 - src_x % 8)))) { + sum += 255; + } + } + src_line += src_pitch; + } + dest_scan[dest_x] = 255 - sum / area_unit; + } + } + return pStretched; +} + +static void OutputImageMask(GpGraphics* pGraphics, + BOOL bMonoDevice, + const CFX_DIBitmap* pBitmap, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + FX_ARGB argb, + const FX_RECT* pClipRect) { + ASSERT(pBitmap->GetBPP() == 1); + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + int src_width = pBitmap->GetWidth(), src_height = pBitmap->GetHeight(); + int src_pitch = pBitmap->GetPitch(); + uint8_t* scan0 = pBitmap->GetBuffer(); + if (src_width == 1 && src_height == 1) { + if ((scan0[0] & 0x80) == 0) { + return; + } + GpSolidFill* solidBrush; + CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush); + if (dest_width < 0) { + dest_width = -dest_width; + dest_left -= dest_width; + } + if (dest_height < 0) { + dest_height = -dest_height; + dest_top -= dest_height; + } + CallFunc(GdipFillRectangle)(pGraphics, solidBrush, (float)dest_left, + (float)dest_top, (float)dest_width, + (float)dest_height); + CallFunc(GdipDeleteBrush)(solidBrush); + return; + } + if (!bMonoDevice && abs(dest_width) < src_width && + abs(dest_height) < src_height) { + FX_RECT image_rect(dest_left, dest_top, dest_left + dest_width, + dest_top + dest_height); + image_rect.Normalize(); + FX_RECT image_clip = image_rect; + image_clip.Intersect(*pClipRect); + if (image_clip.IsEmpty()) { + return; + } + image_clip.Offset(-image_rect.left, -image_rect.top); + std::unique_ptr pStretched; + if (src_width * src_height > 10000) { + pStretched = + StretchMonoToGray(dest_width, dest_height, pBitmap, &image_clip); + } else { + pStretched = + pBitmap->StretchTo(dest_width, dest_height, false, &image_clip); + } + GpBitmap* bitmap; + CallFunc(GdipCreateBitmapFromScan0)(image_clip.Width(), image_clip.Height(), + (image_clip.Width() + 3) / 4 * 4, + PixelFormat8bppIndexed, + pStretched->GetBuffer(), &bitmap); + int a, r, g, b; + ArgbDecode(argb, a, r, g, b); + UINT pal[258]; + pal[0] = 0; + pal[1] = 256; + for (int i = 0; i < 256; i++) { + pal[i + 2] = ArgbEncode(i * a / 255, r, g, b); + } + CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal); + CallFunc(GdipDrawImageI)(pGraphics, bitmap, + image_rect.left + image_clip.left, + image_rect.top + image_clip.top); + CallFunc(GdipDisposeImage)(bitmap); + return; + } + GpBitmap* bitmap; + CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch, + PixelFormat1bppIndexed, scan0, &bitmap); + UINT palette[4] = {PaletteFlagsHasAlpha, 2, 0, argb}; + CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)palette); + Point destinationPoints[] = {Point(dest_left, dest_top), + Point(dest_left + dest_width, dest_top), + Point(dest_left, dest_top + dest_height)}; + CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3); + CallFunc(GdipDisposeImage)(bitmap); +} +static void OutputImage(GpGraphics* pGraphics, + const CFX_DIBitmap* pBitmap, + const FX_RECT* pSrcRect, + int dest_left, + int dest_top, + int dest_width, + int dest_height) { + int src_width = pSrcRect->Width(), src_height = pSrcRect->Height(); + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + if (pBitmap->GetBPP() == 1 && (pSrcRect->left % 8)) { + FX_RECT new_rect(0, 0, src_width, src_height); + std::unique_ptr pCloned = pBitmap->Clone(pSrcRect); + if (!pCloned) + return; + OutputImage(pGraphics, pCloned.get(), &new_rect, dest_left, dest_top, + dest_width, dest_height); + return; + } + int src_pitch = pBitmap->GetPitch(); + uint8_t* scan0 = pBitmap->GetBuffer() + pSrcRect->top * src_pitch + + pBitmap->GetBPP() * pSrcRect->left / 8; + GpBitmap* bitmap = nullptr; + switch (pBitmap->GetFormat()) { + case FXDIB_Argb: + CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch, + PixelFormat32bppARGB, scan0, &bitmap); + break; + case FXDIB_Rgb32: + CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch, + PixelFormat32bppRGB, scan0, &bitmap); + break; + case FXDIB_Rgb: + CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch, + PixelFormat24bppRGB, scan0, &bitmap); + break; + case FXDIB_8bppRgb: { + CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch, + PixelFormat8bppIndexed, scan0, + &bitmap); + UINT pal[258]; + pal[0] = 0; + pal[1] = 256; + for (int i = 0; i < 256; i++) { + pal[i + 2] = pBitmap->GetPaletteEntry(i); + } + CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal); + break; + } + case FXDIB_1bppRgb: { + CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch, + PixelFormat1bppIndexed, scan0, + &bitmap); + break; + } + } + if (dest_height < 0) { + dest_height--; + } + if (dest_width < 0) { + dest_width--; + } + Point destinationPoints[] = {Point(dest_left, dest_top), + Point(dest_left + dest_width, dest_top), + Point(dest_left, dest_top + dest_height)}; + CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3); + CallFunc(GdipDisposeImage)(bitmap); +} +CGdiplusExt::CGdiplusExt() { + m_hModule = nullptr; + m_GdiModule = nullptr; + for (size_t i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i++) { + m_Functions[i] = nullptr; + } + m_pGdiAddFontMemResourceEx = nullptr; + m_pGdiRemoveFontMemResourseEx = nullptr; +} +void CGdiplusExt::Load() { + CFX_ByteString strPlusPath = ""; + FX_CHAR buf[MAX_PATH]; + GetSystemDirectoryA(buf, MAX_PATH); + strPlusPath += buf; + strPlusPath += "\\"; + strPlusPath += "GDIPLUS.DLL"; + m_hModule = LoadLibraryA(strPlusPath.c_str()); + if (!m_hModule) { + return; + } + for (size_t i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i++) { + m_Functions[i] = GetProcAddress(m_hModule, g_GdipFuncNames[i]); + if (!m_Functions[i]) { + m_hModule = nullptr; + return; + } + } + uintptr_t gdiplusToken; + GdiplusStartupInput gdiplusStartupInput; + ((FuncType_GdiplusStartup)m_Functions[FuncId_GdiplusStartup])( + &gdiplusToken, &gdiplusStartupInput, nullptr); + m_GdiModule = LoadLibraryA("GDI32.DLL"); + if (!m_GdiModule) { + return; + } + m_pGdiAddFontMemResourceEx = + reinterpret_cast( + GetProcAddress(m_GdiModule, "AddFontMemResourceEx")); + m_pGdiRemoveFontMemResourseEx = + reinterpret_cast( + GetProcAddress(m_GdiModule, "RemoveFontMemResourceEx")); +} +CGdiplusExt::~CGdiplusExt() {} +LPVOID CGdiplusExt::LoadMemFont(LPBYTE pData, uint32_t size) { + GpFontCollection* pCollection = nullptr; + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipNewPrivateFontCollection)(&pCollection); + GpStatus status = + CallFunc(GdipPrivateAddMemoryFont)(pCollection, pData, size); + if (status == Ok) { + return pCollection; + } + CallFunc(GdipDeletePrivateFontCollection)(&pCollection); + return nullptr; +} +void CGdiplusExt::DeleteMemFont(LPVOID pCollection) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipDeletePrivateFontCollection)((GpFontCollection**)&pCollection); +} +bool CGdiplusExt::GdipCreateBitmap(CFX_DIBitmap* pBitmap, void** bitmap) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + PixelFormat format; + switch (pBitmap->GetFormat()) { + case FXDIB_Rgb: + format = PixelFormat24bppRGB; + break; + case FXDIB_Rgb32: + format = PixelFormat32bppRGB; + break; + case FXDIB_Argb: + format = PixelFormat32bppARGB; + break; + default: + return false; + } + GpStatus status = CallFunc(GdipCreateBitmapFromScan0)( + pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap->GetPitch(), format, + pBitmap->GetBuffer(), (GpBitmap**)bitmap); + if (status == Ok) { + return true; + } + return false; +} +bool CGdiplusExt::GdipCreateFromImage(void* bitmap, void** graphics) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + GpStatus status = CallFunc(GdipGetImageGraphicsContext)( + (GpBitmap*)bitmap, (GpGraphics**)graphics); + if (status == Ok) { + return true; + } + return false; +} +bool CGdiplusExt::GdipCreateFontFamilyFromName(const FX_WCHAR* name, + void* pFontCollection, + void** pFamily) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + GpStatus status = CallFunc(GdipCreateFontFamilyFromName)( + (GDIPCONST WCHAR*)name, (GpFontCollection*)pFontCollection, + (GpFontFamily**)pFamily); + if (status == Ok) { + return true; + } + return false; +} +bool CGdiplusExt::GdipCreateFontFromFamily(void* pFamily, + FX_FLOAT font_size, + int fontstyle, + int flag, + void** pFont) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + GpStatus status = + CallFunc(GdipCreateFont)((GpFontFamily*)pFamily, font_size, fontstyle, + Unit(flag), (GpFont**)pFont); + if (status == Ok) { + return true; + } + return false; +} +void CGdiplusExt::GdipGetFontSize(void* pFont, FX_FLOAT* size) { + REAL get_size; + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + GpStatus status = CallFunc(GdipGetFontSize)((GpFont*)pFont, (REAL*)&get_size); + if (status == Ok) { + *size = (FX_FLOAT)get_size; + } else { + *size = 0; + } +} +void CGdiplusExt::GdipSetTextRenderingHint(void* graphics, int mode) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipSetTextRenderingHint)((GpGraphics*)graphics, + (TextRenderingHint)mode); +} +void CGdiplusExt::GdipSetPageUnit(void* graphics, uint32_t unit) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipSetPageUnit)((GpGraphics*)graphics, (GpUnit)unit); +} +bool CGdiplusExt::GdipDrawDriverString(void* graphics, + unsigned short* text, + int length, + void* font, + void* brush, + void* positions, + int flags, + const void* matrix) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + GpStatus status = CallFunc(GdipDrawDriverString)( + (GpGraphics*)graphics, (GDIPCONST UINT16*)text, (INT)length, + (GDIPCONST GpFont*)font, (GDIPCONST GpBrush*)brush, + (GDIPCONST PointF*)positions, (INT)flags, (GDIPCONST GpMatrix*)matrix); + if (status == Ok) { + return true; + } + return false; +} +void CGdiplusExt::GdipCreateBrush(uint32_t fill_argb, void** pBrush) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipCreateSolidFill)((ARGB)fill_argb, (GpSolidFill**)pBrush); +} +void CGdiplusExt::GdipDeleteBrush(void* pBrush) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipDeleteBrush)((GpSolidFill*)pBrush); +} +void* CGdiplusExt::GdipCreateFontFromCollection(void* pFontCollection, + FX_FLOAT font_size, + int fontstyle) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + int numFamilies = 0; + GpStatus status = CallFunc(GdipGetFontCollectionFamilyCount)( + (GpFontCollection*)pFontCollection, &numFamilies); + if (status != Ok) { + return nullptr; + } + GpFontFamily* family_list[1]; + status = CallFunc(GdipGetFontCollectionFamilyList)( + (GpFontCollection*)pFontCollection, 1, family_list, &numFamilies); + if (status != Ok) { + return nullptr; + } + GpFont* pFont = nullptr; + status = CallFunc(GdipCreateFont)(family_list[0], font_size, fontstyle, + UnitPixel, &pFont); + if (status != Ok) { + return nullptr; + } + return pFont; +} +void CGdiplusExt::GdipCreateMatrix(FX_FLOAT a, + FX_FLOAT b, + FX_FLOAT c, + FX_FLOAT d, + FX_FLOAT e, + FX_FLOAT f, + void** matrix) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipCreateMatrix2)(a, b, c, d, e, f, (GpMatrix**)matrix); +} +void CGdiplusExt::GdipDeleteMatrix(void* matrix) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipDeleteMatrix)((GpMatrix*)matrix); +} +void CGdiplusExt::GdipDeleteFontFamily(void* pFamily) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipDeleteFontFamily)((GpFontFamily*)pFamily); +} +void CGdiplusExt::GdipDeleteFont(void* pFont) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipDeleteFont)((GpFont*)pFont); +} +void CGdiplusExt::GdipSetWorldTransform(void* graphics, void* pMatrix) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipSetWorldTransform)((GpGraphics*)graphics, (GpMatrix*)pMatrix); +} +void CGdiplusExt::GdipDisposeImage(void* bitmap) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipDisposeImage)((GpBitmap*)bitmap); +} +void CGdiplusExt::GdipDeleteGraphics(void* graphics) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipDeleteGraphics)((GpGraphics*)graphics); +} +bool CGdiplusExt::StretchBitMask(HDC hDC, + BOOL bMonoDevice, + const CFX_DIBitmap* pBitmap, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + uint32_t argb, + const FX_RECT* pClipRect, + int flags) { + ASSERT(pBitmap->GetBPP() == 1); + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + GpGraphics* pGraphics = nullptr; + CallFunc(GdipCreateFromHDC)(hDC, &pGraphics); + CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel); + if (flags & FXDIB_NOSMOOTH) { + CallFunc(GdipSetInterpolationMode)(pGraphics, + InterpolationModeNearestNeighbor); + } else { + CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality); + } + OutputImageMask(pGraphics, bMonoDevice, pBitmap, dest_left, dest_top, + dest_width, dest_height, argb, pClipRect); + CallFunc(GdipDeleteGraphics)(pGraphics); + return true; +} +bool CGdiplusExt::StretchDIBits(HDC hDC, + const CFX_DIBitmap* pBitmap, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + int flags) { + GpGraphics* pGraphics; + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipCreateFromHDC)(hDC, &pGraphics); + CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel); + if (flags & FXDIB_NOSMOOTH) { + CallFunc(GdipSetInterpolationMode)(pGraphics, + InterpolationModeNearestNeighbor); + } else if (pBitmap->GetWidth() > abs(dest_width) / 2 || + pBitmap->GetHeight() > abs(dest_height) / 2) { + CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality); + } else { + CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeBilinear); + } + FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()); + OutputImage(pGraphics, pBitmap, &src_rect, dest_left, dest_top, dest_width, + dest_height); + CallFunc(GdipDeleteGraphics)(pGraphics); + CallFunc(GdipDeleteGraphics)(pGraphics); + return true; +} +static GpPen* _GdipCreatePen(const CFX_GraphStateData* pGraphState, + const CFX_Matrix* pMatrix, + DWORD argb, + bool bTextMode = false) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + FX_FLOAT width = pGraphState ? pGraphState->m_LineWidth : 1.0f; + if (!bTextMode) { + FX_FLOAT unit = + pMatrix ? 1.0f / ((pMatrix->GetXUnit() + pMatrix->GetYUnit()) / 2) + : 1.0f; + if (width < unit) { + width = unit; + } + } + GpPen* pPen = nullptr; + CallFunc(GdipCreatePen1)((ARGB)argb, width, UnitWorld, &pPen); + LineCap lineCap = LineCapFlat; + DashCap dashCap = DashCapFlat; + bool bDashExtend = false; + switch (pGraphState->m_LineCap) { + case CFX_GraphStateData::LineCapButt: + lineCap = LineCapFlat; + break; + case CFX_GraphStateData::LineCapRound: + lineCap = LineCapRound; + dashCap = DashCapRound; + bDashExtend = true; + break; + case CFX_GraphStateData::LineCapSquare: + lineCap = LineCapSquare; + bDashExtend = true; + break; + } + CallFunc(GdipSetPenLineCap197819)(pPen, lineCap, lineCap, dashCap); + LineJoin lineJoin = LineJoinMiterClipped; + switch (pGraphState->m_LineJoin) { + case CFX_GraphStateData::LineJoinMiter: + lineJoin = LineJoinMiterClipped; + break; + case CFX_GraphStateData::LineJoinRound: + lineJoin = LineJoinRound; + break; + case CFX_GraphStateData::LineJoinBevel: + lineJoin = LineJoinBevel; + break; + } + CallFunc(GdipSetPenLineJoin)(pPen, lineJoin); + if (pGraphState->m_DashCount) { + FX_FLOAT* pDashArray = FX_Alloc( + FX_FLOAT, pGraphState->m_DashCount + pGraphState->m_DashCount % 2); + int nCount = 0; + FX_FLOAT on_leftover = 0, off_leftover = 0; + for (int i = 0; i < pGraphState->m_DashCount; i += 2) { + FX_FLOAT on_phase = pGraphState->m_DashArray[i]; + FX_FLOAT off_phase; + if (i == pGraphState->m_DashCount - 1) { + off_phase = on_phase; + } else { + off_phase = pGraphState->m_DashArray[i + 1]; + } + on_phase /= width; + off_phase /= width; + if (on_phase + off_phase <= 0.00002f) { + on_phase = 1.0f / 10; + off_phase = 1.0f / 10; + } + if (bDashExtend) { + if (off_phase < 1) { + off_phase = 0; + } else { + off_phase -= 1; + } + on_phase += 1; + } + if (on_phase == 0 || off_phase == 0) { + if (nCount == 0) { + on_leftover += on_phase; + off_leftover += off_phase; + } else { + pDashArray[nCount - 2] += on_phase; + pDashArray[nCount - 1] += off_phase; + } + } else { + pDashArray[nCount++] = on_phase + on_leftover; + on_leftover = 0; + pDashArray[nCount++] = off_phase + off_leftover; + off_leftover = 0; + } + } + CallFunc(GdipSetPenDashArray)(pPen, pDashArray, nCount); + FX_FLOAT phase = pGraphState->m_DashPhase; + if (bDashExtend) { + if (phase < 0.5f) { + phase = 0; + } else { + phase -= 0.5f; + } + } + CallFunc(GdipSetPenDashOffset)(pPen, phase); + FX_Free(pDashArray); + pDashArray = nullptr; + } + CallFunc(GdipSetPenMiterLimit)(pPen, pGraphState->m_MiterLimit); + return pPen; +} +static bool IsSmallTriangle(PointF* points, + const CFX_Matrix* pMatrix, + int& v1, + int& v2) { + int pairs[] = {1, 2, 0, 2, 0, 1}; + for (int i = 0; i < 3; i++) { + int pair1 = pairs[i * 2]; + int pair2 = pairs[i * 2 + 1]; + + CFX_PointF p1(points[pair1].X, points[pair1].Y); + CFX_PointF p2(points[pair2].X, points[pair2].Y); + if (pMatrix) { + p1 = pMatrix->Transform(p1); + p2 = pMatrix->Transform(p2); + } + + CFX_PointF diff = p1 - p2; + FX_FLOAT distance_square = (diff.x * diff.x) + (diff.y * diff.y); + if (distance_square < (1.0f * 2 + 1.0f / 4)) { + v1 = i; + v2 = pair1; + return true; + } + } + return false; +} +bool CGdiplusExt::DrawPath(HDC hDC, + const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_argb, + uint32_t stroke_argb, + int fill_mode) { + auto& pPoints = pPathData->GetPoints(); + if (pPoints.empty()) + return true; + + GpGraphics* pGraphics = nullptr; + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipCreateFromHDC)(hDC, &pGraphics); + CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel); + CallFunc(GdipSetPixelOffsetMode)(pGraphics, PixelOffsetModeHalf); + GpMatrix* pMatrix = nullptr; + if (pObject2Device) { + CallFunc(GdipCreateMatrix2)(pObject2Device->a, pObject2Device->b, + pObject2Device->c, pObject2Device->d, + pObject2Device->e, pObject2Device->f, &pMatrix); + CallFunc(GdipSetWorldTransform)(pGraphics, pMatrix); + } + PointF* points = FX_Alloc(PointF, pPoints.size()); + BYTE* types = FX_Alloc(BYTE, pPoints.size()); + int nSubPathes = 0; + bool bSubClose = false; + int pos_subclose = 0; + bool bSmooth = false; + int startpoint = 0; + for (size_t i = 0; i < pPoints.size(); i++) { + points[i].X = pPoints[i].m_Point.x; + points[i].Y = pPoints[i].m_Point.y; + + CFX_PointF pos = pPoints[i].m_Point; + if (pObject2Device) + pos = pObject2Device->Transform(pos); + + if (pos.x > 50000 * 1.0f) + points[i].X = 50000 * 1.0f; + if (pos.x < -50000 * 1.0f) + points[i].X = -50000 * 1.0f; + if (pos.y > 50000 * 1.0f) + points[i].Y = 50000 * 1.0f; + if (pos.y < -50000 * 1.0f) + points[i].Y = -50000 * 1.0f; + + FXPT_TYPE point_type = pPoints[i].m_Type; + if (point_type == FXPT_TYPE::MoveTo) { + types[i] = PathPointTypeStart; + nSubPathes++; + bSubClose = false; + startpoint = i; + } else if (point_type == FXPT_TYPE::LineTo) { + types[i] = PathPointTypeLine; + if (pPoints[i - 1].IsTypeAndOpen(FXPT_TYPE::MoveTo) && + (i == pPoints.size() - 1 || + pPoints[i + 1].IsTypeAndOpen(FXPT_TYPE::MoveTo)) && + points[i].Y == points[i - 1].Y && points[i].X == points[i - 1].X) { + points[i].X += 0.01f; + continue; + } + if (!bSmooth && points[i].X != points[i - 1].X && + points[i].Y != points[i - 1].Y) { + bSmooth = true; + } + } else if (point_type == FXPT_TYPE::BezierTo) { + types[i] = PathPointTypeBezier; + bSmooth = true; + } + if (pPoints[i].m_CloseFigure) { + if (bSubClose) { + types[pos_subclose] &= ~PathPointTypeCloseSubpath; + } else { + bSubClose = true; + } + pos_subclose = i; + types[i] |= PathPointTypeCloseSubpath; + if (!bSmooth && points[i].X != points[startpoint].X && + points[i].Y != points[startpoint].Y) { + bSmooth = true; + } + } + } + if (fill_mode & FXFILL_NOPATHSMOOTH) { + bSmooth = false; + CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeNone); + } else if (!(fill_mode & FXFILL_FULLCOVER)) { + if (!bSmooth && (fill_mode & 3)) { + bSmooth = true; + } + if (bSmooth || (pGraphState && pGraphState->m_LineWidth > 2)) { + CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeAntiAlias); + } + } + int new_fill_mode = fill_mode & 3; + if (pPoints.size() == 4 && !pGraphState) { + int v1, v2; + if (IsSmallTriangle(points, pObject2Device, v1, v2)) { + GpPen* pPen = nullptr; + CallFunc(GdipCreatePen1)(fill_argb, 1.0f, UnitPixel, &pPen); + CallFunc(GdipDrawLineI)( + pGraphics, pPen, FXSYS_round(points[v1].X), FXSYS_round(points[v1].Y), + FXSYS_round(points[v2].X), FXSYS_round(points[v2].Y)); + CallFunc(GdipDeletePen)(pPen); + return true; + } + } + GpPath* pGpPath = nullptr; + CallFunc(GdipCreatePath2)(points, types, pPoints.size(), + GdiFillType2Gdip(new_fill_mode), &pGpPath); + if (!pGpPath) { + if (pMatrix) + CallFunc(GdipDeleteMatrix)(pMatrix); + + FX_Free(points); + FX_Free(types); + CallFunc(GdipDeleteGraphics)(pGraphics); + return false; + } + if (new_fill_mode) { + GpBrush* pBrush = _GdipCreateBrush(fill_argb); + CallFunc(GdipSetPathFillMode)(pGpPath, GdiFillType2Gdip(new_fill_mode)); + CallFunc(GdipFillPath)(pGraphics, pBrush, pGpPath); + CallFunc(GdipDeleteBrush)(pBrush); + } + if (pGraphState && stroke_argb) { + GpPen* pPen = _GdipCreatePen(pGraphState, pObject2Device, stroke_argb, + !!(fill_mode & FX_STROKE_TEXT_MODE)); + if (nSubPathes == 1) { + CallFunc(GdipDrawPath)(pGraphics, pPen, pGpPath); + } else { + int iStart = 0; + for (size_t i = 0; i < pPoints.size(); i++) { + if (i == pPoints.size() - 1 || types[i + 1] == PathPointTypeStart) { + GpPath* pSubPath; + CallFunc(GdipCreatePath2)(points + iStart, types + iStart, + i - iStart + 1, + GdiFillType2Gdip(new_fill_mode), &pSubPath); + iStart = i + 1; + CallFunc(GdipDrawPath)(pGraphics, pPen, pSubPath); + CallFunc(GdipDeletePath)(pSubPath); + } + } + } + CallFunc(GdipDeletePen)(pPen); + } + if (pMatrix) { + CallFunc(GdipDeleteMatrix)(pMatrix); + } + FX_Free(points); + FX_Free(types); + CallFunc(GdipDeletePath)(pGpPath); + CallFunc(GdipDeleteGraphics)(pGraphics); + return true; +} + +class GpStream final : public IStream { + public: + GpStream() : m_RefCount(1), m_ReadPos(0) {} + + // IUnknown + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, + void** ppvObject) override { + if (iid == __uuidof(IUnknown) || iid == __uuidof(IStream) || + iid == __uuidof(ISequentialStream)) { + *ppvObject = static_cast(this); + AddRef(); + return S_OK; + } + return E_NOINTERFACE; + } + ULONG STDMETHODCALLTYPE AddRef() override { + return (ULONG)InterlockedIncrement(&m_RefCount); + } + ULONG STDMETHODCALLTYPE Release() override { + ULONG res = (ULONG)InterlockedDecrement(&m_RefCount); + if (res == 0) { + delete this; + } + return res; + } + + // ISequentialStream + HRESULT STDMETHODCALLTYPE Read(void* Output, + ULONG cb, + ULONG* pcbRead) override { + size_t bytes_left; + size_t bytes_out; + if (pcbRead) { + *pcbRead = 0; + } + if (m_ReadPos == m_InterStream.GetLength()) { + return HRESULT_FROM_WIN32(ERROR_END_OF_MEDIA); + } + bytes_left = m_InterStream.GetLength() - m_ReadPos; + bytes_out = std::min(pdfium::base::checked_cast(cb), bytes_left); + FXSYS_memcpy(Output, m_InterStream.GetBuffer() + m_ReadPos, bytes_out); + m_ReadPos += (int32_t)bytes_out; + if (pcbRead) { + *pcbRead = (ULONG)bytes_out; + } + return S_OK; + } + HRESULT STDMETHODCALLTYPE Write(void const* Input, + ULONG cb, + ULONG* pcbWritten) override { + if (cb <= 0) { + if (pcbWritten) { + *pcbWritten = 0; + } + return S_OK; + } + m_InterStream.InsertBlock(m_InterStream.GetLength(), Input, cb); + if (pcbWritten) { + *pcbWritten = cb; + } + return S_OK; + } + + // IStream + HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER) override { + return E_NOTIMPL; + } + HRESULT STDMETHODCALLTYPE CopyTo(IStream*, + ULARGE_INTEGER, + ULARGE_INTEGER*, + ULARGE_INTEGER*) override { + return E_NOTIMPL; + } + HRESULT STDMETHODCALLTYPE Commit(DWORD) override { return E_NOTIMPL; } + HRESULT STDMETHODCALLTYPE Revert() override { return E_NOTIMPL; } + HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER, + ULARGE_INTEGER, + DWORD) override { + return E_NOTIMPL; + } + HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER, + ULARGE_INTEGER, + DWORD) override { + return E_NOTIMPL; + } + HRESULT STDMETHODCALLTYPE Clone(IStream** stream) override { + return E_NOTIMPL; + } + HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove, + DWORD dwOrigin, + ULARGE_INTEGER* lpNewFilePointer) override { + long start = 0; + long new_read_position; + switch (dwOrigin) { + case STREAM_SEEK_SET: + start = 0; + break; + case STREAM_SEEK_CUR: + start = m_ReadPos; + break; + case STREAM_SEEK_END: + start = m_InterStream.GetLength(); + break; + default: + return STG_E_INVALIDFUNCTION; + break; + } + new_read_position = start + (long)liDistanceToMove.QuadPart; + if (new_read_position < 0 || + new_read_position > m_InterStream.GetLength()) { + return STG_E_SEEKERROR; + } + m_ReadPos = new_read_position; + if (lpNewFilePointer) { + lpNewFilePointer->QuadPart = m_ReadPos; + } + return S_OK; + } + HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg, + DWORD grfStatFlag) override { + if (!pStatstg) { + return STG_E_INVALIDFUNCTION; + } + ZeroMemory(pStatstg, sizeof(STATSTG)); + pStatstg->cbSize.QuadPart = m_InterStream.GetLength(); + return S_OK; + } + + private: + LONG m_RefCount; + int m_ReadPos; + CFX_ByteTextBuf m_InterStream; +}; + +typedef struct { + BITMAPINFO* pbmi; + int Stride; + LPBYTE pScan0; + GpBitmap* pBitmap; + BitmapData* pBitmapData; + GpStream* pStream; +} PREVIEW3_DIBITMAP; + +static PREVIEW3_DIBITMAP* LoadDIBitmap(WINDIB_Open_Args_ args) { + GpBitmap* pBitmap; + GpStream* pStream = nullptr; + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + Status status = Ok; + if (args.flags == WINDIB_OPEN_PATHNAME) { + status = CallFunc(GdipCreateBitmapFromFileICM)((wchar_t*)args.path_name, + &pBitmap); + } else { + if (args.memory_size == 0 || !args.memory_base) { + return nullptr; + } + pStream = new GpStream; + pStream->Write(args.memory_base, (ULONG)args.memory_size, nullptr); + status = CallFunc(GdipCreateBitmapFromStreamICM)(pStream, &pBitmap); + } + if (status != Ok) { + if (pStream) { + pStream->Release(); + } + return nullptr; + } + UINT height, width; + CallFunc(GdipGetImageHeight)(pBitmap, &height); + CallFunc(GdipGetImageWidth)(pBitmap, &width); + PixelFormat pixel_format; + CallFunc(GdipGetImagePixelFormat)(pBitmap, &pixel_format); + int info_size = sizeof(BITMAPINFOHEADER); + int bpp = 24; + int dest_pixel_format = PixelFormat24bppRGB; + if (pixel_format == PixelFormat1bppIndexed) { + info_size += 8; + bpp = 1; + dest_pixel_format = PixelFormat1bppIndexed; + } else if (pixel_format == PixelFormat8bppIndexed) { + info_size += 1024; + bpp = 8; + dest_pixel_format = PixelFormat8bppIndexed; + } else if (pixel_format == PixelFormat32bppARGB) { + bpp = 32; + dest_pixel_format = PixelFormat32bppARGB; + } + LPBYTE buf = FX_Alloc(BYTE, info_size); + BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)buf; + pbmih->biBitCount = bpp; + pbmih->biCompression = BI_RGB; + pbmih->biHeight = -(int)height; + pbmih->biPlanes = 1; + pbmih->biWidth = width; + Rect rect(0, 0, width, height); + BitmapData* pBitmapData = FX_Alloc(BitmapData, 1); + CallFunc(GdipBitmapLockBits)(pBitmap, &rect, ImageLockModeRead, + dest_pixel_format, pBitmapData); + if (pixel_format == PixelFormat1bppIndexed || + pixel_format == PixelFormat8bppIndexed) { + DWORD* ppal = (DWORD*)(buf + sizeof(BITMAPINFOHEADER)); + struct { + UINT flags; + UINT Count; + DWORD Entries[256]; + } pal; + int size = 0; + CallFunc(GdipGetImagePaletteSize)(pBitmap, &size); + CallFunc(GdipGetImagePalette)(pBitmap, (ColorPalette*)&pal, size); + int entries = pixel_format == PixelFormat1bppIndexed ? 2 : 256; + for (int i = 0; i < entries; i++) { + ppal[i] = pal.Entries[i] & 0x00ffffff; + } + } + PREVIEW3_DIBITMAP* pInfo = FX_Alloc(PREVIEW3_DIBITMAP, 1); + pInfo->pbmi = (BITMAPINFO*)buf; + pInfo->pScan0 = (LPBYTE)pBitmapData->Scan0; + pInfo->Stride = pBitmapData->Stride; + pInfo->pBitmap = pBitmap; + pInfo->pBitmapData = pBitmapData; + pInfo->pStream = pStream; + return pInfo; +} + +static void FreeDIBitmap(PREVIEW3_DIBITMAP* pInfo) { + CGdiplusExt& GdiplusExt = + ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt; + CallFunc(GdipBitmapUnlockBits)(pInfo->pBitmap, pInfo->pBitmapData); + CallFunc(GdipDisposeImage)(pInfo->pBitmap); + FX_Free(pInfo->pBitmapData); + FX_Free((LPBYTE)pInfo->pbmi); + if (pInfo->pStream) { + pInfo->pStream->Release(); + } + FX_Free(pInfo); +} + +CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, + LPVOID pData, + bool bAlpha); +CFX_DIBitmap* CGdiplusExt::LoadDIBitmap(WINDIB_Open_Args_ args) { + PREVIEW3_DIBITMAP* pInfo = ::LoadDIBitmap(args); + if (!pInfo) { + return nullptr; + } + int height = abs(pInfo->pbmi->bmiHeader.biHeight); + int width = pInfo->pbmi->bmiHeader.biWidth; + int dest_pitch = (width * pInfo->pbmi->bmiHeader.biBitCount + 31) / 32 * 4; + LPBYTE pData = FX_Alloc2D(BYTE, dest_pitch, height); + if (dest_pitch == pInfo->Stride) { + FXSYS_memcpy(pData, pInfo->pScan0, dest_pitch * height); + } else { + for (int i = 0; i < height; i++) { + FXSYS_memcpy(pData + dest_pitch * i, pInfo->pScan0 + pInfo->Stride * i, + dest_pitch); + } + } + CFX_DIBitmap* pDIBitmap = _FX_WindowsDIB_LoadFromBuf( + pInfo->pbmi, pData, pInfo->pbmi->bmiHeader.biBitCount == 32); + FX_Free(pData); + FreeDIBitmap(pInfo); + return pDIBitmap; +} diff --git a/modules/pdfium/pdfium/core/fxge/win32/fx_win32_print.cpp b/modules/pdfium/pdfium/core/fxge/win32/fx_win32_print.cpp new file mode 100644 index 000000000000..cda83ebc95a2 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/win32/fx_win32_print.cpp @@ -0,0 +1,494 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include +#include +#include + +#include "core/fxcrt/fx_system.h" +#include "core/fxge/cfx_windowsdevice.h" +#include "core/fxge/dib/dib_int.h" +#include "core/fxge/fx_freetype.h" +#include "core/fxge/ge/fx_text_int.h" +#include "core/fxge/win32/cpsoutput.h" +#include "core/fxge/win32/win32_int.h" +#include "third_party/base/ptr_util.h" + +#if defined(PDFIUM_PRINT_TEXT_WITH_GDI) +namespace { + +class ScopedState { + public: + ScopedState(HDC hDC, HFONT hFont) : m_hDC(hDC) { + m_iState = SaveDC(m_hDC); + m_hFont = SelectObject(m_hDC, hFont); + } + + ~ScopedState() { + HGDIOBJ hFont = SelectObject(m_hDC, m_hFont); + DeleteObject(hFont); + RestoreDC(m_hDC, m_iState); + } + + private: + HDC m_hDC; + HGDIOBJ m_hFont; + int m_iState; + + ScopedState(const ScopedState&) = delete; + void operator=(const ScopedState&) = delete; +}; + +} // namespace + +bool g_pdfium_print_text_with_gdi = false; + +PDFiumEnsureTypefaceCharactersAccessible g_pdfium_typeface_accessible_func = + nullptr; +#endif + +CGdiPrinterDriver::CGdiPrinterDriver(HDC hDC) + : CGdiDeviceDriver(hDC, FXDC_PRINTER), + m_HorzSize(::GetDeviceCaps(m_hDC, HORZSIZE)), + m_VertSize(::GetDeviceCaps(m_hDC, VERTSIZE)) {} + +CGdiPrinterDriver::~CGdiPrinterDriver() {} + +int CGdiPrinterDriver::GetDeviceCaps(int caps_id) const { + if (caps_id == FXDC_HORZ_SIZE) + return m_HorzSize; + if (caps_id == FXDC_VERT_SIZE) + return m_VertSize; + return CGdiDeviceDriver::GetDeviceCaps(caps_id); +} + +bool CGdiPrinterDriver::SetDIBits(const CFX_DIBSource* pSource, + uint32_t color, + const FX_RECT* pSrcRect, + int left, + int top, + int blend_type) { + if (pSource->IsAlphaMask()) { + FX_RECT clip_rect(left, top, left + pSrcRect->Width(), + top + pSrcRect->Height()); + return StretchDIBits(pSource, color, left - pSrcRect->left, + top - pSrcRect->top, pSource->GetWidth(), + pSource->GetHeight(), &clip_rect, 0, + FXDIB_BLEND_NORMAL); + } + ASSERT(pSource && !pSource->IsAlphaMask() && pSrcRect); + ASSERT(blend_type == FXDIB_BLEND_NORMAL); + if (pSource->HasAlpha()) + return false; + + CFX_DIBExtractor temp(pSource); + CFX_DIBitmap* pBitmap = temp.GetBitmap(); + if (!pBitmap) + return false; + + return GDI_SetDIBits(pBitmap, pSrcRect, left, top); +} + +bool CGdiPrinterDriver::StretchDIBits(const CFX_DIBSource* pSource, + uint32_t color, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + uint32_t flags, + int blend_type) { + if (pSource->IsAlphaMask()) { + int alpha = FXARGB_A(color); + if (pSource->GetBPP() != 1 || alpha != 255) + return false; + + if (dest_width < 0 || dest_height < 0) { + std::unique_ptr pFlipped = + pSource->FlipImage(dest_width < 0, dest_height < 0); + if (!pFlipped) + return false; + + if (dest_width < 0) + dest_left += dest_width; + if (dest_height < 0) + dest_top += dest_height; + + return GDI_StretchBitMask(pFlipped.get(), dest_left, dest_top, + abs(dest_width), abs(dest_height), color, + flags); + } + + CFX_DIBExtractor temp(pSource); + CFX_DIBitmap* pBitmap = temp.GetBitmap(); + if (!pBitmap) + return false; + return GDI_StretchBitMask(pBitmap, dest_left, dest_top, dest_width, + dest_height, color, flags); + } + + if (pSource->HasAlpha()) + return false; + + if (dest_width < 0 || dest_height < 0) { + std::unique_ptr pFlipped = + pSource->FlipImage(dest_width < 0, dest_height < 0); + if (!pFlipped) + return false; + + if (dest_width < 0) + dest_left += dest_width; + if (dest_height < 0) + dest_top += dest_height; + + return GDI_StretchDIBits(pFlipped.get(), dest_left, dest_top, + abs(dest_width), abs(dest_height), flags); + } + + CFX_DIBExtractor temp(pSource); + CFX_DIBitmap* pBitmap = temp.GetBitmap(); + if (!pBitmap) + return false; + return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, + dest_height, flags); +} + +bool CGdiPrinterDriver::StartDIBits(const CFX_DIBSource* pSource, + int bitmap_alpha, + uint32_t color, + const CFX_Matrix* pMatrix, + uint32_t render_flags, + void*& handle, + int blend_type) { + if (bitmap_alpha < 255 || pSource->HasAlpha() || + (pSource->IsAlphaMask() && (pSource->GetBPP() != 1))) { + return false; + } + CFX_FloatRect unit_rect = pMatrix->GetUnitRect(); + FX_RECT full_rect = unit_rect.GetOuterRect(); + if (FXSYS_fabs(pMatrix->b) < 0.5f && pMatrix->a != 0 && + FXSYS_fabs(pMatrix->c) < 0.5f && pMatrix->d != 0) { + bool bFlipX = pMatrix->a < 0; + bool bFlipY = pMatrix->d > 0; + return StretchDIBits(pSource, color, + bFlipX ? full_rect.right : full_rect.left, + bFlipY ? full_rect.bottom : full_rect.top, + bFlipX ? -full_rect.Width() : full_rect.Width(), + bFlipY ? -full_rect.Height() : full_rect.Height(), + nullptr, 0, blend_type); + } + if (FXSYS_fabs(pMatrix->a) >= 0.5f || FXSYS_fabs(pMatrix->d) >= 0.5f) + return false; + + std::unique_ptr pTransformed = + pSource->SwapXY(pMatrix->c > 0, pMatrix->b < 0); + if (!pTransformed) + return false; + + return StretchDIBits(pTransformed.get(), color, full_rect.left, full_rect.top, + full_rect.Width(), full_rect.Height(), nullptr, 0, + blend_type); +} + +bool CGdiPrinterDriver::DrawDeviceText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t color) { +#if defined(PDFIUM_PRINT_TEXT_WITH_GDI) + if (!g_pdfium_print_text_with_gdi) + return false; + + if (nChars < 1 || !pFont || !pFont->IsEmbedded() || !pFont->IsTTFont()) + return false; + + // Scale factor used to minimize the kerning problems caused by rounding + // errors below. Value choosen based on the title of https://crbug.com/18383 + const double kScaleFactor = 10; + + // Font + // + // Note that |pFont| has the actual font to render with embedded within, but + // but unfortunately AddFontMemResourceEx() does not seem to cooperate. + // Loading font data to memory seems to work, but then enumerating the fonts + // fails to find it. This requires more investigation. In the meanwhile, + // assume the printing is happening on the machine that generated the PDF, so + // the embedded font, if not a web font, is available through GDI anyway. + // TODO(thestig): Figure out why AddFontMemResourceEx() does not work. + // Generalize this method to work for all PDFs with embedded fonts. + // In sandboxed environments, font loading may not work at all, so this may be + // the best possible effort. + LOGFONT lf = {}; + lf.lfHeight = -font_size * kScaleFactor; + lf.lfWeight = pFont->IsBold() ? FW_BOLD : FW_NORMAL; + lf.lfItalic = pFont->IsItalic(); + lf.lfCharSet = DEFAULT_CHARSET; + + const CFX_WideString wsName = pFont->GetFaceName().UTF8Decode(); + int iNameLen = std::min(wsName.GetLength(), LF_FACESIZE - 1); + memcpy(lf.lfFaceName, wsName.c_str(), sizeof(lf.lfFaceName[0]) * iNameLen); + lf.lfFaceName[iNameLen] = 0; + + HFONT hFont = CreateFontIndirect(&lf); + if (!hFont) + return false; + + ScopedState state(m_hDC, hFont); + size_t nTextMetricSize = GetOutlineTextMetrics(m_hDC, 0, nullptr); + if (nTextMetricSize == 0) { + // Give up and fail if there is no way to get the font to try again. + if (!g_pdfium_typeface_accessible_func) + return false; + + // Try to get the font. Any letter will do. + g_pdfium_typeface_accessible_func(&lf, L"A", 1); + nTextMetricSize = GetOutlineTextMetrics(m_hDC, 0, nullptr); + if (nTextMetricSize == 0) + return false; + } + + std::vector buf(nTextMetricSize); + OUTLINETEXTMETRIC* pTextMetric = + reinterpret_cast(buf.data()); + if (GetOutlineTextMetrics(m_hDC, nTextMetricSize, pTextMetric) == 0) + return false; + + // If the selected font is not the requested font, then bail out. This can + // happen with web fonts, for example. + wchar_t* wsSelectedName = reinterpret_cast( + buf.data() + reinterpret_cast(pTextMetric->otmpFaceName)); + if (wsName != wsSelectedName) + return false; + + // Transforms + SetGraphicsMode(m_hDC, GM_ADVANCED); + XFORM xform; + xform.eM11 = pObject2Device->a / kScaleFactor; + xform.eM12 = pObject2Device->b / kScaleFactor; + xform.eM21 = -pObject2Device->c / kScaleFactor; + xform.eM22 = -pObject2Device->d / kScaleFactor; + xform.eDx = pObject2Device->e; + xform.eDy = pObject2Device->f; + ModifyWorldTransform(m_hDC, &xform, MWT_LEFTMULTIPLY); + + // Color + int iUnusedAlpha; + FX_COLORREF rgb; + ArgbDecode(color, iUnusedAlpha, rgb); + SetTextColor(m_hDC, rgb); + SetBkMode(m_hDC, TRANSPARENT); + + // Text + CFX_WideString wsText; + std::vector spacing(nChars); + FX_FLOAT fPreviousOriginX = 0; + for (int i = 0; i < nChars; ++i) { + // Only works with PDFs from Skia's PDF generator. Cannot handle arbitrary + // values from PDFs. + const FXTEXT_CHARPOS& charpos = pCharPos[i]; + ASSERT(charpos.m_AdjustMatrix[0] == 0); + ASSERT(charpos.m_AdjustMatrix[1] == 0); + ASSERT(charpos.m_AdjustMatrix[2] == 0); + ASSERT(charpos.m_AdjustMatrix[3] == 0); + ASSERT(charpos.m_Origin.y == 0); + + // Round the spacing to the nearest integer, but keep track of the rounding + // error for calculating the next spacing value. + FX_FLOAT fOriginX = charpos.m_Origin.x * kScaleFactor; + FX_FLOAT fPixelSpacing = fOriginX - fPreviousOriginX; + spacing[i] = FXSYS_round(fPixelSpacing); + fPreviousOriginX = fOriginX - (fPixelSpacing - spacing[i]); + + wsText += charpos.m_GlyphIndex; + } + + // Draw + SetTextAlign(m_hDC, TA_LEFT | TA_BASELINE); + if (ExtTextOutW(m_hDC, 0, 0, ETO_GLYPH_INDEX, nullptr, wsText.c_str(), nChars, + nChars > 1 ? &spacing[1] : nullptr)) { + return true; + } + + // Give up and fail if there is no way to get the font to try again. + if (!g_pdfium_typeface_accessible_func) + return false; + + // Try to get the font and draw again. + g_pdfium_typeface_accessible_func(&lf, wsText.c_str(), nChars); + return !!ExtTextOutW(m_hDC, 0, 0, ETO_GLYPH_INDEX, nullptr, wsText.c_str(), + nChars, nChars > 1 ? &spacing[1] : nullptr); +#else + return false; +#endif +} + +CPSPrinterDriver::CPSPrinterDriver(HDC hDC, int pslevel, bool bCmykOutput) + : m_hDC(hDC), m_bCmykOutput(bCmykOutput) { + m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE); + m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE); + m_Width = ::GetDeviceCaps(m_hDC, HORZRES); + m_Height = ::GetDeviceCaps(m_hDC, VERTRES); + m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL); + m_pPSOutput = pdfium::MakeUnique(m_hDC); + m_PSRenderer.Init(m_pPSOutput.get(), pslevel, m_Width, m_Height, bCmykOutput); + HRGN hRgn = ::CreateRectRgn(0, 0, 1, 1); + int ret = ::GetClipRgn(hDC, hRgn); + if (ret == 1) { + ret = ::GetRegionData(hRgn, 0, NULL); + if (ret) { + RGNDATA* pData = reinterpret_cast(FX_Alloc(uint8_t, ret)); + ret = ::GetRegionData(hRgn, ret, pData); + if (ret) { + CFX_PathData path; + for (uint32_t i = 0; i < pData->rdh.nCount; i++) { + RECT* pRect = + reinterpret_cast(pData->Buffer + pData->rdh.nRgnSize * i); + path.AppendRect(static_cast(pRect->left), + static_cast(pRect->bottom), + static_cast(pRect->right), + static_cast(pRect->top)); + } + m_PSRenderer.SetClip_PathFill(&path, nullptr, FXFILL_WINDING); + } + FX_Free(pData); + } + } + ::DeleteObject(hRgn); +} + +CPSPrinterDriver::~CPSPrinterDriver() { + EndRendering(); +} + +int CPSPrinterDriver::GetDeviceCaps(int caps_id) const { + switch (caps_id) { + case FXDC_DEVICE_CLASS: + return FXDC_PRINTER; + case FXDC_PIXEL_WIDTH: + return m_Width; + case FXDC_PIXEL_HEIGHT: + return m_Height; + case FXDC_BITS_PIXEL: + return m_nBitsPerPixel; + case FXDC_RENDER_CAPS: + return m_bCmykOutput ? FXRC_BIT_MASK | FXRC_CMYK_OUTPUT : FXRC_BIT_MASK; + case FXDC_HORZ_SIZE: + return m_HorzSize; + case FXDC_VERT_SIZE: + return m_VertSize; + } + return 0; +} + +bool CPSPrinterDriver::StartRendering() { + return m_PSRenderer.StartRendering(); +} + +void CPSPrinterDriver::EndRendering() { + m_PSRenderer.EndRendering(); +} + +void CPSPrinterDriver::SaveState() { + m_PSRenderer.SaveState(); +} + +void CPSPrinterDriver::RestoreState(bool bKeepSaved) { + m_PSRenderer.RestoreState(bKeepSaved); +} + +bool CPSPrinterDriver::SetClip_PathFill(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + int fill_mode) { + m_PSRenderer.SetClip_PathFill(pPathData, pObject2Device, fill_mode); + return true; +} + +bool CPSPrinterDriver::SetClip_PathStroke( + const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState) { + m_PSRenderer.SetClip_PathStroke(pPathData, pObject2Device, pGraphState); + return true; +} + +bool CPSPrinterDriver::DrawPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + FX_ARGB fill_color, + FX_ARGB stroke_color, + int fill_mode, + int blend_type) { + if (blend_type != FXDIB_BLEND_NORMAL) { + return false; + } + return m_PSRenderer.DrawPath(pPathData, pObject2Device, pGraphState, + fill_color, stroke_color, fill_mode & 3); +} + +bool CPSPrinterDriver::GetClipBox(FX_RECT* pRect) { + *pRect = m_PSRenderer.GetClipBox(); + return true; +} + +bool CPSPrinterDriver::SetDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + const FX_RECT* pSrcRect, + int left, + int top, + int blend_type) { + if (blend_type != FXDIB_BLEND_NORMAL) + return false; + return m_PSRenderer.SetDIBits(pBitmap, color, left, top); +} + +bool CPSPrinterDriver::StretchDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + uint32_t flags, + int blend_type) { + if (blend_type != FXDIB_BLEND_NORMAL) + return false; + return m_PSRenderer.StretchDIBits(pBitmap, color, dest_left, dest_top, + dest_width, dest_height, flags); +} + +bool CPSPrinterDriver::StartDIBits(const CFX_DIBSource* pBitmap, + int bitmap_alpha, + uint32_t color, + const CFX_Matrix* pMatrix, + uint32_t render_flags, + void*& handle, + int blend_type) { + if (blend_type != FXDIB_BLEND_NORMAL) + return false; + + if (bitmap_alpha < 255) + return false; + + handle = nullptr; + return m_PSRenderer.DrawDIBits(pBitmap, color, pMatrix, render_flags); +} + +bool CPSPrinterDriver::DrawDeviceText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t color) { + return m_PSRenderer.DrawText(nChars, pCharPos, pFont, pObject2Device, + font_size, color); +} + +void* CPSPrinterDriver::GetPlatformSurface() const { + return m_hDC; +} diff --git a/modules/pdfium/pdfium/core/fxge/win32/win32_int.h b/modules/pdfium/pdfium/core/fxge/win32/win32_int.h new file mode 100644 index 000000000000..f8eae8730874 --- /dev/null +++ b/modules/pdfium/pdfium/core/fxge/win32/win32_int.h @@ -0,0 +1,334 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXGE_WIN32_WIN32_INT_H_ +#define CORE_FXGE_WIN32_WIN32_INT_H_ + +#include + +#include + +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/ifx_renderdevicedriver.h" +#include "core/fxge/win32/cfx_psrenderer.h" +#include "core/fxge/win32/cpsoutput.h" +#include "core/fxge/win32/dwrite_int.h" + +class FXTEXT_CHARPOS; +struct WINDIB_Open_Args_; + +typedef HANDLE(__stdcall* FuncType_GdiAddFontMemResourceEx)(PVOID pbFont, + DWORD cbFont, + PVOID pdv, + DWORD* pcFonts); +typedef BOOL(__stdcall* FuncType_GdiRemoveFontMemResourceEx)(HANDLE handle); + +class CGdiplusExt { + public: + CGdiplusExt(); + ~CGdiplusExt(); + void Load(); + bool IsAvailable() { return !!m_hModule; } + bool StretchBitMask(HDC hDC, + BOOL bMonoDevice, + const CFX_DIBitmap* pBitmap, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + uint32_t argb, + const FX_RECT* pClipRect, + int flags); + bool StretchDIBits(HDC hDC, + const CFX_DIBitmap* pBitmap, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + int flags); + bool DrawPath(HDC hDC, + const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_argb, + uint32_t stroke_argb, + int fill_mode); + + void* LoadMemFont(uint8_t* pData, uint32_t size); + void DeleteMemFont(void* pFontCollection); + bool GdipCreateFromImage(void* bitmap, void** graphics); + void GdipDeleteGraphics(void* graphics); + void GdipSetTextRenderingHint(void* graphics, int mode); + void GdipSetPageUnit(void* graphics, uint32_t unit); + void GdipSetWorldTransform(void* graphics, void* pMatrix); + bool GdipDrawDriverString(void* graphics, + unsigned short* text, + int length, + void* font, + void* brush, + void* positions, + int flags, + const void* matrix); + void GdipCreateBrush(uint32_t fill_argb, void** pBrush); + void GdipDeleteBrush(void* pBrush); + void GdipCreateMatrix(FX_FLOAT a, + FX_FLOAT b, + FX_FLOAT c, + FX_FLOAT d, + FX_FLOAT e, + FX_FLOAT f, + void** matrix); + void GdipDeleteMatrix(void* matrix); + bool GdipCreateFontFamilyFromName(const FX_WCHAR* name, + void* pFontCollection, + void** pFamily); + void GdipDeleteFontFamily(void* pFamily); + bool GdipCreateFontFromFamily(void* pFamily, + FX_FLOAT font_size, + int fontstyle, + int flag, + void** pFont); + void* GdipCreateFontFromCollection(void* pFontCollection, + FX_FLOAT font_size, + int fontstyle); + void GdipDeleteFont(void* pFont); + bool GdipCreateBitmap(CFX_DIBitmap* pBitmap, void** bitmap); + void GdipDisposeImage(void* bitmap); + void GdipGetFontSize(void* pFont, FX_FLOAT* size); + void* GdiAddFontMemResourceEx(void* pFontdata, + uint32_t size, + void* pdv, + uint32_t* num_face); + bool GdiRemoveFontMemResourceEx(void* handle); + CFX_DIBitmap* LoadDIBitmap(WINDIB_Open_Args_ args); + + FARPROC m_Functions[100]; + FuncType_GdiAddFontMemResourceEx m_pGdiAddFontMemResourceEx; + FuncType_GdiRemoveFontMemResourceEx m_pGdiRemoveFontMemResourseEx; + + protected: + HMODULE m_hModule; + HMODULE m_GdiModule; +}; + +class CWin32Platform { + public: + bool m_bHalfTone; + CGdiplusExt m_GdiplusExt; + CDWriteExt m_DWriteExt; +}; + +class CGdiDeviceDriver : public IFX_RenderDeviceDriver { + protected: + CGdiDeviceDriver(HDC hDC, int device_class); + ~CGdiDeviceDriver() override; + + // IFX_RenderDeviceDriver + int GetDeviceCaps(int caps_id) const override; + void SaveState() override; + void RestoreState(bool bKeepSaved) override; + bool SetClip_PathFill(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + int fill_mode) override; + bool SetClip_PathStroke(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState) override; + bool DrawPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode, + int blend_type) override; + bool FillRectWithBlend(const FX_RECT* pRect, + uint32_t fill_color, + int blend_type) override; + bool DrawCosmeticLine(FX_FLOAT x1, + FX_FLOAT y1, + FX_FLOAT x2, + FX_FLOAT y2, + uint32_t color, + int blend_type) override; + bool GetClipBox(FX_RECT* pRect) override; + void* GetPlatformSurface() const override; + + void DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2); + + bool GDI_SetDIBits(CFX_DIBitmap* pBitmap, + const FX_RECT* pSrcRect, + int left, + int top); + bool GDI_StretchDIBits(CFX_DIBitmap* pBitmap, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + uint32_t flags); + bool GDI_StretchBitMask(CFX_DIBitmap* pBitmap, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + uint32_t bitmap_color, + uint32_t flags); + + HDC m_hDC; + bool m_bMetafileDCType; + int m_Width; + int m_Height; + int m_nBitsPerPixel; + int m_DeviceClass; + int m_RenderCaps; +}; + +class CGdiDisplayDriver : public CGdiDeviceDriver { + public: + explicit CGdiDisplayDriver(HDC hDC); + ~CGdiDisplayDriver() override; + + protected: + bool GetDIBits(CFX_DIBitmap* pBitmap, int left, int top) override; + bool SetDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + const FX_RECT* pSrcRect, + int left, + int top, + int blend_type) override; + bool StretchDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + uint32_t flags, + int blend_type) override; + bool StartDIBits(const CFX_DIBSource* pBitmap, + int bitmap_alpha, + uint32_t color, + const CFX_Matrix* pMatrix, + uint32_t render_flags, + void*& handle, + int blend_type) override; + bool UseFoxitStretchEngine(const CFX_DIBSource* pSource, + uint32_t color, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + int render_flags); +}; + +class CGdiPrinterDriver : public CGdiDeviceDriver { + public: + explicit CGdiPrinterDriver(HDC hDC); + ~CGdiPrinterDriver() override; + + protected: + int GetDeviceCaps(int caps_id) const override; + bool SetDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + const FX_RECT* pSrcRect, + int left, + int top, + int blend_type) override; + bool StretchDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + uint32_t flags, + int blend_type) override; + bool StartDIBits(const CFX_DIBSource* pBitmap, + int bitmap_alpha, + uint32_t color, + const CFX_Matrix* pMatrix, + uint32_t render_flags, + void*& handle, + int blend_type) override; + bool DrawDeviceText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t color) override; + + const int m_HorzSize; + const int m_VertSize; +}; + +class CPSPrinterDriver : public IFX_RenderDeviceDriver { + public: + CPSPrinterDriver(HDC hDC, int ps_level, bool bCmykOutput); + ~CPSPrinterDriver() override; + + protected: + // IFX_RenderDeviceDriver + int GetDeviceCaps(int caps_id) const override; + bool StartRendering() override; + void EndRendering() override; + void SaveState() override; + void RestoreState(bool bKeepSaved) override; + bool SetClip_PathFill(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + int fill_mode) override; + bool SetClip_PathStroke(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState) override; + bool DrawPath(const CFX_PathData* pPathData, + const CFX_Matrix* pObject2Device, + const CFX_GraphStateData* pGraphState, + uint32_t fill_color, + uint32_t stroke_color, + int fill_mode, + int blend_type) override; + bool GetClipBox(FX_RECT* pRect) override; + bool SetDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + const FX_RECT* pSrcRect, + int left, + int top, + int blend_type) override; + bool StretchDIBits(const CFX_DIBSource* pBitmap, + uint32_t color, + int dest_left, + int dest_top, + int dest_width, + int dest_height, + const FX_RECT* pClipRect, + uint32_t flags, + int blend_type) override; + bool StartDIBits(const CFX_DIBSource* pBitmap, + int bitmap_alpha, + uint32_t color, + const CFX_Matrix* pMatrix, + uint32_t render_flags, + void*& handle, + int blend_type) override; + bool DrawDeviceText(int nChars, + const FXTEXT_CHARPOS* pCharPos, + CFX_Font* pFont, + const CFX_Matrix* pObject2Device, + FX_FLOAT font_size, + uint32_t color) override; + void* GetPlatformSurface() const override; + + HDC m_hDC; + bool m_bCmykOutput; + int m_Width; + int m_Height; + int m_nBitsPerPixel; + int m_HorzSize; + int m_VertSize; + std::unique_ptr m_pPSOutput; + CFX_PSRenderer m_PSRenderer; +}; + +#endif // CORE_FXGE_WIN32_WIN32_INT_H_ diff --git a/modules/pdfium/pdfium/docs/getting-started.md b/modules/pdfium/pdfium/docs/getting-started.md new file mode 100644 index 000000000000..b80e56683b61 --- /dev/null +++ b/modules/pdfium/pdfium/docs/getting-started.md @@ -0,0 +1,185 @@ +# Getting Started with PDFium + +[TOC] + +This guide walks through some examples of using the PDFium library. For an +example of using PDFium see the [Chromium PDF Plugin][chrome-plugin]. + +## Prerequisites + +You will need the PDFium library on your computer. You can see the +[README](/README.md) for instructions on getting and installing PDFium. + +*** note +You must compile PDFium without both V8 and XFA support for the examples +here to work. V8 can be compiled out by providing +`GYP_DEFINES="pdf_enable_v8=0 pdf_enable_xfa=0" build/gyp_pdfium`. + +See the [V8 Getting Started][pdfium-v8] guide for how to +initialize PDFium when V8 is compiled into the binary. +*** + +## PDFium Headers + +PDFium's API has been broken up over several headers. You only need to include +the headers for functionality you use in your application. The full set of +headers can be found in the [public/ folder of the repository][pdfium-public]. + +In all cases you'll need to include `fpdfview.h` as it defines the needed +methods for initialization and destruction of the library. + +## Initializing PDFium + +The first step to using PDFium is to initialize the library. Having done so, +you'll need to destroy the library when you're finished. When initializing the +library you provide the `FPDF_LIBRARY_CONFIG` parameters to +`FPDF_InitLibraryWithConfig`. + +```c +#include + +int main() { + FPDF_LIBRARY_CONFIG config; + config.version = 2; + config.m_pUserFontPaths = NULL; + config.m_pIsolate = NULL; + config.m_v8EmbedderSlot = 0; + + FPDF_InitLibraryWithConfig(&config); + + FPDF_DestroyLibrary(); + return 0; +} +``` + +Currently the `config.version` must be set to `2`. `m_pUserFontPaths` can be +used to override the font paths searched by PDFium. If you wish to use your +own font paths pass a `NULL` terminated list of `const char*` paths to use. + +`m_pIsolate` and `m_v8EmbedderSlot` are both used to configure the V8 +javascript engine. In the first case, you can provide an isolate through +`m_pIsolate` for PDFium to use to store per-isolate data. Passing `NULL` will +case PDFium to allocate a new isolate. `m_v8EmbedderSlot` is the embedder data +slot to use in the v8::Isolate to store PDFium data. The value must be between +0 and v8::Internals::kNumIsolateDataSlots. Typically, 0 is a good choice. + +For more information on using Javascript see the [V8 Getting Started][pdfium-v8] +guide. + +*** aside +PDFium is built as a set of static libraries. You'll need to specify them all on +the link line in order to compile. My build line was: + +``` +PDF_LIBS="-lpdfium -lfpdfapi -lfxge -lfpdfdoc -lfxcrt -lfx_agg \ +-lfxcodec -lfx_lpng -lfx_libopenjpeg -lfx_lcms2 -lfx_freetype -ljpeg \ +-lfx_zlib -lfdrm -lpdfwindow -lbigint -lformfiller -ljavascript \ +-lfxedit" +PDF_DIR= + +clang -I $PDF_DIR/public -o init init.c -L $PDF_DIR/out/Debug -lstdc++ -framework AppKit $PDF_LIBS +``` + +The `-framework AppKit` as needed as I'm building on a Mac. Internally PDFium +uses C++, which is why `-lstdc++` is required on the link line. +*** + +## Loading a Document + +One of the main objects in PDFium is the `FPDF_DOCUMENT`. The object will allow +access to information from PDFs. There are four ways to to create a +`FPDF_DOCUMENT`. `FPDF_CreateNewDocument` will create an empty object which +can be used to create PDFs. For more information see the +[PDF Editing Guide][pdfium-edit-guide]. + +Loading an existing document is done in one of three ways: loading from file, +loading from memory, or loading via a custom loader. In all three cases you'll +provide a `FPDF_BYTESTRING` which is the password needed to unlock the PDF, if +encrypted. If the file is not encrypted the password can be `NULL`. + +The two simplest methods are loading from file and loading from memory. To load +from file, you'll provide the name of the file to open, including extension. For +loading from memory you'll provide a data buffer containing the PDF and its +length. + +```c +FPDF_STRING test_doc = "test_doc.pdf"; +FPDF_DOCUMENT doc = FPDF_LoadDocument(test_doc, NULL); +if (!doc) { + return 1; +} + +FPDF_CloseDocument(doc); + +``` + +In all three cases, `FPDF_LoadDocument`, `FPDF_LoadMemDocument`, +`FPDF_LoadCustomDocument` a return of `NULL` indicates an error opening the +document or that the file was not found. + +You can use `FPDF_GetLastError` to determine what went wrong. + +```c +#include +#include +#include + +int main() { + FPDF_LIBRARY_CONFIG config; + config.version = 2; + config.m_pUserFontPaths = NULL; + config.m_pIsolate = NULL; + config.m_v8EmbedderSlot = 0; + + FPDF_InitLibraryWithConfig(&config); + + FPDF_DOCUMENT doc = FPDF_LoadDocument(test_doc, NULL); + if (!doc) { + unsigned long err = FPDF_GetLastError(); + fprintf(stderr, "Load pdf docs unsuccessful: "); + switch (err) { + case FPDF_ERR_SUCCESS: + fprintf(stderr, "Success"); + break; + case FPDF_ERR_UNKNOWN: + fprintf(stderr, "Unknown error"); + break; + case FPDF_ERR_FILE: + fprintf(stderr, "File not found or could not be opened"); + break; + case FPDF_ERR_FORMAT: + fprintf(stderr, "File not in PDF format or corrupted"); + break; + case FPDF_ERR_PASSWORD: + fprintf(stderr, "Password required or incorrect password"); + break; + case FPDF_ERR_SECURITY: + fprintf(stderr, "Unsupported security scheme"); + break; + case FPDF_ERR_PAGE: + fprintf(stderr, "Page not found or content error"); + break; + default: + fprintf(stderr, "Unknown error %ld", err); + } + fprintf(stderr, ".\n"); + goto EXIT; + } + + FPDF_CloseDocument(doc); +EXIT: + FPDF_DestroyLibrary(); + return 0; +``` + +While the above are simple, the preferable technique is to use a custom loader. +This makes it possible to load pieces of the document only as needed. This is +useful for loading documents over the network. + + + + +[chrome-plugin]: https://chromium.googlesource.com/chromium/src/+/master/pdf/ +[pdfium-public]: https://pdfium.googlesource.com/pdfium/+/master/public/ +[pdfium-v8]: /docs/v8-getting-started.md +[pdfium-edit-guide]: /docs/pdfium-edit-guide.md diff --git a/modules/pdfium/pdfium/docs/pdfium-edit-guide.md b/modules/pdfium/pdfium/docs/pdfium-edit-guide.md new file mode 100644 index 000000000000..21847f34f316 --- /dev/null +++ b/modules/pdfium/pdfium/docs/pdfium-edit-guide.md @@ -0,0 +1 @@ +# PDFium Edit Guide diff --git a/modules/pdfium/pdfium/docs/v8-getting-started.md b/modules/pdfium/pdfium/docs/v8-getting-started.md new file mode 100644 index 000000000000..ff8c8282e9cb --- /dev/null +++ b/modules/pdfium/pdfium/docs/v8-getting-started.md @@ -0,0 +1,2 @@ +# PDFium with V8 + diff --git a/modules/pdfium/pdfium/fpdfsdk/DEPS b/modules/pdfium/pdfium/fpdfsdk/DEPS new file mode 100644 index 000000000000..e077225b1761 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/DEPS @@ -0,0 +1,9 @@ +include_rules = [ + '+core', + '+public', + '+v8', + '+xfa/fwl', + '+xfa/fxbarcode', + '+xfa/fxfa', + '+xfa/fxgraphics', + ] diff --git a/modules/pdfium/pdfium/fpdfsdk/cba_annotiterator.cpp b/modules/pdfium/pdfium/fpdfsdk/cba_annotiterator.cpp new file mode 100644 index 000000000000..cc842babee2a --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cba_annotiterator.cpp @@ -0,0 +1,176 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cba_annotiterator.h" + +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "fpdfsdk/cpdfsdk_annot.h" +#include "fpdfsdk/cpdfsdk_pageview.h" + +namespace { + +CFX_FloatRect GetAnnotRect(const CPDFSDK_Annot* pAnnot) { + return pAnnot->GetPDFAnnot()->GetRect(); +} + +bool CompareByLeftAscending(const CPDFSDK_Annot* p1, const CPDFSDK_Annot* p2) { + return GetAnnotRect(p1).left < GetAnnotRect(p2).left; +} + +bool CompareByTopDescending(const CPDFSDK_Annot* p1, const CPDFSDK_Annot* p2) { + return GetAnnotRect(p1).top > GetAnnotRect(p2).top; +} + +} // namespace + +CBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, + CPDF_Annot::Subtype nAnnotSubtype) + : m_eTabOrder(STRUCTURE), + m_pPageView(pPageView), + m_nAnnotSubtype(nAnnotSubtype) { + CPDF_Page* pPDFPage = m_pPageView->GetPDFPage(); + CFX_ByteString sTabs = pPDFPage->m_pFormDict->GetStringFor("Tabs"); + if (sTabs == "R") + m_eTabOrder = ROW; + else if (sTabs == "C") + m_eTabOrder = COLUMN; + + GenerateResults(); +} + +CBA_AnnotIterator::~CBA_AnnotIterator() {} + +CPDFSDK_Annot* CBA_AnnotIterator::GetFirstAnnot() { + return m_Annots.empty() ? nullptr : m_Annots.front(); +} + +CPDFSDK_Annot* CBA_AnnotIterator::GetLastAnnot() { + return m_Annots.empty() ? nullptr : m_Annots.back(); +} + +CPDFSDK_Annot* CBA_AnnotIterator::GetNextAnnot(CPDFSDK_Annot* pAnnot) { + auto iter = std::find(m_Annots.begin(), m_Annots.end(), pAnnot); + if (iter == m_Annots.end()) + return nullptr; + ++iter; + if (iter == m_Annots.end()) + iter = m_Annots.begin(); + return *iter; +} + +CPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot) { + auto iter = std::find(m_Annots.begin(), m_Annots.end(), pAnnot); + if (iter == m_Annots.end()) + return nullptr; + if (iter == m_Annots.begin()) + iter = m_Annots.end(); + return *(--iter); +} + +void CBA_AnnotIterator::CollectAnnots(std::vector* pArray) { + for (auto pAnnot : m_pPageView->GetAnnotList()) { + if (pAnnot->GetAnnotSubtype() == m_nAnnotSubtype && + !pAnnot->IsSignatureWidget()) { + pArray->push_back(pAnnot); + } + } +} + +CFX_FloatRect CBA_AnnotIterator::AddToAnnotsList( + std::vector* sa, + size_t idx) { + CPDFSDK_Annot* pLeftTopAnnot = sa->at(idx); + CFX_FloatRect rcLeftTop = GetAnnotRect(pLeftTopAnnot); + m_Annots.push_back(pLeftTopAnnot); + sa->erase(sa->begin() + idx); + return rcLeftTop; +} + +void CBA_AnnotIterator::AddSelectedToAnnots(std::vector* sa, + std::vector* aSelect) { + for (size_t i = 0; i < aSelect->size(); ++i) + m_Annots.push_back(sa->at(aSelect->at(i))); + + for (int i = aSelect->size() - 1; i >= 0; --i) + sa->erase(sa->begin() + aSelect->at(i)); +} + +void CBA_AnnotIterator::GenerateResults() { + switch (m_eTabOrder) { + case STRUCTURE: + CollectAnnots(&m_Annots); + break; + + case ROW: { + std::vector sa; + CollectAnnots(&sa); + std::sort(sa.begin(), sa.end(), CompareByLeftAscending); + + while (!sa.empty()) { + int nLeftTopIndex = -1; + FX_FLOAT fTop = 0.0f; + for (int i = sa.size() - 1; i >= 0; i--) { + CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); + if (rcAnnot.top > fTop) { + nLeftTopIndex = i; + fTop = rcAnnot.top; + } + } + if (nLeftTopIndex < 0) + continue; + + CFX_FloatRect rcLeftTop = AddToAnnotsList(&sa, nLeftTopIndex); + + std::vector aSelect; + for (size_t i = 0; i < sa.size(); ++i) { + CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); + FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f; + if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top) + aSelect.push_back(i); + } + AddSelectedToAnnots(&sa, &aSelect); + } + break; + } + + case COLUMN: { + std::vector sa; + CollectAnnots(&sa); + std::sort(sa.begin(), sa.end(), CompareByTopDescending); + + while (!sa.empty()) { + int nLeftTopIndex = -1; + FX_FLOAT fLeft = -1.0f; + for (int i = sa.size() - 1; i >= 0; --i) { + CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); + if (fLeft < 0) { + nLeftTopIndex = 0; + fLeft = rcAnnot.left; + } else if (rcAnnot.left < fLeft) { + nLeftTopIndex = i; + fLeft = rcAnnot.left; + } + } + if (nLeftTopIndex < 0) + continue; + + CFX_FloatRect rcLeftTop = AddToAnnotsList(&sa, nLeftTopIndex); + + std::vector aSelect; + for (size_t i = 0; i < sa.size(); ++i) { + CFX_FloatRect rcAnnot = GetAnnotRect(sa[i]); + FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f; + if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right) + aSelect.push_back(i); + } + AddSelectedToAnnots(&sa, &aSelect); + } + break; + } + } +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cba_annotiterator.h b/modules/pdfium/pdfium/fpdfsdk/cba_annotiterator.h new file mode 100644 index 000000000000..5cbe8e3d5712 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cba_annotiterator.h @@ -0,0 +1,45 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CBA_ANNOTITERATOR_H_ +#define FPDFSDK_CBA_ANNOTITERATOR_H_ + +#include + +#include "core/fpdfdoc/cpdf_annot.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" + +class CPDFSDK_Annot; +class CPDFSDK_PageView; + +class CBA_AnnotIterator { + public: + enum TabOrder { STRUCTURE = 0, ROW, COLUMN }; + + CBA_AnnotIterator(CPDFSDK_PageView* pPageView, + CPDF_Annot::Subtype nAnnotSubtype); + ~CBA_AnnotIterator(); + + CPDFSDK_Annot* GetFirstAnnot(); + CPDFSDK_Annot* GetLastAnnot(); + CPDFSDK_Annot* GetNextAnnot(CPDFSDK_Annot* pAnnot); + CPDFSDK_Annot* GetPrevAnnot(CPDFSDK_Annot* pAnnot); + + private: + void GenerateResults(); + void CollectAnnots(std::vector* pArray); + CFX_FloatRect AddToAnnotsList(std::vector* sa, size_t idx); + void AddSelectedToAnnots(std::vector* sa, + std::vector* aSelect); + + TabOrder m_eTabOrder; + CPDFSDK_PageView* m_pPageView; + CPDF_Annot::Subtype m_nAnnotSubtype; + std::vector m_Annots; +}; + +#endif // FPDFSDK_CBA_ANNOTITERATOR_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cfx_systemhandler.cpp b/modules/pdfium/pdfium/fpdfsdk/cfx_systemhandler.cpp new file mode 100644 index 000000000000..b6dc19d48f29 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cfx_systemhandler.cpp @@ -0,0 +1,141 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cfx_systemhandler.h" + +#include + +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fxge/cfx_fontmapper.h" +#include "core/fxge/cfx_fontmgr.h" +#include "core/fxge/cfx_gemodule.h" +#include "fpdfsdk/cpdfsdk_annot.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/formfiller/cffl_formfiller.h" + +namespace { + +int CharSet2CP(int charset) { + if (charset == FXFONT_SHIFTJIS_CHARSET) + return 932; + if (charset == FXFONT_GB2312_CHARSET) + return 936; + if (charset == FXFONT_HANGUL_CHARSET) + return 949; + if (charset == FXFONT_CHINESEBIG5_CHARSET) + return 950; + return 0; +} + +} // namespace + +void CFX_SystemHandler::InvalidateRect(CPDFSDK_Widget* widget, FX_RECT rect) { + CPDFSDK_PageView* pPageView = widget->GetPageView(); + UnderlyingPageType* pPage = widget->GetUnderlyingPage(); + if (!pPage || !pPageView) + return; + + CFX_Matrix page2device; + pPageView->GetCurrentMatrix(page2device); + + CFX_Matrix device2page; + device2page.SetReverse(page2device); + + CFX_PointF left_top = device2page.Transform(CFX_PointF( + static_cast(rect.left), static_cast(rect.top))); + CFX_PointF right_bottom = device2page.Transform(CFX_PointF( + static_cast(rect.right), static_cast(rect.bottom))); + + CFX_FloatRect rcPDF(left_top.x, right_bottom.y, right_bottom.x, left_top.y); + rcPDF.Normalize(); + m_pFormFillEnv->Invalidate(pPage, rcPDF.ToFxRect()); +} + +void CFX_SystemHandler::OutputSelectedRect(CFFL_FormFiller* pFormFiller, + CFX_FloatRect& rect) { + if (!pFormFiller) + return; + + CFX_PointF ptA = pFormFiller->PWLtoFFL(CFX_PointF(rect.left, rect.bottom)); + CFX_PointF ptB = pFormFiller->PWLtoFFL(CFX_PointF(rect.right, rect.top)); + + CPDFSDK_Annot* pAnnot = pFormFiller->GetSDKAnnot(); + UnderlyingPageType* pPage = pAnnot->GetUnderlyingPage(); + ASSERT(pPage); + + m_pFormFillEnv->OutputSelectedRect(pPage, + CFX_FloatRect(ptA.x, ptA.y, ptB.x, ptB.y)); +} + +bool CFX_SystemHandler::IsSelectionImplemented() const { + if (!m_pFormFillEnv) + return false; + + FPDF_FORMFILLINFO* pInfo = m_pFormFillEnv->GetFormFillInfo(); + return pInfo && pInfo->FFI_OutputSelectedRect; +} + +void CFX_SystemHandler::SetCursor(int32_t nCursorType) { + m_pFormFillEnv->SetCursor(nCursorType); +} + +bool CFX_SystemHandler::FindNativeTrueTypeFont(CFX_ByteString sFontFaceName) { + CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); + if (!pFontMgr) + return false; + + CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper(); + if (!pFontMapper) + return false; + + if (pFontMapper->m_InstalledTTFonts.empty()) + pFontMapper->LoadInstalledFonts(); + + for (const auto& font : pFontMapper->m_InstalledTTFonts) { + if (font.Compare(sFontFaceName.AsStringC())) + return true; + } + for (const auto& fontPair : pFontMapper->m_LocalizedTTFonts) { + if (fontPair.first.Compare(sFontFaceName.AsStringC())) + return true; + } + return false; +} + +CPDF_Font* CFX_SystemHandler::AddNativeTrueTypeFontToPDF( + CPDF_Document* pDoc, + CFX_ByteString sFontFaceName, + uint8_t nCharset) { + if (!pDoc) + return nullptr; + + std::unique_ptr pFXFont(new CFX_Font); + pFXFont->LoadSubst(sFontFaceName, true, 0, 0, 0, CharSet2CP(nCharset), false); + return pDoc->AddFont(pFXFont.get(), nCharset, false); +} + +int32_t CFX_SystemHandler::SetTimer(int32_t uElapse, + TimerCallback lpTimerFunc) { + return m_pFormFillEnv->SetTimer(uElapse, lpTimerFunc); +} + +void CFX_SystemHandler::KillTimer(int32_t nID) { + m_pFormFillEnv->KillTimer(nID); +} + +bool CFX_SystemHandler::IsSHIFTKeyDown(uint32_t nFlag) const { + return !!m_pFormFillEnv->IsSHIFTKeyDown(nFlag); +} + +bool CFX_SystemHandler::IsCTRLKeyDown(uint32_t nFlag) const { + return !!m_pFormFillEnv->IsCTRLKeyDown(nFlag); +} + +bool CFX_SystemHandler::IsALTKeyDown(uint32_t nFlag) const { + return !!m_pFormFillEnv->IsALTKeyDown(nFlag); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cfx_systemhandler.h b/modules/pdfium/pdfium/fpdfsdk/cfx_systemhandler.h new file mode 100644 index 000000000000..82cfc531ca2b --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cfx_systemhandler.h @@ -0,0 +1,78 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CFX_SYSTEMHANDLER_H_ +#define FPDFSDK_CFX_SYSTEMHANDLER_H_ + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_system.h" + +using TimerCallback = void (*)(int32_t idEvent); + +struct FX_SYSTEMTIME { + FX_SYSTEMTIME() + : wYear(0), + wMonth(0), + wDayOfWeek(0), + wDay(0), + wHour(0), + wMinute(0), + wSecond(0), + wMilliseconds(0) {} + + uint16_t wYear; + uint16_t wMonth; + uint16_t wDayOfWeek; + uint16_t wDay; + uint16_t wHour; + uint16_t wMinute; + uint16_t wSecond; + uint16_t wMilliseconds; +}; + +// Cursor style. These must match the values in public/fpdf_formfill.h +#define FXCT_ARROW 0 +#define FXCT_NESW 1 +#define FXCT_NWSE 2 +#define FXCT_VBEAM 3 +#define FXCT_HBEAM 4 +#define FXCT_HAND 5 + +class CFFL_FormFiller; +class CPDF_Document; +class CPDF_Font; +class CPDFSDK_FormFillEnvironment; +class CPDFSDK_Widget; + +class CFX_SystemHandler { + public: + explicit CFX_SystemHandler(CPDFSDK_FormFillEnvironment* pFormFillEnv) + : m_pFormFillEnv(pFormFillEnv) {} + ~CFX_SystemHandler() {} + + void InvalidateRect(CPDFSDK_Widget* widget, FX_RECT rect); + void OutputSelectedRect(CFFL_FormFiller* pFormFiller, CFX_FloatRect& rect); + bool IsSelectionImplemented() const; + + void SetCursor(int32_t nCursorType); + + bool FindNativeTrueTypeFont(CFX_ByteString sFontFaceName); + CPDF_Font* AddNativeTrueTypeFontToPDF(CPDF_Document* pDoc, + CFX_ByteString sFontFaceName, + uint8_t nCharset); + + int32_t SetTimer(int32_t uElapse, TimerCallback lpTimerFunc); + void KillTimer(int32_t nID); + + bool IsSHIFTKeyDown(uint32_t nFlag) const; + bool IsCTRLKeyDown(uint32_t nFlag) const; + bool IsALTKeyDown(uint32_t nFlag) const; + + private: + CPDFSDK_FormFillEnvironment* const m_pFormFillEnv; +}; + +#endif // FPDFSDK_CFX_SYSTEMHANDLER_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annot.cpp b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annot.cpp new file mode 100644 index 000000000000..4dcce4846534 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annot.cpp @@ -0,0 +1,98 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cpdfsdk_annot.h" + +#include + +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "third_party/base/stl_util.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#endif // PDF_ENABLE_XFA + +namespace { + +const float kMinWidth = 1.0f; +const float kMinHeight = 1.0f; + +} // namespace + +CPDFSDK_Annot::CPDFSDK_Annot(CPDFSDK_PageView* pPageView) + : m_pPageView(pPageView), m_bSelected(false) {} + +CPDFSDK_Annot::~CPDFSDK_Annot() {} + +#ifdef PDF_ENABLE_XFA + +bool CPDFSDK_Annot::IsXFAField() { + return false; +} + +CXFA_FFWidget* CPDFSDK_Annot::GetXFAWidget() const { + return nullptr; +} + +CPDFXFA_Page* CPDFSDK_Annot::GetPDFXFAPage() { + return m_pPageView ? m_pPageView->GetPDFXFAPage() : nullptr; +} + +#endif // PDF_ENABLE_XFA + +FX_FLOAT CPDFSDK_Annot::GetMinWidth() const { + return kMinWidth; +} + +FX_FLOAT CPDFSDK_Annot::GetMinHeight() const { + return kMinHeight; +} + +int CPDFSDK_Annot::GetLayoutOrder() const { + return 5; +} + +CPDF_Annot* CPDFSDK_Annot::GetPDFAnnot() const { + return nullptr; +} + +CPDF_Annot::Subtype CPDFSDK_Annot::GetAnnotSubtype() const { + return CPDF_Annot::Subtype::UNKNOWN; +} + +bool CPDFSDK_Annot::IsSignatureWidget() const { + return false; +} + +void CPDFSDK_Annot::SetRect(const CFX_FloatRect& rect) {} + +CFX_FloatRect CPDFSDK_Annot::GetRect() const { + return CFX_FloatRect(); +} + +void CPDFSDK_Annot::Annot_OnDraw(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + CPDF_RenderOptions* pOptions) {} + +bool CPDFSDK_Annot::IsSelected() { + return m_bSelected; +} + +void CPDFSDK_Annot::SetSelected(bool bSelected) { + m_bSelected = bSelected; +} + +UnderlyingPageType* CPDFSDK_Annot::GetUnderlyingPage() { +#ifdef PDF_ENABLE_XFA + return GetPDFXFAPage(); +#else // PDF_ENABLE_XFA + return GetPDFPage(); +#endif // PDF_ENABLE_XFA +} + +CPDF_Page* CPDFSDK_Annot::GetPDFPage() { + return m_pPageView ? m_pPageView->GetPDFPage() : nullptr; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annot.h b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annot.h new file mode 100644 index 000000000000..36e7b56612ac --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annot.h @@ -0,0 +1,65 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CPDFSDK_ANNOT_H_ +#define FPDFSDK_CPDFSDK_ANNOT_H_ + +#include "core/fpdfdoc/cpdf_aaction.h" +#include "core/fpdfdoc/cpdf_annot.h" +#include "core/fpdfdoc/cpdf_defaultappearance.h" +#include "core/fxcrt/cfx_observable.h" +#include "core/fxcrt/fx_basic.h" +#include "fpdfsdk/cfx_systemhandler.h" +#include "fpdfsdk/fsdk_common.h" +#include "fpdfsdk/fsdk_define.h" + +class CFX_Matrix; +class CFX_RenderDevice; +class CPDF_Page; +class CPDF_RenderOptions; +class CPDFSDK_PageView; + +class CPDFSDK_Annot : public CFX_Observable { + public: + explicit CPDFSDK_Annot(CPDFSDK_PageView* pPageView); + virtual ~CPDFSDK_Annot(); + +#ifdef PDF_ENABLE_XFA + virtual bool IsXFAField(); + virtual CXFA_FFWidget* GetXFAWidget() const; +#endif // PDF_ENABLE_XFA + + virtual FX_FLOAT GetMinWidth() const; + virtual FX_FLOAT GetMinHeight() const; + virtual int GetLayoutOrder() const; + virtual CPDF_Annot* GetPDFAnnot() const; + virtual CPDF_Annot::Subtype GetAnnotSubtype() const; + virtual bool IsSignatureWidget() const; + virtual CFX_FloatRect GetRect() const; + + virtual void SetRect(const CFX_FloatRect& rect); + virtual void Annot_OnDraw(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + CPDF_RenderOptions* pOptions); + + UnderlyingPageType* GetUnderlyingPage(); + CPDF_Page* GetPDFPage(); +#ifdef PDF_ENABLE_XFA + CPDFXFA_Page* GetPDFXFAPage(); +#endif // PDF_ENABLE_XFA + + void SetPage(CPDFSDK_PageView* pPageView); + CPDFSDK_PageView* GetPageView() const { return m_pPageView; } + + bool IsSelected(); + void SetSelected(bool bSelected); + + protected: + CPDFSDK_PageView* m_pPageView; + bool m_bSelected; +}; + +#endif // FPDFSDK_CPDFSDK_ANNOT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annothandlermgr.cpp b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annothandlermgr.cpp new file mode 100644 index 000000000000..c4990674ded1 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annothandlermgr.cpp @@ -0,0 +1,309 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cpdfsdk_annothandlermgr.h" + +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfdoc/cpdf_annot.h" +#include "fpdfsdk/cba_annotiterator.h" +#include "fpdfsdk/cpdfsdk_annot.h" +#include "fpdfsdk/cpdfsdk_baannot.h" +#include "fpdfsdk/cpdfsdk_baannothandler.h" +#include "fpdfsdk/cpdfsdk_datetime.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/cpdfsdk_widgethandler.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/cpdfsdk_xfawidgethandler.h" +#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" +#include "xfa/fxfa/xfa_ffpageview.h" +#include "xfa/fxfa/xfa_ffwidget.h" +#endif // PDF_ENABLE_XFA + +CPDFSDK_AnnotHandlerMgr::CPDFSDK_AnnotHandlerMgr( + CPDFSDK_FormFillEnvironment* pFormFillEnv) + : m_pBAAnnotHandler(new CPDFSDK_BAAnnotHandler()), + m_pWidgetHandler(new CPDFSDK_WidgetHandler(pFormFillEnv)), +#ifdef PDF_ENABLE_XFA + m_pXFAWidgetHandler(new CPDFSDK_XFAWidgetHandler(pFormFillEnv)), +#endif // PDF_ENABLE_XFA + m_pFormFillEnv(pFormFillEnv) { + m_pWidgetHandler->SetFormFiller(m_pFormFillEnv->GetInteractiveFormFiller()); +} + +CPDFSDK_AnnotHandlerMgr::~CPDFSDK_AnnotHandlerMgr() {} + +CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CPDF_Annot* pAnnot, + CPDFSDK_PageView* pPageView) { + ASSERT(pPageView); + return GetAnnotHandler(pAnnot->GetSubtype())->NewAnnot(pAnnot, pPageView); +} + +#ifdef PDF_ENABLE_XFA +CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CXFA_FFWidget* pAnnot, + CPDFSDK_PageView* pPageView) { + ASSERT(pAnnot); + ASSERT(pPageView); + + return GetAnnotHandler(CPDF_Annot::Subtype::XFAWIDGET) + ->NewAnnot(pAnnot, pPageView); +} +#endif // PDF_ENABLE_XFA + +void CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot) { + IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot); + pAnnotHandler->ReleaseAnnot(pAnnot); +} + +void CPDFSDK_AnnotHandlerMgr::Annot_OnCreate(CPDFSDK_Annot* pAnnot) { + CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); + + CPDFSDK_DateTime curTime; + pPDFAnnot->GetAnnotDict()->SetNewFor( + "M", curTime.ToPDFDateTimeString(), false); + pPDFAnnot->GetAnnotDict()->SetNewFor("F", 0); +} + +void CPDFSDK_AnnotHandlerMgr::Annot_OnLoad(CPDFSDK_Annot* pAnnot) { + ASSERT(pAnnot); + GetAnnotHandler(pAnnot)->OnLoad(pAnnot); +} + +IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler( + CPDFSDK_Annot* pAnnot) const { + return GetAnnotHandler(pAnnot->GetAnnotSubtype()); +} + +IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler( + CPDF_Annot::Subtype nAnnotSubtype) const { + if (nAnnotSubtype == CPDF_Annot::Subtype::WIDGET) + return m_pWidgetHandler.get(); + +#ifdef PDF_ENABLE_XFA + if (nAnnotSubtype == CPDF_Annot::Subtype::XFAWIDGET) + return m_pXFAWidgetHandler.get(); +#endif // PDF_ENABLE_XFA + + return m_pBAAnnotHandler.get(); +} + +void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + bool bDrawAnnots) { + ASSERT(pAnnot); + GetAnnotHandler(pAnnot)->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, + bDrawAnnots); +} + +bool CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDown( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + ASSERT(*pAnnot); + return GetAnnotHandler(pAnnot->Get()) + ->OnLButtonDown(pPageView, pAnnot, nFlags, point); +} + +bool CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonUp( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + ASSERT(*pAnnot); + return GetAnnotHandler(pAnnot->Get()) + ->OnLButtonUp(pPageView, pAnnot, nFlags, point); +} + +bool CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDblClk( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + ASSERT(*pAnnot); + return GetAnnotHandler(pAnnot->Get()) + ->OnLButtonDblClk(pPageView, pAnnot, nFlags, point); +} + +bool CPDFSDK_AnnotHandlerMgr::Annot_OnMouseMove( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + ASSERT(*pAnnot); + return GetAnnotHandler(pAnnot->Get()) + ->OnMouseMove(pPageView, pAnnot, nFlags, point); +} + +bool CPDFSDK_AnnotHandlerMgr::Annot_OnMouseWheel( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_PointF& point) { + ASSERT(*pAnnot); + return GetAnnotHandler(pAnnot->Get()) + ->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, point); +} + +bool CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonDown( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + ASSERT(*pAnnot); + return GetAnnotHandler(pAnnot->Get()) + ->OnRButtonDown(pPageView, pAnnot, nFlags, point); +} + +bool CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonUp( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + ASSERT(*pAnnot); + return GetAnnotHandler(pAnnot->Get()) + ->OnRButtonUp(pPageView, pAnnot, nFlags, point); +} + +void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseEnter( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + ASSERT(*pAnnot); + GetAnnotHandler(pAnnot->Get())->OnMouseEnter(pPageView, pAnnot, nFlag); +} + +void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseExit( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + ASSERT(*pAnnot); + GetAnnotHandler(pAnnot->Get())->OnMouseExit(pPageView, pAnnot, nFlag); +} + +bool CPDFSDK_AnnotHandlerMgr::Annot_OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) { + return GetAnnotHandler(pAnnot)->OnChar(pAnnot, nChar, nFlags); +} + +bool CPDFSDK_AnnotHandlerMgr::Annot_OnKeyDown(CPDFSDK_Annot* pAnnot, + int nKeyCode, + int nFlag) { + if (m_pFormFillEnv->IsCTRLKeyDown(nFlag) || + m_pFormFillEnv->IsALTKeyDown(nFlag)) { + return GetAnnotHandler(pAnnot)->OnKeyDown(pAnnot, nKeyCode, nFlag); + } + + CPDFSDK_PageView* pPage = pAnnot->GetPageView(); + CPDFSDK_Annot* pFocusAnnot = pPage->GetFocusAnnot(); + if (pFocusAnnot && (nKeyCode == FWL_VKEY_Tab)) { + CPDFSDK_Annot::ObservedPtr pNext( + GetNextAnnot(pFocusAnnot, !m_pFormFillEnv->IsSHIFTKeyDown(nFlag))); + if (pNext && pNext.Get() != pFocusAnnot) { + pPage->GetFormFillEnv()->SetFocusAnnot(&pNext); + return true; + } + } + + return GetAnnotHandler(pAnnot)->OnKeyDown(pAnnot, nKeyCode, nFlag); +} + +bool CPDFSDK_AnnotHandlerMgr::Annot_OnKeyUp(CPDFSDK_Annot* pAnnot, + int nKeyCode, + int nFlag) { + return false; +} + +bool CPDFSDK_AnnotHandlerMgr::Annot_OnSetFocus( + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + ASSERT(*pAnnot); + return GetAnnotHandler(pAnnot->Get())->OnSetFocus(pAnnot, nFlag); +} + +bool CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus( + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + ASSERT(*pAnnot); + return GetAnnotHandler(pAnnot->Get())->OnKillFocus(pAnnot, nFlag); +} + +#ifdef PDF_ENABLE_XFA +bool CPDFSDK_AnnotHandlerMgr::Annot_OnChangeFocus( + CPDFSDK_Annot::ObservedPtr* pSetAnnot, + CPDFSDK_Annot::ObservedPtr* pKillAnnot) { + bool bXFA = (*pSetAnnot && (*pSetAnnot)->GetXFAWidget()) || + (*pKillAnnot && (*pKillAnnot)->GetXFAWidget()); + + if (bXFA) { + if (IPDFSDK_AnnotHandler* pXFAAnnotHandler = + GetAnnotHandler(CPDF_Annot::Subtype::XFAWIDGET)) + return pXFAAnnotHandler->OnXFAChangedFocus(pKillAnnot, pSetAnnot); + } + + return true; +} +#endif // PDF_ENABLE_XFA + +CFX_FloatRect CPDFSDK_AnnotHandlerMgr::Annot_OnGetViewBBox( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) { + ASSERT(pAnnot); + return GetAnnotHandler(pAnnot)->GetViewBBox(pPageView, pAnnot); +} + +bool CPDFSDK_AnnotHandlerMgr::Annot_OnHitTest(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + const CFX_PointF& point) { + ASSERT(pAnnot); + IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot); + if (pAnnotHandler->CanAnswer(pAnnot)) + return pAnnotHandler->HitTest(pPageView, pAnnot, point); + + return false; +} + +CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot, + bool bNext) { +#ifdef PDF_ENABLE_XFA + CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView(); + CPDFXFA_Page* pPage = pPageView->GetPDFXFAPage(); + if (!pPage) + return nullptr; + if (pPage->GetPDFPage()) { // for pdf annots. + CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), + pSDKAnnot->GetAnnotSubtype()); + CPDFSDK_Annot* pNext = + bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot); + return pNext; + } + // for xfa annots + std::unique_ptr pWidgetIterator( + pPage->GetXFAPageView()->CreateWidgetIterator( + XFA_TRAVERSEWAY_Tranvalse, XFA_WidgetStatus_Visible | + XFA_WidgetStatus_Viewable | + XFA_WidgetStatus_Focused)); + if (!pWidgetIterator) + return nullptr; + if (pWidgetIterator->GetCurrentWidget() != pSDKAnnot->GetXFAWidget()) + pWidgetIterator->SetCurrentWidget(pSDKAnnot->GetXFAWidget()); + CXFA_FFWidget* hNextFocus = + bNext ? pWidgetIterator->MoveToNext() : pWidgetIterator->MoveToPrevious(); + if (!hNextFocus && pSDKAnnot) + hNextFocus = pWidgetIterator->MoveToFirst(); + + return pPageView->GetAnnotByXFAWidget(hNextFocus); +#else // PDF_ENABLE_XFA + CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), CPDF_Annot::Subtype::WIDGET); + return bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot); +#endif // PDF_ENABLE_XFA +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annothandlermgr.h b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annothandlermgr.h new file mode 100644 index 000000000000..cbda02cbedfa --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annothandlermgr.h @@ -0,0 +1,118 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CPDFSDK_ANNOTHANDLERMGR_H_ +#define FPDFSDK_CPDFSDK_ANNOTHANDLERMGR_H_ + +#include +#include + +#include "core/fpdfdoc/cpdf_annot.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" +#include "fpdfsdk/cpdfsdk_annot.h" + +class CFX_Matrix; +class CFX_RenderDevice; +class CPDFSDK_FormFillEnvironment; +class CPDFSDK_BAAnnotHandler; +class CPDFSDK_WidgetHandler; +class CPDFSDK_PageView; +class IPDFSDK_AnnotHandler; + +#ifdef PDF_ENABLE_XFA +class CPDFSDK_XFAWidgetHandler; +class CXFA_FFWidget; +#endif // PDF_ENABLE_XFA + +class CPDFSDK_AnnotHandlerMgr { + public: + explicit CPDFSDK_AnnotHandlerMgr(CPDFSDK_FormFillEnvironment* pApp); + ~CPDFSDK_AnnotHandlerMgr(); + + CPDFSDK_Annot* NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView); +#ifdef PDF_ENABLE_XFA + CPDFSDK_Annot* NewAnnot(CXFA_FFWidget* pAnnot, CPDFSDK_PageView* pPageView); +#endif // PDF_ENABLE_XFA + void ReleaseAnnot(CPDFSDK_Annot* pAnnot); + + void Annot_OnCreate(CPDFSDK_Annot* pAnnot); + void Annot_OnLoad(CPDFSDK_Annot* pAnnot); + + IPDFSDK_AnnotHandler* GetAnnotHandler(CPDFSDK_Annot* pAnnot) const; + void Annot_OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + bool bDrawAnnots); + + void Annot_OnMouseEnter(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags); + void Annot_OnMouseExit(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags); + bool Annot_OnLButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + bool Annot_OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + bool Annot_OnLButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + bool Annot_OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + bool Annot_OnMouseWheel(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_PointF& point); + bool Annot_OnRButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + bool Annot_OnRButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + bool Annot_OnChar(CPDFSDK_Annot* pAnnot, uint32_t nChar, uint32_t nFlags); + bool Annot_OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag); + bool Annot_OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag); + + bool Annot_OnSetFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, uint32_t nFlag); + bool Annot_OnKillFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, uint32_t nFlag); + +#ifdef PDF_ENABLE_XFA + bool Annot_OnChangeFocus(CPDFSDK_Annot::ObservedPtr* pSetAnnot, + CPDFSDK_Annot::ObservedPtr* pKillAnnot); +#endif // PDF_ENABLE_XFA + + CFX_FloatRect Annot_OnGetViewBBox(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot); + bool Annot_OnHitTest(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + const CFX_PointF& point); + + private: + IPDFSDK_AnnotHandler* GetAnnotHandler(CPDF_Annot::Subtype nSubtype) const; + CPDFSDK_Annot* GetNextAnnot(CPDFSDK_Annot* pSDKAnnot, bool bNext); + + std::unique_ptr m_pBAAnnotHandler; + std::unique_ptr m_pWidgetHandler; +#ifdef PDF_ENABLE_XFA + std::unique_ptr m_pXFAWidgetHandler; +#endif // PDF_ENABLE_XFA + + CPDFSDK_FormFillEnvironment* m_pFormFillEnv; +}; + +#endif // FPDFSDK_CPDFSDK_ANNOTHANDLERMGR_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annotiteration.cpp b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annotiteration.cpp new file mode 100644 index 000000000000..dd99ade5092f --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annotiteration.cpp @@ -0,0 +1,40 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cpdfsdk_annotiteration.h" + +#include +#include + +#include "fpdfsdk/cpdfsdk_annot.h" +#include "fpdfsdk/cpdfsdk_pageview.h" + +CPDFSDK_AnnotIteration::CPDFSDK_AnnotIteration(CPDFSDK_PageView* pPageView, + bool bReverse) { + // Copying/sorting ObservedPtrs is expensive, so do it once at the end. + std::vector copiedList = pPageView->GetAnnotList(); + std::stable_sort(copiedList.begin(), copiedList.end(), + [](const CPDFSDK_Annot* p1, const CPDFSDK_Annot* p2) { + return p1->GetLayoutOrder() < p2->GetLayoutOrder(); + }); + + CPDFSDK_Annot* pTopMostAnnot = pPageView->GetFocusAnnot(); + if (pTopMostAnnot) { + auto it = std::find(copiedList.begin(), copiedList.end(), pTopMostAnnot); + if (it != copiedList.end()) { + copiedList.erase(it); + copiedList.insert(copiedList.begin(), pTopMostAnnot); + } + } + if (bReverse) + std::reverse(copiedList.begin(), copiedList.end()); + + m_List.reserve(copiedList.size()); + for (const auto& pAnnot : copiedList) + m_List.emplace_back(pAnnot); +} + +CPDFSDK_AnnotIteration::~CPDFSDK_AnnotIteration() {} diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annotiteration.h b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annotiteration.h new file mode 100644 index 000000000000..70edfd10aec4 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_annotiteration.h @@ -0,0 +1,31 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CPDFSDK_ANNOTITERATION_H_ +#define FPDFSDK_CPDFSDK_ANNOTITERATION_H_ + +#include + +#include "fpdfsdk/cpdfsdk_annot.h" + +class CPDFSDK_PageView; + +class CPDFSDK_AnnotIteration { + public: + using const_iterator = + std::vector::const_iterator; + + CPDFSDK_AnnotIteration(CPDFSDK_PageView* pPageView, bool bReverse); + ~CPDFSDK_AnnotIteration(); + + const_iterator begin() const { return m_List.begin(); } + const_iterator end() const { return m_List.end(); } + + private: + std::vector m_List; +}; + +#endif // FPDFSDK_CPDFSDK_ANNOTITERATION_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannot.cpp b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannot.cpp new file mode 100644 index 000000000000..3eedf1502c03 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannot.cpp @@ -0,0 +1,400 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cpdfsdk_baannot.h" + +#include +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "fpdfsdk/cpdfsdk_datetime.h" +#include "fpdfsdk/cpdfsdk_pageview.h" + +CPDFSDK_BAAnnot::CPDFSDK_BAAnnot(CPDF_Annot* pAnnot, + CPDFSDK_PageView* pPageView) + : CPDFSDK_Annot(pPageView), m_pAnnot(pAnnot) {} + +CPDFSDK_BAAnnot::~CPDFSDK_BAAnnot() {} + +CPDF_Annot* CPDFSDK_BAAnnot::GetPDFAnnot() const { + return m_pAnnot; +} + +CPDF_Annot* CPDFSDK_BAAnnot::GetPDFPopupAnnot() const { + return m_pAnnot->GetPopupAnnot(); +} + +CPDF_Dictionary* CPDFSDK_BAAnnot::GetAnnotDict() const { + return m_pAnnot->GetAnnotDict(); +} + +void CPDFSDK_BAAnnot::SetRect(const CFX_FloatRect& rect) { + ASSERT(rect.right - rect.left >= GetMinWidth()); + ASSERT(rect.top - rect.bottom >= GetMinHeight()); + + m_pAnnot->GetAnnotDict()->SetRectFor("Rect", rect); +} + +CFX_FloatRect CPDFSDK_BAAnnot::GetRect() const { + return m_pAnnot->GetRect(); +} + +CPDF_Annot::Subtype CPDFSDK_BAAnnot::GetAnnotSubtype() const { + return m_pAnnot->GetSubtype(); +} + +void CPDFSDK_BAAnnot::DrawAppearance(CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + CPDF_Annot::AppearanceMode mode, + const CPDF_RenderOptions* pOptions) { + m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, + mode, pOptions); +} + +bool CPDFSDK_BAAnnot::IsAppearanceValid() { + return !!m_pAnnot->GetAnnotDict()->GetDictFor("AP"); +} + +bool CPDFSDK_BAAnnot::IsAppearanceValid(CPDF_Annot::AppearanceMode mode) { + CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDictFor("AP"); + if (!pAP) + return false; + + // Choose the right sub-ap + const FX_CHAR* ap_entry = "N"; + if (mode == CPDF_Annot::Down) + ap_entry = "D"; + else if (mode == CPDF_Annot::Rollover) + ap_entry = "R"; + if (!pAP->KeyExist(ap_entry)) + ap_entry = "N"; + + // Get the AP stream or subdirectory + CPDF_Object* psub = pAP->GetDirectObjectFor(ap_entry); + return !!psub; +} + +void CPDFSDK_BAAnnot::DrawBorder(CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + const CPDF_RenderOptions* pOptions) { + m_pAnnot->DrawBorder(pDevice, pUser2Device, pOptions); +} + +void CPDFSDK_BAAnnot::ClearCachedAP() { + m_pAnnot->ClearCachedAP(); +} + +void CPDFSDK_BAAnnot::SetContents(const CFX_WideString& sContents) { + if (sContents.IsEmpty()) { + m_pAnnot->GetAnnotDict()->RemoveFor("Contents"); + } else { + m_pAnnot->GetAnnotDict()->SetNewFor( + "Contents", PDF_EncodeText(sContents), false); + } +} + +CFX_WideString CPDFSDK_BAAnnot::GetContents() const { + return m_pAnnot->GetAnnotDict()->GetUnicodeTextFor("Contents"); +} + +void CPDFSDK_BAAnnot::SetAnnotName(const CFX_WideString& sName) { + if (sName.IsEmpty()) { + m_pAnnot->GetAnnotDict()->RemoveFor("NM"); + } else { + m_pAnnot->GetAnnotDict()->SetNewFor( + "NM", PDF_EncodeText(sName), false); + } +} + +CFX_WideString CPDFSDK_BAAnnot::GetAnnotName() const { + return m_pAnnot->GetAnnotDict()->GetUnicodeTextFor("NM"); +} + +void CPDFSDK_BAAnnot::SetModifiedDate(const FX_SYSTEMTIME& st) { + CPDFSDK_DateTime dt(st); + CFX_ByteString str = dt.ToPDFDateTimeString(); + if (str.IsEmpty()) + m_pAnnot->GetAnnotDict()->RemoveFor("M"); + else + m_pAnnot->GetAnnotDict()->SetNewFor("M", str, false); +} + +FX_SYSTEMTIME CPDFSDK_BAAnnot::GetModifiedDate() const { + FX_SYSTEMTIME systime; + CFX_ByteString str = m_pAnnot->GetAnnotDict()->GetStringFor("M"); + CPDFSDK_DateTime dt(str); + dt.ToSystemTime(systime); + return systime; +} + +void CPDFSDK_BAAnnot::SetFlags(uint32_t nFlags) { + m_pAnnot->GetAnnotDict()->SetNewFor("F", + static_cast(nFlags)); +} + +uint32_t CPDFSDK_BAAnnot::GetFlags() const { + return m_pAnnot->GetAnnotDict()->GetIntegerFor("F"); +} + +void CPDFSDK_BAAnnot::SetAppState(const CFX_ByteString& str) { + if (str.IsEmpty()) + m_pAnnot->GetAnnotDict()->RemoveFor("AS"); + else + m_pAnnot->GetAnnotDict()->SetNewFor("AS", str, false); +} + +CFX_ByteString CPDFSDK_BAAnnot::GetAppState() const { + return m_pAnnot->GetAnnotDict()->GetStringFor("AS"); +} + +void CPDFSDK_BAAnnot::SetStructParent(int key) { + m_pAnnot->GetAnnotDict()->SetNewFor("StructParent", key); +} + +int CPDFSDK_BAAnnot::GetStructParent() const { + return m_pAnnot->GetAnnotDict()->GetIntegerFor("StructParent"); +} + +// border +void CPDFSDK_BAAnnot::SetBorderWidth(int nWidth) { + CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArrayFor("Border"); + if (pBorder) { + pBorder->SetNewAt(2, nWidth); + } else { + CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictFor("BS"); + if (!pBSDict) + pBSDict = m_pAnnot->GetAnnotDict()->SetNewFor("BS"); + + pBSDict->SetNewFor("W", nWidth); + } +} + +int CPDFSDK_BAAnnot::GetBorderWidth() const { + if (CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArrayFor("Border")) + return pBorder->GetIntegerAt(2); + + if (CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictFor("BS")) + return pBSDict->GetIntegerFor("W", 1); + + return 1; +} + +void CPDFSDK_BAAnnot::SetBorderStyle(BorderStyle nStyle) { + CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictFor("BS"); + if (!pBSDict) + pBSDict = m_pAnnot->GetAnnotDict()->SetNewFor("BS"); + + switch (nStyle) { + case BorderStyle::SOLID: + pBSDict->SetNewFor("S", "S"); + break; + case BorderStyle::DASH: + pBSDict->SetNewFor("S", "D"); + break; + case BorderStyle::BEVELED: + pBSDict->SetNewFor("S", "B"); + break; + case BorderStyle::INSET: + pBSDict->SetNewFor("S", "I"); + break; + case BorderStyle::UNDERLINE: + pBSDict->SetNewFor("S", "U"); + break; + default: + break; + } +} + +BorderStyle CPDFSDK_BAAnnot::GetBorderStyle() const { + CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictFor("BS"); + if (pBSDict) { + CFX_ByteString sBorderStyle = pBSDict->GetStringFor("S", "S"); + if (sBorderStyle == "S") + return BorderStyle::SOLID; + if (sBorderStyle == "D") + return BorderStyle::DASH; + if (sBorderStyle == "B") + return BorderStyle::BEVELED; + if (sBorderStyle == "I") + return BorderStyle::INSET; + if (sBorderStyle == "U") + return BorderStyle::UNDERLINE; + } + + CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArrayFor("Border"); + if (pBorder) { + if (pBorder->GetCount() >= 4) { + CPDF_Array* pDP = pBorder->GetArrayAt(3); + if (pDP && pDP->GetCount() > 0) + return BorderStyle::DASH; + } + } + + return BorderStyle::SOLID; +} + +void CPDFSDK_BAAnnot::SetColor(FX_COLORREF color) { + CPDF_Array* pArray = m_pAnnot->GetAnnotDict()->SetNewFor("C"); + pArray->AddNew(static_cast(FXSYS_GetRValue(color)) / + 255.0f); + pArray->AddNew(static_cast(FXSYS_GetGValue(color)) / + 255.0f); + pArray->AddNew(static_cast(FXSYS_GetBValue(color)) / + 255.0f); +} + +void CPDFSDK_BAAnnot::RemoveColor() { + m_pAnnot->GetAnnotDict()->RemoveFor("C"); +} + +bool CPDFSDK_BAAnnot::GetColor(FX_COLORREF& color) const { + if (CPDF_Array* pEntry = m_pAnnot->GetAnnotDict()->GetArrayFor("C")) { + size_t nCount = pEntry->GetCount(); + if (nCount == 1) { + FX_FLOAT g = pEntry->GetNumberAt(0) * 255; + + color = FXSYS_RGB((int)g, (int)g, (int)g); + + return true; + } else if (nCount == 3) { + FX_FLOAT r = pEntry->GetNumberAt(0) * 255; + FX_FLOAT g = pEntry->GetNumberAt(1) * 255; + FX_FLOAT b = pEntry->GetNumberAt(2) * 255; + + color = FXSYS_RGB((int)r, (int)g, (int)b); + + return true; + } else if (nCount == 4) { + FX_FLOAT c = pEntry->GetNumberAt(0); + FX_FLOAT m = pEntry->GetNumberAt(1); + FX_FLOAT y = pEntry->GetNumberAt(2); + FX_FLOAT k = pEntry->GetNumberAt(3); + + FX_FLOAT r = 1.0f - std::min(1.0f, c + k); + FX_FLOAT g = 1.0f - std::min(1.0f, m + k); + FX_FLOAT b = 1.0f - std::min(1.0f, y + k); + + color = FXSYS_RGB((int)(r * 255), (int)(g * 255), (int)(b * 255)); + + return true; + } + } + + return false; +} + +void CPDFSDK_BAAnnot::WriteAppearance(const CFX_ByteString& sAPType, + const CFX_FloatRect& rcBBox, + const CFX_Matrix& matrix, + const CFX_ByteString& sContents, + const CFX_ByteString& sAPState) { + CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDictFor("AP"); + if (!pAPDict) + pAPDict = m_pAnnot->GetAnnotDict()->SetNewFor("AP"); + + CPDF_Stream* pStream = nullptr; + CPDF_Dictionary* pParentDict = nullptr; + if (sAPState.IsEmpty()) { + pParentDict = pAPDict; + pStream = pAPDict->GetStreamFor(sAPType); + } else { + CPDF_Dictionary* pAPTypeDict = pAPDict->GetDictFor(sAPType); + if (!pAPTypeDict) + pAPTypeDict = pAPDict->SetNewFor(sAPType); + + pParentDict = pAPTypeDict; + pStream = pAPTypeDict->GetStreamFor(sAPState); + } + + if (!pStream) { + CPDF_Document* pDoc = m_pPageView->GetPDFDocument(); + pStream = pDoc->NewIndirect(); + pParentDict->SetNewFor(sAPType, pDoc, pStream->GetObjNum()); + } + + CPDF_Dictionary* pStreamDict = pStream->GetDict(); + if (!pStreamDict) { + auto pNewDict = pdfium::MakeUnique( + m_pAnnot->GetDocument()->GetByteStringPool()); + pStreamDict = pNewDict.get(); + pStreamDict->SetNewFor("Type", "XObject"); + pStreamDict->SetNewFor("Subtype", "Form"); + pStreamDict->SetNewFor("FormType", 1); + pStream->InitStream(nullptr, 0, std::move(pNewDict)); + } + pStreamDict->SetMatrixFor("Matrix", matrix); + pStreamDict->SetRectFor("BBox", rcBBox); + pStream->SetData((uint8_t*)sContents.c_str(), sContents.GetLength()); +} + +bool CPDFSDK_BAAnnot::IsVisible() const { + uint32_t nFlags = GetFlags(); + return !((nFlags & ANNOTFLAG_INVISIBLE) || (nFlags & ANNOTFLAG_HIDDEN) || + (nFlags & ANNOTFLAG_NOVIEW)); +} + +CPDF_Action CPDFSDK_BAAnnot::GetAction() const { + return CPDF_Action(m_pAnnot->GetAnnotDict()->GetDictFor("A")); +} + +void CPDFSDK_BAAnnot::SetAction(const CPDF_Action& action) { + CPDF_Dictionary* pDict = action.GetDict(); + if (pDict != m_pAnnot->GetAnnotDict()->GetDictFor("A")) { + CPDF_Document* pDoc = m_pPageView->GetPDFDocument(); + if (pDict->IsInline()) + pDict = pDoc->AddIndirectObject(pDict->Clone())->AsDictionary(); + m_pAnnot->GetAnnotDict()->SetNewFor("A", pDoc, + pDict->GetObjNum()); + } +} + +void CPDFSDK_BAAnnot::RemoveAction() { + m_pAnnot->GetAnnotDict()->RemoveFor("A"); +} + +CPDF_AAction CPDFSDK_BAAnnot::GetAAction() const { + return CPDF_AAction(m_pAnnot->GetAnnotDict()->GetDictFor("AA")); +} + +void CPDFSDK_BAAnnot::SetAAction(const CPDF_AAction& aa) { + if (aa.GetDict() != m_pAnnot->GetAnnotDict()->GetDictFor("AA")) + m_pAnnot->GetAnnotDict()->SetFor("AA", pdfium::WrapUnique(aa.GetDict())); +} + +void CPDFSDK_BAAnnot::RemoveAAction() { + m_pAnnot->GetAnnotDict()->RemoveFor("AA"); +} + +CPDF_Action CPDFSDK_BAAnnot::GetAAction(CPDF_AAction::AActionType eAAT) { + CPDF_AAction AAction = GetAAction(); + if (AAction.ActionExist(eAAT)) + return AAction.GetAction(eAAT); + + if (eAAT == CPDF_AAction::ButtonUp) + return GetAction(); + + return CPDF_Action(); +} + +void CPDFSDK_BAAnnot::Annot_OnDraw(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + CPDF_RenderOptions* pOptions) { + m_pAnnot->GetAPForm(m_pPageView->GetPDFPage(), CPDF_Annot::Normal); + m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, + CPDF_Annot::Normal, nullptr); +} + +void CPDFSDK_BAAnnot::SetOpenState(bool bOpenState) { + if (CPDF_Annot* pAnnot = m_pAnnot->GetPopupAnnot()) + pAnnot->SetOpenState(bOpenState); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannot.h b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannot.h new file mode 100644 index 000000000000..2da5723eb4e6 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannot.h @@ -0,0 +1,106 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CPDFSDK_BAANNOT_H_ +#define FPDFSDK_CPDFSDK_BAANNOT_H_ + +#include "core/fpdfdoc/cpdf_aaction.h" +#include "core/fpdfdoc/cpdf_action.h" +#include "core/fpdfdoc/cpdf_annot.h" +#include "core/fpdfdoc/cpdf_defaultappearance.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "fpdfsdk/cfx_systemhandler.h" +#include "fpdfsdk/cpdfsdk_annot.h" + +class CFX_Matrix; +class CFX_RenderDevice; +class CPDF_Dictionary; +class CPDF_RenderOptions; +class CPDFSDK_PageView; + +class CPDFSDK_BAAnnot : public CPDFSDK_Annot { + public: + CPDFSDK_BAAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView); + ~CPDFSDK_BAAnnot() override; + + // CPDFSDK_Annot + CPDF_Annot::Subtype GetAnnotSubtype() const override; + void SetRect(const CFX_FloatRect& rect) override; + CFX_FloatRect GetRect() const override; + CPDF_Annot* GetPDFAnnot() const override; + void Annot_OnDraw(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + CPDF_RenderOptions* pOptions) override; + + CPDF_Dictionary* GetAnnotDict() const; + CPDF_Annot* GetPDFPopupAnnot() const; + + void SetContents(const CFX_WideString& sContents); + CFX_WideString GetContents() const; + + void SetAnnotName(const CFX_WideString& sName); + CFX_WideString GetAnnotName() const; + + void SetModifiedDate(const FX_SYSTEMTIME& st); + FX_SYSTEMTIME GetModifiedDate() const; + + void SetFlags(uint32_t nFlags); + uint32_t GetFlags() const; + + void SetAppState(const CFX_ByteString& str); + CFX_ByteString GetAppState() const; + + void SetStructParent(int key); + int GetStructParent() const; + + void SetBorderWidth(int nWidth); + int GetBorderWidth() const; + + void SetBorderStyle(BorderStyle nStyle); + BorderStyle GetBorderStyle() const; + + void SetColor(FX_COLORREF color); + void RemoveColor(); + bool GetColor(FX_COLORREF& color) const; + + bool IsVisible() const; + + CPDF_Action GetAction() const; + void SetAction(const CPDF_Action& a); + void RemoveAction(); + + CPDF_AAction GetAAction() const; + void SetAAction(const CPDF_AAction& aa); + void RemoveAAction(); + + virtual CPDF_Action GetAAction(CPDF_AAction::AActionType eAAT); + virtual bool IsAppearanceValid(); + virtual bool IsAppearanceValid(CPDF_Annot::AppearanceMode mode); + virtual void DrawAppearance(CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + CPDF_Annot::AppearanceMode mode, + const CPDF_RenderOptions* pOptions); + + void DrawBorder(CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + const CPDF_RenderOptions* pOptions); + + void ClearCachedAP(); + + void WriteAppearance(const CFX_ByteString& sAPType, + const CFX_FloatRect& rcBBox, + const CFX_Matrix& matrix, + const CFX_ByteString& sContents, + const CFX_ByteString& sAPState = ""); + + void SetOpenState(bool bState); + + protected: + CPDF_Annot* const m_pAnnot; +}; + +#endif // FPDFSDK_CPDFSDK_BAANNOT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannothandler.cpp b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannothandler.cpp new file mode 100644 index 000000000000..fa83932a8151 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannothandler.cpp @@ -0,0 +1,202 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cpdfsdk_baannothandler.h" + +#include +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfdoc/cpdf_interform.h" +#include "fpdfsdk/cpdfsdk_annot.h" +#include "fpdfsdk/cpdfsdk_baannot.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/formfiller/cffl_formfiller.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#endif // PDF_ENABLE_XFA + +namespace { + +void UpdateAnnotRects(CPDFSDK_PageView* pPageView, CPDFSDK_BAAnnot* pBAAnnot) { + std::vector rects; + rects.push_back(pBAAnnot->GetRect()); + if (CPDF_Annot* pPopupAnnot = pBAAnnot->GetPDFPopupAnnot()) + rects.push_back(pPopupAnnot->GetRect()); + + // Make the rects round up to avoid https://crbug.com/662804 + for (CFX_FloatRect& rect : rects) + rect.Inflate(1, 1); + + pPageView->UpdateRects(rects); +} + +} // namespace + +CPDFSDK_BAAnnotHandler::CPDFSDK_BAAnnotHandler() {} + +CPDFSDK_BAAnnotHandler::~CPDFSDK_BAAnnotHandler() {} + +bool CPDFSDK_BAAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot) { + return false; +} + +CPDFSDK_Annot* CPDFSDK_BAAnnotHandler::NewAnnot(CPDF_Annot* pAnnot, + CPDFSDK_PageView* pPage) { + return new CPDFSDK_BAAnnot(pAnnot, pPage); +} + +#ifdef PDF_ENABLE_XFA +CPDFSDK_Annot* CPDFSDK_BAAnnotHandler::NewAnnot(CXFA_FFWidget* hWidget, + CPDFSDK_PageView* pPage) { + return nullptr; +} +#endif // PDF_ENABLE_XFA + +void CPDFSDK_BAAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) { + delete pAnnot; +} + +void CPDFSDK_BAAnnotHandler::OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + bool bDrawAnnots) { +#ifdef PDF_ENABLE_XFA + if (pAnnot->IsXFAField()) + return; +#endif // PDF_ENABLE_XFA + if (bDrawAnnots && pAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::POPUP) { + static_cast(pAnnot)->DrawAppearance( + pDevice, pUser2Device, CPDF_Annot::Normal, nullptr); + } +} + +void CPDFSDK_BAAnnotHandler::OnMouseEnter(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + CPDFSDK_BAAnnot* pBAAnnot = static_cast(pAnnot->Get()); + pBAAnnot->SetOpenState(true); + UpdateAnnotRects(pPageView, pBAAnnot); +} + +void CPDFSDK_BAAnnotHandler::OnMouseExit(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + CPDFSDK_BAAnnot* pBAAnnot = static_cast(pAnnot->Get()); + pBAAnnot->SetOpenState(false); + UpdateAnnotRects(pPageView, pBAAnnot); +} + +bool CPDFSDK_BAAnnotHandler::OnLButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + return false; +} + +bool CPDFSDK_BAAnnotHandler::OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + return false; +} + +bool CPDFSDK_BAAnnotHandler::OnLButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + return false; +} + +bool CPDFSDK_BAAnnotHandler::OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + return false; +} + +bool CPDFSDK_BAAnnotHandler::OnMouseWheel(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_PointF& point) { + return false; +} + +bool CPDFSDK_BAAnnotHandler::OnRButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + return false; +} + +bool CPDFSDK_BAAnnotHandler::OnRButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + return false; +} + +bool CPDFSDK_BAAnnotHandler::OnRButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + return false; +} + +bool CPDFSDK_BAAnnotHandler::OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) { + return false; +} + +bool CPDFSDK_BAAnnotHandler::OnKeyDown(CPDFSDK_Annot* pAnnot, + int nKeyCode, + int nFlag) { + return false; +} + +bool CPDFSDK_BAAnnotHandler::OnKeyUp(CPDFSDK_Annot* pAnnot, + int nKeyCode, + int nFlag) { + return false; +} + +void CPDFSDK_BAAnnotHandler::OnLoad(CPDFSDK_Annot* pAnnot) {} + +bool CPDFSDK_BAAnnotHandler::OnSetFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + return false; +} + +bool CPDFSDK_BAAnnotHandler::OnKillFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + return false; +} + +#ifdef PDF_ENABLE_XFA +bool CPDFSDK_BAAnnotHandler::OnXFAChangedFocus( + CPDFSDK_Annot::ObservedPtr* pOldAnnot, + CPDFSDK_Annot::ObservedPtr* pNewAnnot) { + return true; +} +#endif // PDF_ENABLE_XFA + +CFX_FloatRect CPDFSDK_BAAnnotHandler::GetViewBBox(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) { + return pAnnot->GetRect(); +} + +bool CPDFSDK_BAAnnotHandler::HitTest(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + const CFX_PointF& point) { + ASSERT(pPageView); + ASSERT(pAnnot); + return GetViewBBox(pPageView, pAnnot).Contains(point); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannothandler.h b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannothandler.h new file mode 100644 index 000000000000..d5f170f45280 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_baannothandler.h @@ -0,0 +1,100 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CPDFSDK_BAANNOTHANDLER_H_ +#define FPDFSDK_CPDFSDK_BAANNOTHANDLER_H_ + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" +#include "fpdfsdk/ipdfsdk_annothandler.h" + +class CFFL_InteractiveFormFiller; +class CFX_Matrix; +class CFX_RenderDevice; +class CPDF_Annot; +class CPDFSDK_FormFillEnvironment; +class CPDFSDK_Annot; +class CPDFSDK_PageView; + +#ifdef PDF_ENABLE_XFA +class CXFA_FFWidget; +#endif // PDF_ENABLE_XFA + +class CPDFSDK_BAAnnotHandler : public IPDFSDK_AnnotHandler { + public: + CPDFSDK_BAAnnotHandler(); + ~CPDFSDK_BAAnnotHandler() override; + + bool CanAnswer(CPDFSDK_Annot* pAnnot) override; + CPDFSDK_Annot* NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage) override; +#ifdef PDF_ENABLE_XFA + CPDFSDK_Annot* NewAnnot(CXFA_FFWidget* hWidget, + CPDFSDK_PageView* pPage) override; +#endif // PDF_ENABLE_XFA + void ReleaseAnnot(CPDFSDK_Annot* pAnnot) override; + CFX_FloatRect GetViewBBox(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) override; + bool HitTest(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + const CFX_PointF& point) override; + void OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + bool bDrawAnnots) override; + void OnLoad(CPDFSDK_Annot* pAnnot) override; + + void OnMouseEnter(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) override; + void OnMouseExit(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) override; + bool OnLButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnLButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnMouseWheel(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_PointF& point) override; + bool OnRButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnRButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnRButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnChar(CPDFSDK_Annot* pAnnot, uint32_t nChar, uint32_t nFlags) override; + bool OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) override; + bool OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) override; + bool OnSetFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, uint32_t nFlag) override; + bool OnKillFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, uint32_t nFlag) override; +#ifdef PDF_ENABLE_XFA + bool OnXFAChangedFocus(CPDFSDK_Annot::ObservedPtr* pOldAnnot, + CPDFSDK_Annot::ObservedPtr* pNewAnnot) override; +#endif // PDF_ENABLE_XFA +}; + +#endif // FPDFSDK_CPDFSDK_BAANNOTHANDLER_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_datetime.cpp b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_datetime.cpp new file mode 100644 index 000000000000..72f50a6b44bc --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_datetime.cpp @@ -0,0 +1,412 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cpdfsdk_datetime.h" + +#include "core/fxcrt/fx_ext.h" + +namespace { + +int GetTimeZoneInSeconds(int8_t tzhour, uint8_t tzminute) { + return (int)tzhour * 3600 + (int)tzminute * (tzhour >= 0 ? 60 : -60); +} + +bool IsLeapYear(int16_t year) { + return ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))); +} + +uint16_t GetYearDays(int16_t year) { + return (IsLeapYear(year) ? 366 : 365); +} + +uint8_t GetMonthDays(int16_t year, uint8_t month) { + uint8_t mDays; + switch (month) { + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: + mDays = 31; + break; + + case 4: + case 6: + case 9: + case 11: + mDays = 30; + break; + + case 2: + if (IsLeapYear(year)) + mDays = 29; + else + mDays = 28; + break; + + default: + mDays = 0; + break; + } + + return mDays; +} + +} // namespace + +CPDFSDK_DateTime::CPDFSDK_DateTime() { + ResetDateTime(); +} + +CPDFSDK_DateTime::CPDFSDK_DateTime(const CFX_ByteString& dtStr) { + ResetDateTime(); + FromPDFDateTimeString(dtStr); +} + +CPDFSDK_DateTime::CPDFSDK_DateTime(const CPDFSDK_DateTime& that) + : m_year(that.m_year), + m_month(that.m_month), + m_day(that.m_day), + m_hour(that.m_hour), + m_minute(that.m_minute), + m_second(that.m_second), + m_tzHour(that.m_tzHour), + m_tzMinute(that.m_tzMinute) {} + +CPDFSDK_DateTime::CPDFSDK_DateTime(const FX_SYSTEMTIME& st) { + tzset(); + + m_year = static_cast(st.wYear); + m_month = static_cast(st.wMonth); + m_day = static_cast(st.wDay); + m_hour = static_cast(st.wHour); + m_minute = static_cast(st.wMinute); + m_second = static_cast(st.wSecond); +} + +void CPDFSDK_DateTime::ResetDateTime() { + tzset(); + + time_t curTime; + time(&curTime); + + struct tm* newtime = localtime(&curTime); + m_year = newtime->tm_year + 1900; + m_month = newtime->tm_mon + 1; + m_day = newtime->tm_mday; + m_hour = newtime->tm_hour; + m_minute = newtime->tm_min; + m_second = newtime->tm_sec; +} + +bool CPDFSDK_DateTime::operator==(const CPDFSDK_DateTime& that) const { + return m_year == that.m_year && m_month == that.m_month && + m_day == that.m_day && m_hour == that.m_hour && + m_minute == that.m_minute && m_second == that.m_second && + m_tzHour == that.m_tzHour && m_tzMinute == that.m_tzMinute; +} + +bool CPDFSDK_DateTime::operator!=(const CPDFSDK_DateTime& datetime) const { + return !(*this == datetime); +} + +time_t CPDFSDK_DateTime::ToTime_t() const { + struct tm newtime; + + newtime.tm_year = m_year - 1900; + newtime.tm_mon = m_month - 1; + newtime.tm_mday = m_day; + newtime.tm_hour = m_hour; + newtime.tm_min = m_minute; + newtime.tm_sec = m_second; + + return mktime(&newtime); +} + +CPDFSDK_DateTime& CPDFSDK_DateTime::FromPDFDateTimeString( + const CFX_ByteString& dtStr) { + int strLength = dtStr.GetLength(); + if (strLength <= 0) + return *this; + + int i = 0; + while (i < strLength && !std::isdigit(dtStr[i])) + ++i; + + if (i >= strLength) + return *this; + + int j = 0; + int k = 0; + FX_CHAR ch; + while (i < strLength && j < 4) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + m_year = static_cast(k); + if (i >= strLength || j < 4) + return *this; + + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + m_month = static_cast(k); + if (i >= strLength || j < 2) + return *this; + + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + m_day = static_cast(k); + if (i >= strLength || j < 2) + return *this; + + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + m_hour = static_cast(k); + if (i >= strLength || j < 2) + return *this; + + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + m_minute = static_cast(k); + if (i >= strLength || j < 2) + return *this; + + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + m_second = static_cast(k); + if (i >= strLength || j < 2) + return *this; + + ch = dtStr[i++]; + if (ch != '-' && ch != '+') + return *this; + if (ch == '-') + m_tzHour = -1; + else + m_tzHour = 1; + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + m_tzHour *= static_cast(k); + if (i >= strLength || j < 2) + return *this; + + if (dtStr[i++] != '\'') + return *this; + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + m_tzMinute = static_cast(k); + return *this; +} + +CFX_ByteString CPDFSDK_DateTime::ToCommonDateTimeString() { + CFX_ByteString str1; + str1.Format("%04d-%02u-%02u %02u:%02u:%02u ", m_year, m_month, m_day, m_hour, + m_minute, m_second); + if (m_tzHour < 0) + str1 += "-"; + else + str1 += "+"; + CFX_ByteString str2; + str2.Format("%02d:%02u", std::abs(static_cast(m_tzHour)), m_tzMinute); + return str1 + str2; +} + +CFX_ByteString CPDFSDK_DateTime::ToPDFDateTimeString() { + CFX_ByteString dtStr; + char tempStr[32]; + memset(tempStr, 0, sizeof(tempStr)); + FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "D:%04d%02u%02u%02u%02u%02u", + m_year, m_month, m_day, m_hour, m_minute, m_second); + dtStr = CFX_ByteString(tempStr); + if (m_tzHour < 0) + dtStr += CFX_ByteString("-"); + else + dtStr += CFX_ByteString("+"); + memset(tempStr, 0, sizeof(tempStr)); + FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "%02d'%02u'", + std::abs(static_cast(m_tzHour)), m_tzMinute); + dtStr += CFX_ByteString(tempStr); + return dtStr; +} + +void CPDFSDK_DateTime::ToSystemTime(FX_SYSTEMTIME& st) { + time_t t = this->ToTime_t(); + struct tm* pTime = localtime(&t); + + if (!pTime) + return; + + st.wYear = static_cast(pTime->tm_year) + 1900; + st.wMonth = static_cast(pTime->tm_mon) + 1; + st.wDay = static_cast(pTime->tm_mday); + st.wDayOfWeek = static_cast(pTime->tm_wday); + st.wHour = static_cast(pTime->tm_hour); + st.wMinute = static_cast(pTime->tm_min); + st.wSecond = static_cast(pTime->tm_sec); + st.wMilliseconds = 0; +} + +CPDFSDK_DateTime CPDFSDK_DateTime::ToGMT() const { + CPDFSDK_DateTime new_dt = *this; + new_dt.AddSeconds(-GetTimeZoneInSeconds(new_dt.m_tzHour, new_dt.m_tzMinute)); + new_dt.m_tzHour = 0; + new_dt.m_tzMinute = 0; + return new_dt; +} + +CPDFSDK_DateTime& CPDFSDK_DateTime::AddDays(short days) { + if (days == 0) + return *this; + + int16_t y = m_year; + uint8_t m = m_month; + uint8_t d = m_day; + + int ldays = days; + if (ldays > 0) { + int16_t yy = y; + if ((static_cast(m) * 100 + d) > 300) + yy++; + int ydays = GetYearDays(yy); + int mdays; + while (ldays >= ydays) { + y++; + ldays -= ydays; + yy++; + mdays = GetMonthDays(y, m); + if (d > mdays) { + m++; + d -= mdays; + } + ydays = GetYearDays(yy); + } + mdays = GetMonthDays(y, m) - d + 1; + while (ldays >= mdays) { + ldays -= mdays; + m++; + d = 1; + mdays = GetMonthDays(y, m); + } + d += ldays; + } else { + ldays *= -1; + int16_t yy = y; + if ((static_cast(m) * 100 + d) < 300) + yy--; + int ydays = GetYearDays(yy); + while (ldays >= ydays) { + y--; + ldays -= ydays; + yy--; + int mdays = GetMonthDays(y, m); + if (d > mdays) { + m++; + d -= mdays; + } + ydays = GetYearDays(yy); + } + while (ldays >= d) { + ldays -= d; + m--; + d = GetMonthDays(y, m); + } + d -= ldays; + } + + m_year = y; + m_month = m; + m_day = d; + + return *this; +} + +CPDFSDK_DateTime& CPDFSDK_DateTime::AddSeconds(int seconds) { + if (seconds == 0) + return *this; + + int n; + int days; + + n = m_hour * 3600 + m_minute * 60 + m_second + seconds; + if (n < 0) { + days = (n - 86399) / 86400; + n -= days * 86400; + } else { + days = n / 86400; + n %= 86400; + } + m_hour = static_cast(n / 3600); + m_hour %= 24; + n %= 3600; + m_minute = static_cast(n / 60); + m_second = static_cast(n % 60); + if (days != 0) + AddDays(days); + + return *this; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_datetime.h b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_datetime.h new file mode 100644 index 000000000000..6b612b27bc57 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_datetime.h @@ -0,0 +1,49 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CPDFSDK_DATETIME_H_ +#define FPDFSDK_CPDFSDK_DATETIME_H_ + +#if _FX_OS_ == _FX_ANDROID_ +#include +#else +#include +#endif + +#include "fpdfsdk/cfx_systemhandler.h" + +class CPDFSDK_DateTime { + public: + CPDFSDK_DateTime(); + explicit CPDFSDK_DateTime(const CFX_ByteString& dtStr); + explicit CPDFSDK_DateTime(const FX_SYSTEMTIME& st); + CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime); + + bool operator==(const CPDFSDK_DateTime& datetime) const; + bool operator!=(const CPDFSDK_DateTime& datetime) const; + + CPDFSDK_DateTime& FromPDFDateTimeString(const CFX_ByteString& dtStr); + CFX_ByteString ToCommonDateTimeString(); + CFX_ByteString ToPDFDateTimeString(); + void ToSystemTime(FX_SYSTEMTIME& st); + time_t ToTime_t() const; + CPDFSDK_DateTime ToGMT() const; + CPDFSDK_DateTime& AddDays(short days); + CPDFSDK_DateTime& AddSeconds(int seconds); + void ResetDateTime(); + + private: + int16_t m_year; + uint8_t m_month; + uint8_t m_day; + uint8_t m_hour; + uint8_t m_minute; + uint8_t m_second; + int8_t m_tzHour; + uint8_t m_tzMinute; +}; + +#endif // FPDFSDK_CPDFSDK_DATETIME_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_formfillenvironment.cpp new file mode 100644 index 000000000000..4ef766d9f861 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_formfillenvironment.cpp @@ -0,0 +1,760 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" + +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfdoc/cpdf_docjsactions.h" +#include "fpdfsdk/cpdfsdk_annothandlermgr.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/formfiller/cffl_interactiveformfiller.h" +#include "fpdfsdk/fsdk_actionhandler.h" +#include "fpdfsdk/javascript/ijs_runtime.h" +#include "third_party/base/ptr_util.h" + +namespace { + +// NOTE: |bsUTF16LE| must outlive the use of the result. Care must be taken +// since modifying the result would impact |bsUTF16LE|. +FPDF_WIDESTRING AsFPDFWideString(CFX_ByteString* bsUTF16LE) { + return reinterpret_cast( + bsUTF16LE->GetBuffer(bsUTF16LE->GetLength())); +} + +} // namespace + +CPDFSDK_FormFillEnvironment::CPDFSDK_FormFillEnvironment( + UnderlyingDocumentType* pDoc, + FPDF_FORMFILLINFO* pFFinfo) + : m_pInfo(pFFinfo), + m_pUnderlyingDoc(pDoc), + m_pSysHandler(new CFX_SystemHandler(this)), + m_bChangeMask(false), + m_bBeingDestroyed(false) {} + +CPDFSDK_FormFillEnvironment::~CPDFSDK_FormFillEnvironment() { + m_bBeingDestroyed = true; + ClearAllFocusedAnnots(); + + // |m_PageMap| will try to access |m_pInterForm| when it cleans itself up. + // Make sure it is deleted before |m_pInterForm|. + m_PageMap.clear(); + + // |m_pAnnotHandlerMgr| will try to access |m_pFormFiller| when it cleans + // itself up. Make sure it is deleted before |m_pFormFiller|. + m_pAnnotHandlerMgr.reset(); + + // Must destroy the |m_pFormFiller| before the environment (|this|) + // because any created form widgets hold a pointer to the environment. + // Those widgets may call things like KillTimer() as they are shutdown. + m_pFormFiller.reset(); + + if (m_pInfo && m_pInfo->Release) + m_pInfo->Release(m_pInfo); +} + +int CPDFSDK_FormFillEnvironment::JS_appAlert(const FX_WCHAR* Msg, + const FX_WCHAR* Title, + uint32_t Type, + uint32_t Icon) { + if (!m_pInfo || !m_pInfo->m_pJsPlatform || + !m_pInfo->m_pJsPlatform->app_alert) { + return -1; + } + CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode(); + CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode(); + return m_pInfo->m_pJsPlatform->app_alert( + m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsMsg), + AsFPDFWideString(&bsTitle), Type, Icon); +} + +int CPDFSDK_FormFillEnvironment::JS_appResponse(const FX_WCHAR* Question, + const FX_WCHAR* Title, + const FX_WCHAR* Default, + const FX_WCHAR* cLabel, + FPDF_BOOL bPassword, + void* response, + int length) { + if (!m_pInfo || !m_pInfo->m_pJsPlatform || + !m_pInfo->m_pJsPlatform->app_response) { + return -1; + } + CFX_ByteString bsQuestion = CFX_WideString(Question).UTF16LE_Encode(); + CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode(); + CFX_ByteString bsDefault = CFX_WideString(Default).UTF16LE_Encode(); + CFX_ByteString bsLabel = CFX_WideString(cLabel).UTF16LE_Encode(); + return m_pInfo->m_pJsPlatform->app_response( + m_pInfo->m_pJsPlatform, AsFPDFWideString(&bsQuestion), + AsFPDFWideString(&bsTitle), AsFPDFWideString(&bsDefault), + AsFPDFWideString(&bsLabel), bPassword, response, length); +} + +void CPDFSDK_FormFillEnvironment::JS_appBeep(int nType) { + if (!m_pInfo || !m_pInfo->m_pJsPlatform || + !m_pInfo->m_pJsPlatform->app_beep) { + return; + } + m_pInfo->m_pJsPlatform->app_beep(m_pInfo->m_pJsPlatform, nType); +} + +CFX_WideString CPDFSDK_FormFillEnvironment::JS_fieldBrowse() { + if (!m_pInfo || !m_pInfo->m_pJsPlatform || + !m_pInfo->m_pJsPlatform->Field_browse) { + return CFX_WideString(); + } + const int nRequiredLen = + m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, nullptr, 0); + if (nRequiredLen <= 0) + return CFX_WideString(); + + std::unique_ptr pBuff(new char[nRequiredLen]); + memset(pBuff.get(), 0, nRequiredLen); + const int nActualLen = m_pInfo->m_pJsPlatform->Field_browse( + m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen); + if (nActualLen <= 0 || nActualLen > nRequiredLen) + return CFX_WideString(); + + return CFX_WideString::FromLocal(CFX_ByteStringC(pBuff.get(), nActualLen)); +} + +CFX_WideString CPDFSDK_FormFillEnvironment::JS_docGetFilePath() { + if (!m_pInfo || !m_pInfo->m_pJsPlatform || + !m_pInfo->m_pJsPlatform->Doc_getFilePath) { + return CFX_WideString(); + } + const int nRequiredLen = m_pInfo->m_pJsPlatform->Doc_getFilePath( + m_pInfo->m_pJsPlatform, nullptr, 0); + if (nRequiredLen <= 0) + return CFX_WideString(); + + std::unique_ptr pBuff(new char[nRequiredLen]); + memset(pBuff.get(), 0, nRequiredLen); + const int nActualLen = m_pInfo->m_pJsPlatform->Doc_getFilePath( + m_pInfo->m_pJsPlatform, pBuff.get(), nRequiredLen); + if (nActualLen <= 0 || nActualLen > nRequiredLen) + return CFX_WideString(); + + return CFX_WideString::FromLocal(CFX_ByteStringC(pBuff.get(), nActualLen)); +} + +void CPDFSDK_FormFillEnvironment::JS_docSubmitForm(void* formData, + int length, + const FX_WCHAR* URL) { + if (!m_pInfo || !m_pInfo->m_pJsPlatform || + !m_pInfo->m_pJsPlatform->Doc_submitForm) { + return; + } + CFX_ByteString bsDestination = CFX_WideString(URL).UTF16LE_Encode(); + m_pInfo->m_pJsPlatform->Doc_submitForm(m_pInfo->m_pJsPlatform, formData, + length, + AsFPDFWideString(&bsDestination)); +} + +void CPDFSDK_FormFillEnvironment::JS_docmailForm(void* mailData, + int length, + FPDF_BOOL bUI, + const FX_WCHAR* To, + const FX_WCHAR* Subject, + const FX_WCHAR* CC, + const FX_WCHAR* BCC, + const FX_WCHAR* Msg) { + if (!m_pInfo || !m_pInfo->m_pJsPlatform || + !m_pInfo->m_pJsPlatform->Doc_mail) { + return; + } + CFX_ByteString bsTo = CFX_WideString(To).UTF16LE_Encode(); + CFX_ByteString bsSubject = CFX_WideString(Subject).UTF16LE_Encode(); + CFX_ByteString bsCC = CFX_WideString(CC).UTF16LE_Encode(); + CFX_ByteString bsBcc = CFX_WideString(BCC).UTF16LE_Encode(); + CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode(); + m_pInfo->m_pJsPlatform->Doc_mail( + m_pInfo->m_pJsPlatform, mailData, length, bUI, AsFPDFWideString(&bsTo), + AsFPDFWideString(&bsSubject), AsFPDFWideString(&bsCC), + AsFPDFWideString(&bsBcc), AsFPDFWideString(&bsMsg)); +} + +void CPDFSDK_FormFillEnvironment::JS_docprint(FPDF_BOOL bUI, + int nStart, + int nEnd, + FPDF_BOOL bSilent, + FPDF_BOOL bShrinkToFit, + FPDF_BOOL bPrintAsImage, + FPDF_BOOL bReverse, + FPDF_BOOL bAnnotations) { + if (!m_pInfo || !m_pInfo->m_pJsPlatform || + !m_pInfo->m_pJsPlatform->Doc_print) { + return; + } + m_pInfo->m_pJsPlatform->Doc_print(m_pInfo->m_pJsPlatform, bUI, nStart, nEnd, + bSilent, bShrinkToFit, bPrintAsImage, + bReverse, bAnnotations); +} + +void CPDFSDK_FormFillEnvironment::JS_docgotoPage(int nPageNum) { + if (!m_pInfo || !m_pInfo->m_pJsPlatform || + !m_pInfo->m_pJsPlatform->Doc_gotoPage) { + return; + } + m_pInfo->m_pJsPlatform->Doc_gotoPage(m_pInfo->m_pJsPlatform, nPageNum); +} + +IJS_Runtime* CPDFSDK_FormFillEnvironment::GetJSRuntime() { + if (!IsJSInitiated()) + return nullptr; + if (!m_pJSRuntime) + m_pJSRuntime.reset(IJS_Runtime::Create(this)); + return m_pJSRuntime.get(); +} + +CPDFSDK_AnnotHandlerMgr* CPDFSDK_FormFillEnvironment::GetAnnotHandlerMgr() { + if (!m_pAnnotHandlerMgr) + m_pAnnotHandlerMgr = pdfium::MakeUnique(this); + return m_pAnnotHandlerMgr.get(); +} + +CPDFSDK_ActionHandler* CPDFSDK_FormFillEnvironment::GetActionHander() { + if (!m_pActionHandler) + m_pActionHandler = pdfium::MakeUnique(); + return m_pActionHandler.get(); +} + +CFFL_InteractiveFormFiller* +CPDFSDK_FormFillEnvironment::GetInteractiveFormFiller() { + if (!m_pFormFiller) + m_pFormFiller = pdfium::MakeUnique(this); + return m_pFormFiller.get(); +} + +void CPDFSDK_FormFillEnvironment::Invalidate(FPDF_PAGE page, + const FX_RECT& rect) { + if (m_pInfo && m_pInfo->FFI_Invalidate) { + m_pInfo->FFI_Invalidate(m_pInfo, page, rect.left, rect.top, rect.right, + rect.bottom); + } +} + +void CPDFSDK_FormFillEnvironment::OutputSelectedRect( + FPDF_PAGE page, + const CFX_FloatRect& rect) { + if (m_pInfo && m_pInfo->FFI_OutputSelectedRect) { + m_pInfo->FFI_OutputSelectedRect(m_pInfo, page, rect.left, rect.top, + rect.right, rect.bottom); + } +} + +void CPDFSDK_FormFillEnvironment::SetCursor(int nCursorType) { + if (m_pInfo && m_pInfo->FFI_SetCursor) + m_pInfo->FFI_SetCursor(m_pInfo, nCursorType); +} + +int CPDFSDK_FormFillEnvironment::SetTimer(int uElapse, + TimerCallback lpTimerFunc) { + if (m_pInfo && m_pInfo->FFI_SetTimer) + return m_pInfo->FFI_SetTimer(m_pInfo, uElapse, lpTimerFunc); + return -1; +} + +void CPDFSDK_FormFillEnvironment::KillTimer(int nTimerID) { + if (m_pInfo && m_pInfo->FFI_KillTimer) + m_pInfo->FFI_KillTimer(m_pInfo, nTimerID); +} + +FX_SYSTEMTIME CPDFSDK_FormFillEnvironment::GetLocalTime() const { + FX_SYSTEMTIME fxtime; + if (!m_pInfo || !m_pInfo->FFI_GetLocalTime) + return fxtime; + + FPDF_SYSTEMTIME systime = m_pInfo->FFI_GetLocalTime(m_pInfo); + fxtime.wDay = systime.wDay; + fxtime.wDayOfWeek = systime.wDayOfWeek; + fxtime.wHour = systime.wHour; + fxtime.wMilliseconds = systime.wMilliseconds; + fxtime.wMinute = systime.wMinute; + fxtime.wMonth = systime.wMonth; + fxtime.wSecond = systime.wSecond; + fxtime.wYear = systime.wYear; + return fxtime; +} + +void CPDFSDK_FormFillEnvironment::OnChange() { + if (m_pInfo && m_pInfo->FFI_OnChange) + m_pInfo->FFI_OnChange(m_pInfo); +} + +bool CPDFSDK_FormFillEnvironment::IsSHIFTKeyDown(uint32_t nFlag) const { + return (nFlag & FWL_EVENTFLAG_ShiftKey) != 0; +} + +bool CPDFSDK_FormFillEnvironment::IsCTRLKeyDown(uint32_t nFlag) const { + return (nFlag & FWL_EVENTFLAG_ControlKey) != 0; +} + +bool CPDFSDK_FormFillEnvironment::IsALTKeyDown(uint32_t nFlag) const { + return (nFlag & FWL_EVENTFLAG_AltKey) != 0; +} + +FPDF_PAGE CPDFSDK_FormFillEnvironment::GetPage(FPDF_DOCUMENT document, + int nPageIndex) { + if (m_pInfo && m_pInfo->FFI_GetPage) + return m_pInfo->FFI_GetPage(m_pInfo, document, nPageIndex); + return nullptr; +} + +FPDF_PAGE CPDFSDK_FormFillEnvironment::GetCurrentPage(FPDF_DOCUMENT document) { + if (m_pInfo && m_pInfo->FFI_GetCurrentPage) + return m_pInfo->FFI_GetCurrentPage(m_pInfo, document); + return nullptr; +} + +void CPDFSDK_FormFillEnvironment::ExecuteNamedAction( + const FX_CHAR* namedAction) { + if (m_pInfo && m_pInfo->FFI_ExecuteNamedAction) + m_pInfo->FFI_ExecuteNamedAction(m_pInfo, namedAction); +} + +void CPDFSDK_FormFillEnvironment::OnSetFieldInputFocus( + FPDF_WIDESTRING focusText, + FPDF_DWORD nTextLen, + bool bFocus) { + if (m_pInfo && m_pInfo->FFI_SetTextFieldFocus) + m_pInfo->FFI_SetTextFieldFocus(m_pInfo, focusText, nTextLen, bFocus); +} + +void CPDFSDK_FormFillEnvironment::DoURIAction(const FX_CHAR* bsURI) { + if (m_pInfo && m_pInfo->FFI_DoURIAction) + m_pInfo->FFI_DoURIAction(m_pInfo, bsURI); +} + +void CPDFSDK_FormFillEnvironment::DoGoToAction(int nPageIndex, + int zoomMode, + float* fPosArray, + int sizeOfArray) { + if (m_pInfo && m_pInfo->FFI_DoGoToAction) { + m_pInfo->FFI_DoGoToAction(m_pInfo, nPageIndex, zoomMode, fPosArray, + sizeOfArray); + } +} + +#ifdef PDF_ENABLE_XFA +void CPDFSDK_FormFillEnvironment::DisplayCaret(FPDF_PAGE page, + FPDF_BOOL bVisible, + double left, + double top, + double right, + double bottom) { + if (m_pInfo && m_pInfo->FFI_DisplayCaret) { + m_pInfo->FFI_DisplayCaret(m_pInfo, page, bVisible, left, top, right, + bottom); + } +} + +int CPDFSDK_FormFillEnvironment::GetCurrentPageIndex(FPDF_DOCUMENT document) { + if (!m_pInfo || !m_pInfo->FFI_GetCurrentPageIndex) + return -1; + return m_pInfo->FFI_GetCurrentPageIndex(m_pInfo, document); +} + +void CPDFSDK_FormFillEnvironment::SetCurrentPage(FPDF_DOCUMENT document, + int iCurPage) { + if (m_pInfo && m_pInfo->FFI_SetCurrentPage) + m_pInfo->FFI_SetCurrentPage(m_pInfo, document, iCurPage); +} + +CFX_WideString CPDFSDK_FormFillEnvironment::GetPlatform() { + if (!m_pInfo || !m_pInfo->FFI_GetPlatform) + return L""; + + int nRequiredLen = m_pInfo->FFI_GetPlatform(m_pInfo, nullptr, 0); + if (nRequiredLen <= 0) + return L""; + + char* pbuff = new char[nRequiredLen]; + memset(pbuff, 0, nRequiredLen); + int nActualLen = m_pInfo->FFI_GetPlatform(m_pInfo, pbuff, nRequiredLen); + if (nActualLen <= 0 || nActualLen > nRequiredLen) { + delete[] pbuff; + return L""; + } + CFX_ByteString bsRet = CFX_ByteString(pbuff, nActualLen); + CFX_WideString wsRet = CFX_WideString::FromUTF16LE( + (unsigned short*)bsRet.GetBuffer(bsRet.GetLength()), + bsRet.GetLength() / sizeof(unsigned short)); + delete[] pbuff; + return wsRet; +} + +void CPDFSDK_FormFillEnvironment::GotoURL(FPDF_DOCUMENT document, + const CFX_WideStringC& wsURL) { + if (!m_pInfo || !m_pInfo->FFI_GotoURL) + return; + + CFX_ByteString bsTo = CFX_WideString(wsURL).UTF16LE_Encode(); + FPDF_WIDESTRING pTo = (FPDF_WIDESTRING)bsTo.GetBuffer(wsURL.GetLength()); + m_pInfo->FFI_GotoURL(m_pInfo, document, pTo); + bsTo.ReleaseBuffer(); +} + +void CPDFSDK_FormFillEnvironment::GetPageViewRect(FPDF_PAGE page, + FS_RECTF& dstRect) { + if (!m_pInfo || !m_pInfo->FFI_GetPageViewRect) + return; + + double left; + double top; + double right; + double bottom; + m_pInfo->FFI_GetPageViewRect(m_pInfo, page, &left, &top, &right, &bottom); + + dstRect.left = static_cast(left); + dstRect.top = static_cast(top < bottom ? bottom : top); + dstRect.bottom = static_cast(top < bottom ? top : bottom); + dstRect.right = static_cast(right); +} + +bool CPDFSDK_FormFillEnvironment::PopupMenu(FPDF_PAGE page, + FPDF_WIDGET hWidget, + int menuFlag, + CFX_PointF pt) { + return m_pInfo && m_pInfo->FFI_PopupMenu && + m_pInfo->FFI_PopupMenu(m_pInfo, page, hWidget, menuFlag, pt.x, pt.y); +} + +void CPDFSDK_FormFillEnvironment::Alert(FPDF_WIDESTRING Msg, + FPDF_WIDESTRING Title, + int Type, + int Icon) { + if (m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_alert) { + m_pInfo->m_pJsPlatform->app_alert(m_pInfo->m_pJsPlatform, Msg, Title, Type, + Icon); + } +} + +void CPDFSDK_FormFillEnvironment::EmailTo(FPDF_FILEHANDLER* fileHandler, + FPDF_WIDESTRING pTo, + FPDF_WIDESTRING pSubject, + FPDF_WIDESTRING pCC, + FPDF_WIDESTRING pBcc, + FPDF_WIDESTRING pMsg) { + if (m_pInfo && m_pInfo->FFI_EmailTo) + m_pInfo->FFI_EmailTo(m_pInfo, fileHandler, pTo, pSubject, pCC, pBcc, pMsg); +} + +void CPDFSDK_FormFillEnvironment::UploadTo(FPDF_FILEHANDLER* fileHandler, + int fileFlag, + FPDF_WIDESTRING uploadTo) { + if (m_pInfo && m_pInfo->FFI_UploadTo) + m_pInfo->FFI_UploadTo(m_pInfo, fileHandler, fileFlag, uploadTo); +} + +FPDF_FILEHANDLER* CPDFSDK_FormFillEnvironment::OpenFile(int fileType, + FPDF_WIDESTRING wsURL, + const char* mode) { + if (m_pInfo && m_pInfo->FFI_OpenFile) + return m_pInfo->FFI_OpenFile(m_pInfo, fileType, wsURL, mode); + return nullptr; +} + +CFX_RetainPtr +CPDFSDK_FormFillEnvironment::DownloadFromURL(const FX_WCHAR* url) { + if (!m_pInfo || !m_pInfo->FFI_DownloadFromURL) + return nullptr; + + CFX_ByteString bstrURL = CFX_WideString(url).UTF16LE_Encode(); + FPDF_WIDESTRING wsURL = + (FPDF_WIDESTRING)bstrURL.GetBuffer(bstrURL.GetLength()); + + FPDF_LPFILEHANDLER fileHandler = m_pInfo->FFI_DownloadFromURL(m_pInfo, wsURL); + return MakeSeekableStream(fileHandler); +} + +CFX_WideString CPDFSDK_FormFillEnvironment::PostRequestURL( + const FX_WCHAR* wsURL, + const FX_WCHAR* wsData, + const FX_WCHAR* wsContentType, + const FX_WCHAR* wsEncode, + const FX_WCHAR* wsHeader) { + if (!m_pInfo || !m_pInfo->FFI_PostRequestURL) + return L""; + + CFX_ByteString bsURL = CFX_WideString(wsURL).UTF16LE_Encode(); + FPDF_WIDESTRING URL = (FPDF_WIDESTRING)bsURL.GetBuffer(bsURL.GetLength()); + + CFX_ByteString bsData = CFX_WideString(wsData).UTF16LE_Encode(); + FPDF_WIDESTRING data = (FPDF_WIDESTRING)bsData.GetBuffer(bsData.GetLength()); + + CFX_ByteString bsContentType = CFX_WideString(wsContentType).UTF16LE_Encode(); + FPDF_WIDESTRING contentType = + (FPDF_WIDESTRING)bsContentType.GetBuffer(bsContentType.GetLength()); + + CFX_ByteString bsEncode = CFX_WideString(wsEncode).UTF16LE_Encode(); + FPDF_WIDESTRING encode = + (FPDF_WIDESTRING)bsEncode.GetBuffer(bsEncode.GetLength()); + + CFX_ByteString bsHeader = CFX_WideString(wsHeader).UTF16LE_Encode(); + FPDF_WIDESTRING header = + (FPDF_WIDESTRING)bsHeader.GetBuffer(bsHeader.GetLength()); + + FPDF_BSTR response; + FPDF_BStr_Init(&response); + m_pInfo->FFI_PostRequestURL(m_pInfo, URL, data, contentType, encode, header, + &response); + + CFX_WideString wsRet = CFX_WideString::FromUTF16LE( + (FPDF_WIDESTRING)response.str, response.len / sizeof(FPDF_WIDESTRING)); + FPDF_BStr_Clear(&response); + + return wsRet; +} + +FPDF_BOOL CPDFSDK_FormFillEnvironment::PutRequestURL(const FX_WCHAR* wsURL, + const FX_WCHAR* wsData, + const FX_WCHAR* wsEncode) { + if (!m_pInfo || !m_pInfo->FFI_PutRequestURL) + return false; + + CFX_ByteString bsURL = CFX_WideString(wsURL).UTF16LE_Encode(); + FPDF_WIDESTRING URL = (FPDF_WIDESTRING)bsURL.GetBuffer(bsURL.GetLength()); + + CFX_ByteString bsData = CFX_WideString(wsData).UTF16LE_Encode(); + FPDF_WIDESTRING data = (FPDF_WIDESTRING)bsData.GetBuffer(bsData.GetLength()); + + CFX_ByteString bsEncode = CFX_WideString(wsEncode).UTF16LE_Encode(); + FPDF_WIDESTRING encode = + (FPDF_WIDESTRING)bsEncode.GetBuffer(bsEncode.GetLength()); + + return m_pInfo->FFI_PutRequestURL(m_pInfo, URL, data, encode); +} + +CFX_WideString CPDFSDK_FormFillEnvironment::GetLanguage() { + if (!m_pInfo || !m_pInfo->FFI_GetLanguage) + return L""; + + int nRequiredLen = m_pInfo->FFI_GetLanguage(m_pInfo, nullptr, 0); + if (nRequiredLen <= 0) + return L""; + + char* pbuff = new char[nRequiredLen]; + memset(pbuff, 0, nRequiredLen); + int nActualLen = m_pInfo->FFI_GetLanguage(m_pInfo, pbuff, nRequiredLen); + if (nActualLen <= 0 || nActualLen > nRequiredLen) { + delete[] pbuff; + return L""; + } + CFX_ByteString bsRet = CFX_ByteString(pbuff, nActualLen); + CFX_WideString wsRet = CFX_WideString::FromUTF16LE( + (FPDF_WIDESTRING)bsRet.GetBuffer(bsRet.GetLength()), + bsRet.GetLength() / sizeof(FPDF_WIDESTRING)); + delete[] pbuff; + return wsRet; +} + +void CPDFSDK_FormFillEnvironment::PageEvent(int iPageCount, + uint32_t dwEventType) const { + if (m_pInfo && m_pInfo->FFI_PageEvent) + m_pInfo->FFI_PageEvent(m_pInfo, iPageCount, dwEventType); +} +#endif // PDF_ENABLE_XFA + +void CPDFSDK_FormFillEnvironment::ClearAllFocusedAnnots() { + for (auto& it : m_PageMap) { + if (it.second->IsValidSDKAnnot(GetFocusAnnot())) + KillFocusAnnot(0); + } +} + +CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetPageView( + UnderlyingPageType* pUnderlyingPage, + bool renew) { + auto it = m_PageMap.find(pUnderlyingPage); + if (it != m_PageMap.end()) + return it->second.get(); + + if (!renew) + return nullptr; + + CPDFSDK_PageView* pPageView = new CPDFSDK_PageView(this, pUnderlyingPage); + m_PageMap[pUnderlyingPage].reset(pPageView); + // Delay to load all the annotations, to avoid endless loop. + pPageView->LoadFXAnnots(); + return pPageView; +} + +CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetCurrentView() { + UnderlyingPageType* pPage = + UnderlyingFromFPDFPage(GetCurrentPage(m_pUnderlyingDoc)); + return pPage ? GetPageView(pPage, true) : nullptr; +} + +CPDFSDK_PageView* CPDFSDK_FormFillEnvironment::GetPageView(int nIndex) { + UnderlyingPageType* pTempPage = + UnderlyingFromFPDFPage(GetPage(m_pUnderlyingDoc, nIndex)); + if (!pTempPage) + return nullptr; + + auto it = m_PageMap.find(pTempPage); + return it != m_PageMap.end() ? it->second.get() : nullptr; +} + +void CPDFSDK_FormFillEnvironment::ProcJavascriptFun() { + CPDF_Document* pPDFDoc = GetPDFDocument(); + CPDF_DocJSActions docJS(pPDFDoc); + int iCount = docJS.CountJSActions(); + if (iCount < 1) + return; + for (int i = 0; i < iCount; i++) { + CFX_ByteString csJSName; + CPDF_Action jsAction = docJS.GetJSAction(i, csJSName); + if (GetActionHander()) { + GetActionHander()->DoAction_JavaScript( + jsAction, CFX_WideString::FromLocal(csJSName.AsStringC()), this); + } + } +} + +bool CPDFSDK_FormFillEnvironment::ProcOpenAction() { + if (!m_pUnderlyingDoc) + return false; + + CPDF_Dictionary* pRoot = GetPDFDocument()->GetRoot(); + if (!pRoot) + return false; + + CPDF_Object* pOpenAction = pRoot->GetDictFor("OpenAction"); + if (!pOpenAction) + pOpenAction = pRoot->GetArrayFor("OpenAction"); + + if (!pOpenAction) + return false; + + if (pOpenAction->IsArray()) + return true; + + if (CPDF_Dictionary* pDict = pOpenAction->AsDictionary()) { + CPDF_Action action(pDict); + if (GetActionHander()) + GetActionHander()->DoAction_DocOpen(action, this); + return true; + } + return false; +} + +void CPDFSDK_FormFillEnvironment::RemovePageView( + UnderlyingPageType* pUnderlyingPage) { + auto it = m_PageMap.find(pUnderlyingPage); + if (it == m_PageMap.end()) + return; + + CPDFSDK_PageView* pPageView = it->second.get(); + if (pPageView->IsLocked() || pPageView->IsBeingDestroyed()) + return; + + // Mark the page view so we do not come into |RemovePageView| a second + // time while we're in the process of removing. + pPageView->SetBeingDestroyed(); + + // This must happen before we remove |pPageView| from the map because + // |KillFocusAnnot| can call into the |GetPage| method which will + // look for this page view in the map, if it doesn't find it a new one will + // be created. We then have two page views pointing to the same page and + // bad things happen. + if (pPageView->IsValidSDKAnnot(GetFocusAnnot())) + KillFocusAnnot(0); + + // Remove the page from the map to make sure we don't accidentally attempt + // to use the |pPageView| while we're cleaning it up. + m_PageMap.erase(it); +} + +UnderlyingPageType* CPDFSDK_FormFillEnvironment::GetPage(int nIndex) { + return UnderlyingFromFPDFPage(GetPage(m_pUnderlyingDoc, nIndex)); +} + +CPDFSDK_InterForm* CPDFSDK_FormFillEnvironment::GetInterForm() { + if (!m_pInterForm) + m_pInterForm = pdfium::MakeUnique(this); + return m_pInterForm.get(); +} + +void CPDFSDK_FormFillEnvironment::UpdateAllViews(CPDFSDK_PageView* pSender, + CPDFSDK_Annot* pAnnot) { + for (const auto& it : m_PageMap) { + CPDFSDK_PageView* pPageView = it.second.get(); + if (pPageView != pSender) + pPageView->UpdateView(pAnnot); + } +} + +bool CPDFSDK_FormFillEnvironment::SetFocusAnnot( + CPDFSDK_Annot::ObservedPtr* pAnnot) { + if (m_bBeingDestroyed) + return false; + if (m_pFocusAnnot == *pAnnot) + return true; + if (m_pFocusAnnot && !KillFocusAnnot(0)) + return false; + if (!*pAnnot) + return false; + +#ifdef PDF_ENABLE_XFA + CPDFSDK_Annot::ObservedPtr pLastFocusAnnot(m_pFocusAnnot.Get()); +#endif // PDF_ENABLE_XFA + CPDFSDK_PageView* pPageView = (*pAnnot)->GetPageView(); + if (pPageView && pPageView->IsValid()) { + CPDFSDK_AnnotHandlerMgr* pAnnotHandler = GetAnnotHandlerMgr(); + if (!m_pFocusAnnot) { +#ifdef PDF_ENABLE_XFA + if (!pAnnotHandler->Annot_OnChangeFocus(pAnnot, &pLastFocusAnnot)) + return false; +#endif // PDF_ENABLE_XFA + if (!pAnnotHandler->Annot_OnSetFocus(pAnnot, 0)) + return false; + if (!m_pFocusAnnot) { + m_pFocusAnnot.Reset(pAnnot->Get()); + return true; + } + } + } + return false; +} + +bool CPDFSDK_FormFillEnvironment::KillFocusAnnot(uint32_t nFlag) { + if (m_pFocusAnnot) { + CPDFSDK_AnnotHandlerMgr* pAnnotHandler = GetAnnotHandlerMgr(); + CPDFSDK_Annot::ObservedPtr pFocusAnnot(m_pFocusAnnot.Get()); + m_pFocusAnnot.Reset(); + +#ifdef PDF_ENABLE_XFA + CPDFSDK_Annot::ObservedPtr pNull; + if (!pAnnotHandler->Annot_OnChangeFocus(&pNull, &pFocusAnnot)) + return false; +#endif // PDF_ENABLE_XFA + + if (pAnnotHandler->Annot_OnKillFocus(&pFocusAnnot, nFlag)) { + if (pFocusAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET) { + CPDFSDK_Widget* pWidget = + static_cast(pFocusAnnot.Get()); + int nFieldType = pWidget->GetFieldType(); + if (FIELDTYPE_TEXTFIELD == nFieldType || + FIELDTYPE_COMBOBOX == nFieldType) { + OnSetFieldInputFocus(nullptr, 0, false); + } + } + if (!m_pFocusAnnot) + return true; + } else { + m_pFocusAnnot.Reset(pFocusAnnot.Get()); + } + } + return false; +} + +bool CPDFSDK_FormFillEnvironment::GetPermissions(int nFlag) { + return !!(GetPDFDocument()->GetUserPermissions() & nFlag); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_formfillenvironment.h b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_formfillenvironment.h new file mode 100644 index 000000000000..eead8734f119 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_formfillenvironment.h @@ -0,0 +1,220 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CPDFSDK_FORMFILLENVIRONMENT_H_ +#define FPDFSDK_CPDFSDK_FORMFILLENVIRONMENT_H_ + +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfdoc/cpdf_occontext.h" +#include "core/fxcrt/cfx_observable.h" +#include "fpdfsdk/cfx_systemhandler.h" +#include "fpdfsdk/cpdfsdk_annot.h" +#include "fpdfsdk/fsdk_define.h" +#include "public/fpdf_formfill.h" +#include "public/fpdf_fwlevent.h" + +class CFFL_InteractiveFormFiller; +class CFX_SystemHandler; +class CPDFSDK_ActionHandler; +class CPDFSDK_AnnotHandlerMgr; +class CPDFSDK_InterForm; +class CPDFSDK_PageView; +class IJS_Runtime; + +class CPDFSDK_FormFillEnvironment + : public CFX_Observable { + public: + CPDFSDK_FormFillEnvironment(UnderlyingDocumentType* pDoc, + FPDF_FORMFILLINFO* pFFinfo); + ~CPDFSDK_FormFillEnvironment(); + + CPDFSDK_PageView* GetPageView(UnderlyingPageType* pPage, bool renew); + CPDFSDK_PageView* GetPageView(int nIndex); + CPDFSDK_PageView* GetCurrentView(); + void RemovePageView(UnderlyingPageType* pPage); + void UpdateAllViews(CPDFSDK_PageView* pSender, CPDFSDK_Annot* pAnnot); + + CPDFSDK_Annot* GetFocusAnnot() { return m_pFocusAnnot.Get(); } + bool SetFocusAnnot(CPDFSDK_Annot::ObservedPtr* pAnnot); + bool KillFocusAnnot(uint32_t nFlag); + void ClearAllFocusedAnnots(); + + bool ExtractPages(const std::vector& arrExtraPages, + CPDF_Document* pDstDoc); + bool InsertPages(int nInsertAt, + const CPDF_Document* pSrcDoc, + const std::vector& arrSrcPages); + bool ReplacePages(int nPage, + const CPDF_Document* pSrcDoc, + const std::vector& arrSrcPages); + + int GetPageCount() { return m_pUnderlyingDoc->GetPageCount(); } + bool GetPermissions(int nFlag); + + bool GetChangeMark() const { return m_bChangeMask; } + void SetChangeMark() { m_bChangeMask = true; } + void ClearChangeMark() { m_bChangeMask = false; } + + UnderlyingPageType* GetPage(int nIndex); + + void ProcJavascriptFun(); + bool ProcOpenAction(); + + void Invalidate(FPDF_PAGE page, const FX_RECT& rect); + void OutputSelectedRect(FPDF_PAGE page, const CFX_FloatRect& rect); + + void SetCursor(int nCursorType); + int SetTimer(int uElapse, TimerCallback lpTimerFunc); + void KillTimer(int nTimerID); + FX_SYSTEMTIME GetLocalTime() const; + + void OnChange(); + bool IsSHIFTKeyDown(uint32_t nFlag) const; + bool IsCTRLKeyDown(uint32_t nFlag) const; + bool IsALTKeyDown(uint32_t nFlag) const; + + FPDF_PAGE GetPage(FPDF_DOCUMENT document, int nPageIndex); + FPDF_PAGE GetCurrentPage(FPDF_DOCUMENT document); + + void ExecuteNamedAction(const FX_CHAR* namedAction); + void OnSetFieldInputFocus(FPDF_WIDESTRING focusText, + FPDF_DWORD nTextLen, + bool bFocus); + void DoURIAction(const FX_CHAR* bsURI); + void DoGoToAction(int nPageIndex, + int zoomMode, + float* fPosArray, + int sizeOfArray); + + UnderlyingDocumentType* GetUnderlyingDocument() const { + return m_pUnderlyingDoc; + } + +#ifdef PDF_ENABLE_XFA + CPDF_Document* GetPDFDocument() const { + return m_pUnderlyingDoc ? m_pUnderlyingDoc->GetPDFDoc() : nullptr; + } + + CPDFXFA_Context* GetXFAContext() const { return m_pUnderlyingDoc; } + void ResetXFADocument() { m_pUnderlyingDoc = nullptr; } + + int GetPageViewCount() const { return m_PageMap.size(); } + + void DisplayCaret(FPDF_PAGE page, + FPDF_BOOL bVisible, + double left, + double top, + double right, + double bottom); + int GetCurrentPageIndex(FPDF_DOCUMENT document); + void SetCurrentPage(FPDF_DOCUMENT document, int iCurPage); + + // TODO(dsinclair): This should probably change to PDFium? + CFX_WideString FFI_GetAppName() const { return CFX_WideString(L"Acrobat"); } + + CFX_WideString GetPlatform(); + void GotoURL(FPDF_DOCUMENT document, const CFX_WideStringC& wsURL); + void GetPageViewRect(FPDF_PAGE page, FS_RECTF& dstRect); + bool PopupMenu(FPDF_PAGE page, + FPDF_WIDGET hWidget, + int menuFlag, + CFX_PointF pt); + + void Alert(FPDF_WIDESTRING Msg, FPDF_WIDESTRING Title, int Type, int Icon); + void EmailTo(FPDF_FILEHANDLER* fileHandler, + FPDF_WIDESTRING pTo, + FPDF_WIDESTRING pSubject, + FPDF_WIDESTRING pCC, + FPDF_WIDESTRING pBcc, + FPDF_WIDESTRING pMsg); + void UploadTo(FPDF_FILEHANDLER* fileHandler, + int fileFlag, + FPDF_WIDESTRING uploadTo); + FPDF_FILEHANDLER* OpenFile(int fileType, + FPDF_WIDESTRING wsURL, + const char* mode); + CFX_RetainPtr DownloadFromURL(const FX_WCHAR* url); + CFX_WideString PostRequestURL(const FX_WCHAR* wsURL, + const FX_WCHAR* wsData, + const FX_WCHAR* wsContentType, + const FX_WCHAR* wsEncode, + const FX_WCHAR* wsHeader); + FPDF_BOOL PutRequestURL(const FX_WCHAR* wsURL, + const FX_WCHAR* wsData, + const FX_WCHAR* wsEncode); + CFX_WideString GetLanguage(); + + void PageEvent(int iPageCount, uint32_t dwEventType) const; +#else // PDF_ENABLE_XFA + CPDF_Document* GetPDFDocument() const { return m_pUnderlyingDoc; } +#endif // PDF_ENABLE_XFA + + int JS_appAlert(const FX_WCHAR* Msg, + const FX_WCHAR* Title, + uint32_t Type, + uint32_t Icon); + int JS_appResponse(const FX_WCHAR* Question, + const FX_WCHAR* Title, + const FX_WCHAR* Default, + const FX_WCHAR* cLabel, + FPDF_BOOL bPassword, + void* response, + int length); + void JS_appBeep(int nType); + CFX_WideString JS_fieldBrowse(); + CFX_WideString JS_docGetFilePath(); + void JS_docSubmitForm(void* formData, int length, const FX_WCHAR* URL); + void JS_docmailForm(void* mailData, + int length, + FPDF_BOOL bUI, + const FX_WCHAR* To, + const FX_WCHAR* Subject, + const FX_WCHAR* CC, + const FX_WCHAR* BCC, + const FX_WCHAR* Msg); + void JS_docprint(FPDF_BOOL bUI, + int nStart, + int nEnd, + FPDF_BOOL bSilent, + FPDF_BOOL bShrinkToFit, + FPDF_BOOL bPrintAsImage, + FPDF_BOOL bReverse, + FPDF_BOOL bAnnotations); + void JS_docgotoPage(int nPageNum); + + bool IsJSInitiated() const { return m_pInfo && m_pInfo->m_pJsPlatform; } + CFX_ByteString GetAppName() const { return ""; } + CFX_SystemHandler* GetSysHandler() const { return m_pSysHandler.get(); } + FPDF_FORMFILLINFO* GetFormFillInfo() const { return m_pInfo; } + + // Creates if not present. + CFFL_InteractiveFormFiller* GetInteractiveFormFiller(); + CPDFSDK_AnnotHandlerMgr* GetAnnotHandlerMgr(); // Creates if not present. + IJS_Runtime* GetJSRuntime(); // Creates if not present. + CPDFSDK_ActionHandler* GetActionHander(); // Creates if not present. + CPDFSDK_InterForm* GetInterForm(); // Creates if not present. + + private: + std::unique_ptr m_pAnnotHandlerMgr; + std::unique_ptr m_pActionHandler; + std::unique_ptr m_pJSRuntime; + FPDF_FORMFILLINFO* const m_pInfo; + std::map> m_PageMap; + std::unique_ptr m_pInterForm; + CPDFSDK_Annot::ObservedPtr m_pFocusAnnot; + UnderlyingDocumentType* m_pUnderlyingDoc; + std::unique_ptr m_pFormFiller; + std::unique_ptr m_pSysHandler; + bool m_bChangeMask; + bool m_bBeingDestroyed; +}; + +#endif // FPDFSDK_CPDFSDK_FORMFILLENVIRONMENT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_interform.cpp b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_interform.cpp new file mode 100644 index 000000000000..4ebcf8a2f3d9 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_interform.cpp @@ -0,0 +1,696 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cpdfsdk_interform.h" + +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cfdf_document.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfdoc/cpdf_actionfields.h" +#include "core/fpdfdoc/cpdf_interform.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "fpdfsdk/cba_annotiterator.h" +#include "fpdfsdk/cpdfsdk_annot.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/formfiller/cffl_formfiller.h" +#include "fpdfsdk/fsdk_actionhandler.h" +#include "fpdfsdk/fsdk_define.h" +#include "fpdfsdk/fxedit/fxet_edit.h" +#include "fpdfsdk/ipdfsdk_annothandler.h" +#include "fpdfsdk/javascript/ijs_event_context.h" +#include "fpdfsdk/javascript/ijs_runtime.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" +#include "third_party/base/stl_util.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/cpdfsdk_xfawidget.h" +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#include "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h" +#include "xfa/fxfa/cxfa_eventparam.h" +#include "xfa/fxfa/xfa_ffdocview.h" +#include "xfa/fxfa/xfa_ffwidget.h" +#include "xfa/fxfa/xfa_ffwidgethandler.h" +#endif // PDF_ENABLE_XFA + +CPDFSDK_InterForm::CPDFSDK_InterForm(CPDFSDK_FormFillEnvironment* pFormFillEnv) + : m_pFormFillEnv(pFormFillEnv), + m_pInterForm(new CPDF_InterForm(m_pFormFillEnv->GetPDFDocument())), +#ifdef PDF_ENABLE_XFA + m_bXfaCalculate(true), + m_bXfaValidationsEnabled(true), +#endif // PDF_ENABLE_XFA + m_bCalculate(true), + m_bBusy(false), + m_iHighlightAlpha(0) { + m_pInterForm->SetFormNotify(this); + for (int i = 0; i < kNumFieldTypes; ++i) + m_bNeedHightlight[i] = false; +} + +CPDFSDK_InterForm::~CPDFSDK_InterForm() { + m_Map.clear(); +#ifdef PDF_ENABLE_XFA + m_XFAMap.clear(); +#endif // PDF_ENABLE_XFA +} + +bool CPDFSDK_InterForm::HighlightWidgets() { + return false; +} + +CPDFSDK_Widget* CPDFSDK_InterForm::GetSibling(CPDFSDK_Widget* pWidget, + bool bNext) const { + std::unique_ptr pIterator(new CBA_AnnotIterator( + pWidget->GetPageView(), CPDF_Annot::Subtype::WIDGET)); + + if (bNext) + return static_cast(pIterator->GetNextAnnot(pWidget)); + + return static_cast(pIterator->GetPrevAnnot(pWidget)); +} + +CPDFSDK_Widget* CPDFSDK_InterForm::GetWidget(CPDF_FormControl* pControl) const { + if (!pControl || !m_pInterForm) + return nullptr; + + CPDFSDK_Widget* pWidget = nullptr; + const auto it = m_Map.find(pControl); + if (it != m_Map.end()) + pWidget = it->second; + if (pWidget) + return pWidget; + + CPDF_Dictionary* pControlDict = pControl->GetWidget(); + CPDF_Document* pDocument = m_pFormFillEnv->GetPDFDocument(); + CPDFSDK_PageView* pPage = nullptr; + + if (CPDF_Dictionary* pPageDict = pControlDict->GetDictFor("P")) { + int nPageIndex = pDocument->GetPageIndex(pPageDict->GetObjNum()); + if (nPageIndex >= 0) + pPage = m_pFormFillEnv->GetPageView(nPageIndex); + } + + if (!pPage) { + int nPageIndex = GetPageIndexByAnnotDict(pDocument, pControlDict); + if (nPageIndex >= 0) + pPage = m_pFormFillEnv->GetPageView(nPageIndex); + } + + if (!pPage) + return nullptr; + + return static_cast(pPage->GetAnnotByDict(pControlDict)); +} + +void CPDFSDK_InterForm::GetWidgets( + const CFX_WideString& sFieldName, + std::vector* widgets) const { + for (int i = 0, sz = m_pInterForm->CountFields(sFieldName); i < sz; ++i) { + CPDF_FormField* pFormField = m_pInterForm->GetField(i, sFieldName); + ASSERT(pFormField); + GetWidgets(pFormField, widgets); + } +} + +void CPDFSDK_InterForm::GetWidgets( + CPDF_FormField* pField, + std::vector* widgets) const { + for (int i = 0, sz = pField->CountControls(); i < sz; ++i) { + CPDF_FormControl* pFormCtrl = pField->GetControl(i); + ASSERT(pFormCtrl); + CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl); + if (pWidget) + widgets->emplace_back(pWidget); + } +} + +int CPDFSDK_InterForm::GetPageIndexByAnnotDict( + CPDF_Document* pDocument, + CPDF_Dictionary* pAnnotDict) const { + ASSERT(pAnnotDict); + + for (int i = 0, sz = pDocument->GetPageCount(); i < sz; i++) { + if (CPDF_Dictionary* pPageDict = pDocument->GetPage(i)) { + if (CPDF_Array* pAnnots = pPageDict->GetArrayFor("Annots")) { + for (int j = 0, jsz = pAnnots->GetCount(); j < jsz; j++) { + CPDF_Object* pDict = pAnnots->GetDirectObjectAt(j); + if (pAnnotDict == pDict) + return i; + } + } + } + } + + return -1; +} + +void CPDFSDK_InterForm::AddMap(CPDF_FormControl* pControl, + CPDFSDK_Widget* pWidget) { + m_Map[pControl] = pWidget; +} + +void CPDFSDK_InterForm::RemoveMap(CPDF_FormControl* pControl) { + m_Map.erase(pControl); +} + +void CPDFSDK_InterForm::EnableCalculate(bool bEnabled) { + m_bCalculate = bEnabled; +} + +bool CPDFSDK_InterForm::IsCalculateEnabled() const { + return m_bCalculate; +} + +#ifdef PDF_ENABLE_XFA +void CPDFSDK_InterForm::AddXFAMap(CXFA_FFWidget* hWidget, + CPDFSDK_XFAWidget* pWidget) { + ASSERT(hWidget); + m_XFAMap[hWidget] = pWidget; +} + +void CPDFSDK_InterForm::RemoveXFAMap(CXFA_FFWidget* hWidget) { + ASSERT(hWidget); + m_XFAMap.erase(hWidget); +} + +CPDFSDK_XFAWidget* CPDFSDK_InterForm::GetXFAWidget(CXFA_FFWidget* hWidget) { + ASSERT(hWidget); + auto it = m_XFAMap.find(hWidget); + return it != m_XFAMap.end() ? it->second : nullptr; +} + +void CPDFSDK_InterForm::XfaEnableCalculate(bool bEnabled) { + m_bXfaCalculate = bEnabled; +} +bool CPDFSDK_InterForm::IsXfaCalculateEnabled() const { + return m_bXfaCalculate; +} + +bool CPDFSDK_InterForm::IsXfaValidationsEnabled() { + return m_bXfaValidationsEnabled; +} +void CPDFSDK_InterForm::XfaSetValidationsEnabled(bool bEnabled) { + m_bXfaValidationsEnabled = bEnabled; +} + +void CPDFSDK_InterForm::SynchronizeField(CPDF_FormField* pFormField, + bool bSynchronizeElse) { + for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { + CPDF_FormControl* pFormCtrl = pFormField->GetControl(i); + if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl)) + pWidget->Synchronize(bSynchronizeElse); + } +} +#endif // PDF_ENABLE_XFA + +void CPDFSDK_InterForm::OnCalculate(CPDF_FormField* pFormField) { + if (!m_pFormFillEnv->IsJSInitiated()) + return; + + if (m_bBusy) + return; + + m_bBusy = true; + + if (!IsCalculateEnabled()) { + m_bBusy = false; + return; + } + + IJS_Runtime* pRuntime = m_pFormFillEnv->GetJSRuntime(); + int nSize = m_pInterForm->CountFieldsInCalculationOrder(); + for (int i = 0; i < nSize; i++) { + CPDF_FormField* pField = m_pInterForm->GetFieldInCalculationOrder(i); + if (!pField) + continue; + + int nType = pField->GetFieldType(); + if (nType != FIELDTYPE_COMBOBOX && nType != FIELDTYPE_TEXTFIELD) + continue; + + CPDF_AAction aAction = pField->GetAdditionalAction(); + if (!aAction.GetDict() || !aAction.ActionExist(CPDF_AAction::Calculate)) + continue; + + CPDF_Action action = aAction.GetAction(CPDF_AAction::Calculate); + if (!action.GetDict()) + continue; + + CFX_WideString csJS = action.GetJavaScript(); + if (csJS.IsEmpty()) + continue; + + IJS_EventContext* pContext = pRuntime->NewEventContext(); + CFX_WideString sOldValue = pField->GetValue(); + CFX_WideString sValue = sOldValue; + bool bRC = true; + pContext->OnField_Calculate(pFormField, pField, sValue, bRC); + + CFX_WideString sInfo; + bool bRet = pContext->RunScript(csJS, &sInfo); + pRuntime->ReleaseEventContext(pContext); + if (bRet && bRC && sValue.Compare(sOldValue) != 0) + pField->SetValue(sValue, true); + } + m_bBusy = false; +} + +CFX_WideString CPDFSDK_InterForm::OnFormat(CPDF_FormField* pFormField, + bool& bFormatted) { + CFX_WideString sValue = pFormField->GetValue(); + if (!m_pFormFillEnv->IsJSInitiated()) { + bFormatted = false; + return sValue; + } + + IJS_Runtime* pRuntime = m_pFormFillEnv->GetJSRuntime(); + if (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX && + pFormField->CountSelectedItems() > 0) { + int index = pFormField->GetSelectedIndex(0); + if (index >= 0) + sValue = pFormField->GetOptionLabel(index); + } + + bFormatted = false; + + CPDF_AAction aAction = pFormField->GetAdditionalAction(); + if (aAction.GetDict() && aAction.ActionExist(CPDF_AAction::Format)) { + CPDF_Action action = aAction.GetAction(CPDF_AAction::Format); + if (action.GetDict()) { + CFX_WideString script = action.GetJavaScript(); + if (!script.IsEmpty()) { + CFX_WideString Value = sValue; + + IJS_EventContext* pContext = pRuntime->NewEventContext(); + pContext->OnField_Format(pFormField, Value, true); + CFX_WideString sInfo; + bool bRet = pContext->RunScript(script, &sInfo); + pRuntime->ReleaseEventContext(pContext); + if (bRet) { + sValue = Value; + bFormatted = true; + } + } + } + } + return sValue; +} + +void CPDFSDK_InterForm::ResetFieldAppearance(CPDF_FormField* pFormField, + const CFX_WideString* sValue, + bool bValueChanged) { + for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { + CPDF_FormControl* pFormCtrl = pFormField->GetControl(i); + ASSERT(pFormCtrl); + if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl)) + pWidget->ResetAppearance(sValue, bValueChanged); + } +} + +void CPDFSDK_InterForm::UpdateField(CPDF_FormField* pFormField) { + auto formfiller = m_pFormFillEnv->GetInteractiveFormFiller(); + for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { + CPDF_FormControl* pFormCtrl = pFormField->GetControl(i); + ASSERT(pFormCtrl); + + if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl)) { + UnderlyingPageType* pPage = pWidget->GetUnderlyingPage(); + m_pFormFillEnv->Invalidate( + pPage, formfiller->GetViewBBox( + m_pFormFillEnv->GetPageView(pPage, false), pWidget)); + } + } +} + +bool CPDFSDK_InterForm::OnKeyStrokeCommit(CPDF_FormField* pFormField, + const CFX_WideString& csValue) { + CPDF_AAction aAction = pFormField->GetAdditionalAction(); + if (!aAction.GetDict() || !aAction.ActionExist(CPDF_AAction::KeyStroke)) + return true; + + CPDF_Action action = aAction.GetAction(CPDF_AAction::KeyStroke); + if (!action.GetDict()) + return true; + + CPDFSDK_ActionHandler* pActionHandler = m_pFormFillEnv->GetActionHander(); + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(0); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(0); + fa.sValue = csValue; + pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::KeyStroke, + m_pFormFillEnv, pFormField, fa); + return fa.bRC; +} + +bool CPDFSDK_InterForm::OnValidate(CPDF_FormField* pFormField, + const CFX_WideString& csValue) { + CPDF_AAction aAction = pFormField->GetAdditionalAction(); + if (!aAction.GetDict() || !aAction.ActionExist(CPDF_AAction::Validate)) + return true; + + CPDF_Action action = aAction.GetAction(CPDF_AAction::Validate); + if (!action.GetDict()) + return true; + + CPDFSDK_ActionHandler* pActionHandler = m_pFormFillEnv->GetActionHander(); + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(0); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(0); + fa.sValue = csValue; + pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::Validate, + m_pFormFillEnv, pFormField, fa); + return fa.bRC; +} + +bool CPDFSDK_InterForm::DoAction_Hide(const CPDF_Action& action) { + ASSERT(action.GetDict()); + + CPDF_ActionFields af(&action); + std::vector fieldObjects = af.GetAllFields(); + std::vector fields = GetFieldFromObjects(fieldObjects); + + bool bHide = action.GetHideStatus(); + bool bChanged = false; + + for (CPDF_FormField* pField : fields) { + for (int i = 0, sz = pField->CountControls(); i < sz; ++i) { + CPDF_FormControl* pControl = pField->GetControl(i); + ASSERT(pControl); + + if (CPDFSDK_Widget* pWidget = GetWidget(pControl)) { + uint32_t nFlags = pWidget->GetFlags(); + nFlags &= ~ANNOTFLAG_INVISIBLE; + nFlags &= ~ANNOTFLAG_NOVIEW; + if (bHide) + nFlags |= ANNOTFLAG_HIDDEN; + else + nFlags &= ~ANNOTFLAG_HIDDEN; + pWidget->SetFlags(nFlags); + pWidget->GetPageView()->UpdateView(pWidget); + bChanged = true; + } + } + } + + return bChanged; +} + +bool CPDFSDK_InterForm::DoAction_SubmitForm(const CPDF_Action& action) { + CFX_WideString sDestination = action.GetFilePath(); + if (sDestination.IsEmpty()) + return false; + + CPDF_Dictionary* pActionDict = action.GetDict(); + if (pActionDict->KeyExist("Fields")) { + CPDF_ActionFields af(&action); + uint32_t dwFlags = action.GetFlags(); + std::vector fieldObjects = af.GetAllFields(); + std::vector fields = GetFieldFromObjects(fieldObjects); + if (!fields.empty()) { + bool bIncludeOrExclude = !(dwFlags & 0x01); + if (!m_pInterForm->CheckRequiredFields(&fields, bIncludeOrExclude)) + return false; + + return SubmitFields(sDestination, fields, bIncludeOrExclude, false); + } + } + if (!m_pInterForm->CheckRequiredFields(nullptr, true)) + return false; + + return SubmitForm(sDestination, false); +} + +bool CPDFSDK_InterForm::SubmitFields(const CFX_WideString& csDestination, + const std::vector& fields, + bool bIncludeOrExclude, + bool bUrlEncoded) { + CFX_ByteTextBuf textBuf; + ExportFieldsToFDFTextBuf(fields, bIncludeOrExclude, textBuf); + + uint8_t* pBuffer = textBuf.GetBuffer(); + FX_STRSIZE nBufSize = textBuf.GetLength(); + + if (bUrlEncoded && !FDFToURLEncodedData(pBuffer, nBufSize)) + return false; + + m_pFormFillEnv->JS_docSubmitForm(pBuffer, nBufSize, csDestination.c_str()); + return true; +} + +bool CPDFSDK_InterForm::FDFToURLEncodedData(CFX_WideString csFDFFile, + CFX_WideString csTxtFile) { + return true; +} + +bool CPDFSDK_InterForm::FDFToURLEncodedData(uint8_t*& pBuf, + FX_STRSIZE& nBufSize) { + std::unique_ptr pFDF = + CFDF_Document::ParseMemory(pBuf, nBufSize); + if (!pFDF) + return true; + + CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDictFor("FDF"); + if (!pMainDict) + return false; + + CPDF_Array* pFields = pMainDict->GetArrayFor("Fields"); + if (!pFields) + return false; + + CFX_ByteTextBuf fdfEncodedData; + for (uint32_t i = 0; i < pFields->GetCount(); i++) { + CPDF_Dictionary* pField = pFields->GetDictAt(i); + if (!pField) + continue; + CFX_WideString name; + name = pField->GetUnicodeTextFor("T"); + CFX_ByteString name_b = CFX_ByteString::FromUnicode(name); + CFX_ByteString csBValue = pField->GetStringFor("V"); + CFX_WideString csWValue = PDF_DecodeText(csBValue); + CFX_ByteString csValue_b = CFX_ByteString::FromUnicode(csWValue); + + fdfEncodedData << name_b.GetBuffer(name_b.GetLength()); + name_b.ReleaseBuffer(); + fdfEncodedData << "="; + fdfEncodedData << csValue_b.GetBuffer(csValue_b.GetLength()); + csValue_b.ReleaseBuffer(); + if (i != pFields->GetCount() - 1) + fdfEncodedData << "&"; + } + + nBufSize = fdfEncodedData.GetLength(); + pBuf = FX_Alloc(uint8_t, nBufSize); + FXSYS_memcpy(pBuf, fdfEncodedData.GetBuffer(), nBufSize); + return true; +} + +bool CPDFSDK_InterForm::ExportFieldsToFDFTextBuf( + const std::vector& fields, + bool bIncludeOrExclude, + CFX_ByteTextBuf& textBuf) { + std::unique_ptr pFDF = + m_pInterForm->ExportToFDF(m_pFormFillEnv->JS_docGetFilePath().AsStringC(), + fields, bIncludeOrExclude, false); + return pFDF ? pFDF->WriteBuf(textBuf) : false; +} + +CFX_WideString CPDFSDK_InterForm::GetTemporaryFileName( + const CFX_WideString& sFileExt) { + return L""; +} + +bool CPDFSDK_InterForm::SubmitForm(const CFX_WideString& sDestination, + bool bUrlEncoded) { + if (sDestination.IsEmpty()) + return false; + + if (!m_pFormFillEnv || !m_pInterForm) + return false; + + std::unique_ptr pFDFDoc = m_pInterForm->ExportToFDF( + m_pFormFillEnv->JS_docGetFilePath().AsStringC(), false); + if (!pFDFDoc) + return false; + + CFX_ByteTextBuf FdfBuffer; + if (!pFDFDoc->WriteBuf(FdfBuffer)) + return false; + + uint8_t* pBuffer = FdfBuffer.GetBuffer(); + FX_STRSIZE nBufSize = FdfBuffer.GetLength(); + if (bUrlEncoded && !FDFToURLEncodedData(pBuffer, nBufSize)) + return false; + + m_pFormFillEnv->JS_docSubmitForm(pBuffer, nBufSize, sDestination.c_str()); + if (bUrlEncoded) + FX_Free(pBuffer); + + return true; +} + +bool CPDFSDK_InterForm::ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf) { + std::unique_ptr pFDF = m_pInterForm->ExportToFDF( + m_pFormFillEnv->JS_docGetFilePath().AsStringC(), false); + return pFDF && pFDF->WriteBuf(textBuf); +} + +bool CPDFSDK_InterForm::DoAction_ResetForm(const CPDF_Action& action) { + ASSERT(action.GetDict()); + + CPDF_Dictionary* pActionDict = action.GetDict(); + if (!pActionDict->KeyExist("Fields")) + return m_pInterForm->ResetForm(true); + + CPDF_ActionFields af(&action); + uint32_t dwFlags = action.GetFlags(); + + std::vector fieldObjects = af.GetAllFields(); + std::vector fields = GetFieldFromObjects(fieldObjects); + return m_pInterForm->ResetForm(fields, !(dwFlags & 0x01), true); +} + +bool CPDFSDK_InterForm::DoAction_ImportData(const CPDF_Action& action) { + return false; +} + +std::vector CPDFSDK_InterForm::GetFieldFromObjects( + const std::vector& objects) const { + std::vector fields; + for (CPDF_Object* pObject : objects) { + if (pObject && pObject->IsString()) { + CFX_WideString csName = pObject->GetUnicodeText(); + CPDF_FormField* pField = m_pInterForm->GetField(0, csName); + if (pField) + fields.push_back(pField); + } + } + return fields; +} + +int CPDFSDK_InterForm::BeforeValueChange(CPDF_FormField* pField, + const CFX_WideString& csValue) { + int nType = pField->GetFieldType(); + if (nType != FIELDTYPE_COMBOBOX && nType != FIELDTYPE_TEXTFIELD) + return 0; + + if (!OnKeyStrokeCommit(pField, csValue)) + return -1; + + if (!OnValidate(pField, csValue)) + return -1; + + return 1; +} + +void CPDFSDK_InterForm::AfterValueChange(CPDF_FormField* pField) { +#ifdef PDF_ENABLE_XFA + SynchronizeField(pField, false); +#endif // PDF_ENABLE_XFA + int nType = pField->GetFieldType(); + if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD) { + OnCalculate(pField); + bool bFormatted = false; + CFX_WideString sValue = OnFormat(pField, bFormatted); + ResetFieldAppearance(pField, bFormatted ? &sValue : nullptr, true); + UpdateField(pField); + } +} + +int CPDFSDK_InterForm::BeforeSelectionChange(CPDF_FormField* pField, + const CFX_WideString& csValue) { + if (pField->GetFieldType() != FIELDTYPE_LISTBOX) + return 0; + + if (!OnKeyStrokeCommit(pField, csValue)) + return -1; + + if (!OnValidate(pField, csValue)) + return -1; + + return 1; +} + +void CPDFSDK_InterForm::AfterSelectionChange(CPDF_FormField* pField) { + if (pField->GetFieldType() != FIELDTYPE_LISTBOX) + return; + + OnCalculate(pField); + ResetFieldAppearance(pField, nullptr, true); + UpdateField(pField); +} + +void CPDFSDK_InterForm::AfterCheckedStatusChange(CPDF_FormField* pField) { + int nType = pField->GetFieldType(); + if (nType != FIELDTYPE_CHECKBOX && nType != FIELDTYPE_RADIOBUTTON) + return; + + OnCalculate(pField); + UpdateField(pField); +} + +int CPDFSDK_InterForm::BeforeFormReset(CPDF_InterForm* pForm) { + return 0; +} + +void CPDFSDK_InterForm::AfterFormReset(CPDF_InterForm* pForm) { + OnCalculate(nullptr); +} + +int CPDFSDK_InterForm::BeforeFormImportData(CPDF_InterForm* pForm) { + return 0; +} + +void CPDFSDK_InterForm::AfterFormImportData(CPDF_InterForm* pForm) { + OnCalculate(nullptr); +} + +bool CPDFSDK_InterForm::IsNeedHighLight(int nFieldType) { + if (nFieldType < 1 || nFieldType > kNumFieldTypes) + return false; + return m_bNeedHightlight[nFieldType - 1]; +} + +void CPDFSDK_InterForm::RemoveAllHighLight() { + for (int i = 0; i < kNumFieldTypes; ++i) + m_bNeedHightlight[i] = false; +} + +void CPDFSDK_InterForm::SetHighlightColor(FX_COLORREF clr, int nFieldType) { + if (nFieldType < 0 || nFieldType > kNumFieldTypes) + return; + switch (nFieldType) { + case 0: { + for (int i = 0; i < kNumFieldTypes; ++i) { + m_aHighlightColor[i] = clr; + m_bNeedHightlight[i] = true; + } + break; + } + default: { + m_aHighlightColor[nFieldType - 1] = clr; + m_bNeedHightlight[nFieldType - 1] = true; + break; + } + } +} + +FX_COLORREF CPDFSDK_InterForm::GetHighlightColor(int nFieldType) { + if (nFieldType < 0 || nFieldType > kNumFieldTypes) + return FXSYS_RGB(255, 255, 255); + if (nFieldType == 0) + return m_aHighlightColor[0]; + return m_aHighlightColor[nFieldType - 1]; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_interform.h b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_interform.h new file mode 100644 index 000000000000..032399c84e46 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_interform.h @@ -0,0 +1,143 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CPDFSDK_INTERFORM_H_ +#define FPDFSDK_CPDFSDK_INTERFORM_H_ + +#include +#include +#include + +#include "core/fpdfdoc/cpdf_action.h" +#include "core/fpdfdoc/ipdf_formnotify.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxge/fx_dib.h" +#include "fpdfsdk/cpdfsdk_widget.h" + +class CPDF_Dictionary; +class CPDF_FormControl; +class CPDF_FormField; +class CPDF_InterForm; +class CPDF_Object; +class CPDFSDK_FormFillEnvironment; + +#ifdef PDF_ENABLE_XFA +class CPDFSDK_XFAWidget; +class CXFA_FFWidget; +#endif // PDF_ENABLE_XFA + +class CPDFSDK_InterForm : public IPDF_FormNotify { + public: + explicit CPDFSDK_InterForm(CPDFSDK_FormFillEnvironment* pFormFillEnv); + ~CPDFSDK_InterForm() override; + + CPDF_InterForm* GetInterForm() const { return m_pInterForm.get(); } + CPDFSDK_FormFillEnvironment* GetFormFillEnv() const { return m_pFormFillEnv; } + + bool HighlightWidgets(); + + CPDFSDK_Widget* GetSibling(CPDFSDK_Widget* pWidget, bool bNext) const; + CPDFSDK_Widget* GetWidget(CPDF_FormControl* pControl) const; + void GetWidgets(const CFX_WideString& sFieldName, + std::vector* widgets) const; + void GetWidgets(CPDF_FormField* pField, + std::vector* widgets) const; + + void AddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidget); + void RemoveMap(CPDF_FormControl* pControl); + + void EnableCalculate(bool bEnabled); + bool IsCalculateEnabled() const; + +#ifdef PDF_ENABLE_XFA + void AddXFAMap(CXFA_FFWidget* hWidget, CPDFSDK_XFAWidget* pWidget); + void RemoveXFAMap(CXFA_FFWidget* hWidget); + CPDFSDK_XFAWidget* GetXFAWidget(CXFA_FFWidget* hWidget); + void XfaEnableCalculate(bool bEnabled); + bool IsXfaCalculateEnabled() const; + bool IsXfaValidationsEnabled(); + void XfaSetValidationsEnabled(bool bEnabled); + void SynchronizeField(CPDF_FormField* pFormField, bool bSynchronizeElse); +#endif // PDF_ENABLE_XFA + + bool OnKeyStrokeCommit(CPDF_FormField* pFormField, + const CFX_WideString& csValue); + bool OnValidate(CPDF_FormField* pFormField, const CFX_WideString& csValue); + void OnCalculate(CPDF_FormField* pFormField = nullptr); + CFX_WideString OnFormat(CPDF_FormField* pFormField, bool& bFormatted); + + void ResetFieldAppearance(CPDF_FormField* pFormField, + const CFX_WideString* sValue, + bool bValueChanged); + void UpdateField(CPDF_FormField* pFormField); + + bool DoAction_Hide(const CPDF_Action& action); + bool DoAction_SubmitForm(const CPDF_Action& action); + bool DoAction_ResetForm(const CPDF_Action& action); + bool DoAction_ImportData(const CPDF_Action& action); + + std::vector GetFieldFromObjects( + const std::vector& objects) const; + bool IsValidField(CPDF_Dictionary* pFieldDict); + bool SubmitFields(const CFX_WideString& csDestination, + const std::vector& fields, + bool bIncludeOrExclude, + bool bUrlEncoded); + bool SubmitForm(const CFX_WideString& sDestination, bool bUrlEncoded); + bool ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf); + bool ExportFieldsToFDFTextBuf(const std::vector& fields, + bool bIncludeOrExclude, + CFX_ByteTextBuf& textBuf); + CFX_WideString GetTemporaryFileName(const CFX_WideString& sFileExt); + + bool IsNeedHighLight(int nFieldType); + void RemoveAllHighLight(); + void SetHighlightAlpha(uint8_t alpha) { m_iHighlightAlpha = alpha; } + uint8_t GetHighlightAlpha() { return m_iHighlightAlpha; } + void SetHighlightColor(FX_COLORREF clr, int nFieldType); + FX_COLORREF GetHighlightColor(int nFieldType); + + private: + // IPDF_FormNotify: + int BeforeValueChange(CPDF_FormField* pField, + const CFX_WideString& csValue) override; + void AfterValueChange(CPDF_FormField* pField) override; + int BeforeSelectionChange(CPDF_FormField* pField, + const CFX_WideString& csValue) override; + void AfterSelectionChange(CPDF_FormField* pField) override; + void AfterCheckedStatusChange(CPDF_FormField* pField) override; + int BeforeFormReset(CPDF_InterForm* pForm) override; + void AfterFormReset(CPDF_InterForm* pForm) override; + int BeforeFormImportData(CPDF_InterForm* pForm) override; + void AfterFormImportData(CPDF_InterForm* pForm) override; + + bool FDFToURLEncodedData(CFX_WideString csFDFFile, CFX_WideString csTxtFile); + bool FDFToURLEncodedData(uint8_t*& pBuf, FX_STRSIZE& nBufSize); + int GetPageIndexByAnnotDict(CPDF_Document* pDocument, + CPDF_Dictionary* pAnnotDict) const; + + using CPDFSDK_WidgetMap = std::map; + + CPDFSDK_FormFillEnvironment* m_pFormFillEnv; // Not owned. + std::unique_ptr m_pInterForm; + CPDFSDK_WidgetMap m_Map; +#ifdef PDF_ENABLE_XFA + std::map m_XFAMap; + bool m_bXfaCalculate; + bool m_bXfaValidationsEnabled; + static const int kNumFieldTypes = 7; +#else // PDF_ENABLE_XFA + static const int kNumFieldTypes = 6; +#endif // PDF_ENABLE_XFA + bool m_bCalculate; + bool m_bBusy; + + FX_COLORREF m_aHighlightColor[kNumFieldTypes]; + uint8_t m_iHighlightAlpha; + bool m_bNeedHightlight[kNumFieldTypes]; +}; + +#endif // FPDFSDK_CPDFSDK_INTERFORM_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_pageview.cpp b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_pageview.cpp new file mode 100644 index 000000000000..c67948da9066 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_pageview.cpp @@ -0,0 +1,492 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cpdfsdk_pageview.h" + +#include +#include + +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fpdfdoc/cpdf_annotlist.h" +#include "core/fpdfdoc/cpdf_interform.h" +#include "fpdfsdk/cpdfsdk_annot.h" +#include "fpdfsdk/cpdfsdk_annothandlermgr.h" +#include "fpdfsdk/cpdfsdk_annotiteration.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "third_party/base/ptr_util.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" +#include "xfa/fxfa/xfa_ffdocview.h" +#include "xfa/fxfa/xfa_ffpageview.h" +#include "xfa/fxfa/xfa_ffwidgethandler.h" +#include "xfa/fxfa/xfa_rendercontext.h" +#include "xfa/fxgraphics/cfx_graphics.h" +#endif // PDF_ENABLE_XFA + +CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_FormFillEnvironment* pFormFillEnv, + UnderlyingPageType* page) + : m_page(page), + m_pFormFillEnv(pFormFillEnv), +#ifndef PDF_ENABLE_XFA + m_bOwnsPage(false), +#endif // PDF_ENABLE_XFA + m_bEnterWidget(false), + m_bExitWidget(false), + m_bOnWidget(false), + m_bValid(false), + m_bLocked(false), + m_bBeingDestroyed(false) { + CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm(); + if (pInterForm) { + CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm(); +#ifdef PDF_ENABLE_XFA + if (page->GetPDFPage()) + pPDFInterForm->FixPageFields(page->GetPDFPage()); +#else // PDF_ENABLE_XFA + pPDFInterForm->FixPageFields(page); +#endif // PDF_ENABLE_XFA + } +#ifndef PDF_ENABLE_XFA + m_page->SetView(this); +#endif // PDF_ENABLE_XFA +} + +CPDFSDK_PageView::~CPDFSDK_PageView() { +#ifndef PDF_ENABLE_XFA + // The call to |ReleaseAnnot| can cause the page pointed to by |m_page| to + // be freed, which will cause issues if we try to cleanup the pageview pointer + // in |m_page|. So, reset the pageview pointer before doing anything else. + m_page->SetView(nullptr); +#endif // PDF_ENABLE_XFA + + CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = + m_pFormFillEnv->GetAnnotHandlerMgr(); + for (CPDFSDK_Annot* pAnnot : m_SDKAnnotArray) + pAnnotHandlerMgr->ReleaseAnnot(pAnnot); + + m_SDKAnnotArray.clear(); + m_pAnnotList.reset(); + +#ifndef PDF_ENABLE_XFA + if (m_bOwnsPage) + delete m_page; +#endif // PDF_ENABLE_XFA +} + +void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, +#ifdef PDF_ENABLE_XFA + CPDF_RenderOptions* pOptions, + const FX_RECT& pClip) { +#else + CPDF_RenderOptions* pOptions) { +#endif // PDF_ENABLE_XFA + m_curMatrix = *pUser2Device; + +#ifdef PDF_ENABLE_XFA + CPDFXFA_Page* pPage = GetPDFXFAPage(); + if (!pPage) + return; + + if (pPage->GetContext()->GetDocType() == DOCTYPE_DYNAMIC_XFA) { + CFX_Graphics gs(pDevice); + CFX_RectF rectClip(static_cast(pClip.left), + static_cast(pClip.top), + static_cast(pClip.Width()), + static_cast(pClip.Height())); + gs.SetClipRect(rectClip); + std::unique_ptr pRenderContext(new CXFA_RenderContext); + CXFA_RenderOptions renderOptions; + renderOptions.m_bHighlight = true; + CXFA_FFPageView* xfaView = pPage->GetXFAPageView(); + pRenderContext->StartRender(xfaView, &gs, *pUser2Device, renderOptions); + pRenderContext->DoRender(); + pRenderContext->StopRender(); + CXFA_FFDocView* docView = xfaView->GetDocView(); + if (!docView) + return; + CPDFSDK_Annot* annot = GetFocusAnnot(); + if (!annot) + return; + // Render the focus widget + docView->GetWidgetHandler()->RenderWidget(annot->GetXFAWidget(), &gs, + pUser2Device, false); + return; + } +#endif // PDF_ENABLE_XFA + + // for pdf/static xfa. + CPDFSDK_AnnotIteration annotIteration(this, true); + for (const auto& pSDKAnnot : annotIteration) { + m_pFormFillEnv->GetAnnotHandlerMgr()->Annot_OnDraw( + this, pSDKAnnot.Get(), pDevice, pUser2Device, pOptions->m_bDrawAnnots); + } +} + +CPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(const CFX_PointF& point) { + CPDFSDK_AnnotHandlerMgr* pAnnotMgr = m_pFormFillEnv->GetAnnotHandlerMgr(); + CPDFSDK_AnnotIteration annotIteration(this, false); + for (const auto& pSDKAnnot : annotIteration) { + CFX_FloatRect rc = pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot.Get()); + if (pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::POPUP) + continue; + if (rc.Contains(point)) + return pSDKAnnot.Get(); + } + return nullptr; +} + +CPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(const CFX_PointF& point) { + CPDFSDK_AnnotHandlerMgr* pAnnotMgr = m_pFormFillEnv->GetAnnotHandlerMgr(); + CPDFSDK_AnnotIteration annotIteration(this, false); + for (const auto& pSDKAnnot : annotIteration) { + bool bHitTest = pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET; +#ifdef PDF_ENABLE_XFA + bHitTest = bHitTest || + pSDKAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::XFAWIDGET; +#endif // PDF_ENABLE_XFA + if (bHitTest) { + pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot.Get()); + if (pAnnotMgr->Annot_OnHitTest(this, pSDKAnnot.Get(), point)) + return pSDKAnnot.Get(); + } + } + return nullptr; +} + +#ifdef PDF_ENABLE_XFA +CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CXFA_FFWidget* pPDFAnnot) { + if (!pPDFAnnot) + return nullptr; + + CPDFSDK_Annot* pSDKAnnot = GetAnnotByXFAWidget(pPDFAnnot); + if (pSDKAnnot) + return pSDKAnnot; + + CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pFormFillEnv->GetAnnotHandlerMgr(); + pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this); + if (!pSDKAnnot) + return nullptr; + + m_SDKAnnotArray.push_back(pSDKAnnot); + return pSDKAnnot; +} + +bool CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot) { + if (!pAnnot) + return false; + CPDFXFA_Page* pPage = pAnnot->GetPDFXFAPage(); + if (!pPage || (pPage->GetContext()->GetDocType() != DOCTYPE_STATIC_XFA && + pPage->GetContext()->GetDocType() != DOCTYPE_DYNAMIC_XFA)) + return false; + + if (GetFocusAnnot() == pAnnot) + m_pFormFillEnv->KillFocusAnnot(0); + CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pFormFillEnv->GetAnnotHandlerMgr(); + if (pAnnotHandler) + pAnnotHandler->ReleaseAnnot(pAnnot); + + auto it = std::find(m_SDKAnnotArray.begin(), m_SDKAnnotArray.end(), pAnnot); + if (it != m_SDKAnnotArray.end()) + m_SDKAnnotArray.erase(it); + if (m_pCaptureWidget.Get() == pAnnot) + m_pCaptureWidget.Reset(); + + return true; +} +#endif // PDF_ENABLE_XFA + +CPDF_Document* CPDFSDK_PageView::GetPDFDocument() { + if (m_page) { +#ifdef PDF_ENABLE_XFA + return m_page->GetContext()->GetPDFDoc(); +#else // PDF_ENABLE_XFA + return m_page->m_pDocument; +#endif // PDF_ENABLE_XFA + } + return nullptr; +} + +CPDF_Page* CPDFSDK_PageView::GetPDFPage() const { +#ifdef PDF_ENABLE_XFA + return m_page ? m_page->GetPDFPage() : nullptr; +#else // PDF_ENABLE_XFA + return m_page; +#endif // PDF_ENABLE_XFA +} + +CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByDict(CPDF_Dictionary* pDict) { + for (CPDFSDK_Annot* pAnnot : m_SDKAnnotArray) { + if (pAnnot->GetPDFAnnot()->GetAnnotDict() == pDict) + return pAnnot; + } + return nullptr; +} + +#ifdef PDF_ENABLE_XFA +CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByXFAWidget(CXFA_FFWidget* hWidget) { + if (!hWidget) + return nullptr; + + for (CPDFSDK_Annot* pAnnot : m_SDKAnnotArray) { + if (pAnnot->GetXFAWidget() == hWidget) + return pAnnot; + } + return nullptr; +} +#endif // PDF_ENABLE_XFA + +bool CPDFSDK_PageView::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) { + CPDFSDK_Annot::ObservedPtr pAnnot(GetFXWidgetAtPoint(point)); + if (!pAnnot) { + m_pFormFillEnv->KillFocusAnnot(nFlag); + return false; + } + + CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = + m_pFormFillEnv->GetAnnotHandlerMgr(); + if (!pAnnotHandlerMgr->Annot_OnLButtonDown(this, &pAnnot, nFlag, point)) + return false; + + if (!pAnnot) + return false; + + m_pFormFillEnv->SetFocusAnnot(&pAnnot); + return true; +} + +#ifdef PDF_ENABLE_XFA +bool CPDFSDK_PageView::OnRButtonDown(const CFX_PointF& point, uint32_t nFlag) { + CPDFSDK_Annot::ObservedPtr pAnnot(GetFXWidgetAtPoint(point)); + if (!pAnnot) + return false; + + CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = + m_pFormFillEnv->GetAnnotHandlerMgr(); + bool ok = pAnnotHandlerMgr->Annot_OnRButtonDown(this, &pAnnot, nFlag, point); + if (!pAnnot) + return false; + + if (ok) + m_pFormFillEnv->SetFocusAnnot(&pAnnot); + + return true; +} + +bool CPDFSDK_PageView::OnRButtonUp(const CFX_PointF& point, uint32_t nFlag) { + CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = + m_pFormFillEnv->GetAnnotHandlerMgr(); + CPDFSDK_Annot::ObservedPtr pFXAnnot(GetFXWidgetAtPoint(point)); + if (!pFXAnnot) + return false; + + if (pAnnotHandlerMgr->Annot_OnRButtonUp(this, &pFXAnnot, nFlag, point)) + m_pFormFillEnv->SetFocusAnnot(&pFXAnnot); + + return true; +} +#endif // PDF_ENABLE_XFA + +bool CPDFSDK_PageView::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) { + CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = + m_pFormFillEnv->GetAnnotHandlerMgr(); + CPDFSDK_Annot::ObservedPtr pFXAnnot(GetFXWidgetAtPoint(point)); + CPDFSDK_Annot::ObservedPtr pFocusAnnot(GetFocusAnnot()); + if (pFocusAnnot && pFocusAnnot != pFXAnnot) { + // Last focus Annot gets a chance to handle the event. + if (pAnnotHandlerMgr->Annot_OnLButtonUp(this, &pFocusAnnot, nFlag, point)) + return true; + } + return pFXAnnot && + pAnnotHandlerMgr->Annot_OnLButtonUp(this, &pFXAnnot, nFlag, point); +} + +bool CPDFSDK_PageView::OnMouseMove(const CFX_PointF& point, int nFlag) { + CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = + m_pFormFillEnv->GetAnnotHandlerMgr(); + CPDFSDK_Annot::ObservedPtr pFXAnnot(GetFXAnnotAtPoint(point)); + if (pFXAnnot) { + if (m_pCaptureWidget && m_pCaptureWidget != pFXAnnot) { + m_bExitWidget = true; + m_bEnterWidget = false; + pAnnotHandlerMgr->Annot_OnMouseExit(this, &m_pCaptureWidget, nFlag); + } + m_pCaptureWidget.Reset(pFXAnnot.Get()); + m_bOnWidget = true; + if (!m_bEnterWidget) { + m_bEnterWidget = true; + m_bExitWidget = false; + pAnnotHandlerMgr->Annot_OnMouseEnter(this, &pFXAnnot, nFlag); + } + pAnnotHandlerMgr->Annot_OnMouseMove(this, &pFXAnnot, nFlag, point); + return true; + } + if (m_bOnWidget) { + m_bOnWidget = false; + m_bExitWidget = true; + m_bEnterWidget = false; + if (m_pCaptureWidget) { + pAnnotHandlerMgr->Annot_OnMouseExit(this, &m_pCaptureWidget, nFlag); + m_pCaptureWidget.Reset(); + } + } + return false; +} + +bool CPDFSDK_PageView::OnMouseWheel(double deltaX, + double deltaY, + const CFX_PointF& point, + int nFlag) { + CPDFSDK_Annot::ObservedPtr pAnnot(GetFXWidgetAtPoint(point)); + if (!pAnnot) + return false; + + CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = + m_pFormFillEnv->GetAnnotHandlerMgr(); + return pAnnotHandlerMgr->Annot_OnMouseWheel(this, &pAnnot, nFlag, (int)deltaY, + point); +} + +bool CPDFSDK_PageView::OnChar(int nChar, uint32_t nFlag) { + if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) { + CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = + m_pFormFillEnv->GetAnnotHandlerMgr(); + return pAnnotHandlerMgr->Annot_OnChar(pAnnot, nChar, nFlag); + } + + return false; +} + +bool CPDFSDK_PageView::OnKeyDown(int nKeyCode, int nFlag) { + if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) { + CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = + m_pFormFillEnv->GetAnnotHandlerMgr(); + return pAnnotHandlerMgr->Annot_OnKeyDown(pAnnot, nKeyCode, nFlag); + } + return false; +} + +bool CPDFSDK_PageView::OnKeyUp(int nKeyCode, int nFlag) { + return false; +} + +void CPDFSDK_PageView::LoadFXAnnots() { + CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = + m_pFormFillEnv->GetAnnotHandlerMgr(); + + SetLock(true); + +#ifdef PDF_ENABLE_XFA + CFX_RetainPtr protector(m_page); + if (m_pFormFillEnv->GetXFAContext()->GetDocType() == DOCTYPE_DYNAMIC_XFA) { + CXFA_FFPageView* pageView = m_page->GetXFAPageView(); + std::unique_ptr pWidgetHander( + pageView->CreateWidgetIterator( + XFA_TRAVERSEWAY_Form, + XFA_WidgetStatus_Visible | XFA_WidgetStatus_Viewable)); + if (!pWidgetHander) { + SetLock(false); + return; + } + + while (CXFA_FFWidget* pXFAAnnot = pWidgetHander->MoveToNext()) { + CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pXFAAnnot, this); + if (!pAnnot) + continue; + m_SDKAnnotArray.push_back(pAnnot); + pAnnotHandlerMgr->Annot_OnLoad(pAnnot); + } + + SetLock(false); + return; + } +#endif // PDF_ENABLE_XFA + + CPDF_Page* pPage = GetPDFPage(); + ASSERT(pPage); + bool bUpdateAP = CPDF_InterForm::IsUpdateAPEnabled(); + // Disable the default AP construction. + CPDF_InterForm::SetUpdateAP(false); + m_pAnnotList = pdfium::MakeUnique(pPage); + CPDF_InterForm::SetUpdateAP(bUpdateAP); + + const size_t nCount = m_pAnnotList->Count(); + for (size_t i = 0; i < nCount; ++i) { + CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i); + CheckUnSupportAnnot(GetPDFDocument(), pPDFAnnot); + CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this); + if (!pAnnot) + continue; + m_SDKAnnotArray.push_back(pAnnot); + pAnnotHandlerMgr->Annot_OnLoad(pAnnot); + } + + SetLock(false); +} + +void CPDFSDK_PageView::UpdateRects(const std::vector& rects) { + for (const auto& rc : rects) + m_pFormFillEnv->Invalidate(m_page, rc.ToFxRect()); +} + +void CPDFSDK_PageView::UpdateView(CPDFSDK_Annot* pAnnot) { + CFX_FloatRect rcWindow = pAnnot->GetRect(); + m_pFormFillEnv->Invalidate(m_page, rcWindow.ToFxRect()); +} + +int CPDFSDK_PageView::GetPageIndex() const { + if (!m_page) + return -1; + +#ifdef PDF_ENABLE_XFA + int nDocType = m_page->GetContext()->GetDocType(); + switch (nDocType) { + case DOCTYPE_DYNAMIC_XFA: { + CXFA_FFPageView* pPageView = m_page->GetXFAPageView(); + return pPageView ? pPageView->GetPageIndex() : -1; + } + case DOCTYPE_STATIC_XFA: + case DOCTYPE_PDF: + return GetPageIndexForStaticPDF(); + default: + return -1; + } +#else // PDF_ENABLE_XFA + return GetPageIndexForStaticPDF(); +#endif // PDF_ENABLE_XFA +} + +bool CPDFSDK_PageView::IsValidAnnot(const CPDF_Annot* p) const { + if (!p) + return false; + + const auto& annots = m_pAnnotList->All(); + auto it = std::find_if(annots.begin(), annots.end(), + [p](const std::unique_ptr& annot) { + return annot.get() == p; + }); + return it != annots.end(); +} + +bool CPDFSDK_PageView::IsValidSDKAnnot(const CPDFSDK_Annot* p) const { + if (!p) + return false; + return pdfium::ContainsValue(m_SDKAnnotArray, p); +} + +CPDFSDK_Annot* CPDFSDK_PageView::GetFocusAnnot() { + CPDFSDK_Annot* pFocusAnnot = m_pFormFillEnv->GetFocusAnnot(); + return IsValidSDKAnnot(pFocusAnnot) ? pFocusAnnot : nullptr; +} + +int CPDFSDK_PageView::GetPageIndexForStaticPDF() const { + CPDF_Dictionary* pDict = GetPDFPage()->m_pFormDict; + CPDF_Document* pDoc = m_pFormFillEnv->GetPDFDocument(); + return (pDoc && pDict) ? pDoc->GetPageIndex(pDict->GetObjNum()) : -1; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_pageview.h b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_pageview.h new file mode 100644 index 000000000000..bcd5177c1a7c --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_pageview.h @@ -0,0 +1,118 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CPDFSDK_PAGEVIEW_H_ +#define FPDFSDK_CPDFSDK_PAGEVIEW_H_ + +#include +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fxcrt/fx_system.h" +#include "fpdfsdk/cpdfsdk_annot.h" + +class CFX_RenderDevice; +class CPDF_AnnotList; +class CPDF_RenderOptions; + +class CPDFSDK_PageView final : public CPDF_Page::View { + public: + CPDFSDK_PageView(CPDFSDK_FormFillEnvironment* pFormFillEnv, + UnderlyingPageType* page); + ~CPDFSDK_PageView(); + +#ifdef PDF_ENABLE_XFA + void PageView_OnDraw(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + CPDF_RenderOptions* pOptions, + const FX_RECT& pClip); +#else // PDF_ENABLE_XFA + void PageView_OnDraw(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + CPDF_RenderOptions* pOptions); +#endif // PDF_ENABLE_XFA + + void LoadFXAnnots(); + CPDFSDK_Annot* GetFocusAnnot(); + bool IsValidAnnot(const CPDF_Annot* p) const; + bool IsValidSDKAnnot(const CPDFSDK_Annot* p) const; + + const std::vector& GetAnnotList() const { + return m_SDKAnnotArray; + } + CPDFSDK_Annot* GetAnnotByDict(CPDF_Dictionary* pDict); + +#ifdef PDF_ENABLE_XFA + bool DeleteAnnot(CPDFSDK_Annot* pAnnot); + CPDFSDK_Annot* AddAnnot(CXFA_FFWidget* pPDFAnnot); + CPDFSDK_Annot* GetAnnotByXFAWidget(CXFA_FFWidget* hWidget); + + CPDFXFA_Page* GetPDFXFAPage() { return m_page; } +#endif // PDF_ENABLE_XFA + + CPDF_Page* GetPDFPage() const; + CPDF_Document* GetPDFDocument(); + CPDFSDK_FormFillEnvironment* GetFormFillEnv() const { return m_pFormFillEnv; } + bool OnLButtonDown(const CFX_PointF& point, uint32_t nFlag); + bool OnLButtonUp(const CFX_PointF& point, uint32_t nFlag); +#ifdef PDF_ENABLE_XFA + bool OnRButtonDown(const CFX_PointF& point, uint32_t nFlag); + bool OnRButtonUp(const CFX_PointF& point, uint32_t nFlag); +#endif // PDF_ENABLE_XFA + bool OnChar(int nChar, uint32_t nFlag); + bool OnKeyDown(int nKeyCode, int nFlag); + bool OnKeyUp(int nKeyCode, int nFlag); + + bool OnMouseMove(const CFX_PointF& point, int nFlag); + bool OnMouseWheel(double deltaX, + double deltaY, + const CFX_PointF& point, + int nFlag); + + void GetCurrentMatrix(CFX_Matrix& matrix) { matrix = m_curMatrix; } + void UpdateRects(const std::vector& rects); + void UpdateView(CPDFSDK_Annot* pAnnot); + + int GetPageIndex() const; + + void SetValid(bool bValid) { m_bValid = bValid; } + bool IsValid() { return m_bValid; } + + void SetLock(bool bLocked) { m_bLocked = bLocked; } + bool IsLocked() { return m_bLocked; } + + void SetBeingDestroyed() { m_bBeingDestroyed = true; } + bool IsBeingDestroyed() const { return m_bBeingDestroyed; } + +#ifndef PDF_ENABLE_XFA + bool OwnsPage() const { return m_bOwnsPage; } + void TakePageOwnership() { m_bOwnsPage = true; } +#endif // PDF_ENABLE_XFA + + private: + CPDFSDK_Annot* GetFXAnnotAtPoint(const CFX_PointF& point); + CPDFSDK_Annot* GetFXWidgetAtPoint(const CFX_PointF& point); + + int GetPageIndexForStaticPDF() const; + + CFX_Matrix m_curMatrix; + UnderlyingPageType* const m_page; + std::unique_ptr m_pAnnotList; + std::vector m_SDKAnnotArray; + CPDFSDK_FormFillEnvironment* const m_pFormFillEnv; // Not owned. + CPDFSDK_Annot::ObservedPtr m_pCaptureWidget; +#ifndef PDF_ENABLE_XFA + bool m_bOwnsPage; +#endif // PDF_ENABLE_XFA + bool m_bEnterWidget; + bool m_bExitWidget; + bool m_bOnWidget; + bool m_bValid; + bool m_bLocked; + bool m_bBeingDestroyed; +}; + +#endif // FPDFSDK_CPDFSDK_PAGEVIEW_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widget.cpp b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widget.cpp new file mode 100644 index 000000000000..cd86f7a0b5d2 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widget.cpp @@ -0,0 +1,1910 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cpdfsdk_widget.h" + +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfdoc/cpdf_defaultappearance.h" +#include "core/fpdfdoc/cpdf_formcontrol.h" +#include "core/fpdfdoc/cpdf_formfield.h" +#include "core/fpdfdoc/cpdf_iconfit.h" +#include "core/fpdfdoc/cpdf_interform.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/formfiller/cba_fontmap.h" +#include "fpdfsdk/fsdk_actionhandler.h" +#include "fpdfsdk/fsdk_define.h" +#include "fpdfsdk/fxedit/fxet_edit.h" +#include "fpdfsdk/pdfwindow/PWL_Edit.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#include "xfa/fxfa/cxfa_eventparam.h" +#include "xfa/fxfa/fxfa_widget.h" +#include "xfa/fxfa/xfa_ffdocview.h" +#include "xfa/fxfa/xfa_ffwidget.h" +#include "xfa/fxfa/xfa_ffwidgethandler.h" +#endif // PDF_ENABLE_XFA + +namespace { + +// Convert a FX_ARGB to a FX_COLORREF. +FX_COLORREF ARGBToColorRef(FX_ARGB argb) { + return (((static_cast(argb) & 0x00FF0000) >> 16) | + (static_cast(argb) & 0x0000FF00) | + ((static_cast(argb) & 0x000000FF) << 16)); +} + +} // namespace + +CPDFSDK_Widget::CPDFSDK_Widget(CPDF_Annot* pAnnot, + CPDFSDK_PageView* pPageView, + CPDFSDK_InterForm* pInterForm) + : CPDFSDK_BAAnnot(pAnnot, pPageView), + m_pInterForm(pInterForm), + m_nAppAge(0), + m_nValueAge(0) +#ifdef PDF_ENABLE_XFA + , + m_hMixXFAWidget(nullptr), + m_pWidgetHandler(nullptr) +#endif // PDF_ENABLE_XFA +{ +} + +CPDFSDK_Widget::~CPDFSDK_Widget() {} + +#ifdef PDF_ENABLE_XFA +CXFA_FFWidget* CPDFSDK_Widget::GetMixXFAWidget() const { + CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext(); + if (pContext->GetDocType() == DOCTYPE_STATIC_XFA) { + if (!m_hMixXFAWidget) { + if (CXFA_FFDocView* pDocView = pContext->GetXFADocView()) { + CFX_WideString sName; + if (GetFieldType() == FIELDTYPE_RADIOBUTTON) { + sName = GetAnnotName(); + if (sName.IsEmpty()) + sName = GetName(); + } else { + sName = GetName(); + } + + if (!sName.IsEmpty()) + m_hMixXFAWidget = pDocView->GetWidgetByName(sName, nullptr); + } + } + return m_hMixXFAWidget; + } + + return nullptr; +} + +CXFA_FFWidget* CPDFSDK_Widget::GetGroupMixXFAWidget() { + CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext(); + if (pContext->GetDocType() == DOCTYPE_STATIC_XFA) { + if (CXFA_FFDocView* pDocView = pContext->GetXFADocView()) { + CFX_WideString sName = GetName(); + if (!sName.IsEmpty()) + return pDocView->GetWidgetByName(sName, nullptr); + } + } + + return nullptr; +} + +CXFA_FFWidgetHandler* CPDFSDK_Widget::GetXFAWidgetHandler() const { + CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext(); + if (pContext->GetDocType() == DOCTYPE_STATIC_XFA) { + if (!m_pWidgetHandler) { + if (CXFA_FFDocView* pDocView = pContext->GetXFADocView()) + m_pWidgetHandler = pDocView->GetWidgetHandler(); + } + return m_pWidgetHandler; + } + + return nullptr; +} + +static XFA_EVENTTYPE GetXFAEventType(PDFSDK_XFAAActionType eXFAAAT) { + XFA_EVENTTYPE eEventType = XFA_EVENT_Unknown; + + switch (eXFAAAT) { + case PDFSDK_XFA_Click: + eEventType = XFA_EVENT_Click; + break; + case PDFSDK_XFA_Full: + eEventType = XFA_EVENT_Full; + break; + case PDFSDK_XFA_PreOpen: + eEventType = XFA_EVENT_PreOpen; + break; + case PDFSDK_XFA_PostOpen: + eEventType = XFA_EVENT_PostOpen; + break; + } + + return eEventType; +} + +static XFA_EVENTTYPE GetXFAEventType(CPDF_AAction::AActionType eAAT, + bool bWillCommit) { + XFA_EVENTTYPE eEventType = XFA_EVENT_Unknown; + + switch (eAAT) { + case CPDF_AAction::CursorEnter: + eEventType = XFA_EVENT_MouseEnter; + break; + case CPDF_AAction::CursorExit: + eEventType = XFA_EVENT_MouseExit; + break; + case CPDF_AAction::ButtonDown: + eEventType = XFA_EVENT_MouseDown; + break; + case CPDF_AAction::ButtonUp: + eEventType = XFA_EVENT_MouseUp; + break; + case CPDF_AAction::GetFocus: + eEventType = XFA_EVENT_Enter; + break; + case CPDF_AAction::LoseFocus: + eEventType = XFA_EVENT_Exit; + break; + case CPDF_AAction::PageOpen: + break; + case CPDF_AAction::PageClose: + break; + case CPDF_AAction::PageVisible: + break; + case CPDF_AAction::PageInvisible: + break; + case CPDF_AAction::KeyStroke: + if (!bWillCommit) + eEventType = XFA_EVENT_Change; + break; + case CPDF_AAction::Validate: + eEventType = XFA_EVENT_Validate; + break; + case CPDF_AAction::OpenPage: + case CPDF_AAction::ClosePage: + case CPDF_AAction::Format: + case CPDF_AAction::Calculate: + case CPDF_AAction::CloseDocument: + case CPDF_AAction::SaveDocument: + case CPDF_AAction::DocumentSaved: + case CPDF_AAction::PrintDocument: + case CPDF_AAction::DocumentPrinted: + break; + } + + return eEventType; +} + +bool CPDFSDK_Widget::HasXFAAAction(PDFSDK_XFAAActionType eXFAAAT) { + CXFA_FFWidget* hWidget = GetMixXFAWidget(); + if (!hWidget) + return false; + + CXFA_FFWidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler(); + if (!pXFAWidgetHandler) + return false; + + XFA_EVENTTYPE eEventType = GetXFAEventType(eXFAAAT); + + CXFA_WidgetAcc* pAcc; + if ((eEventType == XFA_EVENT_Click || eEventType == XFA_EVENT_Change) && + GetFieldType() == FIELDTYPE_RADIOBUTTON) { + if (CXFA_FFWidget* hGroupWidget = GetGroupMixXFAWidget()) { + pAcc = hGroupWidget->GetDataAcc(); + if (pXFAWidgetHandler->HasEvent(pAcc, eEventType)) + return true; + } + } + + pAcc = hWidget->GetDataAcc(); + return pXFAWidgetHandler->HasEvent(pAcc, eEventType); +} + +bool CPDFSDK_Widget::OnXFAAAction(PDFSDK_XFAAActionType eXFAAAT, + PDFSDK_FieldAction& data, + CPDFSDK_PageView* pPageView) { + CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext(); + + CXFA_FFWidget* hWidget = GetMixXFAWidget(); + if (!hWidget) + return false; + + XFA_EVENTTYPE eEventType = GetXFAEventType(eXFAAAT); + if (eEventType == XFA_EVENT_Unknown) + return false; + + CXFA_FFWidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler(); + if (!pXFAWidgetHandler) + return false; + + CXFA_EventParam param; + param.m_eType = eEventType; + param.m_wsChange = data.sChange; + param.m_iCommitKey = data.nCommitKey; + param.m_bShift = data.bShift; + param.m_iSelStart = data.nSelStart; + param.m_iSelEnd = data.nSelEnd; + param.m_wsFullText = data.sValue; + param.m_bKeyDown = data.bKeyDown; + param.m_bModifier = data.bModifier; + param.m_wsNewText = data.sValue; + if (data.nSelEnd > data.nSelStart) + param.m_wsNewText.Delete(data.nSelStart, data.nSelEnd - data.nSelStart); + + for (int i = 0; i < data.sChange.GetLength(); i++) + param.m_wsNewText.Insert(data.nSelStart, data.sChange[i]); + param.m_wsPrevText = data.sValue; + + if ((eEventType == XFA_EVENT_Click || eEventType == XFA_EVENT_Change) && + GetFieldType() == FIELDTYPE_RADIOBUTTON) { + if (CXFA_FFWidget* hGroupWidget = GetGroupMixXFAWidget()) { + CXFA_WidgetAcc* pAcc = hGroupWidget->GetDataAcc(); + param.m_pTarget = pAcc; + if (pXFAWidgetHandler->ProcessEvent(pAcc, ¶m) != + XFA_EVENTERROR_Success) { + return false; + } + } + } + CXFA_WidgetAcc* pAcc = hWidget->GetDataAcc(); + param.m_pTarget = pAcc; + int32_t nRet = pXFAWidgetHandler->ProcessEvent(pAcc, ¶m); + + if (CXFA_FFDocView* pDocView = pContext->GetXFADocView()) + pDocView->UpdateDocView(); + + return nRet == XFA_EVENTERROR_Success; +} + +void CPDFSDK_Widget::Synchronize(bool bSynchronizeElse) { + CXFA_FFWidget* hWidget = GetMixXFAWidget(); + if (!hWidget) + return; + + CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc(); + if (!pWidgetAcc) + return; + + CPDF_FormField* pFormField = GetFormField(); + switch (GetFieldType()) { + case FIELDTYPE_CHECKBOX: + case FIELDTYPE_RADIOBUTTON: { + CPDF_FormControl* pFormCtrl = GetFormControl(); + XFA_CHECKSTATE eCheckState = + pFormCtrl->IsChecked() ? XFA_CHECKSTATE_On : XFA_CHECKSTATE_Off; + pWidgetAcc->SetCheckState(eCheckState, true); + break; + } + case FIELDTYPE_TEXTFIELD: + pWidgetAcc->SetValue(pFormField->GetValue(), XFA_VALUEPICTURE_Edit); + break; + case FIELDTYPE_LISTBOX: { + pWidgetAcc->ClearAllSelections(); + + for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) { + int nIndex = pFormField->GetSelectedIndex(i); + if (nIndex > -1 && nIndex < pWidgetAcc->CountChoiceListItems()) + pWidgetAcc->SetItemState(nIndex, true, false, false, true); + } + break; + } + case FIELDTYPE_COMBOBOX: { + pWidgetAcc->ClearAllSelections(); + + for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) { + int nIndex = pFormField->GetSelectedIndex(i); + if (nIndex > -1 && nIndex < pWidgetAcc->CountChoiceListItems()) + pWidgetAcc->SetItemState(nIndex, true, false, false, true); + } + pWidgetAcc->SetValue(pFormField->GetValue(), XFA_VALUEPICTURE_Edit); + break; + } + } + + if (bSynchronizeElse) + pWidgetAcc->ProcessValueChanged(); +} + +void CPDFSDK_Widget::SynchronizeXFAValue() { + CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext(); + CXFA_FFDocView* pXFADocView = pContext->GetXFADocView(); + if (!pXFADocView) + return; + + if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) { + if (GetXFAWidgetHandler()) { + CPDFSDK_Widget::SynchronizeXFAValue(pXFADocView, hWidget, GetFormField(), + GetFormControl()); + } + } +} + +void CPDFSDK_Widget::SynchronizeXFAItems() { + CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext(); + CXFA_FFDocView* pXFADocView = pContext->GetXFADocView(); + if (!pXFADocView) + return; + + if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) { + if (GetXFAWidgetHandler()) + SynchronizeXFAItems(pXFADocView, hWidget, GetFormField(), nullptr); + } +} + +void CPDFSDK_Widget::SynchronizeXFAValue(CXFA_FFDocView* pXFADocView, + CXFA_FFWidget* hWidget, + CPDF_FormField* pFormField, + CPDF_FormControl* pFormControl) { + ASSERT(hWidget); + ASSERT(pFormControl); + + switch (pFormField->GetFieldType()) { + case FIELDTYPE_CHECKBOX: { + if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) { + pFormField->CheckControl( + pFormField->GetControlIndex(pFormControl), + pWidgetAcc->GetCheckState() == XFA_CHECKSTATE_On, true); + } + break; + } + case FIELDTYPE_RADIOBUTTON: { + // TODO(weili): Check whether we need to handle checkbox and radio + // button differently, otherwise, merge these two cases. + if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) { + pFormField->CheckControl( + pFormField->GetControlIndex(pFormControl), + pWidgetAcc->GetCheckState() == XFA_CHECKSTATE_On, true); + } + break; + } + case FIELDTYPE_TEXTFIELD: { + if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) { + CFX_WideString sValue; + pWidgetAcc->GetValue(sValue, XFA_VALUEPICTURE_Display); + pFormField->SetValue(sValue, true); + } + break; + } + case FIELDTYPE_LISTBOX: { + pFormField->ClearSelection(false); + + if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) { + for (int i = 0, sz = pWidgetAcc->CountSelectedItems(); i < sz; i++) { + int nIndex = pWidgetAcc->GetSelectedItem(i); + + if (nIndex > -1 && nIndex < pFormField->CountOptions()) { + pFormField->SetItemSelection(nIndex, true, true); + } + } + } + break; + } + case FIELDTYPE_COMBOBOX: { + pFormField->ClearSelection(false); + + if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) { + for (int i = 0, sz = pWidgetAcc->CountSelectedItems(); i < sz; i++) { + int nIndex = pWidgetAcc->GetSelectedItem(i); + + if (nIndex > -1 && nIndex < pFormField->CountOptions()) { + pFormField->SetItemSelection(nIndex, true, true); + } + } + + CFX_WideString sValue; + pWidgetAcc->GetValue(sValue, XFA_VALUEPICTURE_Display); + pFormField->SetValue(sValue, true); + } + break; + } + } +} + +void CPDFSDK_Widget::SynchronizeXFAItems(CXFA_FFDocView* pXFADocView, + CXFA_FFWidget* hWidget, + CPDF_FormField* pFormField, + CPDF_FormControl* pFormControl) { + ASSERT(hWidget); + + switch (pFormField->GetFieldType()) { + case FIELDTYPE_LISTBOX: { + pFormField->ClearSelection(false); + pFormField->ClearOptions(true); + + if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) { + for (int i = 0, sz = pWidgetAcc->CountChoiceListItems(); i < sz; i++) { + CFX_WideString swText; + pWidgetAcc->GetChoiceListItem(swText, i); + + pFormField->InsertOption(swText, i, true); + } + } + break; + } + case FIELDTYPE_COMBOBOX: { + pFormField->ClearSelection(false); + pFormField->ClearOptions(false); + + if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) { + for (int i = 0, sz = pWidgetAcc->CountChoiceListItems(); i < sz; i++) { + CFX_WideString swText; + pWidgetAcc->GetChoiceListItem(swText, i); + + pFormField->InsertOption(swText, i, false); + } + } + + pFormField->SetValue(L"", true); + break; + } + } +} +#endif // PDF_ENABLE_XFA + +bool CPDFSDK_Widget::IsWidgetAppearanceValid(CPDF_Annot::AppearanceMode mode) { + CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDictFor("AP"); + if (!pAP) + return false; + + // Choose the right sub-ap + const FX_CHAR* ap_entry = "N"; + if (mode == CPDF_Annot::Down) + ap_entry = "D"; + else if (mode == CPDF_Annot::Rollover) + ap_entry = "R"; + if (!pAP->KeyExist(ap_entry)) + ap_entry = "N"; + + // Get the AP stream or subdirectory + CPDF_Object* psub = pAP->GetDirectObjectFor(ap_entry); + if (!psub) + return false; + + int nFieldType = GetFieldType(); + switch (nFieldType) { + case FIELDTYPE_PUSHBUTTON: + case FIELDTYPE_COMBOBOX: + case FIELDTYPE_LISTBOX: + case FIELDTYPE_TEXTFIELD: + case FIELDTYPE_SIGNATURE: + return psub->IsStream(); + case FIELDTYPE_CHECKBOX: + case FIELDTYPE_RADIOBUTTON: + if (CPDF_Dictionary* pSubDict = psub->AsDictionary()) { + return !!pSubDict->GetStreamFor(GetAppState()); + } + return false; + } + return true; +} + +int CPDFSDK_Widget::GetFieldType() const { + CPDF_FormField* pField = GetFormField(); + return pField ? pField->GetFieldType() : FIELDTYPE_UNKNOWN; +} + +bool CPDFSDK_Widget::IsAppearanceValid() { +#ifdef PDF_ENABLE_XFA + CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext(); + int nDocType = pContext->GetDocType(); + if (nDocType != DOCTYPE_PDF && nDocType != DOCTYPE_STATIC_XFA) + return true; +#endif // PDF_ENABLE_XFA + return CPDFSDK_BAAnnot::IsAppearanceValid(); +} + +int CPDFSDK_Widget::GetLayoutOrder() const { + return 2; +} + +int CPDFSDK_Widget::GetFieldFlags() const { + CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm(); + CPDF_FormControl* pFormControl = + pPDFInterForm->GetControlByDict(m_pAnnot->GetAnnotDict()); + CPDF_FormField* pFormField = pFormControl->GetField(); + return pFormField->GetFieldFlags(); +} + +bool CPDFSDK_Widget::IsSignatureWidget() const { + return GetFieldType() == FIELDTYPE_SIGNATURE; +} + +CPDF_FormField* CPDFSDK_Widget::GetFormField() const { + CPDF_FormControl* pControl = GetFormControl(); + return pControl ? pControl->GetField() : nullptr; +} + +CPDF_FormControl* CPDFSDK_Widget::GetFormControl() const { + CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm(); + return pPDFInterForm->GetControlByDict(GetAnnotDict()); +} + +CPDF_FormControl* CPDFSDK_Widget::GetFormControl( + CPDF_InterForm* pInterForm, + const CPDF_Dictionary* pAnnotDict) { + ASSERT(pAnnotDict); + return pInterForm->GetControlByDict(pAnnotDict); +} + +int CPDFSDK_Widget::GetRotate() const { + CPDF_FormControl* pCtrl = GetFormControl(); + return pCtrl->GetRotation() % 360; +} + +#ifdef PDF_ENABLE_XFA +CFX_WideString CPDFSDK_Widget::GetName() const { + CPDF_FormField* pFormField = GetFormField(); + return pFormField->GetFullName(); +} +#endif // PDF_ENABLE_XFA + +bool CPDFSDK_Widget::GetFillColor(FX_COLORREF& color) const { + CPDF_FormControl* pFormCtrl = GetFormControl(); + int iColorType = 0; + color = ARGBToColorRef(pFormCtrl->GetBackgroundColor(iColorType)); + return iColorType != COLORTYPE_TRANSPARENT; +} + +bool CPDFSDK_Widget::GetBorderColor(FX_COLORREF& color) const { + CPDF_FormControl* pFormCtrl = GetFormControl(); + int iColorType = 0; + color = ARGBToColorRef(pFormCtrl->GetBorderColor(iColorType)); + return iColorType != COLORTYPE_TRANSPARENT; +} + +bool CPDFSDK_Widget::GetTextColor(FX_COLORREF& color) const { + CPDF_FormControl* pFormCtrl = GetFormControl(); + CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance(); + if (!da.HasColor()) + return false; + + FX_ARGB argb; + int iColorType = COLORTYPE_TRANSPARENT; + da.GetColor(argb, iColorType); + color = ARGBToColorRef(argb); + return iColorType != COLORTYPE_TRANSPARENT; +} + +FX_FLOAT CPDFSDK_Widget::GetFontSize() const { + CPDF_FormControl* pFormCtrl = GetFormControl(); + CPDF_DefaultAppearance pDa = pFormCtrl->GetDefaultAppearance(); + CFX_ByteString csFont = ""; + FX_FLOAT fFontSize = 0.0f; + pDa.GetFont(csFont, fFontSize); + + return fFontSize; +} + +int CPDFSDK_Widget::GetSelectedIndex(int nIndex) const { +#ifdef PDF_ENABLE_XFA + if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) { + if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) { + if (nIndex < pWidgetAcc->CountSelectedItems()) + return pWidgetAcc->GetSelectedItem(nIndex); + } + } +#endif // PDF_ENABLE_XFA + CPDF_FormField* pFormField = GetFormField(); + return pFormField->GetSelectedIndex(nIndex); +} + +#ifdef PDF_ENABLE_XFA +CFX_WideString CPDFSDK_Widget::GetValue(bool bDisplay) const { + if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) { + if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) { + CFX_WideString sValue; + pWidgetAcc->GetValue( + sValue, bDisplay ? XFA_VALUEPICTURE_Display : XFA_VALUEPICTURE_Edit); + return sValue; + } + } +#else +CFX_WideString CPDFSDK_Widget::GetValue() const { +#endif // PDF_ENABLE_XFA + CPDF_FormField* pFormField = GetFormField(); + return pFormField->GetValue(); +} + +CFX_WideString CPDFSDK_Widget::GetDefaultValue() const { + CPDF_FormField* pFormField = GetFormField(); + return pFormField->GetDefaultValue(); +} + +CFX_WideString CPDFSDK_Widget::GetOptionLabel(int nIndex) const { + CPDF_FormField* pFormField = GetFormField(); + return pFormField->GetOptionLabel(nIndex); +} + +int CPDFSDK_Widget::CountOptions() const { + CPDF_FormField* pFormField = GetFormField(); + return pFormField->CountOptions(); +} + +bool CPDFSDK_Widget::IsOptionSelected(int nIndex) const { +#ifdef PDF_ENABLE_XFA + if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) { + if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) { + if (nIndex > -1 && nIndex < pWidgetAcc->CountChoiceListItems()) + return pWidgetAcc->GetItemState(nIndex); + + return false; + } + } +#endif // PDF_ENABLE_XFA + CPDF_FormField* pFormField = GetFormField(); + return pFormField->IsItemSelected(nIndex); +} + +int CPDFSDK_Widget::GetTopVisibleIndex() const { + CPDF_FormField* pFormField = GetFormField(); + return pFormField->GetTopVisibleIndex(); +} + +bool CPDFSDK_Widget::IsChecked() const { +#ifdef PDF_ENABLE_XFA + if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) { + if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) + return pWidgetAcc->GetCheckState() == XFA_CHECKSTATE_On; + } +#endif // PDF_ENABLE_XFA + CPDF_FormControl* pFormCtrl = GetFormControl(); + return pFormCtrl->IsChecked(); +} + +int CPDFSDK_Widget::GetAlignment() const { + CPDF_FormControl* pFormCtrl = GetFormControl(); + return pFormCtrl->GetControlAlignment(); +} + +int CPDFSDK_Widget::GetMaxLen() const { + CPDF_FormField* pFormField = GetFormField(); + return pFormField->GetMaxLen(); +} + +void CPDFSDK_Widget::SetCheck(bool bChecked, bool bNotify) { + CPDF_FormControl* pFormCtrl = GetFormControl(); + CPDF_FormField* pFormField = pFormCtrl->GetField(); + pFormField->CheckControl(pFormField->GetControlIndex(pFormCtrl), bChecked, + bNotify); +#ifdef PDF_ENABLE_XFA + if (!IsWidgetAppearanceValid(CPDF_Annot::Normal)) + ResetAppearance(true); + if (!bNotify) + Synchronize(true); +#endif // PDF_ENABLE_XFA +} + +void CPDFSDK_Widget::SetValue(const CFX_WideString& sValue, bool bNotify) { + CPDF_FormField* pFormField = GetFormField(); + pFormField->SetValue(sValue, bNotify); +#ifdef PDF_ENABLE_XFA + if (!bNotify) + Synchronize(true); +#endif // PDF_ENABLE_XFA +} + +void CPDFSDK_Widget::SetDefaultValue(const CFX_WideString& sValue) {} +void CPDFSDK_Widget::SetOptionSelection(int index, + bool bSelected, + bool bNotify) { + CPDF_FormField* pFormField = GetFormField(); + pFormField->SetItemSelection(index, bSelected, bNotify); +#ifdef PDF_ENABLE_XFA + if (!bNotify) + Synchronize(true); +#endif // PDF_ENABLE_XFA +} + +void CPDFSDK_Widget::ClearSelection(bool bNotify) { + CPDF_FormField* pFormField = GetFormField(); + pFormField->ClearSelection(bNotify); +#ifdef PDF_ENABLE_XFA + if (!bNotify) + Synchronize(true); +#endif // PDF_ENABLE_XFA +} + +void CPDFSDK_Widget::SetTopVisibleIndex(int index) {} + +void CPDFSDK_Widget::SetAppModified() { + m_bAppModified = true; +} + +void CPDFSDK_Widget::ClearAppModified() { + m_bAppModified = false; +} + +bool CPDFSDK_Widget::IsAppModified() const { + return m_bAppModified; +} + +#ifdef PDF_ENABLE_XFA +void CPDFSDK_Widget::ResetAppearance(bool bValueChanged) { + switch (GetFieldType()) { + case FIELDTYPE_TEXTFIELD: + case FIELDTYPE_COMBOBOX: { + bool bFormatted = false; + CFX_WideString sValue = OnFormat(bFormatted); + ResetAppearance(bFormatted ? &sValue : nullptr, true); + break; + } + default: + ResetAppearance(nullptr, false); + break; + } +} +#endif // PDF_ENABLE_XFA + +void CPDFSDK_Widget::ResetAppearance(const CFX_WideString* sValue, + bool bValueChanged) { + SetAppModified(); + + m_nAppAge++; + if (m_nAppAge > 999999) + m_nAppAge = 0; + if (bValueChanged) + m_nValueAge++; + + int nFieldType = GetFieldType(); + + switch (nFieldType) { + case FIELDTYPE_PUSHBUTTON: + ResetAppearance_PushButton(); + break; + case FIELDTYPE_CHECKBOX: + ResetAppearance_CheckBox(); + break; + case FIELDTYPE_RADIOBUTTON: + ResetAppearance_RadioButton(); + break; + case FIELDTYPE_COMBOBOX: + ResetAppearance_ComboBox(sValue); + break; + case FIELDTYPE_LISTBOX: + ResetAppearance_ListBox(); + break; + case FIELDTYPE_TEXTFIELD: + ResetAppearance_TextField(sValue); + break; + } + + m_pAnnot->ClearCachedAP(); +} + +CFX_WideString CPDFSDK_Widget::OnFormat(bool& bFormatted) { + CPDF_FormField* pFormField = GetFormField(); + ASSERT(pFormField); + return m_pInterForm->OnFormat(pFormField, bFormatted); +} + +void CPDFSDK_Widget::ResetFieldAppearance(bool bValueChanged) { + CPDF_FormField* pFormField = GetFormField(); + ASSERT(pFormField); + m_pInterForm->ResetFieldAppearance(pFormField, nullptr, bValueChanged); +} + +void CPDFSDK_Widget::DrawAppearance(CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + CPDF_Annot::AppearanceMode mode, + const CPDF_RenderOptions* pOptions) { + int nFieldType = GetFieldType(); + + if ((nFieldType == FIELDTYPE_CHECKBOX || + nFieldType == FIELDTYPE_RADIOBUTTON) && + mode == CPDF_Annot::Normal && + !IsWidgetAppearanceValid(CPDF_Annot::Normal)) { + CFX_PathData pathData; + + CFX_FloatRect rcAnnot = GetRect(); + + pathData.AppendRect(rcAnnot.left, rcAnnot.bottom, rcAnnot.right, + rcAnnot.top); + + CFX_GraphStateData gsd; + gsd.m_LineWidth = 0.0f; + + pDevice->DrawPath(&pathData, pUser2Device, &gsd, 0, 0xFFAAAAAA, + FXFILL_ALTERNATE); + } else { + CPDFSDK_BAAnnot::DrawAppearance(pDevice, pUser2Device, mode, pOptions); + } +} + +void CPDFSDK_Widget::UpdateField() { + CPDF_FormField* pFormField = GetFormField(); + ASSERT(pFormField); + m_pInterForm->UpdateField(pFormField); +} + +void CPDFSDK_Widget::DrawShadow(CFX_RenderDevice* pDevice, + CPDFSDK_PageView* pPageView) { + int nFieldType = GetFieldType(); + if (!m_pInterForm->IsNeedHighLight(nFieldType)) + return; + + CFX_Matrix page2device; + pPageView->GetCurrentMatrix(page2device); + + CFX_FloatRect rcDevice = GetRect(); + CFX_PointF tmp = + page2device.Transform(CFX_PointF(rcDevice.left, rcDevice.bottom)); + rcDevice.left = tmp.x; + rcDevice.bottom = tmp.y; + + tmp = page2device.Transform(CFX_PointF(rcDevice.right, rcDevice.top)); + rcDevice.right = tmp.x; + rcDevice.top = tmp.y; + rcDevice.Normalize(); + + FX_RECT rcDev = rcDevice.ToFxRect(); + pDevice->FillRect( + &rcDev, ArgbEncode(static_cast(m_pInterForm->GetHighlightAlpha()), + m_pInterForm->GetHighlightColor(nFieldType))); +} + +void CPDFSDK_Widget::ResetAppearance_PushButton() { + CPDF_FormControl* pControl = GetFormControl(); + CFX_FloatRect rcWindow = GetRotatedRect(); + int32_t nLayout = 0; + switch (pControl->GetTextPosition()) { + case TEXTPOS_ICON: + nLayout = PPBL_ICON; + break; + case TEXTPOS_BELOW: + nLayout = PPBL_ICONTOPLABELBOTTOM; + break; + case TEXTPOS_ABOVE: + nLayout = PPBL_LABELTOPICONBOTTOM; + break; + case TEXTPOS_RIGHT: + nLayout = PPBL_ICONLEFTLABELRIGHT; + break; + case TEXTPOS_LEFT: + nLayout = PPBL_LABELLEFTICONRIGHT; + break; + case TEXTPOS_OVERLAID: + nLayout = PPBL_LABELOVERICON; + break; + default: + nLayout = PPBL_LABEL; + break; + } + + CPWL_Color crBackground; + CPWL_Color crBorder; + int iColorType; + FX_FLOAT fc[4]; + pControl->GetOriginalBackgroundColor(iColorType, fc); + if (iColorType > 0) + crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); + + pControl->GetOriginalBorderColor(iColorType, fc); + if (iColorType > 0) + crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); + + FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); + CPWL_Dash dsBorder(3, 0, 0); + CPWL_Color crLeftTop; + CPWL_Color crRightBottom; + + BorderStyle nBorderStyle = GetBorderStyle(); + switch (nBorderStyle) { + case BorderStyle::DASH: + dsBorder = CPWL_Dash(3, 3, 0); + break; + case BorderStyle::BEVELED: + fBorderWidth *= 2; + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); + crRightBottom = crBackground / 2.0f; + break; + case BorderStyle::INSET: + fBorderWidth *= 2; + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5); + crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75); + break; + default: + break; + } + + CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); + + CPWL_Color crText(COLORTYPE_GRAY, 0); + + FX_FLOAT fFontSize = 12.0f; + CFX_ByteString csNameTag; + + CPDF_DefaultAppearance da = pControl->GetDefaultAppearance(); + if (da.HasColor()) { + da.GetColor(iColorType, fc); + crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); + } + + if (da.HasFont()) + da.GetFont(csNameTag, fFontSize); + + CFX_WideString csWCaption; + CFX_WideString csNormalCaption, csRolloverCaption, csDownCaption; + + if (pControl->HasMKEntry("CA")) + csNormalCaption = pControl->GetNormalCaption(); + + if (pControl->HasMKEntry("RC")) + csRolloverCaption = pControl->GetRolloverCaption(); + + if (pControl->HasMKEntry("AC")) + csDownCaption = pControl->GetDownCaption(); + + CPDF_Stream* pNormalIcon = nullptr; + CPDF_Stream* pRolloverIcon = nullptr; + CPDF_Stream* pDownIcon = nullptr; + + if (pControl->HasMKEntry("I")) + pNormalIcon = pControl->GetNormalIcon(); + + if (pControl->HasMKEntry("RI")) + pRolloverIcon = pControl->GetRolloverIcon(); + + if (pControl->HasMKEntry("IX")) + pDownIcon = pControl->GetDownIcon(); + + if (pNormalIcon) { + if (CPDF_Dictionary* pImageDict = pNormalIcon->GetDict()) { + if (pImageDict->GetStringFor("Name").IsEmpty()) + pImageDict->SetNewFor("Name", "ImgA", false); + } + } + + if (pRolloverIcon) { + if (CPDF_Dictionary* pImageDict = pRolloverIcon->GetDict()) { + if (pImageDict->GetStringFor("Name").IsEmpty()) + pImageDict->SetNewFor("Name", "ImgB", false); + } + } + + if (pDownIcon) { + if (CPDF_Dictionary* pImageDict = pDownIcon->GetDict()) { + if (pImageDict->GetStringFor("Name").IsEmpty()) + pImageDict->SetNewFor("Name", "ImgC", false); + } + } + + CPDF_IconFit iconFit = pControl->GetIconFit(); + + CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler()); + font_map.SetAPType("N"); + + CFX_ByteString csAP = + CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + + CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, + crLeftTop, crRightBottom, nBorderStyle, + dsBorder) + + CPWL_Utils::GetPushButtonAppStream( + iconFit.GetFittingBounds() ? rcWindow : rcClient, &font_map, + pNormalIcon, iconFit, csNormalCaption, crText, fFontSize, nLayout); + + WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP); + if (pNormalIcon) + AddImageToAppearance("N", pNormalIcon); + + CPDF_FormControl::HighlightingMode eHLM = pControl->GetHighlightingMode(); + if (eHLM == CPDF_FormControl::Push || eHLM == CPDF_FormControl::Toggle) { + if (csRolloverCaption.IsEmpty() && !pRolloverIcon) { + csRolloverCaption = csNormalCaption; + pRolloverIcon = pNormalIcon; + } + + font_map.SetAPType("R"); + + csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + + CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, + crLeftTop, crRightBottom, + nBorderStyle, dsBorder) + + CPWL_Utils::GetPushButtonAppStream( + iconFit.GetFittingBounds() ? rcWindow : rcClient, &font_map, + pRolloverIcon, iconFit, csRolloverCaption, crText, fFontSize, + nLayout); + + WriteAppearance("R", GetRotatedRect(), GetMatrix(), csAP); + if (pRolloverIcon) + AddImageToAppearance("R", pRolloverIcon); + + if (csDownCaption.IsEmpty() && !pDownIcon) { + csDownCaption = csNormalCaption; + pDownIcon = pNormalIcon; + } + + switch (nBorderStyle) { + case BorderStyle::BEVELED: { + CPWL_Color crTemp = crLeftTop; + crLeftTop = crRightBottom; + crRightBottom = crTemp; + break; + } + case BorderStyle::INSET: { + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0); + crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); + break; + } + default: + break; + } + + font_map.SetAPType("D"); + + csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground - 0.25f) + + CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, + crLeftTop, crRightBottom, + nBorderStyle, dsBorder) + + CPWL_Utils::GetPushButtonAppStream( + iconFit.GetFittingBounds() ? rcWindow : rcClient, &font_map, + pDownIcon, iconFit, csDownCaption, crText, fFontSize, nLayout); + + WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP); + if (pDownIcon) + AddImageToAppearance("D", pDownIcon); + } else { + RemoveAppearance("D"); + RemoveAppearance("R"); + } +} + +void CPDFSDK_Widget::ResetAppearance_CheckBox() { + CPDF_FormControl* pControl = GetFormControl(); + CPWL_Color crBackground, crBorder, crText; + int iColorType; + FX_FLOAT fc[4]; + + pControl->GetOriginalBackgroundColor(iColorType, fc); + if (iColorType > 0) + crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); + + pControl->GetOriginalBorderColor(iColorType, fc); + if (iColorType > 0) + crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); + + FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); + CPWL_Dash dsBorder(3, 0, 0); + CPWL_Color crLeftTop, crRightBottom; + + BorderStyle nBorderStyle = GetBorderStyle(); + switch (nBorderStyle) { + case BorderStyle::DASH: + dsBorder = CPWL_Dash(3, 3, 0); + break; + case BorderStyle::BEVELED: + fBorderWidth *= 2; + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); + crRightBottom = crBackground / 2.0f; + break; + case BorderStyle::INSET: + fBorderWidth *= 2; + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5); + crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75); + break; + default: + break; + } + + CFX_FloatRect rcWindow = GetRotatedRect(); + CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); + CPDF_DefaultAppearance da = pControl->GetDefaultAppearance(); + if (da.HasColor()) { + da.GetColor(iColorType, fc); + crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); + } + + int32_t nStyle = 0; + CFX_WideString csWCaption = pControl->GetNormalCaption(); + if (csWCaption.GetLength() > 0) { + switch (csWCaption[0]) { + case L'l': + nStyle = PCS_CIRCLE; + break; + case L'8': + nStyle = PCS_CROSS; + break; + case L'u': + nStyle = PCS_DIAMOND; + break; + case L'n': + nStyle = PCS_SQUARE; + break; + case L'H': + nStyle = PCS_STAR; + break; + default: // L'4' + nStyle = PCS_CHECK; + break; + } + } else { + nStyle = PCS_CHECK; + } + + CFX_ByteString csAP_N_ON = + CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + + CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, + crLeftTop, crRightBottom, nBorderStyle, + dsBorder); + + CFX_ByteString csAP_N_OFF = csAP_N_ON; + + switch (nBorderStyle) { + case BorderStyle::BEVELED: { + CPWL_Color crTemp = crLeftTop; + crLeftTop = crRightBottom; + crRightBottom = crTemp; + break; + } + case BorderStyle::INSET: { + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0); + crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); + break; + } + default: + break; + } + + CFX_ByteString csAP_D_ON = + CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground - 0.25f) + + CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, + crLeftTop, crRightBottom, nBorderStyle, + dsBorder); + + CFX_ByteString csAP_D_OFF = csAP_D_ON; + + csAP_N_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient, nStyle, crText); + csAP_D_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient, nStyle, crText); + + WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, + pControl->GetCheckedAPState()); + WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off"); + + WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, + pControl->GetCheckedAPState()); + WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off"); + + CFX_ByteString csAS = GetAppState(); + if (csAS.IsEmpty()) + SetAppState("Off"); +} + +void CPDFSDK_Widget::ResetAppearance_RadioButton() { + CPDF_FormControl* pControl = GetFormControl(); + CPWL_Color crBackground, crBorder, crText; + int iColorType; + FX_FLOAT fc[4]; + + pControl->GetOriginalBackgroundColor(iColorType, fc); + if (iColorType > 0) + crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); + + pControl->GetOriginalBorderColor(iColorType, fc); + if (iColorType > 0) + crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); + + FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); + CPWL_Dash dsBorder(3, 0, 0); + CPWL_Color crLeftTop; + CPWL_Color crRightBottom; + BorderStyle nBorderStyle = GetBorderStyle(); + switch (nBorderStyle) { + case BorderStyle::DASH: + dsBorder = CPWL_Dash(3, 3, 0); + break; + case BorderStyle::BEVELED: + fBorderWidth *= 2; + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); + crRightBottom = crBackground / 2.0f; + break; + case BorderStyle::INSET: + fBorderWidth *= 2; + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5); + crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75); + break; + default: + break; + } + + CFX_FloatRect rcWindow = GetRotatedRect(); + CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); + + CPDF_DefaultAppearance da = pControl->GetDefaultAppearance(); + if (da.HasColor()) { + da.GetColor(iColorType, fc); + crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); + } + + int32_t nStyle = 0; + CFX_WideString csWCaption = pControl->GetNormalCaption(); + if (csWCaption.GetLength() > 0) { + switch (csWCaption[0]) { + default: // L'l': + nStyle = PCS_CIRCLE; + break; + case L'8': + nStyle = PCS_CROSS; + break; + case L'u': + nStyle = PCS_DIAMOND; + break; + case L'n': + nStyle = PCS_SQUARE; + break; + case L'H': + nStyle = PCS_STAR; + break; + case L'4': + nStyle = PCS_CHECK; + break; + } + } else { + nStyle = PCS_CIRCLE; + } + + CFX_ByteString csAP_N_ON; + + CFX_FloatRect rcCenter = + CPWL_Utils::DeflateRect(CPWL_Utils::GetCenterSquare(rcWindow), 1.0f); + + if (nStyle == PCS_CIRCLE) { + if (nBorderStyle == BorderStyle::BEVELED) { + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); + crRightBottom = crBackground - 0.25f; + } else if (nBorderStyle == BorderStyle::INSET) { + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5f); + crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75f); + } + + csAP_N_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter, crBackground) + + CPWL_Utils::GetCircleBorderAppStream( + rcCenter, fBorderWidth, crBorder, crLeftTop, crRightBottom, + nBorderStyle, dsBorder); + } else { + csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) + + CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, + crLeftTop, crRightBottom, + nBorderStyle, dsBorder); + } + + CFX_ByteString csAP_N_OFF = csAP_N_ON; + + switch (nBorderStyle) { + case BorderStyle::BEVELED: { + CPWL_Color crTemp = crLeftTop; + crLeftTop = crRightBottom; + crRightBottom = crTemp; + break; + } + case BorderStyle::INSET: { + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0); + crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); + break; + } + default: + break; + } + + CFX_ByteString csAP_D_ON; + + if (nStyle == PCS_CIRCLE) { + CPWL_Color crBK = crBackground - 0.25f; + if (nBorderStyle == BorderStyle::BEVELED) { + crLeftTop = crBackground - 0.25f; + crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); + crBK = crBackground; + } else if (nBorderStyle == BorderStyle::INSET) { + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0); + crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1); + } + + csAP_D_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter, crBK) + + CPWL_Utils::GetCircleBorderAppStream( + rcCenter, fBorderWidth, crBorder, crLeftTop, crRightBottom, + nBorderStyle, dsBorder); + } else { + csAP_D_ON = + CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground - 0.25f) + + CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, + crLeftTop, crRightBottom, nBorderStyle, + dsBorder); + } + + CFX_ByteString csAP_D_OFF = csAP_D_ON; + + csAP_N_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient, nStyle, crText); + csAP_D_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient, nStyle, crText); + + WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, + pControl->GetCheckedAPState()); + WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off"); + + WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, + pControl->GetCheckedAPState()); + WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off"); + + CFX_ByteString csAS = GetAppState(); + if (csAS.IsEmpty()) + SetAppState("Off"); +} + +void CPDFSDK_Widget::ResetAppearance_ComboBox(const CFX_WideString* sValue) { + CPDF_FormControl* pControl = GetFormControl(); + CPDF_FormField* pField = pControl->GetField(); + CFX_ByteTextBuf sBody, sLines; + + CFX_FloatRect rcClient = GetClientRect(); + CFX_FloatRect rcButton = rcClient; + rcButton.left = rcButton.right - 13; + rcButton.Normalize(); + + std::unique_ptr pEdit(new CFX_Edit); + pEdit->EnableRefresh(false); + + CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler()); + pEdit->SetFontMap(&font_map); + + CFX_FloatRect rcEdit = rcClient; + rcEdit.right = rcButton.left; + rcEdit.Normalize(); + + pEdit->SetPlateRect(rcEdit); + pEdit->SetAlignmentV(1, true); + + FX_FLOAT fFontSize = GetFontSize(); + if (IsFloatZero(fFontSize)) + pEdit->SetAutoFontSize(true, true); + else + pEdit->SetFontSize(fFontSize); + + pEdit->Initialize(); + + if (sValue) { + pEdit->SetText(*sValue); + } else { + int32_t nCurSel = pField->GetSelectedIndex(0); + if (nCurSel < 0) + pEdit->SetText(pField->GetValue()); + else + pEdit->SetText(pField->GetOptionLabel(nCurSel)); + } + + CFX_FloatRect rcContent = pEdit->GetContentRect(); + + CFX_ByteString sEdit = + CPWL_Utils::GetEditAppStream(pEdit.get(), CFX_PointF()); + if (sEdit.GetLength() > 0) { + sBody << "/Tx BMC\n" + << "q\n"; + if (rcContent.Width() > rcEdit.Width() || + rcContent.Height() > rcEdit.Height()) { + sBody << rcEdit.left << " " << rcEdit.bottom << " " << rcEdit.Width() + << " " << rcEdit.Height() << " re\nW\nn\n"; + } + + CPWL_Color crText = GetTextPWLColor(); + sBody << "BT\n" + << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n" + << "Q\nEMC\n"; + } + + sBody << CPWL_Utils::GetDropButtonAppStream(rcButton); + + CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + + sLines.AsStringC() + sBody.AsStringC(); + + WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP); +} + +void CPDFSDK_Widget::ResetAppearance_ListBox() { + CPDF_FormControl* pControl = GetFormControl(); + CPDF_FormField* pField = pControl->GetField(); + CFX_FloatRect rcClient = GetClientRect(); + CFX_ByteTextBuf sBody, sLines; + + std::unique_ptr pEdit(new CFX_Edit); + pEdit->EnableRefresh(false); + + CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler()); + pEdit->SetFontMap(&font_map); + + pEdit->SetPlateRect(CFX_FloatRect(rcClient.left, 0.0f, rcClient.right, 0.0f)); + + FX_FLOAT fFontSize = GetFontSize(); + + pEdit->SetFontSize(IsFloatZero(fFontSize) ? 12.0f : fFontSize); + + pEdit->Initialize(); + + CFX_ByteTextBuf sList; + FX_FLOAT fy = rcClient.top; + + int32_t nTop = pField->GetTopVisibleIndex(); + int32_t nCount = pField->CountOptions(); + int32_t nSelCount = pField->CountSelectedItems(); + + for (int32_t i = nTop; i < nCount; ++i) { + bool bSelected = false; + for (int32_t j = 0; j < nSelCount; ++j) { + if (pField->GetSelectedIndex(j) == i) { + bSelected = true; + break; + } + } + + pEdit->SetText(pField->GetOptionLabel(i)); + + CFX_FloatRect rcContent = pEdit->GetContentRect(); + FX_FLOAT fItemHeight = rcContent.Height(); + + if (bSelected) { + CFX_FloatRect rcItem = + CFX_FloatRect(rcClient.left, fy - fItemHeight, rcClient.right, fy); + sList << "q\n" + << CPWL_Utils::GetColorAppStream( + CPWL_Color(COLORTYPE_RGB, 0, 51.0f / 255.0f, + 113.0f / 255.0f), + true) + << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width() + << " " << rcItem.Height() << " re f\n" + << "Q\n"; + + sList << "BT\n" + << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY, 1), + true) + << CPWL_Utils::GetEditAppStream(pEdit.get(), CFX_PointF(0.0f, fy)) + << "ET\n"; + } else { + CPWL_Color crText = GetTextPWLColor(); + sList << "BT\n" + << CPWL_Utils::GetColorAppStream(crText, true) + << CPWL_Utils::GetEditAppStream(pEdit.get(), CFX_PointF(0.0f, fy)) + << "ET\n"; + } + + fy -= fItemHeight; + } + + if (sList.GetSize() > 0) { + sBody << "/Tx BMC\n" + << "q\n" + << rcClient.left << " " << rcClient.bottom << " " << rcClient.Width() + << " " << rcClient.Height() << " re\nW\nn\n"; + sBody << sList << "Q\nEMC\n"; + } + + CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + + sLines.AsStringC() + sBody.AsStringC(); + + WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP); +} + +void CPDFSDK_Widget::ResetAppearance_TextField(const CFX_WideString* sValue) { + CPDF_FormControl* pControl = GetFormControl(); + CPDF_FormField* pField = pControl->GetField(); + CFX_ByteTextBuf sBody, sLines; + + std::unique_ptr pEdit(new CFX_Edit); + pEdit->EnableRefresh(false); + + CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler()); + pEdit->SetFontMap(&font_map); + + CFX_FloatRect rcClient = GetClientRect(); + pEdit->SetPlateRect(rcClient); + pEdit->SetAlignmentH(pControl->GetControlAlignment(), true); + + uint32_t dwFieldFlags = pField->GetFieldFlags(); + bool bMultiLine = (dwFieldFlags >> 12) & 1; + + if (bMultiLine) { + pEdit->SetMultiLine(true, true); + pEdit->SetAutoReturn(true, true); + } else { + pEdit->SetAlignmentV(1, true); + } + + uint16_t subWord = 0; + if ((dwFieldFlags >> 13) & 1) { + subWord = '*'; + pEdit->SetPasswordChar(subWord, true); + } + + int nMaxLen = pField->GetMaxLen(); + bool bCharArray = (dwFieldFlags >> 24) & 1; + FX_FLOAT fFontSize = GetFontSize(); + +#ifdef PDF_ENABLE_XFA + CFX_WideString sValueTmp; + if (!sValue && GetMixXFAWidget()) { + sValueTmp = GetValue(true); + sValue = &sValueTmp; + } +#endif // PDF_ENABLE_XFA + + if (nMaxLen > 0) { + if (bCharArray) { + pEdit->SetCharArray(nMaxLen); + + if (IsFloatZero(fFontSize)) { + fFontSize = CPWL_Edit::GetCharArrayAutoFontSize(font_map.GetPDFFont(0), + rcClient, nMaxLen); + } + } else { + if (sValue) + nMaxLen = sValue->GetLength(); + pEdit->SetLimitChar(nMaxLen); + } + } + + if (IsFloatZero(fFontSize)) + pEdit->SetAutoFontSize(true, true); + else + pEdit->SetFontSize(fFontSize); + + pEdit->Initialize(); + pEdit->SetText(sValue ? *sValue : pField->GetValue()); + + CFX_FloatRect rcContent = pEdit->GetContentRect(); + CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream( + pEdit.get(), CFX_PointF(), nullptr, !bCharArray, subWord); + + if (sEdit.GetLength() > 0) { + sBody << "/Tx BMC\n" + << "q\n"; + if (rcContent.Width() > rcClient.Width() || + rcContent.Height() > rcClient.Height()) { + sBody << rcClient.left << " " << rcClient.bottom << " " + << rcClient.Width() << " " << rcClient.Height() << " re\nW\nn\n"; + } + CPWL_Color crText = GetTextPWLColor(); + sBody << "BT\n" + << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n" + << "Q\nEMC\n"; + } + + if (bCharArray) { + switch (GetBorderStyle()) { + case BorderStyle::SOLID: { + CFX_ByteString sColor = + CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), false); + if (sColor.GetLength() > 0) { + sLines << "q\n" + << GetBorderWidth() << " w\n" + << CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), false) + << " 2 J 0 j\n"; + + for (int32_t i = 1; i < nMaxLen; ++i) { + sLines << rcClient.left + + ((rcClient.right - rcClient.left) / nMaxLen) * i + << " " << rcClient.bottom << " m\n" + << rcClient.left + + ((rcClient.right - rcClient.left) / nMaxLen) * i + << " " << rcClient.top << " l S\n"; + } + + sLines << "Q\n"; + } + break; + } + case BorderStyle::DASH: { + CFX_ByteString sColor = + CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), false); + if (sColor.GetLength() > 0) { + CPWL_Dash dsBorder = CPWL_Dash(3, 3, 0); + + sLines << "q\n" + << GetBorderWidth() << " w\n" + << CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), false) + << "[" << dsBorder.nDash << " " << dsBorder.nGap << "] " + << dsBorder.nPhase << " d\n"; + + for (int32_t i = 1; i < nMaxLen; ++i) { + sLines << rcClient.left + + ((rcClient.right - rcClient.left) / nMaxLen) * i + << " " << rcClient.bottom << " m\n" + << rcClient.left + + ((rcClient.right - rcClient.left) / nMaxLen) * i + << " " << rcClient.top << " l S\n"; + } + + sLines << "Q\n"; + } + break; + } + default: + break; + } + } + + CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + + sLines.AsStringC() + sBody.AsStringC(); + WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP); +} + +CFX_FloatRect CPDFSDK_Widget::GetClientRect() const { + CFX_FloatRect rcWindow = GetRotatedRect(); + FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); + switch (GetBorderStyle()) { + case BorderStyle::BEVELED: + case BorderStyle::INSET: + fBorderWidth *= 2.0f; + break; + default: + break; + } + + return CPWL_Utils::DeflateRect(rcWindow, fBorderWidth); +} + +CFX_FloatRect CPDFSDK_Widget::GetRotatedRect() const { + CFX_FloatRect rectAnnot = GetRect(); + FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left; + FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom; + + CPDF_FormControl* pControl = GetFormControl(); + CFX_FloatRect rcPDFWindow; + switch (abs(pControl->GetRotation() % 360)) { + case 0: + case 180: + default: + rcPDFWindow = CFX_FloatRect(0, 0, fWidth, fHeight); + break; + case 90: + case 270: + rcPDFWindow = CFX_FloatRect(0, 0, fHeight, fWidth); + break; + } + + return rcPDFWindow; +} + +CFX_ByteString CPDFSDK_Widget::GetBackgroundAppStream() const { + CPWL_Color crBackground = GetFillPWLColor(); + if (crBackground.nColorType != COLORTYPE_TRANSPARENT) + return CPWL_Utils::GetRectFillAppStream(GetRotatedRect(), crBackground); + + return ""; +} + +CFX_ByteString CPDFSDK_Widget::GetBorderAppStream() const { + CFX_FloatRect rcWindow = GetRotatedRect(); + CPWL_Color crBorder = GetBorderPWLColor(); + CPWL_Color crBackground = GetFillPWLColor(); + CPWL_Color crLeftTop, crRightBottom; + + FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth(); + CPWL_Dash dsBorder(3, 0, 0); + + BorderStyle nBorderStyle = GetBorderStyle(); + switch (nBorderStyle) { + case BorderStyle::DASH: + dsBorder = CPWL_Dash(3, 3, 0); + break; + case BorderStyle::BEVELED: + fBorderWidth *= 2; + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1); + crRightBottom = crBackground / 2.0f; + break; + case BorderStyle::INSET: + fBorderWidth *= 2; + crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5); + crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75); + break; + default: + break; + } + + return CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, + crLeftTop, crRightBottom, nBorderStyle, + dsBorder); +} + +CFX_Matrix CPDFSDK_Widget::GetMatrix() const { + CFX_Matrix mt; + CPDF_FormControl* pControl = GetFormControl(); + CFX_FloatRect rcAnnot = GetRect(); + FX_FLOAT fWidth = rcAnnot.right - rcAnnot.left; + FX_FLOAT fHeight = rcAnnot.top - rcAnnot.bottom; + + switch (abs(pControl->GetRotation() % 360)) { + case 0: + default: + mt = CFX_Matrix(1, 0, 0, 1, 0, 0); + break; + case 90: + mt = CFX_Matrix(0, 1, -1, 0, fWidth, 0); + break; + case 180: + mt = CFX_Matrix(-1, 0, 0, -1, fWidth, fHeight); + break; + case 270: + mt = CFX_Matrix(0, -1, 1, 0, 0, fHeight); + break; + } + + return mt; +} + +CPWL_Color CPDFSDK_Widget::GetTextPWLColor() const { + CPWL_Color crText = CPWL_Color(COLORTYPE_GRAY, 0); + + CPDF_FormControl* pFormCtrl = GetFormControl(); + CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance(); + if (da.HasColor()) { + int32_t iColorType; + FX_FLOAT fc[4]; + da.GetColor(iColorType, fc); + crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); + } + + return crText; +} + +CPWL_Color CPDFSDK_Widget::GetBorderPWLColor() const { + CPWL_Color crBorder; + + CPDF_FormControl* pFormCtrl = GetFormControl(); + int32_t iColorType; + FX_FLOAT fc[4]; + pFormCtrl->GetOriginalBorderColor(iColorType, fc); + if (iColorType > 0) + crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); + + return crBorder; +} + +CPWL_Color CPDFSDK_Widget::GetFillPWLColor() const { + CPWL_Color crFill; + + CPDF_FormControl* pFormCtrl = GetFormControl(); + int32_t iColorType; + FX_FLOAT fc[4]; + pFormCtrl->GetOriginalBackgroundColor(iColorType, fc); + if (iColorType > 0) + crFill = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]); + + return crFill; +} + +void CPDFSDK_Widget::AddImageToAppearance(const CFX_ByteString& sAPType, + CPDF_Stream* pImage) { + CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDictFor("AP"); + CPDF_Stream* pStream = pAPDict->GetStreamFor(sAPType); + CPDF_Dictionary* pStreamDict = pStream->GetDict(); + CFX_ByteString sImageAlias = "IMG"; + + if (CPDF_Dictionary* pImageDict = pImage->GetDict()) { + sImageAlias = pImageDict->GetStringFor("Name"); + if (sImageAlias.IsEmpty()) + sImageAlias = "IMG"; + } + + CPDF_Document* pDoc = m_pPageView->GetPDFDocument(); + CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources"); + if (!pStreamResList) + pStreamResList = pStreamDict->SetNewFor("Resources"); + + CPDF_Dictionary* pXObject = + pStreamResList->SetNewFor("XObject"); + pXObject->SetNewFor(sImageAlias, pDoc, pImage->GetObjNum()); +} + +void CPDFSDK_Widget::RemoveAppearance(const CFX_ByteString& sAPType) { + if (CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDictFor("AP")) + pAPDict->RemoveFor(sAPType); +} + +bool CPDFSDK_Widget::OnAAction(CPDF_AAction::AActionType type, + PDFSDK_FieldAction& data, + CPDFSDK_PageView* pPageView) { + CPDFSDK_FormFillEnvironment* pFormFillEnv = pPageView->GetFormFillEnv(); + +#ifdef PDF_ENABLE_XFA + CPDFXFA_Context* pContext = pFormFillEnv->GetXFAContext(); + if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) { + XFA_EVENTTYPE eEventType = GetXFAEventType(type, data.bWillCommit); + + if (eEventType != XFA_EVENT_Unknown) { + if (CXFA_FFWidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler()) { + CXFA_EventParam param; + param.m_eType = eEventType; + param.m_wsChange = data.sChange; + param.m_iCommitKey = data.nCommitKey; + param.m_bShift = data.bShift; + param.m_iSelStart = data.nSelStart; + param.m_iSelEnd = data.nSelEnd; + param.m_wsFullText = data.sValue; + param.m_bKeyDown = data.bKeyDown; + param.m_bModifier = data.bModifier; + param.m_wsNewText = data.sValue; + if (data.nSelEnd > data.nSelStart) + param.m_wsNewText.Delete(data.nSelStart, + data.nSelEnd - data.nSelStart); + for (int i = data.sChange.GetLength() - 1; i >= 0; i--) + param.m_wsNewText.Insert(data.nSelStart, data.sChange[i]); + param.m_wsPrevText = data.sValue; + + CXFA_WidgetAcc* pAcc = hWidget->GetDataAcc(); + param.m_pTarget = pAcc; + int32_t nRet = pXFAWidgetHandler->ProcessEvent(pAcc, ¶m); + + if (CXFA_FFDocView* pDocView = pContext->GetXFADocView()) + pDocView->UpdateDocView(); + + if (nRet == XFA_EVENTERROR_Success) + return true; + } + } + } +#endif // PDF_ENABLE_XFA + + CPDF_Action action = GetAAction(type); + if (action.GetDict() && action.GetType() != CPDF_Action::Unknown) { + CPDFSDK_ActionHandler* pActionHandler = pFormFillEnv->GetActionHander(); + return pActionHandler->DoAction_Field(action, type, pFormFillEnv, + GetFormField(), data); + } + return false; +} + +CPDF_Action CPDFSDK_Widget::GetAAction(CPDF_AAction::AActionType eAAT) { + switch (eAAT) { + case CPDF_AAction::CursorEnter: + case CPDF_AAction::CursorExit: + case CPDF_AAction::ButtonDown: + case CPDF_AAction::ButtonUp: + case CPDF_AAction::GetFocus: + case CPDF_AAction::LoseFocus: + case CPDF_AAction::PageOpen: + case CPDF_AAction::PageClose: + case CPDF_AAction::PageVisible: + case CPDF_AAction::PageInvisible: + return CPDFSDK_BAAnnot::GetAAction(eAAT); + + case CPDF_AAction::KeyStroke: + case CPDF_AAction::Format: + case CPDF_AAction::Validate: + case CPDF_AAction::Calculate: { + CPDF_FormField* pField = GetFormField(); + if (pField->GetAdditionalAction().GetDict()) + return pField->GetAdditionalAction().GetAction(eAAT); + return CPDFSDK_BAAnnot::GetAAction(eAAT); + } + default: + break; + } + + return CPDF_Action(); +} + +CFX_WideString CPDFSDK_Widget::GetAlternateName() const { + CPDF_FormField* pFormField = GetFormField(); + return pFormField->GetAlternateName(); +} + +int32_t CPDFSDK_Widget::GetAppearanceAge() const { + return m_nAppAge; +} + +int32_t CPDFSDK_Widget::GetValueAge() const { + return m_nValueAge; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widget.h b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widget.h new file mode 100644 index 000000000000..21e51697064e --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widget.h @@ -0,0 +1,174 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CPDFSDK_WIDGET_H_ +#define FPDFSDK_CPDFSDK_WIDGET_H_ + +#include + +#include "core/fpdfdoc/cpdf_aaction.h" +#include "core/fpdfdoc/cpdf_action.h" +#include "core/fpdfdoc/cpdf_annot.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "fpdfsdk/cpdfsdk_baannot.h" +#include "fpdfsdk/pdfsdk_fieldaction.h" +#include "fpdfsdk/pdfwindow/cpwl_color.h" + +class CFX_RenderDevice; +class CPDF_Annot; +class CPDF_Dictionary; +class CPDF_FormControl; +class CPDF_FormField; +class CPDF_RenderOptions; +class CPDF_Stream; +class CPDFSDK_InterForm; +class CPDFSDK_PageView; + +#ifdef PDF_ENABLE_XFA +class CXFA_FFWidget; +class CXFA_FFWidgetHandler; +#endif // PDF_ENABLE_XFA + +class CPDFSDK_Widget : public CPDFSDK_BAAnnot { + public: +#ifdef PDF_ENABLE_XFA + CXFA_FFWidget* GetMixXFAWidget() const; + CXFA_FFWidget* GetGroupMixXFAWidget(); + CXFA_FFWidgetHandler* GetXFAWidgetHandler() const; + + bool HasXFAAAction(PDFSDK_XFAAActionType eXFAAAT); + bool OnXFAAAction(PDFSDK_XFAAActionType eXFAAAT, + PDFSDK_FieldAction& data, + CPDFSDK_PageView* pPageView); + + void Synchronize(bool bSynchronizeElse); + void SynchronizeXFAValue(); + void SynchronizeXFAItems(); + + static void SynchronizeXFAValue(CXFA_FFDocView* pXFADocView, + CXFA_FFWidget* hWidget, + CPDF_FormField* pFormField, + CPDF_FormControl* pFormControl); + static void SynchronizeXFAItems(CXFA_FFDocView* pXFADocView, + CXFA_FFWidget* hWidget, + CPDF_FormField* pFormField, + CPDF_FormControl* pFormControl); +#endif // PDF_ENABLE_XFA + + CPDFSDK_Widget(CPDF_Annot* pAnnot, + CPDFSDK_PageView* pPageView, + CPDFSDK_InterForm* pInterForm); + ~CPDFSDK_Widget() override; + + bool IsSignatureWidget() const override; + CPDF_Action GetAAction(CPDF_AAction::AActionType eAAT) override; + bool IsAppearanceValid() override; + + int GetLayoutOrder() const override; + + int GetFieldType() const; + int GetFieldFlags() const; + int GetRotate() const; + + bool GetFillColor(FX_COLORREF& color) const; + bool GetBorderColor(FX_COLORREF& color) const; + bool GetTextColor(FX_COLORREF& color) const; + FX_FLOAT GetFontSize() const; + + int GetSelectedIndex(int nIndex) const; +#ifndef PDF_ENABLE_XFA + CFX_WideString GetValue() const; +#else + CFX_WideString GetValue(bool bDisplay = true) const; +#endif // PDF_ENABLE_XFA + CFX_WideString GetDefaultValue() const; + CFX_WideString GetOptionLabel(int nIndex) const; + int CountOptions() const; + bool IsOptionSelected(int nIndex) const; + int GetTopVisibleIndex() const; + bool IsChecked() const; + int GetAlignment() const; + int GetMaxLen() const; +#ifdef PDF_ENABLE_XFA + CFX_WideString GetName() const; +#endif // PDF_ENABLE_XFA + CFX_WideString GetAlternateName() const; + + void SetCheck(bool bChecked, bool bNotify); + void SetValue(const CFX_WideString& sValue, bool bNotify); + void SetDefaultValue(const CFX_WideString& sValue); + void SetOptionSelection(int index, bool bSelected, bool bNotify); + void ClearSelection(bool bNotify); + void SetTopVisibleIndex(int index); + +#ifdef PDF_ENABLE_XFA + void ResetAppearance(bool bValueChanged); +#endif // PDF_ENABLE_XFA + void ResetAppearance(const CFX_WideString* sValue, bool bValueChanged); + void ResetFieldAppearance(bool bValueChanged); + void UpdateField(); + CFX_WideString OnFormat(bool& bFormatted); + + bool OnAAction(CPDF_AAction::AActionType type, + PDFSDK_FieldAction& data, + CPDFSDK_PageView* pPageView); + + CPDFSDK_InterForm* GetInterForm() const { return m_pInterForm; } + CPDF_FormField* GetFormField() const; + CPDF_FormControl* GetFormControl() const; + static CPDF_FormControl* GetFormControl(CPDF_InterForm* pInterForm, + const CPDF_Dictionary* pAnnotDict); + + void DrawShadow(CFX_RenderDevice* pDevice, CPDFSDK_PageView* pPageView); + + void SetAppModified(); + void ClearAppModified(); + bool IsAppModified() const; + + int32_t GetAppearanceAge() const; + int32_t GetValueAge() const; + + bool IsWidgetAppearanceValid(CPDF_Annot::AppearanceMode mode); + void DrawAppearance(CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + CPDF_Annot::AppearanceMode mode, + const CPDF_RenderOptions* pOptions) override; + + private: + void ResetAppearance_PushButton(); + void ResetAppearance_CheckBox(); + void ResetAppearance_RadioButton(); + void ResetAppearance_ComboBox(const CFX_WideString* sValue); + void ResetAppearance_ListBox(); + void ResetAppearance_TextField(const CFX_WideString* sValue); + + CFX_FloatRect GetClientRect() const; + CFX_FloatRect GetRotatedRect() const; + + CFX_ByteString GetBackgroundAppStream() const; + CFX_ByteString GetBorderAppStream() const; + CFX_Matrix GetMatrix() const; + + CPWL_Color GetTextPWLColor() const; + CPWL_Color GetBorderPWLColor() const; + CPWL_Color GetFillPWLColor() const; + + void AddImageToAppearance(const CFX_ByteString& sAPType, CPDF_Stream* pImage); + void RemoveAppearance(const CFX_ByteString& sAPType); + + CPDFSDK_InterForm* const m_pInterForm; + bool m_bAppModified; + int32_t m_nAppAge; + int32_t m_nValueAge; + +#ifdef PDF_ENABLE_XFA + mutable CXFA_FFWidget* m_hMixXFAWidget; + mutable CXFA_FFWidgetHandler* m_pWidgetHandler; +#endif // PDF_ENABLE_XFA +}; + +#endif // FPDFSDK_CPDFSDK_WIDGET_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widgethandler.cpp b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widgethandler.cpp new file mode 100644 index 000000000000..e85d24c4e0bc --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widgethandler.cpp @@ -0,0 +1,286 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cpdfsdk_widgethandler.h" + +#include +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfdoc/cpdf_interform.h" +#include "fpdfsdk/cpdfsdk_annot.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/formfiller/cffl_formfiller.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#endif // PDF_ENABLE_XFA + +CPDFSDK_WidgetHandler::CPDFSDK_WidgetHandler( + CPDFSDK_FormFillEnvironment* pFormFillEnv) + : m_pFormFillEnv(pFormFillEnv), m_pFormFiller(nullptr) {} + +CPDFSDK_WidgetHandler::~CPDFSDK_WidgetHandler() {} + +bool CPDFSDK_WidgetHandler::CanAnswer(CPDFSDK_Annot* pAnnot) { + ASSERT(pAnnot->GetAnnotSubtype() == CPDF_Annot::Subtype::WIDGET); + if (pAnnot->IsSignatureWidget()) + return false; + + CPDFSDK_Widget* pWidget = static_cast(pAnnot); + if (!pWidget->IsVisible()) + return false; + + int nFieldFlags = pWidget->GetFieldFlags(); + if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY) + return false; + + if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON) + return true; + + CPDF_Page* pPage = pWidget->GetPDFPage(); + CPDF_Document* pDocument = pPage->m_pDocument; + uint32_t dwPermissions = pDocument->GetUserPermissions(); + return (dwPermissions & FPDFPERM_FILL_FORM) || + (dwPermissions & FPDFPERM_ANNOT_FORM); +} + +CPDFSDK_Annot* CPDFSDK_WidgetHandler::NewAnnot(CPDF_Annot* pAnnot, + CPDFSDK_PageView* pPage) { + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + CPDF_FormControl* pCtrl = CPDFSDK_Widget::GetFormControl( + pInterForm->GetInterForm(), pAnnot->GetAnnotDict()); + if (!pCtrl) + return nullptr; + + CPDFSDK_Widget* pWidget = new CPDFSDK_Widget(pAnnot, pPage, pInterForm); + pInterForm->AddMap(pCtrl, pWidget); + CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm(); + if (pPDFInterForm && pPDFInterForm->NeedConstructAP()) + pWidget->ResetAppearance(nullptr, false); + + return pWidget; +} + +#ifdef PDF_ENABLE_XFA +CPDFSDK_Annot* CPDFSDK_WidgetHandler::NewAnnot(CXFA_FFWidget* hWidget, + CPDFSDK_PageView* pPage) { + return nullptr; +} +#endif // PDF_ENABLE_XFA + +void CPDFSDK_WidgetHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) { + ASSERT(pAnnot); + + if (m_pFormFiller) + m_pFormFiller->OnDelete(pAnnot); + + std::unique_ptr pWidget(static_cast(pAnnot)); + CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm(); + CPDF_FormControl* pControl = pWidget->GetFormControl(); + pInterForm->RemoveMap(pControl); +} + +void CPDFSDK_WidgetHandler::OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + bool bDrawAnnots) { + if (pAnnot->IsSignatureWidget()) { + static_cast(pAnnot)->DrawAppearance( + pDevice, pUser2Device, CPDF_Annot::Normal, nullptr); + } else { + if (m_pFormFiller) + m_pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device); + } +} + +void CPDFSDK_WidgetHandler::OnMouseEnter(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + if (!(*pAnnot)->IsSignatureWidget() && m_pFormFiller) + m_pFormFiller->OnMouseEnter(pPageView, pAnnot, nFlag); +} + +void CPDFSDK_WidgetHandler::OnMouseExit(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + if (!(*pAnnot)->IsSignatureWidget() && m_pFormFiller) + m_pFormFiller->OnMouseExit(pPageView, pAnnot, nFlag); +} + +bool CPDFSDK_WidgetHandler::OnLButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!(*pAnnot)->IsSignatureWidget() && m_pFormFiller) + return m_pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point); + + return false; +} + +bool CPDFSDK_WidgetHandler::OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!(*pAnnot)->IsSignatureWidget() && m_pFormFiller) + return m_pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point); + + return false; +} + +bool CPDFSDK_WidgetHandler::OnLButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!(*pAnnot)->IsSignatureWidget() && m_pFormFiller) + return m_pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point); + + return false; +} + +bool CPDFSDK_WidgetHandler::OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!(*pAnnot)->IsSignatureWidget() && m_pFormFiller) + return m_pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point); + + return false; +} + +bool CPDFSDK_WidgetHandler::OnMouseWheel(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_PointF& point) { + if (!(*pAnnot)->IsSignatureWidget() && m_pFormFiller) + return m_pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, + point); + + return false; +} + +bool CPDFSDK_WidgetHandler::OnRButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!(*pAnnot)->IsSignatureWidget() && m_pFormFiller) + return m_pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point); + + return false; +} + +bool CPDFSDK_WidgetHandler::OnRButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!(*pAnnot)->IsSignatureWidget() && m_pFormFiller) + return m_pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point); + + return false; +} + +bool CPDFSDK_WidgetHandler::OnRButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + return false; +} + +bool CPDFSDK_WidgetHandler::OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) { + if (!pAnnot->IsSignatureWidget() && m_pFormFiller) + return m_pFormFiller->OnChar(pAnnot, nChar, nFlags); + + return false; +} + +bool CPDFSDK_WidgetHandler::OnKeyDown(CPDFSDK_Annot* pAnnot, + int nKeyCode, + int nFlag) { + if (!pAnnot->IsSignatureWidget() && m_pFormFiller) + return m_pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlag); + + return false; +} + +bool CPDFSDK_WidgetHandler::OnKeyUp(CPDFSDK_Annot* pAnnot, + int nKeyCode, + int nFlag) { + return false; +} + +void CPDFSDK_WidgetHandler::OnLoad(CPDFSDK_Annot* pAnnot) { + if (pAnnot->IsSignatureWidget()) + return; + + CPDFSDK_Widget* pWidget = static_cast(pAnnot); + if (!pWidget->IsAppearanceValid()) + pWidget->ResetAppearance(nullptr, false); + + int nFieldType = pWidget->GetFieldType(); + if (nFieldType == FIELDTYPE_TEXTFIELD || nFieldType == FIELDTYPE_COMBOBOX) { + bool bFormatted = false; + CFX_WideString sValue = pWidget->OnFormat(bFormatted); + if (bFormatted && nFieldType == FIELDTYPE_COMBOBOX) + pWidget->ResetAppearance(&sValue, false); + } + +#ifdef PDF_ENABLE_XFA + CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); + CPDFXFA_Context* pContext = pPageView->GetFormFillEnv()->GetXFAContext(); + if (pContext->GetDocType() == DOCTYPE_STATIC_XFA) { + if (!pWidget->IsAppearanceValid() && !pWidget->GetValue().IsEmpty()) + pWidget->ResetAppearance(false); + } +#endif // PDF_ENABLE_XFA +} + +bool CPDFSDK_WidgetHandler::OnSetFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + if (!(*pAnnot)->IsSignatureWidget() && m_pFormFiller) + return m_pFormFiller->OnSetFocus(pAnnot, nFlag); + + return true; +} + +bool CPDFSDK_WidgetHandler::OnKillFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + if (!(*pAnnot)->IsSignatureWidget() && m_pFormFiller) + return m_pFormFiller->OnKillFocus(pAnnot, nFlag); + + return true; +} + +#ifdef PDF_ENABLE_XFA +bool CPDFSDK_WidgetHandler::OnXFAChangedFocus( + CPDFSDK_Annot::ObservedPtr* pOldAnnot, + CPDFSDK_Annot::ObservedPtr* pNewAnnot) { + return true; +} +#endif // PDF_ENABLE_XFA + +CFX_FloatRect CPDFSDK_WidgetHandler::GetViewBBox(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) { + if (!pAnnot->IsSignatureWidget() && m_pFormFiller) + return CFX_FloatRect(m_pFormFiller->GetViewBBox(pPageView, pAnnot)); + + return CFX_FloatRect(0, 0, 0, 0); +} + +bool CPDFSDK_WidgetHandler::HitTest(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + const CFX_PointF& point) { + ASSERT(pPageView); + ASSERT(pAnnot); + return GetViewBBox(pPageView, pAnnot).Contains(point); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widgethandler.h b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widgethandler.h new file mode 100644 index 000000000000..6e4d50b2727b --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_widgethandler.h @@ -0,0 +1,109 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CPDFSDK_WIDGETHANDLER_H_ +#define FPDFSDK_CPDFSDK_WIDGETHANDLER_H_ + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" +#include "fpdfsdk/ipdfsdk_annothandler.h" + +class CFFL_InteractiveFormFiller; +class CFX_Matrix; +class CFX_RenderDevice; +class CPDF_Annot; +class CPDFSDK_Annot; +class CPDFSDK_FormFillEnvironment; +class CPDFSDK_PageView; + +#ifdef PDF_ENABLE_XFA +class CXFA_FFWidget; +#endif // PDF_ENABLE_XFA + +class CPDFSDK_WidgetHandler : public IPDFSDK_AnnotHandler { + public: + explicit CPDFSDK_WidgetHandler(CPDFSDK_FormFillEnvironment* pApp); + ~CPDFSDK_WidgetHandler() override; + + bool CanAnswer(CPDFSDK_Annot* pAnnot) override; + CPDFSDK_Annot* NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage) override; +#ifdef PDF_ENABLE_XFA + CPDFSDK_Annot* NewAnnot(CXFA_FFWidget* hWidget, + CPDFSDK_PageView* pPage) override; +#endif // PDF_ENABLE_XFA + void ReleaseAnnot(CPDFSDK_Annot* pAnnot) override; + CFX_FloatRect GetViewBBox(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) override; + bool HitTest(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + const CFX_PointF& point) override; + void OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + bool bDrawAnnots) override; + void OnLoad(CPDFSDK_Annot* pAnnot) override; + + void OnMouseEnter(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) override; + void OnMouseExit(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) override; + bool OnLButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnLButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnMouseWheel(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_PointF& point) override; + bool OnRButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnRButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnRButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnChar(CPDFSDK_Annot* pAnnot, uint32_t nChar, uint32_t nFlags) override; + bool OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) override; + bool OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) override; + bool OnSetFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, uint32_t nFlag) override; + bool OnKillFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, uint32_t nFlag) override; +#ifdef PDF_ENABLE_XFA + bool OnXFAChangedFocus(CPDFSDK_Annot::ObservedPtr* pOldAnnot, + CPDFSDK_Annot::ObservedPtr* pNewAnnot) override; +#endif // PDF_ENABLE_XFA + + void SetFormFiller(CFFL_InteractiveFormFiller* pFiller) { + m_pFormFiller = pFiller; + } + CFFL_InteractiveFormFiller* GetFormFiller() { return m_pFormFiller; } + + private: + CPDFSDK_FormFillEnvironment* m_pFormFillEnv; + CFFL_InteractiveFormFiller* m_pFormFiller; +}; + +#endif // FPDFSDK_CPDFSDK_WIDGETHANDLER_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidget.cpp b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidget.cpp new file mode 100644 index 000000000000..b30e5f3ac2ec --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidget.cpp @@ -0,0 +1,35 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cpdfsdk_xfawidget.h" + +#include "fpdfsdk/ipdfsdk_annothandler.h" +#include "xfa/fxfa/xfa_ffwidget.h" + +CPDFSDK_XFAWidget::CPDFSDK_XFAWidget(CXFA_FFWidget* pAnnot, + CPDFSDK_PageView* pPageView, + CPDFSDK_InterForm* pInterForm) + : CPDFSDK_Annot(pPageView), + m_pInterForm(pInterForm), + m_hXFAWidget(pAnnot) {} + +bool CPDFSDK_XFAWidget::IsXFAField() { + return true; +} + +CXFA_FFWidget* CPDFSDK_XFAWidget::GetXFAWidget() const { + return m_hXFAWidget; +} + +CPDF_Annot::Subtype CPDFSDK_XFAWidget::GetAnnotSubtype() const { + return CPDF_Annot::Subtype::XFAWIDGET; +} + +CFX_FloatRect CPDFSDK_XFAWidget::GetRect() const { + CFX_RectF rcBBox = GetXFAWidget()->GetRect(false); + return CFX_FloatRect(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width, + rcBBox.top + rcBBox.height); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidget.h b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidget.h new file mode 100644 index 000000000000..9d0be75f13ae --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidget.h @@ -0,0 +1,37 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CPDFSDK_XFAWIDGET_H_ +#define FPDFSDK_CPDFSDK_XFAWIDGET_H_ + +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_string.h" +#include "fpdfsdk/cpdfsdk_annot.h" + +class CPDFSDK_InterForm; +class CPDFSDK_PageView; +class CXFA_FFWidget; + +class CPDFSDK_XFAWidget : public CPDFSDK_Annot { + public: + CPDFSDK_XFAWidget(CXFA_FFWidget* pAnnot, + CPDFSDK_PageView* pPageView, + CPDFSDK_InterForm* pInterForm); + ~CPDFSDK_XFAWidget() override {} + + bool IsXFAField() override; + CXFA_FFWidget* GetXFAWidget() const override; + CPDF_Annot::Subtype GetAnnotSubtype() const override; + CFX_FloatRect GetRect() const override; + + CPDFSDK_InterForm* GetInterForm() { return m_pInterForm; } + + private: + CPDFSDK_InterForm* m_pInterForm; + CXFA_FFWidget* m_hXFAWidget; +}; + +#endif // FPDFSDK_CPDFSDK_XFAWIDGET_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidgethandler.cpp b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidgethandler.cpp new file mode 100644 index 000000000000..653eb8ae4342 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidgethandler.cpp @@ -0,0 +1,356 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/cpdfsdk_xfawidgethandler.h" + +#include "core/fpdfdoc/cpdf_interform.h" +#include "fpdfsdk/cpdfsdk_annot.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/cpdfsdk_xfawidget.h" +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#include "xfa/fwl/cfwl_app.h" +#include "xfa/fwl/fwl_widgethit.h" +#include "xfa/fxfa/fxfa_basic.h" +#include "xfa/fxfa/xfa_ffdocview.h" +#include "xfa/fxfa/xfa_ffpageview.h" +#include "xfa/fxfa/xfa_ffwidget.h" +#include "xfa/fxfa/xfa_ffwidgethandler.h" +#include "xfa/fxgraphics/cfx_graphics.h" + +CPDFSDK_XFAWidgetHandler::CPDFSDK_XFAWidgetHandler( + CPDFSDK_FormFillEnvironment* pFormFillEnv) + : m_pFormFillEnv(pFormFillEnv) {} + +CPDFSDK_XFAWidgetHandler::~CPDFSDK_XFAWidgetHandler() {} + +bool CPDFSDK_XFAWidgetHandler::CanAnswer(CPDFSDK_Annot* pAnnot) { + return !!pAnnot->GetXFAWidget(); +} + +CPDFSDK_Annot* CPDFSDK_XFAWidgetHandler::NewAnnot(CPDF_Annot* pAnnot, + CPDFSDK_PageView* pPage) { + return nullptr; +} + +CPDFSDK_Annot* CPDFSDK_XFAWidgetHandler::NewAnnot(CXFA_FFWidget* pAnnot, + CPDFSDK_PageView* pPage) { + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + CPDFSDK_XFAWidget* pWidget = new CPDFSDK_XFAWidget(pAnnot, pPage, pInterForm); + pInterForm->AddXFAMap(pAnnot, pWidget); + return pWidget; +} + +void CPDFSDK_XFAWidgetHandler::OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + bool bDrawAnnots) { + ASSERT(pPageView); + ASSERT(pAnnot); + + CFX_Graphics gs(pDevice); + + CFX_Matrix mt = *pUser2Device; + bool bIsHighlight = false; + if (pPageView->GetFormFillEnv()->GetFocusAnnot() != pAnnot) + bIsHighlight = true; + + GetXFAWidgetHandler(pAnnot)->RenderWidget(pAnnot->GetXFAWidget(), &gs, &mt, + bIsHighlight); + + // to do highlight and shadow +} + +void CPDFSDK_XFAWidgetHandler::OnLoad(CPDFSDK_Annot* pAnnot) {} + +void CPDFSDK_XFAWidgetHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) { + CPDFSDK_XFAWidget* pWidget = reinterpret_cast(pAnnot); + CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm(); + pInterForm->RemoveXFAMap(pWidget->GetXFAWidget()); + + delete pWidget; +} + +CFX_FloatRect CPDFSDK_XFAWidgetHandler::GetViewBBox(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) { + ASSERT(pAnnot); + + CFX_RectF rcBBox; + XFA_Element eType = pAnnot->GetXFAWidget()->GetDataAcc()->GetUIType(); + if (eType == XFA_Element::Signature) + rcBBox = pAnnot->GetXFAWidget()->GetBBox(XFA_WidgetStatus_Visible, true); + else + rcBBox = pAnnot->GetXFAWidget()->GetBBox(XFA_WidgetStatus_None); + + CFX_FloatRect rcWidget(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width, + rcBBox.top + rcBBox.height); + rcWidget.left -= 1.0f; + rcWidget.right += 1.0f; + rcWidget.bottom -= 1.0f; + rcWidget.top += 1.0f; + + return rcWidget; +} + +bool CPDFSDK_XFAWidgetHandler::HitTest(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + const CFX_PointF& point) { + if (!pPageView || !pAnnot) + return false; + + CPDFSDK_FormFillEnvironment* pFormFillEnv = pPageView->GetFormFillEnv(); + if (!pFormFillEnv) + return false; + + CPDFXFA_Context* pContext = pFormFillEnv->GetXFAContext(); + if (!pContext) + return false; + + CXFA_FFDocView* pDocView = pContext->GetXFADocView(); + if (!pDocView) + return false; + + CXFA_FFWidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler(); + if (!pWidgetHandler) + return false; + + FWL_WidgetHit dwHitTest = + pWidgetHandler->OnHitTest(pAnnot->GetXFAWidget(), point); + return dwHitTest != FWL_WidgetHit::Unknown; +} + +void CPDFSDK_XFAWidgetHandler::OnMouseEnter(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + if (!pPageView || !(*pAnnot)) + return; + CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get()); + pWidgetHandler->OnMouseEnter((*pAnnot)->GetXFAWidget()); +} + +void CPDFSDK_XFAWidgetHandler::OnMouseExit(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + if (!pPageView || !(*pAnnot)) + return; + + CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get()); + pWidgetHandler->OnMouseExit((*pAnnot)->GetXFAWidget()); +} + +bool CPDFSDK_XFAWidgetHandler::OnLButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!pPageView || !(*pAnnot)) + return false; + + CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get()); + return pWidgetHandler->OnLButtonDown((*pAnnot)->GetXFAWidget(), + GetFWLFlags(nFlags), point); +} + +bool CPDFSDK_XFAWidgetHandler::OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!pPageView || !(*pAnnot)) + return false; + + CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get()); + return pWidgetHandler->OnLButtonUp((*pAnnot)->GetXFAWidget(), + GetFWLFlags(nFlags), point); +} + +bool CPDFSDK_XFAWidgetHandler::OnLButtonDblClk( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!pPageView || !(*pAnnot)) + return false; + + CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get()); + return pWidgetHandler->OnLButtonDblClk((*pAnnot)->GetXFAWidget(), + GetFWLFlags(nFlags), point); +} + +bool CPDFSDK_XFAWidgetHandler::OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!pPageView || !(*pAnnot)) + return false; + + CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get()); + return pWidgetHandler->OnMouseMove((*pAnnot)->GetXFAWidget(), + GetFWLFlags(nFlags), point); +} + +bool CPDFSDK_XFAWidgetHandler::OnMouseWheel(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_PointF& point) { + if (!pPageView || !(*pAnnot)) + return false; + + CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get()); + return pWidgetHandler->OnMouseWheel((*pAnnot)->GetXFAWidget(), + GetFWLFlags(nFlags), zDelta, point); +} + +bool CPDFSDK_XFAWidgetHandler::OnRButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!pPageView || !(*pAnnot)) + return false; + + CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get()); + return pWidgetHandler->OnRButtonDown((*pAnnot)->GetXFAWidget(), + GetFWLFlags(nFlags), point); +} + +bool CPDFSDK_XFAWidgetHandler::OnRButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!pPageView || !(*pAnnot)) + return false; + + CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get()); + return pWidgetHandler->OnRButtonUp((*pAnnot)->GetXFAWidget(), + GetFWLFlags(nFlags), point); +} + +bool CPDFSDK_XFAWidgetHandler::OnRButtonDblClk( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!pPageView || !(*pAnnot)) + return false; + + CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get()); + return pWidgetHandler->OnRButtonDblClk((*pAnnot)->GetXFAWidget(), + GetFWLFlags(nFlags), point); +} + +bool CPDFSDK_XFAWidgetHandler::OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) { + if (!pAnnot) + return false; + + CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + return pWidgetHandler->OnChar(pAnnot->GetXFAWidget(), nChar, + GetFWLFlags(nFlags)); +} + +bool CPDFSDK_XFAWidgetHandler::OnKeyDown(CPDFSDK_Annot* pAnnot, + int nKeyCode, + int nFlag) { + if (!pAnnot) + return false; + + CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + return pWidgetHandler->OnKeyDown(pAnnot->GetXFAWidget(), nKeyCode, + GetFWLFlags(nFlag)); +} + +bool CPDFSDK_XFAWidgetHandler::OnKeyUp(CPDFSDK_Annot* pAnnot, + int nKeyCode, + int nFlag) { + if (!pAnnot) + return false; + + CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + return pWidgetHandler->OnKeyUp(pAnnot->GetXFAWidget(), nKeyCode, + GetFWLFlags(nFlag)); +} + +bool CPDFSDK_XFAWidgetHandler::OnSetFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + return true; +} + +bool CPDFSDK_XFAWidgetHandler::OnKillFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + return true; +} + +bool CPDFSDK_XFAWidgetHandler::OnXFAChangedFocus( + CPDFSDK_Annot::ObservedPtr* pOldAnnot, + CPDFSDK_Annot::ObservedPtr* pNewAnnot) { + CXFA_FFWidgetHandler* pWidgetHandler = nullptr; + if (*pOldAnnot) + pWidgetHandler = GetXFAWidgetHandler(pOldAnnot->Get()); + else if (*pNewAnnot) + pWidgetHandler = GetXFAWidgetHandler(pNewAnnot->Get()); + + if (!pWidgetHandler) + return true; + + CXFA_FFWidget* hWidget = *pNewAnnot ? (*pNewAnnot)->GetXFAWidget() : nullptr; + if (!hWidget) + return true; + + CXFA_FFPageView* pXFAPageView = hWidget->GetPageView(); + if (!pXFAPageView) + return true; + + bool bRet = pXFAPageView->GetDocView()->SetFocus(hWidget); + if (pXFAPageView->GetDocView()->GetFocusWidget() == hWidget) + bRet = true; + + return bRet; +} + +CXFA_FFWidgetHandler* CPDFSDK_XFAWidgetHandler::GetXFAWidgetHandler( + CPDFSDK_Annot* pAnnot) { + if (!pAnnot) + return nullptr; + + CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); + if (!pPageView) + return nullptr; + + CPDFSDK_FormFillEnvironment* pFormFillEnv = pPageView->GetFormFillEnv(); + if (!pFormFillEnv) + return nullptr; + + CPDFXFA_Context* pDoc = pFormFillEnv->GetXFAContext(); + if (!pDoc) + return nullptr; + + CXFA_FFDocView* pDocView = pDoc->GetXFADocView(); + if (!pDocView) + return nullptr; + + return pDocView->GetWidgetHandler(); +} + +uint32_t CPDFSDK_XFAWidgetHandler::GetFWLFlags(uint32_t dwFlag) { + uint32_t dwFWLFlag = 0; + + if (dwFlag & FWL_EVENTFLAG_ControlKey) + dwFWLFlag |= FWL_KEYFLAG_Ctrl; + if (dwFlag & FWL_EVENTFLAG_LeftButtonDown) + dwFWLFlag |= FWL_KEYFLAG_LButton; + if (dwFlag & FWL_EVENTFLAG_MiddleButtonDown) + dwFWLFlag |= FWL_KEYFLAG_MButton; + if (dwFlag & FWL_EVENTFLAG_RightButtonDown) + dwFWLFlag |= FWL_KEYFLAG_RButton; + if (dwFlag & FWL_EVENTFLAG_ShiftKey) + dwFWLFlag |= FWL_KEYFLAG_Shift; + if (dwFlag & FWL_EVENTFLAG_AltKey) + dwFWLFlag |= FWL_KEYFLAG_Alt; + + return dwFWLFlag; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidgethandler.h b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidgethandler.h new file mode 100644 index 000000000000..3903103eeb2c --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/cpdfsdk_xfawidgethandler.h @@ -0,0 +1,98 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_CPDFSDK_XFAWIDGETHANDLER_H_ +#define FPDFSDK_CPDFSDK_XFAWIDGETHANDLER_H_ + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" +#include "fpdfsdk/ipdfsdk_annothandler.h" + +class CFX_Matrix; +class CFX_RenderDevice; +class CPDF_Annot; +class CPDFSDK_FormFillEnvironment; +class CPDFSDK_Annot; +class CPDFSDK_PageView; +class CXFA_FFWidget; +class CXFA_FFWidgetHandler; + +class CPDFSDK_XFAWidgetHandler : public IPDFSDK_AnnotHandler { + public: + explicit CPDFSDK_XFAWidgetHandler(CPDFSDK_FormFillEnvironment* pApp); + ~CPDFSDK_XFAWidgetHandler() override; + + bool CanAnswer(CPDFSDK_Annot* pAnnot) override; + CPDFSDK_Annot* NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage) override; + CPDFSDK_Annot* NewAnnot(CXFA_FFWidget* pAnnot, + CPDFSDK_PageView* pPage) override; + void ReleaseAnnot(CPDFSDK_Annot* pAnnot) override; + CFX_FloatRect GetViewBBox(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) override; + bool HitTest(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + const CFX_PointF& point) override; + void OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + bool bDrawAnnots) override; + void OnLoad(CPDFSDK_Annot* pAnnot) override; + void OnMouseEnter(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) override; + void OnMouseExit(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) override; + bool OnLButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnLButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnMouseWheel(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_PointF& point) override; + bool OnRButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnRButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnRButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnChar(CPDFSDK_Annot* pAnnot, uint32_t nChar, uint32_t nFlags) override; + bool OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) override; + bool OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) override; + bool OnSetFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, uint32_t nFlag) override; + bool OnKillFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, uint32_t nFlag) override; + bool OnXFAChangedFocus(CPDFSDK_Annot::ObservedPtr* pOldAnnot, + CPDFSDK_Annot::ObservedPtr* pNewAnnot) override; + + private: + CXFA_FFWidgetHandler* GetXFAWidgetHandler(CPDFSDK_Annot* pAnnot); + uint32_t GetFWLFlags(uint32_t dwFlag); + + CPDFSDK_FormFillEnvironment* m_pFormFillEnv; +}; + +#endif // FPDFSDK_CPDFSDK_XFAWIDGETHANDLER_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cba_fontmap.cpp b/modules/pdfium/pdfium/fpdfsdk/formfiller/cba_fontmap.cpp new file mode 100644 index 000000000000..750b41627e79 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cba_fontmap.cpp @@ -0,0 +1,250 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/formfiller/cba_fontmap.h" + +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_simple_parser.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfdoc/cpdf_formfield.h" +#include "core/fxge/cfx_substfont.h" +#include "fpdfsdk/cpdfsdk_annot.h" + +CBA_FontMap::CBA_FontMap(CPDFSDK_Annot* pAnnot, + CFX_SystemHandler* pSystemHandler) + : CPWL_FontMap(pSystemHandler), + m_pDocument(nullptr), + m_pAnnotDict(nullptr), + m_pDefaultFont(nullptr), + m_sAPType("N") { + CPDF_Page* pPage = pAnnot->GetPDFPage(); + + m_pDocument = pPage->m_pDocument; + m_pAnnotDict = pAnnot->GetPDFAnnot()->GetAnnotDict(); + Initialize(); +} + +CBA_FontMap::~CBA_FontMap() {} + +void CBA_FontMap::Reset() { + Empty(); + m_pDefaultFont = nullptr; + m_sDefaultFontName = ""; +} + +void CBA_FontMap::Initialize() { + int32_t nCharset = FXFONT_DEFAULT_CHARSET; + + if (!m_pDefaultFont) { + m_pDefaultFont = GetAnnotDefaultFont(m_sDefaultFontName); + if (m_pDefaultFont) { + if (const CFX_SubstFont* pSubstFont = m_pDefaultFont->GetSubstFont()) { + nCharset = pSubstFont->m_Charset; + } else { + if (m_sDefaultFontName == "Wingdings" || + m_sDefaultFontName == "Wingdings2" || + m_sDefaultFontName == "Wingdings3" || + m_sDefaultFontName == "Webdings") + nCharset = FXFONT_SYMBOL_CHARSET; + else + nCharset = FXFONT_ANSI_CHARSET; + } + AddFontData(m_pDefaultFont, m_sDefaultFontName, nCharset); + AddFontToAnnotDict(m_pDefaultFont, m_sDefaultFontName); + } + } + + if (nCharset != FXFONT_ANSI_CHARSET) + CPWL_FontMap::Initialize(); +} + +void CBA_FontMap::SetDefaultFont(CPDF_Font* pFont, + const CFX_ByteString& sFontName) { + ASSERT(pFont); + + if (m_pDefaultFont) + return; + + m_pDefaultFont = pFont; + m_sDefaultFontName = sFontName; + + int32_t nCharset = FXFONT_DEFAULT_CHARSET; + if (const CFX_SubstFont* pSubstFont = m_pDefaultFont->GetSubstFont()) + nCharset = pSubstFont->m_Charset; + AddFontData(m_pDefaultFont, m_sDefaultFontName, nCharset); +} + +CPDF_Font* CBA_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, + int32_t nCharset) { + if (m_pAnnotDict->GetStringFor("Subtype") != "Widget") + return nullptr; + + CPDF_Document* pDocument = GetDocument(); + CPDF_Dictionary* pRootDict = pDocument->GetRoot(); + if (!pRootDict) + return nullptr; + + CPDF_Dictionary* pAcroFormDict = pRootDict->GetDictFor("AcroForm"); + if (!pAcroFormDict) + return nullptr; + + CPDF_Dictionary* pDRDict = pAcroFormDict->GetDictFor("DR"); + if (!pDRDict) + return nullptr; + + return FindResFontSameCharset(pDRDict, sFontAlias, nCharset); +} + +CPDF_Document* CBA_FontMap::GetDocument() { + return m_pDocument; +} + +CPDF_Font* CBA_FontMap::FindResFontSameCharset(CPDF_Dictionary* pResDict, + CFX_ByteString& sFontAlias, + int32_t nCharset) { + if (!pResDict) + return nullptr; + + CPDF_Dictionary* pFonts = pResDict->GetDictFor("Font"); + if (!pFonts) + return nullptr; + + CPDF_Document* pDocument = GetDocument(); + CPDF_Font* pFind = nullptr; + for (const auto& it : *pFonts) { + const CFX_ByteString& csKey = it.first; + if (!it.second) + continue; + + CPDF_Dictionary* pElement = ToDictionary(it.second->GetDirect()); + if (!pElement) + continue; + if (pElement->GetStringFor("Type") != "Font") + continue; + + CPDF_Font* pFont = pDocument->LoadFont(pElement); + if (!pFont) + continue; + const CFX_SubstFont* pSubst = pFont->GetSubstFont(); + if (!pSubst) + continue; + if (pSubst->m_Charset == nCharset) { + sFontAlias = csKey; + pFind = pFont; + } + } + return pFind; +} + +void CBA_FontMap::AddedFont(CPDF_Font* pFont, + const CFX_ByteString& sFontAlias) { + AddFontToAnnotDict(pFont, sFontAlias); +} + +void CBA_FontMap::AddFontToAnnotDict(CPDF_Font* pFont, + const CFX_ByteString& sAlias) { + if (!pFont) + return; + + CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDictFor("AP"); + if (!pAPDict) + pAPDict = m_pAnnotDict->SetNewFor("AP"); + + // to avoid checkbox and radiobutton + CPDF_Object* pObject = pAPDict->GetObjectFor(m_sAPType); + if (ToDictionary(pObject)) + return; + + CPDF_Stream* pStream = pAPDict->GetStreamFor(m_sAPType); + if (!pStream) { + pStream = m_pDocument->NewIndirect(); + pAPDict->SetNewFor(m_sAPType, m_pDocument, + pStream->GetObjNum()); + } + + CPDF_Dictionary* pStreamDict = pStream->GetDict(); + if (!pStreamDict) { + auto pOwnedDict = + pdfium::MakeUnique(m_pDocument->GetByteStringPool()); + pStreamDict = pOwnedDict.get(); + pStream->InitStream(nullptr, 0, std::move(pOwnedDict)); + } + + CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources"); + if (!pStreamResList) + pStreamResList = pStreamDict->SetNewFor("Resources"); + CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDictFor("Font"); + if (!pStreamResFontList) { + pStreamResFontList = m_pDocument->NewIndirect(); + pStreamResList->SetNewFor("Font", m_pDocument, + pStreamResFontList->GetObjNum()); + } + if (!pStreamResFontList->KeyExist(sAlias)) { + pStreamResFontList->SetNewFor( + sAlias, m_pDocument, pFont->GetFontDict()->GetObjNum()); + } +} + +CPDF_Font* CBA_FontMap::GetAnnotDefaultFont(CFX_ByteString& sAlias) { + CPDF_Dictionary* pAcroFormDict = nullptr; + const bool bWidget = (m_pAnnotDict->GetStringFor("Subtype") == "Widget"); + if (bWidget) { + if (CPDF_Dictionary* pRootDict = m_pDocument->GetRoot()) + pAcroFormDict = pRootDict->GetDictFor("AcroForm"); + } + + CFX_ByteString sDA; + CPDF_Object* pObj = FPDF_GetFieldAttr(m_pAnnotDict, "DA"); + if (pObj) + sDA = pObj->GetString(); + + if (bWidget) { + if (sDA.IsEmpty()) { + pObj = FPDF_GetFieldAttr(pAcroFormDict, "DA"); + sDA = pObj ? pObj->GetString() : CFX_ByteString(); + } + } + if (sDA.IsEmpty()) + return nullptr; + + CPDF_SimpleParser syntax(sDA.AsStringC()); + syntax.FindTagParamFromStart("Tf", 2); + CFX_ByteString sFontName(syntax.GetWord()); + sAlias = PDF_NameDecode(sFontName).Mid(1); + CPDF_Dictionary* pFontDict = nullptr; + + if (CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDictFor("AP")) { + if (CPDF_Dictionary* pNormalDict = pAPDict->GetDictFor("N")) { + if (CPDF_Dictionary* pNormalResDict = + pNormalDict->GetDictFor("Resources")) { + if (CPDF_Dictionary* pResFontDict = pNormalResDict->GetDictFor("Font")) + pFontDict = pResFontDict->GetDictFor(sAlias); + } + } + } + + if (bWidget && !pFontDict && pAcroFormDict) { + if (CPDF_Dictionary* pDRDict = pAcroFormDict->GetDictFor("DR")) { + if (CPDF_Dictionary* pDRFontDict = pDRDict->GetDictFor("Font")) + pFontDict = pDRFontDict->GetDictFor(sAlias); + } + } + + return pFontDict ? m_pDocument->LoadFont(pFontDict) : nullptr; +} + +void CBA_FontMap::SetAPType(const CFX_ByteString& sAPType) { + m_sAPType = sAPType; + + Reset(); + Initialize(); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cba_fontmap.h b/modules/pdfium/pdfium/fpdfsdk/formfiller/cba_fontmap.h new file mode 100644 index 000000000000..c0e569a0d3f3 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cba_fontmap.h @@ -0,0 +1,46 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FORMFILLER_CBA_FONTMAP_H_ +#define FPDFSDK_FORMFILLER_CBA_FONTMAP_H_ + +#include "fpdfsdk/pdfwindow/PWL_FontMap.h" + +class CPDF_Dictionary; +class CPDFSDK_Annot; + +class CBA_FontMap : public CPWL_FontMap { + public: + CBA_FontMap(CPDFSDK_Annot* pAnnot, CFX_SystemHandler* pSystemHandler); + ~CBA_FontMap() override; + + void SetDefaultFont(CPDF_Font* pFont, const CFX_ByteString& sFontName); + + void Reset(); + void SetAPType(const CFX_ByteString& sAPType); + + private: + // CPWL_FontMap: + void Initialize() override; + CPDF_Document* GetDocument() override; + CPDF_Font* FindFontSameCharset(CFX_ByteString& sFontAlias, + int32_t nCharset) override; + void AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias) override; + + CPDF_Font* FindResFontSameCharset(CPDF_Dictionary* pResDict, + CFX_ByteString& sFontAlias, + int32_t nCharset); + CPDF_Font* GetAnnotDefaultFont(CFX_ByteString& csNameTag); + void AddFontToAnnotDict(CPDF_Font* pFont, const CFX_ByteString& sAlias); + + CPDF_Document* m_pDocument; + CPDF_Dictionary* m_pAnnotDict; + CPDF_Font* m_pDefaultFont; + CFX_ByteString m_sDefaultFontName; + CFX_ByteString m_sAPType; +}; + +#endif // FPDFSDK_FORMFILLER_CBA_FONTMAP_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_checkbox.cpp b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_checkbox.cpp new file mode 100644 index 000000000000..c233c136c179 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_checkbox.cpp @@ -0,0 +1,116 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/formfiller/cffl_checkbox.h" + +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/formfiller/cffl_formfiller.h" +#include "fpdfsdk/pdfwindow/PWL_SpecialButton.h" +#include "public/fpdf_fwlevent.h" + +CFFL_CheckBox::CFFL_CheckBox(CPDFSDK_FormFillEnvironment* pApp, + CPDFSDK_Widget* pWidget) + : CFFL_Button(pApp, pWidget) {} + +CFFL_CheckBox::~CFFL_CheckBox() {} + +CPWL_Wnd* CFFL_CheckBox::NewPDFWindow(const PWL_CREATEPARAM& cp, + CPDFSDK_PageView* pPageView) { + CPWL_CheckBox* pWnd = new CPWL_CheckBox(); + pWnd->Create(cp); + pWnd->SetCheck(m_pWidget->IsChecked()); + return pWnd; +} + +bool CFFL_CheckBox::OnKeyDown(CPDFSDK_Annot* pAnnot, + uint32_t nKeyCode, + uint32_t nFlags) { + switch (nKeyCode) { + case FWL_VKEY_Return: + case FWL_VKEY_Space: + return true; + default: + return CFFL_FormFiller::OnKeyDown(pAnnot, nKeyCode, nFlags); + } +} +bool CFFL_CheckBox::OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) { + switch (nChar) { + case FWL_VKEY_Return: + case FWL_VKEY_Space: { + CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); + ASSERT(pPageView); + + bool bReset = false; + bool bExit = false; + CPDFSDK_Annot::ObservedPtr pObserved(m_pWidget); + m_pFormFillEnv->GetInteractiveFormFiller()->OnButtonUp( + &pObserved, pPageView, bReset, bExit, nFlags); + if (!pObserved) { + m_pWidget = nullptr; + return true; + } + if (bReset || bExit) + return true; + + CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); + if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, true)) + pWnd->SetCheck(!pWnd->IsChecked()); + + CommitData(pPageView, nFlags); + return true; + } + default: + return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); + } +} + +bool CFFL_CheckBox::OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + CFFL_Button::OnLButtonUp(pPageView, pAnnot, nFlags, point); + + if (IsValid()) { + if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, true)) { + CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; + pWnd->SetCheck(!pWidget->IsChecked()); + } + + if (!CommitData(pPageView, nFlags)) + return false; + } + + return true; +} + +bool CFFL_CheckBox::IsDataChanged(CPDFSDK_PageView* pPageView) { + CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, false); + return pWnd && pWnd->IsChecked() != m_pWidget->IsChecked(); +} + +void CFFL_CheckBox::SaveData(CPDFSDK_PageView* pPageView) { + if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, false)) { + bool bNewChecked = pWnd->IsChecked(); + + if (bNewChecked) { + CPDF_FormField* pField = m_pWidget->GetFormField(); + for (int32_t i = 0, sz = pField->CountControls(); i < sz; i++) { + if (CPDF_FormControl* pCtrl = pField->GetControl(i)) { + if (pCtrl->IsChecked()) { + break; + } + } + } + } + + m_pWidget->SetCheck(bNewChecked, false); + m_pWidget->UpdateField(); + SetChangeMark(); + } +} diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_checkbox.h b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_checkbox.h new file mode 100644 index 000000000000..79ddc847cc8f --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_checkbox.h @@ -0,0 +1,32 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FORMFILLER_CFFL_CHECKBOX_H_ +#define FPDFSDK_FORMFILLER_CFFL_CHECKBOX_H_ + +#include "fpdfsdk/formfiller/cffl_formfiller.h" + +class CFFL_CheckBox : public CFFL_Button { + public: + CFFL_CheckBox(CPDFSDK_FormFillEnvironment* pApp, CPDFSDK_Widget* pWidget); + ~CFFL_CheckBox() override; + + // CFFL_Button + CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, + CPDFSDK_PageView* pPageView) override; + bool OnKeyDown(CPDFSDK_Annot* pAnnot, + uint32_t nKeyCode, + uint32_t nFlags) override; + bool OnChar(CPDFSDK_Annot* pAnnot, uint32_t nChar, uint32_t nFlags) override; + bool OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool IsDataChanged(CPDFSDK_PageView* pPageView) override; + void SaveData(CPDFSDK_PageView* pPageView) override; +}; + +#endif // FPDFSDK_FORMFILLER_CFFL_CHECKBOX_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_combobox.cpp b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_combobox.cpp new file mode 100644 index 000000000000..c8438a3a282f --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_combobox.cpp @@ -0,0 +1,299 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/formfiller/cffl_combobox.h" + +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/formfiller/cba_fontmap.h" +#include "fpdfsdk/formfiller/cffl_formfiller.h" +#include "fpdfsdk/formfiller/cffl_interactiveformfiller.h" +#include "fpdfsdk/fsdk_common.h" +#include "fpdfsdk/pdfwindow/PWL_ComboBox.h" + +CFFL_ComboBox::CFFL_ComboBox(CPDFSDK_FormFillEnvironment* pApp, + CPDFSDK_Annot* pAnnot) + : CFFL_FormFiller(pApp, pAnnot), m_pFontMap(nullptr) { + m_State.nIndex = 0; + m_State.nStart = 0; + m_State.nEnd = 0; +} + +CFFL_ComboBox::~CFFL_ComboBox() { + for (const auto& it : m_Maps) + it.second->InvalidateFocusHandler(this); + + // See comment in cffl_formfiller.h. + // The font map should be stored somewhere more appropriate so it will live + // until the PWL_Edit is done with it. pdfium:566 + DestroyWindows(); + delete m_pFontMap; +} + +PWL_CREATEPARAM CFFL_ComboBox::GetCreateParam() { + PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam(); + + int nFlags = m_pWidget->GetFieldFlags(); + if (nFlags & FIELDFLAG_EDIT) { + cp.dwFlags |= PCBS_ALLOWCUSTOMTEXT; + } + + if (!m_pFontMap) + m_pFontMap = new CBA_FontMap(m_pWidget, GetSystemHandler()); + cp.pFontMap = m_pFontMap; + cp.pFocusHandler = this; + + return cp; +} + +CPWL_Wnd* CFFL_ComboBox::NewPDFWindow(const PWL_CREATEPARAM& cp, + CPDFSDK_PageView* pPageView) { + CPWL_ComboBox* pWnd = new CPWL_ComboBox(); + pWnd->AttachFFLData(this); + pWnd->Create(cp); + + CFFL_InteractiveFormFiller* pFormFiller = + m_pFormFillEnv->GetInteractiveFormFiller(); + pWnd->SetFillerNotify(pFormFiller); + + int32_t nCurSel = m_pWidget->GetSelectedIndex(0); + CFX_WideString swText; + if (nCurSel < 0) + swText = m_pWidget->GetValue(); + else + swText = m_pWidget->GetOptionLabel(nCurSel); + + for (int32_t i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) { + pWnd->AddString(m_pWidget->GetOptionLabel(i)); + } + + pWnd->SetSelect(nCurSel); + pWnd->SetText(swText); + return pWnd; +} + +bool CFFL_ComboBox::OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) { + return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); +} + +bool CFFL_ComboBox::IsDataChanged(CPDFSDK_PageView* pPageView) { + CPWL_ComboBox* pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, false); + if (!pWnd) + return false; + + int32_t nCurSel = pWnd->GetSelect(); + if (!(m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)) + return nCurSel != m_pWidget->GetSelectedIndex(0); + + if (nCurSel >= 0) + return nCurSel != m_pWidget->GetSelectedIndex(0); + + return pWnd->GetText() != m_pWidget->GetValue(); +} + +void CFFL_ComboBox::SaveData(CPDFSDK_PageView* pPageView) { + CPWL_ComboBox* pWnd = + static_cast(GetPDFWindow(pPageView, false)); + if (!pWnd) + return; + + CFX_WideString swText = pWnd->GetText(); + int32_t nCurSel = pWnd->GetSelect(); + + bool bSetValue = false; + + if (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT) + bSetValue = (nCurSel < 0) || (swText != m_pWidget->GetOptionLabel(nCurSel)); + + if (bSetValue) { + m_pWidget->SetValue(swText, false); + } else { + m_pWidget->GetSelectedIndex(0); + m_pWidget->SetOptionSelection(nCurSel, true, false); + } + + m_pWidget->ResetFieldAppearance(true); + m_pWidget->UpdateField(); + SetChangeMark(); + + m_pWidget->GetPDFPage(); +} + +void CFFL_ComboBox::GetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + PDFSDK_FieldAction& fa) { + switch (type) { + case CPDF_AAction::KeyStroke: + if (CPWL_ComboBox* pComboBox = + static_cast(GetPDFWindow(pPageView, false))) { + if (CPWL_Edit* pEdit = pComboBox->GetEdit()) { + fa.bFieldFull = pEdit->IsTextFull(); + int nSelStart = 0; + int nSelEnd = 0; + pEdit->GetSel(nSelStart, nSelEnd); + fa.nSelEnd = nSelEnd; + fa.nSelStart = nSelStart; + fa.sValue = pEdit->GetText(); + fa.sChangeEx = GetSelectExportText(); + + if (fa.bFieldFull) { + fa.sChange = L""; + fa.sChangeEx = L""; + } + } + } + break; + case CPDF_AAction::Validate: + if (CPWL_ComboBox* pComboBox = + static_cast(GetPDFWindow(pPageView, false))) { + if (CPWL_Edit* pEdit = pComboBox->GetEdit()) { + fa.sValue = pEdit->GetText(); + } + } + break; + case CPDF_AAction::LoseFocus: + case CPDF_AAction::GetFocus: + fa.sValue = m_pWidget->GetValue(); + break; + default: + break; + } +} + +void CFFL_ComboBox::SetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + const PDFSDK_FieldAction& fa) { + switch (type) { + case CPDF_AAction::KeyStroke: + if (CPWL_ComboBox* pComboBox = + static_cast(GetPDFWindow(pPageView, false))) { + if (CPWL_Edit* pEdit = pComboBox->GetEdit()) { + pEdit->SetSel(fa.nSelStart, fa.nSelEnd); + pEdit->ReplaceSel(fa.sChange); + } + } + break; + default: + break; + } +} + +bool CFFL_ComboBox::IsActionDataChanged(CPDF_AAction::AActionType type, + const PDFSDK_FieldAction& faOld, + const PDFSDK_FieldAction& faNew) { + switch (type) { + case CPDF_AAction::KeyStroke: + return (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || + faOld.nSelStart != faNew.nSelStart || + faOld.sChange != faNew.sChange; + default: + break; + } + + return false; +} + +void CFFL_ComboBox::SaveState(CPDFSDK_PageView* pPageView) { + ASSERT(pPageView); + + if (CPWL_ComboBox* pComboBox = + static_cast(GetPDFWindow(pPageView, false))) { + m_State.nIndex = pComboBox->GetSelect(); + + if (CPWL_Edit* pEdit = pComboBox->GetEdit()) { + pEdit->GetSel(m_State.nStart, m_State.nEnd); + m_State.sValue = pEdit->GetText(); + } + } +} + +void CFFL_ComboBox::RestoreState(CPDFSDK_PageView* pPageView) { + ASSERT(pPageView); + + if (CPWL_ComboBox* pComboBox = + static_cast(GetPDFWindow(pPageView, true))) { + if (m_State.nIndex >= 0) { + pComboBox->SetSelect(m_State.nIndex); + } else { + if (CPWL_Edit* pEdit = pComboBox->GetEdit()) { + pEdit->SetText(m_State.sValue); + pEdit->SetSel(m_State.nStart, m_State.nEnd); + } + } + } +} + +CPWL_Wnd* CFFL_ComboBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, + bool bRestoreValue) { + if (bRestoreValue) + SaveState(pPageView); + + DestroyPDFWindow(pPageView); + + CPWL_Wnd* pRet = nullptr; + + if (bRestoreValue) { + RestoreState(pPageView); + pRet = GetPDFWindow(pPageView, false); + } else { + pRet = GetPDFWindow(pPageView, true); + } + + m_pWidget->UpdateField(); + + return pRet; +} + +#ifdef PDF_ENABLE_XFA +bool CFFL_ComboBox::IsFieldFull(CPDFSDK_PageView* pPageView) { + if (CPWL_ComboBox* pComboBox = + static_cast(GetPDFWindow(pPageView, false))) { + if (CPWL_Edit* pEdit = pComboBox->GetEdit()) + return pEdit->IsTextFull(); + } + return false; +} +#endif // PDF_ENABLE_XFA + +void CFFL_ComboBox::OnSetFocus(CPWL_Wnd* pWnd) { + ASSERT(m_pFormFillEnv); + + if (pWnd->GetClassName() == PWL_CLASSNAME_EDIT) { + CPWL_Edit* pEdit = (CPWL_Edit*)pWnd; + pEdit->SetCharSet(FXFONT_GB2312_CHARSET); + pEdit->SetCodePage(936); + + pEdit->SetReadyToInput(); + CFX_WideString wsText = pEdit->GetText(); + int nCharacters = wsText.GetLength(); + CFX_ByteString bsUTFText = wsText.UTF16LE_Encode(); + unsigned short* pBuffer = (unsigned short*)bsUTFText.c_str(); + m_pFormFillEnv->OnSetFieldInputFocus(pBuffer, nCharacters, true); + } +} + +CFX_WideString CFFL_ComboBox::GetSelectExportText() { + CFX_WideString swRet; + + int nExport = -1; + CPDFSDK_PageView* pPageView = GetCurPageView(true); + if (CPWL_ComboBox* pComboBox = + (CPWL_ComboBox*)GetPDFWindow(pPageView, false)) { + nExport = pComboBox->GetSelect(); + } + + if (nExport >= 0) { + if (CPDF_FormField* pFormField = m_pWidget->GetFormField()) { + swRet = pFormField->GetOptionValue(nExport); + if (swRet.IsEmpty()) + swRet = pFormField->GetOptionLabel(nExport); + } + } + + return swRet; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_combobox.h b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_combobox.h new file mode 100644 index 000000000000..aab10b90e14d --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_combobox.h @@ -0,0 +1,63 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FORMFILLER_CFFL_COMBOBOX_H_ +#define FPDFSDK_FORMFILLER_CFFL_COMBOBOX_H_ + +#include "core/fxcrt/fx_string.h" +#include "fpdfsdk/formfiller/cffl_formfiller.h" + +class CBA_FontMap; + +struct FFL_ComboBoxState { + int nIndex; + int nStart; + int nEnd; + CFX_WideString sValue; +}; + +class CFFL_ComboBox : public CFFL_FormFiller, public IPWL_FocusHandler { + public: + CFFL_ComboBox(CPDFSDK_FormFillEnvironment* pApp, CPDFSDK_Annot* pWidget); + ~CFFL_ComboBox() override; + + // CFFL_FormFiller: + PWL_CREATEPARAM GetCreateParam() override; + CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, + CPDFSDK_PageView* pPageView) override; + bool OnChar(CPDFSDK_Annot* pAnnot, uint32_t nChar, uint32_t nFlags) override; + bool IsDataChanged(CPDFSDK_PageView* pPageView) override; + void SaveData(CPDFSDK_PageView* pPageView) override; + void GetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + PDFSDK_FieldAction& fa) override; + void SetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + const PDFSDK_FieldAction& fa) override; + bool IsActionDataChanged(CPDF_AAction::AActionType type, + const PDFSDK_FieldAction& faOld, + const PDFSDK_FieldAction& faNew) override; + void SaveState(CPDFSDK_PageView* pPageView) override; + void RestoreState(CPDFSDK_PageView* pPageView) override; + CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView, + bool bRestoreValue) override; + + // IPWL_FocusHandler: + void OnSetFocus(CPWL_Wnd* pWnd) override; + +#ifdef PDF_ENABLE_XFA + // CFFL_FormFiller: + bool IsFieldFull(CPDFSDK_PageView* pPageView) override; +#endif // PDF_ENABLE_XFA + + private: + CFX_WideString GetSelectExportText(); + + CBA_FontMap* m_pFontMap; + FFL_ComboBoxState m_State; +}; + +#endif // FPDFSDK_FORMFILLER_CFFL_COMBOBOX_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_formfiller.cpp b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_formfiller.cpp new file mode 100644 index 000000000000..da6f9208e046 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_formfiller.cpp @@ -0,0 +1,687 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/formfiller/cffl_formfiller.h" + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fxge/cfx_renderdevice.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/formfiller/cba_fontmap.h" +#include "fpdfsdk/fsdk_common.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" + +#define GetRed(rgb) ((uint8_t)(rgb)) +#define GetGreen(rgb) ((uint8_t)(((uint16_t)(rgb)) >> 8)) +#define GetBlue(rgb) ((uint8_t)((rgb) >> 16)) + +#define FFL_HINT_ELAPSE 800 + +CFFL_FormFiller::CFFL_FormFiller(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDFSDK_Annot* pAnnot) + : m_pFormFillEnv(pFormFillEnv), m_pAnnot(pAnnot), m_bValid(false) { + m_pWidget = static_cast(pAnnot); +} + +CFFL_FormFiller::~CFFL_FormFiller() { + DestroyWindows(); +} + +void CFFL_FormFiller::DestroyWindows() { + for (const auto& it : m_Maps) { + CPWL_Wnd* pWnd = it.second; + CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData(); + pWnd->InvalidateProvider(this); + pWnd->Destroy(); + delete pWnd; + delete pData; + } + m_Maps.clear(); +} + +void CFFL_FormFiller::SetWindowRect(CPDFSDK_PageView* pPageView, + const CFX_FloatRect& rcWindow) { + if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false)) { + pWnd->Move(CFX_FloatRect(rcWindow), true, false); + } +} + +CFX_FloatRect CFFL_FormFiller::GetWindowRect(CPDFSDK_PageView* pPageView) { + if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false)) { + return pWnd->GetWindowRect(); + } + + return CFX_FloatRect(0, 0, 0, 0); +} + +FX_RECT CFFL_FormFiller::GetViewBBox(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) { + ASSERT(pPageView); + ASSERT(pAnnot); + + CFX_FloatRect rcAnnot = m_pWidget->GetRect(); + + if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false)) { + CFX_FloatRect rcWindow = pWnd->GetWindowRect(); + rcAnnot = PWLtoFFL(rcWindow); + } + + CFX_FloatRect rcWin = rcAnnot; + + CFX_FloatRect rcFocus = GetFocusBox(pPageView); + if (!rcFocus.IsEmpty()) + rcWin.Union(rcFocus); + + CFX_FloatRect rect = CPWL_Utils::InflateRect(rcWin, 1); + + return rect.GetOuterRect(); +} + +void CFFL_FormFiller::OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + ASSERT(pAnnot->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + + if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false)) { + CFX_Matrix mt = GetCurMatrix(); + mt.Concat(*pUser2Device); + pWnd->DrawAppearance(pDevice, &mt); + } else { + CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; + if (CFFL_InteractiveFormFiller::IsVisible(pWidget)) + pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, + nullptr); + } +} + +void CFFL_FormFiller::OnDrawDeactive(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; + pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, nullptr); +} + +void CFFL_FormFiller::OnMouseEnter(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) {} + +void CFFL_FormFiller::OnMouseExit(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) { + EndTimer(); + ASSERT(m_pWidget); +} + +bool CFFL_FormFiller::OnLButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, true)) { + m_bValid = true; + FX_RECT rect = GetViewBBox(pPageView, pAnnot); + InvalidateRect(rect); + if (!rect.Contains(static_cast(point.x), static_cast(point.y))) + return false; + + return pWnd->OnLButtonDown(WndtoPWL(pPageView, point), nFlags); + } + + return false; +} + +bool CFFL_FormFiller::OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false); + if (!pWnd) + return false; + + InvalidateRect(GetViewBBox(pPageView, pAnnot)); + pWnd->OnLButtonUp(WndtoPWL(pPageView, point), nFlags); + return true; +} + +bool CFFL_FormFiller::OnLButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false); + if (!pWnd) + return false; + + pWnd->OnLButtonDblClk(WndtoPWL(pPageView, point), nFlags); + return true; +} + +bool CFFL_FormFiller::OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (m_ptOldPos != point) + m_ptOldPos = point; + + CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false); + if (!pWnd) + return false; + + pWnd->OnMouseMove(WndtoPWL(pPageView, point), nFlags); + return true; +} + +bool CFFL_FormFiller::OnMouseWheel(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_PointF& point) { + if (!IsValid()) + return false; + + CPWL_Wnd* pWnd = GetPDFWindow(pPageView, true); + return pWnd && pWnd->OnMouseWheel(zDelta, WndtoPWL(pPageView, point), nFlags); +} + +bool CFFL_FormFiller::OnRButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + CPWL_Wnd* pWnd = GetPDFWindow(pPageView, true); + if (!pWnd) + return false; + + pWnd->OnRButtonDown(WndtoPWL(pPageView, point), nFlags); + return true; +} + +bool CFFL_FormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false); + if (!pWnd) + return false; + + pWnd->OnRButtonUp(WndtoPWL(pPageView, point), nFlags); + return true; +} + +bool CFFL_FormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, + uint32_t nKeyCode, + uint32_t nFlags) { + if (IsValid()) { + CPDFSDK_PageView* pPageView = GetCurPageView(true); + ASSERT(pPageView); + + if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false)) { + return pWnd->OnKeyDown(nKeyCode, nFlags); + } + } + + return false; +} + +bool CFFL_FormFiller::OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) { + if (IsValid()) { + CPDFSDK_PageView* pPageView = GetCurPageView(true); + ASSERT(pPageView); + + if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false)) { + return pWnd->OnChar(nChar, nFlags); + } + } + + return false; +} + +void CFFL_FormFiller::SetFocusForAnnot(CPDFSDK_Annot* pAnnot, uint32_t nFlag) { + CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; + UnderlyingPageType* pPage = pWidget->GetUnderlyingPage(); + CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetPageView(pPage, true); + if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, true)) + pWnd->SetFocus(); + + m_bValid = true; + InvalidateRect(GetViewBBox(pPageView, pAnnot)); +} + +void CFFL_FormFiller::KillFocusForAnnot(CPDFSDK_Annot* pAnnot, uint32_t nFlag) { + if (!IsValid()) + return; + + CPDFSDK_PageView* pPageView = GetCurPageView(false); + if (!pPageView) + return; + + CommitData(pPageView, nFlag); + + if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false)) + pWnd->KillFocus(); + + bool bDestroyPDFWindow; + switch (m_pWidget->GetFieldType()) { + case FIELDTYPE_PUSHBUTTON: + case FIELDTYPE_CHECKBOX: + case FIELDTYPE_RADIOBUTTON: + bDestroyPDFWindow = true; + break; + default: + bDestroyPDFWindow = false; + break; + } + EscapeFiller(pPageView, bDestroyPDFWindow); +} + +bool CFFL_FormFiller::IsValid() const { + return m_bValid; +} + +PWL_CREATEPARAM CFFL_FormFiller::GetCreateParam() { + ASSERT(m_pFormFillEnv); + + PWL_CREATEPARAM cp; + cp.pParentWnd = nullptr; + cp.pProvider.Reset(this); + cp.rcRectWnd = GetPDFWindowRect(); + + uint32_t dwCreateFlags = PWS_BORDER | PWS_BACKGROUND | PWS_VISIBLE; + uint32_t dwFieldFlag = m_pWidget->GetFieldFlags(); + if (dwFieldFlag & FIELDFLAG_READONLY) { + dwCreateFlags |= PWS_READONLY; + } + + FX_COLORREF color; + if (m_pWidget->GetFillColor(color)) { + cp.sBackgroundColor = + CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color)); + } + + if (m_pWidget->GetBorderColor(color)) { + cp.sBorderColor = + CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color)); + } + + cp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0); + + if (m_pWidget->GetTextColor(color)) { + cp.sTextColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color)); + } + + cp.fFontSize = m_pWidget->GetFontSize(); + cp.dwBorderWidth = m_pWidget->GetBorderWidth(); + + cp.nBorderStyle = m_pWidget->GetBorderStyle(); + switch (cp.nBorderStyle) { + case BorderStyle::DASH: + cp.sDash = CPWL_Dash(3, 3, 0); + break; + case BorderStyle::BEVELED: + cp.dwBorderWidth *= 2; + break; + case BorderStyle::INSET: + cp.dwBorderWidth *= 2; + break; + default: + break; + } + + if (cp.fFontSize <= 0) + dwCreateFlags |= PWS_AUTOFONTSIZE; + + cp.dwFlags = dwCreateFlags; + cp.pSystemHandler = m_pFormFillEnv->GetSysHandler(); + return cp; +} + +CPWL_Wnd* CFFL_FormFiller::GetPDFWindow(CPDFSDK_PageView* pPageView, + bool bNew) { + ASSERT(pPageView); + + auto it = m_Maps.find(pPageView); + const bool found = it != m_Maps.end(); + CPWL_Wnd* pWnd = found ? it->second : nullptr; + if (!bNew) + return pWnd; + + if (found) { + CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pWnd->GetAttachedData(); + if (pPrivateData->nWidgetAge != m_pWidget->GetAppearanceAge()) { + return ResetPDFWindow( + pPageView, m_pWidget->GetValueAge() == pPrivateData->nValueAge); + } + } else { + PWL_CREATEPARAM cp = GetCreateParam(); + cp.pAttachedWidget.Reset(m_pWidget); + + CFFL_PrivateData* pPrivateData = new CFFL_PrivateData; + pPrivateData->pWidget = m_pWidget; + pPrivateData->pPageView = pPageView; + pPrivateData->nWidgetAge = m_pWidget->GetAppearanceAge(); + pPrivateData->nValueAge = 0; + + cp.pAttachedData = pPrivateData; + + pWnd = NewPDFWindow(cp, pPageView); + m_Maps[pPageView] = pWnd; + } + + return pWnd; +} + +void CFFL_FormFiller::DestroyPDFWindow(CPDFSDK_PageView* pPageView) { + auto it = m_Maps.find(pPageView); + if (it == m_Maps.end()) + return; + + CPWL_Wnd* pWnd = it->second; + CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData(); + pWnd->Destroy(); + delete pWnd; + delete pData; + + m_Maps.erase(it); +} + +CFX_Matrix CFFL_FormFiller::GetWindowMatrix(void* pAttachedData) { + if (CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pAttachedData) { + if (pPrivateData->pPageView) { + CFX_Matrix mtPageView; + pPrivateData->pPageView->GetCurrentMatrix(mtPageView); + + CFX_Matrix mt = GetCurMatrix(); + mt.Concat(mtPageView); + + return mt; + } + } + return CFX_Matrix(1, 0, 0, 1, 0, 0); +} + +CFX_Matrix CFFL_FormFiller::GetCurMatrix() { + CFX_Matrix mt; + + CFX_FloatRect rcDA = m_pWidget->GetPDFAnnot()->GetRect(); + + switch (m_pWidget->GetRotate()) { + default: + case 0: + mt = CFX_Matrix(1, 0, 0, 1, 0, 0); + break; + case 90: + mt = CFX_Matrix(0, 1, -1, 0, rcDA.right - rcDA.left, 0); + break; + case 180: + mt = CFX_Matrix(-1, 0, 0, -1, rcDA.right - rcDA.left, + rcDA.top - rcDA.bottom); + break; + case 270: + mt = CFX_Matrix(0, -1, 1, 0, 0, rcDA.top - rcDA.bottom); + break; + } + mt.e += rcDA.left; + mt.f += rcDA.bottom; + + return mt; +} + +CFX_WideString CFFL_FormFiller::LoadPopupMenuString(int nIndex) { + ASSERT(m_pFormFillEnv); + + return L""; +} + +CFX_FloatRect CFFL_FormFiller::GetPDFWindowRect() const { + CFX_FloatRect rectAnnot = m_pWidget->GetPDFAnnot()->GetRect(); + + FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left; + FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom; + if ((m_pWidget->GetRotate() / 90) & 0x01) + return CFX_FloatRect(0, 0, fHeight, fWidth); + + return CFX_FloatRect(0, 0, fWidth, fHeight); +} + +CPDFSDK_PageView* CFFL_FormFiller::GetCurPageView(bool renew) { + UnderlyingPageType* pPage = m_pAnnot->GetUnderlyingPage(); + return m_pFormFillEnv ? m_pFormFillEnv->GetPageView(pPage, renew) : nullptr; +} + +CFX_FloatRect CFFL_FormFiller::GetFocusBox(CPDFSDK_PageView* pPageView) { + if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false)) { + CFX_FloatRect rcFocus = FFLtoWnd(pPageView, PWLtoFFL(pWnd->GetFocusRect())); + CFX_FloatRect rcPage = pPageView->GetPDFPage()->GetPageBBox(); + if (rcPage.Contains(rcFocus)) + return rcFocus; + } + return CFX_FloatRect(0, 0, 0, 0); +} + +CFX_FloatRect CFFL_FormFiller::FFLtoPWL(const CFX_FloatRect& rect) { + CFX_Matrix mt; + mt.SetReverse(GetCurMatrix()); + + CFX_FloatRect temp = rect; + mt.TransformRect(temp); + + return temp; +} + +CFX_FloatRect CFFL_FormFiller::PWLtoFFL(const CFX_FloatRect& rect) { + CFX_Matrix mt = GetCurMatrix(); + + CFX_FloatRect temp = rect; + mt.TransformRect(temp); + + return temp; +} + +CFX_PointF CFFL_FormFiller::FFLtoPWL(const CFX_PointF& point) { + CFX_Matrix mt; + mt.SetReverse(GetCurMatrix()); + return mt.Transform(point); +} + +CFX_PointF CFFL_FormFiller::PWLtoFFL(const CFX_PointF& point) { + return GetCurMatrix().Transform(point); +} + +CFX_PointF CFFL_FormFiller::WndtoPWL(CPDFSDK_PageView* pPageView, + const CFX_PointF& pt) { + return FFLtoPWL(pt); +} + +CFX_FloatRect CFFL_FormFiller::FFLtoWnd(CPDFSDK_PageView* pPageView, + const CFX_FloatRect& rect) { + return rect; +} + +bool CFFL_FormFiller::CommitData(CPDFSDK_PageView* pPageView, uint32_t nFlag) { + if (IsDataChanged(pPageView)) { + bool bRC = true; + bool bExit = false; + CFFL_InteractiveFormFiller* pFormFiller = + m_pFormFillEnv->GetInteractiveFormFiller(); + CPDFSDK_Annot::ObservedPtr pObserved(m_pWidget); + pFormFiller->OnKeyStrokeCommit(&pObserved, pPageView, bRC, bExit, nFlag); + if (!pObserved || bExit) + return true; + if (!bRC) { + ResetPDFWindow(pPageView, false); + return true; + } + pFormFiller->OnValidate(&pObserved, pPageView, bRC, bExit, nFlag); + if (!pObserved || bExit) + return true; + if (!bRC) { + ResetPDFWindow(pPageView, false); + return true; + } + SaveData(pPageView); + pFormFiller->OnCalculate(m_pWidget, pPageView, bExit, nFlag); + if (bExit) + return true; + + pFormFiller->OnFormat(m_pWidget, pPageView, bExit, nFlag); + } + return true; +} + +bool CFFL_FormFiller::IsDataChanged(CPDFSDK_PageView* pPageView) { + return false; +} + +void CFFL_FormFiller::SaveData(CPDFSDK_PageView* pPageView) {} + +#ifdef PDF_ENABLE_XFA +bool CFFL_FormFiller::IsFieldFull(CPDFSDK_PageView* pPageView) { + return false; +} +#endif // PDF_ENABLE_XFA + +void CFFL_FormFiller::SetChangeMark() { + m_pFormFillEnv->OnChange(); +} + +void CFFL_FormFiller::GetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + PDFSDK_FieldAction& fa) { + fa.sValue = m_pWidget->GetValue(); +} + +void CFFL_FormFiller::SetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + const PDFSDK_FieldAction& fa) {} + +bool CFFL_FormFiller::IsActionDataChanged(CPDF_AAction::AActionType type, + const PDFSDK_FieldAction& faOld, + const PDFSDK_FieldAction& faNew) { + return false; +} + +void CFFL_FormFiller::SaveState(CPDFSDK_PageView* pPageView) {} + +void CFFL_FormFiller::RestoreState(CPDFSDK_PageView* pPageView) {} + +CPWL_Wnd* CFFL_FormFiller::ResetPDFWindow(CPDFSDK_PageView* pPageView, + bool bRestoreValue) { + return GetPDFWindow(pPageView, false); +} + +void CFFL_FormFiller::TimerProc() {} + +CFX_SystemHandler* CFFL_FormFiller::GetSystemHandler() const { + return m_pFormFillEnv->GetSysHandler(); +} + +void CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView, + bool bDestroyPDFWindow) { + m_bValid = false; + + InvalidateRect(GetViewBBox(pPageView, m_pWidget)); + if (bDestroyPDFWindow) + DestroyPDFWindow(pPageView); +} + +void CFFL_FormFiller::InvalidateRect(const FX_RECT& rect) { + m_pFormFillEnv->Invalidate(m_pWidget->GetUnderlyingPage(), rect); +} + +CFFL_Button::CFFL_Button(CPDFSDK_FormFillEnvironment* pApp, + CPDFSDK_Annot* pWidget) + : CFFL_FormFiller(pApp, pWidget), m_bMouseIn(false), m_bMouseDown(false) {} + +CFFL_Button::~CFFL_Button() {} + +void CFFL_Button::OnMouseEnter(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) { + m_bMouseIn = true; + InvalidateRect(GetViewBBox(pPageView, pAnnot)); +} + +void CFFL_Button::OnMouseExit(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) { + m_bMouseIn = false; + + InvalidateRect(GetViewBBox(pPageView, pAnnot)); + EndTimer(); + ASSERT(m_pWidget); +} + +bool CFFL_Button::OnLButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!pAnnot->GetRect().Contains(point)) + return false; + + m_bMouseDown = true; + m_bValid = true; + InvalidateRect(GetViewBBox(pPageView, pAnnot)); + return true; +} + +bool CFFL_Button::OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + if (!pAnnot->GetRect().Contains(point)) + return false; + + m_bMouseDown = false; + m_pWidget->GetPDFPage(); + + InvalidateRect(GetViewBBox(pPageView, pAnnot)); + return true; +} + +bool CFFL_Button::OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + ASSERT(m_pFormFillEnv); + return true; +} + +void CFFL_Button::OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + ASSERT(pPageView); + CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; + CPDF_FormControl* pCtrl = pWidget->GetFormControl(); + CPDF_FormControl::HighlightingMode eHM = pCtrl->GetHighlightingMode(); + + if (eHM != CPDF_FormControl::Push) { + pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, nullptr); + return; + } + + if (m_bMouseDown) { + if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Down)) + pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Down, nullptr); + else + pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, + nullptr); + } else if (m_bMouseIn) { + if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Rollover)) + pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Rollover, + nullptr); + else + pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, + nullptr); + } else { + pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, nullptr); + } +} + +void CFFL_Button::OnDrawDeactive(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + OnDraw(pPageView, pAnnot, pDevice, pUser2Device); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_formfiller.h b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_formfiller.h new file mode 100644 index 000000000000..c6b1e59786df --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_formfiller.h @@ -0,0 +1,199 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FORMFILLER_CFFL_FORMFILLER_H_ +#define FPDFSDK_FORMFILLER_CFFL_FORMFILLER_H_ + +#include + +#include "fpdfsdk/formfiller/cba_fontmap.h" +#include "fpdfsdk/formfiller/cffl_interactiveformfiller.h" +#include "fpdfsdk/pdfsdk_fieldaction.h" + +class CPDFSDK_Annot; +class CPDFSDK_FormFillEnvironment; +class CPDFSDK_PageView; +class CPDFSDK_Widget; + +class CFFL_FormFiller : public IPWL_Provider, public CPWL_TimerHandler { + public: + CFFL_FormFiller(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDFSDK_Annot* pAnnot); + ~CFFL_FormFiller() override; + + virtual FX_RECT GetViewBBox(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot); + virtual void OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device); + virtual void OnDrawDeactive(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device); + + virtual void OnMouseEnter(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot); + virtual void OnMouseExit(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot); + + virtual bool OnLButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + virtual bool OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + virtual bool OnLButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + virtual bool OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + virtual bool OnMouseWheel(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_PointF& point); + virtual bool OnRButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + virtual bool OnRButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + + virtual bool OnKeyDown(CPDFSDK_Annot* pAnnot, + uint32_t nKeyCode, + uint32_t nFlags); + virtual bool OnChar(CPDFSDK_Annot* pAnnot, uint32_t nChar, uint32_t nFlags); + + void SetFocusForAnnot(CPDFSDK_Annot* pAnnot, uint32_t nFlag); + void KillFocusForAnnot(CPDFSDK_Annot* pAnnot, uint32_t nFlag); + + // CPWL_TimerHandler + void TimerProc() override; + CFX_SystemHandler* GetSystemHandler() const override; + + // IPWL_Provider + CFX_Matrix GetWindowMatrix(void* pAttachedData) override; + CFX_WideString LoadPopupMenuString(int nIndex) override; + + virtual void GetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + PDFSDK_FieldAction& fa); + virtual void SetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + const PDFSDK_FieldAction& fa); + virtual bool IsActionDataChanged(CPDF_AAction::AActionType type, + const PDFSDK_FieldAction& faOld, + const PDFSDK_FieldAction& faNew); + + virtual void SaveState(CPDFSDK_PageView* pPageView); + virtual void RestoreState(CPDFSDK_PageView* pPageView); + + virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView, + bool bRestoreValue); + + CFX_Matrix GetCurMatrix(); + + CFX_FloatRect FFLtoPWL(const CFX_FloatRect& rect); + CFX_FloatRect PWLtoFFL(const CFX_FloatRect& rect); + CFX_PointF FFLtoPWL(const CFX_PointF& point); + CFX_PointF PWLtoFFL(const CFX_PointF& point); + + CFX_PointF WndtoPWL(CPDFSDK_PageView* pPageView, const CFX_PointF& pt); + CFX_FloatRect FFLtoWnd(CPDFSDK_PageView* pPageView, + const CFX_FloatRect& rect); + + void SetWindowRect(CPDFSDK_PageView* pPageView, + const CFX_FloatRect& rcWindow); + CFX_FloatRect GetWindowRect(CPDFSDK_PageView* pPageView); + + bool CommitData(CPDFSDK_PageView* pPageView, uint32_t nFlag); + virtual bool IsDataChanged(CPDFSDK_PageView* pPageView); + virtual void SaveData(CPDFSDK_PageView* pPageView); + +#ifdef PDF_ENABLE_XFA + virtual bool IsFieldFull(CPDFSDK_PageView* pPageView); +#endif // PDF_ENABLE_XFA + + CPWL_Wnd* GetPDFWindow(CPDFSDK_PageView* pPageView, bool bNew); + void DestroyPDFWindow(CPDFSDK_PageView* pPageView); + void EscapeFiller(CPDFSDK_PageView* pPageView, bool bDestroyPDFWindow); + + virtual PWL_CREATEPARAM GetCreateParam(); + virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, + CPDFSDK_PageView* pPageView) = 0; + virtual CFX_FloatRect GetFocusBox(CPDFSDK_PageView* pPageView); + + bool IsValid() const; + CFX_FloatRect GetPDFWindowRect() const; + + CPDFSDK_PageView* GetCurPageView(bool renew); + void SetChangeMark(); + + virtual void InvalidateRect(const FX_RECT& rect); + CPDFSDK_Annot* GetSDKAnnot() { return m_pAnnot; } + + protected: + using CFFL_PageView2PDFWindow = std::map; + + // If the inheriting widget has its own fontmap and a PWL_Edit widget that + // access that fontmap then you have to call DestroyWindows before destroying + // the font map in order to not get a use-after-free. + // + // The font map should be stored somewhere more appropriate so it will live + // until the PWL_Edit is done with it. pdfium:566 + void DestroyWindows(); + + CPDFSDK_FormFillEnvironment* m_pFormFillEnv; + CPDFSDK_Widget* m_pWidget; + CPDFSDK_Annot* m_pAnnot; + bool m_bValid; + CFFL_PageView2PDFWindow m_Maps; + CFX_PointF m_ptOldPos; +}; + +class CFFL_Button : public CFFL_FormFiller { + public: + CFFL_Button(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDFSDK_Annot* pWidget); + ~CFFL_Button() override; + + // CFFL_FormFiller + void OnMouseEnter(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) override; + void OnMouseExit(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot) override; + bool OnLButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + void OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) override; + void OnDrawDeactive(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) override; + + protected: + bool m_bMouseIn; + bool m_bMouseDown; +}; + +#endif // FPDFSDK_FORMFILLER_CFFL_FORMFILLER_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp new file mode 100644 index 000000000000..a830d529cbab --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp @@ -0,0 +1,968 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/formfiller/cffl_interactiveformfiller.h" + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/formfiller/cffl_checkbox.h" +#include "fpdfsdk/formfiller/cffl_combobox.h" +#include "fpdfsdk/formfiller/cffl_formfiller.h" +#include "fpdfsdk/formfiller/cffl_listbox.h" +#include "fpdfsdk/formfiller/cffl_pushbutton.h" +#include "fpdfsdk/formfiller/cffl_radiobutton.h" +#include "fpdfsdk/formfiller/cffl_textfield.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" + +#define FFL_MAXLISTBOXHEIGHT 140.0f + +CFFL_InteractiveFormFiller::CFFL_InteractiveFormFiller( + CPDFSDK_FormFillEnvironment* pFormFillEnv) + : m_pFormFillEnv(pFormFillEnv), m_bNotifying(false) {} + +CFFL_InteractiveFormFiller::~CFFL_InteractiveFormFiller() {} + +bool CFFL_InteractiveFormFiller::Annot_HitTest(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + const CFX_PointF& point) { + return pAnnot->GetRect().Contains(point); +} + +FX_RECT CFFL_InteractiveFormFiller::GetViewBBox(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) { + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, false)) + return pFormFiller->GetViewBBox(pPageView, pAnnot); + + ASSERT(pPageView); + + CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); + CFX_FloatRect rcWin = CPWL_Utils::InflateRect(pPDFAnnot->GetRect(), 1); + return rcWin.GetOuterRect(); +} + +void CFFL_InteractiveFormFiller::OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + ASSERT(pPageView); + CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; + + if (!IsVisible(pWidget)) + return; + + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, false)) { + if (pFormFiller->IsValid()) { + pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device); + pAnnot->GetPDFPage(); + + if (m_pFormFillEnv->GetFocusAnnot() == pAnnot) { + CFX_FloatRect rcFocus = pFormFiller->GetFocusBox(pPageView); + if (!rcFocus.IsEmpty()) { + CFX_PathData path; + path.AppendPoint(CFX_PointF(rcFocus.left, rcFocus.top), + FXPT_TYPE::MoveTo, false); + path.AppendPoint(CFX_PointF(rcFocus.left, rcFocus.bottom), + FXPT_TYPE::LineTo, false); + path.AppendPoint(CFX_PointF(rcFocus.right, rcFocus.bottom), + FXPT_TYPE::LineTo, false); + path.AppendPoint(CFX_PointF(rcFocus.right, rcFocus.top), + FXPT_TYPE::LineTo, false); + path.AppendPoint(CFX_PointF(rcFocus.left, rcFocus.top), + FXPT_TYPE::LineTo, false); + + CFX_GraphStateData gsd; + gsd.SetDashCount(1); + gsd.m_DashArray[0] = 1.0f; + gsd.m_DashPhase = 0; + gsd.m_LineWidth = 1.0f; + pDevice->DrawPath(&path, pUser2Device, &gsd, 0, + ArgbEncode(255, 0, 0, 0), FXFILL_ALTERNATE); + } + } + return; + } + } + + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, false)) { + pFormFiller->OnDrawDeactive(pPageView, pAnnot, pDevice, pUser2Device); + } else { + pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, nullptr); + } + + if (!IsReadOnly(pWidget) && IsFillingAllowed(pWidget)) + pWidget->DrawShadow(pDevice, pPageView); +} + +void CFFL_InteractiveFormFiller::OnDelete(CPDFSDK_Annot* pAnnot) { + UnRegisterFormFiller(pAnnot); +} + +void CFFL_InteractiveFormFiller::OnMouseEnter( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + ASSERT((*pAnnot)->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + if (!m_bNotifying) { + CPDFSDK_Widget* pWidget = static_cast(pAnnot->Get()); + if (pWidget->GetAAction(CPDF_AAction::CursorEnter).GetDict()) { + m_bNotifying = true; + + int nValueAge = pWidget->GetValueAge(); + pWidget->ClearAppModified(); + ASSERT(pPageView); + + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(nFlag); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(nFlag); + pWidget->OnAAction(CPDF_AAction::CursorEnter, fa, pPageView); + m_bNotifying = false; + if (!(*pAnnot)) + return; + + if (pWidget->IsAppModified()) { + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, false)) { + pFormFiller->ResetPDFWindow(pPageView, + pWidget->GetValueAge() == nValueAge); + } + } + } + } + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot->Get(), true)) + pFormFiller->OnMouseEnter(pPageView, pAnnot->Get()); +} + +void CFFL_InteractiveFormFiller::OnMouseExit(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + ASSERT((*pAnnot)->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + if (!m_bNotifying) { + CPDFSDK_Widget* pWidget = static_cast(pAnnot->Get()); + if (pWidget->GetAAction(CPDF_AAction::CursorExit).GetDict()) { + m_bNotifying = true; + pWidget->GetAppearanceAge(); + + int nValueAge = pWidget->GetValueAge(); + pWidget->ClearAppModified(); + ASSERT(pPageView); + + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(nFlag); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(nFlag); + pWidget->OnAAction(CPDF_AAction::CursorExit, fa, pPageView); + m_bNotifying = false; + if (!(*pAnnot)) + return; + + if (pWidget->IsAppModified()) { + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, false)) { + pFormFiller->ResetPDFWindow(pPageView, + nValueAge == pWidget->GetValueAge()); + } + } + } + } + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot->Get(), false)) + pFormFiller->OnMouseExit(pPageView, pAnnot->Get()); +} + +bool CFFL_InteractiveFormFiller::OnLButtonDown( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + ASSERT((*pAnnot)->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + if (!m_bNotifying) { + CPDFSDK_Widget* pWidget = static_cast(pAnnot->Get()); + if (Annot_HitTest(pPageView, pAnnot->Get(), point) && + pWidget->GetAAction(CPDF_AAction::ButtonDown).GetDict()) { + m_bNotifying = true; + pWidget->GetAppearanceAge(); + + int nValueAge = pWidget->GetValueAge(); + pWidget->ClearAppModified(); + ASSERT(pPageView); + + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(nFlags); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(nFlags); + pWidget->OnAAction(CPDF_AAction::ButtonDown, fa, pPageView); + m_bNotifying = false; + if (!(*pAnnot)) + return true; + + if (!IsValidAnnot(pPageView, pAnnot->Get())) + return true; + + if (pWidget->IsAppModified()) { + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, false)) { + pFormFiller->ResetPDFWindow(pPageView, + nValueAge == pWidget->GetValueAge()); + } + } + } + } + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot->Get(), false)) + return pFormFiller->OnLButtonDown(pPageView, pAnnot->Get(), nFlags, point); + + return false; +} + +bool CFFL_InteractiveFormFiller::OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + ASSERT((*pAnnot)->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + CPDFSDK_Widget* pWidget = static_cast(pAnnot->Get()); + + switch (pWidget->GetFieldType()) { + case FIELDTYPE_PUSHBUTTON: + case FIELDTYPE_CHECKBOX: + case FIELDTYPE_RADIOBUTTON: + if (GetViewBBox(pPageView, pAnnot->Get()) + .Contains((int)point.x, (int)point.y)) + m_pFormFillEnv->SetFocusAnnot(pAnnot); + break; + default: + m_pFormFillEnv->SetFocusAnnot(pAnnot); + break; + } + + bool bRet = false; + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot->Get(), false)) + bRet = pFormFiller->OnLButtonUp(pPageView, pAnnot->Get(), nFlags, point); + + if (m_pFormFillEnv->GetFocusAnnot() == pAnnot->Get()) { + bool bExit = false; + bool bReset = false; + OnButtonUp(pAnnot, pPageView, bReset, bExit, nFlags); + if (!pAnnot || bExit) + return true; +#ifdef PDF_ENABLE_XFA + OnClick(pWidget, pPageView, bReset, bExit, nFlags); + if (!pAnnot || bExit) + return true; +#endif // PDF_ENABLE_XFA + } + return bRet; +} + +void CFFL_InteractiveFormFiller::OnButtonUp(CPDFSDK_Annot::ObservedPtr* pAnnot, + CPDFSDK_PageView* pPageView, + bool& bReset, + bool& bExit, + uint32_t nFlag) { + if (!m_bNotifying) { + CPDFSDK_Widget* pWidget = static_cast(pAnnot->Get()); + if (pWidget->GetAAction(CPDF_AAction::ButtonUp).GetDict()) { + m_bNotifying = true; + + int nAge = pWidget->GetAppearanceAge(); + int nValueAge = pWidget->GetValueAge(); + ASSERT(pPageView); + + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(nFlag); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(nFlag); + pWidget->OnAAction(CPDF_AAction::ButtonUp, fa, pPageView); + m_bNotifying = false; + if (!(*pAnnot) || !IsValidAnnot(pPageView, pWidget)) { + bExit = true; + return; + } + if (nAge != pWidget->GetAppearanceAge()) { + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, false)) { + pFormFiller->ResetPDFWindow(pPageView, + nValueAge == pWidget->GetValueAge()); + } + bReset = true; + } + } + } +} + +bool CFFL_InteractiveFormFiller::OnLButtonDblClk( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + ASSERT((*pAnnot)->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot->Get(), false); + return pFormFiller && + pFormFiller->OnLButtonDblClk(pPageView, pAnnot->Get(), nFlags, point); +} + +bool CFFL_InteractiveFormFiller::OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + ASSERT((*pAnnot)->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot->Get(), true); + return pFormFiller && + pFormFiller->OnMouseMove(pPageView, pAnnot->Get(), nFlags, point); +} + +bool CFFL_InteractiveFormFiller::OnMouseWheel( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_PointF& point) { + ASSERT((*pAnnot)->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot->Get(), false); + return pFormFiller && + pFormFiller->OnMouseWheel(pPageView, pAnnot->Get(), nFlags, zDelta, + point); +} + +bool CFFL_InteractiveFormFiller::OnRButtonDown( + CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + ASSERT((*pAnnot)->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot->Get(), false); + return pFormFiller && + pFormFiller->OnRButtonDown(pPageView, pAnnot->Get(), nFlags, point); +} + +bool CFFL_InteractiveFormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + ASSERT((*pAnnot)->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot->Get(), false); + return pFormFiller && + pFormFiller->OnRButtonUp(pPageView, pAnnot->Get(), nFlags, point); +} + +bool CFFL_InteractiveFormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, + uint32_t nKeyCode, + uint32_t nFlags) { + ASSERT(pAnnot->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, false)) { + return pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlags); + } + + return false; +} + +bool CFFL_InteractiveFormFiller::OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) { + ASSERT(pAnnot->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + if (nChar == FWL_VKEY_Tab) + return true; + + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, false)) + return pFormFiller->OnChar(pAnnot, nChar, nFlags); + + return false; +} + +bool CFFL_InteractiveFormFiller::OnSetFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + if (!(*pAnnot)) + return false; + + ASSERT((*pAnnot)->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + if (!m_bNotifying) { + CPDFSDK_Widget* pWidget = static_cast(pAnnot->Get()); + if (pWidget->GetAAction(CPDF_AAction::GetFocus).GetDict()) { + m_bNotifying = true; + pWidget->GetAppearanceAge(); + + int nValueAge = pWidget->GetValueAge(); + pWidget->ClearAppModified(); + + CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, true); + if (!pFormFiller) + return false; + + CPDFSDK_PageView* pPageView = (*pAnnot)->GetPageView(); + ASSERT(pPageView); + + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(nFlag); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(nFlag); + pFormFiller->GetActionData(pPageView, CPDF_AAction::GetFocus, fa); + pWidget->OnAAction(CPDF_AAction::GetFocus, fa, pPageView); + m_bNotifying = false; + if (!(*pAnnot)) + return false; + + if (pWidget->IsAppModified()) { + if (CFFL_FormFiller* pFiller = GetFormFiller(pWidget, false)) { + pFiller->ResetPDFWindow(pPageView, + nValueAge == pWidget->GetValueAge()); + } + } + } + } + + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot->Get(), true)) + pFormFiller->SetFocusForAnnot(pAnnot->Get(), nFlag); + + return true; +} + +bool CFFL_InteractiveFormFiller::OnKillFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) { + if (!(*pAnnot)) + return false; + + ASSERT((*pAnnot)->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET); + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot->Get(), false)) { + pFormFiller->KillFocusForAnnot(pAnnot->Get(), nFlag); + if (!m_bNotifying) { + CPDFSDK_Widget* pWidget = static_cast(pAnnot->Get()); + if (pWidget->GetAAction(CPDF_AAction::LoseFocus).GetDict()) { + m_bNotifying = true; + pWidget->ClearAppModified(); + + CPDFSDK_PageView* pPageView = pWidget->GetPageView(); + ASSERT(pPageView); + + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(nFlag); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(nFlag); + pFormFiller->GetActionData(pPageView, CPDF_AAction::LoseFocus, fa); + pWidget->OnAAction(CPDF_AAction::LoseFocus, fa, pPageView); + m_bNotifying = false; + if (!(*pAnnot)) + return false; + } + } + } + return true; +} + +bool CFFL_InteractiveFormFiller::IsVisible(CPDFSDK_Widget* pWidget) { + return pWidget->IsVisible(); +} + +bool CFFL_InteractiveFormFiller::IsReadOnly(CPDFSDK_Widget* pWidget) { + int nFieldFlags = pWidget->GetFieldFlags(); + return (nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY; +} + +bool CFFL_InteractiveFormFiller::IsFillingAllowed(CPDFSDK_Widget* pWidget) { + if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON) + return true; + + CPDF_Page* pPage = pWidget->GetPDFPage(); + CPDF_Document* pDocument = pPage->m_pDocument; + uint32_t dwPermissions = pDocument->GetUserPermissions(); + return (dwPermissions & FPDFPERM_FILL_FORM) || + (dwPermissions & FPDFPERM_ANNOT_FORM) || + (dwPermissions & FPDFPERM_MODIFY); +} + +CFFL_FormFiller* CFFL_InteractiveFormFiller::GetFormFiller( + CPDFSDK_Annot* pAnnot, + bool bRegister) { + auto it = m_Maps.find(pAnnot); + if (it != m_Maps.end()) + return it->second.get(); + + if (!bRegister) + return nullptr; + + CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; + int nFieldType = pWidget->GetFieldType(); + CFFL_FormFiller* pFormFiller; + switch (nFieldType) { + case FIELDTYPE_PUSHBUTTON: + pFormFiller = new CFFL_PushButton(m_pFormFillEnv, pWidget); + break; + case FIELDTYPE_CHECKBOX: + pFormFiller = new CFFL_CheckBox(m_pFormFillEnv, pWidget); + break; + case FIELDTYPE_RADIOBUTTON: + pFormFiller = new CFFL_RadioButton(m_pFormFillEnv, pWidget); + break; + case FIELDTYPE_TEXTFIELD: + pFormFiller = new CFFL_TextField(m_pFormFillEnv, pWidget); + break; + case FIELDTYPE_LISTBOX: + pFormFiller = new CFFL_ListBox(m_pFormFillEnv, pWidget); + break; + case FIELDTYPE_COMBOBOX: + pFormFiller = new CFFL_ComboBox(m_pFormFillEnv, pWidget); + break; + case FIELDTYPE_UNKNOWN: + default: + pFormFiller = nullptr; + break; + } + + if (!pFormFiller) + return nullptr; + + m_Maps[pAnnot].reset(pFormFiller); + return pFormFiller; +} + +void CFFL_InteractiveFormFiller::RemoveFormFiller(CPDFSDK_Annot* pAnnot) { + if (pAnnot) + UnRegisterFormFiller(pAnnot); +} + +void CFFL_InteractiveFormFiller::UnRegisterFormFiller(CPDFSDK_Annot* pAnnot) { + auto it = m_Maps.find(pAnnot); + if (it == m_Maps.end()) + return; + + m_Maps.erase(it); +} + +void CFFL_InteractiveFormFiller::QueryWherePopup(void* pPrivateData, + FX_FLOAT fPopupMin, + FX_FLOAT fPopupMax, + int32_t& nRet, + FX_FLOAT& fPopupRet) { + CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData; + + CFX_FloatRect rcPageView(0, 0, 0, 0); + rcPageView.right = pData->pWidget->GetPDFPage()->GetPageWidth(); + rcPageView.bottom = pData->pWidget->GetPDFPage()->GetPageHeight(); + rcPageView.Normalize(); + + CFX_FloatRect rcAnnot = pData->pWidget->GetRect(); + + FX_FLOAT fTop = 0.0f; + FX_FLOAT fBottom = 0.0f; + + CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pData->pWidget; + switch (pWidget->GetRotate() / 90) { + default: + case 0: + fTop = rcPageView.top - rcAnnot.top; + fBottom = rcAnnot.bottom - rcPageView.bottom; + break; + case 1: + fTop = rcAnnot.left - rcPageView.left; + fBottom = rcPageView.right - rcAnnot.right; + break; + case 2: + fTop = rcAnnot.bottom - rcPageView.bottom; + fBottom = rcPageView.top - rcAnnot.top; + break; + case 3: + fTop = rcPageView.right - rcAnnot.right; + fBottom = rcAnnot.left - rcPageView.left; + break; + } + + FX_FLOAT fFactHeight = 0; + bool bBottom = true; + FX_FLOAT fMaxListBoxHeight = 0; + if (fPopupMax > FFL_MAXLISTBOXHEIGHT) { + if (fPopupMin > FFL_MAXLISTBOXHEIGHT) { + fMaxListBoxHeight = fPopupMin; + } else { + fMaxListBoxHeight = FFL_MAXLISTBOXHEIGHT; + } + } else { + fMaxListBoxHeight = fPopupMax; + } + + if (fBottom > fMaxListBoxHeight) { + fFactHeight = fMaxListBoxHeight; + bBottom = true; + } else { + if (fTop > fMaxListBoxHeight) { + fFactHeight = fMaxListBoxHeight; + bBottom = false; + } else { + if (fTop > fBottom) { + fFactHeight = fTop; + bBottom = false; + } else { + fFactHeight = fBottom; + bBottom = true; + } + } + } + + nRet = bBottom ? 0 : 1; + fPopupRet = fFactHeight; +} + +void CFFL_InteractiveFormFiller::OnKeyStrokeCommit( + CPDFSDK_Annot::ObservedPtr* pAnnot, + CPDFSDK_PageView* pPageView, + bool& bRC, + bool& bExit, + uint32_t nFlag) { + if (!m_bNotifying) { + CPDFSDK_Widget* pWidget = static_cast(pAnnot->Get()); + if (pWidget->GetAAction(CPDF_AAction::KeyStroke).GetDict()) { + ASSERT(pPageView); + m_bNotifying = true; + pWidget->ClearAppModified(); + + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(nFlag); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(nFlag); + fa.bWillCommit = true; + fa.bKeyDown = true; + fa.bRC = true; + + CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, false); + pFormFiller->GetActionData(pPageView, CPDF_AAction::KeyStroke, fa); + pFormFiller->SaveState(pPageView); + pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pPageView); + if (!(*pAnnot)) + return; + + bRC = fa.bRC; + m_bNotifying = false; + } + } +} + +void CFFL_InteractiveFormFiller::OnValidate(CPDFSDK_Annot::ObservedPtr* pAnnot, + CPDFSDK_PageView* pPageView, + bool& bRC, + bool& bExit, + uint32_t nFlag) { + if (!m_bNotifying) { + CPDFSDK_Widget* pWidget = static_cast(pAnnot->Get()); + if (pWidget->GetAAction(CPDF_AAction::Validate).GetDict()) { + ASSERT(pPageView); + m_bNotifying = true; + pWidget->ClearAppModified(); + + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(nFlag); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(nFlag); + fa.bKeyDown = true; + fa.bRC = true; + + CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, false); + pFormFiller->GetActionData(pPageView, CPDF_AAction::Validate, fa); + pFormFiller->SaveState(pPageView); + pWidget->OnAAction(CPDF_AAction::Validate, fa, pPageView); + if (!(*pAnnot)) + return; + + bRC = fa.bRC; + m_bNotifying = false; + } + } +} + +void CFFL_InteractiveFormFiller::OnCalculate(CPDFSDK_Widget* pWidget, + CPDFSDK_PageView* pPageView, + bool& bExit, + uint32_t nFlag) { + if (!m_bNotifying) { + ASSERT(pWidget); + CPDFSDK_InterForm* pInterForm = pPageView->GetFormFillEnv()->GetInterForm(); + pInterForm->OnCalculate(pWidget->GetFormField()); + m_bNotifying = false; + } +} + +void CFFL_InteractiveFormFiller::OnFormat(CPDFSDK_Widget* pWidget, + CPDFSDK_PageView* pPageView, + bool& bExit, + uint32_t nFlag) { + if (!m_bNotifying) { + ASSERT(pWidget); + CPDFSDK_InterForm* pInterForm = pPageView->GetFormFillEnv()->GetInterForm(); + + bool bFormatted = false; + CFX_WideString sValue = + pInterForm->OnFormat(pWidget->GetFormField(), bFormatted); + + if (bExit) + return; + + if (bFormatted) { + pInterForm->ResetFieldAppearance(pWidget->GetFormField(), &sValue, true); + pInterForm->UpdateField(pWidget->GetFormField()); + } + + m_bNotifying = false; + } +} + +#ifdef PDF_ENABLE_XFA +void CFFL_InteractiveFormFiller::OnClick(CPDFSDK_Widget* pWidget, + CPDFSDK_PageView* pPageView, + bool& bReset, + bool& bExit, + uint32_t nFlag) { + if (!m_bNotifying) { + if (pWidget->HasXFAAAction(PDFSDK_XFA_Click)) { + m_bNotifying = true; + int nAge = pWidget->GetAppearanceAge(); + int nValueAge = pWidget->GetValueAge(); + + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(nFlag); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(nFlag); + + pWidget->OnXFAAAction(PDFSDK_XFA_Click, fa, pPageView); + m_bNotifying = false; + + if (!IsValidAnnot(pPageView, pWidget)) { + bExit = true; + return; + } + + if (nAge != pWidget->GetAppearanceAge()) { + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, false)) { + pFormFiller->ResetPDFWindow(pPageView, + nValueAge == pWidget->GetValueAge()); + } + + bReset = true; + } + } + } +} + +void CFFL_InteractiveFormFiller::OnFull(CPDFSDK_Widget* pWidget, + CPDFSDK_PageView* pPageView, + bool& bReset, + bool& bExit, + uint32_t nFlag) { + if (!m_bNotifying) { + if (pWidget->HasXFAAAction(PDFSDK_XFA_Full)) { + m_bNotifying = true; + int nAge = pWidget->GetAppearanceAge(); + int nValueAge = pWidget->GetValueAge(); + + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(nFlag); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(nFlag); + + pWidget->OnXFAAAction(PDFSDK_XFA_Full, fa, pPageView); + m_bNotifying = false; + + if (!IsValidAnnot(pPageView, pWidget)) { + bExit = true; + return; + } + + if (nAge != pWidget->GetAppearanceAge()) { + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, false)) { + pFormFiller->ResetPDFWindow(pPageView, + nValueAge == pWidget->GetValueAge()); + } + + bReset = true; + } + } + } +} + +void CFFL_InteractiveFormFiller::OnPopupPreOpen(void* pPrivateData, + bool& bExit, + uint32_t nFlag) { + CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData; + ASSERT(pData); + ASSERT(pData->pWidget); + + bool bTempReset = false; + bool bTempExit = false; + OnPreOpen(pData->pWidget, pData->pPageView, bTempReset, bTempExit, nFlag); + if (bTempReset || bTempExit) + bExit = true; +} + +void CFFL_InteractiveFormFiller::OnPopupPostOpen(void* pPrivateData, + bool& bExit, + uint32_t nFlag) { + CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData; + ASSERT(pData); + ASSERT(pData->pWidget); + + bool bTempReset = false; + bool bTempExit = false; + OnPostOpen(pData->pWidget, pData->pPageView, bTempReset, bTempExit, nFlag); + if (bTempReset || bTempExit) + bExit = true; +} + +void CFFL_InteractiveFormFiller::OnPreOpen(CPDFSDK_Widget* pWidget, + CPDFSDK_PageView* pPageView, + bool& bReset, + bool& bExit, + uint32_t nFlag) { + if (!m_bNotifying) { + if (pWidget->HasXFAAAction(PDFSDK_XFA_PreOpen)) { + m_bNotifying = true; + int nAge = pWidget->GetAppearanceAge(); + int nValueAge = pWidget->GetValueAge(); + + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(nFlag); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(nFlag); + + pWidget->OnXFAAAction(PDFSDK_XFA_PreOpen, fa, pPageView); + m_bNotifying = false; + + if (!IsValidAnnot(pPageView, pWidget)) { + bExit = true; + return; + } + + if (nAge != pWidget->GetAppearanceAge()) { + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, false)) { + pFormFiller->ResetPDFWindow(pPageView, + nValueAge == pWidget->GetValueAge()); + } + + bReset = true; + } + } + } +} + +void CFFL_InteractiveFormFiller::OnPostOpen(CPDFSDK_Widget* pWidget, + CPDFSDK_PageView* pPageView, + bool& bReset, + bool& bExit, + uint32_t nFlag) { + if (!m_bNotifying) { + if (pWidget->HasXFAAAction(PDFSDK_XFA_PostOpen)) { + m_bNotifying = true; + int nAge = pWidget->GetAppearanceAge(); + int nValueAge = pWidget->GetValueAge(); + + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(nFlag); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(nFlag); + + pWidget->OnXFAAAction(PDFSDK_XFA_PostOpen, fa, pPageView); + m_bNotifying = false; + + if (!IsValidAnnot(pPageView, pWidget)) { + bExit = true; + return; + } + + if (nAge != pWidget->GetAppearanceAge()) { + if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, false)) { + pFormFiller->ResetPDFWindow(pPageView, + nValueAge == pWidget->GetValueAge()); + } + + bReset = true; + } + } + } +} +#endif // PDF_ENABLE_XFA + +bool CFFL_InteractiveFormFiller::IsValidAnnot(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) { + return pPageView && pPageView->IsValidAnnot(pAnnot->GetPDFAnnot()); +} + +void CFFL_InteractiveFormFiller::OnBeforeKeyStroke( + void* pPrivateData, + CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + int nSelStart, + int nSelEnd, + bool bKeyDown, + bool& bRC, + bool& bExit, + uint32_t nFlag) { + CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData; + ASSERT(pData->pWidget); + + CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, false); + +#ifdef PDF_ENABLE_XFA + if (pFormFiller->IsFieldFull(pData->pPageView)) { + bool bFullExit = false; + bool bFullReset = false; + OnFull(pData->pWidget, pData->pPageView, bFullReset, bFullExit, nFlag); + + if (bFullReset || bFullExit) { + bExit = true; + return; + } + } +#endif // PDF_ENABLE_XFA + + if (!m_bNotifying) { + if (pData->pWidget->GetAAction(CPDF_AAction::KeyStroke).GetDict()) { + m_bNotifying = true; + int nAge = pData->pWidget->GetAppearanceAge(); + int nValueAge = pData->pWidget->GetValueAge(); + + CPDFSDK_FormFillEnvironment* pFormFillEnv = + pData->pPageView->GetFormFillEnv(); + + PDFSDK_FieldAction fa; + fa.bModifier = m_pFormFillEnv->IsCTRLKeyDown(nFlag); + fa.bShift = m_pFormFillEnv->IsSHIFTKeyDown(nFlag); + fa.sChange = strChange; + fa.sChangeEx = strChangeEx; + fa.bKeyDown = bKeyDown; + fa.bWillCommit = false; + fa.bRC = true; + fa.nSelStart = nSelStart; + fa.nSelEnd = nSelEnd; + + pFormFiller->GetActionData(pData->pPageView, CPDF_AAction::KeyStroke, fa); + pFormFiller->SaveState(pData->pPageView); + + CPDFSDK_Annot::ObservedPtr pObserved(pData->pWidget); + if (pData->pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, + pData->pPageView)) { + if (!pObserved || !IsValidAnnot(pData->pPageView, pData->pWidget)) { + bExit = true; + m_bNotifying = false; + return; + } + + if (nAge != pData->pWidget->GetAppearanceAge()) { + CPWL_Wnd* pWnd = pFormFiller->ResetPDFWindow( + pData->pPageView, nValueAge == pData->pWidget->GetValueAge()); + pData = (CFFL_PrivateData*)pWnd->GetAttachedData(); + bExit = true; + } + + if (fa.bRC) { + pFormFiller->SetActionData(pData->pPageView, CPDF_AAction::KeyStroke, + fa); + bRC = false; + } else { + pFormFiller->RestoreState(pData->pPageView); + bRC = false; + } + + if (pFormFillEnv->GetFocusAnnot() != pData->pWidget) { + pFormFiller->CommitData(pData->pPageView, nFlag); + bExit = true; + } + } else { + if (!IsValidAnnot(pData->pPageView, pData->pWidget)) { + bExit = true; + m_bNotifying = false; + return; + } + } + + m_bNotifying = false; + } + } +} diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_interactiveformfiller.h b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_interactiveformfiller.h new file mode 100644 index 000000000000..90fd98c0e8c8 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_interactiveformfiller.h @@ -0,0 +1,177 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FORMFILLER_CFFL_INTERACTIVEFORMFILLER_H_ +#define FPDFSDK_FORMFILLER_CFFL_INTERACTIVEFORMFILLER_H_ + +#include +#include + +#include "fpdfsdk/cpdfsdk_annot.h" +#include "fpdfsdk/fsdk_define.h" +#include "fpdfsdk/pdfwindow/PWL_Edit.h" + +class CFFL_FormFiller; +class CPDFSDK_FormFillEnvironment; +class CPDFSDK_PageView; +class CPDFSDK_Widget; + +class CFFL_InteractiveFormFiller : public IPWL_Filler_Notify { + public: + explicit CFFL_InteractiveFormFiller( + CPDFSDK_FormFillEnvironment* pFormFillEnv); + ~CFFL_InteractiveFormFiller() override; + + bool Annot_HitTest(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + const CFX_PointF& point); + FX_RECT GetViewBBox(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot); + void OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device); + + void OnDelete(CPDFSDK_Annot* pAnnot); + + void OnMouseEnter(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag); + void OnMouseExit(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag); + bool OnLButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + bool OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + bool OnLButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + bool OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + bool OnMouseWheel(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_PointF& point); + bool OnRButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + bool OnRButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point); + + bool OnKeyDown(CPDFSDK_Annot* pAnnot, uint32_t nKeyCode, uint32_t nFlags); + bool OnChar(CPDFSDK_Annot* pAnnot, uint32_t nChar, uint32_t nFlags); + + bool OnSetFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, uint32_t nFlag); + bool OnKillFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, uint32_t nFlag); + + CFFL_FormFiller* GetFormFiller(CPDFSDK_Annot* pAnnot, bool bRegister); + void RemoveFormFiller(CPDFSDK_Annot* pAnnot); + + static bool IsVisible(CPDFSDK_Widget* pWidget); + static bool IsReadOnly(CPDFSDK_Widget* pWidget); + static bool IsFillingAllowed(CPDFSDK_Widget* pWidget); + static bool IsValidAnnot(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot); + + void OnKeyStrokeCommit(CPDFSDK_Annot::ObservedPtr* pWidget, + CPDFSDK_PageView* pPageView, + bool& bRC, + bool& bExit, + uint32_t nFlag); + void OnValidate(CPDFSDK_Annot::ObservedPtr* pWidget, + CPDFSDK_PageView* pPageView, + bool& bRC, + bool& bExit, + uint32_t nFlag); + + void OnCalculate(CPDFSDK_Widget* pWidget, + CPDFSDK_PageView* pPageView, + bool& bExit, + uint32_t nFlag); + void OnFormat(CPDFSDK_Widget* pWidget, + CPDFSDK_PageView* pPageView, + bool& bExit, + uint32_t nFlag); + void OnButtonUp(CPDFSDK_Annot::ObservedPtr* pWidget, + CPDFSDK_PageView* pPageView, + bool& bReset, + bool& bExit, + uint32_t nFlag); +#ifdef PDF_ENABLE_XFA + void OnClick(CPDFSDK_Widget* pWidget, + CPDFSDK_PageView* pPageView, + bool& bReset, + bool& bExit, + uint32_t nFlag); + void OnFull(CPDFSDK_Widget* pWidget, + CPDFSDK_PageView* pPageView, + bool& bReset, + bool& bExit, + uint32_t nFlag); + void OnPreOpen(CPDFSDK_Widget* pWidget, + CPDFSDK_PageView* pPageView, + bool& bReset, + bool& bExit, + uint32_t nFlag); + void OnPostOpen(CPDFSDK_Widget* pWidget, + CPDFSDK_PageView* pPageView, + bool& bReset, + bool& bExit, + uint32_t nFlag); +#endif // PDF_ENABLE_XFA + + private: + using CFFL_Widget2Filler = + std::map>; + + // IPWL_Filler_Notify: + void QueryWherePopup(void* pPrivateData, + FX_FLOAT fPopupMin, + FX_FLOAT fPopupMax, + int32_t& nRet, + FX_FLOAT& fPopupRet) override; + void OnBeforeKeyStroke(void* pPrivateData, + CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + int nSelStart, + int nSelEnd, + bool bKeyDown, + bool& bRC, + bool& bExit, + uint32_t nFlag) override; +#ifdef PDF_ENABLE_XFA + void OnPopupPreOpen(void* pPrivateData, bool& bExit, uint32_t nFlag) override; + void OnPopupPostOpen(void* pPrivateData, + bool& bExit, + uint32_t nFlag) override; + void SetFocusAnnotTab(CPDFSDK_Annot* pWidget, bool bSameField, bool bNext); +#endif // PDF_ENABLE_XFA + void UnRegisterFormFiller(CPDFSDK_Annot* pAnnot); + + CPDFSDK_FormFillEnvironment* const m_pFormFillEnv; + CFFL_Widget2Filler m_Maps; + bool m_bNotifying; +}; + +class CFFL_PrivateData { + public: + CPDFSDK_Widget* pWidget; + CPDFSDK_PageView* pPageView; + int nWidgetAge; + int nValueAge; +}; + +#endif // FPDFSDK_FORMFILLER_CFFL_INTERACTIVEFORMFILLER_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_listbox.cpp b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_listbox.cpp new file mode 100644 index 000000000000..556e0e17d71e --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_listbox.cpp @@ -0,0 +1,210 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/formfiller/cffl_listbox.h" + +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/formfiller/cba_fontmap.h" +#include "fpdfsdk/formfiller/cffl_formfiller.h" +#include "fpdfsdk/formfiller/cffl_interactiveformfiller.h" +#include "fpdfsdk/fsdk_common.h" +#include "fpdfsdk/pdfwindow/PWL_ListBox.h" +#include "third_party/base/ptr_util.h" + +#define FFL_DEFAULTLISTBOXFONTSIZE 12.0f + +CFFL_ListBox::CFFL_ListBox(CPDFSDK_FormFillEnvironment* pApp, + CPDFSDK_Annot* pWidget) + : CFFL_FormFiller(pApp, pWidget) {} + +CFFL_ListBox::~CFFL_ListBox() {} + +PWL_CREATEPARAM CFFL_ListBox::GetCreateParam() { + PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam(); + + uint32_t dwFieldFlag = m_pWidget->GetFieldFlags(); + + if (dwFieldFlag & FIELDFLAG_MULTISELECT) { + cp.dwFlags |= PLBS_MULTIPLESEL; + } + + cp.dwFlags |= PWS_VSCROLL; + + if (cp.dwFlags & PWS_AUTOFONTSIZE) + cp.fFontSize = FFL_DEFAULTLISTBOXFONTSIZE; + + if (!m_pFontMap) { + m_pFontMap = pdfium::MakeUnique( + m_pWidget, m_pFormFillEnv->GetSysHandler()); + } + cp.pFontMap = m_pFontMap.get(); + + return cp; +} + +CPWL_Wnd* CFFL_ListBox::NewPDFWindow(const PWL_CREATEPARAM& cp, + CPDFSDK_PageView* pPageView) { + CPWL_ListBox* pWnd = new CPWL_ListBox(); + pWnd->AttachFFLData(this); + pWnd->Create(cp); + pWnd->SetFillerNotify(m_pFormFillEnv->GetInteractiveFormFiller()); + + for (int32_t i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) + pWnd->AddString(m_pWidget->GetOptionLabel(i)); + + if (pWnd->HasFlag(PLBS_MULTIPLESEL)) { + m_OriginSelections.clear(); + + bool bSetCaret = false; + for (int32_t i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) { + if (m_pWidget->IsOptionSelected(i)) { + if (!bSetCaret) { + pWnd->SetCaret(i); + bSetCaret = true; + } + pWnd->Select(i); + m_OriginSelections.insert(i); + } + } + } else { + for (int i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) { + if (m_pWidget->IsOptionSelected(i)) { + pWnd->Select(i); + break; + } + } + } + + pWnd->SetTopVisibleIndex(m_pWidget->GetTopVisibleIndex()); + + return pWnd; +} + +bool CFFL_ListBox::OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) { + return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); +} + +bool CFFL_ListBox::IsDataChanged(CPDFSDK_PageView* pPageView) { + CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, false); + if (!pListBox) + return false; + + if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { + size_t nSelCount = 0; + for (int32_t i = 0, sz = pListBox->GetCount(); i < sz; ++i) { + if (pListBox->IsItemSelected(i)) { + if (m_OriginSelections.count(i) == 0) + return true; + + ++nSelCount; + } + } + + return nSelCount != m_OriginSelections.size(); + } + return pListBox->GetCurSel() != m_pWidget->GetSelectedIndex(0); +} + +void CFFL_ListBox::SaveData(CPDFSDK_PageView* pPageView) { + CPWL_ListBox* pListBox = + static_cast(GetPDFWindow(pPageView, false)); + if (!pListBox) + return; + + int32_t nNewTopIndex = pListBox->GetTopVisibleIndex(); + m_pWidget->ClearSelection(false); + if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { + for (int32_t i = 0, sz = pListBox->GetCount(); i < sz; i++) { + if (pListBox->IsItemSelected(i)) + m_pWidget->SetOptionSelection(i, true, false); + } + } else { + m_pWidget->SetOptionSelection(pListBox->GetCurSel(), true, false); + } + m_pWidget->SetTopVisibleIndex(nNewTopIndex); + m_pWidget->ResetFieldAppearance(true); + m_pWidget->UpdateField(); + SetChangeMark(); +} + +void CFFL_ListBox::GetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + PDFSDK_FieldAction& fa) { + switch (type) { + case CPDF_AAction::Validate: + if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { + fa.sValue = L""; + } else { + if (CPWL_ListBox* pListBox = + (CPWL_ListBox*)GetPDFWindow(pPageView, false)) { + int32_t nCurSel = pListBox->GetCurSel(); + if (nCurSel >= 0) + fa.sValue = m_pWidget->GetOptionLabel(nCurSel); + } + } + break; + case CPDF_AAction::LoseFocus: + case CPDF_AAction::GetFocus: + if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { + fa.sValue = L""; + } else { + int32_t nCurSel = m_pWidget->GetSelectedIndex(0); + if (nCurSel >= 0) + fa.sValue = m_pWidget->GetOptionLabel(nCurSel); + } + break; + default: + break; + } +} + +void CFFL_ListBox::SaveState(CPDFSDK_PageView* pPageView) { + ASSERT(pPageView); + + CPWL_ListBox* pListBox = + static_cast(GetPDFWindow(pPageView, false)); + if (!pListBox) + return; + + for (int32_t i = 0, sz = pListBox->GetCount(); i < sz; i++) { + if (pListBox->IsItemSelected(i)) + m_State.push_back(i); + } +} + +void CFFL_ListBox::RestoreState(CPDFSDK_PageView* pPageView) { + CPWL_ListBox* pListBox = + static_cast(GetPDFWindow(pPageView, false)); + if (!pListBox) + return; + + for (const auto& item : m_State) + pListBox->Select(item); +} + +CPWL_Wnd* CFFL_ListBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, + bool bRestoreValue) { + if (bRestoreValue) + SaveState(pPageView); + + DestroyPDFWindow(pPageView); + + CPWL_Wnd* pRet = nullptr; + + if (bRestoreValue) { + RestoreState(pPageView); + pRet = GetPDFWindow(pPageView, false); + } else { + pRet = GetPDFWindow(pPageView, true); + } + + m_pWidget->UpdateField(); + + return pRet; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_listbox.h b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_listbox.h new file mode 100644 index 000000000000..609f2c48096c --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_listbox.h @@ -0,0 +1,44 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FORMFILLER_CFFL_LISTBOX_H_ +#define FPDFSDK_FORMFILLER_CFFL_LISTBOX_H_ + +#include +#include +#include + +#include "fpdfsdk/formfiller/cffl_formfiller.h" + +class CBA_FontMap; + +class CFFL_ListBox : public CFFL_FormFiller { + public: + CFFL_ListBox(CPDFSDK_FormFillEnvironment* pApp, CPDFSDK_Annot* pWidget); + ~CFFL_ListBox() override; + + // CFFL_FormFiller + PWL_CREATEPARAM GetCreateParam() override; + CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, + CPDFSDK_PageView* pPageView) override; + bool OnChar(CPDFSDK_Annot* pAnnot, uint32_t nChar, uint32_t nFlags) override; + bool IsDataChanged(CPDFSDK_PageView* pPageView) override; + void SaveData(CPDFSDK_PageView* pPageView) override; + void GetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + PDFSDK_FieldAction& fa) override; + void SaveState(CPDFSDK_PageView* pPageView) override; + void RestoreState(CPDFSDK_PageView* pPageView) override; + CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView, + bool bRestoreValue) override; + + private: + std::unique_ptr m_pFontMap; + std::set m_OriginSelections; + std::vector m_State; +}; + +#endif // FPDFSDK_FORMFILLER_CFFL_LISTBOX_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_pushbutton.cpp b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_pushbutton.cpp new file mode 100644 index 000000000000..9b4121af9d10 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_pushbutton.cpp @@ -0,0 +1,37 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/formfiller/cffl_pushbutton.h" + +#include "fpdfsdk/formfiller/cffl_formfiller.h" +#include "fpdfsdk/pdfwindow/PWL_SpecialButton.h" + +CFFL_PushButton::CFFL_PushButton(CPDFSDK_FormFillEnvironment* pApp, + CPDFSDK_Annot* pAnnot) + : CFFL_Button(pApp, pAnnot) {} + +CFFL_PushButton::~CFFL_PushButton() {} + +CPWL_Wnd* CFFL_PushButton::NewPDFWindow(const PWL_CREATEPARAM& cp, + CPDFSDK_PageView* pPageView) { + CPWL_PushButton* pWnd = new CPWL_PushButton(); + pWnd->Create(cp); + + return pWnd; +} + +bool CFFL_PushButton::OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) { + return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); +} + +void CFFL_PushButton::OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + CFFL_Button::OnDraw(pPageView, pAnnot, pDevice, pUser2Device); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_pushbutton.h b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_pushbutton.h new file mode 100644 index 000000000000..1d50595c8757 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_pushbutton.h @@ -0,0 +1,27 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FORMFILLER_CFFL_PUSHBUTTON_H_ +#define FPDFSDK_FORMFILLER_CFFL_PUSHBUTTON_H_ + +#include "fpdfsdk/formfiller/cffl_formfiller.h" + +class CFFL_PushButton : public CFFL_Button { + public: + CFFL_PushButton(CPDFSDK_FormFillEnvironment* pApp, CPDFSDK_Annot* pAnnot); + ~CFFL_PushButton() override; + + // CFFL_Button + CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, + CPDFSDK_PageView* pPageView) override; + bool OnChar(CPDFSDK_Annot* pAnnot, uint32_t nChar, uint32_t nFlags) override; + void OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) override; +}; + +#endif // FPDFSDK_FORMFILLER_CFFL_PUSHBUTTON_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_radiobutton.cpp b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_radiobutton.cpp new file mode 100644 index 000000000000..e78160e5dcef --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_radiobutton.cpp @@ -0,0 +1,119 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/formfiller/cffl_radiobutton.h" + +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/formfiller/cffl_formfiller.h" +#include "fpdfsdk/pdfwindow/PWL_SpecialButton.h" +#include "public/fpdf_fwlevent.h" + +CFFL_RadioButton::CFFL_RadioButton(CPDFSDK_FormFillEnvironment* pApp, + CPDFSDK_Annot* pWidget) + : CFFL_Button(pApp, pWidget) {} + +CFFL_RadioButton::~CFFL_RadioButton() {} + +CPWL_Wnd* CFFL_RadioButton::NewPDFWindow(const PWL_CREATEPARAM& cp, + CPDFSDK_PageView* pPageView) { + CPWL_RadioButton* pWnd = new CPWL_RadioButton(); + pWnd->Create(cp); + + pWnd->SetCheck(m_pWidget->IsChecked()); + + return pWnd; +} + +bool CFFL_RadioButton::OnKeyDown(CPDFSDK_Annot* pAnnot, + uint32_t nKeyCode, + uint32_t nFlags) { + switch (nKeyCode) { + case FWL_VKEY_Return: + case FWL_VKEY_Space: + return true; + default: + return CFFL_FormFiller::OnKeyDown(pAnnot, nKeyCode, nFlags); + } +} + +bool CFFL_RadioButton::OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) { + switch (nChar) { + case FWL_VKEY_Return: + case FWL_VKEY_Space: { + CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); + ASSERT(pPageView); + + bool bReset = false; + bool bExit = false; + CPDFSDK_Annot::ObservedPtr pObserved(m_pWidget); + m_pFormFillEnv->GetInteractiveFormFiller()->OnButtonUp( + &pObserved, pPageView, bReset, bExit, nFlags); + if (!pObserved || bReset || bExit) + return true; + + CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); + if (CPWL_RadioButton* pWnd = + (CPWL_RadioButton*)GetPDFWindow(pPageView, true)) + pWnd->SetCheck(true); + CommitData(pPageView, nFlags); + return true; + } + default: + return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); + } +} + +bool CFFL_RadioButton::OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) { + CFFL_Button::OnLButtonUp(pPageView, pAnnot, nFlags, point); + + if (IsValid()) { + if (CPWL_RadioButton* pWnd = + (CPWL_RadioButton*)GetPDFWindow(pPageView, true)) + pWnd->SetCheck(true); + + if (!CommitData(pPageView, nFlags)) + return false; + } + + return true; +} + +bool CFFL_RadioButton::IsDataChanged(CPDFSDK_PageView* pPageView) { + if (CPWL_RadioButton* pWnd = + (CPWL_RadioButton*)GetPDFWindow(pPageView, false)) { + return pWnd->IsChecked() != m_pWidget->IsChecked(); + } + + return false; +} + +void CFFL_RadioButton::SaveData(CPDFSDK_PageView* pPageView) { + if (CPWL_RadioButton* pWnd = + (CPWL_RadioButton*)GetPDFWindow(pPageView, false)) { + bool bNewChecked = pWnd->IsChecked(); + + if (bNewChecked) { + CPDF_FormField* pField = m_pWidget->GetFormField(); + for (int32_t i = 0, sz = pField->CountControls(); i < sz; i++) { + if (CPDF_FormControl* pCtrl = pField->GetControl(i)) { + if (pCtrl->IsChecked()) { + break; + } + } + } + } + + m_pWidget->SetCheck(bNewChecked, false); + m_pWidget->UpdateField(); + SetChangeMark(); + } +} diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_radiobutton.h b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_radiobutton.h new file mode 100644 index 000000000000..10ac37dcb875 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_radiobutton.h @@ -0,0 +1,32 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FORMFILLER_CFFL_RADIOBUTTON_H_ +#define FPDFSDK_FORMFILLER_CFFL_RADIOBUTTON_H_ + +#include "fpdfsdk/formfiller/cffl_formfiller.h" + +class CFFL_RadioButton : public CFFL_Button { + public: + CFFL_RadioButton(CPDFSDK_FormFillEnvironment* pApp, CPDFSDK_Annot* pAnnot); + ~CFFL_RadioButton() override; + + // CFFL_Button + CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, + CPDFSDK_PageView* pPageView) override; + bool OnKeyDown(CPDFSDK_Annot* pAnnot, + uint32_t nKeyCode, + uint32_t nFlags) override; + bool OnChar(CPDFSDK_Annot* pAnnot, uint32_t nChar, uint32_t nFlags) override; + bool OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) override; + bool IsDataChanged(CPDFSDK_PageView* pPageView) override; + void SaveData(CPDFSDK_PageView* pPageView) override; +}; + +#endif // FPDFSDK_FORMFILLER_CFFL_RADIOBUTTON_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_textfield.cpp b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_textfield.cpp new file mode 100644 index 000000000000..91db0959dbec --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_textfield.cpp @@ -0,0 +1,286 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/formfiller/cffl_textfield.h" + +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/formfiller/cba_fontmap.h" +#include "fpdfsdk/fsdk_common.h" +#include "third_party/base/ptr_util.h" + +CFFL_TextField::CFFL_TextField(CPDFSDK_FormFillEnvironment* pApp, + CPDFSDK_Annot* pAnnot) + : CFFL_FormFiller(pApp, pAnnot) {} + +CFFL_TextField::~CFFL_TextField() { + for (const auto& it : m_Maps) + it.second->InvalidateFocusHandler(this); + + // See comment in cffl_formfiller.h. + // The font map should be stored somewhere more appropriate so it will live + // until the PWL_Edit is done with it. pdfium:566 + DestroyWindows(); +} + +PWL_CREATEPARAM CFFL_TextField::GetCreateParam() { + PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam(); + + int nFlags = m_pWidget->GetFieldFlags(); + + if (nFlags & FIELDFLAG_PASSWORD) { + cp.dwFlags |= PES_PASSWORD; + } + + if (nFlags & FIELDFLAG_MULTILINE) { + cp.dwFlags |= PES_MULTILINE | PES_AUTORETURN | PES_TOP; + + if (!(nFlags & FIELDFLAG_DONOTSCROLL)) { + cp.dwFlags |= PWS_VSCROLL | PES_AUTOSCROLL; + } + } else { + cp.dwFlags |= PES_CENTER; + + if (!(nFlags & FIELDFLAG_DONOTSCROLL)) { + cp.dwFlags |= PES_AUTOSCROLL; + } + } + + if (nFlags & FIELDFLAG_COMB) { + cp.dwFlags |= PES_CHARARRAY; + } + + if (nFlags & FIELDFLAG_RICHTEXT) { + cp.dwFlags |= PES_RICH; + } + + cp.dwFlags |= PES_UNDO; + + switch (m_pWidget->GetAlignment()) { + default: + case BF_ALIGN_LEFT: + cp.dwFlags |= PES_LEFT; + break; + case BF_ALIGN_MIDDLE: + cp.dwFlags |= PES_MIDDLE; + break; + case BF_ALIGN_RIGHT: + cp.dwFlags |= PES_RIGHT; + break; + } + + if (!m_pFontMap) { + m_pFontMap = pdfium::MakeUnique( + m_pWidget, m_pFormFillEnv->GetSysHandler()); + } + cp.pFontMap = m_pFontMap.get(); + cp.pFocusHandler = this; + + return cp; +} + +CPWL_Wnd* CFFL_TextField::NewPDFWindow(const PWL_CREATEPARAM& cp, + CPDFSDK_PageView* pPageView) { + CPWL_Edit* pWnd = new CPWL_Edit(); + pWnd->AttachFFLData(this); + pWnd->Create(cp); + pWnd->SetFillerNotify(m_pFormFillEnv->GetInteractiveFormFiller()); + + int32_t nMaxLen = m_pWidget->GetMaxLen(); + CFX_WideString swValue = m_pWidget->GetValue(); + + if (nMaxLen > 0) { + if (pWnd->HasFlag(PES_CHARARRAY)) { + pWnd->SetCharArray(nMaxLen); + pWnd->SetAlignFormatV(PEAV_CENTER); + } else { + pWnd->SetLimitChar(nMaxLen); + } + } + + pWnd->SetText(swValue); + return pWnd; +} + +bool CFFL_TextField::OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) { + switch (nChar) { + case FWL_VKEY_Return: + if (!(m_pWidget->GetFieldFlags() & FIELDFLAG_MULTILINE)) { + CPDFSDK_PageView* pPageView = GetCurPageView(true); + ASSERT(pPageView); + m_bValid = !m_bValid; + m_pFormFillEnv->Invalidate(pAnnot->GetUnderlyingPage(), + pAnnot->GetRect().ToFxRect()); + + if (m_bValid) { + if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, true)) + pWnd->SetFocus(); + } else { + if (CommitData(pPageView, nFlags)) { + DestroyPDFWindow(pPageView); + return true; + } + return false; + } + } + break; + case FWL_VKEY_Escape: { + CPDFSDK_PageView* pPageView = GetCurPageView(true); + ASSERT(pPageView); + EscapeFiller(pPageView, true); + return true; + } + } + + return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); +} + +bool CFFL_TextField::IsDataChanged(CPDFSDK_PageView* pPageView) { + if (CPWL_Edit* pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, false)) + return pEdit->GetText() != m_pWidget->GetValue(); + + return false; +} + +void CFFL_TextField::SaveData(CPDFSDK_PageView* pPageView) { + if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, false)) { + CFX_WideString sOldValue = m_pWidget->GetValue(); + CFX_WideString sNewValue = pWnd->GetText(); + + m_pWidget->SetValue(sNewValue, false); + m_pWidget->ResetFieldAppearance(true); + m_pWidget->UpdateField(); + SetChangeMark(); + } +} + +void CFFL_TextField::GetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + PDFSDK_FieldAction& fa) { + switch (type) { + case CPDF_AAction::KeyStroke: + if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, false)) { + fa.bFieldFull = pWnd->IsTextFull(); + + fa.sValue = pWnd->GetText(); + + if (fa.bFieldFull) { + fa.sChange = L""; + fa.sChangeEx = L""; + } + } + break; + case CPDF_AAction::Validate: + if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, false)) { + fa.sValue = pWnd->GetText(); + } + break; + case CPDF_AAction::LoseFocus: + case CPDF_AAction::GetFocus: + fa.sValue = m_pWidget->GetValue(); + break; + default: + break; + } +} + +void CFFL_TextField::SetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + const PDFSDK_FieldAction& fa) { + switch (type) { + case CPDF_AAction::KeyStroke: + if (CPWL_Edit* pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, false)) { + pEdit->SetFocus(); + pEdit->SetSel(fa.nSelStart, fa.nSelEnd); + pEdit->ReplaceSel(fa.sChange); + } + break; + default: + break; + } +} + +bool CFFL_TextField::IsActionDataChanged(CPDF_AAction::AActionType type, + const PDFSDK_FieldAction& faOld, + const PDFSDK_FieldAction& faNew) { + switch (type) { + case CPDF_AAction::KeyStroke: + return (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || + faOld.nSelStart != faNew.nSelStart || + faOld.sChange != faNew.sChange; + default: + break; + } + + return false; +} + +void CFFL_TextField::SaveState(CPDFSDK_PageView* pPageView) { + ASSERT(pPageView); + + if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, false)) { + pWnd->GetSel(m_State.nStart, m_State.nEnd); + m_State.sValue = pWnd->GetText(); + } +} + +void CFFL_TextField::RestoreState(CPDFSDK_PageView* pPageView) { + ASSERT(pPageView); + + if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, true)) { + pWnd->SetText(m_State.sValue); + pWnd->SetSel(m_State.nStart, m_State.nEnd); + } +} + +CPWL_Wnd* CFFL_TextField::ResetPDFWindow(CPDFSDK_PageView* pPageView, + bool bRestoreValue) { + if (bRestoreValue) + SaveState(pPageView); + + DestroyPDFWindow(pPageView); + + CPWL_Wnd* pRet = nullptr; + + if (bRestoreValue) { + RestoreState(pPageView); + pRet = GetPDFWindow(pPageView, false); + } else { + pRet = GetPDFWindow(pPageView, true); + } + + m_pWidget->UpdateField(); + + return pRet; +} + +#ifdef PDF_ENABLE_XFA +bool CFFL_TextField::IsFieldFull(CPDFSDK_PageView* pPageView) { + if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, false)) { + return pWnd->IsTextFull(); + } + + return false; +} +#endif // PDF_ENABLE_XFA + +void CFFL_TextField::OnSetFocus(CPWL_Wnd* pWnd) { + ASSERT(m_pFormFillEnv); + if (pWnd->GetClassName() == PWL_CLASSNAME_EDIT) { + CPWL_Edit* pEdit = (CPWL_Edit*)pWnd; + pEdit->SetCharSet(FXFONT_GB2312_CHARSET); + pEdit->SetCodePage(936); + + pEdit->SetReadyToInput(); + CFX_WideString wsText = pEdit->GetText(); + int nCharacters = wsText.GetLength(); + CFX_ByteString bsUTFText = wsText.UTF16LE_Encode(); + unsigned short* pBuffer = (unsigned short*)bsUTFText.c_str(); + m_pFormFillEnv->OnSetFieldInputFocus(pBuffer, nCharacters, true); + } +} diff --git a/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_textfield.h b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_textfield.h new file mode 100644 index 000000000000..29579f72a5f3 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/formfiller/cffl_textfield.h @@ -0,0 +1,67 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FORMFILLER_CFFL_TEXTFIELD_H_ +#define FPDFSDK_FORMFILLER_CFFL_TEXTFIELD_H_ + +#include + +#include "fpdfsdk/formfiller/cffl_formfiller.h" + +#define BF_ALIGN_LEFT 0 +#define BF_ALIGN_MIDDLE 1 +#define BF_ALIGN_RIGHT 2 + +class CBA_FontMap; + +struct FFL_TextFieldState { + FFL_TextFieldState() : nStart(0), nEnd(0) {} + + int nStart; + int nEnd; + CFX_WideString sValue; +}; + +class CFFL_TextField : public CFFL_FormFiller, public IPWL_FocusHandler { + public: + CFFL_TextField(CPDFSDK_FormFillEnvironment* pApp, CPDFSDK_Annot* pAnnot); + ~CFFL_TextField() override; + + // CFFL_FormFiller: + PWL_CREATEPARAM GetCreateParam() override; + CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, + CPDFSDK_PageView* pPageView) override; + bool OnChar(CPDFSDK_Annot* pAnnot, uint32_t nChar, uint32_t nFlags) override; + bool IsDataChanged(CPDFSDK_PageView* pPageView) override; + void SaveData(CPDFSDK_PageView* pPageView) override; + void GetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + PDFSDK_FieldAction& fa) override; + void SetActionData(CPDFSDK_PageView* pPageView, + CPDF_AAction::AActionType type, + const PDFSDK_FieldAction& fa) override; + bool IsActionDataChanged(CPDF_AAction::AActionType type, + const PDFSDK_FieldAction& faOld, + const PDFSDK_FieldAction& faNew) override; + void SaveState(CPDFSDK_PageView* pPageView) override; + void RestoreState(CPDFSDK_PageView* pPageView) override; + CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView, + bool bRestoreValue) override; + + // IPWL_FocusHandler: + void OnSetFocus(CPWL_Wnd* pWnd) override; + +#ifdef PDF_ENABLE_XFA + // CFFL_FormFiller: + bool IsFieldFull(CPDFSDK_PageView* pPageView) override; +#endif // PDF_ENABLE_XFA + + private: + std::unique_ptr m_pFontMap; + FFL_TextFieldState m_State; +}; + +#endif // FPDFSDK_FORMFILLER_CFFL_TEXTFIELD_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdf_dataavail.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdf_dataavail.cpp new file mode 100644 index 000000000000..b1bc1e3bc07a --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdf_dataavail.cpp @@ -0,0 +1,194 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_dataavail.h" + +#include +#include + +#include "core/fpdfapi/parser/cpdf_data_avail.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fxcrt/cfx_retain_ptr.h" +#include "fpdfsdk/fsdk_define.h" +#include "public/fpdf_formfill.h" +#include "third_party/base/ptr_util.h" + +// These checks are here because core/ and public/ cannot depend on each other. +static_assert(CPDF_DataAvail::DataError == PDF_DATA_ERROR, + "CPDF_DataAvail::DataError value mismatch"); +static_assert(CPDF_DataAvail::DataNotAvailable == PDF_DATA_NOTAVAIL, + "CPDF_DataAvail::DataNotAvailable value mismatch"); +static_assert(CPDF_DataAvail::DataAvailable == PDF_DATA_AVAIL, + "CPDF_DataAvail::DataAvailable value mismatch"); + +static_assert(CPDF_DataAvail::LinearizationUnknown == PDF_LINEARIZATION_UNKNOWN, + "CPDF_DataAvail::LinearizationUnknown value mismatch"); +static_assert(CPDF_DataAvail::NotLinearized == PDF_NOT_LINEARIZED, + "CPDF_DataAvail::NotLinearized value mismatch"); +static_assert(CPDF_DataAvail::Linearized == PDF_LINEARIZED, + "CPDF_DataAvail::Linearized value mismatch"); + +static_assert(CPDF_DataAvail::FormError == PDF_FORM_ERROR, + "CPDF_DataAvail::FormError value mismatch"); +static_assert(CPDF_DataAvail::FormNotAvailable == PDF_FORM_NOTAVAIL, + "CPDF_DataAvail::FormNotAvailable value mismatch"); +static_assert(CPDF_DataAvail::FormAvailable == PDF_FORM_AVAIL, + "CPDF_DataAvail::FormAvailable value mismatch"); +static_assert(CPDF_DataAvail::FormNotExist == PDF_FORM_NOTEXIST, + "CPDF_DataAvail::FormNotExist value mismatch"); + +namespace { + +class CFPDF_FileAvailWrap : public CPDF_DataAvail::FileAvail { + public: + CFPDF_FileAvailWrap() : m_pfileAvail(nullptr) {} + ~CFPDF_FileAvailWrap() override {} + + void Set(FX_FILEAVAIL* pfileAvail) { m_pfileAvail = pfileAvail; } + + // CPDF_DataAvail::FileAvail: + bool IsDataAvail(FX_FILESIZE offset, uint32_t size) override { + return !!m_pfileAvail->IsDataAvail(m_pfileAvail, offset, size); + } + + private: + FX_FILEAVAIL* m_pfileAvail; +}; + +class CFPDF_FileAccessWrap : public IFX_SeekableReadStream { + public: + static CFX_RetainPtr Create() { + return CFX_RetainPtr(new CFPDF_FileAccessWrap()); + } + ~CFPDF_FileAccessWrap() override {} + + void Set(FPDF_FILEACCESS* pFile) { m_pFileAccess = pFile; } + + // IFX_SeekableReadStream + FX_FILESIZE GetSize() override { return m_pFileAccess->m_FileLen; } + + bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override { + return !!m_pFileAccess->m_GetBlock(m_pFileAccess->m_Param, offset, + (uint8_t*)buffer, size); + } + + private: + CFPDF_FileAccessWrap() : m_pFileAccess(nullptr) {} + + FPDF_FILEACCESS* m_pFileAccess; +}; + +class CFPDF_DownloadHintsWrap : public CPDF_DataAvail::DownloadHints { + public: + explicit CFPDF_DownloadHintsWrap(FX_DOWNLOADHINTS* pDownloadHints) { + m_pDownloadHints = pDownloadHints; + } + ~CFPDF_DownloadHintsWrap() override {} + + public: + // IFX_DownloadHints + void AddSegment(FX_FILESIZE offset, uint32_t size) override { + m_pDownloadHints->AddSegment(m_pDownloadHints, offset, size); + } + + private: + FX_DOWNLOADHINTS* m_pDownloadHints; +}; + +class CFPDF_DataAvail { + public: + CFPDF_DataAvail() + : m_FileAvail(new CFPDF_FileAvailWrap), + m_FileRead(CFPDF_FileAccessWrap::Create()) {} + ~CFPDF_DataAvail() {} + + std::unique_ptr m_pDataAvail; + std::unique_ptr m_FileAvail; + CFX_RetainPtr m_FileRead; +}; + +CFPDF_DataAvail* CFPDFDataAvailFromFPDFAvail(FPDF_AVAIL avail) { + return static_cast(avail); +} + +} // namespace + +DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail, + FPDF_FILEACCESS* file) { + CFPDF_DataAvail* pAvail = new CFPDF_DataAvail; + pAvail->m_FileAvail->Set(file_avail); + pAvail->m_FileRead->Set(file); + pAvail->m_pDataAvail = pdfium::MakeUnique( + pAvail->m_FileAvail.get(), pAvail->m_FileRead, true); + return pAvail; +} + +DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail) { + delete (CFPDF_DataAvail*)avail; +} + +DLLEXPORT int STDCALL FPDFAvail_IsDocAvail(FPDF_AVAIL avail, + FX_DOWNLOADHINTS* hints) { + if (!avail || !hints) + return PDF_DATA_ERROR; + CFPDF_DownloadHintsWrap hints_wrap(hints); + return CFPDFDataAvailFromFPDFAvail(avail)->m_pDataAvail->IsDocAvail( + &hints_wrap); +} + +DLLEXPORT FPDF_DOCUMENT STDCALL +FPDFAvail_GetDocument(FPDF_AVAIL avail, FPDF_BYTESTRING password) { + CFPDF_DataAvail* pDataAvail = static_cast(avail); + if (!pDataAvail) + return nullptr; + + std::unique_ptr pParser(new CPDF_Parser); + pParser->SetPassword(password); + + std::unique_ptr pDocument( + new CPDF_Document(std::move(pParser))); + CPDF_Parser::Error error = pDocument->GetParser()->StartLinearizedParse( + pDataAvail->m_pDataAvail->GetFileRead(), pDocument.get()); + if (error != CPDF_Parser::SUCCESS) { + ProcessParseError(error); + return nullptr; + } + pDataAvail->m_pDataAvail->SetDocument(pDocument.get()); + CheckUnSupportError(pDocument.get(), FPDF_ERR_SUCCESS); + return FPDFDocumentFromCPDFDocument(pDocument.release()); +} + +DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(doc); + return pDoc ? pDoc->GetParser()->GetFirstPageNo() : 0; +} + +DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail, + int page_index, + FX_DOWNLOADHINTS* hints) { + if (!avail || !hints) + return PDF_DATA_ERROR; + if (page_index < 0) + return PDF_DATA_NOTAVAIL; + CFPDF_DownloadHintsWrap hints_wrap(hints); + return CFPDFDataAvailFromFPDFAvail(avail)->m_pDataAvail->IsPageAvail( + page_index, &hints_wrap); +} + +DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail, + FX_DOWNLOADHINTS* hints) { + if (!avail || !hints) + return PDF_FORM_ERROR; + CFPDF_DownloadHintsWrap hints_wrap(hints); + return CFPDFDataAvailFromFPDFAvail(avail)->m_pDataAvail->IsFormAvail( + &hints_wrap); +} + +DLLEXPORT int STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail) { + if (!avail) + return PDF_LINEARIZATION_UNKNOWN; + return CFPDFDataAvailFromFPDFAvail(avail)->m_pDataAvail->IsLinearizedPDF(); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdf_dataavail_embeddertest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdf_dataavail_embeddertest.cpp new file mode 100644 index 000000000000..c226a31b8e85 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdf_dataavail_embeddertest.cpp @@ -0,0 +1,240 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include +#include +#include +#include +#include + +#include "public/fpdfview.h" +#include "testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" +#include "testing/utils/path_service.h" + +namespace { +class TestAsyncLoader : public FX_DOWNLOADHINTS, FX_FILEAVAIL { + public: + explicit TestAsyncLoader(const std::string& file_name) { + std::string file_path; + if (!PathService::GetTestFilePath(file_name, &file_path)) + return; + file_contents_ = GetFileContents(file_path.c_str(), &file_length_); + if (!file_contents_) + return; + + file_access_.m_FileLen = static_cast(file_length_); + file_access_.m_GetBlock = SGetBlock; + file_access_.m_Param = this; + + FX_DOWNLOADHINTS::version = 1; + FX_DOWNLOADHINTS::AddSegment = SAddSegment; + + FX_FILEAVAIL::version = 1; + FX_FILEAVAIL::IsDataAvail = SIsDataAvail; + } + + bool IsOpened() const { return !!file_contents_; } + + FPDF_FILEACCESS* file_access() { return &file_access_; } + FX_DOWNLOADHINTS* hints() { return this; } + FX_FILEAVAIL* file_avail() { return this; } + + const std::vector>& requested_segments() const { + return requested_segments_; + } + + size_t max_requested_bound() const { return max_requested_bound_; } + + void ClearRequestedSegments() { + requested_segments_.clear(); + max_requested_bound_ = 0; + } + + bool is_new_data_available() const { return is_new_data_available_; } + void set_is_new_data_available(bool is_new_data_available) { + is_new_data_available_ = is_new_data_available; + } + + size_t max_already_available_bound() const { + return available_ranges_.empty() ? 0 : available_ranges_.rbegin()->second; + } + + private: + void SetDataAvailable(size_t start, size_t size) { + if (size == 0) + return; + const auto range = std::make_pair(start, start + size); + if (available_ranges_.empty()) { + available_ranges_.insert(range); + return; + } + auto start_it = available_ranges_.upper_bound(range); + if (start_it != available_ranges_.begin()) + --start_it; // start now points to the key equal or lower than offset. + if (start_it->second < range.first) + ++start_it; // start element is entirely before current range, skip it. + + auto end_it = available_ranges_.upper_bound( + std::make_pair(range.second, range.second)); + if (start_it == end_it) { // No ranges to merge. + available_ranges_.insert(range); + return; + } + + --end_it; + + size_t new_start = std::min(start_it->first, range.first); + size_t new_end = std::max(end_it->second, range.second); + + available_ranges_.erase(start_it, ++end_it); + available_ranges_.insert(std::make_pair(new_start, new_end)); + } + + bool CheckDataAlreadyAvailable(size_t start, size_t size) const { + if (size == 0) + return false; + const auto range = std::make_pair(start, start + size); + auto it = available_ranges_.upper_bound(range); + if (it == available_ranges_.begin()) + return false; // No ranges includes range.start(). + + --it; // Now it starts equal or before range.start(). + return it->second >= range.second; + } + + int GetBlockImpl(unsigned long pos, unsigned char* pBuf, unsigned long size) { + if (!IsDataAvailImpl(pos, size)) + return 0; + const unsigned long end = + std::min(static_cast(file_length_), pos + size); + if (end <= pos) + return 0; + memcpy(pBuf, file_contents_.get() + pos, end - pos); + SetDataAvailable(pos, end - pos); + return static_cast(end - pos); + } + + void AddSegmentImpl(size_t offset, size_t size) { + requested_segments_.push_back(std::make_pair(offset, size)); + max_requested_bound_ = std::max(max_requested_bound_, offset + size); + } + + bool IsDataAvailImpl(size_t offset, size_t size) { + if (offset + size > file_length_) + return false; + if (is_new_data_available_) { + SetDataAvailable(offset, size); + return true; + } + return CheckDataAlreadyAvailable(offset, size); + } + + static int SGetBlock(void* param, + unsigned long pos, + unsigned char* pBuf, + unsigned long size) { + return static_cast(param)->GetBlockImpl(pos, pBuf, size); + } + + static void SAddSegment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) { + return static_cast(pThis)->AddSegmentImpl(offset, size); + } + + static FPDF_BOOL SIsDataAvail(FX_FILEAVAIL* pThis, + size_t offset, + size_t size) { + return static_cast(pThis)->IsDataAvailImpl(offset, size); + } + + FPDF_FILEACCESS file_access_; + + std::unique_ptr file_contents_; + size_t file_length_; + std::vector> requested_segments_; + size_t max_requested_bound_ = 0; + bool is_new_data_available_ = true; + + using Range = std::pair; + struct range_compare { + bool operator()(const Range& lval, const Range& rval) const { + return lval.first < rval.first; + } + }; + using RangesContainer = std::set; + RangesContainer available_ranges_; +}; + +} // namespace + +class FPDFDataAvailEmbeddertest : public EmbedderTest {}; + +TEST_F(FPDFDataAvailEmbeddertest, TrailerUnterminated) { + // Document must load without crashing but is too malformed to be available. + EXPECT_FALSE(OpenDocument("trailer_unterminated.pdf")); + EXPECT_FALSE(FPDFAvail_IsDocAvail(avail_, &hints_)); +} + +TEST_F(FPDFDataAvailEmbeddertest, TrailerAsHexstring) { + // Document must load without crashing but is too malformed to be available. + EXPECT_FALSE(OpenDocument("trailer_as_hexstring.pdf")); + EXPECT_FALSE(FPDFAvail_IsDocAvail(avail_, &hints_)); +} + +TEST_F(FPDFDataAvailEmbeddertest, LoadUsingHintTables) { + TestAsyncLoader loader("feature_linearized_loading.pdf"); + avail_ = FPDFAvail_Create(loader.file_avail(), loader.file_access()); + ASSERT_EQ(PDF_DATA_AVAIL, FPDFAvail_IsDocAvail(avail_, loader.hints())); + document_ = FPDFAvail_GetDocument(avail_, nullptr); + ASSERT_TRUE(document_); + ASSERT_EQ(PDF_DATA_AVAIL, FPDFAvail_IsPageAvail(avail_, 1, loader.hints())); + + // No new data available, to prevent load "Pages" node. + loader.set_is_new_data_available(false); + FPDF_PAGE page = LoadPage(1); + EXPECT_TRUE(page); + UnloadPage(page); +} + +TEST_F(FPDFDataAvailEmbeddertest, + DoNotLoadMainCrossRefForFirstPageIfLinearized) { + TestAsyncLoader loader("feature_linearized_loading.pdf"); + avail_ = FPDFAvail_Create(loader.file_avail(), loader.file_access()); + ASSERT_EQ(PDF_DATA_AVAIL, FPDFAvail_IsDocAvail(avail_, loader.hints())); + document_ = FPDFAvail_GetDocument(avail_, nullptr); + ASSERT_TRUE(document_); + const int first_page_num = FPDFAvail_GetFirstPageNum(document_); + + // The main cross ref table should not be processed. + // (It is always at file end) + EXPECT_GT(loader.file_access()->m_FileLen, + loader.max_already_available_bound()); + + // Prevent access to non requested data to coerce the parser to send new + // request for non available (non requested before) data. + loader.set_is_new_data_available(false); + FPDFAvail_IsPageAvail(avail_, first_page_num, loader.hints()); + + // The main cross ref table should not be requested. + // (It is always at file end) + EXPECT_GT(loader.file_access()->m_FileLen, loader.max_requested_bound()); + + // Allow parse page. + loader.set_is_new_data_available(true); + ASSERT_EQ(PDF_DATA_AVAIL, + FPDFAvail_IsPageAvail(avail_, first_page_num, loader.hints())); + + // The main cross ref table should not be processed. + // (It is always at file end) + EXPECT_GT(loader.file_access()->m_FileLen, + loader.max_already_available_bound()); + + // Prevent loading data, while page loading. + loader.set_is_new_data_available(false); + FPDF_PAGE page = LoadPage(first_page_num); + EXPECT_TRUE(page); + UnloadPage(page); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdf_ext.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdf_ext.cpp new file mode 100644 index 000000000000..3bcb0c04b664 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdf_ext.cpp @@ -0,0 +1,200 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_ext.h" + +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfdoc/cpdf_annot.h" +#include "core/fpdfdoc/cpdf_interform.h" +#include "core/fpdfdoc/cpdf_metadata.h" +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_memory.h" +#include "core/fxcrt/fx_xml.h" +#include "fpdfsdk/fsdk_define.h" +#include "third_party/base/ptr_util.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#endif // PDF_ENABLE_XFA + +bool FPDF_UnSupportError(int nError) { + CFSDK_UnsupportInfo_Adapter* pAdapter = + CPDF_ModuleMgr::Get()->GetUnsupportInfoAdapter(); + if (!pAdapter) + return false; + + UNSUPPORT_INFO* info = static_cast(pAdapter->GetUnspInfo()); + if (info && info->FSDK_UnSupport_Handler) + info->FSDK_UnSupport_Handler(info, nError); + return true; +} + +DLLEXPORT FPDF_BOOL STDCALL +FSDK_SetUnSpObjProcessHandler(UNSUPPORT_INFO* unsp_info) { + if (!unsp_info || unsp_info->version != 1) + return false; + + CPDF_ModuleMgr::Get()->SetUnsupportInfoAdapter( + pdfium::MakeUnique(unsp_info)); + return true; +} + +void CheckUnSupportAnnot(CPDF_Document* pDoc, const CPDF_Annot* pPDFAnnot) { + CPDF_Annot::Subtype nAnnotSubtype = pPDFAnnot->GetSubtype(); + if (nAnnotSubtype == CPDF_Annot::Subtype::THREED) { + FPDF_UnSupportError(FPDF_UNSP_ANNOT_3DANNOT); + } else if (nAnnotSubtype == CPDF_Annot::Subtype::SCREEN) { + const CPDF_Dictionary* pAnnotDict = pPDFAnnot->GetAnnotDict(); + CFX_ByteString cbString; + if (pAnnotDict->KeyExist("IT")) + cbString = pAnnotDict->GetStringFor("IT"); + if (cbString.Compare("Img") != 0) + FPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_MEDIA); + } else if (nAnnotSubtype == CPDF_Annot::Subtype::MOVIE) { + FPDF_UnSupportError(FPDF_UNSP_ANNOT_MOVIE); + } else if (nAnnotSubtype == CPDF_Annot::Subtype::SOUND) { + FPDF_UnSupportError(FPDF_UNSP_ANNOT_SOUND); + } else if (nAnnotSubtype == CPDF_Annot::Subtype::RICHMEDIA) { + FPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA); + } else if (nAnnotSubtype == CPDF_Annot::Subtype::FILEATTACHMENT) { + FPDF_UnSupportError(FPDF_UNSP_ANNOT_ATTACHMENT); + } else if (nAnnotSubtype == CPDF_Annot::Subtype::WIDGET) { + const CPDF_Dictionary* pAnnotDict = pPDFAnnot->GetAnnotDict(); + CFX_ByteString cbString; + if (pAnnotDict->KeyExist("FT")) + cbString = pAnnotDict->GetStringFor("FT"); + if (cbString.Compare("Sig") == 0) + FPDF_UnSupportError(FPDF_UNSP_ANNOT_SIG); + } +} + +bool CheckSharedForm(const CXML_Element* pElement, CFX_ByteString cbName) { + int count = pElement->CountAttrs(); + int i = 0; + for (i = 0; i < count; i++) { + CFX_ByteString space, name; + CFX_WideString value; + pElement->GetAttrByIndex(i, space, name, value); + if (space == "xmlns" && name == "adhocwf" && + value == L"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/") { + CXML_Element* pVersion = + pElement->GetElement("adhocwf", cbName.AsStringC()); + if (!pVersion) + continue; + CFX_WideString wsContent = pVersion->GetContent(0); + int nType = wsContent.GetInteger(); + switch (nType) { + case 1: + FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_ACROBAT); + break; + case 2: + FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM); + break; + case 0: + FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_EMAIL); + break; + } + } + } + + uint32_t nCount = pElement->CountChildren(); + for (i = 0; i < (int)nCount; i++) { + CXML_Element::ChildType childType = pElement->GetChildType(i); + if (childType == CXML_Element::Element) { + CXML_Element* pChild = pElement->GetElement(i); + if (CheckSharedForm(pChild, cbName)) + return true; + } + } + return false; +} + +void CheckUnSupportError(CPDF_Document* pDoc, uint32_t err_code) { + // Security + if (err_code == FPDF_ERR_SECURITY) { + FPDF_UnSupportError(FPDF_UNSP_DOC_SECURITY); + return; + } + if (!pDoc) + return; + + // Portfolios and Packages + CPDF_Dictionary* pRootDict = pDoc->GetRoot(); + if (pRootDict) { + CFX_ByteString cbString; + if (pRootDict->KeyExist("Collection")) { + FPDF_UnSupportError(FPDF_UNSP_DOC_PORTABLECOLLECTION); + return; + } + if (pRootDict->KeyExist("Names")) { + CPDF_Dictionary* pNameDict = pRootDict->GetDictFor("Names"); + if (pNameDict && pNameDict->KeyExist("EmbeddedFiles")) { + FPDF_UnSupportError(FPDF_UNSP_DOC_ATTACHMENT); + return; + } + if (pNameDict && pNameDict->KeyExist("JavaScript")) { + CPDF_Dictionary* pJSDict = pNameDict->GetDictFor("JavaScript"); + CPDF_Array* pArray = pJSDict ? pJSDict->GetArrayFor("Names") : nullptr; + if (pArray) { + for (size_t i = 0; i < pArray->GetCount(); i++) { + CFX_ByteString cbStr = pArray->GetStringAt(i); + if (cbStr.Compare("com.adobe.acrobat.SharedReview.Register") == 0) { + FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDREVIEW); + return; + } + } + } + } + } + } + + // SharedForm + CPDF_Metadata metaData(pDoc); + const CXML_Element* pElement = metaData.GetRoot(); + if (pElement) + CheckSharedForm(pElement, "workflowType"); + +#ifndef PDF_ENABLE_XFA + // XFA Forms + CPDF_InterForm interform(pDoc); + if (interform.HasXFAForm()) + FPDF_UnSupportError(FPDF_UNSP_DOC_XFAFORM); +#endif // PDF_ENABLE_XFA +} + +DLLEXPORT int STDCALL FPDFDoc_GetPageMode(FPDF_DOCUMENT document) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return PAGEMODE_UNKNOWN; + + CPDF_Dictionary* pRoot = pDoc->GetRoot(); + if (!pRoot) + return PAGEMODE_UNKNOWN; + + CPDF_Object* pName = pRoot->GetObjectFor("PageMode"); + if (!pName) + return PAGEMODE_USENONE; + + CFX_ByteString strPageMode = pName->GetString(); + if (strPageMode.IsEmpty() || strPageMode.EqualNoCase("UseNone")) + return PAGEMODE_USENONE; + if (strPageMode.EqualNoCase("UseOutlines")) + return PAGEMODE_USEOUTLINES; + if (strPageMode.EqualNoCase("UseThumbs")) + return PAGEMODE_USETHUMBS; + if (strPageMode.EqualNoCase("FullScreen")) + return PAGEMODE_FULLSCREEN; + if (strPageMode.EqualNoCase("UseOC")) + return PAGEMODE_USEOC; + if (strPageMode.EqualNoCase("UseAttachments")) + return PAGEMODE_USEATTACHMENTS; + + return PAGEMODE_UNKNOWN; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdf_flatten.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdf_flatten.cpp new file mode 100644 index 000000000000..e649bacf4975 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdf_flatten.cpp @@ -0,0 +1,429 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_flatten.h" + +#include +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fpdfdoc/cpdf_annot.h" +#include "fpdfsdk/fsdk_define.h" +#include "third_party/base/stl_util.h" + +enum FPDF_TYPE { MAX, MIN }; +enum FPDF_VALUE { TOP, LEFT, RIGHT, BOTTOM }; + +namespace { + +bool IsValiableRect(CFX_FloatRect rect, CFX_FloatRect rcPage) { + if (rect.left - rect.right > 0.000001f || rect.bottom - rect.top > 0.000001f) + return false; + + if (rect.left == 0.0f && rect.top == 0.0f && rect.right == 0.0f && + rect.bottom == 0.0f) + return false; + + if (!rcPage.IsEmpty()) { + if (rect.left - rcPage.left < -10.000001f || + rect.right - rcPage.right > 10.000001f || + rect.top - rcPage.top > 10.000001f || + rect.bottom - rcPage.bottom < -10.000001f) + return false; + } + + return true; +} + +void GetContentsRect(CPDF_Document* pDoc, + CPDF_Dictionary* pDict, + std::vector* pRectArray) { + std::unique_ptr pPDFPage(new CPDF_Page(pDoc, pDict, false)); + pPDFPage->ParseContent(); + + for (const auto& pPageObject : *pPDFPage->GetPageObjectList()) { + CFX_FloatRect rc; + rc.left = pPageObject->m_Left; + rc.right = pPageObject->m_Right; + rc.bottom = pPageObject->m_Bottom; + rc.top = pPageObject->m_Top; + if (IsValiableRect(rc, pDict->GetRectFor("MediaBox"))) + pRectArray->push_back(rc); + } +} + +void ParserStream(CPDF_Dictionary* pPageDic, + CPDF_Dictionary* pStream, + std::vector* pRectArray, + std::vector* pObjectArray) { + if (!pStream) + return; + CFX_FloatRect rect; + if (pStream->KeyExist("Rect")) + rect = pStream->GetRectFor("Rect"); + else if (pStream->KeyExist("BBox")) + rect = pStream->GetRectFor("BBox"); + + if (IsValiableRect(rect, pPageDic->GetRectFor("MediaBox"))) + pRectArray->push_back(rect); + + pObjectArray->push_back(pStream); +} + +int ParserAnnots(CPDF_Document* pSourceDoc, + CPDF_Dictionary* pPageDic, + std::vector* pRectArray, + std::vector* pObjectArray, + int nUsage) { + if (!pSourceDoc || !pPageDic) + return FLATTEN_FAIL; + + GetContentsRect(pSourceDoc, pPageDic, pRectArray); + CPDF_Array* pAnnots = pPageDic->GetArrayFor("Annots"); + if (!pAnnots) + return FLATTEN_NOTHINGTODO; + + uint32_t dwSize = pAnnots->GetCount(); + for (int i = 0; i < (int)dwSize; i++) { + CPDF_Dictionary* pAnnotDic = ToDictionary(pAnnots->GetDirectObjectAt(i)); + if (!pAnnotDic) + continue; + + CFX_ByteString sSubtype = pAnnotDic->GetStringFor("Subtype"); + if (sSubtype == "Popup") + continue; + + int nAnnotFlag = pAnnotDic->GetIntegerFor("F"); + if (nAnnotFlag & ANNOTFLAG_HIDDEN) + continue; + + if (nUsage == FLAT_NORMALDISPLAY) { + if (nAnnotFlag & ANNOTFLAG_INVISIBLE) + continue; + + ParserStream(pPageDic, pAnnotDic, pRectArray, pObjectArray); + } else { + if (nAnnotFlag & ANNOTFLAG_PRINT) + ParserStream(pPageDic, pAnnotDic, pRectArray, pObjectArray); + } + } + return FLATTEN_SUCCESS; +} + +FX_FLOAT GetMinMaxValue(const std::vector& array, + FPDF_TYPE type, + FPDF_VALUE value) { + size_t nRects = array.size(); + if (nRects <= 0) + return 0.0f; + + std::vector pArray(nRects); + switch (value) { + case LEFT: + for (size_t i = 0; i < nRects; i++) + pArray[i] = array[i].left; + break; + case TOP: + for (size_t i = 0; i < nRects; i++) + pArray[i] = array[i].top; + break; + case RIGHT: + for (size_t i = 0; i < nRects; i++) + pArray[i] = array[i].right; + break; + case BOTTOM: + for (size_t i = 0; i < nRects; i++) + pArray[i] = array[i].bottom; + break; + default: + // Not reachable. + return 0.0f; + } + + FX_FLOAT fRet = pArray[0]; + if (type == MAX) { + for (size_t i = 1; i < nRects; i++) + fRet = std::max(fRet, pArray[i]); + } else { + for (size_t i = 1; i < nRects; i++) + fRet = std::min(fRet, pArray[i]); + } + return fRet; +} + +CFX_FloatRect CalculateRect(std::vector* pRectArray) { + CFX_FloatRect rcRet; + + rcRet.left = GetMinMaxValue(*pRectArray, MIN, LEFT); + rcRet.top = GetMinMaxValue(*pRectArray, MAX, TOP); + rcRet.right = GetMinMaxValue(*pRectArray, MAX, RIGHT); + rcRet.bottom = GetMinMaxValue(*pRectArray, MIN, BOTTOM); + + return rcRet; +} + +uint32_t NewIndirectContentsStream(const CFX_ByteString& key, + CPDF_Document* pDocument) { + CPDF_Stream* pNewContents = pDocument->NewIndirect( + nullptr, 0, + pdfium::MakeUnique(pDocument->GetByteStringPool())); + CFX_ByteString sStream; + sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", key.c_str()); + pNewContents->SetData(sStream.raw_str(), sStream.GetLength()); + return pNewContents->GetObjNum(); +} + +void SetPageContents(const CFX_ByteString& key, + CPDF_Dictionary* pPage, + CPDF_Document* pDocument) { + CPDF_Array* pContentsArray = nullptr; + CPDF_Stream* pContentsStream = pPage->GetStreamFor("Contents"); + if (!pContentsStream) { + pContentsArray = pPage->GetArrayFor("Contents"); + if (!pContentsArray) { + if (!key.IsEmpty()) { + pPage->SetNewFor( + "Contents", pDocument, NewIndirectContentsStream(key, pDocument)); + } + return; + } + } + pPage->ConvertToIndirectObjectFor("Contents", pDocument); + if (!pContentsArray) { + pContentsArray = pDocument->NewIndirect(); + CPDF_StreamAcc acc; + acc.LoadAllData(pContentsStream); + CFX_ByteString sStream = "q\n"; + CFX_ByteString sBody = + CFX_ByteString((const FX_CHAR*)acc.GetData(), acc.GetSize()); + sStream = sStream + sBody + "\nQ"; + pContentsStream->SetData(sStream.raw_str(), sStream.GetLength()); + pContentsArray->AddNew(pDocument, + pContentsStream->GetObjNum()); + pPage->SetNewFor("Contents", pDocument, + pContentsArray->GetObjNum()); + } + if (!key.IsEmpty()) { + pContentsArray->AddNew( + pDocument, NewIndirectContentsStream(key, pDocument)); + } +} + +CFX_Matrix GetMatrix(CFX_FloatRect rcAnnot, + CFX_FloatRect rcStream, + const CFX_Matrix& matrix) { + if (rcStream.IsEmpty()) + return CFX_Matrix(); + + matrix.TransformRect(rcStream); + rcStream.Normalize(); + + FX_FLOAT a = rcAnnot.Width() / rcStream.Width(); + FX_FLOAT d = rcAnnot.Height() / rcStream.Height(); + + FX_FLOAT e = rcAnnot.left - rcStream.left * a; + FX_FLOAT f = rcAnnot.bottom - rcStream.bottom * d; + return CFX_Matrix(a, 0, 0, d, e, f); +} + +} // namespace + +DLLEXPORT int STDCALL FPDFPage_Flatten(FPDF_PAGE page, int nFlag) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!page) + return FLATTEN_FAIL; + + CPDF_Document* pDocument = pPage->m_pDocument; + CPDF_Dictionary* pPageDict = pPage->m_pFormDict; + if (!pDocument || !pPageDict) + return FLATTEN_FAIL; + + std::vector ObjectArray; + std::vector RectArray; + int iRet = + ParserAnnots(pDocument, pPageDict, &RectArray, &ObjectArray, nFlag); + if (iRet == FLATTEN_NOTHINGTODO || iRet == FLATTEN_FAIL) + return iRet; + + CFX_FloatRect rcOriginalCB; + CFX_FloatRect rcMerger = CalculateRect(&RectArray); + CFX_FloatRect rcOriginalMB = pPageDict->GetRectFor("MediaBox"); + if (pPageDict->KeyExist("CropBox")) + rcOriginalMB = pPageDict->GetRectFor("CropBox"); + + if (rcOriginalMB.IsEmpty()) + rcOriginalMB = CFX_FloatRect(0.0f, 0.0f, 612.0f, 792.0f); + + rcMerger.left = std::max(rcMerger.left, rcOriginalMB.left); + rcMerger.right = std::min(rcMerger.right, rcOriginalMB.right); + rcMerger.bottom = std::max(rcMerger.bottom, rcOriginalMB.bottom); + rcMerger.top = std::min(rcMerger.top, rcOriginalMB.top); + if (pPageDict->KeyExist("ArtBox")) + rcOriginalCB = pPageDict->GetRectFor("ArtBox"); + else + rcOriginalCB = rcOriginalMB; + + if (!rcOriginalMB.IsEmpty()) { + CPDF_Array* pMediaBox = pPageDict->SetNewFor("MediaBox"); + pMediaBox->AddNew(rcOriginalMB.left); + pMediaBox->AddNew(rcOriginalMB.bottom); + pMediaBox->AddNew(rcOriginalMB.right); + pMediaBox->AddNew(rcOriginalMB.top); + } + + if (!rcOriginalCB.IsEmpty()) { + CPDF_Array* pCropBox = pPageDict->SetNewFor("ArtBox"); + pCropBox->AddNew(rcOriginalCB.left); + pCropBox->AddNew(rcOriginalCB.bottom); + pCropBox->AddNew(rcOriginalCB.right); + pCropBox->AddNew(rcOriginalCB.top); + } + + CPDF_Dictionary* pRes = pPageDict->GetDictFor("Resources"); + if (!pRes) + pRes = pPageDict->SetNewFor("Resources"); + + CPDF_Stream* pNewXObject = pDocument->NewIndirect( + nullptr, 0, + pdfium::MakeUnique(pDocument->GetByteStringPool())); + + uint32_t dwObjNum = pNewXObject->GetObjNum(); + CPDF_Dictionary* pPageXObject = pRes->GetDictFor("XObject"); + if (!pPageXObject) + pPageXObject = pRes->SetNewFor("XObject"); + + CFX_ByteString key = ""; + int nStreams = pdfium::CollectionSize(ObjectArray); + if (nStreams > 0) { + for (int iKey = 0; /*iKey < 100*/; iKey++) { + char sExtend[5] = {}; + FXSYS_itoa(iKey, sExtend, 10); + key = CFX_ByteString("FFT") + CFX_ByteString(sExtend); + if (!pPageXObject->KeyExist(key)) + break; + } + } + + SetPageContents(key, pPageDict, pDocument); + + CPDF_Dictionary* pNewXORes = nullptr; + if (!key.IsEmpty()) { + pPageXObject->SetNewFor(key, pDocument, dwObjNum); + CPDF_Dictionary* pNewOXbjectDic = pNewXObject->GetDict(); + pNewXORes = pNewOXbjectDic->SetNewFor("Resources"); + pNewOXbjectDic->SetNewFor("Type", "XObject"); + pNewOXbjectDic->SetNewFor("Subtype", "Form"); + pNewOXbjectDic->SetNewFor("FormType", 1); + pNewOXbjectDic->SetNewFor("Name", "FRM"); + CFX_FloatRect rcBBox = pPageDict->GetRectFor("ArtBox"); + pNewOXbjectDic->SetRectFor("BBox", rcBBox); + } + + for (int i = 0; i < nStreams; i++) { + CPDF_Dictionary* pAnnotDic = ObjectArray[i]; + if (!pAnnotDic) + continue; + + CFX_FloatRect rcAnnot = pAnnotDic->GetRectFor("Rect"); + rcAnnot.Normalize(); + + CFX_ByteString sAnnotState = pAnnotDic->GetStringFor("AS"); + CPDF_Dictionary* pAnnotAP = pAnnotDic->GetDictFor("AP"); + if (!pAnnotAP) + continue; + + CPDF_Stream* pAPStream = pAnnotAP->GetStreamFor("N"); + if (!pAPStream) { + CPDF_Dictionary* pAPDic = pAnnotAP->GetDictFor("N"); + if (!pAPDic) + continue; + + if (!sAnnotState.IsEmpty()) { + pAPStream = pAPDic->GetStreamFor(sAnnotState); + } else { + auto it = pAPDic->begin(); + if (it != pAPDic->end()) { + CPDF_Object* pFirstObj = it->second.get(); + if (pFirstObj) { + if (pFirstObj->IsReference()) + pFirstObj = pFirstObj->GetDirect(); + if (!pFirstObj->IsStream()) + continue; + pAPStream = pFirstObj->AsStream(); + } + } + } + } + if (!pAPStream) + continue; + + CPDF_Dictionary* pAPDic = pAPStream->GetDict(); + CFX_FloatRect rcStream; + if (pAPDic->KeyExist("Rect")) + rcStream = pAPDic->GetRectFor("Rect"); + else if (pAPDic->KeyExist("BBox")) + rcStream = pAPDic->GetRectFor("BBox"); + + if (rcStream.IsEmpty()) + continue; + + CPDF_Object* pObj = pAPStream; + if (pObj->IsInline()) { + std::unique_ptr pNew = pObj->Clone(); + pObj = pNew.get(); + pDocument->AddIndirectObject(std::move(pNew)); + } + + CPDF_Dictionary* pObjDic = pObj->GetDict(); + if (pObjDic) { + pObjDic->SetNewFor("Type", "XObject"); + pObjDic->SetNewFor("Subtype", "Form"); + } + + CPDF_Dictionary* pXObject = pNewXORes->GetDictFor("XObject"); + if (!pXObject) + pXObject = pNewXORes->SetNewFor("XObject"); + + CFX_ByteString sFormName; + sFormName.Format("F%d", i); + pXObject->SetNewFor(sFormName, pDocument, + pObj->GetObjNum()); + + CPDF_StreamAcc acc; + acc.LoadAllData(pNewXObject); + + const uint8_t* pData = acc.GetData(); + CFX_ByteString sStream(pData, acc.GetSize()); + CFX_Matrix matrix = pAPDic->GetMatrixFor("Matrix"); + if (matrix.IsIdentity()) { + matrix.a = 1.0f; + matrix.b = 0.0f; + matrix.c = 0.0f; + matrix.d = 1.0f; + matrix.e = 0.0f; + matrix.f = 0.0f; + } + + CFX_ByteString sTemp; + CFX_Matrix m = GetMatrix(rcAnnot, rcStream, matrix); + sTemp.Format("q %f 0 0 %f %f %f cm /%s Do Q\n", m.a, m.d, m.e, m.f, + sFormName.c_str()); + sStream += sTemp; + pNewXObject->SetData(sStream.raw_str(), sStream.GetLength()); + } + pPageDict->RemoveFor("Annots"); + return FLATTEN_SUCCESS; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdf_flatten_embeddertest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdf_flatten_embeddertest.cpp new file mode 100644 index 000000000000..d709f59053f7 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdf_flatten_embeddertest.cpp @@ -0,0 +1,40 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/fx_basic.h" +#include "public/fpdf_flatten.h" +#include "public/fpdfview.h" +#include "testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" + +namespace { + +class FPDFFlattenEmbeddertest : public EmbedderTest {}; + +} // namespace + +TEST_F(FPDFFlattenEmbeddertest, FlatNothing) { + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + EXPECT_EQ(FLATTEN_NOTHINGTODO, FPDFPage_Flatten(page, FLAT_NORMALDISPLAY)); + UnloadPage(page); +} + +TEST_F(FPDFFlattenEmbeddertest, FlatNormal) { + EXPECT_TRUE(OpenDocument("annotiter.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_NORMALDISPLAY)); + UnloadPage(page); +} + +TEST_F(FPDFFlattenEmbeddertest, FlatPrint) { + EXPECT_TRUE(OpenDocument("annotiter.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + EXPECT_EQ(FLATTEN_SUCCESS, FPDFPage_Flatten(page, FLAT_PRINT)); + UnloadPage(page); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdf_progressive.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdf_progressive.cpp new file mode 100644 index 000000000000..cc09d0763807 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdf_progressive.cpp @@ -0,0 +1,95 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_progressive.h" + +#include "core/fpdfapi/cpdf_pagerendercontext.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/render/cpdf_progressiverenderer.h" +#include "core/fxcrt/fx_memory.h" +#include "core/fxge/cfx_fxgedevice.h" +#include "core/fxge/cfx_renderdevice.h" +#include "fpdfsdk/fsdk_define.h" +#include "fpdfsdk/fsdk_pauseadapter.h" +#include "public/fpdfview.h" +#include "third_party/base/ptr_util.h" + +// These checks are here because core/ and public/ cannot depend on each other. +static_assert(CPDF_ProgressiveRenderer::Ready == FPDF_RENDER_READER, + "CPDF_ProgressiveRenderer::Ready value mismatch"); +static_assert(CPDF_ProgressiveRenderer::ToBeContinued == + FPDF_RENDER_TOBECOUNTINUED, + "CPDF_ProgressiveRenderer::ToBeContinued value mismatch"); +static_assert(CPDF_ProgressiveRenderer::Done == FPDF_RENDER_DONE, + "CPDF_ProgressiveRenderer::Done value mismatch"); +static_assert(CPDF_ProgressiveRenderer::Failed == FPDF_RENDER_FAILED, + "CPDF_ProgressiveRenderer::Failed value mismatch"); + +DLLEXPORT int STDCALL FPDF_RenderPageBitmap_Start(FPDF_BITMAP bitmap, + FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int flags, + IFSDK_PAUSE* pause) { + if (!bitmap || !pause || pause->version != 1) + return FPDF_RENDER_FAILED; + + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return FPDF_RENDER_FAILED; + + CPDF_PageRenderContext* pContext = new CPDF_PageRenderContext; + pPage->SetRenderContext(pdfium::WrapUnique(pContext)); + CFX_FxgeDevice* pDevice = new CFX_FxgeDevice; + pContext->m_pDevice.reset(pDevice); + CFX_DIBitmap* pBitmap = CFXBitmapFromFPDFBitmap(bitmap); + pDevice->Attach(pBitmap, !!(flags & FPDF_REVERSE_BYTE_ORDER), nullptr, false); + + IFSDK_PAUSE_Adapter IPauseAdapter(pause); + FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y, + rotate, flags, false, &IPauseAdapter); + + if (pContext->m_pRenderer) { + return CPDF_ProgressiveRenderer::ToFPDFStatus( + pContext->m_pRenderer->GetStatus()); + } + return FPDF_RENDER_FAILED; +} + +DLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page, + IFSDK_PAUSE* pause) { + if (!pause || pause->version != 1) + return FPDF_RENDER_FAILED; + + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return FPDF_RENDER_FAILED; + + CPDF_PageRenderContext* pContext = pPage->GetRenderContext(); + if (pContext && pContext->m_pRenderer) { + IFSDK_PAUSE_Adapter IPauseAdapter(pause); + pContext->m_pRenderer->Continue(&IPauseAdapter); + return CPDF_ProgressiveRenderer::ToFPDFStatus( + pContext->m_pRenderer->GetStatus()); + } + return FPDF_RENDER_FAILED; +} + +DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return; + + CPDF_PageRenderContext* pContext = pPage->GetRenderContext(); + if (!pContext) + return; + + pContext->m_pDevice->RestoreState(false); + pPage->SetRenderContext(nullptr); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdf_searchex.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdf_searchex.cpp new file mode 100644 index 000000000000..f82db37b5a8f --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdf_searchex.cpp @@ -0,0 +1,17 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_searchex.h" + +#include "core/fpdftext/cpdf_textpage.h" + +DLLEXPORT int STDCALL +FPDFText_GetCharIndexFromTextIndex(FPDF_TEXTPAGE text_page, int nTextIndex) { + if (!text_page) + return -1; + return static_cast(text_page) + ->CharIndexFromTextIndex(nTextIndex); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdf_structtree.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdf_structtree.cpp new file mode 100644 index 000000000000..5a922a1c3b34 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdf_structtree.cpp @@ -0,0 +1,89 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/fpdf_structtree.h" + +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfdoc/fpdf_tagged.h" +#include "fpdfsdk/fsdk_define.h" + +namespace { + +IPDF_StructTree* ToStructTree(FPDF_STRUCTTREE struct_tree) { + return reinterpret_cast(struct_tree); +} + +IPDF_StructElement* ToStructTreeElement(FPDF_STRUCTELEMENT struct_element) { + return reinterpret_cast(struct_element); +} + +} // namespace + +DLLEXPORT FPDF_STRUCTTREE STDCALL FPDF_StructTree_GetForPage(FPDF_PAGE page) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return nullptr; + return IPDF_StructTree::LoadPage(pPage->m_pDocument, pPage->m_pFormDict) + .release(); +} + +DLLEXPORT void STDCALL FPDF_StructTree_Close(FPDF_STRUCTTREE struct_tree) { + std::unique_ptr(ToStructTree(struct_tree)); +} + +DLLEXPORT int STDCALL +FPDF_StructTree_CountChildren(FPDF_STRUCTTREE struct_tree) { + IPDF_StructTree* tree = ToStructTree(struct_tree); + return tree ? tree->CountTopElements() : -1; +} + +DLLEXPORT FPDF_STRUCTELEMENT STDCALL +FPDF_StructTree_GetChildAtIndex(FPDF_STRUCTTREE struct_tree, int index) { + IPDF_StructTree* tree = ToStructTree(struct_tree); + if (!tree || index < 0 || index >= tree->CountTopElements()) + return nullptr; + return tree->GetTopElement(index); +} + +DLLEXPORT unsigned long STDCALL +FPDF_StructElement_GetAltText(FPDF_STRUCTELEMENT struct_element, + void* buffer, + unsigned long buflen) { + IPDF_StructElement* elem = ToStructTreeElement(struct_element); + if (!elem) + return 0; + + CPDF_Dictionary* dict = elem->GetDict(); + if (!dict) + return 0; + + CFX_WideString str = elem->GetDict()->GetUnicodeTextFor("Alt"); + if (str.IsEmpty()) + return 0; + + CFX_ByteString encodedStr = str.UTF16LE_Encode(); + const unsigned long len = encodedStr.GetLength(); + if (buffer && len <= buflen) + FXSYS_memcpy(buffer, encodedStr.c_str(), len); + return len; +} + +DLLEXPORT int STDCALL +FPDF_StructElement_CountChildren(FPDF_STRUCTELEMENT struct_element) { + IPDF_StructElement* elem = ToStructTreeElement(struct_element); + return elem ? elem->CountKids() : -1; +} + +DLLEXPORT FPDF_STRUCTELEMENT STDCALL +FPDF_StructElement_GetChildAtIndex(FPDF_STRUCTELEMENT struct_element, + int index) { + IPDF_StructElement* elem = ToStructTreeElement(struct_element); + if (!elem || index < 0 || index >= elem->CountKids()) + return nullptr; + + return elem->GetKidIfElement(index); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdf_structtree_embeddertest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdf_structtree_embeddertest.cpp new file mode 100644 index 000000000000..58b317205761 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdf_structtree_embeddertest.cpp @@ -0,0 +1,70 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/fx_string.h" +#include "public/fpdf_structtree.h" +#include "testing/embedder_test.h" +#include "testing/test_support.h" + +class FPDFStructTreeEmbeddertest : public EmbedderTest, public TestSaver {}; + +TEST_F(FPDFStructTreeEmbeddertest, GetAltText) { + ASSERT_TRUE(OpenDocument("tagged_alt_text.pdf")); + FPDF_PAGE page = LoadPage(0); + ASSERT_TRUE(page); + + FPDF_STRUCTTREE struct_tree = FPDF_StructTree_GetForPage(page); + ASSERT_TRUE(struct_tree); + ASSERT_EQ(1, FPDF_StructTree_CountChildren(struct_tree)); + + FPDF_STRUCTELEMENT element = FPDF_StructTree_GetChildAtIndex(struct_tree, -1); + EXPECT_EQ(nullptr, element); + element = FPDF_StructTree_GetChildAtIndex(struct_tree, 1); + EXPECT_EQ(nullptr, element); + element = FPDF_StructTree_GetChildAtIndex(struct_tree, 0); + ASSERT_NE(nullptr, element); + EXPECT_EQ(0U, FPDF_StructElement_GetAltText(element, nullptr, 0)); + + ASSERT_EQ(1, FPDF_StructElement_CountChildren(element)); + FPDF_STRUCTELEMENT child_element = + FPDF_StructElement_GetChildAtIndex(element, -1); + EXPECT_EQ(nullptr, child_element); + child_element = FPDF_StructElement_GetChildAtIndex(element, 1); + EXPECT_EQ(nullptr, child_element); + child_element = FPDF_StructElement_GetChildAtIndex(element, 0); + ASSERT_NE(nullptr, child_element); + EXPECT_EQ(0U, FPDF_StructElement_GetAltText(child_element, nullptr, 0)); + + ASSERT_EQ(1, FPDF_StructElement_CountChildren(child_element)); + FPDF_STRUCTELEMENT gchild_element = + FPDF_StructElement_GetChildAtIndex(child_element, -1); + EXPECT_EQ(nullptr, gchild_element); + gchild_element = FPDF_StructElement_GetChildAtIndex(child_element, 1); + EXPECT_EQ(nullptr, gchild_element); + gchild_element = FPDF_StructElement_GetChildAtIndex(child_element, 0); + ASSERT_NE(nullptr, gchild_element); + ASSERT_EQ(24U, FPDF_StructElement_GetAltText(gchild_element, nullptr, 0)); + + unsigned short buffer[12]; + memset(buffer, 0, sizeof(buffer)); + // Deliberately pass in a small buffer size to make sure |buffer| remains + // untouched. + ASSERT_EQ(24U, FPDF_StructElement_GetAltText(gchild_element, buffer, 1)); + for (size_t i = 0; i < FX_ArraySize(buffer); ++i) + EXPECT_EQ(0U, buffer[i]); + + ASSERT_EQ(24U, FPDF_StructElement_GetAltText(gchild_element, buffer, + sizeof(buffer))); + const FX_WCHAR kExpected[] = L"Black Image"; + EXPECT_EQ(CFX_WideString(kExpected), + CFX_WideString::FromUTF16LE(buffer, FXSYS_len(kExpected))); + + ASSERT_EQ(1, FPDF_StructElement_CountChildren(gchild_element)); + FPDF_STRUCTELEMENT ggchild_element = + FPDF_StructElement_GetChildAtIndex(gchild_element, 0); + EXPECT_EQ(nullptr, ggchild_element); + + FPDF_StructTree_Close(struct_tree); + FPDF_ClosePage(page); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdf_sysfontinfo.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdf_sysfontinfo.cpp new file mode 100644 index 000000000000..1b62dc48ac4d --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdf_sysfontinfo.cpp @@ -0,0 +1,203 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_sysfontinfo.h" + +#include + +#include "core/fxge/cfx_fontmapper.h" +#include "core/fxge/cfx_gemodule.h" +#include "core/fxge/fx_font.h" +#include "core/fxge/ifx_systemfontinfo.h" +#include "fpdfsdk/fsdk_define.h" +#include "fpdfsdk/pdfwindow/PWL_FontMap.h" + +class CFX_ExternalFontInfo final : public IFX_SystemFontInfo { + public: + explicit CFX_ExternalFontInfo(FPDF_SYSFONTINFO* pInfo) : m_pInfo(pInfo) {} + ~CFX_ExternalFontInfo() override { + if (m_pInfo->Release) + m_pInfo->Release(m_pInfo); + } + + bool EnumFontList(CFX_FontMapper* pMapper) override { + if (m_pInfo->EnumFonts) { + m_pInfo->EnumFonts(m_pInfo, pMapper); + return true; + } + return false; + } + + void* MapFont(int weight, + bool bItalic, + int charset, + int pitch_family, + const FX_CHAR* family, + int& iExact) override { + if (!m_pInfo->MapFont) + return nullptr; + return m_pInfo->MapFont(m_pInfo, weight, bItalic, charset, pitch_family, + family, &iExact); + } + + void* GetFont(const FX_CHAR* family) override { + if (!m_pInfo->GetFont) + return nullptr; + return m_pInfo->GetFont(m_pInfo, family); + } + + uint32_t GetFontData(void* hFont, + uint32_t table, + uint8_t* buffer, + uint32_t size) override { + if (!m_pInfo->GetFontData) + return 0; + return m_pInfo->GetFontData(m_pInfo, hFont, table, buffer, size); + } + + bool GetFaceName(void* hFont, CFX_ByteString& name) override { + if (!m_pInfo->GetFaceName) + return false; + uint32_t size = m_pInfo->GetFaceName(m_pInfo, hFont, nullptr, 0); + if (size == 0) + return false; + char* buffer = FX_Alloc(char, size); + size = m_pInfo->GetFaceName(m_pInfo, hFont, buffer, size); + name = CFX_ByteString(buffer, size); + FX_Free(buffer); + return true; + } + + bool GetFontCharset(void* hFont, int& charset) override { + if (!m_pInfo->GetFontCharset) + return false; + + charset = m_pInfo->GetFontCharset(m_pInfo, hFont); + return true; + } + + void DeleteFont(void* hFont) override { + if (m_pInfo->DeleteFont) + m_pInfo->DeleteFont(m_pInfo, hFont); + } + + private: + FPDF_SYSFONTINFO* const m_pInfo; +}; + +DLLEXPORT void STDCALL FPDF_AddInstalledFont(void* mapper, + const char* name, + int charset) { + CFX_FontMapper* pMapper = reinterpret_cast(mapper); + pMapper->AddInstalledFont(name, charset); +} + +DLLEXPORT void STDCALL FPDF_SetSystemFontInfo(FPDF_SYSFONTINFO* pFontInfoExt) { + if (pFontInfoExt->version != 1) + return; + + CFX_GEModule::Get()->GetFontMgr()->SetSystemFontInfo( + std::unique_ptr( + new CFX_ExternalFontInfo(pFontInfoExt))); +} + +DLLEXPORT const FPDF_CharsetFontMap* STDCALL FPDF_GetDefaultTTFMap() { + return CPWL_FontMap::defaultTTFMap; +} + +struct FPDF_SYSFONTINFO_DEFAULT : public FPDF_SYSFONTINFO { + IFX_SystemFontInfo* m_pFontInfo; +}; + +static void DefaultRelease(struct _FPDF_SYSFONTINFO* pThis) { + auto* pDefault = static_cast(pThis); + // TODO(thestig): Should this be set to nullptr too? + delete pDefault->m_pFontInfo; +} + +static void DefaultEnumFonts(struct _FPDF_SYSFONTINFO* pThis, void* pMapper) { + auto* pDefault = static_cast(pThis); + pDefault->m_pFontInfo->EnumFontList((CFX_FontMapper*)pMapper); +} + +static void* DefaultMapFont(struct _FPDF_SYSFONTINFO* pThis, + int weight, + int bItalic, + int charset, + int pitch_family, + const char* family, + int* bExact) { + auto* pDefault = static_cast(pThis); + return pDefault->m_pFontInfo->MapFont(weight, !!bItalic, charset, + pitch_family, family, *bExact); +} + +void* DefaultGetFont(struct _FPDF_SYSFONTINFO* pThis, const char* family) { + auto* pDefault = static_cast(pThis); + return pDefault->m_pFontInfo->GetFont(family); +} + +static unsigned long DefaultGetFontData(struct _FPDF_SYSFONTINFO* pThis, + void* hFont, + unsigned int table, + unsigned char* buffer, + unsigned long buf_size) { + auto* pDefault = static_cast(pThis); + return pDefault->m_pFontInfo->GetFontData(hFont, table, buffer, buf_size); +} + +static unsigned long DefaultGetFaceName(struct _FPDF_SYSFONTINFO* pThis, + void* hFont, + char* buffer, + unsigned long buf_size) { + CFX_ByteString name; + auto* pDefault = static_cast(pThis); + if (!pDefault->m_pFontInfo->GetFaceName(hFont, name)) + return 0; + if (name.GetLength() >= (long)buf_size) + return name.GetLength() + 1; + FXSYS_strcpy(buffer, name.c_str()); + return name.GetLength() + 1; +} + +static int DefaultGetFontCharset(struct _FPDF_SYSFONTINFO* pThis, void* hFont) { + int charset; + auto* pDefault = static_cast(pThis); + if (!pDefault->m_pFontInfo->GetFontCharset(hFont, charset)) + return 0; + return charset; +} + +static void DefaultDeleteFont(struct _FPDF_SYSFONTINFO* pThis, void* hFont) { + auto* pDefault = static_cast(pThis); + pDefault->m_pFontInfo->DeleteFont(hFont); +} + +DLLEXPORT FPDF_SYSFONTINFO* STDCALL FPDF_GetDefaultSystemFontInfo() { + std::unique_ptr pFontInfo = + IFX_SystemFontInfo::CreateDefault(nullptr); + if (!pFontInfo) + return nullptr; + + FPDF_SYSFONTINFO_DEFAULT* pFontInfoExt = + FX_Alloc(FPDF_SYSFONTINFO_DEFAULT, 1); + pFontInfoExt->DeleteFont = DefaultDeleteFont; + pFontInfoExt->EnumFonts = DefaultEnumFonts; + pFontInfoExt->GetFaceName = DefaultGetFaceName; + pFontInfoExt->GetFont = DefaultGetFont; + pFontInfoExt->GetFontCharset = DefaultGetFontCharset; + pFontInfoExt->GetFontData = DefaultGetFontData; + pFontInfoExt->MapFont = DefaultMapFont; + pFontInfoExt->Release = DefaultRelease; + pFontInfoExt->version = 1; + pFontInfoExt->m_pFontInfo = pFontInfo.release(); + return pFontInfoExt; +} + +DLLEXPORT void FPDF_FreeDefaultSystemFontInfo( + FPDF_SYSFONTINFO* pDefaultFontInfo) { + FX_Free(static_cast(pDefaultFontInfo)); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdf_transformpage.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdf_transformpage.cpp new file mode 100644 index 000000000000..3427f4ea5854 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdf_transformpage.cpp @@ -0,0 +1,337 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_transformpage.h" + +#include + +#include "core/fpdfapi/page/cpdf_clippath.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/cpdf_path.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fxge/cfx_pathdata.h" +#include "fpdfsdk/fsdk_define.h" + +namespace { + +void SetBoundingBox(CPDF_Page* page, + const CFX_ByteString& key, + float left, + float bottom, + float right, + float top) { + CPDF_Array* pBoundingBoxArray = page->m_pFormDict->SetNewFor(key); + pBoundingBoxArray->AddNew(left); + pBoundingBoxArray->AddNew(bottom); + pBoundingBoxArray->AddNew(right); + pBoundingBoxArray->AddNew(top); +} + +bool GetBoundingBox(CPDF_Page* page, + const CFX_ByteString& key, + float* left, + float* bottom, + float* right, + float* top) { + CPDF_Array* pArray = page->m_pFormDict->GetArrayFor(key); + if (!pArray) + return false; + + *left = pArray->GetFloatAt(0); + *bottom = pArray->GetFloatAt(1); + *right = pArray->GetFloatAt(2); + *top = pArray->GetFloatAt(3); + return true; +} + +} // namespace + +DLLEXPORT void STDCALL FPDFPage_SetMediaBox(FPDF_PAGE page, + float left, + float bottom, + float right, + float top) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return; + + SetBoundingBox(pPage, "MediaBox", left, bottom, right, top); +} + +DLLEXPORT void STDCALL FPDFPage_SetCropBox(FPDF_PAGE page, + float left, + float bottom, + float right, + float top) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return; + + SetBoundingBox(pPage, "CropBox", left, bottom, right, top); +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetMediaBox(FPDF_PAGE page, + float* left, + float* bottom, + float* right, + float* top) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + return pPage && GetBoundingBox(pPage, "MediaBox", left, bottom, right, top); +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetCropBox(FPDF_PAGE page, + float* left, + float* bottom, + float* right, + float* top) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + return pPage && GetBoundingBox(pPage, "CropBox", left, bottom, right, top); +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFPage_TransFormWithClip(FPDF_PAGE page, + FS_MATRIX* matrix, + FS_RECTF* clipRect) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return false; + + CFX_ByteTextBuf textBuf; + textBuf << "q "; + CFX_FloatRect rect(clipRect->left, clipRect->bottom, clipRect->right, + clipRect->top); + rect.Normalize(); + CFX_ByteString bsClipping; + bsClipping.Format("%f %f %f %f re W* n ", rect.left, rect.bottom, + rect.Width(), rect.Height()); + textBuf << bsClipping; + + CFX_ByteString bsMatix; + bsMatix.Format("%f %f %f %f %f %f cm ", matrix->a, matrix->b, matrix->c, + matrix->d, matrix->e, matrix->f); + textBuf << bsMatix; + + CPDF_Dictionary* pPageDic = pPage->m_pFormDict; + CPDF_Object* pContentObj = + pPageDic ? pPageDic->GetObjectFor("Contents") : nullptr; + if (!pContentObj) + pContentObj = pPageDic ? pPageDic->GetArrayFor("Contents") : nullptr; + if (!pContentObj) + return false; + + CPDF_Document* pDoc = pPage->m_pDocument; + if (!pDoc) + return false; + + CPDF_Stream* pStream = pDoc->NewIndirect( + nullptr, 0, + pdfium::MakeUnique(pDoc->GetByteStringPool())); + pStream->SetData(textBuf.GetBuffer(), textBuf.GetSize()); + + CPDF_Stream* pEndStream = pDoc->NewIndirect( + nullptr, 0, + pdfium::MakeUnique(pDoc->GetByteStringPool())); + pEndStream->SetData((const uint8_t*)" Q", 2); + + CPDF_Array* pContentArray = nullptr; + CPDF_Array* pArray = ToArray(pContentObj); + if (pArray) { + pContentArray = pArray; + pContentArray->InsertNewAt(0, pDoc, pStream->GetObjNum()); + pContentArray->AddNew(pDoc, pEndStream->GetObjNum()); + } else if (CPDF_Reference* pReference = ToReference(pContentObj)) { + CPDF_Object* pDirectObj = pReference->GetDirect(); + if (pDirectObj) { + CPDF_Array* pObjArray = pDirectObj->AsArray(); + if (pObjArray) { + pContentArray = pObjArray; + pContentArray->InsertNewAt(0, pDoc, + pStream->GetObjNum()); + pContentArray->AddNew(pDoc, pEndStream->GetObjNum()); + } else if (pDirectObj->IsStream()) { + pContentArray = pDoc->NewIndirect(); + pContentArray->AddNew(pDoc, pStream->GetObjNum()); + pContentArray->AddNew(pDoc, pDirectObj->GetObjNum()); + pContentArray->AddNew(pDoc, pEndStream->GetObjNum()); + pPageDic->SetNewFor("Contents", pDoc, + pContentArray->GetObjNum()); + } + } + } + + // Need to transform the patterns as well. + CPDF_Dictionary* pRes = pPageDic->GetDictFor("Resources"); + if (pRes) { + CPDF_Dictionary* pPattenDict = pRes->GetDictFor("Pattern"); + if (pPattenDict) { + for (const auto& it : *pPattenDict) { + CPDF_Object* pObj = it.second.get(); + if (pObj->IsReference()) + pObj = pObj->GetDirect(); + + CPDF_Dictionary* pDict = nullptr; + if (pObj->IsDictionary()) + pDict = pObj->AsDictionary(); + else if (CPDF_Stream* pObjStream = pObj->AsStream()) + pDict = pObjStream->GetDict(); + else + continue; + + CFX_Matrix m = pDict->GetMatrixFor("Matrix"); + CFX_Matrix t = *(CFX_Matrix*)matrix; + m.Concat(t); + pDict->SetMatrixFor("Matrix", m); + } + } + } + + return true; +} + +DLLEXPORT void STDCALL +FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object, + double a, + double b, + double c, + double d, + double e, + double f) { + CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object; + if (!pPageObj) + return; + CFX_Matrix matrix((FX_FLOAT)a, (FX_FLOAT)b, (FX_FLOAT)c, (FX_FLOAT)d, + (FX_FLOAT)e, (FX_FLOAT)f); + + // Special treatment to shading object, because the ClipPath for shading + // object is already transformed. + if (!pPageObj->IsShading()) + pPageObj->TransformClipPath(matrix); + pPageObj->TransformGeneralState(matrix); +} + +DLLEXPORT FPDF_CLIPPATH STDCALL FPDF_CreateClipPath(float left, + float bottom, + float right, + float top) { + CPDF_Path Path; + Path.AppendRect(left, bottom, right, top); + + CPDF_ClipPath* pNewClipPath = new CPDF_ClipPath(); + pNewClipPath->AppendPath(Path, FXFILL_ALTERNATE, false); + return pNewClipPath; +} + +DLLEXPORT void STDCALL FPDF_DestroyClipPath(FPDF_CLIPPATH clipPath) { + delete (CPDF_ClipPath*)clipPath; +} + +void OutputPath(CFX_ByteTextBuf& buf, CPDF_Path path) { + const CFX_PathData* pPathData = path.GetObject(); + if (!pPathData) + return; + + const std::vector& pPoints = pPathData->GetPoints(); + if (path.IsRect()) { + CFX_PointF diff = pPoints[2].m_Point - pPoints[0].m_Point; + buf << pPoints[0].m_Point.x << " " << pPoints[0].m_Point.y << " " << diff.x + << " " << diff.y << " re\n"; + return; + } + + CFX_ByteString temp; + for (size_t i = 0; i < pPoints.size(); i++) { + buf << pPoints[i].m_Point.x << " " << pPoints[i].m_Point.y; + FXPT_TYPE point_type = pPoints[i].m_Type; + if (point_type == FXPT_TYPE::MoveTo) { + buf << " m\n"; + } else if (point_type == FXPT_TYPE::BezierTo) { + buf << " " << pPoints[i + 1].m_Point.x << " " << pPoints[i + 1].m_Point.y + << " " << pPoints[i + 2].m_Point.x << " " << pPoints[i + 2].m_Point.y; + buf << " c"; + if (pPoints[i + 2].m_CloseFigure) + buf << " h"; + buf << "\n"; + + i += 2; + } else if (point_type == FXPT_TYPE::LineTo) { + buf << " l"; + if (pPoints[i].m_CloseFigure) + buf << " h"; + buf << "\n"; + } + } +} + +DLLEXPORT void STDCALL FPDFPage_InsertClipPath(FPDF_PAGE page, + FPDF_CLIPPATH clipPath) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return; + + CPDF_Dictionary* pPageDic = pPage->m_pFormDict; + CPDF_Object* pContentObj = + pPageDic ? pPageDic->GetObjectFor("Contents") : nullptr; + if (!pContentObj) + pContentObj = pPageDic ? pPageDic->GetArrayFor("Contents") : nullptr; + if (!pContentObj) + return; + + CFX_ByteTextBuf strClip; + CPDF_ClipPath* pClipPath = (CPDF_ClipPath*)clipPath; + uint32_t i; + for (i = 0; i < pClipPath->GetPathCount(); i++) { + CPDF_Path path = pClipPath->GetPath(i); + int iClipType = pClipPath->GetClipType(i); + if (path.GetPoints().empty()) { + // Empty clipping (totally clipped out) + strClip << "0 0 m W n "; + } else { + OutputPath(strClip, path); + if (iClipType == FXFILL_WINDING) + strClip << "W n\n"; + else + strClip << "W* n\n"; + } + } + CPDF_Document* pDoc = pPage->m_pDocument; + if (!pDoc) + return; + + CPDF_Stream* pStream = pDoc->NewIndirect( + nullptr, 0, + pdfium::MakeUnique(pDoc->GetByteStringPool())); + pStream->SetData(strClip.GetBuffer(), strClip.GetSize()); + + CPDF_Array* pArray = ToArray(pContentObj); + if (pArray) { + pArray->InsertNewAt(0, pDoc, pStream->GetObjNum()); + return; + } + CPDF_Reference* pReference = ToReference(pContentObj); + if (!pReference) + return; + + CPDF_Object* pDirectObj = pReference->GetDirect(); + if (!pDirectObj) + return; + + CPDF_Array* pObjArray = pDirectObj->AsArray(); + if (pObjArray) { + pObjArray->InsertNewAt(0, pDoc, pStream->GetObjNum()); + return; + } + if (pDirectObj->IsStream()) { + CPDF_Array* pContentArray = pDoc->NewIndirect(); + pContentArray->AddNew(pDoc, pStream->GetObjNum()); + pContentArray->AddNew(pDoc, pDirectObj->GetObjNum()); + pPageDic->SetNewFor("Contents", pDoc, + pContentArray->GetObjNum()); + } +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfdoc.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfdoc.cpp new file mode 100644 index 000000000000..f7d94c2f97cb --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfdoc.cpp @@ -0,0 +1,418 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_doc.h" + +#include +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfdoc/cpdf_bookmark.h" +#include "core/fpdfdoc/cpdf_bookmarktree.h" +#include "core/fpdfdoc/cpdf_dest.h" +#include "core/fpdfdoc/cpdf_pagelabel.h" +#include "fpdfsdk/fsdk_define.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +namespace { + +CPDF_Bookmark FindBookmark(const CPDF_BookmarkTree& tree, + CPDF_Bookmark bookmark, + const CFX_WideString& title, + std::set* visited) { + // Return if already checked to avoid circular calling. + if (pdfium::ContainsKey(*visited, bookmark.GetDict())) + return CPDF_Bookmark(); + visited->insert(bookmark.GetDict()); + + if (bookmark.GetDict() && + bookmark.GetTitle().CompareNoCase(title.c_str()) == 0) { + // First check this item. + return bookmark; + } + + // Go into children items. + CPDF_Bookmark child = tree.GetFirstChild(bookmark); + while (child.GetDict() && !pdfium::ContainsKey(*visited, child.GetDict())) { + // Check this item and its children. + CPDF_Bookmark found = FindBookmark(tree, child, title, visited); + if (found.GetDict()) + return found; + child = tree.GetNextSibling(child); + } + return CPDF_Bookmark(); +} + +CPDF_LinkList* GetLinkList(CPDF_Page* page) { + if (!page) + return nullptr; + + CPDF_Document* pDoc = page->m_pDocument; + std::unique_ptr* pHolder = pDoc->LinksContext(); + if (!pHolder->get()) + *pHolder = pdfium::MakeUnique(); + return pHolder->get(); +} + +unsigned long Utf16EncodeMaybeCopyAndReturnLength(const CFX_WideString& text, + void* buffer, + unsigned long buflen) { + CFX_ByteString encodedText = text.UTF16LE_Encode(); + unsigned long len = encodedText.GetLength(); + if (buffer && len <= buflen) + FXSYS_memcpy(buffer, encodedText.c_str(), len); + return len; +} + +} // namespace + +DLLEXPORT FPDF_BOOKMARK STDCALL +FPDFBookmark_GetFirstChild(FPDF_DOCUMENT document, FPDF_BOOKMARK pDict) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return nullptr; + CPDF_BookmarkTree tree(pDoc); + CPDF_Bookmark bookmark = + CPDF_Bookmark(ToDictionary(static_cast(pDict))); + return tree.GetFirstChild(bookmark).GetDict(); +} + +DLLEXPORT FPDF_BOOKMARK STDCALL +FPDFBookmark_GetNextSibling(FPDF_DOCUMENT document, FPDF_BOOKMARK pDict) { + if (!pDict) + return nullptr; + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return nullptr; + CPDF_BookmarkTree tree(pDoc); + CPDF_Bookmark bookmark = + CPDF_Bookmark(ToDictionary(static_cast(pDict))); + return tree.GetNextSibling(bookmark).GetDict(); +} + +DLLEXPORT unsigned long STDCALL FPDFBookmark_GetTitle(FPDF_BOOKMARK pDict, + void* buffer, + unsigned long buflen) { + if (!pDict) + return 0; + CPDF_Bookmark bookmark(ToDictionary(static_cast(pDict))); + CFX_WideString title = bookmark.GetTitle(); + return Utf16EncodeMaybeCopyAndReturnLength(title, buffer, buflen); +} + +DLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document, + FPDF_WIDESTRING title) { + if (!title || title[0] == 0) + return nullptr; + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return nullptr; + CPDF_BookmarkTree tree(pDoc); + FX_STRSIZE len = CFX_WideString::WStringLength(title); + CFX_WideString encodedTitle = CFX_WideString::FromUTF16LE(title, len); + std::set visited; + return FindBookmark(tree, CPDF_Bookmark(), encodedTitle, &visited).GetDict(); +} + +DLLEXPORT FPDF_DEST STDCALL FPDFBookmark_GetDest(FPDF_DOCUMENT document, + FPDF_BOOKMARK pDict) { + if (!pDict) + return nullptr; + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return nullptr; + CPDF_Bookmark bookmark(ToDictionary(static_cast(pDict))); + CPDF_Dest dest = bookmark.GetDest(pDoc); + if (dest.GetObject()) + return dest.GetObject(); + // If this bookmark is not directly associated with a dest, we try to get + // action + CPDF_Action action = bookmark.GetAction(); + if (!action.GetDict()) + return nullptr; + return action.GetDest(pDoc).GetObject(); +} + +DLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK pDict) { + if (!pDict) + return nullptr; + CPDF_Bookmark bookmark(ToDictionary(static_cast(pDict))); + return bookmark.GetAction().GetDict(); +} + +DLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION pDict) { + if (!pDict) + return PDFACTION_UNSUPPORTED; + + CPDF_Action action(ToDictionary(static_cast(pDict))); + CPDF_Action::ActionType type = action.GetType(); + switch (type) { + case CPDF_Action::GoTo: + return PDFACTION_GOTO; + case CPDF_Action::GoToR: + return PDFACTION_REMOTEGOTO; + case CPDF_Action::URI: + return PDFACTION_URI; + case CPDF_Action::Launch: + return PDFACTION_LAUNCH; + default: + return PDFACTION_UNSUPPORTED; + } +} + +DLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document, + FPDF_ACTION pDict) { + if (!pDict) + return nullptr; + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return nullptr; + CPDF_Action action(ToDictionary(static_cast(pDict))); + return action.GetDest(pDoc).GetObject(); +} + +DLLEXPORT unsigned long STDCALL FPDFAction_GetFilePath(FPDF_ACTION pDict, + void* buffer, + unsigned long buflen) { + unsigned long type = FPDFAction_GetType(pDict); + if (type != PDFACTION_REMOTEGOTO && type != PDFACTION_LAUNCH) + return 0; + + CPDF_Action action(ToDictionary(static_cast(pDict))); + CFX_ByteString path = action.GetFilePath().UTF8Encode(); + unsigned long len = path.GetLength() + 1; + if (buffer && len <= buflen) + FXSYS_memcpy(buffer, path.c_str(), len); + return len; +} + +DLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document, + FPDF_ACTION pDict, + void* buffer, + unsigned long buflen) { + if (!pDict) + return 0; + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return 0; + CPDF_Action action(ToDictionary(static_cast(pDict))); + CFX_ByteString path = action.GetURI(pDoc); + unsigned long len = path.GetLength() + 1; + if (buffer && len <= buflen) + FXSYS_memcpy(buffer, path.c_str(), len); + return len; +} + +DLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document, + FPDF_DEST pDict) { + if (!pDict) + return 0; + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return 0; + CPDF_Dest dest(static_cast(pDict)); + return dest.GetPageIndex(pDoc); +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFDest_GetLocationInPage(FPDF_DEST pDict, + FPDF_BOOL* hasXVal, + FPDF_BOOL* hasYVal, + FPDF_BOOL* hasZoomVal, + FS_FLOAT* x, + FS_FLOAT* y, + FS_FLOAT* zoom) { + if (!pDict) + return false; + + std::unique_ptr dest( + new CPDF_Dest(static_cast(pDict))); + + // FPDF_BOOL is an int, GetXYZ expects bools. + bool bHasX; + bool bHasY; + bool bHasZoom; + if (!dest->GetXYZ(&bHasX, &bHasY, &bHasZoom, x, y, zoom)) + return false; + + *hasXVal = bHasX; + *hasYVal = bHasY; + *hasZoomVal = bHasZoom; + return true; +} + +DLLEXPORT FPDF_LINK STDCALL FPDFLink_GetLinkAtPoint(FPDF_PAGE page, + double x, + double y) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return nullptr; + + CPDF_LinkList* pLinkList = GetLinkList(pPage); + if (!pLinkList) + return nullptr; + + return pLinkList + ->GetLinkAtPoint( + pPage, CFX_PointF(static_cast(x), static_cast(y)), + nullptr) + .GetDict(); +} + +DLLEXPORT int STDCALL FPDFLink_GetLinkZOrderAtPoint(FPDF_PAGE page, + double x, + double y) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return -1; + + CPDF_LinkList* pLinkList = GetLinkList(pPage); + if (!pLinkList) + return -1; + + int z_order = -1; + pLinkList->GetLinkAtPoint( + pPage, CFX_PointF(static_cast(x), static_cast(y)), + &z_order); + return z_order; +} + +DLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document, + FPDF_LINK pDict) { + if (!pDict) + return nullptr; + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return nullptr; + CPDF_Link link(ToDictionary(static_cast(pDict))); + FPDF_DEST dest = link.GetDest(pDoc).GetObject(); + if (dest) + return dest; + // If this link is not directly associated with a dest, we try to get action + CPDF_Action action = link.GetAction(); + if (!action.GetDict()) + return nullptr; + return action.GetDest(pDoc).GetObject(); +} + +DLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK pDict) { + if (!pDict) + return nullptr; + + CPDF_Link link(ToDictionary(static_cast(pDict))); + return link.GetAction().GetDict(); +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFLink_Enumerate(FPDF_PAGE page, + int* startPos, + FPDF_LINK* linkAnnot) { + if (!startPos || !linkAnnot) + return false; + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage || !pPage->m_pFormDict) + return false; + CPDF_Array* pAnnots = pPage->m_pFormDict->GetArrayFor("Annots"); + if (!pAnnots) + return false; + for (size_t i = *startPos; i < pAnnots->GetCount(); i++) { + CPDF_Dictionary* pDict = + ToDictionary(static_cast(pAnnots->GetDirectObjectAt(i))); + if (!pDict) + continue; + if (pDict->GetStringFor("Subtype") == "Link") { + *startPos = static_cast(i + 1); + *linkAnnot = static_cast(pDict); + return true; + } + } + return false; +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetAnnotRect(FPDF_LINK linkAnnot, + FS_RECTF* rect) { + if (!linkAnnot || !rect) + return false; + CPDF_Dictionary* pAnnotDict = + ToDictionary(static_cast(linkAnnot)); + CFX_FloatRect rt = pAnnotDict->GetRectFor("Rect"); + rect->left = rt.left; + rect->bottom = rt.bottom; + rect->right = rt.right; + rect->top = rt.top; + return true; +} + +DLLEXPORT int STDCALL FPDFLink_CountQuadPoints(FPDF_LINK linkAnnot) { + if (!linkAnnot) + return 0; + CPDF_Dictionary* pAnnotDict = + ToDictionary(static_cast(linkAnnot)); + CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints"); + if (!pArray) + return 0; + return static_cast(pArray->GetCount() / 8); +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetQuadPoints(FPDF_LINK linkAnnot, + int quadIndex, + FS_QUADPOINTSF* quadPoints) { + if (!linkAnnot || !quadPoints) + return false; + CPDF_Dictionary* pAnnotDict = + ToDictionary(static_cast(linkAnnot)); + CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints"); + if (!pArray) + return false; + + if (quadIndex < 0 || + static_cast(quadIndex) >= pArray->GetCount() / 8 || + (static_cast(quadIndex * 8 + 7) >= pArray->GetCount())) { + return false; + } + + quadPoints->x1 = pArray->GetNumberAt(quadIndex * 8); + quadPoints->y1 = pArray->GetNumberAt(quadIndex * 8 + 1); + quadPoints->x2 = pArray->GetNumberAt(quadIndex * 8 + 2); + quadPoints->y2 = pArray->GetNumberAt(quadIndex * 8 + 3); + quadPoints->x3 = pArray->GetNumberAt(quadIndex * 8 + 4); + quadPoints->y3 = pArray->GetNumberAt(quadIndex * 8 + 5); + quadPoints->x4 = pArray->GetNumberAt(quadIndex * 8 + 6); + quadPoints->y4 = pArray->GetNumberAt(quadIndex * 8 + 7); + return true; +} + +DLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT document, + FPDF_BYTESTRING tag, + void* buffer, + unsigned long buflen) { + if (!tag) + return 0; + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return 0; + CPDF_Dictionary* pInfo = pDoc->GetInfo(); + if (!pInfo) + return 0; + CFX_WideString text = pInfo->GetUnicodeTextFor(tag); + return Utf16EncodeMaybeCopyAndReturnLength(text, buffer, buflen); +} + +DLLEXPORT unsigned long STDCALL FPDF_GetPageLabel(FPDF_DOCUMENT document, + int page_index, + void* buffer, + unsigned long buflen) { + if (page_index < 0) + return 0; + + // CPDF_PageLabel can deal with NULL |document|. + CPDF_PageLabel label(CPDFDocumentFromFPDFDocument(document)); + CFX_WideString str; + if (!label.GetLabel(page_index, &str)) + return 0; + return Utf16EncodeMaybeCopyAndReturnLength(str, buffer, buflen); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfdoc_embeddertest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfdoc_embeddertest.cpp new file mode 100644 index 000000000000..3666687d4dad --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfdoc_embeddertest.cpp @@ -0,0 +1,238 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include + +#include "core/fxcrt/fx_string.h" +#include "public/fpdf_doc.h" +#include "public/fpdf_edit.h" +#include "public/fpdfview.h" +#include "testing/embedder_test.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" + +class FPDFDocEmbeddertest : public EmbedderTest {}; + +TEST_F(FPDFDocEmbeddertest, DestGetPageIndex) { + EXPECT_TRUE(OpenDocument("named_dests.pdf")); + + // NULL FPDF_DEST case. + EXPECT_EQ(0U, FPDFDest_GetPageIndex(document(), nullptr)); + + // Page number directly in item from Dests NameTree. + FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First"); + EXPECT_TRUE(dest); + EXPECT_EQ(1U, FPDFDest_GetPageIndex(document(), dest)); + + // Page number via object reference in item from Dests NameTree. + dest = FPDF_GetNamedDestByName(document(), "Next"); + EXPECT_TRUE(dest); + EXPECT_EQ(1U, FPDFDest_GetPageIndex(document(), dest)); + + // Page number directly in item from Dests dictionary. + dest = FPDF_GetNamedDestByName(document(), "FirstAlternate"); + EXPECT_TRUE(dest); + EXPECT_EQ(11U, FPDFDest_GetPageIndex(document(), dest)); + + // Invalid object reference in item from Dests NameTree. + dest = FPDF_GetNamedDestByName(document(), "LastAlternate"); + EXPECT_TRUE(dest); + EXPECT_EQ(0U, FPDFDest_GetPageIndex(document(), dest)); +} + +TEST_F(FPDFDocEmbeddertest, DestGetLocationInPage) { + EXPECT_TRUE(OpenDocument("named_dests.pdf")); + + // NULL FPDF_DEST case. + EXPECT_EQ(0U, FPDFDest_GetPageIndex(document(), nullptr)); + + FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First"); + EXPECT_TRUE(dest); + + FPDF_BOOL hasX; + FPDF_BOOL hasY; + FPDF_BOOL hasZoom; + FS_FLOAT x; + FS_FLOAT y; + FS_FLOAT zoom; + EXPECT_TRUE( + FPDFDest_GetLocationInPage(dest, &hasX, &hasY, &hasZoom, &x, &y, &zoom)); + EXPECT_TRUE(hasX); + EXPECT_TRUE(hasY); + EXPECT_TRUE(hasZoom); + EXPECT_EQ(0, x); + EXPECT_EQ(0, y); + EXPECT_EQ(1, zoom); +} + +TEST_F(FPDFDocEmbeddertest, BUG_680376) { + EXPECT_TRUE(OpenDocument("bug_680376.pdf")); + + // Page number directly in item from Dests NameTree. + FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First"); + EXPECT_TRUE(dest); + EXPECT_EQ(static_cast(-1), + FPDFDest_GetPageIndex(document(), dest)); +} + +TEST_F(FPDFDocEmbeddertest, ActionGetFilePath) { + EXPECT_TRUE(OpenDocument("launch_action.pdf")); + + FPDF_PAGE page = FPDF_LoadPage(document(), 0); + ASSERT_TRUE(page); + + // The target action is nearly the size of the whole page. + FPDF_LINK link = FPDFLink_GetLinkAtPoint(page, 100, 100); + ASSERT_TRUE(link); + + FPDF_ACTION action = FPDFLink_GetAction(link); + ASSERT_TRUE(action); + + const char kExpectedResult[] = "test.pdf"; + const unsigned long kExpectedLength = sizeof(kExpectedResult); + unsigned long bufsize = FPDFAction_GetFilePath(action, nullptr, 0); + ASSERT_EQ(kExpectedLength, bufsize); + + char buf[kExpectedLength]; + EXPECT_EQ(bufsize, FPDFAction_GetFilePath(action, buf, bufsize)); + EXPECT_EQ(std::string(kExpectedResult), std::string(buf)); + + FPDF_ClosePage(page); +} + +TEST_F(FPDFDocEmbeddertest, NoBookmarks) { + // Open a file with no bookmarks. + EXPECT_TRUE(OpenDocument("named_dests.pdf")); + + // The non-existent top-level bookmark has no title. + unsigned short buf[128]; + EXPECT_EQ(0u, FPDFBookmark_GetTitle(nullptr, buf, sizeof(buf))); + + // The non-existent top-level bookmark has no children. + EXPECT_EQ(nullptr, FPDFBookmark_GetFirstChild(document(), nullptr)); +} + +TEST_F(FPDFDocEmbeddertest, Bookmarks) { + // Open a file with two bookmarks. + EXPECT_TRUE(OpenDocument("bookmarks.pdf")); + + // The existent top-level bookmark has no title. + unsigned short buf[128]; + EXPECT_EQ(0u, FPDFBookmark_GetTitle(nullptr, buf, sizeof(buf))); + + FPDF_BOOKMARK child = FPDFBookmark_GetFirstChild(document(), nullptr); + EXPECT_TRUE(child); + EXPECT_EQ(34u, FPDFBookmark_GetTitle(child, buf, sizeof(buf))); + EXPECT_EQ(CFX_WideString(L"A Good Beginning"), + CFX_WideString::FromUTF16LE(buf, 16)); + + EXPECT_EQ(nullptr, FPDFBookmark_GetFirstChild(document(), child)); + + FPDF_BOOKMARK sibling = FPDFBookmark_GetNextSibling(document(), child); + EXPECT_TRUE(sibling); + EXPECT_EQ(28u, FPDFBookmark_GetTitle(sibling, buf, sizeof(buf))); + EXPECT_EQ(CFX_WideString(L"A Good Ending"), + CFX_WideString::FromUTF16LE(buf, 13)); + + EXPECT_EQ(nullptr, FPDFBookmark_GetNextSibling(document(), sibling)); +} + +TEST_F(FPDFDocEmbeddertest, FindBookmarks) { + // Open a file with two bookmarks. + EXPECT_TRUE(OpenDocument("bookmarks.pdf")); + + // Find the first one, based on its known title. + std::unique_ptr title = + GetFPDFWideString(L"A Good Beginning"); + FPDF_BOOKMARK child = FPDFBookmark_Find(document(), title.get()); + EXPECT_TRUE(child); + + // Check that the string matches. + unsigned short buf[128]; + EXPECT_EQ(34u, FPDFBookmark_GetTitle(child, buf, sizeof(buf))); + EXPECT_EQ(CFX_WideString(L"A Good Beginning"), + CFX_WideString::FromUTF16LE(buf, 16)); + + // Check that it is them same as the one returned by GetFirstChild. + EXPECT_EQ(child, FPDFBookmark_GetFirstChild(document(), nullptr)); + + // Try to find one using a non-existent title. + std::unique_ptr bad_title = + GetFPDFWideString(L"A BAD Beginning"); + EXPECT_EQ(nullptr, FPDFBookmark_Find(document(), bad_title.get())); +} + +// Check circular bookmarks will not cause infinite loop. +TEST_F(FPDFDocEmbeddertest, FindBookmarks_bug420) { + // Open a file with circular bookmarks. + EXPECT_TRUE(OpenDocument("bookmarks_circular.pdf")); + + // Try to find a title. + std::unique_ptr title = + GetFPDFWideString(L"anything"); + EXPECT_EQ(nullptr, FPDFBookmark_Find(document(), title.get())); +} + +TEST_F(FPDFDocEmbeddertest, DeletePage) { + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + EXPECT_EQ(1, FPDF_GetPageCount(document())); + FPDFPage_Delete(document(), 0); + EXPECT_EQ(0, FPDF_GetPageCount(document())); +} + +TEST_F(FPDFDocEmbeddertest, NoPageLabels) { + EXPECT_TRUE(OpenDocument("about_blank.pdf")); + EXPECT_EQ(1, FPDF_GetPageCount(document())); + + ASSERT_EQ(0u, FPDF_GetPageLabel(document(), 0, nullptr, 0)); +} + +TEST_F(FPDFDocEmbeddertest, GetPageLabels) { + EXPECT_TRUE(OpenDocument("page_labels.pdf")); + EXPECT_EQ(7, FPDF_GetPageCount(document())); + + unsigned short buf[128]; + EXPECT_EQ(0u, FPDF_GetPageLabel(document(), -2, buf, sizeof(buf))); + EXPECT_EQ(0u, FPDF_GetPageLabel(document(), -1, buf, sizeof(buf))); + + const FX_WCHAR kExpectedPageLabel0[] = L"i"; + ASSERT_EQ(4u, FPDF_GetPageLabel(document(), 0, buf, sizeof(buf))); + EXPECT_EQ(CFX_WideString(kExpectedPageLabel0), + CFX_WideString::FromUTF16LE(buf, FXSYS_len(kExpectedPageLabel0))); + + const FX_WCHAR kExpectedPageLabel1[] = L"ii"; + ASSERT_EQ(6u, FPDF_GetPageLabel(document(), 1, buf, sizeof(buf))); + EXPECT_EQ(CFX_WideString(kExpectedPageLabel1), + CFX_WideString::FromUTF16LE(buf, FXSYS_len(kExpectedPageLabel1))); + + const FX_WCHAR kExpectedPageLabel2[] = L"1"; + ASSERT_EQ(4u, FPDF_GetPageLabel(document(), 2, buf, sizeof(buf))); + EXPECT_EQ(CFX_WideString(kExpectedPageLabel2), + CFX_WideString::FromUTF16LE(buf, FXSYS_len(kExpectedPageLabel2))); + + const FX_WCHAR kExpectedPageLabel3[] = L"2"; + ASSERT_EQ(4u, FPDF_GetPageLabel(document(), 3, buf, sizeof(buf))); + EXPECT_EQ(CFX_WideString(kExpectedPageLabel3), + CFX_WideString::FromUTF16LE(buf, FXSYS_len(kExpectedPageLabel3))); + + const FX_WCHAR kExpectedPageLabel4[] = L"zzA"; + ASSERT_EQ(8u, FPDF_GetPageLabel(document(), 4, buf, sizeof(buf))); + EXPECT_EQ(CFX_WideString(kExpectedPageLabel4), + CFX_WideString::FromUTF16LE(buf, FXSYS_len(kExpectedPageLabel4))); + + const FX_WCHAR kExpectedPageLabel5[] = L"zzB"; + ASSERT_EQ(8u, FPDF_GetPageLabel(document(), 5, buf, sizeof(buf))); + EXPECT_EQ(CFX_WideString(kExpectedPageLabel5), + CFX_WideString::FromUTF16LE(buf, FXSYS_len(kExpectedPageLabel5))); + + const FX_WCHAR kExpectedPageLabel6[] = L""; + ASSERT_EQ(2u, FPDF_GetPageLabel(document(), 6, buf, sizeof(buf))); + EXPECT_EQ(CFX_WideString(kExpectedPageLabel6), + CFX_WideString::FromUTF16LE(buf, FXSYS_len(kExpectedPageLabel6))); + + ASSERT_EQ(0u, FPDF_GetPageLabel(document(), 7, buf, sizeof(buf))); + ASSERT_EQ(0u, FPDF_GetPageLabel(document(), 8, buf, sizeof(buf))); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfdoc_unittest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfdoc_unittest.cpp new file mode 100644 index 000000000000..c63d6c2e77fa --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfdoc_unittest.cpp @@ -0,0 +1,274 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/fpdf_doc.h" + +#include +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_null.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfdoc/cpdf_dest.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" +#include "third_party/base/ptr_util.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#endif // PDF_ENABLE_XFA + +class CPDF_TestDocument : public CPDF_Document { + public: + CPDF_TestDocument() : CPDF_Document(nullptr) {} + + void SetRoot(CPDF_Dictionary* root) { m_pRootDict = root; } + CPDF_IndirectObjectHolder* GetHolder() { return this; } +}; + +#ifdef PDF_ENABLE_XFA +class CPDF_TestXFAContext : public CPDFXFA_Context { + public: + CPDF_TestXFAContext() + : CPDFXFA_Context(pdfium::MakeUnique()) {} + + void SetRoot(CPDF_Dictionary* root) { + reinterpret_cast(GetPDFDoc())->SetRoot(root); + } + + CPDF_IndirectObjectHolder* GetHolder() { return GetPDFDoc(); } +}; +using CPDF_TestPdfDocument = CPDF_TestXFAContext; +#else // PDF_ENABLE_XFA +using CPDF_TestPdfDocument = CPDF_TestDocument; +#endif // PDF_ENABLE_XFA + +class PDFDocTest : public testing::Test { + public: + struct DictObjInfo { + uint32_t num; + CPDF_Dictionary* obj; + }; + + void SetUp() override { + // We don't need page module or render module, but + // initialize them to keep the code sane. + CPDF_ModuleMgr* module_mgr = CPDF_ModuleMgr::Get(); + module_mgr->InitPageModule(); + + m_pDoc = pdfium::MakeUnique(); + m_pIndirectObjs = m_pDoc->GetHolder(); + + // Setup the root directory. + m_pRootObj = pdfium::MakeUnique(); + m_pDoc->SetRoot(m_pRootObj.get()); + } + + void TearDown() override { + m_pRootObj.reset(); + m_pIndirectObjs = nullptr; + m_pDoc.reset(); + CPDF_ModuleMgr::Destroy(); + } + + std::vector CreateDictObjs(int num) { + std::vector info; + for (int i = 0; i < num; ++i) { + // Objects created will be released by the document. + CPDF_Dictionary* obj = m_pIndirectObjs->NewIndirect(); + info.push_back({obj->GetObjNum(), obj}); + } + return info; + } + + protected: + std::unique_ptr m_pDoc; + CPDF_IndirectObjectHolder* m_pIndirectObjs; + std::unique_ptr m_pRootObj; +}; + +TEST_F(PDFDocTest, FindBookmark) { + { + // No bookmark information. + std::unique_ptr title = + GetFPDFWideString(L""); + EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); + + title = GetFPDFWideString(L"Preface"); + EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); + } + { + // Empty bookmark tree. + m_pRootObj->SetNewFor("Outlines"); + std::unique_ptr title = + GetFPDFWideString(L""); + EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); + + title = GetFPDFWideString(L"Preface"); + EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); + } + { + // Check on a regular bookmark tree. + auto bookmarks = CreateDictObjs(3); + + bookmarks[1].obj->SetNewFor("Title", L"Chapter 1"); + bookmarks[1].obj->SetNewFor("Parent", m_pIndirectObjs, + bookmarks[0].num); + bookmarks[1].obj->SetNewFor("Next", m_pIndirectObjs, + bookmarks[2].num); + + bookmarks[2].obj->SetNewFor("Title", L"Chapter 2"); + bookmarks[2].obj->SetNewFor("Parent", m_pIndirectObjs, + bookmarks[0].num); + bookmarks[2].obj->SetNewFor("Prev", m_pIndirectObjs, + bookmarks[1].num); + + bookmarks[0].obj->SetNewFor("Type", "Outlines"); + bookmarks[0].obj->SetNewFor("Count", 2); + bookmarks[0].obj->SetNewFor("First", m_pIndirectObjs, + bookmarks[1].num); + bookmarks[0].obj->SetNewFor("Last", m_pIndirectObjs, + bookmarks[2].num); + + m_pRootObj->SetNewFor("Outlines", m_pIndirectObjs, + bookmarks[0].num); + + // Title with no match. + std::unique_ptr title = + GetFPDFWideString(L"Chapter 3"); + EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); + + // Title with partial match only. + title = GetFPDFWideString(L"Chapter"); + EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); + + // Title with a match. + title = GetFPDFWideString(L"Chapter 2"); + EXPECT_EQ(bookmarks[2].obj, FPDFBookmark_Find(m_pDoc.get(), title.get())); + + // Title match is case insensitive. + title = GetFPDFWideString(L"cHaPter 2"); + EXPECT_EQ(bookmarks[2].obj, FPDFBookmark_Find(m_pDoc.get(), title.get())); + } + { + // Circular bookmarks in depth. + auto bookmarks = CreateDictObjs(3); + + bookmarks[1].obj->SetNewFor("Title", L"Chapter 1"); + bookmarks[1].obj->SetNewFor("Parent", m_pIndirectObjs, + bookmarks[0].num); + bookmarks[1].obj->SetNewFor("First", m_pIndirectObjs, + bookmarks[2].num); + + bookmarks[2].obj->SetNewFor("Title", L"Chapter 2"); + bookmarks[2].obj->SetNewFor("Parent", m_pIndirectObjs, + bookmarks[1].num); + bookmarks[2].obj->SetNewFor("First", m_pIndirectObjs, + bookmarks[1].num); + + bookmarks[0].obj->SetNewFor("Type", "Outlines"); + bookmarks[0].obj->SetNewFor("Count", 2); + bookmarks[0].obj->SetNewFor("First", m_pIndirectObjs, + bookmarks[1].num); + bookmarks[0].obj->SetNewFor("Last", m_pIndirectObjs, + bookmarks[2].num); + + m_pRootObj->SetNewFor("Outlines", m_pIndirectObjs, + bookmarks[0].num); + + // Title with no match. + std::unique_ptr title = + GetFPDFWideString(L"Chapter 3"); + EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); + + // Title with a match. + title = GetFPDFWideString(L"Chapter 2"); + EXPECT_EQ(bookmarks[2].obj, FPDFBookmark_Find(m_pDoc.get(), title.get())); + } + { + // Circular bookmarks in breadth. + auto bookmarks = CreateDictObjs(4); + + bookmarks[1].obj->SetNewFor("Title", L"Chapter 1"); + bookmarks[1].obj->SetNewFor("Parent", m_pIndirectObjs, + bookmarks[0].num); + bookmarks[1].obj->SetNewFor("Next", m_pIndirectObjs, + bookmarks[2].num); + + bookmarks[2].obj->SetNewFor("Title", L"Chapter 2"); + bookmarks[2].obj->SetNewFor("Parent", m_pIndirectObjs, + bookmarks[0].num); + bookmarks[2].obj->SetNewFor("Next", m_pIndirectObjs, + bookmarks[3].num); + + bookmarks[3].obj->SetNewFor("Title", L"Chapter 3"); + bookmarks[3].obj->SetNewFor("Parent", m_pIndirectObjs, + bookmarks[0].num); + bookmarks[3].obj->SetNewFor("Next", m_pIndirectObjs, + bookmarks[1].num); + + bookmarks[0].obj->SetNewFor("Type", "Outlines"); + bookmarks[0].obj->SetNewFor("Count", 2); + bookmarks[0].obj->SetNewFor("First", m_pIndirectObjs, + bookmarks[1].num); + bookmarks[0].obj->SetNewFor("Last", m_pIndirectObjs, + bookmarks[2].num); + + m_pRootObj->SetNewFor("Outlines", m_pIndirectObjs, + bookmarks[0].num); + + // Title with no match. + std::unique_ptr title = + GetFPDFWideString(L"Chapter 8"); + EXPECT_EQ(nullptr, FPDFBookmark_Find(m_pDoc.get(), title.get())); + + // Title with a match. + title = GetFPDFWideString(L"Chapter 3"); + EXPECT_EQ(bookmarks[3].obj, FPDFBookmark_Find(m_pDoc.get(), title.get())); + } +} + +TEST_F(PDFDocTest, GetLocationInPage) { + auto array = pdfium::MakeUnique(); + array->AddNew(0); // Page Index. + array->AddNew("XYZ"); + array->AddNew(4); // X + array->AddNew(5); // Y + array->AddNew(6); // Zoom. + + FPDF_BOOL hasX; + FPDF_BOOL hasY; + FPDF_BOOL hasZoom; + FS_FLOAT x; + FS_FLOAT y; + FS_FLOAT zoom; + + EXPECT_TRUE(FPDFDest_GetLocationInPage(array.get(), &hasX, &hasY, &hasZoom, + &x, &y, &zoom)); + EXPECT_TRUE(hasX); + EXPECT_TRUE(hasY); + EXPECT_TRUE(hasZoom); + EXPECT_EQ(4, x); + EXPECT_EQ(5, y); + EXPECT_EQ(6, zoom); + + array->SetNewAt(2); + array->SetNewAt(3); + array->SetNewAt(4); + EXPECT_TRUE(FPDFDest_GetLocationInPage(array.get(), &hasX, &hasY, &hasZoom, + &x, &y, &zoom)); + EXPECT_FALSE(hasX); + EXPECT_FALSE(hasY); + EXPECT_FALSE(hasZoom); + + array = pdfium::MakeUnique(); + EXPECT_FALSE(FPDFDest_GetLocationInPage(array.get(), &hasX, &hasY, &hasZoom, + &x, &y, &zoom)); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfedit_embeddertest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfedit_embeddertest.cpp new file mode 100644 index 000000000000..53554a182231 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfedit_embeddertest.cpp @@ -0,0 +1,505 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fxcrt/fx_system.h" +#include "fpdfsdk/fsdk_define.h" +#include "public/fpdf_edit.h" +#include "public/fpdfview.h" +#include "testing/embedder_test.h" +#include "testing/gmock/include/gmock/gmock-matchers.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" + +class FPDFEditEmbeddertest : public EmbedderTest, public TestSaver {}; + +namespace { + +const char kExpectedPDF[] = + "%PDF-1.7\r\n" + "%\xA1\xB3\xC5\xD7\r\n" + "1 0 obj\r\n" + "<>\r\n" + "endobj\r\n" + "2 0 obj\r\n" + "<>\r\n" + "endobj\r\n" + "3 0 obj\r\n" + "<>\r\n" + "endobj\r\n" + "4 0 obj\r\n" + "<>/Rotate 0/Type/Page" + ">>\r\n" + "endobj\r\n" + "5 0 obj\r\n" + "<>stream\r\n" + // Character '_' is matching '\0' (see comment below). + "x\x9C\x3____\x1\r\n" + "endstream\r\n" + "endobj\r\n" + "xref\r\n" + "0 6\r\n" + "0000000000 65535 f\r\n" + "0000000017 00000 n\r\n" + "0000000066 00000 n\r\n" + "0000000122 00000 n\r\n" + "0000000192 00000 n\r\n" + "0000000301 00000 n\r\n" + "trailer\r\n" + "<<\r\n" + "/Root 1 0 R\r\n" + "/Info 3 0 R\r\n" + "/Size 6/ID\\[<.*><.*>\\]>>\r\n" + "startxref\r\n" + "379\r\n" + "%%EOF\r\n"; + +int GetBlockFromString(void* param, + unsigned long pos, + unsigned char* buf, + unsigned long size) { + std::string* new_file = static_cast(param); + if (!new_file || pos + size < pos) + return 0; + + unsigned long file_size = new_file->size(); + if (pos + size > file_size) + return 0; + + memcpy(buf, new_file->data() + pos, size); + return 1; +} + +} // namespace + +TEST_F(FPDFEditEmbeddertest, EmptyCreation) { + EXPECT_TRUE(CreateEmptyDocument()); + FPDF_PAGE page = FPDFPage_New(document(), 0, 640.0, 480.0); + EXPECT_NE(nullptr, page); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + + // The MatchesRegexp doesn't support embedded NUL ('\0') characters. They are + // replaced by '_' for the purpose of the test. + std::string result = GetString(); + std::replace(result.begin(), result.end(), '\0', '_'); + EXPECT_THAT(result, testing::MatchesRegex( + std::string(kExpectedPDF, sizeof(kExpectedPDF)))); + FPDF_ClosePage(page); +} + +// Regression test for https://crbug.com/667012 +TEST_F(FPDFEditEmbeddertest, RasterizePDF) { + const char kAllBlackMd5sum[] = "5708fc5c4a8bd0abde99c8e8f0390615"; + + // Get the bitmap for the original document/ + FPDF_BITMAP orig_bitmap; + { + EXPECT_TRUE(OpenDocument("black.pdf")); + FPDF_PAGE orig_page = LoadPage(0); + EXPECT_NE(nullptr, orig_page); + orig_bitmap = RenderPage(orig_page); + CompareBitmap(orig_bitmap, 612, 792, kAllBlackMd5sum); + UnloadPage(orig_page); + } + + // Create a new document from |orig_bitmap| and save it. + { + FPDF_DOCUMENT temp_doc = FPDF_CreateNewDocument(); + FPDF_PAGE temp_page = FPDFPage_New(temp_doc, 0, 612, 792); + + // Add the bitmap to an image object and add the image object to the output + // page. + FPDF_PAGEOBJECT temp_img = FPDFPageObj_NewImgeObj(temp_doc); + EXPECT_TRUE(FPDFImageObj_SetBitmap(&temp_page, 1, temp_img, orig_bitmap)); + EXPECT_TRUE(FPDFImageObj_SetMatrix(temp_img, 612, 0, 0, 792, 0, 0)); + FPDFPage_InsertObject(temp_page, temp_img); + EXPECT_TRUE(FPDFPage_GenerateContent(temp_page)); + EXPECT_TRUE(FPDF_SaveAsCopy(temp_doc, this, 0)); + FPDF_ClosePage(temp_page); + FPDF_CloseDocument(temp_doc); + } + FPDFBitmap_Destroy(orig_bitmap); + + // Get the generated content. Make sure it is at least as big as the original + // PDF. + std::string new_file = GetString(); + EXPECT_GT(new_file.size(), 923U); + + // Read |new_file| in, and verify its rendered bitmap. + { + FPDF_FILEACCESS file_access; + memset(&file_access, 0, sizeof(file_access)); + file_access.m_FileLen = new_file.size(); + file_access.m_GetBlock = GetBlockFromString; + file_access.m_Param = &new_file; + + FPDF_DOCUMENT new_doc = FPDF_LoadCustomDocument(&file_access, nullptr); + EXPECT_EQ(1, FPDF_GetPageCount(document_)); + FPDF_PAGE new_page = FPDF_LoadPage(new_doc, 0); + EXPECT_NE(nullptr, new_page); + FPDF_BITMAP new_bitmap = RenderPage(new_page); + CompareBitmap(new_bitmap, 612, 792, kAllBlackMd5sum); + FPDF_ClosePage(new_page); + FPDF_CloseDocument(new_doc); + FPDFBitmap_Destroy(new_bitmap); + } +} + +TEST_F(FPDFEditEmbeddertest, AddPaths) { + // Start with a blank page + FPDF_DOCUMENT doc = FPDF_CreateNewDocument(); + FPDF_PAGE page = FPDFPage_New(doc, 0, 612, 792); + + // We will first add a red rectangle + FPDF_PAGEOBJECT red_rect = FPDFPageObj_CreateNewRect(10, 10, 20, 20); + ASSERT_NE(nullptr, red_rect); + // Expect false when trying to set colors out of range + EXPECT_FALSE(FPDFPath_SetStrokeColor(red_rect, 100, 100, 100, 300)); + EXPECT_FALSE(FPDFPath_SetFillColor(red_rect, 200, 256, 200, 0)); + + // Fill rectangle with red and insert to the page + EXPECT_TRUE(FPDFPath_SetFillColor(red_rect, 255, 0, 0, 255)); + EXPECT_TRUE(FPDFPath_SetDrawMode(red_rect, FPDF_FILLMODE_ALTERNATE, 0)); + FPDFPage_InsertObject(page, red_rect); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + FPDF_BITMAP page_bitmap = RenderPage(page); + CompareBitmap(page_bitmap, 612, 792, "66d02eaa6181e2c069ce2ea99beda497"); + FPDFBitmap_Destroy(page_bitmap); + + // Now add to that a green rectangle with some medium alpha + FPDF_PAGEOBJECT green_rect = FPDFPageObj_CreateNewRect(100, 100, 40, 40); + EXPECT_TRUE(FPDFPath_SetFillColor(green_rect, 0, 255, 0, 128)); + EXPECT_TRUE(FPDFPath_SetDrawMode(green_rect, FPDF_FILLMODE_WINDING, 0)); + FPDFPage_InsertObject(page, green_rect); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + page_bitmap = RenderPage(page); + CompareBitmap(page_bitmap, 612, 792, "7b0b87604594e773add528fae567a558"); + FPDFBitmap_Destroy(page_bitmap); + + // Add a black triangle. + FPDF_PAGEOBJECT black_path = FPDFPageObj_CreateNewPath(400, 100); + EXPECT_TRUE(FPDFPath_SetFillColor(black_path, 0, 0, 0, 200)); + EXPECT_TRUE(FPDFPath_SetDrawMode(black_path, FPDF_FILLMODE_ALTERNATE, 0)); + EXPECT_TRUE(FPDFPath_LineTo(black_path, 400, 200)); + EXPECT_TRUE(FPDFPath_LineTo(black_path, 300, 100)); + EXPECT_TRUE(FPDFPath_Close(black_path)); + FPDFPage_InsertObject(page, black_path); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + page_bitmap = RenderPage(page); + CompareBitmap(page_bitmap, 612, 792, "eadc8020a14dfcf091da2688733d8806"); + FPDFBitmap_Destroy(page_bitmap); + + // Now add a more complex blue path. + FPDF_PAGEOBJECT blue_path = FPDFPageObj_CreateNewPath(200, 200); + EXPECT_TRUE(FPDFPath_SetFillColor(blue_path, 0, 0, 255, 255)); + EXPECT_TRUE(FPDFPath_SetDrawMode(blue_path, FPDF_FILLMODE_WINDING, 0)); + EXPECT_TRUE(FPDFPath_LineTo(blue_path, 230, 230)); + EXPECT_TRUE(FPDFPath_BezierTo(blue_path, 250, 250, 280, 280, 300, 300)); + EXPECT_TRUE(FPDFPath_LineTo(blue_path, 325, 325)); + EXPECT_TRUE(FPDFPath_LineTo(blue_path, 350, 325)); + EXPECT_TRUE(FPDFPath_BezierTo(blue_path, 375, 330, 390, 360, 400, 400)); + EXPECT_TRUE(FPDFPath_Close(blue_path)); + FPDFPage_InsertObject(page, blue_path); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + page_bitmap = RenderPage(page); + CompareBitmap(page_bitmap, 612, 792, "9823e1a21bd9b72b6a442ba4f12af946"); + FPDFBitmap_Destroy(page_bitmap); + + // Now save the result, closing the page and document + EXPECT_TRUE(FPDF_SaveAsCopy(doc, this, 0)); + FPDF_ClosePage(page); + FPDF_CloseDocument(doc); + std::string new_file = GetString(); + + // Render the saved result + FPDF_FILEACCESS file_access; + memset(&file_access, 0, sizeof(file_access)); + file_access.m_FileLen = new_file.size(); + file_access.m_GetBlock = GetBlockFromString; + file_access.m_Param = &new_file; + FPDF_DOCUMENT new_doc = FPDF_LoadCustomDocument(&file_access, nullptr); + ASSERT_NE(nullptr, new_doc); + EXPECT_EQ(1, FPDF_GetPageCount(new_doc)); + FPDF_PAGE new_page = FPDF_LoadPage(new_doc, 0); + ASSERT_NE(nullptr, new_page); + FPDF_BITMAP new_bitmap = RenderPage(new_page); + CompareBitmap(new_bitmap, 612, 792, "9823e1a21bd9b72b6a442ba4f12af946"); + FPDFBitmap_Destroy(new_bitmap); + FPDF_ClosePage(new_page); + FPDF_CloseDocument(new_doc); +} + +TEST_F(FPDFEditEmbeddertest, PathOnTopOfText) { + // Load document with some text + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_NE(nullptr, page); + + // Add an opaque rectangle on top of some of the text. + FPDF_PAGEOBJECT red_rect = FPDFPageObj_CreateNewRect(20, 100, 50, 50); + EXPECT_TRUE(FPDFPath_SetFillColor(red_rect, 255, 0, 0, 255)); + EXPECT_TRUE(FPDFPath_SetDrawMode(red_rect, FPDF_FILLMODE_ALTERNATE, 0)); + FPDFPage_InsertObject(page, red_rect); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + + // Add a transparent triangle on top of other part of the text. + FPDF_PAGEOBJECT black_path = FPDFPageObj_CreateNewPath(20, 50); + EXPECT_TRUE(FPDFPath_SetFillColor(black_path, 0, 0, 0, 100)); + EXPECT_TRUE(FPDFPath_SetDrawMode(black_path, FPDF_FILLMODE_ALTERNATE, 0)); + EXPECT_TRUE(FPDFPath_LineTo(black_path, 30, 80)); + EXPECT_TRUE(FPDFPath_LineTo(black_path, 40, 10)); + EXPECT_TRUE(FPDFPath_Close(black_path)); + FPDFPage_InsertObject(page, black_path); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + + // Render and check the result. Text is slightly different on Mac. + FPDF_BITMAP bitmap = RenderPage(page); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + const char md5[] = "2f7c0deee10a9490538e195af64beb67"; +#else + const char md5[] = "17c942c76ff229200f2c98073bb60d85"; +#endif + CompareBitmap(bitmap, 200, 200, md5); + FPDFBitmap_Destroy(bitmap); + UnloadPage(page); +} + +TEST_F(FPDFEditEmbeddertest, AddStrokedPaths) { + // Start with a blank page + FPDF_DOCUMENT doc = FPDF_CreateNewDocument(); + FPDF_PAGE page = FPDFPage_New(doc, 0, 612, 792); + + // Add a large stroked rectangle (fill color should not affect it). + FPDF_PAGEOBJECT rect = FPDFPageObj_CreateNewRect(20, 20, 200, 400); + EXPECT_TRUE(FPDFPath_SetFillColor(rect, 255, 0, 0, 255)); + EXPECT_TRUE(FPDFPath_SetStrokeColor(rect, 0, 255, 0, 255)); + EXPECT_TRUE(FPDFPath_SetStrokeWidth(rect, 15.0f)); + EXPECT_TRUE(FPDFPath_SetDrawMode(rect, 0, 1)); + FPDFPage_InsertObject(page, rect); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + FPDF_BITMAP page_bitmap = RenderPage(page); + CompareBitmap(page_bitmap, 612, 792, "64bd31f862a89e0a9e505a5af6efd506"); + FPDFBitmap_Destroy(page_bitmap); + + // Add crossed-checkmark + FPDF_PAGEOBJECT check = FPDFPageObj_CreateNewPath(300, 500); + EXPECT_TRUE(FPDFPath_LineTo(check, 400, 400)); + EXPECT_TRUE(FPDFPath_LineTo(check, 600, 600)); + EXPECT_TRUE(FPDFPath_MoveTo(check, 400, 600)); + EXPECT_TRUE(FPDFPath_LineTo(check, 600, 400)); + EXPECT_TRUE(FPDFPath_SetStrokeColor(check, 128, 128, 128, 180)); + EXPECT_TRUE(FPDFPath_SetStrokeWidth(check, 8.35f)); + EXPECT_TRUE(FPDFPath_SetDrawMode(check, 0, 1)); + FPDFPage_InsertObject(page, check); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + page_bitmap = RenderPage(page); + CompareBitmap(page_bitmap, 612, 792, "4b6f3b9d25c4e194821217d5016c3724"); + FPDFBitmap_Destroy(page_bitmap); + + // Add stroked and filled oval-ish path. + FPDF_PAGEOBJECT path = FPDFPageObj_CreateNewPath(250, 100); + EXPECT_TRUE(FPDFPath_BezierTo(path, 180, 166, 180, 233, 250, 300)); + EXPECT_TRUE(FPDFPath_LineTo(path, 255, 305)); + EXPECT_TRUE(FPDFPath_BezierTo(path, 325, 233, 325, 166, 255, 105)); + EXPECT_TRUE(FPDFPath_Close(path)); + EXPECT_TRUE(FPDFPath_SetFillColor(path, 200, 128, 128, 100)); + EXPECT_TRUE(FPDFPath_SetStrokeColor(path, 128, 200, 128, 150)); + EXPECT_TRUE(FPDFPath_SetStrokeWidth(path, 10.5f)); + EXPECT_TRUE(FPDFPath_SetDrawMode(path, FPDF_FILLMODE_ALTERNATE, 1)); + FPDFPage_InsertObject(page, path); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + page_bitmap = RenderPage(page); + CompareBitmap(page_bitmap, 612, 792, "ff3e6a22326754944cc6e56609acd73b"); + FPDFBitmap_Destroy(page_bitmap); + FPDF_ClosePage(page); + FPDF_CloseDocument(doc); +} + +TEST_F(FPDFEditEmbeddertest, AddStandardFontText) { + // Start with a blank page + FPDF_DOCUMENT doc = FPDF_CreateNewDocument(); + FPDF_PAGE page = FPDFPage_New(doc, 0, 612, 792); + + // Add some text to the page + FPDF_PAGEOBJECT text1 = FPDFPageObj_NewTextObj(doc, "Arial", 12.0f); + EXPECT_TRUE(text1); + EXPECT_TRUE(FPDFText_SetText(text1, "I'm at the bottom of the page")); + FPDFPageObj_Transform(text1, 1, 0, 0, 1, 20, 20); + FPDFPage_InsertObject(page, text1); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + FPDF_BITMAP page_bitmap = RenderPage(page); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + const char md5[] = "e19c90395d73cb9f37a6c3b0e8b18a9e"; +#else + const char md5[] = "7c3a36ba7cec01688a16a14bfed9ecfc"; +#endif + CompareBitmap(page_bitmap, 612, 792, md5); + FPDFBitmap_Destroy(page_bitmap); + + // Try another font + FPDF_PAGEOBJECT text2 = + FPDFPageObj_NewTextObj(doc, "TimesNewRomanBold", 15.0f); + EXPECT_TRUE(text2); + EXPECT_TRUE(FPDFText_SetText(text2, "Hi, I'm Bold. Times New Roman Bold.")); + FPDFPageObj_Transform(text2, 1, 0, 0, 1, 100, 600); + FPDFPage_InsertObject(page, text2); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + page_bitmap = RenderPage(page); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + const char md5_2[] = "8e1c43dca6be68d364dbc283f5521041"; +#else + const char md5_2[] = "e0e0873e3a2634a6394a431a51ce90ff"; +#endif + CompareBitmap(page_bitmap, 612, 792, md5_2); + FPDFBitmap_Destroy(page_bitmap); + + // And some randomly transformed text + FPDF_PAGEOBJECT text3 = FPDFPageObj_NewTextObj(doc, "Courier-Bold", 20.0f); + EXPECT_TRUE(text3); + EXPECT_TRUE(FPDFText_SetText(text3, "Can you read me? <:)>")); + FPDFPageObj_Transform(text3, 1, 1.5, 2, 0.5, 200, 200); + FPDFPage_InsertObject(page, text3); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + page_bitmap = RenderPage(page); +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + const char md5_3[] = "c6e5df448428793c7e4b0c820bd8c85e"; +#else + const char md5_3[] = "903ee10b6a9f0be51ecad0a1a0eeb171"; +#endif + CompareBitmap(page_bitmap, 612, 792, md5_3); + FPDFBitmap_Destroy(page_bitmap); + + // TODO(npm): Why are there issues with text rotated by 90 degrees? + // TODO(npm): FPDF_SaveAsCopy not giving the desired result after this. + FPDF_ClosePage(page); + FPDF_CloseDocument(doc); +} + +TEST_F(FPDFEditEmbeddertest, DoubleGenerating) { + // Start with a blank page + FPDF_DOCUMENT doc = FPDF_CreateNewDocument(); + FPDF_PAGE page = FPDFPage_New(doc, 0, 612, 792); + + // Add a red rectangle with some non-default alpha + FPDF_PAGEOBJECT rect = FPDFPageObj_CreateNewRect(10, 10, 100, 100); + EXPECT_TRUE(FPDFPath_SetFillColor(rect, 255, 0, 0, 128)); + EXPECT_TRUE(FPDFPath_SetDrawMode(rect, FPDF_FILLMODE_WINDING, 0)); + FPDFPage_InsertObject(page, rect); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + + // Check the ExtGState + CPDF_Page* the_page = CPDFPageFromFPDFPage(page); + CPDF_Dictionary* graphics_dict = + the_page->m_pResources->GetDictFor("ExtGState"); + ASSERT_TRUE(graphics_dict); + EXPECT_EQ(1, static_cast(graphics_dict->GetCount())); + + // Check the bitmap + FPDF_BITMAP page_bitmap = RenderPage(page); + CompareBitmap(page_bitmap, 612, 792, "5384da3406d62360ffb5cac4476fff1c"); + FPDFBitmap_Destroy(page_bitmap); + + // Never mind, my new favorite color is blue, increase alpha + EXPECT_TRUE(FPDFPath_SetFillColor(rect, 0, 0, 255, 180)); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + EXPECT_EQ(2, static_cast(graphics_dict->GetCount())); + + // Check that bitmap displays changed content + page_bitmap = RenderPage(page); + CompareBitmap(page_bitmap, 612, 792, "2e51656f5073b0bee611d9cd086aa09c"); + FPDFBitmap_Destroy(page_bitmap); + + // And now generate, without changes + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + EXPECT_EQ(2, static_cast(graphics_dict->GetCount())); + page_bitmap = RenderPage(page); + CompareBitmap(page_bitmap, 612, 792, "2e51656f5073b0bee611d9cd086aa09c"); + FPDFBitmap_Destroy(page_bitmap); + + // Add some text to the page + FPDF_PAGEOBJECT text = FPDFPageObj_NewTextObj(doc, "Arial", 12.0f); + EXPECT_TRUE(FPDFText_SetText(text, "Something something #text# something")); + FPDFPageObj_Transform(text, 1, 0, 0, 1, 300, 300); + FPDFPage_InsertObject(page, text); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + CPDF_Dictionary* font_dict = the_page->m_pResources->GetDictFor("Font"); + ASSERT_TRUE(font_dict); + EXPECT_EQ(1, static_cast(font_dict->GetCount())); + + // Generate yet again, check dicts are reasonably sized + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + EXPECT_EQ(2, static_cast(graphics_dict->GetCount())); + EXPECT_EQ(1, static_cast(font_dict->GetCount())); + FPDF_ClosePage(page); + FPDF_CloseDocument(doc); +} + +TEST_F(FPDFEditEmbeddertest, Type1Font) { + // Create a new document + FPDF_DOCUMENT doc = FPDF_CreateNewDocument(); + CPDF_Document* document = reinterpret_cast(doc); + + // Get Times New Roman Bold as a Type 1 font + CPDF_Font* times_bold = CPDF_Font::GetStockFont(document, "Times-Bold"); + uint8_t* data = times_bold->m_Font.GetFontData(); + uint32_t size = times_bold->m_Font.GetSize(); + FPDF_FONT font = FPDFText_LoadType1Font(doc, data, size); + ASSERT_TRUE(font); + CPDF_Font* type1_font = reinterpret_cast(font); + EXPECT_TRUE(type1_font->IsType1Font()); + + // Check that the font dictionary has the required keys according to the spec + CPDF_Dictionary* font_dict = type1_font->GetFontDict(); + EXPECT_EQ("Font", font_dict->GetStringFor("Type")); + EXPECT_EQ("Type1", font_dict->GetStringFor("Subtype")); + EXPECT_EQ("Times New Roman Bold", font_dict->GetStringFor("BaseFont")); + ASSERT_TRUE(font_dict->KeyExist("FirstChar")); + ASSERT_TRUE(font_dict->KeyExist("LastChar")); + EXPECT_EQ(32, font_dict->GetIntegerFor("FirstChar")); + EXPECT_EQ(65532, font_dict->GetIntegerFor("LastChar")); + ASSERT_TRUE(font_dict->KeyExist("Widths")); + CPDF_Array* widths_array = font_dict->GetArrayFor("Widths"); + EXPECT_EQ(65501U, widths_array->GetCount()); + EXPECT_EQ(250, widths_array->GetNumberAt(0)); + EXPECT_EQ(0, widths_array->GetNumberAt(8172)); + EXPECT_EQ(1000, widths_array->GetNumberAt(65500)); + ASSERT_TRUE(font_dict->KeyExist("FontDescriptor")); + CPDF_Dictionary* font_desc = font_dict->GetDictFor("FontDescriptor"); + EXPECT_EQ("FontDescriptor", font_desc->GetStringFor("Type")); + EXPECT_EQ(font_dict->GetStringFor("BaseFont"), + font_desc->GetStringFor("FontName")); + + // Check that the font descriptor has the required keys according to the spec + ASSERT_TRUE(font_desc->KeyExist("Flags")); + int font_flags = font_desc->GetIntegerFor("Flags"); + EXPECT_TRUE(font_flags & FXFONT_BOLD); + EXPECT_TRUE(font_flags & FXFONT_NONSYMBOLIC); + ASSERT_TRUE(font_desc->KeyExist("FontBBox")); + EXPECT_EQ(4U, font_desc->GetArrayFor("FontBBox")->GetCount()); + EXPECT_TRUE(font_desc->KeyExist("ItalicAngle")); + EXPECT_TRUE(font_desc->KeyExist("Ascent")); + EXPECT_TRUE(font_desc->KeyExist("Descent")); + EXPECT_TRUE(font_desc->KeyExist("CapHeight")); + EXPECT_TRUE(font_desc->KeyExist("StemV")); + ASSERT_TRUE(font_desc->KeyExist("FontFile")); + + // Check that the font stream is the one that was provided + CPDF_Stream* font_stream = font_desc->GetStreamFor("FontFile"); + ASSERT_EQ(size, font_stream->GetRawSize()); + uint8_t* stream_data = font_stream->GetRawData(); + for (size_t i = 0; i < size; i++) + EXPECT_EQ(data[i], stream_data[i]); + + // Close document + FPDF_CloseDocument(doc); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfeditimg.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfeditimg.cpp new file mode 100644 index 000000000000..56875e233e13 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfeditimg.cpp @@ -0,0 +1,105 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_edit.h" + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/page/cpdf_image.h" +#include "core/fpdfapi/page/cpdf_imageobject.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "fpdfsdk/fsdk_define.h" +#include "third_party/base/ptr_util.h" + +DLLEXPORT FPDF_PAGEOBJECT STDCALL +FPDFPageObj_NewImgeObj(FPDF_DOCUMENT document) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return nullptr; + + CPDF_ImageObject* pImageObj = new CPDF_ImageObject; + pImageObj->SetOwnedImage(pdfium::MakeUnique(pDoc)); + return pImageObj; +} + +FPDF_BOOL FPDFImageObj_LoadJpegHelper(FPDF_PAGE* pages, + int nCount, + FPDF_PAGEOBJECT image_object, + FPDF_FILEACCESS* fileAccess, + bool inlineJpeg) { + if (!image_object || !fileAccess || !pages) + return false; + + CFX_RetainPtr pFile = + MakeSeekableReadStream(fileAccess); + CPDF_ImageObject* pImgObj = reinterpret_cast(image_object); + for (int index = 0; index < nCount; index++) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(pages[index]); + if (pPage) + pImgObj->GetImage()->ResetCache(pPage, nullptr); + } + + if (inlineJpeg) + pImgObj->GetImage()->SetJpegImageInline(pFile); + else + pImgObj->GetImage()->SetJpegImage(pFile); + + return true; +} + +DLLEXPORT FPDF_BOOL STDCALL +FPDFImageObj_LoadJpegFile(FPDF_PAGE* pages, + int nCount, + FPDF_PAGEOBJECT image_object, + FPDF_FILEACCESS* fileAccess) { + return FPDFImageObj_LoadJpegHelper(pages, nCount, image_object, fileAccess, + false); +} + +DLLEXPORT FPDF_BOOL STDCALL +FPDFImageObj_LoadJpegFileInline(FPDF_PAGE* pages, + int nCount, + FPDF_PAGEOBJECT image_object, + FPDF_FILEACCESS* fileAccess) { + return FPDFImageObj_LoadJpegHelper(pages, nCount, image_object, fileAccess, + true); +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetMatrix(FPDF_PAGEOBJECT image_object, + double a, + double b, + double c, + double d, + double e, + double f) { + if (!image_object) + return false; + + CPDF_ImageObject* pImgObj = reinterpret_cast(image_object); + pImgObj->set_matrix( + CFX_Matrix(static_cast(a), static_cast(b), + static_cast(c), static_cast(d), + static_cast(e), static_cast(f))); + pImgObj->CalcBoundingBox(); + return true; +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetBitmap(FPDF_PAGE* pages, + int nCount, + FPDF_PAGEOBJECT image_object, + FPDF_BITMAP bitmap) { + if (!image_object || !bitmap || !pages) + return false; + + CPDF_ImageObject* pImgObj = reinterpret_cast(image_object); + for (int index = 0; index < nCount; index++) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(pages[index]); + if (pPage) + pImgObj->GetImage()->ResetCache(pPage, nullptr); + } + pImgObj->GetImage()->SetImage(reinterpret_cast(bitmap)); + pImgObj->CalcBoundingBox(); + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfeditimg_unittest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfeditimg_unittest.cpp new file mode 100644 index 000000000000..ae4af2591e00 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfeditimg_unittest.cpp @@ -0,0 +1,74 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/fpdf_edit.h" + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "testing/gtest/include/gtest/gtest.h" + +class PDFEditTest : public testing::Test { + void SetUp() override { + CPDF_ModuleMgr* module_mgr = CPDF_ModuleMgr::Get(); + module_mgr->InitPageModule(); + } + + void TearDown() override { CPDF_ModuleMgr::Destroy(); } +}; + +TEST_F(PDFEditTest, InsertObjectWithInvalidPage) { + FPDF_DOCUMENT doc = FPDF_CreateNewDocument(); + FPDF_PAGE page = FPDFPage_New(doc, 0, 100, 100); + EXPECT_EQ(0, FPDFPage_CountObject(page)); + + FPDFPage_InsertObject(nullptr, nullptr); + EXPECT_EQ(0, FPDFPage_CountObject(page)); + + FPDFPage_InsertObject(page, nullptr); + EXPECT_EQ(0, FPDFPage_CountObject(page)); + + FPDF_PAGEOBJECT page_image = FPDFPageObj_NewImgeObj(doc); + FPDFPage_InsertObject(nullptr, page_image); + EXPECT_EQ(0, FPDFPage_CountObject(page)); + + FPDF_ClosePage(page); + FPDF_CloseDocument(doc); +} + +TEST_F(PDFEditTest, NewImgeObj) { + FPDF_DOCUMENT doc = FPDF_CreateNewDocument(); + FPDF_PAGE page = FPDFPage_New(doc, 0, 100, 100); + EXPECT_EQ(0, FPDFPage_CountObject(page)); + + FPDF_PAGEOBJECT page_image = FPDFPageObj_NewImgeObj(doc); + FPDFPage_InsertObject(page, page_image); + EXPECT_EQ(1, FPDFPage_CountObject(page)); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + + FPDF_ClosePage(page); + FPDF_CloseDocument(doc); +} + +TEST_F(PDFEditTest, NewImgeObjGenerateContent) { + FPDF_DOCUMENT doc = FPDF_CreateNewDocument(); + FPDF_PAGE page = FPDFPage_New(doc, 0, 100, 100); + EXPECT_EQ(0, FPDFPage_CountObject(page)); + + constexpr int kBitmapSize = 50; + FPDF_BITMAP bitmap = FPDFBitmap_Create(kBitmapSize, kBitmapSize, 0); + FPDFBitmap_FillRect(bitmap, 0, 0, kBitmapSize, kBitmapSize, 0x00000000); + EXPECT_EQ(kBitmapSize, FPDFBitmap_GetWidth(bitmap)); + EXPECT_EQ(kBitmapSize, FPDFBitmap_GetHeight(bitmap)); + + FPDF_PAGEOBJECT page_image = FPDFPageObj_NewImgeObj(doc); + ASSERT_TRUE(FPDFImageObj_SetBitmap(&page, 0, page_image, bitmap)); + ASSERT_TRUE( + FPDFImageObj_SetMatrix(page_image, kBitmapSize, 0, 0, kBitmapSize, 0, 0)); + FPDFPage_InsertObject(page, page_image); + EXPECT_EQ(1, FPDFPage_CountObject(page)); + EXPECT_TRUE(FPDFPage_GenerateContent(page)); + + FPDFBitmap_Destroy(bitmap); + FPDF_ClosePage(page); + FPDF_CloseDocument(doc); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfeditpage.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfeditpage.cpp new file mode 100644 index 000000000000..63740ba083f9 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfeditpage.cpp @@ -0,0 +1,315 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_edit.h" + +#include +#include +#include + +#include "core/fpdfapi/edit/cpdf_pagecontentgenerator.h" +#include "core/fpdfapi/page/cpdf_form.h" +#include "core/fpdfapi/page/cpdf_formobject.h" +#include "core/fpdfapi/page/cpdf_imageobject.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/cpdf_pathobject.h" +#include "core/fpdfapi/page/cpdf_shadingobject.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfdoc/cpdf_annot.h" +#include "core/fpdfdoc/cpdf_annotlist.h" +#include "fpdfsdk/fsdk_define.h" +#include "public/fpdf_formfill.h" +#include "third_party/base/stl_util.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" +#endif // PDF_ENABLE_XFA + +#if _FX_OS_ == _FX_ANDROID_ +#include +#else +#include +#endif + +namespace { + +static_assert(FPDF_PAGEOBJ_TEXT == CPDF_PageObject::TEXT, + "FPDF_PAGEOBJ_TEXT/CPDF_PageObject::TEXT mismatch"); +static_assert(FPDF_PAGEOBJ_PATH == CPDF_PageObject::PATH, + "FPDF_PAGEOBJ_PATH/CPDF_PageObject::PATH mismatch"); +static_assert(FPDF_PAGEOBJ_IMAGE == CPDF_PageObject::IMAGE, + "FPDF_PAGEOBJ_IMAGE/CPDF_PageObject::IMAGE mismatch"); +static_assert(FPDF_PAGEOBJ_SHADING == CPDF_PageObject::SHADING, + "FPDF_PAGEOBJ_SHADING/CPDF_PageObject::SHADING mismatch"); +static_assert(FPDF_PAGEOBJ_FORM == CPDF_PageObject::FORM, + "FPDF_PAGEOBJ_FORM/CPDF_PageObject::FORM mismatch"); + +bool IsPageObject(CPDF_Page* pPage) { + if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")) + return false; + + CPDF_Object* pObject = pPage->m_pFormDict->GetObjectFor("Type")->GetDirect(); + return pObject && !pObject->GetString().Compare("Page"); +} + +} // namespace + +DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_CreateNewDocument() { + CPDF_Document* pDoc = new CPDF_Document(nullptr); + pDoc->CreateNewDoc(); + time_t currentTime; + + CFX_ByteString DateStr; + + if (FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) { + if (-1 != time(¤tTime)) { + tm* pTM = localtime(¤tTime); + if (pTM) { + DateStr.Format("D:%04d%02d%02d%02d%02d%02d", pTM->tm_year + 1900, + pTM->tm_mon + 1, pTM->tm_mday, pTM->tm_hour, pTM->tm_min, + pTM->tm_sec); + } + } + } + + CPDF_Dictionary* pInfoDict = nullptr; + pInfoDict = pDoc->GetInfo(); + if (pInfoDict) { + if (FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) + pInfoDict->SetNewFor("CreationDate", DateStr, false); + pInfoDict->SetNewFor("Creator", L"PDFium"); + } + + return FPDFDocumentFromCPDFDocument(pDoc); +} + +DLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index) { + if (UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document)) + pDoc->DeletePage(page_index); +} + +DLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, + int page_index, + double width, + double height) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return nullptr; + + page_index = std::min(std::max(page_index, 0), pDoc->GetPageCount()); + CPDF_Dictionary* pPageDict = pDoc->CreateNewPage(page_index); + if (!pPageDict) + return nullptr; + + CPDF_Array* pMediaBoxArray = pPageDict->SetNewFor("MediaBox"); + pMediaBoxArray->AddNew(0); + pMediaBoxArray->AddNew(0); + pMediaBoxArray->AddNew(static_cast(width)); + pMediaBoxArray->AddNew(static_cast(height)); + pPageDict->SetNewFor("Rotate", 0); + pPageDict->SetNewFor("Resources"); + +#ifdef PDF_ENABLE_XFA + CPDFXFA_Page* pPage = + new CPDFXFA_Page(static_cast(document), page_index); + pPage->LoadPDFPage(pPageDict); +#else // PDF_ENABLE_XFA + CPDF_Page* pPage = new CPDF_Page(pDoc, pPageDict, true); + pPage->ParseContent(); +#endif // PDF_ENABLE_XFA + + return pPage; +} + +DLLEXPORT int STDCALL FPDFPage_GetRotation(FPDF_PAGE page) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!IsPageObject(pPage)) + return -1; + + CPDF_Dictionary* pDict = pPage->m_pFormDict; + while (pDict) { + if (pDict->KeyExist("Rotate")) { + CPDF_Object* pRotateObj = pDict->GetObjectFor("Rotate")->GetDirect(); + return pRotateObj ? pRotateObj->GetInteger() / 90 : 0; + } + if (!pDict->KeyExist("Parent")) + break; + + pDict = ToDictionary(pDict->GetObjectFor("Parent")->GetDirect()); + } + + return 0; +} + +DLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, + FPDF_PAGEOBJECT page_obj) { + CPDF_PageObject* pPageObj = reinterpret_cast(page_obj); + if (!pPageObj) + return; + + std::unique_ptr pPageObjHolder(pPageObj); + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!IsPageObject(pPage)) + return; + + pPage->GetPageObjectList()->push_back(std::move(pPageObjHolder)); + switch (pPageObj->GetType()) { + case CPDF_PageObject::TEXT: { + break; + } + case CPDF_PageObject::PATH: { + CPDF_PathObject* pPathObj = pPageObj->AsPath(); + pPathObj->CalcBoundingBox(); + break; + } + case CPDF_PageObject::IMAGE: { + CPDF_ImageObject* pImageObj = pPageObj->AsImage(); + pImageObj->CalcBoundingBox(); + break; + } + case CPDF_PageObject::SHADING: { + CPDF_ShadingObject* pShadingObj = pPageObj->AsShading(); + pShadingObj->CalcBoundingBox(); + break; + } + case CPDF_PageObject::FORM: { + CPDF_FormObject* pFormObj = pPageObj->AsForm(); + pFormObj->CalcBoundingBox(); + break; + } + default: { + ASSERT(false); + break; + } + } +} + +DLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!IsPageObject(pPage)) + return -1; + return pdfium::CollectionSize(*pPage->GetPageObjectList()); +} + +DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, + int index) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!IsPageObject(pPage)) + return nullptr; + return pPage->GetPageObjectList()->GetPageObjectByIndex(index); +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + return pPage && pPage->BackgroundAlphaNeeded(); +} + +DLLEXPORT FPDF_BOOL STDCALL +FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject) { + if (!pageObject) + return false; + + CPDF_PageObject* pPageObj = reinterpret_cast(pageObject); + int blend_type = pPageObj->m_GeneralState.GetBlendType(); + if (blend_type != FXDIB_BLEND_NORMAL) + return true; + + CPDF_Dictionary* pSMaskDict = + ToDictionary(pPageObj->m_GeneralState.GetSoftMask()); + if (pSMaskDict) + return true; + + if (pPageObj->m_GeneralState.GetFillAlpha() != 1.0f) + return true; + + if (pPageObj->IsPath() && pPageObj->m_GeneralState.GetStrokeAlpha() != 1.0f) { + return true; + } + + if (pPageObj->IsForm()) { + const CPDF_Form* pForm = pPageObj->AsForm()->form(); + if (pForm) { + int trans = pForm->m_Transparency; + if ((trans & PDFTRANS_ISOLATED) || (trans & PDFTRANS_GROUP)) + return true; + } + } + + return false; +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GenerateContent(FPDF_PAGE page) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!IsPageObject(pPage)) + return false; + + CPDF_PageContentGenerator CG(pPage); + CG.GenerateContent(); + return true; +} + +DLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object, + double a, + double b, + double c, + double d, + double e, + double f) { + CPDF_PageObject* pPageObj = reinterpret_cast(page_object); + if (!pPageObj) + return; + + CFX_Matrix matrix((FX_FLOAT)a, (FX_FLOAT)b, (FX_FLOAT)c, (FX_FLOAT)d, + (FX_FLOAT)e, (FX_FLOAT)f); + pPageObj->Transform(matrix); +} + +DLLEXPORT void STDCALL FPDFPage_TransformAnnots(FPDF_PAGE page, + double a, + double b, + double c, + double d, + double e, + double f) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return; + + CPDF_AnnotList AnnotList(pPage); + for (size_t i = 0; i < AnnotList.Count(); ++i) { + CPDF_Annot* pAnnot = AnnotList.GetAt(i); + CFX_FloatRect rect = pAnnot->GetRect(); // transformAnnots Rectangle + CFX_Matrix matrix((FX_FLOAT)a, (FX_FLOAT)b, (FX_FLOAT)c, (FX_FLOAT)d, + (FX_FLOAT)e, (FX_FLOAT)f); + matrix.TransformRect(rect); + + CPDF_Array* pRectArray = pAnnot->GetAnnotDict()->GetArrayFor("Rect"); + if (!pRectArray) + pRectArray = pAnnot->GetAnnotDict()->SetNewFor("Rect"); + + pRectArray->SetNewAt(0, rect.left); + pRectArray->SetNewAt(1, rect.bottom); + pRectArray->SetNewAt(2, rect.right); + pRectArray->SetNewAt(3, rect.top); + + // TODO(unknown): Transform AP's rectangle + } +} + +DLLEXPORT void STDCALL FPDFPage_SetRotation(FPDF_PAGE page, int rotate) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!IsPageObject(pPage)) + return; + + CPDF_Dictionary* pDict = pPage->m_pFormDict; + rotate %= 4; + pDict->SetNewFor("Rotate", rotate * 90); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfeditpath.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfeditpath.cpp new file mode 100644 index 000000000000..074f083bb182 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfeditpath.cpp @@ -0,0 +1,132 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/fpdf_edit.h" + +#include "core/fpdfapi/page/cpdf_path.h" +#include "core/fpdfapi/page/cpdf_pathobject.h" +#include "core/fxcrt/fx_system.h" + +DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_CreateNewPath(float x, float y) { + CPDF_PathObject* pPathObj = new CPDF_PathObject; + pPathObj->m_Path.AppendPoint(CFX_PointF(x, y), FXPT_TYPE::MoveTo, false); + pPathObj->DefaultStates(); + return pPathObj; +} + +DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_CreateNewRect(float x, + float y, + float w, + float h) { + CPDF_PathObject* pPathObj = new CPDF_PathObject; + pPathObj->m_Path.AppendRect(x, y, x + w, y + h); + pPathObj->DefaultStates(); + return pPathObj; +} + +DLLEXPORT FPDF_BOOL FPDFPath_SetStrokeColor(FPDF_PAGEOBJECT path, + unsigned int R, + unsigned int G, + unsigned int B, + unsigned int A) { + if (!path || R > 255 || G > 255 || B > 255 || A > 255) + return false; + + auto pPathObj = reinterpret_cast(path); + pPathObj->m_GeneralState.SetStrokeAlpha(A / 255.f); + FX_FLOAT rgb[3] = {R / 255.f, G / 255.f, B / 255.f}; + pPathObj->m_ColorState.SetStrokeColor( + CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3); + return true; +} + +DLLEXPORT FPDF_BOOL FPDFPath_SetStrokeWidth(FPDF_PAGEOBJECT path, float width) { + if (!path || width < 0.0f) + return false; + + auto pPathObj = reinterpret_cast(path); + pPathObj->m_GraphState.SetLineWidth(width); + return true; +} + +DLLEXPORT FPDF_BOOL FPDFPath_SetFillColor(FPDF_PAGEOBJECT path, + unsigned int R, + unsigned int G, + unsigned int B, + unsigned int A) { + if (!path || R > 255 || G > 255 || B > 255 || A > 255) + return false; + + auto pPathObj = reinterpret_cast(path); + pPathObj->m_GeneralState.SetFillAlpha(A / 255.f); + FX_FLOAT rgb[3] = {R / 255.f, G / 255.f, B / 255.f}; + pPathObj->m_ColorState.SetFillColor( + CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3); + return true; +} + +DLLEXPORT FPDF_BOOL FPDFPath_MoveTo(FPDF_PAGEOBJECT path, float x, float y) { + if (!path) + return false; + + auto pPathObj = reinterpret_cast(path); + pPathObj->m_Path.AppendPoint(CFX_PointF(x, y), FXPT_TYPE::MoveTo, false); + return true; +} + +DLLEXPORT FPDF_BOOL FPDFPath_LineTo(FPDF_PAGEOBJECT path, float x, float y) { + if (!path) + return false; + + auto pPathObj = reinterpret_cast(path); + pPathObj->m_Path.AppendPoint(CFX_PointF(x, y), FXPT_TYPE::LineTo, false); + return true; +} + +DLLEXPORT FPDF_BOOL FPDFPath_BezierTo(FPDF_PAGEOBJECT path, + float x1, + float y1, + float x2, + float y2, + float x3, + float y3) { + if (!path) + return false; + + auto pPathObj = reinterpret_cast(path); + pPathObj->m_Path.AppendPoint(CFX_PointF(x1, y1), FXPT_TYPE::BezierTo, false); + pPathObj->m_Path.AppendPoint(CFX_PointF(x2, y2), FXPT_TYPE::BezierTo, false); + pPathObj->m_Path.AppendPoint(CFX_PointF(x3, y3), FXPT_TYPE::BezierTo, false); + return true; +} + +DLLEXPORT FPDF_BOOL FPDFPath_Close(FPDF_PAGEOBJECT path) { + if (!path) + return false; + + auto pPathObj = reinterpret_cast(path); + if (pPathObj->m_Path.GetPoints().empty()) + return false; + + pPathObj->m_Path.ClosePath(); + return true; +} + +DLLEXPORT FPDF_BOOL FPDFPath_SetDrawMode(FPDF_PAGEOBJECT path, + int fillmode, + FPDF_BOOL stroke) { + if (!path) + return false; + + auto pPathObj = reinterpret_cast(path); + + if (fillmode == FPDF_FILLMODE_ALTERNATE) + pPathObj->m_FillType = FXFILL_ALTERNATE; + else if (fillmode == FPDF_FILLMODE_WINDING) + pPathObj->m_FillType = FXFILL_WINDING; + else + pPathObj->m_FillType = 0; + pPathObj->m_bStroke = stroke != 0; + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfedittext.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfedittext.cpp new file mode 100644 index 000000000000..8bf0a0ac4674 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfedittext.cpp @@ -0,0 +1,132 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/font/cpdf_type1font.h" +#include "core/fpdfapi/page/cpdf_textobject.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fxge/cfx_fontmgr.h" +#include "core/fxge/fx_font.h" +#include "fpdfsdk/fsdk_define.h" +#include "public/fpdf_edit.h" + +DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_NewTextObj(FPDF_DOCUMENT document, + FPDF_BYTESTRING font, + float font_size) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return nullptr; + + CPDF_Font* pFont = CPDF_Font::GetStockFont(pDoc, CFX_ByteStringC(font)); + if (!pFont) + return nullptr; + + CPDF_TextObject* pTextObj = new CPDF_TextObject; + pTextObj->m_TextState.SetFont(pFont); + pTextObj->m_TextState.SetFontSize(font_size); + pTextObj->DefaultStates(); + return pTextObj; +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFText_SetText(FPDF_PAGEOBJECT text_object, + FPDF_BYTESTRING text) { + if (!text_object) + return false; + + auto pTextObj = reinterpret_cast(text_object); + pTextObj->SetText(CFX_ByteString(text)); + return true; +} + +DLLEXPORT FPDF_FONT STDCALL FPDFText_LoadType1Font(FPDF_DOCUMENT document, + const uint8_t* data, + uint32_t size) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc || !data || size == 0) + return nullptr; + + auto pFont = pdfium::MakeUnique(); + + // TODO(npm): Maybe use FT_Get_X11_Font_Format to check format? + if (!pFont->LoadEmbedded(data, size)) + return nullptr; + + CPDF_Dictionary* fontDict = pDoc->NewIndirect(); + fontDict->SetNewFor("Type", "Font"); + fontDict->SetNewFor("Subtype", "Type1"); + CFX_ByteString name = pFont->GetFaceName(); + if (name.IsEmpty()) + name = "Unnamed"; + fontDict->SetNewFor("BaseFont", name); + + uint32_t glyphIndex; + int currentChar = FXFT_Get_First_Char(pFont->GetFace(), &glyphIndex); + fontDict->SetNewFor("FirstChar", currentChar); + int nextChar; + CPDF_Array* widthsArray = pDoc->NewIndirect(); + while (true) { + int width = pFont->GetGlyphWidth(glyphIndex); + widthsArray->AddNew(width); + nextChar = FXFT_Get_Next_Char(pFont->GetFace(), currentChar, &glyphIndex); + if (glyphIndex == 0) + break; + for (int i = currentChar + 1; i < nextChar; i++) + widthsArray->AddNew(0); + currentChar = nextChar; + } + fontDict->SetNewFor("LastChar", currentChar); + fontDict->SetNewFor("Widths", pDoc, widthsArray->GetObjNum()); + CPDF_Dictionary* fontDesc = pDoc->NewIndirect(); + fontDesc->SetNewFor("Type", "FontDescriptor"); + fontDesc->SetNewFor("FontName", name); + int flags = 0; + if (FXFT_Is_Face_fixedwidth(pFont->GetFace())) + flags |= FXFONT_FIXED_PITCH; + if (name.Find("Serif") > -1) + flags |= FXFONT_SERIF; + if (FXFT_Is_Face_Italic(pFont->GetFace())) + flags |= FXFONT_ITALIC; + if (FXFT_Is_Face_Bold(pFont->GetFace())) + flags |= FXFONT_BOLD; + + // TODO(npm): How do I know if a Type1 font is symbolic, script, allcap, + // smallcap + flags |= FXFONT_NONSYMBOLIC; + + fontDesc->SetNewFor("Flags", flags); + FX_RECT bbox; + pFont->GetBBox(bbox); + auto pBBox = pdfium::MakeUnique(); + pBBox->AddNew(bbox.left); + pBBox->AddNew(bbox.bottom); + pBBox->AddNew(bbox.right); + pBBox->AddNew(bbox.top); + fontDesc->SetFor("FontBBox", std::move(pBBox)); + + // TODO(npm): calculate italic angle correctly + fontDesc->SetNewFor("ItalicAngle", pFont->IsItalic() ? -12 : 0); + + fontDesc->SetNewFor("Ascent", pFont->GetAscent()); + fontDesc->SetNewFor("Descent", pFont->GetDescent()); + + // TODO(npm): calculate the capheight, stemV correctly + fontDesc->SetNewFor("CapHeight", pFont->GetAscent()); + fontDesc->SetNewFor("StemV", pFont->IsBold() ? 120 : 70); + + CPDF_Stream* pStream = pDoc->NewIndirect(); + pStream->SetData(data, size); + fontDesc->SetNewFor("FontFile", pDoc, pStream->GetObjNum()); + fontDict->SetNewFor("FontDescriptor", pDoc, + fontDesc->GetObjNum()); + return pDoc->LoadFont(fontDict); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfext_embeddertest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfext_embeddertest.cpp new file mode 100644 index 000000000000..7c28c29a8efc --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfext_embeddertest.cpp @@ -0,0 +1,24 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/fpdf_ext.h" +#include "public/fpdfview.h" +#include "testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +class FPDFExtEmbeddertest : public EmbedderTest {}; + +TEST_F(FPDFExtEmbeddertest, PageModeUnknown) { + EXPECT_EQ(PAGEMODE_UNKNOWN, FPDFDoc_GetPageMode(nullptr)); +} + +TEST_F(FPDFExtEmbeddertest, PageModeUseNone) { + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + EXPECT_EQ(PAGEMODE_USENONE, FPDFDoc_GetPageMode(document())); +} + +TEST_F(FPDFExtEmbeddertest, PageModeUseOutlines) { + EXPECT_TRUE(OpenDocument("use_outlines.pdf")); + EXPECT_EQ(PAGEMODE_USEOUTLINES, FPDFDoc_GetPageMode(document())); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfformfill.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfformfill.cpp new file mode 100644 index 000000000000..57ff6b669c9f --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfformfill.cpp @@ -0,0 +1,749 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_formfill.h" + +#include +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fpdfdoc/cpdf_formcontrol.h" +#include "core/fpdfdoc/cpdf_formfield.h" +#include "core/fpdfdoc/cpdf_interform.h" +#include "core/fpdfdoc/cpdf_occontext.h" +#include "core/fxge/cfx_fxgedevice.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/fsdk_actionhandler.h" +#include "fpdfsdk/fsdk_define.h" +#include "public/fpdfview.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" +#include "xfa/fxfa/xfa_ffdocview.h" +#include "xfa/fxfa/xfa_ffpageview.h" +#include "xfa/fxfa/xfa_ffwidget.h" +#endif // PDF_ENABLE_XFA + +namespace { + +CPDFSDK_FormFillEnvironment* HandleToCPDFSDKEnvironment( + FPDF_FORMHANDLE handle) { + return static_cast(handle); +} + +CPDFSDK_InterForm* FormHandleToInterForm(FPDF_FORMHANDLE hHandle) { + CPDFSDK_FormFillEnvironment* pFormFillEnv = + HandleToCPDFSDKEnvironment(hHandle); + return pFormFillEnv ? pFormFillEnv->GetInterForm() : nullptr; +} + +CPDFSDK_PageView* FormHandleToPageView(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page) { + UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); + if (!pPage) + return nullptr; + + CPDFSDK_FormFillEnvironment* pFormFillEnv = + HandleToCPDFSDKEnvironment(hHandle); + return pFormFillEnv ? pFormFillEnv->GetPageView(pPage, true) : nullptr; +} + +#ifdef PDF_ENABLE_XFA +std::vector* FromFPDFStringHandle(FPDF_STRINGHANDLE handle) { + return reinterpret_cast*>(handle); +} + +FPDF_STRINGHANDLE ToFPDFStringHandle(std::vector* strings) { + return reinterpret_cast(strings); +} +#endif // PDF_ENABLE_XFA + +void FFLCommon(FPDF_FORMHANDLE hHandle, + FPDF_BITMAP bitmap, + FPDF_RECORDER recorder, + FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int flags) { + if (!hHandle) + return; + + UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); + if (!pPage) + return; + +#ifdef PDF_ENABLE_XFA + CPDFXFA_Context* pContext = pPage->GetContext(); + if (!pContext) + return; + CPDF_Document* pPDFDoc = pContext->GetPDFDoc(); + if (!pPDFDoc) + return; + CPDFSDK_FormFillEnvironment* pFormFillEnv = + HandleToCPDFSDKEnvironment(hHandle); + if (!pFormFillEnv) + return; +#endif // PDF_ENABLE_XFA + + CFX_Matrix matrix = + pPage->GetDisplayMatrix(start_x, start_y, size_x, size_y, rotate); + FX_RECT clip(start_x, start_y, start_x + size_x, start_y + size_y); + + std::unique_ptr pDevice(new CFX_FxgeDevice); +#ifdef _SKIA_SUPPORT_ + pDevice->AttachRecorder(static_cast(recorder)); +#endif + pDevice->Attach(CFXBitmapFromFPDFBitmap(bitmap), false, nullptr, false); + pDevice->SaveState(); + pDevice->SetClip_Rect(clip); + + CPDF_RenderOptions options; + if (flags & FPDF_LCD_TEXT) + options.m_Flags |= RENDER_CLEARTYPE; + else + options.m_Flags &= ~RENDER_CLEARTYPE; + + // Grayscale output + if (flags & FPDF_GRAYSCALE) { + options.m_ColorMode = RENDER_COLOR_GRAY; + options.m_ForeColor = 0; + options.m_BackColor = 0xffffff; + } + options.m_AddFlags = flags >> 8; + options.m_bDrawAnnots = flags & FPDF_ANNOT; + +#ifdef PDF_ENABLE_XFA + options.m_pOCContext = + pdfium::MakeRetain(pPDFDoc, CPDF_OCContext::View); + if (CPDFSDK_PageView* pPageView = pFormFillEnv->GetPageView(pPage, true)) + pPageView->PageView_OnDraw(pDevice.get(), &matrix, &options, clip); +#else // PDF_ENABLE_XFA + options.m_pOCContext = pdfium::MakeRetain( + pPage->m_pDocument, CPDF_OCContext::View); + if (CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, pPage)) + pPageView->PageView_OnDraw(pDevice.get(), &matrix, &options); +#endif // PDF_ENABLE_XFA + + pDevice->RestoreState(false); +#ifdef _SKIA_SUPPORT_PATHS_ + pDevice->Flush(); + CFXBitmapFromFPDFBitmap(bitmap)->UnPreMultiply(); +#endif +} + +} // namespace + +DLLEXPORT int STDCALL FPDFPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + double page_x, + double page_y) { + if (!hHandle) + return -1; + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (pPage) { + CPDF_InterForm interform(pPage->m_pDocument); + CPDF_FormControl* pFormCtrl = interform.GetControlAtPoint( + pPage, CFX_PointF(static_cast(page_x), + static_cast(page_y)), + nullptr); + if (!pFormCtrl) + return -1; + CPDF_FormField* pFormField = pFormCtrl->GetField(); + return pFormField ? pFormField->GetFieldType() : -1; + } + +#ifdef PDF_ENABLE_XFA + CPDFXFA_Page* pXFAPage = UnderlyingFromFPDFPage(page); + if (!pXFAPage) + return -1; + + CXFA_FFPageView* pPageView = pXFAPage->GetXFAPageView(); + if (!pPageView) + return -1; + + CXFA_FFDocView* pDocView = pPageView->GetDocView(); + if (!pDocView) + return -1; + + CXFA_FFWidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler(); + if (!pWidgetHandler) + return -1; + + std::unique_ptr pWidgetIterator( + pPageView->CreateWidgetIterator(XFA_TRAVERSEWAY_Form, + XFA_WidgetStatus_Viewable)); + if (!pWidgetIterator) + return -1; + + CXFA_FFWidget* pXFAAnnot = pWidgetIterator->MoveToNext(); + while (pXFAAnnot) { + CFX_RectF rcBBox = pXFAAnnot->GetBBox(0); + CFX_FloatRect rcWidget(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width, + rcBBox.top + rcBBox.height); + rcWidget.left -= 1.0f; + rcWidget.right += 1.0f; + rcWidget.bottom -= 1.0f; + rcWidget.top += 1.0f; + + if (rcWidget.Contains(CFX_PointF(static_cast(page_x), + static_cast(page_y)))) { + return FPDF_FORMFIELD_XFA; + } + pXFAAnnot = pWidgetIterator->MoveToNext(); + } +#endif // PDF_ENABLE_XFA + return -1; +} + +DLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + double page_x, + double page_y) { + return FPDFPage_HasFormFieldAtPoint(hHandle, page, page_x, page_y); +} + +DLLEXPORT int STDCALL FPDFPage_FormFieldZOrderAtPoint(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + double page_x, + double page_y) { + if (!hHandle) + return -1; + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return -1; + CPDF_InterForm interform(pPage->m_pDocument); + int z_order = -1; + (void)interform.GetControlAtPoint( + pPage, + CFX_PointF(static_cast(page_x), static_cast(page_y)), + &z_order); + return z_order; +} + +DLLEXPORT FPDF_FORMHANDLE STDCALL +FPDFDOC_InitFormFillEnvironment(FPDF_DOCUMENT document, + FPDF_FORMFILLINFO* formInfo) { +#ifdef PDF_ENABLE_XFA + const int kRequiredVersion = 2; +#else // PDF_ENABLE_XFA + const int kRequiredVersion = 1; +#endif // PDF_ENABLE_XFA + if (!formInfo || formInfo->version != kRequiredVersion) + return nullptr; + + UnderlyingDocumentType* pDocument = UnderlyingFromFPDFDocument(document); + if (!pDocument) + return nullptr; + +#ifdef PDF_ENABLE_XFA + // If the CPDFXFA_Context has a FormFillEnvironment already then we've done + // this and can just return the old Env. Otherwise, we'll end up setting a new + // environment into the XFADocument and, that could get weird. + if (pDocument->GetFormFillEnv()) + return pDocument->GetFormFillEnv(); +#endif + + CPDFSDK_FormFillEnvironment* pFormFillEnv = + new CPDFSDK_FormFillEnvironment(pDocument, formInfo); + +#ifdef PDF_ENABLE_XFA + pDocument->SetFormFillEnv(pFormFillEnv); +#endif // PDF_ENABLE_XFA + + return pFormFillEnv; +} + +DLLEXPORT void STDCALL +FPDFDOC_ExitFormFillEnvironment(FPDF_FORMHANDLE hHandle) { + if (!hHandle) + return; + + CPDFSDK_FormFillEnvironment* pFormFillEnv = + HandleToCPDFSDKEnvironment(hHandle); + +#ifdef PDF_ENABLE_XFA + // Reset the focused annotations and remove the SDK document from the + // XFA document. + pFormFillEnv->ClearAllFocusedAnnots(); + // If the document was closed first, it's possible the XFA document + // is now a nullptr. + if (pFormFillEnv->GetXFAContext()) + pFormFillEnv->GetXFAContext()->SetFormFillEnv(nullptr); +#endif // PDF_ENABLE_XFA + + delete pFormFillEnv; +} + +DLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int modifier, + double page_x, + double page_y) { + CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); + if (!pPageView) + return false; + return pPageView->OnMouseMove(CFX_PointF(page_x, page_y), modifier); +} + +DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int modifier, + double page_x, + double page_y) { + CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); + if (!pPageView) + return false; + return pPageView->OnLButtonDown(CFX_PointF(page_x, page_y), modifier); +} + +DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int modifier, + double page_x, + double page_y) { + CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); + if (!pPageView) + return false; + + CFX_PointF pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); + return pPageView->OnLButtonUp(pt, modifier); +} + +#ifdef PDF_ENABLE_XFA +DLLEXPORT FPDF_BOOL STDCALL FORM_OnRButtonDown(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int modifier, + double page_x, + double page_y) { + CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); + if (!pPageView) + return false; + return pPageView->OnRButtonDown(CFX_PointF(page_x, page_y), modifier); +} + +DLLEXPORT FPDF_BOOL STDCALL FORM_OnRButtonUp(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int modifier, + double page_x, + double page_y) { + CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); + if (!pPageView) + return false; + + CFX_PointF pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); + return pPageView->OnRButtonUp(pt, modifier); +} +#endif // PDF_ENABLE_XFA + +DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int nKeyCode, + int modifier) { + CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); + if (!pPageView) + return false; + + return pPageView->OnKeyDown(nKeyCode, modifier); +} + +DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyUp(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int nKeyCode, + int modifier) { + CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); + if (!pPageView) + return false; + + return pPageView->OnKeyUp(nKeyCode, modifier); +} + +DLLEXPORT FPDF_BOOL STDCALL FORM_OnChar(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int nChar, + int modifier) { + CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); + if (!pPageView) + return false; + + return pPageView->OnChar(nChar, modifier); +} + +DLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle) { + CPDFSDK_FormFillEnvironment* pFormFillEnv = + HandleToCPDFSDKEnvironment(hHandle); + if (!pFormFillEnv) + return false; + return pFormFillEnv->KillFocusAnnot(0); +} + +DLLEXPORT void STDCALL FPDF_FFLDraw(FPDF_FORMHANDLE hHandle, + FPDF_BITMAP bitmap, + FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int flags) { + FFLCommon(hHandle, bitmap, nullptr, page, start_x, start_y, size_x, size_y, + rotate, flags); +} + +#ifdef _SKIA_SUPPORT_ +DLLEXPORT void STDCALL FPDF_FFLRecord(FPDF_FORMHANDLE hHandle, + FPDF_RECORDER recorder, + FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int flags) { + FFLCommon(hHandle, nullptr, recorder, page, start_x, start_y, size_x, size_y, + rotate, flags); +} +#endif + +#ifdef PDF_ENABLE_XFA +DLLEXPORT void STDCALL FPDF_Widget_Undo(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget) { + if (!hWidget || !document) + return; + + CPDFXFA_Context* pContext = static_cast(document); + if (pContext->GetDocType() != XFA_DOCTYPE_Dynamic && + pContext->GetDocType() != XFA_DOCTYPE_Static) + return; + + static_cast(hWidget)->Undo(); +} + +DLLEXPORT void STDCALL FPDF_Widget_Redo(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget) { + if (!hWidget || !document) + return; + + CPDFXFA_Context* pContext = static_cast(document); + if (pContext->GetDocType() != XFA_DOCTYPE_Dynamic && + pContext->GetDocType() != XFA_DOCTYPE_Static) + return; + + static_cast(hWidget)->Redo(); +} + +DLLEXPORT void STDCALL FPDF_Widget_SelectAll(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget) { + if (!hWidget || !document) + return; + + CPDFXFA_Context* pContext = static_cast(document); + if (pContext->GetDocType() != XFA_DOCTYPE_Dynamic && + pContext->GetDocType() != XFA_DOCTYPE_Static) + return; + + static_cast(hWidget)->SelectAll(); +} + +DLLEXPORT void STDCALL FPDF_Widget_Copy(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget, + FPDF_WIDESTRING wsText, + FPDF_DWORD* size) { + if (!hWidget || !document) + return; + + CPDFXFA_Context* pContext = static_cast(document); + if (pContext->GetDocType() != XFA_DOCTYPE_Dynamic && + pContext->GetDocType() != XFA_DOCTYPE_Static) + return; + + CFX_WideString wsCpText; + static_cast(hWidget)->Copy(wsCpText); + + CFX_ByteString bsCpText = wsCpText.UTF16LE_Encode(); + uint32_t len = bsCpText.GetLength() / sizeof(unsigned short); + if (!wsText) { + *size = len; + return; + } + + uint32_t real_size = len < *size ? len : *size; + if (real_size > 0) { + FXSYS_memcpy((void*)wsText, + bsCpText.GetBuffer(real_size * sizeof(unsigned short)), + real_size * sizeof(unsigned short)); + bsCpText.ReleaseBuffer(real_size * sizeof(unsigned short)); + } + *size = real_size; +} + +DLLEXPORT void STDCALL FPDF_Widget_Cut(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget, + FPDF_WIDESTRING wsText, + FPDF_DWORD* size) { + if (!hWidget || !document) + return; + + CPDFXFA_Context* pContext = static_cast(document); + if (pContext->GetDocType() != XFA_DOCTYPE_Dynamic && + pContext->GetDocType() != XFA_DOCTYPE_Static) + return; + + CFX_WideString wsCpText; + static_cast(hWidget)->Cut(wsCpText); + + CFX_ByteString bsCpText = wsCpText.UTF16LE_Encode(); + uint32_t len = bsCpText.GetLength() / sizeof(unsigned short); + if (!wsText) { + *size = len; + return; + } + + uint32_t real_size = len < *size ? len : *size; + if (real_size > 0) { + FXSYS_memcpy((void*)wsText, + bsCpText.GetBuffer(real_size * sizeof(unsigned short)), + real_size * sizeof(unsigned short)); + bsCpText.ReleaseBuffer(real_size * sizeof(unsigned short)); + } + *size = real_size; +} + +DLLEXPORT void STDCALL FPDF_Widget_Paste(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget, + FPDF_WIDESTRING wsText, + FPDF_DWORD size) { + if (!hWidget || !document) + return; + + CPDFXFA_Context* pContext = static_cast(document); + if (pContext->GetDocType() != XFA_DOCTYPE_Dynamic && + pContext->GetDocType() != XFA_DOCTYPE_Static) + return; + + CFX_WideString wstr = CFX_WideString::FromUTF16LE(wsText, size); + static_cast(hWidget)->Paste(wstr); +} + +DLLEXPORT void STDCALL +FPDF_Widget_ReplaceSpellCheckWord(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget, + float x, + float y, + FPDF_BYTESTRING bsText) { + if (!hWidget || !document) + return; + + CPDFXFA_Context* pContext = static_cast(document); + if (pContext->GetDocType() != XFA_DOCTYPE_Dynamic && + pContext->GetDocType() != XFA_DOCTYPE_Static) + return; + + CFX_PointF ptPopup; + ptPopup.x = x; + ptPopup.y = y; + CFX_ByteStringC bs(bsText); + static_cast(hWidget)->ReplaceSpellCheckWord(ptPopup, bs); +} + +DLLEXPORT void STDCALL +FPDF_Widget_GetSpellCheckWords(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget, + float x, + float y, + FPDF_STRINGHANDLE* stringHandle) { + if (!hWidget || !document) + return; + + CPDFXFA_Context* pContext = static_cast(document); + if (pContext->GetDocType() != XFA_DOCTYPE_Dynamic && + pContext->GetDocType() != XFA_DOCTYPE_Static) + return; + + std::vector* sSuggestWords = new std::vector; + CFX_PointF ptPopup; + ptPopup.x = x; + ptPopup.y = y; + static_cast(hWidget) + ->GetSuggestWords(ptPopup, *sSuggestWords); + *stringHandle = ToFPDFStringHandle(sSuggestWords); +} + +DLLEXPORT int STDCALL FPDF_StringHandleCounts(FPDF_STRINGHANDLE sHandle) { + std::vector* sSuggestWords = FromFPDFStringHandle(sHandle); + return sSuggestWords ? pdfium::CollectionSize(*sSuggestWords) : -1; +} + +DLLEXPORT FPDF_BOOL STDCALL +FPDF_StringHandleGetStringByIndex(FPDF_STRINGHANDLE sHandle, + int index, + FPDF_BYTESTRING bsText, + FPDF_DWORD* size) { + if (!sHandle || !size) + return false; + + int count = FPDF_StringHandleCounts(sHandle); + if (index < 0 || index >= count) + return false; + + std::vector* sSuggestWords = FromFPDFStringHandle(sHandle); + uint32_t len = (*sSuggestWords)[index].GetLength(); + if (!bsText) { + *size = len; + return true; + } + + uint32_t real_size = len < *size ? len : *size; + if (real_size > 0) + FXSYS_memcpy((void*)bsText, (*sSuggestWords)[index].c_str(), real_size); + *size = real_size; + return true; +} + +DLLEXPORT void STDCALL +FPDF_StringHandleRelease(FPDF_STRINGHANDLE stringHandle) { + delete FromFPDFStringHandle(stringHandle); +} + +DLLEXPORT FPDF_BOOL STDCALL +FPDF_StringHandleAddString(FPDF_STRINGHANDLE stringHandle, + FPDF_BYTESTRING bsText, + FPDF_DWORD size) { + if (!stringHandle || !bsText || size == 0) + return false; + + FromFPDFStringHandle(stringHandle)->push_back(CFX_ByteString(bsText, size)); + return true; +} +#endif // PDF_ENABLE_XFA + +DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle, + int fieldType, + unsigned long color) { + if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) + pInterForm->SetHighlightColor(color, fieldType); +} + +DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, + unsigned char alpha) { + if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) + pInterForm->SetHighlightAlpha(alpha); +} + +DLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle) { + if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) + pInterForm->RemoveAllHighLight(); +} + +DLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page, + FPDF_FORMHANDLE hHandle) { + if (CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page)) + pPageView->SetValid(true); +} + +DLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page, + FPDF_FORMHANDLE hHandle) { + if (!hHandle) + return; + + CPDFSDK_FormFillEnvironment* pFormFillEnv = + HandleToCPDFSDKEnvironment(hHandle); + if (!pFormFillEnv) + return; + + UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); + if (!pPage) + return; + + CPDFSDK_PageView* pPageView = pFormFillEnv->GetPageView(pPage, false); + if (pPageView) { + pPageView->SetValid(false); + // RemovePageView() takes care of the delete for us. + pFormFillEnv->RemovePageView(pPage); + } +} + +DLLEXPORT void STDCALL FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle) { + CPDFSDK_FormFillEnvironment* pFormFillEnv = + HandleToCPDFSDKEnvironment(hHandle); + if (pFormFillEnv && pFormFillEnv->IsJSInitiated()) + pFormFillEnv->ProcJavascriptFun(); +} + +DLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle) { + CPDFSDK_FormFillEnvironment* pFormFillEnv = + HandleToCPDFSDKEnvironment(hHandle); + if (pFormFillEnv && pFormFillEnv->IsJSInitiated()) + pFormFillEnv->ProcOpenAction(); +} + +DLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, + int aaType) { + CPDFSDK_FormFillEnvironment* pFormFillEnv = + HandleToCPDFSDKEnvironment(hHandle); + if (!pFormFillEnv) + return; + + CPDF_Document* pDoc = pFormFillEnv->GetPDFDocument(); + CPDF_Dictionary* pDic = pDoc->GetRoot(); + if (!pDic) + return; + + CPDF_AAction aa(pDic->GetDictFor("AA")); + if (aa.ActionExist((CPDF_AAction::AActionType)aaType)) { + CPDF_Action action = aa.GetAction((CPDF_AAction::AActionType)aaType); + CPDFSDK_ActionHandler* pActionHandler = + HandleToCPDFSDKEnvironment(hHandle)->GetActionHander(); + pActionHandler->DoAction_Document(action, (CPDF_AAction::AActionType)aaType, + pFormFillEnv); + } +} + +DLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page, + FPDF_FORMHANDLE hHandle, + int aaType) { + if (!hHandle) + return; + + CPDFSDK_FormFillEnvironment* pFormFillEnv = + HandleToCPDFSDKEnvironment(hHandle); + if (!pFormFillEnv) + return; + + UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); + CPDF_Page* pPDFPage = CPDFPageFromFPDFPage(page); + if (!pPDFPage) + return; + + if (!pFormFillEnv->GetPageView(pPage, false)) + return; + + CPDFSDK_ActionHandler* pActionHandler = pFormFillEnv->GetActionHander(); + CPDF_Dictionary* pPageDict = pPDFPage->m_pFormDict; + CPDF_AAction aa(pPageDict->GetDictFor("AA")); + if (FPDFPAGE_AACTION_OPEN == aaType) { + if (aa.ActionExist(CPDF_AAction::OpenPage)) { + CPDF_Action action = aa.GetAction(CPDF_AAction::OpenPage); + pActionHandler->DoAction_Page(action, CPDF_AAction::OpenPage, + pFormFillEnv); + } + } else { + if (aa.ActionExist(CPDF_AAction::ClosePage)) { + CPDF_Action action = aa.GetAction(CPDF_AAction::ClosePage); + pActionHandler->DoAction_Page(action, CPDF_AAction::ClosePage, + pFormFillEnv); + } + } +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfformfill_embeddertest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfformfill_embeddertest.cpp new file mode 100644 index 000000000000..47f1a75efb87 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfformfill_embeddertest.cpp @@ -0,0 +1,199 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/fpdf_formfill.h" +#include "testing/embedder_test.h" +#include "testing/embedder_test_mock_delegate.h" +#include "testing/embedder_test_timer_handling_delegate.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using testing::_; +using testing::Return; + +class FPDFFormFillEmbeddertest : public EmbedderTest {}; + +TEST_F(FPDFFormFillEmbeddertest, FirstTest) { + EmbedderTestMockDelegate mock; + EXPECT_CALL(mock, Alert(_, _, _, _)).Times(0); + EXPECT_CALL(mock, UnsupportedHandler(_)).Times(0); + EXPECT_CALL(mock, SetTimer(_, _)).Times(0); + EXPECT_CALL(mock, KillTimer(_)).Times(0); + SetDelegate(&mock); + + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + UnloadPage(page); +} + +TEST_F(FPDFFormFillEmbeddertest, BUG_487928) { + EmbedderTestTimerHandlingDelegate delegate; + SetDelegate(&delegate); + + EXPECT_TRUE(OpenDocument("bug_487928.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + DoOpenActions(); + delegate.AdvanceTime(5000); + UnloadPage(page); +} + +TEST_F(FPDFFormFillEmbeddertest, BUG_507316) { + EmbedderTestTimerHandlingDelegate delegate; + SetDelegate(&delegate); + + EXPECT_TRUE(OpenDocument("bug_507316.pdf")); + FPDF_PAGE page = LoadPage(2); + EXPECT_TRUE(page); + DoOpenActions(); + delegate.AdvanceTime(4000); + UnloadPage(page); +} + +TEST_F(FPDFFormFillEmbeddertest, BUG_514690) { + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + // Test that FORM_OnMouseMove() etc. permit null HANDLES and PAGES. + FORM_OnMouseMove(nullptr, page, 0, 10.0, 10.0); + FORM_OnMouseMove(form_handle(), nullptr, 0, 10.0, 10.0); + + UnloadPage(page); +} + +#ifdef PDF_ENABLE_V8 +TEST_F(FPDFFormFillEmbeddertest, BUG_551248) { + // Test that timers fire once and intervals fire repeatedly. + EmbedderTestTimerHandlingDelegate delegate; + SetDelegate(&delegate); + + EXPECT_TRUE(OpenDocument("bug_551248.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + DoOpenActions(); + + const auto& alerts = delegate.GetAlerts(); + EXPECT_EQ(0U, alerts.size()); + + delegate.AdvanceTime(1000); + EXPECT_EQ(0U, alerts.size()); // nothing fired. + delegate.AdvanceTime(1000); + EXPECT_EQ(1U, alerts.size()); // interval fired. + delegate.AdvanceTime(1000); + EXPECT_EQ(2U, alerts.size()); // timer fired. + delegate.AdvanceTime(1000); + EXPECT_EQ(3U, alerts.size()); // interval fired again. + delegate.AdvanceTime(1000); + EXPECT_EQ(3U, alerts.size()); // nothing fired. + delegate.AdvanceTime(1000); + EXPECT_EQ(4U, alerts.size()); // interval fired again. + delegate.AdvanceTime(1000); + EXPECT_EQ(4U, alerts.size()); // nothing fired. + UnloadPage(page); + + ASSERT_EQ(4U, alerts.size()); // nothing else fired. + + EXPECT_STREQ(L"interval fired", alerts[0].message.c_str()); + EXPECT_STREQ(L"Alert", alerts[0].title.c_str()); + EXPECT_EQ(0, alerts[0].type); + EXPECT_EQ(0, alerts[0].icon); + + EXPECT_STREQ(L"timer fired", alerts[1].message.c_str()); + EXPECT_STREQ(L"Alert", alerts[1].title.c_str()); + EXPECT_EQ(0, alerts[1].type); + EXPECT_EQ(0, alerts[1].icon); + + EXPECT_STREQ(L"interval fired", alerts[2].message.c_str()); + EXPECT_STREQ(L"Alert", alerts[2].title.c_str()); + EXPECT_EQ(0, alerts[2].type); + EXPECT_EQ(0, alerts[2].icon); + + EXPECT_STREQ(L"interval fired", alerts[3].message.c_str()); + EXPECT_STREQ(L"Alert", alerts[3].title.c_str()); + EXPECT_EQ(0, alerts[3].type); + EXPECT_EQ(0, alerts[3].icon); +} + +TEST_F(FPDFFormFillEmbeddertest, BUG_620428) { + // Test that timers and intervals are cancelable. + EmbedderTestTimerHandlingDelegate delegate; + SetDelegate(&delegate); + + EXPECT_TRUE(OpenDocument("bug_620428.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + DoOpenActions(); + delegate.AdvanceTime(5000); + UnloadPage(page); + + const auto& alerts = delegate.GetAlerts(); + ASSERT_EQ(1U, alerts.size()); + EXPECT_STREQ(L"done", alerts[0].message.c_str()); +} + +TEST_F(FPDFFormFillEmbeddertest, BUG_634394) { + // Cancel timer inside timer callback. + EmbedderTestTimerHandlingDelegate delegate; + SetDelegate(&delegate); + + EXPECT_TRUE(OpenDocument("bug_634394.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + DoOpenActions(); + + // Timers fire at most once per AdvanceTime(), allow intervals + // to fire several times if possible. + delegate.AdvanceTime(1000); + delegate.AdvanceTime(1000); + delegate.AdvanceTime(1000); + delegate.AdvanceTime(1000); + delegate.AdvanceTime(1000); + UnloadPage(page); + + const auto& alerts = delegate.GetAlerts(); + EXPECT_EQ(2U, alerts.size()); +} + +TEST_F(FPDFFormFillEmbeddertest, BUG_634716) { + EmbedderTestTimerHandlingDelegate delegate; + SetDelegate(&delegate); + + EXPECT_TRUE(OpenDocument("bug_634716.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + DoOpenActions(); + + // Timers fire at most once per AdvanceTime(), allow intervals + // to fire several times if possible. + delegate.AdvanceTime(1000); + delegate.AdvanceTime(1000); + delegate.AdvanceTime(1000); + delegate.AdvanceTime(1000); + delegate.AdvanceTime(1000); + UnloadPage(page); + + const auto& alerts = delegate.GetAlerts(); + EXPECT_EQ(2U, alerts.size()); +} + +TEST_F(FPDFFormFillEmbeddertest, BUG_679649) { + EmbedderTestTimerHandlingDelegate delegate; + SetDelegate(&delegate); + + EXPECT_TRUE(OpenDocument("bug_679649.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + delegate.SetFailNextTimer(); + DoOpenActions(); + delegate.AdvanceTime(2000); + UnloadPage(page); + + const auto& alerts = delegate.GetAlerts(); + EXPECT_EQ(0u, alerts.size()); +} + +#endif // PDF_ENABLE_V8 diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfppo.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfppo.cpp new file mode 100644 index 000000000000..4e06856455ca --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfppo.cpp @@ -0,0 +1,390 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_ppo.h" + +#include +#include +#include +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "fpdfsdk/fsdk_define.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +namespace { + +CPDF_Object* PageDictGetInheritableTag(CPDF_Dictionary* pDict, + const CFX_ByteString& bsSrcTag) { + if (!pDict || bsSrcTag.IsEmpty()) + return nullptr; + if (!pDict->KeyExist("Parent") || !pDict->KeyExist("Type")) + return nullptr; + + CPDF_Object* pType = pDict->GetObjectFor("Type")->GetDirect(); + if (!ToName(pType)) + return nullptr; + if (pType->GetString().Compare("Page")) + return nullptr; + + CPDF_Dictionary* pp = + ToDictionary(pDict->GetObjectFor("Parent")->GetDirect()); + if (!pp) + return nullptr; + + if (pDict->KeyExist(bsSrcTag)) + return pDict->GetObjectFor(bsSrcTag); + + while (pp) { + if (pp->KeyExist(bsSrcTag)) + return pp->GetObjectFor(bsSrcTag); + if (!pp->KeyExist("Parent")) + break; + pp = ToDictionary(pp->GetObjectFor("Parent")->GetDirect()); + } + return nullptr; +} + +bool CopyInheritable(CPDF_Dictionary* pCurPageDict, + CPDF_Dictionary* pSrcPageDict, + const CFX_ByteString& key) { + if (pCurPageDict->KeyExist(key)) + return true; + + CPDF_Object* pInheritable = PageDictGetInheritableTag(pSrcPageDict, key); + if (!pInheritable) + return false; + + pCurPageDict->SetFor(key, pInheritable->Clone()); + return true; +} + +bool ParserPageRangeString(CFX_ByteString rangstring, + std::vector* pageArray, + int nCount) { + if (rangstring.IsEmpty()) + return true; + + rangstring.Remove(' '); + int nLength = rangstring.GetLength(); + CFX_ByteString cbCompareString("0123456789-,"); + for (int i = 0; i < nLength; ++i) { + if (cbCompareString.Find(rangstring[i]) == -1) + return false; + } + + CFX_ByteString cbMidRange; + int nStringFrom = 0; + int nStringTo = 0; + while (nStringTo < nLength) { + nStringTo = rangstring.Find(',', nStringFrom); + if (nStringTo == -1) + nStringTo = nLength; + cbMidRange = rangstring.Mid(nStringFrom, nStringTo - nStringFrom); + int nMid = cbMidRange.Find('-'); + if (nMid == -1) { + long lPageNum = atol(cbMidRange.c_str()); + if (lPageNum <= 0 || lPageNum > nCount) + return false; + pageArray->push_back((uint16_t)lPageNum); + } else { + int nStartPageNum = atol(cbMidRange.Mid(0, nMid).c_str()); + if (nStartPageNum == 0) + return false; + + ++nMid; + int nEnd = cbMidRange.GetLength() - nMid; + if (nEnd == 0) + return false; + + int nEndPageNum = atol(cbMidRange.Mid(nMid, nEnd).c_str()); + if (nStartPageNum < 0 || nStartPageNum > nEndPageNum || + nEndPageNum > nCount) { + return false; + } + for (int i = nStartPageNum; i <= nEndPageNum; ++i) { + pageArray->push_back(i); + } + } + nStringFrom = nStringTo + 1; + } + return true; +} + +} // namespace + +class CPDF_PageOrganizer { + public: + CPDF_PageOrganizer(CPDF_Document* pDestPDFDoc, CPDF_Document* pSrcPDFDoc); + ~CPDF_PageOrganizer(); + + bool PDFDocInit(); + bool ExportPage(const std::vector& pageNums, int nIndex); + + private: + using ObjectNumberMap = std::map; + + bool UpdateReference(CPDF_Object* pObj, ObjectNumberMap* pObjNumberMap); + uint32_t GetNewObjId(ObjectNumberMap* pObjNumberMap, CPDF_Reference* pRef); + + CPDF_Document* m_pDestPDFDoc; + CPDF_Document* m_pSrcPDFDoc; +}; + +CPDF_PageOrganizer::CPDF_PageOrganizer(CPDF_Document* pDestPDFDoc, + CPDF_Document* pSrcPDFDoc) + : m_pDestPDFDoc(pDestPDFDoc), m_pSrcPDFDoc(pSrcPDFDoc) {} + +CPDF_PageOrganizer::~CPDF_PageOrganizer() {} + +bool CPDF_PageOrganizer::PDFDocInit() { + ASSERT(m_pDestPDFDoc); + ASSERT(m_pSrcPDFDoc); + + CPDF_Dictionary* pNewRoot = m_pDestPDFDoc->GetRoot(); + if (!pNewRoot) + return false; + + CPDF_Dictionary* pDocInfoDict = m_pDestPDFDoc->GetInfo(); + if (!pDocInfoDict) + return false; + + pDocInfoDict->SetNewFor("Producer", "PDFium", false); + + CFX_ByteString cbRootType = pNewRoot->GetStringFor("Type", ""); + if (cbRootType.IsEmpty()) + pNewRoot->SetNewFor("Type", "Catalog"); + + CPDF_Object* pElement = pNewRoot->GetObjectFor("Pages"); + CPDF_Dictionary* pNewPages = + pElement ? ToDictionary(pElement->GetDirect()) : nullptr; + if (!pNewPages) { + pNewPages = m_pDestPDFDoc->NewIndirect(); + pNewRoot->SetNewFor("Pages", m_pDestPDFDoc, + pNewPages->GetObjNum()); + } + + CFX_ByteString cbPageType = pNewPages->GetStringFor("Type", ""); + if (cbPageType.IsEmpty()) + pNewPages->SetNewFor("Type", "Pages"); + + if (!pNewPages->GetArrayFor("Kids")) { + pNewPages->SetNewFor("Count", 0); + pNewPages->SetNewFor( + "Kids", m_pDestPDFDoc, + m_pDestPDFDoc->NewIndirect()->GetObjNum()); + } + + return true; +} + +bool CPDF_PageOrganizer::ExportPage(const std::vector& pageNums, + int nIndex) { + int curpage = nIndex; + auto pObjNumberMap = pdfium::MakeUnique(); + int nSize = pdfium::CollectionSize(pageNums); + for (int i = 0; i < nSize; ++i) { + CPDF_Dictionary* pCurPageDict = m_pDestPDFDoc->CreateNewPage(curpage); + CPDF_Dictionary* pSrcPageDict = m_pSrcPDFDoc->GetPage(pageNums[i] - 1); + if (!pSrcPageDict || !pCurPageDict) + return false; + + // Clone the page dictionary + for (const auto& it : *pSrcPageDict) { + const CFX_ByteString& cbSrcKeyStr = it.first; + if (cbSrcKeyStr == "Type" || cbSrcKeyStr == "Parent") + continue; + + CPDF_Object* pObj = it.second.get(); + pCurPageDict->SetFor(cbSrcKeyStr, pObj->Clone()); + } + + // inheritable item + // 1 MediaBox - required + if (!CopyInheritable(pCurPageDict, pSrcPageDict, "MediaBox")) { + // Search for "CropBox" in the source page dictionary, + // if it does not exists, use the default letter size. + CPDF_Object* pInheritable = + PageDictGetInheritableTag(pSrcPageDict, "CropBox"); + if (pInheritable) { + pCurPageDict->SetFor("MediaBox", pInheritable->Clone()); + } else { + // Make the default size to be letter size (8.5'x11') + CPDF_Array* pArray = pCurPageDict->SetNewFor("MediaBox"); + pArray->AddNew(0); + pArray->AddNew(0); + pArray->AddNew(612); + pArray->AddNew(792); + } + } + + // 2 Resources - required + if (!CopyInheritable(pCurPageDict, pSrcPageDict, "Resources")) + return false; + + // 3 CropBox - optional + CopyInheritable(pCurPageDict, pSrcPageDict, "CropBox"); + // 4 Rotate - optional + CopyInheritable(pCurPageDict, pSrcPageDict, "Rotate"); + + // Update the reference + uint32_t dwOldPageObj = pSrcPageDict->GetObjNum(); + uint32_t dwNewPageObj = pCurPageDict->GetObjNum(); + (*pObjNumberMap)[dwOldPageObj] = dwNewPageObj; + UpdateReference(pCurPageDict, pObjNumberMap.get()); + ++curpage; + } + + return true; +} + +bool CPDF_PageOrganizer::UpdateReference(CPDF_Object* pObj, + ObjectNumberMap* pObjNumberMap) { + switch (pObj->GetType()) { + case CPDF_Object::REFERENCE: { + CPDF_Reference* pReference = pObj->AsReference(); + uint32_t newobjnum = GetNewObjId(pObjNumberMap, pReference); + if (newobjnum == 0) + return false; + pReference->SetRef(m_pDestPDFDoc, newobjnum); + break; + } + case CPDF_Object::DICTIONARY: { + CPDF_Dictionary* pDict = pObj->AsDictionary(); + auto it = pDict->begin(); + while (it != pDict->end()) { + const CFX_ByteString& key = it->first; + CPDF_Object* pNextObj = it->second.get(); + ++it; + if (key == "Parent" || key == "Prev" || key == "First") + continue; + if (!pNextObj) + return false; + if (!UpdateReference(pNextObj, pObjNumberMap)) + pDict->RemoveFor(key); + } + break; + } + case CPDF_Object::ARRAY: { + CPDF_Array* pArray = pObj->AsArray(); + for (size_t i = 0; i < pArray->GetCount(); ++i) { + CPDF_Object* pNextObj = pArray->GetObjectAt(i); + if (!pNextObj) + return false; + if (!UpdateReference(pNextObj, pObjNumberMap)) + return false; + } + break; + } + case CPDF_Object::STREAM: { + CPDF_Stream* pStream = pObj->AsStream(); + CPDF_Dictionary* pDict = pStream->GetDict(); + if (!pDict) + return false; + if (!UpdateReference(pDict, pObjNumberMap)) + return false; + break; + } + default: + break; + } + + return true; +} + +uint32_t CPDF_PageOrganizer::GetNewObjId(ObjectNumberMap* pObjNumberMap, + CPDF_Reference* pRef) { + if (!pRef) + return 0; + + uint32_t dwObjnum = pRef->GetRefObjNum(); + uint32_t dwNewObjNum = 0; + const auto it = pObjNumberMap->find(dwObjnum); + if (it != pObjNumberMap->end()) + dwNewObjNum = it->second; + if (dwNewObjNum) + return dwNewObjNum; + + CPDF_Object* pDirect = pRef->GetDirect(); + if (!pDirect) + return 0; + + std::unique_ptr pClone = pDirect->Clone(); + if (CPDF_Dictionary* pDictClone = pClone->AsDictionary()) { + if (pDictClone->KeyExist("Type")) { + CFX_ByteString strType = pDictClone->GetStringFor("Type"); + if (!FXSYS_stricmp(strType.c_str(), "Pages")) + return 4; + if (!FXSYS_stricmp(strType.c_str(), "Page")) + return 0; + } + } + CPDF_Object* pUnownedClone = + m_pDestPDFDoc->AddIndirectObject(std::move(pClone)); + dwNewObjNum = pUnownedClone->GetObjNum(); + (*pObjNumberMap)[dwObjnum] = dwNewObjNum; + if (!UpdateReference(pUnownedClone, pObjNumberMap)) + return 0; + + return dwNewObjNum; +} + +DLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc, + FPDF_DOCUMENT src_doc, + FPDF_BYTESTRING pagerange, + int index) { + CPDF_Document* pDestDoc = CPDFDocumentFromFPDFDocument(dest_doc); + if (!dest_doc) + return false; + + CPDF_Document* pSrcDoc = CPDFDocumentFromFPDFDocument(src_doc); + if (!pSrcDoc) + return false; + + std::vector pageArray; + int nCount = pSrcDoc->GetPageCount(); + if (pagerange) { + if (!ParserPageRangeString(pagerange, &pageArray, nCount)) + return false; + } else { + for (int i = 1; i <= nCount; ++i) { + pageArray.push_back(i); + } + } + + CPDF_PageOrganizer pageOrg(pDestDoc, pSrcDoc); + return pageOrg.PDFDocInit() && pageOrg.ExportPage(pageArray, index); +} + +DLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, + FPDF_DOCUMENT src_doc) { + CPDF_Document* pDstDoc = CPDFDocumentFromFPDFDocument(dest_doc); + if (!pDstDoc) + return false; + + CPDF_Document* pSrcDoc = CPDFDocumentFromFPDFDocument(src_doc); + if (!pSrcDoc) + return false; + + CPDF_Dictionary* pSrcDict = pSrcDoc->GetRoot(); + pSrcDict = pSrcDict->GetDictFor("ViewerPreferences"); + if (!pSrcDict) + return false; + + CPDF_Dictionary* pDstDict = pDstDoc->GetRoot(); + if (!pDstDict) + return false; + + pDstDict->SetFor("ViewerPreferences", pSrcDict->CloneDirectObject()); + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfppo_embeddertest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfppo_embeddertest.cpp new file mode 100644 index 000000000000..097231653419 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfppo_embeddertest.cpp @@ -0,0 +1,106 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/fpdf_ppo.h" + +#include "core/fxcrt/fx_basic.h" +#include "public/fpdf_edit.h" +#include "public/fpdfview.h" +#include "testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" + +namespace { + +class FPDFPPOEmbeddertest : public EmbedderTest {}; + +} // namespace + +TEST_F(FPDFPPOEmbeddertest, NoViewerPreferences) { + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + + FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument(); + EXPECT_TRUE(output_doc); + EXPECT_FALSE(FPDF_CopyViewerPreferences(output_doc, document())); + FPDF_CloseDocument(output_doc); +} + +TEST_F(FPDFPPOEmbeddertest, ViewerPreferences) { + EXPECT_TRUE(OpenDocument("viewer_ref.pdf")); + + FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument(); + EXPECT_TRUE(output_doc); + EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc, document())); + FPDF_CloseDocument(output_doc); +} + +TEST_F(FPDFPPOEmbeddertest, ImportPages) { + EXPECT_TRUE(OpenDocument("viewer_ref.pdf")); + + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument(); + EXPECT_TRUE(output_doc); + EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc, document())); + EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "1", 0)); + EXPECT_EQ(1, FPDF_GetPageCount(output_doc)); + FPDF_CloseDocument(output_doc); + + UnloadPage(page); +} + +TEST_F(FPDFPPOEmbeddertest, BadRanges) { + EXPECT_TRUE(OpenDocument("viewer_ref.pdf")); + + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument(); + EXPECT_TRUE(output_doc); + EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "clams", 0)); + EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "0", 0)); + EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "42", 0)); + EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "1,2", 0)); + EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "1-2", 0)); + EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), ",1", 0)); + EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "1,", 0)); + EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "1-", 0)); + EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "-1", 0)); + EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "-,0,,,1-", 0)); + FPDF_CloseDocument(output_doc); + + UnloadPage(page); +} + +TEST_F(FPDFPPOEmbeddertest, GoodRanges) { + EXPECT_TRUE(OpenDocument("viewer_ref.pdf")); + + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument(); + EXPECT_TRUE(output_doc); + EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc, document())); + EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "1,1,1,1", 0)); + EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "1-1", 0)); + EXPECT_EQ(5, FPDF_GetPageCount(output_doc)); + FPDF_CloseDocument(output_doc); + + UnloadPage(page); +} + +TEST_F(FPDFPPOEmbeddertest, BUG_664284) { + EXPECT_TRUE(OpenDocument("bug_664284.pdf")); + + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument(); + EXPECT_TRUE(output_doc); + EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "1", 0)); + FPDF_CloseDocument(output_doc); + + UnloadPage(page); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfsave.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfsave.cpp new file mode 100644 index 000000000000..0cfcd4af577c --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfsave.cpp @@ -0,0 +1,319 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_save.h" + +#include +#include +#include + +#include "core/fpdfapi/edit/cpdf_creator.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_reference.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fxcrt/fx_ext.h" +#include "fpdfsdk/fsdk_define.h" +#include "public/fpdf_edit.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#include "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h" +#include "public/fpdf_formfill.h" +#include "xfa/fxfa/cxfa_eventparam.h" +#include "xfa/fxfa/xfa_checksum.h" +#include "xfa/fxfa/xfa_ffapp.h" +#include "xfa/fxfa/xfa_ffdocview.h" +#include "xfa/fxfa/xfa_ffwidgethandler.h" +#endif + +#if _FX_OS_ == _FX_ANDROID_ +#include +#else +#include +#endif + +class CFX_IFileWrite final : public IFX_WriteStream { + public: + static CFX_RetainPtr Create(); + bool Init(FPDF_FILEWRITE* pFileWriteStruct); + bool WriteBlock(const void* pData, size_t size) override; + + protected: + CFX_IFileWrite(); + ~CFX_IFileWrite() override {} + + FPDF_FILEWRITE* m_pFileWriteStruct; +}; + +CFX_RetainPtr CFX_IFileWrite::Create() { + return CFX_RetainPtr(new CFX_IFileWrite()); +} + +CFX_IFileWrite::CFX_IFileWrite() : m_pFileWriteStruct(nullptr) {} + +bool CFX_IFileWrite::Init(FPDF_FILEWRITE* pFileWriteStruct) { + if (!pFileWriteStruct) + return false; + + m_pFileWriteStruct = pFileWriteStruct; + return true; +} + +bool CFX_IFileWrite::WriteBlock(const void* pData, size_t size) { + if (!m_pFileWriteStruct) + return false; + + m_pFileWriteStruct->WriteBlock(m_pFileWriteStruct, pData, size); + return true; +} + +namespace { + +#ifdef PDF_ENABLE_XFA +bool SaveXFADocumentData( + CPDFXFA_Context* pContext, + std::vector>* fileList) { + if (!pContext) + return false; + + if (pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA && + pContext->GetDocType() != DOCTYPE_STATIC_XFA) + return true; + + CXFA_FFDocView* pXFADocView = pContext->GetXFADocView(); + if (!pXFADocView) + return true; + + CPDF_Document* pPDFDocument = pContext->GetPDFDoc(); + if (!pPDFDocument) + return false; + + CPDF_Dictionary* pRoot = pPDFDocument->GetRoot(); + if (!pRoot) + return false; + + CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm"); + if (!pAcroForm) + return false; + + CPDF_Object* pXFA = pAcroForm->GetObjectFor("XFA"); + if (!pXFA) + return true; + + CPDF_Array* pArray = pXFA->AsArray(); + if (!pArray) + return false; + + int size = pArray->GetCount(); + int iFormIndex = -1; + int iDataSetsIndex = -1; + int iTemplate = -1; + int iLast = size - 2; + for (int i = 0; i < size - 1; i++) { + CPDF_Object* pPDFObj = pArray->GetObjectAt(i); + if (!pPDFObj->IsString()) + continue; + if (pPDFObj->GetString() == "form") + iFormIndex = i + 1; + else if (pPDFObj->GetString() == "datasets") + iDataSetsIndex = i + 1; + else if (pPDFObj->GetString() == "template") + iTemplate = i + 1; + } + std::unique_ptr pChecksum(new CXFA_ChecksumContext); + pChecksum->StartChecksum(); + + // template + if (iTemplate > -1) { + CPDF_Stream* pTemplateStream = pArray->GetStreamAt(iTemplate); + CPDF_StreamAcc streamAcc; + streamAcc.LoadAllData(pTemplateStream); + uint8_t* pData = (uint8_t*)streamAcc.GetData(); + uint32_t dwSize2 = streamAcc.GetSize(); + CFX_RetainPtr pTemplate = + IFX_MemoryStream::Create(pData, dwSize2); + pChecksum->UpdateChecksum(pTemplate); + } + CPDF_Stream* pFormStream = nullptr; + CPDF_Stream* pDataSetsStream = nullptr; + if (iFormIndex != -1) { + // Get form CPDF_Stream + CPDF_Object* pFormPDFObj = pArray->GetObjectAt(iFormIndex); + if (pFormPDFObj->IsReference()) { + CPDF_Object* pFormDirectObj = pFormPDFObj->GetDirect(); + if (pFormDirectObj && pFormDirectObj->IsStream()) { + pFormStream = (CPDF_Stream*)pFormDirectObj; + } + } else if (pFormPDFObj->IsStream()) { + pFormStream = (CPDF_Stream*)pFormPDFObj; + } + } + + if (iDataSetsIndex != -1) { + // Get datasets CPDF_Stream + CPDF_Object* pDataSetsPDFObj = pArray->GetObjectAt(iDataSetsIndex); + if (pDataSetsPDFObj->IsReference()) { + CPDF_Reference* pDataSetsRefObj = (CPDF_Reference*)pDataSetsPDFObj; + CPDF_Object* pDataSetsDirectObj = pDataSetsRefObj->GetDirect(); + if (pDataSetsDirectObj && pDataSetsDirectObj->IsStream()) { + pDataSetsStream = (CPDF_Stream*)pDataSetsDirectObj; + } + } else if (pDataSetsPDFObj->IsStream()) { + pDataSetsStream = (CPDF_Stream*)pDataSetsPDFObj; + } + } + // L"datasets" + { + CFX_RetainPtr pDsfileWrite = IFX_MemoryStream::Create(); + if (pXFADocView->GetDoc()->SavePackage(XFA_HASHCODE_Datasets, pDsfileWrite, + nullptr) && + pDsfileWrite->GetSize() > 0) { + // Datasets + pChecksum->UpdateChecksum(pDsfileWrite); + pChecksum->FinishChecksum(); + auto pDataDict = pdfium::MakeUnique( + pPDFDocument->GetByteStringPool()); + if (iDataSetsIndex != -1) { + if (pDataSetsStream) { + pDataSetsStream->InitStreamFromFile(pDsfileWrite, + std::move(pDataDict)); + } + } else { + CPDF_Stream* pData = pPDFDocument->NewIndirect(); + pData->InitStreamFromFile(pDsfileWrite, std::move(pDataDict)); + iLast = pArray->GetCount() - 2; + pArray->InsertNewAt(iLast, "datasets", false); + pArray->InsertNewAt(iLast + 1, pPDFDocument, + pData->GetObjNum()); + } + fileList->push_back(std::move(pDsfileWrite)); + } + } + // L"form" + { + CFX_RetainPtr pfileWrite = IFX_MemoryStream::Create(); + if (pXFADocView->GetDoc()->SavePackage(XFA_HASHCODE_Form, pfileWrite, + pChecksum.get()) && + pfileWrite->GetSize() > 0) { + auto pDataDict = pdfium::MakeUnique( + pPDFDocument->GetByteStringPool()); + if (iFormIndex != -1) { + if (pFormStream) + pFormStream->InitStreamFromFile(pfileWrite, std::move(pDataDict)); + } else { + CPDF_Stream* pData = pPDFDocument->NewIndirect(); + pData->InitStreamFromFile(pfileWrite, std::move(pDataDict)); + iLast = pArray->GetCount() - 2; + pArray->InsertNewAt(iLast, "form", false); + pArray->InsertNewAt(iLast + 1, pPDFDocument, + pData->GetObjNum()); + } + fileList->push_back(std::move(pfileWrite)); + } + } + return true; +} + +bool SendPostSaveToXFADoc(CPDFXFA_Context* pContext) { + if (!pContext) + return false; + + if (pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA && + pContext->GetDocType() != DOCTYPE_STATIC_XFA) + return true; + + CXFA_FFDocView* pXFADocView = pContext->GetXFADocView(); + if (!pXFADocView) + return false; + + CXFA_FFWidgetHandler* pWidgetHander = pXFADocView->GetWidgetHandler(); + std::unique_ptr pWidgetAccIterator( + pXFADocView->CreateWidgetAccIterator()); + while (CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext()) { + CXFA_EventParam preParam; + preParam.m_eType = XFA_EVENT_PostSave; + pWidgetHander->ProcessEvent(pWidgetAcc, &preParam); + } + pXFADocView->UpdateDocView(); + pContext->ClearChangeMark(); + return true; +} + +bool SendPreSaveToXFADoc( + CPDFXFA_Context* pContext, + std::vector>* fileList) { + if (pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA && + pContext->GetDocType() != DOCTYPE_STATIC_XFA) + return true; + + CXFA_FFDocView* pXFADocView = pContext->GetXFADocView(); + if (!pXFADocView) + return true; + + CXFA_FFWidgetHandler* pWidgetHander = pXFADocView->GetWidgetHandler(); + std::unique_ptr pWidgetAccIterator( + pXFADocView->CreateWidgetAccIterator()); + while (CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext()) { + CXFA_EventParam preParam; + preParam.m_eType = XFA_EVENT_PreSave; + pWidgetHander->ProcessEvent(pWidgetAcc, &preParam); + } + pXFADocView->UpdateDocView(); + return SaveXFADocumentData(pContext, fileList); +} +#endif // PDF_ENABLE_XFA + +bool FPDF_Doc_Save(FPDF_DOCUMENT document, + FPDF_FILEWRITE* pFileWrite, + FPDF_DWORD flags, + FPDF_BOOL bSetVersion, + int fileVerion) { + CPDF_Document* pPDFDoc = CPDFDocumentFromFPDFDocument(document); + if (!pPDFDoc) + return 0; + +#ifdef PDF_ENABLE_XFA + CPDFXFA_Context* pContext = static_cast(document); + std::vector> fileList; + SendPreSaveToXFADoc(pContext, &fileList); +#endif // PDF_ENABLE_XFA + + if (flags < FPDF_INCREMENTAL || flags > FPDF_REMOVE_SECURITY) + flags = 0; + + CPDF_Creator FileMaker(pPDFDoc); + if (bSetVersion) + FileMaker.SetFileVersion(fileVerion); + if (flags == FPDF_REMOVE_SECURITY) { + flags = 0; + FileMaker.RemoveSecurity(); + } + + CFX_RetainPtr pStreamWrite = CFX_IFileWrite::Create(); + pStreamWrite->Init(pFileWrite); + bool bRet = FileMaker.Create(pStreamWrite, flags); +#ifdef PDF_ENABLE_XFA + SendPostSaveToXFADoc(pContext); +#endif // PDF_ENABLE_XFA + return bRet; +} + +} // namespace + +DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy(FPDF_DOCUMENT document, + FPDF_FILEWRITE* pFileWrite, + FPDF_DWORD flags) { + return FPDF_Doc_Save(document, pFileWrite, flags, false, 0); +} + +DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion(FPDF_DOCUMENT document, + FPDF_FILEWRITE* pFileWrite, + FPDF_DWORD flags, + int fileVersion) { + return FPDF_Doc_Save(document, pFileWrite, flags, true, fileVersion); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfsave_embeddertest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfsave_embeddertest.cpp new file mode 100644 index 000000000000..918727027fe1 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfsave_embeddertest.cpp @@ -0,0 +1,70 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/fpdf_save.h" + +#include + +#include "core/fxcrt/fx_string.h" +#include "public/fpdf_edit.h" +#include "public/fpdf_ppo.h" +#include "public/fpdfview.h" +#include "testing/embedder_test.h" +#include "testing/fx_string_testhelpers.h" +#include "testing/gmock/include/gmock/gmock-matchers.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" + +class FPDFSaveEmbedderTest : public EmbedderTest, public TestSaver {}; + +TEST_F(FPDFSaveEmbedderTest, SaveSimpleDoc) { + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + EXPECT_THAT(GetString(), testing::StartsWith("%PDF-1.7\r\n")); + EXPECT_EQ(843u, GetString().length()); +} + +TEST_F(FPDFSaveEmbedderTest, SaveSimpleDocWithVersion) { + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 0, 14)); + EXPECT_THAT(GetString(), testing::StartsWith("%PDF-1.4\r\n")); + EXPECT_EQ(843u, GetString().length()); +} + +TEST_F(FPDFSaveEmbedderTest, SaveSimpleDocWithBadVersion) { + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 0, -1)); + EXPECT_THAT(GetString(), testing::StartsWith("%PDF-1.7\r\n")); + + ClearString(); + EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 0, 0)); + EXPECT_THAT(GetString(), testing::StartsWith("%PDF-1.7\r\n")); + + ClearString(); + EXPECT_TRUE(FPDF_SaveWithVersion(document(), this, 0, 18)); + EXPECT_THAT(GetString(), testing::StartsWith("%PDF-1.7\r\n")); +} + +TEST_F(FPDFSaveEmbedderTest, SaveCopiedDoc) { + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument(); + EXPECT_TRUE(output_doc); + EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "1", 0)); + EXPECT_TRUE(FPDF_SaveAsCopy(output_doc, this, 0)); + FPDF_CloseDocument(output_doc); + + UnloadPage(page); +} + +TEST_F(FPDFSaveEmbedderTest, BUG_342) { + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0)); + EXPECT_THAT(GetString(), testing::HasSubstr("0000000000 65535 f\r\n")); + EXPECT_THAT(GetString(), + testing::Not(testing::HasSubstr("0000000000 65536 f\r\n"))); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdftext.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdftext.cpp new file mode 100644 index 000000000000..0432afd7079a --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdftext.cpp @@ -0,0 +1,352 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdf_text.h" + +#include +#include + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfdoc/cpdf_viewerpreferences.h" +#include "core/fpdftext/cpdf_linkextract.h" +#include "core/fpdftext/cpdf_textpage.h" +#include "core/fpdftext/cpdf_textpagefind.h" +#include "fpdfsdk/fsdk_define.h" +#include "third_party/base/numerics/safe_conversions.h" +#include "third_party/base/stl_util.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" +#endif // PDF_ENABLE_XFA + +#ifdef _WIN32 +#include +#endif + +namespace { + +CPDF_TextPage* CPDFTextPageFromFPDFTextPage(FPDF_TEXTPAGE text_page) { + return static_cast(text_page); +} + +CPDF_TextPageFind* CPDFTextPageFindFromFPDFSchHandle(FPDF_SCHHANDLE handle) { + return static_cast(handle); +} + +CPDF_LinkExtract* CPDFLinkExtractFromFPDFPageLink(FPDF_PAGELINK link) { + return static_cast(link); +} + +} // namespace + +DLLEXPORT FPDF_TEXTPAGE STDCALL FPDFText_LoadPage(FPDF_PAGE page) { + CPDF_Page* pPDFPage = CPDFPageFromFPDFPage(page); + if (!pPDFPage) + return nullptr; + +#ifdef PDF_ENABLE_XFA + CPDFXFA_Page* pPage = (CPDFXFA_Page*)page; + CPDFXFA_Context* pContext = pPage->GetContext(); + CPDF_ViewerPreferences viewRef(pContext->GetPDFDoc()); +#else // PDF_ENABLE_XFA + CPDF_ViewerPreferences viewRef(pPDFPage->m_pDocument); +#endif // PDF_ENABLE_XFA + + CPDF_TextPage* textpage = new CPDF_TextPage( + pPDFPage, viewRef.IsDirectionR2L() ? FPDFText_Direction::Right + : FPDFText_Direction::Left); + textpage->ParseTextPage(); + return textpage; +} + +DLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page) { + delete CPDFTextPageFromFPDFTextPage(text_page); +} + +DLLEXPORT int STDCALL FPDFText_CountChars(FPDF_TEXTPAGE text_page) { + if (!text_page) + return -1; + + CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page); + return textpage->CountChars(); +} + +DLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, + int index) { + if (!text_page) + return 0; + + CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page); + if (index < 0 || index >= textpage->CountChars()) + return 0; + + FPDF_CHAR_INFO charinfo; + textpage->GetCharInfo(index, &charinfo); + return charinfo.m_Unicode; +} + +DLLEXPORT double STDCALL FPDFText_GetFontSize(FPDF_TEXTPAGE text_page, + int index) { + if (!text_page) + return 0; + CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page); + + if (index < 0 || index >= textpage->CountChars()) + return 0; + + FPDF_CHAR_INFO charinfo; + textpage->GetCharInfo(index, &charinfo); + return charinfo.m_FontSize; +} + +DLLEXPORT void STDCALL FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, + int index, + double* left, + double* right, + double* bottom, + double* top) { + if (!text_page) + return; + CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page); + + if (index < 0 || index >= textpage->CountChars()) + return; + FPDF_CHAR_INFO charinfo; + textpage->GetCharInfo(index, &charinfo); + *left = charinfo.m_CharBox.left; + *right = charinfo.m_CharBox.right; + *bottom = charinfo.m_CharBox.bottom; + *top = charinfo.m_CharBox.top; +} + +// select +DLLEXPORT int STDCALL FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page, + double x, + double y, + double xTolerance, + double yTolerance) { + if (!text_page) + return -3; + + CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page); + return textpage->GetIndexAtPos( + CFX_PointF(static_cast(x), static_cast(y)), + CFX_SizeF(static_cast(xTolerance), + static_cast(yTolerance))); +} + +DLLEXPORT int STDCALL FPDFText_GetText(FPDF_TEXTPAGE text_page, + int start, + int count, + unsigned short* result) { + if (!text_page) + return 0; + + CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page); + if (start >= textpage->CountChars()) + return 0; + + CFX_WideString str = textpage->GetPageText(start, count); + if (str.GetLength() > count) + str = str.Left(count); + + CFX_ByteString cbUTF16str = str.UTF16LE_Encode(); + FXSYS_memcpy(result, cbUTF16str.GetBuffer(cbUTF16str.GetLength()), + cbUTF16str.GetLength()); + cbUTF16str.ReleaseBuffer(cbUTF16str.GetLength()); + + return cbUTF16str.GetLength() / sizeof(unsigned short); +} + +DLLEXPORT int STDCALL FPDFText_CountRects(FPDF_TEXTPAGE text_page, + int start, + int count) { + if (!text_page) + return 0; + + CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page); + return textpage->CountRects(start, count); +} + +DLLEXPORT void STDCALL FPDFText_GetRect(FPDF_TEXTPAGE text_page, + int rect_index, + double* left, + double* top, + double* right, + double* bottom) { + if (!text_page) + return; + + CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page); + CFX_FloatRect rect; + textpage->GetRect(rect_index, rect.left, rect.top, rect.right, rect.bottom); + *left = rect.left; + *top = rect.top; + *right = rect.right; + *bottom = rect.bottom; +} + +DLLEXPORT int STDCALL FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page, + double left, + double top, + double right, + double bottom, + unsigned short* buffer, + int buflen) { + if (!text_page) + return 0; + + CPDF_TextPage* textpage = CPDFTextPageFromFPDFTextPage(text_page); + CFX_FloatRect rect((FX_FLOAT)left, (FX_FLOAT)bottom, (FX_FLOAT)right, + (FX_FLOAT)top); + CFX_WideString str = textpage->GetTextByRect(rect); + + if (buflen <= 0 || !buffer) + return str.GetLength(); + + CFX_ByteString cbUTF16Str = str.UTF16LE_Encode(); + int len = cbUTF16Str.GetLength() / sizeof(unsigned short); + int size = buflen > len ? len : buflen; + FXSYS_memcpy(buffer, cbUTF16Str.GetBuffer(size * sizeof(unsigned short)), + size * sizeof(unsigned short)); + cbUTF16Str.ReleaseBuffer(size * sizeof(unsigned short)); + + return size; +} + +// Search +// -1 for end +DLLEXPORT FPDF_SCHHANDLE STDCALL FPDFText_FindStart(FPDF_TEXTPAGE text_page, + FPDF_WIDESTRING findwhat, + unsigned long flags, + int start_index) { + if (!text_page) + return nullptr; + + CPDF_TextPageFind* textpageFind = + new CPDF_TextPageFind(CPDFTextPageFromFPDFTextPage(text_page)); + FX_STRSIZE len = CFX_WideString::WStringLength(findwhat); + textpageFind->FindFirst(CFX_WideString::FromUTF16LE(findwhat, len), flags, + start_index); + return textpageFind; +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindNext(FPDF_SCHHANDLE handle) { + if (!handle) + return false; + + CPDF_TextPageFind* textpageFind = CPDFTextPageFindFromFPDFSchHandle(handle); + return textpageFind->FindNext(); +} + +DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindPrev(FPDF_SCHHANDLE handle) { + if (!handle) + return false; + + CPDF_TextPageFind* textpageFind = CPDFTextPageFindFromFPDFSchHandle(handle); + return textpageFind->FindPrev(); +} + +DLLEXPORT int STDCALL FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle) { + if (!handle) + return 0; + + CPDF_TextPageFind* textpageFind = CPDFTextPageFindFromFPDFSchHandle(handle); + return textpageFind->GetCurOrder(); +} + +DLLEXPORT int STDCALL FPDFText_GetSchCount(FPDF_SCHHANDLE handle) { + if (!handle) + return 0; + + CPDF_TextPageFind* textpageFind = CPDFTextPageFindFromFPDFSchHandle(handle); + return textpageFind->GetMatchedCount(); +} + +DLLEXPORT void STDCALL FPDFText_FindClose(FPDF_SCHHANDLE handle) { + if (!handle) + return; + + CPDF_TextPageFind* textpageFind = CPDFTextPageFindFromFPDFSchHandle(handle); + delete textpageFind; + handle = nullptr; +} + +// web link +DLLEXPORT FPDF_PAGELINK STDCALL FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page) { + if (!text_page) + return nullptr; + + CPDF_LinkExtract* pageLink = + new CPDF_LinkExtract(CPDFTextPageFromFPDFTextPage(text_page)); + pageLink->ExtractLinks(); + return pageLink; +} + +DLLEXPORT int STDCALL FPDFLink_CountWebLinks(FPDF_PAGELINK link_page) { + if (!link_page) + return 0; + + CPDF_LinkExtract* pageLink = CPDFLinkExtractFromFPDFPageLink(link_page); + return pdfium::base::checked_cast(pageLink->CountLinks()); +} + +DLLEXPORT int STDCALL FPDFLink_GetURL(FPDF_PAGELINK link_page, + int link_index, + unsigned short* buffer, + int buflen) { + CFX_WideString wsUrl(L""); + if (link_page && link_index >= 0) { + CPDF_LinkExtract* pageLink = CPDFLinkExtractFromFPDFPageLink(link_page); + wsUrl = pageLink->GetURL(link_index); + } + CFX_ByteString cbUTF16URL = wsUrl.UTF16LE_Encode(); + int required = cbUTF16URL.GetLength() / sizeof(unsigned short); + if (!buffer || buflen <= 0) + return required; + + int size = std::min(required, buflen); + if (size > 0) { + int buf_size = size * sizeof(unsigned short); + FXSYS_memcpy(buffer, cbUTF16URL.GetBuffer(buf_size), buf_size); + } + return size; +} + +DLLEXPORT int STDCALL FPDFLink_CountRects(FPDF_PAGELINK link_page, + int link_index) { + if (!link_page || link_index < 0) + return 0; + + CPDF_LinkExtract* pageLink = CPDFLinkExtractFromFPDFPageLink(link_page); + return pdfium::CollectionSize(pageLink->GetRects(link_index)); +} + +DLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page, + int link_index, + int rect_index, + double* left, + double* top, + double* right, + double* bottom) { + if (!link_page || link_index < 0 || rect_index < 0) + return; + + CPDF_LinkExtract* pageLink = CPDFLinkExtractFromFPDFPageLink(link_page); + std::vector rectArray = pageLink->GetRects(link_index); + if (rect_index >= pdfium::CollectionSize(rectArray)) + return; + + *left = rectArray[rect_index].left; + *right = rectArray[rect_index].right; + *top = rectArray[rect_index].top; + *bottom = rectArray[rect_index].bottom; +} + +DLLEXPORT void STDCALL FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page) { + delete CPDFLinkExtractFromFPDFPageLink(link_page); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdftext_embeddertest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdftext_embeddertest.cpp new file mode 100644 index 000000000000..198ef8a7f2f1 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdftext_embeddertest.cpp @@ -0,0 +1,407 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include + +#include "core/fxcrt/fx_basic.h" +#include "public/fpdf_text.h" +#include "public/fpdfview.h" +#include "testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" + +namespace { + +bool check_unsigned_shorts(const char* expected, + const unsigned short* actual, + size_t length) { + if (length > strlen(expected) + 1) { + return false; + } + for (size_t i = 0; i < length; ++i) { + if (actual[i] != static_cast(expected[i])) { + return false; + } + } + return true; +} + +} // namespace + +class FPDFTextEmbeddertest : public EmbedderTest {}; + +TEST_F(FPDFTextEmbeddertest, Text) { + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); + EXPECT_TRUE(textpage); + + static const char expected[] = "Hello, world!\r\nGoodbye, world!"; + unsigned short fixed_buffer[128]; + memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); + + // Check includes the terminating NUL that is provided. + int num_chars = FPDFText_GetText(textpage, 0, 128, fixed_buffer); + ASSERT_GE(num_chars, 0); + EXPECT_EQ(sizeof(expected), static_cast(num_chars)); + EXPECT_TRUE(check_unsigned_shorts(expected, fixed_buffer, sizeof(expected))); + + // Count does not include the terminating NUL in the string literal. + EXPECT_EQ(sizeof(expected) - 1, + static_cast(FPDFText_CountChars(textpage))); + for (size_t i = 0; i < sizeof(expected) - 1; ++i) { + EXPECT_EQ(static_cast(expected[i]), + FPDFText_GetUnicode(textpage, i)) + << " at " << i; + } + + EXPECT_EQ(12.0, FPDFText_GetFontSize(textpage, 0)); + EXPECT_EQ(16.0, FPDFText_GetFontSize(textpage, 15)); + + double left = 0.0; + double right = 0.0; + double bottom = 0.0; + double top = 0.0; + FPDFText_GetCharBox(textpage, 4, &left, &right, &bottom, &top); + EXPECT_NEAR(41.071, left, 0.001); + EXPECT_NEAR(46.243, right, 0.001); + EXPECT_NEAR(49.844, bottom, 0.001); + EXPECT_NEAR(55.520, top, 0.001); + + EXPECT_EQ(4, FPDFText_GetCharIndexAtPos(textpage, 42.0, 50.0, 1.0, 1.0)); + EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, 0.0, 0.0, 1.0, 1.0)); + EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, 199.0, 199.0, 1.0, 1.0)); + + // Test out of range indicies. + EXPECT_EQ(-1, + FPDFText_GetCharIndexAtPos(textpage, 42.0, 10000000.0, 1.0, 1.0)); + EXPECT_EQ(-1, FPDFText_GetCharIndexAtPos(textpage, -1.0, 50.0, 1.0, 1.0)); + + // Count does not include the terminating NUL in the string literal. + EXPECT_EQ(2, FPDFText_CountRects(textpage, 0, sizeof(expected) - 1)); + + left = 0.0; + right = 0.0; + bottom = 0.0; + top = 0.0; + FPDFText_GetRect(textpage, 1, &left, &top, &right, &bottom); + EXPECT_NEAR(20.847, left, 0.001); + EXPECT_NEAR(135.167, right, 0.001); + EXPECT_NEAR(96.655, bottom, 0.001); + EXPECT_NEAR(116.000, top, 0.001); + + // Test out of range indicies set outputs to (0.0, 0.0, 0.0, 0.0). + left = -1.0; + right = -1.0; + bottom = -1.0; + top = -1.0; + FPDFText_GetRect(textpage, -1, &left, &top, &right, &bottom); + EXPECT_EQ(0.0, left); + EXPECT_EQ(0.0, right); + EXPECT_EQ(0.0, bottom); + EXPECT_EQ(0.0, top); + + left = -2.0; + right = -2.0; + bottom = -2.0; + top = -2.0; + FPDFText_GetRect(textpage, 2, &left, &top, &right, &bottom); + EXPECT_EQ(0.0, left); + EXPECT_EQ(0.0, right); + EXPECT_EQ(0.0, bottom); + EXPECT_EQ(0.0, top); + + EXPECT_EQ(9, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, 0, 0)); + + // Extract starting at character 4 as above. + memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); + EXPECT_EQ(1, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, + fixed_buffer, 1)); + EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 1)); + EXPECT_EQ(0xbdbd, fixed_buffer[1]); + + memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); + EXPECT_EQ(9, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, + fixed_buffer, 9)); + EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); + EXPECT_EQ(0xbdbd, fixed_buffer[9]); + + memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); + EXPECT_EQ(10, FPDFText_GetBoundedText(textpage, 41.0, 56.0, 82.0, 48.0, + fixed_buffer, 128)); + EXPECT_TRUE(check_unsigned_shorts(expected + 4, fixed_buffer, 9)); + EXPECT_EQ(0u, fixed_buffer[9]); + EXPECT_EQ(0xbdbd, fixed_buffer[10]); + + FPDFText_ClosePage(textpage); + UnloadPage(page); +} + +TEST_F(FPDFTextEmbeddertest, TextSearch) { + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); + EXPECT_TRUE(textpage); + + std::unique_ptr nope = + GetFPDFWideString(L"nope"); + std::unique_ptr world = + GetFPDFWideString(L"world"); + std::unique_ptr world_caps = + GetFPDFWideString(L"WORLD"); + std::unique_ptr world_substr = + GetFPDFWideString(L"orld"); + + // No occurences of "nope" in test page. + FPDF_SCHHANDLE search = FPDFText_FindStart(textpage, nope.get(), 0, 0); + EXPECT_TRUE(search); + EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); + EXPECT_EQ(0, FPDFText_GetSchCount(search)); + + // Advancing finds nothing. + EXPECT_FALSE(FPDFText_FindNext(search)); + EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); + EXPECT_EQ(0, FPDFText_GetSchCount(search)); + + // Retreating finds nothing. + EXPECT_FALSE(FPDFText_FindPrev(search)); + EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); + EXPECT_EQ(0, FPDFText_GetSchCount(search)); + FPDFText_FindClose(search); + + // Two occurences of "world" in test page. + search = FPDFText_FindStart(textpage, world.get(), 0, 2); + EXPECT_TRUE(search); + + // Remains not found until advanced. + EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); + EXPECT_EQ(0, FPDFText_GetSchCount(search)); + + // First occurence of "world" in this test page. + EXPECT_TRUE(FPDFText_FindNext(search)); + EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); + EXPECT_EQ(5, FPDFText_GetSchCount(search)); + + // Last occurence of "world" in this test page. + EXPECT_TRUE(FPDFText_FindNext(search)); + EXPECT_EQ(24, FPDFText_GetSchResultIndex(search)); + EXPECT_EQ(5, FPDFText_GetSchCount(search)); + + // Found position unchanged when fails to advance. + EXPECT_FALSE(FPDFText_FindNext(search)); + EXPECT_EQ(24, FPDFText_GetSchResultIndex(search)); + EXPECT_EQ(5, FPDFText_GetSchCount(search)); + + // Back to first occurence. + EXPECT_TRUE(FPDFText_FindPrev(search)); + EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); + EXPECT_EQ(5, FPDFText_GetSchCount(search)); + + // Found position unchanged when fails to retreat. + EXPECT_FALSE(FPDFText_FindPrev(search)); + EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); + EXPECT_EQ(5, FPDFText_GetSchCount(search)); + FPDFText_FindClose(search); + + // Exact search unaffected by case sensitiity and whole word flags. + search = FPDFText_FindStart(textpage, world.get(), + FPDF_MATCHCASE | FPDF_MATCHWHOLEWORD, 0); + EXPECT_TRUE(search); + EXPECT_TRUE(FPDFText_FindNext(search)); + EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); + EXPECT_EQ(5, FPDFText_GetSchCount(search)); + FPDFText_FindClose(search); + + // Default is case-insensitive, so matching agaist caps works. + search = FPDFText_FindStart(textpage, world_caps.get(), 0, 0); + EXPECT_TRUE(search); + EXPECT_TRUE(FPDFText_FindNext(search)); + EXPECT_EQ(7, FPDFText_GetSchResultIndex(search)); + EXPECT_EQ(5, FPDFText_GetSchCount(search)); + FPDFText_FindClose(search); + + // But can be made case sensitive, in which case this fails. + search = FPDFText_FindStart(textpage, world_caps.get(), FPDF_MATCHCASE, 0); + EXPECT_FALSE(FPDFText_FindNext(search)); + EXPECT_EQ(0, FPDFText_GetSchResultIndex(search)); + EXPECT_EQ(0, FPDFText_GetSchCount(search)); + FPDFText_FindClose(search); + + // Default is match anywhere within word, so matching substirng works. + search = FPDFText_FindStart(textpage, world_substr.get(), 0, 0); + EXPECT_TRUE(FPDFText_FindNext(search)); + EXPECT_EQ(8, FPDFText_GetSchResultIndex(search)); + EXPECT_EQ(4, FPDFText_GetSchCount(search)); + FPDFText_FindClose(search); + + // But can be made to mach word boundaries, in which case this fails. + search = + FPDFText_FindStart(textpage, world_substr.get(), FPDF_MATCHWHOLEWORD, 0); + EXPECT_FALSE(FPDFText_FindNext(search)); + // TODO(tsepez): investigate strange index/count values in this state. + FPDFText_FindClose(search); + + FPDFText_ClosePage(textpage); + UnloadPage(page); +} + +// Test that the page has characters despite a bad stream length. +TEST_F(FPDFTextEmbeddertest, StreamLengthPastEndOfFile) { + EXPECT_TRUE(OpenDocument("bug_57.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); + EXPECT_TRUE(textpage); + EXPECT_EQ(13, FPDFText_CountChars(textpage)); + + FPDFText_ClosePage(textpage); + UnloadPage(page); +} + +TEST_F(FPDFTextEmbeddertest, WebLinks) { + EXPECT_TRUE(OpenDocument("weblinks.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); + EXPECT_TRUE(textpage); + + FPDF_PAGELINK pagelink = FPDFLink_LoadWebLinks(textpage); + EXPECT_TRUE(pagelink); + + // Page contains two HTTP-style URLs. + EXPECT_EQ(2, FPDFLink_CountWebLinks(pagelink)); + + // Only a terminating NUL required for bogus links. + EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 2, nullptr, 0)); + EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 1400, nullptr, 0)); + EXPECT_EQ(1, FPDFLink_GetURL(pagelink, -1, nullptr, 0)); + + // Query the number of characters required for each link (incl NUL). + EXPECT_EQ(25, FPDFLink_GetURL(pagelink, 0, nullptr, 0)); + EXPECT_EQ(26, FPDFLink_GetURL(pagelink, 1, nullptr, 0)); + + static const char expected_url[] = "http://example.com?q=foo"; + static const size_t expected_len = sizeof(expected_url); + unsigned short fixed_buffer[128]; + + // Retrieve a link with too small a buffer. Buffer will not be + // NUL-terminated, but must not be modified past indicated length, + // so pre-fill with a pattern to check write bounds. + memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); + EXPECT_EQ(1, FPDFLink_GetURL(pagelink, 0, fixed_buffer, 1)); + EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer, 1)); + EXPECT_EQ(0xbdbd, fixed_buffer[1]); + + // Check buffer that doesn't have space for a terminating NUL. + memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); + EXPECT_EQ(static_cast(expected_len - 1), + FPDFLink_GetURL(pagelink, 0, fixed_buffer, expected_len - 1)); + EXPECT_TRUE( + check_unsigned_shorts(expected_url, fixed_buffer, expected_len - 1)); + EXPECT_EQ(0xbdbd, fixed_buffer[expected_len - 1]); + + // Retreive link with exactly-sized buffer. + memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); + EXPECT_EQ(static_cast(expected_len), + FPDFLink_GetURL(pagelink, 0, fixed_buffer, expected_len)); + EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer, expected_len)); + EXPECT_EQ(0u, fixed_buffer[expected_len - 1]); + EXPECT_EQ(0xbdbd, fixed_buffer[expected_len]); + + // Retreive link with ample-sized-buffer. + memset(fixed_buffer, 0xbd, sizeof(fixed_buffer)); + EXPECT_EQ(static_cast(expected_len), + FPDFLink_GetURL(pagelink, 0, fixed_buffer, 128)); + EXPECT_TRUE(check_unsigned_shorts(expected_url, fixed_buffer, expected_len)); + EXPECT_EQ(0u, fixed_buffer[expected_len - 1]); + EXPECT_EQ(0xbdbd, fixed_buffer[expected_len]); + + // Each link rendered in a single rect in this test page. + EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 0)); + EXPECT_EQ(1, FPDFLink_CountRects(pagelink, 1)); + + // Each link rendered in a single rect in this test page. + EXPECT_EQ(0, FPDFLink_CountRects(pagelink, -1)); + EXPECT_EQ(0, FPDFLink_CountRects(pagelink, 2)); + EXPECT_EQ(0, FPDFLink_CountRects(pagelink, 10000)); + + // Check boundary of valid link index with valid rect index. + double left = 0.0; + double right = 0.0; + double top = 0.0; + double bottom = 0.0; + FPDFLink_GetRect(pagelink, 0, 0, &left, &top, &right, &bottom); + EXPECT_NEAR(50.791, left, 0.001); + EXPECT_NEAR(187.963, right, 0.001); + EXPECT_NEAR(97.624, bottom, 0.001); + EXPECT_NEAR(108.736, top, 0.001); + + // Check that valid link with invalid rect index leaves parameters unchanged. + left = -1.0; + right = -1.0; + top = -1.0; + bottom = -1.0; + FPDFLink_GetRect(pagelink, 0, 1, &left, &top, &right, &bottom); + EXPECT_EQ(-1.0, left); + EXPECT_EQ(-1.0, right); + EXPECT_EQ(-1.0, bottom); + EXPECT_EQ(-1.0, top); + + // Check that invalid link index leaves parameters unchanged. + left = -2.0; + right = -2.0; + top = -2.0; + bottom = -2.0; + FPDFLink_GetRect(pagelink, -1, 0, &left, &top, &right, &bottom); + EXPECT_EQ(-2.0, left); + EXPECT_EQ(-2.0, right); + EXPECT_EQ(-2.0, bottom); + EXPECT_EQ(-2.0, top); + + FPDFLink_CloseWebLinks(pagelink); + FPDFText_ClosePage(textpage); + UnloadPage(page); +} + +TEST_F(FPDFTextEmbeddertest, GetFontSize) { + EXPECT_TRUE(OpenDocument("hello_world.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); + EXPECT_TRUE(textpage); + + const double kExpectedFontsSizes[] = {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 1, 1, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}; + + int count = FPDFText_CountChars(textpage); + ASSERT_EQ(FX_ArraySize(kExpectedFontsSizes), static_cast(count)); + for (int i = 0; i < count; ++i) + EXPECT_EQ(kExpectedFontsSizes[i], FPDFText_GetFontSize(textpage, i)) << i; + + FPDFText_ClosePage(textpage); + UnloadPage(page); +} + +TEST_F(FPDFTextEmbeddertest, ToUnicode) { + EXPECT_TRUE(OpenDocument("bug_583.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_TRUE(page); + + FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); + EXPECT_TRUE(textpage); + + ASSERT_EQ(1, FPDFText_CountChars(textpage)); + EXPECT_EQ(static_cast(0), FPDFText_GetUnicode(textpage, 0)); + + FPDFText_ClosePage(textpage); + UnloadPage(page); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfview.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfview.cpp new file mode 100644 index 000000000000..1e7a651aa826 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfview.cpp @@ -0,0 +1,1272 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "public/fpdfview.h" + +#include +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/cpdf_pagerendercontext.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfapi/render/cpdf_progressiverenderer.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fpdfdoc/cpdf_annotlist.h" +#include "core/fpdfdoc/cpdf_nametree.h" +#include "core/fpdfdoc/cpdf_occontext.h" +#include "core/fpdfdoc/cpdf_viewerpreferences.h" +#include "core/fxcodec/fx_codec.h" +#include "core/fxcrt/fx_memory.h" +#include "core/fxcrt/fx_safe_types.h" +#include "core/fxge/cfx_fxgedevice.h" +#include "core/fxge/cfx_gemodule.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/fsdk_define.h" +#include "fpdfsdk/fsdk_pauseadapter.h" +#include "fpdfsdk/javascript/ijs_runtime.h" +#include "public/fpdf_ext.h" +#include "public/fpdf_progressive.h" +#include "third_party/base/numerics/safe_conversions_impl.h" +#include "third_party/base/ptr_util.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" +#include "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h" +#include "public/fpdf_formfill.h" +#include "xfa/fxbarcode/BC_Library.h" +#endif // PDF_ENABLE_XFA + +#ifdef PDF_ENABLE_XFA_BMP +#include "core/fxcodec/codec/ccodec_bmpmodule.h" +#endif + +#ifdef PDF_ENABLE_XFA_GIF +#include "core/fxcodec/codec/ccodec_gifmodule.h" +#endif + +#ifdef PDF_ENABLE_XFA_PNG +#include "core/fxcodec/codec/ccodec_pngmodule.h" +#endif + +#ifdef PDF_ENABLE_XFA_TIFF +#include "core/fxcodec/codec/ccodec_tiffmodule.h" +#endif + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ +#include "core/fxge/cfx_windowsdevice.h" +#endif + +namespace { + +// Also indicates whether library is currently initialized. +CCodec_ModuleMgr* g_pCodecModule = nullptr; + +void RenderPageImpl(CPDF_PageRenderContext* pContext, + CPDF_Page* pPage, + const CFX_Matrix& matrix, + const FX_RECT& clipping_rect, + int flags, + bool bNeedToRestore, + IFSDK_PAUSE_Adapter* pause) { + if (!pContext->m_pOptions) + pContext->m_pOptions = pdfium::MakeUnique(); + + if (flags & FPDF_LCD_TEXT) + pContext->m_pOptions->m_Flags |= RENDER_CLEARTYPE; + else + pContext->m_pOptions->m_Flags &= ~RENDER_CLEARTYPE; + + if (flags & FPDF_NO_NATIVETEXT) + pContext->m_pOptions->m_Flags |= RENDER_NO_NATIVETEXT; + if (flags & FPDF_RENDER_LIMITEDIMAGECACHE) + pContext->m_pOptions->m_Flags |= RENDER_LIMITEDIMAGECACHE; + if (flags & FPDF_RENDER_FORCEHALFTONE) + pContext->m_pOptions->m_Flags |= RENDER_FORCE_HALFTONE; +#ifndef PDF_ENABLE_XFA + if (flags & FPDF_RENDER_NO_SMOOTHTEXT) + pContext->m_pOptions->m_Flags |= RENDER_NOTEXTSMOOTH; + if (flags & FPDF_RENDER_NO_SMOOTHIMAGE) + pContext->m_pOptions->m_Flags |= RENDER_NOIMAGESMOOTH; + if (flags & FPDF_RENDER_NO_SMOOTHPATH) + pContext->m_pOptions->m_Flags |= RENDER_NOPATHSMOOTH; +#endif // PDF_ENABLE_XFA + + // Grayscale output + if (flags & FPDF_GRAYSCALE) { + pContext->m_pOptions->m_ColorMode = RENDER_COLOR_GRAY; + pContext->m_pOptions->m_ForeColor = 0; + pContext->m_pOptions->m_BackColor = 0xffffff; + } + + const CPDF_OCContext::UsageType usage = + (flags & FPDF_PRINTING) ? CPDF_OCContext::Print : CPDF_OCContext::View; + pContext->m_pOptions->m_AddFlags = flags >> 8; + pContext->m_pOptions->m_pOCContext = + pdfium::MakeRetain(pPage->m_pDocument, usage); + + pContext->m_pDevice->SaveState(); + pContext->m_pDevice->SetClip_Rect(clipping_rect); + + pContext->m_pContext = pdfium::MakeUnique(pPage); + pContext->m_pContext->AppendLayer(pPage, &matrix); + + if (flags & FPDF_ANNOT) { + pContext->m_pAnnots = pdfium::MakeUnique(pPage); + bool bPrinting = pContext->m_pDevice->GetDeviceClass() != FXDC_DISPLAY; + pContext->m_pAnnots->DisplayAnnots(pPage, pContext->m_pContext.get(), + bPrinting, &matrix, false, nullptr); + } + + pContext->m_pRenderer = pdfium::MakeUnique( + pContext->m_pContext.get(), pContext->m_pDevice.get(), + pContext->m_pOptions.get()); + pContext->m_pRenderer->Start(pause); + if (bNeedToRestore) + pContext->m_pDevice->RestoreState(false); +} + +class CPDF_CustomAccess final : public IFX_SeekableReadStream { + public: + static CFX_RetainPtr Create(FPDF_FILEACCESS* pFileAccess) { + return CFX_RetainPtr(new CPDF_CustomAccess(pFileAccess)); + } + + // IFX_SeekableReadStream + FX_FILESIZE GetSize() override; + bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; + + private: + explicit CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess); + + FPDF_FILEACCESS m_FileAccess; +}; + +CPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess) + : m_FileAccess(*pFileAccess) {} + +FX_FILESIZE CPDF_CustomAccess::GetSize() { + return m_FileAccess.m_FileLen; +} + +bool CPDF_CustomAccess::ReadBlock(void* buffer, + FX_FILESIZE offset, + size_t size) { + if (offset < 0) + return false; + + FX_SAFE_FILESIZE newPos = pdfium::base::checked_cast(size); + newPos += offset; + if (!newPos.IsValid() || + newPos.ValueOrDie() > static_cast(m_FileAccess.m_FileLen)) { + return false; + } + return !!m_FileAccess.m_GetBlock(m_FileAccess.m_Param, offset, + reinterpret_cast(buffer), size); +} + +#ifdef PDF_ENABLE_XFA +class CFPDF_FileStream : public IFX_SeekableStream { + public: + static CFX_RetainPtr Create(FPDF_FILEHANDLER* pFS) { + return CFX_RetainPtr(new CFPDF_FileStream(pFS)); + } + ~CFPDF_FileStream() override; + + // IFX_SeekableStream: + FX_FILESIZE GetSize() override; + bool IsEOF() override; + FX_FILESIZE GetPosition() override; + bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; + size_t ReadBlock(void* buffer, size_t size) override; + bool WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) override; + bool Flush() override; + + void SetPosition(FX_FILESIZE pos) { m_nCurPos = pos; } + + protected: + explicit CFPDF_FileStream(FPDF_FILEHANDLER* pFS); + + FPDF_FILEHANDLER* m_pFS; + FX_FILESIZE m_nCurPos; +}; + +CFPDF_FileStream::CFPDF_FileStream(FPDF_FILEHANDLER* pFS) { + m_pFS = pFS; + m_nCurPos = 0; +} + +CFPDF_FileStream::~CFPDF_FileStream() { + if (m_pFS && m_pFS->Release) + m_pFS->Release(m_pFS->clientData); +} + +FX_FILESIZE CFPDF_FileStream::GetSize() { + if (m_pFS && m_pFS->GetSize) + return (FX_FILESIZE)m_pFS->GetSize(m_pFS->clientData); + return 0; +} + +bool CFPDF_FileStream::IsEOF() { + return m_nCurPos >= GetSize(); +} + +FX_FILESIZE CFPDF_FileStream::GetPosition() { + return m_nCurPos; +} + +bool CFPDF_FileStream::ReadBlock(void* buffer, + FX_FILESIZE offset, + size_t size) { + if (!buffer || !size || !m_pFS->ReadBlock) + return false; + + if (m_pFS->ReadBlock(m_pFS->clientData, (FPDF_DWORD)offset, buffer, + (FPDF_DWORD)size) == 0) { + m_nCurPos = offset + size; + return true; + } + return false; +} + +size_t CFPDF_FileStream::ReadBlock(void* buffer, size_t size) { + if (!buffer || !size || !m_pFS->ReadBlock) + return 0; + + FX_FILESIZE nSize = GetSize(); + if (m_nCurPos >= nSize) + return 0; + FX_FILESIZE dwAvail = nSize - m_nCurPos; + if (dwAvail < (FX_FILESIZE)size) + size = (size_t)dwAvail; + if (m_pFS->ReadBlock(m_pFS->clientData, (FPDF_DWORD)m_nCurPos, buffer, + (FPDF_DWORD)size) == 0) { + m_nCurPos += size; + return size; + } + + return 0; +} + +bool CFPDF_FileStream::WriteBlock(const void* buffer, + FX_FILESIZE offset, + size_t size) { + if (!m_pFS || !m_pFS->WriteBlock) + return false; + + if (m_pFS->WriteBlock(m_pFS->clientData, (FPDF_DWORD)offset, buffer, + (FPDF_DWORD)size) == 0) { + m_nCurPos = offset + size; + return true; + } + return false; +} + +bool CFPDF_FileStream::Flush() { + if (!m_pFS || !m_pFS->Flush) + return true; + + return m_pFS->Flush(m_pFS->clientData) == 0; +} +#endif // PDF_ENABLE_XFA + +} // namespace + +UnderlyingDocumentType* UnderlyingFromFPDFDocument(FPDF_DOCUMENT doc) { + return static_cast(doc); +} + +FPDF_DOCUMENT FPDFDocumentFromUnderlying(UnderlyingDocumentType* doc) { + return static_cast(doc); +} + +UnderlyingPageType* UnderlyingFromFPDFPage(FPDF_PAGE page) { + return static_cast(page); +} + +CPDF_Document* CPDFDocumentFromFPDFDocument(FPDF_DOCUMENT doc) { +#ifdef PDF_ENABLE_XFA + return doc ? UnderlyingFromFPDFDocument(doc)->GetPDFDoc() : nullptr; +#else // PDF_ENABLE_XFA + return UnderlyingFromFPDFDocument(doc); +#endif // PDF_ENABLE_XFA +} + +FPDF_DOCUMENT FPDFDocumentFromCPDFDocument(CPDF_Document* doc) { +#ifdef PDF_ENABLE_XFA + return doc ? FPDFDocumentFromUnderlying( + new CPDFXFA_Context(pdfium::WrapUnique(doc))) + : nullptr; +#else // PDF_ENABLE_XFA + return FPDFDocumentFromUnderlying(doc); +#endif // PDF_ENABLE_XFA +} + +CPDF_Page* CPDFPageFromFPDFPage(FPDF_PAGE page) { +#ifdef PDF_ENABLE_XFA + return page ? UnderlyingFromFPDFPage(page)->GetPDFPage() : nullptr; +#else // PDF_ENABLE_XFA + return UnderlyingFromFPDFPage(page); +#endif // PDF_ENABLE_XFA +} + +CFX_DIBitmap* CFXBitmapFromFPDFBitmap(FPDF_BITMAP bitmap) { + return static_cast(bitmap); +} + +CFX_RetainPtr MakeSeekableReadStream( + FPDF_FILEACCESS* pFileAccess) { + return CPDF_CustomAccess::Create(pFileAccess); +} + +#ifdef PDF_ENABLE_XFA +CFX_RetainPtr MakeSeekableStream( + FPDF_FILEHANDLER* pFilehandler) { + return CFPDF_FileStream::Create(pFilehandler); +} +#endif // PDF_ENABLE_XFA + +// 0 bit: FPDF_POLICY_MACHINETIME_ACCESS +static uint32_t foxit_sandbox_policy = 0xFFFFFFFF; + +void FSDK_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable) { + switch (policy) { + case FPDF_POLICY_MACHINETIME_ACCESS: { + if (enable) + foxit_sandbox_policy |= 0x01; + else + foxit_sandbox_policy &= 0xFFFFFFFE; + } break; + default: + break; + } +} + +FPDF_BOOL FSDK_IsSandBoxPolicyEnabled(FPDF_DWORD policy) { + switch (policy) { + case FPDF_POLICY_MACHINETIME_ACCESS: + return !!(foxit_sandbox_policy & 0x01); + default: + return false; + } +} + +DLLEXPORT void STDCALL FPDF_InitLibrary() { + FPDF_InitLibraryWithConfig(nullptr); +} + +DLLEXPORT void STDCALL +FPDF_InitLibraryWithConfig(const FPDF_LIBRARY_CONFIG* cfg) { + if (g_pCodecModule) + return; + + g_pCodecModule = new CCodec_ModuleMgr(); + + CFX_GEModule* pModule = CFX_GEModule::Get(); + pModule->Init(cfg ? cfg->m_pUserFontPaths : nullptr, g_pCodecModule); + + CPDF_ModuleMgr* pModuleMgr = CPDF_ModuleMgr::Get(); + pModuleMgr->SetCodecModule(g_pCodecModule); + pModuleMgr->InitPageModule(); + pModuleMgr->LoadEmbeddedGB1CMaps(); + pModuleMgr->LoadEmbeddedJapan1CMaps(); + pModuleMgr->LoadEmbeddedCNS1CMaps(); + pModuleMgr->LoadEmbeddedKorea1CMaps(); + +#ifdef PDF_ENABLE_XFA_BMP + pModuleMgr->GetCodecModule()->SetBmpModule( + pdfium::MakeUnique()); +#endif + +#ifdef PDF_ENABLE_XFA_GIF + pModuleMgr->GetCodecModule()->SetGifModule( + pdfium::MakeUnique()); +#endif + +#ifdef PDF_ENABLE_XFA_PNG + pModuleMgr->GetCodecModule()->SetPngModule( + pdfium::MakeUnique()); +#endif + +#ifdef PDF_ENABLE_XFA_TIFF + pModuleMgr->GetCodecModule()->SetTiffModule( + pdfium::MakeUnique()); +#endif + +#ifdef PDF_ENABLE_XFA + FXJSE_Initialize(); + BC_Library_Init(); +#endif // PDF_ENABLE_XFA + if (cfg && cfg->version >= 2) + IJS_Runtime::Initialize(cfg->m_v8EmbedderSlot, cfg->m_pIsolate); +} + +DLLEXPORT void STDCALL FPDF_DestroyLibrary() { + if (!g_pCodecModule) + return; + +#ifdef PDF_ENABLE_XFA + BC_Library_Destory(); + FXJSE_Finalize(); +#endif // PDF_ENABLE_XFA + + CPDF_ModuleMgr::Destroy(); + CFX_GEModule::Destroy(); + + delete g_pCodecModule; + g_pCodecModule = nullptr; + + IJS_Runtime::Destroy(); +} + +#ifndef _WIN32 +int g_LastError; +void SetLastError(int err) { + g_LastError = err; +} + +int GetLastError() { + return g_LastError; +} +#endif // _WIN32 + +void ProcessParseError(CPDF_Parser::Error err) { + uint32_t err_code = FPDF_ERR_SUCCESS; + // Translate FPDFAPI error code to FPDFVIEW error code + switch (err) { + case CPDF_Parser::SUCCESS: + err_code = FPDF_ERR_SUCCESS; + break; + case CPDF_Parser::FILE_ERROR: + err_code = FPDF_ERR_FILE; + break; + case CPDF_Parser::FORMAT_ERROR: + err_code = FPDF_ERR_FORMAT; + break; + case CPDF_Parser::PASSWORD_ERROR: + err_code = FPDF_ERR_PASSWORD; + break; + case CPDF_Parser::HANDLER_ERROR: + err_code = FPDF_ERR_SECURITY; + break; + } + SetLastError(err_code); +} + +DLLEXPORT void STDCALL FPDF_SetSandBoxPolicy(FPDF_DWORD policy, + FPDF_BOOL enable) { + return FSDK_SetSandBoxPolicy(policy, enable); +} + +#if defined(_WIN32) +#if defined(PDFIUM_PRINT_TEXT_WITH_GDI) +DLLEXPORT void STDCALL +FPDF_SetTypefaceAccessibleFunc(PDFiumEnsureTypefaceCharactersAccessible func) { + g_pdfium_typeface_accessible_func = func; +} + +DLLEXPORT void STDCALL FPDF_SetPrintTextWithGDI(FPDF_BOOL use_gdi) { + g_pdfium_print_text_with_gdi = !!use_gdi; +} +#endif // PDFIUM_PRINT_TEXT_WITH_GDI + +DLLEXPORT FPDF_BOOL STDCALL FPDF_SetPrintPostscriptLevel(int postscript_level) { + if (postscript_level != 0 && postscript_level != 2 && postscript_level != 3) + return FALSE; + g_pdfium_print_postscript_level = postscript_level; + return TRUE; +} +#endif // defined(_WIN32) + +DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path, + FPDF_BYTESTRING password) { + // NOTE: the creation of the file needs to be by the embedder on the + // other side of this API. + CFX_RetainPtr pFileAccess = + IFX_SeekableReadStream::CreateFromFilename((const FX_CHAR*)file_path); + if (!pFileAccess) + return nullptr; + + auto pParser = pdfium::MakeUnique(); + pParser->SetPassword(password); + + auto pDocument = pdfium::MakeUnique(std::move(pParser)); + CPDF_Parser::Error error = + pDocument->GetParser()->StartParse(pFileAccess, pDocument.get()); + if (error != CPDF_Parser::SUCCESS) { + ProcessParseError(error); + return nullptr; + } + return FPDFDocumentFromCPDFDocument(pDocument.release()); +} + +#ifdef PDF_ENABLE_XFA +DLLEXPORT FPDF_BOOL STDCALL FPDF_HasXFAField(FPDF_DOCUMENT document, + int* docType) { + if (!document) + return false; + + CPDF_Document* pdfDoc = + (static_cast(document))->GetPDFDoc(); + if (!pdfDoc) + return false; + + CPDF_Dictionary* pRoot = pdfDoc->GetRoot(); + if (!pRoot) + return false; + + CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm"); + if (!pAcroForm) + return false; + + CPDF_Object* pXFA = pAcroForm->GetObjectFor("XFA"); + if (!pXFA) + return false; + + bool bDynamicXFA = pRoot->GetBooleanFor("NeedsRendering", false); + *docType = bDynamicXFA ? DOCTYPE_DYNAMIC_XFA : DOCTYPE_STATIC_XFA; + return true; +} + +DLLEXPORT FPDF_BOOL STDCALL FPDF_LoadXFA(FPDF_DOCUMENT document) { + return document && (static_cast(document))->LoadXFADoc(); +} +#endif // PDF_ENABLE_XFA + +class CMemFile final : public IFX_SeekableReadStream { + public: + static CFX_RetainPtr Create(uint8_t* pBuf, FX_FILESIZE size) { + return CFX_RetainPtr(new CMemFile(pBuf, size)); + } + + FX_FILESIZE GetSize() override { return m_size; } + bool ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override { + if (offset < 0) + return false; + + FX_SAFE_FILESIZE newPos = pdfium::base::checked_cast(size); + newPos += offset; + if (!newPos.IsValid() || newPos.ValueOrDie() > m_size) + return false; + + FXSYS_memcpy(buffer, m_pBuf + offset, size); + return true; + } + + private: + CMemFile(uint8_t* pBuf, FX_FILESIZE size) : m_pBuf(pBuf), m_size(size) {} + + uint8_t* const m_pBuf; + const FX_FILESIZE m_size; +}; + +DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf, + int size, + FPDF_BYTESTRING password) { + CFX_RetainPtr pMemFile = CMemFile::Create((uint8_t*)data_buf, size); + auto pParser = pdfium::MakeUnique(); + pParser->SetPassword(password); + + auto pDocument = pdfium::MakeUnique(std::move(pParser)); + CPDF_Parser::Error error = + pDocument->GetParser()->StartParse(pMemFile, pDocument.get()); + if (error != CPDF_Parser::SUCCESS) { + ProcessParseError(error); + return nullptr; + } + CheckUnSupportError(pDocument.get(), error); + return FPDFDocumentFromCPDFDocument(pDocument.release()); +} + +DLLEXPORT FPDF_DOCUMENT STDCALL +FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, + FPDF_BYTESTRING password) { + CFX_RetainPtr pFile = + CPDF_CustomAccess::Create(pFileAccess); + auto pParser = pdfium::MakeUnique(); + pParser->SetPassword(password); + + auto pDocument = pdfium::MakeUnique(std::move(pParser)); + CPDF_Parser::Error error = + pDocument->GetParser()->StartParse(pFile, pDocument.get()); + if (error != CPDF_Parser::SUCCESS) { + ProcessParseError(error); + return nullptr; + } + CheckUnSupportError(pDocument.get(), error); + return FPDFDocumentFromCPDFDocument(pDocument.release()); +} + +DLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, + int* fileVersion) { + if (!fileVersion) + return false; + + *fileVersion = 0; + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(doc); + if (!pDoc) + return false; + + CPDF_Parser* pParser = pDoc->GetParser(); + if (!pParser) + return false; + + *fileVersion = pParser->GetFileVersion(); + return true; +} + +// jabdelmalek: changed return type from uint32_t to build on Linux (and match +// header). +DLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + // https://bugs.chromium.org/p/pdfium/issues/detail?id=499 + if (!pDoc) { +#ifndef PDF_ENABLE_XFA + return 0; +#else // PDF_ENABLE_XFA + return 0xFFFFFFFF; +#endif // PDF_ENABLE_XFA + } + + return pDoc->GetUserPermissions(); +} + +DLLEXPORT int STDCALL FPDF_GetSecurityHandlerRevision(FPDF_DOCUMENT document) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc || !pDoc->GetParser()) + return -1; + + CPDF_Dictionary* pDict = pDoc->GetParser()->GetEncryptDict(); + return pDict ? pDict->GetIntegerFor("R") : -1; +} + +DLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document) { + UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document); + return pDoc ? pDoc->GetPageCount() : 0; +} + +DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, + int page_index) { + UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document); + if (!pDoc) + return nullptr; + + if (page_index < 0 || page_index >= pDoc->GetPageCount()) + return nullptr; + +#ifdef PDF_ENABLE_XFA + return pDoc->GetXFAPage(page_index); +#else // PDF_ENABLE_XFA + CPDF_Dictionary* pDict = pDoc->GetPage(page_index); + if (!pDict) + return nullptr; + + CPDF_Page* pPage = new CPDF_Page(pDoc, pDict, true); + pPage->ParseContent(); + return pPage; +#endif // PDF_ENABLE_XFA +} + +DLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page) { + UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); + return pPage ? pPage->GetPageWidth() : 0.0; +} + +DLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page) { + UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); + return pPage ? pPage->GetPageHeight() : 0.0; +} + +#if defined(_WIN32) +DLLEXPORT void STDCALL FPDF_RenderPage(HDC dc, + FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int flags) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return; + + CPDF_PageRenderContext* pContext = new CPDF_PageRenderContext; + pPage->SetRenderContext(pdfium::WrapUnique(pContext)); + + std::unique_ptr pBitmap; + // TODO: This results in unnecessary rasterization of some PDFs due to + // HasImageMask() returning true. If any image on the page is a mask, the + // entire page gets rasterized and the spool size gets huge. + const bool bNewBitmap = + pPage->BackgroundAlphaNeeded() || pPage->HasImageMask(); + if (bNewBitmap) { + pBitmap = pdfium::MakeUnique(); + pBitmap->Create(size_x, size_y, FXDIB_Argb); + pBitmap->Clear(0x00ffffff); + CFX_FxgeDevice* pDevice = new CFX_FxgeDevice; + pContext->m_pDevice = pdfium::WrapUnique(pDevice); + pDevice->Attach(pBitmap.get(), false, nullptr, false); + } else { + pContext->m_pDevice = pdfium::MakeUnique(dc); + } + + FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y, + rotate, flags, true, nullptr); + + if (bNewBitmap) { + CFX_WindowsDevice WinDC(dc); + if (WinDC.GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER) { + std::unique_ptr pDst = pdfium::MakeUnique(); + int pitch = pBitmap->GetPitch(); + pDst->Create(size_x, size_y, FXDIB_Rgb32); + FXSYS_memset(pDst->GetBuffer(), -1, pitch * size_y); + pDst->CompositeBitmap(0, 0, size_x, size_y, pBitmap.get(), 0, 0, + FXDIB_BLEND_NORMAL, nullptr, false, nullptr); + WinDC.StretchDIBits(pDst.get(), 0, 0, size_x, size_y); + } else { + WinDC.SetDIBits(pBitmap.get(), 0, 0); + } + } + + pPage->SetRenderContext(nullptr); +} +#endif // defined(_WIN32) + +DLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, + FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int flags) { + if (!bitmap) + return; + + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return; + + CPDF_PageRenderContext* pContext = new CPDF_PageRenderContext; + pPage->SetRenderContext(pdfium::WrapUnique(pContext)); + CFX_FxgeDevice* pDevice = new CFX_FxgeDevice; + pContext->m_pDevice.reset(pDevice); + CFX_DIBitmap* pBitmap = CFXBitmapFromFPDFBitmap(bitmap); + pDevice->Attach(pBitmap, !!(flags & FPDF_REVERSE_BYTE_ORDER), nullptr, false); + + FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y, + rotate, flags, true, nullptr); + +#ifdef _SKIA_SUPPORT_PATHS_ + pDevice->Flush(); + pBitmap->UnPreMultiply(); +#endif + pPage->SetRenderContext(nullptr); +} + +DLLEXPORT void STDCALL FPDF_RenderPageBitmapWithMatrix(FPDF_BITMAP bitmap, + FPDF_PAGE page, + const FS_MATRIX* matrix, + const FS_RECTF* clipping, + int flags) { + if (!bitmap) + return; + + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return; + + CPDF_PageRenderContext* pContext = new CPDF_PageRenderContext; + pPage->SetRenderContext(pdfium::WrapUnique(pContext)); + CFX_FxgeDevice* pDevice = new CFX_FxgeDevice; + pContext->m_pDevice.reset(pDevice); + CFX_DIBitmap* pBitmap = CFXBitmapFromFPDFBitmap(bitmap); + pDevice->Attach(pBitmap, !!(flags & FPDF_REVERSE_BYTE_ORDER), nullptr, false); + + CFX_Matrix transform_matrix = pPage->GetPageMatrix(); + if (matrix) { + transform_matrix.Concat(CFX_Matrix(matrix->a, matrix->b, matrix->c, + matrix->d, matrix->e, matrix->f)); + } + + CFX_FloatRect clipping_rect; + if (clipping) { + clipping_rect.left = clipping->left; + clipping_rect.bottom = clipping->bottom; + clipping_rect.right = clipping->right; + clipping_rect.top = clipping->top; + } + RenderPageImpl(pContext, pPage, transform_matrix, clipping_rect.ToFxRect(), + flags, true, nullptr); + + pPage->SetRenderContext(nullptr); +} + +#ifdef _SKIA_SUPPORT_ +DLLEXPORT FPDF_RECORDER STDCALL FPDF_RenderPageSkp(FPDF_PAGE page, + int size_x, + int size_y) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return nullptr; + + CPDF_PageRenderContext* pContext = new CPDF_PageRenderContext; + pPage->SetRenderContext(pdfium::WrapUnique(pContext)); + CFX_FxgeDevice* skDevice = new CFX_FxgeDevice; + FPDF_RECORDER recorder = skDevice->CreateRecorder(size_x, size_y); + pContext->m_pDevice.reset(skDevice); + FPDF_RenderPage_Retail(pContext, page, 0, 0, size_x, size_y, 0, 0, true, + nullptr); + pPage->SetRenderContext(nullptr); + return recorder; +} +#endif + +DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page) { + UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); + if (!page) + return; +#ifdef PDF_ENABLE_XFA + pPage->Release(); +#else // PDF_ENABLE_XFA + CPDFSDK_PageView* pPageView = + static_cast(pPage->GetView()); + if (pPageView) { + // We're already destroying the pageview, so bail early. + if (pPageView->IsBeingDestroyed()) + return; + + if (pPageView->IsLocked()) { + pPageView->TakePageOwnership(); + return; + } + + bool owned = pPageView->OwnsPage(); + // This will delete the |pPageView| object. We must cleanup the PageView + // first because it will attempt to reset the View on the |pPage| during + // destruction. + pPageView->GetFormFillEnv()->RemovePageView(pPage); + // If the page was owned then the pageview will have deleted the page. + if (owned) + return; + } + delete pPage; +#endif // PDF_ENABLE_XFA +} + +DLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document) { + delete UnderlyingFromFPDFDocument(document); +} + +DLLEXPORT unsigned long STDCALL FPDF_GetLastError() { + return GetLastError(); +} + +DLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int device_x, + int device_y, + double* page_x, + double* page_y) { + if (!page || !page_x || !page_y) + return; + UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); +#ifdef PDF_ENABLE_XFA + pPage->DeviceToPage(start_x, start_y, size_x, size_y, rotate, device_x, + device_y, page_x, page_y); +#else // PDF_ENABLE_XFA + CFX_Matrix page2device = + pPage->GetDisplayMatrix(start_x, start_y, size_x, size_y, rotate); + CFX_Matrix device2page; + device2page.SetReverse(page2device); + + CFX_PointF pos = device2page.Transform(CFX_PointF( + static_cast(device_x), static_cast(device_y))); + + *page_x = pos.x; + *page_y = pos.y; +#endif // PDF_ENABLE_XFA +} + +DLLEXPORT void STDCALL FPDF_PageToDevice(FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + double page_x, + double page_y, + int* device_x, + int* device_y) { + if (!device_x || !device_y) + return; + UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page); + if (!pPage) + return; +#ifdef PDF_ENABLE_XFA + pPage->PageToDevice(start_x, start_y, size_x, size_y, rotate, page_x, page_y, + device_x, device_y); +#else // PDF_ENABLE_XFA + CFX_Matrix page2device = + pPage->GetDisplayMatrix(start_x, start_y, size_x, size_y, rotate); + CFX_PointF pos = page2device.Transform( + CFX_PointF(static_cast(page_x), static_cast(page_y))); + + *device_x = FXSYS_round(pos.x); + *device_y = FXSYS_round(pos.y); +#endif // PDF_ENABLE_XFA +} + +DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width, + int height, + int alpha) { + auto pBitmap = pdfium::MakeUnique(); + if (!pBitmap->Create(width, height, alpha ? FXDIB_Argb : FXDIB_Rgb32)) + return nullptr; + + return pBitmap.release(); +} + +DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_CreateEx(int width, + int height, + int format, + void* first_scan, + int stride) { + FXDIB_Format fx_format; + switch (format) { + case FPDFBitmap_Gray: + fx_format = FXDIB_8bppRgb; + break; + case FPDFBitmap_BGR: + fx_format = FXDIB_Rgb; + break; + case FPDFBitmap_BGRx: + fx_format = FXDIB_Rgb32; + break; + case FPDFBitmap_BGRA: + fx_format = FXDIB_Argb; + break; + default: + return nullptr; + } + CFX_DIBitmap* pBitmap = new CFX_DIBitmap; + pBitmap->Create(width, height, fx_format, (uint8_t*)first_scan, stride); + return pBitmap; +} + +DLLEXPORT void STDCALL FPDFBitmap_FillRect(FPDF_BITMAP bitmap, + int left, + int top, + int width, + int height, + FPDF_DWORD color) { + if (!bitmap) + return; + + CFX_FxgeDevice device; + CFX_DIBitmap* pBitmap = CFXBitmapFromFPDFBitmap(bitmap); + device.Attach(pBitmap, false, nullptr, false); + if (!pBitmap->HasAlpha()) + color |= 0xFF000000; + FX_RECT rect(left, top, left + width, top + height); + device.FillRect(&rect, color); +} + +DLLEXPORT void* STDCALL FPDFBitmap_GetBuffer(FPDF_BITMAP bitmap) { + return bitmap ? CFXBitmapFromFPDFBitmap(bitmap)->GetBuffer() : nullptr; +} + +DLLEXPORT int STDCALL FPDFBitmap_GetWidth(FPDF_BITMAP bitmap) { + return bitmap ? CFXBitmapFromFPDFBitmap(bitmap)->GetWidth() : 0; +} + +DLLEXPORT int STDCALL FPDFBitmap_GetHeight(FPDF_BITMAP bitmap) { + return bitmap ? CFXBitmapFromFPDFBitmap(bitmap)->GetHeight() : 0; +} + +DLLEXPORT int STDCALL FPDFBitmap_GetStride(FPDF_BITMAP bitmap) { + return bitmap ? CFXBitmapFromFPDFBitmap(bitmap)->GetPitch() : 0; +} + +DLLEXPORT void STDCALL FPDFBitmap_Destroy(FPDF_BITMAP bitmap) { + delete CFXBitmapFromFPDFBitmap(bitmap); +} + +void FPDF_RenderPage_Retail(CPDF_PageRenderContext* pContext, + FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int flags, + bool bNeedToRestore, + IFSDK_PAUSE_Adapter* pause) { + CPDF_Page* pPage = CPDFPageFromFPDFPage(page); + if (!pPage) + return; + + RenderPageImpl(pContext, pPage, pPage->GetDisplayMatrix( + start_x, start_y, size_x, size_y, rotate), + FX_RECT(start_x, start_y, start_x + size_x, start_y + size_y), + flags, bNeedToRestore, pause); +} + +DLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, + int page_index, + double* width, + double* height) { + UnderlyingDocumentType* pDoc = UnderlyingFromFPDFDocument(document); + if (!pDoc) + return false; + +#ifdef PDF_ENABLE_XFA + int count = pDoc->GetPageCount(); + if (page_index < 0 || page_index >= count) + return false; + CPDFXFA_Page* pPage = pDoc->GetXFAPage(page_index); + if (!pPage) + return false; + *width = pPage->GetPageWidth(); + *height = pPage->GetPageHeight(); +#else // PDF_ENABLE_XFA + CPDF_Dictionary* pDict = pDoc->GetPage(page_index); + if (!pDict) + return false; + + CPDF_Page page(pDoc, pDict, true); + *width = page.GetPageWidth(); + *height = page.GetPageHeight(); +#endif // PDF_ENABLE_XFA + + return true; +} + +DLLEXPORT FPDF_BOOL STDCALL +FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return true; + CPDF_ViewerPreferences viewRef(pDoc); + return viewRef.PrintScaling(); +} + +DLLEXPORT int STDCALL FPDF_VIEWERREF_GetNumCopies(FPDF_DOCUMENT document) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return 1; + CPDF_ViewerPreferences viewRef(pDoc); + return viewRef.NumCopies(); +} + +DLLEXPORT FPDF_PAGERANGE STDCALL +FPDF_VIEWERREF_GetPrintPageRange(FPDF_DOCUMENT document) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return nullptr; + CPDF_ViewerPreferences viewRef(pDoc); + return viewRef.PrintPageRange(); +} + +DLLEXPORT FPDF_DUPLEXTYPE STDCALL +FPDF_VIEWERREF_GetDuplex(FPDF_DOCUMENT document) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return DuplexUndefined; + CPDF_ViewerPreferences viewRef(pDoc); + CFX_ByteString duplex = viewRef.Duplex(); + if ("Simplex" == duplex) + return Simplex; + if ("DuplexFlipShortEdge" == duplex) + return DuplexFlipShortEdge; + if ("DuplexFlipLongEdge" == duplex) + return DuplexFlipLongEdge; + return DuplexUndefined; +} + +DLLEXPORT unsigned long STDCALL FPDF_VIEWERREF_GetName(FPDF_DOCUMENT document, + FPDF_BYTESTRING key, + char* buffer, + unsigned long length) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return 0; + + CPDF_ViewerPreferences viewRef(pDoc); + CFX_ByteString bsVal; + if (!viewRef.GenericName(key, &bsVal)) + return 0; + + unsigned long dwStringLen = bsVal.GetLength() + 1; + if (buffer && length >= dwStringLen) + memcpy(buffer, bsVal.c_str(), dwStringLen); + return dwStringLen; +} + +DLLEXPORT FPDF_DWORD STDCALL FPDF_CountNamedDests(FPDF_DOCUMENT document) { + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return 0; + + CPDF_Dictionary* pRoot = pDoc->GetRoot(); + if (!pRoot) + return 0; + + CPDF_NameTree nameTree(pDoc, "Dests"); + pdfium::base::CheckedNumeric count = nameTree.GetCount(); + CPDF_Dictionary* pDest = pRoot->GetDictFor("Dests"); + if (pDest) + count += pDest->GetCount(); + + if (!count.IsValid()) + return 0; + + return count.ValueOrDie(); +} + +DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document, + FPDF_BYTESTRING name) { + if (!name || name[0] == 0) + return nullptr; + + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return nullptr; + + CPDF_NameTree name_tree(pDoc, "Dests"); + return name_tree.LookupNamedDest(pDoc, name); +} + +#ifdef PDF_ENABLE_XFA +DLLEXPORT FPDF_RESULT STDCALL FPDF_BStr_Init(FPDF_BSTR* str) { + if (!str) + return -1; + + FXSYS_memset(str, 0, sizeof(FPDF_BSTR)); + return 0; +} + +DLLEXPORT FPDF_RESULT STDCALL FPDF_BStr_Set(FPDF_BSTR* str, + FPDF_LPCSTR bstr, + int length) { + if (!str) + return -1; + if (!bstr || !length) + return -1; + if (length == -1) + length = FXSYS_strlen(bstr); + + if (length == 0) { + if (str->str) { + FX_Free(str->str); + str->str = nullptr; + } + str->len = 0; + return 0; + } + + if (str->str && str->len < length) + str->str = FX_Realloc(char, str->str, length + 1); + else if (!str->str) + str->str = FX_Alloc(char, length + 1); + + str->str[length] = 0; + FXSYS_memcpy(str->str, bstr, length); + str->len = length; + + return 0; +} + +DLLEXPORT FPDF_RESULT STDCALL FPDF_BStr_Clear(FPDF_BSTR* str) { + if (!str) + return -1; + + if (str->str) { + FX_Free(str->str); + str->str = nullptr; + } + str->len = 0; + return 0; +} +#endif // PDF_ENABLE_XFA + +DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDest(FPDF_DOCUMENT document, + int index, + void* buffer, + long* buflen) { + if (!buffer) + *buflen = 0; + + if (index < 0) + return nullptr; + + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); + if (!pDoc) + return nullptr; + + CPDF_Dictionary* pRoot = pDoc->GetRoot(); + if (!pRoot) + return nullptr; + + CPDF_Object* pDestObj = nullptr; + CFX_ByteString bsName; + CPDF_NameTree nameTree(pDoc, "Dests"); + int count = nameTree.GetCount(); + if (index >= count) { + CPDF_Dictionary* pDest = pRoot->GetDictFor("Dests"); + if (!pDest) + return nullptr; + + pdfium::base::CheckedNumeric checked_count = count; + checked_count += pDest->GetCount(); + if (!checked_count.IsValid() || index >= checked_count.ValueOrDie()) + return nullptr; + + index -= count; + int i = 0; + for (const auto& it : *pDest) { + bsName = it.first; + pDestObj = it.second.get(); + if (!pDestObj) + continue; + if (i == index) + break; + i++; + } + } else { + pDestObj = nameTree.LookupValue(index, bsName); + } + if (!pDestObj) + return nullptr; + if (CPDF_Dictionary* pDict = pDestObj->AsDictionary()) { + pDestObj = pDict->GetArrayFor("D"); + if (!pDestObj) + return nullptr; + } + if (!pDestObj->IsArray()) + return nullptr; + + CFX_WideString wsName = PDF_DecodeText(bsName); + CFX_ByteString utf16Name = wsName.UTF16LE_Encode(); + int len = utf16Name.GetLength(); + if (!buffer) { + *buflen = len; + } else if (len <= *buflen) { + memcpy(buffer, utf16Name.c_str(), len); + *buflen = len; + } else { + *buflen = -1; + } + return (FPDF_DEST)pDestObj; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfview_c_api_test.c b/modules/pdfium/pdfium/fpdfsdk/fpdfview_c_api_test.c new file mode 100644 index 000000000000..54a33252b369 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfview_c_api_test.c @@ -0,0 +1,272 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This "C" (not "C++") file ensures that the public headers compile +// and link for "C" (and not just "C++"). + +#include + +#include "fpdfsdk/fpdfview_c_api_test.h" + +#include "public/fpdf_dataavail.h" +#include "public/fpdf_doc.h" +#include "public/fpdf_edit.h" +#include "public/fpdf_ext.h" +#include "public/fpdf_flatten.h" +#include "public/fpdf_formfill.h" +#include "public/fpdf_fwlevent.h" +#include "public/fpdf_ppo.h" +#include "public/fpdf_progressive.h" +#include "public/fpdf_save.h" +#include "public/fpdf_searchex.h" +#include "public/fpdf_structtree.h" +#include "public/fpdf_sysfontinfo.h" +#include "public/fpdf_text.h" +#include "public/fpdf_transformpage.h" +#include "public/fpdfview.h" + +// Scheme for avoiding LTO out of existence, warnings, etc. +typedef void (*fnptr)(void); // Legal generic function type for casts. +fnptr g_c_api_test_fnptr = NULL; // Extern, so can't know it doesn't change. +#define CHK(x) if ((fnptr)(x) == g_c_api_test_fnptr) return 0 + +// Function to call from gtest harness to ensure linker resolution. +int CheckPDFiumCApi() { + // fpdf_dataavail.h + CHK(FPDFAvail_Create); + CHK(FPDFAvail_Destroy); + CHK(FPDFAvail_IsDocAvail); + CHK(FPDFAvail_GetDocument); + CHK(FPDFAvail_GetFirstPageNum); + CHK(FPDFAvail_IsPageAvail); + CHK(FPDFAvail_IsFormAvail); + CHK(FPDFAvail_IsLinearized); + + // fpdf_doc.h + CHK(FPDFBookmark_GetFirstChild); + CHK(FPDFBookmark_GetNextSibling); + CHK(FPDFBookmark_GetTitle); + CHK(FPDFBookmark_Find); + CHK(FPDFBookmark_GetDest); + CHK(FPDFBookmark_GetAction); + CHK(FPDFAction_GetType); + CHK(FPDFAction_GetDest); + CHK(FPDFAction_GetFilePath); + CHK(FPDFAction_GetURIPath); + CHK(FPDFDest_GetPageIndex); + CHK(FPDFDest_GetLocationInPage); + CHK(FPDFLink_GetLinkAtPoint); + CHK(FPDFLink_GetLinkZOrderAtPoint); + CHK(FPDFLink_GetDest); + CHK(FPDFLink_GetAction); + CHK(FPDFLink_Enumerate); + CHK(FPDFLink_GetAnnotRect); + CHK(FPDFLink_CountQuadPoints); + CHK(FPDFLink_GetQuadPoints); + CHK(FPDF_GetMetaText); + CHK(FPDF_GetPageLabel); + + // fpdf_edit.h + CHK(FPDF_CreateNewDocument); + CHK(FPDFPage_New); + CHK(FPDFPage_Delete); + CHK(FPDFPage_GetRotation); + CHK(FPDFPage_SetRotation); + CHK(FPDFPage_InsertObject); + CHK(FPDFPage_CountObject); + CHK(FPDFPage_GetObject); + CHK(FPDFPage_HasTransparency); + CHK(FPDFPage_GenerateContent); + CHK(FPDFPageObj_HasTransparency); + CHK(FPDFPageObj_Transform); + CHK(FPDFPage_TransformAnnots); + CHK(FPDFPageObj_NewImgeObj); + CHK(FPDFImageObj_LoadJpegFile); + CHK(FPDFImageObj_LoadJpegFileInline); + CHK(FPDFImageObj_SetMatrix); + CHK(FPDFImageObj_SetBitmap); + CHK(FPDFPageObj_CreateNewPath); + CHK(FPDFPageObj_CreateNewRect); + CHK(FPDFPath_SetStrokeColor); + CHK(FPDFPath_SetStrokeWidth); + CHK(FPDFPath_SetFillColor); + CHK(FPDFPath_MoveTo); + CHK(FPDFPath_LineTo); + CHK(FPDFPath_BezierTo); + CHK(FPDFPath_Close); + CHK(FPDFPath_SetDrawMode); + CHK(FPDFPageObj_NewTextObj); + CHK(FPDFText_SetText); + CHK(FPDFText_LoadType1Font); + + // fpdf_ext.h + CHK(FSDK_SetUnSpObjProcessHandler); + CHK(FPDFDoc_GetPageMode); + + // fpdf_flatten.h + CHK(FPDFPage_Flatten); + + // fpdf_fwlevent.h - no exports. + + // fpdf_formfill.h + CHK(FPDFDOC_InitFormFillEnvironment); + CHK(FPDFDOC_ExitFormFillEnvironment); + CHK(FORM_OnAfterLoadPage); + CHK(FORM_OnBeforeClosePage); + CHK(FORM_DoDocumentJSAction); + CHK(FORM_DoDocumentOpenAction); + CHK(FORM_DoDocumentAAction); + CHK(FORM_DoPageAAction); + CHK(FORM_OnMouseMove); + CHK(FORM_OnLButtonDown); + CHK(FORM_OnLButtonUp); +#ifdef PDF_ENABLE_XFA + CHK(FORM_OnRButtonDown); + CHK(FORM_OnRButtonUp); +#endif + CHK(FORM_OnKeyDown); + CHK(FORM_OnKeyUp); + CHK(FORM_OnChar); + CHK(FORM_ForceToKillFocus); + CHK(FPDFPage_HasFormFieldAtPoint); + CHK(FPDPage_HasFormFieldAtPoint); // DEPRECATED. Remove in the future. + CHK(FPDFPage_FormFieldZOrderAtPoint); + CHK(FPDF_SetFormFieldHighlightColor); + CHK(FPDF_SetFormFieldHighlightAlpha); + CHK(FPDF_RemoveFormFieldHighlight); + CHK(FPDF_FFLDraw); +#ifdef PDF_ENABLE_XFA + CHK(FPDF_HasXFAField); + CHK(FPDF_LoadXFA); + CHK(FPDF_Widget_Undo); + CHK(FPDF_Widget_Redo); + CHK(FPDF_Widget_SelectAll); + CHK(FPDF_Widget_Copy); + CHK(FPDF_Widget_Cut); + CHK(FPDF_Widget_Paste); + CHK(FPDF_Widget_ReplaceSpellCheckWord); + CHK(FPDF_Widget_GetSpellCheckWords); + CHK(FPDF_StringHandleCounts); + CHK(FPDF_StringHandleGetStringByIndex); + CHK(FPDF_StringHandleRelease); + CHK(FPDF_StringHandleAddString); +#endif + + // fpdf_ppo.h + CHK(FPDF_ImportPages); + CHK(FPDF_CopyViewerPreferences); + + // fpdf_progressive.h + CHK(FPDF_RenderPageBitmap_Start); + CHK(FPDF_RenderPage_Continue); + CHK(FPDF_RenderPage_Close); + + // fpdf_save.h + CHK(FPDF_SaveAsCopy); + CHK(FPDF_SaveWithVersion); + + // fpdf_searchex.h + CHK(FPDFText_GetCharIndexFromTextIndex); + + // fpdf_structtree.h + CHK(FPDF_StructTree_GetForPage); + CHK(FPDF_StructTree_Close); + CHK(FPDF_StructTree_CountChildren); + CHK(FPDF_StructTree_GetChildAtIndex); + CHK(FPDF_StructElement_GetAltText); + CHK(FPDF_StructElement_CountChildren); + CHK(FPDF_StructElement_GetChildAtIndex); + + // fpdf_sysfontinfo.h + CHK(FPDF_GetDefaultTTFMap); + CHK(FPDF_AddInstalledFont); + CHK(FPDF_SetSystemFontInfo); + CHK(FPDF_GetDefaultSystemFontInfo); + CHK(FPDF_FreeDefaultSystemFontInfo); + + // fpdf_text.h + CHK(FPDFText_LoadPage); + CHK(FPDFText_ClosePage); + CHK(FPDFText_CountChars); + CHK(FPDFText_GetUnicode); + CHK(FPDFText_GetFontSize); + CHK(FPDFText_GetCharBox); + CHK(FPDFText_GetCharIndexAtPos); + CHK(FPDFText_GetText); + CHK(FPDFText_CountRects); + CHK(FPDFText_GetRect); + CHK(FPDFText_GetBoundedText); + CHK(FPDFText_FindStart); + CHK(FPDFText_FindNext); + CHK(FPDFText_FindPrev); + CHK(FPDFText_GetSchResultIndex); + CHK(FPDFText_GetSchCount); + CHK(FPDFText_FindClose); + CHK(FPDFLink_LoadWebLinks); + CHK(FPDFLink_CountWebLinks); + CHK(FPDFLink_GetURL); + CHK(FPDFLink_CountRects); + CHK(FPDFLink_GetRect); + CHK(FPDFLink_CloseWebLinks); + + // fpdf_transformpage.h + CHK(FPDFPage_SetMediaBox); + CHK(FPDFPage_SetCropBox); + CHK(FPDFPage_GetMediaBox); + CHK(FPDFPage_GetCropBox); + CHK(FPDFPage_TransFormWithClip); + CHK(FPDFPageObj_TransformClipPath); + CHK(FPDF_CreateClipPath); + CHK(FPDF_DestroyClipPath); + CHK(FPDFPage_InsertClipPath); + + // fpdfview.h + CHK(FPDF_InitLibrary); + CHK(FPDF_InitLibraryWithConfig); + CHK(FPDF_DestroyLibrary); + CHK(FPDF_SetSandBoxPolicy); + CHK(FPDF_LoadDocument); + CHK(FPDF_LoadMemDocument); + CHK(FPDF_LoadCustomDocument); + CHK(FPDF_GetFileVersion); + CHK(FPDF_GetLastError); + CHK(FPDF_GetDocPermissions); + CHK(FPDF_GetSecurityHandlerRevision); + CHK(FPDF_GetPageCount); + CHK(FPDF_LoadPage); + CHK(FPDF_GetPageWidth); + CHK(FPDF_GetPageHeight); + CHK(FPDF_GetPageSizeByIndex); + CHK(FPDF_RenderPageBitmap); + CHK(FPDF_RenderPageBitmapWithMatrix); + CHK(FPDF_ClosePage); + CHK(FPDF_CloseDocument); + CHK(FPDF_DeviceToPage); + CHK(FPDF_PageToDevice); + CHK(FPDFBitmap_Create); + CHK(FPDFBitmap_CreateEx); + CHK(FPDFBitmap_FillRect); + CHK(FPDFBitmap_GetBuffer); + CHK(FPDFBitmap_GetWidth); + CHK(FPDFBitmap_GetHeight); + CHK(FPDFBitmap_GetStride); + CHK(FPDFBitmap_Destroy); + CHK(FPDF_VIEWERREF_GetPrintScaling); + CHK(FPDF_VIEWERREF_GetNumCopies); + CHK(FPDF_VIEWERREF_GetPrintPageRange); + CHK(FPDF_VIEWERREF_GetDuplex); + CHK(FPDF_VIEWERREF_GetName); + CHK(FPDF_CountNamedDests); + CHK(FPDF_GetNamedDestByName); + CHK(FPDF_GetNamedDest); +#ifdef PDF_ENABLE_XFA + CHK(FPDF_BStr_Init); + CHK(FPDF_BStr_Set); + CHK(FPDF_BStr_Clear); +#endif + + return 1; +} + +#undef CHK diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfview_c_api_test.h b/modules/pdfium/pdfium/fpdfsdk/fpdfview_c_api_test.h new file mode 100644 index 000000000000..d5b84a27a9e3 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfview_c_api_test.h @@ -0,0 +1,20 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FPDFSDK_FPDFVIEW_C_API_TEST_H_ +#define FPDFSDK_FPDFVIEW_C_API_TEST_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +// Function to call from gtest harness to ensure linker resolution. Returns +// 1 on success or 0 on error. +int CheckPDFiumCApi(); + +#ifdef __cplusplus +} +#endif + +#endif // FPDFSDK_FPDFVIEW_C_API_TEST_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfview_embeddertest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfview_embeddertest.cpp new file mode 100644 index 000000000000..1d94b7255332 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfview_embeddertest.cpp @@ -0,0 +1,380 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include + +#include "fpdfsdk/fpdfview_c_api_test.h" +#include "public/fpdfview.h" +#include "testing/embedder_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(fpdf, CApiTest) { + EXPECT_TRUE(CheckPDFiumCApi()); +} + +class FPDFViewEmbeddertest : public EmbedderTest {}; + +TEST_F(FPDFViewEmbeddertest, Document) { + EXPECT_TRUE(OpenDocument("about_blank.pdf")); + EXPECT_EQ(1, GetPageCount()); + EXPECT_EQ(0, GetFirstPageNum()); + + int version; + EXPECT_TRUE(FPDF_GetFileVersion(document(), &version)); + EXPECT_EQ(14, version); + + EXPECT_EQ(0xFFFFFFFF, FPDF_GetDocPermissions(document())); + EXPECT_EQ(-1, FPDF_GetSecurityHandlerRevision(document())); +} + +// See bug 465. +TEST_F(FPDFViewEmbeddertest, EmptyDocument) { + EXPECT_TRUE(CreateEmptyDocument()); + + { + int version = 42; + EXPECT_FALSE(FPDF_GetFileVersion(document(), &version)); + EXPECT_EQ(0, version); + } + + { +#ifndef PDF_ENABLE_XFA + const unsigned long kExpected = 0; +#else + const unsigned long kExpected = static_cast(-1); +#endif + EXPECT_EQ(kExpected, FPDF_GetDocPermissions(document())); + } + + EXPECT_EQ(-1, FPDF_GetSecurityHandlerRevision(document())); + + EXPECT_EQ(0, FPDF_GetPageCount(document())); + + EXPECT_TRUE(FPDF_VIEWERREF_GetPrintScaling(document())); + EXPECT_EQ(1, FPDF_VIEWERREF_GetNumCopies(document())); + EXPECT_EQ(DuplexUndefined, FPDF_VIEWERREF_GetDuplex(document())); + + char buf[100]; + EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(), "foo", nullptr, 0)); + EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(), "foo", buf, sizeof(buf))); + + EXPECT_EQ(0u, FPDF_CountNamedDests(document())); +} + +TEST_F(FPDFViewEmbeddertest, Page) { + EXPECT_TRUE(OpenDocument("about_blank.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_NE(nullptr, page); + EXPECT_EQ(612.0, FPDF_GetPageWidth(page)); + EXPECT_EQ(792.0, FPDF_GetPageHeight(page)); + UnloadPage(page); + EXPECT_EQ(nullptr, LoadPage(1)); +} + +TEST_F(FPDFViewEmbeddertest, ViewerRefDummy) { + EXPECT_TRUE(OpenDocument("about_blank.pdf")); + EXPECT_TRUE(FPDF_VIEWERREF_GetPrintScaling(document())); + EXPECT_EQ(1, FPDF_VIEWERREF_GetNumCopies(document())); + EXPECT_EQ(DuplexUndefined, FPDF_VIEWERREF_GetDuplex(document())); + + char buf[100]; + EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(), "foo", nullptr, 0)); + EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(), "foo", buf, sizeof(buf))); +} + +TEST_F(FPDFViewEmbeddertest, ViewerRef) { + EXPECT_TRUE(OpenDocument("viewer_ref.pdf")); + EXPECT_TRUE(FPDF_VIEWERREF_GetPrintScaling(document())); + EXPECT_EQ(5, FPDF_VIEWERREF_GetNumCopies(document())); + EXPECT_EQ(DuplexUndefined, FPDF_VIEWERREF_GetDuplex(document())); + + // Test some corner cases. + char buf[100]; + EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(), "", buf, sizeof(buf))); + EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(), "foo", nullptr, 0)); + EXPECT_EQ(0U, FPDF_VIEWERREF_GetName(document(), "foo", buf, sizeof(buf))); + + // Make sure |buf| does not get written into when it appears to be too small. + // NOLINTNEXTLINE(runtime/printf) + strcpy(buf, "ABCD"); + EXPECT_EQ(4U, FPDF_VIEWERREF_GetName(document(), "Foo", buf, 1)); + EXPECT_STREQ("ABCD", buf); + + // Note "Foo" is a different key from "foo". + EXPECT_EQ(4U, + FPDF_VIEWERREF_GetName(document(), "Foo", nullptr, sizeof(buf))); + ASSERT_EQ(4U, FPDF_VIEWERREF_GetName(document(), "Foo", buf, sizeof(buf))); + EXPECT_STREQ("foo", buf); + + // Try to retrieve a boolean and an integer. + EXPECT_EQ( + 0U, FPDF_VIEWERREF_GetName(document(), "HideToolbar", buf, sizeof(buf))); + EXPECT_EQ(0U, + FPDF_VIEWERREF_GetName(document(), "NumCopies", buf, sizeof(buf))); + + // Try more valid cases. + ASSERT_EQ(4U, + FPDF_VIEWERREF_GetName(document(), "Direction", buf, sizeof(buf))); + EXPECT_STREQ("R2L", buf); + ASSERT_EQ(8U, + FPDF_VIEWERREF_GetName(document(), "ViewArea", buf, sizeof(buf))); + EXPECT_STREQ("CropBox", buf); +} + +TEST_F(FPDFViewEmbeddertest, NamedDests) { + EXPECT_TRUE(OpenDocument("named_dests.pdf")); + long buffer_size; + char fixed_buffer[512]; + FPDF_DEST dest; + + // Query the size of the first item. + buffer_size = 2000000; // Absurdly large, check not used for this case. + dest = FPDF_GetNamedDest(document(), 0, nullptr, &buffer_size); + EXPECT_NE(nullptr, dest); + EXPECT_EQ(12, buffer_size); + + // Try to retrieve the first item with too small a buffer. + buffer_size = 10; + dest = FPDF_GetNamedDest(document(), 0, fixed_buffer, &buffer_size); + EXPECT_NE(nullptr, dest); + EXPECT_EQ(-1, buffer_size); + + // Try to retrieve the first item with correctly sized buffer. Item is + // taken from Dests NameTree in named_dests.pdf. + buffer_size = 12; + dest = FPDF_GetNamedDest(document(), 0, fixed_buffer, &buffer_size); + EXPECT_NE(nullptr, dest); + EXPECT_EQ(12, buffer_size); + EXPECT_EQ(std::string("F\0i\0r\0s\0t\0\0\0", 12), + std::string(fixed_buffer, buffer_size)); + + // Try to retrieve the second item with ample buffer. Item is taken + // from Dests NameTree but has a sub-dictionary in named_dests.pdf. + buffer_size = sizeof(fixed_buffer); + dest = FPDF_GetNamedDest(document(), 1, fixed_buffer, &buffer_size); + EXPECT_NE(nullptr, dest); + EXPECT_EQ(10, buffer_size); + EXPECT_EQ(std::string("N\0e\0x\0t\0\0\0", 10), + std::string(fixed_buffer, buffer_size)); + + // Try to retrieve third item with ample buffer. Item is taken + // from Dests NameTree but has a bad sub-dictionary in named_dests.pdf. + // in named_dests.pdf). + buffer_size = sizeof(fixed_buffer); + dest = FPDF_GetNamedDest(document(), 2, fixed_buffer, &buffer_size); + EXPECT_EQ(nullptr, dest); + EXPECT_EQ(sizeof(fixed_buffer), + static_cast(buffer_size)); // unmodified. + + // Try to retrieve the forth item with ample buffer. Item is taken + // from Dests NameTree but has a vale of the wrong type in named_dests.pdf. + buffer_size = sizeof(fixed_buffer); + dest = FPDF_GetNamedDest(document(), 3, fixed_buffer, &buffer_size); + EXPECT_EQ(nullptr, dest); + EXPECT_EQ(sizeof(fixed_buffer), + static_cast(buffer_size)); // unmodified. + + // Try to retrieve fifth item with ample buffer. Item taken from the + // old-style Dests dictionary object in named_dests.pdf. + buffer_size = sizeof(fixed_buffer); + dest = FPDF_GetNamedDest(document(), 4, fixed_buffer, &buffer_size); + EXPECT_NE(nullptr, dest); + EXPECT_EQ(30, buffer_size); + EXPECT_EQ(std::string("F\0i\0r\0s\0t\0A\0l\0t\0e\0r\0n\0a\0t\0e\0\0\0", 30), + std::string(fixed_buffer, buffer_size)); + + // Try to retrieve sixth item with ample buffer. Item istaken from the + // old-style Dests dictionary object but has a sub-dictionary in + // named_dests.pdf. + buffer_size = sizeof(fixed_buffer); + dest = FPDF_GetNamedDest(document(), 5, fixed_buffer, &buffer_size); + EXPECT_NE(nullptr, dest); + EXPECT_EQ(28, buffer_size); + EXPECT_EQ(std::string("L\0a\0s\0t\0A\0l\0t\0e\0r\0n\0a\0t\0e\0\0\0", 28), + std::string(fixed_buffer, buffer_size)); + + // Try to retrieve non-existent item with ample buffer. + buffer_size = sizeof(fixed_buffer); + dest = FPDF_GetNamedDest(document(), 6, fixed_buffer, &buffer_size); + EXPECT_EQ(nullptr, dest); + EXPECT_EQ(sizeof(fixed_buffer), + static_cast(buffer_size)); // unmodified. + + // Try to underflow/overflow the integer index. + buffer_size = sizeof(fixed_buffer); + dest = FPDF_GetNamedDest(document(), std::numeric_limits::max(), + fixed_buffer, &buffer_size); + EXPECT_EQ(nullptr, dest); + EXPECT_EQ(sizeof(fixed_buffer), + static_cast(buffer_size)); // unmodified. + + buffer_size = sizeof(fixed_buffer); + dest = FPDF_GetNamedDest(document(), std::numeric_limits::min(), + fixed_buffer, &buffer_size); + EXPECT_EQ(nullptr, dest); + EXPECT_EQ(sizeof(fixed_buffer), + static_cast(buffer_size)); // unmodified. + + buffer_size = sizeof(fixed_buffer); + dest = FPDF_GetNamedDest(document(), -1, fixed_buffer, &buffer_size); + EXPECT_EQ(nullptr, dest); + EXPECT_EQ(sizeof(fixed_buffer), + static_cast(buffer_size)); // unmodified. +} + +TEST_F(FPDFViewEmbeddertest, NamedDestsByName) { + EXPECT_TRUE(OpenDocument("named_dests.pdf")); + + // Null pointer returns nullptr. + FPDF_DEST dest = FPDF_GetNamedDestByName(document(), nullptr); + EXPECT_EQ(nullptr, dest); + + // Empty string returns nullptr. + dest = FPDF_GetNamedDestByName(document(), ""); + EXPECT_EQ(nullptr, dest); + + // Item from Dests NameTree. + dest = FPDF_GetNamedDestByName(document(), "First"); + EXPECT_NE(nullptr, dest); + + long ignore_len = 0; + FPDF_DEST dest_by_index = + FPDF_GetNamedDest(document(), 0, nullptr, &ignore_len); + EXPECT_EQ(dest_by_index, dest); + + // Item from Dests dictionary. + dest = FPDF_GetNamedDestByName(document(), "FirstAlternate"); + EXPECT_NE(nullptr, dest); + + ignore_len = 0; + dest_by_index = FPDF_GetNamedDest(document(), 4, nullptr, &ignore_len); + EXPECT_EQ(dest_by_index, dest); + + // Bad value type for item from Dests NameTree array. + dest = FPDF_GetNamedDestByName(document(), "WrongType"); + EXPECT_EQ(nullptr, dest); + + // No such destination in either Dest NameTree or dictionary. + dest = FPDF_GetNamedDestByName(document(), "Bogus"); + EXPECT_EQ(nullptr, dest); +} + +// The following tests pass if the document opens without crashing. +TEST_F(FPDFViewEmbeddertest, Crasher_113) { + EXPECT_TRUE(OpenDocument("bug_113.pdf")); +} + +TEST_F(FPDFViewEmbeddertest, Crasher_451830) { + // Document is damaged and can't be opened. + EXPECT_FALSE(OpenDocument("bug_451830.pdf")); +} + +TEST_F(FPDFViewEmbeddertest, Crasher_452455) { + EXPECT_TRUE(OpenDocument("bug_452455.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_NE(nullptr, page); + UnloadPage(page); +} + +TEST_F(FPDFViewEmbeddertest, Crasher_454695) { + // Document is damaged and can't be opened. + EXPECT_FALSE(OpenDocument("bug_454695.pdf")); +} + +TEST_F(FPDFViewEmbeddertest, Crasher_572871) { + EXPECT_TRUE(OpenDocument("bug_572871.pdf")); +} + +// It tests that document can still be loaded even the trailer has no 'Size' +// field if other information is right. +TEST_F(FPDFViewEmbeddertest, Failed_213) { + EXPECT_TRUE(OpenDocument("bug_213.pdf")); +} + +// The following tests pass if the document opens without infinite looping. +TEST_F(FPDFViewEmbeddertest, Hang_298) { + EXPECT_FALSE(OpenDocument("bug_298.pdf")); +} + +// Test if the document opens without infinite looping. +// Previously this test will hang in a loop inside LoadAllCrossRefV4. After +// the fix, LoadAllCrossRefV4 will return false after detecting a cross +// reference loop. Cross references will be rebuilt successfully. +TEST_F(FPDFViewEmbeddertest, CrossRefV4Loop) { + EXPECT_TRUE(OpenDocument("bug_xrefv4_loop.pdf")); +} + +// The test should pass when circular references to ParseIndirectObject will not +// cause infinite loop. +TEST_F(FPDFViewEmbeddertest, Hang_343) { + EXPECT_FALSE(OpenDocument("bug_343.pdf")); +} + +// The test should pass when the absence of 'Contents' field in a signature +// dictionary will not cause an infinite loop in CPDF_SyntaxParser::GetObject(). +TEST_F(FPDFViewEmbeddertest, Hang_344) { + EXPECT_FALSE(OpenDocument("bug_344.pdf")); +} + +// The test should pass when there is no infinite recursion in +// CPDF_SyntaxParser::GetString(). +TEST_F(FPDFViewEmbeddertest, Hang_355) { + EXPECT_FALSE(OpenDocument("bug_355.pdf")); +} +// The test should pass even when the file has circular references to pages. +TEST_F(FPDFViewEmbeddertest, Hang_360) { + EXPECT_FALSE(OpenDocument("bug_360.pdf")); +} + +TEST_F(FPDFViewEmbeddertest, FPDF_RenderPageBitmapWithMatrix) { + const char kAllBlackMd5sum[] = "5708fc5c4a8bd0abde99c8e8f0390615"; + const char kTopLeftQuarterBlackMd5sum[] = "24e4d1ec06fa0258af758cfc8b2ad50a"; + + EXPECT_TRUE(OpenDocument("black.pdf")); + FPDF_PAGE page = LoadPage(0); + EXPECT_NE(nullptr, page); + const int width = static_cast(FPDF_GetPageWidth(page)); + const int height = static_cast(FPDF_GetPageHeight(page)); + EXPECT_EQ(612, width); + EXPECT_EQ(792, height); + + FPDF_BITMAP bitmap = RenderPage(page); + CompareBitmap(bitmap, width, height, kAllBlackMd5sum); + FPDFBitmap_Destroy(bitmap); + + // Try rendering with an identity matrix. The output should be the same as + // the RenderPage() output. + FS_MATRIX matrix; + matrix.a = 1; + matrix.b = 0; + matrix.c = 0; + matrix.d = 1; + matrix.e = 0; + matrix.f = 0; + + FS_RECTF rect; + rect.left = 0; + rect.top = 0; + rect.right = width; + rect.bottom = height; + + bitmap = FPDFBitmap_Create(width, height, 0); + FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF); + FPDF_RenderPageBitmapWithMatrix(bitmap, page, &matrix, &rect, 0); + CompareBitmap(bitmap, width, height, kAllBlackMd5sum); + FPDFBitmap_Destroy(bitmap); + + // Now render again with the image scaled. + matrix.a = 0.5; + matrix.d = 0.5; + + bitmap = FPDFBitmap_Create(width, height, 0); + FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF); + FPDF_RenderPageBitmapWithMatrix(bitmap, page, &matrix, &rect, 0); + CompareBitmap(bitmap, width, height, kTopLeftQuarterBlackMd5sum); + FPDFBitmap_Destroy(bitmap); + + UnloadPage(page); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfview_unittest.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfview_unittest.cpp new file mode 100644 index 000000000000..27680b3d4e13 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfview_unittest.cpp @@ -0,0 +1,20 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "public/fpdfview.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" + +TEST(FPDFView, DoubleInit) { + FPDF_InitLibrary(); + FPDF_InitLibrary(); + FPDF_DestroyLibrary(); +} + +TEST(FPDFView, DoubleDestroy) { + FPDF_InitLibrary(); + FPDF_DestroyLibrary(); + FPDF_DestroyLibrary(); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/DEPS b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/DEPS new file mode 100644 index 000000000000..1687e308b571 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/DEPS @@ -0,0 +1,4 @@ +include_rules = [ + '+fxjs', + '+xfa/fxbarcode', +] diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp new file mode 100644 index 000000000000..88c88a17480b --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp @@ -0,0 +1,369 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" + +#include + +#include "core/fpdfapi/parser/cpdf_document.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" +#include "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h" +#include "fpdfsdk/fsdk_define.h" +#include "fpdfsdk/javascript/cjs_runtime.h" +#include "fpdfsdk/javascript/ijs_runtime.h" +#include "public/fpdf_formfill.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" +#include "xfa/fxfa/cxfa_eventparam.h" +#include "xfa/fxfa/xfa_ffapp.h" +#include "xfa/fxfa/xfa_ffdoc.h" +#include "xfa/fxfa/xfa_ffdocview.h" +#include "xfa/fxfa/xfa_ffpageview.h" +#include "xfa/fxfa/xfa_ffwidgethandler.h" +#include "xfa/fxfa/xfa_fontmgr.h" + +#ifndef _WIN32 +extern void SetLastError(int err); +extern int GetLastError(); +#endif + +CPDFXFA_Context::CPDFXFA_Context(std::unique_ptr pPDFDoc) + : m_iDocType(DOCTYPE_PDF), + m_pPDFDoc(std::move(pPDFDoc)), + m_pFormFillEnv(nullptr), + m_pXFADocView(nullptr), + m_nLoadStatus(FXFA_LOADSTATUS_PRELOAD), + m_nPageCount(0), + m_DocEnv(this) { + m_pXFAApp = pdfium::MakeUnique(this); + m_pXFAApp->SetDefaultFontMgr(pdfium::MakeUnique()); +} + +CPDFXFA_Context::~CPDFXFA_Context() { + m_nLoadStatus = FXFA_LOADSTATUS_CLOSING; + + // Must happen before we remove the form fill environment. + CloseXFADoc(); + + if (m_pFormFillEnv) { + m_pFormFillEnv->ClearAllFocusedAnnots(); + // Once we're deleted the FormFillEnvironment will point at a bad underlying + // doc so we need to reset it ... + m_pFormFillEnv->ResetXFADocument(); + m_pFormFillEnv = nullptr; + } + + m_nLoadStatus = FXFA_LOADSTATUS_CLOSED; +} + +void CPDFXFA_Context::CloseXFADoc() { + if (!m_pXFADoc) + return; + m_pXFADoc->CloseDoc(); + m_pXFADoc.reset(); + m_pXFADocView = nullptr; +} + +void CPDFXFA_Context::SetFormFillEnv( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + // The layout data can have pointers back into the script context. That + // context will be different if the form fill environment closes, so, force + // the layout data to clear. + if (m_pXFADoc && m_pXFADoc->GetXFADoc()) + m_pXFADoc->GetXFADoc()->ClearLayoutData(); + + m_pFormFillEnv = pFormFillEnv; +} + +bool CPDFXFA_Context::LoadXFADoc() { + m_nLoadStatus = FXFA_LOADSTATUS_LOADING; + if (!m_pPDFDoc) + return false; + + m_XFAPageList.clear(); + + CXFA_FFApp* pApp = GetXFAApp(); + if (!pApp) + return false; + + m_pXFADoc = pApp->CreateDoc(&m_DocEnv, m_pPDFDoc.get()); + if (!m_pXFADoc) { + SetLastError(FPDF_ERR_XFALOAD); + return false; + } + + CXFA_FFDocHandler* pDocHandler = pApp->GetDocHandler(); + if (!pDocHandler) { + SetLastError(FPDF_ERR_XFALOAD); + return false; + } + + m_pXFADoc->StartLoad(); + int iStatus = m_pXFADoc->DoLoad(nullptr); + if (iStatus != XFA_PARSESTATUS_Done) { + CloseXFADoc(); + SetLastError(FPDF_ERR_XFALOAD); + return false; + } + m_pXFADoc->StopLoad(); + m_pXFADoc->GetXFADoc()->InitScriptContext(GetJSERuntime()); + + if (m_pXFADoc->GetDocType() == XFA_DOCTYPE_Dynamic) + m_iDocType = DOCTYPE_DYNAMIC_XFA; + else + m_iDocType = DOCTYPE_STATIC_XFA; + + m_pXFADocView = m_pXFADoc->CreateDocView(XFA_DOCVIEW_View); + if (m_pXFADocView->StartLayout() < 0) { + CloseXFADoc(); + SetLastError(FPDF_ERR_XFALAYOUT); + return false; + } + + m_pXFADocView->DoLayout(nullptr); + m_pXFADocView->StopLayout(); + m_nLoadStatus = FXFA_LOADSTATUS_LOADED; + + return true; +} + +int CPDFXFA_Context::GetPageCount() const { + if (!m_pPDFDoc && !m_pXFADoc) + return 0; + + switch (m_iDocType) { + case DOCTYPE_PDF: + case DOCTYPE_STATIC_XFA: + if (m_pPDFDoc) + return m_pPDFDoc->GetPageCount(); + case DOCTYPE_DYNAMIC_XFA: + if (m_pXFADoc) + return m_pXFADocView->CountPageViews(); + default: + return 0; + } +} + +CPDFXFA_Page* CPDFXFA_Context::GetXFAPage(int page_index) { + if (page_index < 0) + return nullptr; + + CPDFXFA_Page* pPage = nullptr; + int nCount = pdfium::CollectionSize(m_XFAPageList); + if (nCount > 0 && page_index < nCount) { + pPage = m_XFAPageList[page_index]; + if (pPage) { + pPage->Retain(); + return pPage; + } + } else { + m_nPageCount = GetPageCount(); + m_XFAPageList.resize(m_nPageCount); + } + + pPage = new CPDFXFA_Page(this, page_index); + if (!pPage->LoadPage()) { + pPage->Release(); + return nullptr; + } + if (page_index >= 0 && + page_index < pdfium::CollectionSize(m_XFAPageList)) { + m_XFAPageList[page_index] = pPage; + } + return pPage; +} + +CPDFXFA_Page* CPDFXFA_Context::GetXFAPage(CXFA_FFPageView* pPage) const { + if (!pPage) + return nullptr; + + if (!m_pXFADoc) + return nullptr; + + if (m_iDocType != DOCTYPE_DYNAMIC_XFA) + return nullptr; + + for (CPDFXFA_Page* pTempPage : m_XFAPageList) { + if (pTempPage && pTempPage->GetXFAPageView() == pPage) + return pTempPage; + } + return nullptr; +} + +void CPDFXFA_Context::DeletePage(int page_index) { + // Delete from the document first because, if GetPage was never called for + // this |page_index| then |m_XFAPageList| may have size < |page_index| even + // if it's a valid page in the document. + if (m_pPDFDoc) + m_pPDFDoc->DeletePage(page_index); + + if (page_index < 0 || + page_index >= pdfium::CollectionSize(m_XFAPageList)) { + return; + } + if (CPDFXFA_Page* pPage = m_XFAPageList[page_index]) + pPage->Release(); +} + +void CPDFXFA_Context::RemovePage(CPDFXFA_Page* page) { + int page_index = page->GetPageIndex(); + if (page_index >= 0 && + page_index < pdfium::CollectionSize(m_XFAPageList)) { + m_XFAPageList[page_index] = nullptr; + } +} + +void CPDFXFA_Context::ClearChangeMark() { + if (m_pFormFillEnv) + m_pFormFillEnv->ClearChangeMark(); +} + +v8::Isolate* CPDFXFA_Context::GetJSERuntime() const { + if (!m_pFormFillEnv) + return nullptr; + + // XFA requires V8, if we have V8 then we have a CJS_Runtime and not the stub. + CJS_Runtime* runtime = + static_cast(m_pFormFillEnv->GetJSRuntime()); + return runtime->GetIsolate(); +} + +CFX_WideString CPDFXFA_Context::GetAppTitle() const { + return L"PDFium"; +} + +CFX_WideString CPDFXFA_Context::GetAppName() { + return m_pFormFillEnv ? m_pFormFillEnv->FFI_GetAppName() : L""; +} + +CFX_WideString CPDFXFA_Context::GetLanguage() { + return m_pFormFillEnv ? m_pFormFillEnv->GetLanguage() : L""; +} + +CFX_WideString CPDFXFA_Context::GetPlatform() { + return m_pFormFillEnv ? m_pFormFillEnv->GetPlatform() : L""; +} + +void CPDFXFA_Context::Beep(uint32_t dwType) { + if (m_pFormFillEnv) + m_pFormFillEnv->JS_appBeep(dwType); +} + +int32_t CPDFXFA_Context::MsgBox(const CFX_WideString& wsMessage, + const CFX_WideString& wsTitle, + uint32_t dwIconType, + uint32_t dwButtonType) { + if (!m_pFormFillEnv) + return -1; + + uint32_t iconType = 0; + int iButtonType = 0; + switch (dwIconType) { + case XFA_MBICON_Error: + iconType |= 0; + break; + case XFA_MBICON_Warning: + iconType |= 1; + break; + case XFA_MBICON_Question: + iconType |= 2; + break; + case XFA_MBICON_Status: + iconType |= 3; + break; + } + switch (dwButtonType) { + case XFA_MB_OK: + iButtonType |= 0; + break; + case XFA_MB_OKCancel: + iButtonType |= 1; + break; + case XFA_MB_YesNo: + iButtonType |= 2; + break; + case XFA_MB_YesNoCancel: + iButtonType |= 3; + break; + } + int32_t iRet = m_pFormFillEnv->JS_appAlert(wsMessage.c_str(), wsTitle.c_str(), + iButtonType, iconType); + switch (iRet) { + case 1: + return XFA_IDOK; + case 2: + return XFA_IDCancel; + case 3: + return XFA_IDNo; + case 4: + return XFA_IDYes; + } + return XFA_IDYes; +} + +CFX_WideString CPDFXFA_Context::Response(const CFX_WideString& wsQuestion, + const CFX_WideString& wsTitle, + const CFX_WideString& wsDefaultAnswer, + bool bMark) { + CFX_WideString wsAnswer; + if (!m_pFormFillEnv) + return wsAnswer; + + int nLength = 2048; + char* pBuff = new char[nLength]; + nLength = m_pFormFillEnv->JS_appResponse(wsQuestion.c_str(), wsTitle.c_str(), + wsDefaultAnswer.c_str(), nullptr, + bMark, pBuff, nLength); + if (nLength > 0) { + nLength = nLength > 2046 ? 2046 : nLength; + pBuff[nLength] = 0; + pBuff[nLength + 1] = 0; + wsAnswer = CFX_WideString::FromUTF16LE( + reinterpret_cast(pBuff), + nLength / sizeof(unsigned short)); + } + delete[] pBuff; + return wsAnswer; +} + +CFX_RetainPtr CPDFXFA_Context::DownloadURL( + const CFX_WideString& wsURL) { + return m_pFormFillEnv ? m_pFormFillEnv->DownloadFromURL(wsURL.c_str()) + : nullptr; +} + +bool CPDFXFA_Context::PostRequestURL(const CFX_WideString& wsURL, + const CFX_WideString& wsData, + const CFX_WideString& wsContentType, + const CFX_WideString& wsEncode, + const CFX_WideString& wsHeader, + CFX_WideString& wsResponse) { + if (!m_pFormFillEnv) + return false; + + wsResponse = m_pFormFillEnv->PostRequestURL( + wsURL.c_str(), wsData.c_str(), wsContentType.c_str(), wsEncode.c_str(), + wsHeader.c_str()); + return true; +} + +bool CPDFXFA_Context::PutRequestURL(const CFX_WideString& wsURL, + const CFX_WideString& wsData, + const CFX_WideString& wsEncode) { + return m_pFormFillEnv && + m_pFormFillEnv->PutRequestURL(wsURL.c_str(), wsData.c_str(), + wsEncode.c_str()); +} + +IFWL_AdapterTimerMgr* CPDFXFA_Context::GetTimerMgr() { + CXFA_FWLAdapterTimerMgr* pAdapter = nullptr; + if (m_pFormFillEnv) + pAdapter = new CXFA_FWLAdapterTimerMgr(m_pFormFillEnv); + return pAdapter; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_context.h b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_context.h new file mode 100644 index 000000000000..9a2a517fb5ab --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_context.h @@ -0,0 +1,117 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FPDFXFA_CPDFXFA_CONTEXT_H_ +#define FPDFSDK_FPDFXFA_CPDFXFA_CONTEXT_H_ + +#include +#include + +#include "fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h" +#include "xfa/fxfa/xfa_ffdoc.h" + +class CJS_Runtime; +class CPDFSDK_FormFillEnvironment; +class CPDFXFA_Page; +class CXFA_FFDocHandler; +class IJS_EventContext; +class IJS_Runtime; + +enum LoadStatus { + FXFA_LOADSTATUS_PRELOAD = 0, + FXFA_LOADSTATUS_LOADING, + FXFA_LOADSTATUS_LOADED, + FXFA_LOADSTATUS_CLOSING, + FXFA_LOADSTATUS_CLOSED +}; + +class CPDFXFA_Context : public IXFA_AppProvider { + public: + explicit CPDFXFA_Context(std::unique_ptr pPDFDoc); + ~CPDFXFA_Context() override; + + bool LoadXFADoc(); + CPDF_Document* GetPDFDoc() { return m_pPDFDoc.get(); } + CXFA_FFDoc* GetXFADoc() { return m_pXFADoc.get(); } + CXFA_FFDocView* GetXFADocView() { return m_pXFADocView; } + int GetDocType() const { return m_iDocType; } + v8::Isolate* GetJSERuntime() const; + CXFA_FFApp* GetXFAApp() { return m_pXFAApp.get(); } + + CPDFSDK_FormFillEnvironment* GetFormFillEnv() const { return m_pFormFillEnv; } + void SetFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv); + + void DeletePage(int page_index); + int GetPageCount() const; + + CPDFXFA_Page* GetXFAPage(int page_index); + CPDFXFA_Page* GetXFAPage(CXFA_FFPageView* pPage) const; + + void RemovePage(CPDFXFA_Page* page); + + void ClearChangeMark(); + + // IFXA_AppProvider: + CFX_WideString GetLanguage() override; + CFX_WideString GetPlatform() override; + CFX_WideString GetAppName() override; + CFX_WideString GetAppTitle() const override; + + void Beep(uint32_t dwType) override; + int32_t MsgBox(const CFX_WideString& wsMessage, + const CFX_WideString& wsTitle, + uint32_t dwIconType, + uint32_t dwButtonType) override; + CFX_WideString Response(const CFX_WideString& wsQuestion, + const CFX_WideString& wsTitle, + const CFX_WideString& wsDefaultAnswer, + bool bMark) override; + CFX_RetainPtr DownloadURL( + const CFX_WideString& wsURL) override; + bool PostRequestURL(const CFX_WideString& wsURL, + const CFX_WideString& wsData, + const CFX_WideString& wsContentType, + const CFX_WideString& wsEncode, + const CFX_WideString& wsHeader, + CFX_WideString& wsResponse) override; + bool PutRequestURL(const CFX_WideString& wsURL, + const CFX_WideString& wsData, + const CFX_WideString& wsEncode) override; + + IFWL_AdapterTimerMgr* GetTimerMgr() override; + + protected: + friend class CPDFXFA_DocEnvironment; + + int GetOriginalPageCount() const { return m_nPageCount; } + void SetOriginalPageCount(int count) { + m_nPageCount = count; + m_XFAPageList.resize(count); + } + + LoadStatus GetLoadStatus() const { return m_nLoadStatus; } + std::vector* GetXFAPageList() { return &m_XFAPageList; } + + private: + void CloseXFADoc(); + + int m_iDocType; + + std::unique_ptr m_pPDFDoc; + std::unique_ptr m_pXFADoc; + CPDFSDK_FormFillEnvironment* m_pFormFillEnv; // not owned. + CXFA_FFDocView* m_pXFADocView; // not owned. + std::unique_ptr m_pXFAApp; + std::unique_ptr m_pRuntime; + std::vector m_XFAPageList; + LoadStatus m_nLoadStatus; + int m_nPageCount; + + // Must be destroyed before |m_pFormFillEnv|. + CPDFXFA_DocEnvironment m_DocEnv; +}; + +#endif // FPDFSDK_FPDFXFA_CPDFXFA_CONTEXT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp new file mode 100644 index 000000000000..731b0cc2967b --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp @@ -0,0 +1,1031 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h" + +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fxcrt/cfx_retain_ptr.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" +#include "fpdfsdk/javascript/ijs_runtime.h" +#include "xfa/fxfa/xfa_ffdocview.h" +#include "xfa/fxfa/xfa_ffwidget.h" +#include "xfa/fxfa/xfa_ffwidgethandler.h" + +#define IDS_XFA_Validate_Input \ + "At least one required field was empty. Please fill in the required " \ + "fields\r\n(highlighted) before continuing." + +// submit +#define FXFA_CONFIG 0x00000001 +#define FXFA_TEMPLATE 0x00000010 +#define FXFA_LOCALESET 0x00000100 +#define FXFA_DATASETS 0x00001000 +#define FXFA_XMPMETA 0x00010000 +#define FXFA_XFDF 0x00100000 +#define FXFA_FORM 0x01000000 +#define FXFA_PDF 0x10000000 +#define FXFA_XFA_ALL 0x01111111 + +CPDFXFA_DocEnvironment::CPDFXFA_DocEnvironment(CPDFXFA_Context* pContext) + : m_pContext(pContext), m_pJSEventContext(nullptr) { + ASSERT(m_pContext); +} + +CPDFXFA_DocEnvironment::~CPDFXFA_DocEnvironment() { + if (m_pJSEventContext && m_pContext->GetFormFillEnv()) { + m_pContext->GetFormFillEnv()->GetJSRuntime()->ReleaseEventContext( + m_pJSEventContext); + } +} + +void CPDFXFA_DocEnvironment::SetChangeMark(CXFA_FFDoc* hDoc) { + if (hDoc == m_pContext->GetXFADoc() && m_pContext->GetFormFillEnv()) + m_pContext->GetFormFillEnv()->SetChangeMark(); +} + +void CPDFXFA_DocEnvironment::InvalidateRect(CXFA_FFPageView* pPageView, + const CFX_RectF& rt, + uint32_t dwFlags /* = 0 */) { + if (!m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv()) + return; + + if (m_pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA) + return; + + CPDFXFA_Page* pPage = m_pContext->GetXFAPage(pPageView); + if (!pPage) + return; + + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv) + return; + + pFormFillEnv->Invalidate(static_cast(pPage), + CFX_FloatRect::FromCFXRectF(rt).ToFxRect()); +} + +void CPDFXFA_DocEnvironment::DisplayCaret(CXFA_FFWidget* hWidget, + bool bVisible, + const CFX_RectF* pRtAnchor) { + if (!hWidget || !pRtAnchor || !m_pContext->GetXFADoc() || + !m_pContext->GetFormFillEnv() || !m_pContext->GetXFADocView()) + return; + + if (m_pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA) + return; + + CXFA_FFWidgetHandler* pWidgetHandler = + m_pContext->GetXFADocView()->GetWidgetHandler(); + if (!pWidgetHandler) + return; + + CXFA_FFPageView* pPageView = hWidget->GetPageView(); + if (!pPageView) + return; + + CPDFXFA_Page* pPage = m_pContext->GetXFAPage(pPageView); + if (!pPage) + return; + + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv) + return; + + CFX_FloatRect rcCaret = CFX_FloatRect::FromCFXRectF(*pRtAnchor); + pFormFillEnv->DisplayCaret((FPDF_PAGE)pPage, bVisible, rcCaret.left, + rcCaret.top, rcCaret.right, rcCaret.bottom); +} + +bool CPDFXFA_DocEnvironment::GetPopupPos(CXFA_FFWidget* hWidget, + FX_FLOAT fMinPopup, + FX_FLOAT fMaxPopup, + const CFX_RectF& rtAnchor, + CFX_RectF& rtPopup) { + if (!hWidget) + return false; + + CXFA_FFPageView* pXFAPageView = hWidget->GetPageView(); + if (!pXFAPageView) + return false; + + CPDFXFA_Page* pPage = m_pContext->GetXFAPage(pXFAPageView); + if (!pPage) + return false; + + CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc(); + int nRotate = pWidgetAcc->GetRotate(); + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv) + return false; + + FS_RECTF pageViewRect = {0.0f, 0.0f, 0.0f, 0.0f}; + pFormFillEnv->GetPageViewRect(pPage, pageViewRect); + + int t1; + int t2; + CFX_FloatRect rcAnchor = CFX_FloatRect::FromCFXRectF(rtAnchor); + switch (nRotate) { + case 90: { + t1 = (int)(pageViewRect.right - rcAnchor.right); + t2 = (int)(rcAnchor.left - pageViewRect.left); + if (rcAnchor.bottom < pageViewRect.bottom) + rtPopup.left += rcAnchor.bottom - pageViewRect.bottom; + break; + } + case 180: { + t2 = (int)(pageViewRect.top - rcAnchor.top); + t1 = (int)(rcAnchor.bottom - pageViewRect.bottom); + if (rcAnchor.left < pageViewRect.left) + rtPopup.left += rcAnchor.left - pageViewRect.left; + break; + } + case 270: { + t1 = (int)(rcAnchor.left - pageViewRect.left); + t2 = (int)(pageViewRect.right - rcAnchor.right); + if (rcAnchor.top > pageViewRect.top) + rtPopup.left -= rcAnchor.top - pageViewRect.top; + break; + } + case 0: + default: { + t1 = (int)(pageViewRect.top - rcAnchor.top); + t2 = (int)(rcAnchor.bottom - pageViewRect.bottom); + if (rcAnchor.right > pageViewRect.right) + rtPopup.left -= rcAnchor.right - pageViewRect.right; + break; + } + } + + int t; + uint32_t dwPos; + if (t1 <= 0 && t2 <= 0) + return false; + if (t1 <= 0) { + t = t2; + dwPos = 1; + } else if (t2 <= 0) { + t = t1; + dwPos = 0; + } else if (t1 > t2) { + t = t1; + dwPos = 0; + } else { + t = t2; + dwPos = 1; + } + + FX_FLOAT fPopupHeight; + if (t < fMinPopup) + fPopupHeight = fMinPopup; + else if (t > fMaxPopup) + fPopupHeight = fMaxPopup; + else + fPopupHeight = static_cast(t); + + switch (nRotate) { + case 0: + case 180: { + if (dwPos == 0) { + rtPopup.top = rtAnchor.height; + rtPopup.height = fPopupHeight; + } else { + rtPopup.top = -fPopupHeight; + rtPopup.height = fPopupHeight; + } + break; + } + case 90: + case 270: { + if (dwPos == 0) { + rtPopup.top = rtAnchor.width; + rtPopup.height = fPopupHeight; + } else { + rtPopup.top = -fPopupHeight; + rtPopup.height = fPopupHeight; + } + break; + } + default: + break; + } + + return true; +} + +bool CPDFXFA_DocEnvironment::PopupMenu(CXFA_FFWidget* hWidget, + CFX_PointF ptPopup) { + if (!hWidget) + return false; + + CXFA_FFPageView* pXFAPageView = hWidget->GetPageView(); + if (!pXFAPageView) + return false; + + CPDFXFA_Page* pPage = m_pContext->GetXFAPage(pXFAPageView); + if (!pPage) + return false; + + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv) + return false; + + int menuFlag = 0; + if (hWidget->CanUndo()) + menuFlag |= FXFA_MENU_UNDO; + if (hWidget->CanRedo()) + menuFlag |= FXFA_MENU_REDO; + if (hWidget->CanPaste()) + menuFlag |= FXFA_MENU_PASTE; + if (hWidget->CanCopy()) + menuFlag |= FXFA_MENU_COPY; + if (hWidget->CanCut()) + menuFlag |= FXFA_MENU_CUT; + if (hWidget->CanSelectAll()) + menuFlag |= FXFA_MENU_SELECTALL; + + return pFormFillEnv->PopupMenu(pPage, hWidget, menuFlag, ptPopup); +} + +void CPDFXFA_DocEnvironment::PageViewEvent(CXFA_FFPageView* pPageView, + uint32_t dwFlags) { + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv) + return; + + if (m_pContext->GetLoadStatus() == FXFA_LOADSTATUS_LOADING || + m_pContext->GetLoadStatus() == FXFA_LOADSTATUS_CLOSING || + XFA_PAGEVIEWEVENT_StopLayout != dwFlags) + return; + + int nNewCount = m_pContext->GetPageCount(); + if (nNewCount == m_pContext->GetOriginalPageCount()) + return; + + CXFA_FFDocView* pXFADocView = m_pContext->GetXFADocView(); + if (!pXFADocView) + return; + + for (int iPageIter = 0; iPageIter < m_pContext->GetOriginalPageCount(); + iPageIter++) { + CPDFXFA_Page* pPage = (*m_pContext->GetXFAPageList())[iPageIter]; + if (!pPage) + continue; + + m_pContext->GetFormFillEnv()->RemovePageView(pPage); + pPage->SetXFAPageView(pXFADocView->GetPageView(iPageIter)); + } + + int flag = (nNewCount < m_pContext->GetOriginalPageCount()) + ? FXFA_PAGEVIEWEVENT_POSTREMOVED + : FXFA_PAGEVIEWEVENT_POSTADDED; + int count = FXSYS_abs(nNewCount - m_pContext->GetOriginalPageCount()); + m_pContext->SetOriginalPageCount(nNewCount); + pFormFillEnv->PageEvent(count, flag); +} + +void CPDFXFA_DocEnvironment::WidgetPostAdd(CXFA_FFWidget* hWidget, + CXFA_WidgetAcc* pWidgetData) { + if (m_pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA || !hWidget) + return; + + CXFA_FFPageView* pPageView = hWidget->GetPageView(); + if (!pPageView) + return; + + CPDFXFA_Page* pXFAPage = m_pContext->GetXFAPage(pPageView); + if (!pXFAPage) + return; + + m_pContext->GetFormFillEnv()->GetPageView(pXFAPage, true)->AddAnnot(hWidget); +} + +void CPDFXFA_DocEnvironment::WidgetPreRemove(CXFA_FFWidget* hWidget, + CXFA_WidgetAcc* pWidgetData) { + if (m_pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA || !hWidget) + return; + + CXFA_FFPageView* pPageView = hWidget->GetPageView(); + if (!pPageView) + return; + + CPDFXFA_Page* pXFAPage = m_pContext->GetXFAPage(pPageView); + if (!pXFAPage) + return; + + CPDFSDK_PageView* pSdkPageView = + m_pContext->GetFormFillEnv()->GetPageView(pXFAPage, true); + if (CPDFSDK_Annot* pAnnot = pSdkPageView->GetAnnotByXFAWidget(hWidget)) + pSdkPageView->DeleteAnnot(pAnnot); +} + +int32_t CPDFXFA_DocEnvironment::CountPages(CXFA_FFDoc* hDoc) { + if (hDoc == m_pContext->GetXFADoc() && m_pContext->GetFormFillEnv()) + return m_pContext->GetPageCount(); + return 0; +} + +int32_t CPDFXFA_DocEnvironment::GetCurrentPage(CXFA_FFDoc* hDoc) { + if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv()) + return -1; + if (m_pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA) + return -1; + + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv) + return -1; + + return pFormFillEnv->GetCurrentPageIndex(this); +} + +void CPDFXFA_DocEnvironment::SetCurrentPage(CXFA_FFDoc* hDoc, + int32_t iCurPage) { + if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv() || + m_pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA || iCurPage < 0 || + iCurPage >= m_pContext->GetFormFillEnv()->GetPageCount()) { + return; + } + + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv) + return; + pFormFillEnv->SetCurrentPage(this, iCurPage); +} + +bool CPDFXFA_DocEnvironment::IsCalculationsEnabled(CXFA_FFDoc* hDoc) { + if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv()) + return false; + if (m_pContext->GetFormFillEnv()->GetInterForm()) { + return m_pContext->GetFormFillEnv() + ->GetInterForm() + ->IsXfaCalculateEnabled(); + } + return false; +} + +void CPDFXFA_DocEnvironment::SetCalculationsEnabled(CXFA_FFDoc* hDoc, + bool bEnabled) { + if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv()) + return; + if (m_pContext->GetFormFillEnv()->GetInterForm()) { + m_pContext->GetFormFillEnv()->GetInterForm()->XfaEnableCalculate(bEnabled); + } +} + +void CPDFXFA_DocEnvironment::GetTitle(CXFA_FFDoc* hDoc, + CFX_WideString& wsTitle) { + if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetPDFDoc()) + return; + + CPDF_Dictionary* pInfoDict = m_pContext->GetPDFDoc()->GetInfo(); + if (!pInfoDict) + return; + + CFX_ByteString csTitle = pInfoDict->GetStringFor("Title"); + wsTitle = wsTitle.FromLocal(csTitle.GetBuffer(csTitle.GetLength())); + csTitle.ReleaseBuffer(csTitle.GetLength()); +} + +void CPDFXFA_DocEnvironment::SetTitle(CXFA_FFDoc* hDoc, + const CFX_WideString& wsTitle) { + if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetPDFDoc()) + return; + + if (CPDF_Dictionary* pInfoDict = m_pContext->GetPDFDoc()->GetInfo()) + pInfoDict->SetNewFor("Title", wsTitle); +} + +void CPDFXFA_DocEnvironment::ExportData(CXFA_FFDoc* hDoc, + const CFX_WideString& wsFilePath, + bool bXDP) { + if (hDoc != m_pContext->GetXFADoc()) + return; + + if (m_pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA && + m_pContext->GetDocType() != DOCTYPE_STATIC_XFA) { + return; + } + + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv) + return; + + int fileType = bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML; + CFX_ByteString bs = wsFilePath.UTF16LE_Encode(); + if (wsFilePath.IsEmpty()) { + if (!pFormFillEnv->GetFormFillInfo() || + !pFormFillEnv->GetFormFillInfo()->m_pJsPlatform) { + return; + } + + CFX_WideString filepath = pFormFillEnv->JS_fieldBrowse(); + bs = filepath.UTF16LE_Encode(); + } + int len = bs.GetLength(); + FPDF_FILEHANDLER* pFileHandler = + pFormFillEnv->OpenFile(bXDP ? FXFA_SAVEAS_XDP : FXFA_SAVEAS_XML, + (FPDF_WIDESTRING)bs.GetBuffer(len), "wb"); + bs.ReleaseBuffer(len); + if (!pFileHandler) + return; + + CFX_RetainPtr fileWrite = + MakeSeekableStream(pFileHandler); + CFX_ByteString content; + if (fileType == FXFA_SAVEAS_XML) { + content = "\r\n"; + fileWrite->WriteBlock(content.c_str(), fileWrite->GetSize(), + content.GetLength()); + m_pContext->GetXFADocView()->GetDoc()->SavePackage(XFA_HASHCODE_Data, + fileWrite, nullptr); + } else if (fileType == FXFA_SAVEAS_XDP) { + if (!m_pContext->GetPDFDoc()) + return; + + CPDF_Dictionary* pRoot = m_pContext->GetPDFDoc()->GetRoot(); + if (!pRoot) + return; + + CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm"); + if (!pAcroForm) + return; + + CPDF_Array* pArray = ToArray(pAcroForm->GetObjectFor("XFA")); + if (!pArray) + return; + + int size = pArray->GetCount(); + for (int i = 1; i < size; i += 2) { + CPDF_Object* pPDFObj = pArray->GetObjectAt(i); + CPDF_Object* pPrePDFObj = pArray->GetObjectAt(i - 1); + if (!pPrePDFObj->IsString()) + continue; + if (!pPDFObj->IsReference()) + continue; + + CPDF_Stream* pStream = ToStream(pPDFObj->GetDirect()); + if (!pStream) + continue; + if (pPrePDFObj->GetString() == "form") { + m_pContext->GetXFADocView()->GetDoc()->SavePackage(XFA_HASHCODE_Form, + fileWrite, nullptr); + continue; + } + if (pPrePDFObj->GetString() == "datasets") { + m_pContext->GetXFADocView()->GetDoc()->SavePackage( + XFA_HASHCODE_Datasets, fileWrite, nullptr); + continue; + } + if (i == size - 1) { + CFX_WideString wPath = CFX_WideString::FromUTF16LE( + reinterpret_cast(bs.c_str()), + bs.GetLength() / sizeof(unsigned short)); + CFX_ByteString bPath = wPath.UTF8Encode(); + const char* szFormat = + "\n"; + content.Format(szFormat, bPath.c_str()); + fileWrite->WriteBlock(content.c_str(), fileWrite->GetSize(), + content.GetLength()); + } + std::unique_ptr pAcc(new CPDF_StreamAcc); + pAcc->LoadAllData(pStream); + fileWrite->WriteBlock(pAcc->GetData(), fileWrite->GetSize(), + pAcc->GetSize()); + } + } + fileWrite->Flush(); +} + +void CPDFXFA_DocEnvironment::GotoURL(CXFA_FFDoc* hDoc, + const CFX_WideString& bsURL) { + if (hDoc != m_pContext->GetXFADoc()) + return; + + if (m_pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA) + return; + + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv) + return; + + CFX_WideStringC str(bsURL.c_str()); + pFormFillEnv->GotoURL(this, str); +} + +bool CPDFXFA_DocEnvironment::IsValidationsEnabled(CXFA_FFDoc* hDoc) { + if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv()) + return false; + if (m_pContext->GetFormFillEnv()->GetInterForm()) { + return m_pContext->GetFormFillEnv() + ->GetInterForm() + ->IsXfaValidationsEnabled(); + } + return true; +} + +void CPDFXFA_DocEnvironment::SetValidationsEnabled(CXFA_FFDoc* hDoc, + bool bEnabled) { + if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv()) + return; + if (m_pContext->GetFormFillEnv()->GetInterForm()) { + m_pContext->GetFormFillEnv()->GetInterForm()->XfaSetValidationsEnabled( + bEnabled); + } +} + +void CPDFXFA_DocEnvironment::SetFocusWidget(CXFA_FFDoc* hDoc, + CXFA_FFWidget* hWidget) { + if (hDoc != m_pContext->GetXFADoc()) + return; + + if (!hWidget) { + CPDFSDK_Annot::ObservedPtr pNull; + m_pContext->GetFormFillEnv()->SetFocusAnnot(&pNull); + return; + } + + int pageViewCount = m_pContext->GetFormFillEnv()->GetPageViewCount(); + for (int i = 0; i < pageViewCount; i++) { + CPDFSDK_PageView* pPageView = m_pContext->GetFormFillEnv()->GetPageView(i); + if (!pPageView) + continue; + + CPDFSDK_Annot::ObservedPtr pAnnot(pPageView->GetAnnotByXFAWidget(hWidget)); + if (pAnnot) { + m_pContext->GetFormFillEnv()->SetFocusAnnot(&pAnnot); + break; + } + } +} + +void CPDFXFA_DocEnvironment::Print(CXFA_FFDoc* hDoc, + int32_t nStartPage, + int32_t nEndPage, + uint32_t dwOptions) { + if (hDoc != m_pContext->GetXFADoc()) + return; + + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv || !pFormFillEnv->GetFormFillInfo() || + !pFormFillEnv->GetFormFillInfo()->m_pJsPlatform || + !pFormFillEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print) { + return; + } + + pFormFillEnv->GetFormFillInfo()->m_pJsPlatform->Doc_print( + pFormFillEnv->GetFormFillInfo()->m_pJsPlatform, + dwOptions & XFA_PRINTOPT_ShowDialog, nStartPage, nEndPage, + dwOptions & XFA_PRINTOPT_CanCancel, dwOptions & XFA_PRINTOPT_ShrinkPage, + dwOptions & XFA_PRINTOPT_AsImage, dwOptions & XFA_PRINTOPT_ReverseOrder, + dwOptions & XFA_PRINTOPT_PrintAnnot); +} + +FX_ARGB CPDFXFA_DocEnvironment::GetHighlightColor(CXFA_FFDoc* hDoc) { + if (hDoc != m_pContext->GetXFADoc() || !m_pContext->GetFormFillEnv()) + return 0; + + CPDFSDK_InterForm* pInterForm = m_pContext->GetFormFillEnv()->GetInterForm(); + if (!pInterForm) + return 0; + + return ArgbEncode(pInterForm->GetHighlightAlpha(), + pInterForm->GetHighlightColor(FPDF_FORMFIELD_XFA)); +} + +bool CPDFXFA_DocEnvironment::NotifySubmit(bool bPrevOrPost) { + if (bPrevOrPost) + return OnBeforeNotifySubmit(); + + OnAfterNotifySubmit(); + return true; +} + +bool CPDFXFA_DocEnvironment::OnBeforeNotifySubmit() { + if (m_pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA && + m_pContext->GetDocType() != DOCTYPE_STATIC_XFA) { + return true; + } + + if (!m_pContext->GetXFADocView()) + return true; + + CXFA_FFWidgetHandler* pWidgetHandler = + m_pContext->GetXFADocView()->GetWidgetHandler(); + if (!pWidgetHandler) + return true; + + std::unique_ptr pWidgetAccIterator( + m_pContext->GetXFADocView()->CreateWidgetAccIterator()); + if (pWidgetAccIterator) { + CXFA_EventParam Param; + Param.m_eType = XFA_EVENT_PreSubmit; + while (CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext()) + pWidgetHandler->ProcessEvent(pWidgetAcc, &Param); + } + + pWidgetAccIterator.reset( + m_pContext->GetXFADocView()->CreateWidgetAccIterator()); + if (!pWidgetAccIterator) + return true; + + CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext(); + pWidgetAcc = pWidgetAccIterator->MoveToNext(); + while (pWidgetAcc) { + int fRet = pWidgetAcc->ProcessValidate(-1); + if (fRet == XFA_EVENTERROR_Error) { + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv) + return false; + + CFX_WideString ws; + ws.FromLocal(IDS_XFA_Validate_Input); + CFX_ByteString bs = ws.UTF16LE_Encode(); + int len = bs.GetLength(); + pFormFillEnv->Alert((FPDF_WIDESTRING)bs.GetBuffer(len), + (FPDF_WIDESTRING)L"", 0, 1); + bs.ReleaseBuffer(len); + return false; + } + pWidgetAcc = pWidgetAccIterator->MoveToNext(); + } + m_pContext->GetXFADocView()->UpdateDocView(); + + return true; +} + +void CPDFXFA_DocEnvironment::OnAfterNotifySubmit() { + if (m_pContext->GetDocType() != DOCTYPE_DYNAMIC_XFA && + m_pContext->GetDocType() != DOCTYPE_STATIC_XFA) + return; + + if (!m_pContext->GetXFADocView()) + return; + + CXFA_FFWidgetHandler* pWidgetHandler = + m_pContext->GetXFADocView()->GetWidgetHandler(); + if (!pWidgetHandler) + return; + + std::unique_ptr pWidgetAccIterator( + m_pContext->GetXFADocView()->CreateWidgetAccIterator()); + if (!pWidgetAccIterator) + return; + + CXFA_EventParam Param; + Param.m_eType = XFA_EVENT_PostSubmit; + CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext(); + while (pWidgetAcc) { + pWidgetHandler->ProcessEvent(pWidgetAcc, &Param); + pWidgetAcc = pWidgetAccIterator->MoveToNext(); + } + m_pContext->GetXFADocView()->UpdateDocView(); +} + +bool CPDFXFA_DocEnvironment::SubmitData(CXFA_FFDoc* hDoc, CXFA_Submit submit) { + if (!NotifySubmit(true) || !m_pContext->GetXFADocView()) + return false; + + m_pContext->GetXFADocView()->UpdateDocView(); + bool ret = SubmitDataInternal(hDoc, submit); + NotifySubmit(false); + return ret; +} + +CFX_RetainPtr CPDFXFA_DocEnvironment::OpenLinkedFile( + CXFA_FFDoc* hDoc, + const CFX_WideString& wsLink) { + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv) + return nullptr; + + CFX_ByteString bs = wsLink.UTF16LE_Encode(); + int len = bs.GetLength(); + FPDF_FILEHANDLER* pFileHandler = + pFormFillEnv->OpenFile(0, (FPDF_WIDESTRING)bs.GetBuffer(len), "rb"); + bs.ReleaseBuffer(len); + if (!pFileHandler) + return nullptr; + + return MakeSeekableStream(pFileHandler); +} + +bool CPDFXFA_DocEnvironment::ExportSubmitFile(FPDF_FILEHANDLER* pFileHandler, + int fileType, + FPDF_DWORD encodeType, + FPDF_DWORD flag) { + if (!m_pContext->GetXFADocView()) + return false; + + CFX_ByteString content; + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv) + return false; + + CFX_RetainPtr fileStream = + MakeSeekableStream(pFileHandler); + + if (fileType == FXFA_SAVEAS_XML) { + const char kContent[] = "\r\n"; + fileStream->WriteBlock(kContent, 0, strlen(kContent)); + m_pContext->GetXFADoc()->SavePackage(XFA_HASHCODE_Data, fileStream, + nullptr); + return true; + } + + if (fileType != FXFA_SAVEAS_XDP) + return true; + + if (!flag) { + flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS | + FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM; + } + if (!m_pContext->GetPDFDoc()) { + fileStream->Flush(); + return false; + } + + CPDF_Dictionary* pRoot = m_pContext->GetPDFDoc()->GetRoot(); + if (!pRoot) { + fileStream->Flush(); + return false; + } + + CPDF_Dictionary* pAcroForm = pRoot->GetDictFor("AcroForm"); + if (!pAcroForm) { + fileStream->Flush(); + return false; + } + + CPDF_Array* pArray = ToArray(pAcroForm->GetObjectFor("XFA")); + if (!pArray) { + fileStream->Flush(); + return false; + } + + int size = pArray->GetCount(); + for (int i = 1; i < size; i += 2) { + CPDF_Object* pPDFObj = pArray->GetObjectAt(i); + CPDF_Object* pPrePDFObj = pArray->GetObjectAt(i - 1); + if (!pPrePDFObj->IsString()) + continue; + if (!pPDFObj->IsReference()) + continue; + + CPDF_Object* pDirectObj = pPDFObj->GetDirect(); + if (!pDirectObj->IsStream()) + continue; + if (pPrePDFObj->GetString() == "config" && !(flag & FXFA_CONFIG)) + continue; + if (pPrePDFObj->GetString() == "template" && !(flag & FXFA_TEMPLATE)) + continue; + if (pPrePDFObj->GetString() == "localeSet" && !(flag & FXFA_LOCALESET)) + continue; + if (pPrePDFObj->GetString() == "datasets" && !(flag & FXFA_DATASETS)) + continue; + if (pPrePDFObj->GetString() == "xmpmeta" && !(flag & FXFA_XMPMETA)) + continue; + if (pPrePDFObj->GetString() == "xfdf" && !(flag & FXFA_XFDF)) + continue; + if (pPrePDFObj->GetString() == "form" && !(flag & FXFA_FORM)) + continue; + if (pPrePDFObj->GetString() == "form") { + m_pContext->GetXFADoc()->SavePackage(XFA_HASHCODE_Form, fileStream, + nullptr); + } else if (pPrePDFObj->GetString() == "datasets") { + m_pContext->GetXFADoc()->SavePackage(XFA_HASHCODE_Datasets, fileStream, + nullptr); + } else { + // PDF,creator. + } + } + return true; +} + +void CPDFXFA_DocEnvironment::ToXFAContentFlags(CFX_WideString csSrcContent, + FPDF_DWORD& flag) { + if (csSrcContent.Find(L" config ", 0) != -1) + flag |= FXFA_CONFIG; + if (csSrcContent.Find(L" template ", 0) != -1) + flag |= FXFA_TEMPLATE; + if (csSrcContent.Find(L" localeSet ", 0) != -1) + flag |= FXFA_LOCALESET; + if (csSrcContent.Find(L" datasets ", 0) != -1) + flag |= FXFA_DATASETS; + if (csSrcContent.Find(L" xmpmeta ", 0) != -1) + flag |= FXFA_XMPMETA; + if (csSrcContent.Find(L" xfdf ", 0) != -1) + flag |= FXFA_XFDF; + if (csSrcContent.Find(L" form ", 0) != -1) + flag |= FXFA_FORM; + if (flag == 0) { + flag = FXFA_CONFIG | FXFA_TEMPLATE | FXFA_LOCALESET | FXFA_DATASETS | + FXFA_XMPMETA | FXFA_XFDF | FXFA_FORM; + } +} + +bool CPDFXFA_DocEnvironment::MailToInfo(CFX_WideString& csURL, + CFX_WideString& csToAddress, + CFX_WideString& csCCAddress, + CFX_WideString& csBCCAddress, + CFX_WideString& csSubject, + CFX_WideString& csMsg) { + CFX_WideString srcURL = csURL; + srcURL.TrimLeft(); + if (srcURL.Left(7).CompareNoCase(L"mailto:") != 0) + return false; + + int pos = srcURL.Find(L'?', 0); + CFX_WideString tmp; + if (pos == -1) { + pos = srcURL.Find(L'@', 0); + if (pos == -1) + return false; + + tmp = srcURL.Right(csURL.GetLength() - 7); + } else { + tmp = srcURL.Left(pos); + tmp = tmp.Right(tmp.GetLength() - 7); + } + tmp.TrimLeft(); + tmp.TrimRight(); + + csToAddress = tmp; + + srcURL = srcURL.Right(srcURL.GetLength() - (pos + 1)); + while (!srcURL.IsEmpty()) { + srcURL.TrimLeft(); + srcURL.TrimRight(); + pos = srcURL.Find(L'&', 0); + + tmp = (pos == -1) ? srcURL : srcURL.Left(pos); + tmp.TrimLeft(); + tmp.TrimRight(); + if (tmp.GetLength() >= 3 && tmp.Left(3).CompareNoCase(L"cc=") == 0) { + tmp = tmp.Right(tmp.GetLength() - 3); + if (!csCCAddress.IsEmpty()) + csCCAddress += L';'; + csCCAddress += tmp; + } else if (tmp.GetLength() >= 4 && + tmp.Left(4).CompareNoCase(L"bcc=") == 0) { + tmp = tmp.Right(tmp.GetLength() - 4); + if (!csBCCAddress.IsEmpty()) + csBCCAddress += L';'; + csBCCAddress += tmp; + } else if (tmp.GetLength() >= 8 && + tmp.Left(8).CompareNoCase(L"subject=") == 0) { + tmp = tmp.Right(tmp.GetLength() - 8); + csSubject += tmp; + } else if (tmp.GetLength() >= 5 && + tmp.Left(5).CompareNoCase(L"body=") == 0) { + tmp = tmp.Right(tmp.GetLength() - 5); + csMsg += tmp; + } + srcURL = (pos == -1) ? L"" : srcURL.Right(csURL.GetLength() - (pos + 1)); + } + csToAddress.Replace(L",", L";"); + csCCAddress.Replace(L",", L";"); + csBCCAddress.Replace(L",", L";"); + return true; +} + +bool CPDFXFA_DocEnvironment::SubmitDataInternal(CXFA_FFDoc* hDoc, + CXFA_Submit submit) { + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!pFormFillEnv) + return false; + + CFX_WideStringC csURLC; + submit.GetSubmitTarget(csURLC); + CFX_WideString csURL(csURLC); + if (csURL.IsEmpty()) { + CFX_WideString ws; + ws.FromLocal("Submit cancelled."); + CFX_ByteString bs = ws.UTF16LE_Encode(); + int len = bs.GetLength(); + pFormFillEnv->Alert((FPDF_WIDESTRING)bs.GetBuffer(len), + (FPDF_WIDESTRING)L"", 0, 4); + bs.ReleaseBuffer(len); + return false; + } + + FPDF_FILEHANDLER* pFileHandler = nullptr; + int fileFlag = -1; + switch (submit.GetSubmitFormat()) { + case XFA_ATTRIBUTEENUM_Xdp: { + CFX_WideStringC csContentC; + submit.GetSubmitXDPContent(csContentC); + CFX_WideString csContent; + csContent = csContentC; + csContent.TrimLeft(); + csContent.TrimRight(); + CFX_WideString space; + space.FromLocal(" "); + csContent = space + csContent + space; + FPDF_DWORD flag = 0; + if (submit.IsSubmitEmbedPDF()) + flag |= FXFA_PDF; + + ToXFAContentFlags(csContent, flag); + pFileHandler = pFormFillEnv->OpenFile(FXFA_SAVEAS_XDP, nullptr, "wb"); + fileFlag = FXFA_SAVEAS_XDP; + ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XDP, 0, flag); + break; + } + case XFA_ATTRIBUTEENUM_Xml: + pFileHandler = pFormFillEnv->OpenFile(FXFA_SAVEAS_XML, nullptr, "wb"); + fileFlag = FXFA_SAVEAS_XML; + ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0, FXFA_XFA_ALL); + break; + case XFA_ATTRIBUTEENUM_Pdf: + break; + case XFA_ATTRIBUTEENUM_Urlencoded: + pFileHandler = pFormFillEnv->OpenFile(FXFA_SAVEAS_XML, nullptr, "wb"); + fileFlag = FXFA_SAVEAS_XML; + ExportSubmitFile(pFileHandler, FXFA_SAVEAS_XML, 0, FXFA_XFA_ALL); + break; + default: + return false; + } + if (!pFileHandler) + return false; + if (csURL.Left(7).CompareNoCase(L"mailto:") == 0) { + CFX_WideString csToAddress; + CFX_WideString csCCAddress; + CFX_WideString csBCCAddress; + CFX_WideString csSubject; + CFX_WideString csMsg; + if (!MailToInfo(csURL, csToAddress, csCCAddress, csBCCAddress, csSubject, + csMsg)) { + return false; + } + CFX_ByteString bsTo = CFX_WideString(csToAddress).UTF16LE_Encode(); + CFX_ByteString bsCC = CFX_WideString(csCCAddress).UTF16LE_Encode(); + CFX_ByteString bsBcc = CFX_WideString(csBCCAddress).UTF16LE_Encode(); + CFX_ByteString bsSubject = CFX_WideString(csSubject).UTF16LE_Encode(); + CFX_ByteString bsMsg = CFX_WideString(csMsg).UTF16LE_Encode(); + FPDF_WIDESTRING pTo = (FPDF_WIDESTRING)bsTo.GetBuffer(bsTo.GetLength()); + FPDF_WIDESTRING pCC = (FPDF_WIDESTRING)bsCC.GetBuffer(bsCC.GetLength()); + FPDF_WIDESTRING pBcc = (FPDF_WIDESTRING)bsBcc.GetBuffer(bsBcc.GetLength()); + FPDF_WIDESTRING pSubject = + (FPDF_WIDESTRING)bsSubject.GetBuffer(bsSubject.GetLength()); + FPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength()); + pFormFillEnv->EmailTo(pFileHandler, pTo, pSubject, pCC, pBcc, pMsg); + bsTo.ReleaseBuffer(); + bsCC.ReleaseBuffer(); + bsBcc.ReleaseBuffer(); + bsSubject.ReleaseBuffer(); + bsMsg.ReleaseBuffer(); + } else { + // HTTP or FTP + CFX_WideString ws; + CFX_ByteString bs = csURL.UTF16LE_Encode(); + int len = bs.GetLength(); + pFormFillEnv->UploadTo(pFileHandler, fileFlag, + (FPDF_WIDESTRING)bs.GetBuffer(len)); + bs.ReleaseBuffer(len); + } + return true; +} + +bool CPDFXFA_DocEnvironment::SetGlobalProperty( + CXFA_FFDoc* hDoc, + const CFX_ByteStringC& szPropName, + CFXJSE_Value* pValue) { + if (hDoc != m_pContext->GetXFADoc()) + return false; + + if (m_pContext->GetFormFillEnv() && + m_pContext->GetFormFillEnv()->GetJSRuntime()) { + return m_pContext->GetFormFillEnv()->GetJSRuntime()->SetValueByName( + szPropName, pValue); + } + return false; +} + +bool CPDFXFA_DocEnvironment::GetGlobalProperty( + CXFA_FFDoc* hDoc, + const CFX_ByteStringC& szPropName, + CFXJSE_Value* pValue) { + if (hDoc != m_pContext->GetXFADoc()) + return false; + if (!m_pContext->GetFormFillEnv() || + !m_pContext->GetFormFillEnv()->GetJSRuntime()) { + return false; + } + + CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pContext->GetFormFillEnv(); + if (!m_pJSEventContext) + m_pJSEventContext = pFormFillEnv->GetJSRuntime()->NewEventContext(); + + return pFormFillEnv->GetJSRuntime()->GetValueByName(szPropName, pValue); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h new file mode 100644 index 000000000000..dc18d9a0c619 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.h @@ -0,0 +1,114 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FPDFXFA_CPDFXFA_DOCENVIRONMENT_H_ +#define FPDFSDK_FPDFXFA_CPDFXFA_DOCENVIRONMENT_H_ + +#include "core/fxcrt/cfx_retain_ptr.h" +#include "public/fpdfview.h" +#include "xfa/fxfa/fxfa.h" + +class CPDFXFA_Context; +class IJS_EventContext; + +class CPDFXFA_DocEnvironment : public IXFA_DocEnvironment { + public: + explicit CPDFXFA_DocEnvironment(CPDFXFA_Context*); + ~CPDFXFA_DocEnvironment() override; + + // IXFA_DocEnvironment + void SetChangeMark(CXFA_FFDoc* hDoc) override; + // used in dynamic xfa, dwFlags refer to XFA_INVALIDATE_XXX macros. + void InvalidateRect(CXFA_FFPageView* pPageView, + const CFX_RectF& rt, + uint32_t dwFlags) override; + // show or hide caret + void DisplayCaret(CXFA_FFWidget* hWidget, + bool bVisible, + const CFX_RectF* pRtAnchor) override; + // dwPos: (0:bottom 1:top) + bool GetPopupPos(CXFA_FFWidget* hWidget, + FX_FLOAT fMinPopup, + FX_FLOAT fMaxPopup, + const CFX_RectF& rtAnchor, + CFX_RectF& rtPopup) override; + bool PopupMenu(CXFA_FFWidget* hWidget, CFX_PointF ptPopup) override; + + // dwFlags XFA_PAGEVIEWEVENT_Added, XFA_PAGEVIEWEVENT_Removing + void PageViewEvent(CXFA_FFPageView* pPageView, uint32_t dwFlags) override; + void WidgetPostAdd(CXFA_FFWidget* hWidget, + CXFA_WidgetAcc* pWidgetData) override; + void WidgetPreRemove(CXFA_FFWidget* hWidget, + CXFA_WidgetAcc* pWidgetData) override; + + // Host method + int32_t CountPages(CXFA_FFDoc* hDoc) override; + int32_t GetCurrentPage(CXFA_FFDoc* hDoc) override; + void SetCurrentPage(CXFA_FFDoc* hDoc, int32_t iCurPage) override; + bool IsCalculationsEnabled(CXFA_FFDoc* hDoc) override; + void SetCalculationsEnabled(CXFA_FFDoc* hDoc, bool bEnabled) override; + void GetTitle(CXFA_FFDoc* hDoc, CFX_WideString& wsTitle) override; + void SetTitle(CXFA_FFDoc* hDoc, const CFX_WideString& wsTitle) override; + void ExportData(CXFA_FFDoc* hDoc, + const CFX_WideString& wsFilePath, + bool bXDP) override; + void GotoURL(CXFA_FFDoc* hDoc, const CFX_WideString& bsURL) override; + bool IsValidationsEnabled(CXFA_FFDoc* hDoc) override; + void SetValidationsEnabled(CXFA_FFDoc* hDoc, bool bEnabled) override; + void SetFocusWidget(CXFA_FFDoc* hDoc, CXFA_FFWidget* hWidget) override; + void Print(CXFA_FFDoc* hDoc, + int32_t nStartPage, + int32_t nEndPage, + uint32_t dwOptions) override; + FX_ARGB GetHighlightColor(CXFA_FFDoc* hDoc) override; + + /** + *Submit data to email, http, ftp. + * @param[in] hDoc The document handler. + * @param[in] eFormat Determines the format in which the data will be + *submitted. XFA_ATTRIBUTEENUM_Xdp, XFA_ATTRIBUTEENUM_Xml... + * @param[in] wsTarget The URL to which the data will be submitted. + * @param[in] eEncoding The encoding of text content. + * @param[in] pXDPContent Controls what subset of the data is submitted, used + *only when the format property is xdp. + * @param[in] bEmbedPDF, specifies whether PDF is embedded in the submitted + *content or not. + */ + bool SubmitData(CXFA_FFDoc* hDoc, CXFA_Submit submit) override; + + bool GetGlobalProperty(CXFA_FFDoc* hDoc, + const CFX_ByteStringC& szPropName, + CFXJSE_Value* pValue) override; + bool SetGlobalProperty(CXFA_FFDoc* hDoc, + const CFX_ByteStringC& szPropName, + CFXJSE_Value* pValue) override; + + CFX_RetainPtr OpenLinkedFile( + CXFA_FFDoc* hDoc, + const CFX_WideString& wsLink) override; + + private: + bool OnBeforeNotifySubmit(); + void OnAfterNotifySubmit(); + bool NotifySubmit(bool bPrevOrPost); + bool SubmitDataInternal(CXFA_FFDoc* hDoc, CXFA_Submit submit); + bool MailToInfo(CFX_WideString& csURL, + CFX_WideString& csToAddress, + CFX_WideString& csCCAddress, + CFX_WideString& csBCCAddress, + CFX_WideString& csSubject, + CFX_WideString& csMsg); + bool ExportSubmitFile(FPDF_FILEHANDLER* ppFileHandler, + int fileType, + FPDF_DWORD encodeType, + FPDF_DWORD flag); + void ToXFAContentFlags(CFX_WideString csSrcContent, FPDF_DWORD& flag); + + CPDFXFA_Context* const m_pContext; // Not owned. + IJS_EventContext* m_pJSEventContext; // Not owned. +}; + +#endif // FPDFSDK_FPDFXFA_CPDFXFA_DOCENVIRONMENT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp new file mode 100644 index 000000000000..8b5bb3d2791c --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp @@ -0,0 +1,217 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" + +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#include "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h" +#include "fpdfsdk/fsdk_define.h" +#include "public/fpdf_formfill.h" +#include "third_party/base/ptr_util.h" +#include "xfa/fxfa/xfa_ffdocview.h" +#include "xfa/fxfa/xfa_ffpageview.h" + +CPDFXFA_Page::CPDFXFA_Page(CPDFXFA_Context* pContext, int page_index) + : m_pXFAPageView(nullptr), + m_pContext(pContext), + m_iPageIndex(page_index), + m_iRef(1) {} + +CPDFXFA_Page::~CPDFXFA_Page() { + if (m_pContext) + m_pContext->RemovePage(this); +} + +bool CPDFXFA_Page::LoadPDFPage() { + if (!m_pContext) + return false; + + CPDF_Document* pPDFDoc = m_pContext->GetPDFDoc(); + if (!pPDFDoc) + return false; + + CPDF_Dictionary* pDict = pPDFDoc->GetPage(m_iPageIndex); + if (!pDict) + return false; + + if (!m_pPDFPage || m_pPDFPage->m_pFormDict != pDict) { + m_pPDFPage = pdfium::MakeUnique(pPDFDoc, pDict, true); + m_pPDFPage->ParseContent(); + } + return true; +} + +bool CPDFXFA_Page::LoadXFAPageView() { + if (!m_pContext) + return false; + + CXFA_FFDoc* pXFADoc = m_pContext->GetXFADoc(); + if (!pXFADoc) + return false; + + CXFA_FFDocView* pXFADocView = m_pContext->GetXFADocView(); + if (!pXFADocView) + return false; + + CXFA_FFPageView* pPageView = pXFADocView->GetPageView(m_iPageIndex); + if (!pPageView) + return false; + + m_pXFAPageView = pPageView; + return true; +} + +bool CPDFXFA_Page::LoadPage() { + if (!m_pContext || m_iPageIndex < 0) + return false; + + int iDocType = m_pContext->GetDocType(); + switch (iDocType) { + case DOCTYPE_PDF: + case DOCTYPE_STATIC_XFA: { + return LoadPDFPage(); + } + case DOCTYPE_DYNAMIC_XFA: { + return LoadXFAPageView(); + } + default: + return false; + } +} + +bool CPDFXFA_Page::LoadPDFPage(CPDF_Dictionary* pageDict) { + if (!m_pContext || m_iPageIndex < 0 || !pageDict) + return false; + + m_pPDFPage = + pdfium::MakeUnique(m_pContext->GetPDFDoc(), pageDict, true); + m_pPDFPage->ParseContent(); + return true; +} + +FX_FLOAT CPDFXFA_Page::GetPageWidth() const { + if (!m_pPDFPage && !m_pXFAPageView) + return 0.0f; + + int nDocType = m_pContext->GetDocType(); + switch (nDocType) { + case DOCTYPE_DYNAMIC_XFA: { + if (m_pXFAPageView) + return m_pXFAPageView->GetPageViewRect().width; + break; + } + case DOCTYPE_STATIC_XFA: + case DOCTYPE_PDF: { + if (m_pPDFPage) + return m_pPDFPage->GetPageWidth(); + break; + } + default: + return 0.0f; + } + + return 0.0f; +} + +FX_FLOAT CPDFXFA_Page::GetPageHeight() const { + if (!m_pPDFPage && !m_pXFAPageView) + return 0.0f; + + int nDocType = m_pContext->GetDocType(); + switch (nDocType) { + case DOCTYPE_PDF: + case DOCTYPE_STATIC_XFA: { + if (m_pPDFPage) + return m_pPDFPage->GetPageHeight(); + break; + } + case DOCTYPE_DYNAMIC_XFA: { + if (m_pXFAPageView) + return m_pXFAPageView->GetPageViewRect().height; + break; + } + default: + return 0.0f; + } + + return 0.0f; +} + +void CPDFXFA_Page::DeviceToPage(int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int device_x, + int device_y, + double* page_x, + double* page_y) { + if (!m_pPDFPage && !m_pXFAPageView) + return; + + CFX_Matrix device2page; + device2page.SetReverse( + GetDisplayMatrix(start_x, start_y, size_x, size_y, rotate)); + + CFX_PointF pos = device2page.Transform(CFX_PointF( + static_cast(device_x), static_cast(device_y))); + + *page_x = pos.x; + *page_y = pos.y; +} + +void CPDFXFA_Page::PageToDevice(int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + double page_x, + double page_y, + int* device_x, + int* device_y) { + if (!m_pPDFPage && !m_pXFAPageView) + return; + + CFX_Matrix page2device = + GetDisplayMatrix(start_x, start_y, size_x, size_y, rotate); + + CFX_PointF pos = page2device.Transform( + CFX_PointF(static_cast(page_x), static_cast(page_y))); + + *device_x = FXSYS_round(pos.x); + *device_y = FXSYS_round(pos.y); +} + +CFX_Matrix CPDFXFA_Page::GetDisplayMatrix(int xPos, + int yPos, + int xSize, + int ySize, + int iRotate) const { + if (!m_pPDFPage && !m_pXFAPageView) + return CFX_Matrix(); + + int nDocType = m_pContext->GetDocType(); + switch (nDocType) { + case DOCTYPE_DYNAMIC_XFA: { + if (m_pXFAPageView) { + return m_pXFAPageView->GetDisplayMatrix( + CFX_Rect(xPos, yPos, xSize, ySize), iRotate); + } + break; + } + case DOCTYPE_PDF: + case DOCTYPE_STATIC_XFA: { + if (m_pPDFPage) + return m_pPDFPage->GetDisplayMatrix(xPos, yPos, xSize, ySize, iRotate); + break; + } + default: + return CFX_Matrix(); + } + return CFX_Matrix(); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_page.h b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_page.h new file mode 100644 index 000000000000..993885d59e92 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cpdfxfa_page.h @@ -0,0 +1,84 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FPDFXFA_CPDFXFA_PAGE_H_ +#define FPDFSDK_FPDFXFA_CPDFXFA_PAGE_H_ + +#include + +#include "core/fxcrt/fx_system.h" + +class CFX_Matrix; +class CPDFXFA_Context; +class CPDF_Dictionary; +class CPDF_Page; +class CXFA_FFPageView; + +class CPDFXFA_Page { + public: + CPDFXFA_Page(CPDFXFA_Context* pContext, int page_index); + + void Retain() { m_iRef++; } + void Release() { + if (--m_iRef <= 0) + delete this; + } + + bool LoadPage(); + bool LoadPDFPage(CPDF_Dictionary* pageDict); + CPDFXFA_Context* GetContext() const { return m_pContext; } + int GetPageIndex() const { return m_iPageIndex; } + CPDF_Page* GetPDFPage() const { return m_pPDFPage.get(); } + CXFA_FFPageView* GetXFAPageView() const { return m_pXFAPageView; } + + void SetXFAPageView(CXFA_FFPageView* pPageView) { + m_pXFAPageView = pPageView; + } + + FX_FLOAT GetPageWidth() const; + FX_FLOAT GetPageHeight() const; + + void DeviceToPage(int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int device_x, + int device_y, + double* page_x, + double* page_y); + void PageToDevice(int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + double page_x, + double page_y, + int* device_x, + int* device_y); + + CFX_Matrix GetDisplayMatrix(int xPos, + int yPos, + int xSize, + int ySize, + int iRotate) const; + + protected: + // Refcounted class. + ~CPDFXFA_Page(); + + bool LoadPDFPage(); + bool LoadXFAPageView(); + + private: + std::unique_ptr m_pPDFPage; + CXFA_FFPageView* m_pXFAPageView; + CPDFXFA_Context* const m_pContext; + const int m_iPageIndex; + int m_iRef; +}; + +#endif // FPDFSDK_FPDFXFA_CPDFXFA_PAGE_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.cpp b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.cpp new file mode 100644 index 000000000000..39aa72be8706 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.cpp @@ -0,0 +1,77 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h" + +#include +#include + +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/fsdk_define.h" + +namespace { + +class CFWL_FWLAdapterTimerInfo : public CFWL_TimerInfo { + public: + CFWL_FWLAdapterTimerInfo(IFWL_AdapterTimerMgr* mgr, + int32_t event, + CFWL_Timer* timer) + : CFWL_TimerInfo(mgr), idEvent(event), pTimer(timer) {} + + int32_t idEvent; + CFWL_Timer* pTimer; +}; + +} // namespace + +std::vector* CXFA_FWLAdapterTimerMgr::s_TimerArray = nullptr; + +void CXFA_FWLAdapterTimerMgr::Start(CFWL_Timer* pTimer, + uint32_t dwElapse, + bool bImmediately, + CFWL_TimerInfo** pTimerInfo) { + if (!m_pFormFillEnv) + return; + + int32_t id_event = m_pFormFillEnv->SetTimer(dwElapse, TimerProc); + if (!s_TimerArray) + s_TimerArray = new std::vector; + + *pTimerInfo = new CFWL_FWLAdapterTimerInfo(this, id_event, pTimer); + s_TimerArray->push_back(*pTimerInfo); +} + +void CXFA_FWLAdapterTimerMgr::Stop(CFWL_TimerInfo* pTimerInfo) { + if (!pTimerInfo || !m_pFormFillEnv) + return; + + CFWL_FWLAdapterTimerInfo* pInfo = + static_cast(pTimerInfo); + m_pFormFillEnv->KillTimer(pInfo->idEvent); + if (!s_TimerArray) + return; + + auto it = std::find(s_TimerArray->begin(), s_TimerArray->end(), pInfo); + if (it != s_TimerArray->end()) { + s_TimerArray->erase(it); + delete pInfo; + } +} + +// static +void CXFA_FWLAdapterTimerMgr::TimerProc(int32_t idEvent) { + if (!s_TimerArray) + return; + + for (const auto info : *s_TimerArray) { + CFWL_FWLAdapterTimerInfo* pInfo = + static_cast(info); + if (pInfo->idEvent == idEvent) { + pInfo->pTimer->Run(pInfo); + break; + } + } +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h new file mode 100644 index 000000000000..fdb5635ff0a6 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h @@ -0,0 +1,35 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FPDFXFA_CXFA_FWLADAPTERTIMERMGR_H_ +#define FPDFSDK_FPDFXFA_CXFA_FWLADAPTERTIMERMGR_H_ + +#include +#include + +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#include "xfa/fwl/cfwl_timerinfo.h" +#include "xfa/fwl/ifwl_adaptertimermgr.h" + +class CXFA_FWLAdapterTimerMgr : public IFWL_AdapterTimerMgr { + public: + explicit CXFA_FWLAdapterTimerMgr(CPDFSDK_FormFillEnvironment* pFormFillEnv) + : m_pFormFillEnv(pFormFillEnv) {} + + void Start(CFWL_Timer* pTimer, + uint32_t dwElapse, + bool bImmediately, + CFWL_TimerInfo** pTimerInfo) override; + void Stop(CFWL_TimerInfo* pTimerInfo) override; + + protected: + static void TimerProc(int32_t idEvent); + + static std::vector* s_TimerArray; + CPDFSDK_FormFillEnvironment* const m_pFormFillEnv; +}; + +#endif // FPDFSDK_FPDFXFA_CXFA_FWLADAPTERTIMERMGR_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/fsdk_actionhandler.cpp b/modules/pdfium/pdfium/fpdfsdk/fsdk_actionhandler.cpp new file mode 100644 index 000000000000..dc99f32f3437 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fsdk_actionhandler.cpp @@ -0,0 +1,623 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/fsdk_actionhandler.h" + +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfdoc/cpdf_formfield.h" +#include "core/fpdfdoc/cpdf_interform.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "fpdfsdk/fsdk_define.h" +#include "fpdfsdk/javascript/ijs_event_context.h" +#include "fpdfsdk/javascript/ijs_runtime.h" +#include "third_party/base/stl_util.h" + +bool CPDFSDK_ActionHandler::DoAction_DocOpen( + const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + std::set visited; + return ExecuteDocumentOpenAction(action, pFormFillEnv, &visited); +} + +bool CPDFSDK_ActionHandler::DoAction_JavaScript( + const CPDF_Action& JsAction, + CFX_WideString csJSName, + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + if (JsAction.GetType() == CPDF_Action::JavaScript) { + CFX_WideString swJS = JsAction.GetJavaScript(); + if (!swJS.IsEmpty()) { + RunDocumentOpenJavaScript(pFormFillEnv, csJSName, swJS); + return true; + } + } + + return false; +} + +bool CPDFSDK_ActionHandler::DoAction_FieldJavaScript( + const CPDF_Action& JsAction, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormField* pFormField, + PDFSDK_FieldAction& data) { + ASSERT(pFormFillEnv); + if (pFormFillEnv->IsJSInitiated() && + JsAction.GetType() == CPDF_Action::JavaScript) { + CFX_WideString swJS = JsAction.GetJavaScript(); + if (!swJS.IsEmpty()) { + RunFieldJavaScript(pFormFillEnv, pFormField, type, data, swJS); + return true; + } + } + return false; +} + +bool CPDFSDK_ActionHandler::DoAction_Page( + const CPDF_Action& action, + enum CPDF_AAction::AActionType eType, + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + std::set visited; + return ExecuteDocumentPageAction(action, eType, pFormFillEnv, &visited); +} + +bool CPDFSDK_ActionHandler::DoAction_Document( + const CPDF_Action& action, + enum CPDF_AAction::AActionType eType, + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + std::set visited; + return ExecuteDocumentPageAction(action, eType, pFormFillEnv, &visited); +} + +bool CPDFSDK_ActionHandler::DoAction_BookMark( + CPDF_Bookmark* pBookMark, + const CPDF_Action& action, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + std::set visited; + return ExecuteBookMark(action, pFormFillEnv, pBookMark, &visited); +} + +bool CPDFSDK_ActionHandler::DoAction_Screen( + const CPDF_Action& action, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDFSDK_Annot* pScreen) { + std::set visited; + return ExecuteScreenAction(action, type, pFormFillEnv, pScreen, &visited); +} + +bool CPDFSDK_ActionHandler::DoAction_Link( + const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + std::set visited; + return ExecuteLinkAction(action, pFormFillEnv, &visited); +} + +bool CPDFSDK_ActionHandler::DoAction_Field( + const CPDF_Action& action, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormField* pFormField, + PDFSDK_FieldAction& data) { + std::set visited; + return ExecuteFieldAction(action, type, pFormFillEnv, pFormField, data, + &visited); +} + +bool CPDFSDK_ActionHandler::ExecuteDocumentOpenAction( + const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + std::set* visited) { + CPDF_Dictionary* pDict = action.GetDict(); + if (pdfium::ContainsKey(*visited, pDict)) + return false; + + visited->insert(pDict); + + ASSERT(pFormFillEnv); + if (action.GetType() == CPDF_Action::JavaScript) { + if (pFormFillEnv->IsJSInitiated()) { + CFX_WideString swJS = action.GetJavaScript(); + if (!swJS.IsEmpty()) { + RunDocumentOpenJavaScript(pFormFillEnv, L"", swJS); + } + } + } else { + DoAction_NoJs(action, pFormFillEnv); + } + + for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) { + CPDF_Action subaction = action.GetSubAction(i); + if (!ExecuteDocumentOpenAction(subaction, pFormFillEnv, visited)) + return false; + } + + return true; +} + +bool CPDFSDK_ActionHandler::ExecuteLinkAction( + const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + std::set* visited) { + CPDF_Dictionary* pDict = action.GetDict(); + if (pdfium::ContainsKey(*visited, pDict)) + return false; + + visited->insert(pDict); + + ASSERT(pFormFillEnv); + if (action.GetType() == CPDF_Action::JavaScript) { + if (pFormFillEnv->IsJSInitiated()) { + CFX_WideString swJS = action.GetJavaScript(); + if (!swJS.IsEmpty()) { + IJS_Runtime* pRuntime = pFormFillEnv->GetJSRuntime(); + IJS_EventContext* pContext = pRuntime->NewEventContext(); + pContext->OnLink_MouseUp(pFormFillEnv); + + CFX_WideString csInfo; + bool bRet = pContext->RunScript(swJS, &csInfo); + pRuntime->ReleaseEventContext(pContext); + if (!bRet) { + // FIXME: return error. + } + } + } + } else { + DoAction_NoJs(action, pFormFillEnv); + } + + for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) { + CPDF_Action subaction = action.GetSubAction(i); + if (!ExecuteLinkAction(subaction, pFormFillEnv, visited)) + return false; + } + + return true; +} + +bool CPDFSDK_ActionHandler::ExecuteDocumentPageAction( + const CPDF_Action& action, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + std::set* visited) { + CPDF_Dictionary* pDict = action.GetDict(); + if (pdfium::ContainsKey(*visited, pDict)) + return false; + + visited->insert(pDict); + + ASSERT(pFormFillEnv); + if (action.GetType() == CPDF_Action::JavaScript) { + if (pFormFillEnv->IsJSInitiated()) { + CFX_WideString swJS = action.GetJavaScript(); + if (!swJS.IsEmpty()) { + RunDocumentPageJavaScript(pFormFillEnv, type, swJS); + } + } + } else { + DoAction_NoJs(action, pFormFillEnv); + } + + if (!IsValidDocView(pFormFillEnv)) + return false; + + for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) { + CPDF_Action subaction = action.GetSubAction(i); + if (!ExecuteDocumentPageAction(subaction, type, pFormFillEnv, visited)) + return false; + } + + return true; +} + +bool CPDFSDK_ActionHandler::IsValidField( + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_Dictionary* pFieldDict) { + ASSERT(pFieldDict); + + CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm(); + CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm(); + return !!pPDFInterForm->GetFieldByDict(pFieldDict); +} + +bool CPDFSDK_ActionHandler::ExecuteFieldAction( + const CPDF_Action& action, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormField* pFormField, + PDFSDK_FieldAction& data, + std::set* visited) { + CPDF_Dictionary* pDict = action.GetDict(); + if (pdfium::ContainsKey(*visited, pDict)) + return false; + + visited->insert(pDict); + + ASSERT(pFormFillEnv); + if (action.GetType() == CPDF_Action::JavaScript) { + if (pFormFillEnv->IsJSInitiated()) { + CFX_WideString swJS = action.GetJavaScript(); + if (!swJS.IsEmpty()) { + RunFieldJavaScript(pFormFillEnv, pFormField, type, data, swJS); + if (!IsValidField(pFormFillEnv, pFormField->GetFieldDict())) + return false; + } + } + } else { + DoAction_NoJs(action, pFormFillEnv); + } + + for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) { + CPDF_Action subaction = action.GetSubAction(i); + if (!ExecuteFieldAction(subaction, type, pFormFillEnv, pFormField, data, + visited)) + return false; + } + + return true; +} + +bool CPDFSDK_ActionHandler::ExecuteScreenAction( + const CPDF_Action& action, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDFSDK_Annot* pScreen, + std::set* visited) { + CPDF_Dictionary* pDict = action.GetDict(); + if (pdfium::ContainsKey(*visited, pDict)) + return false; + + visited->insert(pDict); + + ASSERT(pFormFillEnv); + if (action.GetType() == CPDF_Action::JavaScript) { + if (pFormFillEnv->IsJSInitiated()) { + CFX_WideString swJS = action.GetJavaScript(); + if (!swJS.IsEmpty()) { + IJS_Runtime* pRuntime = pFormFillEnv->GetJSRuntime(); + IJS_EventContext* pContext = pRuntime->NewEventContext(); + CFX_WideString csInfo; + bool bRet = pContext->RunScript(swJS, &csInfo); + pRuntime->ReleaseEventContext(pContext); + if (!bRet) { + // FIXME: return error. + } + } + } + } else { + DoAction_NoJs(action, pFormFillEnv); + } + + for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) { + CPDF_Action subaction = action.GetSubAction(i); + if (!ExecuteScreenAction(subaction, type, pFormFillEnv, pScreen, visited)) + return false; + } + + return true; +} + +bool CPDFSDK_ActionHandler::ExecuteBookMark( + const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_Bookmark* pBookmark, + std::set* visited) { + CPDF_Dictionary* pDict = action.GetDict(); + if (pdfium::ContainsKey(*visited, pDict)) + return false; + + visited->insert(pDict); + + ASSERT(pFormFillEnv); + if (action.GetType() == CPDF_Action::JavaScript) { + if (pFormFillEnv->IsJSInitiated()) { + CFX_WideString swJS = action.GetJavaScript(); + if (!swJS.IsEmpty()) { + IJS_Runtime* pRuntime = pFormFillEnv->GetJSRuntime(); + IJS_EventContext* pContext = pRuntime->NewEventContext(); + pContext->OnBookmark_MouseUp(pBookmark); + + CFX_WideString csInfo; + bool bRet = pContext->RunScript(swJS, &csInfo); + pRuntime->ReleaseEventContext(pContext); + if (!bRet) { + // FIXME: return error. + } + } + } + } else { + DoAction_NoJs(action, pFormFillEnv); + } + + for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) { + CPDF_Action subaction = action.GetSubAction(i); + if (!ExecuteBookMark(subaction, pFormFillEnv, pBookmark, visited)) + return false; + } + + return true; +} + +void CPDFSDK_ActionHandler::DoAction_NoJs( + const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + ASSERT(pFormFillEnv); + + switch (action.GetType()) { + case CPDF_Action::GoTo: + DoAction_GoTo(pFormFillEnv, action); + break; + case CPDF_Action::GoToR: + DoAction_GoToR(pFormFillEnv, action); + break; + case CPDF_Action::GoToE: + break; + case CPDF_Action::Launch: + DoAction_Launch(pFormFillEnv, action); + break; + case CPDF_Action::Thread: + break; + case CPDF_Action::URI: + DoAction_URI(pFormFillEnv, action); + break; + case CPDF_Action::Sound: + break; + case CPDF_Action::Movie: + break; + case CPDF_Action::Hide: + DoAction_Hide(action, pFormFillEnv); + break; + case CPDF_Action::Named: + DoAction_Named(pFormFillEnv, action); + break; + case CPDF_Action::SubmitForm: + DoAction_SubmitForm(action, pFormFillEnv); + break; + case CPDF_Action::ResetForm: + DoAction_ResetForm(action, pFormFillEnv); + break; + case CPDF_Action::ImportData: + DoAction_ImportData(action, pFormFillEnv); + break; + case CPDF_Action::JavaScript: + ASSERT(false); + break; + case CPDF_Action::SetOCGState: + DoAction_SetOCGState(pFormFillEnv, action); + break; + case CPDF_Action::Rendition: + break; + case CPDF_Action::Trans: + break; + case CPDF_Action::GoTo3DView: + break; + default: + break; + } +} + +bool CPDFSDK_ActionHandler::IsValidDocView( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + ASSERT(pFormFillEnv); + return true; +} + +void CPDFSDK_ActionHandler::DoAction_GoTo( + CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CPDF_Action& action) { + ASSERT(action.GetDict()); + + CPDF_Document* pPDFDocument = pFormFillEnv->GetPDFDocument(); + ASSERT(pPDFDocument); + + CPDF_Dest MyDest = action.GetDest(pPDFDocument); + int nPageIndex = MyDest.GetPageIndex(pPDFDocument); + int nFitType = MyDest.GetZoomMode(); + const CPDF_Array* pMyArray = ToArray(MyDest.GetObject()); + float* pPosAry = nullptr; + int sizeOfAry = 0; + if (pMyArray) { + pPosAry = new float[pMyArray->GetCount()]; + int j = 0; + for (size_t i = 2; i < pMyArray->GetCount(); i++) { + pPosAry[j++] = pMyArray->GetFloatAt(i); + } + sizeOfAry = j; + } + + pFormFillEnv->DoGoToAction(nPageIndex, nFitType, pPosAry, sizeOfAry); + delete[] pPosAry; +} + +void CPDFSDK_ActionHandler::DoAction_GoToR( + CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CPDF_Action& action) {} + +void CPDFSDK_ActionHandler::DoAction_Launch( + CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CPDF_Action& action) {} + +void CPDFSDK_ActionHandler::DoAction_URI( + CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CPDF_Action& action) { + ASSERT(action.GetDict()); + + CFX_ByteString sURI = action.GetURI(pFormFillEnv->GetPDFDocument()); + pFormFillEnv->DoURIAction(sURI.c_str()); +} + +void CPDFSDK_ActionHandler::DoAction_Named( + CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CPDF_Action& action) { + ASSERT(action.GetDict()); + + CFX_ByteString csName = action.GetNamedAction(); + pFormFillEnv->ExecuteNamedAction(csName.c_str()); +} + +void CPDFSDK_ActionHandler::DoAction_SetOCGState( + CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CPDF_Action& action) {} + +void CPDFSDK_ActionHandler::RunFieldJavaScript( + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormField* pFormField, + CPDF_AAction::AActionType type, + PDFSDK_FieldAction& data, + const CFX_WideString& script) { + ASSERT(type != CPDF_AAction::Calculate); + ASSERT(type != CPDF_AAction::Format); + + IJS_Runtime* pRuntime = pFormFillEnv->GetJSRuntime(); + IJS_EventContext* pContext = pRuntime->NewEventContext(); + switch (type) { + case CPDF_AAction::CursorEnter: + pContext->OnField_MouseEnter(data.bModifier, data.bShift, pFormField); + break; + case CPDF_AAction::CursorExit: + pContext->OnField_MouseExit(data.bModifier, data.bShift, pFormField); + break; + case CPDF_AAction::ButtonDown: + pContext->OnField_MouseDown(data.bModifier, data.bShift, pFormField); + break; + case CPDF_AAction::ButtonUp: + pContext->OnField_MouseUp(data.bModifier, data.bShift, pFormField); + break; + case CPDF_AAction::GetFocus: + pContext->OnField_Focus(data.bModifier, data.bShift, pFormField, + data.sValue); + break; + case CPDF_AAction::LoseFocus: + pContext->OnField_Blur(data.bModifier, data.bShift, pFormField, + data.sValue); + break; + case CPDF_AAction::KeyStroke: + pContext->OnField_Keystroke(data.sChange, data.sChangeEx, data.bKeyDown, + data.bModifier, data.nSelEnd, data.nSelStart, + data.bShift, pFormField, data.sValue, + data.bWillCommit, data.bFieldFull, data.bRC); + break; + case CPDF_AAction::Validate: + pContext->OnField_Validate(data.sChange, data.sChangeEx, data.bKeyDown, + data.bModifier, data.bShift, pFormField, + data.sValue, data.bRC); + break; + default: + ASSERT(false); + break; + } + + CFX_WideString csInfo; + bool bRet = pContext->RunScript(script, &csInfo); + pRuntime->ReleaseEventContext(pContext); + if (!bRet) { + // FIXME: return error. + } +} + +void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript( + CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& sScriptName, + const CFX_WideString& script) { + IJS_Runtime* pRuntime = pFormFillEnv->GetJSRuntime(); + IJS_EventContext* pContext = pRuntime->NewEventContext(); + pContext->OnDoc_Open(pFormFillEnv, sScriptName); + + CFX_WideString csInfo; + bool bRet = pContext->RunScript(script, &csInfo); + pRuntime->ReleaseEventContext(pContext); + if (!bRet) { + // FIXME: return error. + } +} + +void CPDFSDK_ActionHandler::RunDocumentPageJavaScript( + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_AAction::AActionType type, + const CFX_WideString& script) { + IJS_Runtime* pRuntime = pFormFillEnv->GetJSRuntime(); + IJS_EventContext* pContext = pRuntime->NewEventContext(); + switch (type) { + case CPDF_AAction::OpenPage: + pContext->OnPage_Open(pFormFillEnv); + break; + case CPDF_AAction::ClosePage: + pContext->OnPage_Close(pFormFillEnv); + break; + case CPDF_AAction::CloseDocument: + pContext->OnDoc_WillClose(pFormFillEnv); + break; + case CPDF_AAction::SaveDocument: + pContext->OnDoc_WillSave(pFormFillEnv); + break; + case CPDF_AAction::DocumentSaved: + pContext->OnDoc_DidSave(pFormFillEnv); + break; + case CPDF_AAction::PrintDocument: + pContext->OnDoc_WillPrint(pFormFillEnv); + break; + case CPDF_AAction::DocumentPrinted: + pContext->OnDoc_DidPrint(pFormFillEnv); + break; + case CPDF_AAction::PageVisible: + pContext->OnPage_InView(pFormFillEnv); + break; + case CPDF_AAction::PageInvisible: + pContext->OnPage_OutView(pFormFillEnv); + break; + default: + ASSERT(false); + break; + } + + CFX_WideString csInfo; + bool bRet = pContext->RunScript(script, &csInfo); + pRuntime->ReleaseEventContext(pContext); + if (!bRet) { + // FIXME: return error. + } +} + +bool CPDFSDK_ActionHandler::DoAction_Hide( + const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm(); + if (pInterForm->DoAction_Hide(action)) { + pFormFillEnv->SetChangeMark(); + return true; + } + + return false; +} + +bool CPDFSDK_ActionHandler::DoAction_SubmitForm( + const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm(); + return pInterForm->DoAction_SubmitForm(action); +} + +bool CPDFSDK_ActionHandler::DoAction_ResetForm( + const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm(); + return pInterForm->DoAction_ResetForm(action); +} + +bool CPDFSDK_ActionHandler::DoAction_ImportData( + const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm(); + if (pInterForm->DoAction_ImportData(action)) { + pFormFillEnv->SetChangeMark(); + return true; + } + + return false; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fsdk_actionhandler.h b/modules/pdfium/pdfium/fpdfsdk/fsdk_actionhandler.h new file mode 100644 index 000000000000..1c8dedefd70f --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fsdk_actionhandler.h @@ -0,0 +1,126 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FSDK_ACTIONHANDLER_H_ +#define FPDFSDK_FSDK_ACTIONHANDLER_H_ + +#include +#include + +#include "core/fpdfdoc/cpdf_aaction.h" +#include "core/fpdfdoc/cpdf_action.h" +#include "core/fxcrt/fx_string.h" +#include "fpdfsdk/pdfsdk_fieldaction.h" + +class CPDFSDK_Annot; +class CPDFSDK_FormFillEnvironment; +class CPDF_Bookmark; +class CPDF_Dictionary; +class CPDF_FormField; + +class CPDFSDK_ActionHandler { + public: + bool DoAction_DocOpen(const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv); + bool DoAction_JavaScript(const CPDF_Action& JsAction, + CFX_WideString csJSName, + CPDFSDK_FormFillEnvironment* pFormFillEnv); + bool DoAction_Page(const CPDF_Action& action, + enum CPDF_AAction::AActionType eType, + CPDFSDK_FormFillEnvironment* pFormFillEnv); + bool DoAction_Document(const CPDF_Action& action, + enum CPDF_AAction::AActionType eType, + CPDFSDK_FormFillEnvironment* pFormFillEnv); + bool DoAction_BookMark(CPDF_Bookmark* pBookMark, + const CPDF_Action& action, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv); + bool DoAction_Screen(const CPDF_Action& action, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDFSDK_Annot* pScreen); + bool DoAction_Link(const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv); + bool DoAction_Field(const CPDF_Action& action, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormField* pFormField, + PDFSDK_FieldAction& data); + bool DoAction_FieldJavaScript(const CPDF_Action& JsAction, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormField* pFormField, + PDFSDK_FieldAction& data); + + private: + bool ExecuteDocumentOpenAction(const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + std::set* visited); + bool ExecuteDocumentPageAction(const CPDF_Action& action, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + std::set* visited); + bool ExecuteFieldAction(const CPDF_Action& action, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormField* pFormField, + PDFSDK_FieldAction& data, + std::set* visited); + bool ExecuteScreenAction(const CPDF_Action& action, + CPDF_AAction::AActionType type, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDFSDK_Annot* pScreen, + std::set* visited); + bool ExecuteBookMark(const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_Bookmark* pBookmark, + std::set* visited); + bool ExecuteLinkAction(const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + std::set* visited); + + void DoAction_NoJs(const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv); + void RunDocumentPageJavaScript(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_AAction::AActionType type, + const CFX_WideString& script); + void RunDocumentOpenJavaScript(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& sScriptName, + const CFX_WideString& script); + void RunFieldJavaScript(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormField* pFormField, + CPDF_AAction::AActionType type, + PDFSDK_FieldAction& data, + const CFX_WideString& script); + + bool IsValidField(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_Dictionary* pFieldDict); + bool IsValidDocView(CPDFSDK_FormFillEnvironment* pFormFillEnv); + + void DoAction_GoTo(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CPDF_Action& action); + void DoAction_GoToR(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CPDF_Action& action); + void DoAction_Launch(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CPDF_Action& action); + void DoAction_URI(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CPDF_Action& action); + void DoAction_Named(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CPDF_Action& action); + void DoAction_SetOCGState(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CPDF_Action& action); + + bool DoAction_Hide(const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv); + bool DoAction_SubmitForm(const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv); + bool DoAction_ResetForm(const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv); + bool DoAction_ImportData(const CPDF_Action& action, + CPDFSDK_FormFillEnvironment* pFormFillEnv); +}; + +#endif // FPDFSDK_FSDK_ACTIONHANDLER_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/fsdk_baseform_embeddertest.cpp b/modules/pdfium/pdfium/fpdfsdk/fsdk_baseform_embeddertest.cpp new file mode 100644 index 000000000000..13efe86789d8 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fsdk_baseform_embeddertest.cpp @@ -0,0 +1,126 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "fpdfsdk/cba_annotiterator.h" +#include "fpdfsdk/cpdfsdk_annot.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/fsdk_define.h" +#include "testing/embedder_test.h" +#include "testing/embedder_test_mock_delegate.h" +#include "testing/embedder_test_timer_handling_delegate.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +void CheckRect(const CFX_FloatRect& actual, const CFX_FloatRect& expected) { + EXPECT_EQ(expected.left, actual.left); + EXPECT_EQ(expected.bottom, actual.bottom); + EXPECT_EQ(expected.right, actual.right); + EXPECT_EQ(expected.top, actual.top); +} + +} // namespace + +class FSDKBaseFormEmbeddertest : public EmbedderTest {}; + +TEST_F(FSDKBaseFormEmbeddertest, CBA_AnnotIterator) { + EXPECT_TRUE(OpenDocument("annotiter.pdf")); + FPDF_PAGE page0 = LoadPage(0); + FPDF_PAGE page1 = LoadPage(1); + FPDF_PAGE page2 = LoadPage(2); + EXPECT_TRUE(page0); + EXPECT_TRUE(page1); + EXPECT_TRUE(page2); + + CFX_FloatRect LeftBottom(200, 200, 220, 220); + CFX_FloatRect RightBottom(400, 201, 420, 221); + CFX_FloatRect LeftTop(201, 400, 221, 420); + CFX_FloatRect RightTop(401, 401, 421, 421); + + CPDFSDK_FormFillEnvironment* pFormFillEnv = + static_cast(form_handle()); + + { + // Page 0 specifies "row order". + CBA_AnnotIterator iter(pFormFillEnv->GetPageView(0), + CPDF_Annot::Subtype::WIDGET); + CPDFSDK_Annot* pAnnot = iter.GetFirstAnnot(); + CheckRect(pAnnot->GetRect(), RightTop); + pAnnot = iter.GetNextAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), LeftTop); + pAnnot = iter.GetNextAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), RightBottom); + pAnnot = iter.GetNextAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), LeftBottom); + pAnnot = iter.GetNextAnnot(pAnnot); + EXPECT_EQ(iter.GetFirstAnnot(), pAnnot); + + pAnnot = iter.GetLastAnnot(); + CheckRect(pAnnot->GetRect(), LeftBottom); + pAnnot = iter.GetPrevAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), RightBottom); + pAnnot = iter.GetPrevAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), LeftTop); + pAnnot = iter.GetPrevAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), RightTop); + pAnnot = iter.GetPrevAnnot(pAnnot); + EXPECT_EQ(iter.GetLastAnnot(), pAnnot); + } + { + // Page 1 specifies "column order" + CBA_AnnotIterator iter(pFormFillEnv->GetPageView(1), + CPDF_Annot::Subtype::WIDGET); + CPDFSDK_Annot* pAnnot = iter.GetFirstAnnot(); + CheckRect(pAnnot->GetRect(), RightTop); + pAnnot = iter.GetNextAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), RightBottom); + pAnnot = iter.GetNextAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), LeftTop); + pAnnot = iter.GetNextAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), LeftBottom); + pAnnot = iter.GetNextAnnot(pAnnot); + EXPECT_EQ(iter.GetFirstAnnot(), pAnnot); + + pAnnot = iter.GetLastAnnot(); + CheckRect(pAnnot->GetRect(), LeftBottom); + pAnnot = iter.GetPrevAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), LeftTop); + pAnnot = iter.GetPrevAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), RightBottom); + pAnnot = iter.GetPrevAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), RightTop); + pAnnot = iter.GetPrevAnnot(pAnnot); + EXPECT_EQ(iter.GetLastAnnot(), pAnnot); + } + { + // Page 2 specifies "struct order" + CBA_AnnotIterator iter(pFormFillEnv->GetPageView(2), + CPDF_Annot::Subtype::WIDGET); + CPDFSDK_Annot* pAnnot = iter.GetFirstAnnot(); + CheckRect(pAnnot->GetRect(), LeftBottom); + pAnnot = iter.GetNextAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), RightTop); + pAnnot = iter.GetNextAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), LeftTop); + pAnnot = iter.GetNextAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), RightBottom); + pAnnot = iter.GetNextAnnot(pAnnot); + EXPECT_EQ(iter.GetFirstAnnot(), pAnnot); + + pAnnot = iter.GetLastAnnot(); + CheckRect(pAnnot->GetRect(), RightBottom); + pAnnot = iter.GetPrevAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), LeftTop); + pAnnot = iter.GetPrevAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), RightTop); + pAnnot = iter.GetPrevAnnot(pAnnot); + CheckRect(pAnnot->GetRect(), LeftBottom); + pAnnot = iter.GetPrevAnnot(pAnnot); + EXPECT_EQ(iter.GetLastAnnot(), pAnnot); + } + UnloadPage(page2); + UnloadPage(page1); + UnloadPage(page0); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fsdk_common.h b/modules/pdfium/pdfium/fpdfsdk/fsdk_common.h new file mode 100644 index 000000000000..d8030261c71f --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fsdk_common.h @@ -0,0 +1,34 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FSDK_COMMON_H_ +#define FPDFSDK_FSDK_COMMON_H_ + +// for all fields +#define FIELDFLAG_READONLY 1 +#define FIELDFLAG_REQUIRED 2 +#define FIELDFLAG_NOEXPORT 4 +// for text fields +#define FIELDFLAG_MULTILINE (1 << 12) +#define FIELDFLAG_PASSWORD (1 << 13) +#define FIELDFLAG_FILESELECT (1 << 20) +#define FIELDFLAG_DONOTSPELLCHECK (1 << 22) +#define FIELDFLAG_DONOTSCROLL (1 << 23) +#define FIELDFLAG_COMB (1 << 24) +#define FIELDFLAG_RICHTEXT (1 << 25) +// for button fileds +#define FIELDFLAG_NOTOGGLETOOFF (1 << 14) +#define FIELDFLAG_RADIO (1 << 15) +#define FIELDFLAG_PUSHBUTTON (1 << 16) +#define FIELDFLAG_RADIOSINUNISON (1 << 27) +// for choice fields +#define FIELDFLAG_COMBO (1 << 17) +#define FIELDFLAG_EDIT (1 << 18) +#define FIELDFLAG_SORT (1 << 19) +#define FIELDFLAG_MULTISELECT (1 << 21) +#define FIELDFLAG_COMMITONSELCHANGE (1 << 26) + +#endif // FPDFSDK_FSDK_COMMON_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/fsdk_define.h b/modules/pdfium/pdfium/fpdfsdk/fsdk_define.h new file mode 100644 index 000000000000..9a115966dbb7 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fsdk_define.h @@ -0,0 +1,82 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FSDK_DEFINE_H_ +#define FPDFSDK_FSDK_DEFINE_H_ + +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fxge/fx_dib.h" +#include "public/fpdfview.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h" +#endif // PDF_ENABLE_XFA + +#ifdef _WIN32 +#include +#include +#endif + +class CPDF_Annot; +class CPDF_Page; +class CPDF_PageRenderContext; +class IFSDK_PAUSE_Adapter; + +// Layering prevents fxcrt from knowing about FPDF_FILEACCESS, so this can't +// be a static method of IFX_SeekableReadStream. +CFX_RetainPtr MakeSeekableReadStream( + FPDF_FILEACCESS* pFileAccess); + +#ifdef PDF_ENABLE_XFA +// Layering prevents fxcrt from knowing about FPDF_FILEHANDLER, so this can't +// be a static method of IFX_SeekableStream. +CFX_RetainPtr MakeSeekableStream( + FPDF_FILEHANDLER* pFileHandler); +#endif // PDF_ENABLE_XFA + +// Object types for public FPDF_ types; these correspond to next layer down +// from fpdfsdk. For master, these are CPDF_ types, but for XFA, these are +// CPDFXFA_ types. +#ifndef PDF_ENABLE_XFA +using UnderlyingDocumentType = CPDF_Document; +using UnderlyingPageType = CPDF_Page; +#else // PDF_ENABLE_XFA +using UnderlyingDocumentType = CPDFXFA_Context; +using UnderlyingPageType = CPDFXFA_Page; +#endif // PDF_ENABLE_XFA + +// Conversions to/from underlying types. +UnderlyingDocumentType* UnderlyingFromFPDFDocument(FPDF_DOCUMENT doc); +FPDF_DOCUMENT FPDFDocumentFromUnderlying(UnderlyingDocumentType* doc); + +UnderlyingPageType* UnderlyingFromFPDFPage(FPDF_PAGE page); + +// Conversions to/from FPDF_ types. +CPDF_Document* CPDFDocumentFromFPDFDocument(FPDF_DOCUMENT doc); +FPDF_DOCUMENT FPDFDocumentFromCPDFDocument(CPDF_Document* doc); + +CPDF_Page* CPDFPageFromFPDFPage(FPDF_PAGE page); + +CFX_DIBitmap* CFXBitmapFromFPDFBitmap(FPDF_BITMAP bitmap); + +void FSDK_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable); +FPDF_BOOL FSDK_IsSandBoxPolicyEnabled(FPDF_DWORD policy); +void FPDF_RenderPage_Retail(CPDF_PageRenderContext* pContext, + FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int flags, + bool bNeedToRestore, + IFSDK_PAUSE_Adapter* pause); + +void CheckUnSupportError(CPDF_Document* pDoc, uint32_t err_code); +void CheckUnSupportAnnot(CPDF_Document* pDoc, const CPDF_Annot* pPDFAnnot); +void ProcessParseError(CPDF_Parser::Error err); + +#endif // FPDFSDK_FSDK_DEFINE_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/fsdk_pauseadapter.cpp b/modules/pdfium/pdfium/fpdfsdk/fsdk_pauseadapter.cpp new file mode 100644 index 000000000000..237266b88bec --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fsdk_pauseadapter.cpp @@ -0,0 +1,16 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/fsdk_pauseadapter.h" + +IFSDK_PAUSE_Adapter::IFSDK_PAUSE_Adapter(IFSDK_PAUSE* IPause) + : m_IPause(IPause) {} + +IFSDK_PAUSE_Adapter::~IFSDK_PAUSE_Adapter() {} + +bool IFSDK_PAUSE_Adapter::NeedToPauseNow() { + return m_IPause->NeedToPauseNow && m_IPause->NeedToPauseNow(m_IPause); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fsdk_pauseadapter.h b/modules/pdfium/pdfium/fpdfsdk/fsdk_pauseadapter.h new file mode 100644 index 000000000000..bd302f261365 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fsdk_pauseadapter.h @@ -0,0 +1,25 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FSDK_PAUSEADAPTER_H_ +#define FPDFSDK_FSDK_PAUSEADAPTER_H_ + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_system.h" +#include "public/fpdf_progressive.h" + +class IFSDK_PAUSE_Adapter : public IFX_Pause { + public: + explicit IFSDK_PAUSE_Adapter(IFSDK_PAUSE* IPause); + ~IFSDK_PAUSE_Adapter() override; + + bool NeedToPauseNow() override; + + private: + IFSDK_PAUSE* const m_IPause; +}; + +#endif // FPDFSDK_FSDK_PAUSEADAPTER_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/fxedit/fx_edit.h b/modules/pdfium/pdfium/fpdfsdk/fxedit/fx_edit.h new file mode 100644 index 000000000000..6c9166709c90 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fxedit/fx_edit.h @@ -0,0 +1,23 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FXEDIT_FX_EDIT_H_ +#define FPDFSDK_FXEDIT_FX_EDIT_H_ + +#include "core/fxcrt/fx_basic.h" + +class IPVT_FontMap; + +#define FX_EDIT_ISLATINWORD(u) \ + (u == 0x2D || (u <= 0x005A && u >= 0x0041) || \ + (u <= 0x007A && u >= 0x0061) || (u <= 0x02AF && u >= 0x00C0)) + +CFX_ByteString GetPDFWordString(IPVT_FontMap* pFontMap, + int32_t nFontIndex, + uint16_t Word, + uint16_t SubWord); + +#endif // FPDFSDK_FXEDIT_FX_EDIT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_ap.cpp b/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_ap.cpp new file mode 100644 index 000000000000..448a539581c2 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_ap.cpp @@ -0,0 +1,38 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfdoc/cpvt_word.h" +#include "core/fpdfdoc/ipvt_fontmap.h" +#include "fpdfsdk/fxedit/fx_edit.h" +#include "fpdfsdk/fxedit/fxet_edit.h" + +CFX_ByteString GetPDFWordString(IPVT_FontMap* pFontMap, + int32_t nFontIndex, + uint16_t Word, + uint16_t SubWord) { + CPDF_Font* pPDFFont = pFontMap->GetPDFFont(nFontIndex); + if (!pPDFFont) + return CFX_ByteString(); + + CFX_ByteString sWord; + if (SubWord > 0) { + Word = SubWord; + } else { + uint32_t dwCharCode = pPDFFont->IsUnicodeCompatible() + ? pPDFFont->CharCodeFromUnicode(Word) + : pFontMap->CharCodeFromUnicode(nFontIndex, Word); + + if (dwCharCode > 0) { + pPDFFont->AppendChar(sWord, dwCharCode); + return sWord; + } + } + + pPDFFont->AppendChar(sWord, Word); + return sWord; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_edit.cpp b/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_edit.cpp new file mode 100644 index 000000000000..1acc57795a06 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_edit.cpp @@ -0,0 +1,2307 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/fxedit/fxet_edit.h" + +#include +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/cpdf_pageobjectholder.h" +#include "core/fpdfapi/page/cpdf_pathobject.h" +#include "core/fpdfapi/page/cpdf_textobject.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfapi/render/cpdf_renderoptions.h" +#include "core/fpdfapi/render/cpdf_textrenderer.h" +#include "core/fpdfdoc/cpvt_section.h" +#include "core/fpdfdoc/cpvt_word.h" +#include "core/fpdfdoc/ipvt_fontmap.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "fpdfsdk/cfx_systemhandler.h" +#include "fpdfsdk/fxedit/fx_edit.h" +#include "fpdfsdk/pdfwindow/PWL_Edit.h" +#include "fpdfsdk/pdfwindow/PWL_EditCtrl.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +namespace { + +const int kEditUndoMaxItems = 10000; + +CFX_ByteString GetWordRenderString(const CFX_ByteString& strWords) { + if (strWords.GetLength() > 0) + return PDF_EncodeString(strWords) + " Tj\n"; + return CFX_ByteString(); +} + +CFX_ByteString GetFontSetString(IPVT_FontMap* pFontMap, + int32_t nFontIndex, + FX_FLOAT fFontSize) { + if (!pFontMap) + return CFX_ByteString(); + + CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); + if (sFontAlias.GetLength() <= 0 || fFontSize <= 0) + return CFX_ByteString(); + + CFX_ByteTextBuf sRet; + sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; + return sRet.MakeString(); +} + +void DrawTextString(CFX_RenderDevice* pDevice, + const CFX_PointF& pt, + CPDF_Font* pFont, + FX_FLOAT fFontSize, + CFX_Matrix* pUser2Device, + const CFX_ByteString& str, + FX_ARGB crTextFill, + int32_t nHorzScale) { + CFX_PointF pos = pUser2Device->Transform(pt); + + if (pFont) { + if (nHorzScale != 100) { + CFX_Matrix mt(nHorzScale / 100.0f, 0, 0, 1, 0, 0); + mt.Concat(*pUser2Device); + + CPDF_RenderOptions ro; + ro.m_Flags = RENDER_CLEARTYPE; + ro.m_ColorMode = RENDER_COLOR_NORMAL; + + CPDF_TextRenderer::DrawTextString(pDevice, pos.x, pos.y, pFont, fFontSize, + &mt, str, crTextFill, nullptr, &ro); + } else { + CPDF_RenderOptions ro; + ro.m_Flags = RENDER_CLEARTYPE; + ro.m_ColorMode = RENDER_COLOR_NORMAL; + + CPDF_TextRenderer::DrawTextString(pDevice, pos.x, pos.y, pFont, fFontSize, + pUser2Device, str, crTextFill, nullptr, + &ro); + } + } +} + +} // namespace + +CFX_Edit_Iterator::CFX_Edit_Iterator(CFX_Edit* pEdit, + CPDF_VariableText::Iterator* pVTIterator) + : m_pEdit(pEdit), m_pVTIterator(pVTIterator) {} + +CFX_Edit_Iterator::~CFX_Edit_Iterator() {} + +bool CFX_Edit_Iterator::NextWord() { + return m_pVTIterator->NextWord(); +} + +bool CFX_Edit_Iterator::PrevWord() { + return m_pVTIterator->PrevWord(); +} + +bool CFX_Edit_Iterator::GetWord(CPVT_Word& word) const { + ASSERT(m_pEdit); + + if (m_pVTIterator->GetWord(word)) { + word.ptWord = m_pEdit->VTToEdit(word.ptWord); + return true; + } + return false; +} + +bool CFX_Edit_Iterator::GetLine(CPVT_Line& line) const { + ASSERT(m_pEdit); + + if (m_pVTIterator->GetLine(line)) { + line.ptLine = m_pEdit->VTToEdit(line.ptLine); + return true; + } + return false; +} + +bool CFX_Edit_Iterator::GetSection(CPVT_Section& section) const { + ASSERT(m_pEdit); + + if (m_pVTIterator->GetSection(section)) { + section.rcSection = m_pEdit->VTToEdit(section.rcSection); + return true; + } + return false; +} + +void CFX_Edit_Iterator::SetAt(int32_t nWordIndex) { + m_pVTIterator->SetAt(nWordIndex); +} + +void CFX_Edit_Iterator::SetAt(const CPVT_WordPlace& place) { + m_pVTIterator->SetAt(place); +} + +const CPVT_WordPlace& CFX_Edit_Iterator::GetAt() const { + return m_pVTIterator->GetAt(); +} + +CFX_Edit_Provider::CFX_Edit_Provider(IPVT_FontMap* pFontMap) + : CPDF_VariableText::Provider(pFontMap), m_pFontMap(pFontMap) { + ASSERT(m_pFontMap); +} + +CFX_Edit_Provider::~CFX_Edit_Provider() {} + +IPVT_FontMap* CFX_Edit_Provider::GetFontMap() { + return m_pFontMap; +} + +int32_t CFX_Edit_Provider::GetCharWidth(int32_t nFontIndex, uint16_t word) { + if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) { + uint32_t charcode = word; + + if (pPDFFont->IsUnicodeCompatible()) + charcode = pPDFFont->CharCodeFromUnicode(word); + else + charcode = m_pFontMap->CharCodeFromUnicode(nFontIndex, word); + + if (charcode != CPDF_Font::kInvalidCharCode) + return pPDFFont->GetCharWidthF(charcode); + } + + return 0; +} + +int32_t CFX_Edit_Provider::GetTypeAscent(int32_t nFontIndex) { + if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) + return pPDFFont->GetTypeAscent(); + + return 0; +} + +int32_t CFX_Edit_Provider::GetTypeDescent(int32_t nFontIndex) { + if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) + return pPDFFont->GetTypeDescent(); + + return 0; +} + +int32_t CFX_Edit_Provider::GetWordFontIndex(uint16_t word, + int32_t charset, + int32_t nFontIndex) { + return m_pFontMap->GetWordFontIndex(word, charset, nFontIndex); +} + +int32_t CFX_Edit_Provider::GetDefaultFontIndex() { + return 0; +} + +bool CFX_Edit_Provider::IsLatinWord(uint16_t word) { + return FX_EDIT_ISLATINWORD(word); +} + +CFX_Edit_Refresh::CFX_Edit_Refresh() {} + +CFX_Edit_Refresh::~CFX_Edit_Refresh() {} + +void CFX_Edit_Refresh::BeginRefresh() { + m_RefreshRects.Clear(); + m_OldLineRects = std::move(m_NewLineRects); +} + +void CFX_Edit_Refresh::Push(const CPVT_WordRange& linerange, + const CFX_FloatRect& rect) { + m_NewLineRects.Add(linerange, rect); +} + +void CFX_Edit_Refresh::NoAnalyse() { + { + for (int32_t i = 0, sz = m_OldLineRects.GetSize(); i < sz; i++) + if (CFX_Edit_LineRect* pOldRect = m_OldLineRects.GetAt(i)) + m_RefreshRects.Add(pOldRect->m_rcLine); + } + + { + for (int32_t i = 0, sz = m_NewLineRects.GetSize(); i < sz; i++) + if (CFX_Edit_LineRect* pNewRect = m_NewLineRects.GetAt(i)) + m_RefreshRects.Add(pNewRect->m_rcLine); + } +} + +void CFX_Edit_Refresh::AddRefresh(const CFX_FloatRect& rect) { + m_RefreshRects.Add(rect); +} + +const CFX_Edit_RectArray* CFX_Edit_Refresh::GetRefreshRects() const { + return &m_RefreshRects; +} + +void CFX_Edit_Refresh::EndRefresh() { + m_RefreshRects.Clear(); +} + +CFX_Edit_Undo::CFX_Edit_Undo(int32_t nBufsize) + : m_nCurUndoPos(0), + m_nBufSize(nBufsize), + m_bModified(false), + m_bVirgin(true), + m_bWorking(false) {} + +CFX_Edit_Undo::~CFX_Edit_Undo() { + Reset(); +} + +bool CFX_Edit_Undo::CanUndo() const { + return m_nCurUndoPos > 0; +} + +void CFX_Edit_Undo::Undo() { + m_bWorking = true; + if (m_nCurUndoPos > 0) { + m_UndoItemStack[m_nCurUndoPos - 1]->Undo(); + m_nCurUndoPos--; + m_bModified = (m_nCurUndoPos != 0); + } + m_bWorking = false; +} + +bool CFX_Edit_Undo::CanRedo() const { + return m_nCurUndoPos < m_UndoItemStack.size(); +} + +void CFX_Edit_Undo::Redo() { + m_bWorking = true; + if (m_nCurUndoPos < m_UndoItemStack.size()) { + m_UndoItemStack[m_nCurUndoPos]->Redo(); + m_nCurUndoPos++; + m_bModified = true; + } + m_bWorking = false; +} + +void CFX_Edit_Undo::AddItem(std::unique_ptr pItem) { + ASSERT(!m_bWorking); + ASSERT(pItem); + ASSERT(m_nBufSize > 1); + if (m_nCurUndoPos < m_UndoItemStack.size()) + RemoveTails(); + + if (m_UndoItemStack.size() >= m_nBufSize) { + RemoveHeads(); + m_bVirgin = false; + } + + m_UndoItemStack.push_back(std::move(pItem)); + m_nCurUndoPos = m_UndoItemStack.size(); + m_bModified = true; +} + +bool CFX_Edit_Undo::IsModified() const { + return m_bVirgin ? m_bModified : true; +} + +void CFX_Edit_Undo::RemoveHeads() { + ASSERT(m_UndoItemStack.size() > 1); + m_UndoItemStack.pop_front(); +} + +void CFX_Edit_Undo::RemoveTails() { + while (m_UndoItemStack.size() > m_nCurUndoPos) + m_UndoItemStack.pop_back(); +} + +void CFX_Edit_Undo::Reset() { + m_UndoItemStack.clear(); + m_nCurUndoPos = 0; +} + +CFX_Edit_UndoItem::CFX_Edit_UndoItem() : m_bFirst(true), m_bLast(true) {} + +CFX_Edit_UndoItem::~CFX_Edit_UndoItem() {} + +CFX_WideString CFX_Edit_UndoItem::GetUndoTitle() const { + return CFX_WideString(); +} + +void CFX_Edit_UndoItem::SetFirst(bool bFirst) { + m_bFirst = bFirst; +} + +void CFX_Edit_UndoItem::SetLast(bool bLast) { + m_bLast = bLast; +} + +bool CFX_Edit_UndoItem::IsLast() { + return m_bLast; +} + +CFX_Edit_GroupUndoItem::CFX_Edit_GroupUndoItem(const CFX_WideString& sTitle) + : m_sTitle(sTitle) {} + +CFX_Edit_GroupUndoItem::~CFX_Edit_GroupUndoItem() {} + +void CFX_Edit_GroupUndoItem::AddUndoItem( + std::unique_ptr pUndoItem) { + pUndoItem->SetFirst(false); + pUndoItem->SetLast(false); + if (m_sTitle.IsEmpty()) + m_sTitle = pUndoItem->GetUndoTitle(); + + m_Items.push_back(std::move(pUndoItem)); +} + +void CFX_Edit_GroupUndoItem::UpdateItems() { + if (!m_Items.empty()) { + m_Items.front()->SetFirst(true); + m_Items.back()->SetLast(true); + } +} + +void CFX_Edit_GroupUndoItem::Undo() { + for (auto iter = m_Items.rbegin(); iter != m_Items.rend(); ++iter) + (*iter)->Undo(); +} + +void CFX_Edit_GroupUndoItem::Redo() { + for (auto iter = m_Items.begin(); iter != m_Items.end(); ++iter) + (*iter)->Redo(); +} + +CFX_WideString CFX_Edit_GroupUndoItem::GetUndoTitle() const { + return m_sTitle; +} + +CFXEU_InsertWord::CFXEU_InsertWord(CFX_Edit* pEdit, + const CPVT_WordPlace& wpOldPlace, + const CPVT_WordPlace& wpNewPlace, + uint16_t word, + int32_t charset, + const CPVT_WordProps* pWordProps) + : m_pEdit(pEdit), + m_wpOld(wpOldPlace), + m_wpNew(wpNewPlace), + m_Word(word), + m_nCharset(charset), + m_WordProps() { + if (pWordProps) + m_WordProps = *pWordProps; +} + +CFXEU_InsertWord::~CFXEU_InsertWord() {} + +void CFXEU_InsertWord::Redo() { + if (m_pEdit) { + m_pEdit->SelectNone(); + m_pEdit->SetCaret(m_wpOld); + m_pEdit->InsertWord(m_Word, m_nCharset, &m_WordProps, false, true); + } +} + +void CFXEU_InsertWord::Undo() { + if (m_pEdit) { + m_pEdit->SelectNone(); + m_pEdit->SetCaret(m_wpNew); + m_pEdit->Backspace(false, true); + } +} + +CFXEU_InsertReturn::CFXEU_InsertReturn(CFX_Edit* pEdit, + const CPVT_WordPlace& wpOldPlace, + const CPVT_WordPlace& wpNewPlace, + const CPVT_SecProps* pSecProps, + const CPVT_WordProps* pWordProps) + : m_pEdit(pEdit), + m_wpOld(wpOldPlace), + m_wpNew(wpNewPlace), + m_SecProps(), + m_WordProps() { + if (pSecProps) + m_SecProps = *pSecProps; + if (pWordProps) + m_WordProps = *pWordProps; +} + +CFXEU_InsertReturn::~CFXEU_InsertReturn() {} + +void CFXEU_InsertReturn::Redo() { + if (m_pEdit) { + m_pEdit->SelectNone(); + m_pEdit->SetCaret(m_wpOld); + m_pEdit->InsertReturn(&m_SecProps, &m_WordProps, false, true); + } +} + +void CFXEU_InsertReturn::Undo() { + if (m_pEdit) { + m_pEdit->SelectNone(); + m_pEdit->SetCaret(m_wpNew); + m_pEdit->Backspace(false, true); + } +} + +CFXEU_Backspace::CFXEU_Backspace(CFX_Edit* pEdit, + const CPVT_WordPlace& wpOldPlace, + const CPVT_WordPlace& wpNewPlace, + uint16_t word, + int32_t charset, + const CPVT_SecProps& SecProps, + const CPVT_WordProps& WordProps) + : m_pEdit(pEdit), + m_wpOld(wpOldPlace), + m_wpNew(wpNewPlace), + m_Word(word), + m_nCharset(charset), + m_SecProps(SecProps), + m_WordProps(WordProps) {} + +CFXEU_Backspace::~CFXEU_Backspace() {} + +void CFXEU_Backspace::Redo() { + if (m_pEdit) { + m_pEdit->SelectNone(); + m_pEdit->SetCaret(m_wpOld); + m_pEdit->Backspace(false, true); + } +} + +void CFXEU_Backspace::Undo() { + if (m_pEdit) { + m_pEdit->SelectNone(); + m_pEdit->SetCaret(m_wpNew); + if (m_wpNew.SecCmp(m_wpOld) != 0) { + m_pEdit->InsertReturn(&m_SecProps, &m_WordProps, false, true); + } else { + m_pEdit->InsertWord(m_Word, m_nCharset, &m_WordProps, false, true); + } + } +} + +CFXEU_Delete::CFXEU_Delete(CFX_Edit* pEdit, + const CPVT_WordPlace& wpOldPlace, + const CPVT_WordPlace& wpNewPlace, + uint16_t word, + int32_t charset, + const CPVT_SecProps& SecProps, + const CPVT_WordProps& WordProps, + bool bSecEnd) + : m_pEdit(pEdit), + m_wpOld(wpOldPlace), + m_wpNew(wpNewPlace), + m_Word(word), + m_nCharset(charset), + m_SecProps(SecProps), + m_WordProps(WordProps), + m_bSecEnd(bSecEnd) {} + +CFXEU_Delete::~CFXEU_Delete() {} + +void CFXEU_Delete::Redo() { + if (m_pEdit) { + m_pEdit->SelectNone(); + m_pEdit->SetCaret(m_wpOld); + m_pEdit->Delete(false, true); + } +} + +void CFXEU_Delete::Undo() { + if (m_pEdit) { + m_pEdit->SelectNone(); + m_pEdit->SetCaret(m_wpNew); + if (m_bSecEnd) { + m_pEdit->InsertReturn(&m_SecProps, &m_WordProps, false, true); + } else { + m_pEdit->InsertWord(m_Word, m_nCharset, &m_WordProps, false, true); + } + } +} + +CFXEU_Clear::CFXEU_Clear(CFX_Edit* pEdit, + const CPVT_WordRange& wrSel, + const CFX_WideString& swText) + : m_pEdit(pEdit), m_wrSel(wrSel), m_swText(swText) {} + +CFXEU_Clear::~CFXEU_Clear() {} + +void CFXEU_Clear::Redo() { + if (m_pEdit) { + m_pEdit->SelectNone(); + m_pEdit->SetSel(m_wrSel.BeginPos, m_wrSel.EndPos); + m_pEdit->Clear(false, true); + } +} + +void CFXEU_Clear::Undo() { + if (m_pEdit) { + m_pEdit->SelectNone(); + m_pEdit->SetCaret(m_wrSel.BeginPos); + m_pEdit->InsertText(m_swText, FXFONT_DEFAULT_CHARSET, false, true); + m_pEdit->SetSel(m_wrSel.BeginPos, m_wrSel.EndPos); + } +} + +CFXEU_InsertText::CFXEU_InsertText(CFX_Edit* pEdit, + const CPVT_WordPlace& wpOldPlace, + const CPVT_WordPlace& wpNewPlace, + const CFX_WideString& swText, + int32_t charset) + : m_pEdit(pEdit), + m_wpOld(wpOldPlace), + m_wpNew(wpNewPlace), + m_swText(swText), + m_nCharset(charset) {} + +CFXEU_InsertText::~CFXEU_InsertText() {} + +void CFXEU_InsertText::Redo() { + if (m_pEdit && IsLast()) { + m_pEdit->SelectNone(); + m_pEdit->SetCaret(m_wpOld); + m_pEdit->InsertText(m_swText, m_nCharset, false, true); + } +} + +void CFXEU_InsertText::Undo() { + if (m_pEdit) { + m_pEdit->SelectNone(); + m_pEdit->SetSel(m_wpOld, m_wpNew); + m_pEdit->Clear(false, true); + } +} + +// static +CFX_ByteString CFX_Edit::GetEditAppearanceStream(CFX_Edit* pEdit, + const CFX_PointF& ptOffset, + const CPVT_WordRange* pRange, + bool bContinuous, + uint16_t SubWord) { + CFX_Edit_Iterator* pIterator = pEdit->GetIterator(); + if (pRange) + pIterator->SetAt(pRange->BeginPos); + else + pIterator->SetAt(0); + + CFX_ByteTextBuf sEditStream; + CFX_ByteTextBuf sWords; + int32_t nCurFontIndex = -1; + CFX_PointF ptOld; + CFX_PointF ptNew; + CPVT_WordPlace oldplace; + + while (pIterator->NextWord()) { + CPVT_WordPlace place = pIterator->GetAt(); + if (pRange && place.WordCmp(pRange->EndPos) > 0) + break; + + if (bContinuous) { + if (place.LineCmp(oldplace) != 0) { + if (sWords.GetSize() > 0) { + sEditStream << GetWordRenderString(sWords.MakeString()); + sWords.Clear(); + } + + CPVT_Word word; + if (pIterator->GetWord(word)) { + ptNew = CFX_PointF(word.ptWord.x + ptOffset.x, + word.ptWord.y + ptOffset.y); + } else { + CPVT_Line line; + pIterator->GetLine(line); + ptNew = CFX_PointF(line.ptLine.x + ptOffset.x, + line.ptLine.y + ptOffset.y); + } + + if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { + sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y + << " Td\n"; + + ptOld = ptNew; + } + } + + CPVT_Word word; + if (pIterator->GetWord(word)) { + if (word.nFontIndex != nCurFontIndex) { + if (sWords.GetSize() > 0) { + sEditStream << GetWordRenderString(sWords.MakeString()); + sWords.Clear(); + } + sEditStream << GetFontSetString(pEdit->GetFontMap(), word.nFontIndex, + word.fFontSize); + nCurFontIndex = word.nFontIndex; + } + + sWords << GetPDFWordString(pEdit->GetFontMap(), nCurFontIndex, + word.Word, SubWord); + } + + oldplace = place; + } else { + CPVT_Word word; + if (pIterator->GetWord(word)) { + ptNew = + CFX_PointF(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y); + + if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { + sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y + << " Td\n"; + ptOld = ptNew; + } + + if (word.nFontIndex != nCurFontIndex) { + sEditStream << GetFontSetString(pEdit->GetFontMap(), word.nFontIndex, + word.fFontSize); + nCurFontIndex = word.nFontIndex; + } + + sEditStream << GetWordRenderString(GetPDFWordString( + pEdit->GetFontMap(), nCurFontIndex, word.Word, SubWord)); + } + } + } + + if (sWords.GetSize() > 0) { + sEditStream << GetWordRenderString(sWords.MakeString()); + sWords.Clear(); + } + + CFX_ByteTextBuf sAppStream; + if (sEditStream.GetSize() > 0) { + int32_t nHorzScale = pEdit->GetHorzScale(); + if (nHorzScale != 100) { + sAppStream << nHorzScale << " Tz\n"; + } + + FX_FLOAT fCharSpace = pEdit->GetCharSpace(); + if (!IsFloatZero(fCharSpace)) { + sAppStream << fCharSpace << " Tc\n"; + } + + sAppStream << sEditStream; + } + + return sAppStream.MakeString(); +} + +// static +CFX_ByteString CFX_Edit::GetSelectAppearanceStream( + CFX_Edit* pEdit, + const CFX_PointF& ptOffset, + const CPVT_WordRange* pRange) { + if (!pRange || !pRange->IsExist()) + return CFX_ByteString(); + + CFX_Edit_Iterator* pIterator = pEdit->GetIterator(); + pIterator->SetAt(pRange->BeginPos); + + CFX_ByteTextBuf sRet; + while (pIterator->NextWord()) { + CPVT_WordPlace place = pIterator->GetAt(); + if (place.WordCmp(pRange->EndPos) > 0) + break; + + CPVT_Word word; + CPVT_Line line; + if (pIterator->GetWord(word) && pIterator->GetLine(line)) { + sRet << word.ptWord.x + ptOffset.x << " " + << line.ptLine.y + line.fLineDescent << " " << word.fWidth << " " + << line.fLineAscent - line.fLineDescent << " re\nf\n"; + } + } + + return sRet.MakeString(); +} + +// static +void CFX_Edit::DrawEdit(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + CFX_Edit* pEdit, + FX_COLORREF crTextFill, + const CFX_FloatRect& rcClip, + const CFX_PointF& ptOffset, + const CPVT_WordRange* pRange, + CFX_SystemHandler* pSystemHandler, + CFFL_FormFiller* pFFLData) { + const bool bContinuous = + pEdit->GetCharArray() == 0 && pEdit->GetCharSpace() <= 0.0f; + uint16_t SubWord = pEdit->GetPasswordChar(); + FX_FLOAT fFontSize = pEdit->GetFontSize(); + CPVT_WordRange wrSelect = pEdit->GetSelectWordRange(); + int32_t nHorzScale = pEdit->GetHorzScale(); + + FX_COLORREF crCurFill = crTextFill; + FX_COLORREF crOldFill = crCurFill; + + bool bSelect = false; + const FX_COLORREF crWhite = ArgbEncode(255, 255, 255, 255); + const FX_COLORREF crSelBK = ArgbEncode(255, 0, 51, 113); + + CFX_ByteTextBuf sTextBuf; + int32_t nFontIndex = -1; + CFX_PointF ptBT; + pDevice->SaveState(); + if (!rcClip.IsEmpty()) { + CFX_FloatRect rcTemp = rcClip; + pUser2Device->TransformRect(rcTemp); + pDevice->SetClip_Rect(rcTemp.ToFxRect()); + } + + CFX_Edit_Iterator* pIterator = pEdit->GetIterator(); + if (IPVT_FontMap* pFontMap = pEdit->GetFontMap()) { + if (pRange) + pIterator->SetAt(pRange->BeginPos); + else + pIterator->SetAt(0); + + CPVT_WordPlace oldplace; + while (pIterator->NextWord()) { + CPVT_WordPlace place = pIterator->GetAt(); + if (pRange && place.WordCmp(pRange->EndPos) > 0) + break; + + if (wrSelect.IsExist()) { + bSelect = place.WordCmp(wrSelect.BeginPos) > 0 && + place.WordCmp(wrSelect.EndPos) <= 0; + crCurFill = bSelect ? crWhite : crTextFill; + } + if (pSystemHandler && pSystemHandler->IsSelectionImplemented()) { + crCurFill = crTextFill; + crOldFill = crCurFill; + } + CPVT_Word word; + if (pIterator->GetWord(word)) { + if (bSelect) { + CPVT_Line line; + pIterator->GetLine(line); + + if (pSystemHandler && pSystemHandler->IsSelectionImplemented()) { + CFX_FloatRect rc(word.ptWord.x, line.ptLine.y + line.fLineDescent, + word.ptWord.x + word.fWidth, + line.ptLine.y + line.fLineAscent); + rc.Intersect(rcClip); + pSystemHandler->OutputSelectedRect(pFFLData, rc); + } else { + CFX_PathData pathSelBK; + pathSelBK.AppendRect( + word.ptWord.x, line.ptLine.y + line.fLineDescent, + word.ptWord.x + word.fWidth, line.ptLine.y + line.fLineAscent); + + pDevice->DrawPath(&pathSelBK, pUser2Device, nullptr, crSelBK, 0, + FXFILL_WINDING); + } + } + + if (bContinuous) { + if (place.LineCmp(oldplace) != 0 || word.nFontIndex != nFontIndex || + crOldFill != crCurFill) { + if (sTextBuf.GetLength() > 0) { + DrawTextString( + pDevice, CFX_PointF(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), + pFontMap->GetPDFFont(nFontIndex), fFontSize, pUser2Device, + sTextBuf.MakeString(), crOldFill, nHorzScale); + + sTextBuf.Clear(); + } + nFontIndex = word.nFontIndex; + ptBT = word.ptWord; + crOldFill = crCurFill; + } + + sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, + SubWord) + .AsStringC(); + } else { + DrawTextString( + pDevice, CFX_PointF(word.ptWord.x + ptOffset.x, + word.ptWord.y + ptOffset.y), + pFontMap->GetPDFFont(word.nFontIndex), fFontSize, pUser2Device, + GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord), + crCurFill, nHorzScale); + } + oldplace = place; + } + } + + if (sTextBuf.GetLength() > 0) { + DrawTextString(pDevice, + CFX_PointF(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), + pFontMap->GetPDFFont(nFontIndex), fFontSize, pUser2Device, + sTextBuf.MakeString(), crOldFill, nHorzScale); + } + } + + pDevice->RestoreState(false); +} + +CFX_Edit::CFX_Edit() + : m_pVT(new CPDF_VariableText), + m_pNotify(nullptr), + m_pOprNotify(nullptr), + m_wpCaret(-1, -1, -1), + m_wpOldCaret(-1, -1, -1), + m_SelState(), + m_bEnableScroll(false), + m_Undo(kEditUndoMaxItems), + m_nAlignment(0), + m_bNotifyFlag(false), + m_bEnableOverflow(false), + m_bEnableRefresh(true), + m_rcOldContent(0.0f, 0.0f, 0.0f, 0.0f), + m_bEnableUndo(true), + m_bOprNotify(false), + m_pGroupUndoItem(nullptr) {} + +CFX_Edit::~CFX_Edit() { + ASSERT(!m_pGroupUndoItem); +} + +void CFX_Edit::Initialize() { + m_pVT->Initialize(); + SetCaret(m_pVT->GetBeginWordPlace()); + SetCaretOrigin(); +} + +void CFX_Edit::SetFontMap(IPVT_FontMap* pFontMap) { + m_pVTProvider = pdfium::MakeUnique(pFontMap); + m_pVT->SetProvider(m_pVTProvider.get()); +} + +void CFX_Edit::SetNotify(CPWL_EditCtrl* pNotify) { + m_pNotify = pNotify; +} + +void CFX_Edit::SetOprNotify(CPWL_Edit* pOprNotify) { + m_pOprNotify = pOprNotify; +} + +CFX_Edit_Iterator* CFX_Edit::GetIterator() { + if (!m_pIterator) { + m_pIterator = + pdfium::MakeUnique(this, m_pVT->GetIterator()); + } + return m_pIterator.get(); +} + +IPVT_FontMap* CFX_Edit::GetFontMap() { + return m_pVTProvider ? m_pVTProvider->GetFontMap() : nullptr; +} + +void CFX_Edit::SetPlateRect(const CFX_FloatRect& rect) { + m_pVT->SetPlateRect(rect); + m_ptScrollPos = CFX_PointF(rect.left, rect.top); + Paint(); +} + +void CFX_Edit::SetAlignmentH(int32_t nFormat, bool bPaint) { + m_pVT->SetAlignment(nFormat); + if (bPaint) + Paint(); +} + +void CFX_Edit::SetAlignmentV(int32_t nFormat, bool bPaint) { + m_nAlignment = nFormat; + if (bPaint) + Paint(); +} + +void CFX_Edit::SetPasswordChar(uint16_t wSubWord, bool bPaint) { + m_pVT->SetPasswordChar(wSubWord); + if (bPaint) + Paint(); +} + +void CFX_Edit::SetLimitChar(int32_t nLimitChar) { + m_pVT->SetLimitChar(nLimitChar); + Paint(); +} + +void CFX_Edit::SetCharArray(int32_t nCharArray) { + m_pVT->SetCharArray(nCharArray); + Paint(); +} + +void CFX_Edit::SetCharSpace(FX_FLOAT fCharSpace) { + m_pVT->SetCharSpace(fCharSpace); + Paint(); +} + +void CFX_Edit::SetMultiLine(bool bMultiLine, bool bPaint) { + m_pVT->SetMultiLine(bMultiLine); + if (bPaint) + Paint(); +} + +void CFX_Edit::SetAutoReturn(bool bAuto, bool bPaint) { + m_pVT->SetAutoReturn(bAuto); + if (bPaint) + Paint(); +} + +void CFX_Edit::SetAutoFontSize(bool bAuto, bool bPaint) { + m_pVT->SetAutoFontSize(bAuto); + if (bPaint) + Paint(); +} + +void CFX_Edit::SetFontSize(FX_FLOAT fFontSize) { + m_pVT->SetFontSize(fFontSize); + Paint(); +} + +void CFX_Edit::SetAutoScroll(bool bAuto, bool bPaint) { + m_bEnableScroll = bAuto; + if (bPaint) + Paint(); +} + +void CFX_Edit::SetTextOverflow(bool bAllowed, bool bPaint) { + m_bEnableOverflow = bAllowed; + if (bPaint) + Paint(); +} + +void CFX_Edit::SetSel(int32_t nStartChar, int32_t nEndChar) { + if (m_pVT->IsValid()) { + if (nStartChar == 0 && nEndChar < 0) { + SelectAll(); + } else if (nStartChar < 0) { + SelectNone(); + } else { + if (nStartChar < nEndChar) { + SetSel(m_pVT->WordIndexToWordPlace(nStartChar), + m_pVT->WordIndexToWordPlace(nEndChar)); + } else { + SetSel(m_pVT->WordIndexToWordPlace(nEndChar), + m_pVT->WordIndexToWordPlace(nStartChar)); + } + } + } +} + +void CFX_Edit::SetSel(const CPVT_WordPlace& begin, const CPVT_WordPlace& end) { + if (m_pVT->IsValid()) { + SelectNone(); + + m_SelState.Set(begin, end); + + SetCaret(m_SelState.EndPos); + + if (m_SelState.IsExist()) { + ScrollToCaret(); + Refresh(); + SetCaretInfo(); + } else { + ScrollToCaret(); + SetCaretInfo(); + } + } +} + +void CFX_Edit::GetSel(int32_t& nStartChar, int32_t& nEndChar) const { + nStartChar = -1; + nEndChar = -1; + + if (m_pVT->IsValid()) { + if (m_SelState.IsExist()) { + if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) < 0) { + nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos); + nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos); + } else { + nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos); + nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos); + } + } else { + nStartChar = m_pVT->WordPlaceToWordIndex(m_wpCaret); + nEndChar = m_pVT->WordPlaceToWordIndex(m_wpCaret); + } + } +} + +int32_t CFX_Edit::GetCaret() const { + if (m_pVT->IsValid()) + return m_pVT->WordPlaceToWordIndex(m_wpCaret); + + return -1; +} + +CPVT_WordPlace CFX_Edit::GetCaretWordPlace() const { + return m_wpCaret; +} + +CFX_WideString CFX_Edit::GetText() const { + CFX_WideString swRet; + + if (!m_pVT->IsValid()) + return swRet; + + CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator(); + pIterator->SetAt(0); + + CPVT_Word wordinfo; + CPVT_WordPlace oldplace = pIterator->GetAt(); + while (pIterator->NextWord()) { + CPVT_WordPlace place = pIterator->GetAt(); + + if (pIterator->GetWord(wordinfo)) + swRet += wordinfo.Word; + + if (oldplace.SecCmp(place) != 0) + swRet += L"\r\n"; + + oldplace = place; + } + + return swRet; +} + +CFX_WideString CFX_Edit::GetRangeText(const CPVT_WordRange& range) const { + CFX_WideString swRet; + + if (!m_pVT->IsValid()) + return swRet; + + CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator(); + CPVT_WordRange wrTemp = range; + m_pVT->UpdateWordPlace(wrTemp.BeginPos); + m_pVT->UpdateWordPlace(wrTemp.EndPos); + pIterator->SetAt(wrTemp.BeginPos); + + CPVT_Word wordinfo; + CPVT_WordPlace oldplace = wrTemp.BeginPos; + while (pIterator->NextWord()) { + CPVT_WordPlace place = pIterator->GetAt(); + if (place.WordCmp(wrTemp.EndPos) > 0) + break; + + if (pIterator->GetWord(wordinfo)) + swRet += wordinfo.Word; + + if (oldplace.SecCmp(place) != 0) + swRet += L"\r\n"; + + oldplace = place; + } + + return swRet; +} + +CFX_WideString CFX_Edit::GetSelText() const { + return GetRangeText(m_SelState.ConvertToWordRange()); +} + +int32_t CFX_Edit::GetTotalWords() const { + return m_pVT->GetTotalWords(); +} + +int32_t CFX_Edit::GetTotalLines() const { + int32_t nLines = 1; + + CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator(); + pIterator->SetAt(0); + while (pIterator->NextLine()) + ++nLines; + + return nLines; +} + +CPVT_WordRange CFX_Edit::GetSelectWordRange() const { + return m_SelState.ConvertToWordRange(); +} + +void CFX_Edit::SetText(const CFX_WideString& sText) { + Empty(); + DoInsertText(CPVT_WordPlace(0, 0, -1), sText, FXFONT_DEFAULT_CHARSET); + Paint(); +} + +bool CFX_Edit::InsertWord(uint16_t word, int32_t charset) { + return InsertWord(word, charset, nullptr, true, true); +} + +bool CFX_Edit::InsertReturn() { + return InsertReturn(nullptr, nullptr, true, true); +} + +bool CFX_Edit::Backspace() { + return Backspace(true, true); +} + +bool CFX_Edit::Delete() { + return Delete(true, true); +} + +bool CFX_Edit::Clear() { + return Clear(true, true); +} + +bool CFX_Edit::InsertText(const CFX_WideString& sText, int32_t charset) { + return InsertText(sText, charset, true, true); +} + +FX_FLOAT CFX_Edit::GetFontSize() const { + return m_pVT->GetFontSize(); +} + +uint16_t CFX_Edit::GetPasswordChar() const { + return m_pVT->GetPasswordChar(); +} + +int32_t CFX_Edit::GetCharArray() const { + return m_pVT->GetCharArray(); +} + +CFX_FloatRect CFX_Edit::GetContentRect() const { + return VTToEdit(m_pVT->GetContentRect()); +} + +int32_t CFX_Edit::GetHorzScale() const { + return m_pVT->GetHorzScale(); +} + +FX_FLOAT CFX_Edit::GetCharSpace() const { + return m_pVT->GetCharSpace(); +} + +CPVT_WordRange CFX_Edit::GetWholeWordRange() const { + if (m_pVT->IsValid()) + return CPVT_WordRange(m_pVT->GetBeginWordPlace(), m_pVT->GetEndWordPlace()); + + return CPVT_WordRange(); +} + +CPVT_WordRange CFX_Edit::GetVisibleWordRange() const { + if (m_bEnableOverflow) + return GetWholeWordRange(); + + if (m_pVT->IsValid()) { + CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); + + CPVT_WordPlace place1 = + m_pVT->SearchWordPlace(EditToVT(CFX_PointF(rcPlate.left, rcPlate.top))); + CPVT_WordPlace place2 = m_pVT->SearchWordPlace( + EditToVT(CFX_PointF(rcPlate.right, rcPlate.bottom))); + + return CPVT_WordRange(place1, place2); + } + + return CPVT_WordRange(); +} + +CPVT_WordPlace CFX_Edit::SearchWordPlace(const CFX_PointF& point) const { + if (m_pVT->IsValid()) { + return m_pVT->SearchWordPlace(EditToVT(point)); + } + + return CPVT_WordPlace(); +} + +void CFX_Edit::Paint() { + if (m_pVT->IsValid()) { + RearrangeAll(); + ScrollToCaret(); + Refresh(); + SetCaretOrigin(); + SetCaretInfo(); + } +} + +void CFX_Edit::RearrangeAll() { + if (m_pVT->IsValid()) { + m_pVT->UpdateWordPlace(m_wpCaret); + m_pVT->RearrangeAll(); + m_pVT->UpdateWordPlace(m_wpCaret); + SetScrollInfo(); + SetContentChanged(); + } +} + +void CFX_Edit::RearrangePart(const CPVT_WordRange& range) { + if (m_pVT->IsValid()) { + m_pVT->UpdateWordPlace(m_wpCaret); + m_pVT->RearrangePart(range); + m_pVT->UpdateWordPlace(m_wpCaret); + SetScrollInfo(); + SetContentChanged(); + } +} + +void CFX_Edit::SetContentChanged() { + if (m_pNotify) { + CFX_FloatRect rcContent = m_pVT->GetContentRect(); + if (rcContent.Width() != m_rcOldContent.Width() || + rcContent.Height() != m_rcOldContent.Height()) { + if (!m_bNotifyFlag) { + m_bNotifyFlag = true; + m_pNotify->IOnContentChange(rcContent); + m_bNotifyFlag = false; + } + m_rcOldContent = rcContent; + } + } +} + +void CFX_Edit::SelectAll() { + if (m_pVT->IsValid()) { + m_SelState = CFX_Edit_Select(GetWholeWordRange()); + SetCaret(m_SelState.EndPos); + + ScrollToCaret(); + Refresh(); + SetCaretInfo(); + } +} + +void CFX_Edit::SelectNone() { + if (m_pVT->IsValid()) { + if (m_SelState.IsExist()) { + m_SelState.Default(); + Refresh(); + } + } +} + +bool CFX_Edit::IsSelected() const { + return m_SelState.IsExist(); +} + +CFX_PointF CFX_Edit::VTToEdit(const CFX_PointF& point) const { + CFX_FloatRect rcContent = m_pVT->GetContentRect(); + CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); + + FX_FLOAT fPadding = 0.0f; + + switch (m_nAlignment) { + case 0: + fPadding = 0.0f; + break; + case 1: + fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f; + break; + case 2: + fPadding = rcPlate.Height() - rcContent.Height(); + break; + } + + return CFX_PointF(point.x - (m_ptScrollPos.x - rcPlate.left), + point.y - (m_ptScrollPos.y + fPadding - rcPlate.top)); +} + +CFX_PointF CFX_Edit::EditToVT(const CFX_PointF& point) const { + CFX_FloatRect rcContent = m_pVT->GetContentRect(); + CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); + + FX_FLOAT fPadding = 0.0f; + + switch (m_nAlignment) { + case 0: + fPadding = 0.0f; + break; + case 1: + fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f; + break; + case 2: + fPadding = rcPlate.Height() - rcContent.Height(); + break; + } + + return CFX_PointF(point.x + (m_ptScrollPos.x - rcPlate.left), + point.y + (m_ptScrollPos.y + fPadding - rcPlate.top)); +} + +CFX_FloatRect CFX_Edit::VTToEdit(const CFX_FloatRect& rect) const { + CFX_PointF ptLeftBottom = VTToEdit(CFX_PointF(rect.left, rect.bottom)); + CFX_PointF ptRightTop = VTToEdit(CFX_PointF(rect.right, rect.top)); + + return CFX_FloatRect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, + ptRightTop.y); +} + +void CFX_Edit::SetScrollInfo() { + if (m_pNotify) { + CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); + CFX_FloatRect rcContent = m_pVT->GetContentRect(); + + if (!m_bNotifyFlag) { + m_bNotifyFlag = true; + m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top, + rcContent.bottom, rcContent.top, + rcPlate.Height() / 3, rcPlate.Height()); + m_bNotifyFlag = false; + } + } +} + +void CFX_Edit::SetScrollPosX(FX_FLOAT fx) { + if (!m_bEnableScroll) + return; + + if (m_pVT->IsValid()) { + if (!IsFloatEqual(m_ptScrollPos.x, fx)) { + m_ptScrollPos.x = fx; + Refresh(); + } + } +} + +void CFX_Edit::SetScrollPosY(FX_FLOAT fy) { + if (!m_bEnableScroll) + return; + + if (m_pVT->IsValid()) { + if (!IsFloatEqual(m_ptScrollPos.y, fy)) { + m_ptScrollPos.y = fy; + Refresh(); + + if (m_pNotify) { + if (!m_bNotifyFlag) { + m_bNotifyFlag = true; + m_pNotify->IOnSetScrollPosY(fy); + m_bNotifyFlag = false; + } + } + } + } +} + +void CFX_Edit::SetScrollPos(const CFX_PointF& point) { + SetScrollPosX(point.x); + SetScrollPosY(point.y); + SetScrollLimit(); + SetCaretInfo(); +} + +CFX_PointF CFX_Edit::GetScrollPos() const { + return m_ptScrollPos; +} + +void CFX_Edit::SetScrollLimit() { + if (m_pVT->IsValid()) { + CFX_FloatRect rcContent = m_pVT->GetContentRect(); + CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); + + if (rcPlate.Width() > rcContent.Width()) { + SetScrollPosX(rcPlate.left); + } else { + if (IsFloatSmaller(m_ptScrollPos.x, rcContent.left)) { + SetScrollPosX(rcContent.left); + } else if (IsFloatBigger(m_ptScrollPos.x, + rcContent.right - rcPlate.Width())) { + SetScrollPosX(rcContent.right - rcPlate.Width()); + } + } + + if (rcPlate.Height() > rcContent.Height()) { + SetScrollPosY(rcPlate.top); + } else { + if (IsFloatSmaller(m_ptScrollPos.y, + rcContent.bottom + rcPlate.Height())) { + SetScrollPosY(rcContent.bottom + rcPlate.Height()); + } else if (IsFloatBigger(m_ptScrollPos.y, rcContent.top)) { + SetScrollPosY(rcContent.top); + } + } + } +} + +void CFX_Edit::ScrollToCaret() { + SetScrollLimit(); + + if (!m_pVT->IsValid()) + return; + + CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator(); + pIterator->SetAt(m_wpCaret); + + CFX_PointF ptHead; + CFX_PointF ptFoot; + CPVT_Word word; + CPVT_Line line; + if (pIterator->GetWord(word)) { + ptHead.x = word.ptWord.x + word.fWidth; + ptHead.y = word.ptWord.y + word.fAscent; + ptFoot.x = word.ptWord.x + word.fWidth; + ptFoot.y = word.ptWord.y + word.fDescent; + } else if (pIterator->GetLine(line)) { + ptHead.x = line.ptLine.x; + ptHead.y = line.ptLine.y + line.fLineAscent; + ptFoot.x = line.ptLine.x; + ptFoot.y = line.ptLine.y + line.fLineDescent; + } + + CFX_PointF ptHeadEdit = VTToEdit(ptHead); + CFX_PointF ptFootEdit = VTToEdit(ptFoot); + CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); + if (!IsFloatEqual(rcPlate.left, rcPlate.right)) { + if (IsFloatSmaller(ptHeadEdit.x, rcPlate.left) || + IsFloatEqual(ptHeadEdit.x, rcPlate.left)) { + SetScrollPosX(ptHead.x); + } else if (IsFloatBigger(ptHeadEdit.x, rcPlate.right)) { + SetScrollPosX(ptHead.x - rcPlate.Width()); + } + } + + if (!IsFloatEqual(rcPlate.top, rcPlate.bottom)) { + if (IsFloatSmaller(ptFootEdit.y, rcPlate.bottom) || + IsFloatEqual(ptFootEdit.y, rcPlate.bottom)) { + if (IsFloatSmaller(ptHeadEdit.y, rcPlate.top)) { + SetScrollPosY(ptFoot.y + rcPlate.Height()); + } + } else if (IsFloatBigger(ptHeadEdit.y, rcPlate.top)) { + if (IsFloatBigger(ptFootEdit.y, rcPlate.bottom)) { + SetScrollPosY(ptHead.y); + } + } + } +} + +void CFX_Edit::Refresh() { + if (m_bEnableRefresh && m_pVT->IsValid()) { + m_Refresh.BeginRefresh(); + RefreshPushLineRects(GetVisibleWordRange()); + + m_Refresh.NoAnalyse(); + m_ptRefreshScrollPos = m_ptScrollPos; + + if (m_pNotify) { + if (!m_bNotifyFlag) { + m_bNotifyFlag = true; + if (const CFX_Edit_RectArray* pRects = m_Refresh.GetRefreshRects()) { + for (int32_t i = 0, sz = pRects->GetSize(); i < sz; i++) + m_pNotify->IOnInvalidateRect(pRects->GetAt(i)); + } + m_bNotifyFlag = false; + } + } + + m_Refresh.EndRefresh(); + } +} + +void CFX_Edit::RefreshPushLineRects(const CPVT_WordRange& wr) { + if (!m_pVT->IsValid()) + return; + + CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator(); + CPVT_WordPlace wpBegin = wr.BeginPos; + m_pVT->UpdateWordPlace(wpBegin); + CPVT_WordPlace wpEnd = wr.EndPos; + m_pVT->UpdateWordPlace(wpEnd); + pIterator->SetAt(wpBegin); + + CPVT_Line lineinfo; + do { + if (!pIterator->GetLine(lineinfo)) + break; + if (lineinfo.lineplace.LineCmp(wpEnd) > 0) + break; + + CFX_FloatRect rcLine(lineinfo.ptLine.x, + lineinfo.ptLine.y + lineinfo.fLineDescent, + lineinfo.ptLine.x + lineinfo.fLineWidth, + lineinfo.ptLine.y + lineinfo.fLineAscent); + + m_Refresh.Push(CPVT_WordRange(lineinfo.lineplace, lineinfo.lineEnd), + VTToEdit(rcLine)); + } while (pIterator->NextLine()); +} + +void CFX_Edit::RefreshWordRange(const CPVT_WordRange& wr) { + CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator(); + CPVT_WordRange wrTemp = wr; + + m_pVT->UpdateWordPlace(wrTemp.BeginPos); + m_pVT->UpdateWordPlace(wrTemp.EndPos); + pIterator->SetAt(wrTemp.BeginPos); + + CPVT_Word wordinfo; + CPVT_Line lineinfo; + CPVT_WordPlace place; + + while (pIterator->NextWord()) { + place = pIterator->GetAt(); + if (place.WordCmp(wrTemp.EndPos) > 0) + break; + + pIterator->GetWord(wordinfo); + pIterator->GetLine(lineinfo); + + if (place.LineCmp(wrTemp.BeginPos) == 0 || + place.LineCmp(wrTemp.EndPos) == 0) { + CFX_FloatRect rcWord(wordinfo.ptWord.x, + lineinfo.ptLine.y + lineinfo.fLineDescent, + wordinfo.ptWord.x + wordinfo.fWidth, + lineinfo.ptLine.y + lineinfo.fLineAscent); + + if (m_pNotify) { + if (!m_bNotifyFlag) { + m_bNotifyFlag = true; + CFX_FloatRect rcRefresh = VTToEdit(rcWord); + m_pNotify->IOnInvalidateRect(&rcRefresh); + m_bNotifyFlag = false; + } + } + } else { + CFX_FloatRect rcLine(lineinfo.ptLine.x, + lineinfo.ptLine.y + lineinfo.fLineDescent, + lineinfo.ptLine.x + lineinfo.fLineWidth, + lineinfo.ptLine.y + lineinfo.fLineAscent); + + if (m_pNotify) { + if (!m_bNotifyFlag) { + m_bNotifyFlag = true; + CFX_FloatRect rcRefresh = VTToEdit(rcLine); + m_pNotify->IOnInvalidateRect(&rcRefresh); + m_bNotifyFlag = false; + } + } + + pIterator->NextLine(); + } + } +} + +void CFX_Edit::SetCaret(const CPVT_WordPlace& place) { + m_wpOldCaret = m_wpCaret; + m_wpCaret = place; +} + +void CFX_Edit::SetCaretInfo() { + if (m_pNotify) { + if (!m_bNotifyFlag) { + CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator(); + pIterator->SetAt(m_wpCaret); + + CFX_PointF ptHead; + CFX_PointF ptFoot; + CPVT_Word word; + CPVT_Line line; + if (pIterator->GetWord(word)) { + ptHead.x = word.ptWord.x + word.fWidth; + ptHead.y = word.ptWord.y + word.fAscent; + ptFoot.x = word.ptWord.x + word.fWidth; + ptFoot.y = word.ptWord.y + word.fDescent; + } else if (pIterator->GetLine(line)) { + ptHead.x = line.ptLine.x; + ptHead.y = line.ptLine.y + line.fLineAscent; + ptFoot.x = line.ptLine.x; + ptFoot.y = line.ptLine.y + line.fLineDescent; + } + + m_bNotifyFlag = true; + m_pNotify->IOnSetCaret(!m_SelState.IsExist(), VTToEdit(ptHead), + VTToEdit(ptFoot), m_wpCaret); + m_bNotifyFlag = false; + } + } +} + +void CFX_Edit::SetCaret(int32_t nPos) { + if (m_pVT->IsValid()) { + SelectNone(); + SetCaret(m_pVT->WordIndexToWordPlace(nPos)); + m_SelState.Set(m_wpCaret, m_wpCaret); + + ScrollToCaret(); + SetCaretOrigin(); + SetCaretInfo(); + } +} + +void CFX_Edit::OnMouseDown(const CFX_PointF& point, bool bShift, bool bCtrl) { + if (m_pVT->IsValid()) { + SelectNone(); + SetCaret(m_pVT->SearchWordPlace(EditToVT(point))); + m_SelState.Set(m_wpCaret, m_wpCaret); + + ScrollToCaret(); + SetCaretOrigin(); + SetCaretInfo(); + } +} + +void CFX_Edit::OnMouseMove(const CFX_PointF& point, bool bShift, bool bCtrl) { + if (m_pVT->IsValid()) { + SetCaret(m_pVT->SearchWordPlace(EditToVT(point))); + + if (m_wpCaret != m_wpOldCaret) { + m_SelState.SetEndPos(m_wpCaret); + + ScrollToCaret(); + Refresh(); + SetCaretOrigin(); + SetCaretInfo(); + } + } +} + +void CFX_Edit::OnVK_UP(bool bShift, bool bCtrl) { + if (m_pVT->IsValid()) { + SetCaret(m_pVT->GetUpWordPlace(m_wpCaret, m_ptCaret)); + + if (bShift) { + if (m_SelState.IsExist()) + m_SelState.SetEndPos(m_wpCaret); + else + m_SelState.Set(m_wpOldCaret, m_wpCaret); + + if (m_wpOldCaret != m_wpCaret) { + ScrollToCaret(); + Refresh(); + SetCaretInfo(); + } + } else { + SelectNone(); + + ScrollToCaret(); + SetCaretInfo(); + } + } +} + +void CFX_Edit::OnVK_DOWN(bool bShift, bool bCtrl) { + if (m_pVT->IsValid()) { + SetCaret(m_pVT->GetDownWordPlace(m_wpCaret, m_ptCaret)); + + if (bShift) { + if (m_SelState.IsExist()) + m_SelState.SetEndPos(m_wpCaret); + else + m_SelState.Set(m_wpOldCaret, m_wpCaret); + + if (m_wpOldCaret != m_wpCaret) { + ScrollToCaret(); + Refresh(); + SetCaretInfo(); + } + } else { + SelectNone(); + + ScrollToCaret(); + SetCaretInfo(); + } + } +} + +void CFX_Edit::OnVK_LEFT(bool bShift, bool bCtrl) { + if (m_pVT->IsValid()) { + if (bShift) { + if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) && + m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret)) + SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret)); + + SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret)); + + if (m_SelState.IsExist()) + m_SelState.SetEndPos(m_wpCaret); + else + m_SelState.Set(m_wpOldCaret, m_wpCaret); + + if (m_wpOldCaret != m_wpCaret) { + ScrollToCaret(); + Refresh(); + SetCaretInfo(); + } + } else { + if (m_SelState.IsExist()) { + if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) < 0) + SetCaret(m_SelState.BeginPos); + else + SetCaret(m_SelState.EndPos); + + SelectNone(); + ScrollToCaret(); + SetCaretInfo(); + } else { + if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) && + m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret)) + SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret)); + + SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret)); + + ScrollToCaret(); + SetCaretOrigin(); + SetCaretInfo(); + } + } + } +} + +void CFX_Edit::OnVK_RIGHT(bool bShift, bool bCtrl) { + if (m_pVT->IsValid()) { + if (bShift) { + SetCaret(m_pVT->GetNextWordPlace(m_wpCaret)); + + if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) && + m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret)) + SetCaret(m_pVT->GetNextWordPlace(m_wpCaret)); + + if (m_SelState.IsExist()) + m_SelState.SetEndPos(m_wpCaret); + else + m_SelState.Set(m_wpOldCaret, m_wpCaret); + + if (m_wpOldCaret != m_wpCaret) { + ScrollToCaret(); + Refresh(); + SetCaretInfo(); + } + } else { + if (m_SelState.IsExist()) { + if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) > 0) + SetCaret(m_SelState.BeginPos); + else + SetCaret(m_SelState.EndPos); + + SelectNone(); + ScrollToCaret(); + SetCaretInfo(); + } else { + SetCaret(m_pVT->GetNextWordPlace(m_wpCaret)); + + if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) && + m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret)) + SetCaret(m_pVT->GetNextWordPlace(m_wpCaret)); + + ScrollToCaret(); + SetCaretOrigin(); + SetCaretInfo(); + } + } + } +} + +void CFX_Edit::OnVK_HOME(bool bShift, bool bCtrl) { + if (m_pVT->IsValid()) { + if (bShift) { + if (bCtrl) + SetCaret(m_pVT->GetBeginWordPlace()); + else + SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret)); + + if (m_SelState.IsExist()) + m_SelState.SetEndPos(m_wpCaret); + else + m_SelState.Set(m_wpOldCaret, m_wpCaret); + + ScrollToCaret(); + Refresh(); + SetCaretInfo(); + } else { + if (m_SelState.IsExist()) { + if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) < 0) + SetCaret(m_SelState.BeginPos); + else + SetCaret(m_SelState.EndPos); + + SelectNone(); + ScrollToCaret(); + SetCaretInfo(); + } else { + if (bCtrl) + SetCaret(m_pVT->GetBeginWordPlace()); + else + SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret)); + + ScrollToCaret(); + SetCaretOrigin(); + SetCaretInfo(); + } + } + } +} + +void CFX_Edit::OnVK_END(bool bShift, bool bCtrl) { + if (m_pVT->IsValid()) { + if (bShift) { + if (bCtrl) + SetCaret(m_pVT->GetEndWordPlace()); + else + SetCaret(m_pVT->GetLineEndPlace(m_wpCaret)); + + if (m_SelState.IsExist()) + m_SelState.SetEndPos(m_wpCaret); + else + m_SelState.Set(m_wpOldCaret, m_wpCaret); + + ScrollToCaret(); + Refresh(); + SetCaretInfo(); + } else { + if (m_SelState.IsExist()) { + if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) > 0) + SetCaret(m_SelState.BeginPos); + else + SetCaret(m_SelState.EndPos); + + SelectNone(); + ScrollToCaret(); + SetCaretInfo(); + } else { + if (bCtrl) + SetCaret(m_pVT->GetEndWordPlace()); + else + SetCaret(m_pVT->GetLineEndPlace(m_wpCaret)); + + ScrollToCaret(); + SetCaretOrigin(); + SetCaretInfo(); + } + } + } +} + +bool CFX_Edit::InsertWord(uint16_t word, + int32_t charset, + const CPVT_WordProps* pWordProps, + bool bAddUndo, + bool bPaint) { + if (IsTextOverflow() || !m_pVT->IsValid()) + return false; + + m_pVT->UpdateWordPlace(m_wpCaret); + SetCaret(m_pVT->InsertWord(m_wpCaret, word, + GetCharSetFromUnicode(word, charset), pWordProps)); + m_SelState.Set(m_wpCaret, m_wpCaret); + if (m_wpCaret == m_wpOldCaret) + return false; + + if (bAddUndo && m_bEnableUndo) { + AddEditUndoItem(pdfium::MakeUnique( + this, m_wpOldCaret, m_wpCaret, word, charset, pWordProps)); + } + if (bPaint) + PaintInsertText(m_wpOldCaret, m_wpCaret); + + if (m_bOprNotify && m_pOprNotify) + m_pOprNotify->OnInsertWord(m_wpCaret, m_wpOldCaret); + + return true; +} + +bool CFX_Edit::InsertReturn(const CPVT_SecProps* pSecProps, + const CPVT_WordProps* pWordProps, + bool bAddUndo, + bool bPaint) { + if (IsTextOverflow() || !m_pVT->IsValid()) + return false; + + m_pVT->UpdateWordPlace(m_wpCaret); + SetCaret(m_pVT->InsertSection(m_wpCaret, pSecProps, pWordProps)); + m_SelState.Set(m_wpCaret, m_wpCaret); + if (m_wpCaret == m_wpOldCaret) + return false; + + if (bAddUndo && m_bEnableUndo) { + AddEditUndoItem(pdfium::MakeUnique( + this, m_wpOldCaret, m_wpCaret, pSecProps, pWordProps)); + } + if (bPaint) { + RearrangePart(CPVT_WordRange(m_wpOldCaret, m_wpCaret)); + ScrollToCaret(); + Refresh(); + SetCaretOrigin(); + SetCaretInfo(); + } + if (m_bOprNotify && m_pOprNotify) + m_pOprNotify->OnInsertReturn(m_wpCaret, m_wpOldCaret); + + return true; +} + +bool CFX_Edit::Backspace(bool bAddUndo, bool bPaint) { + if (!m_pVT->IsValid() || m_wpCaret == m_pVT->GetBeginWordPlace()) + return false; + + CPVT_Section section; + CPVT_Word word; + if (bAddUndo) { + CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator(); + pIterator->SetAt(m_wpCaret); + pIterator->GetSection(section); + pIterator->GetWord(word); + } + m_pVT->UpdateWordPlace(m_wpCaret); + SetCaret(m_pVT->BackSpaceWord(m_wpCaret)); + m_SelState.Set(m_wpCaret, m_wpCaret); + if (m_wpCaret == m_wpOldCaret) + return false; + + if (bAddUndo && m_bEnableUndo) { + if (m_wpCaret.SecCmp(m_wpOldCaret) != 0) { + AddEditUndoItem(pdfium::MakeUnique( + this, m_wpOldCaret, m_wpCaret, word.Word, word.nCharset, + section.SecProps, section.WordProps)); + } else { + AddEditUndoItem(pdfium::MakeUnique( + this, m_wpOldCaret, m_wpCaret, word.Word, word.nCharset, + section.SecProps, word.WordProps)); + } + } + if (bPaint) { + RearrangePart(CPVT_WordRange(m_wpCaret, m_wpOldCaret)); + ScrollToCaret(); + Refresh(); + SetCaretOrigin(); + SetCaretInfo(); + } + if (m_bOprNotify && m_pOprNotify) + m_pOprNotify->OnBackSpace(m_wpCaret, m_wpOldCaret); + + return true; +} + +bool CFX_Edit::Delete(bool bAddUndo, bool bPaint) { + if (!m_pVT->IsValid() || m_wpCaret == m_pVT->GetEndWordPlace()) + return false; + + CPVT_Section section; + CPVT_Word word; + if (bAddUndo) { + CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator(); + pIterator->SetAt(m_pVT->GetNextWordPlace(m_wpCaret)); + pIterator->GetSection(section); + pIterator->GetWord(word); + } + m_pVT->UpdateWordPlace(m_wpCaret); + bool bSecEnd = (m_wpCaret == m_pVT->GetSectionEndPlace(m_wpCaret)); + SetCaret(m_pVT->DeleteWord(m_wpCaret)); + m_SelState.Set(m_wpCaret, m_wpCaret); + if (bAddUndo && m_bEnableUndo) { + if (bSecEnd) { + AddEditUndoItem(pdfium::MakeUnique( + this, m_wpOldCaret, m_wpCaret, word.Word, word.nCharset, + section.SecProps, section.WordProps, bSecEnd)); + } else { + AddEditUndoItem(pdfium::MakeUnique( + this, m_wpOldCaret, m_wpCaret, word.Word, word.nCharset, + section.SecProps, word.WordProps, bSecEnd)); + } + } + if (bPaint) { + RearrangePart(CPVT_WordRange(m_wpOldCaret, m_wpCaret)); + ScrollToCaret(); + Refresh(); + SetCaretOrigin(); + SetCaretInfo(); + } + if (m_bOprNotify && m_pOprNotify) + m_pOprNotify->OnDelete(m_wpCaret, m_wpOldCaret); + + return true; +} + +bool CFX_Edit::Empty() { + if (m_pVT->IsValid()) { + m_pVT->DeleteWords(GetWholeWordRange()); + SetCaret(m_pVT->GetBeginWordPlace()); + + return true; + } + + return false; +} + +bool CFX_Edit::Clear(bool bAddUndo, bool bPaint) { + if (!m_pVT->IsValid() || !m_SelState.IsExist()) + return false; + + CPVT_WordRange range = m_SelState.ConvertToWordRange(); + if (bAddUndo && m_bEnableUndo) + AddEditUndoItem(pdfium::MakeUnique(this, range, GetSelText())); + + SelectNone(); + SetCaret(m_pVT->DeleteWords(range)); + m_SelState.Set(m_wpCaret, m_wpCaret); + if (bPaint) { + RearrangePart(range); + ScrollToCaret(); + Refresh(); + SetCaretOrigin(); + SetCaretInfo(); + } + if (m_bOprNotify && m_pOprNotify) + m_pOprNotify->OnClear(m_wpCaret, m_wpOldCaret); + + return true; +} + +bool CFX_Edit::InsertText(const CFX_WideString& sText, + int32_t charset, + bool bAddUndo, + bool bPaint) { + if (IsTextOverflow()) + return false; + + m_pVT->UpdateWordPlace(m_wpCaret); + SetCaret(DoInsertText(m_wpCaret, sText, charset)); + m_SelState.Set(m_wpCaret, m_wpCaret); + if (m_wpCaret == m_wpOldCaret) + return false; + + if (bAddUndo && m_bEnableUndo) { + AddEditUndoItem(pdfium::MakeUnique( + this, m_wpOldCaret, m_wpCaret, sText, charset)); + } + if (bPaint) + PaintInsertText(m_wpOldCaret, m_wpCaret); + + if (m_bOprNotify && m_pOprNotify) + m_pOprNotify->OnInsertText(m_wpCaret, m_wpOldCaret); + + return true; +} + +void CFX_Edit::PaintInsertText(const CPVT_WordPlace& wpOld, + const CPVT_WordPlace& wpNew) { + if (m_pVT->IsValid()) { + RearrangePart(CPVT_WordRange(wpOld, wpNew)); + ScrollToCaret(); + Refresh(); + SetCaretOrigin(); + SetCaretInfo(); + } +} + +bool CFX_Edit::Redo() { + if (m_bEnableUndo) { + if (m_Undo.CanRedo()) { + m_Undo.Redo(); + return true; + } + } + + return false; +} + +bool CFX_Edit::Undo() { + if (m_bEnableUndo) { + if (m_Undo.CanUndo()) { + m_Undo.Undo(); + return true; + } + } + + return false; +} + +void CFX_Edit::SetCaretOrigin() { + if (!m_pVT->IsValid()) + return; + + CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator(); + pIterator->SetAt(m_wpCaret); + CPVT_Word word; + CPVT_Line line; + if (pIterator->GetWord(word)) { + m_ptCaret.x = word.ptWord.x + word.fWidth; + m_ptCaret.y = word.ptWord.y; + } else if (pIterator->GetLine(line)) { + m_ptCaret.x = line.ptLine.x; + m_ptCaret.y = line.ptLine.y; + } +} + +int32_t CFX_Edit::WordPlaceToWordIndex(const CPVT_WordPlace& place) const { + if (m_pVT->IsValid()) + return m_pVT->WordPlaceToWordIndex(place); + + return -1; +} + +CPVT_WordPlace CFX_Edit::WordIndexToWordPlace(int32_t index) const { + if (m_pVT->IsValid()) + return m_pVT->WordIndexToWordPlace(index); + + return CPVT_WordPlace(); +} + +bool CFX_Edit::IsTextFull() const { + int32_t nTotalWords = m_pVT->GetTotalWords(); + int32_t nLimitChar = m_pVT->GetLimitChar(); + int32_t nCharArray = m_pVT->GetCharArray(); + + return IsTextOverflow() || (nLimitChar > 0 && nTotalWords >= nLimitChar) || + (nCharArray > 0 && nTotalWords >= nCharArray); +} + +bool CFX_Edit::IsTextOverflow() const { + if (!m_bEnableScroll && !m_bEnableOverflow) { + CFX_FloatRect rcPlate = m_pVT->GetPlateRect(); + CFX_FloatRect rcContent = m_pVT->GetContentRect(); + + if (m_pVT->IsMultiLine() && GetTotalLines() > 1 && + IsFloatBigger(rcContent.Height(), rcPlate.Height())) { + return true; + } + + if (IsFloatBigger(rcContent.Width(), rcPlate.Width())) + return true; + } + + return false; +} + +bool CFX_Edit::CanUndo() const { + if (m_bEnableUndo) { + return m_Undo.CanUndo(); + } + + return false; +} + +bool CFX_Edit::CanRedo() const { + if (m_bEnableUndo) { + return m_Undo.CanRedo(); + } + + return false; +} + +void CFX_Edit::EnableRefresh(bool bRefresh) { + m_bEnableRefresh = bRefresh; +} + +void CFX_Edit::EnableUndo(bool bUndo) { + m_bEnableUndo = bUndo; +} + +void CFX_Edit::EnableOprNotify(bool bNotify) { + m_bOprNotify = bNotify; +} + +CPVT_WordPlace CFX_Edit::DoInsertText(const CPVT_WordPlace& place, + const CFX_WideString& sText, + int32_t charset) { + CPVT_WordPlace wp = place; + + if (m_pVT->IsValid()) { + for (int32_t i = 0, sz = sText.GetLength(); i < sz; i++) { + uint16_t word = sText[i]; + switch (word) { + case 0x0D: + wp = m_pVT->InsertSection(wp, nullptr, nullptr); + if (sText[i + 1] == 0x0A) + i++; + break; + case 0x0A: + wp = m_pVT->InsertSection(wp, nullptr, nullptr); + if (sText[i + 1] == 0x0D) + i++; + break; + case 0x09: + word = 0x20; + default: + wp = m_pVT->InsertWord(wp, word, GetCharSetFromUnicode(word, charset), + nullptr); + break; + } + } + } + + return wp; +} + +int32_t CFX_Edit::GetCharSetFromUnicode(uint16_t word, int32_t nOldCharset) { + if (IPVT_FontMap* pFontMap = GetFontMap()) + return pFontMap->CharSetFromUnicode(word, nOldCharset); + return nOldCharset; +} + +void CFX_Edit::AddEditUndoItem( + std::unique_ptr pEditUndoItem) { + if (m_pGroupUndoItem) + m_pGroupUndoItem->AddUndoItem(std::move(pEditUndoItem)); + else + m_Undo.AddItem(std::move(pEditUndoItem)); +} + +CFX_Edit_LineRectArray::CFX_Edit_LineRectArray() {} + +CFX_Edit_LineRectArray::~CFX_Edit_LineRectArray() {} + +void CFX_Edit_LineRectArray::operator=(CFX_Edit_LineRectArray&& that) { + m_LineRects = std::move(that.m_LineRects); +} + +void CFX_Edit_LineRectArray::Add(const CPVT_WordRange& wrLine, + const CFX_FloatRect& rcLine) { + m_LineRects.push_back(pdfium::MakeUnique(wrLine, rcLine)); +} + +int32_t CFX_Edit_LineRectArray::GetSize() const { + return pdfium::CollectionSize(m_LineRects); +} + +CFX_Edit_LineRect* CFX_Edit_LineRectArray::GetAt(int32_t nIndex) const { + if (nIndex < 0 || nIndex >= GetSize()) + return nullptr; + + return m_LineRects[nIndex].get(); +} + +CFX_Edit_Select::CFX_Edit_Select() {} + +CFX_Edit_Select::CFX_Edit_Select(const CPVT_WordPlace& begin, + const CPVT_WordPlace& end) { + Set(begin, end); +} + +CFX_Edit_Select::CFX_Edit_Select(const CPVT_WordRange& range) { + Set(range.BeginPos, range.EndPos); +} + +CPVT_WordRange CFX_Edit_Select::ConvertToWordRange() const { + return CPVT_WordRange(BeginPos, EndPos); +} + +void CFX_Edit_Select::Default() { + BeginPos.Default(); + EndPos.Default(); +} + +void CFX_Edit_Select::Set(const CPVT_WordPlace& begin, + const CPVT_WordPlace& end) { + BeginPos = begin; + EndPos = end; +} + +void CFX_Edit_Select::SetBeginPos(const CPVT_WordPlace& begin) { + BeginPos = begin; +} + +void CFX_Edit_Select::SetEndPos(const CPVT_WordPlace& end) { + EndPos = end; +} + +bool CFX_Edit_Select::IsExist() const { + return BeginPos != EndPos; +} + +CFX_Edit_RectArray::CFX_Edit_RectArray() {} + +CFX_Edit_RectArray::~CFX_Edit_RectArray() {} + +void CFX_Edit_RectArray::Clear() { + m_Rects.clear(); +} + +void CFX_Edit_RectArray::Add(const CFX_FloatRect& rect) { + // check for overlapped area + for (const auto& pRect : m_Rects) { + if (pRect && pRect->Contains(rect)) + return; + } + m_Rects.push_back(pdfium::MakeUnique(rect)); +} + +int32_t CFX_Edit_RectArray::GetSize() const { + return pdfium::CollectionSize(m_Rects); +} + +CFX_FloatRect* CFX_Edit_RectArray::GetAt(int32_t nIndex) const { + if (nIndex < 0 || nIndex >= GetSize()) + return nullptr; + + return m_Rects[nIndex].get(); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_edit.h b/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_edit.h new file mode 100644 index 000000000000..ab83af2e3bc5 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_edit.h @@ -0,0 +1,545 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FXEDIT_FXET_EDIT_H_ +#define FPDFSDK_FXEDIT_FXET_EDIT_H_ + +#include +#include +#include + +#include "core/fpdfdoc/cpvt_secprops.h" +#include "core/fpdfdoc/cpvt_wordprops.h" +#include "fpdfsdk/fxedit/fx_edit.h" + +class CFFL_FormFiller; +class CFX_Edit; +class CFX_Edit_Iterator; +class CFX_Edit_Provider; +class CFX_RenderDevice; +class CFX_SystemHandler; +class CPDF_PageObjectHolder; +class CPDF_TextObject; +class CPWL_Edit; +class CPWL_EditCtrl; + +class IFX_Edit_UndoItem; + +struct CFX_Edit_LineRect { + CFX_Edit_LineRect(const CPVT_WordRange& wrLine, const CFX_FloatRect& rcLine) + : m_wrLine(wrLine), m_rcLine(rcLine) {} + + CPVT_WordRange m_wrLine; + CFX_FloatRect m_rcLine; +}; + +class CFX_Edit_LineRectArray { + public: + CFX_Edit_LineRectArray(); + virtual ~CFX_Edit_LineRectArray(); + + void operator=(CFX_Edit_LineRectArray&& rects); + void Add(const CPVT_WordRange& wrLine, const CFX_FloatRect& rcLine); + + int32_t GetSize() const; + CFX_Edit_LineRect* GetAt(int32_t nIndex) const; + + private: + std::vector> m_LineRects; +}; + +class CFX_Edit_RectArray { + public: + CFX_Edit_RectArray(); + virtual ~CFX_Edit_RectArray(); + + void Clear(); + void Add(const CFX_FloatRect& rect); + + int32_t GetSize() const; + CFX_FloatRect* GetAt(int32_t nIndex) const; + + private: + std::vector> m_Rects; +}; + +class CFX_Edit_Refresh { + public: + CFX_Edit_Refresh(); + virtual ~CFX_Edit_Refresh(); + + void BeginRefresh(); + void Push(const CPVT_WordRange& linerange, const CFX_FloatRect& rect); + void NoAnalyse(); + void AddRefresh(const CFX_FloatRect& rect); + const CFX_Edit_RectArray* GetRefreshRects() const; + void EndRefresh(); + + private: + CFX_Edit_LineRectArray m_NewLineRects; + CFX_Edit_LineRectArray m_OldLineRects; + CFX_Edit_RectArray m_RefreshRects; +}; + +class CFX_Edit_Select { + public: + CFX_Edit_Select(); + CFX_Edit_Select(const CPVT_WordPlace& begin, const CPVT_WordPlace& end); + explicit CFX_Edit_Select(const CPVT_WordRange& range); + + void Default(); + void Set(const CPVT_WordPlace& begin, const CPVT_WordPlace& end); + void SetBeginPos(const CPVT_WordPlace& begin); + void SetEndPos(const CPVT_WordPlace& end); + + CPVT_WordRange ConvertToWordRange() const; + bool IsExist() const; + + CPVT_WordPlace BeginPos; + CPVT_WordPlace EndPos; +}; + +class CFX_Edit_Undo { + public: + explicit CFX_Edit_Undo(int32_t nBufsize); + virtual ~CFX_Edit_Undo(); + + void AddItem(std::unique_ptr pItem); + void Undo(); + void Redo(); + bool CanUndo() const; + bool CanRedo() const; + bool IsModified() const; + void Reset(); + + private: + void RemoveHeads(); + void RemoveTails(); + + std::deque> m_UndoItemStack; + size_t m_nCurUndoPos; + size_t m_nBufSize; + bool m_bModified; + bool m_bVirgin; + bool m_bWorking; +}; + +class IFX_Edit_UndoItem { + public: + virtual ~IFX_Edit_UndoItem() {} + + virtual void Undo() = 0; + virtual void Redo() = 0; + virtual CFX_WideString GetUndoTitle() const = 0; +}; + +class CFX_Edit_UndoItem : public IFX_Edit_UndoItem { + public: + CFX_Edit_UndoItem(); + ~CFX_Edit_UndoItem() override; + + CFX_WideString GetUndoTitle() const override; + + void SetFirst(bool bFirst); + void SetLast(bool bLast); + bool IsLast(); + + private: + bool m_bFirst; + bool m_bLast; +}; + +class CFX_Edit_GroupUndoItem : public IFX_Edit_UndoItem { + public: + explicit CFX_Edit_GroupUndoItem(const CFX_WideString& sTitle); + ~CFX_Edit_GroupUndoItem() override; + + // IFX_Edit_UndoItem + void Undo() override; + void Redo() override; + CFX_WideString GetUndoTitle() const override; + + void AddUndoItem(std::unique_ptr pUndoItem); + void UpdateItems(); + + private: + CFX_WideString m_sTitle; + std::vector> m_Items; +}; + +class CFXEU_InsertWord : public CFX_Edit_UndoItem { + public: + CFXEU_InsertWord(CFX_Edit* pEdit, + const CPVT_WordPlace& wpOldPlace, + const CPVT_WordPlace& wpNewPlace, + uint16_t word, + int32_t charset, + const CPVT_WordProps* pWordProps); + ~CFXEU_InsertWord() override; + + // CFX_Edit_UndoItem + void Redo() override; + void Undo() override; + + private: + CFX_Edit* m_pEdit; + + CPVT_WordPlace m_wpOld; + CPVT_WordPlace m_wpNew; + uint16_t m_Word; + int32_t m_nCharset; + CPVT_WordProps m_WordProps; +}; + +class CFXEU_InsertReturn : public CFX_Edit_UndoItem { + public: + CFXEU_InsertReturn(CFX_Edit* pEdit, + const CPVT_WordPlace& wpOldPlace, + const CPVT_WordPlace& wpNewPlace, + const CPVT_SecProps* pSecProps, + const CPVT_WordProps* pWordProps); + ~CFXEU_InsertReturn() override; + + // CFX_Edit_UndoItem + void Redo() override; + void Undo() override; + + private: + CFX_Edit* m_pEdit; + + CPVT_WordPlace m_wpOld; + CPVT_WordPlace m_wpNew; + CPVT_SecProps m_SecProps; + CPVT_WordProps m_WordProps; +}; + +class CFXEU_Backspace : public CFX_Edit_UndoItem { + public: + CFXEU_Backspace(CFX_Edit* pEdit, + const CPVT_WordPlace& wpOldPlace, + const CPVT_WordPlace& wpNewPlace, + uint16_t word, + int32_t charset, + const CPVT_SecProps& SecProps, + const CPVT_WordProps& WordProps); + ~CFXEU_Backspace() override; + + // CFX_Edit_UndoItem + void Redo() override; + void Undo() override; + + private: + CFX_Edit* m_pEdit; + + CPVT_WordPlace m_wpOld; + CPVT_WordPlace m_wpNew; + uint16_t m_Word; + int32_t m_nCharset; + CPVT_SecProps m_SecProps; + CPVT_WordProps m_WordProps; +}; + +class CFXEU_Delete : public CFX_Edit_UndoItem { + public: + CFXEU_Delete(CFX_Edit* pEdit, + const CPVT_WordPlace& wpOldPlace, + const CPVT_WordPlace& wpNewPlace, + uint16_t word, + int32_t charset, + const CPVT_SecProps& SecProps, + const CPVT_WordProps& WordProps, + bool bSecEnd); + ~CFXEU_Delete() override; + + // CFX_Edit_UndoItem + void Redo() override; + void Undo() override; + + private: + CFX_Edit* m_pEdit; + + CPVT_WordPlace m_wpOld; + CPVT_WordPlace m_wpNew; + uint16_t m_Word; + int32_t m_nCharset; + CPVT_SecProps m_SecProps; + CPVT_WordProps m_WordProps; + bool m_bSecEnd; +}; + +class CFXEU_Clear : public CFX_Edit_UndoItem { + public: + CFXEU_Clear(CFX_Edit* pEdit, + const CPVT_WordRange& wrSel, + const CFX_WideString& swText); + ~CFXEU_Clear() override; + + // CFX_Edit_UndoItem + void Redo() override; + void Undo() override; + + private: + CFX_Edit* m_pEdit; + + CPVT_WordRange m_wrSel; + CFX_WideString m_swText; +}; + +class CFXEU_InsertText : public CFX_Edit_UndoItem { + public: + CFXEU_InsertText(CFX_Edit* pEdit, + const CPVT_WordPlace& wpOldPlace, + const CPVT_WordPlace& wpNewPlace, + const CFX_WideString& swText, + int32_t charset); + ~CFXEU_InsertText() override; + + // CFX_Edit_UndoItem + void Redo() override; + void Undo() override; + + private: + CFX_Edit* m_pEdit; + + CPVT_WordPlace m_wpOld; + CPVT_WordPlace m_wpNew; + CFX_WideString m_swText; + int32_t m_nCharset; +}; + +class CFX_Edit { + public: + static CFX_ByteString GetEditAppearanceStream(CFX_Edit* pEdit, + const CFX_PointF& ptOffset, + const CPVT_WordRange* pRange, + bool bContinuous, + uint16_t SubWord); + static CFX_ByteString GetSelectAppearanceStream(CFX_Edit* pEdit, + const CFX_PointF& ptOffset, + const CPVT_WordRange* pRange); + static void DrawEdit(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + CFX_Edit* pEdit, + FX_COLORREF crTextFill, + const CFX_FloatRect& rcClip, + const CFX_PointF& ptOffset, + const CPVT_WordRange* pRange, + CFX_SystemHandler* pSystemHandler, + CFFL_FormFiller* pFFLData); + + CFX_Edit(); + ~CFX_Edit(); + + void SetFontMap(IPVT_FontMap* pFontMap); + void SetNotify(CPWL_EditCtrl* pNotify); + void SetOprNotify(CPWL_Edit* pOprNotify); + + // Returns an iterator for the contents. Should not be released. + CFX_Edit_Iterator* GetIterator(); + IPVT_FontMap* GetFontMap(); + void Initialize(); + + // Set the bounding box of the text area. + void SetPlateRect(const CFX_FloatRect& rect); + void SetScrollPos(const CFX_PointF& point); + + // Set the horizontal text alignment. (nFormat [0:left, 1:middle, 2:right]) + void SetAlignmentH(int32_t nFormat, bool bPaint); + // Set the vertical text alignment. (nFormat [0:left, 1:middle, 2:right]) + void SetAlignmentV(int32_t nFormat, bool bPaint); + + // Set the substitution character for hidden text. + void SetPasswordChar(uint16_t wSubWord, bool bPaint); + + // Set the maximum number of words in the text. + void SetLimitChar(int32_t nLimitChar); + void SetCharArray(int32_t nCharArray); + void SetCharSpace(FX_FLOAT fCharSpace); + void SetMultiLine(bool bMultiLine, bool bPaint); + void SetAutoReturn(bool bAuto, bool bPaint); + void SetAutoFontSize(bool bAuto, bool bPaint); + void SetAutoScroll(bool bAuto, bool bPaint); + void SetFontSize(FX_FLOAT fFontSize); + void SetTextOverflow(bool bAllowed, bool bPaint); + void OnMouseDown(const CFX_PointF& point, bool bShift, bool bCtrl); + void OnMouseMove(const CFX_PointF& point, bool bShift, bool bCtrl); + void OnVK_UP(bool bShift, bool bCtrl); + void OnVK_DOWN(bool bShift, bool bCtrl); + void OnVK_LEFT(bool bShift, bool bCtrl); + void OnVK_RIGHT(bool bShift, bool bCtrl); + void OnVK_HOME(bool bShift, bool bCtrl); + void OnVK_END(bool bShift, bool bCtrl); + void SetText(const CFX_WideString& sText); + bool InsertWord(uint16_t word, int32_t charset); + bool InsertReturn(); + bool Backspace(); + bool Delete(); + bool Clear(); + bool InsertText(const CFX_WideString& sText, int32_t charset); + bool Redo(); + bool Undo(); + int32_t WordPlaceToWordIndex(const CPVT_WordPlace& place) const; + CPVT_WordPlace WordIndexToWordPlace(int32_t index) const; + CPVT_WordPlace SearchWordPlace(const CFX_PointF& point) const; + int32_t GetCaret() const; + CPVT_WordPlace GetCaretWordPlace() const; + CFX_WideString GetSelText() const; + CFX_WideString GetText() const; + FX_FLOAT GetFontSize() const; + uint16_t GetPasswordChar() const; + CFX_PointF GetScrollPos() const; + int32_t GetCharArray() const; + CFX_FloatRect GetContentRect() const; + CFX_WideString GetRangeText(const CPVT_WordRange& range) const; + int32_t GetHorzScale() const; + FX_FLOAT GetCharSpace() const; + int32_t GetTotalWords() const; + void SetSel(int32_t nStartChar, int32_t nEndChar); + void GetSel(int32_t& nStartChar, int32_t& nEndChar) const; + void SelectAll(); + void SelectNone(); + bool IsSelected() const; + void Paint(); + void EnableRefresh(bool bRefresh); + void RefreshWordRange(const CPVT_WordRange& wr); + void SetCaret(int32_t nPos); + CPVT_WordRange GetWholeWordRange() const; + CPVT_WordRange GetSelectWordRange() const; + void EnableUndo(bool bUndo); + void EnableOprNotify(bool bNotify); + bool IsTextFull() const; + bool IsTextOverflow() const; + bool CanUndo() const; + bool CanRedo() const; + CPVT_WordRange GetVisibleWordRange() const; + + bool Empty(); + + CPVT_WordPlace DoInsertText(const CPVT_WordPlace& place, + const CFX_WideString& sText, + int32_t charset); + int32_t GetCharSetFromUnicode(uint16_t word, int32_t nOldCharset); + + int32_t GetTotalLines() const; + + private: + friend class CFX_Edit_Iterator; + friend class CFXEU_InsertWord; + friend class CFXEU_InsertReturn; + friend class CFXEU_Backspace; + friend class CFXEU_Delete; + friend class CFXEU_Clear; + friend class CFXEU_InsertText; + + void SetSel(const CPVT_WordPlace& begin, const CPVT_WordPlace& end); + + void RearrangeAll(); + void RearrangePart(const CPVT_WordRange& range); + void ScrollToCaret(); + void SetScrollInfo(); + void SetScrollPosX(FX_FLOAT fx); + void SetScrollPosY(FX_FLOAT fy); + void SetScrollLimit(); + void SetContentChanged(); + + bool InsertWord(uint16_t word, + int32_t charset, + const CPVT_WordProps* pWordProps, + bool bAddUndo, + bool bPaint); + bool InsertReturn(const CPVT_SecProps* pSecProps, + const CPVT_WordProps* pWordProps, + bool bAddUndo, + bool bPaint); + bool Backspace(bool bAddUndo, bool bPaint); + bool Delete(bool bAddUndo, bool bPaint); + bool Clear(bool bAddUndo, bool bPaint); + bool InsertText(const CFX_WideString& sText, + int32_t charset, + bool bAddUndo, + bool bPaint); + void PaintInsertText(const CPVT_WordPlace& wpOld, + const CPVT_WordPlace& wpNew); + + inline CFX_PointF VTToEdit(const CFX_PointF& point) const; + inline CFX_PointF EditToVT(const CFX_PointF& point) const; + inline CFX_FloatRect VTToEdit(const CFX_FloatRect& rect) const; + + void Refresh(); + void RefreshPushLineRects(const CPVT_WordRange& wr); + + void SetCaret(const CPVT_WordPlace& place); + void SetCaretInfo(); + void SetCaretOrigin(); + + void AddEditUndoItem(std::unique_ptr pEditUndoItem); + + private: + std::unique_ptr m_pVT; + CPWL_EditCtrl* m_pNotify; + CPWL_Edit* m_pOprNotify; + std::unique_ptr m_pVTProvider; + CPVT_WordPlace m_wpCaret; + CPVT_WordPlace m_wpOldCaret; + CFX_Edit_Select m_SelState; + CFX_PointF m_ptScrollPos; + CFX_PointF m_ptRefreshScrollPos; + bool m_bEnableScroll; + std::unique_ptr m_pIterator; + CFX_Edit_Refresh m_Refresh; + CFX_PointF m_ptCaret; + CFX_Edit_Undo m_Undo; + int32_t m_nAlignment; + bool m_bNotifyFlag; + bool m_bEnableOverflow; + bool m_bEnableRefresh; + CFX_FloatRect m_rcOldContent; + bool m_bEnableUndo; + bool m_bOprNotify; + CFX_Edit_GroupUndoItem* m_pGroupUndoItem; +}; + +class CFX_Edit_Iterator { + public: + CFX_Edit_Iterator(CFX_Edit* pEdit, CPDF_VariableText::Iterator* pVTIterator); + ~CFX_Edit_Iterator(); + + bool NextWord(); + bool PrevWord(); + bool GetWord(CPVT_Word& word) const; + bool GetLine(CPVT_Line& line) const; + bool GetSection(CPVT_Section& section) const; + void SetAt(int32_t nWordIndex); + void SetAt(const CPVT_WordPlace& place); + const CPVT_WordPlace& GetAt() const; + + private: + CFX_Edit* m_pEdit; + CPDF_VariableText::Iterator* m_pVTIterator; +}; + +class CFX_Edit_Provider : public CPDF_VariableText::Provider { + public: + explicit CFX_Edit_Provider(IPVT_FontMap* pFontMap); + ~CFX_Edit_Provider() override; + + IPVT_FontMap* GetFontMap(); + + // CPDF_VariableText::Provider: + int32_t GetCharWidth(int32_t nFontIndex, uint16_t word) override; + int32_t GetTypeAscent(int32_t nFontIndex) override; + int32_t GetTypeDescent(int32_t nFontIndex) override; + int32_t GetWordFontIndex(uint16_t word, + int32_t charset, + int32_t nFontIndex) override; + int32_t GetDefaultFontIndex() override; + bool IsLatinWord(uint16_t word) override; + + private: + IPVT_FontMap* m_pFontMap; +}; + +#endif // FPDFSDK_FXEDIT_FXET_EDIT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_list.cpp b/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_list.cpp new file mode 100644 index 000000000000..39877c955fe4 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_list.cpp @@ -0,0 +1,784 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/fxedit/fxet_list.h" + +#include "core/fpdfdoc/cpvt_word.h" +#include "fpdfsdk/fxedit/fxet_edit.h" +#include "fpdfsdk/pdfwindow/PWL_ListBox.h" + +CFX_ListItem::CFX_ListItem() + : m_pEdit(new CFX_Edit), + m_bSelected(false), + m_rcListItem(0.0f, 0.0f, 0.0f, 0.0f) { + m_pEdit->SetAlignmentV(1, true); + m_pEdit->Initialize(); +} + +CFX_ListItem::~CFX_ListItem() { +} + +void CFX_ListItem::SetFontMap(IPVT_FontMap* pFontMap) { + m_pEdit->SetFontMap(pFontMap); +} + +CFX_Edit* CFX_ListItem::GetEdit() const { + return m_pEdit.get(); +} + +CFX_Edit_Iterator* CFX_ListItem::GetIterator() const { + return m_pEdit->GetIterator(); +} + +void CFX_ListItem::SetRect(const CLST_Rect& rect) { + m_rcListItem = rect; +} + +CLST_Rect CFX_ListItem::GetRect() const { + return m_rcListItem; +} + +bool CFX_ListItem::IsSelected() const { + return m_bSelected; +} + +void CFX_ListItem::SetSelect(bool bSelected) { + m_bSelected = bSelected; +} + +void CFX_ListItem::SetText(const CFX_WideString& text) { + m_pEdit->SetText(text); +} + +void CFX_ListItem::SetFontSize(FX_FLOAT fFontSize) { + m_pEdit->SetFontSize(fFontSize); +} + +FX_FLOAT CFX_ListItem::GetItemHeight() const { + return m_pEdit->GetContentRect().Height(); +} + +uint16_t CFX_ListItem::GetFirstChar() const { + CPVT_Word word; + CFX_Edit_Iterator* pIterator = GetIterator(); + pIterator->SetAt(1); + pIterator->GetWord(word); + return word.Word; +} + +CFX_WideString CFX_ListItem::GetText() const { + return m_pEdit->GetText(); +} + +CFX_ListContainer::CFX_ListContainer() {} + +CFX_ListContainer::~CFX_ListContainer() {} + +void CFX_ListContainer::SetPlateRect(const CFX_FloatRect& rect) { + m_rcPlate = rect; +} + +CPLST_Select::CPLST_Select() {} + +CPLST_Select::~CPLST_Select() { + for (int32_t i = 0, sz = m_aItems.GetSize(); i < sz; i++) + delete m_aItems.GetAt(i); + + m_aItems.RemoveAll(); +} + +void CPLST_Select::Add(int32_t nItemIndex) { + int32_t nIndex = Find(nItemIndex); + + if (nIndex < 0) { + m_aItems.Add(new CPLST_Select_Item(nItemIndex, 1)); + } else { + if (CPLST_Select_Item* pItem = m_aItems.GetAt(nIndex)) { + pItem->nState = 1; + } + } +} + +void CPLST_Select::Add(int32_t nBeginIndex, int32_t nEndIndex) { + if (nBeginIndex > nEndIndex) { + int32_t nTemp = nEndIndex; + nEndIndex = nBeginIndex; + nBeginIndex = nTemp; + } + + for (int32_t i = nBeginIndex; i <= nEndIndex; i++) + Add(i); +} + +void CPLST_Select::Sub(int32_t nItemIndex) { + for (int32_t i = m_aItems.GetSize() - 1; i >= 0; i--) { + if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) + if (pItem->nItemIndex == nItemIndex) + pItem->nState = -1; + } +} + +void CPLST_Select::Sub(int32_t nBeginIndex, int32_t nEndIndex) { + if (nBeginIndex > nEndIndex) { + int32_t nTemp = nEndIndex; + nEndIndex = nBeginIndex; + nBeginIndex = nTemp; + } + + for (int32_t i = nBeginIndex; i <= nEndIndex; i++) + Sub(i); +} + +int32_t CPLST_Select::Find(int32_t nItemIndex) const { + for (int32_t i = 0, sz = m_aItems.GetSize(); i < sz; i++) { + if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) { + if (pItem->nItemIndex == nItemIndex) + return i; + } + } + + return -1; +} + +bool CPLST_Select::IsExist(int32_t nItemIndex) const { + return Find(nItemIndex) >= 0; +} + +int32_t CPLST_Select::GetCount() const { + return m_aItems.GetSize(); +} + +int32_t CPLST_Select::GetItemIndex(int32_t nIndex) const { + if (nIndex >= 0 && nIndex < m_aItems.GetSize()) + if (CPLST_Select_Item* pItem = m_aItems.GetAt(nIndex)) + return pItem->nItemIndex; + + return -1; +} + +int32_t CPLST_Select::GetState(int32_t nIndex) const { + if (nIndex >= 0 && nIndex < m_aItems.GetSize()) + if (CPLST_Select_Item* pItem = m_aItems.GetAt(nIndex)) + return pItem->nState; + + return 0; +} + +void CPLST_Select::DeselectAll() { + for (int32_t i = 0, sz = m_aItems.GetSize(); i < sz; i++) { + if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) { + pItem->nState = -1; + } + } +} + +void CPLST_Select::Done() { + for (int32_t i = m_aItems.GetSize() - 1; i >= 0; i--) { + if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) { + if (pItem->nState == -1) { + delete pItem; + m_aItems.RemoveAt(i); + } else { + pItem->nState = 0; + } + } + } +} + +CFX_ListCtrl::CFX_ListCtrl() + : m_pNotify(nullptr), + m_bNotifyFlag(false), + m_nSelItem(-1), + m_nFootIndex(-1), + m_bCtrlSel(false), + m_nCaretIndex(-1), + m_fFontSize(0.0f), + m_pFontMap(nullptr), + m_bMultiple(false) {} + +CFX_ListCtrl::~CFX_ListCtrl() { + Empty(); +} + +void CFX_ListCtrl::SetNotify(CPWL_List_Notify* pNotify) { + m_pNotify = pNotify; +} + +CFX_PointF CFX_ListCtrl::InToOut(const CFX_PointF& point) const { + CFX_FloatRect rcPlate = GetPlateRect(); + return CFX_PointF(point.x - (m_ptScrollPos.x - rcPlate.left), + point.y - (m_ptScrollPos.y - rcPlate.top)); +} + +CFX_PointF CFX_ListCtrl::OutToIn(const CFX_PointF& point) const { + CFX_FloatRect rcPlate = GetPlateRect(); + return CFX_PointF(point.x + (m_ptScrollPos.x - rcPlate.left), + point.y + (m_ptScrollPos.y - rcPlate.top)); +} + +CFX_FloatRect CFX_ListCtrl::InToOut(const CFX_FloatRect& rect) const { + CFX_PointF ptLeftBottom = InToOut(CFX_PointF(rect.left, rect.bottom)); + CFX_PointF ptRightTop = InToOut(CFX_PointF(rect.right, rect.top)); + return CFX_FloatRect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, + ptRightTop.y); +} + +CFX_FloatRect CFX_ListCtrl::OutToIn(const CFX_FloatRect& rect) const { + CFX_PointF ptLeftBottom = OutToIn(CFX_PointF(rect.left, rect.bottom)); + CFX_PointF ptRightTop = OutToIn(CFX_PointF(rect.right, rect.top)); + return CFX_FloatRect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, + ptRightTop.y); +} + +void CFX_ListCtrl::OnMouseDown(const CFX_PointF& point, + bool bShift, + bool bCtrl) { + int32_t nHitIndex = GetItemIndex(point); + + if (IsMultipleSel()) { + if (bCtrl) { + if (IsItemSelected(nHitIndex)) { + m_aSelItems.Sub(nHitIndex); + SelectItems(); + m_bCtrlSel = false; + } else { + m_aSelItems.Add(nHitIndex); + SelectItems(); + m_bCtrlSel = true; + } + + m_nFootIndex = nHitIndex; + } else if (bShift) { + m_aSelItems.DeselectAll(); + m_aSelItems.Add(m_nFootIndex, nHitIndex); + SelectItems(); + } else { + m_aSelItems.DeselectAll(); + m_aSelItems.Add(nHitIndex); + SelectItems(); + + m_nFootIndex = nHitIndex; + } + + SetCaret(nHitIndex); + } else { + SetSingleSelect(nHitIndex); + } + + if (!IsItemVisible(nHitIndex)) + ScrollToListItem(nHitIndex); +} + +void CFX_ListCtrl::OnMouseMove(const CFX_PointF& point, + bool bShift, + bool bCtrl) { + int32_t nHitIndex = GetItemIndex(point); + + if (IsMultipleSel()) { + if (bCtrl) { + if (m_bCtrlSel) + m_aSelItems.Add(m_nFootIndex, nHitIndex); + else + m_aSelItems.Sub(m_nFootIndex, nHitIndex); + + SelectItems(); + } else { + m_aSelItems.DeselectAll(); + m_aSelItems.Add(m_nFootIndex, nHitIndex); + SelectItems(); + } + + SetCaret(nHitIndex); + } else { + SetSingleSelect(nHitIndex); + } + + if (!IsItemVisible(nHitIndex)) + ScrollToListItem(nHitIndex); +} + +void CFX_ListCtrl::OnVK(int32_t nItemIndex, bool bShift, bool bCtrl) { + if (IsMultipleSel()) { + if (nItemIndex >= 0 && nItemIndex < GetCount()) { + if (bCtrl) { + } else if (bShift) { + m_aSelItems.DeselectAll(); + m_aSelItems.Add(m_nFootIndex, nItemIndex); + SelectItems(); + } else { + m_aSelItems.DeselectAll(); + m_aSelItems.Add(nItemIndex); + SelectItems(); + m_nFootIndex = nItemIndex; + } + + SetCaret(nItemIndex); + } + } else { + SetSingleSelect(nItemIndex); + } + + if (!IsItemVisible(nItemIndex)) + ScrollToListItem(nItemIndex); +} + +void CFX_ListCtrl::OnVK_UP(bool bShift, bool bCtrl) { + OnVK(IsMultipleSel() ? GetCaret() - 1 : GetSelect() - 1, bShift, bCtrl); +} + +void CFX_ListCtrl::OnVK_DOWN(bool bShift, bool bCtrl) { + OnVK(IsMultipleSel() ? GetCaret() + 1 : GetSelect() + 1, bShift, bCtrl); +} + +void CFX_ListCtrl::OnVK_LEFT(bool bShift, bool bCtrl) { + OnVK(0, bShift, bCtrl); +} + +void CFX_ListCtrl::OnVK_RIGHT(bool bShift, bool bCtrl) { + OnVK(GetCount() - 1, bShift, bCtrl); +} + +void CFX_ListCtrl::OnVK_HOME(bool bShift, bool bCtrl) { + OnVK(0, bShift, bCtrl); +} + +void CFX_ListCtrl::OnVK_END(bool bShift, bool bCtrl) { + OnVK(GetCount() - 1, bShift, bCtrl); +} + +bool CFX_ListCtrl::OnChar(uint16_t nChar, bool bShift, bool bCtrl) { + int32_t nIndex = GetLastSelected(); + int32_t nFindIndex = FindNext(nIndex, nChar); + + if (nFindIndex != nIndex) { + OnVK(nFindIndex, bShift, bCtrl); + return true; + } + return false; +} + +void CFX_ListCtrl::SetPlateRect(const CFX_FloatRect& rect) { + CFX_ListContainer::SetPlateRect(rect); + m_ptScrollPos.x = rect.left; + SetScrollPos(CFX_PointF(rect.left, rect.top)); + ReArrange(0); + InvalidateItem(-1); +} + +CFX_FloatRect CFX_ListCtrl::GetItemRect(int32_t nIndex) const { + return InToOut(GetItemRectInternal(nIndex)); +} + +CFX_FloatRect CFX_ListCtrl::GetItemRectInternal(int32_t nIndex) const { + if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { + CFX_FloatRect rcItem = pListItem->GetRect(); + rcItem.left = 0.0f; + rcItem.right = GetPlateRect().Width(); + return InnerToOuter(CLST_Rect(rcItem)); + } + + return CFX_FloatRect(); +} + +int32_t CFX_ListCtrl::GetCaret() const { + return m_nCaretIndex; +} + +int32_t CFX_ListCtrl::GetSelect() const { + return m_nSelItem; +} + +void CFX_ListCtrl::AddString(const CFX_WideString& str) { + AddItem(str); + ReArrange(GetCount() - 1); +} + +void CFX_ListCtrl::SetMultipleSelect(int32_t nItemIndex, bool bSelected) { + if (!IsValid(nItemIndex)) + return; + + if (bSelected != IsItemSelected(nItemIndex)) { + if (bSelected) { + SetItemSelect(nItemIndex, true); + InvalidateItem(nItemIndex); + } else { + SetItemSelect(nItemIndex, false); + InvalidateItem(nItemIndex); + } + } +} + +void CFX_ListCtrl::SetSingleSelect(int32_t nItemIndex) { + if (!IsValid(nItemIndex)) + return; + + if (m_nSelItem != nItemIndex) { + if (m_nSelItem >= 0) { + SetItemSelect(m_nSelItem, false); + InvalidateItem(m_nSelItem); + } + + SetItemSelect(nItemIndex, true); + InvalidateItem(nItemIndex); + m_nSelItem = nItemIndex; + } +} + +void CFX_ListCtrl::SetCaret(int32_t nItemIndex) { + if (!IsValid(nItemIndex)) + return; + + if (IsMultipleSel()) { + int32_t nOldIndex = m_nCaretIndex; + + if (nOldIndex != nItemIndex) { + m_nCaretIndex = nItemIndex; + InvalidateItem(nOldIndex); + InvalidateItem(nItemIndex); + } + } +} + +void CFX_ListCtrl::InvalidateItem(int32_t nItemIndex) { + if (m_pNotify) { + if (nItemIndex == -1) { + if (!m_bNotifyFlag) { + m_bNotifyFlag = true; + CFX_FloatRect rcRefresh = GetPlateRect(); + m_pNotify->IOnInvalidateRect(&rcRefresh); + m_bNotifyFlag = false; + } + } else { + if (!m_bNotifyFlag) { + m_bNotifyFlag = true; + CFX_FloatRect rcRefresh = GetItemRect(nItemIndex); + rcRefresh.left -= 1.0f; + rcRefresh.right += 1.0f; + rcRefresh.bottom -= 1.0f; + rcRefresh.top += 1.0f; + + m_pNotify->IOnInvalidateRect(&rcRefresh); + m_bNotifyFlag = false; + } + } + } +} + +void CFX_ListCtrl::SelectItems() { + for (int32_t i = 0, sz = m_aSelItems.GetCount(); i < sz; i++) { + int32_t nItemIndex = m_aSelItems.GetItemIndex(i); + int32_t nState = m_aSelItems.GetState(i); + + switch (nState) { + case 1: + SetMultipleSelect(nItemIndex, true); + break; + case -1: + SetMultipleSelect(nItemIndex, false); + break; + } + } + + m_aSelItems.Done(); +} + +void CFX_ListCtrl::Select(int32_t nItemIndex) { + if (!IsValid(nItemIndex)) + return; + + if (IsMultipleSel()) { + m_aSelItems.Add(nItemIndex); + SelectItems(); + } else { + SetSingleSelect(nItemIndex); + } +} + +bool CFX_ListCtrl::IsItemVisible(int32_t nItemIndex) const { + CFX_FloatRect rcPlate = GetPlateRect(); + CFX_FloatRect rcItem = GetItemRect(nItemIndex); + + return rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top; +} + +void CFX_ListCtrl::ScrollToListItem(int32_t nItemIndex) { + if (!IsValid(nItemIndex)) + return; + + CFX_FloatRect rcPlate = GetPlateRect(); + CFX_FloatRect rcItem = GetItemRectInternal(nItemIndex); + CFX_FloatRect rcItemCtrl = GetItemRect(nItemIndex); + + if (IsFloatSmaller(rcItemCtrl.bottom, rcPlate.bottom)) { + if (IsFloatSmaller(rcItemCtrl.top, rcPlate.top)) { + SetScrollPosY(rcItem.bottom + rcPlate.Height()); + } + } else if (IsFloatBigger(rcItemCtrl.top, rcPlate.top)) { + if (IsFloatBigger(rcItemCtrl.bottom, rcPlate.bottom)) { + SetScrollPosY(rcItem.top); + } + } +} + +void CFX_ListCtrl::SetScrollInfo() { + if (m_pNotify) { + CFX_FloatRect rcPlate = GetPlateRect(); + CFX_FloatRect rcContent = GetContentRectInternal(); + + if (!m_bNotifyFlag) { + m_bNotifyFlag = true; + m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top, + rcContent.bottom, rcContent.top, + GetFirstHeight(), rcPlate.Height()); + m_bNotifyFlag = false; + } + } +} + +void CFX_ListCtrl::SetScrollPos(const CFX_PointF& point) { + SetScrollPosY(point.y); +} + +void CFX_ListCtrl::SetScrollPosY(FX_FLOAT fy) { + if (!IsFloatEqual(m_ptScrollPos.y, fy)) { + CFX_FloatRect rcPlate = GetPlateRect(); + CFX_FloatRect rcContent = GetContentRectInternal(); + + if (rcPlate.Height() > rcContent.Height()) { + fy = rcPlate.top; + } else { + if (IsFloatSmaller(fy - rcPlate.Height(), rcContent.bottom)) { + fy = rcContent.bottom + rcPlate.Height(); + } else if (IsFloatBigger(fy, rcContent.top)) { + fy = rcContent.top; + } + } + + m_ptScrollPos.y = fy; + InvalidateItem(-1); + + if (m_pNotify) { + if (!m_bNotifyFlag) { + m_bNotifyFlag = true; + m_pNotify->IOnSetScrollPosY(fy); + m_bNotifyFlag = false; + } + } + } +} + +CFX_FloatRect CFX_ListCtrl::GetContentRectInternal() const { + return InnerToOuter(CFX_ListContainer::GetContentRect()); +} + +CFX_FloatRect CFX_ListCtrl::GetContentRect() const { + return InToOut(GetContentRectInternal()); +} + +void CFX_ListCtrl::ReArrange(int32_t nItemIndex) { + FX_FLOAT fPosY = 0.0f; + + if (CFX_ListItem* pPrevItem = m_aListItems.GetAt(nItemIndex - 1)) + fPosY = pPrevItem->GetRect().bottom; + + for (int32_t i = nItemIndex, sz = m_aListItems.GetSize(); i < sz; i++) { + if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { + FX_FLOAT fListItemHeight = pListItem->GetItemHeight(); + pListItem->SetRect(CLST_Rect(0.0f, fPosY, 0.0f, fPosY + fListItemHeight)); + fPosY += fListItemHeight; + } + } + + SetContentRect(CLST_Rect(0.0f, 0.0f, 0.0f, fPosY)); + SetScrollInfo(); +} + +void CFX_ListCtrl::SetTopItem(int32_t nIndex) { + if (IsValid(nIndex)) { + GetPlateRect(); + CFX_FloatRect rcItem = GetItemRectInternal(nIndex); + SetScrollPosY(rcItem.top); + } +} + +int32_t CFX_ListCtrl::GetTopItem() const { + int32_t nItemIndex = GetItemIndex(GetBTPoint()); + + if (!IsItemVisible(nItemIndex) && IsItemVisible(nItemIndex + 1)) + nItemIndex += 1; + + return nItemIndex; +} + +void CFX_ListCtrl::Empty() { + for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) + delete m_aListItems.GetAt(i); + + m_aListItems.RemoveAll(); + + InvalidateItem(-1); +} + +void CFX_ListCtrl::Cancel() { + m_aSelItems.DeselectAll(); +} + +int32_t CFX_ListCtrl::GetItemIndex(const CFX_PointF& point) const { + CFX_PointF pt = OuterToInner(OutToIn(point)); + + bool bFirst = true; + bool bLast = true; + + for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { + if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { + CLST_Rect rcListItem = pListItem->GetRect(); + + if (IsFloatBigger(pt.y, rcListItem.top)) { + bFirst = false; + } + + if (IsFloatSmaller(pt.y, rcListItem.bottom)) { + bLast = false; + } + + if (pt.y >= rcListItem.top && pt.y < rcListItem.bottom) { + return i; + } + } + } + + if (bFirst) + return 0; + if (bLast) + return m_aListItems.GetSize() - 1; + + return -1; +} + +CFX_WideString CFX_ListCtrl::GetText() const { + if (IsMultipleSel()) + return GetItemText(m_nCaretIndex); + return GetItemText(m_nSelItem); +} + +void CFX_ListCtrl::SetFontMap(IPVT_FontMap* pFontMap) { + m_pFontMap = pFontMap; +} + +void CFX_ListCtrl::SetFontSize(FX_FLOAT fFontSize) { + m_fFontSize = fFontSize; +} + +void CFX_ListCtrl::AddItem(const CFX_WideString& str) { + CFX_ListItem* pListItem = new CFX_ListItem(); + pListItem->SetFontMap(m_pFontMap); + pListItem->SetFontSize(m_fFontSize); + pListItem->SetText(str); + m_aListItems.Add(pListItem); +} + +CFX_Edit* CFX_ListCtrl::GetItemEdit(int32_t nIndex) const { + if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { + return pListItem->GetEdit(); + } + + return nullptr; +} + +int32_t CFX_ListCtrl::GetCount() const { + return m_aListItems.GetSize(); +} + +CFX_FloatRect CFX_ListCtrl::GetPlateRect() const { + return CFX_ListContainer::GetPlateRect(); +} + +FX_FLOAT CFX_ListCtrl::GetFontSize() const { + return m_fFontSize; +} + +FX_FLOAT CFX_ListCtrl::GetFirstHeight() const { + if (CFX_ListItem* pListItem = m_aListItems.GetAt(0)) { + return pListItem->GetItemHeight(); + } + + return 1.0f; +} + +int32_t CFX_ListCtrl::GetFirstSelected() const { + for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { + if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { + if (pListItem->IsSelected()) + return i; + } + } + return -1; +} + +int32_t CFX_ListCtrl::GetLastSelected() const { + for (int32_t i = m_aListItems.GetSize() - 1; i >= 0; i--) { + if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { + if (pListItem->IsSelected()) + return i; + } + } + return -1; +} + +FX_WCHAR CFX_ListCtrl::Toupper(FX_WCHAR c) const { + if ((c >= 'a') && (c <= 'z')) + c = c - ('a' - 'A'); + return c; +} + +int32_t CFX_ListCtrl::FindNext(int32_t nIndex, FX_WCHAR nChar) const { + int32_t nCircleIndex = nIndex; + + for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { + nCircleIndex++; + if (nCircleIndex >= sz) + nCircleIndex = 0; + + if (CFX_ListItem* pListItem = m_aListItems.GetAt(nCircleIndex)) { + if (Toupper(pListItem->GetFirstChar()) == Toupper(nChar)) + return nCircleIndex; + } + } + + return nCircleIndex; +} + +bool CFX_ListCtrl::IsItemSelected(int32_t nIndex) const { + if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) + return pListItem->IsSelected(); + return false; +} + +void CFX_ListCtrl::SetItemSelect(int32_t nItemIndex, bool bSelected) { + if (CFX_ListItem* pListItem = m_aListItems.GetAt(nItemIndex)) { + pListItem->SetSelect(bSelected); + } +} + +void CFX_ListCtrl::SetMultipleSel(bool bMultiple) { + m_bMultiple = bMultiple; +} + +bool CFX_ListCtrl::IsMultipleSel() const { + return m_bMultiple; +} + +bool CFX_ListCtrl::IsValid(int32_t nItemIndex) const { + return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize(); +} + +CFX_WideString CFX_ListCtrl::GetItemText(int32_t nIndex) const { + if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { + return pListItem->GetText(); + } + + return L""; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_list.h b/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_list.h new file mode 100644 index 000000000000..01e18bc000c1 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/fxedit/fxet_list.h @@ -0,0 +1,304 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_FXEDIT_FXET_LIST_H_ +#define FPDFSDK_FXEDIT_FXET_LIST_H_ + +#include + +#include "core/fxcrt/fx_coordinates.h" +#include "fpdfsdk/fxedit/fx_edit.h" + +class CFX_Edit; +class CFX_Edit_Iterator; +class CPWL_List_Notify; + +class CLST_Rect : public CFX_FloatRect { + public: + CLST_Rect() { left = top = right = bottom = 0.0f; } + + CLST_Rect(FX_FLOAT other_left, + FX_FLOAT other_top, + FX_FLOAT other_right, + FX_FLOAT other_bottom) { + left = other_left; + top = other_top; + right = other_right; + bottom = other_bottom; + } + + explicit CLST_Rect(const CFX_FloatRect& rect) { + left = rect.left; + top = rect.top; + right = rect.right; + bottom = rect.bottom; + } + + ~CLST_Rect() {} + + void Default() { left = top = right = bottom = 0.0f; } + + const CLST_Rect operator=(const CFX_FloatRect& rect) { + left = rect.left; + top = rect.top; + right = rect.right; + bottom = rect.bottom; + + return *this; + } + + bool operator==(const CLST_Rect& rect) const { + return FXSYS_memcmp(this, &rect, sizeof(CLST_Rect)) == 0; + } + + bool operator!=(const CLST_Rect& rect) const { return !(*this == rect); } + + FX_FLOAT Width() const { return right - left; } + + FX_FLOAT Height() const { + if (top > bottom) + return top - bottom; + return bottom - top; + } + + CFX_PointF LeftTop() const { return CFX_PointF(left, top); } + + CFX_PointF RightBottom() const { return CFX_PointF(right, bottom); } + + const CLST_Rect operator+=(const CFX_PointF& point) { + left += point.x; + right += point.x; + top += point.y; + bottom += point.y; + + return *this; + } + + const CLST_Rect operator-=(const CFX_PointF& point) { + left -= point.x; + right -= point.x; + top -= point.y; + bottom -= point.y; + + return *this; + } + + CLST_Rect operator+(const CFX_PointF& point) const { + return CLST_Rect(left + point.x, top + point.y, right + point.x, + bottom + point.y); + } + + CLST_Rect operator-(const CFX_PointF& point) const { + return CLST_Rect(left - point.x, top - point.y, right - point.x, + bottom - point.y); + } +}; + +class CFX_ListItem final { + public: + CFX_ListItem(); + ~CFX_ListItem(); + + void SetFontMap(IPVT_FontMap* pFontMap); + CFX_Edit* GetEdit() const; + + void SetRect(const CLST_Rect& rect); + void SetSelect(bool bSelected); + void SetText(const CFX_WideString& text); + void SetFontSize(FX_FLOAT fFontSize); + CFX_WideString GetText() const; + + CLST_Rect GetRect() const; + bool IsSelected() const; + FX_FLOAT GetItemHeight() const; + uint16_t GetFirstChar() const; + + private: + CFX_Edit_Iterator* GetIterator() const; + + std::unique_ptr m_pEdit; + bool m_bSelected; + CLST_Rect m_rcListItem; +}; + +class CFX_ListContainer { + public: + CFX_ListContainer(); + virtual ~CFX_ListContainer(); + + virtual void SetPlateRect(const CFX_FloatRect& rect); + + CFX_FloatRect GetPlateRect() const { return m_rcPlate; } + void SetContentRect(const CLST_Rect& rect) { m_rcContent = rect; } + CLST_Rect GetContentRect() const { return m_rcContent; } + CFX_PointF GetBTPoint() const { + return CFX_PointF(m_rcPlate.left, m_rcPlate.top); + } + CFX_PointF GetETPoint() const { + return CFX_PointF(m_rcPlate.right, m_rcPlate.bottom); + } + + public: + CFX_PointF InnerToOuter(const CFX_PointF& point) const { + return CFX_PointF(point.x + GetBTPoint().x, GetBTPoint().y - point.y); + } + CFX_PointF OuterToInner(const CFX_PointF& point) const { + return CFX_PointF(point.x - GetBTPoint().x, GetBTPoint().y - point.y); + } + CFX_FloatRect InnerToOuter(const CLST_Rect& rect) const { + CFX_PointF ptLeftTop = InnerToOuter(CFX_PointF(rect.left, rect.top)); + CFX_PointF ptRightBottom = + InnerToOuter(CFX_PointF(rect.right, rect.bottom)); + return CFX_FloatRect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, + ptLeftTop.y); + } + CLST_Rect OuterToInner(const CFX_FloatRect& rect) const { + CFX_PointF ptLeftTop = OuterToInner(CFX_PointF(rect.left, rect.top)); + CFX_PointF ptRightBottom = + OuterToInner(CFX_PointF(rect.right, rect.bottom)); + return CLST_Rect(ptLeftTop.x, ptLeftTop.y, ptRightBottom.x, + ptRightBottom.y); + } + + private: + CFX_FloatRect m_rcPlate; + CLST_Rect m_rcContent; // positive forever! +}; + +template +class CLST_ArrayTemplate : public CFX_ArrayTemplate { + public: + bool IsEmpty() { return CFX_ArrayTemplate::GetSize() <= 0; } + TYPE GetAt(int32_t nIndex) const { + if (nIndex >= 0 && nIndex < CFX_ArrayTemplate::GetSize()) + return CFX_ArrayTemplate::GetAt(nIndex); + return nullptr; + } + void RemoveAt(int32_t nIndex) { + if (nIndex >= 0 && nIndex < CFX_ArrayTemplate::GetSize()) + CFX_ArrayTemplate::RemoveAt(nIndex); + } +}; + +struct CPLST_Select_Item { + CPLST_Select_Item(int32_t other_nItemIndex, int32_t other_nState) { + nItemIndex = other_nItemIndex; + nState = other_nState; + } + + int32_t nItemIndex; + int32_t nState; // 0:normal select -1:to deselect 1: to select +}; + +class CPLST_Select { + public: + CPLST_Select(); + virtual ~CPLST_Select(); + + public: + void Add(int32_t nItemIndex); + void Add(int32_t nBeginIndex, int32_t nEndIndex); + void Sub(int32_t nItemIndex); + void Sub(int32_t nBeginIndex, int32_t nEndIndex); + bool IsExist(int32_t nItemIndex) const; + int32_t Find(int32_t nItemIndex) const; + int32_t GetCount() const; + int32_t GetItemIndex(int32_t nIndex) const; + int32_t GetState(int32_t nIndex) const; + void Done(); + void DeselectAll(); + + private: + CFX_ArrayTemplate m_aItems; +}; + +class CFX_ListCtrl : protected CFX_ListContainer { + public: + CFX_ListCtrl(); + ~CFX_ListCtrl() override; + + // CFX_ListContainer + void SetPlateRect(const CFX_FloatRect& rect) override; + + void SetNotify(CPWL_List_Notify* pNotify); + void OnMouseDown(const CFX_PointF& point, bool bShift, bool bCtrl); + void OnMouseMove(const CFX_PointF& point, bool bShift, bool bCtrl); + void OnVK_UP(bool bShift, bool bCtrl); + void OnVK_DOWN(bool bShift, bool bCtrl); + void OnVK_LEFT(bool bShift, bool bCtrl); + void OnVK_RIGHT(bool bShift, bool bCtrl); + void OnVK_HOME(bool bShift, bool bCtrl); + void OnVK_END(bool bShift, bool bCtrl); + void OnVK(int32_t nItemIndex, bool bShift, bool bCtrl); + bool OnChar(uint16_t nChar, bool bShift, bool bCtrl); + + void SetScrollPos(const CFX_PointF& point); + void ScrollToListItem(int32_t nItemIndex); + CFX_FloatRect GetItemRect(int32_t nIndex) const; + int32_t GetCaret() const; + int32_t GetSelect() const; + int32_t GetTopItem() const; + CFX_FloatRect GetContentRect() const; + int32_t GetItemIndex(const CFX_PointF& point) const; + void AddString(const CFX_WideString& str); + void SetTopItem(int32_t nIndex); + void Select(int32_t nItemIndex); + void SetCaret(int32_t nItemIndex); + void Empty(); + void Cancel(); + CFX_WideString GetText() const; + + void SetFontMap(IPVT_FontMap* pFontMap); + void SetFontSize(FX_FLOAT fFontSize); + CFX_FloatRect GetPlateRect() const; + FX_FLOAT GetFontSize() const; + CFX_Edit* GetItemEdit(int32_t nIndex) const; + int32_t GetCount() const; + bool IsItemSelected(int32_t nIndex) const; + FX_FLOAT GetFirstHeight() const; + void SetMultipleSel(bool bMultiple); + bool IsMultipleSel() const; + bool IsValid(int32_t nItemIndex) const; + int32_t FindNext(int32_t nIndex, FX_WCHAR nChar) const; + int32_t GetFirstSelected() const; + + CFX_PointF InToOut(const CFX_PointF& point) const; + CFX_PointF OutToIn(const CFX_PointF& point) const; + CFX_FloatRect InToOut(const CFX_FloatRect& rect) const; + CFX_FloatRect OutToIn(const CFX_FloatRect& rect) const; + + private: + void ReArrange(int32_t nItemIndex); + CFX_FloatRect GetItemRectInternal(int32_t nIndex) const; + CFX_FloatRect GetContentRectInternal() const; + void SetMultipleSelect(int32_t nItemIndex, bool bSelected); + void SetSingleSelect(int32_t nItemIndex); + void InvalidateItem(int32_t nItemIndex); + void SelectItems(); + bool IsItemVisible(int32_t nItemIndex) const; + void SetScrollInfo(); + void SetScrollPosY(FX_FLOAT fy); + void AddItem(const CFX_WideString& str); + CFX_WideString GetItemText(int32_t nIndex) const; + void SetItemSelect(int32_t nItemIndex, bool bSelected); + int32_t GetLastSelected() const; + FX_WCHAR Toupper(FX_WCHAR c) const; + + CPWL_List_Notify* m_pNotify; + bool m_bNotifyFlag; + CFX_PointF m_ptScrollPos; + CPLST_Select m_aSelItems; // for multiple + int32_t m_nSelItem; // for single + int32_t m_nFootIndex; // for multiple + bool m_bCtrlSel; // for multiple + int32_t m_nCaretIndex; // for multiple + CLST_ArrayTemplate m_aListItems; + FX_FLOAT m_fFontSize; + IPVT_FontMap* m_pFontMap; + bool m_bMultiple; +}; + +#endif // FPDFSDK_FXEDIT_FXET_LIST_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/ipdfsdk_annothandler.h b/modules/pdfium/pdfium/fpdfsdk/ipdfsdk_annothandler.h new file mode 100644 index 000000000000..636d161feae2 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/ipdfsdk_annothandler.h @@ -0,0 +1,103 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_IPDFSDK_ANNOTHANDLER_H_ +#define FPDFSDK_IPDFSDK_ANNOTHANDLER_H_ + +#include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_coordinates.h" +#include "fpdfsdk/cpdfsdk_annot.h" + +class CFX_Matrix; +class CFX_RenderDevice; +class CPDF_Annot; +class CPDFSDK_PageView; + +#ifdef PDF_ENABLE_XFA +class CXFA_FFWidget; +#endif // PDF_ENABLE_XFA + +class IPDFSDK_AnnotHandler { + public: + virtual ~IPDFSDK_AnnotHandler() {} + + virtual bool CanAnswer(CPDFSDK_Annot* pAnnot) = 0; + virtual CPDFSDK_Annot* NewAnnot(CPDF_Annot* pAnnot, + CPDFSDK_PageView* pPage) = 0; + +#ifdef PDF_ENABLE_XFA + virtual CPDFSDK_Annot* NewAnnot(CXFA_FFWidget* hWidget, + CPDFSDK_PageView* pPage) = 0; +#endif // PDF_ENABLE_XFA + + virtual void ReleaseAnnot(CPDFSDK_Annot* pAnnot) = 0; + virtual CFX_FloatRect GetViewBBox(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot) = 0; + virtual bool HitTest(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + const CFX_PointF& point) = 0; + virtual void OnDraw(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot* pAnnot, + CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + bool bDrawAnnots) = 0; + virtual void OnLoad(CPDFSDK_Annot* pAnnot) = 0; + + virtual void OnMouseEnter(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) = 0; + virtual void OnMouseExit(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) = 0; + virtual bool OnLButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) = 0; + virtual bool OnLButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) = 0; + virtual bool OnLButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) = 0; + virtual bool OnMouseMove(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) = 0; + virtual bool OnMouseWheel(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + short zDelta, + const CFX_PointF& point) = 0; + virtual bool OnRButtonDown(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) = 0; + virtual bool OnRButtonUp(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) = 0; + virtual bool OnRButtonDblClk(CPDFSDK_PageView* pPageView, + CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlags, + const CFX_PointF& point) = 0; + virtual bool OnChar(CPDFSDK_Annot* pAnnot, + uint32_t nChar, + uint32_t nFlags) = 0; + virtual bool OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) = 0; + virtual bool OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) = 0; + virtual bool OnSetFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) = 0; + virtual bool OnKillFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, + uint32_t nFlag) = 0; +#ifdef PDF_ENABLE_XFA + virtual bool OnXFAChangedFocus(CPDFSDK_Annot::ObservedPtr* pOldAnnot, + CPDFSDK_Annot::ObservedPtr* pNewAnnot) = 0; +#endif // PDF_ENABLE_XFA +}; + +#endif // FPDFSDK_IPDFSDK_ANNOTHANDLER_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/Annot.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/Annot.cpp new file mode 100644 index 000000000000..41c71ec411f2 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/Annot.cpp @@ -0,0 +1,115 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/Annot.h" + +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" +#include "fpdfsdk/javascript/cjs_event_context.h" + +namespace { + +CPDFSDK_BAAnnot* ToBAAnnot(CPDFSDK_Annot* annot) { + return static_cast(annot); +} + +} // namespace + +JSConstSpec CJS_Annot::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}}; + +JSPropertySpec CJS_Annot::PropertySpecs[] = { + {"hidden", get_hidden_static, set_hidden_static}, + {"name", get_name_static, set_name_static}, + {"type", get_type_static, set_type_static}, + {0, 0, 0}}; + +JSMethodSpec CJS_Annot::MethodSpecs[] = {{0, 0}}; + +IMPLEMENT_JS_CLASS(CJS_Annot, Annot) + +Annot::Annot(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {} + +Annot::~Annot() {} + +bool Annot::hidden(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsGetting()) { + if (!m_pAnnot) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + CPDF_Annot* pPDFAnnot = ToBAAnnot(m_pAnnot.Get())->GetPDFAnnot(); + vp << CPDF_Annot::IsAnnotationHidden(pPDFAnnot->GetAnnotDict()); + return true; + } + + bool bHidden; + vp >> bHidden; // May invalidate m_pAnnot. + if (!m_pAnnot) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + + uint32_t flags = ToBAAnnot(m_pAnnot.Get())->GetFlags(); + if (bHidden) { + flags |= ANNOTFLAG_HIDDEN; + flags |= ANNOTFLAG_INVISIBLE; + flags |= ANNOTFLAG_NOVIEW; + flags &= ~ANNOTFLAG_PRINT; + } else { + flags &= ~ANNOTFLAG_HIDDEN; + flags &= ~ANNOTFLAG_INVISIBLE; + flags &= ~ANNOTFLAG_NOVIEW; + flags |= ANNOTFLAG_PRINT; + } + ToBAAnnot(m_pAnnot.Get())->SetFlags(flags); + return true; +} + +bool Annot::name(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsGetting()) { + if (!m_pAnnot) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + vp << ToBAAnnot(m_pAnnot.Get())->GetAnnotName(); + return true; + } + + CFX_WideString annotName; + vp >> annotName; // May invalidate m_pAnnot. + if (!m_pAnnot) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + + ToBAAnnot(m_pAnnot.Get())->SetAnnotName(annotName); + return true; +} + +bool Annot::type(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + sError = JSGetStringFromID(IDS_STRING_JSREADONLY); + return false; + } + if (!m_pAnnot) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + vp << CPDF_Annot::AnnotSubtypeToString( + ToBAAnnot(m_pAnnot.Get())->GetAnnotSubtype()); + return true; +} + +void Annot::SetSDKAnnot(CPDFSDK_BAAnnot* annot) { + m_pAnnot.Reset(annot); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/Annot.h b/modules/pdfium/pdfium/fpdfsdk/javascript/Annot.h new file mode 100644 index 000000000000..d9757fa51485 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/Annot.h @@ -0,0 +1,41 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_ANNOT_H_ +#define FPDFSDK_JAVASCRIPT_ANNOT_H_ + +#include + +#include "fpdfsdk/cpdfsdk_baannot.h" +#include "fpdfsdk/javascript/JS_Define.h" + +class Annot : public CJS_EmbedObj { + public: + explicit Annot(CJS_Object* pJSObject); + ~Annot() override; + + bool hidden(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool name(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool type(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + + void SetSDKAnnot(CPDFSDK_BAAnnot* annot); + + private: + CPDFSDK_Annot::ObservedPtr m_pAnnot; +}; + +class CJS_Annot : public CJS_Object { + public: + explicit CJS_Annot(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Annot() override {} + + DECLARE_JS_CLASS(); + JS_STATIC_PROP(hidden, Annot); + JS_STATIC_PROP(name, Annot); + JS_STATIC_PROP(type, Annot); +}; + +#endif // FPDFSDK_JAVASCRIPT_ANNOT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/Consts.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/Consts.cpp new file mode 100644 index 000000000000..82f9b4c94573 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/Consts.cpp @@ -0,0 +1,204 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/Consts.h" + +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" + +JSConstSpec CJS_Border::ConstSpecs[] = { + {"s", JSConstSpec::String, 0, "solid"}, + {"b", JSConstSpec::String, 0, "beveled"}, + {"d", JSConstSpec::String, 0, "dashed"}, + {"i", JSConstSpec::String, 0, "inset"}, + {"u", JSConstSpec::String, 0, "underline"}, + {0, JSConstSpec::Number, 0, 0}}; +IMPLEMENT_JS_CLASS_CONST(CJS_Border, border) + +JSConstSpec CJS_Display::ConstSpecs[] = {{"visible", JSConstSpec::Number, 0, 0}, + {"hidden", JSConstSpec::Number, 1, 0}, + {"noPrint", JSConstSpec::Number, 2, 0}, + {"noView", JSConstSpec::Number, 3, 0}, + {0, JSConstSpec::Number, 0, 0}}; +IMPLEMENT_JS_CLASS_CONST(CJS_Display, display) + +JSConstSpec CJS_Font::ConstSpecs[] = { + {"Times", JSConstSpec::String, 0, "Times-Roman"}, + {"TimesB", JSConstSpec::String, 0, "Times-Bold"}, + {"TimesI", JSConstSpec::String, 0, "Times-Italic"}, + {"TimesBI", JSConstSpec::String, 0, "Times-BoldItalic"}, + {"Helv", JSConstSpec::String, 0, "Helvetica"}, + {"HelvB", JSConstSpec::String, 0, "Helvetica-Bold"}, + {"HelvI", JSConstSpec::String, 0, "Helvetica-Oblique"}, + {"HelvBI", JSConstSpec::String, 0, "Helvetica-BoldOblique"}, + {"Cour", JSConstSpec::String, 0, "Courier"}, + {"CourB", JSConstSpec::String, 0, "Courier-Bold"}, + {"CourI", JSConstSpec::String, 0, "Courier-Oblique"}, + {"CourBI", JSConstSpec::String, 0, "Courier-BoldOblique"}, + {"Symbol", JSConstSpec::String, 0, "Symbol"}, + {"ZapfD", JSConstSpec::String, 0, "ZapfDingbats"}, + {0, JSConstSpec::Number, 0, 0}}; +IMPLEMENT_JS_CLASS_CONST(CJS_Font, font) + +JSConstSpec CJS_Highlight::ConstSpecs[] = { + {"n", JSConstSpec::String, 0, "none"}, + {"i", JSConstSpec::String, 0, "invert"}, + {"p", JSConstSpec::String, 0, "push"}, + {"o", JSConstSpec::String, 0, "outline"}, + {0, JSConstSpec::Number, 0, 0}}; +IMPLEMENT_JS_CLASS_CONST(CJS_Highlight, highlight) + +JSConstSpec CJS_Position::ConstSpecs[] = { + {"textOnly", JSConstSpec::Number, 0, 0}, + {"iconOnly", JSConstSpec::Number, 1, 0}, + {"iconTextV", JSConstSpec::Number, 2, 0}, + {"textIconV", JSConstSpec::Number, 3, 0}, + {"iconTextH", JSConstSpec::Number, 4, 0}, + {"textIconH", JSConstSpec::Number, 5, 0}, + {"overlay", JSConstSpec::Number, 6, 0}, + {0, JSConstSpec::Number, 0, 0}}; +IMPLEMENT_JS_CLASS_CONST(CJS_Position, position) + +JSConstSpec CJS_ScaleHow::ConstSpecs[] = { + {"proportional", JSConstSpec::Number, 0, 0}, + {"anamorphic", JSConstSpec::Number, 1, 0}, + {0, JSConstSpec::Number, 0, 0}}; +IMPLEMENT_JS_CLASS_CONST(CJS_ScaleHow, scaleHow) + +JSConstSpec CJS_ScaleWhen::ConstSpecs[] = { + {"always", JSConstSpec::Number, 0, 0}, + {"never", JSConstSpec::Number, 1, 0}, + {"tooBig", JSConstSpec::Number, 2, 0}, + {"tooSmall", JSConstSpec::Number, 3, 0}, + {0, JSConstSpec::Number, 0, 0}}; +IMPLEMENT_JS_CLASS_CONST(CJS_ScaleWhen, scaleWhen) + +JSConstSpec CJS_Style::ConstSpecs[] = { + {"ch", JSConstSpec::String, 0, "check"}, + {"cr", JSConstSpec::String, 0, "cross"}, + {"di", JSConstSpec::String, 0, "diamond"}, + {"ci", JSConstSpec::String, 0, "circle"}, + {"st", JSConstSpec::String, 0, "star"}, + {"sq", JSConstSpec::String, 0, "square"}, + {0, JSConstSpec::Number, 0, 0}}; +IMPLEMENT_JS_CLASS_CONST(CJS_Style, style) + +JSConstSpec CJS_Zoomtype::ConstSpecs[] = { + {"none", JSConstSpec::String, 0, "NoVary"}, + {"fitP", JSConstSpec::String, 0, "FitPage"}, + {"fitW", JSConstSpec::String, 0, "FitWidth"}, + {"fitH", JSConstSpec::String, 0, "FitHeight"}, + {"fitV", JSConstSpec::String, 0, "FitVisibleWidth"}, + {"pref", JSConstSpec::String, 0, "Preferred"}, + {"refW", JSConstSpec::String, 0, "ReflowWidth"}, + {0, JSConstSpec::Number, 0, 0}}; +IMPLEMENT_JS_CLASS_CONST(CJS_Zoomtype, zoomtype) + +#define GLOBAL_STRING(rt, name, value) \ + (rt)->DefineGlobalConst( \ + (name), [](const v8::FunctionCallbackInfo& info) { \ + info.GetReturnValue().Set( \ + CFXJS_Engine::CurrentEngineFromIsolate(info.GetIsolate()) \ + ->NewString(value)); \ + }) + +void CJS_GlobalConsts::DefineJSObjects(CJS_Runtime* pRuntime) { + GLOBAL_STRING(pRuntime, L"IDS_GREATER_THAN", + L"Invalid value: must be greater than or equal to % s."); + + GLOBAL_STRING(pRuntime, L"IDS_GT_AND_LT", + L"Invalid value: must be greater than or equal to % s " + L"and less than or equal to % s."); + + GLOBAL_STRING(pRuntime, L"IDS_LESS_THAN", + L"Invalid value: must be less than or equal to % s."); + + GLOBAL_STRING(pRuntime, L"IDS_INVALID_MONTH", L"**Invalid**"); + GLOBAL_STRING( + pRuntime, L"IDS_INVALID_DATE", + L"Invalid date / time: please ensure that the date / time exists.Field"); + + GLOBAL_STRING(pRuntime, L"IDS_INVALID_VALUE", + L"The value entered does not match the format of the field"); + + GLOBAL_STRING(pRuntime, L"IDS_AM", L"am"); + GLOBAL_STRING(pRuntime, L"IDS_PM", L"pm"); + GLOBAL_STRING(pRuntime, L"IDS_MONTH_INFO", + L"January[1] February[2] March[3] April[4] May[5] " + L"June[6] July[7] August[8] September[9] October[10] " + L"November[11] December[12] Sept[9] Jan[1] Feb[2] Mar[3] " + L"Apr[4] Jun[6] Jul[7] Aug[8] Sep[9] Oct[10] Nov[11] " + L"Dec[12]"); + + GLOBAL_STRING(pRuntime, L"IDS_STARTUP_CONSOLE_MSG", L"** ^ _ ^ **"); +} + +#define GLOBAL_ARRAY(rt, name, ...) \ + { \ + const FX_WCHAR* values[] = {__VA_ARGS__}; \ + v8::Local array = (rt)->NewArray(); \ + for (size_t i = 0; i < FX_ArraySize(values); ++i) \ + array->Set(i, (rt)->NewString(values[i])); \ + (rt)->SetConstArray((name), array); \ + (rt)->DefineGlobalConst( \ + (name), [](const v8::FunctionCallbackInfo& info) { \ + CJS_Runtime* pCurrentRuntime = \ + CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate()); \ + if (pCurrentRuntime) \ + info.GetReturnValue().Set(pCurrentRuntime->GetConstArray(name)); \ + }); \ + } + +void CJS_GlobalArrays::DefineJSObjects(CJS_Runtime* pRuntime) { + GLOBAL_ARRAY(pRuntime, L"RE_NUMBER_ENTRY_DOT_SEP", L"[+-]?\\d*\\.?\\d*"); + GLOBAL_ARRAY(pRuntime, L"RE_NUMBER_COMMIT_DOT_SEP", + L"[+-]?\\d+(\\.\\d+)?", // -1.0 or -1 + L"[+-]?\\.\\d+", // -.1 + L"[+-]?\\d+\\."); // -1. + + GLOBAL_ARRAY(pRuntime, L"RE_NUMBER_ENTRY_COMMA_SEP", L"[+-]?\\d*,?\\d*"); + GLOBAL_ARRAY(pRuntime, L"RE_NUMBER_COMMIT_COMMA_SEP", + L"[+-]?\\d+([.,]\\d+)?", // -1,0 or -1 + L"[+-]?[.,]\\d+", // -,1 + L"[+-]?\\d+[.,]"); // -1, + + GLOBAL_ARRAY(pRuntime, L"RE_ZIP_ENTRY", L"\\d{0,5}"); + GLOBAL_ARRAY(pRuntime, L"RE_ZIP_COMMIT", L"\\d{5}"); + GLOBAL_ARRAY(pRuntime, L"RE_ZIP4_ENTRY", L"\\d{0,5}(\\.|[- ])?\\d{0,4}"); + GLOBAL_ARRAY(pRuntime, L"RE_ZIP4_COMMIT", L"\\d{5}(\\.|[- ])?\\d{4}"); + GLOBAL_ARRAY(pRuntime, L"RE_PHONE_ENTRY", + // 555-1234 or 408 555-1234 + L"\\d{0,3}(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", + + // (408 + L"\\(\\d{0,3}", + + // (408) 555-1234 + // (allow the addition of parens as an afterthought) + L"\\(\\d{0,3}\\)(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", + + // (408 555-1234 + L"\\(\\d{0,3}(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", + + // 408) 555-1234 + L"\\d{0,3}\\)(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", + + // international + L"011(\\.|[- \\d])*"); + + GLOBAL_ARRAY( + pRuntime, L"RE_PHONE_COMMIT", L"\\d{3}(\\.|[- ])?\\d{4}", // 555-1234 + L"\\d{3}(\\.|[- ])?\\d{3}(\\.|[- ])?\\d{4}", // 408 555-1234 + L"\\(\\d{3}\\)(\\.|[- ])?\\d{3}(\\.|[- ])?\\d{4}", // (408) 555-1234 + L"011(\\.|[- \\d])*"); // international + + GLOBAL_ARRAY(pRuntime, L"RE_SSN_ENTRY", + L"\\d{0,3}(\\.|[- ])?\\d{0,2}(\\.|[- ])?\\d{0,4}"); + + GLOBAL_ARRAY(pRuntime, L"RE_SSN_COMMIT", + L"\\d{3}(\\.|[- ])?\\d{2}(\\.|[- ])?\\d{4}"); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/Consts.h b/modules/pdfium/pdfium/fpdfsdk/javascript/Consts.h new file mode 100644 index 000000000000..e358cb93418e --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/Consts.h @@ -0,0 +1,94 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_CONSTS_H_ +#define FPDFSDK_JAVASCRIPT_CONSTS_H_ + +#include "fpdfsdk/javascript/JS_Define.h" + +class CJS_Border : public CJS_Object { + public: + explicit CJS_Border(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Border() override {} + + DECLARE_JS_CLASS_CONST(); +}; + +class CJS_Display : public CJS_Object { + public: + explicit CJS_Display(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Display() override {} + + DECLARE_JS_CLASS_CONST(); +}; + +class CJS_Font : public CJS_Object { + public: + explicit CJS_Font(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Font() override {} + + DECLARE_JS_CLASS_CONST(); +}; + +class CJS_Highlight : public CJS_Object { + public: + explicit CJS_Highlight(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Highlight() override {} + + DECLARE_JS_CLASS_CONST(); +}; + +class CJS_Position : public CJS_Object { + public: + explicit CJS_Position(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Position() override {} + + DECLARE_JS_CLASS_CONST(); +}; + +class CJS_ScaleHow : public CJS_Object { + public: + explicit CJS_ScaleHow(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_ScaleHow() override {} + + DECLARE_JS_CLASS_CONST(); +}; + +class CJS_ScaleWhen : public CJS_Object { + public: + explicit CJS_ScaleWhen(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_ScaleWhen() override {} + + DECLARE_JS_CLASS_CONST(); +}; + +class CJS_Style : public CJS_Object { + public: + explicit CJS_Style(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Style() override {} + + DECLARE_JS_CLASS_CONST(); +}; + +class CJS_Zoomtype : public CJS_Object { + public: + explicit CJS_Zoomtype(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Zoomtype() override {} + + DECLARE_JS_CLASS_CONST(); +}; + +class CJS_GlobalConsts : public CJS_Object { + public: + static void DefineJSObjects(CJS_Runtime* pRuntime); +}; + +class CJS_GlobalArrays : public CJS_Object { + public: + static void DefineJSObjects(CJS_Runtime* pRuntmie); +}; + +#endif // FPDFSDK_JAVASCRIPT_CONSTS_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/DEPS b/modules/pdfium/pdfium/fpdfsdk/javascript/DEPS new file mode 100644 index 000000000000..36a51aa92f4a --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + '+fxjs' +] diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/Document.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/Document.cpp new file mode 100644 index 000000000000..a45b8b9ea7cf --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/Document.cpp @@ -0,0 +1,1658 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/Document.h" + +#include +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_string.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfdoc/cpdf_interform.h" +#include "core/fpdfdoc/cpdf_nametree.h" +#include "fpdfsdk/cpdfsdk_annotiteration.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/javascript/Annot.h" +#include "fpdfsdk/javascript/Field.h" +#include "fpdfsdk/javascript/Icon.h" +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_EventHandler.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" +#include "fpdfsdk/javascript/app.h" +#include "fpdfsdk/javascript/cjs_event_context.h" +#include "fpdfsdk/javascript/cjs_runtime.h" +#include "fpdfsdk/javascript/resource.h" +#include "third_party/base/numerics/safe_math.h" +#include "third_party/base/ptr_util.h" + +JSConstSpec CJS_PrintParamsObj::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}}; + +JSPropertySpec CJS_PrintParamsObj::PropertySpecs[] = {{0, 0, 0}}; + +JSMethodSpec CJS_PrintParamsObj::MethodSpecs[] = {{0, 0}}; + +IMPLEMENT_JS_CLASS(CJS_PrintParamsObj, PrintParamsObj) + +PrintParamsObj::PrintParamsObj(CJS_Object* pJSObject) + : CJS_EmbedObj(pJSObject) { + bUI = true; + nStart = 0; + nEnd = 0; + bSilent = false; + bShrinkToFit = false; + bPrintAsImage = false; + bReverse = false; + bAnnotations = true; +} + +#define MINWIDTH 5.0f +#define MINHEIGHT 5.0f + +JSConstSpec CJS_Document::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}}; + +JSPropertySpec CJS_Document::PropertySpecs[] = { + {"ADBE", get_ADBE_static, set_ADBE_static}, + {"author", get_author_static, set_author_static}, + {"baseURL", get_baseURL_static, set_baseURL_static}, + {"bookmarkRoot", get_bookmarkRoot_static, set_bookmarkRoot_static}, + {"calculate", get_calculate_static, set_calculate_static}, + {"Collab", get_Collab_static, set_Collab_static}, + {"creationDate", get_creationDate_static, set_creationDate_static}, + {"creator", get_creator_static, set_creator_static}, + {"delay", get_delay_static, set_delay_static}, + {"dirty", get_dirty_static, set_dirty_static}, + {"documentFileName", get_documentFileName_static, + set_documentFileName_static}, + {"external", get_external_static, set_external_static}, + {"filesize", get_filesize_static, set_filesize_static}, + {"icons", get_icons_static, set_icons_static}, + {"info", get_info_static, set_info_static}, + {"keywords", get_keywords_static, set_keywords_static}, + {"layout", get_layout_static, set_layout_static}, + {"media", get_media_static, set_media_static}, + {"modDate", get_modDate_static, set_modDate_static}, + {"mouseX", get_mouseX_static, set_mouseX_static}, + {"mouseY", get_mouseY_static, set_mouseY_static}, + {"numFields", get_numFields_static, set_numFields_static}, + {"numPages", get_numPages_static, set_numPages_static}, + {"pageNum", get_pageNum_static, set_pageNum_static}, + {"pageWindowRect", get_pageWindowRect_static, set_pageWindowRect_static}, + {"path", get_path_static, set_path_static}, + {"producer", get_producer_static, set_producer_static}, + {"subject", get_subject_static, set_subject_static}, + {"title", get_title_static, set_title_static}, + {"URL", get_URL_static, set_URL_static}, + {"zoom", get_zoom_static, set_zoom_static}, + {"zoomType", get_zoomType_static, set_zoomType_static}, + {0, 0, 0}}; + +JSMethodSpec CJS_Document::MethodSpecs[] = { + {"addAnnot", addAnnot_static}, + {"addField", addField_static}, + {"addLink", addLink_static}, + {"addIcon", addIcon_static}, + {"calculateNow", calculateNow_static}, + {"closeDoc", closeDoc_static}, + {"createDataObject", createDataObject_static}, + {"deletePages", deletePages_static}, + {"exportAsText", exportAsText_static}, + {"exportAsFDF", exportAsFDF_static}, + {"exportAsXFDF", exportAsXFDF_static}, + {"extractPages", extractPages_static}, + {"getAnnot", getAnnot_static}, + {"getAnnots", getAnnots_static}, + {"getAnnot3D", getAnnot3D_static}, + {"getAnnots3D", getAnnots3D_static}, + {"getField", getField_static}, + {"getIcon", getIcon_static}, + {"getLinks", getLinks_static}, + {"getNthFieldName", getNthFieldName_static}, + {"getOCGs", getOCGs_static}, + {"getPageBox", getPageBox_static}, + {"getPageNthWord", getPageNthWord_static}, + {"getPageNthWordQuads", getPageNthWordQuads_static}, + {"getPageNumWords", getPageNumWords_static}, + {"getPrintParams", getPrintParams_static}, + {"getURL", getURL_static}, + {"gotoNamedDest", gotoNamedDest_static}, + {"importAnFDF", importAnFDF_static}, + {"importAnXFDF", importAnXFDF_static}, + {"importTextData", importTextData_static}, + {"insertPages", insertPages_static}, + {"mailForm", mailForm_static}, + {"print", print_static}, + {"removeField", removeField_static}, + {"replacePages", replacePages_static}, + {"resetForm", resetForm_static}, + {"removeIcon", removeIcon_static}, + {"saveAs", saveAs_static}, + {"submitForm", submitForm_static}, + {"syncAnnotScan", syncAnnotScan_static}, + {"mailDoc", mailDoc_static}, + {0, 0}}; + +IMPLEMENT_JS_CLASS(CJS_Document, Document) + +void CJS_Document::InitInstance(IJS_Runtime* pIRuntime) { + CJS_Runtime* pRuntime = static_cast(pIRuntime); + Document* pDoc = static_cast(GetEmbedObject()); + pDoc->SetFormFillEnv(pRuntime->GetFormFillEnv()); +} + +Document::Document(CJS_Object* pJSObject) + : CJS_EmbedObj(pJSObject), + m_pFormFillEnv(nullptr), + m_cwBaseURL(L""), + m_bDelay(false) {} + +Document::~Document() { +} + +// the total number of fileds in document. +bool Document::numFields(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + sError = JSGetStringFromID(IDS_STRING_JSREADONLY); + return false; + } + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + CPDF_InterForm* pPDFForm = pInterForm->GetInterForm(); + vp << static_cast(pPDFForm->CountFields(CFX_WideString())); + return true; +} + +bool Document::dirty(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + if (vp.IsGetting()) { + vp << !!m_pFormFillEnv->GetChangeMark(); + return true; + } + bool bChanged = false; + vp >> bChanged; + if (bChanged) + m_pFormFillEnv->SetChangeMark(); + else + m_pFormFillEnv->ClearChangeMark(); + + return true; +} + +bool Document::ADBE(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsGetting()) + vp.GetJSValue()->SetNull(pRuntime); + + return true; +} + +bool Document::pageNum(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + if (vp.IsGetting()) { + if (CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetCurrentView()) + vp << pPageView->GetPageIndex(); + return true; + } + int iPageCount = m_pFormFillEnv->GetPageCount(); + int iPageNum = 0; + vp >> iPageNum; + if (iPageNum >= 0 && iPageNum < iPageCount) + m_pFormFillEnv->JS_docgotoPage(iPageNum); + else if (iPageNum >= iPageCount) + m_pFormFillEnv->JS_docgotoPage(iPageCount - 1); + else if (iPageNum < 0) + m_pFormFillEnv->JS_docgotoPage(0); + + return true; +} + +bool Document::addAnnot(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Not supported. + return true; +} + +bool Document::addField(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Not supported. + return true; +} + +bool Document::exportAsText(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +bool Document::exportAsFDF(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +bool Document::exportAsXFDF(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +// Maps a field object in PDF document to a JavaScript variable +// comment: +// note: the paremter cName, this is clue how to treat if the cName is not a +// valiable filed name in this document + +bool Document::getField(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() < 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + CFX_WideString wideName = params[0].ToCFXWideString(pRuntime); + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + CPDF_InterForm* pPDFForm = pInterForm->GetInterForm(); + if (pPDFForm->CountFields(wideName) <= 0) { + vRet.SetNull(pRuntime); + return true; + } + + v8::Local pFieldObj = + pRuntime->NewFxDynamicObj(CJS_Field::g_nObjDefnID); + if (pFieldObj.IsEmpty()) + return false; + + CJS_Field* pJSField = + static_cast(pRuntime->GetObjectPrivate(pFieldObj)); + Field* pField = static_cast(pJSField->GetEmbedObject()); + pField->AttachField(this, wideName); + vRet = CJS_Value(pRuntime, pJSField); + return true; +} + +// Gets the name of the nth field in the document +bool Document::getNthFieldName(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + int nIndex = params[0].ToInt(pRuntime); + if (nIndex < 0) { + sError = JSGetStringFromID(IDS_STRING_JSVALUEERROR); + return false; + } + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + CPDF_InterForm* pPDFForm = pInterForm->GetInterForm(); + CPDF_FormField* pField = pPDFForm->GetField(nIndex, CFX_WideString()); + if (!pField) + return false; + + vRet = CJS_Value(pRuntime, pField->GetFullName().c_str()); + return true; +} + +bool Document::importAnFDF(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +bool Document::importAnXFDF(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +bool Document::importTextData(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +// exports the form data and mails the resulting fdf file as an attachment to +// all recipients. +// comment: need reader supports +bool Document::mailForm(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + if (!m_pFormFillEnv->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) { + sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION); + return false; + } + int iLength = params.size(); + bool bUI = iLength > 0 ? params[0].ToBool(pRuntime) : true; + CFX_WideString cTo = iLength > 1 ? params[1].ToCFXWideString(pRuntime) : L""; + CFX_WideString cCc = iLength > 2 ? params[2].ToCFXWideString(pRuntime) : L""; + CFX_WideString cBcc = iLength > 3 ? params[3].ToCFXWideString(pRuntime) : L""; + CFX_WideString cSubject = + iLength > 4 ? params[4].ToCFXWideString(pRuntime) : L""; + CFX_WideString cMsg = iLength > 5 ? params[5].ToCFXWideString(pRuntime) : L""; + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + CFX_ByteTextBuf textBuf; + if (!pInterForm->ExportFormToFDFTextBuf(textBuf)) + return false; + + pRuntime->BeginBlock(); + CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv(); + pFormFillEnv->JS_docmailForm(textBuf.GetBuffer(), textBuf.GetLength(), bUI, + cTo.c_str(), cSubject.c_str(), cCc.c_str(), + cBcc.c_str(), cMsg.c_str()); + pRuntime->EndBlock(); + return true; +} + +bool Document::print(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + bool bUI = true; + int nStart = 0; + int nEnd = 0; + bool bSilent = false; + bool bShrinkToFit = false; + bool bPrintAsImage = false; + bool bReverse = false; + bool bAnnotations = false; + int nlength = params.size(); + if (nlength == 9) { + if (params[8].GetType() == CJS_Value::VT_object) { + v8::Local pObj = params[8].ToV8Object(pRuntime); + if (CFXJS_Engine::GetObjDefnID(pObj) == + CJS_PrintParamsObj::g_nObjDefnID) { + if (CJS_Object* pJSObj = params[8].ToCJSObject(pRuntime)) { + if (PrintParamsObj* pprintparamsObj = + static_cast(pJSObj->GetEmbedObject())) { + bUI = pprintparamsObj->bUI; + nStart = pprintparamsObj->nStart; + nEnd = pprintparamsObj->nEnd; + bSilent = pprintparamsObj->bSilent; + bShrinkToFit = pprintparamsObj->bShrinkToFit; + bPrintAsImage = pprintparamsObj->bPrintAsImage; + bReverse = pprintparamsObj->bReverse; + bAnnotations = pprintparamsObj->bAnnotations; + } + } + } + } + } else { + if (nlength >= 1) + bUI = params[0].ToBool(pRuntime); + if (nlength >= 2) + nStart = params[1].ToInt(pRuntime); + if (nlength >= 3) + nEnd = params[2].ToInt(pRuntime); + if (nlength >= 4) + bSilent = params[3].ToBool(pRuntime); + if (nlength >= 5) + bShrinkToFit = params[4].ToBool(pRuntime); + if (nlength >= 6) + bPrintAsImage = params[5].ToBool(pRuntime); + if (nlength >= 7) + bReverse = params[6].ToBool(pRuntime); + if (nlength >= 8) + bAnnotations = params[7].ToBool(pRuntime); + } + + if (m_pFormFillEnv) { + m_pFormFillEnv->JS_docprint(bUI, nStart, nEnd, bSilent, bShrinkToFit, + bPrintAsImage, bReverse, bAnnotations); + return true; + } + return false; +} + +// removes the specified field from the document. +// comment: +// note: if the filed name is not rational, adobe is dumb for it. + +bool Document::removeField(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + if (!(m_pFormFillEnv->GetPermissions(FPDFPERM_MODIFY) || + m_pFormFillEnv->GetPermissions(FPDFPERM_ANNOT_FORM))) { + sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION); + return false; + } + CFX_WideString sFieldName = params[0].ToCFXWideString(pRuntime); + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + std::vector widgets; + pInterForm->GetWidgets(sFieldName, &widgets); + if (widgets.empty()) + return true; + + for (const auto& pAnnot : widgets) { + CPDFSDK_Widget* pWidget = static_cast(pAnnot.Get()); + if (!pWidget) + continue; + + CFX_FloatRect rcAnnot = pWidget->GetRect(); + --rcAnnot.left; + --rcAnnot.bottom; + ++rcAnnot.right; + ++rcAnnot.top; + + std::vector aRefresh(1, rcAnnot); + UnderlyingPageType* pPage = pWidget->GetUnderlyingPage(); + ASSERT(pPage); + + // If there is currently no pageview associated with the page being used + // do not create one. We may be in the process of tearing down the document + // and creating a new pageview at this point will cause bad things. + CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetPageView(pPage, false); + if (pPageView) { +#if PDF_ENABLE_XFA + pPageView->DeleteAnnot(pWidget); +#endif // PDF_ENABLE_XFA + pPageView->UpdateRects(aRefresh); + } + } + m_pFormFillEnv->SetChangeMark(); + + return true; +} + +// reset filed values within a document. +// comment: +// note: if the fields names r not rational, aodbe is dumb for it. + +bool Document::resetForm(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + if (!(m_pFormFillEnv->GetPermissions(FPDFPERM_MODIFY) || + m_pFormFillEnv->GetPermissions(FPDFPERM_ANNOT_FORM) || + m_pFormFillEnv->GetPermissions(FPDFPERM_FILL_FORM))) { + sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION); + return false; + } + + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + CPDF_InterForm* pPDFForm = pInterForm->GetInterForm(); + CJS_Array aName; + + if (params.empty()) { + pPDFForm->ResetForm(true); + m_pFormFillEnv->SetChangeMark(); + return true; + } + + switch (params[0].GetType()) { + default: + aName.Attach(params[0].ToV8Array(pRuntime)); + break; + case CJS_Value::VT_string: + aName.SetElement(pRuntime, 0, params[0]); + break; + } + + std::vector aFields; + for (int i = 0, isz = aName.GetLength(pRuntime); i < isz; ++i) { + CJS_Value valElement(pRuntime); + aName.GetElement(pRuntime, i, valElement); + CFX_WideString swVal = valElement.ToCFXWideString(pRuntime); + for (int j = 0, jsz = pPDFForm->CountFields(swVal); j < jsz; ++j) + aFields.push_back(pPDFForm->GetField(j, swVal)); + } + + if (!aFields.empty()) { + pPDFForm->ResetForm(aFields, true, true); + m_pFormFillEnv->SetChangeMark(); + } + + return true; +} + +bool Document::saveAs(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +bool Document::syncAnnotScan(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool Document::submitForm(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + int nSize = params.size(); + if (nSize < 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + + CJS_Array aFields; + CFX_WideString strURL; + bool bFDF = true; + bool bEmpty = false; + CJS_Value v = params[0]; + if (v.GetType() == CJS_Value::VT_string) { + strURL = params[0].ToCFXWideString(pRuntime); + if (nSize > 1) + bFDF = params[1].ToBool(pRuntime); + if (nSize > 2) + bEmpty = params[2].ToBool(pRuntime); + if (nSize > 3) + aFields.Attach(params[3].ToV8Array(pRuntime)); + } else if (v.GetType() == CJS_Value::VT_object) { + v8::Local pObj = params[0].ToV8Object(pRuntime); + v8::Local pValue = pRuntime->GetObjectProperty(pObj, L"cURL"); + if (!pValue.IsEmpty()) + strURL = CJS_Value(pRuntime, pValue).ToCFXWideString(pRuntime); + + pValue = pRuntime->GetObjectProperty(pObj, L"bFDF"); + bFDF = CJS_Value(pRuntime, pValue).ToBool(pRuntime); + + pValue = pRuntime->GetObjectProperty(pObj, L"bEmpty"); + bEmpty = CJS_Value(pRuntime, pValue).ToBool(pRuntime); + + pValue = pRuntime->GetObjectProperty(pObj, L"aFields"); + aFields.Attach(CJS_Value(pRuntime, pValue).ToV8Array(pRuntime)); + } + + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm(); + if (aFields.GetLength(pRuntime) == 0 && bEmpty) { + if (pPDFInterForm->CheckRequiredFields(nullptr, true)) { + pRuntime->BeginBlock(); + pInterForm->SubmitForm(strURL, false); + pRuntime->EndBlock(); + } + return true; + } + + std::vector fieldObjects; + for (int i = 0, sz = aFields.GetLength(pRuntime); i < sz; ++i) { + CJS_Value valName(pRuntime); + aFields.GetElement(pRuntime, i, valName); + + CFX_WideString sName = valName.ToCFXWideString(pRuntime); + CPDF_InterForm* pPDFForm = pInterForm->GetInterForm(); + for (int j = 0, jsz = pPDFForm->CountFields(sName); j < jsz; ++j) { + CPDF_FormField* pField = pPDFForm->GetField(j, sName); + if (!bEmpty && pField->GetValue().IsEmpty()) + continue; + + fieldObjects.push_back(pField); + } + } + + if (pPDFInterForm->CheckRequiredFields(&fieldObjects, true)) { + pRuntime->BeginBlock(); + pInterForm->SubmitFields(strURL, fieldObjects, true, !bFDF); + pRuntime->EndBlock(); + } + return true; +} + +void Document::SetFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv) { + m_pFormFillEnv.Reset(pFormFillEnv); +} + +bool Document::bookmarkRoot(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +bool Document::mailDoc(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // TODO(tsepez): Check maximum number of allowed params. + bool bUI = true; + CFX_WideString cTo = L""; + CFX_WideString cCc = L""; + CFX_WideString cBcc = L""; + CFX_WideString cSubject = L""; + CFX_WideString cMsg = L""; + + if (params.size() >= 1) + bUI = params[0].ToBool(pRuntime); + if (params.size() >= 2) + cTo = params[1].ToCFXWideString(pRuntime); + if (params.size() >= 3) + cCc = params[2].ToCFXWideString(pRuntime); + if (params.size() >= 4) + cBcc = params[3].ToCFXWideString(pRuntime); + if (params.size() >= 5) + cSubject = params[4].ToCFXWideString(pRuntime); + if (params.size() >= 6) + cMsg = params[5].ToCFXWideString(pRuntime); + + if (params.size() >= 1 && params[0].GetType() == CJS_Value::VT_object) { + v8::Local pObj = params[0].ToV8Object(pRuntime); + + v8::Local pValue = pRuntime->GetObjectProperty(pObj, L"bUI"); + bUI = CJS_Value(pRuntime, pValue).ToBool(pRuntime); + + pValue = pRuntime->GetObjectProperty(pObj, L"cTo"); + cTo = CJS_Value(pRuntime, pValue).ToCFXWideString(pRuntime); + + pValue = pRuntime->GetObjectProperty(pObj, L"cCc"); + cCc = CJS_Value(pRuntime, pValue).ToCFXWideString(pRuntime); + + pValue = pRuntime->GetObjectProperty(pObj, L"cBcc"); + cBcc = CJS_Value(pRuntime, pValue).ToCFXWideString(pRuntime); + + pValue = pRuntime->GetObjectProperty(pObj, L"cSubject"); + cSubject = CJS_Value(pRuntime, pValue).ToCFXWideString(pRuntime); + + pValue = pRuntime->GetObjectProperty(pObj, L"cMsg"); + cMsg = CJS_Value(pRuntime, pValue).ToCFXWideString(pRuntime); + } + + pRuntime->BeginBlock(); + CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv(); + pFormFillEnv->JS_docmailForm(nullptr, 0, bUI, cTo.c_str(), cSubject.c_str(), + cCc.c_str(), cBcc.c_str(), cMsg.c_str()); + pRuntime->EndBlock(); + return true; +} + +bool Document::author(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return getPropertyInternal(pRuntime, vp, "Author", sError); +} + +bool Document::info(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + sError = JSGetStringFromID(IDS_STRING_JSREADONLY); + return false; + } + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + CPDF_Dictionary* pDictionary = m_pFormFillEnv->GetPDFDocument()->GetInfo(); + if (!pDictionary) + return false; + + CFX_WideString cwAuthor = pDictionary->GetUnicodeTextFor("Author"); + CFX_WideString cwTitle = pDictionary->GetUnicodeTextFor("Title"); + CFX_WideString cwSubject = pDictionary->GetUnicodeTextFor("Subject"); + CFX_WideString cwKeywords = pDictionary->GetUnicodeTextFor("Keywords"); + CFX_WideString cwCreator = pDictionary->GetUnicodeTextFor("Creator"); + CFX_WideString cwProducer = pDictionary->GetUnicodeTextFor("Producer"); + CFX_WideString cwCreationDate = + pDictionary->GetUnicodeTextFor("CreationDate"); + CFX_WideString cwModDate = pDictionary->GetUnicodeTextFor("ModDate"); + CFX_WideString cwTrapped = pDictionary->GetUnicodeTextFor("Trapped"); + + v8::Local pObj = pRuntime->NewFxDynamicObj(-1); + pRuntime->PutObjectProperty(pObj, L"Author", + pRuntime->NewString(cwAuthor.AsStringC())); + pRuntime->PutObjectProperty(pObj, L"Title", + pRuntime->NewString(cwTitle.AsStringC())); + pRuntime->PutObjectProperty(pObj, L"Subject", + pRuntime->NewString(cwSubject.AsStringC())); + pRuntime->PutObjectProperty(pObj, L"Keywords", + pRuntime->NewString(cwKeywords.AsStringC())); + pRuntime->PutObjectProperty(pObj, L"Creator", + pRuntime->NewString(cwCreator.AsStringC())); + pRuntime->PutObjectProperty(pObj, L"Producer", + pRuntime->NewString(cwProducer.AsStringC())); + pRuntime->PutObjectProperty(pObj, L"CreationDate", + pRuntime->NewString(cwCreationDate.AsStringC())); + pRuntime->PutObjectProperty(pObj, L"ModDate", + pRuntime->NewString(cwModDate.AsStringC())); + pRuntime->PutObjectProperty(pObj, L"Trapped", + pRuntime->NewString(cwTrapped.AsStringC())); + + // It's to be compatible to non-standard info dictionary. + for (const auto& it : *pDictionary) { + const CFX_ByteString& bsKey = it.first; + CPDF_Object* pValueObj = it.second.get(); + CFX_WideString wsKey = CFX_WideString::FromUTF8(bsKey.AsStringC()); + if (pValueObj->IsString() || pValueObj->IsName()) { + pRuntime->PutObjectProperty( + pObj, wsKey, + pRuntime->NewString(pValueObj->GetUnicodeText().AsStringC())); + } else if (pValueObj->IsNumber()) { + pRuntime->PutObjectProperty(pObj, wsKey, + pRuntime->NewNumber(pValueObj->GetNumber())); + } else if (pValueObj->IsBoolean()) { + pRuntime->PutObjectProperty( + pObj, wsKey, pRuntime->NewBoolean(!!pValueObj->GetInteger())); + } + } + vp << pObj; + return true; +} + +bool Document::getPropertyInternal(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + const CFX_ByteString& propName, + CFX_WideString& sError) { + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + CPDF_Dictionary* pDictionary = m_pFormFillEnv->GetPDFDocument()->GetInfo(); + if (!pDictionary) + return false; + + if (vp.IsGetting()) { + vp << pDictionary->GetUnicodeTextFor(propName); + } else { + if (!m_pFormFillEnv->GetPermissions(FPDFPERM_MODIFY)) { + sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION); + return false; + } + CFX_WideString csProperty; + vp >> csProperty; + pDictionary->SetNewFor(propName, PDF_EncodeText(csProperty), + false); + m_pFormFillEnv->SetChangeMark(); + } + return true; +} + +bool Document::creationDate(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return getPropertyInternal(pRuntime, vp, "CreationDate", sError); +} + +bool Document::creator(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return getPropertyInternal(pRuntime, vp, "Creator", sError); +} + +bool Document::delay(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + if (vp.IsGetting()) { + vp << m_bDelay; + return true; + } + if (!m_pFormFillEnv->GetPermissions(FPDFPERM_MODIFY)) { + sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION); + return false; + } + vp >> m_bDelay; + if (m_bDelay) { + m_DelayData.clear(); + return true; + } + std::list> DelayDataToProcess; + DelayDataToProcess.swap(m_DelayData); + for (const auto& pData : DelayDataToProcess) + Field::DoDelay(m_pFormFillEnv.Get(), pData.get()); + + return true; +} + +bool Document::keywords(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return getPropertyInternal(pRuntime, vp, "Keywords", sError); +} + +bool Document::modDate(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return getPropertyInternal(pRuntime, vp, "ModDate", sError); +} + +bool Document::producer(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return getPropertyInternal(pRuntime, vp, "Producer", sError); +} + +bool Document::subject(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return getPropertyInternal(pRuntime, vp, "Subject", sError); +} + +bool Document::title(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!m_pFormFillEnv || !m_pFormFillEnv->GetUnderlyingDocument()) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + return getPropertyInternal(pRuntime, vp, "Title", sError); +} + +bool Document::numPages(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + sError = JSGetStringFromID(IDS_STRING_JSREADONLY); + return false; + } + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + vp << m_pFormFillEnv->GetPageCount(); + return true; +} + +bool Document::external(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + // In Chrome case, should always return true. + if (vp.IsGetting()) { + vp << true; + } + return true; +} + +bool Document::filesize(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + sError = JSGetStringFromID(IDS_STRING_JSREADONLY); + return false; + } + vp << 0; + return true; +} + +bool Document::mouseX(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +bool Document::mouseY(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +bool Document::URL(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + sError = JSGetStringFromID(IDS_STRING_JSREADONLY); + return false; + } + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + vp << m_pFormFillEnv->JS_docGetFilePath(); + return true; +} + +bool Document::baseURL(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsGetting()) { + vp << m_cwBaseURL; + } else { + vp >> m_cwBaseURL; + } + return true; +} + +bool Document::calculate(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + if (vp.IsGetting()) { + vp << !!pInterForm->IsCalculateEnabled(); + return true; + } + bool bCalculate; + vp >> bCalculate; + pInterForm->EnableCalculate(bCalculate); + return true; +} + +bool Document::documentFileName(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + sError = JSGetStringFromID(IDS_STRING_JSREADONLY); + return false; + } + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + CFX_WideString wsFilePath = m_pFormFillEnv->JS_docGetFilePath(); + int32_t i = wsFilePath.GetLength() - 1; + for (; i >= 0; i--) { + if (wsFilePath.GetAt(i) == L'\\' || wsFilePath.GetAt(i) == L'/') + break; + } + if (i >= 0 && i < wsFilePath.GetLength() - 1) { + vp << (wsFilePath.GetBuffer(wsFilePath.GetLength()) + i + 1); + } else { + vp << L""; + } + return true; +} + +bool Document::path(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + sError = JSGetStringFromID(IDS_STRING_JSREADONLY); + return false; + } + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + vp << app::SysPathToPDFPath(m_pFormFillEnv->JS_docGetFilePath()); + return true; +} + +bool Document::pageWindowRect(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +bool Document::layout(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +bool Document::addLink(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool Document::closeDoc(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool Document::getPageBox(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool Document::getAnnot(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 2) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + int nPageNo = params[0].ToInt(pRuntime); + CFX_WideString swAnnotName = params[1].ToCFXWideString(pRuntime); + CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetPageView(nPageNo); + if (!pPageView) + return false; + + CPDFSDK_AnnotIteration annotIteration(pPageView, false); + CPDFSDK_BAAnnot* pSDKBAAnnot = nullptr; + for (const auto& pSDKAnnotCur : annotIteration) { + CPDFSDK_BAAnnot* pBAAnnot = + static_cast(pSDKAnnotCur.Get()); + if (pBAAnnot && pBAAnnot->GetAnnotName() == swAnnotName) { + pSDKBAAnnot = pBAAnnot; + break; + } + } + if (!pSDKBAAnnot) + return false; + + v8::Local pObj = + pRuntime->NewFxDynamicObj(CJS_Annot::g_nObjDefnID); + if (pObj.IsEmpty()) + return false; + + CJS_Annot* pJS_Annot = + static_cast(pRuntime->GetObjectPrivate(pObj)); + Annot* pAnnot = static_cast(pJS_Annot->GetEmbedObject()); + pAnnot->SetSDKAnnot(pSDKBAAnnot); + vRet = CJS_Value(pRuntime, pJS_Annot); + return true; +} + +bool Document::getAnnots(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + // TODO(tonikitoo): Add support supported parameters as per + // the PDF spec. + + int nPageNo = m_pFormFillEnv->GetPageCount(); + CJS_Array annots; + + for (int i = 0; i < nPageNo; ++i) { + CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetPageView(i); + if (!pPageView) + return false; + + CPDFSDK_AnnotIteration annotIteration(pPageView, false); + for (const auto& pSDKAnnotCur : annotIteration) { + if (!pSDKAnnotCur) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + v8::Local pObj = + pRuntime->NewFxDynamicObj(CJS_Annot::g_nObjDefnID); + if (pObj.IsEmpty()) + return false; + + CJS_Annot* pJS_Annot = + static_cast(pRuntime->GetObjectPrivate(pObj)); + Annot* pAnnot = static_cast(pJS_Annot->GetEmbedObject()); + pAnnot->SetSDKAnnot(static_cast(pSDKAnnotCur.Get())); + annots.SetElement(pRuntime, i, CJS_Value(pRuntime, pJS_Annot)); + } + } + vRet = CJS_Value(pRuntime, annots); + return true; +} + +bool Document::getAnnot3D(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + vRet.SetNull(pRuntime); + return true; +} + +bool Document::getAnnots3D(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool Document::getOCGs(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool Document::getLinks(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool Document::IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect) { + return (rect.left <= LinkRect.left && rect.top <= LinkRect.top && + rect.right >= LinkRect.right && rect.bottom >= LinkRect.bottom); +} + +bool Document::addIcon(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 2) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CFX_WideString swIconName = params[0].ToCFXWideString(pRuntime); + if (params[1].GetType() != CJS_Value::VT_object) { + sError = JSGetStringFromID(IDS_STRING_JSTYPEERROR); + return false; + } + + v8::Local pJSIcon = params[1].ToV8Object(pRuntime); + if (pRuntime->GetObjDefnID(pJSIcon) != CJS_Icon::g_nObjDefnID) { + sError = JSGetStringFromID(IDS_STRING_JSTYPEERROR); + return false; + } + + if (!params[1].ToCJSObject(pRuntime)->GetEmbedObject()) { + sError = JSGetStringFromID(IDS_STRING_JSTYPEERROR); + return false; + } + + m_IconNames.push_back(swIconName); + return true; +} + +bool Document::icons(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + sError = JSGetStringFromID(IDS_STRING_JSREADONLY); + return false; + } + if (m_IconNames.empty()) { + vp.GetJSValue()->SetNull(pRuntime); + return true; + } + + CJS_Array Icons; + int i = 0; + for (const auto& name : m_IconNames) { + v8::Local pObj = + pRuntime->NewFxDynamicObj(CJS_Icon::g_nObjDefnID); + if (pObj.IsEmpty()) + return false; + + CJS_Icon* pJS_Icon = + static_cast(pRuntime->GetObjectPrivate(pObj)); + Icon* pIcon = static_cast(pJS_Icon->GetEmbedObject()); + pIcon->SetIconName(name); + Icons.SetElement(pRuntime, i++, CJS_Value(pRuntime, pJS_Icon)); + } + + vp << Icons; + return true; +} + +bool Document::getIcon(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CFX_WideString swIconName = params[0].ToCFXWideString(pRuntime); + auto it = std::find(m_IconNames.begin(), m_IconNames.end(), swIconName); + if (it == m_IconNames.end()) + return false; + + v8::Local pObj = + pRuntime->NewFxDynamicObj(CJS_Icon::g_nObjDefnID); + if (pObj.IsEmpty()) + return false; + + CJS_Icon* pJS_Icon = static_cast(pRuntime->GetObjectPrivate(pObj)); + Icon* pIcon = static_cast(pJS_Icon->GetEmbedObject()); + pIcon->SetIconName(*it); + vRet = CJS_Value(pRuntime, pJS_Icon); + return true; +} + +bool Document::removeIcon(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, no supported. + return true; +} + +bool Document::createDataObject(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not implemented. + return true; +} + +bool Document::media(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +bool Document::calculateNow(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + if (!(m_pFormFillEnv->GetPermissions(FPDFPERM_MODIFY) || + m_pFormFillEnv->GetPermissions(FPDFPERM_ANNOT_FORM) || + m_pFormFillEnv->GetPermissions(FPDFPERM_FILL_FORM))) { + sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION); + return false; + } + m_pFormFillEnv->GetInterForm()->OnCalculate(); + return true; +} + +bool Document::Collab(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +bool Document::getPageNthWord(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + if (!m_pFormFillEnv->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) { + sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION); + return false; + } + + // TODO(tsepez): check maximum allowable params. + + int nPageNo = params.size() > 0 ? params[0].ToInt(pRuntime) : 0; + int nWordNo = params.size() > 1 ? params[1].ToInt(pRuntime) : 0; + bool bStrip = params.size() > 2 ? params[2].ToBool(pRuntime) : true; + + CPDF_Document* pDocument = m_pFormFillEnv->GetPDFDocument(); + if (!pDocument) + return false; + + if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) { + sError = JSGetStringFromID(IDS_STRING_JSVALUEERROR); + return false; + } + + CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo); + if (!pPageDict) + return false; + + CPDF_Page page(pDocument, pPageDict, true); + page.ParseContent(); + + int nWords = 0; + CFX_WideString swRet; + for (auto& pPageObj : *page.GetPageObjectList()) { + if (pPageObj->IsText()) { + CPDF_TextObject* pTextObj = pPageObj->AsText(); + int nObjWords = CountWords(pTextObj); + if (nWords + nObjWords >= nWordNo) { + swRet = GetObjWordStr(pTextObj, nWordNo - nWords); + break; + } + nWords += nObjWords; + } + } + + if (bStrip) { + swRet.TrimLeft(); + swRet.TrimRight(); + } + + vRet = CJS_Value(pRuntime, swRet.c_str()); + return true; +} + +bool Document::getPageNthWordQuads(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + if (!m_pFormFillEnv->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + return false; +} + +bool Document::getPageNumWords(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + if (!m_pFormFillEnv->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) { + sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION); + return false; + } + int nPageNo = params.size() > 0 ? params[0].ToInt(pRuntime) : 0; + CPDF_Document* pDocument = m_pFormFillEnv->GetPDFDocument(); + if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) { + sError = JSGetStringFromID(IDS_STRING_JSVALUEERROR); + return false; + } + + CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo); + if (!pPageDict) + return false; + + CPDF_Page page(pDocument, pPageDict, true); + page.ParseContent(); + + int nWords = 0; + for (auto& pPageObj : *page.GetPageObjectList()) { + if (pPageObj->IsText()) + nWords += CountWords(pPageObj->AsText()); + } + + vRet = CJS_Value(pRuntime, nWords); + return true; +} + +bool Document::getPrintParams(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + v8::Local pRetObj = + pRuntime->NewFxDynamicObj(CJS_PrintParamsObj::g_nObjDefnID); + if (pRetObj.IsEmpty()) + return false; + + // Not implemented yet. + + vRet = CJS_Value(pRuntime, pRetObj); + return true; +} + +#define ISLATINWORD(u) (u != 0x20 && u <= 0x28FF) + +int Document::CountWords(CPDF_TextObject* pTextObj) { + if (!pTextObj) + return 0; + + int nWords = 0; + + CPDF_Font* pFont = pTextObj->GetFont(); + if (!pFont) + return 0; + + bool bIsLatin = false; + + for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) { + uint32_t charcode = CPDF_Font::kInvalidCharCode; + FX_FLOAT kerning; + + pTextObj->GetCharInfo(i, &charcode, &kerning); + CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode); + + uint16_t unicode = 0; + if (swUnicode.GetLength() > 0) + unicode = swUnicode[0]; + + if (ISLATINWORD(unicode) && bIsLatin) + continue; + + bIsLatin = ISLATINWORD(unicode); + if (unicode != 0x20) + nWords++; + } + + return nWords; +} + +CFX_WideString Document::GetObjWordStr(CPDF_TextObject* pTextObj, + int nWordIndex) { + CFX_WideString swRet; + + CPDF_Font* pFont = pTextObj->GetFont(); + if (!pFont) + return L""; + + int nWords = 0; + bool bIsLatin = false; + + for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) { + uint32_t charcode = CPDF_Font::kInvalidCharCode; + FX_FLOAT kerning; + + pTextObj->GetCharInfo(i, &charcode, &kerning); + CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode); + + uint16_t unicode = 0; + if (swUnicode.GetLength() > 0) + unicode = swUnicode[0]; + + if (ISLATINWORD(unicode) && bIsLatin) { + } else { + bIsLatin = ISLATINWORD(unicode); + if (unicode != 0x20) + nWords++; + } + + if (nWords - 1 == nWordIndex) + swRet += unicode; + } + + return swRet; +} + +bool Document::zoom(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +/** +(none, NoVary) +(fitP, FitPage) +(fitW, FitWidth) +(fitH, FitHeight) +(fitV, FitVisibleWidth) +(pref, Preferred) +(refW, ReflowWidth) +*/ + +bool Document::zoomType(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +bool Document::deletePages(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, no supported. + return true; +} + +bool Document::extractPages(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +bool Document::insertPages(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +bool Document::replacePages(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +bool Document::getURL(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +bool Document::gotoNamedDest(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + if (!m_pFormFillEnv) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + CFX_WideString wideName = params[0].ToCFXWideString(pRuntime); + CFX_ByteString utf8Name = wideName.UTF8Encode(); + CPDF_Document* pDocument = m_pFormFillEnv->GetPDFDocument(); + if (!pDocument) + return false; + + CPDF_NameTree nameTree(pDocument, "Dests"); + CPDF_Array* destArray = nameTree.LookupNamedDest(pDocument, utf8Name); + if (!destArray) + return false; + + CPDF_Dest dest(destArray); + const CPDF_Array* arrayObject = ToArray(dest.GetObject()); + + std::unique_ptr scrollPositionArray; + int scrollPositionArraySize = 0; + + if (arrayObject) { + scrollPositionArray.reset(new float[arrayObject->GetCount()]); + int j = 0; + for (size_t i = 2; i < arrayObject->GetCount(); i++) + scrollPositionArray[j++] = arrayObject->GetFloatAt(i); + scrollPositionArraySize = j; + } + + pRuntime->BeginBlock(); + m_pFormFillEnv->DoGoToAction(dest.GetPageIndex(pDocument), dest.GetZoomMode(), + scrollPositionArray.get(), + scrollPositionArraySize); + pRuntime->EndBlock(); + + return true; +} + +void Document::AddDelayData(CJS_DelayData* pData) { + m_DelayData.push_back(std::unique_ptr(pData)); +} + +void Document::DoFieldDelay(const CFX_WideString& sFieldName, + int nControlIndex) { + std::vector> DelayDataForFieldAndControlIndex; + auto iter = m_DelayData.begin(); + while (iter != m_DelayData.end()) { + auto old = iter++; + if ((*old)->sFieldName == sFieldName && + (*old)->nControlIndex == nControlIndex) { + DelayDataForFieldAndControlIndex.push_back(std::move(*old)); + m_DelayData.erase(old); + } + } + + for (const auto& pData : DelayDataForFieldAndControlIndex) + Field::DoDelay(m_pFormFillEnv.Get(), pData.get()); +} + +CJS_Document* Document::GetCJSDoc() const { + return static_cast(m_pJSObject); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/Document.h b/modules/pdfium/pdfium/fpdfsdk/javascript/Document.h new file mode 100644 index 000000000000..91ca778c7909 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/Document.h @@ -0,0 +1,402 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_DOCUMENT_H_ +#define FPDFSDK_JAVASCRIPT_DOCUMENT_H_ + +#include +#include +#include + +#include "core/fpdfapi/page/cpdf_pageobject.h" +#include "core/fpdfapi/page/cpdf_textobject.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/javascript/JS_Define.h" + +class PrintParamsObj : public CJS_EmbedObj { + public: + explicit PrintParamsObj(CJS_Object* pJSObject); + ~PrintParamsObj() override {} + + public: + bool bUI; + int nStart; + int nEnd; + bool bSilent; + bool bShrinkToFit; + bool bPrintAsImage; + bool bReverse; + bool bAnnotations; +}; + +class CJS_PrintParamsObj : public CJS_Object { + public: + explicit CJS_PrintParamsObj(v8::Local pObject) + : CJS_Object(pObject) {} + ~CJS_PrintParamsObj() override {} + + DECLARE_JS_CLASS(); +}; + +struct CJS_AnnotObj; +struct CJS_DelayAnnot; +struct CJS_DelayData; + +class Document : public CJS_EmbedObj { + public: + explicit Document(CJS_Object* pJSObject); + ~Document() override; + + bool ADBE(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool author(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool baseURL(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool bookmarkRoot(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool calculate(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool Collab(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool creationDate(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool creator(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool delay(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool dirty(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool documentFileName(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool external(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool filesize(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool icons(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool info(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool keywords(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool layout(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool media(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool modDate(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool mouseX(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool mouseY(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool numFields(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool numPages(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool pageNum(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool pageWindowRect(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool path(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool producer(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool subject(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool title(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool zoom(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool zoomType(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + + bool addAnnot(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool addField(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool addLink(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool addIcon(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool calculateNow(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool closeDoc(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool createDataObject(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool deletePages(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool exportAsText(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool exportAsFDF(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool exportAsXFDF(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool extractPages(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getAnnot(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getAnnots(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getAnnot3D(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getAnnots3D(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getField(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getIcon(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getLinks(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getNthFieldName(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getOCGs(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getPageBox(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getPageNthWord(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getPageNthWordQuads(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getPageNumWords(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getPrintParams(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getURL(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool gotoNamedDest(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool importAnFDF(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool importAnXFDF(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool importTextData(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool insertPages(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool mailForm(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool print(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool removeField(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool replacePages(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool resetForm(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool saveAs(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool submitForm(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool syncAnnotScan(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool mailDoc(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool removeIcon(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool URL(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + + void SetFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv); + CPDFSDK_FormFillEnvironment* GetFormFillEnv() const { + return m_pFormFillEnv.Get(); + } + void AddDelayData(CJS_DelayData* pData); + void DoFieldDelay(const CFX_WideString& sFieldName, int nControlIndex); + CJS_Document* GetCJSDoc() const; + + private: + bool IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect); + int CountWords(CPDF_TextObject* pTextObj); + CFX_WideString GetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex); + + bool getPropertyInternal(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + const CFX_ByteString& propName, + CFX_WideString& sError); + + CPDFSDK_FormFillEnvironment::ObservedPtr m_pFormFillEnv; + CFX_WideString m_cwBaseURL; + std::list> m_DelayData; + // Needs to be a std::list for iterator stability. + std::list m_IconNames; + bool m_bDelay; +}; + +class CJS_Document : public CJS_Object { + public: + explicit CJS_Document(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Document() override {} + + // CJS_Object + void InitInstance(IJS_Runtime* pIRuntime) override; + + DECLARE_JS_CLASS(); + + JS_STATIC_PROP(ADBE, Document); + JS_STATIC_PROP(author, Document); + JS_STATIC_PROP(baseURL, Document); + JS_STATIC_PROP(bookmarkRoot, Document); + JS_STATIC_PROP(calculate, Document); + JS_STATIC_PROP(Collab, Document); + JS_STATIC_PROP(creationDate, Document); + JS_STATIC_PROP(creator, Document); + JS_STATIC_PROP(delay, Document); + JS_STATIC_PROP(dirty, Document); + JS_STATIC_PROP(documentFileName, Document); + JS_STATIC_PROP(external, Document); + JS_STATIC_PROP(filesize, Document); + JS_STATIC_PROP(icons, Document); + JS_STATIC_PROP(info, Document); + JS_STATIC_PROP(keywords, Document); + JS_STATIC_PROP(layout, Document); + JS_STATIC_PROP(media, Document); + JS_STATIC_PROP(modDate, Document); + JS_STATIC_PROP(mouseX, Document); + JS_STATIC_PROP(mouseY, Document); + JS_STATIC_PROP(numFields, Document); + JS_STATIC_PROP(numPages, Document); + JS_STATIC_PROP(pageNum, Document); + JS_STATIC_PROP(pageWindowRect, Document); + JS_STATIC_PROP(path, Document); + JS_STATIC_PROP(producer, Document); + JS_STATIC_PROP(subject, Document); + JS_STATIC_PROP(title, Document); + JS_STATIC_PROP(URL, Document); + JS_STATIC_PROP(zoom, Document); + JS_STATIC_PROP(zoomType, Document); + + JS_STATIC_METHOD(addAnnot, Document); + JS_STATIC_METHOD(addField, Document); + JS_STATIC_METHOD(addLink, Document); + JS_STATIC_METHOD(addIcon, Document); + JS_STATIC_METHOD(calculateNow, Document); + JS_STATIC_METHOD(closeDoc, Document); + JS_STATIC_METHOD(createDataObject, Document); + JS_STATIC_METHOD(deletePages, Document); + JS_STATIC_METHOD(exportAsText, Document); + JS_STATIC_METHOD(exportAsFDF, Document); + JS_STATIC_METHOD(exportAsXFDF, Document); + JS_STATIC_METHOD(extractPages, Document); + JS_STATIC_METHOD(getAnnot, Document); + JS_STATIC_METHOD(getAnnots, Document); + JS_STATIC_METHOD(getAnnot3D, Document); + JS_STATIC_METHOD(getAnnots3D, Document); + JS_STATIC_METHOD(getField, Document); + JS_STATIC_METHOD(getIcon, Document); + JS_STATIC_METHOD(getLinks, Document); + JS_STATIC_METHOD(getNthFieldName, Document); + JS_STATIC_METHOD(getOCGs, Document); + JS_STATIC_METHOD(getPageBox, Document); + JS_STATIC_METHOD(getPageNthWord, Document); + JS_STATIC_METHOD(getPageNthWordQuads, Document); + JS_STATIC_METHOD(getPageNumWords, Document); + JS_STATIC_METHOD(getPrintParams, Document); + JS_STATIC_METHOD(getURL, Document); + JS_STATIC_METHOD(gotoNamedDest, Document); + JS_STATIC_METHOD(importAnFDF, Document); + JS_STATIC_METHOD(importAnXFDF, Document); + JS_STATIC_METHOD(importTextData, Document); + JS_STATIC_METHOD(insertPages, Document); + JS_STATIC_METHOD(mailForm, Document); + JS_STATIC_METHOD(print, Document); + JS_STATIC_METHOD(removeField, Document); + JS_STATIC_METHOD(replacePages, Document); + JS_STATIC_METHOD(removeIcon, Document); + JS_STATIC_METHOD(resetForm, Document); + JS_STATIC_METHOD(saveAs, Document); + JS_STATIC_METHOD(submitForm, Document); + JS_STATIC_METHOD(syncAnnotScan, Document); + JS_STATIC_METHOD(mailDoc, Document); +}; + +#endif // FPDFSDK_JAVASCRIPT_DOCUMENT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/Field.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/Field.cpp new file mode 100644 index 000000000000..f37b3d486bc1 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/Field.cpp @@ -0,0 +1,3405 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/Field.h" + +#include +#include +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/page/cpdf_page.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfdoc/cpdf_interform.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "fpdfsdk/cpdfsdk_pageview.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/javascript/Document.h" +#include "fpdfsdk/javascript/Icon.h" +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_EventHandler.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" +#include "fpdfsdk/javascript/PublicMethods.h" +#include "fpdfsdk/javascript/cjs_event_context.h" +#include "fpdfsdk/javascript/cjs_runtime.h" +#include "fpdfsdk/javascript/color.h" + +namespace { + +bool SetWidgetDisplayStatus(CPDFSDK_Widget* pWidget, int value) { + if (!pWidget) + return false; + + uint32_t dwFlag = pWidget->GetFlags(); + switch (value) { + case 0: + dwFlag &= ~ANNOTFLAG_INVISIBLE; + dwFlag &= ~ANNOTFLAG_HIDDEN; + dwFlag &= ~ANNOTFLAG_NOVIEW; + dwFlag |= ANNOTFLAG_PRINT; + break; + case 1: + dwFlag &= ~ANNOTFLAG_INVISIBLE; + dwFlag &= ~ANNOTFLAG_NOVIEW; + dwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT); + break; + case 2: + dwFlag &= ~ANNOTFLAG_INVISIBLE; + dwFlag &= ~ANNOTFLAG_PRINT; + dwFlag &= ~ANNOTFLAG_HIDDEN; + dwFlag &= ~ANNOTFLAG_NOVIEW; + break; + case 3: + dwFlag |= ANNOTFLAG_NOVIEW; + dwFlag |= ANNOTFLAG_PRINT; + dwFlag &= ~ANNOTFLAG_HIDDEN; + break; + } + + if (dwFlag != pWidget->GetFlags()) { + pWidget->SetFlags(dwFlag); + return true; + } + + return false; +} + +} // namespace + +JSConstSpec CJS_Field::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}}; + +JSPropertySpec CJS_Field::PropertySpecs[] = { + {"alignment", get_alignment_static, set_alignment_static}, + {"borderStyle", get_borderStyle_static, set_borderStyle_static}, + {"buttonAlignX", get_buttonAlignX_static, set_buttonAlignX_static}, + {"buttonAlignY", get_buttonAlignY_static, set_buttonAlignY_static}, + {"buttonFitBounds", get_buttonFitBounds_static, set_buttonFitBounds_static}, + {"buttonPosition", get_buttonPosition_static, set_buttonPosition_static}, + {"buttonScaleHow", get_buttonScaleHow_static, set_buttonScaleHow_static}, + {"buttonScaleWhen", get_buttonScaleWhen_static, set_buttonScaleWhen_static}, + {"calcOrderIndex", get_calcOrderIndex_static, set_calcOrderIndex_static}, + {"charLimit", get_charLimit_static, set_charLimit_static}, + {"comb", get_comb_static, set_comb_static}, + {"commitOnSelChange", get_commitOnSelChange_static, + set_commitOnSelChange_static}, + {"currentValueIndices", get_currentValueIndices_static, + set_currentValueIndices_static}, + {"defaultStyle", get_defaultStyle_static, set_defaultStyle_static}, + {"defaultValue", get_defaultValue_static, set_defaultValue_static}, + {"doNotScroll", get_doNotScroll_static, set_doNotScroll_static}, + {"doNotSpellCheck", get_doNotSpellCheck_static, set_doNotSpellCheck_static}, + {"delay", get_delay_static, set_delay_static}, + {"display", get_display_static, set_display_static}, + {"doc", get_doc_static, set_doc_static}, + {"editable", get_editable_static, set_editable_static}, + {"exportValues", get_exportValues_static, set_exportValues_static}, + {"hidden", get_hidden_static, set_hidden_static}, + {"fileSelect", get_fileSelect_static, set_fileSelect_static}, + {"fillColor", get_fillColor_static, set_fillColor_static}, + {"lineWidth", get_lineWidth_static, set_lineWidth_static}, + {"highlight", get_highlight_static, set_highlight_static}, + {"multiline", get_multiline_static, set_multiline_static}, + {"multipleSelection", get_multipleSelection_static, + set_multipleSelection_static}, + {"name", get_name_static, set_name_static}, + {"numItems", get_numItems_static, set_numItems_static}, + {"page", get_page_static, set_page_static}, + {"password", get_password_static, set_password_static}, + {"print", get_print_static, set_print_static}, + {"radiosInUnison", get_radiosInUnison_static, set_radiosInUnison_static}, + {"readonly", get_readonly_static, set_readonly_static}, + {"rect", get_rect_static, set_rect_static}, + {"required", get_required_static, set_required_static}, + {"richText", get_richText_static, set_richText_static}, + {"richValue", get_richValue_static, set_richValue_static}, + {"rotation", get_rotation_static, set_rotation_static}, + {"strokeColor", get_strokeColor_static, set_strokeColor_static}, + {"style", get_style_static, set_style_static}, + {"submitName", get_submitName_static, set_submitName_static}, + {"textColor", get_textColor_static, set_textColor_static}, + {"textFont", get_textFont_static, set_textFont_static}, + {"textSize", get_textSize_static, set_textSize_static}, + {"type", get_type_static, set_type_static}, + {"userName", get_userName_static, set_userName_static}, + {"value", get_value_static, set_value_static}, + {"valueAsString", get_valueAsString_static, set_valueAsString_static}, + {"source", get_source_static, set_source_static}, + {0, 0, 0}}; + +JSMethodSpec CJS_Field::MethodSpecs[] = { + {"browseForFileToSubmit", browseForFileToSubmit_static}, + {"buttonGetCaption", buttonGetCaption_static}, + {"buttonGetIcon", buttonGetIcon_static}, + {"buttonImportIcon", buttonImportIcon_static}, + {"buttonSetCaption", buttonSetCaption_static}, + {"buttonSetIcon", buttonSetIcon_static}, + {"checkThisBox", checkThisBox_static}, + {"clearItems", clearItems_static}, + {"defaultIsChecked", defaultIsChecked_static}, + {"deleteItemAt", deleteItemAt_static}, + {"getArray", getArray_static}, + {"getItemAt", getItemAt_static}, + {"getLock", getLock_static}, + {"insertItemAt", insertItemAt_static}, + {"isBoxChecked", isBoxChecked_static}, + {"isDefaultChecked", isDefaultChecked_static}, + {"setAction", setAction_static}, + {"setFocus", setFocus_static}, + {"setItems", setItems_static}, + {"setLock", setLock_static}, + {"signatureGetModifications", signatureGetModifications_static}, + {"signatureGetSeedValue", signatureGetSeedValue_static}, + {"signatureInfo", signatureInfo_static}, + {"signatureSetSeedValue", signatureSetSeedValue_static}, + {"signatureSign", signatureSign_static}, + {"signatureValidate", signatureValidate_static}, + {0, 0}}; + +IMPLEMENT_JS_CLASS(CJS_Field, Field) + +CJS_DelayData::CJS_DelayData(FIELD_PROP prop, + int idx, + const CFX_WideString& name) + : eProp(prop), nControlIndex(idx), sFieldName(name) {} + +CJS_DelayData::~CJS_DelayData() {} + +void CJS_Field::InitInstance(IJS_Runtime* pIRuntime) { +} + +Field::Field(CJS_Object* pJSObject) + : CJS_EmbedObj(pJSObject), + m_pJSDoc(nullptr), + m_pFormFillEnv(nullptr), + m_nFormControlIndex(-1), + m_bCanSet(false), + m_bDelay(false) {} + +Field::~Field() {} + +// note: iControlNo = -1, means not a widget. +void Field::ParseFieldName(const std::wstring& strFieldNameParsed, + std::wstring& strFieldName, + int& iControlNo) { + int iStart = strFieldNameParsed.find_last_of(L'.'); + if (iStart == -1) { + strFieldName = strFieldNameParsed; + iControlNo = -1; + return; + } + std::wstring suffixal = strFieldNameParsed.substr(iStart + 1); + iControlNo = FXSYS_wtoi(suffixal.c_str()); + if (iControlNo == 0) { + int iSpaceStart; + while ((iSpaceStart = suffixal.find_last_of(L" ")) != -1) { + suffixal.erase(iSpaceStart, 1); + } + + if (suffixal.compare(L"0") != 0) { + strFieldName = strFieldNameParsed; + iControlNo = -1; + return; + } + } + strFieldName = strFieldNameParsed.substr(0, iStart); +} + +bool Field::AttachField(Document* pDocument, + const CFX_WideString& csFieldName) { + m_pJSDoc = pDocument; + m_pFormFillEnv.Reset(pDocument->GetFormFillEnv()); + m_bCanSet = m_pFormFillEnv->GetPermissions(FPDFPERM_FILL_FORM) || + m_pFormFillEnv->GetPermissions(FPDFPERM_ANNOT_FORM) || + m_pFormFillEnv->GetPermissions(FPDFPERM_MODIFY); + + CPDFSDK_InterForm* pRDInterForm = m_pFormFillEnv->GetInterForm(); + CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm(); + CFX_WideString swFieldNameTemp = csFieldName; + swFieldNameTemp.Replace(L"..", L"."); + + if (pInterForm->CountFields(swFieldNameTemp) <= 0) { + std::wstring strFieldName; + int iControlNo = -1; + ParseFieldName(swFieldNameTemp.c_str(), strFieldName, iControlNo); + if (iControlNo == -1) + return false; + + m_FieldName = strFieldName.c_str(); + m_nFormControlIndex = iControlNo; + return true; + } + + m_FieldName = swFieldNameTemp; + m_nFormControlIndex = -1; + + return true; +} + +std::vector Field::GetFormFields( + CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& csFieldName) { + std::vector fields; + CPDFSDK_InterForm* pReaderInterForm = pFormFillEnv->GetInterForm(); + CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm(); + for (int i = 0, sz = pInterForm->CountFields(csFieldName); i < sz; ++i) { + if (CPDF_FormField* pFormField = pInterForm->GetField(i, csFieldName)) + fields.push_back(pFormField); + } + return fields; +} + +std::vector Field::GetFormFields( + const CFX_WideString& csFieldName) const { + return Field::GetFormFields(m_pFormFillEnv.Get(), csFieldName); +} + +void Field::UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormField* pFormField, + bool bChangeMark, + bool bResetAP, + bool bRefresh) { + CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm(); + + if (bResetAP) { + std::vector widgets; + pInterForm->GetWidgets(pFormField, &widgets); + + int nFieldType = pFormField->GetFieldType(); + if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD) { + for (auto& pObserved : widgets) { + if (pObserved) { + bool bFormatted = false; + CFX_WideString sValue = static_cast(pObserved.Get()) + ->OnFormat(bFormatted); + if (pObserved) { // Not redundant, may be clobbered by OnFormat. + static_cast(pObserved.Get()) + ->ResetAppearance(bFormatted ? &sValue : nullptr, false); + } + } + } + } else { + for (auto& pObserved : widgets) { + if (pObserved) { + static_cast(pObserved.Get()) + ->ResetAppearance(nullptr, false); + } + } + } + } + + if (bRefresh) { + // Refresh the widget list. The calls in |bResetAP| may have caused widgets + // to be removed from the list. We need to call |GetWidgets| again to be + // sure none of the widgets have been deleted. + std::vector widgets; + pInterForm->GetWidgets(pFormField, &widgets); + + // TODO(dsinclair): Determine if all widgets share the same + // CPDFSDK_InterForm. If that's the case, we can move the code to + // |GetFormFillEnv| out of the loop. + for (auto& pObserved : widgets) { + if (pObserved) { + CPDFSDK_Widget* pWidget = static_cast(pObserved.Get()); + pWidget->GetInterForm()->GetFormFillEnv()->UpdateAllViews(nullptr, + pWidget); + } + } + } + + if (bChangeMark) + pFormFillEnv->SetChangeMark(); +} + +void Field::UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormControl* pFormControl, + bool bChangeMark, + bool bResetAP, + bool bRefresh) { + ASSERT(pFormControl); + + CPDFSDK_InterForm* pForm = pFormFillEnv->GetInterForm(); + CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl); + + if (pWidget) { + if (bResetAP) { + int nFieldType = pWidget->GetFieldType(); + if (nFieldType == FIELDTYPE_COMBOBOX || + nFieldType == FIELDTYPE_TEXTFIELD) { + bool bFormatted = false; + CFX_WideString sValue = pWidget->OnFormat(bFormatted); + pWidget->ResetAppearance(bFormatted ? &sValue : nullptr, false); + } else { + pWidget->ResetAppearance(nullptr, false); + } + } + + if (bRefresh) { + CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm(); + pInterForm->GetFormFillEnv()->UpdateAllViews(nullptr, pWidget); + } + } + + if (bChangeMark) + pFormFillEnv->SetChangeMark(); +} + +CPDFSDK_Widget* Field::GetWidget(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormControl* pFormControl) { + CPDFSDK_InterForm* pInterForm = + static_cast(pFormFillEnv->GetInterForm()); + return pInterForm ? pInterForm->GetWidget(pFormControl) : nullptr; +} + +bool Field::ValueIsOccur(CPDF_FormField* pFormField, + CFX_WideString csOptLabel) { + for (int i = 0, sz = pFormField->CountOptions(); i < sz; i++) { + if (csOptLabel.Compare(pFormField->GetOptionLabel(i)) == 0) + return true; + } + + return false; +} + +CPDF_FormControl* Field::GetSmartFieldControl(CPDF_FormField* pFormField) { + if (!pFormField->CountControls() || + m_nFormControlIndex >= pFormField->CountControls()) + return nullptr; + + if (m_nFormControlIndex < 0) + return pFormField->GetControl(0); + + return pFormField->GetControl(m_nFormControlIndex); +} + +bool Field::alignment(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + CFX_ByteString alignStr; + vp >> alignStr; + + if (m_bDelay) { + AddDelay_String(FP_ALIGNMENT, alignStr); + } else { + Field::SetAlignment(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, alignStr); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) + return false; + + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + switch (pFormControl->GetControlAlignment()) { + case 1: + vp << L"center"; + break; + case 0: + vp << L"left"; + break; + case 2: + vp << L"right"; + break; + default: + vp << L""; + } + } + + return true; +} + +void Field::SetAlignment(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_ByteString& string) { + // Not supported. +} + +bool Field::borderStyle(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + CFX_ByteString strType = ""; + vp >> strType; + + if (m_bDelay) { + AddDelay_String(FP_BORDERSTYLE, strType); + } else { + Field::SetBorderStyle(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, strType); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (!pFormField) + return false; + + CPDFSDK_Widget* pWidget = + GetWidget(m_pFormFillEnv.Get(), GetSmartFieldControl(pFormField)); + if (!pWidget) + return false; + + switch (pWidget->GetBorderStyle()) { + case BorderStyle::SOLID: + vp << L"solid"; + break; + case BorderStyle::DASH: + vp << L"dashed"; + break; + case BorderStyle::BEVELED: + vp << L"beveled"; + break; + case BorderStyle::INSET: + vp << L"inset"; + break; + case BorderStyle::UNDERLINE: + vp << L"underline"; + break; + default: + vp << L""; + break; + } + } + + return true; +} + +void Field::SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_ByteString& string) { + ASSERT(pFormFillEnv); + + BorderStyle nBorderStyle = BorderStyle::SOLID; + if (string == "solid") + nBorderStyle = BorderStyle::SOLID; + else if (string == "beveled") + nBorderStyle = BorderStyle::BEVELED; + else if (string == "dashed") + nBorderStyle = BorderStyle::DASH; + else if (string == "inset") + nBorderStyle = BorderStyle::INSET; + else if (string == "underline") + nBorderStyle = BorderStyle::UNDERLINE; + else + return; + + std::vector FieldArray = + GetFormFields(pFormFillEnv, swFieldName); + for (CPDF_FormField* pFormField : FieldArray) { + if (nControlIndex < 0) { + bool bSet = false; + for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) { + if (CPDFSDK_Widget* pWidget = + GetWidget(pFormFillEnv, pFormField->GetControl(i))) { + if (pWidget->GetBorderStyle() != nBorderStyle) { + pWidget->SetBorderStyle(nBorderStyle); + bSet = true; + } + } + } + if (bSet) + UpdateFormField(pFormFillEnv, pFormField, true, true, true); + } else { + if (nControlIndex >= pFormField->CountControls()) + return; + if (CPDF_FormControl* pFormControl = + pFormField->GetControl(nControlIndex)) { + if (CPDFSDK_Widget* pWidget = GetWidget(pFormFillEnv, pFormControl)) { + if (pWidget->GetBorderStyle() != nBorderStyle) { + pWidget->SetBorderStyle(nBorderStyle); + UpdateFormControl(pFormFillEnv, pFormControl, true, true, true); + } + } + } + } + } +} + +bool Field::buttonAlignX(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + int nVP; + vp >> nVP; + + if (m_bDelay) { + AddDelay_Int(FP_BUTTONALIGNX, nVP); + } else { + Field::SetButtonAlignX(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, nVP); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) + return false; + + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + CPDF_IconFit IconFit = pFormControl->GetIconFit(); + + FX_FLOAT fLeft, fBottom; + IconFit.GetIconPosition(fLeft, fBottom); + + vp << (int32_t)fLeft; + } + + return true; +} + +void Field::SetButtonAlignX(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number) { + // Not supported. +} + +bool Field::buttonAlignY(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + int nVP; + vp >> nVP; + + if (m_bDelay) { + AddDelay_Int(FP_BUTTONALIGNY, nVP); + } else { + Field::SetButtonAlignY(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, nVP); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) + return false; + + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + CPDF_IconFit IconFit = pFormControl->GetIconFit(); + + FX_FLOAT fLeft, fBottom; + IconFit.GetIconPosition(fLeft, fBottom); + + vp << (int32_t)fBottom; + } + + return true; +} + +void Field::SetButtonAlignY(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number) { + // Not supported. +} + +bool Field::buttonFitBounds(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + + if (m_bDelay) { + AddDelay_Bool(FP_BUTTONFITBOUNDS, bVP); + } else { + Field::SetButtonFitBounds(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, bVP); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) + return false; + + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + vp << pFormControl->GetIconFit().GetFittingBounds(); + } + + return true; +} + +void Field::SetButtonFitBounds(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b) { + // Not supported. +} + +bool Field::buttonPosition(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + int nVP; + vp >> nVP; + + if (m_bDelay) { + AddDelay_Int(FP_BUTTONPOSITION, nVP); + } else { + Field::SetButtonPosition(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, nVP); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) + return false; + + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + vp << pFormControl->GetTextPosition(); + } + return true; +} + +void Field::SetButtonPosition(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number) { + // Not supported. +} + +bool Field::buttonScaleHow(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + int nVP; + vp >> nVP; + + if (m_bDelay) { + AddDelay_Int(FP_BUTTONSCALEHOW, nVP); + } else { + Field::SetButtonScaleHow(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, nVP); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) + return false; + + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + CPDF_IconFit IconFit = pFormControl->GetIconFit(); + if (IconFit.IsProportionalScale()) + vp << (int32_t)0; + else + vp << (int32_t)1; + } + + return true; +} + +void Field::SetButtonScaleHow(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number) { + // Not supported. +} + +bool Field::buttonScaleWhen(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + int nVP; + vp >> nVP; + + if (m_bDelay) { + AddDelay_Int(FP_BUTTONSCALEWHEN, nVP); + } else { + Field::SetButtonScaleWhen(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, nVP); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) + return false; + + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + CPDF_IconFit IconFit = pFormControl->GetIconFit(); + int ScaleM = IconFit.GetScaleMethod(); + switch (ScaleM) { + case CPDF_IconFit::Always: + vp << (int32_t)CPDF_IconFit::Always; + break; + case CPDF_IconFit::Bigger: + vp << (int32_t)CPDF_IconFit::Bigger; + break; + case CPDF_IconFit::Never: + vp << (int32_t)CPDF_IconFit::Never; + break; + case CPDF_IconFit::Smaller: + vp << (int32_t)CPDF_IconFit::Smaller; + break; + } + } + + return true; +} + +void Field::SetButtonScaleWhen(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number) { + // Not supported. +} + +bool Field::calcOrderIndex(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + int nVP; + vp >> nVP; + + if (m_bDelay) { + AddDelay_Int(FP_CALCORDERINDEX, nVP); + } else { + Field::SetCalcOrderIndex(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, nVP); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && + pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) { + return false; + } + + CPDFSDK_InterForm* pRDInterForm = m_pFormFillEnv->GetInterForm(); + CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm(); + vp << (int32_t)pInterForm->FindFieldInCalculationOrder(pFormField); + } + + return true; +} + +void Field::SetCalcOrderIndex(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number) { + // Not supported. +} + +bool Field::charLimit(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + int nVP; + vp >> nVP; + + if (m_bDelay) { + AddDelay_Int(FP_CHARLIMIT, nVP); + } else { + Field::SetCharLimit(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, nVP); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) + return false; + + vp << (int32_t)pFormField->GetMaxLen(); + } + return true; +} + +void Field::SetCharLimit(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number) { + // Not supported. +} + +bool Field::comb(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + + if (m_bDelay) { + AddDelay_Bool(FP_COMB, bVP); + } else { + Field::SetComb(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, + bVP); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) + return false; + + if (pFormField->GetFieldFlags() & FIELDFLAG_COMB) + vp << true; + else + vp << false; + } + + return true; +} + +void Field::SetComb(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b) { + // Not supported. +} + +bool Field::commitOnSelChange(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + + if (m_bDelay) { + AddDelay_Bool(FP_COMMITONSELCHANGE, bVP); + } else { + Field::SetCommitOnSelChange(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, bVP); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && + pFormField->GetFieldType() != FIELDTYPE_LISTBOX) { + return false; + } + + if (pFormField->GetFieldFlags() & FIELDFLAG_COMMITONSELCHANGE) + vp << true; + else + vp << false; + } + + return true; +} + +void Field::SetCommitOnSelChange(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b) { + // Not supported. +} + +bool Field::currentValueIndices(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + std::vector array; + if (vp.GetJSValue()->GetType() == CJS_Value::VT_number) { + int iSelecting = 0; + vp >> iSelecting; + array.push_back(iSelecting); + } else if (vp.GetJSValue()->IsArrayObject()) { + CJS_Array SelArray; + CJS_Value SelValue(pRuntime); + int iSelecting; + vp >> SelArray; + for (int i = 0, sz = SelArray.GetLength(pRuntime); i < sz; i++) { + SelArray.GetElement(pRuntime, i, SelValue); + iSelecting = SelValue.ToInt(pRuntime); + array.push_back(iSelecting); + } + } + + if (m_bDelay) { + AddDelay_WordArray(FP_CURRENTVALUEINDICES, array); + } else { + Field::SetCurrentValueIndices(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, array); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && + pFormField->GetFieldType() != FIELDTYPE_LISTBOX) { + return false; + } + + if (pFormField->CountSelectedItems() == 1) { + vp << pFormField->GetSelectedIndex(0); + } else if (pFormField->CountSelectedItems() > 1) { + CJS_Array SelArray; + for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) { + SelArray.SetElement( + pRuntime, i, CJS_Value(pRuntime, pFormField->GetSelectedIndex(i))); + } + vp << SelArray; + } else { + vp << -1; + } + } + + return true; +} + +void Field::SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const std::vector& array) { + ASSERT(pFormFillEnv); + std::vector FieldArray = + GetFormFields(pFormFillEnv, swFieldName); + + for (CPDF_FormField* pFormField : FieldArray) { + int nFieldType = pFormField->GetFieldType(); + if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_LISTBOX) { + uint32_t dwFieldFlags = pFormField->GetFieldFlags(); + pFormField->ClearSelection(true); + for (size_t i = 0; i < array.size(); ++i) { + if (i != 0 && !(dwFieldFlags & (1 << 21))) + break; + if (array[i] < static_cast(pFormField->CountOptions()) && + !pFormField->IsItemSelected(array[i])) { + pFormField->SetItemSelection(array[i], true); + } + } + UpdateFormField(pFormFillEnv, pFormField, true, true, true); + } + } +} + +bool Field::defaultStyle(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return false; +} + +void Field::SetDefaultStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex) { + // Not supported. +} + +bool Field::defaultValue(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + CFX_WideString WideStr; + vp >> WideStr; + + if (m_bDelay) { + AddDelay_WideString(FP_DEFAULTVALUE, WideStr); + } else { + Field::SetDefaultValue(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, WideStr); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON || + pFormField->GetFieldType() == FIELDTYPE_SIGNATURE) { + return false; + } + + vp << pFormField->GetDefaultValue(); + } + return true; +} + +void Field::SetDefaultValue(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_WideString& string) { + // Not supported. +} + +bool Field::doNotScroll(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + + if (m_bDelay) { + AddDelay_Bool(FP_DONOTSCROLL, bVP); + } else { + Field::SetDoNotScroll(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, bVP); + } + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) + return false; + + if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSCROLL) + vp << true; + else + vp << false; + } + + return true; +} + +void Field::SetDoNotScroll(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b) { + // Not supported. +} + +bool Field::doNotSpellCheck(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + } else { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD && + pFormField->GetFieldType() != FIELDTYPE_COMBOBOX) { + return false; + } + + if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSPELLCHECK) + vp << true; + else + vp << false; + } + + return true; +} + +void Field::SetDelay(bool bDelay) { + m_bDelay = bDelay; + + if (!m_bDelay) { + if (m_pJSDoc) + m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex); + } +} + +bool Field::delay(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsSetting()) { + vp << m_bDelay; + return true; + } + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + SetDelay(bVP); + return true; +} + +bool Field::display(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + int nVP; + vp >> nVP; + if (m_bDelay) { + AddDelay_Int(FP_DISPLAY, nVP); + } else { + Field::SetDisplay(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, + nVP); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + ASSERT(pFormField); + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + CPDFSDK_Widget* pWidget = + pInterForm->GetWidget(GetSmartFieldControl(pFormField)); + if (!pWidget) + return false; + + uint32_t dwFlag = pWidget->GetFlags(); + if (ANNOTFLAG_INVISIBLE & dwFlag || ANNOTFLAG_HIDDEN & dwFlag) { + vp << (int32_t)1; + } else { + if (ANNOTFLAG_PRINT & dwFlag) { + if (ANNOTFLAG_NOVIEW & dwFlag) { + vp << (int32_t)3; + } else { + vp << (int32_t)0; + } + } else { + vp << (int32_t)2; + } + } + return true; +} + +void Field::SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number) { + CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm(); + std::vector FieldArray = + GetFormFields(pFormFillEnv, swFieldName); + for (CPDF_FormField* pFormField : FieldArray) { + if (nControlIndex < 0) { + bool bAnySet = false; + for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) { + CPDF_FormControl* pFormControl = pFormField->GetControl(i); + ASSERT(pFormControl); + + CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl); + if (SetWidgetDisplayStatus(pWidget, number)) + bAnySet = true; + } + + if (bAnySet) + UpdateFormField(pFormFillEnv, pFormField, true, false, true); + } else { + if (nControlIndex >= pFormField->CountControls()) + return; + + CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex); + if (!pFormControl) + return; + + CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl); + if (SetWidgetDisplayStatus(pWidget, number)) + UpdateFormControl(pFormFillEnv, pFormControl, true, false, true); + } + } +} + +bool Field::doc(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + vp << m_pJSDoc->GetCJSDoc(); + return true; +} + +bool Field::editable(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX) + return false; + + vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_EDIT); + return true; +} + +bool Field::exportValues(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX && + pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON) { + return false; + } + if (vp.IsSetting()) + return m_bCanSet && vp.GetJSValue()->IsArrayObject(); + + CJS_Array ExportValusArray; + if (m_nFormControlIndex < 0) { + for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { + CPDF_FormControl* pFormControl = pFormField->GetControl(i); + ExportValusArray.SetElement( + pRuntime, i, + CJS_Value(pRuntime, pFormControl->GetExportValue().c_str())); + } + } else { + if (m_nFormControlIndex >= pFormField->CountControls()) + return false; + + CPDF_FormControl* pFormControl = + pFormField->GetControl(m_nFormControlIndex); + if (!pFormControl) + return false; + + ExportValusArray.SetElement( + pRuntime, 0, + CJS_Value(pRuntime, pFormControl->GetExportValue().c_str())); + } + vp << ExportValusArray; + return true; +} + +bool Field::fileSelect(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) + return false; + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + return true; + } + vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT); + return true; +} + +bool Field::fillColor(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + CJS_Array crArray; + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + if (!vp.GetJSValue()->IsArrayObject()) + return false; + + vp >> crArray; + + CPWL_Color color; + color::ConvertArrayToPWLColor(pRuntime, crArray, &color); + if (m_bDelay) { + AddDelay_Color(FP_FILLCOLOR, color); + } else { + Field::SetFillColor(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, color); + } + return true; + } + CPDF_FormField* pFormField = FieldArray[0]; + ASSERT(pFormField); + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + int iColorType; + pFormControl->GetBackgroundColor(iColorType); + + CPWL_Color color; + if (iColorType == COLORTYPE_TRANSPARENT) { + color = CPWL_Color(COLORTYPE_TRANSPARENT); + } else if (iColorType == COLORTYPE_GRAY) { + color = + CPWL_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBackgroundColor(0)); + } else if (iColorType == COLORTYPE_RGB) { + color = + CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBackgroundColor(0), + pFormControl->GetOriginalBackgroundColor(1), + pFormControl->GetOriginalBackgroundColor(2)); + } else if (iColorType == COLORTYPE_CMYK) { + color = + CPWL_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBackgroundColor(0), + pFormControl->GetOriginalBackgroundColor(1), + pFormControl->GetOriginalBackgroundColor(2), + pFormControl->GetOriginalBackgroundColor(3)); + } else { + return false; + } + color::ConvertPWLColorToArray(pRuntime, color, &crArray); + vp << crArray; + return true; +} + +void Field::SetFillColor(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CPWL_Color& color) { + // Not supported. +} + +bool Field::hidden(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + if (m_bDelay) { + AddDelay_Bool(FP_HIDDEN, bVP); + } else { + Field::SetHidden(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, + bVP); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + ASSERT(pFormField); + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + CPDFSDK_Widget* pWidget = + pInterForm->GetWidget(GetSmartFieldControl(pFormField)); + if (!pWidget) + return false; + + uint32_t dwFlags = pWidget->GetFlags(); + if (ANNOTFLAG_INVISIBLE & dwFlags || ANNOTFLAG_HIDDEN & dwFlags) + vp << true; + else + vp << false; + + return true; +} + +void Field::SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b) { + int display = b ? 1 /*Hidden*/ : 0 /*Visible*/; + SetDisplay(pFormFillEnv, swFieldName, nControlIndex, display); +} + +bool Field::highlight(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + CFX_ByteString strMode; + vp >> strMode; + + if (m_bDelay) { + AddDelay_String(FP_HIGHLIGHT, strMode); + } else { + Field::SetHighlight(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, strMode); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) + return false; + + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + int eHM = pFormControl->GetHighlightingMode(); + switch (eHM) { + case CPDF_FormControl::None: + vp << L"none"; + break; + case CPDF_FormControl::Push: + vp << L"push"; + break; + case CPDF_FormControl::Invert: + vp << L"invert"; + break; + case CPDF_FormControl::Outline: + vp << L"outline"; + break; + case CPDF_FormControl::Toggle: + vp << L"toggle"; + break; + } + return true; +} + +void Field::SetHighlight(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_ByteString& string) { + // Not supported. +} + +bool Field::lineWidth(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + int iWidth; + vp >> iWidth; + + if (m_bDelay) { + AddDelay_Int(FP_LINEWIDTH, iWidth); + } else { + Field::SetLineWidth(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, iWidth); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + ASSERT(pFormField); + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + if (!pFormField->CountControls()) + return false; + + CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(0)); + if (!pWidget) + return false; + + vp << (int32_t)pWidget->GetBorderWidth(); + return true; +} + +void Field::SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number) { + CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm(); + std::vector FieldArray = + GetFormFields(pFormFillEnv, swFieldName); + for (CPDF_FormField* pFormField : FieldArray) { + if (nControlIndex < 0) { + bool bSet = false; + for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) { + CPDF_FormControl* pFormControl = pFormField->GetControl(i); + ASSERT(pFormControl); + + if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) { + if (number != pWidget->GetBorderWidth()) { + pWidget->SetBorderWidth(number); + bSet = true; + } + } + } + if (bSet) + UpdateFormField(pFormFillEnv, pFormField, true, true, true); + } else { + if (nControlIndex >= pFormField->CountControls()) + return; + if (CPDF_FormControl* pFormControl = + pFormField->GetControl(nControlIndex)) { + if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) { + if (number != pWidget->GetBorderWidth()) { + pWidget->SetBorderWidth(number); + UpdateFormControl(pFormFillEnv, pFormControl, true, true, true); + } + } + } + } + } +} + +bool Field::multiline(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + + if (m_bDelay) { + AddDelay_Bool(FP_MULTILINE, bVP); + } else { + Field::SetMultiline(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, bVP); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) + return false; + + if (pFormField->GetFieldFlags() & FIELDFLAG_MULTILINE) + vp << true; + else + vp << false; + + return true; +} + +void Field::SetMultiline(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b) { + // Not supported. +} + +bool Field::multipleSelection(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + if (m_bDelay) { + AddDelay_Bool(FP_MULTIPLESELECTION, bVP); + } else { + Field::SetMultipleSelection(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, bVP); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_LISTBOX) + return false; + + vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_MULTISELECT); + return true; +} + +void Field::SetMultipleSelection(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b) { + // Not supported. +} + +bool Field::name(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + vp << m_FieldName; + return true; +} + +bool Field::numItems(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && + pFormField->GetFieldType() != FIELDTYPE_LISTBOX) { + return false; + } + + vp << (int32_t)pFormField->CountOptions(); + return true; +} + +bool Field::page(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) { + sError = JSGetStringFromID(IDS_STRING_JSREADONLY); + return false; + } + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (!pFormField) + return false; + + std::vector widgets; + m_pFormFillEnv->GetInterForm()->GetWidgets(pFormField, &widgets); + if (widgets.empty()) { + vp << (int32_t)-1; + return true; + } + + CJS_Array PageArray; + int i = 0; + for (const auto& pObserved : widgets) { + if (!pObserved) { + sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT); + return false; + } + + auto pWidget = static_cast(pObserved.Get()); + CPDFSDK_PageView* pPageView = pWidget->GetPageView(); + if (!pPageView) + return false; + + PageArray.SetElement( + pRuntime, i, CJS_Value(pRuntime, (int32_t)pPageView->GetPageIndex())); + ++i; + } + + vp << PageArray; + return true; +} + +bool Field::password(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + if (m_bDelay) { + AddDelay_Bool(FP_PASSWORD, bVP); + } else { + Field::SetPassword(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, + bVP); + } + return true; + } + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) + return false; + + vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_PASSWORD); + return true; +} + +void Field::SetPassword(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b) { + // Not supported. +} + +bool Field::print(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + + for (CPDF_FormField* pFormField : FieldArray) { + if (m_nFormControlIndex < 0) { + bool bSet = false; + for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) { + if (CPDFSDK_Widget* pWidget = + pInterForm->GetWidget(pFormField->GetControl(i))) { + uint32_t dwFlags = pWidget->GetFlags(); + if (bVP) + dwFlags |= ANNOTFLAG_PRINT; + else + dwFlags &= ~ANNOTFLAG_PRINT; + + if (dwFlags != pWidget->GetFlags()) { + pWidget->SetFlags(dwFlags); + bSet = true; + } + } + } + + if (bSet) + UpdateFormField(m_pFormFillEnv.Get(), pFormField, true, false, true); + } else { + if (m_nFormControlIndex >= pFormField->CountControls()) + return false; + if (CPDF_FormControl* pFormControl = + pFormField->GetControl(m_nFormControlIndex)) { + if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) { + uint32_t dwFlags = pWidget->GetFlags(); + if (bVP) + dwFlags |= ANNOTFLAG_PRINT; + else + dwFlags &= ~ANNOTFLAG_PRINT; + + if (dwFlags != pWidget->GetFlags()) { + pWidget->SetFlags(dwFlags); + UpdateFormControl(m_pFormFillEnv.Get(), + pFormField->GetControl(m_nFormControlIndex), + true, false, true); + } + } + } + } + } + return true; + } + + CPDF_FormField* pFormField = FieldArray[0]; + CPDFSDK_Widget* pWidget = + pInterForm->GetWidget(GetSmartFieldControl(pFormField)); + if (!pWidget) + return false; + + vp << !!(pWidget->GetFlags() & ANNOTFLAG_PRINT); + return true; +} + +bool Field::radiosInUnison(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + return true; + } + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON) + return false; + + vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON); + return true; +} + +bool Field::readonly(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + return true; + } + vp << !!(FieldArray[0]->GetFieldFlags() & FIELDFLAG_READONLY); + return true; +} + +bool Field::rect(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + CJS_Value Upper_Leftx(pRuntime); + CJS_Value Upper_Lefty(pRuntime); + CJS_Value Lower_Rightx(pRuntime); + CJS_Value Lower_Righty(pRuntime); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + if (!vp.GetJSValue()->IsArrayObject()) + return false; + + CJS_Array rcArray; + vp >> rcArray; + rcArray.GetElement(pRuntime, 0, Upper_Leftx); + rcArray.GetElement(pRuntime, 1, Upper_Lefty); + rcArray.GetElement(pRuntime, 2, Lower_Rightx); + rcArray.GetElement(pRuntime, 3, Lower_Righty); + + FX_FLOAT pArray[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + pArray[0] = static_cast(Upper_Leftx.ToInt(pRuntime)); + pArray[1] = static_cast(Lower_Righty.ToInt(pRuntime)); + pArray[2] = static_cast(Lower_Rightx.ToInt(pRuntime)); + pArray[3] = static_cast(Upper_Lefty.ToInt(pRuntime)); + + CFX_FloatRect crRect(pArray); + if (m_bDelay) { + AddDelay_Rect(FP_RECT, crRect); + } else { + Field::SetRect(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, + crRect); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + CPDFSDK_Widget* pWidget = + pInterForm->GetWidget(GetSmartFieldControl(pFormField)); + if (!pWidget) + return false; + + CFX_FloatRect crRect = pWidget->GetRect(); + Upper_Leftx = CJS_Value(pRuntime, static_cast(crRect.left)); + Upper_Lefty = CJS_Value(pRuntime, static_cast(crRect.top)); + Lower_Rightx = CJS_Value(pRuntime, static_cast(crRect.right)); + Lower_Righty = CJS_Value(pRuntime, static_cast(crRect.bottom)); + + CJS_Array rcArray; + rcArray.SetElement(pRuntime, 0, Upper_Leftx); + rcArray.SetElement(pRuntime, 1, Upper_Lefty); + rcArray.SetElement(pRuntime, 2, Lower_Rightx); + rcArray.SetElement(pRuntime, 3, Lower_Righty); + vp << rcArray; + return true; +} + +void Field::SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_FloatRect& rect) { + CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm(); + std::vector FieldArray = + GetFormFields(pFormFillEnv, swFieldName); + for (CPDF_FormField* pFormField : FieldArray) { + if (nControlIndex < 0) { + bool bSet = false; + for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) { + CPDF_FormControl* pFormControl = pFormField->GetControl(i); + ASSERT(pFormControl); + + if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) { + CFX_FloatRect crRect = rect; + + CPDF_Page* pPDFPage = pWidget->GetPDFPage(); + crRect.Intersect(pPDFPage->GetPageBBox()); + + if (!crRect.IsEmpty()) { + CFX_FloatRect rcOld = pWidget->GetRect(); + if (crRect.left != rcOld.left || crRect.right != rcOld.right || + crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) { + pWidget->SetRect(crRect); + bSet = true; + } + } + } + } + + if (bSet) + UpdateFormField(pFormFillEnv, pFormField, true, true, true); + } else { + if (nControlIndex >= pFormField->CountControls()) + return; + if (CPDF_FormControl* pFormControl = + pFormField->GetControl(nControlIndex)) { + if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) { + CFX_FloatRect crRect = rect; + + CPDF_Page* pPDFPage = pWidget->GetPDFPage(); + crRect.Intersect(pPDFPage->GetPageBBox()); + + if (!crRect.IsEmpty()) { + CFX_FloatRect rcOld = pWidget->GetRect(); + if (crRect.left != rcOld.left || crRect.right != rcOld.right || + crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) { + pWidget->SetRect(crRect); + UpdateFormControl(pFormFillEnv, pFormControl, true, true, true); + } + } + } + } + } + } +} + +bool Field::required(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + return true; + } + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON) + return false; + + vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_REQUIRED); + return true; +} + +bool Field::richText(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + bool bVP; + vp >> bVP; + if (m_bDelay) + AddDelay_Bool(FP_RICHTEXT, bVP); + + return true; + } + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) + return false; + + vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_RICHTEXT); + return true; +} + +bool Field::richValue(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +bool Field::rotation(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + int nVP; + vp >> nVP; + if (m_bDelay) { + AddDelay_Int(FP_ROTATION, nVP); + } else { + Field::SetRotation(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, + nVP); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + vp << (int32_t)pFormControl->GetRotation(); + return true; +} + +void Field::SetRotation(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number) { + // Not supported. +} + +bool Field::strokeColor(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + CJS_Array crArray; + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + if (!vp.GetJSValue()->IsArrayObject()) + return false; + + vp >> crArray; + + CPWL_Color color; + color::ConvertArrayToPWLColor(pRuntime, crArray, &color); + if (m_bDelay) { + AddDelay_Color(FP_STROKECOLOR, color); + } else { + Field::SetStrokeColor(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, color); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + int iColorType; + pFormControl->GetBorderColor(iColorType); + + CPWL_Color color; + if (iColorType == COLORTYPE_TRANSPARENT) { + color = CPWL_Color(COLORTYPE_TRANSPARENT); + } else if (iColorType == COLORTYPE_GRAY) { + color = CPWL_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBorderColor(0)); + } else if (iColorType == COLORTYPE_RGB) { + color = CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBorderColor(0), + pFormControl->GetOriginalBorderColor(1), + pFormControl->GetOriginalBorderColor(2)); + } else if (iColorType == COLORTYPE_CMYK) { + color = CPWL_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBorderColor(0), + pFormControl->GetOriginalBorderColor(1), + pFormControl->GetOriginalBorderColor(2), + pFormControl->GetOriginalBorderColor(3)); + } else { + return false; + } + + color::ConvertPWLColorToArray(pRuntime, color, &crArray); + vp << crArray; + return true; +} + +void Field::SetStrokeColor(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CPWL_Color& color) { + // Not supported. +} + +bool Field::style(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + CFX_ByteString csBCaption; + vp >> csBCaption; + + if (m_bDelay) { + AddDelay_String(FP_STYLE, csBCaption); + } else { + Field::SetStyle(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, + csBCaption); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON && + pFormField->GetFieldType() != FIELDTYPE_CHECKBOX) { + return false; + } + + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + CFX_WideString csWCaption = pFormControl->GetNormalCaption(); + CFX_ByteString csBCaption; + + switch (csWCaption[0]) { + case L'l': + csBCaption = "circle"; + break; + case L'8': + csBCaption = "cross"; + break; + case L'u': + csBCaption = "diamond"; + break; + case L'n': + csBCaption = "square"; + break; + case L'H': + csBCaption = "star"; + break; + default: // L'4' + csBCaption = "check"; + break; + } + vp << csBCaption; + return true; +} + +void Field::SetStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_ByteString& string) { + // Not supported. +} + +bool Field::submitName(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +bool Field::textColor(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + CJS_Array crArray; + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + if (!vp.GetJSValue()->IsArrayObject()) + return false; + + vp >> crArray; + + CPWL_Color color; + color::ConvertArrayToPWLColor(pRuntime, crArray, &color); + if (m_bDelay) { + AddDelay_Color(FP_TEXTCOLOR, color); + } else { + Field::SetTextColor(m_pFormFillEnv.Get(), m_FieldName, + m_nFormControlIndex, color); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + int iColorType; + FX_ARGB color; + CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance(); + FieldAppearance.GetColor(color, iColorType); + + int32_t a; + int32_t r; + int32_t g; + int32_t b; + ArgbDecode(color, a, r, g, b); + + CPWL_Color crRet = + CPWL_Color(COLORTYPE_RGB, r / 255.0f, g / 255.0f, b / 255.0f); + + if (iColorType == COLORTYPE_TRANSPARENT) + crRet = CPWL_Color(COLORTYPE_TRANSPARENT); + + color::ConvertPWLColorToArray(pRuntime, crRet, &crArray); + vp << crArray; + return true; +} + +void Field::SetTextColor(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CPWL_Color& color) { + // Not supported. +} + +bool Field::textFont(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + CFX_ByteString csFontName; + vp >> csFontName; + if (csFontName.IsEmpty()) + return false; + + if (m_bDelay) { + AddDelay_String(FP_TEXTFONT, csFontName); + } else { + Field::SetTextFont(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, + csFontName); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + ASSERT(pFormField); + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + int nFieldType = pFormField->GetFieldType(); + if (nFieldType != FIELDTYPE_PUSHBUTTON && nFieldType != FIELDTYPE_COMBOBOX && + nFieldType != FIELDTYPE_LISTBOX && nFieldType != FIELDTYPE_TEXTFIELD) { + return false; + } + CPDF_Font* pFont = pFormControl->GetDefaultControlFont(); + if (!pFont) + return false; + + vp << pFont->GetBaseFont(); + return true; +} + +void Field::SetTextFont(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_ByteString& string) { + // Not supported. +} + +bool Field::textSize(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + int nVP; + vp >> nVP; + if (m_bDelay) { + AddDelay_Int(FP_TEXTSIZE, nVP); + } else { + Field::SetTextSize(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, + nVP); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + ASSERT(pFormField); + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance(); + + CFX_ByteString csFontNameTag; + FX_FLOAT fFontSize; + FieldAppearance.GetFont(csFontNameTag, fFontSize); + vp << (int)fFontSize; + return true; +} + +void Field::SetTextSize(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number) { + // Not supported. +} + +bool Field::type(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + switch (pFormField->GetFieldType()) { + case FIELDTYPE_UNKNOWN: + vp << L"unknown"; + break; + case FIELDTYPE_PUSHBUTTON: + vp << L"button"; + break; + case FIELDTYPE_CHECKBOX: + vp << L"checkbox"; + break; + case FIELDTYPE_RADIOBUTTON: + vp << L"radiobutton"; + break; + case FIELDTYPE_COMBOBOX: + vp << L"combobox"; + break; + case FIELDTYPE_LISTBOX: + vp << L"listbox"; + break; + case FIELDTYPE_TEXTFIELD: + vp << L"text"; + break; + case FIELDTYPE_SIGNATURE: + vp << L"signature"; + break; + default: + vp << L"unknown"; + break; + } + return true; +} + +bool Field::userName(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + ASSERT(m_pFormFillEnv); + + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + CFX_WideString swName; + vp >> swName; + + if (m_bDelay) { + AddDelay_WideString(FP_USERNAME, swName); + } else { + Field::SetUserName(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, + swName); + } + return true; + } + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + vp << FieldArray[0]->GetAlternateName(); + return true; +} + +void Field::SetUserName(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_WideString& string) { + // Not supported. +} + +bool Field::value(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + if (!m_bCanSet) + return false; + + std::vector strArray; + if (vp.GetJSValue()->IsArrayObject()) { + CJS_Array ValueArray; + vp.GetJSValue()->ConvertToArray(pRuntime, ValueArray); + for (int i = 0, sz = ValueArray.GetLength(pRuntime); i < sz; i++) { + CJS_Value ElementValue(pRuntime); + ValueArray.GetElement(pRuntime, i, ElementValue); + strArray.push_back(ElementValue.ToCFXWideString(pRuntime)); + } + } else { + CFX_WideString swValue; + vp >> swValue; + strArray.push_back(swValue); + } + + if (m_bDelay) { + AddDelay_WideStringArray(FP_VALUE, strArray); + } else { + Field::SetValue(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, + strArray); + } + return true; + } + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + switch (pFormField->GetFieldType()) { + case FIELDTYPE_PUSHBUTTON: + return false; + case FIELDTYPE_COMBOBOX: + case FIELDTYPE_TEXTFIELD: { + vp << pFormField->GetValue(); + } break; + case FIELDTYPE_LISTBOX: { + if (pFormField->CountSelectedItems() > 1) { + CJS_Array ValueArray; + CJS_Value ElementValue(pRuntime); + int iIndex; + for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) { + iIndex = pFormField->GetSelectedIndex(i); + ElementValue = + CJS_Value(pRuntime, pFormField->GetOptionValue(iIndex).c_str()); + if (FXSYS_wcslen(ElementValue.ToCFXWideString(pRuntime).c_str()) == + 0) { + ElementValue = + CJS_Value(pRuntime, pFormField->GetOptionLabel(iIndex).c_str()); + } + ValueArray.SetElement(pRuntime, i, ElementValue); + } + vp << ValueArray; + } else { + vp << pFormField->GetValue(); + } + } break; + case FIELDTYPE_CHECKBOX: + case FIELDTYPE_RADIOBUTTON: { + bool bFind = false; + for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { + if (pFormField->GetControl(i)->IsChecked()) { + vp << pFormField->GetControl(i)->GetExportValue(); + bFind = true; + break; + } + } + if (!bFind) + vp << L"Off"; + } break; + default: + vp << pFormField->GetValue(); + break; + } + vp.GetJSValue()->MaybeCoerceToNumber(pRuntime); + return true; +} + +void Field::SetValue(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const std::vector& strArray) { + ASSERT(pFormFillEnv); + if (strArray.empty()) + return; + + std::vector FieldArray = + GetFormFields(pFormFillEnv, swFieldName); + + for (CPDF_FormField* pFormField : FieldArray) { + if (pFormField->GetFullName().Compare(swFieldName) != 0) + continue; + + switch (pFormField->GetFieldType()) { + case FIELDTYPE_TEXTFIELD: + case FIELDTYPE_COMBOBOX: + if (pFormField->GetValue() != strArray[0]) { + pFormField->SetValue(strArray[0], true); + UpdateFormField(pFormFillEnv, pFormField, true, false, true); + } + break; + case FIELDTYPE_CHECKBOX: + case FIELDTYPE_RADIOBUTTON: { + if (pFormField->GetValue() != strArray[0]) { + pFormField->SetValue(strArray[0], true); + UpdateFormField(pFormFillEnv, pFormField, true, false, true); + } + } break; + case FIELDTYPE_LISTBOX: { + bool bModified = false; + for (const auto& str : strArray) { + if (!pFormField->IsItemSelected(pFormField->FindOption(str))) { + bModified = true; + break; + } + } + if (bModified) { + pFormField->ClearSelection(true); + for (const auto& str : strArray) { + int index = pFormField->FindOption(str); + if (!pFormField->IsItemSelected(index)) + pFormField->SetItemSelection(index, true, true); + } + UpdateFormField(pFormFillEnv, pFormField, true, false, true); + } + } break; + default: + break; + } + } +} + +bool Field::valueAsString(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON) + return false; + + if (pFormField->GetFieldType() == FIELDTYPE_CHECKBOX) { + if (!pFormField->CountControls()) + return false; + + if (pFormField->GetControl(0)->IsChecked()) + vp << L"Yes"; + else + vp << L"Off"; + } else if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON && + !(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)) { + for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) { + if (pFormField->GetControl(i)->IsChecked()) { + vp << pFormField->GetControl(i)->GetExportValue().c_str(); + break; + } else { + vp << L"Off"; + } + } + } else if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX && + (pFormField->CountSelectedItems() > 1)) { + vp << L""; + } else { + vp << pFormField->GetValue().c_str(); + } + + return true; +} + +bool Field::browseForFileToSubmit(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if ((pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT) && + (pFormField->GetFieldType() == FIELDTYPE_TEXTFIELD)) { + CFX_WideString wsFileName = m_pFormFillEnv->JS_fieldBrowse(); + if (!wsFileName.IsEmpty()) { + pFormField->SetValue(wsFileName); + UpdateFormField(m_pFormFillEnv.Get(), pFormField, true, true, true); + } + return true; + } + return false; +} + +bool Field::buttonGetCaption(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + int nface = 0; + int iSize = params.size(); + if (iSize >= 1) + nface = params[0].ToInt(pRuntime); + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) + return false; + + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + if (nface == 0) + vRet = CJS_Value(pRuntime, pFormControl->GetNormalCaption().c_str()); + else if (nface == 1) + vRet = CJS_Value(pRuntime, pFormControl->GetDownCaption().c_str()); + else if (nface == 2) + vRet = CJS_Value(pRuntime, pFormControl->GetRolloverCaption().c_str()); + else + return false; + + return true; +} + +bool Field::buttonGetIcon(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() >= 1) { + int nFace = params[0].ToInt(pRuntime); + if (nFace < 0 || nFace > 2) + return false; + } + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON) + return false; + + CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField); + if (!pFormControl) + return false; + + v8::Local pObj = + pRuntime->NewFxDynamicObj(CJS_Icon::g_nObjDefnID); + if (pObj.IsEmpty()) + return false; + + CJS_Icon* pJS_Icon = static_cast(pRuntime->GetObjectPrivate(pObj)); + vRet = CJS_Value(pRuntime, pJS_Icon); + return true; +} + +bool Field::buttonImportIcon(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool Field::buttonSetCaption(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool Field::buttonSetIcon(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool Field::checkThisBox(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + int iSize = params.size(); + if (iSize < 1) + return false; + + if (!m_bCanSet) + return false; + + int nWidget = params[0].ToInt(pRuntime); + bool bCheckit = true; + if (iSize >= 2) + bCheckit = params[1].ToBool(pRuntime); + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX && + pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON) + return false; + if (nWidget < 0 || nWidget >= pFormField->CountControls()) + return false; + // TODO(weili): Check whether anything special needed for radio button, + // otherwise merge these branches. + if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON) + pFormField->CheckControl(nWidget, bCheckit, true); + else + pFormField->CheckControl(nWidget, bCheckit, true); + + UpdateFormField(m_pFormFillEnv.Get(), pFormField, true, true, true); + return true; +} + +bool Field::clearItems(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool Field::defaultIsChecked(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (!m_bCanSet) + return false; + + int iSize = params.size(); + if (iSize < 1) + return false; + + int nWidget = params[0].ToInt(pRuntime); + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (nWidget < 0 || nWidget >= pFormField->CountControls()) + return false; + + vRet = CJS_Value(pRuntime, + pFormField->GetFieldType() == FIELDTYPE_CHECKBOX || + pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON); + + return true; +} + +bool Field::deleteItemAt(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool Field::getArray(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + std::vector> swSort; + for (CPDF_FormField* pFormField : FieldArray) { + swSort.push_back(std::unique_ptr( + new CFX_WideString(pFormField->GetFullName()))); + } + + std::sort( + swSort.begin(), swSort.end(), + [](const std::unique_ptr& p1, + const std::unique_ptr& p2) { return *p1 < *p2; }); + + CJS_Array FormFieldArray; + + int j = 0; + for (const auto& pStr : swSort) { + v8::Local pObj = + pRuntime->NewFxDynamicObj(CJS_Field::g_nObjDefnID); + if (pObj.IsEmpty()) + return false; + + CJS_Field* pJSField = + static_cast(pRuntime->GetObjectPrivate(pObj)); + Field* pField = static_cast(pJSField->GetEmbedObject()); + pField->AttachField(m_pJSDoc, *pStr); + FormFieldArray.SetElement(pRuntime, j++, CJS_Value(pRuntime, pJSField)); + } + + vRet = CJS_Value(pRuntime, FormFieldArray); + return true; +} + +bool Field::getItemAt(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + int iSize = params.size(); + int nIdx = -1; + if (iSize >= 1) + nIdx = params[0].ToInt(pRuntime); + + bool bExport = true; + if (iSize >= 2) + bExport = params[1].ToBool(pRuntime); + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if ((pFormField->GetFieldType() == FIELDTYPE_LISTBOX) || + (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX)) { + if (nIdx == -1 || nIdx > pFormField->CountOptions()) + nIdx = pFormField->CountOptions() - 1; + if (bExport) { + CFX_WideString strval = pFormField->GetOptionValue(nIdx); + if (strval.IsEmpty()) + vRet = CJS_Value(pRuntime, pFormField->GetOptionLabel(nIdx).c_str()); + else + vRet = CJS_Value(pRuntime, strval.c_str()); + } else { + vRet = CJS_Value(pRuntime, pFormField->GetOptionLabel(nIdx).c_str()); + } + } else { + return false; + } + + return true; +} + +bool Field::getLock(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool Field::insertItemAt(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool Field::isBoxChecked(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + int nIndex = -1; + if (params.size() >= 1) + nIndex = params[0].ToInt(pRuntime); + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (nIndex < 0 || nIndex >= pFormField->CountControls()) { + return false; + } + + vRet = CJS_Value(pRuntime, + ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX || + pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON) && + pFormField->GetControl(nIndex)->IsChecked() != 0)); + return true; +} + +bool Field::isDefaultChecked(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + int nIndex = -1; + if (params.size() >= 1) + nIndex = params[0].ToInt(pRuntime); + + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + if (nIndex < 0 || nIndex >= pFormField->CountControls()) + return false; + + vRet = CJS_Value(pRuntime, + ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX || + pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON) && + pFormField->GetControl(nIndex)->IsDefaultChecked() != 0)); + return true; +} + +bool Field::setAction(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool Field::setFocus(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + std::vector FieldArray = GetFormFields(m_FieldName); + if (FieldArray.empty()) + return false; + + CPDF_FormField* pFormField = FieldArray[0]; + int32_t nCount = pFormField->CountControls(); + if (nCount < 1) + return false; + + CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm(); + CPDFSDK_Widget* pWidget = nullptr; + if (nCount == 1) { + pWidget = pInterForm->GetWidget(pFormField->GetControl(0)); + } else { + UnderlyingPageType* pPage = + UnderlyingFromFPDFPage(m_pFormFillEnv->GetCurrentPage( + m_pFormFillEnv->GetUnderlyingDocument())); + if (!pPage) + return false; + if (CPDFSDK_PageView* pCurPageView = + m_pFormFillEnv->GetPageView(pPage, true)) { + for (int32_t i = 0; i < nCount; i++) { + if (CPDFSDK_Widget* pTempWidget = + pInterForm->GetWidget(pFormField->GetControl(i))) { + if (pTempWidget->GetPDFPage() == pCurPageView->GetPDFPage()) { + pWidget = pTempWidget; + break; + } + } + } + } + } + + if (pWidget) { + CPDFSDK_Annot::ObservedPtr pObserved(pWidget); + m_pFormFillEnv->SetFocusAnnot(&pObserved); + } + + return true; +} + +bool Field::setItems(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool Field::setLock(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool Field::signatureGetModifications(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool Field::signatureGetSeedValue(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool Field::signatureInfo(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool Field::signatureSetSeedValue(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool Field::signatureSign(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool Field::signatureValidate(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool Field::source(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsGetting()) { + vp << (CJS_Object*)nullptr; + } + + return true; +} + +void Field::AddDelay_Int(FIELD_PROP prop, int32_t n) { + CJS_DelayData* pNewData = + new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName); + pNewData->num = n; + m_pJSDoc->AddDelayData(pNewData); +} + +void Field::AddDelay_Bool(FIELD_PROP prop, bool b) { + CJS_DelayData* pNewData = + new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName); + pNewData->b = b; + m_pJSDoc->AddDelayData(pNewData); +} + +void Field::AddDelay_String(FIELD_PROP prop, const CFX_ByteString& string) { + CJS_DelayData* pNewData = + new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName); + pNewData->string = string; + m_pJSDoc->AddDelayData(pNewData); +} + +void Field::AddDelay_WideString(FIELD_PROP prop, const CFX_WideString& string) { + CJS_DelayData* pNewData = + new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName); + pNewData->widestring = string; + m_pJSDoc->AddDelayData(pNewData); +} + +void Field::AddDelay_Rect(FIELD_PROP prop, const CFX_FloatRect& rect) { + CJS_DelayData* pNewData = + new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName); + pNewData->rect = rect; + m_pJSDoc->AddDelayData(pNewData); +} + +void Field::AddDelay_Color(FIELD_PROP prop, const CPWL_Color& color) { + CJS_DelayData* pNewData = + new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName); + pNewData->color = color; + m_pJSDoc->AddDelayData(pNewData); +} + +void Field::AddDelay_WordArray(FIELD_PROP prop, + const std::vector& array) { + CJS_DelayData* pNewData = + new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName); + pNewData->wordarray = array; + m_pJSDoc->AddDelayData(pNewData); +} + +void Field::AddDelay_WideStringArray(FIELD_PROP prop, + const std::vector& array) { + CJS_DelayData* pNewData = + new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName); + pNewData->widestringarray = array; + m_pJSDoc->AddDelayData(pNewData); +} + +void Field::DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CJS_DelayData* pData) { + ASSERT(pFormFillEnv); + switch (pData->eProp) { + case FP_ALIGNMENT: + Field::SetAlignment(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->string); + break; + case FP_BORDERSTYLE: + Field::SetBorderStyle(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->string); + break; + case FP_BUTTONALIGNX: + Field::SetButtonAlignX(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->num); + break; + case FP_BUTTONALIGNY: + Field::SetButtonAlignY(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->num); + break; + case FP_BUTTONFITBOUNDS: + Field::SetButtonFitBounds(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->b); + break; + case FP_BUTTONPOSITION: + Field::SetButtonPosition(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->num); + break; + case FP_BUTTONSCALEHOW: + Field::SetButtonScaleHow(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->num); + break; + case FP_BUTTONSCALEWHEN: + Field::SetButtonScaleWhen(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->num); + break; + case FP_CALCORDERINDEX: + Field::SetCalcOrderIndex(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->num); + break; + case FP_CHARLIMIT: + Field::SetCharLimit(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->num); + break; + case FP_COMB: + Field::SetComb(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->b); + break; + case FP_COMMITONSELCHANGE: + Field::SetCommitOnSelChange(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->b); + break; + case FP_CURRENTVALUEINDICES: + Field::SetCurrentValueIndices(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->wordarray); + break; + case FP_DEFAULTVALUE: + Field::SetDefaultValue(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->widestring); + break; + case FP_DONOTSCROLL: + Field::SetDoNotScroll(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->b); + break; + case FP_DISPLAY: + Field::SetDisplay(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->num); + break; + case FP_FILLCOLOR: + Field::SetFillColor(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->color); + break; + case FP_HIDDEN: + Field::SetHidden(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->b); + break; + case FP_HIGHLIGHT: + Field::SetHighlight(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->string); + break; + case FP_LINEWIDTH: + Field::SetLineWidth(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->num); + break; + case FP_MULTILINE: + Field::SetMultiline(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->b); + break; + case FP_MULTIPLESELECTION: + Field::SetMultipleSelection(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->b); + break; + case FP_PASSWORD: + Field::SetPassword(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->b); + break; + case FP_RECT: + Field::SetRect(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->rect); + break; + case FP_RICHTEXT: + // Not supported. + break; + case FP_RICHVALUE: + break; + case FP_ROTATION: + Field::SetRotation(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->num); + break; + case FP_STROKECOLOR: + Field::SetStrokeColor(pFormFillEnv, pData->sFieldName, + pData->nControlIndex, pData->color); + break; + case FP_STYLE: + Field::SetStyle(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->string); + break; + case FP_TEXTCOLOR: + Field::SetTextColor(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->color); + break; + case FP_TEXTFONT: + Field::SetTextFont(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->string); + break; + case FP_TEXTSIZE: + Field::SetTextSize(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->num); + break; + case FP_USERNAME: + Field::SetUserName(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->widestring); + break; + case FP_VALUE: + Field::SetValue(pFormFillEnv, pData->sFieldName, pData->nControlIndex, + pData->widestringarray); + break; + } +} + +void Field::AddField(CPDFSDK_FormFillEnvironment* pFormFillEnv, + int nPageIndex, + int nFieldType, + const CFX_WideString& sName, + const CFX_FloatRect& rcCoords) { + // Not supported. +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/Field.h b/modules/pdfium/pdfium/fpdfsdk/javascript/Field.h new file mode 100644 index 000000000000..462c1271a16c --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/Field.h @@ -0,0 +1,598 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_FIELD_H_ +#define FPDFSDK_JAVASCRIPT_FIELD_H_ + +#include +#include + +#include "core/fxcrt/cfx_observable.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" // For CPWL_Color. + +class CPDFSDK_Widget; +class Document; + +enum FIELD_PROP { + FP_ALIGNMENT, + FP_BORDERSTYLE, + FP_BUTTONALIGNX, + FP_BUTTONALIGNY, + FP_BUTTONFITBOUNDS, + FP_BUTTONPOSITION, + FP_BUTTONSCALEHOW, + FP_BUTTONSCALEWHEN, + FP_CALCORDERINDEX, + FP_CHARLIMIT, + FP_COMB, + FP_COMMITONSELCHANGE, + FP_CURRENTVALUEINDICES, + FP_DEFAULTVALUE, + FP_DONOTSCROLL, + FP_DISPLAY, + FP_FILLCOLOR, + FP_HIDDEN, + FP_HIGHLIGHT, + FP_LINEWIDTH, + FP_MULTILINE, + FP_MULTIPLESELECTION, + FP_PASSWORD, + FP_RECT, + FP_RICHTEXT, + FP_RICHVALUE, + FP_ROTATION, + FP_STROKECOLOR, + FP_STYLE, + FP_TEXTCOLOR, + FP_TEXTFONT, + FP_TEXTSIZE, + FP_USERNAME, + FP_VALUE +}; + +struct CJS_DelayData { + CJS_DelayData(FIELD_PROP prop, int idx, const CFX_WideString& name); + ~CJS_DelayData(); + + FIELD_PROP eProp; + int nControlIndex; + CFX_WideString sFieldName; + int32_t num; + bool b; + CFX_ByteString string; + CFX_WideString widestring; + CFX_FloatRect rect; + CPWL_Color color; + std::vector wordarray; + std::vector widestringarray; +}; + +class Field : public CJS_EmbedObj { + public: + explicit Field(CJS_Object* pJSObject); + ~Field() override; + + bool alignment(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool borderStyle(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool buttonAlignX(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool buttonAlignY(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool buttonFitBounds(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool buttonPosition(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool buttonScaleHow(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool buttonScaleWhen(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool calcOrderIndex(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool charLimit(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool comb(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool commitOnSelChange(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool currentValueIndices(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool defaultStyle(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool defaultValue(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool doNotScroll(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool doNotSpellCheck(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool delay(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool display(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool doc(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool editable(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool exportValues(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool fileSelect(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool fillColor(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool hidden(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool highlight(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool lineWidth(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool multiline(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool multipleSelection(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool name(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool numItems(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool page(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool password(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool print(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool radiosInUnison(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool readonly(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool rect(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool required(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool richText(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool richValue(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool rotation(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool strokeColor(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool style(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool submitName(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool textColor(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool textFont(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool textSize(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool type(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool userName(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool value(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool valueAsString(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool source(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + + bool browseForFileToSubmit(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool buttonGetCaption(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool buttonGetIcon(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool buttonImportIcon(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool buttonSetCaption(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool buttonSetIcon(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool checkThisBox(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool clearItems(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool defaultIsChecked(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool deleteItemAt(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getArray(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getItemAt(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool getLock(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool insertItemAt(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool isBoxChecked(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool isDefaultChecked(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool setAction(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool setFocus(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool setItems(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool setLock(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool signatureGetModifications(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool signatureGetSeedValue(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool signatureInfo(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool signatureSetSeedValue(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool signatureSign(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool signatureValidate(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + + static void SetAlignment(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_ByteString& string); + static void SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_ByteString& string); + static void SetButtonAlignX(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number); + static void SetButtonAlignY(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number); + static void SetButtonFitBounds(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b); + static void SetButtonPosition(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number); + static void SetButtonScaleHow(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number); + static void SetButtonScaleWhen(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number); + static void SetCalcOrderIndex(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number); + static void SetCharLimit(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number); + static void SetComb(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b); + static void SetCommitOnSelChange(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b); + static void SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const std::vector& array); + static void SetDefaultStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex); + static void SetDefaultValue(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_WideString& string); + static void SetDoNotScroll(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b); + static void SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number); + static void SetFillColor(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CPWL_Color& color); + static void SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b); + static void SetHighlight(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_ByteString& string); + static void SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number); + static void SetMultiline(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b); + static void SetMultipleSelection(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b); + static void SetPassword(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + bool b); + static void SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_FloatRect& rect); + static void SetRotation(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number); + static void SetStrokeColor(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CPWL_Color& color); + static void SetStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_ByteString& string); + static void SetTextColor(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CPWL_Color& color); + static void SetTextFont(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_ByteString& string); + static void SetTextSize(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + int number); + static void SetUserName(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const CFX_WideString& string); + static void SetValue(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& swFieldName, + int nControlIndex, + const std::vector& strArray); + + static void AddField(CPDFSDK_FormFillEnvironment* pFormFillEnv, + int nPageIndex, + int nFieldType, + const CFX_WideString& sName, + const CFX_FloatRect& rcCoords); + + static void UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormField* pFormField, + bool bChangeMark, + bool bResetAP, + bool bRefresh); + static void UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormControl* pFormControl, + bool bChangeMark, + bool bResetAP, + bool bRefresh); + + static CPDFSDK_Widget* GetWidget(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CPDF_FormControl* pFormControl); + static std::vector GetFormFields( + CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& csFieldName); + + static void DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv, + CJS_DelayData* pData); + + bool AttachField(Document* pDocument, const CFX_WideString& csFieldName); + void SetDelay(bool bDelay); + + protected: + void ParseFieldName(const std::wstring& strFieldNameParsed, + std::wstring& strFieldName, + int& iControlNo); + std::vector GetFormFields( + const CFX_WideString& csFieldName) const; + CPDF_FormControl* GetSmartFieldControl(CPDF_FormField* pFormField); + bool ValueIsOccur(CPDF_FormField* pFormField, CFX_WideString csOptLabel); + + void AddDelay_Int(FIELD_PROP prop, int32_t n); + void AddDelay_Bool(FIELD_PROP prop, bool b); + void AddDelay_String(FIELD_PROP prop, const CFX_ByteString& string); + void AddDelay_WideString(FIELD_PROP prop, const CFX_WideString& string); + void AddDelay_Rect(FIELD_PROP prop, const CFX_FloatRect& rect); + void AddDelay_Color(FIELD_PROP prop, const CPWL_Color& color); + void AddDelay_WordArray(FIELD_PROP prop, const std::vector& array); + void AddDelay_WideStringArray(FIELD_PROP prop, + const std::vector& array); + + void DoDelay(); + + public: + Document* m_pJSDoc; + CPDFSDK_FormFillEnvironment::ObservedPtr m_pFormFillEnv; + CFX_WideString m_FieldName; + int m_nFormControlIndex; + bool m_bCanSet; + bool m_bDelay; +}; + +class CJS_Field : public CJS_Object { + public: + explicit CJS_Field(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Field() override {} + + void InitInstance(IJS_Runtime* pIRuntime) override; + + DECLARE_JS_CLASS(); + JS_STATIC_PROP(alignment, Field); + JS_STATIC_PROP(borderStyle, Field); + JS_STATIC_PROP(buttonAlignX, Field); + JS_STATIC_PROP(buttonAlignY, Field); + JS_STATIC_PROP(buttonFitBounds, Field); + JS_STATIC_PROP(buttonPosition, Field); + JS_STATIC_PROP(buttonScaleHow, Field); + JS_STATIC_PROP(buttonScaleWhen, Field); + JS_STATIC_PROP(calcOrderIndex, Field); + JS_STATIC_PROP(charLimit, Field); + JS_STATIC_PROP(comb, Field); + JS_STATIC_PROP(commitOnSelChange, Field); + JS_STATIC_PROP(currentValueIndices, Field); + JS_STATIC_PROP(defaultStyle, Field); + JS_STATIC_PROP(defaultValue, Field); + JS_STATIC_PROP(doNotScroll, Field); + JS_STATIC_PROP(doNotSpellCheck, Field); + JS_STATIC_PROP(delay, Field); + JS_STATIC_PROP(display, Field); + JS_STATIC_PROP(doc, Field); + JS_STATIC_PROP(editable, Field); + JS_STATIC_PROP(exportValues, Field); + JS_STATIC_PROP(fileSelect, Field); + JS_STATIC_PROP(fillColor, Field); + JS_STATIC_PROP(hidden, Field); + JS_STATIC_PROP(highlight, Field); + JS_STATIC_PROP(lineWidth, Field); + JS_STATIC_PROP(multiline, Field); + JS_STATIC_PROP(multipleSelection, Field); + JS_STATIC_PROP(name, Field); + JS_STATIC_PROP(numItems, Field); + JS_STATIC_PROP(page, Field); + JS_STATIC_PROP(password, Field); + JS_STATIC_PROP(print, Field); + JS_STATIC_PROP(radiosInUnison, Field); + JS_STATIC_PROP(readonly, Field); + JS_STATIC_PROP(rect, Field); + JS_STATIC_PROP(required, Field); + JS_STATIC_PROP(richText, Field); + JS_STATIC_PROP(richValue, Field); + JS_STATIC_PROP(rotation, Field); + JS_STATIC_PROP(strokeColor, Field); + JS_STATIC_PROP(style, Field); + JS_STATIC_PROP(submitName, Field); + JS_STATIC_PROP(textColor, Field); + JS_STATIC_PROP(textFont, Field); + JS_STATIC_PROP(textSize, Field); + JS_STATIC_PROP(type, Field); + JS_STATIC_PROP(userName, Field); + JS_STATIC_PROP(value, Field); + JS_STATIC_PROP(valueAsString, Field); + JS_STATIC_PROP(source, Field); + + JS_STATIC_METHOD(browseForFileToSubmit, Field); + JS_STATIC_METHOD(buttonGetCaption, Field); + JS_STATIC_METHOD(buttonGetIcon, Field); + JS_STATIC_METHOD(buttonImportIcon, Field); + JS_STATIC_METHOD(buttonSetCaption, Field); + JS_STATIC_METHOD(buttonSetIcon, Field); + JS_STATIC_METHOD(checkThisBox, Field); + JS_STATIC_METHOD(clearItems, Field); + JS_STATIC_METHOD(defaultIsChecked, Field); + JS_STATIC_METHOD(deleteItemAt, Field); + JS_STATIC_METHOD(getArray, Field); + JS_STATIC_METHOD(getItemAt, Field); + JS_STATIC_METHOD(getLock, Field); + JS_STATIC_METHOD(insertItemAt, Field); + JS_STATIC_METHOD(isBoxChecked, Field); + JS_STATIC_METHOD(isDefaultChecked, Field); + JS_STATIC_METHOD(setAction, Field); + JS_STATIC_METHOD(setFocus, Field); + JS_STATIC_METHOD(setItems, Field); + JS_STATIC_METHOD(setLock, Field); + JS_STATIC_METHOD(signatureGetModifications, Field); + JS_STATIC_METHOD(signatureGetSeedValue, Field); + JS_STATIC_METHOD(signatureInfo, Field); + JS_STATIC_METHOD(signatureSetSeedValue, Field); + JS_STATIC_METHOD(signatureSign, Field); + JS_STATIC_METHOD(signatureValidate, Field); +}; + +#endif // FPDFSDK_JAVASCRIPT_FIELD_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/Icon.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/Icon.cpp new file mode 100644 index 000000000000..fa2f92f3c913 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/Icon.cpp @@ -0,0 +1,36 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/Icon.h" + +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" + +JSConstSpec CJS_Icon::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}}; + +JSPropertySpec CJS_Icon::PropertySpecs[] = { + {"name", get_name_static, set_name_static}, + {0, 0, 0}}; + +JSMethodSpec CJS_Icon::MethodSpecs[] = {{0, 0}}; + +IMPLEMENT_JS_CLASS(CJS_Icon, Icon) + +Icon::Icon(CJS_Object* pJSObject) + : CJS_EmbedObj(pJSObject), m_swIconName(L"") {} + +Icon::~Icon() {} + +bool Icon::name(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + vp << m_swIconName; + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/Icon.h b/modules/pdfium/pdfium/fpdfsdk/javascript/Icon.h new file mode 100644 index 000000000000..5580678fd59c --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/Icon.h @@ -0,0 +1,36 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_ICON_H_ +#define FPDFSDK_JAVASCRIPT_ICON_H_ + +#include "fpdfsdk/javascript/JS_Define.h" + +class CPDF_Stream; + +class Icon : public CJS_EmbedObj { + public: + explicit Icon(CJS_Object* pJSObject); + ~Icon() override; + + bool name(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + CFX_WideString GetIconName() const { return m_swIconName; } + void SetIconName(CFX_WideString name) { m_swIconName = name; } + + private: + CFX_WideString m_swIconName; +}; + +class CJS_Icon : public CJS_Object { + public: + explicit CJS_Icon(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Icon() override {} + + DECLARE_JS_CLASS(); + JS_STATIC_PROP(name, Icon); +}; + +#endif // FPDFSDK_JAVASCRIPT_ICON_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Define.h b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Define.h new file mode 100644 index 000000000000..375ca3ac3572 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Define.h @@ -0,0 +1,456 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_JS_DEFINE_H_ +#define FPDFSDK_JAVASCRIPT_JS_DEFINE_H_ + +#include + +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" +#include "fpdfsdk/javascript/resource.h" +#include "fxjs/fxjs_v8.h" + +struct JSConstSpec { + enum Type { Number = 0, String = 1 }; + + const char* pName; + Type eType; + double number; + const char* pStr; +}; + +struct JSPropertySpec { + const char* pName; + v8::AccessorGetterCallback pPropGet; + v8::AccessorSetterCallback pPropPut; +}; + +struct JSMethodSpec { + const char* pName; + v8::FunctionCallback pMethodCall; +}; + +template +void JSPropGetter(const char* prop_name_string, + const char* class_name_string, + v8::Local property, + const v8::PropertyCallbackInfo& info) { + CJS_Runtime* pRuntime = + CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate()); + if (!pRuntime) + return; + CJS_Object* pJSObj = + static_cast(pRuntime->GetObjectPrivate(info.Holder())); + if (!pJSObj) + return; + C* pObj = reinterpret_cast(pJSObj->GetEmbedObject()); + CFX_WideString sError; + CJS_PropValue value(pRuntime); + value.StartGetting(); + if (!(pObj->*M)(pRuntime, value, sError)) { + pRuntime->Error( + JSFormatErrorString(class_name_string, prop_name_string, sError)); + return; + } + info.GetReturnValue().Set(value.GetJSValue()->ToV8Value(pRuntime)); +} + +template +void JSPropSetter(const char* prop_name_string, + const char* class_name_string, + v8::Local property, + v8::Local value, + const v8::PropertyCallbackInfo& info) { + CJS_Runtime* pRuntime = + CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate()); + if (!pRuntime) + return; + CJS_Object* pJSObj = + static_cast(pRuntime->GetObjectPrivate(info.Holder())); + if (!pJSObj) + return; + C* pObj = reinterpret_cast(pJSObj->GetEmbedObject()); + CFX_WideString sError; + CJS_PropValue propValue(pRuntime, CJS_Value(pRuntime, value)); + propValue.StartSetting(); + if (!(pObj->*M)(pRuntime, propValue, sError)) { + pRuntime->Error( + JSFormatErrorString(class_name_string, prop_name_string, sError)); + } +} + +#define JS_STATIC_PROP(prop_name, class_name) \ + static void get_##prop_name##_static( \ + v8::Local property, \ + const v8::PropertyCallbackInfo& info) { \ + JSPropGetter(#prop_name, #class_name, \ + property, info); \ + } \ + static void set_##prop_name##_static( \ + v8::Local property, v8::Local value, \ + const v8::PropertyCallbackInfo& info) { \ + JSPropSetter(#prop_name, #class_name, \ + property, value, info); \ + } + +template &, + CJS_Value&, + CFX_WideString&)> +void JSMethod(const char* method_name_string, + const char* class_name_string, + const v8::FunctionCallbackInfo& info) { + CJS_Runtime* pRuntime = + CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate()); + if (!pRuntime) + return; + std::vector parameters; + for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) { + parameters.push_back(CJS_Value(pRuntime, info[i])); + } + CJS_Object* pJSObj = + static_cast(pRuntime->GetObjectPrivate(info.Holder())); + if (!pJSObj) + return; + C* pObj = reinterpret_cast(pJSObj->GetEmbedObject()); + CFX_WideString sError; + CJS_Value valueRes(pRuntime); + if (!(pObj->*M)(pRuntime, parameters, valueRes, sError)) { + pRuntime->Error( + JSFormatErrorString(class_name_string, method_name_string, sError)); + return; + } + info.GetReturnValue().Set(valueRes.ToV8Value(pRuntime)); +} + +#define JS_STATIC_METHOD(method_name, class_name) \ + static void method_name##_static( \ + const v8::FunctionCallbackInfo& info) { \ + JSMethod(#method_name, #class_name, \ + info); \ + } + +#define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name) \ + static void method_name##_static( \ + const v8::FunctionCallbackInfo& info) { \ + JSMethod( \ + #method_name, #class_name, info); \ + } + +// All JS classes have a name, an object defintion ID, and the ability to +// register themselves with FXJS_V8. We never make a BASE class on its own +// because it can't really do anything. +#define DECLARE_JS_CLASS_BASE_PART() \ + static const char* g_pClassName; \ + static int g_nObjDefnID; \ + static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType); + +#define IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \ + const char* js_class_name::g_pClassName = #class_name; \ + int js_class_name::g_nObjDefnID = -1; + +// CONST classes provide constants, but not constructors, methods, or props. +#define DECLARE_JS_CLASS_CONST() \ + DECLARE_JS_CLASS_BASE_PART() \ + DECLARE_JS_CLASS_CONST_PART() + +#define IMPLEMENT_JS_CLASS_CONST(js_class_name, class_name) \ + IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \ + IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \ + void js_class_name::DefineJSObjects(CFXJS_Engine* pEngine, \ + FXJSOBJTYPE eObjType) { \ + g_nObjDefnID = pEngine->DefineObj(js_class_name::g_pClassName, eObjType, \ + nullptr, nullptr); \ + DefineConsts(pEngine); \ + } + +#define DECLARE_JS_CLASS_CONST_PART() \ + static JSConstSpec ConstSpecs[]; \ + static void DefineConsts(CFXJS_Engine* pEngine); + +#define IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \ + void js_class_name::DefineConsts(CFXJS_Engine* pEngine) { \ + for (size_t i = 0; i < FX_ArraySize(ConstSpecs) - 1; ++i) { \ + pEngine->DefineObjConst(g_nObjDefnID, ConstSpecs[i].pName, \ + ConstSpecs[i].eType == JSConstSpec::Number \ + ? pEngine->NewNumber(ConstSpecs[i].number) \ + : pEngine->NewString(ConstSpecs[i].pStr)); \ + } \ + } + +// Convenience macros for declaring classes without an alternate. +#define DECLARE_JS_CLASS() DECLARE_JS_CLASS_RICH() +#define IMPLEMENT_JS_CLASS(js_class_name, class_name) \ + IMPLEMENT_JS_CLASS_RICH(js_class_name, class_name, class_name) + +// Rich JS classes provide constants, methods, properties, and the ability +// to construct native object state. +#define DECLARE_JS_CLASS_RICH() \ + DECLARE_JS_CLASS_BASE_PART() \ + DECLARE_JS_CLASS_CONST_PART() \ + DECLARE_JS_CLASS_RICH_PART() + +#define IMPLEMENT_JS_CLASS_RICH(js_class_name, class_alternate, class_name) \ + IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \ + IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \ + IMPLEMENT_JS_CLASS_RICH_PART(js_class_name, class_alternate, class_name) \ + void js_class_name::DefineJSObjects(CFXJS_Engine* pEngine, \ + FXJSOBJTYPE eObjType) { \ + g_nObjDefnID = pEngine->DefineObj(js_class_name::g_pClassName, eObjType, \ + JSConstructor, JSDestructor); \ + DefineConsts(pEngine); \ + DefineProps(pEngine); \ + DefineMethods(pEngine); \ + } + +#define DECLARE_JS_CLASS_RICH_PART() \ + static void JSConstructor(CFXJS_Engine* pEngine, v8::Local obj); \ + static void JSDestructor(CFXJS_Engine* pEngine, v8::Local obj); \ + static void DefineProps(CFXJS_Engine* pEngine); \ + static void DefineMethods(CFXJS_Engine* pEngine); \ + static JSPropertySpec PropertySpecs[]; \ + static JSMethodSpec MethodSpecs[]; + +#define IMPLEMENT_JS_CLASS_RICH_PART(js_class_name, class_alternate, \ + class_name) \ + void js_class_name::JSConstructor(CFXJS_Engine* pEngine, \ + v8::Local obj) { \ + CJS_Object* pObj = new js_class_name(obj); \ + pObj->SetEmbedObject(new class_alternate(pObj)); \ + pEngine->SetObjectPrivate(obj, (void*)pObj); \ + pObj->InitInstance(static_cast(pEngine)); \ + } \ + void js_class_name::JSDestructor(CFXJS_Engine* pEngine, \ + v8::Local obj) { \ + delete static_cast(pEngine->GetObjectPrivate(obj)); \ + } \ + void js_class_name::DefineProps(CFXJS_Engine* pEngine) { \ + for (size_t i = 0; i < FX_ArraySize(PropertySpecs) - 1; ++i) { \ + pEngine->DefineObjProperty(g_nObjDefnID, PropertySpecs[i].pName, \ + PropertySpecs[i].pPropGet, \ + PropertySpecs[i].pPropPut); \ + } \ + } \ + void js_class_name::DefineMethods(CFXJS_Engine* pEngine) { \ + for (size_t i = 0; i < FX_ArraySize(MethodSpecs) - 1; ++i) { \ + pEngine->DefineObjMethod(g_nObjDefnID, MethodSpecs[i].pName, \ + MethodSpecs[i].pMethodCall); \ + } \ + } + +// Special JS classes implement methods, props, and queries, but not consts. +#define DECLARE_SPECIAL_JS_CLASS() \ + DECLARE_JS_CLASS_BASE_PART() \ + DECLARE_JS_CLASS_CONST_PART() \ + DECLARE_JS_CLASS_RICH_PART() \ + DECLARE_SPECIAL_JS_CLASS_PART() + +#define IMPLEMENT_SPECIAL_JS_CLASS(js_class_name, class_alternate, class_name) \ + IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \ + IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \ + IMPLEMENT_JS_CLASS_RICH_PART(js_class_name, class_alternate, class_name) \ + IMPLEMENT_SPECIAL_JS_CLASS_PART(js_class_name, class_alternate, class_name) \ + void js_class_name::DefineJSObjects(CFXJS_Engine* pEngine, \ + FXJSOBJTYPE eObjType) { \ + g_nObjDefnID = pEngine->DefineObj(js_class_name::g_pClassName, eObjType, \ + JSConstructor, JSDestructor); \ + DefineConsts(pEngine); \ + DefineProps(pEngine); \ + DefineMethods(pEngine); \ + DefineAllProperties(pEngine); \ + } + +#define DECLARE_SPECIAL_JS_CLASS_PART() \ + static void queryprop_static( \ + v8::Local property, \ + const v8::PropertyCallbackInfo& info); \ + static void getprop_static(v8::Local property, \ + const v8::PropertyCallbackInfo& info); \ + static void putprop_static(v8::Local property, \ + v8::Local value, \ + const v8::PropertyCallbackInfo& info); \ + static void delprop_static( \ + v8::Local property, \ + const v8::PropertyCallbackInfo& info); \ + static void DefineAllProperties(CFXJS_Engine* pEngine); + +#define IMPLEMENT_SPECIAL_JS_CLASS_PART(js_class_name, class_alternate, \ + class_name) \ + void js_class_name::queryprop_static( \ + v8::Local property, \ + const v8::PropertyCallbackInfo& info) { \ + JSSpecialPropQuery(#class_name, property, info); \ + } \ + void js_class_name::getprop_static( \ + v8::Local property, \ + const v8::PropertyCallbackInfo& info) { \ + JSSpecialPropGet(#class_name, property, info); \ + } \ + void js_class_name::putprop_static( \ + v8::Local property, v8::Local value, \ + const v8::PropertyCallbackInfo& info) { \ + JSSpecialPropPut(#class_name, property, value, info); \ + } \ + void js_class_name::delprop_static( \ + v8::Local property, \ + const v8::PropertyCallbackInfo& info) { \ + JSSpecialPropDel(#class_name, property, info); \ + } \ + void js_class_name::DefineAllProperties(CFXJS_Engine* pEngine) { \ + pEngine->DefineObjAllProperties( \ + g_nObjDefnID, js_class_name::queryprop_static, \ + js_class_name::getprop_static, js_class_name::putprop_static, \ + js_class_name::delprop_static); \ + } + +template +void JSSpecialPropQuery(const char*, + v8::Local property, + const v8::PropertyCallbackInfo& info) { + CJS_Runtime* pRuntime = + CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate()); + if (!pRuntime) + return; + + CJS_Object* pJSObj = + static_cast(pRuntime->GetObjectPrivate(info.Holder())); + if (!pJSObj) + return; + + Alt* pObj = reinterpret_cast(pJSObj->GetEmbedObject()); + v8::String::Utf8Value utf8_value(property); + CFX_WideString propname = CFX_WideString::FromUTF8( + CFX_ByteStringC(*utf8_value, utf8_value.length())); + bool bRet = pObj->QueryProperty(propname.c_str()); + info.GetReturnValue().Set(bRet ? 4 : 0); +} + +template +void JSSpecialPropGet(const char* class_name, + v8::Local property, + const v8::PropertyCallbackInfo& info) { + CJS_Runtime* pRuntime = + CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate()); + if (!pRuntime) + return; + + CJS_Object* pJSObj = + static_cast(pRuntime->GetObjectPrivate(info.Holder())); + if (!pJSObj) + return; + + Alt* pObj = reinterpret_cast(pJSObj->GetEmbedObject()); + v8::String::Utf8Value utf8_value(property); + CFX_WideString propname = CFX_WideString::FromUTF8( + CFX_ByteStringC(*utf8_value, utf8_value.length())); + CFX_WideString sError; + CJS_PropValue value(pRuntime); + value.StartGetting(); + if (!pObj->DoProperty(pRuntime, propname.c_str(), value, sError)) { + pRuntime->Error(JSFormatErrorString(class_name, "GetProperty", sError)); + return; + } + info.GetReturnValue().Set(value.GetJSValue()->ToV8Value(pRuntime)); +} + +template +void JSSpecialPropPut(const char* class_name, + v8::Local property, + v8::Local value, + const v8::PropertyCallbackInfo& info) { + CJS_Runtime* pRuntime = + CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate()); + if (!pRuntime) + return; + + CJS_Object* pJSObj = + static_cast(pRuntime->GetObjectPrivate(info.Holder())); + if (!pJSObj) + return; + + Alt* pObj = reinterpret_cast(pJSObj->GetEmbedObject()); + v8::String::Utf8Value utf8_value(property); + CFX_WideString propname = CFX_WideString::FromUTF8( + CFX_ByteStringC(*utf8_value, utf8_value.length())); + CFX_WideString sError; + CJS_PropValue PropValue(pRuntime, CJS_Value(pRuntime, value)); + PropValue.StartSetting(); + if (!pObj->DoProperty(pRuntime, propname.c_str(), PropValue, sError)) { + pRuntime->Error(JSFormatErrorString(class_name, "PutProperty", sError)); + } +} + +template +void JSSpecialPropDel(const char* class_name, + v8::Local property, + const v8::PropertyCallbackInfo& info) { + CJS_Runtime* pRuntime = + CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate()); + if (!pRuntime) + return; + + CJS_Object* pJSObj = + static_cast(pRuntime->GetObjectPrivate(info.Holder())); + if (!pJSObj) + return; + + Alt* pObj = reinterpret_cast(pJSObj->GetEmbedObject()); + v8::String::Utf8Value utf8_value(property); + CFX_WideString propname = CFX_WideString::FromUTF8( + CFX_ByteStringC(*utf8_value, utf8_value.length())); + CFX_WideString sError; + if (!pObj->DelProperty(pRuntime, propname.c_str(), sError)) { + CFX_ByteString cbName; + cbName.Format("%s.%s", class_name, "DelProperty"); + // Probably a missing call to JSFX_Error(). + } +} + +template &, + CJS_Value&, + CFX_WideString&)> +void JSGlobalFunc(const char* func_name_string, + const v8::FunctionCallbackInfo& info) { + CJS_Runtime* pRuntime = + CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate()); + if (!pRuntime) + return; + std::vector parameters; + for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) { + parameters.push_back(CJS_Value(pRuntime, info[i])); + } + CJS_Value valueRes(pRuntime); + CFX_WideString sError; + if (!(*F)(pRuntime, parameters, valueRes, sError)) { + pRuntime->Error(JSFormatErrorString(func_name_string, nullptr, sError)); + return; + } + info.GetReturnValue().Set(valueRes.ToV8Value(pRuntime)); +} + +#define JS_STATIC_GLOBAL_FUN(fun_name) \ + static void fun_name##_static( \ + const v8::FunctionCallbackInfo& info) { \ + JSGlobalFunc(#fun_name, info); \ + } + +#define JS_STATIC_DECLARE_GLOBAL_FUN() \ + static JSMethodSpec GlobalFunctionSpecs[]; \ + static void DefineJSObjects(CFXJS_Engine* pEngine) + +#define IMPLEMENT_JS_STATIC_GLOBAL_FUN(js_class_name) \ + void js_class_name::DefineJSObjects(CFXJS_Engine* pEngine) { \ + for (size_t i = 0; i < FX_ArraySize(GlobalFunctionSpecs) - 1; ++i) { \ + pEngine->DefineGlobalMethod( \ + js_class_name::GlobalFunctionSpecs[i].pName, \ + js_class_name::GlobalFunctionSpecs[i].pMethodCall); \ + } \ + } + +#endif // FPDFSDK_JAVASCRIPT_JS_DEFINE_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/JS_EventHandler.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_EventHandler.cpp new file mode 100644 index 000000000000..bd1c8e29d0d7 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_EventHandler.cpp @@ -0,0 +1,653 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/JS_EventHandler.h" + +#include "fpdfsdk/javascript/Document.h" +#include "fpdfsdk/javascript/Field.h" +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" +#include "fpdfsdk/javascript/cjs_event_context.h" +#include "fpdfsdk/javascript/cjs_runtime.h" + +CJS_EventHandler::CJS_EventHandler(CJS_EventContext* pContext) + : m_pJSEventContext(pContext), + m_eEventType(JET_UNKNOWN), + m_bValid(false), + m_pWideStrChange(nullptr), + m_nCommitKey(-1), + m_bKeyDown(false), + m_bModifier(false), + m_bShift(false), + m_pISelEnd(nullptr), + m_nSelEndDu(0), + m_pISelStart(nullptr), + m_nSelStartDu(0), + m_bWillCommit(false), + m_pValue(nullptr), + m_bFieldFull(false), + m_pbRc(nullptr), + m_bRcDu(false), + m_pTargetBookMark(nullptr), + m_pTargetFormFillEnv(nullptr), + m_pTargetAnnot(nullptr) {} + +CJS_EventHandler::~CJS_EventHandler() {} + +void CJS_EventHandler::OnApp_Init() { + Initial(JET_APP_INIT); +} + +void CJS_EventHandler::OnDoc_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& strTargetName) { + Initial(JET_DOC_OPEN); + m_pTargetFormFillEnv.Reset(pFormFillEnv); + m_strTargetName = strTargetName; +} + +void CJS_EventHandler::OnDoc_WillPrint( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + Initial(JET_DOC_WILLPRINT); + m_pTargetFormFillEnv.Reset(pFormFillEnv); +} + +void CJS_EventHandler::OnDoc_DidPrint( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + Initial(JET_DOC_DIDPRINT); + m_pTargetFormFillEnv.Reset(pFormFillEnv); +} + +void CJS_EventHandler::OnDoc_WillSave( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + Initial(JET_DOC_WILLSAVE); + m_pTargetFormFillEnv.Reset(pFormFillEnv); +} + +void CJS_EventHandler::OnDoc_DidSave( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + Initial(JET_DOC_DIDSAVE); + m_pTargetFormFillEnv.Reset(pFormFillEnv); +} + +void CJS_EventHandler::OnDoc_WillClose( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + Initial(JET_DOC_WILLCLOSE); + m_pTargetFormFillEnv.Reset(pFormFillEnv); +} + +void CJS_EventHandler::OnPage_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv) { + Initial(JET_PAGE_OPEN); + m_pTargetFormFillEnv.Reset(pFormFillEnv); +} + +void CJS_EventHandler::OnPage_Close(CPDFSDK_FormFillEnvironment* pFormFillEnv) { + Initial(JET_PAGE_CLOSE); + m_pTargetFormFillEnv.Reset(pFormFillEnv); +} + +void CJS_EventHandler::OnPage_InView( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + Initial(JET_PAGE_INVIEW); + m_pTargetFormFillEnv.Reset(pFormFillEnv); +} + +void CJS_EventHandler::OnPage_OutView( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + Initial(JET_PAGE_OUTVIEW); + m_pTargetFormFillEnv.Reset(pFormFillEnv); +} + +void CJS_EventHandler::OnField_MouseEnter(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) { + Initial(JET_FIELD_MOUSEENTER); + + m_bModifier = bModifier; + m_bShift = bShift; + + m_strTargetName = pTarget->GetFullName(); +} + +void CJS_EventHandler::OnField_MouseExit(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) { + Initial(JET_FIELD_MOUSEEXIT); + + m_bModifier = bModifier; + m_bShift = bShift; + m_strTargetName = pTarget->GetFullName(); +} + +void CJS_EventHandler::OnField_MouseDown(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) { + Initial(JET_FIELD_MOUSEDOWN); + m_eEventType = JET_FIELD_MOUSEDOWN; + + m_bModifier = bModifier; + m_bShift = bShift; + m_strTargetName = pTarget->GetFullName(); +} + +void CJS_EventHandler::OnField_MouseUp(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) { + Initial(JET_FIELD_MOUSEUP); + + m_bModifier = bModifier; + m_bShift = bShift; + m_strTargetName = pTarget->GetFullName(); +} + +void CJS_EventHandler::OnField_Focus(bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + const CFX_WideString& Value) { + Initial(JET_FIELD_FOCUS); + + m_bModifier = bModifier; + m_bShift = bShift; + m_strTargetName = pTarget->GetFullName(); + m_pValue = (CFX_WideString*)&Value; +} + +void CJS_EventHandler::OnField_Blur(bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + const CFX_WideString& Value) { + Initial(JET_FIELD_BLUR); + + m_bModifier = bModifier; + m_bShift = bShift; + m_strTargetName = pTarget->GetFullName(); + m_pValue = (CFX_WideString*)&Value; +} + +void CJS_EventHandler::OnField_Keystroke(CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + bool KeyDown, + bool bModifier, + int& nSelEnd, + int& nSelStart, + bool bShift, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool bWillCommit, + bool bFieldFull, + bool& bRc) { + Initial(JET_FIELD_KEYSTROKE); + + m_nCommitKey = 0; + m_pWideStrChange = &strChange; + m_WideStrChangeEx = strChangeEx; + m_bKeyDown = KeyDown; + m_bModifier = bModifier; + m_pISelEnd = &nSelEnd; + m_pISelStart = &nSelStart; + m_bShift = bShift; + m_strTargetName = pTarget->GetFullName(); + m_pValue = &Value; + m_bWillCommit = bWillCommit; + m_pbRc = &bRc; + m_bFieldFull = bFieldFull; +} + +void CJS_EventHandler::OnField_Validate(CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + bool bKeyDown, + bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool& bRc) { + Initial(JET_FIELD_VALIDATE); + + m_pWideStrChange = &strChange; + m_WideStrChangeEx = strChangeEx; + m_bKeyDown = bKeyDown; + m_bModifier = bModifier; + m_bShift = bShift; + m_strTargetName = pTarget->GetFullName(); + m_pValue = &Value; + m_pbRc = &bRc; +} + +void CJS_EventHandler::OnField_Calculate(CPDF_FormField* pSource, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool& bRc) { + Initial(JET_FIELD_CALCULATE); + + if (pSource) + m_strSourceName = pSource->GetFullName(); + m_strTargetName = pTarget->GetFullName(); + m_pValue = &Value; + m_pbRc = &bRc; +} + +void CJS_EventHandler::OnField_Format(CPDF_FormField* pTarget, + CFX_WideString& Value, + bool bWillCommit) { + Initial(JET_FIELD_FORMAT); + + m_nCommitKey = 0; + m_strTargetName = pTarget->GetFullName(); + m_pValue = &Value; + m_bWillCommit = bWillCommit; +} + +void CJS_EventHandler::OnScreen_Focus(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + Initial(JET_SCREEN_FOCUS); + + m_bModifier = bModifier; + m_bShift = bShift; + m_pTargetAnnot.Reset(pScreen); +} + +void CJS_EventHandler::OnScreen_Blur(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + Initial(JET_SCREEN_BLUR); + + m_bModifier = bModifier; + m_bShift = bShift; + m_pTargetAnnot.Reset(pScreen); +} + +void CJS_EventHandler::OnScreen_Open(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + Initial(JET_SCREEN_OPEN); + + m_bModifier = bModifier; + m_bShift = bShift; + m_pTargetAnnot.Reset(pScreen); +} + +void CJS_EventHandler::OnScreen_Close(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + Initial(JET_SCREEN_CLOSE); + + m_bModifier = bModifier; + m_bShift = bShift; + m_pTargetAnnot.Reset(pScreen); +} + +void CJS_EventHandler::OnScreen_MouseDown(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + Initial(JET_SCREEN_MOUSEDOWN); + + m_bModifier = bModifier; + m_bShift = bShift; + m_pTargetAnnot.Reset(pScreen); +} + +void CJS_EventHandler::OnScreen_MouseUp(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + Initial(JET_SCREEN_MOUSEUP); + + m_bModifier = bModifier; + m_bShift = bShift; + m_pTargetAnnot.Reset(pScreen); +} + +void CJS_EventHandler::OnScreen_MouseEnter(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + Initial(JET_SCREEN_MOUSEENTER); + + m_bModifier = bModifier; + m_bShift = bShift; + m_pTargetAnnot.Reset(pScreen); +} + +void CJS_EventHandler::OnScreen_MouseExit(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + Initial(JET_SCREEN_MOUSEEXIT); + + m_bModifier = bModifier; + m_bShift = bShift; + m_pTargetAnnot.Reset(pScreen); +} + +void CJS_EventHandler::OnScreen_InView(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + Initial(JET_SCREEN_INVIEW); + m_bModifier = bModifier; + m_bShift = bShift; + m_pTargetAnnot.Reset(pScreen); +} + +void CJS_EventHandler::OnScreen_OutView(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + Initial(JET_SCREEN_OUTVIEW); + m_bModifier = bModifier; + m_bShift = bShift; + m_pTargetAnnot.Reset(pScreen); +} + +void CJS_EventHandler::OnLink_MouseUp( + CPDFSDK_FormFillEnvironment* pTargetFormFillEnv) { + Initial(JET_LINK_MOUSEUP); + m_pTargetFormFillEnv.Reset(pTargetFormFillEnv); +} + +void CJS_EventHandler::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) { + Initial(JET_BOOKMARK_MOUSEUP); + m_pTargetBookMark = pBookMark; +} + +void CJS_EventHandler::OnMenu_Exec( + CPDFSDK_FormFillEnvironment* pTargetFormFillEnv, + const CFX_WideString& strTargetName) { + Initial(JET_MENU_EXEC); + m_pTargetFormFillEnv.Reset(pTargetFormFillEnv); + m_strTargetName = strTargetName; +} + +void CJS_EventHandler::OnExternal_Exec() { + Initial(JET_EXTERNAL_EXEC); +} + +void CJS_EventHandler::OnBatchExec( + CPDFSDK_FormFillEnvironment* pTargetFormFillEnv) { + Initial(JET_BATCH_EXEC); + m_pTargetFormFillEnv.Reset(pTargetFormFillEnv); +} + +void CJS_EventHandler::OnConsole_Exec() { + Initial(JET_CONSOLE_EXEC); +} + +void CJS_EventHandler::Initial(JS_EVENT_T type) { + m_eEventType = type; + + m_strTargetName = L""; + m_strSourceName = L""; + m_pWideStrChange = nullptr; + m_WideStrChangeDu = L""; + m_WideStrChangeEx = L""; + m_nCommitKey = -1; + m_bKeyDown = false; + m_bModifier = false; + m_bShift = false; + m_pISelEnd = nullptr; + m_nSelEndDu = 0; + m_pISelStart = nullptr; + m_nSelStartDu = 0; + m_bWillCommit = false; + m_pValue = nullptr; + m_bFieldFull = false; + m_pbRc = nullptr; + m_bRcDu = false; + + m_pTargetBookMark = nullptr; + m_pTargetFormFillEnv.Reset(); + m_pTargetAnnot.Reset(); + + m_bValid = true; +} + +void CJS_EventHandler::Destroy() { + m_bValid = false; +} + +bool CJS_EventHandler::IsValid() { + return m_bValid; +} + +CFX_WideString& CJS_EventHandler::Change() { + if (m_pWideStrChange) { + return *m_pWideStrChange; + } + return m_WideStrChangeDu; +} + +CFX_WideString CJS_EventHandler::ChangeEx() { + return m_WideStrChangeEx; +} + +int CJS_EventHandler::CommitKey() { + return m_nCommitKey; +} + +bool CJS_EventHandler::FieldFull() { + return m_bFieldFull; +} + +bool CJS_EventHandler::KeyDown() { + return m_bKeyDown; +} + +bool CJS_EventHandler::Modifier() { + return m_bModifier; +} + +const FX_WCHAR* CJS_EventHandler::Name() { + switch (m_eEventType) { + case JET_APP_INIT: + return L"Init"; + case JET_BATCH_EXEC: + return L"Exec"; + case JET_BOOKMARK_MOUSEUP: + return L"Mouse Up"; + case JET_CONSOLE_EXEC: + return L"Exec"; + case JET_DOC_DIDPRINT: + return L"DidPrint"; + case JET_DOC_DIDSAVE: + return L"DidSave"; + case JET_DOC_OPEN: + return L"Open"; + case JET_DOC_WILLCLOSE: + return L"WillClose"; + case JET_DOC_WILLPRINT: + return L"WillPrint"; + case JET_DOC_WILLSAVE: + return L"WillSave"; + case JET_EXTERNAL_EXEC: + return L"Exec"; + case JET_FIELD_FOCUS: + case JET_SCREEN_FOCUS: + return L"Focus"; + case JET_FIELD_BLUR: + case JET_SCREEN_BLUR: + return L"Blur"; + case JET_FIELD_MOUSEDOWN: + case JET_SCREEN_MOUSEDOWN: + return L"Mouse Down"; + case JET_FIELD_MOUSEUP: + case JET_SCREEN_MOUSEUP: + return L"Mouse Up"; + case JET_FIELD_MOUSEENTER: + case JET_SCREEN_MOUSEENTER: + return L"Mouse Enter"; + case JET_FIELD_MOUSEEXIT: + case JET_SCREEN_MOUSEEXIT: + return L"Mouse Exit"; + case JET_FIELD_CALCULATE: + return L"Calculate"; + case JET_FIELD_FORMAT: + return L"Format"; + case JET_FIELD_KEYSTROKE: + return L"Keystroke"; + case JET_FIELD_VALIDATE: + return L"Validate"; + case JET_LINK_MOUSEUP: + return L"Mouse Up"; + case JET_MENU_EXEC: + return L"Exec"; + case JET_PAGE_OPEN: + case JET_SCREEN_OPEN: + return L"Open"; + case JET_PAGE_CLOSE: + case JET_SCREEN_CLOSE: + return L"Close"; + case JET_SCREEN_INVIEW: + case JET_PAGE_INVIEW: + return L"InView"; + case JET_PAGE_OUTVIEW: + case JET_SCREEN_OUTVIEW: + return L"OutView"; + default: + return L""; + } +} + +const FX_WCHAR* CJS_EventHandler::Type() { + switch (m_eEventType) { + case JET_APP_INIT: + return L"App"; + case JET_BATCH_EXEC: + return L"Batch"; + case JET_BOOKMARK_MOUSEUP: + return L"BookMark"; + case JET_CONSOLE_EXEC: + return L"Console"; + case JET_DOC_DIDPRINT: + case JET_DOC_DIDSAVE: + case JET_DOC_OPEN: + case JET_DOC_WILLCLOSE: + case JET_DOC_WILLPRINT: + case JET_DOC_WILLSAVE: + return L"Doc"; + case JET_EXTERNAL_EXEC: + return L"External"; + case JET_FIELD_BLUR: + case JET_FIELD_FOCUS: + case JET_FIELD_MOUSEDOWN: + case JET_FIELD_MOUSEENTER: + case JET_FIELD_MOUSEEXIT: + case JET_FIELD_MOUSEUP: + case JET_FIELD_CALCULATE: + case JET_FIELD_FORMAT: + case JET_FIELD_KEYSTROKE: + case JET_FIELD_VALIDATE: + return L"Field"; + case JET_SCREEN_FOCUS: + case JET_SCREEN_BLUR: + case JET_SCREEN_OPEN: + case JET_SCREEN_CLOSE: + case JET_SCREEN_MOUSEDOWN: + case JET_SCREEN_MOUSEUP: + case JET_SCREEN_MOUSEENTER: + case JET_SCREEN_MOUSEEXIT: + case JET_SCREEN_INVIEW: + case JET_SCREEN_OUTVIEW: + return L"Screen"; + case JET_LINK_MOUSEUP: + return L"Link"; + case JET_MENU_EXEC: + return L"Menu"; + case JET_PAGE_OPEN: + case JET_PAGE_CLOSE: + case JET_PAGE_INVIEW: + case JET_PAGE_OUTVIEW: + return L"Page"; + default: + return L""; + } +} + +bool& CJS_EventHandler::Rc() { + if (m_pbRc) { + return *m_pbRc; + } + return m_bRcDu; +} + +int& CJS_EventHandler::SelEnd() { + if (m_pISelEnd) { + return *m_pISelEnd; + } + return m_nSelEndDu; +} + +int& CJS_EventHandler::SelStart() { + if (m_pISelStart) { + return *m_pISelStart; + } + return m_nSelStartDu; +} + +bool CJS_EventHandler::Shift() { + return m_bShift; +} + +Field* CJS_EventHandler::Source() { + CJS_Runtime* pRuntime = m_pJSEventContext->GetJSRuntime(); + v8::Local pDocObj = + pRuntime->NewFxDynamicObj(CJS_Document::g_nObjDefnID); + if (pDocObj.IsEmpty()) + return nullptr; + + v8::Local pFieldObj = + pRuntime->NewFxDynamicObj(CJS_Field::g_nObjDefnID); + if (pFieldObj.IsEmpty()) + return nullptr; + + CJS_Document* pJSDocument = + static_cast(pRuntime->GetObjectPrivate(pDocObj)); + CJS_Field* pJSField = + static_cast(pRuntime->GetObjectPrivate(pFieldObj)); + + Document* pDocument = static_cast(pJSDocument->GetEmbedObject()); + pDocument->SetFormFillEnv(m_pTargetFormFillEnv + ? m_pTargetFormFillEnv.Get() + : m_pJSEventContext->GetFormFillEnv()); + + Field* pField = static_cast(pJSField->GetEmbedObject()); + pField->AttachField(pDocument, m_strSourceName); + return pField; +} + +Field* CJS_EventHandler::Target_Field() { + CJS_Runtime* pRuntime = m_pJSEventContext->GetJSRuntime(); + v8::Local pDocObj = + pRuntime->NewFxDynamicObj(CJS_Document::g_nObjDefnID); + if (pDocObj.IsEmpty()) + return nullptr; + + v8::Local pFieldObj = + pRuntime->NewFxDynamicObj(CJS_Field::g_nObjDefnID); + if (pFieldObj.IsEmpty()) + return nullptr; + + CJS_Document* pJSDocument = + static_cast(pRuntime->GetObjectPrivate(pDocObj)); + CJS_Field* pJSField = + static_cast(pRuntime->GetObjectPrivate(pFieldObj)); + + Document* pDocument = static_cast(pJSDocument->GetEmbedObject()); + pDocument->SetFormFillEnv(m_pTargetFormFillEnv + ? m_pTargetFormFillEnv.Get() + : m_pJSEventContext->GetFormFillEnv()); + + Field* pField = static_cast(pJSField->GetEmbedObject()); + pField->AttachField(pDocument, m_strTargetName); + return pField; +} + +CFX_WideString& CJS_EventHandler::Value() { + return *m_pValue; +} + +bool CJS_EventHandler::WillCommit() { + return m_bWillCommit; +} + +CFX_WideString CJS_EventHandler::TargetName() { + return m_strTargetName; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/JS_EventHandler.h b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_EventHandler.h new file mode 100644 index 000000000000..b9836b04e479 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_EventHandler.h @@ -0,0 +1,196 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_JS_EVENTHANDLER_H_ +#define FPDFSDK_JAVASCRIPT_JS_EVENTHANDLER_H_ + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" + +class CJS_EventContext; +class CPDFSDK_Annot; +class CPDF_Bookmark; +class CPDF_FormField; +class Field; + +enum JS_EVENT_T { + JET_UNKNOWN, + JET_APP_INIT, + JET_DOC_OPEN, + JET_DOC_WILLPRINT, + JET_DOC_DIDPRINT, + JET_DOC_WILLSAVE, + JET_DOC_DIDSAVE, + JET_DOC_WILLCLOSE, + JET_PAGE_OPEN, + JET_PAGE_CLOSE, + JET_PAGE_INVIEW, + JET_PAGE_OUTVIEW, + JET_FIELD_MOUSEDOWN, + JET_FIELD_MOUSEUP, + JET_FIELD_MOUSEENTER, + JET_FIELD_MOUSEEXIT, + JET_FIELD_FOCUS, + JET_FIELD_BLUR, + JET_FIELD_KEYSTROKE, + JET_FIELD_VALIDATE, + JET_FIELD_CALCULATE, + JET_FIELD_FORMAT, + JET_SCREEN_FOCUS, + JET_SCREEN_BLUR, + JET_SCREEN_OPEN, + JET_SCREEN_CLOSE, + JET_SCREEN_MOUSEDOWN, + JET_SCREEN_MOUSEUP, + JET_SCREEN_MOUSEENTER, + JET_SCREEN_MOUSEEXIT, + JET_SCREEN_INVIEW, + JET_SCREEN_OUTVIEW, + JET_BATCH_EXEC, + JET_MENU_EXEC, + JET_CONSOLE_EXEC, + JET_EXTERNAL_EXEC, + JET_BOOKMARK_MOUSEUP, + JET_LINK_MOUSEUP +}; + +class CJS_EventHandler { + public: + explicit CJS_EventHandler(CJS_EventContext* pContext); + virtual ~CJS_EventHandler(); + + void OnApp_Init(); + + void OnDoc_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& strTargetName); + void OnDoc_WillPrint(CPDFSDK_FormFillEnvironment* pFormFillEnv); + void OnDoc_DidPrint(CPDFSDK_FormFillEnvironment* pFormFillEnv); + void OnDoc_WillSave(CPDFSDK_FormFillEnvironment* pFormFillEnv); + void OnDoc_DidSave(CPDFSDK_FormFillEnvironment* pFormFillEnv); + void OnDoc_WillClose(CPDFSDK_FormFillEnvironment* pFormFillEnv); + + void OnPage_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv); + void OnPage_Close(CPDFSDK_FormFillEnvironment* pFormFillEnv); + void OnPage_InView(CPDFSDK_FormFillEnvironment* pFormFillEnv); + void OnPage_OutView(CPDFSDK_FormFillEnvironment* pFormFillEnv); + + void OnField_Calculate(CPDF_FormField* pSource, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool& bRc); + void OnField_Format(CPDF_FormField* pTarget, + CFX_WideString& Value, + bool bWillCommit); + void OnField_Keystroke(CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + bool KeyDown, + bool bModifier, + int& nSelEnd, + int& nSelStart, + bool bShift, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool bWillCommit, + bool bFieldFull, + bool& bRc); + void OnField_Validate(CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + bool bKeyDown, + bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool& bRc); + + void OnField_MouseDown(bool bModifier, bool bShift, CPDF_FormField* pTarget); + void OnField_MouseEnter(bool bModifier, bool bShift, CPDF_FormField* pTarget); + void OnField_MouseExit(bool bModifier, bool bShift, CPDF_FormField* pTarget); + void OnField_MouseUp(bool bModifier, bool bShift, CPDF_FormField* pTarget); + void OnField_Blur(bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + const CFX_WideString& Value); + void OnField_Focus(bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + const CFX_WideString& Value); + + void OnScreen_Focus(bool bModifier, bool bShift, CPDFSDK_Annot* pScreen); + void OnScreen_Blur(bool bModifier, bool bShift, CPDFSDK_Annot* pScreen); + void OnScreen_Open(bool bModifier, bool bShift, CPDFSDK_Annot* pScreen); + void OnScreen_Close(bool bModifier, bool bShift, CPDFSDK_Annot* pScreen); + void OnScreen_MouseDown(bool bModifier, bool bShift, CPDFSDK_Annot* pScreen); + void OnScreen_MouseUp(bool bModifier, bool bShift, CPDFSDK_Annot* pScreen); + void OnScreen_MouseEnter(bool bModifier, bool bShift, CPDFSDK_Annot* pScreen); + void OnScreen_MouseExit(bool bModifier, bool bShift, CPDFSDK_Annot* pScreen); + void OnScreen_InView(bool bModifier, bool bShift, CPDFSDK_Annot* pScreen); + void OnScreen_OutView(bool bModifier, bool bShift, CPDFSDK_Annot* pScreen); + + void OnBookmark_MouseUp(CPDF_Bookmark* pBookMark); + void OnLink_MouseUp(CPDFSDK_FormFillEnvironment* pFormFillEnv); + + void OnMenu_Exec(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& strTargetName); + void OnBatchExec(CPDFSDK_FormFillEnvironment* pFormFillEnv); + void OnConsole_Exec(); + void OnExternal_Exec(); + + public: + void Initial(JS_EVENT_T type); + void Destroy(); + bool IsValid(); + + CFX_WideString& Change(); + CFX_WideString ChangeEx(); + int CommitKey(); + bool FieldFull(); + bool KeyDown(); + bool Modifier(); + const FX_WCHAR* Name(); + const FX_WCHAR* Type(); + bool& Rc(); + int& SelEnd(); + int& SelStart(); + bool Shift(); + Field* Source(); + Field* Target_Field(); + CFX_WideString& Value(); + bool WillCommit(); + CFX_WideString TargetName(); + + JS_EVENT_T EventType() { return m_eEventType; } + + public: + CJS_EventContext* const m_pJSEventContext; // Not Owned. + JS_EVENT_T m_eEventType; + bool m_bValid; + + CFX_WideString m_strTargetName; + CFX_WideString m_strSourceName; + CFX_WideString* m_pWideStrChange; + CFX_WideString m_WideStrChangeDu; + CFX_WideString m_WideStrChangeEx; + int m_nCommitKey; + bool m_bKeyDown; + bool m_bModifier; + bool m_bShift; + int* m_pISelEnd; + int m_nSelEndDu; + int* m_pISelStart; + int m_nSelStartDu; + bool m_bWillCommit; + CFX_WideString* m_pValue; + bool m_bFieldFull; + bool* m_pbRc; + bool m_bRcDu; + + CPDF_Bookmark* m_pTargetBookMark; + CPDFSDK_FormFillEnvironment::ObservedPtr m_pTargetFormFillEnv; + CPDFSDK_Annot::ObservedPtr m_pTargetAnnot; +}; + +#endif // FPDFSDK_JAVASCRIPT_JS_EVENTHANDLER_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/JS_GlobalData.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_GlobalData.cpp new file mode 100644 index 000000000000..68d929fb3a62 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_GlobalData.cpp @@ -0,0 +1,396 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/JS_GlobalData.h" + +#include + +#include "core/fdrm/crypto/fx_crypt.h" +#include "third_party/base/stl_util.h" + +#define JS_MAXGLOBALDATA (1024 * 4 - 8) + +#define READER_JS_GLOBALDATA_FILENAME L"Reader_JsGlobal.Data" +#define PHANTOM_JS_GLOBALDATA_FILENAME L"Phantom_JsGlobal.Data" +#define SDK_JS_GLOBALDATA_FILENAME L"SDK_JsGlobal.Data" + +namespace { + +const uint8_t JS_RC4KEY[] = { + 0x19, 0xa8, 0xe8, 0x01, 0xf6, 0xa8, 0xb6, 0x4d, 0x82, 0x04, 0x45, 0x6d, + 0xb4, 0xcf, 0xd7, 0x77, 0x67, 0xf9, 0x75, 0x9f, 0xf0, 0xe0, 0x1e, 0x51, + 0xee, 0x46, 0xfd, 0x0b, 0xc9, 0x93, 0x25, 0x55, 0x4a, 0xee, 0xe0, 0x16, + 0xd0, 0xdf, 0x8c, 0xfa, 0x2a, 0xa9, 0x49, 0xfd, 0x97, 0x1c, 0x0e, 0x22, + 0x13, 0x28, 0x7c, 0xaf, 0xc4, 0xfc, 0x9c, 0x12, 0x65, 0x8c, 0x4e, 0x5b, + 0x04, 0x75, 0x89, 0xc9, 0xb1, 0xed, 0x50, 0xca, 0x96, 0x6f, 0x1a, 0x7a, + 0xfe, 0x58, 0x5d, 0xec, 0x19, 0x4a, 0xf6, 0x35, 0x6a, 0x97, 0x14, 0x00, + 0x0e, 0xd0, 0x6b, 0xbb, 0xd5, 0x75, 0x55, 0x8b, 0x6e, 0x6b, 0x19, 0xa0, + 0xf8, 0x77, 0xd5, 0xa3}; + +// Returns true if non-empty, setting sPropName +bool TrimPropName(CFX_ByteString* sPropName) { + sPropName->TrimLeft(); + sPropName->TrimRight(); + return sPropName->GetLength() != 0; +} + +CJS_GlobalData* g_pInstance = nullptr; + +} // namespace + +// static +CJS_GlobalData* CJS_GlobalData::GetRetainedInstance( + CPDFSDK_FormFillEnvironment* pApp) { + if (!g_pInstance) { + g_pInstance = new CJS_GlobalData(); + } + ++g_pInstance->m_RefCount; + return g_pInstance; +} + +void CJS_GlobalData::Release() { + if (!--m_RefCount) { + delete g_pInstance; + g_pInstance = nullptr; + } +} + +CJS_GlobalData::CJS_GlobalData() + : m_RefCount(0), m_sFilePath(SDK_JS_GLOBALDATA_FILENAME) { + LoadGlobalPersistentVariables(); +} + +CJS_GlobalData::~CJS_GlobalData() { + SaveGlobalPersisitentVariables(); +} + +CJS_GlobalData::iterator CJS_GlobalData::FindGlobalVariable( + const CFX_ByteString& propname) { + for (auto it = m_arrayGlobalData.begin(); it != m_arrayGlobalData.end(); + ++it) { + if ((*it)->data.sKey == propname) + return it; + } + return m_arrayGlobalData.end(); +} + +CJS_GlobalData::const_iterator CJS_GlobalData::FindGlobalVariable( + const CFX_ByteString& propname) const { + for (auto it = m_arrayGlobalData.begin(); it != m_arrayGlobalData.end(); + ++it) { + if ((*it)->data.sKey == propname) + return it; + } + return m_arrayGlobalData.end(); +} + +CJS_GlobalData_Element* CJS_GlobalData::GetGlobalVariable( + const CFX_ByteString& propname) { + auto iter = FindGlobalVariable(propname); + return iter != m_arrayGlobalData.end() ? iter->get() : nullptr; +} + +void CJS_GlobalData::SetGlobalVariableNumber(const CFX_ByteString& propname, + double dData) { + CFX_ByteString sPropName(propname); + if (!TrimPropName(&sPropName)) + return; + + if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) { + pData->data.nType = JS_GlobalDataType::NUMBER; + pData->data.dData = dData; + return; + } + std::unique_ptr pNewData(new CJS_GlobalData_Element); + pNewData->data.sKey = sPropName; + pNewData->data.nType = JS_GlobalDataType::NUMBER; + pNewData->data.dData = dData; + m_arrayGlobalData.push_back(std::move(pNewData)); +} + +void CJS_GlobalData::SetGlobalVariableBoolean(const CFX_ByteString& propname, + bool bData) { + CFX_ByteString sPropName(propname); + if (!TrimPropName(&sPropName)) + return; + + if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) { + pData->data.nType = JS_GlobalDataType::BOOLEAN; + pData->data.bData = bData; + return; + } + std::unique_ptr pNewData(new CJS_GlobalData_Element); + pNewData->data.sKey = sPropName; + pNewData->data.nType = JS_GlobalDataType::BOOLEAN; + pNewData->data.bData = bData; + m_arrayGlobalData.push_back(std::move(pNewData)); +} + +void CJS_GlobalData::SetGlobalVariableString(const CFX_ByteString& propname, + const CFX_ByteString& sData) { + CFX_ByteString sPropName(propname); + if (!TrimPropName(&sPropName)) + return; + + if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) { + pData->data.nType = JS_GlobalDataType::STRING; + pData->data.sData = sData; + return; + } + std::unique_ptr pNewData(new CJS_GlobalData_Element); + pNewData->data.sKey = sPropName; + pNewData->data.nType = JS_GlobalDataType::STRING; + pNewData->data.sData = sData; + m_arrayGlobalData.push_back(std::move(pNewData)); +} + +void CJS_GlobalData::SetGlobalVariableObject( + const CFX_ByteString& propname, + const CJS_GlobalVariableArray& array) { + CFX_ByteString sPropName(propname); + if (!TrimPropName(&sPropName)) + return; + + if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) { + pData->data.nType = JS_GlobalDataType::OBJECT; + pData->data.objData.Copy(array); + return; + } + std::unique_ptr pNewData(new CJS_GlobalData_Element); + pNewData->data.sKey = sPropName; + pNewData->data.nType = JS_GlobalDataType::OBJECT; + pNewData->data.objData.Copy(array); + m_arrayGlobalData.push_back(std::move(pNewData)); +} + +void CJS_GlobalData::SetGlobalVariableNull(const CFX_ByteString& propname) { + CFX_ByteString sPropName(propname); + if (!TrimPropName(&sPropName)) + return; + + if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) { + pData->data.nType = JS_GlobalDataType::NULLOBJ; + return; + } + std::unique_ptr pNewData(new CJS_GlobalData_Element); + pNewData->data.sKey = sPropName; + pNewData->data.nType = JS_GlobalDataType::NULLOBJ; + m_arrayGlobalData.push_back(std::move(pNewData)); +} + +bool CJS_GlobalData::SetGlobalVariablePersistent(const CFX_ByteString& propname, + bool bPersistent) { + CFX_ByteString sPropName(propname); + if (!TrimPropName(&sPropName)) + return false; + + CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName); + if (!pData) + return false; + + pData->bPersistent = bPersistent; + return true; +} + +bool CJS_GlobalData::DeleteGlobalVariable(const CFX_ByteString& propname) { + CFX_ByteString sPropName(propname); + if (!TrimPropName(&sPropName)) + return false; + + auto iter = FindGlobalVariable(sPropName); + if (iter == m_arrayGlobalData.end()) + return false; + + m_arrayGlobalData.erase(iter); + return true; +} + +int32_t CJS_GlobalData::GetSize() const { + return pdfium::CollectionSize(m_arrayGlobalData); +} + +CJS_GlobalData_Element* CJS_GlobalData::GetAt(int index) const { + if (index < 0 || index >= GetSize()) + return nullptr; + return m_arrayGlobalData[index].get(); +} + +void CJS_GlobalData::LoadGlobalPersistentVariables() { + uint8_t* pBuffer = nullptr; + int32_t nLength = 0; + + LoadFileBuffer(m_sFilePath.c_str(), pBuffer, nLength); + CRYPT_ArcFourCryptBlock(pBuffer, nLength, JS_RC4KEY, sizeof(JS_RC4KEY)); + + if (pBuffer) { + uint8_t* p = pBuffer; + uint16_t wType = *((uint16_t*)p); + p += sizeof(uint16_t); + + if (wType == (uint16_t)(('X' << 8) | 'F')) { + uint16_t wVersion = *((uint16_t*)p); + p += sizeof(uint16_t); + + ASSERT(wVersion <= 2); + + uint32_t dwCount = *((uint32_t*)p); + p += sizeof(uint32_t); + + uint32_t dwSize = *((uint32_t*)p); + p += sizeof(uint32_t); + + if (dwSize == nLength - sizeof(uint16_t) * 2 - sizeof(uint32_t) * 2) { + for (int32_t i = 0, sz = dwCount; i < sz; i++) { + if (p > pBuffer + nLength) + break; + + uint32_t dwNameLen = *((uint32_t*)p); + p += sizeof(uint32_t); + + if (p + dwNameLen > pBuffer + nLength) + break; + + CFX_ByteString sEntry = CFX_ByteString(p, dwNameLen); + p += sizeof(char) * dwNameLen; + + JS_GlobalDataType wDataType = + static_cast(*((uint16_t*)p)); + p += sizeof(uint16_t); + + switch (wDataType) { + case JS_GlobalDataType::NUMBER: { + double dData = 0; + switch (wVersion) { + case 1: { + uint32_t dwData = *((uint32_t*)p); + p += sizeof(uint32_t); + dData = dwData; + } break; + case 2: { + dData = *((double*)p); + p += sizeof(double); + } break; + } + SetGlobalVariableNumber(sEntry, dData); + SetGlobalVariablePersistent(sEntry, true); + } break; + case JS_GlobalDataType::BOOLEAN: { + uint16_t wData = *((uint16_t*)p); + p += sizeof(uint16_t); + SetGlobalVariableBoolean(sEntry, (bool)(wData == 1)); + SetGlobalVariablePersistent(sEntry, true); + } break; + case JS_GlobalDataType::STRING: { + uint32_t dwLength = *((uint32_t*)p); + p += sizeof(uint32_t); + + if (p + dwLength > pBuffer + nLength) + break; + + SetGlobalVariableString(sEntry, CFX_ByteString(p, dwLength)); + SetGlobalVariablePersistent(sEntry, true); + p += sizeof(char) * dwLength; + } break; + case JS_GlobalDataType::NULLOBJ: { + SetGlobalVariableNull(sEntry); + SetGlobalVariablePersistent(sEntry, true); + } + case JS_GlobalDataType::OBJECT: + break; + } + } + } + } + FX_Free(pBuffer); + } +} + +void CJS_GlobalData::SaveGlobalPersisitentVariables() { + uint32_t nCount = 0; + CFX_BinaryBuf sData; + for (const auto& pElement : m_arrayGlobalData) { + if (pElement->bPersistent) { + CFX_BinaryBuf sElement; + MakeByteString(pElement->data.sKey, &pElement->data, sElement); + if (sData.GetSize() + sElement.GetSize() > JS_MAXGLOBALDATA) + break; + + sData.AppendBlock(sElement.GetBuffer(), sElement.GetSize()); + nCount++; + } + } + + CFX_BinaryBuf sFile; + uint16_t wType = (uint16_t)(('X' << 8) | 'F'); + sFile.AppendBlock(&wType, sizeof(uint16_t)); + uint16_t wVersion = 2; + sFile.AppendBlock(&wVersion, sizeof(uint16_t)); + sFile.AppendBlock(&nCount, sizeof(uint32_t)); + uint32_t dwSize = sData.GetSize(); + sFile.AppendBlock(&dwSize, sizeof(uint32_t)); + + sFile.AppendBlock(sData.GetBuffer(), sData.GetSize()); + + CRYPT_ArcFourCryptBlock(sFile.GetBuffer(), sFile.GetSize(), JS_RC4KEY, + sizeof(JS_RC4KEY)); + WriteFileBuffer(m_sFilePath.c_str(), (const FX_CHAR*)sFile.GetBuffer(), + sFile.GetSize()); +} + +void CJS_GlobalData::LoadFileBuffer(const FX_WCHAR* sFilePath, + uint8_t*& pBuffer, + int32_t& nLength) { + // UnSupport. +} + +void CJS_GlobalData::WriteFileBuffer(const FX_WCHAR* sFilePath, + const FX_CHAR* pBuffer, + int32_t nLength) { + // UnSupport. +} + +void CJS_GlobalData::MakeByteString(const CFX_ByteString& name, + CJS_KeyValue* pData, + CFX_BinaryBuf& sData) { + switch (pData->nType) { + case JS_GlobalDataType::NUMBER: { + uint32_t dwNameLen = (uint32_t)name.GetLength(); + sData.AppendBlock(&dwNameLen, sizeof(uint32_t)); + sData.AppendString(name); + sData.AppendBlock(&pData->nType, sizeof(uint16_t)); + + double dData = pData->dData; + sData.AppendBlock(&dData, sizeof(double)); + } break; + case JS_GlobalDataType::BOOLEAN: { + uint32_t dwNameLen = (uint32_t)name.GetLength(); + sData.AppendBlock(&dwNameLen, sizeof(uint32_t)); + sData.AppendString(name); + sData.AppendBlock(&pData->nType, sizeof(uint16_t)); + + uint16_t wData = (uint16_t)pData->bData; + sData.AppendBlock(&wData, sizeof(uint16_t)); + } break; + case JS_GlobalDataType::STRING: { + uint32_t dwNameLen = (uint32_t)name.GetLength(); + sData.AppendBlock(&dwNameLen, sizeof(uint32_t)); + sData.AppendString(name); + sData.AppendBlock(&pData->nType, sizeof(uint16_t)); + + uint32_t dwDataLen = (uint32_t)pData->sData.GetLength(); + sData.AppendBlock(&dwDataLen, sizeof(uint32_t)); + sData.AppendString(pData->sData); + } break; + case JS_GlobalDataType::NULLOBJ: { + uint32_t dwNameLen = (uint32_t)name.GetLength(); + sData.AppendBlock(&dwNameLen, sizeof(uint32_t)); + sData.AppendString(name); + sData.AppendBlock(&pData->nType, sizeof(uint32_t)); + } break; + default: + break; + } +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/JS_GlobalData.h b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_GlobalData.h new file mode 100644 index 000000000000..c8947cd58078 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_GlobalData.h @@ -0,0 +1,77 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_JS_GLOBALDATA_H_ +#define FPDFSDK_JAVASCRIPT_JS_GLOBALDATA_H_ + +#include +#include + +#include "core/fxcrt/fx_basic.h" +#include "fpdfsdk/javascript/JS_KeyValue.h" + +class CPDFSDK_FormFillEnvironment; + +class CJS_GlobalData_Element { + public: + CJS_GlobalData_Element() {} + ~CJS_GlobalData_Element() {} + + CJS_KeyValue data; + bool bPersistent; +}; + +class CJS_GlobalData { + public: + static CJS_GlobalData* GetRetainedInstance(CPDFSDK_FormFillEnvironment* pApp); + void Release(); + + void SetGlobalVariableNumber(const CFX_ByteString& propname, double dData); + void SetGlobalVariableBoolean(const CFX_ByteString& propname, bool bData); + void SetGlobalVariableString(const CFX_ByteString& propname, + const CFX_ByteString& sData); + void SetGlobalVariableObject(const CFX_ByteString& propname, + const CJS_GlobalVariableArray& array); + void SetGlobalVariableNull(const CFX_ByteString& propname); + bool SetGlobalVariablePersistent(const CFX_ByteString& propname, + bool bPersistent); + bool DeleteGlobalVariable(const CFX_ByteString& propname); + + int32_t GetSize() const; + CJS_GlobalData_Element* GetAt(int index) const; + + private: + using iterator = + std::vector>::iterator; + using const_iterator = + std::vector>::const_iterator; + + CJS_GlobalData(); + ~CJS_GlobalData(); + + void LoadGlobalPersistentVariables(); + void SaveGlobalPersisitentVariables(); + + CJS_GlobalData_Element* GetGlobalVariable(const CFX_ByteString& sPropname); + iterator FindGlobalVariable(const CFX_ByteString& sPropname); + const_iterator FindGlobalVariable(const CFX_ByteString& sPropname) const; + + void LoadFileBuffer(const FX_WCHAR* sFilePath, + uint8_t*& pBuffer, + int32_t& nLength); + void WriteFileBuffer(const FX_WCHAR* sFilePath, + const FX_CHAR* pBuffer, + int32_t nLength); + void MakeByteString(const CFX_ByteString& name, + CJS_KeyValue* pData, + CFX_BinaryBuf& sData); + + size_t m_RefCount; + std::vector> m_arrayGlobalData; + CFX_WideString m_sFilePath; +}; + +#endif // FPDFSDK_JAVASCRIPT_JS_GLOBALDATA_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/JS_KeyValue.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_KeyValue.cpp new file mode 100644 index 000000000000..7d1e575377a5 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_KeyValue.cpp @@ -0,0 +1,70 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/JS_KeyValue.h" + +CJS_GlobalVariableArray::CJS_GlobalVariableArray() {} + +CJS_GlobalVariableArray::~CJS_GlobalVariableArray() {} + +void CJS_GlobalVariableArray::Copy(const CJS_GlobalVariableArray& array) { + m_Array.clear(); + for (int i = 0, sz = array.Count(); i < sz; i++) { + CJS_KeyValue* pOldObjData = array.GetAt(i); + switch (pOldObjData->nType) { + case JS_GlobalDataType::NUMBER: { + CJS_KeyValue* pNewObjData = new CJS_KeyValue; + pNewObjData->sKey = pOldObjData->sKey; + pNewObjData->nType = pOldObjData->nType; + pNewObjData->dData = pOldObjData->dData; + Add(pNewObjData); + } break; + case JS_GlobalDataType::BOOLEAN: { + CJS_KeyValue* pNewObjData = new CJS_KeyValue; + pNewObjData->sKey = pOldObjData->sKey; + pNewObjData->nType = pOldObjData->nType; + pNewObjData->bData = pOldObjData->bData; + Add(pNewObjData); + } break; + case JS_GlobalDataType::STRING: { + CJS_KeyValue* pNewObjData = new CJS_KeyValue; + pNewObjData->sKey = pOldObjData->sKey; + pNewObjData->nType = pOldObjData->nType; + pNewObjData->sData = pOldObjData->sData; + Add(pNewObjData); + } break; + case JS_GlobalDataType::OBJECT: { + CJS_KeyValue* pNewObjData = new CJS_KeyValue; + pNewObjData->sKey = pOldObjData->sKey; + pNewObjData->nType = pOldObjData->nType; + pNewObjData->objData.Copy(pOldObjData->objData); + Add(pNewObjData); + } break; + case JS_GlobalDataType::NULLOBJ: { + CJS_KeyValue* pNewObjData = new CJS_KeyValue; + pNewObjData->sKey = pOldObjData->sKey; + pNewObjData->nType = pOldObjData->nType; + Add(pNewObjData); + } break; + } + } +} + +void CJS_GlobalVariableArray::Add(CJS_KeyValue* p) { + m_Array.push_back(std::unique_ptr(p)); +} + +int CJS_GlobalVariableArray::Count() const { + return m_Array.size(); +} + +CJS_KeyValue* CJS_GlobalVariableArray::GetAt(int index) const { + return m_Array.at(index).get(); +} + +CJS_KeyValue::CJS_KeyValue() {} + +CJS_KeyValue::~CJS_KeyValue() {} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/JS_KeyValue.h b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_KeyValue.h new file mode 100644 index 000000000000..a57158887093 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_KeyValue.h @@ -0,0 +1,46 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_JS_KEYVALUE_H_ +#define FPDFSDK_JAVASCRIPT_JS_KEYVALUE_H_ + +#include +#include + +#include "core/fxcrt/fx_basic.h" + +enum class JS_GlobalDataType { NUMBER = 0, BOOLEAN, STRING, OBJECT, NULLOBJ }; + +class CJS_KeyValue; + +class CJS_GlobalVariableArray { + public: + CJS_GlobalVariableArray(); + ~CJS_GlobalVariableArray(); + + void Add(CJS_KeyValue* p); + int Count() const; + CJS_KeyValue* GetAt(int index) const; + void Copy(const CJS_GlobalVariableArray& array); + + private: + std::vector> m_Array; +}; + +class CJS_KeyValue { + public: + CJS_KeyValue(); + ~CJS_KeyValue(); + + CFX_ByteString sKey; + JS_GlobalDataType nType; + double dData; + bool bData; + CFX_ByteString sData; + CJS_GlobalVariableArray objData; +}; + +#endif // FPDFSDK_JAVASCRIPT_JS_KEYVALUE_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Object.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Object.cpp new file mode 100644 index 000000000000..cd86889337e0 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Object.cpp @@ -0,0 +1,45 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/JS_Object.h" + +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/cjs_event_context.h" + +CJS_EmbedObj::CJS_EmbedObj(CJS_Object* pJSObject) : m_pJSObject(pJSObject) {} + +CJS_EmbedObj::~CJS_EmbedObj() { +} + +void FreeObject(const v8::WeakCallbackInfo& data) { + CJS_Object* pJSObj = data.GetParameter(); + delete pJSObj; + CFXJS_Engine::FreeObjectPrivate(data.GetInternalField(0)); +} + +void DisposeObject(const v8::WeakCallbackInfo& data) { + CJS_Object* pJSObj = data.GetParameter(); + pJSObj->Dispose(); + data.SetSecondPassCallback(FreeObject); +} + +CJS_Object::CJS_Object(v8::Local pObject) { + m_pIsolate = pObject->GetIsolate(); + m_pV8Object.Reset(m_pIsolate, pObject); +} + +CJS_Object::~CJS_Object() {} + +void CJS_Object::MakeWeak() { + m_pV8Object.SetWeak(this, DisposeObject, + v8::WeakCallbackType::kInternalFields); +} + +void CJS_Object::Dispose() { + m_pV8Object.Reset(); +} + +void CJS_Object::InitInstance(IJS_Runtime* pIRuntime) {} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Object.h b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Object.h new file mode 100644 index 000000000000..2e5c75c948b8 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Object.h @@ -0,0 +1,57 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_JS_OBJECT_H_ +#define FPDFSDK_JAVASCRIPT_JS_OBJECT_H_ + +#include +#include + +#include "fpdfsdk/fsdk_define.h" +#include "fpdfsdk/javascript/cjs_runtime.h" +#include "fxjs/fxjs_v8.h" + +class CJS_EventContext; +class CJS_Object; +class CPDFSDK_FormFillEnvironment; + +class CJS_EmbedObj { + public: + explicit CJS_EmbedObj(CJS_Object* pJSObject); + virtual ~CJS_EmbedObj(); + + CJS_Object* GetJSObject() const { return m_pJSObject; } + + protected: + CJS_Object* const m_pJSObject; +}; + +class CJS_Object { + public: + explicit CJS_Object(v8::Local pObject); + virtual ~CJS_Object(); + + void MakeWeak(); + void Dispose(); + + virtual void InitInstance(IJS_Runtime* pIRuntime); + + v8::Local ToV8Object() { return m_pV8Object.Get(m_pIsolate); } + + // Takes ownership of |pObj|. + void SetEmbedObject(CJS_EmbedObj* pObj) { m_pEmbedObj.reset(pObj); } + CJS_EmbedObj* GetEmbedObject() const { return m_pEmbedObj.get(); } + + v8::Isolate* GetIsolate() const { return m_pIsolate; } + + protected: + std::unique_ptr m_pEmbedObj; + v8::Global m_pV8Object; + v8::Isolate* m_pIsolate; +}; + + +#endif // FPDFSDK_JAVASCRIPT_JS_OBJECT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Runtime_Stub.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Runtime_Stub.cpp new file mode 100644 index 000000000000..dcd8ceb97ccc --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Runtime_Stub.cpp @@ -0,0 +1,168 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include + +#include "fpdfsdk/javascript/ijs_event_context.h" +#include "fpdfsdk/javascript/ijs_runtime.h" +#include "third_party/base/ptr_util.h" + +class CJS_EventContextStub final : public IJS_EventContext { + public: + CJS_EventContextStub() {} + ~CJS_EventContextStub() override {} + + // IJS_EventContext: + bool RunScript(const CFX_WideString& script, CFX_WideString* info) override { + return false; + } + + void OnApp_Init() override {} + void OnDoc_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& strTargetName) override {} + void OnDoc_WillPrint(CPDFSDK_FormFillEnvironment* pFormFillEnv) override {} + void OnDoc_DidPrint(CPDFSDK_FormFillEnvironment* pFormFillEnv) override {} + void OnDoc_WillSave(CPDFSDK_FormFillEnvironment* pFormFillEnv) override {} + void OnDoc_DidSave(CPDFSDK_FormFillEnvironment* pFormFillEnv) override {} + void OnDoc_WillClose(CPDFSDK_FormFillEnvironment* pFormFillEnv) override {} + void OnPage_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv) override {} + void OnPage_Close(CPDFSDK_FormFillEnvironment* pFormFillEnv) override {} + void OnPage_InView(CPDFSDK_FormFillEnvironment* pFormFillEnv) override {} + void OnPage_OutView(CPDFSDK_FormFillEnvironment* pFormFillEnv) override {} + void OnField_MouseDown(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) override {} + void OnField_MouseEnter(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) override {} + void OnField_MouseExit(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) override {} + void OnField_MouseUp(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) override {} + void OnField_Focus(bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + const CFX_WideString& Value) override {} + void OnField_Blur(bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + const CFX_WideString& Value) override {} + void OnField_Calculate(CPDF_FormField* pSource, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool& bRc) override {} + void OnField_Format(CPDF_FormField* pTarget, + CFX_WideString& Value, + bool bWillCommit) override {} + void OnField_Keystroke(CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + bool KeyDown, + bool bModifier, + int& nSelEnd, + int& nSelStart, + bool bShift, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool bWillCommit, + bool bFieldFull, + bool& bRc) override {} + void OnField_Validate(CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + bool bKeyDown, + bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool& bRc) override {} + void OnScreen_Focus(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override {} + void OnScreen_Blur(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override {} + void OnScreen_Open(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override {} + void OnScreen_Close(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override {} + void OnScreen_MouseDown(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override {} + void OnScreen_MouseUp(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override {} + void OnScreen_MouseEnter(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override {} + void OnScreen_MouseExit(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override {} + void OnScreen_InView(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override {} + void OnScreen_OutView(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override {} + void OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) override {} + void OnLink_MouseUp(CPDFSDK_FormFillEnvironment* pFormFillEnv) override {} + void OnMenu_Exec(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString&) override {} + void OnBatchExec(CPDFSDK_FormFillEnvironment* pFormFillEnv) override {} + void OnConsole_Exec() override {} + void OnExternal_Exec() override {} +}; + +class CJS_RuntimeStub final : public IJS_Runtime { + public: + explicit CJS_RuntimeStub(CPDFSDK_FormFillEnvironment* pFormFillEnv) + : m_pFormFillEnv(pFormFillEnv) {} + ~CJS_RuntimeStub() override {} + + IJS_EventContext* NewEventContext() override { + if (!m_pContext) + m_pContext = pdfium::MakeUnique(); + return m_pContext.get(); + } + + void ReleaseEventContext(IJS_EventContext* pContext) override {} + + CPDFSDK_FormFillEnvironment* GetFormFillEnv() const override { + return m_pFormFillEnv; + } + +#ifdef PDF_ENABLE_XFA + bool GetValueByName(const CFX_ByteStringC&, CFXJSE_Value*) override { + return false; + } + + bool SetValueByName(const CFX_ByteStringC&, CFXJSE_Value*) override { + return false; + } +#endif // PDF_ENABLE_XFA + + int ExecuteScript(const CFX_WideString& script, + CFX_WideString* info) override { + return 0; + } + + protected: + CPDFSDK_FormFillEnvironment* m_pFormFillEnv; + std::unique_ptr m_pContext; +}; + +// static +void IJS_Runtime::Initialize(unsigned int slot, void* isolate) {} + +// static +void IJS_Runtime::Destroy() {} + +// static +IJS_Runtime* IJS_Runtime::Create(CPDFSDK_FormFillEnvironment* pFormFillEnv) { + return new CJS_RuntimeStub(pFormFillEnv); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Value.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Value.cpp new file mode 100644 index 000000000000..b05884756476 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Value.cpp @@ -0,0 +1,770 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/JS_Value.h" + +#include + +#include +#include +#include +#include + +#include "fpdfsdk/javascript/Document.h" +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_Object.h" + +namespace { + +const uint32_t g_nan[2] = {0, 0x7FF80000}; + +double GetNan() { + return *(double*)g_nan; +} + +double +MakeDate(int year, int mon, int day, int hour, int min, int sec, int ms) { + return JS_MakeDate(JS_MakeDay(year, mon, day), + JS_MakeTime(hour, min, sec, ms)); +} + +} // namespace + +CJS_Value::CJS_Value(CJS_Runtime* pRuntime) {} + +CJS_Value::CJS_Value(CJS_Runtime* pRuntime, v8::Local pValue) + : m_pValue(pValue) {} + +CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const int& iValue) + : m_pValue(pRuntime->NewNumber(iValue)) {} + +CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const bool& bValue) + : m_pValue(pRuntime->NewBoolean(bValue)) {} + +CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const float& fValue) + : m_pValue(pRuntime->NewNumber(fValue)) {} + +CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const double& dValue) + : m_pValue(pRuntime->NewNumber(dValue)) {} + +CJS_Value::CJS_Value(CJS_Runtime* pRuntime, CJS_Object* pObj) { + if (pObj) + m_pValue = pObj->ToV8Object(); +} + +CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const FX_WCHAR* pWstr) + : m_pValue(pRuntime->NewString(pWstr)) {} + +CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const FX_CHAR* pStr) + : m_pValue(pRuntime->NewString(CFX_WideString::FromLocal(pStr).c_str())) {} + +CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const CJS_Array& array) + : m_pValue(array.ToV8Array(pRuntime)) {} + +CJS_Value::CJS_Value(CJS_Runtime* pRuntime, const CJS_Date& date) + : m_pValue(date.ToV8Date(pRuntime)) {} + +CJS_Value::~CJS_Value() {} + +CJS_Value::CJS_Value(const CJS_Value& other) = default; + +void CJS_Value::Attach(v8::Local pValue) { + m_pValue = pValue; +} + +void CJS_Value::Detach() { + m_pValue = v8::Local(); +} + +int CJS_Value::ToInt(CJS_Runtime* pRuntime) const { + return pRuntime->ToInt32(m_pValue); +} + +bool CJS_Value::ToBool(CJS_Runtime* pRuntime) const { + return pRuntime->ToBoolean(m_pValue); +} + +double CJS_Value::ToDouble(CJS_Runtime* pRuntime) const { + return pRuntime->ToDouble(m_pValue); +} + +float CJS_Value::ToFloat(CJS_Runtime* pRuntime) const { + return (float)ToDouble(pRuntime); +} + +CJS_Object* CJS_Value::ToCJSObject(CJS_Runtime* pRuntime) const { + v8::Local pObj = pRuntime->ToObject(m_pValue); + return static_cast(pRuntime->GetObjectPrivate(pObj)); +} + +v8::Local CJS_Value::ToV8Object(CJS_Runtime* pRuntime) const { + return pRuntime->ToObject(m_pValue); +} + +CFX_WideString CJS_Value::ToCFXWideString(CJS_Runtime* pRuntime) const { + return pRuntime->ToWideString(m_pValue); +} + +CFX_ByteString CJS_Value::ToCFXByteString(CJS_Runtime* pRuntime) const { + return CFX_ByteString::FromUnicode(ToCFXWideString(pRuntime)); +} + +v8::Local CJS_Value::ToV8Value(CJS_Runtime* pRuntime) const { + return m_pValue; +} + +v8::Local CJS_Value::ToV8Array(CJS_Runtime* pRuntime) const { + return pRuntime->ToArray(m_pValue); +} + +void CJS_Value::SetNull(CJS_Runtime* pRuntime) { + m_pValue = pRuntime->NewNull(); +} + +void CJS_Value::MaybeCoerceToNumber(CJS_Runtime* pRuntime) { + bool bAllowNaN = false; + if (GetType() == VT_string) { + CFX_ByteString bstr = ToCFXByteString(pRuntime); + if (bstr.GetLength() == 0) + return; + if (bstr == "NaN") + bAllowNaN = true; + } + v8::Isolate* pIsolate = pRuntime->GetIsolate(); + v8::TryCatch try_catch(pIsolate); + v8::MaybeLocal maybeNum = + m_pValue->ToNumber(pIsolate->GetCurrentContext()); + if (maybeNum.IsEmpty()) + return; + v8::Local num = maybeNum.ToLocalChecked(); + if (std::isnan(num->Value()) && !bAllowNaN) + return; + m_pValue = num; +} + +// static +CJS_Value::Type CJS_Value::GetValueType(v8::Local value) { + if (value.IsEmpty()) + return VT_unknown; + if (value->IsString()) + return VT_string; + if (value->IsNumber()) + return VT_number; + if (value->IsBoolean()) + return VT_boolean; + if (value->IsDate()) + return VT_date; + if (value->IsObject()) + return VT_object; + if (value->IsNull()) + return VT_null; + if (value->IsUndefined()) + return VT_undefined; + return VT_unknown; +} + +bool CJS_Value::IsArrayObject() const { + return !m_pValue.IsEmpty() && m_pValue->IsArray(); +} + +bool CJS_Value::IsDateObject() const { + return !m_pValue.IsEmpty() && m_pValue->IsDate(); +} + +bool CJS_Value::ConvertToArray(CJS_Runtime* pRuntime, CJS_Array& array) const { + if (!IsArrayObject()) + return false; + array.Attach(pRuntime->ToArray(m_pValue)); + return true; +} + +bool CJS_Value::ConvertToDate(CJS_Runtime* pRuntime, CJS_Date& date) const { + if (!IsDateObject()) + return false; + v8::Local mutable_value = m_pValue; + date.Attach(mutable_value.As()); + return true; +} + +CJS_PropValue::CJS_PropValue(CJS_Runtime* pRuntime) + : m_bIsSetting(0), m_Value(pRuntime), m_pJSRuntime(pRuntime) {} + +CJS_PropValue::CJS_PropValue(CJS_Runtime* pRuntime, const CJS_Value& value) + : m_bIsSetting(0), m_Value(value), m_pJSRuntime(pRuntime) {} + +CJS_PropValue::~CJS_PropValue() {} + +void CJS_PropValue::operator<<(int iValue) { + ASSERT(!m_bIsSetting); + m_Value = CJS_Value(m_pJSRuntime, iValue); +} + +void CJS_PropValue::operator>>(int& iValue) const { + ASSERT(m_bIsSetting); + iValue = m_Value.ToInt(m_pJSRuntime); +} + +void CJS_PropValue::operator<<(bool bValue) { + ASSERT(!m_bIsSetting); + m_Value = CJS_Value(m_pJSRuntime, bValue); +} + +void CJS_PropValue::operator>>(bool& bValue) const { + ASSERT(m_bIsSetting); + bValue = m_Value.ToBool(m_pJSRuntime); +} + +void CJS_PropValue::operator<<(double dValue) { + ASSERT(!m_bIsSetting); + m_Value = CJS_Value(m_pJSRuntime, dValue); +} + +void CJS_PropValue::operator>>(double& dValue) const { + ASSERT(m_bIsSetting); + dValue = m_Value.ToDouble(m_pJSRuntime); +} + +void CJS_PropValue::operator<<(CJS_Object* pObj) { + ASSERT(!m_bIsSetting); + m_Value = CJS_Value(m_pJSRuntime, pObj); +} + +void CJS_PropValue::operator>>(CJS_Object*& ppObj) const { + ASSERT(m_bIsSetting); + ppObj = m_Value.ToCJSObject(m_pJSRuntime); +} + +void CJS_PropValue::operator<<(CJS_Document* pJsDoc) { + ASSERT(!m_bIsSetting); + m_Value = CJS_Value(m_pJSRuntime, pJsDoc); +} + +void CJS_PropValue::operator>>(CJS_Document*& ppJsDoc) const { + ASSERT(m_bIsSetting); + ppJsDoc = static_cast(m_Value.ToCJSObject(m_pJSRuntime)); +} + +void CJS_PropValue::operator<<(v8::Local pObj) { + ASSERT(!m_bIsSetting); + m_Value = CJS_Value(m_pJSRuntime, pObj); +} + +void CJS_PropValue::operator>>(v8::Local& ppObj) const { + ASSERT(m_bIsSetting); + ppObj = m_Value.ToV8Object(m_pJSRuntime); +} + +void CJS_PropValue::operator<<(CFX_ByteString str) { + ASSERT(!m_bIsSetting); + m_Value = CJS_Value(m_pJSRuntime, str.c_str()); +} + +void CJS_PropValue::operator>>(CFX_ByteString& str) const { + ASSERT(m_bIsSetting); + str = m_Value.ToCFXByteString(m_pJSRuntime); +} + +void CJS_PropValue::operator<<(const FX_WCHAR* str) { + ASSERT(!m_bIsSetting); + m_Value = CJS_Value(m_pJSRuntime, str); +} + +void CJS_PropValue::operator>>(CFX_WideString& wide_string) const { + ASSERT(m_bIsSetting); + wide_string = m_Value.ToCFXWideString(m_pJSRuntime); +} + +void CJS_PropValue::operator<<(CFX_WideString wide_string) { + ASSERT(!m_bIsSetting); + m_Value = CJS_Value(m_pJSRuntime, wide_string.c_str()); +} + +void CJS_PropValue::operator>>(CJS_Array& array) const { + ASSERT(m_bIsSetting); + m_Value.ConvertToArray(m_pJSRuntime, array); +} + +void CJS_PropValue::operator<<(CJS_Array& array) { + ASSERT(!m_bIsSetting); + m_Value = CJS_Value(m_pJSRuntime, array.ToV8Array(m_pJSRuntime)); +} + +void CJS_PropValue::operator>>(CJS_Date& date) const { + ASSERT(m_bIsSetting); + m_Value.ConvertToDate(m_pJSRuntime, date); +} + +void CJS_PropValue::operator<<(CJS_Date& date) { + ASSERT(!m_bIsSetting); + m_Value = CJS_Value(m_pJSRuntime, date); +} + +CJS_Array::CJS_Array() {} + +CJS_Array::CJS_Array(const CJS_Array& other) = default; + +CJS_Array::~CJS_Array() {} + +void CJS_Array::Attach(v8::Local pArray) { + m_pArray = pArray; +} + +void CJS_Array::GetElement(CJS_Runtime* pRuntime, + unsigned index, + CJS_Value& value) const { + if (!m_pArray.IsEmpty()) + value.Attach(pRuntime->GetArrayElement(m_pArray, index)); +} + +void CJS_Array::SetElement(CJS_Runtime* pRuntime, + unsigned index, + const CJS_Value& value) { + if (m_pArray.IsEmpty()) + m_pArray = pRuntime->NewArray(); + + pRuntime->PutArrayElement(m_pArray, index, value.ToV8Value(pRuntime)); +} + +int CJS_Array::GetLength(CJS_Runtime* pRuntime) const { + if (m_pArray.IsEmpty()) + return 0; + return pRuntime->GetArrayLength(m_pArray); +} + +v8::Local CJS_Array::ToV8Array(CJS_Runtime* pRuntime) const { + if (m_pArray.IsEmpty()) + m_pArray = pRuntime->NewArray(); + + return m_pArray; +} + +CJS_Date::CJS_Date() {} + +CJS_Date::CJS_Date(CJS_Runtime* pRuntime, double dMsecTime) + : m_pDate(pRuntime->NewDate(dMsecTime)) {} + +CJS_Date::CJS_Date(CJS_Runtime* pRuntime, + int year, + int mon, + int day, + int hour, + int min, + int sec) + : m_pDate(pRuntime->NewDate(MakeDate(year, mon, day, hour, min, sec, 0))) {} + +CJS_Date::~CJS_Date() {} + +bool CJS_Date::IsValidDate(CJS_Runtime* pRuntime) const { + return !m_pDate.IsEmpty() && !JS_PortIsNan(pRuntime->ToDouble(m_pDate)); +} + +void CJS_Date::Attach(v8::Local pDate) { + m_pDate = pDate; +} + +int CJS_Date::GetYear(CJS_Runtime* pRuntime) const { + if (!IsValidDate(pRuntime)) + return 0; + + return JS_GetYearFromTime(JS_LocalTime(pRuntime->ToDouble(m_pDate))); +} + +void CJS_Date::SetYear(CJS_Runtime* pRuntime, int iYear) { + m_pDate = pRuntime->NewDate( + MakeDate(iYear, GetMonth(pRuntime), GetDay(pRuntime), GetHours(pRuntime), + GetMinutes(pRuntime), GetSeconds(pRuntime), 0)); +} + +int CJS_Date::GetMonth(CJS_Runtime* pRuntime) const { + if (!IsValidDate(pRuntime)) + return 0; + + return JS_GetMonthFromTime(JS_LocalTime(pRuntime->ToDouble(m_pDate))); +} + +void CJS_Date::SetMonth(CJS_Runtime* pRuntime, int iMonth) { + m_pDate = pRuntime->NewDate( + MakeDate(GetYear(pRuntime), iMonth, GetDay(pRuntime), GetHours(pRuntime), + GetMinutes(pRuntime), GetSeconds(pRuntime), 0)); +} + +int CJS_Date::GetDay(CJS_Runtime* pRuntime) const { + if (!IsValidDate(pRuntime)) + return 0; + + return JS_GetDayFromTime(JS_LocalTime(pRuntime->ToDouble(m_pDate))); +} + +void CJS_Date::SetDay(CJS_Runtime* pRuntime, int iDay) { + m_pDate = pRuntime->NewDate( + MakeDate(GetYear(pRuntime), GetMonth(pRuntime), iDay, GetHours(pRuntime), + GetMinutes(pRuntime), GetSeconds(pRuntime), 0)); +} + +int CJS_Date::GetHours(CJS_Runtime* pRuntime) const { + if (!IsValidDate(pRuntime)) + return 0; + + return JS_GetHourFromTime(JS_LocalTime(pRuntime->ToDouble(m_pDate))); +} + +void CJS_Date::SetHours(CJS_Runtime* pRuntime, int iHours) { + m_pDate = pRuntime->NewDate( + MakeDate(GetYear(pRuntime), GetMonth(pRuntime), GetDay(pRuntime), iHours, + GetMinutes(pRuntime), GetSeconds(pRuntime), 0)); +} + +int CJS_Date::GetMinutes(CJS_Runtime* pRuntime) const { + if (!IsValidDate(pRuntime)) + return 0; + + return JS_GetMinFromTime(JS_LocalTime(pRuntime->ToDouble(m_pDate))); +} + +void CJS_Date::SetMinutes(CJS_Runtime* pRuntime, int minutes) { + m_pDate = pRuntime->NewDate(MakeDate(GetYear(pRuntime), GetMonth(pRuntime), + GetDay(pRuntime), GetHours(pRuntime), + minutes, GetSeconds(pRuntime), 0)); +} + +int CJS_Date::GetSeconds(CJS_Runtime* pRuntime) const { + if (!IsValidDate(pRuntime)) + return 0; + + return JS_GetSecFromTime(JS_LocalTime(pRuntime->ToDouble(m_pDate))); +} + +void CJS_Date::SetSeconds(CJS_Runtime* pRuntime, int seconds) { + m_pDate = pRuntime->NewDate(MakeDate(GetYear(pRuntime), GetMonth(pRuntime), + GetDay(pRuntime), GetHours(pRuntime), + GetMinutes(pRuntime), seconds, 0)); +} + +double CJS_Date::ToDouble(CJS_Runtime* pRuntime) const { + return !m_pDate.IsEmpty() ? pRuntime->ToDouble(m_pDate) : 0.0; +} + +CFX_WideString CJS_Date::ToString(CJS_Runtime* pRuntime) const { + return !m_pDate.IsEmpty() ? pRuntime->ToWideString(m_pDate) + : CFX_WideString(); +} + +v8::Local CJS_Date::ToV8Date(CJS_Runtime* pRuntime) const { + return m_pDate; +} + +double _getLocalTZA() { + if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) + return 0; + time_t t = 0; + time(&t); + localtime(&t); +#if _MSC_VER >= 1900 + // In gcc and in Visual Studio prior to VS 2015 'timezone' is a global + // variable declared in time.h. That variable was deprecated and in VS 2015 + // is removed, with _get_timezone replacing it. + long timezone = 0; + _get_timezone(&timezone); +#endif + return (double)(-(timezone * 1000)); +} + +int _getDaylightSavingTA(double d) { + if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) + return 0; + time_t t = (time_t)(d / 1000); + struct tm* tmp = localtime(&t); + if (!tmp) + return 0; + if (tmp->tm_isdst > 0) + // One hour. + return (int)60 * 60 * 1000; + return 0; +} + +double _Mod(double x, double y) { + double r = fmod(x, y); + if (r < 0) + r += y; + return r; +} + +int _isfinite(double v) { +#if _MSC_VER + return ::_finite(v); +#else + return std::fabs(v) < std::numeric_limits::max(); +#endif +} + +double _toInteger(double n) { + return (n >= 0) ? FXSYS_floor(n) : -FXSYS_floor(-n); +} + +bool _isLeapYear(int year) { + return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 != 0)); +} + +int _DayFromYear(int y) { + return (int)(365 * (y - 1970.0) + FXSYS_floor((y - 1969.0) / 4) - + FXSYS_floor((y - 1901.0) / 100) + + FXSYS_floor((y - 1601.0) / 400)); +} + +double _TimeFromYear(int y) { + return 86400000.0 * _DayFromYear(y); +} + +static const uint16_t daysMonth[12] = {0, 31, 59, 90, 120, 151, + 181, 212, 243, 273, 304, 334}; +static const uint16_t leapDaysMonth[12] = {0, 31, 60, 91, 121, 152, + 182, 213, 244, 274, 305, 335}; + +double _TimeFromYearMonth(int y, int m) { + const uint16_t* pMonth = _isLeapYear(y) ? leapDaysMonth : daysMonth; + return _TimeFromYear(y) + ((double)pMonth[m]) * 86400000; +} + +int _Day(double t) { + return (int)FXSYS_floor(t / 86400000); +} + +int _YearFromTime(double t) { + // estimate the time. + int y = 1970 + static_cast(t / (365.2425 * 86400000)); + if (_TimeFromYear(y) <= t) { + while (_TimeFromYear(y + 1) <= t) + y++; + } else { + while (_TimeFromYear(y) > t) + y--; + } + return y; +} + +int _DayWithinYear(double t) { + int year = _YearFromTime(t); + int day = _Day(t); + return day - _DayFromYear(year); +} + +int _MonthFromTime(double t) { + int day = _DayWithinYear(t); + int year = _YearFromTime(t); + if (0 <= day && day < 31) + return 0; + if (31 <= day && day < 59 + _isLeapYear(year)) + return 1; + if ((59 + _isLeapYear(year)) <= day && day < (90 + _isLeapYear(year))) + return 2; + if ((90 + _isLeapYear(year)) <= day && day < (120 + _isLeapYear(year))) + return 3; + if ((120 + _isLeapYear(year)) <= day && day < (151 + _isLeapYear(year))) + return 4; + if ((151 + _isLeapYear(year)) <= day && day < (181 + _isLeapYear(year))) + return 5; + if ((181 + _isLeapYear(year)) <= day && day < (212 + _isLeapYear(year))) + return 6; + if ((212 + _isLeapYear(year)) <= day && day < (243 + _isLeapYear(year))) + return 7; + if ((243 + _isLeapYear(year)) <= day && day < (273 + _isLeapYear(year))) + return 8; + if ((273 + _isLeapYear(year)) <= day && day < (304 + _isLeapYear(year))) + return 9; + if ((304 + _isLeapYear(year)) <= day && day < (334 + _isLeapYear(year))) + return 10; + if ((334 + _isLeapYear(year)) <= day && day < (365 + _isLeapYear(year))) + return 11; + + return -1; +} + +int _DateFromTime(double t) { + int day = _DayWithinYear(t); + int year = _YearFromTime(t); + int leap = _isLeapYear(year); + int month = _MonthFromTime(t); + switch (month) { + case 0: + return day + 1; + case 1: + return day - 30; + case 2: + return day - 58 - leap; + case 3: + return day - 89 - leap; + case 4: + return day - 119 - leap; + case 5: + return day - 150 - leap; + case 6: + return day - 180 - leap; + case 7: + return day - 211 - leap; + case 8: + return day - 242 - leap; + case 9: + return day - 272 - leap; + case 10: + return day - 303 - leap; + case 11: + return day - 333 - leap; + default: + return 0; + } +} + +double JS_GetDateTime() { + if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS)) + return 0; + time_t t = time(nullptr); + struct tm* pTm = localtime(&t); + + int year = pTm->tm_year + 1900; + double t1 = _TimeFromYear(year); + + return t1 + pTm->tm_yday * 86400000.0 + pTm->tm_hour * 3600000.0 + + pTm->tm_min * 60000.0 + pTm->tm_sec * 1000.0; +} + +int JS_GetYearFromTime(double dt) { + return _YearFromTime(dt); +} + +int JS_GetMonthFromTime(double dt) { + return _MonthFromTime(dt); +} + +int JS_GetDayFromTime(double dt) { + return _DateFromTime(dt); +} + +int JS_GetHourFromTime(double dt) { + return (int)_Mod(floor(dt / (60 * 60 * 1000)), 24); +} + +int JS_GetMinFromTime(double dt) { + return (int)_Mod(floor(dt / (60 * 1000)), 60); +} + +int JS_GetSecFromTime(double dt) { + return (int)_Mod(floor(dt / 1000), 60); +} + +double JS_DateParse(const CFX_WideString& str) { + v8::Isolate* pIsolate = v8::Isolate::GetCurrent(); + v8::Isolate::Scope isolate_scope(pIsolate); + v8::HandleScope scope(pIsolate); + + v8::Local context = pIsolate->GetCurrentContext(); + + // Use the built-in object method. + v8::Local v = + context->Global() + ->Get(context, v8::String::NewFromUtf8(pIsolate, "Date", + v8::NewStringType::kNormal) + .ToLocalChecked()) + .ToLocalChecked(); + if (v->IsObject()) { + v8::Local o = v->ToObject(context).ToLocalChecked(); + v = o->Get(context, v8::String::NewFromUtf8(pIsolate, "parse", + v8::NewStringType::kNormal) + .ToLocalChecked()) + .ToLocalChecked(); + if (v->IsFunction()) { + v8::Local funC = v8::Local::Cast(v); + const int argc = 1; + v8::Local timeStr = + CJS_Runtime::CurrentRuntimeFromIsolate(pIsolate)->NewString( + str.AsStringC()); + v8::Local argv[argc] = {timeStr}; + v = funC->Call(context, context->Global(), argc, argv).ToLocalChecked(); + if (v->IsNumber()) { + double date = v->ToNumber(context).ToLocalChecked()->Value(); + if (!_isfinite(date)) + return date; + return JS_LocalTime(date); + } + } + } + return 0; +} + +double JS_MakeDay(int nYear, int nMonth, int nDate) { + if (!_isfinite(nYear) || !_isfinite(nMonth) || !_isfinite(nDate)) + return GetNan(); + double y = _toInteger(nYear); + double m = _toInteger(nMonth); + double dt = _toInteger(nDate); + double ym = y + FXSYS_floor((double)m / 12); + double mn = _Mod(m, 12); + + double t = _TimeFromYearMonth((int)ym, (int)mn); + + if (_YearFromTime(t) != ym || _MonthFromTime(t) != mn || + _DateFromTime(t) != 1) + return GetNan(); + return _Day(t) + dt - 1; +} + +double JS_MakeTime(int nHour, int nMin, int nSec, int nMs) { + if (!_isfinite(nHour) || !_isfinite(nMin) || !_isfinite(nSec) || + !_isfinite(nMs)) + return GetNan(); + + double h = _toInteger(nHour); + double m = _toInteger(nMin); + double s = _toInteger(nSec); + double milli = _toInteger(nMs); + + return h * 3600000 + m * 60000 + s * 1000 + milli; +} + +double JS_MakeDate(double day, double time) { + if (!_isfinite(day) || !_isfinite(time)) + return GetNan(); + + return day * 86400000 + time; +} + +bool JS_PortIsNan(double d) { + return d != d; +} + +double JS_LocalTime(double d) { + return d + _getLocalTZA() + _getDaylightSavingTA(d); +} + +std::vector JS_ExpandKeywordParams( + CJS_Runtime* pRuntime, + const std::vector& originals, + size_t nKeywords, + ...) { + ASSERT(nKeywords); + + std::vector result(nKeywords, CJS_Value(pRuntime)); + size_t size = std::min(originals.size(), nKeywords); + for (size_t i = 0; i < size; ++i) + result[i] = originals[i]; + + if (originals.size() != 1 || originals[0].GetType() != CJS_Value::VT_object || + originals[0].IsArrayObject()) { + return result; + } + v8::Local pObj = originals[0].ToV8Object(pRuntime); + result[0] = CJS_Value(pRuntime); // Make unknown. + + va_list ap; + va_start(ap, nKeywords); + for (size_t i = 0; i < nKeywords; ++i) { + const wchar_t* property = va_arg(ap, const wchar_t*); + v8::Local v8Value = pRuntime->GetObjectProperty(pObj, property); + if (!v8Value->IsUndefined()) + result[i] = CJS_Value(pRuntime, v8Value); + } + va_end(ap); + return result; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Value.h b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Value.h new file mode 100644 index 000000000000..313f0c3e7b78 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/JS_Value.h @@ -0,0 +1,215 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_JS_VALUE_H_ +#define FPDFSDK_JAVASCRIPT_JS_VALUE_H_ + +#include + +#include "core/fxcrt/fx_basic.h" +#include "fxjs/fxjs_v8.h" + +class CJS_Array; +class CJS_Date; +class CJS_Document; +class CJS_Object; +class CJS_Runtime; + +class CJS_Value { + public: + enum Type { + VT_unknown, + VT_string, + VT_number, + VT_boolean, + VT_date, + VT_object, + VT_null, + VT_undefined + }; + + explicit CJS_Value(CJS_Runtime* pRuntime); + CJS_Value(CJS_Runtime* pRuntime, v8::Local pValue); + CJS_Value(CJS_Runtime* pRuntime, const int& iValue); + CJS_Value(CJS_Runtime* pRuntime, const double& dValue); + CJS_Value(CJS_Runtime* pRuntime, const float& fValue); + CJS_Value(CJS_Runtime* pRuntime, const bool& bValue); + CJS_Value(CJS_Runtime* pRuntime, CJS_Object* pObj); + CJS_Value(CJS_Runtime* pRuntime, const FX_CHAR* pStr); + CJS_Value(CJS_Runtime* pRuntime, const FX_WCHAR* pWstr); + CJS_Value(CJS_Runtime* pRuntime, const CJS_Array& array); + CJS_Value(CJS_Runtime* pRuntime, const CJS_Date& date); + CJS_Value(CJS_Runtime* pRuntime, const CJS_Object* object); + CJS_Value(const CJS_Value& other); + + ~CJS_Value(); + + void SetNull(CJS_Runtime* pRuntime); + void SetValue(const CJS_Value& other); + void Attach(v8::Local pValue); + void Detach(); + + static Type GetValueType(v8::Local value); + Type GetType() const { return GetValueType(m_pValue); } + + int ToInt(CJS_Runtime* pRuntime) const; + bool ToBool(CJS_Runtime* pRuntime) const; + double ToDouble(CJS_Runtime* pRuntime) const; + float ToFloat(CJS_Runtime* pRuntime) const; + CJS_Object* ToCJSObject(CJS_Runtime* pRuntime) const; + CFX_WideString ToCFXWideString(CJS_Runtime* pRuntime) const; + CFX_ByteString ToCFXByteString(CJS_Runtime* pRuntime) const; + v8::Local ToV8Object(CJS_Runtime* pRuntime) const; + v8::Local ToV8Array(CJS_Runtime* pRuntime) const; + v8::Local ToV8Value(CJS_Runtime* pRuntime) const; + + // Replace the current |m_pValue| with a v8::Number if possible + // to make one from the current |m_pValue|. + void MaybeCoerceToNumber(CJS_Runtime* pRuntime); + + bool IsArrayObject() const; + bool IsDateObject() const; + bool ConvertToArray(CJS_Runtime* pRuntime, CJS_Array&) const; + bool ConvertToDate(CJS_Runtime* pRuntime, CJS_Date&) const; + + protected: + v8::Local m_pValue; +}; + +class CJS_PropValue { + public: + explicit CJS_PropValue(CJS_Runtime* pRuntime); + CJS_PropValue(CJS_Runtime* pRuntime, const CJS_Value&); + ~CJS_PropValue(); + + void StartSetting() { m_bIsSetting = true; } + void StartGetting() { m_bIsSetting = false; } + bool IsSetting() const { return m_bIsSetting; } + bool IsGetting() const { return !m_bIsSetting; } + CJS_Runtime* GetJSRuntime() const { return m_pJSRuntime; } + CJS_Value* GetJSValue() { return &m_Value; } + + // These calls may re-enter JS (and hence invalidate objects). + void operator<<(int val); + void operator>>(int&) const; + void operator<<(bool val); + void operator>>(bool&) const; + void operator<<(double val); + void operator>>(double&) const; + void operator<<(CJS_Object* pObj); + void operator>>(CJS_Object*& ppObj) const; + void operator<<(CJS_Document* pJsDoc); + void operator>>(CJS_Document*& ppJsDoc) const; + void operator<<(CFX_ByteString); + void operator>>(CFX_ByteString&) const; + void operator<<(CFX_WideString); + void operator>>(CFX_WideString&) const; + void operator<<(const FX_WCHAR* c_string); + void operator<<(v8::Local); + void operator>>(v8::Local&) const; + void operator>>(CJS_Array& array) const; + void operator<<(CJS_Array& array); + void operator<<(CJS_Date& date); + void operator>>(CJS_Date& date) const; + + private: + bool m_bIsSetting; + CJS_Value m_Value; + CJS_Runtime* const m_pJSRuntime; +}; + +class CJS_Array { + public: + CJS_Array(); + CJS_Array(const CJS_Array& other); + virtual ~CJS_Array(); + + void Attach(v8::Local pArray); + int GetLength(CJS_Runtime* pRuntime) const; + + // These two calls may re-enter JS (and hence invalidate objects). + void GetElement(CJS_Runtime* pRuntime, + unsigned index, + CJS_Value& value) const; + void SetElement(CJS_Runtime* pRuntime, + unsigned index, + const CJS_Value& value); + + v8::Local ToV8Array(CJS_Runtime* pRuntime) const; + + private: + mutable v8::Local m_pArray; +}; + +class CJS_Date { + public: + CJS_Date(); + CJS_Date(CJS_Runtime* pRuntime, double dMsec_time); + CJS_Date(CJS_Runtime* pRuntime, + int year, + int mon, + int day, + int hour, + int min, + int sec); + virtual ~CJS_Date(); + + void Attach(v8::Local pDate); + bool IsValidDate(CJS_Runtime* pRuntime) const; + + int GetYear(CJS_Runtime* pRuntime) const; + void SetYear(CJS_Runtime* pRuntime, int iYear); + + int GetMonth(CJS_Runtime* pRuntime) const; + void SetMonth(CJS_Runtime* pRuntime, int iMonth); + + int GetDay(CJS_Runtime* pRuntime) const; + void SetDay(CJS_Runtime* pRuntime, int iDay); + + int GetHours(CJS_Runtime* pRuntime) const; + void SetHours(CJS_Runtime* pRuntime, int iHours); + + int GetMinutes(CJS_Runtime* pRuntime) const; + void SetMinutes(CJS_Runtime* pRuntime, int minutes); + + int GetSeconds(CJS_Runtime* pRuntime) const; + void SetSeconds(CJS_Runtime* pRuntime, int seconds); + + v8::Local ToV8Date(CJS_Runtime* pRuntime) const; + double ToDouble(CJS_Runtime* pRuntime) const; + CFX_WideString ToString(CJS_Runtime* pRuntime) const; + + protected: + v8::Local m_pDate; +}; + +double JS_GetDateTime(); +int JS_GetYearFromTime(double dt); +int JS_GetMonthFromTime(double dt); +int JS_GetDayFromTime(double dt); +int JS_GetHourFromTime(double dt); +int JS_GetMinFromTime(double dt); +int JS_GetSecFromTime(double dt); +double JS_DateParse(const CFX_WideString& str); +double JS_MakeDay(int nYear, int nMonth, int nDay); +double JS_MakeTime(int nHour, int nMin, int nSec, int nMs); +double JS_MakeDate(double day, double time); +bool JS_PortIsNan(double d); +double JS_LocalTime(double d); + +// Some JS methods have the bizarre convention that they may also be called +// with a single argument which is an object containing the actual arguments +// as its properties. The varying arguments to this method are the property +// names as wchar_t string literals corresponding to each positional argument. +// The result will always contain |nKeywords| value, with unspecified ones +// being set to type VT_unknown. +std::vector JS_ExpandKeywordParams( + CJS_Runtime* pRuntime, + const std::vector& originals, + size_t nKeywords, + ...); + +#endif // FPDFSDK_JAVASCRIPT_JS_VALUE_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/PublicMethods.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/PublicMethods.cpp new file mode 100644 index 000000000000..3bcbc341acf2 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/PublicMethods.cpp @@ -0,0 +1,1801 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/PublicMethods.h" + +#include +#include +#include +#include +#include +#include + +#include "core/fpdfdoc/cpdf_interform.h" +#include "core/fxcrt/fx_ext.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "fpdfsdk/javascript/Field.h" +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_EventHandler.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" +#include "fpdfsdk/javascript/cjs_event_context.h" +#include "fpdfsdk/javascript/cjs_runtime.h" +#include "fpdfsdk/javascript/color.h" +#include "fpdfsdk/javascript/resource.h" +#include "fpdfsdk/javascript/util.h" + +#define DOUBLE_CORRECT 0.000000000000001 + +JSMethodSpec CJS_PublicMethods::GlobalFunctionSpecs[] = { + {"AFNumber_Format", AFNumber_Format_static}, + {"AFNumber_Keystroke", AFNumber_Keystroke_static}, + {"AFPercent_Format", AFPercent_Format_static}, + {"AFPercent_Keystroke", AFPercent_Keystroke_static}, + {"AFDate_FormatEx", AFDate_FormatEx_static}, + {"AFDate_KeystrokeEx", AFDate_KeystrokeEx_static}, + {"AFDate_Format", AFDate_Format_static}, + {"AFDate_Keystroke", AFDate_Keystroke_static}, + {"AFTime_FormatEx", AFTime_FormatEx_static}, + {"AFTime_KeystrokeEx", AFTime_KeystrokeEx_static}, + {"AFTime_Format", AFTime_Format_static}, + {"AFTime_Keystroke", AFTime_Keystroke_static}, + {"AFSpecial_Format", AFSpecial_Format_static}, + {"AFSpecial_Keystroke", AFSpecial_Keystroke_static}, + {"AFSpecial_KeystrokeEx", AFSpecial_KeystrokeEx_static}, + {"AFSimple", AFSimple_static}, + {"AFMakeNumber", AFMakeNumber_static}, + {"AFSimple_Calculate", AFSimple_Calculate_static}, + {"AFRange_Validate", AFRange_Validate_static}, + {"AFMergeChange", AFMergeChange_static}, + {"AFParseDateEx", AFParseDateEx_static}, + {"AFExtractNums", AFExtractNums_static}, + {0, 0}}; + +IMPLEMENT_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods) + +namespace { + +const FX_WCHAR* const months[] = {L"Jan", L"Feb", L"Mar", L"Apr", + L"May", L"Jun", L"Jul", L"Aug", + L"Sep", L"Oct", L"Nov", L"Dec"}; + +const FX_WCHAR* const fullmonths[] = {L"January", L"February", L"March", + L"April", L"May", L"June", + L"July", L"August", L"September", + L"October", L"November", L"December"}; + +CFX_ByteString StrTrim(const CFX_ByteString& pStr) { + CFX_ByteString result(pStr); + result.TrimLeft(' '); + result.TrimRight(' '); + return result; +} + +CFX_WideString StrTrim(const CFX_WideString& pStr) { + CFX_WideString result(pStr); + result.TrimLeft(' '); + result.TrimRight(' '); + return result; +} + +void AlertIfPossible(CJS_EventContext* pContext, const FX_WCHAR* swMsg) { + CPDFSDK_FormFillEnvironment* pFormFillEnv = pContext->GetFormFillEnv(); + if (pFormFillEnv) + pFormFillEnv->JS_appAlert(swMsg, nullptr, 0, 3); +} + +#if _FX_OS_ != _FX_ANDROID_ +CFX_ByteString CalculateString(double dValue, + int iDec, + int* iDec2, + bool* bNegative) { + *bNegative = dValue < 0; + if (*bNegative) + dValue = -dValue; + + // Make sure the number of precision characters will fit. + if (iDec > std::numeric_limits::digits10) + iDec = std::numeric_limits::digits10; + + std::stringstream ss; + ss << std::fixed << std::setprecision(iDec) << dValue; + std::string stringValue = ss.str(); + size_t iDecimalPos = stringValue.find("."); + *iDec2 = iDecimalPos == std::string::npos ? stringValue.size() + : static_cast(iDecimalPos); + return CFX_ByteString(stringValue.c_str()); +} +#endif + +} // namespace + +bool CJS_PublicMethods::IsNumber(const CFX_WideString& str) { + CFX_WideString sTrim = StrTrim(str); + const FX_WCHAR* pTrim = sTrim.c_str(); + const FX_WCHAR* p = pTrim; + bool bDot = false; + bool bKXJS = false; + + wchar_t c; + while ((c = *p) != L'\0') { + if (c == L'.' || c == L',') { + if (bDot) + return false; + bDot = true; + } else if (c == L'-' || c == L'+') { + if (p != pTrim) + return false; + } else if (c == L'e' || c == L'E') { + if (bKXJS) + return false; + + p++; + c = *p; + if (c == L'+' || c == L'-') { + bKXJS = true; + } else { + return false; + } + } else if (!FXSYS_iswdigit(c)) { + return false; + } + p++; + } + + return true; +} + +bool CJS_PublicMethods::maskSatisfied(wchar_t c_Change, wchar_t c_Mask) { + switch (c_Mask) { + case L'9': + return FXSYS_iswdigit(c_Change); + case L'A': + return FXSYS_iswalpha(c_Change); + case L'O': + return FXSYS_iswalnum(c_Change); + case L'X': + return true; + default: + return (c_Change == c_Mask); + } +} + +bool CJS_PublicMethods::isReservedMaskChar(wchar_t ch) { + return ch == L'9' || ch == L'A' || ch == L'O' || ch == L'X'; +} + +double CJS_PublicMethods::AF_Simple(const FX_WCHAR* sFuction, + double dValue1, + double dValue2) { + if (FXSYS_wcsicmp(sFuction, L"AVG") == 0 || + FXSYS_wcsicmp(sFuction, L"SUM") == 0) { + return dValue1 + dValue2; + } + if (FXSYS_wcsicmp(sFuction, L"PRD") == 0) { + return dValue1 * dValue2; + } + if (FXSYS_wcsicmp(sFuction, L"MIN") == 0) { + return std::min(dValue1, dValue2); + } + if (FXSYS_wcsicmp(sFuction, L"MAX") == 0) { + return std::max(dValue1, dValue2); + } + return dValue1; +} + +CJS_Array CJS_PublicMethods::AF_MakeArrayFromList(CJS_Runtime* pRuntime, + CJS_Value val) { + CJS_Array StrArray; + if (val.IsArrayObject()) { + val.ConvertToArray(pRuntime, StrArray); + return StrArray; + } + CFX_WideString wsStr = val.ToCFXWideString(pRuntime); + CFX_ByteString t = CFX_ByteString::FromUnicode(wsStr); + const char* p = t.c_str(); + + int ch = ','; + int nIndex = 0; + + while (*p) { + const char* pTemp = strchr(p, ch); + if (!pTemp) { + StrArray.SetElement( + pRuntime, nIndex, + CJS_Value(pRuntime, StrTrim(CFX_ByteString(p)).c_str())); + break; + } + + char* pSub = new char[pTemp - p + 1]; + strncpy(pSub, p, pTemp - p); + *(pSub + (pTemp - p)) = '\0'; + + StrArray.SetElement( + pRuntime, nIndex, + CJS_Value(pRuntime, StrTrim(CFX_ByteString(pSub)).c_str())); + delete[] pSub; + + nIndex++; + p = ++pTemp; + } + return StrArray; +} + +int CJS_PublicMethods::ParseStringInteger(const CFX_WideString& str, + int nStart, + int& nSkip, + int nMaxStep) { + int nRet = 0; + nSkip = 0; + for (int i = nStart, sz = str.GetLength(); i < sz; i++) { + if (i - nStart > 10) + break; + + FX_WCHAR c = str.GetAt(i); + if (!FXSYS_iswdigit(c)) + break; + + nRet = nRet * 10 + FXSYS_toDecimalDigit(c); + nSkip = i - nStart + 1; + if (nSkip >= nMaxStep) + break; + } + + return nRet; +} + +CFX_WideString CJS_PublicMethods::ParseStringString(const CFX_WideString& str, + int nStart, + int& nSkip) { + CFX_WideString swRet; + nSkip = 0; + for (int i = nStart, sz = str.GetLength(); i < sz; i++) { + FX_WCHAR c = str.GetAt(i); + if (!FXSYS_iswdigit(c)) + break; + + swRet += c; + nSkip = i - nStart + 1; + } + + return swRet; +} + +double CJS_PublicMethods::ParseNormalDate(const CFX_WideString& value, + bool* bWrongFormat) { + double dt = JS_GetDateTime(); + + int nYear = JS_GetYearFromTime(dt); + int nMonth = JS_GetMonthFromTime(dt) + 1; + int nDay = JS_GetDayFromTime(dt); + int nHour = JS_GetHourFromTime(dt); + int nMin = JS_GetMinFromTime(dt); + int nSec = JS_GetSecFromTime(dt); + + int number[3]; + + int nSkip = 0; + int nLen = value.GetLength(); + int nIndex = 0; + int i = 0; + while (i < nLen) { + if (nIndex > 2) + break; + + FX_WCHAR c = value.GetAt(i); + if (FXSYS_iswdigit(c)) { + number[nIndex++] = ParseStringInteger(value, i, nSkip, 4); + i += nSkip; + } else { + i++; + } + } + + if (nIndex == 2) { + // case2: month/day + // case3: day/month + if ((number[0] >= 1 && number[0] <= 12) && + (number[1] >= 1 && number[1] <= 31)) { + nMonth = number[0]; + nDay = number[1]; + } else if ((number[0] >= 1 && number[0] <= 31) && + (number[1] >= 1 && number[1] <= 12)) { + nDay = number[0]; + nMonth = number[1]; + } + + if (bWrongFormat) + *bWrongFormat = false; + } else if (nIndex == 3) { + // case1: year/month/day + // case2: month/day/year + // case3: day/month/year + + if (number[0] > 12 && (number[1] >= 1 && number[1] <= 12) && + (number[2] >= 1 && number[2] <= 31)) { + nYear = number[0]; + nMonth = number[1]; + nDay = number[2]; + } else if ((number[0] >= 1 && number[0] <= 12) && + (number[1] >= 1 && number[1] <= 31) && number[2] > 31) { + nMonth = number[0]; + nDay = number[1]; + nYear = number[2]; + } else if ((number[0] >= 1 && number[0] <= 31) && + (number[1] >= 1 && number[1] <= 12) && number[2] > 31) { + nDay = number[0]; + nMonth = number[1]; + nYear = number[2]; + } + + if (bWrongFormat) + *bWrongFormat = false; + } else { + if (bWrongFormat) + *bWrongFormat = true; + return dt; + } + + CFX_WideString swTemp; + swTemp.Format(L"%d/%d/%d %d:%d:%d", nMonth, nDay, nYear, nHour, nMin, nSec); + return JS_DateParse(swTemp); +} + +double CJS_PublicMethods::MakeRegularDate(const CFX_WideString& value, + const CFX_WideString& format, + bool* bWrongFormat) { + double dt = JS_GetDateTime(); + + if (format.IsEmpty() || value.IsEmpty()) + return dt; + + int nYear = JS_GetYearFromTime(dt); + int nMonth = JS_GetMonthFromTime(dt) + 1; + int nDay = JS_GetDayFromTime(dt); + int nHour = JS_GetHourFromTime(dt); + int nMin = JS_GetMinFromTime(dt); + int nSec = JS_GetSecFromTime(dt); + + int nYearSub = 99; // nYear - 2000; + + bool bPm = false; + bool bExit = false; + bool bBadFormat = false; + + int i = 0; + int j = 0; + + while (i < format.GetLength()) { + if (bExit) + break; + + FX_WCHAR c = format.GetAt(i); + switch (c) { + case ':': + case '.': + case '-': + case '\\': + case '/': + i++; + j++; + break; + + case 'y': + case 'm': + case 'd': + case 'H': + case 'h': + case 'M': + case 's': + case 't': { + int oldj = j; + int nSkip = 0; + int remaining = format.GetLength() - i - 1; + + if (remaining == 0 || format.GetAt(i + 1) != c) { + switch (c) { + case 'y': + i++; + j++; + break; + case 'm': + nMonth = ParseStringInteger(value, j, nSkip, 2); + i++; + j += nSkip; + break; + case 'd': + nDay = ParseStringInteger(value, j, nSkip, 2); + i++; + j += nSkip; + break; + case 'H': + nHour = ParseStringInteger(value, j, nSkip, 2); + i++; + j += nSkip; + break; + case 'h': + nHour = ParseStringInteger(value, j, nSkip, 2); + i++; + j += nSkip; + break; + case 'M': + nMin = ParseStringInteger(value, j, nSkip, 2); + i++; + j += nSkip; + break; + case 's': + nSec = ParseStringInteger(value, j, nSkip, 2); + i++; + j += nSkip; + break; + case 't': + bPm = (j < value.GetLength() && value.GetAt(j) == 'p'); + i++; + j++; + break; + } + } else if (remaining == 1 || format.GetAt(i + 2) != c) { + switch (c) { + case 'y': + nYear = ParseStringInteger(value, j, nSkip, 4); + i += 2; + j += nSkip; + break; + case 'm': + nMonth = ParseStringInteger(value, j, nSkip, 2); + i += 2; + j += nSkip; + break; + case 'd': + nDay = ParseStringInteger(value, j, nSkip, 2); + i += 2; + j += nSkip; + break; + case 'H': + nHour = ParseStringInteger(value, j, nSkip, 2); + i += 2; + j += nSkip; + break; + case 'h': + nHour = ParseStringInteger(value, j, nSkip, 2); + i += 2; + j += nSkip; + break; + case 'M': + nMin = ParseStringInteger(value, j, nSkip, 2); + i += 2; + j += nSkip; + break; + case 's': + nSec = ParseStringInteger(value, j, nSkip, 2); + i += 2; + j += nSkip; + break; + case 't': + bPm = (j + 1 < value.GetLength() && value.GetAt(j) == 'p' && + value.GetAt(j + 1) == 'm'); + i += 2; + j += 2; + break; + } + } else if (remaining == 2 || format.GetAt(i + 3) != c) { + switch (c) { + case 'm': { + CFX_WideString sMonth = ParseStringString(value, j, nSkip); + bool bFind = false; + for (int m = 0; m < 12; m++) { + if (sMonth.CompareNoCase(months[m]) == 0) { + nMonth = m + 1; + i += 3; + j += nSkip; + bFind = true; + break; + } + } + + if (!bFind) { + nMonth = ParseStringInteger(value, j, nSkip, 3); + i += 3; + j += nSkip; + } + } break; + case 'y': + break; + default: + i += 3; + j += 3; + break; + } + } else if (remaining == 3 || format.GetAt(i + 4) != c) { + switch (c) { + case 'y': + nYear = ParseStringInteger(value, j, nSkip, 4); + j += nSkip; + i += 4; + break; + case 'm': { + bool bFind = false; + + CFX_WideString sMonth = ParseStringString(value, j, nSkip); + sMonth.MakeLower(); + + for (int m = 0; m < 12; m++) { + CFX_WideString sFullMonths = fullmonths[m]; + sFullMonths.MakeLower(); + + if (sFullMonths.Find(sMonth.c_str(), 0) != -1) { + nMonth = m + 1; + i += 4; + j += nSkip; + bFind = true; + break; + } + } + + if (!bFind) { + nMonth = ParseStringInteger(value, j, nSkip, 4); + i += 4; + j += nSkip; + } + } break; + default: + i += 4; + j += 4; + break; + } + } else { + if (j >= value.GetLength() || format.GetAt(i) != value.GetAt(j)) { + bBadFormat = true; + bExit = true; + } + i++; + j++; + } + + if (oldj == j) { + bBadFormat = true; + bExit = true; + } + } + + break; + default: + if (value.GetLength() <= j) { + bExit = true; + } else if (format.GetAt(i) != value.GetAt(j)) { + bBadFormat = true; + bExit = true; + } + + i++; + j++; + break; + } + } + + if (bPm) + nHour += 12; + + if (nYear >= 0 && nYear <= nYearSub) + nYear += 2000; + + if (nMonth < 1 || nMonth > 12) + bBadFormat = true; + + if (nDay < 1 || nDay > 31) + bBadFormat = true; + + if (nHour < 0 || nHour > 24) + bBadFormat = true; + + if (nMin < 0 || nMin > 60) + bBadFormat = true; + + if (nSec < 0 || nSec > 60) + bBadFormat = true; + + double dRet = 0; + if (bBadFormat) { + dRet = ParseNormalDate(value, &bBadFormat); + } else { + dRet = JS_MakeDate(JS_MakeDay(nYear, nMonth - 1, nDay), + JS_MakeTime(nHour, nMin, nSec, 0)); + if (JS_PortIsNan(dRet)) + dRet = JS_DateParse(value); + } + + if (JS_PortIsNan(dRet)) + dRet = ParseNormalDate(value, &bBadFormat); + + if (bWrongFormat) + *bWrongFormat = bBadFormat; + + return dRet; +} + +CFX_WideString CJS_PublicMethods::MakeFormatDate(double dDate, + const CFX_WideString& format) { + CFX_WideString sRet = L"", sPart = L""; + + int nYear = JS_GetYearFromTime(dDate); + int nMonth = JS_GetMonthFromTime(dDate) + 1; + int nDay = JS_GetDayFromTime(dDate); + int nHour = JS_GetHourFromTime(dDate); + int nMin = JS_GetMinFromTime(dDate); + int nSec = JS_GetSecFromTime(dDate); + + int i = 0; + while (i < format.GetLength()) { + FX_WCHAR c = format.GetAt(i); + int remaining = format.GetLength() - i - 1; + sPart = L""; + switch (c) { + case 'y': + case 'm': + case 'd': + case 'H': + case 'h': + case 'M': + case 's': + case 't': + if (remaining == 0 || format.GetAt(i + 1) != c) { + switch (c) { + case 'y': + sPart += c; + break; + case 'm': + sPart.Format(L"%d", nMonth); + break; + case 'd': + sPart.Format(L"%d", nDay); + break; + case 'H': + sPart.Format(L"%d", nHour); + break; + case 'h': + sPart.Format(L"%d", nHour > 12 ? nHour - 12 : nHour); + break; + case 'M': + sPart.Format(L"%d", nMin); + break; + case 's': + sPart.Format(L"%d", nSec); + break; + case 't': + sPart += nHour > 12 ? 'p' : 'a'; + break; + } + i++; + } else if (remaining == 1 || format.GetAt(i + 2) != c) { + switch (c) { + case 'y': + sPart.Format(L"%02d", nYear - (nYear / 100) * 100); + break; + case 'm': + sPart.Format(L"%02d", nMonth); + break; + case 'd': + sPart.Format(L"%02d", nDay); + break; + case 'H': + sPart.Format(L"%02d", nHour); + break; + case 'h': + sPart.Format(L"%02d", nHour > 12 ? nHour - 12 : nHour); + break; + case 'M': + sPart.Format(L"%02d", nMin); + break; + case 's': + sPart.Format(L"%02d", nSec); + break; + case 't': + sPart = nHour > 12 ? L"pm" : L"am"; + break; + } + i += 2; + } else if (remaining == 2 || format.GetAt(i + 3) != c) { + switch (c) { + case 'm': + i += 3; + if (nMonth > 0 && nMonth <= 12) + sPart += months[nMonth - 1]; + break; + default: + i += 3; + sPart += c; + sPart += c; + sPart += c; + break; + } + } else if (remaining == 3 || format.GetAt(i + 4) != c) { + switch (c) { + case 'y': + sPart.Format(L"%04d", nYear); + i += 4; + break; + case 'm': + i += 4; + if (nMonth > 0 && nMonth <= 12) + sPart += fullmonths[nMonth - 1]; + break; + default: + i += 4; + sPart += c; + sPart += c; + sPart += c; + sPart += c; + break; + } + } else { + i++; + sPart += c; + } + break; + default: + i++; + sPart += c; + break; + } + + sRet += sPart; + } + + return sRet; +} + +// function AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, +// bCurrencyPrepend) +bool CJS_PublicMethods::AFNumber_Format(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { +#if _FX_OS_ != _FX_ANDROID_ + if (params.size() != 6) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + if (!pEvent->m_pValue) + return false; + + CFX_WideString& Value = pEvent->Value(); + CFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value)); + if (strValue.IsEmpty()) + return true; + + int iDec = params[0].ToInt(pRuntime); + int iSepStyle = params[1].ToInt(pRuntime); + int iNegStyle = params[2].ToInt(pRuntime); + // params[3] is iCurrStyle, it's not used. + CFX_WideString wstrCurrency = params[4].ToCFXWideString(pRuntime); + bool bCurrencyPrepend = params[5].ToBool(pRuntime); + + if (iDec < 0) + iDec = -iDec; + + if (iSepStyle < 0 || iSepStyle > 3) + iSepStyle = 0; + + if (iNegStyle < 0 || iNegStyle > 3) + iNegStyle = 0; + + // Processing decimal places + strValue.Replace(",", "."); + double dValue = atof(strValue.c_str()); + if (iDec > 0) + dValue += DOUBLE_CORRECT; + + // Calculating number string + bool bNegative; + int iDec2; + strValue = CalculateString(dValue, iDec, &iDec2, &bNegative); + if (strValue.IsEmpty()) { + dValue = 0; + strValue = CalculateString(dValue, iDec, &iDec2, &bNegative); + if (strValue.IsEmpty()) { + strValue = "0"; + iDec2 = 1; + } + } + + // Processing separator style + if (iDec2 < strValue.GetLength()) { + if (iSepStyle == 2 || iSepStyle == 3) + strValue.Replace(".", ","); + + if (iDec2 == 0) + strValue.Insert(iDec2, '0'); + } + if (iSepStyle == 0 || iSepStyle == 2) { + char cSeparator; + if (iSepStyle == 0) + cSeparator = ','; + else + cSeparator = '.'; + + for (int iDecPositive = iDec2 - 3; iDecPositive > 0; iDecPositive -= 3) + strValue.Insert(iDecPositive, cSeparator); + } + + // Processing currency string + Value = CFX_WideString::FromLocal(strValue.AsStringC()); + + if (bCurrencyPrepend) + Value = wstrCurrency + Value; + else + Value = Value + wstrCurrency; + + // Processing negative style + if (bNegative) { + if (iNegStyle == 0) + Value = L"-" + Value; + else if (iNegStyle == 2 || iNegStyle == 3) + Value = L"(" + Value + L")"; + if (iNegStyle == 1 || iNegStyle == 3) { + if (Field* fTarget = pEvent->Target_Field()) { + CJS_Array arColor; + CJS_Value vColElm(pRuntime); + vColElm = CJS_Value(pRuntime, L"RGB"); + arColor.SetElement(pRuntime, 0, vColElm); + vColElm = CJS_Value(pRuntime, 1); + arColor.SetElement(pRuntime, 1, vColElm); + vColElm = CJS_Value(pRuntime, 0); + arColor.SetElement(pRuntime, 2, vColElm); + arColor.SetElement(pRuntime, 3, vColElm); + + CJS_PropValue vProp(pRuntime); + vProp.StartGetting(); + vProp << arColor; + vProp.StartSetting(); + fTarget->textColor(pRuntime, vProp, sError); // red + } + } + } else { + if (iNegStyle == 1 || iNegStyle == 3) { + if (Field* fTarget = pEvent->Target_Field()) { + CJS_Array arColor; + CJS_Value vColElm(pRuntime); + vColElm = CJS_Value(pRuntime, L"RGB"); + arColor.SetElement(pRuntime, 0, vColElm); + vColElm = CJS_Value(pRuntime, 0); + arColor.SetElement(pRuntime, 1, vColElm); + arColor.SetElement(pRuntime, 2, vColElm); + arColor.SetElement(pRuntime, 3, vColElm); + + CJS_PropValue vProp(pRuntime); + vProp.StartGetting(); + fTarget->textColor(pRuntime, vProp, sError); + + CJS_Array aProp; + vProp.GetJSValue()->ConvertToArray(pRuntime, aProp); + + CPWL_Color crProp; + CPWL_Color crColor; + color::ConvertArrayToPWLColor(pRuntime, aProp, &crProp); + color::ConvertArrayToPWLColor(pRuntime, arColor, &crColor); + + if (crColor != crProp) { + CJS_PropValue vProp2(pRuntime); + vProp2.StartGetting(); + vProp2 << arColor; + vProp2.StartSetting(); + fTarget->textColor(pRuntime, vProp2, sError); + } + } + } + } +#endif + return true; +} + +// function AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, +// bCurrencyPrepend) +bool CJS_PublicMethods::AFNumber_Keystroke(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() < 2) + return false; + + CJS_EventContext* pContext = pRuntime->GetCurrentEventContext(); + CJS_EventHandler* pEvent = pContext->GetEventHandler(); + if (!pEvent->m_pValue) + return false; + + CFX_WideString& val = pEvent->Value(); + CFX_WideString& wstrChange = pEvent->Change(); + CFX_WideString wstrValue = val; + + if (pEvent->WillCommit()) { + CFX_WideString swTemp = StrTrim(wstrValue); + if (swTemp.IsEmpty()) + return true; + + swTemp.Replace(L",", L"."); + if (!IsNumber(swTemp.c_str())) { + pEvent->Rc() = false; + sError = JSGetStringFromID(IDS_STRING_JSAFNUMBER_KEYSTROKE); + AlertIfPossible(pContext, sError.c_str()); + } + return true; // it happens after the last keystroke and before validating, + } + + CFX_WideString wstrSelected; + if (pEvent->SelStart() != -1) { + wstrSelected = wstrValue.Mid(pEvent->SelStart(), + pEvent->SelEnd() - pEvent->SelStart()); + } + + bool bHasSign = wstrValue.Find(L'-') != -1 && wstrSelected.Find(L'-') == -1; + if (bHasSign) { + // can't insert "change" in front to sign postion. + if (pEvent->SelStart() == 0) { + bool& bRc = pEvent->Rc(); + bRc = false; + return true; + } + } + + int iSepStyle = params[1].ToInt(pRuntime); + if (iSepStyle < 0 || iSepStyle > 3) + iSepStyle = 0; + const FX_WCHAR cSep = iSepStyle < 2 ? L'.' : L','; + + bool bHasSep = wstrValue.Find(cSep) != -1; + for (FX_STRSIZE i = 0; i < wstrChange.GetLength(); ++i) { + if (wstrChange[i] == cSep) { + if (bHasSep) { + bool& bRc = pEvent->Rc(); + bRc = false; + return true; + } + bHasSep = true; + continue; + } + if (wstrChange[i] == L'-') { + if (bHasSign) { + bool& bRc = pEvent->Rc(); + bRc = false; + return true; + } + // sign's position is not correct + if (i != 0) { + bool& bRc = pEvent->Rc(); + bRc = false; + return true; + } + if (pEvent->SelStart() != 0) { + bool& bRc = pEvent->Rc(); + bRc = false; + return true; + } + bHasSign = true; + continue; + } + + if (!FXSYS_iswdigit(wstrChange[i])) { + bool& bRc = pEvent->Rc(); + bRc = false; + return true; + } + } + + CFX_WideString wprefix = wstrValue.Mid(0, pEvent->SelStart()); + CFX_WideString wpostfix; + if (pEvent->SelEnd() < wstrValue.GetLength()) + wpostfix = wstrValue.Mid(pEvent->SelEnd()); + val = wprefix + wstrChange + wpostfix; + return true; +} + +// function AFPercent_Format(nDec, sepStyle) +bool CJS_PublicMethods::AFPercent_Format(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { +#if _FX_OS_ != _FX_ANDROID_ + if (params.size() != 2) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + if (!pEvent->m_pValue) + return false; + + CFX_WideString& Value = pEvent->Value(); + CFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value)); + if (strValue.IsEmpty()) + return true; + + int iDec = params[0].ToInt(pRuntime); + if (iDec < 0) + iDec = -iDec; + + int iSepStyle = params[1].ToInt(pRuntime); + if (iSepStyle < 0 || iSepStyle > 3) + iSepStyle = 0; + + // for processing decimal places + double dValue = atof(strValue.c_str()); + dValue *= 100; + if (iDec > 0) + dValue += DOUBLE_CORRECT; + + int iDec2; + int iNegative = 0; + strValue = fcvt(dValue, iDec, &iDec2, &iNegative); + if (strValue.IsEmpty()) { + dValue = 0; + strValue = fcvt(dValue, iDec, &iDec2, &iNegative); + } + + if (iDec2 < 0) { + for (int iNum = 0; iNum < abs(iDec2); iNum++) { + strValue = "0" + strValue; + } + iDec2 = 0; + } + int iMax = strValue.GetLength(); + if (iDec2 > iMax) { + for (int iNum = 0; iNum <= iDec2 - iMax; iNum++) { + strValue += "0"; + } + iMax = iDec2 + 1; + } + + // for processing seperator style + if (iDec2 < iMax) { + if (iSepStyle == 0 || iSepStyle == 1) { + strValue.Insert(iDec2, '.'); + iMax++; + } else if (iSepStyle == 2 || iSepStyle == 3) { + strValue.Insert(iDec2, ','); + iMax++; + } + + if (iDec2 == 0) + strValue.Insert(iDec2, '0'); + } + if (iSepStyle == 0 || iSepStyle == 2) { + char cSeperator; + if (iSepStyle == 0) + cSeperator = ','; + else + cSeperator = '.'; + + for (int iDecPositive = iDec2 - 3; iDecPositive > 0; iDecPositive -= 3) { + strValue.Insert(iDecPositive, cSeperator); + iMax++; + } + } + + // negative mark + if (iNegative) + strValue = "-" + strValue; + strValue += "%"; + Value = CFX_WideString::FromLocal(strValue.AsStringC()); +#endif + return true; +} +// AFPercent_Keystroke(nDec, sepStyle) +bool CJS_PublicMethods::AFPercent_Keystroke( + CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return AFNumber_Keystroke(pRuntime, params, vRet, sError); +} + +// function AFDate_FormatEx(cFormat) +bool CJS_PublicMethods::AFDate_FormatEx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CJS_EventContext* pContext = pRuntime->GetCurrentEventContext(); + CJS_EventHandler* pEvent = pContext->GetEventHandler(); + if (!pEvent->m_pValue) + return false; + + CFX_WideString& val = pEvent->Value(); + CFX_WideString strValue = val; + if (strValue.IsEmpty()) + return true; + + CFX_WideString sFormat = params[0].ToCFXWideString(pRuntime); + double dDate = 0.0f; + + if (strValue.Find(L"GMT") != -1) { + // for GMT format time + // such as "Tue Aug 11 14:24:16 GMT+08002009" + dDate = MakeInterDate(strValue); + } else { + dDate = MakeRegularDate(strValue, sFormat, nullptr); + } + + if (JS_PortIsNan(dDate)) { + CFX_WideString swMsg; + swMsg.Format(JSGetStringFromID(IDS_STRING_JSPARSEDATE).c_str(), + sFormat.c_str()); + AlertIfPossible(pContext, swMsg.c_str()); + return false; + } + + val = MakeFormatDate(dDate, sFormat); + return true; +} + +double CJS_PublicMethods::MakeInterDate(const CFX_WideString& strValue) { + std::vector wsArray; + CFX_WideString sTemp = L""; + for (int i = 0; i < strValue.GetLength(); ++i) { + FX_WCHAR c = strValue.GetAt(i); + if (c == L' ' || c == L':') { + wsArray.push_back(sTemp); + sTemp = L""; + continue; + } + sTemp += c; + } + wsArray.push_back(sTemp); + if (wsArray.size() != 8) + return 0; + + int nMonth = 1; + sTemp = wsArray[1]; + if (sTemp.Compare(L"Jan") == 0) + nMonth = 1; + else if (sTemp.Compare(L"Feb") == 0) + nMonth = 2; + else if (sTemp.Compare(L"Mar") == 0) + nMonth = 3; + else if (sTemp.Compare(L"Apr") == 0) + nMonth = 4; + else if (sTemp.Compare(L"May") == 0) + nMonth = 5; + else if (sTemp.Compare(L"Jun") == 0) + nMonth = 6; + else if (sTemp.Compare(L"Jul") == 0) + nMonth = 7; + else if (sTemp.Compare(L"Aug") == 0) + nMonth = 8; + else if (sTemp.Compare(L"Sep") == 0) + nMonth = 9; + else if (sTemp.Compare(L"Oct") == 0) + nMonth = 10; + else if (sTemp.Compare(L"Nov") == 0) + nMonth = 11; + else if (sTemp.Compare(L"Dec") == 0) + nMonth = 12; + + int nDay = FX_atof(wsArray[2].AsStringC()); + int nHour = FX_atof(wsArray[3].AsStringC()); + int nMin = FX_atof(wsArray[4].AsStringC()); + int nSec = FX_atof(wsArray[5].AsStringC()); + int nYear = FX_atof(wsArray[7].AsStringC()); + double dRet = JS_MakeDate(JS_MakeDay(nYear, nMonth - 1, nDay), + JS_MakeTime(nHour, nMin, nSec, 0)); + if (JS_PortIsNan(dRet)) + dRet = JS_DateParse(strValue); + + return dRet; +} + +// AFDate_KeystrokeEx(cFormat) +bool CJS_PublicMethods::AFDate_KeystrokeEx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = L"AFDate_KeystrokeEx's parameters' size r not correct"; + return false; + } + + CJS_EventContext* pContext = pRuntime->GetCurrentEventContext(); + CJS_EventHandler* pEvent = pContext->GetEventHandler(); + if (pEvent->WillCommit()) { + if (!pEvent->m_pValue) + return false; + + CFX_WideString strValue = pEvent->Value(); + if (strValue.IsEmpty()) + return true; + + CFX_WideString sFormat = params[0].ToCFXWideString(pRuntime); + bool bWrongFormat = false; + double dRet = MakeRegularDate(strValue, sFormat, &bWrongFormat); + if (bWrongFormat || JS_PortIsNan(dRet)) { + CFX_WideString swMsg; + swMsg.Format(JSGetStringFromID(IDS_STRING_JSPARSEDATE).c_str(), + sFormat.c_str()); + AlertIfPossible(pContext, swMsg.c_str()); + pEvent->Rc() = false; + return true; + } + } + return true; +} + +bool CJS_PublicMethods::AFDate_Format(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + int iIndex = params[0].ToInt(pRuntime); + const FX_WCHAR* cFormats[] = {L"m/d", + L"m/d/yy", + L"mm/dd/yy", + L"mm/yy", + L"d-mmm", + L"d-mmm-yy", + L"dd-mmm-yy", + L"yy-mm-dd", + L"mmm-yy", + L"mmmm-yy", + L"mmm d, yyyy", + L"mmmm d, yyyy", + L"m/d/yy h:MM tt", + L"m/d/yy HH:MM"}; + + if (iIndex < 0 || (static_cast(iIndex) >= FX_ArraySize(cFormats))) + iIndex = 0; + + std::vector newParams; + newParams.push_back(CJS_Value(pRuntime, cFormats[iIndex])); + return AFDate_FormatEx(pRuntime, newParams, vRet, sError); +} + +// AFDate_KeystrokeEx(cFormat) +bool CJS_PublicMethods::AFDate_Keystroke(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + int iIndex = params[0].ToInt(pRuntime); + const FX_WCHAR* cFormats[] = {L"m/d", + L"m/d/yy", + L"mm/dd/yy", + L"mm/yy", + L"d-mmm", + L"d-mmm-yy", + L"dd-mmm-yy", + L"yy-mm-dd", + L"mmm-yy", + L"mmmm-yy", + L"mmm d, yyyy", + L"mmmm d, yyyy", + L"m/d/yy h:MM tt", + L"m/d/yy HH:MM"}; + + if (iIndex < 0 || (static_cast(iIndex) >= FX_ArraySize(cFormats))) + iIndex = 0; + + std::vector newParams; + newParams.push_back(CJS_Value(pRuntime, cFormats[iIndex])); + return AFDate_KeystrokeEx(pRuntime, newParams, vRet, sError); +} + +// function AFTime_Format(ptf) +bool CJS_PublicMethods::AFTime_Format(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + int iIndex = params[0].ToInt(pRuntime); + const FX_WCHAR* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss", + L"h:MM:ss tt"}; + + if (iIndex < 0 || (static_cast(iIndex) >= FX_ArraySize(cFormats))) + iIndex = 0; + + std::vector newParams; + newParams.push_back(CJS_Value(pRuntime, cFormats[iIndex])); + return AFDate_FormatEx(pRuntime, newParams, vRet, sError); +} + +bool CJS_PublicMethods::AFTime_Keystroke(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + int iIndex = params[0].ToInt(pRuntime); + const FX_WCHAR* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss", + L"h:MM:ss tt"}; + + if (iIndex < 0 || (static_cast(iIndex) >= FX_ArraySize(cFormats))) + iIndex = 0; + + std::vector newParams; + newParams.push_back(CJS_Value(pRuntime, cFormats[iIndex])); + return AFDate_KeystrokeEx(pRuntime, newParams, vRet, sError); +} + +bool CJS_PublicMethods::AFTime_FormatEx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return AFDate_FormatEx(pRuntime, params, vRet, sError); +} + +bool CJS_PublicMethods::AFTime_KeystrokeEx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return AFDate_KeystrokeEx(pRuntime, params, vRet, sError); +} + +// function AFSpecial_Format(psf) +bool CJS_PublicMethods::AFSpecial_Format(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + if (!pEvent->m_pValue) + return false; + + CFX_WideString wsSource = pEvent->Value(); + CFX_WideString wsFormat; + switch (params[0].ToInt(pRuntime)) { + case 0: + wsFormat = L"99999"; + break; + case 1: + wsFormat = L"99999-9999"; + break; + case 2: + if (util::printx(L"9999999999", wsSource).GetLength() >= 10) + wsFormat = L"(999) 999-9999"; + else + wsFormat = L"999-9999"; + break; + case 3: + wsFormat = L"999-99-9999"; + break; + } + + pEvent->Value() = util::printx(wsFormat, wsSource); + return true; +} + +// function AFSpecial_KeystrokeEx(mask) +bool CJS_PublicMethods::AFSpecial_KeystrokeEx( + CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() < 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CJS_EventContext* pContext = pRuntime->GetCurrentEventContext(); + CJS_EventHandler* pEvent = pContext->GetEventHandler(); + if (!pEvent->m_pValue) + return false; + + CFX_WideString& valEvent = pEvent->Value(); + CFX_WideString wstrMask = params[0].ToCFXWideString(pRuntime); + if (wstrMask.IsEmpty()) + return true; + + if (pEvent->WillCommit()) { + if (valEvent.IsEmpty()) + return true; + + FX_STRSIZE iIndexMask = 0; + for (; iIndexMask < valEvent.GetLength(); ++iIndexMask) { + if (!maskSatisfied(valEvent[iIndexMask], wstrMask[iIndexMask])) + break; + } + + if (iIndexMask != wstrMask.GetLength() || + (iIndexMask != valEvent.GetLength() && wstrMask.GetLength() != 0)) { + AlertIfPossible( + pContext, JSGetStringFromID(IDS_STRING_JSAFNUMBER_KEYSTROKE).c_str()); + pEvent->Rc() = false; + } + return true; + } + + CFX_WideString& wideChange = pEvent->Change(); + if (wideChange.IsEmpty()) + return true; + + CFX_WideString wChange = wideChange; + FX_STRSIZE iIndexMask = pEvent->SelStart(); + FX_STRSIZE combined_len = valEvent.GetLength() + wChange.GetLength() + + pEvent->SelStart() - pEvent->SelEnd(); + if (combined_len > wstrMask.GetLength()) { + AlertIfPossible(pContext, + JSGetStringFromID(IDS_STRING_JSPARAM_TOOLONG).c_str()); + pEvent->Rc() = false; + return true; + } + + if (iIndexMask >= wstrMask.GetLength() && !wChange.IsEmpty()) { + AlertIfPossible(pContext, + JSGetStringFromID(IDS_STRING_JSPARAM_TOOLONG).c_str()); + pEvent->Rc() = false; + return true; + } + + for (FX_STRSIZE i = 0; i < wChange.GetLength(); ++i) { + if (iIndexMask >= wstrMask.GetLength()) { + AlertIfPossible(pContext, + JSGetStringFromID(IDS_STRING_JSPARAM_TOOLONG).c_str()); + pEvent->Rc() = false; + return true; + } + FX_WCHAR wMask = wstrMask[iIndexMask]; + if (!isReservedMaskChar(wMask)) + wChange.SetAt(i, wMask); + + if (!maskSatisfied(wChange[i], wMask)) { + pEvent->Rc() = false; + return true; + } + iIndexMask++; + } + wideChange = wChange; + return true; +} + +// function AFSpecial_Keystroke(psf) +bool CJS_PublicMethods::AFSpecial_Keystroke( + CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + if (!pEvent->m_pValue) + return false; + + const char* cFormat = ""; + switch (params[0].ToInt(pRuntime)) { + case 0: + cFormat = "99999"; + break; + case 1: + cFormat = "999999999"; + break; + case 2: + if (pEvent->Value().GetLength() + pEvent->Change().GetLength() > 7) + cFormat = "9999999999"; + else + cFormat = "9999999"; + break; + case 3: + cFormat = "999999999"; + break; + } + + std::vector params2; + params2.push_back(CJS_Value(pRuntime, cFormat)); + return AFSpecial_KeystrokeEx(pRuntime, params2, vRet, sError); +} + +bool CJS_PublicMethods::AFMergeChange(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CJS_EventHandler* pEventHandler = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + CFX_WideString swValue; + if (pEventHandler->m_pValue) + swValue = pEventHandler->Value(); + + if (pEventHandler->WillCommit()) { + vRet = CJS_Value(pRuntime, swValue.c_str()); + return true; + } + + CFX_WideString prefix, postfix; + + if (pEventHandler->SelStart() >= 0) + prefix = swValue.Mid(0, pEventHandler->SelStart()); + else + prefix = L""; + + if (pEventHandler->SelEnd() >= 0 && + pEventHandler->SelEnd() <= swValue.GetLength()) + postfix = swValue.Mid(pEventHandler->SelEnd(), + swValue.GetLength() - pEventHandler->SelEnd()); + else + postfix = L""; + + vRet = + CJS_Value(pRuntime, (prefix + pEventHandler->Change() + postfix).c_str()); + return true; +} + +bool CJS_PublicMethods::AFParseDateEx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 2) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CFX_WideString sValue = params[0].ToCFXWideString(pRuntime); + CFX_WideString sFormat = params[1].ToCFXWideString(pRuntime); + double dDate = MakeRegularDate(sValue, sFormat, nullptr); + if (JS_PortIsNan(dDate)) { + CFX_WideString swMsg; + swMsg.Format(JSGetStringFromID(IDS_STRING_JSPARSEDATE).c_str(), + sFormat.c_str()); + AlertIfPossible(pRuntime->GetCurrentEventContext(), swMsg.c_str()); + return false; + } + + vRet = CJS_Value(pRuntime, dDate); + return true; +} + +bool CJS_PublicMethods::AFSimple(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 3) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + vRet = CJS_Value(pRuntime, static_cast(AF_Simple( + params[0].ToCFXWideString(pRuntime).c_str(), + params[1].ToDouble(pRuntime), + params[2].ToDouble(pRuntime)))); + + return true; +} + +bool CJS_PublicMethods::AFMakeNumber(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CFX_WideString ws = params[0].ToCFXWideString(pRuntime); + ws.Replace(L",", L"."); + vRet = CJS_Value(pRuntime, ws.c_str()); + vRet.MaybeCoerceToNumber(pRuntime); + if (vRet.GetType() != CJS_Value::VT_number) + vRet = CJS_Value(pRuntime, 0); + return true; +} + +bool CJS_PublicMethods::AFSimple_Calculate(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 2) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CJS_Value params1 = params[1]; + if (!params1.IsArrayObject() && params1.GetType() != CJS_Value::VT_string) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CPDFSDK_InterForm* pReaderInterForm = + pRuntime->GetFormFillEnv()->GetInterForm(); + CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm(); + + CFX_WideString sFunction = params[0].ToCFXWideString(pRuntime); + double dValue = wcscmp(sFunction.c_str(), L"PRD") == 0 ? 1.0 : 0.0; + + CJS_Array FieldNameArray = AF_MakeArrayFromList(pRuntime, params1); + int nFieldsCount = 0; + + for (int i = 0, isz = FieldNameArray.GetLength(pRuntime); i < isz; i++) { + CJS_Value jsValue(pRuntime); + FieldNameArray.GetElement(pRuntime, i, jsValue); + CFX_WideString wsFieldName = jsValue.ToCFXWideString(pRuntime); + + for (int j = 0, jsz = pInterForm->CountFields(wsFieldName); j < jsz; j++) { + if (CPDF_FormField* pFormField = pInterForm->GetField(j, wsFieldName)) { + double dTemp = 0.0; + switch (pFormField->GetFieldType()) { + case FIELDTYPE_TEXTFIELD: + case FIELDTYPE_COMBOBOX: { + CFX_WideString trimmed = pFormField->GetValue(); + trimmed.TrimRight(); + trimmed.TrimLeft(); + dTemp = FX_atof(trimmed.AsStringC()); + } break; + case FIELDTYPE_PUSHBUTTON: { + dTemp = 0.0; + } break; + case FIELDTYPE_CHECKBOX: + case FIELDTYPE_RADIOBUTTON: { + dTemp = 0.0; + for (int c = 0, csz = pFormField->CountControls(); c < csz; c++) { + if (CPDF_FormControl* pFormCtrl = pFormField->GetControl(c)) { + if (pFormCtrl->IsChecked()) { + CFX_WideString trimmed = pFormCtrl->GetExportValue(); + trimmed.TrimRight(); + trimmed.TrimLeft(); + dTemp = FX_atof(trimmed.AsStringC()); + break; + } + } + } + } break; + case FIELDTYPE_LISTBOX: { + if (pFormField->CountSelectedItems() <= 1) { + CFX_WideString trimmed = pFormField->GetValue(); + trimmed.TrimRight(); + trimmed.TrimLeft(); + dTemp = FX_atof(trimmed.AsStringC()); + } + } break; + default: + break; + } + + if (i == 0 && j == 0 && (wcscmp(sFunction.c_str(), L"MIN") == 0 || + wcscmp(sFunction.c_str(), L"MAX") == 0)) + dValue = dTemp; + + dValue = AF_Simple(sFunction.c_str(), dValue, dTemp); + + nFieldsCount++; + } + } + } + + if (wcscmp(sFunction.c_str(), L"AVG") == 0 && nFieldsCount > 0) + dValue /= nFieldsCount; + + dValue = (double)floor(dValue * FXSYS_pow((double)10, (double)6) + 0.49) / + FXSYS_pow((double)10, (double)6); + + CJS_Value jsValue(pRuntime, dValue); + CJS_EventContext* pContext = pRuntime->GetCurrentEventContext(); + if (pContext->GetEventHandler()->m_pValue) + pContext->GetEventHandler()->Value() = jsValue.ToCFXWideString(pRuntime); + + return true; +} + +/* This function validates the current event to ensure that its value is +** within the specified range. */ + +bool CJS_PublicMethods::AFRange_Validate(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 4) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + CJS_EventContext* pContext = pRuntime->GetCurrentEventContext(); + CJS_EventHandler* pEvent = pContext->GetEventHandler(); + if (!pEvent->m_pValue) + return false; + + if (pEvent->Value().IsEmpty()) + return true; + + double dEentValue = + atof(CFX_ByteString::FromUnicode(pEvent->Value()).c_str()); + bool bGreaterThan = params[0].ToBool(pRuntime); + double dGreaterThan = params[1].ToDouble(pRuntime); + bool bLessThan = params[2].ToBool(pRuntime); + double dLessThan = params[3].ToDouble(pRuntime); + CFX_WideString swMsg; + + if (bGreaterThan && bLessThan) { + if (dEentValue < dGreaterThan || dEentValue > dLessThan) + swMsg.Format(JSGetStringFromID(IDS_STRING_JSRANGE1).c_str(), + params[1].ToCFXWideString(pRuntime).c_str(), + params[3].ToCFXWideString(pRuntime).c_str()); + } else if (bGreaterThan) { + if (dEentValue < dGreaterThan) + swMsg.Format(JSGetStringFromID(IDS_STRING_JSRANGE2).c_str(), + params[1].ToCFXWideString(pRuntime).c_str()); + } else if (bLessThan) { + if (dEentValue > dLessThan) + swMsg.Format(JSGetStringFromID(IDS_STRING_JSRANGE3).c_str(), + params[3].ToCFXWideString(pRuntime).c_str()); + } + + if (!swMsg.IsEmpty()) { + AlertIfPossible(pContext, swMsg.c_str()); + pEvent->Rc() = false; + } + return true; +} + +bool CJS_PublicMethods::AFExtractNums(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CFX_WideString str = params[0].ToCFXWideString(pRuntime); + if (str.GetAt(0) == L'.' || str.GetAt(0) == L',') + str = L"0" + str; + + CFX_WideString sPart; + CJS_Array nums; + int nIndex = 0; + for (int i = 0, sz = str.GetLength(); i < sz; i++) { + FX_WCHAR wc = str.GetAt(i); + if (FXSYS_iswdigit(wc)) { + sPart += wc; + } else { + if (sPart.GetLength() > 0) { + nums.SetElement(pRuntime, nIndex, CJS_Value(pRuntime, sPart.c_str())); + sPart = L""; + nIndex++; + } + } + } + + if (sPart.GetLength() > 0) { + nums.SetElement(pRuntime, nIndex, CJS_Value(pRuntime, sPart.c_str())); + } + + if (nums.GetLength(pRuntime) > 0) + vRet = CJS_Value(pRuntime, nums); + else + vRet.SetNull(pRuntime); + + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/PublicMethods.h b/modules/pdfium/pdfium/fpdfsdk/javascript/PublicMethods.h new file mode 100644 index 000000000000..060c74303a8d --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/PublicMethods.h @@ -0,0 +1,162 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_PUBLICMETHODS_H_ +#define FPDFSDK_JAVASCRIPT_PUBLICMETHODS_H_ + +#include +#include + +#include "fpdfsdk/javascript/JS_Define.h" + +class CJS_PublicMethods : public CJS_Object { + public: + explicit CJS_PublicMethods(v8::Local pObject) + : CJS_Object(pObject) {} + ~CJS_PublicMethods() override {} + + static bool AFNumber_Format(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFNumber_Keystroke(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFPercent_Format(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFPercent_Keystroke(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFDate_FormatEx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFDate_KeystrokeEx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFDate_Format(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFDate_Keystroke(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFTime_FormatEx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); // + static bool AFTime_KeystrokeEx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFTime_Format(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFTime_Keystroke(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFSpecial_Format(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFSpecial_Keystroke(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFSpecial_KeystrokeEx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); // + static bool AFSimple(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFMakeNumber(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFSimple_Calculate(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFRange_Validate(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFMergeChange(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFParseDateEx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + static bool AFExtractNums(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + + JS_STATIC_GLOBAL_FUN(AFNumber_Format); + JS_STATIC_GLOBAL_FUN(AFNumber_Keystroke); + JS_STATIC_GLOBAL_FUN(AFPercent_Format); + JS_STATIC_GLOBAL_FUN(AFPercent_Keystroke); + JS_STATIC_GLOBAL_FUN(AFDate_FormatEx); + JS_STATIC_GLOBAL_FUN(AFDate_KeystrokeEx); + JS_STATIC_GLOBAL_FUN(AFDate_Format); + JS_STATIC_GLOBAL_FUN(AFDate_Keystroke); + JS_STATIC_GLOBAL_FUN(AFTime_FormatEx); + JS_STATIC_GLOBAL_FUN(AFTime_KeystrokeEx); + JS_STATIC_GLOBAL_FUN(AFTime_Format); + JS_STATIC_GLOBAL_FUN(AFTime_Keystroke); + JS_STATIC_GLOBAL_FUN(AFSpecial_Format); + JS_STATIC_GLOBAL_FUN(AFSpecial_Keystroke); + JS_STATIC_GLOBAL_FUN(AFSpecial_KeystrokeEx); + JS_STATIC_GLOBAL_FUN(AFSimple); + JS_STATIC_GLOBAL_FUN(AFMakeNumber); + JS_STATIC_GLOBAL_FUN(AFSimple_Calculate); + JS_STATIC_GLOBAL_FUN(AFRange_Validate); + JS_STATIC_GLOBAL_FUN(AFMergeChange); + JS_STATIC_GLOBAL_FUN(AFParseDateEx); + JS_STATIC_GLOBAL_FUN(AFExtractNums); + + JS_STATIC_DECLARE_GLOBAL_FUN(); + + static int ParseStringInteger(const CFX_WideString& string, + int nStart, + int& nSkip, + int nMaxStep); + static CFX_WideString ParseStringString(const CFX_WideString& string, + int nStart, + int& nSkip); + static double MakeRegularDate(const CFX_WideString& value, + const CFX_WideString& format, + bool* bWrongFormat); + static CFX_WideString MakeFormatDate(double dDate, + const CFX_WideString& format); + static double ParseNormalDate(const CFX_WideString& value, + bool* bWrongFormat); + static double MakeInterDate(const CFX_WideString& value); + + static bool IsNumber(const CFX_WideString& str); + + static bool maskSatisfied(wchar_t c_Change, wchar_t c_Mask); + static bool isReservedMaskChar(wchar_t ch); + + static double AF_Simple(const FX_WCHAR* sFuction, + double dValue1, + double dValue2); + static CJS_Array AF_MakeArrayFromList(CJS_Runtime* pRuntime, CJS_Value val); +}; + +#endif // FPDFSDK_JAVASCRIPT_PUBLICMETHODS_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/app.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/app.cpp new file mode 100644 index 000000000000..3a8bf088f361 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/app.cpp @@ -0,0 +1,790 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/app.h" + +#include +#include +#include + +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/cpdfsdk_interform.h" +#include "fpdfsdk/javascript/Document.h" +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_EventHandler.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" +#include "fpdfsdk/javascript/cjs_event_context.h" +#include "fpdfsdk/javascript/cjs_runtime.h" +#include "fpdfsdk/javascript/resource.h" +#include "third_party/base/stl_util.h" + +class GlobalTimer { + public: + GlobalTimer(app* pObj, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CJS_Runtime* pRuntime, + int nType, + const CFX_WideString& script, + uint32_t dwElapse, + uint32_t dwTimeOut); + ~GlobalTimer(); + + static void Trigger(int nTimerID); + static void Cancel(int nTimerID); + + bool IsOneShot() const { return m_nType == 1; } + uint32_t GetTimeOut() const { return m_dwTimeOut; } + int GetTimerID() const { return m_nTimerID; } + CJS_Runtime* GetRuntime() const { return m_pRuntime.Get(); } + CFX_WideString GetJScript() const { return m_swJScript; } + + private: + using TimerMap = std::map; + static TimerMap* GetGlobalTimerMap(); + + uint32_t m_nTimerID; + app* const m_pEmbedObj; + bool m_bProcessing; + + // data + const int m_nType; // 0:Interval; 1:TimeOut + const uint32_t m_dwTimeOut; + const CFX_WideString m_swJScript; + CJS_Runtime::ObservedPtr m_pRuntime; + CPDFSDK_FormFillEnvironment::ObservedPtr m_pFormFillEnv; +}; + +GlobalTimer::GlobalTimer(app* pObj, + CPDFSDK_FormFillEnvironment* pFormFillEnv, + CJS_Runtime* pRuntime, + int nType, + const CFX_WideString& script, + uint32_t dwElapse, + uint32_t dwTimeOut) + : m_nTimerID(0), + m_pEmbedObj(pObj), + m_bProcessing(false), + m_nType(nType), + m_dwTimeOut(dwTimeOut), + m_swJScript(script), + m_pRuntime(pRuntime), + m_pFormFillEnv(pFormFillEnv) { + CFX_SystemHandler* pHandler = m_pFormFillEnv->GetSysHandler(); + m_nTimerID = pHandler->SetTimer(dwElapse, Trigger); + if (m_nTimerID) + (*GetGlobalTimerMap())[m_nTimerID] = this; +} + +GlobalTimer::~GlobalTimer() { + if (!m_nTimerID) + return; + + if (GetRuntime()) + m_pFormFillEnv->GetSysHandler()->KillTimer(m_nTimerID); + + GetGlobalTimerMap()->erase(m_nTimerID); +} + +// static +void GlobalTimer::Trigger(int nTimerID) { + auto it = GetGlobalTimerMap()->find(nTimerID); + if (it == GetGlobalTimerMap()->end()) + return; + + GlobalTimer* pTimer = it->second; + if (pTimer->m_bProcessing) + return; + + pTimer->m_bProcessing = true; + if (pTimer->m_pEmbedObj) + pTimer->m_pEmbedObj->TimerProc(pTimer); + + // Timer proc may have destroyed timer, find it again. + it = GetGlobalTimerMap()->find(nTimerID); + if (it == GetGlobalTimerMap()->end()) + return; + + pTimer = it->second; + pTimer->m_bProcessing = false; + if (pTimer->IsOneShot()) + pTimer->m_pEmbedObj->CancelProc(pTimer); +} + +// static +void GlobalTimer::Cancel(int nTimerID) { + auto it = GetGlobalTimerMap()->find(nTimerID); + if (it == GetGlobalTimerMap()->end()) + return; + + GlobalTimer* pTimer = it->second; + pTimer->m_pEmbedObj->CancelProc(pTimer); +} + +// static +GlobalTimer::TimerMap* GlobalTimer::GetGlobalTimerMap() { + // Leak the timer array at shutdown. + static auto* s_TimerMap = new TimerMap; + return s_TimerMap; +} + +JSConstSpec CJS_TimerObj::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}}; + +JSPropertySpec CJS_TimerObj::PropertySpecs[] = {{0, 0, 0}}; + +JSMethodSpec CJS_TimerObj::MethodSpecs[] = {{0, 0}}; + +IMPLEMENT_JS_CLASS(CJS_TimerObj, TimerObj) + +TimerObj::TimerObj(CJS_Object* pJSObject) + : CJS_EmbedObj(pJSObject), m_nTimerID(0) {} + +TimerObj::~TimerObj() {} + +void TimerObj::SetTimer(GlobalTimer* pTimer) { + m_nTimerID = pTimer->GetTimerID(); +} + +#define JS_STR_VIEWERTYPE L"pdfium" +#define JS_STR_VIEWERVARIATION L"Full" +#define JS_STR_PLATFORM L"WIN" +#define JS_STR_LANGUAGE L"ENU" +#define JS_NUM_VIEWERVERSION 8 +#ifdef PDF_ENABLE_XFA +#define JS_NUM_VIEWERVERSION_XFA 11 +#endif // PDF_ENABLE_XFA +#define JS_NUM_FORMSVERSION 7 + +JSConstSpec CJS_App::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}}; + +JSPropertySpec CJS_App::PropertySpecs[] = { + {"activeDocs", get_activeDocs_static, set_activeDocs_static}, + {"calculate", get_calculate_static, set_calculate_static}, + {"formsVersion", get_formsVersion_static, set_formsVersion_static}, + {"fs", get_fs_static, set_fs_static}, + {"fullscreen", get_fullscreen_static, set_fullscreen_static}, + {"language", get_language_static, set_language_static}, + {"media", get_media_static, set_media_static}, + {"platform", get_platform_static, set_platform_static}, + {"runtimeHighlight", get_runtimeHighlight_static, + set_runtimeHighlight_static}, + {"viewerType", get_viewerType_static, set_viewerType_static}, + {"viewerVariation", get_viewerVariation_static, set_viewerVariation_static}, + {"viewerVersion", get_viewerVersion_static, set_viewerVersion_static}, + {0, 0, 0}}; + +JSMethodSpec CJS_App::MethodSpecs[] = {{"alert", alert_static}, + {"beep", beep_static}, + {"browseForDoc", browseForDoc_static}, + {"clearInterval", clearInterval_static}, + {"clearTimeOut", clearTimeOut_static}, + {"execDialog", execDialog_static}, + {"execMenuItem", execMenuItem_static}, + {"findComponent", findComponent_static}, + {"goBack", goBack_static}, + {"goForward", goForward_static}, + {"launchURL", launchURL_static}, + {"mailMsg", mailMsg_static}, + {"newFDF", newFDF_static}, + {"newDoc", newDoc_static}, + {"openDoc", openDoc_static}, + {"openFDF", openFDF_static}, + {"popUpMenuEx", popUpMenuEx_static}, + {"popUpMenu", popUpMenu_static}, + {"response", response_static}, + {"setInterval", setInterval_static}, + {"setTimeOut", setTimeOut_static}, + {0, 0}}; + +IMPLEMENT_JS_CLASS(CJS_App, app) + +app::app(CJS_Object* pJSObject) + : CJS_EmbedObj(pJSObject), m_bCalculate(true), m_bRuntimeHighLight(false) {} + +app::~app() { +} + +bool app::activeDocs(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + CJS_Document* pJSDocument = nullptr; + v8::Local pObj = pRuntime->GetThisObj(); + if (CFXJS_Engine::GetObjDefnID(pObj) == CJS_Document::g_nObjDefnID) + pJSDocument = static_cast(pRuntime->GetObjectPrivate(pObj)); + + CJS_Array aDocs; + aDocs.SetElement(pRuntime, 0, CJS_Value(pRuntime, pJSDocument)); + if (aDocs.GetLength(pRuntime) > 0) + vp << aDocs; + else + vp.GetJSValue()->SetNull(pRuntime); + + return true; +} + +bool app::calculate(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + bool bVP; + vp >> bVP; + m_bCalculate = (bool)bVP; + pRuntime->GetFormFillEnv()->GetInterForm()->EnableCalculate( + (bool)m_bCalculate); + } else { + vp << (bool)m_bCalculate; + } + return true; +} + +bool app::formsVersion(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsGetting()) { + vp << JS_NUM_FORMSVERSION; + return true; + } + + return false; +} + +bool app::viewerType(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsGetting()) { + vp << JS_STR_VIEWERTYPE; + return true; + } + + return false; +} + +bool app::viewerVariation(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsGetting()) { + vp << JS_STR_VIEWERVARIATION; + return true; + } + + return false; +} + +bool app::viewerVersion(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; +#ifdef PDF_ENABLE_XFA + CPDFXFA_Context* pXFAContext = pRuntime->GetFormFillEnv()->GetXFAContext(); + if (pXFAContext->GetDocType() == 1 || pXFAContext->GetDocType() == 2) { + vp << JS_NUM_VIEWERVERSION_XFA; + return true; + } +#endif // PDF_ENABLE_XFA + vp << JS_NUM_VIEWERVERSION; + return true; +} + +bool app::platform(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; +#ifdef PDF_ENABLE_XFA + CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv(); + if (!pFormFillEnv) + return false; + CFX_WideString platfrom = pFormFillEnv->GetPlatform(); + if (!platfrom.IsEmpty()) { + vp << platfrom; + return true; + } +#endif + vp << JS_STR_PLATFORM; + return true; +} + +bool app::language(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; +#ifdef PDF_ENABLE_XFA + CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv(); + if (!pFormFillEnv) + return false; + CFX_WideString language = pFormFillEnv->GetLanguage(); + if (!language.IsEmpty()) { + vp << language; + return true; + } +#endif + vp << JS_STR_LANGUAGE; + return true; +} + +// creates a new fdf object that contains no data +// comment: need reader support +// note: +// CFDF_Document * CPDFSDK_FormFillEnvironment::NewFDF(); +bool app::newFDF(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} +// opens a specified pdf document and returns its document object +// comment:need reader support +// note: as defined in js reference, the proto of this function's fourth +// parmeters, how old an fdf document while do not show it. +// CFDF_Document * CPDFSDK_FormFillEnvironment::OpenFDF(string strPath,bool +// bUserConv); + +bool app::openFDF(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool app::alert(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + std::vector newParams = JS_ExpandKeywordParams( + pRuntime, params, 4, L"cMsg", L"nIcon", L"nType", L"cTitle"); + + if (newParams[0].GetType() == CJS_Value::VT_unknown) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv(); + if (!pFormFillEnv) { + vRet = CJS_Value(pRuntime, 0); + return true; + } + + CFX_WideString swMsg; + if (newParams[0].GetType() == CJS_Value::VT_object) { + CJS_Array carray; + if (newParams[0].ConvertToArray(pRuntime, carray)) { + swMsg = L"["; + CJS_Value element(pRuntime); + for (int i = 0; i < carray.GetLength(pRuntime); ++i) { + if (i) + swMsg += L", "; + carray.GetElement(pRuntime, i, element); + swMsg += element.ToCFXWideString(pRuntime); + } + swMsg += L"]"; + } else { + swMsg = newParams[0].ToCFXWideString(pRuntime); + } + } else { + swMsg = newParams[0].ToCFXWideString(pRuntime); + } + + int iIcon = 0; + if (newParams[1].GetType() != CJS_Value::VT_unknown) + iIcon = newParams[1].ToInt(pRuntime); + + int iType = 0; + if (newParams[2].GetType() != CJS_Value::VT_unknown) + iType = newParams[2].ToInt(pRuntime); + + CFX_WideString swTitle; + if (newParams[3].GetType() != CJS_Value::VT_unknown) + swTitle = newParams[3].ToCFXWideString(pRuntime); + else + swTitle = JSGetStringFromID(IDS_STRING_JSALERT); + + pRuntime->BeginBlock(); + pFormFillEnv->KillFocusAnnot(0); + + vRet = CJS_Value(pRuntime, pFormFillEnv->JS_appAlert( + swMsg.c_str(), swTitle.c_str(), iType, iIcon)); + pRuntime->EndBlock(); + return true; +} + +bool app::beep(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() == 1) { + pRuntime->GetFormFillEnv()->JS_appBeep(params[0].ToInt(pRuntime)); + return true; + } + + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; +} + +bool app::findComponent(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool app::popUpMenuEx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool app::fs(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError) { + return false; +} + +bool app::setInterval(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() > 2 || params.size() == 0) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CFX_WideString script = + params.size() > 0 ? params[0].ToCFXWideString(pRuntime) : L""; + if (script.IsEmpty()) { + sError = JSGetStringFromID(IDS_STRING_JSAFNUMBER_KEYSTROKE); + return true; + } + + uint32_t dwInterval = params.size() > 1 ? params[1].ToInt(pRuntime) : 1000; + + GlobalTimer* timerRef = new GlobalTimer(this, pRuntime->GetFormFillEnv(), + pRuntime, 0, script, dwInterval, 0); + m_Timers.insert(std::unique_ptr(timerRef)); + + v8::Local pRetObj = + pRuntime->NewFxDynamicObj(CJS_TimerObj::g_nObjDefnID); + if (pRetObj.IsEmpty()) + return false; + + CJS_TimerObj* pJS_TimerObj = + static_cast(pRuntime->GetObjectPrivate(pRetObj)); + TimerObj* pTimerObj = static_cast(pJS_TimerObj->GetEmbedObject()); + pTimerObj->SetTimer(timerRef); + + vRet = CJS_Value(pRuntime, pRetObj); + return true; +} + +bool app::setTimeOut(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() > 2 || params.size() == 0) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + CFX_WideString script = params[0].ToCFXWideString(pRuntime); + if (script.IsEmpty()) { + sError = JSGetStringFromID(IDS_STRING_JSAFNUMBER_KEYSTROKE); + return true; + } + + uint32_t dwTimeOut = params.size() > 1 ? params[1].ToInt(pRuntime) : 1000; + GlobalTimer* timerRef = + new GlobalTimer(this, pRuntime->GetFormFillEnv(), pRuntime, 1, script, + dwTimeOut, dwTimeOut); + m_Timers.insert(std::unique_ptr(timerRef)); + + v8::Local pRetObj = + pRuntime->NewFxDynamicObj(CJS_TimerObj::g_nObjDefnID); + if (pRetObj.IsEmpty()) + return false; + + CJS_TimerObj* pJS_TimerObj = + static_cast(pRuntime->GetObjectPrivate(pRetObj)); + TimerObj* pTimerObj = static_cast(pJS_TimerObj->GetEmbedObject()); + pTimerObj->SetTimer(timerRef); + vRet = CJS_Value(pRuntime, pRetObj); + return true; +} + +bool app::clearTimeOut(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + app::ClearTimerCommon(pRuntime, params[0]); + return true; +} + +bool app::clearInterval(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + app::ClearTimerCommon(pRuntime, params[0]); + return true; +} + +void app::ClearTimerCommon(CJS_Runtime* pRuntime, const CJS_Value& param) { + if (param.GetType() != CJS_Value::VT_object) + return; + + v8::Local pObj = param.ToV8Object(pRuntime); + if (CFXJS_Engine::GetObjDefnID(pObj) != CJS_TimerObj::g_nObjDefnID) + return; + + CJS_Object* pJSObj = param.ToCJSObject(pRuntime); + if (!pJSObj) + return; + + TimerObj* pTimerObj = static_cast(pJSObj->GetEmbedObject()); + if (!pTimerObj) + return; + + GlobalTimer::Cancel(pTimerObj->GetTimerID()); +} + +bool app::execMenuItem(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +void app::TimerProc(GlobalTimer* pTimer) { + CJS_Runtime* pRuntime = pTimer->GetRuntime(); + if (pRuntime && (!pTimer->IsOneShot() || pTimer->GetTimeOut() > 0)) + RunJsScript(pRuntime, pTimer->GetJScript()); +} + +void app::CancelProc(GlobalTimer* pTimer) { + m_Timers.erase(pdfium::FakeUniquePtr(pTimer)); +} + +void app::RunJsScript(CJS_Runtime* pRuntime, const CFX_WideString& wsScript) { + if (!pRuntime->IsBlocking()) { + IJS_EventContext* pContext = pRuntime->NewEventContext(); + pContext->OnExternal_Exec(); + CFX_WideString wtInfo; + pContext->RunScript(wsScript, &wtInfo); + pRuntime->ReleaseEventContext(pContext); + } +} + +bool app::goBack(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Not supported. + return true; +} + +bool app::goForward(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Not supported. + return true; +} + +bool app::mailMsg(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + std::vector newParams = + JS_ExpandKeywordParams(pRuntime, params, 6, L"bUI", L"cTo", L"cCc", + L"cBcc", L"cSubject", L"cMsg"); + + if (newParams[0].GetType() == CJS_Value::VT_unknown) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + bool bUI = newParams[0].ToBool(pRuntime); + + CFX_WideString cTo; + if (newParams[1].GetType() != CJS_Value::VT_unknown) { + cTo = newParams[1].ToCFXWideString(pRuntime); + } else { + if (!bUI) { + // cTo parameter required when UI not invoked. + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + } + + CFX_WideString cCc; + if (newParams[2].GetType() != CJS_Value::VT_unknown) + cCc = newParams[2].ToCFXWideString(pRuntime); + + CFX_WideString cBcc; + if (newParams[3].GetType() != CJS_Value::VT_unknown) + cBcc = newParams[3].ToCFXWideString(pRuntime); + + CFX_WideString cSubject; + if (newParams[4].GetType() != CJS_Value::VT_unknown) + cSubject = newParams[4].ToCFXWideString(pRuntime); + + CFX_WideString cMsg; + if (newParams[5].GetType() != CJS_Value::VT_unknown) + cMsg = newParams[5].ToCFXWideString(pRuntime); + + pRuntime->BeginBlock(); + pRuntime->GetFormFillEnv()->JS_docmailForm(nullptr, 0, bUI, cTo.c_str(), + cSubject.c_str(), cCc.c_str(), + cBcc.c_str(), cMsg.c_str()); + pRuntime->EndBlock(); + return true; +} + +bool app::launchURL(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +bool app::runtimeHighlight(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + vp >> m_bRuntimeHighLight; + } else { + vp << m_bRuntimeHighLight; + } + return true; +} + +bool app::fullscreen(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return false; +} + +bool app::popUpMenu(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool app::browseForDoc(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +CFX_WideString app::SysPathToPDFPath(const CFX_WideString& sOldPath) { + CFX_WideString sRet = L"/"; + + for (int i = 0, sz = sOldPath.GetLength(); i < sz; i++) { + wchar_t c = sOldPath.GetAt(i); + if (c == L':') { + } else { + if (c == L'\\') { + sRet += L"/"; + } else { + sRet += c; + } + } + } + + return sRet; +} + +bool app::newDoc(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool app::openDoc(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return false; +} + +bool app::response(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + std::vector newParams = + JS_ExpandKeywordParams(pRuntime, params, 5, L"cQuestion", L"cTitle", + L"cDefault", L"bPassword", L"cLabel"); + + if (newParams[0].GetType() == CJS_Value::VT_unknown) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + CFX_WideString swQuestion = newParams[0].ToCFXWideString(pRuntime); + + CFX_WideString swTitle = L"PDF"; + if (newParams[1].GetType() != CJS_Value::VT_unknown) + swTitle = newParams[1].ToCFXWideString(pRuntime); + + CFX_WideString swDefault; + if (newParams[2].GetType() != CJS_Value::VT_unknown) + swDefault = newParams[2].ToCFXWideString(pRuntime); + + bool bPassword = false; + if (newParams[3].GetType() != CJS_Value::VT_unknown) + bPassword = newParams[3].ToBool(pRuntime); + + CFX_WideString swLabel; + if (newParams[4].GetType() != CJS_Value::VT_unknown) + swLabel = newParams[4].ToCFXWideString(pRuntime); + + const int MAX_INPUT_BYTES = 2048; + std::unique_ptr pBuff(new char[MAX_INPUT_BYTES + 2]); + memset(pBuff.get(), 0, MAX_INPUT_BYTES + 2); + + int nLengthBytes = pRuntime->GetFormFillEnv()->JS_appResponse( + swQuestion.c_str(), swTitle.c_str(), swDefault.c_str(), swLabel.c_str(), + bPassword, pBuff.get(), MAX_INPUT_BYTES); + + if (nLengthBytes < 0 || nLengthBytes > MAX_INPUT_BYTES) { + sError = JSGetStringFromID(IDS_STRING_JSPARAM_TOOLONG); + return false; + } + + vRet = CJS_Value(pRuntime, CFX_WideString::FromUTF16LE( + reinterpret_cast(pBuff.get()), + nLengthBytes / sizeof(uint16_t)) + .c_str()); + + return true; +} + +bool app::media(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return false; +} + +bool app::execDialog(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/app.h b/modules/pdfium/pdfium/fpdfsdk/javascript/app.h new file mode 100644 index 000000000000..9e11b8241982 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/app.h @@ -0,0 +1,221 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_APP_H_ +#define FPDFSDK_JAVASCRIPT_APP_H_ + +#include +#include +#include + +#include "fpdfsdk/javascript/JS_Define.h" + +class CJS_Runtime; +class GlobalTimer; + +class TimerObj : public CJS_EmbedObj { + public: + explicit TimerObj(CJS_Object* pJSObject); + ~TimerObj() override; + + void SetTimer(GlobalTimer* pTimer); + int GetTimerID() const { return m_nTimerID; } + + private: + int m_nTimerID; // Weak reference to GlobalTimer through global map. +}; + +class CJS_TimerObj : public CJS_Object { + public: + explicit CJS_TimerObj(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_TimerObj() override {} + + DECLARE_JS_CLASS(); +}; + +class app : public CJS_EmbedObj { + public: + explicit app(CJS_Object* pJSObject); + ~app() override; + + bool activeDocs(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool calculate(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool formsVersion(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool fs(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool fullscreen(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool language(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool media(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool platform(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool runtimeHighlight(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool viewerType(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool viewerVariation(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool viewerVersion(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + + bool alert(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool beep(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool browseForDoc(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool clearInterval(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool clearTimeOut(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool execDialog(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool execMenuItem(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool findComponent(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool goBack(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool goForward(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool launchURL(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool mailMsg(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool newFDF(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool newDoc(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool openDoc(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool openFDF(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool popUpMenuEx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool popUpMenu(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool response(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool setInterval(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool setTimeOut(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + + void TimerProc(GlobalTimer* pTimer); + void CancelProc(GlobalTimer* pTimer); + + static CFX_WideString SysPathToPDFPath(const CFX_WideString& sOldPath); + + private: + // CJS_EmbedObj + void RunJsScript(CJS_Runtime* pRuntime, const CFX_WideString& wsScript); + + void ClearTimerCommon(CJS_Runtime* pRuntime, const CJS_Value& param); + + bool m_bCalculate; + bool m_bRuntimeHighLight; + std::unordered_set> m_Timers; +}; + +class CJS_App : public CJS_Object { + public: + explicit CJS_App(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_App() override {} + + DECLARE_JS_CLASS(); + + JS_STATIC_PROP(activeDocs, app); + JS_STATIC_PROP(calculate, app); + JS_STATIC_PROP(formsVersion, app); + JS_STATIC_PROP(fs, app); + JS_STATIC_PROP(fullscreen, app); + JS_STATIC_PROP(language, app); + JS_STATIC_PROP(media, app); + JS_STATIC_PROP(platform, app); + JS_STATIC_PROP(runtimeHighlight, app); + JS_STATIC_PROP(viewerType, app); + JS_STATIC_PROP(viewerVariation, app); + JS_STATIC_PROP(viewerVersion, app); + + JS_STATIC_METHOD(alert, app); + JS_STATIC_METHOD(beep, app); + JS_STATIC_METHOD(browseForDoc, app); + JS_STATIC_METHOD(clearInterval, app); + JS_STATIC_METHOD(clearTimeOut, app); + JS_STATIC_METHOD(execDialog, app); + JS_STATIC_METHOD(execMenuItem, app); + JS_STATIC_METHOD(findComponent, app); + JS_STATIC_METHOD(goBack, app); + JS_STATIC_METHOD(goForward, app); + JS_STATIC_METHOD(launchURL, app); + JS_STATIC_METHOD(mailMsg, app); + JS_STATIC_METHOD(newFDF, app); + JS_STATIC_METHOD(newDoc, app); + JS_STATIC_METHOD(openDoc, app); + JS_STATIC_METHOD(openFDF, app); + JS_STATIC_METHOD(popUpMenuEx, app); + JS_STATIC_METHOD(popUpMenu, app); + JS_STATIC_METHOD(response, app); + JS_STATIC_METHOD(setInterval, app); + JS_STATIC_METHOD(setTimeOut, app); +}; + +#endif // FPDFSDK_JAVASCRIPT_APP_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/cjs_event_context.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/cjs_event_context.cpp new file mode 100644 index 000000000000..abfb6da36fac --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/cjs_event_context.cpp @@ -0,0 +1,280 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/cjs_event_context.h" + +#include "fpdfsdk/javascript/JS_EventHandler.h" +#include "fpdfsdk/javascript/cjs_runtime.h" +#include "fpdfsdk/javascript/resource.h" + +CJS_EventContext::CJS_EventContext(CJS_Runtime* pRuntime) + : m_pRuntime(pRuntime), + m_pEventHandler(new CJS_EventHandler(this)), + m_bBusy(false) { + ASSERT(pRuntime); +} + +CJS_EventContext::~CJS_EventContext() {} + +CPDFSDK_FormFillEnvironment* CJS_EventContext::GetFormFillEnv() { + return m_pRuntime->GetFormFillEnv(); +} + +bool CJS_EventContext::RunScript(const CFX_WideString& script, + CFX_WideString* info) { + v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate()); + v8::HandleScope handle_scope(m_pRuntime->GetIsolate()); + v8::Local context = m_pRuntime->NewLocalContext(); + v8::Context::Scope context_scope(context); + + if (m_bBusy) { + *info = JSGetStringFromID(IDS_STRING_JSBUSY); + return false; + } + + CFX_AutoRestorer restorer(&m_bBusy); + m_bBusy = true; + + ASSERT(m_pEventHandler->IsValid()); + CJS_Runtime::FieldEvent event(m_pEventHandler->TargetName(), + m_pEventHandler->EventType()); + if (!m_pRuntime->AddEventToSet(event)) { + *info = JSGetStringFromID(IDS_STRING_JSEVENT); + return false; + } + + CFX_WideString sErrorMessage; + int nRet = 0; + if (script.GetLength() > 0) + nRet = m_pRuntime->ExecuteScript(script.c_str(), &sErrorMessage); + + if (nRet < 0) + *info += sErrorMessage; + else + *info = JSGetStringFromID(IDS_STRING_RUN); + + m_pRuntime->RemoveEventFromSet(event); + m_pEventHandler->Destroy(); + return nRet >= 0; +} + +void CJS_EventContext::OnApp_Init() { + m_pEventHandler->OnApp_Init(); +} + +void CJS_EventContext::OnDoc_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& strTargetName) { + m_pEventHandler->OnDoc_Open(pFormFillEnv, strTargetName); +} + +void CJS_EventContext::OnDoc_WillPrint( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + m_pEventHandler->OnDoc_WillPrint(pFormFillEnv); +} + +void CJS_EventContext::OnDoc_DidPrint( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + m_pEventHandler->OnDoc_DidPrint(pFormFillEnv); +} + +void CJS_EventContext::OnDoc_WillSave( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + m_pEventHandler->OnDoc_WillSave(pFormFillEnv); +} + +void CJS_EventContext::OnDoc_DidSave( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + m_pEventHandler->OnDoc_DidSave(pFormFillEnv); +} + +void CJS_EventContext::OnDoc_WillClose( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + m_pEventHandler->OnDoc_WillClose(pFormFillEnv); +} + +void CJS_EventContext::OnPage_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv) { + m_pEventHandler->OnPage_Open(pFormFillEnv); +} + +void CJS_EventContext::OnPage_Close(CPDFSDK_FormFillEnvironment* pFormFillEnv) { + m_pEventHandler->OnPage_Close(pFormFillEnv); +} + +void CJS_EventContext::OnPage_InView( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + m_pEventHandler->OnPage_InView(pFormFillEnv); +} + +void CJS_EventContext::OnPage_OutView( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + m_pEventHandler->OnPage_OutView(pFormFillEnv); +} + +void CJS_EventContext::OnField_MouseDown(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) { + m_pEventHandler->OnField_MouseDown(bModifier, bShift, pTarget); +} + +void CJS_EventContext::OnField_MouseEnter(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) { + m_pEventHandler->OnField_MouseEnter(bModifier, bShift, pTarget); +} + +void CJS_EventContext::OnField_MouseExit(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) { + m_pEventHandler->OnField_MouseExit(bModifier, bShift, pTarget); +} + +void CJS_EventContext::OnField_MouseUp(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) { + m_pEventHandler->OnField_MouseUp(bModifier, bShift, pTarget); +} + +void CJS_EventContext::OnField_Focus(bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + const CFX_WideString& Value) { + m_pEventHandler->OnField_Focus(bModifier, bShift, pTarget, Value); +} + +void CJS_EventContext::OnField_Blur(bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + const CFX_WideString& Value) { + m_pEventHandler->OnField_Blur(bModifier, bShift, pTarget, Value); +} + +void CJS_EventContext::OnField_Calculate(CPDF_FormField* pSource, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool& bRc) { + m_pEventHandler->OnField_Calculate(pSource, pTarget, Value, bRc); +} + +void CJS_EventContext::OnField_Format(CPDF_FormField* pTarget, + CFX_WideString& Value, + bool bWillCommit) { + m_pEventHandler->OnField_Format(pTarget, Value, bWillCommit); +} + +void CJS_EventContext::OnField_Keystroke(CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + bool bKeyDown, + bool bModifier, + int& nSelEnd, + int& nSelStart, + bool bShift, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool bWillCommit, + bool bFieldFull, + bool& bRc) { + m_pEventHandler->OnField_Keystroke( + strChange, strChangeEx, bKeyDown, bModifier, nSelEnd, nSelStart, bShift, + pTarget, Value, bWillCommit, bFieldFull, bRc); +} + +void CJS_EventContext::OnField_Validate(CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + bool bKeyDown, + bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool& bRc) { + m_pEventHandler->OnField_Validate(strChange, strChangeEx, bKeyDown, bModifier, + bShift, pTarget, Value, bRc); +} + +void CJS_EventContext::OnScreen_Focus(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + m_pEventHandler->OnScreen_Focus(bModifier, bShift, pScreen); +} + +void CJS_EventContext::OnScreen_Blur(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + m_pEventHandler->OnScreen_Blur(bModifier, bShift, pScreen); +} + +void CJS_EventContext::OnScreen_Open(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + m_pEventHandler->OnScreen_Open(bModifier, bShift, pScreen); +} + +void CJS_EventContext::OnScreen_Close(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + m_pEventHandler->OnScreen_Close(bModifier, bShift, pScreen); +} + +void CJS_EventContext::OnScreen_MouseDown(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + m_pEventHandler->OnScreen_MouseDown(bModifier, bShift, pScreen); +} + +void CJS_EventContext::OnScreen_MouseUp(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + m_pEventHandler->OnScreen_MouseUp(bModifier, bShift, pScreen); +} + +void CJS_EventContext::OnScreen_MouseEnter(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + m_pEventHandler->OnScreen_MouseEnter(bModifier, bShift, pScreen); +} + +void CJS_EventContext::OnScreen_MouseExit(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + m_pEventHandler->OnScreen_MouseExit(bModifier, bShift, pScreen); +} + +void CJS_EventContext::OnScreen_InView(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + m_pEventHandler->OnScreen_InView(bModifier, bShift, pScreen); +} + +void CJS_EventContext::OnScreen_OutView(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) { + m_pEventHandler->OnScreen_OutView(bModifier, bShift, pScreen); +} + +void CJS_EventContext::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) { + m_pEventHandler->OnBookmark_MouseUp(pBookMark); +} + +void CJS_EventContext::OnLink_MouseUp( + CPDFSDK_FormFillEnvironment* pFormFillEnv) { + m_pEventHandler->OnLink_MouseUp(pFormFillEnv); +} + +void CJS_EventContext::OnConsole_Exec() { + m_pEventHandler->OnConsole_Exec(); +} + +void CJS_EventContext::OnExternal_Exec() { + m_pEventHandler->OnExternal_Exec(); +} + +void CJS_EventContext::OnBatchExec(CPDFSDK_FormFillEnvironment* pFormFillEnv) { + m_pEventHandler->OnBatchExec(pFormFillEnv); +} + +void CJS_EventContext::OnMenu_Exec(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& strTargetName) { + m_pEventHandler->OnMenu_Exec(pFormFillEnv, strTargetName); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/cjs_event_context.h b/modules/pdfium/pdfium/fpdfsdk/javascript/cjs_event_context.h new file mode 100644 index 000000000000..7bfe52816d9c --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/cjs_event_context.h @@ -0,0 +1,135 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_CJS_EVENT_CONTEXT_H_ +#define FPDFSDK_JAVASCRIPT_CJS_EVENT_CONTEXT_H_ + +#include + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" +#include "fpdfsdk/javascript/ijs_event_context.h" + +class CJS_EventHandler; +class CJS_Runtime; +class CPDFSDK_FormFillEnvironment; + +class CJS_EventContext : public IJS_EventContext { + public: + explicit CJS_EventContext(CJS_Runtime* pRuntime); + ~CJS_EventContext() override; + + // IJS_EventContext + bool RunScript(const CFX_WideString& script, CFX_WideString* info) override; + void OnApp_Init() override; + void OnDoc_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& strTargetName) override; + void OnDoc_WillPrint(CPDFSDK_FormFillEnvironment* pFormFillEnv) override; + void OnDoc_DidPrint(CPDFSDK_FormFillEnvironment* pFormFillEnv) override; + void OnDoc_WillSave(CPDFSDK_FormFillEnvironment* pFormFillEnv) override; + void OnDoc_DidSave(CPDFSDK_FormFillEnvironment* pFormFillEnv) override; + void OnDoc_WillClose(CPDFSDK_FormFillEnvironment* pFormFillEnv) override; + void OnPage_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv) override; + void OnPage_Close(CPDFSDK_FormFillEnvironment* pFormFillEnv) override; + void OnPage_InView(CPDFSDK_FormFillEnvironment* pFormFillEnv) override; + void OnPage_OutView(CPDFSDK_FormFillEnvironment* pFormFillEnv) override; + void OnField_MouseDown(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) override; + void OnField_MouseEnter(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) override; + void OnField_MouseExit(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) override; + void OnField_MouseUp(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) override; + void OnField_Focus(bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + const CFX_WideString& Value) override; + void OnField_Blur(bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + const CFX_WideString& Value) override; + void OnField_Calculate(CPDF_FormField* pSource, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool& bRc) override; + void OnField_Format(CPDF_FormField* pTarget, + CFX_WideString& Value, + bool bWillCommit) override; + void OnField_Keystroke(CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + bool bKeyDown, + bool bModifier, + int& nSelEnd, + int& nSelStart, + bool bShift, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool bWillCommit, + bool bFieldFull, + bool& bRc) override; + void OnField_Validate(CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + bool bKeyDown, + bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool& bRc) override; + void OnScreen_Focus(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override; + void OnScreen_Blur(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override; + void OnScreen_Open(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override; + void OnScreen_Close(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override; + void OnScreen_MouseDown(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override; + void OnScreen_MouseUp(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override; + void OnScreen_MouseEnter(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override; + void OnScreen_MouseExit(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override; + void OnScreen_InView(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override; + void OnScreen_OutView(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) override; + void OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) override; + void OnLink_MouseUp(CPDFSDK_FormFillEnvironment* pFormFillEnv) override; + void OnMenu_Exec(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& strTargetName) override; + void OnBatchExec(CPDFSDK_FormFillEnvironment* pFormFillEnv) override; + void OnConsole_Exec() override; + void OnExternal_Exec() override; + + CJS_Runtime* GetJSRuntime() const { return m_pRuntime; } + CJS_EventHandler* GetEventHandler() const { return m_pEventHandler.get(); } + + CPDFSDK_FormFillEnvironment* GetFormFillEnv(); + + private: + CJS_Runtime* const m_pRuntime; + std::unique_ptr m_pEventHandler; + bool m_bBusy; +}; + +#endif // FPDFSDK_JAVASCRIPT_CJS_EVENT_CONTEXT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/cjs_runtime.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/cjs_runtime.cpp new file mode 100644 index 000000000000..1ece0b6f79da --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/cjs_runtime.cpp @@ -0,0 +1,263 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/cjs_runtime.h" + +#include + +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/javascript/Annot.h" +#include "fpdfsdk/javascript/Consts.h" +#include "fpdfsdk/javascript/Document.h" +#include "fpdfsdk/javascript/Field.h" +#include "fpdfsdk/javascript/Icon.h" +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_EventHandler.h" +#include "fpdfsdk/javascript/JS_GlobalData.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" +#include "fpdfsdk/javascript/PublicMethods.h" +#include "fpdfsdk/javascript/app.h" +#include "fpdfsdk/javascript/cjs_event_context.h" +#include "fpdfsdk/javascript/color.h" +#include "fpdfsdk/javascript/console.h" +#include "fpdfsdk/javascript/event.h" +#include "fpdfsdk/javascript/global.h" +#include "fpdfsdk/javascript/report.h" +#include "fpdfsdk/javascript/util.h" +#include "public/fpdf_formfill.h" +#include "third_party/base/stl_util.h" + +#ifdef PDF_ENABLE_XFA +#include "fxjs/cfxjse_value.h" +#endif // PDF_ENABLE_XFA + +// static +void IJS_Runtime::Initialize(unsigned int slot, void* isolate) { + FXJS_Initialize(slot, reinterpret_cast(isolate)); +} + +// static +void IJS_Runtime::Destroy() { + FXJS_Release(); +} + +// static +IJS_Runtime* IJS_Runtime::Create(CPDFSDK_FormFillEnvironment* pFormFillEnv) { + return new CJS_Runtime(pFormFillEnv); +} + +// static +CJS_Runtime* CJS_Runtime::CurrentRuntimeFromIsolate(v8::Isolate* pIsolate) { + return static_cast( + CFXJS_Engine::CurrentEngineFromIsolate(pIsolate)); +} + +CJS_Runtime::CJS_Runtime(CPDFSDK_FormFillEnvironment* pFormFillEnv) + : m_pFormFillEnv(pFormFillEnv), + m_bBlocking(false), + m_isolateManaged(false) { + v8::Isolate* pIsolate = nullptr; + + IPDF_JSPLATFORM* pPlatform = m_pFormFillEnv->GetFormFillInfo()->m_pJsPlatform; + if (pPlatform->version <= 2) { + unsigned int embedderDataSlot = 0; + v8::Isolate* pExternalIsolate = nullptr; + if (pPlatform->version == 2) { + pExternalIsolate = reinterpret_cast(pPlatform->m_isolate); + embedderDataSlot = pPlatform->m_v8EmbedderSlot; + } + FXJS_Initialize(embedderDataSlot, pExternalIsolate); + } + m_isolateManaged = FXJS_GetIsolate(&pIsolate); + SetIsolate(pIsolate); + +#ifdef PDF_ENABLE_XFA + v8::Isolate::Scope isolate_scope(pIsolate); + v8::HandleScope handle_scope(pIsolate); +#endif + + if (m_isolateManaged || FXJS_GlobalIsolateRefCount() == 0) + DefineJSObjects(); + + IJS_EventContext* pContext = NewEventContext(); + InitializeEngine(); + ReleaseEventContext(pContext); + SetFormFillEnvToDocument(); +} + +CJS_Runtime::~CJS_Runtime() { + NotifyObservedPtrs(); + ReleaseEngine(); + if (m_isolateManaged) { + GetIsolate()->Dispose(); + SetIsolate(nullptr); + } +} + +void CJS_Runtime::DefineJSObjects() { + v8::Isolate::Scope isolate_scope(GetIsolate()); + v8::HandleScope handle_scope(GetIsolate()); + v8::Local context = v8::Context::New(GetIsolate()); + v8::Context::Scope context_scope(context); + + // The call order determines the "ObjDefID" assigned to each class. + // ObjDefIDs 0 - 2 + CJS_Border::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + CJS_Display::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + CJS_Font::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + + // ObjDefIDs 3 - 5 + CJS_Highlight::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + CJS_Position::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + CJS_ScaleHow::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + + // ObjDefIDs 6 - 8 + CJS_ScaleWhen::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + CJS_Style::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + CJS_Zoomtype::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + + // ObjDefIDs 9 - 11 + CJS_App::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + CJS_Color::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + CJS_Console::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + + // ObjDefIDs 12 - 14 + CJS_Document::DefineJSObjects(this, FXJSOBJTYPE_GLOBAL); + CJS_Event::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + CJS_Field::DefineJSObjects(this, FXJSOBJTYPE_DYNAMIC); + + // ObjDefIDs 15 - 17 + CJS_Global::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + CJS_Icon::DefineJSObjects(this, FXJSOBJTYPE_DYNAMIC); + CJS_Util::DefineJSObjects(this, FXJSOBJTYPE_STATIC); + + // ObjDefIDs 18 - 20 (these can't fail, return void). + CJS_PublicMethods::DefineJSObjects(this); + CJS_GlobalConsts::DefineJSObjects(this); + CJS_GlobalArrays::DefineJSObjects(this); + + // ObjDefIDs 21 - 23. + CJS_TimerObj::DefineJSObjects(this, FXJSOBJTYPE_DYNAMIC); + CJS_PrintParamsObj::DefineJSObjects(this, FXJSOBJTYPE_DYNAMIC); + CJS_Annot::DefineJSObjects(this, FXJSOBJTYPE_DYNAMIC); +} + +IJS_EventContext* CJS_Runtime::NewEventContext() { + m_EventContextArray.push_back( + std::unique_ptr(new CJS_EventContext(this))); + return m_EventContextArray.back().get(); +} + +void CJS_Runtime::ReleaseEventContext(IJS_EventContext* pContext) { + auto it = std::find(m_EventContextArray.begin(), m_EventContextArray.end(), + pdfium::FakeUniquePtr( + static_cast(pContext))); + if (it != m_EventContextArray.end()) + m_EventContextArray.erase(it); +} + +CJS_EventContext* CJS_Runtime::GetCurrentEventContext() const { + return m_EventContextArray.empty() ? nullptr + : m_EventContextArray.back().get(); +} + +void CJS_Runtime::SetFormFillEnvToDocument() { + v8::Isolate::Scope isolate_scope(GetIsolate()); + v8::HandleScope handle_scope(GetIsolate()); + v8::Local context = NewLocalContext(); + v8::Context::Scope context_scope(context); + + v8::Local pThis = GetThisObj(); + if (pThis.IsEmpty()) + return; + + if (CFXJS_Engine::GetObjDefnID(pThis) != CJS_Document::g_nObjDefnID) + return; + + CJS_Document* pJSDocument = + static_cast(GetObjectPrivate(pThis)); + if (!pJSDocument) + return; + + Document* pDocument = static_cast(pJSDocument->GetEmbedObject()); + if (!pDocument) + return; + + pDocument->SetFormFillEnv(m_pFormFillEnv.Get()); +} + +CPDFSDK_FormFillEnvironment* CJS_Runtime::GetFormFillEnv() const { + return m_pFormFillEnv.Get(); +} + +int CJS_Runtime::ExecuteScript(const CFX_WideString& script, + CFX_WideString* info) { + FXJSErr error = {}; + int nRet = Execute(script, &error); + if (nRet < 0) { + info->Format(L"[ Line: %05d { %s } ] : %s", error.linnum - 1, error.srcline, + error.message); + } + return nRet; +} + +bool CJS_Runtime::AddEventToSet(const FieldEvent& event) { + return m_FieldEventSet.insert(event).second; +} + +void CJS_Runtime::RemoveEventFromSet(const FieldEvent& event) { + m_FieldEventSet.erase(event); +} + +#ifdef PDF_ENABLE_XFA +CFX_WideString ChangeObjName(const CFX_WideString& str) { + CFX_WideString sRet = str; + sRet.Replace(L"_", L"."); + return sRet; +} +bool CJS_Runtime::GetValueByName(const CFX_ByteStringC& utf8Name, + CFXJSE_Value* pValue) { + const FX_CHAR* name = utf8Name.c_str(); + + v8::Isolate::Scope isolate_scope(GetIsolate()); + v8::HandleScope handle_scope(GetIsolate()); + v8::Local context = NewLocalContext(); + v8::Context::Scope context_scope(context); + + v8::Local propvalue = + context->Global()->Get(v8::String::NewFromUtf8( + GetIsolate(), name, v8::String::kNormalString, utf8Name.GetLength())); + + if (propvalue.IsEmpty()) { + pValue->SetUndefined(); + return false; + } + pValue->ForceSetValue(propvalue); + return true; +} +bool CJS_Runtime::SetValueByName(const CFX_ByteStringC& utf8Name, + CFXJSE_Value* pValue) { + if (utf8Name.IsEmpty() || !pValue) + return false; + const FX_CHAR* name = utf8Name.c_str(); + v8::Isolate* pIsolate = GetIsolate(); + v8::Isolate::Scope isolate_scope(pIsolate); + v8::HandleScope handle_scope(pIsolate); + v8::Local context = NewLocalContext(); + v8::Context::Scope context_scope(context); + + // v8::Local tmpCotext = + // v8::Local::New(GetIsolate(), m_context); + v8::Local propvalue = + v8::Local::New(GetIsolate(), pValue->DirectGetValue()); + context->Global()->Set( + v8::String::NewFromUtf8(pIsolate, name, v8::String::kNormalString, + utf8Name.GetLength()), + propvalue); + return true; +} +#endif diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/cjs_runtime.h b/modules/pdfium/pdfium/fpdfsdk/javascript/cjs_runtime.h new file mode 100644 index 000000000000..0bde51f9decd --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/cjs_runtime.h @@ -0,0 +1,71 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_CJS_RUNTIME_H_ +#define FPDFSDK_JAVASCRIPT_CJS_RUNTIME_H_ + +#include +#include +#include +#include +#include + +#include "core/fxcrt/cfx_observable.h" +#include "core/fxcrt/fx_basic.h" +#include "fpdfsdk/cpdfsdk_formfillenvironment.h" +#include "fpdfsdk/javascript/JS_EventHandler.h" +#include "fpdfsdk/javascript/ijs_runtime.h" +#include "fxjs/fxjs_v8.h" + +class CJS_EventContext; + +class CJS_Runtime : public IJS_Runtime, + public CFXJS_Engine, + public CFX_Observable { + public: + using FieldEvent = std::pair; + + static CJS_Runtime* CurrentRuntimeFromIsolate(v8::Isolate* pIsolate); + + explicit CJS_Runtime(CPDFSDK_FormFillEnvironment* pFormFillEnv); + ~CJS_Runtime() override; + + // IJS_Runtime + IJS_EventContext* NewEventContext() override; + void ReleaseEventContext(IJS_EventContext* pContext) override; + CPDFSDK_FormFillEnvironment* GetFormFillEnv() const override; + int ExecuteScript(const CFX_WideString& script, + CFX_WideString* info) override; + + CJS_EventContext* GetCurrentEventContext() const; + + // Returns true if the event isn't already found in the set. + bool AddEventToSet(const FieldEvent& event); + void RemoveEventFromSet(const FieldEvent& event); + + void BeginBlock() { m_bBlocking = true; } + void EndBlock() { m_bBlocking = false; } + bool IsBlocking() const { return m_bBlocking; } + +#ifdef PDF_ENABLE_XFA + bool GetValueByName(const CFX_ByteStringC& utf8Name, + CFXJSE_Value* pValue) override; + bool SetValueByName(const CFX_ByteStringC& utf8Name, + CFXJSE_Value* pValue) override; +#endif // PDF_ENABLE_XFA + + private: + void DefineJSObjects(); + void SetFormFillEnvToDocument(); + + std::vector> m_EventContextArray; + CPDFSDK_FormFillEnvironment::ObservedPtr m_pFormFillEnv; + bool m_bBlocking; + bool m_isolateManaged; + std::set m_FieldEventSet; +}; + +#endif // FPDFSDK_JAVASCRIPT_CJS_RUNTIME_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/color.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/color.cpp new file mode 100644 index 000000000000..b5ccbadabf13 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/color.cpp @@ -0,0 +1,279 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/color.h" + +#include + +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_EventHandler.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" +#include "fpdfsdk/javascript/cjs_event_context.h" +#include "fpdfsdk/javascript/cjs_runtime.h" + +JSConstSpec CJS_Color::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}}; + +JSPropertySpec CJS_Color::PropertySpecs[] = { + {"black", get_black_static, set_black_static}, + {"blue", get_blue_static, set_blue_static}, + {"cyan", get_cyan_static, set_cyan_static}, + {"dkGray", get_dkGray_static, set_dkGray_static}, + {"gray", get_gray_static, set_gray_static}, + {"green", get_green_static, set_green_static}, + {"ltGray", get_ltGray_static, set_ltGray_static}, + {"magenta", get_magenta_static, set_magenta_static}, + {"red", get_red_static, set_red_static}, + {"transparent", get_transparent_static, set_transparent_static}, + {"white", get_white_static, set_white_static}, + {"yellow", get_yellow_static, set_yellow_static}, + {0, 0, 0}}; + +JSMethodSpec CJS_Color::MethodSpecs[] = {{"convert", convert_static}, + {"equal", equal_static}, + {0, 0}}; + +IMPLEMENT_JS_CLASS(CJS_Color, color) + +color::color(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) { + m_crTransparent = CPWL_Color(COLORTYPE_TRANSPARENT); + m_crBlack = CPWL_Color(COLORTYPE_GRAY, 0); + m_crWhite = CPWL_Color(COLORTYPE_GRAY, 1); + m_crRed = CPWL_Color(COLORTYPE_RGB, 1, 0, 0); + m_crGreen = CPWL_Color(COLORTYPE_RGB, 0, 1, 0); + m_crBlue = CPWL_Color(COLORTYPE_RGB, 0, 0, 1); + m_crCyan = CPWL_Color(COLORTYPE_CMYK, 1, 0, 0, 0); + m_crMagenta = CPWL_Color(COLORTYPE_CMYK, 0, 1, 0, 0); + m_crYellow = CPWL_Color(COLORTYPE_CMYK, 0, 0, 1, 0); + m_crDKGray = CPWL_Color(COLORTYPE_GRAY, 0.25); + m_crGray = CPWL_Color(COLORTYPE_GRAY, 0.5); + m_crLTGray = CPWL_Color(COLORTYPE_GRAY, 0.75); +} + +color::~color() {} + +void color::ConvertPWLColorToArray(CJS_Runtime* pRuntime, + const CPWL_Color& color, + CJS_Array* array) { + switch (color.nColorType) { + case COLORTYPE_TRANSPARENT: + array->SetElement(pRuntime, 0, CJS_Value(pRuntime, "T")); + break; + case COLORTYPE_GRAY: + array->SetElement(pRuntime, 0, CJS_Value(pRuntime, "G")); + array->SetElement(pRuntime, 1, CJS_Value(pRuntime, color.fColor1)); + break; + case COLORTYPE_RGB: + array->SetElement(pRuntime, 0, CJS_Value(pRuntime, "RGB")); + array->SetElement(pRuntime, 1, CJS_Value(pRuntime, color.fColor1)); + array->SetElement(pRuntime, 2, CJS_Value(pRuntime, color.fColor2)); + array->SetElement(pRuntime, 3, CJS_Value(pRuntime, color.fColor3)); + break; + case COLORTYPE_CMYK: + array->SetElement(pRuntime, 0, CJS_Value(pRuntime, "CMYK")); + array->SetElement(pRuntime, 1, CJS_Value(pRuntime, color.fColor1)); + array->SetElement(pRuntime, 2, CJS_Value(pRuntime, color.fColor2)); + array->SetElement(pRuntime, 3, CJS_Value(pRuntime, color.fColor3)); + array->SetElement(pRuntime, 4, CJS_Value(pRuntime, color.fColor4)); + break; + } +} + +void color::ConvertArrayToPWLColor(CJS_Runtime* pRuntime, + const CJS_Array& array, + CPWL_Color* color) { + int nArrayLen = array.GetLength(pRuntime); + if (nArrayLen < 1) + return; + + CJS_Value value(pRuntime); + array.GetElement(pRuntime, 0, value); + CFX_ByteString sSpace = value.ToCFXByteString(pRuntime); + + double d1 = 0; + double d2 = 0; + double d3 = 0; + double d4 = 0; + + if (nArrayLen > 1) { + array.GetElement(pRuntime, 1, value); + d1 = value.ToDouble(pRuntime); + } + + if (nArrayLen > 2) { + array.GetElement(pRuntime, 2, value); + d2 = value.ToDouble(pRuntime); + } + + if (nArrayLen > 3) { + array.GetElement(pRuntime, 3, value); + d3 = value.ToDouble(pRuntime); + } + + if (nArrayLen > 4) { + array.GetElement(pRuntime, 4, value); + d4 = value.ToDouble(pRuntime); + } + + if (sSpace == "T") { + *color = CPWL_Color(COLORTYPE_TRANSPARENT); + } else if (sSpace == "G") { + *color = CPWL_Color(COLORTYPE_GRAY, (FX_FLOAT)d1); + } else if (sSpace == "RGB") { + *color = + CPWL_Color(COLORTYPE_RGB, (FX_FLOAT)d1, (FX_FLOAT)d2, (FX_FLOAT)d3); + } else if (sSpace == "CMYK") { + *color = CPWL_Color(COLORTYPE_CMYK, (FX_FLOAT)d1, (FX_FLOAT)d2, + (FX_FLOAT)d3, (FX_FLOAT)d4); + } +} + +bool color::transparent(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return PropertyHelper(pRuntime, vp, &m_crTransparent); +} + +bool color::black(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return PropertyHelper(pRuntime, vp, &m_crBlack); +} + +bool color::white(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return PropertyHelper(pRuntime, vp, &m_crWhite); +} + +bool color::red(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return PropertyHelper(pRuntime, vp, &m_crRed); +} + +bool color::green(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return PropertyHelper(pRuntime, vp, &m_crGreen); +} + +bool color::blue(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return PropertyHelper(pRuntime, vp, &m_crBlue); +} + +bool color::cyan(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return PropertyHelper(pRuntime, vp, &m_crCyan); +} + +bool color::magenta(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return PropertyHelper(pRuntime, vp, &m_crMagenta); +} + +bool color::yellow(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return PropertyHelper(pRuntime, vp, &m_crYellow); +} + +bool color::dkGray(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return PropertyHelper(pRuntime, vp, &m_crDKGray); +} + +bool color::gray(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return PropertyHelper(pRuntime, vp, &m_crGray); +} + +bool color::ltGray(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return PropertyHelper(pRuntime, vp, &m_crLTGray); +} + +bool color::PropertyHelper(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CPWL_Color* var) { + CJS_Array array; + if (vp.IsGetting()) { + ConvertPWLColorToArray(pRuntime, *var, &array); + vp << array; + return true; + } + if (!vp.GetJSValue()->ConvertToArray(pRuntime, array)) + return false; + + ConvertArrayToPWLColor(pRuntime, array, var); + return true; +} + +bool color::convert(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + int iSize = params.size(); + if (iSize < 2) + return false; + + CJS_Array aSource; + if (!params[0].ConvertToArray(pRuntime, aSource)) + return false; + + CPWL_Color crSource; + ConvertArrayToPWLColor(pRuntime, aSource, &crSource); + + CFX_ByteString sDestSpace = params[1].ToCFXByteString(pRuntime); + int nColorType = COLORTYPE_TRANSPARENT; + + if (sDestSpace == "T") { + nColorType = COLORTYPE_TRANSPARENT; + } else if (sDestSpace == "G") { + nColorType = COLORTYPE_GRAY; + } else if (sDestSpace == "RGB") { + nColorType = COLORTYPE_RGB; + } else if (sDestSpace == "CMYK") { + nColorType = COLORTYPE_CMYK; + } + + CJS_Array aDest; + CPWL_Color crDest = crSource.ConvertColorType(nColorType); + ConvertPWLColorToArray(pRuntime, crDest, &aDest); + vRet = CJS_Value(pRuntime, aDest); + + return true; +} + +bool color::equal(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() < 2) + return false; + + CJS_Array array1; + CJS_Array array2; + if (!params[0].ConvertToArray(pRuntime, array1)) + return false; + if (!params[1].ConvertToArray(pRuntime, array2)) + return false; + + CPWL_Color color1; + CPWL_Color color2; + ConvertArrayToPWLColor(pRuntime, array1, &color1); + ConvertArrayToPWLColor(pRuntime, array2, &color2); + color1 = color1.ConvertColorType(color2.nColorType); + vRet = CJS_Value(pRuntime, color1 == color2); + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/color.h b/modules/pdfium/pdfium/fpdfsdk/javascript/color.h new file mode 100644 index 000000000000..8d6187a17844 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/color.h @@ -0,0 +1,96 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_COLOR_H_ +#define FPDFSDK_JAVASCRIPT_COLOR_H_ + +#include + +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +class color : public CJS_EmbedObj { + public: + explicit color(CJS_Object* pJSObject); + ~color() override; + + bool black(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool blue(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool cyan(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool dkGray(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool gray(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool green(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool ltGray(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool magenta(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool red(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool transparent(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool white(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool yellow(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + + bool convert(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool equal(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + + static void ConvertPWLColorToArray(CJS_Runtime* pRuntime, + const CPWL_Color& color, + CJS_Array* array); + static void ConvertArrayToPWLColor(CJS_Runtime* pRuntime, + const CJS_Array& array, + CPWL_Color* color); + + private: + bool PropertyHelper(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CPWL_Color* val); + + CPWL_Color m_crTransparent; + CPWL_Color m_crBlack; + CPWL_Color m_crWhite; + CPWL_Color m_crRed; + CPWL_Color m_crGreen; + CPWL_Color m_crBlue; + CPWL_Color m_crCyan; + CPWL_Color m_crMagenta; + CPWL_Color m_crYellow; + CPWL_Color m_crDKGray; + CPWL_Color m_crGray; + CPWL_Color m_crLTGray; +}; + +class CJS_Color : public CJS_Object { + public: + explicit CJS_Color(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Color() override {} + + DECLARE_JS_CLASS(); + + JS_STATIC_PROP(black, color); + JS_STATIC_PROP(blue, color); + JS_STATIC_PROP(cyan, color); + JS_STATIC_PROP(dkGray, color); + JS_STATIC_PROP(gray, color); + JS_STATIC_PROP(green, color); + JS_STATIC_PROP(ltGray, color); + JS_STATIC_PROP(magenta, color); + JS_STATIC_PROP(red, color); + JS_STATIC_PROP(transparent, color); + JS_STATIC_PROP(white, color); + JS_STATIC_PROP(yellow, color); + + JS_STATIC_METHOD(convert, color); + JS_STATIC_METHOD(equal, color); +}; + +#endif // FPDFSDK_JAVASCRIPT_COLOR_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/console.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/console.cpp new file mode 100644 index 000000000000..e9d130820fe4 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/console.cpp @@ -0,0 +1,62 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/console.h" + +#include + +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_EventHandler.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" +#include "fpdfsdk/javascript/cjs_event_context.h" + +JSConstSpec CJS_Console::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}}; + +JSPropertySpec CJS_Console::PropertySpecs[] = {{0, 0, 0}}; + +JSMethodSpec CJS_Console::MethodSpecs[] = {{"clear", clear_static}, + {"hide", hide_static}, + {"println", println_static}, + {"show", show_static}, + {0, 0}}; + +IMPLEMENT_JS_CLASS(CJS_Console, console) + +console::console(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {} + +console::~console() {} + +bool console::clear(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool console::hide(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} + +bool console::println(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() < 1) { + return false; + } + return true; +} + +bool console::show(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/console.h b/modules/pdfium/pdfium/fpdfsdk/javascript/console.h new file mode 100644 index 000000000000..a7e4d8ed9bd4 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/console.h @@ -0,0 +1,51 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_CONSOLE_H_ +#define FPDFSDK_JAVASCRIPT_CONSOLE_H_ + +#include + +#include "fpdfsdk/javascript/JS_Define.h" + +class console : public CJS_EmbedObj { + public: + explicit console(CJS_Object* pJSObject); + ~console() override; + + public: + bool clear(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool hide(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool println(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool show(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); +}; + +class CJS_Console : public CJS_Object { + public: + explicit CJS_Console(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Console() override {} + + DECLARE_JS_CLASS(); + + JS_STATIC_METHOD(clear, console); + JS_STATIC_METHOD(hide, console); + JS_STATIC_METHOD(println, console); + JS_STATIC_METHOD(show, console); +}; + +#endif // FPDFSDK_JAVASCRIPT_CONSOLE_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/event.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/event.cpp new file mode 100644 index 000000000000..2b00cbc10e32 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/event.cpp @@ -0,0 +1,309 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/event.h" + +#include "fpdfsdk/javascript/Field.h" +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_EventHandler.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" +#include "fpdfsdk/javascript/cjs_event_context.h" + +JSConstSpec CJS_Event::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}}; + +JSPropertySpec CJS_Event::PropertySpecs[] = { + {"change", get_change_static, set_change_static}, + {"changeEx", get_changeEx_static, set_changeEx_static}, + {"commitKey", get_commitKey_static, set_commitKey_static}, + {"fieldFull", get_fieldFull_static, set_fieldFull_static}, + {"keyDown", get_keyDown_static, set_keyDown_static}, + {"modifier", get_modifier_static, set_modifier_static}, + {"name", get_name_static, set_name_static}, + {"rc", get_rc_static, set_rc_static}, + {"richChange", get_richChange_static, set_richChange_static}, + {"richChangeEx", get_richChangeEx_static, set_richChangeEx_static}, + {"richValue", get_richValue_static, set_richValue_static}, + {"selEnd", get_selEnd_static, set_selEnd_static}, + {"selStart", get_selStart_static, set_selStart_static}, + {"shift", get_shift_static, set_shift_static}, + {"source", get_source_static, set_source_static}, + {"target", get_target_static, set_target_static}, + {"targetName", get_targetName_static, set_targetName_static}, + {"type", get_type_static, set_type_static}, + {"value", get_value_static, set_value_static}, + {"willCommit", get_willCommit_static, set_willCommit_static}, + {0, 0, 0}}; + +JSMethodSpec CJS_Event::MethodSpecs[] = {{0, 0}}; + +IMPLEMENT_JS_CLASS(CJS_Event, event) + +event::event(CJS_Object* pJsObject) : CJS_EmbedObj(pJsObject) {} + +event::~event() {} + +bool event::change(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + CFX_WideString& wChange = pEvent->Change(); + if (vp.IsSetting()) { + if (vp.GetJSValue()->GetType() == CJS_Value::VT_string) + vp >> wChange; + return true; + } + vp << wChange; + return true; +} + +bool event::changeEx(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + vp << pEvent->ChangeEx(); + return true; +} + +bool event::commitKey(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + vp << pEvent->CommitKey(); + return true; +} + +bool event::fieldFull(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + if (!vp.IsGetting() && + wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) + return false; + + vp << pEvent->FieldFull(); + return true; +} + +bool event::keyDown(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + vp << pEvent->KeyDown(); + return true; +} + +bool event::modifier(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + vp << pEvent->Modifier(); + return true; +} + +bool event::name(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + vp << pEvent->Name(); + return true; +} + +bool event::rc(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + bool& bRc = pEvent->Rc(); + if (vp.IsSetting()) + vp >> bRc; + else + vp << bRc; + + return true; +} + +bool event::richChange(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +bool event::richChangeEx(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +bool event::richValue(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + return true; +} + +bool event::selEnd(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) + return true; + + int& iSelEnd = pEvent->SelEnd(); + if (vp.IsSetting()) + vp >> iSelEnd; + else + vp << iSelEnd; + + return true; +} + +bool event::selStart(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) + return true; + + int& iSelStart = pEvent->SelStart(); + if (vp.IsSetting()) + vp >> iSelStart; + else + vp << iSelStart; + + return true; +} + +bool event::shift(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + vp << pEvent->Shift(); + return true; +} + +bool event::source(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + vp << pEvent->Source()->GetJSObject(); + return true; +} + +bool event::target(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + vp << pEvent->Target_Field()->GetJSObject(); + return true; +} + +bool event::targetName(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + vp << pEvent->TargetName(); + return true; +} + +bool event::type(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + vp << pEvent->Type(); + return true; +} + +bool event::value(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + if (wcscmp((const wchar_t*)pEvent->Type(), L"Field") != 0) + return false; + + if (!pEvent->m_pValue) + return false; + + CFX_WideString& val = pEvent->Value(); + if (vp.IsSetting()) + vp >> val; + else + vp << val; + + return true; +} + +bool event::willCommit(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (!vp.IsGetting()) + return false; + + CJS_EventHandler* pEvent = + pRuntime->GetCurrentEventContext()->GetEventHandler(); + + vp << pEvent->WillCommit(); + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/event.h b/modules/pdfium/pdfium/fpdfsdk/javascript/event.h new file mode 100644 index 000000000000..2be8a0adb2d4 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/event.h @@ -0,0 +1,90 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_EVENT_H_ +#define FPDFSDK_JAVASCRIPT_EVENT_H_ + +#include "fpdfsdk/javascript/JS_Define.h" + +class event : public CJS_EmbedObj { + public: + explicit event(CJS_Object* pJSObject); + ~event() override; + + public: + bool change(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool changeEx(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool commitKey(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool fieldFull(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool keyDown(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool modifier(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool name(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool rc(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool richChange(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool richChangeEx(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool richValue(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool selEnd(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool selStart(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool shift(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool source(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool target(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool targetName(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); + bool type(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool value(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); + bool willCommit(CJS_Runtime* pRuntime, + CJS_PropValue& vp, + CFX_WideString& sError); +}; + +class CJS_Event : public CJS_Object { + public: + explicit CJS_Event(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Event() override {} + + DECLARE_JS_CLASS(); + JS_STATIC_PROP(change, event); + JS_STATIC_PROP(changeEx, event); + JS_STATIC_PROP(commitKey, event); + JS_STATIC_PROP(fieldFull, event); + JS_STATIC_PROP(keyDown, event); + JS_STATIC_PROP(modifier, event); + JS_STATIC_PROP(name, event); + JS_STATIC_PROP(rc, event); + JS_STATIC_PROP(richChange, event); + JS_STATIC_PROP(richChangeEx, event); + JS_STATIC_PROP(richValue, event); + JS_STATIC_PROP(selEnd, event); + JS_STATIC_PROP(selStart, event); + JS_STATIC_PROP(shift, event); + JS_STATIC_PROP(source, event); + JS_STATIC_PROP(target, event); + JS_STATIC_PROP(targetName, event); + JS_STATIC_PROP(type, event); + JS_STATIC_PROP(value, event); + JS_STATIC_PROP(willCommit, event); +}; + +#endif // FPDFSDK_JAVASCRIPT_EVENT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/global.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/global.cpp new file mode 100644 index 000000000000..a450606b1a47 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/global.cpp @@ -0,0 +1,440 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/global.h" + +#include + +#include "core/fxcrt/fx_ext.h" +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_EventHandler.h" +#include "fpdfsdk/javascript/JS_GlobalData.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" +#include "fpdfsdk/javascript/cjs_event_context.h" +#include "fpdfsdk/javascript/resource.h" + +JSConstSpec CJS_Global::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}}; + +JSPropertySpec CJS_Global::PropertySpecs[] = {{0, 0, 0}}; + +JSMethodSpec CJS_Global::MethodSpecs[] = { + {"setPersistent", setPersistent_static}, + {0, 0}}; + +IMPLEMENT_SPECIAL_JS_CLASS(CJS_Global, JSGlobalAlternate, global); + +void CJS_Global::InitInstance(IJS_Runtime* pIRuntime) { + CJS_Runtime* pRuntime = static_cast(pIRuntime); + JSGlobalAlternate* pGlobal = + static_cast(GetEmbedObject()); + pGlobal->Initial(pRuntime->GetFormFillEnv()); +} + +JSGlobalData::JSGlobalData() + : nType(JS_GlobalDataType::NUMBER), + dData(0), + bData(false), + sData(""), + bPersistent(false), + bDeleted(false) {} + +JSGlobalData::~JSGlobalData() { + pData.Reset(); +} + +JSGlobalAlternate::JSGlobalAlternate(CJS_Object* pJSObject) + : CJS_EmbedObj(pJSObject), m_pFormFillEnv(nullptr) {} + +JSGlobalAlternate::~JSGlobalAlternate() { + DestroyGlobalPersisitentVariables(); + m_pGlobalData->Release(); +} + +void JSGlobalAlternate::Initial(CPDFSDK_FormFillEnvironment* pFormFillEnv) { + m_pFormFillEnv.Reset(pFormFillEnv); + m_pGlobalData = CJS_GlobalData::GetRetainedInstance(pFormFillEnv); + UpdateGlobalPersistentVariables(); +} + +bool JSGlobalAlternate::QueryProperty(const FX_WCHAR* propname) { + return CFX_WideString(propname) != L"setPersistent"; +} + +bool JSGlobalAlternate::DelProperty(CJS_Runtime* pRuntime, + const FX_WCHAR* propname, + CFX_WideString& sError) { + auto it = m_mapGlobal.find(CFX_ByteString::FromUnicode(propname)); + if (it == m_mapGlobal.end()) + return false; + + it->second->bDeleted = true; + return true; +} + +bool JSGlobalAlternate::DoProperty(CJS_Runtime* pRuntime, + const FX_WCHAR* propname, + CJS_PropValue& vp, + CFX_WideString& sError) { + if (vp.IsSetting()) { + CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); + switch (vp.GetJSValue()->GetType()) { + case CJS_Value::VT_number: { + double dData; + vp >> dData; + return SetGlobalVariables(sPropName, JS_GlobalDataType::NUMBER, dData, + false, "", v8::Local(), false); + } + case CJS_Value::VT_boolean: { + bool bData; + vp >> bData; + return SetGlobalVariables(sPropName, JS_GlobalDataType::BOOLEAN, 0, + bData, "", v8::Local(), false); + } + case CJS_Value::VT_string: { + CFX_ByteString sData; + vp >> sData; + return SetGlobalVariables(sPropName, JS_GlobalDataType::STRING, 0, + false, sData, v8::Local(), false); + } + case CJS_Value::VT_object: { + v8::Local pData; + vp >> pData; + return SetGlobalVariables(sPropName, JS_GlobalDataType::OBJECT, 0, + false, "", pData, false); + } + case CJS_Value::VT_null: { + return SetGlobalVariables(sPropName, JS_GlobalDataType::NULLOBJ, 0, + false, "", v8::Local(), false); + } + case CJS_Value::VT_undefined: { + DelProperty(pRuntime, propname, sError); + return true; + } + default: + break; + } + } else { + auto it = m_mapGlobal.find(CFX_ByteString::FromUnicode(propname)); + if (it == m_mapGlobal.end()) { + vp.GetJSValue()->SetNull(pRuntime); + return true; + } + JSGlobalData* pData = it->second; + if (pData->bDeleted) { + vp.GetJSValue()->SetNull(pRuntime); + return true; + } + switch (pData->nType) { + case JS_GlobalDataType::NUMBER: + vp << pData->dData; + return true; + case JS_GlobalDataType::BOOLEAN: + vp << pData->bData; + return true; + case JS_GlobalDataType::STRING: + vp << pData->sData; + return true; + case JS_GlobalDataType::OBJECT: { + v8::Local obj = v8::Local::New( + vp.GetJSRuntime()->GetIsolate(), pData->pData); + vp << obj; + return true; + } + case JS_GlobalDataType::NULLOBJ: + vp.GetJSValue()->SetNull(pRuntime); + return true; + default: + break; + } + } + return false; +} + +bool JSGlobalAlternate::setPersistent(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() != 2) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + auto it = m_mapGlobal.find(params[0].ToCFXByteString(pRuntime)); + if (it != m_mapGlobal.end()) { + JSGlobalData* pData = it->second; + if (!pData->bDeleted) { + pData->bPersistent = params[1].ToBool(pRuntime); + return true; + } + } + + sError = JSGetStringFromID(IDS_STRING_JSNOGLOBAL); + return false; +} + +void JSGlobalAlternate::UpdateGlobalPersistentVariables() { + CJS_Runtime* pRuntime = + static_cast(CFXJS_Engine::CurrentEngineFromIsolate( + m_pJSObject->ToV8Object()->GetIsolate())); + + for (int i = 0, sz = m_pGlobalData->GetSize(); i < sz; i++) { + CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i); + switch (pData->data.nType) { + case JS_GlobalDataType::NUMBER: + SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::NUMBER, + pData->data.dData, false, "", + v8::Local(), pData->bPersistent == 1); + pRuntime->PutObjectProperty(m_pJSObject->ToV8Object(), + pData->data.sKey.UTF8Decode(), + pRuntime->NewNumber(pData->data.dData)); + break; + case JS_GlobalDataType::BOOLEAN: + SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::BOOLEAN, 0, + pData->data.bData == 1, "", v8::Local(), + pData->bPersistent == 1); + pRuntime->PutObjectProperty( + m_pJSObject->ToV8Object(), pData->data.sKey.UTF8Decode(), + pRuntime->NewBoolean(pData->data.bData == 1)); + break; + case JS_GlobalDataType::STRING: + SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::STRING, 0, + false, pData->data.sData, v8::Local(), + pData->bPersistent == 1); + pRuntime->PutObjectProperty( + m_pJSObject->ToV8Object(), pData->data.sKey.UTF8Decode(), + pRuntime->NewString(pData->data.sData.UTF8Decode().AsStringC())); + break; + case JS_GlobalDataType::OBJECT: { + v8::Local pObj = pRuntime->NewFxDynamicObj(-1); + PutObjectProperty(pObj, &pData->data); + SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::OBJECT, 0, + false, "", pObj, pData->bPersistent == 1); + pRuntime->PutObjectProperty(m_pJSObject->ToV8Object(), + pData->data.sKey.UTF8Decode(), pObj); + } break; + case JS_GlobalDataType::NULLOBJ: + SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::NULLOBJ, 0, + false, "", v8::Local(), + pData->bPersistent == 1); + pRuntime->PutObjectProperty(m_pJSObject->ToV8Object(), + pData->data.sKey.UTF8Decode(), + pRuntime->NewNull()); + break; + } + } +} + +void JSGlobalAlternate::CommitGlobalPersisitentVariables( + CJS_Runtime* pRuntime) { + for (auto it = m_mapGlobal.begin(); it != m_mapGlobal.end(); ++it) { + CFX_ByteString name = it->first; + JSGlobalData* pData = it->second; + if (pData->bDeleted) { + m_pGlobalData->DeleteGlobalVariable(name); + } else { + switch (pData->nType) { + case JS_GlobalDataType::NUMBER: + m_pGlobalData->SetGlobalVariableNumber(name, pData->dData); + m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); + break; + case JS_GlobalDataType::BOOLEAN: + m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData); + m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); + break; + case JS_GlobalDataType::STRING: + m_pGlobalData->SetGlobalVariableString(name, pData->sData); + m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); + break; + case JS_GlobalDataType::OBJECT: { + CJS_GlobalVariableArray array; + v8::Local obj = v8::Local::New( + GetJSObject()->GetIsolate(), pData->pData); + ObjectToArray(pRuntime, obj, array); + m_pGlobalData->SetGlobalVariableObject(name, array); + m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); + } break; + case JS_GlobalDataType::NULLOBJ: + m_pGlobalData->SetGlobalVariableNull(name); + m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); + break; + } + } + } +} + +void JSGlobalAlternate::ObjectToArray(CJS_Runtime* pRuntime, + v8::Local pObj, + CJS_GlobalVariableArray& array) { + std::vector pKeyList = pRuntime->GetObjectPropertyNames(pObj); + for (const auto& ws : pKeyList) { + CFX_ByteString sKey = ws.UTF8Encode(); + v8::Local v = pRuntime->GetObjectProperty(pObj, ws); + switch (CJS_Value::GetValueType(v)) { + case CJS_Value::VT_number: { + CJS_KeyValue* pObjElement = new CJS_KeyValue; + pObjElement->nType = JS_GlobalDataType::NUMBER; + pObjElement->sKey = sKey; + pObjElement->dData = pRuntime->ToDouble(v); + array.Add(pObjElement); + } break; + case CJS_Value::VT_boolean: { + CJS_KeyValue* pObjElement = new CJS_KeyValue; + pObjElement->nType = JS_GlobalDataType::BOOLEAN; + pObjElement->sKey = sKey; + pObjElement->dData = pRuntime->ToBoolean(v); + array.Add(pObjElement); + } break; + case CJS_Value::VT_string: { + CFX_ByteString sValue = + CJS_Value(pRuntime, v).ToCFXByteString(pRuntime); + CJS_KeyValue* pObjElement = new CJS_KeyValue; + pObjElement->nType = JS_GlobalDataType::STRING; + pObjElement->sKey = sKey; + pObjElement->sData = sValue; + array.Add(pObjElement); + } break; + case CJS_Value::VT_object: { + CJS_KeyValue* pObjElement = new CJS_KeyValue; + pObjElement->nType = JS_GlobalDataType::OBJECT; + pObjElement->sKey = sKey; + ObjectToArray(pRuntime, pRuntime->ToObject(v), pObjElement->objData); + array.Add(pObjElement); + } break; + case CJS_Value::VT_null: { + CJS_KeyValue* pObjElement = new CJS_KeyValue; + pObjElement->nType = JS_GlobalDataType::NULLOBJ; + pObjElement->sKey = sKey; + array.Add(pObjElement); + } break; + default: + break; + } + } +} + +void JSGlobalAlternate::PutObjectProperty(v8::Local pObj, + CJS_KeyValue* pData) { + CJS_Runtime* pRuntime = CJS_Runtime::CurrentRuntimeFromIsolate( + m_pJSObject->ToV8Object()->GetIsolate()); + + for (int i = 0, sz = pData->objData.Count(); i < sz; i++) { + CJS_KeyValue* pObjData = pData->objData.GetAt(i); + switch (pObjData->nType) { + case JS_GlobalDataType::NUMBER: + pRuntime->PutObjectProperty(pObj, pObjData->sKey.UTF8Decode(), + pRuntime->NewNumber(pObjData->dData)); + break; + case JS_GlobalDataType::BOOLEAN: + pRuntime->PutObjectProperty(pObj, pObjData->sKey.UTF8Decode(), + pRuntime->NewBoolean(pObjData->bData == 1)); + break; + case JS_GlobalDataType::STRING: + pRuntime->PutObjectProperty( + pObj, pObjData->sKey.UTF8Decode(), + pRuntime->NewString(pObjData->sData.UTF8Decode().AsStringC())); + break; + case JS_GlobalDataType::OBJECT: { + v8::Local pNewObj = pRuntime->NewFxDynamicObj(-1); + PutObjectProperty(pNewObj, pObjData); + pRuntime->PutObjectProperty(pObj, pObjData->sKey.UTF8Decode(), pNewObj); + } break; + case JS_GlobalDataType::NULLOBJ: + pRuntime->PutObjectProperty(pObj, pObjData->sKey.UTF8Decode(), + pRuntime->NewNull()); + break; + } + } +} + +void JSGlobalAlternate::DestroyGlobalPersisitentVariables() { + for (const auto& pair : m_mapGlobal) { + delete pair.second; + } + m_mapGlobal.clear(); +} + +bool JSGlobalAlternate::SetGlobalVariables(const CFX_ByteString& propname, + JS_GlobalDataType nType, + double dData, + bool bData, + const CFX_ByteString& sData, + v8::Local pData, + bool bDefaultPersistent) { + if (propname.IsEmpty()) + return false; + + auto it = m_mapGlobal.find(propname); + if (it != m_mapGlobal.end()) { + JSGlobalData* pTemp = it->second; + if (pTemp->bDeleted || pTemp->nType != nType) { + pTemp->dData = 0; + pTemp->bData = 0; + pTemp->sData = ""; + pTemp->nType = nType; + } + + pTemp->bDeleted = false; + switch (nType) { + case JS_GlobalDataType::NUMBER: { + pTemp->dData = dData; + } break; + case JS_GlobalDataType::BOOLEAN: { + pTemp->bData = bData; + } break; + case JS_GlobalDataType::STRING: { + pTemp->sData = sData; + } break; + case JS_GlobalDataType::OBJECT: { + pTemp->pData.Reset(pData->GetIsolate(), pData); + } break; + case JS_GlobalDataType::NULLOBJ: + break; + default: + return false; + } + return true; + } + + JSGlobalData* pNewData = nullptr; + + switch (nType) { + case JS_GlobalDataType::NUMBER: { + pNewData = new JSGlobalData; + pNewData->nType = JS_GlobalDataType::NUMBER; + pNewData->dData = dData; + pNewData->bPersistent = bDefaultPersistent; + } break; + case JS_GlobalDataType::BOOLEAN: { + pNewData = new JSGlobalData; + pNewData->nType = JS_GlobalDataType::BOOLEAN; + pNewData->bData = bData; + pNewData->bPersistent = bDefaultPersistent; + } break; + case JS_GlobalDataType::STRING: { + pNewData = new JSGlobalData; + pNewData->nType = JS_GlobalDataType::STRING; + pNewData->sData = sData; + pNewData->bPersistent = bDefaultPersistent; + } break; + case JS_GlobalDataType::OBJECT: { + pNewData = new JSGlobalData; + pNewData->nType = JS_GlobalDataType::OBJECT; + pNewData->pData.Reset(pData->GetIsolate(), pData); + pNewData->bPersistent = bDefaultPersistent; + } break; + case JS_GlobalDataType::NULLOBJ: { + pNewData = new JSGlobalData; + pNewData->nType = JS_GlobalDataType::NULLOBJ; + pNewData->bPersistent = bDefaultPersistent; + } break; + default: + return false; + } + + m_mapGlobal[propname] = pNewData; + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/global.h b/modules/pdfium/pdfium/fpdfsdk/javascript/global.h new file mode 100644 index 000000000000..e313929beacf --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/global.h @@ -0,0 +1,86 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_GLOBAL_H_ +#define FPDFSDK_JAVASCRIPT_GLOBAL_H_ + +#include +#include + +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_KeyValue.h" + +class CJS_GlobalData; +class CJS_GlobalVariableArray; +class CJS_KeyValue; + +struct JSGlobalData { + JSGlobalData(); + ~JSGlobalData(); + + JS_GlobalDataType nType; + double dData; + bool bData; + CFX_ByteString sData; + v8::Global pData; + bool bPersistent; + bool bDeleted; +}; + +class JSGlobalAlternate : public CJS_EmbedObj { + public: + explicit JSGlobalAlternate(CJS_Object* pJSObject); + ~JSGlobalAlternate() override; + + bool setPersistent(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool QueryProperty(const FX_WCHAR* propname); + bool DoProperty(CJS_Runtime* pRuntime, + const FX_WCHAR* propname, + CJS_PropValue& vp, + CFX_WideString& sError); + bool DelProperty(CJS_Runtime* pRuntime, + const FX_WCHAR* propname, + CFX_WideString& sError); + void Initial(CPDFSDK_FormFillEnvironment* pFormFillEnv); + + private: + void UpdateGlobalPersistentVariables(); + void CommitGlobalPersisitentVariables(CJS_Runtime* pRuntime); + void DestroyGlobalPersisitentVariables(); + bool SetGlobalVariables(const CFX_ByteString& propname, + JS_GlobalDataType nType, + double dData, + bool bData, + const CFX_ByteString& sData, + v8::Local pData, + bool bDefaultPersistent); + void ObjectToArray(CJS_Runtime* pRuntime, + v8::Local pObj, + CJS_GlobalVariableArray& array); + void PutObjectProperty(v8::Local obj, CJS_KeyValue* pData); + + std::map m_mapGlobal; + CFX_WideString m_sFilePath; + CJS_GlobalData* m_pGlobalData; + CPDFSDK_FormFillEnvironment::ObservedPtr m_pFormFillEnv; +}; + +class CJS_Global : public CJS_Object { + public: + explicit CJS_Global(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Global() override {} + + // CJS_Object + void InitInstance(IJS_Runtime* pIRuntime) override; + + DECLARE_SPECIAL_JS_CLASS(); + JS_SPECIAL_STATIC_METHOD(setPersistent, JSGlobalAlternate, global); +}; + +#endif // FPDFSDK_JAVASCRIPT_GLOBAL_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/ijs_event_context.h b/modules/pdfium/pdfium/fpdfsdk/javascript/ijs_event_context.h new file mode 100644 index 000000000000..8428072cdd72 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/ijs_event_context.h @@ -0,0 +1,134 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_IJS_EVENT_CONTEXT_H_ +#define FPDFSDK_JAVASCRIPT_IJS_EVENT_CONTEXT_H_ + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +class CPDF_Bookmark; +class CPDF_FormField; +class CPDFSDK_Annot; +class CPDFSDK_FormFillEnvironment; + +// Records the details of an event and triggers JS execution for it. There +// can be more than one of these at any given time, as JS callbacks to C++ +// may trigger new events on top of one another. +class IJS_EventContext { + public: + virtual bool RunScript(const CFX_WideString& script, + CFX_WideString* info) = 0; + + virtual void OnApp_Init() = 0; + + virtual void OnDoc_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString& strTargetName) = 0; + virtual void OnDoc_WillPrint(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0; + virtual void OnDoc_DidPrint(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0; + virtual void OnDoc_WillSave(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0; + virtual void OnDoc_DidSave(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0; + virtual void OnDoc_WillClose(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0; + + virtual void OnPage_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0; + virtual void OnPage_Close(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0; + virtual void OnPage_InView(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0; + virtual void OnPage_OutView(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0; + + virtual void OnField_MouseDown(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) = 0; + virtual void OnField_MouseEnter(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) = 0; + virtual void OnField_MouseExit(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) = 0; + virtual void OnField_MouseUp(bool bModifier, + bool bShift, + CPDF_FormField* pTarget) = 0; + virtual void OnField_Focus(bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + const CFX_WideString& Value) = 0; + virtual void OnField_Blur(bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + const CFX_WideString& Value) = 0; + + virtual void OnField_Calculate(CPDF_FormField* pSource, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool& bRc) = 0; + virtual void OnField_Format(CPDF_FormField* pTarget, + CFX_WideString& Value, + bool bWillCommit) = 0; + virtual void OnField_Keystroke(CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + bool KeyDown, + bool bModifier, + int& nSelEnd, + int& nSelStart, + bool bShift, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool bWillCommit, + bool bFieldFull, + bool& bRc) = 0; + virtual void OnField_Validate(CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + bool bKeyDown, + bool bModifier, + bool bShift, + CPDF_FormField* pTarget, + CFX_WideString& Value, + bool& bRc) = 0; + + virtual void OnScreen_Focus(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) = 0; + virtual void OnScreen_Blur(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) = 0; + virtual void OnScreen_Open(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) = 0; + virtual void OnScreen_Close(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) = 0; + virtual void OnScreen_MouseDown(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) = 0; + virtual void OnScreen_MouseUp(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) = 0; + virtual void OnScreen_MouseEnter(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) = 0; + virtual void OnScreen_MouseExit(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) = 0; + virtual void OnScreen_InView(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) = 0; + virtual void OnScreen_OutView(bool bModifier, + bool bShift, + CPDFSDK_Annot* pScreen) = 0; + + virtual void OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) = 0; + virtual void OnLink_MouseUp(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0; + + virtual void OnMenu_Exec(CPDFSDK_FormFillEnvironment* pFormFillEnv, + const CFX_WideString&) = 0; + virtual void OnBatchExec(CPDFSDK_FormFillEnvironment* pFormFillEnv) = 0; + virtual void OnConsole_Exec() = 0; + virtual void OnExternal_Exec() = 0; + + protected: + virtual ~IJS_EventContext() {} +}; + +#endif // FPDFSDK_JAVASCRIPT_IJS_EVENT_CONTEXT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/ijs_runtime.h b/modules/pdfium/pdfium/fpdfsdk/javascript/ijs_runtime.h new file mode 100644 index 000000000000..babc41842cf6 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/ijs_runtime.h @@ -0,0 +1,45 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_IJS_RUNTIME_H_ +#define FPDFSDK_JAVASCRIPT_IJS_RUNTIME_H_ + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" + +#ifdef PDF_ENABLE_XFA +#include "fxjs/fxjse.h" +#endif // PDF_ENABLE_XFA + +class CPDFSDK_FormFillEnvironment; +class IJS_EventContext; + +// Owns the FJXS objects needed to actually execute JS. +class IJS_Runtime { + public: + static void Initialize(unsigned int slot, void* isolate); + static void Destroy(); + static IJS_Runtime* Create(CPDFSDK_FormFillEnvironment* pFormFillEnv); + virtual ~IJS_Runtime() {} + + virtual IJS_EventContext* NewEventContext() = 0; + virtual void ReleaseEventContext(IJS_EventContext* pContext) = 0; + virtual CPDFSDK_FormFillEnvironment* GetFormFillEnv() const = 0; + virtual int ExecuteScript(const CFX_WideString& script, + CFX_WideString* info) = 0; + +#ifdef PDF_ENABLE_XFA + virtual bool GetValueByName(const CFX_ByteStringC& utf8Name, + CFXJSE_Value* pValue) = 0; + virtual bool SetValueByName(const CFX_ByteStringC& utf8Name, + CFXJSE_Value* pValue) = 0; +#endif // PDF_ENABLE_XFA + + protected: + IJS_Runtime() {} +}; + +#endif // FPDFSDK_JAVASCRIPT_IJS_RUNTIME_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/public_methods_embeddertest.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/public_methods_embeddertest.cpp new file mode 100644 index 000000000000..24793667b070 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/public_methods_embeddertest.cpp @@ -0,0 +1,162 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include + +#include "core/fxcrt/fx_string.h" +#include "fpdfsdk/javascript/PublicMethods.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/js_embedder_test.h" + +namespace { + +double RoundDownDate(double date) { + return date - fmod(date, 86400000); +} + +} // namespace + +class PublicMethodsEmbedderTest : public JSEmbedderTest {}; + +TEST_F(PublicMethodsEmbedderTest, MakeRegularDate) { + v8::Isolate::Scope isolate_scope(isolate()); + v8::HandleScope handle_scope(isolate()); + v8::Context::Scope context_scope(GetV8Context()); + bool bWrongFormat; + double date; + + // 1968 + bWrongFormat = false; + date = CJS_PublicMethods::MakeRegularDate(L"06/25/1968", L"mm/dd/yyyy", + &bWrongFormat); + date = RoundDownDate(date); + EXPECT_DOUBLE_EQ(-47865600000, date); + EXPECT_FALSE(bWrongFormat); + + // 1968 + bWrongFormat = false; + date = CJS_PublicMethods::MakeRegularDate(L"25061968", L"ddmmyyyy", + &bWrongFormat); + date = RoundDownDate(date); + EXPECT_DOUBLE_EQ(-47865600000, date); + EXPECT_FALSE(bWrongFormat); + + // 1968 + bWrongFormat = false; + date = CJS_PublicMethods::MakeRegularDate(L"19680625", L"yyyymmdd", + &bWrongFormat); + date = RoundDownDate(date); + EXPECT_DOUBLE_EQ(-47865600000, date); + EXPECT_FALSE(bWrongFormat); + + // 1985 + bWrongFormat = false; + date = CJS_PublicMethods::MakeRegularDate(L"31121985", L"ddmmyyyy", + &bWrongFormat); + date = RoundDownDate(date); + EXPECT_DOUBLE_EQ(504835200000.0, date); + EXPECT_FALSE(bWrongFormat); + + // 2085, the other '85. + bWrongFormat = false; + date = + CJS_PublicMethods::MakeRegularDate(L"311285", L"ddmmyy", &bWrongFormat); + date = RoundDownDate(date); + EXPECT_DOUBLE_EQ(3660595200000.0, date); + EXPECT_FALSE(bWrongFormat); + + // 1995 + bWrongFormat = false; + date = CJS_PublicMethods::MakeRegularDate(L"01021995", L"ddmmyyyy", + &bWrongFormat); + date = RoundDownDate(date); + EXPECT_DOUBLE_EQ(791596800000.0, date); + EXPECT_FALSE(bWrongFormat); + + // 2095, the other '95. + bWrongFormat = false; + date = + CJS_PublicMethods::MakeRegularDate(L"010295", L"ddmmyy", &bWrongFormat); + date = RoundDownDate(date); + EXPECT_DOUBLE_EQ(3947356800000.0, date); + EXPECT_FALSE(bWrongFormat); + + // 2005 + bWrongFormat = false; + date = CJS_PublicMethods::MakeRegularDate(L"01022005", L"ddmmyyyy", + &bWrongFormat); + date = RoundDownDate(date); + EXPECT_DOUBLE_EQ(1107216000000.0, date); + EXPECT_FALSE(bWrongFormat); + + // 2005 + bWrongFormat = false; + date = + CJS_PublicMethods::MakeRegularDate(L"010205", L"ddmmyy", &bWrongFormat); + date = RoundDownDate(date); + EXPECT_DOUBLE_EQ(1107216000000.0, date); + EXPECT_FALSE(bWrongFormat); +} + +TEST_F(PublicMethodsEmbedderTest, MakeFormatDate) { + v8::Isolate::Scope isolate_scope(isolate()); + v8::HandleScope handle_scope(isolate()); + v8::Context::Scope context_scope(GetV8Context()); + CFX_WideString formatted_date; + + // 1968-06-25 + formatted_date = CJS_PublicMethods::MakeFormatDate(-47952000000, L"ddmmyy"); + EXPECT_STREQ(L"250668", formatted_date.c_str()); + formatted_date = CJS_PublicMethods::MakeFormatDate(-47952000000, L"yy/mm/dd"); + EXPECT_STREQ(L"68/06/25", formatted_date.c_str()); + + // 1969-12-31 + formatted_date = CJS_PublicMethods::MakeFormatDate(-0.0001, L"ddmmyy"); + EXPECT_STREQ(L"311269", formatted_date.c_str()); + formatted_date = CJS_PublicMethods::MakeFormatDate(-0.0001, L"yy!mmdd"); + EXPECT_STREQ(L"69!1231", formatted_date.c_str()); + + // 1970-01-01 + formatted_date = CJS_PublicMethods::MakeFormatDate(0, L"ddmmyy"); + EXPECT_STREQ(L"010170", formatted_date.c_str()); + formatted_date = CJS_PublicMethods::MakeFormatDate(0, L"mm-yyyy-dd"); + EXPECT_STREQ(L"01-1970-01", formatted_date.c_str()); + + // 1985-12-31 + formatted_date = CJS_PublicMethods::MakeFormatDate(504835200000.0, L"ddmmyy"); + EXPECT_STREQ(L"311285", formatted_date.c_str()); + formatted_date = CJS_PublicMethods::MakeFormatDate(504835200000.0, L"yymmdd"); + EXPECT_STREQ(L"851231", formatted_date.c_str()); + + // 1995-02-01 + formatted_date = CJS_PublicMethods::MakeFormatDate(791596800000.0, L"ddmmyy"); + EXPECT_STREQ(L"010295", formatted_date.c_str()); + formatted_date = + CJS_PublicMethods::MakeFormatDate(791596800000.0, L"yyyymmdd"); + EXPECT_STREQ(L"19950201", formatted_date.c_str()); + + // 2005-02-01 + formatted_date = + CJS_PublicMethods::MakeFormatDate(1107216000000.0, L"ddmmyy"); + EXPECT_STREQ(L"010205", formatted_date.c_str()); + formatted_date = + CJS_PublicMethods::MakeFormatDate(1107216000000.0, L"yyyyddmm"); + EXPECT_STREQ(L"20050102", formatted_date.c_str()); + + // 2085-12-31 + formatted_date = + CJS_PublicMethods::MakeFormatDate(3660595200000.0, L"ddmmyy"); + EXPECT_STREQ(L"311285", formatted_date.c_str()); + formatted_date = + CJS_PublicMethods::MakeFormatDate(3660595200000.0, L"yyyydd"); + EXPECT_STREQ(L"208531", formatted_date.c_str()); + + // 2095-02-01 + formatted_date = + CJS_PublicMethods::MakeFormatDate(3947356800000.0, L"ddmmyy"); + EXPECT_STREQ(L"010295", formatted_date.c_str()); + formatted_date = + CJS_PublicMethods::MakeFormatDate(3947356800000.0, L"mmddyyyy"); + EXPECT_STREQ(L"02012095", formatted_date.c_str()); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/public_methods_unittest.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/public_methods_unittest.cpp new file mode 100644 index 000000000000..ace0920e8f74 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/public_methods_unittest.cpp @@ -0,0 +1,51 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "fpdfsdk/javascript/PublicMethods.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" + +TEST(CJS_PublicMethods, IsNumber) { + // TODO(weili): Check whether results from case 0, 1, 10, 15 are intended. + struct { + const wchar_t* input; + bool expected; + } test_data[] = { + // Empty string. + {L"", true}, + // Only whitespaces. + {L" ", true}, + // Content with invalid characters. + {L"xyz00", false}, + {L"1%", false}, + // Hex string. + {L"0x234", false}, + // Signed numbers. + {L"+123", true}, + {L"-98765", true}, + // Numbers with whitespaces. + {L" 345 ", true}, + // Float numbers. + {L"-1e5", false}, + {L"-2e", false}, + {L"e-5", true}, + {L"0.023", true}, + {L".356089", true}, + {L"1e-9", true}, + {L"-1.23e+23", true}, + // Numbers with commas. + {L"1,000,000", false}, + {L"560,024", true}, + // Regular numbers. + {L"0", true}, + {L"0123", true}, + {L"9876123", true}, + }; + for (size_t i = 0; i < FX_ArraySize(test_data); ++i) { + EXPECT_EQ(test_data[i].expected, + CJS_PublicMethods::IsNumber(test_data[i].input)) + << "for case " << i; + } +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/report.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/report.cpp new file mode 100644 index 000000000000..c9c986d19552 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/report.cpp @@ -0,0 +1,43 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/report.h" + +#include + +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" + +JSConstSpec CJS_Report::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}}; + +JSPropertySpec CJS_Report::PropertySpecs[] = {{0, 0, 0}}; + +JSMethodSpec CJS_Report::MethodSpecs[] = {{"save", save_static}, + {"writeText", writeText_static}, + {0, 0}}; + +IMPLEMENT_JS_CLASS(CJS_Report, Report) + +Report::Report(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {} + +Report::~Report() {} + +bool Report::writeText(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} + +bool Report::save(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + // Unsafe, not supported. + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/report.h b/modules/pdfium/pdfium/fpdfsdk/javascript/report.h new file mode 100644 index 000000000000..c66db80fd1c2 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/report.h @@ -0,0 +1,41 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_REPORT_H_ +#define FPDFSDK_JAVASCRIPT_REPORT_H_ + +#include + +#include "fpdfsdk/javascript/JS_Define.h" + +class Report : public CJS_EmbedObj { + public: + explicit Report(CJS_Object* pJSObject); + ~Report() override; + + public: + bool save(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool writeText(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); +}; + +class CJS_Report : public CJS_Object { + public: + explicit CJS_Report(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Report() override {} + + DECLARE_JS_CLASS(); + + JS_STATIC_METHOD(save, Report) + JS_STATIC_METHOD(writeText, Report); +}; + +#endif // FPDFSDK_JAVASCRIPT_REPORT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/resource.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/resource.cpp new file mode 100644 index 000000000000..6113c5433856 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/resource.cpp @@ -0,0 +1,68 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/resource.h" + +CFX_WideString JSGetStringFromID(uint32_t id) { + switch (id) { + case IDS_STRING_JSALERT: + return L"Alert"; + case IDS_STRING_JSPARAMERROR: + return L"Incorrect number of parameters passed to function."; + case IDS_STRING_JSAFNUMBER_KEYSTROKE: + return L"The input value is invalid."; + case IDS_STRING_JSPARAM_TOOLONG: + return L"The input value is too long."; + case IDS_STRING_JSPARSEDATE: + return L"The input value can't be parsed as a valid date/time (%s)."; + case IDS_STRING_JSRANGE1: + return L"The input value must be greater than or equal to %s" + L" and less than or equal to %s."; + case IDS_STRING_JSRANGE2: + return L"The input value must be greater than or equal to %s."; + case IDS_STRING_JSRANGE3: + return L"The input value must be less than or equal to %s."; + case IDS_STRING_JSNOTSUPPORT: + return L"Operation not supported."; + case IDS_STRING_JSBUSY: + return L"System is busy."; + case IDS_STRING_JSEVENT: + return L"Duplicate formfield event found."; + case IDS_STRING_RUN: + return L"Script ran successfully."; + case IDS_STRING_JSPRINT1: + return L"The second parameter can't be converted to a Date."; + case IDS_STRING_JSPRINT2: + return L"The second parameter is an invalid Date!"; + case IDS_STRING_JSNOGLOBAL: + return L"Global value not found."; + case IDS_STRING_JSREADONLY: + return L"Cannot assign to readonly property."; + case IDS_STRING_JSTYPEERROR: + return L"Incorrect parameter type."; + case IDS_STRING_JSVALUEERROR: + return L"Incorrect parameter value."; + case IDS_STRING_JSNOPERMISSION: + return L"Permission denied."; + case IDS_STRING_JSBADOBJECT: + return L"Object no longer exists."; + default: + return L""; + } +} + +CFX_WideString JSFormatErrorString(const char* class_name, + const char* property_name, + const CFX_WideString& details) { + CFX_WideString result = CFX_WideString::FromLocal(class_name); + if (property_name) { + result += L"."; + result += CFX_WideString::FromLocal(property_name); + } + result += L": "; + result += details; + return result; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/resource.h b/modules/pdfium/pdfium/fpdfsdk/javascript/resource.h new file mode 100644 index 000000000000..af7788ff7d38 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/resource.h @@ -0,0 +1,40 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_RESOURCE_H_ +#define FPDFSDK_JAVASCRIPT_RESOURCE_H_ + +#include "core/fxcrt/fx_string.h" + +class CJS_EventContext; + +#define IDS_STRING_JSALERT 25613 +#define IDS_STRING_JSPARAMERROR 25614 +#define IDS_STRING_JSAFNUMBER_KEYSTROKE 25615 +#define IDS_STRING_JSPARAM_TOOLONG 25617 +#define IDS_STRING_JSPARSEDATE 25618 +#define IDS_STRING_JSRANGE1 25619 +#define IDS_STRING_JSRANGE2 25620 +#define IDS_STRING_JSRANGE3 25621 +#define IDS_STRING_JSNOTSUPPORT 25627 +#define IDS_STRING_JSBUSY 25628 +#define IDS_STRING_JSEVENT 25629 +#define IDS_STRING_RUN 25630 +#define IDS_STRING_JSPRINT1 25632 +#define IDS_STRING_JSPRINT2 25633 +#define IDS_STRING_JSNOGLOBAL 25635 +#define IDS_STRING_JSREADONLY 25636 +#define IDS_STRING_JSTYPEERROR 25637 +#define IDS_STRING_JSVALUEERROR 25638 +#define IDS_STRING_JSNOPERMISSION 25639 +#define IDS_STRING_JSBADOBJECT 25640 + +CFX_WideString JSGetStringFromID(uint32_t id); +CFX_WideString JSFormatErrorString(const char* class_name, + const char* property_name, + const CFX_WideString& details); + +#endif // FPDFSDK_JAVASCRIPT_RESOURCE_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/util.cpp b/modules/pdfium/pdfium/fpdfsdk/javascript/util.cpp new file mode 100644 index 000000000000..3221cfb0cbb6 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/util.cpp @@ -0,0 +1,462 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/javascript/util.h" + +#include + +#include +#include +#include + +#include "core/fxcrt/fx_ext.h" +#include "fpdfsdk/javascript/JS_Define.h" +#include "fpdfsdk/javascript/JS_EventHandler.h" +#include "fpdfsdk/javascript/JS_Object.h" +#include "fpdfsdk/javascript/JS_Value.h" +#include "fpdfsdk/javascript/PublicMethods.h" +#include "fpdfsdk/javascript/cjs_event_context.h" +#include "fpdfsdk/javascript/cjs_runtime.h" +#include "fpdfsdk/javascript/resource.h" + +#if _FX_OS_ == _FX_ANDROID_ +#include +#endif + +JSConstSpec CJS_Util::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}}; + +JSPropertySpec CJS_Util::PropertySpecs[] = {{0, 0, 0}}; + +JSMethodSpec CJS_Util::MethodSpecs[] = { + {"printd", printd_static}, {"printf", printf_static}, + {"printx", printx_static}, {"scand", scand_static}, + {"byteToChar", byteToChar_static}, {0, 0}}; + +IMPLEMENT_JS_CLASS(CJS_Util, util) + +#define UTIL_INT 0 +#define UTIL_DOUBLE 1 +#define UTIL_STRING 2 + +namespace { + +// Map PDF-style directives to equivalent wcsftime directives. Not +// all have direct equivalents, though. +struct TbConvert { + const FX_WCHAR* lpszJSMark; + const FX_WCHAR* lpszCppMark; +}; + +// Map PDF-style directives lacking direct wcsftime directives to +// the value with which they will be replaced. +struct TbConvertAdditional { + const FX_WCHAR* lpszJSMark; + int iValue; +}; + +const TbConvert TbConvertTable[] = { + {L"mmmm", L"%B"}, {L"mmm", L"%b"}, {L"mm", L"%m"}, {L"dddd", L"%A"}, + {L"ddd", L"%a"}, {L"dd", L"%d"}, {L"yyyy", L"%Y"}, {L"yy", L"%y"}, + {L"HH", L"%H"}, {L"hh", L"%I"}, {L"MM", L"%M"}, {L"ss", L"%S"}, + {L"TT", L"%p"}, +#if defined(_WIN32) + {L"tt", L"%p"}, {L"h", L"%#I"}, +#else + {L"tt", L"%P"}, {L"h", L"%l"}, +#endif +}; + +int ParseDataType(std::wstring* sFormat) { + bool bPercent = false; + for (size_t i = 0; i < sFormat->length(); ++i) { + wchar_t c = (*sFormat)[i]; + if (c == L'%') { + bPercent = true; + continue; + } + + if (bPercent) { + if (c == L'c' || c == L'C' || c == L'd' || c == L'i' || c == L'o' || + c == L'u' || c == L'x' || c == L'X') { + return UTIL_INT; + } + if (c == L'e' || c == L'E' || c == L'f' || c == L'g' || c == L'G') { + return UTIL_DOUBLE; + } + if (c == L's' || c == L'S') { + // Map s to S since we always deal internally + // with wchar_t strings. + (*sFormat)[i] = L'S'; + return UTIL_STRING; + } + if (c == L'.' || c == L'+' || c == L'-' || c == L'#' || c == L' ' || + FXSYS_iswdigit(c)) { + continue; + } + break; + } + } + + return -1; +} + +} // namespace + +util::util(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {} + +util::~util() {} + +bool util::printf(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + int iSize = params.size(); + if (iSize < 1) + return false; + std::wstring c_ConvChar(params[0].ToCFXWideString(pRuntime).c_str()); + std::vector c_strConvers; + int iOffset = 0; + int iOffend = 0; + c_ConvChar.insert(c_ConvChar.begin(), L'S'); + while (iOffset != -1) { + iOffend = c_ConvChar.find(L"%", iOffset + 1); + std::wstring strSub; + if (iOffend == -1) + strSub = c_ConvChar.substr(iOffset); + else + strSub = c_ConvChar.substr(iOffset, iOffend - iOffset); + c_strConvers.push_back(strSub); + iOffset = iOffend; + } + + std::wstring c_strResult; + std::wstring c_strFormat; + for (int iIndex = 0; iIndex < (int)c_strConvers.size(); iIndex++) { + c_strFormat = c_strConvers[iIndex]; + if (iIndex == 0) { + c_strResult = c_strFormat; + continue; + } + + CFX_WideString strSegment; + if (iIndex >= iSize) { + c_strResult += c_strFormat; + continue; + } + + switch (ParseDataType(&c_strFormat)) { + case UTIL_INT: + strSegment.Format(c_strFormat.c_str(), params[iIndex].ToInt(pRuntime)); + break; + case UTIL_DOUBLE: + strSegment.Format(c_strFormat.c_str(), + params[iIndex].ToDouble(pRuntime)); + break; + case UTIL_STRING: + strSegment.Format(c_strFormat.c_str(), + params[iIndex].ToCFXWideString(pRuntime).c_str()); + break; + default: + strSegment.Format(L"%S", c_strFormat.c_str()); + break; + } + c_strResult += strSegment.GetBuffer(strSegment.GetLength() + 1); + } + + c_strResult.erase(c_strResult.begin()); + vRet = CJS_Value(pRuntime, c_strResult.c_str()); + return true; +} + +bool util::printd(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + int iSize = params.size(); + if (iSize < 2) + return false; + + CJS_Value p1 = params[0]; + CJS_Value p2 = params[1]; + CJS_Date jsDate; + if (!p2.ConvertToDate(pRuntime, jsDate)) { + sError = JSGetStringFromID(IDS_STRING_JSPRINT1); + return false; + } + + if (!jsDate.IsValidDate(pRuntime)) { + sError = JSGetStringFromID(IDS_STRING_JSPRINT2); + return false; + } + + if (p1.GetType() == CJS_Value::VT_number) { + CFX_WideString swResult; + switch (p1.ToInt(pRuntime)) { + case 0: + swResult.Format(L"D:%04d%02d%02d%02d%02d%02d", jsDate.GetYear(pRuntime), + jsDate.GetMonth(pRuntime) + 1, jsDate.GetDay(pRuntime), + jsDate.GetHours(pRuntime), jsDate.GetMinutes(pRuntime), + jsDate.GetSeconds(pRuntime)); + break; + case 1: + swResult.Format(L"%04d.%02d.%02d %02d:%02d:%02d", + jsDate.GetYear(pRuntime), jsDate.GetMonth(pRuntime) + 1, + jsDate.GetDay(pRuntime), jsDate.GetHours(pRuntime), + jsDate.GetMinutes(pRuntime), + jsDate.GetSeconds(pRuntime)); + break; + case 2: + swResult.Format(L"%04d/%02d/%02d %02d:%02d:%02d", + jsDate.GetYear(pRuntime), jsDate.GetMonth(pRuntime) + 1, + jsDate.GetDay(pRuntime), jsDate.GetHours(pRuntime), + jsDate.GetMinutes(pRuntime), + jsDate.GetSeconds(pRuntime)); + break; + default: + sError = JSGetStringFromID(IDS_STRING_JSVALUEERROR); + return false; + } + + vRet = CJS_Value(pRuntime, swResult.c_str()); + return true; + } + + if (p1.GetType() == CJS_Value::VT_string) { + if (iSize > 2 && params[2].ToBool(pRuntime)) { + sError = JSGetStringFromID(IDS_STRING_JSNOTSUPPORT); + return false; // currently, it doesn't support XFAPicture. + } + + // Convert PDF-style format specifiers to wcsftime specifiers. Remove any + // pre-existing %-directives before inserting our own. + std::basic_string cFormat = p1.ToCFXWideString(pRuntime).c_str(); + cFormat.erase(std::remove(cFormat.begin(), cFormat.end(), '%'), + cFormat.end()); + + for (size_t i = 0; i < FX_ArraySize(TbConvertTable); ++i) { + int iStart = 0; + int iEnd; + while ((iEnd = cFormat.find(TbConvertTable[i].lpszJSMark, iStart)) != + -1) { + cFormat.replace(iEnd, FXSYS_wcslen(TbConvertTable[i].lpszJSMark), + TbConvertTable[i].lpszCppMark); + iStart = iEnd; + } + } + + int iYear = jsDate.GetYear(pRuntime); + int iMonth = jsDate.GetMonth(pRuntime); + int iDay = jsDate.GetDay(pRuntime); + int iHour = jsDate.GetHours(pRuntime); + int iMin = jsDate.GetMinutes(pRuntime); + int iSec = jsDate.GetSeconds(pRuntime); + + TbConvertAdditional cTableAd[] = { + {L"m", iMonth + 1}, {L"d", iDay}, + {L"H", iHour}, {L"h", iHour > 12 ? iHour - 12 : iHour}, + {L"M", iMin}, {L"s", iSec}, + }; + + for (size_t i = 0; i < FX_ArraySize(cTableAd); ++i) { + wchar_t tszValue[16]; + CFX_WideString sValue; + sValue.Format(L"%d", cTableAd[i].iValue); + memcpy(tszValue, (wchar_t*)sValue.GetBuffer(sValue.GetLength() + 1), + (sValue.GetLength() + 1) * sizeof(wchar_t)); + + int iStart = 0; + int iEnd; + while ((iEnd = cFormat.find(cTableAd[i].lpszJSMark, iStart)) != -1) { + if (iEnd > 0) { + if (cFormat[iEnd - 1] == L'%') { + iStart = iEnd + 1; + continue; + } + } + cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[i].lpszJSMark), tszValue); + iStart = iEnd; + } + } + + struct tm time = {}; + time.tm_year = iYear - 1900; + time.tm_mon = iMonth; + time.tm_mday = iDay; + time.tm_hour = iHour; + time.tm_min = iMin; + time.tm_sec = iSec; + + wchar_t buf[64] = {}; + wcsftime(buf, 64, cFormat.c_str(), &time); + cFormat = buf; + vRet = CJS_Value(pRuntime, cFormat.c_str()); + return true; + } + + sError = JSGetStringFromID(IDS_STRING_JSTYPEERROR); + return false; +} + +bool util::printx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() < 2) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + vRet = CJS_Value(pRuntime, printx(params[0].ToCFXWideString(pRuntime), + params[1].ToCFXWideString(pRuntime)) + .c_str()); + + return true; +} + +enum CaseMode { kPreserveCase, kUpperCase, kLowerCase }; + +static FX_WCHAR TranslateCase(FX_WCHAR input, CaseMode eMode) { + if (eMode == kLowerCase && input >= 'A' && input <= 'Z') + return input | 0x20; + if (eMode == kUpperCase && input >= 'a' && input <= 'z') + return input & ~0x20; + return input; +} + +CFX_WideString util::printx(const CFX_WideString& wsFormat, + const CFX_WideString& wsSource) { + CFX_WideString wsResult; + FX_STRSIZE iSourceIdx = 0; + FX_STRSIZE iFormatIdx = 0; + CaseMode eCaseMode = kPreserveCase; + bool bEscaped = false; + while (iFormatIdx < wsFormat.GetLength()) { + if (bEscaped) { + bEscaped = false; + wsResult += wsFormat[iFormatIdx]; + ++iFormatIdx; + continue; + } + switch (wsFormat[iFormatIdx]) { + case '\\': { + bEscaped = true; + ++iFormatIdx; + } break; + case '<': { + eCaseMode = kLowerCase; + ++iFormatIdx; + } break; + case '>': { + eCaseMode = kUpperCase; + ++iFormatIdx; + } break; + case '=': { + eCaseMode = kPreserveCase; + ++iFormatIdx; + } break; + case '?': { + if (iSourceIdx < wsSource.GetLength()) { + wsResult += TranslateCase(wsSource[iSourceIdx], eCaseMode); + ++iSourceIdx; + } + ++iFormatIdx; + } break; + case 'X': { + if (iSourceIdx < wsSource.GetLength()) { + if ((wsSource[iSourceIdx] >= '0' && wsSource[iSourceIdx] <= '9') || + (wsSource[iSourceIdx] >= 'a' && wsSource[iSourceIdx] <= 'z') || + (wsSource[iSourceIdx] >= 'A' && wsSource[iSourceIdx] <= 'Z')) { + wsResult += TranslateCase(wsSource[iSourceIdx], eCaseMode); + ++iFormatIdx; + } + ++iSourceIdx; + } else { + ++iFormatIdx; + } + } break; + case 'A': { + if (iSourceIdx < wsSource.GetLength()) { + if ((wsSource[iSourceIdx] >= 'a' && wsSource[iSourceIdx] <= 'z') || + (wsSource[iSourceIdx] >= 'A' && wsSource[iSourceIdx] <= 'Z')) { + wsResult += TranslateCase(wsSource[iSourceIdx], eCaseMode); + ++iFormatIdx; + } + ++iSourceIdx; + } else { + ++iFormatIdx; + } + } break; + case '9': { + if (iSourceIdx < wsSource.GetLength()) { + if (wsSource[iSourceIdx] >= '0' && wsSource[iSourceIdx] <= '9') { + wsResult += wsSource[iSourceIdx]; + ++iFormatIdx; + } + ++iSourceIdx; + } else { + ++iFormatIdx; + } + } break; + case '*': { + if (iSourceIdx < wsSource.GetLength()) { + wsResult += TranslateCase(wsSource[iSourceIdx], eCaseMode); + ++iSourceIdx; + } else { + ++iFormatIdx; + } + } break; + default: { + wsResult += wsFormat[iFormatIdx]; + ++iFormatIdx; + } break; + } + } + return wsResult; +} + +bool util::scand(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + int iSize = params.size(); + if (iSize < 2) + return false; + + CFX_WideString sFormat = params[0].ToCFXWideString(pRuntime); + CFX_WideString sDate = params[1].ToCFXWideString(pRuntime); + double dDate = JS_GetDateTime(); + if (sDate.GetLength() > 0) { + dDate = CJS_PublicMethods::MakeRegularDate(sDate, sFormat, nullptr); + } + + if (!JS_PortIsNan(dDate)) { + vRet = CJS_Value(pRuntime, CJS_Date(pRuntime, dDate)); + } else { + vRet.SetNull(pRuntime); + } + + return true; +} + +bool util::byteToChar(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError) { + if (params.size() < 1) { + sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR); + return false; + } + + int arg = params[0].ToInt(pRuntime); + if (arg < 0 || arg > 255) { + sError = JSGetStringFromID(IDS_STRING_JSVALUEERROR); + return false; + } + + CFX_WideString wStr(static_cast(arg)); + vRet = CJS_Value(pRuntime, wStr.c_str()); + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/javascript/util.h b/modules/pdfium/pdfium/fpdfsdk/javascript/util.h new file mode 100644 index 000000000000..98761b6f30b5 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/javascript/util.h @@ -0,0 +1,59 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_JAVASCRIPT_UTIL_H_ +#define FPDFSDK_JAVASCRIPT_UTIL_H_ + +#include +#include + +#include "fpdfsdk/javascript/JS_Define.h" + +class util : public CJS_EmbedObj { + public: + explicit util(CJS_Object* pJSObject); + ~util() override; + + bool printd(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool printf(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool printx(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool scand(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + bool byteToChar(CJS_Runtime* pRuntime, + const std::vector& params, + CJS_Value& vRet, + CFX_WideString& sError); + + static CFX_WideString printx(const CFX_WideString& cFormat, + const CFX_WideString& cSource); +}; + +class CJS_Util : public CJS_Object { + public: + explicit CJS_Util(v8::Local pObject) : CJS_Object(pObject) {} + ~CJS_Util() override {} + + DECLARE_JS_CLASS(); + + JS_STATIC_METHOD(printd, util); + JS_STATIC_METHOD(printf, util); + JS_STATIC_METHOD(printx, util); + JS_STATIC_METHOD(scand, util); + JS_STATIC_METHOD(byteToChar, util); +}; + +#endif // FPDFSDK_JAVASCRIPT_UTIL_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfsdk_fieldaction.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfsdk_fieldaction.cpp new file mode 100644 index 000000000000..61228ea82a71 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfsdk_fieldaction.cpp @@ -0,0 +1,18 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/pdfsdk_fieldaction.h" + +PDFSDK_FieldAction::PDFSDK_FieldAction() + : bModifier(false), + bShift(false), + nCommitKey(0), + bKeyDown(false), + nSelEnd(0), + nSelStart(0), + bWillCommit(false), + bFieldFull(false), + bRC(true) {} diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfsdk_fieldaction.h b/modules/pdfium/pdfium/fpdfsdk/pdfsdk_fieldaction.h new file mode 100644 index 000000000000..4ee56ac3f698 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfsdk_fieldaction.h @@ -0,0 +1,39 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFSDK_FIELDACTION_H_ +#define FPDFSDK_PDFSDK_FIELDACTION_H_ + +#include "core/fxcrt/fx_string.h" + +#ifdef PDF_ENABLE_XFA +typedef enum { + PDFSDK_XFA_Click = 0, + PDFSDK_XFA_Full, + PDFSDK_XFA_PreOpen, + PDFSDK_XFA_PostOpen +} PDFSDK_XFAAActionType; +#endif // PDF_ENABLE_XFA + +struct PDFSDK_FieldAction { + PDFSDK_FieldAction(); + PDFSDK_FieldAction(const PDFSDK_FieldAction& other) = delete; + + bool bModifier; + bool bShift; + int nCommitKey; + CFX_WideString sChange; + CFX_WideString sChangeEx; + bool bKeyDown; + int nSelEnd; + int nSelStart; + CFX_WideString sValue; + bool bWillCommit; + bool bFieldFull; + bool bRC; +}; + +#endif // FPDFSDK_PDFSDK_FIELDACTION_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Button.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Button.cpp new file mode 100644 index 000000000000..96be4694548d --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Button.cpp @@ -0,0 +1,39 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/pdfwindow/PWL_Button.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +CPWL_Button::CPWL_Button() : m_bMouseDown(false) {} + +CPWL_Button::~CPWL_Button() {} + +CFX_ByteString CPWL_Button::GetClassName() const { + return "CPWL_Button"; +} + +void CPWL_Button::OnCreate(PWL_CREATEPARAM& cp) { + cp.eCursorType = FXCT_HAND; +} + +bool CPWL_Button::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonDown(point, nFlag); + + m_bMouseDown = true; + SetCapture(); + + return true; +} + +bool CPWL_Button::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonUp(point, nFlag); + + ReleaseCapture(); + m_bMouseDown = false; + + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Button.h b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Button.h new file mode 100644 index 000000000000..2d1193f89d50 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Button.h @@ -0,0 +1,27 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFWINDOW_PWL_BUTTON_H_ +#define FPDFSDK_PDFWINDOW_PWL_BUTTON_H_ + +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +class CPWL_Button : public CPWL_Wnd { + public: + CPWL_Button(); + ~CPWL_Button() override; + + // CPWL_Wnd + CFX_ByteString GetClassName() const override; + void OnCreate(PWL_CREATEPARAM& cp) override; + bool OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) override; + bool OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) override; + + protected: + bool m_bMouseDown; +}; + +#endif // FPDFSDK_PDFWINDOW_PWL_BUTTON_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Caret.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Caret.cpp new file mode 100644 index 000000000000..3360bbf62a5d --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Caret.cpp @@ -0,0 +1,147 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/pdfwindow/PWL_Caret.h" + +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +#define PWL_CARET_FLASHINTERVAL 500 + +PWL_CARET_INFO::PWL_CARET_INFO() : bVisible(false) {} + +CPWL_Caret::CPWL_Caret() : m_bFlash(false), m_fWidth(0.4f), m_nDelay(0) {} + +CPWL_Caret::~CPWL_Caret() {} + +CFX_ByteString CPWL_Caret::GetClassName() const { + return "CPWL_Caret"; +} + +void CPWL_Caret::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { + GetCaretApp(sAppStream, CFX_PointF()); +} + +void CPWL_Caret::DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + if (IsVisible() && m_bFlash) { + CFX_FloatRect rcRect = GetCaretRect(); + CFX_FloatRect rcClip = GetClipRect(); + CFX_PathData path; + + FX_FLOAT fCaretX = rcRect.left + m_fWidth * 0.5f; + FX_FLOAT fCaretTop = rcRect.top; + FX_FLOAT fCaretBottom = rcRect.bottom; + if (!rcClip.IsEmpty()) { + rcRect.Intersect(rcClip); + if (rcRect.IsEmpty()) + return; + + fCaretTop = rcRect.top; + fCaretBottom = rcRect.bottom; + } + + path.AppendPoint(CFX_PointF(fCaretX, fCaretBottom), FXPT_TYPE::MoveTo, + false); + path.AppendPoint(CFX_PointF(fCaretX, fCaretTop), FXPT_TYPE::LineTo, false); + + CFX_GraphStateData gsd; + gsd.m_LineWidth = m_fWidth; + pDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255, 0, 0, 0), + FXFILL_ALTERNATE); + } +} + +void CPWL_Caret::GetCaretApp(CFX_ByteTextBuf& sAppStream, + const CFX_PointF& ptOffset) { + if (IsVisible() && m_bFlash) { + CFX_ByteTextBuf sCaret; + + CFX_FloatRect rcRect = GetCaretRect(); + CFX_FloatRect rcClip = GetClipRect(); + + rcRect = CPWL_Utils::OffsetRect(rcRect, ptOffset.x, ptOffset.y); + rcClip = CPWL_Utils::OffsetRect(rcClip, ptOffset.x, ptOffset.y); + + sCaret << "q\n"; + if (!rcClip.IsEmpty()) { + sCaret << rcClip.left << " " << rcClip.bottom + 2.5f << " " + << rcClip.right - rcClip.left << " " + << rcClip.top - rcClip.bottom - 4.5f << " re W n\n"; + } + sCaret << m_fWidth << " w\n0 G\n"; + sCaret << rcRect.left + m_fWidth / 2 << " " << rcRect.bottom << " m\n"; + sCaret << rcRect.left + m_fWidth / 2 << " " << rcRect.top << " l S\nQ\n"; + + sAppStream << sCaret; + } +} + +CFX_ByteString CPWL_Caret::GetCaretAppearanceStream( + const CFX_PointF& ptOffset) { + CFX_ByteTextBuf sCaret; + GetCaretApp(sCaret, ptOffset); + return sCaret.MakeString(); +} + +void CPWL_Caret::TimerProc() { + if (m_nDelay > 0) { + m_nDelay--; + } else { + m_bFlash = !m_bFlash; + InvalidateRect(); + } +} + +CFX_FloatRect CPWL_Caret::GetCaretRect() const { + return CFX_FloatRect(m_ptFoot.x, m_ptFoot.y, m_ptHead.x + m_fWidth, + m_ptHead.y); +} + +void CPWL_Caret::SetCaret(bool bVisible, + const CFX_PointF& ptHead, + const CFX_PointF& ptFoot) { + if (bVisible) { + if (IsVisible()) { + if (m_ptHead != ptHead || m_ptFoot != ptFoot) { + m_ptHead = ptHead; + m_ptFoot = ptFoot; + m_bFlash = true; + Move(m_rcInvalid, false, true); + } + } else { + m_ptHead = ptHead; + m_ptFoot = ptFoot; + EndTimer(); + BeginTimer(PWL_CARET_FLASHINTERVAL); + CPWL_Wnd::SetVisible(true); + m_bFlash = true; + Move(m_rcInvalid, false, true); + } + } else { + m_ptHead = CFX_PointF(); + m_ptFoot = CFX_PointF(); + m_bFlash = false; + if (IsVisible()) { + EndTimer(); + CPWL_Wnd::SetVisible(false); + } + } +} + +void CPWL_Caret::InvalidateRect(CFX_FloatRect* pRect) { + if (pRect) { + CFX_FloatRect rcRefresh = CPWL_Utils::InflateRect(*pRect, 0.5f); + rcRefresh.top += 1; + rcRefresh.bottom -= 1; + CPWL_Wnd::InvalidateRect(&rcRefresh); + } else { + CPWL_Wnd::InvalidateRect(pRect); + } +} diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Caret.h b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Caret.h new file mode 100644 index 000000000000..60ebbdc8e1e5 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Caret.h @@ -0,0 +1,53 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFWINDOW_PWL_CARET_H_ +#define FPDFSDK_PDFWINDOW_PWL_CARET_H_ + +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +struct PWL_CARET_INFO { + public: + PWL_CARET_INFO(); + + bool bVisible; + CFX_PointF ptHead; + CFX_PointF ptFoot; +}; + +class CPWL_Caret : public CPWL_Wnd { + public: + CPWL_Caret(); + ~CPWL_Caret() override; + + // CPWL_Wnd + CFX_ByteString GetClassName() const override; + void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override; + void DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) override; + void InvalidateRect(CFX_FloatRect* pRect = nullptr) override; + void SetVisible(bool bVisible) override {} + void TimerProc() override; + + void SetCaret(bool bVisible, + const CFX_PointF& ptHead, + const CFX_PointF& ptFoot); + CFX_ByteString GetCaretAppearanceStream(const CFX_PointF& ptOffset); + void SetInvalidRect(CFX_FloatRect rc) { m_rcInvalid = rc; } + + private: + void GetCaretApp(CFX_ByteTextBuf& sAppStream, const CFX_PointF& ptOffset); + CFX_FloatRect GetCaretRect() const; + + bool m_bFlash; + CFX_PointF m_ptHead; + CFX_PointF m_ptFoot; + FX_FLOAT m_fWidth; + int32_t m_nDelay; + CFX_FloatRect m_rcInvalid; +}; + +#endif // FPDFSDK_PDFWINDOW_PWL_CARET_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ComboBox.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ComboBox.cpp new file mode 100644 index 000000000000..bc6909a07dde --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ComboBox.cpp @@ -0,0 +1,626 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/pdfwindow/PWL_ComboBox.h" + +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "fpdfsdk/fxedit/fxet_list.h" +#include "fpdfsdk/pdfwindow/PWL_Edit.h" +#include "fpdfsdk/pdfwindow/PWL_EditCtrl.h" +#include "fpdfsdk/pdfwindow/PWL_ListBox.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" +#include "public/fpdf_fwlevent.h" + +#define PWLCB_DEFAULTFONTSIZE 12.0f + +bool CPWL_CBListBox::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonUp(point, nFlag); + + if (!m_bMouseDown) + return true; + + ReleaseCapture(); + m_bMouseDown = false; + + if (!ClientHitTest(point)) + return true; + if (CPWL_Wnd* pParent = GetParentWindow()) + pParent->OnNotify(this, PNM_LBUTTONUP, 0, PWL_MAKEDWORD(point.x, point.y)); + + bool bExit = false; + OnNotifySelChanged(false, bExit, nFlag); + + return !bExit; +} + +bool CPWL_CBListBox::OnKeyDownWithExit(uint16_t nChar, + bool& bExit, + uint32_t nFlag) { + switch (nChar) { + case FWL_VKEY_Up: + case FWL_VKEY_Down: + case FWL_VKEY_Home: + case FWL_VKEY_Left: + case FWL_VKEY_End: + case FWL_VKEY_Right: + break; + default: + return false; + } + + switch (nChar) { + case FWL_VKEY_Up: + m_pList->OnVK_UP(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Down: + m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Home: + m_pList->OnVK_HOME(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Left: + m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_End: + m_pList->OnVK_END(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Right: + m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Delete: + break; + } + + OnNotifySelChanged(true, bExit, nFlag); + + return true; +} + +bool CPWL_CBListBox::OnCharWithExit(uint16_t nChar, + bool& bExit, + uint32_t nFlag) { + if (!m_pList->OnChar(nChar, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag))) + return false; + if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetParentWindow()) + pComboBox->SetSelectText(); + + OnNotifySelChanged(true, bExit, nFlag); + + return true; +} + +void CPWL_CBButton::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { + CPWL_Wnd::GetThisAppearanceStream(sAppStream); + + CFX_FloatRect rectWnd = CPWL_Wnd::GetWindowRect(); + + if (IsVisible() && !rectWnd.IsEmpty()) { + CFX_ByteTextBuf sButton; + + CFX_PointF ptCenter = GetCenterPoint(); + + CFX_PointF pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN, + ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); + CFX_PointF pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN, + ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); + CFX_PointF pt3(ptCenter.x, + ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); + + if (IsFloatBigger(rectWnd.right - rectWnd.left, + PWL_CBBUTTON_TRIANGLE_HALFLEN * 2) && + IsFloatBigger(rectWnd.top - rectWnd.bottom, + PWL_CBBUTTON_TRIANGLE_HALFLEN)) { + sButton << "0 g\n"; + sButton << pt1.x << " " << pt1.y << " m\n"; + sButton << pt2.x << " " << pt2.y << " l\n"; + sButton << pt3.x << " " << pt3.y << " l\n"; + sButton << pt1.x << " " << pt1.y << " l f\n"; + + sAppStream << "q\n" << sButton << "Q\n"; + } + } +} + +void CPWL_CBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); + + CFX_FloatRect rectWnd = CPWL_Wnd::GetWindowRect(); + + if (IsVisible() && !rectWnd.IsEmpty()) { + CFX_PointF ptCenter = GetCenterPoint(); + + CFX_PointF pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN, + ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); + CFX_PointF pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN, + ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); + CFX_PointF pt3(ptCenter.x, + ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f); + + if (IsFloatBigger(rectWnd.right - rectWnd.left, + PWL_CBBUTTON_TRIANGLE_HALFLEN * 2) && + IsFloatBigger(rectWnd.top - rectWnd.bottom, + PWL_CBBUTTON_TRIANGLE_HALFLEN)) { + CFX_PathData path; + path.AppendPoint(pt1, FXPT_TYPE::MoveTo, false); + path.AppendPoint(pt2, FXPT_TYPE::LineTo, false); + path.AppendPoint(pt3, FXPT_TYPE::LineTo, false); + path.AppendPoint(pt1, FXPT_TYPE::LineTo, false); + + pDevice->DrawPath(&path, pUser2Device, nullptr, + PWL_DEFAULT_BLACKCOLOR.ToFXColor(GetTransparency()), 0, + FXFILL_ALTERNATE); + } + } +} + +bool CPWL_CBButton::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonDown(point, nFlag); + + SetCapture(); + + if (CPWL_Wnd* pParent = GetParentWindow()) { + pParent->OnNotify(this, PNM_LBUTTONDOWN, 0, + PWL_MAKEDWORD(point.x, point.y)); + } + + return true; +} + +bool CPWL_CBButton::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonUp(point, nFlag); + + ReleaseCapture(); + + return true; +} + +CPWL_ComboBox::CPWL_ComboBox() + : m_pEdit(nullptr), + m_pButton(nullptr), + m_pList(nullptr), + m_bPopup(false), + m_nPopupWhere(0), + m_nSelectItem(-1), + m_pFillerNotify(nullptr) {} + +CFX_ByteString CPWL_ComboBox::GetClassName() const { + return "CPWL_ComboBox"; +} + +void CPWL_ComboBox::OnCreate(PWL_CREATEPARAM& cp) { + cp.dwFlags &= ~PWS_HSCROLL; + cp.dwFlags &= ~PWS_VSCROLL; +} + +void CPWL_ComboBox::SetFocus() { + if (m_pEdit) + m_pEdit->SetFocus(); +} + +void CPWL_ComboBox::KillFocus() { + SetPopup(false); + CPWL_Wnd::KillFocus(); +} + +CFX_WideString CPWL_ComboBox::GetText() const { + if (m_pEdit) { + return m_pEdit->GetText(); + } + return CFX_WideString(); +} + +void CPWL_ComboBox::SetText(const CFX_WideString& text) { + if (m_pEdit) + m_pEdit->SetText(text); +} + +void CPWL_ComboBox::AddString(const CFX_WideString& str) { + if (m_pList) + m_pList->AddString(str); +} + +int32_t CPWL_ComboBox::GetSelect() const { + return m_nSelectItem; +} + +void CPWL_ComboBox::SetSelect(int32_t nItemIndex) { + if (m_pList) + m_pList->Select(nItemIndex); + + m_pEdit->SetText(m_pList->GetText()); + m_nSelectItem = nItemIndex; +} + +void CPWL_ComboBox::SetEditSel(int32_t nStartChar, int32_t nEndChar) { + if (m_pEdit) + m_pEdit->SetSel(nStartChar, nEndChar); +} + +void CPWL_ComboBox::GetEditSel(int32_t& nStartChar, int32_t& nEndChar) const { + nStartChar = -1; + nEndChar = -1; + + if (m_pEdit) + m_pEdit->GetSel(nStartChar, nEndChar); +} + +void CPWL_ComboBox::Clear() { + if (m_pEdit) + m_pEdit->Clear(); +} + +void CPWL_ComboBox::CreateChildWnd(const PWL_CREATEPARAM& cp) { + CreateEdit(cp); + CreateButton(cp); + CreateListBox(cp); +} + +void CPWL_ComboBox::CreateEdit(const PWL_CREATEPARAM& cp) { + if (!m_pEdit) { + m_pEdit = new CPWL_CBEdit; + m_pEdit->AttachFFLData(m_pFormFiller); + + PWL_CREATEPARAM ecp = cp; + ecp.pParentWnd = this; + ecp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PES_CENTER | + PES_AUTOSCROLL | PES_UNDO; + + if (HasFlag(PWS_AUTOFONTSIZE)) + ecp.dwFlags |= PWS_AUTOFONTSIZE; + + if (!HasFlag(PCBS_ALLOWCUSTOMTEXT)) + ecp.dwFlags |= PWS_READONLY; + + ecp.rcRectWnd = CFX_FloatRect(0, 0, 0, 0); + ecp.dwBorderWidth = 0; + ecp.nBorderStyle = BorderStyle::SOLID; + + m_pEdit->Create(ecp); + } +} + +void CPWL_ComboBox::CreateButton(const PWL_CREATEPARAM& cp) { + if (!m_pButton) { + m_pButton = new CPWL_CBButton; + + PWL_CREATEPARAM bcp = cp; + bcp.pParentWnd = this; + bcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND; + bcp.sBackgroundColor = PWL_SCROLLBAR_BKCOLOR; + bcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR; + bcp.dwBorderWidth = 2; + bcp.nBorderStyle = BorderStyle::BEVELED; + bcp.eCursorType = FXCT_ARROW; + + m_pButton->Create(bcp); + } +} + +void CPWL_ComboBox::CreateListBox(const PWL_CREATEPARAM& cp) { + if (!m_pList) { + m_pList = new CPWL_CBListBox; + m_pList->AttachFFLData(m_pFormFiller); + PWL_CREATEPARAM lcp = cp; + lcp.pParentWnd = this; + lcp.dwFlags = + PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PLBS_HOVERSEL | PWS_VSCROLL; + lcp.nBorderStyle = BorderStyle::SOLID; + lcp.dwBorderWidth = 1; + lcp.eCursorType = FXCT_ARROW; + lcp.rcRectWnd = CFX_FloatRect(0, 0, 0, 0); + + if (cp.dwFlags & PWS_AUTOFONTSIZE) + lcp.fFontSize = PWLCB_DEFAULTFONTSIZE; + else + lcp.fFontSize = cp.fFontSize; + + if (cp.sBorderColor.nColorType == COLORTYPE_TRANSPARENT) + lcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR; + + if (cp.sBackgroundColor.nColorType == COLORTYPE_TRANSPARENT) + lcp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR; + + m_pList->Create(lcp); + } +} + +void CPWL_ComboBox::RePosChildWnd() { + CFX_FloatRect rcClient = GetClientRect(); + + if (m_bPopup) { + CFX_FloatRect rclient = GetClientRect(); + CFX_FloatRect rcButton = rclient; + CFX_FloatRect rcEdit = rcClient; + CFX_FloatRect rcList = CPWL_Wnd::GetWindowRect(); + + FX_FLOAT fOldWindowHeight = m_rcOldWindow.Height(); + FX_FLOAT fOldClientHeight = fOldWindowHeight - GetBorderWidth() * 2; + + switch (m_nPopupWhere) { + case 0: + rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH; + + if (rcButton.left < rclient.left) + rcButton.left = rclient.left; + + rcButton.bottom = rcButton.top - fOldClientHeight; + + rcEdit.right = rcButton.left - 1.0f; + + if (rcEdit.left < rclient.left) + rcEdit.left = rclient.left; + + if (rcEdit.right < rcEdit.left) + rcEdit.right = rcEdit.left; + + rcEdit.bottom = rcEdit.top - fOldClientHeight; + + rcList.top -= fOldWindowHeight; + + break; + case 1: + rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH; + + if (rcButton.left < rclient.left) + rcButton.left = rclient.left; + + rcButton.top = rcButton.bottom + fOldClientHeight; + + rcEdit.right = rcButton.left - 1.0f; + + if (rcEdit.left < rclient.left) + rcEdit.left = rclient.left; + + if (rcEdit.right < rcEdit.left) + rcEdit.right = rcEdit.left; + + rcEdit.top = rcEdit.bottom + fOldClientHeight; + + rcList.bottom += fOldWindowHeight; + + break; + } + + if (m_pButton) + m_pButton->Move(rcButton, true, false); + + if (m_pEdit) + m_pEdit->Move(rcEdit, true, false); + + if (m_pList) { + m_pList->SetVisible(true); + m_pList->Move(rcList, true, false); + m_pList->ScrollToListItem(m_nSelectItem); + } + } else { + CFX_FloatRect rcButton = rcClient; + + rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH; + + if (rcButton.left < rcClient.left) + rcButton.left = rcClient.left; + + if (m_pButton) + m_pButton->Move(rcButton, true, false); + + CFX_FloatRect rcEdit = rcClient; + rcEdit.right = rcButton.left - 1.0f; + + if (rcEdit.left < rcClient.left) + rcEdit.left = rcClient.left; + + if (rcEdit.right < rcEdit.left) + rcEdit.right = rcEdit.left; + + if (m_pEdit) + m_pEdit->Move(rcEdit, true, false); + + if (m_pList) + m_pList->SetVisible(false); + } +} + +void CPWL_ComboBox::SelectAll() { + if (m_pEdit && HasFlag(PCBS_ALLOWCUSTOMTEXT)) + m_pEdit->SelectAll(); +} + +CFX_FloatRect CPWL_ComboBox::GetFocusRect() const { + return CFX_FloatRect(); +} + +void CPWL_ComboBox::SetPopup(bool bPopup) { + if (!m_pList) + return; + if (bPopup == m_bPopup) + return; + FX_FLOAT fListHeight = m_pList->GetContentRect().Height(); + if (!IsFloatBigger(fListHeight, 0.0f)) + return; + + if (bPopup) { + if (m_pFillerNotify) { +#ifdef PDF_ENABLE_XFA + bool bExit = false; + m_pFillerNotify->OnPopupPreOpen(GetAttachedData(), bExit, 0); + if (bExit) + return; +#endif // PDF_ENABLE_XFA + int32_t nWhere = 0; + FX_FLOAT fPopupRet = 0.0f; + FX_FLOAT fPopupMin = 0.0f; + if (m_pList->GetCount() > 3) + fPopupMin = + m_pList->GetFirstHeight() * 3 + m_pList->GetBorderWidth() * 2; + FX_FLOAT fPopupMax = fListHeight + m_pList->GetBorderWidth() * 2; + m_pFillerNotify->QueryWherePopup(GetAttachedData(), fPopupMin, fPopupMax, + nWhere, fPopupRet); + + if (IsFloatBigger(fPopupRet, 0.0f)) { + m_bPopup = bPopup; + + CFX_FloatRect rcWindow = CPWL_Wnd::GetWindowRect(); + m_rcOldWindow = rcWindow; + switch (nWhere) { + default: + case 0: + rcWindow.bottom -= fPopupRet; + break; + case 1: + rcWindow.top += fPopupRet; + break; + } + + m_nPopupWhere = nWhere; + Move(rcWindow, true, true); +#ifdef PDF_ENABLE_XFA + bExit = false; + m_pFillerNotify->OnPopupPostOpen(GetAttachedData(), bExit, 0); + if (bExit) + return; +#endif // PDF_ENABLE_XFA + } + } + } else { + m_bPopup = bPopup; + Move(m_rcOldWindow, true, true); + } +} + +bool CPWL_ComboBox::OnKeyDown(uint16_t nChar, uint32_t nFlag) { + if (!m_pList) + return false; + if (!m_pEdit) + return false; + + m_nSelectItem = -1; + + switch (nChar) { + case FWL_VKEY_Up: + if (m_pList->GetCurSel() > 0) { + bool bExit = false; +#ifdef PDF_ENABLE_XFA + if (m_pFillerNotify) { + m_pFillerNotify->OnPopupPreOpen(GetAttachedData(), bExit, nFlag); + if (bExit) + return false; + bExit = false; + m_pFillerNotify->OnPopupPostOpen(GetAttachedData(), bExit, nFlag); + if (bExit) + return false; + } +#endif // PDF_ENABLE_XFA + if (m_pList->OnKeyDownWithExit(nChar, bExit, nFlag)) { + if (bExit) + return false; + SetSelectText(); + } + } + return true; + case FWL_VKEY_Down: + if (m_pList->GetCurSel() < m_pList->GetCount() - 1) { + bool bExit = false; +#ifdef PDF_ENABLE_XFA + if (m_pFillerNotify) { + m_pFillerNotify->OnPopupPreOpen(GetAttachedData(), bExit, nFlag); + if (bExit) + return false; + bExit = false; + m_pFillerNotify->OnPopupPostOpen(GetAttachedData(), bExit, nFlag); + if (bExit) + return false; + } +#endif // PDF_ENABLE_XFA + if (m_pList->OnKeyDownWithExit(nChar, bExit, nFlag)) { + if (bExit) + return false; + SetSelectText(); + } + } + return true; + } + + if (HasFlag(PCBS_ALLOWCUSTOMTEXT)) + return m_pEdit->OnKeyDown(nChar, nFlag); + + return false; +} + +bool CPWL_ComboBox::OnChar(uint16_t nChar, uint32_t nFlag) { + if (!m_pList) + return false; + + if (!m_pEdit) + return false; + + m_nSelectItem = -1; + if (HasFlag(PCBS_ALLOWCUSTOMTEXT)) + return m_pEdit->OnChar(nChar, nFlag); + + bool bExit = false; +#ifdef PDF_ENABLE_XFA + if (m_pFillerNotify) { + m_pFillerNotify->OnPopupPreOpen(GetAttachedData(), bExit, nFlag); + if (bExit) + return false; + + m_pFillerNotify->OnPopupPostOpen(GetAttachedData(), bExit, nFlag); + if (bExit) + return false; + } +#endif // PDF_ENABLE_XFA + return m_pList->OnCharWithExit(nChar, bExit, nFlag) ? bExit : false; +} + +void CPWL_ComboBox::OnNotify(CPWL_Wnd* pWnd, + uint32_t msg, + intptr_t wParam, + intptr_t lParam) { + switch (msg) { + case PNM_LBUTTONDOWN: + if (pWnd == m_pButton) { + SetPopup(!m_bPopup); + return; + } + break; + case PNM_LBUTTONUP: + if (m_pEdit && m_pList) { + if (pWnd == m_pList) { + SetSelectText(); + SelectAll(); + m_pEdit->SetFocus(); + SetPopup(false); + return; + } + } + } + + CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); +} + +bool CPWL_ComboBox::IsPopup() const { + return m_bPopup; +} + +void CPWL_ComboBox::SetSelectText() { + m_pEdit->SelectAll(); + m_pEdit->ReplaceSel(m_pList->GetText()); + m_pEdit->SelectAll(); + m_nSelectItem = m_pList->GetCurSel(); +} + +void CPWL_ComboBox::SetFillerNotify(IPWL_Filler_Notify* pNotify) { + m_pFillerNotify = pNotify; + + if (m_pEdit) + m_pEdit->SetFillerNotify(pNotify); + + if (m_pList) + m_pList->SetFillerNotify(pNotify); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ComboBox.h b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ComboBox.h new file mode 100644 index 000000000000..e1a8df7561a8 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ComboBox.h @@ -0,0 +1,104 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFWINDOW_PWL_COMBOBOX_H_ +#define FPDFSDK_PDFWINDOW_PWL_COMBOBOX_H_ + +#include "fpdfsdk/pdfwindow/PWL_Edit.h" +#include "fpdfsdk/pdfwindow/PWL_ListBox.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +class CPWL_CBEdit : public CPWL_Edit { + public: + CPWL_CBEdit() {} + ~CPWL_CBEdit() override {} +}; + +class CPWL_CBListBox : public CPWL_ListBox { + public: + CPWL_CBListBox() {} + ~CPWL_CBListBox() override {} + + // CPWL_ListBox + bool OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) override; + + bool OnKeyDownWithExit(uint16_t nChar, bool& bExit, uint32_t nFlag); + bool OnCharWithExit(uint16_t nChar, bool& bExit, uint32_t nFlag); +}; + +#define PWL_COMBOBOX_BUTTON_WIDTH 13 + +class CPWL_CBButton : public CPWL_Wnd { + public: + CPWL_CBButton() {} + ~CPWL_CBButton() override {} + + // CPWL_Wnd + void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override; + void DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) override; + bool OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) override; + bool OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) override; +}; + +class CPWL_ComboBox : public CPWL_Wnd { + public: + CPWL_ComboBox(); + ~CPWL_ComboBox() override {} + + CPWL_Edit* GetEdit() const { return m_pEdit; } + + // CPWL_Wnd: + CFX_ByteString GetClassName() const override; + void OnCreate(PWL_CREATEPARAM& cp) override; + bool OnKeyDown(uint16_t nChar, uint32_t nFlag) override; + bool OnChar(uint16_t nChar, uint32_t nFlag) override; + void OnNotify(CPWL_Wnd* pWnd, + uint32_t msg, + intptr_t wParam = 0, + intptr_t lParam = 0) override; + void CreateChildWnd(const PWL_CREATEPARAM& cp) override; + void RePosChildWnd() override; + CFX_FloatRect GetFocusRect() const override; + void SetFocus() override; + void KillFocus() override; + + void SetFillerNotify(IPWL_Filler_Notify* pNotify); + + CFX_WideString GetText() const; + void SetText(const CFX_WideString& text); + void AddString(const CFX_WideString& str); + int32_t GetSelect() const; + void SetSelect(int32_t nItemIndex); + + void SetEditSel(int32_t nStartChar, int32_t nEndChar); + void GetEditSel(int32_t& nStartChar, int32_t& nEndChar) const; + void Clear(); + void SelectAll(); + bool IsPopup() const; + + void SetSelectText(); + + void AttachFFLData(CFFL_FormFiller* pData) { m_pFormFiller = pData; } + + private: + void CreateEdit(const PWL_CREATEPARAM& cp); + void CreateButton(const PWL_CREATEPARAM& cp); + void CreateListBox(const PWL_CREATEPARAM& cp); + void SetPopup(bool bPopup); + + CPWL_CBEdit* m_pEdit; + CPWL_CBButton* m_pButton; + CPWL_CBListBox* m_pList; + bool m_bPopup; + CFX_FloatRect m_rcOldWindow; + int32_t m_nPopupWhere; + int32_t m_nSelectItem; + IPWL_Filler_Notify* m_pFillerNotify; + CFFL_FormFiller* m_pFormFiller; // Not owned. +}; + +#endif // FPDFSDK_PDFWINDOW_PWL_COMBOBOX_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Edit.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Edit.cpp new file mode 100644 index 000000000000..b77aad9ab045 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Edit.cpp @@ -0,0 +1,878 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/pdfwindow/PWL_Edit.h" + +#include +#include + +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfdoc/cpvt_word.h" +#include "core/fxcrt/fx_safe_types.h" +#include "core/fxcrt/fx_xml.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "core/fxge/fx_font.h" +#include "fpdfsdk/fxedit/fxet_edit.h" +#include "fpdfsdk/pdfwindow/PWL_Caret.h" +#include "fpdfsdk/pdfwindow/PWL_EditCtrl.h" +#include "fpdfsdk/pdfwindow/PWL_FontMap.h" +#include "fpdfsdk/pdfwindow/PWL_ScrollBar.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" +#include "public/fpdf_fwlevent.h" +#include "third_party/base/stl_util.h" + +CPWL_Edit::CPWL_Edit() + : m_pFillerNotify(nullptr), m_bFocus(false), m_pFormFiller(nullptr) {} + +CPWL_Edit::~CPWL_Edit() { + ASSERT(m_bFocus == false); +} + +CFX_ByteString CPWL_Edit::GetClassName() const { + return PWL_CLASSNAME_EDIT; +} + +void CPWL_Edit::OnDestroy() {} + +void CPWL_Edit::SetText(const CFX_WideString& csText) { + CFX_WideString swText = csText; + if (!HasFlag(PES_RICH)) { + m_pEdit->SetText(swText); + return; + } + + CFX_ByteString sValue = CFX_ByteString::FromUnicode(swText); + std::unique_ptr pXML( + CXML_Element::Parse(sValue.c_str(), sValue.GetLength())); + if (!pXML) { + m_pEdit->SetText(swText); + return; + } + + int32_t nCount = pXML->CountChildren(); + bool bFirst = true; + + swText.clear(); + + for (int32_t i = 0; i < nCount; i++) { + CXML_Element* pSubElement = pXML->GetElement(i); + if (!pSubElement) + continue; + + CFX_ByteString tag = pSubElement->GetTagName(); + if (tag.EqualNoCase("p")) { + int nChild = pSubElement->CountChildren(); + CFX_WideString swSection; + for (int32_t j = 0; j < nChild; j++) + swSection += pSubElement->GetContent(j); + + if (bFirst) + bFirst = false; + else + swText += FWL_VKEY_Return; + swText += swSection; + } + } + + m_pEdit->SetText(swText); +} + +void CPWL_Edit::RePosChildWnd() { + if (CPWL_ScrollBar* pVSB = GetVScrollBar()) { + CFX_FloatRect rcWindow = m_rcOldWindow; + CFX_FloatRect rcVScroll = + CFX_FloatRect(rcWindow.right, rcWindow.bottom, + rcWindow.right + PWL_SCROLLBAR_WIDTH, rcWindow.top); + pVSB->Move(rcVScroll, true, false); + } + + if (m_pEditCaret && !HasFlag(PES_TEXTOVERFLOW)) + m_pEditCaret->SetClipRect(CPWL_Utils::InflateRect( + GetClientRect(), 1.0f)); // +1 for caret beside border + + CPWL_EditCtrl::RePosChildWnd(); +} + +CFX_FloatRect CPWL_Edit::GetClientRect() const { + CFX_FloatRect rcClient = CPWL_Utils::DeflateRect( + GetWindowRect(), (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); + + if (CPWL_ScrollBar* pVSB = GetVScrollBar()) { + if (pVSB->IsVisible()) { + rcClient.right -= PWL_SCROLLBAR_WIDTH; + } + } + + return rcClient; +} + +void CPWL_Edit::SetAlignFormatV(PWL_EDIT_ALIGNFORMAT_V nFormat, bool bPaint) { + m_pEdit->SetAlignmentV((int32_t)nFormat, bPaint); +} + +bool CPWL_Edit::CanSelectAll() const { + return GetSelectWordRange() != m_pEdit->GetWholeWordRange(); +} + +bool CPWL_Edit::CanClear() const { + return !IsReadOnly() && m_pEdit->IsSelected(); +} + +bool CPWL_Edit::CanCopy() const { + return !HasFlag(PES_PASSWORD) && !HasFlag(PES_NOREAD) && + m_pEdit->IsSelected(); +} + +bool CPWL_Edit::CanCut() const { + return CanCopy() && !IsReadOnly(); +} +void CPWL_Edit::CutText() { + if (!CanCut()) + return; + m_pEdit->Clear(); +} + +void CPWL_Edit::OnCreated() { + CPWL_EditCtrl::OnCreated(); + + if (CPWL_ScrollBar* pScroll = GetVScrollBar()) { + pScroll->RemoveFlag(PWS_AUTOTRANSPARENT); + pScroll->SetTransparency(255); + } + + SetParamByFlag(); + + m_rcOldWindow = GetWindowRect(); + + m_pEdit->SetOprNotify(this); + m_pEdit->EnableOprNotify(true); +} + +void CPWL_Edit::SetParamByFlag() { + if (HasFlag(PES_RIGHT)) { + m_pEdit->SetAlignmentH(2, false); + } else if (HasFlag(PES_MIDDLE)) { + m_pEdit->SetAlignmentH(1, false); + } else { + m_pEdit->SetAlignmentH(0, false); + } + + if (HasFlag(PES_BOTTOM)) { + m_pEdit->SetAlignmentV(2, false); + } else if (HasFlag(PES_CENTER)) { + m_pEdit->SetAlignmentV(1, false); + } else { + m_pEdit->SetAlignmentV(0, false); + } + + if (HasFlag(PES_PASSWORD)) { + m_pEdit->SetPasswordChar('*', false); + } + + m_pEdit->SetMultiLine(HasFlag(PES_MULTILINE), false); + m_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN), false); + m_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE), false); + m_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL), false); + m_pEdit->EnableUndo(HasFlag(PES_UNDO)); + + if (HasFlag(PES_TEXTOVERFLOW)) { + SetClipRect(CFX_FloatRect(0.0f, 0.0f, 0.0f, 0.0f)); + m_pEdit->SetTextOverflow(true, false); + } else { + if (m_pEditCaret) { + m_pEditCaret->SetClipRect(CPWL_Utils::InflateRect( + GetClientRect(), 1.0f)); // +1 for caret beside border + } + } +} + +void CPWL_Edit::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { + CPWL_Wnd::GetThisAppearanceStream(sAppStream); + + CFX_FloatRect rcClient = GetClientRect(); + CFX_ByteTextBuf sLine; + + int32_t nCharArray = m_pEdit->GetCharArray(); + + if (nCharArray > 0) { + switch (GetBorderStyle()) { + case BorderStyle::SOLID: { + sLine << "q\n" + << GetBorderWidth() << " w\n" + << CPWL_Utils::GetColorAppStream(GetBorderColor(), false) + .AsStringC() + << " 2 J 0 j\n"; + + for (int32_t i = 1; i < nCharArray; i++) { + sLine << rcClient.left + + ((rcClient.right - rcClient.left) / nCharArray) * i + << " " << rcClient.bottom << " m\n" + << rcClient.left + + ((rcClient.right - rcClient.left) / nCharArray) * i + << " " << rcClient.top << " l S\n"; + } + + sLine << "Q\n"; + break; + } + case BorderStyle::DASH: { + sLine << "q\n" + << GetBorderWidth() << " w\n" + << CPWL_Utils::GetColorAppStream(GetBorderColor(), false) + .AsStringC() + << " 2 J 0 j\n" + << "[" << GetBorderDash().nDash << " " << GetBorderDash().nGap + << "] " << GetBorderDash().nPhase << " d\n"; + + for (int32_t i = 1; i < nCharArray; i++) { + sLine << rcClient.left + + ((rcClient.right - rcClient.left) / nCharArray) * i + << " " << rcClient.bottom << " m\n" + << rcClient.left + + ((rcClient.right - rcClient.left) / nCharArray) * i + << " " << rcClient.top << " l S\n"; + } + + sLine << "Q\n"; + break; + } + default: + break; + } + } + + sAppStream << sLine; + + CFX_ByteTextBuf sText; + CFX_PointF ptOffset; + CPVT_WordRange wrWhole = m_pEdit->GetWholeWordRange(); + CPVT_WordRange wrSelect = GetSelectWordRange(); + CPVT_WordRange wrVisible = + HasFlag(PES_TEXTOVERFLOW) ? wrWhole : m_pEdit->GetVisibleWordRange(); + + CPVT_WordRange wrSelBefore(wrWhole.BeginPos, wrSelect.BeginPos); + CPVT_WordRange wrSelAfter(wrSelect.EndPos, wrWhole.EndPos); + CPVT_WordRange wrTemp = + CPWL_Utils::OverlapWordRange(GetSelectWordRange(), wrVisible); + CFX_ByteString sEditSel = + CPWL_Utils::GetEditSelAppStream(m_pEdit.get(), ptOffset, &wrTemp); + + if (sEditSel.GetLength() > 0) + sText << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELBACKCOLOR).AsStringC() + << sEditSel.AsStringC(); + + wrTemp = CPWL_Utils::OverlapWordRange(wrVisible, wrSelBefore); + CFX_ByteString sEditBefore = CPWL_Utils::GetEditAppStream( + m_pEdit.get(), ptOffset, &wrTemp, !HasFlag(PES_CHARARRAY), + m_pEdit->GetPasswordChar()); + + if (sEditBefore.GetLength() > 0) + sText << "BT\n" + << CPWL_Utils::GetColorAppStream(GetTextColor()).AsStringC() + << sEditBefore.AsStringC() << "ET\n"; + + wrTemp = CPWL_Utils::OverlapWordRange(wrVisible, wrSelect); + CFX_ByteString sEditMid = CPWL_Utils::GetEditAppStream( + m_pEdit.get(), ptOffset, &wrTemp, !HasFlag(PES_CHARARRAY), + m_pEdit->GetPasswordChar()); + + if (sEditMid.GetLength() > 0) + sText << "BT\n" + << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY, 1)) + .AsStringC() + << sEditMid.AsStringC() << "ET\n"; + + wrTemp = CPWL_Utils::OverlapWordRange(wrVisible, wrSelAfter); + CFX_ByteString sEditAfter = CPWL_Utils::GetEditAppStream( + m_pEdit.get(), ptOffset, &wrTemp, !HasFlag(PES_CHARARRAY), + m_pEdit->GetPasswordChar()); + + if (sEditAfter.GetLength() > 0) + sText << "BT\n" + << CPWL_Utils::GetColorAppStream(GetTextColor()).AsStringC() + << sEditAfter.AsStringC() << "ET\n"; + + if (sText.GetLength() > 0) { + CFX_FloatRect rect = GetClientRect(); + sAppStream << "q\n/Tx BMC\n"; + + if (!HasFlag(PES_TEXTOVERFLOW)) + sAppStream << rect.left << " " << rect.bottom << " " + << rect.right - rect.left << " " << rect.top - rect.bottom + << " re W n\n"; + + sAppStream << sText; + + sAppStream << "EMC\nQ\n"; + } +} + +void CPWL_Edit::DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); + + CFX_FloatRect rcClient = GetClientRect(); + CFX_ByteTextBuf sLine; + + int32_t nCharArray = m_pEdit->GetCharArray(); + FX_SAFE_INT32 nCharArraySafe = nCharArray; + nCharArraySafe -= 1; + nCharArraySafe *= 2; + + if (nCharArray > 0 && nCharArraySafe.IsValid()) { + switch (GetBorderStyle()) { + case BorderStyle::SOLID: { + CFX_GraphStateData gsd; + gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth(); + + CFX_PathData path; + + for (int32_t i = 0; i < nCharArray - 1; i++) { + path.AppendPoint( + CFX_PointF( + rcClient.left + + ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), + rcClient.bottom), + FXPT_TYPE::MoveTo, false); + path.AppendPoint( + CFX_PointF( + rcClient.left + + ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), + rcClient.top), + FXPT_TYPE::LineTo, false); + } + if (!path.GetPoints().empty()) { + pDevice->DrawPath(&path, pUser2Device, &gsd, 0, + GetBorderColor().ToFXColor(255), FXFILL_ALTERNATE); + } + break; + } + case BorderStyle::DASH: { + CFX_GraphStateData gsd; + gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth(); + + gsd.SetDashCount(2); + gsd.m_DashArray[0] = (FX_FLOAT)GetBorderDash().nDash; + gsd.m_DashArray[1] = (FX_FLOAT)GetBorderDash().nGap; + gsd.m_DashPhase = (FX_FLOAT)GetBorderDash().nPhase; + + CFX_PathData path; + for (int32_t i = 0; i < nCharArray - 1; i++) { + path.AppendPoint( + CFX_PointF( + rcClient.left + + ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), + rcClient.bottom), + FXPT_TYPE::MoveTo, false); + path.AppendPoint( + CFX_PointF( + rcClient.left + + ((rcClient.right - rcClient.left) / nCharArray) * (i + 1), + rcClient.top), + FXPT_TYPE::LineTo, false); + } + if (!path.GetPoints().empty()) { + pDevice->DrawPath(&path, pUser2Device, &gsd, 0, + GetBorderColor().ToFXColor(255), FXFILL_ALTERNATE); + } + break; + } + default: + break; + } + } + + CFX_FloatRect rcClip; + CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange(); + CPVT_WordRange* pRange = nullptr; + if (!HasFlag(PES_TEXTOVERFLOW)) { + rcClip = GetClientRect(); + pRange = &wrRange; + } + + CFX_SystemHandler* pSysHandler = GetSystemHandler(); + CFX_Edit::DrawEdit(pDevice, pUser2Device, m_pEdit.get(), + GetTextColor().ToFXColor(GetTransparency()), rcClip, + CFX_PointF(), pRange, pSysHandler, m_pFormFiller); +} + +bool CPWL_Edit::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonDown(point, nFlag); + + if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point)) { + if (m_bMouseDown) + InvalidateRect(); + + m_bMouseDown = true; + SetCapture(); + + m_pEdit->OnMouseDown(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + } + + return true; +} + +bool CPWL_Edit::OnLButtonDblClk(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonDblClk(point, nFlag); + + if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point)) { + m_pEdit->SelectAll(); + } + + return true; +} + +bool CPWL_Edit::OnRButtonUp(const CFX_PointF& point, uint32_t nFlag) { + if (m_bMouseDown) + return false; + + CPWL_Wnd::OnRButtonUp(point, nFlag); + + if (!HasFlag(PES_TEXTOVERFLOW) && !ClientHitTest(point)) + return true; + + CFX_SystemHandler* pSH = GetSystemHandler(); + if (!pSH) + return false; + + SetFocus(); + + return false; +} + +void CPWL_Edit::OnSetFocus() { + SetEditCaret(true); + if (!IsReadOnly()) { + if (IPWL_FocusHandler* pFocusHandler = GetFocusHandler()) + pFocusHandler->OnSetFocus(this); + } + m_bFocus = true; +} + +void CPWL_Edit::OnKillFocus() { + ShowVScrollBar(false); + m_pEdit->SelectNone(); + SetCaret(false, CFX_PointF(), CFX_PointF()); + SetCharSet(FXFONT_ANSI_CHARSET); + m_bFocus = false; +} + +void CPWL_Edit::SetCharSpace(FX_FLOAT fCharSpace) { + m_pEdit->SetCharSpace(fCharSpace); +} + +CFX_ByteString CPWL_Edit::GetSelectAppearanceStream( + const CFX_PointF& ptOffset) const { + CPVT_WordRange wr = GetSelectWordRange(); + return CPWL_Utils::GetEditSelAppStream(m_pEdit.get(), ptOffset, &wr); +} + +CPVT_WordRange CPWL_Edit::GetSelectWordRange() const { + if (m_pEdit->IsSelected()) { + int32_t nStart = -1; + int32_t nEnd = -1; + + m_pEdit->GetSel(nStart, nEnd); + + CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStart); + CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEnd); + + return CPVT_WordRange(wpStart, wpEnd); + } + + return CPVT_WordRange(); +} + +CFX_ByteString CPWL_Edit::GetTextAppearanceStream( + const CFX_PointF& ptOffset) const { + CFX_ByteTextBuf sRet; + CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit.get(), ptOffset); + if (sEdit.GetLength() > 0) { + sRet << "BT\n" + << CPWL_Utils::GetColorAppStream(GetTextColor()).AsStringC() + << sEdit.AsStringC() << "ET\n"; + } + return sRet.MakeString(); +} + +CFX_ByteString CPWL_Edit::GetCaretAppearanceStream( + const CFX_PointF& ptOffset) const { + if (m_pEditCaret) + return m_pEditCaret->GetCaretAppearanceStream(ptOffset); + + return CFX_ByteString(); +} + +CFX_PointF CPWL_Edit::GetWordRightBottomPoint(const CPVT_WordPlace& wpWord) { + CFX_Edit_Iterator* pIterator = m_pEdit->GetIterator(); + CPVT_WordPlace wpOld = pIterator->GetAt(); + pIterator->SetAt(wpWord); + + CFX_PointF pt; + CPVT_Word word; + if (pIterator->GetWord(word)) { + pt = CFX_PointF(word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent); + } + pIterator->SetAt(wpOld); + return pt; +} + +bool CPWL_Edit::IsTextFull() const { + return m_pEdit->IsTextFull(); +} + +FX_FLOAT CPWL_Edit::GetCharArrayAutoFontSize(CPDF_Font* pFont, + const CFX_FloatRect& rcPlate, + int32_t nCharArray) { + if (pFont && !pFont->IsStandardFont()) { + FX_RECT rcBBox; + pFont->GetFontBBox(rcBBox); + + CFX_FloatRect rcCell = rcPlate; + FX_FLOAT xdiv = rcCell.Width() / nCharArray * 1000.0f / rcBBox.Width(); + FX_FLOAT ydiv = -rcCell.Height() * 1000.0f / rcBBox.Height(); + + return xdiv < ydiv ? xdiv : ydiv; + } + + return 0.0f; +} + +void CPWL_Edit::SetCharArray(int32_t nCharArray) { + if (HasFlag(PES_CHARARRAY) && nCharArray > 0) { + m_pEdit->SetCharArray(nCharArray); + m_pEdit->SetTextOverflow(true, true); + + if (HasFlag(PWS_AUTOFONTSIZE)) { + if (IPVT_FontMap* pFontMap = GetFontMap()) { + FX_FLOAT fFontSize = GetCharArrayAutoFontSize( + pFontMap->GetPDFFont(0), GetClientRect(), nCharArray); + if (fFontSize > 0.0f) { + m_pEdit->SetAutoFontSize(false, true); + m_pEdit->SetFontSize(fFontSize); + } + } + } + } +} + +void CPWL_Edit::SetLimitChar(int32_t nLimitChar) { + m_pEdit->SetLimitChar(nLimitChar); +} + +void CPWL_Edit::ReplaceSel(const CFX_WideString& wsText) { + m_pEdit->Clear(); + m_pEdit->InsertText(wsText, FXFONT_DEFAULT_CHARSET); +} + +CFX_FloatRect CPWL_Edit::GetFocusRect() const { + return CFX_FloatRect(); +} + +void CPWL_Edit::ShowVScrollBar(bool bShow) { + if (CPWL_ScrollBar* pScroll = GetVScrollBar()) { + if (bShow) { + if (!pScroll->IsVisible()) { + pScroll->SetVisible(true); + CFX_FloatRect rcWindow = GetWindowRect(); + m_rcOldWindow = rcWindow; + rcWindow.right += PWL_SCROLLBAR_WIDTH; + Move(rcWindow, true, true); + } + } else { + if (pScroll->IsVisible()) { + pScroll->SetVisible(false); + Move(m_rcOldWindow, true, true); + } + } + } +} + +bool CPWL_Edit::IsVScrollBarVisible() const { + if (CPWL_ScrollBar* pScroll = GetVScrollBar()) { + return pScroll->IsVisible(); + } + + return false; +} + +bool CPWL_Edit::OnKeyDown(uint16_t nChar, uint32_t nFlag) { + if (m_bMouseDown) + return true; + + if (nChar == FWL_VKEY_Delete) { + if (m_pFillerNotify) { + bool bRC = true; + bool bExit = false; + CFX_WideString strChange; + CFX_WideString strChangeEx; + + int nSelStart = 0; + int nSelEnd = 0; + GetSel(nSelStart, nSelEnd); + + if (nSelStart == nSelEnd) + nSelEnd = nSelStart + 1; + m_pFillerNotify->OnBeforeKeyStroke(GetAttachedData(), strChange, + strChangeEx, nSelStart, nSelEnd, true, + bRC, bExit, nFlag); + if (!bRC) + return false; + if (bExit) + return false; + } + } + + bool bRet = CPWL_EditCtrl::OnKeyDown(nChar, nFlag); + + // In case of implementation swallow the OnKeyDown event. + if (IsProceedtoOnChar(nChar, nFlag)) + return true; + + return bRet; +} + +/** +*In case of implementation swallow the OnKeyDown event. +*If the event is swallowed, implementation may do other unexpected things, which +*is not the control means to do. +*/ +bool CPWL_Edit::IsProceedtoOnChar(uint16_t nKeyCode, uint32_t nFlag) { + bool bCtrl = IsCTRLpressed(nFlag); + bool bAlt = IsALTpressed(nFlag); + if (bCtrl && !bAlt) { + // hot keys for edit control. + switch (nKeyCode) { + case 'C': + case 'V': + case 'X': + case 'A': + case 'Z': + return true; + default: + break; + } + } + // control characters. + switch (nKeyCode) { + case FWL_VKEY_Escape: + case FWL_VKEY_Back: + case FWL_VKEY_Return: + case FWL_VKEY_Space: + return true; + default: + return false; + } +} + +bool CPWL_Edit::OnChar(uint16_t nChar, uint32_t nFlag) { + if (m_bMouseDown) + return true; + + bool bRC = true; + bool bExit = false; + + if (!IsCTRLpressed(nFlag)) { + if (m_pFillerNotify) { + CFX_WideString swChange; + + int nSelStart = 0; + int nSelEnd = 0; + GetSel(nSelStart, nSelEnd); + + switch (nChar) { + case FWL_VKEY_Back: + if (nSelStart == nSelEnd) + nSelStart = nSelEnd - 1; + break; + case FWL_VKEY_Return: + break; + default: + swChange += nChar; + break; + } + + CFX_WideString strChangeEx; + m_pFillerNotify->OnBeforeKeyStroke(GetAttachedData(), swChange, + strChangeEx, nSelStart, nSelEnd, true, + bRC, bExit, nFlag); + } + } + + if (!bRC) + return true; + if (bExit) + return false; + + if (IPVT_FontMap* pFontMap = GetFontMap()) { + int32_t nOldCharSet = GetCharSet(); + int32_t nNewCharSet = + pFontMap->CharSetFromUnicode(nChar, FXFONT_DEFAULT_CHARSET); + if (nOldCharSet != nNewCharSet) { + SetCharSet(nNewCharSet); + } + } + + return CPWL_EditCtrl::OnChar(nChar, nFlag); +} + +bool CPWL_Edit::OnMouseWheel(short zDelta, + const CFX_PointF& point, + uint32_t nFlag) { + if (HasFlag(PES_MULTILINE)) { + CFX_PointF ptScroll = GetScrollPos(); + + if (zDelta > 0) { + ptScroll.y += GetFontSize(); + } else { + ptScroll.y -= GetFontSize(); + } + SetScrollPos(ptScroll); + + return true; + } + + return false; +} + +void CPWL_Edit::OnInsertReturn(const CPVT_WordPlace& place, + const CPVT_WordPlace& oldplace) { + if (HasFlag(PES_SPELLCHECK)) { + m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), + GetLatinWordsRange(place))); + } +} + +void CPWL_Edit::OnBackSpace(const CPVT_WordPlace& place, + const CPVT_WordPlace& oldplace) { + if (HasFlag(PES_SPELLCHECK)) { + m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), + GetLatinWordsRange(place))); + } +} + +void CPWL_Edit::OnDelete(const CPVT_WordPlace& place, + const CPVT_WordPlace& oldplace) { + if (HasFlag(PES_SPELLCHECK)) { + m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), + GetLatinWordsRange(place))); + } +} + +void CPWL_Edit::OnClear(const CPVT_WordPlace& place, + const CPVT_WordPlace& oldplace) { + if (HasFlag(PES_SPELLCHECK)) { + m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), + GetLatinWordsRange(place))); + } +} + +void CPWL_Edit::OnInsertWord(const CPVT_WordPlace& place, + const CPVT_WordPlace& oldplace) { + if (HasFlag(PES_SPELLCHECK)) { + m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), + GetLatinWordsRange(place))); + } +} + +void CPWL_Edit::OnInsertText(const CPVT_WordPlace& place, + const CPVT_WordPlace& oldplace) { + if (HasFlag(PES_SPELLCHECK)) { + m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), + GetLatinWordsRange(place))); + } +} + +CPVT_WordRange CPWL_Edit::CombineWordRange(const CPVT_WordRange& wr1, + const CPVT_WordRange& wr2) { + CPVT_WordRange wrRet; + + if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0) { + wrRet.BeginPos = wr1.BeginPos; + } else { + wrRet.BeginPos = wr2.BeginPos; + } + + if (wr1.EndPos.WordCmp(wr2.EndPos) < 0) { + wrRet.EndPos = wr2.EndPos; + } else { + wrRet.EndPos = wr1.EndPos; + } + + return wrRet; +} + +CPVT_WordRange CPWL_Edit::GetLatinWordsRange(const CFX_PointF& point) const { + return GetSameWordsRange(m_pEdit->SearchWordPlace(point), true, false); +} + +CPVT_WordRange CPWL_Edit::GetLatinWordsRange( + const CPVT_WordPlace& place) const { + return GetSameWordsRange(place, true, false); +} + +CPVT_WordRange CPWL_Edit::GetArabicWordsRange( + const CPVT_WordPlace& place) const { + return GetSameWordsRange(place, false, true); +} + +#define PWL_ISARABICWORD(word) \ + ((word >= 0x0600 && word <= 0x06FF) || (word >= 0xFB50 && word <= 0xFEFC)) + +CPVT_WordRange CPWL_Edit::GetSameWordsRange(const CPVT_WordPlace& place, + bool bLatin, + bool bArabic) const { + CPVT_WordRange range; + + CFX_Edit_Iterator* pIterator = m_pEdit->GetIterator(); + CPVT_Word wordinfo; + CPVT_WordPlace wpStart(place), wpEnd(place); + pIterator->SetAt(place); + + if (bLatin) { + while (pIterator->NextWord()) { + if (!pIterator->GetWord(wordinfo) || + !FX_EDIT_ISLATINWORD(wordinfo.Word)) { + break; + } + + wpEnd = pIterator->GetAt(); + } + } else if (bArabic) { + while (pIterator->NextWord()) { + if (!pIterator->GetWord(wordinfo) || !PWL_ISARABICWORD(wordinfo.Word)) + break; + + wpEnd = pIterator->GetAt(); + } + } + + pIterator->SetAt(place); + + if (bLatin) { + do { + if (!pIterator->GetWord(wordinfo) || + !FX_EDIT_ISLATINWORD(wordinfo.Word)) { + break; + } + + wpStart = pIterator->GetAt(); + } while (pIterator->PrevWord()); + } else if (bArabic) { + do { + if (!pIterator->GetWord(wordinfo) || !PWL_ISARABICWORD(wordinfo.Word)) + break; + + wpStart = pIterator->GetAt(); + } while (pIterator->PrevWord()); + } + + range.Set(wpStart, wpEnd); + return range; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Edit.h b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Edit.h new file mode 100644 index 000000000000..b6d01300f046 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Edit.h @@ -0,0 +1,143 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFWINDOW_PWL_EDIT_H_ +#define FPDFSDK_PDFWINDOW_PWL_EDIT_H_ + +#include + +#include "core/fxcrt/fx_basic.h" +#include "fpdfsdk/fxedit/fx_edit.h" +#include "fpdfsdk/pdfwindow/PWL_EditCtrl.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +class CPDF_PageObjectHolder; +class CPDF_TextObject; +class IFX_Edit_UndoItem; + +class IPWL_Filler_Notify { + public: + virtual ~IPWL_Filler_Notify() {} + virtual void QueryWherePopup( + void* pPrivateData, + FX_FLOAT fPopupMin, + FX_FLOAT fPopupMax, + int32_t& nRet, + FX_FLOAT& fPopupRet) = 0; // nRet: (0:bottom 1:top) + virtual void OnBeforeKeyStroke(void* pPrivateData, + CFX_WideString& strChange, + const CFX_WideString& strChangeEx, + int nSelStart, + int nSelEnd, + bool bKeyDown, + bool& bRC, + bool& bExit, + uint32_t nFlag) = 0; +#ifdef PDF_ENABLE_XFA + virtual void OnPopupPreOpen(void* pPrivateData, + bool& bExit, + uint32_t nFlag) = 0; + virtual void OnPopupPostOpen(void* pPrivateData, + bool& bExit, + uint32_t nFlag) = 0; +#endif // PDF_ENABLE_XFA +}; + +class CPWL_Edit : public CPWL_EditCtrl { + public: + CPWL_Edit(); + ~CPWL_Edit() override; + + // CPWL_EditCtrl + CFX_ByteString GetClassName() const override; + void OnDestroy() override; + void OnCreated() override; + void RePosChildWnd() override; + CFX_FloatRect GetClientRect() const override; + void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override; + void DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) override; + bool OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) override; + bool OnLButtonDblClk(const CFX_PointF& point, uint32_t nFlag) override; + bool OnRButtonUp(const CFX_PointF& point, uint32_t nFlag) override; + bool OnMouseWheel(short zDelta, + const CFX_PointF& point, + uint32_t nFlag) override; + bool OnKeyDown(uint16_t nChar, uint32_t nFlag) override; + bool OnChar(uint16_t nChar, uint32_t nFlag) override; + CFX_FloatRect GetFocusRect() const override; + void OnSetFocus() override; + void OnKillFocus() override; + + void SetAlignFormatV(PWL_EDIT_ALIGNFORMAT_V nFormat = PEAV_TOP, + bool bPaint = true); // 0:top 1:bottom 2:center + + void SetCharArray(int32_t nCharArray); + void SetLimitChar(int32_t nLimitChar); + + void SetCharSpace(FX_FLOAT fCharSpace); + + bool CanSelectAll() const; + bool CanClear() const; + bool CanCopy() const; + bool CanCut() const; + + void CutText(); + + void SetText(const CFX_WideString& csText); + void ReplaceSel(const CFX_WideString& csText); + + CFX_ByteString GetTextAppearanceStream(const CFX_PointF& ptOffset) const; + CFX_ByteString GetCaretAppearanceStream(const CFX_PointF& ptOffset) const; + CFX_ByteString GetSelectAppearanceStream(const CFX_PointF& ptOffset) const; + + bool IsTextFull() const; + + static FX_FLOAT GetCharArrayAutoFontSize(CPDF_Font* pFont, + const CFX_FloatRect& rcPlate, + int32_t nCharArray); + + void SetFillerNotify(IPWL_Filler_Notify* pNotify) { + m_pFillerNotify = pNotify; + } + + bool IsProceedtoOnChar(uint16_t nKeyCode, uint32_t nFlag); + void AttachFFLData(CFFL_FormFiller* pData) { m_pFormFiller = pData; } + + void OnInsertWord(const CPVT_WordPlace& place, + const CPVT_WordPlace& oldplace); + void OnInsertReturn(const CPVT_WordPlace& place, + const CPVT_WordPlace& oldplace); + void OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace); + void OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace); + void OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace); + void OnInsertText(const CPVT_WordPlace& place, + const CPVT_WordPlace& oldplace); + + private: + CPVT_WordRange GetSelectWordRange() const; + virtual void ShowVScrollBar(bool bShow); + bool IsVScrollBarVisible() const; + void SetParamByFlag(); + + FX_FLOAT GetCharArrayAutoFontSize(int32_t nCharArray); + CFX_PointF GetWordRightBottomPoint(const CPVT_WordPlace& wpWord); + + CPVT_WordRange CombineWordRange(const CPVT_WordRange& wr1, + const CPVT_WordRange& wr2); + CPVT_WordRange GetLatinWordsRange(const CFX_PointF& point) const; + CPVT_WordRange GetLatinWordsRange(const CPVT_WordPlace& place) const; + CPVT_WordRange GetArabicWordsRange(const CPVT_WordPlace& place) const; + CPVT_WordRange GetSameWordsRange(const CPVT_WordPlace& place, + bool bLatin, + bool bArabic) const; + IPWL_Filler_Notify* m_pFillerNotify; + bool m_bFocus; + CFX_FloatRect m_rcOldWindow; + CFFL_FormFiller* m_pFormFiller; // Not owned. +}; + +#endif // FPDFSDK_PDFWINDOW_PWL_EDIT_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp new file mode 100644 index 000000000000..4921ab7a08b6 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp @@ -0,0 +1,577 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/pdfwindow/PWL_EditCtrl.h" + +#include "core/fpdfdoc/cpvt_section.h" +#include "core/fpdfdoc/cpvt_word.h" +#include "core/fxge/fx_font.h" +#include "fpdfsdk/fxedit/fxet_edit.h" +#include "fpdfsdk/pdfwindow/PWL_Caret.h" +#include "fpdfsdk/pdfwindow/PWL_FontMap.h" +#include "fpdfsdk/pdfwindow/PWL_ScrollBar.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" +#include "public/fpdf_fwlevent.h" + +CPWL_EditCtrl::CPWL_EditCtrl() + : m_pEdit(new CFX_Edit), + m_pEditCaret(nullptr), + m_bMouseDown(false), + m_nCharSet(FXFONT_DEFAULT_CHARSET), + m_nCodePage(0) {} + +CPWL_EditCtrl::~CPWL_EditCtrl() {} + +void CPWL_EditCtrl::OnCreate(PWL_CREATEPARAM& cp) { + cp.eCursorType = FXCT_VBEAM; +} + +void CPWL_EditCtrl::OnCreated() { + SetFontSize(GetCreationParam().fFontSize); + + m_pEdit->SetFontMap(GetFontMap()); + m_pEdit->SetNotify(this); + m_pEdit->Initialize(); +} + +bool CPWL_EditCtrl::IsWndHorV() { + CFX_Matrix mt = GetWindowMatrix(); + return mt.Transform(CFX_PointF(1, 1)).y == mt.Transform(CFX_PointF(0, 1)).y; +} + +void CPWL_EditCtrl::SetCursor() { + if (IsValid()) { + if (CFX_SystemHandler* pSH = GetSystemHandler()) { + if (IsWndHorV()) + pSH->SetCursor(FXCT_VBEAM); + else + pSH->SetCursor(FXCT_HBEAM); + } + } +} + +void CPWL_EditCtrl::RePosChildWnd() { + m_pEdit->SetPlateRect(GetClientRect()); +} + +void CPWL_EditCtrl::OnNotify(CPWL_Wnd* pWnd, + uint32_t msg, + intptr_t wParam, + intptr_t lParam) { + CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); + + switch (msg) { + case PNM_SETSCROLLINFO: + switch (wParam) { + case SBT_VSCROLL: + if (CPWL_Wnd* pChild = GetVScrollBar()) { + pChild->OnNotify(pWnd, PNM_SETSCROLLINFO, wParam, lParam); + } + break; + } + break; + case PNM_SETSCROLLPOS: + switch (wParam) { + case SBT_VSCROLL: + if (CPWL_Wnd* pChild = GetVScrollBar()) { + pChild->OnNotify(pWnd, PNM_SETSCROLLPOS, wParam, lParam); + } + break; + } + break; + case PNM_SCROLLWINDOW: { + FX_FLOAT fPos = *(FX_FLOAT*)lParam; + switch (wParam) { + case SBT_VSCROLL: + m_pEdit->SetScrollPos(CFX_PointF(m_pEdit->GetScrollPos().x, fPos)); + break; + } + } break; + case PNM_SETCARETINFO: { + if (PWL_CARET_INFO* pCaretInfo = (PWL_CARET_INFO*)wParam) { + SetCaret(pCaretInfo->bVisible, pCaretInfo->ptHead, pCaretInfo->ptFoot); + } + } break; + } +} + +void CPWL_EditCtrl::CreateChildWnd(const PWL_CREATEPARAM& cp) { + if (!IsReadOnly()) + CreateEditCaret(cp); +} + +void CPWL_EditCtrl::CreateEditCaret(const PWL_CREATEPARAM& cp) { + if (m_pEditCaret) + return; + + m_pEditCaret = new CPWL_Caret; + m_pEditCaret->SetInvalidRect(GetClientRect()); + + PWL_CREATEPARAM ecp = cp; + ecp.pParentWnd = this; + ecp.dwFlags = PWS_CHILD | PWS_NOREFRESHCLIP; + ecp.dwBorderWidth = 0; + ecp.nBorderStyle = BorderStyle::SOLID; + ecp.rcRectWnd = CFX_FloatRect(0, 0, 0, 0); + + m_pEditCaret->Create(ecp); +} + +void CPWL_EditCtrl::SetFontSize(FX_FLOAT fFontSize) { + m_pEdit->SetFontSize(fFontSize); +} + +FX_FLOAT CPWL_EditCtrl::GetFontSize() const { + return m_pEdit->GetFontSize(); +} + +bool CPWL_EditCtrl::OnKeyDown(uint16_t nChar, uint32_t nFlag) { + if (m_bMouseDown) + return true; + + bool bRet = CPWL_Wnd::OnKeyDown(nChar, nFlag); + + // FILTER + switch (nChar) { + default: + return false; + case FWL_VKEY_Delete: + case FWL_VKEY_Up: + case FWL_VKEY_Down: + case FWL_VKEY_Left: + case FWL_VKEY_Right: + case FWL_VKEY_Home: + case FWL_VKEY_End: + case FWL_VKEY_Insert: + case 'C': + case 'V': + case 'X': + case 'A': + case 'Z': + case 'c': + case 'v': + case 'x': + case 'a': + case 'z': + break; + } + + if (nChar == FWL_VKEY_Delete && m_pEdit->IsSelected()) + nChar = FWL_VKEY_Unknown; + + switch (nChar) { + case FWL_VKEY_Delete: + Delete(); + return true; + case FWL_VKEY_Insert: + if (IsSHIFTpressed(nFlag)) + PasteText(); + return true; + case FWL_VKEY_Up: + m_pEdit->OnVK_UP(IsSHIFTpressed(nFlag), false); + return true; + case FWL_VKEY_Down: + m_pEdit->OnVK_DOWN(IsSHIFTpressed(nFlag), false); + return true; + case FWL_VKEY_Left: + m_pEdit->OnVK_LEFT(IsSHIFTpressed(nFlag), false); + return true; + case FWL_VKEY_Right: + m_pEdit->OnVK_RIGHT(IsSHIFTpressed(nFlag), false); + return true; + case FWL_VKEY_Home: + m_pEdit->OnVK_HOME(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + return true; + case FWL_VKEY_End: + m_pEdit->OnVK_END(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + return true; + case FWL_VKEY_Unknown: + if (!IsSHIFTpressed(nFlag)) + Clear(); + else + CutText(); + return true; + default: + break; + } + + return bRet; +} + +bool CPWL_EditCtrl::OnChar(uint16_t nChar, uint32_t nFlag) { + if (m_bMouseDown) + return true; + + CPWL_Wnd::OnChar(nChar, nFlag); + + // FILTER + switch (nChar) { + case 0x0A: + case 0x1B: + return false; + default: + break; + } + + bool bCtrl = IsCTRLpressed(nFlag); + bool bAlt = IsALTpressed(nFlag); + bool bShift = IsSHIFTpressed(nFlag); + + uint16_t word = nChar; + + if (bCtrl && !bAlt) { + switch (nChar) { + case 'C' - 'A' + 1: + CopyText(); + return true; + case 'V' - 'A' + 1: + PasteText(); + return true; + case 'X' - 'A' + 1: + CutText(); + return true; + case 'A' - 'A' + 1: + SelectAll(); + return true; + case 'Z' - 'A' + 1: + if (bShift) + Redo(); + else + Undo(); + return true; + default: + if (nChar < 32) + return false; + } + } + + if (IsReadOnly()) + return true; + + if (m_pEdit->IsSelected() && word == FWL_VKEY_Back) + word = FWL_VKEY_Unknown; + + Clear(); + + switch (word) { + case FWL_VKEY_Back: + Backspace(); + break; + case FWL_VKEY_Return: + InsertReturn(); + break; + case FWL_VKEY_Unknown: + break; + default: + InsertWord(word, GetCharSet()); + break; + } + + return true; +} + +bool CPWL_EditCtrl::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonDown(point, nFlag); + + if (ClientHitTest(point)) { + if (m_bMouseDown) + InvalidateRect(); + + m_bMouseDown = true; + SetCapture(); + + m_pEdit->OnMouseDown(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + } + + return true; +} + +bool CPWL_EditCtrl::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonUp(point, nFlag); + + if (m_bMouseDown) { + // can receive keybord message + if (ClientHitTest(point) && !IsFocused()) + SetFocus(); + + ReleaseCapture(); + m_bMouseDown = false; + } + + return true; +} + +bool CPWL_EditCtrl::OnMouseMove(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnMouseMove(point, nFlag); + + if (m_bMouseDown) + m_pEdit->OnMouseMove(point, false, false); + + return true; +} + +CFX_FloatRect CPWL_EditCtrl::GetContentRect() const { + return m_pEdit->GetContentRect(); +} + +void CPWL_EditCtrl::SetEditCaret(bool bVisible) { + CFX_PointF ptHead; + CFX_PointF ptFoot; + if (bVisible) + GetCaretInfo(&ptHead, &ptFoot); + + CPVT_WordPlace wpTemp = m_pEdit->GetCaretWordPlace(); + IOnSetCaret(bVisible, ptHead, ptFoot, wpTemp); +} + +void CPWL_EditCtrl::GetCaretInfo(CFX_PointF* ptHead, CFX_PointF* ptFoot) const { + CFX_Edit_Iterator* pIterator = m_pEdit->GetIterator(); + pIterator->SetAt(m_pEdit->GetCaret()); + CPVT_Word word; + CPVT_Line line; + if (pIterator->GetWord(word)) { + ptHead->x = word.ptWord.x + word.fWidth; + ptHead->y = word.ptWord.y + word.fAscent; + ptFoot->x = word.ptWord.x + word.fWidth; + ptFoot->y = word.ptWord.y + word.fDescent; + } else if (pIterator->GetLine(line)) { + ptHead->x = line.ptLine.x; + ptHead->y = line.ptLine.y + line.fLineAscent; + ptFoot->x = line.ptLine.x; + ptFoot->y = line.ptLine.y + line.fLineDescent; + } +} + +void CPWL_EditCtrl::SetCaret(bool bVisible, + const CFX_PointF& ptHead, + const CFX_PointF& ptFoot) { + if (m_pEditCaret) { + if (!IsFocused() || m_pEdit->IsSelected()) + bVisible = false; + + m_pEditCaret->SetCaret(bVisible, ptHead, ptFoot); + } +} + +CFX_WideString CPWL_EditCtrl::GetText() const { + return m_pEdit->GetText(); +} + +void CPWL_EditCtrl::SetSel(int32_t nStartChar, int32_t nEndChar) { + m_pEdit->SetSel(nStartChar, nEndChar); +} + +void CPWL_EditCtrl::GetSel(int32_t& nStartChar, int32_t& nEndChar) const { + m_pEdit->GetSel(nStartChar, nEndChar); +} + +void CPWL_EditCtrl::Clear() { + if (!IsReadOnly()) + m_pEdit->Clear(); +} + +void CPWL_EditCtrl::SelectAll() { + m_pEdit->SelectAll(); +} + +void CPWL_EditCtrl::Paint() { + m_pEdit->Paint(); +} + +void CPWL_EditCtrl::EnableRefresh(bool bRefresh) { + m_pEdit->EnableRefresh(bRefresh); +} + +int32_t CPWL_EditCtrl::GetCaret() const { + return m_pEdit->GetCaret(); +} + +void CPWL_EditCtrl::SetCaret(int32_t nPos) { + m_pEdit->SetCaret(nPos); +} + +int32_t CPWL_EditCtrl::GetTotalWords() const { + return m_pEdit->GetTotalWords(); +} + +void CPWL_EditCtrl::SetScrollPos(const CFX_PointF& point) { + m_pEdit->SetScrollPos(point); +} + +CFX_PointF CPWL_EditCtrl::GetScrollPos() const { + return m_pEdit->GetScrollPos(); +} + +CPDF_Font* CPWL_EditCtrl::GetCaretFont() const { + int32_t nFontIndex = 0; + + CFX_Edit_Iterator* pIterator = m_pEdit->GetIterator(); + pIterator->SetAt(m_pEdit->GetCaret()); + CPVT_Word word; + CPVT_Section section; + if (pIterator->GetWord(word)) { + nFontIndex = word.nFontIndex; + } else if (HasFlag(PES_RICH)) { + if (pIterator->GetSection(section)) { + nFontIndex = section.WordProps.nFontIndex; + } + } + + if (IPVT_FontMap* pFontMap = GetFontMap()) + return pFontMap->GetPDFFont(nFontIndex); + + return nullptr; +} + +FX_FLOAT CPWL_EditCtrl::GetCaretFontSize() const { + FX_FLOAT fFontSize = GetFontSize(); + + CFX_Edit_Iterator* pIterator = m_pEdit->GetIterator(); + pIterator->SetAt(m_pEdit->GetCaret()); + CPVT_Word word; + CPVT_Section section; + if (pIterator->GetWord(word)) { + fFontSize = word.fFontSize; + } else if (HasFlag(PES_RICH)) { + if (pIterator->GetSection(section)) { + fFontSize = section.WordProps.fFontSize; + } + } + + return fFontSize; +} + +void CPWL_EditCtrl::SetText(const CFX_WideString& wsText) { + m_pEdit->SetText(wsText); +} + +void CPWL_EditCtrl::CopyText() {} + +void CPWL_EditCtrl::PasteText() {} + +void CPWL_EditCtrl::CutText() {} + +void CPWL_EditCtrl::ShowVScrollBar(bool bShow) {} + +void CPWL_EditCtrl::InsertText(const CFX_WideString& wsText) { + if (!IsReadOnly()) + m_pEdit->InsertText(wsText, FXFONT_DEFAULT_CHARSET); +} + +void CPWL_EditCtrl::InsertWord(uint16_t word, int32_t nCharset) { + if (!IsReadOnly()) + m_pEdit->InsertWord(word, nCharset); +} + +void CPWL_EditCtrl::InsertReturn() { + if (!IsReadOnly()) + m_pEdit->InsertReturn(); +} + +void CPWL_EditCtrl::Delete() { + if (!IsReadOnly()) + m_pEdit->Delete(); +} + +void CPWL_EditCtrl::Backspace() { + if (!IsReadOnly()) + m_pEdit->Backspace(); +} + +bool CPWL_EditCtrl::CanUndo() const { + return !IsReadOnly() && m_pEdit->CanUndo(); +} + +bool CPWL_EditCtrl::CanRedo() const { + return !IsReadOnly() && m_pEdit->CanRedo(); +} + +void CPWL_EditCtrl::Redo() { + if (CanRedo()) + m_pEdit->Redo(); +} + +void CPWL_EditCtrl::Undo() { + if (CanUndo()) + m_pEdit->Undo(); +} + +void CPWL_EditCtrl::IOnSetScrollInfoY(FX_FLOAT fPlateMin, + FX_FLOAT fPlateMax, + FX_FLOAT fContentMin, + FX_FLOAT fContentMax, + FX_FLOAT fSmallStep, + FX_FLOAT fBigStep) { + PWL_SCROLL_INFO Info; + + Info.fPlateWidth = fPlateMax - fPlateMin; + Info.fContentMin = fContentMin; + Info.fContentMax = fContentMax; + Info.fSmallStep = fSmallStep; + Info.fBigStep = fBigStep; + + OnNotify(this, PNM_SETSCROLLINFO, SBT_VSCROLL, (intptr_t)&Info); + + if (IsFloatBigger(Info.fPlateWidth, Info.fContentMax - Info.fContentMin) || + IsFloatEqual(Info.fPlateWidth, Info.fContentMax - Info.fContentMin)) { + ShowVScrollBar(false); + } else { + ShowVScrollBar(true); + } +} + +void CPWL_EditCtrl::IOnSetScrollPosY(FX_FLOAT fy) { + OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (intptr_t)&fy); +} + +void CPWL_EditCtrl::IOnSetCaret(bool bVisible, + const CFX_PointF& ptHead, + const CFX_PointF& ptFoot, + const CPVT_WordPlace& place) { + PWL_CARET_INFO cInfo; + cInfo.bVisible = bVisible; + cInfo.ptHead = ptHead; + cInfo.ptFoot = ptFoot; + + OnNotify(this, PNM_SETCARETINFO, (intptr_t)&cInfo, (intptr_t) nullptr); +} + +void CPWL_EditCtrl::IOnCaretChange(const CPVT_SecProps& secProps, + const CPVT_WordProps& wordProps) {} + +void CPWL_EditCtrl::IOnContentChange(const CFX_FloatRect& rcContent) {} + +void CPWL_EditCtrl::IOnInvalidateRect(CFX_FloatRect* pRect) { + InvalidateRect(pRect); +} + +int32_t CPWL_EditCtrl::GetCharSet() const { + return m_nCharSet < 0 ? FXFONT_DEFAULT_CHARSET : m_nCharSet; +} + +void CPWL_EditCtrl::GetTextRange(const CFX_FloatRect& rect, + int32_t& nStartChar, + int32_t& nEndChar) const { + nStartChar = m_pEdit->WordPlaceToWordIndex( + m_pEdit->SearchWordPlace(CFX_PointF(rect.left, rect.top))); + nEndChar = m_pEdit->WordPlaceToWordIndex( + m_pEdit->SearchWordPlace(CFX_PointF(rect.right, rect.bottom))); +} + +CFX_WideString CPWL_EditCtrl::GetText(int32_t& nStartChar, + int32_t& nEndChar) const { + CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStartChar); + CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEndChar); + return m_pEdit->GetRangeText(CPVT_WordRange(wpStart, wpEnd)); +} + +void CPWL_EditCtrl::SetReadyToInput() { + if (m_bMouseDown) { + ReleaseCapture(); + m_bMouseDown = false; + } +} diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_EditCtrl.h b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_EditCtrl.h new file mode 100644 index 000000000000..498570b3b082 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_EditCtrl.h @@ -0,0 +1,141 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFWINDOW_PWL_EDITCTRL_H_ +#define FPDFSDK_PDFWINDOW_PWL_EDITCTRL_H_ + +#include + +#include "core/fxcrt/fx_string.h" +#include "fpdfsdk/fxedit/fx_edit.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +class CFX_Edit; +class CPWL_Caret; +class CPWL_Edit; +class CPWL_EditCtrl; +struct CPVT_SecProps; +struct CPVT_WordPlace; +struct CPVT_WordProps; +struct CPVT_WordRange; + +enum PWL_EDIT_ALIGNFORMAT_H { PEAH_LEFT = 0, PEAH_MIDDLE, PEAH_RIGHT }; + +enum PWL_EDIT_ALIGNFORMAT_V { PEAV_TOP = 0, PEAV_CENTER, PEAV_BOTTOM }; + +class CPWL_EditCtrl : public CPWL_Wnd { + friend class CPWL_Edit_Notify; + + public: + CPWL_EditCtrl(); + ~CPWL_EditCtrl() override; + + CFX_FloatRect GetContentRect() const; + + CFX_WideString GetText() const; + void SetSel(int32_t nStartChar, int32_t nEndChar); + void GetSel(int32_t& nStartChar, int32_t& nEndChar) const; + void GetTextRange(const CFX_FloatRect& rect, + int32_t& nStartChar, + int32_t& nEndChar) const; + CFX_WideString GetText(int32_t& nStartChar, int32_t& nEndChar) const; + void Clear(); + void SelectAll(); + + int32_t GetCaret() const; + void SetCaret(int32_t nPos); + int32_t GetTotalWords() const; + + void Paint(); + + void EnableRefresh(bool bRefresh); + CFX_PointF GetScrollPos() const; + void SetScrollPos(const CFX_PointF& point); + + void SetCharSet(uint8_t nCharSet) { m_nCharSet = nCharSet; } + int32_t GetCharSet() const; + + void SetCodePage(int32_t nCodePage) { m_nCodePage = nCodePage; } + int32_t GetCodePage() const { return m_nCodePage; } + + CPDF_Font* GetCaretFont() const; + FX_FLOAT GetCaretFontSize() const; + + bool CanUndo() const; + bool CanRedo() const; + void Redo(); + void Undo(); + + void SetReadyToInput(); + + // CPWL_Wnd + void OnCreate(PWL_CREATEPARAM& cp) override; + void OnCreated() override; + bool OnKeyDown(uint16_t nChar, uint32_t nFlag) override; + bool OnChar(uint16_t nChar, uint32_t nFlag) override; + bool OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) override; + bool OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) override; + bool OnMouseMove(const CFX_PointF& point, uint32_t nFlag) override; + void OnNotify(CPWL_Wnd* pWnd, + uint32_t msg, + intptr_t wParam = 0, + intptr_t lParam = 0) override; + void CreateChildWnd(const PWL_CREATEPARAM& cp) override; + void RePosChildWnd() override; + void SetFontSize(FX_FLOAT fFontSize) override; + FX_FLOAT GetFontSize() const override; + void SetCursor() override; + + void IOnSetScrollInfoY(FX_FLOAT fPlateMin, + FX_FLOAT fPlateMax, + FX_FLOAT fContentMin, + FX_FLOAT fContentMax, + FX_FLOAT fSmallStep, + FX_FLOAT fBigStep); + void IOnSetScrollPosY(FX_FLOAT fy); + void IOnSetCaret(bool bVisible, + const CFX_PointF& ptHead, + const CFX_PointF& ptFoot, + const CPVT_WordPlace& place); + void IOnCaretChange(const CPVT_SecProps& secProps, + const CPVT_WordProps& wordProps); + void IOnContentChange(const CFX_FloatRect& rcContent); + void IOnInvalidateRect(CFX_FloatRect* pRect); + + protected: + void InsertText(const CFX_WideString& wsText); + void SetText(const CFX_WideString& wsText); + void CopyText(); + void PasteText(); + void CutText(); + void ShowVScrollBar(bool bShow); + void InsertWord(uint16_t word, int32_t nCharset); + void InsertReturn(); + + bool IsWndHorV(); + + void Delete(); + void Backspace(); + + void GetCaretInfo(CFX_PointF* ptHead, CFX_PointF* ptFoot) const; + void SetCaret(bool bVisible, + const CFX_PointF& ptHead, + const CFX_PointF& ptFoot); + + void SetEditCaret(bool bVisible); + + std::unique_ptr m_pEdit; + CPWL_Caret* m_pEditCaret; + bool m_bMouseDown; + + private: + void CreateEditCaret(const PWL_CREATEPARAM& cp); + + int32_t m_nCharSet; + int32_t m_nCodePage; +}; + +#endif // FPDFSDK_PDFWINDOW_PWL_EDITCTRL_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_FontMap.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_FontMap.cpp new file mode 100644 index 000000000000..9a2962cd5675 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_FontMap.cpp @@ -0,0 +1,426 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/pdfwindow/PWL_FontMap.h" + +#include + +#include "core/fpdfapi/cpdf_modulemgr.h" +#include "core/fpdfapi/font/cpdf_font.h" +#include "core/fpdfapi/font/cpdf_fontencoding.h" +#include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_parser.h" +#include "core/fpdfdoc/ipvt_fontmap.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +namespace { + +const char kDefaultFontName[] = "Helvetica"; + +const char* const g_sDEStandardFontName[] = {"Courier", + "Courier-Bold", + "Courier-BoldOblique", + "Courier-Oblique", + "Helvetica", + "Helvetica-Bold", + "Helvetica-BoldOblique", + "Helvetica-Oblique", + "Times-Roman", + "Times-Bold", + "Times-Italic", + "Times-BoldItalic", + "Symbol", + "ZapfDingbats"}; + +} // namespace + +CPWL_FontMap::CPWL_FontMap(CFX_SystemHandler* pSystemHandler) + : m_pSystemHandler(pSystemHandler) { + ASSERT(m_pSystemHandler); +} + +CPWL_FontMap::~CPWL_FontMap() { + Empty(); +} + +CPDF_Document* CPWL_FontMap::GetDocument() { + if (!m_pPDFDoc) { + if (CPDF_ModuleMgr::Get()) { + m_pPDFDoc = pdfium::MakeUnique(nullptr); + m_pPDFDoc->CreateNewDoc(); + } + } + + return m_pPDFDoc.get(); +} + +CPDF_Font* CPWL_FontMap::GetPDFFont(int32_t nFontIndex) { + if (nFontIndex >= 0 && nFontIndex < pdfium::CollectionSize(m_Data)) { + if (m_Data[nFontIndex]) + return m_Data[nFontIndex]->pFont; + } + return nullptr; +} + +CFX_ByteString CPWL_FontMap::GetPDFFontAlias(int32_t nFontIndex) { + if (nFontIndex >= 0 && nFontIndex < pdfium::CollectionSize(m_Data)) { + if (m_Data[nFontIndex]) + return m_Data[nFontIndex]->sFontName; + } + return CFX_ByteString(); +} + +bool CPWL_FontMap::KnowWord(int32_t nFontIndex, uint16_t word) { + if (nFontIndex >= 0 && nFontIndex < pdfium::CollectionSize(m_Data)) { + if (m_Data[nFontIndex]) + return CharCodeFromUnicode(nFontIndex, word) >= 0; + } + return false; +} + +int32_t CPWL_FontMap::GetWordFontIndex(uint16_t word, + int32_t nCharset, + int32_t nFontIndex) { + if (nFontIndex > 0) { + if (KnowWord(nFontIndex, word)) + return nFontIndex; + } else { + if (const CPWL_FontMap_Data* pData = GetFontMapData(0)) { + if (nCharset == FXFONT_DEFAULT_CHARSET || + pData->nCharset == FXFONT_SYMBOL_CHARSET || + nCharset == pData->nCharset) { + if (KnowWord(0, word)) + return 0; + } + } + } + + int32_t nNewFontIndex = + GetFontIndex(GetNativeFontName(nCharset), nCharset, true); + if (nNewFontIndex >= 0) { + if (KnowWord(nNewFontIndex, word)) + return nNewFontIndex; + } + nNewFontIndex = + GetFontIndex("Arial Unicode MS", FXFONT_DEFAULT_CHARSET, false); + if (nNewFontIndex >= 0) { + if (KnowWord(nNewFontIndex, word)) + return nNewFontIndex; + } + return -1; +} + +int32_t CPWL_FontMap::CharCodeFromUnicode(int32_t nFontIndex, uint16_t word) { + if (nFontIndex < 0 || nFontIndex >= pdfium::CollectionSize(m_Data)) + return -1; + + CPWL_FontMap_Data* pData = m_Data[nFontIndex].get(); + if (!pData || !pData->pFont) + return -1; + + if (pData->pFont->IsUnicodeCompatible()) + return pData->pFont->CharCodeFromUnicode(word); + + return word < 0xFF ? word : -1; +} + +CFX_ByteString CPWL_FontMap::GetNativeFontName(int32_t nCharset) { + for (const auto& pData : m_NativeFont) { + if (pData && pData->nCharset == nCharset) + return pData->sFontName; + } + + CFX_ByteString sNew = GetNativeFont(nCharset); + if (sNew.IsEmpty()) + return CFX_ByteString(); + + auto pNewData = pdfium::MakeUnique(); + pNewData->nCharset = nCharset; + pNewData->sFontName = sNew; + m_NativeFont.push_back(std::move(pNewData)); + return sNew; +} + +void CPWL_FontMap::Empty() { + m_Data.clear(); + m_NativeFont.clear(); +} + +void CPWL_FontMap::Initialize() { + GetFontIndex(kDefaultFontName, FXFONT_ANSI_CHARSET, false); +} + +bool CPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName) { + for (size_t i = 0; i < FX_ArraySize(g_sDEStandardFontName); ++i) { + if (sFontName == g_sDEStandardFontName[i]) + return true; + } + + return false; +} + +int32_t CPWL_FontMap::FindFont(const CFX_ByteString& sFontName, + int32_t nCharset) { + int32_t i = 0; + for (const auto& pData : m_Data) { + if (pData && + (nCharset == FXFONT_DEFAULT_CHARSET || nCharset == pData->nCharset) && + (sFontName.IsEmpty() || pData->sFontName == sFontName)) { + return i; + } + ++i; + } + return -1; +} + +int32_t CPWL_FontMap::GetFontIndex(const CFX_ByteString& sFontName, + int32_t nCharset, + bool bFind) { + int32_t nFontIndex = FindFont(EncodeFontAlias(sFontName, nCharset), nCharset); + if (nFontIndex >= 0) + return nFontIndex; + + CFX_ByteString sAlias; + CPDF_Font* pFont = nullptr; + if (bFind) + pFont = FindFontSameCharset(sAlias, nCharset); + + if (!pFont) { + CFX_ByteString sTemp = sFontName; + pFont = AddFontToDocument(GetDocument(), sTemp, nCharset); + sAlias = EncodeFontAlias(sTemp, nCharset); + } + AddedFont(pFont, sAlias); + return AddFontData(pFont, sAlias, nCharset); +} + +CPDF_Font* CPWL_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, + int32_t nCharset) { + return nullptr; +} + +int32_t CPWL_FontMap::AddFontData(CPDF_Font* pFont, + const CFX_ByteString& sFontAlias, + int32_t nCharset) { + auto pNewData = pdfium::MakeUnique(); + pNewData->pFont = pFont; + pNewData->sFontName = sFontAlias; + pNewData->nCharset = nCharset; + m_Data.push_back(std::move(pNewData)); + return pdfium::CollectionSize(m_Data) - 1; +} + +void CPWL_FontMap::AddedFont(CPDF_Font* pFont, + const CFX_ByteString& sFontAlias) {} + +CFX_ByteString CPWL_FontMap::GetNativeFont(int32_t nCharset) { + if (nCharset == FXFONT_DEFAULT_CHARSET) + nCharset = GetNativeCharset(); + + CFX_ByteString sFontName = GetDefaultFontByCharset(nCharset); + if (!m_pSystemHandler->FindNativeTrueTypeFont(sFontName)) + return CFX_ByteString(); + + return sFontName; +} + +CPDF_Font* CPWL_FontMap::AddFontToDocument(CPDF_Document* pDoc, + CFX_ByteString& sFontName, + uint8_t nCharset) { + if (IsStandardFont(sFontName)) + return AddStandardFont(pDoc, sFontName); + + return AddSystemFont(pDoc, sFontName, nCharset); +} + +CPDF_Font* CPWL_FontMap::AddStandardFont(CPDF_Document* pDoc, + CFX_ByteString& sFontName) { + if (!pDoc) + return nullptr; + + CPDF_Font* pFont = nullptr; + + if (sFontName == "ZapfDingbats") { + pFont = pDoc->AddStandardFont(sFontName.c_str(), nullptr); + } else { + CPDF_FontEncoding fe(PDFFONT_ENCODING_WINANSI); + pFont = pDoc->AddStandardFont(sFontName.c_str(), &fe); + } + + return pFont; +} + +CPDF_Font* CPWL_FontMap::AddSystemFont(CPDF_Document* pDoc, + CFX_ByteString& sFontName, + uint8_t nCharset) { + if (!pDoc) + return nullptr; + + if (sFontName.IsEmpty()) + sFontName = GetNativeFont(nCharset); + if (nCharset == FXFONT_DEFAULT_CHARSET) + nCharset = GetNativeCharset(); + + return m_pSystemHandler->AddNativeTrueTypeFontToPDF(pDoc, sFontName, + nCharset); +} + +CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName, + int32_t nCharset) { + CFX_ByteString sPostfix; + sPostfix.Format("_%02X", nCharset); + return EncodeFontAlias(sFontName) + sPostfix; +} + +CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName) { + CFX_ByteString sRet = sFontName; + sRet.Remove(' '); + return sRet; +} + +const CPWL_FontMap_Data* CPWL_FontMap::GetFontMapData(int32_t nIndex) const { + if (nIndex < 0 || nIndex >= pdfium::CollectionSize(m_Data)) + return nullptr; + + return m_Data[nIndex].get(); +} + +int32_t CPWL_FontMap::GetNativeCharset() { + uint8_t nCharset = FXFONT_ANSI_CHARSET; + int32_t iCodePage = FXSYS_GetACP(); + switch (iCodePage) { + case 932: // Japan + nCharset = FXFONT_SHIFTJIS_CHARSET; + break; + case 936: // Chinese (PRC, Singapore) + nCharset = FXFONT_GB2312_CHARSET; + break; + case 950: // Chinese (Taiwan; Hong Kong SAR, PRC) + nCharset = FXFONT_GB2312_CHARSET; + break; + case 1252: // Windows 3.1 Latin 1 (US, Western Europe) + nCharset = FXFONT_ANSI_CHARSET; + break; + case 874: // Thai + nCharset = FXFONT_THAI_CHARSET; + break; + case 949: // Korean + nCharset = FXFONT_HANGUL_CHARSET; + break; + case 1200: // Unicode (BMP of ISO 10646) + nCharset = FXFONT_ANSI_CHARSET; + break; + case 1250: // Windows 3.1 Eastern European + nCharset = FXFONT_EASTEUROPE_CHARSET; + break; + case 1251: // Windows 3.1 Cyrillic + nCharset = FXFONT_RUSSIAN_CHARSET; + break; + case 1253: // Windows 3.1 Greek + nCharset = FXFONT_GREEK_CHARSET; + break; + case 1254: // Windows 3.1 Turkish + nCharset = FXFONT_TURKISH_CHARSET; + break; + case 1255: // Hebrew + nCharset = FXFONT_HEBREW_CHARSET; + break; + case 1256: // Arabic + nCharset = FXFONT_ARABIC_CHARSET; + break; + case 1257: // Baltic + nCharset = FXFONT_BALTIC_CHARSET; + break; + case 1258: // Vietnamese + nCharset = FXFONT_VIETNAMESE_CHARSET; + break; + case 1361: // Korean(Johab) + nCharset = FXFONT_JOHAB_CHARSET; + break; + } + return nCharset; +} + +const FPDF_CharsetFontMap CPWL_FontMap::defaultTTFMap[] = { + {FXFONT_ANSI_CHARSET, "Helvetica"}, + {FXFONT_GB2312_CHARSET, "SimSun"}, + {FXFONT_CHINESEBIG5_CHARSET, "MingLiU"}, + {FXFONT_SHIFTJIS_CHARSET, "MS Gothic"}, + {FXFONT_HANGUL_CHARSET, "Batang"}, + {FXFONT_RUSSIAN_CHARSET, "Arial"}, +#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || \ + _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ + {FXFONT_EASTEUROPE_CHARSET, "Arial"}, +#else + {FXFONT_EASTEUROPE_CHARSET, "Tahoma"}, +#endif + {FXFONT_ARABIC_CHARSET, "Arial"}, + {-1, nullptr}}; + +CFX_ByteString CPWL_FontMap::GetDefaultFontByCharset(int32_t nCharset) { + int i = 0; + while (defaultTTFMap[i].charset != -1) { + if (nCharset == defaultTTFMap[i].charset) + return defaultTTFMap[i].fontname; + ++i; + } + return ""; +} + +int32_t CPWL_FontMap::CharSetFromUnicode(uint16_t word, int32_t nOldCharset) { + // to avoid CJK Font to show ASCII + if (word < 0x7F) + return FXFONT_ANSI_CHARSET; + // follow the old charset + if (nOldCharset != FXFONT_DEFAULT_CHARSET) + return nOldCharset; + + // find new charset + if ((word >= 0x4E00 && word <= 0x9FA5) || + (word >= 0xE7C7 && word <= 0xE7F3) || + (word >= 0x3000 && word <= 0x303F) || + (word >= 0x2000 && word <= 0x206F)) { + return FXFONT_GB2312_CHARSET; + } + + if (((word >= 0x3040) && (word <= 0x309F)) || + ((word >= 0x30A0) && (word <= 0x30FF)) || + ((word >= 0x31F0) && (word <= 0x31FF)) || + ((word >= 0xFF00) && (word <= 0xFFEF))) { + return FXFONT_SHIFTJIS_CHARSET; + } + + if (((word >= 0xAC00) && (word <= 0xD7AF)) || + ((word >= 0x1100) && (word <= 0x11FF)) || + ((word >= 0x3130) && (word <= 0x318F))) { + return FXFONT_HANGUL_CHARSET; + } + + if (word >= 0x0E00 && word <= 0x0E7F) + return FXFONT_THAI_CHARSET; + + if ((word >= 0x0370 && word <= 0x03FF) || (word >= 0x1F00 && word <= 0x1FFF)) + return FXFONT_GREEK_CHARSET; + + if ((word >= 0x0600 && word <= 0x06FF) || (word >= 0xFB50 && word <= 0xFEFC)) + return FXFONT_ARABIC_CHARSET; + + if (word >= 0x0590 && word <= 0x05FF) + return FXFONT_HEBREW_CHARSET; + + if (word >= 0x0400 && word <= 0x04FF) + return FXFONT_RUSSIAN_CHARSET; + + if (word >= 0x0100 && word <= 0x024F) + return FXFONT_EASTEUROPE_CHARSET; + + if (word >= 0x1E00 && word <= 0x1EFF) + return FXFONT_VIETNAMESE_CHARSET; + + return FXFONT_ANSI_CHARSET; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_FontMap.h b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_FontMap.h new file mode 100644 index 000000000000..c14fcd7cd34a --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_FontMap.h @@ -0,0 +1,95 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFWINDOW_PWL_FONTMAP_H_ +#define FPDFSDK_PDFWINDOW_PWL_FONTMAP_H_ + +#include +#include + +#include "core/fpdfdoc/ipvt_fontmap.h" +#include "core/fxge/fx_font.h" +#include "fpdfsdk/fxedit/fx_edit.h" +#include "public/fpdf_sysfontinfo.h" + +class CPDF_Document; +class CFX_SystemHandler; + +struct CPWL_FontMap_Data { + CPDF_Font* pFont; + int32_t nCharset; + CFX_ByteString sFontName; +}; + +struct CPWL_FontMap_Native { + int32_t nCharset; + CFX_ByteString sFontName; +}; + +class CPWL_FontMap : public IPVT_FontMap { + public: + explicit CPWL_FontMap(CFX_SystemHandler* pSystemHandler); + ~CPWL_FontMap() override; + + // IPVT_FontMap + CPDF_Font* GetPDFFont(int32_t nFontIndex) override; + CFX_ByteString GetPDFFontAlias(int32_t nFontIndex) override; + int32_t GetWordFontIndex(uint16_t word, + int32_t nCharset, + int32_t nFontIndex) override; + int32_t CharCodeFromUnicode(int32_t nFontIndex, uint16_t word) override; + int32_t CharSetFromUnicode(uint16_t word, int32_t nOldCharset) override; + + const CPWL_FontMap_Data* GetFontMapData(int32_t nIndex) const; + static int32_t GetNativeCharset(); + CFX_ByteString GetNativeFontName(int32_t nCharset); + + static CFX_ByteString GetDefaultFontByCharset(int32_t nCharset); + static const FPDF_CharsetFontMap defaultTTFMap[]; + + protected: + virtual void Initialize(); + virtual CPDF_Document* GetDocument(); + virtual CPDF_Font* FindFontSameCharset(CFX_ByteString& sFontAlias, + int32_t nCharset); + virtual void AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias); + + bool KnowWord(int32_t nFontIndex, uint16_t word); + + void Empty(); + int32_t GetFontIndex(const CFX_ByteString& sFontName, + int32_t nCharset, + bool bFind); + int32_t AddFontData(CPDF_Font* pFont, + const CFX_ByteString& sFontAlias, + int32_t nCharset = FXFONT_DEFAULT_CHARSET); + + CFX_ByteString EncodeFontAlias(const CFX_ByteString& sFontName, + int32_t nCharset); + CFX_ByteString EncodeFontAlias(const CFX_ByteString& sFontName); + + std::vector> m_Data; + std::vector> m_NativeFont; + + private: + int32_t FindFont(const CFX_ByteString& sFontName, + int32_t nCharset = FXFONT_DEFAULT_CHARSET); + + CFX_ByteString GetNativeFont(int32_t nCharset); + CPDF_Font* AddFontToDocument(CPDF_Document* pDoc, + CFX_ByteString& sFontName, + uint8_t nCharset); + bool IsStandardFont(const CFX_ByteString& sFontName); + CPDF_Font* AddStandardFont(CPDF_Document* pDoc, CFX_ByteString& sFontName); + CPDF_Font* AddSystemFont(CPDF_Document* pDoc, + CFX_ByteString& sFontName, + uint8_t nCharset); + + std::unique_ptr m_pPDFDoc; + CFX_SystemHandler* const m_pSystemHandler; +}; + +#endif // FPDFSDK_PDFWINDOW_PWL_FONTMAP_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Icon.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Icon.cpp new file mode 100644 index 000000000000..b0d0c7686d95 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Icon.cpp @@ -0,0 +1,225 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/pdfwindow/PWL_Icon.h" + +#include + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_stream.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +CPWL_Image::CPWL_Image() : m_pPDFStream(nullptr) {} + +CPWL_Image::~CPWL_Image() {} + +CFX_ByteString CPWL_Image::GetImageAppStream() { + CFX_ByteTextBuf sAppStream; + + CFX_ByteString sAlias = GetImageAlias(); + CFX_FloatRect rcPlate = GetClientRect(); + CFX_Matrix mt; + mt.SetReverse(GetImageMatrix()); + + FX_FLOAT fHScale = 1.0f; + FX_FLOAT fVScale = 1.0f; + GetScale(fHScale, fVScale); + + FX_FLOAT fx = 0.0f; + FX_FLOAT fy = 0.0f; + GetImageOffset(fx, fy); + + if (m_pPDFStream && sAlias.GetLength() > 0) { + sAppStream << "q\n"; + sAppStream << rcPlate.left << " " << rcPlate.bottom << " " + << rcPlate.right - rcPlate.left << " " + << rcPlate.top - rcPlate.bottom << " re W n\n"; + + sAppStream << fHScale << " 0 0 " << fVScale << " " << rcPlate.left + fx + << " " << rcPlate.bottom + fy << " cm\n"; + sAppStream << mt.a << " " << mt.b << " " << mt.c << " " << mt.d << " " + << mt.e << " " << mt.f << " cm\n"; + + sAppStream << "0 g 0 G 1 w /" << sAlias.AsStringC() << " Do\n" + << "Q\n"; + } + + return sAppStream.MakeString(); +} + +void CPWL_Image::SetPDFStream(CPDF_Stream* pStream) { + m_pPDFStream = pStream; +} + +CPDF_Stream* CPWL_Image::GetPDFStream() { + return m_pPDFStream; +} + +void CPWL_Image::GetImageSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight) { + fWidth = 0.0f; + fHeight = 0.0f; + + if (m_pPDFStream) { + if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) { + CFX_FloatRect rect = pDict->GetRectFor("BBox"); + + fWidth = rect.right - rect.left; + fHeight = rect.top - rect.bottom; + } + } +} + +CFX_Matrix CPWL_Image::GetImageMatrix() { + if (m_pPDFStream) { + if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) { + return pDict->GetMatrixFor("Matrix"); + } + } + + return CFX_Matrix(); +} + +CFX_ByteString CPWL_Image::GetImageAlias() { + if (!m_sImageAlias.IsEmpty()) + return m_sImageAlias; + + if (m_pPDFStream) { + if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) { + return pDict->GetStringFor("Name"); + } + } + + return CFX_ByteString(); +} + +void CPWL_Image::SetImageAlias(const FX_CHAR* sImageAlias) { + m_sImageAlias = sImageAlias; +} + +void CPWL_Image::GetScale(FX_FLOAT& fHScale, FX_FLOAT& fVScale) { + fHScale = 1.0f; + fVScale = 1.0f; +} + +void CPWL_Image::GetImageOffset(FX_FLOAT& x, FX_FLOAT& y) { + x = 0.0f; + y = 0.0f; +} + +CPWL_Icon::CPWL_Icon() : m_pIconFit(nullptr) {} + +CPWL_Icon::~CPWL_Icon() {} + +CPDF_IconFit* CPWL_Icon::GetIconFit() { + return m_pIconFit; +} + +int32_t CPWL_Icon::GetScaleMethod() { + if (m_pIconFit) + return m_pIconFit->GetScaleMethod(); + + return 0; +} + +bool CPWL_Icon::IsProportionalScale() { + if (m_pIconFit) + return m_pIconFit->IsProportionalScale(); + + return false; +} + +void CPWL_Icon::GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom) { + if (m_pIconFit) { + fLeft = 0.0f; + fBottom = 0.0f; + CPDF_Array* pA = m_pIconFit->GetDict() + ? m_pIconFit->GetDict()->GetArrayFor("A") + : nullptr; + if (pA) { + size_t dwCount = pA->GetCount(); + if (dwCount > 0) + fLeft = pA->GetNumberAt(0); + if (dwCount > 1) + fBottom = pA->GetNumberAt(1); + } + } else { + fLeft = 0.0f; + fBottom = 0.0f; + } +} + +void CPWL_Icon::GetScale(FX_FLOAT& fHScale, FX_FLOAT& fVScale) { + fHScale = 1.0f; + fVScale = 1.0f; + + if (m_pPDFStream) { + FX_FLOAT fImageWidth, fImageHeight; + FX_FLOAT fPlateWidth, fPlateHeight; + + CFX_FloatRect rcPlate = GetClientRect(); + fPlateWidth = rcPlate.right - rcPlate.left; + fPlateHeight = rcPlate.top - rcPlate.bottom; + + GetImageSize(fImageWidth, fImageHeight); + + int32_t nScaleMethod = GetScaleMethod(); + + switch (nScaleMethod) { + default: + case 0: + fHScale = fPlateWidth / std::max(fImageWidth, 1.0f); + fVScale = fPlateHeight / std::max(fImageHeight, 1.0f); + break; + case 1: + if (fPlateWidth < fImageWidth) + fHScale = fPlateWidth / std::max(fImageWidth, 1.0f); + if (fPlateHeight < fImageHeight) + fVScale = fPlateHeight / std::max(fImageHeight, 1.0f); + break; + case 2: + if (fPlateWidth > fImageWidth) + fHScale = fPlateWidth / std::max(fImageWidth, 1.0f); + if (fPlateHeight > fImageHeight) + fVScale = fPlateHeight / std::max(fImageHeight, 1.0f); + break; + case 3: + break; + } + + FX_FLOAT fMinScale; + if (IsProportionalScale()) { + fMinScale = std::min(fHScale, fVScale); + fHScale = fMinScale; + fVScale = fMinScale; + } + } +} + +void CPWL_Icon::GetImageOffset(FX_FLOAT& x, FX_FLOAT& y) { + FX_FLOAT fLeft, fBottom; + + GetIconPosition(fLeft, fBottom); + x = 0.0f; + y = 0.0f; + + FX_FLOAT fImageWidth, fImageHeight; + GetImageSize(fImageWidth, fImageHeight); + + FX_FLOAT fHScale, fVScale; + GetScale(fHScale, fVScale); + + FX_FLOAT fImageFactWidth = fImageWidth * fHScale; + FX_FLOAT fImageFactHeight = fImageHeight * fVScale; + + FX_FLOAT fPlateWidth, fPlateHeight; + CFX_FloatRect rcPlate = GetClientRect(); + fPlateWidth = rcPlate.right - rcPlate.left; + fPlateHeight = rcPlate.top - rcPlate.bottom; + + x = (fPlateWidth - fImageFactWidth) * fLeft; + y = (fPlateHeight - fImageFactHeight) * fBottom; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Icon.h b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Icon.h new file mode 100644 index 000000000000..4b62db4c990f --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Icon.h @@ -0,0 +1,57 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFWINDOW_PWL_ICON_H_ +#define FPDFSDK_PDFWINDOW_PWL_ICON_H_ + +#include "core/fxcrt/fx_string.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +class CPWL_Image : public CPWL_Wnd { + public: + CPWL_Image(); + ~CPWL_Image() override; + + virtual CFX_ByteString GetImageAppStream(); + + virtual void GetScale(FX_FLOAT& fHScale, FX_FLOAT& fVScale); + virtual void GetImageOffset(FX_FLOAT& x, FX_FLOAT& y); + virtual CPDF_Stream* GetPDFStream(); + + public: + void SetPDFStream(CPDF_Stream* pStream); + void GetImageSize(FX_FLOAT& fWidth, FX_FLOAT& fHeight); + CFX_Matrix GetImageMatrix(); + CFX_ByteString GetImageAlias(); + void SetImageAlias(const FX_CHAR* sImageAlias); + + protected: + CPDF_Stream* m_pPDFStream; + CFX_ByteString m_sImageAlias; +}; + +class CPWL_Icon : public CPWL_Image { + public: + CPWL_Icon(); + ~CPWL_Icon() override; + + virtual CPDF_IconFit* GetIconFit(); + + // CPWL_Image + void GetScale(FX_FLOAT& fHScale, FX_FLOAT& fVScale) override; + void GetImageOffset(FX_FLOAT& x, FX_FLOAT& y) override; + + int32_t GetScaleMethod(); + bool IsProportionalScale(); + void GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom); + + void SetIconFit(CPDF_IconFit* pIconFit) { m_pIconFit = pIconFit; } + + private: + CPDF_IconFit* m_pIconFit; +}; + +#endif // FPDFSDK_PDFWINDOW_PWL_ICON_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ListBox.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ListBox.cpp new file mode 100644 index 000000000000..ed96e203fdfe --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ListBox.cpp @@ -0,0 +1,459 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/pdfwindow/PWL_ListBox.h" + +#include "fpdfsdk/fxedit/fxet_edit.h" +#include "fpdfsdk/fxedit/fxet_list.h" +#include "fpdfsdk/pdfwindow/PWL_Edit.h" +#include "fpdfsdk/pdfwindow/PWL_EditCtrl.h" +#include "fpdfsdk/pdfwindow/PWL_ScrollBar.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" +#include "public/fpdf_fwlevent.h" +#include "third_party/base/ptr_util.h" + +CPWL_List_Notify::CPWL_List_Notify(CPWL_ListBox* pList) : m_pList(pList) { + ASSERT(m_pList); +} + +CPWL_List_Notify::~CPWL_List_Notify() {} + +void CPWL_List_Notify::IOnSetScrollInfoY(FX_FLOAT fPlateMin, + FX_FLOAT fPlateMax, + FX_FLOAT fContentMin, + FX_FLOAT fContentMax, + FX_FLOAT fSmallStep, + FX_FLOAT fBigStep) { + PWL_SCROLL_INFO Info; + + Info.fPlateWidth = fPlateMax - fPlateMin; + Info.fContentMin = fContentMin; + Info.fContentMax = fContentMax; + Info.fSmallStep = fSmallStep; + Info.fBigStep = fBigStep; + + m_pList->OnNotify(m_pList, PNM_SETSCROLLINFO, SBT_VSCROLL, (intptr_t)&Info); + + if (CPWL_ScrollBar* pScroll = m_pList->GetVScrollBar()) { + if (IsFloatBigger(Info.fPlateWidth, Info.fContentMax - Info.fContentMin) || + IsFloatEqual(Info.fPlateWidth, Info.fContentMax - Info.fContentMin)) { + if (pScroll->IsVisible()) { + pScroll->SetVisible(false); + m_pList->RePosChildWnd(); + } + } else { + if (!pScroll->IsVisible()) { + pScroll->SetVisible(true); + m_pList->RePosChildWnd(); + } + } + } +} + +void CPWL_List_Notify::IOnSetScrollPosY(FX_FLOAT fy) { + m_pList->OnNotify(m_pList, PNM_SETSCROLLPOS, SBT_VSCROLL, (intptr_t)&fy); +} + +void CPWL_List_Notify::IOnInvalidateRect(CFX_FloatRect* pRect) { + m_pList->InvalidateRect(pRect); +} + +CPWL_ListBox::CPWL_ListBox() + : m_pList(new CFX_ListCtrl), + m_bMouseDown(false), + m_bHoverSel(false), + m_pFillerNotify(nullptr) {} + +CPWL_ListBox::~CPWL_ListBox() { +} + +CFX_ByteString CPWL_ListBox::GetClassName() const { + return "CPWL_ListBox"; +} + +void CPWL_ListBox::OnCreated() { + m_pList->SetFontMap(GetFontMap()); + m_pListNotify = pdfium::MakeUnique(this); + m_pList->SetNotify(m_pListNotify.get()); + + SetHoverSel(HasFlag(PLBS_HOVERSEL)); + m_pList->SetMultipleSel(HasFlag(PLBS_MULTIPLESEL)); + m_pList->SetFontSize(GetCreationParam().fFontSize); + + m_bHoverSel = HasFlag(PLBS_HOVERSEL); +} + +void CPWL_ListBox::OnDestroy() { + // Make sure the notifier is removed from the list as we are about to + // destroy the notifier and don't want to leave a dangling pointer. + m_pList->SetNotify(nullptr); + m_pListNotify.reset(); +} + +void CPWL_ListBox::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { + CPWL_Wnd::GetThisAppearanceStream(sAppStream); + + CFX_ByteTextBuf sListItems; + + CFX_FloatRect rcPlate = m_pList->GetPlateRect(); + for (int32_t i = 0, sz = m_pList->GetCount(); i < sz; i++) { + CFX_FloatRect rcItem = m_pList->GetItemRect(i); + + if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) + continue; + + CFX_PointF ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f); + if (m_pList->IsItemSelected(i)) { + sListItems << CPWL_Utils::GetRectFillAppStream(rcItem, + PWL_DEFAULT_SELBACKCOLOR) + .AsStringC(); + CFX_ByteString sItem = + CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset); + if (sItem.GetLength() > 0) { + sListItems << "BT\n" + << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELTEXTCOLOR) + .AsStringC() + << sItem.AsStringC() << "ET\n"; + } + } else { + CFX_ByteString sItem = + CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset); + if (sItem.GetLength() > 0) { + sListItems << "BT\n" + << CPWL_Utils::GetColorAppStream(GetTextColor()).AsStringC() + << sItem.AsStringC() << "ET\n"; + } + } + } + + if (sListItems.GetLength() > 0) { + CFX_ByteTextBuf sClip; + CFX_FloatRect rcClient = GetClientRect(); + + sClip << "q\n"; + sClip << rcClient.left << " " << rcClient.bottom << " " + << rcClient.right - rcClient.left << " " + << rcClient.top - rcClient.bottom << " re W n\n"; + + sClip << sListItems << "Q\n"; + + sAppStream << "/Tx BMC\n" << sClip << "EMC\n"; + } +} + +void CPWL_ListBox::DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); + + CFX_FloatRect rcPlate = m_pList->GetPlateRect(); + CFX_FloatRect rcList = GetListRect(); + CFX_FloatRect rcClient = GetClientRect(); + + for (int32_t i = 0, sz = m_pList->GetCount(); i < sz; i++) { + CFX_FloatRect rcItem = m_pList->GetItemRect(i); + if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) + continue; + + CFX_PointF ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f); + if (CFX_Edit* pEdit = m_pList->GetItemEdit(i)) { + CFX_FloatRect rcContent = pEdit->GetContentRect(); + if (rcContent.Width() > rcClient.Width()) + rcItem.Intersect(rcList); + else + rcItem.Intersect(rcClient); + } + + if (m_pList->IsItemSelected(i)) { + CFX_SystemHandler* pSysHandler = GetSystemHandler(); + if (pSysHandler && pSysHandler->IsSelectionImplemented()) { + CFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), + GetTextColor().ToFXColor(255), rcList, ptOffset, + nullptr, pSysHandler, m_pFormFiller); + pSysHandler->OutputSelectedRect(m_pFormFiller, rcItem); + } else { + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, + ArgbEncode(255, 0, 51, 113)); + CFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), + ArgbEncode(255, 255, 255, 255), rcList, ptOffset, + nullptr, pSysHandler, m_pFormFiller); + } + } else { + CFX_SystemHandler* pSysHandler = GetSystemHandler(); + CFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), + GetTextColor().ToFXColor(255), rcList, ptOffset, + nullptr, pSysHandler, nullptr); + } + } +} + +bool CPWL_ListBox::OnKeyDown(uint16_t nChar, uint32_t nFlag) { + CPWL_Wnd::OnKeyDown(nChar, nFlag); + + switch (nChar) { + default: + return false; + case FWL_VKEY_Up: + case FWL_VKEY_Down: + case FWL_VKEY_Home: + case FWL_VKEY_Left: + case FWL_VKEY_End: + case FWL_VKEY_Right: + break; + } + + switch (nChar) { + case FWL_VKEY_Up: + m_pList->OnVK_UP(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Down: + m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Home: + m_pList->OnVK_HOME(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Left: + m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_End: + m_pList->OnVK_END(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Right: + m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + break; + case FWL_VKEY_Delete: + break; + } + + bool bExit = false; + OnNotifySelChanged(true, bExit, nFlag); + + return true; +} + +bool CPWL_ListBox::OnChar(uint16_t nChar, uint32_t nFlag) { + CPWL_Wnd::OnChar(nChar, nFlag); + + if (!m_pList->OnChar(nChar, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag))) + return false; + + bool bExit = false; + OnNotifySelChanged(true, bExit, nFlag); + + return true; +} + +bool CPWL_ListBox::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonDown(point, nFlag); + + if (ClientHitTest(point)) { + m_bMouseDown = true; + SetFocus(); + SetCapture(); + + m_pList->OnMouseDown(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + } + + return true; +} + +bool CPWL_ListBox::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonUp(point, nFlag); + + if (m_bMouseDown) { + ReleaseCapture(); + m_bMouseDown = false; + } + + bool bExit = false; + OnNotifySelChanged(false, bExit, nFlag); + + return true; +} + +void CPWL_ListBox::SetHoverSel(bool bHoverSel) { + m_bHoverSel = bHoverSel; +} + +bool CPWL_ListBox::OnMouseMove(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnMouseMove(point, nFlag); + + if (m_bHoverSel && !IsCaptureMouse() && ClientHitTest(point)) + m_pList->Select(m_pList->GetItemIndex(point)); + if (m_bMouseDown) + m_pList->OnMouseMove(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + + return true; +} + +void CPWL_ListBox::OnNotify(CPWL_Wnd* pWnd, + uint32_t msg, + intptr_t wParam, + intptr_t lParam) { + CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); + + FX_FLOAT fPos; + + switch (msg) { + case PNM_SETSCROLLINFO: + switch (wParam) { + case SBT_VSCROLL: + if (CPWL_Wnd* pChild = GetVScrollBar()) { + pChild->OnNotify(pWnd, PNM_SETSCROLLINFO, wParam, lParam); + } + break; + } + break; + case PNM_SETSCROLLPOS: + switch (wParam) { + case SBT_VSCROLL: + if (CPWL_Wnd* pChild = GetVScrollBar()) { + pChild->OnNotify(pWnd, PNM_SETSCROLLPOS, wParam, lParam); + } + break; + } + break; + case PNM_SCROLLWINDOW: + fPos = *(FX_FLOAT*)lParam; + switch (wParam) { + case SBT_VSCROLL: + m_pList->SetScrollPos(CFX_PointF(0, fPos)); + break; + } + break; + } +} + +void CPWL_ListBox::KillFocus() { + CPWL_Wnd::KillFocus(); +} + +void CPWL_ListBox::RePosChildWnd() { + CPWL_Wnd::RePosChildWnd(); + + m_pList->SetPlateRect(GetListRect()); +} + +void CPWL_ListBox::OnNotifySelChanged(bool bKeyDown, + bool& bExit, + uint32_t nFlag) { + if (!m_pFillerNotify) + return; + + bool bRC = true; + CFX_WideString swChange = GetText(); + CFX_WideString strChangeEx; + int nSelStart = 0; + int nSelEnd = swChange.GetLength(); + m_pFillerNotify->OnBeforeKeyStroke(GetAttachedData(), swChange, strChangeEx, + nSelStart, nSelEnd, bKeyDown, bRC, bExit, + nFlag); +} + +CFX_FloatRect CPWL_ListBox::GetFocusRect() const { + if (m_pList->IsMultipleSel()) { + CFX_FloatRect rcCaret = m_pList->GetItemRect(m_pList->GetCaret()); + rcCaret.Intersect(GetClientRect()); + return rcCaret; + } + + return CPWL_Wnd::GetFocusRect(); +} + +void CPWL_ListBox::AddString(const CFX_WideString& str) { + m_pList->AddString(str); +} + +CFX_WideString CPWL_ListBox::GetText() const { + return m_pList->GetText(); +} + +void CPWL_ListBox::SetFontSize(FX_FLOAT fFontSize) { + m_pList->SetFontSize(fFontSize); +} + +FX_FLOAT CPWL_ListBox::GetFontSize() const { + return m_pList->GetFontSize(); +} + +void CPWL_ListBox::Select(int32_t nItemIndex) { + m_pList->Select(nItemIndex); +} + +void CPWL_ListBox::SetCaret(int32_t nItemIndex) { + m_pList->SetCaret(nItemIndex); +} + +void CPWL_ListBox::SetTopVisibleIndex(int32_t nItemIndex) { + m_pList->SetTopItem(nItemIndex); +} + +void CPWL_ListBox::ScrollToListItem(int32_t nItemIndex) { + m_pList->ScrollToListItem(nItemIndex); +} + +void CPWL_ListBox::ResetContent() { + m_pList->Empty(); +} + +void CPWL_ListBox::Reset() { + m_pList->Cancel(); +} + +bool CPWL_ListBox::IsMultipleSel() const { + return m_pList->IsMultipleSel(); +} + +int32_t CPWL_ListBox::GetCaretIndex() const { + return m_pList->GetCaret(); +} + +int32_t CPWL_ListBox::GetCurSel() const { + return m_pList->GetSelect(); +} + +bool CPWL_ListBox::IsItemSelected(int32_t nItemIndex) const { + return m_pList->IsItemSelected(nItemIndex); +} + +int32_t CPWL_ListBox::GetTopVisibleIndex() const { + m_pList->ScrollToListItem(m_pList->GetFirstSelected()); + return m_pList->GetTopItem(); +} + +int32_t CPWL_ListBox::GetCount() const { + return m_pList->GetCount(); +} + +int32_t CPWL_ListBox::FindNext(int32_t nIndex, FX_WCHAR nChar) const { + return m_pList->FindNext(nIndex, nChar); +} + +CFX_FloatRect CPWL_ListBox::GetContentRect() const { + return m_pList->GetContentRect(); +} + +FX_FLOAT CPWL_ListBox::GetFirstHeight() const { + return m_pList->GetFirstHeight(); +} + +CFX_FloatRect CPWL_ListBox::GetListRect() const { + return CPWL_Utils::DeflateRect( + GetWindowRect(), (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); +} + +bool CPWL_ListBox::OnMouseWheel(short zDelta, + const CFX_PointF& point, + uint32_t nFlag) { + if (zDelta < 0) + m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + else + m_pList->OnVK_UP(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); + + bool bExit = false; + OnNotifySelChanged(false, bExit, nFlag); + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ListBox.h b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ListBox.h new file mode 100644 index 000000000000..f9108a17de0b --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ListBox.h @@ -0,0 +1,117 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFWINDOW_PWL_LISTBOX_H_ +#define FPDFSDK_PDFWINDOW_PWL_LISTBOX_H_ + +#include + +#include "fpdfsdk/fxedit/fx_edit.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +class CFX_ListCtrl; +class CPWL_List_Notify; +class CPWL_ListBox; +class IPWL_Filler_Notify; +struct CPVT_SecProps; +struct CPVT_WordPlace; +struct CPVT_WordProps; + +class CPWL_List_Notify { + public: + explicit CPWL_List_Notify(CPWL_ListBox* pList); + ~CPWL_List_Notify(); + + void IOnSetScrollInfoY(FX_FLOAT fPlateMin, + FX_FLOAT fPlateMax, + FX_FLOAT fContentMin, + FX_FLOAT fContentMax, + FX_FLOAT fSmallStep, + FX_FLOAT fBigStep); + void IOnSetScrollPosY(FX_FLOAT fy); + void IOnInvalidateRect(CFX_FloatRect* pRect); + + void IOnSetCaret(bool bVisible, + const CFX_PointF& ptHead, + const CFX_PointF& ptFoot, + const CPVT_WordPlace& place); + + private: + CPWL_ListBox* m_pList; +}; + +class CPWL_ListBox : public CPWL_Wnd { + public: + CPWL_ListBox(); + ~CPWL_ListBox() override; + + // CPWL_Wnd + CFX_ByteString GetClassName() const override; + void OnCreated() override; + void OnDestroy() override; + void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override; + void DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) override; + bool OnKeyDown(uint16_t nChar, uint32_t nFlag) override; + bool OnChar(uint16_t nChar, uint32_t nFlag) override; + bool OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) override; + bool OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) override; + bool OnMouseMove(const CFX_PointF& point, uint32_t nFlag) override; + bool OnMouseWheel(short zDelta, + const CFX_PointF& point, + uint32_t nFlag) override; + void KillFocus() override; + void OnNotify(CPWL_Wnd* pWnd, + uint32_t msg, + intptr_t wParam = 0, + intptr_t lParam = 0) override; + void RePosChildWnd() override; + CFX_FloatRect GetFocusRect() const override; + void SetFontSize(FX_FLOAT fFontSize) override; + FX_FLOAT GetFontSize() const override; + + virtual CFX_WideString GetText() const; + + void OnNotifySelChanged(bool bKeyDown, bool& bExit, uint32_t nFlag); + + void AddString(const CFX_WideString& str); + void SetTopVisibleIndex(int32_t nItemIndex); + void ScrollToListItem(int32_t nItemIndex); + void ResetContent(); + void Reset(); + void Select(int32_t nItemIndex); + void SetCaret(int32_t nItemIndex); + void SetHoverSel(bool bHoverSel); + + int32_t GetCount() const; + bool IsMultipleSel() const; + int32_t GetCaretIndex() const; + int32_t GetCurSel() const; + bool IsItemSelected(int32_t nItemIndex) const; + int32_t GetTopVisibleIndex() const; + int32_t FindNext(int32_t nIndex, FX_WCHAR nChar) const; + CFX_FloatRect GetContentRect() const; + FX_FLOAT GetFirstHeight() const; + CFX_FloatRect GetListRect() const; + + void SetFillerNotify(IPWL_Filler_Notify* pNotify) { + m_pFillerNotify = pNotify; + } + + void AttachFFLData(CFFL_FormFiller* pData) { m_pFormFiller = pData; } + + protected: + std::unique_ptr m_pList; + std::unique_ptr m_pListNotify; + bool m_bMouseDown; + bool m_bHoverSel; + IPWL_Filler_Notify* m_pFillerNotify; + + private: + CFFL_FormFiller* m_pFormFiller; // Not owned. +}; + +#endif // FPDFSDK_PDFWINDOW_PWL_LISTBOX_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ScrollBar.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ScrollBar.cpp new file mode 100644 index 000000000000..e3799366a576 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ScrollBar.cpp @@ -0,0 +1,1175 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/pdfwindow/PWL_ScrollBar.h" + +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +PWL_FLOATRANGE::PWL_FLOATRANGE() { + Default(); +} + +PWL_FLOATRANGE::PWL_FLOATRANGE(FX_FLOAT min, FX_FLOAT max) { + Set(min, max); +} + +void PWL_FLOATRANGE::Default() { + fMin = 0; + fMax = 0; +} + +void PWL_FLOATRANGE::Set(FX_FLOAT min, FX_FLOAT max) { + if (min > max) { + fMin = max; + fMax = min; + } else { + fMin = min; + fMax = max; + } +} + +bool PWL_FLOATRANGE::In(FX_FLOAT x) const { + return (IsFloatBigger(x, fMin) || IsFloatEqual(x, fMin)) && + (IsFloatSmaller(x, fMax) || IsFloatEqual(x, fMax)); +} + +FX_FLOAT PWL_FLOATRANGE::GetWidth() const { + return fMax - fMin; +} + +PWL_SCROLL_PRIVATEDATA::PWL_SCROLL_PRIVATEDATA() { + Default(); +} + +void PWL_SCROLL_PRIVATEDATA::Default() { + ScrollRange.Default(); + fScrollPos = ScrollRange.fMin; + fClientWidth = 0; + fBigStep = 10; + fSmallStep = 1; +} + +void PWL_SCROLL_PRIVATEDATA::SetScrollRange(FX_FLOAT min, FX_FLOAT max) { + ScrollRange.Set(min, max); + + if (IsFloatSmaller(fScrollPos, ScrollRange.fMin)) + fScrollPos = ScrollRange.fMin; + if (IsFloatBigger(fScrollPos, ScrollRange.fMax)) + fScrollPos = ScrollRange.fMax; +} + +void PWL_SCROLL_PRIVATEDATA::SetClientWidth(FX_FLOAT width) { + fClientWidth = width; +} + +void PWL_SCROLL_PRIVATEDATA::SetSmallStep(FX_FLOAT step) { + fSmallStep = step; +} + +void PWL_SCROLL_PRIVATEDATA::SetBigStep(FX_FLOAT step) { + fBigStep = step; +} + +bool PWL_SCROLL_PRIVATEDATA::SetPos(FX_FLOAT pos) { + if (ScrollRange.In(pos)) { + fScrollPos = pos; + return true; + } + return false; +} + +void PWL_SCROLL_PRIVATEDATA::AddSmall() { + if (!SetPos(fScrollPos + fSmallStep)) + SetPos(ScrollRange.fMax); +} + +void PWL_SCROLL_PRIVATEDATA::SubSmall() { + if (!SetPos(fScrollPos - fSmallStep)) + SetPos(ScrollRange.fMin); +} + +void PWL_SCROLL_PRIVATEDATA::AddBig() { + if (!SetPos(fScrollPos + fBigStep)) + SetPos(ScrollRange.fMax); +} + +void PWL_SCROLL_PRIVATEDATA::SubBig() { + if (!SetPos(fScrollPos - fBigStep)) + SetPos(ScrollRange.fMin); +} + +CPWL_SBButton::CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType, + PWL_SBBUTTON_TYPE eButtonType) { + m_eScrollBarType = eScrollBarType; + m_eSBButtonType = eButtonType; + + m_bMouseDown = false; +} + +CPWL_SBButton::~CPWL_SBButton() {} + +CFX_ByteString CPWL_SBButton::GetClassName() const { + return "CPWL_SBButton"; +} + +void CPWL_SBButton::OnCreate(PWL_CREATEPARAM& cp) { + cp.eCursorType = FXCT_ARROW; +} + +void CPWL_SBButton::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { + CPWL_Wnd::GetThisAppearanceStream(sAppStream); + + if (!IsVisible()) + return; + + CFX_ByteTextBuf sButton; + + CFX_FloatRect rectWnd = GetWindowRect(); + + if (rectWnd.IsEmpty()) + return; + + sAppStream << "q\n"; + + CFX_PointF ptCenter = GetCenterPoint(); + + switch (m_eScrollBarType) { + case SBT_HSCROLL: + switch (m_eSBButtonType) { + case PSBT_MIN: { + CFX_PointF pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y); + CFX_PointF pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, + ptCenter.y + PWL_TRIANGLE_HALFLEN); + CFX_PointF pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, + ptCenter.y - PWL_TRIANGLE_HALFLEN); + + if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && + rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { + sButton << "0 g\n"; + sButton << pt1.x << " " << pt1.y << " m\n"; + sButton << pt2.x << " " << pt2.y << " l\n"; + sButton << pt3.x << " " << pt3.y << " l\n"; + sButton << pt1.x << " " << pt1.y << " l f\n"; + + sAppStream << sButton; + } + } break; + case PSBT_MAX: { + CFX_PointF pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y); + CFX_PointF pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, + ptCenter.y + PWL_TRIANGLE_HALFLEN); + CFX_PointF pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, + ptCenter.y - PWL_TRIANGLE_HALFLEN); + + if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && + rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { + sButton << "0 g\n"; + sButton << pt1.x << " " << pt1.y << " m\n"; + sButton << pt2.x << " " << pt2.y << " l\n"; + sButton << pt3.x << " " << pt3.y << " l\n"; + sButton << pt1.x << " " << pt1.y << " l f\n"; + + sAppStream << sButton; + } + } break; + default: + break; + } + break; + case SBT_VSCROLL: + switch (m_eSBButtonType) { + case PSBT_MIN: { + CFX_PointF pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN, + ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); + CFX_PointF pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN, + ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); + CFX_PointF pt3(ptCenter.x, ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); + + if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && + rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { + sButton << "0 g\n"; + sButton << pt1.x << " " << pt1.y << " m\n"; + sButton << pt2.x << " " << pt2.y << " l\n"; + sButton << pt3.x << " " << pt3.y << " l\n"; + sButton << pt1.x << " " << pt1.y << " l f\n"; + + sAppStream << sButton; + } + } break; + case PSBT_MAX: { + CFX_PointF pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN, + ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); + CFX_PointF pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN, + ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); + CFX_PointF pt3(ptCenter.x, ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); + + if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && + rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { + sButton << "0 g\n"; + sButton << pt1.x << " " << pt1.y << " m\n"; + sButton << pt2.x << " " << pt2.y << " l\n"; + sButton << pt3.x << " " << pt3.y << " l\n"; + sButton << pt1.x << " " << pt1.y << " l f\n"; + + sAppStream << sButton; + } + } break; + default: + break; + } + break; + default: + break; + } + + sAppStream << "Q\n"; +} + +void CPWL_SBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + if (!IsVisible()) + return; + + CFX_FloatRect rectWnd = GetWindowRect(); + if (rectWnd.IsEmpty()) + return; + + CFX_PointF ptCenter = GetCenterPoint(); + int32_t nTransparency = GetTransparency(); + + switch (m_eScrollBarType) { + case SBT_HSCROLL: + CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); + switch (m_eSBButtonType) { + case PSBT_MIN: { + CFX_PointF pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y); + CFX_PointF pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, + ptCenter.y + PWL_TRIANGLE_HALFLEN); + CFX_PointF pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, + ptCenter.y - PWL_TRIANGLE_HALFLEN); + + if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && + rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { + CFX_PathData path; + path.AppendPoint(pt1, FXPT_TYPE::MoveTo, false); + path.AppendPoint(pt2, FXPT_TYPE::LineTo, false); + path.AppendPoint(pt3, FXPT_TYPE::LineTo, false); + path.AppendPoint(pt1, FXPT_TYPE::LineTo, false); + + pDevice->DrawPath(&path, pUser2Device, nullptr, + PWL_DEFAULT_BLACKCOLOR.ToFXColor(nTransparency), + 0, FXFILL_ALTERNATE); + } + } break; + case PSBT_MAX: { + CFX_PointF pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y); + CFX_PointF pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, + ptCenter.y + PWL_TRIANGLE_HALFLEN); + CFX_PointF pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, + ptCenter.y - PWL_TRIANGLE_HALFLEN); + + if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && + rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { + CFX_PathData path; + path.AppendPoint(pt1, FXPT_TYPE::MoveTo, false); + path.AppendPoint(pt2, FXPT_TYPE::LineTo, false); + path.AppendPoint(pt3, FXPT_TYPE::LineTo, false); + path.AppendPoint(pt1, FXPT_TYPE::LineTo, false); + + pDevice->DrawPath(&path, pUser2Device, nullptr, + PWL_DEFAULT_BLACKCOLOR.ToFXColor(nTransparency), + 0, FXFILL_ALTERNATE); + } + } break; + default: + break; + } + break; + case SBT_VSCROLL: + switch (m_eSBButtonType) { + case PSBT_MIN: { + // draw border + CFX_FloatRect rcDraw = rectWnd; + CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(nTransparency, 100, 100, 100), + 0.0f); + + // draw inner border + rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f); + CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(nTransparency, 255, 255, 255), + 1.0f); + + // draw background + + rcDraw = CPWL_Utils::DeflateRect(rectWnd, 1.0f); + + if (IsEnabled()) + CPWL_Utils::DrawShadow(pDevice, pUser2Device, true, false, rcDraw, + nTransparency, 80, 220); + else + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(255, 255, 255, 255)); + + // draw arrow + + if (rectWnd.top - rectWnd.bottom > 6.0f) { + FX_FLOAT fX = rectWnd.left + 1.5f; + FX_FLOAT fY = rectWnd.bottom; + CFX_PointF pts[7] = {CFX_PointF(fX + 2.5f, fY + 4.0f), + CFX_PointF(fX + 2.5f, fY + 3.0f), + CFX_PointF(fX + 4.5f, fY + 5.0f), + CFX_PointF(fX + 6.5f, fY + 3.0f), + CFX_PointF(fX + 6.5f, fY + 4.0f), + CFX_PointF(fX + 4.5f, fY + 6.0f), + CFX_PointF(fX + 2.5f, fY + 4.0f)}; + + if (IsEnabled()) + CPWL_Utils::DrawFillArea( + pDevice, pUser2Device, pts, 7, + ArgbEncode(nTransparency, 255, 255, 255)); + else + CPWL_Utils::DrawFillArea( + pDevice, pUser2Device, pts, 7, + PWL_DEFAULT_HEAVYGRAYCOLOR.ToFXColor(255)); + } + } break; + case PSBT_MAX: { + // draw border + CFX_FloatRect rcDraw = rectWnd; + CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(nTransparency, 100, 100, 100), + 0.0f); + + // draw inner border + rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f); + CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(nTransparency, 255, 255, 255), + 1.0f); + + // draw background + rcDraw = CPWL_Utils::DeflateRect(rectWnd, 1.0f); + if (IsEnabled()) + CPWL_Utils::DrawShadow(pDevice, pUser2Device, true, false, rcDraw, + nTransparency, 80, 220); + else + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(255, 255, 255, 255)); + + // draw arrow + + if (rectWnd.top - rectWnd.bottom > 6.0f) { + FX_FLOAT fX = rectWnd.left + 1.5f; + FX_FLOAT fY = rectWnd.bottom; + + CFX_PointF pts[7] = {CFX_PointF(fX + 2.5f, fY + 5.0f), + CFX_PointF(fX + 2.5f, fY + 6.0f), + CFX_PointF(fX + 4.5f, fY + 4.0f), + CFX_PointF(fX + 6.5f, fY + 6.0f), + CFX_PointF(fX + 6.5f, fY + 5.0f), + CFX_PointF(fX + 4.5f, fY + 3.0f), + CFX_PointF(fX + 2.5f, fY + 5.0f)}; + + if (IsEnabled()) + CPWL_Utils::DrawFillArea( + pDevice, pUser2Device, pts, 7, + ArgbEncode(nTransparency, 255, 255, 255)); + else + CPWL_Utils::DrawFillArea( + pDevice, pUser2Device, pts, 7, + PWL_DEFAULT_HEAVYGRAYCOLOR.ToFXColor(255)); + } + } break; + case PSBT_POS: { + // draw border + CFX_FloatRect rcDraw = rectWnd; + CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(nTransparency, 100, 100, 100), + 0.0f); + + // draw inner border + rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f); + CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(nTransparency, 255, 255, 255), + 1.0f); + + if (IsEnabled()) { + // draw shadow effect + + CFX_PointF ptTop = CFX_PointF(rectWnd.left, rectWnd.top - 1.0f); + CFX_PointF ptBottom = + CFX_PointF(rectWnd.left, rectWnd.bottom + 1.0f); + + ptTop.x += 1.5f; + ptBottom.x += 1.5f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparency, 210, 210, 210), + 1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparency, 220, 220, 220), + 1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparency, 240, 240, 240), + 1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparency, 240, 240, 240), + 1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparency, 210, 210, 210), + 1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparency, 180, 180, 180), + 1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparency, 150, 150, 150), + 1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparency, 150, 150, 150), + 1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparency, 180, 180, 180), + 1.0f); + + ptTop.x += 1.0f; + ptBottom.x += 1.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom, + ArgbEncode(nTransparency, 210, 210, 210), + 1.0f); + } else { + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, + ArgbEncode(255, 255, 255, 255)); + } + + // draw friction + + if (rectWnd.Height() > 8.0f) { + FX_COLORREF crStroke = ArgbEncode(nTransparency, 120, 120, 120); + if (!IsEnabled()) + crStroke = PWL_DEFAULT_HEAVYGRAYCOLOR.ToFXColor(255); + + FX_FLOAT nFrictionWidth = 5.0f; + FX_FLOAT nFrictionHeight = 5.5f; + + CFX_PointF ptLeft = + CFX_PointF(ptCenter.x - nFrictionWidth / 2.0f, + ptCenter.y - nFrictionHeight / 2.0f + 0.5f); + CFX_PointF ptRight = + CFX_PointF(ptCenter.x + nFrictionWidth / 2.0f, + ptCenter.y - nFrictionHeight / 2.0f + 0.5f); + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, + crStroke, 1.0f); + + ptLeft.y += 2.0f; + ptRight.y += 2.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, + crStroke, 1.0f); + + ptLeft.y += 2.0f; + ptRight.y += 2.0f; + + CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, + crStroke, 1.0f); + } + } break; + default: + break; + } + break; + default: + break; + } +} + +bool CPWL_SBButton::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonDown(point, nFlag); + + if (CPWL_Wnd* pParent = GetParentWindow()) + pParent->OnNotify(this, PNM_LBUTTONDOWN, 0, (intptr_t)&point); + + m_bMouseDown = true; + SetCapture(); + + return true; +} + +bool CPWL_SBButton::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonUp(point, nFlag); + + if (CPWL_Wnd* pParent = GetParentWindow()) + pParent->OnNotify(this, PNM_LBUTTONUP, 0, (intptr_t)&point); + + m_bMouseDown = false; + ReleaseCapture(); + + return true; +} + +bool CPWL_SBButton::OnMouseMove(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnMouseMove(point, nFlag); + + if (CPWL_Wnd* pParent = GetParentWindow()) { + pParent->OnNotify(this, PNM_MOUSEMOVE, 0, (intptr_t)&point); + } + + return true; +} + +CPWL_ScrollBar::CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType) + : m_sbType(sbType), + m_pMinButton(nullptr), + m_pMaxButton(nullptr), + m_pPosButton(nullptr), + m_bMouseDown(false), + m_bMinOrMax(false), + m_bNotifyForever(true) {} + +CPWL_ScrollBar::~CPWL_ScrollBar() {} + +CFX_ByteString CPWL_ScrollBar::GetClassName() const { + return "CPWL_ScrollBar"; +} + +void CPWL_ScrollBar::OnCreate(PWL_CREATEPARAM& cp) { + cp.eCursorType = FXCT_ARROW; +} + +void CPWL_ScrollBar::RePosChildWnd() { + CFX_FloatRect rcClient = GetClientRect(); + CFX_FloatRect rcMinButton, rcMaxButton; + FX_FLOAT fBWidth = 0; + + switch (m_sbType) { + case SBT_HSCROLL: + if (rcClient.right - rcClient.left > + PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + + 2) { + rcMinButton = CFX_FloatRect(rcClient.left, rcClient.bottom, + rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH, + rcClient.top); + rcMaxButton = + CFX_FloatRect(rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH, + rcClient.bottom, rcClient.right, rcClient.top); + } else { + fBWidth = (rcClient.right - rcClient.left - + PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / + 2; + + if (fBWidth > 0) { + rcMinButton = CFX_FloatRect(rcClient.left, rcClient.bottom, + rcClient.left + fBWidth, rcClient.top); + rcMaxButton = CFX_FloatRect(rcClient.right - fBWidth, rcClient.bottom, + rcClient.right, rcClient.top); + } else { + SetVisible(false); + } + } + break; + case SBT_VSCROLL: + if (IsFloatBigger(rcClient.top - rcClient.bottom, + PWL_SCROLLBAR_BUTTON_WIDTH * 2 + + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2)) { + rcMinButton = CFX_FloatRect(rcClient.left, + rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH, + rcClient.right, rcClient.top); + rcMaxButton = + CFX_FloatRect(rcClient.left, rcClient.bottom, rcClient.right, + rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH); + } else { + fBWidth = (rcClient.top - rcClient.bottom - + PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / + 2; + + if (IsFloatBigger(fBWidth, 0)) { + rcMinButton = CFX_FloatRect(rcClient.left, rcClient.top - fBWidth, + rcClient.right, rcClient.top); + rcMaxButton = + CFX_FloatRect(rcClient.left, rcClient.bottom, rcClient.right, + rcClient.bottom + fBWidth); + } else { + SetVisible(false); + } + } + break; + } + + if (m_pMinButton) + m_pMinButton->Move(rcMinButton, true, false); + if (m_pMaxButton) + m_pMaxButton->Move(rcMaxButton, true, false); + MovePosButton(false); +} + +void CPWL_ScrollBar::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { + CFX_FloatRect rectWnd = GetWindowRect(); + + if (IsVisible() && !rectWnd.IsEmpty()) { + CFX_ByteTextBuf sButton; + + sButton << "q\n"; + sButton << "0 w\n" + << CPWL_Utils::GetColorAppStream(GetBackgroundColor(), true) + .AsStringC(); + sButton << rectWnd.left << " " << rectWnd.bottom << " " + << rectWnd.right - rectWnd.left << " " + << rectWnd.top - rectWnd.bottom << " re b Q\n"; + + sAppStream << sButton; + } +} + +void CPWL_ScrollBar::DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + CFX_FloatRect rectWnd = GetWindowRect(); + + if (IsVisible() && !rectWnd.IsEmpty()) { + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rectWnd, + GetBackgroundColor(), GetTransparency()); + + CPWL_Utils::DrawStrokeLine( + pDevice, pUser2Device, + CFX_PointF(rectWnd.left + 2.0f, rectWnd.top - 2.0f), + CFX_PointF(rectWnd.left + 2.0f, rectWnd.bottom + 2.0f), + ArgbEncode(GetTransparency(), 100, 100, 100), 1.0f); + + CPWL_Utils::DrawStrokeLine( + pDevice, pUser2Device, + CFX_PointF(rectWnd.right - 2.0f, rectWnd.top - 2.0f), + CFX_PointF(rectWnd.right - 2.0f, rectWnd.bottom + 2.0f), + ArgbEncode(GetTransparency(), 100, 100, 100), 1.0f); + } +} + +bool CPWL_ScrollBar::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonDown(point, nFlag); + + if (HasFlag(PWS_AUTOTRANSPARENT)) { + if (GetTransparency() != 255) { + SetTransparency(255); + InvalidateRect(); + } + } + + CFX_FloatRect rcMinArea, rcMaxArea; + + if (m_pPosButton && m_pPosButton->IsVisible()) { + CFX_FloatRect rcClient = GetClientRect(); + CFX_FloatRect rcPosButton = m_pPosButton->GetWindowRect(); + + switch (m_sbType) { + case SBT_HSCROLL: + rcMinArea = + CFX_FloatRect(rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH, + rcClient.bottom, rcPosButton.left, rcClient.top); + rcMaxArea = CFX_FloatRect(rcPosButton.right, rcClient.bottom, + rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH, + rcClient.top); + + break; + case SBT_VSCROLL: + rcMinArea = + CFX_FloatRect(rcClient.left, rcPosButton.top, rcClient.right, + rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH); + rcMaxArea = CFX_FloatRect(rcClient.left, + rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH, + rcClient.right, rcPosButton.bottom); + break; + } + + rcMinArea.Normalize(); + rcMaxArea.Normalize(); + + if (rcMinArea.Contains(point)) { + m_sData.SubBig(); + MovePosButton(true); + NotifyScrollWindow(); + } + + if (rcMaxArea.Contains(point)) { + m_sData.AddBig(); + MovePosButton(true); + NotifyScrollWindow(); + } + } + + return true; +} + +bool CPWL_ScrollBar::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) { + CPWL_Wnd::OnLButtonUp(point, nFlag); + + if (HasFlag(PWS_AUTOTRANSPARENT)) { + if (GetTransparency() != PWL_SCROLLBAR_TRANSPARENCY) { + SetTransparency(PWL_SCROLLBAR_TRANSPARENCY); + InvalidateRect(); + } + } + + EndTimer(); + m_bMouseDown = false; + + return true; +} + +void CPWL_ScrollBar::OnNotify(CPWL_Wnd* pWnd, + uint32_t msg, + intptr_t wParam, + intptr_t lParam) { + CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); + + switch (msg) { + case PNM_LBUTTONDOWN: + if (pWnd == m_pMinButton) { + OnMinButtonLBDown(*(CFX_PointF*)lParam); + } + + if (pWnd == m_pMaxButton) { + OnMaxButtonLBDown(*(CFX_PointF*)lParam); + } + + if (pWnd == m_pPosButton) { + OnPosButtonLBDown(*(CFX_PointF*)lParam); + } + break; + case PNM_LBUTTONUP: + if (pWnd == m_pMinButton) { + OnMinButtonLBUp(*(CFX_PointF*)lParam); + } + + if (pWnd == m_pMaxButton) { + OnMaxButtonLBUp(*(CFX_PointF*)lParam); + } + + if (pWnd == m_pPosButton) { + OnPosButtonLBUp(*(CFX_PointF*)lParam); + } + break; + case PNM_MOUSEMOVE: + if (pWnd == m_pMinButton) { + OnMinButtonMouseMove(*(CFX_PointF*)lParam); + } + + if (pWnd == m_pMaxButton) { + OnMaxButtonMouseMove(*(CFX_PointF*)lParam); + } + + if (pWnd == m_pPosButton) { + OnPosButtonMouseMove(*(CFX_PointF*)lParam); + } + break; + case PNM_SETSCROLLINFO: { + PWL_SCROLL_INFO* pInfo = reinterpret_cast(lParam); + if (pInfo && *pInfo != m_OriginInfo) { + m_OriginInfo = *pInfo; + FX_FLOAT fMax = + pInfo->fContentMax - pInfo->fContentMin - pInfo->fPlateWidth; + fMax = fMax > 0.0f ? fMax : 0.0f; + SetScrollRange(0, fMax, pInfo->fPlateWidth); + SetScrollStep(pInfo->fBigStep, pInfo->fSmallStep); + } + } break; + case PNM_SETSCROLLPOS: { + FX_FLOAT fPos = *(FX_FLOAT*)lParam; + switch (m_sbType) { + case SBT_HSCROLL: + fPos = fPos - m_OriginInfo.fContentMin; + break; + case SBT_VSCROLL: + fPos = m_OriginInfo.fContentMax - fPos; + break; + } + SetScrollPos(fPos); + } break; + } +} + +void CPWL_ScrollBar::CreateButtons(const PWL_CREATEPARAM& cp) { + PWL_CREATEPARAM scp = cp; + scp.pParentWnd = this; + scp.dwBorderWidth = 2; + scp.nBorderStyle = BorderStyle::BEVELED; + + scp.dwFlags = + PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PWS_NOREFRESHCLIP; + + if (!m_pMinButton) { + m_pMinButton = new CPWL_SBButton(m_sbType, PSBT_MIN); + m_pMinButton->Create(scp); + } + + if (!m_pMaxButton) { + m_pMaxButton = new CPWL_SBButton(m_sbType, PSBT_MAX); + m_pMaxButton->Create(scp); + } + + if (!m_pPosButton) { + m_pPosButton = new CPWL_SBButton(m_sbType, PSBT_POS); + m_pPosButton->SetVisible(false); + m_pPosButton->Create(scp); + } +} + +FX_FLOAT CPWL_ScrollBar::GetScrollBarWidth() const { + if (!IsVisible()) + return 0; + + return PWL_SCROLLBAR_WIDTH; +} + +void CPWL_ScrollBar::SetScrollRange(FX_FLOAT fMin, + FX_FLOAT fMax, + FX_FLOAT fClientWidth) { + if (m_pPosButton) { + m_sData.SetScrollRange(fMin, fMax); + m_sData.SetClientWidth(fClientWidth); + + if (IsFloatSmaller(m_sData.ScrollRange.GetWidth(), 0.0f)) { + m_pPosButton->SetVisible(false); + } else { + m_pPosButton->SetVisible(true); + MovePosButton(true); + } + } +} + +void CPWL_ScrollBar::SetScrollPos(FX_FLOAT fPos) { + FX_FLOAT fOldPos = m_sData.fScrollPos; + + m_sData.SetPos(fPos); + + if (!IsFloatEqual(m_sData.fScrollPos, fOldPos)) + MovePosButton(true); +} + +void CPWL_ScrollBar::SetScrollStep(FX_FLOAT fBigStep, FX_FLOAT fSmallStep) { + m_sData.SetBigStep(fBigStep); + m_sData.SetSmallStep(fSmallStep); +} + +void CPWL_ScrollBar::MovePosButton(bool bRefresh) { + ASSERT(m_pMinButton); + ASSERT(m_pMaxButton); + + if (m_pPosButton->IsVisible()) { + CFX_FloatRect rcClient; + CFX_FloatRect rcPosArea, rcPosButton; + + rcClient = GetClientRect(); + rcPosArea = GetScrollArea(); + + FX_FLOAT fLeft, fRight, fTop, fBottom; + + switch (m_sbType) { + case SBT_HSCROLL: + fLeft = TrueToFace(m_sData.fScrollPos); + fRight = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth); + + if (fRight - fLeft < PWL_SCROLLBAR_POSBUTTON_MINWIDTH) + fRight = fLeft + PWL_SCROLLBAR_POSBUTTON_MINWIDTH; + + if (fRight > rcPosArea.right) { + fRight = rcPosArea.right; + fLeft = fRight - PWL_SCROLLBAR_POSBUTTON_MINWIDTH; + } + + rcPosButton = + CFX_FloatRect(fLeft, rcPosArea.bottom, fRight, rcPosArea.top); + + break; + case SBT_VSCROLL: + fBottom = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth); + fTop = TrueToFace(m_sData.fScrollPos); + + if (IsFloatSmaller(fTop - fBottom, PWL_SCROLLBAR_POSBUTTON_MINWIDTH)) + fBottom = fTop - PWL_SCROLLBAR_POSBUTTON_MINWIDTH; + + if (IsFloatSmaller(fBottom, rcPosArea.bottom)) { + fBottom = rcPosArea.bottom; + fTop = fBottom + PWL_SCROLLBAR_POSBUTTON_MINWIDTH; + } + + rcPosButton = + CFX_FloatRect(rcPosArea.left, fBottom, rcPosArea.right, fTop); + + break; + } + + m_pPosButton->Move(rcPosButton, true, bRefresh); + } +} + +void CPWL_ScrollBar::OnMinButtonLBDown(const CFX_PointF& point) { + m_sData.SubSmall(); + MovePosButton(true); + NotifyScrollWindow(); + + m_bMinOrMax = true; + + EndTimer(); + BeginTimer(100); +} + +void CPWL_ScrollBar::OnMinButtonLBUp(const CFX_PointF& point) {} + +void CPWL_ScrollBar::OnMinButtonMouseMove(const CFX_PointF& point) {} + +void CPWL_ScrollBar::OnMaxButtonLBDown(const CFX_PointF& point) { + m_sData.AddSmall(); + MovePosButton(true); + NotifyScrollWindow(); + + m_bMinOrMax = false; + + EndTimer(); + BeginTimer(100); +} + +void CPWL_ScrollBar::OnMaxButtonLBUp(const CFX_PointF& point) {} + +void CPWL_ScrollBar::OnMaxButtonMouseMove(const CFX_PointF& point) {} + +void CPWL_ScrollBar::OnPosButtonLBDown(const CFX_PointF& point) { + m_bMouseDown = true; + + if (m_pPosButton) { + CFX_FloatRect rcPosButton = m_pPosButton->GetWindowRect(); + + switch (m_sbType) { + case SBT_HSCROLL: + m_nOldPos = point.x; + m_fOldPosButton = rcPosButton.left; + break; + case SBT_VSCROLL: + m_nOldPos = point.y; + m_fOldPosButton = rcPosButton.top; + break; + } + } +} + +void CPWL_ScrollBar::OnPosButtonLBUp(const CFX_PointF& point) { + if (m_bMouseDown) { + if (!m_bNotifyForever) + NotifyScrollWindow(); + } + m_bMouseDown = false; +} + +void CPWL_ScrollBar::OnPosButtonMouseMove(const CFX_PointF& point) { + FX_FLOAT fOldScrollPos = m_sData.fScrollPos; + + FX_FLOAT fNewPos = 0; + + switch (m_sbType) { + case SBT_HSCROLL: + if (FXSYS_fabs(point.x - m_nOldPos) < 1) + return; + fNewPos = FaceToTrue(m_fOldPosButton + point.x - m_nOldPos); + break; + case SBT_VSCROLL: + if (FXSYS_fabs(point.y - m_nOldPos) < 1) + return; + fNewPos = FaceToTrue(m_fOldPosButton + point.y - m_nOldPos); + break; + } + + if (m_bMouseDown) { + switch (m_sbType) { + case SBT_HSCROLL: + + if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) { + fNewPos = m_sData.ScrollRange.fMin; + } + + if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) { + fNewPos = m_sData.ScrollRange.fMax; + } + + m_sData.SetPos(fNewPos); + + break; + case SBT_VSCROLL: + + if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) { + fNewPos = m_sData.ScrollRange.fMin; + } + + if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) { + fNewPos = m_sData.ScrollRange.fMax; + } + + m_sData.SetPos(fNewPos); + + break; + } + + if (!IsFloatEqual(fOldScrollPos, m_sData.fScrollPos)) { + MovePosButton(true); + + if (m_bNotifyForever) + NotifyScrollWindow(); + } + } +} + +void CPWL_ScrollBar::NotifyScrollWindow() { + if (CPWL_Wnd* pParent = GetParentWindow()) { + FX_FLOAT fPos; + switch (m_sbType) { + case SBT_HSCROLL: + fPos = m_OriginInfo.fContentMin + m_sData.fScrollPos; + break; + case SBT_VSCROLL: + fPos = m_OriginInfo.fContentMax - m_sData.fScrollPos; + break; + } + pParent->OnNotify(this, PNM_SCROLLWINDOW, (intptr_t)m_sbType, + (intptr_t)&fPos); + } +} + +CFX_FloatRect CPWL_ScrollBar::GetScrollArea() const { + CFX_FloatRect rcClient = GetClientRect(); + CFX_FloatRect rcArea; + + if (!m_pMinButton || !m_pMaxButton) + return rcClient; + + CFX_FloatRect rcMin = m_pMinButton->GetWindowRect(); + CFX_FloatRect rcMax = m_pMaxButton->GetWindowRect(); + + FX_FLOAT fMinWidth = rcMin.right - rcMin.left; + FX_FLOAT fMinHeight = rcMin.top - rcMin.bottom; + FX_FLOAT fMaxWidth = rcMax.right - rcMax.left; + FX_FLOAT fMaxHeight = rcMax.top - rcMax.bottom; + + switch (m_sbType) { + case SBT_HSCROLL: + if (rcClient.right - rcClient.left > fMinWidth + fMaxWidth + 2) { + rcArea = CFX_FloatRect(rcClient.left + fMinWidth + 1, rcClient.bottom, + rcClient.right - fMaxWidth - 1, rcClient.top); + } else { + rcArea = CFX_FloatRect(rcClient.left + fMinWidth + 1, rcClient.bottom, + rcClient.left + fMinWidth + 1, rcClient.top); + } + break; + case SBT_VSCROLL: + if (rcClient.top - rcClient.bottom > fMinHeight + fMaxHeight + 2) { + rcArea = CFX_FloatRect(rcClient.left, rcClient.bottom + fMinHeight + 1, + rcClient.right, rcClient.top - fMaxHeight - 1); + } else { + rcArea = + CFX_FloatRect(rcClient.left, rcClient.bottom + fMinHeight + 1, + rcClient.right, rcClient.bottom + fMinHeight + 1); + } + break; + } + + rcArea.Normalize(); + + return rcArea; +} + +FX_FLOAT CPWL_ScrollBar::TrueToFace(FX_FLOAT fTrue) { + CFX_FloatRect rcPosArea; + rcPosArea = GetScrollArea(); + + FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth; + fFactWidth = fFactWidth == 0 ? 1 : fFactWidth; + + FX_FLOAT fFace = 0; + + switch (m_sbType) { + case SBT_HSCROLL: + fFace = rcPosArea.left + + fTrue * (rcPosArea.right - rcPosArea.left) / fFactWidth; + break; + case SBT_VSCROLL: + fFace = rcPosArea.top - + fTrue * (rcPosArea.top - rcPosArea.bottom) / fFactWidth; + break; + } + + return fFace; +} + +FX_FLOAT CPWL_ScrollBar::FaceToTrue(FX_FLOAT fFace) { + CFX_FloatRect rcPosArea; + rcPosArea = GetScrollArea(); + + FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth; + fFactWidth = fFactWidth == 0 ? 1 : fFactWidth; + + FX_FLOAT fTrue = 0; + + switch (m_sbType) { + case SBT_HSCROLL: + fTrue = (fFace - rcPosArea.left) * fFactWidth / + (rcPosArea.right - rcPosArea.left); + break; + case SBT_VSCROLL: + fTrue = (rcPosArea.top - fFace) * fFactWidth / + (rcPosArea.top - rcPosArea.bottom); + break; + } + + return fTrue; +} + +void CPWL_ScrollBar::CreateChildWnd(const PWL_CREATEPARAM& cp) { + CreateButtons(cp); +} + +void CPWL_ScrollBar::TimerProc() { + PWL_SCROLL_PRIVATEDATA sTemp = m_sData; + if (m_bMinOrMax) + m_sData.SubSmall(); + else + m_sData.AddSmall(); + + if (sTemp != m_sData) { + MovePosButton(true); + NotifyScrollWindow(); + } +} diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ScrollBar.h b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ScrollBar.h new file mode 100644 index 000000000000..9546a9e577c7 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_ScrollBar.h @@ -0,0 +1,183 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFWINDOW_PWL_SCROLLBAR_H_ +#define FPDFSDK_PDFWINDOW_PWL_SCROLLBAR_H_ + +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +class CPWL_SBButton; +class CPWL_ScrollBar; + +struct PWL_SCROLL_INFO { + public: + PWL_SCROLL_INFO() + : fContentMin(0.0f), + fContentMax(0.0f), + fPlateWidth(0.0f), + fBigStep(0.0f), + fSmallStep(0.0f) {} + + bool operator==(const PWL_SCROLL_INFO& that) const { + return fContentMin == that.fContentMin && fContentMax == that.fContentMax && + fPlateWidth == that.fPlateWidth && fBigStep == that.fBigStep && + fSmallStep == that.fSmallStep; + } + bool operator!=(const PWL_SCROLL_INFO& that) const { + return !(*this == that); + } + + FX_FLOAT fContentMin; + FX_FLOAT fContentMax; + FX_FLOAT fPlateWidth; + FX_FLOAT fBigStep; + FX_FLOAT fSmallStep; +}; + +enum PWL_SCROLLBAR_TYPE { SBT_HSCROLL, SBT_VSCROLL }; + +enum PWL_SBBUTTON_TYPE { PSBT_MIN, PSBT_MAX, PSBT_POS }; + +class CPWL_SBButton : public CPWL_Wnd { + public: + CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType, + PWL_SBBUTTON_TYPE eButtonType); + ~CPWL_SBButton() override; + + // CPWL_Wnd + CFX_ByteString GetClassName() const override; + void OnCreate(PWL_CREATEPARAM& cp) override; + void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override; + void DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) override; + bool OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) override; + bool OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) override; + bool OnMouseMove(const CFX_PointF& point, uint32_t nFlag) override; + + protected: + PWL_SCROLLBAR_TYPE m_eScrollBarType; + PWL_SBBUTTON_TYPE m_eSBButtonType; + + bool m_bMouseDown; +}; + +struct PWL_FLOATRANGE { + public: + PWL_FLOATRANGE(); + PWL_FLOATRANGE(FX_FLOAT min, FX_FLOAT max); + + bool operator==(const PWL_FLOATRANGE& that) const { + return fMin == that.fMin && fMax == that.fMax; + } + bool operator!=(const PWL_FLOATRANGE& that) const { return !(*this == that); } + + void Default(); + void Set(FX_FLOAT min, FX_FLOAT max); + bool In(FX_FLOAT x) const; + FX_FLOAT GetWidth() const; + + FX_FLOAT fMin; + FX_FLOAT fMax; +}; + +struct PWL_SCROLL_PRIVATEDATA { + public: + PWL_SCROLL_PRIVATEDATA(); + + bool operator==(const PWL_SCROLL_PRIVATEDATA& that) const { + return ScrollRange == that.ScrollRange && + fClientWidth == that.fClientWidth && fScrollPos == that.fScrollPos && + fBigStep == that.fBigStep && fSmallStep == that.fSmallStep; + } + bool operator!=(const PWL_SCROLL_PRIVATEDATA& that) const { + return !(*this == that); + } + + void Default(); + void SetScrollRange(FX_FLOAT min, FX_FLOAT max); + void SetClientWidth(FX_FLOAT width); + void SetSmallStep(FX_FLOAT step); + void SetBigStep(FX_FLOAT step); + bool SetPos(FX_FLOAT pos); + + void AddSmall(); + void SubSmall(); + void AddBig(); + void SubBig(); + + PWL_FLOATRANGE ScrollRange; + FX_FLOAT fClientWidth; + FX_FLOAT fScrollPos; + FX_FLOAT fBigStep; + FX_FLOAT fSmallStep; +}; + +class CPWL_ScrollBar : public CPWL_Wnd { + public: + explicit CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType = SBT_HSCROLL); + ~CPWL_ScrollBar() override; + + // CPWL_Wnd + CFX_ByteString GetClassName() const override; + void OnCreate(PWL_CREATEPARAM& cp) override; + void RePosChildWnd() override; + void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override; + void DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) override; + bool OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) override; + bool OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) override; + void OnNotify(CPWL_Wnd* pWnd, + uint32_t msg, + intptr_t wParam = 0, + intptr_t lParam = 0) override; + void CreateChildWnd(const PWL_CREATEPARAM& cp) override; + void TimerProc() override; + + FX_FLOAT GetScrollBarWidth() const; + PWL_SCROLLBAR_TYPE GetScrollBarType() const { return m_sbType; } + + void SetNotifyForever(bool bForever) { m_bNotifyForever = bForever; } + + protected: + void SetScrollRange(FX_FLOAT fMin, FX_FLOAT fMax, FX_FLOAT fClientWidth); + void SetScrollPos(FX_FLOAT fPos); + void MovePosButton(bool bRefresh); + void SetScrollStep(FX_FLOAT fBigStep, FX_FLOAT fSmallStep); + void NotifyScrollWindow(); + CFX_FloatRect GetScrollArea() const; + + private: + void CreateButtons(const PWL_CREATEPARAM& cp); + + void OnMinButtonLBDown(const CFX_PointF& point); + void OnMinButtonLBUp(const CFX_PointF& point); + void OnMinButtonMouseMove(const CFX_PointF& point); + + void OnMaxButtonLBDown(const CFX_PointF& point); + void OnMaxButtonLBUp(const CFX_PointF& point); + void OnMaxButtonMouseMove(const CFX_PointF& point); + + void OnPosButtonLBDown(const CFX_PointF& point); + void OnPosButtonLBUp(const CFX_PointF& point); + void OnPosButtonMouseMove(const CFX_PointF& point); + + FX_FLOAT TrueToFace(FX_FLOAT); + FX_FLOAT FaceToTrue(FX_FLOAT); + + PWL_SCROLLBAR_TYPE m_sbType; + PWL_SCROLL_INFO m_OriginInfo; + CPWL_SBButton* m_pMinButton; + CPWL_SBButton* m_pMaxButton; + CPWL_SBButton* m_pPosButton; + PWL_SCROLL_PRIVATEDATA m_sData; + bool m_bMouseDown; + bool m_bMinOrMax; + bool m_bNotifyForever; + FX_FLOAT m_nOldPos; + FX_FLOAT m_fOldPosButton; +}; + +#endif // FPDFSDK_PDFWINDOW_PWL_SCROLLBAR_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_SpecialButton.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_SpecialButton.cpp new file mode 100644 index 000000000000..1c46c375a9d9 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_SpecialButton.cpp @@ -0,0 +1,80 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/pdfwindow/PWL_Button.h" +#include "fpdfsdk/pdfwindow/PWL_SpecialButton.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +CPWL_PushButton::CPWL_PushButton() {} + +CPWL_PushButton::~CPWL_PushButton() {} + +CFX_ByteString CPWL_PushButton::GetClassName() const { + return "CPWL_PushButton"; +} + +CFX_FloatRect CPWL_PushButton::GetFocusRect() const { + return CPWL_Utils::DeflateRect(GetWindowRect(), (FX_FLOAT)GetBorderWidth()); +} + +CPWL_CheckBox::CPWL_CheckBox() : m_bChecked(false) {} + +CPWL_CheckBox::~CPWL_CheckBox() {} + +CFX_ByteString CPWL_CheckBox::GetClassName() const { + return "CPWL_CheckBox"; +} + +void CPWL_CheckBox::SetCheck(bool bCheck) { + m_bChecked = bCheck; +} + +bool CPWL_CheckBox::IsChecked() const { + return m_bChecked; +} + +bool CPWL_CheckBox::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) { + if (IsReadOnly()) + return false; + + SetCheck(!IsChecked()); + return true; +} + +bool CPWL_CheckBox::OnChar(uint16_t nChar, uint32_t nFlag) { + SetCheck(!IsChecked()); + return true; +} + +CPWL_RadioButton::CPWL_RadioButton() : m_bChecked(false) {} + +CPWL_RadioButton::~CPWL_RadioButton() {} + +CFX_ByteString CPWL_RadioButton::GetClassName() const { + return "CPWL_RadioButton"; +} + +bool CPWL_RadioButton::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) { + if (IsReadOnly()) + return false; + + SetCheck(true); + return true; +} + +void CPWL_RadioButton::SetCheck(bool bCheck) { + m_bChecked = bCheck; +} + +bool CPWL_RadioButton::IsChecked() const { + return m_bChecked; +} + +bool CPWL_RadioButton::OnChar(uint16_t nChar, uint32_t nFlag) { + SetCheck(true); + return true; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_SpecialButton.h b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_SpecialButton.h new file mode 100644 index 000000000000..93f611b74462 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_SpecialButton.h @@ -0,0 +1,56 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFWINDOW_PWL_SPECIALBUTTON_H_ +#define FPDFSDK_PDFWINDOW_PWL_SPECIALBUTTON_H_ + +#include "fpdfsdk/pdfwindow/PWL_Button.h" + +class CPWL_PushButton : public CPWL_Button { + public: + CPWL_PushButton(); + ~CPWL_PushButton() override; + + // CPWL_Button + CFX_ByteString GetClassName() const override; + CFX_FloatRect GetFocusRect() const override; +}; + +class CPWL_CheckBox : public CPWL_Button { + public: + CPWL_CheckBox(); + ~CPWL_CheckBox() override; + + // CPWL_Button + CFX_ByteString GetClassName() const override; + bool OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) override; + bool OnChar(uint16_t nChar, uint32_t nFlag) override; + + void SetCheck(bool bCheck); + bool IsChecked() const; + + private: + bool m_bChecked; +}; + +class CPWL_RadioButton : public CPWL_Button { + public: + CPWL_RadioButton(); + ~CPWL_RadioButton() override; + + // CPWL_Button + CFX_ByteString GetClassName() const override; + bool OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) override; + bool OnChar(uint16_t nChar, uint32_t nFlag) override; + + void SetCheck(bool bCheck); + bool IsChecked() const; + + private: + bool m_bChecked; +}; + +#endif // FPDFSDK_PDFWINDOW_PWL_SPECIALBUTTON_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Utils.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Utils.cpp new file mode 100644 index 000000000000..45668b6a25fd --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Utils.cpp @@ -0,0 +1,1172 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/pdfwindow/PWL_Utils.h" + +#include +#include + +#include "core/fpdfdoc/cpvt_word.h" +#include "core/fxge/cfx_graphstatedata.h" +#include "core/fxge/cfx_pathdata.h" +#include "core/fxge/cfx_renderdevice.h" +#include "fpdfsdk/fxedit/fxet_edit.h" +#include "fpdfsdk/pdfwindow/PWL_Icon.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +CFX_FloatRect CPWL_Utils::OffsetRect(const CFX_FloatRect& rect, + FX_FLOAT x, + FX_FLOAT y) { + return CFX_FloatRect(rect.left + x, rect.bottom + y, rect.right + x, + rect.top + y); +} + +CPVT_WordRange CPWL_Utils::OverlapWordRange(const CPVT_WordRange& wr1, + const CPVT_WordRange& wr2) { + CPVT_WordRange wrRet; + + if (wr2.EndPos.WordCmp(wr1.BeginPos) < 0 || + wr2.BeginPos.WordCmp(wr1.EndPos) > 0) + return wrRet; + if (wr1.EndPos.WordCmp(wr2.BeginPos) < 0 || + wr1.BeginPos.WordCmp(wr2.EndPos) > 0) + return wrRet; + + if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0) { + wrRet.BeginPos = wr2.BeginPos; + } else { + wrRet.BeginPos = wr1.BeginPos; + } + + if (wr1.EndPos.WordCmp(wr2.EndPos) < 0) { + wrRet.EndPos = wr1.EndPos; + } else { + wrRet.EndPos = wr2.EndPos; + } + + return wrRet; +} + +CFX_ByteString CPWL_Utils::GetAP_Check(const CFX_FloatRect& crBBox) { + const FX_FLOAT fWidth = crBBox.right - crBBox.left; + const FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CFX_PointF pts[8][3] = {{CFX_PointF(0.28f, 0.52f), CFX_PointF(0.27f, 0.48f), + CFX_PointF(0.29f, 0.40f)}, + {CFX_PointF(0.30f, 0.33f), CFX_PointF(0.31f, 0.29f), + CFX_PointF(0.31f, 0.28f)}, + {CFX_PointF(0.39f, 0.28f), CFX_PointF(0.49f, 0.29f), + CFX_PointF(0.77f, 0.67f)}, + {CFX_PointF(0.76f, 0.68f), CFX_PointF(0.78f, 0.69f), + CFX_PointF(0.76f, 0.75f)}, + {CFX_PointF(0.76f, 0.75f), CFX_PointF(0.73f, 0.80f), + CFX_PointF(0.68f, 0.75f)}, + {CFX_PointF(0.68f, 0.74f), CFX_PointF(0.68f, 0.74f), + CFX_PointF(0.44f, 0.47f)}, + {CFX_PointF(0.43f, 0.47f), CFX_PointF(0.40f, 0.47f), + CFX_PointF(0.41f, 0.58f)}, + {CFX_PointF(0.40f, 0.60f), CFX_PointF(0.28f, 0.66f), + CFX_PointF(0.30f, 0.56f)}}; + + for (size_t i = 0; i < FX_ArraySize(pts); ++i) { + for (size_t j = 0; j < FX_ArraySize(pts[0]); ++j) { + pts[i][j].x = pts[i][j].x * fWidth + crBBox.left; + pts[i][j].y *= pts[i][j].y * fHeight + crBBox.bottom; + } + } + + CFX_ByteTextBuf csAP; + csAP << pts[0][0].x << " " << pts[0][0].y << " m\n"; + + for (size_t i = 0; i < FX_ArraySize(pts); ++i) { + size_t nNext = i < FX_ArraySize(pts) - 1 ? i + 1 : 0; + + FX_FLOAT px1 = pts[i][1].x - pts[i][0].x; + FX_FLOAT py1 = pts[i][1].y - pts[i][0].y; + FX_FLOAT px2 = pts[i][2].x - pts[nNext][0].x; + FX_FLOAT py2 = pts[i][2].y - pts[nNext][0].y; + + csAP << pts[i][0].x + px1 * FX_BEZIER << " " + << pts[i][0].y + py1 * FX_BEZIER << " " + << pts[nNext][0].x + px2 * FX_BEZIER << " " + << pts[nNext][0].y + py2 * FX_BEZIER << " " << pts[nNext][0].x << " " + << pts[nNext][0].y << " c\n"; + } + + return csAP.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetAP_Circle(const CFX_FloatRect& crBBox) { + CFX_ByteTextBuf csAP; + + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CFX_PointF pt1(crBBox.left, crBBox.bottom + fHeight / 2); + CFX_PointF pt2(crBBox.left + fWidth / 2, crBBox.top); + CFX_PointF pt3(crBBox.right, crBBox.bottom + fHeight / 2); + CFX_PointF pt4(crBBox.left + fWidth / 2, crBBox.bottom); + + csAP << pt1.x << " " << pt1.y << " m\n"; + + FX_FLOAT px = pt2.x - pt1.x; + FX_FLOAT py = pt2.y - pt1.y; + + csAP << pt1.x << " " << pt1.y + py * FX_BEZIER << " " + << pt2.x - px * FX_BEZIER << " " << pt2.y << " " << pt2.x << " " << pt2.y + << " c\n"; + + px = pt3.x - pt2.x; + py = pt2.y - pt3.y; + + csAP << pt2.x + px * FX_BEZIER << " " << pt2.y << " " << pt3.x << " " + << pt3.y + py * FX_BEZIER << " " << pt3.x << " " << pt3.y << " c\n"; + + px = pt3.x - pt4.x; + py = pt3.y - pt4.y; + + csAP << pt3.x << " " << pt3.y - py * FX_BEZIER << " " + << pt4.x + px * FX_BEZIER << " " << pt4.y << " " << pt4.x << " " << pt4.y + << " c\n"; + + px = pt4.x - pt1.x; + py = pt1.y - pt4.y; + + csAP << pt4.x - px * FX_BEZIER << " " << pt4.y << " " << pt1.x << " " + << pt1.y - py * FX_BEZIER << " " << pt1.x << " " << pt1.y << " c\n"; + + return csAP.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetAP_Cross(const CFX_FloatRect& crBBox) { + CFX_ByteTextBuf csAP; + + csAP << crBBox.left << " " << crBBox.top << " m\n"; + csAP << crBBox.right << " " << crBBox.bottom << " l\n"; + csAP << crBBox.left << " " << crBBox.bottom << " m\n"; + csAP << crBBox.right << " " << crBBox.top << " l\n"; + + return csAP.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetAP_Diamond(const CFX_FloatRect& crBBox) { + CFX_ByteTextBuf csAP; + + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CFX_PointF pt1(crBBox.left, crBBox.bottom + fHeight / 2); + CFX_PointF pt2(crBBox.left + fWidth / 2, crBBox.top); + CFX_PointF pt3(crBBox.right, crBBox.bottom + fHeight / 2); + CFX_PointF pt4(crBBox.left + fWidth / 2, crBBox.bottom); + + csAP << pt1.x << " " << pt1.y << " m\n"; + csAP << pt2.x << " " << pt2.y << " l\n"; + csAP << pt3.x << " " << pt3.y << " l\n"; + csAP << pt4.x << " " << pt4.y << " l\n"; + csAP << pt1.x << " " << pt1.y << " l\n"; + + return csAP.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetAP_Square(const CFX_FloatRect& crBBox) { + CFX_ByteTextBuf csAP; + + csAP << crBBox.left << " " << crBBox.top << " m\n"; + csAP << crBBox.right << " " << crBBox.top << " l\n"; + csAP << crBBox.right << " " << crBBox.bottom << " l\n"; + csAP << crBBox.left << " " << crBBox.bottom << " l\n"; + csAP << crBBox.left << " " << crBBox.top << " l\n"; + + return csAP.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetAP_Star(const CFX_FloatRect& crBBox) { + CFX_ByteTextBuf csAP; + + FX_FLOAT fRadius = + (crBBox.top - crBBox.bottom) / (1 + (FX_FLOAT)cos(FX_PI / 5.0f)); + CFX_PointF ptCenter = CFX_PointF((crBBox.left + crBBox.right) / 2.0f, + (crBBox.top + crBBox.bottom) / 2.0f); + + FX_FLOAT px[5], py[5]; + + FX_FLOAT fAngel = FX_PI / 10.0f; + + for (int32_t i = 0; i < 5; i++) { + px[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel); + py[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel); + + fAngel += FX_PI * 2 / 5.0f; + } + + csAP << px[0] << " " << py[0] << " m\n"; + + int32_t nNext = 0; + for (int32_t j = 0; j < 5; j++) { + nNext += 2; + if (nNext >= 5) + nNext -= 5; + csAP << px[nNext] << " " << py[nNext] << " l\n"; + } + + return csAP.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetAP_HalfCircle(const CFX_FloatRect& crBBox, + FX_FLOAT fRotate) { + CFX_ByteTextBuf csAP; + + FX_FLOAT fWidth = crBBox.right - crBBox.left; + FX_FLOAT fHeight = crBBox.top - crBBox.bottom; + + CFX_PointF pt1(-fWidth / 2, 0); + CFX_PointF pt2(0, fHeight / 2); + CFX_PointF pt3(fWidth / 2, 0); + + FX_FLOAT px, py; + + csAP << cos(fRotate) << " " << sin(fRotate) << " " << -sin(fRotate) << " " + << cos(fRotate) << " " << crBBox.left + fWidth / 2 << " " + << crBBox.bottom + fHeight / 2 << " cm\n"; + + csAP << pt1.x << " " << pt1.y << " m\n"; + + px = pt2.x - pt1.x; + py = pt2.y - pt1.y; + + csAP << pt1.x << " " << pt1.y + py * FX_BEZIER << " " + << pt2.x - px * FX_BEZIER << " " << pt2.y << " " << pt2.x << " " << pt2.y + << " c\n"; + + px = pt3.x - pt2.x; + py = pt2.y - pt3.y; + + csAP << pt2.x + px * FX_BEZIER << " " << pt2.y << " " << pt3.x << " " + << pt3.y + py * FX_BEZIER << " " << pt3.x << " " << pt3.y << " c\n"; + + return csAP.MakeString(); +} + +CFX_FloatRect CPWL_Utils::InflateRect(const CFX_FloatRect& rcRect, + FX_FLOAT fSize) { + if (rcRect.IsEmpty()) + return rcRect; + + CFX_FloatRect rcNew(rcRect.left - fSize, rcRect.bottom - fSize, + rcRect.right + fSize, rcRect.top + fSize); + rcNew.Normalize(); + return rcNew; +} + +CFX_FloatRect CPWL_Utils::DeflateRect(const CFX_FloatRect& rcRect, + FX_FLOAT fSize) { + if (rcRect.IsEmpty()) + return rcRect; + + CFX_FloatRect rcNew(rcRect.left + fSize, rcRect.bottom + fSize, + rcRect.right - fSize, rcRect.top - fSize); + rcNew.Normalize(); + return rcNew; +} + +CFX_FloatRect CPWL_Utils::ScaleRect(const CFX_FloatRect& rcRect, + FX_FLOAT fScale) { + FX_FLOAT fHalfWidth = (rcRect.right - rcRect.left) / 2.0f; + FX_FLOAT fHalfHeight = (rcRect.top - rcRect.bottom) / 2.0f; + + CFX_PointF ptCenter = CFX_PointF((rcRect.left + rcRect.right) / 2, + (rcRect.top + rcRect.bottom) / 2); + + return CFX_FloatRect( + ptCenter.x - fHalfWidth * fScale, ptCenter.y - fHalfHeight * fScale, + ptCenter.x + fHalfWidth * fScale, ptCenter.y + fHalfHeight * fScale); +} + +CFX_ByteString CPWL_Utils::GetRectFillAppStream(const CFX_FloatRect& rect, + const CPWL_Color& color) { + CFX_ByteTextBuf sAppStream; + CFX_ByteString sColor = GetColorAppStream(color, true); + if (sColor.GetLength() > 0) { + sAppStream << "q\n" << sColor; + sAppStream << rect.left << " " << rect.bottom << " " + << rect.right - rect.left << " " << rect.top - rect.bottom + << " re f\nQ\n"; + } + + return sAppStream.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetCircleFillAppStream(const CFX_FloatRect& rect, + const CPWL_Color& color) { + CFX_ByteTextBuf sAppStream; + CFX_ByteString sColor = GetColorAppStream(color, true); + if (sColor.GetLength() > 0) { + sAppStream << "q\n" << sColor << CPWL_Utils::GetAP_Circle(rect) << "f\nQ\n"; + } + return sAppStream.MakeString(); +} + +CFX_FloatRect CPWL_Utils::GetCenterSquare(const CFX_FloatRect& rect) { + FX_FLOAT fWidth = rect.right - rect.left; + FX_FLOAT fHeight = rect.top - rect.bottom; + + FX_FLOAT fCenterX = (rect.left + rect.right) / 2.0f; + FX_FLOAT fCenterY = (rect.top + rect.bottom) / 2.0f; + + FX_FLOAT fRadius = (fWidth > fHeight) ? fHeight / 2 : fWidth / 2; + + return CFX_FloatRect(fCenterX - fRadius, fCenterY - fRadius, + fCenterX + fRadius, fCenterY + fRadius); +} + +CFX_ByteString CPWL_Utils::GetEditAppStream(CFX_Edit* pEdit, + const CFX_PointF& ptOffset, + const CPVT_WordRange* pRange, + bool bContinuous, + uint16_t SubWord) { + return CFX_Edit::GetEditAppearanceStream(pEdit, ptOffset, pRange, bContinuous, + SubWord); +} + +CFX_ByteString CPWL_Utils::GetEditSelAppStream(CFX_Edit* pEdit, + const CFX_PointF& ptOffset, + const CPVT_WordRange* pRange) { + return CFX_Edit::GetSelectAppearanceStream(pEdit, ptOffset, pRange); +} + +CFX_ByteString CPWL_Utils::GetPushButtonAppStream(const CFX_FloatRect& rcBBox, + IPVT_FontMap* pFontMap, + CPDF_Stream* pIconStream, + CPDF_IconFit& IconFit, + const CFX_WideString& sLabel, + const CPWL_Color& crText, + FX_FLOAT fFontSize, + int32_t nLayOut) { + const FX_FLOAT fAutoFontScale = 1.0f / 3.0f; + + std::unique_ptr pEdit(new CFX_Edit); + pEdit->SetFontMap(pFontMap); + pEdit->SetAlignmentH(1, true); + pEdit->SetAlignmentV(1, true); + pEdit->SetMultiLine(false, true); + pEdit->SetAutoReturn(false, true); + if (IsFloatZero(fFontSize)) + pEdit->SetAutoFontSize(true, true); + else + pEdit->SetFontSize(fFontSize); + + pEdit->Initialize(); + pEdit->SetText(sLabel); + + CFX_FloatRect rcLabelContent = pEdit->GetContentRect(); + CPWL_Icon Icon; + PWL_CREATEPARAM cp; + cp.dwFlags = PWS_VISIBLE; + Icon.Create(cp); + Icon.SetIconFit(&IconFit); + Icon.SetPDFStream(pIconStream); + + CFX_FloatRect rcLabel = CFX_FloatRect(0, 0, 0, 0); + CFX_FloatRect rcIcon = CFX_FloatRect(0, 0, 0, 0); + FX_FLOAT fWidth = 0.0f; + FX_FLOAT fHeight = 0.0f; + + switch (nLayOut) { + case PPBL_LABEL: + rcLabel = rcBBox; + rcIcon = CFX_FloatRect(0, 0, 0, 0); + break; + case PPBL_ICON: + rcIcon = rcBBox; + rcLabel = CFX_FloatRect(0, 0, 0, 0); + break; + case PPBL_ICONTOPLABELBOTTOM: + + if (pIconStream) { + if (IsFloatZero(fFontSize)) { + fHeight = rcBBox.top - rcBBox.bottom; + rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcBBox.right, + rcBBox.bottom + fHeight * fAutoFontScale); + rcIcon = + CFX_FloatRect(rcBBox.left, rcLabel.top, rcBBox.right, rcBBox.top); + } else { + fHeight = rcLabelContent.Height(); + + if (rcBBox.bottom + fHeight > rcBBox.top) { + rcIcon = CFX_FloatRect(0, 0, 0, 0); + rcLabel = rcBBox; + } else { + rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcBBox.right, + rcBBox.bottom + fHeight); + rcIcon = CFX_FloatRect(rcBBox.left, rcLabel.top, rcBBox.right, + rcBBox.top); + } + } + } else { + rcLabel = rcBBox; + rcIcon = CFX_FloatRect(0, 0, 0, 0); + } + + break; + case PPBL_LABELTOPICONBOTTOM: + + if (pIconStream) { + if (IsFloatZero(fFontSize)) { + fHeight = rcBBox.top - rcBBox.bottom; + rcLabel = + CFX_FloatRect(rcBBox.left, rcBBox.top - fHeight * fAutoFontScale, + rcBBox.right, rcBBox.top); + rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcBBox.right, + rcLabel.bottom); + } else { + fHeight = rcLabelContent.Height(); + + if (rcBBox.bottom + fHeight > rcBBox.top) { + rcIcon = CFX_FloatRect(0, 0, 0, 0); + rcLabel = rcBBox; + } else { + rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.top - fHeight, + rcBBox.right, rcBBox.top); + rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcBBox.right, + rcLabel.bottom); + } + } + } else { + rcLabel = rcBBox; + rcIcon = CFX_FloatRect(0, 0, 0, 0); + } + + break; + case PPBL_ICONLEFTLABELRIGHT: + + if (pIconStream) { + if (IsFloatZero(fFontSize)) { + fWidth = rcBBox.right - rcBBox.left; + rcLabel = CFX_FloatRect(rcBBox.right - fWidth * fAutoFontScale, + rcBBox.bottom, rcBBox.right, rcBBox.top); + rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcLabel.left, + rcBBox.top); + + if (rcLabelContent.Width() < fWidth * fAutoFontScale) { + } else { + if (rcLabelContent.Width() < fWidth) { + rcLabel = CFX_FloatRect(rcBBox.right - rcLabelContent.Width(), + rcBBox.bottom, rcBBox.right, rcBBox.top); + rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcLabel.left, + rcBBox.top); + } else { + rcLabel = rcBBox; + rcIcon = CFX_FloatRect(0, 0, 0, 0); + } + } + } else { + fWidth = rcLabelContent.Width(); + + if (rcBBox.left + fWidth > rcBBox.right) { + rcLabel = rcBBox; + rcIcon = CFX_FloatRect(0, 0, 0, 0); + } else { + rcLabel = CFX_FloatRect(rcBBox.right - fWidth, rcBBox.bottom, + rcBBox.right, rcBBox.top); + rcIcon = CFX_FloatRect(rcBBox.left, rcBBox.bottom, rcLabel.left, + rcBBox.top); + } + } + } else { + rcLabel = rcBBox; + rcIcon = CFX_FloatRect(0, 0, 0, 0); + } + + break; + case PPBL_LABELLEFTICONRIGHT: + + if (pIconStream) { + if (IsFloatZero(fFontSize)) { + fWidth = rcBBox.right - rcBBox.left; + rcLabel = + CFX_FloatRect(rcBBox.left, rcBBox.bottom, + rcBBox.left + fWidth * fAutoFontScale, rcBBox.top); + rcIcon = CFX_FloatRect(rcLabel.right, rcBBox.bottom, rcBBox.right, + rcBBox.top); + + if (rcLabelContent.Width() < fWidth * fAutoFontScale) { + } else { + if (rcLabelContent.Width() < fWidth) { + rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.bottom, + rcBBox.left + rcLabelContent.Width(), + rcBBox.top); + rcIcon = CFX_FloatRect(rcLabel.right, rcBBox.bottom, rcBBox.right, + rcBBox.top); + } else { + rcLabel = rcBBox; + rcIcon = CFX_FloatRect(0, 0, 0, 0); + } + } + } else { + fWidth = rcLabelContent.Width(); + + if (rcBBox.left + fWidth > rcBBox.right) { + rcLabel = rcBBox; + rcIcon = CFX_FloatRect(0, 0, 0, 0); + } else { + rcLabel = CFX_FloatRect(rcBBox.left, rcBBox.bottom, + rcBBox.left + fWidth, rcBBox.top); + rcIcon = CFX_FloatRect(rcLabel.right, rcBBox.bottom, rcBBox.right, + rcBBox.top); + } + } + } else { + rcLabel = rcBBox; + rcIcon = CFX_FloatRect(0, 0, 0, 0); + } + + break; + case PPBL_LABELOVERICON: + rcLabel = rcBBox; + rcIcon = rcBBox; + break; + } + + CFX_ByteTextBuf sAppStream, sTemp; + + if (!rcIcon.IsEmpty()) { + Icon.Move(rcIcon, false, false); + sTemp << Icon.GetImageAppStream(); + } + + Icon.Destroy(); + + if (!rcLabel.IsEmpty()) { + pEdit->SetPlateRect(rcLabel); + CFX_ByteString sEdit = + CPWL_Utils::GetEditAppStream(pEdit.get(), CFX_PointF(0.0f, 0.0f)); + if (sEdit.GetLength() > 0) { + sTemp << "BT\n" + << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n"; + } + } + + if (sTemp.GetSize() > 0) { + sAppStream << "q\n" + << rcBBox.left << " " << rcBBox.bottom << " " + << rcBBox.right - rcBBox.left << " " + << rcBBox.top - rcBBox.bottom << " re W n\n"; + sAppStream << sTemp << "Q\n"; + } + return sAppStream.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetColorAppStream(const CPWL_Color& color, + const bool& bFillOrStroke) { + CFX_ByteTextBuf sColorStream; + + switch (color.nColorType) { + case COLORTYPE_RGB: + sColorStream << color.fColor1 << " " << color.fColor2 << " " + << color.fColor3 << " " << (bFillOrStroke ? "rg" : "RG") + << "\n"; + break; + case COLORTYPE_GRAY: + sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") + << "\n"; + break; + case COLORTYPE_CMYK: + sColorStream << color.fColor1 << " " << color.fColor2 << " " + << color.fColor3 << " " << color.fColor4 << " " + << (bFillOrStroke ? "k" : "K") << "\n"; + break; + } + + return sColorStream.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetBorderAppStream(const CFX_FloatRect& rect, + FX_FLOAT fWidth, + const CPWL_Color& color, + const CPWL_Color& crLeftTop, + const CPWL_Color& crRightBottom, + BorderStyle nStyle, + const CPWL_Dash& dash) { + CFX_ByteTextBuf sAppStream; + CFX_ByteString sColor; + + FX_FLOAT fLeft = rect.left; + FX_FLOAT fRight = rect.right; + FX_FLOAT fTop = rect.top; + FX_FLOAT fBottom = rect.bottom; + + if (fWidth > 0.0f) { + FX_FLOAT fHalfWidth = fWidth / 2.0f; + + sAppStream << "q\n"; + + switch (nStyle) { + default: + case BorderStyle::SOLID: + sColor = CPWL_Utils::GetColorAppStream(color, true); + if (sColor.GetLength() > 0) { + sAppStream << sColor; + sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " + << fTop - fBottom << " re\n"; + sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " " + << fRight - fLeft - fWidth * 2 << " " + << fTop - fBottom - fWidth * 2 << " re\n"; + sAppStream << "f*\n"; + } + break; + case BorderStyle::DASH: + sColor = CPWL_Utils::GetColorAppStream(color, false); + if (sColor.GetLength() > 0) { + sAppStream << sColor; + sAppStream << fWidth << " w" + << " [" << dash.nDash << " " << dash.nGap << "] " + << dash.nPhase << " d\n"; + sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 + << " m\n"; + sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 + << " l\n"; + sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 + << " l\n"; + sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 + << " l\n"; + sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 + << " l S\n"; + } + break; + case BorderStyle::BEVELED: + case BorderStyle::INSET: + sColor = CPWL_Utils::GetColorAppStream(crLeftTop, true); + if (sColor.GetLength() > 0) { + sAppStream << sColor; + sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth + << " m\n"; + sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth + << " l\n"; + sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth + << " l\n"; + sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 + << " l\n"; + sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 + << " l\n"; + sAppStream << fLeft + fHalfWidth * 2 << " " + << fBottom + fHalfWidth * 2 << " l f\n"; + } + + sColor = CPWL_Utils::GetColorAppStream(crRightBottom, true); + if (sColor.GetLength() > 0) { + sAppStream << sColor; + sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth + << " m\n"; + sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth + << " l\n"; + sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth + << " l\n"; + sAppStream << fLeft + fHalfWidth * 2 << " " + << fBottom + fHalfWidth * 2 << " l\n"; + sAppStream << fRight - fHalfWidth * 2 << " " + << fBottom + fHalfWidth * 2 << " l\n"; + sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 + << " l f\n"; + } + + sColor = CPWL_Utils::GetColorAppStream(color, true); + if (sColor.GetLength() > 0) { + sAppStream << sColor; + sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " + << fTop - fBottom << " re\n"; + sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " " + << fRight - fLeft - fHalfWidth * 2 << " " + << fTop - fBottom - fHalfWidth * 2 << " re f*\n"; + } + break; + case BorderStyle::UNDERLINE: + sColor = CPWL_Utils::GetColorAppStream(color, false); + if (sColor.GetLength() > 0) { + sAppStream << sColor; + sAppStream << fWidth << " w\n"; + sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n"; + sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n"; + } + break; + } + + sAppStream << "Q\n"; + } + + return sAppStream.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetCircleBorderAppStream( + const CFX_FloatRect& rect, + FX_FLOAT fWidth, + const CPWL_Color& color, + const CPWL_Color& crLeftTop, + const CPWL_Color& crRightBottom, + BorderStyle nStyle, + const CPWL_Dash& dash) { + CFX_ByteTextBuf sAppStream; + CFX_ByteString sColor; + + if (fWidth > 0.0f) { + sAppStream << "q\n"; + + switch (nStyle) { + default: + case BorderStyle::SOLID: + case BorderStyle::UNDERLINE: { + sColor = CPWL_Utils::GetColorAppStream(color, false); + if (sColor.GetLength() > 0) { + sAppStream << "q\n" << fWidth << " w\n" << sColor + << CPWL_Utils::GetAP_Circle( + CPWL_Utils::DeflateRect(rect, fWidth / 2.0f)) + << " S\nQ\n"; + } + } break; + case BorderStyle::DASH: { + sColor = CPWL_Utils::GetColorAppStream(color, false); + if (sColor.GetLength() > 0) { + sAppStream << "q\n" << fWidth << " w\n" + << "[" << dash.nDash << " " << dash.nGap << "] " + << dash.nPhase << " d\n" << sColor + << CPWL_Utils::GetAP_Circle( + CPWL_Utils::DeflateRect(rect, fWidth / 2.0f)) + << " S\nQ\n"; + } + } break; + case BorderStyle::BEVELED: { + FX_FLOAT fHalfWidth = fWidth / 2.0f; + + sColor = CPWL_Utils::GetColorAppStream(color, false); + if (sColor.GetLength() > 0) { + sAppStream << "q\n" << fHalfWidth << " w\n" << sColor + << CPWL_Utils::GetAP_Circle(rect) << " S\nQ\n"; + } + + sColor = CPWL_Utils::GetColorAppStream(crLeftTop, false); + if (sColor.GetLength() > 0) { + sAppStream << "q\n" << fHalfWidth << " w\n" << sColor + << CPWL_Utils::GetAP_HalfCircle( + CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f), + FX_PI / 4.0f) + << " S\nQ\n"; + } + + sColor = CPWL_Utils::GetColorAppStream(crRightBottom, false); + if (sColor.GetLength() > 0) { + sAppStream << "q\n" << fHalfWidth << " w\n" << sColor + << CPWL_Utils::GetAP_HalfCircle( + CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f), + FX_PI * 5 / 4.0f) + << " S\nQ\n"; + } + } break; + case BorderStyle::INSET: { + FX_FLOAT fHalfWidth = fWidth / 2.0f; + + sColor = CPWL_Utils::GetColorAppStream(color, false); + if (sColor.GetLength() > 0) { + sAppStream << "q\n" << fHalfWidth << " w\n" << sColor + << CPWL_Utils::GetAP_Circle(rect) << " S\nQ\n"; + } + + sColor = CPWL_Utils::GetColorAppStream(crLeftTop, false); + if (sColor.GetLength() > 0) { + sAppStream << "q\n" << fHalfWidth << " w\n" << sColor + << CPWL_Utils::GetAP_HalfCircle( + CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f), + FX_PI / 4.0f) + << " S\nQ\n"; + } + + sColor = CPWL_Utils::GetColorAppStream(crRightBottom, false); + if (sColor.GetLength() > 0) { + sAppStream << "q\n" << fHalfWidth << " w\n" << sColor + << CPWL_Utils::GetAP_HalfCircle( + CPWL_Utils::DeflateRect(rect, fHalfWidth * 0.75f), + FX_PI * 5 / 4.0f) + << " S\nQ\n"; + } + } break; + } + + sAppStream << "Q\n"; + } + + return sAppStream.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetAppStream_Check(const CFX_FloatRect& rcBBox, + const CPWL_Color& crText) { + CFX_ByteTextBuf sAP; + sAP << "q\n" + << CPWL_Utils::GetColorAppStream(crText, true) + << CPWL_Utils::GetAP_Check(rcBBox) << "f\nQ\n"; + return sAP.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetAppStream_Circle(const CFX_FloatRect& rcBBox, + const CPWL_Color& crText) { + CFX_ByteTextBuf sAP; + sAP << "q\n" + << CPWL_Utils::GetColorAppStream(crText, true) + << CPWL_Utils::GetAP_Circle(rcBBox) << "f\nQ\n"; + return sAP.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetAppStream_Cross(const CFX_FloatRect& rcBBox, + const CPWL_Color& crText) { + CFX_ByteTextBuf sAP; + sAP << "q\n" + << CPWL_Utils::GetColorAppStream(crText, false) + << CPWL_Utils::GetAP_Cross(rcBBox) << "S\nQ\n"; + return sAP.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetAppStream_Diamond(const CFX_FloatRect& rcBBox, + const CPWL_Color& crText) { + CFX_ByteTextBuf sAP; + sAP << "q\n1 w\n" + << CPWL_Utils::GetColorAppStream(crText, true) + << CPWL_Utils::GetAP_Diamond(rcBBox) << "f\nQ\n"; + return sAP.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetAppStream_Square(const CFX_FloatRect& rcBBox, + const CPWL_Color& crText) { + CFX_ByteTextBuf sAP; + sAP << "q\n" + << CPWL_Utils::GetColorAppStream(crText, true) + << CPWL_Utils::GetAP_Square(rcBBox) << "f\nQ\n"; + return sAP.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetAppStream_Star(const CFX_FloatRect& rcBBox, + const CPWL_Color& crText) { + CFX_ByteTextBuf sAP; + sAP << "q\n" + << CPWL_Utils::GetColorAppStream(crText, true) + << CPWL_Utils::GetAP_Star(rcBBox) << "f\nQ\n"; + return sAP.MakeString(); +} + +CFX_ByteString CPWL_Utils::GetCheckBoxAppStream(const CFX_FloatRect& rcBBox, + int32_t nStyle, + const CPWL_Color& crText) { + CFX_FloatRect rcCenter = GetCenterSquare(rcBBox); + switch (nStyle) { + default: + case PCS_CHECK: + return GetAppStream_Check(rcCenter, crText); + case PCS_CIRCLE: + return GetAppStream_Circle(ScaleRect(rcCenter, 2.0f / 3.0f), crText); + case PCS_CROSS: + return GetAppStream_Cross(rcCenter, crText); + case PCS_DIAMOND: + return GetAppStream_Diamond(ScaleRect(rcCenter, 2.0f / 3.0f), crText); + case PCS_SQUARE: + return GetAppStream_Square(ScaleRect(rcCenter, 2.0f / 3.0f), crText); + case PCS_STAR: + return GetAppStream_Star(ScaleRect(rcCenter, 2.0f / 3.0f), crText); + } +} + +CFX_ByteString CPWL_Utils::GetRadioButtonAppStream(const CFX_FloatRect& rcBBox, + int32_t nStyle, + const CPWL_Color& crText) { + CFX_FloatRect rcCenter = GetCenterSquare(rcBBox); + switch (nStyle) { + default: + case PCS_CHECK: + return GetAppStream_Check(rcCenter, crText); + case PCS_CIRCLE: + return GetAppStream_Circle(ScaleRect(rcCenter, 1.0f / 2.0f), crText); + case PCS_CROSS: + return GetAppStream_Cross(rcCenter, crText); + case PCS_DIAMOND: + return GetAppStream_Diamond(ScaleRect(rcCenter, 2.0f / 3.0f), crText); + case PCS_SQUARE: + return GetAppStream_Square(ScaleRect(rcCenter, 2.0f / 3.0f), crText); + case PCS_STAR: + return GetAppStream_Star(ScaleRect(rcCenter, 2.0f / 3.0f), crText); + } +} + +CFX_ByteString CPWL_Utils::GetDropButtonAppStream(const CFX_FloatRect& rcBBox) { + CFX_ByteTextBuf sAppStream; + + if (!rcBBox.IsEmpty()) { + sAppStream << "q\n" + << CPWL_Utils::GetColorAppStream( + CPWL_Color(COLORTYPE_RGB, 220.0f / 255.0f, + 220.0f / 255.0f, 220.0f / 255.0f), + true); + sAppStream << rcBBox.left << " " << rcBBox.bottom << " " + << rcBBox.right - rcBBox.left << " " + << rcBBox.top - rcBBox.bottom << " re f\n"; + sAppStream << "Q\n"; + + sAppStream << "q\n" + << CPWL_Utils::GetBorderAppStream( + rcBBox, 2, CPWL_Color(COLORTYPE_GRAY, 0), + CPWL_Color(COLORTYPE_GRAY, 1), + CPWL_Color(COLORTYPE_GRAY, 0.5), BorderStyle::BEVELED, + CPWL_Dash(3, 0, 0)) + << "Q\n"; + + CFX_PointF ptCenter = CFX_PointF((rcBBox.left + rcBBox.right) / 2, + (rcBBox.top + rcBBox.bottom) / 2); + if (IsFloatBigger(rcBBox.right - rcBBox.left, 6) && + IsFloatBigger(rcBBox.top - rcBBox.bottom, 6)) { + sAppStream << "q\n" + << " 0 g\n"; + sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n"; + sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n"; + sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n"; + sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n"; + sAppStream << "Q\n"; + } + } + + return sAppStream.MakeString(); +} + +void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + const CFX_FloatRect& rect, + const FX_COLORREF& color) { + CFX_PathData path; + CFX_FloatRect rcTemp(rect); + path.AppendRect(rcTemp.left, rcTemp.bottom, rcTemp.right, rcTemp.top); + pDevice->DrawPath(&path, pUser2Device, nullptr, color, 0, FXFILL_WINDING); +} + +void CPWL_Utils::DrawFillArea(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + const CFX_PointF* pPts, + int32_t nCount, + const FX_COLORREF& color) { + CFX_PathData path; + path.AppendPoint(pPts[0], FXPT_TYPE::MoveTo, false); + for (int32_t i = 1; i < nCount; i++) + path.AppendPoint(pPts[i], FXPT_TYPE::LineTo, false); + + pDevice->DrawPath(&path, pUser2Device, nullptr, color, 0, FXFILL_ALTERNATE); +} + +void CPWL_Utils::DrawStrokeRect(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + const CFX_FloatRect& rect, + const FX_COLORREF& color, + FX_FLOAT fWidth) { + CFX_PathData path; + CFX_FloatRect rcTemp(rect); + path.AppendRect(rcTemp.left, rcTemp.bottom, rcTemp.right, rcTemp.top); + + CFX_GraphStateData gsd; + gsd.m_LineWidth = fWidth; + + pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE); +} + +void CPWL_Utils::DrawStrokeLine(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + const CFX_PointF& ptMoveTo, + const CFX_PointF& ptLineTo, + const FX_COLORREF& color, + FX_FLOAT fWidth) { + CFX_PathData path; + path.AppendPoint(ptMoveTo, FXPT_TYPE::MoveTo, false); + path.AppendPoint(ptLineTo, FXPT_TYPE::LineTo, false); + + CFX_GraphStateData gsd; + gsd.m_LineWidth = fWidth; + + pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE); +} + +void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + const CFX_FloatRect& rect, + const CPWL_Color& color, + int32_t nTransparency) { + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rect, + color.ToFXColor(nTransparency)); +} + +void CPWL_Utils::DrawShadow(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + bool bVertical, + bool bHorizontal, + CFX_FloatRect rect, + int32_t nTransparency, + int32_t nStartGray, + int32_t nEndGray) { + FX_FLOAT fStepGray = 1.0f; + + if (bVertical) { + fStepGray = (nEndGray - nStartGray) / rect.Height(); + + for (FX_FLOAT fy = rect.bottom + 0.5f; fy <= rect.top - 0.5f; fy += 1.0f) { + int32_t nGray = nStartGray + (int32_t)(fStepGray * (fy - rect.bottom)); + CPWL_Utils::DrawStrokeLine( + pDevice, pUser2Device, CFX_PointF(rect.left, fy), + CFX_PointF(rect.right, fy), + ArgbEncode(nTransparency, nGray, nGray, nGray), 1.5f); + } + } + + if (bHorizontal) { + fStepGray = (nEndGray - nStartGray) / rect.Width(); + + for (FX_FLOAT fx = rect.left + 0.5f; fx <= rect.right - 0.5f; fx += 1.0f) { + int32_t nGray = nStartGray + (int32_t)(fStepGray * (fx - rect.left)); + CPWL_Utils::DrawStrokeLine( + pDevice, pUser2Device, CFX_PointF(fx, rect.bottom), + CFX_PointF(fx, rect.top), + ArgbEncode(nTransparency, nGray, nGray, nGray), 1.5f); + } + } +} + +void CPWL_Utils::DrawBorder(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + const CFX_FloatRect& rect, + FX_FLOAT fWidth, + const CPWL_Color& color, + const CPWL_Color& crLeftTop, + const CPWL_Color& crRightBottom, + BorderStyle nStyle, + int32_t nTransparency) { + FX_FLOAT fLeft = rect.left; + FX_FLOAT fRight = rect.right; + FX_FLOAT fTop = rect.top; + FX_FLOAT fBottom = rect.bottom; + + if (fWidth > 0.0f) { + FX_FLOAT fHalfWidth = fWidth / 2.0f; + + switch (nStyle) { + default: + case BorderStyle::SOLID: { + CFX_PathData path; + path.AppendRect(fLeft, fBottom, fRight, fTop); + path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, + fTop - fWidth); + pDevice->DrawPath(&path, pUser2Device, nullptr, + color.ToFXColor(nTransparency), 0, FXFILL_ALTERNATE); + break; + } + case BorderStyle::DASH: { + CFX_PathData path; + path.AppendPoint( + CFX_PointF(fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f), + FXPT_TYPE::MoveTo, false); + path.AppendPoint( + CFX_PointF(fLeft + fWidth / 2.0f, fTop - fWidth / 2.0f), + FXPT_TYPE::LineTo, false); + path.AppendPoint( + CFX_PointF(fRight - fWidth / 2.0f, fTop - fWidth / 2.0f), + FXPT_TYPE::LineTo, false); + path.AppendPoint( + CFX_PointF(fRight - fWidth / 2.0f, fBottom + fWidth / 2.0f), + FXPT_TYPE::LineTo, false); + path.AppendPoint( + CFX_PointF(fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f), + FXPT_TYPE::LineTo, false); + + CFX_GraphStateData gsd; + gsd.SetDashCount(2); + gsd.m_DashArray[0] = 3.0f; + gsd.m_DashArray[1] = 3.0f; + gsd.m_DashPhase = 0; + + gsd.m_LineWidth = fWidth; + pDevice->DrawPath(&path, pUser2Device, &gsd, 0, + color.ToFXColor(nTransparency), FXFILL_WINDING); + break; + } + case BorderStyle::BEVELED: + case BorderStyle::INSET: { + CFX_GraphStateData gsd; + gsd.m_LineWidth = fHalfWidth; + + CFX_PathData pathLT; + + pathLT.AppendPoint(CFX_PointF(fLeft + fHalfWidth, fBottom + fHalfWidth), + FXPT_TYPE::MoveTo, false); + pathLT.AppendPoint(CFX_PointF(fLeft + fHalfWidth, fTop - fHalfWidth), + FXPT_TYPE::LineTo, false); + pathLT.AppendPoint(CFX_PointF(fRight - fHalfWidth, fTop - fHalfWidth), + FXPT_TYPE::LineTo, false); + pathLT.AppendPoint( + CFX_PointF(fRight - fHalfWidth * 2, fTop - fHalfWidth * 2), + FXPT_TYPE::LineTo, false); + pathLT.AppendPoint( + CFX_PointF(fLeft + fHalfWidth * 2, fTop - fHalfWidth * 2), + FXPT_TYPE::LineTo, false); + pathLT.AppendPoint( + CFX_PointF(fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2), + FXPT_TYPE::LineTo, false); + pathLT.AppendPoint(CFX_PointF(fLeft + fHalfWidth, fBottom + fHalfWidth), + FXPT_TYPE::LineTo, false); + + pDevice->DrawPath(&pathLT, pUser2Device, &gsd, + crLeftTop.ToFXColor(nTransparency), 0, + FXFILL_ALTERNATE); + + CFX_PathData pathRB; + pathRB.AppendPoint(CFX_PointF(fRight - fHalfWidth, fTop - fHalfWidth), + FXPT_TYPE::MoveTo, false); + pathRB.AppendPoint( + CFX_PointF(fRight - fHalfWidth, fBottom + fHalfWidth), + FXPT_TYPE::LineTo, false); + pathRB.AppendPoint(CFX_PointF(fLeft + fHalfWidth, fBottom + fHalfWidth), + FXPT_TYPE::LineTo, false); + pathRB.AppendPoint( + CFX_PointF(fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2), + FXPT_TYPE::LineTo, false); + pathRB.AppendPoint( + CFX_PointF(fRight - fHalfWidth * 2, fBottom + fHalfWidth * 2), + FXPT_TYPE::LineTo, false); + pathRB.AppendPoint( + CFX_PointF(fRight - fHalfWidth * 2, fTop - fHalfWidth * 2), + FXPT_TYPE::LineTo, false); + pathRB.AppendPoint(CFX_PointF(fRight - fHalfWidth, fTop - fHalfWidth), + FXPT_TYPE::LineTo, false); + + pDevice->DrawPath(&pathRB, pUser2Device, &gsd, + crRightBottom.ToFXColor(nTransparency), 0, + FXFILL_ALTERNATE); + + CFX_PathData path; + + path.AppendRect(fLeft, fBottom, fRight, fTop); + path.AppendRect(fLeft + fHalfWidth, fBottom + fHalfWidth, + fRight - fHalfWidth, fTop - fHalfWidth); + + pDevice->DrawPath(&path, pUser2Device, &gsd, + color.ToFXColor(nTransparency), 0, FXFILL_ALTERNATE); + break; + } + case BorderStyle::UNDERLINE: { + CFX_PathData path; + path.AppendPoint(CFX_PointF(fLeft, fBottom + fWidth / 2), + FXPT_TYPE::MoveTo, false); + path.AppendPoint(CFX_PointF(fRight, fBottom + fWidth / 2), + FXPT_TYPE::LineTo, false); + + CFX_GraphStateData gsd; + gsd.m_LineWidth = fWidth; + + pDevice->DrawPath(&path, pUser2Device, &gsd, 0, + color.ToFXColor(nTransparency), FXFILL_ALTERNATE); + break; + } + } + } +} + diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Utils.h b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Utils.h new file mode 100644 index 000000000000..a4ecc19ee527 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Utils.h @@ -0,0 +1,164 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFWINDOW_PWL_UTILS_H_ +#define FPDFSDK_PDFWINDOW_PWL_UTILS_H_ + +#include "core/fpdfdoc/cpvt_wordrange.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" + +class CFX_Edit; +struct CPWL_Color; + +#define PWL_MAKEDWORD(low, high) \ + ((uint32_t)((uint16_t)(low) | (uint32_t)(((uint16_t)(high)) << 16))) + +// checkbox & radiobutton style +#define PCS_CHECK 0 +#define PCS_CIRCLE 1 +#define PCS_CROSS 2 +#define PCS_DIAMOND 3 +#define PCS_SQUARE 4 +#define PCS_STAR 5 + +// pushbutton layout style +#define PPBL_LABEL 0 +#define PPBL_ICON 1 +#define PPBL_ICONTOPLABELBOTTOM 2 +#define PPBL_LABELTOPICONBOTTOM 3 +#define PPBL_ICONLEFTLABELRIGHT 4 +#define PPBL_LABELLEFTICONRIGHT 5 +#define PPBL_LABELOVERICON 6 + +class CPWL_Utils { + public: + static CFX_FloatRect InflateRect(const CFX_FloatRect& rcRect, FX_FLOAT fSize); + static CFX_FloatRect DeflateRect(const CFX_FloatRect& rcRect, FX_FLOAT fSize); + + static CPVT_WordRange OverlapWordRange(const CPVT_WordRange& wr1, + const CPVT_WordRange& wr2); + static CFX_FloatRect GetCenterSquare(const CFX_FloatRect& rect); + + static CFX_FloatRect OffsetRect(const CFX_FloatRect& rect, + FX_FLOAT x, + FX_FLOAT y); + + static CFX_ByteString GetColorAppStream(const CPWL_Color& color, + const bool& bFillOrStroke = true); + static CFX_ByteString GetBorderAppStream(const CFX_FloatRect& rect, + FX_FLOAT fWidth, + const CPWL_Color& color, + const CPWL_Color& crLeftTop, + const CPWL_Color& crRightBottom, + BorderStyle nStyle, + const CPWL_Dash& dash); + static CFX_ByteString GetCircleBorderAppStream( + const CFX_FloatRect& rect, + FX_FLOAT fWidth, + const CPWL_Color& color, + const CPWL_Color& crLeftTop, + const CPWL_Color& crRightBottom, + BorderStyle nStyle, + const CPWL_Dash& dash); + static CFX_ByteString GetRectFillAppStream(const CFX_FloatRect& rect, + const CPWL_Color& color); + static CFX_ByteString GetCircleFillAppStream(const CFX_FloatRect& rect, + const CPWL_Color& color); + static CFX_ByteString GetPushButtonAppStream(const CFX_FloatRect& rcBBox, + IPVT_FontMap* pFontMap, + CPDF_Stream* pIconStream, + CPDF_IconFit& IconFit, + const CFX_WideString& sLabel, + const CPWL_Color& crText, + FX_FLOAT fFontSize, + int32_t nLayOut); + static CFX_ByteString GetCheckBoxAppStream(const CFX_FloatRect& rcBBox, + int32_t nStyle, + const CPWL_Color& crText); + static CFX_ByteString GetRadioButtonAppStream(const CFX_FloatRect& rcBBox, + int32_t nStyle, + const CPWL_Color& crText); + static CFX_ByteString GetEditAppStream(CFX_Edit* pEdit, + const CFX_PointF& ptOffset, + const CPVT_WordRange* pRange = nullptr, + bool bContinuous = true, + uint16_t SubWord = 0); + static CFX_ByteString GetEditSelAppStream( + CFX_Edit* pEdit, + const CFX_PointF& ptOffset, + const CPVT_WordRange* pRange = nullptr); + static CFX_ByteString GetDropButtonAppStream(const CFX_FloatRect& rcBBox); + + static void DrawFillRect(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + const CFX_FloatRect& rect, + const CPWL_Color& color, + int32_t nTransparency); + static void DrawFillRect(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + const CFX_FloatRect& rect, + const FX_COLORREF& color); + static void DrawStrokeRect(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + const CFX_FloatRect& rect, + const FX_COLORREF& color, + FX_FLOAT fWidth); + static void DrawStrokeLine(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + const CFX_PointF& ptMoveTo, + const CFX_PointF& ptLineTo, + const FX_COLORREF& color, + FX_FLOAT fWidth); + static void DrawBorder(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + const CFX_FloatRect& rect, + FX_FLOAT fWidth, + const CPWL_Color& color, + const CPWL_Color& crLeftTop, + const CPWL_Color& crRightBottom, + BorderStyle nStyle, + int32_t nTransparency); + static void DrawFillArea(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + const CFX_PointF* pPts, + int32_t nCount, + const FX_COLORREF& color); + static void DrawShadow(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + bool bVertical, + bool bHorizontal, + CFX_FloatRect rect, + int32_t nTransparency, + int32_t nStartGray, + int32_t nEndGray); + + private: + static CFX_FloatRect ScaleRect(const CFX_FloatRect& rcRect, FX_FLOAT fScale); + + static CFX_ByteString GetAppStream_Check(const CFX_FloatRect& rcBBox, + const CPWL_Color& crText); + static CFX_ByteString GetAppStream_Circle(const CFX_FloatRect& rcBBox, + const CPWL_Color& crText); + static CFX_ByteString GetAppStream_Cross(const CFX_FloatRect& rcBBox, + const CPWL_Color& crText); + static CFX_ByteString GetAppStream_Diamond(const CFX_FloatRect& rcBBox, + const CPWL_Color& crText); + static CFX_ByteString GetAppStream_Square(const CFX_FloatRect& rcBBox, + const CPWL_Color& crText); + static CFX_ByteString GetAppStream_Star(const CFX_FloatRect& rcBBox, + const CPWL_Color& crText); + + static CFX_ByteString GetAP_Check(const CFX_FloatRect& crBBox); + static CFX_ByteString GetAP_Circle(const CFX_FloatRect& crBBox); + static CFX_ByteString GetAP_Cross(const CFX_FloatRect& crBBox); + static CFX_ByteString GetAP_Diamond(const CFX_FloatRect& crBBox); + static CFX_ByteString GetAP_Square(const CFX_FloatRect& crBBox); + static CFX_ByteString GetAP_Star(const CFX_FloatRect& crBBox); + static CFX_ByteString GetAP_HalfCircle(const CFX_FloatRect& crBBox, + FX_FLOAT fRotate); +}; + +#endif // FPDFSDK_PDFWINDOW_PWL_UTILS_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Wnd.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Wnd.cpp new file mode 100644 index 000000000000..14024dd5d42e --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Wnd.cpp @@ -0,0 +1,915 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include +#include + +#include "fpdfsdk/pdfwindow/PWL_ScrollBar.h" +#include "fpdfsdk/pdfwindow/PWL_Utils.h" +#include "fpdfsdk/pdfwindow/PWL_Wnd.h" +#include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" + +static std::map& GetPWLTimeMap() { + // Leak the object at shutdown. + static auto timeMap = new std::map; + return *timeMap; +} + +PWL_CREATEPARAM::PWL_CREATEPARAM() + : rcRectWnd(0, 0, 0, 0), + pSystemHandler(nullptr), + pFontMap(nullptr), + pProvider(nullptr), + pFocusHandler(nullptr), + dwFlags(0), + sBackgroundColor(), + pAttachedWidget(nullptr), + nBorderStyle(BorderStyle::SOLID), + dwBorderWidth(1), + sBorderColor(), + sTextColor(), + nTransparency(255), + fFontSize(PWL_DEFAULT_FONTSIZE), + sDash(3, 0, 0), + pAttachedData(nullptr), + pParentWnd(nullptr), + pMsgControl(nullptr), + eCursorType(FXCT_ARROW), + mtChild(1, 0, 0, 1, 0, 0) {} + +PWL_CREATEPARAM::PWL_CREATEPARAM(const PWL_CREATEPARAM& other) = default; + +CPWL_Timer::CPWL_Timer(CPWL_TimerHandler* pAttached, + CFX_SystemHandler* pSystemHandler) + : m_nTimerID(0), m_pAttached(pAttached), m_pSystemHandler(pSystemHandler) { + ASSERT(m_pAttached); + ASSERT(m_pSystemHandler); +} + +CPWL_Timer::~CPWL_Timer() { + KillPWLTimer(); +} + +int32_t CPWL_Timer::SetPWLTimer(int32_t nElapse) { + if (m_nTimerID != 0) + KillPWLTimer(); + m_nTimerID = m_pSystemHandler->SetTimer(nElapse, TimerProc); + + GetPWLTimeMap()[m_nTimerID] = this; + return m_nTimerID; +} + +void CPWL_Timer::KillPWLTimer() { + if (m_nTimerID == 0) + return; + + m_pSystemHandler->KillTimer(m_nTimerID); + GetPWLTimeMap().erase(m_nTimerID); + m_nTimerID = 0; +} + +void CPWL_Timer::TimerProc(int32_t idEvent) { + auto it = GetPWLTimeMap().find(idEvent); + if (it == GetPWLTimeMap().end()) + return; + + CPWL_Timer* pTimer = it->second; + if (pTimer->m_pAttached) + pTimer->m_pAttached->TimerProc(); +} + +CPWL_TimerHandler::CPWL_TimerHandler() {} + +CPWL_TimerHandler::~CPWL_TimerHandler() {} + +void CPWL_TimerHandler::BeginTimer(int32_t nElapse) { + if (!m_pTimer) + m_pTimer = pdfium::MakeUnique(this, GetSystemHandler()); + + m_pTimer->SetPWLTimer(nElapse); +} + +void CPWL_TimerHandler::EndTimer() { + if (m_pTimer) + m_pTimer->KillPWLTimer(); +} + +void CPWL_TimerHandler::TimerProc() {} + +class CPWL_MsgControl { + friend class CPWL_Wnd; + + public: + explicit CPWL_MsgControl(CPWL_Wnd* pWnd) { + m_pCreatedWnd = pWnd; + Default(); + } + + ~CPWL_MsgControl() { Default(); } + + void Default() { + m_aMousePath.clear(); + m_aKeyboardPath.clear(); + m_pMainMouseWnd = nullptr; + m_pMainKeyboardWnd = nullptr; + } + + bool IsWndCreated(const CPWL_Wnd* pWnd) const { + return m_pCreatedWnd == pWnd; + } + + bool IsMainCaptureMouse(const CPWL_Wnd* pWnd) const { + return pWnd == m_pMainMouseWnd; + } + + bool IsWndCaptureMouse(const CPWL_Wnd* pWnd) const { + return pWnd && pdfium::ContainsValue(m_aMousePath, pWnd); + } + + bool IsMainCaptureKeyboard(const CPWL_Wnd* pWnd) const { + return pWnd == m_pMainKeyboardWnd; + } + + bool IsWndCaptureKeyboard(const CPWL_Wnd* pWnd) const { + return pWnd && pdfium::ContainsValue(m_aKeyboardPath, pWnd); + } + + void SetFocus(CPWL_Wnd* pWnd) { + m_aKeyboardPath.clear(); + if (pWnd) { + m_pMainKeyboardWnd = pWnd; + CPWL_Wnd* pParent = pWnd; + while (pParent) { + m_aKeyboardPath.push_back(pParent); + pParent = pParent->GetParentWindow(); + } + pWnd->OnSetFocus(); + } + } + + void KillFocus() { + if (!m_aKeyboardPath.empty()) + if (CPWL_Wnd* pWnd = m_aKeyboardPath[0]) + pWnd->OnKillFocus(); + + m_pMainKeyboardWnd = nullptr; + m_aKeyboardPath.clear(); + } + + void SetCapture(CPWL_Wnd* pWnd) { + m_aMousePath.clear(); + if (pWnd) { + m_pMainMouseWnd = pWnd; + CPWL_Wnd* pParent = pWnd; + while (pParent) { + m_aMousePath.push_back(pParent); + pParent = pParent->GetParentWindow(); + } + } + } + + void ReleaseCapture() { + m_pMainMouseWnd = nullptr; + m_aMousePath.clear(); + } + + private: + std::vector m_aMousePath; + std::vector m_aKeyboardPath; + CPWL_Wnd* m_pCreatedWnd; + CPWL_Wnd* m_pMainMouseWnd; + CPWL_Wnd* m_pMainKeyboardWnd; +}; + +CPWL_Wnd::CPWL_Wnd() + : m_pVScrollBar(nullptr), + m_rcWindow(), + m_rcClip(), + m_bCreated(false), + m_bVisible(false), + m_bNotifying(false), + m_bEnabled(true) {} + +CPWL_Wnd::~CPWL_Wnd() { + ASSERT(m_bCreated == false); +} + +CFX_ByteString CPWL_Wnd::GetClassName() const { + return "CPWL_Wnd"; +} + +void CPWL_Wnd::Create(const PWL_CREATEPARAM& cp) { + if (!IsValid()) { + m_sPrivateParam = cp; + + OnCreate(m_sPrivateParam); + + m_sPrivateParam.rcRectWnd.Normalize(); + m_rcWindow = m_sPrivateParam.rcRectWnd; + m_rcClip = CPWL_Utils::InflateRect(m_rcWindow, 1.0f); + + CreateMsgControl(); + + if (m_sPrivateParam.pParentWnd) + m_sPrivateParam.pParentWnd->OnNotify(this, PNM_ADDCHILD); + + PWL_CREATEPARAM ccp = m_sPrivateParam; + + ccp.dwFlags &= 0xFFFF0000L; // remove sub styles + ccp.mtChild = CFX_Matrix(1, 0, 0, 1, 0, 0); + + CreateScrollBar(ccp); + CreateChildWnd(ccp); + + m_bVisible = HasFlag(PWS_VISIBLE); + + OnCreated(); + + RePosChildWnd(); + m_bCreated = true; + } +} + +void CPWL_Wnd::OnCreate(PWL_CREATEPARAM& cp) {} + +void CPWL_Wnd::OnCreated() {} + +void CPWL_Wnd::OnDestroy() {} + +void CPWL_Wnd::InvalidateFocusHandler(IPWL_FocusHandler* handler) { + if (m_sPrivateParam.pFocusHandler == handler) + m_sPrivateParam.pFocusHandler = nullptr; +} + +void CPWL_Wnd::InvalidateProvider(IPWL_Provider* provider) { + if (m_sPrivateParam.pProvider.Get() == provider) + m_sPrivateParam.pProvider.Reset(); +} + +void CPWL_Wnd::Destroy() { + KillFocus(); + OnDestroy(); + if (m_bCreated) { + for (auto it = m_Children.rbegin(); it != m_Children.rend(); ++it) { + if (CPWL_Wnd* pChild = *it) { + *it = nullptr; + pChild->Destroy(); + delete pChild; + } + } + if (m_sPrivateParam.pParentWnd) + m_sPrivateParam.pParentWnd->OnNotify(this, PNM_REMOVECHILD); + + m_bCreated = false; + } + DestroyMsgControl(); + m_sPrivateParam.Reset(); + m_Children.clear(); + m_pVScrollBar = nullptr; +} + +void CPWL_Wnd::Move(const CFX_FloatRect& rcNew, bool bReset, bool bRefresh) { + if (IsValid()) { + CFX_FloatRect rcOld = GetWindowRect(); + + m_rcWindow = rcNew; + m_rcWindow.Normalize(); + + if (rcOld.left != rcNew.left || rcOld.right != rcNew.right || + rcOld.top != rcNew.top || rcOld.bottom != rcNew.bottom) { + if (bReset) { + RePosChildWnd(); + } + } + if (bRefresh) { + InvalidateRectMove(rcOld, rcNew); + } + + m_sPrivateParam.rcRectWnd = m_rcWindow; + } +} + +void CPWL_Wnd::InvalidateRectMove(const CFX_FloatRect& rcOld, + const CFX_FloatRect& rcNew) { + CFX_FloatRect rcUnion = rcOld; + rcUnion.Union(rcNew); + + InvalidateRect(&rcUnion); +} + +void CPWL_Wnd::GetAppearanceStream(CFX_ByteTextBuf& sAppStream) { + if (IsValid() && IsVisible()) { + GetThisAppearanceStream(sAppStream); + GetChildAppearanceStream(sAppStream); + } +} + +// if don't set,Get default apperance stream +void CPWL_Wnd::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { + CFX_FloatRect rectWnd = GetWindowRect(); + if (!rectWnd.IsEmpty()) { + CFX_ByteTextBuf sThis; + + if (HasFlag(PWS_BACKGROUND)) + sThis << CPWL_Utils::GetRectFillAppStream(rectWnd, GetBackgroundColor()); + + if (HasFlag(PWS_BORDER)) { + sThis << CPWL_Utils::GetBorderAppStream( + rectWnd, (FX_FLOAT)GetBorderWidth(), GetBorderColor(), + GetBorderLeftTopColor(GetBorderStyle()), + GetBorderRightBottomColor(GetBorderStyle()), GetBorderStyle(), + GetBorderDash()); + } + + sAppStream << sThis; + } +} + +void CPWL_Wnd::GetChildAppearanceStream(CFX_ByteTextBuf& sAppStream) { + for (CPWL_Wnd* pChild : m_Children) { + if (pChild) + pChild->GetAppearanceStream(sAppStream); + } +} + +void CPWL_Wnd::DrawAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + if (IsValid() && IsVisible()) { + DrawThisAppearance(pDevice, pUser2Device); + DrawChildAppearance(pDevice, pUser2Device); + } +} + +void CPWL_Wnd::DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + CFX_FloatRect rectWnd = GetWindowRect(); + if (!rectWnd.IsEmpty()) { + if (HasFlag(PWS_BACKGROUND)) { + CFX_FloatRect rcClient = CPWL_Utils::DeflateRect( + rectWnd, (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); + CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient, + GetBackgroundColor(), GetTransparency()); + } + + if (HasFlag(PWS_BORDER)) + CPWL_Utils::DrawBorder(pDevice, pUser2Device, rectWnd, + (FX_FLOAT)GetBorderWidth(), GetBorderColor(), + GetBorderLeftTopColor(GetBorderStyle()), + GetBorderRightBottomColor(GetBorderStyle()), + GetBorderStyle(), GetTransparency()); + } +} + +void CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device) { + for (CPWL_Wnd* pChild : m_Children) { + if (!pChild) + continue; + + CFX_Matrix mt = pChild->GetChildMatrix(); + if (mt.IsIdentity()) { + pChild->DrawAppearance(pDevice, pUser2Device); + } else { + mt.Concat(*pUser2Device); + pChild->DrawAppearance(pDevice, &mt); + } + } +} + +void CPWL_Wnd::InvalidateRect(CFX_FloatRect* pRect) { + if (IsValid()) { + CFX_FloatRect rcRefresh = pRect ? *pRect : GetWindowRect(); + + if (!HasFlag(PWS_NOREFRESHCLIP)) { + CFX_FloatRect rcClip = GetClipRect(); + if (!rcClip.IsEmpty()) { + rcRefresh.Intersect(rcClip); + } + } + + FX_RECT rcWin = PWLtoWnd(rcRefresh); + rcWin.left -= PWL_INVALIDATE_INFLATE; + rcWin.top -= PWL_INVALIDATE_INFLATE; + rcWin.right += PWL_INVALIDATE_INFLATE; + rcWin.bottom += PWL_INVALIDATE_INFLATE; + + if (CFX_SystemHandler* pSH = GetSystemHandler()) { + if (CPDFSDK_Widget* widget = static_cast( + m_sPrivateParam.pAttachedWidget.Get())) { + pSH->InvalidateRect(widget, rcWin); + } + } + } +} + +#define PWL_IMPLEMENT_KEY_METHOD(key_method_name) \ + bool CPWL_Wnd::key_method_name(uint16_t nChar, uint32_t nFlag) { \ + if (!IsValid() || !IsVisible() || !IsEnabled()) \ + return false; \ + if (!IsWndCaptureKeyboard(this)) \ + return false; \ + for (const auto& pChild : m_Children) { \ + if (pChild && IsWndCaptureKeyboard(pChild)) \ + return pChild->key_method_name(nChar, nFlag); \ + } \ + return false; \ + } + +PWL_IMPLEMENT_KEY_METHOD(OnKeyDown) +PWL_IMPLEMENT_KEY_METHOD(OnChar) +#undef PWL_IMPLEMENT_KEY_METHOD + +#define PWL_IMPLEMENT_MOUSE_METHOD(mouse_method_name) \ + bool CPWL_Wnd::mouse_method_name(const CFX_PointF& point, uint32_t nFlag) { \ + if (!IsValid() || !IsVisible() || !IsEnabled()) \ + return false; \ + if (IsWndCaptureMouse(this)) { \ + for (const auto& pChild : m_Children) { \ + if (pChild && IsWndCaptureMouse(pChild)) { \ + return pChild->mouse_method_name(pChild->ParentToChild(point), \ + nFlag); \ + } \ + } \ + SetCursor(); \ + return false; \ + } \ + for (const auto& pChild : m_Children) { \ + if (pChild && pChild->WndHitTest(pChild->ParentToChild(point))) { \ + return pChild->mouse_method_name(pChild->ParentToChild(point), nFlag); \ + } \ + } \ + if (WndHitTest(point)) \ + SetCursor(); \ + return false; \ + } + +PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDblClk) +PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDown) +PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonUp) +PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDown) +PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp) +PWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove) +#undef PWL_IMPLEMENT_MOUSE_METHOD + +bool CPWL_Wnd::OnMouseWheel(short zDelta, + const CFX_PointF& point, + uint32_t nFlag) { + if (!IsValid() || !IsVisible() || !IsEnabled()) + return false; + + SetCursor(); + if (!IsWndCaptureKeyboard(this)) + return false; + + for (const auto& pChild : m_Children) { + if (pChild && IsWndCaptureKeyboard(pChild)) + return pChild->OnMouseWheel(zDelta, pChild->ParentToChild(point), nFlag); + } + return false; +} + +void CPWL_Wnd::AddChild(CPWL_Wnd* pWnd) { + m_Children.push_back(pWnd); +} + +void CPWL_Wnd::RemoveChild(CPWL_Wnd* pWnd) { + for (auto it = m_Children.rbegin(); it != m_Children.rend(); ++it) { + if (*it && *it == pWnd) { + m_Children.erase(std::next(it).base()); + break; + } + } +} + +void CPWL_Wnd::OnNotify(CPWL_Wnd* pWnd, + uint32_t msg, + intptr_t wParam, + intptr_t lParam) { + switch (msg) { + case PNM_ADDCHILD: + AddChild(pWnd); + break; + case PNM_REMOVECHILD: + RemoveChild(pWnd); + break; + default: + break; + } +} + +bool CPWL_Wnd::IsValid() const { + return m_bCreated; +} + +const PWL_CREATEPARAM& CPWL_Wnd::GetCreationParam() const { + return m_sPrivateParam; +} + +CPWL_Wnd* CPWL_Wnd::GetParentWindow() const { + return m_sPrivateParam.pParentWnd; +} + +CFX_FloatRect CPWL_Wnd::GetWindowRect() const { + return m_rcWindow; +} + +CFX_FloatRect CPWL_Wnd::GetClientRect() const { + CFX_FloatRect rcWindow = GetWindowRect(); + CFX_FloatRect rcClient = CPWL_Utils::DeflateRect( + rcWindow, (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); + if (CPWL_ScrollBar* pVSB = GetVScrollBar()) + rcClient.right -= pVSB->GetScrollBarWidth(); + + rcClient.Normalize(); + return rcWindow.Contains(rcClient) ? rcClient : CFX_FloatRect(); +} + +CFX_PointF CPWL_Wnd::GetCenterPoint() const { + CFX_FloatRect rcClient = GetClientRect(); + return CFX_PointF((rcClient.left + rcClient.right) * 0.5f, + (rcClient.top + rcClient.bottom) * 0.5f); +} + +bool CPWL_Wnd::HasFlag(uint32_t dwFlags) const { + return (m_sPrivateParam.dwFlags & dwFlags) != 0; +} + +void CPWL_Wnd::RemoveFlag(uint32_t dwFlags) { + m_sPrivateParam.dwFlags &= ~dwFlags; +} + +void CPWL_Wnd::AddFlag(uint32_t dwFlags) { + m_sPrivateParam.dwFlags |= dwFlags; +} + +CPWL_Color CPWL_Wnd::GetBackgroundColor() const { + return m_sPrivateParam.sBackgroundColor; +} + +void CPWL_Wnd::SetBackgroundColor(const CPWL_Color& color) { + m_sPrivateParam.sBackgroundColor = color; +} + +CPWL_Color CPWL_Wnd::GetTextColor() const { + return m_sPrivateParam.sTextColor; +} + +BorderStyle CPWL_Wnd::GetBorderStyle() const { + return m_sPrivateParam.nBorderStyle; +} + +void CPWL_Wnd::SetBorderStyle(BorderStyle nBorderStyle) { + if (HasFlag(PWS_BORDER)) + m_sPrivateParam.nBorderStyle = nBorderStyle; +} + +int32_t CPWL_Wnd::GetBorderWidth() const { + if (HasFlag(PWS_BORDER)) + return m_sPrivateParam.dwBorderWidth; + + return 0; +} + +int32_t CPWL_Wnd::GetInnerBorderWidth() const { + return 0; +} + +CPWL_Color CPWL_Wnd::GetBorderColor() const { + if (HasFlag(PWS_BORDER)) + return m_sPrivateParam.sBorderColor; + + return CPWL_Color(); +} + +const CPWL_Dash& CPWL_Wnd::GetBorderDash() const { + return m_sPrivateParam.sDash; +} + +void* CPWL_Wnd::GetAttachedData() const { + return m_sPrivateParam.pAttachedData; +} + +CPWL_ScrollBar* CPWL_Wnd::GetVScrollBar() const { + if (HasFlag(PWS_VSCROLL)) + return m_pVScrollBar; + + return nullptr; +} + +void CPWL_Wnd::CreateScrollBar(const PWL_CREATEPARAM& cp) { + CreateVScrollBar(cp); +} + +void CPWL_Wnd::CreateVScrollBar(const PWL_CREATEPARAM& cp) { + if (!m_pVScrollBar && HasFlag(PWS_VSCROLL)) { + PWL_CREATEPARAM scp = cp; + + // flags + scp.dwFlags = + PWS_CHILD | PWS_BACKGROUND | PWS_AUTOTRANSPARENT | PWS_NOREFRESHCLIP; + + scp.pParentWnd = this; + scp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR; + scp.eCursorType = FXCT_ARROW; + scp.nTransparency = PWL_SCROLLBAR_TRANSPARENCY; + + m_pVScrollBar = new CPWL_ScrollBar(SBT_VSCROLL); + m_pVScrollBar->Create(scp); + } +} + +void CPWL_Wnd::SetCapture() { + if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) + pMsgCtrl->SetCapture(this); +} + +void CPWL_Wnd::ReleaseCapture() { + for (const auto& pChild : m_Children) { + if (pChild) + pChild->ReleaseCapture(); + } + if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) + pMsgCtrl->ReleaseCapture(); +} + +void CPWL_Wnd::SetFocus() { + if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) { + if (!pMsgCtrl->IsMainCaptureKeyboard(this)) + pMsgCtrl->KillFocus(); + pMsgCtrl->SetFocus(this); + } +} + +void CPWL_Wnd::KillFocus() { + if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) { + if (pMsgCtrl->IsWndCaptureKeyboard(this)) + pMsgCtrl->KillFocus(); + } +} + +void CPWL_Wnd::OnSetFocus() {} + +void CPWL_Wnd::OnKillFocus() {} + +bool CPWL_Wnd::WndHitTest(const CFX_PointF& point) const { + return IsValid() && IsVisible() && GetWindowRect().Contains(point); +} + +bool CPWL_Wnd::ClientHitTest(const CFX_PointF& point) const { + return IsValid() && IsVisible() && GetClientRect().Contains(point); +} + +const CPWL_Wnd* CPWL_Wnd::GetRootWnd() const { + if (m_sPrivateParam.pParentWnd) + return m_sPrivateParam.pParentWnd->GetRootWnd(); + + return this; +} + +void CPWL_Wnd::SetVisible(bool bVisible) { + if (!IsValid()) + return; + + for (const auto& pChild : m_Children) { + if (pChild) + pChild->SetVisible(bVisible); + } + if (bVisible != m_bVisible) { + m_bVisible = bVisible; + RePosChildWnd(); + InvalidateRect(); + } +} + +void CPWL_Wnd::SetClipRect(const CFX_FloatRect& rect) { + m_rcClip = rect; + m_rcClip.Normalize(); +} + +const CFX_FloatRect& CPWL_Wnd::GetClipRect() const { + return m_rcClip; +} + +bool CPWL_Wnd::IsReadOnly() const { + return HasFlag(PWS_READONLY); +} + +void CPWL_Wnd::RePosChildWnd() { + CFX_FloatRect rcContent = CPWL_Utils::DeflateRect( + GetWindowRect(), (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); + + CPWL_ScrollBar* pVSB = GetVScrollBar(); + + CFX_FloatRect rcVScroll = + CFX_FloatRect(rcContent.right - PWL_SCROLLBAR_WIDTH, rcContent.bottom, + rcContent.right - 1.0f, rcContent.top); + + if (pVSB) + pVSB->Move(rcVScroll, true, false); +} + +void CPWL_Wnd::CreateChildWnd(const PWL_CREATEPARAM& cp) {} + +void CPWL_Wnd::SetCursor() { + if (IsValid()) { + if (CFX_SystemHandler* pSH = GetSystemHandler()) { + int32_t nCursorType = GetCreationParam().eCursorType; + pSH->SetCursor(nCursorType); + } + } +} + +void CPWL_Wnd::CreateMsgControl() { + if (!m_sPrivateParam.pMsgControl) + m_sPrivateParam.pMsgControl = new CPWL_MsgControl(this); +} + +void CPWL_Wnd::DestroyMsgControl() { + if (CPWL_MsgControl* pMsgControl = GetMsgControl()) + if (pMsgControl->IsWndCreated(this)) + delete pMsgControl; +} + +CPWL_MsgControl* CPWL_Wnd::GetMsgControl() const { + return m_sPrivateParam.pMsgControl; +} + +bool CPWL_Wnd::IsCaptureMouse() const { + return IsWndCaptureMouse(this); +} + +bool CPWL_Wnd::IsWndCaptureMouse(const CPWL_Wnd* pWnd) const { + if (CPWL_MsgControl* pCtrl = GetMsgControl()) + return pCtrl->IsWndCaptureMouse(pWnd); + + return false; +} + +bool CPWL_Wnd::IsWndCaptureKeyboard(const CPWL_Wnd* pWnd) const { + if (CPWL_MsgControl* pCtrl = GetMsgControl()) + return pCtrl->IsWndCaptureKeyboard(pWnd); + + return false; +} + +bool CPWL_Wnd::IsFocused() const { + if (CPWL_MsgControl* pCtrl = GetMsgControl()) + return pCtrl->IsMainCaptureKeyboard(this); + + return false; +} + +CFX_FloatRect CPWL_Wnd::GetFocusRect() const { + return CPWL_Utils::InflateRect(GetWindowRect(), 1); +} + +FX_FLOAT CPWL_Wnd::GetFontSize() const { + return m_sPrivateParam.fFontSize; +} + +void CPWL_Wnd::SetFontSize(FX_FLOAT fFontSize) { + m_sPrivateParam.fFontSize = fFontSize; +} + +CFX_SystemHandler* CPWL_Wnd::GetSystemHandler() const { + return m_sPrivateParam.pSystemHandler; +} + +IPWL_FocusHandler* CPWL_Wnd::GetFocusHandler() const { + return m_sPrivateParam.pFocusHandler; +} + +IPWL_Provider* CPWL_Wnd::GetProvider() const { + return m_sPrivateParam.pProvider.Get(); +} + +IPVT_FontMap* CPWL_Wnd::GetFontMap() const { + return m_sPrivateParam.pFontMap; +} + +CPWL_Color CPWL_Wnd::GetBorderLeftTopColor(BorderStyle nBorderStyle) const { + switch (nBorderStyle) { + case BorderStyle::BEVELED: + return CPWL_Color(COLORTYPE_GRAY, 1); + case BorderStyle::INSET: + return CPWL_Color(COLORTYPE_GRAY, 0.5f); + default: + return CPWL_Color(); + } +} + +CPWL_Color CPWL_Wnd::GetBorderRightBottomColor(BorderStyle nBorderStyle) const { + switch (nBorderStyle) { + case BorderStyle::BEVELED: + return GetBackgroundColor() / 2.0f; + case BorderStyle::INSET: + return CPWL_Color(COLORTYPE_GRAY, 0.75f); + default: + return CPWL_Color(); + } +} + +int32_t CPWL_Wnd::GetTransparency() { + return m_sPrivateParam.nTransparency; +} + +void CPWL_Wnd::SetTransparency(int32_t nTransparency) { + for (const auto& pChild : m_Children) { + if (pChild) + pChild->SetTransparency(nTransparency); + } + m_sPrivateParam.nTransparency = nTransparency; +} + +CFX_Matrix CPWL_Wnd::GetWindowMatrix() const { + CFX_Matrix mt = GetChildToRoot(); + if (IPWL_Provider* pProvider = GetProvider()) + mt.Concat(pProvider->GetWindowMatrix(GetAttachedData())); + return mt; +} + +FX_RECT CPWL_Wnd::PWLtoWnd(const CFX_FloatRect& rect) const { + CFX_FloatRect rcTemp = rect; + CFX_Matrix mt = GetWindowMatrix(); + mt.TransformRect(rcTemp); + return FX_RECT((int32_t)(rcTemp.left + 0.5), (int32_t)(rcTemp.bottom + 0.5), + (int32_t)(rcTemp.right + 0.5), (int32_t)(rcTemp.top + 0.5)); +} + +CFX_PointF CPWL_Wnd::ParentToChild(const CFX_PointF& point) const { + CFX_Matrix mt = GetChildMatrix(); + if (mt.IsIdentity()) + return point; + + mt.SetReverse(mt); + return mt.Transform(point); +} + +CFX_FloatRect CPWL_Wnd::ParentToChild(const CFX_FloatRect& rect) const { + CFX_Matrix mt = GetChildMatrix(); + if (mt.IsIdentity()) + return rect; + + mt.SetReverse(mt); + CFX_FloatRect rc = rect; + mt.TransformRect(rc); + return rc; +} + +CFX_Matrix CPWL_Wnd::GetChildToRoot() const { + CFX_Matrix mt(1, 0, 0, 1, 0, 0); + if (HasFlag(PWS_CHILD)) { + const CPWL_Wnd* pParent = this; + while (pParent) { + mt.Concat(pParent->GetChildMatrix()); + pParent = pParent->GetParentWindow(); + } + } + return mt; +} + +CFX_Matrix CPWL_Wnd::GetChildMatrix() const { + if (HasFlag(PWS_CHILD)) + return m_sPrivateParam.mtChild; + + return CFX_Matrix(1, 0, 0, 1, 0, 0); +} + +void CPWL_Wnd::SetChildMatrix(const CFX_Matrix& mt) { + m_sPrivateParam.mtChild = mt; +} + +const CPWL_Wnd* CPWL_Wnd::GetFocused() const { + CPWL_MsgControl* pMsgCtrl = GetMsgControl(); + return pMsgCtrl ? pMsgCtrl->m_pMainKeyboardWnd : nullptr; +} + +void CPWL_Wnd::EnableWindow(bool bEnable) { + if (m_bEnabled == bEnable) + return; + + for (const auto& pChild : m_Children) { + if (pChild) + pChild->EnableWindow(bEnable); + } + m_bEnabled = bEnable; +} + +bool CPWL_Wnd::IsCTRLpressed(uint32_t nFlag) const { + CFX_SystemHandler* pSystemHandler = GetSystemHandler(); + return pSystemHandler && pSystemHandler->IsCTRLKeyDown(nFlag); +} + +bool CPWL_Wnd::IsSHIFTpressed(uint32_t nFlag) const { + CFX_SystemHandler* pSystemHandler = GetSystemHandler(); + return pSystemHandler && pSystemHandler->IsSHIFTKeyDown(nFlag); +} + +bool CPWL_Wnd::IsALTpressed(uint32_t nFlag) const { + CFX_SystemHandler* pSystemHandler = GetSystemHandler(); + return pSystemHandler && pSystemHandler->IsALTKeyDown(nFlag); +} diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Wnd.h b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Wnd.h new file mode 100644 index 000000000000..55836d43a2ec --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/PWL_Wnd.h @@ -0,0 +1,410 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFWINDOW_PWL_WND_H_ +#define FPDFSDK_PDFWINDOW_PWL_WND_H_ + +#include +#include + +#include "core/fpdfdoc/cpdf_formcontrol.h" +#include "core/fxcrt/cfx_observable.h" +#include "core/fxcrt/fx_basic.h" +#include "fpdfsdk/cfx_systemhandler.h" +#include "fpdfsdk/cpdfsdk_widget.h" +#include "fpdfsdk/pdfwindow/cpwl_color.h" + +class CPWL_MsgControl; +class CPWL_ScrollBar; +class CPWL_Timer; +class CPWL_TimerHandler; +class CPWL_Wnd; +class CFX_SystemHandler; +class IPVT_FontMap; +class IPWL_Provider; + +// window styles +#define PWS_CHILD 0x80000000L +#define PWS_BORDER 0x40000000L +#define PWS_BACKGROUND 0x20000000L +#define PWS_HSCROLL 0x10000000L +#define PWS_VSCROLL 0x08000000L +#define PWS_VISIBLE 0x04000000L +#define PWS_DISABLE 0x02000000L +#define PWS_READONLY 0x01000000L +#define PWS_AUTOFONTSIZE 0x00800000L +#define PWS_AUTOTRANSPARENT 0x00400000L +#define PWS_NOREFRESHCLIP 0x00200000L + +// edit and label styles +#define PES_MULTILINE 0x0001L +#define PES_PASSWORD 0x0002L +#define PES_LEFT 0x0004L +#define PES_RIGHT 0x0008L +#define PES_MIDDLE 0x0010L +#define PES_TOP 0x0020L +#define PES_BOTTOM 0x0040L +#define PES_CENTER 0x0080L +#define PES_CHARARRAY 0x0100L +#define PES_AUTOSCROLL 0x0200L +#define PES_AUTORETURN 0x0400L +#define PES_UNDO 0x0800L +#define PES_RICH 0x1000L +#define PES_SPELLCHECK 0x2000L +#define PES_TEXTOVERFLOW 0x4000L +#define PES_NOREAD 0x8000L + +// listbox styles +#define PLBS_MULTIPLESEL 0x0001L +#define PLBS_HOVERSEL 0x0008L + +// combobox styles +#define PCBS_ALLOWCUSTOMTEXT 0x0001L + +// richedit styles +#define PRES_MULTILINE 0x0001L +#define PRES_AUTORETURN 0x0002L +#define PRES_AUTOSCROLL 0x0004L +#define PRES_UNDO 0x0100L +#define PRES_MULTIPAGES 0x0200L +#define PRES_TEXTOVERFLOW 0x0400L + +// notification messages +#define PNM_ADDCHILD 0x00000000L +#define PNM_REMOVECHILD 0x00000001L +#define PNM_SETSCROLLINFO 0x00000002L +#define PNM_SETSCROLLPOS 0x00000003L +#define PNM_SCROLLWINDOW 0x00000004L +#define PNM_LBUTTONDOWN 0x00000005L +#define PNM_LBUTTONUP 0x00000006L +#define PNM_MOUSEMOVE 0x00000007L +#define PNM_NOTERESET 0x00000008L +#define PNM_SETCARETINFO 0x00000009L +#define PNM_SELCHANGED 0x0000000AL +#define PNM_NOTEEDITCHANGED 0x0000000BL + +#define PWL_CLASSNAME_EDIT "CPWL_Edit" + +struct CPWL_Dash { + CPWL_Dash() : nDash(0), nGap(0), nPhase(0) {} + CPWL_Dash(int32_t dash, int32_t gap, int32_t phase) + : nDash(dash), nGap(gap), nPhase(phase) {} + + void Reset() { + nDash = 0; + nGap = 0; + nPhase = 0; + } + + int32_t nDash; + int32_t nGap; + int32_t nPhase; +}; + +inline bool operator==(const CPWL_Color& c1, const CPWL_Color& c2) { + return c1.nColorType == c2.nColorType && c1.fColor1 - c2.fColor1 < 0.0001 && + c1.fColor1 - c2.fColor1 > -0.0001 && + c1.fColor2 - c2.fColor2 < 0.0001 && + c1.fColor2 - c2.fColor2 > -0.0001 && + c1.fColor3 - c2.fColor3 < 0.0001 && + c1.fColor3 - c2.fColor3 > -0.0001 && + c1.fColor4 - c2.fColor4 < 0.0001 && c1.fColor4 - c2.fColor4 > -0.0001; +} + +inline bool operator!=(const CPWL_Color& c1, const CPWL_Color& c2) { + return !(c1 == c2); +} + +#define PWL_SCROLLBAR_WIDTH 12.0f +#define PWL_SCROLLBAR_BUTTON_WIDTH 9.0f +#define PWL_SCROLLBAR_POSBUTTON_MINWIDTH 2.0f +#define PWL_SCROLLBAR_TRANSPARENCY 150 +#define PWL_SCROLLBAR_BKCOLOR \ + CPWL_Color(COLORTYPE_RGB, 220.0f / 255.0f, 220.0f / 255.0f, 220.0f / 255.0f) +#define PWL_DEFAULT_SELTEXTCOLOR CPWL_Color(COLORTYPE_RGB, 1, 1, 1) +#define PWL_DEFAULT_SELBACKCOLOR \ + CPWL_Color(COLORTYPE_RGB, 0, 51.0f / 255.0f, 113.0f / 255.0f) +#define PWL_DEFAULT_BACKCOLOR PWL_DEFAULT_SELTEXTCOLOR +#define PWL_DEFAULT_TEXTCOLOR CPWL_Color(COLORTYPE_RGB, 0, 0, 0) +#define PWL_DEFAULT_FONTSIZE 9.0f +#define PWL_DEFAULT_BLACKCOLOR CPWL_Color(COLORTYPE_GRAY, 0) +#define PWL_DEFAULT_WHITECOLOR CPWL_Color(COLORTYPE_GRAY, 1) +#define PWL_DEFAULT_HEAVYGRAYCOLOR CPWL_Color(COLORTYPE_GRAY, 0.50) +#define PWL_DEFAULT_LIGHTGRAYCOLOR CPWL_Color(COLORTYPE_GRAY, 0.75) +#define PWL_TRIANGLE_HALFLEN 2.0f +#define PWL_CBBUTTON_TRIANGLE_HALFLEN 3.0f +#define PWL_INVALIDATE_INFLATE 2 + +class IPWL_Provider : public CFX_Observable { + public: + virtual ~IPWL_Provider() {} + + // get a matrix which map user space to CWnd client space + virtual CFX_Matrix GetWindowMatrix(void* pAttachedData) = 0; + + /* + 0 L"&Undo\tCtrl+Z" + 1 L"&Redo\tCtrl+Shift+Z" + 2 L"Cu&t\tCtrl+X" + 3 L"&Copy\tCtrl+C" + 4 L"&Paste\tCtrl+V" + 5 L"&Delete" + 6 L"&Select All\tCtrl+A" + */ + virtual CFX_WideString LoadPopupMenuString(int32_t nIndex) = 0; +}; + +class IPWL_FocusHandler { + public: + virtual ~IPWL_FocusHandler() {} + virtual void OnSetFocus(CPWL_Wnd* pWnd) = 0; +}; + +struct PWL_CREATEPARAM { + public: + PWL_CREATEPARAM(); + PWL_CREATEPARAM(const PWL_CREATEPARAM& other); + + void Reset() { + rcRectWnd.Reset(); + pSystemHandler = nullptr; + pFontMap = nullptr; + pProvider.Reset(); + pFocusHandler = nullptr; + dwFlags = 0; + sBackgroundColor.Reset(); + pAttachedWidget.Reset(); + nBorderStyle = BorderStyle::SOLID; + dwBorderWidth = 0; + sBorderColor.Reset(); + sTextColor.Reset(); + nTransparency = 0; + fFontSize = 0.0f; + sDash.Reset(); + pAttachedData = nullptr; + pParentWnd = nullptr; + pMsgControl = nullptr; + eCursorType = 0; + mtChild.SetIdentity(); + } + + CFX_FloatRect rcRectWnd; // required + CFX_SystemHandler* pSystemHandler; // required + IPVT_FontMap* pFontMap; // required + IPWL_Provider::ObservedPtr pProvider; // required + IPWL_FocusHandler* pFocusHandler; // optional + uint32_t dwFlags; // optional + CPWL_Color sBackgroundColor; // optional + CPDFSDK_Widget::ObservedPtr pAttachedWidget; // required + BorderStyle nBorderStyle; // optional + int32_t dwBorderWidth; // optional + CPWL_Color sBorderColor; // optional + CPWL_Color sTextColor; // optional + int32_t nTransparency; // optional + FX_FLOAT fFontSize; // optional + CPWL_Dash sDash; // optional + void* pAttachedData; // optional + CPWL_Wnd* pParentWnd; // ignore + CPWL_MsgControl* pMsgControl; // ignore + int32_t eCursorType; // ignore + CFX_Matrix mtChild; // ignore +}; + +class CPWL_Timer { + public: + CPWL_Timer(CPWL_TimerHandler* pAttached, CFX_SystemHandler* pSystemHandler); + virtual ~CPWL_Timer(); + + int32_t SetPWLTimer(int32_t nElapse); + void KillPWLTimer(); + static void TimerProc(int32_t idEvent); + + private: + int32_t m_nTimerID; + CPWL_TimerHandler* m_pAttached; + CFX_SystemHandler* m_pSystemHandler; +}; + +class CPWL_TimerHandler { + public: + CPWL_TimerHandler(); + virtual ~CPWL_TimerHandler(); + + void BeginTimer(int32_t nElapse); + void EndTimer(); + virtual void TimerProc(); + virtual CFX_SystemHandler* GetSystemHandler() const = 0; + + private: + std::unique_ptr m_pTimer; +}; + +class CPWL_Wnd : public CPWL_TimerHandler { + public: + CPWL_Wnd(); + ~CPWL_Wnd() override; + + virtual CFX_ByteString GetClassName() const; + virtual void InvalidateRect(CFX_FloatRect* pRect = nullptr); + + virtual bool OnKeyDown(uint16_t nChar, uint32_t nFlag); + virtual bool OnChar(uint16_t nChar, uint32_t nFlag); + virtual bool OnLButtonDblClk(const CFX_PointF& point, uint32_t nFlag); + virtual bool OnLButtonDown(const CFX_PointF& point, uint32_t nFlag); + virtual bool OnLButtonUp(const CFX_PointF& point, uint32_t nFlag); + virtual bool OnRButtonDown(const CFX_PointF& point, uint32_t nFlag); + virtual bool OnRButtonUp(const CFX_PointF& point, uint32_t nFlag); + virtual bool OnMouseMove(const CFX_PointF& point, uint32_t nFlag); + virtual bool OnMouseWheel(short zDelta, + const CFX_PointF& point, + uint32_t nFlag); + virtual void OnNotify(CPWL_Wnd* pWnd, + uint32_t msg, + intptr_t wParam = 0, + intptr_t lParam = 0); + virtual void SetFocus(); + virtual void KillFocus(); + virtual void SetCursor(); + virtual void SetVisible(bool bVisible); + virtual void SetFontSize(FX_FLOAT fFontSize); + virtual FX_FLOAT GetFontSize() const; + + virtual CFX_FloatRect GetFocusRect() const; + virtual CFX_FloatRect GetClientRect() const; + + void InvalidateFocusHandler(IPWL_FocusHandler* handler); + void InvalidateProvider(IPWL_Provider* provider); + void Create(const PWL_CREATEPARAM& cp); + void Destroy(); + void Move(const CFX_FloatRect& rcNew, bool bReset, bool bRefresh); + + void SetCapture(); + void ReleaseCapture(); + + void DrawAppearance(CFX_RenderDevice* pDevice, CFX_Matrix* pUser2Device); + + CPWL_Color GetBackgroundColor() const; + void SetBackgroundColor(const CPWL_Color& color); + CPWL_Color GetBorderColor() const; + CPWL_Color GetTextColor() const; + void SetTextColor(const CPWL_Color& color); + CPWL_Color GetBorderLeftTopColor(BorderStyle nBorderStyle) const; + CPWL_Color GetBorderRightBottomColor(BorderStyle nBorderStyle) const; + + void SetBorderStyle(BorderStyle eBorderStyle); + BorderStyle GetBorderStyle() const; + const CPWL_Dash& GetBorderDash() const; + + int32_t GetBorderWidth() const; + int32_t GetInnerBorderWidth() const; + CFX_FloatRect GetWindowRect() const; + CFX_PointF GetCenterPoint() const; + + bool IsVisible() const { return m_bVisible; } + bool HasFlag(uint32_t dwFlags) const; + void AddFlag(uint32_t dwFlags); + void RemoveFlag(uint32_t dwFlags); + + void SetClipRect(const CFX_FloatRect& rect); + const CFX_FloatRect& GetClipRect() const; + + CPWL_Wnd* GetParentWindow() const; + void* GetAttachedData() const; + + bool WndHitTest(const CFX_PointF& point) const; + bool ClientHitTest(const CFX_PointF& point) const; + bool IsCaptureMouse() const; + + void EnableWindow(bool bEnable); + bool IsEnabled() const { return m_bEnabled; } + const CPWL_Wnd* GetFocused() const; + bool IsFocused() const; + bool IsReadOnly() const; + CPWL_ScrollBar* GetVScrollBar() const; + + IPVT_FontMap* GetFontMap() const; + IPWL_Provider* GetProvider() const; + IPWL_FocusHandler* GetFocusHandler() const; + + int32_t GetTransparency(); + void SetTransparency(int32_t nTransparency); + + CFX_Matrix GetChildToRoot() const; + CFX_Matrix GetChildMatrix() const; + void SetChildMatrix(const CFX_Matrix& mt); + CFX_Matrix GetWindowMatrix() const; + + protected: + friend class CPWL_MsgControl; + + // CPWL_TimerHandler + CFX_SystemHandler* GetSystemHandler() const override; + + virtual void CreateChildWnd(const PWL_CREATEPARAM& cp); + virtual void RePosChildWnd(); + virtual void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream); + + virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device); + + virtual void OnCreate(PWL_CREATEPARAM& cp); + virtual void OnCreated(); + virtual void OnDestroy(); + + virtual void OnSetFocus(); + virtual void OnKillFocus(); + + void GetAppearanceStream(CFX_ByteTextBuf& sAppStream); + void SetNotifyFlag(bool bNotifying = true) { m_bNotifying = bNotifying; } + + bool IsValid() const; + const PWL_CREATEPARAM& GetCreationParam() const; + bool IsNotifying() const { return m_bNotifying; } + + void InvalidateRectMove(const CFX_FloatRect& rcOld, + const CFX_FloatRect& rcNew); + + bool IsWndCaptureMouse(const CPWL_Wnd* pWnd) const; + bool IsWndCaptureKeyboard(const CPWL_Wnd* pWnd) const; + const CPWL_Wnd* GetRootWnd() const; + + bool IsCTRLpressed(uint32_t nFlag) const; + bool IsSHIFTpressed(uint32_t nFlag) const; + bool IsALTpressed(uint32_t nFlag) const; + + private: + CFX_PointF ParentToChild(const CFX_PointF& point) const; + CFX_FloatRect ParentToChild(const CFX_FloatRect& rect) const; + + void GetChildAppearanceStream(CFX_ByteTextBuf& sAppStream); + void DrawChildAppearance(CFX_RenderDevice* pDevice, CFX_Matrix* pUser2Device); + + FX_RECT PWLtoWnd(const CFX_FloatRect& rect) const; + + void AddChild(CPWL_Wnd* pWnd); + void RemoveChild(CPWL_Wnd* pWnd); + + void CreateScrollBar(const PWL_CREATEPARAM& cp); + void CreateVScrollBar(const PWL_CREATEPARAM& cp); + + void AdjustStyle(); + void CreateMsgControl(); + void DestroyMsgControl(); + + CPWL_MsgControl* GetMsgControl() const; + + std::vector m_Children; + PWL_CREATEPARAM m_sPrivateParam; + CPWL_ScrollBar* m_pVScrollBar; + CFX_FloatRect m_rcWindow; + CFX_FloatRect m_rcClip; + bool m_bCreated; + bool m_bVisible; + bool m_bNotifying; + bool m_bEnabled; +}; + +#endif // FPDFSDK_PDFWINDOW_PWL_WND_H_ diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/cpwl_color.cpp b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/cpwl_color.cpp new file mode 100644 index 000000000000..9c9ca3eff02b --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/cpwl_color.cpp @@ -0,0 +1,179 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/pdfwindow/cpwl_color.h" + +#include + +namespace { + +bool InRange(FX_FLOAT comp) { + return comp >= 0.0f && comp <= 1.0f; +} + +CPWL_Color ConvertCMYK2GRAY(FX_FLOAT dC, + FX_FLOAT dM, + FX_FLOAT dY, + FX_FLOAT dK) { + if (!InRange(dC) || !InRange(dM) || !InRange(dY) || !InRange(dK)) + return CPWL_Color(COLORTYPE_GRAY); + return CPWL_Color( + COLORTYPE_GRAY, + 1.0f - std::min(1.0f, 0.3f * dC + 0.59f * dM + 0.11f * dY + dK)); +} + +CPWL_Color ConvertGRAY2CMYK(FX_FLOAT dGray) { + if (!InRange(dGray)) + return CPWL_Color(COLORTYPE_CMYK); + return CPWL_Color(COLORTYPE_CMYK, 0.0f, 0.0f, 0.0f, 1.0f - dGray); +} + +CPWL_Color ConvertGRAY2RGB(FX_FLOAT dGray) { + if (!InRange(dGray)) + return CPWL_Color(COLORTYPE_RGB); + return CPWL_Color(COLORTYPE_RGB, dGray, dGray, dGray); +} + +CPWL_Color ConvertRGB2GRAY(FX_FLOAT dR, FX_FLOAT dG, FX_FLOAT dB) { + if (!InRange(dR) || !InRange(dG) || !InRange(dB)) + return CPWL_Color(COLORTYPE_GRAY); + return CPWL_Color(COLORTYPE_GRAY, 0.3f * dR + 0.59f * dG + 0.11f * dB); +} + +CPWL_Color ConvertCMYK2RGB(FX_FLOAT dC, FX_FLOAT dM, FX_FLOAT dY, FX_FLOAT dK) { + if (!InRange(dC) || !InRange(dM) || !InRange(dY) || !InRange(dK)) + return CPWL_Color(COLORTYPE_RGB); + return CPWL_Color(COLORTYPE_RGB, 1.0f - std::min(1.0f, dC + dK), + 1.0f - std::min(1.0f, dM + dK), + 1.0f - std::min(1.0f, dY + dK)); +} + +CPWL_Color ConvertRGB2CMYK(FX_FLOAT dR, FX_FLOAT dG, FX_FLOAT dB) { + if (!InRange(dR) || !InRange(dG) || !InRange(dB)) + return CPWL_Color(COLORTYPE_CMYK); + + FX_FLOAT c = 1.0f - dR; + FX_FLOAT m = 1.0f - dG; + FX_FLOAT y = 1.0f - dB; + return CPWL_Color(COLORTYPE_CMYK, c, m, y, std::min(c, std::min(m, y))); +} + +} // namespace + +CPWL_Color CPWL_Color::ConvertColorType(int32_t nConvertColorType) const { + if (nColorType == nConvertColorType) + return *this; + + CPWL_Color ret; + switch (nColorType) { + case COLORTYPE_TRANSPARENT: + ret = *this; + ret.nColorType = COLORTYPE_TRANSPARENT; + break; + case COLORTYPE_GRAY: + switch (nConvertColorType) { + case COLORTYPE_RGB: + ret = ConvertGRAY2RGB(fColor1); + break; + case COLORTYPE_CMYK: + ret = ConvertGRAY2CMYK(fColor1); + break; + } + break; + case COLORTYPE_RGB: + switch (nConvertColorType) { + case COLORTYPE_GRAY: + ret = ConvertRGB2GRAY(fColor1, fColor2, fColor3); + break; + case COLORTYPE_CMYK: + ret = ConvertRGB2CMYK(fColor1, fColor2, fColor3); + break; + } + break; + case COLORTYPE_CMYK: + switch (nConvertColorType) { + case COLORTYPE_GRAY: + ret = ConvertCMYK2GRAY(fColor1, fColor2, fColor3, fColor4); + break; + case COLORTYPE_RGB: + ret = ConvertCMYK2RGB(fColor1, fColor2, fColor3, fColor4); + break; + } + break; + } + return ret; +} + +FX_COLORREF CPWL_Color::ToFXColor(int32_t nTransparency) const { + CPWL_Color ret; + switch (nColorType) { + case COLORTYPE_TRANSPARENT: { + ret = CPWL_Color(COLORTYPE_TRANSPARENT, 0, 0, 0, 0); + break; + } + case COLORTYPE_GRAY: { + ret = ConvertGRAY2RGB(fColor1); + ret.fColor4 = nTransparency; + break; + } + case COLORTYPE_RGB: { + ret = CPWL_Color(COLORTYPE_RGB, fColor1, fColor2, fColor3); + ret.fColor4 = nTransparency; + break; + } + case COLORTYPE_CMYK: { + ret = ConvertCMYK2RGB(fColor1, fColor2, fColor3, fColor4); + ret.fColor4 = nTransparency; + break; + } + } + return ArgbEncode(ret.fColor4, static_cast(ret.fColor1 * 255), + static_cast(ret.fColor2 * 255), + static_cast(ret.fColor3 * 255)); +} + +CPWL_Color CPWL_Color::operator-(FX_FLOAT fColorSub) const { + CPWL_Color sRet(nColorType); + switch (nColorType) { + case COLORTYPE_TRANSPARENT: + sRet.nColorType = COLORTYPE_RGB; + sRet.fColor1 = std::max(1.0f - fColorSub, 0.0f); + sRet.fColor2 = std::max(1.0f - fColorSub, 0.0f); + sRet.fColor3 = std::max(1.0f - fColorSub, 0.0f); + break; + case COLORTYPE_RGB: + case COLORTYPE_GRAY: + case COLORTYPE_CMYK: + sRet.fColor1 = std::max(fColor1 - fColorSub, 0.0f); + sRet.fColor2 = std::max(fColor2 - fColorSub, 0.0f); + sRet.fColor3 = std::max(fColor3 - fColorSub, 0.0f); + sRet.fColor4 = std::max(fColor4 - fColorSub, 0.0f); + break; + } + return sRet; +} + +CPWL_Color CPWL_Color::operator/(FX_FLOAT fColorDivide) const { + CPWL_Color sRet(nColorType); + switch (nColorType) { + case COLORTYPE_TRANSPARENT: + sRet.nColorType = COLORTYPE_RGB; + sRet.fColor1 = 1.0f / fColorDivide; + sRet.fColor2 = 1.0f / fColorDivide; + sRet.fColor3 = 1.0f / fColorDivide; + break; + case COLORTYPE_RGB: + case COLORTYPE_GRAY: + case COLORTYPE_CMYK: + sRet = *this; + sRet.fColor1 /= fColorDivide; + sRet.fColor2 /= fColorDivide; + sRet.fColor3 /= fColorDivide; + sRet.fColor4 /= fColorDivide; + break; + } + return sRet; +} diff --git a/modules/pdfium/pdfium/fpdfsdk/pdfwindow/cpwl_color.h b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/cpwl_color.h new file mode 100644 index 000000000000..f1b34c7eb836 --- /dev/null +++ b/modules/pdfium/pdfium/fpdfsdk/pdfwindow/cpwl_color.h @@ -0,0 +1,53 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_PDFWINDOW_CPWL_COLOR_H_ +#define FPDFSDK_PDFWINDOW_CPWL_COLOR_H_ + +#include "core/fpdfdoc/cpdf_formcontrol.h" + +struct CPWL_Color { + CPWL_Color(int32_t type = COLORTYPE_TRANSPARENT, + FX_FLOAT color1 = 0.0f, + FX_FLOAT color2 = 0.0f, + FX_FLOAT color3 = 0.0f, + FX_FLOAT color4 = 0.0f) + : nColorType(type), + fColor1(color1), + fColor2(color2), + fColor3(color3), + fColor4(color4) {} + + CPWL_Color(int32_t r, int32_t g, int32_t b) + : nColorType(COLORTYPE_RGB), + fColor1(r / 255.0f), + fColor2(g / 255.0f), + fColor3(b / 255.0f), + fColor4(0) {} + + CPWL_Color operator/(FX_FLOAT fColorDivide) const; + CPWL_Color operator-(FX_FLOAT fColorSub) const; + + CPWL_Color ConvertColorType(int32_t other_nColorType) const; + + FX_COLORREF ToFXColor(int32_t nTransparency) const; + + void Reset() { + nColorType = COLORTYPE_TRANSPARENT; + fColor1 = 0.0f; + fColor2 = 0.0f; + fColor3 = 0.0f; + fColor4 = 0.0f; + } + + int32_t nColorType; + FX_FLOAT fColor1; + FX_FLOAT fColor2; + FX_FLOAT fColor3; + FX_FLOAT fColor4; +}; + +#endif // FPDFSDK_PDFWINDOW_CPWL_COLOR_H_ diff --git a/modules/pdfium/pdfium/fxjs/DEPS b/modules/pdfium/pdfium/fxjs/DEPS new file mode 100644 index 000000000000..633eeed5613b --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/DEPS @@ -0,0 +1,4 @@ +include_rules = [ + '+core/fxcrt', + '+v8/include', +] diff --git a/modules/pdfium/pdfium/fxjs/cfxjse_arguments.cpp b/modules/pdfium/pdfium/fxjs/cfxjse_arguments.cpp new file mode 100644 index 000000000000..75904cbbead8 --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/cfxjse_arguments.cpp @@ -0,0 +1,56 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/cfxjse_arguments.h" + +#include "fxjs/cfxjse_context.h" +#include "fxjs/cfxjse_value.h" + +v8::Isolate* CFXJSE_Arguments::GetRuntime() const { + return m_pRetValue->GetIsolate(); +} + +int32_t CFXJSE_Arguments::GetLength() const { + return m_pInfo->Length(); +} + +std::unique_ptr CFXJSE_Arguments::GetValue(int32_t index) const { + std::unique_ptr lpArgValue( + new CFXJSE_Value(v8::Isolate::GetCurrent())); + lpArgValue->ForceSetValue((*m_pInfo)[index]); + return lpArgValue; +} + +bool CFXJSE_Arguments::GetBoolean(int32_t index) const { + return (*m_pInfo)[index]->BooleanValue(); +} + +int32_t CFXJSE_Arguments::GetInt32(int32_t index) const { + return static_cast((*m_pInfo)[index]->NumberValue()); +} + +FX_FLOAT CFXJSE_Arguments::GetFloat(int32_t index) const { + return static_cast((*m_pInfo)[index]->NumberValue()); +} + +CFX_ByteString CFXJSE_Arguments::GetUTF8String(int32_t index) const { + v8::Local hString = (*m_pInfo)[index]->ToString(); + v8::String::Utf8Value szStringVal(hString); + return CFX_ByteString(*szStringVal); +} + +CFXJSE_HostObject* CFXJSE_Arguments::GetObject(int32_t index, + CFXJSE_Class* pClass) const { + v8::Local hValue = (*m_pInfo)[index]; + ASSERT(!hValue.IsEmpty()); + if (!hValue->IsObject()) + return nullptr; + return FXJSE_RetrieveObjectBinding(hValue.As(), pClass); +} + +CFXJSE_Value* CFXJSE_Arguments::GetReturnValue() { + return m_pRetValue; +} diff --git a/modules/pdfium/pdfium/fxjs/cfxjse_arguments.h b/modules/pdfium/pdfium/fxjs/cfxjse_arguments.h new file mode 100644 index 000000000000..51e1981d03fc --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/cfxjse_arguments.h @@ -0,0 +1,38 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_CFXJSE_ARGUMENTS_H_ +#define FXJS_CFXJSE_ARGUMENTS_H_ + +#include + +#include "fxjs/fxjse.h" + +class CFXJSE_Class; + +class CFXJSE_Arguments { + public: + CFXJSE_Arguments(const v8::FunctionCallbackInfo* pInfo, + CFXJSE_Value* pRetValue) + : m_pInfo(pInfo), m_pRetValue(pRetValue) {} + + v8::Isolate* GetRuntime() const; + int32_t GetLength() const; + std::unique_ptr GetValue(int32_t index) const; + bool GetBoolean(int32_t index) const; + int32_t GetInt32(int32_t index) const; + FX_FLOAT GetFloat(int32_t index) const; + CFX_ByteString GetUTF8String(int32_t index) const; + CFXJSE_HostObject* GetObject(int32_t index, + CFXJSE_Class* pClass = nullptr) const; + CFXJSE_Value* GetReturnValue(); + + private: + const v8::FunctionCallbackInfo* m_pInfo; + CFXJSE_Value* m_pRetValue; +}; + +#endif // FXJS_CFXJSE_ARGUMENTS_H_ diff --git a/modules/pdfium/pdfium/fxjs/cfxjse_class.cpp b/modules/pdfium/pdfium/fxjs/cfxjse_class.cpp new file mode 100644 index 000000000000..fd97b575ed53 --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/cfxjse_class.cpp @@ -0,0 +1,436 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/cfxjse_class.h" + +#include + +#include "fxjs/cfxjse_context.h" +#include "fxjs/cfxjse_value.h" + +namespace { + +void V8FunctionCallback_Wrapper( + const v8::FunctionCallbackInfo& info) { + const FXJSE_FUNCTION_DESCRIPTOR* lpFunctionInfo = + static_cast( + info.Data().As()->Value()); + if (!lpFunctionInfo) + return; + + CFX_ByteStringC szFunctionName(lpFunctionInfo->name); + std::unique_ptr lpThisValue( + new CFXJSE_Value(info.GetIsolate())); + lpThisValue->ForceSetValue(info.This()); + std::unique_ptr lpRetValue(new CFXJSE_Value(info.GetIsolate())); + CFXJSE_Arguments impl(&info, lpRetValue.get()); + lpFunctionInfo->callbackProc(lpThisValue.get(), szFunctionName, impl); + if (!lpRetValue->DirectGetValue().IsEmpty()) + info.GetReturnValue().Set(lpRetValue->DirectGetValue()); +} + +void V8ClassGlobalConstructorCallback_Wrapper( + const v8::FunctionCallbackInfo& info) { + const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition = + static_cast( + info.Data().As()->Value()); + if (!lpClassDefinition) + return; + + CFX_ByteStringC szFunctionName(lpClassDefinition->name); + std::unique_ptr lpThisValue( + new CFXJSE_Value(info.GetIsolate())); + lpThisValue->ForceSetValue(info.This()); + std::unique_ptr lpRetValue(new CFXJSE_Value(info.GetIsolate())); + CFXJSE_Arguments impl(&info, lpRetValue.get()); + lpClassDefinition->constructor(lpThisValue.get(), szFunctionName, impl); + if (!lpRetValue->DirectGetValue().IsEmpty()) + info.GetReturnValue().Set(lpRetValue->DirectGetValue()); +} + +void V8GetterCallback_Wrapper(v8::Local property, + const v8::PropertyCallbackInfo& info) { + const FXJSE_PROPERTY_DESCRIPTOR* lpPropertyInfo = + static_cast( + info.Data().As()->Value()); + if (!lpPropertyInfo) + return; + + CFX_ByteStringC szPropertyName(lpPropertyInfo->name); + std::unique_ptr lpThisValue( + new CFXJSE_Value(info.GetIsolate())); + std::unique_ptr lpPropValue( + new CFXJSE_Value(info.GetIsolate())); + lpThisValue->ForceSetValue(info.This()); + lpPropertyInfo->getProc(lpThisValue.get(), szPropertyName, lpPropValue.get()); + info.GetReturnValue().Set(lpPropValue->DirectGetValue()); +} + +void V8SetterCallback_Wrapper(v8::Local property, + v8::Local value, + const v8::PropertyCallbackInfo& info) { + const FXJSE_PROPERTY_DESCRIPTOR* lpPropertyInfo = + static_cast( + info.Data().As()->Value()); + if (!lpPropertyInfo) + return; + + CFX_ByteStringC szPropertyName(lpPropertyInfo->name); + std::unique_ptr lpThisValue( + new CFXJSE_Value(info.GetIsolate())); + std::unique_ptr lpPropValue( + new CFXJSE_Value(info.GetIsolate())); + lpThisValue->ForceSetValue(info.This()); + lpPropValue->ForceSetValue(value); + lpPropertyInfo->setProc(lpThisValue.get(), szPropertyName, lpPropValue.get()); +} + +void V8ConstructorCallback_Wrapper( + const v8::FunctionCallbackInfo& info) { + if (!info.IsConstructCall()) + return; + + const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition = + static_cast( + info.Data().As()->Value()); + if (!lpClassDefinition) + return; + + ASSERT(info.This()->InternalFieldCount()); + info.This()->SetAlignedPointerInInternalField(0, nullptr); +} + +void Context_GlobalObjToString( + const v8::FunctionCallbackInfo& info) { + const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast( + info.Data().As()->Value()); + if (!lpClass) + return; + + if (info.This() == info.Holder() && lpClass->name) { + CFX_ByteString szStringVal; + szStringVal.Format("[object %s]", lpClass->name); + info.GetReturnValue().Set(v8::String::NewFromUtf8( + info.GetIsolate(), szStringVal.c_str(), v8::String::kNormalString, + szStringVal.GetLength())); + return; + } + v8::Local local_str = + info.This() + ->ObjectProtoToString(info.GetIsolate()->GetCurrentContext()) + .FromMaybe(v8::Local()); + info.GetReturnValue().Set(local_str); +} + +void DynPropGetterAdapter_MethodCallback( + const v8::FunctionCallbackInfo& info) { + v8::Local hCallBackInfo = info.Data().As(); + FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast( + hCallBackInfo->GetAlignedPointerFromInternalField(0)); + v8::Local hPropName = + hCallBackInfo->GetInternalField(1).As(); + ASSERT(lpClass && !hPropName.IsEmpty()); + v8::String::Utf8Value szPropName(hPropName); + CFX_ByteStringC szFxPropName = *szPropName; + std::unique_ptr lpThisValue( + new CFXJSE_Value(info.GetIsolate())); + lpThisValue->ForceSetValue(info.This()); + std::unique_ptr lpRetValue(new CFXJSE_Value(info.GetIsolate())); + CFXJSE_Arguments impl(&info, lpRetValue.get()); + lpClass->dynMethodCall(lpThisValue.get(), szFxPropName, impl); + if (!lpRetValue->DirectGetValue().IsEmpty()) + info.GetReturnValue().Set(lpRetValue->DirectGetValue()); +} + +void DynPropGetterAdapter(const FXJSE_CLASS_DESCRIPTOR* lpClass, + CFXJSE_Value* pObject, + const CFX_ByteStringC& szPropName, + CFXJSE_Value* pValue) { + ASSERT(lpClass); + int32_t nPropType = + lpClass->dynPropTypeGetter == nullptr + ? FXJSE_ClassPropType_Property + : lpClass->dynPropTypeGetter(pObject, szPropName, false); + if (nPropType == FXJSE_ClassPropType_Property) { + if (lpClass->dynPropGetter) + lpClass->dynPropGetter(pObject, szPropName, pValue); + } else if (nPropType == FXJSE_ClassPropType_Method) { + if (lpClass->dynMethodCall && pValue) { + v8::Isolate* pIsolate = pValue->GetIsolate(); + v8::HandleScope hscope(pIsolate); + v8::Local hCallBackInfoTemplate = + v8::ObjectTemplate::New(pIsolate); + hCallBackInfoTemplate->SetInternalFieldCount(2); + v8::Local hCallBackInfo = + hCallBackInfoTemplate->NewInstance(); + hCallBackInfo->SetAlignedPointerInInternalField( + 0, const_cast(lpClass)); + hCallBackInfo->SetInternalField( + 1, v8::String::NewFromUtf8( + pIsolate, reinterpret_cast(szPropName.raw_str()), + v8::String::kNormalString, szPropName.GetLength())); + pValue->ForceSetValue( + v8::Function::New(pValue->GetIsolate()->GetCurrentContext(), + DynPropGetterAdapter_MethodCallback, hCallBackInfo, + 0, v8::ConstructorBehavior::kThrow) + .ToLocalChecked()); + } + } +} + +void DynPropSetterAdapter(const FXJSE_CLASS_DESCRIPTOR* lpClass, + CFXJSE_Value* pObject, + const CFX_ByteStringC& szPropName, + CFXJSE_Value* pValue) { + ASSERT(lpClass); + int32_t nPropType = + lpClass->dynPropTypeGetter == nullptr + ? FXJSE_ClassPropType_Property + : lpClass->dynPropTypeGetter(pObject, szPropName, false); + if (nPropType != FXJSE_ClassPropType_Method) { + if (lpClass->dynPropSetter) + lpClass->dynPropSetter(pObject, szPropName, pValue); + } +} + +bool DynPropQueryAdapter(const FXJSE_CLASS_DESCRIPTOR* lpClass, + CFXJSE_Value* pObject, + const CFX_ByteStringC& szPropName) { + ASSERT(lpClass); + int32_t nPropType = + lpClass->dynPropTypeGetter == nullptr + ? FXJSE_ClassPropType_Property + : lpClass->dynPropTypeGetter(pObject, szPropName, true); + return nPropType != FXJSE_ClassPropType_None; +} + +bool DynPropDeleterAdapter(const FXJSE_CLASS_DESCRIPTOR* lpClass, + CFXJSE_Value* pObject, + const CFX_ByteStringC& szPropName) { + ASSERT(lpClass); + int32_t nPropType = + lpClass->dynPropTypeGetter == nullptr + ? FXJSE_ClassPropType_Property + : lpClass->dynPropTypeGetter(pObject, szPropName, false); + if (nPropType != FXJSE_ClassPropType_Method) { + if (lpClass->dynPropDeleter) + return lpClass->dynPropDeleter(pObject, szPropName); + return nPropType != FXJSE_ClassPropType_Property; + } + return false; +} + +void NamedPropertyQueryCallback( + v8::Local property, + const v8::PropertyCallbackInfo& info) { + v8::Local thisObject = info.This(); + const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast( + info.Data().As()->Value()); + v8::Isolate* pIsolate = info.GetIsolate(); + v8::HandleScope scope(pIsolate); + v8::String::Utf8Value szPropName(property); + CFX_ByteStringC szFxPropName(*szPropName, szPropName.length()); + std::unique_ptr lpThisValue( + new CFXJSE_Value(info.GetIsolate())); + lpThisValue->ForceSetValue(thisObject); + if (DynPropQueryAdapter(lpClass, lpThisValue.get(), szFxPropName)) { + info.GetReturnValue().Set(v8::DontDelete); + return; + } + const int32_t iV8Absent = 64; + info.GetReturnValue().Set(iV8Absent); +} + +void NamedPropertyDeleterCallback( + v8::Local property, + const v8::PropertyCallbackInfo& info) { + v8::Local thisObject = info.This(); + const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast( + info.Data().As()->Value()); + v8::Isolate* pIsolate = info.GetIsolate(); + v8::HandleScope scope(pIsolate); + v8::String::Utf8Value szPropName(property); + CFX_ByteStringC szFxPropName(*szPropName, szPropName.length()); + std::unique_ptr lpThisValue( + new CFXJSE_Value(info.GetIsolate())); + lpThisValue->ForceSetValue(thisObject); + info.GetReturnValue().Set( + !!DynPropDeleterAdapter(lpClass, lpThisValue.get(), szFxPropName)); +} + +void NamedPropertyGetterCallback( + v8::Local property, + const v8::PropertyCallbackInfo& info) { + v8::Local thisObject = info.This(); + const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast( + info.Data().As()->Value()); + v8::String::Utf8Value szPropName(property); + CFX_ByteStringC szFxPropName(*szPropName, szPropName.length()); + std::unique_ptr lpThisValue( + new CFXJSE_Value(info.GetIsolate())); + lpThisValue->ForceSetValue(thisObject); + std::unique_ptr lpNewValue(new CFXJSE_Value(info.GetIsolate())); + DynPropGetterAdapter(lpClass, lpThisValue.get(), szFxPropName, + lpNewValue.get()); + info.GetReturnValue().Set(lpNewValue->DirectGetValue()); +} + +void NamedPropertySetterCallback( + v8::Local property, + v8::Local value, + const v8::PropertyCallbackInfo& info) { + v8::Local thisObject = info.This(); + const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast( + info.Data().As()->Value()); + v8::String::Utf8Value szPropName(property); + CFX_ByteStringC szFxPropName(*szPropName, szPropName.length()); + std::unique_ptr lpThisValue( + new CFXJSE_Value(info.GetIsolate())); + lpThisValue->ForceSetValue(thisObject); + + std::unique_ptr lpNewValue(new CFXJSE_Value(info.GetIsolate())); + lpNewValue->ForceSetValue(value); + DynPropSetterAdapter(lpClass, lpThisValue.get(), szFxPropName, + lpNewValue.get()); + info.GetReturnValue().Set(value); +} + +void NamedPropertyEnumeratorCallback( + const v8::PropertyCallbackInfo& info) { + const FXJSE_CLASS_DESCRIPTOR* lpClass = static_cast( + info.Data().As()->Value()); + v8::Isolate* pIsolate = info.GetIsolate(); + v8::Local newArray = v8::Array::New(pIsolate, lpClass->propNum); + for (int i = 0; i < lpClass->propNum; i++) { + newArray->Set( + i, v8::String::NewFromUtf8(pIsolate, lpClass->properties[i].name)); + } + info.GetReturnValue().Set(newArray); +} + +} // namespace + +// static +CFXJSE_Class* CFXJSE_Class::Create( + CFXJSE_Context* lpContext, + const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition, + bool bIsJSGlobal) { + if (!lpContext || !lpClassDefinition) + return nullptr; + + CFXJSE_Class* pClass = + GetClassFromContext(lpContext, lpClassDefinition->name); + if (pClass) + return pClass; + + v8::Isolate* pIsolate = lpContext->m_pIsolate; + pClass = new CFXJSE_Class(lpContext); + pClass->m_szClassName = lpClassDefinition->name; + pClass->m_lpClassDefinition = lpClassDefinition; + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate); + v8::Local hFunctionTemplate = v8::FunctionTemplate::New( + pIsolate, bIsJSGlobal ? 0 : V8ConstructorCallback_Wrapper, + v8::External::New( + pIsolate, const_cast(lpClassDefinition))); + hFunctionTemplate->SetClassName( + v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name)); + hFunctionTemplate->InstanceTemplate()->SetInternalFieldCount(1); + v8::Local hObjectTemplate = + hFunctionTemplate->InstanceTemplate(); + SetUpNamedPropHandler(pIsolate, hObjectTemplate, lpClassDefinition); + + if (lpClassDefinition->propNum) { + for (int32_t i = 0; i < lpClassDefinition->propNum; i++) { + hObjectTemplate->SetNativeDataProperty( + v8::String::NewFromUtf8(pIsolate, + lpClassDefinition->properties[i].name), + lpClassDefinition->properties[i].getProc ? V8GetterCallback_Wrapper + : nullptr, + lpClassDefinition->properties[i].setProc ? V8SetterCallback_Wrapper + : nullptr, + v8::External::New(pIsolate, const_cast( + lpClassDefinition->properties + i)), + static_cast(v8::DontDelete)); + } + } + if (lpClassDefinition->methNum) { + for (int32_t i = 0; i < lpClassDefinition->methNum; i++) { + v8::Local fun = v8::FunctionTemplate::New( + pIsolate, V8FunctionCallback_Wrapper, + v8::External::New(pIsolate, const_cast( + lpClassDefinition->methods + i))); + fun->RemovePrototype(); + hObjectTemplate->Set( + v8::String::NewFromUtf8(pIsolate, lpClassDefinition->methods[i].name), + fun, + static_cast(v8::ReadOnly | v8::DontDelete)); + } + } + if (lpClassDefinition->constructor) { + if (bIsJSGlobal) { + hObjectTemplate->Set( + v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name), + v8::FunctionTemplate::New( + pIsolate, V8ClassGlobalConstructorCallback_Wrapper, + v8::External::New(pIsolate, const_cast( + lpClassDefinition))), + static_cast(v8::ReadOnly | v8::DontDelete)); + } else { + v8::Local hLocalContext = + v8::Local::New(pIsolate, lpContext->m_hContext); + FXJSE_GetGlobalObjectFromContext(hLocalContext) + ->Set(v8::String::NewFromUtf8(pIsolate, lpClassDefinition->name), + v8::Function::New( + pIsolate, V8ClassGlobalConstructorCallback_Wrapper, + v8::External::New(pIsolate, + const_cast( + lpClassDefinition)))); + } + } + if (bIsJSGlobal) { + v8::Local fun = v8::FunctionTemplate::New( + pIsolate, Context_GlobalObjToString, + v8::External::New( + pIsolate, const_cast(lpClassDefinition))); + fun->RemovePrototype(); + hObjectTemplate->Set(v8::String::NewFromUtf8(pIsolate, "toString"), fun); + } + pClass->m_hTemplate.Reset(lpContext->m_pIsolate, hFunctionTemplate); + lpContext->m_rgClasses.push_back(std::unique_ptr(pClass)); + return pClass; +} + +// static +CFXJSE_Class* CFXJSE_Class::GetClassFromContext(CFXJSE_Context* pContext, + const CFX_ByteStringC& szName) { + for (const auto& pClass : pContext->m_rgClasses) { + if (pClass->m_szClassName == szName) + return pClass.get(); + } + return nullptr; +} + +// static +void CFXJSE_Class::SetUpNamedPropHandler( + v8::Isolate* pIsolate, + v8::Local& hObjectTemplate, + const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition) { + v8::NamedPropertyHandlerConfiguration configuration( + lpClassDefinition->dynPropGetter ? NamedPropertyGetterCallback : 0, + lpClassDefinition->dynPropSetter ? NamedPropertySetterCallback : 0, + lpClassDefinition->dynPropTypeGetter ? NamedPropertyQueryCallback : 0, + lpClassDefinition->dynPropDeleter ? NamedPropertyDeleterCallback : 0, + NamedPropertyEnumeratorCallback, + v8::External::New(pIsolate, + const_cast(lpClassDefinition)), + v8::PropertyHandlerFlags::kNonMasking); + hObjectTemplate->SetHandler(configuration); +} + +CFXJSE_Class::CFXJSE_Class(CFXJSE_Context* lpContext) + : m_lpClassDefinition(nullptr), m_pContext(lpContext) {} + +CFXJSE_Class::~CFXJSE_Class() {} diff --git a/modules/pdfium/pdfium/fxjs/cfxjse_class.h b/modules/pdfium/pdfium/fxjs/cfxjse_class.h new file mode 100644 index 000000000000..1b3528a5c00d --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/cfxjse_class.h @@ -0,0 +1,45 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_CFXJSE_CLASS_H_ +#define FXJS_CFXJSE_CLASS_H_ + +#include "fxjs/cfxjse_arguments.h" +#include "fxjs/fxjse.h" +#include "v8/include/v8.h" + +class CFXJSE_Context; +class CFXJSE_Value; + +class CFXJSE_Class { + public: + static CFXJSE_Class* Create(CFXJSE_Context* pContext, + const FXJSE_CLASS_DESCRIPTOR* lpClassDefintion, + bool bIsJSGlobal = false); + static CFXJSE_Class* GetClassFromContext(CFXJSE_Context* pContext, + const CFX_ByteStringC& szName); + static void SetUpNamedPropHandler( + v8::Isolate* pIsolate, + v8::Local& hObjectTemplate, + const FXJSE_CLASS_DESCRIPTOR* lpClassDefinition); + + ~CFXJSE_Class(); + + CFXJSE_Context* GetContext() { return m_pContext; } + v8::Global& GetTemplate() { return m_hTemplate; } + + protected: + explicit CFXJSE_Class(CFXJSE_Context* lpContext); + + CFX_ByteString m_szClassName; + const FXJSE_CLASS_DESCRIPTOR* m_lpClassDefinition; + CFXJSE_Context* m_pContext; + v8::Global m_hTemplate; + friend class CFXJSE_Context; + friend class CFXJSE_Value; +}; + +#endif // FXJS_CFXJSE_CLASS_H_ diff --git a/modules/pdfium/pdfium/fxjs/cfxjse_context.cpp b/modules/pdfium/pdfium/fxjs/cfxjse_context.cpp new file mode 100644 index 000000000000..d82f875e0f03 --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/cfxjse_context.cpp @@ -0,0 +1,252 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/cfxjse_context.h" + +#include "fxjs/cfxjse_class.h" +#include "fxjs/cfxjse_value.h" + +namespace { + +const FX_CHAR szCompatibleModeScript[] = + "(function(global, list) {\n" + " 'use strict';\n" + " var objname;\n" + " for (objname in list) {\n" + " var globalobj = global[objname];\n" + " if (globalobj) {\n" + " list[objname].forEach(function(name) {\n" + " if (!globalobj[name]) {\n" + " Object.defineProperty(globalobj, name, {\n" + " writable: true,\n" + " enumerable: false,\n" + " value: (function(obj) {\n" + " if (arguments.length === 0) {\n" + " throw new TypeError('missing argument 0 when calling " + " function ' + objname + '.' + name);\n" + " }\n" + " return globalobj.prototype[name].apply(obj, " + " Array.prototype.slice.call(arguments, 1));\n" + " })\n" + " });\n" + " }\n" + " });\n" + " }\n" + " }\n" + "}(this, {String: ['substr', 'toUpperCase']}));"; + +} // namespace + +// Note, not in the anonymous namespace due to the friend call +// in cfxjse_context.h +// TODO(dsinclair): Remove the friending, use public methods. +class CFXJSE_ScopeUtil_IsolateHandleContext { + public: + explicit CFXJSE_ScopeUtil_IsolateHandleContext(CFXJSE_Context* pContext) + : m_context(pContext), + m_parent(pContext->m_pIsolate), + m_cscope(v8::Local::New(pContext->m_pIsolate, + pContext->m_hContext)) {} + v8::Isolate* GetIsolate() { return m_context->m_pIsolate; } + v8::Local GetLocalContext() { + return v8::Local::New(m_context->m_pIsolate, + m_context->m_hContext); + } + + private: + CFXJSE_ScopeUtil_IsolateHandleContext( + const CFXJSE_ScopeUtil_IsolateHandleContext&) = delete; + void operator=(const CFXJSE_ScopeUtil_IsolateHandleContext&) = delete; + void* operator new(size_t size) = delete; + void operator delete(void*, size_t) = delete; + + CFXJSE_Context* m_context; + CFXJSE_ScopeUtil_IsolateHandle m_parent; + v8::Context::Scope m_cscope; +}; + +v8::Local FXJSE_GetGlobalObjectFromContext( + const v8::Local& hContext) { + return hContext->Global()->GetPrototype().As(); +} + +void FXJSE_UpdateObjectBinding(v8::Local& hObject, + CFXJSE_HostObject* lpNewBinding) { + ASSERT(!hObject.IsEmpty()); + ASSERT(hObject->InternalFieldCount() > 0); + hObject->SetAlignedPointerInInternalField(0, + static_cast(lpNewBinding)); +} + +CFXJSE_HostObject* FXJSE_RetrieveObjectBinding( + const v8::Local& hJSObject, + CFXJSE_Class* lpClass) { + ASSERT(!hJSObject.IsEmpty()); + if (!hJSObject->IsObject()) + return nullptr; + + v8::Local hObject = hJSObject; + if (hObject->InternalFieldCount() == 0) { + v8::Local hProtoObject = hObject->GetPrototype(); + if (hProtoObject.IsEmpty() || !hProtoObject->IsObject()) + return nullptr; + + hObject = hProtoObject.As(); + if (hObject->InternalFieldCount() == 0) + return nullptr; + } + if (lpClass) { + v8::Local hClass = + v8::Local::New( + lpClass->GetContext()->GetRuntime(), lpClass->GetTemplate()); + if (!hClass->HasInstance(hObject)) + return nullptr; + } + return static_cast( + hObject->GetAlignedPointerFromInternalField(0)); +} + +v8::Local FXJSE_CreateReturnValue(v8::Isolate* pIsolate, + v8::TryCatch& trycatch) { + v8::Local hReturnValue = v8::Object::New(pIsolate); + if (trycatch.HasCaught()) { + v8::Local hException = trycatch.Exception(); + v8::Local hMessage = trycatch.Message(); + if (hException->IsObject()) { + v8::Local hValue; + hValue = hException.As()->Get( + v8::String::NewFromUtf8(pIsolate, "name")); + if (hValue->IsString() || hValue->IsStringObject()) + hReturnValue->Set(0, hValue); + else + hReturnValue->Set(0, v8::String::NewFromUtf8(pIsolate, "Error")); + + hValue = hException.As()->Get( + v8::String::NewFromUtf8(pIsolate, "message")); + if (hValue->IsString() || hValue->IsStringObject()) + hReturnValue->Set(1, hValue); + else + hReturnValue->Set(1, hMessage->Get()); + } else { + hReturnValue->Set(0, v8::String::NewFromUtf8(pIsolate, "Error")); + hReturnValue->Set(1, hMessage->Get()); + } + hReturnValue->Set(2, hException); + hReturnValue->Set(3, v8::Integer::New(pIsolate, hMessage->GetLineNumber())); + hReturnValue->Set(4, hMessage->GetSourceLine()); + v8::Maybe maybe_int = + hMessage->GetStartColumn(pIsolate->GetCurrentContext()); + hReturnValue->Set(5, v8::Integer::New(pIsolate, maybe_int.FromMaybe(0))); + maybe_int = hMessage->GetEndColumn(pIsolate->GetCurrentContext()); + hReturnValue->Set(6, v8::Integer::New(pIsolate, maybe_int.FromMaybe(0))); + } + return hReturnValue; +} + +// static +CFXJSE_Context* CFXJSE_Context::Create( + v8::Isolate* pIsolate, + const FXJSE_CLASS_DESCRIPTOR* lpGlobalClass, + CFXJSE_HostObject* lpGlobalObject) { + CFXJSE_ScopeUtil_IsolateHandle scope(pIsolate); + CFXJSE_Context* pContext = new CFXJSE_Context(pIsolate); + CFXJSE_Class* lpGlobalClassObj = nullptr; + v8::Local hObjectTemplate; + if (lpGlobalClass) { + lpGlobalClassObj = CFXJSE_Class::Create(pContext, lpGlobalClass, true); + ASSERT(lpGlobalClassObj); + v8::Local hFunctionTemplate = + v8::Local::New(pIsolate, + lpGlobalClassObj->m_hTemplate); + hObjectTemplate = hFunctionTemplate->InstanceTemplate(); + } else { + hObjectTemplate = v8::ObjectTemplate::New(pIsolate); + hObjectTemplate->SetInternalFieldCount(1); + } + hObjectTemplate->Set( + v8::Symbol::GetToStringTag(pIsolate), + v8::String::NewFromUtf8(pIsolate, "global", v8::NewStringType::kNormal) + .ToLocalChecked()); + v8::Local hNewContext = + v8::Context::New(pIsolate, nullptr, hObjectTemplate); + v8::Local hRootContext = v8::Local::New( + pIsolate, CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext); + hNewContext->SetSecurityToken(hRootContext->GetSecurityToken()); + v8::Local hGlobalObject = + FXJSE_GetGlobalObjectFromContext(hNewContext); + FXJSE_UpdateObjectBinding(hGlobalObject, lpGlobalObject); + pContext->m_hContext.Reset(pIsolate, hNewContext); + return pContext; +} + +CFXJSE_Context::CFXJSE_Context(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {} + +CFXJSE_Context::~CFXJSE_Context() {} + +std::unique_ptr CFXJSE_Context::GetGlobalObject() { + std::unique_ptr pValue(new CFXJSE_Value(m_pIsolate)); + + CFXJSE_ScopeUtil_IsolateHandleContext scope(this); + v8::Local hContext = + v8::Local::New(m_pIsolate, m_hContext); + v8::Local hGlobalObject = hContext->Global(); + pValue->ForceSetValue(hGlobalObject); + + return pValue; +} + +void CFXJSE_Context::EnableCompatibleMode() { + ExecuteScript(szCompatibleModeScript, nullptr, nullptr); +} + +bool CFXJSE_Context::ExecuteScript(const FX_CHAR* szScript, + CFXJSE_Value* lpRetValue, + CFXJSE_Value* lpNewThisObject) { + CFXJSE_ScopeUtil_IsolateHandleContext scope(this); + v8::TryCatch trycatch(m_pIsolate); + v8::Local hScriptString = + v8::String::NewFromUtf8(m_pIsolate, szScript); + if (!lpNewThisObject) { + v8::Local hScript = v8::Script::Compile(hScriptString); + if (!trycatch.HasCaught()) { + v8::Local hValue = hScript->Run(); + if (!trycatch.HasCaught()) { + if (lpRetValue) + lpRetValue->m_hValue.Reset(m_pIsolate, hValue); + return true; + } + } + if (lpRetValue) { + lpRetValue->m_hValue.Reset(m_pIsolate, + FXJSE_CreateReturnValue(m_pIsolate, trycatch)); + } + return false; + } + + v8::Local hNewThis = + v8::Local::New(m_pIsolate, lpNewThisObject->m_hValue); + ASSERT(!hNewThis.IsEmpty()); + v8::Local hWrapper = v8::Script::Compile(v8::String::NewFromUtf8( + m_pIsolate, "(function () { return eval(arguments[0]); })")); + v8::Local hWrapperValue = hWrapper->Run(); + ASSERT(hWrapperValue->IsFunction()); + v8::Local hWrapperFn = hWrapperValue.As(); + if (!trycatch.HasCaught()) { + v8::Local rgArgs[] = {hScriptString}; + v8::Local hValue = + hWrapperFn->Call(hNewThis.As(), 1, rgArgs); + if (!trycatch.HasCaught()) { + if (lpRetValue) + lpRetValue->m_hValue.Reset(m_pIsolate, hValue); + return true; + } + } + if (lpRetValue) { + lpRetValue->m_hValue.Reset(m_pIsolate, + FXJSE_CreateReturnValue(m_pIsolate, trycatch)); + } + return false; +} diff --git a/modules/pdfium/pdfium/fxjs/cfxjse_context.h b/modules/pdfium/pdfium/fxjs/cfxjse_context.h new file mode 100644 index 000000000000..a6945147704f --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/cfxjse_context.h @@ -0,0 +1,65 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_CFXJSE_CONTEXT_H_ +#define FXJS_CFXJSE_CONTEXT_H_ + +#include +#include + +#include "core/fxcrt/fx_basic.h" +#include "fxjs/fxjse.h" +#include "v8/include/v8.h" + +class CFXJSE_Class; +class CFXJSE_Value; +struct FXJSE_CLASS_DESCRIPTOR; + +class CFXJSE_Context { + public: + static CFXJSE_Context* Create( + v8::Isolate* pIsolate, + const FXJSE_CLASS_DESCRIPTOR* lpGlobalClass = nullptr, + CFXJSE_HostObject* lpGlobalObject = nullptr); + + ~CFXJSE_Context(); + + v8::Isolate* GetRuntime() { return m_pIsolate; } + std::unique_ptr GetGlobalObject(); + void EnableCompatibleMode(); + bool ExecuteScript(const FX_CHAR* szScript, + CFXJSE_Value* lpRetValue, + CFXJSE_Value* lpNewThisObject = nullptr); + + protected: + friend class CFXJSE_Class; + friend class CFXJSE_ScopeUtil_IsolateHandleContext; + + CFXJSE_Context(); + CFXJSE_Context(const CFXJSE_Context&); + explicit CFXJSE_Context(v8::Isolate* pIsolate); + + CFXJSE_Context& operator=(const CFXJSE_Context&); + + v8::Global m_hContext; + v8::Isolate* m_pIsolate; + std::vector> m_rgClasses; +}; + +v8::Local FXJSE_CreateReturnValue(v8::Isolate* pIsolate, + v8::TryCatch& trycatch); + +v8::Local FXJSE_GetGlobalObjectFromContext( + const v8::Local& hContext); + +void FXJSE_UpdateObjectBinding(v8::Local& hObject, + CFXJSE_HostObject* lpNewBinding = nullptr); + +CFXJSE_HostObject* FXJSE_RetrieveObjectBinding( + const v8::Local& hJSObject, + CFXJSE_Class* lpClass = nullptr); + +#endif // FXJS_CFXJSE_CONTEXT_H_ diff --git a/modules/pdfium/pdfium/fxjs/cfxjse_isolatetracker.cpp b/modules/pdfium/pdfium/fxjs/cfxjse_isolatetracker.cpp new file mode 100644 index 000000000000..0dd415871406 --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/cfxjse_isolatetracker.cpp @@ -0,0 +1,42 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/cfxjse_isolatetracker.h" + +#include +#include + +CFXJSE_IsolateTracker::CFXJSE_IsolateTracker() {} + +CFXJSE_IsolateTracker::~CFXJSE_IsolateTracker() {} + +void CFXJSE_IsolateTracker::Append( + v8::Isolate* pIsolate, + std::unique_ptr alloc) { + m_OwnedIsolates.push_back(pIsolate); + m_AllocatorMap[pIsolate] = std::move(alloc); +} + +void CFXJSE_IsolateTracker::Remove( + v8::Isolate* pIsolate, + CFXJSE_IsolateTracker::DisposeCallback lpfnDisposeCallback) { + auto it = std::find(m_OwnedIsolates.begin(), m_OwnedIsolates.end(), pIsolate); + bool bFound = it != m_OwnedIsolates.end(); + if (bFound) + m_OwnedIsolates.erase(it); + lpfnDisposeCallback(pIsolate, bFound); + + m_AllocatorMap.erase(pIsolate); +} + +void CFXJSE_IsolateTracker::RemoveAll( + CFXJSE_IsolateTracker::DisposeCallback lpfnDisposeCallback) { + for (v8::Isolate* pIsolate : m_OwnedIsolates) + lpfnDisposeCallback(pIsolate, true); + + m_OwnedIsolates.clear(); + m_AllocatorMap.clear(); +} diff --git a/modules/pdfium/pdfium/fxjs/cfxjse_isolatetracker.h b/modules/pdfium/pdfium/fxjs/cfxjse_isolatetracker.h new file mode 100644 index 000000000000..5340d9b5c0a6 --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/cfxjse_isolatetracker.h @@ -0,0 +1,75 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_CFXJSE_ISOLATETRACKER_H_ +#define FXJS_CFXJSE_ISOLATETRACKER_H_ + +#include +#include +#include + +#include "v8/include/v8.h" + +#include "fxjs/cfxjse_runtimedata.h" + +class CFXJSE_ScopeUtil_IsolateHandle { + public: + explicit CFXJSE_ScopeUtil_IsolateHandle(v8::Isolate* pIsolate) + : m_isolate(pIsolate), m_iscope(pIsolate), m_hscope(pIsolate) {} + v8::Isolate* GetIsolate() { return m_isolate; } + + private: + CFXJSE_ScopeUtil_IsolateHandle(const CFXJSE_ScopeUtil_IsolateHandle&) = + delete; + void operator=(const CFXJSE_ScopeUtil_IsolateHandle&) = delete; + void* operator new(size_t size) = delete; + void operator delete(void*, size_t) = delete; + + v8::Isolate* m_isolate; + v8::Isolate::Scope m_iscope; + v8::HandleScope m_hscope; +}; + +class CFXJSE_ScopeUtil_IsolateHandleRootContext { + public: + explicit CFXJSE_ScopeUtil_IsolateHandleRootContext(v8::Isolate* pIsolate) + : m_parent(pIsolate), + m_cscope(v8::Local::New( + pIsolate, + CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext)) {} + + private: + CFXJSE_ScopeUtil_IsolateHandleRootContext( + const CFXJSE_ScopeUtil_IsolateHandleRootContext&) = delete; + void operator=(const CFXJSE_ScopeUtil_IsolateHandleRootContext&) = delete; + void* operator new(size_t size) = delete; + void operator delete(void*, size_t) = delete; + + CFXJSE_ScopeUtil_IsolateHandle m_parent; + v8::Context::Scope m_cscope; +}; + +class CFXJSE_IsolateTracker { + public: + typedef void (*DisposeCallback)(v8::Isolate*, bool bOwnedIsolate); + + CFXJSE_IsolateTracker(); + ~CFXJSE_IsolateTracker(); + + void Append(v8::Isolate* pIsolate, + std::unique_ptr alloc); + void Remove(v8::Isolate* pIsolate, DisposeCallback lpfnDisposeCallback); + void RemoveAll(DisposeCallback lpfnDisposeCallback); + + static CFXJSE_IsolateTracker* g_pInstance; + + protected: + std::vector m_OwnedIsolates; + std::map> + m_AllocatorMap; +}; + +#endif // FXJS_CFXJSE_ISOLATETRACKER_H_ diff --git a/modules/pdfium/pdfium/fxjs/cfxjse_runtimedata.cpp b/modules/pdfium/pdfium/fxjs/cfxjse_runtimedata.cpp new file mode 100644 index 000000000000..b8df9ce0b315 --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/cfxjse_runtimedata.cpp @@ -0,0 +1,109 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/cfxjse_runtimedata.h" + +#include + +#include "fxjs/cfxjse_isolatetracker.h" +#include "fxjs/fxjs_v8.h" + +namespace { + +// Duplicates fpdfsdk's cjs_runtime.h, but keeps XFA from depending on it. +// TODO(tsepez): make a single version of this. +class FXJSE_ArrayBufferAllocator : public v8::ArrayBuffer::Allocator { + void* Allocate(size_t length) override { return calloc(1, length); } + void* AllocateUninitialized(size_t length) override { return malloc(length); } + void Free(void* data, size_t length) override { free(data); } +}; + +void Runtime_DisposeCallback(v8::Isolate* pIsolate, bool bOwned) { + if (FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate)) + delete pData; + if (bOwned) + pIsolate->Dispose(); +} + +void KillV8() { + v8::V8::Dispose(); +} + +} // namespace + +void FXJSE_Initialize() { + if (!CFXJSE_IsolateTracker::g_pInstance) + CFXJSE_IsolateTracker::g_pInstance = new CFXJSE_IsolateTracker; + + static bool bV8Initialized = false; + if (bV8Initialized) + return; + + bV8Initialized = true; + atexit(KillV8); +} + +void FXJSE_Finalize() { + if (!CFXJSE_IsolateTracker::g_pInstance) + return; + + CFXJSE_IsolateTracker::g_pInstance->RemoveAll(Runtime_DisposeCallback); + delete CFXJSE_IsolateTracker::g_pInstance; + CFXJSE_IsolateTracker::g_pInstance = nullptr; +} + +v8::Isolate* FXJSE_Runtime_Create_Own() { + std::unique_ptr allocator( + new FXJSE_ArrayBufferAllocator()); + v8::Isolate::CreateParams params; + params.array_buffer_allocator = allocator.get(); + v8::Isolate* pIsolate = v8::Isolate::New(params); + ASSERT(pIsolate && CFXJSE_IsolateTracker::g_pInstance); + CFXJSE_IsolateTracker::g_pInstance->Append(pIsolate, std::move(allocator)); + return pIsolate; +} + +void FXJSE_Runtime_Release(v8::Isolate* pIsolate) { + if (!pIsolate) + return; + CFXJSE_IsolateTracker::g_pInstance->Remove(pIsolate, Runtime_DisposeCallback); +} + +CFXJSE_RuntimeData::CFXJSE_RuntimeData(v8::Isolate* pIsolate) + : m_pIsolate(pIsolate) {} + +CFXJSE_RuntimeData::~CFXJSE_RuntimeData() {} + +std::unique_ptr CFXJSE_RuntimeData::Create( + v8::Isolate* pIsolate) { + std::unique_ptr pRuntimeData( + new CFXJSE_RuntimeData(pIsolate)); + CFXJSE_ScopeUtil_IsolateHandle scope(pIsolate); + v8::Local hFuncTemplate = + v8::FunctionTemplate::New(pIsolate); + v8::Local hGlobalTemplate = + hFuncTemplate->InstanceTemplate(); + hGlobalTemplate->Set( + v8::Symbol::GetToStringTag(pIsolate), + v8::String::NewFromUtf8(pIsolate, "global", v8::NewStringType::kNormal) + .ToLocalChecked()); + v8::Local hContext = + v8::Context::New(pIsolate, 0, hGlobalTemplate); + hContext->SetSecurityToken(v8::External::New(pIsolate, pIsolate)); + pRuntimeData->m_hRootContextGlobalTemplate.Reset(pIsolate, hFuncTemplate); + pRuntimeData->m_hRootContext.Reset(pIsolate, hContext); + return pRuntimeData; +} + +CFXJSE_RuntimeData* CFXJSE_RuntimeData::Get(v8::Isolate* pIsolate) { + FXJS_PerIsolateData::SetUp(pIsolate); + FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); + if (!pData->m_pFXJSERuntimeData) + pData->m_pFXJSERuntimeData = CFXJSE_RuntimeData::Create(pIsolate); + return pData->m_pFXJSERuntimeData.get(); +} + +CFXJSE_IsolateTracker* CFXJSE_IsolateTracker::g_pInstance = nullptr; diff --git a/modules/pdfium/pdfium/fxjs/cfxjse_runtimedata.h b/modules/pdfium/pdfium/fxjs/cfxjse_runtimedata.h new file mode 100644 index 000000000000..292fe26ae335 --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/cfxjse_runtimedata.h @@ -0,0 +1,36 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_CFXJSE_RUNTIMEDATA_H_ +#define FXJS_CFXJSE_RUNTIMEDATA_H_ + +#include + +#include "v8/include/v8.h" + +class CFXJSE_RuntimeList; + +class CFXJSE_RuntimeData { + public: + ~CFXJSE_RuntimeData(); + + static CFXJSE_RuntimeData* Get(v8::Isolate* pIsolate); + + v8::Isolate* m_pIsolate; + v8::Global m_hRootContextGlobalTemplate; + v8::Global m_hRootContext; + + protected: + explicit CFXJSE_RuntimeData(v8::Isolate* pIsolate); + + static std::unique_ptr Create(v8::Isolate* pIsolate); + + private: + CFXJSE_RuntimeData(const CFXJSE_RuntimeData&) = delete; + CFXJSE_RuntimeData& operator=(const CFXJSE_RuntimeData&) = delete; +}; + +#endif // FXJS_CFXJSE_RUNTIMEDATA_H_ diff --git a/modules/pdfium/pdfium/fxjs/cfxjse_value.cpp b/modules/pdfium/pdfium/fxjs/cfxjse_value.cpp new file mode 100644 index 000000000000..68c82e5deb3b --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/cfxjse_value.cpp @@ -0,0 +1,517 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/cfxjse_value.h" + +#include + +#include "fxjs/cfxjse_class.h" +#include "fxjs/cfxjse_context.h" + +namespace { + +double ftod(FX_FLOAT fNumber) { + static_assert(sizeof(FX_FLOAT) == 4, "FX_FLOAT of incorrect size"); + + uint32_t nFloatBits = (uint32_t&)fNumber; + uint8_t nExponent = (uint8_t)(nFloatBits >> 23); + if (nExponent == 0 || nExponent == 255) + return fNumber; + + int8_t nErrExp = nExponent - 150; + if (nErrExp >= 0) + return fNumber; + + double dwError = pow(2.0, nErrExp), dwErrorHalf = dwError / 2; + double dNumber = fNumber, dNumberAbs = fabs(fNumber); + double dNumberAbsMin = dNumberAbs - dwErrorHalf, + dNumberAbsMax = dNumberAbs + dwErrorHalf; + int32_t iErrPos = 0; + if (floor(dNumberAbsMin) == floor(dNumberAbsMax)) { + dNumberAbsMin = fmod(dNumberAbsMin, 1.0); + dNumberAbsMax = fmod(dNumberAbsMax, 1.0); + int32_t iErrPosMin = 1, iErrPosMax = 38; + do { + int32_t iMid = (iErrPosMin + iErrPosMax) / 2; + double dPow = pow(10.0, iMid); + if (floor(dNumberAbsMin * dPow) == floor(dNumberAbsMax * dPow)) { + iErrPosMin = iMid + 1; + } else { + iErrPosMax = iMid; + } + } while (iErrPosMin < iErrPosMax); + iErrPos = iErrPosMax; + } + double dPow = pow(10.0, iErrPos); + return fNumber < 0 ? ceil(dNumber * dPow - 0.5) / dPow + : floor(dNumber * dPow + 0.5) / dPow; +} + +} // namespace + +void FXJSE_ThrowMessage(const CFX_ByteStringC& utf8Message) { + v8::Isolate* pIsolate = v8::Isolate::GetCurrent(); + ASSERT(pIsolate); + + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate); + v8::Local hMessage = v8::String::NewFromUtf8( + pIsolate, utf8Message.c_str(), v8::String::kNormalString, + utf8Message.GetLength()); + v8::Local hError = v8::Exception::Error(hMessage); + pIsolate->ThrowException(hError); +} + +CFXJSE_Value::CFXJSE_Value(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {} + +CFXJSE_Value::~CFXJSE_Value() {} + +CFXJSE_HostObject* CFXJSE_Value::ToHostObject(CFXJSE_Class* lpClass) const { + ASSERT(!m_hValue.IsEmpty()); + + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local pValue = v8::Local::New(m_pIsolate, m_hValue); + ASSERT(!pValue.IsEmpty()); + + if (!pValue->IsObject()) + return nullptr; + + return FXJSE_RetrieveObjectBinding(pValue.As(), lpClass); +} + +void CFXJSE_Value::SetObject(CFXJSE_HostObject* lpObject, + CFXJSE_Class* pClass) { + if (!pClass) { + ASSERT(!lpObject); + SetJSObject(); + return; + } + SetHostObject(lpObject, pClass); +} + +void CFXJSE_Value::SetHostObject(CFXJSE_HostObject* lpObject, + CFXJSE_Class* lpClass) { + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + ASSERT(lpClass); + v8::Local hClass = + v8::Local::New(m_pIsolate, lpClass->m_hTemplate); + v8::Local hObject = hClass->InstanceTemplate()->NewInstance(); + FXJSE_UpdateObjectBinding(hObject, lpObject); + m_hValue.Reset(m_pIsolate, hObject); +} + +void CFXJSE_Value::SetArray( + const std::vector>& values) { + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hArrayObject = v8::Array::New(m_pIsolate, values.size()); + uint32_t count = 0; + for (auto& v : values) { + hArrayObject->Set(count++, v8::Local::New( + m_pIsolate, v.get()->DirectGetValue())); + } + m_hValue.Reset(m_pIsolate, hArrayObject); +} + +void CFXJSE_Value::SetDate(double dDouble) { + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hDate = v8::Date::New(m_pIsolate, dDouble); + m_hValue.Reset(m_pIsolate, hDate); +} + +void CFXJSE_Value::SetFloat(FX_FLOAT fFloat) { + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local pValue = v8::Number::New(m_pIsolate, ftod(fFloat)); + m_hValue.Reset(m_pIsolate, pValue); +} + +bool CFXJSE_Value::SetObjectProperty(const CFX_ByteStringC& szPropName, + CFXJSE_Value* lpPropValue) { + ASSERT(lpPropValue); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = + v8::Local::New(m_pIsolate, m_hValue); + if (!hObject->IsObject()) + return false; + + v8::Local hPropValue = + v8::Local::New(m_pIsolate, lpPropValue->DirectGetValue()); + return (bool)hObject.As()->Set( + v8::String::NewFromUtf8(m_pIsolate, szPropName.c_str(), + v8::String::kNormalString, + szPropName.GetLength()), + hPropValue); +} + +bool CFXJSE_Value::GetObjectProperty(const CFX_ByteStringC& szPropName, + CFXJSE_Value* lpPropValue) { + ASSERT(lpPropValue); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = + v8::Local::New(m_pIsolate, m_hValue); + if (!hObject->IsObject()) + return false; + + v8::Local hPropValue = + hObject.As()->Get(v8::String::NewFromUtf8( + m_pIsolate, szPropName.c_str(), v8::String::kNormalString, + szPropName.GetLength())); + lpPropValue->ForceSetValue(hPropValue); + return true; +} + +bool CFXJSE_Value::SetObjectProperty(uint32_t uPropIdx, + CFXJSE_Value* lpPropValue) { + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = + v8::Local::New(m_pIsolate, m_hValue); + if (!hObject->IsObject()) + return false; + + v8::Local hPropValue = + v8::Local::New(m_pIsolate, lpPropValue->DirectGetValue()); + return (bool)hObject.As()->Set(uPropIdx, hPropValue); +} + +bool CFXJSE_Value::GetObjectPropertyByIdx(uint32_t uPropIdx, + CFXJSE_Value* lpPropValue) { + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = + v8::Local::New(m_pIsolate, m_hValue); + if (!hObject->IsObject()) + return false; + + v8::Local hPropValue = hObject.As()->Get(uPropIdx); + lpPropValue->ForceSetValue(hPropValue); + return true; +} + +bool CFXJSE_Value::DeleteObjectProperty(const CFX_ByteStringC& szPropName) { + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = + v8::Local::New(m_pIsolate, m_hValue); + if (!hObject->IsObject()) + return false; + + hObject.As()->Delete(v8::String::NewFromUtf8( + m_pIsolate, szPropName.c_str(), v8::String::kNormalString, + szPropName.GetLength())); + return true; +} + +bool CFXJSE_Value::HasObjectOwnProperty(const CFX_ByteStringC& szPropName, + bool bUseTypeGetter) { + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = + v8::Local::New(m_pIsolate, m_hValue); + if (!hObject->IsObject()) + return false; + + v8::Local hKey = v8::String::NewFromUtf8( + m_pIsolate, szPropName.c_str(), v8::String::kNormalString, + szPropName.GetLength()); + return hObject.As()->HasRealNamedProperty(hKey) || + (bUseTypeGetter && + hObject.As() + ->HasOwnProperty(m_pIsolate->GetCurrentContext(), hKey) + .FromMaybe(false)); +} + +bool CFXJSE_Value::SetObjectOwnProperty(const CFX_ByteStringC& szPropName, + CFXJSE_Value* lpPropValue) { + ASSERT(lpPropValue); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hObject = + v8::Local::New(m_pIsolate, m_hValue); + if (!hObject->IsObject()) + return false; + + v8::Local pValue = + v8::Local::New(m_pIsolate, lpPropValue->m_hValue); + return hObject.As() + ->DefineOwnProperty( + m_pIsolate->GetCurrentContext(), + v8::String::NewFromUtf8(m_pIsolate, szPropName.c_str(), + v8::String::kNormalString, + szPropName.GetLength()), + pValue) + .FromMaybe(false); +} + +bool CFXJSE_Value::SetFunctionBind(CFXJSE_Value* lpOldFunction, + CFXJSE_Value* lpNewThis) { + ASSERT(lpOldFunction && lpNewThis); + + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local rgArgs[2]; + v8::Local hOldFunction = + v8::Local::New(m_pIsolate, lpOldFunction->DirectGetValue()); + if (hOldFunction.IsEmpty() || !hOldFunction->IsFunction()) + return false; + + rgArgs[0] = hOldFunction; + v8::Local hNewThis = + v8::Local::New(m_pIsolate, lpNewThis->DirectGetValue()); + if (hNewThis.IsEmpty()) + return false; + + rgArgs[1] = hNewThis; + v8::Local hBinderFuncSource = + v8::String::NewFromUtf8(m_pIsolate, + "(function (oldfunction, newthis) { return " + "oldfunction.bind(newthis); })"); + v8::Local hBinderFunc = + v8::Script::Compile(hBinderFuncSource)->Run().As(); + v8::Local hBoundFunction = + hBinderFunc->Call(m_pIsolate->GetCurrentContext()->Global(), 2, rgArgs); + if (hBoundFunction.IsEmpty() || !hBoundFunction->IsFunction()) + return false; + + m_hValue.Reset(m_pIsolate, hBoundFunction); + return true; +} + +#define FXJSE_INVALID_PTR ((void*)(intptr_t)-1) +bool CFXJSE_Value::Call(CFXJSE_Value* lpReceiver, + CFXJSE_Value* lpRetValue, + uint32_t nArgCount, + CFXJSE_Value** lpArgs) { + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hFunctionValue = + v8::Local::New(m_pIsolate, DirectGetValue()); + v8::Local hFunctionObject = + !hFunctionValue.IsEmpty() && hFunctionValue->IsObject() + ? hFunctionValue.As() + : v8::Local(); + + v8::TryCatch trycatch(m_pIsolate); + if (hFunctionObject.IsEmpty() || !hFunctionObject->IsCallable()) { + if (lpRetValue) + lpRetValue->ForceSetValue(FXJSE_CreateReturnValue(m_pIsolate, trycatch)); + return false; + } + + v8::Local hReturnValue; + v8::Local* lpLocalArgs = NULL; + if (nArgCount) { + lpLocalArgs = FX_Alloc(v8::Local, nArgCount); + for (uint32_t i = 0; i < nArgCount; i++) { + new (lpLocalArgs + i) v8::Local; + CFXJSE_Value* lpArg = lpArgs[i]; + if (lpArg) { + lpLocalArgs[i] = + v8::Local::New(m_pIsolate, lpArg->DirectGetValue()); + } + if (lpLocalArgs[i].IsEmpty()) { + lpLocalArgs[i] = v8::Undefined(m_pIsolate); + } + } + } + + bool bRetValue = true; + if (lpReceiver == FXJSE_INVALID_PTR) { + v8::MaybeLocal maybe_retvalue = + hFunctionObject->CallAsConstructor(m_pIsolate->GetCurrentContext(), + nArgCount, lpLocalArgs); + hReturnValue = maybe_retvalue.FromMaybe(v8::Local()); + } else { + v8::Local hReceiver; + if (lpReceiver) { + hReceiver = + v8::Local::New(m_pIsolate, lpReceiver->DirectGetValue()); + } + if (hReceiver.IsEmpty() || !hReceiver->IsObject()) + hReceiver = v8::Object::New(m_pIsolate); + + v8::MaybeLocal maybe_retvalue = hFunctionObject->CallAsFunction( + m_pIsolate->GetCurrentContext(), hReceiver, nArgCount, lpLocalArgs); + hReturnValue = maybe_retvalue.FromMaybe(v8::Local()); + } + + if (trycatch.HasCaught()) { + hReturnValue = FXJSE_CreateReturnValue(m_pIsolate, trycatch); + bRetValue = false; + } + + if (lpRetValue) + lpRetValue->ForceSetValue(hReturnValue); + + if (lpLocalArgs) { + for (uint32_t i = 0; i < nArgCount; i++) + lpLocalArgs[i].~Local(); + FX_Free(lpLocalArgs); + } + return bRetValue; +} + +bool CFXJSE_Value::IsUndefined() const { + if (m_hValue.IsEmpty()) + return false; + + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsUndefined(); +} + +bool CFXJSE_Value::IsNull() const { + if (m_hValue.IsEmpty()) + return false; + + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsNull(); +} + +bool CFXJSE_Value::IsBoolean() const { + if (m_hValue.IsEmpty()) + return false; + + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsBoolean(); +} + +bool CFXJSE_Value::IsString() const { + if (m_hValue.IsEmpty()) + return false; + + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsString(); +} + +bool CFXJSE_Value::IsNumber() const { + if (m_hValue.IsEmpty()) + return false; + + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsNumber(); +} + +bool CFXJSE_Value::IsInteger() const { + if (m_hValue.IsEmpty()) + return false; + + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsInt32(); +} + +bool CFXJSE_Value::IsObject() const { + if (m_hValue.IsEmpty()) + return false; + + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsObject(); +} + +bool CFXJSE_Value::IsArray() const { + if (m_hValue.IsEmpty()) + return false; + + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsArray(); +} + +bool CFXJSE_Value::IsFunction() const { + if (m_hValue.IsEmpty()) + return false; + + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsFunction(); +} + +bool CFXJSE_Value::IsDate() const { + if (m_hValue.IsEmpty()) + return false; + + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return hValue->IsDate(); +} + +bool CFXJSE_Value::ToBoolean() const { + ASSERT(!m_hValue.IsEmpty()); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return static_cast(hValue->BooleanValue()); +} + +FX_FLOAT CFXJSE_Value::ToFloat() const { + ASSERT(!m_hValue.IsEmpty()); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return static_cast(hValue->NumberValue()); +} + +double CFXJSE_Value::ToDouble() const { + ASSERT(!m_hValue.IsEmpty()); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return static_cast(hValue->NumberValue()); +} + +int32_t CFXJSE_Value::ToInteger() const { + ASSERT(!m_hValue.IsEmpty()); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + return static_cast(hValue->NumberValue()); +} + +CFX_ByteString CFXJSE_Value::ToString() const { + ASSERT(!m_hValue.IsEmpty()); + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hValue = v8::Local::New(m_pIsolate, m_hValue); + v8::Local hString = hValue->ToString(); + v8::String::Utf8Value hStringVal(hString); + return CFX_ByteString(*hStringVal); +} + +void CFXJSE_Value::SetUndefined() { + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Undefined(m_pIsolate); + m_hValue.Reset(m_pIsolate, hValue); +} + +void CFXJSE_Value::SetNull() { + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Null(m_pIsolate); + m_hValue.Reset(m_pIsolate, hValue); +} + +void CFXJSE_Value::SetBoolean(bool bBoolean) { + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Boolean::New(m_pIsolate, bBoolean != false); + m_hValue.Reset(m_pIsolate, hValue); +} + +void CFXJSE_Value::SetInteger(int32_t nInteger) { + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Integer::New(m_pIsolate, nInteger); + m_hValue.Reset(m_pIsolate, hValue); +} + +void CFXJSE_Value::SetDouble(double dDouble) { + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::Number::New(m_pIsolate, dDouble); + m_hValue.Reset(m_pIsolate, hValue); +} + +void CFXJSE_Value::SetString(const CFX_ByteStringC& szString) { + CFXJSE_ScopeUtil_IsolateHandle scope(m_pIsolate); + v8::Local hValue = v8::String::NewFromUtf8( + m_pIsolate, reinterpret_cast(szString.raw_str()), + v8::String::kNormalString, szString.GetLength()); + m_hValue.Reset(m_pIsolate, hValue); +} + +void CFXJSE_Value::SetJSObject() { + CFXJSE_ScopeUtil_IsolateHandleRootContext scope(m_pIsolate); + v8::Local hValue = v8::Object::New(m_pIsolate); + m_hValue.Reset(m_pIsolate, hValue); +} diff --git a/modules/pdfium/pdfium/fxjs/cfxjse_value.h b/modules/pdfium/pdfium/fxjs/cfxjse_value.h new file mode 100644 index 000000000000..f2ebdc1c2562 --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/cfxjse_value.h @@ -0,0 +1,104 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_CFXJSE_VALUE_H_ +#define FXJS_CFXJSE_VALUE_H_ + +#include +#include + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" +#include "fxjs/cfxjse_isolatetracker.h" +#include "fxjs/cfxjse_runtimedata.h" +#include "v8/include/v8.h" + +class CFXJSE_Class; +class CFXJSE_HostObject; + +class CFXJSE_Value { + public: + explicit CFXJSE_Value(v8::Isolate* pIsolate); + ~CFXJSE_Value(); + + bool IsUndefined() const; + bool IsNull() const; + bool IsBoolean() const; + bool IsString() const; + bool IsNumber() const; + bool IsInteger() const; + bool IsObject() const; + bool IsArray() const; + bool IsFunction() const; + bool IsDate() const; + bool ToBoolean() const; + FX_FLOAT ToFloat() const; + double ToDouble() const; + int32_t ToInteger() const; + CFX_ByteString ToString() const; + CFX_WideString ToWideString() const { + return CFX_WideString::FromUTF8(ToString().AsStringC()); + } + CFXJSE_HostObject* ToHostObject(CFXJSE_Class* lpClass) const; + + void SetUndefined(); + void SetNull(); + void SetBoolean(bool bBoolean); + void SetInteger(int32_t nInteger); + void SetDouble(double dDouble); + void SetString(const CFX_ByteStringC& szString); + void SetFloat(FX_FLOAT fFloat); + void SetJSObject(); + + void SetObject(CFXJSE_HostObject* lpObject, CFXJSE_Class* pClass); + void SetHostObject(CFXJSE_HostObject* lpObject, CFXJSE_Class* lpClass); + void SetArray(const std::vector>& values); + void SetDate(double dDouble); + + bool GetObjectProperty(const CFX_ByteStringC& szPropName, + CFXJSE_Value* lpPropValue); + bool SetObjectProperty(const CFX_ByteStringC& szPropName, + CFXJSE_Value* lpPropValue); + bool GetObjectPropertyByIdx(uint32_t uPropIdx, CFXJSE_Value* lpPropValue); + bool SetObjectProperty(uint32_t uPropIdx, CFXJSE_Value* lpPropValue); + bool DeleteObjectProperty(const CFX_ByteStringC& szPropName); + bool HasObjectOwnProperty(const CFX_ByteStringC& szPropName, + bool bUseTypeGetter); + bool SetObjectOwnProperty(const CFX_ByteStringC& szPropName, + CFXJSE_Value* lpPropValue); + bool SetFunctionBind(CFXJSE_Value* lpOldFunction, CFXJSE_Value* lpNewThis); + bool Call(CFXJSE_Value* lpReceiver, + CFXJSE_Value* lpRetValue, + uint32_t nArgCount, + CFXJSE_Value** lpArgs); + + v8::Isolate* GetIsolate() const { return m_pIsolate; } + const v8::Global& DirectGetValue() const { return m_hValue; } + void ForceSetValue(v8::Local hValue) { + m_hValue.Reset(m_pIsolate, hValue); + } + void Assign(const CFXJSE_Value* lpValue) { + ASSERT(lpValue); + if (lpValue) { + m_hValue.Reset(m_pIsolate, lpValue->m_hValue); + } else { + m_hValue.Reset(); + } + } + + private: + friend class CFXJSE_Class; + friend class CFXJSE_Context; + + CFXJSE_Value(); + CFXJSE_Value(const CFXJSE_Value&); + CFXJSE_Value& operator=(const CFXJSE_Value&); + + v8::Isolate* m_pIsolate; + v8::Global m_hValue; +}; + +#endif // FXJS_CFXJSE_VALUE_H_ diff --git a/modules/pdfium/pdfium/fxjs/fxjs_v8.cpp b/modules/pdfium/pdfium/fxjs/fxjs_v8.cpp new file mode 100644 index 000000000000..b0e1a1b260bc --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/fxjs_v8.cpp @@ -0,0 +1,739 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fxjs/fxjs_v8.h" + +#include + +#include "core/fxcrt/fx_basic.h" + +// Keep this consistent with the values defined in gin/public/context_holder.h +// (without actually requiring a dependency on gin itself for the standalone +// embedders of PDFIum). The value we want to use is: +// kPerContextDataStartIndex + kEmbedderPDFium, which is 3. +static const unsigned int kPerContextDataIndex = 3u; +static unsigned int g_embedderDataSlot = 1u; +static v8::Isolate* g_isolate = nullptr; +static size_t g_isolate_ref_count = 0; +static FXJS_ArrayBufferAllocator* g_arrayBufferAllocator = nullptr; +static v8::Global* g_DefaultGlobalObjectTemplate = nullptr; +static wchar_t kPerObjectDataTag[] = L"CFXJS_PerObjectData"; + +class CFXJS_PerObjectData { + public: + explicit CFXJS_PerObjectData(int nObjDefID) + : m_ObjDefID(nObjDefID), m_pPrivate(nullptr) {} + + static void SetInObject(CFXJS_PerObjectData* pData, + v8::Local pObj) { + if (pObj->InternalFieldCount() == 2) { + pObj->SetAlignedPointerInInternalField(0, pData); + pObj->SetAlignedPointerInInternalField( + 1, static_cast(kPerObjectDataTag)); + } + } + + static CFXJS_PerObjectData* GetFromObject(v8::Local pObj) { + if (pObj.IsEmpty() || pObj->InternalFieldCount() != 2 || + pObj->GetAlignedPointerFromInternalField(1) != + static_cast(kPerObjectDataTag)) { + return nullptr; + } + return static_cast( + pObj->GetAlignedPointerFromInternalField(0)); + } + + const int m_ObjDefID; + void* m_pPrivate; +}; + +class CFXJS_ObjDefinition { + public: + static int MaxID(v8::Isolate* pIsolate) { + return FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray.size(); + } + + static CFXJS_ObjDefinition* ForID(v8::Isolate* pIsolate, int id) { + // Note: GetAt() halts if out-of-range even in release builds. + return FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray[id].get(); + } + + CFXJS_ObjDefinition(v8::Isolate* isolate, + const char* sObjName, + FXJSOBJTYPE eObjType, + CFXJS_Engine::Constructor pConstructor, + CFXJS_Engine::Destructor pDestructor) + : m_ObjName(sObjName), + m_ObjType(eObjType), + m_pConstructor(pConstructor), + m_pDestructor(pDestructor), + m_pIsolate(isolate) { + v8::Isolate::Scope isolate_scope(isolate); + v8::HandleScope handle_scope(isolate); + + v8::Local fun = v8::FunctionTemplate::New(isolate); + fun->InstanceTemplate()->SetInternalFieldCount(2); + fun->SetCallHandler([](const v8::FunctionCallbackInfo& info) { + v8::Local holder = info.Holder(); + ASSERT(holder->InternalFieldCount() == 2); + holder->SetAlignedPointerInInternalField(0, nullptr); + holder->SetAlignedPointerInInternalField(1, nullptr); + }); + if (eObjType == FXJSOBJTYPE_GLOBAL) { + fun->InstanceTemplate()->Set( + v8::Symbol::GetToStringTag(isolate), + v8::String::NewFromUtf8(isolate, "global", v8::NewStringType::kNormal) + .ToLocalChecked()); + } + m_FunctionTemplate.Reset(isolate, fun); + + v8::Local sig = v8::Signature::New(isolate, fun); + m_Signature.Reset(isolate, sig); + } + + int AssignID() { + FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(m_pIsolate); + pData->m_ObjectDefnArray.emplace_back(this); + return pData->m_ObjectDefnArray.size() - 1; + } + + v8::Local GetInstanceTemplate() { + v8::EscapableHandleScope scope(m_pIsolate); + v8::Local function = + m_FunctionTemplate.Get(m_pIsolate); + return scope.Escape(function->InstanceTemplate()); + } + + v8::Local GetSignature() { + v8::EscapableHandleScope scope(m_pIsolate); + return scope.Escape(m_Signature.Get(m_pIsolate)); + } + + const char* const m_ObjName; + const FXJSOBJTYPE m_ObjType; + const CFXJS_Engine::Constructor m_pConstructor; + const CFXJS_Engine::Destructor m_pDestructor; + + v8::Isolate* m_pIsolate; + v8::Global m_FunctionTemplate; + v8::Global m_Signature; +}; + +static v8::Local GetGlobalObjectTemplate( + v8::Isolate* pIsolate) { + int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); + for (int i = 0; i < maxID; ++i) { + CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i); + if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) + return pObjDef->GetInstanceTemplate(); + } + if (!g_DefaultGlobalObjectTemplate) { + v8::Local hGlobalTemplate = + v8::ObjectTemplate::New(pIsolate); + hGlobalTemplate->Set( + v8::Symbol::GetToStringTag(pIsolate), + v8::String::NewFromUtf8(pIsolate, "global", v8::NewStringType::kNormal) + .ToLocalChecked()); + g_DefaultGlobalObjectTemplate = + new v8::Global(pIsolate, hGlobalTemplate); + } + return g_DefaultGlobalObjectTemplate->Get(pIsolate); +} + +void* FXJS_ArrayBufferAllocator::Allocate(size_t length) { + return calloc(1, length); +} + +void* FXJS_ArrayBufferAllocator::AllocateUninitialized(size_t length) { + return malloc(length); +} + +void FXJS_ArrayBufferAllocator::Free(void* data, size_t length) { + free(data); +} + +void V8TemplateMapTraits::Dispose(v8::Isolate* isolate, + v8::Global value, + void* key) { + v8::Local obj = value.Get(isolate); + if (obj.IsEmpty()) + return; + CFXJS_Engine* pEngine = CFXJS_Engine::CurrentEngineFromIsolate(isolate); + int id = pEngine->GetObjDefnID(obj); + if (id == -1) + return; + CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(isolate, id); + if (!pObjDef) + return; + if (pObjDef->m_pDestructor) + pObjDef->m_pDestructor(pEngine, obj); + CFXJS_Engine::FreeObjectPrivate(obj); +} + +V8TemplateMapTraits::MapType* V8TemplateMapTraits::MapFromWeakCallbackInfo( + const v8::WeakCallbackInfo& data) { + V8TemplateMap* pMap = + (FXJS_PerIsolateData::Get(data.GetIsolate()))->m_pDynamicObjsMap.get(); + return pMap ? &pMap->m_map : nullptr; +} + +void FXJS_Initialize(unsigned int embedderDataSlot, v8::Isolate* pIsolate) { + if (g_isolate) { + ASSERT(g_embedderDataSlot == embedderDataSlot); + ASSERT(g_isolate == pIsolate); + return; + } + g_embedderDataSlot = embedderDataSlot; + g_isolate = pIsolate; +} + +void FXJS_Release() { + ASSERT(!g_isolate || g_isolate_ref_count == 0); + delete g_DefaultGlobalObjectTemplate; + g_DefaultGlobalObjectTemplate = nullptr; + g_isolate = nullptr; + + delete g_arrayBufferAllocator; + g_arrayBufferAllocator = nullptr; +} + +bool FXJS_GetIsolate(v8::Isolate** pResultIsolate) { + if (g_isolate) { + *pResultIsolate = g_isolate; + return false; + } + // Provide backwards compatibility when no external isolate. + if (!g_arrayBufferAllocator) + g_arrayBufferAllocator = new FXJS_ArrayBufferAllocator(); + v8::Isolate::CreateParams params; + params.array_buffer_allocator = g_arrayBufferAllocator; + *pResultIsolate = v8::Isolate::New(params); + return true; +} + +size_t FXJS_GlobalIsolateRefCount() { + return g_isolate_ref_count; +} + +V8TemplateMap::V8TemplateMap(v8::Isolate* isolate) : m_map(isolate) {} + +V8TemplateMap::~V8TemplateMap() {} + +void V8TemplateMap::set(void* key, v8::Local handle) { + ASSERT(!m_map.Contains(key)); + m_map.Set(key, handle); +} + +FXJS_PerIsolateData::~FXJS_PerIsolateData() {} + +// static +void FXJS_PerIsolateData::SetUp(v8::Isolate* pIsolate) { + if (!pIsolate->GetData(g_embedderDataSlot)) + pIsolate->SetData(g_embedderDataSlot, new FXJS_PerIsolateData(pIsolate)); +} + +// static +FXJS_PerIsolateData* FXJS_PerIsolateData::Get(v8::Isolate* pIsolate) { + return static_cast( + pIsolate->GetData(g_embedderDataSlot)); +} + +FXJS_PerIsolateData::FXJS_PerIsolateData(v8::Isolate* pIsolate) + : m_pDynamicObjsMap(new V8TemplateMap(pIsolate)) {} + +CFXJS_Engine::CFXJS_Engine() : m_isolate(nullptr) {} + +CFXJS_Engine::CFXJS_Engine(v8::Isolate* pIsolate) : m_isolate(pIsolate) {} + +CFXJS_Engine::~CFXJS_Engine() { + m_V8PersistentContext.Reset(); +} + +// static +CFXJS_Engine* CFXJS_Engine::CurrentEngineFromIsolate(v8::Isolate* pIsolate) { + return static_cast( + pIsolate->GetCurrentContext()->GetAlignedPointerFromEmbedderData( + kPerContextDataIndex)); +} + +// static +int CFXJS_Engine::GetObjDefnID(v8::Local pObj) { + CFXJS_PerObjectData* pData = CFXJS_PerObjectData::GetFromObject(pObj); + return pData ? pData->m_ObjDefID : -1; +} + +// static +void CFXJS_Engine::FreeObjectPrivate(void* pPerObjectData) { + delete static_cast(pPerObjectData); +} + +// static +void CFXJS_Engine::FreeObjectPrivate(v8::Local pObj) { + CFXJS_PerObjectData* pData = CFXJS_PerObjectData::GetFromObject(pObj); + pObj->SetAlignedPointerInInternalField(0, nullptr); + pObj->SetAlignedPointerInInternalField(1, nullptr); + delete pData; +} + +int CFXJS_Engine::DefineObj(const char* sObjName, + FXJSOBJTYPE eObjType, + CFXJS_Engine::Constructor pConstructor, + CFXJS_Engine::Destructor pDestructor) { + v8::Isolate::Scope isolate_scope(m_isolate); + v8::HandleScope handle_scope(m_isolate); + FXJS_PerIsolateData::SetUp(m_isolate); + CFXJS_ObjDefinition* pObjDef = new CFXJS_ObjDefinition( + m_isolate, sObjName, eObjType, pConstructor, pDestructor); + return pObjDef->AssignID(); +} + +void CFXJS_Engine::DefineObjMethod(int nObjDefnID, + const char* sMethodName, + v8::FunctionCallback pMethodCall) { + v8::Isolate::Scope isolate_scope(m_isolate); + v8::HandleScope handle_scope(m_isolate); + CFXJS_ObjDefinition* pObjDef = + CFXJS_ObjDefinition::ForID(m_isolate, nObjDefnID); + v8::Local fun = v8::FunctionTemplate::New( + m_isolate, pMethodCall, v8::Local(), pObjDef->GetSignature()); + fun->RemovePrototype(); + pObjDef->GetInstanceTemplate()->Set( + v8::String::NewFromUtf8(m_isolate, sMethodName, + v8::NewStringType::kNormal) + .ToLocalChecked(), + fun, v8::ReadOnly); +} + +void CFXJS_Engine::DefineObjProperty(int nObjDefnID, + const char* sPropName, + v8::AccessorGetterCallback pPropGet, + v8::AccessorSetterCallback pPropPut) { + v8::Isolate::Scope isolate_scope(m_isolate); + v8::HandleScope handle_scope(m_isolate); + CFXJS_ObjDefinition* pObjDef = + CFXJS_ObjDefinition::ForID(m_isolate, nObjDefnID); + pObjDef->GetInstanceTemplate()->SetAccessor( + v8::String::NewFromUtf8(m_isolate, sPropName, v8::NewStringType::kNormal) + .ToLocalChecked(), + pPropGet, pPropPut); +} + +void CFXJS_Engine::DefineObjAllProperties( + int nObjDefnID, + v8::NamedPropertyQueryCallback pPropQurey, + v8::NamedPropertyGetterCallback pPropGet, + v8::NamedPropertySetterCallback pPropPut, + v8::NamedPropertyDeleterCallback pPropDel) { + v8::Isolate::Scope isolate_scope(m_isolate); + v8::HandleScope handle_scope(m_isolate); + CFXJS_ObjDefinition* pObjDef = + CFXJS_ObjDefinition::ForID(m_isolate, nObjDefnID); + pObjDef->GetInstanceTemplate()->SetNamedPropertyHandler(pPropGet, pPropPut, + pPropQurey, pPropDel); +} + +void CFXJS_Engine::DefineObjConst(int nObjDefnID, + const char* sConstName, + v8::Local pDefault) { + v8::Isolate::Scope isolate_scope(m_isolate); + v8::HandleScope handle_scope(m_isolate); + CFXJS_ObjDefinition* pObjDef = + CFXJS_ObjDefinition::ForID(m_isolate, nObjDefnID); + pObjDef->GetInstanceTemplate()->Set(m_isolate, sConstName, pDefault); +} + +void CFXJS_Engine::DefineGlobalMethod(const char* sMethodName, + v8::FunctionCallback pMethodCall) { + v8::Isolate::Scope isolate_scope(m_isolate); + v8::HandleScope handle_scope(m_isolate); + v8::Local fun = + v8::FunctionTemplate::New(m_isolate, pMethodCall); + fun->RemovePrototype(); + GetGlobalObjectTemplate(m_isolate)->Set( + v8::String::NewFromUtf8(m_isolate, sMethodName, + v8::NewStringType::kNormal) + .ToLocalChecked(), + fun, v8::ReadOnly); +} + +void CFXJS_Engine::DefineGlobalConst(const wchar_t* sConstName, + v8::FunctionCallback pConstGetter) { + v8::Isolate::Scope isolate_scope(m_isolate); + v8::HandleScope handle_scope(m_isolate); + CFX_ByteString bsConst = FX_UTF8Encode(CFX_WideStringC(sConstName)); + v8::Local fun = + v8::FunctionTemplate::New(m_isolate, pConstGetter); + fun->RemovePrototype(); + GetGlobalObjectTemplate(m_isolate)->SetAccessorProperty( + v8::String::NewFromUtf8(m_isolate, bsConst.c_str(), + v8::NewStringType::kNormal) + .ToLocalChecked(), + fun); +} + +void CFXJS_Engine::InitializeEngine() { + if (m_isolate == g_isolate) + ++g_isolate_ref_count; + + v8::Isolate::Scope isolate_scope(m_isolate); + v8::HandleScope handle_scope(m_isolate); + + // This has to happen before we call GetGlobalObjectTemplate because that + // method gets the PerIsolateData from m_isolate. + FXJS_PerIsolateData::SetUp(m_isolate); + + v8::Local v8Context = + v8::Context::New(m_isolate, nullptr, GetGlobalObjectTemplate(m_isolate)); + v8::Context::Scope context_scope(v8Context); + + v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, this); + + int maxID = CFXJS_ObjDefinition::MaxID(m_isolate); + m_StaticObjects.resize(maxID + 1); + for (int i = 0; i < maxID; ++i) { + CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(m_isolate, i); + if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) { + CFXJS_PerObjectData::SetInObject(new CFXJS_PerObjectData(i), + v8Context->Global() + ->GetPrototype() + ->ToObject(v8Context) + .ToLocalChecked()); + if (pObjDef->m_pConstructor) { + pObjDef->m_pConstructor(this, v8Context->Global() + ->GetPrototype() + ->ToObject(v8Context) + .ToLocalChecked()); + } + } else if (pObjDef->m_ObjType == FXJSOBJTYPE_STATIC) { + v8::Local pObjName = + v8::String::NewFromUtf8(m_isolate, pObjDef->m_ObjName, + v8::NewStringType::kNormal, + strlen(pObjDef->m_ObjName)) + .ToLocalChecked(); + + v8::Local obj = NewFxDynamicObj(i, true); + v8Context->Global()->Set(v8Context, pObjName, obj).FromJust(); + m_StaticObjects[i] = new v8::Global(m_isolate, obj); + } + } + m_V8PersistentContext.Reset(m_isolate, v8Context); +} + +void CFXJS_Engine::ReleaseEngine() { + v8::Isolate::Scope isolate_scope(m_isolate); + v8::HandleScope handle_scope(m_isolate); + v8::Local context = + v8::Local::New(m_isolate, m_V8PersistentContext); + v8::Context::Scope context_scope(context); + + FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(m_isolate); + if (!pData) + return; + + m_ConstArrays.clear(); + + int maxID = CFXJS_ObjDefinition::MaxID(m_isolate); + for (int i = 0; i < maxID; ++i) { + CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(m_isolate, i); + v8::Local pObj; + if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) { + pObj = + context->Global()->GetPrototype()->ToObject(context).ToLocalChecked(); + } else if (m_StaticObjects[i] && !m_StaticObjects[i]->IsEmpty()) { + pObj = v8::Local::New(m_isolate, *m_StaticObjects[i]); + delete m_StaticObjects[i]; + m_StaticObjects[i] = nullptr; + } + + if (!pObj.IsEmpty()) { + if (pObjDef->m_pDestructor) + pObjDef->m_pDestructor(this, pObj); + FreeObjectPrivate(pObj); + } + } + + m_V8PersistentContext.Reset(); + + if (m_isolate == g_isolate && --g_isolate_ref_count > 0) + return; + + delete pData; + m_isolate->SetData(g_embedderDataSlot, nullptr); +} + +int CFXJS_Engine::Execute(const CFX_WideString& script, FXJSErr* pError) { + v8::Isolate::Scope isolate_scope(m_isolate); + v8::TryCatch try_catch(m_isolate); + CFX_ByteString bsScript = script.UTF8Encode(); + v8::Local context = m_isolate->GetCurrentContext(); + v8::Local compiled_script; + if (!v8::Script::Compile(context, + v8::String::NewFromUtf8(m_isolate, bsScript.c_str(), + v8::NewStringType::kNormal, + bsScript.GetLength()) + .ToLocalChecked()) + .ToLocal(&compiled_script)) { + v8::String::Utf8Value error(try_catch.Exception()); + // TODO(tsepez): return error via pError->message. + return -1; + } + + v8::Local result; + if (!compiled_script->Run(context).ToLocal(&result)) { + v8::String::Utf8Value error(try_catch.Exception()); + // TODO(tsepez): return error via pError->message. + return -1; + } + return 0; +} + +v8::Local CFXJS_Engine::NewFxDynamicObj(int nObjDefnID, + bool bStatic) { + v8::Isolate::Scope isolate_scope(m_isolate); + v8::Local context = m_isolate->GetCurrentContext(); + if (nObjDefnID == -1) { + v8::Local objTempl = v8::ObjectTemplate::New(m_isolate); + v8::Local obj; + if (!objTempl->NewInstance(context).ToLocal(&obj)) + return v8::Local(); + return obj; + } + + FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(m_isolate); + if (!pData) + return v8::Local(); + + if (nObjDefnID < 0 || nObjDefnID >= CFXJS_ObjDefinition::MaxID(m_isolate)) + return v8::Local(); + + CFXJS_ObjDefinition* pObjDef = + CFXJS_ObjDefinition::ForID(m_isolate, nObjDefnID); + v8::Local obj; + if (!pObjDef->GetInstanceTemplate()->NewInstance(context).ToLocal(&obj)) + return v8::Local(); + + CFXJS_PerObjectData* pObjData = new CFXJS_PerObjectData(nObjDefnID); + CFXJS_PerObjectData::SetInObject(pObjData, obj); + if (pObjDef->m_pConstructor) + pObjDef->m_pConstructor(this, obj); + + if (!bStatic && FXJS_PerIsolateData::Get(m_isolate)->m_pDynamicObjsMap) + FXJS_PerIsolateData::Get(m_isolate)->m_pDynamicObjsMap->set(pObjData, obj); + + return obj; +} + +v8::Local CFXJS_Engine::GetThisObj() { + v8::Isolate::Scope isolate_scope(m_isolate); + if (!FXJS_PerIsolateData::Get(m_isolate)) + return v8::Local(); + + // Return the global object. + v8::Local context = m_isolate->GetCurrentContext(); + return context->Global()->GetPrototype()->ToObject(context).ToLocalChecked(); +} + +void CFXJS_Engine::Error(const CFX_WideString& message) { + // Conversion from pdfium's wchar_t wide-strings to v8's uint16_t + // wide-strings isn't handled by v8, so use UTF8 as a common + // intermediate format. + CFX_ByteString utf8_message = message.UTF8Encode(); + m_isolate->ThrowException(v8::String::NewFromUtf8(m_isolate, + utf8_message.c_str(), + v8::NewStringType::kNormal) + .ToLocalChecked()); +} + +void CFXJS_Engine::SetObjectPrivate(v8::Local pObj, void* p) { + CFXJS_PerObjectData* pPerObjectData = + CFXJS_PerObjectData::GetFromObject(pObj); + if (!pPerObjectData) + return; + pPerObjectData->m_pPrivate = p; +} + +void* CFXJS_Engine::GetObjectPrivate(v8::Local pObj) { + CFXJS_PerObjectData* pData = CFXJS_PerObjectData::GetFromObject(pObj); + if (!pData && !pObj.IsEmpty()) { + // It could be a global proxy object. + v8::Local v = pObj->GetPrototype(); + v8::Local context = m_isolate->GetCurrentContext(); + if (v->IsObject()) { + pData = CFXJS_PerObjectData::GetFromObject( + v->ToObject(context).ToLocalChecked()); + } + } + return pData ? pData->m_pPrivate : nullptr; +} + +v8::Local CFXJS_Engine::GetObjectProperty( + v8::Local pObj, + const CFX_WideString& wsPropertyName) { + if (pObj.IsEmpty()) + return v8::Local(); + v8::Local val; + if (!pObj->Get(m_isolate->GetCurrentContext(), + NewString(wsPropertyName.AsStringC())) + .ToLocal(&val)) + return v8::Local(); + return val; +} + +std::vector CFXJS_Engine::GetObjectPropertyNames( + v8::Local pObj) { + if (pObj.IsEmpty()) + return std::vector(); + + v8::Local val; + v8::Local context = m_isolate->GetCurrentContext(); + if (!pObj->GetPropertyNames(context).ToLocal(&val)) + return std::vector(); + + std::vector result; + for (uint32_t i = 0; i < val->Length(); ++i) { + result.push_back(ToWideString(val->Get(context, i).ToLocalChecked())); + } + + return result; +} + +void CFXJS_Engine::PutObjectProperty(v8::Local pObj, + const CFX_WideString& wsPropertyName, + v8::Local pPut) { + if (pObj.IsEmpty()) + return; + pObj->Set(m_isolate->GetCurrentContext(), + NewString(wsPropertyName.AsStringC()), pPut) + .FromJust(); +} + + +v8::Local CFXJS_Engine::NewArray() { + return v8::Array::New(m_isolate); +} + +unsigned CFXJS_Engine::PutArrayElement(v8::Local pArray, + unsigned index, + v8::Local pValue) { + if (pArray.IsEmpty()) + return 0; + if (pArray->Set(m_isolate->GetCurrentContext(), index, pValue).IsNothing()) + return 0; + return 1; +} + +v8::Local CFXJS_Engine::GetArrayElement(v8::Local pArray, + unsigned index) { + if (pArray.IsEmpty()) + return v8::Local(); + v8::Local val; + if (!pArray->Get(m_isolate->GetCurrentContext(), index).ToLocal(&val)) + return v8::Local(); + return val; +} + +unsigned CFXJS_Engine::GetArrayLength(v8::Local pArray) { + if (pArray.IsEmpty()) + return 0; + return pArray->Length(); +} + +v8::Local CFXJS_Engine::NewLocalContext() { + return v8::Local::New(m_isolate, m_V8PersistentContext); +} + +v8::Local CFXJS_Engine::GetPersistentContext() { + return m_V8PersistentContext.Get(m_isolate); +} + +v8::Local CFXJS_Engine::NewNumber(int number) { + return v8::Int32::New(m_isolate, number); +} + +v8::Local CFXJS_Engine::NewNumber(double number) { + return v8::Number::New(m_isolate, number); +} + +v8::Local CFXJS_Engine::NewNumber(float number) { + return v8::Number::New(m_isolate, (float)number); +} + +v8::Local CFXJS_Engine::NewBoolean(bool b) { + return v8::Boolean::New(m_isolate, b); +} + +v8::Local CFXJS_Engine::NewString(const CFX_ByteStringC& str) { + v8::Isolate* pIsolate = m_isolate ? m_isolate : v8::Isolate::GetCurrent(); + return v8::String::NewFromUtf8(pIsolate, str.c_str(), + v8::NewStringType::kNormal, str.GetLength()) + .ToLocalChecked(); +} + +v8::Local CFXJS_Engine::NewString(const CFX_WideStringC& str) { + return NewString(FX_UTF8Encode(str).AsStringC()); +} + +v8::Local CFXJS_Engine::NewNull() { + return v8::Local(); +} + +v8::Local CFXJS_Engine::NewDate(double d) { + return v8::Date::New(m_isolate->GetCurrentContext(), d) + .ToLocalChecked() + .As(); +} + +int CFXJS_Engine::ToInt32(v8::Local pValue) { + if (pValue.IsEmpty()) + return 0; + v8::Local context = m_isolate->GetCurrentContext(); + return pValue->ToInt32(context).ToLocalChecked()->Value(); +} + +bool CFXJS_Engine::ToBoolean(v8::Local pValue) { + if (pValue.IsEmpty()) + return false; + v8::Local context = m_isolate->GetCurrentContext(); + return pValue->ToBoolean(context).ToLocalChecked()->Value(); +} + +double CFXJS_Engine::ToDouble(v8::Local pValue) { + if (pValue.IsEmpty()) + return 0.0; + v8::Local context = m_isolate->GetCurrentContext(); + return pValue->ToNumber(context).ToLocalChecked()->Value(); +} + +CFX_WideString CFXJS_Engine::ToWideString(v8::Local pValue) { + if (pValue.IsEmpty()) + return CFX_WideString(); + v8::Local context = m_isolate->GetCurrentContext(); + v8::String::Utf8Value s(pValue->ToString(context).ToLocalChecked()); + return CFX_WideString::FromUTF8(CFX_ByteStringC(*s, s.length())); +} + +v8::Local CFXJS_Engine::ToObject(v8::Local pValue) { + if (pValue.IsEmpty() || !pValue->IsObject()) + return v8::Local(); + v8::Local context = m_isolate->GetCurrentContext(); + return pValue->ToObject(context).ToLocalChecked(); +} + +v8::Local CFXJS_Engine::ToArray(v8::Local pValue) { + if (pValue.IsEmpty() || !pValue->IsArray()) + return v8::Local(); + v8::Local context = m_isolate->GetCurrentContext(); + return v8::Local::Cast(pValue->ToObject(context).ToLocalChecked()); +} + +void CFXJS_Engine::SetConstArray(const CFX_WideString& name, + v8::Local array) { + m_ConstArrays[name] = v8::Global(GetIsolate(), array); +} + +v8::Local CFXJS_Engine::GetConstArray(const CFX_WideString& name) { + return v8::Local::New(GetIsolate(), m_ConstArrays[name]); +} diff --git a/modules/pdfium/pdfium/fxjs/fxjs_v8.h b/modules/pdfium/pdfium/fxjs/fxjs_v8.h new file mode 100644 index 000000000000..50b0b2c6d0b1 --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/fxjs_v8.h @@ -0,0 +1,239 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +// FXJS_V8 is a layer that makes it easier to define native objects in V8, but +// has no knowledge of PDF-specific native objects. It could in theory be used +// to implement other sets of native objects. + +// PDFium code should include this file rather than including V8 headers +// directly. + +#ifndef FXJS_FXJS_V8_H_ +#define FXJS_FXJS_V8_H_ + +#include +#include + +#include +#include +#include + +#include "core/fxcrt/fx_string.h" +#ifdef PDF_ENABLE_XFA +// Header for CFXJSE_RuntimeData. FXJS_V8 doesn't interpret this class, +// it is just passed along to XFA. +#include "fxjs/cfxjse_runtimedata.h" +#endif // PDF_ENABLE_XFA + +class CFXJS_Engine; +class CFXJS_ObjDefinition; + +// FXJS_V8 places no restrictions on this class; it merely passes it +// on to caller-provided methods. +class IJS_EventContext; // A description of the event that caused JS execution. + +enum FXJSOBJTYPE { + FXJSOBJTYPE_DYNAMIC = 0, // Created by native method and returned to JS. + FXJSOBJTYPE_STATIC, // Created by init and hung off of global object. + FXJSOBJTYPE_GLOBAL, // The global object itself (may only appear once). +}; + +struct FXJSErr { + const wchar_t* message; + const wchar_t* srcline; + unsigned linnum; +}; + +// Global weak map to save dynamic objects. +class V8TemplateMapTraits : public v8::StdMapTraits { + public: + typedef v8::GlobalValueMap MapType; + typedef void WeakCallbackDataType; + + static WeakCallbackDataType* WeakCallbackParameter( + MapType* map, + void* key, + const v8::Local& value) { + return key; + } + static MapType* MapFromWeakCallbackInfo( + const v8::WeakCallbackInfo&); + + static void* KeyFromWeakCallbackInfo( + const v8::WeakCallbackInfo& data) { + return data.GetParameter(); + } + static const v8::PersistentContainerCallbackType kCallbackType = + v8::kWeakWithInternalFields; + static void DisposeWeak( + const v8::WeakCallbackInfo& data) {} + static void OnWeakCallback( + const v8::WeakCallbackInfo& data) {} + static void Dispose(v8::Isolate* isolate, + v8::Global value, + void* key); + static void DisposeCallbackData(WeakCallbackDataType* callbackData) {} +}; + +class V8TemplateMap { + public: + typedef v8::GlobalValueMap MapType; + + explicit V8TemplateMap(v8::Isolate* isolate); + ~V8TemplateMap(); + + void set(void* key, v8::Local handle); + + friend class V8TemplateMapTraits; + + private: + MapType m_map; +}; + +class FXJS_PerIsolateData { + public: + ~FXJS_PerIsolateData(); + + static void SetUp(v8::Isolate* pIsolate); + static FXJS_PerIsolateData* Get(v8::Isolate* pIsolate); + + std::vector> m_ObjectDefnArray; +#ifdef PDF_ENABLE_XFA + std::unique_ptr m_pFXJSERuntimeData; +#endif // PDF_ENABLE_XFA + std::unique_ptr m_pDynamicObjsMap; + + protected: + explicit FXJS_PerIsolateData(v8::Isolate* pIsolate); +}; + +class FXJS_ArrayBufferAllocator : public v8::ArrayBuffer::Allocator { + void* Allocate(size_t length) override; + void* AllocateUninitialized(size_t length) override; + void Free(void* data, size_t length) override; +}; + +void FXJS_Initialize(unsigned int embedderDataSlot, v8::Isolate* pIsolate); +void FXJS_Release(); + +// Gets the global isolate set by FXJS_Initialize(), or makes a new one each +// time if there is no such isolate. Returns true if a new isolate had to be +// created. +bool FXJS_GetIsolate(v8::Isolate** pResultIsolate); + +// Get the global isolate's ref count. +size_t FXJS_GlobalIsolateRefCount(); + +class CFXJS_Engine { + public: + explicit CFXJS_Engine(v8::Isolate* pIsolate); + ~CFXJS_Engine(); + + using Constructor = void (*)(CFXJS_Engine* pEngine, + v8::Local obj); + using Destructor = void (*)(CFXJS_Engine* pEngine, v8::Local obj); + + static CFXJS_Engine* CurrentEngineFromIsolate(v8::Isolate* pIsolate); + static int GetObjDefnID(v8::Local pObj); + + v8::Isolate* GetIsolate() const { return m_isolate; } + + // Always returns a valid, newly-created objDefnID. + int DefineObj(const char* sObjName, + FXJSOBJTYPE eObjType, + Constructor pConstructor, + Destructor pDestructor); + + void DefineObjMethod(int nObjDefnID, + const char* sMethodName, + v8::FunctionCallback pMethodCall); + void DefineObjProperty(int nObjDefnID, + const char* sPropName, + v8::AccessorGetterCallback pPropGet, + v8::AccessorSetterCallback pPropPut); + void DefineObjAllProperties(int nObjDefnID, + v8::NamedPropertyQueryCallback pPropQurey, + v8::NamedPropertyGetterCallback pPropGet, + v8::NamedPropertySetterCallback pPropPut, + v8::NamedPropertyDeleterCallback pPropDel); + void DefineObjConst(int nObjDefnID, + const char* sConstName, + v8::Local pDefault); + void DefineGlobalMethod(const char* sMethodName, + v8::FunctionCallback pMethodCall); + void DefineGlobalConst(const wchar_t* sConstName, + v8::FunctionCallback pConstGetter); + + // Called after FXJS_Define* calls made. + void InitializeEngine(); + void ReleaseEngine(); + + // Called after FXJS_InitializeEngine call made. + int Execute(const CFX_WideString& script, FXJSErr* perror); + + v8::Local NewLocalContext(); + v8::Local GetPersistentContext(); + v8::Local GetThisObj(); + + v8::Local NewNull(); + v8::Local NewArray(); + v8::Local NewNumber(int number); + v8::Local NewNumber(double number); + v8::Local NewNumber(float number); + v8::Local NewBoolean(bool b); + v8::Local NewString(const CFX_ByteStringC& str); + v8::Local NewString(const CFX_WideStringC& str); + v8::Local NewDate(double d); + v8::Local NewFxDynamicObj(int nObjDefnID, bool bStatic = false); + + int ToInt32(v8::Local pValue); + bool ToBoolean(v8::Local pValue); + double ToDouble(v8::Local pValue); + CFX_WideString ToWideString(v8::Local pValue); + v8::Local ToObject(v8::Local pValue); + v8::Local ToArray(v8::Local pValue); + + // Arrays. + unsigned GetArrayLength(v8::Local pArray); + v8::Local GetArrayElement(v8::Local pArray, + unsigned index); + unsigned PutArrayElement(v8::Local pArray, + unsigned index, + v8::Local pValue); + + // Objects. + std::vector GetObjectPropertyNames( + v8::Local pObj); + v8::Local GetObjectProperty(v8::Local pObj, + const CFX_WideString& PropertyName); + void PutObjectProperty(v8::Local pObj, + const CFX_WideString& PropertyName, + v8::Local pValue); + + // Native object binding. + void SetObjectPrivate(v8::Local pObj, void* p); + void* GetObjectPrivate(v8::Local pObj); + static void FreeObjectPrivate(void* p); + static void FreeObjectPrivate(v8::Local pObj); + + void SetConstArray(const CFX_WideString& name, v8::Local array); + v8::Local GetConstArray(const CFX_WideString& name); + + void Error(const CFX_WideString& message); + + protected: + CFXJS_Engine(); + + void SetIsolate(v8::Isolate* pIsolate) { m_isolate = pIsolate; } + + private: + v8::Isolate* m_isolate; + v8::Global m_V8PersistentContext; + std::vector*> m_StaticObjects; + std::map> m_ConstArrays; +}; + +#endif // FXJS_FXJS_V8_H_ diff --git a/modules/pdfium/pdfium/fxjs/fxjs_v8_embeddertest.cpp b/modules/pdfium/pdfium/fxjs/fxjs_v8_embeddertest.cpp new file mode 100644 index 000000000000..4d05a20bf989 --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/fxjs_v8_embeddertest.cpp @@ -0,0 +1,213 @@ +// Copyright 2015 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/js_embedder_test.h" + +namespace { + +const double kExpected0 = 6.0; +const double kExpected1 = 7.0; +const double kExpected2 = 8.0; + +const wchar_t kScript0[] = L"fred = 6"; +const wchar_t kScript1[] = L"fred = 7"; +const wchar_t kScript2[] = L"fred = 8"; + +} // namespace + +class FXJSV8EmbedderTest : public JSEmbedderTest { + public: + void ExecuteInCurrentContext(const CFX_WideString& script) { + FXJSErr error; + int sts = engine()->Execute(script, &error); + EXPECT_EQ(0, sts); + } + void CheckAssignmentInCurrentContext(double expected) { + v8::Local This = engine()->GetThisObj(); + v8::Local fred = engine()->GetObjectProperty(This, L"fred"); + EXPECT_TRUE(fred->IsNumber()); + EXPECT_EQ(expected, engine()->ToDouble(fred)); + } +}; + +TEST_F(FXJSV8EmbedderTest, Getters) { + v8::Isolate::Scope isolate_scope(isolate()); + v8::HandleScope handle_scope(isolate()); + v8::Context::Scope context_scope(GetV8Context()); + + ExecuteInCurrentContext(CFX_WideString(kScript1)); + CheckAssignmentInCurrentContext(kExpected1); +} + +TEST_F(FXJSV8EmbedderTest, MultipleEngines) { + v8::Isolate::Scope isolate_scope(isolate()); + v8::HandleScope handle_scope(isolate()); + + CFXJS_Engine engine1(isolate()); + engine1.InitializeEngine(); + + CFXJS_Engine engine2(isolate()); + engine2.InitializeEngine(); + + v8::Context::Scope context_scope(GetV8Context()); + ExecuteInCurrentContext(CFX_WideString(kScript0)); + CheckAssignmentInCurrentContext(kExpected0); + + { + v8::Local context1 = engine1.NewLocalContext(); + v8::Context::Scope context_scope1(context1); + ExecuteInCurrentContext(CFX_WideString(kScript1)); + CheckAssignmentInCurrentContext(kExpected1); + } + + engine1.ReleaseEngine(); + + { + v8::Local context2 = engine2.NewLocalContext(); + v8::Context::Scope context_scope2(context2); + ExecuteInCurrentContext(CFX_WideString(kScript2)); + CheckAssignmentInCurrentContext(kExpected2); + } + + engine2.ReleaseEngine(); + CheckAssignmentInCurrentContext(kExpected0); +} + +TEST_F(FXJSV8EmbedderTest, EmptyLocal) { + v8::Isolate::Scope isolate_scope(isolate()); + v8::HandleScope handle_scope(isolate()); + v8::Context::Scope context_scope(GetV8Context()); + + v8::Local empty; + EXPECT_FALSE(engine()->ToBoolean(empty)); + EXPECT_EQ(0, engine()->ToInt32(empty)); + EXPECT_EQ(0.0, engine()->ToDouble(empty)); + EXPECT_EQ(L"", engine()->ToWideString(empty)); + EXPECT_TRUE(engine()->ToObject(empty).IsEmpty()); + EXPECT_TRUE(engine()->ToArray(empty).IsEmpty()); +} + +TEST_F(FXJSV8EmbedderTest, NewNull) { + v8::Isolate::Scope isolate_scope(isolate()); + v8::HandleScope handle_scope(isolate()); + v8::Context::Scope context_scope(GetV8Context()); + + auto nullz = engine()->NewNull(); + EXPECT_FALSE(engine()->ToBoolean(nullz)); + EXPECT_EQ(0, engine()->ToInt32(nullz)); + EXPECT_EQ(0.0, engine()->ToDouble(nullz)); + EXPECT_EQ(L"", engine()->ToWideString(nullz)); + EXPECT_TRUE(engine()->ToObject(nullz).IsEmpty()); + EXPECT_TRUE(engine()->ToArray(nullz).IsEmpty()); +} + +TEST_F(FXJSV8EmbedderTest, NewBoolean) { + v8::Isolate::Scope isolate_scope(isolate()); + v8::HandleScope handle_scope(isolate()); + v8::Context::Scope context_scope(GetV8Context()); + + auto boolz = engine()->NewBoolean(true); + EXPECT_TRUE(engine()->ToBoolean(boolz)); + EXPECT_EQ(1, engine()->ToInt32(boolz)); + EXPECT_EQ(1.0, engine()->ToDouble(boolz)); + EXPECT_EQ(L"true", engine()->ToWideString(boolz)); + EXPECT_TRUE(engine()->ToObject(boolz).IsEmpty()); + EXPECT_TRUE(engine()->ToArray(boolz).IsEmpty()); +} + +TEST_F(FXJSV8EmbedderTest, NewNumber) { + v8::Isolate::Scope isolate_scope(isolate()); + v8::HandleScope handle_scope(isolate()); + v8::Context::Scope context_scope(GetV8Context()); + + auto num = engine()->NewNumber(42.1); + EXPECT_TRUE(engine()->ToBoolean(num)); + EXPECT_EQ(42, engine()->ToInt32(num)); + EXPECT_EQ(42.1, engine()->ToDouble(num)); + EXPECT_EQ(L"42.1", engine()->ToWideString(num)); + EXPECT_TRUE(engine()->ToObject(num).IsEmpty()); + EXPECT_TRUE(engine()->ToArray(num).IsEmpty()); +} + +TEST_F(FXJSV8EmbedderTest, NewString) { + v8::Isolate::Scope isolate_scope(isolate()); + v8::HandleScope handle_scope(isolate()); + v8::Context::Scope context_scope(GetV8Context()); + + auto str = engine()->NewString(L"123"); + EXPECT_TRUE(engine()->ToBoolean(str)); + EXPECT_EQ(123, engine()->ToInt32(str)); + EXPECT_EQ(123, engine()->ToDouble(str)); + EXPECT_EQ(L"123", engine()->ToWideString(str)); + EXPECT_TRUE(engine()->ToObject(str).IsEmpty()); + EXPECT_TRUE(engine()->ToArray(str).IsEmpty()); +} + +TEST_F(FXJSV8EmbedderTest, NewDate) { + v8::Isolate::Scope isolate_scope(isolate()); + v8::HandleScope handle_scope(isolate()); + v8::Context::Scope context_scope(GetV8Context()); + + auto date = engine()->NewDate(1111111111); + EXPECT_TRUE(engine()->ToBoolean(date)); + EXPECT_EQ(1111111111, engine()->ToInt32(date)); + EXPECT_EQ(1111111111.0, engine()->ToDouble(date)); + EXPECT_NE(L"", engine()->ToWideString(date)); // exact format varies. + EXPECT_TRUE(engine()->ToObject(date)->IsObject()); + EXPECT_TRUE(engine()->ToArray(date).IsEmpty()); +} + +TEST_F(FXJSV8EmbedderTest, NewArray) { + v8::Isolate::Scope isolate_scope(isolate()); + v8::HandleScope handle_scope(isolate()); + v8::Context::Scope context_scope(GetV8Context()); + + auto array = engine()->NewArray(); + EXPECT_EQ(0u, engine()->GetArrayLength(array)); + EXPECT_FALSE(engine()->GetArrayElement(array, 2).IsEmpty()); + EXPECT_TRUE(engine()->GetArrayElement(array, 2)->IsUndefined()); + EXPECT_EQ(0u, engine()->GetArrayLength(array)); + + engine()->PutArrayElement(array, 3, engine()->NewNumber(12)); + EXPECT_FALSE(engine()->GetArrayElement(array, 2).IsEmpty()); + EXPECT_TRUE(engine()->GetArrayElement(array, 2)->IsUndefined()); + EXPECT_FALSE(engine()->GetArrayElement(array, 3).IsEmpty()); + EXPECT_TRUE(engine()->GetArrayElement(array, 3)->IsNumber()); + EXPECT_EQ(4u, engine()->GetArrayLength(array)); + + EXPECT_TRUE(engine()->ToBoolean(array)); + EXPECT_EQ(0, engine()->ToInt32(array)); + double d = engine()->ToDouble(array); + EXPECT_NE(d, d); // i.e. NaN. + EXPECT_EQ(L",,,12", engine()->ToWideString(array)); + EXPECT_TRUE(engine()->ToObject(array)->IsObject()); + EXPECT_TRUE(engine()->ToArray(array)->IsArray()); +} + +TEST_F(FXJSV8EmbedderTest, NewObject) { + v8::Isolate::Scope isolate_scope(isolate()); + v8::HandleScope handle_scope(isolate()); + v8::Context::Scope context_scope(GetV8Context()); + + auto object = engine()->NewFxDynamicObj(-1); + EXPECT_EQ(0u, engine()->GetObjectPropertyNames(object).size()); + EXPECT_FALSE(engine()->GetObjectProperty(object, L"clams").IsEmpty()); + EXPECT_TRUE(engine()->GetObjectProperty(object, L"clams")->IsUndefined()); + EXPECT_EQ(0u, engine()->GetObjectPropertyNames(object).size()); + + engine()->PutObjectProperty(object, L"clams", engine()->NewNumber(12)); + EXPECT_FALSE(engine()->GetObjectProperty(object, L"clams").IsEmpty()); + EXPECT_TRUE(engine()->GetObjectProperty(object, L"clams")->IsNumber()); + EXPECT_EQ(1u, engine()->GetObjectPropertyNames(object).size()); + EXPECT_EQ(L"clams", engine()->GetObjectPropertyNames(object)[0]); + + EXPECT_TRUE(engine()->ToBoolean(object)); + EXPECT_EQ(0, engine()->ToInt32(object)); + double d = engine()->ToDouble(object); + EXPECT_NE(d, d); // i.e. NaN. + EXPECT_EQ(L"[object Object]", engine()->ToWideString(object)); + EXPECT_TRUE(engine()->ToObject(object)->IsObject()); + EXPECT_TRUE(engine()->ToArray(object).IsEmpty()); +} diff --git a/modules/pdfium/pdfium/fxjs/fxjse.h b/modules/pdfium/pdfium/fxjs/fxjse.h new file mode 100644 index 000000000000..069a3b29a3d5 --- /dev/null +++ b/modules/pdfium/pdfium/fxjs/fxjse.h @@ -0,0 +1,74 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FXJS_FXJSE_H_ +#define FXJS_FXJSE_H_ + +#include "core/fxcrt/fx_string.h" +#include "core/fxcrt/fx_system.h" +#include "v8/include/v8.h" + +class CFXJSE_Arguments; +class CFXJSE_Value; + +// C++ object which can be wrapped by CFXJSE_value. +class CFXJSE_HostObject { + public: + virtual ~CFXJSE_HostObject() {} +}; + +typedef void (*FXJSE_FuncCallback)(CFXJSE_Value* pThis, + const CFX_ByteStringC& szFuncName, + CFXJSE_Arguments& args); +typedef void (*FXJSE_PropAccessor)(CFXJSE_Value* pObject, + const CFX_ByteStringC& szPropName, + CFXJSE_Value* pValue); +typedef int32_t (*FXJSE_PropTypeGetter)(CFXJSE_Value* pObject, + const CFX_ByteStringC& szPropName, + bool bQueryIn); +typedef bool (*FXJSE_PropDeleter)(CFXJSE_Value* pObject, + const CFX_ByteStringC& szPropName); + +enum FXJSE_ClassPropTypes { + FXJSE_ClassPropType_None, + FXJSE_ClassPropType_Property, + FXJSE_ClassPropType_Method +}; + +struct FXJSE_FUNCTION_DESCRIPTOR { + const FX_CHAR* name; + FXJSE_FuncCallback callbackProc; +}; + +struct FXJSE_PROPERTY_DESCRIPTOR { + const FX_CHAR* name; + FXJSE_PropAccessor getProc; + FXJSE_PropAccessor setProc; +}; + +struct FXJSE_CLASS_DESCRIPTOR { + const FX_CHAR* name; + FXJSE_FuncCallback constructor; + const FXJSE_PROPERTY_DESCRIPTOR* properties; + const FXJSE_FUNCTION_DESCRIPTOR* methods; + int32_t propNum; + int32_t methNum; + FXJSE_PropTypeGetter dynPropTypeGetter; + FXJSE_PropAccessor dynPropGetter; + FXJSE_PropAccessor dynPropSetter; + FXJSE_PropDeleter dynPropDeleter; + FXJSE_FuncCallback dynMethodCall; +}; + +void FXJSE_Initialize(); +void FXJSE_Finalize(); + +v8::Isolate* FXJSE_Runtime_Create_Own(); +void FXJSE_Runtime_Release(v8::Isolate* pIsolate); + +void FXJSE_ThrowMessage(const CFX_ByteStringC& utf8Message); + +#endif // FXJS_FXJSE_H_ diff --git a/modules/pdfium/pdfium/infra/config/cq.cfg b/modules/pdfium/pdfium/infra/config/cq.cfg new file mode 100644 index 000000000000..7062e43a494e --- /dev/null +++ b/modules/pdfium/pdfium/infra/config/cq.cfg @@ -0,0 +1,100 @@ +# See http://luci-config.appspot.com/schemas/projects/refs:cq.cfg for the +# documentation of this file format. + +version: 1 +cq_name: "pdfium" +git_repo_url: "https://pdfium.googlesource.com/pdfium.git" +cq_status_url: "https://chromium-cq-status.appspot.com" + +gerrit {} +rietveld { + url: "https://codereview.chromium.org" +} + +verifiers { + reviewer_lgtm { + committer_list: "project-pdfium-committers" + dry_run_access_list: "project-pdfium-tryjob-access" + } + gerrit_cq_ability { + committer_list: "project-pdfium-committers" + dry_run_access_list: "project-pdfium-tryjob-access" + } + + tree_status { + tree_status_url: "https://pdfium-status.appspot.com" + } + + try_job { + try_job_retry_config { + try_job_retry_quota: 0 + } + + buckets { + name: "master.tryserver.client.pdfium" + builders { + name: "android" + } + builders { + name: "linux" + } + builders { + name: "linux_asan_lsan" + } + builders { + name: "linux_no_v8" + } + builders { + name: "linux_skia" + } + builders { + name: "linux_xfa" + } + builders { + name: "linux_xfa_asan_lsan" + } + builders { + name: "linux_xfa_rel" + } + builders { + name: "mac" + } + builders { + name: "mac_no_v8" + } + builders { + name: "mac_skia" + } + builders { + name: "mac_xfa" + } + builders { + name: "mac_xfa_rel" + } + builders { + name: "win" + } + builders { + name: "win_no_v8" + } + builders { + name: "win_skia" + } + builders { + name: "win_xfa" + } + builders { + name: "win_xfa_32" + } + builders { + name: "win_xfa_clang" + } + builders { + name: "win_xfa_clang_32" + } + builders { + name: "win_xfa_rel" + } + } + } +} diff --git a/modules/pdfium/pdfium/navbar.md b/modules/pdfium/pdfium/navbar.md new file mode 100644 index 000000000000..a7f9307ae71b --- /dev/null +++ b/modules/pdfium/pdfium/navbar.md @@ -0,0 +1,13 @@ + + +# PDFium + +* [Home](/README.md) +* [Getting Started](/docs/getting-started.md) +* [V8 Getting Started](/docs/v8-getting-started.md) + +[home]: /README.md diff --git a/modules/pdfium/pdfium/pdfium.gni b/modules/pdfium/pdfium/pdfium.gni new file mode 100644 index 000000000000..8ce09f968d75 --- /dev/null +++ b/modules/pdfium/pdfium/pdfium.gni @@ -0,0 +1,46 @@ +# Copyright 2015 PDFium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build_overrides/pdfium.gni") + +# This file contains PDFium-related build flags. + +declare_args() { + # On Android there's no system FreeType. On Windows and Mac, only a few + # methods are used from it. + pdfium_bundle_freetype = !is_linux + + # Build PDFium either with or without v8 support. + pdf_enable_v8 = pdf_enable_v8_override + + # Build PDFium either with or without XFA Forms support. + pdf_enable_xfa = pdf_enable_xfa_override + + # If XFA, also support bmp codec. Ignored if not XFA. + pdf_enable_xfa_bmp = true + + # If XFA, also support gif codec. Ignored if not XFA. + pdf_enable_xfa_gif = true + + # If XFA, also support png codec. Ignored if not XFA. + pdf_enable_xfa_png = true + + # If XFA, also support png codec. Ignored if not XFA. + pdf_enable_xfa_tiff = true + + # Build PDFium against skia (experimental) rather than agg. Use Skia to draw everything. + pdf_use_skia = pdf_use_skia_override + + # Build PDFium against skia (experimental) rather than agg. Use Skia to draw paths. + pdf_use_skia_paths = pdf_use_skia_paths_override + + # Build PDFium with or without experimental win32 GDI APIs. + pdf_use_win32_gdi = pdf_use_win32_gdi_override + + # Build PDFium standalone + pdf_is_standalone = false + + # Enable coverage information + use_coverage = false +} diff --git a/modules/pdfium/pdfium/public/DEPS b/modules/pdfium/pdfium/public/DEPS new file mode 100644 index 000000000000..d0005cacd69d --- /dev/null +++ b/modules/pdfium/pdfium/public/DEPS @@ -0,0 +1,8 @@ +include_rules = [ + # public/ needs to be standalone. Explicitly disallow everything. + '-core', + '-fpdfsdk', + '-testing', + '-third_party', + '-v8', +] diff --git a/modules/pdfium/pdfium/public/README b/modules/pdfium/pdfium/public/README new file mode 100644 index 000000000000..b07d0f306865 --- /dev/null +++ b/modules/pdfium/pdfium/public/README @@ -0,0 +1,13 @@ +public/ README + +The header files in this directory are the only ones that should ever be +included by an embedder of PDFium. If there arises a need for functionality +beyond what is present here, then a new API must be added here to provide it. + +These header files must be entirely contained in this directory; they must +never include other header files from outside of it. + +These files must compile cleanly without warnings on both C and C++ compilers. + +Changes to these files must be carefully considered to avoid breaking +compatibility. diff --git a/modules/pdfium/pdfium/public/fpdf_dataavail.h b/modules/pdfium/pdfium/public/fpdf_dataavail.h new file mode 100644 index 000000000000..2413e2be7a7d --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_dataavail.h @@ -0,0 +1,198 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_DATAAVAIL_H_ +#define PUBLIC_FPDF_DATAAVAIL_H_ + +#include + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#define PDF_LINEARIZATION_UNKNOWN -1 +#define PDF_NOT_LINEARIZED 0 +#define PDF_LINEARIZED 1 + +#define PDF_DATA_ERROR -1 +#define PDF_DATA_NOTAVAIL 0 +#define PDF_DATA_AVAIL 1 + +#define PDF_FORM_ERROR -1 +#define PDF_FORM_NOTAVAIL 0 +#define PDF_FORM_AVAIL 1 +#define PDF_FORM_NOTEXIST 2 + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Interface for checking whether sections of the file are available. +typedef struct _FX_FILEAVAIL { + // Version number of the interface. Must be 1. + int version; + + // Reports if the specified data section is currently available. A section is + // available if all bytes in the section are available. + // + // Interface Version: 1 + // Implementation Required: Yes + // + // pThis - pointer to the interface structure. + // offset - the offset of the data section in the file. + // size - the size of the data section. + // + // Returns true if the specified data section at |offset| of |size| + // is available. + FPDF_BOOL (*IsDataAvail)(struct _FX_FILEAVAIL* pThis, + size_t offset, + size_t size); +} FX_FILEAVAIL; +typedef void* FPDF_AVAIL; + +// Create a document availability provider. +// +// file_avail - pointer to file availability interface. +// file - pointer to a file access interface. +// +// Returns a handle to the document availability provider, or NULL on error. +// +// |FPDFAvail_Destroy| must be called when done with the availability provider. +DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail, + FPDF_FILEACCESS* file); + +// Destroy the |avail| document availability provider. +// +// avail - handle to document availability provider to be destroyed. +DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail); + +// Download hints interface. Used to receive hints for further downloading. +typedef struct _FX_DOWNLOADHINTS { + // Version number of the interface. Must be 1. + int version; + + // Add a section to be downloaded. + // + // Interface Version: 1 + // Implementation Required: Yes + // + // pThis - pointer to the interface structure. + // offset - the offset of the hint reported to be downloaded. + // size - the size of the hint reported to be downloaded. + // + // The |offset| and |size| of the section may not be unique. Part of the + // section might be already available. The download manager must deal with + // overlapping sections. + void (*AddSegment)(struct _FX_DOWNLOADHINTS* pThis, + size_t offset, + size_t size); +} FX_DOWNLOADHINTS; + +// Checks if the document is ready for loading, if not, gets download hints. +// +// avail - handle to document availability provider. +// hints - pointer to a download hints interface. +// +// Returns one of: +// PDF_DATA_ERROR: A common error is returned. Data availability unknown. +// PDF_DATA_NOTAVAIL: Data not yet available. +// PDF_DATA_AVAIL: Data available. +// +// Applications should call this function whenever new data arrives, and process +// all the generated download hints, if any, until the function returns +// |PDF_DATA_ERROR| or |PDF_DATA_AVAIL|. +// +// Once all data is available, call |FPDFAvail_GetDocument| to get a document +// handle. +DLLEXPORT int STDCALL +FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints); + +// Get document from the availability provider. +// +// avail - handle to document availability provider. +// password - password for decrypting the PDF file. Optional. +// +// Returns a handle to the document. +// +// When |FPDFAvail_IsDocAvail| returns TRUE, call |FPDFAvail_GetDocument| to +// retrieve the document handle. +DLLEXPORT FPDF_DOCUMENT STDCALL FPDFAvail_GetDocument(FPDF_AVAIL avail, + FPDF_BYTESTRING password); + +// Get the page number for the first available page in a linearized PDF. +// +// doc - document handle. +// +// Returns the zero-based index for the first available page. +// +// For most linearized PDFs, the first available page will be the first page, +// however, some PDFs might make another page the first available page. +// For non-linearized PDFs, this function will always return zero. +DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc); + +// Check if |page_index| is ready for loading, if not, get the +// |FX_DOWNLOADHINTS|. +// +// avail - handle to document availability provider. +// page_index - index number of the page. Zero for the first page. +// hints - pointer to a download hints interface. Populated if +// |page_index| is not available. +// +// Returns one of: +// PDF_DATA_ERROR: A common error is returned. Data availability unknown. +// PDF_DATA_NOTAVAIL: Data not yet available. +// PDF_DATA_AVAIL: Data available. +// +// This function can be called only after |FPDFAvail_GetDocument| is called. +// Applications should call this function whenever new data arrives and process +// all the generated download |hints|, if any, until this function returns +// |PDF_DATA_ERROR| or |PDF_DATA_AVAIL|. Applications can then perform page +// loading. +DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail, + int page_index, + FX_DOWNLOADHINTS* hints); + +// Check if form data is ready for initialization, if not, get the +// |FX_DOWNLOADHINTS|. +// +// avail - handle to document availability provider. +// hints - pointer to a download hints interface. Populated if form is not +// ready for initialization. +// +// Returns one of: +// PDF_FORM_ERROR: A common eror, in general incorrect parameters. +// PDF_FORM_NOTAVAIL: Data not available. +// PDF_FORM_AVAIL: Data available. +// PDF_FORM_NOTEXIST: No form data. +// +// This function can be called only after |FPDFAvail_GetDocument| is called. +// The application should call this function whenever new data arrives and +// process all the generated download |hints|, if any, until the function +// |PDF_FORM_ERROR|, |PDF_FORM_AVAIL| or |PDF_FORM_NOTEXIST|. +// Applications can then perform page loading. It is recommend to call +// |FPDFDOC_InitFormFillEnvironment| when |PDF_FORM_AVAIL| is returned. +DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail, + FX_DOWNLOADHINTS* hints); + +// Check whether a document is a linearized PDF. +// +// avail - handle to document availability provider. +// +// Returns one of: +// PDF_LINEARIZED +// PDF_NOT_LINEARIZED +// PDF_LINEARIZATION_UNKNOWN +// +// |FPDFAvail_IsLinearized| will return |PDF_LINEARIZED| or |PDF_NOT_LINEARIZED| +// when we have 1k of data. If the files size less than 1k, it returns +// |PDF_LINEARIZATION_UNKNOWN| as there is insufficient information to determine +// if the PDF is linearlized. +DLLEXPORT int STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // PUBLIC_FPDF_DATAAVAIL_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_doc.h b/modules/pdfium/pdfium/public/fpdf_doc.h new file mode 100644 index 000000000000..9d55a2e826d7 --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_doc.h @@ -0,0 +1,325 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_DOC_H_ +#define PUBLIC_FPDF_DOC_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Unsupported action type. +#define PDFACTION_UNSUPPORTED 0 +// Go to a destination within current document. +#define PDFACTION_GOTO 1 +// Go to a destination within another document. +#define PDFACTION_REMOTEGOTO 2 +// URI, including web pages and other Internet resources. +#define PDFACTION_URI 3 +// Launch an application or open a file. +#define PDFACTION_LAUNCH 4 + +typedef struct _FS_QUADPOINTSF { + FS_FLOAT x1; + FS_FLOAT y1; + FS_FLOAT x2; + FS_FLOAT y2; + FS_FLOAT x3; + FS_FLOAT y3; + FS_FLOAT x4; + FS_FLOAT y4; +} FS_QUADPOINTSF; + +// Get the first child of |bookmark|, or the first top-level bookmark item. +// +// document - handle to the document. +// bookmark - handle to the current bookmark. Pass NULL for the first top +// level item. +// +// Returns a handle to the first child of |bookmark| or the first top-level +// bookmark item. NULL if no child or top-level bookmark found. +DLLEXPORT FPDF_BOOKMARK STDCALL +FPDFBookmark_GetFirstChild(FPDF_DOCUMENT document, FPDF_BOOKMARK bookmark); + +// Get the next sibling of |bookmark|. +// +// document - handle to the document. +// bookmark - handle to the current bookmark. +// +// Returns a handle to the next sibling of |bookmark|, or NULL if this is the +// last bookmark at this level. +DLLEXPORT FPDF_BOOKMARK STDCALL +FPDFBookmark_GetNextSibling(FPDF_DOCUMENT document, FPDF_BOOKMARK bookmark); + +// Get the title of |bookmark|. +// +// bookmark - handle to the bookmark. +// buffer - buffer for the title. May be NULL. +// buflen - the length of the buffer in bytes. May be 0. +// +// Returns the number of bytes in the title, including the terminating NUL +// character. The number of bytes is returned regardless of the |buffer| and +// |buflen| parameters. +// +// Regardless of the platform, the |buffer| is always in UTF-16LE encoding. The +// string is terminated by a UTF16 NUL character. If |buflen| is less than the +// required length, or |buffer| is NULL, |buffer| will not be modified. +DLLEXPORT unsigned long STDCALL FPDFBookmark_GetTitle(FPDF_BOOKMARK bookmark, + void* buffer, + unsigned long buflen); + +// Find the bookmark with |title| in |document|. +// +// document - handle to the document. +// title - the UTF-16LE encoded Unicode title for which to search. +// +// Returns the handle to the bookmark, or NULL if |title| can't be found. +// +// |FPDFBookmark_Find| will always return the first bookmark found even if +// multiple bookmarks have the same |title|. +DLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document, + FPDF_WIDESTRING title); + +// Get the destination associated with |bookmark|. +// +// document - handle to the document. +// bookmark - handle to the bookmark. +// +// Returns the handle to the destination data, NULL if no destination is +// associated with |bookmark|. +DLLEXPORT FPDF_DEST STDCALL FPDFBookmark_GetDest(FPDF_DOCUMENT document, + FPDF_BOOKMARK bookmark); + +// Get the action associated with |bookmark|. +// +// bookmark - handle to the bookmark. +// +// Returns the handle to the action data, or NULL if no action is associated +// with |bookmark|. When NULL is returned, |FPDFBookmark_GetDest| should be +// called to get the |bookmark| destination data. +DLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK bookmark); + +// Get the type of |action|. +// +// action - handle to the action. +// +// Returns one of: +// PDFACTION_UNSUPPORTED +// PDFACTION_GOTO +// PDFACTION_REMOTEGOTO +// PDFACTION_URI +// PDFACTION_LAUNCH +DLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION action); + +// Get the destination of |action|. +// +// document - handle to the document. +// action - handle to the action. |action| must be a |PDFACTION_GOTO| or +// |PDFACTION_REMOTEGOTO|. +// +// Returns a handle to the destination data. +// +// In the case of |PDFACTION_REMOTEGOTO|, you should first call +// |FPDFAction_GetFilePath| then load that document, the document handle from +// that document should pass as |document| to |FPDFAction_GetDest|. +DLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document, + FPDF_ACTION action); + +// Get file path of a |PDFACTION_REMOTEGOTO| |action|. +// +// action - handle to the action. |action| must be a |PDFACTION_LAUNCH| or +// |PDFACTION_REMOTEGOTO| +// buffer - a buffer for output the path string. May be NULL. +// buflen - the length of the buffer, in bytes. May be 0. +// +// Returns the number of bytes in the file path, including the trailing UTF16 +// NUL character. +// +// Regardless of the platform, the |buffer| is always in UTF-16LE encoding. +// If |buflen| is less than the returned length, or |buffer| is NULL, |buffer| +// will not be modified. +DLLEXPORT unsigned long STDCALL +FPDFAction_GetFilePath(FPDF_ACTION action, void* buffer, unsigned long buflen); + +// Get the URI path of a |PDFACTION_URI| |action|. +// +// document - handle to the document. +// action - handle to the action. Must be a |PDFACTION_URI|. +// buffer - a buffer for the path string. May be NULL. +// buflen - the length of the buffer, in bytes. May be 0. +// +// Returns the number of bytes in the URI path, including trailing zeros. +// +// The |buffer| is always encoded in 7-bit ASCII. If |buflen| is less than the +// returned length, or |buffer| is NULL, |buffer| will not be modified. +DLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document, + FPDF_ACTION action, + void* buffer, + unsigned long buflen); + +// Get the page index of |dest|. +// +// document - handle to the document. +// dest - handle to the destination. +// +// Returns the page index containing |dest|. Page indices start from 0. +DLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document, + FPDF_DEST dest); + +// Get the (x, y, zoom) location of |dest| in the destination page, if the +// destination is in [page /XYZ x y zoom] syntax. +// +// dest - handle to the destination. +// hasXVal - out parameter; true if the x value is not null +// hasYVal - out parameter; true if the y value is not null +// hasZoomVal - out parameter; true if the zoom value is not null +// x - out parameter; the x coordinate, in page coordinates. +// y - out parameter; the y coordinate, in page coordinates. +// zoom - out parameter; the zoom value. +// Returns TRUE on successfully reading the /XYZ value. +// +// Note the [x, y, zoom] values are only set if the corresponding hasXVal, +// hasYVal or hasZoomVal flags are true. +DLLEXPORT FPDF_BOOL STDCALL FPDFDest_GetLocationInPage(FPDF_DEST dest, + FPDF_BOOL* hasXCoord, + FPDF_BOOL* hasYCoord, + FPDF_BOOL* hasZoom, + FS_FLOAT* x, + FS_FLOAT* y, + FS_FLOAT* zoom); + +// Find a link at point (|x|,|y|) on |page|. +// +// page - handle to the document page. +// x - the x coordinate, in the page coordinate system. +// y - the y coordinate, in the page coordinate system. +// +// Returns a handle to the link, or NULL if no link found at the given point. +// +// You can convert coordinates from screen coordinates to page coordinates using +// |FPDF_DeviceToPage|. +DLLEXPORT FPDF_LINK STDCALL FPDFLink_GetLinkAtPoint(FPDF_PAGE page, + double x, + double y); + +// Find the Z-order of link at point (|x|,|y|) on |page|. +// +// page - handle to the document page. +// x - the x coordinate, in the page coordinate system. +// y - the y coordinate, in the page coordinate system. +// +// Returns the Z-order of the link, or -1 if no link found at the given point. +// Larger Z-order numbers are closer to the front. +// +// You can convert coordinates from screen coordinates to page coordinates using +// |FPDF_DeviceToPage|. +DLLEXPORT int STDCALL +FPDFLink_GetLinkZOrderAtPoint(FPDF_PAGE page, double x, double y); + +// Get destination info for |link|. +// +// document - handle to the document. +// link - handle to the link. +// +// Returns a handle to the destination, or NULL if there is no destination +// associated with the link. In this case, you should call |FPDFLink_GetAction| +// to retrieve the action associated with |link|. +DLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document, + FPDF_LINK link); + +// Get action info for |link|. +// +// link - handle to the link. +// +// Returns a handle to the action associated to |link|, or NULL if no action. +DLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK link); + +// Enumerates all the link annotations in |page|. +// +// page - handle to the page. +// startPos - the start position, should initially be 0 and is updated with +// the next start position on return. +// linkAnnot - the link handle for |startPos|. +// +// Returns TRUE on success. +DLLEXPORT FPDF_BOOL STDCALL FPDFLink_Enumerate(FPDF_PAGE page, + int* startPos, + FPDF_LINK* linkAnnot); + +// Get the rectangle for |linkAnnot|. +// +// linkAnnot - handle to the link annotation. +// rect - the annotation rectangle. +// +// Returns true on success. +DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetAnnotRect(FPDF_LINK linkAnnot, + FS_RECTF* rect); + +// Get the count of quadrilateral points to the |linkAnnot|. +// +// linkAnnot - handle to the link annotation. +// +// Returns the count of quadrilateral points. +DLLEXPORT int STDCALL FPDFLink_CountQuadPoints(FPDF_LINK linkAnnot); + +// Get the quadrilateral points for the specified |quadIndex| in |linkAnnot|. +// +// linkAnnot - handle to the link annotation. +// quadIndex - the specified quad point index. +// quadPoints - receives the quadrilateral points. +// +// Returns true on success. +DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetQuadPoints(FPDF_LINK linkAnnot, + int quadIndex, + FS_QUADPOINTSF* quadPoints); + +// Get meta-data |tag| content from |document|. +// +// document - handle to the document. +// tag - the tag to retrieve. The tag can be one of: +// Title, Author, Subject, Keywords, Creator, Producer, +// CreationDate, or ModDate. +// For detailed explanations of these tags and their respective +// values, please refer to PDF Reference 1.6, section 10.2.1, +// 'Document Information Dictionary'. +// buffer - a buffer for the tag. May be NULL. +// buflen - the length of the buffer, in bytes. May be 0. +// +// Returns the number of bytes in the tag, including trailing zeros. +// +// The |buffer| is always encoded in UTF-16LE. The |buffer| is followed by two +// bytes of zeros indicating the end of the string. If |buflen| is less than +// the returned length, or |buffer| is NULL, |buffer| will not be modified. +DLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT document, + FPDF_BYTESTRING tag, + void* buffer, + unsigned long buflen); + +// Get the page label for |page_index| from |document|. +// +// document - handle to the document. +// page_index - the 0-based index of the page. +// buffer - a buffer for the page label. May be NULL. +// buflen - the length of the buffer, in bytes. May be 0. +// +// Returns the number of bytes in the page label, including trailing zeros. +// +// The |buffer| is always encoded in UTF-16LE. The |buffer| is followed by two +// bytes of zeros indicating the end of the string. If |buflen| is less than +// the returned length, or |buffer| is NULL, |buffer| will not be modified. +DLLEXPORT unsigned long STDCALL FPDF_GetPageLabel(FPDF_DOCUMENT document, + int page_index, + void* buffer, + unsigned long buflen); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // PUBLIC_FPDF_DOC_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_edit.h b/modules/pdfium/pdfium/public/fpdf_edit.h new file mode 100644 index 000000000000..3350b5c6a7aa --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_edit.h @@ -0,0 +1,425 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_EDIT_H_ +#define PUBLIC_FPDF_EDIT_H_ + +#include + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#define FPDF_ARGB(a, r, g, b) \ + ((uint32_t)(((uint32_t)(b)&0xff) | (((uint32_t)(g)&0xff) << 8) | \ + (((uint32_t)(r)&0xff) << 16) | (((uint32_t)(a)&0xff) << 24))) +#define FPDF_GetBValue(argb) ((uint8_t)(argb)) +#define FPDF_GetGValue(argb) ((uint8_t)(((uint16_t)(argb)) >> 8)) +#define FPDF_GetRValue(argb) ((uint8_t)((argb) >> 16)) +#define FPDF_GetAValue(argb) ((uint8_t)((argb) >> 24)) + +// The page object constants. +#define FPDF_PAGEOBJ_TEXT 1 +#define FPDF_PAGEOBJ_PATH 2 +#define FPDF_PAGEOBJ_IMAGE 3 +#define FPDF_PAGEOBJ_SHADING 4 +#define FPDF_PAGEOBJ_FORM 5 + +#define FPDF_FILLMODE_ALTERNATE 1 +#define FPDF_FILLMODE_WINDING 2 + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Create a new PDF document. +// +// Returns a handle to a new document, or NULL on failure. +DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_CreateNewDocument(); + +// Create a new PDF page. +// +// document - handle to document. +// page_index - suggested index of the page to create. If it is larger than +// document's current last index(L), the created page index is +// the next available index -- L+1. +// width - the page width. +// height - the page height. +// +// Returns the handle to the new page. +// +// The page should be closed with CPDF_ClosePage() when finished as +// with any other page in the document. +DLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, + int page_index, + double width, + double height); + +// Delete the page at |page_index|. +// +// document - handle to document. +// page_index - the index of the page to delete. +DLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index); + +// Get the rotation of |page|. +// +// page - handle to a page +// +// Returns one of the following indicating the page rotation: +// 0 - No rotation. +// 1 - Rotated 90 degrees clockwise. +// 2 - Rotated 180 degrees clockwise. +// 3 - Rotated 270 degrees clockwise. +DLLEXPORT int STDCALL FPDFPage_GetRotation(FPDF_PAGE page); + +// Set rotation for |page|. +// +// page - handle to a page. +// rotate - the rotation value, one of: +// 0 - No rotation. +// 1 - Rotated 90 degrees clockwise. +// 2 - Rotated 180 degrees clockwise. +// 3 - Rotated 270 degrees clockwise. +DLLEXPORT void STDCALL FPDFPage_SetRotation(FPDF_PAGE page, int rotate); + +// Insert |page_obj| into |page|. +// +// page - handle to a page +// page_obj - handle to a page object. The |page_obj| will be automatically +// freed. +DLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, + FPDF_PAGEOBJECT page_obj); + +// Get number of page objects inside |page|. +// +// page - handle to a page. +// +// Returns the number of objects in |page|. +DLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page); + +// Get object in |page| at |index|. +// +// page - handle to a page. +// index - the index of a page object. +// +// Returns the handle to the page object, or NULL on failed. +DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, int index); + +// Checks if |page| contains transparency. +// +// page - handle to a page. +// +// Returns TRUE if |page| contains transparency. +DLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page); + +// Generate the content of |page|. +// +// page - handle to a page. +// +// Returns TRUE on success. +// +// Before you save the page to a file, or reload the page, you must call +// |FPDFPage_GenerateContent| or any changes to |page| will be lost. +DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GenerateContent(FPDF_PAGE page); + +// Checks if |pageObject| contains transparency. +// +// pageObject - handle to a page object. +// +// Returns TRUE if |pageObject| contains transparency. +DLLEXPORT FPDF_BOOL STDCALL +FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject); + +// Transform |pageObject| by the given matrix. +// +// page_object - handle to a page object. +// a - matrix value. +// b - matrix value. +// c - matrix value. +// d - matrix value. +// e - matrix value. +// f - matrix value. +// +// The matrix is composed as: +// |a c e| +// |b d f| +// and can be used to scale, rotate, shear and translate the |page_object|. +DLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object, + double a, + double b, + double c, + double d, + double e, + double f); + +// Transform all annotations in |page|. +// +// page - handle to a page. +// a - matrix value. +// b - matrix value. +// c - matrix value. +// d - matrix value. +// e - matrix value. +// f - matrix value. +// +// The matrix is composed as: +// |a c e| +// |b d f| +// and can be used to scale, rotate, shear and translate the |page| annotations. +DLLEXPORT void STDCALL FPDFPage_TransformAnnots(FPDF_PAGE page, + double a, + double b, + double c, + double d, + double e, + double f); + +// Create a new image object. +// +// document - handle to a document. +// +// Returns a handle to a new image object. +DLLEXPORT FPDF_PAGEOBJECT STDCALL +FPDFPageObj_NewImgeObj(FPDF_DOCUMENT document); + +// Load an image from a JPEG image file and then set it into |image_object|. +// +// pages - pointer to the start of all loaded pages, may be NULL. +// nCount - number of |pages|, may be 0. +// image_object - handle to an image object. +// fileAccess - file access handler which specifies the JPEG image file. +// +// Returns TRUE on success. +// +// The image object might already have an associated image, which is shared and +// cached by the loaded pages. In that case, we need to clear the cached image +// for all the loaded pages. Pass |pages| and page count (|nCount|) to this API +// to clear the image cache. If the image is not previously shared, or NULL is a +// valid |pages| value. +DLLEXPORT FPDF_BOOL STDCALL +FPDFImageObj_LoadJpegFile(FPDF_PAGE* pages, + int nCount, + FPDF_PAGEOBJECT image_object, + FPDF_FILEACCESS* fileAccess); + +// Load an image from a JPEG image file and then set it into |image_object|. +// +// pages - pointer to the start of all loaded pages, may be NULL. +// nCount - number of |pages|, may be 0. +// image_object - handle to an image object. +// fileAccess - file access handler which specifies the JPEG image file. +// +// Returns TRUE on success. +// +// The image object might already have an associated image, which is shared and +// cached by the loaded pages. In that case, we need to clear the cached image +// for all the loaded pages. Pass |pages| and page count (|nCount|) to this API +// to clear the image cache. If the image is not previously shared, or NULL is a +// valid |pages| value. This function loads the JPEG image inline, so the image +// content is copied to the file. This allows |fileAccess| and its associated +// data to be deleted after this function returns. +DLLEXPORT FPDF_BOOL STDCALL +FPDFImageObj_LoadJpegFileInline(FPDF_PAGE* pages, + int nCount, + FPDF_PAGEOBJECT image_object, + FPDF_FILEACCESS* fileAccess); + +// Set the transform matrix of |image_object|. +// +// image_object - handle to an image object. +// a - matrix value. +// b - matrix value. +// c - matrix value. +// d - matrix value. +// e - matrix value. +// f - matrix value. +// +// The matrix is composed as: +// |a c e| +// |b d f| +// and can be used to scale, rotate, shear and translate the |page| annotations. +// +// Returns TRUE on success. +DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetMatrix(FPDF_PAGEOBJECT image_object, + double a, + double b, + double c, + double d, + double e, + double f); + +// Set |bitmap| to |image_object|. +// +// pages - pointer to the start of all loaded pages, may be NULL. +// nCount - number of |pages|, may be 0. +// image_object - handle to an image object. +// bitmap - handle of the bitmap. +// +// Returns TRUE on success. +DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetBitmap(FPDF_PAGE* pages, + int nCount, + FPDF_PAGEOBJECT image_object, + FPDF_BITMAP bitmap); + +// Create a new path object at an initial position. +// +// x - initial horizontal position. +// y - initial vertical position. +// +// Returns a handle to a new path object. +DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_CreateNewPath(float x, float y); + +// Create a closed path consisting of a rectangle. +// +// x - horizontal position for the left boundary of the rectangle. +// y - vertical position for the bottom boundary of the rectangle. +// w - width of the rectangle. +// h - height of the rectangle. +// +// Returns a handle to the new path object. +DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_CreateNewRect(float x, + float y, + float w, + float h); + +// Set the stroke RGBA of a path. Range of values: 0 - 255. +// +// path - the handle to the path object. +// R - the red component for the path stroke color. +// G - the green component for the path stroke color. +// B - the blue component for the path stroke color. +// A - the stroke alpha for the path. +// +// Returns TRUE on success. +DLLEXPORT FPDF_BOOL FPDFPath_SetStrokeColor(FPDF_PAGEOBJECT path, + unsigned int R, + unsigned int G, + unsigned int B, + unsigned int A); + +// Set the stroke width of a path. +// +// path - the handle to the path object. +// width - the width of the stroke. +// +// Returns TRUE on success +DLLEXPORT FPDF_BOOL FPDFPath_SetStrokeWidth(FPDF_PAGEOBJECT path, float width); + +// Set the fill RGBA of a path. Range of values: 0 - 255. +// +// path - the handle to the path object. +// R - the red component for the path fill color. +// G - the green component for the path fill color. +// B - the blue component for the path fill color. +// A - the fill alpha for the path. +// +// Returns TRUE on success. +DLLEXPORT FPDF_BOOL FPDFPath_SetFillColor(FPDF_PAGEOBJECT path, + unsigned int R, + unsigned int G, + unsigned int B, + unsigned int A); + +// Move a path's current point. +// +// path - the handle to the path object. +// x - the horizontal position of the new current point. +// y - the vertical position of the new current point. +// +// Note that no line will be created between the previous current point and the +// new one. +// +// Returns TRUE on success +DLLEXPORT FPDF_BOOL FPDFPath_MoveTo(FPDF_PAGEOBJECT path, float x, float y); + +// Add a line between the current point and a new point in the path. +// +// path - the handle to the path object. +// x - the horizontal position of the new point. +// y - the vertical position of the new point. +// +// The path's current point is changed to (x, y). +// +// Returns TRUE on success +DLLEXPORT FPDF_BOOL FPDFPath_LineTo(FPDF_PAGEOBJECT path, float x, float y); + +// Add a cubic Bezier curve to the given path, starting at the current point. +// +// path - the handle to the path object. +// x1 - the horizontal position of the first Bezier control point. +// y1 - the vertical position of the first Bezier control point. +// x2 - the horizontal position of the second Bezier control point. +// y2 - the vertical position of the second Bezier control point. +// x3 - the horizontal position of the ending point of the Bezier curve. +// y3 - the vertical position of the ending point of the Bezier curve. +// +// Returns TRUE on success +DLLEXPORT FPDF_BOOL FPDFPath_BezierTo(FPDF_PAGEOBJECT path, + float x1, + float y1, + float x2, + float y2, + float x3, + float y3); + +// Close the current subpath of a given path. +// +// path - the handle to the path object. +// +// This will add a line between the current point and the initial point of the +// subpath, thus terminating the current subpath. +// +// Returns TRUE on success +DLLEXPORT FPDF_BOOL FPDFPath_Close(FPDF_PAGEOBJECT path); + +// Set the drawing mode of a path. +// +// path - the handle to the path object. +// fillmode - the filling mode to be set: 0 for no fill, 1 for alternate, 2 for +// winding. +// stroke - a boolean specifying if the path should be stroked or not. +// +// Returns TRUE on success +DLLEXPORT FPDF_BOOL FPDFPath_SetDrawMode(FPDF_PAGEOBJECT path, + int fillmode, + FPDF_BOOL stroke); + +// Create a new text object using one of the standard PDF fonts. +// +// document - handle to the document. +// font - string containing the font name, without spaces. +// font_size - the font size for the new text object. +// +// Returns a handle to a new text object, or NULL on failure +DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_NewTextObj(FPDF_DOCUMENT document, + FPDF_BYTESTRING font, + float font_size); + +// Set the text for a textobject. If it had text, it will be replaced. +// +// text_object - handle to the text object. +// text - string containing the text to be added. +// +// Returns TRUE on success +DLLEXPORT FPDF_BOOL STDCALL FPDFText_SetText(FPDF_PAGEOBJECT text_object, + FPDF_BYTESTRING text); + +// Returns a type 1 font object loaded from a stream of data. The font is loaded +// into the document. The caller does not need to free the returned object. +// +// document - handle to the document. +// data - the stream of data, which will be copied by the font object. +// size - size of the stream, in bytes. +// +// Returns NULL on failure +DLLEXPORT FPDF_FONT STDCALL FPDFText_LoadType1Font(FPDF_DOCUMENT document, + const uint8_t* data, + uint32_t size); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // PUBLIC_FPDF_EDIT_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_ext.h b/modules/pdfium/pdfium/public/fpdf_ext.h new file mode 100644 index 000000000000..346587899018 --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_ext.h @@ -0,0 +1,98 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_EXT_H_ +#define PUBLIC_FPDF_EXT_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Unsupported XFA form. +#define FPDF_UNSP_DOC_XFAFORM 1 +// Unsupported portable collection. +#define FPDF_UNSP_DOC_PORTABLECOLLECTION 2 +// Unsupported attachment. +#define FPDF_UNSP_DOC_ATTACHMENT 3 +// Unsupported security. +#define FPDF_UNSP_DOC_SECURITY 4 +// Unsupported shared review. +#define FPDF_UNSP_DOC_SHAREDREVIEW 5 +// Unsupported shared form, acrobat. +#define FPDF_UNSP_DOC_SHAREDFORM_ACROBAT 6 +// Unsupported shared form, filesystem. +#define FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM 7 +// Unsupported shared form, email. +#define FPDF_UNSP_DOC_SHAREDFORM_EMAIL 8 +// Unsupported 3D annotation. +#define FPDF_UNSP_ANNOT_3DANNOT 11 +// Unsupported movie annotation. +#define FPDF_UNSP_ANNOT_MOVIE 12 +// Unsupported sound annotation. +#define FPDF_UNSP_ANNOT_SOUND 13 +// Unsupported screen media annotation. +#define FPDF_UNSP_ANNOT_SCREEN_MEDIA 14 +// Unsupported screen rich media annotation. +#define FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA 15 +// Unsupported attachment annotation. +#define FPDF_UNSP_ANNOT_ATTACHMENT 16 +// Unsupported signature annotation. +#define FPDF_UNSP_ANNOT_SIG 17 + +// Interface for unsupported feature notifications. +typedef struct _UNSUPPORT_INFO { + // Version number of the interface. Must be 1. + int version; + + // Unsupported object notification function. + // Interface Version: 1 + // Implementation Required: Yes + // + // pThis - pointer to the interface structure. + // nType - the type of unsupported object. One of the |FPDF_UNSP_*| entries. + void (*FSDK_UnSupport_Handler)(struct _UNSUPPORT_INFO* pThis, int nType); +} UNSUPPORT_INFO; + +// Setup an unsupported object handler. +// +// unsp_info - Pointer to an UNSUPPORT_INFO structure. +// +// Returns TRUE on success. +DLLEXPORT FPDF_BOOL STDCALL +FSDK_SetUnSpObjProcessHandler(UNSUPPORT_INFO* unsp_info); + +// Unknown page mode. +#define PAGEMODE_UNKNOWN -1 +// Document outline, and thumbnails hidden. +#define PAGEMODE_USENONE 0 +// Document outline visible. +#define PAGEMODE_USEOUTLINES 1 +// Thumbnail images visible. +#define PAGEMODE_USETHUMBS 2 +// Full-screen mode, no menu bar, window controls, or other decorations visible. +#define PAGEMODE_FULLSCREEN 3 +// Optional content group panel visible. +#define PAGEMODE_USEOC 4 +// Attachments panel visible. +#define PAGEMODE_USEATTACHMENTS 5 + +// Get the document's PageMode. +// +// doc - Handle to document. +// +// Returns one of the |PAGEMODE_*| flags defined above. +// +// The page mode defines how the document should be initially displayed. +DLLEXPORT int STDCALL FPDFDoc_GetPageMode(FPDF_DOCUMENT document); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // PUBLIC_FPDF_EXT_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_flatten.h b/modules/pdfium/pdfium/public/fpdf_flatten.h new file mode 100644 index 000000000000..c1e354e90675 --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_flatten.h @@ -0,0 +1,44 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_FLATTEN_H_ +#define PUBLIC_FPDF_FLATTEN_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +// Flatten operation failed. +#define FLATTEN_FAIL 0 +// Flatten operation succeed. +#define FLATTEN_SUCCESS 1 +// Nothing to be flattened. +#define FLATTEN_NOTHINGTODO 2 + +// Flatten for normal display. +#define FLAT_NORMALDISPLAY 0 +// Flatten for print. +#define FLAT_PRINT 1 + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Flatten annotations and form fields into the page contents. +// +// page - handle to the page. +// nFlag - One of the |FLAT_*| values denoting the page usage. +// +// Returns one of the |FLATTEN_*| values. +// +// Currently, all failures return |FLATTEN_FAIL| with no indication of the +// cause. +DLLEXPORT int STDCALL FPDFPage_Flatten(FPDF_PAGE page, int nFlag); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // PUBLIC_FPDF_FLATTEN_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_formfill.h b/modules/pdfium/pdfium/public/fpdf_formfill.h new file mode 100644 index 000000000000..09b80eaf90b7 --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_formfill.h @@ -0,0 +1,1764 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_FORMFILL_H_ +#define PUBLIC_FPDF_FORMFILL_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +typedef void* FPDF_FORMHANDLE; + +#ifdef PDF_ENABLE_XFA +#define DOCTYPE_PDF 0 // Normal pdf Document +#define DOCTYPE_DYNAMIC_XFA 1 // Dynamic xfa Document Type +#define DOCTYPE_STATIC_XFA 2 // Static xfa Document Type +#endif // PDF_ENABLE_XFA + +// Exported Functions +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _IPDF_JsPlatform { + /** + * Version number of the interface. Currently must be 2. + **/ + int version; + + /* Version 1. */ + + /** + * Method: app_alert + * pop up a dialog to show warning or hint. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself + * Msg - A string containing the message to be displayed. + * Title - The title of the dialog. + * Type - The stype of button group. + * 0-OK(default); + * 1-OK,Cancel; + * 2-Yes,NO; + * 3-Yes, NO, Cancel. + * nIcon - The Icon type. + * 0-Error(default); + * 1-Warning; + * 2-Question; + * 3-Status. + * 4-Asterisk + * Return Value: + * The return value could be the folowing type: + * 1-OK; + * 2-Cancel; + * 3-NO; + * 4-Yes; + */ + int (*app_alert)(struct _IPDF_JsPlatform* pThis, + FPDF_WIDESTRING Msg, + FPDF_WIDESTRING Title, + int Type, + int Icon); + + /** + * Method: app_beep + * Causes the system to play a sound. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself + * nType - The sound type. + * 0 - Error + * 1 - Warning + * 2 - Question + * 3 - Status + * 4 - Default (default value) + * Return Value: + * None + */ + void (*app_beep)(struct _IPDF_JsPlatform* pThis, int nType); + + /** + * Method: app_response + * Displays a dialog box containing a question and an entry field for + * the user to reply to the question. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself + * Question - The question to be posed to the user. + * Title - The title of the dialog box. + * Default - A default value for the answer to the question. If + * not specified, no default value is presented. + * cLabel - A short string to appear in front of and on the + * same line as the edit text field. + * bPassword - If true, indicates that the user's response should + * show as asterisks (*) or bullets (?) to mask the response, which might be + * sensitive information. The default is false. + * response - A string buffer allocated by SDK, to receive the + * user's response. + * length - The length of the buffer, number of bytes. + * Currently, It's always be 2048. + * Return Value: + * Number of bytes the complete user input would actually require, not + * including trailing zeros, regardless of the value of the length + * parameter or the presence of the response buffer. + * Comments: + * No matter on what platform, the response buffer should be always + * written using UTF-16LE encoding. If a response buffer is + * present and the size of the user input exceeds the capacity of the + * buffer as specified by the length parameter, only the + * first "length" bytes of the user input are to be written to the + * buffer. + */ + int (*app_response)(struct _IPDF_JsPlatform* pThis, + FPDF_WIDESTRING Question, + FPDF_WIDESTRING Title, + FPDF_WIDESTRING Default, + FPDF_WIDESTRING cLabel, + FPDF_BOOL bPassword, + void* response, + int length); + + /* + * Method: Doc_getFilePath + * Get the file path of the current document. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself + * filePath - The string buffer to receive the file path. Can be + * NULL. + * length - The length of the buffer, number of bytes. Can be + * 0. + * Return Value: + * Number of bytes the filePath consumes, including trailing zeros. + * Comments: + * The filePath should be always input in local encoding. + * + * The return value always indicated number of bytes required for the + * buffer , even when there is no buffer specified, or the buffer size is + * less than required. In this case, the buffer will not be modified. + */ + int (*Doc_getFilePath)(struct _IPDF_JsPlatform* pThis, + void* filePath, + int length); + + /* + * Method: Doc_mail + * Mails the data buffer as an attachment to all recipients, with or + * without user interaction. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself + * mailData - Pointer to the data buffer to be sent.Can be NULL. + * length - The size,in bytes, of the buffer pointed by + * mailData parameter.Can be 0. + * bUI - If true, the rest of the parameters are used in a + * compose-new-message window that is displayed to the user. If false, the cTo + * parameter is required and all others are optional. + * To - A semicolon-delimited list of recipients for the + * message. + * Subject - The subject of the message. The length limit is 64 + * KB. + * CC - A semicolon-delimited list of CC recipients for + * the message. + * BCC - A semicolon-delimited list of BCC recipients for + * the message. + * Msg - The content of the message. The length limit is 64 + * KB. + * Return Value: + * None. + * Comments: + * If the parameter mailData is NULL or length is 0, the current + * document will be mailed as an attachment to all recipients. + */ + void (*Doc_mail)(struct _IPDF_JsPlatform* pThis, + void* mailData, + int length, + FPDF_BOOL bUI, + FPDF_WIDESTRING To, + FPDF_WIDESTRING Subject, + FPDF_WIDESTRING CC, + FPDF_WIDESTRING BCC, + FPDF_WIDESTRING Msg); + + /* + * Method: Doc_print + * Prints all or a specific number of pages of the document. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * bUI - If true, will cause a UI to be presented to the + * user to obtain printing information and confirm the action. + * nStart - A 0-based index that defines the start of an + * inclusive range of pages. + * nEnd - A 0-based index that defines the end of an + * inclusive page range. + * bSilent - If true, suppresses the cancel dialog box while + * the document is printing. The default is false. + * bShrinkToFit - If true, the page is shrunk (if necessary) to + * fit within the imageable area of the printed page. + * bPrintAsImage - If true, print pages as an image. + * bReverse - If true, print from nEnd to nStart. + * bAnnotations - If true (the default), annotations are + * printed. + */ + void (*Doc_print)(struct _IPDF_JsPlatform* pThis, + FPDF_BOOL bUI, + int nStart, + int nEnd, + FPDF_BOOL bSilent, + FPDF_BOOL bShrinkToFit, + FPDF_BOOL bPrintAsImage, + FPDF_BOOL bReverse, + FPDF_BOOL bAnnotations); + + /* + * Method: Doc_submitForm + * Send the form data to a specified URL. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself + * formData - Pointer to the data buffer to be sent. + * length - The size,in bytes, of the buffer pointed by + * formData parameter. + * URL - The URL to send to. + * Return Value: + * None. + * + */ + void (*Doc_submitForm)(struct _IPDF_JsPlatform* pThis, + void* formData, + int length, + FPDF_WIDESTRING URL); + + /* + * Method: Doc_gotoPage + * Jump to a specified page. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself + * nPageNum - The specified page number, zero for the first + * page. + * Return Value: + * None. + * + */ + void (*Doc_gotoPage)(struct _IPDF_JsPlatform* pThis, int nPageNum); + /* + * Method: Field_browse + * Show a file selection dialog, and return the selected file path. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * filePath - Pointer to the data buffer to receive the file + * path.Can be NULL. + * length - The length of the buffer, number of bytes. Can be + * 0. + * Return Value: + * Number of bytes the filePath consumes, including trailing zeros. + * Comments: + * The filePath shoule be always input in local encoding. + */ + int (*Field_browse)(struct _IPDF_JsPlatform* pThis, + void* filePath, + int length); + + /** + * pointer to FPDF_FORMFILLINFO interface. + **/ + void* m_pFormfillinfo; + + /* Version 2. */ + + void* m_isolate; /* Unused in v3, retain for compatibility. */ + unsigned int m_v8EmbedderSlot; /* Unused in v3, retain for compatibility. */ + + /* Version 3. */ + /* Version 3 moves m_Isolate and m_v8EmbedderSlot to FPDF_LIBRARY_CONFIG. */ +} IPDF_JSPLATFORM; + +// Flags for Cursor type +#define FXCT_ARROW 0 +#define FXCT_NESW 1 +#define FXCT_NWSE 2 +#define FXCT_VBEAM 3 +#define FXCT_HBEAM 4 +#define FXCT_HAND 5 + +/** + * Function signature for the callback function passed to the FFI_SetTimer + * method. + * Parameters: + * idEvent - Identifier of the timer. + * Return value: + * None. + **/ +typedef void (*TimerCallback)(int idEvent); + +/** + * Declares of a struct type to the local system time. +**/ +typedef struct _FPDF_SYSTEMTIME { + unsigned short wYear; /* years since 1900 */ + unsigned short wMonth; /* months since January - [0,11] */ + unsigned short wDayOfWeek; /* days since Sunday - [0,6] */ + unsigned short wDay; /* day of the month - [1,31] */ + unsigned short wHour; /* hours since midnight - [0,23] */ + unsigned short wMinute; /* minutes after the hour - [0,59] */ + unsigned short wSecond; /* seconds after the minute - [0,59] */ + unsigned short wMilliseconds; /* milliseconds after the second - [0,999] */ +} FPDF_SYSTEMTIME; + +#ifdef PDF_ENABLE_XFA +// XFA +/** + * @name Pageview event flags + */ +/*@{*/ +/** @brief After a new pageview is added. */ +#define FXFA_PAGEVIEWEVENT_POSTADDED 1 +/** @brief After a pageview is removed. */ +#define FXFA_PAGEVIEWEVENT_POSTREMOVED 3 +/*@}*/ + +// menu +/** + * @name Macro Definitions for Right Context Menu Features Of XFA Fields + */ +/*@{*/ +#define FXFA_MENU_COPY 1 +#define FXFA_MENU_CUT 2 +#define FXFA_MENU_SELECTALL 4 +#define FXFA_MENU_UNDO 8 +#define FXFA_MENU_REDO 16 +#define FXFA_MENU_PASTE 32 +/*@}*/ + +// file type +/** + * @name Macro Definitions for File Type. + */ +/*@{*/ +#define FXFA_SAVEAS_XML 1 +#define FXFA_SAVEAS_XDP 2 +/*@}*/ +#endif // PDF_ENABLE_XFA + +typedef struct _FPDF_FORMFILLINFO { + /** + * Version number of the interface. Currently must be 1 (when PDFium is built + * without the XFA module) or must be 2 (when built with the XFA module). + **/ + int version; + + /* Version 1. */ + /** + *Method: Release + * Give implementation a chance to release any data after the + * interface is no longer used + *Interface Version: + * 1 + *Implementation Required: + * No + *Comments: + * Called by Foxit SDK during the final cleanup process. + *Parameters: + * pThis - Pointer to the interface structure itself + *Return Value: + * None + */ + void (*Release)(struct _FPDF_FORMFILLINFO* pThis); + + /** + * Method: FFI_Invalidate + * Invalidate the client area within the specified rectangle. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * page - Handle to the page. Returned by FPDF_LoadPage + *function. + * left - Left position of the client area in PDF page + *coordinate. + * top - Top position of the client area in PDF page + *coordinate. + * right - Right position of the client area in PDF page + *coordinate. + * bottom - Bottom position of the client area in PDF page + *coordinate. + * Return Value: + * None. + * + *comments: + * All positions are measured in PDF "user space". + * Implementation should call FPDF_RenderPageBitmap() function for + *repainting a specified page area. + */ + void (*FFI_Invalidate)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_PAGE page, + double left, + double top, + double right, + double bottom); + + /** + * Method: FFI_OutputSelectedRect + * When user is taking the mouse to select texts on a form field, + * this callback function will keep + * returning the selected areas to the implementation. + * + * Interface Version: + * 1 + * Implementation Required: + * No + * Parameters: + * pThis - Pointer to the interface structure itself. + * page - Handle to the page. Returned by FPDF_LoadPage + * function. + * left - Left position of the client area in PDF page + * coordinate. + * top - Top position of the client area in PDF page + * coordinate. + * right - Right position of the client area in PDF page + * coordinate. + * bottom - Bottom position of the client area in PDF page + * coordinate. + * Return Value: + * None. + * + * comments: + * This CALLBACK function is useful for implementing special text + * selection effect. Implementation should + * first records the returned rectangles, then draw them one by one + * at the painting period, last,remove all + * the recorded rectangles when finish painting. + */ + void (*FFI_OutputSelectedRect)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_PAGE page, + double left, + double top, + double right, + double bottom); + + /** + * Method: FFI_SetCursor + * Set the Cursor shape. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * nCursorType - Cursor type. see Flags for Cursor type for the + * details. + * Return value: + * None. + * */ + void (*FFI_SetCursor)(struct _FPDF_FORMFILLINFO* pThis, int nCursorType); + + /** + * Method: FFI_SetTimer + * This method installs a system timer. An interval value is specified, + * and every time that interval elapses, the system must call into the + * callback function with the timer ID as returned by this function. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * uElapse - Specifies the time-out value, in milliseconds. + * lpTimerFunc - A pointer to the callback function-TimerCallback. + * Return value: + * The timer identifier of the new timer if the function is successful. + * An application passes this value to the FFI_KillTimer method to kill + * the timer. Nonzero if it is successful; otherwise, it is zero. + * */ + int (*FFI_SetTimer)(struct _FPDF_FORMFILLINFO* pThis, + int uElapse, + TimerCallback lpTimerFunc); + + /** + * Method: FFI_KillTimer + * This method uninstalls a system timer identified by nIDEvent, as + * set by an earlier call to FFI_SetTimer. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * nTimerID - The timer ID returned by FFI_SetTimer function. + * Return value: + * None. + * */ + void (*FFI_KillTimer)(struct _FPDF_FORMFILLINFO* pThis, int nTimerID); + + /** + * Method: FFI_GetLocalTime + * This method receives the current local time on the system. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * Return value: + * None. + * */ + FPDF_SYSTEMTIME (*FFI_GetLocalTime)(struct _FPDF_FORMFILLINFO* pThis); + + /** + * Method: FFI_OnChange + * This method will be invoked to notify implementation when the + * value of any FormField on the document had been changed. + * Interface Version: + * 1 + * Implementation Required: + * no + * Parameters: + * pThis - Pointer to the interface structure itself. + * Return value: + * None. + * */ + void (*FFI_OnChange)(struct _FPDF_FORMFILLINFO* pThis); + + /** + * Method: FFI_GetPage + * This method receives the page pointer associated with a specified + * page index. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * document - Handle to document. Returned by FPDF_LoadDocument + * function. + * nPageIndex - Index number of the page. 0 for the first page. + * Return value: + * Handle to the page. Returned by FPDF_LoadPage function. + * Comments: + * In some cases, the document-level JavaScript action may refer to a + * page which hadn't been loaded yet. + * To successfully run the javascript action, implementation need to load + * the page for SDK. + * */ + FPDF_PAGE (*FFI_GetPage)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_DOCUMENT document, + int nPageIndex); + + /** + * Method: FFI_GetCurrentPage + * This method receives the current page pointer. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * document - Handle to document. Returned by FPDF_LoadDocument + * function. + * Return value: + * Handle to the page. Returned by FPDF_LoadPage function. + * */ + FPDF_PAGE (*FFI_GetCurrentPage)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_DOCUMENT document); + + /** + * Method: FFI_GetRotation + * This method receives currently rotation of the page view. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * page - Handle to page. Returned by FPDF_LoadPage function. + * Return value: + * The page rotation. Should be 0(0 degree),1(90 degree),2(180 + * degree),3(270 degree), in a clockwise direction. + * + * Note: Unused. + * */ + int (*FFI_GetRotation)(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page); + + /** + * Method: FFI_ExecuteNamedAction + * This method will execute an named action. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * namedAction - A byte string which indicates the named action, + * terminated by 0. + * Return value: + * None. + * Comments: + * See the named actions description of <> + * for more details. + * */ + void (*FFI_ExecuteNamedAction)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_BYTESTRING namedAction); + /** + * @brief This method will be called when a text field is getting or losing a + * focus. + * + * @param[in] pThis Pointer to the interface structure itself. + * @param[in] value The string value of the form field, in UTF-16LE + * format. + * @param[in] valueLen The length of the string value, number of characters + * (not bytes). + * @param[in] is_focus True if the form field is getting a focus, False for + * losing a focus. + * + * @return None. + * + * @note Currently,only support text field and combobox field. + * */ + void (*FFI_SetTextFieldFocus)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_WIDESTRING value, + FPDF_DWORD valueLen, + FPDF_BOOL is_focus); + + /** + * Method: FFI_DoURIAction + * This action resolves to a uniform resource identifier. + * Interface Version: + * 1 + * Implementation Required: + * No + * Parameters: + * pThis - Pointer to the interface structure itself. + * bsURI - A byte string which indicates the uniform resource + * identifier, terminated by 0. + * Return value: + * None. + * Comments: + * See the URI actions description of <> for + * more details. + * */ + void (*FFI_DoURIAction)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_BYTESTRING bsURI); + + /** + * Method: FFI_DoGoToAction + * This action changes the view to a specified destination. + * Interface Version: + * 1 + * Implementation Required: + * No + * Parameters: + * pThis - Pointer to the interface structure itself. + * nPageIndex - The index of the PDF page. + * zoomMode - The zoom mode for viewing page. See below. + * fPosArray - The float array which carries the position info. + * sizeofArray - The size of float array. + * + * PDFZoom values: + * - XYZ = 1 + * - FITPAGE = 2 + * - FITHORZ = 3 + * - FITVERT = 4 + * - FITRECT = 5 + * - FITBBOX = 6 + * - FITBHORZ = 7 + * - FITBVERT = 8 + * + * Return value: + * None. + * Comments: + * See the Destinations description of <> in + *8.2.1 for more details. + **/ + void (*FFI_DoGoToAction)(struct _FPDF_FORMFILLINFO* pThis, + int nPageIndex, + int zoomMode, + float* fPosArray, + int sizeofArray); + + /** + * pointer to IPDF_JSPLATFORM interface + **/ + IPDF_JSPLATFORM* m_pJsPlatform; + +#ifdef PDF_ENABLE_XFA + /* Version 2. */ + /** + * Method: FFI_DisplayCaret + * This method will show the caret at specified position. + * Interface Version: + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * page - Handle to page. Returned by FPDF_LoadPage + *function. + * left - Left position of the client area in PDF page + *coordinate. + * top - Top position of the client area in PDF page + *coordinate. + * right - Right position of the client area in PDF page + *coordinate. + * bottom - Bottom position of the client area in PDF page + *coordinate. + * Return value: + * None. + **/ + void (*FFI_DisplayCaret)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_PAGE page, + FPDF_BOOL bVisible, + double left, + double top, + double right, + double bottom); + + /** + * Method: FFI_GetCurrentPageIndex + * This method will get the current page index. + * Interface Version: + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * document - Handle to document. Returned by FPDF_LoadDocument + *function. + * Return value: + * The index of current page. + **/ + int (*FFI_GetCurrentPageIndex)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_DOCUMENT document); + + /** + * Method: FFI_SetCurrentPage + * This method will set the current page. + * Interface Version: + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * document - Handle to document. Returned by FPDF_LoadDocument + *function. + * iCurPage - The index of the PDF page. + * Return value: + * None. + **/ + void (*FFI_SetCurrentPage)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_DOCUMENT document, + int iCurPage); + + /** + * Method: FFI_GotoURL + * This method will link to the specified URL. + * Interface Version: + * 2 + * Implementation Required: + * no + * Parameters: + * pThis - Pointer to the interface structure itself. + * document - Handle to document. Returned by FPDF_LoadDocument + *function. + * wsURL - The string value of the URL, in UTF-16LE format. + * Return value: + * None. + **/ + void (*FFI_GotoURL)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_DOCUMENT document, + FPDF_WIDESTRING wsURL); + + /** + * Method: FFI_GetPageViewRect + * This method will get the current page view rectangle. + * Interface Version: + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * page - Handle to page. Returned by FPDF_LoadPage + *function. + * left - The pointer to receive left position of the page + *view area in PDF page coordinate. + * top - The pointer to receive top position of the page + *view area in PDF page coordinate. + * right - The pointer to receive right position of the + *client area in PDF page coordinate. + * bottom - The pointer to receive bottom position of the + *client area in PDF page coordinate. + * Return value: + * None. + **/ + void (*FFI_GetPageViewRect)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_PAGE page, + double* left, + double* top, + double* right, + double* bottom); + + /** + * Method: FFI_PageEvent + * This method fires when pages have been added to or deleted from the XFA + * document. + * Interface Version: + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * page_count - The number of pages to be added to or deleted from the + * document. + * event_type - See FXFA_PAGEVIEWEVENT_* above. + * Return value: + * None. + * Comments: + * The pages to be added or deleted always start from the last page + * of document. This means that if parameter page_count is 2 and + * event type is FXFA_PAGEVIEWEVENT_POSTADDED, 2 new pages have been + * appended to the tail of document; If page_count is 2 and + * event type is FXFA_PAGEVIEWEVENT_POSTREMOVED, the last 2 pages + * have been deleted. + **/ + void (*FFI_PageEvent)(struct _FPDF_FORMFILLINFO* pThis, + int page_count, + FPDF_DWORD event_type); + + /** + * Method: FFI_PopupMenu + * This method will track the right context menu for XFA fields. + * Interface Version: + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * page - Handle to page. Returned by FPDF_LoadPage + *function. + * hWidget - Handle to XFA fields. + * menuFlag - The menu flags. Please refer to macro definition + *of FXFA_MENU_XXX and this can be one or a combination of these macros. + * x - X position of the client area in PDF page + *coordinate. + * y - Y position of the client area in PDF page + *coordinate. + * Return value: + * TRUE indicates success; otherwise false. + **/ + FPDF_BOOL (*FFI_PopupMenu)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_PAGE page, + FPDF_WIDGET hWidget, + int menuFlag, + float x, + float y); + + /** + * Method: FFI_OpenFile + * This method will open the specified file with the specified mode. + * Interface Version + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * fileFlag - The file flag.Please refer to macro definition of + *FXFA_SAVEAS_XXX and this can be one of these macros. + * wsURL - The string value of the file URL, in UTF-16LE + *format. + * mode - The mode for open file. + * Return value: + * The handle to FPDF_FILEHANDLER. + **/ + FPDF_FILEHANDLER* (*FFI_OpenFile)(struct _FPDF_FORMFILLINFO* pThis, + int fileFlag, + FPDF_WIDESTRING wsURL, + const char* mode); + + /** + * Method: FFI_EmailTo + * This method will email the specified file stream to the specified + *contacter. + * Interface Version: + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * pFileHandler - Handle to the FPDF_FILEHANDLER. + * pTo - A semicolon-delimited list of recipients for the + *message,in UTF-16LE format. + * pSubject - The subject of the message,in UTF-16LE format. + * pCC - A semicolon-delimited list of CC recipients for + *the message,in UTF-16LE format. + * pBcc - A semicolon-delimited list of BCC recipients for + *the message,in UTF-16LE format. + * pMsg - Pointer to the data buffer to be sent.Can be + *NULL,in UTF-16LE format. + * Return value: + * None. + **/ + void (*FFI_EmailTo)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_FILEHANDLER* fileHandler, + FPDF_WIDESTRING pTo, + FPDF_WIDESTRING pSubject, + FPDF_WIDESTRING pCC, + FPDF_WIDESTRING pBcc, + FPDF_WIDESTRING pMsg); + + /** + * Method: FFI_UploadTo + * This method will get upload the specified file stream to the + *specified URL. + * Interface Version: + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * pFileHandler - Handle to the FPDF_FILEHANDLER. + * fileFlag - The file flag.Please refer to macro definition of + *FXFA_SAVEAS_XXX and this can be one of these macros. + * uploadTo - Pointer to the URL path, in UTF-16LE format. + * Return value: + * None. + **/ + void (*FFI_UploadTo)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_FILEHANDLER* fileHandler, + int fileFlag, + FPDF_WIDESTRING uploadTo); + + /** + * Method: FFI_GetPlatform + * This method will get the current platform. + * Interface Version: + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * platform - Pointer to the data buffer to receive the + *platform.Can be NULL,in UTF-16LE format. + * length - The length of the buffer, number of bytes. Can be + *0. + * Return value: + * The length of the buffer, number of bytes. + **/ + int (*FFI_GetPlatform)(struct _FPDF_FORMFILLINFO* pThis, + void* platform, + int length); + + /** + * Method: FFI_GetLanguage + * This method will get the current language. + * Interface Version: + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * language - Pointer to the data buffer to receive the current + *language.Can be NULL. + * length - The length of the buffer, number of bytes. Can be + *0. + * Return value: + * The length of the buffer, number of bytes. + **/ + int (*FFI_GetLanguage)(struct _FPDF_FORMFILLINFO* pThis, + void* language, + int length); + + /** + * Method: FFI_DownloadFromURL + * This method will download the specified file from the URL. + * Interface Version: + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * URL - The string value of the file URL, in UTF-16LE + *format. + * Return value: + * The handle to FPDF_FILEHANDLER. + **/ + FPDF_LPFILEHANDLER (*FFI_DownloadFromURL)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_WIDESTRING URL); + /** + * Method: FFI_PostRequestURL + * This method will post the request to the server URL. + * Interface Version: + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * wsURL - The string value of the server URL, in UTF-16LE + *format. + * wsData - The post data,in UTF-16LE format. + * wsContentType - The content type of the request data,in UTF-16LE + *format. + * wsEncode - The encode type,in UTF-16LE format. + * wsHeader - The request header,in UTF-16LE format. + * response - Pointer to the FPDF_BSTR to receive the response + *data from server,,in UTF-16LE format. + * Return value: + * TRUE indicates success, otherwise FALSE. + **/ + FPDF_BOOL (*FFI_PostRequestURL)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_WIDESTRING wsURL, + FPDF_WIDESTRING wsData, + FPDF_WIDESTRING wsContentType, + FPDF_WIDESTRING wsEncode, + FPDF_WIDESTRING wsHeader, + FPDF_BSTR* respone); + + /** + * Method: FFI_PutRequestURL + * This method will put the request to the server URL. + * Interface Version: + * 2 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself. + * wsURL - The string value of the server URL, in UTF-16LE + *format. + * wsData - The put data, in UTF-16LE format. + * wsEncode - The encode type, in UTR-16LE format. + * Return value: + * TRUE indicates success, otherwise FALSE. + **/ + FPDF_BOOL (*FFI_PutRequestURL)(struct _FPDF_FORMFILLINFO* pThis, + FPDF_WIDESTRING wsURL, + FPDF_WIDESTRING wsData, + FPDF_WIDESTRING wsEncode); +#endif // PDF_ENABLE_XFA +} FPDF_FORMFILLINFO; + +/** + * Function: FPDFDOC_InitFormFillEnvironment + * Init form fill environment. + * Comments: + * This function should be called before any form fill operation. + * Parameters: + * document - Handle to document. Returned by + *FPDF_LoadDocument function. + * pFormFillInfo - Pointer to a FPDF_FORMFILLINFO structure. + * Return Value: + * Return handler to the form fill module. NULL means fails. + **/ +DLLEXPORT FPDF_FORMHANDLE STDCALL +FPDFDOC_InitFormFillEnvironment(FPDF_DOCUMENT document, + FPDF_FORMFILLINFO* formInfo); + +/** + * Function: FPDFDOC_ExitFormFillEnvironment + * Exit form fill environment. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + *FPDFDOC_InitFormFillEnvironment. + * Return Value: + * NULL. + **/ +DLLEXPORT void STDCALL FPDFDOC_ExitFormFillEnvironment(FPDF_FORMHANDLE hHandle); + +/** + * Function: FORM_OnAfterLoadPage + * This method is required for implementing all the form related + *functions. Should be invoked after user + * successfully loaded a PDF page, and method + *FPDFDOC_InitFormFillEnvironment had been invoked. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + *FPDFDOC_InitFormFillEnvironment. + * Return Value: + * NONE. + **/ +DLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page, + FPDF_FORMHANDLE hHandle); + +/** + * Function: FORM_OnBeforeClosePage + * This method is required for implementing all the form related + *functions. Should be invoked before user + * close the PDF page. + * Parameters: + * page - Handle to the page. Returned by FPDF_LoadPage + *function. + * hHandle - Handle to the form fill module. Returned by + *FPDFDOC_InitFormFillEnvironment. + * Return Value: + * NONE. + **/ +DLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page, + FPDF_FORMHANDLE hHandle); + +/** +* Function: FORM_DoDocumentJSAction +* This method is required for performing Document-level JavaScript +*action. It should be invoked after the PDF document +* had been loaded. +* Parameters: +* hHandle - Handle to the form fill module. Returned by +*FPDFDOC_InitFormFillEnvironment. +* Return Value: +* NONE +* Comments: +* If there is Document-level JavaScript action embedded in the +*document, this method will execute the javascript action; +* otherwise, the method will do nothing. +**/ +DLLEXPORT void STDCALL FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle); + +/** +* Function: FORM_DoDocumentOpenAction +* This method is required for performing open-action when the document +*is opened. +* Parameters: +* hHandle - Handle to the form fill module. Returned by +*FPDFDOC_InitFormFillEnvironment. +* Return Value: +* NONE +* Comments: +* This method will do nothing if there is no open-actions embedded in +*the document. +**/ +DLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle); + +// additional actions type of document. +#define FPDFDOC_AACTION_WC \ + 0x10 // WC, before closing document, JavaScript action. +#define FPDFDOC_AACTION_WS \ + 0x11 // WS, before saving document, JavaScript action. +#define FPDFDOC_AACTION_DS 0x12 // DS, after saving document, JavaScript + // action. +#define FPDFDOC_AACTION_WP \ + 0x13 // WP, before printing document, JavaScript action. +#define FPDFDOC_AACTION_DP \ + 0x14 // DP, after printing document, JavaScript action. + +/** +* Function: FORM_DoDocumentAAction +* This method is required for performing the document's +*additional-action. +* Parameters: +* hHandle - Handle to the form fill module. Returned by +*FPDFDOC_InitFormFillEnvironment. +* aaType - The type of the additional-actions which defined +*above. +* Return Value: +* NONE +* Comments: +* This method will do nothing if there is no document +*additional-action corresponding to the specified aaType. +**/ + +DLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, + int aaType); + +// Additional-action types of page object +#define FPDFPAGE_AACTION_OPEN \ + 0 // /O -- An action to be performed when the page is opened +#define FPDFPAGE_AACTION_CLOSE \ + 1 // /C -- An action to be performed when the page is closed + +/** +* Function: FORM_DoPageAAction +* This method is required for performing the page object's +*additional-action when opened or closed. +* Parameters: +* page - Handle to the page. Returned by FPDF_LoadPage +*function. +* hHandle - Handle to the form fill module. Returned by +*FPDFDOC_InitFormFillEnvironment. +* aaType - The type of the page object's additional-actions +*which defined above. +* Return Value: +* NONE +* Comments: +* This method will do nothing if no additional-action corresponding to +*the specified aaType exists. +**/ +DLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page, + FPDF_FORMHANDLE hHandle, + int aaType); + +/** + * Function: FORM_OnMouseMove + * You can call this member function when the mouse cursor moves. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + *FPDFDOC_InitFormFillEnvironment. + * page - Handle to the page. Returned by FPDF_LoadPage + *function. + * modifier - Indicates whether various virtual keys are down. + * page_x - Specifies the x-coordinate of the cursor in PDF user + *space. + * page_y - Specifies the y-coordinate of the cursor in PDF user + *space. + * Return Value: + * TRUE indicates success; otherwise false. + **/ +DLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int modifier, + double page_x, + double page_y); + +/** + * Function: FORM_OnLButtonDown + * You can call this member function when the user presses the left + *mouse button. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + *FPDFDOC_InitFormFillEnvironment. + * page - Handle to the page. Returned by FPDF_LoadPage + *function. + * modifier - Indicates whether various virtual keys are down. + * page_x - Specifies the x-coordinate of the cursor in PDF user + *space. + * page_y - Specifies the y-coordinate of the cursor in PDF user + *space. + * Return Value: + * TRUE indicates success; otherwise false. + **/ +DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int modifier, + double page_x, + double page_y); + +/** + * Function: FORM_OnLButtonUp + * You can call this member function when the user releases the left + *mouse button. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + *FPDFDOC_InitFormFillEnvironment. + * page - Handle to the page. Returned by FPDF_LoadPage + *function. + * modifier - Indicates whether various virtual keys are down. + * page_x - Specifies the x-coordinate of the cursor in device. + * page_y - Specifies the y-coordinate of the cursor in device. + * Return Value: + * TRUE indicates success; otherwise false. + **/ +DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int modifier, + double page_x, + double page_y); + +#ifdef PDF_ENABLE_XFA +DLLEXPORT FPDF_BOOL STDCALL FORM_OnRButtonDown(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int modifier, + double page_x, + double page_y); +DLLEXPORT FPDF_BOOL STDCALL FORM_OnRButtonUp(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int modifier, + double page_x, + double page_y); +#endif // PDF_ENABLE_XFA + +/** + * Function: FORM_OnKeyDown + * You can call this member function when a nonsystem key is pressed. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + *FPDFDOC_InitFormFillEnvironment. + * page - Handle to the page. Returned by FPDF_LoadPage + *function. + * nKeyCode - Indicates whether various virtual keys are down. + * modifier - Contains the scan code, key-transition code, + *previous key state, and context code. + * Return Value: + * TRUE indicates success; otherwise false. + **/ +DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int nKeyCode, + int modifier); + +/** + * Function: FORM_OnKeyUp + * You can call this member function when a nonsystem key is released. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + *FPDFDOC_InitFormFillEnvironment. + * page - Handle to the page. Returned by FPDF_LoadPage + *function. + * nKeyCode - The virtual-key code of the given key. + * modifier - Contains the scan code, key-transition code, + *previous key state, and context code. + * Return Value: + * TRUE indicates success; otherwise false. + **/ +DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyUp(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int nKeyCode, + int modifier); + +/** + * Function: FORM_OnChar + * You can call this member function when a keystroke translates to a + *nonsystem character. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + *FPDFDOC_InitFormFillEnvironment. + * page - Handle to the page. Returned by FPDF_LoadPage + *function. + * nChar - The character code value of the key. + * modifier - Contains the scan code, key-transition code, + *previous key state, and context code. + * Return Value: + * TRUE indicates success; otherwise false. + **/ +DLLEXPORT FPDF_BOOL STDCALL FORM_OnChar(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + int nChar, + int modifier); + +/** + * Function: FORM_ForceToKillFocus. + * You can call this member function to force to kill the focus of the + *form field which got focus. + * It would kill the focus on the form field, save the value of form + *field if it's changed by user. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + *FPDFDOC_InitFormFillEnvironment. + * Return Value: + * TRUE indicates success; otherwise false. + **/ +DLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle); + +// Field Types +#define FPDF_FORMFIELD_UNKNOWN 0 // Unknown. +#define FPDF_FORMFIELD_PUSHBUTTON 1 // push button type. +#define FPDF_FORMFIELD_CHECKBOX 2 // check box type. +#define FPDF_FORMFIELD_RADIOBUTTON 3 // radio button type. +#define FPDF_FORMFIELD_COMBOBOX 4 // combo box type. +#define FPDF_FORMFIELD_LISTBOX 5 // list box type. +#define FPDF_FORMFIELD_TEXTFIELD 6 // text field type. +#ifdef PDF_ENABLE_XFA +#define FPDF_FORMFIELD_XFA 7 // text field type. +#endif // PDF_ENABLE_XFA + +/** + * Function: FPDFPage_HasFormFieldAtPoint + * Get the form field type by point. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + * FPDFDOC_InitFormFillEnvironment(). + * page - Handle to the page. Returned by FPDF_LoadPage(). + * page_x - X position in PDF "user space". + * page_y - Y position in PDF "user space". + * Return Value: + * Return the type of the form field; -1 indicates no field. + * See field types above. + **/ +DLLEXPORT int STDCALL FPDFPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + double page_x, + double page_y); + +/** + * Function: FPDPage_HasFormFieldAtPoint + * DEPRECATED. Please use FPDFPage_HasFormFieldAtPoint. + **/ +DLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + double page_x, + double page_y); + +/** + * Function: FPDFPage_FormFieldZOrderAtPoint + * Get the form field z-order by point. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + * FPDFDOC_InitFormFillEnvironment(). + * page - Handle to the page. Returned by FPDF_LoadPage(). + * page_x - X position in PDF "user space". + * page_y - Y position in PDF "user space". + * Return Value: + * Return the z-order of the form field; -1 indicates no field. + * Higher numbers are closer to the front. + **/ +DLLEXPORT int STDCALL FPDFPage_FormFieldZOrderAtPoint(FPDF_FORMHANDLE hHandle, + FPDF_PAGE page, + double page_x, + double page_y); + +/** + * Function: FPDF_SetFormFieldHighlightColor + * Set the highlight color of specified or all the form fields in the + *document. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + *FPDFDOC_InitFormFillEnvironment. + * doc - Handle to the document. Returned by + *FPDF_LoadDocument function. + * fieldType - A 32-bit integer indicating the type of a form + *field(defined above). + * color - The highlight color of the form field.Constructed by + *0xxxrrggbb. + * Return Value: + * NONE. + * Comments: + * When the parameter fieldType is set to zero, the highlight color + *will be applied to all the form fields in the + * document. + * Please refresh the client window to show the highlight immediately + *if necessary. + **/ +DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle, + int fieldType, + unsigned long color); + +/** + * Function: FPDF_SetFormFieldHighlightAlpha + * Set the transparency of the form field highlight color in the + *document. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + *FPDFDOC_InitFormFillEnvironment. + * doc - Handle to the document. Returned by + *FPDF_LoadDocument function. + * alpha - The transparency of the form field highlight color. + *between 0-255. + * Return Value: + * NONE. + **/ +DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, + unsigned char alpha); + +/** + * Function: FPDF_RemoveFormFieldHighlight + * Remove the form field highlight color in the document. + * Parameters: + * hHandle - Handle to the form fill module. Returned by + *FPDFDOC_InitFormFillEnvironment. + * Return Value: + * NONE. + * Comments: + * Please refresh the client window to remove the highlight immediately + *if necessary. + **/ +DLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle); + +/** +* Function: FPDF_FFLDraw +* Render FormFields and popup window on a page to a device independent +*bitmap. +* Parameters: +* hHandle - Handle to the form fill module. Returned by +*FPDFDOC_InitFormFillEnvironment. +* bitmap - Handle to the device independent bitmap (as the +*output buffer). +* Bitmap handle can be created by FPDFBitmap_Create +*function. +* page - Handle to the page. Returned by FPDF_LoadPage +*function. +* start_x - Left pixel position of the display area in the +*device coordinate. +* start_y - Top pixel position of the display area in the device +*coordinate. +* size_x - Horizontal size (in pixels) for displaying the page. +* size_y - Vertical size (in pixels) for displaying the page. +* rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees +*clockwise), +* 2 (rotated 180 degrees), 3 (rotated 90 degrees +*counter-clockwise). +* flags - 0 for normal display, or combination of flags +*defined above. +* Return Value: +* None. +* Comments: +* This function is designed to render annotations that are +*user-interactive, which are widget annotation (for FormFields) and popup +*annotation. +* With FPDF_ANNOT flag, this function will render popup annotation +*when users mouse-hover on non-widget annotation. Regardless of FPDF_ANNOT flag, +*this function will always render widget annotations for FormFields. +* In order to implement the FormFill functions, implementation should +*call this function after rendering functions, such as FPDF_RenderPageBitmap or +*FPDF_RenderPageBitmap_Start, finish rendering the page contents. +**/ +DLLEXPORT void STDCALL FPDF_FFLDraw(FPDF_FORMHANDLE hHandle, + FPDF_BITMAP bitmap, + FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int flags); + +#ifdef _SKIA_SUPPORT_ +DLLEXPORT void STDCALL FPDF_FFLRecord(FPDF_FORMHANDLE hHandle, + FPDF_RECORDER recorder, + FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int flags); +#endif + +#ifdef PDF_ENABLE_XFA +/** + * Function: FPDF_HasXFAField + * This method is designed to check whether a pdf document + *has XFA fields. + * Parameters: + * document - Handle to document. + *Returned by FPDF_LoadDocument function. + * docType - Document type defined as + *DOCTYPE_xxx. + * Return Value: + * TRUE indicates that the input document has XFA fields, + *otherwise FALSE. + **/ +DLLEXPORT FPDF_BOOL STDCALL FPDF_HasXFAField(FPDF_DOCUMENT document, + int* docType); + +/** + * Function: FPDF_LoadXFA + * If the document consists of XFA fields, there should call this + *method to load XFA fields. + * Parameters: + * document - Handle to document. Returned by + *FPDF_LoadDocument function. + * Return Value: + * TRUE indicates success,otherwise FALSE. + **/ +DLLEXPORT FPDF_BOOL STDCALL FPDF_LoadXFA(FPDF_DOCUMENT document); + +/** + * Function: FPDF_Widget_Undo + * This method will implement the undo feature for the specified xfa + *field. + * Parameters: + * document - Handle to document. Returned by + *FPDF_LoadDocument function. + * hWidget - Handle to the xfa field. + * Return Value: + * None. + **/ +DLLEXPORT void STDCALL FPDF_Widget_Undo(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget); +/** + * Function: FPDF_Widget_Redo + * This method will implement the redo feature for the specified xfa + *field. + * Parameters: + * document - Handle to document. Returned by + *FPDF_LoadDocument function. + * hWidget - Handle to the xfa field. + * Return Value: + * None. + **/ +DLLEXPORT void STDCALL FPDF_Widget_Redo(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget); +/** + * Function: FPDF_Widget_SelectAll + * This method will implement the select all feature for the specified + *xfa field. + * Parameters: + * document - Handle to document. Returned by + *FPDF_LoadDocument function. + * hWidget - Handle to the xfa field. + * Return Value: + * None. + **/ +DLLEXPORT void STDCALL FPDF_Widget_SelectAll(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget); +/** + * Function: FPDF_Widget_Copy + * This method will implement the copy feature for the specified xfa + *field. + * Parameters: + * document - Handle to document. Returned by + *FPDF_LoadDocument function. + * hWidget - Handle to the xfa field. + * wsText - Pointer to data buffer to receive the copied + *data, in UTF-16LE format. + * size - The data buffer size. + * Return Value: + * None. + **/ +DLLEXPORT void STDCALL FPDF_Widget_Copy(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget, + FPDF_WIDESTRING wsText, + FPDF_DWORD* size); +/** + * Function: FPDF_Widget_Cut + * This method will implement the cut feature for the specified xfa + *field. + * Parameters: + * document - Handle to document. Returned by + *FPDF_LoadDocument function. + * hWidget - Handle to the xfa field. + * wsText - Pointer to data buffer to receive the cut + *data,in UTF-16LE format. + * size - The data buffer size,not the byte number. + * Return Value: + * None. + **/ +DLLEXPORT void STDCALL FPDF_Widget_Cut(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget, + FPDF_WIDESTRING wsText, + FPDF_DWORD* size); +/** + * Function: FPDF_Widget_Paste + * This method will implement the paste feature for the specified xfa + *field. + * Parameters: + * document - Handle to document. Returned by + *FPDF_LoadDocument function. + * hWidget - Handle to the xfa field. + * wsText - The paste text buffer, in UTF-16LE format. + * size - The data buffer size,not the byte number. + * Return Value: + * None. + **/ +DLLEXPORT void STDCALL FPDF_Widget_Paste(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget, + FPDF_WIDESTRING wsText, + FPDF_DWORD size); +/** + * Function: FPDF_Widget_ReplaceSpellCheckWord + * This method will implement the spell check feature for the specified + *xfa field. + * Parameters: + * document - Handle to document. Returned by + *FPDF_LoadDocument function. + * hWidget - Handle to the xfa field. + * x - The x value of the specified point. + * y - The y value of the specified point. + * bsText - The text buffer needed to be speck check, in + *UTF-16LE format. + * Return Value: + * None. + **/ +DLLEXPORT void STDCALL +FPDF_Widget_ReplaceSpellCheckWord(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget, + float x, + float y, + FPDF_BYTESTRING bsText); +/** + * Function: FPDF_Widget_GetSpellCheckWords + * This method will implement the spell check feature for the specified + *xfa field. + * Parameters: + * document - Handle to document. Returned by + *FPDF_LoadDocument function. + * hWidget - Handle to the xfa field. + * x - The x value of the specified point. + * y - The y value of the specified point. + * stringHandle - Pointer to FPDF_STRINGHANDLE to receive the + *speck check text buffer, in UTF-16LE format. + * Return Value: + * None. + **/ +DLLEXPORT void STDCALL +FPDF_Widget_GetSpellCheckWords(FPDF_DOCUMENT document, + FPDF_WIDGET hWidget, + float x, + float y, + FPDF_STRINGHANDLE* stringHandle); +/** + * Function: FPDF_StringHandleCounts + * This method will get the count of the text buffer. + * Parameters: + * stringHandle - Pointer to FPDF_STRINGHANDLE. + * Return Value: + * None. + **/ +DLLEXPORT int STDCALL FPDF_StringHandleCounts(FPDF_STRINGHANDLE stringHandle); +/** + * Function: FPDF_StringHandleGetStringByIndex + * This method will get the specified index of the text buffer. + * Parameters: + * stringHandle - Pointer to FPDF_STRINGHANDLE. + * index - The specified index of text buffer. + * bsText - Pointer to data buffer to receive the text + *buffer, in UTF-16LE format. + * size - The byte size of data buffer. + * Return Value: + * TRUE indicates success, otherwise FALSE. + **/ +DLLEXPORT FPDF_BOOL STDCALL +FPDF_StringHandleGetStringByIndex(FPDF_STRINGHANDLE stringHandle, + int index, + FPDF_BYTESTRING bsText, + FPDF_DWORD* size); +/** + * Function: FPDF_StringHandleRelease + * This method will release the FPDF_STRINGHANDLE. + * Parameters: + * stringHandle - Pointer to FPDF_STRINGHANDLE. + * Return Value: + * None. + **/ +DLLEXPORT void STDCALL FPDF_StringHandleRelease(FPDF_STRINGHANDLE stringHandle); +/** + * Function: FPDF_StringHandleAddString + * This method will add the specified text buffer. + * Parameters: + * stringHandle - Pointer to FPDF_STRINGHANDLE. + * bsText - Pointer to data buffer of the text buffer, in + *UTF-16LE format. + * size - The byte size of data buffer. + * Return Value: + * TRUE indicates success, otherwise FALSE. + **/ +DLLEXPORT FPDF_BOOL STDCALL +FPDF_StringHandleAddString(FPDF_STRINGHANDLE stringHandle, + FPDF_BYTESTRING bsText, + FPDF_DWORD size); +#endif // PDF_ENABLE_XFA + +#ifdef __cplusplus +} +#endif + +#endif // PUBLIC_FPDF_FORMFILL_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_fwlevent.h b/modules/pdfium/pdfium/public/fpdf_fwlevent.h new file mode 100644 index 000000000000..591484a5d08f --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_fwlevent.h @@ -0,0 +1,284 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_FWLEVENT_H_ +#define PUBLIC_FPDF_FWLEVENT_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +typedef int FPDF_INT32; +typedef unsigned int FPDF_UINT32; +typedef float FPDF_FLOAT; + +// Event types. +typedef enum { + FWL_EVENTTYPE_Mouse = 0, + FWL_EVENTTYPE_MouseWheel, + FWL_EVENTTYPE_Key, +} FWL_EVENTTYPE; + +// Key flags. +typedef enum { + FWL_EVENTFLAG_ShiftKey = 1 << 0, + FWL_EVENTFLAG_ControlKey = 1 << 1, + FWL_EVENTFLAG_AltKey = 1 << 2, + FWL_EVENTFLAG_MetaKey = 1 << 3, + FWL_EVENTFLAG_KeyPad = 1 << 4, + FWL_EVENTFLAG_AutoRepeat = 1 << 5, + FWL_EVENTFLAG_LeftButtonDown = 1 << 6, + FWL_EVENTFLAG_MiddleButtonDown = 1 << 7, + FWL_EVENTFLAG_RightButtonDown = 1 << 8, +} FWL_EVENTFLAG; + +// Mouse messages. +typedef enum { + FWL_EVENTMOUSECMD_LButtonDown = 1, + FWL_EVENTMOUSECMD_LButtonUp, + FWL_EVENTMOUSECMD_LButtonDblClk, + FWL_EVENTMOUSECMD_RButtonDown, + FWL_EVENTMOUSECMD_RButtonUp, + FWL_EVENTMOUSECMD_RButtonDblClk, + FWL_EVENTMOUSECMD_MButtonDown, + FWL_EVENTMOUSECMD_MButtonUp, + FWL_EVENTMOUSECMD_MButtonDblClk, + FWL_EVENTMOUSECMD_MouseMove, + FWL_EVENTMOUSECMD_MouseEnter, + FWL_EVENTMOUSECMD_MouseHover, + FWL_EVENTMOUSECMD_MouseLeave, +} FWL_EVENT_MOUSECMD; + +// Mouse events. +struct FWL_EVENT_MOUSE { + FPDF_UINT32 command; + FPDF_DWORD flag; + FPDF_FLOAT x; + FPDF_FLOAT y; +}; + +// Mouse wheel events. +struct FWL_EVENT_MOUSEWHEEL { + FPDF_DWORD flag; + FPDF_FLOAT x; + FPDF_FLOAT y; + FPDF_FLOAT deltaX; + FPDF_FLOAT deltaY; +}; + +// Virtual keycodes. +typedef enum { + FWL_VKEY_Back = 0x08, + FWL_VKEY_Tab = 0x09, + FWL_VKEY_NewLine = 0x0A, + FWL_VKEY_Clear = 0x0C, + FWL_VKEY_Return = 0x0D, + FWL_VKEY_Shift = 0x10, + FWL_VKEY_Control = 0x11, + FWL_VKEY_Menu = 0x12, + FWL_VKEY_Pause = 0x13, + FWL_VKEY_Capital = 0x14, + FWL_VKEY_Kana = 0x15, + FWL_VKEY_Hangul = 0x15, + FWL_VKEY_Junja = 0x17, + FWL_VKEY_Final = 0x18, + FWL_VKEY_Hanja = 0x19, + FWL_VKEY_Kanji = 0x19, + FWL_VKEY_Escape = 0x1B, + FWL_VKEY_Convert = 0x1C, + FWL_VKEY_NonConvert = 0x1D, + FWL_VKEY_Accept = 0x1E, + FWL_VKEY_ModeChange = 0x1F, + FWL_VKEY_Space = 0x20, + FWL_VKEY_Prior = 0x21, + FWL_VKEY_Next = 0x22, + FWL_VKEY_End = 0x23, + FWL_VKEY_Home = 0x24, + FWL_VKEY_Left = 0x25, + FWL_VKEY_Up = 0x26, + FWL_VKEY_Right = 0x27, + FWL_VKEY_Down = 0x28, + FWL_VKEY_Select = 0x29, + FWL_VKEY_Print = 0x2A, + FWL_VKEY_Execute = 0x2B, + FWL_VKEY_Snapshot = 0x2C, + FWL_VKEY_Insert = 0x2D, + FWL_VKEY_Delete = 0x2E, + FWL_VKEY_Help = 0x2F, + FWL_VKEY_0 = 0x30, + FWL_VKEY_1 = 0x31, + FWL_VKEY_2 = 0x32, + FWL_VKEY_3 = 0x33, + FWL_VKEY_4 = 0x34, + FWL_VKEY_5 = 0x35, + FWL_VKEY_6 = 0x36, + FWL_VKEY_7 = 0x37, + FWL_VKEY_8 = 0x38, + FWL_VKEY_9 = 0x39, + FWL_VKEY_A = 0x41, + FWL_VKEY_B = 0x42, + FWL_VKEY_C = 0x43, + FWL_VKEY_D = 0x44, + FWL_VKEY_E = 0x45, + FWL_VKEY_F = 0x46, + FWL_VKEY_G = 0x47, + FWL_VKEY_H = 0x48, + FWL_VKEY_I = 0x49, + FWL_VKEY_J = 0x4A, + FWL_VKEY_K = 0x4B, + FWL_VKEY_L = 0x4C, + FWL_VKEY_M = 0x4D, + FWL_VKEY_N = 0x4E, + FWL_VKEY_O = 0x4F, + FWL_VKEY_P = 0x50, + FWL_VKEY_Q = 0x51, + FWL_VKEY_R = 0x52, + FWL_VKEY_S = 0x53, + FWL_VKEY_T = 0x54, + FWL_VKEY_U = 0x55, + FWL_VKEY_V = 0x56, + FWL_VKEY_W = 0x57, + FWL_VKEY_X = 0x58, + FWL_VKEY_Y = 0x59, + FWL_VKEY_Z = 0x5A, + FWL_VKEY_LWin = 0x5B, + FWL_VKEY_Command = 0x5B, + FWL_VKEY_RWin = 0x5C, + FWL_VKEY_Apps = 0x5D, + FWL_VKEY_Sleep = 0x5F, + FWL_VKEY_NumPad0 = 0x60, + FWL_VKEY_NumPad1 = 0x61, + FWL_VKEY_NumPad2 = 0x62, + FWL_VKEY_NumPad3 = 0x63, + FWL_VKEY_NumPad4 = 0x64, + FWL_VKEY_NumPad5 = 0x65, + FWL_VKEY_NumPad6 = 0x66, + FWL_VKEY_NumPad7 = 0x67, + FWL_VKEY_NumPad8 = 0x68, + FWL_VKEY_NumPad9 = 0x69, + FWL_VKEY_Multiply = 0x6A, + FWL_VKEY_Add = 0x6B, + FWL_VKEY_Separator = 0x6C, + FWL_VKEY_Subtract = 0x6D, + FWL_VKEY_Decimal = 0x6E, + FWL_VKEY_Divide = 0x6F, + FWL_VKEY_F1 = 0x70, + FWL_VKEY_F2 = 0x71, + FWL_VKEY_F3 = 0x72, + FWL_VKEY_F4 = 0x73, + FWL_VKEY_F5 = 0x74, + FWL_VKEY_F6 = 0x75, + FWL_VKEY_F7 = 0x76, + FWL_VKEY_F8 = 0x77, + FWL_VKEY_F9 = 0x78, + FWL_VKEY_F10 = 0x79, + FWL_VKEY_F11 = 0x7A, + FWL_VKEY_F12 = 0x7B, + FWL_VKEY_F13 = 0x7C, + FWL_VKEY_F14 = 0x7D, + FWL_VKEY_F15 = 0x7E, + FWL_VKEY_F16 = 0x7F, + FWL_VKEY_F17 = 0x80, + FWL_VKEY_F18 = 0x81, + FWL_VKEY_F19 = 0x82, + FWL_VKEY_F20 = 0x83, + FWL_VKEY_F21 = 0x84, + FWL_VKEY_F22 = 0x85, + FWL_VKEY_F23 = 0x86, + FWL_VKEY_F24 = 0x87, + FWL_VKEY_NunLock = 0x90, + FWL_VKEY_Scroll = 0x91, + FWL_VKEY_LShift = 0xA0, + FWL_VKEY_RShift = 0xA1, + FWL_VKEY_LControl = 0xA2, + FWL_VKEY_RControl = 0xA3, + FWL_VKEY_LMenu = 0xA4, + FWL_VKEY_RMenu = 0xA5, + FWL_VKEY_BROWSER_Back = 0xA6, + FWL_VKEY_BROWSER_Forward = 0xA7, + FWL_VKEY_BROWSER_Refresh = 0xA8, + FWL_VKEY_BROWSER_Stop = 0xA9, + FWL_VKEY_BROWSER_Search = 0xAA, + FWL_VKEY_BROWSER_Favorites = 0xAB, + FWL_VKEY_BROWSER_Home = 0xAC, + FWL_VKEY_VOLUME_Mute = 0xAD, + FWL_VKEY_VOLUME_Down = 0xAE, + FWL_VKEY_VOLUME_Up = 0xAF, + FWL_VKEY_MEDIA_NEXT_Track = 0xB0, + FWL_VKEY_MEDIA_PREV_Track = 0xB1, + FWL_VKEY_MEDIA_Stop = 0xB2, + FWL_VKEY_MEDIA_PLAY_Pause = 0xB3, + FWL_VKEY_MEDIA_LAUNCH_Mail = 0xB4, + FWL_VKEY_MEDIA_LAUNCH_MEDIA_Select = 0xB5, + FWL_VKEY_MEDIA_LAUNCH_APP1 = 0xB6, + FWL_VKEY_MEDIA_LAUNCH_APP2 = 0xB7, + FWL_VKEY_OEM_1 = 0xBA, + FWL_VKEY_OEM_Plus = 0xBB, + FWL_VKEY_OEM_Comma = 0xBC, + FWL_VKEY_OEM_Minus = 0xBD, + FWL_VKEY_OEM_Period = 0xBE, + FWL_VKEY_OEM_2 = 0xBF, + FWL_VKEY_OEM_3 = 0xC0, + FWL_VKEY_OEM_4 = 0xDB, + FWL_VKEY_OEM_5 = 0xDC, + FWL_VKEY_OEM_6 = 0xDD, + FWL_VKEY_OEM_7 = 0xDE, + FWL_VKEY_OEM_8 = 0xDF, + FWL_VKEY_OEM_102 = 0xE2, + FWL_VKEY_ProcessKey = 0xE5, + FWL_VKEY_Packet = 0xE7, + FWL_VKEY_Attn = 0xF6, + FWL_VKEY_Crsel = 0xF7, + FWL_VKEY_Exsel = 0xF8, + FWL_VKEY_Ereof = 0xF9, + FWL_VKEY_Play = 0xFA, + FWL_VKEY_Zoom = 0xFB, + FWL_VKEY_NoName = 0xFC, + FWL_VKEY_PA1 = 0xFD, + FWL_VKEY_OEM_Clear = 0xFE, + FWL_VKEY_Unknown = 0, +} FWL_VKEYCODE; + +// Key event commands. +typedef enum { + FWL_EVENTKEYCMD_KeyDown = 1, + FWL_EVENTKEYCMD_KeyUp, + FWL_EVENTKEYCMD_Char, +} FWL_EVENTKEYCMD; + +// Key events. +struct FWL_EVENT_KEY { + FPDF_UINT32 command; + FPDF_DWORD flag; + union { + // Virtual key code. + FPDF_UINT32 vkcode; + // Character code. + FPDF_DWORD charcode; + } code; +}; + +// Event types. +struct FWL_EVENT { + // Structure size. + FPDF_UINT32 size; + // FWL_EVENTTYPE. + FPDF_UINT32 type; + union { + struct FWL_EVENT_MOUSE mouse; + struct FWL_EVENT_MOUSEWHEEL wheel; + struct FWL_EVENT_KEY key; + } s; +}; + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // PUBLIC_FPDF_FWLEVENT_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_ppo.h b/modules/pdfium/pdfium/public/fpdf_ppo.h new file mode 100644 index 000000000000..d9c83002b58f --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_ppo.h @@ -0,0 +1,44 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_PPO_H_ +#define PUBLIC_FPDF_PPO_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Import pages to a FPDF_DOCUMENT. +// +// dest_doc - The destination document for the pages. +// src_doc - The document to be imported. +// pagerange - A page range string, Such as "1,3,5-7". If |pagerange| is NULL, +// all pages from |src_doc| are imported. +// index - The page index to insert at. +// +// Returns TRUE on success. +DLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc, + FPDF_DOCUMENT src_doc, + FPDF_BYTESTRING pagerange, + int index); + +// Copy the viewer preferences from |src_doc| into |dest_doc|. +// +// dest_doc - Document to write the viewer preferences into. +// src_doc - Document to read the viewer preferences from. +// +// Returns TRUE on success. +DLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, + FPDF_DOCUMENT src_doc); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // PUBLIC_FPDF_PPO_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_progressive.h b/modules/pdfium/pdfium/public/fpdf_progressive.h new file mode 100644 index 000000000000..0c3d501317b4 --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_progressive.h @@ -0,0 +1,120 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_PROGRESSIVE_H_ +#define PUBLIC_FPDF_PROGRESSIVE_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +// Flags for progressive process status. +#define FPDF_RENDER_READER 0 +#define FPDF_RENDER_TOBECOUNTINUED 1 +#define FPDF_RENDER_DONE 2 +#define FPDF_RENDER_FAILED 3 + +#ifdef __cplusplus +extern "C" { +#endif + +// IFPDF_RENDERINFO interface. +typedef struct _IFSDK_PAUSE { + /** + * Version number of the interface. Currently must be 1. + **/ + int version; + + /* + * Method: NeedToPauseNow + * Check if we need to pause a progressive process now. + * Interface Version: + * 1 + * Implementation Required: + * yes + * Parameters: + * pThis - Pointer to the interface structure itself + * Return Value: + * Non-zero for pause now, 0 for continue. + * + */ + FPDF_BOOL (*NeedToPauseNow)(struct _IFSDK_PAUSE* pThis); + + // A user defined data pointer, used by user's application. Can be NULL. + void* user; +} IFSDK_PAUSE; + +// Function: FPDF_RenderPageBitmap_Start +// Start to render page contents to a device independent bitmap +// progressively. +// Parameters: +// bitmap - Handle to the device independent bitmap (as the +// output buffer). +// Bitmap handle can be created by FPDFBitmap_Create +// function. +// page - Handle to the page. Returned by FPDF_LoadPage +// function. +// start_x - Left pixel position of the display area in the +// bitmap coordinate. +// start_y - Top pixel position of the display area in the bitmap +// coordinate. +// size_x - Horizontal size (in pixels) for displaying the page. +// size_y - Vertical size (in pixels) for displaying the page. +// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees +// clockwise), +// 2 (rotated 180 degrees), 3 (rotated 90 degrees +// counter-clockwise). +// flags - 0 for normal display, or combination of flags +// defined in fpdfview.h. With FPDF_ANNOT flag, it +// renders all annotations that does not require +// user-interaction, which are all annotations except +// widget and popup annotations. +// pause - The IFSDK_PAUSE interface.A callback mechanism +// allowing the page rendering process +// Return value: +// Rendering Status. See flags for progressive process status for the +// details. +// +DLLEXPORT int STDCALL FPDF_RenderPageBitmap_Start(FPDF_BITMAP bitmap, + FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int flags, + IFSDK_PAUSE* pause); + +// Function: FPDF_RenderPage_Continue +// Continue rendering a PDF page. +// Parameters: +// page - Handle to the page. Returned by FPDF_LoadPage +// function. +// pause - The IFSDK_PAUSE interface.A callback mechanism +// allowing the page rendering process +// to be paused before it's finished. This can be NULL +// if you don't want to pause. +// Return value: +// The rendering status. See flags for progressive process status for +// the details. +DLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page, + IFSDK_PAUSE* pause); + +// Function: FPDF_RenderPage_Close +// Release the resource allocate during page rendering. Need to be +// called after finishing rendering or +// cancel the rendering. +// Parameters: +// page - Handle to the page. Returned by FPDF_LoadPage +// function. +// Return value: +// NULL +DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page); + +#ifdef __cplusplus +} +#endif + +#endif // PUBLIC_FPDF_PROGRESSIVE_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_save.h b/modules/pdfium/pdfium/public/fpdf_save.h new file mode 100644 index 000000000000..c34e2bc6c717 --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_save.h @@ -0,0 +1,87 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_SAVE_H_ +#define PUBLIC_FPDF_SAVE_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Structure for custom file write +typedef struct FPDF_FILEWRITE_ { + // + // Version number of the interface. Currently must be 1. + // + int version; + + // + // Method: WriteBlock + // Output a block of data in your custom way. + // Interface Version: + // 1 + // Implementation Required: + // Yes + // Comments: + // Called by function FPDF_SaveDocument + // Parameters: + // pThis - Pointer to the structure itself + // pData - Pointer to a buffer to output + // size - The size of the buffer. + // Return value: + // Should be non-zero if successful, zero for error. + // + int (*WriteBlock)(struct FPDF_FILEWRITE_* pThis, + const void* pData, + unsigned long size); +} FPDF_FILEWRITE; + +/** @brief Incremental. */ +#define FPDF_INCREMENTAL 1 +/** @brief No Incremental. */ +#define FPDF_NO_INCREMENTAL 2 +/** @brief Remove security. */ +#define FPDF_REMOVE_SECURITY 3 + +// Function: FPDF_SaveAsCopy +// Saves the copy of specified document in custom way. +// Parameters: +// document - Handle to document. Returned by +// FPDF_LoadDocument and FPDF_CreateNewDocument. +// pFileWrite - A pointer to a custom file write structure. +// flags - The creating flags. +// Return value: +// TRUE for succeed, FALSE for failed. +// +DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy(FPDF_DOCUMENT document, + FPDF_FILEWRITE* pFileWrite, + FPDF_DWORD flags); + +// Function: FPDF_SaveWithVersion +// Same as function ::FPDF_SaveAsCopy, except the file version of the +// saved document could be specified by user. +// Parameters: +// document - Handle to document. +// pFileWrite - A pointer to a custom file write structure. +// flags - The creating flags. +// fileVersion - The PDF file version. File version: 14 for 1.4, +// 15 for 1.5, ... +// Return value: +// TRUE if succeed, FALSE if failed. +// +DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion(FPDF_DOCUMENT document, + FPDF_FILEWRITE* pFileWrite, + FPDF_DWORD flags, + int fileVersion); + +#ifdef __cplusplus +} +#endif + +#endif // PUBLIC_FPDF_SAVE_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_searchex.h b/modules/pdfium/pdfium/public/fpdf_searchex.h new file mode 100644 index 000000000000..7c1b31848e7e --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_searchex.h @@ -0,0 +1,30 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_SEARCHEX_H_ +#define PUBLIC_FPDF_SEARCHEX_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Get the character index in |text_page| internal character list. +// +// text_page - a text page information structure. +// nTextIndex - index of the text returned from |FPDFText_GetText|. +// +// Returns the index of the character in internal character list. -1 for error. +DLLEXPORT int STDCALL +FPDFText_GetCharIndexFromTextIndex(FPDF_TEXTPAGE text_page, int nTextIndex); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // PUBLIC_FPDF_SEARCHEX_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_structtree.h b/modules/pdfium/pdfium/public/fpdf_structtree.h new file mode 100644 index 000000000000..3d4da402aa53 --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_structtree.h @@ -0,0 +1,103 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_STRUCTTREE_H_ +#define PUBLIC_FPDF_STRUCTTREE_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Function: FPDF_StructTree_GetForPage +// Get the structure tree for a page. +// Parameters: +// page - Handle to the page. Returned by FPDF_LoadPage +// function. +// Return value: +// A handle to the structure tree or NULL on error. +DLLEXPORT FPDF_STRUCTTREE STDCALL FPDF_StructTree_GetForPage(FPDF_PAGE page); + +// Function: FPDF_StructTree_Close +// Release the resource allocate by FPDF_StructTree_GetForPage. +// Parameters: +// struct_tree - Handle to the struct tree. Returned by +// FPDF_StructTree_LoadPage function. +// Return value: +// NULL +DLLEXPORT void STDCALL FPDF_StructTree_Close(FPDF_STRUCTTREE struct_tree); + +// Function: FPDF_StructTree_CountChildren +// Count the number of children for the structure tree. +// Parameters: +// struct_tree - Handle to the struct tree. Returned by +// FPDF_StructTree_LoadPage function. +// Return value: +// The number of children, or -1 on error. +DLLEXPORT int STDCALL +FPDF_StructTree_CountChildren(FPDF_STRUCTTREE struct_tree); + +// Function: FPDF_StructTree_GetChildAtIndex +// Get a child in the structure tree. +// Parameters: +// struct_tree - Handle to the struct tree. Returned by +// FPDF_StructTree_LoadPage function. +// index - The index for the child, 0-based. +// Return value: +// The child at the n-th index or NULL on error. +DLLEXPORT FPDF_STRUCTELEMENT STDCALL +FPDF_StructTree_GetChildAtIndex(FPDF_STRUCTTREE struct_tree, int index); + +// Function: FPDF_StructElement_GetAltText +// Get the alt text for a given element. +// Parameters: +// struct_element - Handle to the struct element. +// buffer - A buffer for output the alt text. May be NULL. +// buflen - The length of the buffer, in bytes. May be 0. +// Return value: +// The number of bytes in the title, including the terminating NUL +// character. The number of bytes is returned regardless of the +// |buffer| and |buflen| parameters. +// Comments: +// Regardless of the platform, the |buffer| is always in UTF-16LE +// encoding. The string is terminated by a UTF16 NUL character. If +// |buflen| is less than the required length, or |buffer| is NULL, +// |buffer| will not be modified. +DLLEXPORT unsigned long STDCALL +FPDF_StructElement_GetAltText(FPDF_STRUCTELEMENT struct_element, + void* buffer, + unsigned long buflen); + +// Function: FPDF_StructElement_CountChildren +// Count the number of children for the structure element. +// Parameters: +// struct_element - Handle to the struct element. +// Return value: +// The number of children, or -1 on error. +DLLEXPORT int STDCALL +FPDF_StructElement_CountChildren(FPDF_STRUCTELEMENT struct_element); + +// Function: FPDF_StructElement_GetChildAtIndex +// Get a child in the structure element. +// Parameters: +// struct_tree - Handle to the struct element. +// index - The index for the child, 0-based. +// Return value: +// The child at the n-th index or NULL on error. +// Comments: +// If the child exists but is not an element, then this function will +// return NULL. This will also return NULL for out of bounds indices. +DLLEXPORT FPDF_STRUCTELEMENT STDCALL +FPDF_StructElement_GetChildAtIndex(FPDF_STRUCTELEMENT struct_element, + int index); + +#ifdef __cplusplus +} +#endif + +#endif // PUBLIC_FPDF_STRUCTTREE_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_sysfontinfo.h b/modules/pdfium/pdfium/public/fpdf_sysfontinfo.h new file mode 100644 index 000000000000..a0edffffa27e --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_sysfontinfo.h @@ -0,0 +1,316 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_SYSFONTINFO_H_ +#define PUBLIC_FPDF_SYSFONTINFO_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +/* Character sets for the font */ +#define FXFONT_ANSI_CHARSET 0 +#define FXFONT_DEFAULT_CHARSET 1 +#define FXFONT_SYMBOL_CHARSET 2 +#define FXFONT_SHIFTJIS_CHARSET 128 +#define FXFONT_HANGEUL_CHARSET 129 +#define FXFONT_GB2312_CHARSET 134 +#define FXFONT_CHINESEBIG5_CHARSET 136 + +/* Font pitch and family flags */ +#define FXFONT_FF_FIXEDPITCH 1 +#define FXFONT_FF_ROMAN (1 << 4) +#define FXFONT_FF_SCRIPT (4 << 4) + +/* Typical weight values */ +#define FXFONT_FW_NORMAL 400 +#define FXFONT_FW_BOLD 700 + +// Exported Functions +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Interface: FPDF_SYSFONTINFO + * Interface for getting system font information and font mapping + */ +typedef struct _FPDF_SYSFONTINFO { + /** + * Version number of the interface. Currently must be 1. + **/ + int version; + + /** + * Method: Release + * Give implementation a chance to release any data after the + * interface is no longer used + * Interface Version: + * 1 + * Implementation Required: + * No + * Comments: + * Called by Foxit SDK during the final cleanup process. + * Parameters: + * pThis - Pointer to the interface structure itself + * Return Value: + * None + */ + void (*Release)(struct _FPDF_SYSFONTINFO* pThis); + + /** + * Method: EnumFonts + * Enumerate all fonts installed on the system + * Interface Version: + * 1 + * Implementation Required: + * No + * Comments: + * Implementation should call FPDF_AddIntalledFont() function for + * each font found. + * Only TrueType/OpenType and Type1 fonts are accepted by Foxit SDK. + * Parameters: + * pThis - Pointer to the interface structure itself + * pMapper - An opaque pointer to internal font mapper, used + * when calling FPDF_AddInstalledFont + * Return Value: + * None + */ + void (*EnumFonts)(struct _FPDF_SYSFONTINFO* pThis, void* pMapper); + + /** + * Method: MapFont + * Use the system font mapper to get a font handle from requested + *parameters + * Interface Version: + * 1 + * Implementation Required: + * Yes only if GetFont method is not implemented. + * Comments: + * If the system supports native font mapper (like Windows), + *implementation can implement this method to get a font handle. + * Otherwise, Foxit SDK will do the mapping and then call GetFont + *method. + * Only TrueType/OpenType and Type1 fonts are accepted by Foxit SDK. + * Parameters: + * pThis - Pointer to the interface structure itself + * weight - Weight of the requested font. 400 is normal and + *700 is bold. + * bItalic - Italic option of the requested font, TRUE or + *FALSE. + * charset - Character set identifier for the requested font. + *See above defined constants. + * pitch_family - A combination of flags. See above defined + *constants. + * face - Typeface name. Currently use system local encoding + *only. + * bExact - Pointer to a boolean value receiving the indicator + *whether mapper found the exact match. + * If mapper is not sure whether it's exact match, + *ignore this paramter. + * Return Value: + * An opaque pointer for font handle, or NULL if system mapping is + *not supported. + **/ + void* (*MapFont)(struct _FPDF_SYSFONTINFO* pThis, + int weight, + FPDF_BOOL bItalic, + int charset, + int pitch_family, + const char* face, + FPDF_BOOL* bExact); + + /** + * Method: GetFont + * Get a handle to a particular font by its internal ID + * Interface Version: + * 1 + * Implementation Required: + * Yes only if MapFont method is not implemented. + * Comments: + * If the system mapping not supported, Foxit SDK will do the font + *mapping and use this method to get a font handle. + * Parameters: + * pThis - Pointer to the interface structure itself + * face - Typeface name. Currently use system local encoding + *only. + * Return Value: + * An opaque pointer for font handle. + **/ + void* (*GetFont)(struct _FPDF_SYSFONTINFO* pThis, const char* face); + + /** + * Method: GetFontData + * Get font data from a font + * Interface Version: + * 1 + * Implementation Required: + * Yes + * Comments: + * Can read either full font file, or a particular TrueType/OpenType + *table + * Parameters: + * pThis - Pointer to the interface structure itself + * hFont - Font handle returned by MapFont or GetFont method + * table - TrueType/OpenType table identifier (refer to + *TrueType specification). + * 0 for the whole font file. + * buffer - The buffer receiving the font data. Can be NULL if + *not provided + * buf_size - Buffer size, can be zero if not provided + * Return Value: + * Number of bytes needed, if buffer not provided or not large + *enough, + * or number of bytes written into buffer otherwise. + **/ + unsigned long (*GetFontData)(struct _FPDF_SYSFONTINFO* pThis, + void* hFont, + unsigned int table, + unsigned char* buffer, + unsigned long buf_size); + + /** + * Method: GetFaceName + * Get face name from a font handle + * Interface Version: + * 1 + * Implementation Required: + * No + * Parameters: + * pThis - Pointer to the interface structure itself + * hFont - Font handle returned by MapFont or GetFont method + * buffer - The buffer receiving the face name. Can be NULL if + *not provided + * buf_size - Buffer size, can be zero if not provided + * Return Value: + * Number of bytes needed, if buffer not provided or not large + *enough, + * or number of bytes written into buffer otherwise. + **/ + unsigned long (*GetFaceName)(struct _FPDF_SYSFONTINFO* pThis, + void* hFont, + char* buffer, + unsigned long buf_size); + + /** + * Method: GetFontCharset + * Get character set information for a font handle + * Interface Version: + * 1 + * Implementation Required: + * No + * Parameters: + * pThis - Pointer to the interface structure itself + * hFont - Font handle returned by MapFont or GetFont method + * Return Value: + * Character set identifier. See defined constants above. + **/ + int (*GetFontCharset)(struct _FPDF_SYSFONTINFO* pThis, void* hFont); + + /** + * Method: DeleteFont + * Delete a font handle + * Interface Version: + * 1 + * Implementation Required: + * Yes + * Parameters: + * pThis - Pointer to the interface structure itself + * hFont - Font handle returned by MapFont or GetFont method + * Return Value: + * None + **/ + void (*DeleteFont)(struct _FPDF_SYSFONTINFO* pThis, void* hFont); +} FPDF_SYSFONTINFO; + +/** + * Struct: FPDF_CharsetFontMap + * Provides the name of a font to use for a given charset value. + **/ +typedef struct FPDF_CharsetFontMap_ { + int charset; // Character Set Enum value, see FXFONT_*_CHARSET above. + const char* fontname; // Name of default font to use with that charset. +} FPDF_CharsetFontMap; + +/** + * Function: FPDF_GetDefaultTTFMap + * Returns a pointer to the default character set to TT Font name map. The + * map is an array of FPDF_CharsetFontMap structs, with its end indicated + * by a { -1, NULL } entry. + * Parameters: + * None. + * Return Value: + * Pointer to the Charset Font Map. + **/ +DLLEXPORT const FPDF_CharsetFontMap* STDCALL FPDF_GetDefaultTTFMap(); + +/** + * Function: FPDF_AddInstalledFont + * Add a system font to the list in Foxit SDK. + * Comments: + * This function is only called during the system font list building + *process. + * Parameters: + * mapper - Opaque pointer to Foxit font mapper + * face - The font face name + * charset - Font character set. See above defined constants. + * Return Value: + * None. + **/ +DLLEXPORT void STDCALL FPDF_AddInstalledFont(void* mapper, + const char* face, + int charset); + +/** + * Function: FPDF_SetSystemFontInfo + * Set the system font info interface into Foxit SDK + * Comments: + * Platform support implementation should implement required methods of + *FFDF_SYSFONTINFO interface, + * then call this function during SDK initialization process. + * Parameters: + * pFontInfo - Pointer to a FPDF_SYSFONTINFO structure + * Return Value: + * None + **/ +DLLEXPORT void STDCALL FPDF_SetSystemFontInfo(FPDF_SYSFONTINFO* pFontInfo); + +/** + * Function: FPDF_GetDefaultSystemFontInfo + * Get default system font info interface for current platform + * Comments: + * For some platforms Foxit SDK implement a default version of system + *font info interface. + * The default implementation can be used in FPDF_SetSystemFontInfo + *function. + * Parameters: + * None + * Return Value: + * Pointer to a FPDF_SYSFONTINFO structure describing the default + *interface. + * Or NULL if the platform doesn't have a default interface. + * Application should call FPDF_FreeDefaultSystemFontInfo to free the + *returned pointer. + **/ +DLLEXPORT FPDF_SYSFONTINFO* STDCALL FPDF_GetDefaultSystemFontInfo(); + +/** + * Function: FPDF_FreeDefaultSystemFontInfo + * Free a default system font info interface + * Comments: + * This function should be called on the output from + *FPDF_SetSystemFontInfo once it is no longer needed by the client. + * Parameters: + * pFontInfo - Pointer to a FPDF_SYSFONTINFO structure + * Return Value: + * None + **/ +DLLEXPORT void FPDF_FreeDefaultSystemFontInfo(FPDF_SYSFONTINFO* pFontInfo); + +#ifdef __cplusplus +} +#endif + +#endif // PUBLIC_FPDF_SYSFONTINFO_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_text.h b/modules/pdfium/pdfium/public/fpdf_text.h new file mode 100644 index 000000000000..5c241527ebd4 --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_text.h @@ -0,0 +1,425 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_TEXT_H_ +#define PUBLIC_FPDF_TEXT_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +// Exported Functions +#ifdef __cplusplus +extern "C" { +#endif + +// Function: FPDFText_LoadPage +// Prepare information about all characters in a page. +// Parameters: +// page - Handle to the page. Returned by FPDF_LoadPage function +// (in FPDFVIEW module). +// Return value: +// A handle to the text page information structure. +// NULL if something goes wrong. +// Comments: +// Application must call FPDFText_ClosePage to release the text page +// information. +// +DLLEXPORT FPDF_TEXTPAGE STDCALL FPDFText_LoadPage(FPDF_PAGE page); + +// Function: FPDFText_ClosePage +// Release all resources allocated for a text page information +// structure. +// Parameters: +// text_page - Handle to a text page information structure. +// Returned by FPDFText_LoadPage function. +// Return Value: +// None. +// +DLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page); + +// Function: FPDFText_CountChars +// Get number of characters in a page. +// Parameters: +// text_page - Handle to a text page information structure. +// Returned by FPDFText_LoadPage function. +// Return value: +// Number of characters in the page. Return -1 for error. +// Generated characters, like additional space characters, new line +// characters, are also counted. +// Comments: +// Characters in a page form a "stream", inside the stream, each +// character has an index. +// We will use the index parameters in many of FPDFTEXT functions. The +// first character in the page +// has an index value of zero. +// +DLLEXPORT int STDCALL FPDFText_CountChars(FPDF_TEXTPAGE text_page); + +// Function: FPDFText_GetUnicode +// Get Unicode of a character in a page. +// Parameters: +// text_page - Handle to a text page information structure. +// Returned by FPDFText_LoadPage function. +// index - Zero-based index of the character. +// Return value: +// The Unicode of the particular character. +// If a character is not encoded in Unicode and Foxit engine can't +// convert to Unicode, +// the return value will be zero. +// +DLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, + int index); + +// Function: FPDFText_GetFontSize +// Get the font size of a particular character. +// Parameters: +// text_page - Handle to a text page information structure. +// Returned by FPDFText_LoadPage function. +// index - Zero-based index of the character. +// Return value: +// The font size of the particular character, measured in points (about +// 1/72 inch). +// This is the typographic size of the font (so called "em size"). +// +DLLEXPORT double STDCALL FPDFText_GetFontSize(FPDF_TEXTPAGE text_page, + int index); + +// Function: FPDFText_GetCharBox +// Get bounding box of a particular character. +// Parameters: +// text_page - Handle to a text page information structure. +// Returned by FPDFText_LoadPage function. +// index - Zero-based index of the character. +// left - Pointer to a double number receiving left position +// of the character box. +// right - Pointer to a double number receiving right position +// of the character box. +// bottom - Pointer to a double number receiving bottom position +// of the character box. +// top - Pointer to a double number receiving top position of +// the character box. +// Return Value: +// None. +// Comments: +// All positions are measured in PDF "user space". +// +DLLEXPORT void STDCALL FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, + int index, + double* left, + double* right, + double* bottom, + double* top); + +// Function: FPDFText_GetCharIndexAtPos +// Get the index of a character at or nearby a certain position on the +// page. +// Parameters: +// text_page - Handle to a text page information structure. +// Returned by FPDFText_LoadPage function. +// x - X position in PDF "user space". +// y - Y position in PDF "user space". +// xTolerance - An x-axis tolerance value for character hit +// detection, in point unit. +// yTolerance - A y-axis tolerance value for character hit +// detection, in point unit. +// Return Value: +// The zero-based index of the character at, or nearby the point (x,y). +// If there is no character at or nearby the point, return value will +// be -1. +// If an error occurs, -3 will be returned. +// +DLLEXPORT int STDCALL FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page, + double x, + double y, + double xTolerance, + double yTolerance); + +// Function: FPDFText_GetText +// Extract unicode text string from the page. +// Parameters: +// text_page - Handle to a text page information structure. +// Returned by FPDFText_LoadPage function. +// start_index - Index for the start characters. +// count - Number of characters to be extracted. +// result - A buffer (allocated by application) receiving the +// extracted unicodes. +// The size of the buffer must be able to hold the +// number of characters plus a terminator. +// Return Value: +// Number of characters written into the result buffer, including the +// trailing terminator. +// Comments: +// This function ignores characters without unicode information. +// +DLLEXPORT int STDCALL FPDFText_GetText(FPDF_TEXTPAGE text_page, + int start_index, + int count, + unsigned short* result); + +// Function: FPDFText_CountRects +// Count number of rectangular areas occupied by a segment of texts. +// Parameters: +// text_page - Handle to a text page information structure. +// Returned by FPDFText_LoadPage function. +// start_index - Index for the start characters. +// count - Number of characters. +// Return value: +// Number of rectangles. Zero for error. +// Comments: +// This function, along with FPDFText_GetRect can be used by +// applications to detect the position +// on the page for a text segment, so proper areas can be highlighted +// or something. +// FPDFTEXT will automatically merge small character boxes into bigger +// one if those characters +// are on the same line and use same font settings. +// +DLLEXPORT int STDCALL FPDFText_CountRects(FPDF_TEXTPAGE text_page, + int start_index, + int count); + +// Function: FPDFText_GetRect +// Get a rectangular area from the result generated by +// FPDFText_CountRects. +// Parameters: +// text_page - Handle to a text page information structure. +// Returned by FPDFText_LoadPage function. +// rect_index - Zero-based index for the rectangle. +// left - Pointer to a double value receiving the rectangle +// left boundary. +// top - Pointer to a double value receiving the rectangle +// top boundary. +// right - Pointer to a double value receiving the rectangle +// right boundary. +// bottom - Pointer to a double value receiving the rectangle +// bottom boundary. +// Return Value: +// None. +// +DLLEXPORT void STDCALL FPDFText_GetRect(FPDF_TEXTPAGE text_page, + int rect_index, + double* left, + double* top, + double* right, + double* bottom); + +// Function: FPDFText_GetBoundedText +// Extract unicode text within a rectangular boundary on the page. +// Parameters: +// text_page - Handle to a text page information structure. +// Returned by FPDFText_LoadPage function. +// left - Left boundary. +// top - Top boundary. +// right - Right boundary. +// bottom - Bottom boundary. +// buffer - A unicode buffer. +// buflen - Number of characters (not bytes) for the buffer, +// excluding an additional terminator. +// Return Value: +// If buffer is NULL or buflen is zero, return number of characters +// (not bytes) of text present within +// the rectangle, excluding a terminating NUL. Generally you should +// pass a buffer at least one larger +// than this if you want a terminating NUL, which will be provided if +// space is available. +// Otherwise, return number of characters copied into the buffer, +// including the terminating NUL +// when space for it is available. +// Comment: +// If the buffer is too small, as much text as will fit is copied into +// it. +// +DLLEXPORT int STDCALL FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page, + double left, + double top, + double right, + double bottom, + unsigned short* buffer, + int buflen); + +// Flags used by FPDFText_FindStart function. +#define FPDF_MATCHCASE \ + 0x00000001 // If not set, it will not match case by default. +#define FPDF_MATCHWHOLEWORD \ + 0x00000002 // If not set, it will not match the whole word by default. + +// Function: FPDFText_FindStart +// Start a search. +// Parameters: +// text_page - Handle to a text page information structure. +// Returned by FPDFText_LoadPage function. +// findwhat - A unicode match pattern. +// flags - Option flags. +// start_index - Start from this character. -1 for end of the page. +// Return Value: +// A handle for the search context. FPDFText_FindClose must be called +// to release this handle. +// +DLLEXPORT FPDF_SCHHANDLE STDCALL FPDFText_FindStart(FPDF_TEXTPAGE text_page, + FPDF_WIDESTRING findwhat, + unsigned long flags, + int start_index); + +// Function: FPDFText_FindNext +// Search in the direction from page start to end. +// Parameters: +// handle - A search context handle returned by +// FPDFText_FindStart. +// Return Value: +// Whether a match is found. +// +DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindNext(FPDF_SCHHANDLE handle); + +// Function: FPDFText_FindPrev +// Search in the direction from page end to start. +// Parameters: +// handle - A search context handle returned by +// FPDFText_FindStart. +// Return Value: +// Whether a match is found. +// +DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindPrev(FPDF_SCHHANDLE handle); + +// Function: FPDFText_GetSchResultIndex +// Get the starting character index of the search result. +// Parameters: +// handle - A search context handle returned by +// FPDFText_FindStart. +// Return Value: +// Index for the starting character. +// +DLLEXPORT int STDCALL FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle); + +// Function: FPDFText_GetSchCount +// Get the number of matched characters in the search result. +// Parameters: +// handle - A search context handle returned by +// FPDFText_FindStart. +// Return Value: +// Number of matched characters. +// +DLLEXPORT int STDCALL FPDFText_GetSchCount(FPDF_SCHHANDLE handle); + +// Function: FPDFText_FindClose +// Release a search context. +// Parameters: +// handle - A search context handle returned by +// FPDFText_FindStart. +// Return Value: +// None. +// +DLLEXPORT void STDCALL FPDFText_FindClose(FPDF_SCHHANDLE handle); + +// Function: FPDFLink_LoadWebLinks +// Prepare information about weblinks in a page. +// Parameters: +// text_page - Handle to a text page information structure. +// Returned by FPDFText_LoadPage function. +// Return Value: +// A handle to the page's links information structure. +// NULL if something goes wrong. +// Comments: +// Weblinks are those links implicitly embedded in PDF pages. PDF also +// has a type of +// annotation called "link", FPDFTEXT doesn't deal with that kind of +// link. +// FPDFTEXT weblink feature is useful for automatically detecting links +// in the page +// contents. For example, things like "http://www.foxitsoftware.com" +// will be detected, +// so applications can allow user to click on those characters to +// activate the link, +// even the PDF doesn't come with link annotations. +// +// FPDFLink_CloseWebLinks must be called to release resources. +// +DLLEXPORT FPDF_PAGELINK STDCALL FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page); + +// Function: FPDFLink_CountWebLinks +// Count number of detected web links. +// Parameters: +// link_page - Handle returned by FPDFLink_LoadWebLinks. +// Return Value: +// Number of detected web links. +// +DLLEXPORT int STDCALL FPDFLink_CountWebLinks(FPDF_PAGELINK link_page); + +// Function: FPDFLink_GetURL +// Fetch the URL information for a detected web link. +// Parameters: +// link_page - Handle returned by FPDFLink_LoadWebLinks. +// link_index - Zero-based index for the link. +// buffer - A unicode buffer for the result. +// buflen - Number of characters (not bytes) for the buffer, +// including an additional terminator. +// Return Value: +// If |buffer| is NULL or |buflen| is zero, return the number of +// characters (not bytes) needed to buffer the result (an additional +// terminator is included in this count). +// Otherwise, copy the result into |buffer|, truncating at |buflen| if +// the result is too large to fit, and return the number of characters +// actually copied into the buffer (the additional terminator is also +// included in this count). +// If |link_index| does not correspond to a valid link, then the result +// is an empty string. +// +DLLEXPORT int STDCALL FPDFLink_GetURL(FPDF_PAGELINK link_page, + int link_index, + unsigned short* buffer, + int buflen); + +// Function: FPDFLink_CountRects +// Count number of rectangular areas for the link. +// Parameters: +// link_page - Handle returned by FPDFLink_LoadWebLinks. +// link_index - Zero-based index for the link. +// Return Value: +// Number of rectangular areas for the link. If |link_index| does +// not correspond to a valid link, then 0 is returned. +// +DLLEXPORT int STDCALL FPDFLink_CountRects(FPDF_PAGELINK link_page, + int link_index); + +// Function: FPDFLink_GetRect +// Fetch the boundaries of a rectangle for a link. +// Parameters: +// link_page - Handle returned by FPDFLink_LoadWebLinks. +// link_index - Zero-based index for the link. +// rect_index - Zero-based index for a rectangle. +// left - Pointer to a double value receiving the rectangle +// left boundary. +// top - Pointer to a double value receiving the rectangle +// top boundary. +// right - Pointer to a double value receiving the rectangle +// right boundary. +// bottom - Pointer to a double value receiving the rectangle +// bottom boundary. +// Return Value: +// None. If |link_index| does not correspond to a valid link, then +// |left|, |top|, |right|, and |bottom| remain unmodified. +// +DLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page, + int link_index, + int rect_index, + double* left, + double* top, + double* right, + double* bottom); + +// Function: FPDFLink_CloseWebLinks +// Release resources used by weblink feature. +// Parameters: +// link_page - Handle returned by FPDFLink_LoadWebLinks. +// Return Value: +// None. +// +DLLEXPORT void STDCALL FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page); + +#ifdef __cplusplus +} +#endif + +#endif // PUBLIC_FPDF_TEXT_H_ diff --git a/modules/pdfium/pdfium/public/fpdf_transformpage.h b/modules/pdfium/pdfium/public/fpdf_transformpage.h new file mode 100644 index 000000000000..66271fcda8a1 --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdf_transformpage.h @@ -0,0 +1,161 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef PUBLIC_FPDF_TRANSFORMPAGE_H_ +#define PUBLIC_FPDF_TRANSFORMPAGE_H_ + +// NOLINTNEXTLINE(build/include) +#include "fpdfview.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void* FPDF_PAGEARCSAVER; +typedef void* FPDF_PAGEARCLOADER; + +/** +* Set "MediaBox" entry to the page dictionary. +* @param[in] page - Handle to a page. +* @param[in] left - The left of the rectangle. +* @param[in] bottom - The bottom of the rectangle. +* @param[in] right - The right of the rectangle. +* @param[in] top - The top of the rectangle. +* @retval None. +*/ +DLLEXPORT void STDCALL FPDFPage_SetMediaBox(FPDF_PAGE page, + float left, + float bottom, + float right, + float top); + +/** +* Set "CropBox" entry to the page dictionary. +* @param[in] page - Handle to a page. +* @param[in] left - The left of the rectangle. +* @param[in] bottom - The bottom of the rectangle. +* @param[in] right - The right of the rectangle. +* @param[in] top - The top of the rectangle. +* @retval None. +*/ +DLLEXPORT void STDCALL FPDFPage_SetCropBox(FPDF_PAGE page, + float left, + float bottom, + float right, + float top); + +/** Get "MediaBox" entry from the page dictionary. +* @param[in] page - Handle to a page. +* @param[in] left - Pointer to a double value receiving the left of the +* rectangle. +* @param[in] bottom - Pointer to a double value receiving the bottom of the +* rectangle. +* @param[in] right - Pointer to a double value receiving the right of the +* rectangle. +* @param[in] top - Pointer to a double value receiving the top of the +* rectangle. +* @retval True if success,else fail. +*/ +DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetMediaBox(FPDF_PAGE page, + float* left, + float* bottom, + float* right, + float* top); + +/** Get "CropBox" entry from the page dictionary. +* @param[in] page - Handle to a page. +* @param[in] left - Pointer to a double value receiving the left of the +* rectangle. +* @param[in] bottom - Pointer to a double value receiving the bottom of the +* rectangle. +* @param[in] right - Pointer to a double value receiving the right of the +* rectangle. +* @param[in] top - Pointer to a double value receiving the top of the +* rectangle. +* @retval True if success,else fail. +*/ +DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetCropBox(FPDF_PAGE page, + float* left, + float* bottom, + float* right, + float* top); + +/** +* Transform the whole page with a specified matrix, then clip the page content +* region. +* +* @param[in] page - A page handle. +* @param[in] matrix - The transform matrix. +* @param[in] clipRect - A rectangle page area to be clipped. +* @Note. This function will transform the whole page, and would take effect to +* all the objects in the page. +*/ +DLLEXPORT FPDF_BOOL STDCALL FPDFPage_TransFormWithClip(FPDF_PAGE page, + FS_MATRIX* matrix, + FS_RECTF* clipRect); + +/** +* Transform (scale, rotate, shear, move) the clip path of page object. +* @param[in] page_object - Handle to a page object. Returned by +* FPDFPageObj_NewImageObj. +* @param[in] a - The coefficient "a" of the matrix. +* @param[in] b - The coefficient "b" of the matrix. +* @param[in] c - The coefficient "c" of the matrix. +* @param[in] d - The coefficient "d" of the matrix. +* @param[in] e - The coefficient "e" of the matrix. +* @param[in] f - The coefficient "f" of the matrix. +* @retval None. +*/ +DLLEXPORT void STDCALL +FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object, + double a, + double b, + double c, + double d, + double e, + double f); + +/** +* Create a new clip path, with a rectangle inserted. +* +* @param[in] left - The left of the clip box. +* @param[in] bottom - The bottom of the clip box. +* @param[in] right - The right of the clip box. +* @param[in] top - The top of the clip box. +* @retval a handle to the clip path. +*/ +DLLEXPORT FPDF_CLIPPATH STDCALL FPDF_CreateClipPath(float left, + float bottom, + float right, + float top); + +/** +* Destroy the clip path. +* +* @param[in] clipPath - A handle to the clip path. +* Destroy the clip path. +* @retval None. +*/ +DLLEXPORT void STDCALL FPDF_DestroyClipPath(FPDF_CLIPPATH clipPath); + +/** +* Clip the page content, the page content that outside the clipping region +* become invisible. +* +* @param[in] page - A page handle. +* @param[in] clipPath - A handle to the clip path. +* @Note. A clip path will be inserted before the page content stream or content +* array. In this way, the page content will be clipped +* by this clip path. +*/ +DLLEXPORT void STDCALL FPDFPage_InsertClipPath(FPDF_PAGE page, + FPDF_CLIPPATH clipPath); + +#ifdef __cplusplus +} +#endif + +#endif // PUBLIC_FPDF_TRANSFORMPAGE_H_ diff --git a/modules/pdfium/pdfium/public/fpdfview.h b/modules/pdfium/pdfium/public/fpdfview.h new file mode 100644 index 000000000000..1c47a366bd00 --- /dev/null +++ b/modules/pdfium/pdfium/public/fpdfview.h @@ -0,0 +1,1039 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +// NOTE: External docs refer to this file as "fpdfview.h", so do not rename +// despite lack of consistency with other public files. + +#ifndef PUBLIC_FPDFVIEW_H_ +#define PUBLIC_FPDFVIEW_H_ + +#if defined(_WIN32) && !defined(__WINDOWS__) +#include +#endif + +#ifdef PDF_ENABLE_XFA +// PDF_USE_XFA is set in confirmation that this version of PDFium can support +// XFA forms as requested by the PDF_ENABLE_XFA setting. +#define PDF_USE_XFA +#endif // PDF_ENABLE_XFA + +// PDF types +typedef void* FPDF_ACTION; +typedef void* FPDF_BITMAP; +typedef void* FPDF_BOOKMARK; +typedef void* FPDF_CLIPPATH; +typedef void* FPDF_DEST; +typedef void* FPDF_DOCSCHHANDLE; +typedef void* FPDF_DOCUMENT; +typedef void* FPDF_FONT; +typedef void* FPDF_HMODULE; +typedef void* FPDF_LINK; +typedef void* FPDF_MODULEMGR; +typedef void* FPDF_PAGE; +typedef void* FPDF_PAGELINK; +typedef void* FPDF_PAGEOBJECT; // Page object(text, path, etc) +typedef void* FPDF_PAGERANGE; +typedef void* FPDF_PATH; +typedef void* FPDF_RECORDER; +typedef void* FPDF_SCHHANDLE; +typedef void* FPDF_STRUCTELEMENT; +typedef void* FPDF_STRUCTTREE; +typedef void* FPDF_TEXTPAGE; + +#ifdef PDF_ENABLE_XFA +typedef void* FPDF_STRINGHANDLE; +typedef void* FPDF_WIDGET; +#endif // PDF_ENABLE_XFA + +// Basic data types +typedef int FPDF_BOOL; +typedef int FPDF_ERROR; +typedef unsigned long FPDF_DWORD; +typedef float FS_FLOAT; + +#ifdef PDF_ENABLE_XFA +typedef void* FPDF_LPVOID; +typedef void const* FPDF_LPCVOID; +typedef char const* FPDF_LPCSTR; +typedef int FPDF_RESULT; +#endif + +// Duplex types +typedef enum _FPDF_DUPLEXTYPE_ { + DuplexUndefined = 0, + Simplex, + DuplexFlipShortEdge, + DuplexFlipLongEdge +} FPDF_DUPLEXTYPE; + +// String types +typedef unsigned short FPDF_WCHAR; +typedef unsigned char const* FPDF_LPCBYTE; + +// FPDFSDK may use three types of strings: byte string, wide string (UTF-16LE +// encoded), and platform dependent string +typedef const char* FPDF_BYTESTRING; + +// FPDFSDK always uses UTF-16LE encoded wide strings, each character uses 2 +// bytes (except surrogation), with the low byte first. +typedef const unsigned short* FPDF_WIDESTRING; + +#ifdef PDF_ENABLE_XFA +// Structure for a byte string. +// Note, a byte string commonly means a UTF-16LE formated string. +typedef struct _FPDF_BSTR { + // String buffer. + char* str; + // Length of the string, in bytes. + int len; +} FPDF_BSTR; +#endif // PDF_ENABLE_XFA + +// For Windows programmers: In most cases it's OK to treat FPDF_WIDESTRING as a +// Windows unicode string, however, special care needs to be taken if you +// expect to process Unicode larger than 0xffff. +// +// For Linux/Unix programmers: most compiler/library environments use 4 bytes +// for a Unicode character, and you have to convert between FPDF_WIDESTRING and +// system wide string by yourself. +typedef const char* FPDF_STRING; + +// Matrix for transformation. +typedef struct _FS_MATRIX_ { + float a; + float b; + float c; + float d; + float e; + float f; +} FS_MATRIX; + +// Rectangle area(float) in device or page coordinate system. +typedef struct _FS_RECTF_ { + // The x-coordinate of the left-top corner. + float left; + // The y-coordinate of the left-top corner. + float top; + // The x-coordinate of the right-bottom corner. + float right; + // The y-coordinate of the right-bottom corner. + float bottom; +} * FS_LPRECTF, FS_RECTF; + +// Const Pointer to FS_RECTF structure. +typedef const FS_RECTF* FS_LPCRECTF; + +#if defined(_WIN32) && defined(FPDFSDK_EXPORTS) +// On Windows system, functions are exported in a DLL +#define DLLEXPORT __declspec(dllexport) +#define STDCALL __stdcall +#else +#define DLLEXPORT +#define STDCALL +#endif + +// Exported Functions +#ifdef __cplusplus +extern "C" { +#endif + +// Function: FPDF_InitLibrary +// Initialize the FPDFSDK library +// Parameters: +// None +// Return value: +// None. +// Comments: +// Convenience function to call FPDF_InitLibraryWithConfig() for +// backwards comatibility purposes. +DLLEXPORT void STDCALL FPDF_InitLibrary(); + +// Process-wide options for initializing the library. +typedef struct FPDF_LIBRARY_CONFIG_ { + // Version number of the interface. Currently must be 2. + int version; + + // Array of paths to scan in place of the defaults when using built-in + // FXGE font loading code. The array is terminated by a NULL pointer. + // The Array may be NULL itself to use the default paths. May be ignored + // entirely depending upon the platform. + const char** m_pUserFontPaths; + + // Version 2. + + // pointer to the v8::Isolate to use, or NULL to force PDFium to create one. + void* m_pIsolate; + + // The embedder data slot to use in the v8::Isolate to store PDFium's + // per-isolate data. The value needs to be between 0 and + // v8::Internals::kNumIsolateDataLots (exclusive). Note that 0 is fine + // for most embedders. + unsigned int m_v8EmbedderSlot; +} FPDF_LIBRARY_CONFIG; + +// Function: FPDF_InitLibraryWithConfig +// Initialize the FPDFSDK library +// Parameters: +// config - configuration information as above. +// Return value: +// None. +// Comments: +// You have to call this function before you can call any PDF +// processing functions. +DLLEXPORT void STDCALL FPDF_InitLibraryWithConfig( + const FPDF_LIBRARY_CONFIG* config); + +// Function: FPDF_DestroyLibary +// Release all resources allocated by the FPDFSDK library. +// Parameters: +// None. +// Return value: +// None. +// Comments: +// You can call this function to release all memory blocks allocated by +// the library. +// After this function is called, you should not call any PDF +// processing functions. +DLLEXPORT void STDCALL FPDF_DestroyLibrary(); + +// Policy for accessing the local machine time. +#define FPDF_POLICY_MACHINETIME_ACCESS 0 + +// Function: FPDF_SetSandBoxPolicy +// Set the policy for the sandbox environment. +// Parameters: +// policy - The specified policy for setting, for example: +// FPDF_POLICY_MACHINETIME_ACCESS. +// enable - True to enable, false to disable the policy. +// Return value: +// None. +DLLEXPORT void STDCALL FPDF_SetSandBoxPolicy(FPDF_DWORD policy, + FPDF_BOOL enable); + +#if defined(_WIN32) +#if defined(PDFIUM_PRINT_TEXT_WITH_GDI) +// Pointer to a helper function to make |font| with |text| of |text_length| +// accessible when printing text with GDI. This is useful in sandboxed +// environments where PDFium's access to GDI may be restricted. +typedef void (*PDFiumEnsureTypefaceCharactersAccessible)(const LOGFONT* font, + const wchar_t* text, + size_t text_length); + +// Function: FPDF_SetTypefaceAccessibleFunc +// Set the function pointer that makes GDI fonts available in sandboxed +// environments. Experimental API. +// Parameters: +// func - A function pointer. See description above. +// Return value: +// None. +DLLEXPORT void STDCALL +FPDF_SetTypefaceAccessibleFunc(PDFiumEnsureTypefaceCharactersAccessible func); + +// Function: FPDF_SetPrintTextWithGDI +// Set whether to use GDI to draw fonts when printing on Windows. +// Experimental API. +// Parameters: +// use_gdi - Set to true to enable printing text with GDI. +// Return value: +// None. +DLLEXPORT void STDCALL FPDF_SetPrintTextWithGDI(FPDF_BOOL use_gdi); +#endif // PDFIUM_PRINT_TEXT_WITH_GDI + +// Function: FPDF_SetPrintPostscriptLevel +// Set postscript printing level when printing on Windows. +// Experimental API. +// Parameters: +// postscript_level - 0 to disable postscript printing, +// 2 to print with postscript level 2, +// 3 to print with postscript level 3. +// All other values are invalid. +// Return value: +// True if successful, false if unsucessful (typically invalid input). +DLLEXPORT FPDF_BOOL STDCALL +FPDF_SetPrintPostscriptLevel(FPDF_BOOL postscript_level); +#endif // defined(_WIN32) + +// Function: FPDF_LoadDocument +// Open and load a PDF document. +// Parameters: +// file_path - Path to the PDF file (including extension). +// password - A string used as the password for the PDF file. +// If no password is needed, empty or NULL can be used. +// Return value: +// A handle to the loaded document, or NULL on failure. +// Comments: +// Loaded document can be closed by FPDF_CloseDocument(). +// If this function fails, you can use FPDF_GetLastError() to retrieve +// the reason why it failed. +DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path, + FPDF_BYTESTRING password); + +// Function: FPDF_LoadMemDocument +// Open and load a PDF document from memory. +// Parameters: +// data_buf - Pointer to a buffer containing the PDF document. +// size - Number of bytes in the PDF document. +// password - A string used as the password for the PDF file. +// If no password is needed, empty or NULL can be used. +// Return value: +// A handle to the loaded document, or NULL on failure. +// Comments: +// The memory buffer must remain valid when the document is open. +// The loaded document can be closed by FPDF_CloseDocument. +// If this function fails, you can use FPDF_GetLastError() to retrieve +// the reason why it failed. +// Notes: +// If PDFium is built with the XFA module, the application should call +// FPDF_LoadXFA() function after the PDF document loaded to support XFA +// fields defined in the fpdfformfill.h file. +DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf, + int size, + FPDF_BYTESTRING password); + +// Structure for custom file access. +typedef struct { + // File length, in bytes. + unsigned long m_FileLen; + + // A function pointer for getting a block of data from a specific position. + // Position is specified by byte offset from the beginning of the file. + // The position and size will never go out of range of the file length. + // It may be possible for FPDFSDK to call this function multiple times for + // the same position. + // Return value: should be non-zero if successful, zero for error. + int (*m_GetBlock)(void* param, + unsigned long position, + unsigned char* pBuf, + unsigned long size); + + // A custom pointer for all implementation specific data. This pointer will + // be used as the first parameter to the m_GetBlock callback. + void* m_Param; +} FPDF_FILEACCESS; + +#ifdef PDF_ENABLE_XFA +/** + * @brief Structure for file reading or writing (I/O). + * + * @note This is a handler and should be implemented by callers. + */ +typedef struct _FPDF_FILEHANDLER { + /** + * @brief User-defined data. + * @note Callers can use this field to track controls. + */ + FPDF_LPVOID clientData; + /** + * @brief Callback function to release the current file stream object. + * + * @param[in] clientData Pointer to user-defined data. + * + * @return None. + */ + void (*Release)(FPDF_LPVOID clientData); + /** + * @brief Callback function to retrieve the current file stream size. + * + * @param[in] clientData Pointer to user-defined data. + * + * @return Size of file stream. + */ + FPDF_DWORD (*GetSize)(FPDF_LPVOID clientData); + /** + * @brief Callback function to read data from the current file stream. + * + * @param[in] clientData Pointer to user-defined data. + * @param[in] offset Offset position starts from the beginning of file + * stream. This parameter indicates reading position. + * @param[in] buffer Memory buffer to store data which are read from + * file stream. This parameter should not be NULL. + * @param[in] size Size of data which should be read from file + * stream, in bytes. The buffer indicated by the parameter buffer + * should be enough to store specified data. + * + * @return 0 for success, other value for failure. + */ + FPDF_RESULT (*ReadBlock)(FPDF_LPVOID clientData, + FPDF_DWORD offset, + FPDF_LPVOID buffer, + FPDF_DWORD size); + /** + * @brief Callback function to write data into the current file stream. + * + * @param[in] clientData Pointer to user-defined data. + * @param[in] offset Offset position starts from the beginning of file + * stream. This parameter indicates writing position. + * @param[in] buffer Memory buffer contains data which is written into + * file stream. This parameter should not be NULL. + * @param[in] size Size of data which should be written into file + * stream, in bytes. + * + * @return 0 for success, other value for failure. + */ + FPDF_RESULT (*WriteBlock)(FPDF_LPVOID clientData, + FPDF_DWORD offset, + FPDF_LPCVOID buffer, + FPDF_DWORD size); + /** + * @brief Callback function to flush all internal accessing buffers. + * + * @param[in] clientData Pointer to user-defined data. + * + * @return 0 for success, other value for failure. + */ + FPDF_RESULT (*Flush)(FPDF_LPVOID clientData); + /** + * @brief Callback function to change file size. + * + * @details This function is called under writing mode usually. Implementer + * can determine whether to realize it based on application requests. + * + * @param[in] clientData Pointer to user-defined data. + * @param[in] size New size of file stream, in bytes. + * + * @return 0 for success, other value for failure. + */ + FPDF_RESULT (*Truncate)(FPDF_LPVOID clientData, FPDF_DWORD size); +} FPDF_FILEHANDLER, *FPDF_LPFILEHANDLER; + +#endif +// Function: FPDF_LoadCustomDocument +// Load PDF document from a custom access descriptor. +// Parameters: +// pFileAccess - A structure for accessing the file. +// password - Optional password for decrypting the PDF file. +// Return value: +// A handle to the loaded document, or NULL on failure. +// Comments: +// The application must keep the file resources valid until the PDF +// document is closed. +// +// The loaded document can be closed with FPDF_CloseDocument. +// Notes: +// If PDFium is built with the XFA module, the application should call +// FPDF_LoadXFA() function after the PDF document loaded to support XFA +// fields defined in the fpdfformfill.h file. +DLLEXPORT FPDF_DOCUMENT STDCALL +FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password); + +// Function: FPDF_GetFileVersion +// Get the file version of the given PDF document. +// Parameters: +// doc - Handle to a document. +// fileVersion - The PDF file version. File version: 14 for 1.4, 15 +// for 1.5, ... +// Return value: +// True if succeeds, false otherwise. +// Comments: +// If the document was created by FPDF_CreateNewDocument, +// then this function will always fail. +DLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, + int* fileVersion); + +#define FPDF_ERR_SUCCESS 0 // No error. +#define FPDF_ERR_UNKNOWN 1 // Unknown error. +#define FPDF_ERR_FILE 2 // File not found or could not be opened. +#define FPDF_ERR_FORMAT 3 // File not in PDF format or corrupted. +#define FPDF_ERR_PASSWORD 4 // Password required or incorrect password. +#define FPDF_ERR_SECURITY 5 // Unsupported security scheme. +#define FPDF_ERR_PAGE 6 // Page not found or content error. +#ifdef PDF_ENABLE_XFA +#define FPDF_ERR_XFALOAD 7 // Load XFA error. +#define FPDF_ERR_XFALAYOUT 8 // Layout XFA error. +#endif // PDF_ENABLE_XFA + +// Function: FPDF_GetLastError +// Get last error code when a function fails. +// Parameters: +// None. +// Return value: +// A 32-bit integer indicating error code as defined above. +// Comments: +// If the previous SDK call succeeded, the return value of this +// function is not defined. +DLLEXPORT unsigned long STDCALL FPDF_GetLastError(); + +// Function: FPDF_GetDocPermission +// Get file permission flags of the document. +// Parameters: +// document - Handle to a document. Returned by FPDF_LoadDocument. +// Return value: +// A 32-bit integer indicating permission flags. Please refer to the +// PDF Reference for detailed descriptions. If the document is not +// protected, 0xffffffff will be returned. +DLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document); + +// Function: FPDF_GetSecurityHandlerRevision +// Get the revision for the security handler. +// Parameters: +// document - Handle to a document. Returned by FPDF_LoadDocument. +// Return value: +// The security handler revision number. Please refer to the PDF +// Reference for a detailed description. If the document is not +// protected, -1 will be returned. +DLLEXPORT int STDCALL FPDF_GetSecurityHandlerRevision(FPDF_DOCUMENT document); + +// Function: FPDF_GetPageCount +// Get total number of pages in the document. +// Parameters: +// document - Handle to document. Returned by FPDF_LoadDocument. +// Return value: +// Total number of pages in the document. +DLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document); + +// Function: FPDF_LoadPage +// Load a page inside the document. +// Parameters: +// document - Handle to document. Returned by FPDF_LoadDocument +// page_index - Index number of the page. 0 for the first page. +// Return value: +// A handle to the loaded page, or NULL if page load fails. +// Comments: +// The loaded page can be rendered to devices using FPDF_RenderPage. +// The loaded page can be closed using FPDF_ClosePage. +DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, + int page_index); + +// Function: FPDF_GetPageWidth +// Get page width. +// Parameters: +// page - Handle to the page. Returned by FPDF_LoadPage. +// Return value: +// Page width (excluding non-displayable area) measured in points. +// One point is 1/72 inch (around 0.3528 mm). +DLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page); + +// Function: FPDF_GetPageHeight +// Get page height. +// Parameters: +// page - Handle to the page. Returned by FPDF_LoadPage. +// Return value: +// Page height (excluding non-displayable area) measured in points. +// One point is 1/72 inch (around 0.3528 mm) +DLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page); + +// Function: FPDF_GetPageSizeByIndex +// Get the size of the page at the given index. +// Parameters: +// document - Handle to document. Returned by FPDF_LoadDocument. +// page_index - Page index, zero for the first page. +// width - Pointer to a double to receive the page width +// (in points). +// height - Pointer to a double to receive the page height +// (in points). +// Return value: +// Non-zero for success. 0 for error (document or page not found). +DLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, + int page_index, + double* width, + double* height); + +// Page rendering flags. They can be combined with bit-wise OR. +// +// Set if annotations are to be rendered. +#define FPDF_ANNOT 0x01 +// Set if using text rendering optimized for LCD display. +#define FPDF_LCD_TEXT 0x02 +// Don't use the native text output available on some platforms +#define FPDF_NO_NATIVETEXT 0x04 +// Grayscale output. +#define FPDF_GRAYSCALE 0x08 +// Set if you want to get some debug info. +#define FPDF_DEBUG_INFO 0x80 +// Set if you don't want to catch exceptions. +#define FPDF_NO_CATCH 0x100 +// Limit image cache size. +#define FPDF_RENDER_LIMITEDIMAGECACHE 0x200 +// Always use halftone for image stretching. +#define FPDF_RENDER_FORCEHALFTONE 0x400 +// Render for printing. +#define FPDF_PRINTING 0x800 +// Set to disable anti-aliasing on text. +#define FPDF_RENDER_NO_SMOOTHTEXT 0x1000 +// Set to disable anti-aliasing on images. +#define FPDF_RENDER_NO_SMOOTHIMAGE 0x2000 +// Set to disable anti-aliasing on paths. +#define FPDF_RENDER_NO_SMOOTHPATH 0x4000 +// Set whether to render in a reverse Byte order, this flag is only used when +// rendering to a bitmap. +#define FPDF_REVERSE_BYTE_ORDER 0x10 + +#ifdef _WIN32 +// Function: FPDF_RenderPage +// Render contents of a page to a device (screen, bitmap, or printer). +// This function is only supported on Windows. +// Parameters: +// dc - Handle to the device context. +// page - Handle to the page. Returned by FPDF_LoadPage. +// start_x - Left pixel position of the display area in +// device coordinates. +// start_y - Top pixel position of the display area in device +// coordinates. +// size_x - Horizontal size (in pixels) for displaying the page. +// size_y - Vertical size (in pixels) for displaying the page. +// rotate - Page orientation: +// 0 (normal) +// 1 (rotated 90 degrees clockwise) +// 2 (rotated 180 degrees) +// 3 (rotated 90 degrees counter-clockwise) +// flags - 0 for normal display, or combination of flags +// defined above. +// Return value: +// None. +DLLEXPORT void STDCALL FPDF_RenderPage(HDC dc, + FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int flags); +#endif + +// Function: FPDF_RenderPageBitmap +// Render contents of a page to a device independent bitmap. +// Parameters: +// bitmap - Handle to the device independent bitmap (as the +// output buffer). The bitmap handle can be created +// by FPDFBitmap_Create. +// page - Handle to the page. Returned by FPDF_LoadPage +// start_x - Left pixel position of the display area in +// bitmap coordinates. +// start_y - Top pixel position of the display area in bitmap +// coordinates. +// size_x - Horizontal size (in pixels) for displaying the page. +// size_y - Vertical size (in pixels) for displaying the page. +// rotate - Page orientation: +// 0 (normal) +// 1 (rotated 90 degrees clockwise) +// 2 (rotated 180 degrees) +// 3 (rotated 90 degrees counter-clockwise) +// flags - 0 for normal display, or combination of the Page +// Rendering flags defined above. With the FPDF_ANNOT +// flag, it renders all annotations that do not require +// user-interaction, which are all annotations except +// widget and popup annotations. +// Return value: +// None. +DLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, + FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int flags); + +// Function: FPDF_RenderPageBitmapWithMatrix +// Render contents of a page to a device independent bitmap. +// Parameters: +// bitmap - Handle to the device independent bitmap (as the +// output buffer). The bitmap handle can be created +// by FPDFBitmap_Create. +// page - Handle to the page. Returned by FPDF_LoadPage +// matrix - The transform matrix. +// clipping - The rect to clip to. +// flags - 0 for normal display, or combination of the Page +// Rendering flags defined above. With the FPDF_ANNOT +// flag, it renders all annotations that do not require +// user-interaction, which are all annotations except +// widget and popup annotations. +// Return value: +// None. +DLLEXPORT void STDCALL FPDF_RenderPageBitmapWithMatrix(FPDF_BITMAP bitmap, + FPDF_PAGE page, + const FS_MATRIX* matrix, + const FS_RECTF* clipping, + int flags); + +#ifdef _SKIA_SUPPORT_ +DLLEXPORT FPDF_RECORDER STDCALL FPDF_RenderPageSkp(FPDF_PAGE page, + int size_x, + int size_y); +#endif + +// Function: FPDF_ClosePage +// Close a loaded PDF page. +// Parameters: +// page - Handle to the loaded page. +// Return value: +// None. +DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page); + +// Function: FPDF_CloseDocument +// Close a loaded PDF document. +// Parameters: +// document - Handle to the loaded document. +// Return value: +// None. +DLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document); + +// Function: FPDF_DeviceToPage +// Convert the screen coordinates of a point to page coordinates. +// Parameters: +// page - Handle to the page. Returned by FPDF_LoadPage. +// start_x - Left pixel position of the display area in +// device coordinates. +// start_y - Top pixel position of the display area in device +// coordinates. +// size_x - Horizontal size (in pixels) for displaying the page. +// size_y - Vertical size (in pixels) for displaying the page. +// rotate - Page orientation: +// 0 (normal) +// 1 (rotated 90 degrees clockwise) +// 2 (rotated 180 degrees) +// 3 (rotated 90 degrees counter-clockwise) +// device_x - X value in device coordinates to be converted. +// device_y - Y value in device coordinates to be converted. +// page_x - A pointer to a double receiving the converted X +// value in page coordinates. +// page_y - A pointer to a double receiving the converted Y +// value in page coordinates. +// Return value: +// None. +// Comments: +// The page coordinate system has its origin at the left-bottom corner +// of the page, with the X-axis on the bottom going to the right, and +// the Y-axis on the left side going up. +// +// NOTE: this coordinate system can be altered when you zoom, scroll, +// or rotate a page, however, a point on the page should always have +// the same coordinate values in the page coordinate system. +// +// The device coordinate system is device dependent. For screen device, +// its origin is at the left-top corner of the window. However this +// origin can be altered by the Windows coordinate transformation +// utilities. +// +// You must make sure the start_x, start_y, size_x, size_y +// and rotate parameters have exactly same values as you used in +// the FPDF_RenderPage() function call. +DLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + int device_x, + int device_y, + double* page_x, + double* page_y); + +// Function: FPDF_PageToDevice +// Convert the page coordinates of a point to screen coordinates. +// Parameters: +// page - Handle to the page. Returned by FPDF_LoadPage. +// start_x - Left pixel position of the display area in +// device coordinates. +// start_y - Top pixel position of the display area in device +// coordinates. +// size_x - Horizontal size (in pixels) for displaying the page. +// size_y - Vertical size (in pixels) for displaying the page. +// rotate - Page orientation: +// 0 (normal) +// 1 (rotated 90 degrees clockwise) +// 2 (rotated 180 degrees) +// 3 (rotated 90 degrees counter-clockwise) +// page_x - X value in page coordinates. +// page_y - Y value in page coordinate. +// device_x - A pointer to an integer receiving the result X +// value in device coordinates. +// device_y - A pointer to an integer receiving the result Y +// value in device coordinates. +// Return value: +// None. +// Comments: +// See comments for FPDF_DeviceToPage(). +DLLEXPORT void STDCALL FPDF_PageToDevice(FPDF_PAGE page, + int start_x, + int start_y, + int size_x, + int size_y, + int rotate, + double page_x, + double page_y, + int* device_x, + int* device_y); + +// Function: FPDFBitmap_Create +// Create a device independent bitmap (FXDIB). +// Parameters: +// width - The number of pixels in width for the bitmap. +// Must be greater than 0. +// height - The number of pixels in height for the bitmap. +// Must be greater than 0. +// alpha - A flag indicating whether the alpha channel is used. +// Non-zero for using alpha, zero for not using. +// Return value: +// The created bitmap handle, or NULL if a parameter error or out of +// memory. +// Comments: +// The bitmap always uses 4 bytes per pixel. The first byte is always +// double word aligned. +// +// The byte order is BGRx (the last byte unused if no alpha channel) or +// BGRA. +// +// The pixels in a horizontal line are stored side by side, with the +// left most pixel stored first (with lower memory address). +// Each line uses width * 4 bytes. +// +// Lines are stored one after another, with the top most line stored +// first. There is no gap between adjacent lines. +// +// This function allocates enough memory for holding all pixels in the +// bitmap, but it doesn't initialize the buffer. Applications can use +// FPDFBitmap_FillRect to fill the bitmap using any color. +DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width, + int height, + int alpha); + +// More DIB formats +// Gray scale bitmap, one byte per pixel. +#define FPDFBitmap_Gray 1 +// 3 bytes per pixel, byte order: blue, green, red. +#define FPDFBitmap_BGR 2 +// 4 bytes per pixel, byte order: blue, green, red, unused. +#define FPDFBitmap_BGRx 3 +// 4 bytes per pixel, byte order: blue, green, red, alpha. +#define FPDFBitmap_BGRA 4 + +// Function: FPDFBitmap_CreateEx +// Create a device independent bitmap (FXDIB) +// Parameters: +// width - The number of pixels in width for the bitmap. +// Must be greater than 0. +// height - The number of pixels in height for the bitmap. +// Must be greater than 0. +// format - A number indicating for bitmap format, as defined +// above. +// first_scan - A pointer to the first byte of the first line if +// using an external buffer. If this parameter is NULL, +// then the a new buffer will be created. +// stride - Number of bytes for each scan line, for external +// buffer only. +// Return value: +// The bitmap handle, or NULL if parameter error or out of memory. +// Comments: +// Similar to FPDFBitmap_Create function, but allows for more formats +// and an external buffer is supported. The bitmap created by this +// function can be used in any place that a FPDF_BITMAP handle is +// required. +// +// If an external buffer is used, then the application should destroy +// the buffer by itself. FPDFBitmap_Destroy function will not destroy +// the buffer. +DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_CreateEx(int width, + int height, + int format, + void* first_scan, + int stride); + +// Function: FPDFBitmap_FillRect +// Fill a rectangle in a bitmap. +// Parameters: +// bitmap - The handle to the bitmap. Returned by +// FPDFBitmap_Create. +// left - The left position. Starting from 0 at the +// left-most pixel. +// top - The top position. Starting from 0 at the +// top-most line. +// width - Width in pixels to be filled. +// height - Height in pixels to be filled. +// color - A 32-bit value specifing the color, in 8888 ARGB +// format. +// Return value: +// None. +// Comments: +// This function sets the color and (optionally) alpha value in the +// specified region of the bitmap. +// +// NOTE: If the alpha channel is used, this function does NOT +// composite the background with the source color, instead the +// background will be replaced by the source color and the alpha. +// +// If the alpha channel is not used, the alpha parameter is ignored. +DLLEXPORT void STDCALL FPDFBitmap_FillRect(FPDF_BITMAP bitmap, + int left, + int top, + int width, + int height, + FPDF_DWORD color); + +// Function: FPDFBitmap_GetBuffer +// Get data buffer of a bitmap. +// Parameters: +// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create. +// Return value: +// The pointer to the first byte of the bitmap buffer. +// Comments: +// The stride may be more than width * number of bytes per pixel +// +// Applications can use this function to get the bitmap buffer pointer, +// then manipulate any color and/or alpha values for any pixels in the +// bitmap. +// +// The data is in BGRA format. Where the A maybe unused if alpha was +// not specified. +DLLEXPORT void* STDCALL FPDFBitmap_GetBuffer(FPDF_BITMAP bitmap); + +// Function: FPDFBitmap_GetWidth +// Get width of a bitmap. +// Parameters: +// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create. +// Return value: +// The width of the bitmap in pixels. +DLLEXPORT int STDCALL FPDFBitmap_GetWidth(FPDF_BITMAP bitmap); + +// Function: FPDFBitmap_GetHeight +// Get height of a bitmap. +// Parameters: +// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create. +// Return value: +// The height of the bitmap in pixels. +DLLEXPORT int STDCALL FPDFBitmap_GetHeight(FPDF_BITMAP bitmap); + +// Function: FPDFBitmap_GetStride +// Get number of bytes for each line in the bitmap buffer. +// Parameters: +// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create. +// Return value: +// The number of bytes for each line in the bitmap buffer. +// Comments: +// The stride may be more than width * number of bytes per pixel. +DLLEXPORT int STDCALL FPDFBitmap_GetStride(FPDF_BITMAP bitmap); + +// Function: FPDFBitmap_Destroy +// Destroy a bitmap and release all related buffers. +// Parameters: +// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create. +// Return value: +// None. +// Comments: +// This function will not destroy any external buffers provided when +// the bitmap was created. +DLLEXPORT void STDCALL FPDFBitmap_Destroy(FPDF_BITMAP bitmap); + +// Function: FPDF_VIEWERREF_GetPrintScaling +// Whether the PDF document prefers to be scaled or not. +// Parameters: +// document - Handle to the loaded document. +// Return value: +// None. +DLLEXPORT FPDF_BOOL STDCALL +FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document); + +// Function: FPDF_VIEWERREF_GetNumCopies +// Returns the number of copies to be printed. +// Parameters: +// document - Handle to the loaded document. +// Return value: +// The number of copies to be printed. +DLLEXPORT int STDCALL FPDF_VIEWERREF_GetNumCopies(FPDF_DOCUMENT document); + +// Function: FPDF_VIEWERREF_GetPrintPageRange +// Page numbers to initialize print dialog box when file is printed. +// Parameters: +// document - Handle to the loaded document. +// Return value: +// The print page range to be used for printing. +DLLEXPORT FPDF_PAGERANGE STDCALL +FPDF_VIEWERREF_GetPrintPageRange(FPDF_DOCUMENT document); + +// Function: FPDF_VIEWERREF_GetDuplex +// Returns the paper handling option to be used when printing from +// the print dialog. +// Parameters: +// document - Handle to the loaded document. +// Return value: +// The paper handling option to be used when printing. +DLLEXPORT FPDF_DUPLEXTYPE STDCALL +FPDF_VIEWERREF_GetDuplex(FPDF_DOCUMENT document); + +// Function: FPDF_VIEWERREF_GetName +// Gets the contents for a viewer ref, with a given key. The value must +// be of type "name". +// Parameters: +// document - Handle to the loaded document. +// key - Name of the key in the viewer pref dictionary. +// buffer - A string to write the contents of the key to. +// length - Length of the buffer. +// Return value: +// The number of bytes in the contents, including the NULL terminator. +// Thus if the return value is 0, then that indicates an error, such +// as when |document| is invalid or |buffer| is NULL. If |length| is +// less than the returned length, or |buffer| is NULL, |buffer| will +// not be modified. +DLLEXPORT unsigned long STDCALL FPDF_VIEWERREF_GetName(FPDF_DOCUMENT document, + FPDF_BYTESTRING key, + char* buffer, + unsigned long length); + +// Function: FPDF_CountNamedDests +// Get the count of named destinations in the PDF document. +// Parameters: +// document - Handle to a document +// Return value: +// The count of named destinations. +DLLEXPORT FPDF_DWORD STDCALL FPDF_CountNamedDests(FPDF_DOCUMENT document); + +// Function: FPDF_GetNamedDestByName +// Get a the destination handle for the given name. +// Parameters: +// document - Handle to the loaded document. +// name - The name of a destination. +// Return value: +// The handle to the destination. +DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document, + FPDF_BYTESTRING name); + +// Function: FPDF_GetNamedDest +// Get the named destination by index. +// Parameters: +// document - Handle to a document +// index - The index of a named destination. +// buffer - The buffer to store the destination name, +// used as wchar_t*. +// buflen [in/out] - Size of the buffer in bytes on input, +// length of the result in bytes on output +// or -1 if the buffer is too small. +// Return value: +// The destination handle for a given index, or NULL if there is no +// named destination corresponding to |index|. +// Comments: +// Call this function twice to get the name of the named destination: +// 1) First time pass in |buffer| as NULL and get buflen. +// 2) Second time pass in allocated |buffer| and buflen to retrieve +// |buffer|, which should be used as wchar_t*. +// +// If buflen is not sufficiently large, it will be set to -1 upon +// return. +DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDest(FPDF_DOCUMENT document, + int index, + void* buffer, + long* buflen); + +#ifdef PDF_ENABLE_XFA +// Function: FPDF_BStr_Init +// Helper function to initialize a byte string. +DLLEXPORT FPDF_RESULT STDCALL FPDF_BStr_Init(FPDF_BSTR* str); + +// Function: FPDF_BStr_Set +// Helper function to set string data. +DLLEXPORT FPDF_RESULT STDCALL FPDF_BStr_Set(FPDF_BSTR* str, + FPDF_LPCSTR bstr, + int length); + +// Function: FPDF_BStr_Clear +// Helper function to clear a byte string. +DLLEXPORT FPDF_RESULT STDCALL FPDF_BStr_Clear(FPDF_BSTR* str); +#endif // PDF_ENABLE_XFA + +#ifdef __cplusplus +} +#endif + +#endif // PUBLIC_FPDFVIEW_H_ diff --git a/modules/pdfium/pdfium/samples/BUILD.gn b/modules/pdfium/pdfium/samples/BUILD.gn new file mode 100644 index 000000000000..23f4d0ca56af --- /dev/null +++ b/modules/pdfium/pdfium/samples/BUILD.gn @@ -0,0 +1,101 @@ +# Copyright 2014 PDFium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/sanitizers/sanitizers.gni") +import("../pdfium.gni") + +group("samples") { + testonly = true + deps = [ + ":pdfium_diff", + ":pdfium_test", + ] +} + +config("pdfium_samples_config") { + cflags = [] + ldflags = [] + defines = [ + "PNG_PREFIX", + "PNG_USE_READ_MACROS", + ] + include_dirs = [ ".." ] + if (pdf_enable_v8) { + defines += [ "PDF_ENABLE_V8" ] + } + if (pdf_enable_xfa) { + defines += [ "PDF_ENABLE_XFA" ] + } + if (pdf_use_skia) { + defines += [ "PDF_ENABLE_SKIA" ] + } + if (is_asan) { + defines += [ "PDF_ENABLE_ASAN" ] + } + if (use_coverage && is_clang) { + cflags += [ + "--coverage", + "-g", + "-O0", + ] + ldflags += [ "--coverage" ] + } +} + +executable("pdfium_test") { + testonly = true + sources = [ + "image_diff_png.cc", + "image_diff_png.h", + "pdfium_test.cc", + ] + deps = [ + "../:pdfium", + "../:test_support", + "//build/config/sanitizers:deps", + "//build/win:default_exe_manifest", + + # Regardless of whether the library ships against system freetype, + # always link this binary against the bundled one for consistency + # of results across platforms. + "../third_party:fx_freetype", + ] + if (!pdf_enable_xfa) { + deps += [ "../third_party:fx_lpng" ] + } + if (pdf_enable_v8) { + deps += [ "//v8:v8_libplatform" ] + include_dirs = [ + "//v8", + "//v8/include", + ] + configs += [ "//v8:external_startup_data" ] + } + if (pdf_use_skia || pdf_use_skia_paths) { + deps += [ "//skia" ] + } + configs += [ ":pdfium_samples_config" ] +} + +executable("pdfium_diff") { + testonly = true + sources = [ + "image_diff.cc", + "image_diff_png.cc", + "image_diff_png.h", + ] + deps = [ + "../:pdfium", + "//build/config/sanitizers:deps", + "//build/win:default_exe_manifest", + ] + if (!pdf_enable_xfa) { + deps += [ "../third_party:fx_lpng" ] + } + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + ":pdfium_samples_config", + "//build/config/compiler:no_chromium_code", + ] +} diff --git a/modules/pdfium/pdfium/samples/DEPS b/modules/pdfium/pdfium/samples/DEPS new file mode 100644 index 000000000000..4a926a7cf228 --- /dev/null +++ b/modules/pdfium/pdfium/samples/DEPS @@ -0,0 +1,8 @@ +include_rules = [ + '+public', + '+third_party/libpng16', + '+third_party/skia/include', + '+third_party/zlib_v128', + '+v8', + '+core/fdrm/crypto/fx_crypt.h', +] diff --git a/modules/pdfium/pdfium/samples/image_diff.cc b/modules/pdfium/pdfium/samples/image_diff.cc new file mode 100644 index 000000000000..3aa626be65bf --- /dev/null +++ b/modules/pdfium/pdfium/samples/image_diff.cc @@ -0,0 +1,352 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file input format is based loosely on +// Tools/DumpRenderTree/ImageDiff.m + +// The exact format of this tool's output to stdout is important, to match +// what the run-webkit-tests script expects. + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "samples/image_diff_png.h" +#include "third_party/base/logging.h" +#include "third_party/base/numerics/safe_conversions.h" + +#if defined(OS_WIN) +#include +#endif + +// Return codes used by this utility. +static const int kStatusSame = 0; +static const int kStatusDifferent = 1; +static const int kStatusError = 2; + +// Color codes. +static const uint32_t RGBA_RED = 0x000000ff; +static const uint32_t RGBA_ALPHA = 0xff000000; + +class Image { + public: + Image() : w_(0), h_(0) { + } + + Image(const Image& image) + : w_(image.w_), + h_(image.h_), + data_(image.data_) { + } + + bool has_image() const { + return w_ > 0 && h_ > 0; + } + + int w() const { + return w_; + } + + int h() const { + return h_; + } + + const unsigned char* data() const { + return &data_.front(); + } + + // Creates the image from the given filename on disk, and returns true on + // success. + bool CreateFromFilename(const std::string& path) { + FILE* f = fopen(path.c_str(), "rb"); + if (!f) + return false; + + std::vector compressed; + const size_t kBufSize = 1024; + unsigned char buf[kBufSize]; + size_t num_read = 0; + while ((num_read = fread(buf, 1, kBufSize, f)) > 0) { + compressed.insert(compressed.end(), buf, buf + num_read); + } + + fclose(f); + + if (!image_diff_png::DecodePNG(compressed.data(), compressed.size(), &data_, + &w_, &h_)) { + Clear(); + return false; + } + return true; + } + + void Clear() { + w_ = h_ = 0; + data_.clear(); + } + + // Returns the RGBA value of the pixel at the given location + uint32_t pixel_at(int x, int y) const { + if (!pixel_in_bounds(x, y)) + return 0; + return *reinterpret_cast(&(data_[pixel_address(x, y)])); + } + + void set_pixel_at(int x, int y, uint32_t color) { + if (!pixel_in_bounds(x, y)) + return; + + void* addr = &data_[pixel_address(x, y)]; + *reinterpret_cast(addr) = color; + } + + private: + bool pixel_in_bounds(int x, int y) const { + return x >= 0 && x < w_ && y >= 0 && y < h_; + } + + size_t pixel_address(int x, int y) const { return (y * w_ + x) * 4; } + + // Pixel dimensions of the image. + int w_; + int h_; + + std::vector data_; +}; + +float CalculateDifferencePercentage(const Image& actual, int pixels_different) { + // Like the WebKit ImageDiff tool, we define percentage different in terms + // of the size of the 'actual' bitmap. + float total_pixels = + static_cast(actual.w()) * static_cast(actual.h()); + if (total_pixels == 0) { + // When the bitmap is empty, they are 100% different. + return 100.0f; + } + return 100.0f * pixels_different / total_pixels; +} + +void CountImageSizeMismatchAsPixelDifference(const Image& baseline, + const Image& actual, + int* pixels_different) { + int w = std::min(baseline.w(), actual.w()); + int h = std::min(baseline.h(), actual.h()); + + // Count pixels that are a difference in size as also being different. + int max_w = std::max(baseline.w(), actual.w()); + int max_h = std::max(baseline.h(), actual.h()); + // These pixels are off the right side, not including the lower right corner. + *pixels_different += (max_w - w) * h; + // These pixels are along the bottom, including the lower right corner. + *pixels_different += (max_h - h) * max_w; +} + +float PercentageDifferent(const Image& baseline, const Image& actual) { + int w = std::min(baseline.w(), actual.w()); + int h = std::min(baseline.h(), actual.h()); + + // Compute pixels different in the overlap. + int pixels_different = 0; + for (int y = 0; y < h; ++y) { + for (int x = 0; x < w; ++x) { + if (baseline.pixel_at(x, y) != actual.pixel_at(x, y)) + ++pixels_different; + } + } + + CountImageSizeMismatchAsPixelDifference(baseline, actual, &pixels_different); + return CalculateDifferencePercentage(actual, pixels_different); +} + +// FIXME: Replace with unordered_map when available. +typedef std::map RgbaToCountMap; + +float HistogramPercentageDifferent(const Image& baseline, const Image& actual) { + // TODO(johnme): Consider using a joint histogram instead, as described in + // "Comparing Images Using Joint Histograms" by Pass & Zabih + // http://www.cs.cornell.edu/~rdz/papers/pz-jms99.pdf + + int w = std::min(baseline.w(), actual.w()); + int h = std::min(baseline.h(), actual.h()); + + // Count occurences of each RGBA pixel value of baseline in the overlap. + RgbaToCountMap baseline_histogram; + for (int y = 0; y < h; ++y) { + for (int x = 0; x < w; ++x) { + // hash_map operator[] inserts a 0 (default constructor) if key not found. + ++baseline_histogram[baseline.pixel_at(x, y)]; + } + } + + // Compute pixels different in the histogram of the overlap. + int pixels_different = 0; + for (int y = 0; y < h; ++y) { + for (int x = 0; x < w; ++x) { + uint32_t actual_rgba = actual.pixel_at(x, y); + RgbaToCountMap::iterator it = baseline_histogram.find(actual_rgba); + if (it != baseline_histogram.end() && it->second > 0) + --it->second; + else + ++pixels_different; + } + } + + CountImageSizeMismatchAsPixelDifference(baseline, actual, &pixels_different); + return CalculateDifferencePercentage(actual, pixels_different); +} + +void PrintHelp() { + fprintf(stderr, + "Usage:\n" + " image_diff [--histogram] \n" + " Compares two files on disk, returning 0 when they are the same;\n" + " passing \"--histogram\" additionally calculates a diff of the\n" + " RGBA value histograms (which is resistant to shifts in layout)\n" + " image_diff --diff \n" + " Compares two files on disk, outputs an image that visualizes the\n" + " difference to \n"); +} + +int CompareImages(const std::string& file1, + const std::string& file2, + bool compare_histograms) { + Image actual_image; + Image baseline_image; + + if (!actual_image.CreateFromFilename(file1)) { + fprintf(stderr, "image_diff: Unable to open file \"%s\"\n", file1.c_str()); + return kStatusError; + } + if (!baseline_image.CreateFromFilename(file2)) { + fprintf(stderr, "image_diff: Unable to open file \"%s\"\n", file2.c_str()); + return kStatusError; + } + + if (compare_histograms) { + float percent = HistogramPercentageDifferent(actual_image, baseline_image); + const char* passed = percent > 0.0 ? "failed" : "passed"; + printf("histogram diff: %01.2f%% %s\n", percent, passed); + } + + const char* const diff_name = compare_histograms ? "exact diff" : "diff"; + float percent = PercentageDifferent(actual_image, baseline_image); + const char* const passed = percent > 0.0 ? "failed" : "passed"; + printf("%s: %01.2f%% %s\n", diff_name, percent, passed); + + if (percent > 0.0) { + // failure: The WebKit version also writes the difference image to + // stdout, which seems excessive for our needs. + return kStatusDifferent; + } + // success + return kStatusSame; +} + +bool CreateImageDiff(const Image& image1, const Image& image2, Image* out) { + int w = std::min(image1.w(), image2.w()); + int h = std::min(image1.h(), image2.h()); + *out = Image(image1); + bool same = (image1.w() == image2.w()) && (image1.h() == image2.h()); + + // TODO(estade): do something with the extra pixels if the image sizes + // are different. + for (int y = 0; y < h; ++y) { + for (int x = 0; x < w; ++x) { + uint32_t base_pixel = image1.pixel_at(x, y); + if (base_pixel != image2.pixel_at(x, y)) { + // Set differing pixels red. + out->set_pixel_at(x, y, RGBA_RED | RGBA_ALPHA); + same = false; + } else { + // Set same pixels as faded. + uint32_t alpha = base_pixel & RGBA_ALPHA; + uint32_t new_pixel = base_pixel - ((alpha / 2) & RGBA_ALPHA); + out->set_pixel_at(x, y, new_pixel); + } + } + } + + return same; +} + +int DiffImages(const std::string& file1, + const std::string& file2, + const std::string& out_file) { + Image actual_image; + Image baseline_image; + + if (!actual_image.CreateFromFilename(file1)) { + fprintf(stderr, "image_diff: Unable to open file \"%s\"\n", file1.c_str()); + return kStatusError; + } + if (!baseline_image.CreateFromFilename(file2)) { + fprintf(stderr, "image_diff: Unable to open file \"%s\"\n", file2.c_str()); + return kStatusError; + } + + Image diff_image; + bool same = CreateImageDiff(baseline_image, actual_image, &diff_image); + if (same) + return kStatusSame; + + std::vector png_encoding; + image_diff_png::EncodeRGBAPNG( + diff_image.data(), diff_image.w(), diff_image.h(), + diff_image.w() * 4, &png_encoding); + + FILE* f = fopen(out_file.c_str(), "wb"); + if (!f) + return kStatusError; + + size_t size = png_encoding.size(); + char* ptr = reinterpret_cast(&png_encoding.front()); + if (fwrite(ptr, 1, size, f) != size) + return kStatusError; + + return kStatusDifferent; +} + +int main(int argc, const char* argv[]) { + bool histograms = false; + bool produce_diff_image = false; + std::string filename1; + std::string filename2; + std::string diff_filename; + + int i; + for (i = 1; i < argc; ++i) { + const char* arg = argv[i]; + if (strstr(arg, "--") != arg) + break; + if (strcmp(arg, "--histogram") == 0) { + histograms = true; + } else if (strcmp(arg, "--diff") == 0) { + produce_diff_image = true; + } + } + if (i < argc) + filename1 = argv[i++]; + if (i < argc) + filename2 = argv[i++]; + if (i < argc) + diff_filename = argv[i++]; + + if (produce_diff_image) { + if (!diff_filename.empty()) { + return DiffImages(filename1, filename2, diff_filename); + } + } else if (!filename2.empty()) { + return CompareImages(filename1, filename2, histograms); + } + + PrintHelp(); + return kStatusError; +} diff --git a/modules/pdfium/pdfium/samples/image_diff_png.cc b/modules/pdfium/pdfium/samples/image_diff_png.cc new file mode 100644 index 000000000000..18753e25804a --- /dev/null +++ b/modules/pdfium/pdfium/samples/image_diff_png.cc @@ -0,0 +1,644 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This is a duplicate of chromium's src/tools/imagediff/image_diff_png.cc +// that has been modified to build in a pdfium environment, which itself +// was duplicated as follows: + +// This is a duplicate of ui/gfx/codec/png_codec.cc, after removing code related +// to Skia, that we can use when running layout tests with minimal dependencies. + +#include "samples/image_diff_png.h" + +#include +#include + +#include + +#include "third_party/base/logging.h" +#include "third_party/libpng16/png.h" +#include "third_party/zlib_v128/zlib.h" + +namespace image_diff_png { + +namespace { + +enum ColorFormat { + // 3 bytes per pixel (packed), in RGB order regardless of endianness. + // This is the native JPEG format. + FORMAT_RGB, + + // 4 bytes per pixel, in RGBA order in memory regardless of endianness. + FORMAT_RGBA, + + // 4 bytes per pixel, in BGRA order in memory regardless of endianness. + // This is the default Windows DIB order. + FORMAT_BGRA, +}; + +// Represents a comment in the tEXt ancillary chunk of the png. +struct Comment { + std::string key; + std::string text; +}; + +// Converts BGRA->RGBA and RGBA->BGRA. +void ConvertBetweenBGRAandRGBA(const unsigned char* input, int pixel_width, + unsigned char* output, bool* is_opaque) { + for (int x = 0; x < pixel_width; x++) { + const unsigned char* pixel_in = &input[x * 4]; + unsigned char* pixel_out = &output[x * 4]; + pixel_out[0] = pixel_in[2]; + pixel_out[1] = pixel_in[1]; + pixel_out[2] = pixel_in[0]; + pixel_out[3] = pixel_in[3]; + } +} + +void ConvertRGBAtoRGB(const unsigned char* rgba, int pixel_width, + unsigned char* rgb, bool* is_opaque) { + for (int x = 0; x < pixel_width; x++) { + const unsigned char* pixel_in = &rgba[x * 4]; + unsigned char* pixel_out = &rgb[x * 3]; + pixel_out[0] = pixel_in[0]; + pixel_out[1] = pixel_in[1]; + pixel_out[2] = pixel_in[2]; + } +} + +} // namespace + +// Decoder +// +// This code is based on WebKit libpng interface (PNGImageDecoder), which is +// in turn based on the Mozilla png decoder. + +namespace { + +// Gamma constants: We assume we're on Windows which uses a gamma of 2.2. +const double kMaxGamma = 21474.83; // Maximum gamma accepted by png library. +const double kDefaultGamma = 2.2; +const double kInverseGamma = 1.0 / kDefaultGamma; + +class PngDecoderState { + public: + // Output is a vector. + PngDecoderState(ColorFormat ofmt, std::vector* o) + : output_format(ofmt), + output_channels(0), + is_opaque(true), + output(o), + row_converter(NULL), + width(0), + height(0), + done(false) { + } + + ColorFormat output_format; + int output_channels; + + // Used during the reading of an SkBitmap. Defaults to true until we see a + // pixel with anything other than an alpha of 255. + bool is_opaque; + + // An intermediary buffer for decode output. + std::vector* output; + + // Called to convert a row from the library to the correct output format. + // When NULL, no conversion is necessary. + void (*row_converter)(const unsigned char* in, int w, unsigned char* out, + bool* is_opaque); + + // Size of the image, set in the info callback. + int width; + int height; + + // Set to true when we've found the end of the data. + bool done; +}; + +void ConvertRGBtoRGBA(const unsigned char* rgb, int pixel_width, + unsigned char* rgba, bool* is_opaque) { + for (int x = 0; x < pixel_width; x++) { + const unsigned char* pixel_in = &rgb[x * 3]; + unsigned char* pixel_out = &rgba[x * 4]; + pixel_out[0] = pixel_in[0]; + pixel_out[1] = pixel_in[1]; + pixel_out[2] = pixel_in[2]; + pixel_out[3] = 0xff; + } +} + +void ConvertRGBtoBGRA(const unsigned char* rgb, int pixel_width, + unsigned char* bgra, bool* is_opaque) { + for (int x = 0; x < pixel_width; x++) { + const unsigned char* pixel_in = &rgb[x * 3]; + unsigned char* pixel_out = &bgra[x * 4]; + pixel_out[0] = pixel_in[2]; + pixel_out[1] = pixel_in[1]; + pixel_out[2] = pixel_in[0]; + pixel_out[3] = 0xff; + } +} + +// Called when the png header has been read. This code is based on the WebKit +// PNGImageDecoder +void DecodeInfoCallback(png_struct* png_ptr, png_info* info_ptr) { + PngDecoderState* state = static_cast( + png_get_progressive_ptr(png_ptr)); + + int bit_depth, color_type, interlace_type, compression_type; + int filter_type, channels; + png_uint_32 w, h; + png_get_IHDR(png_ptr, info_ptr, &w, &h, &bit_depth, &color_type, + &interlace_type, &compression_type, &filter_type); + + // Bounds check. When the image is unreasonably big, we'll error out and + // end up back at the setjmp call when we set up decoding. "Unreasonably big" + // means "big enough that w * h * 32bpp might overflow an int"; we choose this + // threshold to match WebKit and because a number of places in code assume + // that an image's size (in bytes) fits in a (signed) int. + unsigned long long total_size = + static_cast(w) * static_cast(h); + if (total_size > ((1 << 29) - 1)) + longjmp(png_jmpbuf(png_ptr), 1); + state->width = static_cast(w); + state->height = static_cast(h); + + // Expand to ensure we use 24-bit for RGB and 32-bit for RGBA. + if (color_type == PNG_COLOR_TYPE_PALETTE || + (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)) + png_set_expand(png_ptr); + + // Transparency for paletted images. + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) + png_set_expand(png_ptr); + + // Convert 16-bit to 8-bit. + if (bit_depth == 16) + png_set_strip_16(png_ptr); + + // Expand grayscale to RGB. + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb(png_ptr); + + // Deal with gamma and keep it under our control. + double gamma; + if (png_get_gAMA(png_ptr, info_ptr, &gamma)) { + if (gamma <= 0.0 || gamma > kMaxGamma) { + gamma = kInverseGamma; + png_set_gAMA(png_ptr, info_ptr, gamma); + } + png_set_gamma(png_ptr, kDefaultGamma, gamma); + } else { + png_set_gamma(png_ptr, kDefaultGamma, kInverseGamma); + } + + // Tell libpng to send us rows for interlaced pngs. + if (interlace_type == PNG_INTERLACE_ADAM7) + png_set_interlace_handling(png_ptr); + + // Update our info now + png_read_update_info(png_ptr, info_ptr); + channels = png_get_channels(png_ptr, info_ptr); + + // Pick our row format converter necessary for this data. + if (channels == 3) { + switch (state->output_format) { + case FORMAT_RGB: + state->row_converter = NULL; // no conversion necessary + state->output_channels = 3; + break; + case FORMAT_RGBA: + state->row_converter = &ConvertRGBtoRGBA; + state->output_channels = 4; + break; + case FORMAT_BGRA: + state->row_converter = &ConvertRGBtoBGRA; + state->output_channels = 4; + break; + default: + NOTREACHED(); + break; + } + } else if (channels == 4) { + switch (state->output_format) { + case FORMAT_RGB: + state->row_converter = &ConvertRGBAtoRGB; + state->output_channels = 3; + break; + case FORMAT_RGBA: + state->row_converter = NULL; // no conversion necessary + state->output_channels = 4; + break; + case FORMAT_BGRA: + state->row_converter = &ConvertBetweenBGRAandRGBA; + state->output_channels = 4; + break; + default: + NOTREACHED(); + break; + } + } else { + NOTREACHED(); + longjmp(png_jmpbuf(png_ptr), 1); + } + + state->output->resize( + state->width * state->output_channels * state->height); +} + +void DecodeRowCallback(png_struct* png_ptr, png_byte* new_row, + png_uint_32 row_num, int pass) { + PngDecoderState* state = static_cast( + png_get_progressive_ptr(png_ptr)); + + if (static_cast(row_num) > state->height) { + NOTREACHED(); + return; + } + + unsigned char* base = NULL; + base = &state->output->front(); + + unsigned char* dest = &base[state->width * state->output_channels * row_num]; + if (state->row_converter) + state->row_converter(new_row, state->width, dest, &state->is_opaque); + else + memcpy(dest, new_row, state->width * state->output_channels); +} + +void DecodeEndCallback(png_struct* png_ptr, png_info* info) { + PngDecoderState* state = static_cast( + png_get_progressive_ptr(png_ptr)); + + // Mark the image as complete, this will tell the Decode function that we + // have successfully found the end of the data. + state->done = true; +} + +// Automatically destroys the given read structs on destruction to make +// cleanup and error handling code cleaner. +class PngReadStructDestroyer { + public: + PngReadStructDestroyer(png_struct** ps, png_info** pi) : ps_(ps), pi_(pi) { + } + ~PngReadStructDestroyer() { + png_destroy_read_struct(ps_, pi_, NULL); + } + private: + png_struct** ps_; + png_info** pi_; +}; + +bool BuildPNGStruct(const unsigned char* input, size_t input_size, + png_struct** png_ptr, png_info** info_ptr) { + if (input_size < 8) + return false; // Input data too small to be a png + + // Have libpng check the signature, it likes the first 8 bytes. + if (png_sig_cmp(const_cast(input), 0, 8) != 0) + return false; + + *png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!*png_ptr) + return false; + + *info_ptr = png_create_info_struct(*png_ptr); + if (!*info_ptr) { + png_destroy_read_struct(png_ptr, NULL, NULL); + return false; + } + + return true; +} + +} // namespace + +// static +bool Decode(const unsigned char* input, size_t input_size, + ColorFormat format, std::vector* output, + int* w, int* h) { + png_struct* png_ptr = NULL; + png_info* info_ptr = NULL; + if (!BuildPNGStruct(input, input_size, &png_ptr, &info_ptr)) + return false; + + PngReadStructDestroyer destroyer(&png_ptr, &info_ptr); + if (setjmp(png_jmpbuf(png_ptr))) { + // The destroyer will ensure that the structures are cleaned up in this + // case, even though we may get here as a jump from random parts of the + // PNG library called below. + return false; + } + + PngDecoderState state(format, output); + + png_set_progressive_read_fn(png_ptr, &state, &DecodeInfoCallback, + &DecodeRowCallback, &DecodeEndCallback); + png_process_data(png_ptr, + info_ptr, + const_cast(input), + input_size); + + if (!state.done) { + // Fed it all the data but the library didn't think we got all the data, so + // this file must be truncated. + output->clear(); + return false; + } + + *w = state.width; + *h = state.height; + return true; +} + +// Encoder +// +// This section of the code is based on nsPNGEncoder.cpp in Mozilla +// (Copyright 2005 Google Inc.) + +namespace { + +// Passed around as the io_ptr in the png structs so our callbacks know where +// to write data. +struct PngEncoderState { + explicit PngEncoderState(std::vector* o) : out(o) {} + std::vector* out; +}; + +// Called by libpng to flush its internal buffer to ours. +void EncoderWriteCallback(png_structp png, png_bytep data, png_size_t size) { + PngEncoderState* state = static_cast(png_get_io_ptr(png)); + size_t old_size = state->out->size(); + state->out->resize(old_size + size); + memcpy(&(*state->out)[old_size], data, size); +} + +void FakeFlushCallback(png_structp png) { + // We don't need to perform any flushing since we aren't doing real IO, but + // we're required to provide this function by libpng. +} + +void ConvertBGRAtoRGB(const unsigned char* bgra, int pixel_width, + unsigned char* rgb, bool* is_opaque) { + for (int x = 0; x < pixel_width; x++) { + const unsigned char* pixel_in = &bgra[x * 4]; + unsigned char* pixel_out = &rgb[x * 3]; + pixel_out[0] = pixel_in[2]; + pixel_out[1] = pixel_in[1]; + pixel_out[2] = pixel_in[0]; + } +} + +#ifdef PNG_TEXT_SUPPORTED + +inline char* strdup(const char* str) { +#if defined(OS_WIN) + return _strdup(str); +#else + return ::strdup(str); +#endif +} + +class CommentWriter { + public: + explicit CommentWriter(const std::vector& comments) + : comments_(comments), + png_text_(new png_text[comments.size()]) { + for (size_t i = 0; i < comments.size(); ++i) + AddComment(i, comments[i]); + } + + ~CommentWriter() { + for (size_t i = 0; i < comments_.size(); ++i) { + free(png_text_[i].key); + free(png_text_[i].text); + } + delete [] png_text_; + } + + bool HasComments() { + return !comments_.empty(); + } + + png_text* get_png_text() { + return png_text_; + } + + int size() { + return static_cast(comments_.size()); + } + + private: + void AddComment(size_t pos, const Comment& comment) { + png_text_[pos].compression = PNG_TEXT_COMPRESSION_NONE; + // A PNG comment's key can only be 79 characters long. + if (comment.key.length() > 79) + return; + png_text_[pos].key = strdup(comment.key.substr(0, 78).c_str()); + png_text_[pos].text = strdup(comment.text.c_str()); + png_text_[pos].text_length = comment.text.length(); +#ifdef PNG_iTXt_SUPPORTED + png_text_[pos].itxt_length = 0; + png_text_[pos].lang = 0; + png_text_[pos].lang_key = 0; +#endif + } + + const std::vector comments_; + png_text* png_text_; +}; +#endif // PNG_TEXT_SUPPORTED + +// The type of functions usable for converting between pixel formats. +typedef void (*FormatConverter)(const unsigned char* in, int w, + unsigned char* out, bool* is_opaque); + +// libpng uses a wacky setjmp-based API, which makes the compiler nervous. +// We constrain all of the calls we make to libpng where the setjmp() is in +// place to this function. +// Returns true on success. +bool DoLibpngWrite(png_struct* png_ptr, png_info* info_ptr, + PngEncoderState* state, + int width, int height, int row_byte_width, + const unsigned char* input, int compression_level, + int png_output_color_type, int output_color_components, + FormatConverter converter, + const std::vector& comments) { +#ifdef PNG_TEXT_SUPPORTED + CommentWriter comment_writer(comments); +#endif + unsigned char* row_buffer = NULL; + + // Make sure to not declare any locals here -- locals in the presence + // of setjmp() in C++ code makes gcc complain. + + if (setjmp(png_jmpbuf(png_ptr))) { + delete[] row_buffer; + return false; + } + + png_set_compression_level(png_ptr, compression_level); + + // Set our callback for libpng to give us the data. + png_set_write_fn(png_ptr, state, EncoderWriteCallback, FakeFlushCallback); + + png_set_IHDR(png_ptr, info_ptr, width, height, 8, png_output_color_type, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); + +#ifdef PNG_TEXT_SUPPORTED + if (comment_writer.HasComments()) { + png_set_text(png_ptr, info_ptr, comment_writer.get_png_text(), + comment_writer.size()); + } +#endif + + png_write_info(png_ptr, info_ptr); + + if (!converter) { + // No conversion needed, give the data directly to libpng. + for (int y = 0; y < height; y ++) { + png_write_row(png_ptr, + const_cast(&input[y * row_byte_width])); + } + } else { + // Needs conversion using a separate buffer. + row_buffer = new unsigned char[width * output_color_components]; + for (int y = 0; y < height; y ++) { + converter(&input[y * row_byte_width], width, row_buffer, NULL); + png_write_row(png_ptr, row_buffer); + } + delete[] row_buffer; + } + + png_write_end(png_ptr, info_ptr); + return true; +} + +} // namespace + +// static +bool EncodeWithCompressionLevel(const unsigned char* input, ColorFormat format, + const int width, const int height, + int row_byte_width, + bool discard_transparency, + const std::vector& comments, + int compression_level, + std::vector* output) { + // Run to convert an input row into the output row format, NULL means no + // conversion is necessary. + FormatConverter converter = NULL; + + int input_color_components, output_color_components; + int png_output_color_type; + switch (format) { + case FORMAT_RGB: + input_color_components = 3; + output_color_components = 3; + png_output_color_type = PNG_COLOR_TYPE_RGB; + discard_transparency = false; + break; + + case FORMAT_RGBA: + input_color_components = 4; + if (discard_transparency) { + output_color_components = 3; + png_output_color_type = PNG_COLOR_TYPE_RGB; + converter = ConvertRGBAtoRGB; + } else { + output_color_components = 4; + png_output_color_type = PNG_COLOR_TYPE_RGB_ALPHA; + converter = NULL; + } + break; + + case FORMAT_BGRA: + input_color_components = 4; + if (discard_transparency) { + output_color_components = 3; + png_output_color_type = PNG_COLOR_TYPE_RGB; + converter = ConvertBGRAtoRGB; + } else { + output_color_components = 4; + png_output_color_type = PNG_COLOR_TYPE_RGB_ALPHA; + converter = ConvertBetweenBGRAandRGBA; + } + break; + + default: + NOTREACHED(); + return false; + } + + // Row stride should be at least as long as the length of the data. + if (input_color_components * width < row_byte_width) + return false; + + png_struct* png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL); + if (!png_ptr) + return false; + png_info* info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) { + png_destroy_write_struct(&png_ptr, NULL); + return false; + } + + PngEncoderState state(output); + bool success = DoLibpngWrite(png_ptr, info_ptr, &state, + width, height, row_byte_width, + input, compression_level, png_output_color_type, + output_color_components, converter, comments); + png_destroy_write_struct(&png_ptr, &info_ptr); + + return success; +} + +// static +bool Encode(const unsigned char* input, ColorFormat format, + const int width, const int height, int row_byte_width, + bool discard_transparency, + const std::vector& comments, + std::vector* output) { + return EncodeWithCompressionLevel(input, format, width, height, + row_byte_width, + discard_transparency, + comments, Z_DEFAULT_COMPRESSION, + output); +} + +// Decode a PNG into an RGBA pixel array. +bool DecodePNG(const unsigned char* input, size_t input_size, + std::vector* output, + int* width, int* height) { + return Decode(input, input_size, FORMAT_RGBA, output, width, height); +} + +// Encode an RGBA pixel array into a PNG. +bool EncodeRGBAPNG(const unsigned char* input, + int width, + int height, + int row_byte_width, + std::vector* output) { + return Encode(input, FORMAT_RGBA, + width, height, row_byte_width, false, + std::vector(), output); +} + +// Encode an BGRA pixel array into a PNG. +bool EncodeBGRAPNG(const unsigned char* input, + int width, + int height, + int row_byte_width, + bool discard_transparency, + std::vector* output) { + return Encode(input, FORMAT_BGRA, + width, height, row_byte_width, discard_transparency, + std::vector(), output); +} + +} // namespace image_diff_png diff --git a/modules/pdfium/pdfium/samples/image_diff_png.h b/modules/pdfium/pdfium/samples/image_diff_png.h new file mode 100644 index 000000000000..7bb395a4a545 --- /dev/null +++ b/modules/pdfium/pdfium/samples/image_diff_png.h @@ -0,0 +1,38 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SAMPLES_IMAGE_DIFF_PNG_H_ +#define SAMPLES_IMAGE_DIFF_PNG_H_ + +#include // for size_t. + +#include + +namespace image_diff_png { + +// Decode a PNG into an RGBA pixel array. +bool DecodePNG(const unsigned char* input, + size_t input_size, + std::vector* output, + int* width, + int* height); + +// Encode an RGBA pixel array into a PNG. +bool EncodeRGBAPNG(const unsigned char* input, + int width, + int height, + int row_byte_width, + std::vector* output); + +// Encode an BGRA pixel array into a PNG. +bool EncodeBGRAPNG(const unsigned char* input, + int width, + int height, + int row_byte_width, + bool discard_transparency, + std::vector* output); + +} // namespace image_diff_png + +#endif // SAMPLES_IMAGE_DIFF_PNG_H_ diff --git a/modules/pdfium/pdfium/samples/pdfium_test.cc b/modules/pdfium/pdfium/samples/pdfium_test.cc new file mode 100644 index 000000000000..a0afd4d09c33 --- /dev/null +++ b/modules/pdfium/pdfium/samples/pdfium_test.cc @@ -0,0 +1,1018 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#if defined PDF_ENABLE_SKIA && !defined _SKIA_SUPPORT_ +#define _SKIA_SUPPORT_ +#endif + +#include "core/fdrm/crypto/fx_crypt.h" +#include "public/fpdf_dataavail.h" +#include "public/fpdf_edit.h" +#include "public/fpdf_ext.h" +#include "public/fpdf_formfill.h" +#include "public/fpdf_text.h" +#include "public/fpdfview.h" +#include "samples/image_diff_png.h" +#include "testing/test_support.h" + +#ifdef _WIN32 +#include +#else +#include +#endif + +#ifdef PDF_ENABLE_V8 +#include "v8/include/libplatform/libplatform.h" +#include "v8/include/v8.h" +#endif // PDF_ENABLE_V8 + +#ifdef PDF_ENABLE_SKIA +#include "third_party/skia/include/core/SkPictureRecorder.h" +#include "third_party/skia/include/core/SkStream.h" +#endif + +#ifdef _WIN32 +#define access _access +#define snprintf _snprintf +#define R_OK 4 +#endif + +enum OutputFormat { + OUTPUT_NONE, + OUTPUT_TEXT, + OUTPUT_PPM, + OUTPUT_PNG, +#ifdef _WIN32 + OUTPUT_BMP, + OUTPUT_EMF, +#endif +#ifdef PDF_ENABLE_SKIA + OUTPUT_SKP, +#endif +}; + +struct Options { + Options() + : show_config(false), + send_events(false), + pages(false), + md5(false), + output_format(OUTPUT_NONE) {} + + bool show_config; + bool send_events; + bool pages; + bool md5; + OutputFormat output_format; + std::string scale_factor_as_string; + std::string exe_path; + std::string bin_directory; + std::string font_directory; + // 0-based page numbers to be rendered. + int first_page; + int last_page; +}; + +struct FPDF_FORMFILLINFO_PDFiumTest : public FPDF_FORMFILLINFO { + // Hold a map of the currently loaded pages in order to avoid them + // to get loaded twice. + std::map loaded_pages; + + // Hold a pointer of FPDF_FORMHANDLE so that PDFium app hooks can + // make use of it. + FPDF_FORMHANDLE form_handle; +}; + +struct AvailDeleter { + inline void operator()(FPDF_AVAIL avail) const { FPDFAvail_Destroy(avail); } +}; + +static FPDF_FORMFILLINFO_PDFiumTest* ToPDFiumTestFormFillInfo( + FPDF_FORMFILLINFO* form_fill_info) { + return static_cast(form_fill_info); +} + +static bool CheckDimensions(int stride, int width, int height) { + if (stride < 0 || width < 0 || height < 0) + return false; + if (height > 0 && width > INT_MAX / height) + return false; + return true; +} + +static void OutputMD5Hash(const char* file_name, const char* buffer, int len) { + // Get the MD5 hash and write it to stdout. + uint8_t digest[16]; + CRYPT_MD5Generate(reinterpret_cast(buffer), len, digest); + printf("MD5:%s:", file_name); + for (int i = 0; i < 16; i++) + printf("%02x", digest[i]); + printf("\n"); +} + +static std::string WritePpm(const char* pdf_name, + int num, + const void* buffer_void, + int stride, + int width, + int height) { + const char* buffer = reinterpret_cast(buffer_void); + + if (!CheckDimensions(stride, width, height)) + return ""; + + int out_len = width * height; + if (out_len > INT_MAX / 3) + return ""; + out_len *= 3; + + char filename[256]; + snprintf(filename, sizeof(filename), "%s.%d.ppm", pdf_name, num); + FILE* fp = fopen(filename, "wb"); + if (!fp) + return ""; + fprintf(fp, "P6\n# PDF test render\n%d %d\n255\n", width, height); + // Source data is B, G, R, unused. + // Dest data is R, G, B. + std::vector result(out_len); + for (int h = 0; h < height; ++h) { + const char* src_line = buffer + (stride * h); + char* dest_line = result.data() + (width * h * 3); + for (int w = 0; w < width; ++w) { + // R + dest_line[w * 3] = src_line[(w * 4) + 2]; + // G + dest_line[(w * 3) + 1] = src_line[(w * 4) + 1]; + // B + dest_line[(w * 3) + 2] = src_line[w * 4]; + } + } + fwrite(result.data(), out_len, 1, fp); + fclose(fp); + return std::string(filename); +} + +void WriteText(FPDF_PAGE page, const char* pdf_name, int num) { + char filename[256]; + int chars_formatted = + snprintf(filename, sizeof(filename), "%s.%d.txt", pdf_name, num); + if (chars_formatted < 0 || + static_cast(chars_formatted) >= sizeof(filename)) { + fprintf(stderr, "Filename %s is too long\n", filename); + return; + } + + FILE* fp = fopen(filename, "w"); + if (!fp) { + fprintf(stderr, "Failed to open %s for output\n", filename); + return; + } + + // Output in UTF32-LE. + uint32_t bom = 0x0000FEFF; + fwrite(&bom, sizeof(bom), 1, fp); + + FPDF_TEXTPAGE textpage = FPDFText_LoadPage(page); + for (int i = 0; i < FPDFText_CountChars(textpage); i++) { + uint32_t c = FPDFText_GetUnicode(textpage, i); + fwrite(&c, sizeof(c), 1, fp); + } + + FPDFText_ClosePage(textpage); + + (void)fclose(fp); +} + +static std::string WritePng(const char* pdf_name, + int num, + const void* buffer_void, + int stride, + int width, + int height) { + if (!CheckDimensions(stride, width, height)) + return ""; + + std::vector png_encoding; + const unsigned char* buffer = static_cast(buffer_void); + if (!image_diff_png::EncodeBGRAPNG( + buffer, width, height, stride, false, &png_encoding)) { + fprintf(stderr, "Failed to convert bitmap to PNG\n"); + return ""; + } + + char filename[256]; + int chars_formatted = snprintf( + filename, sizeof(filename), "%s.%d.png", pdf_name, num); + if (chars_formatted < 0 || + static_cast(chars_formatted) >= sizeof(filename)) { + fprintf(stderr, "Filename %s is too long\n", filename); + return ""; + } + + FILE* fp = fopen(filename, "wb"); + if (!fp) { + fprintf(stderr, "Failed to open %s for output\n", filename); + return ""; + } + + size_t bytes_written = fwrite( + &png_encoding.front(), 1, png_encoding.size(), fp); + if (bytes_written != png_encoding.size()) + fprintf(stderr, "Failed to write to %s\n", filename); + + (void)fclose(fp); + return std::string(filename); +} + +#ifdef _WIN32 +static std::string WriteBmp(const char* pdf_name, + int num, + const void* buffer, + int stride, + int width, + int height) { + if (!CheckDimensions(stride, width, height)) + return ""; + + int out_len = stride * height; + if (out_len > INT_MAX / 3) + return ""; + + char filename[256]; + snprintf(filename, sizeof(filename), "%s.%d.bmp", pdf_name, num); + FILE* fp = fopen(filename, "wb"); + if (!fp) + return ""; + + BITMAPINFO bmi = {}; + bmi.bmiHeader.biSize = sizeof(bmi) - sizeof(RGBQUAD); + bmi.bmiHeader.biWidth = width; + bmi.bmiHeader.biHeight = -height; // top-down image + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biBitCount = 32; + bmi.bmiHeader.biCompression = BI_RGB; + bmi.bmiHeader.biSizeImage = 0; + + BITMAPFILEHEADER file_header = {}; + file_header.bfType = 0x4d42; + file_header.bfSize = sizeof(file_header) + bmi.bmiHeader.biSize + out_len; + file_header.bfOffBits = file_header.bfSize - out_len; + + fwrite(&file_header, sizeof(file_header), 1, fp); + fwrite(&bmi, bmi.bmiHeader.biSize, 1, fp); + fwrite(buffer, out_len, 1, fp); + fclose(fp); + return std::string(filename); +} + +void WriteEmf(FPDF_PAGE page, const char* pdf_name, int num) { + int width = static_cast(FPDF_GetPageWidth(page)); + int height = static_cast(FPDF_GetPageHeight(page)); + + char filename[256]; + snprintf(filename, sizeof(filename), "%s.%d.emf", pdf_name, num); + + HDC dc = CreateEnhMetaFileA(nullptr, filename, nullptr, nullptr); + + HRGN rgn = CreateRectRgn(0, 0, width, height); + SelectClipRgn(dc, rgn); + DeleteObject(rgn); + + SelectObject(dc, GetStockObject(NULL_PEN)); + SelectObject(dc, GetStockObject(WHITE_BRUSH)); + // If a PS_NULL pen is used, the dimensions of the rectangle are 1 pixel less. + Rectangle(dc, 0, 0, width + 1, height + 1); + + FPDF_RenderPage(dc, page, 0, 0, width, height, 0, + FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); + + DeleteEnhMetaFile(CloseEnhMetaFile(dc)); +} +#endif + +#ifdef PDF_ENABLE_SKIA +static std::string WriteSkp(const char* pdf_name, + int num, + SkPictureRecorder* recorder) { + char filename[256]; + int chars_formatted = + snprintf(filename, sizeof(filename), "%s.%d.skp", pdf_name, num); + + if (chars_formatted < 0 || + static_cast(chars_formatted) >= sizeof(filename)) { + fprintf(stderr, "Filename %s is too long\n", filename); + return ""; + } + + sk_sp picture(recorder->finishRecordingAsPicture()); + SkFILEWStream wStream(filename); + picture->serialize(&wStream); + return std::string(filename); +} +#endif + +// These example JS platform callback handlers are entirely optional, +// and exist here to show the flow of information from a document back +// to the embedder. +int ExampleAppAlert(IPDF_JSPLATFORM*, + FPDF_WIDESTRING msg, + FPDF_WIDESTRING title, + int type, + int icon) { + printf("%ls", GetPlatformWString(title).c_str()); + if (icon || type) + printf("[icon=%d,type=%d]", icon, type); + printf(": %ls\n", GetPlatformWString(msg).c_str()); + return 0; +} + +int ExampleAppResponse(IPDF_JSPLATFORM*, + FPDF_WIDESTRING question, + FPDF_WIDESTRING title, + FPDF_WIDESTRING default_value, + FPDF_WIDESTRING label, + FPDF_BOOL is_password, + void* response, + int length) { + printf("%ls: %ls, defaultValue=%ls, label=%ls, isPassword=%d, length=%d\n", + GetPlatformWString(title).c_str(), + GetPlatformWString(question).c_str(), + GetPlatformWString(default_value).c_str(), + GetPlatformWString(label).c_str(), is_password, length); + + // UTF-16, always LE regardless of platform. + uint8_t* ptr = static_cast(response); + ptr[0] = 'N'; + ptr[1] = 0; + ptr[2] = 'o'; + ptr[3] = 0; + return 4; +} + +void ExampleDocGotoPage(IPDF_JSPLATFORM*, int page_number) { + printf("Goto Page: %d\n", page_number); +} + +void ExampleDocMail(IPDF_JSPLATFORM*, + void* mailData, + int length, + FPDF_BOOL UI, + FPDF_WIDESTRING To, + FPDF_WIDESTRING Subject, + FPDF_WIDESTRING CC, + FPDF_WIDESTRING BCC, + FPDF_WIDESTRING Msg) { + printf("Mail Msg: %d, to=%ls, cc=%ls, bcc=%ls, subject=%ls, body=%ls\n", UI, + GetPlatformWString(To).c_str(), GetPlatformWString(CC).c_str(), + GetPlatformWString(BCC).c_str(), GetPlatformWString(Subject).c_str(), + GetPlatformWString(Msg).c_str()); +} + +void ExampleUnsupportedHandler(UNSUPPORT_INFO*, int type) { + std::string feature = "Unknown"; + switch (type) { + case FPDF_UNSP_DOC_XFAFORM: + feature = "XFA"; + break; + case FPDF_UNSP_DOC_PORTABLECOLLECTION: + feature = "Portfolios_Packages"; + break; + case FPDF_UNSP_DOC_ATTACHMENT: + case FPDF_UNSP_ANNOT_ATTACHMENT: + feature = "Attachment"; + break; + case FPDF_UNSP_DOC_SECURITY: + feature = "Rights_Management"; + break; + case FPDF_UNSP_DOC_SHAREDREVIEW: + feature = "Shared_Review"; + break; + case FPDF_UNSP_DOC_SHAREDFORM_ACROBAT: + case FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM: + case FPDF_UNSP_DOC_SHAREDFORM_EMAIL: + feature = "Shared_Form"; + break; + case FPDF_UNSP_ANNOT_3DANNOT: + feature = "3D"; + break; + case FPDF_UNSP_ANNOT_MOVIE: + feature = "Movie"; + break; + case FPDF_UNSP_ANNOT_SOUND: + feature = "Sound"; + break; + case FPDF_UNSP_ANNOT_SCREEN_MEDIA: + case FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA: + feature = "Screen"; + break; + case FPDF_UNSP_ANNOT_SIG: + feature = "Digital_Signature"; + break; + } + printf("Unsupported feature: %s.\n", feature.c_str()); +} + +bool ParseCommandLine(const std::vector& args, + Options* options, + std::vector* files) { + if (args.empty()) + return false; + + options->exe_path = args[0]; + size_t cur_idx = 1; + for (; cur_idx < args.size(); ++cur_idx) { + const std::string& cur_arg = args[cur_idx]; + if (cur_arg == "--show-config") { + options->show_config = true; + } else if (cur_arg == "--send-events") { + options->send_events = true; + } else if (cur_arg == "--ppm") { + if (options->output_format != OUTPUT_NONE) { + fprintf(stderr, "Duplicate or conflicting --ppm argument\n"); + return false; + } + options->output_format = OUTPUT_PPM; + } else if (cur_arg == "--png") { + if (options->output_format != OUTPUT_NONE) { + fprintf(stderr, "Duplicate or conflicting --png argument\n"); + return false; + } + options->output_format = OUTPUT_PNG; + } else if (cur_arg == "--txt") { + if (options->output_format != OUTPUT_NONE) { + fprintf(stderr, "Duplicate or conflicting --txt argument\n"); + return false; + } + options->output_format = OUTPUT_TEXT; +#ifdef PDF_ENABLE_SKIA + } else if (cur_arg == "--skp") { + if (options->output_format != OUTPUT_NONE) { + fprintf(stderr, "Duplicate or conflicting --skp argument\n"); + return false; + } + options->output_format = OUTPUT_SKP; +#endif + } else if (cur_arg.size() > 11 && + cur_arg.compare(0, 11, "--font-dir=") == 0) { + if (!options->font_directory.empty()) { + fprintf(stderr, "Duplicate --font-dir argument\n"); + return false; + } + options->font_directory = cur_arg.substr(11); +#ifdef _WIN32 + } else if (cur_arg == "--emf") { + if (options->output_format != OUTPUT_NONE) { + fprintf(stderr, "Duplicate or conflicting --emf argument\n"); + return false; + } + options->output_format = OUTPUT_EMF; + } else if (cur_arg == "--bmp") { + if (options->output_format != OUTPUT_NONE) { + fprintf(stderr, "Duplicate or conflicting --bmp argument\n"); + return false; + } + options->output_format = OUTPUT_BMP; +#endif // _WIN32 + +#ifdef PDF_ENABLE_V8 +#ifdef V8_USE_EXTERNAL_STARTUP_DATA + } else if (cur_arg.size() > 10 && + cur_arg.compare(0, 10, "--bin-dir=") == 0) { + if (!options->bin_directory.empty()) { + fprintf(stderr, "Duplicate --bin-dir argument\n"); + return false; + } + options->bin_directory = cur_arg.substr(10); +#endif // V8_USE_EXTERNAL_STARTUP_DATA +#endif // PDF_ENABLE_V8 + + } else if (cur_arg.size() > 8 && cur_arg.compare(0, 8, "--scale=") == 0) { + if (!options->scale_factor_as_string.empty()) { + fprintf(stderr, "Duplicate --scale argument\n"); + return false; + } + options->scale_factor_as_string = cur_arg.substr(8); + } else if (cur_arg.size() > 8 && cur_arg.compare(0, 8, "--pages=") == 0) { + if (options->pages) { + fprintf(stderr, "Duplicate --pages argument\n"); + return false; + } + options->pages = true; + const std::string pages_string = cur_arg.substr(8); + size_t first_dash = pages_string.find("-"); + if (first_dash == std::string::npos) { + std::stringstream(pages_string) >> options->first_page; + options->last_page = options->first_page; + } else { + std::stringstream(pages_string.substr(0, first_dash)) >> + options->first_page; + std::stringstream(pages_string.substr(first_dash + 1)) >> + options->last_page; + } + } else if (cur_arg == "--md5") { + options->md5 = true; + } else if (cur_arg.size() >= 2 && cur_arg[0] == '-' && cur_arg[1] == '-') { + fprintf(stderr, "Unrecognized argument %s\n", cur_arg.c_str()); + return false; + } else { + break; + } + } + for (size_t i = cur_idx; i < args.size(); i++) + files->push_back(args[i]); + + return true; +} + +FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* avail, size_t offset, size_t size) { + return true; +} + +void Add_Segment(FX_DOWNLOADHINTS* hints, size_t offset, size_t size) {} + +void SendPageEvents(const FPDF_FORMHANDLE& form, + const FPDF_PAGE& page, + const std::string& events) { + auto lines = StringSplit(events, '\n'); + for (auto line : lines) { + auto command = StringSplit(line, '#'); + if (command[0].empty()) + continue; + auto tokens = StringSplit(command[0], ','); + if (tokens[0] == "keycode") { + if (tokens.size() == 2) { + int keycode = atoi(tokens[1].c_str()); + FORM_OnKeyDown(form, page, keycode, 0); + FORM_OnKeyUp(form, page, keycode, 0); + } else { + fprintf(stderr, "keycode: bad args\n"); + } + } else if (tokens[0] == "mousedown") { + if (tokens.size() == 4) { + int x = atoi(tokens[2].c_str()); + int y = atoi(tokens[3].c_str()); + if (tokens[1] == "left") + FORM_OnLButtonDown(form, page, 0, x, y); +#ifdef PDF_ENABLE_XFA + else if (tokens[1] == "right") + FORM_OnRButtonDown(form, page, 0, x, y); +#endif + else + fprintf(stderr, "mousedown: bad button name\n"); + } else { + fprintf(stderr, "mousedown: bad args\n"); + } + } else if (tokens[0] == "mouseup") { + if (tokens.size() == 4) { + int x = atoi(tokens[2].c_str()); + int y = atoi(tokens[3].c_str()); + if (tokens[1] == "left") + FORM_OnLButtonUp(form, page, 0, x, y); +#ifdef PDF_ENABLE_XFA + else if (tokens[1] == "right") + FORM_OnRButtonUp(form, page, 0, x, y); +#endif + else + fprintf(stderr, "mouseup: bad button name\n"); + } else { + fprintf(stderr, "mouseup: bad args\n"); + } + } else if (tokens[0] == "mousemove") { + if (tokens.size() == 3) { + int x = atoi(tokens[1].c_str()); + int y = atoi(tokens[2].c_str()); + FORM_OnMouseMove(form, page, 0, x, y); + } else { + fprintf(stderr, "mousemove: bad args\n"); + } + } else { + fprintf(stderr, "Unrecognized event: %s\n", tokens[0].c_str()); + } + } +} + +FPDF_PAGE GetPageForIndex(FPDF_FORMFILLINFO* param, + FPDF_DOCUMENT doc, + int index) { + FPDF_FORMFILLINFO_PDFiumTest* form_fill_info = + ToPDFiumTestFormFillInfo(param); + auto& loaded_pages = form_fill_info->loaded_pages; + + auto iter = loaded_pages.find(index); + if (iter != loaded_pages.end()) + return iter->second; + + FPDF_PAGE page = FPDF_LoadPage(doc, index); + if (!page) + return nullptr; + + FPDF_FORMHANDLE& form_handle = form_fill_info->form_handle; + + FORM_OnAfterLoadPage(page, form_handle); + FORM_DoPageAAction(page, form_handle, FPDFPAGE_AACTION_OPEN); + + loaded_pages[index] = page; + return page; +} + +bool RenderPage(const std::string& name, + FPDF_DOCUMENT doc, + FPDF_FORMHANDLE& form, + FPDF_FORMFILLINFO_PDFiumTest& form_fill_info, + const int page_index, + const Options& options, + const std::string& events) { + FPDF_PAGE page = GetPageForIndex(&form_fill_info, doc, page_index); + if (!page) + return false; + + FPDF_TEXTPAGE text_page = FPDFText_LoadPage(page); + + if (options.send_events) + SendPageEvents(form, page, events); + + double scale = 1.0; + if (!options.scale_factor_as_string.empty()) + std::stringstream(options.scale_factor_as_string) >> scale; + + int width = static_cast(FPDF_GetPageWidth(page) * scale); + int height = static_cast(FPDF_GetPageHeight(page) * scale); + int alpha = FPDFPage_HasTransparency(page) ? 1 : 0; + FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, alpha); + if (bitmap) { + FPDF_DWORD fill_color = alpha ? 0x00000000 : 0xFFFFFFFF; + FPDFBitmap_FillRect(bitmap, 0, 0, width, height, fill_color); + FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, FPDF_ANNOT); + + FPDF_FFLDraw(form, bitmap, page, 0, 0, width, height, 0, FPDF_ANNOT); + int stride = FPDFBitmap_GetStride(bitmap); + const char* buffer = + reinterpret_cast(FPDFBitmap_GetBuffer(bitmap)); + + std::string&& image_file_name = ""; + switch (options.output_format) { +#ifdef _WIN32 + case OUTPUT_BMP: + image_file_name = + WriteBmp(name.c_str(), page_index, buffer, stride, width, height); + break; + + case OUTPUT_EMF: + WriteEmf(page, name.c_str(), page_index); + break; +#endif + case OUTPUT_TEXT: + WriteText(page, name.c_str(), page_index); + break; + + case OUTPUT_PNG: + image_file_name = + WritePng(name.c_str(), page_index, buffer, stride, width, height); + break; + + case OUTPUT_PPM: + image_file_name = + WritePpm(name.c_str(), page_index, buffer, stride, width, height); + break; + +#ifdef PDF_ENABLE_SKIA + case OUTPUT_SKP: { + std::unique_ptr recorder( + reinterpret_cast( + FPDF_RenderPageSkp(page, width, height))); + FPDF_FFLRecord(form, recorder.get(), page, 0, 0, width, height, 0, 0); + image_file_name = WriteSkp(name.c_str(), page_index, recorder.get()); + } break; +#endif + default: + break; + } + + // Write the filename and the MD5 of the buffer to stdout if we wrote a + // file. + if (options.md5 && image_file_name != "") + OutputMD5Hash(image_file_name.c_str(), buffer, stride * height); + + FPDFBitmap_Destroy(bitmap); + } else { + fprintf(stderr, "Page was too large to be rendered.\n"); + } + + form_fill_info.loaded_pages.erase(page_index); + + FORM_DoPageAAction(page, form, FPDFPAGE_AACTION_CLOSE); + FORM_OnBeforeClosePage(page, form); + FPDFText_ClosePage(text_page); + FPDF_ClosePage(page); + return !!bitmap; +} + +void RenderPdf(const std::string& name, + const char* pBuf, + size_t len, + const Options& options, + const std::string& events) { + IPDF_JSPLATFORM platform_callbacks; + memset(&platform_callbacks, '\0', sizeof(platform_callbacks)); + platform_callbacks.version = 3; + platform_callbacks.app_alert = ExampleAppAlert; + platform_callbacks.app_response = ExampleAppResponse; + platform_callbacks.Doc_gotoPage = ExampleDocGotoPage; + platform_callbacks.Doc_mail = ExampleDocMail; + + FPDF_FORMFILLINFO_PDFiumTest form_callbacks = {}; +#ifdef PDF_ENABLE_XFA + form_callbacks.version = 2; +#else // PDF_ENABLE_XFA + form_callbacks.version = 1; +#endif // PDF_ENABLE_XFA + form_callbacks.FFI_GetPage = GetPageForIndex; + form_callbacks.m_pJsPlatform = &platform_callbacks; + + TestLoader loader(pBuf, len); + FPDF_FILEACCESS file_access; + memset(&file_access, '\0', sizeof(file_access)); + file_access.m_FileLen = static_cast(len); + file_access.m_GetBlock = TestLoader::GetBlock; + file_access.m_Param = &loader; + + FX_FILEAVAIL file_avail; + memset(&file_avail, '\0', sizeof(file_avail)); + file_avail.version = 1; + file_avail.IsDataAvail = Is_Data_Avail; + + FX_DOWNLOADHINTS hints; + memset(&hints, '\0', sizeof(hints)); + hints.version = 1; + hints.AddSegment = Add_Segment; + + FPDF_DOCUMENT doc; + int nRet = PDF_DATA_NOTAVAIL; + bool bIsLinearized = false; + FPDF_AVAIL pdf_avail = FPDFAvail_Create(&file_avail, &file_access); + std::unique_ptr scoped_pdf_avail_deleter(pdf_avail); + + if (FPDFAvail_IsLinearized(pdf_avail) == PDF_LINEARIZED) { + doc = FPDFAvail_GetDocument(pdf_avail, nullptr); + if (doc) { + while (nRet == PDF_DATA_NOTAVAIL) + nRet = FPDFAvail_IsDocAvail(pdf_avail, &hints); + + if (nRet == PDF_DATA_ERROR) { + fprintf(stderr, "Unknown error in checking if doc was available.\n"); + FPDF_CloseDocument(doc); + return; + } + nRet = FPDFAvail_IsFormAvail(pdf_avail, &hints); + if (nRet == PDF_FORM_ERROR || nRet == PDF_FORM_NOTAVAIL) { + fprintf(stderr, + "Error %d was returned in checking if form was available.\n", + nRet); + FPDF_CloseDocument(doc); + return; + } + bIsLinearized = true; + } + } else { + doc = FPDF_LoadCustomDocument(&file_access, nullptr); + } + + if (!doc) { + unsigned long err = FPDF_GetLastError(); + fprintf(stderr, "Load pdf docs unsuccessful: "); + switch (err) { + case FPDF_ERR_SUCCESS: + fprintf(stderr, "Success"); + break; + case FPDF_ERR_UNKNOWN: + fprintf(stderr, "Unknown error"); + break; + case FPDF_ERR_FILE: + fprintf(stderr, "File not found or could not be opened"); + break; + case FPDF_ERR_FORMAT: + fprintf(stderr, "File not in PDF format or corrupted"); + break; + case FPDF_ERR_PASSWORD: + fprintf(stderr, "Password required or incorrect password"); + break; + case FPDF_ERR_SECURITY: + fprintf(stderr, "Unsupported security scheme"); + break; + case FPDF_ERR_PAGE: + fprintf(stderr, "Page not found or content error"); + break; + default: + fprintf(stderr, "Unknown error %ld", err); + } + fprintf(stderr, ".\n"); + + return; + } + + (void)FPDF_GetDocPermissions(doc); + + FPDF_FORMHANDLE form = FPDFDOC_InitFormFillEnvironment(doc, &form_callbacks); + form_callbacks.form_handle = form; + +#ifdef PDF_ENABLE_XFA + int doc_type = DOCTYPE_PDF; + if (FPDF_HasXFAField(doc, &doc_type) && doc_type != DOCTYPE_PDF && + !FPDF_LoadXFA(doc)) { + fprintf(stderr, "LoadXFA unsuccessful, continuing anyway.\n"); + } +#endif // PDF_ENABLE_XFA + FPDF_SetFormFieldHighlightColor(form, 0, 0xFFE4DD); + FPDF_SetFormFieldHighlightAlpha(form, 100); + + FORM_DoDocumentJSAction(form); + FORM_DoDocumentOpenAction(form); + + int page_count = FPDF_GetPageCount(doc); + int rendered_pages = 0; + int bad_pages = 0; + int first_page = options.pages ? options.first_page : 0; + int last_page = options.pages ? options.last_page + 1 : page_count; + for (int i = first_page; i < last_page; ++i) { + if (bIsLinearized) { + nRet = PDF_DATA_NOTAVAIL; + while (nRet == PDF_DATA_NOTAVAIL) + nRet = FPDFAvail_IsPageAvail(pdf_avail, i, &hints); + + if (nRet == PDF_DATA_ERROR) { + fprintf(stderr, "Unknown error in checking if page %d is available.\n", + i); + FPDFDOC_ExitFormFillEnvironment(form); + FPDF_CloseDocument(doc); + return; + } + } + if (RenderPage(name, doc, form, form_callbacks, i, options, events)) + ++rendered_pages; + else + ++bad_pages; + } + + FORM_DoDocumentAAction(form, FPDFDOC_AACTION_WC); + + FPDFDOC_ExitFormFillEnvironment(form); + FPDF_CloseDocument(doc); + + fprintf(stderr, "Rendered %d pages.\n", rendered_pages); + if (bad_pages) + fprintf(stderr, "Skipped %d bad pages.\n", bad_pages); +} + +static void ShowConfig() { + std::string config; + std::string maybe_comma; +#if PDF_ENABLE_V8 + config.append(maybe_comma); + config.append("V8"); + maybe_comma = ","; +#endif // PDF_ENABLE_V8 +#ifdef V8_USE_EXTERNAL_STARTUP_DATA + config.append(maybe_comma); + config.append("V8_EXTERNAL"); + maybe_comma = ","; +#endif // V8_USE_EXTERNAL_STARTUP_DATA +#ifdef PDF_ENABLE_XFA + config.append(maybe_comma); + config.append("XFA"); + maybe_comma = ","; +#endif // PDF_ENABLE_XFA +#ifdef PDF_ENABLE_ASAN + config.append(maybe_comma); + config.append("ASAN"); + maybe_comma = ","; +#endif // PDF_ENABLE_ASAN + printf("%s\n", config.c_str()); +} + +static const char kUsageString[] = + "Usage: pdfium_test [OPTION] [FILE]...\n" + " --show-config - print build options and exit\n" + " --send-events - send input described by .evt file\n" + " --bin-dir= - override path to v8 external data\n" + " --font-dir= - override path to external fonts\n" + " --scale= - scale output size by number (e.g. 0.5)\n" + " --pages=(-) - only render the given 0-based page(s)\n" +#ifdef _WIN32 + " --bmp - write page images ..bmp\n" + " --emf - write page meta files ..emf\n" +#endif // _WIN32 + " --txt - write page text in UTF32-LE ..txt\n" + " --png - write page images ..png\n" + " --ppm - write page images ..ppm\n" +#ifdef PDF_ENABLE_SKIA + " --skp - write page images ..skp\n" +#endif + " --md5 - write output image paths and their md5 hashes to stdout.\n" + ""; + +int main(int argc, const char* argv[]) { + std::vector args(argv, argv + argc); + Options options; + std::vector files; + if (!ParseCommandLine(args, &options, &files)) { + fprintf(stderr, "%s", kUsageString); + return 1; + } + + if (options.show_config) { + ShowConfig(); + return 0; + } + + if (files.empty()) { + fprintf(stderr, "No input files.\n"); + return 1; + } + +#ifdef PDF_ENABLE_V8 + v8::Platform* platform; +#ifdef V8_USE_EXTERNAL_STARTUP_DATA + v8::StartupData natives; + v8::StartupData snapshot; + InitializeV8ForPDFium(options.exe_path, options.bin_directory, &natives, + &snapshot, &platform); +#else // V8_USE_EXTERNAL_STARTUP_DATA + InitializeV8ForPDFium(options.exe_path, &platform); +#endif // V8_USE_EXTERNAL_STARTUP_DATA +#endif // PDF_ENABLE_V8 + + FPDF_LIBRARY_CONFIG config; + config.version = 2; + config.m_pUserFontPaths = nullptr; + config.m_pIsolate = nullptr; + config.m_v8EmbedderSlot = 0; + + const char* path_array[2]; + if (!options.font_directory.empty()) { + path_array[0] = options.font_directory.c_str(); + path_array[1] = nullptr; + config.m_pUserFontPaths = path_array; + } + FPDF_InitLibraryWithConfig(&config); + + UNSUPPORT_INFO unsupported_info; + memset(&unsupported_info, '\0', sizeof(unsupported_info)); + unsupported_info.version = 1; + unsupported_info.FSDK_UnSupport_Handler = ExampleUnsupportedHandler; + + FSDK_SetUnSpObjProcessHandler(&unsupported_info); + + for (const std::string& filename : files) { + size_t file_length = 0; + std::unique_ptr file_contents = + GetFileContents(filename.c_str(), &file_length); + if (!file_contents) + continue; + fprintf(stderr, "Rendering PDF file %s.\n", filename.c_str()); + std::string events; + if (options.send_events) { + std::string event_filename = filename; + size_t event_length = 0; + size_t extension_pos = event_filename.find(".pdf"); + if (extension_pos != std::string::npos) { + event_filename.replace(extension_pos, 4, ".evt"); + if (access(event_filename.c_str(), R_OK) == 0) { + fprintf(stderr, "Using event file %s.\n", event_filename.c_str()); + std::unique_ptr event_contents = + GetFileContents(event_filename.c_str(), &event_length); + if (event_contents) { + fprintf(stderr, "Sending events from: %s\n", + event_filename.c_str()); + events = std::string(event_contents.get(), event_length); + } + } + } + } + RenderPdf(filename, file_contents.get(), file_length, options, events); + } + + FPDF_DestroyLibrary(); +#ifdef PDF_ENABLE_V8 + v8::V8::ShutdownPlatform(); + delete platform; + +#ifdef V8_USE_EXTERNAL_STARTUP_DATA + free(const_cast(natives.data)); + free(const_cast(snapshot.data)); +#endif // V8_USE_EXTERNAL_STARTUP_DATA +#endif // PDF_ENABLE_V8 + + return 0; +} diff --git a/modules/pdfium/pdfium/skia/BUILD.gn b/modules/pdfium/pdfium/skia/BUILD.gn new file mode 100644 index 000000000000..723e872b0dcb --- /dev/null +++ b/modules/pdfium/pdfium/skia/BUILD.gn @@ -0,0 +1,505 @@ +# Copyright (c) 2013 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/features.gni") +import("//build/config/ui.gni") +import("//testing/test.gni") +import("//third_party/skia/gn/shared_sources.gni") + +if (current_cpu == "arm") { + import("//build/config/arm.gni") +} +if (current_cpu == "mipsel" || current_cpu == "mips64el") { + import("//build/config/mips.gni") +} + +skia_support_gpu = !is_ios +skia_support_pdf = false #!is_ios && (enable_basic_printing || enable_print_preview) + +# External-facing config for dependent code. +config("skia_config") { + include_dirs = [ + "config", + "ext", + "//third_party/skia/include/c", + "//third_party/skia/include/config", + "//third_party/skia/include/core", + "//third_party/skia/include/effects", + "//third_party/skia/include/images", + "//third_party/skia/include/lazy", + "//third_party/skia/include/pathops", + "//third_party/skia/include/pdf", + "//third_party/skia/include/pipe", + "//third_party/skia/include/ports", + "//third_party/skia/include/utils", + + # TODO(dsinclair): Right way to use //third_party/freetype? + "//third_party/freetype/include", + ] + + defines = [] + + if (skia_support_gpu) { + include_dirs += [ + "//third_party/skia/include/gpu", + "//third_party/skia/src/gpu", + ] + defines += [ "SK_SUPPORT_GPU=1" ] + } else { + defines += [ "SK_SUPPORT_GPU=0" ] + } + + if (is_android) { + defines += [ + "SK_BUILD_FOR_ANDROID", + "USE_CHROMIUM_SKIA", + ] + } + + if (is_mac) { + defines += [ "SK_BUILD_FOR_MAC" ] + } + + if (is_win) { + defines += [ "GR_GL_FUNCTION_TYPE=__stdcall" ] + } +} + +# Internal-facing config for Skia library code. +config("skia_library_config") { + # These include directories are only included for Skia code and are not + # exported to dependents. It's not clear if this is on purpose, but this + # matches the GYP build. + include_dirs = [ + "//third_party/skia/include/private", + "//third_party/skia/include/client/android", + "//third_party/skia/src/core", + "//third_party/skia/src/image", + "//third_party/skia/src/opts", + "//third_party/skia/src/pdf", + "//third_party/skia/src/ports", + "//third_party/skia/src/sfnt", + "//third_party/skia/src/sksl", + "//third_party/skia/src/utils", + "//third_party/skia/src/lazy", + ] + if (is_mac || is_ios) { + include_dirs += [ "//third_party/skia/include/utils/mac" ] + } + if (is_mac) { + include_dirs += [ "//third_party/skia/include/utils/ios" ] + } + + defines = [] + + if (current_cpu == "arm") { + if (arm_use_neon) { + defines += [ "SK_ARM_HAS_NEON" ] + } else if (arm_optionally_use_neon) { + defines += [ "SK_ARM_HAS_OPTIONAL_NEON" ] + } + } + + # Settings for text blitting, chosen to approximate the system browser. + if (is_linux) { + defines += [ + "SK_GAMMA_EXPONENT=1.2", + "SK_GAMMA_CONTRAST=0.2", + ] + } else if (is_android) { + defines += [ + "SK_GAMMA_APPLY_TO_A8", + "SK_GAMMA_EXPONENT=1.4", + "SK_GAMMA_CONTRAST=0.0", + ] + } else if (is_win) { + defines += [ + "SK_GAMMA_SRGB", + "SK_GAMMA_CONTRAST=0.5", + ] + } else if (is_mac) { + defines += [ + "SK_GAMMA_SRGB", + "SK_GAMMA_CONTRAST=0.0", + ] + } + + if (is_android) { + defines += [ + # Android devices are typically more memory constrained, so default to a + # smaller glyph cache (it may be overriden at runtime when the renderer + # starts up, depending on the actual device memory). + "SK_DEFAULT_FONT_CACHE_LIMIT=1048576", # 1024 * 1024 + ] + } else { + defines += [ "SK_DEFAULT_FONT_CACHE_LIMIT=20971520" ] # 20 * 1024 * 1024 + } + + if (is_win) { + include_dirs += [ + "//third_party/skia/include/utils/win", + "//third_party/skia/src/utils/win", + ] + + defines += [ + # On windows, GDI handles are a scarse system-wide resource so we have to + # keep the glyph cache, which holds up to 4 GDI handles per entry, to a + # fairly small size. http://crbug.com/314387 + "SK_DEFAULT_FONT_CACHE_COUNT_LIMIT=256", + ] + + cflags = [ + "/wd4244", # conversion from 'type1( __int64)' to 'type2 (unsigned int)' + "/wd4267", # conversion from 'size_t' (64 bit) to 'type'(32 bit). + "/wd4341", # signed value is out of range for enum constant. + "/wd4345", # Object is default-initialized if initialization is omitted. + "/wd4390", # ';'empty statement found in looping;is it what was intended? + "/wd4554", # 'operator' : check operator precedence for possible error + "/wd4748", # compiler will disable optimizations if a function has inline + # assembly code contains flow control(jmp or jcc) statements. + + "/wd4800", # forcing value to bool 'true/false'(assigning int to bool). + ] + } +} + +component("skia") { + sources = [ + # PDFium sources. + "config/SkUserConfig.h", + "ext/google_logging.cc", + ] + + # The skia gypi values are relative to the skia_dir, so we need to rebase. + sources += skia_core_sources + sources += skia_effects_sources + sources += skia_sksl_sources + sources += skia_utils_sources + sources += [ + "//third_party/skia/src/fonts/SkFontMgr_indirect.cpp", + "//third_party/skia/src/fonts/SkRemotableFontMgr.cpp", + "//third_party/skia/src/ports/SkFontHost_FreeType.cpp", + "//third_party/skia/src/ports/SkFontHost_FreeType_common.cpp", + "//third_party/skia/src/ports/SkFontHost_win.cpp", + "//third_party/skia/src/ports/SkFontMgr_android.cpp", + "//third_party/skia/src/ports/SkFontMgr_android_factory.cpp", + "//third_party/skia/src/ports/SkFontMgr_android_parser.cpp", + "//third_party/skia/src/ports/SkGlobalInitialization_default.cpp", + "//third_party/skia/src/ports/SkImageEncoder_none.cpp", + "//third_party/skia/src/ports/SkImageGenerator_none.cpp", + "//third_party/skia/src/ports/SkOSFile_posix.cpp", + "//third_party/skia/src/ports/SkOSFile_stdio.cpp", + "//third_party/skia/src/ports/SkOSFile_win.cpp", + "//third_party/skia/src/ports/SkRemotableFontMgr_win_dw.cpp", + "//third_party/skia/src/ports/SkScalerContext_win_dw.cpp", + "//third_party/skia/src/ports/SkTLS_pthread.cpp", + "//third_party/skia/src/ports/SkTLS_win.cpp", + "//third_party/skia/src/ports/SkTypeface_win_dw.cpp", + "//third_party/skia/src/sfnt/SkOTTable_name.cpp", + "//third_party/skia/src/sfnt/SkOTUtils.cpp", + + #mac + "//third_party/skia/src/utils/mac/SkStream_mac.cpp", + + #pdfium + "//third_party/skia/src/ports/SkDiscardableMemory_none.cpp", + "//third_party/skia/src/ports/SkFontMgr_custom.cpp", + "//third_party/skia/src/ports/SkFontMgr_custom_empty.cpp", + "//third_party/skia/src/ports/SkFontMgr_custom_empty_factory.cpp", + "//third_party/skia/src/ports/SkMemory_malloc.cpp", + ] + + # This and skia_opts are really the same conceptual target so share headers. + allow_circular_includes_from = [ ":skia_opts" ] + + if (current_cpu == "arm") { + sources += [ "//third_party/skia/src/core/SkUtilsArm.cpp" ] + } + + # GPU + if (skia_support_gpu) { + sources += skia_gpu_sources + sources += skia_null_gpu_sources + } + + # Remove unused util files include in utils.gypi + sources -= [ + "//third_party/skia/src/utils/SkBoundaryPatch.cpp", + "//third_party/skia/src/utils/SkCamera.cpp", + "//third_party/skia/src/utils/SkDumpCanvas.cpp", + "//third_party/skia/src/utils/SkFrontBufferedStream.cpp", + "//third_party/skia/src/utils/SkInterpolator.cpp", + "//third_party/skia/src/utils/SkMeshUtils.cpp", + "//third_party/skia/src/utils/SkParsePath.cpp", + ] + + if (is_win) { + sources -= [ + # Keeping _win.cpp + "//third_party/skia/src/utils/SkThreadUtils_pthread.cpp", + ] + } else { + sources -= [ + # Keeping _pthread.cpp + "//third_party/skia/src/utils/SkThreadUtils_win.cpp", + ] + } + + # need separate win section to handle chromes auto gn filter + # (build/config/BUILDCONFIG.gn) + if (is_win) { + sources -= [ + #windows + "//third_party/skia/src/utils/win/SkAutoCoInitialize.cpp", + "//third_party/skia/src/utils/win/SkIStream.cpp", + "//third_party/skia/src/utils/win/SkWGL_win.cpp", + ] + } + + # Fixup skia library sources. + if (is_win) { + sources -= [ + "//third_party/skia/src/ports/SkOSFile_posix.cpp", + "//third_party/skia/src/ports/SkTLS_pthread.cpp", + ] + } else { + sources -= [ + "//third_party/skia/src/ports/SkFontHost_win.cpp", + "//third_party/skia/src/ports/SkOSFile_win.cpp", + "//third_party/skia/src/ports/SkRemotableFontMgr_win_dw.cpp", + "//third_party/skia/src/ports/SkScalerContext_win_dw.cpp", + "//third_party/skia/src/ports/SkTLS_win.cpp", + "//third_party/skia/src/ports/SkTypeface_win_dw.cpp", + ] + } + if (!is_android) { + sources -= [ + "//third_party/skia/src/ports/SkFontMgr_android.cpp", + "//third_party/skia/src/ports/SkFontMgr_android_factory.cpp", + "//third_party/skia/src/ports/SkFontMgr_android_parser.cpp", + ] + } + if (!is_linux && !is_android && !is_win && !is_mac) { + sources -= [ + "//third_party/skia/src/ports/SkFontHost_FreeType.cpp", + "//third_party/skia/src/ports/SkFontHost_FreeType_common.cpp", + "//third_party/skia/src/ports/SkFontMgr_custom.cpp", + "//third_party/skia/src/ports/SkFontMgr_custom_empty_factory.cpp", + ] + } + + if (is_clang && !is_nacl) { + # Skia won't compile with some of the more strict clang warnings. + # e.g. it does: + # SkASSERT(!"sk_out_of_memory"); + configs -= [ "//build/config/clang:extra_warnings" ] + } + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + ":skia_config", + ":skia_library_config", + "//build/config/compiler:no_chromium_code", + ] + public_configs = [ ":skia_config" ] + + deps = [ + ":skia_opts", + "../third_party:fx_zlib", + ] + + if (is_linux) { + deps += [ "//third_party/icu:icuuc" ] + } + + if (is_android) { + set_sources_assignment_filter([]) + set_sources_assignment_filter(sources_assignment_filter) + deps += [ + "//third_party/android_tools:cpu_features", + "//third_party/expat", + "//third_party/freetype-android:freetype", + ] + } + + if (skia_support_pdf) { + deps += [ "//third_party/sfntly" ] + sources += skia_pdf_sources + } else { + sources += [ "//third_party/skia/src/pdf/SkDocument_PDF_None.cpp" ] + } + + if (is_android && !is_debug) { + configs -= [ "//build/config/compiler:default_optimization" ] + configs += [ "//build/config/compiler:optimize_max" ] + } + + if (is_ios) { + libs = [ "ImageIO.framework" ] + set_sources_assignment_filter([]) + sources += [ + "//third_party/skia/src/ports/SkFontHost_mac.cpp", + "//third_party/skia/src/utils/mac/SkCreateCGImageRef.cpp", + "//third_party/skia/src/utils/mac/SkStream_mac.cpp", + ] + set_sources_assignment_filter(sources_assignment_filter) + + # To disable warning "CGContextSelectFont' is deprecated" + cflags = [ "-Wno-deprecated-declarations" ] + } +} + +# Separated out so it can be compiled with different flags for SSE. +if (current_cpu == "x86" || current_cpu == "x64") { + source_set("skia_opts_sse3") { + sources = skia_opts.ssse3_sources + if (!is_win || is_clang) { + cflags = [ "-mssse3" ] + } + if (is_win) { + defines = [ "SK_CPU_SSE_LEVEL=31" ] + } + visibility = [ ":skia_opts" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + ":skia_config", + ":skia_library_config", + "//build/config/compiler:no_chromium_code", + ] + } + source_set("skia_opts_sse41") { + sources = skia_opts.sse41_sources + if (!is_win || is_clang) { + cflags = [ "-msse4.1" ] + } + if (is_win) { + defines = [ "SK_CPU_SSE_LEVEL=41" ] + } + visibility = [ ":skia_opts" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + ":skia_config", + ":skia_library_config", + "//build/config/compiler:no_chromium_code", + ] + } + source_set("skia_opts_sse42") { + sources = skia_opts.sse42_sources + if (!is_win || is_clang) { + cflags = [ "-msse4.2" ] + } + if (is_win) { + defines = [ "SK_CPU_SSE_LEVEL=42" ] + } + visibility = [ ":skia_opts" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + ":skia_config", + ":skia_library_config", + "//build/config/compiler:no_chromium_code", + ] + } + source_set("skia_opts_avx") { + sources = skia_opts.avx_sources + if (!is_win) { + cflags = [ "-mavx" ] + } + if (is_win) { + cflags = [ "/arch:AVX" ] + } + visibility = [ ":skia_opts" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + ":skia_config", + ":skia_library_config", + "//build/config/compiler:no_chromium_code", + ] + } + source_set("skia_opts_hsw") { + sources = skia_opts.hsw_sources + if (!is_win) { + cflags = [ + "-mavx2", + "-mbmi", + "-mbmi2", + "-mf16c", + "-mfma", + ] + } + if (is_win) { + cflags = [ "/arch:AVX2" ] + } + visibility = [ ":skia_opts" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + ":skia_config", + ":skia_library_config", + "//build/config/compiler:no_chromium_code", + ] + } +} +source_set("skia_opts") { + cflags = [] + defines = [] + + if (current_cpu == "x86" || current_cpu == "x64") { + sources = skia_opts.sse2_sources + deps = [ + ":skia_opts_avx", + ":skia_opts_hsw", + ":skia_opts_sse3", + ":skia_opts_sse41", + ":skia_opts_sse42", + ] + } else if (current_cpu == "arm") { + # The assembly uses the frame pointer register (r7 in Thumb/r11 in + # ARM), the compiler doesn't like that. + cflags += [ "-fomit-frame-pointer" ] + + if (arm_version >= 7) { + sources = skia_opts.armv7_sources + if (arm_use_neon || arm_optionally_use_neon) { + sources += skia_opts.neon_sources + + # Root build config sets -mfpu=$arm_fpu, which we expect to be neon + # when running this. + if (!arm_use_neon) { + configs -= [ "//build/config/compiler:compiler_arm_fpu" ] + cflags += [ "-mfpu=neon" ] + } + } + } else { + sources = skia_opts.none_sources + } + } else if (current_cpu == "arm64") { + sources = skia_opts.arm64_sources + } else if (current_cpu == "mipsel") { + cflags += [ "-fomit-frame-pointer" ] + + if (mips_dsp_rev >= 1) { + sources = skia_opts.mips_dsp_sources + } else { + sources = skia_opts.none_sources + } + } else if (current_cpu == "mips64el") { + cflags += [ "-fomit-frame-pointer" ] + sources = skia_opts.none_sources + } else { + assert(false, "Need to port cpu specific stuff from skia_library_opts.gyp") + } + + if (is_android && !is_debug) { + configs -= [ "//build/config/compiler:default_optimization" ] + configs += [ "//build/config/compiler:optimize_max" ] + } + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + ":skia_config", + ":skia_library_config", + "//build/config/compiler:no_chromium_code", + ] + + visibility = [ ":skia" ] +} diff --git a/modules/pdfium/pdfium/skia/config/SkUserConfig.h b/modules/pdfium/pdfium/skia/config/SkUserConfig.h new file mode 100644 index 000000000000..e09a2351b3bd --- /dev/null +++ b/modules/pdfium/pdfium/skia/config/SkUserConfig.h @@ -0,0 +1,269 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SKIA_CONFIG_SKUSERCONFIG_H_ +#define SKIA_CONFIG_SKUSERCONFIG_H_ + +/* SkTypes.h, the root of the public header files, does the following trick: + + #include + #include + #include + + SkPreConfig.h runs first, and it is responsible for initializing certain + skia defines. + + SkPostConfig.h runs last, and its job is to just check that the final + defines are consistent (i.e. that we don't have mutually conflicting + defines). + + SkUserConfig.h (this file) runs in the middle. It gets to change or augment + the list of flags initially set in preconfig, and then postconfig checks + that everything still makes sense. + + Below are optional defines that add, subtract, or change default behavior + in Skia. Your port can locally edit this file to enable/disable flags as + you choose, or these can be delared on your command line (i.e. -Dfoo). + + By default, this include file will always default to having all of the flags + commented out, so including it will have no effect. +*/ + +/////////////////////////////////////////////////////////////////////////////// + +/* Skia has lots of debug-only code. Often this is just null checks or other + parameter checking, but sometimes it can be quite intrusive (e.g. check that + each 32bit pixel is in premultiplied form). This code can be very useful + during development, but will slow things down in a shipping product. + + By default, these mutually exclusive flags are defined in SkPreConfig.h, + based on the presence or absence of NDEBUG, but that decision can be changed + here. + */ +// #define SK_DEBUG +// #define SK_RELEASE + +// #ifdef DCHECK_ALWAYS_ON +// #undef SK_RELEASE +// #define SK_DEBUG +// #endif + +/* If, in debugging mode, Skia needs to stop (presumably to invoke a debugger) + it will call SK_CRASH(). If this is not defined it, it is defined in + SkPostConfig.h to write to an illegal address + */ +// #define SK_CRASH() *(int *)(uintptr_t)0 = 0 + +/* preconfig will have attempted to determine the endianness of the system, + but you can change these mutually exclusive flags here. + */ +// #define SK_CPU_BENDIAN +// #define SK_CPU_LENDIAN + +/* If zlib is available and you want to support the flate compression + algorithm (used in PDF generation), define SK_ZLIB_INCLUDE to be the + include path. + */ +// #define SK_ZLIB_INCLUDE + +/* Define this to allow PDF scalars above 32k. The PDF/A spec doesn't allow + them, but modern PDF interpreters should handle them just fine. + */ +// #define SK_ALLOW_LARGE_PDF_SCALARS + +/* Define this to provide font subsetter for font subsetting when generating + PDF documents. + */ +// #define SK_SFNTLY_SUBSETTER \ +// "third_party/sfntly/src/cpp/src/sample/chromium/font_subsetter.h" + +/* To write debug messages to a console, skia will call SkDebugf(...) following + printf conventions (e.g. const char* format, ...). If you want to redirect + this to something other than printf, define yours here + */ +// #define SkDebugf(...) MyFunction(__VA_ARGS__) + +/* If SK_DEBUG is defined, then you can optionally define SK_SUPPORT_UNITTEST + which will run additional self-tests at startup. These can take a long time, + so this flag is optional. + */ +#ifdef SK_DEBUG +#define SK_SUPPORT_UNITTEST +#endif + +/* If cross process SkPictureImageFilters are not explicitly enabled then + they are always disabled. + */ +#ifndef SK_ALLOW_CROSSPROCESS_PICTUREIMAGEFILTERS +#ifndef SK_DISALLOW_CROSSPROCESS_PICTUREIMAGEFILTERS +#define SK_DISALLOW_CROSSPROCESS_PICTUREIMAGEFILTERS +#endif +#endif + +/* If your system embeds skia and has complex event logging, define this + symbol to name a file that maps the following macros to your system's + equivalents: + SK_TRACE_EVENT0(event) + SK_TRACE_EVENT1(event, name1, value1) + SK_TRACE_EVENT2(event, name1, value1, name2, value2) + src/utils/SkDebugTrace.h has a trivial implementation that writes to + the debug output stream. If SK_USER_TRACE_INCLUDE_FILE is not defined, + SkTrace.h will define the above three macros to do nothing. +*/ +#undef SK_USER_TRACE_INCLUDE_FILE + +// ===== Begin Chrome-specific definitions ===== + +#define SK_MSCALAR_IS_FLOAT +#undef SK_MSCALAR_IS_DOUBLE + +#define GR_MAX_OFFSCREEN_AA_DIM 512 + +// Log the file and line number for assertions. +#define SkDebugf(...) SkDebugf_FileLine(__FILE__, __LINE__, false, __VA_ARGS__) +SK_API void SkDebugf_FileLine(const char* file, + int line, + bool fatal, + const char* format, + ...); + +// Marking the debug print as "fatal" will cause a debug break, so we don't need +// a separate crash call here. +#define SK_DEBUGBREAK(cond) \ + do { \ + if (!(cond)) { \ + SkDebugf_FileLine(__FILE__, __LINE__, true, \ + "%s:%d: failed assertion \"%s\"\n", __FILE__, \ + __LINE__, #cond); \ + } \ + } while (false) + +#if !defined(ANDROID) // On Android, we use the skia default settings. +#define SK_A32_SHIFT 24 +#define SK_R32_SHIFT 16 +#define SK_G32_SHIFT 8 +#define SK_B32_SHIFT 0 +#endif + +#if defined(SK_BUILD_FOR_WIN32) + +#define SK_BUILD_FOR_WIN + +// Skia uses this deprecated bzero function to fill zeros into a string. +#define bzero(str, len) memset(str, 0, len) + +#elif defined(SK_BUILD_FOR_MAC) + +#define SK_CPU_LENDIAN +#undef SK_CPU_BENDIAN + +#elif defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID) + +// Prefer FreeType's emboldening algorithm to Skia's +// TODO: skia used to just use hairline, but has improved since then, so +// we should revisit this choice... +#define SK_USE_FREETYPE_EMBOLDEN + +#if defined(SK_BUILD_FOR_UNIX) && defined(SK_CPU_BENDIAN) +// Above we set the order for ARGB channels in registers. I suspect that, on +// big endian machines, you can keep this the same and everything will work. +// The in-memory order will be different, of course, but as long as everything +// is reading memory as words rather than bytes, it will all work. However, if +// you find that colours are messed up I thought that I would leave a helpful +// locator for you. Also see the comments in +// base/gfx/bitmap_platform_device_linux.h +#error Read the comment at this location +#endif + +#endif + +// The default crash macro writes to badbeef which can cause some strange +// problems. Instead, pipe this through to the logging function as a fatal +// assertion. +#define SK_CRASH() SkDebugf_FileLine(__FILE__, __LINE__, true, "SK_CRASH") + +// These flags are no longer defined in Skia, but we have them (temporarily) +// until we update our call-sites (typically these are for API changes). +// +// Remove these as we update our sites. +// +#ifndef SK_SUPPORT_LEGACY_GETTOPDEVICE +#define SK_SUPPORT_LEGACY_GETTOPDEVICE +#endif + +#ifndef SK_SUPPORT_EXOTIC_CLIPOPS +#define SK_SUPPORT_EXOTIC_CLIPOPS +#endif + +#ifndef SK_SUPPORT_LEGACY_GETDEVICE +#define SK_SUPPORT_LEGACY_GETDEVICE +#endif + +// Workaround for poor anisotropic mipmap quality, +// pending Skia ripmap support. +// (https://bugs.chromium.org/p/skia/issues/detail?id=4863) +#ifndef SK_SUPPORT_LEGACY_ANISOTROPIC_MIPMAP_SCALE +#define SK_SUPPORT_LEGACY_ANISOTROPIC_MIPMAP_SCALE +#endif + +#ifndef SK_SUPPORT_LEGACY_REFENCODEDDATA_NOCTX +#define SK_SUPPORT_LEGACY_REFENCODEDDATA_NOCTX +#endif + +#ifndef SK_IGNORE_ETC1_SUPPORT +#define SK_IGNORE_ETC1_SUPPORT +#endif + +#ifndef SK_IGNORE_GPU_DITHER +#define SK_IGNORE_GPU_DITHER +#endif + +#ifndef SK_SUPPORT_LEGACY_EVAL_CUBIC +#define SK_SUPPORT_LEGACY_EVAL_CUBIC +#endif + +///////////////////////// Imported from BUILD.gn and skia_common.gypi + +/* In some places Skia can use static initializers for global initialization, + * or fall back to lazy runtime initialization. Chrome always wants the latter. + */ +#define SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 0 + +/* This flag forces Skia not to use typographic metrics with GDI. + */ +#define SK_GDI_ALWAYS_USE_TEXTMETRICS_FOR_FONT_METRICS + +#define SK_IGNORE_BLURRED_RRECT_OPT +#define SK_USE_DISCARDABLE_SCALEDIMAGECACHE +#define SK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT + +#define SK_ATTR_DEPRECATED SK_NOTHING_ARG1 +#define SK_ENABLE_INST_COUNT 0 +#define GR_GL_CUSTOM_SETUP_HEADER "GrGLConfig_chrome.h" + +// Blink layout tests are baselined to Clang optimizing through the UB in +// SkDivBits. +#define SK_SUPPORT_LEGACY_DIVBITS_UB + +// mtklein's fiddling with Src / SrcOver. Will rebaseline these only once when +// done. +#define SK_SUPPORT_LEGACY_X86_BLITS + +#define SK_DISABLE_TILE_IMAGE_FILTER_OPTIMIZATION + +// ===== End Chrome-specific definitions ===== + +#endif // SKIA_CONFIG_SKUSERCONFIG_H_ diff --git a/modules/pdfium/pdfium/skia/ext/DEPS b/modules/pdfium/pdfium/skia/ext/DEPS new file mode 100644 index 000000000000..007e5550d5b0 --- /dev/null +++ b/modules/pdfium/pdfium/skia/ext/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + '+third_party/skia/include/core' +] diff --git a/modules/pdfium/pdfium/skia/ext/google_logging.cc b/modules/pdfium/pdfium/skia/ext/google_logging.cc new file mode 100644 index 000000000000..99061672e723 --- /dev/null +++ b/modules/pdfium/pdfium/skia/ext/google_logging.cc @@ -0,0 +1,25 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file provides integration with Google-style "base/logging.h" assertions +// for Skia SkASSERT. If you don't want this, you can link with another file +// that provides integration with the logging of your choice. + +#include +#include + +#include "third_party/skia/include/core/SkTypes.h" + +void SkDebugf_FileLine(const char* file, + int line, + bool fatal, + const char* format, + ...) { + va_list ap; + va_start(ap, format); + + fprintf(stderr, "%s:%d ", file, line); + vfprintf(stderr, format, ap); + va_end(ap); +} diff --git a/modules/pdfium/pdfium/third_party/BUILD.gn b/modules/pdfium/pdfium/third_party/BUILD.gn new file mode 100644 index 000000000000..50ab70705886 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/BUILD.gn @@ -0,0 +1,486 @@ +# Copyright 2014 PDFium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/arm.gni") +import("//build_overrides/build.gni") +import("../pdfium.gni") + +group("third_party") { + deps = [ + ":bigint", + ":fx_freetype", + ":pdfium_base", + ] +} + +config("pdfium_third_party_config") { + configs = [ "..:pdfium_common_config" ] +} + +static_library("bigint") { + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":pdfium_third_party_config", + ] + sources = [ + "bigint/BigInteger.cc", + "bigint/BigInteger.hh", + "bigint/BigIntegerLibrary.hh", + "bigint/BigIntegerUtils.cc", + "bigint/BigIntegerUtils.hh", + "bigint/BigUnsigned.cc", + "bigint/BigUnsigned.hh", + "bigint/BigUnsignedInABase.cc", + "bigint/BigUnsignedInABase.hh", + "bigint/NumberlikeArray.hh", + ] +} + +config("fx_freetype_warnings") { + visibility = [ ":*" ] + if (is_clang) { + # open_face_PS_from_sfnt_stream() and open_face_from_buffer() in + # ftbase.h are unused. + cflags = [ "-Wno-unused-function" ] + } +} + +# Tests may link against this even if the production library doesn't, +# so it needs to be separate from it. +static_library("fx_freetype") { + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":pdfium_third_party_config", + + # Must be after no_chromium_code for warning flags to be ordered correctly. + ":fx_freetype_warnings", + ] + defines = [ "FT2_BUILD_LIBRARY" ] + sources = [ + "freetype/include/freetype/freetype.h", + "freetype/include/freetype/ftmm.h", + "freetype/include/freetype/ftotval.h", + "freetype/include/freetype/ftoutln.h", + "freetype/include/freetype/internal/ftobjs.h", + "freetype/include/freetype/internal/ftstream.h", + "freetype/include/freetype/internal/tttypes.h", + "freetype/include/freetype/tttables.h", + "freetype/include/ft2build.h", + "freetype/src/base/ftbase.c", + "freetype/src/base/ftbase.h", + "freetype/src/base/ftbitmap.c", + "freetype/src/base/ftglyph.c", + "freetype/src/base/ftinit.c", + "freetype/src/base/ftlcdfil.c", + "freetype/src/base/ftmm.c", + "freetype/src/base/ftsystem.c", + "freetype/src/cff/cff.c", + "freetype/src/cff/cffobjs.h", + "freetype/src/cff/cfftypes.h", + "freetype/src/cid/type1cid.c", + "freetype/src/psaux/psaux.c", + "freetype/src/pshinter/pshinter.c", + "freetype/src/psnames/psmodule.c", + "freetype/src/raster/raster.c", + "freetype/src/sfnt/sfnt.c", + "freetype/src/smooth/smooth.c", + "freetype/src/truetype/truetype.c", + "freetype/src/type1/type1.c", + ] + if (pdf_use_skia || pdf_use_skia_paths) { + sources += [ + "freetype/src/base/ftfntfmt.c", + "freetype/src/base/ftfstype.c", + "freetype/src/base/fttype1.c", + ] + } +} + +if (!pdf_use_skia && !pdf_use_skia_paths) { + config("fx_agg_warnings") { + visibility = [ ":*" ] + if (is_clang) { + # calc_butt_cap() in agg_vcgen_stroke.cpp is unused. + cflags = [ "-Wno-unused-function" ] + } + } + + static_library("fx_agg") { + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":pdfium_third_party_config", + + # Must be after no_chromium_code for warning flags to be ordered correctly. + ":fx_agg_warnings", + ] + sources = [ + "agg23/agg_basics.h", + "agg23/agg_clip_liang_barsky.h", + "agg23/agg_conv_dash.h", + "agg23/agg_conv_stroke.h", + "agg23/agg_curves.cpp", + "agg23/agg_curves.h", + "agg23/agg_path_storage.cpp", + "agg23/agg_path_storage.h", + "agg23/agg_rasterizer_scanline_aa.cpp", + "agg23/agg_rasterizer_scanline_aa.h", + "agg23/agg_renderer_scanline.h", + "agg23/agg_rendering_buffer.h", + "agg23/agg_scanline_u.h", + "agg23/agg_vcgen_dash.cpp", + "agg23/agg_vcgen_stroke.cpp", + ] + deps = [ + "..:fxcrt", + ] + } +} + +config("fx_lcms2_warnings") { + visibility = [ ":*" ] + if (is_clang) { + cflags = [ + # cmslut.cc is sloppy with aggregate initialization. Version 2.7 of this + # library doesn't appear to have this problem. + "-Wno-missing-braces", + + # FindPrev() in cmsplugin.c is unused. + "-Wno-unused-function", + ] + } +} + +static_library("fx_lcms2") { + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":pdfium_third_party_config", + + # Must be after no_chromium_code for warning flags to be ordered correctly. + ":fx_lcms2_warnings", + ] + sources = [ + "lcms2-2.6/include/lcms2.h", + "lcms2-2.6/include/lcms2_plugin.h", + "lcms2-2.6/src/cmscam02.c", + "lcms2-2.6/src/cmscgats.c", + "lcms2-2.6/src/cmscnvrt.c", + "lcms2-2.6/src/cmserr.c", + "lcms2-2.6/src/cmsgamma.c", + "lcms2-2.6/src/cmsgmt.c", + "lcms2-2.6/src/cmshalf.c", + "lcms2-2.6/src/cmsintrp.c", + "lcms2-2.6/src/cmsio0.c", + "lcms2-2.6/src/cmsio1.c", + "lcms2-2.6/src/cmslut.c", + "lcms2-2.6/src/cmsmd5.c", + "lcms2-2.6/src/cmsmtrx.c", + "lcms2-2.6/src/cmsnamed.c", + "lcms2-2.6/src/cmsopt.c", + "lcms2-2.6/src/cmspack.c", + "lcms2-2.6/src/cmspcs.c", + "lcms2-2.6/src/cmsplugin.c", + "lcms2-2.6/src/cmsps2.c", + "lcms2-2.6/src/cmssamp.c", + "lcms2-2.6/src/cmssm.c", + "lcms2-2.6/src/cmstypes.c", + "lcms2-2.6/src/cmsvirt.c", + "lcms2-2.6/src/cmswtpnt.c", + "lcms2-2.6/src/cmsxform.c", + ] +} + +# This is only used for standalone builds. +config("jpeg_warnings") { + visibility = [ ":*" ] + if (is_clang) { + cflags = [ "-Wno-shift-negative-value" ] + } +} + +static_library("jpeg") { + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":pdfium_third_party_config", + + # Must be after no_chromium_code for warning flags to be ordered correctly. + ":jpeg_warnings", + ] + sources = [ + "libjpeg/cderror.h", + "libjpeg/cdjpeg.h", + "libjpeg/fpdfapi_jcapimin.c", + "libjpeg/fpdfapi_jcapistd.c", + "libjpeg/fpdfapi_jccoefct.c", + "libjpeg/fpdfapi_jccolor.c", + "libjpeg/fpdfapi_jcdctmgr.c", + "libjpeg/fpdfapi_jchuff.c", + "libjpeg/fpdfapi_jcinit.c", + "libjpeg/fpdfapi_jcmainct.c", + "libjpeg/fpdfapi_jcmarker.c", + "libjpeg/fpdfapi_jcmaster.c", + "libjpeg/fpdfapi_jcomapi.c", + "libjpeg/fpdfapi_jcparam.c", + "libjpeg/fpdfapi_jcphuff.c", + "libjpeg/fpdfapi_jcprepct.c", + "libjpeg/fpdfapi_jcsample.c", + "libjpeg/fpdfapi_jctrans.c", + "libjpeg/fpdfapi_jdapimin.c", + "libjpeg/fpdfapi_jdapistd.c", + "libjpeg/fpdfapi_jdcoefct.c", + "libjpeg/fpdfapi_jdcolor.c", + "libjpeg/fpdfapi_jddctmgr.c", + "libjpeg/fpdfapi_jdhuff.c", + "libjpeg/fpdfapi_jdinput.c", + "libjpeg/fpdfapi_jdmainct.c", + "libjpeg/fpdfapi_jdmarker.c", + "libjpeg/fpdfapi_jdmaster.c", + "libjpeg/fpdfapi_jdmerge.c", + "libjpeg/fpdfapi_jdphuff.c", + "libjpeg/fpdfapi_jdpostct.c", + "libjpeg/fpdfapi_jdsample.c", + "libjpeg/fpdfapi_jdtrans.c", + "libjpeg/fpdfapi_jerror.c", + "libjpeg/fpdfapi_jfdctfst.c", + "libjpeg/fpdfapi_jfdctint.c", + "libjpeg/fpdfapi_jidctfst.c", + "libjpeg/fpdfapi_jidctint.c", + "libjpeg/fpdfapi_jidctred.c", + "libjpeg/fpdfapi_jmemmgr.c", + "libjpeg/fpdfapi_jmemnobs.c", + "libjpeg/fpdfapi_jutils.c", + "libjpeg/jchuff.h", + "libjpeg/jconfig.h", + "libjpeg/jdct.h", + "libjpeg/jdhuff.h", + "libjpeg/jerror.h", + "libjpeg/jinclude.h", + "libjpeg/jmemsys.h", + "libjpeg/jmorecfg.h", + "libjpeg/jpegint.h", + "libjpeg/jpeglib.h", + "libjpeg/jversion.h", + "libjpeg/makefile", + "libjpeg/transupp.h", + ] + deps = [ + "..:fxcrt", + ] +} + +config("fx_libopenjpeg_warnings") { + visibility = [ ":*" ] + if (is_win) { + cflags = [ + # Signed/unsigned comparisons. + "/wd4018", + ] + } +} + +static_library("fx_libopenjpeg") { + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":pdfium_third_party_config", + + # Must be after no_chromium_code for warning flags to be ordered correctly. + ":fx_libopenjpeg_warnings", + ] + sources = [ + "libopenjpeg20/bio.c", + "libopenjpeg20/cio.c", + "libopenjpeg20/dwt.c", + "libopenjpeg20/event.c", + "libopenjpeg20/function_list.c", + "libopenjpeg20/image.c", + "libopenjpeg20/invert.c", + "libopenjpeg20/j2k.c", + "libopenjpeg20/jp2.c", + "libopenjpeg20/mct.c", + "libopenjpeg20/mqc.c", + "libopenjpeg20/openjpeg.c", + "libopenjpeg20/opj_clock.c", + "libopenjpeg20/pi.c", + "libopenjpeg20/raw.c", + "libopenjpeg20/t1.c", + "libopenjpeg20/t2.c", + "libopenjpeg20/tcd.c", + "libopenjpeg20/tgt.c", + ] +} + +static_library("fx_lpng") { + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":pdfium_third_party_config", + ] + sources = [ + "libpng16/png.c", + "libpng16/png.h", + "libpng16/pngconf.h", + "libpng16/pngdebug.h", + "libpng16/pngerror.c", + "libpng16/pngget.c", + "libpng16/pnginfo.h", + "libpng16/pnglibconf.h", + "libpng16/pngmem.c", + "libpng16/pngpread.c", + "libpng16/pngprefix.h", + "libpng16/pngpriv.h", + "libpng16/pngread.c", + "libpng16/pngrio.c", + "libpng16/pngrtran.c", + "libpng16/pngrutil.c", + "libpng16/pngset.c", + "libpng16/pngstruct.h", + "libpng16/pngtrans.c", + "libpng16/pngwio.c", + "libpng16/pngwrite.c", + "libpng16/pngwtran.c", + "libpng16/pngwutil.c", + ] + + defines = [] + cflags = [] + + if (current_cpu == "x86" || current_cpu == "x64") { + sources += [ + "libpng16/contrib/intel/filter_sse2_intrinsics.c", + "libpng16/contrib/intel/intel_init.c", + ] + defines += [ "PNG_INTEL_SSE_OPT=1" ] + } else if ((current_cpu == "arm" || current_cpu == "arm64") && arm_use_neon) { + sources += [ + "libpng16/arm/arm_init.c", + "libpng16/arm/filter_neon_intrinsics.c", + ] + defines += [ + "PNG_ARM_NEON_OPT=2", + "PNG_ARM_NEON_IMPLEMENTATION=1", + ] + } + + if (is_win) { + # Unary minus applied to unsigned type. + cflags += [ "/wd4146" ] + } +} + +if (pdf_enable_xfa) { + static_library("fx_tiff") { + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":pdfium_third_party_config", + ] + if (is_win) { + # Need to undefine the macro since it is redefined in + # tif_ojpeg.c and tif_jpeg.c. + configs -= [ "//build/config/win:lean_and_mean" ] + } + deps = [ + "//third_party:jpeg", + ] + sources = [ + "libtiff/tif_aux.c", + "libtiff/tif_close.c", + "libtiff/tif_codec.c", + "libtiff/tif_color.c", + "libtiff/tif_compress.c", + "libtiff/tif_dir.c", + "libtiff/tif_dirinfo.c", + "libtiff/tif_dirread.c", + "libtiff/tif_dirwrite.c", + "libtiff/tif_dumpmode.c", + "libtiff/tif_error.c", + "libtiff/tif_extension.c", + "libtiff/tif_fax3.c", + "libtiff/tif_fax3sm.c", + "libtiff/tif_flush.c", + "libtiff/tif_getimage.c", + "libtiff/tif_jpeg.c", + "libtiff/tif_luv.c", + "libtiff/tif_lzw.c", + "libtiff/tif_next.c", + "libtiff/tif_ojpeg.c", + "libtiff/tif_open.c", + "libtiff/tif_packbits.c", + "libtiff/tif_pixarlog.c", + "libtiff/tif_predict.c", + "libtiff/tif_print.c", + "libtiff/tif_read.c", + "libtiff/tif_strip.c", + "libtiff/tif_swab.c", + "libtiff/tif_thunder.c", + "libtiff/tif_tile.c", + "libtiff/tif_version.c", + "libtiff/tif_warning.c", + "libtiff/tif_write.c", + "libtiff/tif_zip.c", + "libtiff/tiffiop.h", + "libtiff/tiffvers.h", + ] + } +} + +# TODO(dsinclair): Remove if fixed upstream. https://crbug.com/507712 +config("fx_zlib_warnings") { + visibility = [ ":*" ] + if (is_clang) { + cflags = [ "-Wno-shift-negative-value" ] + } +} + +static_library("fx_zlib") { + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":pdfium_third_party_config", + + # Must be after no_chromium_code for warning flags to be ordered correctly. + ":fx_zlib_warnings", + ] + sources = [ + "zlib_v128/adler32.c", + "zlib_v128/compress.c", + "zlib_v128/crc32.c", + "zlib_v128/deflate.c", + "zlib_v128/gzclose.c", + "zlib_v128/gzlib.c", + "zlib_v128/gzread.c", + "zlib_v128/gzwrite.c", + "zlib_v128/infback.c", + "zlib_v128/inffast.c", + "zlib_v128/inflate.c", + "zlib_v128/inftrees.c", + "zlib_v128/trees.c", + "zlib_v128/uncompr.c", + "zlib_v128/zutil.c", + ] +} + +# Can not be a static library due to lack of .cc files. +source_set("pdfium_base") { + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":pdfium_third_party_config", + ] + sources = [ + "base/logging.h", + "base/macros.h", + "base/numerics/safe_conversions.h", + "base/numerics/safe_conversions_impl.h", + "base/numerics/safe_math.h", + "base/numerics/safe_math_impl.h", + "base/ptr_util.h", + "base/stl_util.h", + ] +} diff --git a/modules/pdfium/pdfium/third_party/DEPS b/modules/pdfium/pdfium/third_party/DEPS new file mode 100644 index 000000000000..c2a3adde7b81 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/DEPS @@ -0,0 +1,7 @@ +include_rules = [ + # A lot of third_party code has been modified to use fxcrt. + '+core/fxcrt/fx_basic.h', + '+core/fxcrt/fx_coordinates.h', + '+core/fxcrt/fx_memory.h', + '+core/fxcrt/fx_system.h', +] diff --git a/modules/pdfium/pdfium/third_party/agg23/0000-bug-466.patch b/modules/pdfium/pdfium/third_party/agg23/0000-bug-466.patch new file mode 100644 index 000000000000..3217b3838a9f --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/0000-bug-466.patch @@ -0,0 +1,45 @@ +diff --git a/third_party/agg23/agg_math_stroke.h b/third_party/agg23/agg_math_stroke.h +index 6d7ba8a..2b06b1b 100644 +--- a/third_party/agg23/agg_math_stroke.h ++++ b/third_party/agg23/agg_math_stroke.h +@@ -60,28 +60,30 @@ void stroke_calc_arc(VertexConsumer& out_vertices, + } + da = FXSYS_acos(width / (width + ((1.0f / 8) / approximation_scale))) * 2; + out_vertices.add(coord_type(x + dx1, y + dy1)); +- if(!ccw) { +- if(a1 > a2) { +- a2 += 2 * FX_PI; ++ if (da > 0) { ++ if (!ccw) { ++ if (a1 > a2) { ++ a2 += 2 * FX_PI; + } + a2 -= da / 4; + a1 += da; +- while(a1 < a2) { ++ while (a1 < a2) { + out_vertices.add(coord_type(x + (width * FXSYS_cos(a1)), + y + (width * FXSYS_sin(a1)))); +- a1 += da; ++ a1 += da; + } +- } else { +- if(a1 < a2) { +- a2 -= 2 * FX_PI; ++ } else { ++ if (a1 < a2) { ++ a2 -= 2 * FX_PI; + } + a2 += da / 4; + a1 -= da; +- while(a1 > a2) { ++ while (a1 > a2) { + out_vertices.add(coord_type(x + (width * FXSYS_cos(a1)), + y + (width * FXSYS_sin(a1)))); +- a1 -= da; ++ a1 -= da; + } ++ } + } + out_vertices.add(coord_type(x + dx2, y + dy2)); + } diff --git a/modules/pdfium/pdfium/third_party/agg23/0001-gcc-warning.patch b/modules/pdfium/pdfium/third_party/agg23/0001-gcc-warning.patch new file mode 100644 index 000000000000..759696ef0349 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/0001-gcc-warning.patch @@ -0,0 +1,17 @@ +diff --git a/third_party/agg23/agg_path_storage.h b/third_party/agg23/agg_path_storage.h +index dc13851..7f21bac 100644 +--- a/third_party/agg23/agg_path_storage.h ++++ b/third_party/agg23/agg_path_storage.h +@@ -38,9 +38,9 @@ public: + } + unsigned vertex(FX_FLOAT* x, FX_FLOAT* y) + { +- return (m_vertex_idx < m_path->total_vertices()) ? +- m_path->vertex(m_vertex_idx++, x, y) : +- path_cmd_stop; ++ return (m_vertex_idx < m_path->total_vertices()) ++ ? m_path->vertex(m_vertex_idx++, x, y) ++ : static_cast(path_cmd_stop); + } + private: + const path_storage* m_path; diff --git a/modules/pdfium/pdfium/third_party/agg23/0002-ubsan-error-fixes.patch b/modules/pdfium/pdfium/third_party/agg23/0002-ubsan-error-fixes.patch new file mode 100644 index 000000000000..00ced0071cdc --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/0002-ubsan-error-fixes.patch @@ -0,0 +1,33 @@ +diff --git a/third_party/agg23/agg_clip_liang_barsky.h b/third_party/agg23/agg_clip_liang_barsky.h +index db6ca97..5b1261f 100644 +--- a/third_party/agg23/agg_clip_liang_barsky.h ++++ b/third_party/agg23/agg_clip_liang_barsky.h +@@ -20,6 +20,7 @@ + #ifndef AGG_CLIP_LIANG_BARSKY_INCLUDED + #define AGG_CLIP_LIANG_BARSKY_INCLUDED + #include "agg_basics.h" ++#include "third_party/base/numerics/safe_math.h" + namespace agg + { + template +@@ -36,8 +37,18 @@ inline unsigned clip_liang_barsky(T x1, T y1, T x2, T y2, + T* x, T* y) + { + const FX_FLOAT nearzero = 1e-30f; +- FX_FLOAT deltax = (FX_FLOAT)(x2 - x1); +- FX_FLOAT deltay = (FX_FLOAT)(y2 - y1); ++ ++ pdfium::base::CheckedNumeric width = x2; ++ width -= x1; ++ if (!width.IsValid()) ++ return 0; ++ pdfium::base::CheckedNumeric height = y2; ++ height -= y1; ++ if (!height.IsValid()) ++ return 0; ++ ++ FX_FLOAT deltax = width.ValueOrDefault(0); ++ FX_FLOAT deltay = height.ValueOrDefault(0); + unsigned np = 0; + if(deltax == 0) { + deltax = (x1 > clip_box.x1) ? -nearzero : nearzero; diff --git a/modules/pdfium/pdfium/third_party/agg23/0003-ubsan-render-line-error.patch b/modules/pdfium/pdfium/third_party/agg23/0003-ubsan-render-line-error.patch new file mode 100644 index 000000000000..7bd3b70424d7 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/0003-ubsan-render-line-error.patch @@ -0,0 +1,73 @@ +diff --git a/third_party/agg23/agg_rasterizer_scanline_aa.cpp b/third_party/agg23/agg_rasterizer_scanline_aa.cpp +index 46379f6..c6b3f01 100644 +--- a/third_party/agg23/agg_rasterizer_scanline_aa.cpp ++++ b/third_party/agg23/agg_rasterizer_scanline_aa.cpp +@@ -48,6 +48,7 @@ + //---------------------------------------------------------------------------- + #include + #include "agg_rasterizer_scanline_aa.h" ++#include "third_party/base/numerics/safe_math.h" + namespace agg + { + AGG_INLINE void cell_aa::set_cover(int c, int a) +@@ -237,7 +238,7 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2) + int fy1 = y1 & poly_base_mask; + int fy2 = y2 & poly_base_mask; + int x_from, x_to; +- int p, rem, mod, lift, delta, first, incr; ++ int rem, mod, lift, delta, first, incr; + if(ey1 == ey2) { + render_hline(ey1, x1, fy1, x2, fy2); + return; +@@ -268,16 +269,22 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2) + m_cur_cell.add_cover(delta, two_fx * delta); + return; + } +- p = (poly_base_size - fy1) * dx; ++ pdfium::base::CheckedNumeric safeP = poly_base_size - fy1; ++ safeP *= dx; ++ if (!safeP.IsValid()) ++ return; + first = poly_base_size; + if(dy < 0) { +- p = fy1 * dx; +- first = 0; +- incr = -1; +- dy = -dy; ++ safeP = fy1; ++ safeP *= dx; ++ if (!safeP.IsValid()) ++ return; ++ first = 0; ++ incr = -1; ++ dy = -dy; + } +- delta = p / dy; +- mod = p % dy; ++ delta = safeP.ValueOrDie() / dy; ++ mod = safeP.ValueOrDie() % dy; + if(mod < 0) { + delta--; + mod += dy; +@@ -287,12 +294,15 @@ void outline_aa::render_line(int x1, int y1, int x2, int y2) + ey1 += incr; + set_cur_cell(x_from >> poly_base_shift, ey1); + if(ey1 != ey2) { +- p = poly_base_size * dx; +- lift = p / dy; +- rem = p % dy; +- if(rem < 0) { +- lift--; +- rem += dy; ++ safeP = static_cast(poly_base_size); ++ safeP *= dx; ++ if (!safeP.IsValid()) ++ return; ++ lift = safeP.ValueOrDie() / dy; ++ rem = safeP.ValueOrDie() % dy; ++ if (rem < 0) { ++ lift--; ++ rem += dy; + } + mod -= dy; + while(ey1 != ey2) { diff --git a/modules/pdfium/pdfium/third_party/agg23/README.pdfium b/modules/pdfium/pdfium/third_party/agg23/README.pdfium new file mode 100644 index 000000000000..4b1ff4914630 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/README.pdfium @@ -0,0 +1,18 @@ +Name: Anti-Grain Geometry +URL: https://sourceforge.net/projects/agg/ +Version: 2.3 +Security Critical: yes +License: MIT + +Description: +2D vector graphics library. + +Local Modifications: + +0000-bug-466.patch: Fixes an infinite loop in stroke_calc_arc(). +Various changes to use FX_ library functions. +Possibly more? +0001-gcc-warning.patch: Fix a GCC warning about both enumeral and +non-enumeral type in conditional. +0002-ubsan-error-fixes.path: Fix UBSan errors for overflows. +0003-ubsan-render-line-error.patch: Fix UBSan overflow error in render_line. diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_array.h b/modules/pdfium/pdfium/third_party/agg23/agg_array.h new file mode 100644 index 000000000000..204ae2e7a217 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_array.h @@ -0,0 +1,509 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +#ifndef AGG_ARRAY_INCLUDED +#define AGG_ARRAY_INCLUDED + +#include "agg_basics.h" +#include "core/fxcrt/fx_memory.h" // For FXSYS_* macros. + +namespace agg +{ +template +class pod_array { +public: + typedef T value_type; + ~pod_array() + { + FX_Free(m_array); + } + pod_array() : m_size(0), m_capacity(0), m_array(0) {} + pod_array(unsigned cap, unsigned extra_tail = 0); + pod_array(const pod_array&); + const pod_array& operator = (const pod_array&); + void capacity(unsigned cap, unsigned extra_tail = 0); + unsigned capacity() const + { + return m_capacity; + } + void allocate(unsigned size, unsigned extra_tail = 0); + void resize(unsigned new_size); + void zero() + { + FXSYS_memset(m_array, 0, sizeof(T) * m_size); + } + void add(const T& v) + { + m_array[m_size++] = v; + } + void inc_size(unsigned size) + { + m_size += size; + } + unsigned size() const + { + return m_size; + } + unsigned byte_size() const + { + return m_size * sizeof(T); + } + const T& operator [] (unsigned i) const + { + return m_array[i]; + } + T& operator [] (unsigned i) + { + return m_array[i]; + } + const T& at(unsigned i) const + { + return m_array[i]; + } + T& at(unsigned i) + { + return m_array[i]; + } + T value_at(unsigned i) const + { + return m_array[i]; + } + const T* data() const + { + return m_array; + } + T* data() + { + return m_array; + } + void remove_all() + { + m_size = 0; + } + void cut_at(unsigned num) + { + if(num < m_size) { + m_size = num; + } + } +private: + unsigned m_size; + unsigned m_capacity; + T* m_array; +}; +template +void pod_array::capacity(unsigned cap, unsigned extra_tail) +{ + m_size = 0; + unsigned full_cap = cap + extra_tail; + if(full_cap < cap) { + FX_Free(m_array); + m_array = 0; + m_capacity = 0; + } else if(full_cap > m_capacity) { + FX_Free(m_array); + m_array = FX_Alloc(T, full_cap); + m_capacity = full_cap; + } +} +template +void pod_array::allocate(unsigned size, unsigned extra_tail) +{ + capacity(size, extra_tail); + m_size = size; +} +template +void pod_array::resize(unsigned new_size) +{ + if(new_size > m_size) { + if(new_size > m_capacity) { + T* data = FX_Alloc(T, new_size); + FXSYS_memcpy(data, m_array, m_size * sizeof(T)); + FX_Free(m_array); + m_array = data; + } + } else { + m_size = new_size; + } +} +template pod_array::pod_array(unsigned cap, unsigned extra_tail) : + m_size(0), m_capacity(cap + extra_tail), m_array(FX_Alloc(T, m_capacity)) {} +template pod_array::pod_array(const pod_array& v) : + m_size(v.m_size), + m_capacity(v.m_capacity), + m_array(v.m_capacity ? FX_Alloc(T, v.m_capacity) : 0) +{ + FXSYS_memcpy(m_array, v.m_array, sizeof(T) * v.m_size); +} +template const pod_array& +pod_array::operator = (const pod_array&v) +{ + allocate(v.m_size); + if(v.m_size) { + FXSYS_memcpy(m_array, v.m_array, sizeof(T) * v.m_size); + } + return *this; +} +template class pod_deque +{ +public: + enum block_scale_e { + block_shift = S, + block_size = 1 << block_shift, + block_mask = block_size - 1 + }; + typedef T value_type; + ~pod_deque(); + pod_deque(); + pod_deque(unsigned block_ptr_inc); + pod_deque(const pod_deque& v); + const pod_deque& operator = (const pod_deque& v); + void remove_all() + { + m_size = 0; + } + void free_all() + { + free_tail(0); + } + void free_tail(unsigned size); + void add(const T& val); + void modify_last(const T& val); + void remove_last(); + int allocate_continuous_block(unsigned num_elements); + void add_array(const T* ptr, unsigned num_elem) + { + while(num_elem--) { + add(*ptr++); + } + } + template void add_data(DataAccessor& data) + { + while(data.size()) { + add(*data); + ++data; + } + } + void cut_at(unsigned size) + { + if(size < m_size) { + m_size = size; + } + } + unsigned size() const + { + return m_size; + } + const T& operator [] (unsigned i) const + { + return m_blocks[i >> block_shift][i & block_mask]; + } + T& operator [] (unsigned i) + { + return m_blocks[i >> block_shift][i & block_mask]; + } + const T& at(unsigned i) const + { + return m_blocks[i >> block_shift][i & block_mask]; + } + T& at(unsigned i) + { + return m_blocks[i >> block_shift][i & block_mask]; + } + T value_at(unsigned i) const + { + return m_blocks[i >> block_shift][i & block_mask]; + } + const T& curr(unsigned idx) const + { + return (*this)[idx]; + } + T& curr(unsigned idx) + { + return (*this)[idx]; + } + const T& prev(unsigned idx) const + { + return (*this)[(idx + m_size - 1) % m_size]; + } + T& prev(unsigned idx) + { + return (*this)[(idx + m_size - 1) % m_size]; + } + const T& next(unsigned idx) const + { + return (*this)[(idx + 1) % m_size]; + } + T& next(unsigned idx) + { + return (*this)[(idx + 1) % m_size]; + } + const T& last() const + { + return (*this)[m_size - 1]; + } + T& last() + { + return (*this)[m_size - 1]; + } + unsigned byte_size() const; + const T* block(unsigned nb) const + { + return m_blocks[nb]; + } +public: + void allocate_block(unsigned nb); + T* data_ptr(); + unsigned m_size; + unsigned m_num_blocks; + unsigned m_max_blocks; + T** m_blocks; + unsigned m_block_ptr_inc; +}; +template pod_deque::~pod_deque() +{ + if(m_num_blocks) { + T** blk = m_blocks + m_num_blocks - 1; + while(m_num_blocks--) { + FX_Free(*blk); + --blk; + } + FX_Free(m_blocks); + } +} +template +void pod_deque::free_tail(unsigned size) +{ + if(size < m_size) { + unsigned nb = (size + block_mask) >> block_shift; + while(m_num_blocks > nb) { + FX_Free(m_blocks[--m_num_blocks]); + } + m_size = size; + } +} +template pod_deque::pod_deque() : + m_size(0), + m_num_blocks(0), + m_max_blocks(0), + m_blocks(0), + m_block_ptr_inc(block_size) +{ +} +template +pod_deque::pod_deque(unsigned block_ptr_inc) : + m_size(0), + m_num_blocks(0), + m_max_blocks(0), + m_blocks(0), + m_block_ptr_inc(block_ptr_inc) +{ +} +template +pod_deque::pod_deque(const pod_deque& v) : + m_size(v.m_size), + m_num_blocks(v.m_num_blocks), + m_max_blocks(v.m_max_blocks), + m_blocks(v.m_max_blocks ? FX_Alloc(T*, v.m_max_blocks) : 0), + m_block_ptr_inc(v.m_block_ptr_inc) +{ + unsigned i; + for(i = 0; i < v.m_num_blocks; ++i) { + m_blocks[i] = FX_Alloc(T, block_size); + FXSYS_memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T)); + } +} +template +const pod_deque& pod_deque::operator = (const pod_deque& v) +{ + unsigned i; + for(i = m_num_blocks; i < v.m_num_blocks; ++i) { + allocate_block(i); + } + for(i = 0; i < v.m_num_blocks; ++i) { + FXSYS_memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T)); + } + m_size = v.m_size; + return *this; +} +template +void pod_deque::allocate_block(unsigned nb) +{ + if(nb >= m_max_blocks) { + T** new_blocks = FX_Alloc(T*, m_max_blocks + m_block_ptr_inc); + if(m_blocks) { + FXSYS_memcpy(new_blocks, + m_blocks, + m_num_blocks * sizeof(T*)); + FX_Free(m_blocks); + } + m_blocks = new_blocks; + m_max_blocks += m_block_ptr_inc; + } + m_blocks[nb] = FX_Alloc(T, block_size); + m_num_blocks++; +} +template +inline T* pod_deque::data_ptr() +{ + unsigned nb = m_size >> block_shift; + if(nb >= m_num_blocks) { + allocate_block(nb); + } + return m_blocks[nb] + (m_size & block_mask); +} +template +inline void pod_deque::add(const T& val) +{ + *data_ptr() = val; + ++m_size; +} +template +inline void pod_deque::remove_last() +{ + if(m_size) { + --m_size; + } +} +template +void pod_deque::modify_last(const T& val) +{ + remove_last(); + add(val); +} +template +int pod_deque::allocate_continuous_block(unsigned num_elements) +{ + if(num_elements < block_size) { + data_ptr(); + unsigned rest = block_size - (m_size & block_mask); + unsigned index; + if(num_elements <= rest) { + index = m_size; + m_size += num_elements; + return index; + } + m_size += rest; + data_ptr(); + index = m_size; + m_size += num_elements; + return index; + } + return -1; +} +template +unsigned pod_deque::byte_size() const +{ + return m_size * sizeof(T); +} +class pod_allocator +{ +public: + void remove_all() + { + if(m_num_blocks) { + int8u** blk = m_blocks + m_num_blocks - 1; + while(m_num_blocks--) { + FX_Free(*blk); + --blk; + } + FX_Free(m_blocks); + } + m_num_blocks = 0; + m_max_blocks = 0; + m_blocks = 0; + m_buf_ptr = 0; + m_rest = 0; + } + ~pod_allocator() + { + remove_all(); + } + pod_allocator(unsigned block_size, unsigned block_ptr_inc = 256 - 8) : + m_block_size(block_size), + m_block_ptr_inc(block_ptr_inc), + m_num_blocks(0), + m_max_blocks(0), + m_blocks(0), + m_buf_ptr(0), + m_rest(0) + { + } + int8u* allocate(unsigned size, unsigned alignment = 1) + { + if(size == 0) { + return 0; + } + if(size <= m_rest) { + int8u* ptr = m_buf_ptr; + if(alignment > 1) { + unsigned align = (alignment - unsigned((size_t)ptr) % alignment) % alignment; + size += align; + ptr += align; + if(size <= m_rest) { + m_rest -= size; + m_buf_ptr += size; + return ptr; + } + allocate_block(size); + return allocate(size - align, alignment); + } + m_rest -= size; + m_buf_ptr += size; + return ptr; + } + allocate_block(size + alignment - 1); + return allocate(size, alignment); + } +private: + void allocate_block(unsigned size) + { + if(size < m_block_size) { + size = m_block_size; + } + if(m_num_blocks >= m_max_blocks) { + int8u** new_blocks = FX_Alloc(int8u*, m_max_blocks + m_block_ptr_inc); + if(m_blocks) { + FXSYS_memcpy(new_blocks, + m_blocks, + m_num_blocks * sizeof(int8u*)); + FX_Free(m_blocks); + } + m_blocks = new_blocks; + m_max_blocks += m_block_ptr_inc; + } + m_blocks[m_num_blocks] = m_buf_ptr = FX_Alloc(int8u, size); + m_num_blocks++; + m_rest = size; + } + unsigned m_block_size; + unsigned m_block_ptr_inc; + unsigned m_num_blocks; + unsigned m_max_blocks; + int8u** m_blocks; + int8u* m_buf_ptr; + unsigned m_rest; +}; +enum quick_sort_threshold_e { + quick_sort_threshold = 9 +}; +template inline void swap_elements(T& a, T& b) +{ + T temp = a; + a = b; + b = temp; +} +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_basics.h b/modules/pdfium/pdfium/third_party/agg23/agg_basics.h new file mode 100644 index 000000000000..52a658ec96ff --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_basics.h @@ -0,0 +1,285 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +#ifndef AGG_BASICS_INCLUDED +#define AGG_BASICS_INCLUDED +#ifndef AGG_INT8 +#define AGG_INT8 signed char +#endif +#ifndef AGG_INT8U +#define AGG_INT8U unsigned char +#endif +#ifndef AGG_INT16 +#define AGG_INT16 short +#endif +#ifndef AGG_INT16U +#define AGG_INT16U unsigned short +#endif +#ifndef AGG_INT32 +#define AGG_INT32 int +#endif +#ifndef AGG_INT32U +#define AGG_INT32U unsigned +#endif +#ifndef AGG_INT64 +#define AGG_INT64 signed long long +#endif +#ifndef AGG_INT64U +#define AGG_INT64U unsigned long long +#endif +#define AGG_INLINE inline + +#include "core/fxcrt/fx_system.h" // For FX_FLOAT + +namespace agg +{ +typedef AGG_INT8 int8; +typedef AGG_INT8U int8u; +typedef AGG_INT16 int16; +typedef AGG_INT16U int16u; +typedef AGG_INT32 int32; +typedef AGG_INT32U int32u; +typedef AGG_INT64 int64; +typedef AGG_INT64U int64u; +typedef unsigned char cover_type; +enum cover_scale_e { + cover_shift = 8, + cover_size = 1 << cover_shift, + cover_mask = cover_size - 1, + cover_none = 0, + cover_full = cover_mask +}; +template struct rect_base { + typedef rect_base self_type; + T x1; + T y1; + T x2; + T y2; + rect_base() {} + rect_base(T x1_, T y1_, T x2_, T y2_) : + x1(x1_), y1(y1_), x2(x2_), y2(y2_) {} + const self_type& normalize() + { + T t; + if(x1 > x2) { + t = x1; + x1 = x2; + x2 = t; + } + if(y1 > y2) { + t = y1; + y1 = y2; + y2 = t; + } + return *this; + } + bool clip(const self_type& r) + { + if(x2 > r.x2) { + x2 = r.x2; + } + if(y2 > r.y2) { + y2 = r.y2; + } + if(x1 < r.x1) { + x1 = r.x1; + } + if(y1 < r.y1) { + y1 = r.y1; + } + return x1 <= x2 && y1 <= y2; + } + bool is_valid() const + { + return x1 <= x2 && y1 <= y2; + } +}; +template +inline Rect intersect_rectangles(const Rect& r1, const Rect& r2) +{ + Rect r = r1; + if(r.x2 > r2.x2) { + r.x2 = r2.x2; + } + if(r.y2 > r2.y2) { + r.y2 = r2.y2; + } + if(r.x1 < r2.x1) { + r.x1 = r2.x1; + } + if(r.y1 < r2.y1) { + r.y1 = r2.y1; + } + return r; +} +template +inline Rect unite_rectangles(const Rect& r1, const Rect& r2) +{ + Rect r = r1; + if(r.x2 < r2.x2) { + r.x2 = r2.x2; + } + if(r.y2 < r2.y2) { + r.y2 = r2.y2; + } + if(r.x1 > r2.x1) { + r.x1 = r2.x1; + } + if(r.y1 > r2.y1) { + r.y1 = r2.y1; + } + return r; +} +typedef rect_base rect; +typedef rect_base rect_d; +enum path_commands_e { + path_cmd_stop = 0, + path_cmd_move_to = 1, + path_cmd_line_to = 2, + path_cmd_curve3 = 3, + path_cmd_curve4 = 4, + path_cmd_curveN = 5, + path_cmd_catrom = 6, + path_cmd_ubspline = 7, + path_cmd_end_poly = 0x0F, + path_cmd_mask = 0x0F +}; +enum path_flags_e { + path_flags_none = 0, + path_flags_ccw = 0x10, + path_flags_cw = 0x20, + path_flags_close = 0x40, + path_flags_jr = 0x80, + path_flags_mask = 0xF0 +}; +inline bool is_vertex(unsigned c) +{ + c &= ~path_flags_jr; + return c >= path_cmd_move_to && c < path_cmd_end_poly; +} +inline bool is_drawing(unsigned c) +{ + c &= ~path_flags_jr; + return c >= path_cmd_line_to && c < path_cmd_end_poly; +} +inline bool is_stop(unsigned c) +{ + c &= ~path_flags_jr; + return c == path_cmd_stop; +} +inline bool is_move_to(unsigned c) +{ + c &= ~path_flags_jr; + return c == path_cmd_move_to; +} +inline bool is_line_to(unsigned c) +{ + c &= ~path_flags_jr; + return c == path_cmd_line_to; +} +inline bool is_curve(unsigned c) +{ + c &= ~path_flags_jr; + return c == path_cmd_curve3 || c == path_cmd_curve4; +} +inline bool is_curve3(unsigned c) +{ + c &= ~path_flags_jr; + return c == path_cmd_curve3; +} +inline bool is_curve4(unsigned c) +{ + c &= ~path_flags_jr; + return c == path_cmd_curve4; +} +inline bool is_end_poly(unsigned c) +{ + c &= ~path_flags_jr; + return (c & path_cmd_mask) == path_cmd_end_poly; +} +inline bool is_close(unsigned c) +{ + c &= ~path_flags_jr; + return (c & ~(path_flags_cw | path_flags_ccw)) == + (path_cmd_end_poly | path_flags_close); +} +inline bool is_next_poly(unsigned c) +{ + c &= ~path_flags_jr; + return is_stop(c) || is_move_to(c) || is_end_poly(c); +} +inline bool is_cw(unsigned c) +{ + c &= ~path_flags_jr; + return (c & path_flags_cw) != 0; +} +inline bool is_ccw(unsigned c) +{ + c &= ~path_flags_jr; + return (c & path_flags_ccw) != 0; +} +inline bool is_oriented(unsigned c) +{ + c &= ~path_flags_jr; + return (c & (path_flags_cw | path_flags_ccw)) != 0; +} +inline bool is_closed(unsigned c) +{ + c &= ~path_flags_jr; + return (c & path_flags_close) != 0; +} +inline unsigned get_close_flag(unsigned c) +{ + c &= ~path_flags_jr; + return c & path_flags_close; +} +inline unsigned clear_orientation(unsigned c) +{ + c &= ~path_flags_jr; + return c & ~(path_flags_cw | path_flags_ccw); +} +inline unsigned get_orientation(unsigned c) +{ + c &= ~path_flags_jr; + return c & (path_flags_cw | path_flags_ccw); +} +inline unsigned set_orientation(unsigned c, unsigned o) +{ + c &= ~path_flags_jr; + return clear_orientation(c) | o; +} +struct point_type { + FX_FLOAT x, y; + unsigned flag; + point_type() {} + point_type(FX_FLOAT x_, FX_FLOAT y_, unsigned flag_ = 0) : x(x_), y(y_), flag(flag_) {} +}; +struct point_type_flag : public point_type { + unsigned flag; + point_type_flag() + { + flag = 0; + } + point_type_flag(FX_FLOAT x_, FX_FLOAT y_, unsigned flag_ = 0) : point_type(x_, y_), flag(flag_) {} +}; +struct vertex_type { + FX_FLOAT x, y; + unsigned cmd; + vertex_type() {} + vertex_type(FX_FLOAT x_, FX_FLOAT y_, unsigned cmd_) : + x(x_), y(y_), cmd(cmd_) {} +}; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_clip_liang_barsky.h b/modules/pdfium/pdfium/third_party/agg23/agg_clip_liang_barsky.h new file mode 100644 index 000000000000..5b1261f00404 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_clip_liang_barsky.h @@ -0,0 +1,136 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// Liang-Barsky clipping +// +//---------------------------------------------------------------------------- +#ifndef AGG_CLIP_LIANG_BARSKY_INCLUDED +#define AGG_CLIP_LIANG_BARSKY_INCLUDED +#include "agg_basics.h" +#include "third_party/base/numerics/safe_math.h" +namespace agg +{ +template +inline unsigned clipping_flags(T x, T y, const rect_base& clip_box) +{ + return (x > clip_box.x2) | + ((y > clip_box.y2) << 1) | + ((x < clip_box.x1) << 2) | + ((y < clip_box.y1) << 3); +} +template +inline unsigned clip_liang_barsky(T x1, T y1, T x2, T y2, + const rect_base& clip_box, + T* x, T* y) +{ + const FX_FLOAT nearzero = 1e-30f; + + pdfium::base::CheckedNumeric width = x2; + width -= x1; + if (!width.IsValid()) + return 0; + pdfium::base::CheckedNumeric height = y2; + height -= y1; + if (!height.IsValid()) + return 0; + + FX_FLOAT deltax = width.ValueOrDefault(0); + FX_FLOAT deltay = height.ValueOrDefault(0); + unsigned np = 0; + if(deltax == 0) { + deltax = (x1 > clip_box.x1) ? -nearzero : nearzero; + } + FX_FLOAT xin, xout; + if(deltax > 0) { + xin = (FX_FLOAT)clip_box.x1; + xout = (FX_FLOAT)clip_box.x2; + } else { + xin = (FX_FLOAT)clip_box.x2; + xout = (FX_FLOAT)clip_box.x1; + } + FX_FLOAT tinx = (xin - x1) / deltax; + if(deltay == 0) { + deltay = (y1 > clip_box.y1) ? -nearzero : nearzero; + } + FX_FLOAT yin, yout; + if(deltay > 0) { + yin = (FX_FLOAT)clip_box.y1; + yout = (FX_FLOAT)clip_box.y2; + } else { + yin = (FX_FLOAT)clip_box.y2; + yout = (FX_FLOAT)clip_box.y1; + } + FX_FLOAT tiny = (yin - y1) / deltay; + FX_FLOAT tin1, tin2; + if (tinx < tiny) { + tin1 = tinx; + tin2 = tiny; + } else { + tin1 = tiny; + tin2 = tinx; + } + if(tin1 <= 1.0f) { + if(0 < tin1) { + *x++ = (T)xin; + *y++ = (T)yin; + ++np; + } + if(tin2 <= 1.0f) { + FX_FLOAT toutx = (xout - x1) / deltax; + FX_FLOAT touty = (yout - y1) / deltay; + FX_FLOAT tout1 = (toutx < touty) ? toutx : touty; + if (tin2 > 0 || tout1 > 0) { + if(tin2 <= tout1) { + if(tin2 > 0) { + if(tinx > tiny) { + *x++ = (T)xin; + *y++ = (T)(y1 + (deltay * tinx)); + } else { + *x++ = (T)(x1 + (deltax * tiny)); + *y++ = (T)yin; + } + ++np; + } + if(tout1 < 1.0f) { + if(toutx < touty) { + *x++ = (T)xout; + *y++ = (T)(y1 + (deltay * toutx)); + } else { + *x++ = (T)(x1 + (deltax * touty)); + *y++ = (T)yout; + } + } else { + *x++ = x2; + *y++ = y2; + } + ++np; + } else { + if(tinx > tiny) { + *x++ = (T)xin; + *y++ = (T)yout; + } else { + *x++ = (T)xout; + *y++ = (T)yin; + } + ++np; + } + } + } + } + return np; +} +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_color_gray.h b/modules/pdfium/pdfium/third_party/agg23/agg_color_gray.h new file mode 100644 index 000000000000..5db7bcaf28fa --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_color_gray.h @@ -0,0 +1,50 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// Adaptation for high precision colors has been sponsored by +// Liberty Technology Systems, Inc., visit http://lib-sys.com +// +// Liberty Technology Systems, Inc. is the provider of +// PostScript and PDF technology for software developers. +// +//---------------------------------------------------------------------------- +// +// color types gray8, gray16 +// +//---------------------------------------------------------------------------- +#ifndef AGG_COLOR_GRAY_INCLUDED +#define AGG_COLOR_GRAY_INCLUDED +#include "agg_basics.h" +namespace agg +{ +struct gray8 { + typedef int8u value_type; + typedef int32u calc_type; + typedef int32 long_type; + enum base_scale_e { + base_shift = 8, + base_size = 1 << base_shift, + base_mask = base_size - 1 + }; + typedef gray8 self_type; + value_type v; + value_type a; + gray8() {} + gray8(unsigned v_, unsigned a_ = base_mask) : + v(int8u(v_)), a(int8u(a_)) {} +}; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_conv_adaptor_vcgen.h b/modules/pdfium/pdfium/third_party/agg23/agg_conv_adaptor_vcgen.h new file mode 100644 index 000000000000..0d8d6ff99e04 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_conv_adaptor_vcgen.h @@ -0,0 +1,138 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +#ifndef AGG_CONV_ADAPTOR_VCGEN_INCLUDED +#define AGG_CONV_ADAPTOR_VCGEN_INCLUDED +#include "agg_basics.h" +namespace agg +{ +struct null_markers { + void remove_all() {} + void add_vertex(FX_FLOAT, FX_FLOAT, unsigned) {} + void prepare_src() {} + void rewind(unsigned) {} + unsigned vertex(FX_FLOAT*, FX_FLOAT*) + { + return path_cmd_stop; + } +}; +template class conv_adaptor_vcgen +{ + enum status { + initial, + accumulate, + generate + }; +public: + conv_adaptor_vcgen(VertexSource& source) : + m_source(&source), + m_status(initial) + {} + void set_source(VertexSource& source) + { + m_source = &source; + } + Generator& generator() + { + return m_generator; + } + const Generator& generator() const + { + return m_generator; + } + Markers& markers() + { + return m_markers; + } + const Markers& markers() const + { + return m_markers; + } + void rewind(unsigned path_id) + { + m_source->rewind(path_id); + m_status = initial; + } + unsigned vertex(FX_FLOAT* x, FX_FLOAT* y); +private: + conv_adaptor_vcgen(const conv_adaptor_vcgen&); + const conv_adaptor_vcgen& + operator = (const conv_adaptor_vcgen&); + VertexSource* m_source; + Generator m_generator; + Markers m_markers; + status m_status; + unsigned m_last_cmd; + FX_FLOAT m_start_x; + FX_FLOAT m_start_y; +}; +template +unsigned conv_adaptor_vcgen::vertex(FX_FLOAT* x, FX_FLOAT* y) +{ + unsigned cmd = path_cmd_stop; + bool done = false; + while(!done) { + switch(m_status) { + case initial: + m_markers.remove_all(); + m_last_cmd = m_source->vertex(&m_start_x, &m_start_y); + m_status = accumulate; + case accumulate: + if(is_stop(m_last_cmd)) { + return path_cmd_stop; + } + m_generator.remove_all(); + m_generator.add_vertex(m_start_x, m_start_y, path_cmd_move_to); + m_markers.add_vertex(m_start_x, m_start_y, path_cmd_move_to); + for(;;) { + cmd = m_source->vertex(x, y); + if(is_vertex(cmd)) { + m_last_cmd = cmd; + if(is_move_to(cmd)) { + m_start_x = *x; + m_start_y = *y; + break; + } + m_generator.add_vertex(*x, *y, cmd); + m_markers.add_vertex(*x, *y, path_cmd_line_to); + } else { + if(is_stop(cmd)) { + m_last_cmd = path_cmd_stop; + break; + } + if(is_end_poly(cmd)) { + m_generator.add_vertex(*x, *y, cmd); + break; + } + } + } + m_generator.rewind(0); + m_status = generate; + case generate: + cmd = m_generator.vertex(x, y); + if(is_stop(cmd)) { + m_status = accumulate; + break; + } + done = true; + break; + } + } + return cmd; +} +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_conv_dash.h b/modules/pdfium/pdfium/third_party/agg23/agg_conv_dash.h new file mode 100644 index 000000000000..63b2019dde94 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_conv_dash.h @@ -0,0 +1,61 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// conv_dash +// +//---------------------------------------------------------------------------- +#ifndef AGG_CONV_DASH_INCLUDED +#define AGG_CONV_DASH_INCLUDED +#include "agg_basics.h" +#include "agg_vcgen_dash.h" +#include "agg_conv_adaptor_vcgen.h" +namespace agg +{ +template +struct conv_dash : public conv_adaptor_vcgen { + typedef Markers marker_type; + typedef conv_adaptor_vcgen base_type; + conv_dash(VertexSource& vs) : + conv_adaptor_vcgen(vs) + { + } + void remove_all_dashes() + { + base_type::generator().remove_all_dashes(); + } + void add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len) + { + base_type::generator().add_dash(dash_len, gap_len); + } + void dash_start(FX_FLOAT ds) + { + base_type::generator().dash_start(ds); + } + void shorten(FX_FLOAT s) + { + base_type::generator().shorten(s); + } + double shorten() const + { + return base_type::generator().shorten(); + } +private: + conv_dash(const conv_dash&); + const conv_dash& + operator = (const conv_dash&); +}; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_conv_stroke.h b/modules/pdfium/pdfium/third_party/agg23/agg_conv_stroke.h new file mode 100644 index 000000000000..5a36bd73bb8b --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_conv_stroke.h @@ -0,0 +1,110 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// conv_stroke +// +//---------------------------------------------------------------------------- +#ifndef AGG_CONV_STROKE_INCLUDED +#define AGG_CONV_STROKE_INCLUDED +#include "agg_basics.h" +#include "agg_vcgen_stroke.h" +#include "agg_conv_adaptor_vcgen.h" +namespace agg +{ +template +struct conv_stroke : + public conv_adaptor_vcgen { + typedef Markers marker_type; + typedef conv_adaptor_vcgen base_type; + conv_stroke(VertexSource& vs) : + conv_adaptor_vcgen(vs) + { + } + void line_cap(line_cap_e lc) + { + base_type::generator().line_cap(lc); + } + void line_join(line_join_e lj) + { + base_type::generator().line_join(lj); + } + void inner_join(inner_join_e ij) + { + base_type::generator().inner_join(ij); + } + line_cap_e line_cap() const + { + return base_type::generator().line_cap(); + } + line_join_e line_join() const + { + return base_type::generator().line_join(); + } + inner_join_e inner_join() const + { + return base_type::generator().inner_join(); + } + void width(FX_FLOAT w) + { + base_type::generator().width(w); + } + void miter_limit(FX_FLOAT ml) + { + base_type::generator().miter_limit(ml); + } + void miter_limit_theta(FX_FLOAT t) + { + base_type::generator().miter_limit_theta(t); + } + void inner_miter_limit(FX_FLOAT ml) + { + base_type::generator().inner_miter_limit(ml); + } + void approximation_scale(FX_FLOAT as) + { + base_type::generator().approximation_scale(as); + } + FX_FLOAT width() const + { + return base_type::generator().width(); + } + FX_FLOAT miter_limit() const + { + return base_type::generator().miter_limit(); + } + FX_FLOAT inner_miter_limit() const + { + return base_type::generator().inner_miter_limit(); + } + FX_FLOAT approximation_scale() const + { + return base_type::generator().approximation_scale(); + } + void shorten(FX_FLOAT s) + { + base_type::generator().shorten(s); + } + FX_FLOAT shorten() const + { + return base_type::generator().shorten(); + } +private: + conv_stroke(const conv_stroke&); + const conv_stroke& + operator = (const conv_stroke&); +}; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_curves.cpp b/modules/pdfium/pdfium/third_party/agg23/agg_curves.cpp new file mode 100644 index 000000000000..b86cf630c398 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_curves.cpp @@ -0,0 +1,111 @@ + +//---------------------------------------------------------------------------- +// XYQ: 2006-01-22 Copied from AGG project. +// TODO: This file uses intensive floating point operations, so it's NOT suitable +// for platforms like Symbian OS. We need to change to FIX format. +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- + +#include "agg_curves.h" +#include "agg_math.h" +#include "core/fxcrt/fx_basic.h" + +namespace agg +{ +const FX_FLOAT curve_collinearity_epsilon = 1e-30f; +enum curve_recursion_limit_e { curve_recursion_limit = 16 }; +void curve4_div::init(FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x4, FX_FLOAT y4) +{ + m_points.remove_all(); + m_distance_tolerance_square = 1.0f / 4; + m_distance_tolerance_manhattan = 1.0f * 4; + bezier(x1, y1, x2, y2, x3, y3, x4, y4); + m_count = 0; +} +void curve4_div::recursive_bezier(FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x4, FX_FLOAT y4, + unsigned level) +{ + if(level > curve_recursion_limit) { + return; + } + FX_FLOAT x12 = (x1 + x2) / 2; + FX_FLOAT y12 = (y1 + y2) / 2; + FX_FLOAT x23 = (x2 + x3) / 2; + FX_FLOAT y23 = (y2 + y3) / 2; + FX_FLOAT x34 = (x3 + x4) / 2; + FX_FLOAT y34 = (y3 + y4) / 2; + FX_FLOAT x123 = (x12 + x23) / 2; + FX_FLOAT y123 = (y12 + y23) / 2; + FX_FLOAT x234 = (x23 + x34) / 2; + FX_FLOAT y234 = (y23 + y34) / 2; + FX_FLOAT x1234 = (x123 + x234) / 2; + FX_FLOAT y1234 = (y123 + y234) / 2; + FX_FLOAT dx = x4 - x1; + FX_FLOAT dy = y4 - y1; + FX_FLOAT d2 = FXSYS_fabs(((x2 - x4) * dy) - ((y2 - y4) * dx)); + FX_FLOAT d3 = FXSYS_fabs(((x3 - x4) * dy) - ((y3 - y4) * dx)); + switch((int(d2 > curve_collinearity_epsilon) << 1) + + int(d3 > curve_collinearity_epsilon)) { + case 0: + if(FXSYS_fabs(x1 + x3 - x2 - x2) + + FXSYS_fabs(y1 + y3 - y2 - y2) + + FXSYS_fabs(x2 + x4 - x3 - x3) + + FXSYS_fabs(y2 + y4 - y3 - y3) <= m_distance_tolerance_manhattan) { + m_points.add(point_type(x1234, y1234, path_flags_jr)); + return; + } + break; + case 1: + if ((d3 * d3) <= + (m_distance_tolerance_square * ((dx * dx) + (dy * dy)))) { + m_points.add(point_type(x23, y23, path_flags_jr)); + return; + } + break; + case 2: + if ((d2 * d2) <= + (m_distance_tolerance_square * ((dx * dx) + (dy * dy)))) { + m_points.add(point_type(x23, y23, path_flags_jr)); + return; + } + break; + case 3: + if (((d2 + d3) * (d2 + d3)) <= + (m_distance_tolerance_square * ((dx * dx) + (dy * dy)))) { + m_points.add(point_type(x23, y23, path_flags_jr)); + return; + } + break; + } + recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1); + recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1); +} +void curve4_div::bezier(FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x4, FX_FLOAT y4) +{ + m_points.add(point_type(x1, y1)); + recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0); + m_points.add(point_type(x4, y4)); +} +} diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_curves.h b/modules/pdfium/pdfium/third_party/agg23/agg_curves.h new file mode 100644 index 000000000000..495f7a6a8f40 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_curves.h @@ -0,0 +1,188 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// Copyright (C) 2005 Tony Juricic (tonygeek@yahoo.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +#ifndef AGG_CURVES_INCLUDED +#define AGG_CURVES_INCLUDED +#include "agg_array.h" +namespace agg +{ +struct curve4_points { + FX_FLOAT cp[8]; + curve4_points() {} + curve4_points(FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x4, FX_FLOAT y4) + { + cp[0] = x1; + cp[1] = y1; + cp[2] = x2; + cp[3] = y2; + cp[4] = x3; + cp[5] = y3; + cp[6] = x4; + cp[7] = y4; + } + void init(FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x4, FX_FLOAT y4) + { + cp[0] = x1; + cp[1] = y1; + cp[2] = x2; + cp[3] = y2; + cp[4] = x3; + cp[5] = y3; + cp[6] = x4; + cp[7] = y4; + } + FX_FLOAT operator [] (unsigned i) const + { + return cp[i]; + } + FX_FLOAT& operator [] (unsigned i) + { + return cp[i]; + } +}; +class curve4_div +{ +public: + curve4_div() : + m_count(0) + {} + curve4_div(FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x4, FX_FLOAT y4) : + m_count(0) + { + init(x1, y1, x2, y2, x3, y3, x4, y4); + } + curve4_div(const curve4_points& cp) : + m_count(0) + { + init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); + } + void reset() + { + m_points.remove_all(); + m_count = 0; + } + void init(FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x4, FX_FLOAT y4); + void init(const curve4_points& cp) + { + init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); + } + void rewind(unsigned) + { + m_count = 0; + } + unsigned vertex(FX_FLOAT* x, FX_FLOAT* y) + { + if(m_count >= m_points.size()) { + return path_cmd_stop; + } + const point_type& p = m_points[m_count++]; + *x = p.x; + *y = p.y; + return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to; + } + unsigned vertex_flag(FX_FLOAT* x, FX_FLOAT* y, int& flag) + { + if(m_count >= m_points.size()) { + return path_cmd_stop; + } + const point_type& p = m_points[m_count++]; + *x = p.x; + *y = p.y; + flag = p.flag; + return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to; + } + int count() + { + return m_points.size(); + } +private: + void bezier(FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x4, FX_FLOAT y4); + void recursive_bezier(FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x4, FX_FLOAT y4, + unsigned level); + FX_FLOAT m_distance_tolerance_square; + FX_FLOAT m_distance_tolerance_manhattan; + unsigned m_count; + pod_deque m_points; +}; +class curve4 +{ +public: + curve4() {} + curve4(FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x4, FX_FLOAT y4) + { + init(x1, y1, x2, y2, x3, y3, x4, y4); + } + curve4(const curve4_points& cp) + { + init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); + } + void reset() + { + m_curve_div.reset(); + } + void init(FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x3, FX_FLOAT y3, + FX_FLOAT x4, FX_FLOAT y4) + { + m_curve_div.init(x1, y1, x2, y2, x3, y3, x4, y4); + } + void init(const curve4_points& cp) + { + init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); + } + void rewind(unsigned path_id) + { + m_curve_div.rewind(path_id); + } + unsigned vertex(FX_FLOAT* x, FX_FLOAT* y) + { + return m_curve_div.vertex(x, y); + } + unsigned vertex_curve_flag(FX_FLOAT* x, FX_FLOAT* y, int& flag) + { + return m_curve_div.vertex_flag(x, y, flag); + } + int count() + { + return m_curve_div.count(); + } +private: + curve4_div m_curve_div; +}; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_math.h b/modules/pdfium/pdfium/third_party/agg23/agg_math.h new file mode 100644 index 000000000000..e003297dfffb --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_math.h @@ -0,0 +1,63 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// Bessel function (besj) was adapted for use in AGG library by Andy Wilk +// Contact: castor.vulgaris@gmail.com +//---------------------------------------------------------------------------- +#ifndef AGG_MATH_INCLUDED +#define AGG_MATH_INCLUDED +#include "agg_basics.h" +namespace agg +{ +const FX_FLOAT intersection_epsilon = 1.0e-30f; +AGG_INLINE FX_FLOAT calc_point_location(FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x, FX_FLOAT y) +{ + return ((x - x2) * (y2 - y1)) - ((y - y2) * (x2 - x1)); +} +AGG_INLINE FX_FLOAT calc_distance(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2) +{ + FX_FLOAT dx = x2 - x1; + FX_FLOAT dy = y2 - y1; + return FXSYS_sqrt2(dx, dy); +} +AGG_INLINE FX_FLOAT calc_line_point_distance(FX_FLOAT x1, FX_FLOAT y1, + FX_FLOAT x2, FX_FLOAT y2, + FX_FLOAT x, FX_FLOAT y) +{ + FX_FLOAT dx = x2 - x1; + FX_FLOAT dy = y2 - y1; + FX_FLOAT d = FXSYS_sqrt2(dx, dy); + if(d < intersection_epsilon) { + return calc_distance(x1, y1, x, y); + } + return ((x - x2) * dy / d) - ((y - y2) * dx / d); +} +AGG_INLINE bool calc_intersection(FX_FLOAT ax, FX_FLOAT ay, FX_FLOAT bx, FX_FLOAT by, + FX_FLOAT cx, FX_FLOAT cy, FX_FLOAT dx, FX_FLOAT dy, + FX_FLOAT* x, FX_FLOAT* y) +{ + FX_FLOAT num = ((ay - cy) * (dx - cx)) - ((ax - cx) * (dy - cy)); + FX_FLOAT den = ((bx - ax) * (dy - cy)) - ((by - ay) * (dx - cx)); + if (FXSYS_fabs(den) < intersection_epsilon) { + return false; + } + *x = ax + ((bx - ax) * num / den); + *y = ay + ((by - ay) * num / den); + return true; +} +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_math_stroke.h b/modules/pdfium/pdfium/third_party/agg23/agg_math_stroke.h new file mode 100644 index 000000000000..2b06b1bfda76 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_math_stroke.h @@ -0,0 +1,275 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// Stroke math +// +//---------------------------------------------------------------------------- +#ifndef AGG_STROKE_MATH_INCLUDED +#define AGG_STROKE_MATH_INCLUDED +#include "agg_math.h" +#include "agg_vertex_sequence.h" +namespace agg +{ +enum line_cap_e { + butt_cap, + square_cap, + round_cap +}; +enum line_join_e { + miter_join = 0, + miter_join_revert = 1, + miter_join_round = 4, + round_join = 2, + bevel_join = 3 +}; +enum inner_join_e { + inner_bevel, + inner_miter, + inner_jag, + inner_round +}; +const FX_FLOAT stroke_theta = 1.0f / 1000.0f; +template +void stroke_calc_arc(VertexConsumer& out_vertices, + FX_FLOAT x, FX_FLOAT y, + FX_FLOAT dx1, FX_FLOAT dy1, + FX_FLOAT dx2, FX_FLOAT dy2, + FX_FLOAT width, + FX_FLOAT approximation_scale) +{ + typedef typename VertexConsumer::value_type coord_type; + FX_FLOAT a1 = FXSYS_atan2(dy1, dx1); + FX_FLOAT a2 = FXSYS_atan2(dy2, dx2); + FX_FLOAT da = a1 - a2; + bool ccw = da > 0 && da < FX_PI; + if(width < 0) { + width = -width; + } + da = FXSYS_acos(width / (width + ((1.0f / 8) / approximation_scale))) * 2; + out_vertices.add(coord_type(x + dx1, y + dy1)); + if (da > 0) { + if (!ccw) { + if (a1 > a2) { + a2 += 2 * FX_PI; + } + a2 -= da / 4; + a1 += da; + while (a1 < a2) { + out_vertices.add(coord_type(x + (width * FXSYS_cos(a1)), + y + (width * FXSYS_sin(a1)))); + a1 += da; + } + } else { + if (a1 < a2) { + a2 -= 2 * FX_PI; + } + a2 += da / 4; + a1 -= da; + while (a1 > a2) { + out_vertices.add(coord_type(x + (width * FXSYS_cos(a1)), + y + (width * FXSYS_sin(a1)))); + a1 -= da; + } + } + } + out_vertices.add(coord_type(x + dx2, y + dy2)); +} +template +void stroke_calc_miter(VertexConsumer& out_vertices, + const vertex_dist& v0, + const vertex_dist& v1, + const vertex_dist& v2, + FX_FLOAT dx1, FX_FLOAT dy1, + FX_FLOAT dx2, FX_FLOAT dy2, + FX_FLOAT width, + line_join_e line_join, + FX_FLOAT miter_limit, + FX_FLOAT approximation_scale) +{ + typedef typename VertexConsumer::value_type coord_type; + FX_FLOAT xi = v1.x; + FX_FLOAT yi = v1.y; + bool miter_limit_exceeded = true; + if(calc_intersection(v0.x + dx1, v0.y - dy1, + v1.x + dx1, v1.y - dy1, + v1.x + dx2, v1.y - dy2, + v2.x + dx2, v2.y - dy2, + &xi, &yi)) { + FX_FLOAT d1 = calc_distance(v1.x, v1.y, xi, yi); + FX_FLOAT lim = width * miter_limit; + if(d1 <= lim) { + out_vertices.add(coord_type(xi, yi)); + miter_limit_exceeded = false; + } + } else { + FX_FLOAT x2 = v1.x + dx1; + FX_FLOAT y2 = v1.y - dy1; + if ((((x2 - v0.x) * dy1) - ((v0.y - y2) * dx1) < 0) != + (((x2 - v2.x) * dy1) - ((v2.y - y2) * dx1) < 0)) { + out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1)); + miter_limit_exceeded = false; + } + } + if(miter_limit_exceeded) { + switch(line_join) { + case miter_join_revert: + out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1)); + out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2)); + break; + case miter_join_round: + stroke_calc_arc(out_vertices, + v1.x, v1.y, dx1, -dy1, dx2, -dy2, + width, approximation_scale); + break; + default: + out_vertices.add(coord_type(v1.x + dx1 + (dy1 * miter_limit), + v1.y - dy1 + (dx1 * miter_limit))); + out_vertices.add(coord_type(v1.x + dx2 - (dy2 * miter_limit), + v1.y - dy2 - (dx2 * miter_limit))); + break; + } + } +} +template +void stroke_calc_cap(VertexConsumer& out_vertices, + const vertex_dist& v0, + const vertex_dist& v1, + FX_FLOAT len, + line_cap_e line_cap, + FX_FLOAT width, + FX_FLOAT approximation_scale) +{ + typedef typename VertexConsumer::value_type coord_type; + out_vertices.remove_all(); + FX_FLOAT dx1 = (v1.y - v0.y) / len; + FX_FLOAT dy1 = (v1.x - v0.x) / len; + FX_FLOAT dx2 = 0; + FX_FLOAT dy2 = 0; + dx1 = dx1 * width; + dy1 = dy1 * width; + if(line_cap != round_cap) { + if(line_cap == square_cap) { + dx2 = dy1; + dy2 = dx1; + } + out_vertices.add(coord_type(v0.x - dx1 - dx2, v0.y + dy1 - dy2)); + out_vertices.add(coord_type(v0.x + dx1 - dx2, v0.y - dy1 - dy2)); + } else { + FX_FLOAT a1 = FXSYS_atan2(dy1, -dx1); + FX_FLOAT a2 = a1 + FX_PI; + FX_FLOAT da = + FXSYS_acos(width / (width + ((1.0f / 8) / approximation_scale))) * + 2; + out_vertices.add(coord_type(v0.x - dx1, v0.y + dy1)); + a1 += da; + a2 -= da / 4; + while(a1 < a2) { + out_vertices.add(coord_type(v0.x + (width * FXSYS_cos(a1)), + v0.y + (width * FXSYS_sin(a1)))); + a1 += da; + } + out_vertices.add(coord_type(v0.x + dx1, v0.y - dy1)); + } +} +template +void stroke_calc_join(VertexConsumer& out_vertices, + const vertex_dist& v0, + const vertex_dist& v1, + const vertex_dist& v2, + FX_FLOAT len1, + FX_FLOAT len2, + FX_FLOAT width, + line_join_e line_join, + inner_join_e inner_join, + FX_FLOAT miter_limit, + FX_FLOAT inner_miter_limit, + FX_FLOAT approximation_scale) +{ + typedef typename VertexConsumer::value_type coord_type; + FX_FLOAT dx1, dy1, dx2, dy2; + dx1 = width * (v1.y - v0.y) / len1; + dy1 = width * (v1.x - v0.x) / len1; + dx2 = width * (v2.y - v1.y) / len2; + dy2 = width * (v2.x - v1.x) / len2; + out_vertices.remove_all(); + if(calc_point_location(v0.x, v0.y, v1.x, v1.y, v2.x, v2.y) > 0) { + switch(inner_join) { + default: + out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1)); + out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2)); + break; + case inner_miter: + stroke_calc_miter(out_vertices, + v0, v1, v2, dx1, dy1, dx2, dy2, + width, + miter_join_revert, + inner_miter_limit, + 1.0f); + break; + case inner_jag: + case inner_round: { + FX_FLOAT d = (dx1 - dx2) * (dx1 - dx2) + (dy1 - dy2) * (dy1 - dy2); + if(d < len1 * len1 && d < len2 * len2) { + stroke_calc_miter(out_vertices, + v0, v1, v2, dx1, dy1, dx2, dy2, + width, + miter_join_revert, + inner_miter_limit, + 1.0f); + } else { + if(inner_join == inner_jag) { + out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1)); + out_vertices.add(coord_type(v1.x, v1.y )); + out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2)); + } else { + out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1)); + out_vertices.add(coord_type(v1.x, v1.y )); + stroke_calc_arc(out_vertices, + v1.x, v1.y, dx2, -dy2, dx1, -dy1, + width, approximation_scale); + out_vertices.add(coord_type(v1.x, v1.y )); + out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2)); + } + } + } + break; + } + } else { + switch(line_join) { + case miter_join: + case miter_join_revert: + case miter_join_round: + stroke_calc_miter(out_vertices, + v0, v1, v2, dx1, dy1, dx2, dy2, + width, + line_join, + miter_limit, + approximation_scale); + break; + case round_join: + stroke_calc_arc(out_vertices, + v1.x, v1.y, dx1, -dy1, dx2, -dy2, + width, approximation_scale); + break; + default: + out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1)); + out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2)); + break; + } + } +} +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_path_storage.cpp b/modules/pdfium/pdfium/third_party/agg23/agg_path_storage.cpp new file mode 100644 index 000000000000..968746738a64 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_path_storage.cpp @@ -0,0 +1,100 @@ + +//---------------------------------------------------------------------------- +// XYQ: 2006-01-22 Copied from AGG project. +// TODO: This file uses intensive floating point operations, so it's NOT suitable +// for platforms like Symbian OS. We need to change to FIX format. +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// Class path_storage +// +//---------------------------------------------------------------------------- + +#include "agg_math.h" +#include "agg_path_storage.h" +#include "core/fxcrt/fx_basic.h" + +namespace agg +{ +path_storage::~path_storage() +{ + if(m_total_blocks) { + FX_FLOAT** coord_blk = m_coord_blocks + m_total_blocks - 1; + while(m_total_blocks--) { + FX_Free(*coord_blk); + --coord_blk; + } + FX_Free(m_coord_blocks); + } +} +path_storage::path_storage() : + m_total_vertices(0), + m_total_blocks(0), + m_max_blocks(0), + m_coord_blocks(0), + m_cmd_blocks(0), + m_iterator(0) +{ +} +void path_storage::allocate_block(unsigned nb) +{ + if(nb >= m_max_blocks) { + FX_FLOAT** new_coords = + FX_Alloc2D(FX_FLOAT*, m_max_blocks + block_pool, 2); + unsigned char** new_cmds = + (unsigned char**)(new_coords + m_max_blocks + block_pool); + if(m_coord_blocks) { + FXSYS_memcpy(new_coords, + m_coord_blocks, + m_max_blocks * sizeof(FX_FLOAT*)); + FXSYS_memcpy(new_cmds, + m_cmd_blocks, + m_max_blocks * sizeof(unsigned char*)); + FX_Free(m_coord_blocks); + } + m_coord_blocks = new_coords; + m_cmd_blocks = new_cmds; + m_max_blocks += block_pool; + } + m_coord_blocks[nb] = + FX_Alloc( FX_FLOAT, block_size * 2 + + block_size / + (sizeof(FX_FLOAT) / sizeof(unsigned char))); + m_cmd_blocks[nb] = + (unsigned char*)(m_coord_blocks[nb] + block_size * 2); + m_total_blocks++; +} +void path_storage::rewind(unsigned path_id) +{ + m_iterator = path_id; +} +void path_storage::curve4(FX_FLOAT x_ctrl1, FX_FLOAT y_ctrl1, + FX_FLOAT x_ctrl2, FX_FLOAT y_ctrl2, + FX_FLOAT x_to, FX_FLOAT y_to) +{ + add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4); + add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4); + add_vertex(x_to, y_to, path_cmd_curve4); +} +void path_storage::end_poly() +{ + if(m_total_vertices) { + if(is_vertex(command(m_total_vertices - 1))) { + add_vertex(0, 0, path_cmd_end_poly | path_flags_close); + } + } +} +} diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_path_storage.h b/modules/pdfium/pdfium/third_party/agg23/agg_path_storage.h new file mode 100644 index 000000000000..7f21bacd09c4 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_path_storage.h @@ -0,0 +1,172 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +#ifndef AGG_PATH_STORAGE_INCLUDED +#define AGG_PATH_STORAGE_INCLUDED +#include "agg_basics.h" +namespace agg +{ +class path_storage +{ + enum block_scale_e { + block_shift = 8, + block_size = 1 << block_shift, + block_mask = block_size - 1, + block_pool = 256 + }; +public: + class vertex_source + { + public: + vertex_source() {} + vertex_source(const path_storage& p) : m_path(&p), m_vertex_idx(0) {} + void rewind(unsigned path_id) + { + m_vertex_idx = path_id; + } + unsigned vertex(FX_FLOAT* x, FX_FLOAT* y) + { + return (m_vertex_idx < m_path->total_vertices()) + ? m_path->vertex(m_vertex_idx++, x, y) + : static_cast(path_cmd_stop); + } + private: + const path_storage* m_path; + unsigned m_vertex_idx; + }; + ~path_storage(); + path_storage(); + unsigned last_vertex(FX_FLOAT* x, FX_FLOAT* y) const; + unsigned prev_vertex(FX_FLOAT* x, FX_FLOAT* y) const; + void move_to(FX_FLOAT x, FX_FLOAT y); + void line_to(FX_FLOAT x, FX_FLOAT y); + void curve4(FX_FLOAT x_ctrl1, FX_FLOAT y_ctrl1, + FX_FLOAT x_ctrl2, FX_FLOAT y_ctrl2, + FX_FLOAT x_to, FX_FLOAT y_to); + template + void add_path(VertexSource& vs, + unsigned path_id = 0, + bool solid_path = true) + { + FX_FLOAT x, y; + unsigned cmd; + vs.rewind(path_id); + while(!is_stop(cmd = vs.vertex(&x, &y))) { + if(is_move_to(cmd) && solid_path && m_total_vertices) { + cmd = path_cmd_line_to; + } + add_vertex(x, y, cmd); + } + } + template + void add_path_curve(VertexSource& vs, + unsigned path_id = 0, + bool solid_path = true) + { + FX_FLOAT x, y; + unsigned cmd; + int flag; + vs.rewind(path_id); + while(!is_stop(cmd = vs.vertex_curve_flag(&x, &y, flag))) { + if(is_move_to(cmd) && solid_path && m_total_vertices) { + cmd = path_cmd_line_to | flag; + } + add_vertex(x, y, cmd | flag); + } + } + unsigned total_vertices() const + { + return m_total_vertices; + } + unsigned vertex(unsigned idx, FX_FLOAT* x, FX_FLOAT* y) const + { + unsigned nb = idx >> block_shift; + const FX_FLOAT* pv = m_coord_blocks[nb] + ((idx & block_mask) << 1); + *x = *pv++; + *y = *pv; + return m_cmd_blocks[nb][idx & block_mask]; + } + unsigned command(unsigned idx) const + { + return m_cmd_blocks[idx >> block_shift][idx & block_mask]; + } + unsigned getflag(unsigned idx) const + { + return m_cmd_blocks[idx >> block_shift][idx & block_mask] & path_flags_jr; + } + void rewind(unsigned path_id); + unsigned vertex(FX_FLOAT* x, FX_FLOAT* y); + void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd); + void end_poly(); +private: + void allocate_block(unsigned nb); + unsigned char* storage_ptrs(FX_FLOAT** xy_ptr); +private: + unsigned m_total_vertices; + unsigned m_total_blocks; + unsigned m_max_blocks; + FX_FLOAT** m_coord_blocks; + unsigned char** m_cmd_blocks; + unsigned m_iterator; +}; +inline unsigned path_storage::vertex(FX_FLOAT* x, FX_FLOAT* y) +{ + if(m_iterator >= m_total_vertices) { + return path_cmd_stop; + } + return vertex(m_iterator++, x, y); +} +inline unsigned path_storage::prev_vertex(FX_FLOAT* x, FX_FLOAT* y) const +{ + if(m_total_vertices > 1) { + return vertex(m_total_vertices - 2, x, y); + } + return path_cmd_stop; +} +inline unsigned path_storage::last_vertex(FX_FLOAT* x, FX_FLOAT* y) const +{ + if(m_total_vertices) { + return vertex(m_total_vertices - 1, x, y); + } + return path_cmd_stop; +} +inline unsigned char* path_storage::storage_ptrs(FX_FLOAT** xy_ptr) +{ + unsigned nb = m_total_vertices >> block_shift; + if(nb >= m_total_blocks) { + allocate_block(nb); + } + *xy_ptr = m_coord_blocks[nb] + ((m_total_vertices & block_mask) << 1); + return m_cmd_blocks[nb] + (m_total_vertices & block_mask); +} +inline void path_storage::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd) +{ + FX_FLOAT* coord_ptr = 0; + unsigned char* cmd_ptr = storage_ptrs(&coord_ptr); + *cmd_ptr = (unsigned char)cmd; + *coord_ptr++ = x; + *coord_ptr = y; + m_total_vertices++; +} +inline void path_storage::move_to(FX_FLOAT x, FX_FLOAT y) +{ + add_vertex(x, y, path_cmd_move_to); +} +inline void path_storage::line_to(FX_FLOAT x, FX_FLOAT y) +{ + add_vertex(x, y, path_cmd_line_to); +} +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_pixfmt_gray.h b/modules/pdfium/pdfium/third_party/agg23/agg_pixfmt_gray.h new file mode 100644 index 000000000000..5a80935479d4 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_pixfmt_gray.h @@ -0,0 +1,177 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// Adaptation for high precision colors has been sponsored by +// Liberty Technology Systems, Inc., visit http://lib-sys.com +// +// Liberty Technology Systems, Inc. is the provider of +// PostScript and PDF technology for software developers. +// +//---------------------------------------------------------------------------- +#ifndef AGG_PIXFMT_GRAY_INCLUDED +#define AGG_PIXFMT_GRAY_INCLUDED +#include "agg_basics.h" +#include "agg_color_gray.h" +#include "agg_rendering_buffer.h" +namespace agg +{ +template struct blender_gray { + typedef ColorT color_type; + typedef typename color_type::value_type value_type; + typedef typename color_type::calc_type calc_type; + enum base_scale_e { base_shift = color_type::base_shift }; + static AGG_INLINE void blend_pix(value_type* p, unsigned cv, + unsigned alpha, unsigned cover = 0) + { + *p = (value_type)((((cv - calc_type(*p)) * alpha) + (calc_type(*p) << base_shift)) >> base_shift); + } +}; +template +class pixel_formats_gray +{ +public: + typedef rendering_buffer::row_data row_data; + typedef rendering_buffer::span_data span_data; + typedef typename Blender::color_type color_type; + typedef typename color_type::value_type value_type; + typedef typename color_type::calc_type calc_type; + enum base_scale_e { + base_shift = color_type::base_shift, + base_size = color_type::base_size, + base_mask = color_type::base_mask + }; +private: + static AGG_INLINE void copy_or_blend_pix(value_type* p, + const color_type& c, + unsigned cover) + { + if (c.a) { + calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; + if(alpha == base_mask) { + *p = c.v; + } else { + Blender::blend_pix(p, c.v, alpha, cover); + } + } + } + static AGG_INLINE void copy_or_blend_pix(value_type* p, + const color_type& c) + { + if (c.a) { + if(c.a == base_mask) { + *p = c.v; + } else { + Blender::blend_pix(p, c.v, c.a); + } + } + } +public: + pixel_formats_gray(rendering_buffer& rb) : + m_rbuf(&rb) + {} + AGG_INLINE unsigned width() const + { + return m_rbuf->width(); + } + AGG_INLINE unsigned height() const + { + return m_rbuf->height(); + } + AGG_INLINE color_type pixel(int x, int y) const + { + value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset; + return color_type(*p); + } + row_data row(int x, int y) const + { + return row_data(x, + width() - 1, + m_rbuf->row(y) + + x * Step * sizeof(value_type) + + Offset * sizeof(value_type)); + } + span_data span(int x, int y, unsigned len) + { + return span_data(x, len, + m_rbuf->row(y) + + x * Step * sizeof(value_type) + + Offset * sizeof(value_type)); + } + AGG_INLINE void copy_pixel(int x, int y, const color_type& c) + { + *((value_type*)m_rbuf->row(y) + x * Step + Offset) = c.v; + } + AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover) + { + copy_or_blend_pix((value_type*)m_rbuf->row(y) + x * Step + Offset, c, cover); + } + AGG_INLINE void copy_hline(int x, int y, + unsigned len, + const color_type& c) + { + value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset; + do { + *p = c.v; + p += Step; + } while(--len); + } + void blend_hline(int x, int y, + unsigned len, + const color_type& c, + int8u cover) + { + if (c.a) { + value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset; + calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; + if(alpha == base_mask) { + do { + *p = c.v; + p += Step; + } while(--len); + } else { + do { + Blender::blend_pix(p, c.v, alpha, cover); + p += Step; + } while(--len); + } + } + } + void blend_solid_hspan(int x, int y, + unsigned len, + const color_type& c, + const int8u* covers) + { + if (c.a) { + value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset; + do { + calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8; + if(alpha == base_mask) { + *p = c.v; + } else { + Blender::blend_pix(p, c.v, alpha, *covers); + } + p += Step; + ++covers; + } while(--len); + } + } +private: + rendering_buffer* m_rbuf; +}; +typedef blender_gray blender_gray8; +typedef pixel_formats_gray pixfmt_gray8; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_rasterizer_scanline_aa.cpp b/modules/pdfium/pdfium/third_party/agg23/agg_rasterizer_scanline_aa.cpp new file mode 100644 index 000000000000..af6dd58fe304 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_rasterizer_scanline_aa.cpp @@ -0,0 +1,498 @@ + +//---------------------------------------------------------------------------- +// XYQ: 2006-01-22 Copied from AGG project. +// This file uses only integer data, so it's suitable for all platforms. +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// +// The author gratefully acknowleges the support of David Turner, +// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType +// libray - in producing this work. See http://www.freetype.org for details. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// Adaptation for 32-bit screen coordinates has been sponsored by +// Liberty Technology Systems, Inc., visit http://lib-sys.com +// +// Liberty Technology Systems, Inc. is the provider of +// PostScript and PDF technology for software developers. +// +//---------------------------------------------------------------------------- +// +// Class outline_aa - implementation. +// +// Initially the rendering algorithm was designed by David Turner and the +// other authors of the FreeType library - see the above notice. I nearly +// created a similar renderer, but still I was far from David's work. +// I completely redesigned the original code and adapted it for Anti-Grain +// ideas. Two functions - render_line and render_hline are the core of +// the algorithm - they calculate the exact coverage of each pixel cell +// of the polygon. I left these functions almost as is, because there's +// no way to improve the perfection - hats off to David and his group! +// +// All other code is very different from the original. +// +//---------------------------------------------------------------------------- +#include +#include "agg_rasterizer_scanline_aa.h" +#include "third_party/base/numerics/safe_math.h" +namespace agg +{ +AGG_INLINE void cell_aa::set_cover(int c, int a) +{ + cover = c; + area = a; +} +AGG_INLINE void cell_aa::add_cover(int c, int a) +{ + cover += c; + area += a; +} +AGG_INLINE void cell_aa::set_coord(int cx, int cy) +{ + x = cx; + y = cy; +} +AGG_INLINE void cell_aa::set(int cx, int cy, int c, int a) +{ + x = cx; + y = cy; + cover = c; + area = a; +} +outline_aa::~outline_aa() +{ + if(m_num_blocks) { + cell_aa** ptr = m_cells + m_num_blocks - 1; + while(m_num_blocks--) { + FX_Free(*ptr); + ptr--; + } + FX_Free(m_cells); + } +} +outline_aa::outline_aa() : + m_num_blocks(0), + m_max_blocks(0), + m_cur_block(0), + m_num_cells(0), + m_cells(0), + m_cur_cell_ptr(0), + m_cur_x(0), + m_cur_y(0), + m_min_x(0x7FFFFFFF), + m_min_y(0x7FFFFFFF), + m_max_x(-0x7FFFFFFF), + m_max_y(-0x7FFFFFFF), + m_sorted(false) +{ + m_cur_cell.set(0x7FFF, 0x7FFF, 0, 0); +} +void outline_aa::reset() +{ + m_num_cells = 0; + m_cur_block = 0; + m_cur_cell.set(0x7FFF, 0x7FFF, 0, 0); + m_sorted = false; + m_min_x = 0x7FFFFFFF; + m_min_y = 0x7FFFFFFF; + m_max_x = -0x7FFFFFFF; + m_max_y = -0x7FFFFFFF; +} +void outline_aa::allocate_block() +{ + if(m_cur_block >= m_num_blocks) { + if(m_num_blocks >= m_max_blocks) { + cell_aa** new_cells = FX_Alloc( cell_aa*, m_max_blocks + cell_block_pool); + if(m_cells) { + FXSYS_memcpy(new_cells, m_cells, m_max_blocks * sizeof(cell_aa*)); + FX_Free(m_cells); + } + m_cells = new_cells; + m_max_blocks += cell_block_pool; + } + m_cells[m_num_blocks++] = FX_Alloc(cell_aa, cell_block_size); + } + m_cur_cell_ptr = m_cells[m_cur_block++]; +} +AGG_INLINE void outline_aa::add_cur_cell() +{ + if(m_cur_cell.area | m_cur_cell.cover) { + if((m_num_cells & cell_block_mask) == 0) { + if(m_num_blocks >= cell_block_limit) { + return; + } + allocate_block(); + } + *m_cur_cell_ptr++ = m_cur_cell; + ++m_num_cells; + } +} +AGG_INLINE void outline_aa::set_cur_cell(int x, int y) +{ + if(m_cur_cell.x != x || m_cur_cell.y != y) { + add_cur_cell(); + m_cur_cell.set(x, y, 0, 0); + if(x < m_min_x) { + m_min_x = x; + } + if(x > m_max_x) { + m_max_x = x; + } + if(y < m_min_y) { + m_min_y = y; + } + if(y > m_max_y) { + m_max_y = y; + } + } +} +AGG_INLINE void outline_aa::render_hline(int ey, int x1, int y1, int x2, int y2) +{ + int ex1 = x1 >> poly_base_shift; + int ex2 = x2 >> poly_base_shift; + int fx1 = x1 & poly_base_mask; + int fx2 = x2 & poly_base_mask; + int delta, p, first, dx; + int incr, lift, mod, rem; + if(y1 == y2) { + set_cur_cell(ex2, ey); + return; + } + if(ex1 == ex2) { + delta = y2 - y1; + m_cur_cell.add_cover(delta, (fx1 + fx2) * delta); + return; + } + p = (poly_base_size - fx1) * (y2 - y1); + first = poly_base_size; + incr = 1; + dx = x2 - x1; + if(dx < 0) { + p = fx1 * (y2 - y1); + first = 0; + incr = -1; + dx = -dx; + } + delta = p / dx; + mod = p % dx; + if(mod < 0) { + delta--; + mod += dx; + } + m_cur_cell.add_cover(delta, (fx1 + first) * delta); + ex1 += incr; + set_cur_cell(ex1, ey); + y1 += delta; + if(ex1 != ex2) { + p = poly_base_size * (y2 - y1 + delta); + lift = p / dx; + rem = p % dx; + if (rem < 0) { + lift--; + rem += dx; + } + mod -= dx; + while (ex1 != ex2) { + delta = lift; + mod += rem; + if(mod >= 0) { + mod -= dx; + delta++; + } + m_cur_cell.add_cover(delta, (poly_base_size) * delta); + y1 += delta; + ex1 += incr; + set_cur_cell(ex1, ey); + } + } + delta = y2 - y1; + m_cur_cell.add_cover(delta, (fx2 + poly_base_size - first) * delta); +} +void outline_aa::render_line(int x1, int y1, int x2, int y2) +{ + enum dx_limit_e { dx_limit = 16384 << poly_base_shift }; + int dx = x2 - x1; + if(dx >= dx_limit || dx <= -dx_limit) { + int cx = (x1 + x2) >> 1; + int cy = (y1 + y2) >> 1; + render_line(x1, y1, cx, cy); + render_line(cx, cy, x2, y2); + } + int dy = y2 - y1; + int ey1 = y1 >> poly_base_shift; + int ey2 = y2 >> poly_base_shift; + int fy1 = y1 & poly_base_mask; + int fy2 = y2 & poly_base_mask; + int x_from, x_to; + int rem, mod, lift, delta, first, incr; + if(ey1 == ey2) { + render_hline(ey1, x1, fy1, x2, fy2); + return; + } + incr = 1; + if(dx == 0) { + int ex = x1 >> poly_base_shift; + int two_fx = (x1 - (ex << poly_base_shift)) << 1; + int area; + first = poly_base_size; + if(dy < 0) { + first = 0; + incr = -1; + } + x_from = x1; + delta = first - fy1; + m_cur_cell.add_cover(delta, two_fx * delta); + ey1 += incr; + set_cur_cell(ex, ey1); + delta = first + first - poly_base_size; + area = two_fx * delta; + while(ey1 != ey2) { + m_cur_cell.set_cover(delta, area); + ey1 += incr; + set_cur_cell(ex, ey1); + } + delta = fy2 - poly_base_size + first; + m_cur_cell.add_cover(delta, two_fx * delta); + return; + } + pdfium::base::CheckedNumeric safeP = poly_base_size - fy1; + safeP *= dx; + if (!safeP.IsValid()) + return; + first = poly_base_size; + if(dy < 0) { + safeP = fy1; + safeP *= dx; + if (!safeP.IsValid()) + return; + first = 0; + incr = -1; + dy = -dy; + } + delta = (safeP / dy).ValueOrDie(); + mod = (safeP % dy).ValueOrDie(); + if(mod < 0) { + delta--; + mod += dy; + } + x_from = x1 + delta; + render_hline(ey1, x1, fy1, x_from, first); + ey1 += incr; + set_cur_cell(x_from >> poly_base_shift, ey1); + if(ey1 != ey2) { + safeP = static_cast(poly_base_size); + safeP *= dx; + if (!safeP.IsValid()) + return; + lift = (safeP / dy).ValueOrDie(); + rem = (safeP % dy).ValueOrDie(); + if (rem < 0) { + lift--; + rem += dy; + } + mod -= dy; + while(ey1 != ey2) { + delta = lift; + mod += rem; + if (mod >= 0) { + mod -= dy; + delta++; + } + x_to = x_from + delta; + render_hline(ey1, x_from, poly_base_size - first, x_to, first); + x_from = x_to; + ey1 += incr; + set_cur_cell(x_from >> poly_base_shift, ey1); + } + } + render_hline(ey1, x_from, poly_base_size - first, x2, fy2); +} +void outline_aa::move_to(int x, int y) +{ + if(m_sorted) { + reset(); + } + set_cur_cell(x >> poly_base_shift, y >> poly_base_shift); + m_cur_x = x; + m_cur_y = y; +} +void outline_aa::line_to(int x, int y) +{ + render_line(m_cur_x, m_cur_y, x, y); + m_cur_x = x; + m_cur_y = y; + m_sorted = false; +} +template static AGG_INLINE void swap_cells(T* a, T* b) +{ + T temp = *a; + *a = *b; + *b = temp; +} +enum { + qsort_threshold = 9 +}; +static void qsort_cells(cell_aa** start, unsigned num) +{ + cell_aa** stack[80]; + cell_aa*** top; + cell_aa** limit; + cell_aa** base; + limit = start + num; + base = start; + top = stack; + for (;;) { + int len = int(limit - base); + cell_aa** i; + cell_aa** j; + cell_aa** pivot; + if(len > qsort_threshold) { + pivot = base + len / 2; + swap_cells(base, pivot); + i = base + 1; + j = limit - 1; + if((*j)->x < (*i)->x) { + swap_cells(i, j); + } + if((*base)->x < (*i)->x) { + swap_cells(base, i); + } + if((*j)->x < (*base)->x) { + swap_cells(base, j); + } + for(;;) { + int x = (*base)->x; + do { + i++; + } while( (*i)->x < x ); + do { + j--; + } while( x < (*j)->x ); + if(i > j) { + break; + } + swap_cells(i, j); + } + swap_cells(base, j); + if(j - base > limit - i) { + top[0] = base; + top[1] = j; + base = i; + } else { + top[0] = i; + top[1] = limit; + limit = j; + } + top += 2; + } else { + j = base; + i = j + 1; + for(; i < limit; j = i, i++) { + for(; j[1]->x < (*j)->x; j--) { + swap_cells(j + 1, j); + if (j == base) { + break; + } + } + } + if(top > stack) { + top -= 2; + base = top[0]; + limit = top[1]; + } else { + break; + } + } + } +} +void outline_aa::sort_cells() +{ + if(m_sorted) { + return; + } + add_cur_cell(); + if(m_num_cells == 0) { + return; + } + m_sorted_cells.allocate(m_num_cells, 16); + if (m_max_y > 0 && m_min_y < 0 && -m_min_y > INT_MAX - m_max_y) { + return; + } + unsigned size = m_max_y - m_min_y; + if (size + 1 < size) { + return; + } + size++; + m_sorted_y.allocate(size, 16); + m_sorted_y.zero(); + cell_aa** block_ptr = m_cells; + cell_aa* cell_ptr = NULL; + unsigned nb = m_num_cells >> cell_block_shift; + unsigned i; + while(nb--) { + cell_ptr = *block_ptr++; + i = cell_block_size; + while(i--) { + m_sorted_y[cell_ptr->y - m_min_y].start++; + ++cell_ptr; + } + } + i = m_num_cells & cell_block_mask; + if (i) { + cell_ptr = *block_ptr++; + } + while(i--) { + m_sorted_y[cell_ptr->y - m_min_y].start++; + ++cell_ptr; + } + unsigned start = 0; + for(i = 0; i < m_sorted_y.size(); i++) { + unsigned v = m_sorted_y[i].start; + m_sorted_y[i].start = start; + start += v; + } + block_ptr = m_cells; + nb = m_num_cells >> cell_block_shift; + while(nb--) { + cell_ptr = *block_ptr++; + i = cell_block_size; + while(i--) { + sorted_y& cur_y = m_sorted_y[cell_ptr->y - m_min_y]; + m_sorted_cells[cur_y.start + cur_y.num] = cell_ptr; + ++cur_y.num; + ++cell_ptr; + } + } + i = m_num_cells & cell_block_mask; + if (i) { + cell_ptr = *block_ptr++; + } + while(i--) { + sorted_y& cur_y = m_sorted_y[cell_ptr->y - m_min_y]; + m_sorted_cells[cur_y.start + cur_y.num] = cell_ptr; + ++cur_y.num; + ++cell_ptr; + } + for(i = 0; i < m_sorted_y.size(); i++) { + const sorted_y& cur_y = m_sorted_y[i]; + if(cur_y.num) { + qsort_cells(m_sorted_cells.data() + cur_y.start, cur_y.num); + } + } + m_sorted = true; +} +} diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_rasterizer_scanline_aa.h b/modules/pdfium/pdfium/third_party/agg23/agg_rasterizer_scanline_aa.h new file mode 100644 index 000000000000..fc28290f549e --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_rasterizer_scanline_aa.h @@ -0,0 +1,477 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// +// The author gratefully acknowleges the support of David Turner, +// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType +// libray - in producing this work. See http://www.freetype.org for details. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// Adaptation for 32-bit screen coordinates has been sponsored by +// Liberty Technology Systems, Inc., visit http://lib-sys.com +// +// Liberty Technology Systems, Inc. is the provider of +// PostScript and PDF technology for software developers. +// +//---------------------------------------------------------------------------- +#ifndef AGG_RASTERIZER_SCANLINE_AA_INCLUDED +#define AGG_RASTERIZER_SCANLINE_AA_INCLUDED + +#include "agg_array.h" +#include "agg_basics.h" +#include "agg_clip_liang_barsky.h" +#include "agg_math.h" +#include "agg_render_scanlines.h" +#include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/fx_memory.h" + +namespace agg +{ +enum poly_base_scale_e { + poly_base_shift = 8, + poly_base_size = 1 << poly_base_shift, + poly_base_mask = poly_base_size - 1 +}; +inline int poly_coord(FX_FLOAT c) +{ + return int(c * poly_base_size); +} +struct cell_aa { + int x; + int y; + int cover; + int area; + void set(int x, int y, int c, int a); + void set_coord(int x, int y); + void set_cover(int c, int a); + void add_cover(int c, int a); +}; +class outline_aa +{ + enum cell_block_scale_e { + cell_block_shift = 12, + cell_block_size = 1 << cell_block_shift, + cell_block_mask = cell_block_size - 1, + cell_block_pool = 256, + cell_block_limit = 1024 + }; + struct sorted_y { + unsigned start; + unsigned num; + }; +public: + ~outline_aa(); + outline_aa(); + void reset(); + void move_to(int x, int y); + void line_to(int x, int y); + int min_x() const + { + return m_min_x; + } + int min_y() const + { + return m_min_y; + } + int max_x() const + { + return m_max_x; + } + int max_y() const + { + return m_max_y; + } + void sort_cells(); + unsigned total_cells() const + { + return m_num_cells; + } + unsigned scanline_num_cells(unsigned y) const + { + return m_sorted_y[y - m_min_y].num; + } + const cell_aa* const* scanline_cells(unsigned y) const + { + return m_sorted_cells.data() + m_sorted_y[y - m_min_y].start; + } + bool sorted() const + { + return m_sorted; + } +private: + outline_aa(const outline_aa&); + const outline_aa& operator = (const outline_aa&); + void set_cur_cell(int x, int y); + void add_cur_cell(); + void render_hline(int ey, int x1, int y1, int x2, int y2); + void render_line(int x1, int y1, int x2, int y2); + void allocate_block(); +private: + unsigned m_num_blocks; + unsigned m_max_blocks; + unsigned m_cur_block; + unsigned m_num_cells; + cell_aa** m_cells; + cell_aa* m_cur_cell_ptr; + pod_array m_sorted_cells; + pod_array m_sorted_y; + cell_aa m_cur_cell; + int m_cur_x; + int m_cur_y; + int m_min_x; + int m_min_y; + int m_max_x; + int m_max_y; + bool m_sorted; +}; +class scanline_hit_test +{ +public: + scanline_hit_test(int x) : m_x(x), m_hit(false) {} + void reset_spans() {} + void finalize(int) {} + void add_cell(int x, int) + { + if(m_x == x) { + m_hit = true; + } + } + void add_span(int x, int len, int) + { + if(m_x >= x && m_x < x + len) { + m_hit = true; + } + } + unsigned num_spans() const + { + return 1; + } + bool hit() const + { + return m_hit; + } +private: + int m_x; + bool m_hit; +}; +enum filling_rule_e { + fill_non_zero, + fill_even_odd +}; +class rasterizer_scanline_aa +{ + enum status { + status_initial, + status_line_to, + status_closed + }; +public: + enum aa_scale_e { + aa_num = 1 << 8, + aa_mask = aa_num - 1, + aa_2num = aa_num * 2, + aa_2mask = aa_2num - 1 + }; + rasterizer_scanline_aa() : + m_filling_rule(fill_non_zero), + m_clipped_start_x(0), + m_clipped_start_y(0), + m_status(status_initial), + m_clipping(false) + { + } + ~rasterizer_scanline_aa() {} + void filling_rule(filling_rule_e filling_rule) + { + m_filling_rule = filling_rule; + } + int min_x() const + { + return m_outline.min_x(); + } + int min_y() const + { + return m_outline.min_y(); + } + int max_x() const + { + return m_outline.max_x(); + } + int max_y() const + { + return m_outline.max_y(); + } + void reset() + { + m_outline.reset(); + m_status = status_initial; + } + void clip_box(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2) + { + m_clip_box = rect(poly_coord(x1), poly_coord(y1), + poly_coord(x2), poly_coord(y2)); + m_clip_box.normalize(); + m_clipping = true; + } + void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd) + { + if(is_close(cmd)) { + close_polygon(); + } else { + if(is_move_to(cmd)) { + move_to(poly_coord(x), poly_coord(y)); + } else { + if(is_vertex(cmd)) { + line_to(poly_coord(x), poly_coord(y)); + } + } + } + } + void move_to(int x, int y) + { + if(m_clipping) { + if(m_outline.sorted()) { + reset(); + } + if(m_status == status_line_to) { + close_polygon(); + } + m_prev_x = m_start_x = x; + m_prev_y = m_start_y = y; + m_status = status_initial; + m_prev_flags = clipping_flags(x, y, m_clip_box); + if(m_prev_flags == 0) { + move_to_no_clip(x, y); + } + } else { + move_to_no_clip(x, y); + } + } + void line_to(int x, int y) + { + if(m_clipping) { + clip_segment(x, y); + } else { + line_to_no_clip(x, y); + } + } + void close_polygon() + { + if (m_status != status_line_to) { + return; + } + if(m_clipping) { + clip_segment(m_start_x, m_start_y); + } + close_polygon_no_clip(); + } + AGG_INLINE unsigned calculate_alpha(int area, bool no_smooth) const + { + int cover = area >> (poly_base_shift * 2 + 1 - 8); + if(cover < 0) { + cover = -cover; + } + if(m_filling_rule == fill_even_odd) { + cover &= aa_2mask; + if(cover > aa_num) { + cover = aa_2num - cover; + } + } + if (no_smooth) { + cover = cover > aa_mask / 2 ? aa_mask : 0; + } + if(cover > aa_mask) { + cover = aa_mask; + } + return cover; + } + AGG_INLINE void sort() + { + m_outline.sort_cells(); + } + AGG_INLINE bool rewind_scanlines() + { + close_polygon(); + m_outline.sort_cells(); + if(m_outline.total_cells() == 0) { + return false; + } + m_cur_y = m_outline.min_y(); + return true; + } + AGG_INLINE bool navigate_scanline(int y) + { + close_polygon(); + m_outline.sort_cells(); + if(m_outline.total_cells() == 0 || + y < m_outline.min_y() || + y > m_outline.max_y()) { + return false; + } + m_cur_y = y; + return true; + } + template bool sweep_scanline(Scanline& sl, bool no_smooth) + { + for(;;) { + if(m_cur_y > m_outline.max_y()) { + return false; + } + sl.reset_spans(); + unsigned num_cells = m_outline.scanline_num_cells(m_cur_y); + const cell_aa* const* cells = m_outline.scanline_cells(m_cur_y); + int cover = 0; + while(num_cells) { + const cell_aa* cur_cell = *cells; + int x = cur_cell->x; + int area = cur_cell->area; + unsigned alpha; + cover += cur_cell->cover; + while(--num_cells) { + cur_cell = *++cells; + if(cur_cell->x != x) { + break; + } + area += cur_cell->area; + cover += cur_cell->cover; + } + if(area) { + alpha = calculate_alpha((cover << (poly_base_shift + 1)) - area, no_smooth); + if(alpha) { + sl.add_cell(x, alpha); + } + x++; + } + if(num_cells && cur_cell->x > x) { + alpha = calculate_alpha(cover << (poly_base_shift + 1), no_smooth); + if(alpha) { + sl.add_span(x, cur_cell->x - x, alpha); + } + } + } + if(sl.num_spans()) { + break; + } + ++m_cur_y; + } + sl.finalize(m_cur_y); + ++m_cur_y; + return true; + } + template + void add_path(VertexSource& vs, unsigned path_id = 0) + { + FX_FLOAT x; + FX_FLOAT y; + unsigned cmd; + vs.rewind(path_id); + while(!is_stop(cmd = vs.vertex(&x, &y))) { + add_vertex(x, y, cmd); + } + } + template + void add_path_transformed(VertexSource& vs, const CFX_Matrix* pMatrix, unsigned path_id = 0) + { + FX_FLOAT x; + FX_FLOAT y; + unsigned cmd; + vs.rewind(path_id); + while(!is_stop(cmd = vs.vertex(&x, &y))) { + if (pMatrix) { + CFX_PointF ret = pMatrix->Transform(CFX_PointF(x, y)); + x = ret.x; + y = ret.y; + } + add_vertex(x, y, cmd); + } + } +private: + rasterizer_scanline_aa(const rasterizer_scanline_aa&); + const rasterizer_scanline_aa& + operator = (const rasterizer_scanline_aa&); + void move_to_no_clip(int x, int y) + { + if(m_status == status_line_to) { + close_polygon_no_clip(); + } + m_outline.move_to(x * 1, y); + m_clipped_start_x = x; + m_clipped_start_y = y; + m_status = status_line_to; + } + void line_to_no_clip(int x, int y) + { + if(m_status != status_initial) { + m_outline.line_to(x * 1, y); + m_status = status_line_to; + } + } + void close_polygon_no_clip() + { + if(m_status == status_line_to) { + m_outline.line_to(m_clipped_start_x * 1, m_clipped_start_y); + m_status = status_closed; + } + } + void clip_segment(int x, int y) + { + unsigned flags = clipping_flags(x, y, m_clip_box); + if(m_prev_flags == flags) { + if(flags == 0) { + if(m_status == status_initial) { + move_to_no_clip(x, y); + } else { + line_to_no_clip(x, y); + } + } + } else { + int cx[4]; + int cy[4]; + unsigned n = clip_liang_barsky(m_prev_x, m_prev_y, + x, y, + m_clip_box, + cx, cy); + const int* px = cx; + const int* py = cy; + while(n--) { + if(m_status == status_initial) { + move_to_no_clip(*px++, *py++); + } else { + line_to_no_clip(*px++, *py++); + } + } + } + m_prev_flags = flags; + m_prev_x = x; + m_prev_y = y; + } +private: + outline_aa m_outline; + filling_rule_e m_filling_rule; + int m_clipped_start_x; + int m_clipped_start_y; + int m_start_x; + int m_start_y; + int m_prev_x; + int m_prev_y; + unsigned m_prev_flags; + unsigned m_status; + rect m_clip_box; + bool m_clipping; + int m_cur_y; +}; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_render_scanlines.h b/modules/pdfium/pdfium/third_party/agg23/agg_render_scanlines.h new file mode 100644 index 000000000000..0dfd6d259f2b --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_render_scanlines.h @@ -0,0 +1,50 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +#ifndef AGG_RENDER_SCANLINES_INCLUDED +#define AGG_RENDER_SCANLINES_INCLUDED +#include "agg_basics.h" +namespace agg +{ +template +void render_scanlines(Rasterizer& ras, Scanline& sl, Renderer& ren, bool no_smooth) +{ + if(ras.rewind_scanlines()) { + sl.reset(ras.min_x(), ras.max_x()); + ren.prepare(unsigned(ras.max_x() - ras.min_x() + 2)); + while(ras.sweep_scanline(sl, no_smooth)) { + ren.render(sl); + } + } +} +template +void render_all_paths(Rasterizer& ras, + Scanline& sl, + Renderer& r, + VertexSource& vs, + const ColorStorage& as, + const PathId& path_id, + unsigned num_paths) +{ + for(unsigned i = 0; i < num_paths; i++) { + ras.reset(); + ras.add_path(vs, path_id[i]); + r.color(as[i]); + render_scanlines(ras, sl, r); + } +} +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_renderer_base.h b/modules/pdfium/pdfium/third_party/agg23/agg_renderer_base.h new file mode 100644 index 000000000000..bd1b203b9a73 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_renderer_base.h @@ -0,0 +1,163 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// class renderer_base +// +//---------------------------------------------------------------------------- +#ifndef AGG_RENDERER_BASE_INCLUDED +#define AGG_RENDERER_BASE_INCLUDED +#include "agg_basics.h" +#include "agg_rendering_buffer.h" +namespace agg +{ +template class renderer_base +{ +public: + typedef PixelFormat pixfmt_type; + typedef typename pixfmt_type::color_type color_type; + typedef typename pixfmt_type::row_data row_data; + typedef typename pixfmt_type::span_data span_data; + renderer_base() : m_ren(0), m_clip_box(1, 1, 0, 0) {} + renderer_base(pixfmt_type& ren) : + m_ren(&ren), + m_clip_box(0, 0, ren.width() - 1, ren.height() - 1) + {} + void attach(pixfmt_type& ren) + { + m_ren = &ren; + m_clip_box = rect(0, 0, ren.width() - 1, ren.height() - 1); + } + const pixfmt_type& ren() const + { + return *m_ren; + } + pixfmt_type& ren() + { + return *m_ren; + } + unsigned width() const + { + return m_ren->width(); + } + unsigned height() const + { + return m_ren->height(); + } + void first_clip_box() {} + bool next_clip_box() + { + return false; + } + const rect& clip_box() const + { + return m_clip_box; + } + int xmin() const + { + return m_clip_box.x1; + } + int ymin() const + { + return m_clip_box.y1; + } + int xmax() const + { + return m_clip_box.x2; + } + int ymax() const + { + return m_clip_box.y2; + } + const rect& bounding_clip_box() const + { + return m_clip_box; + } + int bounding_xmin() const + { + return m_clip_box.x1; + } + int bounding_ymin() const + { + return m_clip_box.y1; + } + int bounding_xmax() const + { + return m_clip_box.x2; + } + int bounding_ymax() const + { + return m_clip_box.y2; + } + void blend_hline(int x1, int y, int x2, + const color_type& c, cover_type cover) + { + if(x1 > x2) { + int t = x2; + x2 = x1; + x1 = t; + } + if(y > ymax()) { + return; + } + if(y < ymin()) { + return; + } + if(x1 > xmax()) { + return; + } + if(x2 < xmin()) { + return; + } + if(x1 < xmin()) { + x1 = xmin(); + } + if(x2 > xmax()) { + x2 = xmax(); + } + m_ren->blend_hline(x1, y, x2 - x1 + 1, c, cover); + } + void blend_solid_hspan(int x, int y, int len, + const color_type& c, + const cover_type* covers) + { + if(y > ymax()) { + return; + } + if(y < ymin()) { + return; + } + if(x < xmin()) { + len -= xmin() - x; + if(len <= 0) { + return; + } + covers += xmin() - x; + x = xmin(); + } + if(x + len > xmax()) { + len = xmax() - x + 1; + if(len <= 0) { + return; + } + } + m_ren->blend_solid_hspan(x, y, len, c, covers); + } +private: + pixfmt_type* m_ren; + rect m_clip_box; +}; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_renderer_scanline.h b/modules/pdfium/pdfium/third_party/agg23/agg_renderer_scanline.h new file mode 100644 index 000000000000..62d104f7f2ef --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_renderer_scanline.h @@ -0,0 +1,93 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +#ifndef AGG_RENDERER_SCANLINE_INCLUDED +#define AGG_RENDERER_SCANLINE_INCLUDED +#include "agg_basics.h" +#include "agg_renderer_base.h" +#include "agg_render_scanlines.h" +namespace agg +{ +template class renderer_scanline_aa +{ +public: + typedef BaseRenderer base_ren_type; + typedef SpanGenerator span_gen_type; + renderer_scanline_aa() : m_ren(0), m_span_gen(0) {} + renderer_scanline_aa(base_ren_type& ren, span_gen_type& span_gen) : + m_ren(&ren), + m_span_gen(&span_gen) + {} + void attach(base_ren_type& ren, span_gen_type& span_gen) + { + m_ren = &ren; + m_span_gen = &span_gen; + } + void prepare(unsigned max_span_len) + { + m_span_gen->prepare(max_span_len); + } + template void render(const Scanline& sl) + { + int y = sl.y(); + m_ren->first_clip_box(); + do { + int xmin = m_ren->xmin(); + int xmax = m_ren->xmax(); + if(y >= m_ren->ymin() && y <= m_ren->ymax()) { + unsigned num_spans = sl.num_spans(); + typename Scanline::const_iterator span = sl.begin(); + for(;;) { + int x = span->x; + int len = span->len; + bool solid = false; + const typename Scanline::cover_type* covers = span->covers; + if(len < 0) { + solid = true; + len = -len; + } + if(x < xmin) { + len -= xmin - x; + if(!solid) { + covers += xmin - x; + } + x = xmin; + } + if(len > 0) { + if(x + len > xmax) { + len = xmax - x + 1; + } + if(len > 0) { + m_ren->blend_color_hspan_no_clip( + x, y, len, + m_span_gen->generate(x, y, len), + solid ? 0 : covers, + *covers); + } + } + if(--num_spans == 0) { + break; + } + ++span; + } + } + } while(m_ren->next_clip_box()); + } +private: + base_ren_type* m_ren; + SpanGenerator* m_span_gen; +}; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_rendering_buffer.h b/modules/pdfium/pdfium/third_party/agg23/agg_rendering_buffer.h new file mode 100644 index 000000000000..9c1c0c689922 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_rendering_buffer.h @@ -0,0 +1,145 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// class rendering_buffer +// +//---------------------------------------------------------------------------- +#ifndef AGG_RENDERING_BUFFER_INCLUDED +#define AGG_RENDERING_BUFFER_INCLUDED +#include "agg_basics.h" +namespace agg +{ +class rendering_buffer +{ +public: + struct row_data { + int x1, x2; + const int8u* ptr; + row_data() {} + row_data(int x1_, int x2_, const int8u* ptr_) : + x1(x1_), x2(x2_), ptr(ptr_) {} + }; + struct span_data { + int x; + unsigned len; + int8u* ptr; + span_data() {} + span_data(int) : x(0), len(0), ptr(0) {} + span_data(int x_, unsigned len_, int8u* ptr_) : + x(x_), len(len_), ptr(ptr_) {} + }; + ~rendering_buffer() + { + FX_Free(m_rows); + } + rendering_buffer() : + m_buf(0), + m_rows(0), + m_width(0), + m_height(0), + m_stride(0), + m_max_height(0) + { + } + rendering_buffer(int8u* buf, unsigned width, unsigned height, int stride) : + m_buf(0), + m_rows(0), + m_width(0), + m_height(0), + m_stride(0), + m_max_height(0) + { + attach(buf, width, height, stride); + } + void attach(int8u* buf, unsigned width, unsigned height, int stride) + { + m_buf = buf; + m_width = width; + m_height = height; + m_stride = stride; + if(height > m_max_height) { + FX_Free(m_rows); + m_rows = FX_Alloc(int8u*, m_max_height = height); + } + int8u* row_ptr = m_buf; + if(stride < 0) { + row_ptr = m_buf - int(height - 1) * stride; + } + int8u** rows = m_rows; + while(height--) { + *rows++ = row_ptr; + row_ptr += stride; + } + } + int8u* buf() + { + return m_buf; + } + const int8u* buf() const + { + return m_buf; + } + unsigned width() const + { + return m_width; + } + unsigned height() const + { + return m_height; + } + int stride() const + { + return m_stride; + } + unsigned stride_abs() const + { + return (m_stride < 0) ? + unsigned(-m_stride) : + unsigned(m_stride); + } + int8u* row(unsigned y) + { + return m_rows[y]; + } + const int8u* row(unsigned y) const + { + return m_rows[y]; + } + int8u* next_row(void* p) + { + return (int8u*)p + m_stride; + } + const int8u* next_row(const void* p) const + { + return (int8u*)p + m_stride; + } + int8u const* const* rows() const + { + return m_rows; + } +private: + rendering_buffer(const rendering_buffer&); + const rendering_buffer& operator = (const rendering_buffer&); +private: + int8u* m_buf; + int8u** m_rows; + unsigned m_width; + unsigned m_height; + int m_stride; + unsigned m_max_height; +}; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_scanline_u.h b/modules/pdfium/pdfium/third_party/agg23/agg_scanline_u.h new file mode 100644 index 000000000000..210011532903 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_scanline_u.h @@ -0,0 +1,150 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// Adaptation for 32-bit screen coordinates (scanline32_u) has been sponsored by +// Liberty Technology Systems, Inc., visit http://lib-sys.com +// +// Liberty Technology Systems, Inc. is the provider of +// PostScript and PDF technology for software developers. +// +//---------------------------------------------------------------------------- +#ifndef AGG_SCANLINE_U_INCLUDED +#define AGG_SCANLINE_U_INCLUDED +#include "agg_array.h" +namespace agg +{ +template class scanline_u +{ +public: + typedef scanline_u self_type; + typedef CoverT cover_type; + typedef int16 coord_type; + struct span { + coord_type x; + coord_type len; + cover_type* covers; + }; + typedef span* iterator; + typedef const span* const_iterator; + ~scanline_u() + { + FX_Free(m_spans); + FX_Free(m_covers); + } + scanline_u() : + m_min_x(0), + m_max_len(0), + m_last_x(0x7FFFFFF0), + m_covers(0), + m_spans(0), + m_cur_span(0) + {} + void reset(int min_x, int max_x) + { + unsigned max_len = max_x - min_x + 2; + if(max_len > m_max_len) { + FX_Free(m_spans); + FX_Free(m_covers); + m_covers = FX_Alloc( cover_type , max_len); + m_spans = FX_Alloc( span , max_len); + m_max_len = max_len; + } + m_last_x = 0x7FFFFFF0; + m_min_x = min_x; + m_cur_span = m_spans; + } + void add_cell(int x, unsigned cover) + { + x -= m_min_x; + m_covers[x] = (cover_type)cover; + if(x == m_last_x + 1) { + m_cur_span->len++; + } else { + m_cur_span++; + m_cur_span->x = (coord_type)(x + m_min_x); + m_cur_span->len = 1; + m_cur_span->covers = m_covers + x; + } + m_last_x = x; + } + void add_cells(int x, unsigned len, const CoverT* covers) + { + x -= m_min_x; + FXSYS_memcpy(m_covers + x, covers, len * sizeof(CoverT)); + if(x == m_last_x + 1) { + m_cur_span->len += (coord_type)len; + } else { + m_cur_span++; + m_cur_span->x = (coord_type)(x + m_min_x); + m_cur_span->len = (coord_type)len; + m_cur_span->covers = m_covers + x; + } + m_last_x = x + len - 1; + } + void add_span(int x, unsigned len, unsigned cover) + { + x -= m_min_x; + FXSYS_memset(m_covers + x, cover, len); + if(x == m_last_x + 1) { + m_cur_span->len += (coord_type)len; + } else { + m_cur_span++; + m_cur_span->x = (coord_type)(x + m_min_x); + m_cur_span->len = (coord_type)len; + m_cur_span->covers = m_covers + x; + } + m_last_x = x + len - 1; + } + void finalize(int y) + { + m_y = y; + } + void reset_spans() + { + m_last_x = 0x7FFFFFF0; + m_cur_span = m_spans; + } + int y() const + { + return m_y; + } + unsigned num_spans() const + { + return unsigned(m_cur_span - m_spans); + } + const_iterator begin() const + { + return m_spans + 1; + } + iterator begin() + { + return m_spans + 1; + } +private: + scanline_u(const self_type&); + const self_type& operator = (const self_type&); +private: + int m_min_x; + unsigned m_max_len; + int m_last_x; + int m_y; + cover_type* m_covers; + span* m_spans; + span* m_cur_span; +}; +typedef scanline_u scanline_u8; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_shorten_path.h b/modules/pdfium/pdfium/third_party/agg23/agg_shorten_path.h new file mode 100644 index 000000000000..d7eb4be018ca --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_shorten_path.h @@ -0,0 +1,57 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +#ifndef AGG_SHORTEN_PATH_INCLUDED +#define AGG_SHORTEN_PATH_INCLUDED +#include "agg_basics.h" +#include "agg_vertex_sequence.h" +namespace agg +{ +template +void shorten_path(VertexSequence& vs, FX_FLOAT s, unsigned closed = 0) +{ + typedef typename VertexSequence::value_type vertex_type; + if(s > 0 && vs.size() > 1) { + FX_FLOAT d; + int n = int(vs.size() - 2); + while(n) { + d = vs[n].dist; + if(d > s) { + break; + } + vs.remove_last(); + s -= d; + --n; + } + if(vs.size() < 2) { + vs.remove_all(); + } else { + n = vs.size() - 1; + vertex_type& prev = vs[n - 1]; + vertex_type& last = vs[n]; + d = (prev.dist - s) / prev.dist; + FX_FLOAT x = prev.x + (last.x - prev.x) * d; + FX_FLOAT y = prev.y + (last.y - prev.y) * d; + last.x = x; + last.y = y; + if(!prev(last)) { + vs.remove_last(); + } + vs.close(closed != 0); + } + } +} +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_vcgen_dash.cpp b/modules/pdfium/pdfium/third_party/agg23/agg_vcgen_dash.cpp new file mode 100644 index 000000000000..bd5a2122a229 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_vcgen_dash.cpp @@ -0,0 +1,178 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// Line dash generator +// +//---------------------------------------------------------------------------- + +#include "agg_shorten_path.h" +#include "agg_vcgen_dash.h" +#include "core/fxcrt/fx_basic.h" + +namespace agg +{ +vcgen_dash::vcgen_dash() : + m_total_dash_len(0), + m_num_dashes(0), + m_dash_start(0), + m_shorten(0), + m_curr_dash_start(0), + m_curr_dash(0), + m_src_vertices(), + m_closed(0), + m_status(initial), + m_src_vertex(0) +{ +} +void vcgen_dash::remove_all_dashes() +{ + m_total_dash_len = 0; + m_num_dashes = 0; + m_curr_dash_start = 0; + m_curr_dash = 0; +} +void vcgen_dash::add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len) +{ + if(m_num_dashes < max_dashes) { + m_total_dash_len += dash_len + gap_len; + m_dashes[m_num_dashes++] = dash_len; + m_dashes[m_num_dashes++] = gap_len; + } +} +void vcgen_dash::dash_start(FX_FLOAT ds) +{ + m_dash_start = ds; + calc_dash_start(FXSYS_fabs(ds)); +} +void vcgen_dash::calc_dash_start(FX_FLOAT ds) +{ + m_curr_dash = 0; + m_curr_dash_start = 0; + while(ds > 0) { + if(ds > m_dashes[m_curr_dash]) { + ds -= m_dashes[m_curr_dash]; + ++m_curr_dash; + m_curr_dash_start = 0; + if(m_curr_dash >= m_num_dashes) { + m_curr_dash = 0; + } + } else { + m_curr_dash_start = ds; + ds = 0; + } + } +} +void vcgen_dash::remove_all() +{ + m_status = initial; + m_src_vertices.remove_all(); + m_closed = 0; +} +void vcgen_dash::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd) +{ + m_status = initial; + if(is_move_to(cmd)) { + m_src_vertices.modify_last(vertex_dist(x, y)); + } else { + if(is_vertex(cmd)) { + m_src_vertices.add(vertex_dist(x, y)); + } else { + m_closed = get_close_flag(cmd); + } + } +} +void vcgen_dash::rewind(unsigned) +{ + if(m_status == initial) { + m_src_vertices.close(m_closed != 0); + shorten_path(m_src_vertices, m_shorten, m_closed); + } + m_status = ready; + m_src_vertex = 0; +} +unsigned vcgen_dash::vertex(FX_FLOAT* x, FX_FLOAT* y) +{ + unsigned cmd = path_cmd_move_to; + while(!is_stop(cmd)) { + switch(m_status) { + case initial: + rewind(0); + case ready: + if(m_num_dashes < 2 || m_src_vertices.size() < 2) { + cmd = path_cmd_stop; + break; + } + m_status = polyline; + m_src_vertex = 1; + m_v1 = &m_src_vertices[0]; + m_v2 = &m_src_vertices[1]; + m_curr_rest = m_v1->dist; + *x = m_v1->x; + *y = m_v1->y; + if(m_dash_start >= 0) { + calc_dash_start(m_dash_start); + } + return path_cmd_move_to; + case polyline: { + FX_FLOAT dash_rest = m_dashes[m_curr_dash] - m_curr_dash_start; + unsigned cmd = (m_curr_dash & 1) ? + path_cmd_move_to : + path_cmd_line_to; + if(m_curr_rest > dash_rest) { + m_curr_rest -= dash_rest; + ++m_curr_dash; + if(m_curr_dash >= m_num_dashes) { + m_curr_dash = 0; + } + m_curr_dash_start = 0; + *x = m_v2->x - (m_v2->x - m_v1->x) * m_curr_rest / m_v1->dist; + *y = m_v2->y - (m_v2->y - m_v1->y) * m_curr_rest / m_v1->dist; + } else { + m_curr_dash_start += m_curr_rest; + *x = m_v2->x; + *y = m_v2->y; + ++m_src_vertex; + m_v1 = m_v2; + m_curr_rest = m_v1->dist; + if(m_closed) { + if(m_src_vertex > m_src_vertices.size()) { + m_status = stop; + } else { + m_v2 = &m_src_vertices + [ + (m_src_vertex >= m_src_vertices.size()) ? 0 : + m_src_vertex + ]; + } + } else { + if(m_src_vertex >= m_src_vertices.size()) { + m_status = stop; + } else { + m_v2 = &m_src_vertices[m_src_vertex]; + } + } + } + return cmd; + } + break; + case stop: + cmd = path_cmd_stop; + break; + } + } + return path_cmd_stop; +} +} diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_vcgen_dash.h b/modules/pdfium/pdfium/third_party/agg23/agg_vcgen_dash.h new file mode 100644 index 000000000000..9c3aa630c207 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_vcgen_dash.h @@ -0,0 +1,75 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// Line dash generator +// +//---------------------------------------------------------------------------- +#ifndef AGG_VCGEN_DASH_INCLUDED +#define AGG_VCGEN_DASH_INCLUDED +#include "agg_basics.h" +#include "agg_vertex_sequence.h" +namespace agg +{ +class vcgen_dash +{ + enum max_dashes_e { + max_dashes = 32 + }; + enum status_e { + initial, + ready, + polyline, + stop + }; +public: + typedef vertex_sequence vertex_storage; + vcgen_dash(); + void remove_all_dashes(); + void add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len); + void dash_start(FX_FLOAT ds); + void shorten(FX_FLOAT s) + { + m_shorten = s; + } + double shorten() const + { + return m_shorten; + } + void remove_all(); + void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd); + void rewind(unsigned path_id); + unsigned vertex(FX_FLOAT* x, FX_FLOAT* y); +private: + vcgen_dash(const vcgen_dash&); + const vcgen_dash& operator = (const vcgen_dash&); + void calc_dash_start(FX_FLOAT ds); + FX_FLOAT m_dashes[max_dashes]; + FX_FLOAT m_total_dash_len; + unsigned m_num_dashes; + FX_FLOAT m_dash_start; + FX_FLOAT m_shorten; + FX_FLOAT m_curr_dash_start; + unsigned m_curr_dash; + FX_FLOAT m_curr_rest; + const vertex_dist* m_v1; + const vertex_dist* m_v2; + vertex_storage m_src_vertices; + unsigned m_closed; + status_e m_status; + unsigned m_src_vertex; +}; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_vcgen_stroke.cpp b/modules/pdfium/pdfium/third_party/agg23/agg_vcgen_stroke.cpp new file mode 100644 index 000000000000..03225b164934 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_vcgen_stroke.cpp @@ -0,0 +1,215 @@ + +//---------------------------------------------------------------------------- +// XYQ: 2006-01-22 Copied from AGG project. +// TODO: This file uses intensive floating point operations, so it's NOT suitable +// for platforms like Symbian OS. We need to change to FIX format. +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// Stroke generator +// +//---------------------------------------------------------------------------- + +#include "agg_vcgen_stroke.h" +#include "core/fxcrt/fx_basic.h" + +namespace agg +{ + +vcgen_stroke::vcgen_stroke() : + m_src_vertices(), + m_out_vertices(), + m_width(0.5f), + m_miter_limit(4 * 1.0f), + m_inner_miter_limit(1.0f + 1.0f / 100), + m_approx_scale(1.0f), + m_line_cap(butt_cap), + m_line_join(miter_join), + m_inner_join(inner_miter), + m_closed(0), + m_status(initial), + m_src_vertex(0), + m_out_vertex(0) +{ +} +void vcgen_stroke::remove_all() +{ + m_src_vertices.remove_all(); + m_closed = 0; + m_status = initial; +} +void vcgen_stroke::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd) +{ + m_status = initial; + if(is_move_to(cmd)) { + m_src_vertices.modify_last(vertex_dist_cmd(x, y, cmd)); + } else { + if(is_vertex(cmd)) { + m_src_vertices.add(vertex_dist_cmd(x, y, cmd)); + } else { + m_closed = get_close_flag(cmd); + } + } +} +static inline void calc_butt_cap(FX_FLOAT* cap, + const vertex_dist& v0, + const vertex_dist& v1, + FX_FLOAT len, + FX_FLOAT width) { + FX_FLOAT dx = (v1.y - v0.y) * width / len; + FX_FLOAT dy = (v1.x - v0.x) * width / len; + cap[0] = v0.x - dx; + cap[1] = v0.y + dy; + cap[2] = v0.x + dx; + cap[3] = v0.y - dy; +} +void vcgen_stroke::rewind(unsigned) +{ + if(m_status == initial) { + m_src_vertices.close(m_closed != 0); + if(m_src_vertices.size() < 3) { + m_closed = 0; + } + } + m_status = ready; + m_src_vertex = 0; + m_out_vertex = 0; +} +unsigned vcgen_stroke::vertex(FX_FLOAT* x, FX_FLOAT* y) +{ + unsigned cmd = path_cmd_line_to; + line_join_e curj; + while(!is_stop(cmd)) { + switch(m_status) { + case initial: + rewind(0); + case ready: + if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) { + cmd = path_cmd_stop; + break; + } + m_status = m_closed ? outline1 : cap1; + cmd = path_cmd_move_to; + m_src_vertex = 0; + m_out_vertex = 0; + break; + case cap1: + stroke_calc_cap(m_out_vertices, + m_src_vertices[0], + m_src_vertices[1], + m_src_vertices[0].dist, + m_line_cap, + m_width, + m_approx_scale); + m_src_vertex = 1; + m_prev_status = outline1; + m_status = out_vertices; + m_out_vertex = 0; + break; + case cap2: + stroke_calc_cap(m_out_vertices, + m_src_vertices[m_src_vertices.size() - 1], + m_src_vertices[m_src_vertices.size() - 2], + m_src_vertices[m_src_vertices.size() - 2].dist, + m_line_cap, + m_width, + m_approx_scale); + m_prev_status = outline2; + m_status = out_vertices; + m_out_vertex = 0; + break; + case outline1: + if(m_closed) { + if(m_src_vertex >= m_src_vertices.size()) { + m_prev_status = close_first; + m_status = end_poly1; + break; + } + } else { + if(m_src_vertex >= m_src_vertices.size() - 1) { + m_status = cap2; + break; + } + } + curj = m_src_vertices[m_src_vertex].cmd & path_flags_jr ? miter_join_round : m_line_join; + stroke_calc_join(m_out_vertices, + m_src_vertices.prev(m_src_vertex), + m_src_vertices.curr(m_src_vertex), + m_src_vertices.next(m_src_vertex), + m_src_vertices.prev(m_src_vertex).dist, + m_src_vertices.curr(m_src_vertex).dist, + m_width, + curj, + m_inner_join, + m_miter_limit, + m_inner_miter_limit, + m_approx_scale); + ++m_src_vertex; + m_prev_status = m_status; + m_status = out_vertices; + m_out_vertex = 0; + break; + case close_first: + m_status = outline2; + cmd = path_cmd_move_to; + case outline2: + if(m_src_vertex <= unsigned(m_closed == 0)) { + m_status = end_poly2; + m_prev_status = stop; + break; + } + --m_src_vertex; + curj = m_src_vertices[m_src_vertex].cmd & path_flags_jr ? miter_join_round : m_line_join; + stroke_calc_join(m_out_vertices, + m_src_vertices.next(m_src_vertex), + m_src_vertices.curr(m_src_vertex), + m_src_vertices.prev(m_src_vertex), + m_src_vertices.curr(m_src_vertex).dist, + m_src_vertices.prev(m_src_vertex).dist, + m_width, + curj, + m_inner_join, + m_miter_limit, + m_inner_miter_limit, + m_approx_scale); + m_prev_status = m_status; + m_status = out_vertices; + m_out_vertex = 0; + break; + case out_vertices: + if(m_out_vertex >= m_out_vertices.size()) { + m_status = m_prev_status; + } else { + const point_type& c = m_out_vertices[m_out_vertex++]; + *x = c.x; + *y = c.y; + return cmd; + } + break; + case end_poly1: + m_status = m_prev_status; + return path_cmd_end_poly | path_flags_close | path_flags_ccw; + case end_poly2: + m_status = m_prev_status; + return path_cmd_end_poly | path_flags_close | path_flags_cw; + case stop: + cmd = path_cmd_stop; + break; + } + } + return cmd; +} +} diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_vcgen_stroke.h b/modules/pdfium/pdfium/third_party/agg23/agg_vcgen_stroke.h new file mode 100644 index 000000000000..84fadd6ed8b1 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_vcgen_stroke.h @@ -0,0 +1,120 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +#ifndef AGG_VCGEN_STROKE_INCLUDED +#define AGG_VCGEN_STROKE_INCLUDED +#include "agg_math_stroke.h" +namespace agg +{ +class vcgen_stroke +{ + enum status_e { + initial, + ready, + cap1, + cap2, + outline1, + close_first, + outline2, + out_vertices, + end_poly1, + end_poly2, + stop + }; +public: + typedef vertex_sequence vertex_storage; + typedef pod_deque coord_storage; + vcgen_stroke(); + void line_cap(line_cap_e lc) + { + m_line_cap = lc; + } + void line_join(line_join_e lj) + { + m_line_join = lj; + } + void inner_join(inner_join_e ij) + { + m_inner_join = ij; + } + line_cap_e line_cap() const + { + return m_line_cap; + } + line_join_e line_join() const + { + return m_line_join; + } + inner_join_e inner_join() const + { + return m_inner_join; + } + void width(FX_FLOAT w) + { + m_width = w / 2; + } + void miter_limit(FX_FLOAT ml) + { + m_miter_limit = ml; + } + void miter_limit_theta(FX_FLOAT t); + void inner_miter_limit(FX_FLOAT ml) + { + m_inner_miter_limit = ml; + } + void approximation_scale(FX_FLOAT as) + { + m_approx_scale = as; + } + FX_FLOAT width() const + { + return m_width * 2; + } + FX_FLOAT miter_limit() const + { + return m_miter_limit; + } + FX_FLOAT inner_miter_limit() const + { + return m_inner_miter_limit; + } + FX_FLOAT approximation_scale() const + { + return m_approx_scale; + } + void remove_all(); + void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd); + void rewind(unsigned path_id); + unsigned vertex(FX_FLOAT* x, FX_FLOAT* y); +private: + vcgen_stroke(const vcgen_stroke&); + const vcgen_stroke& operator = (const vcgen_stroke&); + vertex_storage m_src_vertices; + coord_storage m_out_vertices; + FX_FLOAT m_width; + FX_FLOAT m_miter_limit; + FX_FLOAT m_inner_miter_limit; + FX_FLOAT m_approx_scale; + line_cap_e m_line_cap; + line_join_e m_line_join; + inner_join_e m_inner_join; + unsigned m_closed; + status_e m_status; + status_e m_prev_status; + unsigned m_src_vertex; + unsigned m_out_vertex; +}; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/agg23/agg_vertex_sequence.h b/modules/pdfium/pdfium/third_party/agg23/agg_vertex_sequence.h new file mode 100644 index 000000000000..6600bf2085f0 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/agg23/agg_vertex_sequence.h @@ -0,0 +1,100 @@ + +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- +// +// vertex_sequence container and vertex_dist struct +// +//---------------------------------------------------------------------------- +#ifndef AGG_VERTEX_SEQUENCE_INCLUDED +#define AGG_VERTEX_SEQUENCE_INCLUDED +#include "agg_basics.h" +#include "agg_array.h" +#include "agg_math.h" +namespace agg +{ +template +class vertex_sequence : public pod_deque +{ +public: + typedef pod_deque base_type; + void add(const T& val); + void modify_last(const T& val); + void close(bool remove_flag); +}; +template +void vertex_sequence::add(const T& val) +{ + if(base_type::size() > 1) { + if(!(*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) { + base_type::remove_last(); + } + } + base_type::add(val); +} +template +void vertex_sequence::modify_last(const T& val) +{ + base_type::remove_last(); + add(val); +} +template +void vertex_sequence::close(bool closed) +{ + while(base_type::size() > 1) { + if((*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) { + break; + } + T t = (*this)[base_type::size() - 1]; + base_type::remove_last(); + modify_last(t); + } + if(closed) { + while(base_type::size() > 1) { + if((*this)[base_type::size() - 1]((*this)[0])) { + break; + } + base_type::remove_last(); + } + } +} +const FX_FLOAT vertex_dist_epsilon = 1e-14f; +struct vertex_dist { + FX_FLOAT x; + FX_FLOAT y; + FX_FLOAT dist; + vertex_dist() {} + vertex_dist(FX_FLOAT x_, FX_FLOAT y_) : + x(x_), + y(y_), + dist(0) + { + } + bool operator () (const vertex_dist& val) + { + bool ret = (dist = calc_distance(x, y, val.x, val.y)) > vertex_dist_epsilon; + return ret; + } +}; +struct vertex_dist_cmd : public vertex_dist { + unsigned cmd; + vertex_dist_cmd() {} + vertex_dist_cmd(FX_FLOAT x_, FX_FLOAT y_, unsigned cmd_) : + vertex_dist(x_, y_), + cmd(cmd_) + { + } +}; +} +#endif diff --git a/modules/pdfium/pdfium/third_party/base/logging.h b/modules/pdfium/pdfium/third_party/base/logging.h new file mode 100644 index 000000000000..bf4faea57e08 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/base/logging.h @@ -0,0 +1,26 @@ +// Copyright (c) 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PDFIUM_THIRD_PARTY_BASE_LOGGING_H_ +#define PDFIUM_THIRD_PARTY_BASE_LOGGING_H_ + +#include +#include + +#ifndef _WIN32 +#define NULL_DEREF_IF_POSSIBLE \ + *(reinterpret_cast(NULL) + 42) = 0x42; +#else +#define NULL_DEREF_IF_POSSIBLE +#endif + +#define CHECK(condition) \ + if (!(condition)) { \ + abort(); \ + NULL_DEREF_IF_POSSIBLE \ + } + +#define NOTREACHED() assert(false) + +#endif // PDFIUM_THIRD_PARTY_BASE_LOGGING_H_ diff --git a/modules/pdfium/pdfium/third_party/base/macros.h b/modules/pdfium/pdfium/third_party/base/macros.h new file mode 100644 index 000000000000..05c3132e4693 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/base/macros.h @@ -0,0 +1,31 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file contains macros and macro-like constructs (e.g., templates) that +// are commonly used throughout Chromium source. (It may also contain things +// that are closely related to things that are commonly used that belong in this +// file.) + +#ifndef PDFIUM_THIRD_PARTY_BASE_MACROS_H_ +#define PDFIUM_THIRD_PARTY_BASE_MACROS_H_ + +// The COMPILE_ASSERT macro can be used to verify that a compile time +// expression is true. For example, you could use it to verify the +// size of a static array: +// +// COMPILE_ASSERT(ARRAYSIZE_UNSAFE(content_type_names) == CONTENT_NUM_TYPES, +// content_type_names_incorrect_size); +// +// or to make sure a struct is smaller than a certain size: +// +// COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large); +// +// The second argument to the macro is the name of the variable. If +// the expression is false, most compilers will issue a warning/error +// containing the name of the variable. + +#undef COMPILE_ASSERT +#define COMPILE_ASSERT(expr, msg) static_assert(expr, #msg) + +#endif // PDFIUM_THIRD_PARTY_BASE_MACROS_H_ diff --git a/modules/pdfium/pdfium/third_party/base/numerics/OWNERS b/modules/pdfium/pdfium/third_party/base/numerics/OWNERS new file mode 100644 index 000000000000..f7816afe81c2 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/base/numerics/OWNERS @@ -0,0 +1,3 @@ +jschuh@chromium.org +tsepez@chromium.org +palmer@chromium.org diff --git a/modules/pdfium/pdfium/third_party/base/numerics/safe_conversions.h b/modules/pdfium/pdfium/third_party/base/numerics/safe_conversions.h new file mode 100644 index 000000000000..dc61d9c9ccab --- /dev/null +++ b/modules/pdfium/pdfium/third_party/base/numerics/safe_conversions.h @@ -0,0 +1,272 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PDFIUM_THIRD_PARTY_BASE_NUMERICS_SAFE_CONVERSIONS_H_ +#define PDFIUM_THIRD_PARTY_BASE_NUMERICS_SAFE_CONVERSIONS_H_ + +#include + +#include +#include +#include + +#include "third_party/base/numerics/safe_conversions_impl.h" + +namespace pdfium { +namespace base { + +// The following are helper constexpr template functions and classes for safely +// performing a range of conversions, assignments, and tests: +// +// checked_cast<> - Analogous to static_cast<> for numeric types, except +// that it CHECKs that the specified numeric conversion will not overflow +// or underflow. NaN source will always trigger a CHECK. +// The default CHECK triggers a crash, but the handler can be overriden. +// saturated_cast<> - Analogous to static_cast<> for numeric types, except +// that it returns a saturated result when the specified numeric conversion +// would otherwise overflow or underflow. An NaN source returns 0 by +// default, but can be overridden to return a different result. +// strict_cast<> - Analogous to static_cast<> for numeric types, except that +// it will cause a compile failure if the destination type is not large +// enough to contain any value in the source type. It performs no runtime +// checking and thus introduces no runtime overhead. +// IsValueInRangeForNumericType<>() - A convenience function that returns true +// if the type supplied to the template parameter can represent the value +// passed as an argument to the function. +// IsValueNegative<>() - A convenience function that will accept any arithmetic +// type as an argument and will return whether the value is less than zero. +// Unsigned types always return false. +// SafeUnsignedAbs() - Returns the absolute value of the supplied integer +// parameter as an unsigned result (thus avoiding an overflow if the value +// is the signed, two's complement minimum). +// StrictNumeric<> - A wrapper type that performs assignments and copies via +// the strict_cast<> template, and can perform valid arithmetic comparisons +// across any range of arithmetic types. StrictNumeric is the return type +// for values extracted from a CheckedNumeric class instance. The raw +// arithmetic value is extracted via static_cast to the underlying type. +// MakeStrictNum() - Creates a new StrictNumeric from the underlying type of +// the supplied arithmetic or StrictNumeric type. + +// Convenience function that returns true if the supplied value is in range +// for the destination type. +template +constexpr bool IsValueInRangeForNumericType(Src value) { + return internal::DstRangeRelationToSrcRange(value).IsValid(); +} + +// Forces a crash, like a CHECK(false). Used for numeric boundary errors. +struct CheckOnFailure { + template + static T HandleFailure() { +#if defined(__GNUC__) || defined(__clang__) + __builtin_trap(); +#else + ((void)(*(volatile char*)0 = 0)); +#endif + return T(); + } +}; + +// checked_cast<> is analogous to static_cast<> for numeric types, +// except that it CHECKs that the specified numeric conversion will not +// overflow or underflow. NaN source will always trigger a CHECK. +template +constexpr Dst checked_cast(Src value) { + // This throws a compile-time error on evaluating the constexpr if it can be + // determined at compile-time as failing, otherwise it will CHECK at runtime. + using SrcType = typename internal::UnderlyingType::type; + return IsValueInRangeForNumericType(value) + ? static_cast(static_cast(value)) + : CheckHandler::template HandleFailure(); +} + +// Default boundaries for integral/float: max/infinity, lowest/-infinity, 0/NaN. +template +struct SaturationDefaultHandler { + static constexpr T NaN() { + return std::numeric_limits::has_quiet_NaN + ? std::numeric_limits::quiet_NaN() + : T(); + } + static constexpr T max() { return std::numeric_limits::max(); } + static constexpr T Overflow() { + return std::numeric_limits::has_infinity + ? std::numeric_limits::infinity() + : std::numeric_limits::max(); + } + static constexpr T lowest() { return std::numeric_limits::lowest(); } + static constexpr T Underflow() { + return std::numeric_limits::has_infinity + ? std::numeric_limits::infinity() * -1 + : std::numeric_limits::lowest(); + } +}; + +namespace internal { + +template class S, typename Src> +constexpr Dst saturated_cast_impl(Src value, RangeCheck constraint) { + // For some reason clang generates much better code when the branch is + // structured exactly this way, rather than a sequence of checks. + return !constraint.IsOverflowFlagSet() + ? (!constraint.IsUnderflowFlagSet() ? static_cast(value) + : S::Underflow()) + // Skip this check for integral Src, which cannot be NaN. + : (std::is_integral::value || !constraint.IsUnderflowFlagSet() + ? S::Overflow() + : S::NaN()); +} + +// saturated_cast<> is analogous to static_cast<> for numeric types, except +// that the specified numeric conversion will saturate by default rather than +// overflow or underflow, and NaN assignment to an integral will return 0. +// All boundary condition behaviors can be overriden with a custom handler. +template + class SaturationHandler = SaturationDefaultHandler, + typename Src> +constexpr Dst saturated_cast(Src value) { + using SrcType = typename UnderlyingType::type; + return saturated_cast_impl( + value, + DstRangeRelationToSrcRange(value)); +} + +// strict_cast<> is analogous to static_cast<> for numeric types, except that +// it will cause a compile failure if the destination type is not large enough +// to contain any value in the source type. It performs no runtime checking. +template +constexpr Dst strict_cast(Src value) { + using SrcType = typename UnderlyingType::type; + static_assert(UnderlyingType::is_numeric, "Argument must be numeric."); + static_assert(std::is_arithmetic::value, "Result must be numeric."); + + // If you got here from a compiler error, it's because you tried to assign + // from a source type to a destination type that has insufficient range. + // The solution may be to change the destination type you're assigning to, + // and use one large enough to represent the source. + // Alternatively, you may be better served with the checked_cast<> or + // saturated_cast<> template functions for your particular use case. + static_assert(StaticDstRangeRelationToSrcRange::value == + NUMERIC_RANGE_CONTAINED, + "The source type is out of range for the destination type. " + "Please see strict_cast<> comments for more information."); + + return static_cast(static_cast(value)); +} + +// Some wrappers to statically check that a type is in range. +template +struct IsNumericRangeContained { + static const bool value = false; +}; + +template +struct IsNumericRangeContained< + Dst, + Src, + typename std::enable_if::value && + ArithmeticOrUnderlyingEnum::value>::type> { + static const bool value = StaticDstRangeRelationToSrcRange::value == + NUMERIC_RANGE_CONTAINED; +}; + +// StrictNumeric implements compile time range checking between numeric types by +// wrapping assignment operations in a strict_cast. This class is intended to be +// used for function arguments and return types, to ensure the destination type +// can always contain the source type. This is essentially the same as enforcing +// -Wconversion in gcc and C4302 warnings on MSVC, but it can be applied +// incrementally at API boundaries, making it easier to convert code so that it +// compiles cleanly with truncation warnings enabled. +// This template should introduce no runtime overhead, but it also provides no +// runtime checking of any of the associated mathematical operations. Use +// CheckedNumeric for runtime range checks of the actual value being assigned. +template +class StrictNumeric { + public: + using type = T; + + constexpr StrictNumeric() : value_(0) {} + + // Copy constructor. + template + constexpr StrictNumeric(const StrictNumeric& rhs) + : value_(strict_cast(rhs.value_)) {} + + // This is not an explicit constructor because we implicitly upgrade regular + // numerics to StrictNumerics to make them easier to use. + template + constexpr StrictNumeric(Src value) // NOLINT(runtime/explicit) + : value_(strict_cast(value)) {} + + // If you got here from a compiler error, it's because you tried to assign + // from a source type to a destination type that has insufficient range. + // The solution may be to change the destination type you're assigning to, + // and use one large enough to represent the source. + // If you're assigning from a CheckedNumeric<> class, you may be able to use + // the AssignIfValid() member function, specify a narrower destination type to + // the member value functions (e.g. val.template ValueOrDie()), use one + // of the value helper functions (e.g. ValueOrDieForType(val)). + // If you've encountered an _ambiguous overload_ you can use a static_cast<> + // to explicitly cast the result to the destination type. + // If none of that works, you may be better served with the checked_cast<> or + // saturated_cast<> template functions for your particular use case. + template ::value>::type* = nullptr> + constexpr operator Dst() const { + return static_cast::type>(value_); + } + + private: + const T value_; +}; + +// Convience wrapper returns a StrictNumeric from the provided arithmetic type. +template +constexpr StrictNumeric::type> MakeStrictNum( + const T value) { + return value; +} + +// Overload the ostream output operator to make logging work nicely. +template +std::ostream& operator<<(std::ostream& os, const StrictNumeric& value) { + os << static_cast(value); + return os; +} + +#define STRICT_COMPARISON_OP(NAME, OP) \ + template ::value>::type* = nullptr> \ + constexpr bool operator OP(const L lhs, const R rhs) { \ + return SafeCompare::type, \ + typename UnderlyingType::type>(lhs, rhs); \ + } + +STRICT_COMPARISON_OP(IsLess, <); +STRICT_COMPARISON_OP(IsLessOrEqual, <=); +STRICT_COMPARISON_OP(IsGreater, >); +STRICT_COMPARISON_OP(IsGreaterOrEqual, >=); +STRICT_COMPARISON_OP(IsEqual, ==); +STRICT_COMPARISON_OP(IsNotEqual, !=); + +#undef STRICT_COMPARISON_OP +}; + +using internal::strict_cast; +using internal::saturated_cast; +using internal::SafeUnsignedAbs; +using internal::StrictNumeric; +using internal::MakeStrictNum; +using internal::IsValueNegative; + +// Explicitly make a shorter size_t alias for convenience. +using SizeT = StrictNumeric; + +} // namespace base +} // namespace pdfium + +#endif // PDFIUM_THIRD_PARTY_BASE_NUMERICS_SAFE_CONVERSIONS_H_ diff --git a/modules/pdfium/pdfium/third_party/base/numerics/safe_conversions_impl.h b/modules/pdfium/pdfium/third_party/base/numerics/safe_conversions_impl.h new file mode 100644 index 000000000000..2a7ce146e3c2 --- /dev/null +++ b/modules/pdfium/pdfium/third_party/base/numerics/safe_conversions_impl.h @@ -0,0 +1,734 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PDFIUM_THIRD_PARTY_BASE_NUMERICS_SAFE_CONVERSIONS_IMPL_H_ +#define PDFIUM_THIRD_PARTY_BASE_NUMERICS_SAFE_CONVERSIONS_IMPL_H_ + +#include + +#include +#include + +namespace pdfium { +namespace base { +namespace internal { + +// The std library doesn't provide a binary max_exponent for integers, however +// we can compute an analog using std::numeric_limits<>::digits. +template +struct MaxExponent { + static const int value = std::is_floating_point::value + ? std::numeric_limits::max_exponent + : std::numeric_limits::digits + 1; +}; + +// The number of bits (including the sign) in an integer. Eliminates sizeof +// hacks. +template +struct IntegerBitsPlusSign { + static const int value = std::numeric_limits::digits + + std::is_signed::value; +}; + +// Helper templates for integer manipulations. + +template +struct PositionOfSignBit { + static const size_t value = IntegerBitsPlusSign::value - 1; +}; + +// Determines if a numeric value is negative without throwing compiler +// warnings on: unsigned(value) < 0. +template ::value>::type* = nullptr> +constexpr bool IsValueNegative(T value) { + static_assert(std::is_arithmetic::value, "Argument must be numeric."); + return value < 0; +} + +template ::value>::type* = nullptr> +constexpr bool IsValueNegative(T) { + static_assert(std::is_arithmetic::value, "Argument must be numeric."); + return false; +} + +// This performs a fast negation, returning a signed value. It works on unsigned +// arguments, but probably doesn't do what you want for any unsigned value +// larger than max / 2 + 1 (i.e. signed min cast to unsigned). +template +constexpr typename std::make_signed::type ConditionalNegate( + T x, + bool is_negative) { + static_assert(std::is_integral::value, "Type must be integral"); + using SignedT = typename std::make_signed::type; + using UnsignedT = typename std::make_unsigned::type; + return static_cast( + (static_cast(x) ^ -SignedT(is_negative)) + is_negative); +} + +// This performs a safe, absolute value via unsigned overflow. +template +constexpr typename std::make_unsigned::type SafeUnsignedAbs(T value) { + static_assert(std::is_integral::value, "Type must be integral"); + using UnsignedT = typename std::make_unsigned::type; + return IsValueNegative(value) ? 0 - static_cast(value) + : static_cast(value); +} + +enum IntegerRepresentation { + INTEGER_REPRESENTATION_UNSIGNED, + INTEGER_REPRESENTATION_SIGNED +}; + +// A range for a given nunmeric Src type is contained for a given numeric Dst +// type if both numeric_limits::max() <= numeric_limits::max() and +// numeric_limits::lowest() >= numeric_limits::lowest() are true. +// We implement this as template specializations rather than simple static +// comparisons to ensure type correctness in our comparisons. +enum NumericRangeRepresentation { + NUMERIC_RANGE_NOT_CONTAINED, + NUMERIC_RANGE_CONTAINED +}; + +// Helper templates to statically determine if our destination type can contain +// maximum and minimum values represented by the source type. + +template ::value + ? INTEGER_REPRESENTATION_SIGNED + : INTEGER_REPRESENTATION_UNSIGNED, + IntegerRepresentation SrcSign = std::is_signed::value + ? INTEGER_REPRESENTATION_SIGNED + : INTEGER_REPRESENTATION_UNSIGNED> +struct StaticDstRangeRelationToSrcRange; + +// Same sign: Dst is guaranteed to contain Src only if its range is equal or +// larger. +template +struct StaticDstRangeRelationToSrcRange { + static const NumericRangeRepresentation value = + MaxExponent::value >= MaxExponent::value + ? NUMERIC_RANGE_CONTAINED + : NUMERIC_RANGE_NOT_CONTAINED; +}; + +// Unsigned to signed: Dst is guaranteed to contain source only if its range is +// larger. +template +struct StaticDstRangeRelationToSrcRange { + static const NumericRangeRepresentation value = + MaxExponent::value > MaxExponent::value + ? NUMERIC_RANGE_CONTAINED + : NUMERIC_RANGE_NOT_CONTAINED; +}; + +// Signed to unsigned: Dst cannot be statically determined to contain Src. +template +struct StaticDstRangeRelationToSrcRange { + static const NumericRangeRepresentation value = NUMERIC_RANGE_NOT_CONTAINED; +}; + +// This class wraps the range constraints as separate booleans so the compiler +// can identify constants and eliminate unused code paths. +class RangeCheck { + public: + constexpr RangeCheck(bool is_in_lower_bound, bool is_in_upper_bound) + : is_underflow_(!is_in_lower_bound), is_overflow_(!is_in_upper_bound) {} + constexpr RangeCheck() : is_underflow_(0), is_overflow_(0) {} + constexpr bool IsValid() const { return !is_overflow_ && !is_underflow_; } + constexpr bool IsInvalid() const { return is_overflow_ && is_underflow_; } + constexpr bool IsOverflow() const { return is_overflow_ && !is_underflow_; } + constexpr bool IsUnderflow() const { return !is_overflow_ && is_underflow_; } + constexpr bool IsOverflowFlagSet() const { return is_overflow_; } + constexpr bool IsUnderflowFlagSet() const { return is_underflow_; } + constexpr bool operator==(const RangeCheck rhs) const { + return is_underflow_ == rhs.is_underflow_ && + is_overflow_ == rhs.is_overflow_; + } + constexpr bool operator!=(const RangeCheck rhs) const { + return !(*this == rhs); + } + + private: + // Do not change the order of these member variables. The integral conversion + // optimization depends on this exact order. + const bool is_underflow_; + const bool is_overflow_; +}; + +// The following helper template addresses a corner case in range checks for +// conversion from a floating-point type to an integral type of smaller range +// but larger precision (e.g. float -> unsigned). The problem is as follows: +// 1. Integral maximum is always one less than a power of two, so it must be +// truncated to fit the mantissa of the floating point. The direction of +// rounding is implementation defined, but by default it's always IEEE +// floats, which round to nearest and thus result in a value of larger +// magnitude than the integral value. +// Example: float f = UINT_MAX; // f is 4294967296f but UINT_MAX +// // is 4294967295u. +// 2. If the floating point value is equal to the promoted integral maximum +// value, a range check will erroneously pass. +// Example: (4294967296f <= 4294967295u) // This is true due to a precision +// // loss in rounding up to float. +// 3. When the floating point value is then converted to an integral, the +// resulting value is out of range for the target integral type and +// thus is implementation defined. +// Example: unsigned u = (float)INT_MAX; // u will typically overflow to 0. +// To fix this bug we manually truncate the maximum value when the destination +// type is an integral of larger precision than the source floating-point type, +// such that the resulting maximum is represented exactly as a floating point. +template class Bounds> +struct NarrowingRange { + using SrcLimits = std::numeric_limits; + using DstLimits = typename std::numeric_limits; + + // Computes the mask required to make an accurate comparison between types. + static const int kShift = + (MaxExponent::value > MaxExponent::value && + SrcLimits::digits < DstLimits::digits) + ? (DstLimits::digits - SrcLimits::digits) + : 0; + template < + typename T, + typename std::enable_if::value>::type* = nullptr> + + // Masks out the integer bits that are beyond the precision of the + // intermediate type used for comparison. + static constexpr T Adjust(T value) { + static_assert(std::is_same::value, ""); + static_assert(kShift < DstLimits::digits, ""); + return static_cast( + ConditionalNegate(SafeUnsignedAbs(value) & ~((T(1) << kShift) - T(1)), + IsValueNegative(value))); + } + + template ::value>::type* = + nullptr> + static constexpr T Adjust(T value) { + static_assert(std::is_same::value, ""); + static_assert(kShift == 0, ""); + return value; + } + + static constexpr Dst max() { return Adjust(Bounds::max()); } + static constexpr Dst lowest() { return Adjust(Bounds::lowest()); } +}; + +template class Bounds, + IntegerRepresentation DstSign = std::is_signed::value + ? INTEGER_REPRESENTATION_SIGNED + : INTEGER_REPRESENTATION_UNSIGNED, + IntegerRepresentation SrcSign = std::is_signed::value + ? INTEGER_REPRESENTATION_SIGNED + : INTEGER_REPRESENTATION_UNSIGNED, + NumericRangeRepresentation DstRange = + StaticDstRangeRelationToSrcRange::value> +struct DstRangeRelationToSrcRangeImpl; + +// The following templates are for ranges that must be verified at runtime. We +// split it into checks based on signedness to avoid confusing casts and +// compiler warnings on signed an unsigned comparisons. + +// Same sign narrowing: The range is contained for normal limits. +template class Bounds, + IntegerRepresentation DstSign, + IntegerRepresentation SrcSign> +struct DstRangeRelationToSrcRangeImpl { + static constexpr RangeCheck Check(Src value) { + using SrcLimits = std::numeric_limits; + using DstLimits = NarrowingRange; + return RangeCheck( + static_cast(SrcLimits::lowest()) >= DstLimits::lowest() || + static_cast(value) >= DstLimits::lowest(), + static_cast(SrcLimits::max()) <= DstLimits::max() || + static_cast(value) <= DstLimits::max()); + } +}; + +// Signed to signed narrowing: Both the upper and lower boundaries may be +// exceeded for standard limits. +template class Bounds> +struct DstRangeRelationToSrcRangeImpl { + static constexpr RangeCheck Check(Src value) { + using DstLimits = NarrowingRange; + return RangeCheck(value >= DstLimits::lowest(), value <= DstLimits::max()); + } +}; + +// Unsigned to unsigned narrowing: Only the upper bound can be exceeded for +// standard limits. +template class Bounds> +struct DstRangeRelationToSrcRangeImpl { + static constexpr RangeCheck Check(Src value) { + using DstLimits = NarrowingRange; + return RangeCheck( + DstLimits::lowest() == Dst(0) || value >= DstLimits::lowest(), + value <= DstLimits::max()); + } +}; + +// Unsigned to signed: Only the upper bound can be exceeded for standard limits. +template class Bounds> +struct DstRangeRelationToSrcRangeImpl { + static constexpr RangeCheck Check(Src value) { + using DstLimits = NarrowingRange; + using Promotion = decltype(Src() + Dst()); + return RangeCheck(DstLimits::lowest() <= Dst(0) || + static_cast(value) >= + static_cast(DstLimits::lowest()), + static_cast(value) <= + static_cast(DstLimits::max())); + } +}; + +// Signed to unsigned: The upper boundary may be exceeded for a narrower Dst, +// and any negative value exceeds the lower boundary for standard limits. +template class Bounds> +struct DstRangeRelationToSrcRangeImpl { + static constexpr RangeCheck Check(Src value) { + using SrcLimits = std::numeric_limits; + using DstLimits = NarrowingRange; + using Promotion = decltype(Src() + Dst()); + return RangeCheck( + value >= Src(0) && (DstLimits::lowest() == 0 || + static_cast(value) >= DstLimits::lowest()), + static_cast(SrcLimits::max()) <= + static_cast(DstLimits::max()) || + static_cast(value) <= + static_cast(DstLimits::max())); + } +}; + +template class Bounds = std::numeric_limits, + typename Src> +constexpr RangeCheck DstRangeRelationToSrcRange(Src value) { + static_assert(std::is_arithmetic::value, "Argument must be numeric."); + static_assert(std::is_arithmetic::value, "Result must be numeric."); + static_assert(Bounds::lowest() < Bounds::max(), ""); + return DstRangeRelationToSrcRangeImpl::Check(value); +} + +// Integer promotion templates used by the portable checked integer arithmetic. +template +struct IntegerForDigitsAndSign; + +#define INTEGER_FOR_DIGITS_AND_SIGN(I) \ + template <> \ + struct IntegerForDigitsAndSign::value, \ + std::is_signed::value> { \ + using type = I; \ + } + +INTEGER_FOR_DIGITS_AND_SIGN(int8_t); +INTEGER_FOR_DIGITS_AND_SIGN(uint8_t); +INTEGER_FOR_DIGITS_AND_SIGN(int16_t); +INTEGER_FOR_DIGITS_AND_SIGN(uint16_t); +INTEGER_FOR_DIGITS_AND_SIGN(int32_t); +INTEGER_FOR_DIGITS_AND_SIGN(uint32_t); +INTEGER_FOR_DIGITS_AND_SIGN(int64_t); +INTEGER_FOR_DIGITS_AND_SIGN(uint64_t); +#undef INTEGER_FOR_DIGITS_AND_SIGN + +// WARNING: We have no IntegerForSizeAndSign<16, *>. If we ever add one to +// support 128-bit math, then the ArithmeticPromotion template below will need +// to be updated (or more likely replaced with a decltype expression). +static_assert(IntegerBitsPlusSign::value == 64, + "Max integer size not supported for this toolchain."); + +template ::value> +struct TwiceWiderInteger { + using type = + typename IntegerForDigitsAndSign::value * 2, + IsSigned>::type; +}; + +enum ArithmeticPromotionCategory { + LEFT_PROMOTION, // Use the type of the left-hand argument. + RIGHT_PROMOTION // Use the type of the right-hand argument. +}; + +// Determines the type that can represent the largest positive value. +template ::value > MaxExponent::value) + ? LEFT_PROMOTION + : RIGHT_PROMOTION> +struct MaxExponentPromotion; + +template +struct MaxExponentPromotion { + using type = Lhs; +}; + +template +struct MaxExponentPromotion { + using type = Rhs; +}; + +// Determines the type that can represent the lowest arithmetic value. +template ::value + ? (std::is_signed::value + ? (MaxExponent::value > MaxExponent::value + ? LEFT_PROMOTION + : RIGHT_PROMOTION) + : LEFT_PROMOTION) + : (std::is_signed::value + ? RIGHT_PROMOTION + : (MaxExponent::value < MaxExponent::value + ? LEFT_PROMOTION + : RIGHT_PROMOTION))> +struct LowestValuePromotion; + +template +struct LowestValuePromotion { + using type = Lhs; +}; + +template +struct LowestValuePromotion { + using type = Rhs; +}; + +// Determines the type that is best able to represent an arithmetic result. +template < + typename Lhs, + typename Rhs = Lhs, + bool is_intmax_type = + std::is_integral::type>::value&& + IntegerBitsPlusSign::type>:: + value == IntegerBitsPlusSign::value, + bool is_max_exponent = + StaticDstRangeRelationToSrcRange< + typename MaxExponentPromotion::type, + Lhs>::value == + NUMERIC_RANGE_CONTAINED&& StaticDstRangeRelationToSrcRange< + typename MaxExponentPromotion::type, + Rhs>::value == NUMERIC_RANGE_CONTAINED> +struct BigEnoughPromotion; + +// The side with the max exponent is big enough. +template +struct BigEnoughPromotion { + using type = typename MaxExponentPromotion::type; + static const bool is_contained = true; +}; + +// We can use a twice wider type to fit. +template +struct BigEnoughPromotion { + using type = + typename TwiceWiderInteger::type, + std::is_signed::value || + std::is_signed::value>::type; + static const bool is_contained = true; +}; + +// No type is large enough. +template +struct BigEnoughPromotion { + using type = typename MaxExponentPromotion::type; + static const bool is_contained = false; +}; + +// We can statically check if operations on the provided types can wrap, so we +// can skip the checked operations if they're not needed. So, for an integer we +// care if the destination type preserves the sign and is twice the width of +// the source. +template +struct IsIntegerArithmeticSafe { + static const bool value = + !std::is_floating_point::value && + !std::is_floating_point::value && + !std::is_floating_point::value && + std::is_signed::value >= std::is_signed::value && + IntegerBitsPlusSign::value >= (2 * IntegerBitsPlusSign::value) && + std::is_signed::value >= std::is_signed::value && + IntegerBitsPlusSign::value >= (2 * IntegerBitsPlusSign::value); +}; + +// Promotes to a type that can represent any possible result of a binary +// arithmetic operation with the source types. +template ::value || + std::is_signed::value, + intmax_t, + uintmax_t>::type, + typename MaxExponentPromotion::type>::value> +struct FastIntegerArithmeticPromotion; + +template +struct FastIntegerArithmeticPromotion { + using type = + typename TwiceWiderInteger::type, + std::is_signed::value || + std::is_signed::value>::type; + static_assert(IsIntegerArithmeticSafe::value, ""); + static const bool is_contained = true; +}; + +template +struct FastIntegerArithmeticPromotion { + using type = typename BigEnoughPromotion::type; + static const bool is_contained = false; +}; + +// This hacks around libstdc++ 4.6 missing stuff in type_traits. +#if defined(__GLIBCXX__) +#define PRIV_GLIBCXX_4_7_0 20120322 +#define PRIV_GLIBCXX_4_5_4 20120702 +#define PRIV_GLIBCXX_4_6_4 20121127 +#if (__GLIBCXX__ < PRIV_GLIBCXX_4_7_0 || __GLIBCXX__ == PRIV_GLIBCXX_4_5_4 || \ + __GLIBCXX__ == PRIV_GLIBCXX_4_6_4) +#define PRIV_USE_FALLBACKS_FOR_OLD_GLIBCXX +#undef PRIV_GLIBCXX_4_7_0 +#undef PRIV_GLIBCXX_4_5_4 +#undef PRIV_GLIBCXX_4_6_4 +#endif +#endif + +// Extracts the underlying type from an enum. +template ::value> +struct ArithmeticOrUnderlyingEnum; + +template +struct ArithmeticOrUnderlyingEnum { +#if defined(PRIV_USE_FALLBACKS_FOR_OLD_GLIBCXX) + using type = __underlying_type(T); +#else + using type = typename std::underlying_type::type; +#endif + static const bool value = std::is_arithmetic::value; +}; + +#if defined(PRIV_USE_FALLBACKS_FOR_OLD_GLIBCXX) +#undef PRIV_USE_FALLBACKS_FOR_OLD_GLIBCXX +#endif + +template +struct ArithmeticOrUnderlyingEnum { + using type = T; + static const bool value = std::is_arithmetic::value; +}; + +// The following are helper templates used in the CheckedNumeric class. +template +class CheckedNumeric; + +template +class StrictNumeric; + +// Used to treat CheckedNumeric and arithmetic underlying types the same. +template +struct UnderlyingType { + using type = typename ArithmeticOrUnderlyingEnum::type; + static const bool is_numeric = std::is_arithmetic::value; + static const bool is_checked = false; + static const bool is_strict = false; +}; + +template +struct UnderlyingType> { + using type = T; + static const bool is_numeric = true; + static const bool is_checked = true; + static const bool is_strict = false; +}; + +template +struct UnderlyingType> { + using type = T; + static const bool is_numeric = true; + static const bool is_checked = false; + static const bool is_strict = true; +}; + +template +struct IsCheckedOp { + static const bool value = + UnderlyingType::is_numeric && UnderlyingType::is_numeric && + (UnderlyingType::is_checked || UnderlyingType::is_checked); +}; + +template +struct IsStrictOp { + static const bool value = + UnderlyingType::is_numeric && UnderlyingType::is_numeric && + (UnderlyingType::is_strict || UnderlyingType::is_strict); +}; + +template +constexpr bool IsLessImpl(const L lhs, + const R rhs, + const RangeCheck l_range, + const RangeCheck r_range) { + return l_range.IsUnderflow() || r_range.IsOverflow() || + (l_range == r_range && + static_cast(lhs) < + static_cast(rhs)); +} + +template +struct IsLess { + static_assert(std::is_arithmetic::value && std::is_arithmetic::value, + "Types must be numeric."); + static constexpr bool Test(const L lhs, const R rhs) { + return IsLessImpl(lhs, rhs, DstRangeRelationToSrcRange(lhs), + DstRangeRelationToSrcRange(rhs)); + } +}; + +template +constexpr bool IsLessOrEqualImpl(const L lhs, + const R rhs, + const RangeCheck l_range, + const RangeCheck r_range) { + return l_range.IsUnderflow() || r_range.IsOverflow() || + (l_range == r_range && + static_cast(lhs) <= + static_cast(rhs)); +} + +template +struct IsLessOrEqual { + static_assert(std::is_arithmetic::value && std::is_arithmetic::value, + "Types must be numeric."); + static constexpr bool Test(const L lhs, const R rhs) { + return IsLessOrEqualImpl(lhs, rhs, DstRangeRelationToSrcRange(lhs), + DstRangeRelationToSrcRange(rhs)); + } +}; + +template +constexpr bool IsGreaterImpl(const L lhs, + const R rhs, + const RangeCheck l_range, + const RangeCheck r_range) { + return l_range.IsOverflow() || r_range.IsUnderflow() || + (l_range == r_range && + static_cast(lhs) > + static_cast(rhs)); +} + +template +struct IsGreater { + static_assert(std::is_arithmetic::value && std::is_arithmetic::value, + "Types must be numeric."); + static constexpr bool Test(const L lhs, const R rhs) { + return IsGreaterImpl(lhs, rhs, DstRangeRelationToSrcRange(lhs), + DstRangeRelationToSrcRange(rhs)); + } +}; + +template +constexpr bool IsGreaterOrEqualImpl(const L lhs, + const R rhs, + const RangeCheck l_range, + const RangeCheck r_range) { + return l_range.IsOverflow() || r_range.IsUnderflow() || + (l_range == r_range && + static_cast(lhs) >= + static_cast(rhs)); +} + +template +struct IsGreaterOrEqual { + static_assert(std::is_arithmetic::value && std::is_arithmetic::value, + "Types must be numeric."); + static constexpr bool Test(const L lhs, const R rhs) { + return IsGreaterOrEqualImpl(lhs, rhs, DstRangeRelationToSrcRange(lhs), + DstRangeRelationToSrcRange(rhs)); + } +}; + +template +struct IsEqual { + static_assert(std::is_arithmetic::value && std::is_arithmetic::value, + "Types must be numeric."); + static constexpr bool Test(const L lhs, const R rhs) { + return DstRangeRelationToSrcRange(lhs) == + DstRangeRelationToSrcRange(rhs) && + static_cast(lhs) == + static_cast(rhs); + } +}; + +template +struct IsNotEqual { + static_assert(std::is_arithmetic::value && std::is_arithmetic::value, + "Types must be numeric."); + static constexpr bool Test(const L lhs, const R rhs) { + return DstRangeRelationToSrcRange(lhs) != + DstRangeRelationToSrcRange(rhs) || + static_cast(lhs) != + static_cast(rhs); + } +}; + +// These perform the actual math operations on the CheckedNumerics. +// Binary arithmetic operations. +template